aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-x.ci/after_success.sh10
-rwxr-xr-x.ci/before_cache.sh16
-rwxr-xr-x.ci/before_install.sh28
-rw-r--r--.ci/common/build.sh80
-rw-r--r--.ci/common/test.sh104
-rwxr-xr-x.ci/install.sh31
-rwxr-xr-x.ci/run_tests.sh30
-rw-r--r--.clang-format (renamed from src/.clang-format)2
-rw-r--r--.editorconfig7
-rw-r--r--.gitignore26
-rw-r--r--.travis.yml136
-rw-r--r--BSDmakefile4
-rw-r--r--CMakeLists.txt433
-rw-r--r--CONTRIBUTING.md206
-rw-r--r--ISSUE_TEMPLATE.md11
-rw-r--r--MAINTAIN.md48
-rw-r--r--Makefile82
-rw-r--r--README.md161
-rw-r--r--appveyor.yml36
-rw-r--r--busted/outputHandlers/TAP.lua94
-rw-r--r--busted/outputHandlers/nvim.lua307
-rwxr-xr-xci/before_cache.sh30
-rwxr-xr-xci/before_install.sh42
-rwxr-xr-xci/before_script.sh (renamed from .ci/before_script.sh)15
-rw-r--r--ci/build.ps1137
-rw-r--r--ci/common/build.sh106
-rw-r--r--ci/common/suite.sh192
-rw-r--r--ci/common/test.sh190
-rwxr-xr-xci/install.sh32
-rwxr-xr-xci/run_lint.sh40
-rwxr-xr-xci/run_tests.sh36
-rwxr-xr-xci/script.sh (renamed from .ci/script.sh)12
-rw-r--r--cmake/Download.cmake18
-rw-r--r--cmake/FindIconv.cmake2
-rw-r--r--cmake/FindJeMalloc.cmake5
-rw-r--r--cmake/FindLibIntl.cmake15
-rw-r--r--cmake/FindLibTermkey.cmake2
-rw-r--r--cmake/FindLibUV.cmake10
-rw-r--r--cmake/FindLibVterm.cmake2
-rw-r--r--cmake/FindLua.cmake197
-rw-r--r--cmake/FindLuaJit.cmake2
-rw-r--r--cmake/FindMsgpack.cmake9
-rw-r--r--cmake/FindUnibilium.cmake2
-rw-r--r--cmake/FindWinpty.cmake10
-rw-r--r--cmake/GenerateHelptags.cmake.in39
-rw-r--r--cmake/GetCompileFlags.cmake1
-rw-r--r--cmake/InstallClintErrors.cmake2
-rw-r--r--cmake/InstallHelpers.cmake9
-rw-r--r--cmake/LuaHelpers.cmake7
-rw-r--r--cmake/PreventInTreeBuilds.cmake23
-rw-r--r--cmake/RunLint.cmake32
-rw-r--r--cmake/RunLuacheck.cmake22
-rw-r--r--cmake/RunTests.cmake35
-rw-r--r--cmake/RunTestsLint.cmake13
-rw-r--r--cmake/WindowsDllCopy.cmake30
-rw-r--r--codecov.yml32
-rw-r--r--config/CMakeLists.txt14
-rw-r--r--config/config.h.in5
-rw-r--r--config/pathdef.c.in2
-rw-r--r--config/versiondef.h.in4
-rw-r--r--contrib/YouCompleteMe/README.md17
-rw-r--r--contrib/YouCompleteMe/ycm_extra_conf.py54
-rw-r--r--contrib/local.mk.example30
-rw-r--r--man/nvim.1284
-rw-r--r--runtime/CMakeLists.txt41
-rw-r--r--runtime/autoload/RstFold.vim48
-rw-r--r--runtime/autoload/ada.vim10
-rw-r--r--runtime/autoload/ccomplete.vim39
-rw-r--r--runtime/autoload/clojurecomplete.vim16
-rw-r--r--runtime/autoload/context.vim184
-rw-r--r--runtime/autoload/contextcomplete.vim25
-rw-r--r--runtime/autoload/csscomplete.vim8
-rw-r--r--runtime/autoload/dist/ft.vim745
-rw-r--r--runtime/autoload/gzip.vim6
-rw-r--r--runtime/autoload/haskellcomplete.vim3382
-rw-r--r--runtime/autoload/health.vim534
-rw-r--r--runtime/autoload/health/nvim.vim197
-rw-r--r--runtime/autoload/health/provider.vim605
-rw-r--r--runtime/autoload/javascriptcomplete.vim4
-rw-r--r--runtime/autoload/man.vim469
-rw-r--r--runtime/autoload/msgpack.vim31
-rw-r--r--runtime/autoload/netrw.vim506
-rw-r--r--runtime/autoload/paste.vim4
-rw-r--r--runtime/autoload/phpcomplete.vim168
-rw-r--r--runtime/autoload/provider.vim21
-rw-r--r--runtime/autoload/provider/clipboard.vim190
-rw-r--r--runtime/autoload/provider/node.vim148
-rw-r--r--runtime/autoload/provider/python.vim8
-rw-r--r--runtime/autoload/provider/python3.vim8
-rw-r--r--runtime/autoload/provider/pythonx.vim140
-rw-r--r--runtime/autoload/provider/ruby.vim73
-rw-r--r--runtime/autoload/provider/script_host.rb6
-rw-r--r--runtime/autoload/remote/define.vim35
-rw-r--r--runtime/autoload/remote/host.vim60
-rw-r--r--runtime/autoload/rubycomplete.vim38
-rw-r--r--runtime/autoload/rust.vim415
-rw-r--r--runtime/autoload/rustfmt.vim107
-rw-r--r--runtime/autoload/shada.vim16
-rw-r--r--runtime/autoload/spellfile.vim15
-rw-r--r--runtime/autoload/sqlcomplete.vim2
-rw-r--r--runtime/autoload/tar.vim43
-rw-r--r--runtime/autoload/tutor.vim205
-rw-r--r--runtime/autoload/vimexpect.vim2
-rw-r--r--runtime/autoload/xmlformat.vim111
-rw-r--r--runtime/autoload/zip.vim76
-rw-r--r--runtime/bugreport.vim1
-rw-r--r--runtime/colors/README.txt21
-rw-r--r--runtime/colors/evening.vim6
-rw-r--r--runtime/colors/koehler.vim3
-rw-r--r--runtime/compiler/bdf.vim6
-rw-r--r--runtime/compiler/cargo.vim35
-rw-r--r--runtime/compiler/context.vim54
-rw-r--r--runtime/compiler/csslint.vim16
-rw-r--r--runtime/compiler/cucumber.vim4
-rw-r--r--runtime/compiler/gcc.vim8
-rw-r--r--runtime/compiler/ghc.vim26
-rw-r--r--runtime/compiler/haml.vim4
-rw-r--r--runtime/compiler/pylint.vim16
-rw-r--r--runtime/compiler/rake.vim6
-rw-r--r--runtime/compiler/rspec.vim3
-rw-r--r--runtime/compiler/rst.vim25
-rw-r--r--runtime/compiler/rubyunit.vim2
-rw-r--r--runtime/compiler/rustc.vim46
-rw-r--r--runtime/compiler/sass.vim4
-rw-r--r--runtime/compiler/stack.vim37
-rw-r--r--runtime/compiler/tidy.vim10
-rw-r--r--runtime/doc/Makefile4
-rw-r--r--runtime/doc/api.txt1448
-rw-r--r--runtime/doc/arabic.txt30
-rw-r--r--runtime/doc/autocmd.txt299
-rw-r--r--runtime/doc/change.txt120
-rw-r--r--runtime/doc/channel.txt174
-rw-r--r--runtime/doc/cmdline.txt124
-rw-r--r--runtime/doc/debug.txt16
-rw-r--r--runtime/doc/deprecated.txt70
-rw-r--r--runtime/doc/develop.txt225
-rw-r--r--runtime/doc/diff.txt44
-rw-r--r--runtime/doc/digraph.txt11
-rw-r--r--runtime/doc/editing.txt86
-rw-r--r--runtime/doc/eval.txt3037
-rw-r--r--runtime/doc/farsi.txt4
-rw-r--r--runtime/doc/filetype.txt143
-rw-r--r--runtime/doc/fold.txt17
-rw-r--r--runtime/doc/ft_ada.txt6
-rw-r--r--runtime/doc/ft_rust.txt239
-rw-r--r--runtime/doc/ft_sql.txt4
-rw-r--r--runtime/doc/gui.txt360
-rw-r--r--runtime/doc/hebrew.txt4
-rw-r--r--runtime/doc/help.txt24
-rw-r--r--runtime/doc/helphelp.txt32
-rw-r--r--runtime/doc/howto.txt96
-rw-r--r--runtime/doc/if_cscop.txt239
-rw-r--r--runtime/doc/if_lua.txt420
-rw-r--r--runtime/doc/if_pyth.txt111
-rw-r--r--runtime/doc/if_ruby.txt183
-rw-r--r--runtime/doc/indent.txt66
-rw-r--r--runtime/doc/index.txt90
-rw-r--r--runtime/doc/insert.txt120
-rw-r--r--runtime/doc/intro.txt298
-rw-r--r--runtime/doc/job_control.txt177
-rw-r--r--runtime/doc/makehtml.awk10
-rw-r--r--runtime/doc/map.txt231
-rw-r--r--runtime/doc/mbyte.txt197
-rw-r--r--runtime/doc/message.txt65
-rw-r--r--runtime/doc/mlang.txt11
-rw-r--r--runtime/doc/motion.txt61
-rw-r--r--runtime/doc/msgpack_rpc.txt140
-rw-r--r--runtime/doc/nvim.txt37
-rw-r--r--runtime/doc/nvim_terminal_emulator.txt139
-rw-r--r--runtime/doc/options.txt1603
-rw-r--r--runtime/doc/os_win32.txt206
-rw-r--r--runtime/doc/pattern.txt120
-rw-r--r--runtime/doc/pi_gzip.txt6
-rw-r--r--runtime/doc/pi_health.txt111
-rw-r--r--runtime/doc/pi_matchit.txt7
-rw-r--r--runtime/doc/pi_msgpack.txt9
-rw-r--r--runtime/doc/pi_netrw.txt43
-rw-r--r--runtime/doc/pi_paren.txt4
-rw-r--r--runtime/doc/pi_spec.txt4
-rw-r--r--runtime/doc/pi_tar.txt4
-rw-r--r--runtime/doc/pi_zip.txt32
-rw-r--r--runtime/doc/print.txt79
-rw-r--r--runtime/doc/provider.txt260
-rw-r--r--runtime/doc/quickfix.txt361
-rw-r--r--runtime/doc/quickref.txt29
-rw-r--r--runtime/doc/quotes.txt275
-rw-r--r--runtime/doc/recover.txt16
-rw-r--r--runtime/doc/remote.txt15
-rw-r--r--runtime/doc/remote_plugin.txt43
-rw-r--r--runtime/doc/repeat.txt57
-rw-r--r--runtime/doc/rileft.txt4
-rw-r--r--runtime/doc/russian.txt9
-rw-r--r--runtime/doc/scroll.txt69
-rw-r--r--runtime/doc/sign.txt24
-rw-r--r--runtime/doc/spell.txt15
-rw-r--r--runtime/doc/sponsor.txt216
-rw-r--r--runtime/doc/starting.txt535
-rw-r--r--runtime/doc/syntax.txt657
-rw-r--r--runtime/doc/tabpage.txt95
-rw-r--r--runtime/doc/tagsrch.txt132
-rw-r--r--runtime/doc/term.txt727
-rw-r--r--runtime/doc/tips.txt75
-rw-r--r--runtime/doc/uganda.txt4
-rw-r--r--runtime/doc/ui.txt639
-rw-r--r--runtime/doc/undo.txt11
-rw-r--r--runtime/doc/usr_01.txt19
-rw-r--r--runtime/doc/usr_02.txt16
-rw-r--r--runtime/doc/usr_03.txt10
-rw-r--r--runtime/doc/usr_04.txt4
-rw-r--r--runtime/doc/usr_05.txt30
-rw-r--r--runtime/doc/usr_06.txt11
-rw-r--r--runtime/doc/usr_07.txt12
-rw-r--r--runtime/doc/usr_08.txt6
-rw-r--r--runtime/doc/usr_09.txt29
-rw-r--r--runtime/doc/usr_10.txt4
-rw-r--r--runtime/doc/usr_11.txt10
-rw-r--r--runtime/doc/usr_12.txt26
-rw-r--r--runtime/doc/usr_20.txt4
-rw-r--r--runtime/doc/usr_21.txt4
-rw-r--r--runtime/doc/usr_22.txt6
-rw-r--r--runtime/doc/usr_23.txt4
-rw-r--r--runtime/doc/usr_24.txt20
-rw-r--r--runtime/doc/usr_25.txt4
-rw-r--r--runtime/doc/usr_26.txt4
-rw-r--r--runtime/doc/usr_27.txt10
-rw-r--r--runtime/doc/usr_28.txt4
-rw-r--r--runtime/doc/usr_29.txt4
-rw-r--r--runtime/doc/usr_30.txt4
-rw-r--r--runtime/doc/usr_31.txt4
-rw-r--r--runtime/doc/usr_32.txt4
-rw-r--r--runtime/doc/usr_40.txt4
-rw-r--r--runtime/doc/usr_41.txt62
-rw-r--r--runtime/doc/usr_42.txt4
-rw-r--r--runtime/doc/usr_43.txt4
-rw-r--r--runtime/doc/usr_44.txt6
-rw-r--r--runtime/doc/usr_45.txt7
-rw-r--r--runtime/doc/usr_toc.txt9
-rw-r--r--runtime/doc/various.txt143
-rw-r--r--runtime/doc/vi_diff.txt33
-rw-r--r--runtime/doc/vim_diff.txt473
-rw-r--r--runtime/doc/visual.txt32
-rw-r--r--runtime/doc/windows.txt98
-rw-r--r--runtime/filetype.vim976
-rw-r--r--runtime/ftplugin/a2ps.vim6
-rw-r--r--runtime/ftplugin/alsaconf.vim6
-rw-r--r--runtime/ftplugin/arch.vim6
-rw-r--r--runtime/ftplugin/automake.vim6
-rw-r--r--runtime/ftplugin/awk.vim18
-rw-r--r--runtime/ftplugin/bdf.vim6
-rw-r--r--runtime/ftplugin/c.vim10
-rw-r--r--runtime/ftplugin/calendar.vim6
-rw-r--r--runtime/ftplugin/cdrdaoconf.vim4
-rw-r--r--runtime/ftplugin/chicken.vim54
-rw-r--r--runtime/ftplugin/clojure.vim20
-rw-r--r--runtime/ftplugin/cmake.vim34
-rw-r--r--runtime/ftplugin/conf.vim6
-rw-r--r--runtime/ftplugin/context.vim79
-rw-r--r--runtime/ftplugin/crm.vim6
-rw-r--r--runtime/ftplugin/css.vim6
-rw-r--r--runtime/ftplugin/cucumber.vim28
-rw-r--r--runtime/ftplugin/cvsrc.vim6
-rw-r--r--runtime/ftplugin/debchangelog.vim132
-rw-r--r--runtime/ftplugin/debcontrol.vim22
-rw-r--r--runtime/ftplugin/denyhosts.vim4
-rw-r--r--runtime/ftplugin/dictconf.vim6
-rw-r--r--runtime/ftplugin/dictdconf.vim6
-rw-r--r--runtime/ftplugin/dircolors.vim6
-rw-r--r--runtime/ftplugin/dosini.vim6
-rw-r--r--runtime/ftplugin/elinks.vim6
-rw-r--r--runtime/ftplugin/eruby.vim2
-rw-r--r--runtime/ftplugin/eterm.vim6
-rw-r--r--runtime/ftplugin/fetchmail.vim6
-rw-r--r--runtime/ftplugin/framescript.vim6
-rw-r--r--runtime/ftplugin/gdb.vim12
-rw-r--r--runtime/ftplugin/git.vim4
-rw-r--r--runtime/ftplugin/gitcommit.vim17
-rw-r--r--runtime/ftplugin/gitrebase.vim5
-rw-r--r--runtime/ftplugin/gpg.vim6
-rw-r--r--runtime/ftplugin/groovy.vim19
-rw-r--r--runtime/ftplugin/group.vim6
-rw-r--r--runtime/ftplugin/grub.vim6
-rw-r--r--runtime/ftplugin/haml.vim2
-rw-r--r--runtime/ftplugin/hamster.vim6
-rw-r--r--runtime/ftplugin/haskell.vim8
-rw-r--r--runtime/ftplugin/help.vim83
-rw-r--r--runtime/ftplugin/hostconf.vim4
-rw-r--r--runtime/ftplugin/hostsaccess.vim6
-rw-r--r--runtime/ftplugin/indent.vim6
-rw-r--r--runtime/ftplugin/ld.vim6
-rw-r--r--runtime/ftplugin/lftp.vim6
-rw-r--r--runtime/ftplugin/libao.vim6
-rw-r--r--runtime/ftplugin/limits.vim6
-rw-r--r--runtime/ftplugin/loginaccess.vim6
-rw-r--r--runtime/ftplugin/logindefs.vim6
-rw-r--r--runtime/ftplugin/logtalk.dict362
-rw-r--r--runtime/ftplugin/logtalk.vim5
-rw-r--r--runtime/ftplugin/m4.vim6
-rw-r--r--runtime/ftplugin/mailaliases.vim4
-rw-r--r--runtime/ftplugin/mailcap.vim6
-rw-r--r--runtime/ftplugin/man.vim71
-rw-r--r--runtime/ftplugin/manconf.vim6
-rw-r--r--runtime/ftplugin/markdown.vim32
-rw-r--r--runtime/ftplugin/mf.vim61
-rw-r--r--runtime/ftplugin/modconf.vim6
-rw-r--r--runtime/ftplugin/mp.vim64
-rw-r--r--runtime/ftplugin/mplayerconf.vim6
-rw-r--r--runtime/ftplugin/muttrc.vim6
-rw-r--r--runtime/ftplugin/nanorc.vim6
-rw-r--r--runtime/ftplugin/neomuttrc.vim23
-rw-r--r--runtime/ftplugin/netrc.vim6
-rw-r--r--runtime/ftplugin/nsis.vim33
-rw-r--r--runtime/ftplugin/pamconf.vim6
-rw-r--r--runtime/ftplugin/passwd.vim6
-rw-r--r--runtime/ftplugin/perl.vim13
-rw-r--r--runtime/ftplugin/pinfo.vim6
-rw-r--r--runtime/ftplugin/procmail.vim6
-rw-r--r--runtime/ftplugin/prolog.vim6
-rw-r--r--runtime/ftplugin/protocols.vim6
-rw-r--r--runtime/ftplugin/python.vim103
-rw-r--r--runtime/ftplugin/qf.vim23
-rw-r--r--runtime/ftplugin/quake.vim6
-rw-r--r--runtime/ftplugin/racc.vim6
-rw-r--r--runtime/ftplugin/readline.vim6
-rw-r--r--runtime/ftplugin/rmd.vim29
-rw-r--r--runtime/ftplugin/rnc.vim6
-rw-r--r--runtime/ftplugin/rrst.vim20
-rw-r--r--runtime/ftplugin/rst.vim32
-rw-r--r--runtime/ftplugin/ruby.vim153
-rw-r--r--runtime/ftplugin/rust.vim197
-rw-r--r--runtime/ftplugin/sass.vim5
-rw-r--r--runtime/ftplugin/sbt.vim15
-rw-r--r--runtime/ftplugin/scala.vim35
-rw-r--r--runtime/ftplugin/scheme.vim80
-rw-r--r--runtime/ftplugin/screen.vim6
-rw-r--r--runtime/ftplugin/scss.vim3
-rw-r--r--runtime/ftplugin/sensors.vim6
-rw-r--r--runtime/ftplugin/services.vim6
-rw-r--r--runtime/ftplugin/setserial.vim6
-rw-r--r--runtime/ftplugin/sieve.vim6
-rw-r--r--runtime/ftplugin/slpconf.vim6
-rw-r--r--runtime/ftplugin/slpreg.vim6
-rw-r--r--runtime/ftplugin/slpspi.vim6
-rw-r--r--runtime/ftplugin/spec.vim18
-rw-r--r--runtime/ftplugin/sql.vim74
-rw-r--r--runtime/ftplugin/sshconfig.vim6
-rw-r--r--runtime/ftplugin/sudoers.vim6
-rw-r--r--runtime/ftplugin/sysctl.vim6
-rw-r--r--runtime/ftplugin/terminfo.vim6
-rw-r--r--runtime/ftplugin/tmux.vim12
-rw-r--r--runtime/ftplugin/treetop.vim6
-rw-r--r--runtime/ftplugin/tutor.vim20
-rw-r--r--runtime/ftplugin/udevconf.vim6
-rw-r--r--runtime/ftplugin/udevperm.vim6
-rw-r--r--runtime/ftplugin/udevrules.vim6
-rw-r--r--runtime/ftplugin/updatedb.vim6
-rw-r--r--runtime/ftplugin/verilog.vim21
-rw-r--r--runtime/ftplugin/vim.vim69
-rw-r--r--runtime/ftplugin/wast.vim17
-rw-r--r--runtime/ftplugin/xdefaults.vim6
-rw-r--r--runtime/ftplugin/xf86conf.vim6
-rw-r--r--runtime/ftplugin/xinetd.vim6
-rw-r--r--runtime/ftplugin/xml.vim33
-rw-r--r--runtime/ftplugin/xmodmap.vim6
-rw-r--r--runtime/ftplugin/yaml.vim6
-rw-r--r--runtime/ftplugin/zimbu.vim8
-rw-r--r--runtime/ftplugin/zsh.vim16
-rw-r--r--runtime/indent/ada.vim22
-rw-r--r--runtime/indent/automake.vim6
-rw-r--r--runtime/indent/awk.vim6
-rw-r--r--runtime/indent/bst.vim4
-rw-r--r--runtime/indent/bzl.vim9
-rw-r--r--runtime/indent/cdl.vim20
-rw-r--r--runtime/indent/chaiscript.vim6
-rw-r--r--runtime/indent/clojure.vim206
-rw-r--r--runtime/indent/cmake.vim18
-rw-r--r--runtime/indent/cobol.vim24
-rw-r--r--runtime/indent/config.vim8
-rw-r--r--runtime/indent/context.vim36
-rw-r--r--runtime/indent/css.vim5
-rw-r--r--runtime/indent/cucumber.vim21
-rw-r--r--runtime/indent/dictconf.vim6
-rw-r--r--runtime/indent/dictdconf.vim6
-rw-r--r--runtime/indent/docbk.vim6
-rw-r--r--runtime/indent/dosbatch.vim59
-rw-r--r--runtime/indent/dtd.vim54
-rw-r--r--runtime/indent/dylan.vim12
-rw-r--r--runtime/indent/eiffel.vim21
-rw-r--r--runtime/indent/erlang.vim32
-rw-r--r--runtime/indent/eruby.vim39
-rw-r--r--runtime/indent/eterm.vim10
-rw-r--r--runtime/indent/falcon.vim16
-rw-r--r--runtime/indent/fortran.vim25
-rw-r--r--runtime/indent/framescript.vim10
-rw-r--r--runtime/indent/gitconfig.vim9
-rw-r--r--runtime/indent/gitolite.vim16
-rw-r--r--runtime/indent/go.vim22
-rw-r--r--runtime/indent/haml.vim7
-rw-r--r--runtime/indent/hamster.vim4
-rw-r--r--runtime/indent/hog.vim6
-rw-r--r--runtime/indent/html.vim133
-rw-r--r--runtime/indent/idlang.vim14
-rw-r--r--runtime/indent/ishd.vim8
-rw-r--r--runtime/indent/java.vim29
-rw-r--r--runtime/indent/javascript.vim484
-rw-r--r--runtime/indent/json.vim6
-rw-r--r--runtime/indent/ld.vim12
-rw-r--r--runtime/indent/liquid.vim11
-rw-r--r--runtime/indent/logtalk.vim17
-rw-r--r--runtime/indent/lua.vim6
-rw-r--r--runtime/indent/make.vim16
-rw-r--r--runtime/indent/matlab.vim8
-rw-r--r--runtime/indent/mf.vim6
-rw-r--r--runtime/indent/mma.vim2
-rw-r--r--runtime/indent/mp.vim483
-rw-r--r--runtime/indent/nsis.vim91
-rw-r--r--runtime/indent/ocaml.vim12
-rw-r--r--runtime/indent/occam.vim6
-rw-r--r--runtime/indent/pascal.vim28
-rw-r--r--runtime/indent/perl.vim23
-rw-r--r--runtime/indent/perl6.vim10
-rw-r--r--runtime/indent/php.vim195
-rw-r--r--runtime/indent/postscr.vim6
-rw-r--r--runtime/indent/pov.vim6
-rw-r--r--runtime/indent/prolog.vim21
-rw-r--r--runtime/indent/python.vim14
-rw-r--r--runtime/indent/r.vim65
-rw-r--r--runtime/indent/readline.vim10
-rw-r--r--runtime/indent/rhelp.vim2
-rw-r--r--runtime/indent/rmd.vim25
-rw-r--r--runtime/indent/rnoweb.vim16
-rw-r--r--runtime/indent/rpl.vim8
-rw-r--r--runtime/indent/rst.vim6
-rw-r--r--runtime/indent/ruby.vim228
-rw-r--r--runtime/indent/rust.vim213
-rw-r--r--runtime/indent/sas.vim138
-rw-r--r--runtime/indent/sass.vim6
-rw-r--r--runtime/indent/scala.vim609
-rw-r--r--runtime/indent/scheme.vim9
-rw-r--r--runtime/indent/sdl.vim6
-rw-r--r--runtime/indent/sh.vim124
-rw-r--r--runtime/indent/sml.vim14
-rw-r--r--runtime/indent/sqlanywhere.vim24
-rw-r--r--runtime/indent/systemverilog.vim2
-rw-r--r--runtime/indent/tcl.vim6
-rw-r--r--runtime/indent/tcsh.vim6
-rw-r--r--runtime/indent/teraterm.vim24
-rw-r--r--runtime/indent/tex.vim153
-rw-r--r--runtime/indent/tf.vim14
-rw-r--r--runtime/indent/tilde.vim4
-rw-r--r--runtime/indent/treetop.vim10
-rw-r--r--runtime/indent/vb.vim10
-rw-r--r--runtime/indent/verilog.vim38
-rw-r--r--runtime/indent/vhdl.vim52
-rw-r--r--runtime/indent/vim.vim6
-rw-r--r--runtime/indent/wast.vim17
-rw-r--r--runtime/indent/xf86conf.vim10
-rw-r--r--runtime/indent/xinetd.vim10
-rw-r--r--runtime/indent/xml.vim11
-rw-r--r--runtime/indent/yacc.vim6
-rw-r--r--runtime/indent/yaml.vim49
-rw-r--r--runtime/keymap/armenian-eastern_utf-8.vim110
-rw-r--r--runtime/keymap/armenian-western_utf-8.vim110
-rw-r--r--runtime/keymap/kazakh-jcuken.vim102
-rw-r--r--runtime/keymap/oldturkic-orkhon_utf-8.vim143
-rw-r--r--runtime/keymap/oldturkic-yenisei_utf-8.vim115
-rw-r--r--runtime/keymap/pinyin.vim2
-rw-r--r--runtime/keymap/russian-jcukenmac.vim94
-rw-r--r--runtime/keymap/vietnamese-telex_utf-8.vim196
-rw-r--r--runtime/keymap/vietnamese-vni_utf-8.vim196
-rw-r--r--runtime/lua/man.lua170
-rw-r--r--runtime/lua/vim/compat.lua12
-rw-r--r--runtime/lua/vim/inspect.lua333
-rw-r--r--runtime/macros/justify.vim319
-rw-r--r--runtime/macros/less.vim12
-rw-r--r--runtime/macros/shellmenu.vim97
-rw-r--r--runtime/macros/swapmous.vim25
-rw-r--r--runtime/menu.vim337
-rw-r--r--runtime/mswin.vim50
-rw-r--r--runtime/nvim.appdata.xml37
-rw-r--r--runtime/nvim.desktop81
-rw-r--r--runtime/nvim.pngbin0 -> 6432 bytes
-rw-r--r--runtime/optwin.vim97
-rw-r--r--runtime/pack/dist/opt/cfilter/plugin/cfilter.vim43
-rw-r--r--runtime/pack/dist/opt/justify/plugin/justify.vim316
-rw-r--r--runtime/pack/dist/opt/shellmenu/plugin/shellmenu.vim94
-rw-r--r--runtime/pack/dist/opt/swapmouse/plugin/swapmouse.vim22
-rw-r--r--runtime/pack/dist/opt/termdebug/plugin/termdebug.vim40
-rw-r--r--runtime/pack/dist/opt/vimball/autoload/vimball.vim2
-rw-r--r--runtime/plugin/README.txt19
-rw-r--r--runtime/plugin/gzip.vim12
-rw-r--r--runtime/plugin/health.vim2
-rw-r--r--runtime/plugin/man.vim13
-rw-r--r--runtime/plugin/matchit.vim86
-rw-r--r--runtime/plugin/matchparen.vim54
-rw-r--r--runtime/plugin/netrwPlugin.vim2
-rw-r--r--runtime/plugin/rplugin.vim75
-rw-r--r--runtime/plugin/rrhelper.vim48
-rw-r--r--runtime/plugin/tarPlugin.vim1
-rw-r--r--runtime/plugin/zipPlugin.vim8
-rw-r--r--runtime/scripts.vim212
-rw-r--r--runtime/spell/en.utf-8.splbin0 -> 609337 bytes
-rw-r--r--runtime/synmenu.vim70
-rw-r--r--runtime/syntax/a2ps.vim6
-rw-r--r--runtime/syntax/a65.vim47
-rw-r--r--runtime/syntax/abap.vim67
-rw-r--r--runtime/syntax/abaqus.vim35
-rw-r--r--runtime/syntax/abc.vim39
-rw-r--r--runtime/syntax/abel.vim81
-rw-r--r--runtime/syntax/acedb.vim51
-rw-r--r--runtime/syntax/aflex.vim54
-rw-r--r--runtime/syntax/ahdl.vim43
-rw-r--r--runtime/syntax/alsaconf.vim6
-rw-r--r--runtime/syntax/amiga.vim47
-rw-r--r--runtime/syntax/aml.vim57
-rw-r--r--runtime/syntax/ampl.vim46
-rw-r--r--runtime/syntax/antlr.vim28
-rw-r--r--runtime/syntax/apache.vim61
-rw-r--r--runtime/syntax/apachestyle.vim39
-rw-r--r--runtime/syntax/aptconf.vim7
-rw-r--r--runtime/syntax/arch.vim6
-rw-r--r--runtime/syntax/arduino.vim13
-rw-r--r--runtime/syntax/asm.vim59
-rw-r--r--runtime/syntax/asm68k.vim111
-rw-r--r--runtime/syntax/asmh8300.vim35
-rw-r--r--runtime/syntax/asn.vim53
-rw-r--r--runtime/syntax/aspperl.vim18
-rw-r--r--runtime/syntax/aspvbs.vim52
-rw-r--r--runtime/syntax/asterisk.vim68
-rw-r--r--runtime/syntax/asteriskvm.vim41
-rw-r--r--runtime/syntax/atlas.vim59
-rw-r--r--runtime/syntax/autodoc.vim101
-rw-r--r--runtime/syntax/autohotkey.vim196
-rw-r--r--runtime/syntax/automake.vim52
-rw-r--r--runtime/syntax/ave.vim43
-rw-r--r--runtime/syntax/avra.vim71
-rw-r--r--runtime/syntax/awk.vim142
-rw-r--r--runtime/syntax/ayacc.vim58
-rw-r--r--runtime/syntax/b.vim101
-rw-r--r--runtime/syntax/baan.vim65
-rw-r--r--runtime/syntax/basic.vim49
-rw-r--r--runtime/syntax/bc.vim39
-rw-r--r--runtime/syntax/bdf.vim6
-rw-r--r--runtime/syntax/bib.vim86
-rw-r--r--runtime/syntax/bindzone.vim65
-rw-r--r--runtime/syntax/blank.vim29
-rw-r--r--runtime/syntax/bst.vim45
-rw-r--r--runtime/syntax/btm.vim75
-rw-r--r--runtime/syntax/bzr.vim35
-rw-r--r--runtime/syntax/c.vim109
-rw-r--r--runtime/syntax/cabal.vim323
-rw-r--r--runtime/syntax/calendar.vim6
-rw-r--r--runtime/syntax/cdrdaoconf.vim6
-rw-r--r--runtime/syntax/cdrtoc.vim6
-rw-r--r--runtime/syntax/cf.vim1448
-rw-r--r--runtime/syntax/cfg.vim38
-rw-r--r--runtime/syntax/ch.vim35
-rw-r--r--runtime/syntax/change.vim27
-rw-r--r--runtime/syntax/changelog.vim62
-rw-r--r--runtime/syntax/chaskell.vim6
-rw-r--r--runtime/syntax/cheetah.vim35
-rw-r--r--runtime/syntax/chicken.vim77
-rw-r--r--runtime/syntax/chill.vim119
-rw-r--r--runtime/syntax/cl.vim71
-rw-r--r--runtime/syntax/clean.vim79
-rw-r--r--runtime/syntax/clipper.vim49
-rw-r--r--runtime/syntax/clojure.vim217
-rw-r--r--runtime/syntax/cmake.vim514
-rw-r--r--runtime/syntax/cmod.vim144
-rw-r--r--runtime/syntax/cmusrc.vim4
-rw-r--r--runtime/syntax/cobol.vim93
-rw-r--r--runtime/syntax/coco.vim5
-rw-r--r--runtime/syntax/config.vim49
-rw-r--r--runtime/syntax/context.vim119
-rw-r--r--runtime/syntax/cpp.vim61
-rw-r--r--runtime/syntax/crm.vim6
-rw-r--r--runtime/syntax/crontab.vim59
-rw-r--r--runtime/syntax/cs.vim272
-rw-r--r--runtime/syntax/csc.vim73
-rw-r--r--runtime/syntax/csh.vim99
-rw-r--r--runtime/syntax/csp.vim77
-rw-r--r--runtime/syntax/css.vim455
-rw-r--r--runtime/syntax/cterm.vim81
-rw-r--r--runtime/syntax/cuda.vim17
-rw-r--r--runtime/syntax/cupl.vim63
-rw-r--r--runtime/syntax/cuplsim.vim47
-rw-r--r--runtime/syntax/cvs.vim31
-rw-r--r--runtime/syntax/cvsrc.vim6
-rw-r--r--runtime/syntax/cweb.vim33
-rw-r--r--runtime/syntax/cynlib.vim35
-rw-r--r--runtime/syntax/cynpp.vim30
-rw-r--r--runtime/syntax/datascript.vim5
-rw-r--r--runtime/syntax/dcd.vim33
-rw-r--r--runtime/syntax/dcl.vim90
-rw-r--r--runtime/syntax/debchangelog.vim57
-rw-r--r--runtime/syntax/debcontrol.vim161
-rw-r--r--runtime/syntax/debcopyright.vim33
-rw-r--r--runtime/syntax/debsources.vim28
-rw-r--r--runtime/syntax/def.vim35
-rw-r--r--runtime/syntax/denyhosts.vim6
-rw-r--r--runtime/syntax/desc.vim66
-rw-r--r--runtime/syntax/desktop.vim74
-rw-r--r--runtime/syntax/dictconf.vim6
-rw-r--r--runtime/syntax/dictdconf.vim6
-rw-r--r--runtime/syntax/diff.vim8
-rw-r--r--runtime/syntax/dircolors.vim18
-rw-r--r--runtime/syntax/diva.vim38
-rw-r--r--runtime/syntax/django.vim41
-rw-r--r--runtime/syntax/dnsmasq.vim6
-rw-r--r--runtime/syntax/docbk.vim32
-rw-r--r--runtime/syntax/dockerfile.vim8
-rw-r--r--runtime/syntax/dosbatch.vim83
-rw-r--r--runtime/syntax/dosini.vim49
-rw-r--r--runtime/syntax/dot.vim57
-rw-r--r--runtime/syntax/doxygen.vim127
-rw-r--r--runtime/syntax/dracula.vim29
-rw-r--r--runtime/syntax/dtd.vim60
-rw-r--r--runtime/syntax/dtml.vim41
-rw-r--r--runtime/syntax/dtrace.vim13
-rw-r--r--runtime/syntax/dylan.vim71
-rw-r--r--runtime/syntax/dylanintr.vim37
-rw-r--r--runtime/syntax/dylanlid.vim27
-rw-r--r--runtime/syntax/ecd.vim36
-rw-r--r--runtime/syntax/edif.vim39
-rw-r--r--runtime/syntax/eiffel.vim95
-rw-r--r--runtime/syntax/elf.vim49
-rw-r--r--runtime/syntax/elinks.vim6
-rw-r--r--runtime/syntax/elmfilt.vim52
-rw-r--r--runtime/syntax/erlang.vim245
-rw-r--r--runtime/syntax/eruby.vim2
-rw-r--r--runtime/syntax/esmtprc.vim7
-rw-r--r--runtime/syntax/esqlc.vim35
-rw-r--r--runtime/syntax/esterel.vim36
-rw-r--r--runtime/syntax/eterm.vim6
-rw-r--r--runtime/syntax/euphoria3.vim6
-rw-r--r--runtime/syntax/euphoria4.vim6
-rw-r--r--runtime/syntax/eviews.vim61
-rw-r--r--runtime/syntax/exim.vim40
-rw-r--r--runtime/syntax/expect.vim55
-rw-r--r--runtime/syntax/exports.vim44
-rw-r--r--runtime/syntax/falcon.vim54
-rw-r--r--runtime/syntax/fasm.vim5
-rw-r--r--runtime/syntax/fdcc.vim97
-rw-r--r--runtime/syntax/fetchmail.vim6
-rw-r--r--runtime/syntax/fgl.vim37
-rw-r--r--runtime/syntax/flexwiki.vim6
-rw-r--r--runtime/syntax/focexec.vim45
-rw-r--r--runtime/syntax/form.vim91
-rw-r--r--runtime/syntax/forth.vim239
-rw-r--r--runtime/syntax/fortran.vim48
-rw-r--r--runtime/syntax/foxpro.vim55
-rw-r--r--runtime/syntax/framescript.vim6
-rw-r--r--runtime/syntax/fstab.vim124
-rw-r--r--runtime/syntax/fvwm2m4.vim21
-rw-r--r--runtime/syntax/gdb.vim39
-rw-r--r--runtime/syntax/gdmo.vim45
-rw-r--r--runtime/syntax/gedcom.vim35
-rw-r--r--runtime/syntax/gitcommit.vim9
-rw-r--r--runtime/syntax/gitolite.vim150
-rw-r--r--runtime/syntax/gitrebase.vim4
-rw-r--r--runtime/syntax/gitsendemail.vim8
-rw-r--r--runtime/syntax/gkrellmrc.vim58
-rw-r--r--runtime/syntax/gnash.vim7
-rw-r--r--runtime/syntax/gnuplot.vim91
-rw-r--r--runtime/syntax/godoc.vim4
-rw-r--r--runtime/syntax/gp.vim48
-rw-r--r--runtime/syntax/gpg.vim6
-rw-r--r--runtime/syntax/grads.vim41
-rw-r--r--runtime/syntax/gretl.vim59
-rw-r--r--runtime/syntax/groovy.vim179
-rw-r--r--runtime/syntax/group.vim6
-rw-r--r--runtime/syntax/grub.vim6
-rw-r--r--runtime/syntax/gsp.vim19
-rw-r--r--runtime/syntax/gtkrc.vim110
-rw-r--r--runtime/syntax/haml.vim4
-rw-r--r--runtime/syntax/hamster.vim28
-rw-r--r--runtime/syntax/haskell.vim138
-rw-r--r--runtime/syntax/haste.vim7
-rw-r--r--runtime/syntax/hastepreproc.vim19
-rw-r--r--runtime/syntax/hb.vim47
-rw-r--r--runtime/syntax/help.vim16
-rw-r--r--runtime/syntax/hercules.vim48
-rw-r--r--runtime/syntax/hex.vim49
-rw-r--r--runtime/syntax/hitest.vim13
-rw-r--r--runtime/syntax/hog.vim5
-rw-r--r--runtime/syntax/hostconf.vim6
-rw-r--r--runtime/syntax/hostsaccess.vim8
-rw-r--r--runtime/syntax/html.vim209
-rw-r--r--runtime/syntax/htmlcheetah.vim18
-rw-r--r--runtime/syntax/htmldjango.vim18
-rw-r--r--runtime/syntax/htmlm4.vim20
-rw-r--r--runtime/syntax/htmlos.vim77
-rw-r--r--runtime/syntax/ia64.vim71
-rw-r--r--runtime/syntax/icemenu.vim6
-rw-r--r--runtime/syntax/icon.vim97
-rw-r--r--runtime/syntax/idl.vim172
-rw-r--r--runtime/syntax/idlang.vim53
-rw-r--r--runtime/syntax/indent.vim10
-rw-r--r--runtime/syntax/inform.vim112
-rw-r--r--runtime/syntax/initex.vim8
-rw-r--r--runtime/syntax/inittab.vim44
-rw-r--r--runtime/syntax/ipfilter.vim7
-rw-r--r--runtime/syntax/ishd.vim51
-rw-r--r--runtime/syntax/iss.vim73
-rw-r--r--runtime/syntax/ist.vim45
-rw-r--r--runtime/syntax/jal.vim137
-rw-r--r--runtime/syntax/jam.vim167
-rw-r--r--runtime/syntax/jargon.vim27
-rw-r--r--runtime/syntax/java.vim211
-rw-r--r--runtime/syntax/javacc.vim35
-rw-r--r--runtime/syntax/javascript.vim105
-rw-r--r--runtime/syntax/jess.vim63
-rw-r--r--runtime/syntax/jgraph.vim31
-rw-r--r--runtime/syntax/jproperties.vim41
-rw-r--r--runtime/syntax/json.vim59
-rw-r--r--runtime/syntax/jsp.vim49
-rw-r--r--runtime/syntax/kix.vim88
-rw-r--r--runtime/syntax/kscript.vim49
-rw-r--r--runtime/syntax/kwt.vim47
-rw-r--r--runtime/syntax/lace.vim85
-rw-r--r--runtime/syntax/latte.vim41
-rw-r--r--runtime/syntax/ld.vim6
-rw-r--r--runtime/syntax/ldapconf.vim6
-rw-r--r--runtime/syntax/ldif.vim32
-rw-r--r--runtime/syntax/lex.vim47
-rw-r--r--runtime/syntax/lftp.vim6
-rw-r--r--runtime/syntax/lhaskell.vim50
-rw-r--r--runtime/syntax/libao.vim6
-rw-r--r--runtime/syntax/lifelines.vim75
-rw-r--r--runtime/syntax/lilo.vim128
-rw-r--r--runtime/syntax/limits.vim6
-rw-r--r--runtime/syntax/lisp.vim724
-rw-r--r--runtime/syntax/lite.vim61
-rw-r--r--runtime/syntax/litestep.vim6
-rw-r--r--runtime/syntax/loginaccess.vim6
-rw-r--r--runtime/syntax/logindefs.vim6
-rw-r--r--runtime/syntax/logtalk.vim110
-rw-r--r--runtime/syntax/lotos.vim33
-rw-r--r--runtime/syntax/lout.vim78
-rw-r--r--runtime/syntax/lpc.vim171
-rw-r--r--runtime/syntax/lprolog.vim67
-rw-r--r--runtime/syntax/lscript.vim53
-rw-r--r--runtime/syntax/lss.vim112
-rw-r--r--runtime/syntax/lua.vim61
-rw-r--r--runtime/syntax/m4.vim51
-rw-r--r--runtime/syntax/mailaliases.vim6
-rw-r--r--runtime/syntax/make.vim63
-rw-r--r--runtime/syntax/man.vim106
-rw-r--r--runtime/syntax/manconf.vim6
-rw-r--r--runtime/syntax/maple.vim147
-rw-r--r--runtime/syntax/markdown.vim31
-rw-r--r--runtime/syntax/mason.vim92
-rw-r--r--runtime/syntax/master.vim29
-rw-r--r--runtime/syntax/matlab.vim87
-rw-r--r--runtime/syntax/maxima.vim63
-rw-r--r--runtime/syntax/mel.vim77
-rw-r--r--runtime/syntax/mf.vim388
-rw-r--r--runtime/syntax/mgl.vim69
-rw-r--r--runtime/syntax/mgp.vim44
-rw-r--r--runtime/syntax/mix.vim7
-rw-r--r--runtime/syntax/mma.vim78
-rw-r--r--runtime/syntax/mmix.vim71
-rw-r--r--runtime/syntax/mmp.vim10
-rw-r--r--runtime/syntax/modconf.vim6
-rw-r--r--runtime/syntax/modsim3.vim46
-rw-r--r--runtime/syntax/modula2.vim45
-rw-r--r--runtime/syntax/modula3.vim29
-rw-r--r--runtime/syntax/monk.vim55
-rw-r--r--runtime/syntax/moo.vim4
-rw-r--r--runtime/syntax/mp.vim853
-rw-r--r--runtime/syntax/msidl.vim63
-rw-r--r--runtime/syntax/msmessages.vim7
-rw-r--r--runtime/syntax/msql.vim71
-rw-r--r--runtime/syntax/mupad.vim40
-rw-r--r--runtime/syntax/murphi.vim127
-rw-r--r--runtime/syntax/mush.vim58
-rw-r--r--runtime/syntax/muttrc.vim717
-rw-r--r--runtime/syntax/mysql.vim39
-rw-r--r--runtime/syntax/n1ql.vim434
-rw-r--r--runtime/syntax/named.vim93
-rw-r--r--runtime/syntax/nanorc.vim6
-rw-r--r--runtime/syntax/nasm.vim215
-rw-r--r--runtime/syntax/nastran.vim60
-rw-r--r--runtime/syntax/natural.vim108
-rw-r--r--runtime/syntax/ncf.vim65
-rw-r--r--runtime/syntax/neomuttrc.vim1049
-rw-r--r--runtime/syntax/netrc.vim6
-rw-r--r--runtime/syntax/netrw.vim5
-rw-r--r--runtime/syntax/ninja.vim26
-rw-r--r--runtime/syntax/nqc.vim87
-rw-r--r--runtime/syntax/nroff.vim109
-rw-r--r--runtime/syntax/nsis.vim807
-rw-r--r--runtime/syntax/obj.vim45
-rw-r--r--runtime/syntax/objcpp.vim18
-rw-r--r--runtime/syntax/ocaml.vim141
-rw-r--r--runtime/syntax/occam.vim66
-rw-r--r--runtime/syntax/omnimark.vim39
-rw-r--r--runtime/syntax/openroad.vim46
-rw-r--r--runtime/syntax/opl.vim31
-rw-r--r--runtime/syntax/ora.vim52
-rw-r--r--runtime/syntax/pamconf.vim6
-rw-r--r--runtime/syntax/papp.vim29
-rw-r--r--runtime/syntax/pascal.vim87
-rw-r--r--runtime/syntax/passwd.vim6
-rw-r--r--runtime/syntax/pcap.vim31
-rw-r--r--runtime/syntax/pccts.vim59
-rw-r--r--runtime/syntax/perl.vim389
-rw-r--r--runtime/syntax/perl6.vim335
-rw-r--r--runtime/syntax/pf.vim351
-rw-r--r--runtime/syntax/pfmain.vim48
-rw-r--r--runtime/syntax/php.vim723
-rw-r--r--runtime/syntax/pic.vim57
-rw-r--r--runtime/syntax/pike.vim463
-rw-r--r--runtime/syntax/pilrc.vim46
-rw-r--r--runtime/syntax/pine.vim31
-rw-r--r--runtime/syntax/pinfo.vim6
-rw-r--r--runtime/syntax/plaintex.vim6
-rw-r--r--runtime/syntax/pli.vim94
-rw-r--r--runtime/syntax/plm.vim71
-rw-r--r--runtime/syntax/plp.vim18
-rw-r--r--runtime/syntax/plsql.vim89
-rw-r--r--runtime/syntax/po.vim107
-rw-r--r--runtime/syntax/pod.vim42
-rw-r--r--runtime/syntax/postscr.vim123
-rw-r--r--runtime/syntax/pov.vim10
-rw-r--r--runtime/syntax/povini.vim10
-rw-r--r--runtime/syntax/ppd.vim39
-rw-r--r--runtime/syntax/ppwiz.vim47
-rw-r--r--runtime/syntax/prescribe.vim31
-rw-r--r--runtime/syntax/procmail.vim43
-rw-r--r--runtime/syntax/progress.vim75
-rw-r--r--runtime/syntax/prolog.vim78
-rw-r--r--runtime/syntax/promela.vim7
-rw-r--r--runtime/syntax/proto.vim5
-rw-r--r--runtime/syntax/protocols.vim6
-rw-r--r--runtime/syntax/psf.vim38
-rw-r--r--runtime/syntax/ptcap.vim54
-rw-r--r--runtime/syntax/purifylog.vim97
-rw-r--r--runtime/syntax/pyrex.vim42
-rw-r--r--runtime/syntax/python.vim168
-rw-r--r--runtime/syntax/quake.vim8
-rw-r--r--runtime/syntax/r.vim183
-rw-r--r--runtime/syntax/racc.vim6
-rw-r--r--runtime/syntax/radiance.vim49
-rw-r--r--runtime/syntax/ratpoison.vim47
-rw-r--r--runtime/syntax/rc.vim95
-rw-r--r--runtime/syntax/rcs.vim33
-rw-r--r--runtime/syntax/rcslog.vim25
-rw-r--r--runtime/syntax/readline.vim28
-rw-r--r--runtime/syntax/rebol.vim119
-rw-r--r--runtime/syntax/redif.vim6
-rw-r--r--runtime/syntax/registry.vim40
-rw-r--r--runtime/syntax/remind.vim50
-rw-r--r--runtime/syntax/resolv.vim60
-rw-r--r--runtime/syntax/reva.vim9
-rw-r--r--runtime/syntax/rexx.vim139
-rw-r--r--runtime/syntax/rhelp.vim3
-rw-r--r--runtime/syntax/rib.vim29
-rw-r--r--runtime/syntax/rmd.vim153
-rw-r--r--runtime/syntax/rnc.vim6
-rw-r--r--runtime/syntax/rnoweb.vim4
-rw-r--r--runtime/syntax/robots.vim38
-rw-r--r--runtime/syntax/rpcgen.vim49
-rw-r--r--runtime/syntax/rpl.vim139
-rw-r--r--runtime/syntax/rrst.vim6
-rw-r--r--runtime/syntax/rst.vim118
-rw-r--r--runtime/syntax/rtf.vim55
-rw-r--r--runtime/syntax/ruby.vim439
-rw-r--r--runtime/syntax/rust.vim295
-rw-r--r--runtime/syntax/samba.vim33
-rw-r--r--runtime/syntax/sas.vim521
-rw-r--r--runtime/syntax/sass.vim12
-rw-r--r--runtime/syntax/sather.vim71
-rw-r--r--runtime/syntax/sbt.vim32
-rw-r--r--runtime/syntax/scala.vim232
-rw-r--r--runtime/syntax/scheme.vim744
-rw-r--r--runtime/syntax/scilab.vim83
-rw-r--r--runtime/syntax/sd.vim38
-rw-r--r--runtime/syntax/sdl.vim60
-rw-r--r--runtime/syntax/sed.vim80
-rw-r--r--runtime/syntax/sendpr.vim7
-rw-r--r--runtime/syntax/sensors.vim6
-rw-r--r--runtime/syntax/services.vim6
-rw-r--r--runtime/syntax/setserial.vim6
-rw-r--r--runtime/syntax/sgml.vim7
-rw-r--r--runtime/syntax/sgmldecl.vim45
-rw-r--r--runtime/syntax/sgmllnx.vim45
-rw-r--r--runtime/syntax/sh.vim560
-rw-r--r--runtime/syntax/sicad.vim79
-rw-r--r--runtime/syntax/sieve.vim6
-rw-r--r--runtime/syntax/simula.vim66
-rw-r--r--runtime/syntax/sinda.vim69
-rw-r--r--runtime/syntax/sindacmp.vim31
-rw-r--r--runtime/syntax/sindaout.vim57
-rw-r--r--runtime/syntax/sisu.vim10
-rw-r--r--runtime/syntax/skill.vim55
-rw-r--r--runtime/syntax/sl.vim71
-rw-r--r--runtime/syntax/slang.vim75
-rw-r--r--runtime/syntax/slice.vim47
-rw-r--r--runtime/syntax/slpconf.vim6
-rw-r--r--runtime/syntax/slpreg.vim6
-rw-r--r--runtime/syntax/slpspi.vim6
-rw-r--r--runtime/syntax/slrnrc.vim73
-rw-r--r--runtime/syntax/slrnsc.vim55
-rw-r--r--runtime/syntax/sm.vim54
-rw-r--r--runtime/syntax/smarty.vim36
-rw-r--r--runtime/syntax/smcl.vim5
-rw-r--r--runtime/syntax/smil.vim61
-rw-r--r--runtime/syntax/smith.vim33
-rw-r--r--runtime/syntax/sml.vim109
-rw-r--r--runtime/syntax/snnsnet.vim26
-rw-r--r--runtime/syntax/snnspat.vim32
-rw-r--r--runtime/syntax/snnsres.vim30
-rw-r--r--runtime/syntax/snobol4.vim80
-rw-r--r--runtime/syntax/spec.vim147
-rw-r--r--runtime/syntax/specman.vim79
-rw-r--r--runtime/syntax/spice.vim41
-rw-r--r--runtime/syntax/splint.vim111
-rw-r--r--runtime/syntax/spup.vim125
-rw-r--r--runtime/syntax/spyce.vim17
-rw-r--r--runtime/syntax/sql.vim7
-rw-r--r--runtime/syntax/sqlanywhere.vim7
-rw-r--r--runtime/syntax/sqlforms.vim52
-rw-r--r--runtime/syntax/sqlhana.vim7
-rw-r--r--runtime/syntax/sqlinformix.vim73
-rw-r--r--runtime/syntax/sqlj.vim39
-rw-r--r--runtime/syntax/sqloracle.vim54
-rw-r--r--runtime/syntax/sqr.vim119
-rw-r--r--runtime/syntax/squid.vim41
-rw-r--r--runtime/syntax/srec.vim47
-rw-r--r--runtime/syntax/sshconfig.vim82
-rw-r--r--runtime/syntax/sshdconfig.vim86
-rw-r--r--runtime/syntax/st.vim45
-rw-r--r--runtime/syntax/stata.vim5
-rw-r--r--runtime/syntax/stp.vim57
-rw-r--r--runtime/syntax/strace.vim48
-rw-r--r--runtime/syntax/sudoers.vim77
-rw-r--r--runtime/syntax/svn.vim37
-rw-r--r--runtime/syntax/synload.vim9
-rw-r--r--runtime/syntax/sysctl.vim6
-rw-r--r--runtime/syntax/systemverilog.vim40
-rw-r--r--runtime/syntax/tads.vim95
-rw-r--r--runtime/syntax/tags.vim50
-rw-r--r--runtime/syntax/tak.vim71
-rw-r--r--runtime/syntax/takcmp.vim35
-rw-r--r--runtime/syntax/takout.vim53
-rw-r--r--runtime/syntax/tap.vim97
-rw-r--r--runtime/syntax/taskdata.vim7
-rw-r--r--runtime/syntax/taskedit.vim7
-rw-r--r--runtime/syntax/tasm.vim45
-rw-r--r--runtime/syntax/tcl.vim79
-rw-r--r--runtime/syntax/teraterm.vim19
-rw-r--r--runtime/syntax/terminfo.vim6
-rw-r--r--runtime/syntax/tex.vim472
-rw-r--r--runtime/syntax/texinfo.vim79
-rw-r--r--runtime/syntax/texmf.vim56
-rw-r--r--runtime/syntax/tf.vim73
-rw-r--r--runtime/syntax/tidy.vim242
-rw-r--r--runtime/syntax/tli.vim39
-rw-r--r--runtime/syntax/tmux.vim123
-rw-r--r--runtime/syntax/tpp.vim57
-rw-r--r--runtime/syntax/trasys.vim71
-rw-r--r--runtime/syntax/treetop.vim6
-rw-r--r--runtime/syntax/trustees.vim5
-rw-r--r--runtime/syntax/tsalt.vim77
-rw-r--r--runtime/syntax/tsscl.vim59
-rw-r--r--runtime/syntax/tssgm.vim55
-rw-r--r--runtime/syntax/tssop.vim45
-rw-r--r--runtime/syntax/tt2.vim6
-rw-r--r--runtime/syntax/tutor.vim22
-rw-r--r--runtime/syntax/uc.vim113
-rw-r--r--runtime/syntax/udevconf.vim6
-rw-r--r--runtime/syntax/udevperm.vim6
-rw-r--r--runtime/syntax/udevrules.vim6
-rw-r--r--runtime/syntax/uil.vim58
-rw-r--r--runtime/syntax/updatedb.vim6
-rw-r--r--runtime/syntax/upstart.vim5
-rw-r--r--runtime/syntax/vb.vim61
-rw-r--r--runtime/syntax/vera.vim131
-rw-r--r--runtime/syntax/verilog.vim59
-rw-r--r--runtime/syntax/verilogams.vim59
-rw-r--r--runtime/syntax/vhdl.vim73
-rw-r--r--runtime/syntax/vim.vim656
-rw-r--r--runtime/syntax/viminfo.vim6
-rw-r--r--runtime/syntax/virata.vim110
-rw-r--r--runtime/syntax/vmasm.vim95
-rw-r--r--runtime/syntax/vrml.vim75
-rw-r--r--runtime/syntax/vroom.vim7
-rw-r--r--runtime/syntax/vsejcl.vim33
-rw-r--r--runtime/syntax/wast.vim84
-rw-r--r--runtime/syntax/wdiff.vim28
-rw-r--r--runtime/syntax/web.vim15
-rw-r--r--runtime/syntax/webmacro.vim51
-rw-r--r--runtime/syntax/winbatch.vim39
-rw-r--r--runtime/syntax/wml.vim64
-rw-r--r--runtime/syntax/wsml.vim76
-rw-r--r--runtime/syntax/xdefaults.vim57
-rw-r--r--runtime/syntax/xf86conf.vim8
-rw-r--r--runtime/syntax/xinetd.vim6
-rw-r--r--runtime/syntax/xkb.vim74
-rw-r--r--runtime/syntax/xmath.vim65
-rw-r--r--runtime/syntax/xmodmap.vim6
-rw-r--r--runtime/syntax/xpm.vim40
-rw-r--r--runtime/syntax/xpm2.vim51
-rw-r--r--runtime/syntax/xs.vim3983
-rw-r--r--runtime/syntax/xxd.vim28
-rw-r--r--runtime/syntax/yacc.vim11
-rw-r--r--runtime/syntax/z8a.vim45
-rw-r--r--runtime/syntax/zsh.vim432
-rw-r--r--runtime/tools/check_colors.vim136
-rw-r--r--runtime/tutor/en/vim-01-beginner.tutor820
-rw-r--r--runtime/tutor/en/vim-01-beginner.tutor.json43
-rw-r--r--runtime/tutor/tutor.tutor118
-rw-r--r--runtime/tutor/tutor.tutor.json35
-rw-r--r--runtime/vimrc_example.vim50
-rwxr-xr-xscripts/check-includes.py66
-rw-r--r--scripts/check_urls.vim68
-rwxr-xr-xscripts/download-unicode-files.sh18
-rwxr-xr-xscripts/gen_api_vimdoc.py560
-rw-r--r--scripts/gen_help_html.py355
-rwxr-xr-xscripts/genappimage.sh98
-rw-r--r--scripts/genvimvim.lua50
-rwxr-xr-xscripts/git-log-pretty-since.sh28
-rw-r--r--scripts/msgpack-gen.lua313
-rwxr-xr-xscripts/pvscheck.sh491
-rwxr-xr-xscripts/release.sh82
-rwxr-xr-xscripts/run-api-tests.exp50
-rwxr-xr-xscripts/shadacat.py2
-rwxr-xr-xscripts/update_terminfo.sh94
-rwxr-xr-xscripts/vim-patch.sh448
-rwxr-xr-xscripts/vimpatch.lua67
-rw-r--r--scripts/windows.ti71
-rw-r--r--snap/snapcraft.yaml41
-rw-r--r--src/.asan-blacklist6
-rw-r--r--src/.valgrind.supp2
-rwxr-xr-xsrc/clint.py167
-rw-r--r--src/coverity-model.c70
-rw-r--r--src/nvim/CMakeLists.txt535
-rw-r--r--src/nvim/README.md190
-rw-r--r--src/nvim/api/buffer.c905
-rw-r--r--src/nvim/api/dispatch_deprecated.lua69
-rw-r--r--src/nvim/api/private/defs.h47
-rw-r--r--src/nvim/api/private/dispatch.c52
-rw-r--r--src/nvim/api/private/dispatch.h23
-rw-r--r--src/nvim/api/private/handle.c19
-rw-r--r--src/nvim/api/private/handle.h6
-rw-r--r--src/nvim/api/private/helpers.c688
-rw-r--r--src/nvim/api/private/helpers.h32
-rw-r--r--src/nvim/api/tabpage.c132
-rw-r--r--src/nvim/api/ui.c617
-rw-r--r--src/nvim/api/ui_events.in.h130
-rw-r--r--src/nvim/api/vim.c1702
-rw-r--r--src/nvim/api/vim.h4
-rw-r--r--src/nvim/api/window.c276
-rw-r--r--src/nvim/arabic.c1083
-rw-r--r--src/nvim/ascii.h30
-rw-r--r--src/nvim/assert.h30
-rw-r--r--src/nvim/aucmd.c40
-rw-r--r--src/nvim/aucmd.h9
-rw-r--r--src/nvim/auevents.lua20
-rw-r--r--src/nvim/buffer.c1828
-rw-r--r--src/nvim/buffer.h89
-rw-r--r--src/nvim/buffer_defs.h329
-rw-r--r--src/nvim/buffer_updates.c211
-rw-r--r--src/nvim/buffer_updates.h10
-rw-r--r--src/nvim/bufhl_defs.h30
-rw-r--r--src/nvim/channel.c831
-rw-r--r--src/nvim/channel.h134
-rw-r--r--src/nvim/charset.c1088
-rw-r--r--src/nvim/charset.h48
-rw-r--r--src/nvim/cursor.c106
-rw-r--r--src/nvim/cursor.h1
-rw-r--r--src/nvim/cursor_shape.c232
-rw-r--r--src/nvim/cursor_shape.h79
-rw-r--r--src/nvim/diff.c1279
-rw-r--r--src/nvim/diff.h3
-rw-r--r--src/nvim/digraph.c137
-rw-r--r--src/nvim/digraph.h3
-rw-r--r--src/nvim/edit.c1651
-rw-r--r--src/nvim/edit.h11
-rw-r--r--src/nvim/eval.c17917
-rw-r--r--src/nvim/eval.h63
-rw-r--r--src/nvim/eval.lua356
-rw-r--r--src/nvim/eval/decode.c348
-rw-r--r--src/nvim/eval/decode.h3
-rw-r--r--src/nvim/eval/encode.c442
-rw-r--r--src/nvim/eval/encode.h13
-rw-r--r--src/nvim/eval/executor.c118
-rw-r--r--src/nvim/eval/executor.h11
-rw-r--r--src/nvim/eval/gc.c14
-rw-r--r--src/nvim/eval/gc.h12
-rw-r--r--src/nvim/eval/typval.c2912
-rw-r--r--src/nvim/eval/typval.h842
-rw-r--r--src/nvim/eval/typval_encode.c.h846
-rw-r--r--src/nvim/eval/typval_encode.h588
-rw-r--r--src/nvim/eval_defs.h165
-rw-r--r--src/nvim/event/defs.h10
-rw-r--r--src/nvim/event/libuv_process.c51
-rw-r--r--src/nvim/event/libuv_process.h5
-rw-r--r--src/nvim/event/loop.c120
-rw-r--r--src/nvim/event/loop.h42
-rw-r--r--src/nvim/event/multiqueue.c247
-rw-r--r--src/nvim/event/multiqueue.h19
-rw-r--r--src/nvim/event/process.c260
-rw-r--r--src/nvim/event/process.h26
-rw-r--r--src/nvim/event/queue.c208
-rw-r--r--src/nvim/event/queue.h19
-rw-r--r--src/nvim/event/rstream.c60
-rw-r--r--src/nvim/event/signal.c3
-rw-r--r--src/nvim/event/signal.h2
-rw-r--r--src/nvim/event/socket.c214
-rw-r--r--src/nvim/event/socket.h4
-rw-r--r--src/nvim/event/stream.c29
-rw-r--r--src/nvim/event/stream.h13
-rw-r--r--src/nvim/event/time.c14
-rw-r--r--src/nvim/event/time.h2
-rw-r--r--src/nvim/event/wstream.c25
-rw-r--r--src/nvim/ex_cmds.c3573
-rw-r--r--src/nvim/ex_cmds.h20
-rw-r--r--src/nvim/ex_cmds.lua196
-rw-r--r--src/nvim/ex_cmds2.c900
-rw-r--r--src/nvim/ex_cmds_defs.h101
-rw-r--r--src/nvim/ex_docmd.c2780
-rw-r--r--src/nvim/ex_docmd.h30
-rw-r--r--src/nvim/ex_eval.c466
-rw-r--r--src/nvim/ex_eval.h49
-rw-r--r--src/nvim/ex_getln.c2323
-rw-r--r--src/nvim/ex_getln.h5
-rw-r--r--src/nvim/farsi.c416
-rw-r--r--src/nvim/file_search.c287
-rw-r--r--src/nvim/file_search.h5
-rw-r--r--src/nvim/fileio.c2293
-rw-r--r--src/nvim/fileio.h29
-rw-r--r--src/nvim/fold.c894
-rw-r--r--src/nvim/fold.h5
-rw-r--r--src/nvim/func_attr.h72
-rw-r--r--src/nvim/garray.c4
-rw-r--r--src/nvim/garray.h2
-rw-r--r--src/nvim/generators/c_grammar.lua50
-rw-r--r--src/nvim/generators/dump_bin_array.lua17
-rw-r--r--src/nvim/generators/gen_api_dispatch.lua468
-rw-r--r--src/nvim/generators/gen_api_ui_events.lua177
-rw-r--r--src/nvim/generators/gen_char_blob.lua48
-rwxr-xr-xsrc/nvim/generators/gen_declarations.lua (renamed from scripts/gendeclarations.lua)112
-rw-r--r--src/nvim/generators/gen_eval.lua67
-rw-r--r--src/nvim/generators/gen_events.lua (renamed from scripts/gen_events.lua)15
-rw-r--r--src/nvim/generators/gen_ex_cmds.lua (renamed from scripts/genex_cmds.lua)2
-rw-r--r--src/nvim/generators/gen_options.lua (renamed from scripts/genoptions.lua)12
-rw-r--r--src/nvim/generators/gen_unicode_tables.lua (renamed from scripts/genunicodetables.lua)106
-rw-r--r--src/nvim/getchar.c1241
-rw-r--r--src/nvim/getchar.h33
-rw-r--r--src/nvim/gettext.h23
-rw-r--r--src/nvim/globals.h744
-rw-r--r--src/nvim/grid_defs.h59
-rw-r--r--src/nvim/hardcopy.c282
-rw-r--r--src/nvim/hardcopy.h11
-rw-r--r--src/nvim/hashtab.c99
-rw-r--r--src/nvim/hashtab.h28
-rw-r--r--src/nvim/highlight.c416
-rw-r--r--src/nvim/highlight.h13
-rw-r--r--src/nvim/highlight_defs.h172
-rw-r--r--src/nvim/iconv.h6
-rw-r--r--src/nvim/if_cscope.c533
-rw-r--r--src/nvim/if_cscope.h3
-rw-r--r--src/nvim/if_cscope_defs.h14
-rw-r--r--src/nvim/indent.c56
-rw-r--r--src/nvim/indent_c.c276
-rw-r--r--src/nvim/keymap.c568
-rw-r--r--src/nvim/keymap.h271
-rw-r--r--src/nvim/lib/kbtree.h431
-rw-r--r--src/nvim/lib/kvec.h22
-rw-r--r--src/nvim/lib/queue.h18
-rw-r--r--src/nvim/lib/ringbuf.h27
-rw-r--r--src/nvim/log.c238
-rw-r--r--src/nvim/log.h79
-rw-r--r--src/nvim/lua/converter.c1206
-rw-r--r--src/nvim/lua/converter.h15
-rw-r--r--src/nvim/lua/executor.c549
-rw-r--r--src/nvim/lua/executor.h25
-rw-r--r--src/nvim/lua/vim.lua212
-rw-r--r--src/nvim/macros.h176
-rw-r--r--src/nvim/main.c1266
-rw-r--r--src/nvim/map.c35
-rw-r--r--src/nvim/map.h13
-rw-r--r--src/nvim/mark.c170
-rw-r--r--src/nvim/mark.h44
-rw-r--r--src/nvim/mark_defs.h2
-rw-r--r--src/nvim/mbyte.c1680
-rw-r--r--src/nvim/mbyte.h63
-rw-r--r--src/nvim/memfile.c195
-rw-r--r--src/nvim/memfile_defs.h5
-rw-r--r--src/nvim/memline.c511
-rw-r--r--src/nvim/memline.h2
-rw-r--r--src/nvim/memory.c232
-rw-r--r--src/nvim/memory.h33
-rw-r--r--src/nvim/menu.c377
-rw-r--r--src/nvim/menu.h52
-rw-r--r--src/nvim/message.c2105
-rw-r--r--src/nvim/message.h22
-rw-r--r--src/nvim/misc1.c509
-rw-r--r--src/nvim/misc2.c486
-rw-r--r--src/nvim/misc2.h12
-rw-r--r--src/nvim/mouse.c148
-rw-r--r--src/nvim/move.c365
-rw-r--r--src/nvim/move.h1
-rw-r--r--src/nvim/msgpack_rpc/channel.c605
-rw-r--r--src/nvim/msgpack_rpc/channel.h8
-rw-r--r--src/nvim/msgpack_rpc/channel_defs.h37
-rw-r--r--src/nvim/msgpack_rpc/defs.h28
-rw-r--r--src/nvim/msgpack_rpc/helpers.c125
-rw-r--r--src/nvim/msgpack_rpc/helpers.h7
-rw-r--r--src/nvim/msgpack_rpc/server.c94
-rw-r--r--src/nvim/msgpack_rpc/server.h2
-rw-r--r--src/nvim/normal.c1437
-rw-r--r--src/nvim/ops.c1237
-rw-r--r--src/nvim/ops.h4
-rw-r--r--src/nvim/option.c2390
-rw-r--r--src/nvim/option.h25
-rw-r--r--src/nvim/option_defs.h278
-rw-r--r--src/nvim/options.lua236
-rw-r--r--src/nvim/os/dl.c3
-rw-r--r--src/nvim/os/env.c430
-rw-r--r--src/nvim/os/fileio.c175
-rw-r--r--src/nvim/os/fileio.h5
-rw-r--r--src/nvim/os/fs.c662
-rw-r--r--src/nvim/os/fs_defs.h2
-rw-r--r--src/nvim/os/input.c121
-rw-r--r--src/nvim/os/lang.c65
-rw-r--r--src/nvim/os/lang.h7
-rw-r--r--src/nvim/os/mem.c3
-rw-r--r--src/nvim/os/os_defs.h11
-rw-r--r--src/nvim/os/process.c267
-rw-r--r--src/nvim/os/process.h11
-rw-r--r--src/nvim/os/pty_process_unix.c135
-rw-r--r--src/nvim/os/pty_process_win.c418
-rw-r--r--src/nvim/os/pty_process_win.h27
-rw-r--r--src/nvim/os/shell.c440
-rw-r--r--src/nvim/os/shell.h2
-rw-r--r--src/nvim/os/signal.c22
-rw-r--r--src/nvim/os/stdpaths.c61
-rw-r--r--src/nvim/os/time.c56
-rw-r--r--src/nvim/os/tty.c60
-rw-r--r--src/nvim/os/tty.h7
-rw-r--r--src/nvim/os/unix_defs.h8
-rw-r--r--src/nvim/os/users.c9
-rw-r--r--src/nvim/os/win_defs.h30
-rw-r--r--src/nvim/os_unix.c437
-rw-r--r--src/nvim/path.c548
-rw-r--r--src/nvim/po/CMakeLists.txt84
-rw-r--r--src/nvim/po/af.po7129
-rw-r--r--src/nvim/po/ca.po115
-rw-r--r--src/nvim/po/check.vim164
-rw-r--r--src/nvim/po/cleanup.vim8
-rw-r--r--src/nvim/po/cs.cp1250.po15
-rw-r--r--src/nvim/po/cs.po15
-rw-r--r--src/nvim/po/da.po7088
-rw-r--r--src/nvim/po/de.po53
-rw-r--r--src/nvim/po/en_GB.po9
-rw-r--r--src/nvim/po/eo.po6581
-rw-r--r--src/nvim/po/es.po66
-rw-r--r--src/nvim/po/fi.po7581
-rw-r--r--src/nvim/po/fr.po6771
-rw-r--r--src/nvim/po/ga.po6336
-rw-r--r--src/nvim/po/it.po118
-rw-r--r--src/nvim/po/ja.euc-jp.po6524
-rw-r--r--src/nvim/po/ja.po6525
-rw-r--r--src/nvim/po/ja.sjis.po8223
-rw-r--r--src/nvim/po/ko.UTF-8.po93
-rw-r--r--src/nvim/po/ko.po7858
-rw-r--r--src/nvim/po/nb.po36
-rw-r--r--src/nvim/po/nl.po19
-rw-r--r--src/nvim/po/no.po36
-rw-r--r--src/nvim/po/pl.UTF-8.po42
-rw-r--r--src/nvim/po/pl.cp1250.po8264
-rw-r--r--src/nvim/po/pl.po8264
-rw-r--r--src/nvim/po/pt_BR.po27
-rw-r--r--src/nvim/po/ru.cp1251.po8282
-rw-r--r--src/nvim/po/ru.po45
-rw-r--r--src/nvim/po/sjiscorr.c45
-rw-r--r--src/nvim/po/sk.cp1250.po32
-rw-r--r--src/nvim/po/sk.po32
-rw-r--r--src/nvim/po/sr.po7115
-rw-r--r--src/nvim/po/sv.po31
-rw-r--r--src/nvim/po/uk.cp1251.po8388
-rw-r--r--src/nvim/po/uk.po5860
-rw-r--r--src/nvim/po/vi.po16
-rw-r--r--src/nvim/po/zh_CN.UTF-8.po25
-rw-r--r--src/nvim/po/zh_CN.cp936.po7932
-rw-r--r--src/nvim/po/zh_CN.po7932
-rw-r--r--src/nvim/po/zh_TW.UTF-8.po21
-rw-r--r--src/nvim/po/zh_TW.po7910
-rw-r--r--src/nvim/popupmnu.c487
-rw-r--r--src/nvim/popupmnu.h2
-rw-r--r--src/nvim/pos.h8
-rw-r--r--src/nvim/profile.c3
-rw-r--r--src/nvim/quickfix.c3355
-rw-r--r--src/nvim/quickfix.h3
-rw-r--r--src/nvim/rbuffer.c9
-rw-r--r--src/nvim/rbuffer.h2
-rw-r--r--src/nvim/regexp.c1819
-rw-r--r--src/nvim/regexp.h25
-rw-r--r--src/nvim/regexp_defs.h46
-rw-r--r--src/nvim/regexp_nfa.c957
-rw-r--r--src/nvim/screen.c4953
-rw-r--r--src/nvim/screen.h17
-rw-r--r--src/nvim/search.c854
-rw-r--r--src/nvim/search.h6
-rw-r--r--src/nvim/sha256.c17
-rw-r--r--src/nvim/sha256.h1
-rw-r--r--src/nvim/shada.c1005
-rw-r--r--src/nvim/sign_defs.h23
-rw-r--r--src/nvim/spell.c6961
-rw-r--r--src/nvim/spell.h4
-rw-r--r--src/nvim/spell_defs.h291
-rw-r--r--src/nvim/spellfile.c5727
-rw-r--r--src/nvim/spellfile.h13
-rw-r--r--src/nvim/state.c120
-rw-r--r--src/nvim/strings.c1159
-rw-r--r--src/nvim/strings.h22
-rw-r--r--src/nvim/syntax.c3988
-rw-r--r--src/nvim/syntax.h17
-rw-r--r--src/nvim/syntax_defs.h48
-rw-r--r--src/nvim/tag.c682
-rw-r--r--src/nvim/tag.h3
-rw-r--r--src/nvim/terminal.c546
-rw-r--r--src/nvim/terminal.h2
-rw-r--r--src/nvim/testdir/Makefile162
-rw-r--r--src/nvim/testdir/pyxfile/py2_magic.py4
-rw-r--r--src/nvim/testdir/pyxfile/py2_shebang.py4
-rw-r--r--src/nvim/testdir/pyxfile/py3_magic.py4
-rw-r--r--src/nvim/testdir/pyxfile/py3_shebang.py4
-rw-r--r--src/nvim/testdir/pyxfile/pyx.py2
-rwxr-xr-xsrc/nvim/testdir/runnvim.sh82
-rw-r--r--src/nvim/testdir/runnvim.vim55
-rw-r--r--src/nvim/testdir/runtest.vim308
-rw-r--r--src/nvim/testdir/samples/memfile_test.c146
-rw-r--r--src/nvim/testdir/samples/quickfix.txt4
-rw-r--r--src/nvim/testdir/sautest/autoload/foo.vim7
-rw-r--r--src/nvim/testdir/sautest/autoload/footest.vim2
-rw-r--r--src/nvim/testdir/sautest/autoload/globone.vim1
-rw-r--r--src/nvim/testdir/sautest/autoload/globtwo.vim1
-rw-r--r--src/nvim/testdir/sautest/autoload/sourced.vim3
-rw-r--r--src/nvim/testdir/setup.vim40
-rw-r--r--src/nvim/testdir/shared.vim248
-rw-r--r--src/nvim/testdir/test12.in50
-rw-r--r--src/nvim/testdir/test12.ok10
-rw-r--r--src/nvim/testdir/test13.in63
-rw-r--r--src/nvim/testdir/test13.ok31
-rw-r--r--src/nvim/testdir/test17.in14
-rw-r--r--src/nvim/testdir/test24.inbin1265 -> 0 bytes
-rw-r--r--src/nvim/testdir/test24.ok32
-rw-r--r--src/nvim/testdir/test30.in230
-rw-r--r--src/nvim/testdir/test30.ok130
-rw-r--r--src/nvim/testdir/test32.in60
-rw-r--r--src/nvim/testdir/test32.ok15
-rw-r--r--src/nvim/testdir/test40.in63
-rw-r--r--src/nvim/testdir/test40.ok11
-rw-r--r--src/nvim/testdir/test47.in102
-rw-r--r--src/nvim/testdir/test47.ok44
-rw-r--r--src/nvim/testdir/test49.vim4
-rw-r--r--src/nvim/testdir/test53.in133
-rw-r--r--src/nvim/testdir/test53.ok71
-rw-r--r--src/nvim/testdir/test64.in4
-rw-r--r--src/nvim/testdir/test64.ok3
-rw-r--r--src/nvim/testdir/test69.in191
-rw-r--r--src/nvim/testdir/test69.ok166
-rw-r--r--src/nvim/testdir/test73.in175
-rw-r--r--src/nvim/testdir/test73.ok21
-rw-r--r--src/nvim/testdir/test79.inbin3335 -> 0 bytes
-rw-r--r--src/nvim/testdir/test79.okbin570 -> 0 bytes
-rw-r--r--src/nvim/testdir/test8.in43
-rw-r--r--src/nvim/testdir/test8.ok7
-rw-r--r--src/nvim/testdir/test_alot.vim50
-rw-r--r--src/nvim/testdir/test_alot_latin.vim10
-rw-r--r--src/nvim/testdir/test_alot_utf8.vim17
-rw-r--r--src/nvim/testdir/test_arabic.vim613
-rw-r--r--src/nvim/testdir/test_arglist.vim376
-rw-r--r--src/nvim/testdir/test_assign.vim47
-rw-r--r--src/nvim/testdir/test_autochdir.vim19
-rw-r--r--src/nvim/testdir/test_autocmd.vim1308
-rw-r--r--src/nvim/testdir/test_autoload.vim17
-rw-r--r--src/nvim/testdir/test_behave.vim29
-rw-r--r--src/nvim/testdir/test_blockedit.vim33
-rw-r--r--src/nvim/testdir/test_breakindent.vim298
-rw-r--r--src/nvim/testdir/test_bufwintabinfo.vim133
-rw-r--r--src/nvim/testdir/test_cd.vim67
-rw-r--r--src/nvim/testdir/test_changedtick.vim57
-rw-r--r--src/nvim/testdir/test_charsearch.vim62
-rw-r--r--src/nvim/testdir/test_charsearch_utf8.vim22
-rw-r--r--src/nvim/testdir/test_cindent.vim105
-rw-r--r--src/nvim/testdir/test_clientserver.vim107
-rw-r--r--src/nvim/testdir/test_close_count.vim174
-rw-r--r--src/nvim/testdir/test_cmdline.vim525
-rw-r--r--src/nvim/testdir/test_command_count.vim195
-rw-r--r--src/nvim/testdir/test_comparators.vim9
-rw-r--r--src/nvim/testdir/test_compiler.vim54
-rw-r--r--src/nvim/testdir/test_cscope.vim279
-rw-r--r--src/nvim/testdir/test_cursor_func.vim8
-rw-r--r--src/nvim/testdir/test_curswant.vim23
-rw-r--r--src/nvim/testdir/test_diffmode.vim740
-rw-r--r--src/nvim/testdir/test_digraph.vim468
-rw-r--r--src/nvim/testdir/test_display.vim71
-rw-r--r--src/nvim/testdir/test_edit.vim1445
-rw-r--r--src/nvim/testdir/test_erasebackword.vim25
-rw-r--r--src/nvim/testdir/test_escaped_glob.vim34
-rw-r--r--src/nvim/testdir/test_eval_stuff.vim23
-rw-r--r--src/nvim/testdir/test_ex_undo.vim19
-rw-r--r--src/nvim/testdir/test_ex_z.vim78
-rw-r--r--src/nvim/testdir/test_exec_while_if.vim53
-rw-r--r--src/nvim/testdir/test_execute_func.vim55
-rw-r--r--src/nvim/testdir/test_exists.vim321
-rw-r--r--src/nvim/testdir/test_exists_autocmd.vim26
-rw-r--r--src/nvim/testdir/test_exit.vim57
-rw-r--r--src/nvim/testdir/test_expr.vim480
-rw-r--r--src/nvim/testdir/test_expr_utf8.vim37
-rw-r--r--src/nvim/testdir/test_farsi.vim133
-rw-r--r--src/nvim/testdir/test_feedkeys.vim14
-rw-r--r--src/nvim/testdir/test_file_size.vim58
-rw-r--r--src/nvim/testdir/test_fileformat.vim33
-rw-r--r--src/nvim/testdir/test_filetype.vim602
-rw-r--r--src/nvim/testdir/test_filter_cmd.vim89
-rw-r--r--src/nvim/testdir/test_filter_map.vim81
-rw-r--r--src/nvim/testdir/test_find_complete.vim166
-rw-r--r--src/nvim/testdir/test_findfile.vim25
-rw-r--r--src/nvim/testdir/test_fixeol.vim48
-rw-r--r--src/nvim/testdir/test_float_func.vim332
-rw-r--r--src/nvim/testdir/test_fnameescape.vim21
-rw-r--r--src/nvim/testdir/test_fold.vim742
-rw-r--r--src/nvim/testdir/test_functions.vim1039
-rw-r--r--src/nvim/testdir/test_ga.vim37
-rw-r--r--src/nvim/testdir/test_getcwd.vim112
-rw-r--r--src/nvim/testdir/test_getvar.vim104
-rw-r--r--src/nvim/testdir/test_gf.vim61
-rw-r--r--src/nvim/testdir/test_glob2regpat.vim30
-rw-r--r--src/nvim/testdir/test_global.vim20
-rw-r--r--src/nvim/testdir/test_gn.vim136
-rw-r--r--src/nvim/testdir/test_goto.vim373
-rw-r--r--src/nvim/testdir/test_hardcopy.vim31
-rw-r--r--src/nvim/testdir/test_help.vim52
-rw-r--r--src/nvim/testdir/test_help_tagjump.vim232
-rw-r--r--src/nvim/testdir/test_hide.vim97
-rw-r--r--src/nvim/testdir/test_highlight.vim535
-rw-r--r--src/nvim/testdir/test_history.vim111
-rw-r--r--src/nvim/testdir/test_hlsearch.vim46
-rw-r--r--src/nvim/testdir/test_increment.vim782
-rw-r--r--src/nvim/testdir/test_increment_dbcs.vim29
-rw-r--r--src/nvim/testdir/test_ins_complete.vim251
-rw-r--r--src/nvim/testdir/test_join.vim35
-rw-r--r--src/nvim/testdir/test_jumps.vim11
-rw-r--r--src/nvim/testdir/test_lambda.vim287
-rw-r--r--src/nvim/testdir/test_largefile.vim34
-rw-r--r--src/nvim/testdir/test_let.vim27
-rw-r--r--src/nvim/testdir/test_lineending.vim19
-rw-r--r--src/nvim/testdir/test_lispwords.vim82
-rw-r--r--src/nvim/testdir/test_listchars.vim63
-rw-r--r--src/nvim/testdir/test_listdict.vim651
-rw-r--r--src/nvim/testdir/test_listlbr.vim238
-rw-r--r--src/nvim/testdir/test_listlbr_utf8.vim271
-rw-r--r--src/nvim/testdir/test_makeencoding.py67
-rw-r--r--src/nvim/testdir/test_makeencoding.vim113
-rw-r--r--src/nvim/testdir/test_maparg.vim56
-rw-r--r--src/nvim/testdir/test_mapping.vim286
-rw-r--r--src/nvim/testdir/test_marks.vim138
-rw-r--r--src/nvim/testdir/test_match.vim232
-rw-r--r--src/nvim/testdir/test_matchadd_conceal.vim275
-rw-r--r--src/nvim/testdir/test_matchadd_conceal_utf8.vim39
-rw-r--r--src/nvim/testdir/test_menu.vim2
-rw-r--r--src/nvim/testdir/test_messages.vim45
-rw-r--r--src/nvim/testdir/test_mksession.vim241
-rw-r--r--src/nvim/testdir/test_mksession_utf8.vim105
-rw-r--r--src/nvim/testdir/test_move.vim40
-rw-r--r--src/nvim/testdir/test_nested_function.vim63
-rw-r--r--src/nvim/testdir/test_normal.vim2542
-rw-r--r--src/nvim/testdir/test_number.vim254
-rw-r--r--src/nvim/testdir/test_options.vim412
-rw-r--r--src/nvim/testdir/test_partial.vim351
-rw-r--r--src/nvim/testdir/test_plus_arg_edit.vim10
-rw-r--r--src/nvim/testdir/test_popup.vim715
-rw-r--r--src/nvim/testdir/test_preview.vim13
-rw-r--r--src/nvim/testdir/test_profile.vim183
-rw-r--r--src/nvim/testdir/test_put.vim49
-rw-r--r--src/nvim/testdir/test_python2.vim54
-rw-r--r--src/nvim/testdir/test_python3.vim54
-rw-r--r--src/nvim/testdir/test_pyx2.vim74
-rw-r--r--src/nvim/testdir/test_pyx3.vim74
-rw-r--r--src/nvim/testdir/test_quickfix.vim2666
-rw-r--r--src/nvim/testdir/test_quotestar.vim157
-rw-r--r--src/nvim/testdir/test_recover.vim58
-rw-r--r--src/nvim/testdir/test_regex_char_classes.vim58
-rw-r--r--src/nvim/testdir/test_regexp_latin.vim32
-rw-r--r--src/nvim/testdir/test_regexp_utf8.vim185
-rw-r--r--src/nvim/testdir/test_registers.vim65
-rw-r--r--src/nvim/testdir/test_retab.vim77
-rw-r--r--src/nvim/testdir/test_scriptnames.vim26
-rw-r--r--src/nvim/testdir/test_scroll_opt.vim36
-rw-r--r--src/nvim/testdir/test_scrollbind.vim32
-rw-r--r--src/nvim/testdir/test_search.vim491
-rw-r--r--src/nvim/testdir/test_sha256.vim22
-rw-r--r--src/nvim/testdir/test_signs.vim226
-rw-r--r--src/nvim/testdir/test_smartindent.vim41
-rw-r--r--src/nvim/testdir/test_sort.vim1253
-rw-r--r--src/nvim/testdir/test_source_utf8.vim63
-rw-r--r--src/nvim/testdir/test_spell.vim851
-rw-r--r--src/nvim/testdir/test_startup.vim367
-rw-r--r--src/nvim/testdir/test_startup_utf8.vim64
-rw-r--r--src/nvim/testdir/test_stat.vim185
-rw-r--r--src/nvim/testdir/test_statusline.vim274
-rw-r--r--src/nvim/testdir/test_substitute.vim503
-rw-r--r--src/nvim/testdir/test_suspend.vim51
-rw-r--r--src/nvim/testdir/test_swap.vim63
-rw-r--r--src/nvim/testdir/test_syn_attr.vim28
-rw-r--r--src/nvim/testdir/test_syntax.vim444
-rw-r--r--src/nvim/testdir/test_system.vim90
-rw-r--r--src/nvim/testdir/test_tab.vim45
-rw-r--r--src/nvim/testdir/test_tabline.vim43
-rw-r--r--src/nvim/testdir/test_tabpage.vim550
-rw-r--r--src/nvim/testdir/test_tagcase.vim73
-rw-r--r--src/nvim/testdir/test_tagjump.vim261
-rw-r--r--src/nvim/testdir/test_taglist.vim63
-rw-r--r--src/nvim/testdir/test_textformat.vim168
-rw-r--r--src/nvim/testdir/test_textobjects.vim259
-rw-r--r--src/nvim/testdir/test_timers.vim222
-rw-r--r--src/nvim/testdir/test_true_false.vim150
-rw-r--r--src/nvim/testdir/test_undo.vim436
-rw-r--r--src/nvim/testdir/test_unlet.vim40
-rw-r--r--src/nvim/testdir/test_user_func.vim96
-rw-r--r--src/nvim/testdir/test_usercommands.vim220
-rw-r--r--src/nvim/testdir/test_utf8.vim65
-rw-r--r--src/nvim/testdir/test_utf8_comparisons.vim95
-rw-r--r--src/nvim/testdir/test_vimscript.vim (renamed from src/nvim/testdir/test_viml.vim)340
-rw-r--r--src/nvim/testdir/test_virtualedit.vim61
-rw-r--r--src/nvim/testdir/test_visual.vim320
-rw-r--r--src/nvim/testdir/test_winbuf_close.vim160
-rw-r--r--src/nvim/testdir/test_window_cmd.vim521
-rw-r--r--src/nvim/testdir/test_window_id.vim103
-rw-r--r--src/nvim/testdir/test_windows_home.vim121
-rw-r--r--src/nvim/testdir/test_wordcount.vim108
-rw-r--r--src/nvim/testdir/test_writefile.vim133
-rw-r--r--src/nvim/testdir/unix.vim6
-rw-r--r--src/nvim/testdir/view_util.vim51
-rw-r--r--src/nvim/tui/input.c126
-rw-r--r--src/nvim/tui/input.h6
-rw-r--r--src/nvim/tui/terminfo.c225
-rw-r--r--src/nvim/tui/terminfo.h10
-rw-r--r--src/nvim/tui/terminfo_defs.h2276
-rw-r--r--src/nvim/tui/tui.c1859
-rw-r--r--src/nvim/tui/tui.h3
-rw-r--r--src/nvim/types.h5
-rw-r--r--src/nvim/ugrid.c81
-rw-r--r--src/nvim/ugrid.h25
-rw-r--r--src/nvim/ui.c521
-rw-r--r--src/nvim/ui.h68
-rw-r--r--src/nvim/ui_bridge.c323
-rw-r--r--src/nvim/ui_bridge.h5
-rw-r--r--src/nvim/undo.c588
-rw-r--r--src/nvim/undo.h1
-rw-r--r--src/nvim/undo_defs.h6
-rw-r--r--src/nvim/version.c2342
-rw-r--r--src/nvim/version.h10
-rw-r--r--src/nvim/vim.h287
-rw-r--r--src/nvim/viml/parser/expressions.c3095
-rw-r--r--src/nvim/viml/parser/expressions.h389
-rw-r--r--src/nvim/viml/parser/parser.c16
-rw-r--r--src/nvim/viml/parser/parser.h244
-rw-r--r--src/nvim/window.c1138
-rw-r--r--src/nvim/window.h2
-rw-r--r--src/nvim/xdiff/COPYING504
-rw-r--r--src/nvim/xdiff/README.txt16
-rw-r--r--src/nvim/xdiff/xdiff.h143
-rw-r--r--src/nvim/xdiff/xdiffi.c1043
-rw-r--r--src/nvim/xdiff/xdiffi.h64
-rw-r--r--src/nvim/xdiff/xemit.c332
-rw-r--r--src/nvim/xdiff/xemit.h36
-rw-r--r--src/nvim/xdiff/xhistogram.c386
-rw-r--r--src/nvim/xdiff/xinclude.h61
-rw-r--r--src/nvim/xdiff/xmacros.h54
-rw-r--r--src/nvim/xdiff/xpatience.c393
-rw-r--r--src/nvim/xdiff/xprepare.c483
-rw-r--r--src/nvim/xdiff/xprepare.h34
-rw-r--r--src/nvim/xdiff/xtypes.h67
-rw-r--r--src/nvim/xdiff/xutils.c425
-rw-r--r--src/nvim/xdiff/xutils.h47
-rw-r--r--test/.luacheckrc7
-rw-r--r--test/README.md327
-rw-r--r--test/benchmark/bench_re_freeze_spec.lua25
-rw-r--r--test/config/paths.lua.in12
-rw-r--r--test/functional/api/buffer_spec.lua299
-rw-r--r--test/functional/api/buffer_updates_spec.lua838
-rw-r--r--test/functional/api/command_spec.lua80
-rw-r--r--test/functional/api/highlight_spec.lua112
-rw-r--r--test/functional/api/keymap_spec.lua310
-rw-r--r--test/functional/api/menu_spec.lua8
-rw-r--r--test/functional/api/proc_spec.lua81
-rw-r--r--test/functional/api/rpc_fixture.lua38
-rw-r--r--test/functional/api/server_notifications_spec.lua30
-rw-r--r--test/functional/api/server_requests_spec.lua255
-rw-r--r--test/functional/api/tabpage_spec.lua61
-rw-r--r--test/functional/api/ui_spec.lua37
-rw-r--r--test/functional/api/version_spec.lua223
-rw-r--r--test/functional/api/vim_spec.lua1171
-rw-r--r--test/functional/api/window_spec.lua157
-rw-r--r--test/functional/autocmd/autocmd_spec.lua31
-rw-r--r--test/functional/autocmd/bufenter_spec.lua47
-rw-r--r--test/functional/autocmd/cmdline_spec.lua224
-rw-r--r--test/functional/autocmd/dirchanged_spec.lua164
-rw-r--r--test/functional/autocmd/filetype_spec.lua16
-rw-r--r--test/functional/autocmd/tabclose_spec.lua87
-rw-r--r--test/functional/autocmd/tabnew_spec.lua7
-rw-r--r--test/functional/autocmd/tabnewentered_spec.lua12
-rw-r--r--test/functional/autocmd/termclose_spec.lua105
-rw-r--r--test/functional/autocmd/textyankpost_spec.lua30
-rw-r--r--test/functional/clipboard/clipboard_provider_spec.lua318
-rw-r--r--test/functional/cmdline/ctrl_r_spec.lua34
-rw-r--r--test/functional/cmdline/history_spec.lua (renamed from test/functional/ex_getln/history_spec.lua)8
-rw-r--r--test/functional/core/channels_spec.lua279
-rw-r--r--test/functional/core/exit_spec.lua98
-rw-r--r--test/functional/core/fileio_spec.lua68
-rw-r--r--test/functional/core/job_spec.lua881
-rw-r--r--test/functional/core/main_spec.lua131
-rw-r--r--test/functional/core/path_spec.lua56
-rw-r--r--test/functional/core/startup_spec.lua265
-rw-r--r--test/functional/eval/api_functions_spec.lua148
-rw-r--r--test/functional/eval/backtick_expansion_spec.lua50
-rw-r--r--test/functional/eval/buf_functions_spec.lua304
-rw-r--r--test/functional/eval/capture_spec.lua86
-rw-r--r--test/functional/eval/changedtick_spec.lua142
-rw-r--r--test/functional/eval/container_functions_spec.lua24
-rw-r--r--test/functional/eval/executable_spec.lua156
-rw-r--r--test/functional/eval/execute_spec.lua206
-rw-r--r--test/functional/eval/fnamemodify_spec.lua39
-rw-r--r--test/functional/eval/function_spec.lua29
-rw-r--r--test/functional/eval/getline_spec.lua39
-rw-r--r--test/functional/eval/glob_spec.lua4
-rw-r--r--test/functional/eval/has_spec.lua66
-rw-r--r--test/functional/eval/hostname_spec.lua20
-rw-r--r--test/functional/eval/input_spec.lua483
-rw-r--r--test/functional/eval/interrupt_spec.lua61
-rw-r--r--test/functional/eval/json_functions_spec.lua140
-rw-r--r--test/functional/eval/let_spec.lua45
-rw-r--r--test/functional/eval/map_functions_spec.lua159
-rw-r--r--test/functional/eval/match_functions_spec.lua158
-rw-r--r--test/functional/eval/minmax_functions_spec.lua51
-rw-r--r--test/functional/eval/modeline_spec.lua19
-rw-r--r--test/functional/eval/msgpack_functions_spec.lua199
-rw-r--r--test/functional/eval/null_spec.lua147
-rw-r--r--test/functional/eval/printf_spec.lua32
-rw-r--r--test/functional/eval/reltime_spec.lua4
-rw-r--r--test/functional/eval/server_spec.lua128
-rw-r--r--test/functional/eval/setpos_spec.lua64
-rw-r--r--test/functional/eval/sort_spec.lua56
-rw-r--r--test/functional/eval/special_vars_spec.lua25
-rw-r--r--test/functional/eval/string_spec.lua102
-rw-r--r--test/functional/eval/system_spec.lua (renamed from test/functional/shell/viml_system_spec.lua)330
-rw-r--r--test/functional/eval/timer_spec.lua133
-rw-r--r--test/functional/eval/uniq_spec.lua31
-rw-r--r--test/functional/eval/writefile_spec.lua146
-rw-r--r--test/functional/ex_cmds/append_spec.lua4
-rw-r--r--test/functional/ex_cmds/arg_spec.lua30
-rw-r--r--test/functional/ex_cmds/cd_spec.lua117
-rw-r--r--test/functional/ex_cmds/cmd_map_spec.lua844
-rw-r--r--test/functional/ex_cmds/ctrl_c_spec.lua60
-rw-r--r--test/functional/ex_cmds/debug_spec.lua110
-rw-r--r--test/functional/ex_cmds/dict_notifications_spec.lua (renamed from test/functional/dict_notifications_spec.lua)140
-rw-r--r--test/functional/ex_cmds/digraphs_spec.lua38
-rw-r--r--test/functional/ex_cmds/drop_spec.lua71
-rw-r--r--test/functional/ex_cmds/echo_spec.lua321
-rw-r--r--test/functional/ex_cmds/edit_spec.lua27
-rw-r--r--test/functional/ex_cmds/encoding_spec.lua27
-rw-r--r--test/functional/ex_cmds/file_spec.lua35
-rw-r--r--test/functional/ex_cmds/grep_spec.lua10
-rw-r--r--test/functional/ex_cmds/highlight_spec.lua43
-rw-r--r--test/functional/ex_cmds/map_spec.lua28
-rw-r--r--test/functional/ex_cmds/menu_spec.lua589
-rw-r--r--test/functional/ex_cmds/mksession_spec.lua50
-rw-r--r--test/functional/ex_cmds/mkview_spec.lua67
-rw-r--r--test/functional/ex_cmds/oldfiles_spec.lua74
-rw-r--r--test/functional/ex_cmds/print_commands_spec.lua12
-rw-r--r--test/functional/ex_cmds/profile_spec.lua4
-rw-r--r--test/functional/ex_cmds/quickfix_commands_spec.lua111
-rw-r--r--test/functional/ex_cmds/quit_spec.lua2
-rw-r--r--test/functional/ex_cmds/recover_spec.lua75
-rw-r--r--test/functional/ex_cmds/script_spec.lua75
-rw-r--r--test/functional/ex_cmds/sign_spec.lua6
-rw-r--r--test/functional/ex_cmds/swapfile_preserve_recover_spec.lua168
-rw-r--r--test/functional/ex_cmds/syntax_spec.lua17
-rw-r--r--test/functional/ex_cmds/undojoin_spec.lua38
-rw-r--r--test/functional/ex_cmds/write_spec.lua114
-rw-r--r--test/functional/ex_cmds/wundo_spec.lua15
-rw-r--r--test/functional/ex_cmds/wviminfo_spec.lua30
-rw-r--r--test/functional/fixtures/CMakeLists.txt1
-rw-r--r--test/functional/fixtures/api_level_0.mpackbin0 -> 7873 bytes
-rw-r--r--test/functional/fixtures/api_level_1.mpackbin0 -> 16695 bytes
-rw-r--r--test/functional/fixtures/api_level_2.mpackbin0 -> 16949 bytes
-rw-r--r--test/functional/fixtures/api_level_3.mpackbin0 -> 19501 bytes
-rw-r--r--test/functional/fixtures/api_level_4.mpackbin0 -> 20951 bytes
-rw-r--r--test/functional/fixtures/api_level_5.mpackbin0 -> 22271 bytes
-rw-r--r--test/functional/fixtures/autoload/health/broken.vim3
-rw-r--r--test/functional/fixtures/autoload/health/success1.vim6
-rw-r--r--test/functional/fixtures/autoload/health/success2.vim4
-rw-r--r--test/functional/fixtures/autoload/provider/clipboard.vim13
-rw-r--r--test/functional/fixtures/bigfile.txt30592
-rw-r--r--test/functional/fixtures/bigfile_oneline.txt593
-rw-r--r--test/functional/fixtures/non_executable.txt1
-rw-r--r--test/functional/fixtures/printargs-test.c12
-rw-r--r--test/functional/fixtures/shell-test.c47
-rw-r--r--test/functional/fixtures/shell_data.txtbin0 -> 50 bytes
-rw-r--r--test/functional/fixtures/tty-test.c129
-rw-r--r--test/functional/helpers.lua666
-rw-r--r--test/functional/insert/ctrl_o_spec.lua43
-rw-r--r--test/functional/insert/ctrl_r_spec.lua19
-rw-r--r--test/functional/insert/insert_spec.lua41
-rw-r--r--test/functional/job/job_spec.lua469
-rw-r--r--test/functional/legacy/002_filename_recognition_spec.lua12
-rw-r--r--test/functional/legacy/003_cindent_spec.lua1229
-rw-r--r--test/functional/legacy/004_bufenter_with_modelines_spec.lua21
-rw-r--r--test/functional/legacy/005_bufleave_delete_buffer_spec.lua28
-rw-r--r--test/functional/legacy/006_argument_list_spec.lua44
-rw-r--r--test/functional/legacy/007_ball_buffer_list_spec.lua38
-rw-r--r--test/functional/legacy/008_autocommands_spec.lua82
-rw-r--r--test/functional/legacy/009_bufleave_autocommand_spec.lua22
-rw-r--r--test/functional/legacy/010_errorformat_spec.lua156
-rw-r--r--test/functional/legacy/011_autocommands_spec.lua71
-rw-r--r--test/functional/legacy/012_directory_spec.lua90
-rw-r--r--test/functional/legacy/015_alignment_spec.lua33
-rw-r--r--test/functional/legacy/018_unset_smart_indenting_spec.lua14
-rw-r--r--test/functional/legacy/019_smarttab_expandtab_spec.lua19
-rw-r--r--test/functional/legacy/020_blockwise_visual_spec.lua13
-rw-r--r--test/functional/legacy/021_control_wi_spec.lua11
-rw-r--r--test/functional/legacy/022_line_ending_spec.lua6
-rw-r--r--test/functional/legacy/023_edit_arguments_spec.lua34
-rw-r--r--test/functional/legacy/025_jump_tag_hidden_spec.lua35
-rw-r--r--test/functional/legacy/026_execute_while_if_spec.lua6
-rw-r--r--test/functional/legacy/028_source_ctrl_v_spec.lua6
-rw-r--r--test/functional/legacy/029_join_spec.lua70
-rw-r--r--test/functional/legacy/030_fileformats_spec.lua392
-rw-r--r--test/functional/legacy/031_close_commands_spec.lua85
-rw-r--r--test/functional/legacy/033_lisp_indent_spec.lua32
-rw-r--r--test/functional/legacy/034_user_function_spec.lua22
-rw-r--r--test/functional/legacy/035_increment_and_decrement_spec.lua12
-rw-r--r--test/functional/legacy/036_regexp_character_classes_spec.lua39
-rw-r--r--test/functional/legacy/038_virtual_replace_spec.lua13
-rw-r--r--test/functional/legacy/039_visual_block_mode_commands_spec.lua26
-rw-r--r--test/functional/legacy/041_writing_and_reading_hundred_kbyte_spec.lua25
-rw-r--r--test/functional/legacy/043_magic_settings_spec.lua21
-rw-r--r--test/functional/legacy/044_099_regexp_multibyte_magic_spec.lua46
-rw-r--r--test/functional/legacy/045_folding_spec.lua260
-rw-r--r--test/functional/legacy/051_highlight_spec.lua86
-rw-r--r--test/functional/legacy/054_buffer_local_autocommands_spec.lua34
-rw-r--r--test/functional/legacy/055_list_and_dict_types_spec.lua180
-rw-r--r--test/functional/legacy/057_sort_spec.lua146
-rw-r--r--test/functional/legacy/059_utf8_spell_checking_spec.lua257
-rw-r--r--test/functional/legacy/060_exists_and_has_functions_spec.lua42
-rw-r--r--test/functional/legacy/061_undo_tree_spec.lua56
-rw-r--r--test/functional/legacy/062_tab_pages_spec.lua85
-rw-r--r--test/functional/legacy/063_match_and_matchadd_spec.lua105
-rw-r--r--test/functional/legacy/065_float_and_logic_operators_spec.lua16
-rw-r--r--test/functional/legacy/066_visual_block_tab_spec.lua20
-rw-r--r--test/functional/legacy/067_augroup_exists_spec.lua44
-rw-r--r--test/functional/legacy/068_text_formatting_spec.lua155
-rw-r--r--test/functional/legacy/069_multibyte_formatting_spec.lua340
-rw-r--r--test/functional/legacy/072_undo_file_spec.lua48
-rw-r--r--test/functional/legacy/074_global_var_in_viminfo_spec.lua30
-rw-r--r--test/functional/legacy/075_maparg_spec.lua46
-rw-r--r--test/functional/legacy/076_completefunc_spec.lua68
-rw-r--r--test/functional/legacy/077_mf_hash_grow_spec.lua21
-rw-r--r--test/functional/legacy/078_swapfile_recover_spec.lua16
-rw-r--r--test/functional/legacy/080_substitute_spec.lua32
-rw-r--r--test/functional/legacy/081_coptions_movement_spec.lua9
-rw-r--r--test/functional/legacy/082_string_comparison_spec.lua14
-rw-r--r--test/functional/legacy/084_curswant_spec.lua5
-rw-r--r--test/functional/legacy/088_conceal_tabs_spec.lua21
-rw-r--r--test/functional/legacy/089_number_relnumber_findfile_spec.lua116
-rw-r--r--test/functional/legacy/091_context_variables_spec.lua20
-rw-r--r--test/functional/legacy/092_mksession_cursor_cols_utf8_spec.lua23
-rw-r--r--test/functional/legacy/093_mksession_cursor_cols_latin1_spec.lua23
-rw-r--r--test/functional/legacy/094_visual_mode_operators_spec.lua87
-rw-r--r--test/functional/legacy/096_location_list_spec.lua150
-rw-r--r--test/functional/legacy/097_glob_path_spec.lua88
-rw-r--r--test/functional/legacy/101_hlsearch_spec.lua76
-rw-r--r--test/functional/legacy/102_fnameescape_spec.lua12
-rw-r--r--test/functional/legacy/103_visual_mode_reset_spec.lua4
-rw-r--r--test/functional/legacy/104_let_assignment_spec.lua6
-rw-r--r--test/functional/legacy/106_errorformat_spec.lua20
-rw-r--r--test/functional/legacy/107_adjust_window_and_contents_spec.lua60
-rw-r--r--test/functional/legacy/108_backtrace_debug_commands_spec.lua92
-rw-r--r--test/functional/legacy/arglist_spec.lua252
-rw-r--r--test/functional/legacy/assert_spec.lua116
-rw-r--r--test/functional/legacy/autochdir_spec.lua26
-rw-r--r--test/functional/legacy/autocmd_option_spec.lua74
-rw-r--r--test/functional/legacy/autoformat_join_spec.lua15
-rw-r--r--test/functional/legacy/breakindent_spec.lua257
-rw-r--r--test/functional/legacy/changelist_spec.lua10
-rw-r--r--test/functional/legacy/charsearch_spec.lua18
-rw-r--r--test/functional/legacy/close_count_spec.lua199
-rw-r--r--test/functional/legacy/command_count_spec.lua69
-rw-r--r--test/functional/legacy/comparators_spec.lua4
-rw-r--r--test/functional/legacy/delete_spec.lua52
-rw-r--r--test/functional/legacy/edit_spec.lua25
-rw-r--r--test/functional/legacy/erasebackword_spec.lua1
-rw-r--r--test/functional/legacy/eval_spec.lua362
-rw-r--r--test/functional/legacy/file_perm_spec.lua6
-rw-r--r--test/functional/legacy/fixeol_spec.lua51
-rw-r--r--test/functional/legacy/fnamemodify_spec.lua20
-rw-r--r--test/functional/legacy/function_sort_spec.lua26
-rw-r--r--test/functional/legacy/getcwd_spec.lua46
-rw-r--r--test/functional/legacy/glob2regpat_spec.lua9
-rw-r--r--test/functional/legacy/increment_spec.lua21
-rw-r--r--test/functional/legacy/insertcount_spec.lua4
-rw-r--r--test/functional/legacy/join_spec.lua14
-rw-r--r--test/functional/legacy/lispwords_spec.lua4
-rw-r--r--test/functional/legacy/listchars_spec.lua42
-rw-r--r--test/functional/legacy/listlbr_spec.lua205
-rw-r--r--test/functional/legacy/listlbr_utf8_spec.lua40
-rw-r--r--test/functional/legacy/mapping_spec.lua62
-rw-r--r--test/functional/legacy/marks_spec.lua13
-rw-r--r--test/functional/legacy/match_conceal_spec.lua228
-rw-r--r--test/functional/legacy/nested_function_spec.lua4
-rw-r--r--test/functional/legacy/options_spec.lua2
-rw-r--r--test/functional/legacy/packadd_spec.lua214
-rw-r--r--test/functional/legacy/quickfix_spec.lua342
-rw-r--r--test/functional/legacy/search_mbyte_spec.lua15
-rw-r--r--test/functional/legacy/search_spec.lua593
-rw-r--r--test/functional/legacy/searchpos_spec.lua4
-rw-r--r--test/functional/legacy/set_spec.lua18
-rw-r--r--test/functional/legacy/signs_spec.lua14
-rw-r--r--test/functional/legacy/tagcase_spec.lua6
-rw-r--r--test/functional/legacy/textobjects_spec.lua10
-rw-r--r--test/functional/legacy/undolevels_spec.lua6
-rw-r--r--test/functional/legacy/utf8_spec.lua19
-rw-r--r--test/functional/legacy/wordcount_spec.lua85
-rw-r--r--test/functional/legacy/writefile_spec.lua23
-rw-r--r--test/functional/lua/api_spec.lua204
-rw-r--r--test/functional/lua/commands_spec.lua164
-rw-r--r--test/functional/lua/luaeval_spec.lua255
-rw-r--r--test/functional/lua/overrides_spec.lua302
-rw-r--r--test/functional/lua/utility_functions_spec.lua207
-rw-r--r--test/functional/normal/K_spec.lua2
-rw-r--r--test/functional/normal/count_spec.lua39
-rw-r--r--test/functional/normal/fold_spec.lua362
-rw-r--r--test/functional/normal/lang_spec.lua63
-rw-r--r--test/functional/normal/langmap_spec.lua280
-rw-r--r--test/functional/normal/macro_spec.lua30
-rw-r--r--test/functional/normal/put_spec.lua937
-rw-r--r--test/functional/normal/undo_spec.lua61
-rw-r--r--test/functional/options/autochdir_spec.lua3
-rw-r--r--test/functional/options/defaults_spec.lua706
-rw-r--r--test/functional/options/fillchars_spec.lua73
-rw-r--r--test/functional/options/keymap_spec.lua233
-rw-r--r--test/functional/options/num_options_spec.lua110
-rw-r--r--test/functional/options/pastetoggle_spec.lua40
-rw-r--r--test/functional/options/shortmess_spec.lua97
-rw-r--r--test/functional/options/tabstop_spec.lua23
-rw-r--r--test/functional/plugin/health_spec.lua154
-rw-r--r--test/functional/plugin/helpers.lua8
-rw-r--r--test/functional/plugin/man_spec.lua135
-rw-r--r--test/functional/plugin/matchparen_spec.lua13
-rw-r--r--test/functional/plugin/msgpack_spec.lua26
-rw-r--r--test/functional/plugin/shada_spec.lua111
-rw-r--r--test/functional/provider/define_spec.lua4
-rw-r--r--test/functional/provider/nodejs_spec.lua55
-rw-r--r--test/functional/provider/python3_spec.lua44
-rw-r--r--test/functional/provider/python_spec.lua15
-rw-r--r--test/functional/provider/ruby_spec.lua108
-rw-r--r--test/functional/shada/buffers_spec.lua16
-rw-r--r--test/functional/shada/compatibility_spec.lua29
-rw-r--r--test/functional/shada/errors_spec.lua36
-rw-r--r--test/functional/shada/helpers.lua36
-rw-r--r--test/functional/shada/history_spec.lua129
-rw-r--r--test/functional/shada/marks_spec.lua52
-rw-r--r--test/functional/shada/merging_spec.lua292
-rw-r--r--test/functional/shada/registers_spec.lua52
-rw-r--r--test/functional/shada/shada_spec.lua41
-rw-r--r--test/functional/shada/variables_spec.lua56
-rw-r--r--test/functional/shell/bang_filter_spec.lua49
-rw-r--r--test/functional/spell/spellfile_spec.lua110
-rw-r--r--test/functional/terminal/altscreen_spec.lua14
-rw-r--r--test/functional/terminal/api_spec.lua70
-rw-r--r--test/functional/terminal/buffer_spec.lua130
-rw-r--r--test/functional/terminal/cursor_spec.lua79
-rw-r--r--test/functional/terminal/edit_spec.lua38
-rw-r--r--test/functional/terminal/ex_terminal_spec.lua219
-rw-r--r--test/functional/terminal/helpers.lua70
-rw-r--r--test/functional/terminal/highlight_spec.lua141
-rw-r--r--test/functional/terminal/mouse_spec.lua139
-rw-r--r--test/functional/terminal/scrollback_spec.lua468
-rw-r--r--test/functional/terminal/tui_spec.lua855
-rw-r--r--test/functional/terminal/window_spec.lua86
-rw-r--r--test/functional/terminal/window_split_tab_spec.lua118
-rw-r--r--test/functional/ui/bufhl_spec.lua559
-rw-r--r--test/functional/ui/cmdline_highlight_spec.lua991
-rw-r--r--test/functional/ui/cmdline_spec.lua608
-rw-r--r--test/functional/ui/cursor_spec.lua290
-rw-r--r--test/functional/ui/diff_spec.lua959
-rw-r--r--test/functional/ui/embed_spec.lua82
-rw-r--r--test/functional/ui/fold_spec.lua235
-rw-r--r--test/functional/ui/highlight_spec.lua1267
-rw-r--r--test/functional/ui/hlstate_spec.lua287
-rw-r--r--test/functional/ui/inccommand_spec.lua2574
-rw-r--r--test/functional/ui/input_spec.lua109
-rw-r--r--test/functional/ui/mode_spec.lua189
-rw-r--r--test/functional/ui/mouse_spec.lua1077
-rw-r--r--test/functional/ui/multibyte_spec.lua185
-rw-r--r--test/functional/ui/multigrid_spec.lua1524
-rw-r--r--test/functional/ui/options_spec.lua124
-rw-r--r--test/functional/ui/output_spec.lua234
-rw-r--r--test/functional/ui/popupmenu_spec.lua610
-rw-r--r--test/functional/ui/quickfix_spec.lua196
-rw-r--r--test/functional/ui/screen.lua1201
-rw-r--r--test/functional/ui/screen_basic_spec.lua961
-rw-r--r--test/functional/ui/searchhl_spec.lua456
-rw-r--r--test/functional/ui/sign_spec.lua155
-rw-r--r--test/functional/ui/spell_spec.lua49
-rw-r--r--test/functional/ui/syntax_conceal_spec.lua742
-rw-r--r--test/functional/ui/tabline_spec.lua54
-rw-r--r--test/functional/ui/wildmode_spec.lua257
-rw-r--r--test/functional/viml/completion_spec.lua802
-rw-r--r--test/functional/viml/errorlist_spec.lua30
-rw-r--r--test/functional/viml/function_spec.lua234
-rw-r--r--test/functional/viml/lang_spec.lua30
-rw-r--r--test/helpers.lua731
-rw-r--r--test/includes/CMakeLists.txt16
-rw-r--r--test/includes/pre/sys/stat.h4
-rw-r--r--test/includes/pre/uv.h (renamed from test/includes/pre/uv-errno.h)2
-rw-r--r--test/symbolic/klee/nvim/charset.c172
-rw-r--r--test/symbolic/klee/nvim/garray.c195
-rw-r--r--test/symbolic/klee/nvim/gettext.c4
-rw-r--r--test/symbolic/klee/nvim/keymap.c539
-rw-r--r--test/symbolic/klee/nvim/mbyte.c266
-rw-r--r--test/symbolic/klee/nvim/memory.c101
-rwxr-xr-xtest/symbolic/klee/run.sh102
-rw-r--r--test/symbolic/klee/viml_expressions_lexer.c105
-rw-r--r--test/symbolic/klee/viml_expressions_parser.c117
-rw-r--r--test/unit/api/helpers.lua91
-rw-r--r--test/unit/api/private_helpers_spec.lua26
-rw-r--r--test/unit/buffer_spec.lua72
-rw-r--r--test/unit/charset/vim_str2nr_spec.lua320
-rw-r--r--test/unit/eval/decode_spec.lua39
-rw-r--r--test/unit/eval/encode_spec.lua25
-rw-r--r--test/unit/eval/helpers.lua549
-rw-r--r--test/unit/eval/tricks_spec.lua29
-rw-r--r--test/unit/eval/tv_clear_spec.lua128
-rw-r--r--test/unit/eval/typval_spec.lua3137
-rw-r--r--test/unit/fileio_spec.lua33
-rw-r--r--test/unit/fixtures/multiqueue.c19
-rw-r--r--test/unit/fixtures/multiqueue.h4
-rw-r--r--test/unit/fixtures/posix.h11
-rw-r--r--test/unit/fixtures/queue.c16
-rw-r--r--test/unit/fixtures/queue.h4
-rw-r--r--test/unit/fixtures/rbuffer.c3
-rw-r--r--test/unit/formatc.lua15
-rw-r--r--test/unit/garray_spec.lua43
-rw-r--r--test/unit/helpers.lua859
-rw-r--r--test/unit/keymap_spec.lua71
-rw-r--r--test/unit/mbyte_spec.lua27
-rw-r--r--test/unit/memory_spec.lua52
-rw-r--r--test/unit/message_spec.lua60
-rw-r--r--test/unit/multiqueue_spec.lua149
-rw-r--r--test/unit/option_spec.lua52
-rw-r--r--test/unit/os/env_spec.lua163
-rw-r--r--test/unit/os/fileio_spec.lua216
-rw-r--r--test/unit/os/fs_spec.lua292
-rw-r--r--test/unit/os/shell_spec.lua139
-rw-r--r--test/unit/os/users_spec.lua19
-rw-r--r--test/unit/path_spec.lua389
-rw-r--r--test/unit/preload.lua2
-rw-r--r--test/unit/preprocess.lua165
-rw-r--r--test/unit/profile_spec.lua43
-rw-r--r--test/unit/queue_spec.lua123
-rw-r--r--test/unit/rbuffer_spec.lua100
-rw-r--r--test/unit/set.lua16
-rw-r--r--test/unit/strings_spec.lua78
-rw-r--r--test/unit/tempfile_spec.lua47
-rw-r--r--test/unit/testtest_spec.lua19
-rw-r--r--test/unit/undo_spec.lua215
-rw-r--r--test/unit/viml/expressions/lexer_spec.lua428
-rw-r--r--test/unit/viml/expressions/parser_spec.lua540
-rw-r--r--test/unit/viml/expressions/parser_tests.lua8317
-rw-r--r--test/unit/viml/helpers.lua130
-rw-r--r--third-party/CMakeLists.txt164
-rw-r--r--third-party/README.md8
-rw-r--r--third-party/cmake/BuildGettext.cmake40
-rw-r--r--third-party/cmake/BuildGperf.cmake63
-rw-r--r--third-party/cmake/BuildLibiconv.cmake31
-rw-r--r--third-party/cmake/BuildLibtermkey.cmake51
-rw-r--r--third-party/cmake/BuildLibuv.cmake42
-rw-r--r--third-party/cmake/BuildLibvterm.cmake86
-rw-r--r--third-party/cmake/BuildLua.cmake23
-rw-r--r--third-party/cmake/BuildLuajit.cmake56
-rw-r--r--third-party/cmake/BuildLuarocks.cmake112
-rw-r--r--third-party/cmake/BuildLuv.cmake34
-rw-r--r--third-party/cmake/BuildMsgpack.cmake18
-rw-r--r--third-party/cmake/BuildUnibilium.cmake71
-rw-r--r--third-party/cmake/CopyFilesGlob.cmake2
-rw-r--r--third-party/cmake/DownloadAndExtractFile.cmake2
-rw-r--r--third-party/cmake/GetBinaryDeps.cmake46
-rw-r--r--third-party/cmake/GettextCMakeLists.txt271
-rw-r--r--third-party/cmake/GperfCMakeLists.txt30
-rw-r--r--third-party/cmake/LibiconvCMakeLists.txt97
-rw-r--r--third-party/cmake/LibuvCMakeLists.txt33
-rw-r--r--third-party/cmake/Libvterm-tbl2inc_c.cmake163
-rw-r--r--third-party/cmake/LibvtermCMakeLists.txt91
-rw-r--r--third-party/cmake/PatchLuv.cmake29
-rw-r--r--third-party/cmake/TargetArch.cmake23
-rw-r--r--third-party/cmake/UnibiliumCMakeLists.txt29
-rw-r--r--third-party/cmake/libtermkeyCMakeLists.txt34
-rw-r--r--third-party/msvc-compat/unistd.h10
-rw-r--r--third-party/patches/gettext-Fix-building-with-MSVC.patch50
-rw-r--r--third-party/patches/gettext-Fix-compilation-on-a-system-without-alloca.patch28
-rw-r--r--third-party/patches/libtermkey-Add-support-for-Windows.patch170
-rw-r--r--third-party/patches/libtermkey-Fix-escape-sequences-for-MSVC.patch189
-rw-r--r--third-party/patches/libvterm-Remove-VLAs-for-MSVC.patch50
-rw-r--r--third-party/patches/luv-Add-missing-definitions-for-MinGW.patch24
-rw-r--r--third-party/patches/unibilium-Relax-checks-for-extended-capability-to-support-new-.patch865
-rw-r--r--unicode/CaseFolding.txt87
-rw-r--r--unicode/EastAsianWidth.txt193
-rw-r--r--unicode/UnicodeData.txt1800
-rw-r--r--unicode/emoji-data.txt714
2016 files changed, 310981 insertions, 199381 deletions
diff --git a/.ci/after_success.sh b/.ci/after_success.sh
deleted file mode 100755
index 580b988061..0000000000
--- a/.ci/after_success.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-set -o pipefail
-
-if [[ -n "${CI_TARGET}" ]]; then
- exit
-fi
-
-[ "$USE_GCOV" = on ] && { coveralls --gcov "$(which "${GCOV}")" --encoding iso-8859-1 || echo 'coveralls upload failed.' ; }
diff --git a/.ci/before_cache.sh b/.ci/before_cache.sh
deleted file mode 100755
index dd1fcf2bf7..0000000000
--- a/.ci/before_cache.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-set -o pipefail
-
-# Don't cache pip's log and selfcheck.
-rm -rf "${HOME}/.cache/pip/log"
-rm -f "${HOME}/.cache/pip/selfcheck.json"
-
-# Update the third-party dependency cache only if the build was successful.
-if [[ -f "${SUCCESS_MARKER}" ]]; then
- rm -rf "${HOME}/.cache/nvim-deps"
- mv "${DEPS_BUILD_DIR}" "${HOME}/.cache/nvim-deps"
- touch "${CACHE_MARKER}"
- echo "Updated third-party dependencies (timestamp: $(stat -c '%y' "${CACHE_MARKER}"))."
-fi
diff --git a/.ci/before_install.sh b/.ci/before_install.sh
deleted file mode 100755
index 1bdd89de42..0000000000
--- a/.ci/before_install.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-set -o pipefail
-
-if [[ -n "${CI_TARGET}" ]]; then
- exit
-fi
-
-if [[ "${TRAVIS_OS_NAME}" == osx ]]; then
- brew update
-fi
-
-echo "Upgrade Python 2's pip."
-pip2.7 -q install --user --upgrade pip
-
-if [[ "${TRAVIS_OS_NAME}" == osx ]]; then
- echo "Install Python 3."
- brew install python3
- echo "Upgrade Python 3's pip."
- pip3 -q install --user --upgrade pip
-else
- # TODO: Replace with upgrade when Travis gets python3-pip package.
- echo "Install pip for Python 3."
- curl -sSL https://bootstrap.pypa.io/get-pip.py -o "${HOME}/get-pip.py"
- # After this, pip in PATH will refer to Python 3's pip.
- python3.3 "${HOME}/get-pip.py" --user --upgrade
-fi
diff --git a/.ci/common/build.sh b/.ci/common/build.sh
deleted file mode 100644
index 06bdab707f..0000000000
--- a/.ci/common/build.sh
+++ /dev/null
@@ -1,80 +0,0 @@
-build_deps() {
- if [[ "${BUILD_32BIT}" == ON ]]; then
- DEPS_CMAKE_FLAGS="${DEPS_CMAKE_FLAGS} ${CMAKE_FLAGS_32BIT}"
- fi
- if [[ "${BUILD_MINGW}" == ON ]]; then
- DEPS_CMAKE_FLAGS="${DEPS_CMAKE_FLAGS} ${CMAKE_FLAGS_MINGW}"
- fi
- if [[ "${FUNCTIONALTEST}" == "functionaltest-lua" ]]; then
- DEPS_CMAKE_FLAGS="${DEPS_CMAKE_FLAGS} -DUSE_BUNDLED_LUA=ON"
- fi
-
- rm -rf "${DEPS_BUILD_DIR}"
-
- # If there is a valid cache and we're not forced to recompile,
- # use cached third-party dependencies.
- if [[ -f "${CACHE_MARKER}" ]] && [[ "${BUILD_NVIM_DEPS}" != true ]]; then
- echo "Using third-party dependencies from Travis's cache (last updated: $(stat -c '%y' "${CACHE_MARKER}"))."
-
- mkdir -p "$(dirname "${DEPS_BUILD_DIR}")"
- mv -T "${HOME}/.cache/nvim-deps" "${DEPS_BUILD_DIR}"
- else
- mkdir -p "${DEPS_BUILD_DIR}"
- fi
-
- # Even if we're using cached dependencies, run CMake and make to
- # update CMake configuration and update to newer deps versions.
- cd "${DEPS_BUILD_DIR}"
- echo "Configuring with '${DEPS_CMAKE_FLAGS}'."
- cmake ${DEPS_CMAKE_FLAGS} "${TRAVIS_BUILD_DIR}/third-party/"
-
- if ! ${MAKE_CMD}; then
- exit 1
- fi
-
- cd "${TRAVIS_BUILD_DIR}"
-}
-
-build_nvim() {
- if [[ -n "${CLANG_SANITIZER}" ]]; then
- CMAKE_FLAGS="${CMAKE_FLAGS} -DCLANG_${CLANG_SANITIZER}=ON"
- fi
- if [[ "${BUILD_32BIT}" == ON ]]; then
- CMAKE_FLAGS="${CMAKE_FLAGS} ${CMAKE_FLAGS_32BIT}"
- fi
- if [[ "${BUILD_MINGW}" == ON ]]; then
- CMAKE_FLAGS="${CMAKE_FLAGS} ${CMAKE_FLAGS_MINGW}"
- fi
-
- mkdir -p "${BUILD_DIR}"
- cd "${BUILD_DIR}"
- echo "Configuring with '${CMAKE_FLAGS}'."
- cmake ${CMAKE_FLAGS} "${TRAVIS_BUILD_DIR}"
-
- echo "Building nvim."
- if ! ${MAKE_CMD} nvim; then
- exit 1
- fi
-
- if [ "$CLANG_SANITIZER" != "TSAN" ]; then
- echo "Building libnvim."
- if ! ${MAKE_CMD} libnvim; then
- exit 1
- fi
-
- echo "Building nvim-test."
- if ! ${MAKE_CMD} nvim-test; then
- exit 1
- fi
- fi
-
- # Invoke nvim to trigger *San early.
- if ! (bin/nvim --version && bin/nvim -u NONE -e -c ':qall'); then
- asan_check "${LOG_DIR}"
- exit 1
- fi
- asan_check "${LOG_DIR}"
-
-
- cd "${TRAVIS_BUILD_DIR}"
-}
diff --git a/.ci/common/test.sh b/.ci/common/test.sh
deleted file mode 100644
index 225d88e072..0000000000
--- a/.ci/common/test.sh
+++ /dev/null
@@ -1,104 +0,0 @@
-check_core_dumps() {
- sleep 2
-
- if [[ "${TRAVIS_OS_NAME}" == osx ]]; then
- local cores="$(find /cores/ -type f -print)"
- local dbg_cmd="lldb -Q -o bt -f ${BUILD_DIR}/bin/nvim -c"
- else
- # FIXME (fwalch): Will trigger if a file named core.* exists outside of $DEPS_BUILD_DIR.
- local cores="$(find ./ -type f -not -path "*${DEPS_BUILD_DIR}*" -name 'core.*' -print)"
- local dbg_cmd="gdb -n -batch -ex bt ${BUILD_DIR}/bin/nvim"
- fi
-
- if [ -z "${cores}" ]; then
- return
- fi
- for core in $cores; do
- ${dbg_cmd} "${core}"
- done
- exit 1
-}
-
-check_logs() {
- # Iterate through each log to remove an useless warning.
- for log in $(find "${1}" -type f -name "${2}"); do
- sed -i "${log}" \
- -e '/Warning: noted but unhandled ioctl/d' \
- -e '/could cause spurious value errors to appear/d' \
- -e '/See README_MISSING_SYSCALL_OR_IOCTL for guidance/d'
- done
-
- # Now do it again, but only consider files with size > 0.
- local err=""
- for log in $(find "${1}" -type f -name "${2}" -size +0); do
- cat "${log}"
- err=1
- done
- if [[ -n "${err}" ]]; then
- echo "Runtime errors detected."
- exit 1
- fi
-}
-
-valgrind_check() {
- check_logs "${1}" "valgrind-*"
-}
-
-asan_check() {
- check_logs "${1}" "*san.*"
-}
-
-run_unittests() {
- ${MAKE_CMD} unittest
-}
-
-run_functionaltests() {
- if ! ${MAKE_CMD} ${FUNCTIONALTEST}; then
- asan_check "${LOG_DIR}"
- valgrind_check "${LOG_DIR}"
- exit 1
- fi
- asan_check "${LOG_DIR}"
- valgrind_check "${LOG_DIR}"
-}
-
-run_oldtests() {
- if ! make oldtest; then
- reset
- asan_check "${LOG_DIR}"
- valgrind_check "${LOG_DIR}"
- exit 1
- fi
- asan_check "${LOG_DIR}"
- valgrind_check "${LOG_DIR}"
-}
-
-install_nvim() {
- ${MAKE_CMD} -C "${BUILD_DIR}" install
-
- "${INSTALL_PREFIX}/bin/nvim" --version
- "${INSTALL_PREFIX}/bin/nvim" -u NONE -e -c ':help' -c ':qall' || {
- echo "Running ':help' in the installed nvim failed."
- echo "Maybe the helptags have not been generated properly."
- exit 1
- }
-
- # Check that all runtime files were installed
- for file in doc/tags syntax/vim/generated.vim $(
- cd runtime ; git ls-files | grep -e '.vim$' -e '.ps$' -e '.dict$' -e '.py$' -e '.tutor$'
- ) ; do
- if ! test -e "${INSTALL_PREFIX}/share/nvim/runtime/$file" ; then
- echo "It appears that $file is not installed."
- exit 1
- fi
- done
-
- for file in $(
- cd runtime ; git ls-files | grep -e '.awk$' -e '.sh$' -e '.bat$'
- ) ; do
- if ! test -x "${INSTALL_PREFIX}/share/nvim/runtime/$file" ; then
- echo "It appears that $file is not installed or is not executable."
- exit 1
- fi
- done
-}
diff --git a/.ci/install.sh b/.ci/install.sh
deleted file mode 100755
index cb2362a70e..0000000000
--- a/.ci/install.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-set -o pipefail
-
-if [[ -n "${CI_TARGET}" ]]; then
- exit
-fi
-
-if [[ "${TRAVIS_OS_NAME}" == osx ]]; then
- brew install gettext
-elif [[ "${BUILD_MINGW}" == ON ]]; then
- # TODO: When Travis gets a recent version of Mingw-w64 use packages:
- # binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 mingw-w64-dev mingw-w64-tools
-
- echo "Downloading MinGW..."
- curl -sSL "https://github.com/neovim/deps/raw/master/opt/i686-w64-mingw32-gcc-4.8.0-linux64_rubenvb.tar.xz" \
- | tar xJf - -C "${HOME}/.local"
-
-fi
-
-# Use default CC to avoid compilation problems when installing Python modules.
-echo "Install neovim module and coveralls for Python 2."
-CC=cc pip2.7 -q install --user --upgrade neovim cpp-coveralls
-
-echo "Install neovim module for Python 3."
-if [[ "${TRAVIS_OS_NAME}" == osx ]]; then
- CC=cc pip3 -q install --user --upgrade neovim
-else
- CC=cc pip3.3 -q install --user --upgrade neovim
-fi
diff --git a/.ci/run_tests.sh b/.ci/run_tests.sh
deleted file mode 100755
index 656ea16e37..0000000000
--- a/.ci/run_tests.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-set -o pipefail
-
-# TODO: Stop here for MinGW builds,
-# building Neovim doesn't work yet.
-if [[ "${BUILD_MINGW}" == ON ]]; then
- echo "Neovim doesn't build on MinGW yet; stopping build."
- touch "${SUCCESS_MARKER}"
- exit
-fi
-
-CI_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-source "${CI_DIR}/common/build.sh"
-source "${CI_DIR}/common/test.sh"
-
-build_nvim
-
-if [ "$CLANG_SANITIZER" != "TSAN" ]; then
- # Additional threads are only created when the builtin UI starts, which
- # doesn't happen in the unit/functional tests
- run_unittests
- run_functionaltests
-fi
-run_oldtests
-
-install_nvim
-
-touch "${SUCCESS_MARKER}"
diff --git a/src/.clang-format b/.clang-format
index 5a910ff34b..ff61915aac 100644
--- a/src/.clang-format
+++ b/.clang-format
@@ -8,6 +8,7 @@ IndentCaseLabels: true
BreakBeforeBraces: Linux
AlignEscapedNewlinesLeft: false
AllowShortFunctionsOnASingleLine: false
+AlignTrailingComments: true
SpacesBeforeTrailingComments: 2
PenaltyReturnTypeOnItsOwnLine: 200
AllowAllParametersOfDeclarationOnNextLine: false
@@ -15,4 +16,5 @@ AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
BinPackParameters: false
BreakBeforeBinaryOperators: true
+BreakBeforeTernaryOperators: true
ContinuationIndentWidth: 4
diff --git a/.editorconfig b/.editorconfig
index b08a27f2a2..bb6a1423ef 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -3,10 +3,11 @@ root = true
[*]
indent_style = space
indent_size = 2
+tab_width = 8
end_of_line = lf
insert_final_newline = true
-charset = utf_8
+charset = utf-8
-[Makefile]
+[{Makefile,**/Makefile,runtime/doc/*.txt}]
indent_style = tab
-tab_width = 4
+indent_size = 8
diff --git a/.gitignore b/.gitignore
index 766c323c34..cf0a11804d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,11 +1,15 @@
+# Tools
+.ropeproject/
+# Visual Studio
+/.vs/
+
# Build/deps dir
/build/
+/cmake-build-debug/
/dist/
/.deps/
/tmp/
-*.rej
-*.orig
*.mo
.*.sw?
*~
@@ -18,12 +22,16 @@ tags
/src/nvim/po/vim.pot
/src/nvim/po/*.ck
-# Files generated by scripts/vim-patch.sh
+# Generated by tests with $NVIM_LOG_FILE set.
+/.nvimlog
+
+# Generated by scripts/vim-patch.sh
/.vim-src/
-# Files generated by the tests
+# Generated by old (Vim) tests.
/src/nvim/testdir/del
/src/nvim/testdir/test*.out
+/src/nvim/testdir/test*.res
/src/nvim/testdir/test.log
/src/nvim/testdir/messages
/src/nvim/testdir/viminfo
@@ -33,15 +41,12 @@ tags
/src/nvim/testdir/valgrind.*
/src/nvim/testdir/.gdbinit
-# Folder generated by the unit tests
+# Generated by unit tests.
/test/includes/post/
-# generated by luacheck during `make testlint'
+# Generated by luacheck during `make testlint'
/test/.luacheckcache
-# luarocks, not added as a subtree because of the large number of blobs
-/third-party/luarocks
-
# local make targets
local.mk
@@ -49,6 +54,3 @@ local.mk
/runtime/doc/*.html
/runtime/doc/tags.ref
/runtime/doc/errors.log
-
-# clint errors, generated by `make lint`
-/errors.json
diff --git a/.travis.yml b/.travis.yml
index 8334b03cdf..e6b9516b6e 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,17 +1,11 @@
-sudo: false
+dist: xenial
+
language: c
env:
global:
- # To force rebuilding of third-party dependencies, set this to 'true'.
- - BUILD_NVIM_DEPS=false
- # Travis has 1.5 virtual cores according to
- # http://docs.travis-ci.com/user/speeding-up-the-build/#Paralellizing-your-build-on-one-VM
- - MAKE_CMD="make -j2"
- # Update PATH for pip and MinGW.
- - PATH="$(python2.7 -c 'import site; print(site.getuserbase())')/bin:$HOME/.local/mingw32/bin:$PATH"
- # LLVM symbolizer path.
- - LLVM_SYMBOLIZER="$(which llvm-symbolizer-3.4)"
+ # Set "false" to force rebuild of third-party dependencies.
+ - CACHE_ENABLE=true
# Build directory for Neovim.
- BUILD_DIR="$TRAVIS_BUILD_DIR/build"
# Build directory for third-party dependencies.
@@ -22,110 +16,126 @@ env:
- INSTALL_PREFIX="$HOME/nvim-install"
# Log directory for Clang sanitizers and Valgrind.
- LOG_DIR="$BUILD_DIR/log"
+ # Nvim log file.
+ - NVIM_LOG_FILE="$BUILD_DIR/.nvimlog"
# Default CMake flags.
- CMAKE_FLAGS="-DTRAVIS_CI_BUILD=ON
-DCMAKE_BUILD_TYPE=Debug
-DCMAKE_INSTALL_PREFIX:PATH=$INSTALL_PREFIX
- -DBUSTED_OUTPUT_TYPE=gtest
+ -DBUSTED_OUTPUT_TYPE=nvim
-DDEPS_PREFIX=$DEPS_BUILD_DIR/usr
- -DMIN_LOG_LEVEL=0"
- - DEPS_CMAKE_FLAGS="-DDEPS_DOWNLOAD_DIR:PATH=$DEPS_DOWNLOAD_DIR"
+ -DMIN_LOG_LEVEL=3"
+ - DEPS_CMAKE_FLAGS="-DDEPS_DOWNLOAD_DIR:PATH=$DEPS_DOWNLOAD_DIR -DUSE_BUNDLED_GPERF=OFF"
# Additional CMake flags for 32-bit builds.
- CMAKE_FLAGS_32BIT="-DCMAKE_SYSTEM_LIBRARY_PATH=/lib32:/usr/lib32:/usr/local/lib32
-DCMAKE_IGNORE_PATH=/lib:/usr/lib:/usr/local/lib
-DCMAKE_TOOLCHAIN_FILE=$TRAVIS_BUILD_DIR/cmake/i386-linux-gnu.toolchain.cmake"
- # Additional CMake flags for MinGW builds.
- - CMAKE_FLAGS_MINGW="-DCMAKE_TOOLCHAIN_FILE=$TRAVIS_BUILD_DIR/cmake/mingw32-w64-cross-travis.toolchain.cmake"
# Environment variables for Clang sanitizers.
- ASAN_OPTIONS="detect_leaks=1:check_initialization_order=1:log_path=$LOG_DIR/asan"
- - ASAN_SYMBOLIZER_PATH="$LLVM_SYMBOLIZER"
- - TSAN_OPTIONS="external_symbolizer_path=$LLVM_SYMBOLIZER log_path=$LOG_DIR/tsan"
- - UBSAN_OPTIONS="log_path=$LOG_DIR/ubsan"
+ - TSAN_OPTIONS="log_path=$LOG_DIR/tsan"
+ - UBSAN_OPTIONS="print_stacktrace=1 log_path=$LOG_DIR/ubsan"
+ - ASAN_SYMBOLIZE=asan_symbolize
# Environment variables for Valgrind.
- VALGRIND_LOG="$LOG_DIR/valgrind-%p.log"
- # Cache marker for third-party dependencies cache.
- # If this file exists, we know that the cache contains compiled
- # dependencies and we can use it.
+ # If this file exists, the cache is valid (compile was successful).
- CACHE_MARKER="$HOME/.cache/nvim-deps/.travis_cache_marker"
- # Test success marker. If this file exists, we know that all tests
- # were successful. Required because we only want to update the cache
- # if the tests were successful, but don't have this information
- # available in before_cache (which is run before after_success).
- - SUCCESS_MARKER="$BUILD_DIR/.tests_successful"
# default target name for functional tests
- FUNCTIONALTEST=functionaltest
+ - CI_TARGET=tests
+ # Environment variables for ccache
+ - CCACHE_COMPRESS=1
+ - CCACHE_SLOPPINESS=time_macros,file_macro
+ - CCACHE_BASEDIR="$TRAVIS_BUILD_DIR"
-matrix:
+jobs:
include:
+ - stage: normal builds
+ os: linux
+ compiler: clang-4.0
+ # Use Lua so that ASAN can test our embedded Lua support. 8fec4d53d0f6
+ env: >
+ CLANG_SANITIZER=ASAN_UBSAN
+ CMAKE_FLAGS="$CMAKE_FLAGS -DPREFER_LUA=ON"
+ ASAN_SYMBOLIZE=asan_symbolize-4.0
- os: linux
- env: CI_TARGET=lint
- - os: linux
- compiler: gcc-5
- - os: linux
- compiler: gcc-5
- env: FUNCTIONALTEST=functionaltest-lua
+ compiler: gcc
+ env: >
+ FUNCTIONALTEST=functionaltest-lua
+ CMAKE_FLAGS="$CMAKE_FLAGS -DPREFER_LUA=ON"
+ DEPS_CMAKE_FLAGS="$DEPS_CMAKE_FLAGS -DUSE_BUNDLED_LUAJIT=OFF"
- os: linux
- # Travis creates a cache per compiler.
- # Set a different value here to store 32-bit
- # dependencies in a separate cache.
- compiler: gcc-5 -m32
+ # Travis creates a cache per compiler. Set a different value here to
+ # store 32-bit dependencies in a separate cache.
+ compiler: gcc
env: BUILD_32BIT=ON
- - os: linux
- compiler: clang
- env: GCOV=llvm-cov CLANG_SANITIZER=ASAN_UBSAN CMAKE_FLAGS="$CMAKE_FLAGS -DUSE_GCOV=ON"
- - os: linux
- compiler: clang
- env: CLANG_SANITIZER=TSAN
- os: osx
compiler: clang
+ osx_image: xcode9.4 # macOS 10.13
- os: osx
- compiler: gcc-4.9
+ compiler: gcc
+ osx_image: xcode9.4 # macOS 10.13
+ - if: branch = master
+ os: linux
+ env: CI_TARGET=lint
+ - stage: Flaky builds
+ os: linux
+ compiler: gcc
+ env: GCOV=gcov CMAKE_FLAGS="$CMAKE_FLAGS -DUSE_GCOV=ON"
- os: linux
- env: BUILD_MINGW=ON
+ compiler: clang
+ env: CLANG_SANITIZER=TSAN
+ allow_failures:
+ - env: GCOV=gcov CMAKE_FLAGS="$CMAKE_FLAGS -DUSE_GCOV=ON"
+ - env: CLANG_SANITIZER=TSAN
fast_finish: true
-before_install: .ci/before_install.sh
-install: .ci/install.sh
-before_script: .ci/before_script.sh
-script: .ci/script.sh
-before_cache: .ci/before_cache.sh
-after_success: .ci/after_success.sh
+before_install: ci/before_install.sh
+install: ci/install.sh
+before_script: ci/before_script.sh
+script: ci/script.sh
+before_cache: ci/before_cache.sh
addons:
apt:
- sources:
- # TODO: Remove PPA when Travis gets Python >=3.3.
- - deadsnakes
- - ubuntu-toolchain-r-test
packages:
+ - apport
- autoconf
- automake
- build-essential
- - clang-3.4
+ - clang-4.0
- cmake
- - g++-5-multilib
+ - cscope
- g++-multilib
- - gcc-5-multilib
- gcc-multilib
- gdb
+ - gperf
+ - language-pack-tr
- libc6-dev-i386
- - libtool
- - llvm-3.4-dev
+ - libtool-bin
+ - locales
+ - ninja-build
- pkg-config
- - python3.3-dev
- unzip
- valgrind
- xclip
+ homebrew:
+ update: true
+ packages:
+ - ccache
+ - ninja
branches:
- except:
- - nightly
+ only:
+ - master
+ - /^release-\d+\.\d+$/
cache:
apt: true
+ ccache: true
directories:
- "$HOME/.cache/pip"
- "$HOME/.cache/nvim-deps"
+ - "$HOME/.cache/nvim-deps-downloads"
notifications:
webhooks:
diff --git a/BSDmakefile b/BSDmakefile
new file mode 100644
index 0000000000..93b7dc7f3d
--- /dev/null
+++ b/BSDmakefile
@@ -0,0 +1,4 @@
+.DONE:
+ @echo "Please use GNU Make (gmake) to build neovim"
+.DEFAULT:
+ @echo "Please use GNU Make (gmake) to build neovim"
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0b3e6ec85e..8272a1a469 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,15 +1,58 @@
-cmake_minimum_required(VERSION 2.8.7)
-project(nvim)
+# CMAKE REFERENCE
+# intro: https://codingnest.com/basic-cmake/
+# best practices (3.0+): https://gist.github.com/mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1
+
+cmake_minimum_required(VERSION 2.8.12)
+project(nvim C)
if(POLICY CMP0059)
- cmake_policy(SET CMP0059 OLD) # Needed until cmake 2.8.12. #4389
+ # Needed for use of DEFINITIONS variable, which is used to collect the
+ # compilation flags for reporting in "nvim --version"
+ # https://github.com/neovim/neovim/pull/8558#issuecomment-398033140
+ cmake_policy(SET CMP0059 OLD)
endif()
# Point CMake at any custom modules we may ship
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
+# We don't support building in-tree.
+include(PreventInTreeBuilds)
+
+set_property(GLOBAL PROPERTY USE_FOLDERS ON)
+
# Prefer our bundled versions of dependencies.
-set(DEPS_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/.deps/usr" CACHE PATH "Path prefix for finding dependencies")
+if(DEFINED ENV{DEPS_BUILD_DIR})
+ set(DEPS_PREFIX "$ENV{DEPS_BUILD_DIR}/usr" CACHE PATH "Path prefix for finding dependencies")
+else()
+ set(DEPS_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/.deps/usr" CACHE PATH "Path prefix for finding dependencies")
+ # When running from within CLion or Visual Studio,
+ # build bundled dependencies automatically.
+ if(NOT EXISTS ${DEPS_PREFIX}
+ AND (DEFINED ENV{CLION_IDE}
+ OR DEFINED ENV{VisualStudioEdition}))
+ message(STATUS "Building dependencies...")
+ set(DEPS_BUILD_DIR ${PROJECT_BINARY_DIR}/.deps)
+ file(MAKE_DIRECTORY ${DEPS_BUILD_DIR})
+ execute_process(
+ COMMAND ${CMAKE_COMMAND} -G ${CMAKE_GENERATOR}
+ -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
+ -DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG}
+ -DCMAKE_C_FLAGS_MINSIZEREL=${CMAKE_C_FLAGS_MINSIZEREL}
+ -DCMAKE_C_FLAGS_RELWITHDEBINFO=${CMAKE_C_FLAGS_RELWITHDEBINFO}
+ -DCMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE}
+ -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
+ ${PROJECT_SOURCE_DIR}/third-party
+ WORKING_DIRECTORY ${DEPS_BUILD_DIR})
+ execute_process(
+ COMMAND ${CMAKE_COMMAND} --build ${DEPS_BUILD_DIR}
+ --config ${CMAKE_BUILD_TYPE})
+ set(DEPS_PREFIX ${DEPS_BUILD_DIR}/usr)
+ endif()
+endif()
+
if(CMAKE_CROSSCOMPILING AND NOT UNIX)
list(INSERT CMAKE_FIND_ROOT_PATH 0 ${DEPS_PREFIX})
list(INSERT CMAKE_PREFIX_PATH 0 ${DEPS_PREFIX}/../host/bin)
@@ -36,32 +79,47 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
if(CMAKE_COMPILER_IS_GNUCC)
set(CMAKE_INCLUDE_SYSTEM_FLAG_C "-isystem ")
endif()
- if(CMAKE_COMPILER_IS_GNUCXX)
- set(CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-isystem ")
- endif()
+endif()
- # Enable fixing case-insensitive filenames for Mac.
+if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+ # Enable fixing case-insensitive filenames for Windows and Mac.
set(USE_FNAME_CASE TRUE)
endif()
+option(ENABLE_LIBINTL "enable libintl" ON)
+option(ENABLE_LIBICONV "enable libiconv" ON)
+if (MINGW)
+ # Disable LTO by default as it may not compile
+ # See https://github.com/Alexpux/MINGW-packages/issues/3516
+ # and https://github.com/neovim/neovim/pull/8654#issuecomment-402316672
+ option(ENABLE_LTO "enable link time optimization" OFF)
+else()
+ option(ENABLE_LTO "enable link time optimization" ON)
+endif()
+
# Set default build type.
if(NOT CMAKE_BUILD_TYPE)
- message(STATUS "CMAKE_BUILD_TYPE not given, defaulting to 'Dev'.")
- set(CMAKE_BUILD_TYPE "Dev" CACHE STRING "Choose the type of build." FORCE)
+ message(STATUS "CMAKE_BUILD_TYPE not given, defaulting to 'Debug'")
+ set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build" FORCE)
endif()
# Set available build types for CMake GUIs.
# A different build type can still be set by -DCMAKE_BUILD_TYPE=...
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY
- STRINGS "Debug" "Dev" "Release" "MinSizeRel" "RelWithDebInfo")
+ STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
# If not in a git repo (e.g., a tarball) these tokens define the complete
-# version string, else it is combined with the result of `git describe`.
+# version string, else they are combined with the result of `git describe`.
set(NVIM_VERSION_MAJOR 0)
-set(NVIM_VERSION_MINOR 1)
-set(NVIM_VERSION_PATCH 5)
+set(NVIM_VERSION_MINOR 4)
+set(NVIM_VERSION_PATCH 0)
set(NVIM_VERSION_PRERELEASE "-dev") # for package maintainers
+# API level
+set(NVIM_API_LEVEL 6) # Bump this after any API change.
+set(NVIM_API_LEVEL_COMPAT 0) # Adjust this after a _breaking_ API change.
+set(NVIM_API_PRERELEASE true)
+
file(TO_CMAKE_PATH ${CMAKE_CURRENT_LIST_DIR}/.git FORCED_GIT_DIR)
include(GetGitRevisionDescription)
get_git_head_revision(GIT_REFSPEC NVIM_VERSION_COMMIT)
@@ -82,69 +140,46 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Default to -O2 on release builds.
if(CMAKE_C_FLAGS_RELEASE MATCHES "-O3")
- message(STATUS "Replacing -O3 in CMAKE_C_FLAGS_RELEASE with -O2.")
+ message(STATUS "Replacing -O3 in CMAKE_C_FLAGS_RELEASE with -O2")
string(REPLACE "-O3" "-O2" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
endif()
-# Disable logging for release-type builds.
-if(NOT CMAKE_C_FLAGS_RELEASE MATCHES DDISABLE_LOG)
- set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DDISABLE_LOG")
-endif()
-if(NOT CMAKE_C_FLAGS_MINSIZEREL MATCHES DDISABLE_LOG)
- set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DDISABLE_LOG")
+# Minimize logging for release-type builds.
+if(NOT CMAKE_C_FLAGS_RELEASE MATCHES DMIN_LOG_LEVEL)
+ set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DMIN_LOG_LEVEL=3")
endif()
-if(NOT CMAKE_C_FLAGS_RELWITHDEBINFO MATCHES DDISABLE_LOG)
- set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -DDISABLE_LOG")
+if(NOT CMAKE_C_FLAGS_MINSIZEREL MATCHES DMIN_LOG_LEVEL)
+ set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DMIN_LOG_LEVEL=3")
endif()
-
-# Enable assertions for RelWithDebInfo.
-if(CMAKE_C_FLAGS_RELWITHDEBINFO MATCHES DNDEBUG)
- string(REPLACE "-DNDEBUG" "" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
+if(NOT CMAKE_C_FLAGS_RELWITHDEBINFO MATCHES DMIN_LOG_LEVEL)
+ set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -DMIN_LOG_LEVEL=3")
endif()
-# Set build flags for custom Dev build type.
-# -DNDEBUG purposely omitted because we want assertions.
-if(MSVC)
- SET(CMAKE_C_FLAGS_DEV ""
- CACHE STRING "Flags used by the compiler during development (optimized, but with debug info and logging) builds."
- FORCE)
+if(CMAKE_COMPILER_IS_GNUCC)
+ check_c_compiler_flag(-Og HAS_OG_FLAG)
else()
- if(CMAKE_COMPILER_IS_GNUCC)
- check_c_compiler_flag(-Og HAS_OG_FLAG)
- else()
- set(HAS_OG_FLAG 0)
- endif()
-
- if(HAS_OG_FLAG)
- set(CMAKE_C_FLAGS_DEV "-Og -g"
- CACHE STRING "Flags used by the compiler during development (optimized, but with debug info and logging) builds."
- FORCE)
- else()
- set(CMAKE_C_FLAGS_DEV "-O2 -g"
- CACHE STRING "Flags used by the compiler during development (optimized, but with debug info and logging) builds."
- FORCE)
- endif()
+ set(HAS_OG_FLAG 0)
endif()
-SET(CMAKE_EXE_LINKER_FLAGS_DEV ""
- CACHE STRING "Flags used for linking binaries during development (optimized, but with debug info and logging) builds."
- FORCE)
-SET(CMAKE_SHARED_LINKER_FLAGS_DEV ""
- CACHE STRING "Flags used by the shared libraries linker during development (optimized, but with debug info and logging) builds."
- FORCE)
-MARK_AS_ADVANCED(
- CMAKE_C_FLAGS_DEV
- CMAKE_EXE_LINKER_FLAGS_DEV
- CMAKE_SHARED_LINKER_FLAGS_DEV)
+#
+# Build-type: RelWithDebInfo
+#
+if(HAS_OG_FLAG)
+ set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -Og -g")
+endif()
+# We _want_ assertions in RelWithDebInfo build-type.
+if(CMAKE_C_FLAGS_RELWITHDEBINFO MATCHES DNDEBUG)
+ string(REPLACE "-DNDEBUG" "" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
+endif()
# Enable -Wconversion.
if(NOT MSVC)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wconversion")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow -Wconversion")
endif()
-# gcc 4.0 and better turn on _FORTIFY_SOURCE=2 automatically. This currently
+# gcc 4.0+ sets _FORTIFY_SOURCE=2 automatically. This currently
# does not work with Neovim due to some uses of dynamically-sized structures.
-# See https://github.com/neovim/neovim/issues/223 for details.
+# https://github.com/neovim/neovim/issues/223
include(CheckCSourceCompiles)
# Include the build type's default flags in the check for _FORTIFY_SOURCE,
@@ -173,17 +208,16 @@ main(void)
" HAS_ACCEPTABLE_FORTIFY)
if(NOT HAS_ACCEPTABLE_FORTIFY)
- message(STATUS "Unsupported _FORTIFY_SOURCE found, forcing _FORTIFY_SOURCE=1.")
+ message(STATUS "Unsupported _FORTIFY_SOURCE found, forcing _FORTIFY_SOURCE=1")
# Extract possible prefix to _FORTIFY_SOURCE (e.g. -Wp,-D_FORTIFY_SOURCE).
STRING(REGEX MATCH "[^\ ]+-D_FORTIFY_SOURCE" _FORTIFY_SOURCE_PREFIX "${CMAKE_C_FLAGS}")
STRING(REPLACE "-D_FORTIFY_SOURCE" "" _FORTIFY_SOURCE_PREFIX "${_FORTIFY_SOURCE_PREFIX}" )
if(NOT _FORTIFY_SOURCE_PREFIX STREQUAL "")
- message(STATUS "Detected _FORTIFY_SOURCE Prefix=${_FORTIFY_SOURCE_PREFIX}.")
+ message(STATUS "Detected _FORTIFY_SOURCE Prefix=${_FORTIFY_SOURCE_PREFIX}")
endif()
# -U in add_definitions doesn't end up in the correct spot, so we add it to
# the flags variable instead.
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_FORTIFY_SOURCE_PREFIX}-U_FORTIFY_SOURCE ${_FORTIFY_SOURCE_PREFIX}-D_FORTIFY_SOURCE=1")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_FORTIFY_SOURCE_PREFIX}-U_FORTIFY_SOURCE ${_FORTIFY_SOURCE_PREFIX}-D_FORTIFY_SOURCE=1")
endif()
# Remove --sort-common from linker flags, as this seems to cause bugs (see #2641, #3374).
@@ -191,7 +225,7 @@ endif()
if(CMAKE_EXE_LINKER_FLAGS MATCHES "--sort-common" OR
CMAKE_SHARED_LINKER_FLAGS MATCHES "--sort-common" OR
CMAKE_MODULE_LINKER_FLAGS MATCHES "--sort-common")
- message(STATUS "Removing --sort-common from linker flags.")
+ message(STATUS "Removing --sort-common from linker flags")
string(REGEX REPLACE ",--sort-common(=[^,]+)?" "" CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
string(REGEX REPLACE ",--sort-common(=[^,]+)?" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
string(REGEX REPLACE ",--sort-common(=[^,]+)?" "" CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
@@ -204,16 +238,42 @@ if(CMAKE_EXE_LINKER_FLAGS MATCHES "--sort-common" OR
string(REGEX REPLACE "-Wl($| )" "" CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
endif()
+check_c_source_compiles("
+#include <execinfo.h>
+int main(void)
+{
+ void *trace[1];
+ int trace_size = backtrace(trace, 1);
+ return 0;
+}
+" HAVE_EXECINFO_BACKTRACE)
+
+check_c_source_compiles("
+int main(void)
+{
+ int a;
+ __builtin_add_overflow(a, a, &a);
+ __builtin_sub_overflow(a, a, &a);
+ return 0;
+}
+" HAVE_BUILTIN_ADD_OVERFLOW)
+
if(MSVC)
# XXX: /W4 gives too many warnings. #3241
add_definitions(/W3 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE)
+ add_definitions(-DWIN32)
else()
add_definitions(-Wall -Wextra -pedantic -Wno-unused-parameter
-Wstrict-prototypes -std=gnu99)
+ check_c_compiler_flag(-Wimplicit-fallthrough HAS_WIMPLICIT_FALLTHROUGH_FLAG)
+ if(HAS_WIMPLICIT_FALLTHROUGH_FLAG)
+ add_definitions(-Wimplicit-fallthrough)
+ endif()
+
# On FreeBSD 64 math.h uses unguarded C11 extension, which taints clang
# 3.4.1 used there.
- if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
+ if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" AND CMAKE_C_COMPILER_ID MATCHES "Clang")
add_definitions(-Wno-c11-extensions)
endif()
endif()
@@ -221,6 +281,9 @@ endif()
if(MINGW)
# Use POSIX compatible stdio in Mingw
add_definitions(-D__USE_MINGW_ANSI_STDIO)
+endif()
+if(WIN32)
+ # Windows Vista is the minimum supported version
add_definitions(-D_WIN32_WINNT=0x0600)
endif()
@@ -247,12 +310,27 @@ if(HAS_DIAG_COLOR_FLAG)
add_definitions(-fdiagnostics-color=auto)
endif()
-option(
- TRAVIS_CI_BUILD "Travis CI build. Extra compilation flags will be set." OFF)
+if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
+ # 1. Array-bounds testing is broken in some GCC versions before 4.8.5.
+ # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56273
+ # 2. But _Pragma("...ignored") is broken (unresolved) in GCC 5+:
+ # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66099
+ # So we must disable -Warray-bounds globally for GCC (for kbtree.h, #7083).
+ check_c_compiler_flag(-Wno-array-bounds HAS_NO_ARRAY_BOUNDS_FLAG)
+ if(HAS_NO_ARRAY_BOUNDS_FLAG)
+ add_definitions(-Wno-array-bounds)
+ endif()
+endif()
+
+option(TRAVIS_CI_BUILD "Travis/QuickBuild CI, extra flags will be set" OFF)
if(TRAVIS_CI_BUILD)
- message(STATUS "Travis CI build enabled.")
+ message(STATUS "Travis/QuickBuild CI build enabled")
add_definitions(-Werror)
+ if(DEFINED ENV{BUILD_32BIT})
+ # Get some test coverage for unsigned char
+ add_definitions(-funsigned-char)
+ endif()
endif()
if(CMAKE_BUILD_TYPE MATCHES Debug)
@@ -261,23 +339,25 @@ else()
set(DEBUG 0)
endif()
+option(LOG_LIST_ACTIONS "Add list actions logging" OFF)
+
add_definitions(-DINCLUDE_GENERATED_DECLARATIONS)
-add_definitions(-DHAVE_CONFIG_H)
-if(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_SYSTEM_NAME STREQUAL "Linux")
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-undefined")
- set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined")
- set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--no-undefined")
+if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
+ if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
+ set(NO_UNDEFINED "-Wl,--no-undefined -lsocket")
+ elseif(NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+ set(NO_UNDEFINED "-Wl,--no-undefined")
+ endif()
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${NO_UNDEFINED}")
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${NO_UNDEFINED}")
# For O_CLOEXEC, O_DIRECTORY, and O_NOFOLLOW flags on older systems
# (pre POSIX.1-2008: glibc 2.11 and earlier). #4042
+ # For ptsname(). #6743
add_definitions(-D_GNU_SOURCE)
endif()
-if(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_SYSTEM_NAME STREQUAL "SunOS")
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-undefined -lsocket")
-endif()
-
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SIZEOF_VOID_P EQUAL 8)
# Required for luajit.
set(CMAKE_EXE_LINKER_FLAGS
@@ -297,23 +377,71 @@ include_directories(SYSTEM ${LIBUV_INCLUDE_DIRS})
find_package(Msgpack 1.0.0 REQUIRED)
include_directories(SYSTEM ${MSGPACK_INCLUDE_DIRS})
-if(UNIX)
- option(FEAT_TUI "Enable the Terminal UI" ON)
+# Note: The test lib requires LuaJIT; it will be skipped if LuaJIT is missing.
+option(PREFER_LUA "Prefer Lua over LuaJIT in the nvim executable." OFF)
+
+if(PREFER_LUA)
+ find_package(Lua 5.1 REQUIRED)
+ set(LUA_PREFERRED_INCLUDE_DIRS ${LUA_INCLUDE_DIR})
+ set(LUA_PREFERRED_LIBRARIES ${LUA_LIBRARIES})
+ # Passive (not REQUIRED): if LUAJIT_FOUND is not set, nvim-test is skipped.
+ find_package(LuaJit)
else()
- option(FEAT_TUI "Enable the Terminal UI" OFF)
+ find_package(LuaJit REQUIRED)
+ set(LUA_PREFERRED_INCLUDE_DIRS ${LUAJIT_INCLUDE_DIRS})
+ set(LUA_PREFERRED_LIBRARIES ${LUAJIT_LIBRARIES})
endif()
+list(APPEND CMAKE_REQUIRED_INCLUDES "${MSGPACK_INCLUDE_DIRS}")
+check_c_source_compiles("
+#include <msgpack.h>
+
+int
+main(void)
+{
+ return MSGPACK_OBJECT_FLOAT32;
+}
+" MSGPACK_HAS_FLOAT32)
+unset(CMAKE_REQUIRED_LIBRARIES)
+if(MSGPACK_HAS_FLOAT32)
+ add_definitions(-DNVIM_MSGPACK_HAS_FLOAT32)
+endif()
+
+option(FEAT_TUI "Enable the Terminal UI" ON)
+
if(FEAT_TUI)
find_package(Unibilium REQUIRED)
include_directories(SYSTEM ${UNIBILIUM_INCLUDE_DIRS})
- find_package(LibTermkey REQUIRED)
+ list(APPEND CMAKE_REQUIRED_INCLUDES "${UNIBILIUM_INCLUDE_DIRS}")
+ list(APPEND CMAKE_REQUIRED_LIBRARIES "${UNIBILIUM_LIBRARIES}")
+ check_c_source_compiles("
+ #include <unibilium.h>
+
+ int
+ main(void)
+ {
+ return unibi_num_from_var(unibi_var_from_num(0));
+ }
+ " UNIBI_HAS_VAR_FROM)
+ unset(CMAKE_REQUIRED_INCLUDES)
+ unset(CMAKE_REQUIRED_LIBRARIES)
+ if(UNIBI_HAS_VAR_FROM)
+ add_definitions(-DNVIM_UNIBI_HAS_VAR_FROM)
+ endif()
+
+ find_package(LibTermkey 0.18 REQUIRED)
include_directories(SYSTEM ${LIBTERMKEY_INCLUDE_DIRS})
endif()
find_package(LibVterm REQUIRED)
include_directories(SYSTEM ${LIBVTERM_INCLUDE_DIRS})
+if(WIN32)
+ find_package(Winpty 0.4.3 REQUIRED)
+ include_directories(SYSTEM ${WINPTY_INCLUDE_DIRS})
+endif()
+
option(CLANG_ASAN_UBSAN "Enable Clang address & undefined behavior sanitizer for nvim binary." OFF)
option(CLANG_MSAN "Enable Clang memory sanitizer for nvim binary." OFF)
option(CLANG_TSAN "Enable Clang thread sanitizer for nvim binary." OFF)
@@ -321,33 +449,37 @@ option(CLANG_TSAN "Enable Clang thread sanitizer for nvim binary." OFF)
if((CLANG_ASAN_UBSAN AND CLANG_MSAN)
OR (CLANG_ASAN_UBSAN AND CLANG_TSAN)
OR (CLANG_MSAN AND CLANG_TSAN))
- message(FATAL_ERROR "Sanitizers cannot be enabled simultaneously.")
+ message(FATAL_ERROR "Sanitizers cannot be enabled simultaneously")
endif()
if((CLANG_ASAN_UBSAN OR CLANG_MSAN OR CLANG_TSAN) AND NOT CMAKE_C_COMPILER_ID MATCHES "Clang")
- message(FATAL_ERROR "Sanitizers are only supported for Clang.")
+ message(FATAL_ERROR "Sanitizers are only supported for Clang")
endif()
-option(ENABLE_JEMALLOC "enable jemalloc" ON)
+if(CMAKE_SYSTEM_NAME MATCHES "OpenBSD|FreeBSD|Windows") # see #5318
+ message(STATUS "skipping jemalloc on this system: ${CMAKE_SYSTEM_NAME}")
+ option(ENABLE_JEMALLOC "enable jemalloc" OFF)
+else()
+ option(ENABLE_JEMALLOC "enable jemalloc" ON)
+endif()
-if (ENABLE_JEMALLOC)
+if(ENABLE_JEMALLOC)
if(CLANG_ASAN_UBSAN OR CLANG_MSAN OR CLANG_TSAN)
- message(STATUS "Sanitizers have been enabled; don't use jemalloc.")
+ message(STATUS "Sanitizers enabled; disabling jemalloc")
else()
- find_package(JeMalloc)
- if(JEMALLOC_FOUND)
- include_directories(SYSTEM ${JEMALLOC_INCLUDE_DIRS})
- endif()
+ find_package(JeMalloc REQUIRED)
+ include_directories(SYSTEM ${JEMALLOC_INCLUDE_DIRS})
endif()
endif()
-find_package(LibIntl)
-if(LibIntl_FOUND)
+if(ENABLE_LIBINTL)
+ # LibIntl (not Intl) selects our FindLibIntl.cmake script. #8464
+ find_package(LibIntl REQUIRED)
include_directories(SYSTEM ${LibIntl_INCLUDE_DIRS})
endif()
-find_package(Iconv)
-if(Iconv_FOUND)
+if(ENABLE_LIBICONV)
+ find_package(Iconv REQUIRED)
include_directories(SYSTEM ${Iconv_INCLUDE_DIRS})
endif()
@@ -389,52 +521,56 @@ else()
endif()
if(NOT LUA_PRG_WORKS)
- message(FATAL_ERROR "A suitable Lua interpreter was not found.")
+ message(FATAL_ERROR "Failed to find a Lua 5.1-compatible interpreter")
endif()
-message(STATUS "Using the Lua interpreter ${LUA_PRG}.")
+message(STATUS "Using Lua interpreter: ${LUA_PRG}")
# Setup busted.
-find_program(BUSTED_PRG busted)
+find_program(BUSTED_PRG NAMES busted busted.bat)
find_program(BUSTED_LUA_PRG busted-lua)
if(NOT BUSTED_OUTPUT_TYPE)
- set(BUSTED_OUTPUT_TYPE "utfTerminal")
+ set(BUSTED_OUTPUT_TYPE "nvim")
endif()
find_program(LUACHECK_PRG luacheck)
+find_program(GPERF_PRG gperf)
include(InstallHelpers)
file(GLOB MANPAGES
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
man/nvim.1)
-
install_helper(
FILES ${MANPAGES}
DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
# MIN_LOG_LEVEL for log.h
-if(DEFINED MIN_LOG_LEVEL)
+if("${MIN_LOG_LEVEL}" MATCHES "^$")
+ message(STATUS "MIN_LOG_LEVEL not specified")
+else()
if(NOT MIN_LOG_LEVEL MATCHES "^[0-3]$")
- message(FATAL_ERROR "MIN_LOG_LEVEL must be a number DEBUG (0), INFO (1), WARNING (2) or ERROR (3)")
+ message(FATAL_ERROR "invalid MIN_LOG_LEVEL: " ${MIN_LOG_LEVEL})
endif()
- message(STATUS "Log level set to ${MIN_LOG_LEVEL}")
-else()
- message(STATUS "Log level not specified, defaulting to INFO(1)")
+ message(STATUS "MIN_LOG_LEVEL set to ${MIN_LOG_LEVEL}")
endif()
# Go down the tree.
add_subdirectory(src/nvim)
-# Read compilation flags from src/nvim,
-# used in config subdirectory below.
+# Read compilation flags from src/nvim, used in config subdirectory below.
include(GetCompileFlags)
get_compile_flags(NVIM_VERSION_CFLAGS)
add_subdirectory(test/includes)
add_subdirectory(config)
-add_subdirectory(test/functional/fixtures) # compile pty/shell test programs
+add_subdirectory(test/functional/fixtures) # compile test programs
add_subdirectory(runtime)
+if(WIN32)
+ install_helper(
+ FILES ${DEPS_PREFIX}/share/nvim-qt/runtime/plugin/nvim_gui_shim.vim
+ DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/nvim-qt/runtime/plugin)
+endif()
# Setup some test-related bits. We do this after going down the tree because we
# need some of the targets.
@@ -442,17 +578,6 @@ if(BUSTED_PRG)
get_property(TEST_INCLUDE_DIRS DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
PROPERTY INCLUDE_DIRECTORIES)
- # Set policy CMP0026 to OLD so we avoid CMake warnings on newer
- # versions of cmake.
- if(POLICY CMP0026)
- cmake_policy(SET CMP0026 OLD)
- endif()
- if(CMAKE_GENERATOR MATCHES "Visual Studio")
- set(TEST_LIBNVIM_PATH ${CMAKE_BINARY_DIR}/lib/nvim-test.dll)
- else()
- get_target_property(TEST_LIBNVIM_PATH nvim-test LOCATION)
- endif()
-
# When running tests from 'ninja' we need to use the
# console pool: to do so we need to use the USES_TERMINAL
# option, but this is only available in CMake 3.2
@@ -461,17 +586,17 @@ if(BUSTED_PRG)
list(APPEND TEST_TARGET_ARGS "USES_TERMINAL")
endif()
- configure_file(
- test/config/paths.lua.in
- ${CMAKE_BINARY_DIR}/test/config/paths.lua)
-
set(UNITTEST_PREREQS nvim-test unittest-headers)
- set(FUNCTIONALTEST_PREREQS nvim tty-test shell-test)
+ set(FUNCTIONALTEST_PREREQS nvim printargs-test shell-test)
+ if(NOT WIN32)
+ list(APPEND FUNCTIONALTEST_PREREQS tty-test)
+ endif()
set(BENCHMARK_PREREQS nvim tty-test)
# Useful for automated build systems, if they want to manually run the tests.
add_custom_target(unittest-prereqs
DEPENDS ${UNITTEST_PREREQS})
+ set_target_properties(unittest-prereqs PROPERTIES FOLDER test)
add_custom_target(functionaltest-prereqs
DEPENDS ${FUNCTIONALTEST_PREREQS})
@@ -490,62 +615,114 @@ if(BUSTED_PRG)
-DTEST_DIR=${CMAKE_CURRENT_SOURCE_DIR}/test
-DBUILD_DIR=${CMAKE_BINARY_DIR}
-DTEST_TYPE=unit
+ -DSYSTEM_NAME=${CMAKE_SYSTEM_NAME}
-P ${PROJECT_SOURCE_DIR}/cmake/RunTests.cmake
DEPENDS ${UNITTEST_PREREQS}
${TEST_TARGET_ARGS})
+ set_target_properties(unittest PROPERTIES FOLDER test)
+ else()
+ message(WARNING "disabling unit tests: no Luajit FFI in ${LUA_PRG}")
+ endif()
+
+ if(LUA_HAS_FFI)
+ set(TEST_LIBNVIM_PATH $<TARGET_FILE:nvim-test>)
else()
- message(WARNING "The Luajit ffi is not available in ${LUA_PRG}"
- ", disabling unit tests")
+ set(TEST_LIBNVIM_PATH "")
endif()
+ configure_file(
+ ${CMAKE_SOURCE_DIR}/test/config/paths.lua.in
+ ${CMAKE_BINARY_DIR}/test/config/paths.lua.gen)
+ file(GENERATE
+ OUTPUT ${CMAKE_BINARY_DIR}/test/config/paths.lua
+ INPUT ${CMAKE_BINARY_DIR}/test/config/paths.lua.gen)
add_custom_target(functionaltest
COMMAND ${CMAKE_COMMAND}
-DBUSTED_PRG=${BUSTED_PRG}
+ -DLUA_PRG=${LUA_PRG}
-DNVIM_PRG=$<TARGET_FILE:nvim>
-DWORKING_DIR=${CMAKE_CURRENT_SOURCE_DIR}
-DBUSTED_OUTPUT_TYPE=${BUSTED_OUTPUT_TYPE}
-DTEST_DIR=${CMAKE_CURRENT_SOURCE_DIR}/test
-DBUILD_DIR=${CMAKE_BINARY_DIR}
-DTEST_TYPE=functional
+ -DSYSTEM_NAME=${CMAKE_SYSTEM_NAME}
-P ${PROJECT_SOURCE_DIR}/cmake/RunTests.cmake
DEPENDS ${FUNCTIONALTEST_PREREQS}
${TEST_TARGET_ARGS})
+ set_target_properties(functionaltest functionaltest-prereqs
+ PROPERTIES FOLDER test)
add_custom_target(benchmark
COMMAND ${CMAKE_COMMAND}
-DBUSTED_PRG=${BUSTED_PRG}
+ -DLUA_PRG=${LUA_PRG}
-DNVIM_PRG=$<TARGET_FILE:nvim>
-DWORKING_DIR=${CMAKE_CURRENT_SOURCE_DIR}
-DBUSTED_OUTPUT_TYPE=${BUSTED_OUTPUT_TYPE}
-DTEST_DIR=${CMAKE_CURRENT_SOURCE_DIR}/test
-DBUILD_DIR=${CMAKE_BINARY_DIR}
-DTEST_TYPE=benchmark
+ -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}
-P ${PROJECT_SOURCE_DIR}/cmake/RunTests.cmake
DEPENDS ${BENCHMARK_PREREQS}
${TEST_TARGET_ARGS})
+ set_target_properties(benchmark benchmark-prereqs PROPERTIES FOLDER test)
endif()
if(BUSTED_LUA_PRG)
add_custom_target(functionaltest-lua
COMMAND ${CMAKE_COMMAND}
-DBUSTED_PRG=${BUSTED_LUA_PRG}
+ -DLUA_PRG=${LUA_PRG}
-DNVIM_PRG=$<TARGET_FILE:nvim>
-DWORKING_DIR=${CMAKE_CURRENT_SOURCE_DIR}
-DBUSTED_OUTPUT_TYPE=${BUSTED_OUTPUT_TYPE}
-DTEST_DIR=${CMAKE_CURRENT_SOURCE_DIR}/test
-DBUILD_DIR=${CMAKE_BINARY_DIR}
-DTEST_TYPE=functional
+ -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}
-P ${PROJECT_SOURCE_DIR}/cmake/RunTests.cmake
DEPENDS ${FUNCTIONALTEST_PREREQS}
${TEST_TARGET_ARGS})
+ set_target_properties(functionaltest-lua PROPERTIES FOLDER test)
endif()
if(LUACHECK_PRG)
add_custom_target(testlint
COMMAND ${CMAKE_COMMAND}
-DLUACHECK_PRG=${LUACHECK_PRG}
- -DTEST_DIR=${CMAKE_CURRENT_SOURCE_DIR}/test
- -P ${PROJECT_SOURCE_DIR}/cmake/RunTestsLint.cmake)
+ -DLUAFILES_DIR=${CMAKE_CURRENT_SOURCE_DIR}/test
+ -DIGNORE_PATTERN="*/preload.lua"
+ -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}
+ -P ${PROJECT_SOURCE_DIR}/cmake/RunLuacheck.cmake)
+
+ add_custom_target(
+ lintbuiltinlua
+ COMMAND
+ ${CMAKE_COMMAND}
+ -DLUACHECK_PRG=${LUACHECK_PRG}
+ -DLUAFILES_DIR=${CMAKE_CURRENT_SOURCE_DIR}/src/nvim/lua
+ -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}
+ -DREAD_GLOBALS=vim
+ -P ${PROJECT_SOURCE_DIR}/cmake/RunLuacheck.cmake
+ )
+ add_custom_target(
+ lintruntimelua
+ COMMAND
+ ${CMAKE_COMMAND}
+ -DLUACHECK_PRG=${LUACHECK_PRG}
+ -DLUAFILES_DIR=${CMAKE_CURRENT_SOURCE_DIR}/runtime/lua
+ -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}
+ -DREAD_GLOBALS=vim
+ -P ${PROJECT_SOURCE_DIR}/cmake/RunLuacheck.cmake
+ )
+ # TODO(ZyX-I): Run linter for all lua code in src
+ add_custom_target(
+ lualint
+ DEPENDS lintruntimelua
+ DEPENDS lintbuiltinlua
+ )
endif()
set(CPACK_PACKAGE_NAME "Neovim")
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index dbc048d939..b7392eaf0c 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,46 +1,82 @@
# Contributing to Neovim
-## Getting started
-
-- Help us review [open pull requests](https://github.com/neovim/neovim/pulls)!
- See [Reviewing](#reviewing) for guidelines.
-- Try an [entry-level issue][entry-level] if you are wondering where to start.
-- Or [merge a Vim patch].
-
-## Reporting problems
-
-- Check the [**FAQ**][wiki-faq].
-- Search [existing issues][github-issues] (including closed!)
+Getting started
+---------------
+
+If you want to help but don't know where to start, here are some
+low-risk/isolated tasks:
+
+- [Merge a Vim patch].
+- Try a [complexity:low] issue.
+- Fix bugs found by [Clang](#clang-scan-build), [PVS](#pvs-studio) or
+ [Coverity](#coverity).
+
+Developer guidelines
+--------------------
+
+- Nvim contributors should read `:help dev`.
+- External UI developers should read `:help dev-ui`.
+- API client developers should read `:help dev-api-client`.
+- Nvim developers are _strongly encouraged_ to install `ninja` for faster builds.
+ ```
+ sudo apt-get install ninja-build
+ make distclean
+ make # Nvim build system uses ninja automatically, if available.
+ ```
+
+Reporting problems
+------------------
+
+- [Check the FAQ][wiki-faq].
+- [Search existing issues][github-issues] (including closed!)
- Update Neovim to the latest version to see if your problem persists.
-- If you're using a plugin manager, comment out your plugins, then add them back
- in one by one, to narrow down the cause of the issue.
-- Crash reports which include a stacktrace are 10x more valuable.
-- [Bisecting][git-bisect] to the cause of a regression often leads to an
- immediate fix.
-
-## Pull requests ("PRs")
-
-- To avoid duplicate work, you may want to create a `[WIP]` pull request so that
- others know what you are working on.
-- Avoid cosmetic changes to unrelated files in the same commit: extra noise
- makes reviews more difficult.
-- Use a [feature branch][git-feature-branch] instead of the master branch.
-- [Rebase your feature branch][git-rebasing] onto (upstream) master before
- opening the PR.
-- After addressing the review comments, it's fine to rebase and force-push to
- your review.
-- Try to [tidy your history][git-history-rewriting]: combine related commits
- with interactive rebasing, separate monolithic commits, etc.
-
-### Stages: WIP, RFC
+- Disable plugins incrementally, to narrow down the cause of the issue.
+- When reporting a crash, [include a stacktrace](https://github.com/neovim/neovim/wiki/Development-tips#backtrace-linux).
+- [Bisect][git-bisect] to the cause of a regression, if you are able. This is _extremely_ helpful.
+- Check `$NVIM_LOG_FILE`, if it exists.
+- Include `cmake --system-information` for build-related issues.
-Pull requests are processed in two stages: _WIP_ (Work In Progress) and _RFC_
-(Request For Comment).
+Pull requests ("PRs")
+---------------------
-- Untagged PRs are assumed to be RFC, meaning the work is ready for review and
- you would like feedback.
-- Preprend `[WIP]` to the PR title if you are _not_ ready for feedback and the
- work is still in flux. This saves time and confusion.
+- To avoid duplicate work, create a `[WIP]` pull request as soon as possible.
+- Avoid cosmetic changes to unrelated files in the same commit.
+- Use a [feature branch][git-feature-branch] instead of the master branch.
+- Use a **rebase workflow** for small PRs.
+ - After addressing review comments, it's fine to rebase and force-push.
+- Use a **merge workflow** for big, high-risk PRs.
+ - Merge `master` into your PR when there are conflicts or when master
+ introduces breaking changes.
+ - Use the `ri` git alias:
+ ```
+ [alias]
+ ri = "!sh -c 't=\"${1:-master}\"; s=\"${2:-HEAD}\"; mb=\"$(git merge-base \"$t\" \"$s\")\"; if test \"x$mb\" = x ; then o=\"$t\"; else lm=\"$(git log -n1 --merges \"$t..$s\" --pretty=%H)\"; if test \"x$lm\" = x ; then o=\"$mb\"; else o=\"$lm\"; fi; fi; test $# -gt 0 && shift; test $# -gt 0 && shift; git rebase --interactive \"$o\" \"$@\"'"
+ ```
+ This avoids unnecessary rebases yet still allows you to combine related
+ commits, separate monolithic commits, etc.
+ - Do not edit commits that come before the merge commit.
+- During a squash/fixup, use `exec make -C build unittest` between each
+ pick/edit/reword.
+
+### Stages: WIP, RFC, RDY
+
+Pull requests have three stages: `[WIP]` (Work In Progress), `[RFC]` (Request
+For Comment) and `[RDY]` (Ready).
+
+- Untagged PRs are assumed to be `[RFC]`, i.e. you are requesting a review.
+- Prepend `[WIP]` to the PR title if you are _not_ requesting feedback and the
+ work is still in flux.
+- Prepend `[RDY]` to the PR title if you are _done_ with the PR and are only
+ waiting on it to be merged.
+
+For example, a typical workflow is:
+
+1. You open a `[WIP]` PR where the work is _not_ ready for feedback, you just want to
+ let others know what you are doing.
+2. Once the PR is ready for review, you replace `[WIP]` in the title with `[RFC]`.
+ You may add fix up commits to address issues that come up during review.
+3. Once the PR is ready for merging, you rebase/squash your work appropriately and
+ then replace `[RFC]` in the title with `[RDY]`.
### Commit messages
@@ -50,43 +86,86 @@ the VCS/git logs more valuable.
- Try to keep the first line under 72 characters.
- **Prefix the commit subject with a _scope_:** `doc:`, `test:`, `foo.c:`,
`runtime:`, ...
- - For commits that contain only style/lint changes, a single-word subject
- line is preferred: `style` or `lint`.
+ - Subject line for commits with only style/lint changes can be a single
+ word: `style` or `lint`.
- A blank line must separate the subject from the description.
- Use the _imperative voice_: "Fix bug" rather than "Fixed bug" or "Fixes bug."
### Automated builds (CI)
-Each pull request must pass the automated builds ([travis CI] and [quickbuild]).
+Each pull request must pass the automated builds on [Travis CI], [QuickBuild]
+and [AppVeyor].
-- CI builds are compiled with [`-Werror`][gcc-warnings], so if your PR
- introduces any compiler warnings, the build will fail.
+- CI builds are compiled with [`-Werror`][gcc-warnings], so compiler warnings
+ will fail the build.
- If any tests fail, the build will fail.
- See [Building Neovim#running-tests][wiki-run-tests] to run tests locally.
+ See [test/README.md#running-tests][run-tests] to run tests locally.
Passing locally doesn't guarantee passing the CI build, because of the
different compilers and platforms tested against.
-- CI runs [ASan] and other analyzers. To run valgrind locally:
- `VALGRIND=1 make test`
+- CI runs [ASan] and other analyzers.
+ - To run valgrind locally: `VALGRIND=1 make test`
+ - To run Clang ASan/UBSan locally: `CC=clang make CMAKE_FLAGS="-DCLANG_ASAN_UBSAN=ON"`
- The `lint` build ([#3174][3174]) checks modified lines _and their immediate
neighbors_. This is to encourage incrementally updating the legacy style to
meet our style guidelines.
- - A single word (`lint` or `style`) is sufficient as the subject line of
- a commit that contains only style changes.
- [How to investigate QuickBuild failures](https://github.com/neovim/neovim/pull/4718#issuecomment-217631350)
-### Coverity
+QuickBuild uses this invocation:
+
+ mkdir -p build/${params.get("buildType")} \
+ && cd build/${params.get("buildType")} \
+ && cmake -G "Unix Makefiles" -DBUSTED_OUTPUT_TYPE=TAP -DCMAKE_BUILD_TYPE=${params.get("buildType")}
+ -DTRAVIS_CI_BUILD=ON ../.. && ${node.getAttribute("make", "make")}
+ VERBOSE=1 nvim unittest-prereqs functionaltest-prereqs
-[Coverity](https://scan.coverity.com/projects/neovim-neovim) runs against the
-master build. If you want to view the defects, just request access at the
-_Contributor_ level. An Admin will grant you permission.
-Use this commit-message format for coverity fixes:
+### Clang scan-build
- coverity/<id>: <description of what fixed the defect>
+View the [Clang report] to see potential bugs found by the Clang
+[scan-build](https://clang-analyzer.llvm.org/scan-build.html) analyzer.
-where `<id>` is the Coverity ID (CID). For example see [#804](https://github.com/neovim/neovim/pull/804).
+- Search the Neovim commit history to find examples:
+ ```
+ git log --oneline --no-merges --grep clang
+ ```
+- To verify a fix locally, run `scan-build` like this:
+ ```
+ rm -rf build/
+ scan-build --use-analyzer=/usr/bin/clang make
+ ```
-## Reviewing
+### PVS-Studio
+
+View the [PVS report](https://neovim.io/doc/reports/pvs/PVS-studio.html.d/) to
+see potential bugs found by [PVS Studio](https://www.viva64.com/en/pvs-studio/).
+
+- Use this format for commit messages (where `{id}` is the PVS warning-id)):
+ ```
+ PVS/V{id}: {description}
+ ```
+- Search the Neovim commit history to find examples:
+ ```
+ git log --oneline --no-merges --grep PVS
+ ```
+- Try `./scripts/pvscheck.sh` to run PVS locally.
+
+### Coverity
+
+[Coverity](https://scan.coverity.com/projects/neovim-neovim) runs against the
+master build. To view the defects, just request access; you will be approved.
+
+- Use this format for commit messages (where `{id}` is the CID (Coverity ID);
+ ([example](https://github.com/neovim/neovim/pull/804))):
+ ```
+ coverity/{id}: {description}
+ ```
+- Search the Neovim commit history to find examples:
+ ```
+ git log --oneline --no-merges --grep coverity
+ ```
+
+Reviewing
+---------
To help review pull requests, start with [this checklist][review-checklist].
@@ -101,10 +180,8 @@ commits in the feature branch which aren't in the `master` branch; `-p`
shows each commit's diff. To show the whole surrounding function of a change
as context, use the `-W` argument as well.
-
-[entry-level]: https://github.com/neovim/neovim/issues?labels=entry-level&state=open
[gcc-warnings]: https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
-[git-bisect]: http://git-scm.com/book/tr/v2/Git-Tools-Debugging-with-Git
+[git-bisect]: http://git-scm.com/book/en/v2/Git-Tools-Debugging-with-Git
[git-feature-branch]: https://www.atlassian.com/git/tutorials/comparing-workflows
[git-history-filtering]: https://www.atlassian.com/git/tutorials/git-log/filtering-the-commit-history
[git-history-rewriting]: http://git-scm.com/book/en/v2/Git-Tools-Rewriting-History
@@ -115,10 +192,13 @@ as context, use the `-W` argument as well.
[hygiene]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
[style-guide]: http://neovim.io/develop/style-guide.xml
[ASan]: http://clang.llvm.org/docs/AddressSanitizer.html
-[wiki-run-tests]: https://github.com/neovim/neovim/wiki/Building-Neovim#running-tests
+[run-tests]: https://github.com/neovim/neovim/blob/master/test/README.md#running-tests
[wiki-faq]: https://github.com/neovim/neovim/wiki/FAQ
[review-checklist]: https://github.com/neovim/neovim/wiki/Code-review-checklist
[3174]: https://github.com/neovim/neovim/issues/3174
-[travis CI]: https://travis-ci.org/neovim/neovim
-[quickbuild]: http://neovim-qb.szakmeister.net/dashboard
-[merge a Vim patch]: https://github.com/neovim/neovim/wiki/Merging-patches-from-upstream-Vim
+[Travis CI]: https://travis-ci.org/neovim/neovim
+[QuickBuild]: http://neovim-qb.szakmeister.net/dashboard
+[AppVeyor]: https://ci.appveyor.com/project/neovim/neovim
+[Merge a Vim patch]: https://github.com/neovim/neovim/wiki/Merging-patches-from-upstream-Vim
+[Clang report]: https://neovim.io/doc/reports/clang/
+[complexity:low]: https://github.com/neovim/neovim/issues?q=is%3Aopen+is%3Aissue+label%3Acomplexity%3Alow
diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md
index 011739396d..1a7268a51e 100644
--- a/ISSUE_TEMPLATE.md
+++ b/ISSUE_TEMPLATE.md
@@ -1,16 +1,19 @@
+<!-- Before reporting: search existing issues and check the FAQ. -->
+
- `nvim --version`:
- Vim (version: ) behaves differently?
- Operating system/version:
- Terminal name/version:
- `$TERM`:
-### Actual behaviour
-
-### Expected behaviour
-
### Steps to reproduce using `nvim -u NORC`
```
nvim -u NORC
```
+
+### Actual behaviour
+
+### Expected behaviour
+
diff --git a/MAINTAIN.md b/MAINTAIN.md
new file mode 100644
index 0000000000..ed0df76e36
--- /dev/null
+++ b/MAINTAIN.md
@@ -0,0 +1,48 @@
+Maintaining the Neovim project
+==============================
+
+Notes on maintaining the Neovim project.
+
+See also: https://github.com/git/git/blob/master/Documentation/howto/maintain-git.txt
+
+Ticket Triage
+-------------
+
+In practice we haven't found a meaningful way to forecast more precisely than
+"next" and "after next". That means there are usually one or two (at most)
+planned milestones:
+
+- Next bugfix-release (1.0.x)
+- Next feature-release (1.x.0)
+
+The forecasting problem might be solved with an explicit priority system (like
+Bram's todo.txt). Meanwhile the Neovim priority system is defined by:
+
+- PRs nearing completion (RDY).
+- Issue labels. E.g. the +plan label increases the ticket's priority merely for
+ having a plan written down: it is _closer to completion_ than tickets without
+ a plan.
+- Comment activity or new information.
+
+Anything that isn't in the next milestone, and doesn't have a RDY PR ... is
+just not something you care very much about, by construction. Post-release you
+can review open issues, but chances are your next milestone is already getting
+full :)
+
+Release Policy
+--------------
+
+The goal is "early and often".
+
+Up to now we use only one branch, the `master` branch.
+
+- If `master` is unstable we don't release.
+- If the last release has a major bug, we:
+ 1. Fix the bug on `master`.
+ 2. Disable or remove any known risks present on `master`.
+ 3. Cut a release from `master`.
+
+This is a bit silly, but it works ok. And it keeps `master` from biting off
+more feature-creep than it can chew.
+
+See also: https://github.com/neovim/neovim/issues/862
diff --git a/Makefile b/Makefile
index 552a79466b..ec7f5c7bce 100644
--- a/Makefile
+++ b/Makefile
@@ -1,21 +1,26 @@
+THIS_DIR = $(shell pwd)
filter-false = $(strip $(filter-out 0 off OFF false FALSE,$1))
filter-true = $(strip $(filter-out 1 on ON true TRUE,$1))
# See contrib/local.mk.example
-include local.mk
+CMAKE_PRG ?= $(shell (command -v cmake3 || echo cmake))
CMAKE_BUILD_TYPE ?= Debug
CMAKE_FLAGS := -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE)
-DOC_DOWNLOAD_URL_BASE := https://raw.githubusercontent.com/neovim/doc/gh-pages
-CLINT_ERRORS_FILE_PATH := /reports/clint/errors.json
BUILD_TYPE ?= $(shell (type ninja > /dev/null 2>&1 && echo "Ninja") || \
echo "Unix Makefiles")
+DEPS_BUILD_DIR ?= .deps
+
+ifneq (1,$(words [$(DEPS_BUILD_DIR)]))
+ $(error DEPS_BUILD_DIR must not contain whitespace)
+endif
ifeq (,$(BUILD_TOOL))
ifeq (Ninja,$(BUILD_TYPE))
- ifneq ($(shell cmake --help 2>/dev/null | grep Ninja),)
+ ifneq ($(shell $(CMAKE_PRG) --help 2>/dev/null | grep Ninja),)
BUILD_TOOL := ninja
else
# User's version of CMake doesn't support Ninja
@@ -39,15 +44,16 @@ BUILD_CMD = $(BUILD_TOOL) $(VERBOSE_FLAG)
# Extra CMake flags which extend the default set
CMAKE_EXTRA_FLAGS ?=
DEPS_CMAKE_FLAGS ?=
-USE_BUNDLED_DEPS ?=
+# Back-compat: USE_BUNDLED_DEPS was the old name.
+USE_BUNDLED ?= $(USE_BUNDLED_DEPS)
-ifneq (,$(USE_BUNDLED_DEPS))
- BUNDLED_CMAKE_FLAG := -DUSE_BUNDLED=$(USE_BUNDLED_DEPS)
+ifneq (,$(USE_BUNDLED))
+ BUNDLED_CMAKE_FLAG := -DUSE_BUNDLED=$(USE_BUNDLED)
endif
ifneq (,$(findstring functionaltest-lua,$(MAKECMDGOALS)))
BUNDLED_LUA_CMAKE_FLAG := -DUSE_BUNDLED_LUA=ON
- $(shell [ -x .deps/usr/bin/lua ] || rm build/.ran-*)
+ $(shell [ -x $(DEPS_BUILD_DIR)/usr/bin/lua ] || rm build/.ran-*)
endif
# For use where we want to make sure only a single job is run. This does issue
@@ -67,30 +73,40 @@ cmake:
$(MAKE) build/.ran-cmake
build/.ran-cmake: | deps
- cd build && cmake -G '$(BUILD_TYPE)' $(CMAKE_FLAGS) $(CMAKE_EXTRA_FLAGS) ..
+ cd build && $(CMAKE_PRG) -G '$(BUILD_TYPE)' $(CMAKE_FLAGS) $(CMAKE_EXTRA_FLAGS) $(THIS_DIR)
touch $@
deps: | build/.ran-third-party-cmake
-ifeq ($(call filter-true,$(USE_BUNDLED_DEPS)),)
- +$(BUILD_CMD) -C .deps
+ifeq ($(call filter-true,$(USE_BUNDLED)),)
+ +$(BUILD_CMD) -C $(DEPS_BUILD_DIR)
endif
build/.ran-third-party-cmake:
-ifeq ($(call filter-true,$(USE_BUNDLED_DEPS)),)
- mkdir -p .deps
- cd .deps && \
- cmake -G '$(BUILD_TYPE)' $(BUNDLED_CMAKE_FLAG) $(BUNDLED_LUA_CMAKE_FLAG) \
- $(DEPS_CMAKE_FLAGS) ../third-party
+ifeq ($(call filter-true,$(USE_BUNDLED)),)
+ mkdir -p $(DEPS_BUILD_DIR)
+ cd $(DEPS_BUILD_DIR) && \
+ $(CMAKE_PRG) -G '$(BUILD_TYPE)' $(BUNDLED_CMAKE_FLAG) $(BUNDLED_LUA_CMAKE_FLAG) \
+ $(DEPS_CMAKE_FLAGS) $(THIS_DIR)/third-party
endif
mkdir -p build
touch $@
+# TODO: cmake 3.2+ add_custom_target() has a USES_TERMINAL flag.
oldtest: | nvim helptags
- +$(SINGLE_MAKE) -C src/nvim/testdir $(MAKEOVERRIDES)
+ +$(SINGLE_MAKE) -C src/nvim/testdir clean
+ifeq ($(strip $(TEST_FILE)),)
+ +$(SINGLE_MAKE) -C src/nvim/testdir NVIM_PRG="$(realpath build/bin/nvim)" $(MAKEOVERRIDES)
+else
+ +$(SINGLE_MAKE) -C src/nvim/testdir NVIM_PRG="$(realpath build/bin/nvim)" NEW_TESTS=$(TEST_FILE) SCRIPTS= $(MAKEOVERRIDES)
+endif
helptags: | nvim
+$(BUILD_CMD) -C build runtime/doc/tags
+# Builds help HTML _and_ checks for invalid help tags.
+helphtml: | nvim helptags
+ +$(BUILD_CMD) -C build doc_html
+
functionaltest: | nvim
+$(BUILD_CMD) -C build functionaltest
@@ -100,6 +116,9 @@ functionaltest-lua: | nvim
testlint: | build/.ran-cmake deps
$(BUILD_CMD) -C build testlint
+lualint: | build/.ran-cmake deps
+ $(BUILD_CMD) -C build lualint
+
unittest: | nvim
+$(BUILD_CMD) -C build unittest
@@ -111,19 +130,34 @@ test: functionaltest unittest
clean:
+test -d build && $(BUILD_CMD) -C build clean || true
$(MAKE) -C src/nvim/testdir clean
+ $(MAKE) -C runtime/doc clean
distclean: clean
- rm -rf .deps build
+ rm -rf $(DEPS_BUILD_DIR) build
install: | nvim
+$(BUILD_CMD) -C build install
-clint:
- cmake -DLINT_PRG=./src/clint.py \
- -DLINT_DIR=src \
- -DLINT_SUPPRESS_URL="$(DOC_DOWNLOAD_URL_BASE)$(CLINT_ERRORS_FILE_PATH)" \
- -P cmake/RunLint.cmake
+clint: build/.ran-cmake
+ +$(BUILD_CMD) -C build clint
+
+clint-full: build/.ran-cmake
+ +$(BUILD_CMD) -C build clint-full
+
+check-single-includes: build/.ran-cmake
+ +$(BUILD_CMD) -C build check-single-includes
+
+generated-sources: build/.ran-cmake
+ +$(BUILD_CMD) -C build generated-sources
+
+appimage:
+ bash scripts/genappimage.sh
+
+# Build an appimage with embedded update information appimage-nightly for
+# nightly builds or appimage-latest for a release
+appimage-%:
+ bash scripts/genappimage.sh $*
-lint: clint testlint
+lint: check-single-includes clint testlint lualint
-.PHONY: test testlint functionaltest unittest lint clint clean distclean nvim libnvim cmake deps install
+.PHONY: test testlint lualint functionaltest unittest lint clint clean distclean nvim libnvim cmake deps install appimage
diff --git a/README.md b/README.md
index 63c7dd95d7..39d809002e 100644
--- a/README.md
+++ b/README.md
@@ -1,57 +1,125 @@
-![Neovim](https://raw.githubusercontent.com/neovim/neovim.github.io/master/logos/neovim-logo.png)
+[![Neovim](https://raw.githubusercontent.com/neovim/neovim.github.io/master/logos/neovim-logo-600x173.png)](https://neovim.io)
-[Website](http://neovim.io) |
-[Community](http://neovim.io/community/) |
[Wiki](https://github.com/neovim/neovim/wiki) |
-[Documentation](http://neovim.io/doc) |
-[Mailing List](https://groups.google.com/forum/#!forum/neovim) |
-[Twitter](http://twitter.com/Neovim) |
-[Bountysource](https://www.bountysource.com/teams/neovim)
-
-[![Travis Build Status](https://travis-ci.org/neovim/neovim.svg?branch=master)](https://travis-ci.org/neovim/neovim)
-[![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/cf1jwc29198748we/branch/master?svg=true)](https://ci.appveyor.com/project/neovim/neovim/branch/master)
-[![Pull requests waiting for review](https://badge.waffle.io/neovim/neovim.svg?label=RFC&title=RFCs)](https://waffle.io/neovim/neovim)
-[![Coverage Status](https://img.shields.io/coveralls/neovim/neovim.svg)](https://coveralls.io/r/neovim/neovim)
-[![Coverity Scan Build](https://scan.coverity.com/projects/2227/badge.svg)](https://scan.coverity.com/projects/2227)
-[![Clang Scan Build](http://neovim.io/doc/reports/clang/badge.svg)](http://neovim.io/doc/reports/clang)
-[![Join the chat at https://gitter.im/neovim/neovim](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/neovim/neovim?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+[Documentation](https://neovim.io/doc) |
+[Twitter](https://twitter.com/Neovim) |
+[Community](https://neovim.io/community/) |
+[Gitter **Chat**](https://gitter.im/neovim/neovim)
+
+[![Travis build status](https://travis-ci.org/neovim/neovim.svg?branch=master)](https://travis-ci.org/neovim/neovim)
+[![AppVeyor build status](https://ci.appveyor.com/api/projects/status/urdqjrik5u521fac/branch/master?svg=true)](https://ci.appveyor.com/project/neovim/neovim/branch/master)
+[![Codecov coverage](https://img.shields.io/codecov/c/github/neovim/neovim.svg)](https://codecov.io/gh/neovim/neovim)
+[![Coverity Scan analysis](https://scan.coverity.com/projects/2227/badge.svg)](https://scan.coverity.com/projects/2227)
+[![Clang analysis](https://neovim.io/doc/reports/clang/badge.svg)](https://neovim.io/doc/reports/clang)
+[![PVS-Studio analysis](https://neovim.io/doc/reports/pvs/badge.svg)](https://neovim.io/doc/reports/pvs/PVS-studio.html.d)
+
+[![Packages](https://repology.org/badge/tiny-repos/neovim.svg)](https://repology.org/metapackage/neovim)
+[![Debian CI](https://badges.debian.net/badges/debian/testing/neovim/version.svg)](https://buildd.debian.org/neovim)
+[![Downloads](https://img.shields.io/github/downloads/neovim/neovim/total.svg?maxAge=2592001)](https://github.com/neovim/neovim/releases/)
Neovim is a project that seeks to aggressively refactor Vim in order to:
- Simplify maintenance and encourage [contributions](CONTRIBUTING.md)
- Split the work between multiple developers
-- Enable the implementation of new/modern user interfaces without any
- modifications to the core source
-- Improve extensibility with a new [plugin architecture](https://github.com/neovim/neovim/wiki/Plugin-UI-architecture)
+- Enable [advanced UIs] without modifications to the core
+- Maximize [extensibility](https://github.com/neovim/neovim/wiki/Plugin-UI-architecture)
-For lots more details, see
-[the wiki](https://github.com/neovim/neovim/wiki/Introduction)!
-
-### What's been done so far
-
-- Automatic [history merge](https://github.com/neovim/neovim/pull/2506) between multiple editor instances
-- [XDG-compliant](https://github.com/neovim/neovim/pull/3470) configuration
-- Embedded [terminal emulator](https://neovim.io/doc/user/nvim_terminal_emulator.html)
-- Asynchronous [job control](https://github.com/neovim/neovim/pull/2247)
-- [MessagePack](https://msgpack.org) remote API
-- [Pushdown automaton](https://github.com/neovim/neovim/pull/3413) for state transitions
-
-See the [progress page](https://github.com/neovim/neovim/wiki/Progress) for a comprehensive list.
+See the [Introduction](https://github.com/neovim/neovim/wiki/Introduction) wiki page and [Roadmap]
+for more information.
[![Throughput Graph](https://graphs.waffle.io/neovim/neovim/throughput.svg)](https://waffle.io/neovim/neovim/metrics)
-### What's being worked on now
+Features
+--------
-- Port all IO to [libuv](https://github.com/libuv/libuv/)
-- Convert legacy tests to Lua tests
-- VimL => Lua translator
-
-### How do I get it?
-
-There is a formula for OSX/homebrew, a PKGBUILD for Arch Linux, RPM, deb, and
-more. See [the wiki](https://github.com/neovim/neovim/wiki/Installing-Neovim)!
-
-### License
+- Modern [GUIs](https://github.com/neovim/neovim/wiki/Related-projects#gui)
+- [API](https://github.com/neovim/neovim/wiki/Related-projects#api-clients)
+ access from any language including Clojure, Lisp, Go, Haskell, Lua,
+ JavaScript, Perl, Python, Ruby, and Rust
+- Embedded, scriptable [terminal emulator](https://neovim.io/doc/user/nvim_terminal_emulator.html)
+- Asynchronous [job control](https://github.com/neovim/neovim/pull/2247)
+- [Shared data (shada)](https://github.com/neovim/neovim/pull/2506) among multiple editor instances
+- [XDG base directories](https://github.com/neovim/neovim/pull/3470) support
+- Compatible with most Vim plugins, including Ruby and Python plugins
+
+See [`:help nvim-features`][nvim-features] for the full list!
+
+Install from package
+--------------------
+
+Pre-built packages for Windows, macOS, and Linux are found on the
+[Releases](https://github.com/neovim/neovim/releases/) page.
+
+Managed packages are in [Homebrew], [Debian], [Ubuntu], [Fedora], [Arch Linux], [Gentoo],
+and [more](https://github.com/neovim/neovim/wiki/Installing-Neovim)!
+
+Install from source
+-------------------
+
+ make CMAKE_BUILD_TYPE=RelWithDebInfo
+ sudo make install
+
+To install to a non-default location, set `CMAKE_INSTALL_PREFIX`:
+
+ make CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX=/full/path/"
+ make install
+
+To skip bundled (`third-party/*`) dependencies:
+
+1. Install the dependencies using a package manager.
+ ```
+ sudo apt install gperf luajit luarocks libuv1-dev libluajit-5.1-dev libunibilium-dev libmsgpack-dev libtermkey-dev libvterm-dev libjemalloc-dev
+ sudo luarocks build mpack
+ sudo luarocks build lpeg
+ sudo luarocks build inspect
+ ```
+2. Build with `USE_BUNDLED=OFF`:
+ ```
+ make CMAKE_BUILD_TYPE=RelWithDebInfo USE_BUNDLED=OFF
+ sudo make install
+ ```
+
+CMake features:
+
+- List all build targets:
+ ```
+ cmake --build build --target help
+ ```
+- Print all variable definitions:
+ ```
+ cmake -LAH
+ ```
+- `build/CMakeCache.txt` contains the resolved values of all CMake variables.
+- `build/compile_commands.json` shows the full compiler invocations for each translation unit.
+
+See the [Building Neovim](https://github.com/neovim/neovim/wiki/Building-Neovim) wiki page for details.
+
+Transitioning from Vim
+--------------------
+
+See [`:help nvim-from-vim`](https://neovim.io/doc/user/nvim.html#nvim-from-vim) for instructions.
+
+Project layout
+--------------
+
+ โ”œโ”€ ci/ build automation
+ โ”œโ”€ cmake/ build scripts
+ โ”œโ”€ runtime/ user plugins/docs
+ โ”œโ”€ src/nvim/ application source code (see src/nvim/README.md)
+ โ”‚ โ”œโ”€ api/ API subsystem
+ โ”‚ โ”œโ”€ eval/ VimL subsystem
+ โ”‚ โ”œโ”€ event/ event-loop subsystem
+ โ”‚ โ”œโ”€ generators/ code generation (pre-compilation)
+ โ”‚ โ”œโ”€ lib/ generic data structures
+ โ”‚ โ”œโ”€ lua/ Lua subsystem
+ โ”‚ โ”œโ”€ msgpack_rpc/ RPC subsystem
+ โ”‚ โ”œโ”€ os/ low-level platform code
+ โ”‚ โ””โ”€ tui/ built-in UI
+ โ”œโ”€ third-party/ CMake subproject to build dependencies
+ โ””โ”€ test/ tests (see test/README.md)
+
+License
+-------
Neovim is licensed under the terms of the Apache 2.0 license, except for
parts that were contributed under the Vim license.
@@ -77,5 +145,14 @@ See `LICENSE` for details.
features. The money goes to Uganda anyway.
[license-commit]: https://github.com/neovim/neovim/commit/b17d9691a24099c9210289f16afb1a498a89d803
+[nvim-features]: https://neovim.io/doc/user/vim_diff.html#nvim-features
+[Roadmap]: https://neovim.io/roadmap/
+[advanced UIs]: https://github.com/neovim/neovim/wiki/Related-projects#gui
+[Homebrew]: https://github.com/neovim/homebrew-neovim#installation
+[Debian]: https://packages.debian.org/testing/neovim
+[Ubuntu]: http://packages.ubuntu.com/search?keywords=neovim
+[Fedora]: https://apps.fedoraproject.org/packages/neovim
+[Arch Linux]: https://www.archlinux.org/packages/?q=neovim
+[Gentoo]: https://packages.gentoo.org/packages/app-editors/neovim
<!-- vim: set tw=80: -->
diff --git a/appveyor.yml b/appveyor.yml
index c5a768cb41..f47ec236e5 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,23 +1,25 @@
version: '{build}'
-skip_tags: true
-os: Windows Server 2012 R2
environment:
- GYP_MSVS_VERSION: 2015
- matrix:
- - GENERATOR: Visual Studio 14 Win64
- DEPS_PATH: deps64
- - GENERATOR: Visual Studio 14
- DEPS_PATH: deps32
+ APPVEYOR_CACHE_ENTRY_ZIP_ARGS: "-t7z -m0=lzma -mx=9"
+image: Visual Studio 2017
+configuration:
+- MSVC_64
+- MSVC_32
+- MINGW_64
+- MINGW_32
+- MINGW_64-gcov
matrix:
- # Allow builds to fail
allow_failures:
- - os: Windows Server 2012 R2
+ - configuration: MINGW_64-gcov
install: []
+before_build:
+- ps: Install-Product node 8
build_script:
-# See http://help.appveyor.com/discussions/problems/539-cloning-gyp-fails
-- git config --global url."http://".insteadOf https://
-- mkdir %DEPS_PATH%
-- cd %DEPS_PATH%
-- cmake -G "%GENERATOR%" ..\third-party\
-- cmake --build .
-- cd ..
+- powershell ci\build.ps1
+cache:
+- C:\msys64\var\cache\pacman\pkg -> ci\build.ps1
+- .deps -> ci\build.ps1
+- .deps -> third-party\**
+artifacts:
+- path: build/Neovim.zip
+- path: build/bin/nvim.exe
diff --git a/busted/outputHandlers/TAP.lua b/busted/outputHandlers/TAP.lua
new file mode 100644
index 0000000000..612e633576
--- /dev/null
+++ b/busted/outputHandlers/TAP.lua
@@ -0,0 +1,94 @@
+-- TODO(jkeyes): Use the upstream version when busted releases it. (But how to
+-- inject our call to global_helpers.read_nvim_log() ?)
+
+local pretty = require 'pl.pretty'
+local global_helpers = require('test.helpers')
+
+return function(options)
+ local busted = require 'busted'
+ local handler = require 'busted.outputHandlers.base'()
+
+ local success = 'ok %u - %s'
+ local failure = 'not ' .. success
+ local skip = 'ok %u - # SKIP %s'
+ local counter = 0
+
+ handler.suiteReset = function()
+ counter = 0
+ return nil, true
+ end
+
+ handler.suiteEnd = function()
+ io.write(global_helpers.read_nvim_log())
+ print('1..' .. counter)
+ io.flush()
+ return nil, true
+ end
+
+ local function showFailure(t)
+ local message = t.message
+ local trace = t.trace or {}
+
+ if message == nil then
+ message = 'Nil error'
+ elseif type(message) ~= 'string' then
+ message = pretty.write(message)
+ end
+
+ print(failure:format(counter, t.name))
+ print('# ' .. t.element.trace.short_src .. ' @ ' .. t.element.trace.currentline)
+ if t.randomseed then print('# Random seed: ' .. t.randomseed) end
+ print('# Failure message: ' .. message:gsub('\n', '\n# '))
+ if options.verbose and trace.traceback then
+ print('# ' .. trace.traceback:gsub('^\n', '', 1):gsub('\n', '\n# '))
+ end
+ end
+
+ handler.testStart = function(element, parent)
+ local trace = element.trace
+ if options.verbose and trace and trace.short_src then
+ local fileline = trace.short_src .. ' @ ' .. trace.currentline .. ': '
+ local testName = fileline .. handler.getFullName(element)
+ print('# ' .. testName)
+ end
+ io.flush()
+
+ return nil, true
+ end
+
+ handler.testEnd = function(element, parent, status, trace)
+ counter = counter + 1
+ if status == 'success' then
+ local t = handler.successes[#handler.successes]
+ print(success:format(counter, t.name))
+ elseif status == 'pending' then
+ local t = handler.pendings[#handler.pendings]
+ print(skip:format(counter, (t.message or t.name)))
+ elseif status == 'failure' then
+ showFailure(handler.failures[#handler.failures])
+ elseif status == 'error' then
+ showFailure(handler.errors[#handler.errors])
+ end
+ io.flush()
+
+ return nil, true
+ end
+
+ handler.error = function(element, parent, message, debug)
+ if element.descriptor ~= 'it' then
+ counter = counter + 1
+ showFailure(handler.errors[#handler.errors])
+ end
+ io.flush()
+
+ return nil, true
+ end
+
+ busted.subscribe({ 'suite', 'reset' }, handler.suiteReset)
+ busted.subscribe({ 'suite', 'end' }, handler.suiteEnd)
+ busted.subscribe({ 'test', 'start' }, handler.testStart, { predicate = handler.cancelOnPending })
+ busted.subscribe({ 'test', 'end' }, handler.testEnd, { predicate = handler.cancelOnPending })
+ busted.subscribe({ 'error' }, handler.error)
+
+ return handler
+end
diff --git a/busted/outputHandlers/nvim.lua b/busted/outputHandlers/nvim.lua
new file mode 100644
index 0000000000..d137300a7e
--- /dev/null
+++ b/busted/outputHandlers/nvim.lua
@@ -0,0 +1,307 @@
+local s = require 'say'
+local pretty = require 'pl.pretty'
+local term = require 'term'
+local global_helpers = require('test.helpers')
+
+local colors
+
+local isWindows = package.config:sub(1,1) == '\\'
+
+if isWindows then
+ colors = setmetatable({}, {__index = function() return function(s) return s end end})
+else
+ colors = require 'term.colors'
+end
+
+return function(options)
+ local busted = require 'busted'
+ local handler = require 'busted.outputHandlers.base'()
+
+ local c = {
+ succ = function(s) return colors.bright(colors.green(s)) end,
+ skip = function(s) return colors.bright(colors.yellow(s)) end,
+ fail = function(s) return colors.bright(colors.magenta(s)) end,
+ errr = function(s) return colors.bright(colors.red(s)) end,
+ test = tostring,
+ file = colors.cyan,
+ time = colors.dim,
+ note = colors.yellow,
+ sect = function(s) return colors.green(colors.dim(s)) end,
+ nmbr = colors.bright,
+ }
+
+ local repeatSuiteString = '\nRepeating all tests (run %d of %d) . . .\n\n'
+ local randomizeString = c.note('Note: Randomizing test order with a seed of %d.\n')
+ local globalSetup = c.sect('[----------]') .. ' Global test environment setup.\n'
+ local fileStartString = c.sect('[----------]') .. ' Running tests from ' .. c.file('%s') .. '\n'
+ local runString = c.sect('[ RUN ]') .. ' ' .. c.test('%s') .. ': '
+ local successString = c.succ('OK') .. '\n'
+ local skippedString = c.skip('SKIP') .. '\n'
+ local failureString = c.fail('FAIL') .. '\n'
+ local errorString = c.errr('ERR') .. '\n'
+ local fileEndString = c.sect('[----------]') .. ' '.. c.nmbr('%d') .. ' %s from ' .. c.file('%s') .. ' ' .. c.time('(%.2f ms total)') .. '\n\n'
+ local globalTeardown = c.sect('[----------]') .. ' Global test environment teardown.\n'
+ local suiteEndString = c.sect('[==========]') .. ' ' .. c.nmbr('%d') .. ' %s from ' .. c.nmbr('%d') .. ' test %s ran. ' .. c.time('(%.2f ms total)') .. '\n'
+ local successStatus = c.succ('[ PASSED ]') .. ' ' .. c.nmbr('%d') .. ' %s.\n'
+ local timeString = c.time('%.2f ms')
+
+ local summaryStrings = {
+ skipped = {
+ header = c.skip('[ SKIPPED ]') .. ' ' .. c.nmbr('%d') .. ' %s, listed below:\n',
+ test = c.skip('[ SKIPPED ]') .. ' %s\n',
+ footer = ' ' .. c.nmbr('%d') .. ' SKIPPED %s\n',
+ },
+
+ failure = {
+ header = c.fail('[ FAILED ]') .. ' ' .. c.nmbr('%d') .. ' %s, listed below:\n',
+ test = c.fail('[ FAILED ]') .. ' %s\n',
+ footer = ' ' .. c.nmbr('%d') .. ' FAILED %s\n',
+ },
+
+ error = {
+ header = c.errr('[ ERROR ]') .. ' ' .. c.nmbr('%d') .. ' %s, listed below:\n',
+ test = c.errr('[ ERROR ]') .. ' %s\n',
+ footer = ' ' .. c.nmbr('%d') .. ' %s\n',
+ },
+ }
+
+ c = nil
+
+ local fileCount = 0
+ local fileTestCount = 0
+ local testCount = 0
+ local successCount = 0
+ local skippedCount = 0
+ local failureCount = 0
+ local errorCount = 0
+
+ local pendingDescription = function(pending)
+ local name = pending.name
+ local string = ''
+
+ if type(pending.message) == 'string' then
+ string = string .. pending.message .. '\n'
+ elseif pending.message ~= nil then
+ string = string .. pretty.write(pending.message) .. '\n'
+ end
+
+ return string
+ end
+
+ local failureDescription = function(failure)
+ local string = failure.randomseed and ('Random seed: ' .. failure.randomseed .. '\n') or ''
+ if type(failure.message) == 'string' then
+ string = string .. failure.message
+ elseif failure.message == nil then
+ string = string .. 'Nil error'
+ else
+ string = string .. pretty.write(failure.message)
+ end
+
+ string = string .. '\n'
+
+ if options.verbose and failure.trace and failure.trace.traceback then
+ string = string .. failure.trace.traceback .. '\n'
+ end
+
+ return string
+ end
+
+ local getFileLine = function(element)
+ local fileline = ''
+ if element.trace or element.trace.short_src then
+ fileline = colors.cyan(element.trace.short_src) .. ' @ ' ..
+ colors.cyan(element.trace.currentline) .. ': '
+ end
+ return fileline
+ end
+
+ local getTestList = function(status, count, list, getDescription)
+ local string = ''
+ local header = summaryStrings[status].header
+ if count > 0 and header then
+ local tests = (count == 1 and 'test' or 'tests')
+ local errors = (count == 1 and 'error' or 'errors')
+ string = header:format(count, status == 'error' and errors or tests)
+
+ local testString = summaryStrings[status].test
+ if testString then
+ for _, t in ipairs(list) do
+ local fullname = getFileLine(t.element) .. colors.bright(t.name)
+ string = string .. testString:format(fullname)
+ string = string .. getDescription(t)
+ end
+ end
+ end
+ return string
+ end
+
+ local getSummary = function(status, count)
+ local string = ''
+ local footer = summaryStrings[status].footer
+ if count > 0 and footer then
+ local tests = (count == 1 and 'TEST' or 'TESTS')
+ local errors = (count == 1 and 'ERROR' or 'ERRORS')
+ string = footer:format(count, status == 'error' and errors or tests)
+ end
+ return string
+ end
+
+ local getSummaryString = function()
+ local tests = (successCount == 1 and 'test' or 'tests')
+ local string = successStatus:format(successCount, tests)
+
+ string = string .. getTestList('skipped', skippedCount, handler.pendings, pendingDescription)
+ string = string .. getTestList('failure', failureCount, handler.failures, failureDescription)
+ string = string .. getTestList('error', errorCount, handler.errors, failureDescription)
+
+ string = string .. ((skippedCount + failureCount + errorCount) > 0 and '\n' or '')
+ string = string .. getSummary('skipped', skippedCount)
+ string = string .. getSummary('failure', failureCount)
+ string = string .. getSummary('error', errorCount)
+
+ return string
+ end
+
+ handler.suiteReset = function()
+ fileCount = 0
+ fileTestCount = 0
+ testCount = 0
+ successCount = 0
+ skippedCount = 0
+ failureCount = 0
+ errorCount = 0
+
+ return nil, true
+ end
+
+ handler.suiteStart = function(suite, count, total, randomseed)
+ if total > 1 then
+ io.write(repeatSuiteString:format(count, total))
+ end
+ if randomseed then
+ io.write(randomizeString:format(randomseed))
+ end
+ io.write(globalSetup)
+ io.flush()
+
+ return nil, true
+ end
+
+ local function getElapsedTime(tbl)
+ if tbl.duration then
+ return tbl.duration * 1000
+ else
+ return tonumber('nan')
+ end
+ end
+
+ handler.suiteEnd = function(suite, count, total)
+ local elapsedTime_ms = getElapsedTime(suite)
+ local tests = (testCount == 1 and 'test' or 'tests')
+ local files = (fileCount == 1 and 'file' or 'files')
+ io.write(globalTeardown)
+ io.write(global_helpers.read_nvim_log())
+ io.write(suiteEndString:format(testCount, tests, fileCount, files, elapsedTime_ms))
+ io.write(getSummaryString())
+ io.flush()
+
+ return nil, true
+ end
+
+ handler.fileStart = function(file)
+ fileTestCount = 0
+ io.write(fileStartString:format(file.name))
+ io.flush()
+ return nil, true
+ end
+
+ handler.fileEnd = function(file)
+ local elapsedTime_ms = getElapsedTime(file)
+ local tests = (fileTestCount == 1 and 'test' or 'tests')
+ fileCount = fileCount + 1
+ io.write(fileEndString:format(fileTestCount, tests, file.name, elapsedTime_ms))
+ io.flush()
+ return nil, true
+ end
+
+ handler.testStart = function(element, parent)
+ io.write(runString:format(handler.getFullName(element)))
+ io.flush()
+
+ return nil, true
+ end
+
+ handler.testEnd = function(element, parent, status, debug)
+ local elapsedTime_ms = getElapsedTime(element)
+ local string
+
+ fileTestCount = fileTestCount + 1
+ testCount = testCount + 1
+ if status == 'success' then
+ successCount = successCount + 1
+ string = successString
+ elseif status == 'pending' then
+ skippedCount = skippedCount + 1
+ string = skippedString
+ elseif status == 'failure' then
+ failureCount = failureCount + 1
+ string = nil
+ elseif status == 'error' then
+ errorCount = errorCount + 1
+ string = nil
+ end
+
+ if string ~= nil then
+ if elapsedTime_ms == elapsedTime_ms then
+ string = timeString:format(elapsedTime_ms) .. ' ' .. string
+ end
+ io.write(string)
+ io.flush()
+ end
+
+ return nil, true
+ end
+
+ handler.testFailure = function(element, parent, message, debug)
+ io.write(failureString)
+ io.flush()
+
+ io.write(failureDescription(handler.failures[#handler.failures]))
+ io.flush()
+ return nil, true
+ end
+
+ handler.testError = function(element, parent, message, debug)
+ io.write(errorString)
+ io.flush()
+
+ io.write(failureDescription(handler.errors[#handler.errors]))
+ io.flush()
+ return nil, true
+ end
+
+ handler.error = function(element, parent, message, debug)
+ if element.descriptor ~= 'it' then
+ io.write(failureDescription(handler.errors[#handler.errors]))
+ io.flush()
+ errorCount = errorCount + 1
+ end
+
+ return nil, true
+ end
+
+ busted.subscribe({ 'suite', 'reset' }, handler.suiteReset)
+ busted.subscribe({ 'suite', 'start' }, handler.suiteStart)
+ busted.subscribe({ 'suite', 'end' }, handler.suiteEnd)
+ busted.subscribe({ 'file', 'start' }, handler.fileStart)
+ busted.subscribe({ 'file', 'end' }, handler.fileEnd)
+ busted.subscribe({ 'test', 'start' }, handler.testStart, { predicate = handler.cancelOnPending })
+ busted.subscribe({ 'test', 'end' }, handler.testEnd, { predicate = handler.cancelOnPending })
+ busted.subscribe({ 'failure', 'it' }, handler.testFailure)
+ busted.subscribe({ 'error', 'it' }, handler.testError)
+ busted.subscribe({ 'failure' }, handler.error)
+ busted.subscribe({ 'error' }, handler.error)
+
+ return handler
+end
diff --git a/ci/before_cache.sh b/ci/before_cache.sh
new file mode 100755
index 0000000000..c8a1fd5b71
--- /dev/null
+++ b/ci/before_cache.sh
@@ -0,0 +1,30 @@
+#!/usr/bin/env bash
+
+set -e
+set -o pipefail
+
+CI_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+source "${CI_DIR}/common/build.sh"
+source "${CI_DIR}/common/suite.sh"
+
+# Don't cache pip's log and selfcheck.
+rm -rf "${HOME}/.cache/pip/log"
+rm -f "${HOME}/.cache/pip/selfcheck.json"
+
+echo "before_cache.sh: cache size"
+du -d 2 "${HOME}/.cache" | sort -n
+
+echo "before_cache.sh: ccache stats"
+ccache -s 2>/dev/null || true
+
+# Update the third-party dependency cache only if the build was successful.
+if ended_successfully; then
+ rm -rf "${HOME}/.cache/nvim-deps"
+ mv "${DEPS_BUILD_DIR}" "${HOME}/.cache/nvim-deps"
+
+ rm -rf "${HOME}/.cache/nvim-deps-downloads"
+ mv "${DEPS_DOWNLOAD_DIR}" "${HOME}/.cache/nvim-deps-downloads"
+
+ touch "${CACHE_MARKER}"
+ echo "Updated third-party dependencies (timestamp: $(_stat "${CACHE_MARKER}"))."
+fi
diff --git a/ci/before_install.sh b/ci/before_install.sh
new file mode 100755
index 0000000000..d8cf38d314
--- /dev/null
+++ b/ci/before_install.sh
@@ -0,0 +1,42 @@
+#!/usr/bin/env bash
+
+set -e
+set -o pipefail
+
+if [[ "${CI_TARGET}" == lint ]]; then
+ exit
+fi
+
+echo 'python info:'
+(
+ 2>&1 python --version || true
+ 2>&1 python2 --version || true
+ 2>&1 python3 --version || true
+ 2>&1 pip --version || true
+ 2>&1 pip2 --version || true
+ 2>&1 pip3 --version || true
+ echo 'pyenv versions:'
+ 2>&1 pyenv versions || true
+) | sed 's/^/ /'
+
+if [[ "${TRAVIS_OS_NAME}" == osx ]]; then
+ echo "Upgrade Python 3 pip"
+ python3 -m pip -q install --user --upgrade pip
+else
+ echo "Upgrade Python 2 pip"
+ python2.7 -m pip -q install --user --upgrade pip
+ echo "Upgrade Python 3 pip"
+ # Allow failure. pyenv pip3 on travis is broken:
+ # https://github.com/travis-ci/travis-ci/issues/8363
+ python3 -m pip -q install --user --upgrade pip || true
+fi
+
+echo "Install node (LTS)"
+
+if [[ "${TRAVIS_OS_NAME}" == osx ]] || [ ! -f ~/.nvm/nvm.sh ]; then
+ curl -o ~/.nvm/nvm.sh https://raw.githubusercontent.com/creationix/nvm/master/nvm.sh
+fi
+
+source ~/.nvm/nvm.sh
+nvm install --lts
+nvm use --lts
diff --git a/.ci/before_script.sh b/ci/before_script.sh
index 6babc582ea..49b4e068b5 100755
--- a/.ci/before_script.sh
+++ b/ci/before_script.sh
@@ -3,7 +3,7 @@
set -e
set -o pipefail
-if [[ -n "${CI_TARGET}" ]]; then
+if [[ "${CI_TARGET}" == lint ]]; then
exit
fi
@@ -19,20 +19,19 @@ if [[ -n "${LLVM_SYMBOLIZER}" ]] && [[ ! $(type -P "${LLVM_SYMBOLIZER}") ]]; the
echo "\$LLVM_SYMBOLIZER: '${LLVM_SYMBOLIZER}' is not executable."
exit 1
fi
-if [ "${BUILD_32BIT}" = ON ] && [ "${BUILD_MINGW}" = ON ]; then
- >&2 echo "32-bit MinGW builds not supported."
- exit 1
-fi
+
+# Show ccache stats so we can compare in before_cache
+ccache -s 2>/dev/null || true
if [[ "${TRAVIS_OS_NAME}" == osx ]]; then
# Adds user to a dummy group.
# That allows to test changing the group of the file by `os_fchown`.
sudo dscl . -create /Groups/chown_test
sudo dscl . -append /Groups/chown_test GroupMembership "${USER}"
-else
- # Compile dependencies.
- build_deps
fi
+# Compile dependencies.
+build_deps
+
rm -rf "${LOG_DIR}"
mkdir -p "${LOG_DIR}"
diff --git a/ci/build.ps1 b/ci/build.ps1
new file mode 100644
index 0000000000..1ba3fa8a6b
--- /dev/null
+++ b/ci/build.ps1
@@ -0,0 +1,137 @@
+$ErrorActionPreference = 'stop'
+Set-PSDebug -Strict -Trace 1
+
+$env:CONFIGURATION -match '^(?<compiler>\w+)_(?<bits>32|64)(?:-(?<option>\w+))?$'
+$compiler = $Matches.compiler
+$compileOption = $Matches.option
+$bits = $Matches.bits
+$cmakeBuildType = 'RelWithDebInfo'
+$depsCmakeVars = @{
+ CMAKE_BUILD_TYPE = $cmakeBuildType;
+}
+$nvimCmakeVars = @{
+ CMAKE_BUILD_TYPE = $cmakeBuildType;
+ BUSTED_OUTPUT_TYPE = 'nvim';
+}
+$uploadToCodeCov = $false
+
+# For pull requests, skip some build configurations to save time.
+if ($env:APPVEYOR_PULL_REQUEST_HEAD_COMMIT -and $env:CONFIGURATION -match '^(MSVC_64|MINGW_32|MINGW_64-gcov)$') {
+ exit 0
+}
+
+function exitIfFailed() {
+ if ($LastExitCode -ne 0) {
+ Set-PSDebug -Off
+ exit $LastExitCode
+ }
+}
+
+if ($compiler -eq 'MINGW') {
+ if ($bits -eq 32) {
+ $arch = 'i686'
+ }
+ elseif ($bits -eq 64) {
+ $arch = 'x86_64'
+ }
+ if ($compileOption -eq 'gcov') {
+ $nvimCmakeVars['USE_GCOV'] = 'ON'
+ $uploadToCodecov = $true
+ }
+ # These are native MinGW builds, but they use the toolchain inside
+ # MSYS2, this allows using all the dependencies and tools available
+ # in MSYS2, but we cannot build inside the MSYS2 shell.
+ $cmakeGenerator = 'Ninja'
+ $cmakeGeneratorArgs = '-v'
+ $mingwPackages = @('ninja', 'cmake', 'perl', 'diffutils', 'unibilium').ForEach({
+ "mingw-w64-$arch-$_"
+ })
+
+ # Add MinGW to the PATH
+ $env:PATH = "C:\msys64\mingw$bits\bin;$env:PATH"
+
+ # Avoid pacman "warning" which causes non-zero return code. https://github.com/open62541/open62541/issues/2068
+ & C:\msys64\usr\bin\mkdir -p /var/cache/pacman/pkg
+
+ # Build third-party dependencies
+ C:\msys64\usr\bin\bash -lc "pacman --verbose --noconfirm -Su" ; exitIfFailed
+ C:\msys64\usr\bin\bash -lc "pacman --verbose --noconfirm --needed -S $mingwPackages" ; exitIfFailed
+}
+elseif ($compiler -eq 'MSVC') {
+ $cmakeGeneratorArgs = '/verbosity:normal'
+ if ($bits -eq 32) {
+ $cmakeGenerator = 'Visual Studio 15 2017'
+ }
+ elseif ($bits -eq 64) {
+ $cmakeGenerator = 'Visual Studio 15 2017 Win64'
+ }
+}
+
+# Setup python (use AppVeyor system python)
+C:\Python27\python.exe -m pip install pynvim ; exitIfFailed
+C:\Python35\python.exe -m pip install pynvim ; exitIfFailed
+# Disambiguate python3
+move c:\Python35\python.exe c:\Python35\python3.exe
+$env:PATH = "C:\Python35;C:\Python27;$env:PATH"
+# Sanity check
+python -c "import pynvim; print(str(pynvim))" ; exitIfFailed
+python3 -c "import pynvim; print(str(pynvim))" ; exitIfFailed
+
+$env:PATH = "C:\Ruby24\bin;$env:PATH"
+gem.cmd install neovim
+Get-Command -CommandType Application neovim-ruby-host.bat
+
+npm.cmd install -g neovim
+Get-Command -CommandType Application neovim-node-host.cmd
+npm.cmd link neovim
+
+function convertToCmakeArgs($vars) {
+ return $vars.GetEnumerator() | foreach { "-D$($_.Key)=$($_.Value)" }
+}
+
+if (-Not (Test-Path -PathType container .deps)) {
+ mkdir .deps
+}
+cd .deps
+cmake -G $cmakeGenerator $(convertToCmakeArgs($depsCmakeVars)) ..\third-party\ ; exitIfFailed
+cmake --build . --config $cmakeBuildType -- $cmakeGeneratorArgs ; exitIfFailed
+cd ..
+
+# Build Neovim
+mkdir build
+cd build
+cmake -G $cmakeGenerator $(convertToCmakeArgs($nvimCmakeVars)) .. ; exitIfFailed
+cmake --build . --config $cmakeBuildType -- $cmakeGeneratorArgs ; exitIfFailed
+bin\nvim --version ; exitIfFailed
+
+# Functional tests
+# The $LastExitCode from MSBuild can't be trusted
+$failed = $false
+# Temporarily turn off tracing to reduce log file output
+Set-PSDebug -Off
+cmake --build . --config $cmakeBuildType --target functionaltest -- $cmakeGeneratorArgs 2>&1 |
+ foreach { $failed = $failed -or
+ $_ -match 'functional tests failed with error'; $_ }
+if ($failed) {
+ exit $LastExitCode
+}
+Set-PSDebug -Strict -Trace 1
+
+
+if ($uploadToCodecov) {
+ C:\msys64\usr\bin\bash -lc "cd /c/projects/neovim; bash <(curl -s https://codecov.io/bash) -c -F functionaltest || echo 'codecov upload failed.'"
+}
+
+# Old tests
+$env:PATH = "C:\msys64\usr\bin;$env:PATH"
+& "C:\msys64\mingw$bits\bin\mingw32-make.exe" -C $(Convert-Path ..\src\nvim\testdir) VERBOSE=1
+
+if ($uploadToCodecov) {
+ C:\msys64\usr\bin\bash -lc "cd /c/projects/neovim; bash <(curl -s https://codecov.io/bash) -c -F oldtest || echo 'codecov upload failed.'"
+}
+
+# Build artifacts
+cpack -G ZIP -C RelWithDebInfo
+if ($env:APPVEYOR_REPO_TAG_NAME -ne $null) {
+ cpack -G NSIS -C RelWithDebInfo
+}
diff --git a/ci/common/build.sh b/ci/common/build.sh
new file mode 100644
index 0000000000..7c27d61586
--- /dev/null
+++ b/ci/common/build.sh
@@ -0,0 +1,106 @@
+_stat() {
+ if test "${TRAVIS_OS_NAME}" = osx ; then
+ stat -f %Sm "${@}"
+ else
+ stat -c %y "${@}"
+ fi
+}
+
+top_make() {
+ printf '%78s\n' | tr ' ' '='
+ # Travis has 1.5 virtual cores according to:
+ # http://docs.travis-ci.com/user/speeding-up-the-build/#Paralellizing-your-build-on-one-VM
+ ninja "$@"
+}
+
+build_make() {
+ top_make -C "${BUILD_DIR}" "$@"
+}
+
+build_deps() {
+ if test "${BUILD_32BIT}" = ON ; then
+ DEPS_CMAKE_FLAGS="${DEPS_CMAKE_FLAGS} ${CMAKE_FLAGS_32BIT}"
+ fi
+ if test "${FUNCTIONALTEST}" = "functionaltest-lua" \
+ || test "${CLANG_SANITIZER}" = "ASAN_UBSAN" ; then
+ DEPS_CMAKE_FLAGS="${DEPS_CMAKE_FLAGS} -DUSE_BUNDLED_LUA=ON"
+ fi
+
+ mkdir -p "${DEPS_BUILD_DIR}"
+ mkdir -p "${DEPS_DOWNLOAD_DIR}"
+
+ # Use cached dependencies if $CACHE_MARKER exists.
+ if test "${CACHE_ENABLE}" = "false" ; then
+ export CCACHE_RECACHE=1
+ elif test -f "${CACHE_MARKER}" ; then
+ echo "Using third-party dependencies from Travis cache (last update: $(_stat "${CACHE_MARKER}"))."
+ cp -r "${HOME}/.cache/nvim-deps"/. "${DEPS_BUILD_DIR}"
+ cp -r "${HOME}/.cache/nvim-deps-downloads"/. "${DEPS_DOWNLOAD_DIR}"
+ fi
+
+ # Even if we're using cached dependencies, run CMake and make to
+ # update CMake configuration and update to newer deps versions.
+ cd "${DEPS_BUILD_DIR}"
+ echo "Configuring with '${DEPS_CMAKE_FLAGS}'."
+ CC= cmake -G Ninja ${DEPS_CMAKE_FLAGS} "${TRAVIS_BUILD_DIR}/third-party/"
+
+ if ! top_make; then
+ exit 1
+ fi
+
+ cd "${TRAVIS_BUILD_DIR}"
+}
+
+prepare_build() {
+ if test -n "${CLANG_SANITIZER}" ; then
+ CMAKE_FLAGS="${CMAKE_FLAGS} -DCLANG_${CLANG_SANITIZER}=ON"
+ fi
+ if test "${BUILD_32BIT}" = ON ; then
+ CMAKE_FLAGS="${CMAKE_FLAGS} ${CMAKE_FLAGS_32BIT}"
+ fi
+
+ mkdir -p "${BUILD_DIR}"
+ cd "${BUILD_DIR}"
+ echo "Configuring with '${CMAKE_FLAGS} $@'."
+ cmake -G Ninja ${CMAKE_FLAGS} "$@" "${TRAVIS_BUILD_DIR}"
+}
+
+build_nvim() {
+ echo "Building nvim."
+ if ! top_make nvim ; then
+ exit 1
+ fi
+
+ if test "$CLANG_SANITIZER" != "TSAN" ; then
+ echo "Building libnvim."
+ if ! top_make libnvim ; then
+ exit 1
+ fi
+
+ if test "${FUNCTIONALTEST}" != "functionaltest-lua"; then
+ echo "Building nvim-test."
+ if ! top_make nvim-test ; then
+ exit 1
+ fi
+ fi
+ fi
+
+ # Invoke nvim to trigger *San early.
+ if ! (bin/nvim --version && bin/nvim -u NONE -e -c ':qall') ; then
+ asan_check "${LOG_DIR}"
+ exit 1
+ fi
+ asan_check "${LOG_DIR}"
+
+
+ cd "${TRAVIS_BUILD_DIR}"
+}
+
+macos_rvm_dance() {
+ # neovim-ruby gem requires a ruby newer than the macOS default.
+ source ~/.rvm/scripts/rvm
+ rvm get stable --auto-dotfiles
+ rvm reload
+ rvm use 2.2.5
+ rvm use
+}
diff --git a/ci/common/suite.sh b/ci/common/suite.sh
new file mode 100644
index 0000000000..8feb642547
--- /dev/null
+++ b/ci/common/suite.sh
@@ -0,0 +1,192 @@
+# HACK: get newline for use in strings given that "\n" and $'' do not work.
+NL="$(printf '\nE')"
+NL="${NL%E}"
+
+FAIL_SUMMARY=""
+
+# Test success marker. If END_MARKER file exists, we know that all tests
+# finished. If FAIL_SUMMARY_FILE exists we know that some tests failed, this
+# file will contain information about failed tests. Build is considered
+# successful if tests ended without any of them failing.
+END_MARKER="$BUILD_DIR/.tests_finished"
+FAIL_SUMMARY_FILE="$BUILD_DIR/.test_errors"
+
+ANSI_CLEAR="\033[0K"
+
+travis_fold() {
+ local action="$1"
+ local name="$2"
+ name="$(echo -n "$name" | tr '\n\0' '--' | sed 's/[^A-Za-z0-9]\{1,\}/-/g')"
+ name="$(echo -n "$name" | sed 's/-$//')"
+ echo -en "travis_fold:${action}:${name}\r${ANSI_CLEAR}"
+}
+
+if test "$TRAVIS" != "true" ; then
+ travis_fold() {
+ return 0
+ }
+fi
+
+enter_suite() {
+ set +x
+ FAILED=0
+ rm -f "${END_MARKER}"
+ local suite_name="$1"
+ export NVIM_TEST_CURRENT_SUITE="${NVIM_TEST_CURRENT_SUITE}/$suite_name"
+ travis_fold start "${NVIM_TEST_CURRENT_SUITE}"
+ set -x
+}
+
+exit_suite() {
+ set +x
+ travis_fold end "${NVIM_TEST_CURRENT_SUITE}"
+ if test $FAILED -ne 0 ; then
+ echo "Suite ${NVIM_TEST_CURRENT_SUITE} failed, summary:"
+ echo "${FAIL_SUMMARY}"
+ fi
+ export NVIM_TEST_CURRENT_SUITE="${NVIM_TEST_CURRENT_SUITE%/*}"
+ if test "$1" != "--continue" ; then
+ exit $FAILED
+ else
+ local saved_failed=$FAILED
+ FAILED=0
+ return $saved_failed
+ fi
+}
+
+fail() {
+ local test_name="$1"
+ local fail_char="$2"
+ local message="$3"
+
+ : ${fail_char:=F}
+ : ${message:=Test $test_name failed}
+
+ local full_msg="$fail_char $NVIM_TEST_CURRENT_SUITE|$test_name :: $message"
+ FAIL_SUMMARY="${FAIL_SUMMARY}${NL}${full_msg}"
+ echo "${full_msg}" >> "${FAIL_SUMMARY_FILE}"
+ echo "Failed: $full_msg"
+ FAILED=1
+}
+
+run_test() {
+ local cmd="$1"
+ test $# -gt 0 && shift
+ local test_name="$1"
+ : ${test_name:=$cmd}
+ test $# -gt 0 && shift
+ if ! eval "$cmd" ; then
+ fail "${test_name}" "$@"
+ fi
+}
+
+run_test_wd() {
+ local hang_ok=
+ if test "$1" = "--allow-hang" ; then
+ hang_ok=1
+ shift
+ fi
+
+ local timeout="$1"
+ test $# -gt 0 && shift
+
+ local cmd="$1"
+ test $# -gt 0 && shift
+
+ local restart_cmd="$1"
+ : ${restart_cmd:=true}
+ test $# -gt 0 && shift
+
+ local test_name="$1"
+ : ${test_name:=$cmd}
+ test $# -gt 0 && shift
+
+ local output_file="$(mktemp)"
+ local status_file="$(mktemp)"
+ local sid_file="$(mktemp)"
+
+ local restarts=5
+ local prev_tmpsize=-1
+ while test $restarts -gt 0 ; do
+ : > "$status_file"
+ : > "$sid_file"
+ setsid \
+ env \
+ output_file="$output_file" \
+ status_file="$status_file" \
+ sid_file="$sid_file" \
+ cmd="$cmd" \
+ CI_DIR="$CI_DIR" \
+ sh -c '
+ . "${CI_DIR}/common/test.sh"
+ ps -o sid= > "$sid_file"
+ (
+ ret=0
+ if ! eval "$cmd" 2>&1 ; then
+ ret=1
+ fi
+ echo "$ret" > "$status_file"
+ ) | tee -a "$output_file"
+ '
+ while test "$(stat -c "%s" "$status_file")" -eq 0 ; do
+ prev_tmpsize=$tmpsize
+ sleep $timeout
+ tmpsize="$(stat -c "%s" "$output_file")"
+ if test $tempsize -eq $prev_temsize ; then
+ # no output, assuming either hang or exit
+ break
+ fi
+ done
+ restarts=$(( restarts - 1 ))
+ if test "$(stat -c "%s" "$status_file")" -eq 0 ; then
+ # Status file not updated, assuming hang
+
+ # SID not known, this should not ever happen
+ if test "$(stat -c "%s" "$sid_file")" -eq 0 ; then
+ fail "$test_name" E "Shell did not run"
+ break
+ fi
+
+ # Kill all processes which belong to one session: should get rid of test
+ # processes as well as sh itself.
+ pkill -KILL -s$(cat "$sid_file")
+
+ if test $restarts -eq 0 ; then
+ if test -z "$hang_ok" ; then
+ fail "$test_name" E "Test hang up"
+ fi
+ else
+ echo "Test ${test_name} hang up, restarting"
+ eval "$restart_cmd"
+ fi
+ else
+ local new_failed="$(cat "$status_file")"
+ if test "$new_failed" != "0" ; then
+ fail "$test_name" F "Test failed in run_test_wd"
+ fi
+ break
+ fi
+ done
+
+ rm -f "$output_file"
+ rm -f "$status_file"
+ rm -f "$sid_file"
+}
+
+ended_successfully() {
+ if test -f "${FAIL_SUMMARY_FILE}" ; then
+ echo 'Test failed, complete summary:'
+ cat "${FAIL_SUMMARY_FILE}"
+ return 1
+ fi
+ if ! test -f "${END_MARKER}" ; then
+ echo 'ended_successfully called before end marker was touched'
+ return 1
+ fi
+ return 0
+}
+
+end_tests() {
+ touch "${END_MARKER}"
+ ended_successfully
+}
diff --git a/ci/common/test.sh b/ci/common/test.sh
new file mode 100644
index 0000000000..f1c5454e3f
--- /dev/null
+++ b/ci/common/test.sh
@@ -0,0 +1,190 @@
+. "${CI_DIR}/common/build.sh"
+. "${CI_DIR}/common/suite.sh"
+
+submit_coverage() {
+ if [ -n "${GCOV}" ]; then
+ if curl --fail --output codecov.bash --silent https://codecov.io/bash; then
+ bash codecov.bash -c -F "$1" || echo "codecov upload failed."
+ rm -f codecov.bash
+ fi
+ fi
+}
+
+print_core() {
+ local app="$1"
+ local core="$2"
+ if test "$app" = quiet ; then
+ echo "Found core $core"
+ return 0
+ fi
+ echo "======= Core file $core ======="
+ if test "${TRAVIS_OS_NAME}" = osx ; then
+ lldb -Q -o "bt all" -f "${app}" -c "${core}"
+ else
+ gdb -n -batch -ex 'thread apply all bt full' "${app}" -c "${core}"
+ fi
+}
+
+check_core_dumps() {
+ local del=
+ if test "$1" = "--delete" ; then
+ del=1
+ shift
+ fi
+ local app="${1:-${BUILD_DIR}/bin/nvim}"
+ if test "${TRAVIS_OS_NAME}" = osx ; then
+ local cores="$(find /cores/ -type f -print)"
+ local _sudo='sudo'
+ else
+ local cores="$(find ./ -type f -name 'core.*' -print)"
+ local _sudo=
+ fi
+
+ if test -z "${cores}" ; then
+ return
+ fi
+ local core
+ for core in $cores; do
+ if test "$del" = "1" ; then
+ print_core "$app" "$core" >&2
+ "$_sudo" rm "$core"
+ else
+ print_core "$app" "$core"
+ fi
+ done
+ if test "$app" != quiet ; then
+ fail 'cores' E 'Core dumps found'
+ fi
+}
+
+check_logs() {
+ # Iterate through each log to remove an useless warning.
+ for log in $(find "${1}" -type f -name "${2}"); do
+ sed -i "${log}" \
+ -e '/Warning: noted but unhandled ioctl/d' \
+ -e '/could cause spurious value errors to appear/d' \
+ -e '/See README_MISSING_SYSCALL_OR_IOCTL for guidance/d'
+ done
+
+ # Now do it again, but only consider files with size > 0.
+ local err=""
+ for log in $(find "${1}" -type f -name "${2}" -size +0); do
+ cat "${log}"
+ err=1
+ done
+ if test -n "${err}" ; then
+ fail 'logs' E 'Runtime errors detected.'
+ fi
+}
+
+valgrind_check() {
+ check_logs "${1}" "valgrind-*"
+}
+
+asan_check() {
+ if test "${CLANG_SANITIZER}" = "ASAN_UBSAN" ; then
+ check_logs "${1}" "*san.*" | $ASAN_SYMBOLIZE
+ fi
+}
+
+run_unittests() {(
+ enter_suite unittests
+ ulimit -c unlimited || true
+ if ! build_make unittest ; then
+ fail 'unittests' F 'Unit tests failed'
+ fi
+ submit_coverage unittest
+ check_core_dumps "$(which luajit)"
+ exit_suite
+)}
+
+run_functionaltests() {(
+ enter_suite functionaltests
+ ulimit -c unlimited || true
+ if ! build_make ${FUNCTIONALTEST}; then
+ fail 'functionaltests' F 'Functional tests failed'
+ fi
+ submit_coverage functionaltest
+ asan_check "${LOG_DIR}"
+ valgrind_check "${LOG_DIR}"
+ check_core_dumps
+ exit_suite
+)}
+
+run_oldtests() {(
+ enter_suite oldtests
+ ulimit -c unlimited || true
+ if ! make -C "${TRAVIS_BUILD_DIR}/src/nvim/testdir"; then
+ reset
+ fail 'oldtests' F 'Legacy tests failed'
+ fi
+ submit_coverage oldtest
+ asan_check "${LOG_DIR}"
+ valgrind_check "${LOG_DIR}"
+ check_core_dumps
+ exit_suite
+)}
+
+check_runtime_files() {(
+ set +x
+ local test_name="$1" ; shift
+ local message="$1" ; shift
+ local tst="$1" ; shift
+
+ cd runtime
+ for file in $(git ls-files "$@") ; do
+ # Check that test is not trying to work with files with spaces/etc
+ # Prefer failing the build over using more robust construct because files
+ # with IFS are not welcome.
+ if ! test -e "$file" ; then
+ fail "$test_name" E \
+ "It appears that $file is only a part of the file name"
+ fi
+ if ! test "$tst" "$INSTALL_PREFIX/share/nvim/runtime/$file" ; then
+ fail "$test_name" F "$(printf "$message" "$file")"
+ fi
+ done
+)}
+
+install_nvim() {(
+ enter_suite 'install_nvim'
+ if ! build_make install ; then
+ fail 'install' E 'make install failed'
+ exit_suite
+ fi
+
+ "${INSTALL_PREFIX}/bin/nvim" --version
+ if ! "${INSTALL_PREFIX}/bin/nvim" -u NONE -e -c ':help' -c ':qall' ; then
+ echo "Running ':help' in the installed nvim failed."
+ echo "Maybe the helptags have not been generated properly."
+ fail 'help' F 'Failed running :help'
+ fi
+
+ # Check that all runtime files were installed
+ check_runtime_files \
+ 'runtime-install' \
+ 'It appears that %s is not installed.' \
+ -e \
+ '*.vim' '*.ps' '*.dict' '*.py' '*.tutor'
+
+ # Check that some runtime files are installed and are executables
+ check_runtime_files \
+ 'not-exe' \
+ 'It appears that %s is not installed or is not executable.' \
+ -x \
+ '*.awk' '*.sh' '*.bat'
+
+ # Check that generated syntax file has function names, #5060.
+ local genvimsynf=syntax/vim/generated.vim
+ local gpat='syn keyword vimFuncName .*eval'
+ if ! grep -q "$gpat" "${INSTALL_PREFIX}/share/nvim/runtime/$genvimsynf" ; then
+ fail 'funcnames' F "It appears that $genvimsynf does not contain $gpat."
+ fi
+
+ exit_suite
+)}
+
+csi_clean() {
+ find "${BUILD_DIR}/bin" -name 'test-includes-*' -delete
+ find "${BUILD_DIR}" -name '*test-include*.o' -delete
+}
diff --git a/ci/install.sh b/ci/install.sh
new file mode 100755
index 0000000000..12985098cd
--- /dev/null
+++ b/ci/install.sh
@@ -0,0 +1,32 @@
+#!/usr/bin/env bash
+
+set -e
+set -o pipefail
+
+if [[ "${CI_TARGET}" == lint ]]; then
+ exit
+fi
+
+if [[ "${TRAVIS_OS_NAME}" == osx ]]; then
+ export PATH="/usr/local/opt/ccache/libexec:$PATH"
+fi
+
+echo "Install neovim module for Python 3."
+# Allow failure. pyenv pip3 on travis is broken:
+# https://github.com/travis-ci/travis-ci/issues/8363
+CC=cc python3 -m pip -q install --user --upgrade neovim || true
+
+if ! [ "${TRAVIS_OS_NAME}" = osx ] ; then
+ # Update PATH for pip.
+ export PATH="$(python2.7 -c 'import site; print(site.getuserbase())')/bin:$PATH"
+ # Use default CC to avoid compilation problems when installing Python modules.
+ echo "Install neovim module for Python 2."
+ CC=cc python2.7 -m pip -q install --user --upgrade neovim
+fi
+
+echo "Install neovim RubyGem."
+gem install --no-document --version ">= 0.8.0" neovim
+
+echo "Install neovim npm package"
+npm install -g neovim
+npm link neovim
diff --git a/ci/run_lint.sh b/ci/run_lint.sh
new file mode 100755
index 0000000000..ae9adb7c87
--- /dev/null
+++ b/ci/run_lint.sh
@@ -0,0 +1,40 @@
+#!/usr/bin/env bash
+
+set -e
+set -o pipefail
+
+CI_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+
+source "${CI_DIR}/common/build.sh"
+source "${CI_DIR}/common/suite.sh"
+
+enter_suite 'clint'
+
+run_test 'make clint-full' clint
+
+exit_suite --continue
+
+enter_suite 'testlint'
+
+run_test 'make testlint' testlint
+
+exit_suite --continue
+
+enter_suite 'lualint'
+
+run_test 'make lualint' lualint
+
+exit_suite --continue
+
+enter_suite single-includes
+
+CLICOLOR_FORCE=1 run_test_wd \
+ --allow-hang \
+ 10s \
+ 'make check-single-includes' \
+ 'csi_clean' \
+ single-includes
+
+exit_suite --continue
+
+end_tests
diff --git a/ci/run_tests.sh b/ci/run_tests.sh
new file mode 100755
index 0000000000..c175910da5
--- /dev/null
+++ b/ci/run_tests.sh
@@ -0,0 +1,36 @@
+#!/usr/bin/env bash
+
+set -e
+set -o pipefail
+
+CI_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+source "${CI_DIR}/common/build.sh"
+source "${CI_DIR}/common/test.sh"
+source "${CI_DIR}/common/suite.sh"
+
+enter_suite build
+
+check_core_dumps --delete quiet
+
+prepare_build
+build_nvim
+
+exit_suite --continue
+
+enter_suite tests
+
+if test "$CLANG_SANITIZER" != "TSAN" ; then
+ # Additional threads are only created when the builtin UI starts, which
+ # doesn't happen in the unit/functional tests
+ if test "${FUNCTIONALTEST}" != "functionaltest-lua"; then
+ run_test run_unittests
+ fi
+ run_test run_functionaltests
+fi
+run_test run_oldtests
+
+run_test install_nvim
+
+exit_suite --continue
+
+end_tests
diff --git a/.ci/script.sh b/ci/script.sh
index c3c7b8dfa9..a59c40cd2d 100755
--- a/.ci/script.sh
+++ b/ci/script.sh
@@ -3,19 +3,11 @@
set -e
set -o pipefail
-if [[ -n "${CI_TARGET}" ]]; then
- make "${CI_TARGET}"
- exit 0
-fi
-
# This will pass the environment variables down to a bash process which runs
# as $USER, while retaining the environment variables defined and belonging
# to secondary groups given above in usermod.
if [[ "${TRAVIS_OS_NAME}" == osx ]]; then
- # Set up precompiled third-party dependencies.
- eval "$(curl -Ss https://raw.githubusercontent.com/neovim/bot-ci/master/scripts/travis-setup.sh) deps-x64"
-
- sudo -E su "${USER}" -c ".ci/run_tests.sh"
+ sudo -E su "${USER}" -c "ci/run_${CI_TARGET}.sh"
else
- .ci/run_tests.sh
+ ci/run_${CI_TARGET}.sh
fi
diff --git a/cmake/Download.cmake b/cmake/Download.cmake
new file mode 100644
index 0000000000..50a77816bc
--- /dev/null
+++ b/cmake/Download.cmake
@@ -0,0 +1,18 @@
+file(
+ DOWNLOAD "${URL}" "${FILE}"
+ STATUS status
+ LOG log
+)
+
+list(GET status 0 status_code)
+list(GET status 1 status_string)
+
+if(NOT status_code EQUAL 0)
+ if(NOT ALLOW_FAILURE)
+ message(FATAL_ERROR "error: downloading '${URL}' failed
+ status_code: ${status_code}
+ status_string: ${status_string}
+ log: ${log}
+ ")
+ endif()
+endif()
diff --git a/cmake/FindIconv.cmake b/cmake/FindIconv.cmake
index f3a54e9d6f..1d0164dae9 100644
--- a/cmake/FindIconv.cmake
+++ b/cmake/FindIconv.cmake
@@ -8,7 +8,7 @@
include(LibFindMacros)
find_path(ICONV_INCLUDE_DIR NAMES iconv.h)
-find_library(ICONV_LIBRARY NAMES iconv)
+find_library(ICONV_LIBRARY NAMES iconv libiconv)
set(Iconv_PROCESS_INCLUDES ICONV_INCLUDE_DIR)
if(ICONV_LIBRARY)
diff --git a/cmake/FindJeMalloc.cmake b/cmake/FindJeMalloc.cmake
index f36cbc6f7a..f139196a38 100644
--- a/cmake/FindJeMalloc.cmake
+++ b/cmake/FindJeMalloc.cmake
@@ -4,7 +4,7 @@
# JEMALLOC_INCLUDE_DIRS - The jemalloc include directories
# JEMALLOC_LIBRARIES - The libraries needed to use jemalloc
-if(NOT JEMALLOC_USE_BUNDLED)
+if(NOT USE_BUNDLED_JEMALLOC)
find_package(PkgConfig)
if (PKG_CONFIG_FOUND)
pkg_check_modules(PC_JEMALLOC QUIET jemalloc)
@@ -27,6 +27,9 @@ find_path(JEMALLOC_INCLUDE_DIR jemalloc/jemalloc.h
if(JEMALLOC_USE_STATIC)
list(APPEND JEMALLOC_NAMES
"${CMAKE_STATIC_LIBRARY_PREFIX}jemalloc${CMAKE_STATIC_LIBRARY_SUFFIX}")
+elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+ list(INSERT JEMALLOC_NAMES 0
+ "${CMAKE_STATIC_LIBRARY_PREFIX}jemalloc${CMAKE_STATIC_LIBRARY_SUFFIX}")
endif()
list(APPEND JEMALLOC_NAMES jemalloc)
diff --git a/cmake/FindLibIntl.cmake b/cmake/FindLibIntl.cmake
index 75926200c1..738ae39983 100644
--- a/cmake/FindLibIntl.cmake
+++ b/cmake/FindLibIntl.cmake
@@ -27,16 +27,15 @@ find_path(LibIntl_INCLUDE_DIR
)
find_library(LibIntl_LIBRARY
- NAMES intl libintl.a
+ NAMES intl libintl
)
if (LibIntl_INCLUDE_DIR)
set(CMAKE_REQUIRED_INCLUDES "${LibIntl_INCLUDE_DIR}")
endif()
-# This is required because some operating systems don't have a separate
-# libintl--it is built into glibc. So we only need to specify the library
-# if one was actually found.
+# On some systems (linux+glibc) libintl is passively available.
+# So only specify the library if one was found.
if (LibIntl_LIBRARY)
set(CMAKE_REQUIRED_LIBRARIES "${LibIntl_LIBRARY}")
endif()
@@ -46,12 +45,20 @@ check_c_source_compiles("
int main(int argc, char** argv) {
gettext(\"foo\");
+ ngettext(\"foo\", \"bar\", 1);
bindtextdomain(\"foo\", \"bar\");
bind_textdomain_codeset(\"foo\", \"bar\");
textdomain(\"foo\");
}" HAVE_WORKING_LIBINTL)
if (HAVE_WORKING_LIBINTL)
+ # On some systems (linux+glibc) libintl is passively available.
+ # If HAVE_WORKING_LIBINTL then we consider the requirement satisfied.
+ # Unset REQUIRED so that libfind_process(LibIntl) can proceed.
+ if(LibIntl_FIND_REQUIRED)
+ unset(LibIntl_FIND_REQUIRED)
+ endif()
+
check_variable_exists(_nl_msg_cat_cntr HAVE_NL_MSG_CAT_CNTR)
endif()
diff --git a/cmake/FindLibTermkey.cmake b/cmake/FindLibTermkey.cmake
index 144deceaae..66fd2e6c89 100644
--- a/cmake/FindLibTermkey.cmake
+++ b/cmake/FindLibTermkey.cmake
@@ -4,7 +4,7 @@
# LIBTERMKEY_INCLUDE_DIRS - The libtermkey include directories
# LIBTERMKEY_LIBRARIES - The libraries needed to use libtermkey
-if(NOT LIBTERMKEY_USE_BUNDLED)
+if(NOT USE_BUNDLED_LIBTERMKEY)
find_package(PkgConfig)
if (PKG_CONFIG_FOUND)
pkg_check_modules(PC_LIBTERMKEY QUIET termkey)
diff --git a/cmake/FindLibUV.cmake b/cmake/FindLibUV.cmake
index dcdd5e48b7..29eaf15b8e 100644
--- a/cmake/FindLibUV.cmake
+++ b/cmake/FindLibUV.cmake
@@ -8,7 +8,7 @@
# Set the LIBUV_USE_STATIC variable to specify if static libraries should
# be preferred to shared ones.
-if(NOT LIBUV_USE_BUNDLED)
+if(NOT USE_BUNDLED_LIBUV)
find_package(PkgConfig)
if (PKG_CONFIG_FOUND)
pkg_check_modules(PC_LIBUV QUIET libuv)
@@ -31,11 +31,7 @@ if(LIBUV_USE_STATIC)
"${CMAKE_STATIC_LIBRARY_PREFIX}uv${CMAKE_STATIC_LIBRARY_SUFFIX}")
endif(LIBUV_USE_STATIC)
-if(MSVC)
- list(APPEND LIBUV_NAMES libuv)
-else()
- list(APPEND LIBUV_NAMES uv)
-endif()
+list(APPEND LIBUV_NAMES uv)
find_library(LIBUV_LIBRARY NAMES ${LIBUV_NAMES}
HINTS ${PC_LIBUV_LIBDIR} ${PC_LIBUV_LIBRARY_DIRS}
@@ -65,7 +61,7 @@ if(HAVE_LIBKSTAT)
endif()
check_library_exists(kvm kvm_open "kvm.h" HAVE_LIBKVM)
-if(HAVE_LIBKVM)
+if(HAVE_LIBKVM AND NOT CMAKE_SYSTEM_NAME STREQUAL "OpenBSD")
list(APPEND LIBUV_LIBRARIES kvm)
endif()
diff --git a/cmake/FindLibVterm.cmake b/cmake/FindLibVterm.cmake
index 0d773d8896..2cbd3215c5 100644
--- a/cmake/FindLibVterm.cmake
+++ b/cmake/FindLibVterm.cmake
@@ -4,7 +4,7 @@
# LIBVTERM_INCLUDE_DIRS - The libvterm include directories
# LIBVTERM_LIBRARIES - The libraries needed to use libvterm
-if(NOT LIBVTERM_USE_BUNDLED)
+if(NOT USE_BUNDLED_LIBVTERM)
find_package(PkgConfig)
if (PKG_CONFIG_FOUND)
pkg_check_modules(PC_LIBVTERM QUIET vterm)
diff --git a/cmake/FindLua.cmake b/cmake/FindLua.cmake
new file mode 100644
index 0000000000..b669a49f29
--- /dev/null
+++ b/cmake/FindLua.cmake
@@ -0,0 +1,197 @@
+# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+#.rst:
+# FindLua
+# -------
+#
+#
+#
+# Locate Lua library This module defines
+#
+# ::
+#
+# LUA_FOUND - if false, do not try to link to Lua
+# LUA_LIBRARIES - both lua and lualib
+# LUA_INCLUDE_DIR - where to find lua.h
+# LUA_VERSION_STRING - the version of Lua found
+# LUA_VERSION_MAJOR - the major version of Lua
+# LUA_VERSION_MINOR - the minor version of Lua
+# LUA_VERSION_PATCH - the patch version of Lua
+#
+#
+#
+# Note that the expected include convention is
+#
+# ::
+#
+# #include "lua.h"
+#
+# and not
+#
+# ::
+#
+# #include <lua/lua.h>
+#
+# This is because, the lua location is not standardized and may exist in
+# locations other than lua/
+
+unset(_lua_include_subdirs)
+unset(_lua_library_names)
+unset(_lua_append_versions)
+
+# this is a function only to have all the variables inside go away automatically
+function(_lua_set_version_vars)
+ set(LUA_VERSIONS5 5.3 5.2 5.1 5.0)
+
+ if (Lua_FIND_VERSION_EXACT)
+ if (Lua_FIND_VERSION_COUNT GREATER 1)
+ set(_lua_append_versions ${Lua_FIND_VERSION_MAJOR}.${Lua_FIND_VERSION_MINOR})
+ endif ()
+ elseif (Lua_FIND_VERSION)
+ # once there is a different major version supported this should become a loop
+ if (NOT Lua_FIND_VERSION_MAJOR GREATER 5)
+ if (Lua_FIND_VERSION_COUNT EQUAL 1)
+ set(_lua_append_versions ${LUA_VERSIONS5})
+ else ()
+ foreach (subver IN LISTS LUA_VERSIONS5)
+ if (NOT subver VERSION_LESS ${Lua_FIND_VERSION})
+ list(APPEND _lua_append_versions ${subver})
+ endif ()
+ endforeach ()
+ endif ()
+ endif ()
+ else ()
+ # once there is a different major version supported this should become a loop
+ set(_lua_append_versions ${LUA_VERSIONS5})
+ endif ()
+
+ list(APPEND _lua_include_subdirs "include/lua" "include")
+
+ foreach (ver IN LISTS _lua_append_versions)
+ string(REGEX MATCH "^([0-9]+)\\.([0-9]+)$" _ver "${ver}")
+ list(APPEND _lua_include_subdirs
+ include/lua${CMAKE_MATCH_1}${CMAKE_MATCH_2}
+ include/lua${CMAKE_MATCH_1}.${CMAKE_MATCH_2}
+ include/lua-${CMAKE_MATCH_1}.${CMAKE_MATCH_2}
+ )
+ endforeach ()
+
+ set(_lua_include_subdirs "${_lua_include_subdirs}" PARENT_SCOPE)
+ set(_lua_append_versions "${_lua_append_versions}" PARENT_SCOPE)
+endfunction(_lua_set_version_vars)
+
+function(_lua_check_header_version _hdr_file)
+ # At least 5.[012] have different ways to express the version
+ # so all of them need to be tested. Lua 5.2 defines LUA_VERSION
+ # and LUA_RELEASE as joined by the C preprocessor, so avoid those.
+ file(STRINGS "${_hdr_file}" lua_version_strings
+ REGEX "^#define[ \t]+LUA_(RELEASE[ \t]+\"Lua [0-9]|VERSION([ \t]+\"Lua [0-9]|_[MR])).*")
+
+ string(REGEX REPLACE ".*;#define[ \t]+LUA_VERSION_MAJOR[ \t]+\"([0-9])\"[ \t]*;.*" "\\1" LUA_VERSION_MAJOR ";${lua_version_strings};")
+ if (LUA_VERSION_MAJOR MATCHES "^[0-9]+$")
+ string(REGEX REPLACE ".*;#define[ \t]+LUA_VERSION_MINOR[ \t]+\"([0-9])\"[ \t]*;.*" "\\1" LUA_VERSION_MINOR ";${lua_version_strings};")
+ string(REGEX REPLACE ".*;#define[ \t]+LUA_VERSION_RELEASE[ \t]+\"([0-9])\"[ \t]*;.*" "\\1" LUA_VERSION_PATCH ";${lua_version_strings};")
+ set(LUA_VERSION_STRING "${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}.${LUA_VERSION_PATCH}")
+ else ()
+ string(REGEX REPLACE ".*;#define[ \t]+LUA_RELEASE[ \t]+\"Lua ([0-9.]+)\"[ \t]*;.*" "\\1" LUA_VERSION_STRING ";${lua_version_strings};")
+ if (NOT LUA_VERSION_STRING MATCHES "^[0-9.]+$")
+ string(REGEX REPLACE ".*;#define[ \t]+LUA_VERSION[ \t]+\"Lua ([0-9.]+)\"[ \t]*;.*" "\\1" LUA_VERSION_STRING ";${lua_version_strings};")
+ endif ()
+ string(REGEX REPLACE "^([0-9]+)\\.[0-9.]*$" "\\1" LUA_VERSION_MAJOR "${LUA_VERSION_STRING}")
+ string(REGEX REPLACE "^[0-9]+\\.([0-9]+)[0-9.]*$" "\\1" LUA_VERSION_MINOR "${LUA_VERSION_STRING}")
+ string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]).*" "\\1" LUA_VERSION_PATCH "${LUA_VERSION_STRING}")
+ endif ()
+ foreach (ver IN LISTS _lua_append_versions)
+ if (ver STREQUAL "${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}")
+ set(LUA_VERSION_MAJOR ${LUA_VERSION_MAJOR} PARENT_SCOPE)
+ set(LUA_VERSION_MINOR ${LUA_VERSION_MINOR} PARENT_SCOPE)
+ set(LUA_VERSION_PATCH ${LUA_VERSION_PATCH} PARENT_SCOPE)
+ set(LUA_VERSION_STRING ${LUA_VERSION_STRING} PARENT_SCOPE)
+ return()
+ endif ()
+ endforeach ()
+endfunction(_lua_check_header_version)
+
+_lua_set_version_vars()
+
+if (LUA_INCLUDE_DIR AND EXISTS "${LUA_INCLUDE_DIR}/lua.h")
+ _lua_check_header_version("${LUA_INCLUDE_DIR}/lua.h")
+endif ()
+
+if (NOT LUA_VERSION_STRING)
+ foreach (subdir IN LISTS _lua_include_subdirs)
+ unset(LUA_INCLUDE_PREFIX CACHE)
+ find_path(LUA_INCLUDE_PREFIX ${subdir}/lua.h
+ HINTS
+ ENV LUA_DIR
+ PATHS
+ ~/Library/Frameworks
+ /Library/Frameworks
+ /sw # Fink
+ /opt/local # DarwinPorts
+ /opt/csw # Blastwave
+ /opt
+ )
+ if (LUA_INCLUDE_PREFIX)
+ _lua_check_header_version("${LUA_INCLUDE_PREFIX}/${subdir}/lua.h")
+ if (LUA_VERSION_STRING)
+ set(LUA_INCLUDE_DIR "${LUA_INCLUDE_PREFIX}/${subdir}")
+ break()
+ endif ()
+ endif ()
+ endforeach ()
+endif ()
+unset(_lua_include_subdirs)
+unset(_lua_append_versions)
+
+if (LUA_VERSION_STRING)
+ set(_lua_library_names
+ lua${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}
+ lua${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}
+ lua-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}
+ lua.${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}
+ )
+endif ()
+
+find_library(LUA_LIBRARY
+ NAMES ${_lua_library_names} lua
+ HINTS
+ ENV LUA_DIR
+ PATH_SUFFIXES lib
+ PATHS
+ ~/Library/Frameworks
+ /Library/Frameworks
+ /sw
+ /opt/local
+ /opt/csw
+ /opt
+)
+unset(_lua_library_names)
+
+if (LUA_LIBRARY)
+ # include the math library for Unix
+ if (UNIX AND NOT APPLE AND NOT BEOS)
+ find_library(LUA_MATH_LIBRARY m)
+ set(LUA_LIBRARIES "${LUA_LIBRARY};${LUA_MATH_LIBRARY}")
+
+ # include dl library for statically-linked Lua library
+ get_filename_component(LUA_LIB_EXT ${LUA_LIBRARY} EXT)
+ if(LUA_LIB_EXT STREQUAL CMAKE_STATIC_LIBRARY_SUFFIX)
+ list(APPEND LUA_LIBRARIES ${CMAKE_DL_LIBS})
+ endif()
+
+ # For Windows and Mac, don't need to explicitly include the math library
+ else ()
+ set(LUA_LIBRARIES "${LUA_LIBRARY}")
+ endif ()
+endif ()
+
+include(FindPackageHandleStandardArgs)
+# handle the QUIETLY and REQUIRED arguments and set LUA_FOUND to TRUE if
+# all listed variables are TRUE
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(Lua
+ REQUIRED_VARS LUA_LIBRARIES LUA_INCLUDE_DIR
+ VERSION_VAR LUA_VERSION_STRING)
+
+mark_as_advanced(LUA_INCLUDE_DIR LUA_LIBRARY LUA_MATH_LIBRARY)
diff --git a/cmake/FindLuaJit.cmake b/cmake/FindLuaJit.cmake
index e9ff53ab62..b8eda6388b 100644
--- a/cmake/FindLuaJit.cmake
+++ b/cmake/FindLuaJit.cmake
@@ -4,7 +4,7 @@
# LUAJIT_INCLUDE_DIRS - The luajit include directories
# LUAJIT_LIBRARIES - The libraries needed to use luajit
-if(NOT LUAJIT_USE_BUNDLED)
+if(NOT USE_BUNDLED_LUAJIT)
find_package(PkgConfig)
if (PKG_CONFIG_FOUND)
pkg_check_modules(PC_LUAJIT QUIET luajit)
diff --git a/cmake/FindMsgpack.cmake b/cmake/FindMsgpack.cmake
index 015737d658..cca0a00c20 100644
--- a/cmake/FindMsgpack.cmake
+++ b/cmake/FindMsgpack.cmake
@@ -4,7 +4,7 @@
# MSGPACK_INCLUDE_DIRS - The msgpack include directories
# MSGPACK_LIBRARIES - The libraries needed to use msgpack
-if(NOT MSGPACK_USE_BUNDLED)
+if(NOT USE_BUNDLED_MSGPACK)
find_package(PkgConfig)
if (PKG_CONFIG_FOUND)
pkg_search_module(PC_MSGPACK QUIET
@@ -42,7 +42,12 @@ if(MSGPACK_USE_STATIC)
"${CMAKE_STATIC_LIBRARY_PREFIX}msgpack${CMAKE_STATIC_LIBRARY_SUFFIX}")
endif()
-list(APPEND MSGPACK_NAMES msgpackc msgpack)
+if(MSVC)
+ # The import library for the msgpack DLL has a different name
+ list(APPEND MSGPACK_NAMES msgpackc_import)
+else()
+ list(APPEND MSGPACK_NAMES msgpackc msgpack)
+endif()
find_library(MSGPACK_LIBRARY NAMES ${MSGPACK_NAMES}
# Check each directory for all names to avoid using headers/libraries from
diff --git a/cmake/FindUnibilium.cmake b/cmake/FindUnibilium.cmake
index e1e0de9b7e..cf0ccda877 100644
--- a/cmake/FindUnibilium.cmake
+++ b/cmake/FindUnibilium.cmake
@@ -4,7 +4,7 @@
# UNIBILIUM_INCLUDE_DIRS - The unibilium include directories
# UNIBILIUM_LIBRARIES - The libraries needed to use unibilium
-if(NOT UNIBILIUM_USE_BUNDLED)
+if(NOT USE_BUNDLED_UNIBILIUM)
find_package(PkgConfig)
if (PKG_CONFIG_FOUND)
pkg_check_modules(PC_UNIBILIUM QUIET unibilium)
diff --git a/cmake/FindWinpty.cmake b/cmake/FindWinpty.cmake
new file mode 100644
index 0000000000..8feafc58a8
--- /dev/null
+++ b/cmake/FindWinpty.cmake
@@ -0,0 +1,10 @@
+include(LibFindMacros)
+
+find_path(WINPTY_INCLUDE_DIR winpty.h)
+set(WINPTY_INCLUDE_DIRS ${WINPTY_INCLUDE_DIR})
+
+find_library(WINPTY_LIBRARY winpty)
+find_program(WINPTY_AGENT_EXE winpty-agent.exe)
+set(WINPTY_LIBRARIES ${WINPTY_LIBRARY})
+
+find_package_handle_standard_args(Winpty DEFAULT_MSG WINPTY_LIBRARY WINPTY_INCLUDE_DIR)
diff --git a/cmake/GenerateHelptags.cmake.in b/cmake/GenerateHelptags.cmake.in
deleted file mode 100644
index 3ced2c0b17..0000000000
--- a/cmake/GenerateHelptags.cmake.in
+++ /dev/null
@@ -1,39 +0,0 @@
-if(DEFINED ENV{DESTDIR})
- file(TO_CMAKE_PATH
- $ENV{DESTDIR}/@CMAKE_INSTALL_FULL_DATADIR@/nvim/runtime/doc
- HELPTAGS_WORKING_DIRECTORY)
-else()
- file(TO_CMAKE_PATH
- @CMAKE_INSTALL_FULL_DATADIR@/nvim/runtime/doc
- HELPTAGS_WORKING_DIRECTORY)
-endif()
-
-message(STATUS "Generating helptags in ${HELPTAGS_WORKING_DIRECTORY}.")
-if(EXISTS ${HELPTAGS_WORKING_DIRECTORY}/)
- message(STATUS "${HELPTAGS_WORKING_DIRECTORY} already exists")
- # If the doc directory already exists, helptags could fail due to duplicate
- # tags. Tell the user to remove the directory and try again.
- set(TROUBLESHOOTING "\nRemove \"${HELPTAGS_WORKING_DIRECTORY}\" and try again.")
-endif()
-
-# Workaround for hanging "yes | nvim -c 'helptags ++t .'"
-# and therefore hanging "yes | make install":
-# Set INPUT_FILE to an empty file, causing execute_process
-# to disregard other standard input (such as "yes |").
-set(EMPTY_FILE ${CMAKE_CURRENT_BINARY_DIR}/.GenerateHelptags)
-file(WRITE ${EMPTY_FILE} "")
-execute_process(
- COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/nvim
- -u NONE
- -es
- -c "helptags ++t ."
- -c quit
- WORKING_DIRECTORY ${HELPTAGS_WORKING_DIRECTORY}
- INPUT_FILE ${EMPTY_FILE}
- OUTPUT_VARIABLE err
- ERROR_VARIABLE err
- RESULT_VARIABLE res)
-
-if(NOT res EQUAL 0)
- message(FATAL_ERROR "Generating helptags failed: ${err} - ${res}${TROUBLESHOOTING}")
-endif()
diff --git a/cmake/GetCompileFlags.cmake b/cmake/GetCompileFlags.cmake
index e0994b67bc..527bc88cdd 100644
--- a/cmake/GetCompileFlags.cmake
+++ b/cmake/GetCompileFlags.cmake
@@ -38,6 +38,7 @@ function(get_compile_flags _compile_flags)
get_directory_property(include_directories_list
DIRECTORY "src/nvim"
INCLUDE_DIRECTORIES)
+ list(REMOVE_DUPLICATES include_directories_list)
foreach(include_directory ${include_directories_list})
set(include_directories "${include_directories} -I${include_directory}")
endforeach()
diff --git a/cmake/InstallClintErrors.cmake b/cmake/InstallClintErrors.cmake
new file mode 100644
index 0000000000..bd5ca07828
--- /dev/null
+++ b/cmake/InstallClintErrors.cmake
@@ -0,0 +1,2 @@
+file(GLOB_RECURSE JSON_FILES *.json)
+file(COPY ${JSON_FILES} DESTINATION "${TARGET}")
diff --git a/cmake/InstallHelpers.cmake b/cmake/InstallHelpers.cmake
index ee07ba2c66..bebc0d0d17 100644
--- a/cmake/InstallHelpers.cmake
+++ b/cmake/InstallHelpers.cmake
@@ -1,3 +1,12 @@
+# Fix CMAKE_INSTALL_MANDIR on BSD before including GNUInstallDirs. #6771
+if(CMAKE_SYSTEM_NAME MATCHES "BSD" AND NOT DEFINED CMAKE_INSTALL_MANDIR)
+ if(DEFINED ENV{MANPREFIX})
+ set(CMAKE_INSTALL_MANDIR "$ENV{MANPREFIX}/man")
+ elseif(CMAKE_INSTALL_PREFIX MATCHES "^/usr/local$")
+ set(CMAKE_INSTALL_MANDIR "man")
+ endif()
+endif()
+
# For $CMAKE_INSTALL_{DATAROOT,MAN, ...}DIR
include(GNUInstallDirs)
diff --git a/cmake/LuaHelpers.cmake b/cmake/LuaHelpers.cmake
index 32f7e46a57..0239460f2b 100644
--- a/cmake/LuaHelpers.cmake
+++ b/cmake/LuaHelpers.cmake
@@ -4,9 +4,8 @@
# Check if a module is available in Lua
function(check_lua_module LUA_PRG_PATH MODULE RESULT_VAR)
- execute_process(COMMAND ${LUA_PRG_PATH} -e "require('${MODULE}')"
- RESULT_VARIABLE module_missing
- ERROR_QUIET)
+ execute_process(COMMAND ${LUA_PRG_PATH} -l "${MODULE}" -e ""
+ RESULT_VARIABLE module_missing)
if(module_missing)
set(${RESULT_VAR} False PARENT_SCOPE)
else()
@@ -18,7 +17,7 @@ endfunction()
function(check_lua_deps LUA_PRG_PATH MODULES RESULT_VAR)
# Check if the lua interpreter at the given path
# satisfies all Neovim dependencies
- message(STATUS "Checking Lua interpreter ${LUA_PRG_PATH}")
+ message(STATUS "Checking Lua interpreter: ${LUA_PRG_PATH}")
if(NOT EXISTS ${LUA_PRG_PATH})
message(STATUS
"[${LUA_PRG_PATH}] file not found")
diff --git a/cmake/PreventInTreeBuilds.cmake b/cmake/PreventInTreeBuilds.cmake
new file mode 100644
index 0000000000..9c0ce1c0a2
--- /dev/null
+++ b/cmake/PreventInTreeBuilds.cmake
@@ -0,0 +1,23 @@
+function(PreventInTreeBuilds)
+ get_filename_component(srcdir "${CMAKE_SOURCE_DIR}" REALPATH)
+ get_filename_component(bindir "${CMAKE_BINARY_DIR}" REALPATH)
+
+ if("${srcdir}" STREQUAL "${bindir}")
+ message("")
+ message("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+ message("Neovim doesn't support in-tree builds. It's recommended that you")
+ message("use a build/ subdirectory:")
+ message(" mkdir build")
+ message(" cd build")
+ message(" cmake <OPTIONS> ..")
+ message("")
+ message("Make sure to cleanup some CMake artifacts from this failed build")
+ message("with:")
+ message(" rm -rf CMakeFiles CMakeCache.txt")
+ message("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+ message("")
+ message(FATAL_ERROR "Stopping build.")
+ endif()
+endfunction()
+
+PreventInTreeBuilds()
diff --git a/cmake/RunLint.cmake b/cmake/RunLint.cmake
deleted file mode 100644
index 306e938232..0000000000
--- a/cmake/RunLint.cmake
+++ /dev/null
@@ -1,32 +0,0 @@
-get_filename_component(LINT_DIR ${LINT_DIR} ABSOLUTE)
-get_filename_component(LINT_PREFIX ${LINT_DIR} PATH)
-set(LINT_SUPPRESS_FILE "${LINT_PREFIX}/errors.json")
-
-if(DEFINED ENV{LINT_FILE})
- file(GLOB_RECURSE LINT_FILES "$ENV{LINT_FILE}")
-else()
- file(GLOB_RECURSE LINT_FILES ${LINT_DIR}/*.c ${LINT_DIR}/*.h)
-endif()
-
-set(LINT_ARGS)
-
-if(LINT_SUPPRESS_URL)
- file(DOWNLOAD ${LINT_SUPPRESS_URL} ${LINT_SUPPRESS_FILE})
- list(APPEND LINT_ARGS "--suppress-errors=${LINT_SUPPRESS_FILE}")
-endif()
-
-foreach(lint_file ${LINT_FILES})
- file(RELATIVE_PATH lint_file "${LINT_PREFIX}" "${lint_file}")
- list(APPEND LINT_ARGS "${lint_file}")
-endforeach()
-
-execute_process(
- COMMAND ${LINT_PRG} ${LINT_ARGS}
- RESULT_VARIABLE res
- WORKING_DIRECTORY "${LINT_PREFIX}")
-
-file(REMOVE ${LINT_SUPPRESS_FILE})
-
-if(NOT res EQUAL 0)
- message(FATAL_ERROR "Linting failed: ${res}.")
-endif()
diff --git a/cmake/RunLuacheck.cmake b/cmake/RunLuacheck.cmake
new file mode 100644
index 0000000000..4887e562a5
--- /dev/null
+++ b/cmake/RunLuacheck.cmake
@@ -0,0 +1,22 @@
+set(LUACHECK_ARGS -q "${LUAFILES_DIR}")
+if(DEFINED IGNORE_PATTERN)
+ list(APPEND LUACHECK_ARGS --exclude-files "${LUAFILES_DIR}/${IGNORE_PATTERN}")
+endif()
+if(DEFINED CHECK_PATTERN)
+ list(APPEND LUACHECK_ARGS --include-files "${LUAFILES_DIR}/${CHECK_PATTERN}")
+endif()
+if(DEFINED READ_GLOBALS)
+ list(APPEND LUACHECK_ARGS --read-globals "${READ_GLOBALS}")
+endif()
+
+execute_process(
+ COMMAND "${LUACHECK_PRG}" ${LUACHECK_ARGS}
+ WORKING_DIRECTORY "${LUAFILES_DIR}"
+ ERROR_VARIABLE err
+ RESULT_VARIABLE res
+)
+
+if(NOT res EQUAL 0)
+ message(STATUS "Output to stderr:\n${err}")
+ message(FATAL_ERROR "Linting tests failed with error: ${res}")
+endif()
diff --git a/cmake/RunTests.cmake b/cmake/RunTests.cmake
index 0858ea24ac..05c429c1f5 100644
--- a/cmake/RunTests.cmake
+++ b/cmake/RunTests.cmake
@@ -1,10 +1,17 @@
-get_filename_component(BUSTED_DIR ${BUSTED_PRG} PATH)
-set(ENV{PATH} "${BUSTED_DIR}:$ENV{PATH}")
+# Set LC_ALL to meet expectations of some locale-sensitive tests.
+set(ENV{LC_ALL} "en_US.UTF-8")
set(ENV{VIMRUNTIME} ${WORKING_DIR}/runtime)
+set(ENV{NVIM_RPLUGIN_MANIFEST} ${WORKING_DIR}/Xtest_rplugin_manifest)
+set(ENV{XDG_CONFIG_HOME} ${WORKING_DIR}/Xtest_xdg/config)
+set(ENV{XDG_DATA_HOME} ${WORKING_DIR}/Xtest_xdg/share)
+
+if(NOT DEFINED ENV{NVIM_LOG_FILE})
+ set(ENV{NVIM_LOG_FILE} ${WORKING_DIR}/.nvimlog)
+endif()
if(NVIM_PRG)
- set(ENV{NVIM_PROG} "${NVIM_PRG}")
+ set(ENV{NVIM_PRG} "${NVIM_PRG}")
endif()
if(DEFINED ENV{TEST_FILE})
@@ -17,24 +24,34 @@ if(BUSTED_OUTPUT_TYPE STREQUAL junit)
set(EXTRA_ARGS OUTPUT_FILE ${BUILD_DIR}/${TEST_TYPE}test-junit.xml)
endif()
-if(DEFINED ENV{TEST_TAG})
+if(DEFINED ENV{TEST_TAG} AND NOT "$ENV{TEST_TAG}" STREQUAL "")
set(TEST_TAG "--tags=$ENV{TEST_TAG}")
endif()
-if(DEFINED ENV{TEST_FILTER})
- set(TEST_TAG "--filter=$ENV{TEST_FILTER}")
+if(DEFINED ENV{TEST_FILTER} AND NOT "$ENV{TEST_FILTER}" STREQUAL "")
+ set(TEST_FILTER "--filter=$ENV{TEST_FILTER}")
endif()
+execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${WORKING_DIR}/Xtest-tmpdir)
+set(ENV{TMPDIR} ${WORKING_DIR}/Xtest-tmpdir)
+set(ENV{SYSTEM_NAME} ${SYSTEM_NAME})
execute_process(
COMMAND ${BUSTED_PRG} ${TEST_TAG} ${TEST_FILTER} -v -o ${BUSTED_OUTPUT_TYPE}
- --lazy --helper=${TEST_DIR}/${TEST_TYPE}/preload.lua
- --lpath=${BUILD_DIR}/?.lua ${TEST_PATH}
+ --lua=${LUA_PRG} --lazy --helper=${TEST_DIR}/${TEST_TYPE}/preload.lua
+ --lpath=${BUILD_DIR}/?.lua
+ --lpath=${WORKING_DIR}/runtime/lua/?.lua
+ --lpath=?.lua
+ ${TEST_PATH}
WORKING_DIRECTORY ${WORKING_DIR}
ERROR_VARIABLE err
RESULT_VARIABLE res
${EXTRA_ARGS})
+file(REMOVE ${WORKING_DIR}/Xtest_rplugin_manifest)
+file(REMOVE_RECURSE ${WORKING_DIR}/Xtest_xdg)
+file(REMOVE_RECURSE ${WORKING_DIR}/Xtest-tmpdir)
+
if(NOT res EQUAL 0)
message(STATUS "Output to stderr:\n${err}")
- message(FATAL_ERROR "Running ${TEST_TYPE} tests failed with error: ${res}.")
+ message(FATAL_ERROR "${TEST_TYPE} tests failed with error: ${res}")
endif()
diff --git a/cmake/RunTestsLint.cmake b/cmake/RunTestsLint.cmake
deleted file mode 100644
index addc9ab35e..0000000000
--- a/cmake/RunTestsLint.cmake
+++ /dev/null
@@ -1,13 +0,0 @@
-set(IGNORE_FILES "${TEST_DIR}/*/preload.lua")
-
-execute_process(
- COMMAND ${LUACHECK_PRG} -q ${TEST_DIR} --exclude-files ${IGNORE_FILES}
- WORKING_DIRECTORY ${TEST_DIR}
- ERROR_VARIABLE err
- RESULT_VARIABLE res
- ${EXTRA_ARGS})
-
-if(NOT res EQUAL 0)
- message(STATUS "Output to stderr:\n${err}")
- message(FATAL_ERROR "Linting tests failed with error: ${res}.")
-endif()
diff --git a/cmake/WindowsDllCopy.cmake b/cmake/WindowsDllCopy.cmake
new file mode 100644
index 0000000000..fbbabf3a0c
--- /dev/null
+++ b/cmake/WindowsDllCopy.cmake
@@ -0,0 +1,30 @@
+# In Windows we need to find dependency DLLs and install them along with our
+# binaries. This script uses the following variables:
+#
+# - BINARY: The binary file whose dependencies need to be installed
+# - DST: The destination path
+# - CMAKE_PREFIX_PATH: A list of directories to search for dependencies
+
+if(NOT DEFINED BINARY)
+ message(FATAL_ERROR "Missing required argument -DBINARY=")
+endif()
+if(NOT DEFINED DST)
+ message(FATAL_ERROR "Missing required arguments -DDST=")
+endif()
+if(NOT DEFINED CMAKE_PREFIX_PATH)
+ message(FATAL_ERROR "Missing required arguments -DCMAKE_PREFIX_PATH=")
+endif()
+
+include(GetPrerequisites)
+get_prerequisites(${BINARY} DLLS 1 1 "" "${CMAKE_PREFIX_PATH}")
+foreach(DLL_NAME ${DLLS})
+ find_program(DLL_PATH ${DLL_NAME})
+ if(NOT DLL_PATH)
+ message(FATAL_ERROR "Unable to find dependency ${DLL_NAME}")
+ endif()
+
+ message("Copying ${DLL_NAME} to ${DST}")
+ execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${DLL_PATH} ${DST})
+ unset(DLL_PATH CACHE)
+endforeach()
+
diff --git a/codecov.yml b/codecov.yml
new file mode 100644
index 0000000000..8ce9a2bb38
--- /dev/null
+++ b/codecov.yml
@@ -0,0 +1,32 @@
+codecov:
+ notify:
+ require_ci_to_pass: no
+ ci:
+ - appveyor
+ - travis
+ - !neovim-qb.szakmeister.net
+
+coverage:
+ precision: 2
+ round: down
+ range: "70...100"
+
+ status:
+ project: yes
+ default:
+ threshold: 1
+ patch:
+ default:
+ threshold: 1
+ only_pulls: true
+ changes: no
+
+parsers:
+ gcov:
+ branch_detection:
+ conditional: yes
+ loop: yes
+ method: no
+ macro: no
+
+comment: off
diff --git a/config/CMakeLists.txt b/config/CMakeLists.txt
index cf84f8c6a4..63cb3cc0d6 100644
--- a/config/CMakeLists.txt
+++ b/config/CMakeLists.txt
@@ -12,6 +12,11 @@ check_type_size("size_t" SIZEOF_SIZE_T)
check_type_size("long long" SIZEOF_LONG_LONG)
check_type_size("void *" SIZEOF_VOID_PTR)
+if (CMAKE_HOST_SYSTEM_VERSION MATCHES ".*-Microsoft")
+ # Windows Subsystem for Linux
+ set(HAVE_WSL 1)
+endif()
+
check_symbol_exists(_NSGetEnviron crt_externs.h HAVE__NSGETENVIRON)
# Headers
@@ -26,6 +31,7 @@ if(NOT HAVE_SYS_WAIT_H AND UNIX)
message(SEND_ERROR "header sys/wait.h is required for Unix")
endif()
check_include_files(sys/utsname.h HAVE_SYS_UTSNAME_H)
+check_include_files(termios.h HAVE_TERMIOS_H)
check_include_files(utime.h HAVE_UTIME_H)
check_include_files(sys/uio.h HAVE_SYS_UIO_H)
@@ -142,12 +148,16 @@ configure_file (
find_program(WHOAMI_PROG whoami)
find_program(HOSTNAME_PROG hostname)
-if (NOT DEFINED USERNAME AND EXISTS ${WHOAMI_PROG})
+if (DEFINED ENV{USERNAME})
+ set(USERNAME $ENV{USERNAME})
+elseif (NOT DEFINED USERNAME AND EXISTS ${WHOAMI_PROG})
execute_process(COMMAND ${WHOAMI_PROG}
OUTPUT_STRIP_TRAILING_WHITESPACE
OUTPUT_VARIABLE USERNAME)
endif()
-if (EXISTS ${HOSTNAME_PROG})
+if (DEFINED ENV{HOSTNAME})
+ set(HOSTNAME $ENV{HOSTNAME})
+elseif (EXISTS ${HOSTNAME_PROG})
execute_process(COMMAND ${HOSTNAME_PROG}
OUTPUT_STRIP_TRAILING_WHITESPACE
OUTPUT_VARIABLE HOSTNAME)
diff --git a/config/config.h.in b/config/config.h.in
index 4c35b3b1cb..106013425d 100644
--- a/config/config.h.in
+++ b/config/config.h.in
@@ -43,10 +43,12 @@
#cmakedefine HAVE_STRNCASECMP
#cmakedefine HAVE_SYS_UTSNAME_H
#cmakedefine HAVE_SYS_WAIT_H
+#cmakedefine HAVE_TERMIOS_H
#cmakedefine HAVE_UTIME
#cmakedefine HAVE_UTIME_H
#cmakedefine HAVE_UTIMES
#cmakedefine HAVE_WORKING_LIBINTL
+#cmakedefine HAVE_WSL
#cmakedefine UNIX
#cmakedefine USE_FNAME_CASE
#cmakedefine HAVE_SYS_UIO_H
@@ -61,10 +63,13 @@
#ifndef UNIT_TESTING
#cmakedefine HAVE_JEMALLOC
+#cmakedefine LOG_LIST_ACTIONS
#endif
#cmakedefine HAVE_BE64TOH
#cmakedefine ORDER_BIG_ENDIAN
#define ENDIAN_INCLUDE_FILE <@ENDIAN_INCLUDE_FILE@>
+#cmakedefine HAVE_EXECINFO_BACKTRACE
+
#endif // AUTO_CONFIG_H
diff --git a/config/pathdef.c.in b/config/pathdef.c.in
index 4579fbe455..41950f5ac5 100644
--- a/config/pathdef.c.in
+++ b/config/pathdef.c.in
@@ -1,3 +1,5 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
#include "${PROJECT_SOURCE_DIR}/src/nvim/vim.h"
char *default_vim_dir = "${CMAKE_INSTALL_FULL_DATAROOTDIR}/nvim";
char *default_vimruntime_dir = "";
diff --git a/config/versiondef.h.in b/config/versiondef.h.in
index c91bb29c90..b9565735b3 100644
--- a/config/versiondef.h.in
+++ b/config/versiondef.h.in
@@ -7,6 +7,10 @@
#define NVIM_VERSION_PRERELEASE "@NVIM_VERSION_PRERELEASE@"
#cmakedefine NVIM_VERSION_MEDIUM "@NVIM_VERSION_MEDIUM@"
+#define NVIM_API_LEVEL @NVIM_API_LEVEL@
+#define NVIM_API_LEVEL_COMPAT @NVIM_API_LEVEL_COMPAT@
+#define NVIM_API_PRERELEASE @NVIM_API_PRERELEASE@
+
#define NVIM_VERSION_CFLAGS "@NVIM_VERSION_CFLAGS@"
#define NVIM_VERSION_BUILD_TYPE "@NVIM_VERSION_BUILD_TYPE@"
diff --git a/contrib/YouCompleteMe/README.md b/contrib/YouCompleteMe/README.md
index 0c07440a44..345a9d8d12 100644
--- a/contrib/YouCompleteMe/README.md
+++ b/contrib/YouCompleteMe/README.md
@@ -2,7 +2,9 @@
## What is this?
-This provides the code necessary to configure vim's YCM plugin to provide C semantic support (completion, go-to-definition, etc) for developers working on the Neovim project.
+This provides the code necessary to configure vim's YCM plugin to provide C
+semantic support (completion, go-to-definition, etc) for developers working on
+the Neovim project.
## Installation
@@ -13,10 +15,17 @@ Install [YouCompleteMe](https://github.com/Valloric/YouCompleteMe).
### Step 2
```bash
-cp contrib/YouCompleteMe/ycm_extra_conf.py src/.ycm_extra_conf.py
+cp contrib/YouCompleteMe/ycm_extra_conf.py .ycm_extra_conf.py
echo .ycm_extra_conf.py >> .git/info/exclude
make
+```
+
+Tip: to improve source code navigation, add something like this to your nvim
+configuration:
-(Add the following somewhere in your vimrc)
-autocmd FileType c nnoremap <buffer> <silent> <C-]> :YcmCompleter GoTo<cr>
+```vim
+au FileType c,cpp nnoremap <buffer> <c-]> :YcmCompleter GoTo<CR>
```
+
+And use `ctrl+]` when the cursor is positioned in a symbol to quickly jump to a
+definition or declaration.
diff --git a/contrib/YouCompleteMe/ycm_extra_conf.py b/contrib/YouCompleteMe/ycm_extra_conf.py
index 7c54677c8f..e436609ce2 100644
--- a/contrib/YouCompleteMe/ycm_extra_conf.py
+++ b/contrib/YouCompleteMe/ycm_extra_conf.py
@@ -9,47 +9,57 @@ def DirectoryOfThisScript():
def GetDatabase():
compilation_database_folder = os.path.join(DirectoryOfThisScript(),
- '..', 'build')
+ 'build')
if os.path.exists(compilation_database_folder):
return ycm_core.CompilationDatabase(compilation_database_folder)
return None
-def IsHeaderFile(filename):
- extension = os.path.splitext(filename)[1]
- return extension == '.h'
-
-
def GetCompilationInfoForFile(filename):
database = GetDatabase()
if not database:
return None
- if IsHeaderFile(filename):
- basename = os.path.splitext(filename)[0]
- c_file = basename + '.c'
- # for pure headers (no c file), default to main.c
- if not os.path.exists(c_file):
- c_file = os.path.join(DirectoryOfThisScript(), 'nvim', 'main.c')
- if os.path.exists(c_file):
- compilation_info = database.GetCompilationInfoForFile(c_file)
- if compilation_info.compiler_flags_:
- return compilation_info
- return None
return database.GetCompilationInfoForFile(filename)
+# It seems YCM does not resolve directories correctly. This function will
+# adjust paths in the compiler flags to be absolute
+def FixDirectories(args, compiler_working_dir):
+ def adjust_path(path):
+ return os.path.abspath(os.path.join(compiler_working_dir, path))
+
+ adjust_next_arg = False
+ new_args = []
+ for arg in args:
+ if adjust_next_arg:
+ arg = adjust_path(arg)
+ adjust_next_arg = False
+ else:
+ for dir_flag in ['-I', '-isystem', '-o', '-c']:
+ if arg.startswith(dir_flag):
+ if arg != dir_flag:
+ # flag and path are concatenated in same arg
+ path = arg[len(dir_flag):]
+ new_path = adjust_path(path)
+ arg = '{0}{1}'.format(dir_flag, new_path)
+ else:
+ # path is specified in next argument
+ adjust_next_arg = True
+ new_args.append(arg)
+ return new_args
+
+
def FlagsForFile(filename):
compilation_info = GetCompilationInfoForFile(filename)
if not compilation_info:
return None
# Add flags not needed for clang-the-binary,
# but needed for libclang-the-library (YCM uses this last one).
- flags = (list(compilation_info.compiler_flags_)
- if compilation_info.compiler_flags_
- else [])
+ flags = FixDirectories((list(compilation_info.compiler_flags_)
+ if compilation_info.compiler_flags_
+ else []), compilation_info.compiler_working_dir_)
extra_flags = ['-Wno-newline-eof']
- final_flags = flags + extra_flags
return {
- 'flags': final_flags,
+ 'flags': flags + extra_flags,
'do_cache': True
}
diff --git a/contrib/local.mk.example b/contrib/local.mk.example
index a0b2d034e1..c347eb9e0d 100644
--- a/contrib/local.mk.example
+++ b/contrib/local.mk.example
@@ -13,27 +13,21 @@
# Sets the build type; defaults to Debug. Valid values:
#
-# - Debug: Disables optimizations (-O0), enables debug information and logging.
+# - Debug: Disables optimizations (-O0), enables debug information.
#
-# - Dev: Enables all optimizations that do not interfere with
-# debugging (-Og if available, -O2 and -g if not).
-# Enables debug information and logging.
-#
-# - RelWithDebInfo: Enables optimizations (-O2) and debug information.
-# Disables logging.
+# - RelWithDebInfo: Enables optimizations (-Og or -O2) with debug information.
#
# - MinSizeRel: Enables all -O2 optimization that do not typically
# increase code size, and performs further optimizations
# designed to reduce code size (-Os).
-# Disables debug information and logging.
+# Disables debug information.
#
# - Release: Same as RelWithDebInfo, but disables debug information.
#
# CMAKE_BUILD_TYPE := Debug
-# By default, nvim's log level is INFO (1) (unless CMAKE_BUILD_TYPE is
-# "Release", in which case logging is disabled).
-# The log level must be a number DEBUG (0), INFO (1), WARNING (2) or ERROR (3).
+# Log levels: 0 (DEBUG), 1 (INFO), 2 (WARNING), 3 (ERROR)
+# Default is 1 (INFO) unless CMAKE_BUILD_TYPE is Release or RelWithDebInfo.
# CMAKE_EXTRA_FLAGS += -DMIN_LOG_LEVEL=1
# By default, nvim uses bundled versions of its required third-party
@@ -42,7 +36,6 @@
# them.
#
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_BUSTED=OFF
-# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_DEPS=OFF
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_JEMALLOC=OFF
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_LIBTERMKEY=OFF
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_LIBUV=OFF
@@ -51,6 +44,10 @@
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_LUAROCKS=OFF
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_MSGPACK=OFF
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_UNIBILIUM=OFF
+#
+# Or disable all bundled dependencies at once.
+#
+# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED=OFF
# By default, bundled libraries are statically linked to nvim.
# This has no effect for non-bundled deps, which are always dynamically linked.
@@ -62,3 +59,12 @@
# CMAKE_EXTRA_FLAGS += -DLIBVTERM_USE_STATIC=OFF
# CMAKE_EXTRA_FLAGS += -DLUAJIT_USE_STATIC=OFF
# CMAKE_EXTRA_FLAGS += -DMSGPACK_USE_STATIC=OFF
+#
+#
+# .DEFAULT_GOAL := nvim
+#
+# Run doxygen over the source code.
+# Output will be in build/doxygen
+#
+# doxygen:
+# doxygen src/Doxyfile
diff --git a/man/nvim.1 b/man/nvim.1
index 2fa3ab8ff5..4d338321c4 100644
--- a/man/nvim.1
+++ b/man/nvim.1
@@ -1,4 +1,4 @@
-.Dd January 28, 2016
+.Dd December 17, 2017
.Dt NVIM 1
.Os
.Sh NAME
@@ -20,41 +20,52 @@
.Sh DESCRIPTION
.Nm
is a text editor based on Vim.
-To enter commands in
-.Nm ,
-type a colon
-.Pq Sq \&:
-which is also used in this manual to denote commands.
-For more information, consult the on-line help system with the
-.Ic :help
-command.
+Start
+.Nm
+followed by any number of options and/or files:
+.Pp
+.Dl nvim [options] [file ...]
+.Pp
+Commands in
+.Nm
+begin with colon
+.Pq Sq \&: .
+Type ":help subject" to get help on a specific subject.
+Use <Tab> and CTRL-D to complete subjects (":help cmdline\-completion").
+.Pp
+The "quickref" help section is a condensed reference of editor features:
+.Dl :help quickref
+.Pp
+If you are new to Vim/Nvim, start with the 30-minute tutorial:
+.Dl :Tutor
+.Pp
+After installing/updating Nvim, it's a good idea to run the self-check:
+.Dl :checkhealth
+.Pp
.Bl -tag -width Fl
.It Ar file ...
File(s) to edit.
-If none are specified, open an empty buffer.
-If multiple files are specified, open one buffer for each file.
+Opens one buffer per file.
To switch between buffers, use the
.Ic :next
and
.Ic :previous
commands.
.It Fl
-Read text from standard input until
+Reads text from standard input until
.Dv EOF ,
-then open a buffer with that text.
-Commands are read from standard error, which should be a terminal.
+then opens a buffer with that text.
+User input is read from standard error, which should be a terminal.
+.El
+.Sh OPTIONS
+.Bl -tag -width Fl
.It Fl t Ar tag
-The file to edit and the initial cursor position depends on a
-tag, a sort of goto label.
+Finds
.Ar tag
-is looked up in the tags file, the associated file becomes the current
+in the tags file, the associated file becomes the current
file and the associated command is executed.
-If
-.Ar tag
-is a function name, the file containing that function is opened
-with the cursor positioned at the start of the function.
-See
-.Ic :help tag-commands .
+Cursor is positioned at the tag location in the file.
+.Ic ":help tag-commands"
.It Fl q Op Ar errorfile
QuickFix mode.
Display the first error in
@@ -66,96 +77,80 @@ is omitted, the value of the 'errorfile' option is used (defaults to
Further errors can be jumped to with the
.Ic :cnext
command.
-See
-.Ic :help quickfix .
-.It There are a number of other options:
+.Ic ":help quickfix"
.It Fl -
-Interpret all further arguments as files.
-Can be used to edit files starting with a hyphen
+End of options.
+Remaining arguments are treated as literal file names, including filenames starting with hyphen
.Pq Sq - .
-.It Fl -literal
-Interpret filenames literally, that is, do not expand wildcards.
-Has no effect on Unix-like systems, where the shell expands wildcards.
.It Fl e
-Ex mode.
-See
-.Ic :help Ex-mode .
+Ex mode, reading stdin as Ex commands.
+.Ic ":help Ex-mode"
.It Fl E
-Improved Ex mode.
-See
-.Ic :help gQ .
-.It Fl s
-Silent mode.
-Only takes effect if
-.Fl e
-or
-.Fl E
-is specified before it.
+Ex mode, reading stdin as text.
+.Ic :help Ex-mode
+.It Fl es
+Silent/batch mode, reading stdin as Ex commands.
+.Ic :help silent-mode
+.It Fl \&Es
+Silent/batch mode, reading stdin as text.
+.Ic :help silent-mode
.It Fl d
Diff mode.
Show the difference between two to four files, similar to
.Xr sdiff 1 .
-See
-.Ic :help diff .
+.Ic ":help diff"
.It Fl R
Read-only mode.
-Sets the option 'readonly'.
+Sets the 'readonly' option.
Implies
.Fl n .
Buffers can still be edited, but cannot be written to disk if already
associated with a file.
-To overwrite a file, add an exclamation mark to the needed Ex command, such as
+To overwrite a file, add an exclamation mark to the relevant Ex command, such as
.Ic :w! .
-See
-.Ic :help 'readonly' .
+.Ic ":help 'readonly'"
.It Fl Z
Restricted mode.
Disable commands that make use of an external shell.
.It Fl m
-Disable file modifications.
-Unsets the option 'write'.
+Resets the 'write' option, to disable file modifications.
Writing to a file is disabled, but buffers can still be modified.
.It Fl M
-Disable file and buffer modifications.
-Unsets the options 'write' and 'modifiable'.
-Note that these options can be set to re-enable making modifications.
+Resets the 'write' and 'modifiable' options, to disable file and buffer
+modifications.
.It Fl b
Binary mode.
-See
-.Ic :help edit-binary .
+.Ic ":help edit-binary"
.It Fl l
Lisp mode.
-Sets the options 'lisp' and 'showmatch'.
+Sets the 'lisp' and 'showmatch' options.
.It Fl A
Arabic mode.
-Sets the option 'arabic'.
-.It Fl F
-Farsi mode.
-Sets the options 'fkmap' and 'rightleft'.
+Sets the 'arabic' option.
.It Fl H
Hebrew mode.
-Sets the options 'hkmap' and 'rightleft'.
+Sets the 'hkmap' and 'rightleft' options.
.It Fl V Ns Oo Ar N Oc Ns Op Ar file
Verbose mode.
-Print messages about which files are being sourced and for reading and
-writing a ShaDa file.
+Prints debug messages.
.Ar N
-is the value for the 'verbose' option; defaults to
-.Cm 10
-if omitted.
+is the 'verbose' level, defaults to
+.Cm 10 .
If
.Ar file
is specified, append messages to
.Ar file
instead of printing them.
+.Ic ":help 'verbose'"
.It Fl D
-Debugging mode.
+Debug mode for VimL (Vim script).
Started when executing the first command from a script.
+:help debug-mode
.It Fl n
Disable the use of swap files.
-Sets the option 'updatecount' to
+Sets the 'updatecount' option to
.Cm 0 .
-Can be useful for editing file(s) on a slow medium.
+Can be useful for editing files on a slow medium.
.It Fl r Op Ar file
Recovery mode.
If
@@ -168,41 +163,38 @@ is used to recover a crashed session.
The swap file has the same name as the file it's associated with, but with
.Sq .swp
appended.
-See
-.Ic :help recovery .
+.Ic ":help recovery"
.It Fl L Op Ar file
Alias for
.Fl r .
.It Fl u Ar vimrc
Use
.Ar vimrc
-instead of the default of
+instead of the default
.Pa ~/.config/nvim/init.vim .
If
.Ar vimrc
is
.Cm NORC ,
-do not load any initialization files (excluding plugins),
+do not load any initialization files (except plugins),
and do not attempt to parse environment variables.
If
.Ar vimrc
is
.Cm NONE ,
loading plugins is also skipped.
-See
-.Ic :help initialization .
+.Ic ":help initialization"
.It Fl i Ar shada
Use
.Ar shada
-instead of the default of
+instead of the default
.Pa ~/.local/share/nvim/shada/main.shada .
If
.Ar shada
is
.Cm NONE ,
do not read or write a ShaDa file.
-See
-.Ic :help shada .
+.Ic ":help shada"
.It Fl -noplugin
Skip loading plugins.
Implied by
@@ -233,7 +225,6 @@ For the first file, position the cursor on line
If
.Ar linenum
is omitted, position the cursor on the last line of the file.
-Note that
.Cm +5
and
.Cm -c 5
@@ -246,8 +237,7 @@ For the first file, position the cursor on the first occurrence of
.Ar pattern .
If
.Ar pattern
-is omitted, the most recently used search pattern is used (if there is one).
-Note that
+is omitted, the most recent search pattern is used (if any).
.Cm +/foo
and
.Cm -c /foo
@@ -257,21 +247,15 @@ and
.Ic :/foo
inside
.Nm .
-See
-.Ic :help search-pattern .
-.It Fl c Ar command
+.Ic ":help search-pattern"
+.It \fB\+\fR\fI\,command\/\fR , Fl c Ar command
Execute
.Ar command
after reading the first file.
-Up to 10 instances of
-.Fl c
-or
-.Cm +
-can be used.
-Note that
-.Qq Cm +set si
+Up to 10 instances allowed.
+.Qq Cm +foo
and
-.Cm -c \(dqset si\(dq
+.Cm -c \(dqfoo\(dq
are equivalent.
.It Fl -cmd Ar command
Like
@@ -292,16 +276,15 @@ cannot start with a hyphen
.Pq Sq - .
If
.Ar session
-is omitted, then
-.Pa Session.vim ,
-if found, is used.
-See
-.Ic :help session-file .
+is omitted then
+.Pa Session.vim
+is used, if found.
+.Ic ":help session-file"
.It Fl s Ar scriptin
Read normal mode commands from
.Ar scriptin .
The same can be done with the command
-.Ic :source! scriptin .
+.Ic ":source! scriptin" .
If the end of the file is reached before
.Nm
exits, further characters are read from the keyboard.
@@ -325,10 +308,14 @@ Can be used to diagnose slow startup times.
Dump API metadata serialized to msgpack and exit.
.It Fl -embed
Use standard input and standard output as a msgpack-rpc channel.
-Implies
-.Fl -headless .
+:help --embed
.It Fl -headless
-Do not start a user interface.
+Do not start a UI.
+When supplied with --embed this implies that the embedding application does not intend to (immediately) start a UI.
+Also useful for "scraping" messages in a pipe.
+:help --headless
+.It Fl -listen Ar address
+Start RPC server on this pipe or TCP socket.
.It Fl h , -help
Print usage information and exit.
.It Fl v , -version
@@ -336,102 +323,69 @@ Print version information and exit.
.El
.Sh ENVIRONMENT
.Bl -tag -width Fl
+.It Ev NVIM_LOG_FILE
+Low-level log file, usually found at ~/.local/share/nvim/log.
+:help $NVIM_LOG_FILE
.It Ev VIM
-Used to locate various user files, such as the user's init.vim.
+Used to locate user files, such as init.vim.
+System-dependent.
+:help $VIM
.It Ev VIMRUNTIME
-Used to locate run time files, such as on-line documentation and
-syntax highlighting definitions.
+Used to locate runtime files (documentation, syntax highlighting, etc.).
.It Ev XDG_CONFIG_HOME
-Path to use for the user-local configuration directory, see
+Path to the user-local configuration directory, see
.Sx FILES .
Defaults to
-.Pa ~/.config
-if not set.
+.Pa ~/.config .
+:help xdg
.It Ev XDG_DATA_HOME
Like
.Ev XDG_CONFIG_HOME ,
but used to store data not generally edited by the user,
namely swap, backup, and ShaDa files.
Defaults to
-.Pa ~/.local/share/nvim
-if not set.
+.Pa ~/.local/share .
+:help xdg
.It Ev VIMINIT
-A string of Ex commands to be executed at startup.
-For example, the command to quit is
-.Ic :q ,
-so to have
-.Nm
-quit immediately after starting, set
-.Ev VIMINIT
-to
-.Cm q .
-See
-.Ic :help VIMINIT .
+Ex commands to be executed at startup.
+.Ic ":help VIMINIT"
.It Ev SHELL
-Used to set the 'shell' option, which determines the shell used by the
-.Ic :terminal
-command.
-.It Ev NVIM_TUI_ENABLE_CURSOR_SHAPE
-If defined, change the cursor shape to a vertical bar while in insert mode.
-Requires that the host terminal supports the DECSCUSR CSI escape sequence.
-Has no effect in GUIs.
-.Pp
-Depending on the terminal emulator, using this option with
-.Nm
-under
-.Xr tmux 1
-might require adding the following to
-.Pa ~/.tmux.conf :
-.Bd -literal -offset indent
-set -ga terminal-overrides ',*:Ss=\eE[%p1%d q:Se=\eE[2 q'
-.Ed
-.Pp
-See
-.Ic terminal-overrides
-in the
-.Xr tmux 1
-manual page for more information.
+Used to initialize the 'shell' option, which decides the default shell used by
+features like
+.Ic :terminal ,
+.Ic :! , and
+.Ic system() .
.El
.Sh FILES
.Bl -tag -width "~/.config/nvim/init.vim"
.It Pa ~/.config/nvim/init.vim
-The user-local
+User-local
.Nm
configuration file.
-See
-.Ev XDG_CONFIG_HOME
-above.
.It Pa ~/.config/nvim
-The user-local
+User-local
.Nm
configuration directory.
-See
-.Ev XDG_CONFIG_HOME
-above.
+See also
+.Ev XDG_CONFIG_HOME .
.It Pa $VIM/sysinit.vim
-The system-global
+System-global
.Nm
configuration file.
.It Pa /usr/local/share/nvim
-The system-global
+System-global
.Nm
runtime directory.
.El
.Sh AUTHORS
-.Nm
-was started by
-.An Thiago de Arruda ,
-with a lot of help from others.
-.Pp
+Nvim was started by
+.An Thiago de Arruda .
Most of Vim was written by
.An -nosplit
-.An Bram Moolenaar ,
-with a lot of help from others.
-See
-.Ic :help credits .
-.Pp
+.An Bram Moolenaar .
Vim is based on Stevie, worked on by
.An Tim Thompson ,
.An Tony Andrews ,
and
.An G.R. (Fred) Walter .
+.Ic ":help credits"
diff --git a/runtime/CMakeLists.txt b/runtime/CMakeLists.txt
index 66971eccb2..d66e04f5f2 100644
--- a/runtime/CMakeLists.txt
+++ b/runtime/CMakeLists.txt
@@ -3,6 +3,7 @@ set(GENERATED_RUNTIME_DIR ${PROJECT_BINARY_DIR}/runtime)
set(GENERATED_SYN_VIM ${GENERATED_RUNTIME_DIR}/syntax/vim/generated.vim)
set(GENERATED_HELP_TAGS ${GENERATED_RUNTIME_DIR}/doc/tags)
set(GENERATED_PACKAGE_DIR ${GENERATED_RUNTIME_DIR}/pack/dist/opt)
+set(FUNCS_DATA ${PROJECT_BINARY_DIR}/funcs_data.mpack)
file(MAKE_DIRECTORY ${GENERATED_RUNTIME_DIR})
file(MAKE_DIRECTORY ${GENERATED_RUNTIME_DIR}/syntax)
@@ -10,42 +11,35 @@ file(MAKE_DIRECTORY ${GENERATED_RUNTIME_DIR}/syntax/vim)
add_custom_command(OUTPUT ${GENERATED_SYN_VIM}
COMMAND ${LUA_PRG} ${SYN_VIM_GENERATOR}
- ${PROJECT_SOURCE_DIR}/src/nvim ${GENERATED_SYN_VIM}
+ ${PROJECT_SOURCE_DIR}/src/nvim ${GENERATED_SYN_VIM} ${FUNCS_DATA}
DEPENDS
${SYN_VIM_GENERATOR}
${PROJECT_SOURCE_DIR}/src/nvim/ex_cmds.lua
${PROJECT_SOURCE_DIR}/src/nvim/auevents.lua
${PROJECT_SOURCE_DIR}/src/nvim/options.lua
${PROJECT_SOURCE_DIR}/src/nvim/eval.c
+ ${FUNCS_DATA}
)
-if(POLICY CMP0054)
- cmake_policy(SET CMP0054 OLD)
-endif()
-
file(GLOB PACKAGES ${PROJECT_SOURCE_DIR}/runtime/pack/dist/opt/*)
set(GENERATED_PACKAGE_TAGS)
foreach(PACKAGE ${PACKAGES})
get_filename_component(PACKNAME ${PACKAGE} NAME)
file(GLOB "${PACKNAME}_DOC_FILES" ${PACKAGE}/doc/*.txt)
- if("${PACKNAME}_DOC_FILES")
+ if(${PACKNAME}_DOC_FILES)
file(MAKE_DIRECTORY ${GENERATED_PACKAGE_DIR}/${PACKNAME})
- add_custom_target("${PACKNAME}-tags"
+ add_custom_command(OUTPUT "${GENERATED_PACKAGE_DIR}/${PACKNAME}/doc/tags"
COMMAND ${CMAKE_COMMAND} -E copy_directory
${PACKAGE} ${GENERATED_PACKAGE_DIR}/${PACKNAME}
COMMAND "${PROJECT_BINARY_DIR}/bin/nvim"
-u NONE -i NONE -e --headless -c "helptags doc" -c quit
DEPENDS
nvim
+ nvim_runtime_deps
WORKING_DIRECTORY "${GENERATED_PACKAGE_DIR}/${PACKNAME}"
)
- add_custom_command(OUTPUT "${GENERATED_PACKAGE_DIR}/${PACKNAME}/doc/tags"
- DEPENDS
- "${PACKNAME}-tags"
- )
-
set("${PACKNAME}_DOC_NAMES")
foreach(DF "${${PACKNAME}_DOC_FILES}")
get_filename_component(F ${DF} NAME)
@@ -68,20 +62,18 @@ foreach(DF ${DOCFILES})
list(APPEND BUILDDOCFILES ${GENERATED_RUNTIME_DIR}/doc/${F})
endforeach()
-add_custom_target(helptags
+add_custom_command(OUTPUT ${GENERATED_HELP_TAGS}
+ COMMAND ${CMAKE_COMMAND} -E remove doc/*
COMMAND ${CMAKE_COMMAND} -E copy_directory
- ${PROJECT_SOURCE_DIR}/runtime/doc ${GENERATED_RUNTIME_DIR}/doc
+ ${PROJECT_SOURCE_DIR}/runtime/doc doc
COMMAND "${PROJECT_BINARY_DIR}/bin/nvim"
-u NONE -i NONE -e --headless -c "helptags ++t doc" -c quit
DEPENDS
nvim
+ nvim_runtime_deps
WORKING_DIRECTORY "${GENERATED_RUNTIME_DIR}"
)
-add_custom_command(OUTPUT ${GENERATED_HELP_TAGS}
- DEPENDS
- helptags
-)
add_custom_target(doc_html
COMMAND make html
@@ -112,6 +104,16 @@ install_helper(
FILES ${GENERATED_SYN_VIM}
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/nvim/runtime/syntax/vim)
+if(NOT APPLE)
+ install_helper(
+ FILES ${CMAKE_CURRENT_SOURCE_DIR}/nvim.desktop
+ DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications)
+
+ install_helper(
+ FILES ${CMAKE_CURRENT_SOURCE_DIR}/nvim.png
+ DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pixmaps)
+endif()
+
file(GLOB_RECURSE RUNTIME_PROGRAMS
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
*.awk *.sh *.bat)
@@ -124,7 +126,8 @@ endforeach()
file(GLOB_RECURSE RUNTIME_FILES
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
- *.vim *.dict *.py *.ps *.tutor)
+ rgb.txt
+ *.vim *.lua *.dict *.py *.rb *.ps *.spl *.tutor *.tutor.json)
foreach(F ${RUNTIME_FILES})
get_filename_component(BASEDIR ${F} PATH)
diff --git a/runtime/autoload/RstFold.vim b/runtime/autoload/RstFold.vim
new file mode 100644
index 0000000000..5becb04685
--- /dev/null
+++ b/runtime/autoload/RstFold.vim
@@ -0,0 +1,48 @@
+" Author: Antony Lee <anntzer.lee@gmail.com>
+" Description: Helper functions for reStructuredText syntax folding
+" Last Modified: 2018-01-07
+
+function s:CacheRstFold()
+ let closure = {'header_types': {}, 'max_level': 0, 'levels': {}}
+ function closure.Process(match) dict
+ let curline = getcurpos()[1]
+ if has_key(self.levels, curline - 1)
+ " For over+under-lined headers, the regex will match both at the
+ " overline and at the title itself; in that case, skip the second match.
+ return
+ endif
+ let lines = split(a:match, '\n')
+ let key = repeat(lines[-1][0], len(lines))
+ if !has_key(self.header_types, key)
+ let self.max_level += 1
+ let self.header_types[key] = self.max_level
+ endif
+ let self.levels[curline] = self.header_types[key]
+ endfunction
+ let save_cursor = getcurpos()
+ silent keeppatterns %s/\v^%(%(([=`:.'"~^_*+#-])\1+\n)?.{1,2}\n([=`:.'"~^_*+#-])\2+)|%(%(([=`:.''"~^_*+#-])\3{2,}\n)?.{3,}\n([=`:.''"~^_*+#-])\4{2,})$/\=closure.Process(submatch(0))/gn
+ call setpos('.', save_cursor)
+ let b:RstFoldCache = closure.levels
+endfunction
+
+function RstFold#GetRstFold()
+ if !has_key(b:, 'RstFoldCache')
+ call s:CacheRstFold()
+ endif
+ if has_key(b:RstFoldCache, v:lnum)
+ return '>' . b:RstFoldCache[v:lnum]
+ else
+ return '='
+ endif
+endfunction
+
+function RstFold#GetRstFoldText()
+ if !has_key(b:, 'RstFoldCache')
+ call s:CacheRstFold()
+ endif
+ let indent = repeat(' ', b:RstFoldCache[v:foldstart] - 1)
+ let thisline = getline(v:foldstart)
+ " For over+under-lined headers, skip the overline.
+ let text = thisline =~ '^\([=`:.''"~^_*+#-]\)\1\+$' ? getline(v:foldstart + 1) : thisline
+ return indent . text
+endfunction
diff --git a/runtime/autoload/ada.vim b/runtime/autoload/ada.vim
index cc5191fa43..d04feb9250 100644
--- a/runtime/autoload/ada.vim
+++ b/runtime/autoload/ada.vim
@@ -2,12 +2,13 @@
" Description: Perform Ada specific completion & tagging.
" Language: Ada (2005)
" $Id: ada.vim 887 2008-07-08 14:29:01Z krischik $
-" Maintainer: Martin Krischik <krischik@users.sourceforge.net>
+" Maintainer: Mathias Brousset <mathiasb17@gmail.com>
+" Martin Krischik <krischik@users.sourceforge.net>
" Taylor Venable <taylor@metasyntax.net>
" Neil Bird <neil@fnxweb.com>
" Ned Okie <nokie@radford.edu>
" $Author: krischik $
-" $Date: 2008-07-08 16:29:01 +0200 (Di, 08 Jul 2008) $
+" $Date: 2017-01-31 20:20:05 +0200 (Mon, 01 Jan 2017) $
" Version: 4.6
" $Revision: 887 $
" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/ada.vim $
@@ -23,6 +24,7 @@
" 09.05.2007 MK Session just won't work no matter how much
" tweaking is done
" 19.09.2007 NO still some mapleader problems
+" 31.01.2017 MB fix more mapleader problems
" Help Page: ft-ada-functions
"------------------------------------------------------------------------------
@@ -585,11 +587,11 @@ function ada#Map_Menu (Text, Keys, Command)
\ " :" . a:Command . "<CR>"
execute
\ "nnoremap <buffer>" .
- \ escape(l:leader . "a" . a:Keys , '\') .
+ \ " <Leader>a" . a:Keys .
\" :" . a:Command
execute
\ "inoremap <buffer>" .
- \ escape(l:leader . "a" . a:Keys , '\') .
+ \ " <Leader>a" . a:Keys .
\" <C-O>:" . a:Command
endif
return
diff --git a/runtime/autoload/ccomplete.vim b/runtime/autoload/ccomplete.vim
index d5bfa076a9..156b3af025 100644
--- a/runtime/autoload/ccomplete.vim
+++ b/runtime/autoload/ccomplete.vim
@@ -1,7 +1,7 @@
" Vim completion script
" Language: C
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2012 Jun 20
+" Last Change: 2018 Aug 20
let s:cpo_save = &cpo
set cpo&vim
@@ -72,8 +72,10 @@ function! ccomplete#Complete(findstart, base)
" Split item in words, keep empty word after "." or "->".
" "aa" -> ['aa'], "aa." -> ['aa', ''], "aa.bb" -> ['aa', 'bb'], etc.
" We can't use split, because we need to skip nested [...].
+ " "aa[...]" -> ['aa', '[...]'], "aa.bb[...]" -> ['aa', 'bb', '[...]'], etc.
let items = []
let s = 0
+ let arrays = 0
while 1
let e = match(base, '\.\|->\|\[', s)
if e < 0
@@ -107,6 +109,7 @@ function! ccomplete#Complete(findstart, base)
endwhile
let e += 1
call add(items, strpart(base, s, e - s))
+ let arrays += 1
let s = e
endif
endwhile
@@ -161,15 +164,26 @@ function! ccomplete#Complete(findstart, base)
endif
endif
let res = [{'match': match, 'tagline' : '', 'kind' : kind, 'info' : line}]
+ elseif len(items) == arrays + 1
+ " Completing one word and it's a local array variable: build tagline
+ " from declaration line
+ let match = items[0]
+ let kind = 'v'
+ let tagline = "\t/^" . line . '$/'
+ let res = [{'match': match, 'tagline' : tagline, 'kind' : kind, 'info' : line}]
else
" Completing "var.", "var.something", etc.
let res = s:Nextitem(strpart(line, 0, col), items[1:], 0, 1)
endif
endif
- if len(items) == 1
+ if len(items) == 1 || len(items) == arrays + 1
" Only one part, no "." or "->": complete from tags file.
- let tags = taglist('^' . base)
+ if len(items) == 1
+ let tags = taglist('^' . base)
+ else
+ let tags = taglist('^' . items[0] . '$')
+ endif
" Remove members, these can't appear without something in front.
call filter(tags, 'has_key(v:val, "kind") ? v:val["kind"] != "m" : 1')
@@ -516,11 +530,24 @@ function! s:StructMembers(typename, items, all)
endif
endif
+ " Skip over [...] items
+ let idx = 0
+ while 1
+ if idx >= len(a:items)
+ let target = '' " No further items, matching all members
+ break
+ endif
+ if a:items[idx][0] != '['
+ let target = a:items[idx]
+ break
+ endif
+ let idx += 1
+ endwhile
" Put matching members in matches[].
let matches = []
for l in qflist
let memb = matchstr(l['text'], '[^\t]*')
- if memb =~ '^' . a:items[0]
+ if memb =~ '^' . target
" Skip matches local to another file.
if match(l['text'], "\tfile:") < 0 || bufnr('%') == bufnr(matchstr(l['text'], '\t\zs[^\t]*'))
let item = {'match': memb, 'tagline': l['text']}
@@ -540,8 +567,8 @@ function! s:StructMembers(typename, items, all)
endfor
if len(matches) > 0
- " Skip over [...] items
- let idx = 1
+ " Skip over next [...] items
+ let idx += 1
while 1
if idx >= len(a:items)
return matches " No further items, return the result.
diff --git a/runtime/autoload/clojurecomplete.vim b/runtime/autoload/clojurecomplete.vim
index 708bb31104..030785e901 100644
--- a/runtime/autoload/clojurecomplete.vim
+++ b/runtime/autoload/clojurecomplete.vim
@@ -1,14 +1,14 @@
" Vim completion script
-" Language: Clojure
-" Maintainer: Sung Pae <self@sungpae.com>
-" URL: https://github.com/guns/vim-clojure-static
-" License: Same as Vim
-" Last Change: 27 March 2014
+" Language: Clojure
+" Maintainer: Sung Pae <self@sungpae.com>
+" URL: https://github.com/guns/vim-clojure-static
+" License: Same as Vim
+" Last Change: 18 July 2016
" -*- COMPLETION WORDS -*-
-" Generated from https://github.com/guns/vim-clojure-static/blob/vim-release-010/clj/src/vim_clojure_static/generate.clj
-" Clojure version 1.6.0
-let s:words = ["*","*'","*1","*2","*3","*agent*","*allow-unresolved-vars*","*assert*","*clojure-version*","*command-line-args*","*compile-files*","*compile-path*","*compiler-options*","*data-readers*","*default-data-reader-fn*","*e","*err*","*file*","*flush-on-newline*","*fn-loader*","*in*","*math-context*","*ns*","*out*","*print-dup*","*print-length*","*print-level*","*print-meta*","*print-readably*","*read-eval*","*source-path*","*unchecked-math*","*use-context-classloader*","*verbose-defrecords*","*warn-on-reflection*","+","+'","-","-'","->","->>","->ArrayChunk","->Vec","->VecNode","->VecSeq","-cache-protocol-fn","-reset-methods",".","..","/","<","<=","=","==",">",">=","EMPTY-NODE","accessor","aclone","add-classpath","add-watch","agent","agent-error","agent-errors","aget","alength","alias","all-ns","alter","alter-meta!","alter-var-root","amap","ancestors","and","apply","areduce","array-map","as->","aset","aset-boolean","aset-byte","aset-char","aset-double","aset-float","aset-int","aset-long","aset-short","assert","assoc!","assoc","assoc-in","associative?","atom","await","await-for","await1","bases","bean","bigdec","bigint","biginteger","binding","bit-and","bit-and-not","bit-clear","bit-flip","bit-not","bit-or","bit-set","bit-shift-left","bit-shift-right","bit-test","bit-xor","boolean","boolean-array","booleans","bound-fn","bound-fn*","bound?","butlast","byte","byte-array","bytes","case","cast","catch","char","char-array","char-escape-string","char-name-string","char?","chars","chunk","chunk-append","chunk-buffer","chunk-cons","chunk-first","chunk-next","chunk-rest","chunked-seq?","class","class?","clear-agent-errors","clojure-version","coll?","comment","commute","comp","comparator","compare","compare-and-set!","compile","complement","concat","cond","cond->","cond->>","condp","conj!","conj","cons","constantly","construct-proxy","contains?","count","counted?","create-ns","create-struct","cycle","dec","dec'","decimal?","declare","def","default-data-readers","definline","definterface","defmacro","defmethod","defmulti","defn","defn-","defonce","defprotocol","defrecord","defstruct","deftype","delay","delay?","deliver","denominator","deref","derive","descendants","destructure","disj!","disj","dissoc!","dissoc","distinct","distinct?","do","doall","dorun","doseq","dosync","dotimes","doto","double","double-array","doubles","drop","drop-last","drop-while","empty","empty?","ensure","enumeration-seq","error-handler","error-mode","eval","even?","every-pred","every?","ex-data","ex-info","extend","extend-protocol","extend-type","extenders","extends?","false?","ffirst","file-seq","filter","filterv","finally","find","find-keyword","find-ns","find-protocol-impl","find-protocol-method","find-var","first","flatten","float","float-array","float?","floats","flush","fn","fn","fn?","fnext","fnil","for","force","format","frequencies","future","future-call","future-cancel","future-cancelled?","future-done?","future?","gen-class","gen-interface","gensym","get","get-in","get-method","get-proxy-class","get-thread-bindings","get-validator","group-by","hash","hash-combine","hash-map","hash-ordered-coll","hash-set","hash-unordered-coll","identical?","identity","if","if-let","if-not","if-some","ifn?","import","in-ns","inc","inc'","init-proxy","instance?","int","int-array","integer?","interleave","intern","interpose","into","into-array","ints","io!","isa?","iterate","iterator-seq","juxt","keep","keep-indexed","key","keys","keyword","keyword?","last","lazy-cat","lazy-seq","let","let","letfn","line-seq","list","list*","list?","load","load-file","load-reader","load-string","loaded-libs","locking","long","long-array","longs","loop","loop","macroexpand","macroexpand-1","make-array","make-hierarchy","map","map-indexed","map?","mapcat","mapv","max","max-key","memfn","memoize","merge","merge-with","meta","method-sig","methods","min","min-key","mix-collection-hash","mod","monitor-enter","monitor-exit","munge","name","namespace","namespace-munge","neg?","new","newline","next","nfirst","nil?","nnext","not","not-any?","not-empty","not-every?","not=","ns","ns-aliases","ns-imports","ns-interns","ns-map","ns-name","ns-publics","ns-refers","ns-resolve","ns-unalias","ns-unmap","nth","nthnext","nthrest","num","number?","numerator","object-array","odd?","or","parents","partial","partition","partition-all","partition-by","pcalls","peek","persistent!","pmap","pop!","pop","pop-thread-bindings","pos?","pr","pr-str","prefer-method","prefers","primitives-classnames","print","print-ctor","print-dup","print-method","print-simple","print-str","printf","println","println-str","prn","prn-str","promise","proxy","proxy-call-with-super","proxy-mappings","proxy-name","proxy-super","push-thread-bindings","pvalues","quot","quote","rand","rand-int","rand-nth","range","ratio?","rational?","rationalize","re-find","re-groups","re-matcher","re-matches","re-pattern","re-seq","read","read-line","read-string","realized?","record?","recur","reduce","reduce-kv","reduced","reduced?","reductions","ref","ref-history-count","ref-max-history","ref-min-history","ref-set","refer","refer-clojure","reify","release-pending-sends","rem","remove","remove-all-methods","remove-method","remove-ns","remove-watch","repeat","repeatedly","replace","replicate","require","reset!","reset-meta!","resolve","rest","restart-agent","resultset-seq","reverse","reversible?","rseq","rsubseq","satisfies?","second","select-keys","send","send-off","send-via","seq","seq?","seque","sequence","sequential?","set!","set","set-agent-send-executor!","set-agent-send-off-executor!","set-error-handler!","set-error-mode!","set-validator!","set?","short","short-array","shorts","shuffle","shutdown-agents","slurp","some","some->","some->>","some-fn","some?","sort","sort-by","sorted-map","sorted-map-by","sorted-set","sorted-set-by","sorted?","special-symbol?","spit","split-at","split-with","str","string?","struct","struct-map","subs","subseq","subvec","supers","swap!","symbol","symbol?","sync","take","take-last","take-nth","take-while","test","the-ns","thread-bound?","throw","time","to-array","to-array-2d","trampoline","transient","tree-seq","true?","try","type","unchecked-add","unchecked-add-int","unchecked-byte","unchecked-char","unchecked-dec","unchecked-dec-int","unchecked-divide-int","unchecked-double","unchecked-float","unchecked-inc","unchecked-inc-int","unchecked-int","unchecked-long","unchecked-multiply","unchecked-multiply-int","unchecked-negate","unchecked-negate-int","unchecked-remainder-int","unchecked-short","unchecked-subtract","unchecked-subtract-int","underive","unquote","unquote-splicing","unsigned-bit-shift-right","update-in","update-proxy","use","val","vals","var","var-get","var-set","var?","vary-meta","vec","vector","vector-of","vector?","when","when-first","when-let","when-not","when-some","while","with-bindings","with-bindings*","with-in-str","with-loading-context","with-local-vars","with-meta","with-open","with-out-str","with-precision","with-redefs","with-redefs-fn","xml-seq","zero?","zipmap"]
+" Generated from https://github.com/guns/vim-clojure-static/blob/vim-release-011/clj/src/vim_clojure_static/generate.clj
+" Clojure version 1.8.0
+let s:words = ["*","*'","*1","*2","*3","*agent*","*allow-unresolved-vars*","*assert*","*clojure-version*","*command-line-args*","*compile-files*","*compile-path*","*compiler-options*","*data-readers*","*default-data-reader-fn*","*e","*err*","*file*","*flush-on-newline*","*fn-loader*","*in*","*math-context*","*ns*","*out*","*print-dup*","*print-length*","*print-level*","*print-meta*","*print-readably*","*read-eval*","*source-path*","*suppress-read*","*unchecked-math*","*use-context-classloader*","*verbose-defrecords*","*warn-on-reflection*","+","+'","-","-'","->","->>","->ArrayChunk","->Eduction","->Vec","->VecNode","->VecSeq","-cache-protocol-fn","-reset-methods",".","..","/","<","<=","=","==",">",">=","EMPTY-NODE","Throwable->map","accessor","aclone","add-classpath","add-watch","agent","agent-error","agent-errors","aget","alength","alias","all-ns","alter","alter-meta!","alter-var-root","amap","ancestors","and","apply","areduce","array-map","as->","aset","aset-boolean","aset-byte","aset-char","aset-double","aset-float","aset-int","aset-long","aset-short","assert","assoc!","assoc","assoc-in","associative?","atom","await","await-for","await1","bases","bean","bigdec","bigint","biginteger","binding","bit-and","bit-and-not","bit-clear","bit-flip","bit-not","bit-or","bit-set","bit-shift-left","bit-shift-right","bit-test","bit-xor","boolean","boolean-array","booleans","bound-fn","bound-fn*","bound?","butlast","byte","byte-array","bytes","case","cast","cat","catch","char","char-array","char-escape-string","char-name-string","char?","chars","chunk","chunk-append","chunk-buffer","chunk-cons","chunk-first","chunk-next","chunk-rest","chunked-seq?","class","class?","clear-agent-errors","clojure-version","coll?","comment","commute","comp","comparator","compare","compare-and-set!","compile","complement","completing","concat","cond","cond->","cond->>","condp","conj!","conj","cons","constantly","construct-proxy","contains?","count","counted?","create-ns","create-struct","cycle","dec","dec'","decimal?","declare","dedupe","def","default-data-readers","definline","definterface","defmacro","defmethod","defmulti","defn","defn-","defonce","defprotocol","defrecord","defstruct","deftype","delay","delay?","deliver","denominator","deref","derive","descendants","destructure","disj!","disj","dissoc!","dissoc","distinct","distinct?","do","doall","dorun","doseq","dosync","dotimes","doto","double","double-array","doubles","drop","drop-last","drop-while","eduction","empty","empty?","ensure","ensure-reduced","enumeration-seq","error-handler","error-mode","eval","even?","every-pred","every?","ex-data","ex-info","extend","extend-protocol","extend-type","extenders","extends?","false?","ffirst","file-seq","filter","filterv","finally","find","find-keyword","find-ns","find-protocol-impl","find-protocol-method","find-var","first","flatten","float","float-array","float?","floats","flush","fn","fn","fn?","fnext","fnil","for","force","format","frequencies","future","future-call","future-cancel","future-cancelled?","future-done?","future?","gen-class","gen-interface","gensym","get","get-in","get-method","get-proxy-class","get-thread-bindings","get-validator","group-by","hash","hash-combine","hash-map","hash-ordered-coll","hash-set","hash-unordered-coll","identical?","identity","if","if-let","if-not","if-some","ifn?","import","in-ns","inc","inc'","init-proxy","instance?","int","int-array","integer?","interleave","intern","interpose","into","into-array","ints","io!","isa?","iterate","iterator-seq","juxt","keep","keep-indexed","key","keys","keyword","keyword?","last","lazy-cat","lazy-seq","let","let","letfn","line-seq","list","list*","list?","load","load-file","load-reader","load-string","loaded-libs","locking","long","long-array","longs","loop","loop","macroexpand","macroexpand-1","make-array","make-hierarchy","map","map-entry?","map-indexed","map?","mapcat","mapv","max","max-key","memfn","memoize","merge","merge-with","meta","method-sig","methods","min","min-key","mix-collection-hash","mod","monitor-enter","monitor-exit","munge","name","namespace","namespace-munge","neg?","new","newline","next","nfirst","nil?","nnext","not","not-any?","not-empty","not-every?","not=","ns","ns-aliases","ns-imports","ns-interns","ns-map","ns-name","ns-publics","ns-refers","ns-resolve","ns-unalias","ns-unmap","nth","nthnext","nthrest","num","number?","numerator","object-array","odd?","or","parents","partial","partition","partition-all","partition-by","pcalls","peek","persistent!","pmap","pop!","pop","pop-thread-bindings","pos?","pr","pr-str","prefer-method","prefers","primitives-classnames","print","print-ctor","print-dup","print-method","print-simple","print-str","printf","println","println-str","prn","prn-str","promise","proxy","proxy-call-with-super","proxy-mappings","proxy-name","proxy-super","push-thread-bindings","pvalues","quot","quote","rand","rand-int","rand-nth","random-sample","range","ratio?","rational?","rationalize","re-find","re-groups","re-matcher","re-matches","re-pattern","re-seq","read","read-line","read-string","reader-conditional","reader-conditional?","realized?","record?","recur","reduce","reduce-kv","reduced","reduced?","reductions","ref","ref-history-count","ref-max-history","ref-min-history","ref-set","refer","refer-clojure","reify","release-pending-sends","rem","remove","remove-all-methods","remove-method","remove-ns","remove-watch","repeat","repeatedly","replace","replicate","require","reset!","reset-meta!","resolve","rest","restart-agent","resultset-seq","reverse","reversible?","rseq","rsubseq","run!","satisfies?","second","select-keys","send","send-off","send-via","seq","seq?","seque","sequence","sequential?","set!","set","set-agent-send-executor!","set-agent-send-off-executor!","set-error-handler!","set-error-mode!","set-validator!","set?","short","short-array","shorts","shuffle","shutdown-agents","slurp","some","some->","some->>","some-fn","some?","sort","sort-by","sorted-map","sorted-map-by","sorted-set","sorted-set-by","sorted?","special-symbol?","spit","split-at","split-with","str","string?","struct","struct-map","subs","subseq","subvec","supers","swap!","symbol","symbol?","sync","tagged-literal","tagged-literal?","take","take-last","take-nth","take-while","test","the-ns","thread-bound?","throw","time","to-array","to-array-2d","trampoline","transduce","transient","tree-seq","true?","try","type","unchecked-add","unchecked-add-int","unchecked-byte","unchecked-char","unchecked-dec","unchecked-dec-int","unchecked-divide-int","unchecked-double","unchecked-float","unchecked-inc","unchecked-inc-int","unchecked-int","unchecked-long","unchecked-multiply","unchecked-multiply-int","unchecked-negate","unchecked-negate-int","unchecked-remainder-int","unchecked-short","unchecked-subtract","unchecked-subtract-int","underive","unquote","unquote-splicing","unreduced","unsigned-bit-shift-right","update","update-in","update-proxy","use","val","vals","var","var-get","var-set","var?","vary-meta","vec","vector","vector-of","vector?","volatile!","volatile?","vreset!","vswap!","when","when-first","when-let","when-not","when-some","while","with-bindings","with-bindings*","with-in-str","with-loading-context","with-local-vars","with-meta","with-open","with-out-str","with-precision","with-redefs","with-redefs-fn","xml-seq","zero?","zipmap"]
" Simple word completion for special forms and public vars in clojure.core
function! clojurecomplete#Complete(findstart, base)
diff --git a/runtime/autoload/context.vim b/runtime/autoload/context.vim
new file mode 100644
index 0000000000..254d710c01
--- /dev/null
+++ b/runtime/autoload/context.vim
@@ -0,0 +1,184 @@
+" Language: ConTeXt typesetting engine
+" Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+" Latest Revision: 2016 Oct 21
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+" Helper functions {{{
+function! s:context_echo(message, mode)
+ redraw
+ echo "\r"
+ execute 'echohl' a:mode
+ echomsg '[ConTeXt]' a:message
+ echohl None
+endf
+
+function! s:sh()
+ return has('win32') || has('win64') || has('win16') || has('win95')
+ \ ? ['cmd.exe', '/C']
+ \ : ['/bin/sh', '-c']
+endfunction
+
+" For backward compatibility
+if exists('*win_getid')
+
+ function! s:win_getid()
+ return win_getid()
+ endf
+
+ function! s:win_id2win(winid)
+ return win_id2win(a:winid)
+ endf
+
+else
+
+ function! s:win_getid()
+ return winnr()
+ endf
+
+ function! s:win_id2win(winnr)
+ return a:winnr
+ endf
+
+endif
+" }}}
+
+" ConTeXt jobs {{{
+if has('job')
+
+ let g:context_jobs = []
+
+ " Print the status of ConTeXt jobs
+ function! context#job_status()
+ let l:jobs = filter(g:context_jobs, 'job_status(v:val) == "run"')
+ let l:n = len(l:jobs)
+ call s:context_echo(
+ \ 'There '.(l:n == 1 ? 'is' : 'are').' '.(l:n == 0 ? 'no' : l:n)
+ \ .' job'.(l:n == 1 ? '' : 's').' running'
+ \ .(l:n == 0 ? '.' : ' (' . join(l:jobs, ', ').').'),
+ \ 'ModeMsg')
+ endfunction
+
+ " Stop all ConTeXt jobs
+ function! context#stop_jobs()
+ let l:jobs = filter(g:context_jobs, 'job_status(v:val) == "run"')
+ for job in l:jobs
+ call job_stop(job)
+ endfor
+ sleep 1
+ let l:tmp = []
+ for job in l:jobs
+ if job_status(job) == "run"
+ call add(l:tmp, job)
+ endif
+ endfor
+ let g:context_jobs = l:tmp
+ if empty(g:context_jobs)
+ call s:context_echo('Done. No jobs running.', 'ModeMsg')
+ else
+ call s:context_echo('There are still some jobs running. Please try again.', 'WarningMsg')
+ endif
+ endfunction
+
+ function! context#callback(path, job, status)
+ if index(g:context_jobs, a:job) != -1 && job_status(a:job) != 'run' " just in case
+ call remove(g:context_jobs, index(g:context_jobs, a:job))
+ endif
+ call s:callback(a:path, a:job, a:status)
+ endfunction
+
+ function! context#close_cb(channel)
+ call job_status(ch_getjob(a:channel)) " Trigger exit_cb's callback for faster feedback
+ endfunction
+
+ function! s:typeset(path)
+ call add(g:context_jobs,
+ \ job_start(add(s:sh(), context#command() . ' ' . shellescape(fnamemodify(a:path, ":t"))), {
+ \ 'close_cb' : 'context#close_cb',
+ \ 'exit_cb' : function(get(b:, 'context_callback', get(g:, 'context_callback', 'context#callback')),
+ \ [a:path]),
+ \ 'in_io' : 'null'
+ \ }))
+ endfunction
+
+else " No jobs
+
+ function! context#job_status()
+ call s:context_echo('Not implemented', 'WarningMsg')
+ endfunction!
+
+ function! context#stop_jobs()
+ call s:context_echo('Not implemented', 'WarningMsg')
+ endfunction
+
+ function! context#callback(path, job, status)
+ call s:callback(a:path, a:job, a:status)
+ endfunction
+
+ function! s:typeset(path)
+ execute '!' . context#command() . ' ' . shellescape(fnamemodify(a:path, ":t"))
+ call call(get(b:, 'context_callback', get(g:, 'context_callback', 'context#callback')),
+ \ [a:path, 0, v:shell_error])
+ endfunction
+
+endif " has('job')
+
+function! s:callback(path, job, status) abort
+ if a:status < 0 " Assume the job was terminated
+ return
+ endif
+ " Get info about the current window
+ let l:winid = s:win_getid() " Save window id
+ let l:efm = &l:errorformat " Save local errorformat
+ let l:cwd = fnamemodify(getcwd(), ":p") " Save local working directory
+ " Set errorformat to parse ConTeXt errors
+ execute 'setl efm=' . escape(b:context_errorformat, ' ')
+ try " Set cwd to expand error file correctly
+ execute 'lcd' fnameescape(fnamemodify(a:path, ':h'))
+ catch /.*/
+ execute 'setl efm=' . escape(l:efm, ' ')
+ throw v:exception
+ endtry
+ try
+ execute 'cgetfile' fnameescape(fnamemodify(a:path, ':r') . '.log')
+ botright cwindow
+ finally " Restore cwd and errorformat
+ execute s:win_id2win(l:winid) . 'wincmd w'
+ execute 'lcd ' . fnameescape(l:cwd)
+ execute 'setl efm=' . escape(l:efm, ' ')
+ endtry
+ if a:status == 0
+ call s:context_echo('Success!', 'ModeMsg')
+ else
+ call s:context_echo('There are errors. ', 'ErrorMsg')
+ endif
+endfunction
+
+function! context#command()
+ return get(b:, 'context_mtxrun', get(g:, 'context_mtxrun', 'mtxrun'))
+ \ . ' --script context --autogenerate --nonstopmode'
+ \ . ' --synctex=' . (get(b:, 'context_synctex', get(g:, 'context_synctex', 0)) ? '1' : '0')
+ \ . ' ' . get(b:, 'context_extra_options', get(g:, 'context_extra_options', ''))
+endfunction
+
+" Accepts an optional path (useful for big projects, when the file you are
+" editing is not the project's root document). If no argument is given, uses
+" the path of the current buffer.
+function! context#typeset(...) abort
+ let l:path = fnamemodify(strlen(a:000[0]) > 0 ? a:1 : expand("%"), ":p")
+ let l:cwd = fnamemodify(getcwd(), ":p") " Save local working directory
+ call s:context_echo('Typesetting...', 'ModeMsg')
+ execute 'lcd' fnameescape(fnamemodify(l:path, ":h"))
+ try
+ call s:typeset(l:path)
+ finally " Restore local working directory
+ execute 'lcd ' . fnameescape(l:cwd)
+ endtry
+endfunction!
+"}}}
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim: sw=2 fdm=marker
diff --git a/runtime/autoload/contextcomplete.vim b/runtime/autoload/contextcomplete.vim
new file mode 100644
index 0000000000..5b93bb0986
--- /dev/null
+++ b/runtime/autoload/contextcomplete.vim
@@ -0,0 +1,25 @@
+" Language: ConTeXt typesetting engine
+" Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+" Latest Revision: 2016 Oct 15
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+" Complete keywords in MetaPost blocks
+function! contextcomplete#Complete(findstart, base)
+ if a:findstart == 1
+ if len(synstack(line('.'), 1)) > 0 &&
+ \ synIDattr(synstack(line('.'), 1)[0], "name") ==# 'contextMPGraphic'
+ return syntaxcomplete#Complete(a:findstart, a:base)
+ else
+ return -3
+ endif
+ else
+ return syntaxcomplete#Complete(a:findstart, a:base)
+ endif
+endfunction
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim: sw=2 fdm=marker
diff --git a/runtime/autoload/csscomplete.vim b/runtime/autoload/csscomplete.vim
index 50048a37fd..f6c5a6c391 100644
--- a/runtime/autoload/csscomplete.vim
+++ b/runtime/autoload/csscomplete.vim
@@ -4,7 +4,7 @@
" plus CSS Speech Module <http://www.w3.org/TR/css3-speech/>
" Maintainer: Kao, Wei-Ko(othree) ( othree AT gmail DOT com )
" Original Author: Mikolaj Machowski ( mikmach AT wp DOT pl )
-" Last Change: 2016 Jan 11
+" Last Change: 2018 Jul 02
let s:values = split("all additive-symbols align-content align-items align-self animation animation-delay animation-direction animation-duration animation-fill-mode animation-iteration-count animation-name animation-play-state animation-timing-function backface-visibility background background-attachment background-blend-mode background-clip background-color background-image background-origin background-position background-repeat background-size block-size border border-block-end border-block-end-color border-block-end-style border-block-end-width border-block-start border-block-start-color border-block-start-style border-block-start-width border-bottom border-bottom-color border-bottom-left-radius border-bottom-right-radius border-bottom-style border-bottom-width border-collapse border-color border-image border-image-outset border-image-repeat border-image-slice border-image-source border-image-width border-inline-end border-inline-end-color border-inline-end-style border-inline-end-width border-inline-start border-inline-start-color border-inline-start-style border-inline-start-width border-left border-left-color border-left-style border-left-width border-radius border-right border-right-color border-right-style border-right-width border-spacing border-style border-top border-top-color border-top-left-radius border-top-right-radius border-top-style border-top-width border-width bottom box-decoration-break box-shadow box-sizing break-after break-before break-inside caption-side clear clip clip-path color columns column-count column-fill column-gap column-rule column-rule-color column-rule-style column-rule-width column-span column-width content counter-increment counter-reset cue cue-before cue-after cursor direction display empty-cells fallback filter flex flex-basis flex-direction flex-flow flex-grow flex-shrink flex-wrap float font font-family font-feature-settings font-kerning font-language-override font-size font-size-adjust font-stretch font-style font-synthesis font-variant font-variant-alternates font-variant-caps font-variant-east-asian font-variant-ligatures font-variant-numeric font-variant-position font-weight grid grid-area grid-auto-columns grid-auto-flow grid-auto-position grid-auto-rows grid-column grid-column-start grid-column-end grid-row grid-row-start grid-row-end grid-template grid-template-areas grid-template-rows grid-template-columns height hyphens image-rendering image-resolution image-orientation ime-mode inline-size isolation justify-content left letter-spacing line-break line-height list-style list-style-image list-style-position list-style-type margin margin-block-end margin-block-start margin-bottom margin-inline-end margin-inline-start margin-left margin-right margin-top marks mask mask-type max-block-size max-height max-inline-size max-width max-zoom min-block-size min-height min-inline-size min-width min-zoom mix-blend-mode negative object-fit object-position offset-block-end offset-block-start offset-inline-end offset-inline-start opacity order orientation orphans outline outline-color outline-offset outline-style outline-width overflow overflow-wrap overflow-x overflow-y pad padding padding-block-end padding-block-start padding-bottom padding-inline-end padding-inline-start padding-left padding-right padding-top page-break-after page-break-before page-break-inside pause-before pause-after pause perspective perspective-origin pointer-events position prefix quotes range resize rest rest-before rest-after right ruby-align ruby-merge ruby-position scroll-behavior scroll-snap-coordinate scroll-snap-destination scroll-snap-points-x scroll-snap-points-y scroll-snap-type scroll-snap-type-x scroll-snap-type-y shape-image-threshold shape-margin shape-outside speak speak-as suffix symbols system table-layout tab-size text-align text-align-last text-combine-upright text-decoration text-decoration-color text-decoration-line text-emphasis text-emphasis-color text-emphasis-position text-emphasis-style text-indent text-orientation text-overflow text-rendering text-shadow text-transform text-underline-position top touch-action transform transform-box transform-origin transform-style transition transition-delay transition-duration transition-property transition-timing-function unicode-bidi unicode-range user-zoom vertical-align visibility voice-balance voice-duration voice-family voice-pitch voice-rate voice-range voice-stress voice-volume white-space widows width will-change word-break word-spacing word-wrap writing-mode z-index zoom")
@@ -19,7 +19,6 @@ function! csscomplete#CompleteCSS(findstart, base)
while start >= 0 && line[start - 1] =~ '\%(\k\|-\)'
let start -= 1
endwhile
- let b:after = line[compl_begin :]
let b:compl_context = line[0:compl_begin]
return start
endif
@@ -37,11 +36,14 @@ function! csscomplete#CompleteCSS(findstart, base)
" 5. if @ complete at-rule
" 6. if ! complete important
if exists("b:compl_context")
+ let line = getline('.')
+ let compl_begin = col('.') - 2
+ let after = line[compl_begin:]
let line = b:compl_context
- let after = b:after
unlet! b:compl_context
else
let line = a:base
+ let after = ''
endif
let res = []
diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim
new file mode 100644
index 0000000000..160cdcff64
--- /dev/null
+++ b/runtime/autoload/dist/ft.vim
@@ -0,0 +1,745 @@
+" Vim functions for file type detection
+"
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2017 Dec 05
+
+" These functions are moved here from runtime/filetype.vim to make startup
+" faster.
+
+" Line continuation is used here, remove 'C' from 'cpoptions'
+let s:cpo_save = &cpo
+set cpo&vim
+
+func dist#ft#Check_inp()
+ if getline(1) =~ '^\*'
+ setf abaqus
+ else
+ let n = 1
+ if line("$") > 500
+ let nmax = 500
+ else
+ let nmax = line("$")
+ endif
+ while n <= nmax
+ if getline(n) =~? "^header surface data"
+ setf trasys
+ break
+ endif
+ let n = n + 1
+ endwhile
+ endif
+endfunc
+
+" This function checks for the kind of assembly that is wanted by the user, or
+" can be detected from the first five lines of the file.
+func dist#ft#FTasm()
+ " make sure b:asmsyntax exists
+ if !exists("b:asmsyntax")
+ let b:asmsyntax = ""
+ endif
+
+ if b:asmsyntax == ""
+ call dist#ft#FTasmsyntax()
+ endif
+
+ " if b:asmsyntax still isn't set, default to asmsyntax or GNU
+ if b:asmsyntax == ""
+ if exists("g:asmsyntax")
+ let b:asmsyntax = g:asmsyntax
+ else
+ let b:asmsyntax = "asm"
+ endif
+ endif
+
+ exe "setf " . fnameescape(b:asmsyntax)
+endfunc
+
+func dist#ft#FTasmsyntax()
+ " see if file contains any asmsyntax=foo overrides. If so, change
+ " b:asmsyntax appropriately
+ let head = " ".getline(1)." ".getline(2)." ".getline(3)." ".getline(4).
+ \" ".getline(5)." "
+ let match = matchstr(head, '\sasmsyntax=\zs[a-zA-Z0-9]\+\ze\s')
+ if match != ''
+ let b:asmsyntax = match
+ elseif ((head =~? '\.title') || (head =~? '\.ident') || (head =~? '\.macro') || (head =~? '\.subtitle') || (head =~? '\.library'))
+ let b:asmsyntax = "vmasm"
+ endif
+endfunc
+
+" Check if one of the first five lines contains "VB_Name". In that case it is
+" probably a Visual Basic file. Otherwise it's assumed to be "alt" filetype.
+func dist#ft#FTVB(alt)
+ if getline(1).getline(2).getline(3).getline(4).getline(5) =~? 'VB_Name\|Begin VB\.\(Form\|MDIForm\|UserControl\)'
+ setf vb
+ else
+ exe "setf " . a:alt
+ endif
+endfunc
+
+func dist#ft#FTbtm()
+ if exists("g:dosbatch_syntax_for_btm") && g:dosbatch_syntax_for_btm
+ setf dosbatch
+ else
+ setf btm
+ endif
+endfunc
+
+func dist#ft#BindzoneCheck(default)
+ if getline(1).getline(2).getline(3).getline(4) =~ '^; <<>> DiG [0-9.]\+.* <<>>\|$ORIGIN\|$TTL\|IN\s\+SOA'
+ setf bindzone
+ elseif a:default != ''
+ exe 'setf ' . a:default
+ endif
+endfunc
+
+func dist#ft#FTlpc()
+ if exists("g:lpc_syntax_for_c")
+ let lnum = 1
+ while lnum <= 12
+ if getline(lnum) =~# '^\(//\|inherit\|private\|protected\|nosave\|string\|object\|mapping\|mixed\)'
+ setf lpc
+ return
+ endif
+ let lnum = lnum + 1
+ endwhile
+ endif
+ setf c
+endfunc
+
+func dist#ft#FTheader()
+ if match(getline(1, min([line("$"), 200])), '^@\(interface\|end\|class\)') > -1
+ if exists("g:c_syntax_for_h")
+ setf objc
+ else
+ setf objcpp
+ endif
+ elseif exists("g:c_syntax_for_h")
+ setf c
+ elseif exists("g:ch_syntax_for_h")
+ setf ch
+ else
+ setf cpp
+ endif
+endfunc
+
+" This function checks if one of the first ten lines start with a '@'. In
+" that case it is probably a change file.
+" If the first line starts with # or ! it's probably a ch file.
+" If a line has "main", "include", "//" ir "/*" it's probably ch.
+" Otherwise CHILL is assumed.
+func dist#ft#FTchange()
+ let lnum = 1
+ while lnum <= 10
+ if getline(lnum)[0] == '@'
+ setf change
+ return
+ endif
+ if lnum == 1 && (getline(1)[0] == '#' || getline(1)[0] == '!')
+ setf ch
+ return
+ endif
+ if getline(lnum) =~ "MODULE"
+ setf chill
+ return
+ endif
+ if getline(lnum) =~ 'main\s*(\|#\s*include\|//'
+ setf ch
+ return
+ endif
+ let lnum = lnum + 1
+ endwhile
+ setf chill
+endfunc
+
+func dist#ft#FTent()
+ " This function checks for valid cl syntax in the first five lines.
+ " Look for either an opening comment, '#', or a block start, '{".
+ " If not found, assume SGML.
+ let lnum = 1
+ while lnum < 6
+ let line = getline(lnum)
+ if line =~ '^\s*[#{]'
+ setf cl
+ return
+ elseif line !~ '^\s*$'
+ " Not a blank line, not a comment, and not a block start,
+ " so doesn't look like valid cl code.
+ break
+ endif
+ let lnum = lnum + 1
+ endw
+ setf dtd
+endfunc
+
+func dist#ft#EuphoriaCheck()
+ if exists('g:filetype_euphoria')
+ exe 'setf ' . g:filetype_euphoria
+ else
+ setf euphoria3
+ endif
+endfunc
+
+func dist#ft#DtraceCheck()
+ let lines = getline(1, min([line("$"), 100]))
+ if match(lines, '^module\>\|^import\>') > -1
+ " D files often start with a module and/or import statement.
+ setf d
+ elseif match(lines, '^#!\S\+dtrace\|#pragma\s\+D\s\+option\|:\S\{-}:\S\{-}:') > -1
+ setf dtrace
+ else
+ setf d
+ endif
+endfunc
+
+func dist#ft#FTe()
+ if exists('g:filetype_euphoria')
+ exe 'setf ' . g:filetype_euphoria
+ else
+ let n = 1
+ while n < 100 && n < line("$")
+ if getline(n) =~ "^\\s*\\(<'\\|'>\\)\\s*$"
+ setf specman
+ return
+ endif
+ let n = n + 1
+ endwhile
+ setf eiffel
+ endif
+endfunc
+
+" Distinguish between HTML, XHTML and Django
+func dist#ft#FThtml()
+ let n = 1
+ while n < 10 && n < line("$")
+ if getline(n) =~ '\<DTD\s\+XHTML\s'
+ setf xhtml
+ return
+ endif
+ if getline(n) =~ '{%\s*\(extends\|block\|load\)\>\|{#\s\+'
+ setf htmldjango
+ return
+ endif
+ let n = n + 1
+ endwhile
+ setf html
+endfunc
+
+" Distinguish between standard IDL and MS-IDL
+func dist#ft#FTidl()
+ let n = 1
+ while n < 50 && n < line("$")
+ if getline(n) =~ '^\s*import\s\+"\(unknwn\|objidl\)\.idl"'
+ setf msidl
+ return
+ endif
+ let n = n + 1
+ endwhile
+ setf idl
+endfunc
+
+" Distinguish between "default" and Cproto prototype file. */
+func dist#ft#ProtoCheck(default)
+ " Cproto files have a comment in the first line and a function prototype in
+ " the second line, it always ends in ";". Indent files may also have
+ " comments, thus we can't match comments to see the difference.
+ " IDL files can have a single ';' in the second line, require at least one
+ " chacter before the ';'.
+ if getline(2) =~ '.;$'
+ setf cpp
+ else
+ exe 'setf ' . a:default
+ endif
+endfunc
+
+func dist#ft#FTm()
+ let n = 1
+ let saw_comment = 0 " Whether we've seen a multiline comment leader.
+ while n < 100
+ let line = getline(n)
+ if line =~ '^\s*/\*'
+ " /* ... */ is a comment in Objective C and Murphi, so we can't conclude
+ " it's either of them yet, but track this as a hint in case we don't see
+ " anything more definitive.
+ let saw_comment = 1
+ endif
+ if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|//\)'
+ setf objc
+ return
+ endif
+ if line =~ '^\s*%'
+ setf matlab
+ return
+ endif
+ if line =~ '^\s*(\*'
+ setf mma
+ return
+ endif
+ if line =~ '^\c\s*\(\(type\|var\)\>\|--\)'
+ setf murphi
+ return
+ endif
+ let n = n + 1
+ endwhile
+
+ if saw_comment
+ " We didn't see anything definitive, but this looks like either Objective C
+ " or Murphi based on the comment leader. Assume the former as it is more
+ " common.
+ setf objc
+ elseif exists("g:filetype_m")
+ " Use user specified default filetype for .m
+ exe "setf " . g:filetype_m
+ else
+ " Default is matlab
+ setf matlab
+ endif
+endfunc
+
+func dist#ft#FTmms()
+ let n = 1
+ while n < 10
+ let line = getline(n)
+ if line =~ '^\s*\(%\|//\)' || line =~ '^\*'
+ setf mmix
+ return
+ endif
+ if line =~ '^\s*#'
+ setf make
+ return
+ endif
+ let n = n + 1
+ endwhile
+ setf mmix
+endfunc
+
+" This function checks if one of the first five lines start with a dot. In
+" that case it is probably an nroff file: 'filetype' is set and 1 is returned.
+func dist#ft#FTnroff()
+ if getline(1)[0] . getline(2)[0] . getline(3)[0] . getline(4)[0] . getline(5)[0] =~ '\.'
+ setf nroff
+ return 1
+ endif
+ return 0
+endfunc
+
+func dist#ft#FTmm()
+ let n = 1
+ while n < 10
+ let line = getline(n)
+ if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|/\*\)'
+ setf objcpp
+ return
+ endif
+ let n = n + 1
+ endwhile
+ setf nroff
+endfunc
+
+func dist#ft#FTpl()
+ if exists("g:filetype_pl")
+ exe "setf " . g:filetype_pl
+ else
+ " recognize Prolog by specific text in the first non-empty line
+ " require a blank after the '%' because Perl uses "%list" and "%translate"
+ let l = getline(nextnonblank(1))
+ if l =~ '\<prolog\>' || l =~ '^\s*\(%\+\(\s\|$\)\|/\*\)' || l =~ ':-'
+ setf prolog
+ else
+ setf perl
+ endif
+ endif
+endfunc
+
+func dist#ft#FTinc()
+ if exists("g:filetype_inc")
+ exe "setf " . g:filetype_inc
+ else
+ let lines = getline(1).getline(2).getline(3)
+ if lines =~? "perlscript"
+ setf aspperl
+ elseif lines =~ "<%"
+ setf aspvbs
+ elseif lines =~ "<?"
+ setf php
+ else
+ call dist#ft#FTasmsyntax()
+ if exists("b:asmsyntax")
+ exe "setf " . fnameescape(b:asmsyntax)
+ else
+ setf pov
+ endif
+ endif
+ endif
+endfunc
+
+func dist#ft#FTprogress_cweb()
+ if exists("g:filetype_w")
+ exe "setf " . g:filetype_w
+ return
+ endif
+ if getline(1) =~ '&ANALYZE' || getline(3) =~ '&GLOBAL-DEFINE'
+ setf progress
+ else
+ setf cweb
+ endif
+endfunc
+
+func dist#ft#FTprogress_asm()
+ if exists("g:filetype_i")
+ exe "setf " . g:filetype_i
+ return
+ endif
+ " This function checks for an assembly comment the first ten lines.
+ " If not found, assume Progress.
+ let lnum = 1
+ while lnum <= 10 && lnum < line('$')
+ let line = getline(lnum)
+ if line =~ '^\s*;' || line =~ '^\*'
+ call dist#ft#FTasm()
+ return
+ elseif line !~ '^\s*$' || line =~ '^/\*'
+ " Not an empty line: Doesn't look like valid assembly code.
+ " Or it looks like a Progress /* comment
+ break
+ endif
+ let lnum = lnum + 1
+ endw
+ setf progress
+endfunc
+
+func dist#ft#FTprogress_pascal()
+ if exists("g:filetype_p")
+ exe "setf " . g:filetype_p
+ return
+ endif
+ " This function checks for valid Pascal syntax in the first ten lines.
+ " Look for either an opening comment or a program start.
+ " If not found, assume Progress.
+ let lnum = 1
+ while lnum <= 10 && lnum < line('$')
+ let line = getline(lnum)
+ if line =~ '^\s*\(program\|unit\|procedure\|function\|const\|type\|var\)\>'
+ \ || line =~ '^\s*{' || line =~ '^\s*(\*'
+ setf pascal
+ return
+ elseif line !~ '^\s*$' || line =~ '^/\*'
+ " Not an empty line: Doesn't look like valid Pascal code.
+ " Or it looks like a Progress /* comment
+ break
+ endif
+ let lnum = lnum + 1
+ endw
+ setf progress
+endfunc
+
+func dist#ft#FTr()
+ let max = line("$") > 50 ? 50 : line("$")
+
+ for n in range(1, max)
+ " Rebol is easy to recognize, check for that first
+ if getline(n) =~? '\<REBOL\>'
+ setf rebol
+ return
+ endif
+ endfor
+
+ for n in range(1, max)
+ " R has # comments
+ if getline(n) =~ '^\s*#'
+ setf r
+ return
+ endif
+ " Rexx has /* comments */
+ if getline(n) =~ '^\s*/\*'
+ setf rexx
+ return
+ endif
+ endfor
+
+ " Nothing recognized, use user default or assume Rexx
+ if exists("g:filetype_r")
+ exe "setf " . g:filetype_r
+ else
+ " Rexx used to be the default, but R appears to be much more popular.
+ setf r
+ endif
+endfunc
+
+func dist#ft#McSetf()
+ " Rely on the file to start with a comment.
+ " MS message text files use ';', Sendmail files use '#' or 'dnl'
+ for lnum in range(1, min([line("$"), 20]))
+ let line = getline(lnum)
+ if line =~ '^\s*\(#\|dnl\)'
+ setf m4 " Sendmail .mc file
+ return
+ elseif line =~ '^\s*;'
+ setf msmessages " MS Message text file
+ return
+ endif
+ endfor
+ setf m4 " Default: Sendmail .mc file
+endfunc
+
+" Called from filetype.vim and scripts.vim.
+func dist#ft#SetFileTypeSH(name)
+ if expand("<amatch>") =~ g:ft_ignore_pat
+ return
+ endif
+ if a:name =~ '\<csh\>'
+ " Some .sh scripts contain #!/bin/csh.
+ call dist#ft#SetFileTypeShell("csh")
+ return
+ elseif a:name =~ '\<tcsh\>'
+ " Some .sh scripts contain #!/bin/tcsh.
+ call dist#ft#SetFileTypeShell("tcsh")
+ return
+ elseif a:name =~ '\<zsh\>'
+ " Some .sh scripts contain #!/bin/zsh.
+ call dist#ft#SetFileTypeShell("zsh")
+ return
+ elseif a:name =~ '\<ksh\>'
+ let b:is_kornshell = 1
+ if exists("b:is_bash")
+ unlet b:is_bash
+ endif
+ if exists("b:is_sh")
+ unlet b:is_sh
+ endif
+ elseif exists("g:bash_is_sh") || a:name =~ '\<bash\>' || a:name =~ '\<bash2\>'
+ let b:is_bash = 1
+ if exists("b:is_kornshell")
+ unlet b:is_kornshell
+ endif
+ if exists("b:is_sh")
+ unlet b:is_sh
+ endif
+ elseif a:name =~ '\<sh\>'
+ let b:is_sh = 1
+ if exists("b:is_kornshell")
+ unlet b:is_kornshell
+ endif
+ if exists("b:is_bash")
+ unlet b:is_bash
+ endif
+ endif
+ call dist#ft#SetFileTypeShell("sh")
+endfunc
+
+" For shell-like file types, check for an "exec" command hidden in a comment,
+" as used for Tcl.
+" Also called from scripts.vim, thus can't be local to this script.
+func dist#ft#SetFileTypeShell(name)
+ if expand("<amatch>") =~ g:ft_ignore_pat
+ return
+ endif
+ let l = 2
+ while l < 20 && l < line("$") && getline(l) =~ '^\s*\(#\|$\)'
+ " Skip empty and comment lines.
+ let l = l + 1
+ endwhile
+ if l < line("$") && getline(l) =~ '\s*exec\s' && getline(l - 1) =~ '^\s*#.*\\$'
+ " Found an "exec" line after a comment with continuation
+ let n = substitute(getline(l),'\s*exec\s\+\([^ ]*/\)\=', '', '')
+ if n =~ '\<tclsh\|\<wish'
+ setf tcl
+ return
+ endif
+ endif
+ exe "setf " . a:name
+endfunc
+
+func dist#ft#CSH()
+ if exists("g:filetype_csh")
+ call dist#ft#SetFileTypeShell(g:filetype_csh)
+ elseif &shell =~ "tcsh"
+ call dist#ft#SetFileTypeShell("tcsh")
+ else
+ call dist#ft#SetFileTypeShell("csh")
+ endif
+endfunc
+
+let s:ft_rules_udev_rules_pattern = '^\s*\cudev_rules\s*=\s*"\([^"]\{-1,}\)/*".*'
+func dist#ft#FTRules()
+ let path = expand('<amatch>:p')
+ if path =~ '^/\(etc/udev/\%(rules\.d/\)\=.*\.rules\|lib/udev/\%(rules\.d/\)\=.*\.rules\)$'
+ setf udevrules
+ return
+ endif
+ if path =~ '^/etc/ufw/'
+ setf conf " Better than hog
+ return
+ endif
+ if path =~ '^/\(etc\|usr/share\)/polkit-1/rules\.d'
+ setf javascript
+ return
+ endif
+ try
+ let config_lines = readfile('/etc/udev/udev.conf')
+ catch /^Vim\%((\a\+)\)\=:E484/
+ setf hog
+ return
+ endtry
+ let dir = expand('<amatch>:p:h')
+ for line in config_lines
+ if line =~ s:ft_rules_udev_rules_pattern
+ let udev_rules = substitute(line, s:ft_rules_udev_rules_pattern, '\1', "")
+ if dir == udev_rules
+ setf udevrules
+ endif
+ break
+ endif
+ endfor
+ setf hog
+endfunc
+
+func dist#ft#SQL()
+ if exists("g:filetype_sql")
+ exe "setf " . g:filetype_sql
+ else
+ setf sql
+ endif
+endfunc
+
+" If the file has an extension of 't' and is in a directory 't' or 'xt' then
+" it is almost certainly a Perl test file.
+" If the first line starts with '#' and contains 'perl' it's probably a Perl
+" file.
+" (Slow test) If a file contains a 'use' statement then it is almost certainly
+" a Perl file.
+func dist#ft#FTperl()
+ let dirname = expand("%:p:h:t")
+ if expand("%:e") == 't' && (dirname == 't' || dirname == 'xt')
+ setf perl
+ return 1
+ endif
+ if getline(1)[0] == '#' && getline(1) =~ 'perl'
+ setf perl
+ return 1
+ endif
+ let save_cursor = getpos('.')
+ call cursor(1,1)
+ let has_use = search('^use\s\s*\k', 'c', 30)
+ call setpos('.', save_cursor)
+ if has_use
+ setf perl
+ return 1
+ endif
+ return 0
+endfunc
+
+" Choose context, plaintex, or tex (LaTeX) based on these rules:
+" 1. Check the first line of the file for "%&<format>".
+" 2. Check the first 1000 non-comment lines for LaTeX or ConTeXt keywords.
+" 3. Default to "plain" or to g:tex_flavor, can be set in user's vimrc.
+func dist#ft#FTtex()
+ let firstline = getline(1)
+ if firstline =~ '^%&\s*\a\+'
+ let format = tolower(matchstr(firstline, '\a\+'))
+ let format = substitute(format, 'pdf', '', '')
+ if format == 'tex'
+ let format = 'latex'
+ elseif format == 'plaintex'
+ let format = 'plain'
+ endif
+ elseif expand('%') =~ 'tex/context/.*/.*.tex'
+ let format = 'context'
+ else
+ " Default value, may be changed later:
+ let format = exists("g:tex_flavor") ? g:tex_flavor : 'plain'
+ " Save position, go to the top of the file, find first non-comment line.
+ let save_cursor = getpos('.')
+ call cursor(1,1)
+ let firstNC = search('^\s*[^[:space:]%]', 'c', 1000)
+ if firstNC " Check the next thousand lines for a LaTeX or ConTeXt keyword.
+ let lpat = 'documentclass\>\|usepackage\>\|begin{\|newcommand\>\|renewcommand\>'
+ let cpat = 'start\a\+\|setup\a\+\|usemodule\|enablemode\|enableregime\|setvariables\|useencoding\|usesymbols\|stelle\a\+\|verwende\a\+\|stel\a\+\|gebruik\a\+\|usa\a\+\|imposta\a\+\|regle\a\+\|utilisemodule\>'
+ let kwline = search('^\s*\\\%(' . lpat . '\)\|^\s*\\\(' . cpat . '\)',
+ \ 'cnp', firstNC + 1000)
+ if kwline == 1 " lpat matched
+ let format = 'latex'
+ elseif kwline == 2 " cpat matched
+ let format = 'context'
+ endif " If neither matched, keep default set above.
+ " let lline = search('^\s*\\\%(' . lpat . '\)', 'cn', firstNC + 1000)
+ " let cline = search('^\s*\\\%(' . cpat . '\)', 'cn', firstNC + 1000)
+ " if cline > 0
+ " let format = 'context'
+ " endif
+ " if lline > 0 && (cline == 0 || cline > lline)
+ " let format = 'tex'
+ " endif
+ endif " firstNC
+ call setpos('.', save_cursor)
+ endif " firstline =~ '^%&\s*\a\+'
+
+ " Translation from formats to file types. TODO: add AMSTeX, RevTex, others?
+ if format == 'plain'
+ setf plaintex
+ elseif format == 'context'
+ setf context
+ else " probably LaTeX
+ setf tex
+ endif
+ return
+endfunc
+
+func dist#ft#FTxml()
+ let n = 1
+ while n < 100 && n < line("$")
+ let line = getline(n)
+ " DocBook 4 or DocBook 5.
+ let is_docbook4 = line =~ '<!DOCTYPE.*DocBook'
+ let is_docbook5 = line =~ ' xmlns="http://docbook.org/ns/docbook"'
+ if is_docbook4 || is_docbook5
+ let b:docbk_type = "xml"
+ if is_docbook5
+ let b:docbk_ver = 5
+ else
+ let b:docbk_ver = 4
+ endif
+ setf docbk
+ return
+ endif
+ if line =~ 'xmlns:xbl="http://www.mozilla.org/xbl"'
+ setf xbl
+ return
+ endif
+ let n += 1
+ endwhile
+ setf xml
+endfunc
+
+func dist#ft#FTy()
+ let n = 1
+ while n < 100 && n < line("$")
+ let line = getline(n)
+ if line =~ '^\s*%'
+ setf yacc
+ return
+ endif
+ if getline(n) =~ '^\s*\(#\|class\>\)' && getline(n) !~ '^\s*#\s*include'
+ setf racc
+ return
+ endif
+ let n = n + 1
+ endwhile
+ setf yacc
+endfunc
+
+func dist#ft#Redif()
+ let lnum = 1
+ while lnum <= 5 && lnum < line('$')
+ if getline(lnum) =~ "^\ctemplate-type:"
+ setf redif
+ return
+ endif
+ let lnum = lnum + 1
+ endwhile
+endfunc
+
+
+" Restore 'cpoptions'
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/autoload/gzip.vim b/runtime/autoload/gzip.vim
index a6b4605b06..e4adec0947 100644
--- a/runtime/autoload/gzip.vim
+++ b/runtime/autoload/gzip.vim
@@ -1,6 +1,6 @@
" Vim autoload file for editing compressed files.
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2014 Nov 05
+" Last Change: 2016 Sep 28
" These functions are used by the gzip plugin.
@@ -63,6 +63,9 @@ fun gzip#read(cmd)
" set 'modifiable'
let ma_save = &ma
setlocal ma
+ " set 'write'
+ let write_save = &write
+ set write
" Reset 'foldenable', otherwise line numbers get adjusted.
if has("folding")
let fen_save = &fen
@@ -127,6 +130,7 @@ fun gzip#read(cmd)
let &pm = pm_save
let &cpo = cpo_save
let &l:ma = ma_save
+ let &write = write_save
if has("folding")
let &l:fen = fen_save
endif
diff --git a/runtime/autoload/haskellcomplete.vim b/runtime/autoload/haskellcomplete.vim
new file mode 100644
index 0000000000..520ab93700
--- /dev/null
+++ b/runtime/autoload/haskellcomplete.vim
@@ -0,0 +1,3382 @@
+" Vim completion script
+" Language: Haskell
+" Maintainer: Daniel Campoverde <alx@sillybytes.net>
+" URL: https://github.com/alx741/haskellcomplete.vim
+" Last Change: 2018 Aug 26
+
+" Usage: setlocal omnifunc=haskellcomplete#Complete
+
+
+" Language extensions from:
+" https://hackage.haskell.org/package/Cabal-2.2.0.1/docs/Language-Haskell-Extension.html
+"
+" GHC options from:
+" https://downloads.haskell.org/~ghc/7.0.4/docs/html/users_guide/flag-reference.html
+" https://downloads.haskell.org/~ghc/8.4.3/docs/html/users_guide/flags.html
+
+
+
+" Available completions
+let b:completingLangExtension = 0
+let b:completingOptionsGHC = 0
+let b:completingModule = 0
+
+function! haskellcomplete#Complete(findstart, base)
+ if a:findstart
+ let l:line = getline('.')
+ let l:start = col('.') - 1
+
+ if l:line =~ '^\s*{-#\s*LANGUAGE.*'
+ while l:start >= 0 && l:line[l:start - 1] !~ '[, ]'
+ let l:start -= 1
+ endwhile
+ let b:completingLangExtension = 1
+ return l:start
+
+ elseif l:line =~ '^\s*{-#\s*OPTIONS_GHC.*'
+ while l:start >= 0 && l:line[l:start - 1] !~ '[, ]'
+ let l:start -= 1
+ endwhile
+ let b:completingOptionsGHC = 1
+ return l:start
+
+ elseif l:line =~ '^\s*import\s*.*'
+ while l:start >= 0 && l:line[l:start - 1] !~ ' '
+ let l:start -= 1
+ endwhile
+ let b:completingModule = 1
+ return l:start
+
+ endif
+
+ return start
+ endif
+
+ if b:completingLangExtension
+ if a:base ==? ""
+ " Return all posible Lang extensions
+ return s:langExtensions
+ else
+ let l:matches = []
+ for extension in s:langExtensions
+ if extension =~? '^' . a:base
+ call add(l:matches, extension)
+ endif
+ endfor
+ return l:matches
+ endif
+
+
+ elseif b:completingOptionsGHC
+ if a:base ==? ""
+ " Return all posible GHC options
+ return s:optionsGHC
+ else
+ let l:matches = []
+ for flag in s:optionsGHC
+ if flag =~? '^' . a:base
+ call add(l:matches, flag)
+ endif
+ endfor
+ return l:matches
+ endif
+
+
+ elseif b:completingModule
+ if a:base ==? ""
+ " Return all posible modules
+ return s:commonModules
+ else
+ let l:matches = []
+ for module in s:commonModules
+ if module =~? '^' . a:base
+ call add(l:matches, module)
+ endif
+ endfor
+ return l:matches
+ endif
+
+ endif
+
+ return -1
+endfunction
+
+let s:langExtensions =
+ \ [ "OverlappingInstances"
+ \ , "UndecidableInstances"
+ \ , "IncoherentInstances"
+ \ , "DoRec"
+ \ , "RecursiveDo"
+ \ , "ParallelListComp"
+ \ , "MultiParamTypeClasses"
+ \ , "MonomorphismRestriction"
+ \ , "FunctionalDependencies"
+ \ , "Rank2Types"
+ \ , "RankNTypes"
+ \ , "PolymorphicComponents"
+ \ , "ExistentialQuantification"
+ \ , "ScopedTypeVariables"
+ \ , "PatternSignatures"
+ \ , "ImplicitParams"
+ \ , "FlexibleContexts"
+ \ , "FlexibleInstances"
+ \ , "EmptyDataDecls"
+ \ , "CPP"
+ \ , "KindSignatures"
+ \ , "BangPatterns"
+ \ , "TypeSynonymInstances"
+ \ , "TemplateHaskell"
+ \ , "ForeignFunctionInterface"
+ \ , "Arrows"
+ \ , "Generics"
+ \ , "ImplicitPrelude"
+ \ , "NamedFieldPuns"
+ \ , "PatternGuards"
+ \ , "GeneralizedNewtypeDeriving"
+ \ , "ExtensibleRecords"
+ \ , "RestrictedTypeSynonyms"
+ \ , "HereDocuments"
+ \ , "MagicHash"
+ \ , "TypeFamilies"
+ \ , "StandaloneDeriving"
+ \ , "UnicodeSyntax"
+ \ , "UnliftedFFITypes"
+ \ , "InterruptibleFFI"
+ \ , "CApiFFI"
+ \ , "LiberalTypeSynonyms"
+ \ , "TypeOperators"
+ \ , "RecordWildCards"
+ \ , "RecordPuns"
+ \ , "DisambiguateRecordFields"
+ \ , "TraditionalRecordSyntax"
+ \ , "OverloadedStrings"
+ \ , "GADTs"
+ \ , "GADTSyntax"
+ \ , "MonoPatBinds"
+ \ , "RelaxedPolyRec"
+ \ , "ExtendedDefaultRules"
+ \ , "UnboxedTuples"
+ \ , "DeriveDataTypeable"
+ \ , "DeriveGeneric"
+ \ , "DefaultSignatures"
+ \ , "InstanceSigs"
+ \ , "ConstrainedClassMethods"
+ \ , "PackageImports"
+ \ , "ImpredicativeTypes"
+ \ , "NewQualifiedOperators"
+ \ , "PostfixOperators"
+ \ , "QuasiQuotes"
+ \ , "TransformListComp"
+ \ , "MonadComprehensions"
+ \ , "ViewPatterns"
+ \ , "XmlSyntax"
+ \ , "RegularPatterns"
+ \ , "TupleSections"
+ \ , "GHCForeignImportPrim"
+ \ , "NPlusKPatterns"
+ \ , "DoAndIfThenElse"
+ \ , "MultiWayIf"
+ \ , "LambdaCase"
+ \ , "RebindableSyntax"
+ \ , "ExplicitForAll"
+ \ , "DatatypeContexts"
+ \ , "MonoLocalBinds"
+ \ , "DeriveFunctor"
+ \ , "DeriveTraversable"
+ \ , "DeriveFoldable"
+ \ , "NondecreasingIndentation"
+ \ , "SafeImports"
+ \ , "Safe"
+ \ , "Trustworthy"
+ \ , "Unsafe"
+ \ , "ConstraintKinds"
+ \ , "PolyKinds"
+ \ , "DataKinds"
+ \ , "ParallelArrays"
+ \ , "RoleAnnotations"
+ \ , "OverloadedLists"
+ \ , "EmptyCase"
+ \ , "AutoDeriveTypeable"
+ \ , "NegativeLiterals"
+ \ , "BinaryLiterals"
+ \ , "NumDecimals"
+ \ , "NullaryTypeClasses"
+ \ , "ExplicitNamespaces"
+ \ , "AllowAmbiguousTypes"
+ \ , "JavaScriptFFI"
+ \ , "PatternSynonyms"
+ \ , "PartialTypeSignatures"
+ \ , "NamedWildCards"
+ \ , "DeriveAnyClass"
+ \ , "DeriveLift"
+ \ , "StaticPointers"
+ \ , "StrictData"
+ \ , "Strict"
+ \ , "ApplicativeDo"
+ \ , "DuplicateRecordFields"
+ \ , "TypeApplications"
+ \ , "TypeInType"
+ \ , "UndecidableSuperClasses"
+ \ , "MonadFailDesugaring"
+ \ , "TemplateHaskellQuotes"
+ \ , "OverloadedLabels"
+ \ , "TypeFamilyDependencies"
+ \ , "DerivingStrategies"
+ \ , "UnboxedSums"
+ \ , "HexFloatLiterals"
+ \ ]
+
+let s:optionsGHC =
+ \ [ "-n"
+ \ , "-v"
+ \ , "-vn"
+ \ , "-c"
+ \ , "-hcsuf"
+ \ , "-hidir"
+ \ , "-hisuf"
+ \ , "-o"
+ \ , "-odir"
+ \ , "-ohi"
+ \ , "-osuf"
+ \ , "-stubdir"
+ \ , "-outputdir"
+ \ , "-keep-hc-file"
+ \ , "-keep-llvm-file"
+ \ , "-keep-s-file"
+ \ , "-keep-raw-s-file"
+ \ , "-keep-tmp-files"
+ \ , "-tmpdir"
+ \ , "-ddump-hi"
+ \ , "-ddump-hi-diffs"
+ \ , "-ddump-minimal-imports"
+ \ , "-fforce-recomp"
+ \ , "-fno-force-recomp"
+ \ , "-fbreak-on-exception"
+ \ , "-fno-break-on-exception"
+ \ , "-fbreak-on-error"
+ \ , "-fno-break-on-error"
+ \ , "-fprint-evld-with-show"
+ \ , "-fno-print-evld-with-show"
+ \ , "-fprint-bind-result"
+ \ , "-fno-print-bind-result"
+ \ , "-fno-print-bind-contents"
+ \ , "-fno-implicit-import-qualified"
+ \ , "-package-name"
+ \ , "-no-auto-link-packages"
+ \ , "-fglasgow-exts"
+ \ , "-fno-glasgow-exts"
+ \ , "-XOverlappingInstances"
+ \ , "-XNoOverlappingInstances"
+ \ , "-XIncoherentInstances"
+ \ , "-XNoIncoherentInstances"
+ \ , "-XUndecidableInstances"
+ \ , "-XNoUndecidableInstances"
+ \ , "-fcontext-stack=Nn"
+ \ , "-XArrows"
+ \ , "-XNoArrows"
+ \ , "-XDisambiguateRecordFields"
+ \ , "-XNoDisambiguateRecordFields"
+ \ , "-XForeignFunctionInterface"
+ \ , "-XNoForeignFunctionInterface"
+ \ , "-XGenerics"
+ \ , "-XNoGenerics"
+ \ , "-XImplicitParams"
+ \ , "-XNoImplicitParams"
+ \ , "-firrefutable-tuples"
+ \ , "-fno-irrefutable-tuples"
+ \ , "-XNoImplicitPrelude"
+ \ , "-XImplicitPrelude"
+ \ , "-XRebindableSyntax"
+ \ , "-XNoRebindableSyntax"
+ \ , "-XNoMonomorphismRestriction"
+ \ , "-XMonomorphismRrestriction"
+ \ , "-XNoNPlusKPatterns"
+ \ , "-XNPlusKPatterns"
+ \ , "-XNoMonoPatBinds"
+ \ , "-XMonoPatBinds"
+ \ , "-XRelaxedPolyRec"
+ \ , "-XNoRelaxedPolyRec"
+ \ , "-XExtendedDefaultRules"
+ \ , "-XNoExtendedDefaultRules"
+ \ , "-XOverloadedStrings"
+ \ , "-XNoOverloadedStrings"
+ \ , "-XGADTs"
+ \ , "-XNoGADTs"
+ \ , "-XTypeFamilies"
+ \ , "-XNoTypeFamilies"
+ \ , "-XScopedTypeVariables"
+ \ , "-XNoScopedTypeVariables"
+ \ , "-XMonoLocalBinds"
+ \ , "-XNoMonoLocalBinds"
+ \ , "-XTemplateHaskell"
+ \ , "-XNoTemplateHaskell"
+ \ , "-XQuasiQuotes"
+ \ , "-XNoQuasiQuotes"
+ \ , "-XBangPatterns"
+ \ , "-XNoBangPatterns"
+ \ , "-XCPP"
+ \ , "-XNoCPP"
+ \ , "-XPatternGuards"
+ \ , "-XNoPatternGuards"
+ \ , "-XViewPatterns"
+ \ , "-XNoViewPatterns"
+ \ , "-XUnicodeSyntax"
+ \ , "-XNoUnicodeSyntax"
+ \ , "-XMagicHash"
+ \ , "-XNoMagicHash"
+ \ , "-XNewQualifiedOperators"
+ \ , "-XNoNewQualifiedOperators"
+ \ , "-XExplicitForALl"
+ \ , "-XNoExplicitForAll"
+ \ , "-XPolymorphicComponents"
+ \ , "-XNoPolymorphicComponents"
+ \ , "-XRank2Types"
+ \ , "-XNoRank2Types"
+ \ , "-XRankNTypes"
+ \ , "-XNoRankNTypes"
+ \ , "-XImpredicativeTypes"
+ \ , "-XNoImpredicativeTypes"
+ \ , "-XExistentialQuantification"
+ \ , "-XNoExistentialQuantification"
+ \ , "-XKindSignatures"
+ \ , "-XNoKindSignatures"
+ \ , "-XEmptyDataDecls"
+ \ , "-XNoEmptyDataDecls"
+ \ , "-XParallelListComp"
+ \ , "-XNoParallelListComp"
+ \ , "-XTransformListComp"
+ \ , "-XNoTransformListComp"
+ \ , "-XUnliftedFFITypes"
+ \ , "-XNoUnliftedFFITypes"
+ \ , "-XLiberalTypeSynonyms"
+ \ , "-XNoLiberalTypeSynonyms"
+ \ , "-XTypeOperators"
+ \ , "-XNoTypeOperators"
+ \ , "-XDoRec"
+ \ , "-XNoDoRec"
+ \ , "-XRecursiveDo"
+ \ , "-XNoRecursiveDo"
+ \ , "-XPArr"
+ \ , "-XNoPArr"
+ \ , "-XRecordWildCards"
+ \ , "-XNoRecordWildCards"
+ \ , "-XNamedFieldPuns"
+ \ , "-XNoNamedFieldPuns"
+ \ , "-XDisambiguateRecordFields"
+ \ , "-XNoDisambiguateRecordFields"
+ \ , "-XUnboxedTuples"
+ \ , "-XNoUnboxedTuples"
+ \ , "-XStandaloneDeriving"
+ \ , "-XNoStandaloneDeriving"
+ \ , "-XDeriveDataTypeable"
+ \ , "-XNoDeriveDataTypeable"
+ \ , "-XGeneralizedNewtypeDeriving"
+ \ , "-XNoGeneralizedNewtypeDeriving"
+ \ , "-XTypeSynonymInstances"
+ \ , "-XNoTypeSynonymInstances"
+ \ , "-XFlexibleContexts"
+ \ , "-XNoFlexibleContexts"
+ \ , "-XFlexibleInstances"
+ \ , "-XNoFlexibleInstances"
+ \ , "-XConstrainedClassMethods"
+ \ , "-XNoConstrainedClassMethods"
+ \ , "-XMultiParamTypeClasses"
+ \ , "-XNoMultiParamTypeClasses"
+ \ , "-XFunctionalDependencies"
+ \ , "-XNoFunctionalDependencies"
+ \ , "-XPackageImports"
+ \ , "-XNoPackageImports"
+ \ , "-W"
+ \ , "-w"
+ \ , "-w"
+ \ , "-Wall"
+ \ , "-w"
+ \ , "-Werror"
+ \ , "-Wwarn"
+ \ , "-Wwarn"
+ \ , "-Werror"
+ \ , "-fwarn-unrecognised-pragmas"
+ \ , "-fno-warn-unrecognised-pragmas"
+ \ , "-fwarn-warnings-deprecations"
+ \ , "-fno-warn-warnings-deprecations"
+ \ , "-fwarn-deprecated-flags"
+ \ , "-fno-warn-deprecated-flags"
+ \ , "-fwarn-duplicate-exports"
+ \ , "-fno-warn-duplicate-exports"
+ \ , "-fwarn-hi-shadowing"
+ \ , "-fno-warn-hi-shadowing"
+ \ , "-fwarn-implicit-prelude"
+ \ , "-fno-warn-implicit-prelude"
+ \ , "-fwarn-incomplete-patterns"
+ \ , "-fno-warn-incomplete-patterns"
+ \ , "-fwarn-incomplete-record-updates"
+ \ , "-fno-warn-incomplete-record-updates"
+ \ , "-fwarn-lazy-unlifted-bindings"
+ \ , "-fno-warn-lazy-unlifted-bindings"
+ \ , "-fwarn-missing-fields"
+ \ , "-fno-warn-missing-fields"
+ \ , "-fwarn-missing-import-lists"
+ \ , "-fnowarn-missing-import-lists"
+ \ , "-fwarn-missing-methods"
+ \ , "-fno-warn-missing-methods"
+ \ , "-fwarn-missing-signatures"
+ \ , "-fno-warn-missing-signatures"
+ \ , "-fwarn-name-shadowing"
+ \ , "-fno-warn-name-shadowing"
+ \ , "-fwarn-orphans"
+ \ , "-fno-warn-orphans"
+ \ , "-fwarn-overlapping-patterns"
+ \ , "-fno-warn-overlapping-patterns"
+ \ , "-fwarn-tabs"
+ \ , "-fno-warn-tabs"
+ \ , "-fwarn-type-defaults"
+ \ , "-fno-warn-type-defaults"
+ \ , "-fwarn-monomorphism-restriction"
+ \ , "-fno-warn-monomorphism-restriction"
+ \ , "-fwarn-unused-binds"
+ \ , "-fno-warn-unused-binds"
+ \ , "-fwarn-unused-imports"
+ \ , "-fno-warn-unused-imports"
+ \ , "-fwarn-unused-matches"
+ \ , "-fno-warn-unused-matches"
+ \ , "-fwarn-unused-do-bind"
+ \ , "-fno-warn-unused-do-bind"
+ \ , "-fwarn-wrong-do-bind"
+ \ , "-fno-warn-wrong-do-bind"
+ \ , "-O"
+ \ , "-O0"
+ \ , "-On"
+ \ , "-O0"
+ \ , "-fcase-merge"
+ \ , "-fno-case-merge"
+ \ , "-fmethod-sharing"
+ \ , "-fno-method-sharing"
+ \ , "-fdo-eta-reduction"
+ \ , "-fno-do-eta-reduction"
+ \ , "-fdo-lambda-eta-expansion"
+ \ , "-fno-do-lambda-eta-expansion"
+ \ , "-fexcess-precision"
+ \ , "-fno-excess-precision"
+ \ , "-fignore-asserts"
+ \ , "-fno-ignore-asserts"
+ \ , "-fignore-interface-pragmas"
+ \ , "-fno-ignore-interface-pragmas"
+ \ , "-fomit-interface-pragmas"
+ \ , "-fno-omit-interface-pragmas"
+ \ , "-fsimplifier-phases"
+ \ , "-fmax-simplifier-iterations"
+ \ , "-fcse"
+ \ , "-fno-cse"
+ \ , "-fspecialise"
+ \ , "-fno-specialise"
+ \ , "-ffull-laziness"
+ \ , "-fno-full-laziness"
+ \ , "-ffloat-in"
+ \ , "-fno-float-in"
+ \ , "-fenable-rewrite-rules"
+ \ , "-fno-enable-rewrite-rules"
+ \ , "-fstrictness"
+ \ , "-fno-strictness"
+ \ , "-fstrictness=before=n"
+ \ , "-fspec-constr"
+ \ , "-fno-spec-constr"
+ \ , "-fliberate-case"
+ \ , "-fno-liberate-case"
+ \ , "-fstatic-argument-transformation"
+ \ , "-fno-static-argument-transformation"
+ \ , "-funbox-strict-fields"
+ \ , "-fno-unbox-strict-fields"
+ \ , "-feager-blackholing"
+ \ , "-auto"
+ \ , "-no-auto"
+ \ , "-auto-all"
+ \ , "-no-auto-all"
+ \ , "-caf-all"
+ \ , "-no-caf-all"
+ \ , "-hpcdir"
+ \ , "-F"
+ \ , "-cpp"
+ \ , "-Dsymbol[=value]"
+ \ , "-Usymbol"
+ \ , "-Usymbol"
+ \ , "-Idir"
+ \ , "-fasm"
+ \ , "-fvia-C"
+ \ , "-fvia-C"
+ \ , "-fasm"
+ \ , "-fllvm"
+ \ , "-fasm"
+ \ , "-fno-code"
+ \ , "-fbyte-code"
+ \ , "-fobject-code"
+ \ , "-shared"
+ \ , "-dynamic"
+ \ , "-framework"
+ \ , "-framework-path"
+ \ , "-llib"
+ \ , "-Ldir"
+ \ , "-main-is"
+ \ , "--mk-dll"
+ \ , "-no-hs-main"
+ \ , "-rtsopts,"
+ \ , "-with-rtsopts=opts"
+ \ , "-no-link"
+ \ , "-split-objs"
+ \ , "-fno-gen-manifest"
+ \ , "-fno-embed-manifest"
+ \ , "-fno-shared-implib"
+ \ , "-dylib-install-name"
+ \ , "-pgmL"
+ \ , "-pgmP"
+ \ , "-pgmc"
+ \ , "-pgmm"
+ \ , "-pgms"
+ \ , "-pgma"
+ \ , "-pgml"
+ \ , "-pgmdll"
+ \ , "-pgmF"
+ \ , "-pgmwindres"
+ \ , "-optL"
+ \ , "-optP"
+ \ , "-optF"
+ \ , "-optc"
+ \ , "-optlo"
+ \ , "-optlc"
+ \ , "-optm"
+ \ , "-opta"
+ \ , "-optl"
+ \ , "-optdll"
+ \ , "-optwindres"
+ \ , "-msse2"
+ \ , "-monly-[432]-regs"
+ \ , "-fext-core"
+ \ , "-dcore-lint"
+ \ , "-ddump-asm"
+ \ , "-ddump-bcos"
+ \ , "-ddump-cmm"
+ \ , "-ddump-cpranal"
+ \ , "-ddump-cse"
+ \ , "-ddump-deriv"
+ \ , "-ddump-ds"
+ \ , "-ddump-flatC"
+ \ , "-ddump-foreign"
+ \ , "-ddump-hpc"
+ \ , "-ddump-inlinings"
+ \ , "-ddump-llvm"
+ \ , "-ddump-occur-anal"
+ \ , "-ddump-opt-cmm"
+ \ , "-ddump-parsed"
+ \ , "-ddump-prep"
+ \ , "-ddump-rn"
+ \ , "-ddump-rules"
+ \ , "-ddump-simpl"
+ \ , "-ddump-simpl-phases"
+ \ , "-ddump-simpl-iterations"
+ \ , "-ddump-spec"
+ \ , "-ddump-splices"
+ \ , "-ddump-stg"
+ \ , "-ddump-stranal"
+ \ , "-ddump-tc"
+ \ , "-ddump-types"
+ \ , "-ddump-worker-wrapper"
+ \ , "-ddump-if-trace"
+ \ , "-ddump-tc-trace"
+ \ , "-ddump-rn-trace"
+ \ , "-ddump-rn-stats"
+ \ , "-ddump-simpl-stats"
+ \ , "-dsource-stats"
+ \ , "-dcmm-lint"
+ \ , "-dstg-lint"
+ \ , "-dstg-stats"
+ \ , "-dverbose-core2core"
+ \ , "-dverbose-stg2stg"
+ \ , "-dshow-passes"
+ \ , "-dfaststring-stats"
+ \ , "-fno-asm-mangling"
+ \ , "-fno-ghci-sandbox"
+ \ , "-fdiagnostics-color="
+ \ , "-fdiagnostics-show-caret"
+ \ , "-fno-diagnostics-show-caret"
+ \ , "-ferror-spans"
+ \ , "-fhide-source-paths"
+ \ , "-fprint-equality-relations"
+ \ , "-fno-print-equality-relations"
+ \ , "-fprint-expanded-synonyms"
+ \ , "-fno-print-expanded-synonyms"
+ \ , "-fprint-explicit-coercions"
+ \ , "-fno-print-explicit-coercions"
+ \ , "-fprint-explicit-foralls"
+ \ , "-fno-print-explicit-foralls"
+ \ , "-fprint-explicit-kinds"
+ \ , "-fno-print-explicit-kinds"
+ \ , "-fprint-explicit-runtime-rep"
+ \ , "-fno-print-explicit-runtime-reps"
+ \ , "-fprint-explicit-runtime-reps"
+ \ , "-fno-print-explicit-runtime-reps"
+ \ , "-fprint-potential-instances"
+ \ , "-fno-print-potential-instances"
+ \ , "-fprint-typechecker-elaboration"
+ \ , "-fno-print-typechecker-elaboration"
+ \ , "-fprint-unicode-syntax"
+ \ , "-fno-print-unicode-syntax"
+ \ , "-fshow-hole-constraints"
+ \ , "-Rghc-timing"
+ \ , "-v"
+ \ , "-v"
+ \ , "-F"
+ \ , "-x"
+ \ , "--exclude-module="
+ \ , "-ddump-mod-cycles"
+ \ , "-dep-makefile"
+ \ , "-dep-suffix"
+ \ , "-dumpdir"
+ \ , "-hcsuf"
+ \ , "-hidir"
+ \ , "-hisuf"
+ \ , "-include-pkg-deps"
+ \ , "-o"
+ \ , "-odir"
+ \ , "-ohi"
+ \ , "-osuf"
+ \ , "-outputdir"
+ \ , "-stubdir"
+ \ , "-keep-hc-file,"
+ \ , "-keep-hi-files"
+ \ , "-no-keep-hi-files"
+ \ , "-keep-llvm-file,"
+ \ , "-keep-o-files"
+ \ , "-no-keep-o-files"
+ \ , "-keep-s-file,"
+ \ , "-keep-tmp-files"
+ \ , "-tmpdir"
+ \ , "-i"
+ \ , "-i[:]*"
+ \ , "-ddump-hi"
+ \ , "-ddump-hi-diffs"
+ \ , "-ddump-minimal-imports"
+ \ , "-fforce-recomp"
+ \ , "-fno-force-recomp"
+ \ , "-fignore-hpc-changes"
+ \ , "-fno-ignore-hpc-changes"
+ \ , "-fignore-optim-changes"
+ \ , "-fno-ignore-optim-changes"
+ \ , "-fbreak-on-error"
+ \ , "-fno-break-on-error"
+ \ , "-fbreak-on-exception"
+ \ , "-fno-break-on-exception"
+ \ , "-fghci-hist-size="
+ \ , "-flocal-ghci-history"
+ \ , "-fno-local-ghci-history"
+ \ , "-fprint-bind-result"
+ \ , "-fno-print-bind-result"
+ \ , "-fshow-loaded-modules"
+ \ , "-ghci-script"
+ \ , "-ignore-dot-ghci"
+ \ , "-interactive-print"
+ \ , "-clear-package-db"
+ \ , "-distrust"
+ \ , "-distrust-all-packages"
+ \ , "-fpackage-trust"
+ \ , "-global-package-db"
+ \ , "-hide-all-packages"
+ \ , "-hide-package"
+ \ , "-ignore-package"
+ \ , "-no-auto-link-packages"
+ \ , "-no-global-package-db"
+ \ , "-no-user-package-db"
+ \ , "-package"
+ \ , "-package-db"
+ \ , "-package-env"
+ \ , "-package-id"
+ \ , "-this-unit-id"
+ \ , "-trust"
+ \ , "-user-package-db"
+ \ , "-fdefer-out-of-scope-variables"
+ \ , "-fno-defer-out-of-scope-variables"
+ \ , "-fdefer-type-errors"
+ \ , "-fno-defer-type-errors"
+ \ , "-fdefer-typed-holes"
+ \ , "-fno-defer-typed-holes"
+ \ , "-fhelpful-errors"
+ \ , "-fno-helpful-errors"
+ \ , "-fmax-pmcheck-iterations="
+ \ , "-fshow-warning-groups"
+ \ , "-fno-show-warning-groups"
+ \ , "-W"
+ \ , "-w"
+ \ , "-w"
+ \ , "-Wall"
+ \ , "-w"
+ \ , "-Wall-missed-specialisations"
+ \ , "-Wno-all-missed-specialisations"
+ \ , "-Wamp"
+ \ , "-Wno-amp"
+ \ , "-Wcompat"
+ \ , "-Wno-compat"
+ \ , "-Wcpp-undef"
+ \ , "-Wdeferred-out-of-scope-variables"
+ \ , "-Wno-deferred-out-of-scope-variables"
+ \ , "-Wdeferred-type-errors"
+ \ , "-Wno-deferred-type-errors"
+ \ , "-Wdeprecated-flags"
+ \ , "-Wno-deprecated-flags"
+ \ , "-Wdeprecations"
+ \ , "-Wno-deprecations"
+ \ , "-Wdodgy-exports"
+ \ , "-Wno-dodgy-exports"
+ \ , "-Wdodgy-foreign-imports"
+ \ , "-Wno-dodgy-foreign-import"
+ \ , "-Wdodgy-imports"
+ \ , "-Wno-dodgy-imports"
+ \ , "-Wduplicate-constraints"
+ \ , "-Wno-duplicate-constraints"
+ \ , "-Wduplicate-exports"
+ \ , "-Wno-duplicate-exports"
+ \ , "-Wempty-enumerations"
+ \ , "-Wno-empty-enumerations"
+ \ , "-Werror"
+ \ , "-Wwarn"
+ \ , "-Weverything"
+ \ , "-Whi-shadowing"
+ \ , "-Wno-hi-shadowing"
+ \ , "-Widentities"
+ \ , "-Wno-identities"
+ \ , "-Wimplicit-prelude"
+ \ , "-Wno-implicit-prelude"
+ \ , "-Wincomplete-patterns"
+ \ , "-Wno-incomplete-patterns"
+ \ , "-Wincomplete-record-updates"
+ \ , "-Wno-incomplete-record-updates"
+ \ , "-Wincomplete-uni-patterns"
+ \ , "-Wno-incomplete-uni-patterns"
+ \ , "-Winline-rule-shadowing"
+ \ , "-Wno-inline-rule-shadowing"
+ \ , "-Wmissed-specialisations"
+ \ , "-Wno-missed-specialisations"
+ \ , "-Wmissing-export-lists"
+ \ , "-fnowarn-missing-export-lists"
+ \ , "-Wmissing-exported-signatures"
+ \ , "-Wno-missing-exported-signatures"
+ \ , "-Wmissing-exported-sigs"
+ \ , "-Wno-missing-exported-sigs"
+ \ , "-Wmissing-fields"
+ \ , "-Wno-missing-fields"
+ \ , "-Wmissing-home-modules"
+ \ , "-Wno-missing-home-modules"
+ \ , "-Wmissing-import-lists"
+ \ , "-fnowarn-missing-import-lists"
+ \ , "-Wmissing-local-signatures"
+ \ , "-Wno-missing-local-signatures"
+ \ , "-Wmissing-local-sigs"
+ \ , "-Wno-missing-local-sigs"
+ \ , "-Wmissing-methods"
+ \ , "-Wno-missing-methods"
+ \ , "-Wmissing-monadfail-instances"
+ \ , "-Wno-missing-monadfail-instances"
+ \ , "-Wmissing-pattern-synonym-signatures"
+ \ , "-Wno-missing-pattern-synonym-signatures"
+ \ , "-Wmissing-signatures"
+ \ , "-Wno-missing-signatures"
+ \ , "-Wmonomorphism-restriction"
+ \ , "-Wno-monomorphism-restriction"
+ \ , "-Wname-shadowing"
+ \ , "-Wno-name-shadowing"
+ \ , "-Wno-compat"
+ \ , "-Wcompat"
+ \ , "-Wnoncanonical-monad-instances"
+ \ , "-Wno-noncanonical-monad-instances"
+ \ , "-Wnoncanonical-monadfail-instances"
+ \ , "-Wno-noncanonical-monadfail-instances"
+ \ , "-Wnoncanonical-monoid-instances"
+ \ , "-Wno-noncanonical-monoid-instances"
+ \ , "-Worphans"
+ \ , "-Wno-orphans"
+ \ , "-Woverflowed-literals"
+ \ , "-Wno-overflowed-literals"
+ \ , "-Woverlapping-patterns"
+ \ , "-Wno-overlapping-patterns"
+ \ , "-Wpartial-fields"
+ \ , "-Wno-partial-fields"
+ \ , "-Wpartial-type-signatures"
+ \ , "-Wno-partial-type-signatures"
+ \ , "-Wredundant-constraints"
+ \ , "-Wno-redundant-constraints"
+ \ , "-Wsafe"
+ \ , "-Wno-safe"
+ \ , "-Wsemigroup"
+ \ , "-Wno-semigroup"
+ \ , "-Wsimplifiable-class-constraints"
+ \ , "-Wno-overlapping-patterns"
+ \ , "-Wtabs"
+ \ , "-Wno-tabs"
+ \ , "-Wtrustworthy-safe"
+ \ , "-Wno-safe"
+ \ , "-Wtype-defaults"
+ \ , "-Wno-type-defaults"
+ \ , "-Wtyped-holes"
+ \ , "-Wno-typed-holes"
+ \ , "-Wunbanged-strict-patterns"
+ \ , "-Wno-unbanged-strict-patterns"
+ \ , "-Wunrecognised-pragmas"
+ \ , "-Wno-unrecognised-pragmas"
+ \ , "-Wunrecognised-warning-flags"
+ \ , "-Wno-unrecognised-warning-flags"
+ \ , "-Wunsafe"
+ \ , "-Wno-unsafe"
+ \ , "-Wunsupported-calling-conventions"
+ \ , "-Wno-unsupported-calling-conventions"
+ \ , "-Wunsupported-llvm-version"
+ \ , "-Wno-monomorphism-restriction"
+ \ , "-Wunticked-promoted-constructors"
+ \ , "-Wno-unticked-promoted-constructors"
+ \ , "-Wunused-binds"
+ \ , "-Wno-unused-binds"
+ \ , "-Wunused-do-bind"
+ \ , "-Wno-unused-do-bind"
+ \ , "-Wunused-foralls"
+ \ , "-Wno-unused-foralls"
+ \ , "-Wunused-imports"
+ \ , "-Wno-unused-imports"
+ \ , "-Wunused-local-binds"
+ \ , "-Wno-unused-local-binds"
+ \ , "-Wunused-matches"
+ \ , "-Wno-unused-matches"
+ \ , "-Wunused-pattern-binds"
+ \ , "-Wno-unused-pattern-binds"
+ \ , "-Wunused-top-binds"
+ \ , "-Wno-unused-top-binds"
+ \ , "-Wunused-type-patterns"
+ \ , "-Wno-unused-type-patterns"
+ \ , "-Wwarn"
+ \ , "-Werror"
+ \ , "-Wwarnings-deprecations"
+ \ , "-Wno-warnings-deprecations"
+ \ , "-Wwrong-do-bind"
+ \ , "-Wno-wrong-do-bind"
+ \ , "-O,"
+ \ , "-O0"
+ \ , "-O0"
+ \ , "-O2"
+ \ , "-O0"
+ \ , "-Odph"
+ \ , "-fcall-arity"
+ \ , "-fno-call-arity"
+ \ , "-fcase-folding"
+ \ , "-fno-case-folding"
+ \ , "-fcase-merge"
+ \ , "-fno-case-merge"
+ \ , "-fcmm-elim-common-blocks"
+ \ , "-fno-cmm-elim-common-blocks"
+ \ , "-fcmm-sink"
+ \ , "-fno-cmm-sink"
+ \ , "-fcpr-anal"
+ \ , "-fno-cpr-anal"
+ \ , "-fcross-module-specialise"
+ \ , "-fno-cross-module-specialise"
+ \ , "-fcse"
+ \ , "-fno-cse"
+ \ , "-fdicts-cheap"
+ \ , "-fno-dicts-cheap"
+ \ , "-fdicts-strict"
+ \ , "-fno-dicts-strict"
+ \ , "-fdmd-tx-dict-sel"
+ \ , "-fno-dmd-tx-dict-sel"
+ \ , "-fdo-eta-reduction"
+ \ , "-fno-do-eta-reduction"
+ \ , "-fdo-lambda-eta-expansion"
+ \ , "-fno-do-lambda-eta-expansion"
+ \ , "-feager-blackholing"
+ \ , "-fenable-rewrite-rules"
+ \ , "-fno-enable-rewrite-rules"
+ \ , "-fexcess-precision"
+ \ , "-fno-excess-precision"
+ \ , "-fexitification"
+ \ , "-fno-exitification"
+ \ , "-fexpose-all-unfoldings"
+ \ , "-fno-expose-all-unfoldings"
+ \ , "-ffloat-in"
+ \ , "-fno-float-in"
+ \ , "-ffull-laziness"
+ \ , "-fno-full-laziness"
+ \ , "-ffun-to-thunk"
+ \ , "-fno-fun-to-thunk"
+ \ , "-fignore-asserts"
+ \ , "-fno-ignore-asserts"
+ \ , "-fignore-interface-pragmas"
+ \ , "-fno-ignore-interface-pragmas"
+ \ , "-flate-dmd-anal"
+ \ , "-fno-late-dmd-anal"
+ \ , "-fliberate-case"
+ \ , "-fno-liberate-case"
+ \ , "-fliberate-case-threshold="
+ \ , "-fno-liberate-case-threshold"
+ \ , "-fllvm-pass-vectors-in-regs"
+ \ , "-fno-llvm-pass-vectors-in-regs"
+ \ , "-floopification"
+ \ , "-fno-loopification"
+ \ , "-fmax-inline-alloc-size="
+ \ , "-fmax-inline-memcpy-insns="
+ \ , "-fmax-inline-memset-insns="
+ \ , "-fmax-relevant-binds="
+ \ , "-fno-max-relevant-bindings"
+ \ , "-fmax-simplifier-iterations="
+ \ , "-fmax-uncovered-patterns="
+ \ , "-fmax-valid-substitutions="
+ \ , "-fno-max-valid-substitutions"
+ \ , "-fmax-worker-args="
+ \ , "-fno-opt-coercion"
+ \ , "-fno-pre-inlining"
+ \ , "-fno-state-hack"
+ \ , "-fomit-interface-pragmas"
+ \ , "-fno-omit-interface-pragmas"
+ \ , "-fomit-yields"
+ \ , "-fno-omit-yields"
+ \ , "-foptimal-applicative-do"
+ \ , "-fno-optimal-applicative-do"
+ \ , "-fpedantic-bottoms"
+ \ , "-fno-pedantic-bottoms"
+ \ , "-fregs-graph"
+ \ , "-fno-regs-graph"
+ \ , "-fregs-iterative"
+ \ , "-fno-regs-iterative"
+ \ , "-fsimpl-tick-factor="
+ \ , "-fsimplifier-phases="
+ \ , "-fsolve-constant-dicts"
+ \ , "-fno-solve-constant-dicts"
+ \ , "-fspec-constr"
+ \ , "-fno-spec-constr"
+ \ , "-fspec-constr-count="
+ \ , "-fno-spec-constr-count"
+ \ , "-fspec-constr-keen"
+ \ , "-fno-spec-constr-keen"
+ \ , "-fspec-constr-threshold="
+ \ , "-fno-spec-constr-threshold"
+ \ , "-fspecialise"
+ \ , "-fno-specialise"
+ \ , "-fspecialise-aggressively"
+ \ , "-fno-specialise-aggressively"
+ \ , "-fstatic-argument-transformation"
+ \ , "-fno-static-argument-transformation"
+ \ , "-fstg-cse"
+ \ , "-fno-stg-cse"
+ \ , "-fstrictness"
+ \ , "-fno-strictness"
+ \ , "-fstrictness-before="
+ \ , "-funbox-small-strict-fields"
+ \ , "-fno-unbox-small-strict-fields"
+ \ , "-funbox-strict-fields"
+ \ , "-fno-unbox-strict-fields"
+ \ , "-funfolding-creation-threshold="
+ \ , "-funfolding-dict-discount="
+ \ , "-funfolding-fun-discount="
+ \ , "-funfolding-keeness-factor="
+ \ , "-funfolding-use-threshold="
+ \ , "-fvectorisation-avoidance"
+ \ , "-fno-vectorisation-avoidance"
+ \ , "-fvectorise"
+ \ , "-fno-vectorise"
+ \ , "-fno-prof-auto"
+ \ , "-fprof-auto"
+ \ , "-fno-prof-cafs"
+ \ , "-fprof-cafs"
+ \ , "-fno-prof-count-entries"
+ \ , "-fprof-count-entries"
+ \ , "-fprof-auto"
+ \ , "-fno-prof-auto"
+ \ , "-fprof-auto-calls"
+ \ , "-fno-prof-auto-calls"
+ \ , "-fprof-auto-exported"
+ \ , "-fno-prof-auto"
+ \ , "-fprof-auto-top"
+ \ , "-fno-prof-auto"
+ \ , "-fprof-cafs"
+ \ , "-fno-prof-cafs"
+ \ , "-prof"
+ \ , "-ticky"
+ \ , "-fhpc"
+ \ , "-cpp"
+ \ , "-D[=]"
+ \ , "-U"
+ \ , "-I"
+ \ , "-U"
+ \ , "-dynamic"
+ \ , "-too"
+ \ , "-fasm"
+ \ , "-fllvm"
+ \ , "-fbyte-code"
+ \ , "-fllvm"
+ \ , "-fasm"
+ \ , "-fno-code"
+ \ , "-fobject-code"
+ \ , "-fPIC"
+ \ , "-fPIE"
+ \ , "-fwrite-interface"
+ \ , "-debug"
+ \ , "-dylib-install-name"
+ \ , "-dynamic"
+ \ , "-dynload"
+ \ , "-eventlog"
+ \ , "-fno-embed-manifest"
+ \ , "-fno-gen-manifest"
+ \ , "-fno-shared-implib"
+ \ , "-framework"
+ \ , "-framework-path"
+ \ , "-fwhole-archive-hs-libs"
+ \ , "-L"
+ \ , "-l"
+ \ , "-main-is"
+ \ , "-no-hs-main"
+ \ , "-no-rtsopts-suggestions"
+ \ , "-package"
+ \ , "-pie"
+ \ , "-rdynamic"
+ \ , "-rtsopts[=]"
+ \ , "-shared"
+ \ , "-split-objs"
+ \ , "-split-sections"
+ \ , "-static"
+ \ , "-staticlib"
+ \ , "-threaded"
+ \ , "-with-rtsopts="
+ \ , "-fplugin-opt=:"
+ \ , "-fplugin="
+ \ , "-hide-all-plugin-packages"
+ \ , "-plugin-package"
+ \ , "-plugin-package-id"
+ \ , "-pgma"
+ \ , "-pgmc"
+ \ , "-pgmdll"
+ \ , "-pgmF"
+ \ , "-pgmi"
+ \ , "-pgmL"
+ \ , "-pgml"
+ \ , "-pgmlc"
+ \ , "-pgmlibtool"
+ \ , "-pgmlo"
+ \ , "-pgmP"
+ \ , "-pgms"
+ \ , "-pgmwindres"
+ \ , "-opta"
+ \ , "-optc"
+ \ , "-optdll"
+ \ , "-optF"
+ \ , "-opti"
+ \ , "-optL"
+ \ , "-optl"
+ \ , "-optlc"
+ \ , "-optlo"
+ \ , "-optP"
+ \ , "-optwindres"
+ \ , "-msse2"
+ \ , "-msse4.2"
+ \ , "-dcmm-lint"
+ \ , "-dcore-lint"
+ \ , "-ddump-asm"
+ \ , "-ddump-asm-expanded"
+ \ , "-ddump-asm-liveness"
+ \ , "-ddump-asm-native"
+ \ , "-ddump-asm-regalloc"
+ \ , "-ddump-asm-regalloc-stages"
+ \ , "-ddump-asm-stats"
+ \ , "-ddump-bcos"
+ \ , "-ddump-cmm"
+ \ , "-ddump-cmm-caf"
+ \ , "-ddump-cmm-cbe"
+ \ , "-ddump-cmm-cfg"
+ \ , "-ddump-cmm-cps"
+ \ , "-ddump-cmm-from-stg"
+ \ , "-ddump-cmm-info"
+ \ , "-ddump-cmm-proc"
+ \ , "-ddump-cmm-procmap"
+ \ , "-ddump-cmm-raw"
+ \ , "-ddump-cmm-sink"
+ \ , "-ddump-cmm-sp"
+ \ , "-ddump-cmm-split"
+ \ , "-ddump-cmm-switch"
+ \ , "-ddump-cmm-verbose"
+ \ , "-ddump-core-stats"
+ \ , "-ddump-cse"
+ \ , "-ddump-deriv"
+ \ , "-ddump-ds"
+ \ , "-ddump-ec-trace"
+ \ , "-ddump-foreign"
+ \ , "-ddump-if-trace"
+ \ , "-ddump-inlinings"
+ \ , "-ddump-json"
+ \ , "-ddump-llvm"
+ \ , "-ddump-occur-anal"
+ \ , "-ddump-opt-cmm"
+ \ , "-ddump-parsed"
+ \ , "-ddump-parsed-ast"
+ \ , "-ddump-prep"
+ \ , "-ddump-rn"
+ \ , "-ddump-rn-ast"
+ \ , "-ddump-rn-stats"
+ \ , "-ddump-rn-trace"
+ \ , "-ddump-rule-firings"
+ \ , "-ddump-rule-rewrites"
+ \ , "-ddump-rules"
+ \ , "-ddump-simpl"
+ \ , "-ddump-simpl-iterations"
+ \ , "-ddump-simpl-stats"
+ \ , "-ddump-spec"
+ \ , "-ddump-splices"
+ \ , "-ddump-stg"
+ \ , "-ddump-str-signatures"
+ \ , "-ddump-stranal"
+ \ , "-ddump-tc"
+ \ , "-ddump-tc-ast"
+ \ , "-ddump-tc-trace"
+ \ , "-ddump-timings"
+ \ , "-ddump-to-file"
+ \ , "-ddump-types"
+ \ , "-ddump-vect"
+ \ , "-ddump-vt-trace"
+ \ , "-ddump-worker-wrapper"
+ \ , "-dfaststring-stats"
+ \ , "-dinitial-unique="
+ \ , "-dno-debug-output"
+ \ , "-ddebug-output"
+ \ , "-dppr-case-as-let"
+ \ , "-dppr-cols="
+ \ , "-dppr-debug"
+ \ , "-dppr-user-length"
+ \ , "-dshow-passes"
+ \ , "-dstg-lint"
+ \ , "-dsuppress-all"
+ \ , "-dsuppress-coercions"
+ \ , "-dsuppress-idinfo"
+ \ , "-dsuppress-module-prefixes"
+ \ , "-dsuppress-stg-free-vars"
+ \ , "-dsuppress-ticks"
+ \ , "-dsuppress-type-applications"
+ \ , "-dsuppress-type-signatures"
+ \ , "-dsuppress-unfoldings"
+ \ , "-dsuppress-uniques"
+ \ , "-dsuppress-var-kinds"
+ \ , "-dth-dec-file="
+ \ , "-dunique-increment="
+ \ , "-dverbose-core2core"
+ \ , "-dverbose-stg2stg"
+ \ , "-falignment-sanitisation"
+ \ , "-fcatch-bottoms"
+ \ , "-fllvm-fill-undef-with-garbage"
+ \ , "-g,"
+ \ , "-fexternal-interpreter"
+ \ , "-fglasgow-exts"
+ \ , "-fno-glasgow-exts"
+ \ , "-ghcversion-file"
+ \ , "-H"
+ \ , "-j[]"
+ \ ]
+
+let s:commonModules =
+ \ [ "Distribution.Backpack"
+ \ , "Distribution.Backpack.ComponentsGraph"
+ \ , "Distribution.Backpack.Configure"
+ \ , "Distribution.Backpack.ConfiguredComponent"
+ \ , "Distribution.Backpack.DescribeUnitId"
+ \ , "Distribution.Backpack.FullUnitId"
+ \ , "Distribution.Backpack.LinkedComponent"
+ \ , "Distribution.Backpack.ModSubst"
+ \ , "Distribution.Backpack.ModuleShape"
+ \ , "Distribution.Backpack.PreModuleShape"
+ \ , "Distribution.CabalSpecVersion"
+ \ , "Distribution.Compat.Binary"
+ \ , "Distribution.Compat.CharParsing"
+ \ , "Distribution.Compat.CreatePipe"
+ \ , "Distribution.Compat.DList"
+ \ , "Distribution.Compat.Directory"
+ \ , "Distribution.Compat.Environment"
+ \ , "Distribution.Compat.Exception"
+ \ , "Distribution.Compat.Graph"
+ \ , "Distribution.Compat.Internal.TempFile"
+ \ , "Distribution.Compat.Lens"
+ \ , "Distribution.Compat.Map.Strict"
+ \ , "Distribution.Compat.Newtype"
+ \ , "Distribution.Compat.Parsing"
+ \ , "Distribution.Compat.Prelude.Internal"
+ \ , "Distribution.Compat.ReadP"
+ \ , "Distribution.Compat.Semigroup"
+ \ , "Distribution.Compat.Stack"
+ \ , "Distribution.Compat.Time"
+ \ , "Distribution.Compiler"
+ \ , "Distribution.FieldGrammar"
+ \ , "Distribution.FieldGrammar.Class"
+ \ , "Distribution.FieldGrammar.FieldDescrs"
+ \ , "Distribution.FieldGrammar.Parsec"
+ \ , "Distribution.FieldGrammar.Pretty"
+ \ , "Distribution.InstalledPackageInfo"
+ \ , "Distribution.License"
+ \ , "Distribution.Make"
+ \ , "Distribution.ModuleName"
+ \ , "Distribution.Package"
+ \ , "Distribution.PackageDescription"
+ \ , "Distribution.PackageDescription.Check"
+ \ , "Distribution.PackageDescription.Configuration"
+ \ , "Distribution.PackageDescription.FieldGrammar"
+ \ , "Distribution.PackageDescription.Parsec"
+ \ , "Distribution.PackageDescription.PrettyPrint"
+ \ , "Distribution.PackageDescription.Quirks"
+ \ , "Distribution.PackageDescription.Utils"
+ \ , "Distribution.ParseUtils"
+ \ , "Distribution.Parsec.Class"
+ \ , "Distribution.Parsec.Common"
+ \ , "Distribution.Parsec.ConfVar"
+ \ , "Distribution.Parsec.Field"
+ \ , "Distribution.Parsec.FieldLineStream"
+ \ , "Distribution.Parsec.Lexer"
+ \ , "Distribution.Parsec.LexerMonad"
+ \ , "Distribution.Parsec.Newtypes"
+ \ , "Distribution.Parsec.ParseResult"
+ \ , "Distribution.Parsec.Parser"
+ \ , "Distribution.Pretty"
+ \ , "Distribution.PrettyUtils"
+ \ , "Distribution.ReadE"
+ \ , "Distribution.SPDX"
+ \ , "Distribution.SPDX.License"
+ \ , "Distribution.SPDX.LicenseExceptionId"
+ \ , "Distribution.SPDX.LicenseExpression"
+ \ , "Distribution.SPDX.LicenseId"
+ \ , "Distribution.SPDX.LicenseReference"
+ \ , "Distribution.Simple"
+ \ , "Distribution.Simple.Bench"
+ \ , "Distribution.Simple.Build"
+ \ , "Distribution.Simple.Build.Macros"
+ \ , "Distribution.Simple.Build.PathsModule"
+ \ , "Distribution.Simple.BuildPaths"
+ \ , "Distribution.Simple.BuildTarget"
+ \ , "Distribution.Simple.BuildToolDepends"
+ \ , "Distribution.Simple.CCompiler"
+ \ , "Distribution.Simple.Command"
+ \ , "Distribution.Simple.Compiler"
+ \ , "Distribution.Simple.Configure"
+ \ , "Distribution.Simple.Doctest"
+ \ , "Distribution.Simple.GHC"
+ \ , "Distribution.Simple.GHCJS"
+ \ , "Distribution.Simple.Haddock"
+ \ , "Distribution.Simple.HaskellSuite"
+ \ , "Distribution.Simple.Hpc"
+ \ , "Distribution.Simple.Install"
+ \ , "Distribution.Simple.InstallDirs"
+ \ , "Distribution.Simple.JHC"
+ \ , "Distribution.Simple.LHC"
+ \ , "Distribution.Simple.LocalBuildInfo"
+ \ , "Distribution.Simple.PackageIndex"
+ \ , "Distribution.Simple.PreProcess"
+ \ , "Distribution.Simple.PreProcess.Unlit"
+ \ , "Distribution.Simple.Program"
+ \ , "Distribution.Simple.Program.Ar"
+ \ , "Distribution.Simple.Program.Builtin"
+ \ , "Distribution.Simple.Program.Db"
+ \ , "Distribution.Simple.Program.Find"
+ \ , "Distribution.Simple.Program.GHC"
+ \ , "Distribution.Simple.Program.HcPkg"
+ \ , "Distribution.Simple.Program.Hpc"
+ \ , "Distribution.Simple.Program.Internal"
+ \ , "Distribution.Simple.Program.Ld"
+ \ , "Distribution.Simple.Program.ResponseFile"
+ \ , "Distribution.Simple.Program.Run"
+ \ , "Distribution.Simple.Program.Script"
+ \ , "Distribution.Simple.Program.Strip"
+ \ , "Distribution.Simple.Program.Types"
+ \ , "Distribution.Simple.Register"
+ \ , "Distribution.Simple.Setup"
+ \ , "Distribution.Simple.SrcDist"
+ \ , "Distribution.Simple.Test"
+ \ , "Distribution.Simple.Test.ExeV10"
+ \ , "Distribution.Simple.Test.LibV09"
+ \ , "Distribution.Simple.Test.Log"
+ \ , "Distribution.Simple.UHC"
+ \ , "Distribution.Simple.UserHooks"
+ \ , "Distribution.Simple.Utils"
+ \ , "Distribution.System"
+ \ , "Distribution.TestSuite"
+ \ , "Distribution.Text"
+ \ , "Distribution.Types.AbiDependency"
+ \ , "Distribution.Types.AbiHash"
+ \ , "Distribution.Types.AnnotatedId"
+ \ , "Distribution.Types.Benchmark"
+ \ , "Distribution.Types.Benchmark.Lens"
+ \ , "Distribution.Types.BenchmarkInterface"
+ \ , "Distribution.Types.BenchmarkType"
+ \ , "Distribution.Types.BuildInfo"
+ \ , "Distribution.Types.BuildInfo.Lens"
+ \ , "Distribution.Types.BuildType"
+ \ , "Distribution.Types.Component"
+ \ , "Distribution.Types.ComponentId"
+ \ , "Distribution.Types.ComponentInclude"
+ \ , "Distribution.Types.ComponentLocalBuildInfo"
+ \ , "Distribution.Types.ComponentName"
+ \ , "Distribution.Types.ComponentRequestedSpec"
+ \ , "Distribution.Types.CondTree"
+ \ , "Distribution.Types.Condition"
+ \ , "Distribution.Types.Dependency"
+ \ , "Distribution.Types.DependencyMap"
+ \ , "Distribution.Types.ExeDependency"
+ \ , "Distribution.Types.Executable"
+ \ , "Distribution.Types.Executable.Lens"
+ \ , "Distribution.Types.ExecutableScope"
+ \ , "Distribution.Types.ExposedModule"
+ \ , "Distribution.Types.ForeignLib"
+ \ , "Distribution.Types.ForeignLib.Lens"
+ \ , "Distribution.Types.ForeignLibOption"
+ \ , "Distribution.Types.ForeignLibType"
+ \ , "Distribution.Types.GenericPackageDescription"
+ \ , "Distribution.Types.GenericPackageDescription.Lens"
+ \ , "Distribution.Types.HookedBuildInfo"
+ \ , "Distribution.Types.IncludeRenaming"
+ \ , "Distribution.Types.InstalledPackageInfo"
+ \ , "Distribution.Types.InstalledPackageInfo.FieldGrammar"
+ \ , "Distribution.Types.InstalledPackageInfo.Lens"
+ \ , "Distribution.Types.LegacyExeDependency"
+ \ , "Distribution.Types.Lens"
+ \ , "Distribution.Types.Library"
+ \ , "Distribution.Types.Library.Lens"
+ \ , "Distribution.Types.LocalBuildInfo"
+ \ , "Distribution.Types.Mixin"
+ \ , "Distribution.Types.Module"
+ \ , "Distribution.Types.ModuleReexport"
+ \ , "Distribution.Types.ModuleRenaming"
+ \ , "Distribution.Types.MungedPackageId"
+ \ , "Distribution.Types.MungedPackageName"
+ \ , "Distribution.Types.PackageDescription"
+ \ , "Distribution.Types.PackageDescription.Lens"
+ \ , "Distribution.Types.PackageId"
+ \ , "Distribution.Types.PackageId.Lens"
+ \ , "Distribution.Types.PackageName"
+ \ , "Distribution.Types.PkgconfigDependency"
+ \ , "Distribution.Types.PkgconfigName"
+ \ , "Distribution.Types.SetupBuildInfo"
+ \ , "Distribution.Types.SetupBuildInfo.Lens"
+ \ , "Distribution.Types.SourceRepo"
+ \ , "Distribution.Types.SourceRepo.Lens"
+ \ , "Distribution.Types.TargetInfo"
+ \ , "Distribution.Types.TestSuite"
+ \ , "Distribution.Types.TestSuite.Lens"
+ \ , "Distribution.Types.TestSuiteInterface"
+ \ , "Distribution.Types.TestType"
+ \ , "Distribution.Types.UnitId"
+ \ , "Distribution.Types.UnqualComponentName"
+ \ , "Distribution.Types.Version"
+ \ , "Distribution.Types.VersionInterval"
+ \ , "Distribution.Types.VersionRange"
+ \ , "Distribution.Utils.Generic"
+ \ , "Distribution.Utils.IOData"
+ \ , "Distribution.Utils.LogProgress"
+ \ , "Distribution.Utils.MapAccum"
+ \ , "Distribution.Utils.NubList"
+ \ , "Distribution.Utils.Progress"
+ \ , "Distribution.Utils.ShortText"
+ \ , "Distribution.Verbosity"
+ \ , "Distribution.Version"
+ \ , "Language.Haskell.Extension"
+ \ , "Graphics.GLU"
+ \ , "Graphics.GLU.Callbacks"
+ \ , "Graphics.GLU.Functions"
+ \ , "Graphics.GLU.Tokens"
+ \ , "Graphics.GLU.Types"
+ \ , "Graphics.UI.GLUT"
+ \ , "Graphics.UI.GLUT.Begin"
+ \ , "Graphics.UI.GLUT.Callbacks"
+ \ , "Graphics.UI.GLUT.Callbacks.Global"
+ \ , "Graphics.UI.GLUT.Callbacks.Window"
+ \ , "Graphics.UI.GLUT.Colormap"
+ \ , "Graphics.UI.GLUT.Debugging"
+ \ , "Graphics.UI.GLUT.DeviceControl"
+ \ , "Graphics.UI.GLUT.Fonts"
+ \ , "Graphics.UI.GLUT.GameMode"
+ \ , "Graphics.UI.GLUT.Initialization"
+ \ , "Graphics.UI.GLUT.Menu"
+ \ , "Graphics.UI.GLUT.Objects"
+ \ , "Graphics.UI.GLUT.Overlay"
+ \ , "Graphics.UI.GLUT.State"
+ \ , "Graphics.UI.GLUT.Window"
+ \ , "Network.Browser"
+ \ , "Network.BufferType"
+ \ , "Network.HTTP"
+ \ , "Network.HTTP.Auth"
+ \ , "Network.HTTP.Base"
+ \ , "Network.HTTP.Cookie"
+ \ , "Network.HTTP.HandleStream"
+ \ , "Network.HTTP.Headers"
+ \ , "Network.HTTP.Proxy"
+ \ , "Network.HTTP.Stream"
+ \ , "Network.Stream"
+ \ , "Network.StreamDebugger"
+ \ , "Network.StreamSocket"
+ \ , "Network.TCP"
+ \ , "Test.HUnit"
+ \ , "Test.HUnit.Base"
+ \ , "Test.HUnit.Lang"
+ \ , "Test.HUnit.Terminal"
+ \ , "Test.HUnit.Text"
+ \ , "Data.ObjectName"
+ \ , "Graphics.Rendering.OpenGL"
+ \ , "Graphics.Rendering.OpenGL.GL"
+ \ , "Graphics.Rendering.OpenGL.GL.Antialiasing"
+ \ , "Graphics.Rendering.OpenGL.GL.BeginEnd"
+ \ , "Graphics.Rendering.OpenGL.GL.Bitmaps"
+ \ , "Graphics.Rendering.OpenGL.GL.BufferObjects"
+ \ , "Graphics.Rendering.OpenGL.GL.Clipping"
+ \ , "Graphics.Rendering.OpenGL.GL.ColorSum"
+ \ , "Graphics.Rendering.OpenGL.GL.Colors"
+ \ , "Graphics.Rendering.OpenGL.GL.ConditionalRendering"
+ \ , "Graphics.Rendering.OpenGL.GL.CoordTrans"
+ \ , "Graphics.Rendering.OpenGL.GL.DebugOutput"
+ \ , "Graphics.Rendering.OpenGL.GL.DisplayLists"
+ \ , "Graphics.Rendering.OpenGL.GL.Evaluators"
+ \ , "Graphics.Rendering.OpenGL.GL.Feedback"
+ \ , "Graphics.Rendering.OpenGL.GL.FlushFinish"
+ \ , "Graphics.Rendering.OpenGL.GL.Fog"
+ \ , "Graphics.Rendering.OpenGL.GL.Framebuffer"
+ \ , "Graphics.Rendering.OpenGL.GL.FramebufferObjects"
+ \ , "Graphics.Rendering.OpenGL.GL.FramebufferObjects.Attachments"
+ \ , "Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferObjects"
+ \ , "Graphics.Rendering.OpenGL.GL.FramebufferObjects.Queries"
+ \ , "Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferObjects"
+ \ , "Graphics.Rendering.OpenGL.GL.Hints"
+ \ , "Graphics.Rendering.OpenGL.GL.LineSegments"
+ \ , "Graphics.Rendering.OpenGL.GL.PerFragment"
+ \ , "Graphics.Rendering.OpenGL.GL.PixelRectangles"
+ \ , "Graphics.Rendering.OpenGL.GL.PixelRectangles.ColorTable"
+ \ , "Graphics.Rendering.OpenGL.GL.PixelRectangles.Convolution"
+ \ , "Graphics.Rendering.OpenGL.GL.PixelRectangles.Histogram"
+ \ , "Graphics.Rendering.OpenGL.GL.PixelRectangles.Minmax"
+ \ , "Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelMap"
+ \ , "Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelStorage"
+ \ , "Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelTransfer"
+ \ , "Graphics.Rendering.OpenGL.GL.PixelRectangles.Rasterization"
+ \ , "Graphics.Rendering.OpenGL.GL.PixellikeObject"
+ \ , "Graphics.Rendering.OpenGL.GL.Points"
+ \ , "Graphics.Rendering.OpenGL.GL.Polygons"
+ \ , "Graphics.Rendering.OpenGL.GL.PrimitiveMode"
+ \ , "Graphics.Rendering.OpenGL.GL.QueryObjects"
+ \ , "Graphics.Rendering.OpenGL.GL.RasterPos"
+ \ , "Graphics.Rendering.OpenGL.GL.ReadCopyPixels"
+ \ , "Graphics.Rendering.OpenGL.GL.Rectangles"
+ \ , "Graphics.Rendering.OpenGL.GL.SavingState"
+ \ , "Graphics.Rendering.OpenGL.GL.Selection"
+ \ , "Graphics.Rendering.OpenGL.GL.Shaders"
+ \ , "Graphics.Rendering.OpenGL.GL.Shaders.Attribs"
+ \ , "Graphics.Rendering.OpenGL.GL.Shaders.Limits"
+ \ , "Graphics.Rendering.OpenGL.GL.Shaders.ProgramBinaries"
+ \ , "Graphics.Rendering.OpenGL.GL.Shaders.ProgramObjects"
+ \ , "Graphics.Rendering.OpenGL.GL.Shaders.ShaderBinaries"
+ \ , "Graphics.Rendering.OpenGL.GL.Shaders.ShaderObjects"
+ \ , "Graphics.Rendering.OpenGL.GL.Shaders.Uniform"
+ \ , "Graphics.Rendering.OpenGL.GL.StringQueries"
+ \ , "Graphics.Rendering.OpenGL.GL.SyncObjects"
+ \ , "Graphics.Rendering.OpenGL.GL.Tensor"
+ \ , "Graphics.Rendering.OpenGL.GL.Texturing"
+ \ , "Graphics.Rendering.OpenGL.GL.Texturing.Application"
+ \ , "Graphics.Rendering.OpenGL.GL.Texturing.Environments"
+ \ , "Graphics.Rendering.OpenGL.GL.Texturing.Objects"
+ \ , "Graphics.Rendering.OpenGL.GL.Texturing.Parameters"
+ \ , "Graphics.Rendering.OpenGL.GL.Texturing.Queries"
+ \ , "Graphics.Rendering.OpenGL.GL.Texturing.Specification"
+ \ , "Graphics.Rendering.OpenGL.GL.TransformFeedback"
+ \ , "Graphics.Rendering.OpenGL.GL.VertexArrayObjects"
+ \ , "Graphics.Rendering.OpenGL.GL.VertexArrays"
+ \ , "Graphics.Rendering.OpenGL.GL.VertexSpec"
+ \ , "Graphics.Rendering.OpenGL.GLU"
+ \ , "Graphics.Rendering.OpenGL.GLU.Errors"
+ \ , "Graphics.Rendering.OpenGL.GLU.Initialization"
+ \ , "Graphics.Rendering.OpenGL.GLU.Matrix"
+ \ , "Graphics.Rendering.OpenGL.GLU.Mipmapping"
+ \ , "Graphics.Rendering.OpenGL.GLU.NURBS"
+ \ , "Graphics.Rendering.OpenGL.GLU.Quadrics"
+ \ , "Graphics.Rendering.OpenGL.GLU.Tessellation"
+ \ , "Graphics.GL"
+ \ , "Graphics.GL.AMD"
+ \ , "Graphics.GL.AMD.BlendMinmaxFactor"
+ \ , "Graphics.GL.AMD.DebugOutput"
+ \ , "Graphics.GL.AMD.DepthClampSeparate"
+ \ , "Graphics.GL.AMD.DrawBuffersBlend"
+ \ , "Graphics.GL.AMD.FramebufferMultisampleAdvanced"
+ \ , "Graphics.GL.AMD.FramebufferSamplePositions"
+ \ , "Graphics.GL.AMD.GPUShaderHalfFloat"
+ \ , "Graphics.GL.AMD.GPUShaderInt64"
+ \ , "Graphics.GL.AMD.InterleavedElements"
+ \ , "Graphics.GL.AMD.MultiDrawIndirect"
+ \ , "Graphics.GL.AMD.NameGenDelete"
+ \ , "Graphics.GL.AMD.OcclusionQueryEvent"
+ \ , "Graphics.GL.AMD.PerformanceMonitor"
+ \ , "Graphics.GL.AMD.PinnedMemory"
+ \ , "Graphics.GL.AMD.QueryBufferObject"
+ \ , "Graphics.GL.AMD.SamplePositions"
+ \ , "Graphics.GL.AMD.SeamlessCubemapPerTexture"
+ \ , "Graphics.GL.AMD.SparseTexture"
+ \ , "Graphics.GL.AMD.StencilOperationExtended"
+ \ , "Graphics.GL.AMD.TransformFeedback4"
+ \ , "Graphics.GL.AMD.VertexShaderTessellator"
+ \ , "Graphics.GL.APPLE"
+ \ , "Graphics.GL.APPLE.AuxDepthStencil"
+ \ , "Graphics.GL.APPLE.ClientStorage"
+ \ , "Graphics.GL.APPLE.ElementArray"
+ \ , "Graphics.GL.APPLE.Fence"
+ \ , "Graphics.GL.APPLE.FloatPixels"
+ \ , "Graphics.GL.APPLE.FlushBufferRange"
+ \ , "Graphics.GL.APPLE.ObjectPurgeable"
+ \ , "Graphics.GL.APPLE.RGB422"
+ \ , "Graphics.GL.APPLE.RowBytes"
+ \ , "Graphics.GL.APPLE.SpecularVector"
+ \ , "Graphics.GL.APPLE.TextureRange"
+ \ , "Graphics.GL.APPLE.TransformHint"
+ \ , "Graphics.GL.APPLE.VertexArrayObject"
+ \ , "Graphics.GL.APPLE.VertexArrayRange"
+ \ , "Graphics.GL.APPLE.VertexProgramEvaluators"
+ \ , "Graphics.GL.APPLE.YCbCr422"
+ \ , "Graphics.GL.ARB"
+ \ , "Graphics.GL.ARB.BaseInstance"
+ \ , "Graphics.GL.ARB.BindlessTexture"
+ \ , "Graphics.GL.ARB.BlendFuncExtended"
+ \ , "Graphics.GL.ARB.BufferStorage"
+ \ , "Graphics.GL.ARB.CLEvent"
+ \ , "Graphics.GL.ARB.ClearBufferObject"
+ \ , "Graphics.GL.ARB.ClearTexture"
+ \ , "Graphics.GL.ARB.ClipControl"
+ \ , "Graphics.GL.ARB.ColorBufferFloat"
+ \ , "Graphics.GL.ARB.CompressedTexturePixelStorage"
+ \ , "Graphics.GL.ARB.ComputeShader"
+ \ , "Graphics.GL.ARB.ComputeVariableGroupSize"
+ \ , "Graphics.GL.ARB.ConditionalRenderInverted"
+ \ , "Graphics.GL.ARB.CopyBuffer"
+ \ , "Graphics.GL.ARB.CopyImage"
+ \ , "Graphics.GL.ARB.CullDistance"
+ \ , "Graphics.GL.ARB.DebugOutput"
+ \ , "Graphics.GL.ARB.DepthBufferFloat"
+ \ , "Graphics.GL.ARB.DepthClamp"
+ \ , "Graphics.GL.ARB.DepthTexture"
+ \ , "Graphics.GL.ARB.DirectStateAccess"
+ \ , "Graphics.GL.ARB.DrawBuffers"
+ \ , "Graphics.GL.ARB.DrawBuffersBlend"
+ \ , "Graphics.GL.ARB.DrawElementsBaseVertex"
+ \ , "Graphics.GL.ARB.DrawIndirect"
+ \ , "Graphics.GL.ARB.DrawInstanced"
+ \ , "Graphics.GL.ARB.ES2Compatibility"
+ \ , "Graphics.GL.ARB.ES31Compatibility"
+ \ , "Graphics.GL.ARB.ES32Compatibility"
+ \ , "Graphics.GL.ARB.ES3Compatibility"
+ \ , "Graphics.GL.ARB.EnhancedLayouts"
+ \ , "Graphics.GL.ARB.ExplicitUniformLocation"
+ \ , "Graphics.GL.ARB.FragmentProgram"
+ \ , "Graphics.GL.ARB.FragmentShader"
+ \ , "Graphics.GL.ARB.FramebufferNoAttachments"
+ \ , "Graphics.GL.ARB.FramebufferObjectCompatibility"
+ \ , "Graphics.GL.ARB.FramebufferObjectCore"
+ \ , "Graphics.GL.ARB.FramebufferSRGB"
+ \ , "Graphics.GL.ARB.GPUShader5"
+ \ , "Graphics.GL.ARB.GPUShaderFP64"
+ \ , "Graphics.GL.ARB.GPUShaderInt64"
+ \ , "Graphics.GL.ARB.GeometryShader4"
+ \ , "Graphics.GL.ARB.GetProgramBinary"
+ \ , "Graphics.GL.ARB.GetTextureSubImage"
+ \ , "Graphics.GL.ARB.GlSpirv"
+ \ , "Graphics.GL.ARB.HalfFloatPixel"
+ \ , "Graphics.GL.ARB.HalfFloatVertex"
+ \ , "Graphics.GL.ARB.ImagingCompatibility"
+ \ , "Graphics.GL.ARB.ImagingCore"
+ \ , "Graphics.GL.ARB.IndirectParameters"
+ \ , "Graphics.GL.ARB.InstancedArrays"
+ \ , "Graphics.GL.ARB.InternalformatQuery"
+ \ , "Graphics.GL.ARB.InternalformatQuery2"
+ \ , "Graphics.GL.ARB.InvalidateSubdata"
+ \ , "Graphics.GL.ARB.MapBufferAlignment"
+ \ , "Graphics.GL.ARB.MapBufferRange"
+ \ , "Graphics.GL.ARB.MatrixPalette"
+ \ , "Graphics.GL.ARB.MultiBind"
+ \ , "Graphics.GL.ARB.MultiDrawIndirect"
+ \ , "Graphics.GL.ARB.Multisample"
+ \ , "Graphics.GL.ARB.Multitexture"
+ \ , "Graphics.GL.ARB.OcclusionQuery"
+ \ , "Graphics.GL.ARB.OcclusionQuery2"
+ \ , "Graphics.GL.ARB.ParallelShaderCompile"
+ \ , "Graphics.GL.ARB.PipelineStatisticsQuery"
+ \ , "Graphics.GL.ARB.PixelBufferObject"
+ \ , "Graphics.GL.ARB.PointParameters"
+ \ , "Graphics.GL.ARB.PointSprite"
+ \ , "Graphics.GL.ARB.PolygonOffsetClamp"
+ \ , "Graphics.GL.ARB.ProgramInterfaceQuery"
+ \ , "Graphics.GL.ARB.ProvokingVertex"
+ \ , "Graphics.GL.ARB.QueryBufferObject"
+ \ , "Graphics.GL.ARB.RobustnessCompatibility"
+ \ , "Graphics.GL.ARB.RobustnessCore"
+ \ , "Graphics.GL.ARB.SampleLocations"
+ \ , "Graphics.GL.ARB.SampleShading"
+ \ , "Graphics.GL.ARB.SamplerObjects"
+ \ , "Graphics.GL.ARB.SeamlessCubeMap"
+ \ , "Graphics.GL.ARB.SeamlessCubemapPerTexture"
+ \ , "Graphics.GL.ARB.SeparateShaderObjects"
+ \ , "Graphics.GL.ARB.ShaderAtomicCounters"
+ \ , "Graphics.GL.ARB.ShaderImageLoadStore"
+ \ , "Graphics.GL.ARB.ShaderObjects"
+ \ , "Graphics.GL.ARB.ShaderStorageBufferObject"
+ \ , "Graphics.GL.ARB.ShaderSubroutine"
+ \ , "Graphics.GL.ARB.ShadingLanguage100"
+ \ , "Graphics.GL.ARB.ShadingLanguageInclude"
+ \ , "Graphics.GL.ARB.Shadow"
+ \ , "Graphics.GL.ARB.ShadowAmbient"
+ \ , "Graphics.GL.ARB.SparseBuffer"
+ \ , "Graphics.GL.ARB.SparseTexture"
+ \ , "Graphics.GL.ARB.SpirvExtensions"
+ \ , "Graphics.GL.ARB.StencilTexturing"
+ \ , "Graphics.GL.ARB.Sync"
+ \ , "Graphics.GL.ARB.TessellationShader"
+ \ , "Graphics.GL.ARB.TextureBarrier"
+ \ , "Graphics.GL.ARB.TextureBorderClamp"
+ \ , "Graphics.GL.ARB.TextureBufferObject"
+ \ , "Graphics.GL.ARB.TextureBufferObjectRGB32"
+ \ , "Graphics.GL.ARB.TextureBufferRange"
+ \ , "Graphics.GL.ARB.TextureCompression"
+ \ , "Graphics.GL.ARB.TextureCompressionBPTC"
+ \ , "Graphics.GL.ARB.TextureCompressionRGTC"
+ \ , "Graphics.GL.ARB.TextureCubeMap"
+ \ , "Graphics.GL.ARB.TextureCubeMapArray"
+ \ , "Graphics.GL.ARB.TextureEnvCombine"
+ \ , "Graphics.GL.ARB.TextureEnvDot3"
+ \ , "Graphics.GL.ARB.TextureFilterAnisotropic"
+ \ , "Graphics.GL.ARB.TextureFilterMinmax"
+ \ , "Graphics.GL.ARB.TextureFloat"
+ \ , "Graphics.GL.ARB.TextureGather"
+ \ , "Graphics.GL.ARB.TextureMirrorClampToEdge"
+ \ , "Graphics.GL.ARB.TextureMirroredRepeat"
+ \ , "Graphics.GL.ARB.TextureMultisample"
+ \ , "Graphics.GL.ARB.TextureRG"
+ \ , "Graphics.GL.ARB.TextureRGB10A2UI"
+ \ , "Graphics.GL.ARB.TextureRectangle"
+ \ , "Graphics.GL.ARB.TextureStencil8"
+ \ , "Graphics.GL.ARB.TextureStorage"
+ \ , "Graphics.GL.ARB.TextureStorageMultisample"
+ \ , "Graphics.GL.ARB.TextureSwizzle"
+ \ , "Graphics.GL.ARB.TextureView"
+ \ , "Graphics.GL.ARB.TimerQuery"
+ \ , "Graphics.GL.ARB.TransformFeedback2"
+ \ , "Graphics.GL.ARB.TransformFeedback3"
+ \ , "Graphics.GL.ARB.TransformFeedbackInstanced"
+ \ , "Graphics.GL.ARB.TransformFeedbackOverflowQuery"
+ \ , "Graphics.GL.ARB.TransposeMatrix"
+ \ , "Graphics.GL.ARB.UniformBufferObject"
+ \ , "Graphics.GL.ARB.VertexArrayBGRA"
+ \ , "Graphics.GL.ARB.VertexArrayObject"
+ \ , "Graphics.GL.ARB.VertexAttrib64Bit"
+ \ , "Graphics.GL.ARB.VertexAttribBinding"
+ \ , "Graphics.GL.ARB.VertexBlend"
+ \ , "Graphics.GL.ARB.VertexBufferObject"
+ \ , "Graphics.GL.ARB.VertexProgram"
+ \ , "Graphics.GL.ARB.VertexShader"
+ \ , "Graphics.GL.ARB.VertexType10f11f11fRev"
+ \ , "Graphics.GL.ARB.VertexType2101010RevCompatibility"
+ \ , "Graphics.GL.ARB.VertexType2101010RevCore"
+ \ , "Graphics.GL.ARB.ViewportArray"
+ \ , "Graphics.GL.ARB.WindowPos"
+ \ , "Graphics.GL.ATI"
+ \ , "Graphics.GL.ATI.DrawBuffers"
+ \ , "Graphics.GL.ATI.ElementArray"
+ \ , "Graphics.GL.ATI.EnvmapBumpmap"
+ \ , "Graphics.GL.ATI.FragmentShader"
+ \ , "Graphics.GL.ATI.MapObjectBuffer"
+ \ , "Graphics.GL.ATI.Meminfo"
+ \ , "Graphics.GL.ATI.PNTriangles"
+ \ , "Graphics.GL.ATI.PixelFormatFloat"
+ \ , "Graphics.GL.ATI.SeparateStencil"
+ \ , "Graphics.GL.ATI.TextFragmentShader"
+ \ , "Graphics.GL.ATI.TextureEnvCombine3"
+ \ , "Graphics.GL.ATI.TextureFloat"
+ \ , "Graphics.GL.ATI.TextureMirrorOnce"
+ \ , "Graphics.GL.ATI.VertexArrayObject"
+ \ , "Graphics.GL.ATI.VertexAttribArrayObject"
+ \ , "Graphics.GL.ATI.VertexStreams"
+ \ , "Graphics.GL.Compatibility30"
+ \ , "Graphics.GL.Compatibility31"
+ \ , "Graphics.GL.Compatibility32"
+ \ , "Graphics.GL.Compatibility33"
+ \ , "Graphics.GL.Compatibility40"
+ \ , "Graphics.GL.Compatibility41"
+ \ , "Graphics.GL.Compatibility42"
+ \ , "Graphics.GL.Compatibility43"
+ \ , "Graphics.GL.Compatibility44"
+ \ , "Graphics.GL.Compatibility45"
+ \ , "Graphics.GL.Compatibility46"
+ \ , "Graphics.GL.Core30"
+ \ , "Graphics.GL.Core31"
+ \ , "Graphics.GL.Core32"
+ \ , "Graphics.GL.Core33"
+ \ , "Graphics.GL.Core40"
+ \ , "Graphics.GL.Core41"
+ \ , "Graphics.GL.Core42"
+ \ , "Graphics.GL.Core43"
+ \ , "Graphics.GL.Core44"
+ \ , "Graphics.GL.Core45"
+ \ , "Graphics.GL.Core46"
+ \ , "Graphics.GL.EXT"
+ \ , "Graphics.GL.EXT.ABGR"
+ \ , "Graphics.GL.EXT.BGRA"
+ \ , "Graphics.GL.EXT.BindableUniform"
+ \ , "Graphics.GL.EXT.BlendColor"
+ \ , "Graphics.GL.EXT.BlendEquationSeparate"
+ \ , "Graphics.GL.EXT.BlendFuncSeparate"
+ \ , "Graphics.GL.EXT.BlendMinmax"
+ \ , "Graphics.GL.EXT.BlendSubtract"
+ \ , "Graphics.GL.EXT.CMYKA"
+ \ , "Graphics.GL.EXT.ClipVolumeHint"
+ \ , "Graphics.GL.EXT.ColorSubtable"
+ \ , "Graphics.GL.EXT.CompiledVertexArray"
+ \ , "Graphics.GL.EXT.Convolution"
+ \ , "Graphics.GL.EXT.CoordinateFrame"
+ \ , "Graphics.GL.EXT.CopyTexture"
+ \ , "Graphics.GL.EXT.CullVertex"
+ \ , "Graphics.GL.EXT.DebugLabel"
+ \ , "Graphics.GL.EXT.DebugMarker"
+ \ , "Graphics.GL.EXT.DepthBoundsTest"
+ \ , "Graphics.GL.EXT.DirectStateAccess"
+ \ , "Graphics.GL.EXT.DrawBuffers2"
+ \ , "Graphics.GL.EXT.DrawInstanced"
+ \ , "Graphics.GL.EXT.DrawRangeElements"
+ \ , "Graphics.GL.EXT.EglImageStorage"
+ \ , "Graphics.GL.EXT.ExternalBuffer"
+ \ , "Graphics.GL.EXT.FogCoord"
+ \ , "Graphics.GL.EXT.FourTwoTwoPixels"
+ \ , "Graphics.GL.EXT.FramebufferBlit"
+ \ , "Graphics.GL.EXT.FramebufferMultisample"
+ \ , "Graphics.GL.EXT.FramebufferMultisampleBlitScaled"
+ \ , "Graphics.GL.EXT.FramebufferObject"
+ \ , "Graphics.GL.EXT.FramebufferSRGB"
+ \ , "Graphics.GL.EXT.GPUProgramParameters"
+ \ , "Graphics.GL.EXT.GPUShader4"
+ \ , "Graphics.GL.EXT.GeometryShader4"
+ \ , "Graphics.GL.EXT.Histogram"
+ \ , "Graphics.GL.EXT.IndexArrayFormats"
+ \ , "Graphics.GL.EXT.IndexFunc"
+ \ , "Graphics.GL.EXT.IndexMaterial"
+ \ , "Graphics.GL.EXT.LightTexture"
+ \ , "Graphics.GL.EXT.MemoryObject"
+ \ , "Graphics.GL.EXT.MemoryObjectFd"
+ \ , "Graphics.GL.EXT.MemoryObjectWin32"
+ \ , "Graphics.GL.EXT.MultiDrawArrays"
+ \ , "Graphics.GL.EXT.Multisample"
+ \ , "Graphics.GL.EXT.PackedDepthStencil"
+ \ , "Graphics.GL.EXT.PackedFloat"
+ \ , "Graphics.GL.EXT.PackedPixels"
+ \ , "Graphics.GL.EXT.PalettedTexture"
+ \ , "Graphics.GL.EXT.PixelBufferObject"
+ \ , "Graphics.GL.EXT.PixelTransform"
+ \ , "Graphics.GL.EXT.PointParameters"
+ \ , "Graphics.GL.EXT.PolygonOffset"
+ \ , "Graphics.GL.EXT.PolygonOffsetClamp"
+ \ , "Graphics.GL.EXT.ProvokingVertex"
+ \ , "Graphics.GL.EXT.RasterMultisample"
+ \ , "Graphics.GL.EXT.RescaleNormal"
+ \ , "Graphics.GL.EXT.SecondaryColor"
+ \ , "Graphics.GL.EXT.Semaphore"
+ \ , "Graphics.GL.EXT.SemaphoreFd"
+ \ , "Graphics.GL.EXT.SemaphoreWin32"
+ \ , "Graphics.GL.EXT.SeparateShaderObjects"
+ \ , "Graphics.GL.EXT.SeparateSpecularColor"
+ \ , "Graphics.GL.EXT.ShaderFramebufferFetch"
+ \ , "Graphics.GL.EXT.ShaderFramebufferFetchNonCoherent"
+ \ , "Graphics.GL.EXT.ShaderImageLoadStore"
+ \ , "Graphics.GL.EXT.SharedTexturePalette"
+ \ , "Graphics.GL.EXT.StencilClearTag"
+ \ , "Graphics.GL.EXT.StencilTwoSide"
+ \ , "Graphics.GL.EXT.StencilWrap"
+ \ , "Graphics.GL.EXT.Subtexture"
+ \ , "Graphics.GL.EXT.Texture"
+ \ , "Graphics.GL.EXT.Texture3D"
+ \ , "Graphics.GL.EXT.TextureArray"
+ \ , "Graphics.GL.EXT.TextureBufferObject"
+ \ , "Graphics.GL.EXT.TextureCompressionLATC"
+ \ , "Graphics.GL.EXT.TextureCompressionRGTC"
+ \ , "Graphics.GL.EXT.TextureCompressionS3TC"
+ \ , "Graphics.GL.EXT.TextureCubeMap"
+ \ , "Graphics.GL.EXT.TextureEnvCombine"
+ \ , "Graphics.GL.EXT.TextureEnvDot3"
+ \ , "Graphics.GL.EXT.TextureFilterAnisotropic"
+ \ , "Graphics.GL.EXT.TextureFilterMinmax"
+ \ , "Graphics.GL.EXT.TextureInteger"
+ \ , "Graphics.GL.EXT.TextureLODBias"
+ \ , "Graphics.GL.EXT.TextureMirrorClamp"
+ \ , "Graphics.GL.EXT.TextureObject"
+ \ , "Graphics.GL.EXT.TexturePerturbNormal"
+ \ , "Graphics.GL.EXT.TextureSNorm"
+ \ , "Graphics.GL.EXT.TextureSRGB"
+ \ , "Graphics.GL.EXT.TextureSRGBDecode"
+ \ , "Graphics.GL.EXT.TextureSharedExponent"
+ \ , "Graphics.GL.EXT.TextureSwizzle"
+ \ , "Graphics.GL.EXT.TimerQuery"
+ \ , "Graphics.GL.EXT.TransformFeedback"
+ \ , "Graphics.GL.EXT.VertexArray"
+ \ , "Graphics.GL.EXT.VertexArrayBGRA"
+ \ , "Graphics.GL.EXT.VertexAttrib64Bit"
+ \ , "Graphics.GL.EXT.VertexShader"
+ \ , "Graphics.GL.EXT.VertexWeighting"
+ \ , "Graphics.GL.EXT.Win32KeyedMutex"
+ \ , "Graphics.GL.EXT.WindowRectangles"
+ \ , "Graphics.GL.EXT.X11SyncObject"
+ \ , "Graphics.GL.Functions"
+ \ , "Graphics.GL.GREMEDY"
+ \ , "Graphics.GL.GREMEDY.FrameTerminator"
+ \ , "Graphics.GL.GREMEDY.StringMarker"
+ \ , "Graphics.GL.GetProcAddress"
+ \ , "Graphics.GL.Groups"
+ \ , "Graphics.GL.HP"
+ \ , "Graphics.GL.HP.ConvolutionBorderModes"
+ \ , "Graphics.GL.HP.ImageTransform"
+ \ , "Graphics.GL.HP.OcclusionTest"
+ \ , "Graphics.GL.HP.TextureLighting"
+ \ , "Graphics.GL.IBM"
+ \ , "Graphics.GL.IBM.CullVertex"
+ \ , "Graphics.GL.IBM.MultimodeDrawArrays"
+ \ , "Graphics.GL.IBM.RasterposClip"
+ \ , "Graphics.GL.IBM.StaticData"
+ \ , "Graphics.GL.IBM.TextureMirroredRepeat"
+ \ , "Graphics.GL.IBM.VertexArrayLists"
+ \ , "Graphics.GL.INGR"
+ \ , "Graphics.GL.INGR.BlendFuncSeparate"
+ \ , "Graphics.GL.INGR.ColorClamp"
+ \ , "Graphics.GL.INGR.InterlaceRead"
+ \ , "Graphics.GL.INTEL"
+ \ , "Graphics.GL.INTEL.BlackholeRender"
+ \ , "Graphics.GL.INTEL.ConservativeRasterization"
+ \ , "Graphics.GL.INTEL.FramebufferCmaa"
+ \ , "Graphics.GL.INTEL.MapTexture"
+ \ , "Graphics.GL.INTEL.ParallelArrays"
+ \ , "Graphics.GL.INTEL.PerformanceQuery"
+ \ , "Graphics.GL.KHR"
+ \ , "Graphics.GL.KHR.BlendEquationAdvanced"
+ \ , "Graphics.GL.KHR.BlendEquationAdvancedCoherent"
+ \ , "Graphics.GL.KHR.ContextFlushControl"
+ \ , "Graphics.GL.KHR.DebugCompatibility"
+ \ , "Graphics.GL.KHR.DebugCore"
+ \ , "Graphics.GL.KHR.NoError"
+ \ , "Graphics.GL.KHR.ParallelShaderCompile"
+ \ , "Graphics.GL.KHR.Robustness"
+ \ , "Graphics.GL.KHR.TextureCompressionASTCHDR"
+ \ , "Graphics.GL.KHR.TextureCompressionASTCLDR"
+ \ , "Graphics.GL.MESA"
+ \ , "Graphics.GL.MESA.PackInvert"
+ \ , "Graphics.GL.MESA.ProgramBinaryFormats"
+ \ , "Graphics.GL.MESA.ResizeBuffers"
+ \ , "Graphics.GL.MESA.TileRasterOrder"
+ \ , "Graphics.GL.MESA.WindowPos"
+ \ , "Graphics.GL.MESA.YCbCrTexture"
+ \ , "Graphics.GL.MESAX"
+ \ , "Graphics.GL.MESAX.TextureStack"
+ \ , "Graphics.GL.NV"
+ \ , "Graphics.GL.NV.AlphaToCoverageDitherControl"
+ \ , "Graphics.GL.NV.BindlessMultiDrawIndirect"
+ \ , "Graphics.GL.NV.BindlessMultiDrawIndirectCount"
+ \ , "Graphics.GL.NV.BindlessTexture"
+ \ , "Graphics.GL.NV.BlendEquationAdvanced"
+ \ , "Graphics.GL.NV.BlendEquationAdvancedCoherent"
+ \ , "Graphics.GL.NV.BlendMinmaxFactor"
+ \ , "Graphics.GL.NV.ClipSpaceWScaling"
+ \ , "Graphics.GL.NV.CommandList"
+ \ , "Graphics.GL.NV.ComputeProgram5"
+ \ , "Graphics.GL.NV.ConditionalRender"
+ \ , "Graphics.GL.NV.ConservativeRaster"
+ \ , "Graphics.GL.NV.ConservativeRasterDilate"
+ \ , "Graphics.GL.NV.ConservativeRasterPreSnap"
+ \ , "Graphics.GL.NV.ConservativeRasterPreSnapTriangles"
+ \ , "Graphics.GL.NV.CopyDepthToColor"
+ \ , "Graphics.GL.NV.CopyImage"
+ \ , "Graphics.GL.NV.DeepTexture3D"
+ \ , "Graphics.GL.NV.DepthBufferFloat"
+ \ , "Graphics.GL.NV.DepthClamp"
+ \ , "Graphics.GL.NV.DrawTexture"
+ \ , "Graphics.GL.NV.DrawVulkanImage"
+ \ , "Graphics.GL.NV.Evaluators"
+ \ , "Graphics.GL.NV.ExplicitMultisample"
+ \ , "Graphics.GL.NV.Fence"
+ \ , "Graphics.GL.NV.FillRectangle"
+ \ , "Graphics.GL.NV.FloatBuffer"
+ \ , "Graphics.GL.NV.FogDistance"
+ \ , "Graphics.GL.NV.FragmentCoverageToColor"
+ \ , "Graphics.GL.NV.FragmentProgram"
+ \ , "Graphics.GL.NV.FragmentProgram2"
+ \ , "Graphics.GL.NV.FramebufferMixedSamples"
+ \ , "Graphics.GL.NV.FramebufferMultisampleCoverage"
+ \ , "Graphics.GL.NV.GPUMulticast"
+ \ , "Graphics.GL.NV.GPUProgram4"
+ \ , "Graphics.GL.NV.GPUProgram5"
+ \ , "Graphics.GL.NV.GPUShader5"
+ \ , "Graphics.GL.NV.GeometryProgram4"
+ \ , "Graphics.GL.NV.HalfFloat"
+ \ , "Graphics.GL.NV.InternalformatSampleQuery"
+ \ , "Graphics.GL.NV.LightMaxExponent"
+ \ , "Graphics.GL.NV.MultisampleCoverage"
+ \ , "Graphics.GL.NV.MultisampleFilterHint"
+ \ , "Graphics.GL.NV.OcclusionQuery"
+ \ , "Graphics.GL.NV.PackedDepthStencil"
+ \ , "Graphics.GL.NV.ParameterBufferObject"
+ \ , "Graphics.GL.NV.PathRenderingCompatibility"
+ \ , "Graphics.GL.NV.PathRenderingCore"
+ \ , "Graphics.GL.NV.PathRenderingSharedEdge"
+ \ , "Graphics.GL.NV.PixelDataRange"
+ \ , "Graphics.GL.NV.PointSprite"
+ \ , "Graphics.GL.NV.PresentVideo"
+ \ , "Graphics.GL.NV.PrimitiveRestart"
+ \ , "Graphics.GL.NV.QueryResource"
+ \ , "Graphics.GL.NV.QueryResourceTag"
+ \ , "Graphics.GL.NV.RegisterCombiners"
+ \ , "Graphics.GL.NV.RegisterCombiners2"
+ \ , "Graphics.GL.NV.RobustnessVideoMemoryPurge"
+ \ , "Graphics.GL.NV.SampleLocations"
+ \ , "Graphics.GL.NV.ShaderBufferLoad"
+ \ , "Graphics.GL.NV.ShaderBufferStore"
+ \ , "Graphics.GL.NV.ShaderThreadGroup"
+ \ , "Graphics.GL.NV.TessellationProgram5"
+ \ , "Graphics.GL.NV.TexgenEmboss"
+ \ , "Graphics.GL.NV.TexgenReflection"
+ \ , "Graphics.GL.NV.TextureBarrier"
+ \ , "Graphics.GL.NV.TextureEnvCombine4"
+ \ , "Graphics.GL.NV.TextureExpandNormal"
+ \ , "Graphics.GL.NV.TextureMultisample"
+ \ , "Graphics.GL.NV.TextureRectangle"
+ \ , "Graphics.GL.NV.TextureShader"
+ \ , "Graphics.GL.NV.TextureShader2"
+ \ , "Graphics.GL.NV.TextureShader3"
+ \ , "Graphics.GL.NV.TransformFeedback"
+ \ , "Graphics.GL.NV.TransformFeedback2"
+ \ , "Graphics.GL.NV.UniformBufferUnifiedMemory"
+ \ , "Graphics.GL.NV.VDPAUInterop"
+ \ , "Graphics.GL.NV.VertexArrayRange"
+ \ , "Graphics.GL.NV.VertexArrayRange2"
+ \ , "Graphics.GL.NV.VertexAttribInteger64Bit"
+ \ , "Graphics.GL.NV.VertexBufferUnifiedMemory"
+ \ , "Graphics.GL.NV.VertexProgram"
+ \ , "Graphics.GL.NV.VertexProgram2Option"
+ \ , "Graphics.GL.NV.VertexProgram3"
+ \ , "Graphics.GL.NV.VertexProgram4"
+ \ , "Graphics.GL.NV.VideoCapture"
+ \ , "Graphics.GL.NV.ViewportSwizzle"
+ \ , "Graphics.GL.NVX"
+ \ , "Graphics.GL.NVX.ConditionalRender"
+ \ , "Graphics.GL.NVX.GPUMemoryInfo"
+ \ , "Graphics.GL.NVX.LinkedGPUMulticast"
+ \ , "Graphics.GL.OES"
+ \ , "Graphics.GL.OES.ByteCoordinates"
+ \ , "Graphics.GL.OES.CompressedPalettedTexture"
+ \ , "Graphics.GL.OES.FixedPoint"
+ \ , "Graphics.GL.OES.QueryMatrix"
+ \ , "Graphics.GL.OES.ReadFormat"
+ \ , "Graphics.GL.OES.SinglePrecision"
+ \ , "Graphics.GL.OML"
+ \ , "Graphics.GL.OML.Interlace"
+ \ , "Graphics.GL.OML.Resample"
+ \ , "Graphics.GL.OML.Subsample"
+ \ , "Graphics.GL.OVR"
+ \ , "Graphics.GL.OVR.Multiview"
+ \ , "Graphics.GL.PGI"
+ \ , "Graphics.GL.PGI.MiscHints"
+ \ , "Graphics.GL.PGI.VertexHints"
+ \ , "Graphics.GL.REND"
+ \ , "Graphics.GL.REND.ScreenCoordinates"
+ \ , "Graphics.GL.S3"
+ \ , "Graphics.GL.S3.S3TC"
+ \ , "Graphics.GL.SGI"
+ \ , "Graphics.GL.SGI.ColorMatrix"
+ \ , "Graphics.GL.SGI.ColorTable"
+ \ , "Graphics.GL.SGI.TextureColorTable"
+ \ , "Graphics.GL.SGIS"
+ \ , "Graphics.GL.SGIS.DetailTexture"
+ \ , "Graphics.GL.SGIS.FogFunction"
+ \ , "Graphics.GL.SGIS.GenerateMipmap"
+ \ , "Graphics.GL.SGIS.Multisample"
+ \ , "Graphics.GL.SGIS.PixelTexture"
+ \ , "Graphics.GL.SGIS.PointLineTexgen"
+ \ , "Graphics.GL.SGIS.PointParameters"
+ \ , "Graphics.GL.SGIS.SharpenTexture"
+ \ , "Graphics.GL.SGIS.Texture4D"
+ \ , "Graphics.GL.SGIS.TextureBorderClamp"
+ \ , "Graphics.GL.SGIS.TextureColorMask"
+ \ , "Graphics.GL.SGIS.TextureEdgeClamp"
+ \ , "Graphics.GL.SGIS.TextureFilter4"
+ \ , "Graphics.GL.SGIS.TextureLOD"
+ \ , "Graphics.GL.SGIS.TextureSelect"
+ \ , "Graphics.GL.SGIX"
+ \ , "Graphics.GL.SGIX.Async"
+ \ , "Graphics.GL.SGIX.AsyncHistogram"
+ \ , "Graphics.GL.SGIX.AsyncPixel"
+ \ , "Graphics.GL.SGIX.BlendAlphaMinmax"
+ \ , "Graphics.GL.SGIX.CalligraphicFragment"
+ \ , "Graphics.GL.SGIX.Clipmap"
+ \ , "Graphics.GL.SGIX.ConvolutionAccuracy"
+ \ , "Graphics.GL.SGIX.DepthTexture"
+ \ , "Graphics.GL.SGIX.FlushRaster"
+ \ , "Graphics.GL.SGIX.FogOffset"
+ \ , "Graphics.GL.SGIX.FragmentLighting"
+ \ , "Graphics.GL.SGIX.Framezoom"
+ \ , "Graphics.GL.SGIX.IglooInterface"
+ \ , "Graphics.GL.SGIX.Instruments"
+ \ , "Graphics.GL.SGIX.Interlace"
+ \ , "Graphics.GL.SGIX.IrInstrument1"
+ \ , "Graphics.GL.SGIX.ListPriority"
+ \ , "Graphics.GL.SGIX.PixelTexture"
+ \ , "Graphics.GL.SGIX.PixelTiles"
+ \ , "Graphics.GL.SGIX.PolynomialFFD"
+ \ , "Graphics.GL.SGIX.ReferencePlane"
+ \ , "Graphics.GL.SGIX.Resample"
+ \ , "Graphics.GL.SGIX.ScalebiasHint"
+ \ , "Graphics.GL.SGIX.Shadow"
+ \ , "Graphics.GL.SGIX.ShadowAmbient"
+ \ , "Graphics.GL.SGIX.Sprite"
+ \ , "Graphics.GL.SGIX.Subsample"
+ \ , "Graphics.GL.SGIX.TagSampleBuffer"
+ \ , "Graphics.GL.SGIX.TextureAddEnv"
+ \ , "Graphics.GL.SGIX.TextureCoordinateClamp"
+ \ , "Graphics.GL.SGIX.TextureLODBias"
+ \ , "Graphics.GL.SGIX.TextureMultiBuffer"
+ \ , "Graphics.GL.SGIX.TextureScaleBias"
+ \ , "Graphics.GL.SGIX.VertexPreclip"
+ \ , "Graphics.GL.SGIX.YCrCb"
+ \ , "Graphics.GL.SGIX.YCrCbA"
+ \ , "Graphics.GL.SUN"
+ \ , "Graphics.GL.SUN.ConvolutionBorderModes"
+ \ , "Graphics.GL.SUN.GlobalAlpha"
+ \ , "Graphics.GL.SUN.MeshArray"
+ \ , "Graphics.GL.SUN.SliceAccum"
+ \ , "Graphics.GL.SUN.TriangleList"
+ \ , "Graphics.GL.SUN.Vertex"
+ \ , "Graphics.GL.SUNX"
+ \ , "Graphics.GL.SUNX.ConstantData"
+ \ , "Graphics.GL.ThreeDFX"
+ \ , "Graphics.GL.ThreeDFX.Multisample"
+ \ , "Graphics.GL.ThreeDFX.Tbuffer"
+ \ , "Graphics.GL.ThreeDFX.TextureCompressionFXT1"
+ \ , "Graphics.GL.Tokens"
+ \ , "Graphics.GL.Types"
+ \ , "Graphics.GL.Version10"
+ \ , "Graphics.GL.Version11"
+ \ , "Graphics.GL.Version12"
+ \ , "Graphics.GL.Version13"
+ \ , "Graphics.GL.Version14"
+ \ , "Graphics.GL.Version15"
+ \ , "Graphics.GL.Version20"
+ \ , "Graphics.GL.Version21"
+ \ , "Graphics.GL.WIN"
+ \ , "Graphics.GL.WIN.PhongShading"
+ \ , "Graphics.GL.WIN.SpecularFog"
+ \ , "Test.QuickCheck"
+ \ , "Test.QuickCheck.All"
+ \ , "Test.QuickCheck.Arbitrary"
+ \ , "Test.QuickCheck.Exception"
+ \ , "Test.QuickCheck.Function"
+ \ , "Test.QuickCheck.Gen"
+ \ , "Test.QuickCheck.Gen.Unsafe"
+ \ , "Test.QuickCheck.Modifiers"
+ \ , "Test.QuickCheck.Monadic"
+ \ , "Test.QuickCheck.Poly"
+ \ , "Test.QuickCheck.Property"
+ \ , "Test.QuickCheck.Random"
+ \ , "Test.QuickCheck.State"
+ \ , "Test.QuickCheck.Test"
+ \ , "Test.QuickCheck.Text"
+ \ , "Data.StateVar"
+ \ , "Graphics.Win32"
+ \ , "Graphics.Win32.Control"
+ \ , "Graphics.Win32.Dialogue"
+ \ , "Graphics.Win32.GDI"
+ \ , "Graphics.Win32.GDI.AlphaBlend"
+ \ , "Graphics.Win32.GDI.Bitmap"
+ \ , "Graphics.Win32.GDI.Brush"
+ \ , "Graphics.Win32.GDI.Clip"
+ \ , "Graphics.Win32.GDI.Font"
+ \ , "Graphics.Win32.GDI.Graphics2D"
+ \ , "Graphics.Win32.GDI.HDC"
+ \ , "Graphics.Win32.GDI.Palette"
+ \ , "Graphics.Win32.GDI.Path"
+ \ , "Graphics.Win32.GDI.Pen"
+ \ , "Graphics.Win32.GDI.Region"
+ \ , "Graphics.Win32.GDI.Types"
+ \ , "Graphics.Win32.Icon"
+ \ , "Graphics.Win32.Key"
+ \ , "Graphics.Win32.LayeredWindow"
+ \ , "Graphics.Win32.Menu"
+ \ , "Graphics.Win32.Message"
+ \ , "Graphics.Win32.Misc"
+ \ , "Graphics.Win32.Resource"
+ \ , "Graphics.Win32.Window"
+ \ , "Graphics.Win32.Window.AnimateWindow"
+ \ , "Graphics.Win32.Window.ForegroundWindow"
+ \ , "Graphics.Win32.Window.HotKey"
+ \ , "Graphics.Win32.Window.IMM"
+ \ , "Graphics.Win32.Window.PostMessage"
+ \ , "Media.Win32"
+ \ , "System.Win32"
+ \ , "System.Win32.Automation"
+ \ , "System.Win32.Automation.Input"
+ \ , "System.Win32.Automation.Input.Key"
+ \ , "System.Win32.Automation.Input.Mouse"
+ \ , "System.Win32.Console"
+ \ , "System.Win32.Console.CtrlHandler"
+ \ , "System.Win32.Console.HWND"
+ \ , "System.Win32.Console.Title"
+ \ , "System.Win32.DLL"
+ \ , "System.Win32.DebugApi"
+ \ , "System.Win32.Encoding"
+ \ , "System.Win32.Exception.Unsupported"
+ \ , "System.Win32.File"
+ \ , "System.Win32.FileMapping"
+ \ , "System.Win32.HardLink"
+ \ , "System.Win32.Info"
+ \ , "System.Win32.Info.Computer"
+ \ , "System.Win32.Info.Version"
+ \ , "System.Win32.Mem"
+ \ , "System.Win32.MinTTY"
+ \ , "System.Win32.NLS"
+ \ , "System.Win32.Path"
+ \ , "System.Win32.Process"
+ \ , "System.Win32.Registry"
+ \ , "System.Win32.Security"
+ \ , "System.Win32.Shell"
+ \ , "System.Win32.SimpleMAPI"
+ \ , "System.Win32.String"
+ \ , "System.Win32.SymbolicLink"
+ \ , "System.Win32.Thread"
+ \ , "System.Win32.Time"
+ \ , "System.Win32.Types"
+ \ , "System.Win32.Utils"
+ \ , "System.Win32.Word"
+ \ , "Data.Array"
+ \ , "Data.Array.Base"
+ \ , "Data.Array.IArray"
+ \ , "Data.Array.IO"
+ \ , "Data.Array.IO.Internals"
+ \ , "Data.Array.IO.Safe"
+ \ , "Data.Array.MArray"
+ \ , "Data.Array.MArray.Safe"
+ \ , "Data.Array.ST"
+ \ , "Data.Array.ST.Safe"
+ \ , "Data.Array.Storable"
+ \ , "Data.Array.Storable.Internals"
+ \ , "Data.Array.Storable.Safe"
+ \ , "Data.Array.Unboxed"
+ \ , "Data.Array.Unsafe"
+ \ , "Control.Concurrent.Async"
+ \ , "Data.Attoparsec"
+ \ , "Data.Attoparsec.ByteString"
+ \ , "Data.Attoparsec.ByteString.Char8"
+ \ , "Data.Attoparsec.ByteString.Lazy"
+ \ , "Data.Attoparsec.Char8"
+ \ , "Data.Attoparsec.Combinator"
+ \ , "Data.Attoparsec.Internal"
+ \ , "Data.Attoparsec.Internal.Types"
+ \ , "Data.Attoparsec.Lazy"
+ \ , "Data.Attoparsec.Number"
+ \ , "Data.Attoparsec.Text"
+ \ , "Data.Attoparsec.Text.Lazy"
+ \ , "Data.Attoparsec.Types"
+ \ , "Data.Attoparsec.Zepto"
+ \ , "Control.Applicative"
+ \ , "Control.Arrow"
+ \ , "Control.Category"
+ \ , "Control.Concurrent"
+ \ , "Control.Concurrent.Chan"
+ \ , "Control.Concurrent.MVar"
+ \ , "Control.Concurrent.QSem"
+ \ , "Control.Concurrent.QSemN"
+ \ , "Control.Exception"
+ \ , "Control.Exception.Base"
+ \ , "Control.Monad"
+ \ , "Control.Monad.Fail"
+ \ , "Control.Monad.Fix"
+ \ , "Control.Monad.IO.Class"
+ \ , "Control.Monad.Instances"
+ \ , "Control.Monad.ST"
+ \ , "Control.Monad.ST.Lazy"
+ \ , "Control.Monad.ST.Lazy.Safe"
+ \ , "Control.Monad.ST.Lazy.Unsafe"
+ \ , "Control.Monad.ST.Safe"
+ \ , "Control.Monad.ST.Strict"
+ \ , "Control.Monad.ST.Unsafe"
+ \ , "Control.Monad.Zip"
+ \ , "Data.Bifoldable"
+ \ , "Data.Bifunctor"
+ \ , "Data.Bitraversable"
+ \ , "Data.Bits"
+ \ , "Data.Bool"
+ \ , "Data.Char"
+ \ , "Data.Coerce"
+ \ , "Data.Complex"
+ \ , "Data.Data"
+ \ , "Data.Dynamic"
+ \ , "Data.Either"
+ \ , "Data.Eq"
+ \ , "Data.Fixed"
+ \ , "Data.Foldable"
+ \ , "Data.Function"
+ \ , "Data.Functor"
+ \ , "Data.Functor.Classes"
+ \ , "Data.Functor.Compose"
+ \ , "Data.Functor.Const"
+ \ , "Data.Functor.Identity"
+ \ , "Data.Functor.Product"
+ \ , "Data.Functor.Sum"
+ \ , "Data.IORef"
+ \ , "Data.Int"
+ \ , "Data.Ix"
+ \ , "Data.Kind"
+ \ , "Data.List"
+ \ , "Data.List.NonEmpty"
+ \ , "Data.Maybe"
+ \ , "Data.Monoid"
+ \ , "Data.Ord"
+ \ , "Data.Proxy"
+ \ , "Data.Ratio"
+ \ , "Data.STRef"
+ \ , "Data.STRef.Lazy"
+ \ , "Data.STRef.Strict"
+ \ , "Data.Semigroup"
+ \ , "Data.String"
+ \ , "Data.Traversable"
+ \ , "Data.Tuple"
+ \ , "Data.Type.Bool"
+ \ , "Data.Type.Coercion"
+ \ , "Data.Type.Equality"
+ \ , "Data.Typeable"
+ \ , "Data.Unique"
+ \ , "Data.Version"
+ \ , "Data.Void"
+ \ , "Data.Word"
+ \ , "Debug.Trace"
+ \ , "Foreign"
+ \ , "Foreign.C"
+ \ , "Foreign.C.Error"
+ \ , "Foreign.C.String"
+ \ , "Foreign.C.Types"
+ \ , "Foreign.Concurrent"
+ \ , "Foreign.ForeignPtr"
+ \ , "Foreign.ForeignPtr.Safe"
+ \ , "Foreign.ForeignPtr.Unsafe"
+ \ , "Foreign.Marshal"
+ \ , "Foreign.Marshal.Alloc"
+ \ , "Foreign.Marshal.Array"
+ \ , "Foreign.Marshal.Error"
+ \ , "Foreign.Marshal.Pool"
+ \ , "Foreign.Marshal.Safe"
+ \ , "Foreign.Marshal.Unsafe"
+ \ , "Foreign.Marshal.Utils"
+ \ , "Foreign.Ptr"
+ \ , "Foreign.Safe"
+ \ , "Foreign.StablePtr"
+ \ , "Foreign.Storable"
+ \ , "GHC.Arr"
+ \ , "GHC.Base"
+ \ , "GHC.ByteOrder"
+ \ , "GHC.Char"
+ \ , "GHC.Clock"
+ \ , "GHC.Conc"
+ \ , "GHC.Conc.IO"
+ \ , "GHC.Conc.Signal"
+ \ , "GHC.Conc.Sync"
+ \ , "GHC.ConsoleHandler"
+ \ , "GHC.Constants"
+ \ , "GHC.Desugar"
+ \ , "GHC.Enum"
+ \ , "GHC.Environment"
+ \ , "GHC.Err"
+ \ , "GHC.Event"
+ \ , "GHC.Exception"
+ \ , "GHC.ExecutionStack"
+ \ , "GHC.ExecutionStack.Internal"
+ \ , "GHC.Exts"
+ \ , "GHC.Fingerprint"
+ \ , "GHC.Fingerprint.Type"
+ \ , "GHC.Float"
+ \ , "GHC.Float.ConversionUtils"
+ \ , "GHC.Float.RealFracMethods"
+ \ , "GHC.Foreign"
+ \ , "GHC.ForeignPtr"
+ \ , "GHC.GHCi"
+ \ , "GHC.Generics"
+ \ , "GHC.IO"
+ \ , "GHC.IO.Buffer"
+ \ , "GHC.IO.BufferedIO"
+ \ , "GHC.IO.Device"
+ \ , "GHC.IO.Encoding"
+ \ , "GHC.IO.Encoding.CodePage"
+ \ , "GHC.IO.Encoding.Failure"
+ \ , "GHC.IO.Encoding.Iconv"
+ \ , "GHC.IO.Encoding.Latin1"
+ \ , "GHC.IO.Encoding.Types"
+ \ , "GHC.IO.Encoding.UTF16"
+ \ , "GHC.IO.Encoding.UTF32"
+ \ , "GHC.IO.Encoding.UTF8"
+ \ , "GHC.IO.Exception"
+ \ , "GHC.IO.FD"
+ \ , "GHC.IO.Handle"
+ \ , "GHC.IO.Handle.FD"
+ \ , "GHC.IO.Handle.Internals"
+ \ , "GHC.IO.Handle.Lock"
+ \ , "GHC.IO.Handle.Text"
+ \ , "GHC.IO.Handle.Types"
+ \ , "GHC.IO.IOMode"
+ \ , "GHC.IO.Unsafe"
+ \ , "GHC.IOArray"
+ \ , "GHC.IORef"
+ \ , "GHC.Int"
+ \ , "GHC.List"
+ \ , "GHC.MVar"
+ \ , "GHC.Natural"
+ \ , "GHC.Num"
+ \ , "GHC.OldList"
+ \ , "GHC.OverloadedLabels"
+ \ , "GHC.PArr"
+ \ , "GHC.Pack"
+ \ , "GHC.Profiling"
+ \ , "GHC.Ptr"
+ \ , "GHC.RTS.Flags"
+ \ , "GHC.Read"
+ \ , "GHC.Real"
+ \ , "GHC.Records"
+ \ , "GHC.ST"
+ \ , "GHC.STRef"
+ \ , "GHC.Show"
+ \ , "GHC.Stable"
+ \ , "GHC.Stack"
+ \ , "GHC.Stack.CCS"
+ \ , "GHC.Stack.Types"
+ \ , "GHC.StaticPtr"
+ \ , "GHC.Stats"
+ \ , "GHC.Storable"
+ \ , "GHC.TopHandler"
+ \ , "GHC.TypeLits"
+ \ , "GHC.TypeNats"
+ \ , "GHC.Unicode"
+ \ , "GHC.Weak"
+ \ , "GHC.Word"
+ \ , "Numeric"
+ \ , "Numeric.Natural"
+ \ , "Prelude"
+ \ , "System.CPUTime"
+ \ , "System.Console.GetOpt"
+ \ , "System.Environment"
+ \ , "System.Environment.Blank"
+ \ , "System.Exit"
+ \ , "System.IO"
+ \ , "System.IO.Error"
+ \ , "System.IO.Unsafe"
+ \ , "System.Info"
+ \ , "System.Mem"
+ \ , "System.Mem.StableName"
+ \ , "System.Mem.Weak"
+ \ , "System.Posix.Internals"
+ \ , "System.Posix.Types"
+ \ , "System.Timeout"
+ \ , "Text.ParserCombinators.ReadP"
+ \ , "Text.ParserCombinators.ReadPrec"
+ \ , "Text.Printf"
+ \ , "Text.Read"
+ \ , "Text.Read.Lex"
+ \ , "Text.Show"
+ \ , "Text.Show.Functions"
+ \ , "Type.Reflection"
+ \ , "Type.Reflection.Unsafe"
+ \ , "Unsafe.Coerce"
+ \ , "Data.ByteString"
+ \ , "Data.ByteString.Builder"
+ \ , "Data.ByteString.Builder.Extra"
+ \ , "Data.ByteString.Builder.Internal"
+ \ , "Data.ByteString.Builder.Prim"
+ \ , "Data.ByteString.Builder.Prim.Internal"
+ \ , "Data.ByteString.Char8"
+ \ , "Data.ByteString.Internal"
+ \ , "Data.ByteString.Lazy"
+ \ , "Data.ByteString.Lazy.Builder"
+ \ , "Data.ByteString.Lazy.Builder.ASCII"
+ \ , "Data.ByteString.Lazy.Builder.Extras"
+ \ , "Data.ByteString.Lazy.Char8"
+ \ , "Data.ByteString.Lazy.Internal"
+ \ , "Data.ByteString.Short"
+ \ , "Data.ByteString.Short.Internal"
+ \ , "Data.ByteString.Unsafe"
+ \ , "Data.CallStack"
+ \ , "Data.CaseInsensitive"
+ \ , "Data.CaseInsensitive.Unsafe"
+ \ , "Network.CGI"
+ \ , "Network.CGI.Compat"
+ \ , "Network.CGI.Cookie"
+ \ , "Network.CGI.Monad"
+ \ , "Network.CGI.Protocol"
+ \ , "Data.Graph"
+ \ , "Data.IntMap"
+ \ , "Data.IntMap.Internal"
+ \ , "Data.IntMap.Internal.Debug"
+ \ , "Data.IntMap.Lazy"
+ \ , "Data.IntMap.Merge.Lazy"
+ \ , "Data.IntMap.Merge.Strict"
+ \ , "Data.IntMap.Strict"
+ \ , "Data.IntSet"
+ \ , "Data.IntSet.Internal"
+ \ , "Data.Map"
+ \ , "Data.Map.Internal"
+ \ , "Data.Map.Internal.Debug"
+ \ , "Data.Map.Lazy"
+ \ , "Data.Map.Lazy.Merge"
+ \ , "Data.Map.Merge.Lazy"
+ \ , "Data.Map.Merge.Strict"
+ \ , "Data.Map.Strict"
+ \ , "Data.Map.Strict.Internal"
+ \ , "Data.Map.Strict.Merge"
+ \ , "Data.Sequence"
+ \ , "Data.Sequence.Internal"
+ \ , "Data.Sequence.Internal.Sorting"
+ \ , "Data.Set"
+ \ , "Data.Set.Internal"
+ \ , "Data.Tree"
+ \ , "Utils.Containers.Internal.BitQueue"
+ \ , "Utils.Containers.Internal.BitUtil"
+ \ , "Utils.Containers.Internal.StrictPair"
+ \ , "Control.DeepSeq"
+ \ , "System.Directory"
+ \ , "System.Directory.Internal"
+ \ , "System.Directory.Internal.Prelude"
+ \ , "Control.Monad.Catch"
+ \ , "Control.Monad.Catch.Pure"
+ \ , "Control.Exception.Extensible"
+ \ , "Data.Graph.Inductive"
+ \ , "Data.Graph.Inductive.Basic"
+ \ , "Data.Graph.Inductive.Example"
+ \ , "Data.Graph.Inductive.Graph"
+ \ , "Data.Graph.Inductive.Internal.Heap"
+ \ , "Data.Graph.Inductive.Internal.Queue"
+ \ , "Data.Graph.Inductive.Internal.RootPath"
+ \ , "Data.Graph.Inductive.Internal.Thread"
+ \ , "Data.Graph.Inductive.Monad"
+ \ , "Data.Graph.Inductive.Monad.IOArray"
+ \ , "Data.Graph.Inductive.Monad.STArray"
+ \ , "Data.Graph.Inductive.NodeMap"
+ \ , "Data.Graph.Inductive.PatriciaTree"
+ \ , "Data.Graph.Inductive.Query"
+ \ , "Data.Graph.Inductive.Query.ArtPoint"
+ \ , "Data.Graph.Inductive.Query.BCC"
+ \ , "Data.Graph.Inductive.Query.BFS"
+ \ , "Data.Graph.Inductive.Query.DFS"
+ \ , "Data.Graph.Inductive.Query.Dominators"
+ \ , "Data.Graph.Inductive.Query.GVD"
+ \ , "Data.Graph.Inductive.Query.Indep"
+ \ , "Data.Graph.Inductive.Query.MST"
+ \ , "Data.Graph.Inductive.Query.MaxFlow"
+ \ , "Data.Graph.Inductive.Query.MaxFlow2"
+ \ , "Data.Graph.Inductive.Query.Monad"
+ \ , "Data.Graph.Inductive.Query.SP"
+ \ , "Data.Graph.Inductive.Query.TransClos"
+ \ , "Data.Graph.Inductive.Tree"
+ \ , "System.FilePath"
+ \ , "System.FilePath.Posix"
+ \ , "System.FilePath.Windows"
+ \ , "Numeric.Fixed"
+ \ , "Annotations"
+ \ , "ApiAnnotation"
+ \ , "Ar"
+ \ , "AsmCodeGen"
+ \ , "AsmUtils"
+ \ , "Avail"
+ \ , "Bag"
+ \ , "BasicTypes"
+ \ , "BinFingerprint"
+ \ , "BinIface"
+ \ , "Binary"
+ \ , "Bitmap"
+ \ , "BkpSyn"
+ \ , "BlockId"
+ \ , "BooleanFormula"
+ \ , "BufWrite"
+ \ , "BuildTyCl"
+ \ , "ByteCodeAsm"
+ \ , "ByteCodeGen"
+ \ , "ByteCodeInstr"
+ \ , "ByteCodeItbls"
+ \ , "ByteCodeLink"
+ \ , "ByteCodeTypes"
+ \ , "CLabel"
+ \ , "CPrim"
+ \ , "CSE"
+ \ , "CallArity"
+ \ , "CgUtils"
+ \ , "Check"
+ \ , "Class"
+ \ , "CmdLineParser"
+ \ , "Cmm"
+ \ , "CmmBuildInfoTables"
+ \ , "CmmCallConv"
+ \ , "CmmCommonBlockElim"
+ \ , "CmmContFlowOpt"
+ \ , "CmmExpr"
+ \ , "CmmImplementSwitchPlans"
+ \ , "CmmInfo"
+ \ , "CmmLayoutStack"
+ \ , "CmmLex"
+ \ , "CmmLint"
+ \ , "CmmLive"
+ \ , "CmmMachOp"
+ \ , "CmmMonad"
+ \ , "CmmNode"
+ \ , "CmmOpt"
+ \ , "CmmParse"
+ \ , "CmmPipeline"
+ \ , "CmmProcPoint"
+ \ , "CmmSink"
+ \ , "CmmSwitch"
+ \ , "CmmType"
+ \ , "CmmUtils"
+ \ , "CoAxiom"
+ \ , "CodeGen.Platform"
+ \ , "CodeGen.Platform.ARM"
+ \ , "CodeGen.Platform.ARM64"
+ \ , "CodeGen.Platform.NoRegs"
+ \ , "CodeGen.Platform.PPC"
+ \ , "CodeGen.Platform.PPC_Darwin"
+ \ , "CodeGen.Platform.SPARC"
+ \ , "CodeGen.Platform.X86"
+ \ , "CodeGen.Platform.X86_64"
+ \ , "CodeOutput"
+ \ , "Coercion"
+ \ , "ConLike"
+ \ , "Config"
+ \ , "Constants"
+ \ , "Convert"
+ \ , "CoreArity"
+ \ , "CoreFVs"
+ \ , "CoreLint"
+ \ , "CoreMonad"
+ \ , "CoreOpt"
+ \ , "CorePrep"
+ \ , "CoreSeq"
+ \ , "CoreStats"
+ \ , "CoreSubst"
+ \ , "CoreSyn"
+ \ , "CoreTidy"
+ \ , "CoreToStg"
+ \ , "CoreUnfold"
+ \ , "CoreUtils"
+ \ , "CostCentre"
+ \ , "Coverage"
+ \ , "Ctype"
+ \ , "DataCon"
+ \ , "Debug"
+ \ , "Debugger"
+ \ , "DebuggerUtils"
+ \ , "Demand"
+ \ , "Desugar"
+ \ , "Digraph"
+ \ , "DmdAnal"
+ \ , "DriverBkp"
+ \ , "DriverMkDepend"
+ \ , "DriverPhases"
+ \ , "DriverPipeline"
+ \ , "DsArrows"
+ \ , "DsBinds"
+ \ , "DsCCall"
+ \ , "DsExpr"
+ \ , "DsForeign"
+ \ , "DsGRHSs"
+ \ , "DsListComp"
+ \ , "DsMeta"
+ \ , "DsMonad"
+ \ , "DsUsage"
+ \ , "DsUtils"
+ \ , "Dwarf"
+ \ , "Dwarf.Constants"
+ \ , "Dwarf.Types"
+ \ , "DynFlags"
+ \ , "DynamicLoading"
+ \ , "Elf"
+ \ , "Encoding"
+ \ , "EnumSet"
+ \ , "ErrUtils"
+ \ , "Exception"
+ \ , "Exitify"
+ \ , "FV"
+ \ , "FamInst"
+ \ , "FamInstEnv"
+ \ , "FastFunctions"
+ \ , "FastMutInt"
+ \ , "FastString"
+ \ , "FastStringEnv"
+ \ , "FieldLabel"
+ \ , "FileCleanup"
+ \ , "Finder"
+ \ , "Fingerprint"
+ \ , "FiniteMap"
+ \ , "FlagChecker"
+ \ , "FloatIn"
+ \ , "FloatOut"
+ \ , "ForeignCall"
+ \ , "Format"
+ \ , "FunDeps"
+ \ , "GHC"
+ \ , "GHCi"
+ \ , "GhcMake"
+ \ , "GhcMonad"
+ \ , "GhcPlugins"
+ \ , "GraphBase"
+ \ , "GraphColor"
+ \ , "GraphOps"
+ \ , "GraphPpr"
+ \ , "HaddockUtils"
+ \ , "HeaderInfo"
+ \ , "Hooks"
+ \ , "Hoopl.Block"
+ \ , "Hoopl.Collections"
+ \ , "Hoopl.Dataflow"
+ \ , "Hoopl.Graph"
+ \ , "Hoopl.Label"
+ \ , "Hoopl.Unique"
+ \ , "HsBinds"
+ \ , "HsDecls"
+ \ , "HsDoc"
+ \ , "HsDumpAst"
+ \ , "HsExpr"
+ \ , "HsExtension"
+ \ , "HsImpExp"
+ \ , "HsLit"
+ \ , "HsPat"
+ \ , "HsSyn"
+ \ , "HsTypes"
+ \ , "HsUtils"
+ \ , "HscMain"
+ \ , "HscStats"
+ \ , "HscTypes"
+ \ , "IOEnv"
+ \ , "Id"
+ \ , "IdInfo"
+ \ , "IfaceEnv"
+ \ , "IfaceSyn"
+ \ , "IfaceType"
+ \ , "Inst"
+ \ , "InstEnv"
+ \ , "Instruction"
+ \ , "InteractiveEval"
+ \ , "InteractiveEvalTypes"
+ \ , "Json"
+ \ , "Kind"
+ \ , "KnownUniques"
+ \ , "Lexeme"
+ \ , "Lexer"
+ \ , "LiberateCase"
+ \ , "Linker"
+ \ , "ListSetOps"
+ \ , "ListT"
+ \ , "Literal"
+ \ , "Llvm"
+ \ , "Llvm.AbsSyn"
+ \ , "Llvm.MetaData"
+ \ , "Llvm.PpLlvm"
+ \ , "Llvm.Types"
+ \ , "LlvmCodeGen"
+ \ , "LlvmCodeGen.Base"
+ \ , "LlvmCodeGen.CodeGen"
+ \ , "LlvmCodeGen.Data"
+ \ , "LlvmCodeGen.Ppr"
+ \ , "LlvmCodeGen.Regs"
+ \ , "LlvmMangler"
+ \ , "LoadIface"
+ \ , "Match"
+ \ , "MatchCon"
+ \ , "MatchLit"
+ \ , "Maybes"
+ \ , "MkCore"
+ \ , "MkGraph"
+ \ , "MkId"
+ \ , "MkIface"
+ \ , "Module"
+ \ , "MonadUtils"
+ \ , "NCGMonad"
+ \ , "Name"
+ \ , "NameCache"
+ \ , "NameEnv"
+ \ , "NameSet"
+ \ , "NameShape"
+ \ , "OccName"
+ \ , "OccurAnal"
+ \ , "OptCoercion"
+ \ , "OrdList"
+ \ , "Outputable"
+ \ , "PIC"
+ \ , "PPC.CodeGen"
+ \ , "PPC.Cond"
+ \ , "PPC.Instr"
+ \ , "PPC.Ppr"
+ \ , "PPC.RegInfo"
+ \ , "PPC.Regs"
+ \ , "PackageConfig"
+ \ , "Packages"
+ \ , "Pair"
+ \ , "Panic"
+ \ , "Parser"
+ \ , "PatSyn"
+ \ , "PipelineMonad"
+ \ , "PlaceHolder"
+ \ , "Platform"
+ \ , "PlatformConstants"
+ \ , "Plugins"
+ \ , "PmExpr"
+ \ , "PprBase"
+ \ , "PprC"
+ \ , "PprCmm"
+ \ , "PprCmmDecl"
+ \ , "PprCmmExpr"
+ \ , "PprColour"
+ \ , "PprCore"
+ \ , "PprTyThing"
+ \ , "PrelInfo"
+ \ , "PrelNames"
+ \ , "PrelRules"
+ \ , "Pretty"
+ \ , "PrimOp"
+ \ , "ProfInit"
+ \ , "RdrHsSyn"
+ \ , "RdrName"
+ \ , "Reg"
+ \ , "RegAlloc.Graph.ArchBase"
+ \ , "RegAlloc.Graph.ArchX86"
+ \ , "RegAlloc.Graph.Coalesce"
+ \ , "RegAlloc.Graph.Main"
+ \ , "RegAlloc.Graph.Spill"
+ \ , "RegAlloc.Graph.SpillClean"
+ \ , "RegAlloc.Graph.SpillCost"
+ \ , "RegAlloc.Graph.Stats"
+ \ , "RegAlloc.Graph.TrivColorable"
+ \ , "RegAlloc.Linear.Base"
+ \ , "RegAlloc.Linear.FreeRegs"
+ \ , "RegAlloc.Linear.JoinToTargets"
+ \ , "RegAlloc.Linear.Main"
+ \ , "RegAlloc.Linear.PPC.FreeRegs"
+ \ , "RegAlloc.Linear.SPARC.FreeRegs"
+ \ , "RegAlloc.Linear.StackMap"
+ \ , "RegAlloc.Linear.State"
+ \ , "RegAlloc.Linear.Stats"
+ \ , "RegAlloc.Linear.X86.FreeRegs"
+ \ , "RegAlloc.Linear.X86_64.FreeRegs"
+ \ , "RegAlloc.Liveness"
+ \ , "RegClass"
+ \ , "RepType"
+ \ , "RnBinds"
+ \ , "RnEnv"
+ \ , "RnExpr"
+ \ , "RnFixity"
+ \ , "RnHsDoc"
+ \ , "RnModIface"
+ \ , "RnNames"
+ \ , "RnPat"
+ \ , "RnSource"
+ \ , "RnSplice"
+ \ , "RnTypes"
+ \ , "RnUnbound"
+ \ , "RnUtils"
+ \ , "RtClosureInspect"
+ \ , "Rules"
+ \ , "SAT"
+ \ , "SMRep"
+ \ , "SPARC.AddrMode"
+ \ , "SPARC.Base"
+ \ , "SPARC.CodeGen"
+ \ , "SPARC.CodeGen.Amode"
+ \ , "SPARC.CodeGen.Base"
+ \ , "SPARC.CodeGen.CondCode"
+ \ , "SPARC.CodeGen.Expand"
+ \ , "SPARC.CodeGen.Gen32"
+ \ , "SPARC.CodeGen.Gen64"
+ \ , "SPARC.CodeGen.Sanity"
+ \ , "SPARC.Cond"
+ \ , "SPARC.Imm"
+ \ , "SPARC.Instr"
+ \ , "SPARC.Ppr"
+ \ , "SPARC.Regs"
+ \ , "SPARC.ShortcutJump"
+ \ , "SPARC.Stack"
+ \ , "SetLevels"
+ \ , "SimplCore"
+ \ , "SimplEnv"
+ \ , "SimplMonad"
+ \ , "SimplStg"
+ \ , "SimplUtils"
+ \ , "Simplify"
+ \ , "SpecConstr"
+ \ , "Specialise"
+ \ , "SrcLoc"
+ \ , "State"
+ \ , "StaticPtrTable"
+ \ , "StgCmm"
+ \ , "StgCmmArgRep"
+ \ , "StgCmmBind"
+ \ , "StgCmmClosure"
+ \ , "StgCmmCon"
+ \ , "StgCmmEnv"
+ \ , "StgCmmExpr"
+ \ , "StgCmmExtCode"
+ \ , "StgCmmForeign"
+ \ , "StgCmmHeap"
+ \ , "StgCmmHpc"
+ \ , "StgCmmLayout"
+ \ , "StgCmmMonad"
+ \ , "StgCmmPrim"
+ \ , "StgCmmProf"
+ \ , "StgCmmTicky"
+ \ , "StgCmmUtils"
+ \ , "StgCse"
+ \ , "StgLint"
+ \ , "StgStats"
+ \ , "StgSyn"
+ \ , "Stream"
+ \ , "StringBuffer"
+ \ , "SysTools"
+ \ , "SysTools.BaseDir"
+ \ , "SysTools.ExtraObj"
+ \ , "SysTools.Info"
+ \ , "SysTools.Process"
+ \ , "SysTools.Tasks"
+ \ , "SysTools.Terminal"
+ \ , "THNames"
+ \ , "TargetReg"
+ \ , "TcAnnotations"
+ \ , "TcArrows"
+ \ , "TcBackpack"
+ \ , "TcBinds"
+ \ , "TcCanonical"
+ \ , "TcClassDcl"
+ \ , "TcDefaults"
+ \ , "TcDeriv"
+ \ , "TcDerivInfer"
+ \ , "TcDerivUtils"
+ \ , "TcEnv"
+ \ , "TcErrors"
+ \ , "TcEvidence"
+ \ , "TcExpr"
+ \ , "TcFlatten"
+ \ , "TcForeign"
+ \ , "TcGenDeriv"
+ \ , "TcGenFunctor"
+ \ , "TcGenGenerics"
+ \ , "TcHsSyn"
+ \ , "TcHsType"
+ \ , "TcIface"
+ \ , "TcInstDcls"
+ \ , "TcInteract"
+ \ , "TcMType"
+ \ , "TcMatches"
+ \ , "TcPat"
+ \ , "TcPatSyn"
+ \ , "TcPluginM"
+ \ , "TcRnDriver"
+ \ , "TcRnExports"
+ \ , "TcRnMonad"
+ \ , "TcRnTypes"
+ \ , "TcRules"
+ \ , "TcSMonad"
+ \ , "TcSigs"
+ \ , "TcSimplify"
+ \ , "TcSplice"
+ \ , "TcTyClsDecls"
+ \ , "TcTyDecls"
+ \ , "TcType"
+ \ , "TcTypeNats"
+ \ , "TcTypeable"
+ \ , "TcUnify"
+ \ , "TcValidity"
+ \ , "TidyPgm"
+ \ , "TmOracle"
+ \ , "ToIface"
+ \ , "TrieMap"
+ \ , "TyCoRep"
+ \ , "TyCon"
+ \ , "Type"
+ \ , "TysPrim"
+ \ , "TysWiredIn"
+ \ , "UnVarGraph"
+ \ , "UnariseStg"
+ \ , "Unify"
+ \ , "UniqDFM"
+ \ , "UniqDSet"
+ \ , "UniqFM"
+ \ , "UniqMap"
+ \ , "UniqSet"
+ \ , "UniqSupply"
+ \ , "Unique"
+ \ , "Util"
+ \ , "Var"
+ \ , "VarEnv"
+ \ , "VarSet"
+ \ , "Vectorise"
+ \ , "Vectorise.Builtins"
+ \ , "Vectorise.Builtins.Base"
+ \ , "Vectorise.Builtins.Initialise"
+ \ , "Vectorise.Convert"
+ \ , "Vectorise.Env"
+ \ , "Vectorise.Exp"
+ \ , "Vectorise.Generic.Description"
+ \ , "Vectorise.Generic.PADict"
+ \ , "Vectorise.Generic.PAMethods"
+ \ , "Vectorise.Generic.PData"
+ \ , "Vectorise.Monad"
+ \ , "Vectorise.Monad.Base"
+ \ , "Vectorise.Monad.Global"
+ \ , "Vectorise.Monad.InstEnv"
+ \ , "Vectorise.Monad.Local"
+ \ , "Vectorise.Monad.Naming"
+ \ , "Vectorise.Type.Classify"
+ \ , "Vectorise.Type.Env"
+ \ , "Vectorise.Type.TyConDecl"
+ \ , "Vectorise.Type.Type"
+ \ , "Vectorise.Utils"
+ \ , "Vectorise.Utils.Base"
+ \ , "Vectorise.Utils.Closure"
+ \ , "Vectorise.Utils.Hoisting"
+ \ , "Vectorise.Utils.PADict"
+ \ , "Vectorise.Utils.Poly"
+ \ , "Vectorise.Var"
+ \ , "Vectorise.Vect"
+ \ , "WorkWrap"
+ \ , "WwLib"
+ \ , "X86.CodeGen"
+ \ , "X86.Cond"
+ \ , "X86.Instr"
+ \ , "X86.Ppr"
+ \ , "X86.RegInfo"
+ \ , "X86.Regs"
+ \ , "Numeric.Half"
+ \ , "Data.Hashable"
+ \ , "Data.Hashable.Lifted"
+ \ , "Language.Haskell.Lexer"
+ \ , "Language.Haskell.ParseMonad"
+ \ , "Language.Haskell.ParseUtils"
+ \ , "Language.Haskell.Parser"
+ \ , "Language.Haskell.Pretty"
+ \ , "Language.Haskell.Syntax"
+ \ , "Control.Monad"
+ \ , "Data.Array"
+ \ , "Data.Bits"
+ \ , "Data.Char"
+ \ , "Data.Complex"
+ \ , "Data.Int"
+ \ , "Data.Ix"
+ \ , "Data.List"
+ \ , "Data.Maybe"
+ \ , "Data.Ratio"
+ \ , "Data.Word"
+ \ , "Foreign"
+ \ , "Foreign.C"
+ \ , "Foreign.C.Error"
+ \ , "Foreign.C.String"
+ \ , "Foreign.C.Types"
+ \ , "Foreign.ForeignPtr"
+ \ , "Foreign.Marshal"
+ \ , "Foreign.Marshal.Alloc"
+ \ , "Foreign.Marshal.Array"
+ \ , "Foreign.Marshal.Error"
+ \ , "Foreign.Marshal.Utils"
+ \ , "Foreign.Ptr"
+ \ , "Foreign.StablePtr"
+ \ , "Foreign.Storable"
+ \ , "Numeric"
+ \ , "Prelude"
+ \ , "System.Environment"
+ \ , "System.Exit"
+ \ , "System.IO"
+ \ , "System.IO.Error"
+ \ , "Array"
+ \ , "Bits"
+ \ , "CError"
+ \ , "CForeign"
+ \ , "CPUTime"
+ \ , "CString"
+ \ , "CTypes"
+ \ , "Char"
+ \ , "Complex"
+ \ , "Directory"
+ \ , "ForeignPtr"
+ \ , "IO"
+ \ , "Int"
+ \ , "Ix"
+ \ , "List"
+ \ , "Locale"
+ \ , "MarshalAlloc"
+ \ , "MarshalArray"
+ \ , "MarshalError"
+ \ , "MarshalUtils"
+ \ , "Maybe"
+ \ , "Monad"
+ \ , "Numeric"
+ \ , "Prelude"
+ \ , "Ptr"
+ \ , "Random"
+ \ , "Ratio"
+ \ , "StablePtr"
+ \ , "Storable"
+ \ , "System"
+ \ , "Time"
+ \ , "Word"
+ \ , "Trace.Hpc.Mix"
+ \ , "Trace.Hpc.Reflect"
+ \ , "Trace.Hpc.Tix"
+ \ , "Trace.Hpc.Util"
+ \ , "Text.Html"
+ \ , "Text.Html.BlockTable"
+ \ , "GHC.Integer.Logarithms.Compat"
+ \ , "Math.NumberTheory.Logarithms"
+ \ , "Math.NumberTheory.Powers.Integer"
+ \ , "Math.NumberTheory.Powers.Natural"
+ \ , "Control.Monad.Cont"
+ \ , "Control.Monad.Cont.Class"
+ \ , "Control.Monad.Error"
+ \ , "Control.Monad.Error.Class"
+ \ , "Control.Monad.Except"
+ \ , "Control.Monad.Identity"
+ \ , "Control.Monad.List"
+ \ , "Control.Monad.RWS"
+ \ , "Control.Monad.RWS.Class"
+ \ , "Control.Monad.RWS.Lazy"
+ \ , "Control.Monad.RWS.Strict"
+ \ , "Control.Monad.Reader"
+ \ , "Control.Monad.Reader.Class"
+ \ , "Control.Monad.State"
+ \ , "Control.Monad.State.Class"
+ \ , "Control.Monad.State.Lazy"
+ \ , "Control.Monad.State.Strict"
+ \ , "Control.Monad.Trans"
+ \ , "Control.Monad.Writer"
+ \ , "Control.Monad.Writer.Class"
+ \ , "Control.Monad.Writer.Lazy"
+ \ , "Control.Monad.Writer.Strict"
+ \ , "Network.Multipart"
+ \ , "Network.Multipart.Header"
+ \ , "Network"
+ \ , "Network.BSD"
+ \ , "Network.Socket"
+ \ , "Network.Socket.ByteString"
+ \ , "Network.Socket.ByteString.Lazy"
+ \ , "Network.Socket.Internal"
+ \ , "Network.URI"
+ \ , "System.Locale"
+ \ , "System.Time"
+ \ , "Control.Parallel"
+ \ , "Control.Parallel.Strategies"
+ \ , "Control.Seq"
+ \ , "Text.Parsec"
+ \ , "Text.Parsec.ByteString"
+ \ , "Text.Parsec.ByteString.Lazy"
+ \ , "Text.Parsec.Char"
+ \ , "Text.Parsec.Combinator"
+ \ , "Text.Parsec.Error"
+ \ , "Text.Parsec.Expr"
+ \ , "Text.Parsec.Language"
+ \ , "Text.Parsec.Perm"
+ \ , "Text.Parsec.Pos"
+ \ , "Text.Parsec.Prim"
+ \ , "Text.Parsec.String"
+ \ , "Text.Parsec.Text"
+ \ , "Text.Parsec.Text.Lazy"
+ \ , "Text.Parsec.Token"
+ \ , "Text.ParserCombinators.Parsec"
+ \ , "Text.ParserCombinators.Parsec.Char"
+ \ , "Text.ParserCombinators.Parsec.Combinator"
+ \ , "Text.ParserCombinators.Parsec.Error"
+ \ , "Text.ParserCombinators.Parsec.Expr"
+ \ , "Text.ParserCombinators.Parsec.Language"
+ \ , "Text.ParserCombinators.Parsec.Perm"
+ \ , "Text.ParserCombinators.Parsec.Pos"
+ \ , "Text.ParserCombinators.Parsec.Prim"
+ \ , "Text.ParserCombinators.Parsec.Token"
+ \ , "Text.PrettyPrint"
+ \ , "Text.PrettyPrint.Annotated"
+ \ , "Text.PrettyPrint.Annotated.HughesPJ"
+ \ , "Text.PrettyPrint.Annotated.HughesPJClass"
+ \ , "Text.PrettyPrint.HughesPJ"
+ \ , "Text.PrettyPrint.HughesPJClass"
+ \ , "Control.Monad.Primitive"
+ \ , "Data.Primitive"
+ \ , "Data.Primitive.Addr"
+ \ , "Data.Primitive.Array"
+ \ , "Data.Primitive.ByteArray"
+ \ , "Data.Primitive.MVar"
+ \ , "Data.Primitive.MachDeps"
+ \ , "Data.Primitive.MutVar"
+ \ , "Data.Primitive.PrimArray"
+ \ , "Data.Primitive.Ptr"
+ \ , "Data.Primitive.SmallArray"
+ \ , "Data.Primitive.Types"
+ \ , "Data.Primitive.UnliftedArray"
+ \ , "System.Cmd"
+ \ , "System.Process"
+ \ , "System.Process.Internals"
+ \ , "System.Random"
+ \ , "Text.Regex.Base"
+ \ , "Text.Regex.Base.Context"
+ \ , "Text.Regex.Base.Impl"
+ \ , "Text.Regex.Base.RegexLike"
+ \ , "Text.Regex"
+ \ , "Text.Regex.Posix"
+ \ , "Text.Regex.Posix.ByteString"
+ \ , "Text.Regex.Posix.ByteString.Lazy"
+ \ , "Text.Regex.Posix.Sequence"
+ \ , "Text.Regex.Posix.String"
+ \ , "Text.Regex.Posix.Wrap"
+ \ , "Data.ByteString.Builder.Scientific"
+ \ , "Data.Scientific"
+ \ , "Data.Text.Lazy.Builder.Scientific"
+ \ , "Data.List.Split"
+ \ , "Data.List.Split.Internals"
+ \ , "Control.Concurrent.STM"
+ \ , "Control.Concurrent.STM.TArray"
+ \ , "Control.Concurrent.STM.TBQueue"
+ \ , "Control.Concurrent.STM.TChan"
+ \ , "Control.Concurrent.STM.TMVar"
+ \ , "Control.Concurrent.STM.TQueue"
+ \ , "Control.Concurrent.STM.TSem"
+ \ , "Control.Concurrent.STM.TVar"
+ \ , "Control.Monad.STM"
+ \ , "Data.Generics"
+ \ , "Data.Generics.Aliases"
+ \ , "Data.Generics.Basics"
+ \ , "Data.Generics.Builders"
+ \ , "Data.Generics.Instances"
+ \ , "Data.Generics.Schemes"
+ \ , "Data.Generics.Text"
+ \ , "Data.Generics.Twins"
+ \ , "Generics.SYB"
+ \ , "Generics.SYB.Aliases"
+ \ , "Generics.SYB.Basics"
+ \ , "Generics.SYB.Builders"
+ \ , "Generics.SYB.Instances"
+ \ , "Generics.SYB.Schemes"
+ \ , "Generics.SYB.Text"
+ \ , "Generics.SYB.Twins"
+ \ , "Language.Haskell.TH"
+ \ , "Language.Haskell.TH.LanguageExtensions"
+ \ , "Language.Haskell.TH.Lib"
+ \ , "Language.Haskell.TH.Lib.Internal"
+ \ , "Language.Haskell.TH.Ppr"
+ \ , "Language.Haskell.TH.PprLib"
+ \ , "Language.Haskell.TH.Quote"
+ \ , "Language.Haskell.TH.Syntax"
+ \ , "Data.Text"
+ \ , "Data.Text.Array"
+ \ , "Data.Text.Encoding"
+ \ , "Data.Text.Encoding.Error"
+ \ , "Data.Text.Foreign"
+ \ , "Data.Text.IO"
+ \ , "Data.Text.Internal"
+ \ , "Data.Text.Internal.Builder"
+ \ , "Data.Text.Internal.Builder.Functions"
+ \ , "Data.Text.Internal.Builder.Int.Digits"
+ \ , "Data.Text.Internal.Builder.RealFloat.Functions"
+ \ , "Data.Text.Internal.Encoding.Fusion"
+ \ , "Data.Text.Internal.Encoding.Fusion.Common"
+ \ , "Data.Text.Internal.Encoding.Utf16"
+ \ , "Data.Text.Internal.Encoding.Utf32"
+ \ , "Data.Text.Internal.Encoding.Utf8"
+ \ , "Data.Text.Internal.Functions"
+ \ , "Data.Text.Internal.Fusion"
+ \ , "Data.Text.Internal.Fusion.CaseMapping"
+ \ , "Data.Text.Internal.Fusion.Common"
+ \ , "Data.Text.Internal.Fusion.Size"
+ \ , "Data.Text.Internal.Fusion.Types"
+ \ , "Data.Text.Internal.IO"
+ \ , "Data.Text.Internal.Lazy"
+ \ , "Data.Text.Internal.Lazy.Encoding.Fusion"
+ \ , "Data.Text.Internal.Lazy.Fusion"
+ \ , "Data.Text.Internal.Lazy.Search"
+ \ , "Data.Text.Internal.Private"
+ \ , "Data.Text.Internal.Read"
+ \ , "Data.Text.Internal.Search"
+ \ , "Data.Text.Internal.Unsafe"
+ \ , "Data.Text.Internal.Unsafe.Char"
+ \ , "Data.Text.Internal.Unsafe.Shift"
+ \ , "Data.Text.Lazy"
+ \ , "Data.Text.Lazy.Builder"
+ \ , "Data.Text.Lazy.Builder.Int"
+ \ , "Data.Text.Lazy.Builder.RealFloat"
+ \ , "Data.Text.Lazy.Encoding"
+ \ , "Data.Text.Lazy.IO"
+ \ , "Data.Text.Lazy.Internal"
+ \ , "Data.Text.Lazy.Read"
+ \ , "Data.Text.Read"
+ \ , "Data.Text.Unsafe"
+ \ , "System.Random.TF"
+ \ , "System.Random.TF.Gen"
+ \ , "System.Random.TF.Init"
+ \ , "System.Random.TF.Instances"
+ \ , "Data.Time"
+ \ , "Data.Time.Calendar"
+ \ , "Data.Time.Calendar.Easter"
+ \ , "Data.Time.Calendar.Julian"
+ \ , "Data.Time.Calendar.MonthDay"
+ \ , "Data.Time.Calendar.OrdinalDate"
+ \ , "Data.Time.Calendar.WeekDate"
+ \ , "Data.Time.Clock"
+ \ , "Data.Time.Clock.POSIX"
+ \ , "Data.Time.Clock.System"
+ \ , "Data.Time.Clock.TAI"
+ \ , "Data.Time.Format"
+ \ , "Data.Time.LocalTime"
+ \ , "Control.Applicative.Backwards"
+ \ , "Control.Applicative.Lift"
+ \ , "Control.Monad.Signatures"
+ \ , "Control.Monad.Trans.Accum"
+ \ , "Control.Monad.Trans.Class"
+ \ , "Control.Monad.Trans.Cont"
+ \ , "Control.Monad.Trans.Error"
+ \ , "Control.Monad.Trans.Except"
+ \ , "Control.Monad.Trans.Identity"
+ \ , "Control.Monad.Trans.List"
+ \ , "Control.Monad.Trans.Maybe"
+ \ , "Control.Monad.Trans.RWS"
+ \ , "Control.Monad.Trans.RWS.Lazy"
+ \ , "Control.Monad.Trans.RWS.Strict"
+ \ , "Control.Monad.Trans.Reader"
+ \ , "Control.Monad.Trans.Select"
+ \ , "Control.Monad.Trans.State"
+ \ , "Control.Monad.Trans.State.Lazy"
+ \ , "Control.Monad.Trans.State.Strict"
+ \ , "Control.Monad.Trans.Writer"
+ \ , "Control.Monad.Trans.Writer.Lazy"
+ \ , "Control.Monad.Trans.Writer.Strict"
+ \ , "Data.Functor.Constant"
+ \ , "Data.Functor.Reverse"
+ \ , "Control.Monad.Trans.Instances"
+ \ , "Data.Functor.Classes.Generic"
+ \ , "Data.Functor.Classes.Generic.Internal"
+ \ , "System.Posix"
+ \ , "System.Posix.ByteString"
+ \ , "System.Posix.ByteString.FilePath"
+ \ , "System.Posix.Directory"
+ \ , "System.Posix.Directory.ByteString"
+ \ , "System.Posix.DynamicLinker"
+ \ , "System.Posix.DynamicLinker.ByteString"
+ \ , "System.Posix.DynamicLinker.Module"
+ \ , "System.Posix.DynamicLinker.Module.ByteString"
+ \ , "System.Posix.DynamicLinker.Prim"
+ \ , "System.Posix.Env"
+ \ , "System.Posix.Env.ByteString"
+ \ , "System.Posix.Error"
+ \ , "System.Posix.Fcntl"
+ \ , "System.Posix.Files"
+ \ , "System.Posix.Files.ByteString"
+ \ , "System.Posix.IO"
+ \ , "System.Posix.IO.ByteString"
+ \ , "System.Posix.Process"
+ \ , "System.Posix.Process.ByteString"
+ \ , "System.Posix.Process.Internals"
+ \ , "System.Posix.Resource"
+ \ , "System.Posix.Semaphore"
+ \ , "System.Posix.SharedMem"
+ \ , "System.Posix.Signals"
+ \ , "System.Posix.Signals.Exts"
+ \ , "System.Posix.Temp"
+ \ , "System.Posix.Temp.ByteString"
+ \ , "System.Posix.Terminal"
+ \ , "System.Posix.Terminal.ByteString"
+ \ , "System.Posix.Time"
+ \ , "System.Posix.Unistd"
+ \ , "System.Posix.User"
+ \ , "Data.HashMap.Lazy"
+ \ , "Data.HashMap.Strict"
+ \ , "Data.HashSet"
+ \ , "Data.Vector"
+ \ , "Data.Vector.Fusion.Bundle"
+ \ , "Data.Vector.Fusion.Bundle.Monadic"
+ \ , "Data.Vector.Fusion.Bundle.Size"
+ \ , "Data.Vector.Fusion.Stream.Monadic"
+ \ , "Data.Vector.Fusion.Util"
+ \ , "Data.Vector.Generic"
+ \ , "Data.Vector.Generic.Base"
+ \ , "Data.Vector.Generic.Mutable"
+ \ , "Data.Vector.Generic.Mutable.Base"
+ \ , "Data.Vector.Generic.New"
+ \ , "Data.Vector.Internal.Check"
+ \ , "Data.Vector.Mutable"
+ \ , "Data.Vector.Primitive"
+ \ , "Data.Vector.Primitive.Mutable"
+ \ , "Data.Vector.Storable"
+ \ , "Data.Vector.Storable.Internal"
+ \ , "Data.Vector.Storable.Mutable"
+ \ , "Data.Vector.Unboxed"
+ \ , "Data.Vector.Unboxed.Base"
+ \ , "Data.Vector.Unboxed.Mutable"
+ \ , "Text.XHtml"
+ \ , "Text.XHtml.Debug"
+ \ , "Text.XHtml.Frameset"
+ \ , "Text.XHtml.Strict"
+ \ , "Text.XHtml.Table"
+ \ , "Text.XHtml.Transitional"
+ \ , "Codec.Compression.GZip"
+ \ , "Codec.Compression.Zlib"
+ \ , "Codec.Compression.Zlib.Internal"
+ \ , "Codec.Compression.Zlib.Raw"
+ \ , "Web.Spock"
+ \ , "Web.Spock.Config"
+ \ , "Web.Spock.Internal.SessionManager"
+ \ , "Web.Spock.Internal.SessionVault"
+ \ , "Web.Spock.SessionActions"
+ \ , "Web.Spock.Api"
+ \ , "Web.Spock.Auth"
+ \ , "Web.Spock.Action"
+ \ , "Web.Spock.Core"
+ \ , "Web.Spock.Internal.Cookies"
+ \ , "Web.Spock.Internal.Util"
+ \ , "Web.Spock.Routing"
+ \ , "Web.Spock.Digestive"
+ \ , "Database.Esqueleto"
+ \ , "Database.Esqueleto.Internal.Language"
+ \ , "Database.Esqueleto.Internal.Sql"
+ \ , "Database.Esqueleto.PostgreSQL"
+ \ , "Database.Persist"
+ \ , "Database.Persist.Class"
+ \ , "Database.Persist.Quasi"
+ \ , "Database.Persist.Sql"
+ \ , "Database.Persist.Sql.Types.Internal"
+ \ , "Database.Persist.Sql.Util"
+ \ , "Database.Persist.Types"
+ \ , "Database.Persist.MySQL"
+ \ , "Database.Persist.Postgresql"
+ \ , "Database.Persist.Postgresql.JSON"
+ \ , "Database.Persist.Redis"
+ \ , "Database.Persist.Sqlite"
+ \ , "Database.Sqlite"
+ \ , "Servant.API"
+ \ , "Servant.API.Alternative"
+ \ , "Servant.API.BasicAuth"
+ \ , "Servant.API.Capture"
+ \ , "Servant.API.ContentTypes"
+ \ , "Servant.API.Description"
+ \ , "Servant.API.Empty"
+ \ , "Servant.API.Experimental.Auth"
+ \ , "Servant.API.Generic"
+ \ , "Servant.API.Header"
+ \ , "Servant.API.HttpVersion"
+ \ , "Servant.API.Internal.Test.ComprehensiveAPI"
+ \ , "Servant.API.IsSecure"
+ \ , "Servant.API.Modifiers"
+ \ , "Servant.API.QueryParam"
+ \ , "Servant.API.Raw"
+ \ , "Servant.API.RemoteHost"
+ \ , "Servant.API.ReqBody"
+ \ , "Servant.API.ResponseHeaders"
+ \ , "Servant.API.Stream"
+ \ , "Servant.API.Sub"
+ \ , "Servant.API.TypeLevel"
+ \ , "Servant.API.Vault"
+ \ , "Servant.API.Verbs"
+ \ , "Servant.API.WithNamedContext"
+ \ , "Servant.Links"
+ \ , "Servant.Utils.Enter"
+ \ , "Servant.Utils.Links"
+ \ , "Servant.Auth"
+ \ , "Servant.Client"
+ \ , "Servant.Client.Internal.HttpClient"
+ \ , "Servant"
+ \ , "Servant.Server"
+ \ , "Servant.Server.Experimental.Auth"
+ \ , "Servant.Server.Generic"
+ \ , "Servant.Server.Internal"
+ \ , "Servant.Server.Internal.BasicAuth"
+ \ , "Servant.Server.Internal.Context"
+ \ , "Servant.Server.Internal.Handler"
+ \ , "Servant.Server.Internal.Router"
+ \ , "Servant.Server.Internal.RoutingApplication"
+ \ , "Servant.Server.Internal.ServantErr"
+ \ , "Servant.Server.StaticFiles"
+ \ , "Servant.Utils.StaticFiles"
+ \ ]
diff --git a/runtime/autoload/health.vim b/runtime/autoload/health.vim
index dc362577a6..56ae2071e9 100644
--- a/runtime/autoload/health.vim
+++ b/runtime/autoload/health.vim
@@ -1,433 +1,177 @@
-function! s:trim(s) abort
- return substitute(a:s, '^\_s*\|\_s*$', '', 'g')
-endfunction
-
+function! s:enhance_syntax() abort
+ syntax case match
-" Simple version comparison.
-function! s:version_cmp(a, b) abort
- let a = split(a:a, '\.')
- let b = split(a:b, '\.')
-
- for i in range(len(a))
- if a[i] > b[i]
- return 1
- elseif a[i] < b[i]
- return -1
- endif
- endfor
-
- return 0
-endfunction
+ syntax keyword healthError ERROR[:]
+ \ containedin=markdownCodeBlock,mkdListItemLine
+ highlight default link healthError Error
+ syntax keyword healthWarning WARNING[:]
+ \ containedin=markdownCodeBlock,mkdListItemLine
+ highlight default link healthWarning WarningMsg
-" Fetch the contents of a URL.
-function! s:download(url) abort
- let content = ''
- if executable('curl')
- let content = system('curl -sL "'.a:url.'"')
- endif
+ syntax keyword healthSuccess OK[:]
+ \ containedin=markdownCodeBlock,mkdListItemLine
+ highlight default healthSuccess guibg=#5fff00 guifg=#080808 ctermbg=82 ctermfg=232
- if empty(content) && executable('python')
- let script = "
- \try:\n
- \ from urllib.request import urlopen\n
- \except ImportError:\n
- \ from urllib2 import urlopen\n
- \\n
- \try:\n
- \ response = urlopen('".a:url."')\n
- \ print(response.read().decode('utf8'))\n
- \except Exception:\n
- \ pass\n
- \"
- let content = system('python -c "'.script.'" 2>/dev/null')
- endif
+ syntax match healthHelp "|.\{-}|" contains=healthBar
+ \ containedin=markdownCodeBlock,mkdListItemLine
+ syntax match healthBar "|" contained conceal
+ highlight default link healthHelp Identifier
- return content
+ " We do not care about markdown syntax errors in :checkhealth output.
+ highlight! link markdownError Normal
endfunction
-
-" Get the latest Neovim Python client version from PyPI. The result is
-" cached.
-function! s:latest_pypi_version()
- if exists('s:pypi_version')
- return s:pypi_version
- endif
-
- let s:pypi_version = 'unknown'
- let pypi_info = s:download('https://pypi.python.org/pypi/neovim/json')
- if !empty(pypi_info)
- let pypi_data = json_decode(pypi_info)
- let s:pypi_version = get(get(pypi_data, 'info', {}), 'version', 'unknown')
- return s:pypi_version
- endif
-endfunction
-
-
-" Get version information using the specified interpreter. The interpreter is
-" used directly in case breaking changes were introduced since the last time
-" Neovim's Python client was updated.
-function! s:version_info(python) abort
- let pypi_version = s:latest_pypi_version()
- let python_version = s:trim(system(
- \ printf('"%s" -c "import sys; print(''.''.join(str(x) '
- \ . 'for x in sys.version_info[:3]))"', a:python)))
- if empty(python_version)
- let python_version = 'unknown'
- endif
-
- let nvim_path = s:trim(system(printf('"%s" -c "import sys, neovim;'
- \ . 'print(neovim.__file__)" 2>/dev/null', a:python)))
- if empty(nvim_path)
- return [python_version, 'not found', pypi_version, 'unknown']
- endif
-
- let nvim_version = 'unknown'
- let base = fnamemodify(nvim_path, ':h')
- for meta in glob(base.'-*/METADATA', 1, 1) + glob(base.'-*/PKG-INFO', 1, 1)
- for meta_line in readfile(meta)
- if meta_line =~# '^Version:'
- let nvim_version = matchstr(meta_line, '^Version: \zs\S\+')
- endif
+" Runs the specified healthchecks.
+" Runs all discovered healthchecks if a:plugin_names is empty.
+function! health#check(plugin_names) abort
+ let healthchecks = empty(a:plugin_names)
+ \ ? s:discover_health_checks()
+ \ : s:to_fn_names(a:plugin_names)
+
+ tabnew
+ setlocal wrap breakindent
+ setlocal filetype=markdown
+ setlocal conceallevel=2 concealcursor=nc
+ setlocal keywordprg=:help
+ let &l:iskeyword='!-~,^*,^|,^",192-255'
+ call s:enhance_syntax()
+
+ if empty(healthchecks)
+ call setline(1, 'ERROR: No healthchecks found.')
+ else
+ redraw|echo 'Running healthchecks...'
+ for c in healthchecks
+ let output = ''
+ call append('$', split(printf("\n%s\n%s", c, repeat('=',72)), "\n"))
+ try
+ let output = "\n\n".execute('call '.c.'()')
+ catch
+ if v:exception =~# '^Vim\%((\a\+)\)\=:E117.*\V'.c
+ let output = execute(
+ \ 'call health#report_error(''No healthcheck found for "'
+ \ .s:to_plugin_name(c)
+ \ .'" plugin.'')')
+ else
+ let output = execute(
+ \ 'call health#report_error(''Failed to run healthcheck for "'
+ \ .s:to_plugin_name(c)
+ \ .'" plugin. Exception:''."\n".v:throwpoint."\n".v:exception)')
+ endif
+ endtry
+ call append('$', split(output, "\n") + [''])
+ redraw
endfor
- endfor
-
- let version_status = 'unknown'
- if nvim_version != 'unknown' && pypi_version != 'unknown'
- if s:version_cmp(nvim_version, pypi_version) == -1
- let version_status = 'outdated'
- else
- let version_status = 'up to date'
- endif
endif
- return [python_version, nvim_version, pypi_version, version_status]
+ " needed for plasticboy/vim-markdown, because it uses fdm=expr
+ normal! zR
+ setlocal nomodified
+ setlocal bufhidden=hide
+ redraw|echo ''
endfunction
-
-" Check the Python interpreter's usability.
-function! s:check_bin(bin, notes) abort
- if !filereadable(a:bin)
- call add(a:notes, printf('Error: "%s" was not found.', a:bin))
- return 0
- elseif executable(a:bin) != 1
- call add(a:notes, printf('Error: "%s" is not executable.', a:bin))
- return 0
- endif
- return 1
+" Starts a new report.
+function! health#report_start(name) abort
+ echo "\n## " . a:name
endfunction
-
-" Text wrapping that returns a list of lines
-function! s:textwrap(text, width) abort
- let pattern = '.*\%(\s\+\|\_$\)\zs\%<'.a:width.'c'
- return map(split(a:text, pattern), 's:trim(v:val)')
-endfunction
-
-
-" Echo wrapped notes
-function! s:echo_notes(notes) abort
- if empty(a:notes)
- return
+" Indents lines *except* line 1 of a string if it contains newlines.
+function! s:indent_after_line1(s, columns) abort
+ let lines = split(a:s, "\n", 0)
+ if len(lines) < 2 " We do not indent line 1, so nothing to do.
+ return a:s
endif
-
- echo ' Messages:'
- for msg in a:notes
- if msg =~# "\n"
- let msg_lines = []
- for msgl in filter(split(msg, "\n"), 'v:val !~# ''^\s*$''')
- call extend(msg_lines, s:textwrap(msgl, 74))
- endfor
- else
- let msg_lines = s:textwrap(msg, 74)
- endif
-
- if !len(msg_lines)
- continue
- endif
- echo ' *' msg_lines[0]
- if len(msg_lines) > 1
- echo join(map(msg_lines[1:], '" ".v:val'), "\n")
- endif
+ for i in range(1, len(lines)-1) " Indent lines after the first.
+ let lines[i] = substitute(lines[i], '^\s*', repeat(' ', a:columns), 'g')
endfor
+ return join(lines, "\n")
endfunction
-
-" Load the remote plugin manifest file and check for unregistered plugins
-function! s:diagnose_manifest() abort
- echo 'Checking: Remote Plugins'
- let existing_rplugins = {}
-
- for item in remote#host#PluginsForHost('python')
- let existing_rplugins[item.path] = 'python'
- endfor
-
- for item in remote#host#PluginsForHost('python3')
- let existing_rplugins[item.path] = 'python3'
- endfor
-
- let require_update = 0
- let notes = []
-
- for path in map(split(&rtp, ','), 'resolve(v:val)')
- let python_glob = glob(path.'/rplugin/python*', 1, 1)
- if empty(python_glob)
- continue
- endif
-
- let python_dir = python_glob[0]
- let python_version = fnamemodify(python_dir, ':t')
-
- for script in glob(python_dir.'/*.py', 1, 1)
- \ + glob(python_dir.'/*/__init__.py', 1, 1)
- let contents = join(readfile(script))
- if contents =~# '\<\%(from\|import\)\s\+neovim\>'
- if script =~# '/__init__\.py$'
- let script = fnamemodify(script, ':h')
- endif
-
- if !has_key(existing_rplugins, script)
- let msg = printf('"%s" is not registered.', fnamemodify(path, ':t'))
- if python_version == 'pythonx'
- if !has('python2') && !has('python3')
- let msg .= ' (python2 and python3 not available)'
- endif
- elseif !has(python_version)
- let msg .= printf(' (%s not available)', python_version)
- else
- let require_update = 1
- endif
-
- call add(notes, msg)
- endif
-
- break
- endif
- endfor
- endfor
-
- echo ' Status: '
- if require_update
- echon 'Out of date'
- call add(notes, 'Run :UpdateRemotePlugins')
- else
- echon 'Up to date'
- endif
-
- call s:echo_notes(notes)
+" Changes ':h clipboard' to ':help |clipboard|'.
+function! s:help_to_link(s) abort
+ return substitute(a:s, '\v:h%[elp] ([^|][^"\r\n ]+)', ':help |\1|', 'g')
endfunction
+" Format a message for a specific report item.
+" a:1: Optional advice (string or list)
+function! s:format_report_message(status, msg, ...) abort " {{{
+ let output = ' - ' . a:status . ': ' . s:indent_after_line1(a:msg, 4)
-function! s:diagnose_python(version) abort
- let python_bin_name = 'python'.(a:version == 2 ? '' : '3')
- let pyenv = resolve(exepath('pyenv'))
- let pyenv_root = exists('$PYENV_ROOT') ? resolve($PYENV_ROOT) : ''
- let venv = exists('$VIRTUAL_ENV') ? resolve($VIRTUAL_ENV) : ''
- let host_prog_var = python_bin_name.'_host_prog'
- let host_skip_var = python_bin_name.'_host_skip_check'
- let python_bin = ''
- let python_multiple = []
- let notes = []
-
- if exists('g:'.host_prog_var)
- call add(notes, printf('Using: g:%s = "%s"', host_prog_var, get(g:, host_prog_var)))
- endif
-
- let [python_bin_name, pythonx_errs] = provider#pythonx#Detect(a:version)
- if empty(python_bin_name)
- call add(notes, 'Warning: No Python interpreter was found with the neovim '
- \ . 'module. Using the first available for diagnostics.')
- if !empty(pythonx_errs)
- call add(notes, pythonx_errs)
- endif
- let old_skip = get(g:, host_skip_var, 0)
- let g:[host_skip_var] = 1
- let [python_bin_name, pythonx_errs] = provider#pythonx#Detect(a:version)
- let g:[host_skip_var] = old_skip
- endif
-
- if !empty(python_bin_name)
- if exists('g:'.host_prog_var)
- let python_bin = exepath(python_bin_name)
+ " Optional parameters
+ if a:0 > 0
+ let advice = type(a:1) == type('') ? [a:1] : a:1
+ if type(advice) != type([])
+ throw 'a:1: expected String or List'
endif
- let python_bin_name = fnamemodify(python_bin_name, ':t')
- endif
-
- if !empty(pythonx_errs)
- call add(notes, pythonx_errs)
- endif
-
- if !empty(python_bin_name) && empty(python_bin) && empty(pythonx_errs)
- if !exists('g:'.host_prog_var)
- call add(notes, printf('Warning: "g:%s" is not set. Searching for '
- \ . '%s in the environment.', host_prog_var, python_bin_name))
- endif
-
- if !empty(pyenv)
- if empty(pyenv_root)
- call add(notes, 'Warning: pyenv was found, but $PYENV_ROOT '
- \ . 'is not set. Did you follow the final install '
- \ . 'instructions?')
- else
- call add(notes, printf('Notice: pyenv found: "%s"', pyenv))
- endif
-
- let python_bin = s:trim(system(
- \ printf('"%s" which %s 2>/dev/null', pyenv, python_bin_name)))
-
- if empty(python_bin)
- call add(notes, printf('Warning: pyenv couldn''t find %s.', python_bin_name))
- endif
- endif
-
- if empty(python_bin)
- let python_bin = exepath(python_bin_name)
-
- if exists('$PATH')
- for path in split($PATH, ':')
- let path_bin = path.'/'.python_bin_name
- if path_bin != python_bin && index(python_multiple, path_bin) == -1
- \ && executable(path_bin)
- call add(python_multiple, path_bin)
- endif
- endfor
-
- if len(python_multiple)
- " This is worth noting since the user may install something
- " that changes $PATH, like homebrew.
- call add(notes, printf('Suggestion: There are multiple %s executables found. '
- \ . 'Set "g:%s" to avoid surprises.', python_bin_name, host_prog_var))
- endif
-
- if python_bin =~# '\<shims\>'
- call add(notes, printf('Warning: "%s" appears to be a pyenv shim. '
- \ . 'This could mean that a) the "pyenv" executable is not in '
- \ . '$PATH, b) your pyenv installation is broken. '
- \ . 'You should set "g:%s" to avoid surprises.',
- \ python_bin, host_prog_var))
- endif
- endif
- endif
- endif
- if !empty(python_bin)
- if !empty(pyenv) && !exists('g:'.host_prog_var) && !empty(pyenv_root)
- \ && resolve(python_bin) !~# '^'.pyenv_root.'/'
- call add(notes, printf('Suggestion: Create a virtualenv specifically '
- \ . 'for Neovim using pyenv and use "g:%s". This will avoid '
- \ . 'the need to install Neovim''s Python client in each '
- \ . 'version/virtualenv.', host_prog_var))
- endif
-
- if !empty(venv) && exists('g:'.host_prog_var)
- if !empty(pyenv_root)
- let venv_root = pyenv_root
- else
- let venv_root = fnamemodify(venv, ':h')
- endif
-
- if resolve(python_bin) !~# '^'.venv_root.'/'
- call add(notes, printf('Suggestion: Create a virtualenv specifically '
- \ . 'for Neovim and use "g:%s". This will avoid '
- \ . 'the need to install Neovim''s Python client in each '
- \ . 'virtualenv.', host_prog_var))
- endif
+ " Report each suggestion
+ if !empty(advice)
+ let output .= "\n - ADVICE:"
+ for suggestion in advice
+ let output .= "\n - " . s:indent_after_line1(suggestion, 10)
+ endfor
endif
endif
- if empty(python_bin) && !empty(python_bin_name)
- " An error message should have already printed.
- call add(notes, printf('Error: "%s" was not found.', python_bin_name))
- elseif !empty(python_bin) && !s:check_bin(python_bin, notes)
- let python_bin = ''
- endif
+ return s:help_to_link(output)
+endfunction " }}}
- " Check if $VIRTUAL_ENV is active
- let virtualenv_inactive = 0
+" Use {msg} to report information in the current section
+function! health#report_info(msg) abort " {{{
+ echo s:format_report_message('INFO', a:msg)
+endfunction " }}}
- if exists('$VIRTUAL_ENV')
- if !empty(pyenv)
- let pyenv_prefix = resolve(s:trim(system(printf('"%s" prefix', pyenv))))
- if $VIRTUAL_ENV != pyenv_prefix
- let virtualenv_inactive = 1
- endif
- elseif !empty(python_bin_name) && exepath(python_bin_name) !~# '^'.$VIRTUAL_ENV.'/'
- let virtualenv_inactive = 1
- endif
- endif
+" Reports a successful healthcheck.
+function! health#report_ok(msg) abort " {{{
+ echo s:format_report_message('OK', a:msg)
+endfunction " }}}
- if virtualenv_inactive
- call add(notes, 'Warning: $VIRTUAL_ENV exists but appears to be '
- \ . 'inactive. This could lead to unexpected results. If you are '
- \ . 'using Zsh, see: http://vi.stackexchange.com/a/7654/5229')
- endif
-
- " Diagnostic output
- echo 'Checking: Python' a:version
- echo ' Executable:' (empty(python_bin) ? 'Not found' : python_bin)
- if len(python_multiple)
- for path_bin in python_multiple
- echo ' (other):' path_bin
- endfor
+" Reports a health warning.
+" a:1: Optional advice (string or list)
+function! health#report_warn(msg, ...) abort " {{{
+ if a:0 > 0
+ echo s:format_report_message('WARNING', a:msg, a:1)
+ else
+ echo s:format_report_message('WARNING', a:msg)
endif
+endfunction " }}}
- if !empty(python_bin)
- let [pyversion, current, latest, status] = s:version_info(python_bin)
- if a:version != str2nr(pyversion)
- call add(notes, 'Warning: Got an unexpected version of Python. '
- \ . 'This could lead to confusing error messages. Please '
- \ . 'consider this before reporting bugs to plugin developers.')
- endif
- if a:version == 3 && str2float(pyversion) < 3.3
- call add(notes, 'Warning: Python 3.3+ is recommended.')
- endif
-
- echo ' Python Version:' pyversion
- echo printf(' %s-neovim Version: %s', python_bin_name, current)
-
- if current == 'not found'
- call add(notes, 'Error: Neovim Python client is not installed.')
- endif
-
- if latest == 'unknown'
- call add(notes, 'Warning: Unable to fetch latest Neovim Python client version.')
- endif
-
- if status == 'outdated'
- echon ' (latest: '.latest.')'
- else
- echon ' ('.status.')'
- endif
+" Reports a failed healthcheck.
+" a:1: Optional advice (string or list)
+function! health#report_error(msg, ...) abort " {{{
+ if a:0 > 0
+ echo s:format_report_message('ERROR', a:msg, a:1)
+ else
+ echo s:format_report_message('ERROR', a:msg)
endif
+endfunction " }}}
- call s:echo_notes(notes)
+function! s:filepath_to_function(name) abort
+ return substitute(substitute(substitute(a:name, '.*autoload[\/]', '', ''),
+ \ '\.vim', '#check', ''), '[\/]', '#', 'g')
endfunction
+function! s:discover_health_checks() abort
+ let healthchecks = globpath(&runtimepath, 'autoload/health/*.vim', 1, 1)
+ let healthchecks = map(healthchecks, '<SID>filepath_to_function(v:val)')
+ return healthchecks
+endfunction
-function! health#check(bang) abort
- redir => report
- try
- silent call s:diagnose_python(2)
- silent echo ''
- silent call s:diagnose_python(3)
- silent echo ''
- silent call s:diagnose_manifest()
- silent echo ''
- finally
- redir END
- endtry
+" Translates a list of plugin names to healthcheck function names.
+function! s:to_fn_names(plugin_names) abort
+ let healthchecks = []
+ let plugin_names = type('') ==# type(a:plugin_names)
+ \ ? split(a:plugin_names, '', v:false)
+ \ : a:plugin_names
+ for p in plugin_names
+ call add(healthchecks, 'health#'.p.'#check')
+ endfor
+ return healthchecks
+endfunction
- if a:bang
- new
- setlocal bufhidden=wipe
- call setline(1, split(report, "\n"))
- setlocal nomodified
- else
- echo report
- echo "\nTip: Use "
- echohl Identifier
- echon ":CheckHealth!"
- echohl None
- echon " to open this in a new buffer."
- endif
+" Extracts 'foo' from 'health#foo#check'.
+function! s:to_plugin_name(fn_name) abort
+ return substitute(a:fn_name,
+ \ '\v.*health\#(.+)\#check.*', '\1', '')
endfunction
diff --git a/runtime/autoload/health/nvim.vim b/runtime/autoload/health/nvim.vim
new file mode 100644
index 0000000000..93660d05dc
--- /dev/null
+++ b/runtime/autoload/health/nvim.vim
@@ -0,0 +1,197 @@
+let s:suggest_faq = 'https://github.com/neovim/neovim/wiki/FAQ'
+
+function! s:check_config() abort
+ let ok = v:true
+ call health#report_start('Configuration')
+
+ let vimrc = empty($MYVIMRC) ? stdpath('config').'/init.vim' : $MYVIMRC
+ if !filereadable(vimrc)
+ let ok = v:false
+ let has_vim = filereadable(expand('~/.vimrc'))
+ call health#report_warn('Missing user config file: '.vimrc,
+ \[ has_vim ? ':help nvim-from-vim' : ':help init.vim' ])
+ endif
+
+ " If $VIM is empty we don't care. Else make sure it is valid.
+ if !empty($VIM) && !filereadable($VIM.'/runtime/doc/nvim.txt')
+ let ok = v:false
+ call health#report_error('$VIM is invalid: '.$VIM)
+ endif
+
+ if exists('$NVIM_TUI_ENABLE_CURSOR_SHAPE')
+ let ok = v:false
+ call health#report_warn('$NVIM_TUI_ENABLE_CURSOR_SHAPE is ignored in Nvim 0.2+',
+ \ [ "Use the 'guicursor' option to configure cursor shape. :help 'guicursor'",
+ \ 'https://github.com/neovim/neovim/wiki/Following-HEAD#20170402' ])
+ endif
+
+ if &paste
+ let ok = v:false
+ call health#report_error("'paste' is enabled. This option is only for pasting text.\nIt should not be set in your config.",
+ \ [ 'Remove `set paste` from your init.vim, if applicable.',
+ \ 'Check `:verbose set paste?` to see if a plugin or script set the option.', ])
+ endif
+
+ if ok
+ call health#report_ok('no issues found')
+ endif
+endfunction
+
+" Load the remote plugin manifest file and check for unregistered plugins
+function! s:check_rplugin_manifest() abort
+ call health#report_start('Remote Plugins')
+ let existing_rplugins = {}
+
+ for item in remote#host#PluginsForHost('python')
+ let existing_rplugins[item.path] = 'python'
+ endfor
+
+ for item in remote#host#PluginsForHost('python3')
+ let existing_rplugins[item.path] = 'python3'
+ endfor
+
+ let require_update = 0
+
+ for path in map(split(&runtimepath, ','), 'resolve(v:val)')
+ let python_glob = glob(path.'/rplugin/python*', 1, 1)
+ if empty(python_glob)
+ continue
+ endif
+
+ let python_dir = python_glob[0]
+ let python_version = fnamemodify(python_dir, ':t')
+
+ for script in glob(python_dir.'/*.py', 1, 1)
+ \ + glob(python_dir.'/*/__init__.py', 1, 1)
+ let contents = join(readfile(script))
+ if contents =~# '\<\%(from\|import\)\s\+neovim\>'
+ if script =~# '[\/]__init__\.py$'
+ let script = tr(fnamemodify(script, ':h'), '\', '/')
+ endif
+
+ if !has_key(existing_rplugins, script)
+ let msg = printf('"%s" is not registered.', fnamemodify(path, ':t'))
+ if python_version ==# 'pythonx'
+ if !has('python2') && !has('python3')
+ let msg .= ' (python2 and python3 not available)'
+ endif
+ elseif !has(python_version)
+ let msg .= printf(' (%s not available)', python_version)
+ else
+ let require_update = 1
+ endif
+
+ call health#report_warn(msg)
+ endif
+
+ break
+ endif
+ endfor
+ endfor
+
+ if require_update
+ call health#report_warn('Out of date', ['Run `:UpdateRemotePlugins`'])
+ else
+ call health#report_ok('Up to date')
+ endif
+endfunction
+
+function! s:check_performance() abort
+ call health#report_start('Performance')
+
+ " check buildtype
+ let buildtype = matchstr(execute('version'), '\v\cbuild type:?\s*[^\n\r\t ]+')
+ if empty(buildtype)
+ call health#report_error('failed to get build type from :version')
+ elseif buildtype =~# '\v(MinSizeRel|Release|RelWithDebInfo)'
+ call health#report_ok(buildtype)
+ else
+ call health#report_info(buildtype)
+ call health#report_warn(
+ \ 'Non-optimized build-type. Nvim will be slower.',
+ \ ['Install a different Nvim package, or rebuild with `CMAKE_BUILD_TYPE=RelWithDebInfo`.',
+ \ s:suggest_faq])
+ endif
+endfunction
+
+function! s:check_tmux() abort
+ if empty($TMUX) || !executable('tmux')
+ return
+ endif
+ call health#report_start('tmux')
+
+ " check escape-time
+ let suggestions = ["Set escape-time in ~/.tmux.conf:\nset-option -sg escape-time 10",
+ \ s:suggest_faq]
+ let cmd = 'tmux show-option -qvgs escape-time'
+ let out = system(cmd)
+ let tmux_esc_time = substitute(out, '\v(\s|\r|\n)', '', 'g')
+ if v:shell_error
+ call health#report_error('command failed: '.cmd."\n".out)
+ elseif empty(tmux_esc_time)
+ call health#report_error('escape-time is not set', suggestions)
+ elseif tmux_esc_time > 300
+ call health#report_error(
+ \ 'escape-time ('.tmux_esc_time.') is higher than 300ms', suggestions)
+ else
+ call health#report_ok('escape-time: '.tmux_esc_time.'ms')
+ endif
+
+ " check default-terminal and $TERM
+ call health#report_info('$TERM: '.$TERM)
+ let cmd = 'tmux show-option -qvg default-terminal'
+ let out = system(cmd)
+ let tmux_default_term = substitute(out, '\v(\s|\r|\n)', '', 'g')
+ if empty(tmux_default_term)
+ let cmd = 'tmux show-option -qvgs default-terminal'
+ let out = system(cmd)
+ let tmux_default_term = substitute(out, '\v(\s|\r|\n)', '', 'g')
+ endif
+
+ if v:shell_error
+ call health#report_error('command failed: '.cmd."\n".out)
+ elseif tmux_default_term !=# $TERM
+ call health#report_info('default-terminal: '.tmux_default_term)
+ call health#report_error(
+ \ '$TERM differs from the tmux `default-terminal` setting. Colors might look wrong.',
+ \ ['$TERM may have been set by some rc (.bashrc, .zshrc, ...).'])
+ elseif $TERM !~# '\v(tmux-256color|screen-256color)'
+ call health#report_error(
+ \ '$TERM should be "screen-256color" or "tmux-256color" in tmux. Colors might look wrong.',
+ \ ["Set default-terminal in ~/.tmux.conf:\nset-option -g default-terminal \"screen-256color\"",
+ \ s:suggest_faq])
+ endif
+endfunction
+
+function! s:check_terminal() abort
+ if !executable('infocmp')
+ return
+ endif
+ call health#report_start('terminal')
+ let cmd = 'infocmp -L'
+ let out = system(cmd)
+ let kbs_entry = matchstr(out, 'key_backspace=[^,[:space:]]*')
+ let kdch1_entry = matchstr(out, 'key_dc=[^,[:space:]]*')
+
+ if v:shell_error
+ call health#report_error('command failed: '.cmd."\n".out)
+ else
+ call health#report_info('key_backspace (kbs) terminfo entry: '
+ \ .(empty(kbs_entry) ? '? (not found)' : kbs_entry))
+ call health#report_info('key_dc (kdch1) terminfo entry: '
+ \ .(empty(kbs_entry) ? '? (not found)' : kdch1_entry))
+ endif
+ for env_var in ['XTERM_VERSION', 'VTE_VERSION', 'TERM_PROGRAM', 'COLORTERM', 'SSH_TTY']
+ if exists('$'.env_var)
+ call health#report_info(printf("$%s='%s'", env_var, eval('$'.env_var)))
+ endif
+ endfor
+endfunction
+
+function! health#nvim#check() abort
+ call s:check_config()
+ call s:check_performance()
+ call s:check_rplugin_manifest()
+ call s:check_terminal()
+ call s:check_tmux()
+endfunction
diff --git a/runtime/autoload/health/provider.vim b/runtime/autoload/health/provider.vim
new file mode 100644
index 0000000000..8f364a2ace
--- /dev/null
+++ b/runtime/autoload/health/provider.vim
@@ -0,0 +1,605 @@
+let s:shell_error = 0
+
+function! s:is_bad_response(s) abort
+ return a:s =~? '\v(^unable)|(^error)|(^outdated)'
+endfunction
+
+function! s:trim(s) abort
+ return substitute(a:s, '^\_s*\|\_s*$', '', 'g')
+endfunction
+
+" Convert '\' to '/'. Collapse '//' and '/./'.
+function! s:normalize_path(s) abort
+ return substitute(substitute(a:s, '\', '/', 'g'), '/\./\|/\+', '/', 'g')
+endfunction
+
+" Returns TRUE if `cmd` exits with success, else FALSE.
+function! s:cmd_ok(cmd) abort
+ call system(a:cmd)
+ return v:shell_error == 0
+endfunction
+
+" Simple version comparison.
+function! s:version_cmp(a, b) abort
+ let a = split(a:a, '\.', 0)
+ let b = split(a:b, '\.', 0)
+
+ for i in range(len(a))
+ if str2nr(a[i]) > str2nr(b[i])
+ return 1
+ elseif str2nr(a[i]) < str2nr(b[i])
+ return -1
+ endif
+ endfor
+
+ return 0
+endfunction
+
+" Handler for s:system() function.
+function! s:system_handler(jobid, data, event) dict abort
+ if a:event ==# 'stderr'
+ let self.stderr .= join(a:data, '')
+ if !self.ignore_stderr
+ let self.output .= join(a:data, '')
+ endif
+ elseif a:event ==# 'stdout'
+ let self.output .= join(a:data, '')
+ elseif a:event ==# 'exit'
+ let s:shell_error = a:data
+ endif
+endfunction
+
+" Attempts to construct a shell command from an args list.
+" Only for display, to help users debug a failed command.
+function! s:shellify(cmd) abort
+ if type(a:cmd) != type([])
+ return a:cmd
+ endif
+ return join(map(copy(a:cmd),
+ \'v:val =~# ''\m[^\-.a-zA-Z_/]'' ? shellescape(v:val) : v:val'), ' ')
+endfunction
+
+" Run a system command and timeout after 30 seconds.
+function! s:system(cmd, ...) abort
+ let stdin = a:0 ? a:1 : ''
+ let ignore_error = a:0 > 2 ? a:3 : 0
+ let opts = {
+ \ 'ignore_stderr': a:0 > 1 ? a:2 : 0,
+ \ 'output': '',
+ \ 'stderr': '',
+ \ 'on_stdout': function('s:system_handler'),
+ \ 'on_stderr': function('s:system_handler'),
+ \ 'on_exit': function('s:system_handler'),
+ \ }
+ let jobid = jobstart(a:cmd, opts)
+
+ if jobid < 1
+ call health#report_error(printf('Command error (job=%d): `%s` (in %s)',
+ \ jobid, s:shellify(a:cmd), string(getcwd())))
+ let s:shell_error = 1
+ return opts.output
+ endif
+
+ if !empty(stdin)
+ call jobsend(jobid, stdin)
+ endif
+
+ let res = jobwait([jobid], 30000)
+ if res[0] == -1
+ call health#report_error(printf('Command timed out: %s', s:shellify(a:cmd)))
+ call jobstop(jobid)
+ elseif s:shell_error != 0 && !ignore_error
+ call health#report_error(printf("Command error (job=%d, exit code %d): `%s` (in %s)\nOutput: %s\nStderr: %s",
+ \ jobid, s:shell_error, s:shellify(a:cmd), string(getcwd()), opts.output, opts.stderr))
+ endif
+
+ return opts.output
+endfunction
+
+function! s:systemlist(cmd, ...) abort
+ let stdout = split(s:system(a:cmd, a:0 ? a:1 : ''), "\n")
+ if a:0 > 1 && !empty(a:2)
+ return filter(stdout, '!empty(v:val)')
+ endif
+ return stdout
+endfunction
+
+" Fetch the contents of a URL.
+function! s:download(url) abort
+ if executable('curl')
+ let rv = s:system(['curl', '-sL', a:url], '', 1, 1)
+ return s:shell_error ? 'curl error with '.a:url.': '.s:shell_error : rv
+ elseif executable('python')
+ let script = "
+ \try:\n
+ \ from urllib.request import urlopen\n
+ \except ImportError:\n
+ \ from urllib2 import urlopen\n
+ \\n
+ \response = urlopen('".a:url."')\n
+ \print(response.read().decode('utf8'))\n
+ \"
+ let rv = s:system(['python', '-c', script])
+ return empty(rv) && s:shell_error
+ \ ? 'python urllib.request error: '.s:shell_error
+ \ : rv
+ endif
+ return 'missing `curl` and `python`, cannot make pypi request'
+endfunction
+
+" Check for clipboard tools.
+function! s:check_clipboard() abort
+ call health#report_start('Clipboard (optional)')
+
+ if !empty($TMUX) && executable('tmux') && executable('pbpaste') && !s:cmd_ok('pbpaste')
+ let tmux_version = matchstr(system('tmux -V'), '\d\+\.\d\+')
+ call health#report_error('pbcopy does not work with tmux version: '.tmux_version,
+ \ ['Install tmux 2.6+. https://superuser.com/q/231130',
+ \ 'or use tmux with reattach-to-user-namespace. https://superuser.com/a/413233'])
+ endif
+
+ let clipboard_tool = provider#clipboard#Executable()
+ if exists('g:clipboard') && empty(clipboard_tool)
+ call health#report_error(
+ \ provider#clipboard#Error(),
+ \ ["Use the example in :help g:clipboard as a template, or don't set g:clipboard at all."])
+ elseif empty(clipboard_tool)
+ call health#report_warn(
+ \ 'No clipboard tool found. Clipboard registers (`"+` and `"*`) will not work.',
+ \ [':help clipboard'])
+ else
+ call health#report_ok('Clipboard tool found: '. clipboard_tool)
+ endif
+endfunction
+
+" Get the latest Neovim Python client (pynvim) version from PyPI.
+function! s:latest_pypi_version() abort
+ let pypi_version = 'unable to get pypi response'
+ let pypi_response = s:download('https://pypi.python.org/pypi/pynvim/json')
+ if !empty(pypi_response)
+ try
+ let pypi_data = json_decode(pypi_response)
+ catch /E474/
+ return 'error: '.pypi_response
+ endtry
+ let pypi_version = get(get(pypi_data, 'info', {}), 'version', 'unable to parse')
+ endif
+ return pypi_version
+endfunction
+
+" Get version information using the specified interpreter. The interpreter is
+" used directly in case breaking changes were introduced since the last time
+" Neovim's Python client was updated.
+"
+" Returns: [
+" {python executable version},
+" {current nvim version},
+" {current pypi nvim status},
+" {installed version status}
+" ]
+function! s:version_info(python) abort
+ let pypi_version = s:latest_pypi_version()
+ let python_version = s:trim(s:system([
+ \ a:python,
+ \ '-c',
+ \ 'import sys; print(".".join(str(x) for x in sys.version_info[:3]))',
+ \ ]))
+
+ if empty(python_version)
+ let python_version = 'unable to parse '.a:python.' response'
+ endif
+
+ let nvim_path = s:trim(s:system([
+ \ a:python, '-c',
+ \ 'import sys; sys.path.remove(""); ' .
+ \ 'import neovim; print(neovim.__file__)']))
+ if s:shell_error || empty(nvim_path)
+ return [python_version, 'unable to load neovim Python module', pypi_version,
+ \ nvim_path]
+ endif
+
+ " Assuming that multiple versions of a package are installed, sort them
+ " numerically in descending order.
+ function! s:compare(metapath1, metapath2) abort
+ let a = matchstr(fnamemodify(a:metapath1, ':p:h:t'), '[0-9.]\+')
+ let b = matchstr(fnamemodify(a:metapath2, ':p:h:t'), '[0-9.]\+')
+ return a == b ? 0 : a > b ? 1 : -1
+ endfunction
+
+ " Try to get neovim.VERSION (added in 0.1.11dev).
+ let nvim_version = s:system([a:python, '-c',
+ \ 'from neovim import VERSION as v; '.
+ \ 'print("{}.{}.{}{}".format(v.major, v.minor, v.patch, v.prerelease))'],
+ \ '', 1, 1)
+ if empty(nvim_version)
+ let nvim_version = 'unable to find neovim Python module version'
+ let base = fnamemodify(nvim_path, ':h')
+ let metas = glob(base.'-*/METADATA', 1, 1)
+ \ + glob(base.'-*/PKG-INFO', 1, 1)
+ \ + glob(base.'.egg-info/PKG-INFO', 1, 1)
+ let metas = sort(metas, 's:compare')
+
+ if !empty(metas)
+ for meta_line in readfile(metas[0])
+ if meta_line =~# '^Version:'
+ let nvim_version = matchstr(meta_line, '^Version: \zs\S\+')
+ break
+ endif
+ endfor
+ endif
+ endif
+
+ let nvim_path_base = fnamemodify(nvim_path, ':~:h')
+ let version_status = 'unknown; '.nvim_path_base
+ if !s:is_bad_response(nvim_version) && !s:is_bad_response(pypi_version)
+ if s:version_cmp(nvim_version, pypi_version) == -1
+ let version_status = 'outdated; from '.nvim_path_base
+ else
+ let version_status = 'up to date'
+ endif
+ endif
+
+ return [python_version, nvim_version, pypi_version, version_status]
+endfunction
+
+" Check the Python interpreter's usability.
+function! s:check_bin(bin) abort
+ if !filereadable(a:bin) && (!has('win32') || !filereadable(a:bin.'.exe'))
+ call health#report_error(printf('"%s" was not found.', a:bin))
+ return 0
+ elseif executable(a:bin) != 1
+ call health#report_error(printf('"%s" is not executable.', a:bin))
+ return 0
+ endif
+ return 1
+endfunction
+
+function! s:check_python(version) abort
+ call health#report_start('Python ' . a:version . ' provider (optional)')
+
+ let pyname = 'python'.(a:version == 2 ? '' : '3')
+ let python_exe = ''
+ let venv = exists('$VIRTUAL_ENV') ? resolve($VIRTUAL_ENV) : ''
+ let host_prog_var = pyname.'_host_prog'
+ let loaded_var = 'g:loaded_'.pyname.'_provider'
+ let python_multiple = []
+
+ if exists(loaded_var) && !exists('*provider#'.pyname.'#Call')
+ call health#report_info('Disabled ('.loaded_var.'='.eval(loaded_var).'). This might be due to some previous error.')
+ endif
+
+ let [pyenv, pyenv_root] = s:check_for_pyenv()
+
+ if exists('g:'.host_prog_var)
+ call health#report_info(printf('Using: g:%s = "%s"', host_prog_var, get(g:, host_prog_var)))
+ endif
+
+ let [pyname, pythonx_errors] = provider#pythonx#Detect(a:version)
+
+ if empty(pyname)
+ call health#report_warn('No Python executable found that can `import neovim`. '
+ \ . 'Using the first available executable for diagnostics.')
+ elseif exists('g:'.host_prog_var)
+ let python_exe = pyname
+ endif
+
+ " No Python executable could `import neovim`.
+ if !empty(pythonx_errors)
+ call health#report_error('Python provider error:', pythonx_errors)
+
+ elseif !empty(pyname) && empty(python_exe)
+ if !exists('g:'.host_prog_var)
+ call health#report_info(printf('`g:%s` is not set. Searching for '
+ \ . '%s in the environment.', host_prog_var, pyname))
+ endif
+
+ if !empty(pyenv)
+ let python_exe = s:trim(s:system([pyenv, 'which', pyname], '', 1))
+
+ if empty(python_exe)
+ call health#report_warn(printf('pyenv could not find %s.', pyname))
+ endif
+ endif
+
+ if empty(python_exe)
+ let python_exe = exepath(pyname)
+
+ if exists('$PATH')
+ for path in split($PATH, has('win32') ? ';' : ':')
+ let path_bin = s:normalize_path(path.'/'.pyname)
+ if path_bin != s:normalize_path(python_exe)
+ \ && index(python_multiple, path_bin) == -1
+ \ && executable(path_bin)
+ call add(python_multiple, path_bin)
+ endif
+ endfor
+
+ if len(python_multiple)
+ " This is worth noting since the user may install something
+ " that changes $PATH, like homebrew.
+ call health#report_info(printf('Multiple %s executables found. '
+ \ . 'Set `g:%s` to avoid surprises.', pyname, host_prog_var))
+ endif
+
+ if python_exe =~# '\<shims\>'
+ call health#report_warn(printf('`%s` appears to be a pyenv shim.', python_exe), [
+ \ '`pyenv` is not in $PATH, your pyenv installation is broken. '
+ \ .'Set `g:'.host_prog_var.'` to avoid surprises.',
+ \ ])
+ endif
+ endif
+ endif
+ endif
+
+ if !empty(python_exe) && !exists('g:'.host_prog_var)
+ if empty(venv) && !empty(pyenv)
+ \ && !empty(pyenv_root) && resolve(python_exe) !~# '^'.pyenv_root.'/'
+ call health#report_warn('pyenv is not set up optimally.', [
+ \ printf('Create a virtualenv specifically '
+ \ . 'for Neovim using pyenv, and set `g:%s`. This will avoid '
+ \ . 'the need to install the pynvim module in each '
+ \ . 'version/virtualenv.', host_prog_var)
+ \ ])
+ elseif !empty(venv)
+ if !empty(pyenv_root)
+ let venv_root = pyenv_root
+ else
+ let venv_root = fnamemodify(venv, ':h')
+ endif
+
+ if resolve(python_exe) !~# '^'.venv_root.'/'
+ call health#report_warn('Your virtualenv is not set up optimally.', [
+ \ printf('Create a virtualenv specifically '
+ \ . 'for Neovim and use `g:%s`. This will avoid '
+ \ . 'the need to install the pynvim module in each '
+ \ . 'virtualenv.', host_prog_var)
+ \ ])
+ endif
+ endif
+ endif
+
+ if empty(python_exe) && !empty(pyname)
+ " An error message should have already printed.
+ call health#report_error(printf('`%s` was not found.', pyname))
+ elseif !empty(python_exe) && !s:check_bin(python_exe)
+ let python_exe = ''
+ endif
+
+ " Check if $VIRTUAL_ENV is valid.
+ if exists('$VIRTUAL_ENV') && !empty(python_exe)
+ if $VIRTUAL_ENV ==# matchstr(python_exe, '^\V'.$VIRTUAL_ENV)
+ call health#report_info('$VIRTUAL_ENV matches executable')
+ else
+ call health#report_warn(
+ \ '$VIRTUAL_ENV exists but appears to be inactive. '
+ \ . 'This could lead to unexpected results.',
+ \ [ 'If you are using Zsh, see: http://vi.stackexchange.com/a/7654' ])
+ endif
+ endif
+
+ " Diagnostic output
+ call health#report_info('Executable: ' . (empty(python_exe) ? 'Not found' : python_exe))
+ if len(python_multiple)
+ for path_bin in python_multiple
+ call health#report_info('Other python executable: ' . path_bin)
+ endfor
+ endif
+
+ let pip = 'pip' . (a:version == 2 ? '' : '3')
+
+ if empty(python_exe)
+ " No Python executable can import 'neovim'. Check if any Python executable
+ " can import 'pynvim'. If so, that Python failed to import 'neovim' as
+ " well, which is most probably due to a failed pip upgrade:
+ " https://github.com/neovim/neovim/wiki/Following-HEAD#20181118
+ let [pynvim_exe, errors] = provider#pythonx#DetectByModule('pynvim', a:version)
+ if !empty(pynvim_exe)
+ call health#report_error(
+ \ 'Detected pip upgrade failure: Python executable can import "pynvim" but '
+ \ . 'not "neovim": '. pynvim_exe,
+ \ "Use that Python version to reinstall \"pynvim\" and optionally \"neovim\".\n"
+ \ . pip ." uninstall pynvim neovim\n"
+ \ . pip ." install pynvim\n"
+ \ . pip ." install neovim # only if needed by third-party software")
+ endif
+ else
+ let [pyversion, current, latest, status] = s:version_info(python_exe)
+
+ if a:version != str2nr(pyversion)
+ call health#report_warn('Unexpected Python version.' .
+ \ ' This could lead to confusing error messages.')
+ endif
+
+ if a:version == 3 && str2float(pyversion) < 3.3
+ call health#report_warn('Python 3.3+ is recommended.')
+ endif
+
+ call health#report_info('Python version: ' . pyversion)
+
+ if s:is_bad_response(status)
+ call health#report_info(printf('pynvim version: %s (%s)', current, status))
+ else
+ call health#report_info(printf('pynvim version: %s', current))
+ endif
+
+ if s:is_bad_response(current)
+ call health#report_error(
+ \ "pynvim is not installed.\nError: ".current,
+ \ ['Run in shell: '. pip .' install pynvim'])
+ endif
+
+ if s:is_bad_response(latest)
+ call health#report_warn('Could not contact PyPI to get latest version.')
+ call health#report_error('HTTP request failed: '.latest)
+ elseif s:is_bad_response(status)
+ call health#report_warn(printf('Latest pynvim is NOT installed: %s', latest))
+ elseif !s:is_bad_response(current)
+ call health#report_ok(printf('Latest pynvim is installed.'))
+ endif
+ endif
+endfunction
+
+" Check if pyenv is available and a valid pyenv root can be found, then return
+" their respective paths. If either of those is invalid, return two empty
+" strings, effectivly ignoring pyenv.
+function! s:check_for_pyenv() abort
+ let pyenv_path = resolve(exepath('pyenv'))
+
+ if empty(pyenv_path)
+ return ['', '']
+ endif
+
+ call health#report_info('pyenv: Path: '. pyenv_path)
+
+ let pyenv_root = exists('$PYENV_ROOT') ? resolve($PYENV_ROOT) : ''
+
+ if empty(pyenv_root)
+ let pyenv_root = s:trim(s:system([pyenv_path, 'root']))
+ call health#report_info('pyenv: $PYENV_ROOT is not set. Infer from `pyenv root`.')
+ endif
+
+ if !isdirectory(pyenv_root)
+ call health#report_warn(
+ \ printf('pyenv: Root does not exist: %s. '
+ \ . 'Ignoring pyenv for all following checks.', pyenv_root))
+ return ['', '']
+ endif
+
+ call health#report_info('pyenv: Root: '.pyenv_root)
+
+ return [pyenv_path, pyenv_root]
+endfunction
+
+function! s:check_ruby() abort
+ call health#report_start('Ruby provider (optional)')
+
+ let loaded_var = 'g:loaded_ruby_provider'
+ if exists(loaded_var) && !exists('*provider#ruby#Call')
+ call health#report_info('Disabled. '.loaded_var.'='.eval(loaded_var))
+ return
+ endif
+
+ if !executable('ruby') || !executable('gem')
+ call health#report_warn(
+ \ '`ruby` and `gem` must be in $PATH.',
+ \ ['Install Ruby and verify that `ruby` and `gem` commands work.'])
+ return
+ endif
+ call health#report_info('Ruby: '. s:system('ruby -v'))
+
+ let host = provider#ruby#Detect()
+ if empty(host)
+ call health#report_warn('`neovim-ruby-host` not found.',
+ \ ['Run `gem install neovim` to ensure the neovim RubyGem is installed.',
+ \ 'Run `gem environment` to ensure the gem bin directory is in $PATH.',
+ \ 'If you are using rvm/rbenv/chruby, try "rehashing".',
+ \ 'See :help g:ruby_host_prog for non-standard gem installations.'])
+ return
+ endif
+ call health#report_info('Host: '. host)
+
+ let latest_gem_cmd = has('win32') ? 'cmd /c gem list -ra ^^neovim$' : 'gem list -ra ^neovim$'
+ let latest_gem = s:system(split(latest_gem_cmd))
+ if s:shell_error || empty(latest_gem)
+ call health#report_error('Failed to run: '. latest_gem_cmd,
+ \ ["Make sure you're connected to the internet.",
+ \ 'Are you behind a firewall or proxy?'])
+ return
+ endif
+ let latest_gem = get(split(latest_gem, 'neovim (\|, \|)$' ), 1, 'not found')
+
+ let current_gem_cmd = host .' --version'
+ let current_gem = s:system(current_gem_cmd)
+ if s:shell_error
+ call health#report_error('Failed to run: '. current_gem_cmd,
+ \ ['Report this issue with the output of: ', current_gem_cmd])
+ return
+ endif
+
+ if s:version_cmp(current_gem, latest_gem) == -1
+ call health#report_warn(
+ \ printf('Gem "neovim" is out-of-date. Installed: %s, latest: %s',
+ \ current_gem, latest_gem),
+ \ ['Run in shell: gem update neovim'])
+ else
+ call health#report_ok('Latest "neovim" gem is installed: '. current_gem)
+ endif
+endfunction
+
+function! s:check_node() abort
+ call health#report_start('Node.js provider (optional)')
+
+ let loaded_var = 'g:loaded_node_provider'
+ if exists(loaded_var) && !exists('*provider#node#Call')
+ call health#report_info('Disabled. '.loaded_var.'='.eval(loaded_var))
+ return
+ endif
+
+ if !executable('node') || (!executable('npm') && !executable('yarn'))
+ call health#report_warn(
+ \ '`node` and `npm` (or `yarn`) must be in $PATH.',
+ \ ['Install Node.js and verify that `node` and `npm` (or `yarn`) commands work.'])
+ return
+ endif
+ let node_v = get(split(s:system('node -v'), "\n"), 0, '')
+ call health#report_info('Node.js: '. node_v)
+ if !s:shell_error && s:version_cmp(node_v[1:], '6.0.0') < 0
+ call health#report_warn('Neovim node.js host does not support '.node_v)
+ " Skip further checks, they are nonsense if nodejs is too old.
+ return
+ endif
+ if !provider#node#can_inspect()
+ call health#report_warn('node.js on this system does not support --inspect-brk so $NVIM_NODE_HOST_DEBUG is ignored.')
+ endif
+
+ let host = provider#node#Detect()
+ if empty(host)
+ call health#report_warn('Missing "neovim" npm (or yarn) package.',
+ \ ['Run in shell: npm install -g neovim',
+ \ 'Run in shell (if you use yarn): yarn global add neovim'])
+ return
+ endif
+ call health#report_info('Neovim node.js host: '. host)
+
+ let latest_npm_cmd = has('win32') ? 'cmd /c npm info neovim --json' : 'npm info neovim --json'
+ let latest_npm = s:system(split(latest_npm_cmd))
+ if s:shell_error || empty(latest_npm)
+ call health#report_error('Failed to run: '. latest_npm_cmd,
+ \ ["Make sure you're connected to the internet.",
+ \ 'Are you behind a firewall or proxy?'])
+ return
+ endif
+ if !empty(latest_npm)
+ try
+ let pkg_data = json_decode(latest_npm)
+ catch /E474/
+ return 'error: '.latest_npm
+ endtry
+ let latest_npm = get(get(pkg_data, 'dist-tags', {}), 'latest', 'unable to parse')
+ endif
+
+ let current_npm_cmd = ['node', host, '--version']
+ let current_npm = s:system(current_npm_cmd)
+ if s:shell_error
+ call health#report_error('Failed to run: '. string(current_npm_cmd),
+ \ ['Report this issue with the output of: ', string(current_npm_cmd)])
+ return
+ endif
+
+ if s:version_cmp(current_npm, latest_npm) == -1
+ call health#report_warn(
+ \ printf('Package "neovim" is out-of-date. Installed: %s, latest: %s',
+ \ current_npm, latest_npm),
+ \ ['Run in shell: npm install -g neovim'])
+ else
+ call health#report_ok('Latest "neovim" npm/yarn package is installed: '. current_npm)
+ endif
+endfunction
+
+function! health#provider#check() abort
+ call s:check_clipboard()
+ call s:check_python(2)
+ call s:check_python(3)
+ call s:check_ruby()
+ call s:check_node()
+endfunction
diff --git a/runtime/autoload/javascriptcomplete.vim b/runtime/autoload/javascriptcomplete.vim
index 2abe41b463..14bc3d7ce3 100644
--- a/runtime/autoload/javascriptcomplete.vim
+++ b/runtime/autoload/javascriptcomplete.vim
@@ -1,7 +1,7 @@
" Vim completion script
" Language: Java Script
" Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
-" Last Change: 2006 Apr 30
+" Last Change: 2017 Mar 04
function! javascriptcomplete#CompleteJS(findstart, base)
if a:findstart
@@ -563,7 +563,7 @@ function! javascriptcomplete#CompleteJS(findstart, base)
for i in arguments
let g:ia = i
let f_elements = matchlist(i, 'function\s\+\(\k\+\)\s*(\(.\{-}\))')
- if len(f_elements) == 3
+ if len(f_elements) >= 3
let b:js_menuinfo[f_elements[1].'('] = f_elements[2]
endif
endfor
diff --git a/runtime/autoload/man.vim b/runtime/autoload/man.vim
index 0dfcc424e2..41c2f5a405 100644
--- a/runtime/autoload/man.vim
+++ b/runtime/autoload/man.vim
@@ -1,137 +1,408 @@
-let s:man_tag_depth = 0
-let s:man_sect_arg = ''
-let s:man_find_arg = '-w'
-
-try
- if !has('win32') && $OSTYPE !~? 'cygwin\|linux' && system('uname -s') =~? 'SunOS' && system('uname -r') =~? '^5'
- let s:man_sect_arg = '-s'
- let s:man_find_arg = '-l'
- endif
-catch /E145:/
- " Ignore the error in restricted mode
-endtry
-
-" Load man page {page} from {section}
-" call man#get_page([{section}, ]{page})
-function man#get_page(...) abort
- let invoked_from_man = (&filetype ==# 'man')
-
- if a:0 == 0
- echoerr 'argument required'
- return
- elseif a:0 > 2
- echoerr 'too many arguments'
- return
- endif
+" Maintainer: Anmol Sethi <anmol@aubble.com>
- let sect = get(a:000, 0)
- let page = get(a:000, 1, sect)
+if exists('s:loaded_man')
+ finish
+endif
+let s:loaded_man = 1
- let [page, sect] = s:parse_page_and_section(sect, page)
+let s:find_arg = '-w'
+let s:localfile_arg = v:true " Always use -l if possible. #6683
+let s:section_arg = '-s'
- if !empty(sect) && s:find_page(sect, page) == 0
- let sect = ''
+function! s:init_section_flag()
+ call system(['env', 'MANPAGER=cat', 'man', s:section_arg, '1', 'man'])
+ if v:shell_error
+ let s:section_arg = '-S'
endif
+endfunction
+
+function! s:init() abort
+ call s:init_section_flag()
+ " TODO(nhooyr): Does `man -l` on SunOS list searched directories?
+ try
+ if !has('win32') && $OSTYPE !~? 'cygwin\|linux' && system('uname -s') =~? 'SunOS' && system('uname -r') =~# '^5'
+ let s:find_arg = '-l'
+ endif
+ " Check for -l support.
+ call s:get_page(s:get_path('', 'man'))
+ catch /E145:/
+ " Ignore the error in restricted mode
+ catch /command error .*/
+ let s:localfile_arg = v:false
+ endtry
+endfunction
- if s:find_page(sect, page) == 0
- echo 'No manual entry for '.page
+function! man#open_page(count, count1, mods, ...) abort
+ if a:0 > 2
+ call s:error('too many arguments')
return
+ elseif a:0 == 0
+ let ref = &filetype ==# 'man' ? expand('<cWORD>') : expand('<cword>')
+ if empty(ref)
+ call s:error('no identifier under cursor')
+ return
+ endif
+ elseif a:0 ==# 1
+ let ref = a:1
+ else
+ " Combine the name and sect into a manpage reference so that all
+ " verification/extraction can be kept in a single function.
+ " If a:2 is a reference as well, that is fine because it is the only
+ " reference that will match.
+ let ref = a:2.'('.a:1.')'
endif
+ try
+ let [sect, name] = man#extract_sect_and_name_ref(ref)
+ if a:count ==# a:count1
+ " v:count defaults to 0 which is a valid section, and v:count1 defaults to
+ " 1, also a valid section. If they are equal, count explicitly set.
+ let sect = string(a:count)
+ endif
+ let [sect, name, path] = s:verify_exists(sect, name)
+ catch
+ call s:error(v:exception)
+ return
+ endtry
+
+ call s:push_tag()
+ let bufname = 'man://'.name.(empty(sect)?'':'('.sect.')')
- exec 'let s:man_tag_buf_'.s:man_tag_depth.' = '.bufnr('%')
- exec 'let s:man_tag_lin_'.s:man_tag_depth.' = '.line('.')
- exec 'let s:man_tag_col_'.s:man_tag_depth.' = '.col('.')
- let s:man_tag_depth = s:man_tag_depth + 1
-
- let editcmd = 'edit'
- " Use an existing 'man' window, else open a new one.
- if &filetype !=# 'man'
- let thiswin = winnr()
- wincmd b
- if winnr() > 1
- exec thiswin . 'wincmd w'
- while 1
- if &filetype ==# 'man'
- break
- endif
- wincmd w
- if thiswin == winnr()
- break
- endif
- endwhile
+ try
+ set eventignore+=BufReadCmd
+ if a:mods !~# 'tab' && s:find_man()
+ execute 'silent keepalt edit' fnameescape(bufname)
+ else
+ execute 'silent keepalt' a:mods 'split' fnameescape(bufname)
endif
+ finally
+ set eventignore-=BufReadCmd
+ endtry
- if &filetype !=# 'man'
- let editcmd = 'tabnew'
+ try
+ let page = s:get_page(path)
+ catch
+ if a:mods =~# 'tab' || !s:find_man()
+ " a new window was opened
+ close
endif
+ call s:error(v:exception)
+ return
+ endtry
+
+ let b:man_sect = sect
+ call s:put_page(page)
+endfunction
+
+function! man#read_page(ref) abort
+ try
+ let [sect, name] = man#extract_sect_and_name_ref(a:ref)
+ let [sect, name, path] = s:verify_exists(sect, name)
+ let page = s:get_page(path)
+ catch
+ call s:error(v:exception)
+ return
+ endtry
+ let b:man_sect = sect
+ call s:put_page(page)
+endfunction
+
+" Handler for s:system() function.
+function! s:system_handler(jobid, data, event) dict abort
+ if a:event is# 'stdout' || a:event is# 'stderr'
+ let self[a:event] .= join(a:data, "\n")
+ else
+ let self.exit_code = a:data
endif
+endfunction
- silent exec editcmd.' man://'.page.(empty(sect)?'':'('.sect.')')
+" Run a system command and timeout after 30 seconds.
+function! s:system(cmd, ...) abort
+ let opts = {
+ \ 'stdout': '',
+ \ 'stderr': '',
+ \ 'exit_code': 0,
+ \ 'on_stdout': function('s:system_handler'),
+ \ 'on_stderr': function('s:system_handler'),
+ \ 'on_exit': function('s:system_handler'),
+ \ }
+ let jobid = jobstart(a:cmd, opts)
- setlocal modifiable
- silent keepjumps norm! 1G"_dG
- if empty($MANWIDTH)
- let $MANWIDTH = winwidth(0)
+ if jobid < 1
+ throw printf('command error %d: %s', jobid, join(a:cmd))
endif
- silent exec 'r!/usr/bin/man '.s:cmd(sect, page).' | col -b'
- " Remove blank lines from top and bottom.
+
+ let res = jobwait([jobid], 30000)
+ if res[0] == -1
+ try
+ call jobstop(jobid)
+ throw printf('command timed out: %s', join(a:cmd))
+ catch /^Vim(call):E900:/
+ endtry
+ elseif res[0] == -2
+ throw printf('command interrupted: %s', join(a:cmd))
+ endif
+ if opts.exit_code != 0
+ throw printf("command error (%d) %s: %s", jobid, join(a:cmd), substitute(opts.stderr, '\_s\+$', '', &gdefault ? '' : 'g'))
+ endif
+
+ return opts.stdout
+endfunction
+
+function! s:get_page(path) abort
+ " Disable hard-wrap by using a big $MANWIDTH (max 1000 on some systems #9065).
+ " We use soft wrap: ftplugin/man.vim sets wrap/breakindent/โ€ฆ.
+ let manwidth = 999
+ " Force MANPAGER=cat to ensure Vim is not recursively invoked (by man-db).
+ " http://comments.gmane.org/gmane.editors.vim.devel/29085
+ " Set MAN_KEEP_FORMATTING so Debian man doesn't discard backspaces.
+ let cmd = ['env', 'MANPAGER=cat', 'MANWIDTH='.manwidth, 'MAN_KEEP_FORMATTING=1', 'man']
+ return s:system(cmd + (s:localfile_arg ? ['-l', a:path] : [a:path]))
+endfunction
+
+function! s:put_page(page) abort
+ setlocal modifiable
+ setlocal noreadonly
+ silent keepjumps %delete _
+ silent put =a:page
while getline(1) =~# '^\s*$'
silent keepjumps 1delete _
endwhile
- while getline('$') =~# '^\s*$'
- silent keepjumps $delete _
- endwhile
- setlocal nomodified
+ " XXX: nroff justifies text by filling it with whitespace. That interacts
+ " badly with our use of $MANWIDTH=999. Hack around this by using a fixed
+ " size for those whitespace regions.
+ silent! keeppatterns keepjumps %s/\s\{199,}/\=repeat(' ', 10)/g
+ 1
+ lua require("man").highlight_man_page()
setlocal filetype=man
+endfunction
- if invoked_from_man || editcmd ==# 'tabnew'
- call s:set_window_local_options()
+function! man#show_toc() abort
+ let bufname = bufname('%')
+ let info = getloclist(0, {'winid': 1})
+ if !empty(info) && getwinvar(info.winid, 'qf_toc') ==# bufname
+ lopen
+ return
endif
+
+ let toc = []
+ let lnum = 2
+ let last_line = line('$') - 1
+ while lnum && lnum < last_line
+ let text = getline(lnum)
+ if text =~# '^\%( \{3\}\)\=\S.*$'
+ call add(toc, {'bufnr': bufnr('%'), 'lnum': lnum, 'text': text})
+ endif
+ let lnum = nextnonblank(lnum + 1)
+ endwhile
+
+ call setloclist(0, toc, ' ')
+ call setloclist(0, [], 'a', {'title': 'Man TOC'})
+ lopen
+ let w:qf_toc = bufname
endfunction
-function s:set_window_local_options() abort
- setlocal colorcolumn=0 foldcolumn=0 nonumber
- setlocal nolist norelativenumber nofoldenable
+" attempt to extract the name and sect out of 'name(sect)'
+" otherwise just return the largest string of valid characters in ref
+function! man#extract_sect_and_name_ref(ref) abort
+ if a:ref[0] ==# '-' " try ':Man -pandoc' with this disabled.
+ throw 'manpage name cannot start with ''-'''
+ endif
+ let ref = matchstr(a:ref, '[^()]\+([^()]\+)')
+ if empty(ref)
+ let name = matchstr(a:ref, '[^()]\+')
+ if empty(name)
+ throw 'manpage reference cannot contain only parentheses'
+ endif
+ return [get(b:, 'man_default_sects', ''), name]
+ endif
+ let left = split(ref, '(')
+ " see ':Man 3X curses' on why tolower.
+ " TODO(nhooyr) Not sure if this is portable across OSs
+ " but I have not seen a single uppercase section.
+ return [tolower(split(left[1], ')')[0]), left[0]]
endfunction
-function man#pop_page() abort
- if s:man_tag_depth > 0
- let s:man_tag_depth = s:man_tag_depth - 1
- exec "let s:man_tag_buf=s:man_tag_buf_".s:man_tag_depth
- exec "let s:man_tag_lin=s:man_tag_lin_".s:man_tag_depth
- exec "let s:man_tag_col=s:man_tag_col_".s:man_tag_depth
- exec s:man_tag_buf."b"
- exec s:man_tag_lin
- exec "norm! ".s:man_tag_col."|"
- exec "unlet s:man_tag_buf_".s:man_tag_depth
- exec "unlet s:man_tag_lin_".s:man_tag_depth
- exec "unlet s:man_tag_col_".s:man_tag_depth
- unlet s:man_tag_buf s:man_tag_lin s:man_tag_col
+function! s:get_path(sect, name) abort
+ " Some man implementations (OpenBSD) return all available paths from the
+ " search command, so we get() the first one. #8341
+ if empty(a:sect)
+ return substitute(get(split(s:system(['man', s:find_arg, a:name])), 0, ''), '\n\+$', '', '')
endif
+ " '-s' flag handles:
+ " - tokens like 'printf(echo)'
+ " - sections starting with '-'
+ " - 3pcap section (found on macOS)
+ " - commas between sections (for section priority)
+ return substitute(get(split(s:system(['man', s:find_arg, s:section_arg, a:sect, a:name])), 0, ''), '\n\+$', '', '')
endfunction
-" Expects a string like 'access' or 'access(2)'.
-function s:parse_page_and_section(sect, str) abort
+function! s:verify_exists(sect, name) abort
try
- let [page, sect] = matchlist(a:str, '\v\C([-.[:alnum:]_]+)%(\(([-.[:alnum:]_]+)\))?')[1:2]
- if empty(sect)
- let sect = a:sect
+ let path = s:get_path(a:sect, a:name)
+ catch /^command error (/
+ try
+ let path = s:get_path(get(b:, 'man_default_sects', ''), a:name)
+ catch /^command error (/
+ let path = s:get_path('', a:name)
+ endtry
+ endtry
+ " Extract the section from the path, because sometimes the actual section is
+ " more specific than what we provided to `man` (try `:Man 3 App::CLI`).
+ " Also on linux, name seems to be case-insensitive. So for `:Man PRIntf`, we
+ " still want the name of the buffer to be 'printf'.
+ return s:extract_sect_and_name_path(path) + [path]
+endfunction
+
+let s:tag_stack = []
+
+function! s:push_tag() abort
+ let s:tag_stack += [{
+ \ 'buf': bufnr('%'),
+ \ 'lnum': line('.'),
+ \ 'col': col('.'),
+ \ }]
+endfunction
+
+function! man#pop_tag() abort
+ if !empty(s:tag_stack)
+ let tag = remove(s:tag_stack, -1)
+ execute 'silent' tag['buf'].'buffer'
+ call cursor(tag['lnum'], tag['col'])
+ endif
+endfunction
+
+" extracts the name and sect out of 'path/name.sect'
+function! s:extract_sect_and_name_path(path) abort
+ let tail = fnamemodify(a:path, ':t')
+ if a:path =~# '\.\%([glx]z\|bz2\|lzma\|Z\)$' " valid extensions
+ let tail = fnamemodify(tail, ':r')
+ endif
+ let sect = matchstr(tail, '\.\zs[^.]\+$')
+ let name = matchstr(tail, '^.\+\ze\.')
+ return [sect, name]
+endfunction
+
+function! s:find_man() abort
+ if &filetype ==# 'man'
+ return 1
+ elseif winnr('$') ==# 1
+ return 0
+ endif
+ let thiswin = winnr()
+ while 1
+ wincmd w
+ if &filetype ==# 'man'
+ return 1
+ elseif thiswin ==# winnr()
+ return 0
+ endif
+ endwhile
+endfunction
+
+function! s:error(msg) abort
+ redraw
+ echohl ErrorMsg
+ echon 'man.vim: ' a:msg
+ echohl None
+endfunction
+
+" see man#extract_sect_and_name_ref on why tolower(sect)
+function! man#complete(arg_lead, cmd_line, cursor_pos) abort
+ let args = split(a:cmd_line)
+ let cmd_offset = index(args, 'Man')
+ if cmd_offset > 0
+ " Prune all arguments up to :Man itself. Otherwise modifier commands like
+ " :tab, :vertical, etc. would lead to a wrong length.
+ let args = args[cmd_offset:]
+ endif
+ let l = len(args)
+ if l > 3
+ return
+ elseif l ==# 1
+ let name = ''
+ let sect = ''
+ elseif a:arg_lead =~# '^[^()]\+([^()]*$'
+ " cursor (|) is at ':Man printf(|' or ':Man 1 printf(|'
+ " The later is is allowed because of ':Man pri<TAB>'.
+ " It will offer 'priclass.d(1m)' even though section is specified as 1.
+ let tmp = split(a:arg_lead, '(')
+ let name = tmp[0]
+ let sect = tolower(get(tmp, 1, ''))
+ return s:complete(sect, '', name)
+ elseif args[1] !~# '^[^()]\+$'
+ " cursor (|) is at ':Man 3() |' or ':Man (3|' or ':Man 3() pri|'
+ " or ':Man 3() pri |'
+ return
+ elseif l ==# 2
+ if empty(a:arg_lead)
+ " cursor (|) is at ':Man 1 |'
+ let name = ''
+ let sect = tolower(args[1])
+ else
+ " cursor (|) is at ':Man pri|'
+ if a:arg_lead =~# '\/'
+ " if the name is a path, complete files
+ " TODO(nhooyr) why does this complete the last one automatically
+ return glob(a:arg_lead.'*', 0, 1)
+ endif
+ let name = a:arg_lead
+ let sect = ''
endif
+ elseif a:arg_lead !~# '^[^()]\+$'
+ " cursor (|) is at ':Man 3 printf |' or ':Man 3 (pr)i|'
+ return
+ else
+ " cursor (|) is at ':Man 3 pri|'
+ let name = a:arg_lead
+ let sect = tolower(args[1])
+ endif
+ return s:complete(sect, sect, name)
+endfunction
+
+function! s:complete(sect, psect, name) abort
+ try
+ let mandirs = join(split(s:system(['man', s:find_arg]), ':\|\n'), ',')
catch
- echoerr 'man.vim: failed to parse: "'.a:str.'"'
+ call s:error(v:exception)
+ return
endtry
-
- return [page, sect]
+ let pages = globpath(mandirs,'man?/'.a:name.'*.'.a:sect.'*', 0, 1)
+ " We remove duplicates in case the same manpage in different languages was found.
+ return uniq(sort(map(pages, 's:format_candidate(v:val, a:psect)'), 'i'))
endfunction
-function s:cmd(sect, page) abort
- if !empty(a:sect)
- return s:man_sect_arg.' '.a:sect.' '.a:page
+function! s:format_candidate(path, psect) abort
+ if a:path =~# '\.\%(pdf\|in\)$' " invalid extensions
+ return
+ endif
+ let [sect, name] = s:extract_sect_and_name_path(a:path)
+ if sect ==# a:psect
+ return name
+ elseif sect =~# a:psect.'.\+$'
+ " We include the section if the user provided section is a prefix
+ " of the actual section.
+ return name.'('.sect.')'
endif
- return a:page
endfunction
-function s:find_page(sect, page) abort
- let where = system('/usr/bin/man '.s:man_find_arg.' '.s:cmd(a:sect, a:page))
- return (where =~# '^ */')
+function! man#init_pager() abort
+ if getline(1) =~# '^\s*$'
+ silent keepjumps 1delete _
+ else
+ keepjumps 1
+ endif
+ lua require("man").highlight_man_page()
+ " Guess the ref from the heading (which is usually uppercase, so we cannot
+ " know the correct casing, cf. `man glDrawArraysInstanced`).
+ let ref = substitute(matchstr(getline(1), '^[^)]\+)'), ' ', '_', 'g')
+ try
+ let b:man_sect = man#extract_sect_and_name_ref(ref)[0]
+ catch
+ let b:man_sect = ''
+ endtry
+ if -1 == match(bufname('%'), 'man:\/\/') " Avoid duplicate buffers, E95.
+ execute 'silent file man://'.tolower(fnameescape(ref))
+ endif
endfunction
+
+call s:init()
diff --git a/runtime/autoload/msgpack.vim b/runtime/autoload/msgpack.vim
index 2e2697c57f..7dd225e3d9 100644
--- a/runtime/autoload/msgpack.vim
+++ b/runtime/autoload/msgpack.vim
@@ -40,9 +40,10 @@ function s:msgpack_init_python() abort
return s:msgpack_python_type
endif
let s:msgpack_python_initialized = 1
- for suf in ['', '3']
+ for suf in (has('win32') ? ['3'] : ['', '3'])
try
execute 'python' . suf
+ \. "\n"
\. "def shada_dict_strftime():\n"
\. " import datetime\n"
\. " import vim\n"
@@ -60,12 +61,15 @@ function s:msgpack_init_python() abort
\. " fmt = vim.eval('a:format')\n"
\. " timestr = vim.eval('a:string')\n"
\. " timestamp = datetime.datetime.strptime(timestr, fmt)\n"
- \. " timestamp = int(timestamp.timestamp())\n"
+ \. " try:\n"
+ \. " timestamp = int(timestamp.timestamp())\n"
+ \. " except:\n"
+ \. " timestamp = int(timestamp.strftime('%s'))\n"
\. " if timestamp > 2 ** 31:\n"
- \. " tsabs = abs(timestamp)"
+ \. " tsabs = abs(timestamp)\n"
\. " return ('{\"_TYPE\": v:msgpack_types.integer,'\n"
\. " + '\"_VAL\": [{sign},{v1},{v2},{v3}]}').format(\n"
- \. " sign=1 if timestamp >= 0 else -1,\n"
+ \. " sign=(1 if timestamp >= 0 else -1),\n"
\. " v1=((tsabs >> 62) & 0x3),\n"
\. " v2=((tsabs >> 31) & (2 ** 31 - 1)),\n"
\. " v3=(tsabs & (2 ** 31 - 1)))\n"
@@ -601,13 +605,10 @@ function msgpack#eval(s, special_objs) abort
call add(expr, dec)
endif
endif
- elseif s =~# '-\?\%(inf\|nan\)'
- if s[0] is# '-'
- call add(expr, '-')
- let s = s[1:]
- endif
- call add(expr, s:MSGPACK_SPECIAL_OBJECTS[s[0:2]])
- let s = s[3:]
+ elseif s =~# '\v^\-%(inf|nan)'
+ call add(expr, '-')
+ call add(expr, s:MSGPACK_SPECIAL_OBJECTS[s[1:3]])
+ let s = s[4:]
elseif stridx('="+', s[0]) != -1
let match = matchlist(s, '\v\C^(\=|\+\((\-?\d+)\)|)(\"%(\\.|[^\\"]+)*\")')
if empty(match)
@@ -665,11 +666,15 @@ function msgpack#eval(s, special_objs) abort
call add(expr, ']}')
let s = s[1:]
elseif s[0] is# ''''
- let char = matchstr(s, '\m\C^''\zs.\ze''')
+ let char = matchstr(s, '\v\C^\''\zs%(\\\d+|.)\ze\''')
if empty(char)
throw 'char-invalid:Invalid integer character literal format: ' . s
endif
- call add(expr, char2nr(char))
+ if char[0] is# '\'
+ call add(expr, +char[1:])
+ else
+ call add(expr, char2nr(char))
+ endif
let s = s[len(char) + 2:]
else
throw 'unknown:Invalid non-space character: ' . s
diff --git a/runtime/autoload/netrw.vim b/runtime/autoload/netrw.vim
index 64c08e98fa..76485c2f38 100644
--- a/runtime/autoload/netrw.vim
+++ b/runtime/autoload/netrw.vim
@@ -1,7 +1,7 @@
" netrw.vim: Handles file transfer and remote directory listing across
" AUTOLOAD SECTION
-" Date: Feb 16, 2016
-" Version: 155 ASTRO-ONLY
+" Date: Apr 20, 2016
+" Version: 156
" Maintainer: Charles E Campbell <NdrOchip@ScampbellPfamily.AbizM-NOSPAM>
" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
" Copyright: Copyright (C) 2016 Charles E. Campbell {{{1
@@ -13,7 +13,7 @@
" expressed or implied. By using this plugin, you agree that
" in no event will the copyright holder be liable for any damages
" resulting from the use of this software.
-"redraw!|call DechoSep()|call inputsave()|call input("Press <cr> to continue")|call inputrestore(,'~'.expand("<slnum>"))
+"redraw!|call DechoSep()|call inputsave()|call input("Press <cr> to continue")|call inputrestore()
"
" But be doers of the Word, and not only hearers, deluding your own selves {{{1
" (James 1:22 RSV)
@@ -22,15 +22,15 @@
if &cp || exists("g:loaded_netrw")
finish
endif
-" netrw requires vim having patch 213; netrw will benefit from vim's having patch#656, too
-if v:version < 704 || !has("patch213")
+" netrw requires vim having patch 7.4.213; netrw will benefit from vim's having patch#656, too
+if v:version < 704 || (v:version == 704 && !has("patch213"))
if !exists("s:needpatch213")
unsilent echomsg "***sorry*** this version of netrw requires vim v7.4 with patch 213"
endif
let s:needpatch213= 1
finish
endif
-let g:loaded_netrw = "v155"
+let g:loaded_netrw = "v156"
if !exists("s:NOTE")
let s:NOTE = 0
let s:WARNING = 1
@@ -444,7 +444,7 @@ call s:NetrwInit("g:netrw_markfileesc" , '*./[\~')
call s:NetrwInit("g:netrw_maxfilenamelen", 32)
call s:NetrwInit("g:netrw_menu" , 1)
call s:NetrwInit("g:netrw_mkdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir")
-call s:NetrwInit("g:netrw_mousemaps" , (exists("+mouse") && &mouse =~ '[anh]'))
+call s:NetrwInit("g:netrw_mousemaps" , (exists("+mouse") && &mouse =~# '[anh]'))
call s:NetrwInit("g:netrw_retmap" , 0)
if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
@@ -490,6 +490,7 @@ if !exists("g:netrw_sort_sequence")
endif
call s:NetrwInit("g:netrw_special_syntax" , 0)
call s:NetrwInit("g:netrw_ssh_browse_reject", '^total\s\+\d\+$')
+call s:NetrwInit("g:netrw_suppress_gx_mesg", 1)
call s:NetrwInit("g:netrw_use_noswf" , 1)
call s:NetrwInit("g:netrw_sizestyle" ,"b")
" Default values - t-w ---------- {{{3
@@ -526,6 +527,7 @@ if has("gui_running") && (&enc == 'utf-8' || &enc == 'utf-16' || &enc == 'ucs-4'
else
let s:treedepthstring= "| "
endif
+call s:NetrwInit("s:netrw_nbcd",'{}')
" BufEnter event ignored by decho when following variable is true
" Has a side effect that doau BufReadPost doesn't work, so
@@ -551,7 +553,7 @@ if v:version >= 700 && has("balloon_eval") && !exists("s:initbeval") && !exists(
endif
au WinEnter * if &ft == "netrw"|call s:NetrwInsureWinVars()|endif
-if g:netrw_keepj =~ "keepj"
+if g:netrw_keepj =~# "keepj"
com! -nargs=* NetrwKeepj keepj <args>
else
let g:netrw_keepj= ""
@@ -821,7 +823,7 @@ fun! netrw#Explore(indx,dosplit,style,...)
let dirname= curfiledir
" call Decho("..empty dirname, using current file's directory<".dirname.">",'~'.expand("<slnum>"))
endif
- if dirname =~ '^scp://' || dirname =~ '^ftp://'
+ if dirname =~# '^scp://' || dirname =~ '^ftp://'
call netrw#Nread(2,dirname)
else
if dirname == ""
@@ -1560,15 +1562,7 @@ fun! s:NetrwOptionRestore(vt)
" call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> winnr($)=".winnr("$"))
" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo." a:vt=".a:vt,'~'.expand("<slnum>"))
if !exists("{a:vt}netrw_optionsave")
- if exists("s:nbcd_curpos_{bufnr('%')}")
-" call Decho("restoring posn to s:nbcd_curpos_".bufnr('%')."<".string(s:nbcd_curpos_{bufnr('%')}).">",'~'.expand("<slnum>"))
- NetrwKeepj call winrestview(s:nbcd_curpos_{bufnr('%')})
-" call Decho("win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> winnr($)=".winnr("$"),'~'.expand("<slnum>"))
-" call Decho("unlet s:nbcd_curpos_".bufnr('%'),'~'.expand("<slnum>"))
- unlet s:nbcd_curpos_{bufnr('%')}
- else
-" call Decho("no previous position",'~'.expand("<slnum>"))
- endif
+ call s:RestorePosn(s:netrw_nbcd)
" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo." a:vt=".a:vt,'~'.expand("<slnum>"))
" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
" call Dret("s:NetrwOptionRestore : ".a:vt."netrw_optionsave doesn't exist")
@@ -1656,16 +1650,7 @@ fun! s:NetrwOptionRestore(vt)
if exists("{a:vt}netrw_regstar") |sil! let @*= {a:vt}netrw_regstar |unlet {a:vt}netrw_regstar |endif
endif
if exists("{a:vt}netrw_regslash")|sil! let @/= {a:vt}netrw_regslash|unlet {a:vt}netrw_regslash|endif
- if exists("s:nbcd_curpos_{bufnr('%')}")
-" call Decho("restoring posn to s:nbcd_curpos_".bufnr('%')."<".string(s:nbcd_curpos_{bufnr('%')}).">",'~'.expand("<slnum>"))
- NetrwKeepj call winrestview(s:nbcd_curpos_{bufnr('%')})
-" call Decho("unlet s:nbcd_curpos_".bufnr('%'),'~'.expand("<slnum>"))
- if exists("s:nbcd_curpos_".bufnr('%'))
- unlet s:nbcd_curpos_{bufnr('%')}
- endif
- else
-" call Decho("no previous position",'~'.expand("<slnum>"))
- endif
+ call s:RestorePosn(s:netrw_nbcd)
" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd,'~'.expand("<slnum>"))
" call Decho("fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist"),'~'.expand("<slnum>"))
@@ -3016,10 +3001,10 @@ fun! s:NetrwMethod(choice)
if exists("s:netrw_hup[host]")
call NetUserPass("ftp:".host)
- elseif (has("win32") || has("win95") || has("win64") || has("win16")) && s:netrw_ftp_cmd =~ '-[sS]:'
+ elseif (has("win32") || has("win95") || has("win64") || has("win16")) && s:netrw_ftp_cmd =~# '-[sS]:'
" call Decho("has -s: : s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">",'~'.expand("<slnum>"))
" call Decho(" g:netrw_ftp_cmd<".g:netrw_ftp_cmd.">",'~'.expand("<slnum>"))
- if g:netrw_ftp_cmd =~ '-[sS]:\S*MACHINE\>'
+ if g:netrw_ftp_cmd =~# '-[sS]:\S*MACHINE\>'
let s:netrw_ftp_cmd= substitute(g:netrw_ftp_cmd,'\<MACHINE\>',g:netrw_machine,'')
" call Decho("s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">",'~'.expand("<slnum>"))
endif
@@ -3583,7 +3568,7 @@ fun! s:NetrwBrowse(islocal,dirname)
" This is useful when one edits a local file, then :e ., then :Rex
if a:islocal && !exists("w:netrw_rexfile") && bufname("#") != ""
let w:netrw_rexfile= bufname("#")
-" call Decho("setting w:netrw_rexfile<".w:netrw_rexfile."> win#".winnr())
+" call Decho("setting w:netrw_rexfile<".w:netrw_rexfile."> win#".winnr(),'~'.expand("<slnum>"))
endif
" s:NetrwBrowse : initialize history {{{3
@@ -3773,7 +3758,7 @@ fun! s:NetrwBrowse(islocal,dirname)
" analyze dirname and g:netrw_list_cmd {{{3
" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> dirname<".dirname.">",'~'.expand("<slnum>"))
- if dirname =~ "^NetrwTreeListing\>"
+ if dirname =~# "^NetrwTreeListing\>"
let dirname= b:netrw_curdir
" call Decho("(dirname was <NetrwTreeListing>) dirname<".dirname.">",'~'.expand("<slnum>"))
elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
@@ -3854,15 +3839,15 @@ endfun
" directory is used.
fun! s:NetrwFile(fname)
" call Dfunc("s:NetrwFile(fname<".a:fname.">) win#".winnr())
-" call Decho("g:netrw_keepdir =".(exists("g:netrw_keepdir")? g:netrw_keepdir : 'n/a'))
-" call Decho("g:netrw_cygwin =".(exists("g:netrw_cygwin")? g:netrw_cygwin : 'n/a'))
-" call Decho("g:netrw_liststyle=".(exists("g:netrw_liststyle")? g:netrw_liststyle : 'n/a'))
-" call Decho("w:netrw_liststyle=".(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'))
+" call Decho("g:netrw_keepdir =".(exists("g:netrw_keepdir")? g:netrw_keepdir : 'n/a'),'~'.expand("<slnum>"))
+" call Decho("g:netrw_cygwin =".(exists("g:netrw_cygwin")? g:netrw_cygwin : 'n/a'),'~'.expand("<slnum>"))
+" call Decho("g:netrw_liststyle=".(exists("g:netrw_liststyle")? g:netrw_liststyle : 'n/a'),'~'.expand("<slnum>"))
+" call Decho("w:netrw_liststyle=".(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'),'~'.expand("<slnum>"))
" clean up any leading treedepthstring
if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
let fname= substitute(a:fname,'^'.s:treedepthstring.'\+','','')
-" call Decho("clean up any leading treedepthstring: fname<".fname.">")
+" call Decho("clean up any leading treedepthstring: fname<".fname.">",'~'.expand("<slnum>"))
else
let fname= a:fname
endif
@@ -3897,6 +3882,8 @@ fun! s:NetrwFile(fname)
" vim and netrw agree on the current directory
let ret= fname
" call Decho("vim and netrw agree on current directory (g:netrw_keepdir=".g:netrw_keepdir.")",'~'.expand("<slnum>"))
+" call Decho("vim directory: ".getcwd(),'~'.expand("<slnum>"))
+" call Decho("netrw directory: ".(exists("b:netrw_curdir")? b:netrw_curdir : 'n/a'),'~'.expand("<slnum>"))
endif
" call Dret("s:NetrwFile ".ret)
@@ -3910,9 +3897,9 @@ fun! s:NetrwFileInfo(islocal,fname)
let ykeep= @@
if a:islocal
let lsopt= "-lsad"
- if g:netrw_sizestyle =~ 'H'
+ if g:netrw_sizestyle =~# 'H'
let lsopt= "-lsadh"
- elseif g:netrw_sizestyle =~ 'h'
+ elseif g:netrw_sizestyle =~# 'h'
let lsopt= "-lsadh --si"
endif
if (has("unix") || has("macunix")) && executable("/bin/ls")
@@ -3944,7 +3931,7 @@ fun! s:NetrwFileInfo(islocal,fname)
endif
let t = getftime(s:NetrwFile(fname))
let sz = getfsize(s:NetrwFile(fname))
- if g:netrw_sizestyle =~ "[hH]"
+ if g:netrw_sizestyle =~# "[hH]"
let sz= s:NetrwHumanReadable(sz)
endif
echo a:fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(s:NetrwFile(fname)))
@@ -3958,108 +3945,49 @@ fun! s:NetrwFileInfo(islocal,fname)
endfun
" ---------------------------------------------------------------------
+" s:NetrwFullPath: returns the full path to a directory and/or file {{{2
+fun! s:NetrwFullPath(filename)
+" " call Dfunc("s:NetrwFullPath(filename<".a:filename.">)")
+ let filename= a:filename
+ if filename !~ '^/'
+ let filename= resolve(getcwd().'/'.filename)
+ endif
+ if filename != "/" && filename =~ '/$'
+ let filename= substitute(filename,'/$','','')
+ endif
+" " call Dret("s:NetrwFullPath <".filename.">")
+ return filename
+endfun
+
+" ---------------------------------------------------------------------
" s:NetrwGetBuffer: {{{2
" returns 0=cleared buffer
" 1=re-used buffer (buffer not cleared)
fun! s:NetrwGetBuffer(islocal,dirname)
" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle)
" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo,'~'.expand("<slnum>"))
+" call Decho("netrwbuf dictionary=".string(s:netrwbuf),'~'.expand("<slnum>"))
let dirname= a:dirname
" re-use buffer if possible {{{3
" call Decho("--re-use a buffer if possible--",'~'.expand("<slnum>"))
- if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
- " find NetrwTreeList buffer if there is one
-" call Decho("case liststyle=treelist: find NetrwTreeList buffer if there is one",'~'.expand("<slnum>"))
- if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0
-" call Decho(" re-using w:netrw_treebufnr=".w:netrw_treebufnr,'~'.expand("<slnum>"))
- let eikeep= &ei
- setl ei=all
- exe "sil! keepj noswapfile keepalt b ".w:netrw_treebufnr
- let &ei= eikeep
- setl ma
- sil! NetrwKeepj %d _
-" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo,'~'.expand("<slnum>"))
-" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
-" call Dret("s:NetrwGetBuffer 0<buffer cleared> : bufnum#".w:netrw_treebufnr."<NetrwTreeListing>")
- return 0
+ if !exists("s:netrwbuf")
+ let s:netrwbuf= {}
+ endif
+ if has_key(s:netrwbuf,s:NetrwFullPath(dirname))
+ let bufnum= s:netrwbuf[s:NetrwFullPath(dirname)]
+" call Decho("lookup netrwbuf dictionary: s:netrwbuf[".s:NetrwFullPath(dirname)."]=".bufnum)
+ if !bufexists(bufnum)
+ call remove(s:netrwbuf,s:NetrwFullPath(dirname))
+ let bufnum= -1
endif
- let bufnum= -1
-" call Decho(" liststyle=TREE but w:netrw_treebufnr doesn't exist",'~'.expand("<slnum>"))
-
else
- " find buffer number of buffer named precisely the same as dirname {{{3
-" call Decho("case listtyle not treelist: find buffer numnber of buffer named precisely the same as dirname--",'~'.expand("<slnum>"))
-" call Dredir("(NetrwGetBuffer) ls!","ls!")
-
- " get dirname and associated buffer number
- let bufnum = bufnr(escape(dirname,'\'))
-" call Decho(" find buffer<".dirname.">'s number ",'~'.expand("<slnum>"))
-" call Decho(" bufnr(dirname<".escape(dirname,'\').">)=".bufnum,'~'.expand("<slnum>"))
-
- if bufnum < 0 && dirname !~ '/$'
- " try appending a trailing /
-" call Decho(" try appending a trailing / to dirname<".dirname.">",'~'.expand("<slnum>"))
- let bufnum= bufnr(escape(dirname.'/','\'))
- if bufnum > 0
- let dirname= dirname.'/'
- endif
- endif
-
- if bufnum < 0 && dirname =~ '/$'
- " try removing a trailing /
-" call Decho(" try removing a trailing / from dirname<".dirname.">",'~'.expand("<slnum>"))
- let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\'))
- if bufnum > 0
- let dirname= substitute(dirname,'/$','','')
- endif
- endif
-
-" call Decho(" findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)",'~'.expand("<slnum>"))
- " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/ and abc/ matches)
- if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.'
- " handle approximate matches
-" call Decho(" handling approx match: bufnum#".bufnum.">0 AND bufname<".bufname(bufnum).">!=dirname<".dirname."> AND bufname(".bufnum.")!='.'",'~'.expand("<slnum>"))
- let ibuf = 1
- let buflast = bufnr("$")
-" call Decho(" findbuf2: buflast=bufnr($)=".buflast,'~'.expand("<slnum>"))
- while ibuf <= buflast
- let bname= substitute(bufname(ibuf),'\\','/','g')
- let bname= substitute(bname,'.\zs/$','','')
-" call Decho(" findbuf3: while [ibuf=",ibuf."]<=[buflast=".buflast."]: dirname<".dirname."> bname=bufname(".ibuf.")<".bname.">",'~'.expand("<slnum>"))
- if bname != '' && dirname =~ '/'.bname.'/\=$' && dirname !~ '^/'
- " bname is not empty
- " dirname ends with bname,
- " dirname doesn't start with /, so its not a absolute path
-" call Decho(" findbuf3a: passes test 1 : dirname<".dirname.'> =~ /'.bname.'/\=$ && dirname !~ ^/','~'.expand("<slnum>"))
- break
- endif
- if bname =~ '^'.dirname.'/\=$'
- " bname begins with dirname
-" call Decho(' findbuf3b: passes test 2 : bname<'.bname.'>=~^'.dirname.'/\=$','~'.expand("<slnum>"))
- break
- endif
- if dirname =~ '^'.bname.'/$'
-" call Decho(' findbuf3c: passes test 3 : dirname<'.dirname.'>=~^'.bname.'/$','~'.expand("<slnum>"))
- break
- endif
- if bname != '' && dirname =~ '/'.bname.'$' && bname == bufname("%") && line("$") == 1
-" call Decho(' findbuf3d: passes test 4 : dirname<'.dirname.'>=~ /'.bname.'$','~'.expand("<slnum>"))
- break
- endif
- let ibuf= ibuf + 1
- endwhile
- if ibuf > buflast
- let bufnum= -1
- else
- let bufnum= ibuf
- endif
-" call Decho(" findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")",'~'.expand("<slnum>"))
- endif
+" call Decho("lookup netrwbuf dictionary: s:netrwbuf[".s:NetrwFullPath(dirname)."] not a key")
+ let bufnum= -1
endif
" get enew buffer and name it -or- re-use buffer {{{3
- if bufnum < 0 || !bufexists(bufnum) " get enew buffer and name it
+ if bufnum < 0 " get enew buffer and name it
" call Decho("--get enew buffer and name it (bufnum#".bufnum."<0 OR bufexists(".bufnum.")=".bufexists(bufnum)."==0)",'~'.expand("<slnum>"))
call s:NetrwEnew(dirname)
" call Decho(" got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)",'~'.expand("<slnum>"))
@@ -4093,6 +4021,10 @@ fun! s:NetrwGetBuffer(islocal,dirname)
" let v:errmsg= "" " Decho
exe 'sil! keepj keepalt file '.escdirname
" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">",'~'.expand("<slnum>"))
+ " enter the new buffer into the s:netrwbuf dictionary
+ let s:netrwbuf[s:NetrwFullPath(dirname)]= bufnr("%")
+" call Decho("update netrwbuf dictionary: s:netrwbuf[".s:NetrwFullPath(dirname)."]=".bufnr("%"),'~'.expand("<slnum>"))
+" call Decho("netrwbuf dictionary=".string(s:netrwbuf),'~'.expand("<slnum>"))
endif
" call Decho(" named enew buffer#".bufnr("%")."<".bufname("%").">",'~'.expand("<slnum>"))
@@ -4100,7 +4032,7 @@ fun! s:NetrwGetBuffer(islocal,dirname)
" call Decho("--re-use buffer#".bufnum." (bufnum#".bufnum.">=0 AND bufexists(".bufnum.")=".bufexists(bufnum)."!=0)",'~'.expand("<slnum>"))
let eikeep= &ei
setl ei=all
- if getline(2) =~ '^" Netrw Directory Listing'
+ if getline(2) =~# '^" Netrw Directory Listing'
" call Decho(" getline(2)<".getline(2).'> matches "Netrw Directory Listing" : using keepalt b '.bufnum,'~'.expand("<slnum>"))
exe "sil! NetrwKeepj noswapfile keepalt b ".bufnum
else
@@ -4215,20 +4147,20 @@ fun! s:NetrwGetWord()
let dirname= "./"
let curline= getline('.')
- if curline =~ '"\s*Sorted by\s'
+ if curline =~# '"\s*Sorted by\s'
NetrwKeepj norm s
let s:netrw_skipbrowse= 1
echo 'Pressing "s" also works'
- elseif curline =~ '"\s*Sort sequence:'
+ elseif curline =~# '"\s*Sort sequence:'
let s:netrw_skipbrowse= 1
echo 'Press "S" to edit sorting sequence'
- elseif curline =~ '"\s*Quick Help:'
+ elseif curline =~# '"\s*Quick Help:'
NetrwKeepj norm ?
let s:netrw_skipbrowse= 1
- elseif curline =~ '"\s*\%(Hiding\|Showing\):'
+ elseif curline =~# '"\s*\%(Hiding\|Showing\):'
NetrwKeepj norm a
let s:netrw_skipbrowse= 1
echo 'Pressing "a" also works'
@@ -4471,10 +4403,10 @@ fun! s:NetrwBookmark(del,...)
let i = 1
while i <= a:0
if islocal
- if v:version == 704 && has("patch656")
- let mbfiles= glob(a:{i},0,1,1)
+ if v:version > 704 || (v:version == 704 && has("patch656"))
+ let mbfiles= glob(fnameescape(a:{i}),0,1,1)
else
- let mbfiles= glob(a:{i},0,1)
+ let mbfiles= glob(fnameescape(a:{i}),0,1)
endif
else
let mbfiles= [a:{i}]
@@ -4578,14 +4510,13 @@ fun! s:NetrwBrowseChgDir(islocal,newdir,...)
" call Dret("s:NetrwBrowseChgDir")
return
endif
+" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
" NetrwBrowseChgDir: save options and initialize {{{3
" call Decho("saving options",'~'.expand("<slnum>"))
+ call s:SavePosn(s:netrw_nbcd)
NetrwKeepj call s:NetrwOptionSave("s:")
NetrwKeepj call s:NetrwSafeOptions()
- let nbcd_curpos = winsaveview()
-" call Decho("saving posn to nbcd_curpos<".string(nbcd_curpos).">",'~'.expand("<slnum>"))
- let s:nbcd_curpos_{bufnr('%')} = nbcd_curpos
if (has("win32") || has("win95") || has("win64") || has("win16"))
let dirname = substitute(b:netrw_curdir,'\\','/','ge')
else
@@ -4601,15 +4532,14 @@ fun! s:NetrwBrowseChgDir(islocal,newdir,...)
if g:netrw_banner
" call Decho("w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'n/a')." line(.)#".line('.')." line($)#".line("#"),'~'.expand("<slnum>"))
if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt && line("$") >= w:netrw_bannercnt
- if getline(".") =~ 'Quick Help'
+ if getline(".") =~# 'Quick Help'
" call Decho("#1: quickhelp=".g:netrw_quickhelp." ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
let g:netrw_quickhelp= (g:netrw_quickhelp + 1)%len(s:QuickHelp)
" call Decho("#2: quickhelp=".g:netrw_quickhelp." ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
setl ma noro nowrap
NetrwKeepj call setline(line('.'),'" Quick Help: <F1>:help '.s:QuickHelp[g:netrw_quickhelp])
setl noma nomod nowrap
-" call Decho("restoring posn to nbcd_curpos<".string(nbcd_curpos).">",'~'.expand("<slnum>"))
- NetrwKeepj call winrestview(nbcd_curpos)
+ call s:RestorePosn(s:netrw_nbcd)
NetrwKeepj call s:NetrwOptionRestore("s:")
" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
endif
@@ -4633,7 +4563,7 @@ fun! s:NetrwBrowseChgDir(islocal,newdir,...)
" call Decho("adjusting dirname<".dirname.'> (put trailing "/" back)','~'.expand("<slnum>"))
endif
-" " call Decho("[newdir<".newdir."> ".((newdir =~ dirpat)? "=~" : "!~")." dirpat<".dirpat.">] && [islocal=".a:islocal."] && [newdir is ".(isdirectory(s:NetrwFile(newdir))? "" : "not ")."a directory]",'~'.expand("<slnum>"))
+" call Decho("[newdir<".newdir."> ".((newdir =~ dirpat)? "=~" : "!~")." dirpat<".dirpat.">] && [islocal=".a:islocal."] && [newdir is ".(isdirectory(s:NetrwFile(newdir))? "" : "not ")."a directory]",'~'.expand("<slnum>"))
if newdir !~ dirpat && !(a:islocal && isdirectory(s:NetrwFile(s:ComposePath(dirname,newdir))))
" ------------------------------
" NetrwBrowseChgDir: edit a file {{{3
@@ -4658,7 +4588,7 @@ fun! s:NetrwBrowseChgDir(islocal,newdir,...)
" call Decho("edit-a-file: dirname<".dirname.">",'~'.expand("<slnum>"))
" call Decho("edit-a-file: tree listing",'~'.expand("<slnum>"))
elseif newdir =~ '^\(/\|\a:\)'
-" call Decho("edit-a-file: handle an url or path starting with /: <".newdir.">")
+" call Decho("edit-a-file: handle an url or path starting with /: <".newdir.">",'~'.expand("<slnum>"))
let dirname= newdir
else
let dirname= s:ComposePath(dirname,newdir)
@@ -4685,7 +4615,7 @@ fun! s:NetrwBrowseChgDir(islocal,newdir,...)
if !&ea
keepalt wincmd _
endif
- call s:SetRexDir(a:islocal,b:netrw_curdir)
+ call s:SetRexDir(a:islocal,curdir)
elseif g:netrw_browse_split == 2
" vertically splitting the window first
" call Decho("edit-a-file: vertically splitting window prior to edit",'~'.expand("<slnum>"))
@@ -4693,12 +4623,15 @@ fun! s:NetrwBrowseChgDir(islocal,newdir,...)
if !&ea
keepalt wincmd |
endif
- call s:SetRexDir(a:islocal,b:netrw_curdir)
+ call s:SetRexDir(a:islocal,curdir)
elseif g:netrw_browse_split == 3
" open file in new tab
" call Decho("edit-a-file: opening new tab prior to edit",'~'.expand("<slnum>"))
keepalt tabnew
- call s:SetRexDir(a:islocal,b:netrw_curdir)
+ if !exists("b:netrw_curdir")
+ let b:netrw_curdir= getcwd()
+ endif
+ call s:SetRexDir(a:islocal,curdir)
elseif g:netrw_browse_split == 4
" act like "P" (ie. open previous window)
" call Decho("edit-a-file: use previous window for edit",'~'.expand("<slnum>"))
@@ -4707,7 +4640,7 @@ fun! s:NetrwBrowseChgDir(islocal,newdir,...)
" call Dret("s:NetrwBrowseChgDir")
return
endif
- call s:SetRexDir(a:islocal,b:netrw_curdir)
+ call s:SetRexDir(a:islocal,curdir)
else
" handling a file, didn't split, so remove menu
" call Decho("edit-a-file: handling a file+didn't split, so remove menu",'~'.expand("<slnum>"))
@@ -4860,7 +4793,7 @@ fun! s:NetrwBrowseChgDir(islocal,newdir,...)
endif
let treedir = s:NetrwTreeDir(a:islocal)
" call Decho("tree-list: treedir<".treedir.">",'~'.expand("<slnum>"))
- let s:treecurpos = nbcd_curpos
+ let s:treecurpos = winsaveview()
let haskey = 0
" call Decho("tree-list: w:netrw_treedict<".string(w:netrw_treedict).">",'~'.expand("<slnum>"))
@@ -4936,6 +4869,7 @@ fun! s:NetrwBrowseChgDir(islocal,newdir,...)
" else " Decho
" call Decho("skipping option restore (dorestore==0): hidden=".&hidden." bufhidden=".&bufhidden." mod=".&mod,'~'.expand("<slnum>"))
endif
+ call s:RestorePosn(s:netrw_nbcd)
if dolockout && dorestore
" call Decho("restore: filewritable(dirname<".dirname.">)=".filewritable(dirname),'~'.expand("<slnum>"))
if filewritable(dirname)
@@ -4971,6 +4905,10 @@ fun! s:NetrwBrowseUpDir(islocal)
return
endif
+ if !exists("w:netrw_liststyle") || w:netrw_liststyle != s:TREELIST
+ call s:SavePosn(s:netrw_nbcd)
+ endif
+
norm! 0
if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
" call Decho("case: treestyle",'~'.expand("<slnum>"))
@@ -5010,7 +4948,9 @@ fun! s:NetrwBrowseUpDir(islocal)
else
call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,'../'))
endif
- if exists("w:netrw_bannercnt")
+ if has_key(s:netrw_nbcd,bufnr("%"))
+ call s:RestorePosn(s:netrw_nbcd)
+ elseif exists("w:netrw_bannercnt")
" call Decho("moving to line#".w:netrw_bannercnt,'~'.expand("<slnum>"))
exe w:netrw_bannercnt
else
@@ -5106,17 +5046,20 @@ fun! netrw#BrowseX(fname,remote)
" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten),'~'.expand("<slnum>"))
- " set up redirection
- if &srr =~ "%s"
- if (has("win32") || has("win95") || has("win64") || has("win16"))
- let redir= substitute(&srr,"%s","nul","")
+ " set up redirection (avoids browser messages)
+ " by default, g:netrw_suppress_gx_mesg is true
+ if g:netrw_suppress_gx_mesg
+ if &srr =~ "%s"
+ if (has("win32") || has("win95") || has("win64") || has("win16"))
+ let redir= substitute(&srr,"%s","nul","")
+ else
+ let redir= substitute(&srr,"%s","/dev/null","")
+ endif
+ elseif (has("win32") || has("win95") || has("win64") || has("win16"))
+ let redir= &srr . "nul"
else
- let redir= substitute(&srr,"%s","/dev/null","")
+ let redir= &srr . "/dev/null"
endif
- elseif (has("win32") || has("win95") || has("win64") || has("win16"))
- let redir= &srr . "nul"
- else
- let redir= &srr . "/dev/null"
endif
" call Decho("set up redirection: redir{".redir."} srr{".&srr."}",'~'.expand("<slnum>"))
@@ -5377,8 +5320,12 @@ endfun
" ---------------------------------------------------------------------
" s:NetrwGlob: does glob() if local, remote listing otherwise {{{2
-fun! s:NetrwGlob(direntry,expr)
-" call Dfunc("s:NetrwGlob(direntry<".a:direntry."> expr<".a:expr.">)")
+" direntry: this is the name of the directory. Will be fnameescape'd to prevent wildcard handling by glob()
+" expr : this is the expression to follow the directory. Will use s:ComposePath()
+" pare =1: remove the current directory from the resulting glob() filelist
+" =0: leave the current directory in the resulting glob() filelist
+fun! s:NetrwGlob(direntry,expr,pare)
+" call Dfunc("s:NetrwGlob(direntry<".a:direntry."> expr<".a:expr."> pare=".a:pare.")")
if netrw#CheckIfRemote()
keepalt 1sp
keepalt enew
@@ -5393,9 +5340,16 @@ fun! s:NetrwGlob(direntry,expr)
let filelist= w:netrw_treedict[a:direntry]
endif
let w:netrw_liststyle= keep_liststyle
+ elseif v:version > 704 || (v:version == 704 && has("patch656"))
+ let filelist= glob(s:ComposePath(fnameescape(a:direntry),a:expr),0,1,1)
+ if a:pare
+ let filelist= map(filelist,'substitute(v:val, "^.*/", "", "")')
+ endif
else
- let filelist= glob(s:ComposePath(a:direntry,a:expr),0,1,1)
- let filelist= map(filelist,'substitute(v:val, "^.*/", "", "")')
+ let filelist= glob(s:ComposePath(fnameescape(a:direntry),a:expr),0,1)
+ if a:pare
+ let filelist= map(filelist,'substitute(v:val, "^.*/", "", "")')
+ endif
endif
" call Dret("s:NetrwGlob ".string(filelist))
return filelist
@@ -6087,7 +6041,7 @@ fun! s:NetrwMaps(islocal)
nnoremap <buffer> <silent> <nowait> qf :<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
nnoremap <buffer> <silent> <nowait> qF :<c-u>call <SID>NetrwMarkFileQFEL(1,getqflist())<cr>
nnoremap <buffer> <silent> <nowait> qL :<c-u>call <SID>NetrwMarkFileQFEL(1,getloclist(v:count))<cr>
- nnoremap <buffer> <silent> <nowait> r :<c-u>let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
+ nnoremap <buffer> <silent> <nowait> r :<c-u>let g:netrw_sort_direction= (g:netrw_sort_direction =~# 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
nnoremap <buffer> <silent> <nowait> s :call <SID>NetrwSortStyle(1)<cr>
nnoremap <buffer> <silent> <nowait> S :<c-u>call <SID>NetSortSequence(1)<cr>
nnoremap <buffer> <silent> <nowait> Tb :<c-u>call <SID>NetrwSetTgt(1,'b',v:count1)<cr>
@@ -6140,7 +6094,7 @@ fun! s:NetrwMaps(islocal)
" inoremap <buffer> <silent> <nowait> qf <c-o>:<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
" inoremap <buffer> <silent> <nowait> qF :<c-u>call <SID>NetrwMarkFileQFEL(1,getqflist())<cr>
" inoremap <buffer> <silent> <nowait> qL :<c-u>call <SID>NetrwMarkFileQFEL(1,getloclist(v:count))<cr>
-" inoremap <buffer> <silent> <nowait> r <c-o>:let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
+" inoremap <buffer> <silent> <nowait> r <c-o>:let g:netrw_sort_direction= (g:netrw_sort_direction =~# 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
" inoremap <buffer> <silent> <nowait> s <c-o>:call <SID>NetrwSortStyle(1)<cr>
" inoremap <buffer> <silent> <nowait> S <c-o>:call <SID>NetSortSequence(1)<cr>
" inoremap <buffer> <silent> <nowait> t <c-o>:call <SID>NetrwSplit(4)<cr>
@@ -6261,7 +6215,7 @@ fun! s:NetrwMaps(islocal)
nnoremap <buffer> <silent> <nowait> qf :<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
nnoremap <buffer> <silent> <nowait> qF :<c-u>call <SID>NetrwMarkFileQFEL(0,getqflist())<cr>
nnoremap <buffer> <silent> <nowait> qL :<c-u>call <SID>NetrwMarkFileQFEL(0,getloclist(v:count))<cr>
- nnoremap <buffer> <silent> <nowait> r :<c-u>let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
+ nnoremap <buffer> <silent> <nowait> r :<c-u>let g:netrw_sort_direction= (g:netrw_sort_direction =~# 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
nnoremap <buffer> <silent> <nowait> s :call <SID>NetrwSortStyle(0)<cr>
nnoremap <buffer> <silent> <nowait> S :<c-u>call <SID>NetSortSequence(0)<cr>
nnoremap <buffer> <silent> <nowait> Tb :<c-u>call <SID>NetrwSetTgt(0,'b',v:count1)<cr>
@@ -6311,7 +6265,7 @@ fun! s:NetrwMaps(islocal)
" inoremap <buffer> <silent> <nowait> qf <c-o>:<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
" inoremap <buffer> <silent> <nowait> qF :<c-u>call <SID>NetrwMarkFileQFEL(0,getqflist())<cr>
" inoremap <buffer> <silent> <nowait> qL :<c-u>call <SID>NetrwMarkFileQFEL(0,getloclist(v:count))<cr>
-" inoremap <buffer> <silent> <nowait> r <c-o>:let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
+" inoremap <buffer> <silent> <nowait> r <c-o>:let g:netrw_sort_direction= (g:netrw_sort_direction =~# 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
" inoremap <buffer> <silent> <nowait> s <c-o>:call <SID>NetrwSortStyle(0)<cr>
" inoremap <buffer> <silent> <nowait> S <c-o>:call <SID>NetSortSequence(0)<cr>
" inoremap <buffer> <silent> <nowait> t <c-o>:call <SID>NetrwSplit(1)<cr>
@@ -6415,10 +6369,10 @@ fun! s:NetrwMarkFiles(islocal,...)
let i = 1
while i <= a:0
if a:islocal
- if v:version == 704 && has("patch656")
- let mffiles= glob(a:{i},0,1,1)
+ if v:version > 704 || (v:version == 704 && has("patch656"))
+ let mffiles= glob(fnameescape(a:{i}),0,1,1)
else
- let mffiles= glob(a:{i},0,1)
+ let mffiles= glob(fnameescape(a:{i}),0,1)
endif
else
let mffiles= [a:{i}]
@@ -6894,6 +6848,8 @@ fun! s:NetrwMarkFileCopy(islocal,...)
" cleanup
" -------
" call Decho("cleanup",'~'.expand("<slnum>"))
+ " remove markings from local buffer
+ call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer
" call Decho(" g:netrw_fastbrowse =".g:netrw_fastbrowse,'~'.expand("<slnum>"))
" call Decho(" s:netrwmftgt =".s:netrwmftgt,'~'.expand("<slnum>"))
" call Decho(" s:netrwmftgt_islocal=".s:netrwmftgt_islocal,'~'.expand("<slnum>"))
@@ -7373,7 +7329,7 @@ fun! s:NetrwMarkFileGrep(islocal)
if exists("nonisi")
" original, user-supplied pattern did not begin with a character from isident
" call Decho("looking for trailing nonisi<".nonisi."> followed by a j, gj, or jg",'~'.expand("<slnum>"))
- if pat =~ nonisi.'j$\|'.nonisi.'gj$\|'.nonisi.'jg$'
+ if pat =~# nonisi.'j$\|'.nonisi.'gj$\|'.nonisi.'jg$'
call s:NetrwMarkFileQFEL(a:islocal,getqflist())
endif
endif
@@ -7571,7 +7527,7 @@ fun! s:NetrwMarkFileRegexp(islocal)
" get the matching list of files using local glob()
" call Decho("handle local regexp",'~'.expand("<slnum>"))
let dirname = escape(b:netrw_curdir,g:netrw_glob_escape)
- if v:version == 704 && has("patch656")
+ if v:version > 704 || (v:version == 704 && has("patch656"))
let files = glob(s:ComposePath(dirname,regexp),0,0,1)
else
let files = glob(s:ComposePath(dirname,regexp),0,0)
@@ -7788,7 +7744,7 @@ fun! s:NetrwMarkFileTgt(islocal)
" need to do refresh so that the banner will be updated
" s:LocalBrowseRefresh handles all local-browsing buffers when not fast browsing
if g:netrw_fastbrowse <= 1
-" call Decho("g:netrw_fastbrowse=".g:netrw_fastbrowse.", so refreshing all local netrw buffers")
+" call Decho("g:netrw_fastbrowse=".g:netrw_fastbrowse.", so refreshing all local netrw buffers",'~'.expand("<slnum>"))
call s:LocalBrowseRefresh()
endif
" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
@@ -7821,10 +7777,10 @@ fun! s:NetrwGetCurdir(islocal)
" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)",'~'.expand("<slnum>"))
endif
-" call Decho("b:netrw_curdir<".b:netrw_curdir."> ".((b:netrw_curdir !~ '\<\a\{3,}://')? "does not match" : "matches")." url pattern")
+" call Decho("b:netrw_curdir<".b:netrw_curdir."> ".((b:netrw_curdir !~ '\<\a\{3,}://')? "does not match" : "matches")." url pattern",'~'.expand("<slnum>"))
if b:netrw_curdir !~ '\<\a\{3,}://'
let curdir= b:netrw_curdir
-" call Decho("g:netrw_keepdir=".g:netrw_keepdir)
+" call Decho("g:netrw_keepdir=".g:netrw_keepdir,'~'.expand("<slnum>"))
if g:netrw_keepdir == 0
call s:NetrwLcd(curdir)
endif
@@ -8125,7 +8081,7 @@ fun! s:NetrwMenu(domenu)
elseif !a:domenu
let s:netrwcnt = 0
let curwin = winnr()
- windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
+ windo if getline(2) =~# "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
exe curwin."wincmd w"
if s:netrwcnt <= 1
@@ -8708,7 +8664,7 @@ fun! s:NetrwSortStyle(islocal)
let svpos= winsaveview()
" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
- let g:netrw_sort_by= (g:netrw_sort_by =~ '^n')? 'time' : (g:netrw_sort_by =~ '^t')? 'size' : (g:netrw_sort_by =~ '^siz')? 'exten' : 'name'
+ let g:netrw_sort_by= (g:netrw_sort_by =~# '^n')? 'time' : (g:netrw_sort_by =~# '^t')? 'size' : (g:netrw_sort_by =~# '^siz')? 'exten' : 'name'
NetrwKeepj norm! 0
NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
@@ -8811,7 +8767,6 @@ fun! s:NetrwSplit(mode)
let s:didsplit= 1
NetrwKeepj call s:RestoreWinVars()
NetrwKeepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
- "call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
unlet s:didsplit
else
@@ -8890,9 +8845,9 @@ endfun
" (full path directory with trailing slash returned)
fun! s:NetrwTreeDir(islocal)
" call Dfunc("s:NetrwTreeDir(islocal=".a:islocal.") getline(".line(".").")"."<".getline('.')."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> ft=".&ft)
-" call Decho("g:netrw_keepdir =".(exists("g:netrw_keepdir")? g:netrw_keepdir : 'n/a'))
-" call Decho("w:netrw_liststyle=".(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'))
-" call Decho("w:netrw_treetop =".(exists("w:netrw_treetop")? w:netrw_treetop : 'n/a'))
+" call Decho("g:netrw_keepdir =".(exists("g:netrw_keepdir")? g:netrw_keepdir : 'n/a'),'~'.expand("<slnum>"))
+" call Decho("w:netrw_liststyle=".(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'),'~'.expand("<slnum>"))
+" call Decho("w:netrw_treetop =".(exists("w:netrw_treetop")? w:netrw_treetop : 'n/a'),'~'.expand("<slnum>"))
if exists("s:treedir")
" s:NetrwPrevWinOpen opens a "previous" window -- and thus needs to and does call s:NetrwTreeDir early
@@ -8933,7 +8888,7 @@ fun! s:NetrwTreeDir(islocal)
" detect user attempting to close treeroot
" call Decho("check if user is attempting to close treeroot",'~'.expand("<slnum>"))
" call Decho(".win#".winnr()." buf#".bufnr("%")."<".bufname("%").">",'~'.expand("<slnum>"))
-" call Decho(".getline(".line(".").")<".getline('.').'> '.((getline('.') =~ '^'.s:treedepthstring)? '=~' : '!~').' ^'.s:treedepthstring,'~'.expand("<slnum>"))
+" call Decho(".getline(".line(".").")<".getline('.').'> '.((getline('.') =~# '^'.s:treedepthstring)? '=~#' : '!~').' ^'.s:treedepthstring,'~'.expand("<slnum>"))
if curline !~ '^'.s:treedepthstring && getline('.') != '..'
" call Decho(".user may have attempted to close treeroot",'~'.expand("<slnum>"))
" now force a refresh
@@ -9040,24 +8995,24 @@ fun! s:NetrwRefreshTreeDict(dir)
if entry =~ '/$' && has_key(w:netrw_treedict,direntry)
" call Decho("<".direntry."> is a key in treedict - display subtree for it",'~'.expand("<slnum>"))
NetrwKeepj call s:NetrwRefreshTreeDict(direntry)
- let liststar = s:NetrwGlob(direntry,'*')
- let listdotstar = s:NetrwGlob(direntry,'.*')
+ let liststar = s:NetrwGlob(direntry,'*',1)
+ let listdotstar = s:NetrwGlob(direntry,'.*',1)
let w:netrw_treedict[direntry] = liststar + listdotstar
" call Decho("updating w:netrw_treedict[".direntry.']='.string(w:netrw_treedict[direntry]),'~'.expand("<slnum>"))
elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/')
" call Decho("<".direntry."/> is a key in treedict - display subtree for it",'~'.expand("<slnum>"))
NetrwKeepj call s:NetrwRefreshTreeDict(direntry.'/')
- let liststar = s:NetrwGlob(direntry.'/','*')
- let listdotstar= s:NetrwGlob(direntry.'/','.*')
+ let liststar = s:NetrwGlob(direntry.'/','*',1)
+ let listdotstar= s:NetrwGlob(direntry.'/','.*',1)
let w:netrw_treedict[direntry]= liststar + listdotstar
" call Decho("updating w:netrw_treedict[".direntry.']='.string(w:netrw_treedict[direntry]),'~'.expand("<slnum>"))
elseif entry =~ '@$' && has_key(w:netrw_treedict,direntry.'@')
" call Decho("<".direntry."/> is a key in treedict - display subtree for it",'~'.expand("<slnum>"))
NetrwKeepj call s:NetrwRefreshTreeDict(direntry.'/')
- let liststar = s:NetrwGlob(direntry.'/','*')
- let listdotstar= s:NetrwGlob(direntry.'/','.*')
+ let liststar = s:NetrwGlob(direntry.'/','*',1)
+ let listdotstar= s:NetrwGlob(direntry.'/','.*',1)
" call Decho("updating w:netrw_treedict[".direntry.']='.string(w:netrw_treedict[direntry]),'~'.expand("<slnum>"))
else
@@ -9315,14 +9270,14 @@ fun! s:PerformListing(islocal)
" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol()." line($)=".line("$"),'~'.expand("<slnum>"))
let sortby= g:netrw_sort_by
- if g:netrw_sort_direction =~ "^r"
+ if g:netrw_sort_direction =~# "^r"
let sortby= sortby." reversed"
endif
" Sorted by... {{{3
if g:netrw_banner
" call Decho("--handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">",'~'.expand("<slnum>"))
- if g:netrw_sort_by =~ "^n"
+ if g:netrw_sort_by =~# "^n"
" call Decho("directories will be sorted by name",'~'.expand("<slnum>"))
" sorted by name
NetrwKeepj put ='\" Sorted by '.sortby
@@ -9419,13 +9374,13 @@ fun! s:PerformListing(islocal)
if !g:netrw_banner || line("$") >= w:netrw_bannercnt
" call Decho("manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">",'~'.expand("<slnum>"))
- if g:netrw_sort_by =~ "^n"
+ if g:netrw_sort_by =~# "^n"
" sort by name
NetrwKeepj call s:NetrwSetSort()
if !g:netrw_banner || w:netrw_bannercnt < line("$")
" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
- if g:netrw_sort_direction =~ 'n'
+ if g:netrw_sort_direction =~# 'n'
" normal direction sorting
exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
else
@@ -9438,7 +9393,7 @@ fun! s:PerformListing(islocal)
exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$s/^\d\{3}'.g:netrw_sepchr.'//e'
NetrwKeepj call histdel("/",-1)
- elseif g:netrw_sort_by =~ "^ext"
+ elseif g:netrw_sort_by =~# "^ext"
" sort by extension
exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$g+/+s/^/001'.g:netrw_sepchr.'/'
NetrwKeepj call histdel("/",-1)
@@ -9448,7 +9403,7 @@ fun! s:PerformListing(islocal)
NetrwKeepj call histdel("/",-1)
if !g:netrw_banner || w:netrw_bannercnt < line("$")
" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
- if g:netrw_sort_direction =~ 'n'
+ if g:netrw_sort_direction =~# 'n'
" normal direction sorting
exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
else
@@ -9462,7 +9417,7 @@ fun! s:PerformListing(islocal)
elseif a:islocal
if !g:netrw_banner || w:netrw_bannercnt < line("$")
" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction,'~'.expand("<slnum>"))
- if g:netrw_sort_direction =~ 'n'
+ if g:netrw_sort_direction =~# 'n'
" call Decho('exe sil NetrwKeepj '.w:netrw_bannercnt.',$sort','~'.expand("<slnum>"))
exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
else
@@ -9474,7 +9429,7 @@ fun! s:PerformListing(islocal)
endif
endif
- elseif g:netrw_sort_direction =~ 'r'
+ elseif g:netrw_sort_direction =~# 'r'
" call Decho('(s:PerformListing) reverse the sorted listing','~'.expand("<slnum>"))
if !g:netrw_banner || w:netrw_bannercnt < line('$')
exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$g/^/m '.w:netrw_bannercnt
@@ -9790,9 +9745,9 @@ fun! s:NetrwRemoteListing()
" call Decho("use ftp to get remote file listing",'~'.expand("<slnum>"))
let s:method = "ftp"
let listcmd = g:netrw_ftp_list_cmd
- if g:netrw_sort_by =~ '^t'
+ if g:netrw_sort_by =~# '^t'
let listcmd= g:netrw_ftp_timelist_cmd
- elseif g:netrw_sort_by =~ '^s'
+ elseif g:netrw_sort_by =~# '^s'
let listcmd= g:netrw_ftp_sizelist_cmd
endif
" call Decho("listcmd<".listcmd."> (using g:netrw_ftp_list_cmd)",'~'.expand("<slnum>"))
@@ -9899,7 +9854,7 @@ fun! s:NetrwRemoteListing()
if s:method == "ftp"
" cleanup
exe "sil! NetrwKeepj ".w:netrw_bannercnt
- while getline('.') =~ g:netrw_ftp_browse_reject
+ while getline('.') =~# g:netrw_ftp_browse_reject
sil! NetrwKeepj d
endwhile
" if there's no ../ listed, then put ../ in
@@ -9952,9 +9907,9 @@ fun! s:NetrwRemoteRm(usrhost,path) range
" call Decho("remove all marked files with bufnr#".bufnr("%"),'~'.expand("<slnum>"))
for fname in s:netrwmarkfilelist_{bufnr("%")}
let ok= s:NetrwRemoteRmFile(a:path,fname,all)
- if ok =~ 'q\%[uit]'
+ if ok =~# 'q\%[uit]'
break
- elseif ok =~ 'a\%[ll]'
+ elseif ok =~# 'a\%[ll]'
let all= 1
endif
endfor
@@ -9973,9 +9928,9 @@ fun! s:NetrwRemoteRm(usrhost,path) range
while ctr <= a:lastline
exe "NetrwKeepj ".ctr
let ok= s:NetrwRemoteRmFile(a:path,s:NetrwGetWord(),all)
- if ok =~ 'q\%[uit]'
+ if ok =~# 'q\%[uit]'
break
- elseif ok =~ 'a\%[ll]'
+ elseif ok =~# 'a\%[ll]'
let all= 1
endif
let ctr= ctr + 1
@@ -10014,12 +9969,12 @@ fun! s:NetrwRemoteRmFile(path,rmfile,all)
let ok="no"
endif
let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
- if ok =~ 'a\%[ll]'
+ if ok =~# 'a\%[ll]'
let all= 1
endif
endif
- if all || ok =~ 'y\%[es]' || ok == ""
+ if all || ok =~# 'y\%[es]' || ok == ""
" call Decho("case all=".all." or ok<".ok.">".(exists("w:netrw_method")? ': netrw_method='.w:netrw_method : ""),'~'.expand("<slnum>"))
if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
" call Decho("case ftp:",'~'.expand("<slnum>"))
@@ -10054,13 +10009,13 @@ fun! s:NetrwRemoteRmFile(path,rmfile,all)
else
call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60)
endif
- else if ret != 0
+ elseif ret != 0
call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60)
endif
" call Decho("returned=".ret." errcode=".v:shell_error,'~'.expand("<slnum>"))
endif
endif
- elseif ok =~ 'q\%[uit]'
+ elseif ok =~# 'q\%[uit]'
" call Decho("ok==".ok,'~'.expand("<slnum>"))
endif
@@ -10075,12 +10030,12 @@ fun! s:NetrwRemoteRmFile(path,rmfile,all)
let ok="no"
endif
let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
- if ok =~ 'a\%[ll]'
+ if ok =~# 'a\%[ll]'
let all= 1
endif
endif
- if all || ok =~ 'y\%[es]' || ok == ""
+ if all || ok =~# 'y\%[es]' || ok == ""
if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
NetrwKeepj call s:NetrwRemoteFtpCmd(a:path,"rmdir ".a:rmfile)
else
@@ -10103,7 +10058,7 @@ fun! s:NetrwRemoteRmFile(path,rmfile,all)
endif
endif
- elseif ok =~ 'q\%[uit]'
+ elseif ok =~# 'q\%[uit]'
" call Decho("ok==".ok,'~'.expand("<slnum>"))
endif
endif
@@ -10257,7 +10212,7 @@ fun! netrw#LocalBrowseCheck(dirname)
" would hit when re-entering netrw windows, creating unexpected
" refreshes (and would do so in the middle of NetrwSaveOptions(), too)
" call Dfunc("netrw#LocalBrowseCheck(dirname<".a:dirname.">")
-" call Decho("isdir<".a:dirname.">=".isdirectory(s:NetrwFile(a:dirname)).((exists("s:treeforceredraw")? " treeforceredraw" : "")).expand("<slnum>"))
+" call Decho("isdir<".a:dirname."> =".isdirectory(s:NetrwFile(a:dirname)).((exists("s:treeforceredraw")? " treeforceredraw" : "")).'~'.expand("<slnum>"))
" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo,'~'.expand("<slnum>"))
" call Dredir("ls!","ls!")
" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
@@ -10281,7 +10236,6 @@ fun! netrw#LocalBrowseCheck(dirname)
unlet s:treeforceredraw
sil! NetrwKeepj keepalt call s:NetrwBrowse(1,a:dirname)
endif
-
" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
" call Dret("netrw#LocalBrowseCheck")
return
@@ -10361,7 +10315,7 @@ fun! s:LocalBrowseRefresh()
" refresh any netrw buffer
" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf),'~'.expand("<slnum>"))
exe bufwinnr(ibuf)."wincmd w"
- if getline(".") =~ 'Quick Help'
+ if getline(".") =~# 'Quick Help'
" decrement g:netrw_quickhelp to prevent refresh from changing g:netrw_quickhelp
" (counteracts s:NetrwBrowseChgDir()'s incrementing)
let g:netrw_quickhelp= g:netrw_quickhelp - 1
@@ -10467,15 +10421,8 @@ fun! s:LocalListing()
" get the list of files contained in the current directory
let dirname = b:netrw_curdir
let dirnamelen = strlen(b:netrw_curdir)
- if v:version == 704 && has("patch656")
-" call Decho("using glob with patch656",'~'.expand("<slnum>"))
- let filelist = glob(s:ComposePath(dirname,"*"),0,1,1)
- let filelist = filelist + glob(s:ComposePath(dirname,".*"),0,1,1)
- else
-" call Decho("using glob without patch656",'~'.expand("<slnum>"))
- let filelist = glob(s:ComposePath(dirname,"*"),0,1)
- let filelist = filelist + glob(s:ComposePath(dirname,".*"),0,1)
- endif
+ let filelist = s:NetrwGlob(dirname,"*",0)
+ let filelist = filelist + s:NetrwGlob(dirname,".*",0)
" call Decho("filelist=".string(filelist),'~'.expand("<slnum>"))
if g:netrw_cygwin == 0 && (has("win32") || has("win95") || has("win64") || has("win16"))
@@ -10487,9 +10434,9 @@ fun! s:LocalListing()
" call Decho("filelist=".string(filelist),'~'.expand("<slnum>"))
endif
-" call Decho("before while: dirname<".dirname.">",'~'.expand("<slnum>"))
+" call Decho("before while: dirname <".dirname.">",'~'.expand("<slnum>"))
" call Decho("before while: dirnamelen<".dirnamelen.">",'~'.expand("<slnum>"))
-" call Decho("before while: filelist=".string(filelist),'~'.expand("<slnum>"))
+" call Decho("before while: filelist =".string(filelist),'~'.expand("<slnum>"))
if get(g:, 'netrw_dynamic_maxfilenamelen', 0)
let filelistcopy = map(deepcopy(filelist),'fnamemodify(v:val, ":t")')
@@ -10559,15 +10506,15 @@ fun! s:LocalListing()
if w:netrw_liststyle == s:LONGLIST
let sz = getfsize(filename)
- if g:netrw_sizestyle =~ "[hH]"
+ if g:netrw_sizestyle =~# "[hH]"
let sz= s:NetrwHumanReadable(sz)
endif
let fsz = strpart(" ",1,15-strlen(sz)).sz
let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
-" call Decho("sz=".sz." fsz=".fsz,'~'.expand("<slnum>"))
+" call Decho("longlist support: sz=".sz." fsz=".fsz,'~'.expand("<slnum>"))
endif
- if g:netrw_sort_by =~ "^t"
+ if g:netrw_sort_by =~# "^t"
" sort by time (handles time up to 1 quintillion seconds, US)
" call Decho("getftime(".filename.")=".getftime(filename),'~'.expand("<slnum>"))
let t = getftime(filename)
@@ -10580,7 +10527,7 @@ fun! s:LocalListing()
" sort by size (handles file sizes up to 1 quintillion bytes, US)
" call Decho("getfsize(".filename.")=".getfsize(filename),'~'.expand("<slnum>"))
let sz = getfsize(filename)
- if g:netrw_sizestyle =~ "[hH]"
+ if g:netrw_sizestyle =~# "[hH]"
let sz= s:NetrwHumanReadable(sz)
endif
let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
@@ -10733,9 +10680,9 @@ fun! s:NetrwLocalRm(path) range
" call Decho("remove all marked files",'~'.expand("<slnum>"))
for fname in s:netrwmarkfilelist_{bufnr("%")}
let ok= s:NetrwLocalRmFile(a:path,fname,all)
- if ok =~ 'q\%[uit]' || ok == "no"
+ if ok =~# 'q\%[uit]' || ok == "no"
break
- elseif ok =~ 'a\%[ll]'
+ elseif ok =~# 'a\%[ll]'
let all= 1
endif
endfor
@@ -10762,9 +10709,9 @@ fun! s:NetrwLocalRm(path) range
continue
endif
let ok= s:NetrwLocalRmFile(a:path,curword,all)
- if ok =~ 'q\%[uit]' || ok == "no"
+ if ok =~# 'q\%[uit]' || ok == "no"
break
- elseif ok =~ 'a\%[ll]'
+ elseif ok =~# 'a\%[ll]'
let all= 1
endif
let ctr= ctr + 1
@@ -10811,12 +10758,12 @@ fun! s:NetrwLocalRmFile(path,fname,all)
" call Decho("response: ok<".ok.">",'~'.expand("<slnum>"))
let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
" call Decho("response: ok<".ok."> (after sub)",'~'.expand("<slnum>"))
- if ok =~ 'a\%[ll]'
+ if ok =~# 'a\%[ll]'
let all= 1
endif
endif
- if all || ok =~ 'y\%[es]' || ok == ""
+ if all || ok =~# 'y\%[es]' || ok == ""
let ret= s:NetrwDelete(rmfile)
" call Decho("errcode=".v:shell_error." ret=".ret,'~'.expand("<slnum>"))
endif
@@ -10832,13 +10779,13 @@ fun! s:NetrwLocalRmFile(path,fname,all)
if ok == ""
let ok="no"
endif
- if ok =~ 'a\%[ll]'
+ if ok =~# 'a\%[ll]'
let all= 1
endif
endif
let rmfile= substitute(rmfile,'[\/]$','','e')
- if all || ok =~ 'y\%[es]' || ok == ""
+ if all || ok =~# 'y\%[es]' || ok == ""
if v:version < 704 || !has("patch1109")
" " call Decho("1st attempt: system(netrw#WinPath(".g:netrw_localrmdir.') '.s:ShellEscape(rmfile).')','~'.expand("<slnum>"))
call system(netrw#WinPath(g:netrw_localrmdir).' '.s:ShellEscape(rmfile))
@@ -10879,6 +10826,17 @@ endfun
" Support Functions: {{{1
" ---------------------------------------------------------------------
+" s:WinNames: COMBAK {{{2
+fun! s:WinNames(id)
+ let curwin= winnr()
+ 1wincmd w
+" call Decho("--- Windows By Name --- #".a:id)
+" windo call Decho("win#".winnr()."<".expand("%").">")
+" call Decho("--- --- --- --- --- ---")
+ exe curwin."wincmd w"
+endfun
+
+" ---------------------------------------------------------------------
" netrw#Access: intended to provide access to variable values for netrw's test suite {{{2
" 0: marked file list of current buffer
" 1: marked file target
@@ -10905,8 +10863,6 @@ fun! netrw#Call(funcname,...)
" call Dret("netrw#Call")
endfun
-" ------------------------------------------------------------------------
-
" ---------------------------------------------------------------------
" netrw#Expose: allows UserMaps and pchk to look at otherwise script-local variables {{{2
" I expect this function to be used in
@@ -10914,18 +10870,22 @@ endfun
" for example.
fun! netrw#Expose(varname)
" call Dfunc("netrw#Expose(varname<".a:varname.">)")
- exe "let retval= s:".a:varname
- if exists("g:netrw_pchk")
- if type(retval) == 3
- let retval = copy(retval)
- let i = 0
- while i < len(retval)
- let retval[i]= substitute(retval[i],expand("$HOME"),'~','')
- let i = i + 1
- endwhile
+ if exists("s:".a:varname)
+ exe "let retval= s:".a:varname
+ if exists("g:netrw_pchk")
+ if type(retval) == 3
+ let retval = copy(retval)
+ let i = 0
+ while i < len(retval)
+ let retval[i]= substitute(retval[i],expand("$HOME"),'~','')
+ let i = i + 1
+ endwhile
+ endif
+" call Dret("netrw#Expose ".string(retval))
+ return string(retval)
endif
-" call Dret("netrw#Expose ".string(retval))
- return string(retval)
+ else
+ let retval= "n/a"
endif
" call Dret("netrw#Expose ".string(retval))
@@ -11018,9 +10978,9 @@ fun! s:ComposePath(base,subdir)
" call Decho("amiga",'~'.expand("<slnum>"))
let ec = a:base[s:Strlen(a:base)-1]
if ec != '/' && ec != ':'
- let ret = a:base . "/" . a:subdir
+ let ret = a:base."/" . a:subdir
else
- let ret = a:base . a:subdir
+ let ret = a:base.a:subdir
endif
elseif a:subdir =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
@@ -11248,10 +11208,10 @@ fun! s:NetrwBMShow()
redir END
let bmshowlist = split(bmshowraw,'\n')
if bmshowlist != []
- let bmshowfuncs= filter(bmshowlist,'v:val =~ "<SNR>\\d\\+_BMShow()"')
+ let bmshowfuncs= filter(bmshowlist,'v:val =~# "<SNR>\\d\\+_BMShow()"')
if bmshowfuncs != []
let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','')
- if bmshowfunc =~ '^call.*BMShow()'
+ if bmshowfunc =~# '^call.*BMShow()'
exe "sil! NetrwKeepj ".bmshowfunc
endif
endif
@@ -11395,11 +11355,12 @@ fun! s:NetrwEnew(...)
" call Decho("generate a buffer with NetrwKeepj keepalt enew!",'~'.expand("<slnum>"))
" when tree listing uses file TreeListing... a new buffer is made.
" Want the old buffer to be unlisted.
- setl nobl
+ " COMBAK: this causes a problem, see P43
+" setl nobl
let netrw_keepdiff= &l:diff
noswapfile NetrwKeepj keepalt enew!
let &l:diff= netrw_keepdiff
-" call Decho("bufnr($)=".bufnr("$")." winnr($)=".winnr("$"),'~'.expand("<slnum>"))
+" call Decho("bufnr($)=".bufnr("$")."<".bufname(bufnr("$"))."> winnr($)=".winnr("$"),'~'.expand("<slnum>"))
NetrwKeepj call s:NetrwOptionSave("w:")
" copy function-local-variables to buffer variable equivalents
@@ -11458,8 +11419,8 @@ endfun
" ---------------------------------------------------------------------
" s:NetrwInsureWinVars: insure that a netrw buffer has its w: variables in spite of a wincmd v or s {{{2
fun! s:NetrwInsureWinVars()
-" call Dfunc("s:NetrwInsureWinVars() win#".winnr())
if !exists("w:netrw_liststyle")
+" call Dfunc("s:NetrwInsureWinVars() win#".winnr())
let curbuf = bufnr("%")
let curwin = winnr()
let iwin = 1
@@ -11479,8 +11440,8 @@ fun! s:NetrwInsureWinVars()
let w:{k}= winvars[k]
endfor
endif
+" call Dret("s:NetrwInsureWinVars win#".winnr())
endif
-" call Dret("s:NetrwInsureWinVars win#".winnr())
endfun
" ---------------------------------------------------------------------
@@ -11685,7 +11646,7 @@ endfun
" s:SetRexDir() sets up <2-leftmouse> maps (if g:netrw_retmap
" is true) and a command, :Rexplore, which call this function.
"
-" s:nbcd_curpos_{bufnr('%')} is set up by s:NetrwBrowseChgDir()
+" s:netrw_nbcd is set up by s:NetrwBrowseChgDir()
"
" s:rexposn_BUFNR used to save/restore cursor position
fun! s:NetrwRexplore(islocal,dirname)
@@ -11766,6 +11727,29 @@ fun! s:SaveBufVars()
endfun
" ---------------------------------------------------------------------
+" s:SavePosn: saves position associated with current buffer into a dictionary {{{2
+fun! s:SavePosn(posndict)
+" call Dfunc("s:SavePosn(posndict) curbuf#".bufnr("%")."<".bufname("%").">")
+
+ let a:posndict[bufnr("%")]= winsaveview()
+" call Decho("saving posn: posndict[".bufnr("%")."]=".string(winsaveview()),'~'.expand("<slnum>"))
+
+" call Dret("s:SavePosn posndict")
+ return a:posndict
+endfun
+
+" ---------------------------------------------------------------------
+" s:RestorePosn: restores position associated with current buffer using dictionary {{{2
+fun! s:RestorePosn(posndict)
+" call Dfunc("s:RestorePosn(posndict) curbuf#".bufnr("%")."<".bufname("%").">")
+ if has_key(a:posndict,bufnr("%"))
+ call winrestview(a:posndict[bufnr("%")])
+" call Decho("restoring posn: posndict[".bufnr("%")."]=".string(a:posndict[bufnr("%")]),'~'.expand("<slnum>"))
+ endif
+" call Dret("s:RestorePosn")
+endfun
+
+" ---------------------------------------------------------------------
" s:SaveWinVars: (used by Explore() and NetrwSplit()) {{{2
fun! s:SaveWinVars()
" call Dfunc("s:SaveWinVars() win#".winnr())
@@ -11819,10 +11803,10 @@ fun! s:SetRexDir(islocal,dirname)
let w:netrw_rexdir = a:dirname
let w:netrw_rexlocal = a:islocal
let s:rexposn_{bufnr("%")} = winsaveview()
-" call Decho("setting w:netrw_rexdir =".w:netrw_rexdir)
-" call Decho("setting w:netrw_rexlocal=".w:netrw_rexlocal)
+" call Decho("setting w:netrw_rexdir =".w:netrw_rexdir,'~'.expand("<slnum>"))
+" call Decho("setting w:netrw_rexlocal=".w:netrw_rexlocal,'~'.expand("<slnum>"))
" call Decho("saving posn to s:rexposn_".bufnr("%")."<".string(s:rexposn_{bufnr("%")}).">",'~'.expand("<slnum>"))
-" call Decho("setting s:rexposn_".bufnr("%")."<".bufname("%")."> to SavePosn",'~'.expand("<slnum>"))
+" call Decho("setting s:rexposn_".bufnr("%")."<".bufname("%")."> to ".string(winsaveview()),'~'.expand("<slnum>"))
" call Dret("s:SetRexDir : win#".winnr()." ".(a:islocal? "local" : "remote")." dir: ".a:dirname)
endfun
@@ -11956,7 +11940,7 @@ fun! s:TreeListMove(dir)
" call Decho("regfile srch back: ".nl,'~'.expand("<slnum>"))
elseif a:dir == '[]' && nxtline != ''
NetrwKeepj norm! 0
-" call Decho('srchpat<'.'^\%('.curindent.'\)\@!'.'>')
+" call Decho('srchpat<'.'^\%('.curindent.'\)\@!'.'>','~'.expand("<slnum>"))
let nl = search('^\%('.curindent.'\)\@!','We') " search forwards
if nl != 0
NetrwKeepj norm! k
diff --git a/runtime/autoload/paste.vim b/runtime/autoload/paste.vim
index fcf06ecdf9..dd7b3ae54a 100644
--- a/runtime/autoload/paste.vim
+++ b/runtime/autoload/paste.vim
@@ -1,6 +1,6 @@
" Vim support file to help with paste mappings and menus
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2006 Jun 23
+" Last Change: 2017 Aug 30
" Define the string to use for items that are present both in Edit, Popup and
" Toolbar menu. Also used in mswin.vim and macmap.vim.
@@ -12,7 +12,7 @@
if has("virtualedit")
let paste#paste_cmd = {'n': ":call paste#Paste()<CR>"}
let paste#paste_cmd['v'] = '"-c<Esc>' . paste#paste_cmd['n']
- let paste#paste_cmd['i'] = 'x<BS><Esc>' . paste#paste_cmd['n'] . 'gi'
+ let paste#paste_cmd['i'] = "\<c-\>\<c-o>\"+gP"
func! paste#Paste()
let ove = &ve
diff --git a/runtime/autoload/phpcomplete.vim b/runtime/autoload/phpcomplete.vim
index 7f25d9df33..377baa8432 100644
--- a/runtime/autoload/phpcomplete.vim
+++ b/runtime/autoload/phpcomplete.vim
@@ -3,7 +3,7 @@
" Maintainer: Dรกvid Szabรณ ( complex857 AT gmail DOT com )
" Previous Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
" URL: https://github.com/shawncplus/phpcomplete.vim
-" Last Change: 2015 Jul 13
+" Last Change: 2018 Oct 10
"
" OPTIONS:
"
@@ -146,6 +146,8 @@ function! phpcomplete#CompletePHP(findstart, base) " {{{
end
try
+ let eventignore = &eventignore
+ let &eventignore = 'all'
let winheight = winheight(0)
let winnr = winnr()
@@ -195,6 +197,8 @@ function! phpcomplete#CompletePHP(findstart, base) " {{{
" }}}
elseif context =~? 'implements'
return phpcomplete#CompleteClassName(a:base, ['i'], current_namespace, imports)
+ elseif context =~? 'instanceof'
+ return phpcomplete#CompleteClassName(a:base, ['c', 'n'], current_namespace, imports)
elseif context =~? 'extends\s\+.\+$' && a:base == ''
return ['implements']
elseif context =~? 'extends'
@@ -214,6 +218,7 @@ function! phpcomplete#CompletePHP(findstart, base) " {{{
endif
finally
silent! exec winnr.'resize '.winheight
+ let &eventignore = eventignore
endtry
endfunction
" }}}
@@ -787,6 +792,8 @@ function! phpcomplete#CompleteClassName(base, kinds, current_namespace, imports)
if kinds == ['c', 'i']
let filterstr = 'v:val =~? "\\(class\\|interface\\)\\s\\+[a-zA-Z_\\x7f-\\xff][a-zA-Z_0-9\\x7f-\\xff]*\\s*"'
+ elseif kinds == ['c', 'n']
+ let filterstr = 'v:val =~? "\\(class\\|namespace\\)\\s\\+[a-zA-Z_\\x7f-\\xff][a-zA-Z_0-9\\x7f-\\xff]*\\s*"'
elseif kinds == ['c']
let filterstr = 'v:val =~? "class\\s\\+[a-zA-Z_\\x7f-\\xff][a-zA-Z_0-9\\x7f-\\xff]*\\s*"'
elseif kinds == ['i']
@@ -931,7 +938,7 @@ function! phpcomplete#EvaluateModifiers(modifiers, required_modifiers, prohibite
endfor
for modifier in a:modifiers
- " if the modifier is prohibited its a no match
+ " if the modifier is prohibited it's a no match
if index(a:prohibited_modifiers, modifier) != -1
return 0
endif
@@ -996,7 +1003,7 @@ function! phpcomplete#CompleteUserClass(context, base, sccontent, visibility) "
let required_modifiers += ['static']
endif
let all_variable = filter(deepcopy(a:sccontent),
- \ 'v:val =~ "^\\s*\\(var\\s\\+\\|public\\s\\+\\|protected\\s\\+\\|private\\s\\+\\|final\\s\\+\\|abstract\\s\\+\\|static\\s\\+\\)\\+\\$"')
+ \ 'v:val =~ "\\(^\\s*\\(var\\s\\+\\|public\\s\\+\\|protected\\s\\+\\|private\\s\\+\\|final\\s\\+\\|abstract\\s\\+\\|static\\s\\+\\)\\+\\$\\|^\\s*\\(\\/\\|\\*\\)*\\s*@property\\s\\+\\S\\+\\s\\S\\{-}\\s*$\\)"')
let variables = []
for i in all_variable
@@ -1160,6 +1167,14 @@ function! phpcomplete#GetTaglist(pattern) " {{{
endif
let tags = taglist(a:pattern)
+ for tag in tags
+ for prop in keys(tag)
+ if prop == 'cmd' || prop == 'static' || prop == 'kind' || prop == 'builtin'
+ continue
+ endif
+ let tag[prop] = substitute(tag[prop], '\\\\', '\\', 'g')
+ endfor
+ endfor
let s:cache_tags[a:pattern] = tags
let has_key = has_key(s:cache_tags, a:pattern)
let s:cache_tags_checksum = cache_checksum
@@ -1379,16 +1394,30 @@ function! phpcomplete#GetCallChainReturnType(classname_candidate, class_candidat
" Get Structured information of all classes and subclasses including namespace and includes
" try to find the method's return type in docblock comment
for classstructure in classcontents
- let docblock_target_pattern = 'function\s\+&\?'.method.'\|\(public\|private\|protected\|var\).\+\$'.method
+ let docblock_target_pattern = 'function\s\+&\?'.method.'\>\|\(public\|private\|protected\|var\).\+\$'.method.'\>\|@property.\+\$'.method.'\>'
let doc_str = phpcomplete#GetDocBlock(split(classstructure.content, '\n'), docblock_target_pattern)
- if doc_str != ''
+ let return_type_hint = phpcomplete#GetFunctionReturnTypeHint(split(classstructure.content, '\n'), 'function\s\+&\?'.method.'\>')
+ if doc_str != '' || return_type_hint != ''
break
endif
endfor
- if doc_str != ''
+ if doc_str != '' || return_type_hint != ''
let docblock = phpcomplete#ParseDocBlock(doc_str)
- if has_key(docblock.return, 'type') || has_key(docblock.var, 'type')
- let type = has_key(docblock.return, 'type') ? docblock.return.type : docblock.var.type
+ if has_key(docblock.return, 'type') || has_key(docblock.var, 'type') || len(docblock.properties) > 0 || return_type_hint != ''
+ if return_type_hint == ''
+ let type = has_key(docblock.return, 'type') ? docblock.return.type : has_key(docblock.var, 'type') ? docblock.var.type : ''
+
+ if type == ''
+ for property in docblock.properties
+ if property.description =~? method
+ let type = property.type
+ break
+ endif
+ endfor
+ endif
+ else
+ let type = return_type_hint
+ end
" there's a namespace in the type, threat the type as FQCN
if type =~ '\\'
@@ -1462,7 +1491,7 @@ function! phpcomplete#GetMethodStack(line) " {{{
continue
endif
- " if it's looks like a string
+ " if it looks like a string
if current_char == "'" || current_char == '"'
" and it is not escaped
if prev_char != '\' || (prev_char == '\' && prev_prev_char == '\')
@@ -1554,6 +1583,9 @@ function! phpcomplete#GetClassName(start_line, context, current_namespace, impor
elseif get(methodstack, 0) =~# function_invocation_pattern
let function_name = matchstr(methodstack[0], '^\s*\zs'.function_name_pattern)
let function_file = phpcomplete#GetFunctionLocation(function_name, a:current_namespace)
+ if function_file == ''
+ let function_file = phpcomplete#GetFunctionLocation(function_name, '\')
+ endif
if function_file == 'VIMPHP_BUILTINFUNCTION'
" built in function, grab the return type from the info string
@@ -1563,13 +1595,15 @@ function! phpcomplete#GetClassName(start_line, context, current_namespace, impor
elseif function_file != '' && filereadable(function_file)
let file_lines = readfile(function_file)
let docblock_str = phpcomplete#GetDocBlock(file_lines, 'function\s*&\?\<'.function_name.'\>')
+ let return_type_hint = phpcomplete#GetFunctionReturnTypeHint(file_lines, 'function\s*&\?'.function_name.'\>')
let docblock = phpcomplete#ParseDocBlock(docblock_str)
- if has_key(docblock.return, 'type')
- let classname_candidate = docblock.return.type
+ let type = has_key(docblock.return, 'type') ? docblock.return.type : return_type_hint
+ if type != ''
+ let classname_candidate = type
let [class_candidate_namespace, function_imports] = phpcomplete#GetCurrentNameSpace(file_lines)
" try to expand the classname of the returned type with the context got from the function's source file
- let [classname_candidate, unused] = phpcomplete#ExpandClassName(classname_candidate, class_candidate_namespace, function_imports)
+ let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, class_candidate_namespace, function_imports)
endif
endif
if classname_candidate != ''
@@ -1650,9 +1684,10 @@ function! phpcomplete#GetClassName(start_line, context, current_namespace, impor
let sub_methodstack = phpcomplete#GetMethodStack(matchstr(line, '^\s*'.object.'\s*=&\?\s*\s\+\zs.*'))
let [classname_candidate, class_candidate_namespace] = phpcomplete#GetCallChainReturnType(
\ classname,
- \ a:current_namespace,
+ \ namespace_for_class,
\ a:imports,
\ sub_methodstack)
+
return (class_candidate_namespace == '\' || class_candidate_namespace == '') ? classname_candidate : class_candidate_namespace.'\'.classname_candidate
endif
endif
@@ -1783,6 +1818,9 @@ function! phpcomplete#GetClassName(start_line, context, current_namespace, impor
let [function_name, function_namespace] = phpcomplete#ExpandClassName(function_name, a:current_namespace, a:imports)
let function_file = phpcomplete#GetFunctionLocation(function_name, function_namespace)
+ if function_file == ''
+ let function_file = phpcomplete#GetFunctionLocation(function_name, '\')
+ endif
if function_file == 'VIMPHP_BUILTINFUNCTION'
" built in function, grab the return type from the info string
@@ -1793,12 +1831,14 @@ function! phpcomplete#GetClassName(start_line, context, current_namespace, impor
elseif function_file != '' && filereadable(function_file)
let file_lines = readfile(function_file)
let docblock_str = phpcomplete#GetDocBlock(file_lines, 'function\s*&\?\<'.function_name.'\>')
+ let return_type_hint = phpcomplete#GetFunctionReturnTypeHint(file_lines, 'function\s*&\?'.function_name.'\>')
let docblock = phpcomplete#ParseDocBlock(docblock_str)
- if has_key(docblock.return, 'type')
- let classname_candidate = docblock.return.type
+ let type = has_key(docblock.return, 'type') ? docblock.return.type : return_type_hint
+ if type != ''
+ let classname_candidate = type
let [class_candidate_namespace, function_imports] = phpcomplete#GetCurrentNameSpace(file_lines)
" try to expand the classname of the returned type with the context got from the function's source file
- let [classname_candidate, unused] = phpcomplete#ExpandClassName(classname_candidate, class_candidate_namespace, function_imports)
+ let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, class_candidate_namespace, function_imports)
break
endif
endif
@@ -1861,6 +1901,8 @@ function! phpcomplete#GetClassName(start_line, context, current_namespace, impor
for tag in tags
if tag.kind ==? 'v' && tag.cmd =~? '=\s*new\s\+\zs'.class_name_pattern.'\ze'
let classname = matchstr(tag.cmd, '=\s*new\s\+\zs'.class_name_pattern.'\ze')
+ " unescape the classname, it would have "\" doubled since it is an ex command
+ let classname = substitute(classname, '\\\(\_.\)', '\1', 'g')
return classname
endif
endfor
@@ -2077,6 +2119,19 @@ function! phpcomplete#GetClassContentsStructure(file_path, file_lines, class_nam
endif
call searchpair('{', '', '}', 'W')
let class_closing_bracket_line = line('.')
+
+ " Include class docblock
+ let doc_line = cfline - 1
+ if getline(doc_line) =~? '^\s*\*/'
+ while doc_line != 0
+ if getline(doc_line) =~? '^\s*/\*\*'
+ let cfline = doc_line
+ break
+ endif
+ let doc_line -= 1
+ endwhile
+ endif
+
let classcontent = join(getline(cfline, class_closing_bracket_line), "\n")
let used_traits = []
@@ -2241,8 +2296,19 @@ function! phpcomplete#GetDocBlock(sccontent, search) " {{{
let line = a:sccontent[i]
" search for a function declaration
if line =~? a:search
- let l = i - 1
- " start backward serch for the comment block
+ if line =~? '@property'
+ let doc_line = i
+ while doc_line != sccontent_len - 1
+ if a:sccontent[doc_line] =~? '^\s*\*/'
+ let l = doc_line
+ break
+ endif
+ let doc_line += 1
+ endwhile
+ else
+ let l = i - 1
+ endif
+ " start backward search for the comment block
while l != 0
let line = a:sccontent[l]
" if it's a one line docblock like comment and we can just return it right away
@@ -2263,7 +2329,7 @@ function! phpcomplete#GetDocBlock(sccontent, search) " {{{
return ''
end
- while l != 0
+ while l >= 0
let line = a:sccontent[l]
if line =~? '^\s*/\*\*'
let comment_start = l
@@ -2297,9 +2363,10 @@ function! phpcomplete#ParseDocBlock(docblock) " {{{
\ 'return': {},
\ 'throws': [],
\ 'var': {},
+ \ 'properties': [],
\ }
- let res.description = substitute(matchstr(a:docblock, '\zs\_.\{-}\ze\(@var\|@param\|@return\|$\)'), '\(^\_s*\|\_s*$\)', '', 'g')
+ let res.description = substitute(matchstr(a:docblock, '\zs\_.\{-}\ze\(@type\|@var\|@param\|@return\|$\)'), '\(^\_s*\|\_s*$\)', '', 'g')
let docblock_lines = split(a:docblock, "\n")
let param_lines = filter(copy(docblock_lines), 'v:val =~? "^@param"')
@@ -2334,19 +2401,68 @@ function! phpcomplete#ParseDocBlock(docblock) " {{{
endif
endfor
- let var_line = filter(copy(docblock_lines), 'v:val =~? "^@var"')
+ let var_line = filter(copy(docblock_lines), 'v:val =~? "^\\(@var\\|@type\\)"')
if len(var_line) > 0
- let var_parts = matchlist(var_line[0], '@var\s\+\(\S\+\)\s*\(.*\)')
+ let var_parts = matchlist(var_line[0], '\(@var\|@type\)\s\+\(\S\+\)\s*\(.*\)')
let res['var'] = {
\ 'line': var_parts[0],
- \ 'type': phpcomplete#GetTypeFromDocBlockParam(get(var_parts, 1, '')),
- \ 'description': get(var_parts, 2, '')}
+ \ 'type': phpcomplete#GetTypeFromDocBlockParam(get(var_parts, 2, '')),
+ \ 'description': get(var_parts, 3, '')}
endif
+ let property_lines = filter(copy(docblock_lines), 'v:val =~? "^@property"')
+ for property_line in property_lines
+ let parts = matchlist(property_line, '\(@property\)\s\+\(\S\+\)\s*\(.*\)')
+ if len(parts) > 0
+ call add(res.properties, {
+ \ 'line': parts[0],
+ \ 'type': phpcomplete#GetTypeFromDocBlockParam(get(parts, 2, '')),
+ \ 'description': get(parts, 3, '')})
+ endif
+ endfor
+
return res
endfunction
" }}}
+function! phpcomplete#GetFunctionReturnTypeHint(sccontent, search)
+ let i = 0
+ let l = 0
+ let function_line_start = -1
+ let function_line_end = -1
+ let sccontent_len = len(a:sccontent)
+ let return_type = ''
+
+ while (i < sccontent_len)
+ let line = a:sccontent[i]
+ " search for a function declaration
+ if line =~? a:search
+ let l = i
+ let function_line_start = i
+ " now search for the first { where the function body starts
+ while l < sccontent_len
+ let line = a:sccontent[l]
+ if line =~? '\V{'
+ let function_line_end = l
+ break
+ endif
+ let l += 1
+ endwhile
+ break
+ endif
+ let i += 1
+ endwhile
+
+ " now grab the lines that holds the function declaration line
+ if function_line_start != -1 && function_line_end != -1
+ let function_line = join(a:sccontent[function_line_start :function_line_end], " ")
+ let class_name_pattern = '[a-zA-Z_\x7f-\xff\\][a-zA-Z_0-9\x7f-\xff\\]*'
+ let return_type = matchstr(function_line, '\c\s*:\s*\zs'.class_name_pattern.'\ze\s*{')
+ endif
+ return return_type
+
+endfunction
+
function! phpcomplete#GetTypeFromDocBlockParam(docblock_type) " {{{
if a:docblock_type !~ '|'
return a:docblock_type
@@ -2498,6 +2614,7 @@ function! phpcomplete#GetCurrentNameSpace(file_lines) " {{{
let name = matchstr(name, '\\\zs[^\\]\+\ze$')
endif
endif
+
" leading slash is not required use imports are always absolute
let imports[name] = {'name': object, 'kind': ''}
endfor
@@ -2505,7 +2622,7 @@ function! phpcomplete#GetCurrentNameSpace(file_lines) " {{{
" find kind flags from tags or built in methods for the objects we extracted
" they can be either classes, interfaces or namespaces, no other thing is importable in php
for [key, import] in items(imports)
- " if theres a \ in the name we have it's definetly not a built in thing, look for tags
+ " if theres a \ in the name we have it's definitely not a built in thing, look for tags
if import.name =~ '\\'
let patched_ctags_detected = 0
let [classname, namespace_for_classes] = phpcomplete#ExpandClassName(import.name, '\', {})
@@ -2533,6 +2650,7 @@ function! phpcomplete#GetCurrentNameSpace(file_lines) " {{{
elseif !exists('no_namespace_candidate')
" save the first namespacless match to be used if no better
" candidate found later on
+ let tag.namespace = namespace_for_classes
let no_namespace_candidate = tag
endif
endif
diff --git a/runtime/autoload/provider.vim b/runtime/autoload/provider.vim
new file mode 100644
index 0000000000..dc24e801d0
--- /dev/null
+++ b/runtime/autoload/provider.vim
@@ -0,0 +1,21 @@
+" Common functions for providers
+
+" Start the provider and perform a 'poll' request
+"
+" Returns a valid channel on success
+function! provider#Poll(argv, orig_name, log_env) abort
+ let job = {'rpc': v:true, 'stderr_buffered': v:true}
+ try
+ let channel_id = jobstart(a:argv, job)
+ if channel_id > 0 && rpcrequest(channel_id, 'poll') ==# 'ok'
+ return channel_id
+ endif
+ catch
+ echomsg v:throwpoint
+ echomsg v:exception
+ for row in get(job, 'stderr', [])
+ echomsg row
+ endfor
+ endtry
+ throw remote#host#LoadErrorForHost(a:orig_name, a:log_env)
+endfunction
diff --git a/runtime/autoload/provider/clipboard.vim b/runtime/autoload/provider/clipboard.vim
index 77bc8c781d..2fb9d74d8d 100644
--- a/runtime/autoload/provider/clipboard.vim
+++ b/runtime/autoload/provider/clipboard.vim
@@ -3,76 +3,140 @@
" available.
let s:copy = {}
let s:paste = {}
+let s:clipboard = {}
" When caching is enabled, store the jobid of the xclip/xsel process keeping
" ownership of the selection, so we know how long the cache is valid.
-let s:selection = { 'owner': 0, 'data': [] }
+let s:selection = { 'owner': 0, 'data': [], 'stderr_buffered': v:true }
-function! s:selection.on_exit(jobid, data, event)
+function! s:selection.on_exit(jobid, data, event) abort
" At this point this nvim instance might already have launched
" a new provider instance. Don't drop ownership in this case.
if self.owner == a:jobid
let self.owner = 0
endif
+ if a:data != 0
+ echohl WarningMsg
+ echomsg 'clipboard: error invoking '.get(self.argv, 0, '?').': '.join(self.stderr)
+ echohl None
+ endif
endfunction
-let s:selections = { '*': s:selection, '+': copy(s:selection)}
+let s:selections = { '*': s:selection, '+': copy(s:selection) }
-function! s:try_cmd(cmd, ...)
+function! s:try_cmd(cmd, ...) abort
let argv = split(a:cmd, " ")
- let out = a:0 ? systemlist(argv, a:1, 1) : systemlist(argv, [''], 1)
+ let out = systemlist(argv, (a:0 ? a:1 : ['']), 1)
if v:shell_error
- echohl WarningMsg
- echo "clipboard: error: ".(len(out) ? out[0] : '')
- echohl None
+ if !exists('s:did_error_try_cmd')
+ echohl WarningMsg
+ echomsg "clipboard: error: ".(len(out) ? out[0] : v:shell_error)
+ echohl None
+ let s:did_error_try_cmd = 1
+ endif
return 0
endif
return out
endfunction
+" Returns TRUE if `cmd` exits with success, else FALSE.
+function! s:cmd_ok(cmd) abort
+ call system(a:cmd)
+ return v:shell_error == 0
+endfunction
+
let s:cache_enabled = 1
-if executable('pbcopy')
- let s:copy['+'] = 'pbcopy'
- let s:paste['+'] = 'pbpaste'
- let s:copy['*'] = s:copy['+']
- let s:paste['*'] = s:paste['+']
- let s:cache_enabled = 0
-elseif exists('$DISPLAY') && executable('xsel')
- let s:copy['+'] = 'xsel --nodetach -i -b'
- let s:paste['+'] = 'xsel -o -b'
- let s:copy['*'] = 'xsel --nodetach -i -p'
- let s:paste['*'] = 'xsel -o -p'
-elseif exists('$DISPLAY') && executable('xclip')
- let s:copy['+'] = 'xclip -quiet -i -selection clipboard'
- let s:paste['+'] = 'xclip -o -selection clipboard'
- let s:copy['*'] = 'xclip -quiet -i -selection primary'
- let s:paste['*'] = 'xclip -o -selection primary'
-elseif executable('lemonade')
- let s:copy['+'] = 'lemonade copy'
- let s:paste['+'] = 'lemonade paste'
- let s:copy['*'] = 'lemonade copy'
- let s:paste['*'] = 'lemonade paste'
-elseif executable('doitclient')
- let s:copy['+'] = 'doitclient wclip'
- let s:paste['+'] = 'doitclient wclip -r'
- let s:copy['*'] = s:copy['+']
- let s:paste['*'] = s:paste['+']
-else
- echom 'clipboard: No clipboard tool available. See :help clipboard'
+let s:err = ''
+
+function! provider#clipboard#Error() abort
+ return s:err
+endfunction
+
+function! provider#clipboard#Executable() abort
+ if exists('g:clipboard')
+ if type({}) isnot# type(g:clipboard)
+ \ || type({}) isnot# type(get(g:clipboard, 'copy', v:null))
+ \ || type({}) isnot# type(get(g:clipboard, 'paste', v:null))
+ let s:err = 'clipboard: invalid g:clipboard'
+ return ''
+ endif
+
+ let s:copy = get(g:clipboard, 'copy', { '+': v:null, '*': v:null })
+ let s:paste = get(g:clipboard, 'paste', { '+': v:null, '*': v:null })
+ let s:cache_enabled = get(g:clipboard, 'cache_enabled', 0)
+ return get(g:clipboard, 'name', 'g:clipboard')
+ elseif has('mac')
+ let s:copy['+'] = 'pbcopy'
+ let s:paste['+'] = 'pbpaste'
+ let s:copy['*'] = s:copy['+']
+ let s:paste['*'] = s:paste['+']
+ let s:cache_enabled = 0
+ return 'pbcopy'
+ elseif exists('$WAYLAND_DISPLAY') && executable('wl-copy') && executable('wl-paste')
+ let s:copy['+'] = 'wl-copy --foreground'
+ let s:paste['+'] = 'wl-paste --no-newline'
+ let s:copy['*'] = 'wl-copy --foreground --primary'
+ let s:paste['*'] = 'wl-paste --no-newline --primary'
+ return 'wl-copy'
+ elseif exists('$DISPLAY') && executable('xclip')
+ let s:copy['+'] = 'xclip -quiet -i -selection clipboard'
+ let s:paste['+'] = 'xclip -o -selection clipboard'
+ let s:copy['*'] = 'xclip -quiet -i -selection primary'
+ let s:paste['*'] = 'xclip -o -selection primary'
+ return 'xclip'
+ elseif exists('$DISPLAY') && executable('xsel') && s:cmd_ok('xsel -o -b')
+ let s:copy['+'] = 'xsel --nodetach -i -b'
+ let s:paste['+'] = 'xsel -o -b'
+ let s:copy['*'] = 'xsel --nodetach -i -p'
+ let s:paste['*'] = 'xsel -o -p'
+ return 'xsel'
+ elseif executable('lemonade')
+ let s:copy['+'] = 'lemonade copy'
+ let s:paste['+'] = 'lemonade paste'
+ let s:copy['*'] = 'lemonade copy'
+ let s:paste['*'] = 'lemonade paste'
+ return 'lemonade'
+ elseif executable('doitclient')
+ let s:copy['+'] = 'doitclient wclip'
+ let s:paste['+'] = 'doitclient wclip -r'
+ let s:copy['*'] = s:copy['+']
+ let s:paste['*'] = s:paste['+']
+ return 'doitclient'
+ elseif executable('win32yank.exe')
+ let s:copy['+'] = 'win32yank.exe -i --crlf'
+ let s:paste['+'] = 'win32yank.exe -o --lf'
+ let s:copy['*'] = s:copy['+']
+ let s:paste['*'] = s:paste['+']
+ return 'win32yank'
+ elseif exists('$TMUX') && executable('tmux')
+ let s:copy['+'] = 'tmux load-buffer -'
+ let s:paste['+'] = 'tmux save-buffer -'
+ let s:copy['*'] = s:copy['+']
+ let s:paste['*'] = s:paste['+']
+ return 'tmux'
+ endif
+
+ let s:err = 'clipboard: No clipboard tool. :help clipboard'
+ return ''
+endfunction
+
+if empty(provider#clipboard#Executable())
+ " provider#clipboard#Call() *must not* be defined if the provider is broken.
+ " Otherwise eval_has_provider() thinks the clipboard provider is
+ " functioning, and eval_call_provider() will happily call it.
finish
endif
-let s:clipboard = {}
-
-function! s:clipboard.get(reg)
- let reg = a:reg == '"' ? '+' : a:reg
- if s:selections[reg].owner > 0
- return s:selections[reg].data
+function! s:clipboard.get(reg) abort
+ if type(s:paste[a:reg]) == v:t_func
+ return s:paste[a:reg]()
+ elseif s:selections[a:reg].owner > 0
+ return s:selections[a:reg].data
end
- return s:try_cmd(s:paste[reg])
+ return s:try_cmd(s:paste[a:reg])
endfunction
-function! s:clipboard.set(lines, regtype, reg)
+function! s:clipboard.set(lines, regtype, reg) abort
if a:reg == '"'
call s:clipboard.set(a:lines,a:regtype,'+')
if s:copy['*'] != s:copy['+']
@@ -80,33 +144,51 @@ function! s:clipboard.set(lines, regtype, reg)
end
return 0
end
+
+ if type(s:copy[a:reg]) == v:t_func
+ call s:copy[a:reg](a:lines, a:regtype)
+ return 0
+ end
+
if s:cache_enabled == 0
call s:try_cmd(s:copy[a:reg], a:lines)
return 0
end
- let selection = s:selections[a:reg]
- if selection.owner > 0
+ if s:selections[a:reg].owner > 0
" The previous provider instance should exit when the new one takes
" ownership, but kill it to be sure we don't fill up the job table.
- call jobstop(selection.owner)
+ call jobstop(s:selections[a:reg].owner)
end
+ let s:selections[a:reg] = copy(s:selection)
+ let selection = s:selections[a:reg]
let selection.data = [a:lines, a:regtype]
let argv = split(s:copy[a:reg], " ")
+ let selection.argv = argv
let selection.detach = s:cache_enabled
let selection.cwd = "/"
let jobid = jobstart(argv, selection)
- if jobid <= 0
+ if jobid > 0
+ call jobsend(jobid, a:lines)
+ call jobclose(jobid, 'stdin')
+ let selection.owner = jobid
+ else
echohl WarningMsg
- echo "clipboard: error when invoking provider"
+ echomsg 'clipboard: failed to execute: '.(s:copy[a:reg])
echohl None
return 0
endif
- call jobsend(jobid, a:lines)
- call jobclose(jobid, 'stdin')
- let selection.owner = jobid
+ return 1
endfunction
-function! provider#clipboard#Call(method, args)
- return call(s:clipboard[a:method],a:args,s:clipboard)
+function! provider#clipboard#Call(method, args) abort
+ if get(s:, 'here', v:false) " Clipboard provider must not recurse. #7184
+ return 0
+ endif
+ let s:here = v:true
+ try
+ return call(s:clipboard[a:method],a:args,s:clipboard)
+ finally
+ let s:here = v:false
+ endtry
endfunction
diff --git a/runtime/autoload/provider/node.vim b/runtime/autoload/provider/node.vim
new file mode 100644
index 0000000000..35882849bd
--- /dev/null
+++ b/runtime/autoload/provider/node.vim
@@ -0,0 +1,148 @@
+if exists('g:loaded_node_provider')
+ finish
+endif
+let g:loaded_node_provider = 1
+
+function! s:is_minimum_version(version, min_major, min_minor) abort
+ if empty(a:version)
+ let nodejs_version = get(split(system(['node', '-v']), "\n"), 0, '')
+ if v:shell_error || nodejs_version[0] !=# 'v'
+ return 0
+ endif
+ else
+ let nodejs_version = a:version
+ endif
+ " Remove surrounding junk. Example: 'v4.12.0' => '4.12.0'
+ let nodejs_version = matchstr(nodejs_version, '\(\d\.\?\)\+')
+ " [major, minor, patch]
+ let v_list = split(nodejs_version, '\.')
+ return len(v_list) == 3
+ \ && ((str2nr(v_list[0]) > str2nr(a:min_major))
+ \ || (str2nr(v_list[0]) == str2nr(a:min_major)
+ \ && str2nr(v_list[1]) >= str2nr(a:min_minor)))
+endfunction
+
+let s:NodeHandler = {
+\ 'stdout_buffered': v:true,
+\ 'result': ''
+\ }
+function! s:NodeHandler.on_exit(job_id, data, event) abort
+ let bin_dir = join(get(self, 'stdout', []), '')
+ let entry_point = bin_dir . self.entry_point
+ let self.result = filereadable(entry_point) ? entry_point : ''
+endfunction
+
+" Support for --inspect-brk requires node 6.12+ or 7.6+ or 8+
+" Return 1 if it is supported
+" Return 0 otherwise
+function! provider#node#can_inspect() abort
+ if !executable('node')
+ return 0
+ endif
+ let ver = get(split(system(['node', '-v']), "\n"), 0, '')
+ if v:shell_error || ver[0] !=# 'v'
+ return 0
+ endif
+ return (ver[1] ==# '6' && s:is_minimum_version(ver, 6, 12))
+ \ || s:is_minimum_version(ver, 7, 6)
+endfunction
+
+function! provider#node#Detect() abort
+ if exists('g:node_host_prog')
+ return expand(g:node_host_prog)
+ endif
+ if !s:is_minimum_version(v:null, 6, 0)
+ return ''
+ endif
+
+ let npm_opts = {}
+ if executable('npm')
+ let npm_opts = deepcopy(s:NodeHandler)
+ let npm_opts.entry_point = '/neovim/bin/cli.js'
+ let npm_opts.job_id = jobstart('npm --loglevel silent root -g', npm_opts)
+ endif
+
+ let yarn_opts = {}
+ if executable('yarn')
+ let yarn_opts = deepcopy(s:NodeHandler)
+ let yarn_opts.entry_point = '/node_modules/neovim/bin/cli.js'
+ " `yarn global dir` is slow (> 250ms), try the default path first
+ " XXX: The following code is not portable
+ " https://github.com/yarnpkg/yarn/issues/2049#issuecomment-263183768
+ if has('unix')
+ let yarn_default_path = $HOME . '/.config/yarn/global/' . yarn_opts.entry_point
+ if filereadable(yarn_default_path)
+ return yarn_default_path
+ endif
+ endif
+ let yarn_opts.job_id = jobstart('yarn global dir', yarn_opts)
+ endif
+
+ " npm returns the directory faster, so let's check that first
+ if !empty(npm_opts)
+ let result = jobwait([npm_opts.job_id])
+ if result[0] == 0 && npm_opts.result != ''
+ return npm_opts.result
+ endif
+ endif
+
+ if !empty(yarn_opts)
+ let result = jobwait([yarn_opts.job_id])
+ if result[0] == 0 && yarn_opts.result != ''
+ return yarn_opts.result
+ endif
+ endif
+
+ return ''
+endfunction
+
+function! provider#node#Prog() abort
+ return s:prog
+endfunction
+
+function! provider#node#Require(host) abort
+ if s:err != ''
+ echoerr s:err
+ return
+ endif
+
+ let args = ['node']
+
+ if !empty($NVIM_NODE_HOST_DEBUG) && provider#node#can_inspect()
+ call add(args, '--inspect-brk')
+ endif
+
+ call add(args, provider#node#Prog())
+
+ return provider#Poll(args, a:host.orig_name, '$NVIM_NODE_LOG_FILE')
+endfunction
+
+function! provider#node#Call(method, args) abort
+ if s:err != ''
+ echoerr s:err
+ return
+ endif
+
+ if !exists('s:host')
+ try
+ let s:host = remote#host#Require('node')
+ catch
+ let s:err = v:exception
+ echohl WarningMsg
+ echomsg v:exception
+ echohl None
+ return
+ endtry
+ endif
+ return call('rpcrequest', insert(insert(a:args, 'node_'.a:method), s:host))
+endfunction
+
+
+let s:err = ''
+let s:prog = provider#node#Detect()
+
+if empty(s:prog)
+ let s:err = 'Cannot find the "neovim" node package. Try :checkhealth'
+endif
+
+call remote#host#RegisterPlugin('node-provider', 'node', [])
diff --git a/runtime/autoload/provider/python.vim b/runtime/autoload/provider/python.vim
index b99a046375..a06cbe4814 100644
--- a/runtime/autoload/provider/python.vim
+++ b/runtime/autoload/provider/python.vim
@@ -1,5 +1,5 @@
" The Python provider uses a Python host to emulate an environment for running
-" python-vim plugins. See ":help provider".
+" python-vim plugins. :help provider
"
" Associating the plugin with the Python host is the first step because plugins
" will be passed as command-line arguments
@@ -11,11 +11,11 @@ let g:loaded_python_provider = 1
let [s:prog, s:err] = provider#pythonx#Detect(2)
-function! provider#python#Prog()
+function! provider#python#Prog() abort
return s:prog
endfunction
-function! provider#python#Error()
+function! provider#python#Error() abort
return s:err
endfunction
@@ -29,7 +29,7 @@ endif
call remote#host#RegisterClone('legacy-python-provider', 'python')
call remote#host#RegisterPlugin('legacy-python-provider', 'script_host.py', [])
-function! provider#python#Call(method, args)
+function! provider#python#Call(method, args) abort
if s:err != ''
return
endif
diff --git a/runtime/autoload/provider/python3.vim b/runtime/autoload/provider/python3.vim
index 4f47a03a9b..242a224cb3 100644
--- a/runtime/autoload/provider/python3.vim
+++ b/runtime/autoload/provider/python3.vim
@@ -1,5 +1,5 @@
" The Python3 provider uses a Python3 host to emulate an environment for running
-" python3 plugins. See ":help provider".
+" python3 plugins. :help provider
"
" Associating the plugin with the Python3 host is the first step because
" plugins will be passed as command-line arguments
@@ -11,11 +11,11 @@ let g:loaded_python3_provider = 1
let [s:prog, s:err] = provider#pythonx#Detect(3)
-function! provider#python3#Prog()
+function! provider#python3#Prog() abort
return s:prog
endfunction
-function! provider#python3#Error()
+function! provider#python3#Error() abort
return s:err
endfunction
@@ -29,7 +29,7 @@ endif
call remote#host#RegisterClone('legacy-python3-provider', 'python3')
call remote#host#RegisterPlugin('legacy-python3-provider', 'script_host.py', [])
-function! provider#python3#Call(method, args)
+function! provider#python3#Call(method, args) abort
if s:err != ''
return
endif
diff --git a/runtime/autoload/provider/pythonx.vim b/runtime/autoload/provider/pythonx.vim
index 0ebf00112f..59b1c27b72 100644
--- a/runtime/autoload/provider/pythonx.vim
+++ b/runtime/autoload/provider/pythonx.vim
@@ -9,7 +9,8 @@ function! provider#pythonx#Require(host) abort
let ver = (a:host.orig_name ==# 'python') ? 2 : 3
" Python host arguments
- let args = ['-c', 'import sys; sys.path.remove(""); import neovim; neovim.start_host()']
+ let prog = (ver == '2' ? provider#python#Prog() : provider#python3#Prog())
+ let args = [prog, '-c', 'import sys; sys.path.remove(""); import neovim; neovim.start_host()']
" Collect registered Python plugins into args
let python_plugins = remote#host#PluginsForHost(a:host.name)
@@ -17,103 +18,98 @@ function! provider#pythonx#Require(host) abort
call add(args, plugin.path)
endfor
- try
- let channel_id = rpcstart((ver ==# '2' ?
- \ provider#python#Prog() : provider#python3#Prog()), args)
- if rpcrequest(channel_id, 'poll') ==# 'ok'
- return channel_id
- endif
- catch
- echomsg v:throwpoint
- echomsg v:exception
- endtry
- throw remote#host#LoadErrorForHost(a:host.orig_name,
- \ '$NVIM_PYTHON_LOG_FILE')
+ return provider#Poll(args, a:host.orig_name, '$NVIM_PYTHON_LOG_FILE')
endfunction
-function! provider#pythonx#Detect(major_ver) abort
- let host_var = (a:major_ver == 2) ?
- \ 'g:python_host_prog' : 'g:python3_host_prog'
- let skip_var = (a:major_ver == 2) ?
- \ 'g:python_host_skip_check' : 'g:python3_host_skip_check'
- let skip = exists(skip_var) ? {skip_var} : 0
- if exists(host_var)
- " Disable auto detection.
- let [result, err] = s:check_interpreter({host_var}, a:major_ver, skip)
- if result
- return [{host_var}, err]
- endif
- return ['', 'provider/pythonx: Could not load Python ' . a:major_ver
- \ . ' from ' . host_var . ': ' . err]
- endif
+function! s:get_python_executable_from_host_var(major_version) abort
+ return expand(get(g:, 'python'.(a:major_version == 3 ? '3' : '').'_host_prog', ''))
+endfunction
- let prog_suffixes = (a:major_ver == 2) ?
- \ ['2', '2.7', '2.6', '']
- \ : ['3', '3.5', '3.4', '3.3', '']
+function! s:get_python_candidates(major_version) abort
+ return {
+ \ 2: ['python2', 'python2.7', 'python2.6', 'python'],
+ \ 3: ['python3', 'python3.7', 'python3.6', 'python3.5', 'python3.4', 'python3.3',
+ \ 'python']
+ \ }[a:major_version]
+endfunction
+" Returns [path_to_python_executable, error_message]
+function! provider#pythonx#Detect(major_version) abort
+ return provider#pythonx#DetectByModule('neovim', a:major_version)
+endfunction
+
+" Returns [path_to_python_executable, error_message]
+function! provider#pythonx#DetectByModule(module, major_version) abort
+ let python_exe = s:get_python_executable_from_host_var(a:major_version)
+
+ if !empty(python_exe)
+ return [python_exe, '']
+ endif
+
+ let candidates = s:get_python_candidates(a:major_version)
let errors = []
- for prog in map(prog_suffixes, "'python' . v:val")
- let [result, err] = s:check_interpreter(prog, a:major_ver, skip)
+
+ for exe in candidates
+ let [result, error] = provider#pythonx#CheckForModule(exe, a:module, a:major_version)
if result
- return [prog, err]
+ return [exe, error]
endif
-
- " Accumulate errors in case we don't find
- " any suitable Python interpreter.
- call add(errors, err)
+ " Accumulate errors in case we don't find any suitable Python executable.
+ call add(errors, error)
endfor
- " No suitable Python interpreter found.
- return ['', 'provider/pythonx: Could not load Python ' . a:major_ver
- \ . ":\n" . join(errors, "\n")]
+ " No suitable Python executable found.
+ return ['', 'provider/pythonx: Could not load Python '.a:major_version.":\n".join(errors, "\n")]
endfunction
-function! s:check_interpreter(prog, major_ver, skip) abort
+" Returns array: [prog_exitcode, prog_version]
+function! s:import_module(prog, module) abort
+ let prog_version = system([a:prog, '-c' , printf(
+ \ 'import sys; ' .
+ \ 'sys.path.remove(""); ' .
+ \ 'sys.stdout.write(str(sys.version_info[0]) + "." + str(sys.version_info[1])); ' .
+ \ 'import pkgutil; ' .
+ \ 'exit(2*int(pkgutil.get_loader("%s") is None))',
+ \ a:module)])
+ return [v:shell_error, prog_version]
+endfunction
+
+" Returns array: [was_success, error_message]
+function! provider#pythonx#CheckForModule(prog, module, major_version) abort
let prog_path = exepath(a:prog)
if prog_path ==# ''
return [0, a:prog . ' not found in search path or not executable.']
endif
- if a:skip
- return [1, '']
- endif
-
- let min_version = (a:major_ver == 2) ? '2.6' : '3.3'
+ let min_version = (a:major_version == 2) ? '2.6' : '3.3'
- " Try to load neovim module, and output Python version.
- " Return codes:
- " 0 Neovim module can be loaded.
- " 2 Neovim module cannot be loaded.
+ " Try to load module, and output Python version.
+ " Exit codes:
+ " 0 module can be loaded.
+ " 2 module cannot be loaded.
" Otherwise something else went wrong (e.g. 1 or 127).
- let prog_ver = system([ a:prog , '-c' ,
- \ 'import sys; ' .
- \ 'sys.path.remove(""); ' .
- \ 'sys.stdout.write(str(sys.version_info[0]) + "." + str(sys.version_info[1])); ' .
- \ 'import pkgutil; ' .
- \ 'exit(2*int(pkgutil.get_loader("neovim") is None))'
- \ ])
+ let [prog_exitcode, prog_version] = s:import_module(a:prog, a:module)
- if v:shell_error == 2 || v:shell_error == 0
+ if prog_exitcode == 2 || prog_exitcode == 0
" Check version only for expected return codes.
- if prog_ver !~ '^' . a:major_ver
- return [0, prog_path . ' is Python ' . prog_ver . ' and cannot provide Python '
- \ . a:major_ver . '.']
- elseif prog_ver =~ '^' . a:major_ver && prog_ver < min_version
- return [0, prog_path . ' is Python ' . prog_ver . ' and cannot provide Python >= '
+ if prog_version !~ '^' . a:major_version
+ return [0, prog_path . ' is Python ' . prog_version . ' and cannot provide Python '
+ \ . a:major_version . '.']
+ elseif prog_version =~ '^' . a:major_version && prog_version < min_version
+ return [0, prog_path . ' is Python ' . prog_version . ' and cannot provide Python >= '
\ . min_version . '.']
endif
endif
- if v:shell_error == 2
- return [0, prog_path . ' does not have the neovim module installed. '
- \ . 'See ":help provider-python".']
- elseif v:shell_error == 127
+ if prog_exitcode == 2
+ return [0, prog_path.' does not have the "' . a:module . '" module. :help provider-python']
+ elseif prog_exitcode == 127
" This can happen with pyenv's shims.
- return [0, prog_path . ' does not exist: ' . prog_ver]
- elseif v:shell_error
+ return [0, prog_path . ' does not exist: ' . prog_version]
+ elseif prog_exitcode
return [0, 'Checking ' . prog_path . ' caused an unknown error. '
- \ . '(' . v:shell_error . ', output: ' . prog_ver . ')'
- \ . ' Please report this at github.com/neovim/neovim.']
+ \ . '(' . prog_exitcode . ', output: ' . prog_version . ')'
+ \ . ' Report this at https://github.com/neovim/neovim']
endif
return [1, '']
diff --git a/runtime/autoload/provider/ruby.vim b/runtime/autoload/provider/ruby.vim
index aad8c09d28..3b4c6c4839 100644
--- a/runtime/autoload/provider/ruby.vim
+++ b/runtime/autoload/provider/ruby.vim
@@ -1,34 +1,71 @@
" The Ruby provider helper
-if exists('s:loaded_ruby_provider')
+if exists('g:loaded_ruby_provider')
finish
endif
+let g:loaded_ruby_provider = 1
-let s:loaded_ruby_provider = 1
+function! provider#ruby#Detect() abort
+ return s:prog
+endfunction
+
+function! provider#ruby#Prog() abort
+ return s:prog
+endfunction
function! provider#ruby#Require(host) abort
- " Collect registered Ruby plugins into args
- let args = []
+ let prog = provider#ruby#Prog()
let ruby_plugins = remote#host#PluginsForHost(a:host.name)
for plugin in ruby_plugins
- call add(args, plugin.path)
+ let prog .= " " . shellescape(plugin.path)
endfor
- try
- let channel_id = rpcstart(provider#ruby#Prog(), args)
+ return provider#Poll(prog, a:host.orig_name, '$NVIM_RUBY_LOG_FILE')
+endfunction
- if rpcrequest(channel_id, 'poll') == 'ok'
- return channel_id
- endif
- catch
- echomsg v:throwpoint
- echomsg v:exception
- endtry
+function! provider#ruby#Call(method, args) abort
+ if s:err != ''
+ echoerr s:err
+ return
+ endif
- throw remote#host#LoadErrorForHost(a:host.orig_name,
- \ '$NVIM_RUBY_LOG_FILE')
+ if !exists('s:host')
+ try
+ let s:host = remote#host#Require('legacy-ruby-provider')
+ catch
+ let s:err = v:exception
+ echohl WarningMsg
+ echomsg v:exception
+ echohl None
+ return
+ endtry
+ endif
+ return call('rpcrequest', insert(insert(a:args, 'ruby_'.a:method), s:host))
endfunction
-function! provider#ruby#Prog() abort
- return 'neovim-ruby-host'
+function! s:detect()
+ if exists("g:ruby_host_prog")
+ return expand(g:ruby_host_prog)
+ elseif has('win32')
+ return exepath('neovim-ruby-host.bat')
+ else
+ let p = exepath('neovim-ruby-host')
+ if empty(p)
+ return ''
+ endif
+ " neovim-ruby-host could be an rbenv shim for another Ruby version.
+ call system(p)
+ return v:shell_error ? '' : p
+ end
endfunction
+
+let s:err = ''
+let s:prog = s:detect()
+let s:plugin_path = expand('<sfile>:p:h') . '/script_host.rb'
+
+if empty(s:prog)
+ let s:err = 'Cannot find the neovim RubyGem. Try :checkhealth'
+endif
+
+call remote#host#RegisterClone('legacy-ruby-provider', 'ruby')
+call remote#host#RegisterPlugin('legacy-ruby-provider', s:plugin_path, [])
diff --git a/runtime/autoload/provider/script_host.rb b/runtime/autoload/provider/script_host.rb
new file mode 100644
index 0000000000..a1c58bde85
--- /dev/null
+++ b/runtime/autoload/provider/script_host.rb
@@ -0,0 +1,6 @@
+begin
+ require 'neovim/ruby_provider'
+rescue LoadError
+ warn('Your neovim RubyGem is missing or out of date.',
+ 'Install the latest version using `gem install neovim`.')
+end
diff --git a/runtime/autoload/remote/define.vim b/runtime/autoload/remote/define.vim
index b04a5d2280..2688a62a82 100644
--- a/runtime/autoload/remote/define.vim
+++ b/runtime/autoload/remote/define.vim
@@ -89,7 +89,8 @@ endfunction
function! remote#define#AutocmdOnHost(host, method, sync, name, opts)
let group = s:GetNextAutocmdGroup()
- let forward = '"doau '.group.' '.a:name.' ".'.'expand("<amatch>")'
+ let forward = '"doau '.group.' '.a:name.' ".'
+ \ . 'fnameescape(expand("<amatch>"))'
let a:opts.group = group
let bootstrap_def = s:GetAutocmdPrefix(a:name, a:opts)
\ .' call remote#define#AutocmdBootstrap("'.a:host.'"'
@@ -168,14 +169,40 @@ function! remote#define#FunctionOnChannel(channel, method, sync, name, opts)
exe function_def
endfunction
+let s:busy = {}
+let s:pending_notifications = {}
function! s:GetRpcFunction(sync)
- if a:sync
- return 'rpcrequest'
+ if a:sync ==# 'urgent'
+ return 'rpcnotify'
+ elseif a:sync
+ return 'remote#define#request'
endif
- return 'rpcnotify'
+ return 'remote#define#notify'
endfunction
+function! remote#define#notify(chan, ...)
+ if get(s:busy, a:chan, 0) > 0
+ let pending = get(s:pending_notifications, a:chan, [])
+ call add(pending, deepcopy(a:000))
+ let s:pending_notifications[a:chan] = pending
+ else
+ call call('rpcnotify', [a:chan] + a:000)
+ endif
+endfunction
+
+function! remote#define#request(chan, ...)
+ let s:busy[a:chan] = get(s:busy, a:chan, 0)+1
+ let val = call('rpcrequest', [a:chan]+a:000)
+ let s:busy[a:chan] -= 1
+ if s:busy[a:chan] == 0
+ for msg in get(s:pending_notifications, a:chan, [])
+ call call('rpcnotify', [a:chan] + msg)
+ endfor
+ let s:pending_notifications[a:chan] = []
+ endif
+ return val
+endfunction
function! s:GetCommandPrefix(name, opts)
return 'command!'.s:StringifyOpts(a:opts, ['nargs', 'complete', 'range',
diff --git a/runtime/autoload/remote/host.vim b/runtime/autoload/remote/host.vim
index 4ec2eeb5b7..6266b312bd 100644
--- a/runtime/autoload/remote/host.vim
+++ b/runtime/autoload/remote/host.vim
@@ -2,7 +2,6 @@ let s:hosts = {}
let s:plugin_patterns = {}
let s:plugins_for_host = {}
-
" Register a host by associating it with a factory(funcref)
function! remote#host#Register(name, pattern, factory) abort
let s:hosts[a:name] = {'factory': a:factory, 'channel': 0, 'initialized': 0}
@@ -13,7 +12,6 @@ function! remote#host#Register(name, pattern, factory) abort
endif
endfunction
-
" Register a clone to an existing host. The new host will use the same factory
" as `source`, but it will run as a different process. This can be used by
" plugins that should run isolated from other plugins created for the same host
@@ -31,12 +29,8 @@ function! remote#host#RegisterClone(name, orig_name) abort
\ }
endfunction
-
" Get a host channel, bootstrapping it if necessary
function! remote#host#Require(name) abort
- if empty(s:plugins_for_host)
- call remote#host#LoadRemotePlugins()
- endif
if !has_key(s:hosts, a:name)
throw 'No host named "'.a:name.'" is registered'
endif
@@ -52,7 +46,6 @@ function! remote#host#Require(name) abort
return host.channel
endfunction
-
function! remote#host#IsRunning(name) abort
if !has_key(s:hosts, a:name)
throw 'No host named "'.a:name.'" is registered'
@@ -60,7 +53,6 @@ function! remote#host#IsRunning(name) abort
return s:hosts[a:name].channel != 0
endfunction
-
" Example of registering a Python plugin with two commands (one async), one
" autocmd (async) and one function (sync):
"
@@ -117,37 +109,14 @@ function! remote#host#RegisterPlugin(host, path, specs) abort
call add(plugins, {'path': a:path, 'specs': a:specs})
endfunction
-
-function! s:GetManifest() abort
- let prefix = exists('$MYVIMRC')
- \ ? $MYVIMRC
- \ : matchstr(get(split(capture('scriptnames'), '\n'), 0, ''), '\f\+$')
- return fnamemodify(expand(prefix, 1), ':h')
- \.'/.'.fnamemodify(prefix, ':t').'-rplugin~'
-endfunction
-
-
-function! remote#host#LoadRemotePlugins() abort
- if filereadable(s:GetManifest())
- exe 'source '.s:GetManifest()
- endif
-endfunction
-
-
-function! remote#host#LoadRemotePluginsEvent(event, pattern) abort
- autocmd! nvim-rplugin
- call remote#host#LoadRemotePlugins()
- execute 'silent doautocmd <nomodeline>' a:event a:pattern
-endfunction
-
-
function! s:RegistrationCommands(host) abort
" Register a temporary host clone for discovering specs
let host_id = a:host.'-registration-clone'
call remote#host#RegisterClone(host_id, a:host)
let pattern = s:plugin_patterns[a:host]
- let paths = globpath(&rtp, 'rplugin/'.a:host.'/'.pattern, 0, 1)
- let paths = map(paths, 'tr(v:val,"\\","/")') " Normalize slashes #4795
+ let paths = globpath(&rtp, 'rplugin/'.a:host.'/'.pattern, 1, 1)
+ let paths = map(paths, 'tr(resolve(v:val),"\\","/")') " Normalize slashes #4795
+ let paths = uniq(sort(paths))
if empty(paths)
return []
endif
@@ -184,7 +153,6 @@ function! s:RegistrationCommands(host) abort
return lines
endfunction
-
function! remote#host#UpdateRemotePlugins() abort
let commands = []
let hosts = keys(s:hosts)
@@ -201,12 +169,11 @@ function! remote#host#UpdateRemotePlugins() abort
endtry
endif
endfor
- call writefile(commands, s:GetManifest())
- echomsg printf('remote/host: generated the manifest file in "%s"',
- \ s:GetManifest())
+ call writefile(commands, g:loaded_remote_plugins)
+ echomsg printf('remote/host: generated rplugin manifest: %s',
+ \ g:loaded_remote_plugins)
endfunction
-
function! remote#host#PluginsForHost(host) abort
if !has_key(s:plugins_for_host, a:host)
let s:plugins_for_host[a:host] = []
@@ -214,18 +181,13 @@ function! remote#host#PluginsForHost(host) abort
return s:plugins_for_host[a:host]
endfunction
-
function! remote#host#LoadErrorForHost(host, log) abort
return 'Failed to load '. a:host . ' host. '.
- \ 'You can try to see what happened '.
- \ 'by starting Neovim with the environment variable '.
- \ a:log . ' set to a file and opening the generated '.
- \ 'log file. Also, the host stderr will be available '.
- \ 'in Neovim log, so it may contain useful information. '.
- \ 'See also ~/.nvimlog.'
+ \ 'You can try to see what happened by starting nvim with '.
+ \ a:log . ' set and opening the generated log file.'.
+ \ ' Also, the host stderr is available in messages.'
endfunction
-
" Registration of standard hosts
" Python/Python3
@@ -237,3 +199,7 @@ call remote#host#Register('python3', '*',
" Ruby
call remote#host#Register('ruby', '*.rb',
\ function('provider#ruby#Require'))
+
+" nodejs
+call remote#host#Register('node', '*',
+ \ function('provider#node#Require'))
diff --git a/runtime/autoload/rubycomplete.vim b/runtime/autoload/rubycomplete.vim
index e1064c8a58..40b87f4cbe 100644
--- a/runtime/autoload/rubycomplete.vim
+++ b/runtime/autoload/rubycomplete.vim
@@ -93,7 +93,7 @@ function! s:GetBufferRubyEntity( name, type, ... )
let stopline = 1
- let crex = '^\s*\<' . a:type . '\>\s*\<' . a:name . '\>\s*\(<\s*.*\s*\)\?'
+ let crex = '^\s*\<' . a:type . '\>\s*\<' . escape(a:name, '*') . '\>\s*\(<\s*.*\s*\)\?'
let [lnum,lcol] = searchpos( crex, 'w' )
"let [lnum,lcol] = searchpairpos( crex . '\zs', '', '\(end\|}\)', 'w' )
@@ -149,7 +149,7 @@ function! s:GetRubyVarType(v)
let ctors = ctors.'\)'
let fstr = '=\s*\([^ \t]\+.' . ctors .'\>\|[\[{"''/]\|%[xwQqr][(\[{@]\|[A-Za-z0-9@:\-()\.]\+...\?\|lambda\|&\)'
- let sstr = ''.a:v.'\>\s*[+\-*/]*'.fstr
+ let sstr = ''.escape(a:v, '*').'\>\s*[+\-*/]*'.fstr
let [lnum,lcol] = searchpos(sstr,'nb',stopline)
if lnum != 0 && lcol != 0
let str = matchstr(getline(lnum),fstr,lcol)
@@ -196,7 +196,7 @@ function! rubycomplete#Complete(findstart, base)
if c =~ '\w'
continue
elseif ! c =~ '\.'
- idx = -1
+ let idx = -1
break
else
break
@@ -266,6 +266,28 @@ class VimRubyCompletion
end
end
+ def load_gems
+ fpath = VIM::evaluate("get(g:, 'rubycomplete_gemfile_path', 'Gemfile')")
+ return unless File.file?(fpath) && File.readable?(fpath)
+ want_bundler = VIM::evaluate("get(g:, 'rubycomplete_use_bundler')")
+ parse_file = !want_bundler
+ begin
+ require 'bundler'
+ Bundler.setup
+ Bundler.require
+ rescue Exception
+ parse_file = true
+ end
+ if parse_file
+ File.new(fpath).each_line do |line|
+ begin
+ require $1 if /\s*gem\s*['"]([^'"]+)/.match(line)
+ rescue Exception
+ end
+ end
+ end
+ end
+
def load_buffer_class(name)
dprint "load_buffer_class(%s) START" % name
classdef = get_buffer_entity(name, 's:GetBufferRubyClass("%s")')
@@ -588,6 +610,10 @@ class VimRubyCompletion
load_rails
end
+ want_gems = VIM::evaluate("get(g:, 'rubycomplete_load_gemfile')")
+ load_gems unless want_gems.to_i.zero?
+
+
input = VIM::Buffer.current.line
cpos = VIM::Window.current.cursor[1] - 1
input = input[0..cpos]
@@ -678,7 +704,9 @@ class VimRubyCompletion
cv = eval("self.class.constants")
vartype = get_var_type( receiver )
dprint "vartype: %s" % vartype
- if vartype != ''
+
+ invalid_vartype = ['', "gets"]
+ if !invalid_vartype.include?(vartype)
load_buffer_class( vartype )
begin
@@ -706,7 +734,7 @@ class VimRubyCompletion
methods.concat m.instance_methods(false)
}
end
- variables += add_rails_columns( "#{vartype}" ) if vartype && vartype.length > 0
+ variables += add_rails_columns( "#{vartype}" ) if vartype && !invalid_vartype.include?(vartype)
when /^\(?\s*[A-Za-z0-9:^@.%\/+*\(\)]+\.\.\.?[A-Za-z0-9:^@.%\/+*\(\)]+\s*\)?\.([^.]*)/
message = $1
diff --git a/runtime/autoload/rust.vim b/runtime/autoload/rust.vim
new file mode 100644
index 0000000000..34a3b41773
--- /dev/null
+++ b/runtime/autoload/rust.vim
@@ -0,0 +1,415 @@
+" Author: Kevin Ballard
+" Description: Helper functions for Rust commands/mappings
+" Last Modified: May 27, 2014
+" For bugs, patches and license go to https://github.com/rust-lang/rust.vim
+
+" Jump {{{1
+
+function! rust#Jump(mode, function) range
+ let cnt = v:count1
+ normal! m'
+ if a:mode ==# 'v'
+ norm! gv
+ endif
+ let foldenable = &foldenable
+ set nofoldenable
+ while cnt > 0
+ execute "call <SID>Jump_" . a:function . "()"
+ let cnt = cnt - 1
+ endwhile
+ let &foldenable = foldenable
+endfunction
+
+function! s:Jump_Back()
+ call search('{', 'b')
+ keepjumps normal! w99[{
+endfunction
+
+function! s:Jump_Forward()
+ normal! j0
+ call search('{', 'b')
+ keepjumps normal! w99[{%
+ call search('{')
+endfunction
+
+" Run {{{1
+
+function! rust#Run(bang, args)
+ let args = s:ShellTokenize(a:args)
+ if a:bang
+ let idx = index(l:args, '--')
+ if idx != -1
+ let rustc_args = idx == 0 ? [] : l:args[:idx-1]
+ let args = l:args[idx+1:]
+ else
+ let rustc_args = l:args
+ let args = []
+ endif
+ else
+ let rustc_args = []
+ endif
+
+ let b:rust_last_rustc_args = l:rustc_args
+ let b:rust_last_args = l:args
+
+ call s:WithPath(function("s:Run"), rustc_args, args)
+endfunction
+
+function! s:Run(dict, rustc_args, args)
+ let exepath = a:dict.tmpdir.'/'.fnamemodify(a:dict.path, ':t:r')
+ if has('win32')
+ let exepath .= '.exe'
+ endif
+
+ let relpath = get(a:dict, 'tmpdir_relpath', a:dict.path)
+ let rustc_args = [relpath, '-o', exepath] + a:rustc_args
+
+ let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc"
+
+ let pwd = a:dict.istemp ? a:dict.tmpdir : ''
+ let output = s:system(pwd, shellescape(rustc) . " " . join(map(rustc_args, 'shellescape(v:val)')))
+ if output != ''
+ echohl WarningMsg
+ echo output
+ echohl None
+ endif
+ if !v:shell_error
+ exe '!' . shellescape(exepath) . " " . join(map(a:args, 'shellescape(v:val)'))
+ endif
+endfunction
+
+" Expand {{{1
+
+function! rust#Expand(bang, args)
+ let args = s:ShellTokenize(a:args)
+ if a:bang && !empty(l:args)
+ let pretty = remove(l:args, 0)
+ else
+ let pretty = "expanded"
+ endif
+ call s:WithPath(function("s:Expand"), pretty, args)
+endfunction
+
+function! s:Expand(dict, pretty, args)
+ try
+ let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc"
+
+ if a:pretty =~? '^\%(everybody_loops$\|flowgraph=\)'
+ let flag = '--xpretty'
+ else
+ let flag = '--pretty'
+ endif
+ let relpath = get(a:dict, 'tmpdir_relpath', a:dict.path)
+ let args = [relpath, '-Z', 'unstable-options', l:flag, a:pretty] + a:args
+ let pwd = a:dict.istemp ? a:dict.tmpdir : ''
+ let output = s:system(pwd, shellescape(rustc) . " " . join(map(args, 'shellescape(v:val)')))
+ if v:shell_error
+ echohl WarningMsg
+ echo output
+ echohl None
+ else
+ new
+ silent put =output
+ 1
+ d
+ setl filetype=rust
+ setl buftype=nofile
+ setl bufhidden=hide
+ setl noswapfile
+ " give the buffer a nice name
+ let suffix = 1
+ let basename = fnamemodify(a:dict.path, ':t:r')
+ while 1
+ let bufname = basename
+ if suffix > 1 | let bufname .= ' ('.suffix.')' | endif
+ let bufname .= '.pretty.rs'
+ if bufexists(bufname)
+ let suffix += 1
+ continue
+ endif
+ exe 'silent noautocmd keepalt file' fnameescape(bufname)
+ break
+ endwhile
+ endif
+ endtry
+endfunction
+
+function! rust#CompleteExpand(lead, line, pos)
+ if a:line[: a:pos-1] =~ '^RustExpand!\s*\S*$'
+ " first argument and it has a !
+ let list = ["normal", "expanded", "typed", "expanded,identified", "flowgraph=", "everybody_loops"]
+ if !empty(a:lead)
+ call filter(list, "v:val[:len(a:lead)-1] == a:lead")
+ endif
+ return list
+ endif
+
+ return glob(escape(a:lead, "*?[") . '*', 0, 1)
+endfunction
+
+" Emit {{{1
+
+function! rust#Emit(type, args)
+ let args = s:ShellTokenize(a:args)
+ call s:WithPath(function("s:Emit"), a:type, args)
+endfunction
+
+function! s:Emit(dict, type, args)
+ try
+ let output_path = a:dict.tmpdir.'/output'
+
+ let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc"
+
+ let relpath = get(a:dict, 'tmpdir_relpath', a:dict.path)
+ let args = [relpath, '--emit', a:type, '-o', output_path] + a:args
+ let pwd = a:dict.istemp ? a:dict.tmpdir : ''
+ let output = s:system(pwd, shellescape(rustc) . " " . join(map(args, 'shellescape(v:val)')))
+ if output != ''
+ echohl WarningMsg
+ echo output
+ echohl None
+ endif
+ if !v:shell_error
+ new
+ exe 'silent keepalt read' fnameescape(output_path)
+ 1
+ d
+ if a:type == "llvm-ir"
+ setl filetype=llvm
+ let extension = 'll'
+ elseif a:type == "asm"
+ setl filetype=asm
+ let extension = 's'
+ endif
+ setl buftype=nofile
+ setl bufhidden=hide
+ setl noswapfile
+ if exists('l:extension')
+ " give the buffer a nice name
+ let suffix = 1
+ let basename = fnamemodify(a:dict.path, ':t:r')
+ while 1
+ let bufname = basename
+ if suffix > 1 | let bufname .= ' ('.suffix.')' | endif
+ let bufname .= '.'.extension
+ if bufexists(bufname)
+ let suffix += 1
+ continue
+ endif
+ exe 'silent noautocmd keepalt file' fnameescape(bufname)
+ break
+ endwhile
+ endif
+ endif
+ endtry
+endfunction
+
+" Utility functions {{{1
+
+" Invokes func(dict, ...)
+" Where {dict} is a dictionary with the following keys:
+" 'path' - The path to the file
+" 'tmpdir' - The path to a temporary directory that will be deleted when the
+" function returns.
+" 'istemp' - 1 if the path is a file inside of {dict.tmpdir} or 0 otherwise.
+" If {istemp} is 1 then an additional key is provided:
+" 'tmpdir_relpath' - The {path} relative to the {tmpdir}.
+"
+" {dict.path} may be a path to a file inside of {dict.tmpdir} or it may be the
+" existing path of the current buffer. If the path is inside of {dict.tmpdir}
+" then it is guaranteed to have a '.rs' extension.
+function! s:WithPath(func, ...)
+ let buf = bufnr('')
+ let saved = {}
+ let dict = {}
+ try
+ let saved.write = &write
+ set write
+ let dict.path = expand('%')
+ let pathisempty = empty(dict.path)
+
+ " Always create a tmpdir in case the wrapped command wants it
+ let dict.tmpdir = tempname()
+ call mkdir(dict.tmpdir)
+
+ if pathisempty || !saved.write
+ let dict.istemp = 1
+ " if we're doing this because of nowrite, preserve the filename
+ if !pathisempty
+ let filename = expand('%:t:r').".rs"
+ else
+ let filename = 'unnamed.rs'
+ endif
+ let dict.tmpdir_relpath = filename
+ let dict.path = dict.tmpdir.'/'.filename
+
+ let saved.mod = &mod
+ set nomod
+
+ silent exe 'keepalt write! ' . fnameescape(dict.path)
+ if pathisempty
+ silent keepalt 0file
+ endif
+ else
+ let dict.istemp = 0
+ update
+ endif
+
+ call call(a:func, [dict] + a:000)
+ finally
+ if bufexists(buf)
+ for [opt, value] in items(saved)
+ silent call setbufvar(buf, '&'.opt, value)
+ unlet value " avoid variable type mismatches
+ endfor
+ endif
+ if has_key(dict, 'tmpdir') | silent call s:RmDir(dict.tmpdir) | endif
+ endtry
+endfunction
+
+function! rust#AppendCmdLine(text)
+ call setcmdpos(getcmdpos())
+ let cmd = getcmdline() . a:text
+ return cmd
+endfunction
+
+" Tokenize the string according to sh parsing rules
+function! s:ShellTokenize(text)
+ " states:
+ " 0: start of word
+ " 1: unquoted
+ " 2: unquoted backslash
+ " 3: double-quote
+ " 4: double-quoted backslash
+ " 5: single-quote
+ let l:state = 0
+ let l:current = ''
+ let l:args = []
+ for c in split(a:text, '\zs')
+ if l:state == 0 || l:state == 1 " unquoted
+ if l:c ==# ' '
+ if l:state == 0 | continue | endif
+ call add(l:args, l:current)
+ let l:current = ''
+ let l:state = 0
+ elseif l:c ==# '\'
+ let l:state = 2
+ elseif l:c ==# '"'
+ let l:state = 3
+ elseif l:c ==# "'"
+ let l:state = 5
+ else
+ let l:current .= l:c
+ let l:state = 1
+ endif
+ elseif l:state == 2 " unquoted backslash
+ if l:c !=# "\n" " can it even be \n?
+ let l:current .= l:c
+ endif
+ let l:state = 1
+ elseif l:state == 3 " double-quote
+ if l:c ==# '\'
+ let l:state = 4
+ elseif l:c ==# '"'
+ let l:state = 1
+ else
+ let l:current .= l:c
+ endif
+ elseif l:state == 4 " double-quoted backslash
+ if stridx('$`"\', l:c) >= 0
+ let l:current .= l:c
+ elseif l:c ==# "\n" " is this even possible?
+ " skip it
+ else
+ let l:current .= '\'.l:c
+ endif
+ let l:state = 3
+ elseif l:state == 5 " single-quoted
+ if l:c == "'"
+ let l:state = 1
+ else
+ let l:current .= l:c
+ endif
+ endif
+ endfor
+ if l:state != 0
+ call add(l:args, l:current)
+ endif
+ return l:args
+endfunction
+
+function! s:RmDir(path)
+ " sanity check; make sure it's not empty, /, or $HOME
+ if empty(a:path)
+ echoerr 'Attempted to delete empty path'
+ return 0
+ elseif a:path == '/' || a:path == $HOME
+ echoerr 'Attempted to delete protected path: ' . a:path
+ return 0
+ endif
+ return system("rm -rf " . shellescape(a:path))
+endfunction
+
+" Executes {cmd} with the cwd set to {pwd}, without changing Vim's cwd.
+" If {pwd} is the empty string then it doesn't change the cwd.
+function! s:system(pwd, cmd)
+ let cmd = a:cmd
+ if !empty(a:pwd)
+ let cmd = 'cd ' . shellescape(a:pwd) . ' && ' . cmd
+ endif
+ return system(cmd)
+endfunction
+
+" Playpen Support {{{1
+" Parts of gist.vim by Yasuhiro Matsumoto <mattn.jp@gmail.com> reused
+" gist.vim available under the BSD license, available at
+" http://github.com/mattn/gist-vim
+function! s:has_webapi()
+ if !exists("*webapi#http#post")
+ try
+ call webapi#http#post()
+ catch
+ endtry
+ endif
+ return exists("*webapi#http#post")
+endfunction
+
+function! rust#Play(count, line1, line2, ...) abort
+ redraw
+
+ let l:rust_playpen_url = get(g:, 'rust_playpen_url', 'https://play.rust-lang.org/')
+ let l:rust_shortener_url = get(g:, 'rust_shortener_url', 'https://is.gd/')
+
+ if !s:has_webapi()
+ echohl ErrorMsg | echomsg ':RustPlay depends on webapi.vim (https://github.com/mattn/webapi-vim)' | echohl None
+ return
+ endif
+
+ let bufname = bufname('%')
+ if a:count < 1
+ let content = join(getline(a:line1, a:line2), "\n")
+ else
+ let save_regcont = @"
+ let save_regtype = getregtype('"')
+ silent! normal! gvy
+ let content = @"
+ call setreg('"', save_regcont, save_regtype)
+ endif
+
+ let body = l:rust_playpen_url."?code=".webapi#http#encodeURI(content)
+
+ if strlen(body) > 5000
+ echohl ErrorMsg | echomsg 'Buffer too large, max 5000 encoded characters ('.strlen(body).')' | echohl None
+ return
+ endif
+
+ let payload = "format=simple&url=".webapi#http#encodeURI(body)
+ let res = webapi#http#post(l:rust_shortener_url.'create.php', payload, {})
+ let url = res.content
+
+ redraw | echomsg 'Done: '.url
+endfunction
+
+" }}}1
+
+" vim: set noet sw=8 ts=8:
diff --git a/runtime/autoload/rustfmt.vim b/runtime/autoload/rustfmt.vim
new file mode 100644
index 0000000000..a689b5e00d
--- /dev/null
+++ b/runtime/autoload/rustfmt.vim
@@ -0,0 +1,107 @@
+" Author: Stephen Sugden <stephen@stephensugden.com>
+"
+" Adapted from https://github.com/fatih/vim-go
+" For bugs, patches and license go to https://github.com/rust-lang/rust.vim
+
+if !exists("g:rustfmt_autosave")
+ let g:rustfmt_autosave = 0
+endif
+
+if !exists("g:rustfmt_command")
+ let g:rustfmt_command = "rustfmt"
+endif
+
+if !exists("g:rustfmt_options")
+ let g:rustfmt_options = ""
+endif
+
+if !exists("g:rustfmt_fail_silently")
+ let g:rustfmt_fail_silently = 0
+endif
+
+let s:got_fmt_error = 0
+
+function! s:RustfmtCommandRange(filename, line1, line2)
+ let l:arg = {"file": shellescape(a:filename), "range": [a:line1, a:line2]}
+ return printf("%s %s --write-mode=overwrite --file-lines '[%s]'", g:rustfmt_command, g:rustfmt_options, json_encode(l:arg))
+endfunction
+
+function! s:RustfmtCommand(filename)
+ return g:rustfmt_command . " --write-mode=overwrite " . g:rustfmt_options . " " . shellescape(a:filename)
+endfunction
+
+function! s:RunRustfmt(command, curw, tmpname)
+ if exists("*systemlist")
+ let out = systemlist(a:command)
+ else
+ let out = split(system(a:command), '\r\?\n')
+ endif
+
+ if v:shell_error == 0 || v:shell_error == 3
+ " remove undo point caused via BufWritePre
+ try | silent undojoin | catch | endtry
+
+ " Replace current file with temp file, then reload buffer
+ call rename(a:tmpname, expand('%'))
+ silent edit!
+ let &syntax = &syntax
+
+ " only clear location list if it was previously filled to prevent
+ " clobbering other additions
+ if s:got_fmt_error
+ let s:got_fmt_error = 0
+ call setloclist(0, [])
+ lwindow
+ endif
+ elseif g:rustfmt_fail_silently == 0
+ " otherwise get the errors and put them in the location list
+ let errors = []
+
+ for line in out
+ " src/lib.rs:13:5: 13:10 error: expected `,`, or `}`, found `value`
+ let tokens = matchlist(line, '^\(.\{-}\):\(\d\+\):\(\d\+\):\s*\(\d\+:\d\+\s*\)\?\s*error: \(.*\)')
+ if !empty(tokens)
+ call add(errors, {"filename": @%,
+ \"lnum": tokens[2],
+ \"col": tokens[3],
+ \"text": tokens[5]})
+ endif
+ endfor
+
+ if empty(errors)
+ % | " Couldn't detect rustfmt error format, output errors
+ endif
+
+ if !empty(errors)
+ call setloclist(0, errors, 'r')
+ echohl Error | echomsg "rustfmt returned error" | echohl None
+ endif
+
+ let s:got_fmt_error = 1
+ lwindow
+ " We didn't use the temp file, so clean up
+ call delete(a:tmpname)
+ endif
+
+ call winrestview(a:curw)
+endfunction
+
+function! rustfmt#FormatRange(line1, line2)
+ let l:curw = winsaveview()
+ let l:tmpname = expand("%:p:h") . "/." . expand("%:p:t") . ".rustfmt"
+ call writefile(getline(1, '$'), l:tmpname)
+
+ let command = s:RustfmtCommandRange(l:tmpname, a:line1, a:line2)
+
+ call s:RunRustfmt(command, l:curw, l:tmpname)
+endfunction
+
+function! rustfmt#Format()
+ let l:curw = winsaveview()
+ let l:tmpname = expand("%:p:h") . "/." . expand("%:p:t") . ".rustfmt"
+ call writefile(getline(1, '$'), l:tmpname)
+
+ let command = s:RustfmtCommand(l:tmpname)
+
+ call s:RunRustfmt(command, l:curw, l:tmpname)
+endfunction
diff --git a/runtime/autoload/shada.vim b/runtime/autoload/shada.vim
index 9be85b6f2e..87acc515ee 100644
--- a/runtime/autoload/shada.vim
+++ b/runtime/autoload/shada.vim
@@ -45,7 +45,7 @@ call map(copy(s:SHADA_ENTRY_NAMES),
let s:SHADA_MAP_ENTRIES = {
\'search_pattern': ['sp', 'sh', 'ss', 'sb', 'sm', 'sc', 'sl', 'se', 'so',
\ 'su'],
- \'register': ['n', 'rc', 'rw', 'rt'],
+ \'register': ['n', 'rc', 'rw', 'rt', 'ru'],
\'global_mark': ['n', 'f', 'l', 'c'],
\'local_mark': ['f', 'n', 'l', 'c'],
\'jump': ['f', 'l', 'c'],
@@ -139,6 +139,7 @@ let s:SHADA_STANDARD_KEYS = {
\'rt': ['type', 'regtype', s:SHADA_ENUMS.regtype.CHARACTERWISE],
\'rw': ['block width', 'uint', 0],
\'rc': ['contents', 'binarray', s:SHADA_REQUIRED],
+ \'ru': ['is_unnamed', 'boolean', g:msgpack#false],
\'n': ['name', 'intchar', char2nr('"')],
\'l': ['line number', 'uint', 1],
\'c': ['column', 'uint', 0],
@@ -241,8 +242,6 @@ function s:shada_check_type(type, val) abort
if msg isnot# 0
return msg
endif
- if a:val > 0 || a:val < 1
- endif
return 0
elseif a:type is# 'binarray'
if type isnot# 'array'
@@ -359,9 +358,14 @@ function s:shada_string(type, v) abort
if (has_key(s:SHADA_ENUMS, a:type) && type(a:v) == type(0)
\&& has_key(s:SHADA_REV_ENUMS[a:type], a:v))
return s:SHADA_REV_ENUMS[a:type][a:v]
- elseif (a:type is# 'intchar' && type(a:v) == type(0)
- \&& strtrans(nr2char(a:v)) is# nr2char(a:v))
- return "'" . nr2char(a:v) . "'"
+ " Restricting a:v to be <= 127 is not necessary, but intchar constants are
+ " normally expected to be either ASCII printable characters or NUL.
+ elseif a:type is# 'intchar' && type(a:v) == type(0) && a:v >= 0 && a:v <= 127
+ if a:v > 0 && strtrans(nr2char(a:v)) is# nr2char(a:v)
+ return "'" . nr2char(a:v) . "'"
+ else
+ return "'\\" . a:v . "'"
+ endif
else
return msgpack#string(a:v)
endif
diff --git a/runtime/autoload/spellfile.vim b/runtime/autoload/spellfile.vim
index a5ffa514ea..9ec6091218 100644
--- a/runtime/autoload/spellfile.vim
+++ b/runtime/autoload/spellfile.vim
@@ -20,6 +20,7 @@ function! spellfile#LoadFile(lang)
endif
return
endif
+ let lang = tolower(a:lang)
" If the URL changes we try all files again.
if s:spellfile_URL != g:spellfile_URL
@@ -28,13 +29,13 @@ function! spellfile#LoadFile(lang)
endif
" I will say this only once!
- if has_key(s:donedict, a:lang . &enc)
+ if has_key(s:donedict, lang . &enc)
if &verbose
echomsg 'spellfile#LoadFile(): Tried this language/encoding before.'
endif
return
endif
- let s:donedict[a:lang . &enc] = 1
+ let s:donedict[lang . &enc] = 1
" Find spell directories we can write in.
let [dirlist, dirchoices] = spellfile#GetDirChoices()
@@ -88,13 +89,13 @@ function! spellfile#LoadFile(lang)
endif
endif
if newbufnr == winbufnr(0)
- " We are back the old buffer, remove any (half-finished) download.
- g/^/d_
+ " We are back to the old buffer, remove any (half-finished) download.
+ keeppatterns g/^/d_
else
let newbufnr = winbufnr(0)
endif
- let fname = a:lang . '.ascii.spl'
+ let fname = lang . '.ascii.spl'
echo 'Could not find it, trying ' . fname . '...'
call spellfile#Nread(fname)
if getline(2) !~ 'VIMspell'
@@ -127,7 +128,7 @@ function! spellfile#LoadFile(lang)
exe "write " . dirname . '/' . fname
" Also download the .sug file.
- g/^/d_
+ keeppatterns g/^/d_
let fname = substitute(fname, '\.spl$', '.sug', '')
echo 'Downloading ' . fname . '...'
call spellfile#Nread(fname)
@@ -197,7 +198,7 @@ function! spellfile#WritableSpellDir()
" Always use the $XDG_DATA_HOME/nvim/site directory
if exists('$XDG_DATA_HOME')
return $XDG_DATA_HOME . "/nvim/site/spell"
- else
+ elseif !(has('win32') || has('win64'))
return $HOME . "/.local/share/nvim/site/spell"
endif
for dir in split(&rtp, ',')
diff --git a/runtime/autoload/sqlcomplete.vim b/runtime/autoload/sqlcomplete.vim
index e80729add4..ea0d8c2de9 100644
--- a/runtime/autoload/sqlcomplete.vim
+++ b/runtime/autoload/sqlcomplete.vim
@@ -2,7 +2,7 @@
" Language: SQL
" Maintainer: David Fishburn <dfishburn dot vim at gmail dot com>
" Version: 16.0
-" Last Change: 2015 Dec 29
+" Last Change: 2017 Oct 15
" Homepage: http://www.vim.org/scripts/script.php?script_id=1572
" Usage: For detailed help
" ":help sql.txt"
diff --git a/runtime/autoload/tar.vim b/runtime/autoload/tar.vim
index 5e76870cce..dc670dbd14 100644
--- a/runtime/autoload/tar.vim
+++ b/runtime/autoload/tar.vim
@@ -117,7 +117,7 @@ fun! tar#Browse(tarfile)
if !filereadable(a:tarfile)
" call Decho('a:tarfile<'.a:tarfile.'> not filereadable')
if a:tarfile !~# '^\a\+://'
- " if its an url, don't complain, let url-handlers such as vim do its thing
+ " if it's an url, don't complain, let url-handlers such as vim do its thing
redraw!
echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None
endif
@@ -152,10 +152,12 @@ fun! tar#Browse(tarfile)
" assuming cygwin
let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
endif
+
let curlast= line("$")
if tarfile =~# '\.\(gz\|tgz\)$'
+ let gzip_command = s:get_gzip_command(tarfile)
" call Decho("1: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
- exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
+ exe "sil! r! " . gzip_command . " -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
elseif tarfile =~# '\.lrp'
" call Decho("2: exe silent r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ")
exe "sil! r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - "
@@ -287,12 +289,14 @@ fun! tar#Read(fname,mode)
else
let tar_secure= " "
endif
+
if tarfile =~# '\.bz2$'
" call Decho("7: exe silent r! bzip2 -d -c ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp)
exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
elseif tarfile =~# '\.\(gz\|tgz\)$'
+ let gzip_command = s:get_gzip_command(tarfile)
" call Decho("5: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd.' -'.g:tar_readoptions.' - '.tar_secure.shellescape(fname,1))
- exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
+ exe "sil! r! " . gzip_command . " -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
elseif tarfile =~# '\.lrp$'
" call Decho("6: exe silent r! cat ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp)
exe "sil! r! cat -- ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
@@ -389,6 +393,8 @@ fun! tar#Write(fname)
let tarfile = substitute(b:tarfile,'tarfile:\(.\{-}\)::.*$','\1','')
let fname = substitute(b:tarfile,'tarfile:.\{-}::\(.*\)$','\1','')
+ let gzip_command = s:get_gzip_command(tarfile)
+
" handle compressed archives
if tarfile =~# '\.bz2'
call system("bzip2 -d -- ".shellescape(tarfile,0))
@@ -396,12 +402,12 @@ fun! tar#Write(fname)
let compress= "bzip2 -- ".shellescape(tarfile,0)
" call Decho("compress<".compress.">")
elseif tarfile =~# '\.gz'
- call system("gzip -d -- ".shellescape(tarfile,0))
+ call system(gzip_command . " -d -- ".shellescape(tarfile,0))
let tarfile = substitute(tarfile,'\.gz','','e')
let compress= "gzip -- ".shellescape(tarfile,0)
" call Decho("compress<".compress.">")
elseif tarfile =~# '\.tgz'
- call system("gzip -d -- ".shellescape(tarfile,0))
+ call system(gzip_command . " -d -- ".shellescape(tarfile,0))
let tarfile = substitute(tarfile,'\.tgz','.tar','e')
let compress= "gzip -- ".shellescape(tarfile,0)
let tgz = 1
@@ -581,7 +587,10 @@ fun! tar#Vimuntar(...)
" if necessary, decompress the tarball; then, extract it
if tartail =~ '\.tgz'
- if executable("gunzip")
+ let gzip_command = s:get_gzip_command(tarfile)
+ if executable(gzip_command)
+ silent exe "!" . gzip_command . " -d ".shellescape(tartail)
+ elseif executable("gunzip")
silent exe "!gunzip ".shellescape(tartail)
elseif executable("gzip")
silent exe "!gzip -d ".shellescape(tartail)
@@ -619,6 +628,28 @@ fun! tar#Vimuntar(...)
" call Dret("tar#Vimuntar")
endfun
+func s:get_gzip_command(file)
+ " Try using the "file" command to get the actual compression type, since
+ " there is no standard way for the naming: ".tgz", ".tbz", ".txz", etc.
+ " If the "file" command doesn't work fall back to just using the file name.
+ if a:file =~# 'z$'
+ let filetype = system('file ' . a:file)
+ if filetype =~ 'bzip2 compressed' && executable('bzip2')
+ return 'bzip2'
+ endif
+ if filetype =~ 'XZ compressed' && executable('xz')
+ return 'xz'
+ endif
+ endif
+ if a:file =~# 'bz2$'
+ return 'bzip2'
+ endif
+ if a:file =~# 'xz$'
+ return 'xz'
+ endif
+ return 'gzip'
+endfunc
+
" =====================================================================
" Modelines And Restoration: {{{1
let &cpo= s:keepcpo
diff --git a/runtime/autoload/tutor.vim b/runtime/autoload/tutor.vim
index 43d8a87886..3265fdde36 100644
--- a/runtime/autoload/tutor.vim
+++ b/runtime/autoload/tutor.vim
@@ -2,9 +2,6 @@
" Setup: {{{1
function! tutor#SetupVim()
- if &columns < 90
- set columns=90
- endif
if !exists('g:did_load_ftplugin') || g:did_load_ftplugin != 1
filetype plugin on
endif
@@ -15,30 +12,17 @@ function! tutor#SetupVim()
endif
endfunction
-" Mappings: {{{1
-
-function! s:CheckMaps()
- nmap
+" Loads metadata file, if available
+function! tutor#LoadMetadata()
+ let b:tutor_metadata = json_decode(join(readfile(expand('%').'.json'), "\n"))
endfunction
-function! s:MapKeyWithRedirect(key, cmd)
- if maparg(a:key) !=# ''
- redir => l:keys
- silent call s:CheckMaps()
- redir END
- let l:key_list = split(l:keys, '\n')
-
- let l:raw_map = filter(copy(l:key_list), "v:val =~# '\\* ".a:key."'")
- if len(l:raw_map) == 0
- exe "nnoremap <buffer> <expr> ".a:key." ".a:cmd
- return
- endif
- let l:map_data = split(l:raw_map[0], '\s*')
+" Mappings: {{{1
- exe "nnoremap <buffer> <expr> ".l:map_data[0]." ".a:cmd
- else
- exe "nnoremap <buffer> <expr> ".a:key." ".a:cmd
- endif
+function! tutor#SetNormalMappings()
+ nnoremap <silent> <buffer> <CR> :call tutor#FollowLink(0)<cr>
+ nnoremap <silent> <buffer> <2-LeftMouse> :call tutor#MouseDoubleClick()<cr>
+ nnoremap <buffer> >> :call tutor#InjectCommand()<cr>
endfunction
function! tutor#MouseDoubleClick()
@@ -46,7 +30,7 @@ function! tutor#MouseDoubleClick()
normal! zo
else
if match(getline('.'), '^#\{1,} ') > -1
- normal! zc
+ silent normal! zc
else
call tutor#FollowLink(0)
endif
@@ -59,114 +43,6 @@ function! tutor#InjectCommand()
redraw | echohl WarningMsg | echon "tutor: ran" | echohl None | echon " " | echohl Statement | echon l:cmd
endfunction
-function! tutor#SetNormalMappings()
- call s:MapKeyWithRedirect('l', 'tutor#ForwardSkipConceal(v:count1)')
- call s:MapKeyWithRedirect('h', 'tutor#BackwardSkipConceal(v:count1)')
- call s:MapKeyWithRedirect('<right>', 'tutor#ForwardSkipConceal(v:count1)')
- call s:MapKeyWithRedirect('<left>', 'tutor#BackwardSkipConceal(v:count1)')
-
- nnoremap <silent> <buffer> <CR> :call tutor#FollowLink(0)<cr>
- nnoremap <silent> <buffer> <2-LeftMouse> :call tutor#MouseDoubleClick()<cr>
- nnoremap <buffer> >> :call tutor#InjectCommand()<cr>
-endfunction
-
-function! tutor#SetSampleTextMappings()
- noremap <silent> <buffer> A :if match(getline('.'), '^--->') > -1 \| call search('\s{\@=', 'Wc') \| startinsert \| else \| startinsert! \| endif<cr>
- noremap <silent> <buffer> $ :if match(getline('.'), '^--->') > -1 \| call search('.\s{\@=', 'Wc') \| else \| call search('$', 'Wc') \| endif<cr>
- onoremap <silent> <buffer> $ :if match(getline('.'), '^--->') > -1 \| call search('.\s{\@=', 'Wc') \| else \| call search('$', 'Wc') \| endif<cr>
- noremap <silent> <buffer> ^ :if match(getline('.'), '^--->') > -1 \| call search('\(--->\s\)\@<=.', 'bcW') \| else \| call search('^', 'bcW') \|endif<cr>
- onoremap <silent> <buffer> ^ :if match(getline('.'), '^--->') > -1 \| call search('\(--->\s\)\@<=.', 'bcW') \| else \| call search('^', 'bcW') \|endif<cr>
- nmap <silent> <buffer> 0 ^<esc>
- nmap <silent> <buffer> <Home> ^<esc>
- nmap <silent> <buffer> <End> $
- imap <silent> <buffer> <Home> <esc>^<esc>:startinsert<cr>
- imap <silent> <buffer> <End> <esc>$:startinsert<cr>
- noremap <silent> <buffer> I :exe "normal! 0" \| startinsert<cr>
-endfunction
-
-" Navigation: {{{1
-
-" taken from http://stackoverflow.com/a/24224578
-
-function! tutor#ForwardSkipConceal(count)
- let cnt=a:count
- let mvcnt=0
- let c=col('.')
- let l=line('.')
- let lc=col('$')
- let line=getline('.')
- while cnt
- if c>=lc
- let mvcnt+=cnt
- break
- endif
- if stridx(&concealcursor, 'n')==-1
- let isconcealed=0
- else
- let [isconcealed, cchar, group] = synconcealed(l, c)
- endif
- if isconcealed
- let cnt-=strchars(cchar)
- let oldc=c
- let c+=1
- while c < lc
- let [isconcealed2, cchar2, group2] = synconcealed(l, c)
- if !isconcealed2 || cchar2 != cchar
- break
- endif
- let c+= 1
- endwhile
- let mvcnt+=strchars(line[oldc-1:c-2])
- else
- let cnt-=1
- let mvcnt+=1
- let c+=len(matchstr(line[c-1:], '.'))
- endif
- endwhile
- return mvcnt.'l'
-endfunction
-
-function! tutor#BackwardSkipConceal(count)
- let cnt=a:count
- let mvcnt=0
- let c=col('.')
- let l=line('.')
- let lc=0
- let line=getline('.')
- while cnt
- if c<=1
- let mvcnt+=cnt
- break
- endif
- if stridx(&concealcursor, 'n')==-1 || c == 0
- let isconcealed=0
- else
- let [isconcealed, cchar, group]=synconcealed(l, c-1)
- endif
- if isconcealed
- let cnt-=strchars(cchar)
- let oldc=c
- let c-=1
- while c>1
- let [isconcealed2, cchar2, group2] = synconcealed(l, c-1)
- if !isconcealed2 || cchar2 != cchar
- break
- endif
- let c-=1
- endwhile
- let c = max([c, 1])
- let mvcnt+=strchars(line[c-1:oldc-2])
- else
- let cnt-=1
- let mvcnt+=1
- let c-=len(matchstr(line[:c-2], '.$'))
- endif
- endwhile
- return mvcnt.'h'
-endfunction
-
-" Hypertext: {{{1
-
function! tutor#FollowLink(force)
let l:stack_s = join(map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")'), '')
if l:stack_s =~# 'tutorLink'
@@ -201,50 +77,39 @@ function! tutor#TutorFolds()
endif
endfunction
-function! tutor#InfoText()
- let l:info_parts = []
- if exists('b:tutor_infofunc')
- call add(l:info_parts, eval(b:tutor_infofunc.'()'))
- endif
- return join(l:info_parts, " ")
-endfunction
+" Marks: {{{1
-" Marks {{{1
-function! tutor#PlaceXMarks()
- call cursor(1, 1)
- let b:tutor_sign_id = 1
- while search('^--->', 'W') > 0
- call tutor#CheckText(getline('.'))
- let b:tutor_sign_id+=1
- endwhile
- call cursor(1, 1)
+function! tutor#ApplyMarks()
+ hi! link tutorExpect Special
+ if exists('b:tutor_metadata') && has_key(b:tutor_metadata, 'expect')
+ let b:tutor_sign_id = 1
+ for expct in keys(b:tutor_metadata['expect'])
+ let lnum = eval(expct)
+ call matchaddpos('tutorExpect', [lnum])
+ call tutor#CheckLine(lnum)
+ endfor
+ endif
endfunction
-function! tutor#CheckText(text)
- if match(a:text, '{expect:ANYTHING}\s*$') == -1
- if match(getline('.'), '^--->\s*$') > -1
- exe "sign place ".b:tutor_sign_id." line=".line('.')." name=tutorbad buffer=".bufnr('%')
- else
- if match(getline('.'), '|expect:.\+|') == -1
- let l:cur_text = matchstr(a:text, '---> \zs.\{-}\ze {expect:')
- let l:expected_text = matchstr(a:text, '{expect:\zs.*\ze}\s*$')
- else
- let l:cur_text = matchstr(a:text, '---> \zs.\{-}\ze |expect:')
- let l:expected_text = matchstr(a:text, '|expect:\zs.*\ze|\s*$')
- endif
- if l:cur_text ==# l:expected_text
- exe "sign place ".b:tutor_sign_id." line=".line('.')." name=tutorok buffer=".bufnr('%')
- else
- exe "sign place ".b:tutor_sign_id." line=".line('.')." name=tutorbad buffer=".bufnr('%')
- endif
+function! tutor#ApplyMarksOnChanged()
+ if exists('b:tutor_metadata') && has_key(b:tutor_metadata, 'expect')
+ let lnum = line('.')
+ if index(keys(b:tutor_metadata['expect']), string(lnum)) > -1
+ call tutor#CheckLine(lnum)
endif
endif
endfunction
-function! tutor#OnTextChanged()
- let l:text = getline('.')
- if match(l:text, '^--->') > -1
- call tutor#CheckText(l:text)
+function! tutor#CheckLine(line)
+ if exists('b:tutor_metadata') && has_key(b:tutor_metadata, 'expect')
+ let bufn = bufnr('%')
+ let ctext = getline(a:line)
+ if b:tutor_metadata['expect'][string(a:line)] == -1 || ctext ==# b:tutor_metadata['expect'][string(a:line)]
+ exe "sign place ".b:tutor_sign_id." line=".a:line." name=tutorok buffer=".bufn
+ else
+ exe "sign place ".b:tutor_sign_id." line=".a:line." name=tutorbad buffer=".bufn
+ endif
+ let b:tutor_sign_id+=1
endif
endfunction
diff --git a/runtime/autoload/vimexpect.vim b/runtime/autoload/vimexpect.vim
index 16e7d30d6c..0ed888d2a4 100644
--- a/runtime/autoload/vimexpect.vim
+++ b/runtime/autoload/vimexpect.vim
@@ -140,7 +140,7 @@ endfunction
" Job handler that simply forwards lines to the parser.
-function! s:JobOutput(id, lines)
+function! s:JobOutput(_id, lines, _event) dict
call self._parser.feed(a:lines)
endfunction
diff --git a/runtime/autoload/xmlformat.vim b/runtime/autoload/xmlformat.vim
new file mode 100644
index 0000000000..f227b5ee25
--- /dev/null
+++ b/runtime/autoload/xmlformat.vim
@@ -0,0 +1,111 @@
+" Vim plugin for formatting XML
+" Last Change: Thu, 22 May 2018 21:26:55 +0100
+" Version: 0.1
+" Author: Christian Brabandt <cb@256bit.org>
+" Repository: https://github.com/chrisbra/vim-xml-ftplugin
+" License: VIM License
+" Documentation: see :h xmlformat.txt (TODO!)
+" ---------------------------------------------------------------------
+" Load Once: {{{1
+if exists("g:loaded_xmlformat") || &cp
+ finish
+endif
+let g:loaded_xmlformat = 1
+let s:keepcpo = &cpo
+set cpo&vim
+
+" Main function: Format the input {{{1
+func! xmlformat#Format()
+ " only allow reformatting through the gq command
+ " (e.g. Vim is in normal mode)
+ if mode() != 'n'
+ " do not fall back to internal formatting
+ return 0
+ endif
+ let sw = shiftwidth()
+ let prev = prevnonblank(v:lnum-1)
+ let s:indent = indent(prev)/sw
+ let result = []
+ let lastitem = prev ? getline(prev) : ''
+ let is_xml_decl = 0
+ " split on `<`, but don't split on very first opening <
+ for item in split(join(getline(v:lnum, (v:lnum + v:count - 1))), '.\@<=[>]\zs')
+ if s:EndTag(item)
+ let s:indent = s:DecreaseIndent()
+ call add(result, s:Indent(item))
+ elseif s:EmptyTag(lastitem)
+ call add(result, s:Indent(item))
+ elseif s:StartTag(lastitem) && s:IsTag(item)
+ let s:indent += 1
+ call add(result, s:Indent(item))
+ else
+ if !s:IsTag(item)
+ " Simply split on '<'
+ let t=split(item, '.<\@=\zs')
+ let s:indent+=1
+ call add(result, s:Indent(t[0]))
+ let s:indent = s:DecreaseIndent()
+ call add(result, s:Indent(t[1]))
+ else
+ call add(result, s:Indent(item))
+ endif
+ endif
+ let lastitem = item
+ endfor
+
+ if !empty(result)
+ exe v:lnum. ",". (v:lnum + v:count - 1). 'd'
+ call append(v:lnum - 1, result)
+ " Might need to remove the last line, if it became empty because of the
+ " append() call
+ let last = v:lnum + len(result)
+ if getline(last) is ''
+ exe last. 'd'
+ endif
+ endif
+
+ " do not run internal formatter!
+ return 0
+endfunc
+" Check if given tag is XML Declaration header {{{1
+func! s:IsXMLDecl(tag)
+ return a:tag =~? '^\s*<?xml\s\?\%(version="[^"]*"\)\?\s\?\%(encoding="[^"]*"\)\? ?>\s*$'
+endfunc
+" Return tag indented by current level {{{1
+func! s:Indent(item)
+ return repeat(' ', shiftwidth()*s:indent). s:Trim(a:item)
+endfu
+" Return item trimmed from leading whitespace {{{1
+func! s:Trim(item)
+ if exists('*trim')
+ return trim(a:item)
+ else
+ return matchstr(a:item, '\S\+.*')
+ endif
+endfunc
+" Check if tag is a new opening tag <tag> {{{1
+func! s:StartTag(tag)
+ return a:tag =~? '^\s*<[^/?]'
+endfunc
+" Remove one level of indentation {{{1
+func! s:DecreaseIndent()
+ return (s:indent > 0 ? s:indent - 1 : 0)
+endfunc
+" Check if tag is a closing tag </tag> {{{1
+func! s:EndTag(tag)
+ return a:tag =~? '^\s*</'
+endfunc
+" Check that the tag is actually a tag and not {{{1
+" something like "foobar</foobar>"
+func! s:IsTag(tag)
+ return s:Trim(a:tag)[0] == '<'
+endfunc
+" Check if tag is empty <tag/> {{{1
+func! s:EmptyTag(tag)
+ return a:tag =~ '/>\s*$'
+endfunc
+" Restoration And Modelines: {{{1
+let &cpo= s:keepcpo
+unlet s:keepcpo
+" Modeline {{{1
+" vim: fdm=marker fdl=0 ts=2 et sw=0 sts=-1
diff --git a/runtime/autoload/zip.vim b/runtime/autoload/zip.vim
index 687500ebe3..ea086e0882 100644
--- a/runtime/autoload/zip.vim
+++ b/runtime/autoload/zip.vim
@@ -1,7 +1,7 @@
" zip.vim: Handles browsing zipfiles
" AUTOLOAD PORTION
-" Date: Jul 02, 2013
-" Version: 27
+" Date: Sep 13, 2016
+" Version: 28
" Maintainer: Charles E Campbell <NdrOchip@ScampbellPfamily.AbizM-NOSPAM>
" License: Vim License (see vim's :help license)
" Copyright: Copyright (C) 2005-2013 Charles E. Campbell {{{1
@@ -20,10 +20,10 @@
if &cp || exists("g:loaded_zip")
finish
endif
-let g:loaded_zip= "v27"
+let g:loaded_zip= "v28"
if v:version < 702
echohl WarningMsg
- echo "***warning*** this version of zip needs vim 7.2"
+ echo "***warning*** this version of zip needs vim 7.2 or later"
echohl Normal
finish
endif
@@ -53,6 +53,9 @@ endif
if !exists("g:zip_unzipcmd")
let g:zip_unzipcmd= "unzip"
endif
+if !exists("g:zip_extractcmd")
+ let g:zip_extractcmd= g:zip_unzipcmd
+endif
" ----------------
" Functions: {{{1
@@ -62,14 +65,14 @@ endif
" zip#Browse: {{{2
fun! zip#Browse(zipfile)
" call Dfunc("zip#Browse(zipfile<".a:zipfile.">)")
- " sanity check: insure that the zipfile has "PK" as its first two letters
+ " sanity check: ensure that the zipfile has "PK" as its first two letters
" (zipped files have a leading PK as a "magic cookie")
if !filereadable(a:zipfile) || readfile(a:zipfile, "", 1)[0] !~ '^PK'
exe "noautocmd e ".fnameescape(a:zipfile)
" call Dret("zip#Browse : not a zipfile<".a:zipfile.">")
return
" else " Decho
-" call Decho("zip#Browse: a:zipfile<".a:zipfile."> passed PK test - its a zip file")
+" call Decho("zip#Browse: a:zipfile<".a:zipfile."> passed PK test - it's a zip file")
endif
let repkeep= &report
@@ -92,7 +95,7 @@ fun! zip#Browse(zipfile)
endif
if !filereadable(a:zipfile)
if a:zipfile !~# '^\a\+://'
- " if its an url, don't complain, let url-handlers such as vim do its thing
+ " if it's an url, don't complain, let url-handlers such as vim do its thing
redraw!
echohl Error | echo "***error*** (zip#Browse) File not readable<".a:zipfile.">" | echohl None
" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
@@ -136,8 +139,10 @@ fun! zip#Browse(zipfile)
return
endif
+ " Maps associated with zip plugin
setlocal noma nomod ro
- noremap <silent> <buffer> <cr> :call <SID>ZipBrowseSelect()<cr>
+ noremap <silent> <buffer> <cr> :call <SID>ZipBrowseSelect()<cr>
+ noremap <silent> <buffer> x :call zip#Extract()<cr>
let &report= repkeep
" call Dret("zip#Browse")
@@ -204,6 +209,15 @@ fun! zip#Read(fname,mode)
endif
" call Decho("zipfile<".zipfile.">")
" call Decho("fname <".fname.">")
+ " sanity check
+ if !executable(substitute(g:zip_unzipcmd,'\s\+.*$','',''))
+ redraw!
+ echohl Error | echo "***error*** (zip#Read) sorry, your system doesn't appear to have the ".g:zip_unzipcmd." program" | echohl None
+" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ let &report= repkeep
+" call Dret("zip#Write")
+ return
+ endif
" the following code does much the same thing as
" exe "keepj sil! r! ".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fnameescape(fname),1)
@@ -236,9 +250,9 @@ fun! zip#Write(fname)
set report=10
" sanity checks
- if !executable(g:zip_zipcmd)
+ if !executable(substitute(g:zip_zipcmd,'\s\+.*$','',''))
redraw!
- echohl Error | echo "***error*** (zip#Write) sorry, your system doesn't appear to have the zip pgm" | echohl None
+ echohl Error | echo "***error*** (zip#Write) sorry, your system doesn't appear to have the ".g:zip_zipcmd." program" | echohl None
" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
let &report= repkeep
" call Dret("zip#Write")
@@ -345,6 +359,48 @@ fun! zip#Write(fname)
endfun
" ---------------------------------------------------------------------
+" zip#Extract: extract a file from a zip archive {{{2
+fun! zip#Extract()
+" call Dfunc("zip#Extract()")
+
+ let repkeep= &report
+ set report=10
+ let fname= getline(".")
+" call Decho("fname<".fname.">")
+
+ " sanity check
+ if fname =~ '^"'
+ let &report= repkeep
+" call Dret("zip#Extract")
+ return
+ endif
+ if fname =~ '/$'
+ redraw!
+ echohl Error | echo "***error*** (zip#Extract) Please specify a file, not a directory" | echohl None
+ let &report= repkeep
+" call Dret("zip#Extract")
+ return
+ endif
+
+ " extract the file mentioned under the cursor
+" call Decho("system(".g:zip_extractcmd." ".shellescape(b:zipfile)." ".shellescape(shell).")")
+ call system(g:zip_extractcmd." ".shellescape(b:zipfile)." ".shellescape(shell))
+" call Decho("zipfile<".b:zipfile.">")
+ if v:shell_error != 0
+ echohl Error | echo "***error*** ".g:zip_extractcmd." ".b:zipfile." ".fname.": failed!" | echohl NONE
+ elseif !filereadable(fname)
+ echohl Error | echo "***error*** attempted to extract ".fname." but it doesn't appear to be present!"
+ else
+ echo "***note*** successfully extracted ".fname
+ endif
+
+ " restore option
+ let &report= repkeep
+
+" call Dret("zip#Extract")
+endfun
+
+" ---------------------------------------------------------------------
" s:Escape: {{{2
fun! s:Escape(fname,isfilt)
" call Dfunc("QuoteFileDir(fname<".a:fname."> isfilt=".a:isfilt.")")
diff --git a/runtime/bugreport.vim b/runtime/bugreport.vim
index f0c045e6c3..650e37940d 100644
--- a/runtime/bugreport.vim
+++ b/runtime/bugreport.vim
@@ -53,7 +53,6 @@
: scriptnames
:endif
:set all
-:set termcap
:if has("autocmd")
: au
:endif
diff --git a/runtime/colors/README.txt b/runtime/colors/README.txt
index 3b3445cbc9..4636979ef1 100644
--- a/runtime/colors/README.txt
+++ b/runtime/colors/README.txt
@@ -41,8 +41,24 @@ this autocmd might be useful:
autocmd SourcePre */colors/blue_sky.vim set background=dark
Replace "blue_sky" with the name of the colorscheme.
-In case you want to tweak a colorscheme after it was loaded, check out that
-ColorScheme autocmd event.
+In case you want to tweak a colorscheme after it was loaded, check out the
+ColorScheme autocommand event.
+
+To clean up just before loading another colorscheme, use the ColorSchemePre
+autocommand event. For example:
+ let g:term_ansi_colors = ...
+ augroup MyColorscheme
+ au!
+ au ColorSchemePre * unlet g:term_ansi_colors
+ au ColorSchemePre * au! MyColorscheme
+ augroup END
+
+To customize a colorscheme use another name, e.g. "~/.vim/colors/mine.vim",
+and use `:runtime` to load the original colorscheme:
+ " load the "evening" colorscheme
+ runtime colors/evening.vim
+ " change the color of statements
+ hi Statement ctermfg=Blue guifg=Blue
To see which highlight group is used where, find the help for
"highlight-groups" and "group-name".
@@ -57,6 +73,7 @@ Search for "highlight_init".
If you think you have a color scheme that is good enough to be used by others,
please check the following items:
+- Source the $VIMRUNTIME/tools/check_colors.vim script to check for common mistakes.
- Does it work in a color terminal as well as in the GUI?
- Is "g:colors_name" set to a meaningful value? In case of doubt you can do
it this way:
diff --git a/runtime/colors/evening.vim b/runtime/colors/evening.vim
index 5dae08280e..5257307593 100644
--- a/runtime/colors/evening.vim
+++ b/runtime/colors/evening.vim
@@ -1,6 +1,6 @@
" Vim color file
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2006 Apr 14
+" Last Change: 2016 Oct 10
" This color scheme uses a dark grey background.
@@ -45,8 +45,8 @@ hi CursorColumn term=reverse ctermbg=Black guibg=grey40
hi CursorLine term=underline cterm=underline guibg=grey40
" Groups for syntax highlighting
-hi Constant term=underline ctermfg=Magenta guifg=#ffa0a0 guibg=grey5
-hi Special term=bold ctermfg=LightRed guifg=Orange guibg=grey5
+hi Constant term=underline ctermfg=Magenta guifg=#ffa0a0
+hi Special term=bold ctermfg=LightRed guifg=Orange
if &t_Co > 8
hi Statement term=bold cterm=bold ctermfg=Yellow guifg=#ffff60 gui=bold
endif
diff --git a/runtime/colors/koehler.vim b/runtime/colors/koehler.vim
index a36f9f6972..250472a162 100644
--- a/runtime/colors/koehler.vim
+++ b/runtime/colors/koehler.vim
@@ -2,7 +2,7 @@
" vim: tw=0 ts=4 sw=4
" Vim color file
" Maintainer: Ron Aaron <ron@ronware.org>
-" Last Change: 2013 May 23
+" Last Change: 2016 Sep 04
hi clear
set background=dark
@@ -45,6 +45,7 @@ hi TabLineFill term=bold,reverse cterm=bold ctermfg=lightblue ctermbg=white g
hi TabLineSel term=reverse ctermfg=white ctermbg=lightblue guifg=white guibg=blue
hi Underlined term=underline cterm=bold,underline ctermfg=lightblue guifg=lightblue gui=bold,underline
hi Ignore ctermfg=black ctermbg=black guifg=black guibg=black
+hi EndOfBuffer term=bold cterm=bold ctermfg=darkred guifg=#cc0000 gui=bold
hi link IncSearch Visual
hi link String Constant
hi link Character Constant
diff --git a/runtime/compiler/bdf.vim b/runtime/compiler/bdf.vim
index ca33776988..b062e847aa 100644
--- a/runtime/compiler/bdf.vim
+++ b/runtime/compiler/bdf.vim
@@ -1,7 +1,7 @@
" Vim compiler file
-" Compiler: BDF to PCF Conversion
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Compiler: BDF to PCF Conversion
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("current_compiler")
finish
diff --git a/runtime/compiler/cargo.vim b/runtime/compiler/cargo.vim
new file mode 100644
index 0000000000..bd48666bc9
--- /dev/null
+++ b/runtime/compiler/cargo.vim
@@ -0,0 +1,35 @@
+" Vim compiler file
+" Compiler: Cargo Compiler
+" Maintainer: Damien Radtke <damienradtke@gmail.com>
+" Latest Revision: 2014 Sep 24
+" For bugs, patches and license go to https://github.com/rust-lang/rust.vim
+
+if exists('current_compiler')
+ finish
+endif
+runtime compiler/rustc.vim
+let current_compiler = "cargo"
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+if exists(':CompilerSet') != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+if exists('g:cargo_makeprg_params')
+ execute 'CompilerSet makeprg=cargo\ '.escape(g:cargo_makeprg_params, ' \|"').'\ $*'
+else
+ CompilerSet makeprg=cargo\ $*
+endif
+
+" Ignore general cargo progress messages
+CompilerSet errorformat+=
+ \%-G%\\s%#Downloading%.%#,
+ \%-G%\\s%#Compiling%.%#,
+ \%-G%\\s%#Finished%.%#,
+ \%-G%\\s%#error:\ Could\ not\ compile\ %.%#,
+ \%-G%\\s%#To\ learn\ more\\,%.%#
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/compiler/context.vim b/runtime/compiler/context.vim
new file mode 100644
index 0000000000..cb78c96df0
--- /dev/null
+++ b/runtime/compiler/context.vim
@@ -0,0 +1,54 @@
+" Vim compiler file
+" Compiler: ConTeXt typesetting engine
+" Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+" Last Change: 2016 Oct 21
+
+if exists("current_compiler")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+" If makefile exists and we are not asked to ignore it, we use standard make
+" (do not redefine makeprg)
+if get(b:, 'context_ignore_makefile', get(g:, 'context_ignore_makefile', 0)) ||
+ \ (!filereadable('Makefile') && !filereadable('makefile'))
+ let current_compiler = 'context'
+ " The following assumes that the current working directory is set to the
+ " directory of the file to be typeset
+ let &l:makeprg = get(b:, 'context_mtxrun', get(g:, 'context_mtxrun', 'mtxrun'))
+ \ . ' --script context --autogenerate --nonstopmode --synctex='
+ \ . (get(b:, 'context_synctex', get(g:, 'context_synctex', 0)) ? '1' : '0')
+ \ . ' ' . get(b:, 'context_extra_options', get(g:, 'context_extra_options', ''))
+ \ . ' ' . shellescape(expand('%:p:t'))
+else
+ let current_compiler = 'make'
+endif
+
+let b:context_errorformat = ''
+ \ . '%-Popen source%.%#> %f,'
+ \ . '%-Qclose source%.%#> %f,'
+ \ . "%-Popen source%.%#name '%f',"
+ \ . "%-Qclose source%.%#name '%f',"
+ \ . '%Etex %trror%.%#mp error on line %l in file %f:%.%#,'
+ \ . 'tex %trror%.%#error on line %l in file %f: %m,'
+ \ . '%Elua %trror%.%#error on line %l in file %f:,'
+ \ . '%+Emetapost %#> error: %#,'
+ \ . '! error: %#%m,'
+ \ . '%-C %#,'
+ \ . '%C! %m,'
+ \ . '%Z[ctxlua]%m,'
+ \ . '%+C<*> %.%#,'
+ \ . '%-C%.%#,'
+ \ . '%Z...%m,'
+ \ . '%-Zno-error,'
+ \ . '%-G%.%#' " Skip remaining lines
+
+execute 'CompilerSet errorformat=' . escape(b:context_errorformat, ' ')
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/compiler/csslint.vim b/runtime/compiler/csslint.vim
new file mode 100644
index 0000000000..14c4289a24
--- /dev/null
+++ b/runtime/compiler/csslint.vim
@@ -0,0 +1,16 @@
+" Vim compiler file
+" Compiler: csslint for CSS
+" Maintainer: Daniel Moch <daniel@danielmoch.com>
+" Last Change: 2016 May 21
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "csslint"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet makeprg=csslint\ --format=compact
+CompilerSet errorformat=%-G,%-G%f:\ lint\ free!,%f:\ line\ %l\\,\ col\ %c\\,\ %trror\ -\ %m,%f:\ line\ %l\\,\ col\ %c\\,\ %tarning\ -\ %m,%f:\ line\ %l\\,\ col\ %c\\,\ %m
diff --git a/runtime/compiler/cucumber.vim b/runtime/compiler/cucumber.vim
index c020be6e3b..17ce3627c1 100644
--- a/runtime/compiler/cucumber.vim
+++ b/runtime/compiler/cucumber.vim
@@ -1,7 +1,7 @@
" Vim compiler file
" Compiler: Cucumber
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
-" Last Change: 2010 Aug 09
+" Last Change: 2016 Aug 29
if exists("current_compiler")
finish
@@ -19,7 +19,7 @@ CompilerSet makeprg=cucumber
CompilerSet errorformat=
\%W%m\ (Cucumber::Undefined),
- \%E%m\ (%.%#),
+ \%E%m\ (%\\S%#),
\%Z%f:%l,
\%Z%f:%l:%.%#
diff --git a/runtime/compiler/gcc.vim b/runtime/compiler/gcc.vim
index aee31d92c2..1af568de57 100644
--- a/runtime/compiler/gcc.vim
+++ b/runtime/compiler/gcc.vim
@@ -1,7 +1,8 @@
" Vim compiler file
-" Compiler: GNU C Compiler
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2010-10-14
+" Compiler: GNU C Compiler
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2010-10-14
+" added line suggested by Anton Lindqvist 2016 Mar 31
if exists("current_compiler")
finish
@@ -24,6 +25,7 @@ CompilerSet errorformat=
\%f:%l:\ %trror:\ %m,
\%f:%l:\ %tarning:\ %m,
\%f:%l:\ %m,
+ \%f:\\(%*[^\\)]\\):\ %m,
\\"%f\"\\,\ line\ %l%*\\D%c%*[^\ ]\ %m,
\%D%*\\a[%*\\d]:\ Entering\ directory\ [`']%f',
\%X%*\\a[%*\\d]:\ Leaving\ directory\ [`']%f',
diff --git a/runtime/compiler/ghc.vim b/runtime/compiler/ghc.vim
new file mode 100644
index 0000000000..c98ae302a8
--- /dev/null
+++ b/runtime/compiler/ghc.vim
@@ -0,0 +1,26 @@
+" Vim compiler file
+" Compiler: GHC Haskell Compiler
+" Maintainer: Daniel Campoverde <alx@sillybytes.net>
+" Latest Revision: 2016-11-29
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "ghc"
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet errorformat=
+ \%-G%.%#:\ build,
+ \%-G%.%#preprocessing\ library\ %.%#,
+ \%-G[%.%#]%.%#,
+ \%E%f:%l:%c:\ %m,
+ \%-G--%.%#
+
+if exists('g:compiler_ghc_ignore_unmatched_lines')
+ CompilerSet errorformat+=%-G%.%#
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/haml.vim b/runtime/compiler/haml.vim
index b06a672df7..9464c3dc85 100644
--- a/runtime/compiler/haml.vim
+++ b/runtime/compiler/haml.vim
@@ -1,7 +1,7 @@
" Vim compiler file
" Compiler: Haml
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
-" Last Change: 2013 May 30
+" Last Change: 2016 Aug 29
if exists("current_compiler")
finish
@@ -15,7 +15,7 @@ endif
let s:cpo_save = &cpo
set cpo-=C
-CompilerSet makeprg=haml\ -c
+CompilerSet makeprg=haml
CompilerSet errorformat=
\Haml\ %trror\ on\ line\ %l:\ %m,
diff --git a/runtime/compiler/pylint.vim b/runtime/compiler/pylint.vim
new file mode 100644
index 0000000000..93079ce61d
--- /dev/null
+++ b/runtime/compiler/pylint.vim
@@ -0,0 +1,16 @@
+" Vim compiler file
+" Compiler: Pylint for Python
+" Maintainer: Daniel Moch <daniel@danielmoch.com>
+" Last Change: 2016 May 20
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "pylint"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet makeprg=pylint\ --output-format=text\ --msg-template=\"{path}:{line}:{column}:{C}:\ [{symbol}]\ {msg}\"\ --reports=no
+CompilerSet errorformat=%A%f:%l:%c:%t:\ %m,%A%f:%l:\ %m,%A%f:(%l):\ %m,%-Z%p^%.%#,%-G%.%#
diff --git a/runtime/compiler/rake.vim b/runtime/compiler/rake.vim
index 3bd9da0daf..8490f2a9e9 100644
--- a/runtime/compiler/rake.vim
+++ b/runtime/compiler/rake.vim
@@ -27,7 +27,11 @@ CompilerSet errorformat=
\%\\s%#[%f:%l:\ %#%m,
\%\\s%#%f:%l:\ %#%m,
\%\\s%#%f:%l:,
- \%m\ [%f:%l]:
+ \%m\ [%f:%l]:,
+ \%+Erake\ aborted!,
+ \%+EDon't\ know\ how\ to\ build\ task\ %.%#,
+ \%+Einvalid\ option:%.%#,
+ \%+Irake\ %\\S%\\+%\\s%\\+#\ %.%#
let &cpo = s:cpo_save
unlet s:cpo_save
diff --git a/runtime/compiler/rspec.vim b/runtime/compiler/rspec.vim
index 7c340bab15..c77bd70da7 100644
--- a/runtime/compiler/rspec.vim
+++ b/runtime/compiler/rspec.vim
@@ -22,9 +22,10 @@ CompilerSet errorformat=
\%f:%l:\ %tarning:\ %m,
\%E%.%#:in\ `load':\ %f:%l:%m,
\%E%f:%l:in\ `%*[^']':\ %m,
- \%-Z\ \ \ \ \ \#\ %f:%l:%.%#,
+ \%-Z\ \ \ \ \ %\\+\#\ %f:%l:%.%#,
\%E\ \ %\\d%\\+)%.%#,
\%C\ \ \ \ \ %m,
+ \%C%\\s%#,
\%-G%.%#
let &cpo = s:cpo_save
diff --git a/runtime/compiler/rst.vim b/runtime/compiler/rst.vim
index 15d2d79f64..392bea6ae0 100644
--- a/runtime/compiler/rst.vim
+++ b/runtime/compiler/rst.vim
@@ -1,7 +1,8 @@
" Vim compiler file
-" Compiler: reStructuredText Documentation Format
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Compiler: sphinx >= 1.0.8, http://www.sphinx-doc.org
+" Description: reStructuredText Documentation Format
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2017-03-31
if exists("current_compiler")
finish
@@ -11,12 +12,18 @@ let current_compiler = "rst"
let s:cpo_save = &cpo
set cpo&vim
-setlocal errorformat=
- \%f:%l:\ (%tEBUG/0)\ %m,
- \%f:%l:\ (%tNFO/1)\ %m,
- \%f:%l:\ (%tARNING/2)\ %m,
- \%f:%l:\ (%tRROR/3)\ %m,
- \%f:%l:\ (%tEVERE/3)\ %m,
+if exists(":CompilerSet") != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet errorformat=
+ \%f\\:%l:\ %tEBUG:\ %m,
+ \%f\\:%l:\ %tNFO:\ %m,
+ \%f\\:%l:\ %tARNING:\ %m,
+ \%f\\:%l:\ %tRROR:\ %m,
+ \%f\\:%l:\ %tEVERE:\ %m,
+ \%f\\:%s:\ %tARNING:\ %m,
+ \%f\\:%s:\ %tRROR:\ %m,
\%D%*\\a[%*\\d]:\ Entering\ directory\ `%f',
\%X%*\\a[%*\\d]:\ Leaving\ directory\ `%f',
\%DMaking\ %*\\a\ in\ %f
diff --git a/runtime/compiler/rubyunit.vim b/runtime/compiler/rubyunit.vim
index 93a0c8e653..ed0639b581 100644
--- a/runtime/compiler/rubyunit.vim
+++ b/runtime/compiler/rubyunit.vim
@@ -17,6 +17,8 @@ let s:cpo_save = &cpo
set cpo-=C
CompilerSet makeprg=testrb
+" CompilerSet makeprg=ruby\ -Itest
+" CompilerSet makeprg=m
CompilerSet errorformat=\%W\ %\\+%\\d%\\+)\ Failure:,
\%C%m\ [%f:%l]:,
diff --git a/runtime/compiler/rustc.vim b/runtime/compiler/rustc.vim
new file mode 100644
index 0000000000..c27bdc9c0c
--- /dev/null
+++ b/runtime/compiler/rustc.vim
@@ -0,0 +1,46 @@
+" Vim compiler file
+" Compiler: Rust Compiler
+" Maintainer: Chris Morgan <me@chrismorgan.info>
+" Latest Revision: 2013 Jul 12
+" For bugs, patches and license go to https://github.com/rust-lang/rust.vim
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "rustc"
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+if exists(":CompilerSet") != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+if exists("g:rustc_makeprg_no_percent") && g:rustc_makeprg_no_percent != 0
+ CompilerSet makeprg=rustc
+else
+ CompilerSet makeprg=rustc\ \%
+endif
+
+" Old errorformat (before nightly 2016/08/10)
+CompilerSet errorformat=
+ \%f:%l:%c:\ %t%*[^:]:\ %m,
+ \%f:%l:%c:\ %*\\d:%*\\d\ %t%*[^:]:\ %m,
+ \%-G%f:%l\ %s,
+ \%-G%*[\ ]^,
+ \%-G%*[\ ]^%*[~],
+ \%-G%*[\ ]...
+
+" New errorformat (after nightly 2016/08/10)
+CompilerSet errorformat+=
+ \%-G,
+ \%-Gerror:\ aborting\ %.%#,
+ \%-Gerror:\ Could\ not\ compile\ %.%#,
+ \%Eerror:\ %m,
+ \%Eerror[E%n]:\ %m,
+ \%Wwarning:\ %m,
+ \%Inote:\ %m,
+ \%C\ %#-->\ %f:%l:%c
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/sass.vim b/runtime/compiler/sass.vim
index 376a52b303..9c540ac443 100644
--- a/runtime/compiler/sass.vim
+++ b/runtime/compiler/sass.vim
@@ -1,7 +1,7 @@
" Vim compiler file
" Compiler: Sass
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
-" Last Change: 2013 May 30
+" Last Change: 2016 Aug 29
if exists("current_compiler")
finish
@@ -15,7 +15,7 @@ endif
let s:cpo_save = &cpo
set cpo-=C
-CompilerSet makeprg=sass\ -c
+CompilerSet makeprg=sass
CompilerSet errorformat=
\%f:%l:%m\ (Sass::Syntax%trror),
diff --git a/runtime/compiler/stack.vim b/runtime/compiler/stack.vim
new file mode 100644
index 0000000000..4236b4c8b3
--- /dev/null
+++ b/runtime/compiler/stack.vim
@@ -0,0 +1,37 @@
+" Vim compiler file
+" Compiler: Haskell Stack
+" Maintainer: Daniel Campoverde <alx@sillybytes.net>
+" Latest Revision: 2018-08-27
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "stack"
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+
+CompilerSet errorformat=
+ \%-G%.%#:\ build\ %.%#,
+ \%-G%.%#:\ configure\ %.%#,
+ \%-G[%.%#]%.%#,
+ \%-G%.%#preprocessing\ %.%#,
+ \%-G%.%#configuring\ %.%#,
+ \%-G%.%#building\ %.%#,
+ \%-G%.%#linking\ %.%#,
+ \%-G%.%#installing\ %.%#,
+ \%-G%.%#registering\ %.%#,
+ \%-G%.%#:\ copy/register%.%#,
+ \%-G%.%#process\ exited\ %.%#,
+ \%-G%.%#--builddir=%.%#,
+ \%-G--%.%#,
+ \%-G%.%#\|%.%#,
+ \%E%f:%l:%c:\ error:,%+Z\ \ \ \ %m,
+ \%E%f:%l:%c:\ error:\ %m,%-Z,
+ \%W%f:%l:%c:\ warning:,%+Z\ \ \ \ %m,
+ \%W%f:%l:%c:\ warning:\ %m,%-Z,
+
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/tidy.vim b/runtime/compiler/tidy.vim
index 56baee2224..75be8b83d9 100644
--- a/runtime/compiler/tidy.vim
+++ b/runtime/compiler/tidy.vim
@@ -1,7 +1,7 @@
" Vim compiler file
" Compiler: HTML Tidy
" Maintainer: Doug Kearns <dougkearns@gmail.com>
-" Last Change: 2013 Jul 7
+" Last Change: 2016 Apr 21
if exists("current_compiler")
finish
@@ -12,8 +12,8 @@ if exists(":CompilerSet") != 2 " older Vim always used :setlocal
command -nargs=* CompilerSet setlocal <args>
endif
-CompilerSet makeprg=tidy\ -quiet\ -errors\ --gnu-emacs\ yes\ %
+CompilerSet makeprg=tidy\ -quiet\ -errors\ --gnu-emacs\ yes\ %:S
-" sample warning: foo.html:8:1: Warning: inserting missing 'foobar' element
-" sample error: foo.html:9:2: Error: <foobar> is not recognized!
-CompilerSet errorformat=%f:%l:%c:\ Error:%m,%f:%l:%c:\ Warning:%m,%-G%.%#
+" foo.html:8:1: Warning: inserting missing 'foobar' element
+" foo.html:9:2: Error: <foobar> is not recognized!
+CompilerSet errorformat=%f:%l:%c:\ %trror:%m,%f:%l:%c:\ %tarning:%m,%-G%.%#
diff --git a/runtime/doc/Makefile b/runtime/doc/Makefile
index 3d10d0ea98..18d32c0820 100644
--- a/runtime/doc/Makefile
+++ b/runtime/doc/Makefile
@@ -13,7 +13,7 @@ HTMLS = $(DOCS:.txt=.html)
.SUFFIXES: .c .o .txt .html
# Awk version of .txt to .html conversion.
-html: noerrors $(HTMLS)
+html: noerrors vimindex.html $(HTMLS)
@if test -f errors.log; then cat errors.log; fi
noerrors:
@@ -36,5 +36,5 @@ tags.ref tags.html: tags
$(AWK) -f maketags.awk tags >tags.html
clean:
- -rm -f *.html tags.ref $(HTMLS) errors.log
+ -rm -f *.html tags.ref $(HTMLS) errors.log tags
diff --git a/runtime/doc/api.txt b/runtime/doc/api.txt
index bdeca367b1..2520a15890 100644
--- a/runtime/doc/api.txt
+++ b/runtime/doc/api.txt
@@ -1,65 +1,194 @@
-*api.txt* {Nvim}
+*api.txt* Nvim
NVIM REFERENCE MANUAL by Thiago de Arruda
-C API for Nvim *API* *api*
+Nvim API *API* *api*
-1. Introduction |api-intro|
-2. API Types |api-types|
-3. API metadata |api-metadata|
-4. Buffer highlighting |api-highlights|
+Nvim exposes a powerful API that can be used by plugins and external processes
+via |RPC|, |Lua| and VimL (|eval-api|).
+
+Applications can also embed libnvim to work with the C API directly.
+
+ Type |gO| to see the table of contents.
==============================================================================
-1. Introduction *api-intro*
+API Types *api-types*
+
+The Nvim C API defines custom types for all function parameters. Some are just
+typedefs around C99 standard types, others are Nvim-defined data structures.
+
+ Boolean -> bool
+ Integer (signed 64-bit integer) -> int64_t
+ Float (IEEE 754 double precision) -> double
+ String -> {char* data, size_t size} struct
+ Array
+ Dictionary
+ Object
+
+The following handle types are defined as integer typedefs, but are
+discriminated as separate types in an Object:
-Nvim exposes a public API for external code to interact with the Nvim core. In
-the present version of Nvim the API is primarily used by external processes to
-interact with Nvim using the msgpack-rpc protocol, see |msgpack-rpc|. The API
-will also be used from vimscript to access new Nvim core features, but this is
-not implemented yet. Later on, Nvim might be embeddable in C applications as
-libnvim, and the application will then control the embedded instance by
-calling the C API directly.
+ Buffer -> enum value kObjectTypeBuffer
+ Window -> enum value kObjectTypeWindow
+ Tabpage -> enum value kObjectTypeTabpage
==============================================================================
-2. API Types *api-types*
+API metadata *api-metadata*
-Nvim's C API uses custom types for all functions. Some are just typedefs
-around C99 standard types, and some are Nvim-defined data structures.
+Nvim exposes API metadata as a Dictionary. Some items are described below:
-Boolean -> bool
-Integer (signed 64-bit integer) -> int64_t
-Float (IEEE 754 double precision) -> double
-String -> {char* data, size_t size} struct
+version Nvim version, API level/compatibility
+version.api_level Current API level
+version.api_compatible API is backwards-compatible with this level
+version.api_prerelease Declares the current API level as unstable >
+ (version.api_prerelease && fn.since == version.api_level)
+functions API function signatures
+ui_events UI event signatures |ui|
+ui_options Supported |ui-options|
+{fn}.since API level where function {fn} was introduced
+{fn}.deprecated_since API level where function {fn} was deprecated
+types Custom handle types defined by Nvim
+error_types Possible error types returned by API functions
-Additionally, the following data structures are defined:
+External programs ("clients") can use the metadata to discover the |rpc-api|.
-Array
-Dictionary
-Object
+==============================================================================
+API contract *api-contract*
-The following handle types are defined as integer typedefs, but are
-discriminated as separate types in an Object:
+The Nvim API is composed of functions and events.
+
+- Clients call functions like those described at |api-global|.
+- Clients can subscribe to |ui-events|, |api-buffer-updates|, etc.
+- API function names are prefixed with "nvim_".
+- API event names are prefixed with "nvim_" and suffixed with "_event".
+
+As Nvim evolves the API may change in compliance with this CONTRACT:
-Buffer -> enum value kObjectTypeBuffer
-Window -> enum value kObjectTypeWindow
-Tabpage -> enum value kObjectTypeTabpage
+- New functions and events may be added.
+ - Any such extensions are OPTIONAL: old clients may ignore them.
+- Function signatures will NOT CHANGE (after release).
+ - Functions introduced in the development (unreleased) version MAY CHANGE.
+ (Clients can dynamically check `api_prerelease`, etc. |api-metadata|)
+- Event parameters will not be removed or reordered (after release).
+- Events may be EXTENDED: new parameters may be added.
+- New items may be ADDED to map/list parameters/results of functions and
+ events.
+ - Any such new items are OPTIONAL: old clients may ignore them.
+ - Existing items will not be removed (after release).
+- Deprecated functions will not be removed until Nvim version 2.0
==============================================================================
-3. API metadata *api-metadata*
+Global events *api-global-events*
-Nvim exposes metadata about the API as a Dictionary with the following keys:
+When a client invokes an API request as an async notification, it is not
+possible for Nvim to send an error response. Instead, in case of error, the
+following notification will be sent to the client:
-functions calling signature of the API functions
-types The custom handle types defined by Nvim
-error_types The possible kinds of errors an API function can exit with.
+ *nvim_error_event*
+nvim_error_event[{type}, {message}]
-This metadata is mostly useful for external programs accessing the API via
-RPC, see |rpc-api|.
+{type} is a numeric id as defined by `api_info().error_types`, and {message} is
+a string with the error message.
==============================================================================
-4. Buffer highlighting *api-highlights*
+Buffer update events *api-buffer-updates*
+
+API clients can "attach" to Nvim buffers to subscribe to buffer update events.
+This is similar to |TextChanged| but more powerful and granular.
+
+Call |nvim_buf_attach()| to receive these events on the channel:
+
+ *nvim_buf_lines_event*
+nvim_buf_lines_event[{buf}, {changedtick}, {firstline}, {lastline}, {linedata}, {more}]
+
+ When the buffer text between {firstline} and {lastline} (end-exclusive,
+ zero-indexed) were changed to the new text in the {linedata} list. The
+ granularity is a line, i.e. if a single character is changed in the editor,
+ the entire line is sent.
+
+ When {changedtick} is |v:null| this means the screen lines (display) changed
+ but not the buffer contents. {linedata} contains the changed screen lines.
+ This happens when 'inccommand' shows a buffer preview.
+
+ Properties:~
+ {buf} API buffer handle (buffer number)
+
+ {changedtick} value of |b:changedtick| for the buffer. If you send an API
+ command back to nvim you can check the value of |b:changedtick| as part of
+ your request to ensure that no other changes have been made.
+
+ {firstline} integer line number of the first line that was replaced.
+ Zero-indexed: if line 1 was replaced then {firstline} will be 0, not 1.
+ {firstline} is always less than or equal to the number of lines that were
+ in the buffer before the lines were replaced.
+
+ {lastline} integer line number of the first line that was not replaced
+ (i.e. the range {firstline}, {lastline} is end-exclusive).
+ Zero-indexed: if line numbers 2 to 5 were replaced, this will be 5 instead
+ of 6. {lastline} is always be less than or equal to the number of lines
+ that were in the buffer before the lines were replaced. {lastline} will be
+ -1 if the event is part of the initial update after attaching.
+
+ {linedata} list of strings containing the contents of the new buffer
+ lines. Newline characters are omitted; empty lines are sent as empty
+ strings.
+
+ {more} boolean, true for a "multipart" change notification: the current
+ change was chunked into multiple |nvim_buf_lines_event| notifications
+ (e.g. because it was too big).
+
+nvim_buf_changedtick_event[{buf}, {changedtick}] *nvim_buf_changedtick_event*
+
+ When |b:changedtick| was incremented but no text was changed. Relevant for
+ undo/redo.
+
+ Properties:~
+ {buf} API buffer handle (buffer number)
+ {changedtick} new value of |b:changedtick| for the buffer
+
+nvim_buf_detach_event[{buf}] *nvim_buf_detach_event*
+
+ When buffer is detached (i.e. updates are disabled). Triggered explicitly by
+ |nvim_buf_detach()| or implicitly in these cases:
+ - Buffer was |abandon|ed and 'hidden' is not set.
+ - Buffer was reloaded, e.g. with |:edit| or an external change triggered
+ |:checktime| or 'autoread'.
+ - Generally: whenever the buffer contents are unloaded from memory.
+
+ Properties:~
+ {buf} API buffer handle (buffer number)
+
+
+EXAMPLE ~
+
+Calling |nvim_buf_attach()| with send_buffer=true on an empty buffer, emits: >
+ nvim_buf_lines_event[{buf}, {changedtick}, 0, 0, [""], v:false]
+
+User adds two lines to the buffer, emits: >
+ nvim_buf_lines_event[{buf}, {changedtick}, 0, 0, ["line1", "line2"], v:false]
+
+User moves to a line containing the text "Hello world" and inserts "!", emits: >
+ nvim_buf_lines_event[{buf}, {changedtick}, {linenr}, {linenr} + 1,
+ ["Hello world!"], v:false]
+
+User moves to line 3 and deletes 20 lines using "20dd", emits: >
+ nvim_buf_lines_event[{buf}, {changedtick}, 2, 22, [], v:false]
+
+User selects lines 3-5 using |linewise-visual| mode and then types "p" to
+paste a block of 6 lines, emits: >
+ nvim_buf_lines_event[{buf}, {changedtick}, 2, 5,
+ ['pasted line 1', 'pasted line 2', 'pasted line 3', 'pasted line 4',
+ 'pasted line 5', 'pasted line 6'],
+ v:false
+ ]
+
+User reloads the buffer with ":edit", emits: >
+ nvim_buf_detach_event[{buf}]
+
+==============================================================================
+Buffer highlighting *api-highlights*
Nvim allows plugins to add position-based highlights to buffers. This is
similar to |matchaddpos()| but with some key differences. The added highlights
@@ -73,12 +202,11 @@ Another use case are plugins that show output in an append-only buffer, and
want to add highlights to the outputs. Highlight data cannot be preserved
on writing and loading a buffer to file, nor in undo/redo cycles.
-Highlights are registered using the |buffer_add_highlight| function, see the
-generated API documentation for details. If an external highlighter plugin is
-adding a large number of highlights in a batch, performance can be improved by
-calling |buffer_add_highlight| as an asynchronous notification, after first
-(synchronously) reqesting a source id. Here is an example using wrapper
-functions in the python client:
+Highlights are registered using the |nvim_buf_add_highlight()| function. If an
+external highlighter plugin wants to add many highlights in a batch,
+performance can be improved by calling |nvim_buf_add_highlight()| as an
+asynchronous notification, after first (synchronously) reqesting a source id.
+Example using the Nvim python-client:
>
src = vim.new_highlight_source()
@@ -91,10 +219,1232 @@ functions in the python client:
buf.clear_highlight(src)
<
If the highlights don't need to be deleted or updated, just pass -1 as
-src_id (this is the default in python). |buffer_clear_highlight| can be used
-to clear highligts from a specific source, in a specific line range or the
-entire buffer by passing in the line range 0, -1 (the later is the default
-in python as used above).
+src_id (this is the default in python). Use |nvim_buf_clear_namespace()| to
+clear highlights from a specific source, in a specific line range or the
+entire buffer by passing in the line range 0, -1 (the latter is the default in
+python as used above).
+
+An example of calling the api from vimscript: >
+ call nvim_buf_set_lines(0, 0, 0, v:true, ["test text"])
+ let src = nvim_buf_add_highlight(0, 0, "String", 1, 0, 4)
+ call nvim_buf_add_highlight(0, src, "Identifier", 0, 5, -1)
+
+ " later
+ call nvim_buf_clear_namespace(0, src, 0, -1)
+>
==============================================================================
- vim:tw=78:ts=8:noet:ft=help:norl:
+Global Functions *api-global*
+
+nvim_command({command}) *nvim_command()*
+ Executes an ex-command.
+
+ On execution error: fails with VimL error, does not update
+ v:errmsg.
+
+ Parameters: ~
+ {command} Ex-command string
+
+nvim_get_hl_by_name({name}, {rgb}) *nvim_get_hl_by_name()*
+ Gets a highlight definition by name.
+
+ Parameters: ~
+ {name} Highlight group name
+ {rgb} Export RGB colors
+
+ Return: ~
+ Highlight definition map
+
+nvim_get_hl_by_id({hl_id}, {rgb}) *nvim_get_hl_by_id()*
+ Gets a highlight definition by id. |hlID()|
+
+ Parameters: ~
+ {hl_id} Highlight id as returned by |hlID()|
+ {rgb} Export RGB colors
+
+ Return: ~
+ Highlight definition map
+
+nvim_feedkeys({keys}, {mode}, {escape_csi}) *nvim_feedkeys()*
+ Sends input-keys to Nvim, subject to various quirks controlled
+ by `mode` flags. This is a blocking call, unlike
+ |nvim_input()|.
+
+ On execution error: does not fail, but updates v:errmsg.
+
+ Parameters: ~
+ {keys} to be typed
+ {mode} behavior flags, see |feedkeys()|
+ {escape_csi} If true, escape K_SPECIAL/CSI bytes in
+ `keys`
+
+nvim_input({keys}) *nvim_input()*
+ Queues raw user-input. Unlike |nvim_feedkeys()|, this uses a
+ low-level input buffer and the call is non-blocking (input is
+ processed asynchronously by the eventloop).
+
+ On execution error: does not fail, but updates v:errmsg.
+
+ Note:
+ |keycodes| like <CR> are translated, so "<" is special. To
+ input a literal "<", send <LT>.
+
+ Attributes: ~
+ {async}
+
+ Parameters: ~
+ {keys} to be typed
+
+ Return: ~
+ Number of bytes actually written (can be fewer than
+ requested if the buffer becomes full).
+
+ *nvim_replace_termcodes()*
+nvim_replace_termcodes({str}, {from_part}, {do_lt}, {special})
+ Replaces terminal codes and |keycodes| (<CR>, <Esc>, ...) in a
+ string with the internal representation.
+
+ Parameters: ~
+ {str} String to be converted.
+ {from_part} Legacy Vim parameter. Usually true.
+ {do_lt} Also translate <lt>. Ignored if `special` is
+ false.
+ {special} Replace |keycodes|, e.g. <CR> becomes a "\n"
+ char.
+
+nvim_command_output({command}) *nvim_command_output()*
+ Executes an ex-command and returns its (non-error) output.
+ Shell |:!| output is not captured.
+
+ On execution error: fails with VimL error, does not update
+ v:errmsg.
+
+ Parameters: ~
+ {command} Ex-command string
+
+nvim_eval({expr}) *nvim_eval()*
+ Evaluates a VimL expression (:help expression). Dictionaries
+ and Lists are recursively expanded.
+
+ On execution error: fails with VimL error, does not update
+ v:errmsg.
+
+ Parameters: ~
+ {expr} VimL expression string
+
+ Return: ~
+ Evaluation result or expanded object
+
+nvim_execute_lua({code}, {args}) *nvim_execute_lua()*
+ Execute lua code. Parameters (if any) are available as `...`
+ inside the chunk. The chunk can return a value.
+
+ Only statements are executed. To evaluate an expression,
+ prefix it with `return`: return my_function(...)
+
+ Parameters: ~
+ {code} lua code to execute
+ {args} Arguments to the code
+
+ Return: ~
+ Return value of lua code if present or NIL.
+
+nvim_call_function({fn}, {args}) *nvim_call_function()*
+ Calls a VimL function with the given arguments.
+
+ On execution error: fails with VimL error, does not update
+ v:errmsg.
+
+ Parameters: ~
+ {fn} Function to call
+ {args} Function arguments packed in an Array
+
+ Return: ~
+ Result of the function call
+
+nvim_call_dict_function({dict}, {fn}, {args}) *nvim_call_dict_function()*
+ Calls a VimL |Dictionary-function| with the given arguments.
+
+ On execution error: fails with VimL error, does not update
+ v:errmsg.
+
+ Parameters: ~
+ {dict} Dictionary, or String evaluating to a VimL |self|
+ dict
+ {fn} Name of the function defined on the VimL dict
+ {args} Function arguments packed in an Array
+
+ Return: ~
+ Result of the function call
+
+nvim_strwidth({text}) *nvim_strwidth()*
+ Calculates the number of display cells occupied by `text`.
+ <Tab> counts as one cell.
+
+ Parameters: ~
+ {text} Some text
+
+ Return: ~
+ Number of cells
+
+nvim_list_runtime_paths() *nvim_list_runtime_paths()*
+ Gets the paths contained in 'runtimepath'.
+
+ Return: ~
+ List of paths
+
+nvim_set_current_dir({dir}) *nvim_set_current_dir()*
+ Changes the global working directory.
+
+ Parameters: ~
+ {dir} Directory path
+
+nvim_get_current_line() *nvim_get_current_line()*
+ Gets the current line
+
+ Parameters: ~
+
+ Return: ~
+ Current line string
+
+nvim_set_current_line({line}) *nvim_set_current_line()*
+ Sets the current line
+
+ Parameters: ~
+ {line} Line contents
+
+nvim_del_current_line() *nvim_del_current_line()*
+ Deletes the current line
+
+ Parameters: ~
+
+nvim_get_var({name}) *nvim_get_var()*
+ Gets a global (g:) variable
+
+ Parameters: ~
+ {name} Variable name
+
+ Return: ~
+ Variable value
+
+nvim_set_var({name}, {value}) *nvim_set_var()*
+ Sets a global (g:) variable
+
+ Parameters: ~
+ {name} Variable name
+ {value} Variable value
+
+nvim_del_var({name}) *nvim_del_var()*
+ Removes a global (g:) variable
+
+ Parameters: ~
+ {name} Variable name
+
+nvim_get_vvar({name}) *nvim_get_vvar()*
+ Gets a v: variable
+
+ Parameters: ~
+ {name} Variable name
+
+ Return: ~
+ Variable value
+
+nvim_get_option({name}) *nvim_get_option()*
+ Gets an option value string
+
+ Parameters: ~
+ {name} Option name
+
+ Return: ~
+ Option value (global)
+
+nvim_set_option({name}, {value}) *nvim_set_option()*
+ Sets an option value
+
+ Parameters: ~
+ {name} Option name
+ {value} New option value
+
+nvim_out_write({str}) *nvim_out_write()*
+ Writes a message to the Vim output buffer. Does not append
+ "\n", the message is buffered (won't display) until a linefeed
+ is written.
+
+ Parameters: ~
+ {str} Message
+
+nvim_err_write({str}) *nvim_err_write()*
+ Writes a message to the Vim error buffer. Does not append
+ "\n", the message is buffered (won't display) until a linefeed
+ is written.
+
+ Parameters: ~
+ {str} Message
+
+nvim_err_writeln({str}) *nvim_err_writeln()*
+ Writes a message to the Vim error buffer. Appends "\n", so the
+ buffer is flushed (and displayed).
+
+ Parameters: ~
+ {str} Message
+
+nvim_list_bufs() *nvim_list_bufs()*
+ Gets the current list of buffer handles
+
+ Includes unlisted (unloaded/deleted) buffers, like `:ls!`. Use
+ |nvim_buf_is_loaded()| to check if a buffer is loaded.
+
+ Return: ~
+ List of buffer handles
+
+nvim_get_current_buf() *nvim_get_current_buf()*
+ Gets the current buffer
+
+ Return: ~
+ Buffer handle
+
+nvim_set_current_buf({buffer}) *nvim_set_current_buf()*
+ Sets the current buffer
+
+ Parameters: ~
+ {buffer} Buffer handle
+
+nvim_list_wins() *nvim_list_wins()*
+ Gets the current list of window handles
+
+ Return: ~
+ List of window handles
+
+nvim_get_current_win() *nvim_get_current_win()*
+ Gets the current window
+
+ Return: ~
+ Window handle
+
+nvim_set_current_win({window}) *nvim_set_current_win()*
+ Sets the current window
+
+ Parameters: ~
+ {window} Window handle
+
+nvim_list_tabpages() *nvim_list_tabpages()*
+ Gets the current list of tabpage handles
+
+ Return: ~
+ List of tabpage handles
+
+nvim_get_current_tabpage() *nvim_get_current_tabpage()*
+ Gets the current tabpage
+
+ Return: ~
+ Tabpage handle
+
+nvim_set_current_tabpage({tabpage}) *nvim_set_current_tabpage()*
+ Sets the current tabpage
+
+ Parameters: ~
+ {tabpage} Tabpage handle
+
+nvim_create_namespace({name}) *nvim_create_namespace()*
+ Creates a new namespace, or gets an existing one
+
+ Namespaces are used for buffer highlights and virtual text,
+ see |nvim_buf_add_highlight()| and
+ |nvim_buf_set_virtual_text()|.
+
+ Namespaces can be named or anonymous. If `name` matches an
+ existing namespace, the associated id is returned. If `name`
+ is an empty string a new, anonymous namespace is created.
+
+ Parameters: ~
+ {name} Namespace name or empty string
+
+ Return: ~
+ Namespace id
+
+nvim_get_namespaces() *nvim_get_namespaces()*
+ Gets existing, non-anonymous namespaces
+
+ Return: ~
+ dict that maps from names to namespace ids.
+
+nvim_subscribe({event}) *nvim_subscribe()*
+ Subscribes to event broadcasts
+
+ Parameters: ~
+ {event} Event type string
+
+nvim_unsubscribe({event}) *nvim_unsubscribe()*
+ Unsubscribes to event broadcasts
+
+ Parameters: ~
+ {event} Event type string
+
+nvim_get_color_by_name({name}) *nvim_get_color_by_name()*
+ TODO: Documentation
+
+nvim_get_color_map() *nvim_get_color_map()*
+ TODO: Documentation
+
+nvim_get_mode() *nvim_get_mode()*
+ Gets the current mode. |mode()| "blocking" is true if Nvim is
+ waiting for input.
+
+ Return: ~
+ Dictionary { "mode": String, "blocking": Boolean }
+
+ Attributes: ~
+ {async}
+
+nvim_get_keymap({mode}) *nvim_get_keymap()*
+ Gets a list of global (non-buffer-local) |mapping|
+ definitions.
+
+ Parameters: ~
+ {mode} Mode short-name ("n", "i", "v", ...)
+
+ Return: ~
+ Array of maparg()-like dictionaries describing mappings.
+ The "buffer" key is always zero.
+
+nvim_get_commands({opts}) *nvim_get_commands()*
+ Gets a map of global (non-buffer-local) Ex commands.
+
+ Currently only |user-commands| are supported, not builtin Ex
+ commands.
+
+ Parameters: ~
+ {opts} Optional parameters. Currently only supports
+ {"builtin":false}
+
+ Return: ~
+ Map of maps describing commands.
+
+nvim_get_api_info() *nvim_get_api_info()*
+ Returns a 2-tuple (Array), where item 0 is the current channel
+ id and item 1 is the |api-metadata| map (Dictionary).
+
+ Return: ~
+ 2-tuple [{channel-id}, {api-metadata}]
+
+ Attributes: ~
+ {async}
+
+ *nvim_set_client_info()*
+nvim_set_client_info({name}, {version}, {type}, {methods},
+ {attributes})
+ Identify the client for nvim. Can be called more than once,
+ but subsequent calls will remove earlier info, which should be
+ resent if it is still valid. (This could happen if a library
+ first identifies the channel, and a plugin using that library
+ later overrides that info)
+
+ Parameters: ~
+ {name} short name for the connected client
+ {version} Dictionary describing the version, with the
+ following possible keys (all optional)
+ "major" major version (defaults to 0 if not
+ set, for no release yet) "minor" minor
+ version "patch" patch number "prerelease"
+ string describing a prerelease, like "dev"
+ or "beta1" "commit" hash or similar
+ identifier of commit
+ {type} Must be one of the following values. A
+ client library should use "remote" if the
+ library user hasn't specified other value.
+ "remote" remote client that connected to
+ nvim. "ui" gui frontend "embedder"
+ application using nvim as a component, for
+ instance IDE/editor implementing a vim mode.
+ "host" plugin host, typically started by
+ nvim "plugin" single plugin, started by
+ nvim
+ {methods} Builtin methods in the client. For a host,
+ this does not include plugin methods which
+ will be discovered later. The key should be
+ the method name, the values are dicts with
+ the following (optional) keys: "async" if
+ true, send as a notification. If false or
+ unspecified, use a blocking request "nargs"
+ Number of arguments. Could be a single
+ integer or an array two integers, minimum
+ and maximum inclusive. Further keys might be
+ added in later versions of nvim and unknown
+ keys are thus ignored. Clients must only use
+ keys defined in this or later versions of
+ nvim!
+ {attributes} Informal attributes describing the client.
+ Clients might define their own keys, but the
+ following are suggested: "website" Website
+ of client (for instance github repository)
+ "license" Informal description of the
+ license, such as "Apache 2", "GPLv3" or
+ "MIT" "logo" URI or path to image,
+ preferably small logo or icon. .png or .svg
+ format is preferred.
+
+nvim_get_chan_info({chan}) *nvim_get_chan_info()*
+ Get information about a channel.
+
+ Return: ~
+ a Dictionary, describing a channel with the following
+ keys: "stream" the stream underlying the channel
+ "stdio" stdin and stdout of this Nvim instance "stderr"
+ stderr of this Nvim instance "socket" TCP/IP socket or
+ named pipe "job" job with communication over its stdio
+
+ "mode" how data received on the channel is interpreted "bytes" send and recieve raw bytes "terminal" a |terminal| instance interprets ASCII sequences "rpc" |RPC| communication on the channel is active "pty" Name of pseudoterminal, if one is used (optional). On a POSIX system, this will be a device path like /dev/pts/1. Even if the name is unknown, the key will still be present to indicate a pty is used. This is currently the case when using winpty on windows. "buffer" buffer with connected |terminal| instance (optional) "client" information about the client on the other end of the RPC channel, if it has added it using |nvim_set_client_info()|. (optional)
+
+nvim_list_chans() *nvim_list_chans()*
+ Get information about all open channels.
+
+ Return: ~
+ Array of Dictionaries, each describing a channel with the
+ format specified at |nvim_get_chan_info()|.
+
+nvim_call_atomic({calls}) *nvim_call_atomic()*
+ Calls many API methods atomically.
+
+ This has two main usages:
+ To perform several requests from an async context atomically, i.e. without interleaving redraws, RPC requests from other clients, or user interactions (however API methods may trigger autocommands or event processing which have such side-effects, e.g. |:sleep| may wake timers). To minimize RPC overhead (roundtrips) of a sequence of many requests.
+
+ Parameters: ~
+ {calls} an array of calls, where each call is described
+ by an array with two elements: the request name,
+ and an array of arguments.
+
+ Return: ~
+ an array with two elements. The first is an array of
+ return values. The second is NIL if all calls succeeded.
+ If a call resulted in an error, it is a three-element
+ array with the zero-based index of the call which resulted
+ in an error, the error type and the error message. If an
+ error occurred, the values from all preceding calls will
+ still be returned.
+
+ *nvim_parse_expression()*
+nvim_parse_expression({expr}, {flags}, {highlight})
+ Parse a VimL expression
+
+ Attributes: ~
+ {async}
+
+ Parameters: ~
+ {expr} Expression to parse. Is always treated as a
+ single line.
+ {flags} Flags: - "m" if multiple expressions in a
+ row are allowed (only the first one will be
+ parsed), - "E" if EOC tokens are not allowed
+ (determines whether they will stop parsing
+ process or be recognized as an
+ operator/space, though also yielding an
+ error). - "l" when needing to start parsing
+ with lvalues for ":let" or ":for". Common
+ flag sets: - "m" to parse like for ":echo". -
+ "E" to parse like for "<C-r>=". - empty
+ string for ":call". - "lm" to parse for
+ ":let".
+ {highlight} If true, return value will also include
+ "highlight" key containing array of 4-tuples
+ (arrays) (Integer, Integer, Integer, String),
+ where first three numbers define the
+ highlighted region and represent line,
+ starting column and ending column (latter
+ exclusive: one should highlight region
+ [start_col, end_col)).
+
+ Return: ~
+ AST: top-level dictionary with these keys: "error":
+ Dictionary with error, present only if parser saw some
+ error. Contains the following keys: "message": String,
+ error message in printf format, translated. Must contain
+ exactly one "%.*s". "arg": String, error message argument.
+ "len": Amount of bytes successfully parsed. With flags
+ equal to "" that should be equal to the length of expr
+ string. @note: โ€œSucessfully parsedโ€ here means
+ โ€œparticipated in AST creationโ€, not โ€œtill the first
+ errorโ€. "ast": AST, either nil or a dictionary with these
+ keys: "type": node type, one of the value names from
+ ExprASTNodeType stringified without "kExprNode" prefix.
+ "start": a pair [line, column] describing where node is
+ โ€œstartedโ€ where "line" is always 0 (will not be 0 if you
+ will be using nvim_parse_viml() on e.g. ":let", but that
+ is not present yet). Both elements are Integers. "len":
+ โ€œlengthโ€ of the node. This and "start" are there for
+ debugging purposes primary (debugging parser and providing
+ debug information). "children": a list of nodes described
+ in top/"ast". There always is zero, one or two children,
+ key will not be present if node has no children. Maximum
+ number of children may be found in node_maxchildren array.
+ Local values (present only for certain nodes): "scope": a
+ single Integer, specifies scope for "Option" and
+ "PlainIdentifier" nodes. For "Option" it is one of
+ ExprOptScope values, for "PlainIdentifier" it is one of
+ ExprVarScope values. "ident": identifier (without scope,
+ if any), present for "Option", "PlainIdentifier",
+ "PlainKey" and "Environment" nodes. "name": Integer,
+ register name (one character) or -1. Only present for
+ "Register" nodes. "cmp_type": String, comparison type, one
+ of the value names from ExprComparisonType, stringified
+ without "kExprCmp" prefix. Only present for "Comparison"
+ nodes. "ccs_strategy": String, case comparison strategy,
+ one of the value names from ExprCaseCompareStrategy,
+ stringified without "kCCStrategy" prefix. Only present for
+ "Comparison" nodes. "augmentation": String, augmentation
+ type for "Assignment" nodes. Is either an empty string,
+ "Add", "Subtract" or "Concat" for "=", "+=", "-=" or ".="
+ respectively. "invert": Boolean, true if result of
+ comparison needs to be inverted. Only present for
+ "Comparison" nodes. "ivalue": Integer, integer value for
+ "Integer" nodes. "fvalue": Float, floating-point value for
+ "Float" nodes. "svalue": String, value for
+ "SingleQuotedString" and "DoubleQuotedString" nodes.
+
+nvim__id({obj}) *nvim__id()*
+ Returns object given as argument
+
+ This API function is used for testing. One should not rely on
+ its presence in plugins.
+
+ Parameters: ~
+ {obj} Object to return.
+
+ Return: ~
+ its argument.
+
+nvim__id_array({arr}) *nvim__id_array()*
+ Returns array given as argument
+
+ This API function is used for testing. One should not rely on
+ its presence in plugins.
+
+ Parameters: ~
+ {arr} Array to return.
+
+ Return: ~
+ its argument.
+
+nvim__id_dictionary({dct}) *nvim__id_dictionary()*
+ Returns dictionary given as argument
+
+ This API function is used for testing. One should not rely on
+ its presence in plugins.
+
+ Parameters: ~
+ {dct} Dictionary to return.
+
+ Return: ~
+ its argument.
+
+nvim__id_float({flt}) *nvim__id_float()*
+ Returns floating-point value given as argument
+
+ This API function is used for testing. One should not rely on
+ its presence in plugins.
+
+ Parameters: ~
+ {flt} Value to return.
+
+ Return: ~
+ its argument.
+
+nvim__stats() *nvim__stats()*
+ Gets internal stats.
+
+ Return: ~
+ Map of various internal stats.
+
+nvim_list_uis() *nvim_list_uis()*
+ Gets a list of dictionaries representing attached UIs.
+
+ Return: ~
+ Array of UI dictionaries
+ Each dictionary has the following keys:
+ "height" requested height of the UI "width" requested width of the UI "rgb" whether the UI uses rgb colors (false implies cterm colors) "ext_..." Requested UI extensions, see |ui-options| "chan" Channel id of remote UI (not present for TUI)
+
+nvim_get_proc_children({pid}) *nvim_get_proc_children()*
+ Gets the immediate children of process `pid`.
+
+ Return: ~
+ Array of child process ids, empty if process not found.
+
+nvim_get_proc({pid}) *nvim_get_proc()*
+ Gets info describing process `pid`.
+
+ Return: ~
+ Map of process properties, or NIL if process not found.
+
+nvim__inspect_cell({row}, {col}) *nvim__inspect_cell()*
+ TODO: Documentation
+
+
+==============================================================================
+Buffer Functions *api-buffer*
+
+Unloaded Buffers:~
+
+Buffers may be unloaded by the |:bunload| command or the
+buffer's |'bufhidden'| option. When a buffer is unloaded its
+file contents are freed from memory and vim cannot operate on
+the buffer lines until it is reloaded (usually by opening the
+buffer again in a new window). API methods such as
+|nvim_buf_get_lines()| and |nvim_buf_line_count()| will be
+affected.
+
+You can use |nvim_buf_is_loaded()| or |nvim_buf_line_count()|
+to check whether a buffer is loaded.
+
+nvim_buf_line_count({buffer}) *nvim_buf_line_count()*
+ Gets the buffer line count
+
+ Parameters: ~
+ {buffer} Buffer handle
+
+ Return: ~
+ Line count, or 0 for unloaded buffer. |api-buffer|
+
+nvim_buf_attach({buffer}, {send_buffer}, {opts}) *nvim_buf_attach()*
+ Activate updates from this buffer to the current channel.
+
+ Parameters: ~
+ {buffer} The buffer handle
+ {send_buffer} Set to true if the initial notification
+ should contain the whole buffer. If so, the
+ first notification will be a
+ `nvim_buf_lines_event`. Otherwise, the
+ first notification will be a
+ `nvim_buf_changedtick_event`
+ {opts} Optional parameters. Currently not used.
+
+ Return: ~
+ False when updates couldn't be enabled because the buffer
+ isn't loaded or optscontained an invalid key; otherwise
+ True.
+
+nvim_buf_detach({buffer}) *nvim_buf_detach()*
+ Deactivate updates from this buffer to the current channel.
+
+ Parameters: ~
+ {buffer} The buffer handle
+
+ Return: ~
+ False when updates couldn't be disabled because the buffer
+ isn't loaded; otherwise True.
+
+ *nvim_buf_get_lines()*
+nvim_buf_get_lines({buffer}, {start}, {end}, {strict_indexing})
+ Gets a line-range from the buffer.
+
+ Indexing is zero-based, end-exclusive. Negative indices are
+ interpreted as length+1+index: -1 refers to the index past the
+ end. So to get the last element use start=-2 and end=-1.
+
+ Out-of-bounds indices are clamped to the nearest valid value,
+ unless `strict_indexing` is set.
+
+ Parameters: ~
+ {buffer} Buffer handle
+ {start} First line index
+ {end} Last line index (exclusive)
+ {strict_indexing} Whether out-of-bounds should be an
+ error.
+
+ Return: ~
+ Array of lines, or empty array for unloaded buffer.
+
+ *nvim_buf_set_lines()*
+nvim_buf_set_lines({buffer}, {start}, {end}, {strict_indexing},
+ {replacement})
+ Sets (replaces) a line-range in the buffer.
+
+ Indexing is zero-based, end-exclusive. Negative indices are
+ interpreted as length+1+index: -1 refers to the index past the
+ end. So to change or delete the last element use start=-2 and
+ end=-1.
+
+ To insert lines at a given index, set `start` and `end` to the
+ same index. To delete a range of lines, set `replacement` to
+ an empty array.
+
+ Out-of-bounds indices are clamped to the nearest valid value,
+ unless `strict_indexing` is set.
+
+ Parameters: ~
+ {buffer} Buffer handle
+ {start} First line index
+ {end} Last line index (exclusive)
+ {strict_indexing} Whether out-of-bounds should be an
+ error.
+ {replacement} Array of lines to use as replacement
+
+nvim_buf_get_offset({buffer}, {index}) *nvim_buf_get_offset()*
+ Returns the byte offset for a line.
+
+ Line 1 (index=0) has offset 0. UTF-8 bytes are counted. EOL is
+ one byte. 'fileformat' and 'fileencoding' are ignored. The
+ line index just after the last line gives the total byte-count
+ of the buffer. A final EOL byte is counted if it would be
+ written, see 'eol'.
+
+ Unlike |line2byte()|, throws error for out-of-bounds indexing.
+ Returns -1 for unloaded buffer.
+
+ Parameters: ~
+ {buffer} Buffer handle
+ {index} Line index
+
+ Return: ~
+ Integer byte offset, or -1 for unloaded buffer.
+
+nvim_buf_get_var({buffer}, {name}) *nvim_buf_get_var()*
+ Gets a buffer-scoped (b:) variable.
+
+ Parameters: ~
+ {buffer} Buffer handle
+ {name} Variable name
+
+ Return: ~
+ Variable value
+
+nvim_buf_get_changedtick({buffer}) *nvim_buf_get_changedtick()*
+ Gets a changed tick of a buffer
+
+ Parameters: ~
+ {buffer} Buffer handle.
+
+ Return: ~
+ b:changedtickvalue.
+
+nvim_buf_get_keymap({buffer}, {mode}) *nvim_buf_get_keymap()*
+ Gets a list of buffer-local |mapping| definitions.
+
+ Parameters: ~
+ {mode} Mode short-name ("n", "i", "v", ...)
+ {buffer} Buffer handle
+
+ Return: ~
+ Array of maparg()-like dictionaries describing mappings.
+ The "buffer" key holds the associated buffer handle.
+
+nvim_buf_get_commands({buffer}, {opts}) *nvim_buf_get_commands()*
+ Gets a map of buffer-local |user-commands|.
+
+ Parameters: ~
+ {buffer} Buffer handle.
+ {opts} Optional parameters. Currently not used.
+
+ Return: ~
+ Map of maps describing commands.
+
+nvim_buf_set_var({buffer}, {name}, {value}) *nvim_buf_set_var()*
+ Sets a buffer-scoped (b:) variable
+
+ Parameters: ~
+ {buffer} Buffer handle
+ {name} Variable name
+ {value} Variable value
+
+nvim_buf_del_var({buffer}, {name}) *nvim_buf_del_var()*
+ Removes a buffer-scoped (b:) variable
+
+ Parameters: ~
+ {buffer} Buffer handle
+ {name} Variable name
+
+nvim_buf_get_option({buffer}, {name}) *nvim_buf_get_option()*
+ Gets a buffer option value
+
+ Parameters: ~
+ {buffer} Buffer handle
+ {name} Option name
+
+ Return: ~
+ Option value
+
+nvim_buf_set_option({buffer}, {name}, {value}) *nvim_buf_set_option()*
+ Sets a buffer option value. Passing 'nil' as value deletes the
+ option (only works if there's a global fallback)
+
+ Parameters: ~
+ {buffer} Buffer handle
+ {name} Option name
+ {value} Option value
+
+nvim_buf_get_name({buffer}) *nvim_buf_get_name()*
+ Gets the full file name for the buffer
+
+ Parameters: ~
+ {buffer} Buffer handle
+
+ Return: ~
+ Buffer name
+
+nvim_buf_set_name({buffer}, {name}) *nvim_buf_set_name()*
+ Sets the full file name for a buffer
+
+ Parameters: ~
+ {buffer} Buffer handle
+ {name} Buffer name
+
+nvim_buf_is_loaded({buffer}) *nvim_buf_is_loaded()*
+ Checks if a buffer is valid and loaded. See |api-buffer| for
+ more info about unloaded buffers.
+
+ Parameters: ~
+ {buffer} Buffer handle
+
+ Return: ~
+ true if the buffer is valid and loaded, false otherwise.
+
+nvim_buf_is_valid({buffer}) *nvim_buf_is_valid()*
+ Checks if a buffer is valid.
+
+ Note:
+ Even if a buffer is valid it may have been unloaded. See
+ |api-buffer| for more info about unloaded buffers.
+
+ Parameters: ~
+ {buffer} Buffer handle
+
+ Return: ~
+ true if the buffer is valid, false otherwise.
+
+nvim_buf_get_mark({buffer}, {name}) *nvim_buf_get_mark()*
+ Return a tuple (row,col) representing the position of the
+ named mark
+
+ Parameters: ~
+ {buffer} Buffer handle
+ {name} Mark name
+
+ Return: ~
+ (row, col) tuple
+
+ *nvim_buf_add_highlight()*
+nvim_buf_add_highlight({buffer}, {ns_id}, {hl_group}, {line},
+ {col_start}, {col_end})
+ Adds a highlight to buffer.
+
+ Useful for plugins that dynamically generate highlights to a
+ buffer (like a semantic highlighter or linter). The function
+ adds a single highlight to a buffer. Unlike |matchaddpos()|
+ highlights follow changes to line numbering (as lines are
+ inserted/removed above the highlighted line), like signs and
+ marks do.
+
+ Namespaces are used for batch deletion/updating of a set of
+ highlights. To create a namespace, use |nvim_create_namespace|
+ which returns a namespace id. Pass it in to this function as
+ `ns_id` to add highlights to the namespace. All highlights in
+ the same namespace can then be cleared with single call to
+ |nvim_buf_clear_namespace|. If the highlight never will be
+ deleted by an API call, pass `ns_id = -1`.
+
+ As a shorthand, `ns_id = 0` can be used to create a new
+ namespace for the highlight, the allocated id is then
+ returned. If `hl_group` is the empty string no highlight is
+ added, but a new `ns_id` is still returned. This is supported
+ for backwards compatibility, new code should use
+ |nvim_create_namespace| to create a new empty namespace.
+
+ Parameters: ~
+ {buffer} Buffer handle
+ {ns_id} namespace to use or -1 for ungrouped
+ highlight
+ {hl_group} Name of the highlight group to use
+ {line} Line to highlight (zero-indexed)
+ {col_start} Start of (byte-indexed) column range to
+ highlight
+ {col_end} End of (byte-indexed) column range to
+ highlight, or -1 to highlight to end of line
+
+ Return: ~
+ The ns_id that was used
+
+ *nvim_buf_clear_namespace()*
+nvim_buf_clear_namespace({buffer}, {ns_id}, {line_start}, {line_end})
+ Clears namespaced objects, highlights and virtual text, from a
+ line range
+
+ To clear the namespace in the entire buffer, pass in 0 and -1
+ to line_start and line_end respectively.
+
+ Parameters: ~
+ {buffer} Buffer handle
+ {ns_id} Namespace to clear, or -1 to clear all
+ namespaces.
+ {line_start} Start of range of lines to clear
+ {line_end} End of range of lines to clear (exclusive)
+ or -1 to clear to end of buffer.
+
+ *nvim_buf_set_virtual_text()*
+nvim_buf_set_virtual_text({buffer}, {ns_id}, {line}, {chunks}, {opts})
+ Set the virtual text (annotation) for a buffer line.
+
+ By default (and currently the only option) the text will be
+ placed after the buffer text. Virtual text will never cause
+ reflow, rather virtual text will be truncated at the end of
+ the screen line. The virtual text will begin one cell (|lcs-
+ eol| or space) after the ordinary text.
+
+ Namespaces are used to support batch deletion/updating of
+ virtual text. To create a namespace, use
+ |nvim_create_namespace|. Virtual text is cleared using
+ |nvim_buf_clear_namespace|. The same `ns_id` can be used for
+ both virtual text and highlights added by
+ |nvim_buf_add_highlight|, both can then be cleared with a
+ single call to |nvim_buf_clear_namespace|. If the virtual text
+ never will be cleared by an API call, pass `ns_id = -1`.
+
+ As a shorthand, `ns_id = 0` can be used to create a new
+ namespace for the virtual text, the allocated id is then
+ returned.
+
+ Parameters: ~
+ {buffer} Buffer handle
+ {ns_id} Namespace to use or 0 to create a namespace, or
+ -1 for a ungrouped annotation
+ {line} Line to annotate with virtual text (zero-
+ indexed)
+ {chunks} A list of [text, hl_group] arrays, each
+ representing a text chunk with specified
+ highlight. `hl_group` element can be omitted for
+ no highlight.
+ {opts} Optional parameters. Currently not used.
+
+ Return: ~
+ The ns_id that was used
+
+
+==============================================================================
+Window Functions *api-window*
+
+nvim_win_get_buf({window}) *nvim_win_get_buf()*
+ Gets the current buffer in a window
+
+ Parameters: ~
+ {window} Window handle
+
+ Return: ~
+ Buffer handle
+
+nvim_win_set_buf({window}, {buffer}) *nvim_win_set_buf()*
+ Sets the current buffer in a window, without side-effects
+
+ Parameters: ~
+ {window} Window handle
+ {buffer} Buffer handle
+
+nvim_win_get_cursor({window}) *nvim_win_get_cursor()*
+ Gets the cursor position in the window
+
+ Parameters: ~
+ {window} Window handle
+
+ Return: ~
+ (row, col) tuple
+
+nvim_win_set_cursor({window}, {pos}) *nvim_win_set_cursor()*
+ Sets the cursor position in the window
+
+ Parameters: ~
+ {window} Window handle
+ {pos} (row, col) tuple representing the new position
+
+nvim_win_get_height({window}) *nvim_win_get_height()*
+ Gets the window height
+
+ Parameters: ~
+ {window} Window handle
+
+ Return: ~
+ Height as a count of rows
+
+nvim_win_set_height({window}, {height}) *nvim_win_set_height()*
+ Sets the window height. This will only succeed if the screen
+ is split horizontally.
+
+ Parameters: ~
+ {window} Window handle
+ {height} Height as a count of rows
+
+nvim_win_get_width({window}) *nvim_win_get_width()*
+ Gets the window width
+
+ Parameters: ~
+ {window} Window handle
+
+ Return: ~
+ Width as a count of columns
+
+nvim_win_set_width({window}, {width}) *nvim_win_set_width()*
+ Sets the window width. This will only succeed if the screen is
+ split vertically.
+
+ Parameters: ~
+ {window} Window handle
+ {width} Width as a count of columns
+
+nvim_win_get_var({window}, {name}) *nvim_win_get_var()*
+ Gets a window-scoped (w:) variable
+
+ Parameters: ~
+ {window} Window handle
+ {name} Variable name
+
+ Return: ~
+ Variable value
+
+nvim_win_set_var({window}, {name}, {value}) *nvim_win_set_var()*
+ Sets a window-scoped (w:) variable
+
+ Parameters: ~
+ {window} Window handle
+ {name} Variable name
+ {value} Variable value
+
+nvim_win_del_var({window}, {name}) *nvim_win_del_var()*
+ Removes a window-scoped (w:) variable
+
+ Parameters: ~
+ {window} Window handle
+ {name} Variable name
+
+nvim_win_get_option({window}, {name}) *nvim_win_get_option()*
+ Gets a window option value
+
+ Parameters: ~
+ {window} Window handle
+ {name} Option name
+
+ Return: ~
+ Option value
+
+nvim_win_set_option({window}, {name}, {value}) *nvim_win_set_option()*
+ Sets a window option value. Passing 'nil' as value deletes the
+ option(only works if there's a global fallback)
+
+ Parameters: ~
+ {window} Window handle
+ {name} Option name
+ {value} Option value
+
+nvim_win_get_position({window}) *nvim_win_get_position()*
+ Gets the window position in display cells. First position is
+ zero.
+
+ Parameters: ~
+ {window} Window handle
+
+ Return: ~
+ (row, col) tuple with the window position
+
+nvim_win_get_tabpage({window}) *nvim_win_get_tabpage()*
+ Gets the window tabpage
+
+ Parameters: ~
+ {window} Window handle
+
+ Return: ~
+ Tabpage that contains the window
+
+nvim_win_get_number({window}) *nvim_win_get_number()*
+ Gets the window number
+
+ Parameters: ~
+ {window} Window handle
+
+ Return: ~
+ Window number
+
+nvim_win_is_valid({window}) *nvim_win_is_valid()*
+ Checks if a window is valid
+
+ Parameters: ~
+ {window} Window handle
+
+ Return: ~
+ true if the window is valid, false otherwise
+
+
+==============================================================================
+Tabpage Functions *api-tabpage*
+
+nvim_tabpage_list_wins({tabpage}) *nvim_tabpage_list_wins()*
+ Gets the windows in a tabpage
+
+ Parameters: ~
+ {tabpage} Tabpage
+
+ Return: ~
+ List of windows in tabpage
+
+nvim_tabpage_get_var({tabpage}, {name}) *nvim_tabpage_get_var()*
+ Gets a tab-scoped (t:) variable
+
+ Parameters: ~
+ {tabpage} Tabpage handle
+ {name} Variable name
+
+ Return: ~
+ Variable value
+
+nvim_tabpage_set_var({tabpage}, {name}, {value}) *nvim_tabpage_set_var()*
+ Sets a tab-scoped (t:) variable
+
+ Parameters: ~
+ {tabpage} Tabpage handle
+ {name} Variable name
+ {value} Variable value
+
+nvim_tabpage_del_var({tabpage}, {name}) *nvim_tabpage_del_var()*
+ Removes a tab-scoped (t:) variable
+
+ Parameters: ~
+ {tabpage} Tabpage handle
+ {name} Variable name
+
+nvim_tabpage_get_win({tabpage}) *nvim_tabpage_get_win()*
+ Gets the current window in a tabpage
+
+ Parameters: ~
+ {tabpage} Tabpage handle
+
+ Return: ~
+ Window handle
+
+nvim_tabpage_get_number({tabpage}) *nvim_tabpage_get_number()*
+ Gets the tabpage number
+
+ Parameters: ~
+ {tabpage} Tabpage handle
+
+ Return: ~
+ Tabpage number
+
+nvim_tabpage_is_valid({tabpage}) *nvim_tabpage_is_valid()*
+ Checks if a tabpage is valid
+
+ Parameters: ~
+ {tabpage} Tabpage handle
+
+ Return: ~
+ true if the tabpage is valid, false otherwise
+
+
+==============================================================================
+UI Functions *api-ui*
+
+nvim_ui_attach({width}, {height}, {options}) *nvim_ui_attach()*
+ TODO: Documentation
+
+nvim_ui_detach() *nvim_ui_detach()*
+ TODO: Documentation
+
+nvim_ui_try_resize({width}, {height}) *nvim_ui_try_resize()*
+ TODO: Documentation
+
+nvim_ui_set_option({name}, {value}) *nvim_ui_set_option()*
+ TODO: Documentation
+
+ vim:tw=78:ts=8:ft=help:norl:
diff --git a/runtime/doc/arabic.txt b/runtime/doc/arabic.txt
index 6f17b38a7a..a3d979e519 100644
--- a/runtime/doc/arabic.txt
+++ b/runtime/doc/arabic.txt
@@ -1,4 +1,4 @@
-*arabic.txt* For Vim version 7.4. Last change: 2010 Nov 13
+*arabic.txt* Nvim
VIM REFERENCE MANUAL by Nadim Shaikli
@@ -36,7 +36,7 @@ the user interface remains the standard Vi interface.
Highlights
----------
-o Editing left-to-right files as in the original VIM hasn't changed.
+o Editing left-to-right files as in the original Vim hasn't changed.
o Viewing and editing files in right-to-left windows. File
orientation is per window, so it is possible to view the same
@@ -46,7 +46,7 @@ o No special terminal with right-to-left capabilities is required.
The right-to-left changes are completely hardware independent.
Only Arabic fonts are necessary.
-o Compatible with the original VIM. Almost all features work in
+o Compatible with the original Vim. Almost all features work in
right-to-left mode (there are liable to be bugs).
o Changing keyboard mapping and reverse insert modes using a single
@@ -60,14 +60,14 @@ o While in Arabic mode, numbers are entered from left to right. Upon
o Arabic keymapping on the command line in reverse insert mode.
-o Proper Bidirectional functionality is possible given VIM is
+o Proper Bidirectional functionality is possible given Vim is
started within a Bidi capable terminal emulator.
Arabic Fonts *arabicfonts*
------------
-VIM requires monospaced fonts of which there are many out there.
+Vim requires monospaced fonts of which there are many out there.
Arabic requires ISO-8859-6 as well as Presentation Form-B fonts
(without Form-B, Arabic will _NOT_ be usable). It is highly
recommended that users search for so-called 'ISO-10646-1' fonts.
@@ -90,13 +90,13 @@ o Installation of fonts for X Window systems (Unix/Linux)
Usage
-----
-Prior to the actual usage of Arabic within VIM, a number of settings
+Prior to the actual usage of Arabic within Vim, a number of settings
need to be accounted for and invoked.
o Setting the Arabic fonts
- + For VIM GUI set the 'guifont' to your_ARABIC_FONT. This is done
- by entering the following command in the VIM window.
+ + For Vim GUI set the 'guifont' to your_ARABIC_FONT. This is done
+ by entering the following command in the Vim window.
>
:set guifont=your_ARABIC_FONT
<
@@ -109,7 +109,7 @@ o Setting the Arabic fonts
you can include ':set guifont=your_ARABIC_FONT' to your vimrc
file.
- + Under the X Window environment, you can also start VIM with
+ + Under the X Window environment, you can also start Vim with
'-fn your_ARABIC_FONT' option.
o Setting the appropriate character Encoding
@@ -131,11 +131,11 @@ o Setting the appropriate character Encoding
o Enable Arabic settings [short-cut]
In order to simplify and streamline things, you can either invoke
- VIM with the command-line option,
+ Vim with the command-line option,
% vim -A my_utf8_arabic_file ...
- or enable 'arabic' via the following command within VIM
+ or enable 'arabic' via the following command within Vim
>
:set arabic
<
@@ -196,7 +196,7 @@ o Enable Arabic settings [short-cut]
+ Arabic deletion of a combined pair character
- By default VIM has the 'delcombine' option disabled. This option
+ By default Vim has the 'delcombine' option disabled. This option
allows the deletion of ALEF in a LAM_ALEF (LAA) combined character
and still retain the LAM (i.e. it reverts to treating the combined
character as its natural two characters form -- this also pertains
@@ -255,7 +255,7 @@ o Enable Arabic settings [short-cut]
Keymap/Keyboard *arabickeymap*
---------------
-The character/letter encoding used in VIM is the standard UTF-8.
+The character/letter encoding used in Vim is the standard UTF-8.
It is widely discouraged that any other encoding be used or even
attempted.
@@ -288,7 +288,7 @@ o Keyboard
Restrictions
------------
-o VIM in its GUI form does not currently support Bi-directionality
+o Vim in its GUI form does not currently support Bi-directionality
(i.e. the ability to see both Arabic and Latin intermixed within
the same line).
@@ -313,4 +313,4 @@ There is one known minor bug,
No other bugs are known to exist.
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt
index dc37ff1d6d..d7b74f99c2 100644
--- a/runtime/doc/autocmd.txt
+++ b/runtime/doc/autocmd.txt
@@ -1,24 +1,14 @@
-*autocmd.txt* For Vim version 7.4. Last change: 2016 Mar 26
+*autocmd.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
-Automatic commands *autocommand*
+Automatic commands *autocmd* *autocommand*
For a basic explanation, see section |40.3| in the user manual.
-1. Introduction |autocmd-intro|
-2. Defining autocommands |autocmd-define|
-3. Removing autocommands |autocmd-remove|
-4. Listing autocommands |autocmd-list|
-5. Events |autocmd-events|
-6. Patterns |autocmd-patterns|
-7. Buffer-local autocommands |autocmd-buflocal|
-8. Groups |autocmd-groups|
-9. Executing autocommands |autocmd-execute|
-10. Using autocommands |autocmd-use|
-11. Disabling autocommands |autocmd-disable|
+ Type |gO| to see the table of contents.
==============================================================================
1. Introduction *autocmd-intro*
@@ -30,7 +20,7 @@ files matching *.c. You can also use autocommands to implement advanced
features, such as editing compressed files (see |gzip-example|). The usual
place to put autocommands is in your vimrc file.
- *E203* *E204* *E143* *E855*
+ *E203* *E204* *E143* *E855* *E937* *E952*
WARNING: Using autocommands is very powerful, and may lead to unexpected side
effects. Be careful not to destroy your text.
- It's a good idea to do some testing on an expendable copy of a file first.
@@ -49,14 +39,13 @@ effects. Be careful not to destroy your text.
==============================================================================
2. Defining autocommands *autocmd-define*
-Note: The ":autocmd" command cannot be followed by another command, since any
-'|' is considered part of the command.
-
*:au* *:autocmd*
:au[tocmd] [group] {event} {pat} [nested] {cmd}
Add {cmd} to the list of commands that Vim will
execute automatically on {event} for a file matching
{pat} |autocmd-patterns|.
+ Note: A quote character is seen as argument to the
+ :autocmd and won't start a comment.
Vim always adds the {cmd} after existing autocommands,
so that the autocommands execute in the order in which
they were given. See |autocmd-nested| for [nested].
@@ -64,6 +53,19 @@ Note: The ":autocmd" command cannot be followed by another command, since any
The special pattern <buffer> or <buffer=N> defines a buffer-local autocommand.
See |autocmd-buflocal|.
+Note: The ":autocmd" command can only be followed by another command when the
+'|' appears before {cmd}. This works: >
+ :augroup mine | au! BufRead | augroup END
+But this sees "augroup" as part of the defined command: >
+ :augroup mine | au! BufRead * | augroup END
+ :augroup mine | au BufRead * set tw=70 | augroup END
+Instead you can put the group name into the command: >
+ :au! mine BufRead *
+ :au mine BufRead * set tw=70
+Or use `:execute`: >
+ :augroup mine | exe "au! BufRead *" | augroup END
+ :augroup mine | exe "au BufRead * set tw=70" | augroup END
+
Note that special characters (e.g., "%", "<cword>") in the ":autocmd"
arguments are not expanded when the autocommand is defined. These will be
expanded when the Event is recognized, and the {cmd} is executed. The only
@@ -73,11 +75,16 @@ exception is that "<sfile>" is expanded when the autocmd is defined. Example:
Here Vim expands <sfile> to the name of the file containing this line.
-When your vimrc file is sourced twice, the autocommands will appear twice.
-To avoid this, put this command in your vimrc file, before defining
-autocommands: >
+`:autocmd` adds to the list of autocommands regardless of whether they are
+already present. When your .vimrc file is sourced twice, the autocommands
+will appear twice. To avoid this, define your autocommands in a group, so
+that you can easily clear them: >
- :autocmd! " Remove ALL autocommands for the current group.
+ augroup vimrc
+ " Remove all vimrc autocommands
+ autocmd!
+ au BufNewFile,BufRead *.html so <sfile>:h/html.vim
+ augroup END
If you don't want to remove all autocommands, you can instead use a variable
to ensure that Vim includes the autocommands only once: >
@@ -124,8 +131,15 @@ prompt. When one command outputs two messages this can happen anyway.
:au[tocmd]! [group] {event}
Remove ALL autocommands for {event}.
+ Warning: You should not do this without a group for
+ |BufRead| and other common events, it can break
+ plugins, syntax highlighting, etc.
:au[tocmd]! [group] Remove ALL autocommands.
+ Note: a quote will be seen as argument to the :autocmd
+ and won't start a comment.
+ Warning: You should normally not do this without a
+ group, it breaks plugins, syntax highlighting, etc.
When the [group] argument is not given, Vim uses the current group (as defined
with ":augroup"); otherwise, Vim uses the group defined with [group].
@@ -250,29 +264,34 @@ Name triggered by ~
|BufNew| just after creating a new buffer
|SwapExists| detected an existing swap file
-|TermOpen| when a terminal buffer is starting
-|TermClose| when a terminal buffer ends
+|TermOpen| when a terminal job starts
+|TermClose| when a terminal job ends
+|ChanOpen| after a channel opened
+|ChanInfo| after a channel has its state changed
Options
|FileType| when the 'filetype' option has been set
|Syntax| when the 'syntax' option has been set
-|EncodingChanged| after the 'encoding' option has been changed
-|TermChanged| after the value of 'term' has changed
|OptionSet| after setting any option
Startup and exit
|VimEnter| after doing all the startup stuff
|GUIEnter| after starting the GUI successfully
|GUIFailed| after starting the GUI failed
-|TermResponse| after the terminal response to |t_RV| is received
-
-|QuitPre| when using `:quit`, before deciding whether to quit
-|VimLeavePre| before exiting Vim, before writing the shada file
-|VimLeave| before exiting Vim, after writing the shada file
+|TermResponse| after the terminal response to t_RV is received
+|QuitPre| when using `:quit`, before deciding whether to exit
+|ExitPre| when using a command that may make Vim exit
+|VimLeavePre| before exiting Nvim, before writing the shada file
+|VimLeave| before exiting Nvim, after writing the shada file
+|VimResume| after Nvim is resumed
+|VimSuspend| before Nvim is suspended
Various
+|DiffUpdated| after diffs have been updated
+|DirChanged| after the |current-directory| was changed
+
|FileChangedShell| Vim notices that a file changed since editing started
-|FileChangedShellPost| After handling a file changed since editing started
+|FileChangedShellPost| after handling a file changed since editing started
|FileChangedRO| before making the first change to a read-only file
|ShellCmdPost| after executing a shell command
@@ -285,13 +304,14 @@ Name triggered by ~
|SourceCmd| before sourcing a Vim script |Cmd-event|
|VimResized| after the Vim window size changed
-|FocusGained| Vim got input focus
-|FocusLost| Vim lost input focus
+|FocusGained| Nvim got focus
+|FocusLost| Nvim lost focus
|CursorHold| the user doesn't press a key for a while
|CursorHoldI| the user doesn't press a key for a while in Insert mode
|CursorMoved| the cursor was moved in Normal mode
|CursorMovedI| the cursor was moved in Insert mode
+|WinNew| after creating a new window
|WinEnter| after entering another window
|WinLeave| before leaving a window
|TabEnter| after entering another tab page
@@ -299,6 +319,9 @@ Name triggered by ~
|TabNew| when creating a new tab page
|TabNewEntered| after entering a new tab page
|TabClosed| after closing a tab page
+|CmdlineChanged| after a change was made to the command-line text
+|CmdlineEnter| after entering cmdline mode
+|CmdlineLeave| before leaving cmdline mode
|CmdwinEnter| after entering the command-line window
|CmdwinLeave| before leaving the command-line window
@@ -312,7 +335,11 @@ Name triggered by ~
|TextChanged| after a change was made to the text in Normal mode
|TextChangedI| after a change was made to the text in Insert mode
+ when popup menu is not visible
+|TextChangedP| after a change was made to the text in Insert mode
+ when popup menu visible
+|ColorSchemePre| before loading a color scheme
|ColorScheme| after loading a color scheme
|RemoteReply| a reply from a server Vim was received
@@ -417,8 +444,8 @@ BufUnload Before unloading a buffer. This is when the
NOTE: When this autocommand is executed, the
current buffer "%" may be different from the
buffer being unloaded "<afile>".
- Don't change to another buffer, it will cause
- problems.
+ Don't change to another buffer or window, it
+ will cause problems!
When exiting and v:dying is 2 or more this
event is not triggered.
*BufWinEnter*
@@ -471,6 +498,19 @@ BufWriteCmd Before writing the whole buffer to a file.
*BufWritePost*
BufWritePost After writing the whole buffer to a file
(should undo the commands for BufWritePre).
+ *ChanInfo*
+ChanInfo State of channel changed, for instance the
+ client of a RPC channel described itself.
+ Sets these |v:event| keys:
+ info
+ See |nvim_get_chan_info()| for the format of
+ the info Dictionary.
+ *ChanOpen*
+ChanOpen Just after a channel was opened.
+ Sets these |v:event| keys:
+ info
+ See |nvim_get_chan_info()| for the format of
+ the info Dictionary.
*CmdUndefined*
CmdUndefined When a user command is used but it isn't
defined. Useful for defining a command only
@@ -481,6 +521,31 @@ CmdUndefined When a user command is used but it isn't
command is defined. An alternative is to
always define the user command and have it
invoke an autoloaded function. See |autoload|.
+ *CmdlineChanged*
+CmdlineChanged After a change was made to the text inside
+ command line. Be careful not to mess up the
+ command line, it may cause Vim to lock up.
+ <afile> is set to the |cmdline-char|.
+ *CmdlineEnter*
+CmdlineEnter After entering the command-line (including
+ non-interactive use of ":" in a mapping: use
+ |<Cmd>| instead to avoid this).
+ <afile> is set to the |cmdline-char|.
+ Sets these |v:event| keys:
+ cmdlevel
+ cmdtype
+ *CmdlineLeave*
+CmdlineLeave Before leaving the command-line (including
+ non-interactive use of ":" in a mapping: use
+ |<Cmd>| instead to avoid this).
+ <afile> is set to the |cmdline-char|.
+ Sets these |v:event| keys:
+ abort (mutable)
+ cmdlevel
+ cmdtype
+ Note: `abort` can only be changed from false
+ to true. An autocmd cannot execute an already
+ aborted cmdline by changing it to false.
*CmdwinEnter*
CmdwinEnter After entering the command-line window.
Useful for setting options specifically for
@@ -505,6 +570,10 @@ ColorScheme After loading a color scheme. |:colorscheme|
set, and <amatch> for the new colorscheme
name.
+ *ColorSchemePre*
+ColorSchemePre Before loading a color scheme. |:colorscheme|
+ Useful to setup removing things added by a
+ color scheme, before another one is loaded.
*CompleteDone*
CompleteDone After Insert mode completion is done. Either
@@ -542,6 +611,9 @@ CursorHold When the user doesn't press a key for the time
*CursorHoldI*
CursorHoldI Just like CursorHold, but in Insert mode.
+ Not triggered when waiting for another key,
+ e.g. after CTRL-V, and not when in CTRL-X mode
+ |insert_expand|.
*CursorMoved*
CursorMoved After the cursor was moved in Normal or Visual
@@ -557,9 +629,17 @@ CursorMoved After the cursor was moved in Normal or Visual
CursorMovedI After the cursor was moved in Insert mode.
Not triggered when the popup menu is visible.
Otherwise the same as CursorMoved.
- *EncodingChanged*
-EncodingChanged Fires off after the 'encoding' option has been
- changed. Useful to set up fonts, for example.
+ *DiffUpdated*
+DiffUpdated After diffs have been updated. Depending on
+ what kind of diff is being used (internal or
+ external) this can be triggered on every
+ change or when doing |:diffupdate|.
+ *DirChanged*
+DirChanged After the |current-directory| was changed.
+ Sets these |v:event| keys:
+ cwd: current working directory
+ scope: "global", "tab", "window"
+ Recursion is ignored.
*FileAppendCmd*
FileAppendCmd Before appending to a file. Should do the
appending to the file. Use the '[ and ']
@@ -587,6 +667,14 @@ FileChangedRO Before making the first change to a read-only
*E881*
If the number of lines changes saving for undo
may fail and the change will be aborted.
+ *ExitPre*
+ExitPre When using `:quit`, `:wq` in a way it makes
+ Vim exit, or using `:qall`, just after
+ |QuitPre|. Can be used to close any
+ non-essential window. Exiting may still be
+ cancelled if there is a modified buffer that
+ isn't automatically saved, use |VimLeavePre|
+ for really exiting.
*FileChangedShell*
FileChangedShell When Vim notices that the modification time of
a file has changed since editing started.
@@ -595,7 +683,7 @@ FileChangedShell When Vim notices that the modification time of
|timestamp|
Mostly triggered after executing a shell
command, but also with a |:checktime| command
- or when Gvim regains input focus.
+ or when gvim regains input focus.
This autocommand is triggered for each changed
file. It is not used when 'autoread' is set
and the buffer was not changed. If a
@@ -606,7 +694,7 @@ FileChangedShell When Vim notices that the modification time of
to tell Vim what to do next.
NOTE: When this autocommand is executed, the
current buffer "%" may be different from the
- buffer that was changed "<afile>".
+ buffer that was changed, which is in "<afile>".
NOTE: The commands must not change the current
buffer, jump to another buffer or delete a
buffer. *E246* *E811*
@@ -618,9 +706,6 @@ FileChangedShell When Vim notices that the modification time of
*FileChangedShellPost*
FileChangedShellPost After handling a file that was changed outside
of Vim. Can be used to update the statusline.
- *FileEncoding*
-FileEncoding Obsolete. It still works and is equivalent
- to |EncodingChanged|.
*FileReadCmd*
FileReadCmd Before reading a file with a ":read" command.
Should do the reading of the file. |Cmd-event|
@@ -636,7 +721,8 @@ FileType When the 'filetype' option has been set. The
pattern is matched against the filetype.
<afile> can be used for the name of the file
where this option was set, and <amatch> for
- the new value of 'filetype'.
+ the new value of 'filetype'. Navigating to
+ another window or buffer is not allowed.
See |filetypes|.
*FileWriteCmd*
FileWriteCmd Before writing to a file, when not writing the
@@ -678,14 +764,10 @@ FilterWritePre Before writing a file for a filter command or
filter command.
Not triggered when 'shelltemp' is off.
*FocusGained*
-FocusGained When Vim got input focus. Only for the GUI
- version and a few console versions where this
- can be detected.
+FocusGained Nvim got focus.
*FocusLost*
-FocusLost When Vim lost input focus. Only for the GUI
- version and a few console versions where this
- can be detected. May also happen when a
- dialog pops up.
+FocusLost Nvim lost focus. Also (potentially) when
+ a GUI dialog pops up.
*FuncUndefined*
FuncUndefined When a user function is used but it isn't
defined. Useful for defining a function only
@@ -727,13 +809,12 @@ InsertCharPre When a character is typed in Insert mode,
*TextYankPost*
TextYankPost Just after a |yank| or |deleting| command, but not
if the black hole register |quote_| is used nor
- for |setreg()|. Pattern must be * because its
- meaning may change in the future.
+ for |setreg()|. Pattern must be *.
Sets these |v:event| keys:
- operator
- regcontents
- regname
- regtype
+ operator
+ regcontents
+ regname
+ regtype
Recursion is ignored.
It is not allowed to change the text |textlock|.
*InsertEnter*
@@ -780,6 +861,9 @@ OptionSet After setting an option. The pattern is
plugin. You can always use `:noa` to prevent
triggering this autocommand.
+ When using |:set| in the autocommand the event
+ is not triggered again.
+
*QuickFixCmdPre*
QuickFixCmdPre Before a quickfix command is run (|:make|,
|:lmake|, |:grep|, |:lgrep|, |:grepadd|,
@@ -787,7 +871,9 @@ QuickFixCmdPre Before a quickfix command is run (|:make|,
|:vimgrepadd|, |:lvimgrepadd|, |:cscope|,
|:cfile|, |:cgetfile|, |:caddfile|, |:lfile|,
|:lgetfile|, |:laddfile|, |:helpgrep|,
- |:lhelpgrep|).
+ |:lhelpgrep|, |:cexpr|, |:cgetexpr|,
+ |:caddexpr|, |:cbuffer|, |:cgetbuffer|,
+ |:caddbuffer|).
The pattern is matched against the command
being run. When |:grep| is used but 'grepprg'
is set to "internal" it still matches "grep".
@@ -808,6 +894,7 @@ QuitPre When using `:quit`, `:wq` or `:qall`, before
or quits Vim. Can be used to close any
non-essential window if the current window is
the last ordinary window.
+ Also see |ExitPre|.
*RemoteReply*
RemoteReply When a reply from a Vim that functions as
server was received |server2client()|. The
@@ -846,14 +933,11 @@ SpellFileMissing When trying to load a spell checking file and
language, 'encoding' also matters. See
|spell-SpellFileMissing|.
*StdinReadPost*
-StdinReadPost After reading from the stdin into the buffer,
- before executing the modelines. Only used
- when the "-" argument was used when Vim was
- started |--|.
+StdinReadPost During startup, after reading from stdin into
+ the buffer, before executing modelines. |--|
*StdinReadPre*
-StdinReadPre Before reading from stdin into the buffer.
- Only used when the "-" argument was used when
- Vim was started |--|.
+StdinReadPre During startup, before reading from stdin into
+ the buffer. |--|
*SwapExists*
SwapExists Detected an existing swap file when starting
to edit a file. Only when it is possible to
@@ -878,6 +962,7 @@ SwapExists Detected an existing swap file when starting
It is not allowed to change to another buffer,
change a buffer name or change directory
here.
+ {only available with the +eval feature}
*Syntax*
Syntax When the 'syntax' option has been set. The
pattern is matched against the syntax name.
@@ -893,28 +978,22 @@ TabEnter Just after entering a tab page. |tab-page|
TabLeave Just before leaving a tab page. |tab-page|
A WinLeave event will have been triggered
first.
- {Nvim} *TabNew*
+ *TabNew*
TabNew When creating a new tab page. |tab-page|
After WinEnter and before TabEnter.
- {Nvim} *TabNewEntered*
+ *TabNewEntered*
TabNewEntered After entering a new tab page. |tab-page|
After BufEnter.
- {Nvim} *TabClosed*
+ *TabClosed*
TabClosed After closing a tab page. <afile> can be used
for the tab page number.
- *TermChanged*
-TermChanged After the value of 'term' has changed. Useful
- for re-loading the syntax file to update the
- colors, fonts and other terminal-dependent
- settings. Executed for all loaded buffers.
- {Nvim} *TermClose*
-TermClose When a terminal buffer ends.
- {Nvim} *TermOpen*
-TermOpen When a terminal buffer is starting. This can
- be used to configure the terminal emulator by
- setting buffer variables. |terminal-emulator|
+ *TermClose*
+TermClose When a |terminal| job ends.
+ *TermOpen*
+TermOpen When a |terminal| job is starting. Can be
+ used to configure the terminal buffer.
*TermResponse*
-TermResponse After the response to |t_RV| is received from
+TermResponse After the response to t_RV is received from
the terminal. The value of |v:termresponse|
can be used to do things depending on the
terminal version. Note that this event may be
@@ -935,10 +1014,19 @@ TextChangedI After a change was made to the text in the
current buffer in Insert mode.
Not triggered when the popup menu is visible.
Otherwise the same as TextChanged.
+ *TextChangedP*
+TextChangedP After a change was made to the text in the
+ current buffer in Insert mode, only when the
+ popup menu is visible. Otherwise the same as
+ TextChanged.
*User*
User Never executed automatically. To be used for
autocommands that are only executed with
":doautocmd".
+ Note that when `:doautocmd User MyEvent` is
+ used while there are no matching autocommands,
+ you will get an error. If you don't want
+ that, define a dummy autocommand yourself.
*UserGettingBored*
UserGettingBored When the user presses the same key 42 times.
Just kidding! :-)
@@ -947,13 +1035,21 @@ VimEnter After doing all the startup stuff, including
loading vimrc files, executing the "-c cmd"
arguments, creating all windows and loading
the buffers in them.
- *VimLeave*
+ Just before this event is triggered the
+ |v:vim_did_enter| variable is set, so that you
+ can do: >
+ if v:vim_did_enter
+ call s:init()
+ else
+ au VimEnter * call s:init()
+ endif
+< *VimLeave*
VimLeave Before exiting Vim, just after writing the
.shada file. Executed only once, like
VimLeavePre.
- To detect an abnormal exit use |v:dying|.
- When v:dying is 2 or more this event is not
- triggered.
+< Use |v:dying| to detect an abnormal exit.
+ Use |v:exiting| to get the exit code.
+ Not triggered if |v:dying| is 2 or more.
*VimLeavePre*
VimLeavePre Before exiting Vim, just before writing the
.shada file. This is executed only once,
@@ -961,13 +1057,17 @@ VimLeavePre Before exiting Vim, just before writing the
happens to be the current buffer when exiting.
Mostly useful with a "*" pattern. >
:autocmd VimLeavePre * call CleanupStuff()
-< To detect an abnormal exit use |v:dying|.
- When v:dying is 2 or more this event is not
- triggered.
+< Use |v:dying| to detect an abnormal exit.
+ Use |v:exiting| to get the exit code.
+ Not triggered if |v:dying| is 2 or more.
*VimResized*
VimResized After the Vim window was resized, thus 'lines'
and/or 'columns' changed. Not when starting
up though.
+ *VimResume*
+VimResume After Nvim resumes from |suspend| state.
+ *VimSuspend*
+VimSuspend Before Nvim enters |suspend| state.
*WinEnter*
WinEnter After entering another window. Not done for
the first window, when Vim has just started.
@@ -975,9 +1075,10 @@ WinEnter After entering another window. Not done for
If the window is for another buffer, Vim
executes the BufEnter autocommands after the
WinEnter autocommands.
- Note: When using ":split fname" the WinEnter
- event is triggered after the split but before
- the file "fname" is loaded.
+ Note: For split and tabpage commands the
+ WinEnter event is triggered after the split
+ or tab command but before the file is loaded.
+
*WinLeave*
WinLeave Before leaving a window. If the window to be
entered next is for a different buffer, Vim
@@ -985,6 +1086,11 @@ WinLeave Before leaving a window. If the window to be
WinLeave autocommands (but not for ":new").
Not used for ":qa" or ":q" when exiting Vim.
+ *WinNew*
+WinNew When a new window was created. Not done for
+ the first window, when Vim has just started.
+ Before a WinEnter event.
+
==============================================================================
6. Patterns *autocmd-patterns* *{pat}*
@@ -1066,6 +1172,9 @@ Note that for all systems the '/' character is used for path separator (even
Windows). This was done because the backslash is difficult to use in a pattern
and to make the autocommands portable across different systems.
+It is possible to use |pattern| items, but they may not work as expected,
+because of the translation done for the above.
+
*autocmd-changes*
Matching with the pattern is done when an event is triggered. Changing the
buffer name in one of the autocommands, or even deleting the buffer, does not
@@ -1164,10 +1273,12 @@ name!
different from existing {event} names, as this
most likely will not do what you intended.
- *:augroup-delete* *E367*
+ *:augroup-delete* *E367* *W19* *E936*
:aug[roup]! {name} Delete the autocmd group {name}. Don't use
this if there is still an autocommand using
- this group! This is not checked.
+ this group! You will get a warning if doing
+ it anyway. when the group is the current group
+ you will get error E936.
To enter autocommands for a specific group, use this method:
1. Select the group with ":augroup {name}".
@@ -1222,6 +1333,8 @@ option will not cause any commands to be executed.
argument is present. You probably want to use
<nomodeline> for events that are not used when loading
a buffer, such as |User|.
+ Processing modelines is also skipped when no
+ matching autocommands were executed.
*:doautoa* *:doautoall*
:doautoa[ll] [<nomodeline>] [group] {event} [fname]
@@ -1275,7 +1388,7 @@ Careful: '[ and '] change when using commands that change the buffer.
In commands which expect a file name, you can use "<afile>" for the file name
that is being read |:<afile>| (you can also use "%" for the current file
name). "<abuf>" can be used for the buffer number of the currently effective
-buffer. This also works for buffers that doesn't have a name. But it doesn't
+buffer. This also works for buffers that don't have a name. But it doesn't
work for files without a buffer (e.g., with ":r file").
*gzip-example*
diff --git a/runtime/doc/change.txt b/runtime/doc/change.txt
index 2ccb9188a9..c73b460767 100644
--- a/runtime/doc/change.txt
+++ b/runtime/doc/change.txt
@@ -1,4 +1,4 @@
-*change.txt* For Vim version 7.4. Last change: 2016 Mar 08
+*change.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -9,20 +9,10 @@ changing text means deleting the text and replacing it with other text using
one command. You can undo all of these commands. You can repeat the non-Ex
commands with the "." command.
-1. Deleting text |deleting|
-2. Delete and insert |delete-insert|
-3. Simple changes |simple-change| *changing*
-4. Complex changes |complex-change|
- 4.1 Filter commands |filter|
- 4.2 Substitute |:substitute|
- 4.3 Search and replace |search-replace|
- 4.4 Changing tabs |change-tabs|
-5. Copying and moving text |copy-move|
-6. Formatting text |formatting|
-7. Sorting text |sorting|
-
For inserting text see |insert.txt|.
+ Type |gO| to see the table of contents.
+
==============================================================================
1. Deleting text *deleting* *E470*
@@ -109,7 +99,7 @@ is an error when 'cpoptions' includes the 'E' flag.
J Join [count] lines, with a minimum of two lines.
Remove the indent and insert up to two spaces (see
below). Fails when on the last line of the buffer.
- If [count] is too big it is reduce to the number of
+ If [count] is too big it is reduced to the number of
lines available.
*v_J*
@@ -259,7 +249,7 @@ Or use "caw" (see |aw|).
command is executed.
==============================================================================
-3. Simple changes *simple-change*
+3. Simple changes *simple-change* *changing*
*r*
r{char} Replace the character under the cursor with {char}.
@@ -398,11 +388,6 @@ CTRL-X Subtract [count] from the number or alphabetic
{Visual}CTRL-X Subtract [count] from the number or alphabetic
character in the highlighted text. {not in Vi}
- On MS-Windows, this is mapped to cut Visual text
- |dos-standard-mappings|. If you want to disable the
- mapping, use this: >
- silent! vunmap <C-X>
-<
*v_g_CTRL-X*
{Visual}g CTRL-X Subtract [count] from the number or alphabetic
character in the highlighted text. If several lines
@@ -431,7 +416,7 @@ This depends on the 'nrformats' option:
For decimals a leading negative sign is considered for incrementing or
decrementing, for binary, octal and hex values, it won't be considered. To
-ignore the sign Visually select the number before using CTRL-A or CTRL-X.
+ignore the sign Visually select the number before using CTRL-A or CTRL-X.
For numbers with leading zeros (including all octal and hexadecimal numbers),
Vim preserves the number of characters in the number when possible. CTRL-A on
@@ -516,6 +501,7 @@ If the 'shiftround' option is on, the indent is rounded to a multiple of
If the 'smartindent' option is on, or 'cindent' is on and 'cinkeys' contains
'#' with a zero value, shift right does not affect lines starting with '#'
(these are supposed to be C preprocessor lines that must stay in column 1).
+This can be changed with the 'cino' option, see |cino-#|.
When the 'expandtab' option is off (this is the default) Vim uses <Tab>s as
much as possible to make the indent. You can use ">><<" to replace an indent
@@ -601,8 +587,8 @@ all files in it are deleted. When Vim has the setuid bit set this may cause
problems, the temp file is owned by the setuid user but the filter command
probably runs as the original user.
Directory for temporary files is created in the first suitable directory of:
-For Unix: $TMPDIR, /tmp, current-dir, $HOME.
-For MS-Windows: $TMP, $TEMP, $USERPROFILE, current-dir.
+ Unix: $TMPDIR, /tmp, current-dir, $HOME.
+ Windows: $TMPDIR, $TMP, $TEMP, $USERPROFILE, current-dir.
@@ -614,12 +600,14 @@ For MS-Windows: $TMP, $TEMP, $USERPROFILE, current-dir.
For the {pattern} see |pattern|.
{string} can be a literal string, or something
special; see |sub-replace-special|.
+ *E939*
When [range] and [count] are omitted, replace in the
- current line only.
- When [count] is given, replace in [count] lines,
- starting with the last line in [range]. When [range]
- is omitted start in the current line.
- Also see |cmdline-ranges|.
+ current line only. When [count] is given, replace in
+ [count] lines, starting with the last line in [range].
+ When [range] is omitted start in the current line.
+ [count] must be a positive number. Also see
+ |cmdline-ranges|.
+
See |:s_flags| for [flags].
:[range]s[ubstitute] [flags] [count]
@@ -661,6 +649,7 @@ g& Synonym for `:%s//~/&` (repeat last substitute with
*:s_flags*
The flags that you can use for the substitute commands:
+ *:&&*
[&] Must be the first one: Keep the flags from the previous substitute
command. Examples: >
:&&
@@ -678,6 +667,7 @@ The flags that you can use for the substitute commands:
CTRL-E to scroll the screen up
CTRL-Y to scroll the screen down
+ *:s_e*
[e] When the search pattern fails, do not issue an error message and, in
particular, continue in maps as if no error occurred. This is most
useful to prevent the "No match" error from breaking a mapping. Vim
@@ -688,29 +678,34 @@ The flags that you can use for the substitute commands:
Trailing characters
Interrupted
+ *:s_g*
[g] Replace all occurrences in the line. Without this argument,
replacement occurs only for the first occurrence in each line. If the
'gdefault' option is on, this flag is on by default and the [g]
argument switches it off.
+ *:s_i*
[i] Ignore case for the pattern. The 'ignorecase' and 'smartcase' options
are not used.
+ *:s_I*
[I] Don't ignore case for the pattern. The 'ignorecase' and 'smartcase'
options are not used.
+ *:s_n*
[n] Report the number of matches, do not actually substitute. The [c]
flag is ignored. The matches are reported as if 'report' is zero.
Useful to |count-items|.
If \= |sub-replace-expression| is used, the expression will be
evaluated in the |sandbox| at every match.
-[p] Print the line containing the last substitute.
+[p] Print the line containing the last substitute. *:s_p*
-[#] Like [p] and prepend the line number.
+[#] Like [p] and prepend the line number. *:s_#*
-[l] Like [p] but print the text like |:list|.
+[l] Like [p] but print the text like |:list|. *:s_l*
+ *:s_r*
[r] Only useful in combination with `:&` or `:s` without arguments. `:&r`
works the same way as `:~`: When the search pattern is empty, use the
previously used search pattern instead of the search pattern from the
@@ -813,7 +808,7 @@ Examples: >
:s/abcde/abc^Mde/ modifies "abcde" to "abc", "de" (two lines)
:s/$/\^M/ modifies "abcde" to "abcde^M"
:s/\w\+/\u\0/g modifies "bla bla" to "Bla Bla"
- :s/\w\+/\L\u/g modifies "BLA bla" to "Bla Bla"
+ :s/\w\+/\L\u\0/g modifies "BLA bla" to "Bla Bla"
Note: "\L\u" can be used to capitalize the first letter of a word. This is
not compatible with Vi and older versions of Vim, where the "\u" would cancel
@@ -833,6 +828,7 @@ The numbering of "\1", "\2" etc. is done based on which "\(" comes first in
the pattern (going left to right). When a parentheses group matches several
times, the last one will be used for "\1", "\2", etc. Example: >
:s/\(\(a[a-d] \)*\)/\2/ modifies "aa ab x" to "ab x"
+The "\2" is for "\(a[a-d] \)". At first it matches "aa ", secondly "ab ".
When using parentheses in combination with '|', like in \([ab]\)\|\([cd]\),
either the first or second pattern in parentheses did not match, so either
@@ -873,8 +869,7 @@ Exceptions:
Substitute with an expression *sub-replace-expression*
*sub-replace-\=* *s/\=*
When the substitute string starts with "\=" the remainder is interpreted as an
-expression. This does not work recursively: a |substitute()| function inside
-the expression cannot use "\=" for the substitute string.
+expression.
The special meaning for characters as mentioned at |sub-replace-special| does
not apply except for "<CR>". A <NL> character is used as a line break, you
@@ -1147,7 +1142,7 @@ There are ten types of registers: *registers* *E354*
5. three read-only registers ":, "., "%
6. alternate buffer register "#
7. the expression register "=
-8. The selection and drop registers "*, "+ and "~
+8. The selection registers "* and "+
9. The black hole register "_
10. Last search pattern register "/
@@ -1164,7 +1159,7 @@ which does not specify a register. Additionally you can access it with the
name '"'. This means you have to type two double quotes. Writing to the ""
register writes to register "0.
-2. Numbered registers "0 to "9 *quote_number* *quote0* *quote1*
+2. Numbered registers "0 to "9 *quote_number* *quote0* *quote1*
*quote2* *quote3* *quote4* *quote9*
Vim fills these registers with text from yank and delete commands.
Numbered register 0 contains the text from the most recent yank command,
@@ -1248,7 +1243,7 @@ If the "= register is used for the "p" command, the String is split up at <NL>
characters. If the String ends in a <NL>, it is regarded as a linewise
register.
-8. Selection and drop registers "*, "+ and "~
+8. Selection registers "* and "+
Use these registers for storing and retrieving the selected text for the GUI.
See |quotestar| and |quoteplus|. When the clipboard is not available or not
working, the unnamed register is used instead. For Unix systems and Mac OS X,
@@ -1383,6 +1378,55 @@ to the name of an external program for Vim to use for text formatting. The
'textwidth' and other options have no effect on formatting by an external
program.
+ *format-formatexpr*
+The 'formatexpr' option can be set to a Vim script function that performs
+reformatting of the buffer. This should usually happen in an |ftplugin|,
+since formatting is highly dependent on the type of file. It makes
+sense to use an |autoload| script, so the corresponding script is only loaded
+when actually needed and the script should be called <filetype>format.vim.
+
+For example, the XML filetype plugin distributed with Vim in the $VIMRUNTIME
+directory, sets the 'formatexpr' option to: >
+
+ setlocal formatexpr=xmlformat#Format()
+
+That means, you will find the corresponding script, defining the
+xmlformat#Format() function, in the directory:
+`$VIMRUNTIME/autoload/xmlformat.vim`
+
+Here is an example script that removes trailing whitespace from the selected
+text. Put it in your autoload directory, e.g. ~/.vim/autoload/format.vim: >
+
+ func! format#Format()
+ " only reformat on explicit gq command
+ if mode() != 'n'
+ " fall back to Vims internal reformatting
+ return 1
+ endif
+ let lines = getline(v:lnum, v:lnum + v:count - 1)
+ call map(lines, {key, val -> substitute(val, '\s\+$', '', 'g')})
+ call setline('.', lines)
+
+ " do not run internal formatter!
+ return 0
+ endfunc
+
+You can then enable the formatting by executing: >
+ setlocal formatexpr=format#Format()
+
+Note: this function explicitly returns non-zero when called from insert mode
+(which basically means, text is inserted beyond the 'textwidth' limit). This
+causes Vim to fall back to reformat the text by using the internal formatter.
+
+However, if the |gq| command is used to reformat the text, the function
+will receive the selected lines, trim trailing whitespace from those lines and
+put them back in place. If you are going to split single lines into multiple
+lines, be careful not to overwrite anything.
+
+If you want to allow reformatting of text from insert or replace mode, one has
+to be very careful, because the function might be called recursively. For
+debugging it helps to set the 'debug' option.
+
*right-justify*
There is no command in Vim to right justify text. You can do it with
an external command, like "par" (e.g.: "!}par" to format until the end of the
@@ -1765,4 +1809,4 @@ The sorting can be interrupted, but if you interrupt it too late in the
process you may end up with duplicated lines. This also depends on the system
library function used.
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/channel.txt b/runtime/doc/channel.txt
new file mode 100644
index 0000000000..be3efb371f
--- /dev/null
+++ b/runtime/doc/channel.txt
@@ -0,0 +1,174 @@
+*channel.txt* Nvim
+
+
+ NVIM REFERENCE MANUAL by Thiago de Arruda
+
+
+Nvim asynchronous IO *channel*
+
+ Type |gO| to see the table of contents.
+
+==============================================================================
+1. Introduction *channel-intro*
+
+Channels are nvim's way of communicating with external processes.
+
+There are several ways to open a channel:
+
+ 1. Through stdin/stdout when `nvim` is started with `--headless`, and a startup
+ script or --cmd command opens the stdio channel using |stdioopen()|.
+
+ 2. Through stdin, stdout and stderr of a process spawned by |jobstart()|.
+
+ 3. Through the PTY master end of a PTY opened with
+ `jobstart(..., {'pty': v:true})` or |termopen()|.
+
+ 4. By connecting to a TCP/IP socket or named pipe with |sockconnect()|.
+
+ 5. By another process connecting to a socket listened to by nvim. This only
+ supports RPC channels, see |rpc-connecting|.
+
+Channels support multiple modes or protocols. In the most basic
+mode of operation, raw bytes are read and written to the channel.
+The |rpc| protocol, based on the msgpack-rpc standard, enables nvim and the
+process at the other end to send remote calls and events to each other.
+The builtin |terminal-emulator| is also implemented on top of PTY channels.
+
+Channel Id *channel-id*
+
+Each channel is identified by an integer id, unique for the life of the
+current Nvim session. Functions like |stdioopen()| return channel ids;
+functions like |chansend()| consume channel ids.
+
+==============================================================================
+2. Reading and writing raw bytes *channel-bytes*
+
+By default, channels opened by vimscript functions will operate with raw
+bytes. Additionally, for a job channel using rpc, bytes can still be
+read over its stderr. Similarily, only bytes can be written to nvim's own stderr.
+
+ *channel-callback* *buffered*
+ *E5210* *on_stdout* *on_stderr* *on_stdin* *on_data*
+It is possible to register callback functions when a channel receives data by
+passing the `on_stdout`, `on_stderr`, `on_stdin` options on creation. Sockets
+may specify an `on_data` callback instead. Each callback function will be
+invoked with data read from the channel. By default, the callback will be
+invoked immediately when data is available, to facilitate interactive
+communication. The same callback will then be invoked with empty data, to
+indicate that the stream reached EOF. Alternatively the `stdout_buffered`,
+`stderr_buffered`, `stdin_buffered`, `data_buffered` options can be set to
+invoke the corresponding callback only when the underlying stream reaches EOF.
+The callback will then be passed complete output. This is helpful when only
+the complete output is useful, and not partial data. Futhermore if the stream
+is set to be buffered, but the callback is not set, the data is saved in the
+options dict, with the stream name as key. For this to work a new options dict
+must be used for each opened channel. If a script uses a global `s:job_opts`
+dict, it can be copied with |copy()| before supplying it to |jobstart()|. If a
+dict is reused, so that the dict key already is occupied, error `E5210` will
+be raised.
+
+- The arguments passed to the callback function are:
+
+ 0: |channel-id|
+ 1: Raw data read from the channel, formatted as a |readfile()|-style
+ list. If EOF occured, a single empty string `['']` will be passed in.
+ Note that the items in this list do not directly correspond to actual
+ lines in the output. See |channel-lines|
+ 2: Stream name as a string, like `"stdout"`. This is to allow multiple
+ stream handlers to be implemented by the same function. The available
+ events depend on how the channel was opened and in what mode/protocol.
+
+ *channel-lines*
+ Note:
+ stream event handlers may receive partial (incomplete) lines. For a given
+ invocation of on_stdout etc, `a:data` is not guaranteed to end
+ with a newline.
+ - `abcdefg` may arrive as `['abc']`, `['defg']`.
+ - `abc\nefg` may arrive as `['abc', '']`, `['efg']` or `['abc']`,
+ `['','efg']`, or even `['ab']`, `['c','efg']`.
+
+ If you only are interested in complete output when the process exits,
+ use buffered mode. Otherwise, an easy way to deal with this:
+ initialize a list as `['']`, then append to it as follows: >
+ let s:chunks = ['']
+ func! s:on_event(job_id, data, event) dict
+ let s:chunks[-1] .= a:data[0]
+ call extend(s:chunks, a:data[1:])
+ endf
+<
+
+Additionally, if the callbacks are Dictionary functions, |self| can be used to
+refer to the options dictionary containing the callbacks. |Partial|s can also be
+used as callbacks.
+
+Data can be sent to the channel using the |chansend()| function. Here is a
+simple example, echoing some data through a cat-process:
+>
+ function! s:OnEvent(id, data, event) dict
+ let str = join(a:data, "\n")
+ echomsg str
+ endfunction
+ let id = jobstart(['cat'], {'on_stdout': function('s:OnEvent') } )
+ call chansend(id, "hello!")
+<
+
+Here is a example of setting a buffer to the result of grep, but only after
+all data has been processed:
+>
+ function! s:OnEvent(id, data, event) dict
+ call nvim_buf_set_lines(2, 0, -1, v:true, a:data)
+ endfunction
+ let id = jobstart(['grep', '^[0-9]'], { 'on_stdout': function('s:OnEvent'),
+ \ 'stdout_buffered':v:true } )
+
+ call chansend(id, "stuff\n10 PRINT \"NVIM\"\nxx")
+ " no output is received, buffer is empty
+
+ call chansend(id, "xx\n20 GOTO 10\nzz\n")
+ call chanclose(id, 'stdin')
+ " now buffer has result
+<
+For additional examples with jobs, see |job-control|.
+
+ *channel-pty*
+Special case: PTY channels opened with `jobstart(..., {'pty': v:true})` do not
+preprocess ANSI escape sequences, these will be sent raw to the callback.
+However, change of PTY size can be signaled to the slave using |jobresize()|.
+See also |terminal-emulator|.
+
+Terminal characteristics (termios) for |:terminal| and PTY channels are copied
+from the host TTY, or if Nvim is |--headless| it uses default values: >
+ :echo system('nvim --headless +"te stty -a" +"sleep 1" +"1,/^$/print" +q')
+
+==============================================================================
+3. Communicating using msgpack-rpc *channel-rpc*
+
+When channels are opened with the `rpc` option set to true, the channel can be
+used for remote method calls in both directions, see |msgpack-rpc|. Note that
+rpc channels are implicitly trusted and the process at the other end can
+invoke any |api| function!
+
+==============================================================================
+4. Standard IO channel *channel-stdio*
+
+Nvim uses stdin/stdout to interact with the user over the terminal interface
+(TUI). If Nvim is |--headless| the TUI is not started and stdin/stdout can be
+used as a channel. See also |--embed|.
+
+Call |stdioopen()| during |startup| to open the stdio channel as |channel-id| 1.
+Nvim's stderr is always available as |v:stderr|, a write-only bytes channel.
+
+Example: >
+ func! OnEvent(id, data, event)
+ if a:data == [""]
+ quit
+ end
+ call chansend(a:id, map(a:data, {i,v -> toupper(v)}))
+ endfunc
+ call stdioopen({'on_stdin': 'OnEvent'})
+<
+Put this in `uppercase.vim` and run: >
+ nvim --headless --cmd "source uppercase.vim"
+
+==============================================================================
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/cmdline.txt b/runtime/doc/cmdline.txt
index a123ea711b..3f22fcb504 100644
--- a/runtime/doc/cmdline.txt
+++ b/runtime/doc/cmdline.txt
@@ -1,11 +1,11 @@
-*cmdline.txt* For Vim version 7.4. Last change: 2015 Dec 17
+*cmdline.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
- *Cmdline-mode* *Command-line-mode*
-Command-line mode *Cmdline* *Command-line* *mode-cmdline* *:*
+ *Cmdline-mode* *Command-line-mode* *Cmdline*
+Command-line mode *cmdline* *Command-line* *mode-cmdline* *:*
Command-line mode is used to enter Ex commands (":"), search patterns
("/" and "?"), and filter commands ("!").
@@ -13,13 +13,7 @@ Command-line mode is used to enter Ex commands (":"), search patterns
Basic command line editing is explained in chapter 20 of the user manual
|usr_20.txt|.
-1. Command-line editing |cmdline-editing|
-2. Command-line completion |cmdline-completion|
-3. Ex command-lines |cmdline-lines|
-4. Ex command-line ranges |cmdline-ranges|
-5. Ex command-line flags |ex-flags|
-6. Ex special characters |cmdline-special|
-7. Command-line window |cmdline-window|
+ Type |gO| to see the table of contents.
==============================================================================
1. Command-line editing *cmdline-editing*
@@ -169,12 +163,14 @@ CTRL-R CTRL-F *c_CTRL-R_CTRL-F* *c_<C-R>_<C-F>*
CTRL-R CTRL-P *c_CTRL-R_CTRL-P* *c_<C-R>_<C-P>*
CTRL-R CTRL-W *c_CTRL-R_CTRL-W* *c_<C-R>_<C-W>*
CTRL-R CTRL-A *c_CTRL-R_CTRL-A* *c_<C-R>_<C-A>*
+CTRL-R CTRL-L *c_CTRL-R_CTRL-L* *c_<C-R>_<C-L>*
Insert the object under the cursor:
CTRL-F the Filename under the cursor
CTRL-P the Filename under the cursor, expanded with
'path' as in |gf|
CTRL-W the Word under the cursor
CTRL-A the WORD under the cursor; see |WORD|
+ CTRL-L the line under the cursor
When 'incsearch' is set the cursor position at the end of the
currently displayed match is used. With CTRL-W the part of
@@ -182,8 +178,8 @@ CTRL-R CTRL-A *c_CTRL-R_CTRL-A* *c_<C-R>_<C-A>*
*c_CTRL-R_CTRL-R* *c_<C-R>_<C-R>*
*c_CTRL-R_CTRL-O* *c_<C-R>_<C-O>*
-CTRL-R CTRL-R {0-9a-z"%#:-=. CTRL-F CTRL-P CTRL-W CTRL-A}
-CTRL-R CTRL-O {0-9a-z"%#:-=. CTRL-F CTRL-P CTRL-W CTRL-A}
+CTRL-R CTRL-R {0-9a-z"%#:-=. CTRL-F CTRL-P CTRL-W CTRL-A CTRL-L}
+CTRL-R CTRL-O {0-9a-z"%#:-=. CTRL-F CTRL-P CTRL-W CTRL-A CTRL-L}
Insert register or object under the cursor. Works like
|c_CTRL-R| but inserts the text literally. For example, if
register a contains "xy^Hz" (where ^H is a backspace),
@@ -216,12 +212,13 @@ CTRL-\ e {expr} *c_CTRL-\_e*
*c_CTRL-Y*
CTRL-Y When there is a modeless selection, copy the selection into
- the clipboard. |modeless-selection|
+ the clipboard.
If there is no selection CTRL-Y is inserted as a character.
-CTRL-J *c_CTRL-J* *c_<NL>* *c_<CR>* *c_CR*
+CTRL-M or CTRL-J *c_CTRL-M* *c_CTRL-J* *c_<NL>* *c_<CR>* *c_CR*
<CR> or <NL> start entered command
- *c_<Esc>* *c_Esc*
+
+CTRL-[ *c_CTRL-[* *c_<Esc>* *c_Esc*
<Esc> When typed and 'x' not present in 'cpoptions', quit
Command-line mode without executing. In macros or when 'x'
present in 'cpoptions', start entered command.
@@ -332,8 +329,11 @@ terminals)
List entries 6 to 12 from the search history: >
:history / 6,12
<
- List the recent five entries from all histories: >
- :history all -5,
+ List the penultimate entry from all histories: >
+ :history all -2
+<
+ List the most recent two entries from all histories: >
+ :history all -2,
:keepp[atterns] {command} *:keepp* *:keeppatterns*
Execute {command}, without adding anything to the search
@@ -363,7 +363,7 @@ These are the commands that can be used:
*c_CTRL-D*
CTRL-D List names that match the pattern in front of the cursor.
When showing file names, directories are highlighted (see
- 'highlight' option). Names where 'suffixes' matches are moved
+ |highlight-groups|). Names where 'suffixes' matches are moved
to the end.
The 'wildoptions' option can be set to "tagfile" to list the
file of matching tags.
@@ -378,13 +378,16 @@ CTRL-D List names that match the pattern in front of the cursor.
match is inserted. After the last match, the first is used
again (wrap around).
The behavior can be changed with the 'wildmode' option.
+ *c_<S-Tab>*
+<S-Tab> Like 'wildchar' or <Tab>, but begin with the last match and
+ then go to the previous match.
*c_CTRL-N*
CTRL-N After using 'wildchar' which got multiple matches, go to next
match. Otherwise recall more recent command-line from history.
-<S-Tab> *c_CTRL-P* *c_<S-Tab>*
+ *c_CTRL-P*
CTRL-P After using 'wildchar' which got multiple matches, go to
previous match. Otherwise recall older command-line from
- history. <S-Tab> only works with the GUI.
+ history.
*c_CTRL-A*
CTRL-A All names that match the pattern in front of the cursor are
inserted.
@@ -394,12 +397,26 @@ CTRL-L A match is done on the pattern in front of the cursor. If
If there are multiple matches the longest common part is
inserted in place of the pattern. If the result is shorter
than the pattern, no completion is done.
+ */_CTRL-L*
When 'incsearch' is set, entering a search pattern for "/" or
"?" and the current match is displayed then CTRL-L will add
one character from the end of the current match. If
'ignorecase' and 'smartcase' are set and the command line has
no uppercase characters, the added character is converted to
lowercase.
+ *c_CTRL-G* */_CTRL-G*
+CTRL-G When 'incsearch' is set, entering a search pattern for "/" or
+ "?" and the current match is displayed then CTRL-G will move
+ to the next match (does not take |search-offset| into account)
+ Use CTRL-T to move to the previous match. Hint: on a regular
+ keyboard T is above G.
+ *c_CTRL-T* */_CTRL-T*
+CTRL-T When 'incsearch' is set, entering a search pattern for "/" or
+ "?" and the current match is displayed then CTRL-T will move
+ to the previous match (does not take |search-offset| into
+ account).
+ Use CTRL-G to move to the next match. Hint: on a regular
+ keyboard T is above G.
The 'wildchar' option defaults to <Tab> (CTRL-E when in Vi compatible mode; in
a previous version <Esc> was used). In the pattern standard wildcards '*' and
@@ -408,6 +425,9 @@ matches exactly one character.
The 'wildignorecase' option can be set to ignore case in filenames.
+The 'wildmenu' option can be set to show the matches just above the command
+line.
+
If you like tcsh's autolist completion, you can use this mapping:
:cnoremap X <C-L><C-D>
(Where X is the command key to use, <C-L> is CTRL-L and <C-D> is CTRL-D)
@@ -475,8 +495,46 @@ after a command causes the rest of the line to be ignored. This can be used
to add comments. Example: >
:set ai "set 'autoindent' option
It is not possible to add a comment to a shell command ":!cmd" or to the
-":map" command and a few others, because they see the '"' as part of their
-argument. This is mentioned where the command is explained.
+":map" command and a few others (mainly commands that expect expressions)
+that see the '"' as part of their argument:
+
+ :argdo
+ :autocmd
+ :bufdo
+ :cexpr (and the like)
+ :call
+ :cdo (and the like)
+ :command
+ :cscope (and the like)
+ :debug
+ :display
+ :echo (and the like)
+ :elseif
+ :execute
+ :folddoopen
+ :folddoclosed
+ :for
+ :grep (and the like)
+ :help (and the like)
+ :if
+ :let
+ :make
+ :map (and the like including :abbrev commands)
+ :menu (and the like)
+ :mkspell
+ :normal
+ :ownsyntax
+ :popup
+ :promptfind (and the like)
+ :registers
+ :return
+ :sort
+ :syntax
+ :tabdo
+ :tearoff
+ :vimgrep (and the like)
+ :while
+ :windo
*:bar* *:\bar*
'|' can be used to separate commands, so you can give multiple commands in one
@@ -766,14 +824,21 @@ Also see |`=|.
*:<cword>* *:<cWORD>* *:<cfile>* *<cfile>*
*:<sfile>* *<sfile>* *:<afile>* *<afile>*
*:<abuf>* *<abuf>* *:<amatch>* *<amatch>*
+ *:<cexpr>* *<cexpr>*
*<slnum>* *E495* *E496* *E497* *E499* *E500*
Note: these are typed literally, they are not special keys!
<cword> is replaced with the word under the cursor (like |star|)
<cWORD> is replaced with the WORD under the cursor (see |WORD|)
+ <cexpr> is replaced with the word under the cursor, including more
+ to form a C expression. E.g., when the cursor is on "arg"
+ of "ptr->arg" then the result is "ptr->arg"; when the
+ cursor is on "]" of "list[idx]" then the result is
+ "list[idx]". This is used for |v:beval_text|.
<cfile> is replaced with the path name under the cursor (like what
|gf| uses)
<afile> When executing autocommands, is replaced with the file name
- for a file read or write.
+ of the buffer being manipulated, or the file for a read or
+ write.
<abuf> When executing autocommands, is replaced with the currently
effective buffer number (for ":r file" and ":so file" it is
the current buffer, the file being read/sourced is not in a
@@ -817,7 +882,8 @@ These modifiers can be given, in this order:
directory.
:. Reduce file name to be relative to current directory, if
possible. File name is unmodified if it is not below the
- current directory.
+ current directory, but on MS-Windows the drive is removed if
+ it is the current drive.
For maximum shortness, use ":~:.".
:h Head of the file name (the last component and any separators
removed). Cannot be used with :e, :r or :t.
@@ -999,10 +1065,10 @@ There are several ways to leave the command-line window:
Insert and in Normal mode.
CTRL-C Continue in Command-line mode. The command-line under the
cursor is used as the command-line. Works both in Insert and
- in Normal mode. ":close" also works. There is no redraw,
- thus the window will remain visible.
+ in Normal mode. There is no redraw, thus the window will
+ remain visible.
:quit Discard the command line and go back to Normal mode.
- ":exit", ":xit" and CTRL-\ CTRL-N also work.
+ ":close", ":exit", ":xit" and CTRL-\ CTRL-N also work.
:qall Quit Vim, unless there are changes in some buffer.
:qall! Quit Vim, discarding changes to any buffer.
@@ -1071,7 +1137,7 @@ Another example: >
:au CmdwinEnter [/?] startinsert
This will make Vim start in Insert mode in the command-line window.
- *cmdwin-char*
+ *cmdline-char* *cmdwin-char*
The character used for the pattern indicates the type of command-line:
: normal Ex command
> debug mode command |debug-mode|
@@ -1081,4 +1147,4 @@ The character used for the pattern indicates the type of command-line:
@ string for |input()|
- text for |:insert| or |:append|
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/debug.txt b/runtime/doc/debug.txt
index f03116ffed..835b35b388 100644
--- a/runtime/doc/debug.txt
+++ b/runtime/doc/debug.txt
@@ -1,4 +1,4 @@
-*debug.txt* For Vim version 7.4. Last change: 2012 Feb 11
+*debug.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -9,9 +9,7 @@ Debugging Vim *debug-vim*
This is for debugging Vim itself, when it doesn't work properly.
For debugging Vim scripts, functions, etc. see |debug-scripts|
-1. Location of a crash, using gcc and gdb |debug-gcc|
-2. Locating memory leaks |debug-leaks|
-3. Windows Bug Reporting |debug-win32|
+ Type |gO| to see the table of contents.
==============================================================================
@@ -164,12 +162,8 @@ In WinDbg: choose Open Crash Dump on the File menu. Follow the instructions in
*get-ms-debuggers*
3.5 Obtaining Microsoft Debugging Tools ~
-The Debugging Tools for Windows (including WinDbg) can be downloaded from
- http://www.microsoft.com/whdc/devtools/debugging/default.mspx
-This includes the WinDbg debugger.
-
-Visual C++ 2005 Express Edition can be downloaded for free from:
- http://msdn.microsoft.com/vstudio/express/visualC/default.aspx
+Visual Studio 2017 Community Edition can be downloaded for free from:
+ https://visualstudio.microsoft.com/downloads/
=========================================================================
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/deprecated.txt b/runtime/doc/deprecated.txt
new file mode 100644
index 0000000000..4369ad7894
--- /dev/null
+++ b/runtime/doc/deprecated.txt
@@ -0,0 +1,70 @@
+*deprecated.txt* Nvim
+
+
+ NVIM REFERENCE MANUAL
+
+
+Nvim *deprecated*
+
+The items listed below are "deprecated". This means they will be removed in
+the future. They should not be used in new scripts, and old scripts should be
+updated.
+
+==============================================================================
+
+Commands ~
+*:rv*
+*:rviminfo* Deprecated alias to |:rshada| command.
+*:wv*
+*:wviminfo* Deprecated alias to |:wshada| command.
+
+Environment Variables ~
+*$NVIM_LISTEN_ADDRESS* Deprecated in favor of |--listen|. If both are given,
+ $NVIM_LISTEN_ADDRESS is ignored.
+
+Events ~
+*EncodingChanged* Never fired; 'encoding' is always "utf-8".
+*FileEncoding* Never fired; equivalent to |EncodingChanged|.
+
+Keycodes ~
+*<MouseDown>* Use <ScrollWheelUp> instead.
+*<MouseUp>* Use <ScrollWheelDown> instead.
+
+Functions ~
+*buffer_exists()* Obsolete name for |bufexists()|.
+*buffer_name()* Obsolete name for |bufname()|.
+*buffer_number()* Obsolete name for |bufnr()|.
+*file_readable()* Obsolete name for |filereadable()|.
+*highlight_exists()* Obsolete name for |hlexists()|.
+*highlightID()* Obsolete name for |hlID()|.
+*inputdialog()* Use |input()| instead.
+*jobclose()* Obsolete name for |chanclose()|
+*jobsend()* Obsolete name for |chansend()|
+*last_buffer_nr()* Obsolete name for bufnr("$").
+
+Modifiers ~
+*cpo-<*
+*:menu-<special>*
+*:menu-special* <> notation is always enabled.
+*:map-<special>*
+*:map-special* <> notation is always enabled.
+
+Normal commands ~
+*]f*
+*[f* Same as "gf".
+
+Options ~
+*'cscopeverbose'* Enabled by default. Use |:silent| instead.
+'gd'
+'gdefault' Enables the |:substitute| flag 'g' by default.
+*'fe'* 'fenc'+'enc' before Vim 6.0; no longer used.
+*'highlight'* *'hl'* Names of builtin |highlight-groups| cannot be changed.
+*'langnoremap'* Deprecated alias to 'nolangremap'.
+*'vi'*
+*'viminfo'* Deprecated alias to 'shada' option.
+
+Variables~
+*b:terminal_job_pid* PID of the top-level process in a |:terminal|.
+ Use `jobpid(&channel)` instead.
+
+ vim:noet:tw=78:ts=8:ft=help:norl:
diff --git a/runtime/doc/develop.txt b/runtime/doc/develop.txt
index 6ecbf9fb0d..e244072c66 100644
--- a/runtime/doc/develop.txt
+++ b/runtime/doc/develop.txt
@@ -1,88 +1,54 @@
-*develop.txt*
+*develop.txt* Nvim
NVIM REFERENCE MANUAL
-Development of Nvim. *development*
+Development of Nvim *development*
-1. Design goals |design-goals|
-2. Design decisions |design-decisions|
+This reference describes design constraints and guidelines, for developing
+Nvim applications or Nvim itself.
+Architecture and internal concepts are covered in src/nvim/README.md
-Nvim is open source software. Everybody is encouraged to contribute.
+Nvim is free and open source. Everybody is encouraged to contribute.
https://github.com/neovim/neovim/blob/master/CONTRIBUTING.md
-See src/nvim/README.md for a high-level overview of the source code:
- https://github.com/neovim/neovim/blob/master/src/nvim/README.md
+ Type |gO| to see the table of contents.
==============================================================================
-1. Design goals *design-goals*
+Design goals *design-goals*
-Most important things come first (roughly).
-
-Note that quite a few items are contradicting. This is intentional. A
-balance must be found between them.
+Most important things come first (roughly). Some items conflict; this is
+intentional. A balance must be found.
NVIM IS... IMPROVED *design-improved*
-The IMproved bits of Vim should make it a better Vi, without becoming a
-completely different editor. Extensions are done with a "Vi spirit".
-- Use the keyboard as much as feasible. The mouse requires a third hand,
- which we don't have. Many terminals don't have a mouse.
-- When the mouse is used anyway, avoid the need to switch back to the
- keyboard. Avoid mixing mouse and keyboard handling.
-- Add commands and options in a consistent way. Otherwise people will have a
- hard time finding and remembering them. Keep in mind that more commands and
- options will be added later.
+The Neo bits of Nvim should make it a better Vim, without becoming a
+completely different editor.
+- In matters of taste, prefer Vim/Unix tradition. If there is no relevant
+ Vim/Unix tradition, consider the "common case".
- A feature that people do not know about is a useless feature. Don't add
obscure features, or at least add hints in documentation that they exist.
-- Minimize using CTRL and other modifiers, they are more difficult to type.
-- There are many first-time and inexperienced Vim users. Make it easy for
- them to start using Vim and learn more over time.
- There is no limit to the features that can be added. Selecting new features
- is one based on (1) what users ask for, (2) how much effort it takes to
+ is based on (1) what users ask for, (2) how much effort it takes to
implement and (3) someone actually implementing it.
-
-
-NVIM IS... MULTI PLATFORM *design-multi-platform*
-
-Vim tries to help as many users on as many platforms as possible.
-- Support many kinds of terminals. The minimal demands are cursor positioning
- and clear-screen. Commands should only use key strokes that most keyboards
- have. Support all the keys on the keyboard for mapping.
-- Support many platforms. A condition is that there is someone willing to do
- Vim development on that platform, and it doesn't mean messing up the code.
-- Support many compilers and libraries. Not everybody is able or allowed to
- install another compiler or GUI library.
-- People switch from one platform to another, and from GUI to terminal
- version. Features should be present in all versions, or at least in as many
- as possible with a reasonable effort. Try to avoid that users must switch
- between platforms to accomplish their work efficiently.
-- That a feature is not possible on some platforms, or only possible on one
- platform, does not mean it cannot be implemented. [This intentionally
- contradicts the previous item, these two must be balanced.]
+- Backwards compatibility is a feature. The RPC API in particular should
+ never break.
NVIM IS... WELL DOCUMENTED *design-documented*
- A feature that isn't documented is a useless feature. A patch for a new
feature must include the documentation.
-- Documentation should be comprehensive and understandable. Using examples is
- recommended.
+- Documentation should be comprehensive and understandable. Use examples.
- Don't make the text unnecessarily long. Less documentation means that an
item is easier to find.
-- Do not prefix doc-tags with "nvim-". Use |vim_diff.txt| to document
- differences from Vim. The {Nvim} annotation is also available
- to mark a specific feature. No other distinction is necessary.
-- If a feature is removed, delete its doc entry and move its tag to
- |vim_diff.txt|.
NVIM IS... HIGH SPEED AND SMALL IN SIZE *design-speed-size*
-Using Vim must not be a big attack on system resources. Keep it small and
-fast.
+Keep Nvim small and fast.
- Computers are becoming faster and bigger each year. Vim can grow too, but
no faster than computers are growing. Keep Vim usable on older systems.
- Many users start Vim from a shell very often. Startup time must be short.
@@ -105,47 +71,18 @@ NVIM IS... MAINTAINABLE *design-maintain*
knowledge spread to other parts of the code.
-NVIM IS... FLEXIBLE *design-flexible*
-
-Vim should make it easy for users to work in their preferred styles rather
-than coercing its users into particular patterns of work. This can be for
-items with a large impact or for details. The defaults are carefully chosen
-such that most users will enjoy using Vim as it is. Commands and options can
-be used to adjust Vim to the desire of the user and its environment.
-
-
NVIM IS... NOT *design-not*
Nvim is not an operating system; instead it should be composed with other
tools or hosted as a component. Marvim once said: "Unlike Emacs, Nvim does not
-include the kitchen sink... but you can use it for plumbing."
+include the kitchen sink... but it's good for plumbing."
==============================================================================
-2. Design decisions *design-decisions*
-
-Jargon *dev-jargon*
-
-Host ~
-A plugin "host" is both a client (of the Nvim API) and a server (of an
-external platform, e.g. python). It is a remote plugin that hosts other
-plugins.
+Developer guidelines *dev*
-Window ~
-The word "window" is commonly used for several things: A window on the screen,
-the xterm window, a window inside Vim to view a buffer.
-To avoid confusion, other items that are sometimes called window have been
-given another name. Here is an overview of the related items:
-screen The whole display. For the GUI it's something like 1024x768
- pixels. The Vim shell can use the whole screen or part of it.
-shell The Vim application. This can cover the whole screen (e.g.,
- when running in a console) or part of it (xterm or GUI).
-window View on a buffer. There can be several windows in Vim,
- together with the command line, menubar, toolbar, etc. they
- fit in the shell.
-
-Providers *dev-provider*
+PROVIDERS *dev-provider*
A goal of Nvim is to allow extension of the editor without special knowledge
in the core. But some Vim components are too tightly coupled; in those cases
@@ -188,9 +125,119 @@ defined if a valid external Python host is found. That works well with the
Python host isn't installed then the plugin will "think" it is running in
a Vim compiled without the |+python| feature.
+DOCUMENTATION *dev-doc*
+
+- Do not prefix help tags with "nvim-". Use |vim_diff.txt| to document
+ differences from Vim; no other distinction is necessary.
+- If a Vim feature is removed, delete its help section and move its tag to
+ |vim_diff.txt|.
+- Move deprecated features to |deprecated.txt|.
+- Use consistent language.
+ - "terminal" in a help tag always means "the embedded terminal emulator", not
+ "the user host terminal".
+ - Use "tui-" to prefix help tags related to the host terminal, and "TUI"
+ in prose if possible.
+- Docstrings: do not start parameter descriptions with "The" or "A" unless it
+ is critical to avoid ambiguity.
+ GOOD: >
+ /// @param dirname Path fragment before `pend`
+< BAD: >
+ /// @param dirname The path fragment before `pend`
+<
+
+API *dev-api*
+
+Use this template to name new API functions:
+ nvim_{thing}_{action}_{arbitrary-qualifiers}
+
+If the function acts on an object then {thing} is the name of that object
+(e.g. "buf" or "win"). If the function operates in a "global" context then
+{thing} is usually omitted (but consider "namespacing" your global operations
+with a {thing} that groups functions under a common concept).
+
+Use existing common {action} names if possible:
+ add Append to, or insert into, a collection
+ get Get a thing (or subset of things by some query)
+ set Set a thing
+ del Delete a thing (or group of things)
+ list Get all things
+
+Use consistent names for {thing} in all API functions. E.g. a buffer is called
+"buf" everywhere, not "buffer" in some places and "buf" in others.
+
+Example: `nvim_get_current_line` acts on the global editor state; the common
+{action} "get" is used but {thing} is omitted.
+
+Example: `nvim_buf_add_highlight` acts on a `Buffer` object (the first
+parameter) and uses the common {action} "add".
+
+Example: `nvim_list_bufs` operates in a global context (first parameter is
+_not_ a Buffer). The common {action} "list" indicates that it lists all
+bufs (plural) in the global context.
+
+Use this template to name new API events:
+ nvim_{thing}_{event}_event
+
+Example: `nvim_buf_changedtick_event`.
+
+
+API-CLIENT *dev-api-client*
+
+Standard Features ~
+
+- Clients should call |nvim_set_client_info()| after connecting, so users and
+ plugins can detect the client by handling the |ChanInfo| event. This
+ avoids the need for special variables or other client hints.
+- Clients should handle |nvim_error_event| notifications, which will be sent
+ if an async request to nvim was rejected or caused an error.
+
+Package Naming ~
+
+API client packages should NOT be named something ambiguous like "neovim" or
+"python-client". Use "nvim" as a prefix/suffix to some other identifier
+following ecosystem conventions.
+
+For example, Python packages tend to have "py" in the name, so "pynvim" is
+a good name: it's idiomatic and unambiguous. If the package is named "neovim",
+it confuses users, and complicates documentation and discussions.
+
+Examples of API-client package names:
+ GOOD: nvim-racket
+ GOOD: pynvim
+ BAD: python-client
+ BAD: neovim
+
+Implementation ~
+
+Consider using libmpack instead of the msgpack.org C/C++ library. libmpack is
+small (can be inlined into your C/C++ project) and efficient (no allocations).
+It also implements msgpack-RPC.
+https://github.com/libmpack/libmpack/
+
+EXTERNAL UI *dev-ui*
+
+External UIs should be aware of the |api-contract|. In particular, future
+versions of Nvim may add new items to existing events. The API is strongly
+backwards-compatible, but clients must not break if new (optional) fields are
+added to existing events.
+
+Standard Features ~
+
+External UIs are expected to implement these common features:
+
+- Call |nvim_set_client_info()| after connecting, so users and plugins can
+ detect the UI by handling the |ChanInfo| event. This avoids the need for
+ special variables and UI-specific config files (gvimrc, macvimrc, โ€ฆ).
+- Cursor style (shape, color) should conform to the 'guicursor' properties
+ delivered with the mode_info_set UI event.
+- Send the ALT/META ("Option" on macOS) key as a |<M-| chord.
+- Send the "super" key (Windows key, Apple key) as a |<D-| chord.
+- Avoid mappings that conflict with the Nvim keymap-space; GUIs have many new
+ chords (<C-,> <C-Enter> <C-S-x> <D-x>) and patterns ("shift shift") that do
+ not potentially conflict with Nvim defaults, plugins, etc.
+- Consider the "option_set" |ui-global| event as a hint for other GUI
+ behaviors. UI-related options ('guifont', 'ambiwidth', โ€ฆ) are published in
+ this event.
-RPC API
-API client
-remote plugin
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/diff.txt b/runtime/doc/diff.txt
index 12bc655edc..ab002b4dcb 100644
--- a/runtime/doc/diff.txt
+++ b/runtime/doc/diff.txt
@@ -1,23 +1,19 @@
-*diff.txt* For Vim version 7.4. Last change: 2015 Nov 01
+*diff.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
*diff* *diff-mode*
-This file describes |diff-mode|, which shows the differences between two,
-three, or four versions of the same file.
+This file describes the diff feature: Showing differences between two to
+eight versions of the same file.
The basics are explained in section |08.7| of the user manual.
-1. Starting diff mode |diff-mode|
-2. Viewing diffs |view-diffs|
-3. Jumping to diffs |jumpto-diffs|
-4. Copying diffs |copy-diffs|
-5. Diff options |diff-options|
+ Type |gO| to see the table of contents.
==============================================================================
-1. Starting diff mode
+1. Starting diff mode *start-vimdiff*
To start editing in diff mode, run "nvim -d". This starts Nvim as usual, and
additionally sets up for viewing the differences between the arguments. >
@@ -31,7 +27,9 @@ The second and following arguments may also be a directory name. Vim will
then append the file name of the first argument to the directory name to find
the file.
-This only works when a standard "diff" command is available. See 'diffexpr'.
+By default an internal diff library will be used. When 'diffopt' or
+'diffexpr' has been set an external "diff" command will be used. This only
+works when such a diff program is available.
Diffs are local to the current tab page |tab-page|. You can't see diffs with
a window in another tab page. This does make it possible to have several
@@ -109,7 +107,7 @@ To make these commands use a vertical split, prepend |:vertical|. Examples: >
If you always prefer a vertical split include "vertical" in 'diffopt'.
*E96*
-There can be up to four buffers with 'diff' set.
+There can be up to eight buffers with 'diff' set.
Since the option values are remembered with the buffer, you can edit another
file for a moment and come back to the same file and be in diff mode again.
@@ -123,6 +121,8 @@ file for a moment and come back to the same file and be in diff mode again.
related options only happens in a window that has 'diff' set,
if the current window does not have 'diff' set then no options
in it are changed.
+ Hidden buffers are also removed from the list of diff'ed
+ buffers.
The `:diffoff` command resets the relevant options to the values they had when
using `:diffsplit`, `:diffpatch` , `:diffthis`. or starting Vim in diff mode.
@@ -156,7 +156,8 @@ The alignment of text will go wrong when:
All the buffers edited in a window where the 'diff' option is set will join in
the diff. This is also possible for hidden buffers. They must have been
-edited in a window first for this to be possible.
+edited in a window first for this to be possible. To get rid of the hidden
+buffers use `:diffoff!`.
*:DiffOrig* *diff-original-file*
Since 'diff' is a window-local option, it's possible to view the same buffer
@@ -166,7 +167,7 @@ loaded. Since Vim doesn't allow having two buffers for the same file, you
need another buffer. This command is useful: >
command DiffOrig vert new | set buftype=nofile | read ++edit # | 0d_
\ | diffthis | wincmd p | diffthis
-(this is in |vimrc_example.vim|). Use ":DiffOrig" to see the differences
+Use ":DiffOrig" to see the differences
between the current buffer and the file it was loaded from.
A buffer that is unloaded cannot be used for the diff. But it does work for
@@ -215,8 +216,8 @@ The diffs are highlighted with these groups:
(searching from the end of the line). The
text in between is highlighted. This means
that parts in the middle that are still the
- same are highlighted anyway. Only "iwhite" of
- 'diffopt' is used here.
+ same are highlighted anyway. The 'diffopt'
+ flags "iwhite" and "icase" are used here.
|hl-DiffDelete| DiffDelete Deleted lines. Also called filler lines,
because they don't really exist in this
buffer.
@@ -315,7 +316,7 @@ g:diff_translations to zero: >
let g:diff_translations = 0
<
-After setting this variable, Reload the syntax script: >
+After setting this variable, reload the syntax script: >
set syntax=diff
<
@@ -333,8 +334,9 @@ between file1 and file2: >
The ">" is replaced with the value of 'shellredir'.
-The output of "diff" must be a normal "ed" style diff. Do NOT use a context
-diff. This example explains the format that Vim expects: >
+The output of "diff" must be a normal "ed" style diff or a unified diff. Do
+NOT use a context diff. This example explains the format that Vim expects for
+the "ed" style diff: >
1a2
> bbb
@@ -373,12 +375,16 @@ Example (this does almost the same as 'diffexpr' being empty): >
endif
silent execute "!diff -a --binary " . opt . v:fname_in . " " . v:fname_new .
\ " > " . v:fname_out
+ redraw!
endfunction
The "-a" argument is used to force comparing the files as text, comparing as
binaries isn't useful. The "--binary" argument makes the files read in binary
mode, so that a CTRL-Z doesn't end the text on DOS.
+The `redraw!` command may not be needed, depending on whether executing a
+shell command shows something on the display or not.
+
*E810* *E97*
Vim will do a test if the diff output looks alright. If it doesn't, you will
get an error message. Possible causes:
@@ -430,4 +436,4 @@ evaluating 'patchexpr'. This hopefully avoids that files in the current
directory are accidentally patched. Vim will also delete files starting with
v:fname_in and ending in ".rej" and ".orig".
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/digraph.txt b/runtime/doc/digraph.txt
index 84024fd1b3..f05c73d737 100644
--- a/runtime/doc/digraph.txt
+++ b/runtime/doc/digraph.txt
@@ -1,4 +1,4 @@
-*digraph.txt* For Vim version 7.4. Last change: 2014 Jun 19
+*digraph.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -14,9 +14,7 @@ with CTRL-V (see |i_CTRL-V|).
There is a brief introduction on digraphs in the user manual: |24.9|
An alternative is using the 'keymap' option.
-1. Defining digraphs |digraphs-define|
-2. Using digraphs |digraphs-use|
-3. Default digraphs |digraphs-default|
+ Type |gO| to see the table of contents.
==============================================================================
1. Defining digraphs *digraphs-define*
@@ -145,7 +143,7 @@ a standard meaning:
Two 2 Hook
Nine 9 Horn
- Equals = Cyrillic (= used as second char)
+ Equals = Cyrillic (= used as second char)
Asterisk * Greek
Percent sign % Greek/Cyrillic special
Plus + smalls: Arabic, capitals: Hebrew
@@ -924,6 +922,7 @@ char digraph hex dec official name ~
โ€  /- 2020 8224 DAGGER
โ€ก /= 2021 8225 DOUBLE DAGGER
โ€ฅ .. 2025 8229 TWO DOT LEADER
+โ€ฆ ,. 2026 8230 HORIZONTAL ELLIPSIS
โ€ฐ %0 2030 8240 PER MILLE SIGN
โ€ฒ 1' 2032 8242 PRIME
โ€ณ 2' 2033 8243 DOUBLE PRIME
@@ -1485,4 +1484,4 @@ char digraph hex dec official name ~
๏ฌ… ft FB05 64261 LATIN SMALL LIGATURE LONG S T
๏ฌ† st FB06 64262 LATIN SMALL LIGATURE ST
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/editing.txt b/runtime/doc/editing.txt
index 6f85436ab4..34fb779fe7 100644
--- a/runtime/doc/editing.txt
+++ b/runtime/doc/editing.txt
@@ -1,4 +1,4 @@
-*editing.txt* For Vim version 7.4. Last change: 2016 Mar 28
+*editing.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -6,17 +6,7 @@
Editing files *edit-files*
-1. Introduction |edit-intro|
-2. Editing a file |edit-a-file|
-3. The argument list |argument-list|
-4. Writing |writing|
-5. Writing and quitting |write-quit|
-6. Dialogs |edit-dialogs|
-7. The current directory |current-directory|
-8. Editing binary files |edit-binary|
-9. Encryption |encryption|
-10. Timestamps |timestamps|
-11. File Searching |file-searching|
+ Type |gO| to see the table of contents.
==============================================================================
1. Introduction *edit-intro*
@@ -160,7 +150,8 @@ start editing another file, Vim will refuse this. In order to overrule this
protection, add a '!' to the command. The changes will then be lost. For
example: ":q" will not work if the buffer was changed, but ":q!" will. To see
whether the buffer was changed use the "CTRL-G" command. The message includes
-the string "[Modified]" if the buffer has been changed.
+the string "[Modified]" if the buffer has been changed, or "+" if the 'm' flag
+is in 'shortmess'.
If you want to automatically save the changes without asking, switch on the
'autowriteall' option. 'autowrite' is the associated Vi-compatible option
@@ -245,7 +236,7 @@ If you want to keep the changed buffer without saving it, switch on the
*:vie* *:view*
:vie[w][!] [++opt] [+cmd] file
- When used in Ex mode: Leave |Ex mode|, go back to
+ When used in Ex mode: Leave |Ex-mode|, go back to
Normal mode. Otherwise same as |:edit|, but set
'readonly' option for this buffer.
@@ -267,9 +258,6 @@ CTRL-^ Edit the alternate file. Mostly the alternate file is
files.
See |CTRL-^| above for further details.
-[count]]f *]f* *[f*
-[count][f Same as "gf". Deprecated.
-
*gf* *E446* *E447*
[count]gf Edit the file whose name is under or after the cursor.
Mnemonic: "goto file".
@@ -388,6 +376,15 @@ On Unix and a few other systems you can also use backticks for the file name
argument, for example: >
:next `find . -name ver\\*.c -print`
:view `ls -t *.patch \| head -n1`
+Vim will run the command in backticks using the 'shell' and use the standard
+output as argument for the given Vim command (error messages from the shell
+command will be discarded).
+To see what shell command Vim is running, set the 'verbose' option to 4. When
+the shell command returns a non-zero exit code, an error message will be
+displayed and the Vim command will be aborted. To avoid this make the shell
+always return zero like so: >
+ :next `find . -name ver\\*.c -print \|\| true`
+
The backslashes before the star are required to prevent the shell from
expanding "ver*.c" prior to execution of the find program. The backslash
before the shell pipe symbol "|" prevents Vim from parsing it as command
@@ -574,16 +571,16 @@ list of the current window.
buffer.
Also see |++opt| and |+cmd|.
-:[count]arge[dit][!] [++opt] [+cmd] {name} *:arge* *:argedit*
- Add {name} to the argument list and edit it.
+:[count]arge[dit][!] [++opt] [+cmd] {name} .. *:arge* *:argedit*
+ Add {name}s to the argument list and edit it.
When {name} already exists in the argument list, this
entry is edited.
This is like using |:argadd| and then |:edit|.
- Note that only one file name is allowed, and spaces
- inside the file name are allowed, like with |:edit|.
+ Spaces in filenames have to be escaped with "\".
[count] is used like with |:argadd|.
- [!] is required if the current file cannot be
- |abandon|ed.
+ If the current file cannot be |abandon|ed {name}s will
+ still be added to the argument list, but won't be
+ edited. No check for duplicates is done.
Also see |++opt| and |+cmd|.
:[count]arga[dd] {name} .. *:arga* *:argadd* *E479*
@@ -836,8 +833,8 @@ flag is used for the ":substitute" command to avoid an error for files where
Note: When the 'write' option is off, you are not able to write any file.
*:w* *:write*
- *E502* *E503* *E504* *E505*
- *E512* *E514* *E667* *E796*
+ *E502* *E503* *E504* *E505*
+ *E512* *E514* *E667* *E796* *E949*
:w[rite] [++opt] Write the whole buffer to the current file. This is
the normal way to save changes to a file. It fails
when the 'readonly' option is set or when there is
@@ -893,6 +890,9 @@ used, for example, when the write fails and you want to try again later with
":w #". This can be switched off by removing the 'A' flag from the
'cpoptions' option.
+Note that the 'fsync' option matters here. If it's set it may make writes
+slower (but safer).
+
*:sav* *:saveas*
:sav[eas][!] [++opt] {file}
Save the current buffer under the name {file} and set
@@ -913,11 +913,12 @@ WRITING WITH MULTIPLE BUFFERS *buffer-write*
*:wa* *:wall*
:wa[ll] Write all changed buffers. Buffers without a file
- name or which are readonly are not written.
+ name cause an error message. Buffers which are
+ readonly are not written.
:wa[ll]! Write all changed buffers, even the ones that are
readonly. Buffers without a file name are not
- written.
+ written and cause an error message.
Vim will warn you if you try to overwrite a file that has been changed
@@ -1043,16 +1044,19 @@ The names can be in upper- or lowercase.
window in the current tab page the current tab page is
closed |tab-page|.
Triggers the |QuitPre| autocommand event.
+ See |CTRL-W_q| for quitting another window.
:conf[irm] q[uit] Quit, but give prompt when changes have been made, or
the last file in the argument list has not been
edited. See |:confirm| and 'confirm'.
:q[uit]! Quit without writing, also when the current buffer has
- changes. If this is the last window and there is a
- modified hidden buffer, the current buffer is
- abandoned and the first changed hidden buffer becomes
- the current buffer.
+ changes. The buffer is unloaded, also when it has
+ 'hidden' set.
+ If this is the last window and there is a modified
+ hidden buffer, the current buffer is abandoned and the
+ first changed hidden buffer becomes the current
+ buffer.
Use ":qall!" to exit always.
:cq[uit] Quit always, without writing, and return an error
@@ -1153,7 +1157,7 @@ Examples: >
If you want to always use ":confirm", set the 'confirm' option.
- *:browse* *:bro* *E338* *E614* *E615* *E616* *E578*
+ *:browse* *:bro* *E338* *E614* *E615* *E616*
:bro[wse] {command} Open a file selection dialog for an argument to
{command}. At present this works for |:e|, |:w|,
|:wall|, |:wq|, |:wqall|, |:x|, |:xall|, |:exit|,
@@ -1233,9 +1237,6 @@ working directory, which in turn takes precedence over the global
working directory. If a local working directory (tab or window) does not
exist, the next-higher scope in the hierarchy applies.
-Commands for changing the working directory can be suffixed with a bang "!"
-(e.g. |:cd!|) which is ignored, for compatibility with Vim.
-
*:cd* *E747* *E472*
:cd[!] On non-Unix systems: Print the current directory
name. On Unix systems: Change the current directory
@@ -1274,14 +1275,14 @@ Commands for changing the working directory can be suffixed with a bang "!"
*:lc* *:lcd*
:lc[d][!] {path} Like |:cd|, but only set the current directory for the
current window. The current directory for other
- windows or any tabs is not changed.
+ windows or tabs is not changed.
*:lch* *:lchdir*
:lch[dir][!] Same as |:lcd|.
*:lcd-*
:lcd[!] - Change to the previous current directory (before the
- previous ":tcd {path}" command).
+ previous ":lcd {path}" command).
*:pw* *:pwd* *E187*
:pw[d] Print the current directory name.
@@ -1373,6 +1374,13 @@ If you want to automatically reload a file when it has been changed outside of
Vim, set the 'autoread' option. This doesn't work at the moment you write the
file though, only when the file wasn't changed inside of Vim.
+If you do not want to be asked or automatically reload the file, you can use
+this: >
+ set buftype=nofile
+
+Or, when starting gvim from a shell: >
+ gvim file.log -c "set buftype=nofile"
+
Note that if a FileChangedShell autocommand is defined you will not get a
warning message or prompt. The autocommand is expected to handle this.
@@ -1543,7 +1551,7 @@ There are three different types of searching:
This searches the same directories, but in a different order.
Note that completion for ":find", ":sfind", and ":tabfind" commands do not
- currently work with 'path' items that contain a url or use the double star
+ currently work with 'path' items that contain a URL or use the double star
with depth limiter (/usr/**2) or upward search (;) notations.
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index 0ca41370e9..425dcede8b 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1,4 +1,4 @@
-*eval.txt* For Vim version 7.4. Last change: 2016 Apr 12
+*eval.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -12,23 +12,7 @@ Note: Expression evaluation can be disabled at compile time. If this has been
done, the features in this document are not available. See |+eval| and
|no-eval-feature|.
-1. Variables |variables|
- 1.1 Variable types
- 1.2 Function references |Funcref|
- 1.3 Lists |Lists|
- 1.4 Dictionaries |Dictionaries|
- 1.5 More about variables |more-variables|
-2. Expression syntax |expression-syntax|
-3. Internal variable |internal-variables|
-4. Builtin Functions |functions|
-5. Defining functions |user-functions|
-6. Curly braces names |curly-braces-names|
-7. Commands |expression-commands|
-8. Exception handling |exception-handling|
-9. Examples |eval-examples|
-10. No +eval feature |no-eval-feature|
-11. The sandbox |eval-sandbox|
-12. Textlock |textlock|
+ Type |gO| to see the table of contents.
==============================================================================
1. Variables *variables*
@@ -38,16 +22,22 @@ done, the features in this document are not available. See |+eval| and
There are six types of variables:
Number A 32 or 64 bit signed number. |expr-number| *Number*
- Examples: -123 0x10 0177
+ 64-bit Number is available only when compiled with the
+ |+num64| feature.
+ Examples: -123 0x10 0177 0b1011
Float A floating point number. |floating-point-format| *Float*
Examples: 123.456 1.15e-6 -1.1e3
+ *E928*
String A NUL terminated string of 8-bit unsigned characters (bytes).
|expr-string| Examples: "ab\txx\"--" 'x-z''a,c'
Funcref A reference to a function |Funcref|.
Example: function("strlen")
+ It can be bound to a dictionary and arguments, it then works
+ like a Partial.
+ Example: function("Callback", [arg], myDict)
List An ordered sequence of items |List|.
Example: [1, 2, ['a', 'b']]
@@ -85,14 +75,29 @@ To force conversion from String to Number, add zero to it: >
To avoid a leading zero to cause octal conversion, or for using a different
base, use |str2nr()|.
+ *TRUE* *FALSE*
For boolean operators Numbers are used. Zero is FALSE, non-zero is TRUE.
+You can also use |v:false| and |v:true|. When TRUE is returned from a
+function it is the Number one, FALSE is the number zero.
-Note that in the command >
+Note that in the command: >
:if "foo"
-"foo" is converted to 0, which means FALSE. To test for a non-empty string,
-use empty(): >
+ :" NOT executed
+"foo" is converted to 0, which means FALSE. If the string starts with a
+non-zero number it means TRUE: >
+ :if "8foo"
+ :" executed
+To test for a non-empty string, use empty(): >
:if !empty("foo")
-< *E745* *E728* *E703* *E729* *E730* *E731*
+<
+ *non-zero-arg*
+Function arguments often behave slightly different from |TRUE|: If the
+argument is present and it evaluates to a non-zero Number, |v:true| or a
+non-empty String, then the value is considered to be TRUE.
+Note that " " and "0" are also non-empty strings, thus considered to be TRUE.
+A List, Dictionary or Float is not a Number or String, thus evaluate to FALSE.
+
+ *E745* *E728* *E703* *E729* *E730* *E731*
List, Dictionary and Funcref types are not automatically converted.
*E805* *E806* *E808*
@@ -103,23 +108,15 @@ to Float, printf() for Float to String and float2nr() for Float to Number.
*E891* *E892* *E893* *E894*
When expecting a Float a Number can also be used, but nothing else.
- *E706* *sticky-type-checking*
-You will get an error if you try to change the type of a variable. You need
-to |:unlet| it first to avoid this error. String and Number are considered
-equivalent though, as well are Float and Number. Consider this sequence of
-commands: >
- :let l = "string"
- :let l = 44 " changes type from String to Number
- :let l = [1, 2, 3] " error! l is still a Number
- :let l = 4.4 " changes type from Number to Float
- :let l = "string" " error!
-
-
+ *no-type-checking*
+You will not get an error if you try to change the type of a variable.
+
1.2 Function references ~
*Funcref* *E695* *E718*
-A Funcref variable is obtained with the |function()| function. It can be used
-in an expression in the place of a function name, before the parenthesis
-around the arguments, to invoke the function it refers to. Example: >
+A Funcref variable is obtained with the |function()| function or created with
+the lambda expression |expr-lambda|. It can be used in an expression in the
+place of a function name, before the parenthesis around the arguments, to
+invoke the function it refers to. Example: >
:let Fn = function("MyFunc")
:echo Fn()
@@ -147,6 +144,40 @@ The name of the referenced function can be obtained with |string()|. >
You can use |call()| to invoke a Funcref and use a list variable for the
arguments: >
:let r = call(Fn, mylist)
+<
+ *Partial*
+A Funcref optionally binds a Dictionary and/or arguments. This is also called
+a Partial. This is created by passing the Dictionary and/or arguments to
+function(). When calling the function the Dictionary and/or arguments will be
+passed to the function. Example: >
+
+ let Cb = function('Callback', ['foo'], myDict)
+ call Cb()
+
+This will invoke the function as if using: >
+ call myDict.Callback('foo')
+
+Note that binding a function to a Dictionary also happens when the function is
+a member of the Dictionary: >
+
+ let myDict.myFunction = MyFunction
+ call myDict.myFunction()
+
+Here MyFunction() will get myDict passed as "self". This happens when the
+"myFunction" member is accessed. When assigning "myFunction" to otherDict
+and calling it, it will be bound to otherDict: >
+
+ let otherDict.myFunction = myDict.myFunction
+ call otherDict.myFunction()
+
+Now "self" will be "otherDict". But when the dictionary was bound explicitly
+this won't happen: >
+
+ let myDict.myFunction = function(MyFunction, myDict)
+ let otherDict.myFunction = myDict.myFunction
+ call otherDict.myFunction()
+
+Here "self" will be "myDict", because it was bound explicitly.
1.3 Lists ~
@@ -201,7 +232,7 @@ it. To change a list in-place see |list-modification| below.
Sublist ~
-
+ *sublist*
A part of the List can be obtained by specifying the first and last index,
separated by a colon in square brackets: >
:let shortlist = mylist[2:-1] " get List [3, "four"]
@@ -348,10 +379,6 @@ This works like: >
: let index = index + 1
:endwhile
-Note that all items in the list should be of the same type, otherwise this
-results in error |E706|. To avoid this |:unlet| the variable at the end of
-the loop.
-
If all you want to do is modify each item in the list then the |map()|
function will be a simpler method than a for loop.
@@ -585,13 +612,17 @@ It's possible to form a variable name with curly braces, see
Expression syntax summary, from least to most significant:
-|expr1| expr2 ? expr1 : expr1 if-then-else
+|expr1| expr2
+ expr2 ? expr1 : expr1 if-then-else
-|expr2| expr3 || expr3 .. logical OR
+|expr2| expr3
+ expr3 || expr3 .. logical OR
-|expr3| expr4 && expr4 .. logical AND
+|expr3| expr4
+ expr4 && expr4 .. logical AND
-|expr4| expr5 == expr5 equal
+|expr4| expr5
+ expr5 == expr5 equal
expr5 != expr5 not equal
expr5 > expr5 greater than
expr5 >= expr5 greater than or equal
@@ -608,24 +639,28 @@ Expression syntax summary, from least to most significant:
expr5 is expr5 same |List| instance
expr5 isnot expr5 different |List| instance
-|expr5| expr6 + expr6 .. number addition or list concatenation
+|expr5| expr6
+ expr6 + expr6 .. number addition or list concatenation
expr6 - expr6 .. number subtraction
expr6 . expr6 .. string concatenation
-|expr6| expr7 * expr7 .. number multiplication
+|expr6| expr7
+ expr7 * expr7 .. number multiplication
expr7 / expr7 .. number division
expr7 % expr7 .. number modulo
-|expr7| ! expr7 logical NOT
+|expr7| expr8
+ ! expr7 logical NOT
- expr7 unary minus
+ expr7 unary plus
-|expr8| expr8[expr1] byte of a String or item of a |List|
+|expr8| expr9
+ expr8[expr1] byte of a String or item of a |List|
expr8[expr1 : expr1] substring of a String or sublist of a |List|
expr8.name entry in a |Dictionary|
expr8(expr1, ...) function call with |Funcref| variable
-|expr9| number number constant
+|expr9| number number constant
"string" string constant, backslash is special
'string' string constant, ' is doubled
[expr1, ...] |List|
@@ -638,6 +673,7 @@ Expression syntax summary, from least to most significant:
@r contents of register 'r'
function(expr1, ...) function call
func{ti}on(expr1, ...) function call with curly braces
+ {args -> expr1} lambda expression
".." indicates that the operations in this level can be concatenated.
@@ -653,7 +689,7 @@ expr1 *expr1* *E109*
expr2 ? expr1 : expr1
The expression before the '?' is evaluated to a number. If it evaluates to
-non-zero, the result is the value of the expression between the '?' and ':',
+|TRUE|, the result is the value of the expression between the '?' and ':',
otherwise the result is the value of the expression after the ':'.
Example: >
:echo lnum == 1 ? "top" : lnum
@@ -681,12 +717,12 @@ expr2 and expr3 *expr2* *expr3*
The "||" and "&&" operators take one argument on each side. The arguments
are (converted to) Numbers. The result is:
- input output ~
-n1 n2 n1 || n2 n1 && n2 ~
-zero zero zero zero
-zero non-zero non-zero zero
-non-zero zero non-zero zero
-non-zero non-zero non-zero non-zero
+ input output ~
+n1 n2 n1 || n2 n1 && n2 ~
+|FALSE| |FALSE| |FALSE| |FALSE|
+|FALSE| |TRUE| |TRUE| |FALSE|
+|TRUE| |FALSE| |TRUE| |FALSE|
+|TRUE| |TRUE| |TRUE| |TRUE|
The operators can be concatenated, for example: >
@@ -702,8 +738,8 @@ arguments are not evaluated. This is like what happens in C. For example: >
let a = 1
echo a || b
-This is valid even if there is no variable called "b" because "a" is non-zero,
-so the result must be non-zero. Similarly below: >
+This is valid even if there is no variable called "b" because "a" is |TRUE|,
+so the result must be |TRUE|. Similarly below: >
echo exists("b") && b == "yes"
@@ -745,31 +781,50 @@ Examples:
"abc" == "Abc" evaluates to 1 if 'ignorecase' is set, 0 otherwise
*E691* *E692*
-A |List| can only be compared with a |List| and only "equal", "not equal" and
-"is" can be used. This compares the values of the list, recursively.
-Ignoring case means case is ignored when comparing item values.
+A |List| can only be compared with a |List| and only "equal", "not equal",
+"is" and "isnot" can be used. This compares the values of the list,
+recursively. Ignoring case means case is ignored when comparing item values.
*E735* *E736*
A |Dictionary| can only be compared with a |Dictionary| and only "equal", "not
-equal" and "is" can be used. This compares the key/values of the |Dictionary|
-recursively. Ignoring case means case is ignored when comparing item values.
-
- *E693* *E694*
-A |Funcref| can only be compared with a |Funcref| and only "equal" and "not
-equal" can be used. Case is never ignored.
+equal", "is" and "isnot" can be used. This compares the key/values of the
+|Dictionary| recursively. Ignoring case means case is ignored when comparing
+item values.
+
+ *E694*
+A |Funcref| can only be compared with a |Funcref| and only "equal", "not
+equal", "is" and "isnot" can be used. Case is never ignored. Whether
+arguments or a Dictionary are bound (with a partial) matters. The
+Dictionaries must also be equal (or the same, in case of "is") and the
+arguments must be equal (or the same).
+
+To compare Funcrefs to see if they refer to the same function, ignoring bound
+Dictionary and arguments, use |get()| to get the function name: >
+ if get(Part1, 'name') == get(Part2, 'name')
+ " Part1 and Part2 refer to the same function
When using "is" or "isnot" with a |List| or a |Dictionary| this checks if the
expressions are referring to the same |List| or |Dictionary| instance. A copy
of a |List| is different from the original |List|. When using "is" without
a |List| or a |Dictionary| it is equivalent to using "equal", using "isnot"
equivalent to using "not equal". Except that a different type means the
-values are different: "4 == '4'" is true, "4 is '4'" is false and "0 is []" is
-false and not an error. "is#"/"isnot#" and "is?"/"isnot?" can be used to match
-and ignore case.
+values are different: >
+ echo 4 == '4'
+ 1
+ echo 4 is '4'
+ 0
+ echo 0 is []
+ 0
+"is#"/"isnot#" and "is?"/"isnot?" can be used to match and ignore case.
When comparing a String with a Number, the String is converted to a Number,
-and the comparison is done on Numbers. This means that "0 == 'x'" is TRUE,
-because 'x' converted to a Number is zero.
+and the comparison is done on Numbers. This means that: >
+ echo 0 == 'x'
+ 1
+because 'x' converted to a Number is zero. However: >
+ echo [0] == ['x']
+ 0
+Inside a List or Dictionary this conversion is not used.
When comparing two Strings, this is done with strcmp() or stricmp(). This
results in the mathematical difference (comparing byte values), not
@@ -834,6 +889,11 @@ When dividing a Number by zero the result depends on the value:
<0 / 0 = -0x7fffffff (like negative infinity)
(before Vim 7.2 it was always 0x7fffffff)
+When 64-bit Number support is enabled:
+ 0 / 0 = -0x8000000000000000 (like NaN for Float)
+ >0 / 0 = 0x7fffffffffffffff (like positive infinity)
+ <0 / 0 = -0x7fffffffffffffff (like negative infinity)
+
When the righthand side of '%' is zero, the result is 0.
None of these work for |Funcref|s.
@@ -847,7 +907,7 @@ expr7 *expr7*
- expr7 unary minus *expr-unary--*
+ expr7 unary plus *expr-unary-+*
-For '!' non-zero becomes zero, zero becomes one.
+For '!' |TRUE| becomes |FALSE|, |FALSE| becomes |TRUE| (one).
For '-' the sign of the number is changed.
For '+' the number is unchanged.
@@ -861,12 +921,19 @@ These three can be repeated and mixed. Examples:
expr8 *expr8*
-----
+This expression is either |expr9| or a sequence of the alternatives below,
+in any order. E.g., these are all possible:
+ expr9[expr1].name
+ expr9.name[expr1]
+ expr9(expr1, ...)[expr1].name
+
+
expr8[expr1] item of String or |List| *expr-[]* *E111*
*subscript*
If expr8 is a Number or String this results in a String that contains the
expr1'th single byte from expr8. expr8 is used as a String, expr1 as a
-Number. This doesn't recognize multi-byte encodings, see |byteidx()| for
+Number. This doesn't recognize multi-byte encodings, see `byteidx()` for
an alternative, or use `split()` to turn the string into a list of characters.
Index zero gives the first byte. This is like it works in C. Careful:
@@ -910,10 +977,10 @@ Examples: >
:let s = line(".")[4:] " from the fifth byte to the end
:let s = s[:-3] " remove last two bytes
<
- *sublist* *slice*
+ *slice*
If expr8 is a |List| this results in a new |List| with the items indicated by
the indexes expr1a and expr1b. This works like with a String, as explained
-just above, except that indexes out of range cause an error. Examples: >
+just above. Also see |sublist| below. Examples: >
:let l = mylist[:3] " first four items
:let l = mylist[4:4] " List with one item
:let l = mylist[:] " shallow copy of a List
@@ -956,10 +1023,11 @@ When expr8 is a |Funcref| type variable, invoke the function it refers to.
*expr9*
number
------
-number number constant *expr-number*
- *hex-number* *octal-number*
+number number constant *expr-number*
+ *hex-number* *octal-number* *binary-number*
-Decimal, Hexadecimal (starting with 0x or 0X), or Octal (starting with 0).
+Decimal, Hexadecimal (starting with 0x or 0X), Binary (starting with 0b or 0B)
+and Octal (starting with 0).
*floating-point-format*
Floating point numbers can be written in two forms:
@@ -1027,8 +1095,8 @@ A string constant accepts these special characters:
\x. byte specified with one hex number (must be followed by non-hex char)
\X.. same as \x..
\X. same as \x.
-\u.... character specified with up to 4 hex numbers, stored according to the
- current value of 'encoding' (e.g., "\u02a4")
+\u.... character specified with up to 4 hex numbers, stored as UTF-8
+ (e.g., "\u02a4")
\U.... same as \u but allows up to 8 hex numbers.
\b backspace <BS>
\e escape <Esc>
@@ -1043,8 +1111,7 @@ A string constant accepts these special characters:
utf-8 character, use \uxxxx as mentioned above.
Note that "\xff" is stored as the byte 255, which may be invalid in some
-encodings. Use "\u00ff" to store character 255 according to the current value
-of 'encoding'.
+encodings. Use "\u00ff" to store character 255 correctly as UTF-8.
Note that "\000" and "\x00" force the end of the string.
@@ -1128,6 +1195,62 @@ function(expr1, ...) function call
See below |functions|.
+lambda expression *expr-lambda* *lambda*
+-----------------
+{args -> expr1} lambda expression
+
+A lambda expression creates a new unnamed function which returns the result of
+evaluating |expr1|. Lambda expressions differ from |user-functions| in
+the following ways:
+
+1. The body of the lambda expression is an |expr1| and not a sequence of |Ex|
+ commands.
+2. The prefix "a:" should not be used for arguments. E.g.: >
+ :let F = {arg1, arg2 -> arg1 - arg2}
+ :echo F(5, 2)
+< 3
+
+The arguments are optional. Example: >
+ :let F = {-> 'error function'}
+ :echo F()
+< error function
+ *closure*
+Lambda expressions can access outer scope variables and arguments. This is
+often called a closure. Example where "i" and "a:arg" are used in a lambda
+while they exist in the function scope. They remain valid even after the
+function returns: >
+ :function Foo(arg)
+ : let i = 3
+ : return {x -> x + i - a:arg}
+ :endfunction
+ :let Bar = Foo(4)
+ :echo Bar(6)
+< 5
+See also |:func-closure|. Lambda and closure support can be checked with: >
+ if has('lambda')
+
+Examples for using a lambda expression with |sort()|, |map()| and |filter()|: >
+ :echo map([1, 2, 3], {idx, val -> val + 1})
+< [2, 3, 4] >
+ :echo sort([3,7,2,1,4], {a, b -> a - b})
+< [1, 2, 3, 4, 7]
+
+The lambda expression is also useful for jobs and timers: >
+ :let timer = timer_start(500,
+ \ {-> execute("echo 'Handler called'", "")},
+ \ {'repeat': 3})
+< Handler called
+ Handler called
+ Handler called
+
+Note how execute() is used to execute an Ex command. That's ugly though.
+
+
+Lambda expressions have internal names like '<lambda>42'. If you get an error
+for a lambda expression, you can find what it is with the following command: >
+ :function {'<lambda>42'}
+See also: |numbered-function|
+
==============================================================================
3. Internal variable *internal-variables* *E461*
@@ -1176,7 +1299,8 @@ b:changedtick The total number of changes to the current buffer. It is
: let my_changedtick = b:changedtick
: call My_Update()
:endif
-<
+< You cannot change or delete the b:changedtick variable.
+
*window-variable* *w:var* *w:*
A variable name that is preceded with "w:" is local to the current window. It
is deleted when the window is closed.
@@ -1304,6 +1428,10 @@ v:beval_winnr The number of the window, over which the mouse pointer is. Only
window has number zero (unlike most other places where a
window gets a number).
+ *v:beval_winid* *beval_winid-variable*
+v:beval_winid The |window-ID| of the window, over which the mouse pointer
+ is. Otherwise like v:beval_winnr.
+
*v:char* *char-variable*
v:char Argument for evaluating 'formatexpr' and used for the typed
character when using <expr> in an abbreviation |:map-<expr>|.
@@ -1353,7 +1481,6 @@ v:count The count given for the last Normal mode command. Can be used
When there are two counts, as in "3d2w", they are multiplied,
just like what happens in the command, "d6w" for the example.
Also used for evaluating the 'formatexpr' option.
- "count" also works, for backwards compatibility.
*v:count1* *count1-variable*
v:count1 Just like "v:count", but defaults to one when no count is
@@ -1378,6 +1505,9 @@ v:dying Normally zero. When a deadly signal is caught it's set to
< Note: if another deadly signal is caught when v:dying is one,
VimLeave autocommands will not be executed.
+ *v:exiting* *exiting-variable*
+v:exiting Exit code, or |v:null| if not exiting. |VimLeave|
+
*v:errmsg* *errmsg-variable*
v:errmsg Last given error message. It's allowed to set this variable.
Example: >
@@ -1385,8 +1515,7 @@ v:errmsg Last given error message. It's allowed to set this variable.
:silent! next
:if v:errmsg != ""
: ... handle error
-< "errmsg" also works, for backwards compatibility.
-
+<
*v:errors* *errors-variable*
v:errors Errors found by assert functions, such as |assert_true()|.
This is a list of strings.
@@ -1397,16 +1526,28 @@ v:errors Errors found by assert functions, such as |assert_true()|.
list by the assert function.
*v:event* *event-variable*
-v:event Dictionary of event data for the current |autocommand|. The
- available keys differ per event type and are specified at the
- documentation for each |event|. The possible keys are:
- operator The operation performed. Unlike
- |v:operator|, it is set also for an Ex
- mode command. For instance, |:yank| is
- translated to "|y|".
+v:event Dictionary of event data for the current |autocommand|. Valid
+ only during the event lifetime; storing or passing v:event is
+ invalid! Copy it instead: >
+ au TextYankPost * let g:foo = deepcopy(v:event)
+< Keys vary by event; see the documentation for the specific
+ event, e.g. |DirChanged| or |TextYankPost|.
+ KEY DESCRIPTION ~
+ abort Whether the event triggered during
+ an aborting condition (e.g. |c_Esc| or
+ |c_CTRL-C| for |CmdlineLeave|).
+ cmdlevel Level of cmdline.
+ cmdtype Type of cmdline, |cmdline-char|.
+ cwd Current working directory.
+ scope Event-specific scope name.
+ operator Current |operator|. Also set for Ex
+ commands (unlike |v:operator|). For
+ example if |TextYankPost| is triggered
+ by the |:yank| Ex command then
+ `v:event.operator` is "y".
regcontents Text stored in the register as a
|readfile()|-style list of lines.
- regname Requested register (e.g "x" for "xyy)
+ regname Requested register (e.g "x" for "xyy)
or the empty string for an unnamed
operation.
regtype Type of register as returned by
@@ -1424,11 +1565,11 @@ v:exception The value of the exception most recently caught and not
< Output: "caught oops".
*v:false* *false-variable*
-v:false Special value used to put "false" in JSON and msgpack. See
- |json_encode()|. This value is converted to "false" when used
- as a String (e.g. in |expr5| with string concatenation
- operator) and to zero when used as a Number (e.g. in |expr5|
- or |expr7| when used with numeric operators).
+v:false Special value used to put "false" in JSON and msgpack. See
+ |json_encode()|. This value is converted to "v:false" when used
+ as a String (e.g. in |expr5| with string concatenation
+ operator) and to zero when used as a Number (e.g. in |expr5|
+ or |expr7| when used with numeric operators). Read-only.
*v:fcs_reason* *fcs_reason-variable*
v:fcs_reason The reason why the |FileChangedShell| event was triggered.
@@ -1553,6 +1694,10 @@ v:mouse_win Window number for a mouse click obtained with |getchar()|.
First window has number 1, like with |winnr()|. The value is
zero when there was no mouse button click.
+ *v:mouse_winid* *mouse_winid-variable*
+v:mouse_winid |window-ID| for a mouse click obtained with |getchar()|.
+ The value is zero when there was no mouse button click.
+
*v:mouse_lnum* *mouse_lnum-variable*
v:mouse_lnum Line number for a mouse click obtained with |getchar()|.
This is the text line number, not the screen line number. The
@@ -1564,17 +1709,17 @@ v:mouse_col Column number for a mouse click obtained with |getchar()|.
value is zero when there was no mouse button click.
*v:msgpack_types* *msgpack_types-variable*
-v:msgpack_types Dictionary containing msgpack types used by |msgpackparse()|
- and |msgpackdump()|. All types inside dictionary are fixed
- (not editable) empty lists. To check whether some list is one
+v:msgpack_types Dictionary containing msgpack types used by |msgpackparse()|
+ and |msgpackdump()|. All types inside dictionary are fixed
+ (not editable) empty lists. To check whether some list is one
of msgpack types, use |is| operator.
*v:null* *null-variable*
-v:null Special value used to put "null" in JSON and NIL in msgpack.
- See |json_encode()|. This value is converted to "null" when
- used as a String (e.g. in |expr5| with string concatenation
- operator) and to zero when used as a Number (e.g. in |expr5|
- or |expr7| when used with numeric operators).
+v:null Special value used to put "null" in JSON and NIL in msgpack.
+ See |json_encode()|. This value is converted to "v:null" when
+ used as a String (e.g. in |expr5| with string concatenation
+ operator) and to zero when used as a Number (e.g. in |expr5|
+ or |expr7| when used with numeric operators). Read-only.
*v:oldfiles* *oldfiles-variable*
v:oldfiles List of file names that is loaded from the |shada| file on
@@ -1623,17 +1768,11 @@ v:profiling Normally zero. Set to one after using ":profile start".
See |profiling|.
*v:progname* *progname-variable*
-v:progname Contains the name (with path removed) with which Nvim was
- invoked. Allows you to do special initialisations for any
- other name you might symlink to Nvim.
+v:progname The name by which Nvim was invoked (with path removed).
Read-only.
*v:progpath* *progpath-variable*
-v:progpath Contains the command with which Vim was invoked, including the
- path. To get the full path use: >
- echo exepath(v:progpath)
-< NOTE: This does not work when the command is a relative path
- and the current directory has changed.
+v:progpath Absolute path to the current running Nvim.
Read-only.
*v:register* *register-variable*
@@ -1655,12 +1794,12 @@ v:scrollstart String describing the script or function that caused the
hit-enter prompt.
*v:servername* *servername-variable*
- *$NVIM_LISTEN_ADDRESS*
-v:servername Default {Nvim} server address. Equivalent to
- |$NVIM_LISTEN_ADDRESS| on startup. |serverstop()|
+v:servername Primary listen-address of the current Nvim instance, the first
+ item returned by |serverlist()|. Can be set by |--listen| or
+ |$NVIM_LISTEN_ADDRESS| at startup. |serverstart()| |serverstop()|
Read-only.
-
+
v:searchforward *v:searchforward* *searchforward-variable*
Search direction: 1 after a forward search, 0 after a
backward search. It is reset to forward when directly setting
@@ -1680,11 +1819,17 @@ v:shell_error Result of the last shell command. When non-zero, the last
:if v:shell_error
: echo 'could not rename "foo" to "bar"!'
:endif
-< "shell_error" also works, for backwards compatibility.
-
+<
*v:statusmsg* *statusmsg-variable*
v:statusmsg Last given status message. It's allowed to set this variable.
+ *v:stderr* *stderr-variable*
+v:stderr |channel-id| corresponding to stderr. The value is always 2;
+ use this variable to make your code more descriptive.
+ Unlike stdin and stdout (see |stdioopen()|), stderr is always
+ open for writing. Example: >
+ :call chansend(v:stderr, "error: toaster empty\n")
+<
*v:swapname* *swapname-variable*
v:swapname Only valid when executing |SwapExists| autocommands: Name of
the swap file found. Read-only.
@@ -1709,11 +1854,27 @@ v:swapcommand Normal mode command to be executed after a file has been
example, when jumping to a tag the value is ":tag tagname\r".
For ":edit +cmd file" the value is ":cmd\r".
+ *v:t_TYPE* *v:t_bool* *t_bool-variable*
+v:t_bool Value of Boolean type. Read-only. See: |type()|
+ *v:t_dict* *t_dict-variable*
+v:t_dict Value of Dictionary type. Read-only. See: |type()|
+ *v:t_float* *t_float-variable*
+v:t_float Value of Float type. Read-only. See: |type()|
+ *v:t_func* *t_func-variable*
+v:t_func Value of Funcref type. Read-only. See: |type()|
+ *v:t_list* *t_list-variable*
+v:t_list Value of List type. Read-only. See: |type()|
+ *v:t_number* *t_number-variable*
+v:t_number Value of Number type. Read-only. See: |type()|
+ *v:t_string* *t_string-variable*
+v:t_string Value of String type. Read-only. See: |type()|
+
*v:termresponse* *termresponse-variable*
-v:termresponse The escape sequence returned by the terminal for the |t_RV|
- termcap entry. It is set when Vim receives an escape sequence
- that starts with ESC [ or CSI and ends in a 'c', with only
- digits, ';' and '.' in between.
+v:termresponse The escape sequence returned by the terminal for the DA
+ (request primary device attributes) control sequence. It is
+ set when Vim receives an escape sequence that starts with ESC
+ [ or CSI and ends in a 'c', with only digits, ';' and '.' in
+ between.
When this option is set, the TermResponse autocommand event is
fired, so that you can react to the response from the
terminal.
@@ -1723,11 +1884,13 @@ v:termresponse The escape sequence returned by the terminal for the |t_RV|
always 95 or bigger). Pc is always zero.
{only when compiled with |+termresponse| feature}
+ *v:testing* *testing-variable*
+v:testing Must be set before using `test_garbagecollect_now()`.
+
*v:this_session* *this_session-variable*
v:this_session Full filename of the last loaded or saved session file. See
|:mksession|. It is allowed to set this variable. When no
session file has been saved, this variable is empty.
- "this_session" also works, for backwards compatibility.
*v:throwpoint* *throwpoint-variable*
v:throwpoint The point where the exception most recently caught and not
@@ -1742,11 +1905,11 @@ v:throwpoint The point where the exception most recently caught and not
< Output: "Exception from test.vim, line 2"
*v:true* *true-variable*
-v:true Special value used to put "true" in JSON and msgpack. See
- |json_encode()|. This value is converted to "true" when used
- as a String (e.g. in |expr5| with string concatenation
- operator) and to one when used as a Number (e.g. in |expr5| or
- |expr7| when used with numeric operators).
+v:true Special value used to put "true" in JSON and msgpack. See
+ |json_encode()|. This value is converted to "v:true" when used
+ as a String (e.g. in |expr5| with string concatenation
+ operator) and to one when used as a Number (e.g. in |expr5| or
+ |expr7| when used with numeric operators). Read-only.
*v:val* *val-variable*
v:val Value of the current item of a |List| or |Dictionary|. Only
@@ -1764,13 +1927,18 @@ v:version Version number of Vim: Major version number times 100 plus
version 5.0 and 5.1 may have a patch 123, but these are
completely different.
+ *v:vim_did_enter* *vim_did_enter-variable*
+v:vim_did_enter Zero until most of startup is done. It is set to one just
+ before |VimEnter| autocommands are triggered.
+
*v:warningmsg* *warningmsg-variable*
v:warningmsg Last given warning message. It's allowed to set this variable.
- *v:windowid* *windowid-variable* {Nvim}
-v:windowid Application-specific window ID ("window handle" in MS-Windows)
- which may be set by any attached UI. Defaults to zero.
- Note: for windows inside Vim use |winnr()|.
+ *v:windowid* *windowid-variable*
+v:windowid Application-specific window "handle" which may be set by any
+ attached UI. Defaults to zero.
+ Note: For Nvim |windows| use |winnr()| or |win_getid()|, see
+ |window-ID|.
==============================================================================
4. Builtin Functions *functions*
@@ -1793,31 +1961,45 @@ argidx() Number current index in the argument list
arglistid([{winnr} [, {tabnr}]]) Number argument list id
argv({nr}) String {nr} entry of the argument list
argv() List the argument list
-assert_equal({exp}, {act} [, {msg}]) none assert {exp} equals {act}
-assert_exception( {error} [, {msg}]) none assert {error} is in v:exception
-assert_fails( {cmd} [, {error}]) none assert {cmd} fails
-assert_false({actual} [, {msg}]) none assert {actual} is false
-assert_true({actual} [, {msg}]) none assert {actual} is true
+assert_equal({exp}, {act} [, {msg}])
+ none assert {exp} is equal to {act}
+assert_exception({error} [, {msg}])
+ none assert {error} is in v:exception
+assert_fails({cmd} [, {error}]) none assert {cmd} fails
+assert_false({actual} [, {msg}])
+ none assert {actual} is false
+assert_inrange({lower}, {upper}, {actual} [, {msg}])
+ none assert {actual} is inside the range
+assert_match({pat}, {text} [, {msg}])
+ none assert {pat} matches {text}
+assert_notequal({exp}, {act} [, {msg}])
+ none assert {exp} is not equal {act}
+assert_notmatch({pat}, {text} [, {msg}])
+ none assert {pat} not matches {text}
+assert_report({msg}) none report a test failure
+assert_true({actual} [, {msg}]) none assert {actual} is true
asin({expr}) Float arc sine of {expr}
atan({expr}) Float arc tangent of {expr}
atan2({expr}, {expr}) Float arc tangent of {expr1} / {expr2}
browse({save}, {title}, {initdir}, {default})
String put up a file requester
browsedir({title}, {initdir}) String put up a directory requester
-bufexists({expr}) Number TRUE if buffer {expr} exists
-buflisted({expr}) Number TRUE if buffer {expr} is listed
-bufloaded({expr}) Number TRUE if buffer {expr} is loaded
+bufexists({expr}) Number |TRUE| if buffer {expr} exists
+buflisted({expr}) Number |TRUE| if buffer {expr} is listed
+bufloaded({expr}) Number |TRUE| if buffer {expr} is loaded
bufname({expr}) String Name of the buffer {expr}
bufnr({expr} [, {create}]) Number Number of the buffer {expr}
+bufwinid({expr}) Number |window-ID| of buffer {expr}
bufwinnr({expr}) Number window number of buffer {expr}
byte2line({byte}) Number line number at byte count {byte}
byteidx({expr}, {nr}) Number byte index of {nr}'th char in {expr}
byteidxcomp({expr}, {nr}) Number byte index of {nr}'th char in {expr}
call({func}, {arglist} [, {dict}])
any call {func} with arguments {arglist}
-capture({command}) String capture output of {command}
ceil({expr}) Float round {expr} up
changenr() Number current change number
+chanclose({id}[, {stream}]) Number Closes a channel or one of its streams
+chansend({id}, {data}) Number Writes {data} to channel
char2nr({expr}[, {utf8}]) Number ASCII/UTF8 value of first char in {expr}
cindent({lnum}) Number C indent for line {lnum}
clearmatches() none clear all matches
@@ -1832,7 +2014,7 @@ cos({expr}) Float cosine of {expr}
cosh({expr}) Float hyperbolic cosine of {expr}
count({list}, {expr} [, {ic} [, {start}]])
Number count how many {expr} are in {list}
-cscope_connection([{num} , {dbpath} [, {prepend}]])
+cscope_connection([{num}, {dbpath} [, {prepend}]])
Number checks existence of cscope connection
cursor({lnum}, {col} [, {off}])
Number move cursor to {lnum}, {col}, {off}
@@ -1843,29 +2025,30 @@ dictwatcheradd({dict}, {pattern}, {callback})
Start watching a dictionary
dictwatcherdel({dict}, {pattern}, {callback})
Stop watching a dictionary
-did_filetype() Number TRUE if FileType autocommand event used
+did_filetype() Number |TRUE| if FileType autocommand event used
diff_filler({lnum}) Number diff filler lines about {lnum}
diff_hlID({lnum}, {col}) Number diff highlighting at {lnum}/{col}
-empty({expr}) Number TRUE if {expr} is empty
+empty({expr}) Number |TRUE| if {expr} is empty
escape({string}, {chars}) String escape {chars} in {string} with '\'
eval({string}) any evaluate {string} into its value
-eventhandler() Number TRUE if inside an event handler
+eventhandler() Number |TRUE| if inside an event handler
executable({expr}) Number 1 if executable {expr} exists
+execute({command}) String execute and capture output of {command}
exepath({expr}) String full path of the command {expr}
-exists({expr}) Number TRUE if {expr} exists
+exists({expr}) Number |TRUE| if {expr} exists
extend({expr1}, {expr2} [, {expr3}])
List/Dict insert items of {expr2} into {expr1}
exp({expr}) Float exponential of {expr}
expand({expr} [, {nosuf} [, {list}]])
any expand special keywords in {expr}
feedkeys({string} [, {mode}]) Number add key sequence to typeahead buffer
-filereadable({file}) Number TRUE if {file} is a readable file
-filewritable({file}) Number TRUE if {file} is a writable file
-filter({expr}, {string}) List/Dict remove items from {expr} where
- {string} is 0
-finddir({name}[, {path}[, {count}]])
+filereadable({file}) Number |TRUE| if {file} is a readable file
+filewritable({file}) Number |TRUE| if {file} is a writable file
+filter({expr1}, {expr2}) List/Dict remove items from {expr1} where
+ {expr2} is 0
+finddir({name} [, {path} [, {count}]])
String find directory {name} in {path}
-findfile({name}[, {path}[, {count}]])
+findfile({name} [, {path} [, {count}]])
String find file {name} in {path}
float2nr({expr}) Number convert Float {expr} to a Number
floor({expr}) Float round {expr} down
@@ -1878,10 +2061,15 @@ foldlevel({lnum}) Number fold level at {lnum}
foldtext() String line displayed for closed fold
foldtextresult({lnum}) String text for closed fold at {lnum}
foreground() Number bring the Vim window to the foreground
-function({name}) Funcref reference to function {name}
+funcref({name} [, {arglist}] [, {dict}])
+ Funcref reference to function {name}
+function({name} [, {arglist}] [, {dict}])
+ Funcref named reference to function {name}
garbagecollect([{atexit}]) none free memory, breaking cyclic references
get({list}, {idx} [, {def}]) any get item {idx} from {list} or {def}
get({dict}, {key} [, {def}]) any get item {key} from {dict} or {def}
+get({func}, {what}) any get property of funcref/partial {func}
+getbufinfo([{expr}]) List information about buffers
getbufline({expr}, {lnum} [, {end}])
List lines {lnum} to {end} of buffer {expr}
getbufvar({expr}, {varname} [, {def}])
@@ -1893,47 +2081,52 @@ getcmdline() String return the current command-line
getcmdpos() Number return cursor position in command-line
getcmdtype() String return current command-line type
getcmdwintype() String return current command-line window type
+getcompletion({pat}, {type} [, {filtered}])
+ List list of cmdline completion matches
getcurpos() List position of the cursor
-getcwd([{winnr} [, {tabnr}]]) String the current working directory
+getcwd([{winnr} [, {tabnr}]]) String get the current working directory
getfontname([{name}]) String name of font being used
getfperm({fname}) String file permissions of file {fname}
getfsize({fname}) Number size in bytes of file {fname}
getftime({fname}) Number last modification time of file
getftype({fname}) String description of type of file {fname}
-getline({lnum}) String line {lnum} of current buffer
+getline({lnum}) String line {lnum} of current buffer
getline({lnum}, {end}) List lines {lnum} to {end} of current buffer
-getloclist({nr}) List list of location list items
+getloclist({nr} [, {what}]) List list of location list items
getmatches() List list of current matches
getpid() Number process ID of Vim
getpos({expr}) List position of cursor, mark, etc.
-getqflist() List list of quickfix items
+getqflist([{what}]) List list of quickfix items
getreg([{regname} [, 1 [, {list}]]])
String or List contents of register
-getregtype([{regname}]) String type of register
+getregtype([{regname}]) String type of register
+gettabinfo([{expr}]) List list of tab pages
gettabvar({nr}, {varname} [, {def}])
any variable {varname} in tab {nr} or {def}
gettabwinvar({tabnr}, {winnr}, {name} [, {def}])
any {name} in {winnr} in tab page {tabnr}
+getwininfo([{winid}]) List list of windows
+getwinpos([{timeout}]) List X and Y coord in pixels of the Vim window
getwinposx() Number X coord in pixels of GUI Vim window
getwinposy() Number Y coord in pixels of GUI Vim window
getwinvar({nr}, {varname} [, {def}])
any variable {varname} in window {nr}
glob({expr} [, {nosuf} [, {list} [, {alllinks}]]])
any expand file wildcards in {expr}
-glob2regpat({expr}) String convert a glob pat into a search pat
+glob2regpat({expr}) String convert a glob pat into a search pat
globpath({path}, {expr} [, {nosuf} [, {list} [, {alllinks}]]])
String do glob({expr}) for all dirs in {path}
-has({feature}) Number TRUE if feature {feature} supported
-has_key({dict}, {key}) Number TRUE if {dict} has entry {key}
+has({feature}) Number |TRUE| if feature {feature} supported
+has_key({dict}, {key}) Number |TRUE| if {dict} has entry {key}
haslocaldir([{winnr} [, {tabnr}]])
- Number TRUE if current window executed |:lcd|
+ Number |TRUE| if current window executed |:lcd|
hasmapto({what} [, {mode} [, {abbr}]])
- Number TRUE if mapping to {what} exists
+ Number |TRUE| if mapping to {what} exists
histadd({history}, {item}) String add an item to a history
histdel({history} [, {item}]) String remove an item from a history
histget({history} [, {index}]) String get the item {index} from a history
histnr({history}) Number highest index of a history
-hlexists({name}) Number TRUE if highlight group {name} exists
+hlexists({name}) Number |TRUE| if highlight group {name} exists
hlID({name}) Number syntax ID of highlight group {name}
hostname() String name of the machine Vim is running on
iconv({expr}, {from}, {to}) String convert encoding of {expr}
@@ -1942,7 +2135,6 @@ index({list}, {expr} [, {start} [, {ic}]])
Number index in {list} where {expr} appears
input({prompt} [, {text} [, {completion}]])
String get input from the user
-inputdialog({p} [, {t} [, {c}]]) String like input() but in a GUI dialog
inputlist({textlist}) Number let the user pick from a choice list
inputrestore() Number restore typeahead
inputsave() Number save and clear typeahead
@@ -1951,16 +2143,15 @@ inputsecret({prompt} [, {text}])
insert({list}, {item} [, {idx}])
List insert {item} in {list} [before {idx}]
invert({expr}) Number bitwise invert
-isdirectory({directory}) Number TRUE if {directory} is a directory
-islocked({expr}) Number TRUE if {expr} is locked
+isdirectory({directory}) Number |TRUE| if {directory} is a directory
+islocked({expr}) Number |TRUE| if {expr} is locked
+id({expr}) String identifier of the container
items({dict}) List key-value pairs in {dict}
-jobclose({job}[, {stream}]) Number Closes a job stream(s)
-jobpid({job}) Number Returns pid of a job.
-jobresize({job}, {width}, {height})
- Number Resize {job}'s pseudo terminal window
-jobsend({job}, {data}) Number Writes {data} to {job}'s stdin
+jobpid({id}) Number Returns pid of a job.
+jobresize({id}, {width}, {height})
+ Number Resize pseudo terminal window of a job
jobstart({cmd}[, {opts}]) Number Spawns {cmd} as a job
-jobstop({job}) Number Stops a job
+jobstop({id}) Number Stops a job
jobwait({ids}[, {timeout}]) Number Wait for a set of jobs
join({list} [, {sep}]) String join {list} items into one String
json_decode({expr}) any Convert {expr} from JSON
@@ -1975,7 +2166,8 @@ lispindent({lnum}) Number Lisp indent for line {lnum}
localtime() Number current time
log({expr}) Float natural logarithm (base e) of {expr}
log10({expr}) Float logarithm of Float {expr} to base 10
-map({expr}, {string}) List/Dict change each item in {expr} to {expr}
+luaeval({expr}[, {expr}]) any evaluate Lua expression
+map({expr1}, {expr2}) List/Dict change each item in {expr1} to {expr}
maparg({name}[, {mode} [, {abbr} [, {dict}]]])
String or Dict
rhs of mapping {name} in mode {mode}
@@ -1995,8 +2187,10 @@ matchlist({expr}, {pat}[, {start}[, {count}]])
List match and submatches of {pat} in {expr}
matchstr({expr}, {pat}[, {start}[, {count}]])
String {count}'th match of {pat} in {expr}
-max({list}) Number maximum value of items in {list}
-min({list}) Number minimum value of items in {list}
+matchstrpos({expr}, {pat}[, {start}[, {count}]])
+ List {count}'th match of {pat} in {expr}
+max({expr}) Number maximum value of items in {expr}
+min({expr}) Number minimum value of items in {expr}
mkdir({name} [, {path} [, {prot}]])
Number create directory {name}
mode([expr]) String current editing mode
@@ -2004,6 +2198,9 @@ msgpackdump({list}) List dump a list of objects to msgpack
msgpackparse({list}) List parse msgpack to a list of objects
nextnonblank({lnum}) Number line nr of non-blank line >= {lnum}
nr2char({expr}[, {utf8}]) String single char with ASCII/UTF8 value {expr}
+option_restore({list}) none restore options saved by option_save()
+option_save({list}) List save options values
+nvim_...({args}...) any call nvim |api| functions
or({expr}, {expr}) Number bitwise OR
pathshorten({expr}) String shorten directory names in a path
pow({x}, {y}) Float {x} to the power of {y}
@@ -2011,7 +2208,8 @@ prevnonblank({lnum}) Number line nr of non-blank line <= {lnum}
printf({fmt}, {expr1}...) String format text
pumvisible() Number whether popup menu is visible
pyeval({expr}) any evaluate |Python| expression
-py3eval({expr}) any evaluate |python3| expression
+py3eval({expr}) any evaluate |python3| expression
+pyxeval({expr}) any evaluate |python_x| expression
range({expr} [, {max} [, {stride}]])
List items from {expr} to {max}
readfile({fname} [, {binary} [, {max}]])
@@ -2019,27 +2217,27 @@ readfile({fname} [, {binary} [, {max}]])
reltime([{start} [, {end}]]) List get time value
reltimefloat({time}) Float turn the time value into a Float
reltimestr({time}) String turn time value into a String
-remote_expr({server}, {string} [, {idvar}])
+remote_expr({server}, {string} [, {idvar} [, {timeout}]])
String send expression
remote_foreground({server}) Number bring Vim server to the foreground
remote_peek({serverid} [, {retvar}])
Number check for reply string
-remote_read({serverid}) String read reply string
+remote_read({serverid} [, {timeout}])
+ String read reply string
remote_send({server}, {string} [, {idvar}])
String send key sequence
-remove({list}, {idx} [, {end}]) any remove items {idx}-{end} from {list}
+remote_startserver({name}) none become server {name}
+remove({list}, {idx} [, {end}]) any remove items {idx}-{end} from {list}
remove({dict}, {key}) any remove entry {key} from {dict}
rename({from}, {to}) Number rename (move) file from {from} to {to}
-repeat({expr}, {count}) String repeat {expr} {count} times
+repeat({expr}, {count}) String repeat {expr} {count} times
resolve({filename}) String get filename a shortcut points to
-reverse({list}) List reverse {list} in-place
+reverse({list}) List reverse {list} in-place
round({expr}) Float round off {expr}
rpcnotify({channel}, {event}[, {args}...])
Sends an |RPC| notification to {channel}
rpcrequest({channel}, {method}[, {args}...])
Sends an |RPC| request to {channel}
-rpcstart({prog}[, {argv}]) Spawns {prog} and opens an |RPC| channel
-rpcstop({channel}) Closes an |RPC| {channel}
screenattr({row}, {col}) Number attribute at screen position
screenchar({row}, {col}) Number character at screen position
screencol() Number current cursor column
@@ -2061,12 +2259,12 @@ setbufvar({expr}, {varname}, {val}) set {varname} in buffer {expr} to {val}
setcharsearch({dict}) Dict set character search from {dict}
setcmdpos({pos}) Number set cursor position in command-line
setfperm({fname}, {mode} Number set {fname} file permissions to {mode}
-setline({lnum}, {line}) Number set line {lnum} to {line}
-setloclist({nr}, {list}[, {action}[, {title}]])
+setline({lnum}, {line}) Number set line {lnum} to {line}
+setloclist({nr}, {list}[, {action}[, {what}]])
Number modify location list using {list}
setmatches({list}) Number restore a list of matches
setpos({expr}, {list}) Number set the {expr} position to {list}
-setqflist({list}[, {action}[, {title}]]
+setqflist({list}[, {action}[, {what}]]
Number modify quickfix list using {list}
setreg({n}, {v}[, {opt}]) Number set register to value and type
settabvar({nr}, {varname}, {val}) set {varname} in tab page {nr} to {val}
@@ -2081,6 +2279,8 @@ shiftwidth() Number effective value of 'shiftwidth'
simplify({filename}) String simplify filename as much as possible
sin({expr}) Float sine of {expr}
sinh({expr}) Float hyperbolic sine of {expr}
+sockconnect({mode}, {address} [, {opts}])
+ Number Connects to socket
sort({list} [, {func} [, {dict}]])
List sort {list}, using {func} to compare
soundfold({word}) String sound-fold {word}
@@ -2090,22 +2290,27 @@ spellsuggest({word} [, {max} [, {capital}]])
split({expr} [, {pat} [, {keepempty}]])
List make |List| from {pat} separated {expr}
sqrt({expr}) Float square root of {expr}
+stdioopen({dict}) Number open stdio in a headless instance.
+stdpath({what}) String/List returns the standard path(s) for {what}
str2float({expr}) Float convert String to Float
str2nr({expr} [, {base}]) Number convert String to Number
strchars({expr} [, {skipcc}]) Number character length of the String {expr}
+strcharpart({str}, {start} [, {len}])
+ String {len} characters of {str} at {start}
strdisplaywidth({expr} [, {col}]) Number display length of the String {expr}
-strftime({format}[, {time}]) String time in specified format
-stridx({haystack}, {needle}[, {start}])
+strftime({format} [, {time}]) String time in specified format
+strgetchar({str}, {index}) Number get char {index} from {str}
+stridx({haystack}, {needle} [, {start}])
Number index of {needle} in {haystack}
string({expr}) String String representation of {expr} value
strlen({expr}) Number length of the String {expr}
-strpart({src}, {start}[, {len}])
- String {len} characters of {src} at {start}
+strpart({str}, {start} [, {len}])
+ String {len} characters of {str} at {start}
strridx({haystack}, {needle} [, {start}])
Number last index of {needle} in {haystack}
strtrans({expr}) String translate string to make it printable
strwidth({expr}) Number display cell length of the String {expr}
-submatch({nr}[, {list}]) String or List
+submatch({nr} [, {list}]) String or List
specific match in ":s" or substitute()
substitute({expr}, {pat}, {sub}, {flags})
String all {pat} in {expr} replaced with {sub}
@@ -2117,22 +2322,27 @@ synconcealed({lnum}, {col}) List info about concealing
synstack({lnum}, {col}) List stack of syntax IDs at {lnum} and {col}
system({cmd} [, {input}]) String output of shell command/filter {cmd}
systemlist({cmd} [, {input}]) List output of shell command/filter {cmd}
-tabpagebuflist([{arg}]) List list of buffer numbers in tab page
+tabpagebuflist([{arg}]) List list of buffer numbers in tab page
tabpagenr([{arg}]) Number number of current or last tab page
tabpagewinnr({tabarg}[, {arg}])
Number number of current window in tab page
-taglist({expr}) List list of tags matching {expr}
+taglist({expr}[, {filename}]) List list of tags matching {expr}
tagfiles() List tags files used
tan({expr}) Float tangent of {expr}
tanh({expr}) Float hyperbolic tangent of {expr}
tempname() String name for a temporary file
+test_garbagecollect_now() none free memory right now for testing
+timer_info([{id}]) List information about timers
+timer_pause({id}, {pause}) none pause or unpause a timer
timer_start({time}, {callback} [, {options}])
Number create a timer
timer_stop({timer}) none stop a timer
-tolower({expr}) String the String {expr} switched to lowercase
-toupper({expr}) String the String {expr} switched to uppercase
+timer_stopall() none stop all timers
+tolower({expr}) String the String {expr} switched to lowercase
+toupper({expr}) String the String {expr} switched to uppercase
tr({src}, {fromstr}, {tostr}) String translate chars of {src} in {fromstr}
to chars in {tostr}
+trim({text} [, {mask}]) String trim characters in {mask} from {text}
trunc({expr}) Float truncate Float {expr}
type({name}) Number type of variable {name}
undofile({name}) String undo file name for {name}
@@ -2140,14 +2350,20 @@ undotree() List undo file tree
uniq({list} [, {func} [, {dict}]])
List remove adjacent duplicates from a list
values({dict}) List values in {dict}
-virtcol({expr}) Number screen column of cursor or mark
+virtcol({expr}) Number screen column of cursor or mark
visualmode([expr]) String last visual mode used
wildmenumode() Number whether 'wildmenu' mode is active
+win_findbuf({bufnr}) List find windows containing {bufnr}
+win_getid([{win} [, {tab}]]) Number get |window-ID| for {win} in {tab}
+win_gotoid({expr}) Number go to |window-ID| {expr}
+win_id2tabwin({expr}) List get tab and window nr from |window-ID|
+win_id2win({expr}) Number get window nr from |window-ID|
+win_screenpos({nr}) List get screen position of window {nr}
winbufnr({nr}) Number buffer number of window {nr}
wincol() Number window column of the cursor
-winheight({nr}) Number height of window {nr}
+winheight({nr}) Number height of window {nr}
winline() Number window line of the cursor
-winnr([{expr}]) Number number of current window
+winnr([{expr}]) Number number of current window
winrestcmd() String returns command to restore window sizes
winrestview({dict}) none restore view of current window
winsaveview() Dict save view of current window
@@ -2155,7 +2371,7 @@ winwidth({nr}) Number width of window {nr}
wordcount() Dict get byte/char/word statistics
writefile({list}, {fname} [, {flags}])
Number write list of lines to file {fname}
-xor({expr}, {expr}) Number bitwise XOR
+xor({expr}, {expr}) Number bitwise XOR
abs({expr}) *abs()*
@@ -2200,15 +2416,13 @@ and({expr}, {expr}) *and()*
Example: >
:let flag = and(bits, 0x80)
-
api_info() *api_info()*
Returns Dictionary of |api-metadata|.
-
-append({lnum}, {expr}) *append()*
- When {expr} is a |List|: Append each item of the |List| as a
+append({lnum}, {text}) *append()*
+ When {text} is a |List|: Append each item of the |List| as a
text line below line {lnum} in the current buffer.
- Otherwise append {expr} as one text line below line {lnum} in
+ Otherwise append {text} as one text line below line {lnum} in
the current buffer.
{lnum} can be zero to insert a line before the first one.
Returns 1 for failure ({lnum} out of range or out of memory),
@@ -2235,6 +2449,7 @@ arglistid([{winnr} [, {tabnr}]])
With {winnr} only use this window in the current tab page.
With {winnr} and {tabnr} use the window in the specified tab
page.
+ {winnr} can be the window number or the |window-ID|.
*argv()*
argv([{nr}]) The result is the {nr}th file in the argument list of the
@@ -2277,23 +2492,64 @@ assert_exception({error} [, {msg}]) *assert_exception()*
call assert_exception('E492:')
endtry
-assert_fails({cmd} [, {error}]) *assert_fails()*
+assert_fails({cmd} [, {error} [, {msg}]]) *assert_fails()*
Run {cmd} and add an error message to |v:errors| if it does
NOT produce an error.
- When {error} is given it must match |v:errmsg|.
+ When {error} is given it must match in |v:errmsg|.
assert_false({actual} [, {msg}]) *assert_false()*
When {actual} is not false an error message is added to
|v:errors|, like with |assert_equal()|.
- A value is false when it is zero or |v:false|. When "{actual}"
+ A value is false when it is zero or |v:false|. When "{actual}"
is not a number or |v:false| the assert fails.
- When {msg} is omitted an error in the form "Expected False but
- got {actual}" is produced.
+ When {msg} is omitted an error in the form
+ "Expected False but got {actual}" is produced.
+
+assert_inrange({lower}, {upper}, {actual} [, {msg}]) *assert_inrange()*
+ This asserts number values. When {actual} is lower than
+ {lower} or higher than {upper} an error message is added to
+ |v:errors|.
+ When {msg} is omitted an error in the form
+ "Expected range {lower} - {upper}, but got {actual}" is
+ produced.
+
+ *assert_match()*
+assert_match({pattern}, {actual} [, {msg}])
+ When {pattern} does not match {actual} an error message is
+ added to |v:errors|.
+
+ {pattern} is used as with |=~|: The matching is always done
+ like 'magic' was set and 'cpoptions' is empty, no matter what
+ the actual value of 'magic' or 'cpoptions' is.
+
+ {actual} is used as a string, automatic conversion applies.
+ Use "^" and "$" to match with the start and end of the text.
+ Use both to match the whole text.
+
+ When {msg} is omitted an error in the form
+ "Pattern {pattern} does not match {actual}" is produced.
+ Example: >
+ assert_match('^f.*o$', 'foobar')
+< Will result in a string to be added to |v:errors|:
+ test.vim line 12: Pattern '^f.*o$' does not match 'foobar' ~
+
+ *assert_notequal()*
+assert_notequal({expected}, {actual} [, {msg}])
+ The opposite of `assert_equal()`: add an error message to
+ |v:errors| when {expected} and {actual} are equal.
+
+ *assert_notmatch()*
+assert_notmatch({pattern}, {actual} [, {msg}])
+ The opposite of `assert_match()`: add an error message to
+ |v:errors| when {pattern} matches {actual}.
+
+assert_report({msg}) *assert_report()*
+ Report a test failure directly, using {msg}.
assert_true({actual} [, {msg}]) *assert_true()*
When {actual} is not true an error message is added to
|v:errors|, like with |assert_equal()|.
- A value is true when it is a non-zero number or |v:true|.
+ A value is |TRUE| when it is a non-zero number or |v:true|.
When {actual} is not a number or |v:true| the assert fails.
When {msg} is omitted an error in the form "Expected True but
got {actual}" is produced.
@@ -2335,9 +2591,9 @@ atan2({expr1}, {expr2}) *atan2()*
*browse()*
browse({save}, {title}, {initdir}, {default})
Put up a file requester. This only works when "has("browse")"
- returns non-zero (only in some GUI versions).
+ returns |TRUE| (only in some GUI versions).
The input fields are:
- {save} when non-zero, select file to write
+ {save} when |TRUE|, select file to write
{title} title for the requester
{initdir} directory to start browsing in
{default} default file name
@@ -2347,7 +2603,7 @@ browse({save}, {title}, {initdir}, {default})
*browsedir()*
browsedir({title}, {initdir})
Put up a directory requester. This only works when
- "has("browse")" returns non-zero (only in some GUI versions).
+ "has("browse")" returns |TRUE| (only in some GUI versions).
On systems where a directory browser is not supported a file
browser is used. In that case: select a file in the directory
to be used.
@@ -2358,9 +2614,11 @@ browsedir({title}, {initdir})
browsing is not possible, an empty string is returned.
bufexists({expr}) *bufexists()*
- The result is a Number, which is non-zero if a buffer called
+ The result is a Number, which is |TRUE| if a buffer called
{expr} exists.
If the {expr} argument is a number, buffer numbers are used.
+ Number zero is the alternate buffer for the current window.
+
If the {expr} argument is a string it must match a buffer name
exactly. The name can be:
- Relative to the current directory.
@@ -2376,16 +2634,14 @@ bufexists({expr}) *bufexists()*
for MS-Windows 8.3 names in the form "c:\DOCUME~1"
Use "bufexists(0)" to test for the existence of an alternate
file name.
- *buffer_exists()*
- Obsolete name: buffer_exists().
buflisted({expr}) *buflisted()*
- The result is a Number, which is non-zero if a buffer called
+ The result is a Number, which is |TRUE| if a buffer called
{expr} exists and is listed (has the 'buflisted' option set).
The {expr} argument is used like with |bufexists()|.
bufloaded({expr}) *bufloaded()*
- The result is a Number, which is non-zero if a buffer called
+ The result is a Number, which is |TRUE| if a buffer called
{expr} exists and is loaded (shown in a window or hidden).
The {expr} argument is used like with |bufexists()|.
@@ -2416,8 +2672,6 @@ bufname({expr}) *bufname()*
bufname(3) name of buffer 3
bufname("%") name of current buffer
bufname("file2") name of buffer where "file2" matches.
-< *buffer_name()*
- Obsolete name: buffer_name().
*bufnr()*
bufnr({expr} [, {create}])
@@ -2433,10 +2687,16 @@ bufnr({expr} [, {create}])
of existing buffers. Note that not all buffers with a smaller
number necessarily exist, because ":bwipeout" may have removed
them. Use bufexists() to test for the existence of a buffer.
- *buffer_number()*
- Obsolete name: buffer_number().
- *last_buffer_nr()*
- Obsolete name for bufnr("$"): last_buffer_nr().
+
+bufwinid({expr}) *bufwinid()*
+ The result is a Number, which is the |window-ID| of the first
+ window associated with buffer {expr}. For the use of {expr},
+ see |bufname()| above. If buffer {expr} doesn't exist or
+ there is no such window, -1 is returned. Example: >
+
+ echo "A window containing buffer 1 is " . (bufwinid(1))
+<
+ Only deals with the current tab page.
bufwinnr({expr}) *bufwinnr()*
The result is a Number, which is the number of the first
@@ -2474,7 +2734,9 @@ byteidx({expr}, {nr}) *byteidx()*
same: >
let s = strpart(str, byteidx(str, 3))
echo strpart(s, 0, byteidx(s, 1))
-< If there are less than {nr} characters -1 is returned.
+< Also see |strgetchar()| and |strcharpart()|.
+
+ If there are less than {nr} characters -1 is returned.
If there are exactly {nr} characters the length of the string
in bytes is returned.
@@ -2488,8 +2750,6 @@ byteidxcomp({expr}, {nr}) *byteidxcomp()*
< The first and third echo result in 3 ('e' plus composing
character is 3 bytes), the second echo results in 1 ('e' is
one byte).
- Only works different from byteidx() when 'encoding' is set to
- a Unicode encoding.
call({func}, {arglist} [, {dict}]) *call()* *E699*
Call function {func} with the items in |List| {arglist} as
@@ -2500,21 +2760,6 @@ call({func}, {arglist} [, {dict}]) *call()* *E699*
{dict} is for functions with the "dict" attribute. It will be
used to set the local variable "self". |Dictionary-function|
-capture({command}) *capture()*
- Capture output of {command}.
- If {command} is a |String|, returns {command} output.
- If {command} is a |List|, returns concatenated outputs.
- Examples: >
- echo capture('echon "foo"')
-< foo >
- echo capture(['echon "foo"', 'echon "bar"'])
-< foobar
- This function is not available in the |sandbox|.
- Note: {command} executes as if prepended with |:silent|
- (output is collected, but not displayed). If nested, an outer
- capture() will not observe the output of inner calls.
- Note: Text attributes (highlights) are not captured.
-
ceil({expr}) *ceil()*
Return the smallest integral value greater than or equal to
{expr} as a |Float| (round up).
@@ -2535,15 +2780,44 @@ changenr() *changenr()*
redo it is the number of the redone change. After undo it is
one less than the number of the undone change.
-char2nr({expr}[, {utf8}]) *char2nr()*
+chanclose({id}[, {stream}]) *chanclose()*
+ Close a channel or a specific stream associated with it.
+ For a job, {stream} can be one of "stdin", "stdout",
+ "stderr" or "rpc" (closes stdin/stdout for a job started
+ with `"rpc":v:true`) If {stream} is omitted, all streams
+ are closed. If the channel is a pty, this will then close the
+ pty master, sending SIGHUP to the job process.
+ For a socket, there is only one stream, and {stream} should be
+ ommited.
+
+chansend({id}, {data}) *chansend()*
+ Send data to channel {id}. For a job, it writes it to the
+ stdin of the process. For the stdio channel |channel-stdio|,
+ it writes to Nvim's stdout. Returns the number of bytes
+ written if the write succeeded, 0 otherwise.
+ See |channel-bytes| for more information.
+
+ {data} may be a string, string convertible, or a list. If
+ {data} is a list, the items will be joined by newlines; any
+ newlines in an item will be sent as NUL. To send a final
+ newline, include a final empty string. Example: >
+ :call chansend(id, ["abc", "123\n456", ""])
+< will send "abc<NL>123<NUL>456<NL>".
+
+ chansend() writes raw data, not RPC messages. If the channel
+ was created with `"rpc":v:true` then the channel expects RPC
+ messages, use |rpcnotify()| and |rpcrequest()| instead.
+
+
+char2nr({expr} [, {utf8}]) *char2nr()*
Return number value of the first char in {expr}. Examples: >
char2nr(" ") returns 32
char2nr("ABC") returns 65
-< When {utf8} is omitted or zero, the current 'encoding' is used.
- Example for "utf-8": >
char2nr("รก") returns 225
char2nr("รก"[0]) returns 195
-< With {utf8} set to 1, always treat as utf-8 characters.
+< Non-ASCII characters are always treated as UTF-8 characters.
+ {utf8} has no effect, and exists only for
+ backwards-compatibility.
A combining character is a separate character.
|nr2char()| does the opposite.
@@ -2599,8 +2873,8 @@ col({expr}) The result is a Number, which is the byte index of the column
complete({startcol}, {matches}) *complete()* *E785*
Set the matches for Insert mode completion.
Can only be used in Insert mode. You need to use a mapping
- with CTRL-R = |i_CTRL-R|. It does not work after CTRL-O or
- with an expression mapping.
+ with CTRL-R = (see |i_CTRL-R|). It does not work after CTRL-O
+ or with an expression mapping.
{startcol} is the byte offset in the line where the completed
text start. The text up to the cursor is the original text
that will be replaced by the matches. Use col('.') for an
@@ -2637,7 +2911,7 @@ complete_add({expr}) *complete_add()*
complete_check() *complete_check()*
Check for a key typed while looking for completion matches.
This is to be used when looking for matches takes some time.
- Returns non-zero when searching for matches is to be aborted,
+ Returns |TRUE| when searching for matches is to be aborted,
zero otherwise.
Only to be used by the function specified with the
'completefunc' option.
@@ -2647,10 +2921,8 @@ confirm({msg} [, {choices} [, {default} [, {type}]]])
Confirm() offers the user a dialog, from which a choice can be
made. It returns the number of the choice. For the first
choice this is 1.
- Note: confirm() is only supported when compiled with dialog
- support, see |+dialog_con| and |+dialog_gui|.
- {msg} is displayed in a |dialog| with {choices} as the
+ {msg} is displayed in a dialog with {choices} as the
alternatives. When {choices} is missing or empty, "&OK" is
used (and translated).
{msg} is a String, use '\n' to include a newline. Only on
@@ -2728,11 +3000,16 @@ cosh({expr}) *cosh()*
count({comp}, {expr} [, {ic} [, {start}]]) *count()*
Return the number of times an item with value {expr} appears
- in |List| or |Dictionary| {comp}.
+ in |String|, |List| or |Dictionary| {comp}.
+
If {start} is given then start with the item with this index.
{start} can only be used with a |List|.
- When {ic} is given and it's non-zero then case is ignored.
+ When {ic} is given and it's |TRUE| then case is ignored.
+
+ When {comp} is a string then the number of not overlapping
+ occurrences of {expr} is returned. Zero is returned when
+ {expr} is an empty string.
*cscope_connection()*
cscope_connection([{num} , {dbpath} [, {prepend}]])
@@ -2834,6 +3111,8 @@ delete({fname} [, {flags}]) *delete()*
When {flags} is "rf": Deletes the directory by the name
{fname} and everything in it, recursively. BE CAREFUL!
+ Note: on MS-Windows it is not possible to delete a directory
+ that is being used.
The result is a Number, which is 0 if the delete operation was
successful and -1 when the deletion failed or partly failed.
@@ -2884,10 +3163,11 @@ dictwatcherdel({dict}, {pattern}, {callback}) *dictwatcherdel()*
order for the watcher to be successfully deleted.
*did_filetype()*
-did_filetype() Returns non-zero when autocommands are being executed and the
+did_filetype() Returns |TRUE| when autocommands are being executed and the
FileType event has been triggered at least once. Can be used
to avoid triggering the FileType event again in the scripts
that detect the file type. |FileType|
+ Returns |FALSE| when `:setf FALLBACK` was used.
When editing another file, the counter is reset, thus this
really checks if the FileType event has been triggered for the
current buffer. This allows an autocommand that starts
@@ -2917,7 +3197,7 @@ diff_hlID({lnum}, {col}) *diff_hlID()*
empty({expr}) *empty()*
Return the Number 1 if {expr} is empty, zero otherwise.
A |List| or |Dictionary| is empty when it does not have any
- items. A Number is empty when its value is zero. Special
+ items. A Number is empty when its value is zero. Special
variable is empty when it is |v:false| or |v:null|.
escape({string}, {chars}) *escape()*
@@ -2958,26 +3238,52 @@ executable({expr}) *executable()*
On Windows it only checks if the file exists and
is not a directory, not if it's really executable.
On Windows an executable in the same directory as Vim is
- always found. Since this directory is added to $PATH it
- should also work to execute it |win32-PATH|.
+ always found (it is added to $PATH at |startup|).
The result is a Number:
1 exists
0 does not exist
-1 not implemented on this system
+ |exepath()| can be used to get the full path of an executable.
+
+execute({command} [, {silent}]) *execute()*
+ Execute {command} and capture its output.
+ If {command} is a |String|, returns {command} output.
+ If {command} is a |List|, returns concatenated outputs.
+ Examples: >
+ echo execute('echon "foo"')
+< foo >
+ echo execute(['echon "foo"', 'echon "bar"'])
+< foobar
+
+ The optional {silent} argument can have these values:
+ "" no `:silent` used
+ "silent" `:silent` used
+ "silent!" `:silent!` used
+ The default is "silent". Note that with "silent!", unlike
+ `:redir`, error messages are dropped.
+
+ To get a list of lines use |split()| on the result: >
+ split(execute('args'), "\n")
+
+< This function is not available in the |sandbox|.
+ Note: If nested, an outer execute() will not observe output of
+ the inner calls.
+ Note: Text attributes (highlights) are not captured.
exepath({expr}) *exepath()*
- If {expr} is an executable and is either an absolute path, a
- relative path or found in $PATH, return the full path.
- Note that the current directory is used when {expr} starts
- with "./", which may be a problem for Vim: >
- echo exepath(v:progpath)
-< If {expr} cannot be found in $PATH or is not executable then
- an empty string is returned.
+ Returns the full path of {expr} if it is an executable and
+ given as a (partial or full) path or is found in $PATH.
+ Returns empty string otherwise.
+ If {expr} starts with "./" the |current-directory| is used.
*exists()*
-exists({expr}) The result is a Number, which is non-zero if {expr} is
- defined, zero otherwise. The {expr} argument is a string,
- which contains one of these:
+exists({expr}) The result is a Number, which is |TRUE| if {expr} is
+ defined, zero otherwise.
+
+ For checking for a supported feature use |has()|.
+ For checking if a file exists use |filereadable()|.
+
+ The {expr} argument is a string, which contains one of these:
&option-name Vim option (only checks if it exists,
not if it really works)
+option-name Vim option that works.
@@ -3025,7 +3331,6 @@ exists({expr}) The result is a Number, which is non-zero if {expr} is
event and pattern.
##event autocommand for this event is
supported.
- For checking for a supported feature use |has()|.
Examples: >
exists("&mouse")
@@ -3071,11 +3376,9 @@ expand({expr} [, {nosuf} [, {list}]]) *expand()*
Expand wildcards and the following special keywords in {expr}.
'wildignorecase' applies.
- If {list} is given and it is non-zero, a List will be returned.
+ If {list} is given and it is |TRUE|, a List will be returned.
Otherwise the result is a String and when there are several
- matches, they are separated by <NL> characters. [Note: in
- version 5.0 a space was used, which caused problems when a
- file name contains a space]
+ matches, they are separated by <NL> characters.
If the expansion fails, the result is an empty string. A name
for a non-existing file is not included, unless {expr} does
@@ -3130,13 +3433,13 @@ expand({expr} [, {nosuf} [, {list}]]) *expand()*
When {expr} does not start with '%', '#' or '<', it is
expanded like a file name is expanded on the command line.
'suffixes' and 'wildignore' are used, unless the optional
- {nosuf} argument is given and it is non-zero.
+ {nosuf} argument is given and it is |TRUE|.
Names for non-existing files are included. The "**" item can
be used to search in a directory tree. For example, to find
all "README" files in the current directory and below: >
:echo expand("**/README")
<
- Expand() can also be used to expand variables and environment
+ expand() can also be used to expand variables and environment
variables that are only known in a shell. But this can be
slow, because a shell may be used to do the expansion. See
|expr-env-expand|.
@@ -3215,17 +3518,19 @@ feedkeys({string} [, {mode}]) *feedkeys()*
will behave as if <Esc> is typed, to avoid getting
stuck, waiting for a character to be typed before the
script continues.
+ '!' When used with 'x' will not end Insert mode. Can be
+ used in a test when a timer is set to exit Insert mode
+ a little later. Useful for testing CursorHoldI.
+
Return value is always 0.
filereadable({file}) *filereadable()*
- The result is a Number, which is TRUE when a file with the
+ The result is a Number, which is |TRUE| when a file with the
name {file} exists, and can be read. If {file} doesn't exist,
- or is a directory, the result is FALSE. {file} is any
+ or is a directory, the result is |FALSE|. {file} is any
expression, which is used as a String.
If you don't care about the file being readable you can use
|glob()|.
- *file_readable()*
- Obsolete name: file_readable().
filewritable({file}) *filewritable()*
@@ -3235,34 +3540,55 @@ filewritable({file}) *filewritable()*
directory, and we can write to it, the result is 2.
-filter({expr}, {string}) *filter()*
- {expr} must be a |List| or a |Dictionary|.
- For each item in {expr} evaluate {string} and when the result
+filter({expr1}, {expr2}) *filter()*
+ {expr1} must be a |List| or a |Dictionary|.
+ For each item in {expr1} evaluate {expr2} and when the result
is zero remove the item from the |List| or |Dictionary|.
- Inside {string} |v:val| has the value of the current item.
+ {expr2} must be a |string| or |Funcref|.
+
+ If {expr2} is a |string|, inside {expr2} |v:val| has the value
+ of the current item. For a |Dictionary| |v:key| has the key
+ of the current item and for a |List| |v:key| has the index of
+ the current item.
For a |Dictionary| |v:key| has the key of the current item.
Examples: >
- :call filter(mylist, 'v:val !~ "OLD"')
+ call filter(mylist, 'v:val !~ "OLD"')
< Removes the items where "OLD" appears. >
- :call filter(mydict, 'v:key >= 8')
+ call filter(mydict, 'v:key >= 8')
< Removes the items with a key below 8. >
- :call filter(var, 0)
+ call filter(var, 0)
< Removes all the items, thus clears the |List| or |Dictionary|.
- Note that {string} is the result of expression and is then
+ Note that {expr2} is the result of expression and is then
used as an expression again. Often it is good to use a
|literal-string| to avoid having to double backslashes.
+ If {expr2} is a |Funcref| it must take two arguments:
+ 1. the key or the index of the current item.
+ 2. the value of the current item.
+ The function must return |TRUE| if the item should be kept.
+ Example that keeps the odd items of a list: >
+ func Odd(idx, val)
+ return a:idx % 2 == 1
+ endfunc
+ call filter(mylist, function('Odd'))
+< It is shorter when using a |lambda|: >
+ call filter(myList, {idx, val -> idx * val <= 42})
+< If you do not use "val" you can leave it out: >
+ call filter(myList, {idx -> idx % 2 == 1})
+<
The operation is done in-place. If you want a |List| or
|Dictionary| to remain unmodified make a copy first: >
:let l = filter(copy(mylist), 'v:val =~ "KEEP"')
-< Returns {expr}, the |List| or |Dictionary| that was filtered.
- When an error is encountered while evaluating {string} no
- further items in {expr} are processed.
+< Returns {expr1}, the |List| or |Dictionary| that was filtered.
+ When an error is encountered while evaluating {expr2} no
+ further items in {expr1} are processed. When {expr2} is a
+ Funcref errors inside a function are ignored, unless it was
+ defined with the "abort" flag.
-finddir({name}[, {path}[, {count}]]) *finddir()*
+finddir({name} [, {path} [, {count}]]) *finddir()*
Find directory {name} in {path}. Supports both downwards and
upwards recursive directory searches. See |file-searching|
for the syntax of {path}.
@@ -3277,7 +3603,7 @@ finddir({name}[, {path}[, {count}]]) *finddir()*
{only available when compiled with the |+file_in_path|
feature}
-findfile({name}[, {path}[, {count}]]) *findfile()*
+findfile({name} [, {path} [, {count}]]) *findfile()*
Just like |finddir()|, but find a file instead of a directory.
Uses 'suffixesadd'.
Example: >
@@ -3290,17 +3616,19 @@ float2nr({expr}) *float2nr()*
decimal point.
{expr} must evaluate to a |Float| or a Number.
When the value of {expr} is out of range for a |Number| the
- result is truncated to 0x7fffffff or -0x7fffffff. NaN results
- in -0x80000000.
+ result is truncated to 0x7fffffff or -0x7fffffff (or when
+ 64-bit Number support is enabled, 0x7fffffffffffffff or
+ -0x7fffffffffffffff. NaN results in -0x80000000 (or when
+ 64-bit Number support is enabled, -0x8000000000000000).
Examples: >
echo float2nr(3.95)
< 3 >
echo float2nr(-23.45)
< -23 >
echo float2nr(1.0e100)
-< 2147483647 >
+< 2147483647 (or 9223372036854775807) >
echo float2nr(-1.0e150)
-< -2147483647 >
+< -2147483647 (or -9223372036854775807) >
echo float2nr(1.0e-100)
< 0
@@ -3386,11 +3714,14 @@ foldtext() Returns a String, to be displayed for a closed fold. This is
|v:foldstart|, |v:foldend| and |v:folddashes| variables.
The returned string looks like this: >
+-- 45 lines: abcdef
-< The number of dashes depends on the foldlevel. The "45" is
- the number of lines in the fold. "abcdef" is the text in the
- first non-blank line of the fold. Leading white space, "//"
- or "/*" and the text from the 'foldmarker' and 'commentstring'
- options is removed.
+< The number of leading dashes depends on the foldlevel. The
+ "45" is the number of lines in the fold. "abcdef" is the text
+ in the first non-blank line of the fold. Leading white space,
+ "//" or "/*" and the text from the 'foldmarker' and
+ 'commentstring' options is removed.
+ When used to draw the actual foldtext, the rest of the line
+ will be filled with the fold char from the 'fillchars'
+ setting.
{not available when compiled without the |+folding| feature}
foldtextresult({lnum}) *foldtextresult()*
@@ -3411,26 +3742,87 @@ foreground() Move the Vim window to the foreground. Useful when sent from
|remote_foreground()| instead.
{only in the Win32 GUI and console version}
+ *funcref()*
+funcref({name} [, {arglist}] [, {dict}])
+ Just like |function()|, but the returned Funcref will lookup
+ the function by reference, not by name. This matters when the
+ function {name} is redefined later.
+
+ Unlike |function()|, {name} must be an existing user function.
+ Also for autoloaded functions. {name} cannot be a builtin
+ function.
-function({name}) *function()* *E700*
+ *function()* *E700* *E922* *E923*
+function({name} [, {arglist}] [, {dict}])
Return a |Funcref| variable that refers to function {name}.
{name} can be a user defined function or an internal function.
+ {name} can also be a Funcref or a partial. When it is a
+ partial the dict stored in it will be used and the {dict}
+ argument is not allowed. E.g.: >
+ let FuncWithArg = function(dict.Func, [arg])
+ let Broken = function(dict.Func, [arg], dict)
+<
+ When using the Funcref the function will be found by {name},
+ also when it was redefined later. Use |funcref()| to keep the
+ same function.
+
+ When {arglist} or {dict} is present this creates a partial.
+ That mans the argument list and/or the dictionary is stored in
+ the Funcref and will be used when the Funcref is called.
+
+ The arguments are passed to the function in front of other
+ arguments. Example: >
+ func Callback(arg1, arg2, name)
+ ...
+ let Func = function('Callback', ['one', 'two'])
+ ...
+ call Func('name')
+< Invokes the function as with: >
+ call Callback('one', 'two', 'name')
+
+< The Dictionary is only useful when calling a "dict" function.
+ In that case the {dict} is passed in as "self". Example: >
+ function Callback() dict
+ echo "called for " . self.name
+ endfunction
+ ...
+ let context = {"name": "example"}
+ let Func = function('Callback', context)
+ ...
+ call Func() " will echo: called for example
+
+< The argument list and the Dictionary can be combined: >
+ function Callback(arg1, count) dict
+ ...
+ let context = {"name": "example"}
+ let Func = function('Callback', ['one'], context)
+ ...
+ call Func(500)
+< Invokes the function as with: >
+ call context.Callback('one', 500)
+
garbagecollect([{atexit}]) *garbagecollect()*
Cleanup unused |Lists| and |Dictionaries| that have circular
- references. There is hardly ever a need to invoke this
- function, as it is automatically done when Vim runs out of
- memory or is waiting for the user to press a key after
- 'updatetime'. Items without circular references are always
- freed when they become unused.
+ references.
+
+ There is hardly ever a need to invoke this function, as it is
+ automatically done when Vim runs out of memory or is waiting
+ for the user to press a key after 'updatetime'. Items without
+ circular references are always freed when they become unused.
This is useful if you have deleted a very big |List| and/or
|Dictionary| with circular references in a script that runs
for a long time.
+
When the optional {atexit} argument is one, garbage
collection will also be done when exiting Vim, if it wasn't
done before. This is useful when checking for memory leaks.
+ The garbage collection is not done immediately but only when
+ it's safe to perform. This is when waiting for the user to
+ type a character.
+
get({list}, {idx} [, {default}]) *get()*
Get item {idx} from |List| {list}. When this item is not
available return {default}. Return zero when {default} is
@@ -3439,7 +3831,68 @@ get({dict}, {key} [, {default}])
Get item with key {key} from |Dictionary| {dict}. When this
item is not available return {default}. Return zero when
{default} is omitted.
+get({func}, {what})
+ Get item {what} from Funcref {func}. Possible values for
+ {what} are:
+ "name" The function name
+ "func" The function
+ "dict" The dictionary
+ "args" The list with arguments
+
+ *getbufinfo()*
+getbufinfo([{expr}])
+getbufinfo([{dict}])
+ Get information about buffers as a List of Dictionaries.
+
+ Without an argument information about all the buffers is
+ returned.
+
+ When the argument is a Dictionary only the buffers matching
+ the specified criteria are returned. The following keys can
+ be specified in {dict}:
+ buflisted include only listed buffers.
+ bufloaded include only loaded buffers.
+
+ Otherwise, {expr} specifies a particular buffer to return
+ information for. For the use of {expr}, see |bufname()|
+ above. If the buffer is found the returned List has one item.
+ Otherwise the result is an empty list.
+
+ Each returned List item is a dictionary with the following
+ entries:
+ bufnr buffer number.
+ changed TRUE if the buffer is modified.
+ changedtick number of changes made to the buffer.
+ hidden TRUE if the buffer is hidden.
+ listed TRUE if the buffer is listed.
+ lnum current line number in buffer.
+ loaded TRUE if the buffer is loaded.
+ name full path to the file in the buffer.
+ signs list of signs placed in the buffer.
+ Each list item is a dictionary with
+ the following fields:
+ id sign identifier
+ lnum line number
+ name sign name
+ variables a reference to the dictionary with
+ buffer-local variables.
+ windows list of |window-ID|s that display this
+ buffer
+ Examples: >
+ for buf in getbufinfo()
+ echo buf.name
+ endfor
+ for buf in getbufinfo({'buflisted':1})
+ if buf.changed
+ ....
+ endif
+ endfor
+<
+ To get buffer-local options use: >
+ getbufvar({bufnr}, '&option_name')
+
+<
*getbufline()*
getbufline({expr}, {lnum} [, {end}])
Return a |List| with the lines starting from {lnum} to {end}
@@ -3471,6 +3924,10 @@ getbufvar({expr}, {varname} [, {def}]) *getbufvar()*
must be used.
When {varname} is empty returns a dictionary with all the
buffer-local variables.
+ When {varname} is equal to "&" returns a dictionary with all
+ the buffer-local options.
+ Otherwise, when {varname} starts with "&" returns the value of
+ a buffer-local option.
This also works for a global or buffer-local option, but it
doesn't work for a global variable, window-local variable or
window-local option.
@@ -3511,8 +3968,8 @@ getchar([expr]) *getchar()*
When the user clicks a mouse button, the mouse event will be
returned. The position can then be found in |v:mouse_col|,
- |v:mouse_lnum| and |v:mouse_win|. This example positions the
- mouse as it would normally happen: >
+ |v:mouse_lnum|, |v:mouse_winid| and |v:mouse_win|. This
+ example positions the mouse as it would normally happen: >
let c = getchar()
if c == "\<LeftMouse>" && v:mouse_win > 0
exe v:mouse_win . "wincmd w"
@@ -3594,6 +4051,8 @@ getcmdline() *getcmdline()*
Example: >
:cmap <F7> <C-\>eescape(getcmdline(), ' \')<CR>
< Also see |getcmdtype()|, |getcmdpos()| and |setcmdpos()|.
+ Returns an empty string when entering a password or using
+ |inputsecret()|.
getcmdpos() *getcmdpos()*
Return the position of the cursor in the command line as a
@@ -3623,17 +4082,72 @@ getcmdwintype() *getcmdwintype()*
values are the same as |getcmdtype()|. Returns an empty string
when not in the command-line window.
+getcompletion({pat}, {type} [, {filtered}]) *getcompletion()*
+ Return a list of command-line completion matches. {type}
+ specifies what for. The following completion types are
+ supported:
+
+ arglist file names in argument list
+ augroup autocmd groups
+ buffer buffer names
+ behave :behave suboptions
+ cmdline |cmdline-completion|
+ color color schemes
+ command Ex command (and arguments)
+ compiler compilers
+ cscope |:cscope| suboptions
+ dir directory names
+ environment environment variable names
+ event autocommand events
+ expression Vim expression
+ file file and directory names
+ file_in_path file and directory names in |'path'|
+ filetype filetype names |'filetype'|
+ function function name
+ help help subjects
+ highlight highlight groups
+ history :history suboptions
+ locale locale names (as output of locale -a)
+ mapclear buffer argument
+ mapping mapping name
+ menu menus
+ messages |:messages| suboptions
+ option options
+ packadd optional package |pack-add| names
+ shellcmd Shell command
+ sign |:sign| suboptions
+ syntax syntax file names |'syntax'|
+ syntime |:syntime| suboptions
+ tag tags
+ tag_listfiles tags, file names
+ user user names
+ var user variables
+
+ If {pat} is an empty string then all matches are returned.
+ Otherwise only items matching {pat} are returned. See
+ |wildcards| for the use of special characters in {pat}.
+
+ If the optional {filtered} flag is set to 1, then 'wildignore'
+ is applied to filter the results. Otherwise all the matches
+ are returned. The 'wildignorecase' option always applies.
+
+ If there are no matches, an empty list is returned. An
+ invalid value for {type} produces an error.
+
*getcurpos()*
getcurpos() Get the position of the cursor. This is like getpos('.'), but
includes an extra item in the list:
[bufnum, lnum, col, off, curswant] ~
- The "curswant" number is the preferred column when moving the
- cursor vertically.
- This can be used to save and restore the cursor position: >
- let save_cursor = getcurpos()
- MoveTheCursorAround
- call setpos('.', save_cursor)
-<
+ The "curswant" number is the preferred column when moving the
+ cursor vertically. Also see |getpos()|.
+
+ This can be used to save and restore the cursor position: >
+ let save_cursor = getcurpos()
+ MoveTheCursorAround
+ call setpos('.', save_cursor)
+< Note that this only works within the window. See
+ |winrestview()| for restoring more state.
+
getcwd([{winnr}[, {tabnr}]]) *getcwd()*
With no arguments the result is a String, which is the name of
the current effective working directory. With {winnr} or
@@ -3645,6 +4159,7 @@ getcwd([{winnr}[, {tabnr}]]) *getcwd()*
getcwd(0)
getcwd(0, 0)
< If {winnr} is -1 it is ignored, only the tab is resolved.
+ {winnr} can be the window number or the |window-ID|.
getfsize({fname}) *getfsize()*
@@ -3709,8 +4224,7 @@ getftype({fname}) *getftype()*
getftype("/home")
< Note that a type such as "link" will only be returned on
systems that support it. On some systems only "dir" and
- "file" are returned. On MS-Windows a symbolic link to a
- directory returns "dir" instead of "link".
+ "file" are returned.
*getline()*
getline({lnum} [, {end}])
@@ -3737,13 +4251,19 @@ getline({lnum} [, {end}])
< To get lines from another buffer see |getbufline()|
-getloclist({nr}) *getloclist()*
+getloclist({nr},[, {what}]) *getloclist()*
Returns a list with all the entries in the location list for
- window {nr}. When {nr} is zero the current window is used.
+ window {nr}. {nr} can be the window number or the |window-ID|.
+ When {nr} is zero the current window is used.
+
For a location list window, the displayed location list is
returned. For an invalid window number {nr}, an empty list is
returned. Otherwise, same as |getqflist()|.
+ If the optional {what} dictionary argument is supplied, then
+ returns the items listed in {what} as a dictionary. Refer to
+ |getqflist()| for the supported items in {what}.
+
getmatches() *getmatches()*
Returns a |List| with all matches previously defined by
|matchadd()| and the |:match| commands. |getmatches()| is
@@ -3793,22 +4313,23 @@ getpos({expr}) Get the position for {expr}. For possible values of {expr}
< Also see |getcurpos()| and |setpos()|.
-getqflist() *getqflist()*
+getqflist([{what}]) *getqflist()*
Returns a list with all the current quickfix errors. Each
list item is a dictionary with these entries:
bufnr number of buffer that has the file name, use
bufname() to get the name
+ module module name
lnum line number in the buffer (first line is 1)
col column number (first column is 1)
- vcol non-zero: "col" is visual column
- zero: "col" is byte index
+ vcol |TRUE|: "col" is visual column
+ |FALSE|: "col" is byte index
nr error number
pattern search pattern used to locate the error
text description of the error
type type of the error, 'E', '1', etc.
- valid non-zero: recognized error message
+ valid |TRUE|: recognized error message
- When there is no error list or it's empty an empty list is
+ When there is no error list or it's empty, an empty list is
returned. Quickfix list entries with non-existing buffer
number are returned with "bufnr" set to zero.
@@ -3818,22 +4339,86 @@ getqflist() *getqflist()*
:for d in getqflist()
: echo bufname(d.bufnr) ':' d.lnum '=' d.text
:endfor
-
-
+<
+ If the optional {what} dictionary argument is supplied, then
+ returns only the items listed in {what} as a dictionary. The
+ following string items are supported in {what}:
+ changedtick get the total number of changes made
+ to the list |quickfix-changedtick|
+ context get the |quickfix-context|
+ efm errorformat to use when parsing "lines". If
+ not present, then the 'errorformat' option
+ value is used.
+ id get information for the quickfix list with
+ |quickfix-ID|; zero means the id for the
+ current list or the list specified by "nr"
+ idx index of the current entry in the list
+ items quickfix list entries
+ lines parse a list of lines using 'efm' and return
+ the resulting entries. Only a |List| type is
+ accepted. The current quickfix list is not
+ modified. See |quickfix-parse|.
+ nr get information for this quickfix list; zero
+ means the current quickfix list and "$" means
+ the last quickfix list
+ size number of entries in the quickfix list
+ title get the list title |quickfix-title|
+ winid get the quickfix |window-ID|
+ all all of the above quickfix properties
+ Non-string items in {what} are ignored. To get the value of a
+ particular item, set it to zero.
+ If "nr" is not present then the current quickfix list is used.
+ If both "nr" and a non-zero "id" are specified, then the list
+ specified by "id" is used.
+ To get the number of lists in the quickfix stack, set "nr" to
+ "$" in {what}. The "nr" value in the returned dictionary
+ contains the quickfix stack size.
+ When "lines" is specified, all the other items except "efm"
+ are ignored. The returned dictionary contains the entry
+ "items" with the list of entries.
+
+ The returned dictionary contains the following entries:
+ changedtick total number of changes made to the
+ list |quickfix-changedtick|
+ context quickfix list context. See |quickfix-context|
+ If not present, set to "".
+ id quickfix list ID |quickfix-ID|. If not
+ present, set to 0.
+ idx index of the current entry in the list. If not
+ present, set to 0.
+ items quickfix list entries. If not present, set to
+ an empty list.
+ nr quickfix list number. If not present, set to 0
+ size number of entries in the quickfix list. If not
+ present, set to 0.
+ title quickfix list title text. If not present, set
+ to "".
+ winid quickfix |window-ID|. If not present, set to 0
+
+ Examples (See also |getqflist-examples|): >
+ :echo getqflist({'all': 1})
+ :echo getqflist({'nr': 2, 'title': 1})
+ :echo getqflist({'lines' : ["F1:10:L10"]})
+<
getreg([{regname} [, 1 [, {list}]]]) *getreg()*
The result is a String, which is the contents of register
{regname}. Example: >
:let cliptext = getreg('*')
-< getreg('=') returns the last evaluated value of the expression
+< When {regname} was not set the result is an empty string.
+
+ getreg('=') returns the last evaluated value of the expression
register. (For use in maps.)
getreg('=', 1) returns the expression itself, so that it can
be restored with |setreg()|. For other registers the extra
argument is ignored, thus you can always give it.
- If {list} is present and non-zero result type is changed to
- |List|. Each list item is one text line. Use it if you care
+
+ If {list} is present and |TRUE|, the result type is changed
+ to |List|. Each list item is one text line. Use it if you care
about zero bytes possibly present inside register: without
third argument both NLs and zero bytes are represented as NLs
(see |NL-used-for-Nul|).
+ When the register was not set an empty list is returned.
+
If {regname} is not specified, |v:register| is used.
@@ -3847,6 +4432,19 @@ getregtype([{regname}]) *getregtype()*
<CTRL-V> is one character with value 0x16.
If {regname} is not specified, |v:register| is used.
+gettabinfo([{arg}]) *gettabinfo()*
+ If {arg} is not specified, then information about all the tab
+ pages is returned as a List. Each List item is a Dictionary.
+ Otherwise, {arg} specifies the tab page number and information
+ about that one is returned. If the tab page does not exist an
+ empty List is returned.
+
+ Each List item is a Dictionary with the following entries:
+ tabnr tab page number.
+ variables a reference to the dictionary with
+ tabpage-local variables
+ windows List of |window-ID|s in the tag page.
+
gettabvar({tabnr}, {varname} [, {def}]) *gettabvar()*
Get the value of a tab-local variable {varname} in tab page
{tabnr}. |t:var|
@@ -3860,13 +4458,16 @@ gettabvar({tabnr}, {varname} [, {def}]) *gettabvar()*
gettabwinvar({tabnr}, {winnr}, {varname} [, {def}]) *gettabwinvar()*
Get the value of window-local variable {varname} in window
{winnr} in tab page {tabnr}.
- When {varname} starts with "&" get the value of a window-local
- option.
When {varname} is empty a dictionary with all window-local
variables is returned.
+ When {varname} is equal to "&" get the values of all
+ window-local options in a Dictionary.
+ Otherwise, when {varname} starts with "&" get the value of a
+ window-local option.
Note that {varname} must be the name without "w:".
Tabs are numbered starting with one. For the current tabpage
use |getwinvar()|.
+ {winnr} can be the window number or the |window-ID|.
When {winnr} is zero the current window is used.
This also works for a global option, buffer-local option and
window-local option, but it doesn't work for a global variable
@@ -3877,15 +4478,46 @@ gettabwinvar({tabnr}, {winnr}, {varname} [, {def}]) *gettabwinvar()*
:let list_is_on = gettabwinvar(1, 2, '&list')
:echo "myvar = " . gettabwinvar(3, 1, 'myvar')
<
+ To obtain all window-local variables use: >
+ gettabwinvar({tabnr}, {winnr}, '&')
+
*getwinposx()*
getwinposx() The result is a Number, which is the X coordinate in pixels of
the left hand side of the GUI Vim window. The result will be
-1 if the information is not available.
+ The value can be used with `:winpos`.
*getwinposy()*
getwinposy() The result is a Number, which is the Y coordinate in pixels of
the top of the GUI Vim window. The result will be -1 if the
information is not available.
+ The value can be used with `:winpos`.
+
+getwininfo([{winid}]) *getwininfo()*
+ Returns information about windows as a List with Dictionaries.
+
+ If {winid} is given Information about the window with that ID
+ is returned. If the window does not exist the result is an
+ empty list.
+
+ Without {winid} information about all the windows in all the
+ tab pages is returned.
+
+ Each List item is a Dictionary with the following entries:
+ bufnr number of buffer in the window
+ height window height (excluding winbar)
+ loclist 1 if showing a location list
+ quickfix 1 if quickfix or location list window
+ tabnr tab page number
+ variables a reference to the dictionary with
+ window-local variables
+ width window width
+ winbar 1 if the window has a toolbar, 0
+ otherwise
+ wincol leftmost screen column of the window
+ winid |window-ID|
+ winnr window number
+ winrow topmost screen column of the window
getwinvar({winnr}, {varname} [, {def}]) *getwinvar()*
Like |gettabwinvar()| for the current tabpage.
@@ -3897,13 +4529,13 @@ glob({expr} [, {nosuf} [, {list} [, {alllinks}]]]) *glob()*
Expand the file wildcards in {expr}. See |wildcards| for the
use of special characters.
- Unless the optional {nosuf} argument is given and is non-zero,
+ Unless the optional {nosuf} argument is given and is |TRUE|,
the 'suffixes' and 'wildignore' options apply: Names matching
one of the patterns in 'wildignore' will be skipped and
'suffixes' affect the ordering of matches.
'wildignorecase' always applies.
- When {list} is present and it is non-zero the result is a List
+ When {list} is present and it is |TRUE| the result is a List
with all matching files. The advantage of using a List is,
you also get filenames containing newlines correctly.
Otherwise the result is a String and when there are several
@@ -3914,7 +4546,7 @@ glob({expr} [, {nosuf} [, {list} [, {alllinks}]]]) *glob()*
A name for a non-existing file is not included. A symbolic
link is only included if it points to an existing file.
However, when the {alllinks} argument is present and it is
- non-zero then all symbolic links are included.
+ |TRUE| then all symbolic links are included.
For most systems backticks can be used to get files names from
any external command. Example: >
@@ -3935,6 +4567,8 @@ glob2regpat({expr}) *glob2regpat()*
if filename =~ '^Make.*\.mak$'
< When {expr} is an empty string the result is "^$", match an
empty string.
+ Note that the result depends on the system. On MS-Windows
+ a backslash usually means a patch separator.
*globpath()*
globpath({path}, {expr} [, {nosuf} [, {list} [, {allinks}]]])
@@ -3951,12 +4585,12 @@ globpath({path}, {expr} [, {nosuf} [, {list} [, {allinks}]]])
If the expansion fails for one of the directories, there is no
error message.
- Unless the optional {nosuf} argument is given and is non-zero,
+ Unless the optional {nosuf} argument is given and is |TRUE|,
the 'suffixes' and 'wildignore' options apply: Names matching
one of the patterns in 'wildignore' will be skipped and
'suffixes' affect the ordering of matches.
- When {list} is present and it is non-zero the result is a List
+ When {list} is present and it is |TRUE| the result is a List
with all matching files. The advantage of using a List is, you
also get filenames containing newlines correctly. Otherwise
the result is a String and when there are several matches,
@@ -3984,9 +4618,8 @@ has_key({dict}, {key}) *has_key()*
an entry with key {key}. Zero otherwise.
haslocaldir([{winnr}[, {tabnr}]]) *haslocaldir()*
- The result is a Number, which is 1 when the specified tabpage
- or window has a local path set via |:lcd| or |:tcd|, and
- 0 otherwise.
+ The result is a Number, which is 1 when the tabpage or window
+ has set a local path via |:tcd| or |:lcd|, otherwise 0.
Tabs and windows are identified by their respective numbers,
0 means current tab or window. Missing argument implies 0.
@@ -3994,14 +4627,17 @@ haslocaldir([{winnr}[, {tabnr}]]) *haslocaldir()*
haslocaldir()
haslocaldir(0)
haslocaldir(0, 0)
-< If {winnr} is -1 it is ignored, only the tab is resolved.
+< With {winnr} use that window in the current tabpage.
+ With {winnr} and {tabnr} use the window in that tabpage.
+ {winnr} can be the window number or the |window-ID|.
+ If {winnr} is -1 it is ignored, only the tab is resolved.
hasmapto({what} [, {mode} [, {abbr}]]) *hasmapto()*
The result is a Number, which is 1 if there is a mapping that
contains {what} in somewhere in the rhs (what it is mapped to)
and this mapping exists in one of the modes indicated by
{mode}.
- When {abbr} is there and it is non-zero use abbreviations
+ When {abbr} is there and it is |TRUE| use abbreviations
instead of mappings. Don't forget to specify Insert and/or
Command-line mode.
Both the global mappings and the mappings local to the current
@@ -4032,6 +4668,7 @@ histadd({history}, {item}) *histadd()*
"expr" or "=" typed expression history
"input" or "@" input line history
"debug" or ">" debug command history
+ empty the current or last used history
The {history} string does not need to be the whole name, one
character is sufficient.
If {item} does already exist in the history, it will be
@@ -4105,8 +4742,6 @@ hlexists({name}) *hlexists()*
defined in some way. Not necessarily when highlighting has
been defined for it, it may also have been used for a syntax
item.
- *highlight_exists()*
- Obsolete name: highlight_exists().
*hlID()*
hlID({name}) The result is a Number, which is the ID of the highlight group
@@ -4116,8 +4751,6 @@ hlID({name}) The result is a Number, which is the ID of the highlight group
group. For example, to get the background color of the
"Comment" group: >
:echo synIDattr(synIDtrans(hlID("Comment")), "bg")
-< *highlightID()*
- Obsolete name: highlightID().
hostname() *hostname()*
The result is a String, which is the name of the machine on
@@ -4135,11 +4768,7 @@ iconv({expr}, {from}, {to}) *iconv()*
Most conversions require Vim to be compiled with the |+iconv|
feature. Otherwise only UTF-8 to latin1 conversion and back
can be done.
- This can be used to display messages with special characters,
- no matter what 'encoding' is set to. Write the message in
- UTF-8 and use: >
- echo iconv(utf8_str, "utf-8", &enc)
-< Note that Vim uses UTF-8 for all Unicode encodings, conversion
+ Note that Vim uses UTF-8 for all Unicode encodings, conversion
from/to UCS-2 is automatically changed to use UTF-8. You
cannot use UCS-2 in a string anyway, because of the NUL bytes.
{only available when compiled with the |+multi_byte| feature}
@@ -4160,7 +4789,7 @@ index({list}, {expr} [, {start} [, {ic}]]) *index()*
is not used here, case always matters.
If {start} is given then start looking at the item with index
{start} (may be negative for an item relative to the end).
- When {ic} is given and it is non-zero, ignore case. Otherwise
+ When {ic} is given and it is |TRUE|, ignore case. Otherwise
case must match.
-1 is returned when {expr} is not found in {list}.
Example: >
@@ -4169,10 +4798,24 @@ index({list}, {expr} [, {start} [, {ic}]]) *index()*
input({prompt} [, {text} [, {completion}]]) *input()*
+input({opts})
The result is a String, which is whatever the user typed on
the command-line. The {prompt} argument is either a prompt
string, or a blank string (for no prompt). A '\n' can be used
in the prompt to start a new line.
+
+ In the second form it accepts a single dictionary with the
+ following keys, any of which may be omitted:
+
+ Key Default Description ~
+ prompt "" Same as {prompt} in the first form.
+ default "" Same as {text} in the first form.
+ completion nothing Same as {completion} in the first form.
+ cancelreturn "" Same as {cancelreturn} from
+ |inputdialog()|. Also works with
+ input().
+ highlight nothing Highlight handler: |Funcref|.
+
The highlighting set with |:echohl| is used for the prompt.
The input is entered just like a command-line, with the same
editing commands and mappings. There is a separate history
@@ -4194,7 +4837,60 @@ input({prompt} [, {text} [, {completion}]]) *input()*
"-complete=" argument. Refer to |:command-completion| for
more information. Example: >
let fname = input("File: ", "", "file")
+
+< *input()-highlight* *E5400* *E5402*
+ The optional `highlight` key allows specifying function which
+ will be used for highlighting user input. This function
+ receives user input as its only argument and must return
+ a list of 3-tuples [hl_start_col, hl_end_col + 1, hl_group]
+ where
+ hl_start_col is the first highlighted column,
+ hl_end_col is the last highlighted column (+ 1!),
+ hl_group is |:hi| group used for highlighting.
+ *E5403* *E5404* *E5405* *E5406*
+ Both hl_start_col and hl_end_col + 1 must point to the start
+ of the multibyte character (highlighting must not break
+ multibyte characters), hl_end_col + 1 may be equal to the
+ input length. Start column must be in range [0, len(input)),
+ end column must be in range (hl_start_col, len(input)],
+ sections must be ordered so that next hl_start_col is greater
+ then or equal to previous hl_end_col.
+
+ Example (try some input with parentheses): >
+ highlight RBP1 guibg=Red ctermbg=red
+ highlight RBP2 guibg=Yellow ctermbg=yellow
+ highlight RBP3 guibg=Green ctermbg=green
+ highlight RBP4 guibg=Blue ctermbg=blue
+ let g:rainbow_levels = 4
+ function! RainbowParens(cmdline)
+ let ret = []
+ let i = 0
+ let lvl = 0
+ while i < len(a:cmdline)
+ if a:cmdline[i] is# '('
+ call add(ret, [i, i + 1, 'RBP' . ((lvl % g:rainbow_levels) + 1)])
+ let lvl += 1
+ elseif a:cmdline[i] is# ')'
+ let lvl -= 1
+ call add(ret, [i, i + 1, 'RBP' . ((lvl % g:rainbow_levels) + 1)])
+ endif
+ let i += 1
+ endwhile
+ return ret
+ endfunction
+ call input({'prompt':'>','highlight':'RainbowParens'})
<
+ Highlight function is called at least once for each new
+ displayed input string, before command-line is redrawn. It is
+ expected that function is pure for the duration of one input()
+ call, i.e. it produces the same output for the same input, so
+ output may be memoized. Function is run like under |:silent|
+ modifier. If the function causes any errors, it will be
+ skipped for the duration of the current input() call.
+
+ Highlighting is disabled if command-line contains arabic
+ characters.
+
NOTE: This function must not be used in a startup file, for
the versions that only run in GUI mode (e.g., the Win32 GUI).
Note: When input() is called from within a mapping it will
@@ -4213,20 +4909,6 @@ input({prompt} [, {text} [, {completion}]]) *input()*
: call inputrestore()
:endfunction
-inputdialog({prompt} [, {text} [, {cancelreturn}]]) *inputdialog()*
- Like |input()|, but when the GUI is running and text dialogs
- are supported, a dialog window pops up to input the text.
- Example: >
- :let n = inputdialog("value for shiftwidth", shiftwidth())
- :if n != ""
- : let &sw = n
- :endif
-< When the dialog is cancelled {cancelreturn} is returned. When
- omitted an empty string is returned.
- Hitting <Enter> works like pressing the OK button. Hitting
- <Esc> works like pressing the Cancel button.
- NOTE: Command-line completion is not supported.
-
inputlist({textlist}) *inputlist()*
{textlist} must be a |List| of strings. This |List| is
displayed, one string per line. The user will be prompted to
@@ -4288,13 +4970,13 @@ invert({expr}) *invert()*
:let bits = invert(bits)
isdirectory({directory}) *isdirectory()*
- The result is a Number, which is non-zero when a directory
+ The result is a Number, which is |TRUE| when a directory
with the name {directory} exists. If {directory} doesn't
- exist, or isn't a directory, the result is FALSE. {directory}
+ exist, or isn't a directory, the result is |FALSE|. {directory}
is any expression, which is used as a String.
islocked({expr}) *islocked()* *E786*
- The result is a Number, which is non-zero when {expr} is the
+ The result is a Number, which is |TRUE| when {expr} is the
name of a locked variable.
{expr} must be the name of a variable, |List| item or
|Dictionary| entry, not the variable itself! Example: >
@@ -4306,95 +4988,124 @@ islocked({expr}) *islocked()* *E786*
< When {expr} is a variable that does not exist you get an error
message. Use |exists()| to check for existence.
+id({expr}) *id()*
+ Returns a |String| which is a unique identifier of the
+ container type (|List|, |Dict| and |Partial|). It is
+ guaranteed that for the mentioned types `id(v1) ==# id(v2)`
+ returns true iff `type(v1) == type(v2) && v1 is v2` (note:
+ |v:_null_list| and |v:_null_dict| have the same `id()` with
+ different types because they are internally represented as
+ a NULL pointers). Currently `id()` returns a hexadecimal
+ representanion of the pointers to the containers (i.e. like
+ `0x994a40`), same as `printf("%p", {expr})`, but it is advised
+ against counting on exact format of return value.
+
+ It is not guaranteed that `id(no_longer_existing_container)`
+ will not be equal to some other `id()`: new containers may
+ reuse identifiers of the garbage-collected ones.
+
items({dict}) *items()*
Return a |List| with all the key-value pairs of {dict}. Each
|List| item is a list with two items: the key of a {dict}
entry and the value of this entry. The |List| is in arbitrary
order.
-jobclose({job}[, {stream}]) {Nvim} *jobclose()*
- Close {job}'s {stream}, which can be one "stdin", "stdout" or
- "stderr". If {stream} is omitted, all streams are closed.
-
-jobpid({job}) {Nvim} *jobpid()*
- Return the pid (process id) of {job}.
-
-jobresize({job}, {width}, {height}) {Nvim} *jobresize()*
- Resize {job}'s pseudo terminal window to {width} and {height}.
- This function will fail if used on jobs started without the
- "pty" option.
-jobsend({job}, {data}) {Nvim} *jobsend()*
- Send data to {job} by writing it to the stdin of the process.
- Returns 1 if the write succeeded, 0 otherwise.
- See |job-control| for more information.
+jobpid({job}) *jobpid()*
+ Return the PID (process id) of |job-id| {job}.
- {data} may be a string, string convertible, or a list. If
- {data} is a list, the items will be separated by newlines and
- any newlines in an item will be sent as a NUL. A final newline
- can be sent by adding a final empty string. For example: >
- :call jobsend(j, ["abc", "123\n456", ""])
-< will send "abc<NL>123<NUL>456<NL>".
+jobresize({job}, {width}, {height}) *jobresize()*
+ Resize the pseudo terminal window of |job-id| {job} to {width}
+ columns and {height} rows.
+ Fails if the job was not started with `"pty":v:true`.
-jobstart({cmd}[, {opts}]) {Nvim} *jobstart()*
- Spawns {cmd} as a job. If {cmd} is a |List| it is run
- directly. If {cmd} is a |String| it is processed like this: >
+jobstart({cmd}[, {opts}]) *jobstart()*
+ Spawns {cmd} as a job.
+ If {cmd} is a List it runs directly (no 'shell').
+ If {cmd} is a String it runs in the 'shell', like this: >
:call jobstart(split(&shell) + split(&shellcmdflag) + ['{cmd}'])
-< NOTE: read |shell-unquoting| before constructing any lists
- with 'shell' or 'shellcmdflag' options. The above call is
- only written to show the idea, one needs to perform unquoting
- and do split taking quotes into account.
+< (See |shell-unquoting| for details.)
+ Example: >
+ :call jobstart('nvim -h', {'on_stdout':{j,d,e->append(line('.'),d)}})
+<
+ Returns |job-id| on success, 0 on invalid arguments (or job
+ table is full), -1 if {cmd}[0] or 'shell' is not executable.
+ The returned job-id is a valid |channel-id| representing the
+ job's stdio streams. Use |chansend()| (or |rpcnotify()| and
+ |rpcrequest()| if "rpc" was enabled) to send data to stdin and
+ |chanclose()| to close the streams without stopping the job.
+
+ See |job-control| and |RPC|.
+
+ NOTE: on Windows if {cmd} is a List:
+ - cmd[0] must be an executable (not a "built-in"). If it is
+ in $PATH it can be called by name, without an extension: >
+ :call jobstart(['ping', 'neovim.io'])
+< If it is a full or partial path, extension is required: >
+ :call jobstart(['System32\ping.exe', 'neovim.io'])
+< - {cmd} is collapsed to a string of quoted args as expected
+ by CommandLineToArgvW https://msdn.microsoft.com/bb776391
+ unless cmd[0] is some form of "cmd.exe".
+
+ *jobstart-options*
{opts} is a dictionary with these keys:
- on_stdout: stdout event handler (function name or |Funcref|)
- on_stderr: stderr event handler (function name or |Funcref|)
- on_exit : exit event handler (function name or |Funcref|)
+ |on_stdout|: stdout event handler (function name or |Funcref|)
+ stdout_buffered : read stdout in |buffered| mode.
+ |on_stderr|: stderr event handler (function name or |Funcref|)
+ stderr_buffered : read stderr in |buffered| mode.
+ |on_exit| : exit event handler (function name or |Funcref|)
cwd : Working directory of the job; defaults to
|current-directory|.
+ rpc : If set, |msgpack-rpc| will be used to communicate
+ with the job over stdin and stdout. "on_stdout" is
+ then ignored, but "on_stderr" can still be used.
pty : If set, the job will be connected to a new pseudo
- terminal, and the job streams are connected to
- the master file descriptor.
+ terminal and the job streams are connected to the
+ master file descriptor. "on_stderr" is ignored,
+ "on_stdout" receives all output.
+
width : (pty only) Width of the terminal screen
height : (pty only) Height of the terminal screen
TERM : (pty only) $TERM environment variable
- detach : (non-pty only) Detach the job process from the
- nvim process. The process will not get killed
- when nvim exits. If the process dies before
- nvim exits, on_exit will still be invoked.
+ detach : (non-pty only) Detach the job process: it will
+ not be killed when Nvim exits. If the process
+ exits before Nvim, "on_exit" will be invoked.
- {opts} is passed as |self| to the callback; the caller may
- pass arbitrary data by setting other keys.
+ {opts} is passed as |self| dictionary to the callback; the
+ caller may set other keys to pass application-specific data.
Returns:
- - job ID on success, used by |jobsend()| and |jobstop()|
- - 0 on invalid arguments or if the job table is full
+ - The channel ID on success
+ - 0 on invalid arguments
- -1 if {cmd}[0] is not executable.
- See |job-control| for more information.
-
-jobstop({job}) {Nvim} *jobstop()*
- Stop a job created with |jobstart()| by sending a `SIGTERM`
- to the corresponding process. If the process doesn't exit
- cleanly soon, a `SIGKILL` will be sent. When the job is
- finally closed, the exit handler provided to |jobstart()| or
- |termopen()| will be run.
- See |job-control| for more information.
-
-jobwait({ids}[, {timeout}]) {Nvim} *jobwait()*
- Wait for a set of jobs to finish. The {ids} argument is a list
- of ids for jobs that will be waited for. If passed, {timeout}
- is the maximum number of milliseconds to wait. While this
- function is executing, callbacks for jobs not in the {ids}
- list can be executed. Also, the screen wont be updated unless
- |:redraw| is invoked by one of the callbacks.
-
- Returns a list of integers with the same length as {ids}, with
- each integer representing the wait result for the
- corresponding job id. The possible values for the resulting
- integers are:
-
- * the job return code if the job exited
- * -1 if the wait timed out for the job
- * -2 if the job was interrupted
- * -3 if the job id is invalid.
+ See also |job-control|, |channel|, |msgpack-rpc|.
+
+jobstop({id}) *jobstop()*
+ Stop |job-id| {id} by sending SIGTERM to the job process. If
+ the process does not terminate after a timeout then SIGKILL
+ will be sent. When the job terminates its |on_exit| handler
+ (if any) will be invoked.
+ See |job-control|.
+
+jobwait({ids}[, {timeout}]) *jobwait()*
+ Wait for a set of jobs to complete.
+
+ {ids} is a list of |job-id|s to wait for.
+ {timeout} is the maximum number of milliseconds to wait.
+ {timeout} of zero can be used to check if a job-id is valid,
+ without waiting.
+
+ During jobwait() callbacks for jobs not in the {ids} list may
+ be invoked. The screen will not redraw unless |:redraw| is
+ invoked by a callback.
+
+ Returns a list of len({ids}) integers, where each integer is
+ the wait-result of the corresponding job. Each wait-result is
+ one of the following:
+ * Exit-code, if the job exited
+ * -1 if the timeout was exceeded
+ * -2 if the job was interrupted
+ * -3 if the |job-id| is invalid
join({list} [, {sep}]) *join()*
Join the items in {list} together into one String.
@@ -4408,45 +5119,32 @@ join({list} [, {sep}]) *join()*
The opposite function is |split()|.
json_decode({expr}) *json_decode()*
- Convert {expr} from JSON object. Accepts |readfile()|-style
- list as the input, as well as regular string. May output any
- Vim value. When 'encoding' is not UTF-8 string is converted
- from UTF-8 to 'encoding', failing conversion fails
- json_decode(). In the following cases it will output
+ Convert {expr} from JSON object. Accepts |readfile()|-style
+ list as the input, as well as regular string. May output any
+ Vim value. In the following cases it will output
|msgpack-special-dict|:
1. Dictionary contains duplicate key.
2. Dictionary contains empty key.
- 3. String contains NUL byte. Two special dictionaries: for
- dictionary and for string will be emitted in case string
+ 3. String contains NUL byte. Two special dictionaries: for
+ dictionary and for string will be emitted in case string
with NUL byte was a dictionary key.
- Note: function treats its input as UTF-8 always regardless of
- 'encoding' value. This is needed because JSON source is
- supposed to be external (e.g. |readfile()|) and JSON standard
- allows only a few encodings, of which UTF-8 is recommended and
- the only one required to be supported. Non-UTF-8 characters
- are an error.
+ Note: function treats its input as UTF-8 always. The JSON
+ standard allows only a few encodings, of which UTF-8 is
+ recommended and the only one required to be supported.
+ Non-UTF-8 characters are an error.
json_encode({expr}) *json_encode()*
- Convert {expr} into a JSON string. Accepts
- |msgpack-special-dict| as the input. Converts from 'encoding'
- to UTF-8 when encoding strings. Will not convert |Funcref|s,
- mappings with non-string keys (can be created as
- |msgpack-special-dict|), values with self-referencing
- containers, strings which contain non-UTF-8 characters,
- pseudo-UTF-8 strings which contain codepoints reserved for
- surrogate pairs (such strings are not valid UTF-8 strings).
- When converting 'encoding' is taken into account, if it is not
- "utf-8", then conversion is performed before encoding strings.
- Non-printable characters are converted into "\u1234" escapes
+ Convert {expr} into a JSON string. Accepts
+ |msgpack-special-dict| as the input. Will not convert
+ |Funcref|s, mappings with non-string keys (can be created as
+ |msgpack-special-dict|), values with self-referencing
+ containers, strings which contain non-UTF-8 characters,
+ pseudo-UTF-8 strings which contain codepoints reserved for
+ surrogate pairs (such strings are not valid UTF-8 strings).
+ Non-printable characters are converted into "\u1234" escapes
or special escapes like "\t", other are dumped as-is.
- Note: all characters above U+0079 are considered non-printable
- when 'encoding' is not UTF-8. This function always outputs
- UTF-8 strings as required by the standard thus when 'encoding'
- is not unicode resulting string will look incorrect if
- "\u1234" notation is not used.
-
keys({dict}) *keys()*
Return a |List| with all the keys of {dict}. The |List| is in
arbitrary order.
@@ -4525,8 +5223,10 @@ line({expr}) The result is a Number, which is the line number of the file
$ the last line in the current buffer
'x position of mark x (if the mark is not set, 0 is
returned)
- w0 first line visible in current window
- w$ last line visible in current window
+ w0 first line visible in current window (one if the
+ display isn't updated, e.g. in silent Ex mode)
+ w$ last line visible in current window (this is one
+ less than "w0" if no lines are visible)
v In Visual mode: the start of the Visual area (the
cursor is the end). When not in Visual mode
returns the cursor position. Differs from |'<| in
@@ -4542,15 +5242,18 @@ line({expr}) The result is a Number, which is the line number of the file
< *last-position-jump*
This autocommand jumps to the last known position in a file
just after opening it, if the '" mark is set: >
- :au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
+ :au BufReadPost *
+ \ if line("'\"") > 1 && line("'\"") <= line("$") && &ft !~# 'commit'
+ \ | exe "normal! g`\""
+ \ | endif
line2byte({lnum}) *line2byte()*
Return the byte count from the start of the buffer for line
{lnum}. This includes the end-of-line character, depending on
the 'fileformat' option for the current buffer. The first
- line returns 1. 'encoding' matters, 'fileencoding' is ignored.
- This can also be used to get the byte count for the line just
- below the last line: >
+ line returns 1. UTF-8 encoding is used, 'fileencoding' is
+ ignored. This can also be used to get the byte count for the
+ line just below the last line: >
line2byte(line("$") + 1)
< This is the buffer size plus one. If 'fileencoding' is empty
it is the file size plus one.
@@ -4590,40 +5293,62 @@ log10({expr}) *log10()*
:echo log10(0.01)
< -2.0
+luaeval({expr}[, {expr}])
+ Evaluate Lua expression {expr} and return its result converted
+ to Vim data structures. See |lua-luaeval| for more details.
-map({expr}, {string}) *map()*
- {expr} must be a |List| or a |Dictionary|.
- Replace each item in {expr} with the result of evaluating
- {string}.
- Inside {string} |v:val| has the value of the current item.
- For a |Dictionary| |v:key| has the key of the current item
- and for a |List| |v:key| has the index of the current item.
+map({expr1}, {expr2}) *map()*
+ {expr1} must be a |List| or a |Dictionary|.
+ Replace each item in {expr1} with the result of evaluating
+ {expr2}. {expr2} must be a |string| or |Funcref|.
+
+ If {expr2} is a |string|, inside {expr2} |v:val| has the value
+ of the current item. For a |Dictionary| |v:key| has the key
+ of the current item and for a |List| |v:key| has the index of
+ the current item.
Example: >
:call map(mylist, '"> " . v:val . " <"')
< This puts "> " before and " <" after each item in "mylist".
- Note that {string} is the result of an expression and is then
+ Note that {expr2} is the result of an expression and is then
used as an expression again. Often it is good to use a
|literal-string| to avoid having to double backslashes. You
still have to double ' quotes
+ If {expr2} is a |Funcref| it is called with two arguments:
+ 1. The key or the index of the current item.
+ 2. the value of the current item.
+ The function must return the new value of the item. Example
+ that changes each value by "key-value": >
+ func KeyValue(key, val)
+ return a:key . '-' . a:val
+ endfunc
+ call map(myDict, function('KeyValue'))
+< It is shorter when using a |lambda|: >
+ call map(myDict, {key, val -> key . '-' . val})
+< If you do not use "val" you can leave it out: >
+ call map(myDict, {key -> 'item: ' . key})
+<
The operation is done in-place. If you want a |List| or
|Dictionary| to remain unmodified make a copy first: >
:let tlist = map(copy(mylist), ' v:val . "\t"')
-< Returns {expr}, the |List| or |Dictionary| that was filtered.
- When an error is encountered while evaluating {string} no
- further items in {expr} are processed.
+< Returns {expr1}, the |List| or |Dictionary| that was filtered.
+ When an error is encountered while evaluating {expr2} no
+ further items in {expr1} are processed. When {expr2} is a
+ Funcref errors inside a function are ignored, unless it was
+ defined with the "abort" flag.
-maparg({name}[, {mode} [, {abbr} [, {dict}]]]) *maparg()*
+maparg({name} [, {mode} [, {abbr} [, {dict}]]]) *maparg()*
When {dict} is omitted or zero: Return the rhs of mapping
{name} in mode {mode}. The returned String has special
characters translated like in the output of the ":map" command
listing.
-
+
When there is no mapping for {name}, an empty String is
- returned.
+ returned. When the mapping for {name} is empty, then "<Nop>"
+ is returned.
The {name} can have special key names, like in the ":map"
command.
@@ -4637,13 +5362,14 @@ maparg({name}[, {mode} [, {abbr} [, {dict}]]]) *maparg()*
"s" Select
"x" Visual
"l" langmap |language-mapping|
+ "t" Terminal
"" Normal, Visual and Operator-pending
When {mode} is omitted, the modes for "" are used.
- When {abbr} is there and it is non-zero use abbreviations
+ When {abbr} is there and it is |TRUE| use abbreviations
instead of mappings.
- When {dict} is there and it is non-zero return a dictionary
+ When {dict} is there and it is |TRUE| return a dictionary
containing all the information of the mapping with the
following items:
"lhs" The {lhs} of the mapping.
@@ -4670,7 +5396,7 @@ maparg({name}[, {mode} [, {abbr} [, {dict}]]]) *maparg()*
exe 'nnoremap <Tab> ==' . maparg('<Tab>', 'n')
-mapcheck({name}[, {mode} [, {abbr}]]) *mapcheck()*
+mapcheck({name} [, {mode} [, {abbr}]]) *mapcheck()*
Check if there is a mapping that matches with {name} in mode
{mode}. See |maparg()| for {mode} and special names in
{name}.
@@ -4689,9 +5415,10 @@ mapcheck({name}[, {mode} [, {abbr}]]) *mapcheck()*
mapping that matches with {name}, while maparg() only finds a
mapping for {name} exactly.
When there is no mapping that starts with {name}, an empty
- String is returned. If there is one, the rhs of that mapping
+ String is returned. If there is one, the RHS of that mapping
is returned. If there are several mappings that start with
- {name}, the rhs of one of them is returned.
+ {name}, the RHS of one of them is returned. This will be
+ "<Nop>" if the RHS is empty.
The mappings local to the current buffer are checked first,
then the global mappings.
This function can be used to check if a mapping can be added
@@ -4702,15 +5429,18 @@ mapcheck({name}[, {mode} [, {abbr}]]) *mapcheck()*
< This avoids adding the "_vv" mapping when there already is a
mapping for "_v" or for "_vvv".
-match({expr}, {pat}[, {start}[, {count}]]) *match()*
+match({expr}, {pat} [, {start} [, {count}]]) *match()*
When {expr} is a |List| then this returns the index of the
first item where {pat} matches. Each item is used as a
String, |Lists| and |Dictionaries| are used as echoed.
+
Otherwise, {expr} is used as a String. The result is a
Number, which gives the index (byte offset) in {expr} where
{pat} matches.
+
A match at the first character or |List| item returns zero.
If there is no match -1 is returned.
+
For getting submatches see |matchlist()|.
Example: >
:echo match("testing", "ing") " results in 4
@@ -4810,14 +5540,15 @@ matchadd({group}, {pattern}[, {priority}[, {id} [, {dict}]]])
available from |getmatches()|. All matches can be deleted in
one operation by |clearmatches()|.
-matchaddpos({group}, {pos}[, {priority}[, {id}[, {dict}]]]) *matchaddpos()*
+ *matchaddpos()*
+matchaddpos({group}, {pos} [, {priority} [, {id} [, {dict}]]])
Same as |matchadd()|, but requires a list of positions {pos}
instead of a pattern. This command is faster than |matchadd()|
because it does not require to handle regular expressions and
sets buffer line boundaries to redraw screen. It is supposed
to be used when fast match additions and deletions are
required, for example to highlight matching parentheses.
-
+ *E5030* *E5031*
The list {pos} can contain one of these items:
- A number. This whole line will be highlighted. The first
line has number 1.
@@ -4830,7 +5561,11 @@ matchaddpos({group}, {pos}[, {priority}[, {id}[, {dict}]]]) *matchaddpos()*
be highlighted.
- A list with three numbers, e.g., [23, 11, 3]. As above, but
the third number gives the length of the highlight in bytes.
-
+
+ Entries with zero and negative line numbers are silently
+ ignored, as well as entries with negative column numbers and
+ lengths.
+
The maximum number of positions is 8.
Example: >
@@ -4842,8 +5577,6 @@ matchaddpos({group}, {pos}[, {priority}[, {id}[, {dict}]]]) *matchaddpos()*
< Matches added by |matchaddpos()| are returned by
|getmatches()| with an entry "pos1", "pos2", etc., with the
value a list like the {pos} item.
- These matches cannot be set via |setmatches()|, however they
- can still be deleted by |clearmatches()|.
matcharg({nr}) *matcharg()*
Selects the {nr} match item, as set with a |:match|,
@@ -4863,7 +5596,7 @@ matchdelete({id}) *matchdelete()* *E802* *E803*
otherwise -1. See example for |matchadd()|. All matches can
be deleted in one operation by |clearmatches()|.
-matchend({expr}, {pat}[, {start}[, {count}]]) *matchend()*
+matchend({expr}, {pat} [, {start} [, {count}]]) *matchend()*
Same as |match()|, but return the index of first character
after the match. Example: >
:echo matchend("testing", "ing")
@@ -4882,7 +5615,7 @@ matchend({expr}, {pat}[, {start}[, {count}]]) *matchend()*
< result is "-1".
When {expr} is a |List| the result is equal to |match()|.
-matchlist({expr}, {pat}[, {start}[, {count}]]) *matchlist()*
+matchlist({expr}, {pat} [, {start} [, {count}]]) *matchlist()*
Same as |match()|, but return a |List|. The first item in the
list is the matched string, same as what matchstr() would
return. Following items are submatches, like "\1", "\2", etc.
@@ -4892,7 +5625,7 @@ matchlist({expr}, {pat}[, {start}[, {count}]]) *matchlist()*
< Results in: ['acd', 'a', '', 'c', 'd', '', '', '', '', '']
When there is no match an empty list is returned.
-matchstr({expr}, {pat}[, {start}[, {count}]]) *matchstr()*
+matchstr({expr}, {pat} [, {start} [, {count}]]) *matchstr()*
Same as |match()|, but return the matched string. Example: >
:echo matchstr("testing", "ing")
< results in "ing".
@@ -4905,17 +5638,84 @@ matchstr({expr}, {pat}[, {start}[, {count}]]) *matchstr()*
When {expr} is a |List| then the matching item is returned.
The type isn't changed, it's not necessarily a String.
+matchstrpos({expr}, {pat} [, {start} [, {count}]]) *matchstrpos()*
+ Same as |matchstr()|, but return the matched string, the start
+ position and the end position of the match. Example: >
+ :echo matchstrpos("testing", "ing")
+< results in ["ing", 4, 7].
+ When there is no match ["", -1, -1] is returned.
+ The {start}, if given, has the same meaning as for |match()|. >
+ :echo matchstrpos("testing", "ing", 2)
+< results in ["ing", 4, 7]. >
+ :echo matchstrpos("testing", "ing", 5)
+< result is ["", -1, -1].
+ When {expr} is a |List| then the matching item, the index
+ of first item where {pat} matches, the start position and the
+ end position of the match are returned. >
+ :echo matchstrpos([1, '__x'], '\a')
+< result is ["x", 1, 2, 3].
+ The type isn't changed, it's not necessarily a String.
+
*max()*
-max({list}) Return the maximum value of all items in {list}.
- If {list} is not a list or one of the items in {list} cannot
- be used as a Number this results in an error.
- An empty |List| results in zero.
+max({expr}) Return the maximum value of all items in {expr}.
+ {expr} can be a list or a dictionary. For a dictionary,
+ it returns the maximum of all values in the dictionary.
+ If {expr} is neither a list nor a dictionary, or one of the
+ items in {expr} cannot be used as a Number this results in
+ an error. An empty |List| or |Dictionary| results in zero.
+
+menu_get({path}, {modes}) *menu_get()*
+ Returns a |List| of |Dictionaries| describing |menus| (defined
+ by |:menu|, |:amenu|, etc.).
+ {path} limits the result to a subtree of the menu hierarchy
+ (empty string matches all menus). E.g. to get items in the
+ "File" menu subtree: >
+ :echo menu_get('File','')
+<
+ {modes} is a string of zero or more modes (see |maparg()| or
+ |creating-menus| for the list of modes). "a" means "all".
+
+ For example: >
+ nnoremenu &Test.Test inormal
+ inoremenu Test.Test insert
+ vnoremenu Test.Test x
+ echo menu_get("")
+<
+ returns something like this:
+>
+ [ {
+ "hidden": 0,
+ "name": "Test",
+ "priority": 500,
+ "shortcut": 84,
+ "submenus": [ {
+ "hidden": 0,
+ "mappings": {
+ i": {
+ "enabled": 1,
+ "noremap": 1,
+ "rhs": "insert",
+ "sid": 1,
+ "silent": 0
+ },
+ n": { ... },
+ s": { ... },
+ v": { ... }
+ },
+ "name": "Test",
+ "priority": 500,
+ "shortcut": 0
+ } ]
+ } ]
+<
*min()*
-min({list}) Return the minimum value of all items in {list}.
- If {list} is not a list or one of the items in {list} cannot
- be used as a Number this results in an error.
- An empty |List| results in zero.
+min({expr}) Return the minimum value of all items in {expr}.
+ {expr} can be a list or a dictionary. For a dictionary,
+ it returns the minimum of all values in the dictionary.
+ If {expr} is neither a list nor a dictionary, or one of the
+ items in {expr} cannot be used as a Number this results in
+ an error. An empty |List| or |Dictionary| results in zero.
*mkdir()* *E739*
mkdir({name} [, {path} [, {prot}]])
@@ -4926,47 +5726,56 @@ mkdir({name} [, {path} [, {prot}]])
the new directory. The default is 0755 (rwxr-xr-x: r/w for
the user readable for others). Use 0700 to make it unreadable
for others.
- {Nvim}
+
{prot} is applied for all parts of {name}. Thus if you create
/tmp/foo/bar then /tmp/foo will be created with 0700. Example: >
:call mkdir($HOME . "/tmp/foo/bar", "p", 0700)
< This function is not available in the |sandbox|.
- If you try to create an existing directory with {path} set to
+ If you try to create an existing directory with {path} set to
"p" mkdir() will silently exit.
*mode()*
mode([expr]) Return a string that indicates the current mode.
If [expr] is supplied and it evaluates to a non-zero Number or
a non-empty String (|non-zero-arg|), then the full mode is
- returned, otherwise only the first letter is returned. Note
- that " " and "0" are also non-empty strings.
-
- n Normal
- no Operator-pending
- v Visual by character
- V Visual by line
- CTRL-V Visual blockwise
- s Select by character
- S Select by line
- CTRL-S Select blockwise
- i Insert
- R Replace |R|
- Rv Virtual Replace |gR|
- t Terminal {Nvim}
- c Command-line
- cv Vim Ex mode |gQ|
- ce Normal Ex mode |Q|
- r Hit-enter prompt
- rm The -- more -- prompt
- r? A |:confirm| query of some sort
- ! Shell or external command is executing
+ returned, otherwise only the first letter is returned.
+
+ n Normal
+ no Operator-pending
+ nov Operator-pending (forced characterwise |o_v|)
+ noV Operator-pending (forced linewise |o_V|)
+ noCTRL-V Operator-pending (forced blockwise |o_CTRL-V|)
+ niI Normal using |i_CTRL-O| in |Insert-mode|
+ niR Normal using |i_CTRL-O| in |Replace-mode|
+ niV Normal using |i_CTRL-O| in |Virtual-Replace-mode|
+ v Visual by character
+ V Visual by line
+ CTRL-V Visual blockwise
+ s Select by character
+ S Select by line
+ CTRL-S Select blockwise
+ i Insert
+ ic Insert mode completion |compl-generic|
+ ix Insert mode |i_CTRL-X| completion
+ R Replace |R|
+ Rc Replace mode completion |compl-generic|
+ Rv Virtual Replace |gR|
+ Rx Replace mode |i_CTRL-X| completion
+ c Command-line editing
+ cv Vim Ex mode |gQ|
+ ce Normal Ex mode |Q|
+ r Hit-enter prompt
+ rm The -- more -- prompt
+ r? |:confirm| query of some sort
+ ! Shell or external command is executing
+ t Terminal mode: keys go to the job
This is useful in the 'statusline' option or when used
with |remote_expr()| In most other places it always returns
"c" or "n".
Also see |visualmode()|.
-msgpackdump({list}) {Nvim} *msgpackdump()*
+msgpackdump({list}) *msgpackdump()*
Convert a list of VimL objects to msgpack. Returned value is
|readfile()|-style list. Example: >
call writefile(msgpackdump([{}]), 'fname.mpack', 'b')
@@ -4974,86 +5783,84 @@ msgpackdump({list}) {Nvim} *msgpackdump()*
(dictionary with zero items is represented by 0x80 byte in
messagepack).
- Limitations: *E951* *E952* *E953*
+ Limitations: *E5004* *E5005*
1. |Funcref|s cannot be dumped.
2. Containers that reference themselves cannot be dumped.
3. Dictionary keys are always dumped as STR strings.
4. Other strings are always dumped as BIN strings.
5. Points 3. and 4. do not apply to |msgpack-special-dict|s.
-msgpackparse({list}) {Nvim} *msgpackparse()*
- Convert a |readfile()|-style list to a list of VimL objects.
+msgpackparse({list}) *msgpackparse()*
+ Convert a |readfile()|-style list to a list of VimL objects.
Example: >
let fname = expand('~/.config/nvim/shada/main.shada')
let mpack = readfile(fname, 'b')
let shada_objects = msgpackparse(mpack)
-< This will read ~/.config/nvim/shada/main.shada file to
+< This will read ~/.config/nvim/shada/main.shada file to
`shada_objects` list.
Limitations:
- 1. Mapping ordering is not preserved unless messagepack
- mapping is dumped using generic mapping
+ 1. Mapping ordering is not preserved unless messagepack
+ mapping is dumped using generic mapping
(|msgpack-special-map|).
- 2. Since the parser aims to preserve all data untouched
- (except for 1.) some strings are parsed to
- |msgpack-special-dict| format which is not convenient to
+ 2. Since the parser aims to preserve all data untouched
+ (except for 1.) some strings are parsed to
+ |msgpack-special-dict| format which is not convenient to
use.
*msgpack-special-dict*
- Some messagepack strings may be parsed to special
+ Some messagepack strings may be parsed to special
dictionaries. Special dictionaries are dictionaries which
1. Contain exactly two keys: `_TYPE` and `_VAL`.
- 2. `_TYPE` key is one of the types found in |v:msgpack_types|
+ 2. `_TYPE` key is one of the types found in |v:msgpack_types|
variable.
- 3. Value for `_VAL` has the following format (Key column
+ 3. Value for `_VAL` has the following format (Key column
contains name of the key from |v:msgpack_types|):
Key Value ~
- nil Zero, ignored when dumping. This value cannot
- possibly appear in |msgpackparse()| output in Neovim
- versions which have |v:null|.
- boolean One or zero. When dumping it is only checked that
- value is a |Number|. This value cannot possibly
- appear in |msgpackparse()| output in Neovim versions
- which have |v:true| and |v:false|.
- integer |List| with four numbers: sign (-1 or 1), highest two
- bits, number with bits from 62nd to 31st, lowest 31
- bits. I.e. to get actual number one will need to use
+ nil Zero, ignored when dumping. Not returned by
+ |msgpackparse()| since |v:null| was introduced.
+ boolean One or zero. When dumping it is only checked that
+ value is a |Number|. Not returned by |msgpackparse()|
+ since |v:true| and |v:false| were introduced.
+ integer |List| with four numbers: sign (-1 or 1), highest two
+ bits, number with bits from 62nd to 31st, lowest 31
+ bits. I.e. to get actual number one will need to use
code like >
_VAL[0] * ((_VAL[1] << 62)
& (_VAL[2] << 31)
& _VAL[3])
-< Special dictionary with this type will appear in
- |msgpackparse()| output under one of the following
+< Special dictionary with this type will appear in
+ |msgpackparse()| output under one of the following
circumstances:
- 1. |Number| is 32-bit and value is either above
+ 1. |Number| is 32-bit and value is either above
INT32_MAX or below INT32_MIN.
- 2. |Number| is 64-bit and value is above INT64_MAX. It
- cannot possibly be below INT64_MIN because msgpack
+ 2. |Number| is 64-bit and value is above INT64_MAX. It
+ cannot possibly be below INT64_MIN because msgpack
C parser does not support such values.
- float |Float|. This value cannot possibly appear in
+ float |Float|. This value cannot possibly appear in
|msgpackparse()| output.
- string |readfile()|-style list of strings. This value will
- appear in |msgpackparse()| output if string contains
- zero byte or if string is a mapping key and mapping is
- being represented as special dictionary for other
+ string |readfile()|-style list of strings. This value will
+ appear in |msgpackparse()| output if string contains
+ zero byte or if string is a mapping key and mapping is
+ being represented as special dictionary for other
reasons.
- binary |readfile()|-style list of strings. This value will
- appear in |msgpackparse()| output if binary string
+ binary |readfile()|-style list of strings. This value will
+ appear in |msgpackparse()| output if binary string
contains zero byte.
- array |List|. This value cannot appear in |msgpackparse()|
+ array |List|. This value cannot appear in |msgpackparse()|
output.
*msgpack-special-map*
- map |List| of |List|s with two items (key and value) each.
- This value will appear in |msgpackparse()| output if
+ map |List| of |List|s with two items (key and value) each.
+ This value will appear in |msgpackparse()| output if
parsed mapping contains one of the following keys:
- 1. Any key that is not a string (including keys which
+ 1. Any key that is not a string (including keys which
are binary strings).
2. String with NUL byte inside.
3. Duplicate key.
4. Empty key.
- ext |List| with two values: first is a signed integer
- representing extension type. Second is
+ ext |List| with two values: first is a signed integer
+ representing extension type. Second is
|readfile()|-style list of strings.
nextnonblank({lnum}) *nextnonblank()*
@@ -5064,20 +5871,31 @@ nextnonblank({lnum}) *nextnonblank()*
below it, zero is returned.
See also |prevnonblank()|.
-nr2char({expr}[, {utf8}]) *nr2char()*
+nr2char({expr} [, {utf8}]) *nr2char()*
Return a string with a single character, which has the number
value {expr}. Examples: >
nr2char(64) returns "@"
nr2char(32) returns " "
-< When {utf8} is omitted or zero, the current 'encoding' is used.
- Example for "utf-8": >
+< Example for "utf-8": >
nr2char(300) returns I with bow character
-< With {utf8} set to 1, always return utf-8 characters.
+< UTF-8 encoding is always used, {utf8} option has no effect,
+ and exists only for backwards-compatibility.
Note that a NUL character in the file is specified with
nr2char(10), because NULs are represented with newline
characters. nr2char(0) is a real NUL and terminates the
string, thus results in an empty string.
+nvim_...({...}) *nvim_...()* *eval-api*
+ Call nvim |api| functions. The type checking of arguments will
+ be stricter than for most other builtins. For instance,
+ if Integer is expected, a |Number| must be passed in, a
+ |String| will not be autoconverted.
+ Buffer numbers, as returned by |bufnr()| could be used as
+ first argument to nvim_buf_... functions. All functions
+ expecting an object (buffer, window or tabpage) can
+ also take the numerical value 0 to indicate the current
+ (focused) object.
+
or({expr}, {expr}) *or()*
Bitwise OR on the two arguments. The arguments are converted
to a number. A List, Dict or Float argument causes an error.
@@ -5091,7 +5909,7 @@ pathshorten({expr}) *pathshorten()*
components in the path are reduced to single letters. Leading
'~' and '.' characters are kept. Example: >
:echo pathshorten('~/.config/nvim/autoload/file1.vim')
-< ~/.v/a/file1.vim ~
+< ~/.c/n/a/file1.vim ~
It doesn't matter if the path exists or not.
pow({x}, {y}) *pow()*
@@ -5136,12 +5954,14 @@ printf({fmt}, {expr1} ...) *printf()*
%04x hex number padded with zeros to at least 4 characters
%X hex number using upper case letters
%o octal number
- %f floating point number in the form 123.456
- %e floating point number in the form 1.234e3
- %E floating point number in the form 1.234E3
+ %f floating point number as 12.23, inf, -inf or nan
+ %F floating point number as 12.23, INF, -INF or NAN
+ %e floating point number as 1.23e3, inf, -inf or nan
+ %E floating point number as 1.23E3, INF, -INF or NAN
%g floating point number, as %f or %e depending on value
- %G floating point number, as %f or %E depending on value
+ %G floating point number, as %F or %E depending on value
%% the % character itself
+ %p representation of the pointer to the container
Conversion specifications start with '%' and end with the
conversion type. All other characters are copied unchanged to
@@ -5231,6 +6051,16 @@ printf({fmt}, {expr1} ...) *printf()*
numeric field; if the result of a conversion is wider
than the field width, the field is expanded to contain
the conversion result.
+ The 'h' modifier indicates the argument is 16 bits.
+ The 'l' modifier indicates the argument is 32 bits.
+ The 'L' modifier indicates the argument is 64 bits.
+ Generally, these modifiers are not useful. They are
+ ignored when type is known from the argument.
+
+ i alias for d
+ D alias for ld
+ U alias for lu
+ O alias for lo
*printf-c*
c The Number argument is converted to a byte, and the
@@ -5240,6 +6070,9 @@ printf({fmt}, {expr1} ...) *printf()*
s The text of the String argument is used. If a
precision is specified, no more bytes than the number
specified are used.
+ If the argument is not a String type, it is
+ automatically converted to text with the same format
+ as ":echo".
*printf-S*
S The text of the String argument is used. If a
precision is specified, no more display cells than the
@@ -5247,13 +6080,14 @@ printf({fmt}, {expr1} ...) *printf()*
feature works just like 's'.
*printf-f* *E807*
- f The Float argument is converted into a string of the
+ f F The Float argument is converted into a string of the
form 123.456. The precision specifies the number of
digits after the decimal point. When the precision is
zero the decimal point is omitted. When the precision
is not specified 6 is used. A really big number
- (out of range or dividing by zero) results in "inf".
- "0.0 / 0.0" results in "nan".
+ (out of range or dividing by zero) results in "inf"
+ or "-inf" with %f (INF or -INF with %F).
+ "0.0 / 0.0" results in "nan" with %f (NAN with %F).
Example: >
echo printf("%.2f", 12.115)
< 12.12
@@ -5297,15 +6131,14 @@ pumvisible() *pumvisible()*
This can be used to avoid some things that would remove the
popup menu.
- *E860*
py3eval({expr}) *py3eval()*
Evaluate Python expression {expr} and return its result
converted to Vim data structures.
- Numbers and strings are returned as they are (strings are
- copied though, Unicode strings are additionally converted to
- 'encoding').
+ Numbers and strings are returned as they are (strings are
+ copied though, Unicode strings are additionally converted to
+ UTF-8).
Lists are represented as Vim |List| type.
- Dictionaries are represented as Vim |Dictionary| type with
+ Dictionaries are represented as Vim |Dictionary| type with
keys converted to strings.
{only available when compiled with the |+python3| feature}
@@ -5313,13 +6146,19 @@ py3eval({expr}) *py3eval()*
pyeval({expr}) *pyeval()*
Evaluate Python expression {expr} and return its result
converted to Vim data structures.
- Numbers and strings are returned as they are (strings are
+ Numbers and strings are returned as they are (strings are
copied though).
Lists are represented as Vim |List| type.
- Dictionaries are represented as Vim |Dictionary| type,
+ Dictionaries are represented as Vim |Dictionary| type,
non-string keys result in error.
{only available when compiled with the |+python| feature}
+pyxeval({expr}) *pyxeval()*
+ Evaluate Python expression {expr} and return its result
+ converted to Vim data structures.
+ Uses Python 2 or 3, see |python_x| and 'pyxversion'.
+ See also: |pyeval()|, |py3eval()|
+
*E726* *E727*
range({expr} [, {max} [, {stride}]]) *range()*
Returns a |List| with Numbers:
@@ -5342,9 +6181,9 @@ range({expr} [, {max} [, {stride}]]) *range()*
*readfile()*
readfile({fname} [, {binary} [, {max}]])
Read file {fname} and return a |List|, each line of the file
- as an item. Lines broken at NL characters. Macintosh files
- separated with CR will result in a single long line (unless a
- NL appears somewhere).
+ as an item. Lines are broken at NL characters. Macintosh
+ files separated with CR will result in a single long line
+ (unless a NL appears somewhere).
All NUL characters are replaced with a NL character.
When {binary} contains "b" binary mode is used:
- When the last line ends in a NL an extra empty list item is
@@ -5353,8 +6192,7 @@ readfile({fname} [, {binary} [, {max}]])
Otherwise:
- CR characters that appear before a NL are removed.
- Whether the last line ends in a NL or not does not matter.
- - When 'encoding' is Unicode any UTF-8 byte order mark is
- removed from the text.
+ - Any UTF-8 byte order mark is removed from the text.
When {max} is given this specifies the maximum number of lines
to be read. Useful if you only want to check the first ten
lines of a file: >
@@ -5374,16 +6212,22 @@ readfile({fname} [, {binary} [, {max}]])
reltime([{start} [, {end}]]) *reltime()*
Return an item that represents a time value. The format of
the item depends on the system. It can be passed to
- |reltimestr()| to convert it to a string or |reltimefloat()|
+ |reltimestr()| to convert it to a string or |reltimefloat()|
to convert to a float.
- Without an argument it returns the current time.
- With one argument is returns the time passed since the time
+
+ Without an argument it returns the current "relative time", an
+ implementation-defined value meaningful only when used as an
+ argument to |reltime()|, |reltimestr()| and |reltimefloat()|.
+
+ With one argument it returns the time passed since the time
specified in the argument.
With two arguments it returns the time passed between {start}
and {end}.
The {start} and {end} arguments must be values returned by
reltime().
+ Note: |localtime()| returns the current (non-relative) time.
+
reltimefloat({time}) *reltimefloat()*
Return a Float that represents the time value of {time}.
Unit of time is seconds.
@@ -5408,20 +6252,28 @@ reltimestr({time}) *reltimestr()*
< Also see |profiling|.
*remote_expr()* *E449*
-remote_expr({server}, {string} [, {idvar}])
+remote_expr({server}, {string} [, {idvar} [, {timeout}]])
Send the {string} to {server}. The string is sent as an
expression and the result is returned after evaluation.
The result must be a String or a |List|. A |List| is turned
into a String by joining the items with a line break in
between (not at the end), like with join(expr, "\n").
- If {idvar} is present, it is taken as the name of a
- variable and a {serverid} for later use with
+ If {idvar} is present and not empty, it is taken as the name
+ of a variable and a {serverid} for later use with
remote_read() is stored there.
+ If {timeout} is given the read times out after this many
+ seconds. Otherwise a timeout of 600 seconds is used.
See also |clientserver| |RemoteReply|.
This function is not available in the |sandbox|.
{only available when compiled with the |+clientserver| feature}
Note: Any errors will cause a local error message to be issued
and the result will be the empty string.
+
+ Variables will be evaluated in the global namespace,
+ independent of a function currently being active. Except
+ when in debug mode, then local function variables and
+ arguments can be evaluated.
+
Examples: >
:echo remote_expr("gvim", "2+2")
:echo remote_expr("gvim1", "b:current_syntax")
@@ -5454,9 +6306,10 @@ remote_peek({serverid} [, {retvar}]) *remote_peek()*
:let repl = ""
:echo "PEEK: ".remote_peek(id, "repl").": ".repl
-remote_read({serverid}) *remote_read()*
+remote_read({serverid}, [{timeout}]) *remote_read()*
Return the oldest available reply from {serverid} and consume
- it. It blocks until a reply is available.
+ it. Unless a {timeout} in seconds is given, it blocks until a
+ reply is available.
See also |clientserver|.
This function is not available in the |sandbox|.
{only available when compiled with the |+clientserver| feature}
@@ -5474,6 +6327,7 @@ remote_send({server}, {string} [, {idvar}])
See also |clientserver| |RemoteReply|.
This function is not available in the |sandbox|.
{only available when compiled with the |+clientserver| feature}
+
Note: Any errors will be reported in the server and may mess
up the display.
Examples: >
@@ -5485,6 +6339,12 @@ remote_send({server}, {string} [, {idvar}])
:echo remote_send("gvim", ":sleep 10 | echo ".
\ 'server2client(expand("<client>"), "HELLO")<CR>')
<
+ *remote_startserver()* *E941* *E942*
+remote_startserver({name})
+ Become the server {name}. This fails if already running as a
+ server, when |v:servername| is not empty.
+ {only available when compiled with the |+clientserver| feature}
+
remove({list}, {idx} [, {end}]) *remove()*
Without {end}: Remove the item at {idx} from |List| {list} and
return the item.
@@ -5554,39 +6414,35 @@ round({expr}) *round()*
echo round(-4.5)
< -5.0
-rpcnotify({channel}, {event}[, {args}...]) {Nvim} *rpcnotify()*
+rpcnotify({channel}, {event}[, {args}...]) *rpcnotify()*
Sends {event} to {channel} via |RPC| and returns immediately.
If {channel} is 0, the event is broadcast to all channels.
Example: >
:au VimLeave call rpcnotify(0, "leaving")
-rpcrequest({channel}, {method}[, {args}...]) {Nvim} *rpcrequest()*
+rpcrequest({channel}, {method}[, {args}...]) *rpcrequest()*
Sends a request to {channel} to invoke {method} via
|RPC| and blocks until a response is received.
Example: >
:let result = rpcrequest(rpc_chan, "func", 1, 2, 3)
-rpcstart({prog}[, {argv}]) {Nvim} *rpcstart()*
- Spawns {prog} as a job (optionally passing the list {argv}),
- and opens an |RPC| channel with the spawned process's
- stdin/stdout. Returns:
- - channel id on success, which is used by |rpcrequest()|,
- |rpcnotify()| and |rpcstop()|
- - 0 on failure
- Example: >
- :let rpc_chan = rpcstart('prog', ['arg1', 'arg2'])
+rpcstart({prog}[, {argv}]) *rpcstart()*
+ Deprecated. Replace >
+ :let id = rpcstart('prog', ['arg1', 'arg2'])
+< with >
+ :let id = jobstart(['prog', 'arg1', 'arg2'], {'rpc': v:true})
-rpcstop({channel}) {Nvim} *rpcstop()*
- Closes an |RPC| {channel}, possibly created via
- |rpcstart()|. Also closes channels created by connections to
- |v:servername|.
+rpcstop({channel}) *rpcstop()*
+ Deprecated. Instead use |jobstop()| to stop any job, and
+ chanclose(id, "rpc") to close RPC communication without
+ stopping the job. Use chanclose(id) to close any socket.
-screenattr(row, col) *screenattr()*
- Like screenchar(), but return the attribute. This is a rather
+screenattr({row}, {col}) *screenattr()*
+ Like |screenchar()|, but return the attribute. This is a rather
arbitrary number that can only be used to compare to the
attribute at other positions.
-screenchar(row, col) *screenchar()*
+screenchar({row}, {col}) *screenchar()*
The result is a Number, which is the character at position
[row, col] on the screen. This works for every possible
screen position, also status lines, window separators and the
@@ -5613,6 +6469,7 @@ screenrow() *screenrow()*
The result is a Number, which is the current screen row of the
cursor. The top line has number one.
This function is mainly used for testing.
+ Alternatively you can use |winline()|.
Note: Same restrictions as with |screencol()|.
@@ -5641,7 +6498,7 @@ search({pattern} [, {flags} [, {stopline} [, {timeout}]]]) *search()*
flag.
'ignorecase', 'smartcase' and 'magic' are used.
-
+
When the 'z' flag is not given, searching always starts in
column zero and then matches before the cursor are skipped.
When the 'c' flag is present in 'cpo' the next search starts
@@ -5759,6 +6616,8 @@ searchpair({start}, {middle}, {end} [, {flags} [, {skip}
When {skip} is omitted or empty, every match is accepted.
When evaluating {skip} causes an error the search is aborted
and -1 returned.
+ {skip} can be a string, a lambda, a funcref or a partial.
+ Anything else makes the function fail.
For {stopline} and {timeout} see |search()|.
@@ -5846,28 +6705,41 @@ server2client({clientid}, {string}) *server2client()*
:echo server2client(expand("<client>"), "HELLO")
<
serverlist() *serverlist()*
- Returns a list of available server names in a list.
- When there are no servers an empty string is returned.
+ Returns a list of server addresses, or empty if all servers
+ were stopped. |serverstart()| |serverstop()|
Example: >
:echo serverlist()
-< {Nvim} *--serverlist*
- The Vim command-line option `--serverlist` was removed from
- Nvim, but it can be imitated: >
- nvim --cmd "echo serverlist()" --cmd "q"
-<
+
serverstart([{address}]) *serverstart()*
- Opens a named pipe or TCP socket at {address} for clients to
- connect to and returns {address}. If no address is given, it
- is equivalent to: >
+ Opens a socket or named pipe at {address} and listens for
+ |RPC| messages. Clients can send |API| commands to the address
+ to control Nvim. Returns the address string.
+
+ If {address} does not contain a colon ":" it is interpreted as
+ a named pipe or Unix domain socket path.
+
+ Example: >
+ if has('win32')
+ call serverstart('\\.\pipe\nvim-pipe-1234')
+ else
+ call serverstart('nvim.sock')
+ endif
+<
+ If {address} contains a colon ":" it is interpreted as a TCP
+ address where the last ":" separates the host and port.
+ Assigns a random port if it is empty or 0. Supports IPv4/IPv6.
+
+ Example: >
+ :call serverstart('::1:12345')
+<
+ If no address is given, it is equivalent to: >
:call serverstart(tempname())
+
< |$NVIM_LISTEN_ADDRESS| is set to {address} if not already set.
- *--servername*
- The Vim command-line option `--servername` can be imitated: >
- nvim --cmd "let g:server_addr = serverstart('foo')"
-<
+
serverstop({address}) *serverstop()*
- Closes the pipe or socket at {address}. Does nothing if
- {address} is empty or invalid.
+ Closes the pipe or socket at {address}.
+ Returns TRUE if {address} is valid, else FALSE.
If |$NVIM_LISTEN_ADDRESS| is stopped it is unset.
If |v:servername| is stopped it is set to the next available
address returned by |serverlist()|.
@@ -5955,16 +6827,20 @@ setline({lnum}, {text}) *setline()*
:endfor
< Note: The '[ and '] marks are not set.
-setloclist({nr}, {list} [, {action}[, {title}]]) *setloclist()*
+setloclist({nr}, {list} [, {action}[, {what}]]) *setloclist()*
Create or replace or add to the location list for window {nr}.
- When {nr} is zero the current window is used. For a location
- list window, the displayed location list is modified. For an
- invalid window number {nr}, -1 is returned. If {title} is
- given, it will be used to set |w:quickfix_title| after opening
- the location window.
+ {nr} can be the window number or the |window-ID|.
+ When {nr} is zero the current window is used.
+
+ For a location list window, the displayed location list is
+ modified. For an invalid window number {nr}, -1 is returned.
Otherwise, same as |setqflist()|.
Also see |location-list|.
+ If the optional {what} dictionary argument is supplied, then
+ only the items listed in {what} are set. Refer to |setqflist()|
+ for the list of supported keys in {what}.
+
setmatches({list}) *setmatches()*
Restores a list of matches saved by |getmatches()|. Returns 0
if successful, otherwise -1. All current matches are cleared
@@ -5981,10 +6857,12 @@ setpos({expr}, {list})
[bufnum, lnum, col, off, curswant]
"bufnum" is the buffer number. Zero can be used for the
- current buffer. Setting the cursor is only possible for
- the current buffer. To set a mark in another buffer you can
- use the |bufnr()| function to turn a file name into a buffer
- number.
+ current buffer. When setting an uppercase mark "bufnum" is
+ used for the mark position. For other marks it specifies the
+ buffer to set the mark in. You can use the |bufnr()| function
+ to turn a file name into a buffer number.
+ For setting the cursor and the ' mark "bufnum" is ignored,
+ since these are associated with a window, not a buffer.
Does not change the jumplist.
"lnum" and "col" are the position in the buffer. The first
@@ -6018,11 +6896,13 @@ setpos({expr}, {list})
|winrestview()|.
-setqflist({list} [, {action}[, {title}]]) *setqflist()*
- Create or replace or add to the quickfix list using the items
- in {list}. Each item in {list} is a dictionary.
- Non-dictionary items in {list} are ignored. Each dictionary
- item can contain the following entries:
+setqflist({list} [, {action}[, {what}]]) *setqflist()*
+ Create or replace or add to the quickfix list.
+
+ When {what} is not present, use the items in {list}. Each
+ item must be a dictionary. Non-dictionary items in {list} are
+ ignored. Each dictionary item can contain the following
+ entries:
bufnr buffer number; must be the number of a valid
buffer
@@ -6036,6 +6916,7 @@ setqflist({list} [, {action}[, {title}]]) *setqflist()*
nr error number
text description of the error
type single-character error type, 'E', 'W', etc.
+ valid recognized error message
The "col", "vcol", "nr", "type" and "text" entries are
optional. Either "lnum" or "pattern" entry can be used to
@@ -6045,32 +6926,77 @@ setqflist({list} [, {action}[, {title}]]) *setqflist()*
item will not be handled as an error line.
If both "pattern" and "lnum" are present then "pattern" will
be used.
+ If the "valid" entry is not supplied, then the valid flag is
+ set when "bufnr" is a valid buffer or "filename" exists.
If you supply an empty {list}, the quickfix list will be
cleared.
Note that the list is not exactly the same as what
|getqflist()| returns.
- If {action} is set to 'a', then the items from {list} are
- added to the existing quickfix list. If there is no existing
- list, then a new list is created. If {action} is set to 'r',
- then the items from the current quickfix list are replaced
- with the items from {list}. If {action} is not present or is
- set to ' ', then a new list is created.
+ {action} values: *E927*
+ 'a' The items from {list} are added to the existing
+ quickfix list. If there is no existing list, then a
+ new list is created.
+
+ 'r' The items from the current quickfix list are replaced
+ with the items from {list}. This can also be used to
+ clear the list: >
+ :call setqflist([], 'r')
+<
+ 'f' All the quickfix lists in the quickfix stack are
+ freed.
+
+ If {action} is not present or is set to ' ', then a new list
+ is created. The new quickfix list is added after the current
+ quickfix list in the stack and all the following lists are
+ freed. To add a new quickfix list at the end of the stack,
+ set "nr" in {what} to "$".
If {title} is given, it will be used to set |w:quickfix_title|
after opening the quickfix window.
+ If the optional {what} dictionary argument is supplied, then
+ only the items listed in {what} are set. The first {list}
+ argument is ignored. The following items can be specified in
+ {what}:
+ context quickfix list context. See |quickfix-context|
+ efm errorformat to use when parsing text from
+ "lines". If this is not present, then the
+ 'errorformat' option value is used.
+ id quickfix list identifier |quickfix-ID|
+ items list of quickfix entries. Same as the {list}
+ argument.
+ lines use 'errorformat' to parse a list of lines and
+ add the resulting entries to the quickfix list
+ {nr} or {id}. Only a |List| value is supported.
+ nr list number in the quickfix stack; zero
+ means the current quickfix list and "$" means
+ the last quickfix list
+ title quickfix list title text
+ Unsupported keys in {what} are ignored.
+ If the "nr" item is not present, then the current quickfix list
+ is modified. When creating a new quickfix list, "nr" can be
+ set to a value one greater than the quickfix stack size.
+ When modifying a quickfix list, to guarantee that the correct
+ list is modified, "id" should be used instead of "nr" to
+ specify the list.
+
+ Examples (See also |setqflist-examples|): >
+ :call setqflist([], 'r', {'title': 'My search'})
+ :call setqflist([], 'r', {'nr': 2, 'title': 'Errors'})
+ :call setqflist([], 'a', {'id':qfid, 'lines':["F1:10:L10"]})
+<
Returns zero for success, -1 for failure.
This function can be used to create a quickfix list
independent of the 'errorformat' setting. Use a command like
- ":cc 1" to jump to the first position.
+ `:cc 1` to jump to the first position.
*setreg()*
setreg({regname}, {value} [, {options}])
Set the register {regname} to {value}.
- {value} may be any value returned by |getreg()|, including
+ {value} may be any value returned by |getreg()|, including
a |List|.
If {options} contains "a" or {regname} is upper case,
then the value is appended.
@@ -6082,16 +7008,18 @@ setreg({regname}, {value} [, {options}])
used as the width of the selection - if it is not specified
then the width of the block is set to the number of characters
in the longest line (counting a <Tab> as 1 character).
+ If {options} contains "u" or '"', then the unnamed register is
+ set to point to register {regname}.
If {options} contains no register settings, then the default
- is to use character mode unless {value} ends in a <NL> for
- string {value} and linewise mode for list {value}. Blockwise
+ is to use character mode unless {value} ends in a <NL> for
+ string {value} and linewise mode for list {value}. Blockwise
mode is never selected automatically.
Returns zero for success, non-zero for failure.
*E883*
- Note: you may not use |List| containing more than one item to
- set search and expression registers. Lists containing no
+ Note: you may not use |List| containing more than one item to
+ set search and expression registers. Lists containing no
items act like empty strings.
Examples: >
@@ -6100,9 +7028,9 @@ setreg({regname}, {value} [, {options}])
:call setreg('a', "1\n2\n3", 'b5')
< This example shows using the functions to save and restore a
- register (note: you may not reliably restore register value
- without using the third argument to |getreg()| as without it
- newlines are represented as newlines AND Nul bytes are
+ register (note: you may not reliably restore register value
+ without using the third argument to |getreg()| as without it
+ newlines are represented as newlines AND Nul bytes are
represented as newlines as well, see |NL-used-for-Nul|). >
:let var_a = getreg('a', 1, 1)
:let var_amode = getregtype('a')
@@ -6125,6 +7053,7 @@ settabwinvar({tabnr}, {winnr}, {varname}, {val}) *settabwinvar()*
{val}.
Tabs are numbered starting with one. For the current tabpage
use |setwinvar()|.
+ {winnr} can be the window number or the |window-ID|.
When {winnr} is zero the current window is used.
This also works for a global or local buffer option, but it
doesn't work for a global or local buffer variable.
@@ -6150,20 +7079,24 @@ shellescape({string} [, {special}]) *shellescape()*
On Windows when 'shellslash' is not set, it
will enclose {string} in double quotes and double all double
quotes within {string}.
- For other systems, it will enclose {string} in single quotes
- and replace all "'" with "'\''".
+ Otherwise, it will enclose {string} in single quotes and
+ replace all "'" with "'\''".
+
When the {special} argument is present and it's a non-zero
Number or a non-empty String (|non-zero-arg|), then special
items such as "!", "%", "#" and "<cword>" will be preceded by
a backslash. This backslash will be removed again by the |:!|
command.
+
The "!" character will be escaped (again with a |non-zero-arg|
{special}) when 'shell' contains "csh" in the tail. That is
because for csh and tcsh "!" is used for history replacement
even when inside single quotes.
- The <NL> character is also escaped. With a |non-zero-arg|
- {special} and 'shell' containing "csh" in the tail it's
+
+ With a |non-zero-arg| {special} the <NL> character is also
+ escaped. When 'shell' containing "csh" in the tail it's
escaped a second time.
+
Example of use with a |:!| command: >
:exe '!dir ' . shellescape(expand('<cfile>'), 1)
< This results in a directory listing for the file under the
@@ -6225,10 +7158,30 @@ sinh({expr}) *sinh()*
:echo sinh(-0.9)
< -1.026517
+sockconnect({mode}, {address}, {opts}) *sockconnect()*
+ Connect a socket to an address. If {mode} is "pipe" then
+ {address} should be the path of a named pipe. If {mode} is
+ "tcp" then {address} should be of the form "host:port" where
+ the host should be an ip adderess or host name, and port the
+ port number.
+
+ Returns a |channel| ID. Close the socket with |chanclose()|.
+ Use |chansend()| to send data over a bytes socket, and
+ |rpcrequest()| and |rpcnotify()| to communicate with a RPC
+ socket.
+
+ {opts} is a dictionary with these keys:
+ |on_data| : callback invoked when data was read from socket
+ data_buffered : read data from socket in |buffered| mode.
+ rpc : If set, |msgpack-rpc| will be used to communicate
+ over the socket.
+ Returns:
+ - The channel ID on success (greater than zero)
+ - 0 on invalid arguments or connection failure.
sort({list} [, {func} [, {dict}]]) *sort()* *E702*
Sort the items in {list} in-place. Returns {list}.
-
+
If you want a list to remain unmodified make a copy first: >
:let sortedlist = sort(copy(mylist))
@@ -6239,7 +7192,7 @@ sort({list} [, {func} [, {dict}]]) *sort()* *E702*
When {func} is given and it is '1' or 'i' then case is
ignored.
-
+
When {func} is given and it is 'n' then all items will be
sorted numerical (Implementation detail: This uses the
strtod() function to parse numbers, Strings, Lists, Dicts and
@@ -6375,6 +7328,45 @@ sqrt({expr}) *sqrt()*
"nan" may be different, it depends on system libraries.
+stdioopen({opts}) *stdioopen()*
+ In a nvim launched with the |--headless| option, this opens
+ stdin and stdout as a |channel|. This function can only be
+ invoked once per instance. See |channel-stdio| for more
+ information and examples. Note that stderr is not handled by
+ this function, see |v:stderr|.
+
+ Returns a |channel| ID. Close the stdio descriptors with |chanclose()|.
+ Use |chansend()| to send data to stdout, and
+ |rpcrequest()| and |rpcnotify()| to communicate over RPC.
+
+ {opts} is a dictionary with these keys:
+ |on_stdin| : callback invoked when stdin is written to.
+ stdin_buffered : read stdin in |buffered| mode.
+ rpc : If set, |msgpack-rpc| will be used to communicate
+ over stdio
+ Returns:
+ - The channel ID on success (this is always 1)
+ - 0 on invalid arguments
+
+
+stdpath({what}) *stdpath()* *E6100*
+ Returns |standard-path| locations of various default files and
+ directories.
+
+ {what} Type Description ~
+ cache String Cache directory. Arbitrary temporary
+ storage for plugins, etc.
+ config String User configuration directory. The
+ |init.vim| is stored here.
+ config_dirs List Additional configuration directories.
+ data String User data directory. The |shada-file|
+ is stored here.
+ data_dirs List Additional data directories.
+
+ Example: >
+ :echo stdpath("config")
+
+
str2float({expr}) *str2float()*
Convert String {expr} to a Float. This mostly works the same
as when using a floating point number in an expression, see
@@ -6410,7 +7402,6 @@ strchars({expr} [, {skipcc}]) *strchars()*
When {skipcc} set to 1, Composing characters are ignored.
Also see |strlen()|, |strdisplaywidth()| and |strwidth()|.
-
{skipcc} is only available after 7.4.755. For backward
compatibility, you can define a wrapper function: >
if has("patch-7.4.755")
@@ -6427,8 +7418,15 @@ strchars({expr} [, {skipcc}]) *strchars()*
endfunction
endif
<
-
-strdisplaywidth({expr}[, {col}]) *strdisplaywidth()*
+strcharpart({src}, {start} [, {len}]) *strcharpart()*
+ Like |strpart()| but using character index and length instead
+ of byte index and length.
+ When a character index is used where a character does not
+ exist it is assumed to be one character. For example: >
+ strcharpart('abc', -1, 2)
+< results in 'a'.
+
+strdisplaywidth({expr} [, {col}]) *strdisplaywidth()*
The result is a Number, which is the number of display cells
String {expr} occupies on the screen when it starts at {col}.
When {col} is omitted zero is used. Otherwise it is the
@@ -6460,6 +7458,12 @@ strftime({format} [, {time}]) *strftime()*
< Not available on all systems. To check use: >
:if exists("*strftime")
+strgetchar({str}, {index}) *strgetchar()*
+ Get character {index} from {str}. This uses a character
+ index, not a byte index. Composing characters are considered
+ separate characters here.
+ Also see |strcharpart()| and |strchars()|.
+
stridx({haystack}, {needle} [, {start}]) *stridx()*
The result is a Number, which gives the byte index in
{haystack} of the first occurrence of the String {needle}.
@@ -6486,21 +7490,20 @@ string({expr}) Return {expr} converted to a String. If {expr} is a Number,
{expr} type result ~
String 'string'
Number 123
- Float 123.123456 or 1.123456e8 or
+ Float 123.123456 or 1.123456e8 or
`str2float('inf')`
Funcref `function('name')`
List [item, item]
Dictionary {key: value, key: value}
Note that in String values the ' character is doubled.
Also see |strtrans()|.
- Note 2: Output format is mostly compatible with YAML, except
- for infinite and NaN floating-point values representations
- which use |str2float()|. Strings are also dumped literally,
- only single quote is escaped, which does not allow using YAML
- for parsing back binary strings (including text when
- 'encoding' is not UTF-8). |eval()| should always work for
- strings and floats though and this is the only official
- method, use |msgpackdump()| or |json_encode()| if you need to
+ Note 2: Output format is mostly compatible with YAML, except
+ for infinite and NaN floating-point values representations
+ which use |str2float()|. Strings are also dumped literally,
+ only single quote is escaped, which does not allow using YAML
+ for parsing back binary strings. |eval()| should always work for
+ strings and floats though and this is the only official
+ method, use |msgpackdump()| or |json_encode()| if you need to
share data with other application.
*strlen()*
@@ -6512,17 +7515,20 @@ strlen({expr}) The result is a Number, which is the length of the String
|strchars()|.
Also see |len()|, |strdisplaywidth()| and |strwidth()|.
-strpart({src}, {start}[, {len}]) *strpart()*
+strpart({src}, {start} [, {len}]) *strpart()*
The result is a String, which is part of {src}, starting from
byte {start}, with the byte length {len}.
- When non-existing bytes are included, this doesn't result in
- an error, the bytes are simply omitted.
+ To count characters instead of bytes use |strcharpart()|.
+
+ When bytes are selected which do not exist, this doesn't
+ result in an error, the bytes are simply omitted.
If {len} is missing, the copy continues from {start} till the
end of the {src}. >
strpart("abcdefg", 3, 2) == "de"
strpart("abcdefg", -2, 4) == "ab"
strpart("abcdefg", 5, 4) == "fg"
strpart("abcdefg", 3) == "defg"
+
< Note: To get the first character, {start} must be 0. For
example, to get three bytes under and after the cursor: >
strpart(getline("."), col(".") - 1, 3)
@@ -6561,7 +7567,7 @@ strwidth({expr}) *strwidth()*
Ambiguous, this function's return value depends on 'ambiwidth'.
Also see |strlen()|, |strdisplaywidth()| and |strchars()|.
-submatch({nr}[, {list}]) *submatch()*
+submatch({nr} [, {list}]) *submatch()* *E935*
Only for an expression in a |:substitute| command or
substitute() function.
Returns the {nr}'th submatch of the matched text. When {nr}
@@ -6570,16 +7576,20 @@ submatch({nr}[, {list}]) *submatch()*
multi-line match or a NUL character in the text.
Also see |sub-replace-expression|.
- If {list} is present and non-zero then submatch() returns
- a list of strings, similar to |getline()| with two arguments.
+ If {list} is present and non-zero then submatch() returns
+ a list of strings, similar to |getline()| with two arguments.
NL characters in the text represent NUL characters in the
text.
Only returns more than one item for |:substitute|, inside
|substitute()| this list will always contain one or zero
items, since there are no real line breaks.
- Example: >
+ When substitute() is used recursively only the submatches in
+ the current (deepest) call can be obtained.
+
+ Examples: >
:s/\d\+/\=submatch(0) + 1/
+ :echo substitute(text, '\d\+', '\=submatch(0) + 1', '')
< This finds the first number in the line and adds one to it.
A line break is included as a newline character.
@@ -6588,7 +7598,7 @@ substitute({expr}, {pat}, {sub}, {flags}) *substitute()*
the first match of {pat} is replaced with {sub}.
When {flags} is "g", all matches of {pat} in {expr} are
replaced. Otherwise {flags} should be "".
-
+
This works like the ":substitute" command (without any flags).
But the matching with {pat} is always done like the 'magic'
option is set and 'cpoptions' is empty (to make scripts
@@ -6616,6 +7626,14 @@ substitute({expr}, {pat}, {sub}, {flags}) *substitute()*
:echo substitute(s, '%\(\x\x\)',
\ '\=nr2char("0x" . submatch(1))', 'g')
+< When {sub} is a Funcref that function is called, with one
+ optional argument. Example: >
+ :echo substitute(s, '%\(\x\x\)', SubNr, 'g')
+< The optional argument is a list which contains the whole
+ matched string and up to nine submatches,like what
+ |submatch()| returns. Example: >
+ :echo substitute(s, '\(\x\x\)', {m -> '0x' . m[1]}, 'g')
+
synID({lnum}, {col}, {trans}) *synID()*
The result is a Number, which is the syntax ID at the position
{lnum} and {col} in the current window.
@@ -6628,9 +7646,9 @@ synID({lnum}, {col}, {trans}) *synID()*
that's where the cursor can be in Insert mode, synID() returns
zero.
- When {trans} is non-zero, transparent items are reduced to the
+ When {trans} is |TRUE|, transparent items are reduced to the
item that they reveal. This is useful when wanting to know
- the effective color. When {trans} is zero, the transparent
+ the effective color. When {trans} is |FALSE|, the transparent
item is returned. This is useful when wanting to know which
syntax item is effective (e.g. inside parens).
Warning: This function can be very slow. Best speed is
@@ -6681,17 +7699,29 @@ synIDtrans({synID}) *synIDtrans()*
":highlight link" are followed.
synconcealed({lnum}, {col}) *synconcealed()*
- The result is a List. The first item in the list is 0 if the
- character at the position {lnum} and {col} is not part of a
- concealable region, 1 if it is. The second item in the list is
- a string. If the first item is 1, the second item contains the
- text which will be displayed in place of the concealed text,
- depending on the current setting of 'conceallevel'. The third
- and final item in the list is a unique number representing the
- specific syntax region matched. This allows detection of the
- beginning of a new concealable region if there are two
- consecutive regions with the same replacement character.
- For an example use see $VIMRUNTIME/syntax/2html.vim .
+ The result is a List with currently three items:
+ 1. The first item in the list is 0 if the character at the
+ position {lnum} and {col} is not part of a concealable
+ region, 1 if it is.
+ 2. The second item in the list is a string. If the first item
+ is 1, the second item contains the text which will be
+ displayed in place of the concealed text, depending on the
+ current setting of 'conceallevel' and 'listchars'.
+ 3. The third and final item in the list is a number
+ representing the specific syntax region matched in the
+ line. When the character is not concealed the value is
+ zero. This allows detection of the beginning of a new
+ concealable region if there are two consecutive regions
+ with the same replacement character. For an example, if
+ the text is "123456" and both "23" and "45" are concealed
+ and replaced by the character "X", then:
+ call returns ~
+ synconcealed(lnum, 1) [0, '', 0]
+ synconcealed(lnum, 2) [1, 'X', 1]
+ synconcealed(lnum, 3) [1, 'X', 1]
+ synconcealed(lnum, 4) [1, 'X', 2]
+ synconcealed(lnum, 5) [1, 'X', 2]
+ synconcealed(lnum, 6) [0, '', 0]
synstack({lnum}, {col}) *synstack()*
@@ -6713,26 +7743,35 @@ synstack({lnum}, {col}) *synstack()*
valid positions.
system({cmd} [, {input}]) *system()* *E677*
- Get the output of the shell command {cmd} as a |string|. {cmd}
- will be run the same as in |jobstart()|. See |systemlist()|
- to get the output as a |List|.
-
- When {input} is given and is a string this string is written
- to a file and passed as stdin to the command. The string is
- written as-is, you need to take care of using the correct line
- separators yourself.
- If {input} is given and is a |List| it is written to the file
- in a way |writefile()| does with {binary} set to "b" (i.e.
- with a newline between each list item with newlines inside
- list items converted to NULs).
- Pipes are not used.
-
- Note: Use |shellescape()| or |::S| with |expand()| or
- |fnamemodify()| to escape special characters in a command
- argument. Newlines in {cmd} may cause the command to fail.
- The characters in 'shellquote' and 'shellxquote' may also
+ Get the output of {cmd} as a |string| (use |systemlist()| to
+ get a |List|). {cmd} is treated exactly as in |jobstart()|.
+ Not to be used for interactive commands.
+
+ If {input} is a string it is written to a pipe and passed as
+ stdin to the command. The string is written as-is, line
+ separators are not changed.
+ If {input} is a |List| it is written to the pipe as
+ |writefile()| does with {binary} set to "b" (i.e. with
+ a newline between each list item, and newlines inside list
+ items converted to NULs).
+ When {input} is given and is a valid buffer id, the content of
+ the buffer is written to the file line by line, each line
+ terminated by a NL (and NUL where the text has NL).
+ *E5677*
+ Note: system() cannot write to or read from backgrounded ("&")
+ shell commands, e.g.: >
+ :echo system("cat - &", "foo"))
+< which is equivalent to: >
+ $ echo foo | bash -c 'cat - &'
+< The pipes are disconnected (unless overridden by shell
+ redirection syntax) before input can reach it. Use
+ |jobstart()| instead.
+
+ Note: Use |shellescape()| or |::S| with |expand()| or
+ |fnamemodify()| to escape special characters in a command
+ argument. Newlines in {cmd} may cause the command to fail.
+ The characters in 'shellquote' and 'shellxquote' may also
cause trouble.
- This is not to be used for interactive commands.
The result is a String. Example: >
:let files = system("ls " . shellescape(expand('%:h')))
@@ -6747,9 +7786,6 @@ system({cmd} [, {input}]) *system()* *E677*
The command executed is constructed using several options when
{cmd} is a string: 'shell' 'shellcmdflag' {cmd}
- The command will be executed in "cooked" mode, so that a
- CTRL-C will interrupt the command (on Unix at least).
-
The resulting error code can be found in |v:shell_error|.
This function will fail in |restricted-mode|.
@@ -6761,20 +7797,20 @@ system({cmd} [, {input}]) *system()* *E677*
systemlist({cmd} [, {input} [, {keepempty}]]) *systemlist()*
- Same as |system()|, but returns a |List| with lines (parts of
- output separated by NL) with NULs transformed into NLs. Output
- is the same as |readfile()| will output with {binary} argument
+ Same as |system()|, but returns a |List| with lines (parts of
+ output separated by NL) with NULs transformed into NLs. Output
+ is the same as |readfile()| will output with {binary} argument
set to "b", except that a final newline is not preserved,
- unless {keepempty} is present and it's non-zero.
+ unless {keepempty} is non-zero.
+ Note that on MS-Windows you may get trailing CR characters.
- Returns an empty string on error, so be careful not to run
- into |E706|.
+ Returns an empty string on error.
tabpagebuflist([{arg}]) *tabpagebuflist()*
The result is a |List|, where each item is the number of the
buffer associated with each window in the current tab page.
- {arg} specifies the number of tab page to be used. When
+ {arg} specifies the number of the tab page to be used. When
omitted the current tab page is used.
When {arg} is invalid the number zero is returned.
To get a list of all buffers in all tabs use this: >
@@ -6811,8 +7847,13 @@ tagfiles() Returns a |List| with the file names used to search for tags
for the current buffer. This is the 'tags' option expanded.
-taglist({expr}) *taglist()*
+taglist({expr} [, {filename}]) *taglist()*
Returns a list of tags matching the regular expression {expr}.
+
+ If {filename} is passed it is used to prioritize the results
+ in the same way that |:tselect| does. See |tag-priority|.
+ {filename} should be the full path of the file.
+
Each list item is a dictionary with at least the following
entries:
name Name of the tag.
@@ -6835,7 +7876,7 @@ taglist({expr}) *taglist()*
may appear, they give the name of the entity the tag is
contained in.
- The ex-command 'cmd' can be either an ex search pattern, a
+ The ex-command "cmd" can be either an ex search pattern, a
line number or a line number followed by a byte number.
If there are no matching tags, then an empty list is returned.
@@ -6858,7 +7899,7 @@ tempname() *tempname()* *temp-file-name*
For MS-Windows forward slashes are used when the 'shellslash'
option is set or when 'shellcmdflag' starts with '-'.
-termopen({cmd}[, {opts}]) {Nvim} *termopen()*
+termopen({cmd}[, {opts}]) *termopen()*
Spawns {cmd} in a new pseudo-terminal session connected
to the current buffer. {cmd} is the same as the one passed to
|jobstart()|. This function fails if the current buffer is
@@ -6870,7 +7911,13 @@ termopen({cmd}[, {opts}]) {Nvim} *termopen()*
and `$TERM` is set to "xterm-256color".
Returns the same values as |jobstart()|.
- See |terminal-emulator| for more information.
+ See |terminal| for more information.
+
+test_garbagecollect_now() *test_garbagecollect_now()*
+ Like |garbagecollect()|, but executed right away. This must
+ only be called directly to avoid any structure to exist
+ internally, and |v:testing| must have been set before calling
+ any function.
tan({expr}) *tan()*
Return the tangent of {expr}, measured in radians, as a |Float|
@@ -6894,7 +7941,36 @@ tanh({expr}) *tanh()*
< -0.761594
- *timer_start()*
+ *timer_info()*
+timer_info([{id}])
+ Return a list with information about timers.
+ When {id} is given only information about this timer is
+ returned. When timer {id} does not exist an empty list is
+ returned.
+ When {id} is omitted information about all timers is returned.
+
+ For each timer the information is stored in a Dictionary with
+ these items:
+ "id" the timer ID
+ "time" time the timer was started with
+ "repeat" number of times the timer will still fire;
+ -1 means forever
+ "callback" the callback
+
+timer_pause({timer}, {paused}) *timer_pause()*
+ Pause or unpause a timer. A paused timer does not invoke its
+ callback when its time expires. Unpausing a timer may cause
+ the callback to be invoked almost immediately if enough time
+ has passed.
+
+ Pausing a timer is useful to avoid the callback to be called
+ for a short time.
+
+ If {paused} evaluates to a non-zero Number or a non-empty
+ String, then the timer is paused, otherwise it is unpaused.
+ See |non-zero-arg|.
+
+ *timer_start()* *timer* *timers*
timer_start({time}, {callback} [, {options}])
Create a timer and return the timer ID.
@@ -6903,13 +7979,14 @@ timer_start({time}, {callback} [, {options}])
busy or Vim is not waiting for input the time will be longer.
{callback} is the function to call. It can be the name of a
- function or a Funcref. It is called with one argument, which
+ function or a |Funcref|. It is called with one argument, which
is the timer ID. The callback is only invoked when Vim is
waiting for input.
{options} is a dictionary. Supported entries:
"repeat" Number of times to repeat calling the
- callback. -1 means forever.
+ callback. -1 means forever. When not present
+ the callback will be called once.
Example: >
func MyHandler(timer)
@@ -6919,11 +7996,16 @@ timer_start({time}, {callback} [, {options}])
\ {'repeat': 3})
< This will invoke MyHandler() three times at 500 msec
intervals.
- {only available when compiled with the |+timers| feature}
timer_stop({timer}) *timer_stop()*
- Stop a timer. {timer} is an ID returned by timer_start().
- The timer callback will no longer be invoked.
+ Stop a timer. The timer callback will no longer be invoked.
+ {timer} is an ID returned by timer_start(), thus it must be a
+ Number. If {timer} does not exist there is no error.
+
+timer_stopall() *timer_stopall()*
+ Stop all timers. The timer callbacks will no longer be
+ invoked. Useful if some timers is misbehaving. If there are
+ no timers there is no error.
tolower({expr}) *tolower()*
The result is a copy of the String given, with all uppercase
@@ -6949,6 +8031,22 @@ tr({src}, {fromstr}, {tostr}) *tr()*
echo tr("<blob>", "<>", "{}")
< returns "{blob}"
+trim({text} [, {mask}]) *trim()*
+ Return {text} as a String where any character in {mask} is
+ removed from the beginning and end of {text}.
+ If {mask} is not given, {mask} is all characters up to 0x20,
+ which includes Tab, space, NL and CR, plus the non-breaking
+ space character 0xa0.
+ This code deals with multibyte characters properly.
+
+ Examples: >
+ echo trim(" some text ")
+< returns "some text" >
+ echo trim(" \r\t\t\r RESERVE \t\n\x0B\xA0") . "_TAIL"
+< returns "RESERVE_TAIL" >
+ echo trim("rm<Xrm<>X>rrm", "rm<>")
+< returns "Xrm<>X" (characters in the middle are not removed)
+
trunc({expr}) *trunc()*
Return the largest integral value with magnitude less than or
equal to {expr} as a |Float| (truncate towards zero).
@@ -6962,16 +8060,18 @@ trunc({expr}) *trunc()*
< 4.0
type({expr}) *type()*
- The result is a Number, depending on the type of {expr}:
- Number: 0
- String: 1
- Funcref: 2
- List: 3
- Dictionary: 4
- Float: 5
+ The result is a Number representing the type of {expr}.
+ Instead of using the number directly, it is better to use the
+ v:t_ variable that has the value:
+ Number: 0 (|v:t_number|)
+ String: 1 (|v:t_string|)
+ Funcref: 2 (|v:t_func|)
+ List: 3 (|v:t_list|)
+ Dictionary: 4 (|v:t_dict|)
+ Float: 5 (|v:t_float|)
Boolean: 6 (|v:true| and |v:false|)
Null: 7 (|v:null|)
- To avoid the magic numbers it should be used this way: >
+ For backward compatibility, this method can be used: >
:if type(myvar) == type(0)
:if type(myvar) == type("")
:if type(myvar) == type(function("tr"))
@@ -6979,9 +8079,11 @@ type({expr}) *type()*
:if type(myvar) == type({})
:if type(myvar) == type(0.0)
:if type(myvar) == type(v:true)
-< In place of checking for |v:null| type it is better to check
+< In place of checking for |v:null| type it is better to check
for |v:null| directly as it is the only value of this type: >
:if myvar is v:null
+< To check if the v:t_ variables exist use this: >
+ :if exists('v:t_number')
undofile({name}) *undofile()*
Return the name of the undo file that would be used for a file
@@ -7009,7 +8111,7 @@ undotree() *undotree()*
"save_last" Number of the last file write. Zero when no
write yet.
"save_cur" Number of the current position in the undo
- tree.
+ tree.
"synced" Non-zero when the last undo block was synced.
This happens when waiting from input from the
user. See |undo-blocks|.
@@ -7104,16 +8206,12 @@ visualmode([expr]) *visualmode()*
Visual mode that was used.
If Visual mode is active, use |mode()| to get the Visual mode
(e.g., in a |:vmap|).
- *non-zero-arg*
If [expr] is supplied and it evaluates to a non-zero Number or
a non-empty String, then the Visual mode will be cleared and
- the old value is returned. Note that " " and "0" are also
- non-empty strings, thus cause the mode to be cleared. A List,
- Dictionary or Float is not a Number or String, thus does not
- cause the mode to be cleared.
+ the old value is returned. See |non-zero-arg|.
wildmenumode() *wildmenumode()*
- Returns non-zero when the wildmenu is active and zero
+ Returns |TRUE| when the wildmenu is active and |FALSE|
otherwise. See 'wildmenu' and 'wildmode'.
This can be used in mappings to handle the 'wildcharm' option
gracefully. (Makes only sense with |mapmode-c| mappings).
@@ -7124,11 +8222,48 @@ wildmenumode() *wildmenumode()*
(Note, this needs the 'wildcharm' option set appropriately).
+win_findbuf({bufnr}) *win_findbuf()*
+ Returns a list with |window-ID|s for windows that contain
+ buffer {bufnr}. When there is none the list is empty.
+
+win_getid([{win} [, {tab}]]) *win_getid()*
+ Get the |window-ID| for the specified window.
+ When {win} is missing use the current window.
+ With {win} this is the window number. The top window has
+ number 1.
+ Without {tab} use the current tab, otherwise the tab with
+ number {tab}. The first tab has number one.
+ Return zero if the window cannot be found.
+
+win_gotoid({expr}) *win_gotoid()*
+ Go to window with ID {expr}. This may also change the current
+ tabpage.
+ Return 1 if successful, 0 if the window cannot be found.
+
+win_id2tabwin({expr} *win_id2tabwin()*
+ Return a list with the tab number and window number of window
+ with ID {expr}: [tabnr, winnr].
+ Return [0, 0] if the window cannot be found.
+
+win_id2win({expr}) *win_id2win()*
+ Return the window number of window with ID {expr}.
+ Return 0 if the window cannot be found in the current tabpage.
+
+win_screenpos({nr}) *win_screenpos()*
+ Return the screen position of window {nr} as a list with two
+ numbers: [row, col]. The first window always has position
+ [1, 1].
+ {nr} can be the window number or the |window-ID|.
+ Return [0, 0] if the window cannot be found in the current
+ tabpage.
+
*winbufnr()*
winbufnr({nr}) The result is a Number, which is the number of the buffer
- associated with window {nr}. When {nr} is zero, the number of
- the buffer in the current window is returned. When window
- {nr} doesn't exist, -1 is returned.
+ associated with window {nr}. {nr} can be the window number or
+ the |window-ID|.
+ When {nr} is zero, the number of the buffer in the current
+ window is returned.
+ When window {nr} doesn't exist, -1 is returned.
Example: >
:echo "The file in the current window is " . bufname(winbufnr(0))
<
@@ -7139,9 +8274,11 @@ wincol() The result is a Number, which is the virtual column of the
winheight({nr}) *winheight()*
The result is a Number, which is the height of window {nr}.
+ {nr} can be the window number or the |window-ID|.
When {nr} is zero, the height of the current window is
returned. When window {nr} doesn't exist, -1 is returned.
An existing window always has a height of zero or more.
+ This excludes any window toolbar line.
Examples: >
:echo "The current window has " . winheight(0) . " lines."
<
@@ -7164,7 +8301,7 @@ winnr([{arg}]) The result is a Number, which is the number of the current
is returned.
The number can be used with |CTRL-W_w| and ":wincmd w"
|:wincmd|.
- Also see |tabpagewinnr()|.
+ Also see |tabpagewinnr()| and |win_getid()|.
*winrestcmd()*
winrestcmd() Returns a sequence of |:resize| commands that should restore
@@ -7218,6 +8355,7 @@ winsaveview() Returns a |Dictionary| that contains information to restore
winwidth({nr}) *winwidth()*
The result is a Number, which is the width of window {nr}.
+ {nr} can be the window number or the |window-ID|.
When {nr} is zero, the width of the current window is
returned. When window {nr} doesn't exist, -1 is returned.
An existing window always has a width of zero or more.
@@ -7226,7 +8364,10 @@ winwidth({nr}) *winwidth()*
:if winwidth(0) <= 50
: exe "normal 50\<C-W>|"
:endif
-<
+< For getting the terminal or screen size, see the 'columns'
+ option.
+
+
wordcount() *wordcount()*
The result is a dictionary of byte/chars/word statistics for
the current buffer. This is the same info as provided by
@@ -7242,11 +8383,11 @@ wordcount() *wordcount()*
cursor_words Number of words before cursor position
(not in Visual mode)
visual_bytes Number of bytes visually selected
- (only in Visual mode)
+ (only in Visual mode)
visual_chars Number of chars visually selected
- (only in Visual mode)
+ (only in Visual mode)
visual_words Number of chars visually selected
- (only in Visual mode)
+ (only in Visual mode)
*writefile()*
@@ -7262,6 +8403,12 @@ writefile({list}, {fname} [, {flags}])
appended to the file: >
:call writefile(["foo"], "event.log", "a")
:call writefile(["bar"], "event.log", "a")
+<
+ When {flags} contains "S" fsync() call is not used, with "s"
+ it is used, 'fsync' option applies by default. No fsync()
+ means that writefile() will finish faster, but writes may be
+ left in OS buffers and not yet written to disk. Such changes
+ will disappear if system crashes before OS does writing.
All NL characters are replaced with a NUL character.
Inserting CR characters needs to be done before passing {list}
@@ -7291,9 +8438,13 @@ There are four types of features:
:if has("cindent")
2. Features that are only supported when certain conditions have been met.
Example: >
- :if has("gui_running")
+ :if has("win32")
< *has-patch*
-3. Included patches. The "patch123" feature means that patch 123 has been
+3. Nvim version. The "nvim-0.2.1" feature means that the Nvim version is
+ 0.2.1 or later. Example: >
+ :if has("nvim-0.2.1")
+<
+4. Included patches. The "patch123" feature means that patch 123 has been
included. Note that this form does not check the version of Vim, you need
to inspect |v:version| for that.
Example (checking version 6.2.148 or later): >
@@ -7301,7 +8452,7 @@ There are four types of features:
< Note that it's possible for patch 147 to be omitted even though 148 is
included.
-4. Beyond a certain version or at a certain version and including a specific
+5. Beyond a certain version or at a certain version and including a specific
patch. The "patch-7.4.237" feature means that the Vim version is 7.5 or
later, or it is version 7.4 and patch 237 was included.
Note that this only works for patch 7.4.237 and later, before that you
@@ -7310,6 +8461,10 @@ There are four types of features:
< Note that it's possible for patch 147 to be omitted even though 148 is
included.
+Hint: To find out if Vim supports backslashes in a file name (MS-Windows),
+use: `if exists('+shellslash')`
+
+
acl Compiled with |ACL| support.
arabic Compiled with Arabic support |Arabic|.
autocmd Compiled with autocommand support. |autocommand|
@@ -7318,17 +8473,14 @@ browse Compiled with |:browse| support, and browse() will
browsefilter Compiled with support for |browsefilter|.
byte_offset Compiled with support for 'o' in 'statusline'
cindent Compiled with 'cindent' support.
-clientserver Compiled with remote invocation support |clientserver|.
clipboard Compiled with 'clipboard' support.
cmdline_compl Compiled with |cmdline-completion| support.
cmdline_hist Compiled with |cmdline-history| support.
cmdline_info Compiled with 'showcmd' and 'ruler' support.
comments Compiled with |'comments'| support.
-compatible Compiled to be very Vi compatible.
cscope Compiled with |cscope| support.
debug Compiled with "DEBUG" defined.
dialog_con Compiled with console dialog support.
-dialog_gui Compiled with GUI dialog support.
digraphs Compiled with support for digraphs.
eval Compiled with expression evaluation support. Always
true, of course!
@@ -7346,14 +8498,12 @@ fname_case Case in file names matters (for Windows this is not
present).
folding Compiled with |folding| support.
gettext Compiled with message translation |multi-lang|
-gui Compiled with GUI enabled.
-gui_running Vim is running in the GUI, or it will start soon.
-gui_win32 Compiled with MS Windows Win32 GUI.
iconv Can use iconv() for conversion.
insert_expand Compiled with support for CTRL-X expansion commands in
Insert mode.
jumplist Compiled with |jumplist| support.
keymap Compiled with 'keymap' support.
+lambda Compiled with |lambda| support.
langmap Compiled with 'langmap' support.
libcall Compiled with |libcall()| support.
linebreak Compiled with 'linebreak', 'breakat', 'showbreak' and
@@ -7362,8 +8512,7 @@ lispindent Compiled with support for lisp indenting.
listcmds Compiled with commands for the buffer list |:files|
and the argument list |arglist|.
localmap Compiled with local mappings and abbr. |:map-local|
-mac Macintosh version of Vim.
-macunix Macintosh version of Vim, using Unix files (OS-X).
+mac macOS version of Nvim.
menu Compiled with support for |:menu|.
mksession Compiled with support for |:mksession|.
modify_fname Compiled with file name modifiers. |filename-modifiers|
@@ -7371,16 +8520,17 @@ mouse Compiled with support mouse.
mouseshape Compiled with support for 'mouseshape'.
multi_byte Compiled with support for 'encoding'
multi_byte_encoding 'encoding' is set to a multi-byte encoding.
-multi_byte_ime Compiled with support for IME input method.
multi_lang Compiled with support for multiple languages.
-ole Compiled with OLE automation support for Win32.
+num64 Compiled with 64-bit |Number| support.
+nvim This is Nvim. |has-patch|
path_extra Compiled with up/downwards search in 'path' and 'tags'
persistent_undo Compiled with support for persistent undo history.
postscript Compiled with PostScript file printing.
printer Compiled with |:hardcopy| support.
profile Compiled with |:profile| support.
-python Compiled with Python 2.x interface. |has-python|
-python3 Compiled with Python 3.x interface. |has-python|
+python Legacy Vim Python 2.x API is available. |has-python|
+python3 Legacy Vim Python 3.x API is available. |has-python|
+pythonx Compiled with |python_x| interface. |has-pythonx|
quickfix Compiled with |quickfix| support.
reltime Compiled with |reltime()| support.
rightleft Compiled with 'rightleft' support.
@@ -7403,15 +8553,14 @@ tag_old_static Compiled with support for old static tags
|tag-old-static|.
tag_any_white Compiled with support for any white characters in tags
files |tag-any-white|.
-terminfo Compiled with terminfo instead of termcap.
-termresponse Compiled with support for |t_RV| and |v:termresponse|.
+termresponse Compiled with support for t_RV and |v:termresponse|.
textobjects Compiled with support for |text-objects|.
-tgetent Compiled with tgetent support, able to use a termcap
- or terminfo file.
timers Compiled with |timer_start()| support.
title Compiled with window title support |'title'|.
-toolbar Compiled with support for |gui-toolbar|.
+ttyin input is a terminal (tty)
+ttyout output is a terminal (tty)
unix Unix version of Vim.
+unnamedplus Compiled with support for "unnamedplus" in 'clipboard'
user_commands User-defined commands.
vertsplit Compiled with vertically split windows |:vsplit|.
vim_starting True while initial source'ing takes place. |startup|
@@ -7421,20 +8570,15 @@ visual Compiled with Visual mode.
visualextra Compiled with extra Visual mode commands.
|blockwise-operators|.
vreplace Compiled with |gR| and |gr| commands.
+vtp Compiled for vcon support |+vtp| (check vcon to find
+ out if it works in the current console)).
wildignore Compiled with 'wildignore' option.
wildmenu Compiled with 'wildmenu' option.
win32 Windows version of Vim (32 or 64 bit).
-win32unix Windows version of Vim, using Unix files (Cygwin).
-win64 Windows version of Vim (64 bit).
winaltkeys Compiled with 'winaltkeys' option.
windows Compiled with support for more than one window.
writebackup Compiled with 'writebackup' default on.
-xfontset Compiled with X fontset support |xfontset|.
-xim Compiled with X input method support |xim|.
-xpm Compiled with pixmap support.
-xpm_w32 Compiled with pixmap support for Win32. (Only for
- backward compatibility. Use "xpm" instead.)
-x11 Compiled with X11 support.
+wsl WSL (Windows Subsystem for Linux) version of Vim.
*string-match*
Matching a pattern in a String
@@ -7504,14 +8648,17 @@ last defined. Example: >
See |:verbose-cmd| for more information.
*E124* *E125* *E853* *E884*
-:fu[nction][!] {name}([arguments]) [range] [abort] [dict]
- Define a new function by the name {name}. The name
- must be made of alphanumeric characters and '_', and
- must start with a capital or "s:" (see above). Note
- that using "b:" or "g:" is not allowed. (since patch
- 7.4.260 E884 is given if the function name has a colon
- in the name, e.g. for "foo:bar()". Before that patch
- no error was given).
+:fu[nction][!] {name}([arguments]) [range] [abort] [dict] [closure]
+ Define a new function by the name {name}. The body of
+ the function follows in the next lines, until the
+ matching |:endfunction|.
+
+ The name must be made of alphanumeric characters and
+ '_', and must start with a capital or "s:" (see
+ above). Note that using "b:" or "g:" is not allowed.
+ (since patch 7.4.260 E884 is given if the function
+ name has a colon in the name, e.g. for "foo:bar()".
+ Before that patch no error was given).
{name} can also be a |Dictionary| entry that is a
|Funcref|: >
@@ -7527,6 +8674,9 @@ See |:verbose-cmd| for more information.
not used an error message is given. When [!] is used,
an existing function is silently replaced. Unless it
is currently being executed, that is an error.
+ NOTE: Use ! wisely. If used without care it can cause
+ an existing function to be replaced unexpectedly,
+ which is hard to debug.
For the {arguments} see |function-argument|.
@@ -7547,6 +8697,28 @@ See |:verbose-cmd| for more information.
be invoked through an entry in a |Dictionary|. The
local variable "self" will then be set to the
dictionary. See |Dictionary-function|.
+ *:func-closure* *E932*
+ When the [closure] argument is added, the function
+ can access variables and arguments from the outer
+ scope. This is usually called a closure. In this
+ example Bar() uses "x" from the scope of Foo(). It
+ remains referenced even after Foo() returns: >
+ :function! Foo()
+ : let x = 0
+ : function! Bar() closure
+ : let x += 1
+ : return x
+ : endfunction
+ : return funcref('Bar')
+ :endfunction
+
+ :let F = Foo()
+ :echo F()
+< 1 >
+ :echo F()
+< 2 >
+ :echo F()
+< 3
*function-search-undo*
The last used search pattern and the redo command "."
@@ -7554,18 +8726,36 @@ See |:verbose-cmd| for more information.
implies that the effect of |:nohlsearch| is undone
when the function returns.
- *:endf* *:endfunction* *E126* *E193*
-:endf[unction] The end of a function definition. Must be on a line
- by its own, without other commands.
-
- *:delf* *:delfunction* *E130* *E131*
-:delf[unction] {name} Delete function {name}.
+ *:endf* *:endfunction* *E126* *E193* *W22*
+:endf[unction] [argument]
+ The end of a function definition. Best is to put it
+ on a line by its own, without [argument].
+
+ [argument] can be:
+ | command command to execute next
+ \n command command to execute next
+ " comment always ignored
+ anything else ignored, warning given when
+ 'verbose' is non-zero
+ The support for a following command was added in Vim
+ 8.0.0654, before that any argument was silently
+ ignored.
+
+ To be able to define a function inside an `:execute`
+ command, use line breaks instead of |:bar|: >
+ :exe "func Foo()\necho 'foo'\nendfunc"
+<
+ *:delf* *:delfunction* *E130* *E131* *E933*
+:delf[unction][!] {name}
+ Delete function {name}.
{name} can also be a |Dictionary| entry that is a
|Funcref|: >
:delfunc dict.init
-< This will remove the "init" entry from "dict". The
+< This will remove the "init" entry from "dict". The
function is deleted if there are no more references to
it.
+ With the ! there is no error if the function does not
+ exist.
*:retu* *:return* *E133*
:retu[rn] [expr] Return from a function. When "[expr]" is given, it is
evaluated and returned as the result of the function.
@@ -7594,24 +8784,23 @@ can be 0). "a:000" is set to a |List| that contains these arguments. Note
that "a:1" is the same as "a:000[0]".
*E742*
The a: scope and the variables in it cannot be changed, they are fixed.
-However, if a |List| or |Dictionary| is used, you can change their contents.
-Thus you can pass a |List| to a function and have the function add an item to
-it. If you want to make sure the function cannot change a |List| or
-|Dictionary| use |:lockvar|.
+However, if a composite type is used, such as |List| or |Dictionary| , you can
+change their contents. Thus you can pass a |List| to a function and have the
+function add an item to it. If you want to make sure the function cannot
+change a |List| or |Dictionary| use |:lockvar|.
When not using "...", the number of arguments in a function call must be equal
to the number of named arguments. When using "...", the number of arguments
may be larger.
It is also possible to define a function without any arguments. You must
-still supply the () then. The body of the function follows in the next lines,
-until the matching |:endfunction|. It is allowed to define another function
-inside a function body.
+still supply the () then.
+
+It is allowed to define another function inside a function body.
*local-variables*
-Inside a function variables can be used. These are local variables, which
-will disappear when the function returns. Global variables need to be
-accessed with "g:".
+Inside a function local variables can be used. These will disappear when the
+function returns. Global variables need to be accessed with "g:".
Example: >
:function Table(title, ...)
@@ -7724,7 +8913,7 @@ like this: >
When such a function is called, and it is not defined yet, Vim will search the
"autoload" directories in 'runtimepath' for a script file called
-"filename.vim". For example "~/.config/nvim/autoload/filename.vim". That
+"filename.vim". For example "~/.config/nvim/autoload/filename.vim". That
file should then define the function like this: >
function filename#funcname()
@@ -7764,9 +8953,6 @@ Also note that if you have two script files, and one calls a function in the
other and vice versa, before the used function is defined, it won't work.
Avoid using the autoload functionality at the toplevel.
-Hint: If you distribute a bunch of scripts you can pack them together with the
-|vimball| utility. Also read the user manual |distribute-script|.
-
==============================================================================
6. Curly braces names *curly-braces-names*
@@ -7985,6 +9171,14 @@ This does NOT work: >
variables are automatically deleted when the function
ends.
+:unl[et] ${env-name} ... *:unlet-environment* *:unlet-$*
+ Remove environment variable {env-name}.
+ Can mix {name} and ${env-name} in one :unlet command.
+ No error message is given for a non-existing
+ variable, also without !.
+ If the system does not support deleting an environment
+ variable, it is made emtpy.
+
:lockv[ar][!] [depth] {name} ... *:lockvar* *:lockv*
Lock the internal variable {name}. Locking means that
it can no longer be changed (until it is unlocked).
@@ -7992,9 +9186,12 @@ This does NOT work: >
:lockvar v
:let v = 'asdf' " fails!
:unlet v
-< *E741*
+< *E741* *E940*
If you try to change a locked variable you get an
- error message: "E741: Value is locked: {name}"
+ error message: "E741: Value is locked: {name}".
+ If you try to lock or unlock a built-in variable you
+ will get an error message "E940: Cannot lock or unlock
+ variable {name}".
[depth] is relevant when locking a |List| or
|Dictionary|. It specifies how deep the locking goes:
@@ -8107,14 +9304,6 @@ This does NOT work: >
endfor
< Note that reordering the list (e.g., with sort() or
reverse()) may have unexpected effects.
- Note that the type of each list item should be
- identical to avoid errors for the type of {var}
- changing. Unlet the variable at the end of the loop
- to allow multiple item types: >
- for item in ["foo", ["bar"]]
- echo item
- unlet item " E706 without this
- endfor
:for [{var1}, {var2}, ...] in {listlist}
:endfo[r]
@@ -8260,17 +9449,17 @@ This does NOT work: >
with the |:redraw| command. Example: >
:new | redraw | echo "there is a new window"
< *:echo-self-refer*
- When printing nested containers echo prints second
- occurrence of the self-referencing container using
- "[...@level]" (self-referencing |List|) or
+ When printing nested containers echo prints second
+ occurrence of the self-referencing container using
+ "[...@level]" (self-referencing |List|) or
"{...@level}" (self-referencing |Dict|): >
:let l = []
:call add(l, l)
:let l2 = []
:call add(l2, [l2])
:echo l l2
-< echoes "[[...@0]] [[[...@0]]]". Echoing "[l]" will
- echo "[[[...@1]]]" because l first occurs at second
+< echoes "[[...@0]] [[[...@0]]]". Echoing "[l]" will
+ echo "[[[...@1]]]" because l first occurs at second
level.
*:echon*
@@ -9462,7 +10651,7 @@ code can be used: >
redir => scriptnames_output
silent scriptnames
redir END
-
+
" Split the output into lines and parse each line. Add an entry to the
" "scripts" dictionary.
let scripts = {}
@@ -9499,6 +10688,23 @@ missing: >
: echo "You will _never_ see this message"
:endif
+To execute a command only when the |+eval| feature is disabled requires a trick,
+as this example shows: >
+
+ silent! while 0
+ set history=111
+ silent! endwhile
+
+When the |+eval| feature is available the command is skipped because of the
+"while 0". Without the |+eval| feature the "while 0" is an error, which is
+silently ignored, and the command is executed.
+
+The "<CR>" here is a real CR character, type CTRL-V Enter to get it.
+
+When the |+eval| feature is available the ":" is remapped to add a double
+quote, which has the effect of commenting-out the command. Without the
+|+eval| feature the nnoremap command is skipped and the command is executed.
+
==============================================================================
11. The sandbox *eval-sandbox* *sandbox* *E48*
@@ -9511,7 +10717,7 @@ The sandbox is also used for the |:sandbox| command.
These items are not allowed in the sandbox:
- changing the buffer text
- - defining or changing mapping, autocommands, functions, user commands
+ - defining or changing mapping, autocommands, user commands
- setting certain options (see |option-summary|)
- setting certain v: variables (see |v:var|) *E794*
- executing a shell command
@@ -9533,6 +10739,7 @@ location. Insecure in this context are:
- sourcing a .nvimrc or .exrc in the current directory
- while executing in the sandbox
- value coming from a modeline
+- executing a function that was defined in the sandbox
Note that when in the sandbox and saving an option value and restoring it, the
option will still be marked as it was set in the sandbox.
@@ -9543,7 +10750,7 @@ option will still be marked as it was set in the sandbox.
In a few situations it is not allowed to change the text in the buffer, jump
to another window and some other things that might confuse or break what Vim
is currently doing. This mostly applies to things that happen when Vim is
-actually doing something else. For example, evaluating the 'balloonexpr' may
+actually doing something else. For example, evaluating the 'balloonexpr' may
happen any moment the mouse cursor is resting at some position.
This is not allowed when the textlock is active:
@@ -9553,5 +10760,123 @@ This is not allowed when the textlock is active:
- closing a window or quitting Vim
- etc.
+==============================================================================
+13. Command-line expressions highlighting *expr-highlight*
+
+Expressions entered by the user in |i_CTRL-R_=|, |c_CTRL-\_e|, |quote=| are
+highlighted by the built-in expressions parser. It uses highlight groups
+described in the table below, which may be overriden by colorschemes.
+ *hl-NvimInvalid*
+Besides the "Nvim"-prefixed highlight groups described below, there are
+"NvimInvalid"-prefixed highlight groups which have the same meaning but
+indicate that the token contains an error or that an error occurred just
+before it. They have mostly the same hierarchy, except that (by default) in
+place of any non-Nvim-prefixed group NvimInvalid linking to `Error` is used
+and some other intermediate groups are present.
+
+Group Default link Colored expression ~
+*hl-NvimInternalError* None, red/red Parser bug
+
+*hl-NvimAssignment* Operator Generic assignment
+*hl-NvimPlainAssignment* NvimAssignment `=` in |:let|
+*hl-NvimAugmentedAssignment* NvimAssignment Generic, `+=`/`-=`/`.=`
+*hl-NvimAssignmentWithAddition* NvimAugmentedAssignment `+=` in |:let+=|
+*hl-NvimAssignmentWithSubtraction* NvimAugmentedAssignment `-=` in |:let-=|
+*hl-NvimAssignmentWithConcatenation* NvimAugmentedAssignment `.=` in |:let.=|
+
+*hl-NvimOperator* Operator Generic operator
+
+*hl-NvimUnaryOperator* NvimOperator Generic unary op
+*hl-NvimUnaryPlus* NvimUnaryOperator |expr-unary-+|
+*hl-NvimUnaryMinus* NvimUnaryOperator |expr-unary--|
+*hl-NvimNot* NvimUnaryOperator |expr-!|
+
+*hl-NvimBinaryOperator* NvimOperator Generic binary op
+*hl-NvimComparison* NvimBinaryOperator Any |expr4| operator
+*hl-NvimComparisonModifier* NvimComparison `#`/`?` near |expr4| op
+*hl-NvimBinaryPlus* NvimBinaryOperator |expr-+|
+*hl-NvimBinaryMinus* NvimBinaryOperator |expr--|
+*hl-NvimConcat* NvimBinaryOperator |expr-.|
+*hl-NvimConcatOrSubscript* NvimConcat |expr-.| or |expr-entry|
+*hl-NvimOr* NvimBinaryOperator |expr-barbar|
+*hl-NvimAnd* NvimBinaryOperator |expr-&&|
+*hl-NvimMultiplication* NvimBinaryOperator |expr-star|
+*hl-NvimDivision* NvimBinaryOperator |expr-/|
+*hl-NvimMod* NvimBinaryOperator |expr-%|
+
+*hl-NvimTernary* NvimOperator `?` in |expr1|
+*hl-NvimTernaryColon* NvimTernary `:` in |expr1|
+
+*hl-NvimParenthesis* Delimiter Generic bracket
+*hl-NvimLambda* NvimParenthesis `{`/`}` in |lambda|
+*hl-NvimNestingParenthesis* NvimParenthesis `(`/`)` in |expr-nesting|
+*hl-NvimCallingParenthesis* NvimParenthesis `(`/`)` in |expr-function|
+
+*hl-NvimSubscript* NvimParenthesis Generic subscript
+*hl-NvimSubscriptBracket* NvimSubscript `[`/`]` in |expr-[]|
+*hl-NvimSubscriptColon* NvimSubscript `:` in |expr-[:]|
+*hl-NvimCurly* NvimSubscript `{`/`}` in
+ |curly-braces-names|
+
+*hl-NvimContainer* NvimParenthesis Generic container
+*hl-NvimDict* NvimContainer `{`/`}` in |dict| literal
+*hl-NvimList* NvimContainer `[`/`]` in |list| literal
+
+*hl-NvimIdentifier* Identifier Generic identifier
+*hl-NvimIdentifierScope* NvimIdentifier Namespace: letter
+ before `:` in
+ |internal-variables|
+*hl-NvimIdentifierScopeDelimiter* NvimIdentifier `:` after namespace
+ letter
+*hl-NvimIdentifierName* NvimIdentifier Rest of the ident
+*hl-NvimIdentifierKey* NvimIdentifier Identifier after
+ |expr-entry|
+
+*hl-NvimColon* Delimiter `:` in |dict| literal
+*hl-NvimComma* Delimiter `,` in |dict| or |list|
+ literal or
+ |expr-function|
+*hl-NvimArrow* Delimiter `->` in |lambda|
+
+*hl-NvimRegister* SpecialChar |expr-register|
+*hl-NvimNumber* Number Non-prefix digits
+ in integer
+ |expr-number|
+*hl-NvimNumberPrefix* Type `0` for |octal-number|
+ `0x` for |hex-number|
+ `0b` for |binary-number|
+*hl-NvimFloat* NvimNumber Floating-point
+ number
+
+*hl-NvimOptionSigil* Type `&` in |expr-option|
+*hl-NvimOptionScope* NvimIdentifierScope Option scope if any
+*hl-NvimOptionScopeDelimiter* NvimIdentifierScopeDelimiter
+ `:` after option scope
+*hl-NvimOptionName* NvimIdentifier Option name
+
+*hl-NvimEnvironmentSigil* NvimOptionSigil `$` in |expr-env|
+*hl-NvimEnvironmentName* NvimIdentifier Env variable name
+
+*hl-NvimString* String Generic string
+*hl-NvimStringBody* NvimString Generic string
+ literal body
+*hl-NvimStringQuote* NvimString Generic string quote
+*hl-NvimStringSpecial* SpecialChar Generic string
+ non-literal body
+
+*hl-NvimSingleQuote* NvimStringQuote `'` in |expr-'|
+*hl-NvimSingleQuotedBody* NvimStringBody Literal part of
+ |expr-'| string body
+*hl-NvimSingleQuotedQuote* NvimStringSpecial `''` inside |expr-'|
+ string body
+
+*hl-NvimDoubleQuote* NvimStringQuote `"` in |expr-quote|
+*hl-NvimDoubleQuotedBody* NvimStringBody Literal part of
+ |expr-quote| body
+*hl-NvimDoubleQuotedEscape* NvimStringSpecial Valid |expr-quote|
+ escape sequence
+*hl-NvimDoubleQuotedUnknownEscape* NvimInvalidValue Unrecognized
+ |expr-quote| escape
+ sequence
vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/farsi.txt b/runtime/doc/farsi.txt
index b85c0a357c..c5421137f8 100644
--- a/runtime/doc/farsi.txt
+++ b/runtime/doc/farsi.txt
@@ -1,4 +1,4 @@
-*farsi.txt* For Vim version 7.4. Last change: 2010 Aug 07
+*farsi.txt* Nvim
VIM REFERENCE MANUAL by Mortaza Ghassab Shiran
@@ -205,4 +205,4 @@ changes made in the current line.
For more information about the bugs refer to rileft.txt.
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/filetype.txt b/runtime/doc/filetype.txt
index 76aa3a50ce..92404440da 100644
--- a/runtime/doc/filetype.txt
+++ b/runtime/doc/filetype.txt
@@ -1,4 +1,4 @@
-*filetype.txt* For Vim version 7.4. Last change: 2015 Dec 06
+*filetype.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -6,12 +6,10 @@
Filetypes *filetype* *file-type*
-1. Filetypes |filetypes|
-2. Filetype plugin |filetype-plugins|
-3. Docs for the default filetype plugins. |ftplugin-docs|
-
Also see |autocmd.txt|.
+ Type |gO| to see the table of contents.
+
==============================================================================
1. Filetypes *filetypes* *file-types*
@@ -26,15 +24,13 @@ Each time a new or existing file is edited, Vim will try to recognize the type
of the file and set the 'filetype' option. This will trigger the FileType
event, which can be used to set the syntax highlighting, set options, etc.
-Detail: The ":filetype on" command will load one of these files:
- Mac $VIMRUNTIME/filetype.vim
- MS-DOS $VIMRUNTIME\filetype.vim
- Unix $VIMRUNTIME/filetype.vim
+Detail: The ":filetype on" command will load this file:
+ $VIMRUNTIME/filetype.vim
This file is a Vim script that defines autocommands for the
BufNewFile and BufRead events. If the file type is not found by the
name, the file $VIMRUNTIME/scripts.vim is used to detect it from the
contents of the file.
- When the GUI is running or will start soon, the menu.vim script is
+ When the GUI is running or will start soon, the |menu.vim| script is
also sourced. See |'go-M'| about avoiding that.
To add your own file types, see |new-filetype| below. To search for help on a
@@ -156,8 +152,8 @@ file. It will be overwritten when installing a new version of Vim.
A. If you want to overrule all default file type checks.
This works by writing one file for each filetype. The disadvantage is that
- means there can be many files. The advantage is that you can simply drop
- this file in the right directory to make it work.
+ there can be many files. The advantage is that you can simply drop this
+ file in the right directory to make it work.
*ftdetect*
1. Create your user runtime directory. You would normally use the first
item of the 'runtimepath' option. Then create the directory "ftdetect"
@@ -277,6 +273,10 @@ then Vim will load all plugins in these directories and below:
Note that the last one is the value of $VIMRUNTIME which has been expanded.
+Note that when using a plugin manager or |packages| many directories will be
+added to 'runtimepath'. These plugins each require their own directory, don't
+put them directly in ~/.vim/plugin.
+
What if it looks like your plugin is not being loaded? You can find out what
happens when Vim starts up by using the |-V| argument: >
@@ -311,12 +311,12 @@ define yourself. There are a few ways to avoid this:
You need to define your own mapping before the plugin is loaded (before
editing a file of that type). The plugin will then skip installing the
default mapping.
-
+ *no_mail_maps*
3. Disable defining mappings for a specific filetype by setting a variable,
which contains the name of the filetype. For the "mail" filetype this
would be: >
:let no_mail_maps = 1
-
+< *no_plugin_maps*
4. Disable defining mappings for all filetypes by setting a variable: >
:let no_plugin_maps = 1
<
@@ -500,7 +500,7 @@ Options:
avoid that a Subject line with "Vim:" in it will cause an
error message.
'textwidth' is set to 72. This is often recommended for e-mail.
-'formatoptions' is set to break text lines and to repeat the comment leader
+'formatoptions' is set to break text lines and to repeat the comment leader
in new lines, so that a leading ">" for quotes is repeated.
You can also format quoted text with |gq|.
@@ -512,37 +512,46 @@ Local mappings:
MAN *ft-man-plugin* *:Man* *man.vim*
-Displays a manual page in a nice way. Also see the user manual
-|find-manpage|.
+View manpages in Nvim. Supports highlighting, completion, locales, and
+navigation. Also see |find-manpage|.
-To start using the ":Man" command before any manual page was loaded, source
-this script from your startup vimrc file: >
+To use Nvim as a manpager: >
+ export MANPAGER='nvim +Man!'
- runtime ftplugin/man.vim
+man.vim will always attempt to reuse the closest man window (above/left) but
+otherwise create a split.
-Options:
-'iskeyword' the '.' character is added to be able to use CTRL-] on the
- manual page name.
+The case sensitivity of completion is controlled by 'fileignorecase'.
Commands:
-Man {name} Display the manual page for {name} in a window.
-Man {number} {name}
- Display the manual page for {name} in a section {number}.
-
-Global mapping:
-<Leader>K Displays the manual page for the word under the cursor.
+Man {name} Display the manpage for {name}.
+Man {sect} {name} Display the manpage for {name} and section {sect}.
+Man {name}({sect}) Same as above.
+Man {sect} {name}({sect}) Used during completion to show the real section of
+ when the provided section is a prefix, e.g. 1m vs 1.
+Man {path} Open the manpage at {path}. Prepend "./" if {path}
+ is relative to the current directory.
+Man Open the manpage for the <cWORD> (man buffers)
+ or <cword> (non-man buffers) under the cursor.
+Man! Display the current buffer contents as a manpage.
+
+|:Man| accepts command modifiers. For example, to use a vertical split: >
+ :vertical Man printf
Local mappings:
-CTRL-] Jump to the manual page for the word under the cursor.
-CTRL-T Jump back to the previous manual page.
-q Same as ":quit"
-
-To enable folding use this: >
- let g:ft_man_folding_enable = 1
-If you do not like the default folding, use an autocommand to add your desired
-folding style instead. For example: >
- autocmd FileType man setlocal foldmethod=indent foldenable
+K or CTRL-] Jump to the manpage for the <cWORD> under the
+ cursor. Takes a count for the section.
+CTRL-T Jump back to the location that the manpage was
+ opened from.
+gO Show the manpage outline. |gO|
+q :quit if invoked as $MANPAGER, otherwise :close.
+Variables:
+*g:no_man_maps* Do not create mappings in manpage buffers.
+*g:ft_man_folding_enable* Fold manpages with foldmethod=indent foldnestmax=1.
+*b:man_default_sects* Comma-separated, ordered list of preferred sections.
+ For example in C one usually wants section 3 or 2: >
+ :let b:man_default_sections = '3,2'
PDF *ft-pdf-plugin*
@@ -558,6 +567,37 @@ These maps can be disabled with >
:let g:no_pdf_maps = 1
<
+PYTHON *ft-python-plugin* *PEP8*
+
+By default the following options are set, in accordance with PEP8: >
+
+ setlocal expandtab shiftwidth=4 softtabstop=4 tabstop=8
+
+To disable this behavior, set the following variable in your vimrc: >
+
+ let g:python_recommended_style = 0
+
+
+R MARKDOWN *ft-rmd-plugin*
+
+By default ftplugin/html.vim is not sourced. If you want it sourced, add to
+your |vimrc|: >
+ let rmd_include_html = 1
+
+The 'formatexpr' option is set dynamically with different values for R code
+and for Markdown code. If you prefer that 'formatexpr' is not set, add to your
+|vimrc|: >
+ let rmd_dynamic_comments = 0
+
+
+R RESTRUCTURED TEXT *ft-rrst-plugin*
+
+The 'formatexpr' option is set dynamically with different values for R code
+and for ReStructured text. If you prefer that 'formatexpr' is not set, add to
+your |vimrc|: >
+ let rrst_dynamic_comments = 0
+
+
RPM SPEC *ft-spec-plugin*
Since the text for this plugin is rather long it has been put in a separate
@@ -707,6 +747,12 @@ Format description:
not recognized here as well.
+RUST *ft-rust*
+
+Since the text for this plugin is rather long it has been put in a separate
+file: |ft_rust.txt|.
+
+
SQL *ft-sql*
Since the text for this plugin is rather long it has been put in a separate
@@ -728,4 +774,23 @@ You can change the default by defining the variable g:tex_flavor to the format
Currently no other formats are recognized.
- vim:tw=78:ts=8:ft=help:norl:
+VIM *ft-vim-plugin*
+
+The Vim filetype plugin defines mappings to move to the start and end of
+functions with [[ and ]]. Move around comments with ]" and [".
+
+The mappings can be disabled with: >
+ let g:no_vim_maps = 1
+
+
+ZIMBU *ft-zimbu-plugin*
+
+The Zimbu filetype plugin defines mappings to move to the start and end of
+functions with [[ and ]].
+
+The mappings can be disabled with: >
+ let g:no_zimbu_maps = 1
+<
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/fold.txt b/runtime/doc/fold.txt
index 680e3270f2..b7d92fb229 100644
--- a/runtime/doc/fold.txt
+++ b/runtime/doc/fold.txt
@@ -1,4 +1,4 @@
-*fold.txt* For Vim version 7.4. Last change: 2016 Jan 02
+*fold.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -9,10 +9,7 @@ Folding *Folding* *folding* *folds*
You can find an introduction on folding in chapter 28 of the user manual.
|usr_28.txt|
-1. Fold methods |fold-methods|
-2. Fold commands |fold-commands|
-3. Fold options |fold-options|
-4. Behavior of folds |fold-behavior|
+ Type |gO| to see the table of contents.
==============================================================================
1. Fold methods *fold-methods*
@@ -61,7 +58,7 @@ whichever is lower. These are empty or white lines and lines starting
with a character in 'foldignore'. White space is skipped before checking for
characters in 'foldignore'. For C use "#" to ignore preprocessor lines.
-When you want to ignore lines in another way, use the 'expr' method. The
+When you want to ignore lines in another way, use the "expr" method. The
|indent()| function can be used in 'foldexpr' to get the indent of a line.
@@ -76,7 +73,7 @@ This will call a function to compute the fold level: >
:set foldexpr=MyFoldLevel(v:lnum)
This will make a fold out of paragraphs separated by blank lines: >
:set foldexpr=getline(v:lnum)=~'^\\s*$'&&getline(v:lnum+1)=~'\\S'?'<1':1
-this does the same: >
+This does the same: >
:set foldexpr=getline(v:lnum-1)=~'^\\s*$'&&getline(v:lnum)=~'\\S'?'>1':1
Note that backslashes must be used to escape characters that ":set" handles
@@ -136,7 +133,7 @@ fold level. But note that foldlevel() may return -1 if the level is not known
yet. And it returns the level at the start of the line, while a fold might
end in that line.
-It may happened that folds are not updated properly. You can use |zx| or |zX|
+It may happen that folds are not updated properly. You can use |zx| or |zX|
to force updating folds.
@@ -200,7 +197,7 @@ and the level given by the marker:
1. If a marker with the same fold level is encountered, the previous fold
ends and another fold with the same level starts.
2. If a marker with a higher fold level is found, a nested fold is started.
-3. if a marker with a lower fold level is found, all folds up to and including
+3. If a marker with a lower fold level is found, all folds up to and including
this level end and a fold with the specified level starts.
The number indicates the fold level. A zero cannot be used (a marker with
@@ -598,4 +595,4 @@ used. Otherwise the values from the window where the buffer was edited last
are used.
==============================================================================
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/ft_ada.txt b/runtime/doc/ft_ada.txt
index 1e81acff67..771ccc3302 100644
--- a/runtime/doc/ft_ada.txt
+++ b/runtime/doc/ft_ada.txt
@@ -1,4 +1,4 @@
-*ft_ada.txt* For Vim version 7.4. Last change: 2010 Jul 20
+*ft_ada.txt* Nvim
ADA FILE TYPE PLUG-INS REFERENCE MANUAL~
@@ -116,7 +116,7 @@ NOTE: "gnat xref -v" is very tricky to use as it has almost no diagnostic
then "gnat xref -v *.ad?"
4) Project manager support is completely broken - don't even try "gnat xref
-Padacl.gpr".
-5) VIM is faster when the tags file is sorted - use "sort --unique
+5) Vim is faster when the tags file is sorted - use "sort --unique
--ignore-case --output=tags tags" .
6) Remember to insert "!_TAG_FILE_SORTED 2 %sort ui" as first line to mark
the file assorted.
@@ -249,7 +249,7 @@ g:decada.Make_Command string
External command used for |g:decada.Make()| (|'makeprg'|).
*g:decada.Error_Format*
-g:decada.Error_Format| string
+g:decada.Error_Format string
Error format (|'errorformat'|).
==============================================================================
diff --git a/runtime/doc/ft_rust.txt b/runtime/doc/ft_rust.txt
new file mode 100644
index 0000000000..ff2e0ca56f
--- /dev/null
+++ b/runtime/doc/ft_rust.txt
@@ -0,0 +1,239 @@
+*ft_rust.txt* For Vim version 8.1. Last change: 2017 Nov 02
+
+This is documentation for the Rust filetype plugin.
+
+==============================================================================
+CONTENTS *rust*
+
+1. Introduction |rust-intro|
+2. Settings |rust-settings|
+3. Commands |rust-commands|
+4. Mappings |rust-mappings|
+
+==============================================================================
+INTRODUCTION *rust-intro*
+
+This plugin provides syntax and supporting functionality for the Rust
+filetype.
+
+==============================================================================
+SETTINGS *rust-settings*
+
+This plugin has a few variables you can define in your vimrc that change the
+behavior of the plugin.
+
+ *g:rustc_path*
+g:rustc_path~
+ Set this option to the path to rustc for use in the |:RustRun| and
+ |:RustExpand| commands. If unset, "rustc" will be located in $PATH: >
+ let g:rustc_path = $HOME."/bin/rustc"
+<
+
+ *g:rustc_makeprg_no_percent*
+g:rustc_makeprg_no_percent~
+ Set this option to 1 to have 'makeprg' default to "rustc" instead of
+ "rustc %": >
+ let g:rustc_makeprg_no_percent = 1
+<
+
+ *g:rust_conceal*
+g:rust_conceal~
+ Set this option to turn on the basic |conceal| support: >
+ let g:rust_conceal = 1
+<
+
+ *g:rust_conceal_mod_path*
+g:rust_conceal_mod_path~
+ Set this option to turn on |conceal| for the path connecting token
+ "::": >
+ let g:rust_conceal_mod_path = 1
+<
+
+ *g:rust_conceal_pub*
+g:rust_conceal_pub~
+ Set this option to turn on |conceal| for the "pub" token: >
+ let g:rust_conceal_pub = 1
+<
+
+ *g:rust_recommended_style*
+g:rust_recommended_style~
+ Set this option to enable vim indentation and textwidth settings to
+ conform to style conventions of the rust standard library (i.e. use 4
+ spaces for indents and sets 'textwidth' to 99). This option is enabled
+ by default. To disable it: >
+ let g:rust_recommended_style = 0
+<
+
+ *g:rust_fold*
+g:rust_fold~
+ Set this option to turn on |folding|: >
+ let g:rust_fold = 1
+<
+ Value Effect ~
+ 0 No folding
+ 1 Braced blocks are folded. All folds are open by
+ default.
+ 2 Braced blocks are folded. 'foldlevel' is left at the
+ global value (all folds are closed by default).
+
+ *g:rust_bang_comment_leader*
+g:rust_bang_comment_leader~
+ Set this option to 1 to preserve the leader on multi-line doc comments
+ using the /*! syntax: >
+ let g:rust_bang_comment_leader = 1
+<
+
+ *g:ftplugin_rust_source_path*
+g:ftplugin_rust_source_path~
+ Set this option to a path that should be prepended to 'path' for Rust
+ source files: >
+ let g:ftplugin_rust_source_path = $HOME.'/dev/rust'
+<
+
+ *g:rustfmt_command*
+g:rustfmt_command~
+ Set this option to the name of the 'rustfmt' executable in your $PATH. If
+ not specified it defaults to 'rustfmt' : >
+ let g:rustfmt_command = 'rustfmt'
+<
+ *g:rustfmt_autosave*
+g:rustfmt_autosave~
+ Set this option to 1 to run |:RustFmt| automatically when saving a
+ buffer. If not specified it defaults to 0 : >
+ let g:rustfmt_autosave = 0
+<
+ *g:rustfmt_fail_silently*
+g:rustfmt_fail_silently~
+ Set this option to 1 to prevent 'rustfmt' from populating the
+ |location-list| with errors. If not specified it defaults to 0: >
+ let g:rustfmt_fail_silently = 0
+<
+ *g:rustfmt_options*
+g:rustfmt_options~
+ Set this option to a string of options to pass to 'rustfmt'. The
+ write-mode is already set to 'overwrite'. If not specified it
+ defaults to '' : >
+ let g:rustfmt_options = ''
+<
+
+ *g:rust_playpen_url*
+g:rust_playpen_url~
+ Set this option to override the URL for the playpen to use: >
+ let g:rust_playpen_url = 'https://play.rust-lang.org/'
+<
+
+ *g:rust_shortener_url*
+g:rust_shortener_url~
+ Set this option to override the URL for the URL shortener: >
+ let g:rust_shortener_url = 'https://is.gd/'
+<
+
+
+==============================================================================
+COMMANDS *rust-commands*
+
+:RustRun [args] *:RustRun*
+:RustRun! [rustc-args] [--] [args]
+ Compiles and runs the current file. If it has unsaved changes,
+ it will be saved first using |:update|. If the current file is
+ an unnamed buffer, it will be written to a temporary file
+ first. The compiled binary is always placed in a temporary
+ directory, but is run from the current directory.
+
+ The arguments given to |:RustRun| will be passed to the
+ compiled binary.
+
+ If ! is specified, the arguments are passed to rustc instead.
+ A "--" argument will separate the rustc arguments from the
+ arguments passed to the binary.
+
+ If |g:rustc_path| is defined, it is used as the path to rustc.
+ Otherwise it is assumed rustc can be found in $PATH.
+
+:RustExpand [args] *:RustExpand*
+:RustExpand! [TYPE] [args]
+ Expands the current file using --pretty and displays the
+ results in a new split. If the current file has unsaved
+ changes, it will be saved first using |:update|. If the
+ current file is an unnamed buffer, it will be written to a
+ temporary file first.
+
+ The arguments given to |:RustExpand| will be passed to rustc.
+ This is largely intended for specifying various --cfg
+ configurations.
+
+ If ! is specified, the first argument is the expansion type to
+ pass to rustc --pretty. Otherwise it will default to
+ "expanded".
+
+ If |g:rustc_path| is defined, it is used as the path to rustc.
+ Otherwise it is assumed rustc can be found in $PATH.
+
+:RustEmitIr [args] *:RustEmitIr*
+ Compiles the current file to LLVM IR and displays the results
+ in a new split. If the current file has unsaved changes, it
+ will be saved first using |:update|. If the current file is an
+ unnamed buffer, it will be written to a temporary file first.
+
+ The arguments given to |:RustEmitIr| will be passed to rustc.
+
+ If |g:rustc_path| is defined, it is used as the path to rustc.
+ Otherwise it is assumed rustc can be found in $PATH.
+
+:RustEmitAsm [args] *:RustEmitAsm*
+ Compiles the current file to assembly and displays the results
+ in a new split. If the current file has unsaved changes, it
+ will be saved first using |:update|. If the current file is an
+ unnamed buffer, it will be written to a temporary file first.
+
+ The arguments given to |:RustEmitAsm| will be passed to rustc.
+
+ If |g:rustc_path| is defined, it is used as the path to rustc.
+ Otherwise it is assumed rustc can be found in $PATH.
+
+:RustPlay *:RustPlay*
+ This command will only work if you have web-api.vim installed
+ (available at https://github.com/mattn/webapi-vim). It sends the
+ current selection, or if nothing is selected, the entirety of the
+ current buffer to the Rust playpen, and emits a message with the
+ shortened URL to the playpen.
+
+ |g:rust_playpen_url| is the base URL to the playpen, by default
+ "https://play.rust-lang.org/".
+
+ |g:rust_shortener_url| is the base URL for the shortener, by
+ default "https://is.gd/"
+
+:RustFmt *:RustFmt*
+ Runs |g:rustfmt_command| on the current buffer. If
+ |g:rustfmt_options| is set then those will be passed to the
+ executable.
+
+ If |g:rustfmt_fail_silently| is 0 (the default) then it
+ will populate the |location-list| with the errors from
+ |g:rustfmt_command|. If |g:rustfmt_fail_silently| is set to 1
+ then it will not populate the |location-list|.
+
+:RustFmtRange *:RustFmtRange*
+ Runs |g:rustfmt_command| with selected range. See
+ |:RustFmt| for any other information.
+
+==============================================================================
+MAPPINGS *rust-mappings*
+
+This plugin defines mappings for |[[| and |]]| to support hanging indents.
+
+It also has a few other mappings:
+
+ *rust_<D-r>*
+<D-r> Executes |:RustRun| with no arguments.
+ Note: This binding is only available in MacVim.
+
+ *rust_<D-R>*
+<D-R> Populates the command line with |:RustRun|! using the
+ arguments given to the last invocation, but does not
+ execute it.
+ Note: This binding is only available in MacVim.
+
+==============================================================================
+ vim:tw=78:sw=4:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/ft_sql.txt b/runtime/doc/ft_sql.txt
index 75c55269ef..324e2e44af 100644
--- a/runtime/doc/ft_sql.txt
+++ b/runtime/doc/ft_sql.txt
@@ -1,4 +1,4 @@
-*ft_sql.txt* For Vim version 7.4. Last change: 2013 May 15
+*ft_sql.txt* Nvim
by David Fishburn
@@ -773,4 +773,4 @@ Setting the filetype back to Perl sets all the usual "perl" related items back
as they were.
-vim:tw=78:ts=8:ft=help:norl:
+vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/gui.txt b/runtime/doc/gui.txt
index e2fb501ac5..06609a77e1 100644
--- a/runtime/doc/gui.txt
+++ b/runtime/doc/gui.txt
@@ -1,4 +1,4 @@
-*gui.txt* For Vim version 7.4. Last change: 2014 Mar 08
+*gui.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -6,25 +6,10 @@
Vim's Graphical User Interface *gui* *GUI*
-1. Starting the GUI |gui-start|
-2. Scrollbars |gui-scrollbars|
-3. Mouse Control |gui-mouse|
-4. Making GUI Selections |gui-selections|
-5. Menus |menus|
-6. Extras |gui-extras|
-
-Other GUI documentation:
-|gui_w32.txt| For specific items of the Win32 GUI.
+ Type |gO| to see the table of contents.
==============================================================================
-1. Starting the GUI *gui-start* *E229* *E233*
-
-First you must make sure you actually have a version of Vim with the GUI code
-included.
-
-How to start the GUI depends on the system used. Mostly you can run the
-GUI version of Vim with:
- gvim [options] [files...]
+Starting the GUI *gui-start* *E229* *E233*
*ginit.vim* *gui-init* *gvimrc* *$MYGVIMRC*
The gvimrc file is where GUI-specific startup commands should be placed. It
@@ -32,8 +17,6 @@ is always sourced after the |init.vim| file. If you have one then the
$MYGVIMRC environment variable has its name.
When the GUI starts up initializations are carried out, in this order:
-- The 'term' option is set to "builtin_gui" and terminal options are reset to
- their default value for the GUI |terminal-options|.
- If the system menu file exists, it is sourced. The name of this file is
normally "$VIMRUNTIME/menu.vim". You can check this with ":version". Also
see |$VIMRUNTIME|. To skip loading the system menu include 'M' in
@@ -63,7 +46,8 @@ When the GUI starts up initializations are carried out, in this order:
already set.
NOTE: All but the first one are not carried out if Vim was started with
-"-u NONE" and no "-U" argument was given, or when started with "-U NONE".
+"-u NONE" or "-u DEFAULTS" and no "-U" argument was given, or when started
+with "-U NONE".
All this happens AFTER the normal Vim initializations, like reading your
vimrc file. See |initialization|.
@@ -83,39 +67,16 @@ Recommended place for your personal GUI initializations:
The personal initialization files are searched in the order specified above
and only the first one that is found is read.
-There are a number of options which only have meaning in the GUI version of
-Vim. These are 'guicursor', 'guifont', and 'guioptions'. They are
-documented in |options.txt| with all the other options.
-
-Another way to set the colors for different occasions is with highlight
-groups. The "Normal" group is used to set the background and foreground
-colors. Example (which looks nice): >
-
- :highlight Normal guibg=grey90
-
-The "guibg" and "guifg" settings override the normal background and
-foreground settings. The other settings for the Normal highlight group are
-not used. Use the 'guifont' option to set the font.
-
-Also check out the 'guicursor' option, to set the colors for the cursor in
-various modes.
-
-Vim tries to make the window fit on the screen when it starts up. This avoids
-that you can't see part of it. On the X Window System this requires a bit of
-guesswork. You can change the height that is used for the window title and a
-task bar with the 'guiheadroom' option.
-
*:winp* *:winpos* *E188*
:winp[os]
Display current position of the top left corner of the GUI vim
window in pixels. Does not work in all versions.
- Also see |getwinposx()| and |getwinposy()|.
+ Also see |getwinpos()|, |getwinposx()| and |getwinposy()|.
:winp[os] {X} {Y} *E466*
Put the GUI vim window at the given {X} and {Y} coordinates.
The coordinates should specify the position in pixels of the
- top left corner of the window. Does not work in all versions.
- Does work in an (new) xterm |xterm-color|.
+ top left corner of the window.
When the GUI window has not been opened yet, the values are
remembered until the window is opened. The position is
adjusted to make the window fit on the screen (if possible).
@@ -124,24 +85,9 @@ task bar with the 'guiheadroom' option.
:win[size] {width} {height}
Set the window height to {width} by {height} characters.
Obsolete, use ":set lines=11 columns=22".
- If you get less lines than expected, check the 'guiheadroom'
- option.
-
-If you are running the X Window System, you can get information about the
-window Vim is running in with these commands: >
- :!xwininfo -id $WINDOWID
- :!xprop -id $WINDOWID
- :execute '!xwininfo -id ' . v:windowid
- :execute '!xprop -id ' . v:windowid
-<
- *gui-IME* *iBus*
-Input methods for international characters in X that rely on the XIM
-framework, most notably iBus, have been known to produce undesirable results
-in gVim. These may include an inability to enter spaces, or long delays
-between typing a character and it being recognized by the application.
==============================================================================
-2. Scrollbars *gui-scrollbars*
+Scrollbars *gui-scrollbars*
There are vertical scrollbars and a horizontal scrollbar. You may
configure which ones appear with the 'guioptions' option.
@@ -209,167 +155,7 @@ include the 'h' flag in 'guioptions'. Then the scrolling is limited by the
text of the current cursor line.
==============================================================================
-3. Mouse Control *gui-mouse*
-
-The mouse only works if the appropriate flag in the 'mouse' option is set.
-When the GUI is switched on, and 'mouse' wasn't set yet, the 'mouse' option is
-automatically set to "a", enabling it for all modes except for the
-|hit-enter| prompt. If you don't want this, a good place to change the
-'mouse' option is the "gvimrc" file.
-
-Other options that are relevant:
-'mousefocus' window focus follows mouse pointer |gui-mouse-focus|
-'mousemodel' what mouse button does which action
-'mousehide' hide mouse pointer while typing text
-'selectmode' whether to start Select mode or Visual mode
-
-A quick way to set these is with the ":behave" command.
- *:behave* *:be*
-:be[have] {model} Set behavior for mouse and selection. Valid
- arguments are:
- mswin MS-Windows behavior
- xterm Xterm behavior
-
- Using ":behave" changes these options:
- option mswin xterm ~
- 'selectmode' "mouse,key" ""
- 'mousemodel' "popup" "extend"
- 'keymodel' "startsel,stopsel" ""
- 'selection' "exclusive" "inclusive"
-
-In the $VIMRUNTIME directory, there is a script called |mswin.vim|, which will
-also map a few keys to the MS-Windows cut/copy/paste commands. This is NOT
-compatible, since it uses the CTRL-V, CTRL-X and CTRL-C keys. If you don't
-mind, use this command: >
- :so $VIMRUNTIME/mswin.vim
-
-For scrolling with a wheel on a mouse, see |scroll-mouse-wheel|.
-
-
-3.1 Moving Cursor with Mouse *gui-mouse-move*
-
-Click the left mouse button somewhere in a text buffer where you want the
-cursor to go, and it does!
-This works in when 'mouse' contains ~
-Normal mode 'n' or 'a'
-Visual mode 'v' or 'a'
-Insert mode 'i' or 'a'
-
-Select mode is handled like Visual mode.
-
-You may use this with an operator such as 'd' to delete text from the current
-cursor position to the position you point to with the mouse. That is, you hit
-'d' and then click the mouse somewhere.
-
- *gui-mouse-focus*
-The 'mousefocus' option can be set to make the keyboard focus follow the
-mouse pointer. This means that the window where the mouse pointer is, is the
-active window. Warning: this doesn't work very well when using a menu,
-because the menu command will always be applied to the top window.
-
-If you are on the ':' line (or '/' or '?'), then clicking the left or right
-mouse button will position the cursor on the ':' line (if 'mouse' contains
-'c', 'a' or 'A').
-
-In any situation the middle mouse button may be clicked to paste the current
-selection.
-
-
-3.2 Selection with Mouse *gui-mouse-select*
-
-The mouse can be used to start a selection. How depends on the 'mousemodel'
-option:
-'mousemodel' is "extend": use the right mouse button
-'mousemodel' is "popup": use the left mouse button, while keeping the Shift
-key pressed.
-
-If there was no selection yet, this starts a selection from the old cursor
-position to the position pointed to with the mouse. If there already is a
-selection then the closest end will be extended.
-
-If 'selectmode' contains "mouse", then the selection will be in Select mode.
-This means that typing normal text will replace the selection. See
-|Select-mode|. Otherwise, the selection will be in Visual mode.
-
-Double clicking may be done to make the selection word-wise, triple clicking
-makes it line-wise, and quadruple clicking makes it rectangular block-wise.
-
-See |gui-selections| on how the selection is used.
-
-
-3.3 Other Text Selection with Mouse *gui-mouse-modeless*
- *modeless-selection*
-A different kind of selection is used when:
-- in Command-line mode
-- in the Command-line window and pointing in another window
-- at the |hit-enter| prompt
-- whenever the current mode is not in the 'mouse' option
-- when holding the CTRL and SHIFT keys in the GUI
-
-Since Vim continues like the selection isn't there, and there is no mode
-associated with the selection, this is called modeless selection. Any text in
-the Vim window can be selected. Select the text by pressing the left mouse
-button at the start, drag to the end and release. To extend the selection,
-use the right mouse button when 'mousemodel' is "extend", or the left mouse
-button with the shift key pressed when 'mousemodel' is "popup".
-The selection is removed when the selected text is scrolled or changed.
-
-On the command line CTRL-Y can be used to copy the selection into the
-clipboard. To do this from Insert mode, use CTRL-O : CTRL-Y <CR>. When
-'guioptions' contains a or A (default on X11), the selection is automatically
-copied to the "* register.
-
-The middle mouse button can then paste the text. On non-X11 systems, you can
-use CTRL-R +.
-
-
-3.4 Using Mouse on Status Lines *gui-mouse-status*
-
-Clicking the left or right mouse button on the status line below a Vim
-window makes that window the current window. This actually happens on button
-release (to be able to distinguish a click from a drag action).
-
-With the left mouse button a status line can be dragged up and down, thus
-resizing the windows above and below it. This does not change window focus.
-
-The same can be used on the vertical separator: click to give the window left
-of it focus, drag left and right to make windows wider and narrower.
-
-
-3.5 Various Mouse Clicks *gui-mouse-various*
-
- <S-LeftMouse> Search forward for the word under the mouse click.
- When 'mousemodel' is "popup" this starts or extends a
- selection.
- <S-RightMouse> Search backward for the word under the mouse click.
- <C-LeftMouse> Jump to the tag name under the mouse click.
- <C-RightMouse> Jump back to position before the previous tag jump
- (same as "CTRL-T")
-
-
-3.6 Mouse Mappings *gui-mouse-mapping*
-
-The mouse events, complete with modifiers, may be mapped. Eg: >
- :map <S-LeftMouse> <RightMouse>
- :map <S-LeftDrag> <RightDrag>
- :map <S-LeftRelease> <RightRelease>
- :map <2-S-LeftMouse> <2-RightMouse>
- :map <2-S-LeftDrag> <2-RightDrag>
- :map <2-S-LeftRelease> <2-RightRelease>
- :map <3-S-LeftMouse> <3-RightMouse>
- :map <3-S-LeftDrag> <3-RightDrag>
- :map <3-S-LeftRelease> <3-RightRelease>
- :map <4-S-LeftMouse> <4-RightMouse>
- :map <4-S-LeftDrag> <4-RightDrag>
- :map <4-S-LeftRelease> <4-RightRelease>
-These mappings make selection work the way it probably should in a Motif
-application, with shift-left mouse allowing for extending the visual area
-rather than the right mouse button.
-
-Mouse mapping with modifiers does not work for modeless selection.
-
-
-3.7 Drag and drop *drag-n-drop*
+Drag and drop *drag-n-drop*
You can drag and drop one or more files into the Vim window, where they will
be opened as if a |:drop| command was used.
@@ -388,47 +174,12 @@ names with any Ex command. Special characters (space, tab, double quote and
'|'; backslash on non-MS-Windows systems) will be escaped.
==============================================================================
-4. Making GUI Selections *gui-selections*
-
- *quotestar*
-You may make selections with the mouse (see |gui-mouse-select|), or by using
-Vim's Visual mode (see |v|). If 'a' is present in 'guioptions', then
-whenever a selection is started (Visual or Select mode), or when the selection
-is changed, Vim becomes the owner of the windowing system's primary selection
-(on MS-Windows the |clipboard| is used).
-
- *primary-selection*
-There is a special register for storing this selection, it is the "*
-register. Nothing is put in here unless the information about what text is
-selected is about to change (e.g. with a left mouse click somewhere), or when
-another application wants to paste the selected text. Then the text is put
-in the "* register. For example, to cut a line and make it the current
-selection/put it on the clipboard: >
-
- "*dd
-
-Similarly, when you want to paste a selection from another application, e.g.,
-by clicking the middle mouse button, the selection is put in the "* register
-first, and then 'put' like any other register. For example, to put the
-selection (contents of the clipboard): >
-
- "*p
-
-Note that when pasting text from one Vim into another separate Vim, the type
-of selection (character, line, or block) will also be copied. For other
-applications the type is always character.
-
-When the "unnamed" string is included in the 'clipboard' option, the unnamed
-register is the same as the "* register. Thus you can yank to and paste the
-selection without prepending "* to commands.
-
-==============================================================================
-5. Menus *menus*
+Menus *menus*
For an introduction see |usr_42.txt| in the user manual.
-5.1 Using Menus *using-menus*
+Using Menus *using-menus*
Basically, menus can be used just like mappings. You can define your own
menus, as many as you like.
@@ -437,6 +188,7 @@ menus and menu items. They are most useful for things that you can't remember
what the key sequence was.
For creating menus in a different language, see |:menutrans|.
+If you don't want to use menus at all, see |'go-M'|.
*menu.vim*
The default menus are read from the file "$VIMRUNTIME/menu.vim". See
@@ -453,7 +205,11 @@ in the menu (which can take a bit of time to load). If you want to have all
filetypes already present at startup, add: >
:let do_syntax_sel_menu = 1
-<
+Note that the menu.vim is sourced when `:syntax on` or `:filetype on` is
+executed or after your .vimrc file is sourced. This means that the 'encoding'
+option and the language of messages (`:language messages`) must be set before
+that (if you want to change them).
+
*console-menus*
Although this documentation is in the GUI section, you can actually use menus
in console mode too. You will have to load |menu.vim| explicitly then, it is
@@ -469,7 +225,7 @@ Pressing <F4> will start the menu. You can now use the cursor keys to select
a menu entry. Hit <Enter> to execute it. Hit <Esc> if you want to cancel.
This does require the |+menu| feature enabled at compile time.
-5.2 Creating New Menus *creating-menus*
+Creating New Menus *creating-menus*
*:me* *:menu* *:noreme* *:noremenu*
*:am* *:amenu* *:an* *:anoremenu*
@@ -545,9 +301,6 @@ expression register: >
:amenu Insert.foobar "='foobar'<CR>P
-Note that the '<' and 'k' flags in 'cpoptions' also apply here (when
-included they make the <> form and raw key codes not being recognized).
-
Note that <Esc> in Cmdline mode executes the command, like in a mapping. This
is Vi compatible. Use CTRL-C to quit Cmdline mode.
@@ -559,21 +312,13 @@ The ":set ic" will not be echoed when using this menu. Messages from the
executed command are still given though. To shut them up too, add a ":silent"
in the executed command: >
:menu <silent> Search.Header :exe ":silent normal /Header\r"<CR>
-"<silent>" may also appear just after "<special>" or "<script>".
-
- *:menu-<special>* *:menu-special*
-Define a menu with <> notation for special keys, even though the "<" flag
-may appear in 'cpoptions'. This is useful if the side effect of setting
-'cpoptions' is not desired. Example: >
- :menu <special> Search.Header /Header<CR>
-"<special>" must appear as the very first argument to the ":menu" command or
-just after "<silent>" or "<script>".
+"<silent>" may also appear just after "<script>".
*:menu-<script>* *:menu-script*
The "to" part of the menu will be inspected for mappings. If you don't want
this, use the ":noremenu" command (or the similar one for a specific mode).
If you do want to use script-local mappings, add "<script>" as the very first
-argument to the ":menu" command or just after "<silent>" or "<special>".
+argument to the ":menu" command or just after "<silent>".
*menu-priority*
You can give a priority to a menu. Menus with a higher priority go more to
@@ -714,13 +459,15 @@ nr Name Normal action ~
In the Win32 GUI, starting a menu name with ']' excludes that menu from the
main menu bar. You must then use the |:popup| command to display it.
+When splitting the window the window toolbar is not copied to the new window.
+
*popup-menu*
You can define the special menu "PopUp". This is the menu that is displayed
when the right mouse button is pressed, if 'mousemodel' is set to popup or
popup_setpos.
-5.3 Showing What Menus Are Mapped To *showing-menus*
+Showing What Menus Are Mapped To *showing-menus*
To see what an existing menu is mapped to, use just one argument after the
menu commands (just like you would with the ":map" commands). If the menu
@@ -738,7 +485,7 @@ Note that hitting <Tab> while entering a menu name after a menu command may
be used to complete the name of the menu item.
-5.4 Executing Menus *execute-menus*
+Executing Menus *execute-menus*
*:em* *:emenu* *E334* *E335*
:[range]em[enu] {menu} Execute {menu} from the command line.
@@ -758,7 +505,7 @@ When using a range, if the lines match with '<,'>, then the menu is executed
using the last visual selection.
-5.5 Deleting Menus *delete-menus*
+Deleting Menus *delete-menus*
*:unme* *:unmenu*
*:aun* *:aunmenu*
@@ -788,7 +535,7 @@ If you want to get rid of the menu bar: >
:set guioptions-=m
-5.6 Disabling Menus *disable-menus*
+Disabling Menus *disable-menus*
*:menu-disable* *:menu-enable*
If you do not want to remove a menu, but disable it for a moment, this can be
@@ -804,7 +551,7 @@ When the argument is "*", all menus are affected. Otherwise the given menu
name and all existing submenus below it are affected.
-5.7 Examples for Menus *menu-examples*
+Examples for Menus *menu-examples*
Here is an example on how to add menu items with menu's! You can add a menu
item for the keyword under the cursor. The register "z" is used. >
@@ -821,17 +568,17 @@ mappings, or put these lines in your gvimrc; "<C-R>" is CTRL-R, "<CR>" is
the <CR> key. |<>|)
-5.8 Tooltips & Menu tips
+Tooltips & Menu tips
See section |42.4| in the user manual.
- *:tmenu* *:tm*
+ *:tmenu*
:tm[enu] {menupath} {rhs} Define a tip for a menu or tool. {only in
X11 and Win32 GUI}
:tm[enu] [menupath] List menu tips. {only in X11 and Win32 GUI}
- *:tunmenu* *:tu*
+ *:tunmenu*
:tu[nmenu] {menupath} Remove a tip for a menu or tool.
{only in X11 and Win32 GUI}
@@ -891,48 +638,5 @@ This creates a popup menu that doesn't exist on the main menu-bar.
Note that a menu that starts with ']' will not be displayed.
-==============================================================================
-6. Extras *gui-extras*
-
-This section describes other features which are related to the GUI.
-
-- With the GUI, there is no wait for one second after hitting escape, because
- the key codes don't start with <Esc>.
-
-- Typing ^V followed by a special key in the GUI will insert "<Key>", since
- the internal string used is meaningless. Modifiers may also be held down to
- get "<Modifiers-Key>".
-
-- In the GUI, the modifiers SHIFT, CTRL, and ALT (or META) may be used within
- mappings of special keys and mouse events. E.g.: :map <M-LeftDrag> <LeftDrag>
-
-- In the GUI, several normal keys may have modifiers in mappings etc, these
- are <Space>, <Tab>, <NL>, <CR>, <Esc>.
-
-- To check in a Vim script if the GUI is being used, you can use something
- like this: >
-
- if has("gui_running")
- echo "yes, we have a GUI"
- else
- echo "Boring old console"
- endif
-< *setting-guifont*
-- When you use the same vimrc file on various systems, you can use something
- like this to set options specifically for each type of GUI: >
-
- if has("gui_running")
- if has("gui_gtk2")
- :set guifont=Luxi\ Mono\ 12
- elseif has("x11")
- " Also for GTK 1
- :set guifont=*-lucidatypewriter-medium-r-normal-*-*-180-*-*-m-*-*
- elseif has("gui_win32")
- :set guifont=Luxi_Mono:h12:cANSI
- endif
- endif
-
-A recommended Japanese font is MS Mincho. You can find info here:
-http://www.lexikan.com/mincho.htm
-
- vim:tw=78:sw=4:ts=8:ft=help:norl:
+
+ vim:tw=78:sw=4:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/hebrew.txt b/runtime/doc/hebrew.txt
index 7bc8f02e7f..2f4b137bd3 100644
--- a/runtime/doc/hebrew.txt
+++ b/runtime/doc/hebrew.txt
@@ -1,4 +1,4 @@
-*hebrew.txt* For Vim version 7.4. Last change: 2007 Jun 14
+*hebrew.txt* Nvim
VIM REFERENCE MANUAL by Ron Aaron (and Avner Lottem)
@@ -134,4 +134,4 @@ The result is that all Hebrew characters are displayed as ~x. To solve this
problem, set isprint=@,128-255.
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/help.txt b/runtime/doc/help.txt
index fc4816a6c8..edecc655dd 100644
--- a/runtime/doc/help.txt
+++ b/runtime/doc/help.txt
@@ -1,4 +1,4 @@
-*help.txt* For Vim version 7.4. Last change: 2016 Mar 31
+*help.txt* Nvim
VIM - main help file
k
@@ -30,7 +30,7 @@ Get specific help: It is possible to go directly to whatever you want help
help entries for "word".
Or use ":helpgrep word". |:helpgrep|
-VIM stands for Vi IMproved. Most of VIM was made by Bram Moolenaar, but only
+Vim stands for Vi IMproved. Most of Vim was made by Bram Moolenaar, but only
through the help of many others. See |credits|.
------------------------------------------------------------------------------
*doc-file-list* *Q_ct*
@@ -93,11 +93,9 @@ General subjects ~
|helphelp.txt| about using the help files
|index.txt| alphabetical index of all commands
|help-tags| all the tags you can jump to (index of tags)
-|howto.txt| how to do the most common editing tasks
|tips.txt| various tips on using Vim
|message.txt| (error) messages and explanations
-|quotes.txt| remarks from users of Vim
-|develop.txt| development of Vim
+|develop.txt| development of Nvim
|debug.txt| debugging Vim itself
|uganda.txt| Vim distribution conditions and what to do with your money
@@ -135,7 +133,6 @@ Advanced editing ~
Special issues ~
|print.txt| printing
|remote.txt| using Vim as a server or client
-|term.txt| using different terminals and mice
|digraph.txt| list of available digraphs
|mbyte.txt| multi-byte text support
|mlang.txt| non-English language support
@@ -144,32 +141,33 @@ Special issues ~
|hebrew.txt| Hebrew language support and editing
|russian.txt| Russian language support and editing
|ft_ada.txt| Ada (the programming language) support
+|ft_rust.txt| Filetype plugin for Rust
|ft_sql.txt| about the SQL filetype plugin
|rileft.txt| right-to-left editing mode
GUI ~
|gui.txt| Graphical User Interface (GUI)
-|gui_w32.txt| Win32 GUI
Interfaces ~
|if_cscop.txt| using Cscope with Vim
+|if_lua.txt| Lua interface
|if_pyth.txt| Python interface
-|debugger.txt| Interface with a debugger
+|if_ruby.txt| Ruby interface
|sign.txt| debugging signs
Versions ~
|vim_diff.txt| Main differences between Nvim and Vim
|vi_diff.txt| Main differences between Vim and Vi
- *sys-file-list*
-Remarks about specific systems ~
-|os_win32.txt| MS-Windows
*standard-plugin-list*
Standard plugins ~
|pi_gzip.txt| Reading and writing compressed files
+|pi_health.txt| Healthcheck framework
+|pi_matchit.txt| Extended "%" matching
+|pi_msgpack.txt| msgpack utilities
|pi_netrw.txt| Reading and writing files over a network
|pi_paren.txt| Highlight matching parens
+|pi_spec.txt| Filetype plugin to work with rpm spec files
|pi_tar.txt| Tar file explorer
-|pi_vimball.txt| Create a self-installing Vim script
|pi_zip.txt| Zip archive explorer
LOCAL ADDITIONS: *local-additions*
@@ -188,4 +186,4 @@ will try to find help for it. Especially for options in single quotes, e.g.
'hlsearch'.
------------------------------------------------------------------------------
- vim:tw=78:fo=tcq2:isk=!-~,^*,^\|,^\":ts=8:ft=help:norl:
+ vim:tw=78:isk=!-~,^*,^\|,^\":ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/helphelp.txt b/runtime/doc/helphelp.txt
index ca341af200..ba6dd02a29 100644
--- a/runtime/doc/helphelp.txt
+++ b/runtime/doc/helphelp.txt
@@ -1,4 +1,4 @@
-*helphelp.txt* For Vim version 7.4. Last change: 2016 Apr 01
+*helphelp.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -6,9 +6,7 @@
Help on help files *helphelp*
-1. Help commands |online-help|
-2. Translated help files |help-translated|
-3. Writing help files |help-writing|
+ Type |gO| to see the table of contents.
==============================================================================
1. Help commands *online-help*
@@ -25,12 +23,20 @@ Help on help files *helphelp*
The 'helplang' option is used to select a language, if
the main help file is available in several languages.
+ Type |gO| to see the table of contents.
+
*{subject}* *E149* *E661*
:h[elp] {subject} Like ":help", additionally jump to the tag {subject}.
- {subject} can include wildcards like "*", "?" and
+ For example: >
+ :help options
+
+< {subject} can include wildcards such as "*", "?" and
"[a-z]":
:help z? jump to help for any "z" command
:help z. jump to the help for "z."
+ But when a tag exists it is taken literally:
+ :help :? jump to help for ":?"
+
If there is no full match for the pattern, or there
are several matches, the "best" match will be used.
A sophisticated algorithm is used to decide which
@@ -67,18 +73,19 @@ Help on help files *helphelp*
example to find help for CTRL-V in Insert mode: >
:help i^V
<
- To use a regexp |pattern|, first do ":help" and then
+ It is also possible to first do ":help" and then
use ":tag {pattern}" in the help window. The
":tnext" command can then be used to jump to other
matches, "tselect" to list matches and choose one. >
- :help index| :tse z.
+ :help index
+ :tselect /.*mode
< When there is no argument you will see matches for
"help", to avoid listing all possible matches (that
would be very slow).
The number of matches displayed is limited to 300.
- This command can be followed by '|' and another
+ The `:help` command can be followed by '|' and another
command, but you don't need to escape the '|' inside a
help command. So these both work: >
:help |
@@ -133,7 +140,8 @@ Help on help files *helphelp*
already opened, then the location list for that window
is used. Otherwise, a new help window is opened and
the location list for that window is set. The
- location list for the current window is not changed.
+ location list for the current window is not changed
+ then.
*:exu* *:exusage*
:exu[sage] Show help on Ex commands. Added to simulate the Nvi
@@ -185,7 +193,7 @@ command: >
<
*:helpt* *:helptags*
- *E154* *E150* *E151* *E152* *E153* *E670*
+ *E154* *E150* *E151* *E152* *E153* *E670* *E856*
:helpt[ags] [++t] {dir}
Generate the help tags file(s) for directory {dir}.
When {dir} is ALL then all "doc" directories in
@@ -298,7 +306,7 @@ the applicable Vim version. The last field specifies the last modification
date of the file. Each field is separated by a tab.
At the bottom of the help file, place a Vim modeline to set the 'textwidth'
-and 'tabstop' options and the 'filetype' to 'help'. Never set a global option
+and 'tabstop' options and the 'filetype' to "help". Never set a global option
in such a modeline, that can have consequences undesired by whoever reads that
help.
@@ -356,4 +364,4 @@ highlighting. So do these:
You can find the details in $VIMRUNTIME/syntax/help.vim
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/howto.txt b/runtime/doc/howto.txt
deleted file mode 100644
index 03ae3dbd8d..0000000000
--- a/runtime/doc/howto.txt
+++ /dev/null
@@ -1,96 +0,0 @@
-*howto.txt* For Vim version 7.4. Last change: 2006 Apr 02
-
-
- VIM REFERENCE MANUAL by Bram Moolenaar
-
-
-How to ... *howdoi* *how-do-i* *howto* *how-to*
-
-|tutor| get started
-|:quit| exit? I'm trapped, help me!
-|initialization| initialize Vim
-|vimrc-intro| write a Vim script file (vimrc)
-|suspend| suspend Vim
-|usr_11.txt| recover after a crash
-|07.4| keep a backup of my file when writing over it
-
-|usr_07.txt| edit files
-|23.4| edit binary files
-|usr_24.txt| insert text
-|deleting| delete text
-|usr_04.txt| change text
-|04.5| copy and move text
-|usr_25.txt| format text
-|30.6| format comments
-|30.2| indent C programs
-|25.3| automatically set indent
-
-|usr_26.txt| repeat commands
-|02.5| undo and redo
-
-|usr_03.txt| move around
-|word-motions| word motions
-|left-right-motions| left-right motions
-|up-down-motions| up-down motions
-|object-motions| text-object motions
-|various-motions| various motions
-|object-select| text-object selection
-|'whichwrap'| move over line breaks
-|'virtualedit'| move to where there is no text
-|usr_27.txt| specify pattern for searches
-|tags-and-searches| do tags and special searches
-|29.4| search in include'd files used to find
- variables, functions, or macros
-|K| look up manual for the keyword under cursor
-
-|03.7| scroll
-|'sidescroll'| scroll horizontally/sideways
-|'scrolloff'| set visible context lines
-
-|mode-switching| change modes
-|04.4| use Visual mode
-|'insertmode'| start Vim in Insert mode
-
-|40.1| map keys
-|24.7| create abbreviations
-
-|ins-expandtab| expand a tab to spaces in Insert mode
-|i_CTRL-R| insert contents of a register in Insert mode
-|24.3| complete words in Insert mode
-|25.1| break a line before it gets too long
-
-|20.1| do command-line editing
-|20.3| do command-line completion
-|'cmdheight'| increase the height of command-line
-|10.3| specify command-line ranges
-|40.3| specify commands to be executed automatically
- before/after reading/writing entering/leaving a
- buffer/window
-
-|'autowrite'| write automatically
-|30.1| speedup edit-compile-edit cycle or compile and fix
- errors within Vim
-
-|options| set options
-|auto-setting| set options automatically
-|term-dependent-settings| set options depending on terminal name
-|save-settings| save settings
-|:quote| comment my .vim files
-|'helpheight'| change the default help height
-|'highlight'| set various highlighting modes
-|'title'| set the window title
-|'icon'| set window icon title
-|'report'| avoid seeing the change messages on every line
-|'shortmess'| avoid |hit-enter| prompts
-
-|mouse-using| use mouse with Vim
-|usr_08.txt| manage multiple windows and buffers
-|gui.txt| use the gui
-
-|You can't! (yet)| do dishes using Vim
-
-|usr_06.txt| switch on syntax highlighting
-|2html.vim| convert a colored file to HTML
-|less| use Vim like less or more with syntax highlighting
-
- vim:tw=78:ts=8:ft=help:norl:
diff --git a/runtime/doc/if_cscop.txt b/runtime/doc/if_cscop.txt
index 70f8d1c6f3..f05b3bb8ed 100644
--- a/runtime/doc/if_cscop.txt
+++ b/runtime/doc/if_cscop.txt
@@ -1,53 +1,22 @@
-*if_cscop.txt* For Vim version 7.4. Last change: 2011 Jun 12
+*if_cscop.txt* Nvim
VIM REFERENCE MANUAL by Andy Kahn
*cscope* *Cscope*
-This document explains how to use Vim's cscope interface.
+Cscope is a "code intelligence" tool that helps you navigate C programs. It
+can also perform some refactoring tasks, such as renaming a global variable in
+all source files. Think of it as "ctags on steroids".
-Cscope is a tool like ctags, but think of it as ctags on steroids since it
-does a lot more than what ctags provides. In Vim, jumping to a result from
-a cscope query is just like jumping to any tag; it is saved on the tag stack
-so that with the right keyboard mappings, you can jump back and forth between
-functions as you normally would with |tags|.
+See |cscope-usage| for a quickstart.
-1. Cscope introduction |cscope-intro|
-2. Cscope related commands |cscope-commands|
-3. Cscope options |cscope-options|
-4. How to use cscope in Vim |cscope-howtouse|
-5. Limitations |cscope-limitations|
-6. Suggested usage |cscope-suggestions|
-7. Availability & Information |cscope-info|
-
-This is currently for Unix and Win32 only.
+ Type |gO| to see the table of contents.
==============================================================================
-1. Cscope introduction *cscope-intro*
-
-The following text is taken from a version of the cscope man page:
-
- -----
-
- Cscope is an interactive screen-oriented tool that helps you:
-
- Learn how a C program works without endless flipping through a thick
- listing.
-
- Locate the section of code to change to fix a bug without having to
- learn the entire program.
-
- Examine the effect of a proposed change such as adding a value to an
- enum variable.
-
- Verify that a change has been made in all source files such as adding
- an argument to an existing function.
-
- Rename a global variable in all source files.
+Cscope introduction *cscope-intro*
- Change a constant to a preprocessor symbol in selected lines of files.
- It is designed to answer questions like:
+Cscope is designed to answer questions like:
Where is this symbol used?
Where is it defined?
Where did this variable get its value?
@@ -59,45 +28,28 @@ The following text is taken from a version of the cscope man page:
Where is this source file in the directory structure?
What files include this header file?
- Cscope answers these questions from a symbol database that it builds the
- first time it is used on the source files. On a subsequent call, cscope
- rebuilds the database only if a source file has changed or the list of
- source files is different. When the database is rebuilt the data for the
- unchanged files is copied from the old database, which makes rebuilding
- much faster than the initial build.
-
- -----
-
-When cscope is normally invoked, you will get a full-screen selection
-screen allowing you to make a query for one of the above questions.
-However, once a match is found to your query and you have entered your
-text editor to edit the source file containing match, you cannot simply
-jump from tag to tag as you normally would with vi's Ctrl-] or :tag
-command.
-
-Vim's cscope interface is done by invoking cscope with its line-oriented
-interface, and then parsing the output returned from a query. The end
-result is that cscope query results become just like regular tags, so
-you can jump to them just like you do with normal tags (Ctrl-] or :tag)
-and then go back by popping off the tagstack with Ctrl-T. (Please note
-however, that you don't actually jump to a cscope tag simply by doing
-Ctrl-] or :tag without remapping these commands or setting an option.
-See the remaining sections on how the cscope interface works and for
-suggested use.)
+Cscope answers these questions from a symbol database that it builds the first
+time it is used on the source files. On a subsequent call, cscope rebuilds
+the database only if a source file has changed or the list of source files is
+different. When the database is rebuilt the data for the unchanged files is
+copied from the old database, which makes rebuilding much faster than the
+initial build.
+See |cscope-usage| to get started.
==============================================================================
-2. Cscope related commands *cscope-commands*
+Cscope commands *cscope-commands*
*:cscope* *:cs* *:scs* *:scscope* *E259* *E262* *E561* *E560*
-All cscope commands are accessed through suboptions to the main cscope
-command ":cscope". The shortest abbreviation is ":cs". The ":scscope"
-command does the same and also splits the window (short: "scs").
+All cscope commands are accessed through suboptions to the cscope commands.
+ `:cscope` or `:cs` is the main command
+ `:scscope` or `:scs` does the same and splits the window
+ `:lcscope` or `:lcs` uses the location list, see |:lcscope|
The available subcommands are:
- *E563* *E564* *E566* *E568* *E569* *E622* *E623*
- *E625* *E626* *E609*
+ *E563* *E564* *E566* *E568* *E622* *E623* *E625*
+ *E626* *E609*
add : Add a new cscope database/connection.
USAGE :cs add {file|dir} [pre-path] [flags]
@@ -128,6 +80,7 @@ The available subcommands are:
6 or e: Find this egrep pattern
7 or f: Find this file
8 or i: Find files #including this file
+ 9 or a: Find places where this symbol is assigned a value
For all types, except 4 and 6, leading white space for {name} is
removed. For 4 and 6 there is exactly one space between {querytype}
@@ -238,7 +191,7 @@ through your tags file(s).
==============================================================================
-3. Cscope options *cscope-options*
+Cscope options *cscope-options*
Use the |:set| command to set all cscope options. Ideally, you would do
this in one of your startup files (e.g., vimrc). Some cscope related
@@ -251,96 +204,70 @@ started will have no effect!
:set csprg=/usr/local/bin/cscope
<
*cscopequickfix* *csqf* *E469*
-{not available when compiled without the |+quickfix| feature}
'cscopequickfix' specifies whether to use quickfix window to show cscope
results. This is a list of comma-separated values. Each item consists of
-|cscope-find| command (s, g, d, c, t, e, f or i) and flag (+, - or 0).
+|cscope-find| command (s, g, d, c, t, e, f, i or a) and flag (+, - or 0).
'+' indicates that results must be appended to quickfix window,
'-' implies previous results clearance, '0' or command absence - don't use
quickfix. Search is performed from start until first command occurrence.
The default value is "" (don't use quickfix anyway). The following value
seems to be useful: >
- :set cscopequickfix=s-,c-,d-,i-,t-,e-
+ :set cscopequickfix=s-,c-,d-,i-,t-,e-,a-
<
*cscopetag* *cst*
If 'cscopetag' is set, the commands ":tag" and CTRL-] as well as "vim -t"
will always use |:cstag| instead of the default :tag behavior. Effectively,
by setting 'cst', you will always search your cscope databases as well as
-your tag files. The default is off. Examples: >
- :set cst
- :set nocst
-<
+your tag files. The default is off.
+
*cscoperelative* *csre*
If 'cscoperelative' is set, then in absence of a prefix given to cscope
(prefix is the argument of -P option of cscope), basename of cscope.out
location (usually the project root directory) will be used as the prefix
to construct an absolute path. The default is off. Note: This option is
only effective when cscope (cscopeprg) is initialized without a prefix
-path (-P). Examples: >
- :set csre
- :set nocsre
-<
+path (-P).
+
*cscopetagorder* *csto*
The value of 'csto' determines the order in which |:cstag| performs a search.
If 'csto' is set to zero, cscope database(s) are searched first, followed
by tag file(s) if cscope did not return any matches. If 'csto' is set to
one, tag file(s) are searched before cscope database(s). The default is zero.
-Examples: >
- :set csto=0
- :set csto=1
-<
- *cscopeverbose* *csverb*
-If 'cscopeverbose' is not set (the default), messages will not be printed
-indicating success or failure when adding a cscope database. Ideally, you
-should reset this option in your |init.vim| before adding any cscope
-databases, and after adding them, set it. From then on, when you add more
-databases within Vim, you will get a (hopefully) useful message should the
-database fail to be added. Examples: >
- :set csverb
- :set nocsverb
-<
+
*cscopepathcomp* *cspc*
-The value of 'cspc' determines how many components of a file's path to
-display. With the default value of zero the entire path will be displayed.
+'cscopepathcomp' determines how many components of a file's path to display.
+With the default value of zero the entire path will be displayed.
The value one will display only the filename with no path. Other values
display that many components. For example: >
- :set cspc=3
+ :set cscopepathcomp=3
will display the last 3 components of the file's path, including the file
name itself.
==============================================================================
-4. How to use cscope in Vim *cscope-howtouse*
+Using cscope in Nvim *cscope-usage* *cscope-howtouse*
-The first thing you need to do is to build a cscope database for your
-source files. For the most basic case, simply do "cscope -b". Please
-refer to the cscope man page for more details.
+To get started, build the cscope database in your project root directory: >
+ cscope -bcqR
-Assuming you have a cscope database, you need to "add" the database to Vim.
-This establishes a cscope "connection" and makes it available for Vim to use.
-You can do this in your vimrc file, or you can do it manually after starting
-vim. For example, to add the cscope database "cscope.out", you would do:
+See the cscope manpage for details: >
+ :Man cscope
- :cs add cscope.out
+By default the cscope database file is named "cscope.out". After building the
+database, connect to it from Nvim: >
+ :cscope add cscope.out
-You can double-check the result of this by executing ":cs show". This will
-produce output which looks like this:
+That establishes a cscope connection for Nvim to use. You can check the
+result with ":cs show". It will show something like:
# pid database name prepend path
0 28806 cscope.out <none>
-Note:
-Because of the Microsoft RTL limitations, Win32 version shows 0 instead
-of the real pid.
-
Once a cscope connection is established, you can make queries to cscope and
-the results will be printed to you. Queries are made using the command
-":cs find". For example:
-
+the results will be printed. Queries are made using the command ":cs find".
+For example: >
:cs find g ALIGN_SIZE
-This can get a little cumbersome since one ends up doing a significant
-amount of typing. Fortunately, there are ways around this by mapping
-shortcut keys. See |cscope-suggestions| for suggested usage.
+To make this easier you can configure mappings, see |cscope-suggestions|.
If the results return only one match, you will automatically be taken to it.
If there is more than one match, you will be given a selection screen to pick
@@ -349,39 +276,28 @@ simply hit Ctrl-T to get back to the previous one.
==============================================================================
-5. Limitations *cscope-limitations*
-
-Cscope support for Vim is only available on systems that support these four
-system calls: fork(), pipe(), execl(), waitpid(). This means it is mostly
-limited to Unix systems.
-
-Additionally Cscope support works for Win32. For more information and a
-cscope version for Win32 see:
-
- http://iamphet.nm.ru/cscope/index.html
+Limitations *cscope-limitations*
Hard-coded limitation: doing a |:tjump| when |:cstag| searches the tag files
is not configurable (e.g., you can't do a tselect instead).
+
==============================================================================
-6. Suggested usage *cscope-suggestions*
+Sample config *cscope-suggestions*
-Put these entries in your vimrc (adjust the pathname accordingly to your
-setup): >
+Copy this into your init.vim (adjust paths for your system): >
if has("cscope")
set csprg=/usr/local/bin/cscope
set csto=0
set cst
- set nocsverb
" add any database in current directory
if filereadable("cscope.out")
- cs add cscope.out
+ silent cs add cscope.out
" else add database pointed to by environment
elseif $CSCOPE_DB != ""
- cs add $CSCOPE_DB
+ silent cs add $CSCOPE_DB
endif
- set csverb
endif
By setting 'cscopetag', we have effectively replaced all instances of the :tag
@@ -418,6 +334,7 @@ Cscope Home Page (http://cscope.sourceforge.net/): >
nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap <C-_>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR>
+ nmap <C-_>a :cs find a <C-R>=expand("<cword>")<CR><CR>
" Using 'CTRL-spacebar' then a search type makes the vim window
" split horizontally, with search result displayed in
@@ -431,6 +348,7 @@ Cscope Home Page (http://cscope.sourceforge.net/): >
nmap <C-Space>f :scs find f <C-R>=expand("<cfile>")<CR><CR>
nmap <C-Space>i :scs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
nmap <C-Space>d :scs find d <C-R>=expand("<cword>")<CR><CR>
+ nmap <C-Space>a :scs find a <C-R>=expand("<cword>")<CR><CR>
" Hitting CTRL-space *twice* before the search type does a vertical
" split instead of a horizontal one
@@ -449,47 +367,8 @@ Cscope Home Page (http://cscope.sourceforge.net/): >
\:vert scs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
nmap <C-Space><C-Space>d
\:vert scs find d <C-R>=expand("<cword>")<CR><CR>
+ nmap <C-Space><C-Space>a
+ \:vert scs find a <C-R>=expand("<cword>")<CR><CR>
+<
-==============================================================================
-7. Cscope availability and information *cscope-info*
-
-If you do not already have cscope (it did not come with your compiler
-license or OS distribution), then you can download it for free from:
- http://cscope.sourceforge.net/
-This is released by SCO under the BSD license.
-
-If you want a newer version of cscope, you will probably have to buy it.
-According to the (old) nvi documentation:
-
- You can buy version 13.3 source with an unrestricted license
- for $400 from AT&T Software Solutions by calling +1-800-462-8146.
-
-Also you can download cscope 13.x and mlcscope 14.x (multi-lingual cscope
-which supports C, C++, Java, lex, yacc, breakpoint listing, Ingres, and SDL)
-from World-Wide Exptools Open Source packages page:
- http://www.bell-labs.com/project/wwexptools/packages.html
-
-In Solaris 2.x, if you have the C compiler license, you will also have
-cscope. Both are usually located under /opt/SUNWspro/bin
-
-SGI developers can also get it. Search for Cscope on this page:
- http://freeware.sgi.com/index-by-alpha.html
- https://toolbox.sgi.com/toolbox/utilities/cscope/
-The second one is for those who have a password for the SGI toolbox.
-
-There is source to an older version of a cscope clone (called "cs") available
-on the net. Due to various reasons, this is not supported with Vim.
-
-The cscope interface/support for Vim was originally written by
-Andy Kahn <ackahn@netapp.com>. The original structure (as well as a tiny
-bit of code) was adapted from the cscope interface in nvi. Please report
-any problems, suggestions, patches, et al., you have for the usage of
-cscope within Vim to him.
- *cscope-win32*
-For a cscope version for Win32 see:
- http://code.google.com/p/cscope-win32/
-
-Win32 support was added by Sergey Khorev <sergey.khorev@gmail.com>. Contact
-him if you have Win32-specific issues.
-
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/if_lua.txt b/runtime/doc/if_lua.txt
new file mode 100644
index 0000000000..97bbb34078
--- /dev/null
+++ b/runtime/doc/if_lua.txt
@@ -0,0 +1,420 @@
+*if_lua.txt* Nvim
+
+
+ NVIM REFERENCE MANUAL
+
+
+Lua Interface to Nvim *lua* *Lua*
+
+ Type |gO| to see the table of contents.
+
+==============================================================================
+Importing modules *lua-require*
+
+Nvim automatically adjusts `package.path` and `package.cpath` according to
+effective 'runtimepath' value. Adjustment happens whenever 'runtimepath' is
+changed. `package.path` is adjusted by simply appending `/lua/?.lua` and
+`/lua/?/init.lua` to each directory from 'runtimepath' (`/` is actually the
+first character of `package.config`).
+
+Similarly to `package.path`, modified directories from 'runtimepath' are also
+added to `package.cpath`. In this case, instead of appending `/lua/?.lua` and
+`/lua/?/init.lua` to each runtimepath, all unique `?`-containing suffixes of
+the existing `package.cpath` are used. Example:
+
+1. Given that
+ - 'runtimepath' contains `/foo/bar,/xxx;yyy/baz,/abc`;
+ - initial (defined at compile-time or derived from
+ `$LUA_CPATH`/`$LUA_INIT`) `package.cpath` contains
+ `./?.so;/def/ghi/a?d/j/g.elf;/def/?.so`.
+2. It finds `?`-containing suffixes `/?.so`, `/a?d/j/g.elf` and `/?.so`, in
+ order: parts of the path starting from the first path component containing
+ question mark and preceding path separator.
+3. The suffix of `/def/?.so`, namely `/?.so` is not unique, as itโ€™s the same
+ as the suffix of the first path from `package.path` (i.e. `./?.so`). Which
+ leaves `/?.so` and `/a?d/j/g.elf`, in this order.
+4. 'runtimepath' has three paths: `/foo/bar`, `/xxx;yyy/baz` and `/abc`. The
+ second one contains semicolon which is a paths separator so it is out,
+ leaving only `/foo/bar` and `/abc`, in order.
+5. The cartesian product of paths from 4. and suffixes from 3. is taken,
+ giving four variants. In each variant `/lua` path segment is inserted
+ between path and suffix, leaving
+
+ - `/foo/bar/lua/?.so`
+ - `/foo/bar/lua/a?d/j/g.elf`
+ - `/abc/lua/?.so`
+ - `/abc/lua/a?d/j/g.elf`
+
+6. New paths are prepended to the original `package.cpath`.
+
+The result will look like this:
+
+ `/foo/bar,/xxx;yyy/baz,/abc` ('runtimepath')
+ ร— `./?.so;/def/ghi/a?d/j/g.elf;/def/?.so` (`package.cpath`)
+
+ = `/foo/bar/lua/?.so;/foo/bar/lua/a?d/j/g.elf;/abc/lua/?.so;/abc/lua/a?d/j/g.elf;./?.so;/def/ghi/a?d/j/g.elf;/def/?.so`
+
+Note: to keep up with 'runtimepath' updates paths added at previous update are
+remembered and removed at the next update, while all paths derived from the
+new 'runtimepath' are prepended as described above. This allows removing
+paths when path is removed from 'runtimepath', adding paths when they are
+added and reordering `package.path`/`package.cpath` content if 'runtimepath'
+was reordered.
+
+Note 2: even though adjustments happens automatically Nvim does not track
+current values of `package.path` or `package.cpath`. If you happened to
+delete some paths from there you need to reset 'runtimepath' to make them
+readded. Just running `let &runtimepath = &runtimepath` should work.
+
+Note 3: skipping paths from 'runtimepath' which contain semicolons applies
+both to `package.path` and `package.cpath`. Given that there is a number of
+badly written plugins using shell which will not work with paths containing
+semicolons it is better to not have them in 'runtimepath' at all.
+
+------------------------------------------------------------------------------
+Example of a plugin that uses lua modules *lua-require-example*
+
+The following example plugin adds a command `:MakeCharBlob` which transforms
+current buffer into a long `unsigned char` array. Lua contains transformation
+function in a module `lua/charblob.lua` which is imported in
+`autoload/charblob.vim` (`require("charblob")`). Example plugin is supposed
+to be put into any directory from 'runtimepath', e.g. `~/.config/nvim` (in
+this case `lua/charblob.lua` means `~/.config/nvim/lua/charblob.lua`).
+
+autoload/charblob.vim: >
+
+ function charblob#encode_buffer()
+ call setline(1, luaeval(
+ \ 'require("charblob").encode(unpack(_A))',
+ \ [getline(1, '$'), &textwidth, ' ']))
+ endfunction
+
+plugin/charblob.vim: >
+
+ if exists('g:charblob_loaded')
+ finish
+ endif
+ let g:charblob_loaded = 1
+
+ command MakeCharBlob :call charblob#encode_buffer()
+
+lua/charblob.lua: >
+
+ local function charblob_bytes_iter(lines)
+ local init_s = {
+ next_line_idx = 1,
+ next_byte_idx = 1,
+ lines = lines,
+ }
+ local function next(s, _)
+ if lines[s.next_line_idx] == nil then
+ return nil
+ end
+ if s.next_byte_idx > #(lines[s.next_line_idx]) then
+ s.next_line_idx = s.next_line_idx + 1
+ s.next_byte_idx = 1
+ return ('\n'):byte()
+ end
+ local ret = lines[s.next_line_idx]:byte(s.next_byte_idx)
+ if ret == ('\n'):byte() then
+ ret = 0 -- See :h NL-used-for-NUL.
+ end
+ s.next_byte_idx = s.next_byte_idx + 1
+ return ret
+ end
+ return next, init_s, nil
+ end
+
+ local function charblob_encode(lines, textwidth, indent)
+ local ret = {
+ 'const unsigned char blob[] = {',
+ indent,
+ }
+ for byte in charblob_bytes_iter(lines) do
+ -- .- space + number (width 3) + comma
+ if #(ret[#ret]) + 5 > textwidth then
+ ret[#ret + 1] = indent
+ else
+ ret[#ret] = ret[#ret] .. ' '
+ end
+ ret[#ret] = ret[#ret] .. (('%3u,'):format(byte))
+ end
+ ret[#ret + 1] = '};'
+ return ret
+ end
+
+ return {
+ bytes_iter = charblob_bytes_iter,
+ encode = charblob_encode,
+ }
+
+==============================================================================
+Commands *lua-commands*
+
+ *:lua*
+:[range]lua {chunk}
+ Execute Lua chunk {chunk}.
+
+Examples:
+>
+ :lua vim.api.nvim_command('echo "Hello, Nvim!"')
+<
+To see the Lua version: >
+ :lua print(_VERSION)
+
+To see the LuaJIT version: >
+ :lua print(jit.version)
+<
+
+:[range]lua << {endmarker}
+{script}
+{endmarker}
+ Execute Lua script {script}.
+
+{endmarker} must NOT be preceded by any white space. If {endmarker} is
+omitted from after the "<<", a dot '.' must be used after {script}, like
+for the |:append| and |:insert| commands.
+This form of the |:lua| command is mainly useful for including Lua code
+in Vim scripts.
+
+Example:
+>
+ function! CurrentLineInfo()
+ lua << EOF
+ local linenr = vim.api.nvim_win_get_cursor(0)[1]
+ local curline = vim.api.nvim_buf_get_lines(
+ 0, linenr, linenr + 1, false)[1]
+ print(string.format("Current line [%d] has %d bytes",
+ linenr, #curline))
+ EOF
+ endfunction
+
+Note that the `local` variables will disappear when block finishes. This is
+not the case for globals.
+
+ *:luado*
+:[range]luado {body} Execute Lua function "function (line, linenr) {body}
+ end" for each line in the [range], with the function
+ argument being set to the text of each line in turn,
+ without a trailing <EOL>, and the current line number.
+ If the value returned by the function is a string it
+ becomes the text of the line in the current turn. The
+ default for [range] is the whole file: "1,$".
+
+Examples:
+>
+ :luado return string.format("%s\t%d", line:reverse(), #line)
+
+ :lua require"lpeg"
+ :lua -- balanced parenthesis grammar:
+ :lua bp = lpeg.P{ "(" * ((1 - lpeg.S"()") + lpeg.V(1))^0 * ")" }
+ :luado if bp:match(line) then return "-->\t" .. line end
+<
+
+ *:luafile*
+:[range]luafile {file}
+ Execute Lua script in {file}.
+ The whole argument is used as a single file name.
+
+Examples:
+>
+ :luafile script.lua
+ :luafile %
+<
+
+All these commands execute a Lua chunk from either the command line (:lua and
+:luado) or a file (:luafile) with the given line [range]. Similarly to the Lua
+interpreter, each chunk has its own scope and so only global variables are
+shared between command calls. All Lua default libraries are available. In
+addition, Lua "print" function has its output redirected to the Nvim message
+area, with arguments separated by a white space instead of a tab.
+
+Lua uses the "vim" module (see |lua-vim|) to issue commands to Nvim. However,
+procedures that alter buffer content, open new buffers, and change cursor
+position are restricted when the command is executed in the |sandbox|.
+
+
+==============================================================================
+The vim module *lua-vim*
+
+Lua interfaces Nvim through the "vim" module. Currently it has the `api`
+submodule and some Nvim-specific utilities.
+
+------------------------------------------------------------------------------
+vim.api.* functions
+
+`vim.api` exposes the Nvim |API| as a table of Lua functions. All functions
+are available.
+
+For example, to use the "nvim_get_current_line()" API function, call
+"vim.api.nvim_get_current_line()": >
+
+ print(tostring(vim.api.nvim_get_current_line()))
+
+------------------------------------------------------------------------------
+vim.* builtin functions
+
+vim.deepcopy({object}) *vim.deepcopy*
+ Performs a deep copy of the given object, and returns that copy.
+ For a non-table object, that just means a usual copy of the object,
+ while for a table all subtables are copied recursively.
+
+vim.gsplit({s}, {sep}, {plain}) *vim.gsplit*
+ Split a given string by a separator. Returns an iterator of the
+ split components. The separator can be a lua pattern, see
+ https://www.lua.org/pil/20.2.html
+ Setting {plain} to `true` turns off pattern matching, as it is passed
+ to `string:find`, see
+ http://lua-users.org/wiki/StringLibraryTutorial
+
+ Parameters:~
+ {s} String: String to split
+ {sep} String: Separator pattern. If empty, split by chars.
+ {plain} Boolean: If false, match {sep} verbatim
+
+ Return:~
+ Iterator of strings, which are the components of {s} after
+ splitting
+
+vim.split({s}, {sep}, {plain}) *vim.split*
+ Split a given string by a separator. Returns a table containing the
+ split components. The separator can be a lua pattern, see
+ https://www.lua.org/pil/20.2.html
+ Setting {plain} to `true` turns off pattern matching, as it is passed
+ to `string:find`, see
+ http://lua-users.org/wiki/StringLibraryTutorial
+
+ Parameters:~
+ {s} String: String to split
+ {sep} String: Separator pattern. If empty, split by chars.
+ {plain} Boolean: If false, match {sep} verbatim
+
+ Return:~
+ Table of strings, which are the components of {s} after
+ splitting
+
+vim.stricmp(a, b) *lua-vim.stricmp*
+ Function used for case-insensitive string comparison. Takes two
+ string arguments and returns 0, 1 or -1 if strings are equal, a is
+ greater then b or a is lesser then b respectively.
+
+vim.trim({string}) *vim.trim*
+ Returns the string with all leading and trailing whitespace removed.
+
+vim.type_idx *lua-vim.type_idx*
+ Type index for use in |lua-special-tbl|. Specifying one of the
+ values from |lua-vim.types| allows typing the empty table (it is
+ unclear whether empty lua table represents empty list or empty array)
+ and forcing integral numbers to be |Float|. See |lua-special-tbl| for
+ more details.
+
+vim.val_idx *lua-vim.val_idx*
+ Value index for tables representing |Float|s. A table representing
+ floating-point value 1.0 looks like this: >
+ {
+ [vim.type_idx] = vim.types.float,
+ [vim.val_idx] = 1.0,
+ }
+< See also |lua-vim.type_idx| and |lua-special-tbl|.
+
+vim.types *lua-vim.types*
+ Table with possible values for |lua-vim.type_idx|. Contains two sets
+ of key-value pairs: first maps possible values for |lua-vim.type_idx|
+ to human-readable strings, second maps human-readable type names to
+ values for |lua-vim.type_idx|. Currently contains pairs for `float`,
+ `array` and `dictionary` types.
+
+ Note: one must expect that values corresponding to `vim.types.float`,
+ `vim.types.array` and `vim.types.dictionary` fall under only two
+ following assumptions:
+ 1. Value may serve both as a key and as a value in a table. Given the
+ properties of lua tables this basically means โ€œvalue is not `nil`โ€.
+ 2. For each value in `vim.types` table `vim.types[vim.types[value]]`
+ is the same as `value`.
+ No other restrictions are put on types, and it is not guaranteed that
+ values corresponding to `vim.types.float`, `vim.types.array` and
+ `vim.types.dictionary` will not change or that `vim.types` table will
+ only contain values for these three types.
+
+------------------------------------------------------------------------------
+vim.* runtime functions
+
+Those functions are only available after the runtime files have been loaded.
+In particular, they are not available when using `nvim -u NONE`.
+
+vim.inspect({object}, {options}) *vim.inspect*
+ Return a human-readable representation of the passed object. See
+ https://github.com/kikito/inspect.lua
+ for details and possible options.
+==============================================================================
+The luaeval function *lua-luaeval* *lua-eval*
+ *luaeval()*
+
+The (dual) equivalent of "vim.eval" for passing Lua values to Nvim is
+"luaeval". "luaeval" takes an expression string and an optional argument used
+for _A inside expression and returns the result of the expression. It is
+semantically equivalent in Lua to:
+>
+ local chunkheader = "local _A = select(1, ...) return "
+ function luaeval (expstr, arg)
+ local chunk = assert(loadstring(chunkheader .. expstr, "luaeval"))
+ return chunk(arg) -- return typval
+ end
+
+Lua nils, numbers, strings, tables and booleans are converted to their
+respective VimL types. An error is thrown if conversion of any other Lua types
+is attempted.
+
+The magic global "_A" contains the second argument to luaeval().
+
+Example: >
+ :echo luaeval('_A[1] + _A[2]', [40, 2])
+ 42
+ :echo luaeval('string.match(_A, "[a-z]+")', 'XYXfoo123')
+ foo
+
+Lua tables are used as both dictionaries and lists, so it is impossible to
+determine whether empty table is meant to be empty list or empty dictionary.
+Additionally lua does not have integer numbers. To distinguish between these
+cases there is the following agreement:
+
+0. Empty table is empty list.
+1. Table with N incrementally growing integral numbers, starting from 1 and
+ ending with N is considered to be a list.
+2. Table with string keys, none of which contains NUL byte, is considered to
+ be a dictionary.
+3. Table with string keys, at least one of which contains NUL byte, is also
+ considered to be a dictionary, but this time it is converted to
+ a |msgpack-special-map|.
+ *lua-special-tbl*
+4. Table with `vim.type_idx` key may be a dictionary, a list or floating-point
+ value:
+ - `{[vim.type_idx]=vim.types.float, [vim.val_idx]=1}` is converted to
+ a floating-point 1.0. Note that by default integral lua numbers are
+ converted to |Number|s, non-integral are converted to |Float|s. This
+ variant allows integral |Float|s.
+ - `{[vim.type_idx]=vim.types.dictionary}` is converted to an empty
+ dictionary, `{[vim.type_idx]=vim.types.dictionary, [42]=1, a=2}` is
+ converted to a dictionary `{'a': 42}`: non-string keys are ignored.
+ Without `vim.type_idx` key tables with keys not fitting in 1., 2. or 3.
+ are errors.
+ - `{[vim.type_idx]=vim.types.list}` is converted to an empty list. As well
+ as `{[vim.type_idx]=vim.types.list, [42]=1}`: integral keys that do not
+ form a 1-step sequence from 1 to N are ignored, as well as all
+ non-integral keys.
+
+Examples: >
+
+ :echo luaeval('math.pi')
+ :function Rand(x,y) " random uniform between x and y
+ : return luaeval('(_A.y-_A.x)*math.random()+_A.x', {'x':a:x,'y':a:y})
+ : endfunction
+ :echo Rand(1,10)
+
+Note that currently second argument to `luaeval` undergoes VimL to lua
+conversion, so changing containers in lua do not affect values in VimL. Return
+value is also always converted. When converting, |msgpack-special-dict|s are
+treated specially.
+
+==============================================================================
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/if_pyth.txt b/runtime/doc/if_pyth.txt
index 8946dd2e5a..df4b54ef76 100644
--- a/runtime/doc/if_pyth.txt
+++ b/runtime/doc/if_pyth.txt
@@ -1,22 +1,14 @@
-*if_pyth.txt* For Vim version 7.4. Last change: 2014 Jul 23
+*if_pyth.txt* Nvim
VIM REFERENCE MANUAL by Paul Moore
-The Python Interface to Vim *python* *Python*
+The Python Interface to Vim *if_pyth* *python* *Python*
-1. Commands |python-commands|
-2. The vim module |python-vim|
-3. Buffer objects |python-buffer|
-4. Range objects |python-range|
-5. Window objects |python-window|
-6. Tab page objects |python-tabpage|
-7. vim.bindeval objects |python-bindeval-objects|
-8. pyeval(), py3eval() Vim functions |python-pyeval|
-9. Python 3 |python3|
+See |provider-python| for more information.
-See |provider-python| for more information. {Nvim}
+ Type |gO| to see the table of contents.
==============================================================================
1. Commands *python-commands*
@@ -48,7 +40,12 @@ Example: >
print 'EAT ME'
EOF
endfunction
-<
+
+To see what version of Python you have: >
+ :python print(sys.version)
+
+There is no need to import sys, it's done by default.
+
Note: Python is very sensitive to the indenting. Make sure the "class" line
and "EOF" do not have any indent.
@@ -67,6 +64,18 @@ Examples:
:pydo return "%s\t%d" % (line[::-1], len(line))
:pydo if line: return "%4d: %s" % (linenr, line)
<
+One can use `:pydo` in possible conjunction with `:py` to filter a range using
+python. For example: >
+
+ :py3 << EOF
+ needle = vim.eval('@a')
+ replacement = vim.eval('@b')
+
+ def py_vim_string_replace(str):
+ return str.replace(needle, replacement)
+ EOF
+ :'<,'>py3do return py_vim_string_replace(line)
+<
*:pyfile* *:pyf*
:[range]pyf[ile] {file}
Execute the Python script in {file}. The whole
@@ -83,7 +92,6 @@ Python commands cannot be used in the |sandbox|.
To pass arguments you need to set sys.argv[] explicitly. Example: >
- :python import sys
:python sys.argv = ["foo", "bar"]
:pyfile myscript.py
@@ -122,7 +130,7 @@ Instead, put the Python command in a function and call that function:
Note that "EOF" must be at the start of the line.
==============================================================================
-2. The vim module *python-vim*
+2. The vim module *python-vim* *python2*
Python code gets all of its access to vim (with one exception - see
|python-output| below) via the "vim" module. The vim module implements two
@@ -181,11 +189,6 @@ vim.eval(str) *python-eval*
# string.atoi() to convert to
# a number.
- :py tagList = vim.eval('taglist("eval_expr")')
-< The latter will return a python list of python dicts, for instance:
- [{'cmd': '/^eval_expr(arg, nextcmd)$/', 'static': 0, 'name':
- 'eval_expr', 'kind': 'f', 'filename': './src/eval.c'}]
-
vim.bindeval(str) *python-bindeval*
Like |python-eval|, but returns special objects described in
|python-bindeval-objects|. These python objects let you modify (|List|
@@ -688,7 +691,8 @@ vim.Function object *python-Function*
8. pyeval() and py3eval() Vim functions *python-pyeval*
To facilitate bi-directional interface, you can use |pyeval()| and |py3eval()|
-functions to evaluate Python expressions and pass their values to VimL.
+functions to evaluate Python expressions and pass their values to Vim script.
+|pyxeval()| is also available.
==============================================================================
9. Python 3 *python3*
@@ -697,9 +701,13 @@ functions to evaluate Python expressions and pass their values to VimL.
The `:py3` and `:python3` commands work similar to `:python`. A simple check
if the `:py3` command is working: >
:py3 print("Hello")
+
+To see what version of Python you have: >
+ :py3 import sys
+ :py3 print(sys.version)
< *:py3file*
The `:py3file` command works similar to `:pyfile`.
- *:py3do* *E863*
+ *:py3do*
The `:py3do` command works similar to `:pydo`.
*E880*
@@ -710,12 +718,63 @@ Raising SystemExit exception in python isn't endorsed way to quit vim, use: >
You can test what Python version is available with: >
if has('python')
echo 'there is Python 2.x'
- elseif has('python3')
+ endif
+ if has('python3')
echo 'there is Python 3.x'
endif
-Note however, that if Python 2 and 3 are both available, but not loaded,
-these has() calls will try to load them.
+==============================================================================
+10. Python X *python_x* *pythonx*
+
+Because most python code can be written so that it works with Python 2.6+ and
+Python 3, the pyx* functions and commands have been written. They work the
+same as the Python 2 and 3 variants, but select the Python version using the
+'pyxversion' setting.
+
+Set 'pyxversion' in your |vimrc| to prefer Python 2 or Python 3 for Python
+commands. Changing this setting at runtime risks losing the state of plugins
+(such as initialization).
+
+If you want to use a module, you can put it in the {rtp}/pythonx directory.
+See |pythonx-directory|.
+
+ *:pyx* *:pythonx*
+`:pyx` and `:pythonx` work similar to `:python`. To check if `:pyx` works: >
+ :pyx print("Hello")
+
+To see what version of Python is being used: >
+ :pyx import sys
+ :pyx print(sys.version)
+<
+ *:pyxfile* *python_x-special-comments*
+`:pyxfile` works similar to `:pyfile`. But you can add a "shebang" comment to
+force Vim to use `:pyfile` or `:py3file`: >
+ #!/any string/python2 " Shebang. Must be the first line of the file.
+ #!/any string/python3 " Shebang. Must be the first line of the file.
+ # requires python 2.x " Maximum lines depend on 'modelines'.
+ # requires python 3.x " Maximum lines depend on 'modelines'.
+Unlike normal modelines, the bottom of the file is not checked.
+If none of them are found, the 'pyxversion' option is used.
+ *W20* *W21*
+If Vim does not support the selected Python version a silent message will be
+printed. Use `:messages` to read them.
+
+ *:pyxdo*
+`:pyxdo` works similar to `:pydo`.
+
+ *has-pythonx*
+To check if pyx* functions and commands are available: >
+ if has('pythonx')
+ echo 'pyx* commands are available. (Python ' . &pyx . ')'
+ endif
+
+If you prefer Python 2 and want to fallback to Python 3, set 'pyxversion'
+explicitly in your |.vimrc|. Example: >
+ if has('python')
+ set pyx=2
+ elseif has('python3')
+ set pyx=3
+ endif
==============================================================================
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/if_ruby.txt b/runtime/doc/if_ruby.txt
new file mode 100644
index 0000000000..3c7c800fbf
--- /dev/null
+++ b/runtime/doc/if_ruby.txt
@@ -0,0 +1,183 @@
+*if_ruby.txt* Nvim
+
+
+ VIM REFERENCE MANUAL by Shugo Maeda
+
+The Ruby Interface to Vim *if_ruby* *ruby* *Ruby*
+
+ *E266* *E267* *E268* *E269* *E270* *E271* *E272* *E273*
+
+The home page for ruby is http://www.ruby-lang.org/. You can find links for
+downloading Ruby there.
+
+ Type |gO| to see the table of contents.
+
+==============================================================================
+1. Commands *ruby-commands*
+
+ *:ruby* *:rub*
+:rub[y] {cmd} Execute Ruby command {cmd}. A command to try it out: >
+ :ruby print "Hello"
+
+:rub[y] << {endpattern}
+{script}
+{endpattern}
+ Execute Ruby script {script}.
+ {endpattern} must NOT be preceded by any white space.
+ If {endpattern} is omitted, it defaults to a dot '.'
+ like for the |:append| and |:insert| commands. This
+ form of the |:ruby| command is mainly useful for
+ including ruby code in vim scripts.
+ Note: This command doesn't work when the Ruby feature
+ wasn't compiled in. To avoid errors, see
+ |script-here|.
+
+Example Vim script: >
+
+ function! RedGem()
+ ruby << EOF
+ class Garnet
+ def initialize(s)
+ @buffer = VIM::Buffer.current
+ vimputs(s)
+ end
+ def vimputs(s)
+ @buffer.append(@buffer.count,s)
+ end
+ end
+ gem = Garnet.new("pretty")
+ EOF
+ endfunction
+<
+To see what version of Ruby you have: >
+ :ruby print RUBY_VERSION
+<
+
+ *:rubydo* *:rubyd* *E265*
+:[range]rubyd[o] {cmd} Evaluate Ruby command {cmd} for each line in the
+ [range], with $_ being set to the text of each line in
+ turn, without a trailing <EOL>. Setting $_ will change
+ the text, but note that it is not possible to add or
+ delete lines using this command.
+ The default for [range] is the whole file: "1,$".
+
+ *:rubyfile* *:rubyf*
+:rubyf[ile] {file} Execute the Ruby script in {file}. This is the same as
+ `:ruby load 'file'`, but allows file name completion.
+
+Executing Ruby commands is not possible in the |sandbox|.
+
+==============================================================================
+2. The VIM module *ruby-vim*
+
+Ruby code gets all of its access to vim via the "VIM" module.
+
+Overview >
+ print "Hello" # displays a message
+ VIM.command(cmd) # execute an Ex command
+ num = VIM::Window.count # gets the number of windows
+ w = VIM::Window[n] # gets window "n"
+ cw = VIM::Window.current # gets the current window
+ num = VIM::Buffer.count # gets the number of buffers
+ b = VIM::Buffer[n] # gets buffer "n"
+ cb = VIM::Buffer.current # gets the current buffer
+ w.height = lines # sets the window height
+ w.cursor = [row, col] # sets the window cursor position
+ pos = w.cursor # gets an array [row, col]
+ name = b.name # gets the buffer file name
+ line = b[n] # gets a line from the buffer
+ num = b.count # gets the number of lines
+ b[n] = str # sets a line in the buffer
+ b.delete(n) # deletes a line
+ b.append(n, str) # appends a line after n
+ line = VIM::Buffer.current.line # gets the current line
+ num = VIM::Buffer.current.line_number # gets the current line number
+ VIM::Buffer.current.line = "test" # sets the current line number
+<
+
+Module Functions:
+
+ *ruby-message*
+VIM::message({msg})
+ Displays the message {msg}.
+
+ *ruby-set_option*
+VIM::set_option({arg})
+ Sets a vim option. {arg} can be any argument that the ":set" command
+ accepts. Note that this means that no spaces are allowed in the
+ argument! See |:set|.
+
+ *ruby-command*
+VIM::command({cmd})
+ Executes Ex command {cmd}.
+
+ *ruby-evaluate*
+VIM::evaluate({expr})
+ Evaluates {expr} using the vim internal expression evaluator (see
+ |expression|). Returns the expression result as a string.
+ A |List| is turned into a string by joining the items and inserting
+ line breaks.
+
+==============================================================================
+3. VIM::Buffer objects *ruby-buffer*
+
+VIM::Buffer objects represent vim buffers.
+
+Class Methods:
+
+current Returns the current buffer object.
+count Returns the number of buffers.
+self[{n}] Returns the buffer object for the number {n}. The first number
+ is 0.
+
+Methods:
+
+name Returns the name of the buffer.
+number Returns the number of the buffer.
+count Returns the number of lines.
+length Returns the number of lines.
+self[{n}] Returns a line from the buffer. {n} is the line number.
+self[{n}] = {str}
+ Sets a line in the buffer. {n} is the line number.
+delete({n}) Deletes a line from the buffer. {n} is the line number.
+append({n}, {str})
+ Appends a line after the line {n}.
+line Returns the current line of the buffer if the buffer is
+ active.
+line = {str} Sets the current line of the buffer if the buffer is active.
+line_number Returns the number of the current line if the buffer is
+ active.
+
+==============================================================================
+4. VIM::Window objects *ruby-window*
+
+VIM::Window objects represent vim windows.
+
+Class Methods:
+
+current Returns the current window object.
+count Returns the number of windows.
+self[{n}] Returns the window object for the number {n}. The first number
+ is 0.
+
+Methods:
+
+buffer Returns the buffer displayed in the window.
+height Returns the height of the window.
+height = {n} Sets the window height to {n}.
+width Returns the width of the window.
+width = {n} Sets the window width to {n}.
+cursor Returns a [row, col] array for the cursor position.
+cursor = [{row}, {col}]
+ Sets the cursor position to {row} and {col}.
+
+==============================================================================
+5. Global variables *ruby-globals*
+
+There are two global variables.
+
+$curwin The current window object.
+$curbuf The current buffer object.
+
+==============================================================================
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/indent.txt b/runtime/doc/indent.txt
index 6e96d9b816..aae091aa99 100644
--- a/runtime/doc/indent.txt
+++ b/runtime/doc/indent.txt
@@ -1,4 +1,4 @@
-*indent.txt* For Vim version 7.4. Last change: 2014 Dec 06
+*indent.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -6,8 +6,7 @@
This file is about indenting C programs and other files.
-1. Indenting C style programs |C-indenting|
-2. Indenting by expression |indent-expression|
+ Type |gO| to see the table of contents.
==============================================================================
1. Indenting C style programs *C-indenting*
@@ -322,6 +321,21 @@ The examples below assume a 'shiftwidth' of 4.
void function(); void function();
} }
<
+ *cino-E*
+ EN Indent inside C++ linkage specifications (extern "C" or
+ extern "C++") N characters extra compared to a normal block.
+ (default 0).
+
+ cino= cino=E-s >
+ extern "C" { extern "C" {
+ void function(); void function();
+ } }
+
+ extern "C" extern "C"
+ { {
+ void function(); void function();
+ } }
+<
*cino-p*
pN Parameter declarations for K&R-style function declarations will
be indented N characters from the margin. (default
@@ -396,10 +410,10 @@ The examples below assume a 'shiftwidth' of 4.
*cino-(*
(N When in unclosed parentheses, indent N characters from the line
with the unclosed parentheses. Add a 'shiftwidth' for every
- unclosed parentheses. When N is 0 or the unclosed parentheses
- is the first non-white character in its line, line up with the
- next non-white character after the unclosed parentheses.
- (default 'shiftwidth' * 2).
+ extra unclosed parentheses. When N is 0 or the unclosed
+ parentheses is the first non-white character in its line, line
+ up with the next non-white character after the unclosed
+ parentheses. (default 'shiftwidth' * 2).
cino= cino=(0 >
if (c1 && (c2 || if (c1 && (c2 ||
@@ -410,7 +424,8 @@ The examples below assume a 'shiftwidth' of 4.
{ {
<
*cino-u*
- uN Same as (N, but for one level deeper. (default 'shiftwidth').
+ uN Same as (N, but for one nesting level deeper.
+ (default 'shiftwidth').
cino= cino=u2 >
if (c123456789 if (c123456789
@@ -551,7 +566,7 @@ The examples below assume a 'shiftwidth' of 4.
The defaults, spelled out in full, are:
- cinoptions=>s,e0,n0,f0,{0,}0,^0,L-1,:s,=s,l0,b0,gs,hs,N0,ps,ts,is,+s,
+ cinoptions=>s,e0,n0,f0,{0,}0,^0,L-1,:s,=s,l0,b0,gs,hs,N0,E0,ps,ts,is,+s,
c3,C0,/0,(2s,us,U0,w0,W0,k0,m0,j0,J0,)20,*70,#0
Vim puts a line in column 1 if:
@@ -810,7 +825,7 @@ PHP indenting can be altered in several ways by modifying the values of some
global variables:
*php-comment* *PHP_autoformatcomment*
-To not enable auto-formating of comments by default (if you want to use your
+To not enable auto-formatting of comments by default (if you want to use your
own 'formatoptions'): >
:let g:PHP_autoformatcomment = 0
@@ -888,6 +903,25 @@ In PHP braces are not required inside 'case/default' blocks therefore 'case:'
and 'default:' are indented at the same level than the 'switch()' to avoid
meaningless indentation. You can use the above option to return to the
traditional way.
+-------------
+
+ *PHP_noArrowMatching*
+By default the indent script will indent multi-line chained calls by matching
+the position of the '->': >
+
+ $user_name_very_long->name()
+ ->age()
+ ->info();
+
+You can revert to the classic way of indenting by setting this option to 1: >
+ :let g:PHP_noArrowMatching = 1
+
+You will obtain the following result: >
+
+ $user_name_very_long->name()
+ ->age()
+ ->info();
+
PYTHON *ft-python-indent*
@@ -903,6 +937,11 @@ Indent after a nested paren: >
Indent for a continuation line: >
let g:pyindent_continue = '&sw * 2'
+The method uses searchpair() to look back for unclosed parenthesis. This can
+sometimes be slow, thus it timeouts after 150 msec. If you notice the
+indenting isn't correct, you can set a larger timeout in msec: >
+ let g:pyindent_searchpair_timeout = 500
+
R *ft-r-indent*
@@ -940,6 +979,11 @@ Below is an example of indentation with and without this option enabled:
paste(x) paste(x)
} }
<
+The code will be indented after lines that match the pattern
+`'\(&\||\|+\|-\|\*\|/\|=\|\~\|%\|->\)\s*$'`. If you want indentation after
+lines that match a different pattern, you should set the appropriate value of
+`r_indent_op_pattern` in your |vimrc|.
+
SHELL *ft-sh-indent*
@@ -1118,4 +1162,4 @@ indent for a continuation line, a line that starts with a backslash: >
Three times shiftwidth is the default value.
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/index.txt b/runtime/doc/index.txt
index bd2df5d1e5..63ded3152f 100644
--- a/runtime/doc/index.txt
+++ b/runtime/doc/index.txt
@@ -1,4 +1,4 @@
-*index.txt* For Vim version 7.4. Last change: 2016 Mar 12
+*index.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -10,22 +10,13 @@ short description. The lists are sorted on ASCII value.
Tip: When looking for certain functionality, use a search command. E.g.,
to look for deleting something, use: "/delete".
-1. Insert mode |insert-index|
-2. Normal mode |normal-index|
- 2.1. Text objects |objects|
- 2.2. Window commands |CTRL-W|
- 2.3. Square bracket commands |[|
- 2.4. Commands starting with 'g' |g|
- 2.5. Commands starting with 'z' |z|
-3. Visual mode |visual-index|
-4. Command-line editing |ex-edit-index|
-5. EX commands |ex-cmd-index|
-
For an overview of options see help.txt |option-list|.
For an overview of built-in functions see |functions|.
For a list of Vim variables see |vim-variable|.
For a complete listing of all help items see |help-tags|.
+ Type |gO| to see the table of contents.
+
==============================================================================
1. Insert mode *insert-index*
@@ -48,6 +39,7 @@ tag char action in Insert mode ~
|i_CTRL-G_k| CTRL-G k line up, to column where inserting started
|i_CTRL-G_k| CTRL-G <Up> line up, to column where inserting started
|i_CTRL-G_u| CTRL-G u start new undoable edit
+|i_CTRL-G_U| CTRL-G U don't break undo with next cursor movement
|i_<BS>| <BS> delete character before the cursor
|i_digraph| {char1}<BS>{char2}
enter digraph (only when 'digraph' option set)
@@ -306,10 +298,10 @@ tag char note action in Normal mode ~
|B| B 1 cursor N WORDS backward
|C| ["x]C 2 change from the cursor position to the end
of the line, and N-1 more lines [into
- buffer x]; synonym for "c$"
+ register x]; synonym for "c$"
|D| ["x]D 2 delete the characters under the cursor
until the end of the line and N-1 more
- lines [into buffer x]; synonym for "d$"
+ lines [into register x]; synonym for "d$"
|E| E 1 cursor forward to the end of WORD N
|F| F{char} 1 cursor to the Nth occurrence of {char} to
the left
@@ -326,13 +318,13 @@ tag char note action in Normal mode ~
opposite direction
|O| O 2 begin a new line above the cursor and
insert text, repeat N times
-|P| ["x]P 2 put the text [from buffer x] before the
+|P| ["x]P 2 put the text [from register x] before the
cursor N times
|Q| Q switch to "Ex" mode
|R| R 2 enter replace mode: overtype existing
characters, repeat the entered text N-1
times
-|S| ["x]S 2 delete N lines [into buffer x] and start
+|S| ["x]S 2 delete N lines [into register x] and start
insert; synonym for "cc".
|T| T{char} 1 cursor till after Nth occurrence of {char}
to the left
@@ -340,8 +332,8 @@ tag char note action in Normal mode ~
|V| V start linewise Visual mode
|W| W 1 cursor N WORDS forward
|X| ["x]X 2 delete N characters before the cursor [into
- buffer x]
-|Y| ["x]Y yank N lines [into buffer x]; synonym for
+ register x]
+|Y| ["x]Y yank N lines [into register x]; synonym for
"yy"
|ZZ| ZZ store current file if modified, and exit
|ZQ| ZQ exit current file always
@@ -364,12 +356,12 @@ tag char note action in Normal mode ~
|`}| `} 1 cursor to the end of the current paragraph
|a| a 2 append text after the cursor N times
|b| b 1 cursor N words backward
-|c| ["x]c{motion} 2 delete Nmove text [into buffer x] and start
- insert
-|cc| ["x]cc 2 delete N lines [into buffer x] and start
+|c| ["x]c{motion} 2 delete Nmove text [into register x] and
+ start insert
+|cc| ["x]cc 2 delete N lines [into register x] and start
insert
-|d| ["x]d{motion} 2 delete Nmove text [into buffer x]
-|dd| ["x]dd 2 delete N lines [into buffer x]
+|d| ["x]d{motion} 2 delete Nmove text [into register x]
+|dd| ["x]dd 2 delete N lines [into register x]
|do| do 2 same as ":diffget"
|dp| dp 2 same as ":diffput"
|e| e 1 cursor forward to the end of word N
@@ -395,16 +387,16 @@ tag char note action in Normal mode ~
|q?| q? edit ? command-line in command-line window
|r| r{char} 2 replace N chars with {char}
|s| ["x]s 2 (substitute) delete N characters [into
- buffer x] and start insert
+ register x] and start insert
|t| t{char} 1 cursor till before Nth occurrence of {char}
to the right
|u| u 2 undo changes
|v| v start characterwise Visual mode
|w| w 1 cursor N words forward
|x| ["x]x 2 delete N characters under and after the
- cursor [into buffer x]
-|y| ["x]y{motion} yank Nmove text [into buffer x]
-|yy| ["x]yy yank N lines [into buffer x]
+ cursor [into register x]
+|y| ["x]y{motion} yank Nmove text [into register x]
+|yy| ["x]yy yank N lines [into register x]
|z| z{char} commands starting with 'z', see |z| below
|{| { 1 cursor N paragraphs backward
|bar| | 1 cursor to column N
@@ -857,6 +849,7 @@ tag command note action in Visual mode ~
------------------------------------------------------------------------------
|v_CTRL-\_CTRL-N| CTRL-\ CTRL-N stop Visual mode
|v_CTRL-\_CTRL-G| CTRL-\ CTRL-G go to mode specified with 'insertmode'
+|v_CTRL-A| CTRL-A 2 add N to number in highlighted text
|v_CTRL-C| CTRL-C stop Visual mode
|v_CTRL-G| CTRL-G toggle between Visual mode and Select mode
|v_<BS>| <BS> 2 Select mode: delete highlighted area
@@ -865,6 +858,7 @@ tag command note action in Visual mode ~
command
|v_CTRL-V| CTRL-V make Visual mode blockwise or stop Visual
mode
+|v_CTRL-X| CTRL-X 2 subtract N from number in highlighted text
|v_<Esc>| <Esc> stop Visual mode
|v_CTRL-]| CTRL-] jump to highlighted tag
|v_!| !{filter} 2 filter the highlighted lines through the
@@ -921,6 +915,8 @@ tag command note action in Visual mode ~
|v_a}| a} same as aB
|v_c| c 2 delete highlighted area and start insert
|v_d| d 2 delete highlighted area
+|v_g_CTRL-A| g CTRL-A 2 add N to number in highlighted text
+|v_g_CTRL-X| g CTRL-X 2 subtract N from number in highlighted text
|v_gJ| gJ 2 join the highlighted lines without
inserting spaces
|v_gq| gq 2 format the highlighted lines
@@ -948,7 +944,7 @@ tag command note action in Visual mode ~
|v_i{| i{ same as iB
|v_i}| i} same as iB
|v_o| o move cursor to other corner of area
-|v_r| r 2 delete highlighted area and start insert
+|v_r| r 2 replace highlighted area with a character
|v_s| s 2 delete highlighted area and start insert
|v_u| u 2 make highlighted area lowercase
|v_v| v make Visual mode characterwise or stop
@@ -977,7 +973,7 @@ tag command action in Command-line editing mode ~
|c_CTRL-E| CTRL-E cursor to end of command-line
|'cedit'| CTRL-F default value for 'cedit': opens the
command-line window; otherwise not used
- CTRL-G not used
+|c_CTRL-G| CTRL-G next match when 'incsearch' is active
|c_<BS>| <BS> delete the character in front of the cursor
|c_digraph| {char1} <BS> {char2}
enter digraph when 'digraph' is on
@@ -995,12 +991,14 @@ tag command action in Command-line editing mode ~
|c_CTRL-L| CTRL-L do completion on the pattern in front of the
cursor and insert the longest common part
|c_<CR>| <CR> execute entered command
-|c_<CR>| CTRL-M same as <CR>
+|c_CTRL-M| CTRL-M same as <CR>
|c_CTRL-N| CTRL-N after using 'wildchar' with multiple matches:
- go to next match, otherwise: same as <Down>
+ go to next match, otherwise: recall older
+ command-line from history.
CTRL-O not used
|c_CTRL-P| CTRL-P after using 'wildchar' with multiple matches:
- go to previous match, otherwise: same as <Up>
+ go to previous match, otherwise: recall older
+ command-line from history.
|c_CTRL-Q| CTRL-Q same as CTRL-V, unless it's used for terminal
control flow
|c_CTRL-R| CTRL-R {0-9a-z"%#*:= CTRL-F CTRL-P CTRL-W CTRL-A}
@@ -1010,7 +1008,7 @@ tag command action in Command-line editing mode ~
insert the contents of a register or object
under the cursor literally
CTRL-S (used for terminal control flow)
- CTRL-T not used
+|c_CTRL-T| CTRL-T previous match when 'incsearch' is active
|c_CTRL-U| CTRL-U remove all characters
|c_CTRL-V| CTRL-V insert next non-digit literally, insert three
digit decimal number as a single byte.
@@ -1019,7 +1017,7 @@ tag command action in Command-line editing mode ~
CTRL-Y copy (yank) modeless selection
CTRL-Z not used (reserved for suspend)
|c_<Esc>| <Esc> abandon command-line without executing it
-|c_<Esc>| CTRL-[ same as <Esc>
+|c_CTRL-[| CTRL-[ same as <Esc>
|c_CTRL-\_CTRL-N| CTRL-\ CTRL-N go to Normal mode, abandon command-line
|c_CTRL-\_CTRL-G| CTRL-\ CTRL-G go to mode specified with 'insertmode',
abandon command-line
@@ -1129,6 +1127,7 @@ tag command action ~
|:caddfile| :caddf[ile] add error message to current quickfix list
|:call| :cal[l] call a function
|:catch| :cat[ch] part of a :try command
+|:cbottom| :cbo[ttom] scroll to the bottom of the quickfix window
|:cbuffer| :cb[uffer] parse error messages and jump to first error
|:cc| :cc go to specific error
|:cclose| :ccl[ose] close quickfix window
@@ -1146,8 +1145,10 @@ tag command action ~
|:chdir| :chd[ir] change directory
|:checkpath| :che[ckpath] list included files
|:checktime| :checkt[ime] check timestamp of loaded buffers
-|:clist| :cl[ist] list all errors
+|:chistory| :chi[story] list the error lists
|:clast| :cla[st] go to the specified error, default last one
+|:clearjumps| :cle[arjumps] clear the jump list
+|:clist| :cl[ist] list all errors
|:close| :clo[se] close current window
|:cmap| :cm[ap] like ":map" but for Command-line mode
|:cmapclear| :cmapc[lear] clear all mappings for Command-line mode
@@ -1194,7 +1195,7 @@ tag command action ~
|:display| :di[splay] display registers
|:djump| :dj[ump] jump to #define
|:dl| :dl short for |:delete| with the 'l' flag
-|:dl| :del[ete]l short for |:delete| with the 'l' flag
+|:del| :del[ete]l short for |:delete| with the 'l' flag
|:dlist| :dli[st] list #defines
|:doautocmd| :do[autocmd] apply autocommands to current buffer
|:doautoall| :doautoa[ll] apply autocommands for all loaded buffers
@@ -1226,6 +1227,7 @@ tag command action ~
|:file| :f[ile] show or set the current file name
|:files| :files list all files in the buffer list
|:filetype| :filet[ype] switch file type detection on/off
+|:filter| :filt[er] filter output of following command
|:find| :fin[d] find file in 'path' and edit it
|:finally| :fina[lly] part of a :try command
|:finish| :fini[sh] quit sourcing a Vim script
@@ -1286,6 +1288,7 @@ tag command action ~
|:last| :la[st] go to the last file in the argument list
|:language| :lan[guage] set the language (locale)
|:later| :lat[er] go to newer change, redo
+|:lbottom| :lbo[ttom] scroll to the bottom of the location window
|:lbuffer| :lb[uffer] parse locations and jump to first location
|:lcd| :lc[d] change directory locally
|:lchdir| :lch[dir] change directory locally
@@ -1305,6 +1308,7 @@ tag command action ~
|:lgrep| :lgr[ep] run 'grepprg' and jump to first match
|:lgrepadd| :lgrepa[dd] like :grep, but append to current list
|:lhelpgrep| :lh[elpgrep] like ":helpgrep" but uses location list
+|:lhistory| :lhi[story] list the location lists
|:ll| :ll go to specific location
|:llast| :lla[st] go to the specified location, default last one
|:llist| :lli[st] list all locations
@@ -1329,6 +1333,9 @@ tag command action ~
|:ltag| :lt[ag] jump to tag and add matching tags to the
location list
|:lunmap| :lu[nmap] like ":unmap!" but includes Lang-Arg mode
+|:lua| :lua execute Lua command
+|:luado| :luad[o] execute Lua command for each line
+|:luafile| :luaf[ile] execute Lua script file
|:lvimgrep| :lv[imgrep] search for pattern in files
|:lvimgrepadd| :lvimgrepa[dd] like :vimgrep, but append to current list
|:lwindow| :lw[indow] open or close location window
@@ -1411,6 +1418,10 @@ tag command action ~
|:python| :py[thon] execute Python command
|:pydo| :pyd[o] execute Python command for each line
|:pyfile| :pyf[ile] execute Python script file
+|:pyx| :pyx execute |python_x| command
+|:pythonx| :pythonx same as :pyx
+|:pyxdo| :pyxd[o] execute |python_x| command for each line
+|:pyxfile| :pyxf[ile] execute |python_x| script file
|:quit| :q[uit] quit current window (when one window quit Vim)
|:quitall| :quita[ll] quit Vim
|:qall| :qa[ll] quit Vim
@@ -1465,7 +1476,6 @@ tag command action ~
|:sfind| :sf[ind] split current window and edit file in 'path'
|:sfirst| :sfir[st] split window and go to first file in the
argument list
-|:simalt| :sim[alt] Win32 GUI: simulate Windows ALT key
|:sign| :sig[n] manipulate signs
|:silent| :sil[ent] run a command silently
|:sleep| :sl[eep] do nothing for a few seconds
@@ -1535,13 +1545,17 @@ tag command action ~
|:tjump| :tj[ump] like ":tselect", but jump directly when there
is only one match
|:tlast| :tl[ast] jump to last matching tag
+|:tmapclear| :tmapc[lear] remove all mappings for Terminal-Job mode
+|:tmap| :tma[p] like ":map" but for Terminal-Job mode
|:tmenu| :tm[enu] define menu tooltip
|:tnext| :tn[ext] jump to next matching tag
+|:tnoremap| :tno[remap] like ":noremap" but for Terminal-Job mode
|:topleft| :to[pleft] make split window appear at top or far left
|:tprevious| :tp[revious] jump to previous matching tag
|:trewind| :tr[ewind] jump to first matching tag
|:try| :try execute commands, abort on error or exception
|:tselect| :ts[elect] list matching tags and select one
+|:tunmap| :tunma[p] like ":unmap" but for Terminal-Job mode
|:tunmenu| :tu[nmenu] remove menu tooltip
|:undo| :u[ndo] undo last change(s)
|:undojoin| :undoj[oin] join next change with previous undo block
@@ -1604,4 +1618,4 @@ tag command action ~
|:~| :~ repeat last ":substitute"
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/insert.txt b/runtime/doc/insert.txt
index 818d6cf64c..f22f90548b 100644
--- a/runtime/doc/insert.txt
+++ b/runtime/doc/insert.txt
@@ -1,4 +1,4 @@
-*insert.txt* For Vim version 7.4. Last change: 2016 Jan 31
+*insert.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -13,20 +13,11 @@ commands for inserting text in other ways.
An overview of the most often used commands can be found in chapter 24 of the
user manual |usr_24.txt|.
-1. Special keys |ins-special-keys|
-2. Special special keys |ins-special-special|
-3. 'textwidth' and 'wrapmargin' options |ins-textwidth|
-4. 'expandtab', 'smarttab' and 'softtabstop' options |ins-expandtab|
-5. Replace mode |Replace-mode|
-6. Virtual Replace mode |Virtual-Replace-mode|
-7. Insert mode completion |ins-completion|
-8. Insert mode commands |inserting|
-9. Ex insert commands |inserting-ex|
-10. Inserting a file |inserting-file|
-
Also see 'virtualedit', for moving the cursor to positions where there is no
character. Useful for editing a table.
+ Type |gO| to see the table of contents.
+
==============================================================================
1. Special keys *ins-special-keys*
@@ -49,10 +40,11 @@ char action ~
*i_CTRL-[* *i_<Esc>*
<Esc> or CTRL-[ End insert or Replace mode, go back to Normal mode. Finish
abbreviation.
- Note: If your <Esc> key is hard to hit on your keyboard, train
- yourself to use CTRL-[.
- If Esc doesn't work and you are using a Mac, try CTRL-Esc.
- Or disable Listening under Accessibility preferences.
+ 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.
+ For example <A-x> acts like <Esc>x if <A-x> does not have an
+ 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
@@ -155,7 +147,8 @@ CTRL-R CTRL-R {0-9a-z"%#*+/:.-=} *i_CTRL-R_CTRL-R*
CTRL-R CTRL-O {0-9a-z"%#*+/:.-=} *i_CTRL-R_CTRL-O*
Insert the contents of a register literally and don't
auto-indent. Does the same as pasting with the mouse
- |<MiddleMouse>|.
+ |<MiddleMouse>|. When the register is linewise this will
+ insert the text above the current line, like with `P`.
Does not replace characters!
The '.' register (last inserted text) is still inserted as
typed.
@@ -370,9 +363,6 @@ CTRL-G U don't break undo with next left/right cursor *i_CTRL-G_U*
within same the line)
-----------------------------------------------------------------------
-Note: If the cursor keys take you out of Insert mode, check the 'noesckeys'
-option.
-
The CTRL-O command sometimes has a side effect: If the cursor was beyond the
end of the line, it will be put on the last character in the line. In
mappings it's often better to use <Esc> (first put an "x" in the text, <Esc>
@@ -420,12 +410,12 @@ An example for using CTRL-G U: >
inoremap ( ()<C-G>U<Left>
This makes it possible to use the cursor keys in Insert mode, without breaking
-the undo sequence and therefore using |.| (redo) will work as expected.
-Also entering a text like (with the "(" mapping from above): >
+the undo sequence and therefore using |.| (redo) will work as expected.
+Also entering a text like (with the "(" mapping from above):
Lorem ipsum (dolor
-will be repeatable by the |.|to the expected
+will be repeatable by using |.| to the expected
Lorem ipsum (dolor)
@@ -619,13 +609,13 @@ Completion can be done for:
10. User defined completion |i_CTRL-X_CTRL-U|
11. omni completion |i_CTRL-X_CTRL-O|
12. Spelling suggestions |i_CTRL-X_s|
-13. keywords in 'complete' |i_CTRL-N|
+13. keywords in 'complete' |i_CTRL-N| |i_CTRL-P|
-All these (except 2) are done in CTRL-X mode. This is a sub-mode of Insert
-and Replace modes. You enter CTRL-X mode by typing CTRL-X and one of the
-CTRL-X commands. You exit CTRL-X mode by typing a key that is not a valid
-CTRL-X mode command. Valid keys are the CTRL-X command itself, CTRL-N (next),
-and CTRL-P (previous).
+All these, except CTRL-N and CTRL-P, are done in CTRL-X mode. This is a
+sub-mode of Insert and Replace modes. You enter CTRL-X mode by typing CTRL-X
+and one of the CTRL-X commands. You exit CTRL-X mode by typing a key that is
+not a valid CTRL-X mode command. Valid keys are the CTRL-X command itself,
+CTRL-N (next), and CTRL-P (previous).
Also see the 'infercase' option if you want to adjust the case of the match.
@@ -1036,13 +1026,13 @@ The function must return the column where the completion starts. It must be a
number between zero and the cursor column "col('.')". This involves looking
at the characters just before the cursor and including those characters that
could be part of the completed item. The text between this column and the
-cursor column will be replaced with the matches.
+cursor column will be replaced with the matches. If the returned value is
+larger than the cursor column, the cursor column is used.
-Special return values:
- -1 If no completion can be done, the completion will be cancelled with an
- error message.
- -2 To cancel silently and stay in completion mode.
- -3 To cancel silently and leave completion mode.
+Negative return values:
+ -2 To cancel silently and stay in completion mode.
+ -3 To cancel silently and leave completion mode.
+ Another negative value: completion starts at the cursor column
On the second invocation the arguments are:
a:findstart 0
@@ -1088,8 +1078,10 @@ items:
item with the same word is already present.
empty when non-zero this match will be added even when it is
an empty string
+ user_data custom data which is associated with the item and
+ available in |v:completed_item|
-All of these except 'icase', 'dup' and 'empty' must be a string. If an item
+All of these except "icase", "dup" and "empty" must be a string. If an item
does not meet these requirements then an error message is given and further
items in the list are not used. You can mix string and Dictionary items in
the returned list.
@@ -1181,6 +1173,8 @@ The menu is used when:
The 'pumheight' option can be used to set a maximum height. The default is to
use all space available.
+The 'pumwidth' option can be used to set a minimum width. The default is 15
+characters.
There are three states:
1. A complete match has been inserted, e.g., after using CTRL-N or CTRL-P.
@@ -1281,7 +1275,8 @@ it here: http://ctags.sourceforge.net/ Version 5.6 or later is recommended.
For version 5.5.4 you should add a patch that adds the "typename:" field:
ftp://ftp.vim.org/pub/vim/unstable/patches/ctags-5.5.4.patch
A compiled .exe for MS-Windows can be found at:
- http://georgevreilly.com/vim/ctags.html
+ http://ctags.sourceforge.net/
+ https://github.com/universal-ctags/ctags-win32
If you want to complete system functions you can do something like this. Use
ctags to generate a tags file for all the system header files: >
@@ -1434,9 +1429,9 @@ automatically switch to HTML/CSS/JavaScript completion. Note: contrary to
original HTML files completion of tags (and only tags) isn't context aware.
-RUBY *ft-ruby-omni* {Nvim}
+RUBY *ft-ruby-omni*
-NOTE: Completion for ruby code is not currently provided by Nvim.
+NOTE: |compl-omni| for Ruby code requires |provider-ruby| to be installed.
Ruby completion will parse your buffer on demand in order to provide a list of
completions. These completions will be drawn from modules loaded by 'require'
@@ -1513,15 +1508,15 @@ that begin with the filetype, "php", in this case. For example these syntax
groups are included by default with the PHP: phpEnvVar, phpIntVar,
phpFunctions.
-If you wish non-filetype syntax items to also be included, you can use a
-regular expression syntax (added in version 13.0 of autoload\syntaxcomplete.vim)
-to add items. Looking at the output from ":syntax list" while editing a PHP file
-I can see some of these entries: >
+If you wish non-filetype syntax items to also be included, you can use a
+regular expression syntax (added in version 13.0 of
+autoload/syntaxcomplete.vim) to add items. Looking at the output from
+":syntax list" while editing a PHP file I can see some of these entries: >
htmlArg,htmlTag,htmlTagName,javaScriptStatement,javaScriptGlobalObjects
To pick up any JavaScript and HTML keyword syntax groups while editing a PHP
-file, you can use 3 different regexs, one for each language. Or you can
-simply restrict the include groups to a particular value, without using
+file, you can use 3 different regexs, one for each language. Or you can
+simply restrict the include groups to a particular value, without using
a regex string: >
let g:omni_syntax_group_include_php = 'php\w\+,javaScript\w\+,html\w\+'
let g:omni_syntax_group_include_php = 'phpFunctions,phpMethods'
@@ -1534,9 +1529,9 @@ highlight. These items will be available within the omni completion list.
Some people may find this list unwieldy or are only interested in certain
items. There are two ways to prune this list (if necessary). If you find
-certain syntax groups you do not wish displayed you can use two different
-methods to identify these groups. The first specifically lists the syntax
-groups by name. The second uses a regular expression to identify both
+certain syntax groups you do not wish displayed you can use two different
+methods to identify these groups. The first specifically lists the syntax
+groups by name. The second uses a regular expression to identify both
syntax groups. Simply add one the following to your vimrc: >
let g:omni_syntax_group_exclude_php = 'phpCoreConstant,phpConstant'
let g:omni_syntax_group_exclude_php = 'php\w*Constant'
@@ -1559,22 +1554,22 @@ vimrc: >
For plugin developers, the plugin exposes a public function OmniSyntaxList.
This function can be used to request a List of syntax items. When editing a
-SQL file (:e syntax.sql) you can use the ":syntax list" command to see the
+SQL file (:e syntax.sql) you can use the ":syntax list" command to see the
various groups and syntax items. For example: >
- syntax list
-
-Yields data similar to this: >
- sqlOperator xxx some prior all like and any escape exists in is not
- or intersect minus between distinct
- links to Operator
- sqlType xxx varbit varchar nvarchar bigint int uniqueidentifier
- date money long tinyint unsigned xml text smalldate
- double datetime nchar smallint numeric time bit char
- varbinary binary smallmoney
- image float integer timestamp real decimal
+ syntax list
+
+Yields data similar to this:
+ sqlOperator xxx some prior all like and any escape exists in is not ~
+ or intersect minus between distinct ~
+ links to Operator ~
+ sqlType xxx varbit varchar nvarchar bigint int uniqueidentifier ~
+ date money long tinyint unsigned xml text smalldate ~
+ double datetime nchar smallint numeric time bit char ~
+ varbinary binary smallmoney ~
+ image float integer timestamp real decimal ~
There are two syntax groups listed here: sqlOperator and sqlType. To retrieve
-a List of syntax items you can call OmniSyntaxList a number of different
+a List of syntax items you can call OmniSyntaxList a number of different
ways. To retrieve all syntax items regardless of syntax group: >
echo OmniSyntaxList( [] )
@@ -1591,7 +1586,6 @@ From within a plugin, you would typically assign the output to a List: >
let myKeywords = []
let myKeywords = OmniSyntaxList( ['sqlKeyword'] )
-
SQL *ft-sql-omni*
@@ -1978,4 +1972,4 @@ self explanatory. Using the long or the short version depends on the
[READ ERRORS] not all of the file could be read
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/intro.txt b/runtime/doc/intro.txt
index cbe017e051..fee7d9aa69 100644
--- a/runtime/doc/intro.txt
+++ b/runtime/doc/intro.txt
@@ -1,22 +1,15 @@
-*intro.txt* For Vim version 7.4. Last change: 2015 Jan 20
+*intro.txt* Nvim
- VIM REFERENCE MANUAL by Bram Moolenaar
+ NVIM REFERENCE MANUAL
Introduction to Vim *ref* *reference*
-1. Introduction |intro|
-2. Vim on the internet |internet|
-3. Credits |credits|
-4. Notation |notation|
-5. Modes, introduction |vim-modes-intro|
-6. Switching from mode to mode |mode-switching|
-7. The window contents |window-contents|
-8. Definitions |definitions|
+ Type |gO| to see the table of contents.
==============================================================================
-1. Introduction *intro*
+Introduction *intro*
Vim stands for Vi IMproved. It used to be Vi IMitation, but there are so many
improvements that a name change was appropriate. Vim is a text editor which
@@ -34,14 +27,9 @@ It can be accessed from within Vim with the <Help> or <F1> key and with the
is not located in the default place. You can jump to subjects like with tags:
Use CTRL-] to jump to a subject under the cursor, use CTRL-T to jump back.
-This manual refers to Vim on various machines. There may be small differences
-between different computers and terminals. Besides the remarks given in this
-document, there is a separate document for each supported system, see
-|sys-file-list|.
-
*pronounce*
-Vim is pronounced as one word, like Jim, not vi-ai-em. It's written with a
-capital, since it's a name, again like Jim.
+Vim is pronounced as one word, like Jim. Nvim is pronounced as N-vim, or,
+continuing with the Jim simile, N-Jim, which sounds like Ninja.
This manual is a reference for all the Vim commands and options. This is not
an introduction to the use of Vi or Vim, it gets a bit complicated here and
@@ -49,135 +37,67 @@ there. For beginners, there is a hands-on |tutor|. To learn using Vim, read
the user manual |usr_toc.txt|.
*book*
-There are many books on Vi that contain a section for beginners. There are
-two books I can recommend:
+There are many books on Vi and Vim. We recommend these books:
- "Vim - Vi Improved" by Steve Oualline
+ "Practical Vim" by Drew Neil
+ "Modern Vim" by Drew Neil
+ https://vimcasts.org/publications/
-This is the very first book completely dedicated to Vim. It is very good for
-beginners. The most often used commands are explained with pictures and
-examples. The less often used commands are also explained, the more advanced
-features are summarized. There is a comprehensive index and a quick
-reference. Parts of this book have been included in the user manual
-|frombook|.
-Published by New Riders Publishing. ISBN: 0735710015
-For more information try one of these:
- http://iccf-holland.org/click5.html
- http://www.vim.org/iccf/click5.html
+"Practical Vim" is a popular because of its focus on quickly learning common
+editing tasks with Vim. "Modern Vim" explores new features introduced by Nvim
+and Vim 8.
- "Learning the Vi editor" by Linda Lamb and Arnold Robbins
+ "Vim - Vi Improved" by Steve Oualline
-This is a book about Vi that includes a chapter on Vim (in the sixth edition).
-The first steps in Vi are explained very well. The commands that Vim adds are
-only briefly mentioned. There is also a German translation.
-Published by O'Reilly. ISBN: 1-56592-426-6.
+This is the first book dedicated to Vim. Parts of it were included in the
+user manual. |frombook| ISBN: 0735710015
+For more information try one of these:
+ https://iccf-holland.org/click5.html
+ https://www.vim.org/iccf/click5.html
==============================================================================
-2. Vim on the internet *internet*
+Nvim on the interwebs *internet*
*www* *WWW* *faq* *FAQ* *distribution* *download*
-The Vim pages contain the most recent information about Vim. They also
-contain links to the most recent version of Vim. The FAQ is a list of
-Frequently Asked Questions. Read this if you have problems.
-
- VIM home page: http://www.vim.org/
- VIM FAQ: http://vimdoc.sf.net/
- Downloading: ftp://ftp.vim.org/pub/vim/MIRRORS
-
-
-Usenet News group where Vim is discussed: *news* *usenet*
- comp.editors
-This group is also for other editors. If you write about Vim, don't forget to
-mention that.
-
- *mail-list* *maillist*
-There are several mailing lists for Vim:
-<vim@vim.org>
- For discussions about using existing versions of Vim: Useful mappings,
- questions, answers, where to get a specific version, etc. There are
- quite a few people watching this list and answering questions, also
- for beginners. Don't hesitate to ask your question here.
-<vim-dev@vim.org> *vim-dev* *vimdev*
- For discussions about changing Vim: New features, porting, patches,
- beta-test versions, etc.
-<vim-announce@vim.org> *vim-announce*
- Announcements about new versions of Vim; also for beta-test versions
- and ports to different systems. This is a read-only list.
-<vim-multibyte@vim.org> *vim-multibyte*
- For discussions about using and improving the multi-byte aspects of
- Vim.
-<vim-mac@vim.org> *vim-mac*
- For discussions about using and improving the Macintosh version of
- Vim.
-
-See http://www.vim.org/maillist.php for the latest information.
-
-NOTE:
-- You can only send messages to these lists if you have subscribed!
-- You need to send the messages from the same location as where you subscribed
- from (to avoid spam mail).
-- Maximum message size is 40000 characters.
-
- *subscribe-maillist*
-If you want to join, send a message to
- <vim-subscribe@vim.org>
-Make sure that your "From:" address is correct. Then the list server will
-give you help on how to subscribe.
-
- *maillist-archive*
-For more information and archives look on the Vim maillist page:
-http://www.vim.org/maillist.php
+
+ Nvim home page: https://neovim.io/
+ Nvim FAQ: https://github.com/neovim/neovim/wiki/FAQ
+ Downloads: https://github.com/neovim/neovim/releases
+ Vim FAQ: https://vimhelp.appspot.com/vim_faq.txt.html
+ Vim home page: https://www.vim.org/
Bug reports: *bugs* *bug-reports* *bugreport.vim*
-Send bug reports to: Vim Developers <vim-dev@vim.org>
-This is a maillist, you need to become a member first and many people will see
-the message. If you don't want that, e.g. because it is a security issue,
-send it to <bugs@vim.org>, this only goes to the Vim maintainer (that's Bram).
-
-Please be brief; all the time that is spent on answering mail is subtracted
-from the time that is spent on improving Vim! Always give a reproducible
-example and try to find out which settings or other things influence the
-appearance of the bug. Try different machines, if possible. Send me patches
-if you can!
-
-It will help to include information about the version of Vim you are using and
-your setup. You can get the information with this command: >
- :so $VIMRUNTIME/bugreport.vim
-This will create a file "bugreport.txt" in the current directory, with a lot
-of information of your environment. Before sending this out, check if it
-doesn't contain any confidential information!
-
-If Vim crashes, please try to find out where. You can find help on this here:
-|debug.txt|.
-
-In case of doubt or when you wonder if the problem has already been fixed but
-you can't find a fix for it, become a member of the vim-dev maillist and ask
-your question there. |maillist|
-
- *year-2000* *Y2K*
-Since Vim internally doesn't use dates for editing, there is no year 2000
-problem to worry about. Vim does use the time in the form of seconds since
-January 1st 1970. It is used for a time-stamp check of the edited file and
-the swap file, which is not critical and should only cause warning messages.
-
-There might be a year 2038 problem, when the seconds don't fit in a 32 bit int
-anymore. This depends on the compiler, libraries and operating system.
-Specifically, time_t and the ctime() function are used. And the time_t is
-stored in four bytes in the swap file. But that's only used for printing a
-file date/time for recovery, it will never affect normal editing.
-
-The Vim strftime() function directly uses the strftime() system function.
-localtime() uses the time() system function. getftime() uses the time
-returned by the stat() system function. If your system libraries are year
-2000 compliant, Vim is too.
-
-The user may create scripts for Vim that use external commands. These might
-introduce Y2K problems, but those are not really part of Vim itself.
+Report bugs on GitHub: https://github.com/neovim/neovim/issues
+
+Be brief, yet complete. Always give a reproducible example and try to find
+out which settings or other things trigger the bug.
+
+If Nvim crashes, try to get a backtrace. See |debug.txt|.
==============================================================================
-3. Credits *credits* *author* *Bram* *Moolenaar*
+Sponsor Vim/Nvim development *sponsor* *register*
+
+Fixing bugs and adding new features takes a lot of time and effort. To show
+your appreciation for the work and motivate Bram and others to continue
+working on Vim please send a donation.
+
+Since Bram is back to a paid job the money will now be used to help children
+in Uganda. See |uganda|. But at the same time donations increase Bram's
+motivation to keep working on Vim!
+
+For the most recent information about sponsoring look on the Vim web site:
+
+ https://www.vim.org/sponsor/
+
+
+Neovim development is funded separately from Vim:
+
+ https://neovim.io/#sponsor
+
+==============================================================================
+Credits *credits* *author* *Bram* *Moolenaar*
Most of Vim was written by Bram Moolenaar <Bram@vim.org>.
@@ -254,6 +174,10 @@ Vim would never have become what it is now, without the help of these people!
Juergen Weigert Lattice version, AUX improvements, Unix and
MS-DOS ports, autoconf
Stefan 'Sec' Zehl Maintainer of vim.org
+ Yasuhiro Matsumoto many MS-Windows improvements
+ Ken Takata fixes and features
+ Kazunobu Kuriyama GTK 3
+ Christian Brabandt many fixes, features, user support, etc.
I wish to thank all the people that sent me bug reports and suggestions. The
list is too long to mention them all here. Vim would not be the same without
@@ -267,8 +191,7 @@ Vi "the original". Without further remarks this is the version
of Vi that appeared in Sun OS 4.x. ":version" returns
"Version 3.7, 6/7/85". Sometimes other versions are referred
to. Only runs under Unix. Source code only available with a
- license. More information on Vi can be found through:
- http://vi-editor.org [doesn't currently work...]
+ license.
*Nvi*
Nvi The "New" Vi. The version of Vi that comes with BSD 4.4 and FreeBSD.
Very good compatibility with the original Vi, with a few extensions.
@@ -283,7 +206,7 @@ Elvis Another Vi clone, made by Steve Kirkendall. Very compact but isn't
freely available.
==============================================================================
-4. Notation *notation*
+Notation *notation*
When syntax highlighting is used to read this, text that is not typed
literally is often highlighted with the Special group. These are items in [],
@@ -392,8 +315,7 @@ CTRL-{char} {char} typed as a control character; that is, typing {char}
*key-notation* *key-codes* *keycodes*
These names for keys are used in the documentation. They can also be used
-with the ":map" command (insert the key name by pressing CTRL-K and then the
-key you want the name for).
+with the ":map" command.
notation meaning equivalent decimal value(s) ~
-----------------------------------------------------------------------
@@ -450,10 +372,9 @@ notation meaning equivalent decimal value(s) ~
<k0> - <k9> keypad 0 to 9 *keypad-0* *keypad-9*
<S-...> shift-key *shift* *<S-*
<C-...> control-key *control* *ctrl* *<C-*
-<M-...> alt-key or meta-key *meta* *alt* *<M-*
+<M-...> alt-key or meta-key *META* *ALT* *<M-*
<A-...> same as <M-...> *<A-*
<D-...> command-key or "super" key *<D-*
-<t_xx> key with "xx" entry in termcap
-----------------------------------------------------------------------
Note: The shifted cursor keys, the help key, and the undo key are only
@@ -461,8 +382,8 @@ available on a few terminals.
Note: There are two codes for the delete key. 127 is the decimal ASCII value
for the delete key, which is always recognized. Some delete keys send another
-value, in which case this value is obtained from the termcap entry "kD". Both
-values have the same effect.
+value, in which case this value is obtained from the |terminfo| entry "key_dc".
+Both values have the same effect.
Note: The keypad keys are used in the same way as the corresponding "normal"
keys. For example, <kHome> has the same effect as <Home>. If a keypad key
@@ -488,7 +409,6 @@ the ":map" command. The rules are:
<S-F11> Shifted function key 11
<M-a> Meta- a ('a' with bit 8 set)
<M-A> Meta- A ('A' with bit 8 set)
- <t_kd> "kd" termcap entry (cursor down key)
The <> notation uses <lt> to escape the special meaning of key names. Using a
backslash also works, but only when 'cpoptions' does not include the 'B' flag.
@@ -507,9 +427,9 @@ examples and use them directly. Or type them literally, including the '<' and
":autocmd"!
==============================================================================
-5. Modes, introduction *vim-modes-intro* *vim-modes*
+Modes, introduction *vim-modes-intro* *vim-modes*
-Vim has six BASIC modes:
+Vim has seven BASIC modes:
*Normal* *Normal-mode* *command-mode*
Normal mode In Normal mode you can enter all the normal editor
@@ -545,6 +465,13 @@ Ex mode Like Command-line mode, but after entering a command
you remain in Ex mode. Very limited editing of the
command line. |Ex-mode|
+ *Terminal-mode*
+Terminal mode In Terminal mode all input (except |c_CTRL-\_CTRL-N|)
+ is sent to the process running in the current
+ |terminal| buffer.
+ If the 'showmode' option is on "-- TERMINAL --" is shown
+ at the bottom of the window.
+
There are six ADDITIONAL modes. These are variants of the BASIC modes:
*Operator-pending* *Operator-pending-mode*
@@ -565,9 +492,9 @@ Virtual Replace mode Virtual Replace mode is similar to Replace mode, but
If the 'showmode' option is on "-- VREPLACE --" is
shown at the bottom of the window.
-Insert Normal mode Entered when CTRL-O given in Insert mode. This is
- like Normal mode, but after executing one command Vim
- returns to Insert mode.
+Insert Normal mode Entered when CTRL-O is typed in Insert mode (see
+ |i_CTRL-O|). This is like Normal mode, but after
+ executing one command Vim returns to Insert mode.
If the 'showmode' option is on "-- (insert) --" is
shown at the bottom of the window.
@@ -585,7 +512,7 @@ Insert Select mode Entered when starting Select mode from Insert mode.
is shown at the bottom of the window.
==============================================================================
-6. Switching from mode to mode *mode-switching*
+Switching from mode to mode *mode-switching*
If for any reason you do not know which mode you are in, you can always get
back to Normal mode by typing <Esc> twice. This doesn't work for Ex mode
@@ -648,31 +575,15 @@ The command CTRL-\ CTRL-G or <C-\><C-G> can be used to go to Insert mode when
make sure Vim is in the mode indicated by 'insertmode', without knowing in
what mode Vim currently is.
- *Q* *mode-Ex* *Ex-mode* *Ex* *EX* *E501*
-Q Switch to "Ex" mode. This is a bit like typing ":"
- commands one after another, except:
+ *gQ* *Q* *mode-Ex* *Ex-mode* *Ex* *EX* *E501*
+Q or gQ Switch to Ex mode. This is like typing ":" commands
+ one after another, except:
- You don't have to keep pressing ":".
- The screen doesn't get updated after each command.
- - There is no normal command-line editing.
- - Mappings and abbreviations are not used.
- In fact, you are editing the lines with the "standard"
- line-input editing commands (<Del> or <BS> to erase,
- CTRL-U to kill the whole line).
- Vim will enter this mode by default if it's invoked as
- "ex" on the command-line.
- Use the ":vi" command |:visual| to exit "Ex" mode.
- Note: In older versions of Vim "Q" formatted text,
- that is now done with |gq|. But if you use the
- |vimrc_example.vim| script "Q" works like "gq".
-
- *gQ*
-gQ Switch to "Ex" mode like with "Q", but really behave
- like typing ":" commands after another. All command
- line editing, completion etc. is available.
- Use the ":vi" command |:visual| to exit "Ex" mode.
+ Use the ":vi" command |:visual| to exit this mode.
==============================================================================
-7. The window contents *window-contents*
+The window contents *window-contents*
In Normal mode and Insert/Replace mode the screen window will show the current
contents of the buffer: What You See Is What You Get. There are two
@@ -728,9 +639,9 @@ special situation. Vim will show only part of the line, around where the
cursor is. There are no special characters shown, so that you can edit all
parts of this line.
-The '@' occasion in the 'highlight' option can be used to set special
-highlighting for the '@' and '~' characters. This makes it possible to
-distinguish them from real characters in the buffer.
+The |hl-NonText| highlight group can be used to set special highlighting
+for the '@' and '~' characters. This makes it possible to distinguish them
+from real characters in the buffer.
The 'showbreak' option contains the string to put in front of wrapped lines.
@@ -791,16 +702,15 @@ window. You may make the window as small as you like, but if it gets too
small not a single line will fit in it. Make it at least 40 characters wide
to be able to read most messages on the last line.
-On most Unix systems, resizing the window is recognized and handled correctly
-by Vim.
-
==============================================================================
-8. Definitions *definitions*
+Definitions *definitions* *jargon*
- screen The whole area that Vim uses to work in. This can be
- a terminal emulator window. Also called "the Vim
- window".
- window A view on a buffer.
+ buffer Contains lines of text, usually from a file.
+ screen The whole area that Nvim uses to display things.
+ window A view on a buffer. There can be multiple windows for
+ one buffer.
+ frame Windows are kept in a tree of frames. Each frame
+ contains a column, row, or window ("leaf" frame).
A screen contains one or more windows, separated by status lines and with the
command line at the bottom.
@@ -833,7 +743,7 @@ A difference is made between four types of lines:
lines with wrapping, line breaks, etc. applied. They
can only be as long as the width of the window allows,
longer lines are wrapped or truncated.
- screen lines The lines of the screen that Vim uses. Consists of
+ screen lines The lines of the screen that Nvim uses. Consists of
the window lines of all windows, with status lines
and the command line added. They can only be as long
as the width of the screen allows. When the command
@@ -857,5 +767,27 @@ buffer lines logical lines window lines screen lines ~
5. ddd 13. (command line)
6. ~
+
+API client ~
+All external UIs and remote plugins (as opposed to regular Vim plugins) are
+"clients" in general; but we call something an "API client" if its purpose is
+to abstract or wrap the RPC API for the convenience of other applications
+(just like a REST client or SDK such as boto3 for AWS: you can speak AWS REST
+using an HTTP client like curl, but boto3 wraps that in a convenient python
+interface). For example, the Nvim lua-client is an API client:
+ https://github.com/neovim/lua-client
+
+
+Host ~
+A plugin "host" is both a client (of the Nvim API) and a server (of an
+external platform, e.g. python). It is a remote plugin that hosts other
+plugins.
+
+
+Remote plugin ~
+Arbitrary code registered via |:UpdateRemotePlugins|, that runs in a separate
+process and communicates with Nvim via the |api|.
+
+
==============================================================================
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/job_control.txt b/runtime/doc/job_control.txt
index 5cb172f90a..e5cd765e83 100644
--- a/runtime/doc/job_control.txt
+++ b/runtime/doc/job_control.txt
@@ -1,46 +1,38 @@
-*job_control.txt* For Nvim. {Nvim}
+*job_control.txt* Nvim
NVIM REFERENCE MANUAL by Thiago de Arruda
-Nvim's facilities for job control *job-control*
+Nvim job control *job-control*
-1. Introduction |job-control-intro|
-2. Usage |job-control-usage|
+Job control is a way to perform multitasking in Nvim, so scripts can spawn and
+control multiple processes without blocking the current Nvim instance.
+
+ Type |gO| to see the table of contents.
==============================================================================
-1. Introduction *job-control-intro*
+Concepts
-Job control is a simple way to perform multitasking in vimscript. Wikipedia
-contains a more generic/detailed description:
+Job Id *job-id*
-"Job control in computing refers to the control of multiple tasks or Jobs on a
-computer system, ensuring that they each have access to adequate resources to
-perform correctly, that competition for limited resources does not cause a
-deadlock where two or more jobs are unable to complete, resolving such
-situations where they do occur, and terminating jobs that, for any reason, are
-not performing as expected."
+Each job is identified by an integer id, unique for the life of the current
+Nvim session. Each job-id is a valid |channel-id|: they share the same "key
+space". Functions like |jobstart()| return job ids; functions like
+|jobsend()|, |jobstop()|, |rpcnotify()|, and |rpcrequest()| take job ids.
-In a few words: It allows a vimscript programmer to concurrently spawn and
-control multiple processes without blocking the current Nvim instance.
+Job stdio streams form a |channel| which can send and receive raw bytes or
+|msgpack-rpc| messages.
-Nvim's job control was designed to be simple and familiar to vimscript
-programmers, instead of being very powerful but complex. Unlike Vim's
-facilities for calling with external commands, job control does not depend on
-available shells, instead relying on OS functionality for process management.
+==============================================================================
+Usage *job-control-usage*
-Internally, Nvim job control is powered by libuv, which has a nice
-cross-platform API for managing processes. See https://github.com/libuv/libuv
-for details.
+To control jobs, use the "jobโ€ฆ" family of functions: |jobstart()|,
+|jobsend()|, |jobstop()|.
-==============================================================================
-2. Usage *job-control-usage*
+Example: >
-Job control is achieved by calling a combination of the |jobstart()|,
-|jobsend()| and |jobstop()| functions. Here's an example:
->
- function! s:JobHandler(job_id, data, event)
+ function! s:OnEvent(job_id, data, event) dict
if a:event == 'stdout'
let str = self.shell.' stdout: '.join(a:data)
elseif a:event == 'stderr'
@@ -52,41 +44,36 @@ Job control is achieved by calling a combination of the |jobstart()|,
call append(line('$'), str)
endfunction
let s:callbacks = {
- \ 'on_stdout': function('s:JobHandler'),
- \ 'on_stderr': function('s:JobHandler'),
- \ 'on_exit': function('s:JobHandler')
+ \ 'on_stdout': function('s:OnEvent'),
+ \ 'on_stderr': function('s:OnEvent'),
+ \ 'on_exit': function('s:OnEvent')
\ }
let job1 = jobstart(['bash'], extend({'shell': 'shell 1'}, s:callbacks))
let job2 = jobstart(['bash', '-c', 'for i in {1..10}; do echo hello $i!; sleep 1; done'], extend({'shell': 'shell 2'}, s:callbacks))
+To test the above script, copy it to a file ~/foo.vim and run it: >
+ nvim -u ~/foo.vim
<
-To test the above, copy it to the file ~/jobcontrol.vim and start with a clean
-nvim instance:
->
- nvim -u NONE -S ~/jobcontrol.vim
-<
-Here's what is happening:
-
-- Two bash instances are spawned by |jobstart()| with their stdin/stdout/stderr
- connected to nvim.
-- The first shell is idle, waiting to read commands from its stdin.
-- The second shell is started with the -c argument, causing it to execute a
- command then exit. In this case, the command is a for loop that will print 0
- through 9 then exit.
-- The `JobHandler()` function is a callback passed to |jobstart()| to handle
- various job events. It takes care of displaying stdout/stderr received from
- the shells.
-- The arguments passed to `JobHandler()` are:
-
- 0: The job id
- 1: If the event is "stdout" or "stderr", a list with lines read from the
- corresponding stream. For "exit", it is the status returned by the
- program.
- 2: The event type, which is "stdout", "stderr" or "exit".
+Description of what happens:
+ - Two bash shells are spawned by |jobstart()| with their stdin/stdout/stderr
+ streams connected to nvim.
+ - The first shell is idle, waiting to read commands from its stdin.
+ - The second shell is started with -c which executes the command (a for-loop
+ printing 0 through 9) and then exits.
+ - `OnEvent()` callback is passed to |jobstart()| to handle various job
+ events. It displays stdout/stderr data received from the shells.
+
+For |on_stdout| and |on_stderr| see |channel-callback|.
+ *on_exit*
+Arguments passed to on_exit callback:
+ 0: |job-id|
+ 1: Exit-code of the process.
+ 2: Event type: "exit"
+
Note: Buffered stdout/stderr data which has not been flushed by the sender
- will not trigger the "stdout" callback (but if the process ends, the
- "exit" callback will be triggered).
+ will not trigger the on_stdout/on_stderr callback (but if the process
+ ends, the on_exit callback will be invoked).
For example, "ruby -e" buffers output, so small strings will be
buffered unless "auto-flushing" ($stdout.sync=true) is enabled. >
function! Receive(job_id, data, event)
@@ -97,54 +84,64 @@ Here's what is happening:
\ {'on_stdout': 'Receive'})
< https://github.com/neovim/neovim/issues/1592
-The options dictionary is passed as the "self" variable to the callback
-function. Here's a more object-oriented version of the above:
->
- let Shell = {}
+ Note 2:
+ Job event handlers may receive partial (incomplete) lines. For a given
+ invocation of on_stdout/on_stderr, `a:data` is not guaranteed to end
+ with a newline.
+ - `abcdefg` may arrive as `['abc']`, `['defg']`.
+ - `abc\nefg` may arrive as `['abc', '']`, `['efg']` or `['abc']`,
+ `['','efg']`, or even `['ab']`, `['c','efg']`.
+ Easy way to deal with this: initialize a list as `['']`, then append
+ to it as follows: >
+ let s:chunks = ['']
+ func! s:on_stdout(job_id, data, event) dict
+ let s:chunks[-1] .= a:data[0]
+ call extend(s:chunks, a:data[1:])
+ endf
+<
- function Shell.on_stdout(job_id, data)
- call append(line('$'), self.get_name().' stdout: '.join(a:data))
- endfunction
+The |jobstart-options| dictionary is passed as |self| to the callback.
+The above example could be written in this "object-oriented" style: >
- function Shell.on_stderr(job_id, data)
- call append(line('$'), self.get_name().' stderr: '.join(a:data))
- endfunction
+ let Shell = {}
- function Shell.on_exit(job_id, data)
- call append(line('$'), self.get_name().' exited')
+ function Shell.on_stdout(_job_id, data, event)
+ call append(line('$'),
+ \ printf('[%s] %s: %s', a:event, self.name, join(a:data[:-2])))
endfunction
- function Shell.get_name()
- return 'shell '.self.name
- endfunction
+ let Shell.on_stderr = function(Shell.on_stdout)
- function Shell.new(name, ...)
- let instance = extend(copy(g:Shell), {'name': a:name})
- let argv = ['bash']
- if a:0 > 0
- let argv += ['-c', a:1]
- endif
- let instance.id = jobstart(argv, instance)
- return instance
+ function Shell.on_exit(job_id, _data, event)
+ let msg = printf('job %d ("%s") finished', a:job_id, self.name)
+ call append(line('$'), printf('[%s] BOOM!', a:event))
+ call append(line('$'), printf('[%s] %s!', a:event, msg))
endfunction
- let s1 = Shell.new('1')
- let s2 = Shell.new('2', 'for i in {1..10}; do echo hello $i!; sleep 1; done')
-
+ function Shell.new(name, cmd)
+ let object = extend(copy(g:Shell), {'name': a:name})
+ let object.cmd = ['sh', '-c', a:cmd]
+ let object.id = jobstart(object.cmd, object)
+ $
+ return object
+ endfunction
-To send data to the job's stdin, one can use the |jobsend()| function, like
-this:
->
- :call jobsend(job1, "ls\n")
- :call jobsend(job1, "invalid-command\n")
- :call jobsend(job1, "exit\n")
+ let instance = Shell.new('bomb',
+ \ 'for i in $(seq 9 -1 1); do echo $i 1>&$((i % 2 + 1)); sleep 1; done')
+<
+To send data to the job's stdin, use |chansend()|: >
+ :call chansend(job1, "ls\n")
+ :call chansend(job1, "invalid-command\n")
+ :call chansend(job1, "exit\n")
+<
+A job may be killed with |jobstop()|: >
+ :call jobstop(job1)
<
A job may be killed at any time with the |jobstop()| function:
>
:call jobstop(job1)
<
-When |jobstop()| is called, `SIGTERM` will be sent to the job. If a job does
-not exit after 2 seconds, `SIGKILL` will be sent.
+Individual streams can be closed without killing the job, see |chanclose()|.
==============================================================================
vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/makehtml.awk b/runtime/doc/makehtml.awk
index a1f77f5aba..6e93c01c54 100644
--- a/runtime/doc/makehtml.awk
+++ b/runtime/doc/makehtml.awk
@@ -135,11 +135,11 @@ NR == 1 { nf=split(FILENAME,f,".")
# common case - Latin1
print "<META HTTP-EQUIV=\"Content-type\" content=\"text/html; charset=ISO-8859-1\">";
}
- print "<TITLE>Vim documentation: " f[1] "</TITLE>";
+ print "<TITLE>Nvim documentation: " f[1] "</TITLE>";
print "</HEAD>";
print "<BODY BGCOLOR=\"#ffffff\">";
- print "<H1>Vim documentation: " f[1] "</H1>";
+ print "<H1>Nvim documentation: " f[1] "</H1>";
print "<A NAME=\"top\"></A>";
if ( FILENAME != "help.txt" ) {
print "<A HREF=\"index.html\">main help file</A>\n";
@@ -185,12 +185,6 @@ FILENAME == "gui.txt" && asciiart == "no" \
asciicnt=0;
}
-FILENAME == "quotes.txt" && asciiart == "no" \
- && $0 ~ /In summary:/ {
- asciiart= "yes";
- asciicnt=0;
- }
-
FILENAME == "usr_20.txt" && asciiart == "no" \
&& $0 ~ /an empty line at the end:/ {
asciiart= "yes";
diff --git a/runtime/doc/map.txt b/runtime/doc/map.txt
index 31c3198f72..fa5e10b5e5 100644
--- a/runtime/doc/map.txt
+++ b/runtime/doc/map.txt
@@ -1,4 +1,4 @@
-*map.txt* For Vim version 7.4. Last change: 2016 Jan 10
+*map.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -9,27 +9,13 @@ Key mapping, abbreviations and user-defined commands.
This subject is introduced in sections |05.3|, |24.7| and |40.1| of the user
manual.
-1. Key mapping |key-mapping|
- 1.1 MAP COMMANDS |:map-commands|
- 1.2 Special arguments |:map-arguments|
- 1.3 Mapping and modes |:map-modes|
- 1.4 Listing mappings |map-listing|
- 1.5 Mapping special keys |:map-special-keys|
- 1.6 Special characters |:map-special-chars|
- 1.7 What keys to map |map-which-keys|
- 1.8 Examples |map-examples|
- 1.9 Using mappings |map-typing|
- 1.10 Mapping alt-keys |:map-alt-keys|
- 1.11 Mapping an operator |:map-operator|
-2. Abbreviations |abbreviations|
-3. Local mappings and functions |script-local|
-4. User-defined commands |user-commands|
+ Type |gO| to see the table of contents.
==============================================================================
1. Key mapping *key-mapping* *mapping* *macro*
Key mapping is used to change the meaning of typed keys. The most common use
-is to define a sequence commands for a function key. Example: >
+is to define a sequence of commands for a function key. Example: >
:map <F2> a<C-R>=strftime("%c")<CR><Esc>
@@ -55,6 +41,7 @@ modes.
:im[ap] {lhs} {rhs} |mapmode-i| *:im* *:imap*
:lm[ap] {lhs} {rhs} |mapmode-l| *:lm* *:lmap*
:cm[ap] {lhs} {rhs} |mapmode-c| *:cm* *:cmap*
+:tma[p] {lhs} {rhs} |mapmode-t| *:tma* *:tmap*
Map the key sequence {lhs} to {rhs} for the modes
where the map command applies. The result, including
{rhs}, is then further scanned for mappings. This
@@ -71,6 +58,7 @@ modes.
:ino[remap] {lhs} {rhs} |mapmode-i| *:ino* *:inoremap*
:ln[oremap] {lhs} {rhs} |mapmode-l| *:ln* *:lnoremap*
:cno[remap] {lhs} {rhs} |mapmode-c| *:cno* *:cnoremap*
+:tno[remap] {lhs} {rhs} |mapmode-t| *:tno* *:tnoremap*
Map the key sequence {lhs} to {rhs} for the modes
where the map command applies. Disallow mapping of
{rhs}, to avoid nested and recursive mappings. Often
@@ -87,6 +75,7 @@ modes.
:iu[nmap] {lhs} |mapmode-i| *:iu* *:iunmap*
:lu[nmap] {lhs} |mapmode-l| *:lu* *:lunmap*
:cu[nmap] {lhs} |mapmode-c| *:cu* *:cunmap*
+:tunma[p] {lhs} |mapmode-t| *:tunma* *:tunmap*
Remove the mapping of {lhs} for the modes where the
map command applies. The mapping may remain defined
for other modes where it applies.
@@ -105,6 +94,7 @@ modes.
:imapc[lear] |mapmode-i| *:imapc* *:imapclear*
:lmapc[lear] |mapmode-l| *:lmapc* *:lmapclear*
:cmapc[lear] |mapmode-c| *:cmapc* *:cmapclear*
+:tmapc[lear] |mapmode-t| *:tmapc* *:tmapclear*
Remove ALL mappings for the modes where the map
command applies.
Use the <buffer> argument to remove buffer-local
@@ -121,6 +111,7 @@ modes.
:im[ap] |mapmode-i|
:lm[ap] |mapmode-l|
:cm[ap] |mapmode-c|
+:tma[p] |mapmode-t|
List all key mappings for the modes where the map
command applies. Note that ":map" and ":map!" are
used most often, because they include the other modes.
@@ -135,6 +126,7 @@ modes.
:im[ap] {lhs} |mapmode-i| *:imap_l*
:lm[ap] {lhs} |mapmode-l| *:lmap_l*
:cm[ap] {lhs} |mapmode-c| *:cmap_l*
+:tma[p] {lhs} |mapmode-t| *:tmap_l*
List the key mappings for the key sequences starting
with {lhs} in the modes where the map command applies.
@@ -157,7 +149,7 @@ type "a", then "bar" will get inserted.
1.2 SPECIAL ARGUMENTS *:map-arguments*
-"<buffer>", "<nowait>", "<silent>", "<special>", "<script>", "<expr>" and
+"<buffer>", "<nowait>", "<silent>", "<script>", "<expr>" and
"<unique>" can be used in any order. They must appear right after the
command, before any other arguments.
@@ -183,7 +175,7 @@ that starts with ",". Then you need to type another character for Vim to know
whether to use the "," mapping or the longer one. To avoid this add the
<nowait> argument. Then the mapping will be used when it matches, Vim does
not wait for more characters to be typed. However, if the characters were
-already type they are used.
+already typed they are used.
*:map-<silent>* *:map-silent*
To define a mapping which will not be echoed on the command line, add
@@ -197,12 +189,6 @@ Prompts will still be given, e.g., for inputdialog().
Using "<silent>" for an abbreviation is possible, but will cause redrawing of
the command line to fail.
- *:map-<special>* *:map-special*
-Define a mapping with <> notation for special keys, even though the "<" flag
-may appear in 'cpoptions'. This is useful if the side effect of setting
-'cpoptions' is not desired. Example: >
- :map <special> <F12> /Header<CR>
-<
*:map-<script>* *:map-script*
If the first argument to one of these commands is "<script>" and it is used to
define a new mapping or abbreviation, the mapping will only remap characters
@@ -246,8 +232,9 @@ For this reason the following is blocked:
- Editing another buffer.
- The |:normal| command.
- Moving the cursor is allowed, but it is restored afterwards.
+- If the cmdline is changed, the old text and cursor position are restored.
If you want the mapping to do any of these let the returned characters do
-that.
+that. Or use a |<Cmd>| mapping (which doesn't have these restrictions).
You can use getchar(), it consumes typeahead if there is any. E.g., if you
have these mappings: >
@@ -286,11 +273,38 @@ again for using <expr>. This does work: >
Using 0x80 as a single byte before other text does not work, it will be seen
as a special key.
+ *<Cmd>* *:map-cmd*
+The <Cmd> pseudokey may be used to define a "command mapping", which executes
+the command directly (without changing modes, etc.). Where you might use
+":...<CR>" in the {lhs} of a mapping, you can instead use "<Cmd>...<CR>".
+Example: >
+ noremap x <Cmd>echo mode(1)<cr>
+<
+This is more flexible than `:<C-U>` in visual and operator-pending mode, or
+`<C-O>:` in insert-mode, because the commands are executed directly in the
+current mode (instead of always going to normal-mode). Visual-mode is
+preserved, so tricks with |gv| are not needed. Commands can be invoked
+directly in cmdline-mode (which otherwise would require timer hacks).
+
+Because <Cmd> avoids mode-changes (unlike ":") it does not trigger
+|CmdlineEnter| and |CmdlineLeave| events. This helps performance.
+
+Unlike <expr> mappings, there are no special restrictions on the <Cmd>
+command: it is executed as if an (unrestricted) |autocmd| was invoked or an
+async event event was processed.
+
+In select-mode, |:map| and |:vmap| command mappings are executed in
+visual-mode. Use |:smap| to handle select-mode.
+
+ *E5520*
+<Cmd> commands must terminate, that is, they must be followed by <CR> in the
+{lhs} of the mapping definition. |Command-line| mode is never entered.
+
1.3 MAPPING AND MODES *:map-modes*
- *mapmode-nvo* *mapmode-n* *mapmode-v* *mapmode-o*
+ *mapmode-nvo* *mapmode-n* *mapmode-v* *mapmode-o* *mapmode-t*
-There are six sets of mappings
+There are seven sets of mappings
- For Normal mode: When typing commands.
- For Visual mode: When typing commands while the Visual area is highlighted.
- For Select mode: like Visual mode but typing text replaces the selection.
@@ -298,6 +312,7 @@ There are six sets of mappings
etc.). See below: |omap-info|.
- For Insert mode. These are also used in Replace mode.
- For Command-line mode: When entering a ":" or "/" command.
+- For Terminal mode: When typing in a |:terminal| buffer.
Special case: While typing a count for a command in Normal mode, mapping zero
is disabled. This makes it possible to map zero without making it impossible
@@ -316,6 +331,7 @@ Overview of which map command works in which mode. More details below.
:imap :inoremap :iunmap Insert
:lmap :lnoremap :lunmap Insert, Command-line, Lang-Arg
:cmap :cnoremap :cunmap Command-line
+:tmap :tnoremap :tunmap Terminal
COMMANDS MODES ~
@@ -358,8 +374,9 @@ several modes. In Vim you can use the ":nmap", ":vmap", ":omap", ":cmap" and
*omap-info*
Operator-pending mappings can be used to define a movement command that can be
-used with any operator. Simple example: ":omap { w" makes "y{" work like "yw"
-and "d{" like "dw".
+used with any operator. Simple example: >
+ :omap { w
+makes "y{" work like "yw" and "d{" like "dw".
To ignore the starting cursor position and select different text, you can have
the omap start Visual mode to select the text to be operated upon. Example
@@ -370,9 +387,11 @@ Normal mode commands find the first '(' character and select the first word
before it. That usually is the function name.
To enter a mapping for Normal and Visual mode, but not Operator-pending mode,
-first define it for all three modes, then unmap it for Operator-pending mode:
+first define it for all three modes, then unmap it for
+Operator-pending mode: >
:map xx something-difficult
:ounmap xx
+
Likewise for a mapping for Visual and Operator-pending mode or Normal and
Operator-pending mode.
@@ -398,7 +417,8 @@ state for Insert mode is also used when typing a character as an argument to
command like "f" or "t".
Language mappings will never be applied to already mapped characters. They
are only used for typed characters. This assumes that the language mapping
-was already done when typing the mapping.
+was already done when typing the mapping. Correspondingly, language mappings
+are applied when recording macros, rather than when applying them.
1.4 LISTING MAPPINGS *map-listing*
@@ -429,6 +449,9 @@ with a space.
Note: When using mappings for Visual mode, you can use the "'<" mark, which
is the start of the last selected Visual area in the current buffer |'<|.
+The |:filter| command can be used to select what mappings to list. The
+pattern is matched against the {lhs} and {rhs} in the raw form.
+
*:map-verbose*
When 'verbose' is non-zero, listing a key map will also display where it was
last defined. Example: >
@@ -442,42 +465,28 @@ See |:verbose-cmd| for more information.
1.5 MAPPING SPECIAL KEYS *:map-special-keys*
-There are three ways to map a special key:
+There are two ways to map a special key:
1. The Vi-compatible method: Map the key code. Often this is a sequence that
starts with <Esc>. To enter a mapping like this you type ":map " and then
you have to type CTRL-V before hitting the function key. Note that when
- the key code for the key is in the termcap (the t_ options), it will
- automatically be translated into the internal code and become the second
- way of mapping (unless the 'k' flag is included in 'cpoptions').
+ the key code for the key is in the |terminfo| entry, it will automatically
+ be translated into the internal code and become the second way of mapping.
2. The second method is to use the internal code for the function key. To
enter such a mapping type CTRL-K and then hit the function key, or use
the form "#1", "#2", .. "#9", "#0", "<Up>", "<S-Down>", "<S-F7>", etc.
(see table of keys |key-notation|, all keys from <Up> can be used). The
first ten function keys can be defined in two ways: Just the number, like
"#2", and with "<F>", like "<F2>". Both stand for function key 2. "#0"
- refers to function key 10, defined with option 't_f10', which may be
- function key zero on some keyboards. The <> form cannot be used when
- 'cpoptions' includes the '<' flag.
-3. Use the termcap entry, with the form <t_xx>, where "xx" is the name of the
- termcap entry. Any string entry can be used. For example: >
- :map <t_F3> G
-< Maps function key 13 to "G". This does not work if 'cpoptions' includes
- the '<' flag.
-
-The advantage of the second and third method is that the mapping will work on
-different terminals without modification (the function key will be
-translated into the same internal code or the actual key code, no matter what
-terminal you are using. The termcap must be correct for this to work, and you
-must use the same mappings).
+ refers to function key 10.
DETAIL: Vim first checks if a sequence from the keyboard is mapped. If it
-isn't the terminal key codes are tried (see |terminal-options|). If a
-terminal code is found it is replaced with the internal code. Then the check
-for a mapping is done again (so you can map an internal code to something
-else). What is written into the script file depends on what is recognized.
-If the terminal key code was recognized as a mapping the key code itself is
-written to the script file. If it was recognized as a terminal code the
-internal code is written to the script file.
+isn't the terminal key codes are tried. If a terminal code is found it is
+replaced with the internal code. Then the check for a mapping is done again
+(so you can map an internal code to something else). What is written into the
+script file depends on what is recognized. If the terminal key code was
+recognized as a mapping the key code itself is written to the script file. If
+it was recognized as a terminal code the internal code is written to the
+script file.
1.6 SPECIAL CHARACTERS *:map-special-chars*
@@ -579,16 +588,17 @@ Upper and lowercase differences are ignored.
*map-comments*
It is not possible to put a comment after these commands, because the '"'
-character is considered to be part of the {lhs} or {rhs}.
+character is considered to be part of the {lhs} or {rhs}. However, one can
+use |", since this starts a new, empty command with a comment.
*map_bar* *map-bar*
Since the '|' character is used to separate a map command from the next
command, you will have to do something special to include a '|' in {rhs}.
There are three methods:
use works when example ~
- <Bar> '<' is not in 'cpoptions' :map _l :!ls <Bar> more^M
+ <Bar> always :map _l :!ls <Bar> more^M
\| 'b' is not in 'cpoptions' :map _l :!ls \| more^M
- ^V| always, in Vim and Vi :map _l :!ls ^V| more^M
+ ^V| always :map _l :!ls ^V| more^M
(here ^V stands for CTRL-V; to get one CTRL-V you have to type it twice; you
cannot use the <> notation "<C-V>" here).
@@ -643,8 +653,7 @@ out about, ^D is CTRL-D).
1.8 EXAMPLES *map-examples*
-A few examples (given as you type them, for "<CR>" you type four characters;
-the '<' flag must not be present in 'cpoptions' for this to work). >
+A few examples (as you type them: for "<CR>" you type four characters). >
:map <F3> o#include
:map <M-g> /foo<CR>cwbar<Esc>
@@ -676,7 +685,7 @@ option). After that it assumes that the 'q' is to be interpreted as such. If
you type slowly, or your system is slow, reset the 'timeout' option. Then you
might want to set the 'ttimeout' option.
- *map-precedence*
+ *map-precedence*
Buffer-local mappings (defined using |:map-<buffer>|) take precedence over
global mappings. When a buffer-local mapping is the same as a global mapping,
Vim will use the buffer-local mapping. In addition, Vim will use a complete
@@ -712,9 +721,6 @@ special key: >
Don't type a real <Esc>, Vim will recognize the key code and replace it with
<F1> anyway.
-Another problem may be that when keeping ALT or Meta pressed the terminal
-prepends ESC instead of setting the 8th bit. See |:map-alt-keys|.
-
*recursive_mapping*
If you include the {lhs} in the {rhs} you have a recursive mapping. When
{lhs} is typed, it will be replaced with {rhs}. When the {lhs} which is
@@ -754,46 +760,14 @@ in the original Vi, you would get back the text before the first undo).
1.10 MAPPING ALT-KEYS *:map-alt-keys*
-In the GUI Vim handles the Alt key itself, thus mapping keys with ALT should
-always work. But in a terminal Vim gets a sequence of bytes and has to figure
-out whether ALT was pressed or not.
-
-By default Vim assumes that pressing the ALT key sets the 8th bit of a typed
-character. Most decent terminals can work that way, such as xterm, aterm and
-rxvt. If your <A-k> mappings don't work it might be that the terminal is
-prefixing the character with an ESC character. But you can just as well type
-ESC before a character, thus Vim doesn't know what happened (except for
-checking the delay between characters, which is not reliable).
-
-As of this writing, some mainstream terminals like gnome-terminal and konsole
-use the ESC prefix. There doesn't appear a way to have them use the 8th bit
-instead. Xterm should work well by default. Aterm and rxvt should work well
-when started with the "--meta8" argument. You can also tweak resources like
-"metaSendsEscape", "eightBitInput" and "eightBitOutput".
-
-On the Linux console, this behavior can be toggled with the "setmetamode"
-command. Bear in mind that not using an ESC prefix could get you in trouble
-with other programs. You should make sure that bash has the "convert-meta"
-option set to "on" in order for your Meta keybindings to still work on it
-(it's the default readline behavior, unless changed by specific system
-configuration). For that, you can add the line: >
-
- set convert-meta on
-
-to your ~/.inputrc file. If you're creating the file, you might want to use: >
-
- $include /etc/inputrc
-
-as the first line, if that file exists on your system, to keep global options.
-This may cause a problem for entering special characters, such as the umlaut.
-Then you should use CTRL-V before that character.
-
-Bear in mind that convert-meta has been reported to have troubles when used in
-UTF-8 locales. On terminals like xterm, the "metaSendsEscape" resource can be
-toggled on the fly through the "Main Options" menu, by pressing Ctrl-LeftClick
-on the terminal; that's a good last resource in case you want to send ESC when
-using other applications but not when inside VIM.
-
+In the GUI Nvim handles the |ALT| key itself, thus mapping keys with ALT
+should always work. But in a terminal Nvim gets a sequence of bytes and has
+to figure out whether ALT was pressed. Terminals may use ESC to indicate that
+ALT was pressed. If ESC is followed by a {key} within 'ttimeoutlen'
+milliseconds, the ESC is interpreted as:
+ <ALT-{key}>
+otherwise it is interpreted as two key presses:
+ <ESC> {key}
1.11 MAPPING AN OPERATOR *:map-operator*
@@ -898,7 +872,9 @@ an additional rule:
full-id In front of the match is a non-keyword character, or this is where
the line or insertion starts. Exception: When the abbreviation is
only one character, it is not recognized if there is a non-keyword
- character in front of it, other than a space or a tab.
+ character in front of it, other than a space or a tab. However, for
+ the command line "'<,'>" (or any other marks) is ignored, as if the
+ command line starts after it.
end-id In front of the match is a keyword character, or a space or a tab,
or this is where the line or insertion starts.
@@ -931,7 +907,6 @@ character is mostly ignored otherwise.
It is possible to move the cursor after an abbreviation: >
:iab if if ()<Left>
-This does not work if 'cpoptions' includes the '<' flag. |<>|
You can even do more complicated things. For example, to consume the space
typed after an abbreviation: >
@@ -1079,8 +1054,7 @@ functions used in one script use the same name as in other scripts. To avoid
this, they can be made local to the script.
*<SID>* *<SNR>* *E81*
-The string "<SID>" can be used in a mapping or menu. This requires that the
-'<' flag is not present in 'cpoptions'.
+The string "<SID>" can be used in a mapping or menu.
When executing the map command, Vim will replace "<SID>" with the special
key code <SNR>, followed by a number that's unique for the script, and an
underscore. Example: >
@@ -1163,6 +1137,10 @@ scripts.
" Command has the -register attribute
b Command is local to current buffer
(see below for details on attributes)
+ The list can be filtered on command name with
+ |:filter|, e.g., to list all commands with "Pyth" in
+ the name: >
+ filter Pyth command
:com[mand] {cmd} List the user-defined commands that start with {cmd}
@@ -1238,6 +1216,7 @@ By default, the arguments of user defined commands do not undergo completion.
However, by specifying one or the other of the following attributes, argument
completion can be enabled:
+ -complete=arglist file names in argument list
-complete=augroup autocmd groups
-complete=buffer buffer names
-complete=behave :behave suboptions
@@ -1257,9 +1236,12 @@ completion can be enabled:
-complete=highlight highlight groups
-complete=history :history suboptions
-complete=locale locale names (as output of locale -a)
+ -complete=mapclear buffer argument
-complete=mapping mapping name
-complete=menu menus
+ -complete=messages |:messages| suboptions
-complete=option options
+ -complete=packadd optional package |pack-add| names
-complete=shellcmd Shell command
-complete=sign |:sign| suboptions
-complete=syntax syntax file names |'syntax'|
@@ -1344,7 +1326,7 @@ Possible attributes are:
Note that -range=N and -count=N are mutually exclusive - only one should be
specified.
- *E889* *:command-addr*
+ *:command-addr*
It is possible that the special characters in the range like `.`, `$` or `%`
which by default correspond to the current line, last line and the whole
buffer, relate to arguments, (loaded) buffers, windows or tab pages.
@@ -1391,6 +1373,8 @@ The valid escape sequences are
<line1> The starting line of the command range.
*<line2>*
<line2> The final line of the command range.
+ *<range>*
+ <range> The number of items in the command range: 0, 1 or 2
*<count>*
<count> Any count supplied (as described for the '-range'
and '-count' attributes).
@@ -1398,6 +1382,29 @@ The valid escape sequences are
<bang> (See the '-bang' attribute) Expands to a ! if the
command was executed with a ! modifier, otherwise
expands to nothing.
+ *<mods>*
+ <mods> The command modifiers, if specified. Otherwise, expands to
+ nothing. Supported modifiers are |:aboveleft|, |:belowright|,
+ |:botright|, |:browse|, |:confirm|, |:hide|, |:keepalt|,
+ |:keepjumps|, |:keepmarks|, |:keeppatterns|, |:leftabove|,
+ |:lockmarks|, |:noswapfile| |:rightbelow|, |:silent|, |:tab|,
+ |:topleft|, |:verbose|, and |:vertical|.
+ Note that these are not yet supported: |:noautocmd|,
+ |:sandbox| and |:unsilent|.
+ Examples: >
+ command! -nargs=+ -complete=file MyEdit
+ \ for f in expand(<q-args>, 0, 1) |
+ \ exe '<mods> split ' . f |
+ \ endfor
+
+ function! SpecialEdit(files, mods)
+ for f in expand(a:files, 0, 1)
+ exe a:mods . ' split ' . f
+ endfor
+ endfunction
+ command! -nargs=+ -complete=file Sedit
+ \ call SpecialEdit(<q-args>, <q-mods>)
+<
*<reg>* *<register>*
<reg> (See the '-register' attribute) The optional register,
if specified. Otherwise, expands to nothing. <register>
@@ -1488,4 +1495,4 @@ local to the script and use mappings local to the script. When the user
invokes the user command, it will run in the context of the script it was
defined in. This matters if |<SID>| is used in a command.
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/mbyte.txt b/runtime/doc/mbyte.txt
index c87ed317d4..24d9d01af0 100644
--- a/runtime/doc/mbyte.txt
+++ b/runtime/doc/mbyte.txt
@@ -1,4 +1,4 @@
-*mbyte.txt* For Vim version 7.4. Last change: 2013 May 18
+*mbyte.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar et al.
@@ -14,26 +14,10 @@ For an introduction to the most common features, see |usr_45.txt| in the user
manual.
For changing the language of messages and menus see |mlang.txt|.
-{not available when compiled without the |+multi_byte| feature}
-
-
-1. Getting started |mbyte-first|
-2. Locale |mbyte-locale|
-3. Encoding |mbyte-encoding|
-4. Using a terminal |mbyte-terminal|
-5. Fonts on X11 |mbyte-fonts-X11|
-6. Fonts on MS-Windows |mbyte-fonts-MSwin|
-7. Input on X11 |mbyte-XIM|
-8. Input on MS-Windows |mbyte-IME|
-9. Input with a keymap |mbyte-keymap|
-10. Using UTF-8 |mbyte-utf8|
-11. Overview of options |mbyte-options|
-
-NOTE: This file contains UTF-8 characters. These may show up as strange
-characters or boxes when using another encoding.
+ Type |gO| to see the table of contents.
==============================================================================
-1. Getting started *mbyte-first*
+Getting started *mbyte-first*
This is a summary of the multibyte features in Vim. If you are lucky it works
as described and you can start using Vim without much trouble. If something
@@ -70,32 +54,26 @@ See |mbyte-locale| for details.
ENCODING
-If your locale works properly, Vim will try to set the 'encoding' option
-accordingly. If this doesn't work you can overrule its value: >
-
- :set encoding=utf-8
+Nvim always uses UTF-8 internally. Thus 'encoding' option is always set
+to "utf-8" and cannot be changed.
-See |encoding-values| for a list of acceptable values.
+All the text that is used inside Vim will be in UTF-8. Not only the text in
+the buffers, but also in registers, variables, etc.
-The result is that all the text that is used inside Vim will be in this
-encoding. Not only the text in the buffers, but also in registers, variables,
-etc. 'encoding' is read-only after startup because changing it would make the
-existing text invalid.
-
-You can edit files in another encoding than what 'encoding' is set to. Vim
+You can edit files in different encodings than UTF-8. Nvim
will convert the file when you read it and convert it back when you write it.
See 'fileencoding', 'fileencodings' and |++enc|.
DISPLAY AND FONTS
-If you are working in a terminal (emulator) you must make sure it accepts the
-same encoding as which Vim is working with.
+If you are working in a terminal (emulator) you must make sure it accepts
+UTF-8, the encoding which Vim is working with. Otherwise only ASCII can
+be displayed and edited correctly.
-For the GUI you must select fonts that work with the current 'encoding'. This
+For the GUI you must select fonts that work with UTF-8. This
is the difficult part. It depends on the system you are using, the locale and
-a few other things. See the chapters on fonts: |mbyte-fonts-X11| for
-X-Windows and |mbyte-fonts-MSwin| for MS-Windows.
+a few other things.
For X11 you can set the 'guifontset' option to a list of fonts that together
cover the characters that are used. Example for Korean: >
@@ -125,7 +103,7 @@ The options 'iminsert', 'imsearch' and 'imcmdline' can be used to chose
the different input methods or disable them temporarily.
==============================================================================
-2. Locale *mbyte-locale*
+Locale *mbyte-locale*
The easiest setup is when your whole system uses the locale you want to work
in. But it's also possible to set the locale for one shell you are working
@@ -214,12 +192,11 @@ Or specify $LANG when starting Vim:
You could make a small shell script for this.
==============================================================================
-3. Encoding *mbyte-encoding*
+Encoding *mbyte-encoding*
-Vim uses the 'encoding' option to specify how characters are identified and
-encoded when they are used inside Vim. This applies to all the places where
-text is used, including buffers (files loaded into memory), registers and
-variables.
+In Nvim UTF-8 is always used internally to encode characters.
+ This applies to all the places where text is used, including buffers (files
+ loaded into memory), registers and variables.
*charset* *codeset*
Charset is another name for encoding. There are subtle differences, but these
@@ -240,7 +217,7 @@ matter what language is used. Thus you might see the right text even when the
encoding was set wrong.
*encoding-names*
-Vim can use many different character encodings. There are three major groups:
+Vim can edit files in different character encodings. There are three major groups:
1 8bit Single-byte encodings, 256 different characters. Mostly used
in USA and Europe. Example: ISO-8859-1 (Latin1). All
@@ -255,11 +232,10 @@ u Unicode Universal encoding, can replace all others. ISO 10646.
Millions of different characters. Example: UTF-8. The
relation between bytes and screen cells is complex.
-Other encodings cannot be used by Vim internally. But files in other
+Only UTF-8 is used by Vim internally. But files in other
encodings can be edited by using conversion, see 'fileencoding'.
-Note that all encodings must use ASCII for the characters up to 128.
-Supported 'encoding' values are: *encoding-values*
+Recognized 'fileencoding' values include: *encoding-values*
1 latin1 8-bit characters (ISO 8859-1, also used for cp1252)
1 iso-8859-n ISO_8859 variant (n = 2 to 15)
1 koi8-r Russian
@@ -311,11 +287,11 @@ u ucs-4 32 bit UCS-4 encoded Unicode (ISO/IEC 10646-1)
u ucs-4le like ucs-4, little endian
The {name} can be any encoding name that your system supports. It is passed
-to iconv() to convert between the encoding of the file and the current locale.
+to iconv() to convert between UTF-8 and the encoding of the file.
For MS-Windows "cp{number}" means using codepage {number}.
Examples: >
- :set encoding=8bit-cp1252
- :set encoding=2byte-cp932
+ :set fileencoding=8bit-cp1252
+ :set fileencoding=2byte-cp932
The MS-Windows codepage 1252 is very similar to latin1. For practical reasons
the same encoding is used and it's called latin1. 'isprint' can be used to
@@ -337,8 +313,7 @@ u ucs-2be same as ucs-2 (big endian)
u ucs-4be same as ucs-4 (big endian)
u utf-32 same as ucs-4
u utf-32le same as ucs-4le
- default stands for the default value of 'encoding', depends on the
- environment
+ default the encoding of the current locale.
For the UCS codes the byte order matters. This is tricky, use UTF-8 whenever
you can. The default is to use big-endian (most significant byte comes
@@ -363,13 +338,12 @@ or when conversion is not possible:
CONVERSION *charset-conversion*
Vim will automatically convert from one to another encoding in several places:
-- When reading a file and 'fileencoding' is different from 'encoding'
-- When writing a file and 'fileencoding' is different from 'encoding'
+- When reading a file and 'fileencoding' is different from "utf-8"
+- When writing a file and 'fileencoding' is different from "utf-8"
- When displaying messages and the encoding used for LC_MESSAGES differs from
- 'encoding' (requires a gettext version that supports this).
+ "utf-8" (requires a gettext version that supports this).
- When reading a Vim script where |:scriptencoding| is different from
- 'encoding'.
-- When reading or writing a |shada| file.
+ "utf-8".
Most of these require the |+iconv| feature. Conversion for reading and
writing files may also be specified with the 'charconvert' option.
@@ -408,11 +382,11 @@ Useful utilities for converting the charset:
*mbyte-conversion*
-When reading and writing files in an encoding different from 'encoding',
+When reading and writing files in an encoding different from "utf-8",
conversion needs to be done. These conversions are supported:
- All conversions between Latin-1 (ISO-8859-1), UTF-8, UCS-2 and UCS-4 are
handled internally.
-- For MS-Windows, when 'encoding' is a Unicode encoding, conversion from and
+- For MS-Windows, conversion from and
to any codepage should work.
- Conversion specified with 'charconvert'
- Conversion with the iconv library, if it is available.
@@ -427,51 +401,7 @@ neither of them can be found Vim will still work but some conversions won't be
possible.
==============================================================================
-4. Using a terminal *mbyte-terminal*
-
-The GUI fully supports multi-byte characters. It is also possible in a
-terminal, if the terminal supports the same encoding that Vim uses. Thus this
-is less flexible.
-
-For example, you can run Vim in a xterm with added multi-byte support and/or
-|XIM|. Examples are kterm (Kanji term) and hanterm (for Korean), Eterm
-(Enlightened terminal) and rxvt.
-
-UTF-8 IN XFREE86 XTERM *UTF8-xterm*
-
-This is a short explanation of how to use UTF-8 character encoding in the
-xterm that comes with XFree86 by Thomas Dickey (text by Markus Kuhn).
-
-Get the latest xterm version which has now UTF-8 support:
-
- http://invisible-island.net/xterm/xterm.html
-
-Compile it with "./configure --enable-wide-chars ; make"
-
-Also get the ISO 10646-1 version of various fonts, which is available on
-
- http://www.cl.cam.ac.uk/~mgk25/download/ucs-fonts.tar.gz
-
-and install the font as described in the README file.
-
-Now start xterm with >
-
- xterm -u8 -fn -misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-iso10646-1
-or, for bigger character: >
- xterm -u8 -fn -misc-fixed-medium-r-normal--15-140-75-75-c-90-iso10646-1
-
-and you will have a working UTF-8 terminal emulator. Try both >
-
- cat utf-8-demo.txt
- vim utf-8-demo.txt
-
-with the demo text that comes with ucs-fonts.tar.gz in order to see
-whether there are any problems with UTF-8 in your xterm.
-
-For Vim you may need to set 'encoding' to "utf-8".
-
-==============================================================================
-5. Fonts on X11 *mbyte-fonts-X11*
+Fonts on X11 *mbyte-fonts-X11*
Unfortunately, using fonts in X11 is complicated. The name of a single-byte
font is a long string. For multi-byte fonts we need several of these...
@@ -607,20 +537,7 @@ Also make sure that you set 'guifontset' before setting fonts for highlight
groups.
==============================================================================
-6. Fonts on MS-Windows *mbyte-fonts-MSwin*
-
-The simplest is to use the font dialog to select fonts and try them out. You
-can find this at the "Edit/Select Font..." menu. Once you find a font name
-that works well you can use this command to see its name: >
-
- :set guifont
-
-Then add a command to your |ginit.vim| file to set 'guifont': >
-
- :set guifont=courier_new:h12
-
-==============================================================================
-7. Input on X11 *mbyte-XIM*
+Input on X11 *mbyte-XIM*
X INPUT METHOD (XIM) BACKGROUND *XIM* *xim* *x-input-method*
@@ -779,7 +696,7 @@ For example, when you are using kinput2 as |IM-server| and sh, >
<
==============================================================================
-8. Input on MS-Windows *mbyte-IME*
+Input on MS-Windows *mbyte-IME*
(Windows IME support) *multibyte-ime* *IME*
@@ -853,22 +770,23 @@ Cursor color when IME or XIM is on *CursorIM*
status is on.
==============================================================================
-9. Input with a keymap *mbyte-keymap*
+Input with a keymap *mbyte-keymap*
When the keyboard doesn't produce the characters you want to enter in your
text, you can use the 'keymap' option. This will translate one or more
(English) characters to another (non-English) character. This only happens
when typing text, not when typing Vim commands. This avoids having to switch
between two keyboard settings.
+{only available when compiled with the |+keymap| feature}
The value of the 'keymap' option specifies a keymap file to use. The name of
this file is one of these two:
- keymap/{keymap}_{encoding}.vim
+ keymap/{keymap}_utf-8.vim
keymap/{keymap}.vim
-Here {keymap} is the value of the 'keymap' option and {encoding} of the
-'encoding' option. The file name with the {encoding} included is tried first.
+Here {keymap} is the value of the 'keymap' option.
+The file name with "utf-8" included is tried first.
'runtimepath' is used to find these files. To see an overview of all
available keymap files, use this: >
@@ -916,7 +834,7 @@ keyboards and encodings.
The actual mappings are in the lines below "loadkeymap". In the example "a"
is mapped to "A" and "b" to "B". Thus the first item is mapped to the second
item. This is done for each line, until the end of the file.
-These items are exactly the same as what can be used in a |:lnoremap| command,
+These items are exactly the same as what can be used in a |:lmap| command,
using "<buffer>" to make the mappings local to the buffer.
You can check the result with this command: >
:lmap
@@ -931,8 +849,9 @@ Since Vim doesn't know if the next character after a quote is really an "a",
it will wait for the next character. To be able to insert a single quote,
also add this line: >
'' '
-Since the mapping is defined with |:lnoremap| the resulting quote will not be
-used for the start of another character.
+Since the mapping is defined with |:lmap| the resulting quote will not be
+used for the start of another character defined in the 'keymap'.
+It can be used in a standard |:imap| mapping.
The "accents" keymap uses this. *keymap-accents*
The first column can also be in |<>| form:
@@ -950,7 +869,7 @@ this is unusual. But you can use various ways to specify the character: >
A <char-0141> octal value
x <Space> special key name
-The characters are assumed to be encoded for the current value of 'encoding'.
+The characters are assumed to be encoded in UTF-8.
It's possible to use ":scriptencoding" when all characters are given
literally. That doesn't work when using the <char-> construct, because the
conversion is done on the keymap file, not on the resulting character.
@@ -1100,7 +1019,7 @@ Combining forms:
๏ญ 0xfb4f Xal alef-lamed
==============================================================================
-10. Using UTF-8 *mbyte-utf8* *UTF-8* *utf-8* *utf8*
+Using UTF-8 *mbyte-utf8* *UTF-8* *utf-8* *utf8*
*Unicode* *unicode*
The Unicode character set was designed to include all characters from other
character sets. Therefore it is possible to write text in any language using
@@ -1140,8 +1059,7 @@ widespread as file format.
A composing or combining character is used to change the meaning of the
character before it. The combining characters are drawn on top of the
preceding character.
-Up to two combining characters can be used by default. This can be changed
-with the 'maxcombine' option.
+Up to six combining characters can be displayed.
When editing text a composing character is mostly considered part of the
preceding character. For example "x" will delete a character and its
following composing characters by default.
@@ -1170,21 +1088,13 @@ Useful commands:
message is truncated, use ":messages").
- "g8" shows the bytes used in a UTF-8 character, also the composing
characters, as hex numbers.
-- ":set encoding=utf-8 fileencodings=" forces using UTF-8 for all files. The
- default is to use the current locale for 'encoding' and set 'fileencodings'
- to automatically detect the encoding of a file.
+- ":set fileencodings=" forces using UTF-8 for all files. The
+ default is to automatically detect the encoding of a file.
STARTING VIM
-If your current locale is in an utf-8 encoding, Vim will automatically start
-in utf-8 mode.
-
-If you are using another locale: >
-
- set encoding=utf-8
-
-You might also want to select the font used for the menus. Unfortunately this
+You might want to select the font used for the menus. Unfortunately this
doesn't always work. See the system specific remarks below, and 'langmenu'.
@@ -1240,15 +1150,14 @@ not everybody is able to type a composing character.
==============================================================================
-11. Overview of options *mbyte-options*
+Overview of options *mbyte-options*
These options are relevant for editing multi-byte files. Check the help in
options.txt for detailed information.
-'encoding' Encoding used for the keyboard and display. It is also the
- default encoding for files.
+'encoding' Internal text encoding, always "utf-8".
-'fileencoding' Encoding of a file. When it's different from 'encoding'
+'fileencoding' Encoding of a file. When it's different from "utf-8"
conversion is done when reading or writing the file.
'fileencodings' List of possible encodings of a file. When opening a file
@@ -1276,4 +1185,4 @@ Contributions specifically for the multi-byte features by:
Taro Muraoka <koron@tka.att.ne.jp>
Yasuhiro Matsumoto <mattn@mail.goo.ne.jp>
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/message.txt b/runtime/doc/message.txt
index 7ceddeb674..a46648119e 100644
--- a/runtime/doc/message.txt
+++ b/runtime/doc/message.txt
@@ -1,4 +1,4 @@
-*message.txt* For Vim version 7.4. Last change: 2016 Feb 27
+*message.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -8,9 +8,7 @@ This file contains an alphabetical list of messages and error messages that
Vim produces. You can use this if you don't understand what the message
means. It is not complete though.
-1. Old messages |:messages|
-2. Error messages |error-messages|
-3. Messages |messages|
+ Type |gO| to see the table of contents.
==============================================================================
1. Old messages *:messages* *:mes* *message-history*
@@ -19,6 +17,15 @@ The ":messages" command can be used to view previously given messages. This
is especially useful when messages have been overwritten or truncated. This
depends on the 'shortmess' option.
+ :messages Show all messages.
+
+ :{count}messages Show the {count} most recent messages.
+
+ :messages clear Clear all messages.
+
+ :{count}messages clear Clear messages, keeping only the {count} most
+ recent ones.
+
The number of remembered messages is fixed at 20 for the tiny version and 200
for other versions.
@@ -30,10 +37,7 @@ back.
Note: If the output has been stopped with "q" at the more prompt, it will only
be displayed up to this point.
The previous command output is cleared when another command produces output.
-
-If you are using translated messages, the first printed line tells who
-maintains the messages or the translations. You can use this to contact the
-maintainer when you spot a mistake.
+The "g<" output is not redirected.
If you want to find help on a specific (error) message, use the ID at the
start of the message. For example, to get help on the message: >
@@ -58,14 +62,14 @@ If you are lazy, it also works without the shift key: >
When an error message is displayed, but it is removed before you could read
it, you can see it again with: >
:echo errmsg
-or view a list of recent messages with: >
+Or view a list of recent messages with: >
:messages
-
+See `:messages` above.
LIST OF MESSAGES
*E222* *E228* *E232* *E256* *E293* *E298* *E304* *E317*
*E318* *E356* *E438* *E439* *E440* *E316* *E320* *E322*
- *E323* *E341* *E473* *E570* *E685* >
+ *E323* *E341* *E473* *E570* *E685* *E950* >
Add to read buffer
makemap: Illegal mode
Cannot create BalloonEval with both message and callback
@@ -86,6 +90,7 @@ LIST OF MESSAGES
Internal error
Internal error: {function}
fatal error in cs_manage_matches
+ Invalid count for del_bytes(): {N}
This is an internal error. If you can reproduce it, please send in a bug
report. |bugs|
@@ -118,8 +123,9 @@ closed properly. Mostly harmless.
Command too recursive
This happens when an Ex command executes an Ex command that executes an Ex
-command, etc. This is only allowed 200 times. When it's more there probably
-is an endless loop. Probably a |:execute| or |:source| command is involved.
+command, etc. The limit is 200 or the value of 'maxfuncdepth', whatever is
+larger. When it's more there probably is an endless loop. Probably a
+|:execute| or |:source| command is involved.
*E254* >
Cannot allocate color {name}
@@ -444,12 +450,6 @@ changed. To avoid the message reset the 'warn' option.
Something inside Vim went wrong and resulted in a NULL pointer. If you know
how to reproduce this problem, please report it. |bugs|
- *E172* >
- Only one file name allowed
-
-The ":edit" command only accepts one file name. When you want to specify
-several files for editing use ":next" |:next|.
-
*E41* *E82* *E83* *E342* >
Out of memory!
Out of memory! (allocating {number} bytes)
@@ -514,15 +514,6 @@ command. The script can then again read another script. This can continue
for about 14 levels. When more nesting is done, Vim assumes that there is a
recursive loop somewhere and stops with this error message.
- *E319* >
- The command is not available in this version
-
-You have used a command that is not present in the version of Vim you are
-using. When compiling Vim, many different features can be enabled or
-disabled. This depends on how big Vim has chosen to be and the operating
-system. See |+feature-list| for when which feature is available. The
-|:version| command shows which feature Vim was compiled with.
-
*E300* >
Swap file already exists (symlink attack?)
@@ -626,6 +617,9 @@ starts. It can be fixed in one of these ways:
- Just write the file again the next day. Or set your clock to the next day,
write the file twice and set the clock back.
+If you get W11 all the time, you may need to disable "Acronis Active
+Protection" or register Vim as a trusted service/application.
+
*W12* >
Warning: File "{filename}" has changed and the buffer was changed in Vim as well
@@ -656,6 +650,12 @@ You must be using an awful lot of buffers. It's now possible that two buffers
have the same number, which causes various problems. You might want to exit
Vim and restart it.
+ *E931* >
+ Buffer cannot be registered
+
+Out of memory or a duplicate buffer number. May happen after W14. Looking up
+a buffer will not always work, better restart Vim.
+
*E296* *E297* >
Seek error in swap file write
Write error in swap file
@@ -739,6 +739,13 @@ a user-defined command.
You tried to set an option after startup that only allows changes during
startup.
+ *E943* >
+ Command table needs to be updated, run 'make cmdidxs'
+
+This can only happen when changing the source code, when adding a command in
+src/ex_cmds.h. The lookup table then needs to be updated, by running: >
+ make cmdidxs
+
==============================================================================
3. Messages *messages*
@@ -828,4 +835,4 @@ The |g<| command can be used to see the last page of previous command output.
This is especially useful if you accidentally typed <Space> at the hit-enter
prompt.
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/mlang.txt b/runtime/doc/mlang.txt
index a2be3cfd49..a19d9fd2f4 100644
--- a/runtime/doc/mlang.txt
+++ b/runtime/doc/mlang.txt
@@ -1,4 +1,4 @@
-*mlang.txt* For Vim version 7.4. Last change: 2016 Jan 16
+*mlang.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -11,11 +11,7 @@ multi-byte text see |multibyte|.
The basics are explained in the user manual: |usr_45.txt|.
-1. Messages |multilang-messages|
-2. Menus |multilang-menus|
-3. Scripts |multilang-scripts|
-
-Also see |help-translated| for multi-language help.
+ Type |gO| to see the table of contents.
==============================================================================
1. Messages *multilang-messages*
@@ -176,6 +172,7 @@ Send an e-mail to the Vim maintainer <maintainer@vim.org>.
special characters like "&" and "<Tab>" need to be
included. Spaces and dots need to be escaped with a
backslash, just like in other |:menu| commands.
+ Case in {english} is ignored.
See the $VIMRUNTIME/lang directory for examples.
@@ -206,4 +203,4 @@ a message adapt to language preferences of the user, >
:endif
<
- vim:tw=78:sw=4:ts=8:ft=help:norl:
+ vim:tw=78:sw=4:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/motion.txt b/runtime/doc/motion.txt
index 7f84f2d2a3..84867318a4 100644
--- a/runtime/doc/motion.txt
+++ b/runtime/doc/motion.txt
@@ -1,4 +1,4 @@
-*motion.txt* For Vim version 7.4. Last change: 2015 Jun 06
+*motion.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -10,16 +10,6 @@ These commands move the cursor position. If the new position is off of the
screen, the screen is scrolled to show the cursor (see also 'scrolljump' and
'scrolloff' options).
-1. Motions and operators |operator|
-2. Left-right motions |left-right-motions|
-3. Up-down motions |up-down-motions|
-4. Word motions |word-motions|
-5. Text object motions |object-motions|
-6. Text object selection |object-select|
-7. Marks |mark-motions|
-8. Jumps |jump-motions|
-9. Various motions |various-motions|
-
General remarks:
If you want to know where you are in the file use the "CTRL-G" command
@@ -36,6 +26,8 @@ The 'virtualedit' option can be set to make it possible to move the cursor to
positions where there is no character or within a multi-column character (like
a tab).
+ Type |gO| to see the table of contents.
+
==============================================================================
1. Motions and operators *operator*
@@ -192,7 +184,7 @@ l or *l*
*$* *<End>* *<kEnd>*
$ or <End> To the end of the line. When a count is given also go
- [count - 1] lines downward |inclusive|.
+ [count - 1] lines downward. |inclusive| motion.
In Visual mode the cursor goes to just after the last
character in the line.
When 'virtualedit' is active, "$" may move the cursor
@@ -401,8 +393,7 @@ a range of folded lines. "b" and "B" move to the start of the first word or
WORD before the fold.
Special case: "cw" and "cW" are treated like "ce" and "cE" if the cursor is
-on a non-blank. This is because "cw" is interpreted as change-word, and a
-word does not include the following white space.
+on a non-blank. This is Vi-compatible, see |cpo-_| to change the behavior.
Another special case: When using the "w" motion in combination with an
operator and the last word moved over is at the end of a line, the end of
@@ -569,7 +560,7 @@ i[ "inner [] block", select [count] '[' ']' blocks. This
When used in Visual mode it is made characterwise.
a) *v_a)* *a)* *a(*
-a( *v_ab* *v_a(* *ab*
+a( *vab* *v_ab* *v_a(* *ab*
ab "a block", select [count] blocks, from "[count] [(" to
the matching ')', including the '(' and ')' (see
|[(|). Does not include white space outside of the
@@ -577,7 +568,7 @@ ab "a block", select [count] blocks, from "[count] [(" to
When used in Visual mode it is made characterwise.
i) *v_i)* *i)* *i(*
-i( *v_ib* *v_i(* *ib*
+i( *vib* *v_ib* *v_i(* *ib*
ib "inner block", select [count] blocks, from "[count] [("
to the matching ')', excluding the '(' and ')' (see
|[(|).
@@ -770,9 +761,8 @@ g'{mark} g`{mark}
Jump to the {mark}, but don't change the jumplist when
jumping within the current buffer. Example: >
g`"
-< jumps to the last known position in a file. See
- $VIMRUNTIME/vimrc_example.vim.
- Also see |:keepjumps|.
+< jumps to the last known position in a file.
+ See also |:keepjumps|.
*:marks*
:marks List all the current marks (not a motion command).
@@ -895,6 +885,7 @@ was made yet in the current file.
then the position can be near the end of what the
command changed. For example when inserting a word,
the position will be on the last character.
+ To jump to older changes use |g;|.
*'(* *`(*
'( `( To the start of the current sentence, like the |(|
@@ -995,12 +986,13 @@ These commands are not marks themselves, but jump to a mark:
==============================================================================
8. Jumps *jump-motions*
-A "jump" is one of the following commands: "'", "`", "G", "/", "?", "n",
-"N", "%", "(", ")", "[[", "]]", "{", "}", ":s", ":tag", "L", "M", "H" and
-the commands that start editing a new file. If you make the cursor "jump"
-with one of these commands, the position of the cursor before the jump is
+A "jump" is a command that normally moves the cursor several lines away. If
+you make the cursor "jump" the position of the cursor before the jump is
remembered. You can return to that position with the "''" and "``" command,
-unless the line containing that position was changed or deleted.
+unless the line containing that position was changed or deleted. The
+following commands are "jump" commands: "'", "`", "G", "/", "?", "n", "N",
+"%", "(", ")", "[[", "]]", "{", "}", ":s", ":tag", "L", "M", "H" and the
+commands that start editing a new file.
*CTRL-O*
CTRL-O Go to [count] Older cursor position in jump list
@@ -1013,6 +1005,9 @@ CTRL-I Go to [count] newer cursor position in jump list
*:ju* *:jumps*
:ju[mps] Print the jump list (not a motion command).
+ *:cle* *:clearjumps*
+:cle[arjumps] Clear the jump list of the current window.
+
*jumplist*
Jumps are remembered in a jump list. With the CTRL-O and CTRL-I command you
can go to cursor positions before older jumps, and back again. Thus you can
@@ -1123,7 +1118,7 @@ remembered.
*:changes*
:changes Print the change list. A ">" character indicates the
current position. Just after a change it is below the
- newest entry, indicating that "g;" takes you to the
+ newest entry, indicating that `g;` takes you to the
newest entry position. The first column indicates the
count needed to take you to this position. Example:
@@ -1133,8 +1128,8 @@ remembered.
1 14 54 the latest changed line
>
- The "3g;" command takes you to line 9. Then the
- output of ":changes is:
+ The `3g;` command takes you to line 9. Then the
+ output of `:changes` is:
change line col text ~
> 0 9 8 bla bla bla
@@ -1277,7 +1272,10 @@ the current line is included. You can then use "%" to go to the matching line.
H To line [count] from top (Home) of window (default:
first line on the window) on the first non-blank
character |linewise|. See also 'startofline' option.
- Cursor is adjusted for 'scrolloff' option.
+ Cursor is adjusted for 'scrolloff' option, unless an
+ operator is pending, in which case the text may
+ scroll. E.g. "yH" yanks from the first visible line
+ until the cursor line (inclusive).
*M*
M To Middle line of window, on the first non-blank
@@ -1287,11 +1285,14 @@ M To Middle line of window, on the first non-blank
L To line [count] from bottom of window (default: Last
line on the window) on the first non-blank character
|linewise|. See also 'startofline' option.
- Cursor is adjusted for 'scrolloff' option.
+ Cursor is adjusted for 'scrolloff' option, unless an
+ operator is pending, in which case the text may
+ scroll. E.g. "yL" yanks from the cursor to the last
+ visible line.
<LeftMouse> Moves to the position on the screen where the mouse
click is |exclusive|. See also |<LeftMouse>|. If the
position is in a status line, that window is made the
active window and the cursor is not moved.
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/msgpack_rpc.txt b/runtime/doc/msgpack_rpc.txt
index cfd9084cfc..862aa7b750 100644
--- a/runtime/doc/msgpack_rpc.txt
+++ b/runtime/doc/msgpack_rpc.txt
@@ -1,4 +1,3 @@
-*msgpack_rpc.txt* {Nvim}
NVIM REFERENCE MANUAL by Thiago de Arruda
@@ -6,12 +5,7 @@
RPC API for Nvim *RPC* *rpc* *msgpack-rpc*
-1. Introduction |rpc-intro|
-2. API mapping |rpc-api|
-3. Connecting |rpc-connecting|
-4. Clients |rpc-api-client|
-5. Types |rpc-types|
-6. Vimscript functions |rpc-vim-functions|
+ Type |gO| to see the table of contents.
==============================================================================
1. Introduction *rpc-intro*
@@ -33,7 +27,7 @@ programs can:
The RPC API is like a more powerful version of Vim's `clientserver` feature.
==============================================================================
- 2. API mapping *rpc-api*
+2. API mapping *rpc-api*
The Nvim C |API| is automatically exposed to the RPC API by the build system,
which parses headers at src/nvim/api/*. A dispatch function is generated which
@@ -47,7 +41,7 @@ instance.
There are three ways to obtain API metadata:
- 1. Connect to a running Nvim instance and call `vim_get_api_info` via
+ 1. Connect to a running Nvim instance and call `nvim_get_api_info` via
msgpack-rpc. This is best for clients written in dynamic languages which
can define functions at runtime.
@@ -66,20 +60,20 @@ To get a formatted dump of the API using python (requires the `pyyaml` and
==============================================================================
3. Connecting *rpc-connecting*
-There are several ways to open a msgpack-rpc stream to an Nvim server:
+See |channel-intro|, for various ways to open a channel. Most of the channel
+opening functions take an `rpc` key in the options dictionary, to enable RPC.
- 1. Through stdin/stdout when `nvim` is started with `--embed`. This is how
- applications can embed Nvim.
+Additionally, RPC channels can be opened by other processes connecting to
+TCP/IP sockets or named pipes listened to by nvim.
- 2. Through stdin/stdout of some other process spawned by |rpcstart()|.
+Nvim creates a default RPC socket at |startup|, given by |v:servername|. To
+start with a TCP/IP socket instead, use |--listen| with a TCP-style address: >
+ nvim --listen 127.0.0.1:6666
+Additional sockets and named pipes can be started with |serverstart()|.
- 3. Through the socket automatically created with each instance. The socket
- location is stored in |v:servername|.
+Note that localhost TCP sockets are generally less secure than named pipes,
+and can lead to vunerabilities like remote code execution.
- 4. Through a TCP/IP socket. To make Nvim listen on a TCP/IP socket, set the
- |$NVIM_LISTEN_ADDRESS| environment variable before starting Nvim: >
- NVIM_LISTEN_ADDRESS=127.0.0.1:6666 nvim
-<
Connecting to the socket is the easiest way a programmer can test the API,
which can be done through any msgpack-rpc client library or full-featured
|api-client|. Here's a Ruby script that prints 'hello world!' in the current
@@ -101,7 +95,7 @@ Nvim instance:
require 'msgpack/rpc/transport/unix'
nvim = MessagePack::RPC::Client.new(MessagePack::RPC::UNIXTransport.new, ENV['NVIM_LISTEN_ADDRESS'])
- result = nvim.call(:vim_command, 'echo "hello world!"')
+ result = nvim.call(:nvim_command, 'echo "hello world!"')
<
A better way is to use the Python REPL with the `neovim` package, where API
functions can be called interactively:
@@ -110,26 +104,26 @@ functions can be called interactively:
>>> nvim = attach('socket', path='[address]')
>>> nvim.command('echo "hello world!"')
<
-You can also embed an Nvim instance via |rpcstart()|
+You can also embed an Nvim instance via |jobstart()|, and communicate using
+|rpcrequest()| and |rpcnotify()|:
>
- let vim = rpcstart('nvim', ['--embed'])
- echo rpcrequest(vim, 'vim_eval', '"Hello " . "world!"')
- call rpcstop(vim)
+ let nvim = jobstart(['nvim', '--embed'], {'rpc': v:true})
+ echo rpcrequest(nvim, 'nvim_eval', '"Hello " . "world!"')
+ call jobstop(nvim)
<
==============================================================================
4. Implementing API clients *rpc-api-client* *api-client*
-All external UIs and remote plugins (as opposed to regular Vim plugins) are
-"clients" in general; but we call something an "API client" if its purpose is
-to abstract or wrap the RPC API for the convenience of other applications
-(just like a REST client or SDK such as boto3 for AWS: you can speak AWS REST
-using an HTTP client like curl, but boto3 wraps that in a convenient python
-interface). For example, the lua-client is an API client:
- https://github.com/neovim/lua-client
-
-The Python client (pip package "neovim") is the reference implementation of an
-API client. It is always up-to-date with the Nvim API, so its source code and
-test suite are an authoritative reference.
+"API clients" wrap the Nvim API to provide idiomatic "SDKs" for their
+respective platforms (see |dev-jargon|). You can build a new API client for
+your favorite platform or programming language.
+
+Existing API clients are listed here:
+ https://github.com/neovim/neovim/wiki/Related-projects#api-clients
+
+The Python client is the reference implementation for API clients. It is
+always up-to-date with the Nvim API, so its source code and test suite are
+authoritative references.
https://github.com/neovim/python-client
API client implementation guidelines ~
@@ -164,6 +158,8 @@ API metadata object ~
API clients exist to hide msgpack-rpc details. The API metadata object
contains information that makes this task easier (see also |rpc-types|):
+ - The "version" key contains the Nvim version, API level, and API
+ backwards-compatibility level.
- The "functions" key contains a list of metadata objects for individual
functions.
- Each function metadata object has |rpc-types| information about the return
@@ -172,24 +168,29 @@ contains information that makes this task easier (see also |rpc-types|):
- Container types may be decorated with type/size constraints, e.g.
ArrayOf(Buffer) or ArrayOf(Integer, 2). This can be useful to generate
even more strongly-typed APIs.
- - Methods that operate on instances of Nvim special types (msgpack EXT) are
- prefixed with the type name in lower case, e.g. `buffer_get_line`
- represents the `get_line` method of a Buffer instance.
- - Global methods are prefixed with `vim`, e.g. `vim_get_buffers`.
+ - Functions that are considered to be methods that operate on instances of
+ Nvim special types (msgpack EXT) will have the `"method"` attribute set to
+ `true`. The receiver type is the type of the first argument. The method
+ names are prefixed with `nvim_` plus a shortened type name, e.g.
+ `nvim_buf_get_lines` represents the `get_lines` method of a Buffer instance.
+ - Global functions have `"method"` set to `false` and are prefixed with just
+ `nvim_`, e.g. `nvim_get_buffers`.
So for an object-oriented language, an API client contains the classes
representing Nvim special types, and the methods of each class could be
-defined by inspecting the method name prefix. There could also be a singleton
-Vim class with methods mapped to functions prefixed with `vim_`.
+defined by stripping the prefix for the type as defined in the `types` metadata
+(this will always be the first two "_"-separated parts of the function name).
+There could also be a singleton Vim class with methods where the `nvim_`
+prefix is stripped off.
==============================================================================
5. Types *rpc-types*
The Nvim C API uses custom types for all functions. |api-types|
-For the purpose of mapping to msgpack, the types can be split into two groups:
+At the RPC layer, types form two groups:
- - Basic types that map natively to msgpack (and probably have a default
- representation in msgpack-supported programming languages)
+ - Basic types that map natively to msgpack (and have a default
+ representation in most msgpack-supported programming languages)
- Special Nvim types that map to msgpack EXT with custom type codes.
Basic types ~
@@ -202,54 +203,41 @@ Basic types ~
Array -> msgpack array
Dictionary -> msgpack map
+ Note: in function calls, empty Array is accepted for Dictionary parameter.
+
Special types (msgpack EXT) ~
Buffer -> enum value kObjectTypeBuffer
Window -> enum value kObjectTypeWindow
Tabpage -> enum value kObjectTypeTabpage
-An API method expecting one of these types may be passed an integer instead,
-although they are not interchangeable. For example, a Buffer may be passed as
-an integer, but not a Window or Tabpage.
+API functions expecting one of the special EXT types may be passed an integer
+instead, but not another EXT type. E.g. Buffer may be passed as an integer but
+not as a Window or Tabpage. The EXT object data is the object id encoded as
+a msgpack integer: For buffers this is the |bufnr()| and for windows the
+|window-ID|. For tabpages the id is an internal handle, not the tabpage
+number.
+
+To determine the type codes of the special EXT types, inspect the `types` key
+of the |api-metadata| at runtime. Example JSON representation: >
-The most reliable way of determining the type codes for the special Nvim types
-is to inspect the `types` key of metadata dictionary returned by the
-`vim_get_api_info` method at runtime. Here's a sample JSON representation of
-the `types` object:
->
"types": {
"Buffer": {
- "id": 0
+ "id": 0,
+ "prefix": "nvim_buf_"
},
"Window": {
- "id": 1
+ "id": 1,
+ "prefix": "nvim_win_"
},
"Tabpage": {
- "id": 2
+ "id": 2,
+ "prefix": "nvim_tabpage_"
}
}
-<
+
Even for statically compiled clients it is good practice to avoid hardcoding
the type codes, because a client may be built against one Nvim version but
connect to another with different type codes.
-==============================================================================
-6. Vimscript functions *rpc-vim-functions*
-
-RPC functions are available in Vimscript:
-
- 1. |rpcstart()|: Similarly to |jobstart()|, this will spawn a co-process
- with its standard handles connected to Nvim. The difference is that it's
- not possible to process raw data to or from the process's stdin, stdout,
- or stderr. This is because the job's stdin and stdout are used as
- a single msgpack channel that is processed directly by Nvim.
- 2. |rpcstop()|: Same as |jobstop()|, but operates on handles returned by
- |rpcstart()|.
- 3. |rpcrequest()|: Sends a msgpack-rpc request to the process.
- 4. |rpcnotify()|: Sends a msgpack-rpc notification to the process.
-
-|rpcrequest()| and |rpcnotify()| can also be used with channels connected to
-a nvim server. |v:servername|
-
-==============================================================================
- vim:tw=78:ts=8:noet:ft=help:norl:
+ vim:tw=78:ts=8:ft=help:norl:
diff --git a/runtime/doc/nvim.txt b/runtime/doc/nvim.txt
index 904fb3c16c..07eb48aea3 100644
--- a/runtime/doc/nvim.txt
+++ b/runtime/doc/nvim.txt
@@ -1,32 +1,45 @@
-*nvim.txt* {Nvim}
+*nvim.txt* Nvim
NVIM REFERENCE MANUAL
-Nvim *nvim* *nvim-intro*
+Nvim *nvim* *nvim-intro*
-If you are new to Vim (and Nvim) see |help.txt| or type ":Tutor".
-If you already use Vim (but not Nvim) see |nvim-from-vim| for a quickstart.
+Nvim is based on Vim by Bram Moolenaar.
+
+If you are new to Vim, try the 30-minute tutorial: >
+ :Tutor<Enter>
+
+If you already use Vim see |nvim-from-vim| for a quickstart.
Nvim is emphatically a fork of Vim, not a clone: compatibility with Vim is
maintained where possible. See |vim_diff.txt| for the complete reference of
differences from Vim.
+ Type |gO| to see the table of contents.
+
==============================================================================
Transitioning from Vim *nvim-from-vim*
-To start the transition, link your previous configuration so Nvim can use it:
->
- mkdir -p ${XDG_CONFIG_HOME:=$HOME/.config}
- ln -s ~/.vim $XDG_CONFIG_HOME/nvim
- ln -s ~/.vimrc $XDG_CONFIG_HOME/nvim/init.vim
-<
+1. To start the transition, create your |init.vim| (user config) file: >
+
+ :call mkdir(stdpath('config'), 'p')
+ :exe 'edit '.stdpath('config').'/init.vim'
+
+2. Add these contents to the file: >
+
+ set runtimepath^=~/.vim runtimepath+=~/.vim/after
+ let &packpath = &runtimepath
+ source ~/.vimrc
+
+3. Restart Nvim, your existing Vim config will be loaded.
+
See |provider-python| and |provider-clipboard| for additional software you
might need to use some features.
-Your Vim configuration might not be entirely compatible with Nvim. For a
-full list of differences between Vim and Nvim see |vim-differences|.
+Your Vim configuration might not be entirely Nvim-compatible.
+See |vim-differences| for the full list of changes.
The |'ttymouse'| option, for example, was removed from Nvim (mouse support
should work without it). If you use the same |vimrc| for Vim and Nvim,
diff --git a/runtime/doc/nvim_terminal_emulator.txt b/runtime/doc/nvim_terminal_emulator.txt
index 4296ef6490..cdcb61404f 100644
--- a/runtime/doc/nvim_terminal_emulator.txt
+++ b/runtime/doc/nvim_terminal_emulator.txt
@@ -1,30 +1,27 @@
-*terminal_emulator.txt* {Nvim}
+*terminal_emulator.txt* Nvim
NVIM REFERENCE MANUAL by Thiago de Arruda
-Embedded terminal emulator *terminal-emulator*
+Terminal emulator *terminal* *terminal-emulator*
-1. Introduction |terminal-emulator-intro|
-2. Spawning |terminal-emulator-spawning|
-3. Input |terminal-emulator-input|
-4. Configuration |terminal-emulator-configuration|
+Nvim embeds a VT220/xterm terminal emulator based on libvterm. The terminal is
+presented as a special buffer type, asynchronously updated from the virtual
+terminal as data is received from the program connected to it.
-==============================================================================
-1. Introduction *terminal-emulator-intro*
-
-Nvim offers a mostly complete VT220/xterm terminal emulator. The terminal is
-presented as a special buffer type, asynchronously updated to mirror the
-virtual terminal display as data is received from the program connected to it.
-For most purposes, terminal buffers behave a lot like normal buffers with
-'nomodifiable' set.
+Terminal buffers behave like normal buffers, except:
+- With 'modifiable', lines can be edited but not deleted.
+- 'scrollback' controls how many lines are kept.
+- Output is followed if the cursor is on the last line.
+- 'modified' is the default. You can set 'nomodified' to avoid a warning when
+ closing the terminal buffer.
+- 'bufhidden' defaults to "hide".
-The implementation is powered by libvterm, a powerful abstract terminal
-emulation library. http://www.leonerd.org.uk/code/libvterm/
+ Type |gO| to see the table of contents.
==============================================================================
-2. Spawning *terminal-emulator-spawning*
+Start *terminal-start*
There are 3 ways to create a terminal buffer:
@@ -39,48 +36,44 @@ There are 3 ways to create a terminal buffer:
Note: The "term://" pattern is handled by a BufReadCmd handler, so the
|autocmd-nested| modifier is required to use it in an autocmd. >
autocmd VimEnter * nested split term://sh
-< This is only mentioned for reference; you should use the |:terminal|
- command instead.
+< This is only mentioned for reference; use |:terminal| instead.
-When the terminal spawns the program, the buffer will start to mirror the
-terminal display and change its name to `term://$CWD//$PID:$COMMAND`.
-Note that |:mksession| will "save" the terminal buffers by restarting all
-programs when the session is restored.
+When the terminal starts, the buffer contents are updated and the buffer is
+named in the form of `term://{cwd}//{pid}:{cmd}`. This naming scheme is used
+by |:mksession| to restore a terminal buffer (by restarting the {cmd}).
==============================================================================
-3. Input *terminal-emulator-input*
-
-Sending input is possible by entering terminal mode, which is achieved by
-pressing any key that would enter insert mode in a normal buffer (|i| or |a|
-for example). The |:terminal| ex command will automatically enter terminal
-mode once it's spawned. While in terminal mode, Nvim will forward all keys to
-the underlying program. The only exception is the <C-\><C-n> key combo,
-which will exit back to normal mode.
-
-Terminal mode has its own namespace for mappings, which is accessed with the
-"t" prefix. It's possible to use terminal mappings to customize interaction
-with the terminal. For example, here's how to map <Esc> to exit terminal mode:
->
+Input *terminal-input*
+
+To send input, enter |Terminal-mode| using any command that would enter "insert
+mode" in a normal buffer, such as |i| or |:startinsert|. In this mode all keys
+except <C-\><C-N> are sent to the underlying program. Use <C-\><C-N> to return
+to normal-mode. |CTRL-\_CTRL-N|
+
+Terminal-mode has its own |:tnoremap| namespace for mappings, this can be used
+to automate any terminal interaction.
+
+To map <Esc> to exit terminal-mode: >
:tnoremap <Esc> <C-\><C-n>
-<
-Navigating to other windows is only possible by exiting to normal mode, which
-can be cumbersome with <C-\><C-n> keys. To improve the navigation experience,
-you could use the following mappings:
->
- :tnoremap <A-h> <C-\><C-n><C-w>h
- :tnoremap <A-j> <C-\><C-n><C-w>j
- :tnoremap <A-k> <C-\><C-n><C-w>k
- :tnoremap <A-l> <C-\><C-n><C-w>l
+
+To simulate |i_CTRL-R| in terminal-mode: >
+ :tnoremap <expr> <C-R> '<C-\><C-N>"'.nr2char(getchar()).'pi'
+
+To use `ALT+{h,j,k,l}` to navigate windows from any mode: >
+ :tnoremap <A-h> <C-\><C-N><C-w>h
+ :tnoremap <A-j> <C-\><C-N><C-w>j
+ :tnoremap <A-k> <C-\><C-N><C-w>k
+ :tnoremap <A-l> <C-\><C-N><C-w>l
+ :inoremap <A-h> <C-\><C-N><C-w>h
+ :inoremap <A-j> <C-\><C-N><C-w>j
+ :inoremap <A-k> <C-\><C-N><C-w>k
+ :inoremap <A-l> <C-\><C-N><C-w>l
:nnoremap <A-h> <C-w>h
:nnoremap <A-j> <C-w>j
:nnoremap <A-k> <C-w>k
:nnoremap <A-l> <C-w>l
-<
-This configuration allows using `Alt+{h,j,k,l}` to navigate between windows no
-matter if they are displaying a normal buffer or a terminal buffer in terminal
-mode.
-Mouse input is also fully supported, and has the following behavior:
+Mouse input has the following behavior:
- If the program has enabled mouse events, the corresponding events will be
forwarded to the program.
@@ -92,25 +85,43 @@ Mouse input is also fully supported, and has the following behavior:
the terminal wont lose focus and the hovered window will be scrolled.
==============================================================================
-4. Configuration *terminal-emulator-configuration*
+Configuration *terminal-configuration*
+
+Options: 'modified', 'scrollback'
+Events: |TermOpen|, |TermClose|
+Highlight groups: |hl-TermCursor|, |hl-TermCursorNC|
+
+Terminal sets local defaults for some options, which may differ from your
+global configuration.
-Terminal buffers can be customized through the following global/buffer-local
-variables (set via the |TermOpen| autocmd):
+- 'list' is disabled
+- 'wrap' is disabled
-- `{g,b}:terminal_scrollback_buffer_size`: Scrollback buffer size, between 1
- and 100000 inclusive. The default is 1000.
-- `{g,b}:terminal_color_$NUM`: The terminal color palette, where `$NUM` is the
- color index, between 0 and 255 inclusive. This setting only affects UIs with
- RGB capabilities; for normal terminals the color index is simply forwarded.
+You can change the defaults with a TermOpen autocommand: >
+ au TermOpen * setlocal list
-The configuration variables are only processed when the terminal starts, which
-is why it needs to be done with the |TermOpen| autocmd or setting global
-variables before the terminal is started.
+TERMINAL COLORS ~
-There is also a corresponding |TermClose| event.
+The `{g,b}:terminal_color_$NUM` variables control the terminal color palette,
+where `$NUM` is the color index between 0 and 255 inclusive. This setting only
+affects UIs with RGB capabilities; for normal terminals the color index is
+just forwarded. The variables are read only during |TermOpen|.
-The terminal cursor can be highlighted via |hl-TermCursor| and
-|hl-TermCursorNC|.
+==============================================================================
+Status Variables *terminal-status*
+
+Terminal buffers maintain some information about the terminal in buffer-local
+variables:
+- *b:term_title* The settable title of the terminal, typically displayed in
+ the window title or tab title of a graphical terminal emulator. Programs
+ running in the terminal can set this title via an escape sequence.
+- |'channel'| The nvim channel ID for the underlying PTY.
+ |chansend()| can be used to send input to the terminal.
+
+These variables are initialized before TermOpen, so you can use them in
+a local 'statusline'. Example: >
+ :autocmd TermOpen * setlocal statusline=%{b:term_title}
+<
==============================================================================
vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index e00f27f9f0..bcefa1f56b 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -1,4 +1,4 @@
-*options.txt* For Vim version 7.4. Last change: 2016 Apr 12
+*options.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -6,11 +6,7 @@
Options *options*
-1. Setting options |set-option|
-2. Automatically setting options |auto-setting|
-3. Options summary |option-summary|
-
-For an overview of options see help.txt |option-list|.
+For an overview of options see quickref.txt |option-list|.
Vim has a number of internal variables and switches which can be set to
achieve special effects. These options come in three forms:
@@ -18,18 +14,15 @@ achieve special effects. These options come in three forms:
number has a numeric value
string has a string value
+ Type |gO| to see the table of contents.
+
==============================================================================
1. Setting options *set-option* *E764*
*:se* *:set*
:se[t] Show all options that differ from their default value.
-:se[t] all Show all but terminal options.
-
-:se[t] termcap Show all terminal options. Note that in the GUI the
- key codes are not shown, because they are generated
- internally and can't be changed. Changing the terminal
- codes in the GUI is not useful either...
+:se[t] all Show all options.
*E518* *E519*
:se[t] {option}? Show value of {option}.
@@ -52,7 +45,6 @@ achieve special effects. These options come in three forms:
:se[t] all& Set all options to their default value. The values of
these options are not changed:
'columns'
- 'encoding'
'lines'
Warning: This may have a lot of side effects.
@@ -108,17 +100,17 @@ and the following arguments will be ignored.
When 'verbose' is non-zero, displaying an option value will also tell where it
was last set. Example: >
:verbose set shiftwidth cindent?
-< shiftwidth=4 ~
- Last set from modeline ~
- cindent ~
- Last set from /usr/local/share/vim/vim60/ftplugin/c.vim ~
+< shiftwidth=4 ~
+ Last set from modeline line 1 ~
+ cindent ~
+ Last set from /usr/local/share/vim/vim60/ftplugin/c.vim line 30 ~
This is only done when specific option values are requested, not for ":verbose
set all" or ":verbose set" without an argument.
When the option was set by hand there is no "Last set" message.
When the option was set while executing a function, user command or
autocommand, the script in which it was defined is reported.
A few special texts:
- Last set from modeline ~
+ Last set from modeline line 1 ~
Option was set in a |modeline|.
Last set from --cmd argument ~
Option was set with command line argument |--cmd| or +.
@@ -131,39 +123,6 @@ A few special texts:
Last set from error handler ~
Option was cleared when evaluating it resulted in an error.
-{not available when compiled without the |+eval| feature}
-
- *:set-termcap* *E522*
-For {option} the form "t_xx" may be used to set a terminal option. This will
-override the value from the termcap. You can then use it in a mapping. If
-the "xx" part contains special characters, use the <t_xx> form: >
- :set <t_#4>=^[Ot
-This can also be used to translate a special code for a normal key. For
-example, if Alt-b produces <Esc>b, use this: >
- :set <M-b>=^[b
-(the ^[ is a real <Esc> here, use CTRL-V <Esc> to enter it)
-The advantage over a mapping is that it works in all situations.
-
-You can define any key codes, e.g.: >
- :set t_xy=^[foo;
-There is no warning for using a name that isn't recognized. You can map these
-codes as you like: >
- :map <t_xy> something
-< *E846*
-When a key code is not set, it's like it does not exist. Trying to get its
-value will result in an error: >
- :set t_kb=
- :set t_kb
- E846: Key code not set: t_kb
-
-The t_xx options cannot be set from a |modeline| or in the |sandbox|, for
-security reasons.
-
-The listing from ":set" looks different from Vi. Long string options are put
-at the end of the list. The number of options is quite large. The output of
-"set all" probably does not fit on the screen, causing Vim to give the
-|more-prompt|.
-
*option-backslash*
To include white space in a string option value it has to be preceded with a
backslash. To include a backslash you have to use two. Effectively this
@@ -228,7 +187,7 @@ opt+=val" the expansion is done before the adding or removing.
Handling of local options *local-options*
Some of the options only apply to a window or buffer. Each window or buffer
-has its own copy of this option, thus can each have their own value. This
+has its own copy of this option, thus each can have its own value. This
allows you to set 'list' in one window but not in another. And set
'shiftwidth' to 3 in one buffer and 4 in another.
@@ -247,10 +206,10 @@ global value, which is used for new buffers. With ":set" both the local and
global value is changed. With "setlocal" only the local value is changed,
thus this value is not used when editing a new buffer.
-When editing a buffer that has been edited before, the last used window
-options are used again. If this buffer has been edited in this window, the
-values from back then are used. Otherwise the values from the window where
-the buffer was edited last are used.
+When editing a buffer that has been edited before, the options from the window
+that was last closed are used again. If this buffer has been edited in this
+window, the values from back then are used. Otherwise the values from the
+last closed window where the buffer was edited last are used.
It's possible to set a local window option specifically for a type of buffer.
When you edit another buffer in the same window, you don't want to keep
@@ -352,7 +311,7 @@ Note: In the future more global options can be made global-local. Using
Setting the filetype
-:setf[iletype] {filetype} *:setf* *:setfiletype*
+:setf[iletype] [FALLBACK] {filetype} *:setf* *:setfiletype*
Set the 'filetype' option to {filetype}, but only if
not done yet in a sequence of (nested) autocommands.
This is short for: >
@@ -363,6 +322,12 @@ Setting the filetype
setting the 'filetype' option twice, causing different
settings and syntax files to be loaded.
+ When the optional FALLBACK argument is present, a
+ later :setfiletype command will override the
+ 'filetype'. This is to used for filetype detections
+ that are just a guess. |did_filetype()| will return
+ false after this command.
+
*option-window* *optwin*
:bro[wse] se[t] *:set-browse* *:browse-set* *:opt* *:options*
:opt[ions] Open a window for viewing and setting all options.
@@ -389,30 +354,27 @@ On Unix systems the form "${HOME}" can be used too. The name between {} can
contain non-id characters then. Note that if you want to use this for the
"gf" command, you need to add the '{' and '}' characters to 'isfname'.
+NOTE: expanding environment variables and "~/" is only done with the ":set"
+command, not when assigning a value to an option with ":let".
+
+ *$HOME-windows*
On MS-Windows, if $HOME is not defined as an environment variable, then
at runtime Vim will set it to the expansion of $HOMEDRIVE$HOMEPATH.
+If $HOMEDRIVE is not set then $USERPROFILE is used.
-NOTE: expanding environment variables and "~/" is only done with the ":set"
-command, not when assigning a value to an option with ":let".
+This expanded value is not exported to the environment, this matters when
+running an external command: >
+ :echo system('set | findstr ^HOME=')
+and >
+ :echo luaeval('os.getenv("HOME")')
+should echo nothing (an empty string) despite exists('$HOME') being true.
+When setting $HOME to a non-empty string it will be exported to the
+subprocesses.
Note the maximum length of an expanded option is limited. How much depends on
the system, mostly it is something like 256 or 1024 characters.
- *Linux-backspace*
- Note about Linux: By default the backspace key
- produces CTRL-?, which is wrong. You can fix it by
- putting this line in your rc.local: >
- echo "keycode 14 = BackSpace" | loadkeys
-<
- *NetBSD-backspace*
- Note about NetBSD: If your backspace doesn't produce
- the right code, try this: >
- xmodmap -e "keycode 22 = BackSpace"
-< If this works, add this in your .Xmodmap file: >
- keysym 22 = BackSpace
-< You need to restart for this to take effect.
-
==============================================================================
2. Automatically setting options *auto-setting*
@@ -497,6 +459,7 @@ For example, to use a modeline only for Vim 7.0:
To use a modeline for Vim after version 7.2:
/* vim>702: set cole=2: */ ~
There can be no blanks between "vim" and the ":".
+The modeline is ignored if {vers} does not fit in an integer.
The number of lines that are checked can be set with the 'modelines' option.
@@ -612,9 +575,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'ambiwidth'* *'ambw'*
'ambiwidth' 'ambw' string (default: "single")
global
- {only available when compiled with the |+multi_byte|
- feature}
- Only effective when 'encoding' is "utf-8" or another Unicode encoding.
Tells Vim what to do with characters with East Asian Width Class
Ambiguous (such as Euro, Registered Sign, Copyright Sign, Greek
letters, Cyrillic letters).
@@ -643,14 +603,12 @@ A jump table for the options with a short description can be found at |Q_op|.
See Unicode Standard Annex #11 (http://www.unicode.org/reports/tr11).
Vim may set this option automatically at startup time when Vim is
- compiled with the |+termresponse| feature and if |t_u7| is set to the
+ compiled with the |+termresponse| feature and if t_u7 is set to the
escape sequence to request cursor position report.
*'autochdir'* *'acd'* *'noautochdir'* *'noacd'*
'autochdir' 'acd' boolean (default off)
global
- {only available when compiled with it, use
- exists("+autochdir") to check}
When on, Vim will change the current working directory whenever you
open a file, switch buffers, delete a buffer or open/close a window.
It will change to the directory containing the file which was opened
@@ -667,7 +625,6 @@ A jump table for the options with a short description can be found at |Q_op|.
- Set the 'keymap' option to "arabic"; in Insert mode CTRL-^ toggles
between typing English and Arabic key mapping.
- Set the 'delcombine' option
- Note that 'encoding' must be "utf-8" for working with Arabic text.
Resetting this option will:
- Reset the 'rightleft' option.
@@ -718,7 +675,9 @@ A jump table for the options with a short description can be found at |Q_op|.
global or local to buffer |global-local|
When a file has been detected to have been changed outside of Vim and
it has not been changed inside of Vim, automatically read it again.
- When the file has been deleted this is not done. |timestamp|
+ When the file has been deleted this is not done, so you have the text
+ from before it was deleted. When it appears again then it is read.
+ |timestamp|
If this option has a local value, use this command to switch back to
using the global value: >
:set autoread<
@@ -732,6 +691,8 @@ A jump table for the options with a short description can be found at |Q_op|.
'{A-Z0-9}, or `{A-Z0-9} command takes one to another file.
Note that for some commands the 'autowrite' option is not used, see
'autowriteall' for that.
+ Some buffers will not be written, specifically when 'buftype' is
+ "nowrite", "nofile", "terminal" or "prompt".
*'autowriteall'* *'awa'* *'noautowriteall'* *'noawa'*
'autowriteall' 'awa' boolean (default off)
@@ -742,47 +703,24 @@ A jump table for the options with a short description can be found at |Q_op|.
been set.
*'background'* *'bg'*
-'background' 'bg' string (default "dark" or "light", see below)
- global
- When set to "dark", Vim will try to use colors that look good on a
- dark background. When set to "light", Vim will try to use colors that
- look good on a light background. Any other value is illegal.
- Vim tries to set the default value according to the terminal used.
- This will not always be correct.
- Setting this option does not change the background color, it tells Vim
- what the background color looks like. For changing the background
- color, see |:hi-normal|.
-
- When 'background' is set Vim will adjust the default color groups for
- the new value. But the colors used for syntax highlighting will not
- change. *g:colors_name*
+'background' 'bg' string (default "dark")
+ global
+ When set to "dark" or "light", Nvim will adjust the default color
+ groups for a dark or light background, respectively.
+
+ This option does NOT change the background color, it tells Nvim what
+ the "inherited" (terminal/GUI) background looks like.
+ See |:hi-normal| if you want to set the background color explicitly.
+ *g:colors_name*
When a color scheme is loaded (the "g:colors_name" variable is set)
setting 'background' will cause the color scheme to be reloaded. If
the color scheme adjusts to the value of 'background' this will work.
However, if the color scheme sets 'background' itself the effect may
be undone. First delete the "g:colors_name" variable when needed.
- When setting 'background' to the default value with: >
- :set background&
-< Vim will guess the value. In the GUI this should work correctly,
- in other cases Vim might not be able to guess the right value.
-
- When starting the GUI, the default value for 'background' will be
- "light". When the value is not set in the gvimrc, and Vim detects
- that the background is actually quite dark, 'background' is set to
- "dark". But this happens only AFTER the gvimrc file has been read
- (because the window needs to be opened to find the actual background
- color). To get around this, force the GUI window to be opened by
- putting a ":gui" command in the gvimrc file, before where the value
- of 'background' is used (e.g., before ":syntax on").
-
- For Windows the default is "dark". "dark" should be used if $COLORFGBG
- suggests a dark background (not yet implemented). Otherwise the default
- is "light".
-
Normally this option would be set in the vimrc file. Possibly
depending on the terminal name. Example: >
- :if $TERM == "xterm"
+ :if $TERM ==# "xterm"
: set background=dark
:endif
< When this option is set, the default settings for the highlight groups
@@ -899,7 +837,7 @@ A jump table for the options with a short description can be found at |Q_op|.
- The backup file will be created in the first directory in the list
where this is possible. The directory must exist, Vim will not
create it for you.
- - Empty means that no backup file will be created ( 'patchmode' is
+ - Empty means that no backup file will be created ('patchmode' is
impossible!). Writing may fail because of this.
- A directory "." means to put the backup file in the same directory
as the edited file.
@@ -948,8 +886,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'backupskip'* *'bsk'*
'backupskip' 'bsk' string (default: "/tmp/*,$TMPDIR/*,$TMP/*,$TEMP/*")
global
- {not available when compiled without the |+wildignore|
- feature}
A list of file patterns. When one of the patterns matches with the
name of the file which is written, no backup file is created. Both
the specified file name and the full path name of the file are used.
@@ -972,16 +908,16 @@ A jump table for the options with a short description can be found at |Q_op|.
the newly created file). Also see 'backupcopy' and |crontab|.
*'balloondelay'* *'bdlay'*
-'balloondelay' 'bdlay' Removed. {Nvim}
+'balloondelay' 'bdlay' Removed.
*'ballooneval'* *'beval'* *'noballooneval'* *'nobeval'*
-'ballooneval' 'beval' Removed. {Nvim}
+'ballooneval' 'beval' Removed.
*'balloonexpr'* *'bexpr'*
-'balloonexpr' 'bexpr' Removed. {Nvim}
+'balloonexpr' 'bexpr' Removed.
*'belloff'* *'bo'*
-'belloff' 'bo' string (default "")
+'belloff' 'bo' string (default "all")
global
Specifies for which events the bell will not be rung. It is a comma
separated list of items. For each item that is present, the bell
@@ -1015,8 +951,8 @@ A jump table for the options with a short description can be found at |Q_op|.
wildmode More matches in |cmdline-completion| available
(depends on the 'wildmode' setting).
- This is most useful, to fine tune when in insert mode the bell should
- be rung. For normal mode and ex commands, the bell is often rung to
+ This is most useful to fine tune when in Insert mode the bell should
+ be rung. For Normal mode and Ex commands, the bell is often rung to
indicate that an error occurred. It can be silenced by adding the
"error" keyword.
@@ -1053,8 +989,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'bomb'* *'nobomb'*
'bomb' boolean (default off)
local to buffer
- {only available when compiled with the |+multi_byte|
- feature}
When writing a file and the following conditions are met, a BOM (Byte
Order Mark) is prepended to the file:
- this option is on
@@ -1074,17 +1008,12 @@ A jump table for the options with a short description can be found at |Q_op|.
*'breakat'* *'brk'*
'breakat' 'brk' string (default " ^I!@*-+;:,./?")
global
- {not available when compiled without the |+linebreak|
- feature}
This option lets you choose which characters might cause a line
- break if 'linebreak' is on. Only works for ASCII and also for 8-bit
- characters when 'encoding' is an 8-bit encoding.
+ break if 'linebreak' is on. Only works for ASCII characters.
*'breakindent'* *'bri'*
'breakindent' 'bri' boolean (default off)
local to window
- {not available when compiled without the |+linebreak|
- feature}
Every wrapped line will continue visually indented (same amount of
space as the beginning of that line), thus preserving horizontal blocks
of text.
@@ -1092,8 +1021,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'breakindentopt'* *'briopt'*
'breakindentopt' 'briopt' string (default empty)
local to window
- {not available when compiled without the |+linebreak|
- feature}
Settings for 'breakindent'. It can consist of the following optional
items and must be separated by a comma:
min:{n} Minimum text width that will be kept after
@@ -1106,14 +1033,13 @@ A jump table for the options with a short description can be found at |Q_op|.
characters. It permits dynamic French paragraph
indentation (negative) or emphasizing the line
continuation (positive).
- sbr Display the 'showbreak' value before applying the
+ sbr Display the 'showbreak' value before applying the
additional indent.
The default value for min is 20 and shift is 0.
*'browsedir'* *'bsdir'*
'browsedir' 'bsdir' string (default: "last")
global
- {only for Mac and Win32 GUI}
Which directory to use for the file browser:
last Use same directory as with last file browser, where a
file was opened or saved.
@@ -1124,8 +1050,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'bufhidden'* *'bh'*
'bufhidden' 'bh' string (default: "")
local to buffer
- {not available when compiled without the |+quickfix|
- feature}
This option specifies what happens when a buffer is no longer
displayed in a window:
<empty> follow the global 'hidden' option
@@ -1158,21 +1082,14 @@ A jump table for the options with a short description can be found at |Q_op|.
*'buftype'* *'bt'* *E382*
'buftype' 'bt' string (default: "")
local to buffer
- {not available when compiled without the |+quickfix|
- feature}
The value of this option specifies the type of a buffer:
<empty> normal buffer
- nofile buffer which is not related to a file and will not be
- written
- nowrite buffer which will not be written
- acwrite buffer which will always be written with BufWriteCmd
- autocommands.
- quickfix quickfix buffer, contains list of errors |:cwindow|
- or list of locations |:lwindow|
- help help buffer (you are not supposed to set this
- manually)
- terminal terminal buffer, this is set automatically when a
- terminal is created. |terminal-emulator|
+ acwrite buffer will always be written with |BufWriteCmd|s
+ help help buffer (do not set this manually)
+ nofile buffer is not related to a file, will not be written
+ nowrite buffer will not be written
+ quickfix list of errors |:cwindow| or locations |:lwindow|
+ terminal |terminal-emulator| buffer
This option is used together with 'bufhidden' and 'swapfile' to
specify special kinds of buffers. See |special-buffers|.
@@ -1208,16 +1125,12 @@ A jump table for the options with a short description can be found at |Q_op|.
*'casemap'* *'cmp'*
'casemap' 'cmp' string (default: "internal,keepascii")
global
- {only available when compiled with the |+multi_byte|
- feature}
Specifies details about changing the case of letters. It may contain
these words, separated by a comma:
internal Use internal case mapping functions, the current
- locale does not change the case mapping. This only
- matters when 'encoding' is a Unicode encoding,
- "latin1" or "iso-8859-15". When "internal" is
- omitted, the towupper() and towlower() system library
- functions are used when available.
+ locale does not change the case mapping. When
+ "internal" is omitted, the towupper() and towlower()
+ system library functions are used when available.
keepascii For the ASCII characters (0x00 to 0x7f) use the US
case mapping, the current locale is not effective.
This probably only matters for Turkish.
@@ -1225,8 +1138,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'cdpath'* *'cd'* *E344* *E346*
'cdpath' 'cd' string (default: equivalent to $CDPATH or ",,")
global
- {not available when compiled without the
- |+file_in_path| feature}
This is a list of directories which will be searched when using the
|:cd| and |:lcd| commands, provided that the directory being searched
for has a relative path, not an absolute part starting with "/", "./"
@@ -1250,16 +1161,21 @@ A jump table for the options with a short description can be found at |Q_op|.
Only non-printable keys are allowed.
The key can be specified as a single character, but it is difficult to
type. The preferred way is to use the <> notation. Examples: >
- :set cedit=<C-Y>
- :set cedit=<Esc>
+ :exe "set cedit=\<C-Y>"
+ :exe "set cedit=\<Esc>"
< |Nvi| also has this option, but it only uses the first character.
See |cmdwin|.
+ *'channel'*
+'channel' number (default: 0)
+ local to buffer
+ |channel| connected to the buffer, or 0 if no channel is connected.
+ In a |:terminal| buffer this is the terminal channel.
+ Read-only.
+
*'charconvert'* *'ccv'* *E202* *E214* *E513*
'charconvert' 'ccv' string (default "")
global
- {only available when compiled with the |+multi_byte|
- and |+eval| features}
An expression that is used for character encoding conversion. It is
evaluated when a file that is to be read or has been written has a
different encoding from what is desired.
@@ -1270,13 +1186,12 @@ A jump table for the options with a short description can be found at |Q_op|.
file to convert from. You will have to save the text in a file first.
The expression must return zero or an empty string for success,
non-zero for failure.
- The possible encoding names encountered are in 'encoding'.
+ See |encoding-names| for possible encoding names.
Additionally, names given in 'fileencodings' and 'fileencoding' are
used.
Conversion between "latin1", "unicode", "ucs-2", "ucs-4" and "utf-8"
is done internally by Vim, 'charconvert' is not used for this.
- 'charconvert' is also used to convert the shada file, if 'encoding' is
- not "utf-8". Also used for Unicode conversion.
+ Also used for Unicode conversion.
Example: >
set charconvert=CharConvert()
fun CharConvert()
@@ -1291,8 +1206,6 @@ A jump table for the options with a short description can be found at |Q_op|.
v:fname_in name of the input file
v:fname_out name of the output file
Note that v:fname_in and v:fname_out will never be the same.
- Note that v:charconvert_from and v:charconvert_to may be different
- from 'encoding'. Vim internally uses UTF-8 instead of UCS-2 or UCS-4.
This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons.
@@ -1364,27 +1277,6 @@ A jump table for the options with a short description can be found at |Q_op|.
will additionally copy the text into register
'*'. See |clipboard|.
- *clipboard-autoselect*
- autoselect Works like the 'a' flag in 'guioptions': If present,
- then whenever Visual mode is started, or the Visual
- area extended, Vim tries to become the owner of the
- windowing system's global selection or put the
- selected text on the clipboard used by the selection
- register "*. See |guioptions_a| and |quotestar| for
- details. When the GUI is active, the 'a' flag in
- 'guioptions' is used, when the GUI is not active, this
- "autoselect" flag is used.
- Also applies to the modeless selection.
-
- *clipboard-autoselectplus*
- autoselectplus Like "autoselect" but using the + register instead of
- the * register. Compare to the 'P' flag in
- 'guioptions'.
-
- *clipboard-autoselectml*
- autoselectml Like "autoselect", but for the modeless selection
- only. Compare to the 'A' flag in 'guioptions'.
-
*'cmdheight'* *'ch'*
'cmdheight' 'ch' number (default 1)
global
@@ -1401,8 +1293,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'colorcolumn'* *'cc'*
'colorcolumn' 'cc' string (default "")
local to window
- {not available when compiled without the |+syntax|
- feature}
'colorcolumn' is a comma separated list of screen columns that are
highlighted with ColorColumn |hl-ColorColumn|. Useful to align
text. Will make screen redrawing slower.
@@ -1443,15 +1333,10 @@ A jump table for the options with a short description can be found at |Q_op|.
*'commentstring'* *'cms'* *E537*
'commentstring' 'cms' string (default "/*%s*/")
local to buffer
- {not available when compiled without the |+folding|
- feature}
A template for a comment. The "%s" in the value is replaced with the
comment text. Currently only used to add markers for folding, see
|fold-marker|.
- *'compatible'* *'cp'* *'nocompatible'* *'nocp'*
-'compatible' 'cp' Removed. |vim-differences| {Nvim}
-
*'complete'* *'cpt'* *E535*
'complete' 'cpt' string (default: ".,w,b,u,t")
local to buffer
@@ -1459,7 +1344,7 @@ A jump table for the options with a short description can be found at |Q_op|.
when CTRL-P or CTRL-N are used. It is also used for whole-line
completion |i_CTRL-X_CTRL-L|. It indicates the type of completion
and the places to scan. It is a comma separated list of flags:
- . scan the current buffer ( 'wrapscan' is ignored)
+ . scan the current buffer ('wrapscan' is ignored)
w scan buffers from other windows
b scan other loaded buffers that are in the buffer list
u scan the unloaded buffers that are in the buffer list
@@ -1490,8 +1375,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'completefunc'* *'cfu'*
'completefunc' 'cfu' string (default: empty)
local to buffer
- {not available when compiled without the |+eval|
- or |+insert_expand| features}
This option specifies a function to be used for Insert mode completion
with CTRL-X CTRL-U. |i_CTRL-X_CTRL-U|
See |complete-functions| for an explanation of how the function is
@@ -1502,8 +1385,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'completeopt'* *'cot'*
'completeopt' 'cot' string (default: "menu,preview")
global
- {not available when compiled without the
- |+insert_expand| feature}
A comma separated list of options for Insert mode completion
|ins-completion|. The supported values are:
@@ -1554,8 +1435,8 @@ A jump table for the options with a short description can be found at |Q_op|.
displayed. E.g., when moving vertically it may change column.
-'conceallevel' 'cole' *'conceallevel'* *'cole'*
- number (default 0)
+ *'conceallevel'* *'cole'*
+'conceallevel' 'cole' number (default 0)
local to window
Determine how text with the "conceal" syntax attribute |:syn-conceal|
is shown:
@@ -1581,7 +1462,7 @@ A jump table for the options with a short description can be found at |Q_op|.
global
When 'confirm' is on, certain operations that would normally
fail because of unsaved changes to a buffer, e.g. ":q" and ":e",
- instead raise a |dialog| asking if you wish to save the current
+ instead raise a dialog asking if you wish to save the current
file(s). You can still use a ! to unconditionally |abandon| a buffer.
If 'confirm' is off you can still activate confirmation for one
command only (this is most useful in mappings) with the |:confirm|
@@ -1632,13 +1513,12 @@ A jump table for the options with a short description can be found at |Q_op|.
See also |map_bar|.
*cpo-B*
B A backslash has no special meaning in mappings,
- abbreviations and the "to" part of the menu commands.
- Remove this flag to be able to use a backslash like a
- CTRL-V. For example, the command ":map X \<Esc>"
- results in X being mapped to:
+ abbreviations, user commands and the "to" part of the
+ menu commands. Remove this flag to be able to use a
+ backslash like a CTRL-V. For example, the command
+ ":map X \<Esc>" results in X being mapped to:
'B' included: "\^[" (^[ is a real <Esc>)
'B' excluded: "<Esc>" (5 characters)
- ('<' excluded in both cases)
*cpo-c*
c Searching continues at the end of any match at the
cursor position, but not further than the start of the
@@ -1667,7 +1547,7 @@ A jump table for the options with a short description can be found at |Q_op|.
*cpo-E*
E It is an error when using "y", "d", "c", "g~", "gu" or
"gU" on an Empty region. The operators only work when
- at least one character is to be operate on. Example:
+ at least one character is to be operated on. Example:
This makes "y0" fail in the first column.
*cpo-f*
f When included, a ":read" command with a file name
@@ -1688,15 +1568,6 @@ A jump table for the options with a short description can be found at |Q_op|.
J A |sentence| has to be followed by two spaces after
the '.', '!' or '?'. A <Tab> is not recognized as
white space.
- *cpo-k*
- k Disable the recognition of raw key codes in
- mappings, abbreviations, and the "to" part of menu
- commands. For example, if <Key> sends ^[OA (where ^[
- is <Esc>), the command ":map X ^[OA" results in X
- being mapped to:
- 'k' included: "^[OA" (3 characters)
- 'k' excluded: "<Key>" (one key code)
- Also see the '<' flag below.
*cpo-K*
K Don't wait for a key code to complete when it is
halfway through a mapping. This breaks mapping
@@ -1830,14 +1701,6 @@ A jump table for the options with a short description can be found at |Q_op|.
+ When included, a ":write file" command will reset the
'modified' flag of the buffer, even though the buffer
itself may still be different from its file.
- *cpo-<*
- < Disable the recognition of special key codes in |<>|
- form in mappings, abbreviations, and the "to" part of
- menu commands. For example, the command
- ":map X <Tab>" results in X being mapped to:
- '<' included: "<Tab>" (5 characters)
- '<' excluded: "^I" (^I is a real <Tab>)
- Also see the 'k' flag above.
*cpo->*
> When appending to a register, put a line break before
the appended text.
@@ -1847,9 +1710,9 @@ A jump table for the options with a short description can be found at |Q_op|.
character, the cursor won't move. When not included,
the cursor would skip over it and jump to the
following occurrence.
-
- *'cryptmethod'* *'cm'*
-'cryptmethod' Removed. |vim-differences| {Nvim}
+ *cpo-_*
+ _ When using |cw| on a word, do not include the
+ whitespace following the word in the motion.
*'cscopepathcomp'* *'cspc'*
'cscopepathcomp' 'cspc' number (default 0)
@@ -1888,12 +1751,6 @@ A jump table for the options with a short description can be found at |Q_op|.
Determines the order in which ":cstag" performs a search. See
|cscopetagorder|.
- *'cscopeverbose'* *'csverb'*
- *'nocscopeverbose'* *'nocsverb'*
-'cscopeverbose' 'csverb' boolean (default off)
- global
- Give messages when adding a cscope database. See |cscopeverbose|.
-
*'cursorbind'* *'crb'* *'nocursorbind'* *'nocrb'*
'cursorbind' 'crb' boolean (default off)
local to window
@@ -1909,8 +1766,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'cursorcolumn'* *'cuc'* *'nocursorcolumn'* *'nocuc'*
'cursorcolumn' 'cuc' boolean (default off)
local to window
- {not available when compiled without the |+syntax|
- feature}
Highlight the screen column of the cursor with CursorColumn
|hl-CursorColumn|. Useful to align text. Will make screen redrawing
slower.
@@ -1923,8 +1778,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'cursorline'* *'cul'* *'nocursorline'* *'nocul'*
'cursorline' 'cul' boolean (default off)
local to window
- {not available when compiled without the |+syntax|
- feature}
Highlight the screen line of the cursor with CursorLine
|hl-CursorLine|. Useful to easily spot the cursor. Will make screen
redrawing slower.
@@ -1964,8 +1817,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'delcombine'* *'deco'* *'nodelcombine'* *'nodeco'*
'delcombine' 'deco' boolean (default off)
global
- {only available when compiled with the |+multi_byte|
- feature}
If editing Unicode and this option is set, backspace and Normal mode
"x" delete each combining character on its own. When it is off (the
default) the character along with its combining characters are
@@ -2008,13 +1859,13 @@ A jump table for the options with a short description can be found at |Q_op|.
*'dex'* *'diffexpr'*
'diffexpr' 'dex' string (default "")
global
- Expression which is evaluated to obtain an ed-style diff file from two
- versions of a file. See |diff-diffexpr|.
+ Expression which is evaluated to obtain a diff file (either ed-style
+ or unified-style) from two versions of a file. See |diff-diffexpr|.
This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons.
*'dip'* *'diffopt'*
-'diffopt' 'dip' string (default "filler")
+'diffopt' 'dip' string (default "internal,filler")
global
Option settings for diff mode. It can consist of the following items.
All are optional. Items must be separated by a comma.
@@ -2030,6 +1881,15 @@ A jump table for the options with a short description can be found at |Q_op|.
When omitted a context of six lines is used.
See |fold-diff|.
+ iblank Ignore changes where lines are all blank. Adds
+ the "-B" flag to the "diff" command if
+ 'diffexpr' is empty. Check the documentation
+ of the "diff" command for what this does
+ exactly.
+ NOTE: the diff windows will get out of sync,
+ because no differences between blank lines are
+ taken into account.
+
icase Ignore changes in case of text. "a" and "A"
are considered the same. Adds the "-i" flag
to the "diff" command if 'diffexpr' is empty.
@@ -2041,26 +1901,59 @@ A jump table for the options with a short description can be found at |Q_op|.
exactly. It should ignore adding trailing
white space, but not leading white space.
+ iwhiteall Ignore all white space changes. Adds
+ the "-w" flag to the "diff" command if
+ 'diffexpr' is empty. Check the documentation
+ of the "diff" command for what this does
+ exactly.
+
+ iwhiteeol Ignore white space changes at end of line.
+ Adds the "-Z" flag to the "diff" command if
+ 'diffexpr' is empty. Check the documentation
+ of the "diff" command for what this does
+ exactly.
+
horizontal Start diff mode with horizontal splits (unless
explicitly specified otherwise).
vertical Start diff mode with vertical splits (unless
explicitly specified otherwise).
+ hiddenoff Do not use diff mode for a buffer when it
+ becomes hidden.
+
foldcolumn:{n} Set the 'foldcolumn' option to {n} when
starting diff mode. Without this 2 is used.
- Examples: >
+ internal Use the internal diff library. This is
+ ignored when 'diffexpr' is set. *E960*
+ When running out of memory when writing a
+ buffer this item will be ignored for diffs
+ involving that buffer. Set the 'verbose'
+ option to see when this happens.
+
+ indent-heuristic
+ Use the indent heuristic for the internal
+ diff library.
+
+ algorithm:{text} Use the specified diff algorithm with the
+ internal diff engine. Currently supported
+ algorithms are:
+ myers the default algorithm
+ minimal spend extra time to generate the
+ smallest possible diff
+ patience patience diff algorithm
+ histogram histogram diff algorithm
- :set diffopt=filler,context:4
+ Examples: >
+ :set diffopt=internal,filler,context:4
:set diffopt=
- :set diffopt=filler,foldcolumn:3
+ :set diffopt=internal,filler,foldcolumn:3
+ :set diffopt-=internal " do NOT use the internal diff parser
<
*'digraph'* *'dg'* *'nodigraph'* *'nodg'*
'digraph' 'dg' boolean (default off)
global
- {not available when compiled without the |+digraphs|
- feature}
Enable the entering of digraphs in Insert mode with {char1} <BS>
{char2}. See |digraphs|.
@@ -2111,15 +2004,25 @@ A jump table for the options with a short description can be found at |Q_op|.
security reasons.
*'display'* *'dy'*
-'display' 'dy' string (default "lastline", Vi default: "")
+'display' 'dy' string (default "lastline,msgsep", Vi default: "")
global
Change the way text is displayed. This is comma separated list of
flags:
lastline When included, as much as possible of the last line
- in a window will be displayed. When not included, a
- last line that doesn't fit is replaced with "@" lines.
+ in a window will be displayed. "@@@" is put in the
+ last columns of the last screen line to indicate the
+ rest of the line is not displayed.
+ truncate Like "lastline", but "@@@" is displayed in the first
+ column of the last screen line. Overrules "lastline".
uhex Show unprintable characters hexadecimal as <xx>
instead of using ^C and ~C.
+ msgsep When showing messages longer than 'cmdheight', only
+ scroll the message lines, not the entire screen. The
+ separator line is decorated by |hl-MsgSeparator| and
+ the "msgsep" flag of 'fillchars'.
+
+ When neither "lastline" nor "truncate" is included, a last line that
+ doesn't fit is replaced with "@" lines.
*'eadirection'* *'ead'*
'eadirection' 'ead' string (default "both")
@@ -2129,47 +2032,18 @@ A jump table for the options with a short description can be found at |Q_op|.
hor horizontally, height of windows is not affected
both width and height of windows is affected
- *'ed'* *'edcompatible'* *'noed'* *'noedcompatible'*
-'edcompatible' 'ed' Removed. |vim-differences| {Nvim}
+ *'emoji'* *'emo'*
+'emoji' 'emo' boolean (default: on)
+ global
+ When on all Unicode emoji characters are considered to be full width.
- *'encoding'* *'enc'* *E543*
-'encoding' 'enc' string (default: "utf-8")
- global
- {only available when compiled with the |+multi_byte|
- feature}
- Sets the character encoding used inside Vim. It applies to text in
- the buffers, registers, Strings in expressions, text stored in the
- shada file, etc. It sets the kind of characters which Vim can work
- with. See |encoding-names| for the possible values.
-
- 'encoding' cannot be changed after startup, because (1) it causes
- non-ASCII text inside Vim to become invalid, and (2) it complicates
- runtime logic. The recommended 'encoding' is "utf-8". Remote plugins
- and GUIs only support utf-8. See |multibyte|.
-
- The character encoding of files can be different from 'encoding'.
- This is specified with 'fileencoding'. The conversion is done with
- iconv() or as specified with 'charconvert'.
- If you need to know whether 'encoding' is a multi-byte encoding, you
- can use: >
- if has("multi_byte_encoding")
-<
- When you set this option, it fires the |EncodingChanged| autocommand
- event so that you can set up fonts if necessary.
+ *'encoding'* *'enc'* *E543*
+'encoding' 'enc'
+ String-encoding used internally and for |RPC| communication.
+ Always UTF-8.
- When the option is set, the value is converted to lowercase. Thus
- you can set it with uppercase values too. Underscores are translated
- to '-' signs.
- When the encoding is recognized, it is changed to the standard name.
- For example "Latin-1" becomes "latin1", "ISO_88592" becomes
- "iso-8859-2" and "utf8" becomes "utf-8".
-
- When "unicode", "ucs-2" or "ucs-4" is used, Vim internally uses utf-8.
- You don't notice this while editing, but it does matter for the
- |shada-file|. And Vim expects the terminal to use utf-8 too. Thus
- setting 'encoding' to one of these values instead of utf-8 only has
- effect for encoding used for files when 'fileencoding' is empty.
+ See 'fileencoding' to control file-content encoding.
*'endofline'* *'eol'* *'noendofline'* *'noeol'*
'endofline' 'eol' boolean (default on)
@@ -2222,15 +2096,12 @@ A jump table for the options with a short description can be found at |Q_op|.
Ring the bell (beep or screen flash) for error messages. This only
makes a difference for error messages, the bell will be used always
for a lot of errors without a message (e.g., hitting <Esc> in Normal
- mode). See 'visualbell' on how to make the bell behave like a beep,
- screen flash or do nothing. See 'belloff' to finetune when to ring the
- bell.
+ mode). See 'visualbell' to make the bell behave like a screen flash
+ or do nothing. See 'belloff' to finetune when to ring the bell.
*'errorfile'* *'ef'*
'errorfile' 'ef' string (default: "errors.err")
global
- {not available when compiled without the |+quickfix|
- feature}
Name of the errorfile for the QuickFix mode (see |:cf|).
When the "-q" command-line argument is used, 'errorfile' is set to the
following argument. See |-q|.
@@ -2243,23 +2114,9 @@ A jump table for the options with a short description can be found at |Q_op|.
*'errorformat'* *'efm'*
'errorformat' 'efm' string (default is very long)
global or local to buffer |global-local|
- {not available when compiled without the |+quickfix|
- feature}
Scanf-like description of the format for the lines in the error file
(see |errorformat|).
- *'esckeys'* *'ek'* *'noesckeys'* *'noek'*
-'esckeys' 'ek' boolean (Vim default: on, Vi default: off)
- global
- Function keys that start with an <Esc> are recognized in Insert
- mode. When this option is off, the cursor and function keys cannot be
- used in Insert mode if they start with an <Esc>. The advantage of
- this is that the single <Esc> is recognized immediately, instead of
- after one second. Instead of resetting this option, you might want to
- try changing the values for 'timeoutlen' and 'ttimeoutlen'. Note that
- when 'esckeys' is off, you can still map anything, but the cursor keys
- won't work by default.
-
*'eventignore'* *'ei'*
'eventignore' 'ei' string (default "")
global
@@ -2282,10 +2139,15 @@ A jump table for the options with a short description can be found at |Q_op|.
*'exrc'* *'ex'* *'noexrc'* *'noex'*
'exrc' 'ex' boolean (default off)
global
- Enables the reading of .nvimrc and .exrc in the current directory.
- If you switch this option on you should also consider setting the
- 'secure' option (see |initialization|). Using this option comes
- with a potential security risk, use with care!
+ Enables the reading of .vimrc and .exrc in the current directory.
+ Setting this option is a potential security leak. E.g., consider
+ unpacking a package or fetching files from github, a .vimrc in there
+ might be a trojan horse. BETTER NOT SET THIS OPTION!
+ Instead, define an autocommand in your .vimrc to set options for a
+ matching directory.
+
+ If you do switch this option on you should also consider setting the
+ 'secure' option (see |initialization|).
This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons.
Also see |init.vim| and |gui-init|.
@@ -2293,24 +2155,18 @@ A jump table for the options with a short description can be found at |Q_op|.
*'fileencoding'* *'fenc'* *E213*
'fileencoding' 'fenc' string (default: "")
local to buffer
- {only available when compiled with the |+multi_byte|
- feature}
- Sets the character encoding for the file of this buffer.
-
- When 'fileencoding' is different from 'encoding', conversion will be
- done when writing the file. For reading see below.
- When 'fileencoding' is empty, the same value as 'encoding' will be
- used (no conversion when reading or writing a file).
- Conversion will also be done when 'encoding' and 'fileencoding' are
- both a Unicode encoding and 'fileencoding' is not utf-8. That's
- because internally Unicode is always stored as utf-8.
- WARNING: Conversion can cause loss of information! When
- 'encoding' is "utf-8" or another Unicode encoding, conversion
- is most likely done in a way that the reverse conversion
- results in the same text. When 'encoding' is not "utf-8" some
- characters may be lost!
-
- See 'encoding' for the possible values. Additionally, values may be
+ File-content encoding for the current buffer. Conversion is done with
+ iconv() or as specified with 'charconvert'.
+
+ When 'fileencoding' is not UTF-8, conversion will be done when
+ writing the file. For reading see below.
+ When 'fileencoding' is empty, the file will be saved with UTF-8
+ encoding (no conversion when reading or writing a file).
+
+ WARNING: Conversion to a non-Unicode encoding can cause loss of
+ information!
+
+ See |encoding-names| for the possible values. Additionally, values may be
specified that can be handled by the converter, see
|mbyte-conversion|.
@@ -2323,8 +2179,8 @@ A jump table for the options with a short description can be found at |Q_op|.
Prepending "8bit-" and "2byte-" has no meaning here, they are ignored.
When the option is set, the value is converted to lowercase. Thus
you can set it with uppercase values too. '_' characters are
- replaced with '-'. If a name is recognized from the list for
- 'encoding', it is replaced by the standard name. For example
+ replaced with '-'. If a name is recognized from the list at
+ |encoding-names|, it is replaced by the standard name. For example
"ISO8859-2" becomes "iso-8859-2".
When this option is set, after starting to edit a file, the 'modified'
@@ -2335,29 +2191,18 @@ A jump table for the options with a short description can be found at |Q_op|.
written. If you do set 'fenc' in a modeline, you might want to set
'nomodified' to avoid not being able to ":q".
- This option can not be changed when 'modifiable' is off.
-
- *'fe'*
- NOTE: Before version 6.0 this option specified the encoding for the
- whole of Vim, this was a mistake. Now use 'encoding' instead. The
- old short name was 'fe', which is no longer used.
+ This option cannot be changed when 'modifiable' is off.
*'fileencodings'* *'fencs'*
'fileencodings' 'fencs' string (default: "ucs-bom,utf-8,default,latin1")
global
- {only available when compiled with the |+multi_byte|
- feature}
This is a list of character encodings considered when starting to edit
an existing file. When a file is read, Vim tries to use the first
mentioned character encoding. If an error is detected, the next one
in the list is tried. When an encoding is found that works,
'fileencoding' is set to it. If all fail, 'fileencoding' is set to
- an empty string, which means the value of 'encoding' is used.
- WARNING: Conversion can cause loss of information! When
- 'encoding' is "utf-8" (or one of the other Unicode variants)
- conversion is most likely done in a way that the reverse
- conversion results in the same text. When 'encoding' is not
- "utf-8" some non-ASCII characters may be lost! You can use
+ an empty string, which means that UTF-8 is used.
+ WARNING: Conversion can cause loss of information! You can use
the |++bad| argument to specify what is done with characters
that can't be converted.
For an empty file or a file with only ASCII characters most encodings
@@ -2383,11 +2228,11 @@ A jump table for the options with a short description can be found at |Q_op|.
because Vim cannot detect an error, thus the encoding is always
accepted.
The special value "default" can be used for the encoding from the
- environment. It is useful when 'encoding' is set to "utf-8" and
- your environment uses a non-latin1 encoding, such as Russian.
- When 'encoding' is "utf-8" and a file contains an illegal byte
- sequence it won't be recognized as UTF-8. You can use the |8g8|
- command to find the illegal byte sequence.
+ environment. It is useful when your environment uses a non-latin1
+ encoding, such as Russian.
+ When a file contains an illegal UTF-8 byte sequence it won't be
+ recognized as "utf-8". You can use the |8g8| command to find the
+ illegal byte sequence.
WRONG VALUES: WHAT'S WRONG:
latin1,utf-8 "latin1" will always be used
utf-8,ucs-bom,latin1 BOM won't be recognized in an utf-8
@@ -2417,7 +2262,7 @@ A jump table for the options with a short description can be found at |Q_op|.
'fileformats' is not empty and 'binary' is off.
When this option is set, after starting to edit a file, the 'modified'
option is set, because the file would be different when written.
- This option can not be changed when 'modifiable' is off.
+ This option cannot be changed when 'modifiable' is off.
*'fileformats'* *'ffs'*
'fileformats' 'ffs' string (default:
@@ -2505,26 +2350,29 @@ A jump table for the options with a short description can be found at |Q_op|.
Only normal file name characters can be used, "/\*?[|<>" are illegal.
*'fillchars'* *'fcs'*
-'fillchars' 'fcs' string (default "vert:|,fold:-")
+'fillchars' 'fcs' string (default "")
global
- {not available when compiled without the |+windows|
- and |+folding| features}
Characters to fill the statuslines and vertical separators.
It is a comma separated list of items:
item default Used for ~
stl:c ' ' or '^' statusline of the current window
stlnc:c ' ' or '=' statusline of the non-current windows
- vert:c '|' vertical separators |:vsplit|
- fold:c '-' filling 'foldtext'
+ vert:c 'โ”‚' or '|' vertical separators |:vsplit|
+ fold:c 'ยท' or '-' filling 'foldtext'
diff:c '-' deleted lines of the 'diff' option
+ msgsep:c ' ' message separator 'display'
+ eob:c '~' empty lines at the end of a buffer
Any one that is omitted will fall back to the default. For "stl" and
"stlnc" the space will be used when there is highlighting, '^' or '='
otherwise.
+ If 'ambiwidth' is "double" then "vert" and "fold" default to
+ single-byte alternatives.
+
Example: >
- :set fillchars=stl:^,stlnc:=,vert:\|,fold:-,diff:-
+ :set fillchars=stl:^,stlnc:=,vert:โ”‚,fold:ยท,diff:-
< This is similar to the default, except that these characters will also
be used when there is highlighting.
@@ -2537,11 +2385,11 @@ A jump table for the options with a short description can be found at |Q_op|.
vert:c VertSplit |hl-VertSplit|
fold:c Folded |hl-Folded|
diff:c DiffDelete |hl-DiffDelete|
+ eob:c EndOfBuffer |hl-EndOfBuffer|
*'fixendofline'* *'fixeol'* *'nofixendofline'* *'nofixeol'*
'fixendofline' 'fixeol' boolean (default on)
local to buffer
- {not in Vi}
When writing a file and this option is on, <EOL> at the end of file
will be restored if missing. Turn this option off if you want to
preserve the situation from the original file.
@@ -2559,8 +2407,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'foldclose'* *'fcl'*
'foldclose' 'fcl' string (default "")
global
- {not available when compiled without the |+folding|
- feature}
When set to "all", a fold is closed when the cursor isn't in it and
its level is higher than 'foldlevel'. Useful if you want folds to
automatically close when moving out of them.
@@ -2568,8 +2414,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'foldcolumn'* *'fdc'*
'foldcolumn' 'fdc' number (default 0)
local to window
- {not available when compiled without the |+folding|
- feature}
When non-zero, a column with the specified width is shown at the side
of the window which indicates open and closed folds. The maximum
value is 12.
@@ -2578,8 +2422,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'foldenable'* *'fen'* *'nofoldenable'* *'nofen'*
'foldenable' 'fen' boolean (default on)
local to window
- {not available when compiled without the |+folding|
- feature}
When off, all folds are open. This option can be used to quickly
switch between showing all text unfolded and viewing the text with
folds (including manually opened or closed folds). It can be toggled
@@ -2591,8 +2433,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'foldexpr'* *'fde'*
'foldexpr' 'fde' string (default: "0")
local to window
- {not available when compiled without the |+folding|
- or |+eval| features}
The expression used for when 'foldmethod' is "expr". It is evaluated
for each line to obtain its fold level. See |fold-expr|.
@@ -2607,8 +2447,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'foldignore'* *'fdi'*
'foldignore' 'fdi' string (default: "#")
local to window
- {not available when compiled without the |+folding|
- feature}
Used only when 'foldmethod' is "indent". Lines starting with
characters in 'foldignore' will get their fold level from surrounding
lines. White space is skipped before checking for this character.
@@ -2617,8 +2455,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'foldlevel'* *'fdl'*
'foldlevel' 'fdl' number (default: 0)
local to window
- {not available when compiled without the |+folding|
- feature}
Sets the fold level: Folds with a higher level will be closed.
Setting this option to zero will close all folds. Higher numbers will
close fewer folds.
@@ -2628,8 +2464,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'foldlevelstart'* *'fdls'*
'foldlevelstart' 'fdls' number (default: -1)
global
- {not available when compiled without the |+folding|
- feature}
Sets 'foldlevel' when starting to edit another buffer in a window.
Useful to always start editing with all folds closed (value zero),
some folds closed (one) or no folds closed (99).
@@ -2643,8 +2477,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'foldmarker'* *'fmr'* *E536*
'foldmarker' 'fmr' string (default: "{{{,}}}")
local to window
- {not available when compiled without the |+folding|
- feature}
The start and end marker used when 'foldmethod' is "marker". There
must be one comma, which separates the start and end marker. The
marker is a literal string (a regular expression would be too slow).
@@ -2653,8 +2485,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'foldmethod'* *'fdm'*
'foldmethod' 'fdm' string (default: "manual")
local to window
- {not available when compiled without the |+folding|
- feature}
The kind of folding used for the current window. Possible values:
|fold-manual| manual Folds are created manually.
|fold-indent| indent Lines with equal indent form a fold.
@@ -2666,8 +2496,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'foldminlines'* *'fml'*
'foldminlines' 'fml' number (default: 1)
local to window
- {not available when compiled without the |+folding|
- feature}
Sets the number of screen lines above which a fold can be displayed
closed. Also for manually closed folds. With the default value of
one a fold can only be closed if it takes up two or more screen lines.
@@ -2679,8 +2507,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'foldnestmax'* *'fdn'*
'foldnestmax' 'fdn' number (default: 20)
local to window
- {not available when compiled without the |+folding|
- feature}
Sets the maximum nesting of folds for the "indent" and "syntax"
methods. This avoids that too many folds will be created. Using more
than 20 doesn't work, because the internal limit is 20.
@@ -2689,8 +2515,6 @@ A jump table for the options with a short description can be found at |Q_op|.
'foldopen' 'fdo' string (default: "block,hor,mark,percent,quickfix,
search,tag,undo")
global
- {not available when compiled without the |+folding|
- feature}
Specifies for which type of commands folds will be opened, if the
command moves the cursor into a closed fold. It is a comma separated
list of items.
@@ -2725,8 +2549,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'foldtext'* *'fdt'*
'foldtext' 'fdt' string (default: "foldtext()")
local to window
- {not available when compiled without the |+folding|
- feature}
An expression which is used to specify the text displayed for a closed
fold. See |fold-foldtext|.
@@ -2736,6 +2558,38 @@ A jump table for the options with a short description can be found at |Q_op|.
It is not allowed to change text or jump to another window while
evaluating 'foldtext' |textlock|.
+ *'formatexpr'* *'fex'*
+'formatexpr' 'fex' string (default "")
+ local to buffer
+ Expression which is evaluated to format a range of lines for the |gq|
+ operator or automatic formatting (see 'formatoptions'). When this
+ option is empty 'formatprg' is used.
+
+ The |v:lnum| variable holds the first line to be formatted.
+ The |v:count| variable holds the number of lines to be formatted.
+ The |v:char| variable holds the character that is going to be
+ inserted if the expression is being evaluated due to
+ automatic formatting. This can be empty. Don't insert
+ it yet!
+
+ Example: >
+ :set formatexpr=mylang#Format()
+< This will invoke the mylang#Format() function in the
+ autoload/mylang.vim file in 'runtimepath'. |autoload|
+
+ The expression is also evaluated when 'textwidth' is set and adding
+ text beyond that limit. This happens under the same conditions as
+ when internal formatting is used. Make sure the cursor is kept in the
+ same spot relative to the text then! The |mode()| function will
+ return "i" or "R" in this situation.
+
+ When the expression evaluates to non-zero Vim will fall back to using
+ the internal format mechanism.
+
+ The expression will be evaluated in the |sandbox| when set from a
+ modeline, see |sandbox-option|. That stops the option from working,
+ since changing the buffer text is not allowed.
+
*'formatoptions'* *'fo'*
'formatoptions' 'fo' string (default: "tcqj", Vi default: "vt")
local to buffer
@@ -2761,7 +2615,7 @@ A jump table for the options with a short description can be found at |Q_op|.
*'formatprg'* *'fp'*
'formatprg' 'fp' string (default "")
- global
+ global or local to buffer |global-local|
The name of an external program that will be used to format the lines
selected with the |gq| operator. The program must take the input on
stdin and produce the output on stdout. The Unix program "fmt" is
@@ -2774,49 +2628,20 @@ A jump table for the options with a short description can be found at |Q_op|.
This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons.
- *'formatexpr'* *'fex'*
-'formatexpr' 'fex' string (default "")
- local to buffer
- {not available when compiled without the |+eval|
- feature}
- Expression which is evaluated to format a range of lines for the |gq|
- operator or automatic formatting (see 'formatoptions'). When this
- option is empty 'formatprg' is used.
-
- The |v:lnum| variable holds the first line to be formatted.
- The |v:count| variable holds the number of lines to be formatted.
- The |v:char| variable holds the character that is going to be
- inserted if the expression is being evaluated due to
- automatic formatting. This can be empty. Don't insert
- it yet!
-
- Example: >
- :set formatexpr=mylang#Format()
-< This will invoke the mylang#Format() function in the
- autoload/mylang.vim file in 'runtimepath'. |autoload|
-
- The expression is also evaluated when 'textwidth' is set and adding
- text beyond that limit. This happens under the same conditions as
- when internal formatting is used. Make sure the cursor is kept in the
- same spot relative to the text then! The |mode()| function will
- return "i" or "R" in this situation.
-
- When the expression evaluates to non-zero Vim will fall back to using
- the internal format mechanism.
-
- The expression will be evaluated in the |sandbox| when set from a
- modeline, see |sandbox-option|. That stops the option from working,
- since changing the buffer text is not allowed.
-
*'fsync'* *'fs'*
-'fsync' 'fs' boolean (default on)
+'fsync' 'fs' boolean (default off)
global
- When on, the library function fsync() will be called after writing a
- file. This will flush a file to disk, ensuring that it is safely
- written even on filesystems which do metadata-only journaling. This
- will force the harddrive to spin up on Linux systems running in laptop
- mode, so it may be undesirable in some situations. Be warned that
- turning this off increases the chances of data loss after a crash.
+ When on, the OS function fsync() will be called after saving a file
+ (|:write|, |writefile()|, โ€ฆ), |swap-file| and |shada-file|. This
+ flushes the file to disk, ensuring that it is safely written.
+ Slow on some systems: writing buffers, quitting Nvim, and other
+ operations may sometimes take a few seconds.
+
+ Files are ALWAYS flushed ('fsync' is ignored) when:
+ - |CursorHold| event is triggered
+ - |:preserve| is called
+ - system signals low battery life
+ - Nvim exits abnormally
*'gdefault'* *'gd'* *'nogdefault'* *'nogd'*
'gdefault' 'gd' boolean (default off)
@@ -2831,6 +2656,10 @@ A jump table for the options with a short description can be found at |Q_op|.
:s///g subst. one subst. all
:s///gg subst. all subst. one
+ DEPRECATED: Setting this option may break plugins that are not aware
+ of this option. Also, many users get confused that adding the /g flag
+ has the opposite effect of that it normally does.
+
*'grepformat'* *'gfm'*
'grepformat' 'gfm' string (default "%f:%l:%m,%f:%l%m,%f %l%m")
global
@@ -2840,8 +2669,7 @@ A jump table for the options with a short description can be found at |Q_op|.
*'grepprg'* *'gp'*
'grepprg' 'gp' string (default "grep -n ",
- Unix: "grep -n $* /dev/null",
- Win32: "findstr /n" or "grep -n")
+ Unix: "grep -n $* /dev/null")
global or local to buffer |global-local|
Program to use for the |:grep| command. This option may contain '%'
and '#' characters, which are expanded like when used in a command-
@@ -2856,33 +2684,24 @@ A jump table for the options with a short description can be found at |Q_op|.
|:vimgrepadd| and |:lgrepadd| like |:lvimgrepadd|.
See also the section |:make_makeprg|, since most of the comments there
apply equally to 'grepprg'.
- For Win32, the default is "findstr /n" if "findstr.exe" can be found,
- otherwise it's "grep -n".
This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons.
*'guicursor'* *'gcr'* *E545* *E546* *E548* *E549*
-'guicursor' 'gcr' string (default "n-v-c:block-Cursor/lCursor,
- ve:ver35-Cursor,
- o:hor50-Cursor,
- i-ci:ver25-Cursor/lCursor,
- r-cr:hor20-Cursor/lCursor,
- sm:block-Cursor
- -blinkwait175-blinkoff150-blinkon175",
- for Windows console:
- "n-v-c:block,o:hor50,i-ci:hor15,
- r-cr:hor30,sm:block")
- global
- {only available when compiled with GUI enabled, and
- for Windows console}
- This option tells Vim what the cursor should look like in different
- modes. It fully works in the GUI. In a Windows console, only
- the height of the cursor can be changed. This can be done by
- specifying a block cursor, or a percentage for a vertical or
- horizontal cursor.
- For a console the 't_SI' and 't_EI' escape sequences are used.
-
- The option is a comma separated list of parts. Each part consist of a
+'guicursor' 'gcr' string (default "n-v-c-sm:block,i-ci-ve:ver25,r-cr-o:hor20")
+ global
+ Configures the cursor style for each mode. Works in the GUI and many
+ terminals. See |tui-cursor-shape|.
+
+ To disable cursor-styling, reset the option: >
+ :set guicursor=
+
+< To enable mode shapes, "Cursor" highlight, and blinking: >
+ :set guicursor=n-v-c:block,i-ci-ve:ver25,r-cr:hor20,o:hor50
+ \,a:blinkwait700-blinkoff400-blinkon250-Cursor/lCursor
+ \,sm:block-blinkwait175-blinkoff150-blinkon175
+
+< The option is a comma separated list of parts. Each part consists of a
mode-list and an argument-list:
mode-list:argument-list,mode-list:argument-list,..
The mode-list is a dash separated list of these modes:
@@ -2910,27 +2729,30 @@ A jump table for the options with a short description can be found at |Q_op|.
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. The
- default is: "blinkwait700-blinkon400-blinkoff250".
- These numbers are used for a missing entry. This
- means that blinking is enabled by default. To switch
- blinking off you can use "blinkon0". The cursor only
- blinks when Vim is waiting for input, not while
- executing a command.
- To make the cursor blink in an xterm, see
- |xterm-blink|.
- {group-name}
- a highlight group name, that sets the color and font
- for the cursor
+ 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.
{group-name}/{group-name}
Two highlight group names, the first is used when
no language mappings are used, the other when they
are. |language-mapping|
Examples of parts:
- n-c-v:block-nCursor in Normal, Command-line and Visual mode, use a
+ n-c-v:block-nCursor In Normal, Command-line and Visual mode, use a
block cursor with colors from the "nCursor"
highlight group
+ n-v-c-sm:block,i-ci-ve:ver25-Cursor,r-cr-o:hor20
+ In Normal et al. modes, use a block cursor
+ with the default colors defined by the host
+ terminal. In Insert-likes modes, use
+ a vertical bar cursor with colors from
+ "Cursor" highlight group. In Replace-likes
+ modes, use a underline cursor with
+ default colors.
i-ci:ver30-iCursor-blinkwait300-blinkon200-blinkoff150
In Insert and Command-line Insert mode, use a
30% vertical bar cursor with colors from the
@@ -2950,7 +2772,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*E235* *E596*
'guifont' 'gfn' string (default "")
global
- {only available when compiled with GUI enabled}
This is a list of fonts which will be used for the GUI version of Vim.
In its simplest form the value is just one font name. When
the font cannot be found you will get an error message. To try other
@@ -2979,8 +2800,7 @@ A jump table for the options with a short description can be found at |Q_op|.
:set guifont=*
< will bring up a font requester, where you can pick the font you want.
- The font name depends on the GUI used. See |setting-guifont| for a
- way to set 'guifont' for various systems.
+ The font name depends on the GUI used.
For Mac OSX you can use something like this: >
:set guifont=Monaco:h10
@@ -3017,8 +2837,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*E250* *E252* *E234* *E597* *E598*
'guifontset' 'gfs' string (default "")
global
- {only available when compiled with GUI enabled and
- with the |+xfontset| feature}
When not empty, specifies two (or more) fonts to be used. The first
one for normal English, the second one for your special language. See
|xfontset|.
@@ -3039,15 +2857,13 @@ A jump table for the options with a short description can be found at |Q_op|.
*'guifontwide'* *'gfw'* *E231* *E533* *E534*
'guifontwide' 'gfw' string (default "")
global
- {only available when compiled with GUI enabled}
When not empty, specifies a comma-separated list of fonts to be used
for double-width characters. The first font that can be loaded is
used.
Note: The size of these fonts must be exactly twice as wide as the one
specified with 'guifont' and the same height.
- 'guifontwide' is only used when 'encoding' is set to "utf-8" and
- 'guifontset' is empty or invalid.
+ 'guifontwide' is only used when 'guifontset' is empty or invalid.
When 'guifont' is set and a valid font is found in it and
'guifontwide' is empty Vim will attempt to find a matching
double-width font and set 'guifontwide' to it.
@@ -3056,22 +2872,9 @@ A jump table for the options with a short description can be found at |Q_op|.
If set and valid, 'guifontwide' is used for IME instead of 'guifont'.
- *'guiheadroom'* *'ghr'*
-'guiheadroom' 'ghr' number (default 50)
- global
- {only for X11 GUI}
- The number of pixels subtracted from the screen height when fitting
- the GUI window on the screen. Set this before the GUI is started,
- e.g., in your |gvimrc| file. When zero, the whole screen height will
- be used by the window. When positive, the specified number of pixel
- lines will be left for window decorations and other items on the
- screen. Set it to a negative value to allow windows taller than the
- screen.
-
*'guioptions'* *'go'*
'guioptions' 'go' string (default "egmrLT" (MS-Windows))
global
- {only available when compiled with GUI enabled}
This option only has an effect in the GUI version of Vim. It is a
sequence of letters which describes what components and options of the
GUI should be used.
@@ -3096,7 +2899,7 @@ A jump table for the options with a short description can be found at |Q_op|.
The same applies to the modeless selection.
*'go-P'*
'P' Like autoselect but using the "+ register instead of the "*
- register.
+ register.
*'go-A'*
'A' Autoselect for the modeless selection. Like 'a', but only
applies to the modeless selection.
@@ -3125,7 +2928,7 @@ A jump table for the options with a short description can be found at |Q_op|.
that this flag must be added in the vimrc file, before
switching on syntax or filetype recognition (when the |gvimrc|
file is sourced the system menu has already been loaded; the
- ":syntax on" and ":filetype on" commands load the menu too).
+ `:syntax on` and `:filetype on` commands load the menu too).
*'go-g'*
'g' Grey menu items: Make menu items that are not active grey. If
'g' is not included inactive menu items are not shown at all.
@@ -3164,20 +2967,17 @@ A jump table for the options with a short description can be found at |Q_op|.
removing it after the GUI has started has no effect.
- *'guipty'* *'noguipty'*
-'guipty' Removed. |vim-differences| {Nvim}
-
*'guitablabel'* *'gtl'*
'guitablabel' 'gtl' string (default empty)
global
- {only available when compiled with GUI enabled and
- with the |+windows| feature}
When nonempty describes the text to use in a label of the GUI tab
pages line. When empty and when the result is empty Vim will use a
default label. See |setting-guitablabel| for more info.
The format of this option is like that of 'statusline'.
'guitabtooltip' is used for the tooltip, see below.
+ The expression will be evaluated in the |sandbox| when set from a
+ modeline, see |sandbox-option|.
Only used when the GUI tab pages line is displayed. 'e' must be
present in 'guioptions'. For the non-GUI tab pages line 'tabline' is
@@ -3186,8 +2986,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'guitabtooltip'* *'gtt'*
'guitabtooltip' 'gtt' string (default empty)
global
- {only available when compiled with GUI enabled and
- with the |+windows| feature}
When nonempty describes the text to use in a tooltip for the GUI tab
pages line. When empty Vim will use a default tooltip.
This option is otherwise just like 'guitablabel' above.
@@ -3212,8 +3010,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'helpheight'* *'hh'*
'helpheight' 'hh' number (default 20)
global
- {not available when compiled without the |+windows|
- feature}
Minimal initial height of the help window when it is opened with the
":help" command. The initial height of the help window is half of the
current window, or (when the 'ea' option is on) the same as other
@@ -3223,8 +3019,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'helplang'* *'hlg'*
'helplang' 'hlg' string (default: messages language or empty)
global
- {only available when compiled with the |+multi_lang|
- feature}
Comma separated list of languages. Vim will use the first language
for which the desired help can be found. The English help will always
be used as a last resort. You can add "en" to prefer English over
@@ -3253,109 +3047,6 @@ A jump table for the options with a short description can be found at |Q_op|.
WARNING: It's easy to forget that you have changes in hidden buffers.
Think twice when using ":q!" or ":qa!".
- *'highlight'* *'hl'*
-'highlight' 'hl' string (default (as a single string):
- "8:SpecialKey,~:EndOfBuffer,z:TermCursor,
- Z:TermCursorNC,@:NonText,d:Directory,
- e:ErrorMsg,i:IncSearch,l:Search,
- m:MoreMsg,M:ModeMsg,n:LineNr,
- N:CursorLineNr,r:Question,s:StatusLine,
- S:StatusLineNC,c:VertSplit,t:Title,
- v:Visual,w:WarningMsg,W:WildMenu,
- f:Folded,F:FoldColumn,A:DiffAdd,
- C:DiffChange,D:DiffDelete,T:DiffText,
- >:SignColumn,B:SpellBad,P:SpellCap,
- R:SpellRare,L:SpellLocal,-:Conceal,
- +:Pmenu,=:PmenuSel,x:PmenuSbar,
- X:PmenuThumb")
- global
- This option can be used to set highlighting mode for various
- occasions. It is a comma separated list of character pairs. The
- first character in a pair gives the occasion, the second the mode to
- use for that occasion. The occasions are:
- |hl-SpecialKey| 8 Meta and special keys listed with ":map"
- |hl-EndOfBuffer| ~ lines after the last line in the buffer
- |hl-TermCursor| z Cursor in a focused terminal
- |hl-TermCursorNC| Z Cursor in an unfocused terminal
- |hl-NonText| @ '@' at the end of the window and
- characters from 'showbreak'
- |hl-Directory| d directories in CTRL-D listing and other special
- things in listings
- |hl-ErrorMsg| e error messages
- |hl-IncSearch| i 'incsearch' highlighting
- |hl-Search| l last search pattern highlighting (see 'hlsearch')
- |hl-MoreMsg| m |more-prompt|
- |hl-ModeMsg| M Mode (e.g., "-- INSERT --")
- |hl-LineNr| n line number for ":number" and ":#" commands, and
- when 'number' or 'relativenumber' option is set.
- |hl-CursorLineNr| N like n for when 'cursorline' or 'relativenumber' is
- set.
- |hl-Question| r |hit-enter| prompt and yes/no questions
- |hl-StatusLine| s status line of current window |status-line|
- |hl-StatusLineNC| S status lines of not-current windows
- |hl-Title| t Titles for output from ":set all", ":autocmd" etc.
- |hl-VertSplit| c column used to separate vertically split windows
- |hl-Visual| v Visual mode
- |hl-WarningMsg| w warning messages
- |hl-WildMenu| W wildcard matches displayed for 'wildmenu'
- |hl-Folded| f line used for closed folds
- |hl-FoldColumn| F 'foldcolumn'
- |hl-DiffAdd| A added line in diff mode
- |hl-DiffChange| C changed line in diff mode
- |hl-DiffDelete| D deleted line in diff mode
- |hl-DiffText| T inserted text in diff mode
- |hl-SignColumn| > column used for |signs|
- |hl-SpellBad| B misspelled word |spell|
- |hl-SpellCap| P word that should start with capital |spell|
- |hl-SpellRare| R rare word |spell|
- |hl-SpellLocal| L word from other region |spell|
- |hl-Conceal| - the placeholders used for concealed characters
- (see 'conceallevel')
- |hl-Pmenu| + popup menu normal line
- |hl-PmenuSel| = popup menu normal line
- |hl-PmenuSbar| x popup menu scrollbar
- |hl-PmenuThumb| X popup menu scrollbar thumb
-
- The display modes are:
- r reverse (termcap entry "mr" and "me")
- i italic (termcap entry "ZH" and "ZR")
- b bold (termcap entry "md" and "me")
- s standout (termcap entry "so" and "se")
- u underline (termcap entry "us" and "ue")
- c undercurl (termcap entry "Cs" and "Ce")
- n no highlighting
- - no highlighting
- : use a highlight group
- The default is used for occasions that are not included.
- When using the ':' display mode, this must be followed by the name of
- a highlight group. A highlight group can be used to define any type
- of highlighting, including using color. See |:highlight| on how to
- define one. The default uses a different group for each occasion.
- See |highlight-default| for the default highlight groups.
-
- *'hlsearch'* *'hls'* *'nohlsearch'* *'nohls'*
-'hlsearch' 'hls' boolean (default on)
- global
- {not available when compiled without the
- |+extra_search| feature}
- When there is a previous search pattern, highlight all its matches.
- The type of highlighting used can be set with the 'l' occasion in the
- 'highlight' option. This uses the "Search" highlight group by
- default. Note that only the matching text is highlighted, any offsets
- are not applied.
- See also: 'incsearch' and |:match|.
- When you get bored looking at the highlighted matches, you can turn it
- off with |:nohlsearch|. This does not change the option value, as
- soon as you use a search command, the highlighting comes back.
- 'redrawtime' specifies the maximum time spent on finding matches.
- When the search pattern can match an end-of-line, Vim will try to
- highlight all of the matched text. However, this depends on where the
- search starts. This will be the first line in the window or the first
- line below a closed fold. A match in a previous line which is not
- drawn may not continue in a newly drawn line.
- You can specify whether the highlight status is restored on startup
- with the 'h' flag in 'shada' |shada-h|.
-
*'history'* *'hi'*
'history' 'hi' number (Vim default: 10000, Vi default: 0)
global
@@ -3378,11 +3069,28 @@ A jump table for the options with a short description can be found at |Q_op|.
This is useful if you have a non-Hebrew keyboard.
See |rileft.txt|.
+ *'hlsearch'* *'hls'* *'nohlsearch'* *'nohls'*
+'hlsearch' 'hls' boolean (default on)
+ global
+ When there is a previous search pattern, highlight all its matches.
+ The |hl-Search| highlight group determines the highlighting. Note that
+ only the matching text is highlighted, any offsets are not applied.
+ See also: 'incsearch' and |:match|.
+ When you get bored looking at the highlighted matches, you can turn it
+ off with |:nohlsearch|. This does not change the option value, as
+ soon as you use a search command, the highlighting comes back.
+ 'redrawtime' specifies the maximum time spent on finding matches.
+ When the search pattern can match an end-of-line, Vim will try to
+ highlight all of the matched text. However, this depends on where the
+ search starts. This will be the first line in the window or the first
+ line below a closed fold. A match in a previous line which is not
+ drawn may not continue in a newly drawn line.
+ You can specify whether the highlight status is restored on startup
+ with the 'h' flag in 'shada' |shada-h|.
+
*'icon'* *'noicon'*
'icon' boolean (default off, on when title can be restored)
global
- {not available when compiled without the |+title|
- feature}
When on, the icon text of the window will be set to the value of
'iconstring' (if it is not empty), or to the name of the file
currently being edited. Only the last part of the name is used.
@@ -3392,15 +3100,12 @@ A jump table for the options with a short description can be found at |Q_op|.
*'iconstring'*
'iconstring' string (default "")
global
- {not available when compiled without the |+title|
- feature}
When this option is not empty, it will be used for the icon text of
the window. This happens only when the 'icon' option is on.
Only works if the terminal supports setting window icon text
When this option contains printf-style '%' items, they will be
expanded according to the rules used for 'statusline'. See
'titlestring' for example settings.
- {not available when compiled without the |+statusline| feature}
*'ignorecase'* *'ic'* *'noignorecase'* *'noic'*
'ignorecase' 'ic' boolean (default off)
@@ -3411,17 +3116,9 @@ A jump table for the options with a short description can be found at |Q_op|.
Can be overruled by using "\c" or "\C" in the pattern, see
|/ignorecase|.
- *'imactivatefunc'* *'imaf'*
-'imactivatefunc' 'imaf' Removed. |vim-differences| {Nvim}
-
- *'imactivatekey'* *'imak'*
-'imactivatekey' 'imak' Removed. |vim-differences| {Nvim}
-
*'imcmdline'* *'imc'* *'noimcmdline'* *'noimc'*
'imcmdline' 'imc' boolean (default off)
global
- {only available when compiled with the |+xim|,
- |+multi_byte_ime| or |global-ime| features}
When set the Input Method is always on when starting to edit a command
line, unless entering a search pattern (see 'imsearch' for that).
Setting this option is useful when your input method allows entering
@@ -3431,8 +3128,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'imdisable'* *'imd'* *'noimdisable'* *'noimd'*
'imdisable' 'imd' boolean (default off, on for some systems (SGI))
global
- {only available when compiled with the |+xim|,
- |+multi_byte_ime| or |global-ime| features}
When set the Input Method is never used. This is useful to disable
the IM when it doesn't work properly.
Currently this option is on by default for SGI/IRIX machines. This
@@ -3473,14 +3168,21 @@ A jump table for the options with a short description can be found at |Q_op|.
The value is set to 1 when it is not -1 and setting the 'keymap'
option to a valid keymap name.
- *'imstatusfunc'* *'imsf'*
-'imstatusfunc' 'imsf' Removed. |vim-differences| {Nvim}
+ *'inccommand'* *'icm'*
+'inccommand' 'icm' string (default "")
+ global
+
+ "nosplit": Shows the effects of a command incrementally, as you type.
+ "split" : Also shows partial off-screen results in a preview window.
+
+ Works for |:substitute|, |:smagic|, |:snomagic|. |hl-Substitute|
+
+ If the preview is too slow (exceeds 'redrawtime') then 'inccommand' is
+ automatically disabled until |Command-line-mode| is done.
*'include'* *'inc'*
'include' 'inc' string (default "^\s*#\s*include")
global or local to buffer |global-local|
- {not available when compiled without the
- |+find_in_path| feature}
Pattern to be used to find an include command. It is a search
pattern, just like for the "/" command (See |pattern|). The default
value is for C programs. This option is used for the commands "[i",
@@ -3496,8 +3198,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'includeexpr'* *'inex'*
'includeexpr' 'inex' string (default "")
local to buffer
- {not available when compiled without the
- |+find_in_path| or |+eval| features}
Expression to be used to transform the string found with the 'include'
option to a file name. Mostly useful to change "." to "/" for Java: >
:set includeexpr=substitute(v:fname,'\\.','/','g')
@@ -3520,15 +3220,27 @@ A jump table for the options with a short description can be found at |Q_op|.
so far, matches. The matched string is highlighted. If the pattern
is invalid or not found, nothing is shown. The screen will be updated
often, this is only useful on fast terminals.
- Note that the match will be shown, but the cursor will return to its
+< Note that the match will be shown, but the cursor will return to its
original position when no match is found and when pressing <Esc>. You
still need to finish the search command with <Enter> to move the
cursor to the match.
+ You can use the CTRL-G and CTRL-T keys to move to the next and
+ previous match. |c_CTRL-G| |c_CTRL-T|
Vim only searches for about half a second. With a complicated
pattern and/or a lot of text the match may not be found. This is to
avoid that Vim hangs while you are typing the pattern.
- The highlighting can be set with the 'i' flag in 'highlight'.
- See also: 'hlsearch'.
+ The |hl-IncSearch| highlight group determines the highlighting.
+ When 'hlsearch' is on, all matched strings are highlighted too while
+ typing a search command. See also: 'hlsearch'.
+ If you don't want to turn 'hlsearch' on, but want to highlight all
+ matches while searching, you can turn on and off 'hlsearch' with
+ autocmd. Example: >
+ augroup vimrc-incsearch-highlight
+ autocmd!
+ autocmd CmdlineEnter /,\? :set hlsearch
+ autocmd CmdlineLeave /,\? :set nohlsearch
+ augroup END
+<
CTRL-L can be used to add one character from after the current match
to the command line. If 'ignorecase' and 'smartcase' are set and the
command line has no uppercase characters, the added character is
@@ -3597,7 +3309,7 @@ A jump table for the options with a short description can be found at |Q_op|.
if you want to use Vim as a modeless editor.
These Insert mode commands will be useful:
- Use the cursor keys to move around.
- - Use CTRL-O to execute one Normal mode command |i_CTRL-O|). When
+ - Use CTRL-O to execute one Normal mode command |i_CTRL-O|. When
this is a mapping, it is executed as if 'insertmode' was off.
Normal mode remains active until the mapping is finished.
- Use CTRL-L to execute a number of Normal mode commands, then use
@@ -3675,7 +3387,7 @@ A jump table for the options with a short description can be found at |Q_op|.
Identifiers are used in recognizing environment variables and after a
match of the 'define' option. It is also used for "\i" in a
|pattern|. See 'isfname' for a description of the format of this
- option.
+ option. For '@' only characters up to 255 are used.
Careful: If you change this option, it might break expanding
environment variables. E.g., when '/' is included and Vim tries to
expand "$HOME/.local/share/nvim/shada/main.shada". Maybe you should
@@ -3687,8 +3399,9 @@ A jump table for the options with a short description can be found at |Q_op|.
local to buffer
Keywords are used in searching and recognizing with many commands:
"w", "*", "[i", etc. It is also used for "\k" in a |pattern|. See
- 'isfname' for a description of the format of this option. For C
- programs you could use "a-z,A-Z,48-57,_,.,-,>".
+ 'isfname' for a description of the format of this option. For '@'
+ characters above 255 check the "word" character class.
+ For C programs you could use "a-z,A-Z,48-57,_,.,-,>".
For a help file it is set to all non-blank printable characters except
'*', '"' and '|' (so that CTRL-] on a command finds the help for that
command).
@@ -3712,7 +3425,7 @@ A jump table for the options with a short description can be found at |Q_op|.
128 - 159 "~@" - "~_"
160 - 254 "| " - "|~"
255 "~?"
- When 'encoding' is a Unicode one, illegal bytes from 128 to 255 are
+ Illegal bytes from 128 to 255 (invalid UTF-8) are
displayed as <xx>, with the hexadecimal value of the byte.
When 'display' contains "uhex" all unprintable characters are
displayed as <xx>.
@@ -3732,14 +3445,9 @@ A jump table for the options with a short description can be found at |Q_op|.
Insert two spaces after a '.', '?' and '!' with a join command.
Otherwise only one space is inserted.
- *'key'*
-'key' Removed. |vim-differences| {Nvim}
-
*'keymap'* *'kmp'* *E544*
'keymap' 'kmp' string (default "")
local to buffer
- {only available when compiled with the |+keymap|
- feature}
Name of a keyboard mapping. See |mbyte-keymap|.
Setting this option to a valid keymap name has the side effect of
setting 'iminsert' to one, so that the keymap becomes effective.
@@ -3767,7 +3475,7 @@ A jump table for the options with a short description can be found at |Q_op|.
help. (Note that previously setting the global option to the empty
value did this, which is now deprecated.)
When the first character is ":", the command is invoked as a Vim
- command prefixed with [count]. {Nvim}
+ command prefixed with [count].
When "man" or "man -s" is used, Vim will automatically translate
a [count] for the "K" command to a section number.
See |option-backslash| about including spaces and backslashes.
@@ -3780,8 +3488,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'langmap'* *'lmap'* *E357* *E358*
'langmap' 'lmap' string (default "")
global
- {only available when compiled with the |+langmap|
- feature}
This option allows switching your keyboard into a special language
mode. When you are typing text in Insert mode the characters are
inserted directly. When in Normal mode the 'langmap' option takes
@@ -3790,6 +3496,8 @@ A jump table for the options with a short description can be found at |Q_op|.
be able to execute Normal mode commands.
This is the opposite of the 'keymap' option, where characters are
mapped in Insert mode.
+ Also consider resetting 'langremap' to avoid 'langmap' applies to
+ characters resulting from a mapping.
This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons.
@@ -3823,8 +3531,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'langmenu'* *'lm'*
'langmenu' 'lm' string (default "")
global
- {only available when compiled with the |+menu| and
- |+multi_lang| features}
Language to use for menu translation. Tells which file is loaded
from the "lang" directory in 'runtimepath': >
"lang/menu_" . &langmenu . ".vim"
@@ -3844,12 +3550,12 @@ A jump table for the options with a short description can be found at |Q_op|.
:source $VIMRUNTIME/menu.vim
< Warning: This deletes all menus that you defined yourself!
- *'langnoremap'* *'lnr'*
-'langnoremap' 'lnr' boolean (default on)
+ *'langremap'* *'lrm'* *'nolangremap'* *'nolrm'*
+'langremap' 'lrm' boolean (default off)
global
- When on, setting 'langmap' does not apply to characters resulting from
+ When off, setting 'langmap' does not apply to characters resulting from
a mapping. If setting 'langmap' disables some of your mappings, make
- sure this option is set.
+ sure this option is off.
*'laststatus'* *'ls'*
'laststatus' 'ls' number (default 2)
@@ -3873,8 +3579,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'linebreak'* *'lbr'* *'nolinebreak'* *'nolbr'*
'linebreak' 'lbr' boolean (default off)
local to window
- {not available when compiled without the |+linebreak|
- feature}
If on, Vim will wrap long lines at a character in 'breakat' rather
than at the last character that fits on the screen. Unlike
'wrapmargin' and 'textwidth', this does not insert <EOL>s in the file,
@@ -3898,12 +3602,9 @@ A jump table for the options with a short description can be found at |Q_op|.
use this command to get the tallest window possible: >
:set lines=999
< Minimum value is 2, maximum value is 1000.
- If you get less lines than expected, check the 'guiheadroom' option.
- When you set this option and Vim is unable to change the physical
- number of lines of the display, the display may be messed up.
*'linespace'* *'lsp'*
-'linespace' 'lsp' number (default 0, 1 for Win32 GUI)
+'linespace' 'lsp' number (default 0)
global
{only in the GUI}
Number of pixel lines inserted between characters. Useful if the font
@@ -3917,8 +3618,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'lisp'* *'nolisp'*
'lisp' boolean (default off)
local to buffer
- {not available when compiled without the |+lispindent|
- feature}
Lisp mode: When <Enter> is typed in insert mode set the indent for
the next line to Lisp standards (well, sort of). Also happens with
"cc" or "S". 'autoindent' must also be on for this to work. The 'p'
@@ -3932,8 +3631,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'lispwords'* *'lw'*
'lispwords' 'lw' string (default is very long)
global or local to buffer |global-local|
- {not available when compiled without the |+lispindent|
- feature}
Comma separated list of words that influence the Lisp indenting.
|'lisp'|
@@ -3959,6 +3656,7 @@ A jump table for the options with a short description can be found at |Q_op|.
global
Strings to use in 'list' mode and for the |:list| command. It is a
comma separated list of string settings.
+
*lcs-eol*
eol:c Character to show at the end of each line. When
omitted, there is no extra character at the end of the
@@ -3993,16 +3691,14 @@ A jump table for the options with a short description can be found at |Q_op|.
omitted.
The characters ':' and ',' should not be used. UTF-8 characters can
- be used when 'encoding' is "utf-8", otherwise only printable
- characters are allowed. All characters must be single width.
+ be used. All characters must be single width.
Examples: >
:set lcs=tab:>-,trail:-
:set lcs=tab:>-,eol:<,nbsp:%
:set lcs=extends:>,precedes:<
-< The "NonText" highlighting will be used for "eol", "extends" and
- "precedes". "SpecialKey" for "nbsp", "space", "tab" and "trail".
- |hl-NonText| |hl-SpecialKey|
+< |hl-NonText| highlighting will be used for "eol", "extends" and
+ "precedes". |hl-Whitespace| for "nbsp", "space", "tab" and "trail".
*'lpl'* *'nolpl'* *'loadplugins'* *'noloadplugins'*
'loadplugins' 'lpl' boolean (default on)
@@ -4013,24 +3709,20 @@ A jump table for the options with a short description can be found at |Q_op|.
Note that using the "-u NONE" and "--noplugin" command line arguments
reset this option. |-u| |--noplugin|
- *'macatsui'* *'nomacatsui'*
-'macatsui' Removed. |vim-differences| {Nvim}
-
*'magic'* *'nomagic'*
'magic' boolean (default on)
global
Changes the special characters that can be used in search patterns.
See |pattern|.
- NOTE: To avoid portability problems with using patterns, always keep
- this option at the default "on". Only switch it off when working with
- old Vi scripts. In any other situation write patterns that work when
- 'magic' is on. Include "\M" when you want to |/\M|.
+ WARNING: Switching this option off most likely breaks plugins! That
+ is because many patterns assume it's on and will fail when it's off.
+ Only switch it off when working with old Vi scripts. In any other
+ situation write patterns that work when 'magic' is on. Include "\M"
+ when you want to |/\M|.
*'makeef'* *'mef'*
'makeef' 'mef' string (default: "")
global
- {not available when compiled without the |+quickfix|
- feature}
Name of the errorfile for the |:make| command (see |:make_makeprg|)
and the |:grep| command.
When it is empty, an internally generated temp file will be used.
@@ -4043,6 +3735,20 @@ A jump table for the options with a short description can be found at |Q_op|.
This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons.
+ *'makeencoding'* *'menc'*
+'makeencoding' 'menc' string (default "")
+ global or local to buffer |global-local|
+ Encoding used for reading the output of external commands. When empty,
+ encoding is not converted.
+ This is used for `:make`, `:lmake`, `:grep`, `:lgrep`, `:grepadd`,
+ `:lgrepadd`, `:cfile`, `:cgetfile`, `:caddfile`, `:lfile`, `:lgetfile`,
+ and `:laddfile`.
+
+ This would be mostly useful when you use MS-Windows. If |+iconv| is
+ enabled and GNU libiconv is used, setting 'makeencoding' to "char" has
+ the same effect as setting to the system locale encoding. Example: >
+ :set makeencoding=char " system locale is used
+<
*'makeprg'* *'mp'*
'makeprg' 'mp' string (default "make")
global or local to buffer |global-local|
@@ -4079,7 +3785,7 @@ A jump table for the options with a short description can be found at |Q_op|.
:au FileType c,cpp,java set mps+==:;
< For a more advanced way of using "%", see the matchit.vim plugin in
- the $VIMRUNTIME/macros directory. |add-local-help|
+ the $VIMRUNTIME/plugin directory. |add-local-help|
*'matchtime'* *'mat'*
'matchtime' 'mat' number (default 5)
@@ -4089,27 +3795,20 @@ A jump table for the options with a short description can be found at |Q_op|.
set a time. This is to be compatible with Nvi.
*'maxcombine'* *'mco'*
-'maxcombine' 'mco' number (default 2)
- global
- {only available when compiled with the |+multi_byte|
- feature}
- The maximum number of combining characters supported for displaying.
- Only used when 'encoding' is "utf-8".
- The default is OK for most languages. Hebrew may require 4.
- Maximum value is 6.
- Even when this option is set to 2 you can still edit text with more
- combining characters, you just can't see them. Use |g8| or |ga|.
- See |mbyte-combining|.
+'maxcombine' 'mco' Removed. |vim-differences|
+ Nvim always displays up to 6 combining characters. You can still edit
+ text with more than 6 combining characters, you just can't see them.
+ Use |g8| or |ga|. See |mbyte-combining|.
*'maxfuncdepth'* *'mfd'*
'maxfuncdepth' 'mfd' number (default 100)
global
- {not available when compiled without the |+eval|
- feature}
Maximum depth of function calls for user functions. This normally
catches endless recursion. When using a recursive function with
more depth, set 'maxfuncdepth' to a bigger number. But this will use
more memory, there is the danger of failing when memory is exhausted.
+ Increasing this limit above 200 also changes the maximum for Ex
+ command recursion, see |E169|.
See also |:function|.
*'maxmapdepth'* *'mmd'* *E223*
@@ -4121,16 +3820,6 @@ A jump table for the options with a short description can be found at |Q_op|.
because the 'w' is used before the next mapping is done. See also
|key-mapping|.
- *'maxmem'* *'mm'*
-'maxmem' 'mm' number (default between 256 to 5120 (system
- dependent) or half the amount of memory
- available)
- global
- Maximum amount of memory (in Kbyte) to use for one buffer. When this
- limit is reached allocating extra memory for a buffer will cause
- other memory to be freed. The maximum usable value is about 2000000.
- Use this to work without a limit. Also see 'maxmemtot'.
-
*'maxmempattern'* *'mmp'*
'maxmempattern' 'mmp' number (default 1000)
global
@@ -4142,27 +3831,14 @@ A jump table for the options with a short description can be found at |Q_op|.
Running into the limit often means that the pattern is very
inefficient or too complex. This may already happen with the pattern
"\(.\)*" on a very long line. ".*" works much better.
- Vim may run out of memory before hitting the 'maxmempattern' limit.
-
- *'maxmemtot'* *'mmt'*
-'maxmemtot' 'mmt' number (default between 2048 and 10240 (system
- dependent) or half the amount of memory
- available)
- global
- Maximum amount of memory in Kbyte to use for all buffers together.
- The maximum usable value is about 2000000 (2 Gbyte). Use this to work
- without a limit.
- On 64 bit machines higher values might work. But hey, do you really
- need more than 2 Gbyte for text editing? Keep in mind that text is
- stored in the swap file, one can edit files > 2 Gbyte anyway. We do
- need the memory to store undo info.
- Also see 'maxmem'.
+ Might also happen on redraw, when syntax rules try to match a complex
+ text structure.
+ Vim may run out of memory before hitting the 'maxmempattern' limit, in
+ which case you get an "Out of memory" error instead.
*'menuitems'* *'mis'*
'menuitems' 'mis' number (default 25)
global
- {not available when compiled without the |+menu|
- feature}
Maximum number of items to use in a menu. Used for menus that are
generated from a list of items, e.g., the Buffers menu. Changing this
option has no direct effect, the menu must be refreshed first.
@@ -4170,8 +3846,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'mkspellmem'* *'msm'*
'mkspellmem' 'msm' string (default "460000,2000,500")
global
- {not available when compiled without the |+syntax|
- feature}
Parameters for |:mkspell|. This tunes when to start compressing the
word tree. Compression can be slow when there are many words, but
it's needed to avoid running out of memory. The amount of memory used
@@ -4221,7 +3895,7 @@ A jump table for the options with a short description can be found at |Q_op|.
local to buffer
When off the buffer contents cannot be changed. The 'fileformat' and
'fileencoding' options also can't be changed.
- Can be reset with the |-M| command line argument.
+ Can be reset on startup with the |-M| command line argument.
*'modified'* *'mod'* *'nomodified'* *'nomod'*
'modified' 'mod' boolean (default off)
@@ -4245,6 +3919,8 @@ A jump table for the options with a short description can be found at |Q_op|.
an explanation.
When 'buftype' is "nowrite" or "nofile" this option may be set, but
will be ignored.
+ Note that the text may actually be the same, e.g. 'modified' is set
+ when using "rA" on an "A".
*'more'* *'nomore'*
'more' boolean (Vim default: on, Vi default: off)
@@ -4254,12 +3930,17 @@ A jump table for the options with a short description can be found at |Q_op|.
listing continues until finished.
*'mouse'* *E538*
-'mouse' string (default "a")
+'mouse' string (default "")
global
- Enable the use of the mouse. Only works for certain terminals.
- For using the mouse in the GUI, see |gui-mouse|. The mouse can be
- enabled for different modes:
+ Enables mouse support. For example, to enable the mouse in Normal mode
+ and Visual mode: >
+ :set mouse=nv
+<
+ To temporarily disable mouse support, hold the shift key while using
+ the mouse.
+
+ Mouse support can be enabled for different modes:
n Normal mode
v Visual mode
i Insert mode
@@ -4267,17 +3948,42 @@ A jump table for the options with a short description can be found at |Q_op|.
h all previous modes when editing a help file
a all previous modes
r for |hit-enter| and |more-prompt| prompt
- Normally you would enable the mouse in all four modes with: >
- :set mouse=a
-< When the mouse is not enabled, the GUI will still use the mouse for
- modeless selection. This doesn't move the text cursor.
- See |mouse-using|. Also see |'clipboard'|.
+ Left-click anywhere in a text buffer to place the cursor there. This
+ works with operators too, e.g. type |d| then left-click to delete text
+ from the current cursor position to the position where you clicked.
+
+ Drag the |status-line| or vertical separator of a window to resize it.
+
+ If enabled for "v" (Visual mode) then double-click selects word-wise,
+ triple-click makes it line-wise, and quadruple-click makes it
+ rectangular block-wise.
+
+ For scrolling with a mouse wheel see |scroll-mouse-wheel|.
Note: When enabling the mouse in a terminal, copy/paste will use the
- "* register if there is access to an X-server. The xterm handling of
- the mouse buttons can still be used by keeping the shift key pressed.
- Also see the 'clipboard' option.
+ "* register if possible. See also 'clipboard'.
+
+ Related options:
+ 'mousefocus' window focus follows mouse pointer
+ 'mousemodel' what mouse button does which action
+ 'mousehide' hide mouse pointer while typing text
+ 'selectmode' whether to start Select mode or Visual mode
+
+ The :behave command provides some "profiles" for mouse behavior.
+ *:behave* *:be*
+ :be[have] {model} Set behavior for mouse and selection. Valid
+ arguments are:
+ mswin MS-Windows behavior
+ xterm Xterm behavior
+
+ Using ":behave" changes these options:
+ option mswin xterm ~
+ 'selectmode' "mouse,key" ""
+ 'mousemodel' "popup" "extend"
+ 'keymodel' "startsel,stopsel" ""
+ 'selection' "exclusive" "inclusive"
+
*'mousefocus'* *'mousef'* *'nomousefocus'* *'nomousef'*
'mousefocus' 'mousef' boolean (default off)
@@ -4297,7 +4003,7 @@ A jump table for the options with a short description can be found at |Q_op|.
The mouse pointer is restored when the mouse is moved.
*'mousemodel'* *'mousem'*
-'mousemodel' 'mousem' string (default "extend", "popup" for Windows)
+'mousemodel' 'mousem' string (default "extend")
global
Sets the model to use for the mouse. The name mostly specifies what
the right mouse button is used for:
@@ -4324,10 +4030,30 @@ A jump table for the options with a short description can be found at |Q_op|.
In the "popup" model the right mouse button produces a pop-up menu.
You need to define this first, see |popup-menu|.
+ In a terminal the popup menu works if Vim is compiled with the
+ |+insert_expand| option.
Note that you can further refine the meaning of buttons with mappings.
- See |gui-mouse-mapping|. But mappings are NOT used for modeless
- selection (because that's handled in the GUI code directly).
+ See |mouse-overview|. But mappings are NOT used for modeless selection.
+
+ Example: >
+ :map <S-LeftMouse> <RightMouse>
+ :map <S-LeftDrag> <RightDrag>
+ :map <S-LeftRelease> <RightRelease>
+ :map <2-S-LeftMouse> <2-RightMouse>
+ :map <2-S-LeftDrag> <2-RightDrag>
+ :map <2-S-LeftRelease> <2-RightRelease>
+ :map <3-S-LeftMouse> <3-RightMouse>
+ :map <3-S-LeftDrag> <3-RightDrag>
+ :map <3-S-LeftRelease> <3-RightRelease>
+ :map <4-S-LeftMouse> <4-RightMouse>
+ :map <4-S-LeftDrag> <4-RightDrag>
+ :map <4-S-LeftRelease> <4-RightRelease>
+<
+ Mouse commands requiring the CTRL modifier can be simulated by typing
+ the "g" key before using the mouse:
+ "g<LeftMouse>" is "<C-LeftMouse> (jump to tag under mouse click)
+ "g<RightMouse>" is "<C-RightMouse> ("CTRL-T")
The 'mousemodel' option is set by the |:behave| command.
@@ -4335,8 +4061,6 @@ A jump table for the options with a short description can be found at |Q_op|.
'mouseshape' 'mouses' string (default "i:beam,r:beam,s:updown,sd:cross,
m:no,ml:up-arrow,v:rightup-arrow")
global
- {only available when compiled with the |+mouseshape|
- feature}
This option tells Vim what the mouse pointer should look like in
different modes. The option is a comma separated list of parts, much
like used for 'guicursor'. Each part consist of a mode/location-list
@@ -4399,9 +4123,8 @@ A jump table for the options with a short description can be found at |Q_op|.
*'mousetime'* *'mouset'*
'mousetime' 'mouset' number (default 500)
global
- Only for GUI, Windows and Unix with xterm. Defines the maximum
- time in msec between two mouse clicks for the second click to be
- recognized as a multi click.
+ Defines the maximum time in msec between two mouse clicks for the
+ second click to be recognized as a multi click.
*'nrformats'* *'nf'*
'nrformats' 'nf' string (default "bin,hex")
@@ -4411,7 +4134,7 @@ A jump table for the options with a short description can be found at |Q_op|.
respectively; see |CTRL-A| for more info on these commands.
alpha If included, single alphabetical characters will be
incremented or decremented. This is useful for a list with a
- letter index a), b), etc. *octal-nrformats*
+ letter index a), b), etc. *octal-nrformats*
octal If included, numbers that start with a zero will be considered
to be octal. Example: Using CTRL-A on "007" results in "010".
hex If included, numbers starting with "0x" or "0X" will be
@@ -4430,18 +4153,17 @@ A jump table for the options with a short description can be found at |Q_op|.
Print the line number in front of each line. When the 'n' option is
excluded from 'cpoptions' a wrapped line will not use the column of
line numbers.
- The 'numberwidth' option can be used to set the room used for the line
- number.
+ Use the 'numberwidth' option to adjust the room for the line number.
When a long, wrapped line doesn't start with the first character, '-'
characters are put before the number.
- See |hl-LineNr| and |hl-CursorLineNr| for the highlighting used for
- the number.
+ For highlighting see |hl-LineNr|, |hl-CursorLineNr|, and the
+ |:sign-define| "numhl" argument.
*number_relativenumber*
The 'relativenumber' option changes the displayed number to be
relative to the cursor. Together with 'number' there are these
four combinations (cursor in line 3):
- 'nonu' 'nu' 'nonu' 'nu'
+ 'nonu' 'nu' 'nonu' 'nu'
'nornu' 'nornu' 'rnu' 'rnu'
|apple | 1 apple | 2 apple | 2 apple
@@ -4452,8 +4174,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'numberwidth'* *'nuw'*
'numberwidth' 'nuw' number (Vim default: 4 Vi default: 8)
local to window
- {only available when compiled with the |+linebreak|
- feature}
Minimal number of columns to use for the line number. Only relevant
when the 'number' or 'relativenumber' option is set or printing lines
with a line number. Since one space is always between the number and
@@ -4468,8 +4188,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'omnifunc'* *'ofu'*
'omnifunc' 'ofu' string (default: empty)
local to buffer
- {not available when compiled without the |+eval|
- or |+insert_expand| features}
This option specifies a function to be used for Insert mode omni
completion with CTRL-X CTRL-O. |i_CTRL-X_CTRL-O|
See |complete-functions| for an explanation of how the function is
@@ -4502,7 +4220,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'packpath'* *'pp'*
'packpath' 'pp' string (default: see 'runtimepath')
- {not in Vi}
Directories used to find packages. See |packages|.
@@ -4515,7 +4232,7 @@ A jump table for the options with a short description can be found at |Q_op|.
*'paste'* *'nopaste'*
'paste' boolean (default off)
global
- You probably don't have to set this option: |bracketed-paste-mode|.
+ This option is obsolete; |bracketed-paste-mode| is built-in.
Put Vim in Paste mode. This is useful if you want to cut or copy
some text from one window and paste it in Vim. This will avoid
@@ -4579,7 +4296,8 @@ A jump table for the options with a short description can be found at |Q_op|.
Note that typing <F10> in paste mode inserts "<F10>", since in paste
mode everything is inserted literally, except the 'pastetoggle' key
sequence.
- When the value has several bytes 'ttimeoutlen' applies.
+ No timeout is used, this means that a multi-key 'pastetoggle' can not
+ be triggered manually.
*'pex'* *'patchexpr'*
'patchexpr' 'pex' string (default "")
@@ -4596,11 +4314,11 @@ A jump table for the options with a short description can be found at |Q_op|.
copy of the original file will be kept. The name of the copy is the
name of the original file with the string in the 'patchmode' option
appended. This option should start with a dot. Use a string like
- ".org". 'backupdir' must not be empty for this to work (Detail: The
- backup file is renamed to the patchmode file after the new file has
- been successfully written, that's why it must be possible to write a
- backup file). If there was no file to be backed up, an empty file is
- created.
+ ".orig" or ".org". 'backupdir' must not be empty for this to work
+ (Detail: The backup file is renamed to the patchmode file after the
+ new file has been successfully written, that's why it must be possible
+ to write a backup file). If there was no file to be backed up, an
+ empty file is created.
When the 'backupskip' pattern matches, a patchmode file is not made.
Using 'patchmode' for compressed files appends the extension at the
end (e.g., "file.gz.orig"), thus the resulting name isn't always
@@ -4636,7 +4354,6 @@ A jump table for the options with a short description can be found at |Q_op|.
"http://www.vim.org" will make ":find index.html" work.
- Search upwards and downwards in a directory tree using "*", "**" and
";". See |file-searching| for info and syntax.
- {not available when compiled without the |+path_extra| feature}
- Careful with '\' characters, type two to get one in the option: >
:set path=.,c:\\include
< Or just use '/' instead: >
@@ -4679,8 +4396,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'previewheight'* *'pvh'*
'previewheight' 'pvh' number (default 12)
global
- {not available when compiled without the |+windows| or
- |+quickfix| features}
Default height for a preview window. Used for |:ptag| and associated
commands. Used for |CTRL-W_}| when no count is given.
@@ -4688,8 +4403,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'pvw'* *'nopvw'* *E590*
'previewwindow' 'pvw' boolean (default off)
local to window
- {not available when compiled without the |+windows| or
- |+quickfix| features}
Identifies the preview window. Only one window can have this option
set. It's normally not set directly, but by using one of the commands
|:ptag|, |:pedit|, etc.
@@ -4697,65 +4410,52 @@ A jump table for the options with a short description can be found at |Q_op|.
*'printdevice'* *'pdev'*
'printdevice' 'pdev' string (default empty)
global
- {only available when compiled with the |+printer|
- feature}
The name of the printer to be used for |:hardcopy|.
See |pdev-option|.
This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons.
*'printencoding'* *'penc'*
-'printencoding' 'penc' String (default empty, except for some systems)
+'printencoding' 'penc' string (default empty, except for some systems)
global
- {only available when compiled with the |+printer|
- and |+postscript| features}
Sets the character encoding used when printing.
See |penc-option|.
*'printexpr'* *'pexpr'*
-'printexpr' 'pexpr' String (default: see below)
+'printexpr' 'pexpr' string (default: see below)
global
- {only available when compiled with the |+printer|
- and |+postscript| features}
Expression used to print the PostScript produced with |:hardcopy|.
See |pexpr-option|.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
*'printfont'* *'pfn'*
'printfont' 'pfn' string (default "courier")
global
- {only available when compiled with the |+printer|
- feature}
The name of the font that will be used for |:hardcopy|.
See |pfn-option|.
*'printheader'* *'pheader'*
'printheader' 'pheader' string (default "%<%f%h%m%=Page %N")
global
- {only available when compiled with the |+printer|
- feature}
The format of the header produced in |:hardcopy| output.
See |pheader-option|.
*'printmbcharset'* *'pmbcs'*
'printmbcharset' 'pmbcs' string (default "")
global
- {only available when compiled with the |+printer|,
- |+postscript| and |+multi_byte| features}
The CJK character set to be used for CJK output from |:hardcopy|.
See |pmbcs-option|.
*'printmbfont'* *'pmbfn'*
'printmbfont' 'pmbfn' string (default "")
global
- {only available when compiled with the |+printer|,
- |+postscript| and |+multi_byte| features}
List of font names to be used for CJK output from |:hardcopy|.
See |pmbfn-option|.
*'printoptions'* *'popt'*
'printoptions' 'popt' string (default "")
global
- {only available when compiled with |+printer| feature}
List of items that control the format of the output of |:hardcopy|.
See |popt-option|.
@@ -4767,12 +4467,34 @@ A jump table for the options with a short description can be found at |Q_op|.
*'pumheight'* *'ph'*
'pumheight' 'ph' number (default 0)
global
- {not available when compiled without the
- |+insert_expand| feature}
Determines the maximum number of items to show in the popup menu for
Insert mode completion. When zero as much space as available is used.
|ins-completion-menu|.
+ *'pyxversion'* *'pyx'*
+'pyxversion' 'pyx' number (default depends on the build)
+ global
+ Specifies the python version used for pyx* functions and commands
+ |python_x|. The default value is as follows:
+
+ |provider| installed Default ~
+ |+python| and |+python3| 0
+ only |+python| 2
+ only |+python3| 3
+
+ Available values are 0, 2 and 3.
+ If 'pyxversion' is 0, it is set to 2 or 3 after the first execution of
+ any python2/3 commands or functions. E.g. `:py` sets to 2, and `:py3`
+ sets to 3. `:pyx` sets it to 3 if Python 3 is available, otherwise sets
+ to 2 if Python 2 is available.
+ See also: |has-pythonx|
+
+ If only |+python| or |+python3| are available,
+ 'pyxversion' has no effect. The pyx* functions and commands are
+ always the same as the installed version.
+
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
*'quoteescape'* *'qe'*
'quoteescape' 'qe' string (default "\")
@@ -4793,14 +4515,13 @@ A jump table for the options with a short description can be found at |Q_op|.
buffer, unless the 'Z' flag is in 'cpoptions'.
When using the ":view" command the 'readonly' option is
set for the newly edited buffer.
+ See 'modifiable' for disallowing changes to the buffer.
*'redrawtime'* *'rdt'*
'redrawtime' 'rdt' number (default 2000)
global
- {only available when compiled with the |+reltime|
- feature}
- The time in milliseconds for redrawing the display. This applies to
- searching for patterns for 'hlsearch' and |:match| highlighting.
+ Time in milliseconds for redrawing the display. Applies to
+ 'hlsearch', 'inccommand' and |:match| highlighting.
When redrawing takes more than this many milliseconds no further
matches will be highlighted. This is used to avoid that Vim hangs
when using a very complicated pattern.
@@ -4860,9 +4581,6 @@ A jump table for the options with a short description can be found at |Q_op|.
For the ":substitute" command the number of substitutions is used
instead of the number of lines.
- *'restorescreen'* *'rs'* *'norestorescreen'* *'nors'*
-'restorescreen' 'rs' Removed. |vim-differences| {Nvim}
-
*'revins'* *'ri'* *'norevins'* *'nori'*
'revins' 'ri' boolean (default off)
global
@@ -4897,10 +4615,8 @@ A jump table for the options with a short description can be found at |Q_op|.
The 'rightleft' option must be set for 'rightleftcmd' to take effect.
*'ruler'* *'ru'* *'noruler'* *'noru'*
-'ruler' 'ru' boolean (default off)
+'ruler' 'ru' boolean (default on)
global
- {not available when compiled without the
- |+cmdline_info| feature}
Show the line and column number of the cursor position, separated by a
comma. When there is room, the relative position of the displayed
text in the file is shown on the far right:
@@ -4927,8 +4643,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'rulerformat'* *'ruf'*
'rulerformat' 'ruf' string (default empty)
global
- {not available when compiled without the |+statusline|
- feature}
When this option is not empty, it determines the content of the ruler
string, as displayed for the 'ruler' option.
The format of this option is like that of 'statusline'.
@@ -4970,6 +4684,7 @@ A jump table for the options with a short description can be found at |Q_op|.
keymap/ key mapping files |mbyte-keymap|
lang/ menu translations |:menutrans|
menu.vim GUI menus |menu.vim|
+ pack/ packages |:packadd|
plugin/ plugin scripts |write-plugin|
print/ files for printing |postscript-print-encoding|
spell/ spell checking files |spell|
@@ -4996,6 +4711,10 @@ A jump table for the options with a short description can be found at |Q_op|.
ordering. This is for preferences to overrule or add to the
distributed defaults or system-wide settings (rarely needed).
+ More entries are added when using |packages|. If it gets very long
+ then `:set rtp` will be truncated, use `:echo &rtp` to see the full
+ string.
+
Note that, unlike 'path', no wildcards like "**" are allowed. Normal
wildcards are allowed, but can significantly slow down searching for
runtime files. For speed, use as few items as possible and avoid
@@ -5012,6 +4731,8 @@ A jump table for the options with a short description can be found at |Q_op|.
to find files which replace a distributed runtime files. You can put
a directory after $VIMRUNTIME to find files which add to distributed
runtime files.
+ When Vim is started with |--clean| the home directory entries are not
+ included.
This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons.
@@ -5024,11 +4745,19 @@ A jump table for the options with a short description can be found at |Q_op|.
be used as the new value for 'scroll'. Reset to half the window
height with ":set scroll=0".
+ *'scrollback'* *'scbk'*
+'scrollback' 'scbk' number (default: 10000
+ in normal buffers: -1)
+ local to buffer
+ Maximum number of lines kept beyond the visible screen. Lines at the
+ top are deleted if new lines exceed this limit.
+ Only in |terminal| buffers.
+ -1 means "unlimited" for normal buffers, 100000 otherwise.
+ Minimum is 1.
+
*'scrollbind'* *'scb'* *'noscrollbind'* *'noscb'*
'scrollbind' 'scb' boolean (default off)
local to window
- {not available when compiled without the |+scrollbind|
- feature}
See also |scroll-binding|. When this option is set, the current
window scrolls as other scrollbind windows (windows that also have
this option set) scroll. This option is useful for viewing the
@@ -5062,8 +4791,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'scrollopt'* *'sbo'*
'scrollopt' 'sbo' string (default "ver,jump")
global
- {not available when compiled without the |+scrollbind|
- feature}
This is a comma-separated list of words that specifies how
'scrollbind' windows should behave. 'sbo' stands for ScrollBind
Options.
@@ -5127,6 +4854,8 @@ A jump table for the options with a short description can be found at |Q_op|.
"inclusive" means that the last character of the selection is included
in an operation. For example, when "x" is used to delete the
selection.
+ When "old" is used and 'virtualedit' allows the cursor to move past
+ the end of line the line break still isn't included.
Note that when "exclusive" is used and selecting from the end
backwards, you cannot include the last character of a line, when
starting in Normal mode and 'virtualedit' empty.
@@ -5178,6 +4907,8 @@ A jump table for the options with a short description can be found at |Q_op|.
tabpages all tab pages; without this only the current tab page
is restored, so that you can make a session for each
tab page separately
+ terminal include terminal windows where the command can be
+ restored
unix with Unix end-of-line format (single <NL>), even when
on Windows or DOS
winpos position of the whole Vim window
@@ -5250,8 +4981,8 @@ A jump table for the options with a short description can be found at |Q_op|.
saved. When not included, the value of 'history' is used.
*shada-c*
c Dummy option, kept for compatibility reasons. Has no actual
- effect. Current encoding state is described in
- |shada-encoding|.
+ effect: ShaDa always uses UTF-8 and 'encoding' value is fixed
+ to UTF-8 as well.
*shada-f*
f Whether file marks need to be stored. If zero, file marks ('0
to '9, 'A to 'Z) are not stored. When not present or when
@@ -5263,10 +4994,10 @@ A jump table for the options with a short description can be found at |Q_op|.
has been used since the last search command.
*shada-n*
n Name of the shada file. The name must immediately follow
- the 'n'. Must be the last one! If the "-i" argument was
- given when starting Vim, that file name overrides the one
- given here with 'shada'. Environment variables are expanded
- when opening the file, not when setting the option.
+ the 'n'. Must be at the end of the option! If the "-i"
+ argument was given when starting Vim, that file name overrides
+ the one given here with 'shada'. Environment variables are
+ expanded when opening the file, not when setting the option.
*shada-r*
r Removable media. The argument is a string (up to the next
','). This parameter can be given several times. Each
@@ -5345,17 +5076,19 @@ A jump table for the options with a short description can be found at |Q_op|.
to escape quote: 'a\"b"' is the same as "a\b".
Note that such processing is done after |:set| did its own round of
unescaping, so to keep yourself sane use |:let-&| like shown above.
+ *shell-powershell*
+ To use powershell (on Windows): >
+ set shell=powershell shellquote=( shellpipe=\| shellredir=> shellxquote=
+ set shellcmdflag=-NoLogo\ -NoProfile\ -ExecutionPolicy\ RemoteSigned\ -Command
- This option cannot be set from a |modeline| or in the |sandbox|, for
+< This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons.
*'shellcmdflag'* *'shcf'*
-'shellcmdflag' 'shcf' string (default: "-c";
- Windows, when 'shell' does not
- contain "sh" somewhere: "/c")
+'shellcmdflag' 'shcf' string (default: "-c"; Windows: "/s /c")
global
Flag passed to the shell to execute "!" and ":!" commands; e.g.,
- "bash.exe -c ls" or "cmd.exe /c dir". For Windows
+ `bash.exe -c ls` or `cmd.exe /s /c "dir"`. For Windows
systems, the default is set according to the value of 'shell', to
reduce the need to set this option by the user.
On Unix it can have more than one flag. Each white space separated
@@ -5363,15 +5096,12 @@ A jump table for the options with a short description can be found at |Q_op|.
See |option-backslash| about including spaces and backslashes.
See |shell-unquoting| which talks about separating this option into
multiple arguments.
- Also see |dos-shell| for Windows.
This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons.
*'shellpipe'* *'sp'*
'shellpipe' 'sp' string (default ">", "| tee", "|& tee" or "2>&1| tee")
global
- {not available when compiled without the |+quickfix|
- feature}
String to be used to put the output of the ":make" command in the
error file. See also |:make_makeprg|. See |option-backslash| about
including spaces and backslashes.
@@ -5413,7 +5143,7 @@ A jump table for the options with a short description can be found at |Q_op|.
third-party shells on Windows systems, such as the MKS Korn Shell
or bash, where it should be "\"". The default is adjusted according
the value of 'shell', to reduce the need to set this option by the
- user. See |dos-shell|.
+ user.
This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons.
@@ -5445,7 +5175,7 @@ A jump table for the options with a short description can be found at |Q_op|.
*'shellslash'* *'ssl'* *'noshellslash'* *'nossl'*
'shellslash' 'ssl' boolean (default off)
global
- {only for MSDOS and MS-Windows}
+ {only for Windows}
When set, a forward slash is used when expanding file names. This is
useful when a Unix-like shell is used instead of command.com or
cmd.exe. Backward slashes can still be typed, but they are changed to
@@ -5462,31 +5192,24 @@ A jump table for the options with a short description can be found at |Q_op|.
global
When on, use temp files for shell commands. When off use a pipe.
When using a pipe is not possible temp files are used anyway.
- Currently a pipe is only supported on Unix and MS-Windows 2K and
- later. You can check it with: >
- :if has("filterpipe")
-< The advantage of using a pipe is that nobody can read the temp file
+ The advantage of using a pipe is that nobody can read the temp file
and the 'shell' command does not need to support redirection.
The advantage of using a temp file is that the file type and encoding
can be detected.
The |FilterReadPre|, |FilterReadPost| and |FilterWritePre|,
|FilterWritePost| autocommands event are not triggered when
'shelltemp' is off.
+ |system()| does not respect this option, it always uses pipes.
*'shellxescape'* *'sxe'*
-'shellxescape' 'sxe' string (default: "";
- for Windows: "\"&|<>()@^")
+'shellxescape' 'sxe' string (default: "")
global
When 'shellxquote' is set to "(" then the characters listed in this
option will be escaped with a '^' character. This makes it possible
to execute most external commands with cmd.exe.
*'shellxquote'* *'sxq'*
-'shellxquote' 'sxq' string (default: "";
- for Win32, when 'shell' is cmd.exe: "("
- for Win32, when 'shell' contains "sh"
- somewhere: "\""
- for Unix, when using system(): "\"")
+'shellxquote' 'sxq' string (default: "", Windows: "\"")
global
Quoting character(s), put around the command passed to the shell, for
the "!" and ":!" commands. Includes the redirection. See
@@ -5495,12 +5218,6 @@ A jump table for the options with a short description can be found at |Q_op|.
When the value is '(' then ')' is appended. When the value is '"('
then ')"' is appended.
When the value is '(' then also see 'shellxescape'.
- This is an empty string by default on most systems, but is known to be
- useful for on Win32 version, either for cmd.exe which automatically
- strips off the first and last quote on a command, or 3rd-party shells
- such as the MKS Korn Shell or bash, where it should be "\"". The
- default is adjusted according the value of 'shell', to reduce the need
- to set this option by the user. See |dos-shell|.
This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons.
@@ -5520,7 +5237,7 @@ A jump table for the options with a short description can be found at |Q_op|.
function to get the effective shiftwidth value.
*'shortmess'* *'shm'*
-'shortmess' 'shm' string (Vim default "filnxtToO", Vi default: "")
+'shortmess' 'shm' string (Vim default "filnxtToOF", Vi default: "")
global
This option helps to avoid all the |hit-enter| prompts caused by file
messages, for example with CTRL-G, and to avoid some other messages.
@@ -5570,14 +5287,9 @@ A jump table for the options with a short description can be found at |Q_op|.
shm=a Abbreviation, but no loss of information.
shm=at Abbreviation, and truncate message when necessary.
- *'shortname'* *'sn'* *'noshortname'* *'nosn'*
-'shortname' 'sn' Removed. |vim-differences| {Nvim}
-
*'showbreak'* *'sbr'* *E595*
'showbreak' 'sbr' string (default "")
global
- {not available when compiled without the |+linebreak|
- feature}
String to put at the start of lines that have been wrapped. Useful
values are "> " or "+++ ": >
:set showbreak=>\
@@ -5587,18 +5299,14 @@ A jump table for the options with a short description can be found at |Q_op|.
< Only printable single-cell characters are allowed, excluding <Tab> and
comma (in a future version the comma might be used to separate the
part that is shown at the end and at the start of a line).
- The characters are highlighted according to the '@' flag in
- 'highlight'.
+ The |hl-NonText| highlight group determines the highlighting.
Note that tabs after the showbreak will be displayed differently.
If you want the 'showbreak' to appear in between line numbers, add the
"n" flag to 'cpoptions'.
*'showcmd'* *'sc'* *'noshowcmd'* *'nosc'*
-'showcmd' 'sc' boolean (Vim default: on (off for Unix),
- Vi default: off)
+'showcmd' 'sc' boolean (Vim default: on, Vi default: off)
global
- {not available when compiled without the
- |+cmdline_info| feature}
Show (partial) command in the last line of the screen. Set this
option off if your terminal is slow.
In Visual mode the size of the selected area is shown:
@@ -5646,16 +5354,11 @@ A jump table for the options with a short description can be found at |Q_op|.
'showmode' 'smd' boolean (Vim default: on, Vi default: off)
global
If in Insert, Replace or Visual mode put a message on the last line.
- Use the 'M' flag in 'highlight' to set the type of highlighting for
- this message.
- When |XIM| may be used the message will include "XIM". But this
- doesn't mean XIM is really active.
+ The |hl-ModeMsg| highlight group determines the highlighting.
*'showtabline'* *'stal'*
'showtabline' 'stal' number (default 1)
global
- {not available when compiled without the |+windows|
- feature}
The value of this option specifies when the line with tab page labels
will be displayed:
0: never
@@ -5666,14 +5369,13 @@ A jump table for the options with a short description can be found at |Q_op|.
See |tab-page| for more information about tab pages.
*'sidescroll'* *'ss'*
-'sidescroll' 'ss' number (default 0)
+'sidescroll' 'ss' number (default 1)
global
The minimal number of columns to scroll horizontally. Used only when
the 'wrap' option is off and the cursor is moved off of the screen.
When it is zero the cursor will be put in the middle of the screen.
- When using a slow terminal set it to a large number or 0. When using
- a fast terminal use a small number or 1. Not used for "zh" and "zl"
- commands.
+ When using a slow terminal set it to a large number or 0. Not used
+ for "zh" and "zl" commands.
*'sidescrolloff'* *'siso'*
'sidescrolloff' 'siso' number (default 0)
@@ -5689,10 +5391,18 @@ A jump table for the options with a short description can be found at |Q_op|.
Example: Try this together with 'sidescroll' and 'listchars' as
in the following example to never allow the cursor to move
- onto the "extends" character:
+ onto the "extends" character: >
:set nowrap sidescroll=1 listchars=extends:>,precedes:<
:set sidescrolloff=1
+<
+ *'signcolumn'* *'scl'*
+'signcolumn' 'scl' string (default "auto")
+ local to window
+ Whether or not to draw the signcolumn. Valid values are:
+ "auto" only when there is a sign to display
+ "no" never
+ "yes" always
*'smartcase'* *'scs'* *'nosmartcase'* *'noscs'*
@@ -5708,8 +5418,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'smartindent'* *'si'* *'nosmartindent'* *'nosi'*
'smartindent' 'si' boolean (default off)
local to buffer
- {not available when compiled without the
- |+smartindent| feature}
Do smart autoindenting when starting a new line. Works for C-like
programs, but can also be used for other languages. 'cindent' does
something like this, works better in most cases, but is more strict,
@@ -5769,16 +5477,12 @@ A jump table for the options with a short description can be found at |Q_op|.
*'spell'* *'nospell'*
'spell' boolean (default off)
local to window
- {not available when compiled without the |+syntax|
- feature}
When on spell checking will be done. See |spell|.
The languages are specified with 'spelllang'.
*'spellcapcheck'* *'spc'*
'spellcapcheck' 'spc' string (default "[.?!]\_[\])'" \t]\+")
local to buffer
- {not available when compiled without the |+syntax|
- feature}
Pattern to locate the end of a sentence. The following word will be
checked to start with a capital letter. If not then it is highlighted
with SpellCap |hl-SpellCap| (unless the word is also badly spelled).
@@ -5792,8 +5496,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'spellfile'* *'spf'*
'spellfile' 'spf' string (default empty)
local to buffer
- {not available when compiled without the |+syntax|
- feature}
Name of the word list file where words are added for the |zg| and |zw|
commands. It must end in ".{encoding}.add". You need to include the
path, otherwise the file is placed in the current directory.
@@ -5818,8 +5520,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'spelllang'* *'spl'*
'spelllang' 'spl' string (default "en")
local to buffer
- {not available when compiled without the |+syntax|
- feature}
A comma separated list of word list names. When the 'spell' option is
on spellchecking will be done for these languages. Example: >
set spelllang=en_us,nl,medical
@@ -5843,9 +5543,6 @@ A jump table for the options with a short description can be found at |Q_op|.
(_xx is an underscore, two letters and followed by a non-letter).
This is mainly for testing purposes. You must make sure the correct
encoding is used, Vim doesn't check it.
- When 'encoding' is set the word lists are reloaded. Thus it's a good
- idea to set 'spelllang' after setting 'encoding' to avoid loading the
- files twice.
How the related spell files are found is explained here: |spell-load|.
If the |spellfile.vim| plugin is active and you use a language name
@@ -5861,8 +5558,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'spellsuggest'* *'sps'*
'spellsuggest' 'sps' string (default "best")
global
- {not available when compiled without the |+syntax|
- feature}
Methods used for spelling suggestions. Both for the |z=| command and
the |spellsuggest()| function. This is a comma-separated list of
items:
@@ -5907,7 +5602,7 @@ A jump table for the options with a short description can be found at |Q_op|.
word. The expression must evaluate to a List of
Lists, each with a suggestion and a score.
Example:
- [['the', 33], ['that', 44]]
+ [['the', 33], ['that', 44]] ~
Set 'verbose' and use |z=| to see the scores that the
internal methods use. A lower score is better.
This may invoke |spellsuggest()| if you temporarily
@@ -5926,8 +5621,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'splitbelow'* *'sb'* *'nosplitbelow'* *'nosb'*
'splitbelow' 'sb' boolean (default off)
global
- {not available when compiled without the |+windows|
- feature}
When on, splitting a window will put the new window below the current
one. |:split|
@@ -5953,8 +5646,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'statusline'* *'stl'* *E540* *E542*
'statusline' 'stl' string (default empty)
global or local to window |global-local|
- {not available when compiled without the |+statusline|
- feature}
When nonempty, this option determines the content of the status line.
Also see |status-line|.
@@ -6101,7 +5792,7 @@ A jump table for the options with a short description can be found at |Q_op|.
line is displayed. The current buffer and current window will be set
temporarily to that of the window (and buffer) whose statusline is
currently being drawn. The expression will evaluate in this context.
- The variable "actual_curbuf" is set to the 'bufnr()' number of the
+ The variable "g:actual_curbuf" is set to the `bufnr()` number of the
real current buffer.
The 'statusline' option will be evaluated in the |sandbox| if set from
@@ -6159,8 +5850,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'suffixesadd'* *'sua'*
'suffixesadd' 'sua' string (default "")
local to buffer
- {not available when compiled without the
- |+file_in_path| feature}
Comma separated list of suffixes, which are used when searching for a
file for the "gf", "[I", etc. commands. Example: >
:set suffixesadd=.java
@@ -6182,13 +5871,11 @@ A jump table for the options with a short description can be found at |Q_op|.
Also see |swap-file|.
If you want to open a new buffer without creating a swap file for it,
use the |:noswapfile| modifier.
+ See 'directory' for where the swap file is created.
This option is used together with 'bufhidden' and 'buftype' to
specify special kinds of buffers. See |special-buffers|.
- *'swapsync'* *'sws'*
-'swapsync' 'sws' Removed. |vim-differences| {Nvim}
-
*'switchbuf'* *'swb'*
'switchbuf' 'swb' string (default "")
global
@@ -6213,8 +5900,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'synmaxcol'* *'smc'*
'synmaxcol' 'smc' number (default 3000)
local to buffer
- {not available when compiled without the |+syntax|
- feature}
Maximum column in which to search for syntax items. In long lines the
text after this column is not highlighted and following lines may not
be highlighted correctly, because the syntax state is cleared.
@@ -6225,8 +5910,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'syntax'* *'syn'*
'syntax' 'syn' string (default empty)
local to buffer
- {not available when compiled without the |+syntax|
- feature}
When this option is set, the syntax with this name is loaded, unless
syntax highlighting has been switched off with ":syntax off".
Otherwise this option does not always reflect the current syntax (the
@@ -6254,8 +5937,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'tabline'* *'tal'*
'tabline' 'tal' string (default empty)
global
- {not available when compiled without the |+windows|
- feature}
When nonempty, this option determines the content of the tab pages
line at the top of the Vim window. When empty Vim will use a default
tab pages line. See |setting-tabline| for more info.
@@ -6277,8 +5958,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'tabpagemax'* *'tpm'*
'tabpagemax' 'tpm' number (default 50)
global
- {not available when compiled without the |+windows|
- feature}
Maximum number of tab pages to be opened by the |-p| command line
argument or the ":tab all" command. |tabpage|
@@ -6348,6 +6027,9 @@ A jump table for the options with a short description can be found at |Q_op|.
By default, tag searches are case-sensitive. Case is ignored when
'ignorecase' is set and 'tagcase' is "followic", or when 'tagcase' is
"ignore".
+ Also when 'tagcase' is "followscs" and 'smartcase' is set, or
+ 'tagcase' is "smart", and the pattern contains only lowercase
+ characters.
When 'tagbsearch' is off, tags searching is slower when a full match
exists, but faster when no full match exists. Tags in unsorted tags
@@ -6361,12 +6043,13 @@ A jump table for the options with a short description can be found at |Q_op|.
*'tagcase'* *'tc'*
'tagcase' 'tc' string (default "followic")
global or local to buffer |global-local|
- {not in Vi}
This option specifies how case is handled when searching the tags
file:
followic Follow the 'ignorecase' option
+ followscs Follow the 'smartcase' and 'ignorecase' options
ignore Ignore case
match Match case
+ smart Ignore case unless an upper case letter is used
*'taglength'* *'tl'*
'taglength' 'tl' number (default 0)
@@ -6393,8 +6076,7 @@ A jump table for the options with a short description can be found at |Q_op|.
a directory tree. See |file-searching|. E.g., "/lib/**/tags" will
find all files named "tags" below "/lib". The filename itself cannot
contain wildcards, it is used as-is. E.g., "/lib/**/tags?" will find
- files called "tags?". {not available when compiled without the
- |+path_extra| feature}
+ files called "tags?".
The |tagfiles()| function can be used to get a list of the file names
actually used.
The use of |:set+=| and |:set-=| is preferred when adding or removing
@@ -6412,9 +6094,6 @@ A jump table for the options with a short description can be found at |Q_op|.
Resetting this option is useful when using a ":tag" command in a
mapping which should not change the tagstack.
- *'term'* *E529* *E530* *E531*
-'term' Removed. |vim-differences| {Nvim}
-
*'termbidi'* *'tbidi'*
*'notermbidi'* *'notbidi'*
'termbidi' 'tbidi' boolean (default off)
@@ -6428,16 +6107,12 @@ A jump table for the options with a short description can be found at |Q_op|.
'arabicshape' is ignored, but 'rightleft' isn't changed automatically.
For further details see |arabic.txt|.
- *'termencoding'* *'tenc'*
-'termencoding' 'tenc' Removed. |vim-differences| {Nvim}
-
*'termguicolors'* *'tgc'*
'termguicolors' 'tgc' boolean (default off)
global
When on, uses |highlight-guifg| and |highlight-guibg| attributes in
the terminal (thus using 24-bit color). Requires a ISO-8613-3
compatible terminal.
- Must be set at startup (in your |init.vim| or |--cmd|).
*'terse'* *'noterse'*
'terse' boolean (default off)
@@ -6468,7 +6143,7 @@ A jump table for the options with a short description can be found at |Q_op|.
non-keyword characters (white space is preferred). Maximum line
length is 510 bytes.
To obtain a file to be used here, check out this ftp site:
- [Sorry this link doesn't work anymore, do you know the right one?]
+ [Sorry this link doesn't work anymore, do you know the right one?]
ftp://ftp.ox.ac.uk/pub/wordlists/ First get the README file.
To include a comma in a file name precede it with a backslash. Spaces
after a comma are ignored, otherwise spaces are included in the file
@@ -6492,7 +6167,7 @@ A jump table for the options with a short description can be found at |Q_op|.
for any key that can follow <c-f> in a mapping.
*'ttimeout'* *'nottimeout'*
-'ttimeout' boolean (default off)
+'ttimeout' boolean (default on)
global
This option and 'ttimeoutlen' determine the behavior when part of a
key code sequence has been received by the terminal UI. For example,
@@ -6503,24 +6178,21 @@ A jump table for the options with a short description can be found at |Q_op|.
*'timeoutlen'* *'tm'*
'timeoutlen' 'tm' number (default 1000)
global
- The time in milliseconds that is waited for a mapped sequence to
- complete.
+ Time in milliseconds to wait for a mapped sequence to complete.
*'ttimeoutlen'* *'ttm'*
-'ttimeoutlen' 'ttm' number (default -1)
+'ttimeoutlen' 'ttm' number (default 50)
global
- The time in milliseconds that is waited for a key code
- sequence to complete. Also used for CTRL-\ CTRL-N and CTRL-\ CTRL-G
- when part of a command has been typed.
+ Time in milliseconds to wait for a key code sequence to complete. Also
+ used for CTRL-\ CTRL-N and CTRL-\ CTRL-G when part of a command has
+ been typed.
*'title'* *'notitle'*
-'title' boolean (default off, on when title can be restored)
+'title' boolean (default off)
global
- {not available when compiled without the |+title|
- feature}
When on, the title of the window will be set to the value of
'titlestring' (if it is not empty), or to:
- filename [+=-] (path) - VIM
+ filename [+=-] (path) - NVIM
Where:
filename the name of the file being edited
- indicates the file cannot be modified, 'ma' off
@@ -6528,17 +6200,11 @@ A jump table for the options with a short description can be found at |Q_op|.
= indicates the file is read-only
=+ indicates the file is read-only and modified
(path) is the path of the file being edited
- - VIM the server name |v:servername| or "VIM"
- Only works if the terminal supports setting window titles
- (currently Win32 console, all GUI versions and terminals with a non-
- empty 't_ts' option - this is Unix xterm by default, where 't_ts' is
- taken from the builtin termcap).
+ - NVIM the server name |v:servername| or "NVIM"
*'titlelen'*
'titlelen' number (default 85)
global
- {not available when compiled without the |+title|
- feature}
Gives the percentage of 'columns' to use for the length of the window
title. When the title is longer, only the end of the path name is
shown. A '<' character before the path name is used to indicate this.
@@ -6550,25 +6216,17 @@ A jump table for the options with a short description can be found at |Q_op|.
'titlelen' is also used for the 'titlestring' option.
*'titleold'*
-'titleold' string (default "Thanks for flying Vim")
+'titleold' string (default "")
global
- {only available when compiled with the |+title|
- feature}
- This option will be used for the window title when exiting Vim if the
- original title cannot be restored. Only happens if 'title' is on or
- 'titlestring' is not empty.
+ If not empty, this option will be used to set the window title when
+ exiting. Only if 'title' is enabled.
This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons.
*'titlestring'*
'titlestring' string (default "")
global
- {not available when compiled without the |+title|
- feature}
When this option is not empty, it will be used for the title of the
window. This happens only when the 'title' option is on.
- Only works if the terminal supports setting window titles (currently
- Win32 console, all GUI versions and terminals with a non-empty 't_ts'
- option).
When this option contains printf-style '%' items, they will be
expanded according to the rules used for 'statusline'.
Example: >
@@ -6583,33 +6241,13 @@ A jump table for the options with a short description can be found at |Q_op|.
separating space only when needed.
NOTE: Use of special characters in 'titlestring' may cause the display
to be garbled (e.g., when it contains a CR or NL character).
- {not available when compiled without the |+statusline| feature}
-
- *'toolbar'* *'tb'*
-'toolbar' 'tb' Removed. |vim-differences| {Nvim}
-
- *'toolbariconsize'* *'tbis'*
-'toolbariconsize' 'tbis' Removed. |vim-differences| {Nvim}
-
- *'ttybuiltin'* *'tbi'* *'nottybuiltin'* *'notbi'*
-'ttybuiltin' 'tbi' Removed. |vim-differences| {Nvim}
*'ttyfast'* *'tf'* *'nottyfast'* *'notf'*
-'ttyfast' 'tf' Removed. |vim-differences| {Nvim}
-
- *'ttymouse'* *'ttym'*
-'ttymouse' 'ttym' Removed. |vim-differences| {Nvim}
-
- *'ttyscroll'* *'tsl'*
-'ttyscroll' 'tsl' Removed. |vim-differences| {Nvim}
+'ttyfast' 'tf' Removed. |vim-differences|
- *'ttytype'* *'tty'*
-'ttytype' 'tty' Alias for 'term'. Removed. |vim-differences| {Nvim}
-
- *'undodir'* *'udir'* *E926*
+ *'undodir'* *'udir'* *E5003*
'undodir' 'udir' string (default "$XDG_DATA_HOME/nvim/undo")
global
- {only when compiled with the |+persistent_undo| feature}
List of directory names for undo files, separated with commas.
See |'backupdir'| for details of the format.
"." means using the directory of the file. The undo file name for
@@ -6628,7 +6266,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'undofile'* *'noundofile'* *'udf'* *'noudf'*
'undofile' 'udf' boolean (default off)
local to buffer
- {only when compiled with the |+persistent_undo| feature}
When on, Vim automatically saves undo history to an undo file when
writing a buffer to a file, and restores undo history from the same
file on buffer read.
@@ -6665,7 +6302,7 @@ A jump table for the options with a short description can be found at |Q_op|.
Save the whole buffer for undo when reloading it. This applies to the
":e!" command and reloading for when the buffer changed outside of
Vim. |FileChangedShell|
- The save only happens when this options is negative or when the number
+ The save only happens when this option is negative or when the number
of lines is smaller than the value of this option.
Set this option to zero to disable undo for a reload.
@@ -6703,6 +6340,7 @@ A jump table for the options with a short description can be found at |Q_op|.
Currently, these messages are given:
>= 1 When the shada file is read or written.
>= 2 When a file is ":source"'ed.
+ >= 3 UI info, terminal capabilities
>= 5 Every searched tags file and include file.
>= 8 Files for which a group of autocommands is executed.
>= 9 Every executed autocommand.
@@ -6731,21 +6369,18 @@ A jump table for the options with a short description can be found at |Q_op|.
*'viewdir'* *'vdir'*
'viewdir' 'vdir' string (default: "$XDG_DATA_HOME/nvim/view")
global
- {not available when compiled without the |+mksession|
- feature}
Name of the directory where to store files for |:mkview|.
This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons.
*'viewoptions'* *'vop'*
-'viewoptions' 'vop' string (default: "folds,options,cursor")
+'viewoptions' 'vop' string (default: "folds,options,cursor,curdir")
global
- {not available when compiled without the |+mksession|
- feature}
Changes the effect of the |:mkview| command. It is a comma separated
list of words. Each word enables saving and restoring something:
word save and restore ~
cursor cursor position in file and in window
+ curdir local current directory, if set with |:lcd|
folds manually created folds, opened/closed folds and local
fold options
options options and mappings local to a window or buffer (not
@@ -6760,17 +6395,9 @@ A jump table for the options with a short description can be found at |Q_op|.
with Unix. The Unix version of Vim cannot source dos format scripts,
but the Windows version of Vim can source unix format scripts.
- *'viminfo'* *'vi'*
-'viminfo' 'vi' string
- global
- Deprecated alias for 'shada' option. Is kept for compatibility
- reasons.
-
*'virtualedit'* *'ve'*
'virtualedit' 've' string (default "")
global
- {not available when compiled without the
- |+virtualedit| feature}
A comma separated list of these words:
block Allow virtual editing in Visual block mode.
insert Allow virtual editing in Insert mode.
@@ -6796,14 +6423,7 @@ A jump table for the options with a short description can be found at |Q_op|.
*'visualbell'* *'vb'* *'novisualbell'* *'novb'* *beep*
'visualbell' 'vb' boolean (default off)
global
- Use visual bell instead of beeping. The terminal code to display the
- visual bell is given with 't_vb'. When no beep or flash is wanted,
- use ":set vb t_vb=".
- Note: When the GUI starts, 't_vb' is reset to its default value. You
- might want to set it again in your |gvimrc|.
- In the GUI, 't_vb' defaults to "<Esc>|f", which inverts the display
- for 20 msec. If you want to use a different time, use "<Esc>|40f",
- where 40 is the time in msec. Also see 'errorbells'.
+ Use visual bell instead of beeping. Also see 'errorbells'.
*'warn'* *'nowarn'*
'warn' boolean (default on)
@@ -6811,9 +6431,6 @@ A jump table for the options with a short description can be found at |Q_op|.
Give a warning message when a shell command is used while the buffer
has been changed.
- *'weirdinvert'* *'wiv'* *'noweirdinvert'* *'nowiv'*
-'weirdinvert' 'wiv' Removed. |vim-differences| {Nvim}
-
*'whichwrap'* *'ww'*
'whichwrap' 'ww' string (Vim default: "b,s", Vi default: "")
global
@@ -6871,8 +6488,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'wildignore'* *'wig'*
'wildignore' 'wig' string (default "")
global
- {not available when compiled without the |+wildignore|
- feature}
A list of file patterns. A file that matches with one of these
patterns is ignored when expanding |wildcards|, completing file or
directory names, and influences the result of |expand()|, |glob()| and
@@ -6898,8 +6513,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'wildmenu'* *'wmnu'* *'nowildmenu'* *'nowmnu'*
'wildmenu' 'wmnu' boolean (default on)
global
- {not available if compiled without the |+wildmenu|
- feature}
When 'wildmenu' is on, command-line completion operates in an enhanced
mode. On pressing 'wildchar' (usually <Tab>) to invoke completion,
the possible matches are shown just above the command line, with the
@@ -6975,8 +6588,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'wildoptions'* *'wop'*
'wildoptions' 'wop' string (default "")
global
- {not available when compiled without the |+wildignore|
- feature}
A list of words that change how command line completion is done.
Currently only one word is allowed:
tagfile When using CTRL-D to list matching tags, the kind of
@@ -6995,8 +6606,7 @@ A jump table for the options with a short description can be found at |Q_op|.
menu. This conflicts with the use of the ALT key for mappings and
entering special characters. This option tells what to do:
no Don't use ALT keys for menus. ALT key combinations can be
- mapped, but there is no automatic handling. This can then be
- done with the |:simalt| command.
+ mapped, but there is no automatic handling.
yes ALT key handling is done by the windowing system. ALT key
combinations cannot be mapped.
menu Using ALT in combination with a character that is a menu
@@ -7022,8 +6632,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'winheight'* *'wh'* *E591*
'winheight' 'wh' number (default 1)
global
- {not available when compiled without the |+windows|
- feature}
Minimal number of lines for the current window. This is not a hard
minimum, Vim will use fewer lines if there is not enough room. If the
focus goes to a window that is smaller, its size is increased, at the
@@ -7041,11 +6649,27 @@ A jump table for the options with a short description can be found at |Q_op|.
'winheight' applies to the current window. Use 'winminheight' to set
the minimal height for other windows.
+ *'winhighlight'* *'winhl'*
+'winhighlight' 'winhl' string (default empty)
+ local to window
+ Window-local highlights. Comma-delimited list of highlight
+ |group-name| pairs "{hl-builtin}:{hl},..." where each {hl-builtin} is
+ a built-in |highlight-groups| item to be overridden by {hl} group in
+ the window. Only built-in |highlight-groups| are supported, not
+ syntax highlighting (use |:ownsyntax| for that).
+
+ Highlights of vertical separators are determined by the window to the
+ left of the separator. The 'tabline' highlight of a tabpage is
+ decided by the last-focused window of the tabpage. Highlights of
+ the popupmenu are determined by the current window. Highlights in the
+ message area cannot be overridden.
+
+ Example: show a different color for non-current windows: >
+ set winhighlight=Normal:MyNormal,NormalNC:MyNormalNC
+<
*'winfixheight'* *'wfh'* *'nowinfixheight'* *'nowfh'*
'winfixheight' 'wfh' boolean (default off)
local to window
- {not available when compiled without the |+windows|
- feature}
Keep the window height when windows are opened or closed and
'equalalways' is set. Also for |CTRL-W_=|. Set by default for the
|preview-window| and |quickfix-window|.
@@ -7054,8 +6678,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'winfixwidth'* *'wfw'* *'nowinfixwidth'* *'nowfw'*
'winfixwidth' 'wfw' boolean (default off)
local to window
- {not available when compiled without the |+windows|
- feature}
Keep the window width when windows are opened or closed and
'equalalways' is set. Also for |CTRL-W_=|.
The width may be changed anyway when running out of room.
@@ -7063,8 +6685,6 @@ A jump table for the options with a short description can be found at |Q_op|.
*'winminheight'* *'wmh'*
'winminheight' 'wmh' number (default 1)
global
- {not available when compiled without the |+windows|
- feature}
The minimal height of a window, when it's not the current window.
This is a hard minimum, windows will never become smaller.
When set to zero, windows may be "squashed" to zero lines (i.e. just a
@@ -7170,8 +6790,9 @@ A jump table for the options with a short description can be found at |Q_op|.
*'writedelay'* *'wd'*
'writedelay' 'wd' number (default 0)
global
- The number of microseconds to wait for each character sent to the
- screen. When non-zero, characters are sent to the terminal one by
- one. For debugging purposes.
+ The number of milliseconds to wait for each character sent to the
+ screen. When positive, characters are sent to the UI one by one.
+ When negative, all redrawn characters cause a delay, even if the
+ character already was displayed by the UI. For debugging purposes.
- vim:tw=78:ts=8:ft=help:noet:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/os_win32.txt b/runtime/doc/os_win32.txt
deleted file mode 100644
index 5dc276c9df..0000000000
--- a/runtime/doc/os_win32.txt
+++ /dev/null
@@ -1,206 +0,0 @@
-*os_win32.txt* For Vim version 7.4. Last change: 2016 Mar 05
-
-
- VIM REFERENCE MANUAL by George Reilly
-
-
- *win32* *Win32* *MS-Windows*
-This file documents the idiosyncrasies of the Win32 version of Vim.
-
-The Win32 version of Vim works on Windows XP, Vista and Windows 7.
-There are both console and GUI versions.
-
-The 32 bit version also runs on 64 bit MS-Windows systems.
-
-1. Known problems |win32-problems|
-2. Startup |win32-startup|
-3. Using the mouse |win32-mouse|
-4. Win32 mini FAQ |win32-faq|
-
-Additionally, there are a number of common Win32 and DOS items:
-File locations |dos-locations|
-Using backslashes |dos-backslash|
-Standard mappings |dos-standard-mappings|
-Screen output and colors |dos-colors|
-File formats |dos-file-formats|
-:cd command |dos-:cd|
-Interrupting |dos-CTRL-Break|
-Temp files |dos-temp-files|
-Shell option default |dos-shell|
-
-Win32 GUI |gui-w32|
-
-Credits:
-The Win32 version was written by George V. Reilly <george@reilly.org>.
-The GUI version was made by George V. Reilly and Robert Webb.
-
-==============================================================================
-1. Known problems *win32-problems*
-
-When doing file name completion, Vim also finds matches for the short file
-name. But Vim will still find and use the corresponding long file name. For
-example, if you have the long file name "this_is_a_test" with the short file
-name "this_i~1", the command ":e *1" will start editing "this_is_a_test".
-
-==============================================================================
-2. Startup *win32-startup*
-
-Current directory *win32-curdir*
-
-If Vim is started with a single file name argument, and it has a full path
-(starts with "x:\"), Vim assumes it was started from the file explorer and
-will set the current directory to where that file is. To avoid this when
-typing a command to start Vim, use a forward slash instead of a backslash.
-Example: >
-
- vim c:\text\files\foo.txt
-
-Will change to the "C:\text\files" directory. >
-
- vim c:/text\files\foo.txt
-
-Will use the current directory.
-
-
-Term option *win32-term*
-
-The only kind of terminal type that the Win32 version of Vim understands is
-"win32", which is built-in. If you set 'term' to anything else, you will
-probably get very strange behavior from Vim. Therefore Vim does not obtain
-the default value of 'term' from the environment variable "TERM".
-
-$PATH *win32-PATH*
-
-The directory of the Vim executable is appended to $PATH. This is mostly to
-make "!xxd" work, as it is in the Tools menu. And it also means that when
-executable() returns 1 the executable can actually be executed.
-
-Quotes in file names *win32-quotes*
-
-Quotes inside a file name (or any other command line argument) can be escaped
-with a backslash. E.g. >
- vim -c "echo 'foo\"bar'"
-
-Alternatively use three quotes to get one: >
- vim -c "echo 'foo"""bar'"
-
-The quotation rules are:
-
-1. A `"` starts quotation.
-2. Another `"` or `""` ends quotation. If the quotation ends with `""`, a `"`
- is produced at the end of the quoted string.
-
-Examples, with [] around an argument:
- "foo" -> [foo]
- "foo"" -> [foo"]
- "foo"bar -> [foobar]
- "foo" bar -> [foo], [bar]
- "foo""bar -> [foo"bar]
- "foo"" bar -> [foo"], [bar]
- "foo"""bar" -> [foo"bar]
-
-
-==============================================================================
-3. Using the mouse *win32-mouse*
-
-The Win32 version of Vim supports using the mouse. If you have a two-button
-mouse, the middle button can be emulated by pressing both left and right
-buttons simultaneously - but note that in the Win32 GUI, if you have the right
-mouse button pop-up menu enabled (see 'mouse'), you should err on the side of
-pressing the left button first. |mouse-using|
-
-When the mouse doesn't work, try disabling the "Quick Edit Mode" feature of
-the console.
-
-==============================================================================
-4. Win32 mini FAQ *win32-faq*
-
-Q. How do I change the font?
-A. In the GUI version, you can use the 'guifont' option. Example: >
- :set guifont=Lucida_Console:h15:cDEFAULT
-< In the console version, you need to set the font of the console itself.
- You cannot do this from within Vim.
-
-Q. I'm using Vim to edit a symbolically linked file on a Unix NFS file server.
- When I write the file, Vim does not "write through" the symlink. Instead,
- it deletes the symbolic link and creates a new file in its place. Why?
-A. On Unix, Vim is prepared for links (symbolic or hard). A backup copy of
- the original file is made and then the original file is overwritten. This
- assures that all properties of the file remain the same. On non-Unix
- systems, the original file is renamed and a new file is written. Only the
- protection bits are set like the original file. However, this doesn't work
- properly when working on an NFS-mounted file system where links and other
- things exist. The only way to fix this in the current version is not
- making a backup file, by ":set nobackup nowritebackup" |'writebackup'|
-
-Q. I'm using Vim to edit a file on a Unix file server through Samba. When I
- write the file, the owner of the file is changed. Why?
-A. When writing a file Vim renames the original file, this is a backup (in
- case writing the file fails halfway). Then the file is written as a new
- file. Samba then gives it the default owner for the file system, which may
- differ from the original owner.
- To avoid this set the 'backupcopy' option to "yes". Vim will then make a
- copy of the file for the backup, and overwrite the original file. The
- owner isn't changed then.
-
-Q. How do I get to see the output of ":make" while it's running?
-A. Basically what you need is to put a tee program that will copy its input
- (the output from make) to both stdout and to the errorfile. You can find a
- copy of tee (and a number of other GNU tools) at
- http://gnuwin32.sourceforge.net or http://unxutils.sourceforge.net
- Alternatively, try the more recent Cygnus version of the GNU tools at
- http://www.cygwin.com Other Unix-style tools for Win32 are listed at
- http://directory.google.com/Top/Computers/Software/Operating_Systems/Unix/Win32/
- When you do get a copy of tee, you'll need to add >
- :set shellpipe=\|\ tee
-< to your _vimrc.
-
- *:!start*
-Q. How can I run an external command or program asynchronously?
-A. When using :! to run an external command, you can run it with "start": >
- :!start winfile.exe<CR>
-< Using "start" stops Vim switching to another screen, opening a new console,
- or waiting for the program to complete; it indicates that you are running a
- program that does not affect the files you are editing. Programs begun
- with :!start do not get passed Vim's open file handles, which means they do
- not have to be closed before Vim.
- To avoid this special treatment, use ":! start".
- There are two optional arguments (see the next Q):
- /min the window will be minimized
- /b no console window will be opened
- You can use only one of these flags at a time. A second one will be
- treated as the start of the command.
-
-Q. How do I avoid getting a window for programs that I run asynchronously?
-A. You have two possible solutions depending on what you want:
- 1) You may use the /min flag in order to run program in a minimized state
- with no other changes. It will work equally for console and GUI
- applications.
- 2) You can use the /b flag to run console applications without creating a
- console window for them (GUI applications are not affected). But you
- should use this flag only if the application you run doesn't require any
- input. Otherwise it will get an EOF error because its input stream
- (stdin) would be redirected to \\.\NUL (stdout and stderr too).
-
- Example for a console application, run Exuberant ctags: >
- :!start /min ctags -R .
-< When it has finished you should see file named "tags" in your current
- directory. You should notice the window title blinking on your taskbar.
- This is more noticeable for commands that take longer.
- Now delete the "tags" file and run this command: >
- :!start /b ctags -R .
-< You should have the same "tags" file, but this time there will be no
- blinking on the taskbar.
- Example for a GUI application: >
- :!start /min notepad
- :!start /b notepad
-< The first command runs notepad minimized and the second one runs it
- normally.
-
- *windows-icon*
-Q. I don't like the Vim icon, can I change it?
-A. Yes, place your favorite icon in bitmaps/vim.ico in a directory of
- 'runtimepath'. For example ~/vimfiles/bitmaps/vim.ico.
-
-
- vim:tw=78:fo=tcq2:ts=8:ft=help:norl:
diff --git a/runtime/doc/pattern.txt b/runtime/doc/pattern.txt
index 0fe6106ec5..88b7f65209 100644
--- a/runtime/doc/pattern.txt
+++ b/runtime/doc/pattern.txt
@@ -1,4 +1,4 @@
-*pattern.txt* For Vim version 7.4. Last change: 2016 Apr 03
+*pattern.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -9,16 +9,7 @@ Patterns and search commands *pattern-searches*
The very basics can be found in section |03.9| of the user manual. A few more
explanations are in chapter 27 |usr_27.txt|.
-1. Search commands |search-commands|
-2. The definition of a pattern |search-pattern|
-3. Magic |/magic|
-4. Overview of pattern items |pattern-overview|
-5. Multi items |pattern-multi-items|
-6. Ordinary atoms |pattern-atoms|
-7. Ignoring case in a pattern |/ignorecase|
-8. Composing characters |patterns-composing|
-9. Compare with Perl patterns |perl-patterns|
-10. Highlighting matches |match-highlight|
+ Type |gO| to see the table of contents.
==============================================================================
1. Search commands *search-commands*
@@ -130,8 +121,7 @@ gD Goto global Declaration. When the cursor is on a
ends before the cursor position.
*CTRL-C*
-CTRL-C Interrupt current (search) command. Use CTRL-Break on
- Windows |dos-CTRL-Break|.
+CTRL-C Interrupt current (search) command.
In Normal mode, any pending command is aborted.
*:noh* *:nohlsearch*
@@ -292,6 +282,14 @@ the "#" is under your left hand middle finger (search to the left and up) and
the "*" is under your right hand middle finger (search to the right and down).
(this depends on your keyboard layout though).
+ *E956*
+In very rare cases a regular expression is used recursively. This can happen
+when executing a pattern takes a long time and when checkig for messages on
+channels a callback is invoked that also uses a pattern or an autocommand is
+triggered. In most cases this should be fine, but if a pattern is in use when
+it's used again it fails. Usually this means there is something wrong with
+the pattern.
+
==============================================================================
2. The definition of a pattern *search-pattern* *pattern* *[pattern]*
*regular-expression* *regexp* *Pattern*
@@ -354,8 +352,8 @@ For starters, read chapter 27 of the user manual |usr_27.txt|.
*/\%#=* *two-engines* *NFA*
Vim includes two regexp engines:
1. An old, backtracking engine that supports everything.
-2. A new, NFA engine that works much faster on some patterns, but does not
- support everything.
+2. A new, NFA engine that works much faster on some patterns, possibly slower
+ on some patterns.
Vim will automatically select the right engine for you. However, if you run
into a problem or want to specifically select one engine or the other, you can
@@ -573,7 +571,7 @@ An atom can be followed by an indication of how many times the atom can be
matched and in what way. This is called a multi. See |/multi| for an
overview.
- */star* */\star* *E56*
+ */star* */\star*
* (use \* when 'magic' is not set)
Matches 0 or more of the preceding atom, as many as possible.
Example 'nomagic' matches ~
@@ -593,7 +591,7 @@ overview.
the end of the file and then tries matching "END", backing up one
character at a time.
- */\+* *E57*
+ */\+*
\+ Matches 1 or more of the preceding atom, as many as possible.
Example matches ~
^.\+$ any non-empty line
@@ -608,7 +606,7 @@ overview.
\? Just like \=. Cannot be used when searching backwards with the "?"
command.
- */\{* *E58* *E60* *E554* *E870*
+ */\{* *E60* *E554* *E870*
\{n,m} Matches n to m of the preceding atom, as many as possible
\{n} Matches n of the preceding atom
\{n,} Matches at least n of the preceding atom, as many as possible
@@ -863,10 +861,13 @@ $ At end of pattern or in front of "\|", "\)" or "\n" ('magic' on):
\%V Match inside the Visual area. When Visual mode has already been
stopped match in the area that |gv| would reselect.
This is a |/zero-width| match. To make sure the whole pattern is
- inside the Visual area put it at the start and end of the pattern,
- e.g.: >
+ inside the Visual area put it at the start and just before the end of
+ the pattern, e.g.: >
+ /\%Vfoo.*ba\%Vr
+< This also works if only "foo bar" was Visually selected. This: >
/\%Vfoo.*bar\%V
-< Only works for the current buffer.
+< would match "foo bar" if the Visual selection continues after the "r".
+ Only works for the current buffer.
*/\%#* *cursor-position*
\%# Matches with the cursor position. Only works when matching in a
@@ -895,7 +896,7 @@ $ At end of pattern or in front of "\|", "\)" or "\n" ('magic' on):
becomes invalid. Vim doesn't automatically update the matches.
Similar to moving the cursor for "\%#" |/\%#|.
- */\%l* */\%>l* */\%<l*
+ */\%l* */\%>l* */\%<l* *E951*
\%23l Matches in a specific line.
\%<23l Matches above a specific line (lower line number).
\%>23l Matches below a specific line (higher line number).
@@ -947,14 +948,18 @@ $ At end of pattern or in front of "\|", "\)" or "\n" ('magic' on):
< When 'hlsearch' is set and you move the cursor around and make changes
this will clearly show when the match is updated or not.
To match the text up to column 17: >
- /.*\%17v
-< Column 17 is included, because that's where the "\%17v" matches,
- even though this is a |/zero-width| match. Adding a dot to match the
- next character has the same result: >
- /.*\%17v.
+ /^.*\%17v
+< Column 17 is not included, because this is a |/zero-width| match. To
+ include the column use: >
+ /^.*\%17v.
< This command does the same thing, but also matches when there is no
character in column 17: >
- /.*\%<18v.
+ /^.*\%<18v.
+< Note that without the "^" to anchor the match in the first column,
+ this will also highlight column 17: >
+ /.*\%17v
+< Column 17 is highlighted by 'hlsearch' because there is another match
+ where ".*" matches zero characters.
<
Character classes:
@@ -1061,34 +1066,40 @@ x A single character, with no special meaning, matches itself
":s/[/x/" searches for "[/x" and replaces it with nothing. It does
not search for "[" and replaces it with "x"!
+ *E944* *E945*
If the sequence begins with "^", it matches any single character NOT
in the collection: "[^xyz]" matches anything but 'x', 'y' and 'z'.
- If two characters in the sequence are separated by '-', this is
shorthand for the full list of ASCII characters between them. E.g.,
- "[0-9]" matches any decimal digit. Non-ASCII characters can be
- used, but the character values must not be more than 256 apart.
+ "[0-9]" matches any decimal digit. If the starting character exceeds
+ the ending character, e.g. [c-a], E944 occurs. Non-ASCII characters
+ can be used, but the character values must not be more than 256 apart
+ in the old regexp engine. For example, searching by [\u3000-\u4000]
+ after setting re=1 emits a E945 error. Prepending \%#=2 will fix it.
- A character class expression is evaluated to the set of characters
belonging to that character class. The following character classes
are supported:
- Name Contents ~
-*[:alnum:]* [:alnum:] letters and digits
-*[:alpha:]* [:alpha:] letters
-*[:blank:]* [:blank:] space and tab characters
-*[:cntrl:]* [:cntrl:] control characters
-*[:digit:]* [:digit:] decimal digits
-*[:graph:]* [:graph:] printable characters excluding space
-*[:lower:]* [:lower:] lowercase letters (all letters when
+ Name Func Contents ~
+*[:alnum:]* [:alnum:] isalnum ASCII letters and digits
+*[:alpha:]* [:alpha:] isalpha ASCII letters
+*[:blank:]* [:blank:] space and tab
+*[:cntrl:]* [:cntrl:] iscntrl ASCII control characters
+*[:digit:]* [:digit:] decimal digits '0' to '9'
+*[:graph:]* [:graph:] isgraph ASCII printable characters excluding
+ space
+*[:lower:]* [:lower:] (1) lowercase letters (all letters when
'ignorecase' is used)
-*[:print:]* [:print:] printable characters including space
-*[:punct:]* [:punct:] punctuation characters
-*[:space:]* [:space:] whitespace characters
-*[:upper:]* [:upper:] uppercase letters (all letters when
+*[:print:]* [:print:] (2) printable characters including space
+*[:punct:]* [:punct:] ispunct ASCII punctuation characters
+*[:space:]* [:space:] whitespace characters: space, tab, CR,
+ NL, vertical tab, form feed
+*[:upper:]* [:upper:] (3) uppercase letters (all letters when
'ignorecase' is used)
-*[:xdigit:]* [:xdigit:] hexadecimal digits
-*[:return:]* [:return:] the <CR> character
-*[:tab:]* [:tab:] the <Tab> character
-*[:escape:]* [:escape:] the <Esc> character
-*[:backspace:]* [:backspace:] the <BS> character
+*[:xdigit:]* [:xdigit:] hexadecimal digits: 0-9, a-f, A-F
+*[:return:]* [:return:] the <CR> character
+*[:tab:]* [:tab:] the <Tab> character
+*[:escape:]* [:escape:] the <Esc> character
+*[:backspace:]* [:backspace:] the <BS> character
The brackets in character class expressions are additional to the
brackets delimiting a collection. For example, the following is a
plausible pattern for a Unix filename: "[-./[:alnum:]_~]\+" That is,
@@ -1097,7 +1108,15 @@ x A single character, with no special meaning, matches itself
These items only work for 8-bit characters, except [:lower:] and
[:upper:] also work for multi-byte characters when using the new
regexp engine. See |two-engines|. In the future these items may
- work for multi-byte characters.
+ work for multi-byte characters. For now, to get all "alpha"
+ characters you can use: [[:lower:][:upper:]].
+
+ The "Func" column shows what library function is used. The
+ implementation depends on the system. Otherwise:
+ (1) Uses islower() for ASCII and Vim builtin rules for other
+ characters when built with the |+multi_byte| feature.
+ (2) Uses Vim builtin rules
+ (3) As with (1) but using isupper()
*/[[=* *[==]*
- An equivalence class. This means that characters are matched that
have almost the same meaning, e.g., when ignoring accents. This
@@ -1137,7 +1156,8 @@ x A single character, with no special meaning, matches itself
- Matching with a collection can be slow, because each character in
the text has to be compared with each character in the collection.
Use one of the other atoms above when possible. Example: "\d" is
- much faster than "[0-9]" and matches the same characters.
+ much faster than "[0-9]" and matches the same characters. However,
+ the new |NFA| regexp engine deals with this better than the old one.
*/\%[]* *E69* *E70* *E369*
\%[] A sequence of optionally matched atoms. This always matches.
@@ -1379,4 +1399,4 @@ Finally, these constructs are unique to Perl:
":2match" for another plugin.
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/pi_gzip.txt b/runtime/doc/pi_gzip.txt
index df0ba5e52e..0363a8e34a 100644
--- a/runtime/doc/pi_gzip.txt
+++ b/runtime/doc/pi_gzip.txt
@@ -1,4 +1,4 @@
-*pi_gzip.txt* For Vim version 7.4. Last change: 2012 Jul 19
+*pi_gzip.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -25,6 +25,8 @@ with these extensions:
*.bz2 bzip2
*.lzma lzma
*.xz xz
+ *.lz lzip
+ *.zst zstd
That's actually the only thing you need to know. There are no options.
@@ -36,4 +38,4 @@ compression. Thus editing the patchmode file will not give you the automatic
decompression. You have to rename the file if you want this.
==============================================================================
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/pi_health.txt b/runtime/doc/pi_health.txt
new file mode 100644
index 0000000000..bb688770fc
--- /dev/null
+++ b/runtime/doc/pi_health.txt
@@ -0,0 +1,111 @@
+*pi_health.txt* Healthcheck framework
+
+Author: TJ DeVries <devries.timothyj@gmail.com>
+
+ Type |gO| to see the table of contents.
+
+==============================================================================
+Introduction *health*
+
+health.vim is a minimal framework to help with troubleshooting user
+configuration. Nvim ships with healthchecks for configuration, performance,
+python support, ruby support, clipboard support, and more.
+
+To run the healthchecks, use this command: >
+
+ :checkhealth
+<
+Plugin authors are encouraged to write new healthchecks. |health-dev|
+
+==============================================================================
+Commands *health-commands*
+
+ *:checkhealth* *:CheckHealth*
+:checkhealth Run all healthchecks.
+ *E5009*
+ Nvim depends on |$VIMRUNTIME| and 'runtimepath' to find
+ the standard "runtime files" for syntax highlighting,
+ filetype-specific behavior, and standard plugins
+ (including :checkhealth). If the runtime files cannot
+ be found then those features will not work.
+
+:checkhealth {plugins}
+ Run healthcheck(s) for one or more plugins. E.g. to run
+ only the standard Nvim healthcheck: >
+ :checkhealth nvim
+< To run the healthchecks for the "foo" and "bar" plugins
+ (assuming these plugins are on your 'runtimepath' and
+ they have implemented health#foo#check() and
+ health#bar#check(), respectively): >
+ :checkhealth foo bar
+<
+==============================================================================
+Functions *health-functions*
+
+health.vim functions are for creating new healthchecks. They mostly just do
+some layout and formatting, to give users a consistent presentation.
+
+health#report_start({name}) *health#report_start*
+ Starts a new report. Most plugins should call this only once, but if
+ you want different sections to appear in your report, call this once
+ per section.
+
+health#report_info({msg}) *health#report_info*
+ Reports an informational message.
+
+health#report_ok({msg}) *health#report_ok*
+ Reports a "success" message.
+
+health#report_warn({msg}, [{advice}]) *health#report_warn*
+ Reports a warning. {advice} is an optional List of suggestions.
+
+health#report_error({msg}, [{advice}]) *health#report_error*
+ Reports an error. {advice} is an optional List of suggestions.
+
+health#{plugin}#check() *health.user_checker*
+ Healthcheck function for {plugin}. Called by |:checkhealth|
+ automatically. Example: >
+
+ function! health#my_plug#check() abort
+ silent call s:check_environment_vars()
+ silent call s:check_python_configuration()
+ endfunction
+<
+ All output will be captured from the healthcheck. Use the
+ health#report_* functions so that your healthcheck has a format
+ consistent with the standard healthchecks.
+
+==============================================================================
+Create a healthcheck *health-dev*
+
+Healthchecks are functions that check the user environment, configuration,
+etc. Nvim has built-in healthchecks in $VIMRUNTIME/autoload/health/.
+
+To add a new healthcheck for your own plugin, simply define a
+health#{plugin}#check() function in autoload/health/{plugin}.vim.
+|:checkhealth| automatically finds and invokes such functions.
+
+If your plugin is named "foo", then its healthcheck function must be >
+ health#foo#check()
+
+defined in this file on 'runtimepath': >
+ autoload/health/foo.vim
+
+Copy this sample code into autoload/health/foo.vim and replace "foo" with your
+plugin name: >
+ function! health#foo#check() abort
+ call health#report_start('sanity checks')
+ " perform arbitrary checks
+ " ...
+
+ if looks_good
+ call health#report_ok('found required dependencies')
+ else
+ call health#report_error('cannot find foo',
+ \ ['npm install --save foo'])
+ endif
+ endfunction
+
+==============================================================================
+
+vim:tw=78:ts=8:ft=help:fdm=marker
diff --git a/runtime/doc/pi_matchit.txt b/runtime/doc/pi_matchit.txt
index c711cd588f..652734f7bb 100644
--- a/runtime/doc/pi_matchit.txt
+++ b/runtime/doc/pi_matchit.txt
@@ -1,6 +1,6 @@
*pi_matchit.txt* Extended "%" matching
-For Vim version 6.3. Last change: 2015 May 21
+For Vim version 6.3. Last change: 2017 May 14
*matchit* *matchit.vim*
@@ -211,7 +211,7 @@ Examples:
In LaTeX, since "%" is used as the comment character, you can >
:let b:match_skip = 'r:%'
< Unfortunately, this will skip anything after "\%", an escaped "%". To
- allow for this, and also "\\%" (an excaped backslash followed by the
+ allow for this, and also "\\%" (an escaped backslash followed by the
comment character) you can >
:let b:match_skip = 'r:\(^\|[^\\]\)\(\\\\\)*%'
<
@@ -356,7 +356,8 @@ The back reference '\'.d refers to the same thing as '\'.b:match_table[d] in
The various |:vmap|s defined in the script (%, |g%|, |[%|, |]%|, |a%|) may
have undesired effects in Select mode |Select-mode-mapping|. At least, if you
want to replace the selection with any character in "ag%[]" there will be a
-pause of |'updatetime'| first.
+pause of |'updatetime'| first. E.g., "yV%" would normally work linewise, but
+the plugin mapping makes it characterwise.
It would be nice if "\0" were recognized as the entire pattern. That is, it
would be nice if "foo:\end\0" had the same effect as "\(foo\):\end\1".
diff --git a/runtime/doc/pi_msgpack.txt b/runtime/doc/pi_msgpack.txt
index 95d6ff7467..951b897f55 100644
--- a/runtime/doc/pi_msgpack.txt
+++ b/runtime/doc/pi_msgpack.txt
@@ -1,4 +1,4 @@
-*pi_msgpack.txt* For NeoVim version 0.1.
+*pi_msgpack.txt* msgpack utilities
Author: Nikolay Pavlov <kp-pav@yandex.ru>
Copyright: (c) 2015 by Nikolay Pavlov
@@ -49,7 +49,7 @@ does not check whether argument matches its description.
*{msgpack-value}* Either |msgpack-special-dict| or a regular value, but
not function reference.
-*{msgpack-integer}* Any value for which |msgpack#type| will return
+*{msgpack-integer}* Any value for which |msgpack#type()| will return
"integer".
*{msgpack-special-int}* |msgpack-special-dict| representing integer.
@@ -128,6 +128,11 @@ msgpack#eval({string}, {dict}) *msgpack#eval()*
always evaluated to |msgpack-special-dict| values, as well as
hexadecimal digits. When evaluating maps order of keys is preserved.
+ Note that in addition to regular integer representations that may be
+ obtained using |msgpack#string()| msgpack#eval() also supports C-style
+ โ€œcharacterโ€ integer constants like `'/'` (equivalent to
+ `char2nr('/')`: `47`). This also allows `'\0'` (number is decimal).
+
*msgpack#equal*
msgpack#equal({msgpack-value}, {msgpack-value}) *msgpack#equal()*
Returns 1 if given values are equal, 0 otherwise. When comparing
diff --git a/runtime/doc/pi_netrw.txt b/runtime/doc/pi_netrw.txt
index 2c240fe41f..a0e071d4dd 100644
--- a/runtime/doc/pi_netrw.txt
+++ b/runtime/doc/pi_netrw.txt
@@ -1,4 +1,4 @@
-*pi_netrw.txt* For Vim version 7.4. Last change: 2016 Feb 16
+*pi_netrw.txt* Nvim
------------------------------------------------
NETRW REFERENCE MANUAL by Charles E. Campbell
@@ -530,7 +530,7 @@ variable (ex. scp uses the variable g:netrw_scp_cmd, which is defaulted to
let g:netrw_sftp_cmd= '"c:\Program Files\PuTTY\psftp.exe"'
<
(note: it has been reported that windows 7 with putty v0.6's "-batch" option
- doesn't work, so its best to leave it off for that system)
+ doesn't work, so it's best to leave it off for that system)
See |netrw-p8| for more about putty, pscp, psftp, etc.
@@ -1204,7 +1204,7 @@ The :NetrwMB command is available outside of netrw buffers (once netrw has been
invoked in the session).
The file ".netrwbook" holds bookmarks when netrw (and vim) is not active. By
-default, its stored on the first directory on the user's |'runtimepath'|.
+default, it's stored on the first directory on the user's |'runtimepath'|.
Related Topics:
|netrw-gb| how to return (go) to a bookmark
@@ -1429,7 +1429,7 @@ be used in that count.
*.netrwhist*
See |g:netrw_dirhistmax| for how to control the quantity of history stack
slots. The file ".netrwhist" holds history when netrw (and vim) is not
-active. By default, its stored on the first directory on the user's
+active. By default, it's stored on the first directory on the user's
|'runtimepath'|.
Related Topics:
@@ -1523,6 +1523,7 @@ the |'isfname'| option (which is global, so netrw doesn't modify it).
Associated setting variables:
|g:netrw_gx| control how gx picks up the text under the cursor
|g:netrw_nogx| prevent gx map while editing
+ |g:netrw_suppress_gx_mesg| controls gx's suppression of browser messages
*netrw_filehandler*
@@ -2929,6 +2930,13 @@ your browsing preferences. (see also: |netrw-settings|)
such as listing, file removal, etc.
default: ssh
+ *g:netrw_suppress_gx_mesg* =1 : browsers sometimes produce messages
+ which are normally unwanted intermixed
+ with the page.
+ However, when using links, for example,
+ those messages are what the browser produces.
+ By setting this option to 0, netrw will not
+ suppress browser messages.
*g:netrw_tmpfile_escape* =' &;'
escape() is applied to all temporary files
@@ -3261,7 +3269,7 @@ The user function is passed one argument; it resembles >
fun! ExampleUserMapFunc(islocal)
<
-where a:islocal is 1 if its a local-directory system call or 0 when
+where a:islocal is 1 if it's a local-directory system call or 0 when
remote-directory system call.
Use netrw#Expose("varname") to access netrw-internal (script-local)
@@ -3585,7 +3593,7 @@ Example: Clear netrw's marked file list via a mapping on gu >
*netrw-p16*
P16. When editing remote files (ex. :e ftp://hostname/path/file),
- under Windows I get an |E303| message complaining that its unable
+ under Windows I get an |E303| message complaining that it's unable
to open a swap file.
(romainl) It looks like you are starting Vim from a protected
@@ -3639,7 +3647,7 @@ Example: Clear netrw's marked file list via a mapping on gu >
P21. I've made a directory (or file) with an accented character, but
netrw isn't letting me enter that directory/read that file:
- Its likely that the shell or o/s is using a different encoding
+ It's likely that the shell or o/s is using a different encoding
than you have vim (netrw) using. A patch to vim supporting
"systemencoding" may address this issue in the future; for
now, just have netrw use the proper encoding. For example: >
@@ -3711,8 +3719,6 @@ netrw:
or
http://vim.sourceforge.net/scripts/script.php?script_id=120
- Decho.vim is provided as a "vimball"; see |vimball-intro|.
-
2. Edit the <netrw.vim> file by typing: >
vim netrw.vim
@@ -3755,6 +3761,23 @@ netrw:
==============================================================================
12. History *netrw-history* {{{1
+ v156: Feb 18, 2016 * Changed =~ to =~# where appropriate
+ Feb 23, 2016 * s:ComposePath(base,subdir) now uses
+ fnameescape() on the base portion
+ Mar 01, 2016 * (gt_macki) reported where :Explore would
+ make file unlisted. Fixed (tst943)
+ Apr 04, 2016 * (reported by John Little) netrw normally
+ suppresses browser messages, but sometimes
+ those "messages" are what is wanted.
+ See |g:netrw_suppress_gx_mesg|
+ Apr 06, 2016 * (reported by Carlos Pita) deleting a remote
+ file was giving an error message. Fixed.
+ Apr 08, 2016 * (Charles Cooper) had a problem with an
+ undefined b:netrw_curdir. He also provided
+ a fix.
+ Apr 20, 2016 * Changed s:NetrwGetBuffer(); now uses
+ dictionaries. Also fixed the "No Name"
+ buffer problem.
v155: Oct 29, 2015 * (Timur Fayzrakhmanov) reported that netrw's
mapping of ctrl-l was not allowing refresh of
other windows when it was done in a netrw
@@ -4075,4 +4098,4 @@ netrw:
==============================================================================
Modelines: {{{1
- vim:tw=78:ts=8:ft=help:norl:fdm=marker
+ vim:tw=78:ts=8:noet:ft=help:norl:fdm=marker
diff --git a/runtime/doc/pi_paren.txt b/runtime/doc/pi_paren.txt
index 534b3add29..77083362da 100644
--- a/runtime/doc/pi_paren.txt
+++ b/runtime/doc/pi_paren.txt
@@ -1,4 +1,4 @@
-*pi_paren.txt* For Vim version 7.4. Last change: 2013 May 08
+*pi_paren.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -56,4 +56,4 @@ used. This plugin also helps to skip matches in comments. This is unrelated
to the matchparen highlighting, they use a different mechanism.
==============================================================================
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/pi_spec.txt b/runtime/doc/pi_spec.txt
index 650d1d369b..6d45a0f064 100644
--- a/runtime/doc/pi_spec.txt
+++ b/runtime/doc/pi_spec.txt
@@ -1,4 +1,4 @@
-*pi_spec.txt* For Vim version 7.4. Last change: 2006 Apr 24
+*pi_spec.txt* Nvim
by Gustavo Niemeyer ~
@@ -108,4 +108,4 @@ If you don't like the release updating feature and don't want to answer
Good luck!!
-vim:tw=78:ts=8:ft=help:norl:
+vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/pi_tar.txt b/runtime/doc/pi_tar.txt
index b2fab290b3..59b318b7fd 100644
--- a/runtime/doc/pi_tar.txt
+++ b/runtime/doc/pi_tar.txt
@@ -1,4 +1,4 @@
-*pi_tar.txt* For Vim version 7.4. Last change: 2013 Apr 17
+*pi_tar.txt* Nvim
+====================+
| Tar File Interface |
@@ -148,4 +148,4 @@ Copyright 2005-2012: *tar-copyright*
v1 (original) * Michael Toren (see http://michael.toren.net/code/)
==============================================================================
-vim:tw=78:ts=8:ft=help
+vim:tw=78:ts=8:noet:ft=help
diff --git a/runtime/doc/pi_zip.txt b/runtime/doc/pi_zip.txt
index 0a081f24d3..7a5e7166ba 100644
--- a/runtime/doc/pi_zip.txt
+++ b/runtime/doc/pi_zip.txt
@@ -1,4 +1,4 @@
-*pi_zip.txt* For Vim version 7.4. Last change: 2013 Apr 17
+*pi_zip.txt* Nvim
+====================+
| Zip File Interface |
@@ -6,7 +6,7 @@
Author: Charles E. Campbell <NdrOchip@ScampbellPfamily.AbizM>
(remove NOSPAM from Campbell's email first)
-Copyright: Copyright (C) 2005-2012 Charles E Campbell *zip-copyright*
+Copyright: Copyright (C) 2005-2015 Charles E Campbell *zip-copyright*
The VIM LICENSE (see |copyright|) applies to the files in this
package, including zipPlugin.vim, zip.vim, and pi_zip.vim. except use
"zip.vim" instead of "VIM". Like anything else that's free, zip.vim
@@ -33,6 +33,9 @@ Copyright: Copyright (C) 2005-2012 Charles E Campbell *zip-copyright*
also write to the file. Currently, one may not make a new file in
zip archives via the plugin.
+ *zip-x*
+ x : may extract a listed file when the cursor is atop it
+
OPTIONS
*g:zip_nomax*
@@ -61,6 +64,11 @@ Copyright: Copyright (C) 2005-2012 Charles E Campbell *zip-copyright*
file; by default: >
let g:zip_zipcmd= "zip"
<
+ *g:zip_extractcmd*
+ This option specifies the program (and any options needed) used to
+ extract a file from a zip archive. By default, >
+ let g:zip_extractcmd= g:zip_unzipcmd
+<
PREVENTING LOADING~
If for some reason you do not wish to use vim to examine zipped files,
@@ -83,8 +91,26 @@ Copyright: Copyright (C) 2005-2012 Charles E Campbell *zip-copyright*
One can simply extend this line to accommodate additional extensions that
should be treated as zip files.
+ Alternatively, one may change *g:zipPlugin_ext* in one's .vimrc.
+ Currently (11/30/15) it holds: >
+
+ let g:zipPlugin_ext= '*.zip,*.jar,*.xpi,*.ja,*.war,*.ear,*.celzip,
+ \ *.oxt,*.kmz,*.wsz,*.xap,*.docx,*.docm,*.dotx,*.dotm,*.potx,*.potm,
+ \ *.ppsx,*.ppsm,*.pptx,*.pptm,*.ppam,*.sldx,*.thmx,*.xlam,*.xlsx,*.xlsm,
+ \ *.xlsb,*.xltx,*.xltm,*.xlam,*.crtx,*.vdw,*.glox,*.gcsx,*.gqsx,*.epub'
+
==============================================================================
4. History *zip-history* {{{1
+ v28 Oct 08, 2014 * changed the sanity checks for executables to reflect
+ the command actually to be attempted in zip#Read()
+ and zip#Write()
+ * added the extraction of a file capability
+ Nov 30, 2015 * added *.epub to the |g:zipPlugin_ext| list
+ Sep 13, 2016 * added *.apk to the |g:zipPlugin_ext| list and
+ sorted the suffices.
+ v27 Jul 02, 2013 * sanity check: zipfile must have "PK" as its first
+ two bytes.
+ * modified to allow zipfile: entries in quickfix lists
v26 Nov 15, 2012 * (Jason Spiro) provided a lot of new extensions that
are synonyms for .zip
v25 Jun 27, 2011 * using keepj with unzip -Z
@@ -123,4 +149,4 @@ Copyright: Copyright (C) 2005-2012 Charles E Campbell *zip-copyright*
v1 Sep 15, 2005 * Initial release, had browsing, reading, and writing
==============================================================================
-vim:tw=78:ts=8:ft=help:fdm=marker
+vim:tw=78:ts=8:noet:ft=help:fdm=marker
diff --git a/runtime/doc/print.txt b/runtime/doc/print.txt
index 7565d1e976..084ad4e521 100644
--- a/runtime/doc/print.txt
+++ b/runtime/doc/print.txt
@@ -1,4 +1,4 @@
-*print.txt* For Vim version 7.4. Last change: 2010 Jul 20
+*print.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -6,14 +6,7 @@
Printing *printing*
-1. Introduction |print-intro|
-2. Print options |print-options|
-3. PostScript Printing |postscript-printing|
-4. PostScript Printing Encoding |postscript-print-encoding|
-5. PostScript CJK Printing |postscript-cjk-printing|
-6. PostScript Printing Troubleshooting |postscript-print-trouble|
-7. PostScript Utilities |postscript-print-util|
-8. Formfeed Characters |printing-formfeed|
+ Type |gO| to see the table of contents.
==============================================================================
1. Introduction *print-intro*
@@ -43,6 +36,8 @@ Note: If you have problems printing with |:hardcopy|, an alternative is to use
'printexpr' through |v:cmdarg|. Otherwise [arguments]
is ignored. 'printoptions' can be used to specify
paper size, duplex, etc.
+ Note: If you want PDF, there are tools such as
+ "ps2pdf" that can convert the PostScript to PDF.
:[range]ha[rdcopy][!] >{filename}
As above, but write the resulting PostScript in file
@@ -94,25 +89,25 @@ If the option is empty, then vim will use the system default printer for
Macintosh: mac-roman,
HPUX: hp-roman8)
global
-Sets the character encoding used when printing. This option tells VIM which
+Sets the character encoding used when printing. This option tells Vim which
print character encoding file from the "print" directory in 'runtimepath' to
use.
This option will accept any value from |encoding-names|. Any recognized names
-are converted to VIM standard names - see 'encoding' for more details. Names
-not recognized by VIM will just be converted to lower case and underscores
+are converted to Vim standard names - see 'encoding' for more details. Names
+not recognized by Vim will just be converted to lower case and underscores
replaced with '-' signs.
-If 'printencoding' is empty or VIM cannot find the file then it will use
-'encoding' (if VIM is compiled with |+multi_byte| and it is set an 8-bit
-encoding) to find the print character encoding file. If VIM is unable to find
+If 'printencoding' is empty or Vim cannot find the file then it will use
+'encoding' (if Vim is compiled with |+multi_byte| and it is set an 8-bit
+encoding) to find the print character encoding file. If Vim is unable to find
a character encoding file then it will use the "latin1" print character
encoding file.
-When 'encoding' is set to a multi-byte encoding, VIM will try to convert
+When 'encoding' is set to a multi-byte encoding, Vim will try to convert
characters to the printing encoding for printing (if 'printencoding' is empty
then the conversion will be to latin1). Conversion to a printing encoding
-other than latin1 will require VIM to be compiled with the |+iconv| feature.
+other than latin1 will require Vim to be compiled with the |+iconv| feature.
If no conversion is possible then printing will fail. Any characters that
cannot be converted will be replaced with upside down question marks.
@@ -193,7 +188,7 @@ header is used when this option is empty.
'printmbcharset' 'pmbcs' string (default "")
global
Sets the CJK character set to be used when generating CJK output from
-|:hardcopy|. The following predefined values are currently recognised by VIM:
+|:hardcopy|. The following predefined values are currently recognised by Vim:
Value Description ~
Chinese GB_2312-80
@@ -260,7 +255,7 @@ Japanese text you would do the following; >
If 'printmbcharset' is not one of the above values then it is assumed to
specify a custom multi-byte character set and no check will be made that it is
-compatible with the value for 'printencoding'. VIM will look for a file
+compatible with the value for 'printencoding'. Vim will look for a file
defining the character set in the "print" directory in 'runtimepath'.
*pmbfn-option*
@@ -410,10 +405,10 @@ There are currently a number of limitations with PostScript printing:
possible to get all the characters in an encoding to print by installing a
new version of the Courier font family.
-- Multi-byte support - Currently VIM will try to convert multi-byte characters
+- Multi-byte support - Currently Vim will try to convert multi-byte characters
to the 8-bit encoding specified by 'printencoding' (or latin1 if it is
empty). Any characters that are not successfully converted are shown as
- unknown characters. Printing will fail if VIM cannot convert the multi-byte
+ unknown characters. Printing will fail if Vim cannot convert the multi-byte
to the 8-bit encoding.
==============================================================================
@@ -424,11 +419,11 @@ you need to define your own PostScript font encoding vector. Details on how
to define a font encoding vector is beyond the scope of this help file, but
you can find details in the PostScript Language Reference Manual, 3rd Edition,
published by Addison-Wesley and available in PDF form at
-http://www.adobe.com/. The following describes what you need to do for VIM to
+http://www.adobe.com/. The following describes what you need to do for Vim to
locate and use your print character encoding.
i. Decide on a unique name for your encoding vector, one that does not clash
- with any of the recognized or standard encoding names that VIM uses (see
+ with any of the recognized or standard encoding names that Vim uses (see
|encoding-names| for a list), and that no one else is likely to use.
ii. Copy $VIMRUNTIME/print/latin1.ps to the print subdirectory in your
'runtimepath' and rename it with your unique name.
@@ -436,23 +431,23 @@ iii. Edit your renamed copy of latin1.ps, replacing all occurrences of latin1
with your unique name (don't forget the line starting %%Title:), and
modify the array of glyph names to define your new encoding vector. The
array must have exactly 256 entries or you will not be able to print!
-iv. Within VIM, set 'printencoding' to your unique encoding name and then
- print your file. VIM will now use your custom print character encoding.
+iv. Within Vim, set 'printencoding' to your unique encoding name and then
+ print your file. Vim will now use your custom print character encoding.
-VIM will report an error with the resource file if you change the order or
+Vim will report an error with the resource file if you change the order or
content of the first 3 lines, other than the name of the encoding on the line
starting %%Title: or the version number on the line starting %%Version:.
-[Technical explanation for those that know PostScript - VIM looks for a file
+[Technical explanation for those that know PostScript - Vim looks for a file
with the same name as the encoding it will use when printing. The file
defines a new PostScript Encoding resource called /VIM-name, where name is the
-print character encoding VIM will use.]
+print character encoding Vim will use.]
==============================================================================
5. PostScript CJK Printing *postscript-cjk-printing*
*E673* *E674* *E675*
-VIM supports printing of Chinese, Japanese, and Korean files. Setting up VIM
+Vim supports printing of Chinese, Japanese, and Korean files. Setting up Vim
to correctly print CJK files requires setting up a few more options.
Each of these countries has many standard character sets and encodings which
@@ -473,7 +468,7 @@ option allows you to specify different fonts to use when printing characters
which are syntax highlighted with the font styles normal, italic, bold and
bold-italic.
-No CJK fonts are supplied with VIM. There are some free Korean, Japanese, and
+No CJK fonts are supplied with Vim. There are some free Korean, Japanese, and
Traditional Chinese fonts available at:
http://examples.oreilly.com/cjkvinfo/adobe/samples/
@@ -488,7 +483,7 @@ CJK fonts can be large containing several thousand glyphs, and it is not
uncommon to find that they only contain a subset of a national standard. It
is not unusual to find the fonts to not include characters for codes in the
ASCII code range. If you find half-width Roman characters are not appearing
-in your printout then you should configure VIM to use the Courier font the
+in your printout then you should configure Vim to use the Courier font the
half-width ASCII characters with 'printmbfont'. If your font does not include
other characters then you will need to find another font that does.
@@ -496,7 +491,7 @@ Another issue with ASCII characters, is that the various national character
sets specify a couple of different glyphs in the ASCII code range. If you
print ASCII text using the national character set you may see some unexpected
characters. If you want true ASCII code printing then you need to configure
-VIM to output ASCII characters for the ASCII code range with 'printmbfont'.
+Vim to output ASCII characters for the ASCII code range with 'printmbfont'.
It is possible to define your own multi-byte character set although this
should not be attempted lightly. A discussion on the process if beyond the
@@ -515,13 +510,13 @@ print job completing.
There are a number of possible causes as to why the printing may have failed:
- Wrong version of the prolog resource file. The prolog resource file
- contains some PostScript that VIM needs to be able to print. Each version
- of VIM needs one particular version. Make sure you have correctly installed
+ contains some PostScript that Vim needs to be able to print. Each version
+ of Vim needs one particular version. Make sure you have correctly installed
the runtime files, and don't have any old versions of a file called prolog
in the print directory in your 'runtimepath' directory.
- Paper size. Some PostScript printers will abort printing a file if they do
- not support the requested paper size. By default VIM uses A4 paper. Find
+ not support the requested paper size. By default Vim uses A4 paper. Find
out what size paper your printer normally uses and set the appropriate paper
size with 'printoptions'. If you cannot find the name of the paper used,
measure a sheet and compare it with the table of supported paper sizes listed
@@ -652,7 +647,7 @@ complex print document creation.
N-UP PRINTING
-The psnup utility takes an existing PostScript file generated from VIM and
+The psnup utility takes an existing PostScript file generated from Vim and
convert it to an n-up version. The simplest way to create a 2-up printout is
to first create a PostScript file with: >
@@ -708,16 +703,16 @@ There are a couple of points to bear in mind:
==============================================================================
8. Formfeed Characters *printing-formfeed*
-By default VIM does not do any special processing of |formfeed| control
-characters. Setting the 'printoptions' formfeed item will make VIM recognize
+By default Vim does not do any special processing of |formfeed| control
+characters. Setting the 'printoptions' formfeed item will make Vim recognize
formfeed characters and continue printing the current line at the beginning
of the first line on a new page. The use of formfeed characters provides
rudimentary print control but there are certain things to be aware of.
-VIM will always start printing a line (including a line number if enabled)
+Vim will always start printing a line (including a line number if enabled)
containing a formfeed character, even if it is the first character on the
line. This means if a line starting with a formfeed character is the first
-line of a page then VIM will print a blank page.
+line of a page then Vim will print a blank page.
Since the line number is printed at the start of printing the line containing
the formfeed character, the remainder of the line printed on the new page
@@ -726,7 +721,7 @@ lines of a long line when wrap in 'printoptions' is enabled).
If the formfeed character is the last character on a line, then printing will
continue on the second line of the new page, not the first. This is due to
-VIM processing the end of the line after the formfeed character and moving
+Vim processing the end of the line after the formfeed character and moving
down a line to continue printing.
Due to the points made above it is recommended that when formfeed character
@@ -736,4 +731,4 @@ to adjust the number of lines before a formfeed character to prevent
accidental blank pages.
==============================================================================
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/provider.txt b/runtime/doc/provider.txt
index db5c61879c..6ed3c230b9 100644
--- a/runtime/doc/provider.txt
+++ b/runtime/doc/provider.txt
@@ -1,59 +1,63 @@
-*provider.txt* {Nvim}
+*provider.txt* Nvim
NVIM REFERENCE MANUAL by Thiago de Arruda
-Providers *provider*
+Providers *provider*
-Nvim delegates some features to dynamic "providers".
+Nvim delegates some features to dynamic "providers". This document describes
+the providers and how to install them.
+ *E319*
+Use of a feature requiring a missing provider is an error: >
-==============================================================================
-Python integration *provider-python*
+ E319: No "foo" provider found. Run ":checkhealth provider"
-Nvim supports the Vim legacy |python-vim| and |python3| interfaces via
-external Python interpreters connected via |RPC|,
+Run the |:checkhealth| command, and review the sections below.
-Note: Only the Vim 7.3 API is supported; bindeval (Vim 7.4) is not.
+ Type |gO| to see the table of contents.
+==============================================================================
+Python integration *provider-python*
+
+Nvim supports Python |remote-plugin|s and the Vim legacy |python2| and
+|python3| interfaces (which are implemented as remote-plugins).
+Note: Only the Vim 7.3 API is supported; bindeval (Vim 7.4) is not.
PYTHON QUICKSTART ~
-If you used a package manager to install Nvim there's a good chance that
-it also provides the `neovim` Python package. If it doesn't, follow these
-steps to install the package with Python's package manager, `pip`.
+Install the "pynvim" Python package:
-Note: Depending on your system, `pip` might refer to Python 2 or Python 3,
- which is why the following instructions mention `pip2` or `pip3`
- explicitly. If one of these is not available, try `pip`.
+- Run |:checkhealth| to see if you already have the package (some package
+ managers install the "pynvim" Python package with Nvim itself).
-To use Vim Python 2/3 plugins with Nvim:
+- For Python 2 plugins, make sure Python 2.7 is available in your $PATH, then
+ install the package systemwide: >
+ sudo pip2 install --upgrade pynvim
+< or for the current user: >
+ pip2 install --user --upgrade pynvim
+< If "pip2" is missing, try "pip".
-- For Python 2 plugins, make sure an interpreter for Python 2.6 or 2.7 is
- available in your `$PATH`, then install the `neovim` Python package systemwide: >
- $ sudo pip2 install --upgrade neovim
-<
- or for the current user: >
- $ pip2 install --user --upgrade neovim
-<
-- For Python 3 plugins, make sure an interpreter for Python 3.3 or above is
- available in your `$PATH`, then install the `neovim` Python package systemwide: >
- $ sudo pip3 install --upgrade neovim
-<
- or for the current user: >
- $ pip3 install --user --upgrade neovim
-<
-Note: The `--upgrade` flag ensures you have the latest version even if
- a previous version was already installed.
+- For Python 3 plugins, make sure Python 3.4+ is available in your $PATH, then
+ install the package systemwide: >
+ sudo pip3 install --upgrade pynvim
+< or for the current user: >
+ pip3 install --user --upgrade pynvim
+< If "pip3" is missing, try "pip".
+
+- The `--upgrade` flag ensures you have the latest version even if a previous
+ version was already installed.
PYTHON PROVIDER CONFIGURATION ~
*g:python_host_prog*
-Set `g:python_host_prog` to point Nvim to a specific Python 2 interpreter: >
- let g:python_host_prog = '/path/to/python'
+Path to Python 2 interpreter. Setting this makes startup faster. Also useful
+for working with virtualenvs. >
+ let g:python_host_prog = '/path/to/python' " Python 2
<
*g:python3_host_prog*
-Set `g:python3_host_prog` to point Nvim to a specific Python 3 interpreter: >
- let g:python3_host_prog = '/path/to/python3'
+Path to Python 3 interpreter. Setting this makes startup faster. Also useful
+for working with virtualenvs. >
+ let g:python3_host_prog = '/path/to/python3' " Python 3
<
*g:loaded_python_provider*
To disable Python 2 support: >
@@ -62,78 +66,164 @@ To disable Python 2 support: >
*g:loaded_python3_provider*
To disable Python 3 support: >
let g:loaded_python3_provider = 1
+
+PYTHON VIRTUALENVS ~
+
+If you plan to use per-project virtualenvs often, you should assign one
+virtualenv for Neovim and hard-code the interpreter path via
+|g:python3_host_prog| (or |g:python_host_prog|) so that the "pynvim" package
+is not required for each virtualenv.
+
+Example using pyenv: >
+ pyenv install 3.4.4
+ pyenv virtualenv 3.4.4 py3nvim
+ pyenv activate py3nvim
+ pip install pynvim
+ pyenv which python # Note the path
+The last command reports the interpreter path, add it to your init.vim: >
+ let g:python3_host_prog = '/path/to/py3nvim/bin/python'
+
+See also: https://github.com/zchee/deoplete-jedi/wiki/Setting-up-Python-for-Neovim
+
+==============================================================================
+Ruby integration *provider-ruby*
+
+Nvim supports Ruby |remote-plugin|s and the Vim legacy |ruby-vim| interface
+(which is itself implemented as a Nvim remote-plugin).
+
+RUBY QUICKSTART ~
+
+To use Ruby plugins with Nvim, install the latest "neovim" RubyGem: >
+ gem install neovim
+
+Run |:checkhealth| to see if your system is up-to-date.
+
+RUBY PROVIDER CONFIGURATION ~
+ *g:loaded_ruby_provider*
+To disable Ruby support: >
+ let g:loaded_ruby_provider = 1
<
- *g:python_host_skip_check*
-Set `g:python_host_skip_check` to disable the Python 2 interpreter check.
-Note: This requires you to install the python-neovim module properly. >
- let g:python_host_skip_check = 1
-<
- *g:python3_host_skip_check*
-Set `g:python3_host_skip_check` to disable the Python 3 interpreter check.
-Note: This requires you to install the python3-neovim module properly. >
- let g:python3_host_skip_check = 1
+ *g:ruby_host_prog*
+Command to start the Ruby host. By default this is "neovim-ruby-host". With
+project-local Ruby versions (via tools like RVM or rbenv) setting this can
+avoid the need to install the "neovim" gem in every project.
+To use an absolute path (e.g. to an rbenv installation): >
+ let g:ruby_host_prog = '~/.rbenv/versions/2.4.1/bin/neovim-ruby-host'
-TROUBLESHOOTING *python-trouble*
+To use the RVM "system" Ruby installation: >
+ let g:ruby_host_prog = 'rvm system do neovim-ruby-host'
+
+==============================================================================
+Node.js integration *provider-nodejs*
-If you have trouble with a plugin that uses the `neovim` Python client, use
-the |:CheckHealth| command to diagnose your setup.
+Nvim supports Node.js |remote-plugin|s.
+https://github.com/neovim/node-client/
- *:CheckHealth*
-:CheckHealth[!] Check your setup for common problems that may be keeping a
- plugin from functioning correctly. Include the output of
- this command in bug reports to help reduce the amount of
- time it takes to address your issue. With "!" the output
- will be placed in a new buffer which can make it easier to
- save to a file or copy to the clipboard.
+NODEJS QUICKSTART~
+
+To use javascript remote-plugins with Nvim, install the "neovim" npm package: >
+ npm install -g neovim
+
+Run |:checkhealth| to see if your system is up-to-date.
+
+NODEJS PROVIDER CONFIGURATION~
+ *g:loaded_node_provider*
+To disable Node.js support: >
+ :let g:loaded_node_provider = 1
+<
+ *g:node_host_prog*
+Command to start the Node.js host. Setting this makes startup faster.
+By default, Nvim searches for "neovim-node-host" using "npm root -g", which
+can be slow. To avoid this, set g:node_host_prog to the host path: >
+ let g:node_host_prog = '/usr/local/bin/neovim-node-host'
+<
==============================================================================
Clipboard integration *provider-clipboard* *clipboard*
-Nvim has no direct connection to the system clipboard. Instead it is
-accessible through a |provider| which transparently uses shell commands for
-communicating with the clipboard.
+Nvim has no direct connection to the system clipboard. Instead it depends on
+a |provider| which transparently uses shell commands to communicate with the
+system clipboard or any other clipboard "backend".
-Clipboard access is implicitly enabled if any of the following clipboard tools
-are found in your `$PATH`.
+To ALWAYS use the clipboard for ALL operations (instead of interacting with
+the '+' and/or '*' registers explicitly): >
+ set clipboard+=unnamedplus
- - xclip
- - xsel (newer alternative to xclip)
- - pbcopy/pbpaste (Mac OS X)
- - lemonade (for SSH) https://github.com/pocke/lemonade
- - doitclient (for SSH) http://www.chiark.greenend.org.uk/~sgtatham/doit/
+See 'clipboard' for details and options.
-The presence of a suitable clipboard tool implicitly enables the '+' and '*'
-registers.
+ *clipboard-tool*
+The presence of a working clipboard tool implicitly enables the '+' and '*'
+registers. Nvim looks for these clipboard tools, in order of priority:
-If you want to ALWAYS use the clipboard for ALL operations (as opposed
-to interacting with the '+' and/or '*' registers explicitly), set the
-following option:
->
- set clipboard+=unnamedplus
-<
-See 'clipboard' for details and more options.
+ - |g:clipboard|
+ - pbcopy, pbpaste (macOS)
+ - wl-copy, wl-paste (if $WAYLAND_DISPLAY is set)
+ - xclip (if $DISPLAY is set)
+ - xsel (if $DISPLAY is set)
+ - lemonade (for SSH) https://github.com/pocke/lemonade
+ - doitclient (for SSH) http://www.chiark.greenend.org.uk/~sgtatham/doit/
+ - win32yank (Windows)
+ - tmux (if $TMUX is set)
+
+ *g:clipboard*
+To configure a custom clipboard tool, set g:clipboard to a dictionary.
+For example this configuration integrates the tmux clipboard: >
+
+ let g:clipboard = {
+ \ 'name': 'myClipboard',
+ \ 'copy': {
+ \ '+': 'tmux load-buffer -',
+ \ '*': 'tmux load-buffer -',
+ \ },
+ \ 'paste': {
+ \ '+': 'tmux save-buffer -',
+ \ '*': 'tmux save-buffer -',
+ \ },
+ \ 'cache_enabled': 1,
+ \ }
+
+If "cache_enabled" is |TRUE| then when a selection is copied Nvim will cache
+the selection until the copy command process dies. When pasting, if the copy
+process has not died the cached selection is applied.
+
+g:clipboard can also use functions (see |lambda|) instead of strings.
+For example this configuration uses the g:foo variable as a fake clipboard: >
+
+ let g:clipboard = {
+ \ 'name': 'myClipboard',
+ \ 'copy': {
+ \ '+': {lines, regtype -> extend(g:, {'foo': [lines, regtype]}) },
+ \ '*': {lines, regtype -> extend(g:, {'foo': [lines, regtype]}) },
+ \ },
+ \ 'paste': {
+ \ '+': {-> get(g:, 'foo', [])},
+ \ '*': {-> get(g:, 'foo', [])},
+ \ },
+ \ }
+
+The "copy" function stores a list of lines and the register type. The "paste"
+function returns the clipboard as a `[lines, regtype]` list, where `lines` is
+a list of lines and `regtype` is a register type conforming to |setreg()|.
==============================================================================
X11 selection mechanism *clipboard-x11* *x11-selection*
-The clipboard providers for X11 store text in what is known as "selections".
-Selections are "owned" by an application, so when the application is closed,
-the selection text is lost.
-
+X11 clipboard providers store text in "selections". Selections are owned by an
+application, so when the application gets closed, the selection text is lost.
The contents of selections are held by the originating application (e.g., upon
-a copy), and only passed on to another application when that other application
-asks for them (e.g., upon a paste).
+a copy), and only passed to another application when that other application
+requests them (e.g., upon a paste).
- *quoteplus* *quote+*
+ *primary-selection* *quotestar* *quoteplus* *quote+*
-There are three documented X11 selections: `PRIMARY`, `SECONDARY`, and `CLIPBOARD`.
-`CLIPBOARD` is typically used in X11 applications for copy/paste operations
-(`Ctrl-c`/`v`), while `PRIMARY` is used for the last selected text, which is
+There are three documented X11 selections: PRIMARY, SECONDARY, and CLIPBOARD.
+CLIPBOARD is typically used in X11 applications for copy/paste operations
+(CTRL-c/CTRL-v), while PRIMARY is used for the last selected text, which is
generally inserted with the middle mouse button.
-Nvim's X11 clipboard providers only utilize the `PRIMARY` and `CLIPBOARD`
-selections, used for the '*' and '+' registers, respectively.
+Nvim's X11 clipboard providers only use the PRIMARY and CLIPBOARD selections,
+for the "*" and "+" registers, respectively.
==============================================================================
vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/quickfix.txt b/runtime/doc/quickfix.txt
index 3b54faf18e..7aa81f612b 100644
--- a/runtime/doc/quickfix.txt
+++ b/runtime/doc/quickfix.txt
@@ -1,4 +1,4 @@
-*quickfix.txt* For Vim version 7.4. Last change: 2016 Mar 19
+*quickfix.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -6,15 +6,7 @@
This subject is introduced in section |30.1| of the user manual.
-1. Using QuickFix commands |quickfix|
-2. The error window |quickfix-window|
-3. Using more than one list of errors |quickfix-error-lists|
-4. Using :make |:make_makeprg|
-5. Using :grep |grep|
-6. Selecting a compiler |compiler-select|
-7. The error format |error-file-format|
-8. The directory stack |quickfix-directory-stack|
-9. Specific error file formats |errorformats|
+ Type |gO| to see the table of contents.
=============================================================================
1. Using QuickFix commands *quickfix* *Quickfix* *E42*
@@ -30,20 +22,42 @@ positions in files. For example, |:vimgrep| finds pattern matches. You can
use the positions in a script with the |getqflist()| function. Thus you can
do a lot more than the edit/compile/fix cycle!
-You should save your compiler's error messages to a file and start vim with
-"vim -q filename". An easy way to do this is with the |:make| command (see
-below). The 'errorformat' option should be set to match the error messages
-from your compiler (see |errorformat| below).
+If you have the error messages in a file you can start Vim with: >
+ vim -q filename
+
+From inside Vim an easy way to run a command and handle the output is with the
+|:make| command (see below).
+
+The 'errorformat' option should be set to match the error messages from your
+compiler (see |errorformat| below).
+
+ *quickfix-ID*
+Each quickfix list has a unique identifier called the quickfix ID and this
+number will not change within a Vim session. The |getqflist()| function can be
+used to get the identifier assigned to a list. There is also a quickfix list
+number which may change whenever more than ten lists are added to a quickfix
+stack.
*location-list* *E776*
-A location list is similar to a quickfix list and contains a list of positions
-in files. A location list is associated with a window and each window can
-have a separate location list. A location list can be associated with only
-one window. The location list is independent of the quickfix list.
+A location list is a window-local quickfix list. You get one after commands
+like `:lvimgrep`, `:lgrep`, `:lhelpgrep`, `:lmake`, etc., which create a
+location list instead of a quickfix list as the corresponding `:vimgrep`,
+`:grep`, `:helpgrep`, `:make` do.
+A location list is associated with a window and each window can have a
+separate location list. A location list can be associated with only one
+window. The location list is independent of the quickfix list.
When a window with a location list is split, the new window gets a copy of the
-location list. When there are no references to a location list, the location
-list is destroyed.
+location list. When there are no longer any references to a location list,
+the location list is destroyed.
+
+ *quickfix-changedtick*
+Every quickfix and location list has a read-only changedtick variable that
+tracks the total number of changes made to the list. Every time the quickfix
+list is modified, this count is incremented. This can be used to perform an
+action only when the list has changed. The |getqflist()| and |getloclist()|
+functions can be used to query the current value of changedtick. You cannot
+change the changedtick variable.
The following quickfix commands can be used. The location list commands are
similar to the quickfix commands, replacing the 'c' prefix in the quickfix
@@ -53,6 +67,10 @@ command with 'l'.
If the current window was closed by an |autocommand| while processing a
location list command, it will be aborted.
+ *E925* *E926*
+If the current quickfix or location list was changed by an |autocommand| while
+processing a quickfix or location list command, it will be aborted.
+
*:cc*
:cc[!] [nr] Display error [nr]. If [nr] is omitted, the same
error is displayed again. Without [!] this doesn't
@@ -138,11 +156,15 @@ location list command, it will be aborted.
current window is used instead of the quickfix list.
*:cq* *:cquit*
-:cq[uit][!] Quit Vim with an error code, so that the compiler
- will not compile the same file again.
- WARNING: All changes in files are lost! Also when the
- [!] is not used. It works like ":qall!" |:qall|,
- except that Vim returns a non-zero exit code.
+:[count]cq[uit] Quit Nvim with an error code, or the code specified in
+ [count]. Useful when Nvim is called from another
+ program: e.g. `git commit` will abort the comitting
+ process, `fc` (built-in for shells like bash and zsh)
+ will not execute the command.
+
+ WARNING: All changes in files are lost. It works like
+ ":qall!" |:qall|, except that Nvim exits non-zero or
+ [count].
*:cf* *:cfile*
:cf[ile][!] [errorfile] Read the error file and jump to the first error.
@@ -151,6 +173,9 @@ location list command, it will be aborted.
keep Vim running while compiling. If you give the
name of the errorfile, the 'errorfile' option will
be set to [errorfile]. See |:cc| for [!].
+ If the encoding of the error file differs from the
+ 'encoding' option, you can use the 'makeencoding'
+ option to specify the encoding.
*:lf* *:lfile*
:lf[ile][!] [errorfile] Same as ":cfile", except the location list for the
@@ -162,6 +187,9 @@ location list command, it will be aborted.
:cg[etfile] [errorfile] *:cg* *:cgetfile*
Read the error file. Just like ":cfile" but don't
jump to the first error.
+ If the encoding of the error file differs from the
+ 'encoding' option, you can use the 'makeencoding'
+ option to specify the encoding.
:lg[etfile] [errorfile] *:lg* *:lgetfile*
@@ -172,6 +200,9 @@ location list command, it will be aborted.
:caddf[ile] [errorfile] Read the error file and add the errors from the
errorfile to the current quickfix list. If a quickfix
list is not present, then a new list is created.
+ If the encoding of the error file differs from the
+ 'encoding' option, you can use the 'makeencoding'
+ option to specify the encoding.
*:laddf* *:laddfile*
:laddf[ile] [errorfile] Same as ":caddfile", except the location list for the
@@ -258,12 +289,29 @@ location list command, it will be aborted.
from the last error backwards, -1 being the last error.
The 'switchbuf' settings are respected when jumping
to a buffer.
+ The |:filter| command can be used to display only the
+ quickfix entries matching a supplied pattern. The
+ pattern is matched against the filename, module name,
+ pattern and text of the entry.
+
+:cl[ist] +{count} List the current and next {count} valid errors. This
+ is similar to ":clist from from+count", where "from"
+ is the current error position.
:cl[ist]! [from] [, [to]]
List all errors.
- *:lli* *:llist*
-:lli[st] [from] [, [to]]
+:cl[ist]! +{count} List the current and next {count} error lines. This
+ is useful to see unrecognized lines after the current
+ one. For example, if ":clist" shows:
+ 8384 testje.java:252: error: cannot find symbol ~
+ Then using ":cl! +3" shows the reason:
+ 8384 testje.java:252: error: cannot find symbol ~
+ 8385: ZexitCode = Fmainx(); ~
+ 8386: ^ ~
+ 8387: symbol: method Fmainx() ~
+
+:lli[st] [from] [, [to]] *:lli* *:llist*
Same as ":clist", except the location list for the
current window is used instead of the quickfix list.
@@ -294,6 +342,52 @@ use this code: >
endfunction
au QuickfixCmdPost make call QfMakeConv()
+Another option is using 'makeencoding'.
+
+ *quickfix-title*
+Every quickfix and location list has a title. By default the title is set to
+the command that created the list. The |getqflist()| and |getloclist()|
+functions can be used to get the title of a quickfix and a location list
+respectively. The |setqflist()| and |setloclist()| functions can be used to
+modify the title of a quickfix and location list respectively. Examples: >
+ call setqflist([], 'a', {'title' : 'Cmd output'})
+ echo getqflist({'title' : 1})
+ call setloclist(3, [], 'a', {'title' : 'Cmd output'})
+ echo getloclist(3, {'title' : 1})
+<
+ *quickfix-size*
+You can get the number of entries (size) in a quickfix and a location list
+using the |getqflist()| and |getloclist()| functions respectively. Examples: >
+ echo getqflist({'size' : 1})
+ echo getloclist(5, {'size' : 1})
+<
+ *quickfix-context*
+Any Vim type can be associated as a context with a quickfix or location list.
+The |setqflist()| and the |setloclist()| functions can be used to associate a
+context with a quickfix and a location list respectively. The |getqflist()|
+and the |getloclist()| functions can be used to retrieve the context of a
+quickfix and a location list respectively. This is useful for a Vim plugin
+dealing with multiple quickfix/location lists.
+Examples: >
+
+ let somectx = {'name' : 'Vim', 'type' : 'Editor'}
+ call setqflist([], 'a', {'context' : somectx})
+ echo getqflist({'context' : 1})
+
+ let newctx = ['red', 'green', 'blue']
+ call setloclist(2, [], 'a', {'id' : qfid, 'context' : newctx})
+ echo getloclist(2, {'id' : qfid, 'context' : 1})
+<
+ *quickfix-parse*
+You can parse a list of lines using 'errorformat' without creating or
+modifying a quickfix list using the |getqflist()| function. Examples: >
+ echo getqflist({'lines' : ["F1:10:Line10", "F2:20:Line20"]})
+ echo getqflist({'lines' : systemlist('grep -Hn quickfix *')})
+This returns a dictionary where the 'items' key contains the list of quickfix
+entries parsed from lines. The following shows how to use a custom
+'errorformat' to parse the lines without modifying the 'errorformat' option: >
+ echo getqflist({'efm' : '%f#%l#%m', 'lines' : ['F1#10#Line']})
+<
EXECUTE A COMMAND IN ALL THE BUFFERS IN QUICKFIX OR LOCATION LIST:
*:cdo*
@@ -306,7 +400,7 @@ EXECUTE A COMMAND IN ALL THE BUFFERS IN QUICKFIX OR LOCATION LIST:
etc.
< When the current file can't be |abandon|ed and the [!]
is not present, the command fails.
- When an error is detected excecution stops.
+ When an error is detected execution stops.
The last buffer (or where an error occurred) becomes
the current buffer.
{cmd} can contain '|' to concatenate several commands.
@@ -320,8 +414,7 @@ EXECUTE A COMMAND IN ALL THE BUFFERS IN QUICKFIX OR LOCATION LIST:
autocommand event is disabled by adding it to
'eventignore'. This considerably speeds up editing
each buffer.
- {not in Vi} {not available when compiled without the
- |+listcmds| feature}
+ {not in Vi}
Also see |:bufdo|, |:tabdo|, |:argdo|, |:windo|,
|:ldo|, |:cfdo| and |:lfdo|.
@@ -334,8 +427,7 @@ EXECUTE A COMMAND IN ALL THE BUFFERS IN QUICKFIX OR LOCATION LIST:
:{cmd}
etc.
< Otherwise it works the same as `:cdo`.
- {not in Vi} {not available when compiled without the
- |+listcmds| feature}
+ {not in Vi}
*:ldo*
:ld[o][!] {cmd} Execute {cmd} in each valid entry in the location list
@@ -348,8 +440,7 @@ EXECUTE A COMMAND IN ALL THE BUFFERS IN QUICKFIX OR LOCATION LIST:
etc.
< Only valid entries in the location list are used.
Otherwise it works the same as `:cdo`.
- {not in Vi} {not available when compiled without the
- |+listcmds| feature}
+ {not in Vi}
*:lfdo*
:lfdo[!] {cmd} Execute {cmd} in each file in the location list for
@@ -361,8 +452,7 @@ EXECUTE A COMMAND IN ALL THE BUFFERS IN QUICKFIX OR LOCATION LIST:
:{cmd}
etc.
< Otherwise it works the same as `:ldo`.
- {not in Vi} {not available when compiled without the
- |+listcmds| feature}
+ {not in Vi}
=============================================================================
2. The error window *quickfix-window*
@@ -385,7 +475,9 @@ EXECUTE A COMMAND IN ALL THE BUFFERS IN QUICKFIX OR LOCATION LIST:
which will indicate the command that produced the
quickfix list. This can be used to compose a custom
status line if the value of 'statusline' is adjusted
- properly.
+ properly. Whenever this buffer is modified by a
+ quickfix command or function, the |b:changedtick|
+ variable is incremented.
*:lop* *:lopen*
:lop[en] [height] Open a window to show the location list for the
@@ -410,6 +502,17 @@ EXECUTE A COMMAND IN ALL THE BUFFERS IN QUICKFIX OR LOCATION LIST:
:lw[indow] [height] Same as ":cwindow", except use the window showing the
location list for the current window.
+ *:cbo* *:cbottom*
+:cbo[ttom] Put the cursor in the last line of the quickfix window
+ and scroll to make it visible. This is useful for
+ when errors are added by an asynchronous callback.
+ Only call it once in a while if there are many
+ updates to avoid a lot of redrawing.
+
+ *:lbo* *:lbottom*
+:lbo[ttom] Same as ":cbottom", except use the window showing the
+ location list for the current window.
+
Normally the quickfix window is at the bottom of the screen. If there are
vertical splits, it's at the bottom of the rightmost column of windows. To
make it always occupy the full width: >
@@ -421,7 +524,11 @@ keep its height, ignoring 'winheight' and 'equalalways'. You can change the
height manually (e.g., by dragging the status line above it with the mouse).
In the quickfix window, each line is one error. The line number is equal to
-the error number. You can use ":.cc" to jump to the error under the cursor.
+the error number. The current entry is highlighted with the QuickFixLine
+highlighting. You can change it to your liking, e.g.: >
+ :hi QuickFixLine ctermbg=Yellow guibg=Yellow
+
+You can use ":.cc" to jump to the error under the cursor.
Hitting the <Enter> key or double-clicking the mouse on a line has the same
effect. The file containing the error is opened in the window above the
quickfix window. If there already is a window for that file, it is used
@@ -445,6 +552,9 @@ expression.
The BufWinEnter event is also triggered, again using "quickfix" for the buffer
name.
+Note: When adding to an existing quickfix list the autocommand are not
+triggered.
+
Note: Making changes in the quickfix window has no effect on the list of
errors. 'modifiable' is off to avoid making changes. If you delete or insert
lines anyway, the relation between the text and the error number is messed up.
@@ -475,6 +585,117 @@ In all of the above cases, if the location list for the selected window is not
yet set, then it is set to the location list displayed in the location list
window.
+ *quickfix-window-ID*
+You can use the |getqflist()| and |getloclist()| functions to obtain the
+window ID of the quickfix window and location list window respectively (if
+present). Examples: >
+ echo getqflist({'winid' : 1}).winid
+ echo getloclist(2, {'winid' : 1}).winid
+<
+ *getqflist-examples*
+The |getqflist()| and |getloclist()| functions can be used to get the various
+attributes of a quickfix and location list respectively. Some examples for
+using these functions are below:
+>
+ " get the title of the current quickfix list
+ :echo getqflist({'title' : 0}).title
+
+ " get the identifier of the current quickfix list
+ :let qfid = getqflist({'id' : 0}).id
+
+ " get the identifier of the fourth quickfix list in the stack
+ :let qfid = getqflist({'nr' : 4, 'id' : 0}).id
+
+ " check whether a quickfix list with a specific identifier exists
+ :if getqflist({'id' : qfid}).id == qfid
+
+ " get the index of the current quickfix list in the stack
+ :let qfnum = getqflist({'nr' : 0}).nr
+
+ " get the items of a quickfix list specified by an identifier
+ :echo getqflist({'id' : qfid, 'items' : 0}).items
+
+ " get the number of entries in a quickfix list specified by an id
+ :echo getqflist({'id' : qfid, 'size' : 0}).size
+
+ " get the context of the third quickfix list in the stack
+ :echo getqflist({'nr' : 3, 'context' : 0}).context
+
+ " get the number of quickfix lists in the stack
+ :echo getqflist({'nr' : '$'}).nr
+
+ " get the number of times the current quickfix list is changed
+ :echo getqflist({'changedtick' : 0}).changedtick
+
+ " get the current entry in a quickfix list specified by an identifier
+ :echo getqflist({'id' : qfid, 'idx' : 0}).idx
+
+ " get all the quickfix list attributes using an identifier
+ :echo getqflist({'id' : qfid, 'all' : 0})
+
+ " parse text from a List of lines and return a quickfix list
+ :let myList = ["a.java:10:L10", "b.java:20:L20"]
+ :echo getqflist({'lines' : myList}).items
+
+ " parse text using a custom 'efm' and return a quickfix list
+ :echo getqflist({'lines' : ['a.c#10#Line 10'], 'efm':'%f#%l#%m'}).items
+
+ " get the quickfix list window id
+ :echo getqflist({'winid' : 0}).winid
+
+ " get the context of the current location list
+ :echo getloclist(0, {'context' : 0}).context
+
+ " get the location list window id of the third window
+ :echo getloclist(3, {'winid' : 0}).winid
+<
+ *setqflist-examples*
+The |setqflist()| and |setloclist()| functions can be used to set the various
+attributes of a quickfix and location list respectively. Some examples for
+using these functions are below:
+>
+ " create an empty quickfix list with a title and a context
+ :let t = 'Search results'
+ :let c = {'cmd' : 'grep'}
+ :call setqflist([], ' ', {'title' : t, 'context' : c})
+
+ " set the title of the current quickfix list
+ :call setqflist([], 'a', {'title' : 'Mytitle'})
+
+ " set the context of a quickfix list specified by an identifier
+ :call setqflist([], 'a', {'id' : qfid, 'context' : {'val' : 100}})
+
+ " create a new quickfix list from a command output
+ :call setqflist([], ' ', {'lines' : systemlist('grep -Hn main *.c')})
+
+ " parse text using a custom efm and add to a particular quickfix list
+ :call setqflist([], 'a', {'id' : qfid,
+ \ 'lines' : ["a.c#10#L10", "b.c#20#L20"], 'efm':'%f#%l#%m'})
+
+ " add items to the quickfix list specified by an identifier
+ :let newItems = [{'filename' : 'a.txt', 'lnum' : 10, 'text' : "Apple"},
+ \ {'filename' : 'b.txt', 'lnum' : 20, 'text' : "Orange"}]
+ :call setqflist([], 'a', {'id' : qfid, 'items' : newItems})
+
+ " empty a quickfix list specified by an identifier
+ :call setqflist([], 'r', {'id' : qfid, 'items' : []})
+
+ " free all the quickfix lists in the stack
+ :call setqflist([], 'f')
+
+ " set the title of the fourth quickfix list
+ :call setqflist([], 'a', {'nr' : 4, 'title' : 'SomeTitle'})
+
+ " create a new quickfix list at the end of the stack
+ :call setqflist([], ' ', {'nr' : '$',
+ \ 'lines' : systemlist('grep -Hn class *.java')})
+
+ " create a new location list from a command output
+ :call setloclist(0, [], ' ', {'lines' : systemlist('grep -Hn main *.c')})
+
+ " replace the location list entries for the third window
+ :call setloclist(3, [], 'r', {'items' : newItems})
+<
=============================================================================
3. Using more than one list of errors *quickfix-error-lists*
@@ -489,7 +710,7 @@ lists. They set one of the existing error lists as the current one.
list, an error message is given.
*:lolder* *:lol*
-:lol[der] [count] Same as ":colder", except use the location list for
+:lol[der] [count] Same as `:colder`, except use the location list for
the current window instead of the quickfix list.
*:cnewer* *:cnew* *E381*
@@ -498,9 +719,20 @@ lists. They set one of the existing error lists as the current one.
list, an error message is given.
*:lnewer* *:lnew*
-:lnew[er] [count] Same as ":cnewer", except use the location list for
+:lnew[er] [count] Same as `:cnewer`, except use the location list for
the current window instead of the quickfix list.
+ *:chistory* *:chi*
+:chi[story] Show the list of error lists. The current list is
+ marked with ">". The output looks like:
+ error list 1 of 3; 43 errors ~
+ > error list 2 of 3; 0 errors ~
+ error list 3 of 3; 15 errors ~
+
+ *:lhistory* *:lhi*
+:lhi[story] Show the list of location lists, otherwise like
+ `:chistory`.
+
When adding a new error list, it becomes the current list.
When ":colder" has been used and ":make" or ":grep" is used to add a new error
@@ -508,6 +740,14 @@ list, one newer list is overwritten. This is especially useful if you are
browsing with ":grep" |grep|. If you want to keep the more recent error
lists, use ":cnewer 99" first.
+To get the number of lists in the quickfix and location list stack, you can
+use the |getqflist()| and |getloclist()| functions respectively with the list
+number set to the special value '$'. Examples: >
+ echo getqflist({'nr' : '$'}).nr
+ echo getloclist(3, {'nr' : '$'}).nr
+To get the number of the current list in the stack: >
+ echo getqflist({'nr' : 0}).nr
+<
=============================================================================
4. Using :make *:make_makeprg*
@@ -533,6 +773,9 @@ lists, use ":cnewer 99" first.
like |:cnext| and |:cprevious|, see above.
This command does not accept a comment, any "
characters are considered part of the arguments.
+ If the encoding of the program output differs from the
+ 'encoding' option, you can use the 'makeencoding'
+ option to specify the encoding.
*:lmak* *:lmake*
:lmak[e][!] [arguments]
@@ -592,6 +835,7 @@ read the error messages: >
au QuickfixCmdPost make call QfMakeConv()
(Example by Faque Cheng)
+Another option is using 'makeencoding'.
==============================================================================
5. Using :vimgrep and :grep *grep* *lid*
@@ -706,6 +950,9 @@ id-utils) in a similar way to its compiler integration (see |:make| above).
When 'grepprg' is "internal" this works like
|:vimgrep|. Note that the pattern needs to be
enclosed in separator characters then.
+ If the encoding of the program output differs from the
+ 'encoding' option, you can use the 'makeencoding'
+ option to specify the encoding.
*:lgr* *:lgrep*
:lgr[ep][!] [arguments] Same as ":grep", except the location list for the
@@ -730,6 +977,10 @@ id-utils) in a similar way to its compiler integration (see |:make| above).
\ | catch /E480:/
\ | endtry"
<
+ If the encoding of the program output differs from the
+ 'encoding' option, you can use the 'makeencoding'
+ option to specify the encoding.
+
*:lgrepa* *:lgrepadd*
:lgrepa[dd][!] [arguments]
Same as ":grepadd", except the location list for the
@@ -825,7 +1076,7 @@ need to write down a "todo" list.
The Vim plugins in the "compiler" directory will set options to use the
-selected compiler. For ":compiler" local options are set, for ":compiler!"
+selected compiler. For `:compiler` local options are set, for `:compiler!`
global options.
*current_compiler*
To support older Vim versions, the plugins always use "current_compiler" and
@@ -989,7 +1240,7 @@ or >
to indicate the column of the error. This is to be used in a multi-line error
message. See |errorformat-javac| for a useful example.
-The "%s" conversion specifies the text to search for to locate the error line.
+The "%s" conversion specifies the text to search for, to locate the error line.
The text is used as a literal string. The anchors "^" and "$" are added to
the text to locate the error line exactly matching the search text and the
text is prefixed with the "\V" atom to make it "very nomagic". The "%s"
@@ -1258,6 +1509,22 @@ 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*
@@ -1319,7 +1586,7 @@ prints information about entering a directory in the form "Making all in dir".
Making all in dir2 ./dir1/dir2
This can be solved by printing absolute directories in the "enter directory"
- message or by printing "leave directory" messages..
+ message or by printing "leave directory" messages.
To avoid this problem, ensure to print absolute directory names and "leave
directory" messages.
@@ -1493,12 +1760,6 @@ However, to properly parse such a complex file, an external filter should
be used. See the description further above how to make such a filter known
by Vim.
- *errorformat-Perl*
-In $VIMRUNTIME/tools you can find the efm_perl.pl script, which filters Perl
-error messages into a format that quickfix mode will understand. See the
-start of the file about how to use it. (This script is deprecated, see
-|compiler-perl|.)
-
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/quickref.txt b/runtime/doc/quickref.txt
index fcfecc02a1..98a5244345 100644
--- a/runtime/doc/quickref.txt
+++ b/runtime/doc/quickref.txt
@@ -1,4 +1,4 @@
-*quickref.txt* For Vim version 7.4. Last change: 2016 Mar 30
+*quickref.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -571,8 +571,7 @@ In Insert or Command-line mode:
*Q_op* Options
|:set| :se[t] show all modified options
-|:set| :se[t] all show all non-termcap options
-|:set| :se[t] termcap show all termcap options
+|:set| :se[t] all show all options
|:set| :se[t] {option} set boolean option (switch it on),
show string or number option
|:set| :se[t] no{option} reset boolean option (switch it off)
@@ -615,7 +614,8 @@ Short explanation of each option: *option-list*
'backupext' 'bex' extension used for the backup file
'backupskip' 'bsk' no backup for files that match these patterns
'balloondelay' 'bdlay' delay in mS before a balloon may pop up
-'ballooneval' 'beval' switch on balloon evaluation
+'ballooneval' 'beval' switch on balloon evaluation in the GUI
+'balloonevalterm' 'bevalterm' switch on balloon evaluation in the terminal
'balloonexpr' 'bexpr' expression to show in balloon
'belloff' 'bo' do not ring the bell for these reasons
'binary' 'bin' read/write/edit file in binary mode
@@ -656,7 +656,6 @@ Short explanation of each option: *option-list*
'cscoperelative' 'csre' Use cscope.out path basename as prefix
'cscopetag' 'cst' use cscope for tag commands
'cscopetagorder' 'csto' determines ":cstag" search order
-'cscopeverbose' 'csverb' give messages when adding a cscope database
'cursorbind' 'crb' move cursor in window as it moves in other windows
'cursorcolumn' 'cuc' highlight the screen column of the cursor
'cursorline' 'cul' highlight the screen line of the cursor
@@ -678,7 +677,6 @@ Short explanation of each option: *option-list*
'errorbells' 'eb' ring the bell for error messages
'errorfile' 'ef' name of the errorfile for the QuickFix mode
'errorformat' 'efm' description of the lines in the error file
-'esckeys' 'ek' recognize function keys in Insert mode
'eventignore' 'ei' autocommand events that are ignored
'expandtab' 'et' use spaces when <Tab> is inserted
'exrc' 'ex' read .nvimrc and .exrc in the current directory
@@ -716,7 +714,6 @@ Short explanation of each option: *option-list*
'guifont' 'gfn' GUI: Name(s) of font(s) to be used
'guifontset' 'gfs' GUI: Names of multi-byte fonts to be used
'guifontwide' 'gfw' list of font names for double-wide characters
-'guiheadroom' 'ghr' GUI: pixels room for window decorations
'guioptions' 'go' GUI: Which components and options are used
'guitablabel' 'gtl' GUI: custom label for a tab page
'guitabtooltip' 'gtt' GUI: custom tooltip for a tab page
@@ -724,7 +721,6 @@ Short explanation of each option: *option-list*
'helpheight' 'hh' minimum height of a new help window
'helplang' 'hlg' preferred help languages
'hidden' 'hid' don't unload buffer when it is |abandon|ed
-'highlight' 'hl' sets highlighting mode for various occasions
'hlsearch' 'hls' highlight matches with last search pattern
'history' 'hi' number of command-lines that are remembered
'hkmap' 'hk' Hebrew keyboard mapping
@@ -753,7 +749,7 @@ Short explanation of each option: *option-list*
'keywordprg' 'kp' program to use for the "K" command
'langmap' 'lmap' alphabetic characters for other language mode
'langmenu' 'lm' language to be used for the menus
-'langnoremap' 'lnr' do not apply 'langmap' to mapped characters
+'langremap' 'lrm' do apply 'langmap' to mapped characters
'laststatus' 'ls' tells when last window has status lines
'lazyredraw' 'lz' don't redraw while executing macros
'linebreak' 'lbr' wrap long lines at a blank
@@ -766,15 +762,14 @@ Short explanation of each option: *option-list*
'loadplugins' 'lpl' load plugin scripts when starting up
'magic' changes special characters in search patterns
'makeef' 'mef' name of the errorfile for ":make"
+'makeencoding' 'menc' encoding of external make/grep commands
'makeprg' 'mp' program to use for the ":make" command
'matchpairs' 'mps' pairs of characters that "%" can match
'matchtime' 'mat' tenths of a second to show matching paren
'maxcombine' 'mco' maximum nr of combining characters displayed
'maxfuncdepth' 'mfd' maximum recursive depth for user functions
'maxmapdepth' 'mmd' maximum recursive depth for mapping
-'maxmem' 'mm' maximum memory (in Kbyte) used for one buffer
'maxmempattern' 'mmp' maximum memory (in Kbyte) used for pattern search
-'maxmemtot' 'mmt' maximum memory (in Kbyte) used for all buffers
'menuitems' 'mis' maximum number of items in a menu
'mkspellmem' 'msm' memory used before |:mkspell| compresses the tree
'modeline' 'ml' recognize modelines at start or end of file
@@ -813,9 +808,12 @@ Short explanation of each option: *option-list*
'printmbcharset' 'pmbcs' CJK character set to be used for :hardcopy
'printmbfont' 'pmbfn' font names to be used for CJK output of :hardcopy
'printoptions' 'popt' controls the format of :hardcopy output
+'prompt' 'prompt' enable prompt in Ex mode
'pumheight' 'ph' maximum height of the popup menu
+'pumwidth' 'pw' minimum width of the popup menu
'pythondll' name of the Python 2 dynamic library
'pythonthreedll' name of the Python 3 dynamic library
+'pyxversion' 'pyx' Python version used for pyx* commands
'quoteescape' 'qe' escape characters used in a string
'readonly' 'ro' disallow writing the buffer
'redrawtime' 'rdt' timeout for 'hlsearch' and |:match| highlighting
@@ -861,6 +859,7 @@ Short explanation of each option: *option-list*
'showtabline' 'stal' tells when the tab pages line is displayed
'sidescroll' 'ss' minimum number of columns to scroll horizontal
'sidescrolloff' 'siso' min. nr. of columns to left and right of cursor
+'signcolumn' 'scl' when to display the sign column
'smartcase' 'scs' no ignore case when pattern has uppercase
'smartindent' 'si' smart autoindenting for C programs
'smarttab' 'sta' use 'shiftwidth' when inserting <Tab>
@@ -910,6 +909,8 @@ Short explanation of each option: *option-list*
'undoreload' 'ur' max nr of lines to save for undo on a buffer reload
'updatecount' 'uc' after this many characters flush swap file
'updatetime' 'ut' after this many milliseconds flush swap file
+'varsofttabstop' 'vsts' a list of number of spaces when typing <Tab>
+'vartabstop' 'vts' a list of number of spaces for <Tab>s
'verbose' 'vbs' give informative messages
'verbosefile' 'vfile' file to write messages in
'viewdir' 'vdir' directory where to store files with :mkview
@@ -988,7 +989,6 @@ Short explanation of each option: *option-list*
|g_CTRL-G| g CTRL-G show cursor column, line, and character
position
|CTRL-C| CTRL-C during searches: Interrupt the search
-|dos-CTRL-Break| CTRL-Break Windows: during searches: Interrupt the search
|<Del>| <Del> while entering a count: delete last character
|:version| :ve[rsion] show version information
|:normal| :norm[al][!] {commands}
@@ -1027,6 +1027,8 @@ Short explanation of each option: *option-list*
|c_<Up>| <Up>/<Down> recall older/newer command-line that starts
with current command
|c_<S-Up>| <S-Up>/<S-Down> recall older/newer command-line from history
+|c_CTRL-G| CTRL-G next match when 'incsearch' is active
+|c_CTRL-T| CTRL-T previous match when 'incsearch' is active
|:history| :his[tory] show older command-lines
Context-sensitive completion on the command-line:
@@ -1254,6 +1256,7 @@ Context-sensitive completion on the command-line:
|:sfind| :sf[ind] {file} split window, find {file} in 'path'
and edit it
+|:terminal| :terminal {cmd} open a terminal window
|CTRL-W_]| CTRL-W ] split window and jump to tag under
cursor
|CTRL-W_f| CTRL-W f split window and edit file name under
@@ -1374,4 +1377,4 @@ Context-sensitive completion on the command-line:
|zN| zN fold normal set 'foldenable'
|zi| zi invert 'foldenable'
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/quotes.txt b/runtime/doc/quotes.txt
deleted file mode 100644
index c35fb2f139..0000000000
--- a/runtime/doc/quotes.txt
+++ /dev/null
@@ -1,275 +0,0 @@
-*quotes.txt* For Vim version 7.4. Last change: 2010 Nov 03
-
-
- VIM REFERENCE MANUAL by Bram Moolenaar
-
-
- *quotes*
-Here are some nice quotes about Vim that I collected from news and mail.
-
-
-vim (vim) noun - Ebullient vitality and energy. [Latin, accusative of vis,
-strength] (Dictionary)
-
-Vim is so much better than vi that a great many of my old vi :map's became
-immediately obsolete! (Tony Nugent, Australia)
-
-Coming with a very GUI mindset from Windows, I always thought of people using
-Vi as some kind of outer space alien in human clothes. Once I tried I really
-got addicted by its power and now I found myself typing Vim keypresses in the
-oddest places! That's why I would like to see Vim embedded in every
-application which deals with text editing. (Jos้ Fonseca)
-
-I was a 12-year emacs user who switched to Vim about a year ago after finally
-giving up on the multiple incompatible versions, flaky contributed packages,
-disorganized keystrokes, etc. And it was one of the best moves I ever made.
-(Joel Burton)
-
-Although all of the programs were used during the preparation of the new and
-revised material, most of the editing was done with Vim versions 4.5 and 5.0
-under GNU-Linux (Redhat 4.2). (Arnold Robbins, Israel, author of "Learning
-the Vi editor")
-
-Out of all the open software i've ever seen and used, and i've seen a lot, Vim
-is the best, most useful and highest quality to work with, second only to the
-linux kernel itself. (Peter Jay Salzman)
-
-It's well worth noting that the _entirety_ of SourceForge was written using
-Vim and its nifty PHP syntax highlighting. I think the entire SF.net tech
-staff uses Vim and we're all excited to have you aboard! (Tim Perdue)
-
-Vim is one of a select bunch of tools for which I have no substitute. It is
-a brilliant piece of work! (Biju Chacko)
-
-A previous girlfriend of mine switched to emacs. Needless to say, the
-relationship went nowhere. (Geoffrey Mann)
-
-I rarely think about Vim, in the same way that I guess a fish rarely thinks
-about water. It's the environment in which everything else happens. I'm a
-fairly busy system administrator working on a lot of different platforms. Vim
-is the only thing that's consistent across all my systems, and it's just about
-the only thing that doesn't break from time to time. When a new system comes
-in the door without Vim, I install it right away. Great to have a tool that's
-the same everywhere, that's completely reliable, so I can ignore it and think
-about other things. (Pete Schaeffer)
-
-Having recently succeeded in running Vim via telnet through a Nokia
-Communicator, I can now report that it works nicely on a Palm Pilot too.
-(Allan Kelly, Scotland)
-
-You've done a tremendous job with 'VIM', Bram! The more I use it, the more
-impressed I get (I am an old 'vi' die hard who once started out with early
-versions of 'emacs' in the late 1970's and was relieved by finding 'vi' in the
-first UNIX I came across in 1983). In my opinion, it's about time 'VIM'
-replace 'emacs' as the standard for top editors. (Bo Thide', Sweden)
-
-I love and use VIM heavily too. (Larry Wall)
-
-Vi is like a Ferrari, if you're a beginner, it handles like a bitch, but once
-you get the hang of it, it's small, powerful and FAST! (Unknown)
-VIM is like a new model Ferrari, and sounds like one too - "VIIIIIIMMM!"
-(Stephen Riehm, Germany)
-
-Schon bei Nutzung eines Bruchteils der VIM-Funktionen wird der Benutzer recht
-schnell die Vorzuege dieses Editors kennen- und schaetzenlernen.
-Translated: Even when only using a fraction of VIM-functions, the user will
-quickly get used to and appreciate the advantages of this editor. (Garry
-Glendown, conclusion of an article on VIM in iX magazine 9/1998)
-
-I've recently acquired the O'Reilly book on VI (it also discusses VIM
-in-depth), and I'm amazed at just how powerful this application is. (Jeffrey
-Rankin)
-
-This guide was written using the Windows 9.x distribution of GVIM, which is
-quite possibly the greatest thing to come along since God created the naked
-girl. (Michael DiBernardo)
-
-Boy, I thought I knew almost everything about VIM, but every time I browse the
-online documentation, I hit upon a minor but cool aspect of a VIM feature that
-I didn't know before! I must say the documentation is one the finest I've
-ever seen in a product -- even better than most commercial products.
-(Gautam Mudunuri)
-
-VIM 4.5 is really a fantastic editor. It has sooooo many features and more
-importantly, the defaults are so well thought out that you really don't have
-to change anything!! Words cannot express my amazement and gratitude to the
-creators of VIM. Keep it up. (Vikas, USA)
-
-I wonder how long it will be before people will refer to other Vi editors as
-VIM clones? (Darren Hiebert)
-
-I read about [auto-positioning-in-file-based-on-the-errors-from-make] in one
-of those "Perfect Programmer's Editor" threads and was delighted to discover
-that VIM already supports it. (Brendan Macmillan, Australia)
-
-I just discovered VIM (5.0) and I'm telling everyone I know about it!
-I tell them VIM stands for VI for the new (M)illenium. Thanks so much!
-(Matt F. Valentine)
-
-I think from now on "vi" should be called "Vim Imitation", not the other way
-around. (Rungun Ramanathan)
-
-The Law of VIM:
-For each member b of the possible behaviour space B of program P, there exists
-a finite time t before which at least one user u in the total user space U of
-program P will request b becomes a member of the allowed behaviour space B'
-(B' <= B).
-In other words: Sooner or later everyone wants everything as an option.
-(Negri)
-
-Whenever I move to a new computing platform, the first thing I do is to port
-VIM. Lately, I am simply stunned by its ease of compilation using the
-configure facility. (A.M. Sabuncu, Turkey)
-
-The options are really excellent and very powerful. (Anish Maharaj)
-
-The Spring user-interface designs are in, and word from the boutiques is that
-80x24 text-only mode is back with a *vengeance! Vi editor clone VIM burst onto
-March desk-tops with a dazzling show of pastel syntax highlights for its 5.0
-look. Strident and customizable, VIM raises eyebrows with its interpretation
-of the classic Vi single-key macro collection.
-http://www.ntk.net/index.cgi?back=archive98/now0327.txt&line=179#l
-
-I just wanted to take this opportunity to let you know that VIM 5 ROCKS!
-Syntax highlighting: how did I survive without it?! Thank you for creating
-mankind's best editor! (Mun Johl, USA)
-
-Thanks again for VIM. I use it every day on Linux. (Eric Foster-Johnson,
-author of the book "UNIX Programming Tools")
-
-The BEST EDITOR EVER (Stuart Woolford)
-
-I have used most of VIM's fancy features at least once, many frequently, and I
-can honestly say that I couldn't live with anything less anymore. My
-productivity has easily doubled compared to what it was when I used vi.
-(Sitaram Chamarty)
-
-I luv VIM. It is incredible. I'm naming my first-born Vimberly. (Jose
-Unpingco, USA)
-
-Hint: "VIM" is "vi improved" - much better! (Sven Guckes, Germany)
-
-I use VIM every day. I spend more time in VIM than in any other program...
-It's the best vi clone there is. I think it's great. (Craig Sanders,
-Australia)
-
-I strongly advise using VIM--its infinite undo/redo saved me much grief.
-(Terry Brown)
-
-Thanks very much for writing what in my opinion is the finest text editor on
-the planet. If I were to get another cat, I would name it "Vim".
-(Bob Sheehan, USA)
-
-I typed :set all and the screen FILLED up with options. A whole screen of
-things to be set and unset. I saw some of my old friends like wrapmargin,
-modelines and showmode, but the screen was FILLED with new friends! I love
-them all! I love VIM! I'm so happy that I've found this editor! I feel
-like how I once felt when I started using vi after a couple of years of using
-ed. I never thought I'd forsake my beloved ed, but vi ... oh god, vi was
-great. And now, VIM. (Peter Jay Salzman, USA)
-
-I am really happy with such a wonderful software package. Much better than
-almost any expensive, off the shelf program. (Jeff Walker)
-
-Whenever I reread the VIM documentation I'm overcome with excitement at the
-power of the editor. (William Edward Webber, Australia)
-
-Hurrah for VIM!! It is "at your fingertips" like vi, and has the extensions
-that vi sorely needs: highlighting for executing commands on blocks, an easily
-navigable and digestible help screen, and more. (Paul Pax)
-
-The reason WHY I don't have this amazingly useful macro anymore, is that I
-now use VIM - and this is built in!! (Stephen Riehm, Germany)
-
-I am a user of VIM and I love it. I use it to do all my programming, C,
-C++, HTML what ever. (Tim Allwine)
-
-I discovered VIM after years of struggling with the original vi, and I just
-can't live without it anymore. (Emmanuel Mogenet, USA)
-
-Emacs has not a bit of chance to survive so long as VIM is around. Besides,
-it also has the most detailed software documentation I have ever seen---much
-better than most commercial software! (Leiming Qian)
-
-This version of VIM will just blow people apart when they discover just how
-fantastic it is! (Tony Nugent, Australia)
-
-I took your advice & finally got VIM & I'm really impressed. Instant convert.
-(Patrick Killelea, USA)
-
-VIM is by far my favorite piece of shareware and I have been particularly
-pleased with version 3.0. This is really a solid piece of work. (Robert
-Colon, USA)
-
-VIM is a joy to use, it is so well thought and practical that I wonder why
-anybody would use visual development tools. VIM is powerful and elegant, it
-looks deceptively simple but is almost as complex as a 747 (especially when I
-look at my growing vimrc), keep up that wonderful job, VIM is a centerpiece
-of the free software world. (Louis-David Mitterand, USA)
-
-I cannot believe how great it is to use VIM. I think the guys at work are
-getting tired of hearing me bragging about it. Others eyes are lighting up.
-(Rick Croote)
-
-Emacs takes way too much time to start up and run, it is too big and bulky for
-effective use and the interface is more confusing than it is of any help. VIM
-however is short, it is fast, it is powerful, it has a good interface and it
-is all purpose. (Paal Ditlefsen Ekran)
-
-From the first time I got VIM3.0, I was very enthusiastic. It has almost no
-problems. The swapfile handling and the backup possibilities are robust, also
-the protection against editing one file twice. It is very compatible to the
-real VI (and that is a MUST, because my brain is trained over years in using
-it). (Gert van Antwerpen, Holland)
-
-Visual mode in VIM is a very powerful thing! (Tony Nugent, Australia)
-
-I have to say that VIM is =THE= single greatest piece of source code to ever
-come across the net (Jim Battle, USA).
-
-In fact, if you do want to get a new vi I'd suggest VIM-3.0. This is, by
-far, the best version of vi I've ever seen (Albert W. Schueller).
-
-I should mention that VIM is a very good editor and can compete with anything
-(Ilya Beloozerov).
-
-To tell the truth sometimes I used elvis, vile, xvi, calvin, etc. And this is
-the reason that I can state that VIM is the best! (Ferenc Deak, Hungary)
-
-VIM is by far the best editor that I have used in a long time, and I have
-looked at just about every thing that is available for every platform that I
-use. VIM is the best on all of them. (Guy L. Oliver)
-
-VIM is the greatest editor since the stone chisel. (Jose Unpingco, USA)
-
-I would like to say that with VIM I am finally making the 'emacs to vi'
-transition - as an Editor it is so much better in many ways: keyboard layout,
-memory usage, text alteration to name 3. (Mark Adam)
-
-In fact, now if I want to know what a particular setting does in vi, I fire up
-VIM and check out its help! (Nikhil Patel, USA)
-
-As a vi user, VIM has made working with text a far more pleasant task than
-before I encountered this program. (Steinar Knutsen, Norway)
-
-I use VIM since version 3.0. Since that time, it is the ONLY editor I use,
-with Solaris, Linux and OS/2 Warp. I suggest all my friends to use VIM, they
-try, and they continue using it. VIM is really the best software I have ever
-downloaded from the Internet, and the best editor I know of. (Marco
-Eccettuato, Italy)
-
-
-In summary:
- __ ___ _ _ _ ___ _____ `
- \ \ / (_)_ __ ___ (_)___ | | | |/ _ \_ _| `
- \ \ / /| | '_ ` _ \ | / __| | |_| | | | || | `
- \ V / | | | | | | | | \__ \ | _ | |_| || | `
- \_/ |_|_| |_| |_| |_|___/ |_| |_|\___/ |_| `
- ____ _____ _ _ _____ _____ _ _ `
- / ___|_ _| | | | ___| ___| | | `
- \___ \ | | | | | | |_ | |_ | | | `
- ___) || | | |_| | _| | _| |_|_| `
- |____/ |_| \___/|_| |_| (_|_) (Tony Nugent, Australia) `
-
-
- vim:tw=78:ts=8:ft=help:norl:
diff --git a/runtime/doc/recover.txt b/runtime/doc/recover.txt
index e09138b2f5..7789d4bdbc 100644
--- a/runtime/doc/recover.txt
+++ b/runtime/doc/recover.txt
@@ -1,4 +1,4 @@
-*recover.txt* For Vim version 7.4. Last change: 2014 Mar 27
+*recover.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -15,8 +15,7 @@ You can recover most of your changes from the files that Vim uses to store
the contents of the file. Mostly you can recover your work with one command:
vim -r filename
-1. The swap file |swap-file|
-2. Recovery |recovery|
+ Type |gO| to see the table of contents.
==============================================================================
1. The swap file *swap-file*
@@ -28,6 +27,9 @@ You can see the name of the current swap file being used with the command:
:sw[apname] *:sw* *:swapname*
+Or you can use the |swapname()| function, which also allows for seeing the
+swap file name of other buffers.
+
The name of the swap file is normally the same as the file you are editing,
with the extension ".swp".
- On Unix, a '.' is prepended to swap file names in the same directory as the
@@ -64,10 +66,8 @@ following ones in your vimrc:
This is also very handy when editing files on floppy. Of course you will have
to create that "tmp" directory for this to work!
-For read-only files, a swap file is not used. Unless the file is big, causing
-the amount of memory used to be higher than given with 'maxmem' or
-'maxmemtot'. And when making a change to a read-only file, the swap file is
-created anyway.
+For read-only files, a swap file is not used right away. The swap file is
+created only when making changes.
The 'swapfile' option can be reset to avoid creating a swapfile. And the
|:noswapfile| modifier can be used to not create a swapfile for a new buffer.
@@ -173,4 +173,4 @@ Once you are sure the recovery is ok delete the swap file. Otherwise, you
will continue to get warning messages that the ".swp" file already exists.
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/remote.txt b/runtime/doc/remote.txt
index 933ab3a444..6c2ceb45be 100644
--- a/runtime/doc/remote.txt
+++ b/runtime/doc/remote.txt
@@ -1,4 +1,4 @@
-*remote.txt* For Vim version 7.4. Last change: 2015 Mar 01
+*remote.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -6,9 +6,7 @@
Vim client-server communication *client-server*
-1. Common functionality |clientserver|
-2. X11 specific items |x11-clientserver|
-3. MS-Windows specific items |w32-clientserver|
+ Type |gO| to see the table of contents.
==============================================================================
1. Common functionality *clientserver*
@@ -89,7 +87,7 @@ Tell the remote server "BLA" to write all files and exit: >
vim --servername BLA --remote-send '<C-\><C-N>:wqa<CR>'
-SERVER NAME
+SERVER NAME *client-server-name*
By default Vim will try to register the name under which it was invoked (gvim,
egvim ...). This can be overridden with the --servername argument. If the
@@ -139,6 +137,7 @@ the description in |eval.txt| or use CTRL-] on the function name to jump to
the full explanation.
synopsis explanation ~
+ remote_startserver( name) run a server
remote_expr( server, string, idvar) send expression
remote_send( server, string, idvar) send key sequence
serverlist() get a list of available servers
@@ -168,10 +167,6 @@ a client and send strings to other instances of Vim on the same X11 display.
When an X11 GUI Vim (gvim) is started, it will try to register a send-server
name on the 'VimRegistry' property on the root window.
-A non GUI Vim with access to the X11 display (|xterm-clipboard| enabled), can
-also act as a command server if a server name is explicitly given with the
---servername argument.
-
An empty --servername argument will cause the command server to be disabled.
To send commands to a Vim server from another application, read the source
@@ -191,4 +186,4 @@ When using gvim, the --remote-wait only works properly this way: >
start /w gvim --remote-wait file.txt
<
- vim:tw=78:sw=4:ts=8:ft=help:norl:
+ vim:tw=78:sw=4:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/remote_plugin.txt b/runtime/doc/remote_plugin.txt
index d906096a86..6a9874660b 100644
--- a/runtime/doc/remote_plugin.txt
+++ b/runtime/doc/remote_plugin.txt
@@ -1,4 +1,4 @@
-*remote_plugin.txt* For Nvim. {Nvim}
+*remote_plugin.txt* Nvim
NVIM REFERENCE MANUAL by Thiago de Arruda
@@ -6,10 +6,7 @@
Nvim support for remote plugins *remote-plugin*
-1. Introduction |remote-plugin-intro|
-2. Plugin hosts |remote-plugin-hosts|
-3. Example |remote-plugin-example|
-4. Plugin manifest |remote-plugin-manifest|
+ Type |gO| to see the table of contents.
==============================================================================
1. Introduction *remote-plugin-intro*
@@ -45,15 +42,15 @@ what a Python plugin looks like. This plugin exports a command, a function, and
an autocmd. The plugin is called 'Limit', and all it does is limit the number
of requests made to it. Here's the plugin source code:
>
- import neovim
+ import pynvim
- @neovim.plugin
+ @pynvim.plugin
class Limit(object):
def __init__(self, vim):
self.vim = vim
self.calls = 0
- @neovim.command('Cmd', range='', nargs='*', sync=True)
+ @pynvim.command('Cmd', range='', nargs='*', sync=True)
def command_handler(self, args, range):
self._increment_calls()
self.vim.current.line = (
@@ -61,14 +58,14 @@ of requests made to it. Here's the plugin source code:
args,
range))
- @neovim.autocmd('BufEnter', pattern='*.py', eval='expand("<afile>")',
+ @pynvim.autocmd('BufEnter', pattern='*.py', eval='expand("<afile>")',
sync=True)
def autocmd_handler(self, filename):
self._increment_calls()
self.vim.current.line = (
'Autocmd: Called %s times, file: %s' % (self.calls, filename))
- @neovim.function('Func')
+ @pynvim.function('Func')
def function_handler(self, args):
self._increment_calls()
self.vim.current.line = (
@@ -93,22 +90,22 @@ approach with |rpcnotify()|, meaning return values or exceptions raised in the
handler function are ignored.
To test the above plugin, it must be saved in "rplugin/python" in a
-'runtimepath' directory (~/.config/nvim/rplugin/python/limit.py for example).
-Then, the remote plugin manifest must be generated with
-`:UpdateRemotePlugins`.
+'runtimepath' directory (~/.config/nvim/rplugin/python/limit.py for example).
+Then, the remote plugin manifest must be generated with
+|:UpdateRemotePlugins|.
==============================================================================
4. Remote plugin manifest *remote-plugin-manifest*
+ *:UpdateRemotePlugins*
Just installing remote plugins to "rplugin/{host}" isn't enough for them to be
-automatically loaded when required. You must execute `:UpdateRemotePlugins`
+automatically loaded when required. You must execute |:UpdateRemotePlugins|
every time a remote plugin is installed, updated, or deleted.
-`:UpdateRemotePlugins` generates the remote plugin manifest, a special
+|:UpdateRemotePlugins| generates the remote plugin manifest, a special
Vimscript file containing declarations for all Vimscript entities
(commands/autocommands/functions) defined by all remote plugins, with each
-entity associated with the host and plugin path. The manifest is a generated
-extension to the user's vimrc (it even has the vimrc filename prepended).
+entity associated with the host and plugin path.
Manifest declarations are just calls to the `remote#host#RegisterPlugin`
function, which takes care of bootstrapping the host as soon as the declared
@@ -125,10 +122,20 @@ the example, say the Java plugin is a semantic completion engine for Java code.
If it defines the autocommand "BufEnter *.java", then the Java host is spawned
only when Nvim loads a buffer matching "*.java".
-If the explicit call to `:UpdateRemotePlugins` seems incovenient, try to see it
+If the explicit call to |:UpdateRemotePlugins| seems incovenient, try to see it
like this: It's a way to provide IDE capabilities in Nvim while still keeping
it fast and lightweight for general use. It's also analogous to the |:helptags|
command.
+ *$NVIM_RPLUGIN_MANIFEST*
+Unless $NVIM_RPLUGIN_MANIFEST is set the manifest will be written to a file
+named `rplugin.vim` at:
+
+ Unix ~
+ $XDG_DATA_HOME/nvim/ or ~/.local/share/nvim/
+
+ Windows ~
+ $LOCALAPPDATA/nvim/ or ~/AppData/Local/nvim/
+
==============================================================================
vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/repeat.txt b/runtime/doc/repeat.txt
index e84bbe5439..23ae3458ea 100644
--- a/runtime/doc/repeat.txt
+++ b/runtime/doc/repeat.txt
@@ -1,4 +1,4 @@
-*repeat.txt* For Vim version 7.4. Last change: 2016 Apr 05
+*repeat.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -8,14 +8,7 @@ Repeating commands, Vim scripts and debugging *repeating*
Chapter 26 of the user manual introduces repeating |usr_26.txt|.
-1. Single repeats |single-repeat|
-2. Multiple repeats |multi-repeat|
-3. Complex repeats |complex-repeat|
-4. Using Vim scripts |using-scripts|
-5. Using Vim packages |packages|
-6. Creating Vim packages |package-create|
-7. Debugging scripts |debug-scripts|
-8. Profiling |profiling|
+ Type |gO| to see the table of contents.
==============================================================================
1. Single repeats *single-repeat*
@@ -44,7 +37,7 @@ of area is used, see |visual-repeat|.
==============================================================================
2. Multiple repeats *multi-repeat*
- *:g* *:global* *E147* *E148*
+ *:g* *:global* *E148*
:[range]g[lobal]/{pattern}/[cmd]
Execute the Ex command [cmd] (default ":p") on the
lines within [range] where {pattern} matches.
@@ -77,8 +70,15 @@ The default for [range] is the whole buffer (1,$). Use "CTRL-C" to interrupt
the command. If an error message is given for a line, the command for that
line is aborted and the global command continues with the next marked or
unmarked line.
-
-To repeat a non-Ex command, you can use the ":normal" command: >
+ *E147*
+When the command is used recursively, it only works on one line. Giving a
+range is then not allowed. This is useful to find all lines that match a
+pattern and do not match another pattern: >
+ :g/found/v/notfound/{cmd}
+This first finds all lines containing "found", but only executes {cmd} when
+there is no match for "notfound".
+
+To execute a non-Ex command, you can use the `:normal` command: >
:g/pat/normal {commands}
Make sure that {commands} ends with a whole command, otherwise Vim will wait
for you to type the rest of the command for each match. The screen will not
@@ -152,7 +152,7 @@ q Stops recording.
:[addr]@: Repeat last command-line. First set cursor at line
[addr] (default is current line).
- *:@@*
+:[addr]@ *:@@*
:[addr]@@ Repeat the previous :@{0-9a-z"}. First set cursor at
line [addr] (default is current line).
@@ -223,6 +223,12 @@ For writing a Vim script, see chapter 41 of the user manual |usr_41.txt|.
pack/*/opt/{name} ~
The directory is added to 'runtimepath' if it wasn't
there yet.
+ If the directory pack/*/opt/{name}/after exists it is
+ added at the end of 'runtimepath'.
+
+ If loading packages from "pack/*/start" was skipped,
+ then this directory is searched first:
+ pack/*/start/{name} ~
Note that {name} is the directory name, not the name
of the .vim file. All the files matching the pattern
@@ -284,7 +290,9 @@ For writing a Vim script, see chapter 41 of the user manual |usr_41.txt|.
... not converted ...
< When conversion isn't supported by the system, there
- is no error message and no conversion is done.
+ is no error message and no conversion is done. When a
+ line can't be converted there is no error and the
+ original line is kept.
Don't use "ucs-2" or "ucs-4", scripts cannot be in
these encodings (they would contain NUL bytes).
@@ -297,6 +305,9 @@ For writing a Vim script, see chapter 41 of the user manual |usr_41.txt|.
first sourced. The number is used for the script ID
|<SID>|.
+:scr[iptnames][!] {scriptId} *:script*
+ Edit script {scriptId}. Suggested name is ":script".
+
*:fini* *:finish* *E168*
:fini[sh] Stop sourcing a script. Can only be used in a Vim
script file. This is a quick way to skip the rest of
@@ -353,8 +364,7 @@ terminal-independent two character codes. This means that they can be used
in the same way on different kinds of terminals. The first character of a
key code is 0x80 or 128, shown on the screen as "~@". The second one can be
found in the list |key-notation|. Any of these codes can also be entered
-with CTRL-V followed by the three digit decimal code. This does NOT work for
-the <t_xx> termcap codes, these can only be used in mappings.
+with CTRL-V followed by the three digit decimal code.
*:source_crnl* *W15*
Windows: Files that are read with ":source" normally have <CR><NL> <EOL>s.
@@ -365,12 +375,6 @@ something like ":map <F1> :help^M", where "^M" is a <CR>. If the first line
ends in a <CR>, but following ones don't, you will get an error message,
because the <CR> from the first lines will be lost.
-Mac Classic: Files that are read with ":source" normally have <CR> <EOL>s.
-These always work. If you are using a file with <NL> <EOL>s (for example, a
-file made on Unix), this will be recognized if 'fileformats' is not empty and
-the first line does not end in a <CR>. Be careful not to use a file with <NL>
-linebreaks which has a <CR> in first line.
-
On other systems, Vim expects ":source"ed files to end in a <NL>. These
always work. If you are using a file with <CR><NL> <EOL>s (for example, a
file made on Windows), all lines will have a trailing <CR>. This may cause
@@ -492,6 +496,9 @@ To load packages earlier, so that 'runtimepath' gets updated: >
This also works when loading plugins is disabled. The automatic loading will
only happen once.
+If the package has an "after" directory, that directory is added to the end of
+'runtimepath', so that anything there will be loaded later.
+
Using a single plugin and loading it automatically ~
@@ -522,7 +529,7 @@ whether Vim supports a feature or a dependency is missing.
You can also load an optional plugin at startup, by putting this command in
your |.vimrc|: >
:packadd! foodebug
-The extra "!" is so that the plugin isn't loaded with Vim was started with
+The extra "!" is so that the plugin isn't loaded if Vim was started with
|--noplugin|.
It is perfectly normal for a package to only have files in the "opt"
@@ -601,7 +608,7 @@ the command after changing the plugin help: >
Dependencies between plugins ~
*packload-two-steps*
-Suppose you have a two plugins that depend on the same functionality. You can
+Suppose you have two plugins that depend on the same functionality. You can
put the common functionality in an autoload directory, so that it will be
found automatically. Your package would have these files:
@@ -958,4 +965,4 @@ mind there are various things that may clobber the results:
- The "self" time is wrong when a function is used recursively.
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/rileft.txt b/runtime/doc/rileft.txt
index e4e495bb18..8fd67c9602 100644
--- a/runtime/doc/rileft.txt
+++ b/runtime/doc/rileft.txt
@@ -1,4 +1,4 @@
-*rileft.txt* For Vim version 7.4. Last change: 2006 Apr 24
+*rileft.txt* Nvim
VIM REFERENCE MANUAL by Avner Lottem
@@ -112,4 +112,4 @@ o When both 'rightleft' and 'revins' are on: 'textwidth' does not work.
o There is no full bidirectionality (bidi) support.
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/russian.txt b/runtime/doc/russian.txt
index 36f3d0b715..724c4f9454 100644
--- a/runtime/doc/russian.txt
+++ b/runtime/doc/russian.txt
@@ -1,4 +1,4 @@
-*russian.txt* For Vim version 7.4. Last change: 2006 Apr 24
+*russian.txt* Nvim
VIM REFERENCE MANUAL by Vassily Ragosin
@@ -6,10 +6,7 @@
Russian language localization and support in Vim *russian* *Russian*
-1. Introduction |russian-intro|
-2. Russian keymaps |russian-keymap|
-3. Localization |russian-l18n|
-4. Known issues |russian-issues|
+ Type |gO| to see the table of contents.
===============================================================================
1. Introduction *russian-intro*
@@ -71,4 +68,4 @@ In order to use the Russian documentation, make sure you have set the
releases of gettext.
===============================================================================
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/scroll.txt b/runtime/doc/scroll.txt
index f2a6f713e6..7906214111 100644
--- a/runtime/doc/scroll.txt
+++ b/runtime/doc/scroll.txt
@@ -1,4 +1,4 @@
-*scroll.txt* For Vim version 7.4. Last change: 2006 Aug 27
+*scroll.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -16,12 +16,7 @@ upwards in the buffer, the text in the window moves downwards on your screen.
See section |03.7| of the user manual for an introduction.
-1. Scrolling downwards |scroll-down|
-2. Scrolling upwards |scroll-up|
-3. Scrolling relative to cursor |scroll-cursor|
-4. Scrolling horizontally |scroll-horizontal|
-5. Scrolling synchronously |scroll-binding|
-6. Scrolling with a mouse wheel |scroll-mouse-wheel|
+ Type |gO| to see the table of contents.
==============================================================================
1. Scrolling downwards *scroll-down*
@@ -32,6 +27,7 @@ seen):
*CTRL-E*
CTRL-E Scroll window [count] lines downwards in the buffer.
+ The text moves upwards on the screen.
Mnemonic: Extra lines.
*CTRL-D*
@@ -70,6 +66,7 @@ seen):
*CTRL-Y*
CTRL-Y Scroll window [count] lines upwards in the buffer.
+ The text moves downwards on the screen.
Note: When using the MS-Windows key bindings CTRL-Y is
remapped to redo.
@@ -108,7 +105,8 @@ z^ Without [count]: Redraw with the line just above the
3. Scrolling relative to cursor *scroll-cursor*
The following commands reposition the edit window (the part of the buffer that
-you see) while keeping the cursor on the same line:
+you see) while keeping the cursor on the same line. Note that the 'scrolloff'
+option may cause context lines to show above and below the cursor.
*z<CR>*
z<CR> Redraw, line [count] at top of window (default
@@ -215,7 +213,7 @@ past its buffer's limits.
However, if a 'scrollbind' window that has a relative offset that is past its
buffer's limits is given the cursor focus, the other 'scrollbind' windows must
jump to a location where the current window's relative offset is valid. This
-behavior can be changed by clearing the 'jump' flag from the 'scrollopt'
+behavior can be changed by clearing the "jump" flag from the 'scrollopt'
option.
*syncbind* *:syncbind* *:sync*
@@ -235,15 +233,9 @@ This allows quick adjustment of the relative offset of 'scrollbind' windows.
==============================================================================
6. Scrolling with a mouse wheel *scroll-mouse-wheel*
-When your mouse has a scroll wheel, it should work with Vim in the GUI. How
-it works depends on your system. It might also work in an xterm
-|xterm-mouse-wheel|. By default only vertical scroll wheels are supported,
-but some GUIs also support horizontal scroll wheels.
-
-For the Win32 GUI the scroll action is hard coded. It works just like
-dragging the scrollbar of the current window. How many lines are scrolled
-depends on your mouse driver. If the scroll action causes input focus
-problems, see |intellimouse-wheel-problems|.
+When your mouse has a scroll wheel, it should work with Nvim in the GUI and
+any terminal that has mouse support. By default only vertical scroll wheels
+are supported, but some GUIs also support horizontal scroll wheels.
Note that horizontal scrolling only works if 'nowrap' is set. Also, unless
the "h" flag in 'guioptions' is set, the cursor moves to the longest visible
@@ -258,43 +250,4 @@ the scroll wheel move one line or half a page in Normal mode: >
:map <S-ScrollWheelDown> <C-D>
You can also use Alt and Ctrl modifiers.
-This only works when Vim gets the scroll wheel events, of course. You can
-check if this works with the "xev" program.
-
- *<MouseDown>* *<MouseUp>*
-The keys <MouseDown> and <MouseUp> have been deprecated. Use <ScrollWheelUp>
-instead of <MouseDown> and use <ScrollWheelDown> instead of <MouseUp>.
-
- *xterm-mouse-wheel*
-To use the mouse wheel in a new xterm you only have to make the scroll wheel
-work in your Xserver, as mentioned above.
-
-To use the mouse wheel in an older xterm you must do this:
-1. Make it work in your Xserver, as mentioned above.
-2. Add translations for the xterm, so that the xterm will pass a scroll event
- to Vim as an escape sequence.
-3. Add mappings in Vim, to interpret the escape sequences as <ScrollWheelDown>
- or <ScrollWheelUp> keys.
-
-You can do the translations by adding this to your ~.Xdefaults file (or other
-file where your X resources are kept): >
-
- XTerm*VT100.Translations: #override \n\
- s<Btn4Down>: string("0x9b") string("[64~") \n\
- s<Btn5Down>: string("0x9b") string("[65~") \n\
- <Btn4Down>: string("0x9b") string("[62~") \n\
- <Btn5Down>: string("0x9b") string("[63~") \n\
- <Btn4Up>: \n\
- <Btn5Up>:
-
-Add these mappings to your vimrc file: >
- :map <M-Esc>[62~ <ScrollWheelUp>
- :map! <M-Esc>[62~ <ScrollWheelUp>
- :map <M-Esc>[63~ <ScrollWheelDown>
- :map! <M-Esc>[63~ <ScrollWheelDown>
- :map <M-Esc>[64~ <S-ScrollWheelUp>
- :map! <M-Esc>[64~ <S-ScrollWheelUp>
- :map <M-Esc>[65~ <S-ScrollWheelDown>
- :map! <M-Esc>[65~ <S-ScrollWheelDown>
-<
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/sign.txt b/runtime/doc/sign.txt
index 44a5361c5d..273d2b984c 100644
--- a/runtime/doc/sign.txt
+++ b/runtime/doc/sign.txt
@@ -1,4 +1,4 @@
-*sign.txt* For Vim version 7.4. Last change: 2014 May 07
+*sign.txt* Nvim
VIM REFERENCE MANUAL by Gordon Prieur
@@ -7,8 +7,7 @@
Sign Support Features *sign-support*
-1. Introduction |sign-intro|
-2. Commands |sign-commands|
+ Type |gO| to see the table of contents.
==============================================================================
1. Introduction *sign-intro* *signs*
@@ -40,8 +39,10 @@ There are two steps in using signs:
When signs are defined for a file, Vim will automatically add a column of two
characters to display them in. When the last sign is unplaced the column
-disappears again. The color of the column is set with the SignColumn group
-|hl-SignColumn|. Example to set the color: >
+disappears again. This behavior can be changed with the 'signcolumn' option.
+
+The color of the column is set with the SignColumn group |hl-SignColumn|.
+Example to set the color: >
:highlight SignColumn guibg=darkgrey
@@ -78,12 +79,15 @@ DEFINING A SIGN. *:sign-define* *E255* *E160* *E612*
will cause redraw problems.
toolkit supports ~
Win32 .bmp, .ico, .cur
- pixmap (.xpm) |+xpm_w32|
linehl={group}
Highlighting group used for the whole line the sign is placed
in. Most useful is defining a background color.
+ numhl={group}
+ Highlighting group used for 'number' column at the associated
+ line. Overrides |hl-LineNr|, |hl-CursorLineNr|.
+
text={text} *E239*
Define the text that is displayed when there is no icon or the
GUI is not being used. Only printable characters are allowed
@@ -186,7 +190,9 @@ JUMPING TO A SIGN *:sign-jump* *E157*
If the file isn't displayed in window and the current file can
not be |abandon|ed this fails.
-:sign jump {id} buffer={nr}
- Same, but use buffer {nr}.
+:sign jump {id} buffer={nr} *E934*
+ Same, but use buffer {nr}. This fails if buffer {nr} does not
+ have a name.
+
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/spell.txt b/runtime/doc/spell.txt
index 0902d5d10f..875f3f2c08 100644
--- a/runtime/doc/spell.txt
+++ b/runtime/doc/spell.txt
@@ -1,4 +1,4 @@
-*spell.txt*
+*spell.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -6,10 +6,7 @@
Spell checking *spell*
-1. Quick start |spell-quickstart|
-2. Remarks on spell checking |spell-remarks|
-3. Generating a spell file |spell-mkspell|
-4. Spell file format |spell-file-format|
+ Type |gO| to see the table of contents.
==============================================================================
1. Quick start *spell-quickstart* *E756*
@@ -462,7 +459,7 @@ Vim uses a binary file format for spelling. This greatly speeds up loading
the word list and keeps it small.
*.aff* *.dic* *Myspell*
You can create a Vim spell file from the .aff and .dic files that Myspell
-uses. Myspell is used by OpenOffice.org and Mozilla. The OpenOffice .oxt
+uses. Myspell is used by OpenOffice.org and Mozilla. The OpenOffice .oxt
files are zip files which contain the .aff and .dic files. You should be able
to find them here:
http://extensions.services.openoffice.org/dictionary
@@ -707,7 +704,7 @@ Additionally the following items are recognized:
= Case must match exactly.
? Rare word.
! Bad (wrong) word.
- digit A region in which the word is valid. If no regions are
+ 1 to 9 A region in which the word is valid. If no regions are
specified the word is valid in all regions.
Example:
@@ -1597,7 +1594,7 @@ COMPOUNDSYLLABLE (Hunspell) *spell-COMPOUNDSYLLABLE*
KEY (Hunspell) *spell-KEY*
Define characters that are close together on the keyboard.
Used to give better suggestions. Not supported.
-
+
LANG (Hunspell) *spell-LANG*
This specifies language-specific behavior. This actually
moves part of the language knowledge into the program,
@@ -1736,4 +1733,4 @@ This isn't ideal, because the longer Vim is running the higher the counts
become. But in practice it is a noticeable improvement over not using the word
count.
- vim:tw=78:sw=4:ts=8:ft=help:norl:
+ vim:tw=78:sw=4:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/sponsor.txt b/runtime/doc/sponsor.txt
deleted file mode 100644
index a99d66d843..0000000000
--- a/runtime/doc/sponsor.txt
+++ /dev/null
@@ -1,216 +0,0 @@
-*sponsor.txt* For Vim version 7.4. Last change: 2008 Jun 21
-
-
- VIM REFERENCE MANUAL by Bram Moolenaar
-
-
-
-SPONSOR VIM DEVELOPMENT *sponsor*
-
-Fixing bugs and adding new features takes a lot of time and effort. To show
-your appreciation for the work and motivate Bram and others to continue
-working on Vim please send a donation.
-
-Since Bram is back to a paid job the money will now be used to help children
-in Uganda. See |uganda|. But at the same time donations increase Bram's
-motivation to keep working on Vim!
-
-For the most recent information about sponsoring look on the Vim web site:
-
- http://www.vim.org/sponsor/
-
-More explanations can be found in the |sponsor-faq|.
-
-
-REGISTERED VIM USER *register*
-
-You can become a registered Vim user by sending at least 10 euro. This works
-similar to sponsoring Vim, see |sponsor| above. Registration was made
-possible for the situation where your boss or bookkeeper may be willing to
-register software, but does not like the terms "sponsoring" and "donation".
-
-More explanations can be found in the |register-faq|.
-
-
-VOTE FOR FEATURES *vote-for-features*
-
-To give registered Vim users and sponsors an advantage over lurkers they can
-vote for the items Bram should work on. How does this voting work?
-
-1. You send at least 10 euro. See below for ways to transfer money
- |send-money|.
-
-2. You will be e-mailed a registration key. Enter this key on your account
- page on the Vim website. You can easily create an account if you don't
- have one yet.
-
-3. You can enter your votes on the voting page. There is a link to that page
- on your account page after entering a registration key. Your votes will
- be counted for two years.
-
-4. The voting results appear on the results page, which is visible for
- everybody: http://www.vim.org/sponsor/vote_results.php
-
-Additionally, once you have sent 100 euro or more in total, your name appears
-in the "Vim hall of honour": http://www.vim.org/sponsor/hall_of_honour.php
-But only if you enable this on your account page.
-
-
-HOW TO SEND MONEY *send-money*
-
-Credit card Through PayPal, see the PayPal site for information:
- https://www.paypal.com/en_US/mrb/pal=XAC62PML3GF8Q
- The e-mail address for sending sponsorship money is:
- donate@vim.org
- The e-mail address for Vim registration is:
- register@vim.org
- Using Euro is preferred, other currencies are also accepted.
- In Euro countries a bank transfer is preferred, this has lower
- costs.
-
-Other methods See |iccf-donations|.
- Include "Vim sponsor" or "Vim registration" in the comment of
- your money transfer. Send me an e-mail that mentions the
- amount you transferred if you want to vote for features and
- show others you are a registered Vim user or sponsor.
-
-Cash Small amounts can be sent with ordinary mail. Put something
- around the money, so that it's not noticeable from the
- outside. Mention your e-mail address if you want to vote for
- features and show others you are a registered Vim user or
- sponsor.
-
-You can use this permanent address:
- Bram Moolenaar
- Finsterruetihof 1
- 8134 Adliswil
- Switzerland
-
-
-
-QUESTIONS AND ANSWERS *sponsor-faq* *register-faq*
-
-Why should I give money?
-
-If you do not show your appreciation for Vim then Bram will be less motivated
-to fix bugs and add new features. He will do something else instead.
-
-
-How much money should I send?
-
-That is up to you. The more you give, the more children will be helped.
-An indication for individuals that use Vim at home: 10 Euro per year. For
-professional use: 30 Euro per year per person. Send at least 10 euro to be
-able to vote for features.
-
-
-What do I get in return?
-
-Each registered Vim user and sponsor who donates at least 10 euro will be able
-to vote for new features. These votes will give priority to the work on Vim.
-The votes are valid for two years. The more money you send the more your
-votes count |votes-counted|.
-
-If you send 100 Euro or more in total you will be mentioned on the "Vim hall
-of honour" page on the Vim web site. But only if you enable this on your
-account page. You can also select whether the amount will be visible.
-
-
-How do I become a Vim sponsor or registered Vim user?
-
-Send money, as explained above |send-money| and include your e-mail address.
-When the money has been received you will receive a unique registration key.
-This key can be used on the Vim website to activate voting on your Vim
-account. You will then get an extra page where you can vote for features and
-choose whether others will be able to see that you donated. There is a link
-to this page on your "My Account" page.
-
-
-What is the difference between sponsoring and registering?
-
-It has a different name. Use the term "registration" if your boss doesn't
-like "sponsoring" or "donation". The benefits are the same.
-
-
-How can I send money?
-
-See |send-money|. Check the web site for the most recent information:
-http://www.vim.org/sponsor/
-
-
-Why don't you use the SourceForge donation system?
-
-SourceForge takes 5% of the donations for themselves. If you want to support
-SourceForge you can send money to them directly.
-
-
-I cannot afford to send money, may I still use Vim?
-
-Yes.
-
-
-I did not register Vim, can I use all available features?
-
-Yes.
-
-
-I noticed a bug, do I need to register before I can report it?
-
-No, suggestions for improving Vim can always be given. For improvements use
-the developer |maillist|, for reporting bugs see |bugs|.
-
-
-How are my votes counted? *votes-counted*
-
-You may vote when you send 10 euro or more. You can enter up to ten votes.
-You can select the same item several times to give it more points. You can
-also enter three counter votes, these count as negative points.
-
-When you send 30 euro or more the points are doubled. Above 100 euro they
-count four times, above 300 euro they count six times, above 1000 euro ten
-times.
-
-
-Can I change my votes?
-
-You can change your votes any time you like, up to two years after you
-sent money. The points will be counted right away.
-
-
-Can I add an item to vote on?
-
-Not directly. You can suggest items to vote on to Bram. He will consider
-fitting your item into the list.
-
-
-How about Charityware?
-
-Currently the Vim donations go to |uganda| anyway. Thus it doesn't matter if
-you sponsor Vim or ICCF. Except that Vim sponsoring will allow you to vote
-for features.
-
-
-I donated $$$, now please add feature XYZ!
-
-There is no direct relation between your donation and the work Bram does.
-Otherwise you would be paying for work and we would have to pay tax over the
-donation. If you want to hire Bram for specific work, contact him directly,
-don't use the donation system.
-
-
-Are the donations tax deductible?
-
-That depends on your country. The donations to help the children in |Uganda|
-are tax deductible in Holland, Germany, Canada and in the USA. See the ICCF
-website http://iccf-holland.org/donate.html. You must send an e-mail to Bram
-to let him know that the donation is done because of the use of Vim.
-
-
-Can you send me a bill?
-
-No, because there is no relation between the money you send and the work that
-is done. But a receipt is possible.
-
-
-
- vim:tw=78:ts=8:ft=help:norl:
diff --git a/runtime/doc/starting.txt b/runtime/doc/starting.txt
index 236ed65f46..12794b6cc0 100644
--- a/runtime/doc/starting.txt
+++ b/runtime/doc/starting.txt
@@ -1,4 +1,4 @@
-*starting.txt* For Vim version 7.4. Last change: 2016 Apr 05
+*starting.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -6,14 +6,7 @@
Starting Vim *starting*
-1. Vim arguments |vim-arguments|
-2. Initialization |initialization|
-3. $VIM and $VIMRUNTIME |$VIM|
-4. Suspending |suspend|
-5. Exiting |exiting|
-6. Saving settings |save-settings|
-7. Views and Sessions |views-sessions|
-8. The ShaDa file |shada-file|
+ Type |gO| to see the table of contents.
==============================================================================
1. Vim arguments *vim-arguments*
@@ -29,8 +22,7 @@ More generally, Vim is started with:
Option arguments and file name arguments can be mixed, and any number of them
can be given. However, watch out for options that take an argument.
-Exactly one out of the following five items may be used to choose how to
-start editing:
+The following items may be used to choose how to start editing:
*-file* *---*
filename One or more file names. The first one will be the current
@@ -41,26 +33,25 @@ filename One or more file names. The first one will be the current
nvim -- -filename
< All arguments after the "--" will be interpreted as file names,
no other options or "+command" argument can follow.
- For behavior of quotes on MS-Windows, see |win32-quotes|.
*--*
-- This argument can mean two things, depending on whether Ex
- mode is to be used.
-
- Starting in Normal mode: >
- nvim -
-< Start editing a new buffer, which is filled with text
- that is read from stdin. The commands that would normally be
- read from stdin will now be read from stderr. Example: >
- find . -name "*.c" -print | nvim -
+- Alias for stdin (standard input).
+ Example: >
+ echo text | nvim - file
+< "text" is read into buffer 1, "file" is opened as buffer 2.
+ In most cases (except -s, -es, |--embed|, --headless) if stdin
+ is not a TTY then it is read as text, so "-" is implied: >
+ echo text | nvim file
< The buffer will be marked modified, because it contains text
- that needs to be saved. Except when in readonly mode, then
- the buffer is not marked modified. Example: >
- ls | nvim -R -
-< Starting in Ex mode: >
- nvim -e -
- nvim -E
-< Start editing in silent mode. See |-s-ex|.
+ that needs to be saved (except for readonly |-R| mode).
+
+ To read stdin as Normal commands use |-s| with "-": >
+ echo "ifoo" | nvim -s -
+< To read stdin as Ex commands use |-es| or |-e|: >
+ echo "echo getpid()" | nvim -e - -V1
+< To open a file literally named "-", put it after "--": >
+ echo foo | nvim -- -
+< To read stdin as text with |--headless| use "-".
*-t* *-tag*
-t {tag} A tag. "tag" is looked up in the tags file, the associated
@@ -85,7 +76,8 @@ The option arguments may be given in any order. Single-letter options can be
combined after one dash. There can be no option arguments after the "--"
argument.
---help *-h* *--help*
+--help *-h* *--help* *-?*
+-?
-h Give usage (help) message and exit.
See |info-message| about capturing the text.
@@ -111,13 +103,6 @@ argument.
(Only available when compiled with the |+startuptime|
feature).
- *--literal*
---literal Take file names literally, don't expand wildcards. Not needed
- for Unix, because Vim always takes file names literally (the
- shell expands wildcards).
- Applies to all the names, also the ones that come before this
- argument.
-
*-+*
+[num] The cursor will be positioned on line "num" for the first
file being edited. If "num" is missing, the cursor will be
@@ -180,6 +165,7 @@ argument.
the executable "view" has the same effect as the -R argument.
The 'updatecount' option will be set to 10000, meaning that
the swap file will not be updated automatically very often.
+ See |-M| for disallowing modifications.
*-m*
-m Modifications not allowed to be written. The 'write' option
@@ -197,36 +183,39 @@ argument.
-Z Restricted mode. All commands that make use of an external
shell are disabled. This includes suspending with CTRL-Z,
":sh", filtering, the system() function, backtick expansion,
- delete(), rename(), mkdir(), writefile(), libcall(), etc.
-
- *-e*
--e Start Vim in Ex mode |Q|.
-
- *-E*
--E Start Vim in improved Ex mode |gQ|.
-
- *-s-ex*
--s Silent or batch mode. Only when "-s" is preceded by the "-e"
- argument. Otherwise see |-s|, which does take an argument
- while this use of "-s" doesn't. To be used when Vim is used
- to execute Ex commands from a file instead of a terminal.
- Switches off most prompts and informative messages. Also
- warnings and error messages. The output of these commands is
- displayed (to stdout):
+ delete(), rename(), mkdir(), writefile(), libcall(),
+ jobstart(), etc.
+
+-e *-e* *-E*
+-E Start Nvim in Ex mode |gQ|.
+
+ If stdin is not a TTY:
+ -e reads stdin as Ex commands.
+ -E reads stdin as text (into buffer 1).
+
+ *-es* *-Es*
+-es *-s-ex* *silent-mode*
+-Es Silent or batch mode: execute Ex commands from a file instead
+ of a terminal. Special case of |-s| (which takes an argument
+ while "-es" doesn't). Disables most prompts, messages,
+ warnings and errors.
+ Output of these commands is displayed (to stdout):
:print
:list
:number
:set to display option values.
- When 'verbose' is non-zero messages are printed (for
- debugging, to stderr).
- $TERM is not used.
- If Vim appears to be stuck try typing "qa!<Enter>". You don't
- get a prompt thus you can't see Vim is waiting for you to type
- something.
- Initializations are skipped (except the ones given with the
- "-u" argument).
+ When 'verbose' is set messages are printed to stderr, e.g.: >
+ echo foo | nvim -V1 -es
+<
+ User |init.vim| is skipped (unless given with |-u|).
+ |$TERM| is not used.
+
+ If stdin is not a TTY:
+ -es reads stdin as Ex commands.
+ -Es reads stdin as text (into buffer 1).
+
Example: >
- vim -e -s < thefilter thefile
+ printf "put ='foo'\n%%print\n" | nvim -es
<
*-b*
-b Binary mode. File I/O will only recognize <NL> to separate
@@ -254,14 +243,14 @@ argument.
for reading or writing a ShaDa file. Can be used to find
out what is happening upon startup and exit.
Example: >
- vim -V8 foobar
+ nvim -V8
-V[N]{filename}
- Like -V and set 'verbosefile' to {filename}. The result is
- that messages are not displayed but written to the file
- {filename}. {filename} must not start with a digit.
+ Like -V and set 'verbosefile' to {filename}. Messages are not
+ displayed; instead they are written to the file {filename}.
+ {filename} must not start with a digit.
Example: >
- vim -V20vimlog foobar
+ nvim -V20vimlog
<
*-D*
-D Debugging. Go to debugging mode when executing the first
@@ -329,12 +318,15 @@ argument.
":rsh" or ":wsh" are used. See also |shada-file|.
*-s*
--s {scriptin} The script file "scriptin" is read. The characters in the
- file are interpreted as if you had typed them. The same can
- be done with the command ":source! {scriptin}". If the end
- of the file is reached before the editor exits, further
- characters are read from the keyboard. Only works when not
- started in Ex mode, see |-s-ex|. See also |complex-repeat|.
+-s {scriptin} Read script file {scriptin}, interpreting characters as
+ Normal-mode input. The same can be done with ":source!": >
+ :source! {scriptin}
+< Reads from stdin if {scriptin} is "-": >
+ echo "ifoo" | nvim -s -
+< If the end of the file is reached before Nvim exits, further
+ characters are read from the keyboard.
+
+ Does not work with |-es|. See also |complex-repeat|.
*-w_nr*
-w {number}
@@ -354,13 +346,58 @@ argument.
*--api-info*
--api-info Print msgpack-encoded |api-metadata| and exit.
+ *--embed*
+--embed Use stdin/stdout as a msgpack-RPC channel, so applications can
+ embed and control Nvim via the |rpc-api|.
+
+ By default nvim will wait for the embedding process to call
+ `nvim_ui_attach` before sourcing startup files and reading
+ buffers. This is so that UI can show startup messages and
+ possible swap file dialog for the first loaded file. The
+ process can do requests before the `nvim_ui_attach`, for
+ instance a `nvim_get_api_info` call so that UI features can be
+ safely detected by the UI before attaching.
+
+ See |ui-startup| for more information about UI startup.
+
+ To embed nvim without using the UI protocol, `--headless` should
+ be supplied together with `--embed`. Then initialization is
+ performed without waiting for an UI. This is also equivalent
+ to the following alternative: >
+ nvim --headless --cmd "call stdioopen({'rpc': v:true})"
+<
+ See also |channel-stdio|.
+
+ *--headless*
+--headless Start nvim without an UI. The TUI is not used, so stdio
+ can be used as an arbitrary communication channel.
+ |channel-stdio| When used together with `--embed`, do not wait
+ for the embedder to attach an UI.
+
+ Also useful for scripting (tests) to see messages that would
+ not be printed by |-es|.
+
+ To detect if a UI is available, check if |nvim_list_uis()| is
+ empty in or after |VimEnter|.
+
+ To read stdin as text, "-" must be given explicitly:
+ --headless cannot assume that stdin is just text. >
+ echo foo | nvim --headless +"%print" +"q!" -
+<
+ See also |--embed|.
+ See also |-es|, which also disables most messages.
+
+--listen {addr} *--listen*
+ Start |RPC| server on pipe or TCP address {addr}. Sets the
+ primary listen address |v:servername| to {addr}. |serverstart()|
+
==============================================================================
2. Initialization *initialization* *startup*
At startup, Vim checks environment variables and files and sets values
accordingly. Vim proceeds in this order:
-1. Set the 'shell' option *SHELL* *COMSPEC* *TERM*
+1. Set the 'shell' option *SHELL* *COMSPEC*
The environment variable SHELL, if it exists, is used to set the
'shell' option. On Windows, the COMSPEC variable is used
if SHELL is not set.
@@ -373,23 +410,17 @@ accordingly. Vim proceeds in this order:
3. Execute Ex commands, from environment variables and/or files
An environment variable is read as one Ex command line, where multiple
- commands must be separated with '|' or "<NL>".
- *init.vim* *vimrc* *exrc*
- A file that contains initialization commands is called a "vimrc" file.
- Each line in a vimrc file is executed as an Ex command line. It is
- sometimes also referred to as "exrc" file. They are the same type of
- file, but "exrc" is what Vi always used, "vimrc" is a Vim specific
- name, "init.vim" is Neovim specific location for vimrc file. Also see
- |vimrc-intro|.
-
- Places for your personal initializations:
- Unix $XDG_CONFIG_HOME/nvim/init.vim
- (default for $XDG_CONFIG_HOME is ~/.config)
- Windows $XDG_CONFIG_HOME/nvim/init.vim
- (default for $XDG_CONFIG_HOME is ~/AppData/Local)
-
- The files are searched in the order specified above and only the first
- one that is found is read.
+ commands must be separated with '|' or <NL>.
+ *config* *init.vim* *vimrc* *exrc*
+ A file that contains initialization commands is generically called
+ a "vimrc" or config file. Each line in a vimrc file is executed as an
+ Ex command line. See also |vimrc-intro| and |base-directories|.
+
+ The Nvim config file is named "init.vim", located at:
+ Unix ~/.config/nvim/init.vim
+ Windows ~/AppData/Local/nvim/init.vim
+ Or if |$XDG_CONFIG_HOME| is defined:
+ $XDG_CONFIG_HOME/nvim/init.vim
RECOMMENDATION: Put all your Vim configuration stuff in the
$HOME/.config/nvim/ directory. That makes it easy to copy it to
@@ -405,10 +436,11 @@ accordingly. Vim proceeds in this order:
If Vim was started in Ex mode with the "-s" argument, all following
initializations until 4. are skipped. Only the "-u" option is
interpreted.
- *system-vimrc*
- a. For Unix, MS-Windows, and Macintosh, the system vimrc file is read for
- initializations. The path of this file is shown with the
- ":version" command. Mostly it's "$VIM/vimrc".
+ *system-vimrc* *sysinit.vim*
+ a. The system vimrc file is read for initializations. If
+ nvim/sysinit.vim file exists in one of $XDG_CONFIG_DIRS, it will be
+ used. Otherwise, the system vimrc file is used. The path of this file
+ is shown with the ":version" command. Mostly it's "$VIM/sysinit.vim".
*VIMINIT* *EXINIT* *$MYVIMRC*
b. Four places are searched for initializations. The first that exists
@@ -423,7 +455,7 @@ accordingly. Vim proceeds in this order:
- The environment variable EXINIT.
The value of $EXINIT is used as an Ex command line.
- c. If the 'exrc' option is on (which is not the default), the current
+ c. If the 'exrc' option is on (which is NOT the default), the current
directory is searched for three files. The first that exists is used,
the others are ignored.
- The file ".nvimrc" (for Unix)
@@ -438,15 +470,14 @@ accordingly. Vim proceeds in this order:
:runtime! filetype.vim
:runtime! ftplugin.vim
:runtime! indent.vim
-< This step is skipped if ":filetype ..." was called before now or if
- the "-u NONE" command line argument was given.
+< Skipped if ":filetype โ€ฆ off" was called or if the "-u NONE" command
+ line argument was given.
5. Enable syntax highlighting.
This does the same as the command: >
:runtime! syntax/syntax.vim
-< Note: This enables filetype detection even if ":filetype off" was
- called before now.
- This step is skipped if the "-u NONE" command line argument was given.
+< Skipped if ":syntax off" was called or if the "-u NONE" command
+ line argument was given.
6. Load the plugin scripts. *load-plugins*
This does the same as the command: >
@@ -455,6 +486,8 @@ accordingly. Vim proceeds in this order:
searched for the "plugin" sub-directory and all files ending in ".vim"
will be sourced (in alphabetical order per directory), also in
subdirectories.
+ However, directories in 'runtimepath' ending in "after" are skipped
+ here and only loaded after packages, see below.
Loading plugins won't be done when:
- The 'loadplugins' option was reset in a vimrc file.
- The |--noplugin| command line argument is used.
@@ -462,13 +495,18 @@ accordingly. Vim proceeds in this order:
- When Vim was compiled without the |+eval| feature.
Note that using "-c 'set noloadplugins'" doesn't work, because the
commands from the command line have not been executed yet. You can
- use "--cmd 'set noloadplugins'" |--cmd|.
+ use "--cmd 'set noloadplugins'" or "--cmd 'set loadplugins'" |--cmd|.
Packages are loaded. These are plugins, as above, but found in the
"start" directory of each entry in 'packpath'. Every plugin directory
found is added in 'runtimepath' and then the plugins are sourced. See
|packages|.
+ The plugins scripts are loaded, as above, but now only the directories
+ ending in "after" are used. Note that 'runtimepath' will have changed
+ if packages have been found, but that should not add a directory
+ ending in "after".
+
7. Set 'shellpipe' and 'shellredir'
The 'shellpipe' and 'shellredir' options are set according to the
value of the 'shell' option, unless they have been set before.
@@ -509,7 +547,8 @@ accordingly. Vim proceeds in this order:
The |v:vim_did_enter| variable is set to 1.
The |VimEnter| autocommands are executed.
-Some hints on using initializations:
+
+Some hints on using initializations ~
Standard setup:
Create a vimrc file to set the default settings and mappings for all your edit
@@ -531,17 +570,23 @@ the ":version" command. NOTE: System vimrc file needs specific compilation
options (one needs to define SYS_VIMRC_FILE macros). If :version command does
not show anything like this, consider contacting the nvim package maintainer.
-Saving the current state of Vim to a file:
+
+Saving the current state of Vim to a file ~
+
Whenever you have changed values of options or when you have created a
mapping, then you may want to save them in a vimrc file for later use. See
|save-settings| about saving the current state of settings to a file.
-Avoiding setup problems for Vi users:
+
+Avoiding setup problems for Vi users ~
+
Vi uses the variable EXINIT and the file "~/.exrc". So if you do not want to
interfere with Vi, then use the variable VIMINIT and the file init.vim
instead.
-MS-DOS line separators:
+
+MS-DOS line separators: ~
+
On Windows systems Vim assumes that all the vimrc files have <CR> <NL> pairs
as line separators. This will give problems if you have a file with only
<NL>s and have a line like ":map xx yy^M". The trailing ^M will be ignored.
@@ -549,8 +594,10 @@ as line separators. This will give problems if you have a file with only
The $MYVIMRC or $MYGVIMRC file will be set to the first found vimrc and/or
gvimrc file.
-Avoiding trojan horses: *trojan-horse*
-While reading the vimrc or the exrc file in the current directory, some
+
+Avoiding trojan horses ~
+ *trojan-horse*
+While reading the "vimrc" or the "exrc" file in the current directory, some
commands can be disabled for security reasons by setting the 'secure' option.
This is always done when executing the command from a tags file. Otherwise it
would be possible that you accidentally use a vimrc or tags file that somebody
@@ -572,6 +619,8 @@ Be careful!
part of the line in the tags file) is always done in secure mode. This works
just like executing a command from a vimrc/exrc in the current directory.
+
+If Vim startup is slow ~
*slow-start*
If Vim takes a long time to start up, use the |--startuptime| argument to find
out what happens.
@@ -581,6 +630,8 @@ while. You can find out if this is the problem by disabling ShaDa for a
moment (use the Vim argument "-i NONE", |-i|). Try reducing the number of
lines stored in a register with ":set shada='20,<50,s10". |shada-file|.
+
+Intro message ~
*:intro*
When Vim starts without a file name, an introductory message is displayed (for
those who don't know what Vim is). It is removed as soon as the display is
@@ -589,84 +640,53 @@ there is not enough room, you will see only part of it).
To avoid the intro message on startup, add the 'I' flag to 'shortmess'.
*info-message*
-The |--help| and |--version| arguments cause Vim to print a message and then
+The |--help| and |--version| arguments cause Nvim to print a message and then
exit. Normally the message is sent to stdout, thus can be redirected to a
file with: >
- vim --help >file
-
-From inside Vim: >
-
- :read !vim --help
+ nvim --help >file
-When using gvim, it detects that it might have been started from the desktop,
-without a terminal to show messages on. This is detected when both stdout and
-stderr are not a tty. This breaks the ":read" command, as used in the example
-above. To make it work again, set 'shellredir' to ">" instead of the default
-">&": >
+From inside Nvim: >
- :set shellredir=>
- :read !gvim --help
-
-This still won't work for systems where gvim does not use stdout at all
-though.
+ :read !nvim --help
==============================================================================
3. $VIM and $VIMRUNTIME
*$VIM*
-The environment variable "$VIM" is used to locate various user files for Vim,
+The environment variable "$VIM" is used to locate various user files for Nvim,
such as the user startup script |init.vim|. This depends on the system, see
|startup|.
-To avoid the need for every user to set the $VIM environment variable, Vim
-will try to get the value for $VIM in this order:
-1. The value defined by the $VIM environment variable. You can use this to
- make Vim look in a specific directory for its support files. Example: >
- setenv VIM /home/paul/vim
-2. The path from 'helpfile' is used, unless it contains some environment
- variable too (the default is "$VIMRUNTIME/doc/help.txt": chicken-egg
- problem). The file name ("help.txt" or any other) is removed. Then
- trailing directory names are removed, in this order: "doc", "runtime" and
- "vim{version}" (e.g., "vim54").
-3. For MSDOS and Win32 Vim tries to use the directory name of the
- executable. If it ends in "/src", this is removed. This is useful if you
- unpacked the .zip file in some directory, and adjusted the search path to
- find the vim executable. Trailing directory names are removed, in this
- order: "runtime" and "vim{version}" (e.g., "vim54").
-4. For Unix the compile-time defined installation directory is used (see the
- output of ":version").
-
-Once Vim has done this once, it will set the $VIM environment variable. To
-change it later, use a ":let" command like this: >
- :let $VIM = "/home/paul/vim/"
-<
+Nvim will try to get the value for $VIM in this order:
+
+1. Environment variable $VIM, if it is set.
+2. Path derived from the 'helpfile' option, unless it contains some
+ environment variable too (default is "$VIMRUNTIME/doc/help.txt"). File
+ name ("help.txt", etc.) is removed. Trailing directory names are removed,
+ in this order: "doc", "runtime".
+3. Path derived from the location of the `nvim` executable.
+4. Compile-time defined installation directory (see output of ":version").
+
+After doing this once, Nvim sets the $VIM environment variable.
+
*$VIMRUNTIME*
The environment variable "$VIMRUNTIME" is used to locate various support
-files, such as the on-line documentation and files used for syntax
-highlighting. For example, the main help file is normally
-"$VIMRUNTIME/doc/help.txt".
-You don't normally set $VIMRUNTIME yourself, but let Vim figure it out. This
-is the order used to find the value of $VIMRUNTIME:
-1. If the environment variable $VIMRUNTIME is set, it is used. You can use
- this when the runtime files are in an unusual location.
-2. If "$VIM/vim{version}" exists, it is used. {version} is the version
- number of Vim, without any '-' or '.'. For example: "$VIM/vim54". This is
- the normal value for $VIMRUNTIME.
-3. If "$VIM/runtime" exists, it is used.
-4. The value of $VIM is used. This is for backwards compatibility with older
- versions.
-5. When the 'helpfile' option is set and doesn't contain a '$', its value is
- used, with "doc/help.txt" removed from the end.
-
-For Unix, when there is a compiled-in default for $VIMRUNTIME (check the
-output of ":version"), steps 2, 3 and 4 are skipped, and the compiled-in
-default is used after step 5. This means that the compiled-in default
-overrules the value of $VIM. This is useful if $VIM is "/etc" and the runtime
-files are in "/usr/share/vim/vim54".
-
-Once Vim has done this once, it will set the $VIMRUNTIME environment variable.
-To change it later, use a ":let" command like this: >
- :let $VIMRUNTIME = "/home/piet/vim/vim54"
+files, such as the documentation and syntax-highlighting files. For example,
+the main help file is normally "$VIMRUNTIME/doc/help.txt".
+
+Nvim will try to get the value for $VIMRUNTIME in this order:
+
+1. Environment variable $VIMRUNTIME, if it is set.
+2. Directory path "$VIM/vim{version}", if it exists, where {version} is the
+ Vim version number without '-' or '.'. For example: "$VIM/vim54".
+3. Directory path "$VIM/runtime", if it exists.
+4. Value of $VIM environment variable. This is for backwards compatibility
+ with older Vim versions.
+5. If "../share/nvim/runtime" exists relative to |v:progpath|, it is used.
+6. Path derived from the 'helpfile' option (if it doesn't contain '$') with
+ "doc/help.txt" removed from the end.
+
+After doing this once, Nvim sets the $VIMRUNTIME environment variable.
In case you need the value of $VIMRUNTIME in a shell (e.g., for a script that
greps in the help files) you might be able to use this: >
@@ -677,34 +697,24 @@ greps in the help files) you might be able to use this: >
4. Suspending *suspend*
*iconize* *iconise* *CTRL-Z* *v_CTRL-Z*
-CTRL-Z Suspend Vim, like ":stop".
+CTRL-Z Suspend Nvim, like ":stop".
Works in Normal and in Visual mode. In Insert and
Command-line mode, the CTRL-Z is inserted as a normal
- character. In Visual mode Vim goes back to Normal
+ character. In Visual mode Nvim goes back to Normal
mode.
- Note: if CTRL-Z undoes a change see |mswin.vim|.
-
:sus[pend][!] or *:sus* *:suspend* *:st* *:stop*
-:st[op][!] Suspend Vim.
- If the '!' is not given and 'autowrite' is set, every
+:st[op][!] Suspend Nvim using OS "job control"; it will continue
+ if you make it the foreground job again. Triggers
+ |VimSuspend| before suspending and |VimResume| when
+ resumed.
+ If "!" is not given and 'autowrite' is set, every
buffer with changes and a file name is written out.
- If the '!' is given or 'autowrite' is not set, changed
- buffers are not written, don't forget to bring Vim
+ If "!" is given or 'autowrite' is not set, changed
+ buffers are not written, don't forget to bring Nvim
back to the foreground later!
-In the GUI, suspending is implemented as iconising gvim. In Windows 95/NT,
-gvim is minimized.
-
-On many Unix systems, it is possible to suspend Vim with CTRL-Z. This is only
-possible in Normal and Visual mode (see next chapter, |vim-modes|). Vim will
-continue if you make it the foreground job again. On other systems, CTRL-Z
-will start a new shell. This is the same as the ":sh" command. Vim will
-continue if you exit from the shell.
-
-In X-windows the selection is disowned when Vim suspends. this means you
-can't paste it in another application (since Vim is going to sleep an attempt
-to get the selection would make the program hang).
+In the GUI, suspending is implementation-defined.
==============================================================================
5. Exiting *exiting*
@@ -717,7 +727,7 @@ There are several ways to exit Vim:
- Use `:cquit`. Also when there are changes.
When using `:cquit` or when there was an error message Vim exits with exit
-code 1. Errors can be avoided by using `:silent!`.
+code 1. Errors can be avoided by using `:silent!` or with `:catch`.
==============================================================================
6. Saving settings *save-settings*
@@ -837,7 +847,7 @@ resulting file, when executed with a ":source" command:
such as creating menu items in the GUI version.
After restoring the Session, the full filename of your current Session is
-available in the internal variable "v:this_session" |this_session-variable|.
+available in the internal variable |v:this_session|.
An example mapping: >
:nmap <F2> :wa<Bar>exe "mksession! " . v:this_session<CR>:so ~/sessions/
This saves the current Session, and starts off the command to load another.
@@ -885,7 +895,7 @@ The output of ":mkview" contains these items:
5. The scroll position and the cursor position in the file. Doesn't work very
well when there are closed folds.
6. The local current directory, if it is different from the global current
- directory.
+ directory and 'viewoptions' contains "curdir".
Note that Views and Sessions are not perfect:
- They don't restore everything. For example, defined functions, autocommands
@@ -918,7 +928,7 @@ You might want to clean up your 'viewdir' directory now and then.
To automatically save and restore views for *.c files: >
au BufWinLeave *.c mkview
- au BufWinEnter *.c silent loadview
+ au BufWinEnter *.c silent! loadview
==============================================================================
8. The ShaDa file *shada* *shada-file*
@@ -1015,7 +1025,7 @@ Use the "r" flag in 'shada' to specify for which files no marks should be
remembered.
MERGING *shada-merging*
- {Nvim}
+
When writing ShaDa files with |:wshada| without bang or at regular exit
information in the existing ShaDa file is merged with information from current
Neovim instance. For this purpose ShaDa files store timestamps associated
@@ -1045,7 +1055,7 @@ with ShaDa entries. Specifically the following is being done:
Neovim instance which was last writing the file. |shada-%|
COMPATIBILITY *shada-compatibility*
- {Nvim}
+
ShaDa files are forward and backward compatible. This means that
1. Entries which have unknown type (i.e. that hold unidentified data) are
@@ -1083,33 +1093,18 @@ even if other entries (with known name/type/etc) are merged. |shada-merging|
SHADA FILE NAME *shada-file-name*
- The default name of the ShaDa file is "$XDG_DATA_HOME/nvim/shada/main.shada"
- for Unix. Default for $XDG_DATA_HOME is ~/.local/share.
+ for Unix. Default for $XDG_DATA_HOME is ~/.local/share. |base-directories|
- The 'n' flag in the 'shada' option can be used to specify another ShaDa
file name |'shada'|.
- The "-i" Vim argument can be used to set another file name, |-i|. When the
file name given is "NONE" (all uppercase), no ShaDa file is ever read or
written. Also not for the commands below!
+- The 'viminfofile' option can be used like the "-i" argument. In fact, the
+ value form the "-i" argument is stored in the 'viminfofile' option.
- For the commands below, another file name can be given, overriding the
default and the name given with 'shada' or "-i" (unless it's NONE).
-CHARACTER ENCODING *shada-encoding*
-
-The text in the ShaDa file is UTF-8-encoded. Normally you will always work
-with the same 'encoding' value, and this works just fine. However, if you
-read the ShaDa file with value for 'encoding' different from utf-8 and
-'encoding' used when writing ShaDa file, some of the text (non-ASCII
-characters) may be invalid as Neovim always attempts to convert the text in
-the ShaDa file from the UTF-8 to the current 'encoding' value. Filenames are
-never converted, affected elements are:
-
-- history strings;
-- variable values;
-- register values;
-- last used search and substitute patterns;
-- last used substitute replacement string.
-
-
MANUALLY READING AND WRITING *shada-read-write*
Two commands can be used to read and write the ShaDa file manually. This
@@ -1133,7 +1128,7 @@ files for different types of files (e.g., C code) and load them based on the
file name, using the ":autocmd" command (see |:autocmd|). More information on
ShaDa file format is contained in |shada-format| section.
- *E136* *E138* *shada-error-handling*
+ *E136* *E929* *shada-error-handling*
Some errors make Neovim leave temporary file named `{basename}.tmp.X` (X is
any free letter from `a` to `z`) while normally it will create this file,
write to it and then rename `{basename}.tmp.X` to `{basename}`. Such errors
@@ -1153,7 +1148,7 @@ include:
Do not forget to remove the temporary file or replace the target file with
temporary one after getting one of the above errors or all attempts to create
-a ShaDa file may fail with |E138|. If you got one of them when using
+a ShaDa file may fail with |E929|. If you got one of them when using
|:wshada| (and not when exiting Neovim: i.e. when you have Neovim session
running) you have additional options:
@@ -1177,9 +1172,6 @@ running) you have additional options:
already set (registers, marks, |v:oldfiles|, etc.)
will be overwritten.
- *:rv* *:rviminfo*
-:rv[iminfo][!] [file] Deprecated alias to |:rshada| command.
-
*:wsh* *:wshada* *E137*
:wsh[ada][!] [file] Write to ShaDa file [file] (default: see above).
The information in the file is first read in to make
@@ -1188,22 +1180,21 @@ running) you have additional options:
internal info is written (also disables safety checks
described in |shada-error-handling|). If 'shada' is
empty, marks for up to 100 files will be written.
- When you get error "E138: All .tmp.X files exist,
+ When you get error "E929: All .tmp.X files exist,
cannot write ShaDa file!" check that no old temp files
were left behind (e.g.
~/.local/share/nvim/shada/main.shada.tmp*).
Note: Executing :wshada will reset all |'quote| marks.
- *:wv* *:wviminfo*
-:wv[iminfo][!] [file] Deprecated alias to |:wshada| command.
-
*:o* *:ol* *:oldfiles*
-:o[ldfiles][!] List the files that have marks stored in the ShaDa
+:o[ldfiles] List the files that have marks stored in the ShaDa
file. This list is read on startup and only changes
- afterwards with ":rshada!". Also see |v:oldfiles|.
+ afterwards with `:rshada!`. Also see |v:oldfiles|.
The number can be used with |c_#<|.
- Use ! to get a file selection prompt.
+ The output can be filtered with |:filter|, e.g.: >
+ filter /\.vim/ oldfiles
+< The filtering happens on the file name.
:bro[wse] o[ldfiles][!]
List file names as with |:oldfiles|, and then prompt
@@ -1224,8 +1215,11 @@ exactly four MessagePack objects:
3. Third goes the length of the fourth entry. Unsigned integer as well, used
for fast skipping without parsing.
4. Fourth is actual entry data. All currently used ShaDa entries use
- containers to hold data: either map or array. Exact format depends on the
- entry type:
+ containers to hold data: either map or array. All string values in those
+ containers are either binary (applies to filenames) or UTF-8, yet parser
+ needs to expect that invalid bytes may be present in a UTF-8 string.
+
+ Exact format depends on the entry type:
Entry type (name) Entry data ~
1 (Header) Map containing data that describes the generator
@@ -1289,29 +1283,32 @@ exactly four MessagePack objects:
5 (Register) Map describing one register (|registers|). If key
value is equal to default then it is normally not
present. Keys:
- Key Type Def Description ~
- rt UInteger 0 Register type:
- No Description ~
- 0 |characterwise-register|
- 1 |linewise-register|
- 2 |blockwise-register|
- rw UInteger 0 Register width. Only valid
- for |blockwise-register|s.
- rc Array of binary N/A Register contents. Each
- entry in the array
- represents its own line.
- NUL characters inside the
- line should be represented
- as NL according to
- |NL-used-for-Nul|.
- n UInteger N/A Register name: character
- code in range [1, 255].
- Example: |quote0| register
- has name 48 (ASCII code for
- zero character).
- * any none Other keys are allowed
- for compatibility reasons,
- see |shada-compatibility|.
+ Key Type Def Description ~
+ rt UInteger 0 Register type:
+ No Description ~
+ 0 |characterwise-register|
+ 1 |linewise-register|
+ 2 |blockwise-register|
+ rw UInteger 0 Register width. Only valid
+ for |blockwise-register|s.
+ rc Array of binary N/A Register contents. Each
+ entry in the array
+ represents its own line.
+ NUL characters inside the
+ line should be represented
+ as NL according to
+ |NL-used-for-Nul|.
+ ru Boolean false Unnamed register. Whether
+ the unnamed register had
+ pointed to this register.
+ n UInteger N/A Register name: character
+ code in range [1, 255].
+ Example: |quote0| register
+ has name 48 (ASCII code for
+ zero character).
+ * any none Other keys are allowed
+ for compatibility reasons,
+ see |shada-compatibility|.
6 (Variable) Array containing two items: variable name (binary) and
variable value (any object). Values are converted
using the same code |msgpackparse()| uses when reading,
@@ -1370,4 +1367,36 @@ file when reading and include:
either contains more then one MessagePack object or it does not contain
complete MessagePack object.
- vim:tw=78:ts=8:ft=help:norl:
+==============================================================================
+9. Standard Paths *standard-path*
+
+Nvim stores configuration and data in standard locations. Plugins are strongly
+encouraged to follow this pattern also. Use |stdpath()| to get the paths.
+
+ *base-directories* *xdg*
+The "base" (root) directories conform to the XDG Base Directory Specification.
+https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
+The $XDG_CONFIG_HOME and $XDG_DATA_HOME environment variables are used if they
+exist, otherwise default values (listed below) are used.
+
+CONFIG DIRECTORY (DEFAULT) ~
+ *$XDG_CONFIG_HOME* Nvim: stdpath("config")
+ Unix: ~/.config ~/.config/nvim
+ Windows: ~/AppData/Local ~/AppData/Local/nvim
+
+DATA DIRECTORY (DEFAULT) ~
+ *$XDG_DATA_HOME* Nvim: stdpath("data")
+ Unix: ~/.local/share ~/.local/share/nvim
+ Windows: ~/AppData/Local ~/AppData/Local/nvim-data
+
+Note: Throughout the user manual these defaults are used as placeholders, e.g.
+"~/.config" is understood to mean "$XDG_CONFIG_HOME or ~/.config".
+
+LOG FILE *$NVIM_LOG_FILE*
+Besides 'debug' and 'verbose', Nvim keeps a general log file for internal
+debugging, plugins and RPC clients. >
+ :echo $NVIM_LOG_FILE
+Usually the file is ~/.local/share/nvim/log unless that path is inaccessible
+or if $NVIM_LOG_FILE was set before |startup|.
+
+ vim:noet:tw=78:ts=8:ft=help:norl:
diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt
index 491e5801c8..684830b78d 100644
--- a/runtime/doc/syntax.txt
+++ b/runtime/doc/syntax.txt
@@ -1,4 +1,4 @@
-*syntax.txt* For Vim version 7.4. Last change: 2016 Apr 10
+*syntax.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -20,24 +20,7 @@ In the User Manual:
|usr_06.txt| introduces syntax highlighting.
|usr_44.txt| introduces writing a syntax file.
-1. Quick start |:syn-qstart|
-2. Syntax files |:syn-files|
-3. Syntax loading procedure |syntax-loading|
-4. Syntax file remarks |:syn-file-remarks|
-5. Defining a syntax |:syn-define|
-6. :syntax arguments |:syn-arguments|
-7. Syntax patterns |:syn-pattern|
-8. Syntax clusters |:syn-cluster|
-9. Including syntax files |:syn-include|
-10. Synchronizing |:syn-sync|
-11. Listing syntax items |:syntax|
-12. Highlight command |:highlight|
-13. Linking groups |:highlight-link|
-14. Cleaning up |:syn-clear|
-15. Highlighting tags |tag-highlight|
-16. Window-local syntax |:ownsyntax|
-17. Color xterms |xterm-color|
-18. When syntax is slow |:syntime|
+ Type |gO| to see the table of contents.
==============================================================================
1. Quick start *:syn-qstart*
@@ -56,10 +39,12 @@ fine. If it doesn't, try setting the VIM environment variable to the
directory where the Vim stuff is located. For example, if your syntax files
are in the "/usr/vim/vim50/syntax" directory, set $VIMRUNTIME to
"/usr/vim/vim50". You must do this in the shell, before starting Vim.
+This command also sources the |menu.vim| script when the GUI is running or
+will start soon. See |'go-M'| about avoiding that.
*:syn-on* *:syntax-on*
-The ":syntax enable" command will keep your current color settings. This
-allows using ":highlight" commands to set your preferred colors before or
+The `:syntax enable` command will keep your current color settings. This
+allows using `:highlight` commands to set your preferred colors before or
after using this command. If you want Vim to overrule your settings with the
defaults, use: >
:syntax on
@@ -805,12 +790,9 @@ See |mysyntaxfile-add| for installing script languages permanently.
APACHE *apache.vim* *ft-apache-syntax*
-The apache syntax file provides syntax highlighting depending on Apache HTTP
-server version, by default for 1.3.x. Set "apache_version" to Apache version
-(as a string) to get highlighting for another version. Example: >
+The apache syntax file provides syntax highlighting for Apache HTTP server
+version 2.2.3.
- :let apache_version = "2.0"
-<
*asm.vim* *asmh8300.vim* *nasm.vim* *masm.vim* *asm68k*
ASSEMBLY *ft-asm-syntax* *ft-asmh8300-syntax* *ft-nasm-syntax*
@@ -944,6 +926,8 @@ Variable Highlight ~
*c_no_bracket_error* don't highlight {}; inside [] as errors
*c_no_curly_error* don't highlight {}; inside [] and () as errors;
except { and } in first column
+ Default is to highlight them, otherwise you
+ can't spot a missing ")".
*c_curly_error* highlight a missing }; this forces syncing from the
start of the file, can be slow
*c_no_ansi* don't do standard ANSI types and constants
@@ -1038,6 +1022,21 @@ This works immediately.
CLOJURE *ft-clojure-syntax*
+The default syntax groups can be augmented through the
+*g:clojure_syntax_keywords* and *b:clojure_syntax_keywords* variables. The
+value should be a |Dictionary| of syntax group names to a |List| of custom
+identifiers:
+>
+ let g:clojure_syntax_keywords = {
+ \ 'clojureMacro': ["defproject", "defcustom"],
+ \ 'clojureFunc': ["string/join", "string/replace"]
+ \ }
+<
+Refer to the Clojure syntax script for valid syntax group names.
+
+If the |buffer-variable| *b:clojure_syntax_without_core_keywords* is set, only
+language constants and special forms are matched.
+
Setting *g:clojure_fold* enables folding Clojure code via the syntax engine.
Any list, vector, or map that extends over more than one line can be folded
using the standard Vim |fold-commands|.
@@ -1244,7 +1243,7 @@ doxygen_javadoc_autobrief 1 Set to 0 to disable javadoc autobrief
doxygen_end_punctuation '[.]' Set to regexp match for the ending
punctuation of brief
-There are also some hilight groups worth mentioning as they can be useful in
+There are also some highlight groups worth mentioning as they can be useful in
configuration.
Highlight Effect ~
@@ -1455,7 +1454,7 @@ algorithm should work in the vast majority of cases. In some cases, such as a
file that begins with 500 or more full-line comments, the script may
incorrectly decide that the fortran code is in fixed form. If that happens,
just add a non-comment statement beginning anywhere in the first five columns
-of the first twenty five lines, save (:w) and then reload (:e!) the file.
+of the first twenty-five lines, save (:w) and then reload (:e!) the file.
Tabs in fortran files ~
Tabs are not recognized by the Fortran standards. Tabs are not a good idea in
@@ -1570,15 +1569,6 @@ as Fvwm2 configuration files, add the following: >
:au! BufNewFile,BufRead /etc/X11/fvwm2/* let b:fvwm_version = 2 |
\ set filetype=fvwm
-If you'd like Vim to highlight all valid color names, tell it where to
-find the color database (rgb.txt) on your system. Do this by setting
-"rgb_file" to its location. Assuming your color database is located
-in /usr/X11/lib/X11/, you should add the line >
-
- :let rgb_file = "/usr/X11/lib/X11/rgb.txt"
-
-to your vimrc file.
-
GSP *gsp.vim* *ft-gsp-syntax*
@@ -1737,7 +1727,7 @@ Functions and variable names are the same color by default, because VIM
doesn't specify different colors for Functions and Identifiers. To change
this (which is recommended if you want function names to be recognizable in a
different color) you need to add the following line to your vimrc: >
- :hi Function term=underline cterm=bold ctermfg=LightGray
+ :hi Function cterm=bold ctermfg=LightGray
Of course, the ctermfg can be a different color if you choose.
@@ -1957,7 +1947,7 @@ set "lite_minlines" to the value you desire. Example: >
LPC *lpc.vim* *ft-lpc-syntax*
-LPC stands for a simple, memory-efficient language: Lars Pensj| C. The
+LPC stands for a simple, memory-efficient language: Lars Pensjรถ C. The
file name of LPC is usually *.c. Recognizing these files as LPC would bother
users writing only C programs. If you want to use LPC syntax in Vim, you
should set a variable in your vimrc file: >
@@ -2117,6 +2107,16 @@ set "msql_minlines" to the value you desire. Example: >
:let msql_minlines = 200
+N1QL *n1ql.vim* *ft-n1ql-syntax*
+
+N1QL is a SQL-like declarative language for manipulating JSON documents in
+Couchbase Server databases.
+
+Vim syntax highlights N1QL statements, keywords, operators, types, comments,
+and special values. Vim ignores syntactical elements specific to SQL or its
+many dialects, like COLUMN or CHAR, that don't exist in N1QL.
+
+
NCF *ncf.vim* *ft-ncf-syntax*
There is one option for NCF syntax highlighting.
@@ -2183,9 +2183,8 @@ with the correct typesetting of your file, is to define an eye-catching
highlighting definition for the syntax groups "nroffDefinition" and
"nroffDefSpecial" in your configuration files. For example: >
- hi def nroffDefinition term=italic cterm=italic gui=reverse
- hi def nroffDefSpecial term=italic,bold cterm=italic,bold
- \ gui=reverse,bold
+ hi def nroffDefinition cterm=italic gui=reverse
+ hi def nroffDefSpecial cterm=italic,bold gui=reverse,bold
If you want to navigate preprocessor entries in your source file as easily as
with section markers, you can activate the following option in your vimrc
@@ -2611,6 +2610,48 @@ Any combination of these three variables is legal, but might highlight more
commands than are actually available to you by the game.
+R *r.vim* *ft-r-syntax*
+
+The parsing of R code for syntax highlight starts 40 lines backwards, but you
+can set a different value in your |vimrc|. Example: >
+ let r_syntax_minlines = 60
+
+You can also turn off syntax highlighting of ROxygen: >
+ let r_syntax_hl_roxygen = 0
+
+enable folding of code delimited by parentheses, square brackets and curly
+braces: >
+ let r_syntax_folding = 1
+
+and highlight as functions all keywords followed by an opening parenthesis: >
+ let r_syntax_fun_pattern = 1
+
+
+R MARKDOWN *rmd.vim* *ft-rmd-syntax*
+
+To disable syntax highlight of YAML header, add to your |vimrc|: >
+ let rmd_syn_hl_yaml = 0
+
+To disable syntax highlighting of citation keys: >
+ let rmd_syn_hl_citations = 0
+
+To highlight R code in knitr chunk headers: >
+ let rmd_syn_hl_chunk = 1
+
+By default, chunks of R code will be highlighted following the rules of R
+language. If you want proper syntax highlighting of chunks of other languages,
+you should add them to either `markdown_fenced_languages` or
+`rmd_fenced_languages`. For example to properly highlight both R and Python,
+you may add this to your |vimrc|: >
+ let rmd_fenced_languages = ['r', 'python']
+
+
+R RESTRUCTURED TEXT *rrst.vim* *ft-rrst-syntax*
+
+To highlight R code in knitr chunk headers, add to your |vimrc|: >
+ let rrst_syn_hl_chunk = 1
+
+
READLINE *readline.vim* *ft-readline-syntax*
The readline library is primarily used by the BASH shell, which adds quite a
@@ -2625,9 +2666,9 @@ later, and part earlier) adds.
RESTRUCTURED TEXT *rst.vim* *ft-rst-syntax*
-You may set what syntax definitions should be used for code blocks via
+You may set what syntax definitions should be used for code blocks via >
let rst_syntax_code_list = ['vim', 'lisp', ...]
-
+<
REXX *rexx.vim* *ft-rexx-syntax*
@@ -2648,79 +2689,111 @@ your vimrc: *g:filetype_r*
RUBY *ruby.vim* *ft-ruby-syntax*
-There are a number of options to the Ruby syntax highlighting.
+ Ruby: Operator highlighting |ruby_operators|
+ Ruby: Whitespace errors |ruby_space_errors|
+ Ruby: Folding |ruby_fold| |ruby_foldable_groups|
+ Ruby: Reducing expensive operations |ruby_no_expensive| |ruby_minlines|
+ Ruby: Spellchecking strings |ruby_spellcheck_strings|
-By default, the "end" keyword is colorized according to the opening statement
-of the block it closes. While useful, this feature can be expensive; if you
-experience slow redrawing (or you are on a terminal with poor color support)
-you may want to turn it off by defining the "ruby_no_expensive" variable: >
+ *ruby_operators*
+ Ruby: Operator highlighting ~
- :let ruby_no_expensive = 1
+Operators can be highlighted by defining "ruby_operators": >
+
+ :let ruby_operators = 1
<
-In this case the same color will be used for all control keywords.
+ *ruby_space_errors*
+ Ruby: Whitespace errors ~
-If you do want this feature enabled, but notice highlighting errors while
-scrolling backwards, which are fixed when redrawing with CTRL-L, try setting
-the "ruby_minlines" variable to a value larger than 50: >
+Whitespace errors can be highlighted by defining "ruby_space_errors": >
- :let ruby_minlines = 100
+ :let ruby_space_errors = 1
<
-Ideally, this value should be a number of lines large enough to embrace your
-largest class or module.
+This will highlight trailing whitespace and tabs preceded by a space character
+as errors. This can be refined by defining "ruby_no_trail_space_error" and
+"ruby_no_tab_space_error" which will ignore trailing whitespace and tabs after
+spaces respectively.
-Highlighting of special identifiers can be disabled by removing the
-rubyIdentifier highlighting: >
+ *ruby_fold* *ruby_foldable_groups*
+ Ruby: Folding ~
- :hi link rubyIdentifier NONE
+Folding can be enabled by defining "ruby_fold": >
+
+ :let ruby_fold = 1
<
-This will prevent highlighting of special identifiers like "ConstantName",
-"$global_var", "@@class_var", "@instance_var", "| block_param |", and
-":symbol".
+This will set the value of 'foldmethod' to "syntax" locally to the current
+buffer or window, which will enable syntax-based folding when editing Ruby
+filetypes.
-Significant methods of Kernel, Module and Object are highlighted by default.
-This can be disabled by defining "ruby_no_special_methods": >
+Default folding is rather detailed, i.e., small syntax units like "if", "do",
+"%w[]" may create corresponding fold levels.
- :let ruby_no_special_methods = 1
+You can set "ruby_foldable_groups" to restrict which groups are foldable: >
+
+ :let ruby_foldable_groups = 'if case %'
<
-This will prevent highlighting of important methods such as "require", "attr",
-"private", "raise" and "proc".
+The value is a space-separated list of keywords:
+
+ keyword meaning ~
+ -------- ------------------------------------- ~
+ ALL Most block syntax (default)
+ NONE Nothing
+ if "if" or "unless" block
+ def "def" block
+ class "class" block
+ module "module" block
+ do "do" block
+ begin "begin" block
+ case "case" block
+ for "for", "while", "until" loops
+ { Curly bracket block or hash literal
+ [ Array literal
+ % Literal with "%" notation, e.g.: %w(STRING), %!STRING!
+ / Regexp
+ string String and shell command output (surrounded by ', ", `)
+ : Symbol
+ # Multiline comment
+ << Here documents
+ __END__ Source code after "__END__" directive
+
+ *ruby_no_expensive*
+ Ruby: Reducing expensive operations ~
-Ruby operators can be highlighted. This is enabled by defining
-"ruby_operators": >
+By default, the "end" keyword is colorized according to the opening statement
+of the block it closes. While useful, this feature can be expensive; if you
+experience slow redrawing (or you are on a terminal with poor color support)
+you may want to turn it off by defining the "ruby_no_expensive" variable: >
- :let ruby_operators = 1
+ :let ruby_no_expensive = 1
<
-Whitespace errors can be highlighted by defining "ruby_space_errors": >
+In this case the same color will be used for all control keywords.
- :let ruby_space_errors = 1
-<
-This will highlight trailing whitespace and tabs preceded by a space character
-as errors. This can be refined by defining "ruby_no_trail_space_error" and
-"ruby_no_tab_space_error" which will ignore trailing whitespace and tabs after
-spaces respectively.
+ *ruby_minlines*
-Folding can be enabled by defining "ruby_fold": >
+If you do want this feature enabled, but notice highlighting errors while
+scrolling backwards, which are fixed when redrawing with CTRL-L, try setting
+the "ruby_minlines" variable to a value larger than 50: >
- :let ruby_fold = 1
+ :let ruby_minlines = 100
<
-This will set the 'foldmethod' option to "syntax" and allow folding of
-classes, modules, methods, code blocks, heredocs and comments.
+Ideally, this value should be a number of lines large enough to embrace your
+largest class or module.
+
+ *ruby_spellcheck_strings*
+ Ruby: Spellchecking strings ~
-Folding of multiline comments can be disabled by defining
-"ruby_no_comment_fold": >
+Ruby syntax will perform spellchecking of strings if you define
+"ruby_spellcheck_strings": >
- :let ruby_no_comment_fold = 1
+ :let ruby_spellcheck_strings = 1
<
SCHEME *scheme.vim* *ft-scheme-syntax*
-By default only R5RS keywords are highlighted and properly indented.
+By default only R7RS keywords are highlighted and properly indented.
-MzScheme-specific stuff will be used if b:is_mzscheme or g:is_mzscheme
-variables are defined.
-
-Also scheme.vim supports keywords of the Chicken Scheme->C compiler. Define
-b:is_chicken or g:is_chicken, if you need them.
+scheme.vim also supports extensions of the CHICKEN Scheme->C compiler.
+Define b:is_chicken or g:is_chicken, if you need them.
SDL *sdl.vim* *ft-sdl-syntax*
@@ -2807,39 +2880,44 @@ vimrc file: >
(Adapted from the html.vim help text by Claudio Fleiner <claudio@fleiner.com>)
-SH *sh.vim* *ft-sh-syntax* *ft-bash-syntax* *ft-ksh-syntax*
+ *ft-posix-synax* *ft-dash-syntax*
+SH *sh.vim* *ft-sh-syntax* *ft-bash-syntax* *ft-ksh-syntax*
-This covers the "normal" Unix (Bourne) sh, bash and the Korn shell.
+This covers syntax highlighting for the older Unix (Bourne) sh, and newer
+shells such as bash, dash, posix, and the Korn shells.
Vim attempts to determine which shell type is in use by specifying that
-various filenames are of specific types: >
+various filenames are of specific types, e.g.: >
ksh : .kshrc* *.ksh
bash: .bashrc* bashrc bash.bashrc .bash_profile* *.bash
<
-If none of these cases pertain, then the first line of the file is examined
-(ex. /bin/sh /bin/ksh /bin/bash). If the first line specifies a shelltype,
-then that shelltype is used. However some files (ex. .profile) are known to
-be shell files but the type is not apparent. Furthermore, on many systems
-sh is symbolically linked to "bash" (Linux, Windows+cygwin) or "ksh" (Posix).
-
-One may specify a global default by instantiating one of the following three
+See $VIMRUNTIME/filetype.vim for the full list of patterns. If none of these
+cases pertain, then the first line of the file is examined (ex. looking for
+/bin/sh /bin/ksh /bin/bash). If the first line specifies a shelltype, then
+that shelltype is used. However some files (ex. .profile) are known to be
+shell files but the type is not apparent. Furthermore, on many systems sh is
+symbolically linked to "bash" (Linux, Windows+cygwin) or "ksh" (Posix).
+
+One may specify a global default by instantiating one of the following
variables in your vimrc:
- ksh: >
+ ksh: >
let g:is_kornshell = 1
-< posix: (using this is the same as setting is_kornshell to 1) >
+< posix: (using this is the nearly the same as setting g:is_kornshell to 1) >
let g:is_posix = 1
< bash: >
let g:is_bash = 1
< sh: (default) Bourne shell >
let g:is_sh = 1
+< (dash users should use posix)
+
If there's no "#! ..." line, and the user hasn't availed himself/herself of a
default sh.vim syntax setting as just shown, then syntax/sh.vim will assume
the Bourne shell syntax. No need to quote RFCs or market penetration
statistics in error reports, please -- just select the default version of the
-sh your system uses in your vimrc.
+sh your system uses and install the associated "let..." in your <.vimrc>.
The syntax/sh.vim file provides several levels of syntax-based folding: >
@@ -2848,7 +2926,7 @@ The syntax/sh.vim file provides several levels of syntax-based folding: >
let g:sh_fold_enabled= 2 (enable heredoc folding)
let g:sh_fold_enabled= 4 (enable if/do/for folding)
>
-then various syntax items (HereDocuments and function bodies) become
+then various syntax items (ie. HereDocuments and function bodies) become
syntax-foldable (see |:syn-fold|). You also may add these together
to get multiple types of folding: >
@@ -2872,14 +2950,14 @@ reduce this, the "sh_maxlines" internal variable can be set. Example: >
The default is to use the twice sh_minlines. Set it to a smaller number to
speed up displaying. The disadvantage is that highlight errors may appear.
- *g:sh_isk* *g:sh_noisk*
-The shell languages appear to let "." be part of words, commands, etc;
-consequently it should be in the isk for sh.vim. As of v116 of syntax/sh.vim,
-syntax/sh.vim will append the "." to |'iskeyword'| by default; you may control
-this behavior with: >
- let g:sh_isk = '..whatever characters you want as part of iskeyword'
- let g:sh_noisk= 1 " otherwise, if this exists, the isk will NOT chg
+syntax/sh.vim tries to flag certain problems as errors; usually things like
+extra ']'s, 'done's, 'fi's, etc. If you find the error handling problematic
+for your purposes, you may suppress such error highlighting by putting
+the following line in your .vimrc: >
+
+ let g:sh_no_error= 1
<
+
*sh-embed* *sh-awk*
Sh: EMBEDDING LANGUAGES~
@@ -3102,6 +3180,12 @@ by syntax/tex.vim. Please consider uploading any extensions that you write,
which typically would go in $HOME/after/syntax/tex/[pkgname].vim, to
http://vim.sf.net/.
+I've included some support for various popular packages on my website: >
+
+ http://www.drchip.org/astronaut/vim/index.html#LATEXPKGS
+<
+The syntax files there go into your .../after/syntax/tex/ directory.
+
*tex-error* *g:tex_no_error*
Tex: Excessive Error Highlighting? ~
@@ -3181,11 +3265,11 @@ syntax highlighting script handles this with the following logic:
* If g:tex_stylish exists and is 1
then the file will be treated as a "sty" file, so the "_"
will be allowed as part of keywords
- (irregardless of g:tex_isk)
+ (regardless of g:tex_isk)
* Else if the file's suffix is sty, cls, clo, dtx, or ltx,
then the file will be treated as a "sty" file, so the "_"
will be allowed as part of keywords
- (irregardless of g:tex_isk)
+ (regardless of g:tex_isk)
* If g:tex_isk exists, then it will be used for the local 'iskeyword'
* Else the local 'iskeyword' will be set to 48-57,a-z,A-Z,192-255
@@ -3239,11 +3323,10 @@ improve screen updating rates (see |:syn-sync| for more on this). >
The g:vimsyn_embed option allows users to select what, if any, types of
embedded script highlighting they wish to have. >
- g:vimsyn_embed == 0 : don't embed any scripts
- g:vimsyn_embed =~ 'P' : support embedded python
+ g:vimsyn_embed == 0 : disable (don't embed any scripts)
+ g:vimsyn_embed == 'lPr' : support embedded lua, python and ruby
<
-By default, g:vimsyn_embed is a string supporting interpreters that your vim
-itself supports.
+This option is disabled by default.
*g:vimsyn_folding*
Some folding is now supported with syntax/vim.vim: >
@@ -3254,8 +3337,8 @@ Some folding is now supported with syntax/vim.vim: >
g:vimsyn_folding =~ 'P' : fold python script
<
*g:vimsyn_noerror*
-Not all error highlighting that syntax/vim.vim does may be correct; VimL is a
-difficult language to highlight correctly. A way to suppress error
+Not all error highlighting that syntax/vim.vim does may be correct; Vim script
+is a difficult language to highlight correctly. A way to suppress error
highlighting is to put the following line in your |vimrc|: >
let g:vimsyn_noerror = 1
@@ -3413,6 +3496,8 @@ DEFINING CASE *:syn-case* *E390*
"ignore". Note that any items before this are not affected, and all
items until the next ":syntax case" command are affected.
+:sy[ntax] case
+ Show either "syntax case match" or "syntax case ignore" (translated).
SPELL CHECKING *:syn-spell*
@@ -3430,6 +3515,11 @@ SPELL CHECKING *:syn-spell*
To activate spell checking the 'spell' option must be set.
+:sy[ntax] spell
+ Show either "syntax spell toplevel", "syntax spell notoplevel" or
+ "syntax spell default" (translated).
+
+
SYNTAX ISKEYWORD SETTING *:syn-iskeyword*
:sy[ntax] iskeyword [clear | {option}]
@@ -3453,8 +3543,8 @@ SYNTAX ISKEYWORD SETTING *:syn-iskeyword*
and also determines where |:syn-keyword| will be checked for a new
match.
- It is recommended when writing syntax files, to use this command
- to the correct value for the specific syntax language and not change
+ It is recommended when writing syntax files, to use this command to
+ set the correct value for the specific syntax language and not change
the 'iskeyword' option.
DEFINING KEYWORDS *:syn-keyword*
@@ -3512,7 +3602,11 @@ DEFINING KEYWORDS *:syn-keyword*
DEFINING MATCHES *:syn-match*
-:sy[ntax] match {group-name} [{options}] [excludenl] {pattern} [{options}]
+:sy[ntax] match {group-name} [{options}]
+ [excludenl]
+ [keepend]
+ {pattern}
+ [{options}]
This defines one match.
@@ -3521,6 +3615,9 @@ DEFINING MATCHES *:syn-match*
[excludenl] Don't make a pattern with the end-of-line "$"
extend a containing match or region. Must be
given before the pattern. |:syn-excludenl|
+ keepend Don't allow contained matches to go past a
+ match with the end pattern. See
+ |:syn-keepend|.
{pattern} The search pattern that defines the match.
See |:syn-pattern| below.
Note that the pattern may match more than one
@@ -3731,7 +3828,7 @@ Whether or not it is actually concealed depends on the value of the
'conceallevel' option. The 'concealcursor' option is used to decide whether
concealable items in the current line are displayed unconcealed to be able to
edit the line.
-Another way to conceal text with with |matchadd()|.
+Another way to conceal text is with |matchadd()|.
concealends *:syn-concealends*
@@ -4016,6 +4113,9 @@ IMPLICIT CONCEAL *:syn-conceal-implicit*
off" returns to the normal state where the "conceal" flag must be
given explicitly.
+:sy[ntax] conceal
+ Show either "syntax conceal on" or "syntax conceal off" (translated).
+
==============================================================================
7. Syntax patterns *:syn-pattern* *E401* *E402*
@@ -4496,12 +4596,11 @@ is mostly used, because it looks better.
==============================================================================
12. Highlight command *:highlight* *:hi* *E28* *E411* *E415*
-There are three types of highlight groups:
+There are two types of highlight groups:
+- The built-in |highlight-groups|.
- The ones used for specific languages. For these the name starts with the
name of the language. Many of these don't have any attributes, but are
linked to a group of the second type.
-- The ones used for all syntax languages.
-- The ones used for the 'highlight' option.
*hitest.vim*
You can see all the groups currently active with this command: >
:so $VIMRUNTIME/syntax/hitest.vim
@@ -4524,6 +4623,15 @@ in their own color.
Doesn't work recursively, thus you can't use
":colorscheme" in a color scheme script.
+
+ To customize a colorscheme use another name, e.g.
+ "~/.vim/colors/mine.vim", and use `:runtime` to load
+ the original colorscheme: >
+ runtime colors/evening.vim
+ hi Statement ctermfg=Blue guifg=Blue
+
+< Before the color scheme will be loaded the
+ |ColorSchemePre| autocommand event is triggered.
After the color scheme has been loaded the
|ColorScheme| autocommand event is triggered.
For info about writing a colorscheme file: >
@@ -4566,38 +4674,36 @@ a file with ":highlight" commands such as this: >
Note that all settings that are not included remain the same, only the
specified field is used, and settings are merged with previous ones. So, the
result is like this single command has been used: >
- :hi Comment term=bold ctermfg=Cyan guifg=#80a0ff gui=bold
+ :hi Comment ctermfg=Cyan guifg=#80a0ff gui=bold
<
*:highlight-verbose*
When listing a highlight group and 'verbose' is non-zero, the listing will
also tell where it was last set. Example: >
:verbose hi Comment
-< Comment xxx term=bold ctermfg=4 guifg=Blue ~
+< Comment xxx ctermfg=4 guifg=Blue ~
Last set from /home/mool/vim/vim7/runtime/syntax/syncolor.vim ~
When ":hi clear" is used then the script where this command is used will be
mentioned for the default values. See |:verbose-cmd| for more information.
*highlight-args* *E416* *E417* *E423*
-There are three types of terminals for highlighting:
-term a normal terminal (vt100, xterm)
-cterm a color terminal (Windows console, color-xterm, these have the "Co"
- termcap entry)
-gui the GUI
+There are two types of UIs for highlighting:
+cterm terminal UI (|TUI|)
+gui GUI or RGB-capable TUI ('termguicolors')
For each type the highlighting can be given. This makes it possible to use
-the same syntax file on all terminals, and use the optimal highlighting.
+the same syntax file on all UIs.
-1. highlight arguments for normal terminals
+1. TUI highlight arguments
*bold* *underline* *undercurl*
*inverse* *italic* *standout*
-term={attr-list} *attr-list* *highlight-term* *E418*
+cterm={attr-list} *attr-list* *highlight-cterm* *E418*
attr-list is a comma separated list (without spaces) of the
following items (in any order):
bold
underline
- undercurl a curly underline
+ undercurl curly underline
reverse
inverse same as reverse
italic
@@ -4606,8 +4712,8 @@ term={attr-list} *attr-list* *highlight-term* *E418*
Note that "bold" can be used here and by using a bold font. They
have the same effect.
- If running in a terminal, "undercurl" acts as an alias for "underline".
- It is set using |highlight-guisp|.
+ "undercurl" falls back to "underline" in a terminal that does not
+ support it. The color is set using |highlight-guisp|.
start={term-list} *highlight-start* *E422*
stop={term-list} *term-list* *highlight-stop*
@@ -4622,52 +4728,22 @@ stop={term-list} *term-list* *highlight-stop*
highlighted area. This should undo the "start" argument.
Otherwise the screen will look messed up.
- The {term-list} can have two forms:
-
- 1. A string with escape sequences.
- This is any string of characters, except that it can't start with
- "t_" and blanks are not allowed. The <> notation is recognized
- here, so you can use things like "<Esc>" and "<Space>". Example:
+ {term-list} is a a string with escape sequences. This is any string of
+ characters, except that it can't start with "t_" and blanks are not
+ allowed. The <> notation is recognized here, so you can use things
+ like "<Esc>" and "<Space>". Example:
start=<Esc>[27h;<Esc>[<Space>r;
- 2. A list of terminal codes.
- Each terminal code has the form "t_xx", where "xx" is the name of
- the termcap entry. The codes have to be separated with commas.
- White space is not allowed. Example:
- start=t_C1,t_BL
- The terminal codes must exist for this to work.
-
-
-2. highlight arguments for color terminals
-
-cterm={attr-list} *highlight-cterm*
- See above for the description of {attr-list} |attr-list|.
- The "cterm" argument is likely to be different from "term", when
- colors are used. For example, in a normal terminal comments could
- be underlined, in a color terminal they can be made Blue.
- Note: Many terminals (e.g., DOS console) can't mix these attributes
- with coloring. Use only one of "cterm=" OR "ctermfg=" OR "ctermbg=".
-
ctermfg={color-nr} *highlight-ctermfg* *E421*
ctermbg={color-nr} *highlight-ctermbg*
The {color-nr} argument is a color number. Its range is zero to
- (not including) the number given by the termcap entry "Co".
+ (not including) the number of |tui-colors| available.
The actual color with this number depends on the type of terminal
and its settings. Sometimes the color also depends on the settings of
"cterm". For example, on some systems "cterm=bold ctermfg=3" gives
another color, on others you just get color 3.
- For an xterm this depends on your resources, and is a bit
- unpredictable. See your xterm documentation for the defaults. The
- colors for a color-xterm can be changed from the .Xdefaults file.
- Unfortunately this means that it's not possible to get the same colors
- for each user. See |xterm-color| for info about color xterms.
-
- The MSDOS standard colors are fixed (in a console window), so these
- have been used for the names. But the meaning of color names in X11
- are fixed, so these color settings have been used, to make the
- highlighting settings portable (complicated, isn't it?). The
- following names are recognized, with the color number used:
+ The following (case-insensitive) names are recognized:
*cterm-colors*
NR-16 NR-8 COLOR NAME ~
@@ -4698,7 +4774,6 @@ ctermbg={color-nr} *highlight-ctermbg*
"cterm=" argument AFTER the "ctermfg=" or "ctermbg=" argument. Or use
a number instead of a color name.
- The case of the color names is ignored.
Note that for 16 color ansi style terminals (including xterms), the
numbers in the NR-8 column is used. Here '*' means 'add 8' so that Blue
is 12, DarkGray is 8 etc.
@@ -4714,18 +4789,18 @@ ctermbg={color-nr} *highlight-ctermbg*
Example: >
:highlight Normal ctermfg=grey ctermbg=darkblue
< When setting the "ctermbg" color for the Normal group, the
- 'background' option will be adjusted automatically. This causes the
- highlight groups that depend on 'background' to change! This means
- you should set the colors for Normal first, before setting other
- colors.
+ 'background' option will be adjusted automatically, under the
+ condition that the color is recognized and 'background' was not set
+ explicitly. This causes the highlight groups that depend on
+ 'background' to change! This means you should set the colors for
+ Normal first, before setting other colors.
When a colorscheme is being used, changing 'background' causes it to
be reloaded, which may reset all colors (including Normal). First
delete the "g:colors_name" variable when you don't want this.
When you have set "ctermfg" or "ctermbg" for the Normal group, Vim
- needs to reset the color when exiting. This is done with the "op"
- termcap entry |t_op|. If this doesn't work correctly, try setting the
- 't_op' option in your vimrc.
+ needs to reset the color when exiting. This is done with the
+ "orig_pair" |terminfo| entry.
*E419* *E420*
When Vim knows the normal foreground and background colors, "fg" and
"bg" can be used as color names. This only works after setting the
@@ -4737,7 +4812,7 @@ ctermbg={color-nr} *highlight-ctermbg*
"fg" and "bg" colors will not be adjusted.
-3. highlight arguments for the GUI
+2. GUI highlight arguments
gui={attr-list} *highlight-gui*
These give the attributes to use in the GUI mode.
@@ -4762,12 +4837,17 @@ font={font-name} *highlight-font*
All fonts used, except for Menu and Tooltip, should be of the same
character size as the default font! Otherwise redrawing problems will
occur.
+ To use a font name with an embedded space or other special character,
+ put it in single quotes. The single quote cannot be used then.
+ Example: >
+ :hi comment font='Monospace 10'
guifg={color-name} *highlight-guifg*
guibg={color-name} *highlight-guibg*
guisp={color-name} *highlight-guisp*
These give the foreground (guifg), background (guibg) and special
- (guisp) color to use in the GUI. "guisp" is used for undercurl.
+ (guisp) color to use in the GUI. "guisp" is used for undercurl
+ and underline.
There are a few special names:
NONE no color (transparent)
bg use normal background color
@@ -4791,10 +4871,7 @@ guisp={color-name} *highlight-guisp*
Black White
Orange Purple Violet
- In the Win32 GUI version, additional system colors are available. See
- |win32-colors|.
-
- You can also specify a color by its Red, Green and Blue values.
+ You can also specify a color by its RGB (red, green, blue) values.
The format is "#rrggbb", where
"rr" is the Red value
"gg" is the Green value
@@ -4803,25 +4880,23 @@ guisp={color-name} *highlight-guisp*
:highlight Comment guifg=#11f0c3 guibg=#ff00ff
<
*highlight-groups* *highlight-default*
-These are the default highlighting groups. These groups are used by the
-'highlight' option default. Note that the highlighting depends on the value
-of 'background'. You can see the current settings with the ":highlight"
-command.
+These are the builtin highlighting groups. Note that the highlighting depends
+on the value of 'background'. You can see the current settings with the
+":highlight" command.
*hl-ColorColumn*
ColorColumn used for the columns set with 'colorcolumn'
*hl-Conceal*
Conceal placeholder characters substituted for concealed
text (see 'conceallevel')
*hl-Cursor*
-Cursor the character under the cursor
+Cursor character under the cursor
*hl-CursorIM*
CursorIM like Cursor, but used when in IME mode |CursorIM|
*hl-CursorColumn*
-CursorColumn the screen column that the cursor is in when 'cursorcolumn' is
- set
+CursorColumn Screen-column at the cursor, when 'cursorcolumn' is set.
*hl-CursorLine*
-CursorLine the screen line that the cursor is in when 'cursorline' is
- set
+CursorLine Screen-line at the cursor, when 'cursorline' is set.
+ Low-priority if foreground (ctermfg OR guifg) is not set.
*hl-Directory*
Directory directory names (and other special names in listings)
*hl-DiffAdd*
@@ -4832,12 +4907,12 @@ DiffChange diff mode: Changed line |diff.txt|
DiffDelete diff mode: Deleted line |diff.txt|
*hl-DiffText*
DiffText diff mode: Changed text within a changed line |diff.txt|
- {Nvim} *hl-EndOfBuffer*
+ *hl-EndOfBuffer*
EndOfBuffer filler lines (~) after the end of the buffer.
By default, this is highlighted like |hl-NonText|.
- {Nvim} *hl-TermCursor*
+ *hl-TermCursor*
TermCursor cursor in a focused terminal
- {Nvim} *hl-TermCursorNC*
+ *hl-TermCursorNC*
TermCursorNC cursor in an unfocused terminal
*hl-ErrorMsg*
ErrorMsg error messages on the command line
@@ -4852,6 +4927,9 @@ SignColumn column where |signs| are displayed
*hl-IncSearch*
IncSearch 'incsearch' highlighting; also used for the text replaced with
":s///c"
+ *hl-Substitute*
+Substitute |:substitute| replacement text highlighting
+
*hl-LineNr*
LineNr Line number for ":number" and ":#" commands, and when 'number'
or 'relativenumber' option is set.
@@ -4864,6 +4942,8 @@ MatchParen The character under the cursor or just before it, if it
*hl-ModeMsg*
ModeMsg 'showmode' message (e.g., "-- INSERT --")
+ *hl-MsgSeparator*
+MsgSeparator Separator for scrolled messages, `msgsep` flag of 'display'
*hl-MoreMsg*
MoreMsg |more-prompt|
*hl-NonText*
@@ -4873,6 +4953,8 @@ NonText '@' at the end of the window, characters from 'showbreak'
fit at the end of the line). See also |hl-EndOfBuffer|.
*hl-Normal*
Normal normal text
+ *hl-NormalNC*
+NormalNC normal text in non-current windows
*hl-Pmenu*
Pmenu Popup menu: normal item.
*hl-PmenuSel*
@@ -4883,35 +4965,40 @@ PmenuSbar Popup menu: scrollbar.
PmenuThumb Popup menu: Thumb of the scrollbar.
*hl-Question*
Question |hit-enter| prompt and yes/no questions
+ *hl-QuickFixLine*
+QuickFixLine Current |quickfix| item in the quickfix window. Combined with
+ |hl-CursorLine| when the cursor is there.
*hl-Search*
Search Last search pattern highlighting (see 'hlsearch').
- Also used for highlighting the current line in the quickfix
- window and similar items that need to stand out.
+ Also used for similar items that need to stand out.
*hl-SpecialKey*
-SpecialKey Meta and special keys listed with ":map", also for text used
- to show unprintable characters in the text, 'listchars'.
- Generally: text that is displayed differently from what it
- really is.
+SpecialKey Unprintable characters: text displayed differently from what
+ it really is. But not 'listchars' whitespace. |hl-Whitespace|
*hl-SpellBad*
SpellBad Word that is not recognized by the spellchecker. |spell|
- This will be combined with the highlighting used otherwise.
+ Combined with the highlighting used otherwise.
*hl-SpellCap*
SpellCap Word that should start with a capital. |spell|
- This will be combined with the highlighting used otherwise.
+ Combined with the highlighting used otherwise.
*hl-SpellLocal*
SpellLocal Word that is recognized by the spellchecker as one that is
used in another region. |spell|
- This will be combined with the highlighting used otherwise.
+ Combined with the highlighting used otherwise.
*hl-SpellRare*
SpellRare Word that is recognized by the spellchecker as one that is
hardly ever used. |spell|
- This will be combined with the highlighting used otherwise.
+ Combined with the highlighting used otherwise.
*hl-StatusLine*
StatusLine status line of current window
*hl-StatusLineNC*
StatusLineNC status lines of not-current windows
Note: if this is equal to "StatusLine" Vim will use "^^^" in
the status line of the current window.
+ *hl-StatusLineTerm*
+StatusLineTerm status line of current window, if it is a |terminal| window.
+ *hl-StatusLineTermNC*
+StatusLineTermNC status lines of not-current windows that is a |terminal|
+ window.
*hl-TabLine*
TabLine tab pages line, not active tab page label
*hl-TabLineFill*
@@ -4922,10 +5009,12 @@ TabLineSel tab pages line, active tab page label
Title titles for output from ":set all", ":autocmd" etc.
*hl-Visual*
Visual Visual mode selection
- *hl-VisualNOS*
-VisualNOS Removed. |vim-differences| {Nvim}
+ *hl-VisualNOS*
+VisualNOS Visual mode selection when vim is "Not Owning the Selection".
*hl-WarningMsg*
WarningMsg warning messages
+ *hl-Whitespace*
+Whitespace "nbsp", "space", "tab" and "trail" in 'listchars'
*hl-WildMenu*
WildMenu current match in 'wildmenu' completion
@@ -5030,8 +5119,6 @@ defaults back: >
It is a bit of a wrong name, since it does not reset any syntax items, it only
affects the highlighting.
-This doesn't change the colors for the 'highlight' option.
-
Note that the syntax colors that you set in your vimrc file will also be reset
back to their Vim default.
Note that if you are using a color scheme, the colors defined by the color
@@ -5150,146 +5237,12 @@ When splitting the window, the new window will use the original syntax.
==============================================================================
17. Color xterms *xterm-color* *color-xterm*
-Most color xterms have only eight colors. If you don't get colors with the
-default setup, it should work with these lines in your vimrc: >
- :if &term =~ "xterm"
- : if has("terminfo")
- : set t_Co=8
- : set t_Sf=<Esc>[3%p1%dm
- : set t_Sb=<Esc>[4%p1%dm
- : else
- : set t_Co=8
- : set t_Sf=<Esc>[3%dm
- : set t_Sb=<Esc>[4%dm
- : endif
- :endif
-< [<Esc> is a real escape, type CTRL-V <Esc>]
-
-You might want to change the first "if" to match the name of your terminal,
-e.g. "dtterm" instead of "xterm".
-
-Note: Do these settings BEFORE doing ":syntax on". Otherwise the colors may
-be wrong.
- *xiterm* *rxvt*
-The above settings have been mentioned to work for xiterm and rxvt too.
-But for using 16 colors in an rxvt these should work with terminfo: >
- :set t_AB=<Esc>[%?%p1%{8}%<%t25;%p1%{40}%+%e5;%p1%{32}%+%;%dm
- :set t_AF=<Esc>[%?%p1%{8}%<%t22;%p1%{30}%+%e1;%p1%{22}%+%;%dm
-<
*colortest.vim*
To test your color setup, a file has been included in the Vim distribution.
To use it, execute this command: >
:runtime syntax/colortest.vim
-Some versions of xterm (and other terminals, like the Linux console) can
-output lighter foreground colors, even though the number of colors is defined
-at 8. Therefore Vim sets the "cterm=bold" attribute for light foreground
-colors, when 't_Co' is 8.
-
- *xfree-xterm*
-To get 16 colors or more, get the newest xterm version (which should be
-included with XFree86 3.3 and later). You can also find the latest version
-at: >
- http://invisible-island.net/xterm/xterm.html
-Here is a good way to configure it. This uses 88 colors and enables the
-termcap-query feature, which allows Vim to ask the xterm how many colors it
-supports. >
- ./configure --disable-bold-color --enable-88-color --enable-tcap-query
-If you only get 8 colors, check the xterm compilation settings.
-(Also see |UTF8-xterm| for using this xterm with UTF-8 character encoding).
-
-This xterm should work with these lines in your vimrc (for 16 colors): >
- :if has("terminfo")
- : set t_Co=16
- : set t_AB=<Esc>[%?%p1%{8}%<%t%p1%{40}%+%e%p1%{92}%+%;%dm
- : set t_AF=<Esc>[%?%p1%{8}%<%t%p1%{30}%+%e%p1%{82}%+%;%dm
- :else
- : set t_Co=16
- : set t_Sf=<Esc>[3%dm
- : set t_Sb=<Esc>[4%dm
- :endif
-< [<Esc> is a real escape, type CTRL-V <Esc>]
-
-Without |+terminfo|, Vim will recognize these settings, and automatically
-translate cterm colors of 8 and above to "<Esc>[9%dm" and "<Esc>[10%dm".
-Colors above 16 are also translated automatically.
-
-For 256 colors this has been reported to work: >
-
- :set t_AB=<Esc>[48;5;%dm
- :set t_AF=<Esc>[38;5;%dm
-
-Or just set the TERM environment variable to "xterm-color" or "xterm-16color"
-and try if that works.
-
-You probably want to use these X resources (in your ~/.Xdefaults file):
- XTerm*color0: #000000
- XTerm*color1: #c00000
- XTerm*color2: #008000
- XTerm*color3: #808000
- XTerm*color4: #0000c0
- XTerm*color5: #c000c0
- XTerm*color6: #008080
- XTerm*color7: #c0c0c0
- XTerm*color8: #808080
- XTerm*color9: #ff6060
- XTerm*color10: #00ff00
- XTerm*color11: #ffff00
- XTerm*color12: #8080ff
- XTerm*color13: #ff40ff
- XTerm*color14: #00ffff
- XTerm*color15: #ffffff
- Xterm*cursorColor: Black
-
-[Note: The cursorColor is required to work around a bug, which changes the
-cursor color to the color of the last drawn text. This has been fixed by a
-newer version of xterm, but not everybody is using it yet.]
-
-To get these right away, reload the .Xdefaults file to the X Option database
-Manager (you only need to do this when you just changed the .Xdefaults file): >
- xrdb -merge ~/.Xdefaults
-<
- *xterm-blink* *xterm-blinking-cursor*
-To make the cursor blink in an xterm, see tools/blink.c. Or use Thomas
-Dickey's xterm above patchlevel 107 (see above for where to get it), with
-these resources:
- XTerm*cursorBlink: on
- XTerm*cursorOnTime: 400
- XTerm*cursorOffTime: 250
- XTerm*cursorColor: White
-
- *hpterm-color*
-These settings work (more or less) for an hpterm, which only supports 8
-foreground colors: >
- :if has("terminfo")
- : set t_Co=8
- : set t_Sf=<Esc>[&v%p1%dS
- : set t_Sb=<Esc>[&v7S
- :else
- : set t_Co=8
- : set t_Sf=<Esc>[&v%dS
- : set t_Sb=<Esc>[&v7S
- :endif
-< [<Esc> is a real escape, type CTRL-V <Esc>]
-
- *Eterm* *enlightened-terminal*
-These settings have been reported to work for the Enlightened terminal
-emulator, or Eterm. They might work for all xterm-like terminals that use the
-bold attribute to get bright colors. Add an ":if" like above when needed. >
- :set t_Co=16
- :set t_AF=^[[%?%p1%{8}%<%t3%p1%d%e%p1%{22}%+%d;1%;m
- :set t_AB=^[[%?%p1%{8}%<%t4%p1%d%e%p1%{32}%+%d;1%;m
-<
- *TTpro-telnet*
-These settings should work for TTpro telnet. Tera Term Pro is a freeware /
-open-source program for MS-Windows. >
- set t_Co=16
- set t_AB=^[[%?%p1%{8}%<%t%p1%{40}%+%e%p1%{32}%+5;%;%dm
- set t_AF=^[[%?%p1%{8}%<%t%p1%{30}%+%e%p1%{22}%+1;%;%dm
-Also make sure TTpro's Setup / Window / Full Color is enabled, and make sure
-that Setup / Font / Enable Bold is NOT enabled.
-(info provided by John Love-Jensen <eljay@Adobe.COM>)
-
+Nvim uses 256-color and |true-color| terminal capabilities whereever possible.
==============================================================================
18. When syntax is slow *:syntime*
@@ -5349,4 +5302,4 @@ literal text specify the size of that text (in bytes):
"<\@1<=span" Matches the same, but only tries one byte before "span".
- vim:tw=78:sw=4:ts=8:ft=help:norl:
+ vim:tw=78:sw=4:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/tabpage.txt b/runtime/doc/tabpage.txt
index 70e6953211..a0459d27bc 100644
--- a/runtime/doc/tabpage.txt
+++ b/runtime/doc/tabpage.txt
@@ -1,4 +1,4 @@
-*tabpage.txt* For Vim version 7.4. Last change: 2015 Apr 18
+*tabpage.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -10,11 +10,7 @@ The commands which have been added to use multiple tab pages are explained
here. Additionally, there are explanations for commands that work differently
when used in combination with more than one tab page.
-1. Introduction |tab-page-intro|
-2. Commands |tab-page-commands|
-3. Other items |tab-page-other|
-4. Setting 'tabline' |setting-tabline|
-5. Setting 'guitablabel' |setting-guitablabel|
+ Type |gO| to see the table of contents.
==============================================================================
1. Introduction *tab-page-intro*
@@ -54,6 +50,8 @@ right of the labels.
In the GUI tab pages line you can use the right mouse button to open menu.
|tabline-menu|.
+For the related autocommands see |tabnew-autocmd|.
+
:[count]tabe[dit] *:tabe* *:tabedit* *:tabnew*
:[count]tabnew
Open a new tab page with an empty window, after the current
@@ -83,14 +81,21 @@ In the GUI tab pages line you can use the right mouse button to open menu.
Execute {cmd} and when it opens a new window open a new tab
page instead. Doesn't work for |:diffsplit|, |:diffpatch|,
|:execute| and |:normal|.
- When [count] is omitted the tab page appears after the current
- one.
- When [count] is specified the new tab page comes after tab
- page [count]. Use ":0tab cmd" to get the new tab page as the
- first one.
+ If [count] is given the new tab page appears after the tab
+ page [count] otherwise the new tab page will appear after the
+ current one.
Examples: >
- :tab split " opens current buffer in new tab page
- :tab help gt " opens tab page with help for "gt"
+ :tab split " opens current buffer in new tab page
+ :tab help gt " opens tab page with help for "gt"
+ :.tab help gt " as above
+ :+tab help " opens tab page with help after the next
+ " tab page
+ :-tab help " opens tab page with help before the
+ " current one
+ :0tab help " opens tab page with help before the
+ " first one
+ :$tab help " opens tab page with help after the last
+ " one
CTRL-W gf Open a new tab page and edit the file name under the cursor.
See |CTRL-W_gf|.
@@ -122,10 +127,14 @@ something else.
:tabc[lose][!] {count}
Close tab page {count}. Fails in the same way as `:tabclose`
above. >
- :-tabclose " close the previous tab page
- :+tabclose " close the next tab page
- :1tabclose " close the first tab page
- :$tabclose " close the last tab page
+ :-tabclose " close the previous tab page
+ :+tabclose " close the next tab page
+ :1tabclose " close the first tab page
+ :$tabclose " close the last tab page
+ :tabclose -2 " close the two previous tab page
+ :tabclose + " close the next tab page
+ :tabclose 3 " close the third tab page
+ :tabclose $ " close the last tab page
<
*:tabo* *:tabonly*
:tabo[nly][!] Close all other tab pages.
@@ -138,13 +147,20 @@ something else.
never abandoned, so changes cannot get lost. >
:tabonly " close all tab pages except the current one
-:{count}tabo[nly][!]
- Close all tab pages except the {count}th one. >
- :.tabonly " one
- :-tabonly " close all tab pages except the previous one
- :+tabonly " close all tab pages except the next one
- :1tabonly " close all tab pages except the first one
- :$tabonly " close all tab pages except the last one.
+:tabo[nly][!] {count}
+ Close all tab pages except {count} one. >
+ :.tabonly " as above
+ :-tabonly " close all tab pages except the previous
+ " one
+ :+tabonly " close all tab pages except the next one
+ :1tabonly " close all tab pages except the first one
+ :$tabonly " close all tab pages except the last one
+ :tabonly - " close all tab pages except the previous
+ " one
+ :tabonly +2 " close all tab pages except the two next
+ " one
+ :tabonly 1 " close all tab pages except the first one
+ :tabonly $ " close all tab pages except the last one
SWITCHING TO ANOTHER TAB PAGE:
@@ -159,7 +175,20 @@ gt *i_CTRL-<PageDown>* *i_<C-PageDown>*
Go to the next tab page. Wraps around from the last to the
first one.
+:{count}tabn[ext]
:tabn[ext] {count}
+ Go to tab page {count}. The first tab page has number one. >
+ :-tabnext " go to the previous tab page
+ :+tabnext " go to the next tab page
+ :+2tabnext " go to the two next tab page
+ :1tabnext " go to the first tab page
+ :$tabnext " go to the last tab page
+ :tabnext $ " as above
+ :tabnext - " go to the previous tab page
+ :tabnext -1 " as above
+ :tabnext + " go to the next tab page
+ :tabnext +1 " as above
+
{count}<C-PageDown>
{count}gt Go to tab page {count}. The first tab page has number one.
@@ -174,7 +203,8 @@ gT Go to the previous tab page. Wraps around from the first one
:tabN[ext] {count}
{count}<C-PageUp>
{count}gT Go {count} tab pages back. Wraps around from the first one
- to the last one.
+ to the last one. Note that the use of {count} is different
+ from |:tabnext|, where it is used as the tab page number.
:tabr[ewind] *:tabfir* *:tabfirst* *:tabr* *:tabrewind*
:tabfir[st] Go to the first tab page.
@@ -188,6 +218,12 @@ Other commands:
:tabs List the tab pages and the windows they contain.
Shows a ">" for the current window.
Shows a "+" for modified buffers.
+ For example:
+ Tab page 1 ~
+ + tabpage.txt ~
+ ex_docmd.c ~
+ Tab page 2 ~
+ > main.c ~
REORDERING TAB PAGES:
@@ -195,8 +231,10 @@ REORDERING TAB PAGES:
:tabm[ove] [N] *:tabm* *:tabmove*
:[N]tabm[ove]
Move the current tab page to after tab page N. Use zero to
- make the current tab page the first one. Without N the tab
- page is made the last one. >
+ make the current tab page the first one. N is counted before
+ the move, thus if the second tab is the current one,
+ `:tabmove 1` and `:tabmove 2` have no effect.
+ Without N the tab page is made the last one. >
:.tabmove " do nothing
:-tabmove " move the tab page to the left
:+tabmove " move the tab page to the right
@@ -266,6 +304,7 @@ Variables local to a tab page start with "t:". |tabpage-variable|
Currently there is only one option local to a tab page: 'cmdheight'.
+ *tabnew-autocmd*
The TabLeave and TabEnter autocommand events can be used to do something when
switching from one tab page to another. The exact order depends on what you
are doing. When creating a new tab page this works as if you create a new
@@ -427,4 +466,4 @@ If you want to show something specific for a tab page, you might want to use a
tab page local variable. |t:var|
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/tagsrch.txt b/runtime/doc/tagsrch.txt
index 75d820d072..367da7750e 100644
--- a/runtime/doc/tagsrch.txt
+++ b/runtime/doc/tagsrch.txt
@@ -1,4 +1,4 @@
-*tagsrch.txt* For Vim version 7.4. Last change: 2013 Oct 01
+*tagsrch.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -8,12 +8,7 @@ Tags and special searches *tags-and-searches*
See section |29.1| of the user manual for an introduction.
-1. Jump to a tag |tag-commands|
-2. Tag stack |tag-stack|
-3. Tag match list |tag-matchlist|
-4. Tags details |tag-details|
-5. Tags file format |tags-file-format|
-6. Include file searches |include-search|
+ Type |gO| to see the table of contents.
==============================================================================
1. Jump to a tag *tag-commands*
@@ -36,12 +31,12 @@ An easy way back is with the CTRL-T command. Also read about the tag stack
below.
*:ta* *:tag* *E426* *E429*
-:[count]ta[g][!] {ident}
- Jump to the definition of {ident}, using the
- information in the tags file(s). Put {ident} in the
+:[count]ta[g][!] {name}
+ Jump to the definition of {name}, using the
+ information in the tags file(s). Put {name} in the
tag stack. See |tag-!| for [!].
- {ident} can be a regexp pattern, see |tag-regexp|.
- When there are several matching tags for {ident}, jump
+ {name} can be a regexp pattern, see |tag-regexp|.
+ When there are several matching tags for {name}, jump
to the [count] one. When [count] is omitted the
first one is jumped to. See |tag-matchlist| for
jumping to other matching tags.
@@ -49,15 +44,15 @@ below.
g<LeftMouse> *g<LeftMouse>*
<C-LeftMouse> *<C-LeftMouse>* *CTRL-]*
CTRL-] Jump to the definition of the keyword under the
- cursor. Same as ":tag {ident}", where {ident} is the
+ cursor. Same as ":tag {name}", where {name} is the
keyword under or after cursor.
- When there are several matching tags for {ident}, jump
+ When there are several matching tags for {name}, jump
to the [count] one. When no [count] is given the
first one is jumped to. See |tag-matchlist| for
jumping to other matching tags.
*v_CTRL-]*
-{Visual}CTRL-] Same as ":tag {ident}", where {ident} is the text that
+{Visual}CTRL-] Same as ":tag {name}", where {name} is the text that
is highlighted.
*telnet-CTRL-]*
@@ -81,16 +76,25 @@ When there are multiple matches for a tag, this priority is used:
Note that when the current file changes, the priority list is mostly not
changed, to avoid confusion when using ":tnext". It is changed when using
-":tag {ident}".
-
-The ignore-case matches are not found for a ":tag" command when the
-'ignorecase' option is off and 'tagcase' is "followic" or when 'tagcase' is
-"match". They are found when a pattern is used (starting with a "/") and for
-":tselect", also when 'ignorecase' is off and 'tagcase' is "followic" or when
-'tagcase' is "match". Note that using ignore-case tag searching disables
-binary searching in the tags file, which causes a slowdown. This can be
-avoided by fold-case sorting the tag file. See the 'tagbsearch' option for an
-explanation.
+":tag {name}".
+
+The ignore-case matches are not found for a ":tag" command when:
+- the 'ignorecase' option is off and 'tagcase' is "followic"
+- 'tagcase' is "match"
+- 'tagcase' is "smart" and the pattern contains an upper case character.
+- 'tagcase' is "followscs" and 'smartcase' option is on and the pattern
+ contains an upper case character.
+
+The ignore-case matches are found when:
+- a pattern is used (starting with a "/")
+- for ":tselect"
+- when 'tagcase' is "followic" and 'ignorecase' is off
+- when 'tagcase' is "match"
+- when 'tagcase' is "followscs" and the 'smartcase' option is off
+
+Note that using ignore-case tag searching disables binary searching in the
+tags file, which causes a slowdown. This can be avoided by fold-case sorting
+the tag file. See the 'tagbsearch' option for an explanation.
==============================================================================
2. Tag stack *tag-stack* *tagstack* *E425*
@@ -157,7 +161,7 @@ You can get from main to FuncA by using CTRL-] on the call to FuncA. Then
you can CTRL-] to get to FuncC. If you now want to go back to main you can
use CTRL-T twice. Then you can CTRL-] to FuncB.
-If you issue a ":ta {ident}" or CTRL-] command, this tag is inserted at the
+If you issue a ":ta {name}" or CTRL-] command, this tag is inserted at the
current position in the stack. If the stack was full (it can hold up to 20
entries), the oldest entry is deleted and the older entries shift one
position up (their index number is decremented by one). If the last used
@@ -181,13 +185,14 @@ between them. Note that these commands don't change the tag stack, they keep
the same entry.
*:ts* *:tselect*
-:ts[elect][!] [ident] List the tags that match [ident], using the
+:ts[elect][!] [name] List the tags that match [name], using the
information in the tags file(s).
- When [ident] is not given, the last tag name from the
+ When [name] is not given, the last tag name from the
tag stack is used.
+ See |tag-!| for [!].
With a '>' in the first column is indicated which is
the current position in the list (if there is one).
- [ident] can be a regexp pattern, see |tag-regexp|.
+ [name] can be a regexp pattern, see |tag-regexp|.
See |tag-priority| for the priorities used in the
listing.
Example output:
@@ -215,7 +220,7 @@ the same entry.
type 'q' and enter the number.
*:sts* *:stselect*
-:sts[elect][!] [ident] Does ":tselect[!] [ident]" and splits the window for
+:sts[elect][!] [name] Does ":tselect[!] [name]" and splits the window for
the selected tag.
*g]*
@@ -226,11 +231,11 @@ g] Like CTRL-], but use ":tselect" instead of ":tag".
identifier.
*:tj* *:tjump*
-:tj[ump][!] [ident] Like ":tselect", but jump to the tag directly when
+:tj[ump][!] [name] Like ":tselect", but jump to the tag directly when
there is only one match.
*:stj* *:stjump*
-:stj[ump][!] [ident] Does ":tjump[!] [ident]" and splits the window for the
+:stj[ump][!] [name] Does ":tjump[!] [name]" and splits the window for the
selected tag.
*g_CTRL-]*
@@ -262,9 +267,9 @@ g CTRL-] Like CTRL-], but use ":tjump" instead of ":tag".
:tl[ast][!] Jump to last matching tag. See |tag-!| for [!].
*:lt* *:ltag*
-:lt[ag][!] [ident] Jump to tag [ident] and add the matching tags to a new
- location list for the current window. [ident] can be
- a regexp pattern, see |tag-regexp|. When [ident] is
+:lt[ag][!] [name] Jump to tag [name] and add the matching tags to a new
+ location list for the current window. [name] can be
+ a regexp pattern, see |tag-regexp|. When [name] is
not given, the last tag name from the tag stack is
used. The search pattern to locate the tag line is
prefixed with "\V" to escape all the special
@@ -295,11 +300,11 @@ the same as above, with a "p" prepended.
{not available when compiled without the |+quickfix| feature}
*:pts* *:ptselect*
-:pts[elect][!] [ident] Does ":tselect[!] [ident]" and shows the new tag in a
+:pts[elect][!] [name] Does ":tselect[!] [name]" and shows the new tag in a
"Preview" window. See |:ptag| for more info.
*:ptj* *:ptjump*
-:ptj[ump][!] [ident] Does ":tjump[!] [ident]" and shows the new tag in a
+:ptj[ump][!] [name] Does ":tjump[!] [name]" and shows the new tag in a
"Preview" window. See |:ptag| for more info.
*:ptn* *:ptnext*
@@ -420,13 +425,18 @@ file "tags". It can also be used to access a common tags file.
The next file in the list is not used when:
- A matching static tag for the current buffer has been found.
- A matching global tag has been found.
-This also depends on whether case is ignored. Case is ignored when
-'ignorecase' is set and 'tagcase' is "followic", or when 'tagcase' is
-"ignore". If case is not ignored, and the tags file only has a match without
-matching case, the next tags file is searched for a match with matching case.
-If no tag with matching case is found, the first match without matching case
-is used. If case is ignored, and a matching global tag with or without
-matching case is found, this one is used, no further tags files are searched.
+This also depends on whether case is ignored. Case is ignored when:
+- 'tagcase' is "followic" and 'ignorecase' is set
+- 'tagcase' is "ignore"
+- 'tagcase' is "smart" and the pattern only contains lower case
+ characters.
+- 'tagcase' is "followscs" and 'smartcase' is set and the pattern only
+ contains lower case characters.
+If case is not ignored, and the tags file only has a match without matching
+case, the next tags file is searched for a match with matching case. If no
+tag with matching case is found, the first match without matching case is
+used. If case is ignored, and a matching global tag with or without matching
+case is found, this one is used, no further tags files are searched.
When a tag file name starts with "./", the '.' is replaced with the path of
the current file. This makes it possible to use a tags file in the directory
@@ -789,24 +799,24 @@ CTRL-W d Open a new window, with the cursor on the first
*:search-args*
Common arguments for the commands above:
-[!] When included, find matches in lines that are recognized as comments.
- When excluded, a match is ignored when the line is recognized as a
- comment (according to 'comments'), or the match is in a C comment (after
- "//" or inside /* */). Note that a match may be missed if a line is
- recognized as a comment, but the comment ends halfway through the line.
- And if the line is a comment, but it is not recognized (according to
- 'comments') a match may be found in it anyway. Example: >
+[!] When included, find matches in lines that are recognized as comments.
+ When excluded, a match is ignored when the line is recognized as a
+ comment (according to 'comments'), or the match is in a C comment
+ (after "//" or inside /* */). Note that a match may be missed if a
+ line is recognized as a comment, but the comment ends halfway the line.
+ And if the line is a comment, but it is not recognized (according to
+ 'comments') a match may be found in it anyway. Example: >
/* comment
foobar */
-< A match for "foobar" is found, because this line is not recognized as a
- comment (even though syntax highlighting does recognize it).
- Note: Since a macro definition mostly doesn't look like a comment, the
- [!] makes no difference for ":dlist", ":dsearch" and ":djump".
-[/] A pattern can be surrounded by '/'. Without '/' only whole words are
- matched, using the pattern "\<pattern\>". Only after the second '/' a
- next command can be appended with '|'. Example: >
+< A match for "foobar" is found, because this line is not recognized as
+ a comment (even though syntax highlighting does recognize it).
+ Note: Since a macro definition mostly doesn't look like a comment, the
+ [!] makes no difference for ":dlist", ":dsearch" and ":djump".
+[/] A pattern can be surrounded by '/'. Without '/' only whole words are
+ matched, using the pattern "\<pattern\>". Only after the second '/' a
+ next command can be appended with '|'. Example: >
:isearch /string/ | echo "the last one"
-< For a ":djump", ":dsplit", ":dlist" and ":dsearch" command the pattern
- is used as a literal string, not as a search pattern.
+< For a ":djump", ":dsplit", ":dlist" and ":dsearch" command the pattern
+ is used as a literal string, not as a search pattern.
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/term.txt b/runtime/doc/term.txt
index 7d47368ba3..9de5745e92 100644
--- a/runtime/doc/term.txt
+++ b/runtime/doc/term.txt
@@ -1,78 +1,195 @@
-*term.txt* For Vim version 7.4. Last change: 2015 Nov 24
+*term.txt* Nvim
- VIM REFERENCE MANUAL by Bram Moolenaar
+ NVIM REFERENCE MANUAL
-Terminal information *terminal-info*
+Terminal UI *TUI* *tui*
-Vim uses information about the terminal you are using to fill the screen and
-recognize what keys you hit. If this information is not correct, the screen
-may be messed up or keys may not be recognized. The actions which have to be
-performed on the screen are accomplished by outputting a string of
-characters. Special keys produce a string of characters. These strings are
-stored in the terminal options, see |terminal-options|.
+Nvim (except in |--headless| mode) uses information about the terminal you are
+using to present a built-in UI. If that information is not correct, the
+screen may be messed up or keys may not be recognized.
-NOTE: Most of this is not used when running the |GUI|.
-
-1. Startup |startup-terminal|
-2. Terminal options |terminal-options|
-3. Window size |window-size|
-4. Slow and fast terminals |slow-fast-terminal|
-5. Using the mouse |mouse-using|
+ Type |gO| to see the table of contents.
==============================================================================
-1. Startup *startup-terminal*
+Startup *startup-terminal*
-When Vim is started a default terminal type is assumed. for MS-DOS this is
-the pc terminal, for Unix an ansi terminal.
+Nvim (except in |--headless| mode) guesses a terminal type when it starts.
+|$TERM| is the primary hint that determines the terminal type.
- *termcap* *terminfo* *E557* *E558* *E559*
-On Unix the terminfo database or termcap file is used. This is referred to as
-"termcap" in all the documentation. At compile time, when running configure,
-the choice whether to use terminfo or termcap is done automatically. When
-running Vim the output of ":version" will show |+terminfo| if terminfo is
-used. Also see |xterm-screens|.
+ *terminfo* *E557* *E558* *E559*
+The terminfo database is used if available.
-Settings depending on terminal *term-dependent-settings*
+The Unibilium library (used by Nvim to read terminfo) allows you to override
+the system terminfo with one in $HOME/.terminfo/ directory, in part or in
+whole.
-If you want to set options or mappings, depending on the terminal name, you
-can do this best in your vimrc. Example: >
+Building your own terminfo is usually as simple as running this as
+a non-superuser:
+>
+ curl -LO http://invisible-island.net/datafiles/current/terminfo.src.gz
+ gunzip terminfo.src.gz
+ tic terminfo.src
+<
+ *$TERM*
+The $TERM environment variable must match the terminal you are using!
+Otherwise Nvim cannot know what sequences your terminal expects, and weird
+or sub-optimal behavior will result (scrolling quirks, wrong colors, etc.).
+
+$TERM is also important because it is mirrored by SSH to the remote session,
+unlike most other environment variables.
+
+ For this terminal Set $TERM to |builtin-terms|
+ -------------------------------------------------------------------------
+ iTerm (original) iterm, iTerm.app N
+ iTerm2 (new capabilities) iterm2, iTerm2.app Y
+ Konsole konsole-256color N
+ anything libvte-based vte, vte-256color Y
+ (e.g. GNOME Terminal) (aliases: gnome, gnome-256color)
+ tmux tmux, tmux-256color Y
+ screen screen, screen-256color Y
+ PuTTY putty, putty-256color Y
+ Terminal.app nsterm N
+ Linux virtual terminal linux, linux-256color Y
+
+ *builtin-terms* *builtin_terms*
+If a |terminfo| database is not available, or no entry for the terminal type is
+found in that database, Nvim will use a compiled-in mini-database of terminfo
+entries for "xterm", "putty", "screen", "tmux", "rxvt", "iterm", "interix",
+"linux", "st", "vte", "gnome", and "ansi".
+
+The lookup matches the initial portion of the terminal type, so (for example)
+"putty-256color" and "putty" will both be mapped to the built-in "putty"
+entry. The built-in terminfo entries describe the terminal as 256-colour
+capable if possible. See |tui-colors|.
+
+If no built-in terminfo record matches the terminal type, the built-in "ansi"
+terminfo record is used as a final fallback.
+
+The built-in mini-database is not combined with an external terminfo database,
+nor can it be used in preference to one. You can thus entirely override any
+omissions or out-of-date information in the built-in terminfo database by
+supplying an external one with entries for the terminal type.
- if &term == "xterm"
- ... xterm maps and settings ...
- elseif &term =~ "vt10."
- ... vt100, vt102 maps and settings ...
- endif
+Settings depending on terminal *term-dependent-settings*
+
+If you want to set terminal-dependent options or mappings, you can do this in
+your init.vim. Example: >
+
+ if $TERM =~ '^\(rxvt\|screen\|interix\|putty\)\(-.*\)\?$'
+ set notermguicolors
+ elseif $TERM =~ '^\(tmux\|iterm\|vte\|gnome\)\(-.*\)\?$'
+ set termguicolors
+ elseif $TERM =~ '^\(xterm\)\(-.*\)\?$'
+ if $XTERM_VERSION != ''
+ set termguicolors
+ elseif $KONSOLE_PROFILE_NAME != ''
+ set termguicolors
+ elseif $VTE_VERSION != ''
+ set termguicolors
+ else
+ set notermguicolors
+ endif
+ elseif $TERM =~ ...
+ ... and so forth ...
+ endif
<
- *raw-terminal-mode*
-For normal editing the terminal will be put into "raw" mode. The strings
-defined with 't_ti' and 't_ks' will be sent to the terminal. Normally this
-puts the terminal in a state where the termcap codes are valid and activates
-the cursor and function keys. When Vim exits the terminal will be put back
-into the mode it was before Vim started. The strings defined with 't_te' and
-'t_ke' will be sent to the terminal.
+ *scroll-region* *xterm-scroll-region*
+Where possible, Nvim will use the terminal's ability to set a scroll region in
+order to redraw faster when a window is scrolled. If the terminal's terminfo
+description describes an ability to set top and bottom scroll margins, that is
+used.
+
+This will not speed up scrolling in a window that is not the full width of the
+terminal. Xterm has an extra ability, not described by terminfo, to set left
+and right scroll margins as well. If Nvim detects that the terminal is Xterm,
+it will make use of this ability to speed up scrolling that is not the full
+width of the terminal.
+
+This ability is only present in genuine Xterm, not in the many terminal
+emulators that incorrectly describe themselves as xterm. Nvim's detection of
+genuine Xterm will not work over an SSH connection, because the environment
+variable, set by genuine Xterm, that it looks for is not automatically
+replicated over an SSH login session.
+
+ *tui-colors*
+Nvim uses 256 colours by default, ignoring |terminfo| for most terminal types,
+including "linux" (whose virtual terminals have had 256-colour support since
+4.8) and anything claiming to be "xterm". Also when $COLORTERM or $TERM
+contain the string "256".
+
+Nvim similarly assumes that any terminal emulator that sets $COLORTERM to any
+value, is capable of at least 16-colour operation.
+
+ *true-color* *xterm-true-color*
+Nvim emits true (24-bit) colours in the terminal, if 'termguicolors' is set.
+
+It uses the "setrgbf" and "setrgbb" |terminfo| extensions (proposed by Rรผdiger
+Sonderfeld in 2013). If your terminfo definition is missing them, then Nvim
+will decide whether to add them to your terminfo definition, using the ISO
+8613-6:1994/ITU T.416:1993 control sequences for setting RGB colours (but
+modified to use semicolons instead of colons unless the terminal is known to
+follow the standard).
+
+Another convention, pioneered in 2016 by tmux, is the "Tc" terminfo extension.
+If terminfo has this flag, Nvim will add constructed "setrgbf" and "setrgbb"
+capabilities as if they had been in the terminfo definition.
+
+If terminfo does not (yet) have this flag, Nvim will fall back to $TERM and
+other environment variables. It will add constructed "setrgbf" and "setrgbb"
+capabilities in the case of the the "rxvt", "linux", "st", "tmux", and "iterm"
+terminal types, or when Konsole, genuine Xterm, a libvte terminal emulator
+version 0.36 or later, or a terminal emulator that sets the COLORTERM
+environment variable to "truecolor" is detected.
+ *xterm-resize*
+Nvim can resize the terminal display on some terminals that implement an
+extension pioneered by dtterm. |terminfo| does not have a flag for this
+extension. So Nvim simply assumes that (all) "dtterm", "xterm", "teraterm",
+"rxvt" terminal types, and Konsole, are capable of this.
+
+ *tui-cursor-shape*
+Nvim will adjust the shape of the cursor from a block to a line when in insert
+mode (or as specified by the 'guicursor' option), on terminals that support
+it. It uses the same |terminfo| extensions that were pioneered by tmux for
+this: "Ss" and "Se".
+
+If your terminfo definition is missing them, then Nvim will decide whether to
+add them to your terminfo definition, by looking at $TERM and other
+environment variables. For the "rxvt", "putty", "linux", "screen",
+"teraterm", and "iterm" terminal types, or when Konsole, a libvte-based
+terminal emulator, or genuine Xterm are detected, it will add constructed
+"Ss" and "Se" capabilities.
+
+Note: Sometimes it will appear that Nvim when run within tmux is not changing
+the cursor, but in fact it is tmux receiving instructions from Nvim to change
+the cursor and not knowing what to do in turn. tmux has to translate what it
+receives from Nvim into whatever control sequence is appropriate for the
+terminal that it is outputting to. It shares a common mechanism with Nvim, of
+using the "Ss" and "Se" capabilities from terminfo (for the output terminal)
+if they are present. Unlike Nvim, if they are not present in terminfo you
+must add them by setting "terminal-overrides" in ~/.tmux.conf .
+
+See the tmux(1) manual page for the details of how and what to do in the tmux
+configuration file. It will look something like: >
+ set -ga terminal-overrides '*:Ss=\E[%p1%d q:Se=\E[ q'
+<or (alas!) for Konsole specifically, something more complex like: >
+ set -ga terminal-overrides 'xterm*:\E]50;CursorShape=%?%p1%{3}%<%t%{0}%e%{1}%;%d\007'
+<
*cs7-problem*
Note: If the terminal settings are changed after running Vim, you might have
an illegal combination of settings. This has been reported on Solaris 2.5
with "stty cs8 parenb", which is restored as "stty cs7 parenb". Use
"stty cs8 -parenb -istrip" instead, this is restored correctly.
-Some termcap entries are wrong in the sense that after sending 't_ks' the
-cursor keys send codes different from the codes defined in the termcap. To
-avoid this you can set 't_ks' (and 't_ke') to empty strings. This must be
-done during initialization (see |initialization|), otherwise it's too late.
-
Many cursor key codes start with an <Esc>. Vim must find out if this is a
single hit of the <Esc> key or the start of a cursor key sequence. It waits
for a next character to arrive. If it does not arrive within one second a
single <Esc> is assumed. On very slow systems this may fail, causing cursor
keys not to work sometimes. If you discover this problem reset the 'timeout'
option. Vim will wait for the next character to arrive after an <Esc>. If
-you want to enter a single <Esc> you must type it twice. Resetting the
-'esckeys' option avoids this problem in Insert mode, but you lose the
-possibility to use cursor and function keys in Insert mode.
+you want to enter a single <Esc> you must type it twice.
Some terminals have confusing codes for the cursor keys. The televideo 925 is
such a terminal. It sends a CTRL-H for cursor-left. This would make it
@@ -94,368 +211,8 @@ them as a cursor key. When you type you normally are not that fast, so they
are recognized as individual typed commands, even though Vim receives the same
sequence of bytes.
- *vt100-function-keys* *xterm-function-keys*
-An xterm can send function keys F1 to F4 in two modes: vt100 compatible or
-not. Because Vim may not know what the xterm is sending, both types of keys
-are recognized. The same happens for the <Home> and <End> keys.
- normal vt100 ~
- <F1> t_k1 <Esc>[11~ <xF1> <Esc>OP *<xF1>-xterm*
- <F2> t_k2 <Esc>[12~ <xF2> <Esc>OQ *<xF2>-xterm*
- <F3> t_k3 <Esc>[13~ <xF3> <Esc>OR *<xF3>-xterm*
- <F4> t_k4 <Esc>[14~ <xF4> <Esc>OS *<xF4>-xterm*
- <Home> t_kh <Esc>[7~ <xHome> <Esc>OH *<xHome>-xterm*
- <End> t_@7 <Esc>[4~ <xEnd> <Esc>OF *<xEnd>-xterm*
-
-When Vim starts, <xF1> is mapped to <F1>, <xF2> to <F2> etc. This means that
-by default both codes do the same thing. If you make a mapping for <xF2>,
-because your terminal does have two keys, the default mapping is overwritten,
-thus you can use the <F2> and <xF2> keys for something different.
-
- *xterm-shifted-keys*
-Newer versions of xterm support shifted function keys and special keys. Vim
-recognizes most of them. Use ":set termcap" to check which are supported and
-what the codes are. Mostly these are not in a termcap, they are only
-supported by the builtin_xterm termcap.
-
- *xterm-modifier-keys*
-Newer versions of xterm support Alt and Ctrl for most function keys. To avoid
-having to add all combinations of Alt, Ctrl and Shift for every key a special
-sequence is recognized at the end of a termcap entry: ";*X". The "X" can be
-any character, often '~' is used. The ";*" stands for an optional modifier
-argument. ";2" is Shift, ";3" is Alt, ";5" is Ctrl and ";9" is Meta (when
-it's different from Alt). They can be combined. Examples: >
- :set <F8>=^[[19;*~
- :set <Home>=^[[1;*H
-Another speciality about these codes is that they are not overwritten by
-another code. That is to avoid that the codes obtained from xterm directly
-|t_RV| overwrite them.
- *xterm-scroll-region*
-The default termcap entry for xterm on Sun and other platforms does not
-contain the entry for scroll regions. Add ":cs=\E[%i%d;%dr:" to the xterm
-entry in /etc/termcap and everything should work.
-
- *xterm-end-home-keys*
-On some systems (at least on FreeBSD with XFree86 3.1.2) the codes that the
-<End> and <Home> keys send contain a <Nul> character. To make these keys send
-the proper key code, add these lines to your ~/.Xdefaults file:
-
-*VT100.Translations: #override \n\
- <Key>Home: string("0x1b") string("[7~") \n\
- <Key>End: string("0x1b") string("[8~")
-
- *xterm-8bit* *xterm-8-bit*
-Xterm can be run in a mode where it uses 8-bit escape sequences. The CSI code
-is used instead of <Esc>[. The advantage is that an <Esc> can quickly be
-recognized in Insert mode, because it can't be confused with the start of a
-special key.
-For the builtin termcap entries, Vim checks if the 'term' option contains
-"8bit" anywhere. It then uses 8-bit characters for the termcap entries, the
-mouse and a few other things. You would normally set $TERM in your shell to
-"xterm-8bit" and Vim picks this up and adjusts to the 8-bit setting
-automatically.
-When Vim receives a response to the |t_RV| (request version) sequence and it
-starts with CSI, it assumes that the terminal is in 8-bit mode and will
-convert all key sequences to their 8-bit variants.
-
==============================================================================
-2. Terminal options *terminal-options* *termcap-options* *E436*
-
-The terminal options can be set just like normal options. But they are not
-shown with the ":set all" command. Instead use ":set termcap".
-
-It is always possible to change individual strings by setting the
-appropriate option. For example: >
- :set t_ce=^V^[[K (CTRL-V, <Esc>, [, K)
-
-The options are listed below. The associated termcap code is always equal to
-the last two characters of the option name. Only one termcap code is
-required: Cursor motion, 't_cm'.
-
-The options 't_da', 't_db', 't_ms', 't_xs' represent flags in the termcap.
-When the termcap flag is present, the option will be set to "y". But any
-non-empty string means that the flag is set. An empty string means that the
-flag is not set. 't_CS' works like this too, but it isn't a termcap flag.
-
-OUTPUT CODES
- option meaning ~
-
- t_AB set background color (ANSI) *t_AB* *'t_AB'*
- t_AF set foreground color (ANSI) *t_AF* *'t_AF'*
- t_AL add number of blank lines *t_AL* *'t_AL'*
- t_al add new blank line *t_al* *'t_al'*
- t_bc backspace character *t_bc* *'t_bc'*
- t_cd clear to end of screen *t_cd* *'t_cd'*
- t_ce clear to end of line *t_ce* *'t_ce'*
- t_cl clear screen *t_cl* *'t_cl'*
- t_cm cursor motion (required!) *E437* *t_cm* *'t_cm'*
- t_Co number of colors *t_Co* *'t_Co'*
- t_CS if non-empty, cursor relative to scroll region *t_CS* *'t_CS'*
- t_cs define scrolling region *t_cs* *'t_cs'*
- t_CV define vertical scrolling region *t_CV* *'t_CV'*
- t_da if non-empty, lines from above scroll down *t_da* *'t_da'*
- t_db if non-empty, lines from below scroll up *t_db* *'t_db'*
- t_DL delete number of lines *t_DL* *'t_DL'*
- t_dl delete line *t_dl* *'t_dl'*
- t_fs set window title end (from status line) *t_fs* *'t_fs'*
- t_ke exit "keypad transmit" mode *t_ke* *'t_ke'*
- t_ks start "keypad transmit" mode *t_ks* *'t_ks'*
- t_le move cursor one char left *t_le* *'t_le'*
- t_mb blinking mode *t_mb* *'t_mb'*
- t_md bold mode *t_md* *'t_md'*
- t_me Normal mode (undoes t_mr, t_mb, t_md and color) *t_me* *'t_me'*
- t_mr reverse (invert) mode *t_mr* *'t_mr'*
- *t_ms* *'t_ms'*
- t_ms if non-empty, cursor can be moved in standout/inverse mode
- t_nd non destructive space character *t_nd* *'t_nd'*
- t_op reset to original color pair *t_op* *'t_op'*
- t_RI cursor number of chars right *t_RI* *'t_RI'*
- t_Sb set background color *t_Sb* *'t_Sb'*
- t_Sf set foreground color *t_Sf* *'t_Sf'*
- t_se standout end *t_se* *'t_se'*
- t_so standout mode *t_so* *'t_so'*
- t_sr scroll reverse (backward) *t_sr* *'t_sr'*
- t_te out of "termcap" mode *t_te* *'t_te'*
- t_ti put terminal in "termcap" mode *t_ti* *'t_ti'*
- t_ts set window title start (to status line) *t_ts* *'t_ts'*
- t_ue underline end *t_ue* *'t_ue'*
- t_us underline mode *t_us* *'t_us'*
- t_Ce undercurl end *t_Ce* *'t_Ce'*
- t_Cs undercurl mode *t_Cs* *'t_Cs'*
- t_ut clearing uses the current background color *t_ut* *'t_ut'*
- t_vb visual bell *t_vb* *'t_vb'*
- t_ve cursor visible *t_ve* *'t_ve'*
- t_vi cursor invisible *t_vi* *'t_vi'*
- t_vs cursor very visible *t_vs* *'t_vs'*
- *t_xs* *'t_xs'*
- t_xs if non-empty, standout not erased by overwriting (hpterm)
- t_ZH italics mode *t_ZH* *'t_ZH'*
- t_ZR italics end *t_ZR* *'t_ZR'*
-
-Added by Vim (there are no standard codes for these):
- t_IS set icon text start *t_IS* *'t_IS'*
- t_IE set icon text end *t_IE* *'t_IE'*
- t_WP set window position (Y, X) in pixels *t_WP* *'t_WP'*
- t_WS set window size (height, width) in characters *t_WS* *'t_WS'*
- t_SI start insert mode (bar cursor shape) *t_SI* *'t_SI'*
- t_EI end insert mode (block cursor shape) *t_EI* *'t_EI'*
- |termcap-cursor-shape|
- t_RV request terminal version string (for xterm) *t_RV* *'t_RV'*
- |xterm-8bit| |v:termresponse| |xterm-codes|
- t_u7 request cursor position (for xterm) *t_u7* *'t_u7'*
- see |'ambiwidth'|
-
-KEY CODES
-Note: Use the <> form if possible
-
- option name meaning ~
-
- t_ku <Up> arrow up *t_ku* *'t_ku'*
- t_kd <Down> arrow down *t_kd* *'t_kd'*
- t_kr <Right> arrow right *t_kr* *'t_kr'*
- t_kl <Left> arrow left *t_kl* *'t_kl'*
- <xUp> alternate arrow up *<xUp>*
- <xDown> alternate arrow down *<xDown>*
- <xRight> alternate arrow right *<xRight>*
- <xLeft> alternate arrow left *<xLeft>*
- <S-Up> shift arrow up
- <S-Down> shift arrow down
- t_%i <S-Right> shift arrow right *t_%i* *'t_%i'*
- t_#4 <S-Left> shift arrow left *t_#4* *'t_#4'*
- t_k1 <F1> function key 1 *t_k1* *'t_k1'*
- <xF1> alternate F1 *<xF1>*
- t_k2 <F2> function key 2 *<F2>* *t_k2* *'t_k2'*
- <xF2> alternate F2 *<xF2>*
- t_k3 <F3> function key 3 *<F3>* *t_k3* *'t_k3'*
- <xF3> alternate F3 *<xF3>*
- t_k4 <F4> function key 4 *<F4>* *t_k4* *'t_k4'*
- <xF4> alternate F4 *<xF4>*
- t_k5 <F5> function key 5 *<F5>* *t_k5* *'t_k5'*
- t_k6 <F6> function key 6 *<F6>* *t_k6* *'t_k6'*
- t_k7 <F7> function key 7 *<F7>* *t_k7* *'t_k7'*
- t_k8 <F8> function key 8 *<F8>* *t_k8* *'t_k8'*
- t_k9 <F9> function key 9 *<F9>* *t_k9* *'t_k9'*
- t_k; <F10> function key 10 *<F10>* *t_k;* *'t_k;'*
- t_F1 <F11> function key 11 *<F11>* *t_F1* *'t_F1'*
- t_F2 <F12> function key 12 *<F12>* *t_F2* *'t_F2'*
- t_F3 <F13> function key 13 *<F13>* *t_F3* *'t_F3'*
- t_F4 <F14> function key 14 *<F14>* *t_F4* *'t_F4'*
- t_F5 <F15> function key 15 *<F15>* *t_F5* *'t_F5'*
- t_F6 <F16> function key 16 *<F16>* *t_F6* *'t_F6'*
- t_F7 <F17> function key 17 *<F17>* *t_F7* *'t_F7'*
- t_F8 <F18> function key 18 *<F18>* *t_F8* *'t_F8'*
- t_F9 <F19> function key 19 *<F19>* *t_F9* *'t_F9'*
- <S-F1> shifted function key 1
- <S-xF1> alternate <S-F1> *<S-xF1>*
- <S-F2> shifted function key 2 *<S-F2>*
- <S-xF2> alternate <S-F2> *<S-xF2>*
- <S-F3> shifted function key 3 *<S-F3>*
- <S-xF3> alternate <S-F3> *<S-xF3>*
- <S-F4> shifted function key 4 *<S-F4>*
- <S-xF4> alternate <S-F4> *<S-xF4>*
- <S-F5> shifted function key 5 *<S-F5>*
- <S-F6> shifted function key 6 *<S-F6>*
- <S-F7> shifted function key 7 *<S-F7>*
- <S-F8> shifted function key 8 *<S-F8>*
- <S-F9> shifted function key 9 *<S-F9>*
- <S-F10> shifted function key 10 *<S-F10>*
- <S-F11> shifted function key 11 *<S-F11>*
- <S-F12> shifted function key 12 *<S-F12>*
- t_%1 <Help> help key *t_%1* *'t_%1'*
- t_&8 <Undo> undo key *t_&8* *'t_&8'*
- t_kI <Insert> insert key *t_kI* *'t_kI'*
- t_kD <Del> delete key *t_kD* *'t_kD'*
- t_kb <BS> backspace key *t_kb* *'t_kb'*
- t_kB <S-Tab> back-tab (shift-tab) *<S-Tab>* *t_kB* *'t_kB'*
- t_kh <Home> home key *t_kh* *'t_kh'*
- t_#2 <S-Home> shifted home key *<S-Home>* *t_#2* *'t_#2'*
- <xHome> alternate home key *<xHome>*
- t_@7 <End> end key *t_@7* *'t_@7'*
- t_*7 <S-End> shifted end key *<S-End>* *t_star7* *'t_star7'*
- <xEnd> alternate end key *<xEnd>*
- t_kP <PageUp> page-up key *t_kP* *'t_kP'*
- t_kN <PageDown> page-down key *t_kN* *'t_kN'*
- t_K1 <kHome> keypad home key *t_K1* *'t_K1'*
- t_K4 <kEnd> keypad end key *t_K4* *'t_K4'*
- t_K3 <kPageUp> keypad page-up key *t_K3* *'t_K3'*
- t_K5 <kPageDown> keypad page-down key *t_K5* *'t_K5'*
- t_K6 <kPlus> keypad plus key *<kPlus>* *t_K6* *'t_K6'*
- t_K7 <kMinus> keypad minus key *<kMinus>* *t_K7* *'t_K7'*
- t_K8 <kDivide> keypad divide *<kDivide>* *t_K8* *'t_K8'*
- t_K9 <kMultiply> keypad multiply *<kMultiply>* *t_K9* *'t_K9'*
- t_KA <kEnter> keypad enter key *<kEnter>* *t_KA* *'t_KA'*
- t_KB <kPoint> keypad decimal point *<kPoint>* *t_KB* *'t_KB'*
- t_KC <k0> keypad 0 *<k0>* *t_KC* *'t_KC'*
- t_KD <k1> keypad 1 *<k1>* *t_KD* *'t_KD'*
- t_KE <k2> keypad 2 *<k2>* *t_KE* *'t_KE'*
- t_KF <k3> keypad 3 *<k3>* *t_KF* *'t_KF'*
- t_KG <k4> keypad 4 *<k4>* *t_KG* *'t_KG'*
- t_KH <k5> keypad 5 *<k5>* *t_KH* *'t_KH'*
- t_KI <k6> keypad 6 *<k6>* *t_KI* *'t_KI'*
- t_KJ <k7> keypad 7 *<k7>* *t_KJ* *'t_KJ'*
- t_KK <k8> keypad 8 *<k8>* *t_KK* *'t_KK'*
- t_KL <k9> keypad 9 *<k9>* *t_KL* *'t_KL'*
- <Mouse> leader of mouse code *<Mouse>*
-
-Note about t_so and t_mr: When the termcap entry "so" is not present the
-entry for "mr" is used. And vice versa. The same is done for "se" and "me".
-If your terminal supports both inversion and standout mode, you can see two
-different modes. If your terminal supports only one of the modes, both will
-look the same.
-
- *keypad-comma*
-The keypad keys, when they are not mapped, behave like the equivalent normal
-key. There is one exception: if you have a comma on the keypad instead of a
-decimal point, Vim will use a dot anyway. Use these mappings to fix that: >
- :noremap <kPoint> ,
- :noremap! <kPoint> ,
-< *xterm-codes*
-There is a special trick to obtain the key codes which currently only works
-for xterm. When |t_RV| is defined and a response is received which indicates
-an xterm with patchlevel 141 or higher, Vim uses special escape sequences to
-request the key codes directly from the xterm. The responses are used to
-adjust the various t_ codes. This avoids the problem that the xterm can
-produce different codes, depending on the mode it is in (8-bit, VT102,
-VT220, etc.). The result is that codes like <xF1> are no longer needed.
-Note: This is only done on startup. If the xterm options are changed after
-Vim has started, the escape sequences may not be recognized anymore.
-
- *xterm-resize*
-Window resizing with xterm only works if the allowWindowOps resource is
-enabled. On some systems and versions of xterm it's disabled by default
-because someone thought it would be a security issue. It's not clear if this
-is actually the case.
-
-To overrule the default, put this line in your ~/.Xdefaults or
-~/.Xresources:
->
- XTerm*allowWindowOps: true
-
-And run "xrdb -merge .Xresources" to make it effective. You can check the
-value with the context menu (right mouse button while CTRL key is pressed),
-there should be a tick at allow-window-ops.
-
- *termcap-colors*
-Note about colors: The 't_Co' option tells Vim the number of colors available.
-When it is non-zero, the 't_AB' and 't_AF' options are used to set the color.
-If one of these is not available, 't_Sb' and 't_Sf' are used. 't_me' is used
-to reset to the default colors.
-
- *termcap-cursor-shape* *termcap-cursor-color*
-When Vim enters Insert mode the 't_SI' escape sequence is sent. When leaving
-Insert mode 't_EI' is used. But only if both are defined. This can be used
-to change the shape or color of the cursor in Insert mode. These are not
-standard termcap/terminfo entries, you need to set them yourself.
-Example for an xterm, this changes the color of the cursor: >
- if &term =~ "xterm"
- let &t_SI = "\<Esc>]12;purple\x7"
- let &t_EI = "\<Esc>]12;blue\x7"
- endif
-NOTE: When Vim exits the shape for Normal mode will remain. The shape from
-before Vim started will not be restored.
-
- *termcap-title*
-The 't_ts' and 't_fs' options are used to set the window title if the terminal
-allows title setting via sending strings. They are sent before and after the
-title string, respectively. Similar 't_IS' and 't_IE' are used to set the
-icon text. These are Vim-internal extensions of the Unix termcap, so they
-cannot be obtained from an external termcap. However, the builtin termcap
-contains suitable entries for xterm, so you don't need to set them here.
- *hpterm*
-If inversion or other highlighting does not work correctly, try setting the
-'t_xs' option to a non-empty string. This makes the 't_ce' code be used to
-remove highlighting from a line. This is required for "hpterm". Setting the
-'weirdinvert' option has the same effect as making 't_xs' non-empty, and vice
-versa.
-
- *scroll-region*
-Some termcaps do not include an entry for 'cs' (scroll region), although the
-terminal does support it. For example: xterm on a Sun. You can use the
-builtin_xterm or define t_cs yourself. For example: >
- :set t_cs=^V^[[%i%d;%dr
-Where ^V is CTRL-V and ^[ is <Esc>.
-
-The vertical scroll region t_CV is not a standard termcap code. Vim uses it
-internally in the GUI. But it can also be defined for a terminal, if you can
-find one that supports it. The two arguments are the left and right column of
-the region which to restrict the scrolling to. Just like t_cs defines the top
-and bottom lines. Defining t_CV will make scrolling in vertically split
-windows a lot faster. Don't set t_CV when t_da or t_db is set (text isn't
-cleared when scrolling).
-
-Unfortunately it is not possible to deduce from the termcap how cursor
-positioning should be done when using a scrolling region: Relative to the
-beginning of the screen or relative to the beginning of the scrolling region.
-Most terminals use the first method. The 't_CS' option should be set to any
-string when cursor positioning is relative to the start of the scrolling
-region. It should be set to an empty string otherwise.
-
-Note for xterm users: The shifted cursor keys normally don't work. You can
- make them work with the xmodmap command and some mappings in Vim.
-
- Give these commands in the xterm:
- xmodmap -e "keysym Up = Up F13"
- xmodmap -e "keysym Down = Down F16"
- xmodmap -e "keysym Left = Left F18"
- xmodmap -e "keysym Right = Right F19"
-
- And use these mappings in Vim:
- :map <t_F3> <S-Up>
- :map! <t_F3> <S-Up>
- :map <t_F6> <S-Down>
- :map! <t_F6> <S-Down>
- :map <t_F8> <S-Left>
- :map! <t_F8> <S-Left>
- :map <t_F9> <S-Right>
- :map! <t_F9> <S-Right>
-
-Instead of, say, <S-Up> you can use any other command that you want to use the
-shift-cursor-up key for. (Note: To help people that have a Sun keyboard with
-left side keys F14 is not used because it is confused with the undo key; F15
-is not used, because it does a window-to-front; F17 is not used, because it
-closes the window. On other systems you can probably use them.)
-
-==============================================================================
-3. Window size *window-size*
+Window size *window-size*
[This is about the size of the whole window Vim is using, not a window that is
created with the ":split" command.]
@@ -464,146 +221,50 @@ On Unix systems, three methods are tried to get the window size:
- an ioctl call (TIOCGSIZE or TIOCGWINSZ, depends on your system)
- the environment variables "LINES" and "COLUMNS"
-- from the termcap entries "li" and "co"
+- from the |terminfo| entries "lines" and "columns"
If everything fails a default size of 24 lines and 80 columns is assumed. If
a window-resize signal is received the size will be set again. If the window
size is wrong you can use the 'lines' and 'columns' options to set the
-correct values.
-
-One command can be used to set the screen size:
-
- *:mod* *:mode* *E359* *E362*
-:mod[e]
-
-Detects the screen size and redraws the screen.
+correct values. See |:mode|.
==============================================================================
-4. Slow and fast terminals *slow-fast-terminal*
+Slow and fast terminals *slow-fast-terminal*
*slow-terminal*
-If you have a fast terminal you may like to set the 'ruler' option. The
-cursor position is shown in the status line. If you are using horizontal
-scrolling ('wrap' option off) consider setting 'sidescroll' to a small
-number.
-
-If you have a slow terminal you may want to reset the 'showcmd' option.
-The command characters will not be shown in the status line. If the terminal
-scrolls very slowly, set the 'scrolljump' to 5 or so. If the cursor is moved
-off the screen (e.g., with "j") Vim will scroll 5 lines at a time. Another
-possibility is to reduce the number of lines that Vim uses with the command
-"z{height}<CR>".
+If you have a slow terminal you may want to reset the 'showcmd' and 'ruler'
+options. The command characters and cursor positions will not be shown in the
+status line (which involves a lot of cursor motions and attribute changes for
+every keypress or movement). If the terminal scrolls very slowly, set the
+'scrolljump' to 5 or so. If the cursor is moved off the screen (e.g., with
+"j") Vim will scroll 5 lines at a time. Another possibility is to reduce the
+number of lines that Vim uses with the command "z{height}<CR>".
If the characters from the terminal are arriving with more than 1 second
between them you might want to set the 'timeout' and/or 'ttimeout' option.
See the "Options" chapter |options|.
-If you are using a color terminal that is slow, use this command: >
+If you are using a color terminal that is slow when displaying lines beyond
+the end of a buffer, this is because Nvim is drawing the whitespace twice, in
+two sets of colours and attributes. To prevent this, use this command: >
hi NonText cterm=NONE ctermfg=NONE
-This avoids that spaces are sent when they have different attributes. On most
-terminals you can't see this anyway.
-
-If you are using Vim over a slow serial line, you might want to try running
-Vim inside the "screen" program. Screen will optimize the terminal I/O quite
-a bit.
-
-If you are testing termcap options, but you cannot see what is happening,
-you might want to set the 'writedelay' option. When non-zero, one character
-is sent to the terminal at a time (does not work for MS-DOS). This makes the
-screen updating a lot slower, making it possible to see what is happening.
+This draws the spaces with the default colours and attributes, which allows the
+second pass of drawing to be optimized away. Note: Although in theory the
+colours of whitespace are immaterial, in practice they change the colours of
+cursors and selections that cross them. This may have a visible, but minor,
+effect on some UIs.
==============================================================================
-5. Using the mouse *mouse-using*
-
-This section is about using the mouse on a terminal or a terminal window. How
-to use the mouse in a GUI window is explained in |gui-mouse|. For scrolling
-with a mouse wheel see |scroll-mouse-wheel|.
-
-These characters in the 'mouse' option tell in which situations the mouse will
-be used by Vim:
- n Normal mode
- v Visual mode
- i Insert mode
- c Command-line mode
- h all previous modes when in a help file
- a all previous modes
- r for |hit-enter| prompt
-
-If you only want to use the mouse in a few modes or also want to use it for
-the two questions you will have to concatenate the letters for those modes.
-For example: >
- :set mouse=nv
-Will make the mouse work in Normal mode and Visual mode. >
- :set mouse=h
-Will make the mouse work in help files only (so you can use "g<LeftMouse>" to
-jump to tags).
-
-Whether the selection that is started with the mouse is in Visual mode or
-Select mode depends on whether "mouse" is included in the 'selectmode'
-option.
-
-In an xterm, with the currently active mode included in the 'mouse' option,
-normal mouse clicks are used by Vim, mouse clicks with the shift or ctrl key
-pressed go to the xterm. With the currently active mode not included in
-'mouse' all mouse clicks go to the xterm.
-
- *xterm-clipboard*
-The middle mouse button will insert the unnamed register. In that case, here
-is how you copy and paste a piece of text:
-
-Copy/paste with the mouse and Visual mode ('mouse' option must be set, see
-above):
-1. Press left mouse button on first letter of text, move mouse pointer to last
- letter of the text and release the button. This will start Visual mode and
- highlight the selected area.
-2. Press "y" to yank the Visual text in the unnamed register.
-3. Click the left mouse button at the insert position.
-4. Click the middle mouse button.
-
-Shortcut: If the insert position is on the screen at the same time as the
-Visual text, you can do 2, 3 and 4 all in one: Click the middle mouse button
-at the insert position.
-
- *xterm-copy-paste*
-NOTE: In some (older) xterms, it's not possible to move the cursor past column
-95 or 223. This is an xterm problem, not Vim's. Get a newer xterm
-|color-xterm|.
-
-Copy/paste in xterm with (current mode NOT included in 'mouse'):
-1. Press left mouse button on first letter of text, move mouse pointer to last
- letter of the text and release the button.
-2. Use normal Vim commands to put the cursor at the insert position.
-3. Press "a" to start Insert mode.
-4. Click the middle mouse button.
-5. Press ESC to end Insert mode.
-(The same can be done with anything in 'mouse' if you keep the shift key
-pressed while using the mouse.)
-
-Note: if you lose the 8th bit when pasting (special characters are translated
-into other characters), you may have to do "stty cs8 -istrip -parenb" in your
-shell before starting Vim.
-
-Thus in an xterm the shift and ctrl keys cannot be used with the mouse. Mouse
-commands requiring the CTRL modifier can be simulated by typing the "g" key
-before using the mouse:
- "g<LeftMouse>" is "<C-LeftMouse> (jump to tag under mouse click)
- "g<RightMouse>" is "<C-RightMouse> ("CTRL-T")
+Using the mouse *mouse-using*
*bracketed-paste-mode*
-Bracketed paste mode allows terminal emulators to distinguish between typed
-text and pasted text.
-
-For terminal emulators that support it, this mode is enabled by default. Thus
-you can paste text without Neovim giving any special meaning to it. Most
-notably it won't try reindenting those lines.
-
-If your terminal emulator doesn't support it yet, you can get the old Vim
-behaviour by enabling |'paste'| temporarily.
-
-NOTE: See https://cirw.in/blog/bracketed-paste for technical details.
+Nvim enables bracketed paste by default. Bracketed paste mode allows terminal
+applications to distinguish between typed text and pasted text. Thus you can
+paste text without Nvim trying to format or indent the text.
+See also https://cirw.in/blog/bracketed-paste
*mouse-mode-table* *mouse-overview*
-A short overview of what the mouse buttons do, when 'mousemodel' is "extend":
+Overview of what the mouse buttons do, when 'mousemodel' is "extend":
Normal Mode:
event position selection change action ~
@@ -714,14 +375,6 @@ In Insert mode, when a selection is started, Vim goes into Normal mode
temporarily. When Visual or Select mode ends, it returns to Insert mode.
This is like using CTRL-O in Insert mode. Select mode is used when the
'selectmode' option contains "mouse".
- *drag-status-line*
-When working with several windows, the size of the windows can be changed by
-dragging the status line with the mouse. Point the mouse at a status line,
-press the left button, move the mouse to the new position of the status line,
-release the button. Just clicking the mouse in a status line makes that window
-the current window, without moving the cursor. If by selecting a window it
-will change position or size, the dragging of the status line will look
-confusing, but it will work (just try it).
*<MiddleRelease>* *<MiddleDrag>*
Mouse clicks can be mapped. The codes for mouse clicks are:
diff --git a/runtime/doc/tips.txt b/runtime/doc/tips.txt
index 8032af7d0a..1362b730b7 100644
--- a/runtime/doc/tips.txt
+++ b/runtime/doc/tips.txt
@@ -1,4 +1,4 @@
-*tips.txt* For Vim version 7.4. Last change: 2009 Nov 07
+*tips.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -13,22 +13,7 @@ http://www.vim.org
Don't forget to browse the user manual, it also contains lots of useful tips
|usr_toc.txt|.
-Editing C programs |C-editing|
-Finding where identifiers are used |ident-search|
-Switching screens in an xterm |xterm-screens|
-Scrolling in Insert mode |scroll-insert|
-Smooth scrolling |scroll-smooth|
-Correcting common typing mistakes |type-mistakes|
-Counting words, lines, etc. |count-items|
-Restoring the cursor position |restore-position|
-Renaming files |rename-files|
-Change a name in multiple files |change-name|
-Speeding up external commands |speed-up|
-Useful mappings |useful-mappings|
-Compressing the help files |gzip-helpfile|
-Hex editing |hex-editing|
-Using <> notation in autocommands |autocmd-<>|
-Highlighting matching parens |match-parens|
+ Type |gO| to see the table of contents.
==============================================================================
Editing C programs *C-editing*
@@ -119,48 +104,6 @@ archive file on your closest gnu-ftp-mirror).
[the idea for this comes from Andreas Kutschera]
==============================================================================
-Switching screens in an xterm *xterm-screens* *xterm-save-screen*
-
-(From comp.editors, by Juergen Weigert, in reply to a question)
-
-:> Another question is that after exiting vim, the screen is left as it
-:> was, i.e. the contents of the file I was viewing (editing) was left on
-:> the screen. The output from my previous like "ls" were lost,
-:> ie. no longer in the scrolling buffer. I know that there is a way to
-:> restore the screen after exiting vim or other vi like editors,
-:> I just don't know how. Helps are appreciated. Thanks.
-:
-:I imagine someone else can answer this. I assume though that vim and vi do
-:the same thing as each other for a given xterm setup.
-
-They not necessarily do the same thing, as this may be a termcap vs.
-terminfo problem. You should be aware that there are two databases for
-describing attributes of a particular type of terminal: termcap and
-terminfo. This can cause differences when the entries differ AND when of
-the programs in question one uses terminfo and the other uses termcap
-(also see |+terminfo|).
-
-In your particular problem, you are looking for the control sequences
-^[[?47h and ^[[?47l. These switch between xterms alternate and main screen
-buffer. As a quick workaround a command sequence like >
- echo -n "^[[?47h"; vim ... ; echo -n "^[[?47l"
-may do what you want. (My notation ^[ means the ESC character, further down
-you'll see that the databases use \E instead).
-
-On startup, vim echoes the value of the termcap variable ti (terminfo:
-smcup) to the terminal. When exiting, it echoes te (terminfo: rmcup). Thus
-these two variables are the correct place where the above mentioned control
-sequences should go.
-
-Compare your xterm termcap entry (found in /etc/termcap) with your xterm
-terminfo entry (retrieved with "infocmp -C xterm"). Both should contain
-entries similar to: >
- :te=\E[2J\E[?47l\E8:ti=\E7\E[?47h:
-
-PS: If you find any difference, someone (your sysadmin?) should better check
- the complete termcap and terminfo database for consistency.
-
-==============================================================================
Scrolling in Insert mode *scroll-insert*
If you are in insert mode and you want to see something that is just off the
@@ -170,7 +113,6 @@ screen, you can use CTRL-X CTRL-E and CTRL-X CTRL-Y to scroll the screen.
To make this easier, you could use these mappings: >
:inoremap <C-E> <C-X><C-E>
:inoremap <C-Y> <C-X><C-Y>
-(Type this literally, make sure the '<' flag is not in 'cpoptions').
You then lose the ability to copy text from the line above/below the cursor
|i_CTRL-E|.
@@ -186,8 +128,6 @@ If you like the scrolling to go a bit smoother, you can use these mappings: >
:map <C-U> <C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y>
:map <C-D> <C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E>
-(Type this literally, make sure the '<' flag is not in 'cpoptions').
-
==============================================================================
Correcting common typing mistakes *type-mistakes*
@@ -339,9 +279,7 @@ For Emacs-style editing on the command-line: >
:cnoremap <Esc><C-B> <S-Left>
" forward one word
:cnoremap <Esc><C-F> <S-Right>
-
-NOTE: This requires that the '<' flag is excluded from 'cpoptions'. |<>|
-
+<
*format-bullet-list*
This mapping will format any bullet list. It requires that there is an empty
line above and below each list entry. The expression commands are used to
@@ -357,8 +295,7 @@ be able to give comments to the parts of the mapping. >
:execute m |" define the mapping
(<> notation |<>|. Note that this is all typed literally. ^W is "^" "W", not
-CTRL-W. You can copy/paste this into Vim if '<' is not included in
-'cpoptions'.)
+CTRL-W.)
Note that the last comment starts with |", because the ":execute" command
doesn't accept a comment directly.
@@ -400,7 +337,7 @@ when they are not in the same location as the compressed "doc" directory. See
==============================================================================
Hex editing *hex-editing* *using-xxd*
-See section |23.4| of the user manual.
+See section |23.3| of the user manual.
If one has a particular extension that one uses for binary files (such as exe,
bin, etc), you may find it helpful to automate the process with the following
@@ -509,4 +446,4 @@ A slightly more advanced version is used in the |matchparen| plugin.
autocmd InsertEnter * match none
<
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/uganda.txt b/runtime/doc/uganda.txt
index c228c65542..97a67befb9 100644
--- a/runtime/doc/uganda.txt
+++ b/runtime/doc/uganda.txt
@@ -1,4 +1,4 @@
-*uganda.txt* For Vim version 7.4. Last change: 2013 Jul 06
+*uganda.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -281,4 +281,4 @@ Address to send checks to:
This address is expected to be valid for a long time.
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/ui.txt b/runtime/doc/ui.txt
new file mode 100644
index 0000000000..9acd8b2c5a
--- /dev/null
+++ b/runtime/doc/ui.txt
@@ -0,0 +1,639 @@
+*ui.txt* Nvim
+
+
+ NVIM REFERENCE MANUAL
+
+
+Nvim UI protocol *ui*
+
+ Type |gO| to see the table of contents.
+
+==============================================================================
+UI Events *ui-events*
+
+GUIs can be implemented as external processes communicating with Nvim over the
+RPC API. The default UI model consists of a terminal-like grid with a single,
+monospace font size. The UI can opt-in to have windows drawn on separate
+grids, as well as to have some elements (UI "widgets") be drawn by the UI
+itself rather than by nvim ("externalized").
+
+
+ *ui-options*
+The |nvim_ui_attach()| API method is used to tell Nvim that your program wants to
+draw the Nvim screen grid with a size of width ร— height cells. This is typically
+done by an embedder, see |ui-startup| below for details, but an UI can also
+connect to a running nvim instance and invoke this method. `options` must be
+a dictionary with these (optional) keys:
+ `rgb` Decides the color format. *ui-rgb*
+ Set true (default) for 24-bit RGB colors.
+ Set false for terminal colors (max of 256).
+ *ui-ext-options*
+ `ext_popupmenu` Externalize the popupmenu. |ui-popupmenu|
+ `ext_tabline` Externalize the tabline. |ui-tabline|
+ `ext_cmdline` Externalize the cmdline. |ui-cmdline|
+ `ext_wildmenu` Externalize the wildmenu. |ui-wildmenu|
+ `ext_linegrid` Use new revision of the grid events. |ui-linegrid|
+ `ext_multigrid` Use per-window grid based events. |ui-multigrid|
+ `ext_hlstate` Use detailed highlight state. |ui-hlstate|
+
+Specifying a non-existent option is an error. UIs can check the |api-metadata|
+`ui_options` key for supported options. Additionally Nvim (currently) requires
+that all connected UIs use the same set of widgets. Therefore the active
+widgets will be the intersection of the requested widget sets of all connected
+UIs. The "option_set" event announces which widgets actually are active.
+
+Nvim sends msgpack-rpc notifications to all attached UIs, with method name
+"redraw" and a single argument: an array (batch) of screen "update events".
+Each update event is itself an array whose first element is the event name and
+remaining elements are event-parameter tuples. This allows multiple events of
+the same kind to be sent in a row without the event name being repeated. This
+batching is mostly used for "grid_line", because each "grid_line" event puts
+contents in one grid line, but clients must be prepared for multiple argument
+sets being batched for all event kinds.
+
+Events must be handled in-order. A "flush" event is sent when nvim is done
+redrawing the entire screen (so that all windows have a consistent view of
+buffer state, options etc). Clients should be prepared that several "redraw"
+batches are sent before the entire screen has been redrawn, and only the last
+batch will end in "flush". The user should only see the final state when
+"flush" is sent, and not any intermediate state after processing only part of
+the batch array, nor after a batch not ending with "flush".
+
+By default, Nvim sends |ui-global| and |ui-grid-old| events; these suffice to
+implement a terminal-like interface. However there are two revisions of the
+grid part of the protocol. The newer revision |ui-linegrid|, enabled by
+`ext_linegrid` option, has a more effecient representation of text (especially
+highlighted text), and allows extensions that use multiple grids.
+
+The older revision is available and used by default only for backwards
+compatibility reasons. New UIs are strongly recommended to use |ui-linegrid|,
+as further protocol extensions require it. The |ui-multigrid| extension
+enables |ui-linegrid| implicitly.
+
+Nvim optionally sends screen elements "semantically" as structured events
+instead of raw grid-lines, controlled by |ui-ext-options|. The UI must present
+those elements itself; Nvim will not draw those elements on the grid.
+
+Future versions of Nvim may add new update kinds and may append new parameters
+to existing update kinds. Clients must be prepared to ignore such extensions,
+for forward-compatibility. |api-contract|
+
+==============================================================================
+UI startup *ui-startup*
+
+Nvim defines a standard procedure for how an embedding UI should interact with
+the startup phase of Nvim. When spawning the nvim process, use the |--embed| flag
+but not the |--headless| flag. The started Nvim process will pause before loading
+startup files and reading buffers, and give the UI a chance to invoke requests
+to do early initialization. As soon as the UI invokes |nvim_ui_attach()|, the
+startup will continue.
+
+A simple UI only need to do a single |nvim_ui_attach()| request and then
+be prepared to handle any UI event. A more featureful UI, which might need
+additional configuration of the nvim process, should use the following startup
+procedure:
+
+1. Invoke |nvim_get_api_info()|, if this is needed to setup the client library
+ and/or to get the list of supported UI extensions.
+2. At this time, any configuration that should be happen before init.vim
+ loading should be done. Buffers and windows are not available at this
+ point, but this could be used to set |g:| variables visible to init.vim
+3. If the UI wants to do additional setup after the init.vim file was loaded
+ register an autocmd for VimEnter at this point: >
+
+ nvim_command("autocmd VimEnter * call rpcrequest(1, 'vimenter')")
+
+<4. Now invoke |nvim_ui_attach()|. The UI will need to handle keyboard input
+ at this point, as sourcing init.vim and loading buffers might lead to
+ blocking prompts.
+5. If step 3 was used, nvim will send a blocking "vimenter" request to the
+ UI. Inside this request handler, the UI can safely do any initialization
+ before entering normal mode, for instance reading variables set by
+ init.vim.
+
+==============================================================================
+Global Events *ui-global*
+
+The following events will always be available, and describe global state of
+the editor.
+
+["set_title", title]
+["set_icon", icon]
+ Set the window title, and icon (minimized) window title, respectively.
+ In windowing systems not distinguishing between the two, "set_icon"
+ can be ignored.
+
+["mode_info_set", cursor_style_enabled, mode_info]
+ `cursor_style_enabled` is a boolean indicating if the UI should set
+ the cursor style. `mode_info` is a list of mode property maps. The
+ current mode is given by the `mode_idx` field of the `mode_change`
+ event.
+
+ Each mode property map may contain these keys:
+
+ KEY DESCRIPTION ~
+ `cursor_shape`: "block", "horizontal", "vertical"
+ `cell_percentage`: Cell % occupied by the cursor.
+ `blinkwait`, `blinkon`, `blinkoff`: See |cursor-blinking|.
+ `attr_id`: Cursor attribute id (defined by `hl_attr_define`)
+ `attr_id_lm`: Cursor attribute id for when 'langmap' is active.
+ `short_name`: Mode code name, see 'guicursor'.
+ `name`: Mode descriptive name.
+ `mouse_shape`: (To be implemented.)
+
+ Some keys are missing in some modes.
+
+ The following keys are deprecated:
+
+ `hl_id`: Use `attr_id` instead.
+ `hl_lm`: Use `attr_id_lm` instead.
+
+["option_set", name, value]
+ UI-related option changed, where `name` is one of:
+
+ 'arabicshape'
+ 'ambiwidth'
+ 'emoji'
+ 'guifont'
+ 'guifontset'
+ 'guifontwide'
+ 'linespace'
+ 'showtabline'
+ 'termguicolors'
+ "ext_*" (all |ui-ext-options|)
+
+ Triggered when the UI first connects to Nvim, and whenever an option
+ is changed by the user or a plugin.
+
+ Options are not represented here if their effects are communicated in
+ other UI events. For example, instead of forwarding the 'mouse' option
+ value, the "mouse_on" and "mouse_off" UI events directly indicate if
+ mouse support is active. Some options like 'ambiwidth' have already
+ taken effect on the grid, where appropriate empty cells are added,
+ however a UI might still use such options when rendering raw text
+ sent from Nvim, like for |ui-cmdline|.
+
+["mode_change", mode, mode_idx]
+ The mode changed. The first parameter `mode` is a string representing
+ the current mode. `mode_idx` is an index into the array received in
+ the `mode_info_set` event. UIs should change the cursor style
+ according to the properties specified in the corresponding item. The
+ set of modes reported will change in new versions of Nvim, for
+ instance more submodes and temporary states might be represented as
+ separate modes.
+
+["mouse_on"]
+["mouse_off"]
+ Tells the client whether mouse support, as determined by |'mouse'|
+ option, is considered to be active in the current mode. This is mostly
+ useful for a terminal frontend, or other situations where nvim mouse
+ would conflict with other usages of the mouse. It is safe for a client
+ to ignore this and always send mouse events.
+
+["busy_start"]
+["busy_stop"]
+ Nvim started or stopped being busy, and possibly not responsive to
+ user input. This could be indicated to the user by hiding the cursor.
+
+["suspend"]
+ |:suspend| command or |CTRL-Z| mapping is used. A terminal client (or
+ another client where it makes sense) could suspend itself. Other
+ clients can safely ignore it.
+
+["update_menu"]
+ The menu mappings changed.
+
+["bell"]
+["visual_bell"]
+ Notify the user with an audible or visual bell, respectively.
+
+["flush"]
+ Nvim is done redrawing the screen. For an implementation that renders
+ to an internal buffer, this is the time to display the redrawn parts
+ to the user.
+
+==============================================================================
+Grid Events (line-based) *ui-linegrid*
+
+These events are used if `ext_linegrid` option is set (recommended for all new
+UIs). The biggest change compared to previous revision is to use a single
+event `grid_line` to update the contents of a screen line (where the old
+protocol used a combination of cursor, highlight and text events)
+
+Most of these events take a `grid` index as first parameter. Grid 1 is the
+global grid used by default for the entire editor screen state. Grids other
+than that will be defined by future extensions. Just activating the
+`ext_linegrid` option by itself will never cause any additional grids to be
+created. To enable per-window grids, `ext_multigrid` option should be set (see
+|ui-multigrid|).
+
+Highlight attribute groups are predefined. UIs should maintain a table to map
+numerical highlight `id`:s to the actual attributes.
+
+["grid_resize", grid, width, height]
+ Resize a `grid`. If `grid` wasn't seen by the client before, a new grid is
+ being created with this size.
+
+["default_colors_set", rgb_fg, rgb_bg, rgb_sp, cterm_fg, cterm_bg]
+ The first three arguments set the default foreground, background and
+ special colors respectively. `cterm_fg` and `cterm_bg` specifies the
+ default color codes to use in a 256-color terminal.
+
+ Note: unlike the corresponding events in the first revision, the
+ screen is not always cleared after sending this event. The GUI has to
+ repaint the screen with changed background color itself.
+
+ *ui-event-hl_attr_define*
+["hl_attr_define", id, rgb_attr, cterm_attr, info]
+ Add a highlight with `id` to the highlight table, with the
+ attributes specified by the `rgb_attr` and `cterm_attr` dicts, with the
+ following (all optional) keys.
+
+ `foreground`: foreground color.
+ `background`: background color.
+ `special`: color to use for underline and undercurl, when present.
+ `reverse`: reverse video. Foreground and background colors are
+ switched.
+ `italic`: italic text.
+ `bold`: bold text.
+ `underline`: underlined text. The line has `special` color.
+ `undercurl`: undercurled text. The curl has `special` color.
+
+ For absent color keys the default color should be used. Don't store
+ the default value in the table, rather a sentinel value, so that
+ a changed default color will take effect.
+ All boolean keys default to false, and will only be sent when they
+ are true.
+
+ Highlights are always transmitted both for both the rgb format and as
+ terminal 256-color codes, as the `rgb_attr` and `cterm_attr` parameters
+ respectively. The |ui-rgb| option has no effect effect anymore.
+ Most external UIs will only need to store and use the `rgb_attr`
+ attributes.
+
+ `id` 0 will always be used for the default highlight with colors defined
+ by `default_colors_set` and no styles applied.
+
+ Note: `id`:s can be reused if Nvim's internal highlight table is full.
+ In this case, Nvim will always issue redraws of screen cells that are
+ affected by redefined `id`:s, so UIs do not need to keep track of this
+ themselves.
+
+ `info` is an empty array per default, and will be used by the
+ |ui-hlstate| extension explaned below.
+
+ *ui-event-grid_line*
+["grid_line", grid, row, col_start, cells]
+ Redraw a continous part of a `row` on a `grid`, starting at the column
+ `col_start`. `cells` is an array of arrays each with 1 to 3 items:
+ `[text(, hl_id, repeat)]` . `text` is the UTF-8 text that should be put in
+ a cell, with the highlight `hl_id` defined by a previous `hl_attr_define`
+ call. If `hl_id` is not present the most recently seen `hl_id` in
+ the same call should be used (it is always sent for the first
+ cell in the event). If `repeat` is present, the cell should be
+ repeated `repeat` times (including the first time), otherwise just
+ once.
+
+ The right cell of a double-width char will be represented as the empty
+ string. Double-width chars never use `repeat`.
+
+ If the array of cell changes doesn't reach to the end of the line, the
+ rest should remain unchanged. A whitespace char, repeated
+ enough to cover the remaining line, will be sent when the rest of the
+ line should be cleared.
+
+["grid_clear", grid]
+ Clear a `grid`.
+
+["grid_destroy", grid]
+ `grid` will not be used anymore and the UI can free any data associated
+ with it.
+
+["grid_cursor_goto", grid, row, column]
+ Makes `grid` the current grid and `row, column` the cursor position on this
+ grid. This event will be sent at most once in a `redraw` batch and
+ indicates the visible cursor position.
+
+["grid_scroll", grid, top, bot, left, right, rows, cols]
+ Scroll the text in the a region of `grid`. The diagrams below illustrate
+ what will happen, depending on the scroll direction. "=" is used to
+ represent the SR(scroll region) boundaries and "-" the moved rectangles.
+ Note that dst and src share a common region.
+
+ If `rows` is bigger than 0, move a rectangle in the SR up, this can
+ happen while scrolling down.
+>
+ +-------------------------+
+ | (clipped above SR) | ^
+ |=========================| dst_top |
+ | dst (still in SR) | |
+ +-------------------------+ src_top |
+ | src (moved up) and dst | |
+ |-------------------------| dst_bot |
+ | src (invalid) | |
+ +=========================+ src_bot
+<
+ If `rows` is less than zero, move a rectangle in the SR down, this can
+ happen while scrolling up.
+>
+ +=========================+ src_top
+ | src (invalid) | |
+ |------------------------ | dst_top |
+ | src (moved down) and dst| |
+ +-------------------------+ src_bot |
+ | dst (still in SR) | |
+ |=========================| dst_bot |
+ | (clipped below SR) | v
+ +-------------------------+
+<
+ `cols` is always zero in this version of Nvim, and reserved for future
+ use.
+
+ Note when updating code from |ui-grid-old| events: ranges are
+ end-exclusive, which is consistent with API conventions, but different
+ from `set_scroll_region` which was end-inclusive.
+
+ The scrolled-in area will be filled using |ui-event-grid_line| directly
+ after the scroll event. The UI thus doesn't need to clear this area as
+ part of handling the scroll event.
+
+==============================================================================
+Legacy Grid Events (cell based) *ui-grid-old*
+
+This is an older representation of the screen grid, used if `ext_linegrid`
+option is not set. New UIs should use |ui-linegrid|.
+
+["resize", width, height]
+ The grid is resized to `width` and `height` cells.
+
+["clear"]
+ Clear the grid.
+
+["eol_clear"]
+ Clear from the cursor position to the end of the current line.
+
+["cursor_goto", row, col]
+ Move the cursor to position (row, col). Currently, the same cursor is
+ used to define the position for text insertion and the visible cursor.
+ However, only the last cursor position, after processing the entire
+ array in the "redraw" event, is intended to be a visible cursor
+ position.
+
+["update_fg", color]
+["update_bg", color]
+["update_sp", color]
+ Set the default foreground, background and special colors
+ respectively.
+
+ *ui-event-highlight_set*
+["highlight_set", attrs]
+ Set the attributes that the next text put on the grid will have.
+ `attrs` is a dict with the keys below. Any absent key is reset
+ to its default value. Color defaults are set by the `update_fg` etc
+ updates. All boolean keys default to false.
+
+ `foreground`: foreground color.
+ `background`: backround color.
+ `special`: color to use for underline and undercurl, when present.
+ `reverse`: reverse video. Foreground and background colors are
+ switched.
+ `italic`: italic text.
+ `bold`: bold text.
+ `underline`: underlined text. The line has `special` color.
+ `undercurl`: undercurled text. The curl has `special` color.
+
+["put", text]
+ The (utf-8 encoded) string `text` is put at the cursor position
+ (and the cursor is advanced), with the highlights as set by the
+ last `highlight_set` update.
+
+["set_scroll_region", top, bot, left, right]
+ Define the scroll region used by `scroll` below.
+
+ Note: ranges are end-inclusive, which is inconsistent with API
+ conventions.
+
+["scroll", count]
+ Scroll the text in the scroll region. The diagrams below illustrate
+ what will happen, depending on the scroll direction. "=" is used to
+ represent the SR(scroll region) boundaries and "-" the moved rectangles.
+ Note that dst and src share a common region.
+
+ If count is bigger than 0, move a rectangle in the SR up, this can
+ happen while scrolling down.
+>
+ +-------------------------+
+ | (clipped above SR) | ^
+ |=========================| dst_top |
+ | dst (still in SR) | |
+ +-------------------------+ src_top |
+ | src (moved up) and dst | |
+ |-------------------------| dst_bot |
+ | src (cleared) | |
+ +=========================+ src_bot
+<
+ If count is less than zero, move a rectangle in the SR down, this can
+ happen while scrolling up.
+>
+ +=========================+ src_top
+ | src (cleared) | |
+ |------------------------ | dst_top |
+ | src (moved down) and dst| |
+ +-------------------------+ src_bot |
+ | dst (still in SR) | |
+ |=========================| dst_bot |
+ | (clipped below SR) | v
+ +-------------------------+
+<
+==============================================================================
+Detailed highlight state Extension *ui-hlstate*
+
+Only sent if `ext_hlstate` option is set in |ui-options|. `ext_hlstate` implies
+`ext_linegrid`.
+
+By default, nvim will only describe grid cells using the final calculated
+higlight attributes, as described by the dict keys in |ui-event-highlight_set|.
+The `ext_hlstate` extension allows to the UI to also receive a semantic
+describtion of the higlights active in a cell. In this mode highlights will be
+predefined in a table, see |ui-event-hl_attr_define| and |ui-event-grid_line|.
+The `info` parameter in `hl_attr_define` will contain a semantic description
+of the highlights. As highlight groups can be combined, this will be an array
+of items, with the item with highest priority last. Each item is a dictionary
+with the following possible keys:
+
+ `kind`: always present. One of the following values:
+ "ui": A builtin ui highlight.
+ "syntax": highlight applied to a buffer by a syntax declaration or
+ other runtime/plugin functionallity such as
+ |nvim_buf_add_highlight()|
+ "terminal": highlight from a process running in a |terminal-emulator|.
+ Contains no futher semantic information.
+ `ui_name`: Name of the builtin highlight. See |highlight-groups| for
+ possible values. Only present for "ui".
+ `hi_name`: Name of the final |:highlight| group where the used
+ attributes are defined.
+ `id`: Unique numeric id representing this item.
+
+Note: "ui" items will have both `ui_name` and `hi_name` present. These can
+differ, because the builtin group was linked to another group |:hi-link| , or
+because 'winhighlight' was used. UI items will be transmitted, even if the
+highlight group is cleared, so `ui_name` can always be used to reliably identify
+screen elements, even if no attributes have been applied.
+
+==============================================================================
+Multigrid Events *ui-multigrid*
+
+Only sent if `ext_multigrid` option is set in |ui-options|. Enables the
+`ext_linegrid` extension implicitly.
+
+The multigrid extension gives the UIs more control over how windows are
+displayed. The UIs receive updates on a separate grid for each window. The UIs
+can set the grid size independently of how much space the window occupies on
+the global layout. This enables the UIs to set a different font size for each
+window if the UI so desires. The UI can also reserve space around the border
+of the window for its own elements, for instance scrollbars from the UI
+toolkit.
+
+By default, the grid size is handled by nvim and set to the outer grid size
+(i.e. the size of the window frame in nvim) whenever the split is created.
+Once a UI sets a grid size, nvim does not handle the size for that grid and
+the UI must change the grid size whenever the outer size is changed. To
+delegate the handling of grid size back to nvim, the UIs should request the
+size (0, 0).
+
+A window can be hidden and redisplayed without its grid being deallocated.
+This can happen multiple times for the same window, for instance when switching
+tabs.
+
+["win_pos", grid, win, start_row, start_col, width, height]
+ Set the position and size of the grid in nvim (i.e. the outer grid
+ size). If the window was previously hidden, it should now be shown
+ again.
+
+["win_hide", grid]
+ Stop displaying the window.
+
+["win_scroll_over_start"]
+ Hint that following `grid_scroll` on the default grid should
+ scroll over windows. This is a temporary workaround to allow
+ UIs to use the builtin message drawing. Later on, messages will be
+ drawn on a dedicated grid.
+
+["win_scroll_over_reset"]
+ Hint that scrolled over windows should be redrawn again, and not be
+ overdrawn by default grid scrolling anymore.
+
+See |ui-linegrid| for grid events.
+See |nvim_ui_try_resize_grid| in |api-ui| to request changing the grid size.
+
+==============================================================================
+Popupmenu Events *ui-popupmenu*
+
+Only sent if `ext_popupmenu` option is set in |ui-options|
+
+["popupmenu_show", items, selected, row, col, grid]
+ Show |popupmenu-completion|. `items` is an array of completion items
+ to show; each item is an array of the form [word, kind, menu, info] as
+ defined at |complete-items|, except that `word` is replaced by `abbr`
+ if present. `selected` is the initially-selected item, a zero-based
+ index into the array of items (-1 if no item is selected). `row` and
+ `col` give the anchor position, where the first character of the
+ completed word will be. When |ui-multigrid| is used, `grid` is the
+ grid for the anchor position.
+
+["popupmenu_select", selected]
+ Select an item in the current popupmenu. `selected` is a zero-based
+ index into the array of items from the last popupmenu_show event, or
+ -1 if no item is selected.
+
+["popupmenu_hide"]
+ Hide the popupmenu.
+
+==============================================================================
+Tabline Events *ui-tabline*
+
+Only sent if `ext_tabline` option is set in |ui-options|
+
+["tabline_update", curtab, tabs]
+ Tabline was updated. UIs should present this data in a custom tabline
+ widget.
+ curtab: Current Tabpage
+ tabs: List of Dicts [{ "tab": Tabpage, "name": String }, ...]
+
+==============================================================================
+Cmdline Events *ui-cmdline*
+
+Only sent if `ext_cmdline` option is set in |ui-options|
+
+["cmdline_show", content, pos, firstc, prompt, indent, level]
+ content: List of [attrs, string]
+ [[{}, "t"], [attrs, "est"], ...]
+
+ Triggered when the cmdline is displayed or changed.
+ The `content` is the full content that should be displayed in the
+ cmdline, and the `pos` is the position of the cursor that in the
+ cmdline. The content is divided into chunks with different highlight
+ attributes represented as a dict (see |ui-event-highlight_set|).
+
+ `firstc` and `prompt` are text, that if non-empty should be
+ displayed in front of the command line. `firstc` always indicates
+ built-in command lines such as `:` (ex command) and `/` `?` (search),
+ while `prompt` is an |input()| prompt. `indent` tells how many spaces
+ the content should be indented.
+
+ The Nvim command line can be invoked recursively, for instance by
+ typing `<c-r>=` at the command line prompt. The `level` field is used
+ to distinguish different command lines active at the same time. The
+ first invoked command line has level 1, the next recursively-invoked
+ prompt has level 2. A command line invoked from the |cmdline-window|
+ has a higher level than than the edited command line.
+
+["cmdline_pos", pos, level]
+ Change the cursor position in the cmdline.
+
+["cmdline_special_char", c, shift, level]
+ Display a special char in the cmdline at the cursor position. This is
+ typically used to indicate a pending state, e.g. after |c_CTRL-V|. If
+ `shift` is true the text after the cursor should be shifted, otherwise
+ it should overwrite the char at the cursor.
+
+ Should be hidden at next cmdline_show.
+
+["cmdline_hide"]
+ Hide the cmdline.
+
+["cmdline_block_show", lines]
+ Show a block of context to the current command line. For example if
+ the user defines a |:function| interactively: >
+ :function Foo()
+ : echo "foo"
+ :
+<
+ `lines` is a list of lines of highlighted chunks, in the same form as
+ the "cmdline_show" `contents` parameter.
+
+["cmdline_block_append", line]
+ Append a line at the end of the currently shown block.
+
+["cmdline_block_hide"]
+ Hide the block.
+
+==============================================================================
+Wildmenu Events *ui-wildmenu*
+
+Only sent if `ext_wildmenu` option is set in |ui-options|
+
+["wildmenu_show", items]
+ Activate the wildmenu (command-line completion). `items` is an array
+ with the completion items.
+
+["wildmenu_select", selected]
+ Select an item in the current wildmenu. `selected` is a zero-based
+ index into the array of items from the last wildmenu_show event, or -1
+ if no item is selected.
+
+["wildmenu_hide"]
+ Hide the wildmenu.
+
+==============================================================================
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/undo.txt b/runtime/doc/undo.txt
index c6c70ab6d2..a500e87e35 100644
--- a/runtime/doc/undo.txt
+++ b/runtime/doc/undo.txt
@@ -1,4 +1,4 @@
-*undo.txt* For Vim version 7.4. Last change: 2014 May 24
+*undo.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -8,12 +8,7 @@ Undo and redo *undo-redo*
The basics are explained in section |02.5| of the user manual.
-1. Undo and redo commands |undo-commands|
-2. Two ways of undo |undo-two-ways|
-3. Undo blocks |undo-blocks|
-4. Undo branches |undo-branches|
-5. Undo persistence |undo-persistence|
-6. Remarks about undo |undo-remarks|
+ Type |gO| to see the table of contents.
==============================================================================
1. Undo and redo commands *undo-commands*
@@ -388,4 +383,4 @@ if it is not what you want do 'u.'. This will remove the contents of the
first put, and repeat the put command for the second register. Repeat the
'u.' until you got what you want.
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_01.txt b/runtime/doc/usr_01.txt
index 2fa15331df..3deaf181e5 100644
--- a/runtime/doc/usr_01.txt
+++ b/runtime/doc/usr_01.txt
@@ -1,4 +1,4 @@
-*usr_01.txt* For Vim version 7.4. Last change: 2010 Nov 03
+*usr_01.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -57,21 +57,20 @@ make them visible with: >
==============================================================================
*01.2* Vim installed *setup-vimrc_example*
-It's not required for this tutorial, but we provide an example vimrc you may
-use:
+To create an empty vimrc: >
- :!cp -i $VIMRUNTIME/vimrc_example.vim ~/.config/nvim/init.vim
-
-If the file already exists you probably want to keep it.
+ :call mkdir(stdpath('config'),'p')
+ :exe 'edit' stdpath('config').'/init.vim'
+ :write
For more info see |vimrc|.
==============================================================================
*01.3* Using the Vim tutor *tutor* *vimtutor*
-Instead of reading the text (boring!) you can use the vimtutor to learn your
-first Vim commands. This is a 30 minute tutorial that teaches the most basic
-Vim functionality hands-on.
+Instead of reading the text (boring!) you can use :Tutor to learn your first
+Vim commands. This is a 30 minute tutorial that teaches the most basic Vim
+functionality hands-on.
To start the tutorial, execute >
@@ -110,4 +109,4 @@ donate part of the profit to help AIDS victims in Uganda. See |iccf|.
Next chapter: |usr_02.txt| The first steps in Vim
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_02.txt b/runtime/doc/usr_02.txt
index c10643940d..9ebbd11ac7 100644
--- a/runtime/doc/usr_02.txt
+++ b/runtime/doc/usr_02.txt
@@ -1,4 +1,4 @@
-*usr_02.txt* For Vim version 7.4. Last change: 2016 Jan 16
+*usr_02.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -543,7 +543,7 @@ Summary: *help-summary* >
8) Ex-commands always start with ":", so to go to the :s command help: >
:help :s
-9) Commands specifically for debugging start with ">". To go to to the help
+9) Commands specifically for debugging start with ">". To go to the help
for the "cont" debug command: >
:help >cont
@@ -578,7 +578,7 @@ Summary: *help-summary* >
register: >
:help quote:
-13) Vim Script (VimL) is available at >
+13) Vim Script is available at >
:help eval.txt
< Certain aspects of the language are available at :h expr-X where "X" is a
single letter. E.g. >
@@ -588,10 +588,10 @@ Summary: *help-summary* >
Also important is >
:help function-list
< to find a short description of all functions available. Help topics for
- VimL functions always include the "()", so: >
+ Vim script functions always include the "()", so: >
:help append()
-< talks about the append VimL function rather than how to append text in the
- current buffer.
+< talks about the append Vim script function rather than how to append text
+ in the current buffer.
14) Mappings are talked about in the help page :h |map.txt|. Use >
:help mapmode-i
@@ -652,7 +652,7 @@ Summary: *help-summary* >
22) Autocommand events can be found by their name: >
:help BufWinLeave
< To see all possible events: >
- :help autocommands-events
+ :help autocommand-events
23) Command-line switches always start with "-". So for the help of the -f
command switch of Vim use: >
@@ -687,4 +687,4 @@ Summary: *help-summary* >
Next chapter: |usr_03.txt| Moving around
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_03.txt b/runtime/doc/usr_03.txt
index 943d7b528c..2649534900 100644
--- a/runtime/doc/usr_03.txt
+++ b/runtime/doc/usr_03.txt
@@ -1,4 +1,4 @@
-*usr_03.txt* For Vim version 7.4. Last change: 2016 Jan 05
+*usr_03.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -182,7 +182,7 @@ the following:
This tells you that you might want to fix something on line 33. So how do you
find line 33? One way is to do "9999k" to go to the top of the file and "32j"
-to go down thirty two lines. It is not a good way, but it works. A much
+to go down thirty-two lines. It is not a good way, but it works. A much
better way of doing things is to use the "G" command. With a count, this
command positions you at the given line number. For example, "33G" puts you
on line 33. (For a better way of going through a compiler's error list, see
@@ -353,7 +353,7 @@ The "?" command works like "/" but searches backwards: >
?word
The "N" command repeats the last search the opposite direction. Thus using
-"N" after a "/" command search backwards, using "N" after "?" searches
+"N" after a "/" command searches backwards, using "N" after "?" searches
forward.
@@ -508,7 +508,7 @@ only if it is at the beginning of a line.
The $ character matches the end of a line. Therefore, "was$" matches the
word was only if it is at the end of a line.
-Let's mark the places where "the" matches in this example line with "x"s:
+Let's mark the places where "/the" matches in this example line with "x"s:
the solder holding one of the chips melted and the ~
xxx xxx xxx
@@ -650,4 +650,4 @@ You will notice a few special marks. These include:
Next chapter: |usr_04.txt| Making small changes
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_04.txt b/runtime/doc/usr_04.txt
index 59ba0b3e73..a327a09a71 100644
--- a/runtime/doc/usr_04.txt
+++ b/runtime/doc/usr_04.txt
@@ -1,4 +1,4 @@
-*usr_04.txt* For Vim version 7.4. Last change: 2014 Aug 29
+*usr_04.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -511,4 +511,4 @@ else:
Next chapter: |usr_05.txt| Set your settings
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_05.txt b/runtime/doc/usr_05.txt
index f920fd4591..af17d75656 100644
--- a/runtime/doc/usr_05.txt
+++ b/runtime/doc/usr_05.txt
@@ -1,4 +1,4 @@
-*usr_05.txt* For Vim version 7.4. Last change: 2016 Mar 28
+*usr_05.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -58,10 +58,9 @@ to write a Vim script file: |usr_41.txt|.
==============================================================================
*05.2* The example vimrc file explained *vimrc_example.vim*
-In the first chapter was explained how the example vimrc file can be used.
-The file can be found here:
+In the first chapter was explained how to create a vimrc file. >
- $VIMRUNTIME/vimrc_example.vim ~
+ :exe 'edit' stdpath('config').'/init.vim'
In this section we will explain the various commands used in this file. This
will give you hints about how to set up your own preferences. Not everything
@@ -140,15 +139,13 @@ quite complicated things. Still, it is just a sequence of commands that are
executed like you typed them.
>
- if &t_Co > 2 || has("gui_running")
- syntax on
- set hlsearch
- endif
+ syntax on
+ set hlsearch
-This switches on syntax highlighting, but only if colors are available. And
-the 'hlsearch' option tells Vim to highlight matches with the last used search
-pattern. The "if" command is very useful to set options only when some
-condition is met. More about that in |usr_41.txt|.
+This switches on syntax highlighting. And the 'hlsearch' option tells Vim to
+highlight matches with the last used search pattern. The "if" command is very
+useful to set options only when some condition is met. More about that in
+|usr_41.txt|.
*vimrc-filetype* >
filetype plugin indent on
@@ -320,14 +317,13 @@ when you use Vim. There are only two steps for adding a global plugin:
GETTING A GLOBAL PLUGIN
Where can you find plugins?
+- Some are always loaded, you can see them in the directory $VIMRUNTIME/plugin.
- Some come with Vim. You can find them in the directory $VIMRUNTIME/macros
- and its sub-directories.
+ and its sub-directories and under $VIM/vimfiles/pack/dist/opt/.
- Download from the net. There is a large collection on http://www.vim.org.
-- They are sometimes posted in a Vim |maillist|.
+- They are sometimes posted in a Vim maillist.
- You could write one yourself, see |write-plugin|.
-Some plugins come as a vimball archive, see |vimball|.
-
USING A GLOBAL PLUGIN
@@ -614,4 +610,4 @@ This does mean there is less room to edit text, thus it's a compromise.
Next chapter: |usr_06.txt| Using syntax highlighting
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_06.txt b/runtime/doc/usr_06.txt
index b4b495ff9f..beffb92877 100644
--- a/runtime/doc/usr_06.txt
+++ b/runtime/doc/usr_06.txt
@@ -1,4 +1,4 @@
-*usr_06.txt* For Vim version 7.4. Last change: 2009 Oct 28
+*usr_06.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -55,8 +55,7 @@ There can be a number of reasons why you don't see colors:
- Your terminal does not support colors.
Vim will use bold, italic and underlined text, but this doesn't look
very nice. You probably will want to try to get a terminal with
- colors. For Unix, I recommend the xterm from the XFree86 project:
- |xfree-xterm|.
+ colors.
- Your terminal does support colors, but Vim doesn't know this.
Make sure your $TERM setting is correct. For example, when using an
@@ -68,9 +67,7 @@ There can be a number of reasons why you don't see colors:
TERM=xterm-color; export TERM
-< The terminal name must match the terminal you are using. If it
- still doesn't work, have a look at |xterm-color|, which shows a few
- ways to make Vim display colors (not only for an xterm).
+< The terminal name must match the terminal you are using.
- The file type is not recognized.
Vim doesn't know all file types, and sometimes it's near to impossible
@@ -277,4 +274,4 @@ others look at the colored text.
Next chapter: |usr_07.txt| Editing more than one file
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_07.txt b/runtime/doc/usr_07.txt
index 50e4781cd7..c44a54d76c 100644
--- a/runtime/doc/usr_07.txt
+++ b/runtime/doc/usr_07.txt
@@ -1,4 +1,4 @@
-*usr_07.txt* For Vim version 7.4. Last change: 2006 Apr 24
+*usr_07.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -221,7 +221,7 @@ and write the file with ":w". You edit several other files, and then use
":edit one.txt" to come back to "one.txt". If you now use `" Vim jumps to the
last line of the file. Using `. takes you to the position where you deleted
the character. Even when you move around in the file `" and `. will take you
-to the remembered position, at least until you make another change or leave
+to the remembered position. At least until you make another change or leave
the file.
@@ -233,8 +233,8 @@ another file and place marks there, these are specific for that file. Thus
each file has its own set of marks, they are local to the file.
So far we were using marks with a lowercase letter. There are also marks
with an uppercase letter. These are global, they can be used from any file.
-For example suppose that we are editing the file "foo.txt". Go to halfway of
-the file ("50%") and place the F mark there (F for foo): >
+For example suppose that we are editing the file "foo.txt". Go to halfway
+down the file ("50%") and place the F mark there (F for foo): >
50%mF
@@ -355,7 +355,7 @@ a sentence to the f register (f for First): >
"fyas
The "yas" command yanks a sentence like before. It's the "f that tells Vim
-the text should be place in the f register. This must come just before the
+the text should be placed in the f register. This must come just before the
yank command.
Now yank three whole lines to the l register (l for line): >
@@ -476,4 +476,4 @@ This protects you from accidentally overwriting another file.
Next chapter: |usr_08.txt| Splitting windows
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_08.txt b/runtime/doc/usr_08.txt
index d1f3fbd49d..559ca6f1ef 100644
--- a/runtime/doc/usr_08.txt
+++ b/runtime/doc/usr_08.txt
@@ -1,4 +1,4 @@
-*usr_08.txt* For Vim version 7.4. Last change: 2014 Jul 06
+*usr_08.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -45,7 +45,7 @@ top one:
+----------------------------------+
What you see here is two windows on the same file. The line with "====" is
-that status line. It displays information about the window above it. (In
+the status line. It displays information about the window above it. (In
practice the status line will be in reverse video.)
The two windows allow you to view two parts of the same file. For example,
you could make the top window show the variable declarations of a program, and
@@ -597,4 +597,4 @@ For more information about tab pages see |tab-page|.
Next chapter: |usr_09.txt| Using the GUI
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_09.txt b/runtime/doc/usr_09.txt
index d68d734b8f..757d13e0f3 100644
--- a/runtime/doc/usr_09.txt
+++ b/runtime/doc/usr_09.txt
@@ -1,13 +1,14 @@
-*usr_09.txt* For Vim version 7.4. Last change: 2006 Apr 24
+*usr_09.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
Using the GUI
-Vim works in an ordinary terminal. GVim can do the same things and a few
-more. The GUI offers menus, a toolbar, scrollbars and other items. This
-chapter is about these extra things that the GUI offers.
+Vim works in an ordinary terminal, while gVim has a Graphical User Interface
+(GUI). It can do the same things and a few more. The GUI offers menus, a
+toolbar, scrollbars and other items. This chapter is about these extra things
+that the GUI offers.
|09.1| Parts of the GUI
|09.2| Using the mouse
@@ -21,7 +22,7 @@ Table of contents: |usr_toc.txt|
==============================================================================
*09.1* Parts of the GUI
-You might have an icon on your desktop that starts gVim. Otherwise, one of
+You might have an icon on your desktop that starts gvim. Otherwise, one of
these commands should do it: >
gvim file.txt
@@ -60,7 +61,7 @@ THE WINDOW TITLE
At the very top is the window title. This is drawn by your window system.
Vim will set the title to show the name of the current file. First comes the
name of the file. Then some special characters and the directory of the file
-in parens. These special character can be present:
+in parens. These special characters can be present:
- The file cannot be modified (e.g., a help file)
+ The file contains changes
@@ -180,14 +181,14 @@ currently highlighted. In Vim this is the Visual area (this assumes you are
using the default option settings). You can paste this selection in another
application without any further action.
For example, in this text select a few words with the mouse. Vim will
-switch to Visual mode and highlight the text. Now start another gVim, without
+switch to Visual mode and highlight the text. Now start another gvim, without
a file name argument, so that it displays an empty window. Click the middle
mouse button. The selected text will be inserted.
The "current selection" will only remain valid until some other text is
-selected. After doing the paste in the other gVim, now select some characters
+selected. After doing the paste in the other gvim, now select some characters
in that window. You will notice that the words that were previously selected
-in the other gVim window are displayed differently. This means that it no
+in the other gvim window are displayed differently. This means that it no
longer is the current selection.
You don't need to select text with the mouse, using the keyboard commands for
@@ -200,10 +201,10 @@ Now for the other place with which text can be exchanged. We call this the
"real clipboard", to avoid confusion. Often both the "current selection" and
the "real clipboard" are called clipboard, you'll have to get used to that.
To put text on the real clipboard, select a few different words in one of
-the gVims you have running. Then use the Edit/Copy menu entry. Now the text
+the gvims you have running. Then use the Edit/Copy menu entry. Now the text
has been copied to the real clipboard. You can't see this, unless you have
-some application that shows the clipboard contents (e.g., KDE's klipper).
- Now select the other gVim, position the cursor somewhere and use the
+some application that shows the clipboard contents (e.g., KDE's Klipper).
+ Now select the other gvim, position the cursor somewhere and use the
Edit/Paste menu. You will see the text from the real clipboard is inserted.
@@ -211,7 +212,7 @@ USING BOTH
This use of both the "current selection" and the "real clipboard" might sound
a bit confusing. But it is very useful. Let's show this with an example.
-Use one gVim with a text file and perform these actions:
+Use one gvim with a text file and perform these actions:
- Select two words in Visual mode.
- Use the Edit/Copy menu to get these words onto the clipboard.
@@ -282,4 +283,4 @@ You can tune the way Select mode works with the 'selectmode' option.
Next chapter: |usr_10.txt| Making big changes
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_10.txt b/runtime/doc/usr_10.txt
index bf7ba18222..3646786052 100644
--- a/runtime/doc/usr_10.txt
+++ b/runtime/doc/usr_10.txt
@@ -1,4 +1,4 @@
-*usr_10.txt* For Vim version 7.4. Last change: 2006 Nov 05
+*usr_10.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -820,4 +820,4 @@ has written. To tell Vim to redraw the screen: >
Next chapter: |usr_11.txt| Recovering from a crash
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_11.txt b/runtime/doc/usr_11.txt
index 1a72c300d7..e5591ac1d1 100644
--- a/runtime/doc/usr_11.txt
+++ b/runtime/doc/usr_11.txt
@@ -1,4 +1,4 @@
-*usr_11.txt* For Vim version 7.4. Last change: 2010 Jul 20
+*usr_11.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -234,7 +234,7 @@ that file, be prepared to redo your last changes.
WHAT TO DO? *swap-exists-choices*
-If dialogs are supported you will be asked to select one of five choices:
+If dialogs are supported you will be asked to select one of six choices:
Swap file ".main.c.swp" already exists! ~
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort, (D)elete it: ~
@@ -283,6 +283,8 @@ machines. Therefore, don't rely on Vim always warning you.
If you really don't want to see this message, you can add the 'A' flag to the
'shortmess' option. But it's very unusual that you need this.
+For programatic access to the swap file, see |swapinfo()|.
+
==============================================================================
*11.4* Further reading
@@ -294,11 +296,9 @@ If you really don't want to see this message, you can add the 'A' flag to the
disk.
'updatetime' Timeout after which the swap file is flushed to disk.
'directory' List of directory names where to store the swap file.
-'maxmem' Limit for memory usage before writing text to the swap file.
-'maxmemtot' Same, but for all files in total.
==============================================================================
Next chapter: |usr_12.txt| Clever tricks
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_12.txt b/runtime/doc/usr_12.txt
index 237abae55f..21efa36a25 100644
--- a/runtime/doc/usr_12.txt
+++ b/runtime/doc/usr_12.txt
@@ -1,4 +1,4 @@
-*usr_12.txt* For Vim version 7.4. Last change: 2007 May 11
+*usr_12.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -237,19 +237,8 @@ simple way: Move the cursor to the word you want to find help on and press >
K
-Vim will run the external "man" program on the word. If the man page is
-found, it is displayed. This uses the normal pager to scroll through the text
-(mostly the "more" program). When you get to the end pressing <Enter> will
-get you back into Vim.
-
-A disadvantage is that you can't see the man page and the text you are working
-on at the same time. There is a trick to make the man page appear in a Vim
-window. First, load the man filetype plugin: >
-
- :runtime! ftplugin/man.vim
-
-Put this command in your vimrc file if you intend to do this often. Now you
-can use the ":Man" command to open a window on a man page: >
+Nvim will run |:Man| on the word. If the man page is found, it is displayed.
+You can also use the |:Man| command to open a window on a man page: >
:Man csh
@@ -267,15 +256,14 @@ window.
To display a man page for the word under the cursor, use this: >
- \K
+ K
-(If you redefined the <Leader>, use it instead of the backslash).
For example, you want to know the return value of "strstr()" while editing
this line:
if ( strstr (input, "aap") == ) ~
-Move the cursor to somewhere on "strstr" and type "\K". A window will open
+Move the cursor to somewhere on "strstr" and type "K". A window will open
to display the man page for strstr().
==============================================================================
@@ -290,7 +278,7 @@ command: >
The line range "%" is used, thus this works on the whole file. The pattern
that the ":substitute" command matches with is "\s\+$". This finds white
space characters (\s), 1 or more of them (\+), before the end-of-line ($).
-Later will be explained how you write patterns like this |usr_27.txt|.
+Later will be explained how you write patterns like this, see |usr_27.txt|.
The "to" part of the substitute command is empty: "//". Thus it replaces
with nothing, effectively deleting the matched white space.
@@ -355,4 +343,4 @@ matches and where they are.
Next chapter: |usr_20.txt| Typing command-line commands quickly
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_20.txt b/runtime/doc/usr_20.txt
index 5f0a660187..8eee7aedb7 100644
--- a/runtime/doc/usr_20.txt
+++ b/runtime/doc/usr_20.txt
@@ -1,4 +1,4 @@
-*usr_20.txt* For Vim version 7.4. Last change: 2006 Apr 24
+*usr_20.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -381,4 +381,4 @@ there can be only one.
Next chapter: |usr_21.txt| Go away and come back
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_21.txt b/runtime/doc/usr_21.txt
index f99c3263d0..99a78e7b05 100644
--- a/runtime/doc/usr_21.txt
+++ b/runtime/doc/usr_21.txt
@@ -1,4 +1,4 @@
-*usr_21.txt* For Vim version 7.4. Last change: 2012 Nov 02
+*usr_21.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -488,4 +488,4 @@ For more details see |modeline|.
Next chapter: |usr_22.txt| Finding the file to edit
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_22.txt b/runtime/doc/usr_22.txt
index cff8e9db1e..96fc02aaa5 100644
--- a/runtime/doc/usr_22.txt
+++ b/runtime/doc/usr_22.txt
@@ -1,4 +1,4 @@
-*usr_22.txt* For Vim version 7.4. Last change: 2012 Nov 15
+*usr_22.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -93,7 +93,7 @@ browser. This is what you get: >
o................Browsing with a Horizontal Split...........|netrw-o|
p................Use Preview Window.........................|netrw-p|
P................Edit in Previous Window....................|netrw-p|
- q................Listing Bookmarks and History..............|netrw-q|
+ q................Listing Bookmarks and History..............|netrw-qb|
r................Reversing Sorting Order....................|netrw-r|
< (etc)
@@ -397,4 +397,4 @@ can't be editing nothing!
Next chapter: |usr_23.txt| Editing other files
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_23.txt b/runtime/doc/usr_23.txt
index 4761203512..810da05ff8 100644
--- a/runtime/doc/usr_23.txt
+++ b/runtime/doc/usr_23.txt
@@ -1,4 +1,4 @@
-*usr_23.txt* For Vim version 7.4. Last change: 2006 Apr 24
+*usr_23.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -256,4 +256,4 @@ decompression. You might need to install the programs first.
Next chapter: |usr_24.txt| Inserting quickly
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_24.txt b/runtime/doc/usr_24.txt
index ba9d083fe0..3c4ff6f55e 100644
--- a/runtime/doc/usr_24.txt
+++ b/runtime/doc/usr_24.txt
@@ -1,4 +1,4 @@
-*usr_24.txt* For Vim version 7.4. Last change: 2006 Jul 23
+*usr_24.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -538,8 +538,8 @@ a 16 bit and a 32 bit number (e.g., for a Unicode character): >
*24.9* Digraphs
Some characters are not on the keyboard. For example, the copyright character
-(ฉ). To type these characters in Vim, you use digraphs, where two characters
-represent one. To enter a ฉ, for example, you press three keys: >
+(ยฉ). To type these characters in Vim, you use digraphs, where two characters
+represent one. To enter a ยฉ, for example, you press three keys: >
CTRL-K Co
@@ -549,12 +549,12 @@ To find out what digraphs are available, use the following command: >
Vim will display the digraph table. Here are three lines of it:
- AC ~_ 159 NS | 160 !I ก 161 Ct ข 162 Pd ฃ 163 Cu ค 164 Ye ฅ 165 ~
- BB ฆ 166 SE ง 167 ': จ 168 Co ฉ 169 -a ช 170 << ซ 171 NO ฌ 172 ~
- -- ญ 173 Rg ฎ 174 'm ฏ 175 DG ฐ 176 +- ฑ 177 2S ฒ 178 3S ณ 179 ~
+ AC ~_ 159 NS | 160 !I ยก 161 Ct ยข 162 Pd ยฃ 163 Cu ยค 164 Ye ยฅ 165 ~
+ BB ยฆ 166 SE ยง 167 ': ยจ 168 Co ยฉ 169 -a ยช 170 << ยซ 171 NO ยฌ 172 ~
+ -- ยญ 173 Rg ยฎ 174 'm ยฏ 175 DG ยฐ 176 +- ยฑ 177 2S ยฒ 178 3S ยณ 179 ~
This shows, for example, that the digraph you get by typing CTRL-K Pd is the
-character (ฃ). This is character number 163 (decimal).
+character (ยฃ). This is character number 163 (decimal).
Pd is short for Pound. Most digraphs are selected to give you a hint about
the character they will produce. If you look through the list you will
understand the logic.
@@ -569,9 +569,9 @@ that combination. Thus CTRL-K dP also works. Since there is no digraph for
You can define your own digraphs. Example: >
- :digraph a" ไ
+ :digraph a" รค
-This defines that CTRL-K a" inserts an ไ character. You can also specify the
+This defines that CTRL-K a" inserts an รค character. You can also specify the
character with a decimal number. This defines the same digraph: >
:digraph a" 228
@@ -603,4 +603,4 @@ This deletes up to the third word into register g.
Next chapter: |usr_25.txt| Editing formatted text
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_25.txt b/runtime/doc/usr_25.txt
index 24420353dd..3a58af6412 100644
--- a/runtime/doc/usr_25.txt
+++ b/runtime/doc/usr_25.txt
@@ -1,4 +1,4 @@
-*usr_25.txt* For Vim version 7.4. Last change: 2016 Mar 28
+*usr_25.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -579,4 +579,4 @@ The "gR" command uses Virtual Replace mode. This preserves the layout:
Next chapter: |usr_26.txt| Repeating
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_26.txt b/runtime/doc/usr_26.txt
index e381a1df12..4e8f1979f4 100644
--- a/runtime/doc/usr_26.txt
+++ b/runtime/doc/usr_26.txt
@@ -1,4 +1,4 @@
-*usr_26.txt* For Vim version 7.4. Last change: 2006 Apr 24
+*usr_26.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -207,4 +207,4 @@ start all over, use the "-W" argument. It overwrites any existing file.
Next chapter: |usr_27.txt| Search commands and patterns
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_27.txt b/runtime/doc/usr_27.txt
index d837610698..cd01308c6e 100644
--- a/runtime/doc/usr_27.txt
+++ b/runtime/doc/usr_27.txt
@@ -1,4 +1,4 @@
-*usr_27.txt* For Vim version 7.4. Last change: 2010 Mar 28
+*usr_27.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -225,9 +225,9 @@ specify a line offset, this can cause trouble. For example: >
/const/-2
This finds the next word "const" and then moves two lines up. If you
-use "n" to search again, Vim could start at the current position and find the same
-"const" match. Then using the offset again, you would be back where you started.
-You would be stuck!
+use "n" to search again, Vim could start at the current position and find the
+same "const" match. Then using the offset again, you would be back where you
+started. You would be stuck!
It could be worse: Suppose there is another match with "const" in the next
line. Then repeating the forward search would find this match and move two
lines up. Thus you would actually move the cursor back!
@@ -560,4 +560,4 @@ and "\w" for "[0-9A-Za-z_]".
Next chapter: |usr_28.txt| Folding
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_28.txt b/runtime/doc/usr_28.txt
index d29b384437..86aa20597e 100644
--- a/runtime/doc/usr_28.txt
+++ b/runtime/doc/usr_28.txt
@@ -1,4 +1,4 @@
-*usr_28.txt* For Vim version 7.4. Last change: 2008 Jun 14
+*usr_28.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -423,4 +423,4 @@ the defined folds. Then you can delete or add folds manually.
Next chapter: |usr_29.txt| Moving through programs
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_29.txt b/runtime/doc/usr_29.txt
index 9eb66ce83c..3381d1870c 100644
--- a/runtime/doc/usr_29.txt
+++ b/runtime/doc/usr_29.txt
@@ -1,4 +1,4 @@
-*usr_29.txt* For Vim version 7.4. Last change: 2016 Feb 27
+*usr_29.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -608,4 +608,4 @@ for the identifier. Example (cursor on "idx"):
Next chapter: |usr_30.txt| Editing programs
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_30.txt b/runtime/doc/usr_30.txt
index dbac440ecc..b729c7a263 100644
--- a/runtime/doc/usr_30.txt
+++ b/runtime/doc/usr_30.txt
@@ -1,4 +1,4 @@
-*usr_30.txt* For Vim version 7.4. Last change: 2007 Nov 10
+*usr_30.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -640,4 +640,4 @@ For more details see |format-comments|.
Next chapter: |usr_31.txt| Exploiting the GUI
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_31.txt b/runtime/doc/usr_31.txt
index 7bcf4d428a..fb9a4fd223 100644
--- a/runtime/doc/usr_31.txt
+++ b/runtime/doc/usr_31.txt
@@ -1,4 +1,4 @@
-*usr_31.txt* For Vim version 7.4. Last change: 2007 May 08
+*usr_31.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -269,4 +269,4 @@ another font size, for example.
Next chapter: |usr_32.txt| The undo tree
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_32.txt b/runtime/doc/usr_32.txt
index fd58f2d517..8b489ea1e0 100644
--- a/runtime/doc/usr_32.txt
+++ b/runtime/doc/usr_32.txt
@@ -1,4 +1,4 @@
-*usr_32.txt* For Vim version 7.4. Last change: 2010 Jul 20
+*usr_32.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -177,4 +177,4 @@ use the |undotree()| function. To see what it returns: >
Next chapter: |usr_40.txt| Make new commands
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_40.txt b/runtime/doc/usr_40.txt
index d3cc792c59..e5d55fb857 100644
--- a/runtime/doc/usr_40.txt
+++ b/runtime/doc/usr_40.txt
@@ -1,4 +1,4 @@
-*usr_40.txt* For Vim version 7.4. Last change: 2013 Aug 05
+*usr_40.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -654,4 +654,4 @@ To set it back to the normal behavior, make 'eventignore' empty: >
Next chapter: |usr_41.txt| Write a Vim script
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_41.txt b/runtime/doc/usr_41.txt
index 4d3ad49f1f..4adb69aaee 100644
--- a/runtime/doc/usr_41.txt
+++ b/runtime/doc/usr_41.txt
@@ -1,4 +1,4 @@
-*usr_41.txt* For Vim version 7.4. Last change: 2016 Apr 12
+*usr_41.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -95,7 +95,7 @@ Then there is the ":let i += 1" command. This does the same thing as
to the same variable.
The example was given to explain the commands, but would you really want to
-make such a loop it can be written much more compact: >
+make such a loop, it can be written much more compact: >
:for i in range(1, 4)
: echo "count is" i
@@ -592,6 +592,7 @@ String manipulation: *string-functions*
match() position where a pattern matches in a string
matchend() position where a pattern match ends in a string
matchstr() match of a pattern in a string
+ matchstrpos() match and positions of a pattern in a string
matchlist() like matchstr() and also return submatches
stridx() first index of a short string in a long string
strridx() last index of a short string in a long string
@@ -601,13 +602,16 @@ String manipulation: *string-functions*
strdisplaywidth() size of string when displayed, deals with tabs
substitute() substitute a pattern match with a string
submatch() get a specific match in ":s" and substitute()
- strpart() get part of a string
+ strpart() get part of a string using byte index
+ strcharpart() get part of a string using char index
+ strgetchar() get character from a string using char index
expand() expand special keywords
iconv() convert text from one encoding to another
byteidx() byte index of a character in a string
byteidxcomp() like byteidx() but count composing characters
repeat() repeat a string multiple times
eval() evaluate a string expression
+ execute() execute an Ex command and get the output
List manipulation: *list-functions*
get() get an item without error for wrong index
@@ -688,6 +692,7 @@ Other computation: *bitwise-function*
Variables: *var-functions*
type() type of a variable
islocked() check if a variable is locked
+ funcref() get a Funcref for a function reference
function() get a Funcref for a function name
getbufvar() get a variable value from a specific buffer
setbufvar() set a variable in a specific buffer
@@ -731,11 +736,14 @@ Working with text in the current buffer: *text-functions*
searchpair() find the other end of a start/skip/end
searchpairpos() find the other end of a start/skip/end
searchdecl() search for the declaration of a name
+ getcharsearch() return character search information
+ setcharsearch() set character search information
*system-functions* *file-functions*
System functions and manipulation of files:
glob() expand wildcards
globpath() expand wildcards in a number of directories
+ glob2regpat() convert a glob pattern into a search pattern
findfile() find a file in a list of directories
finddir() find a directory in a list of directories
resolve() find out where a shortcut points to
@@ -747,6 +755,7 @@ System functions and manipulation of files:
filereadable() check if a file can be read
filewritable() check if a file can be written to
getfperm() get the permissions of a file
+ setfperm() set the permissions of a file
getftype() get the kind of a file
isdirectory() check if a directory exists
getfsize() get the size of a file
@@ -785,9 +794,18 @@ Buffers, windows and the argument list:
tabpagenr() get the number of a tab page
tabpagewinnr() like winnr() for a specified tab page
winnr() get the window number for the current window
+ bufwinid() get the window ID of a specific buffer
bufwinnr() get the window number of a specific buffer
winbufnr() get the buffer number of a specific window
getbufline() get a list of lines from the specified buffer
+ win_findbuf() find windows containing a buffer
+ win_getid() get window ID of a window
+ win_gotoid() go to window with ID
+ win_id2tabwin() get tab and window nr from window ID
+ win_id2win() get window nr from window ID
+ getbufinfo() get a list with buffer information
+ gettabinfo() get a list with tab page information
+ getwininfo() get a list with window information
Command line: *command-line-functions*
getcmdline() get the current command line
@@ -795,6 +813,7 @@ Command line: *command-line-functions*
setcmdpos() set position of the cursor in the command line
getcmdtype() return the current command-line type
getcmdwintype() return the current command-line window type
+ getcompletion() list of command-line completion matches
Quickfix and location lists: *quickfix-functions*
getqflist() list of quickfix errors
@@ -863,11 +882,15 @@ Interactive: *interactive-functions*
GUI: *gui-functions*
getfontname() get name of current font being used
- getwinposx() X position of the GUI Vim window
- getwinposy() Y position of the GUI Vim window
+ getwinpos() position of the Vim window
+ getwinposx() X position of the Vim window
+ getwinposy() Y position of the Vim window
+ balloon_show() set the balloon content
+ balloon_split() split a message for a balloon
Vim server: *server-functions*
serverlist() return the list of server names
+ remote_startserver() run a server
remote_send() send command characters to a Vim server
remote_expr() evaluate an expression in a Vim server
server2client() send a reply to a client of a Vim server
@@ -879,6 +902,7 @@ Vim server: *server-functions*
Window size and position: *window-size-functions*
winheight() get height of a specific window
winwidth() get width of a specific window
+ win_screenpos() get screen position of a window
winrestcmd() return command to restore window sizes
winsaveview() get view of current window
winrestview() restore saved view of current window
@@ -892,12 +916,18 @@ Mappings: *mapping-functions*
Testing: *test-functions*
assert_equal() assert that two expressions values are equal
assert_notequal() assert that two expressions values are not equal
+ assert_inrange() assert that an expression is inside a range
assert_match() assert that a pattern matches the value
assert_notmatch() assert that a pattern does not match the value
assert_false() assert that an expression is false
assert_true() assert that an expression is true
assert_exception() assert that a command throws an exception
- assert_fails() assert that a function call fails
+ assert_beeps() assert that a command beeps
+ assert_fails() assert that a command fails
+
+Timers: *timer-functions*
+ timer_start() create a timer
+ timer_stop() stop a timer
Various: *various-functions*
mode() get current editing mode
@@ -922,12 +952,15 @@ Various: *various-functions*
shiftwidth() effective value of 'shiftwidth'
+ wordcount() get byte/word/char count of buffer
+
taglist() get list of matching tags
tagfiles() get a list of tags files
+ luaeval() evaluate Lua expression
py3eval() evaluate Python expression (|+python3|)
pyeval() evaluate Python expression (|+python|)
- wordcount() get byte/word/char count of buffer
+ pyxeval() evaluate |python_x| expression
==============================================================================
*41.7* Defining a function
@@ -1395,9 +1428,9 @@ Now we can instantiate a Dutch translation object: >
And a German translator: >
:let uk2de = copy(transdict)
- :let uk2de.words = {'one': 'ein', 'two': 'zwei', 'three': 'drei'}
+ :let uk2de.words = {'one': 'eins', 'two': 'zwei', 'three': 'drei'}
:echo uk2de.translate('three one')
-< drei ein ~
+< drei eins ~
You see that the copy() function is used to make a copy of the "transdict"
Dictionary and then the copy is changed to add the words. The original
@@ -1515,7 +1548,7 @@ WHITE SPACE
Blank lines are allowed and ignored.
Leading whitespace characters (blanks and TABs) are always ignored. The
-whitespaces between parameters (e.g. between the 'set' and the 'cpoptions' in
+whitespaces between parameters (e.g. between the "set" and the "cpoptions" in
the example below) are reduced to one blank character and plays the role of a
separator, the whitespaces after the last (visible) character may or may not
be ignored depending on the situation, see below.
@@ -2198,8 +2231,8 @@ plugin for the mail filetype: >
endif
Two global variables are used:
-no_plugin_maps disables mappings for all filetype plugins
-no_mail_maps disables mappings for a specific filetype
+|no_plugin_maps| disables mappings for all filetype plugins
+|no_mail_maps| disables mappings for the "mail" filetype
USER COMMANDS
@@ -2477,11 +2510,8 @@ Vim scripts can be used on any system. There might not be a tar or gzip
command. If you want to pack files together and/or compress them the "zip"
utility is recommended.
-For utmost portability use Vim itself to pack scripts together. This can be
-done with the Vimball utility. See |vimball|.
-
==============================================================================
Next chapter: |usr_42.txt| Add new menus
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_42.txt b/runtime/doc/usr_42.txt
index c8eac5f062..501f02e745 100644
--- a/runtime/doc/usr_42.txt
+++ b/runtime/doc/usr_42.txt
@@ -1,4 +1,4 @@
-*usr_42.txt* For Vim version 7.4. Last change: 2008 May 05
+*usr_42.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -355,4 +355,4 @@ is...
Next chapter: |usr_43.txt| Using filetypes
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_43.txt b/runtime/doc/usr_43.txt
index bab446af3c..04e9f9c000 100644
--- a/runtime/doc/usr_43.txt
+++ b/runtime/doc/usr_43.txt
@@ -1,4 +1,4 @@
-*usr_43.txt* For Vim version 7.4. Last change: 2015 Oct 23
+*usr_43.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -175,4 +175,4 @@ and sources a script or executes a function to check the contents of the file.
Next chapter: |usr_44.txt| Your own syntax highlighted
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_44.txt b/runtime/doc/usr_44.txt
index a91f92ff4e..722c3de26c 100644
--- a/runtime/doc/usr_44.txt
+++ b/runtime/doc/usr_44.txt
@@ -1,4 +1,4 @@
-*usr_44.txt* For Vim version 7.4. Last change: 2008 Dec 28
+*usr_44.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -686,7 +686,7 @@ that included files do this too, you might have to reset "b:current_syntax" if
you include two files.
If you want your syntax file to work with Vim 5.x, add a check for v:version.
-See yacc.vim for an example.
+Find an syntax file in the Vim 7.2 distribution for an example.
Do not include anything that is a user preference. Don't set 'tabstop',
'expandtab', etc. These belong in a filetype plugin.
@@ -716,4 +716,4 @@ up scrolling backwards and CTRL-L.
Next chapter: |usr_45.txt| Select your language
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_45.txt b/runtime/doc/usr_45.txt
index 34b607cbd2..be33f0be6d 100644
--- a/runtime/doc/usr_45.txt
+++ b/runtime/doc/usr_45.txt
@@ -1,4 +1,4 @@
-*usr_45.txt* For Vim version 7.4. Last change: 2008 Nov 15
+*usr_45.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -203,8 +203,7 @@ USING UNICODE IN A UNICODE TERMINAL
There are terminals that support Unicode directly. The standard xterm that
comes with XFree86 is one of them. Let's use that as an example.
- First of all, the xterm must have been compiled with Unicode support. See
-|UTF8-xterm| how to check that and how to compile it when needed.
+ First of all, the xterm must have been compiled with Unicode support.
Start the xterm with the "-u8" argument. You might also need so specify a
font. Example: >
@@ -392,4 +391,4 @@ Don't type the spaces. See |i_CTRL-V_digit| for the details.
==============================================================================
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_toc.txt b/runtime/doc/usr_toc.txt
index e021b806e3..148dd161ac 100644
--- a/runtime/doc/usr_toc.txt
+++ b/runtime/doc/usr_toc.txt
@@ -1,4 +1,4 @@
-*usr_toc.txt* For Vim version 7.4. Last change: 2016 Mar 25
+*usr_toc.txt* Nvim
VIM USER MANUAL - by Bram Moolenaar
@@ -48,9 +48,8 @@ Tuning Vim
Reference manual
|reference_toc| More detailed information for all commands
-The user manual is available as a single, ready to print HTML and PDF file
-here:
- http://vimdoc.sf.net
+The user manual is online:
+ https://neovim.io/doc/user
==============================================================================
Getting Started ~
@@ -336,4 +335,4 @@ Make Vim work as you like it.
==============================================================================
-Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/various.txt b/runtime/doc/various.txt
index eb813866da..dbbafd1576 100644
--- a/runtime/doc/various.txt
+++ b/runtime/doc/various.txt
@@ -1,4 +1,4 @@
-*various.txt* For Vim version 7.4. Last change: 2016 Mar 20
+*various.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -6,8 +6,7 @@
Various commands *various*
-1. Various commands |various-cmds|
-2. Using Vim like less or more |less|
+ Type |gO| to see the table of contents.
==============================================================================
1. Various commands *various-cmds*
@@ -38,23 +37,34 @@ CTRL-L Clear and redraw the screen. The redraw may happen
<
:as[cii] or *ga* *:as* *:ascii*
ga Print the ascii value of the character under the
- cursor in decimal, hexadecimal and octal. For
- example, when the cursor is on a 'R':
+ cursor in decimal, hexadecimal and octal.
+ Mnemonic: Get Ascii value.
+
+ For example, when the cursor is on a 'R':
<R> 82, Hex 52, Octal 122 ~
When the character is a non-standard ASCII character,
but printable according to the 'isprint' option, the
- non-printable version is also given. When the
- character is larger than 127, the <M-x> form is also
- printed. For example:
+ non-printable version is also given.
+
+ When the character is larger than 127, the <M-x> form
+ is also printed. For example:
<~A> <M-^A> 129, Hex 81, Octal 201 ~
<p> <|~> <M-~> 254, Hex fe, Octal 376 ~
(where <p> is a special character)
+
The <Nul> character in a file is stored internally as
<NL>, but it will be shown as:
<^@> 0, Hex 00, Octal 000 ~
+
If the character has composing characters these are
also shown. The value of 'maxcombine' doesn't matter.
- Mnemonic: Get ASCII value.
+
+ If the character can be inserted as a digraph, also
+ output the two characters that can be used to create
+ the character:
+ <รถ> 246, Hex 00f6, Oct 366, Digr o: ~
+ This shows you can type CTRL-K o : to insert รถ.
+
*g8*
g8 Print the hex values of the bytes used in the
@@ -85,6 +95,8 @@ g8 Print the hex values of the bytes used in the
on paper see |:hardcopy|. In the GUI you can use the
File.Print menu entry.
See |ex-flags| for [flags].
+ The |:filter| command can be used to only show lines
+ matching a pattern.
:[range]p[rint] {count} [flags]
Print {count} lines, starting with [range] (default
@@ -101,8 +113,7 @@ g8 Print the hex values of the bytes used in the
*:nu* *:number*
:[range]nu[mber] [count] [flags]
Same as :print, but precede each line with its line
- number. (See also 'highlight' and 'numberwidth'
- option).
+ number. (See also |hl-LineNr| and 'numberwidth').
See |ex-flags| for [flags].
*:#*
@@ -204,27 +215,22 @@ g8 Print the hex values of the bytes used in the
":normal" command without a range.
*:sh* *:shell* *E371* *E360*
-:sh[ell] Removed. |vim-differences| {Nvim}
+:sh[ell] Removed. |vim-differences|
*:terminal* *:te*
-:te[rminal][!] {cmd} Spawns {cmd} using the current value of 'shell' and
- 'shellcmdflag' in a new terminal buffer. This is
- equivalent to: >
+:te[rminal][!] [{cmd}] Run {cmd} in a non-interactive 'shell' in a new
+ |terminal-emulator| buffer. Without {cmd}, start an
+ interactive 'shell'.
- :enew
- :call termopen('{cmd}')
- :startinsert
-<
- If no {cmd} is given, 'shellcmdflag' will not be sent
- to |termopen()|.
+ Type |i| to enter |Terminal-mode|, then keys are sent to
+ the job running in the terminal. Type <C-\><C-N> to
+ leave Terminal-mode. |CTRL-\_CTRL-N|
- Like |:enew|, it will fail if the current buffer is
- modified, but can be forced with "!". See |termopen()|
- and |terminal-emulator|.
+ Fails if changes have been made to the current buffer,
+ unless 'hidden' is set.
- To switch to terminal mode automatically:
->
- autocmd BufEnter term://* startinsert
+ To enter |Terminal-mode| automatically: >
+ autocmd TermOpen * startinsert
<
*:!cmd* *:!* *E34*
:!{cmd} Execute {cmd} with 'shell'. See also |:terminal|.
@@ -255,14 +261,18 @@ g8 Print the hex values of the bytes used in the
backslashes are before the newline, only one is
removed.
- On Unix the command normally runs in a non-interactive
- shell. If you want an interactive shell to be used
- (to use aliases) set 'shellcmdflag' to "-ic".
- For Win32 also see |:!start|.
+ The command runs in a non-interactive shell connected
+ to a pipe (not a terminal). Use |:terminal| to run an
+ interactive shell connected to a terminal.
After the command has been executed, the timestamp and
size of the current file is checked |timestamp|.
+ If the command produces too much output some lines may
+ be skipped so the command can execute quickly. No
+ data is lost, this only affects the display. The last
+ few lines are always displayed (never skipped).
+
Vim redraws the screen after the command is finished,
because it may have printed any text. This requires a
hit-enter prompt, so that you can read any messages.
@@ -306,13 +316,12 @@ N *+cindent* |'cindent'|, C indenting
N *+clientserver* Unix and Win32: Remote invocation |clientserver|
*+clipboard* |clipboard| support
N *+cmdline_compl* command line completion |cmdline-completion|
-N *+cmdline_hist* command line history |cmdline-history|
+S *+cmdline_hist* command line history |cmdline-history|
N *+cmdline_info* |'showcmd'| and |'ruler'|
N *+comments* |'comments'| support
B *+conceal* "conceal" support, see |conceal| |:syn-conceal| etc.
B *+cscope* |cscope| support
m *+cursorbind* |'cursorbind'| support
-m *+cursorshape* |termcap-cursor-shape| support
m *+debug* Compiled for debugging.
N *+dialog_gui* Support for |:confirm| with GUI dialog.
N *+dialog_con* Support for |:confirm| with console dialog.
@@ -330,8 +339,9 @@ N *+gettext* message translations |multi-lang|
*+iconv* Compiled with the |iconv()| function
*+iconv/dyn* Likewise |iconv-dynamic| |/dyn|
N *+insert_expand* |insert_expand| Insert mode completion
-N *+jumplist* |jumplist|
+S *+jumplist* |jumplist|
B *+keymap* |'keymap'|
+N *+lambda* |lambda| and |closure|
B *+langmap* |'langmap'|
N *+libcall* |libcall()|
N *+linebreak* |'linebreak'|, |'breakat'| and |'showbreak'|
@@ -347,6 +357,7 @@ N *+mouseshape* |'mouseshape'|
N *+multi_byte* 16 and 32 bit characters |multibyte|
*+multi_byte_ime* Win32 input method for multibyte chars |multibyte-ime|
N *+multi_lang* non-English language support |multi-lang|
+ *+num64* 64-bit Number support |Number|
N *+path_extra* Up/downwards search in 'path' and 'tags'
N *+persistent_undo* Persistent undo |undo-persistence|
*+postscript* |:hardcopy| writes a PostScript file
@@ -367,31 +378,29 @@ N *+statusline* Options 'statusline', 'rulerformat' and special
formats of 'titlestring' and 'iconstring'
N *+syntax* Syntax highlighting |syntax|
N *+tablineat* 'tabline' option recognizing %@Func@ items.
-N *+tag_binary* binary searching in tags file |tag-binary-search|
+T *+tag_binary* binary searching in tags file |tag-binary-search|
N *+tag_old_static* old method for static tags |tag-old-static|
m *+tag_any_white* any white space allowed in tags file |tag-any-white|
B *+termguicolors* 24-bit color in xterm-compatible terminals support
- *+terminfo* uses |terminfo| instead of termcap
-N *+termresponse* support for |t_RV| and |v:termresponse|
+N *+termresponse* support for t_RV and |v:termresponse|
N *+textobjects* |text-objects| selection
- *+tgetent* non-Unix only: able to use external termcap
N *+timers* the |timer_start()| function
N *+title* Setting the window 'title' and 'icon'
N *+toolbar* |gui-toolbar|
N *+user_commands* User-defined commands. |user-commands|
-N *+vertsplit* Vertically split windows |:vsplit|
+ *+vertsplit* Vertically split windows |:vsplit|
N *+virtualedit* |'virtualedit'|
S *+visual* Visual mode |Visual-mode| Always enabled since 7.4.200.
N *+visualextra* extra Visual mode commands |blockwise-operators|
N *+vreplace* |gR| and |gr|
+ *+vtp* on MS-Windows console: support for 'termguicolors'
N *+wildignore* |'wildignore'|
N *+wildmenu* |'wildmenu'|
-S *+windows* more than one window
+ *+windows* more than one window
m *+writebackup* |'writebackup'| is default on
m *+xim* X input method |xim|
*+xfontset* X fontset support |xfontset|
*+xpm* pixmap support
-m *+xpm_w32* Win32 GUI only: pixmap support |w32-xpm-support|
*/dyn* *E370* *E448*
To some of the features "/dyn" is added when the
@@ -410,14 +419,17 @@ m *+xpm_w32* Win32 GUI only: pixmap support |w32-xpm-support|
shown on the screen. When [!] is included, an
existing file is overwritten. When [!] is omitted,
and {file} exists, this command fails.
+
Only one ":redir" can be active at a time. Calls to
":redir" will close any active redirection before
- starting redirection to the new target.
+ starting redirection to the new target. For recursive
+ use check out |execute()|.
+
To stop the messages and commands from being echoed to
the screen, put the commands in a function and call it
with ":silent call Function()".
Alternatives are the 'verbosefile' option or
- |capture()| function, these can be used in combination
+ |execute()| function, these can be used in combination
with ":redir".
:redi[r] >> {file} Redirect messages to file {file}. Append if {file}
@@ -450,12 +462,37 @@ m *+xpm_w32* Win32 GUI only: pixmap support |w32-xpm-support|
redirection starts, if the variable is removed or
locked or the variable type is changed, then further
command output messages will cause errors.
+ To get the output of one command the |execute()|
+ function can be used.
:redi[r] =>> {var} Append messages to an existing variable. Only string
variables can be used.
:redi[r] END End redirecting messages.
+ *:filt* *:filter*
+:filt[er][!] {pat} {command}
+:filt[er][!] /{pat}/ {command}
+ Restrict the output of {command} to lines matching
+ with {pat}. For example, to list only xml files: >
+ :filter /\.xml$/ oldfiles
+< If the [!] is given, restrict the output of {command}
+ to lines that do NOT match {pat}.
+
+ {pat} is a Vim search pattern. Instead of enclosing
+ it in / any non-ID character (see |'isident'|) can be
+ used, so long as it does not appear in {pat}. Without
+ the enclosing character the pattern cannot include the
+ bar character.
+
+ The pattern is matched against the relevant part of
+ the output, not necessarily the whole line. Only some
+ commands support filtering, try it out to check if it
+ works.
+
+ Only normal messages are filtered, error messages are
+ not.
+
*:sil* *:silent* *:silent!*
:sil[ent][!] {command} Execute {command} silently. Normal messages will not
be given or added to the message history.
@@ -481,14 +518,9 @@ m *+xpm_w32* Win32 GUI only: pixmap support |w32-xpm-support|
:silent! /^begin
:if v:errmsg != ""
: ... pattern was not found
-< ":silent" will also avoid the hit-enter prompt. When
- using this for an external command, this may cause the
- screen to be messed up. Use |CTRL-L| to clean it up
- then.
- ":silent menu ..." defines a menu that will not echo a
- Command-line command. The command will still produce
- messages though. Use ":silent" in the command itself
- to avoid that: ":silent menu .... :silent command".
+< ":silent" also skips the hit-enter prompt.
+ Dialogs that prompt for user input (|confirm()|,
+ 'swapfile', โ€ฆ) are never silent.
*:uns* *:unsilent*
:uns[ilent] {command} Execute {command} not silently. Only makes a
@@ -562,6 +594,13 @@ which it was defined is reported.
the keyword. Only works when the highlighted text is
not more than one line.
+ *gO*
+gO Show a filetype-specific, navigable "outline" of the
+ current buffer. For example, in a |help| buffer this
+ shows the table of contents.
+
+ Currently works in |help| and |:Man| buffers.
+
[N]gs *gs* *:sl* *:sleep*
:[N]sl[eep] [N] [m] Do nothing for [N] seconds. When [m] is included,
sleep for [N] milliseconds. The count for "gs" always
@@ -600,4 +639,4 @@ LessInitFunc in your vimrc, for example: >
endfunc
<
- vim:tw=78:ts=8:ft=help:norl:
+ vim:noet:tw=78:ts=8:ft=help:norl:
diff --git a/runtime/doc/vi_diff.txt b/runtime/doc/vi_diff.txt
index 54ef8fecb2..d908f484c6 100644
--- a/runtime/doc/vi_diff.txt
+++ b/runtime/doc/vi_diff.txt
@@ -1,4 +1,4 @@
-*vi_diff.txt* For Vim version 7.4. Last change: 2016 Feb 12
+*vi_diff.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -6,8 +6,7 @@
Differences between Vim and Vi *vi-differences*
-1. Limits |limits|
-2. The most interesting additions |vim-additions|
+ Type |gO| to see the table of contents.
==============================================================================
1. Limits *limits*
@@ -39,18 +38,6 @@ Information for undo and text in registers is kept in memory, thus when making
undo levels and the text that can be kept in registers. Other things are also
kept in memory: Command-line history, error messages for Quickfix mode, etc.
-Memory usage limits
--------------------
-
-The option 'maxmem' ('mm') is used to set the maximum memory used for one
-buffer (in kilobytes). 'maxmemtot' is used to set the maximum memory used for
-all buffers (in kilobytes). The defaults depend on the system used.
-These are not hard limits, but tell Vim when to move text into a swap file.
-If you don't like Vim to swap to a file, set 'maxmem' and 'maxmemtot' to a
-very large value. The swap file will then only be used for recovery. If you
-don't want a swap file at all, set 'updatecount' to 0, or use the "-n"
-argument when starting Vim.
-
==============================================================================
2. The most interesting additions *vim-additions*
@@ -60,7 +47,7 @@ Support for different systems.
- Windows (XP SP 2 or greater)
- OS X
-Multi level undo. |undo|
+Multi level persistent undo. |undo|
'u' goes backward in time, 'CTRL-R' goes forward again. Set option
'undolevels' to the number of changes to be remembered (default 1000).
Set 'undolevels' to 0 for a Vi-compatible one level undo. Set it to
@@ -71,6 +58,9 @@ Multi level undo. |undo|
create a branch in the undo tree. This means you can go back to any
state of the text, there is no risk of a change causing text to be
lost forever. |undo-tree|
+ The undo information is stored in a file when the 'undofile' option is
+ set. This means you can exit Vim, start Vim on a previously edited
+ file and undo changes that were made before exiting Vim.
Graphical User Interface (GUI). |gui|
Included support for GUI: menu's, mouse, scrollbars, etc. You can
@@ -124,6 +114,13 @@ Plugins. |add-plugin|
right directory. That's an easy way to start using Vim scripts
written by others. Plugins can be for all kind of files, or
specifically for a filetype.
+ Packages make this even easier. |packages|
+
+Asynchronous communication and timers. |job-control| |timer|
+ Vim can exchange messages with other processes in the background.
+ Vim can start a job, communicate with it and stop it. |job-control|
+ Timers can fire once or repeatedly and invoke a function to do any
+ work. |timer|
Repeat a series of commands. |q|
"q{c}" starts recording typed characters into named register {c}.
@@ -325,7 +322,7 @@ Scripts and Expressions. |expression|
Debugging and profiling are supported. |debug-scripts| |profile|
If this is not enough, an interface is provided to |Python|.
-Viminfo. |viminfo-file|
+Viminfo.
The command-line history, marks and registers can be stored in a file
that is read on startup. This can be used to repeat a search command
or command-line command after exiting and restarting Vim. It is also
@@ -366,4 +363,4 @@ Move cursor beyond lines.
and figures easily.
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/vim_diff.txt b/runtime/doc/vim_diff.txt
index e536ea873a..db856ceb65 100644
--- a/runtime/doc/vim_diff.txt
+++ b/runtime/doc/vim_diff.txt
@@ -1,4 +1,4 @@
-*vim_diff.txt* For Nvim. {Nvim}
+*vim_diff.txt* Nvim
NVIM REFERENCE MANUAL
@@ -6,26 +6,18 @@
Differences between Nvim and Vim *vim-differences*
-Throughout the help files, differences between Nvim and Vim are indicated via
-the "{Nvim}" tag. This document is a complete and centralized list of all
-these differences.
-
-1. Configuration |nvim-configuration|
-2. Defaults |nvim-defaults|
-3. New features |nvim-features|
-4. Changed features |nvim-features-changed|
-5. Missing legacy features |nvim-features-missing|
-6. Removed features |nvim-features-removed|
+Nvim differs from Vim in many ways, big and small. This document is
+a complete and centralized reference of those differences.
+ Type |gO| to see the table of contents.
==============================================================================
1. Configuration *nvim-configuration*
-- Use `$XDG_CONFIG_HOME/nvim/init.vim` instead of `.vimrc` for storing
- configuration.
+- Use `$XDG_CONFIG_HOME/nvim/init.vim` instead of `.vimrc` for configuration.
- Use `$XDG_CONFIG_HOME/nvim` instead of `.vim` to store configuration files.
- Use `$XDG_DATA_HOME/nvim/shada/main.shada` instead of `.viminfo` for persistent
- session information.
+ session information. |shada|
==============================================================================
2. Defaults *nvim-defaults*
@@ -35,100 +27,187 @@ these differences.
- 'autoindent' is set by default
- 'autoread' is set by default
+- 'background' always defaults to "dark"
- 'backspace' defaults to "indent,eol,start"
+- 'backupdir' defaults to .,~/.local/share/nvim/backup (|xdg|)
+- 'belloff' defaults to "all"
- 'complete' doesn't include "i"
-- 'display' defaults to "lastline"
-- 'encoding' defaults to "utf-8"
+- 'cscopeverbose' is enabled
+- 'directory' defaults to ~/.local/share/nvim/swap// (|xdg|), auto-created
+- 'display' defaults to "lastline,msgsep"
+- 'encoding' is UTF-8 (cf. 'fileencoding' for file-content encoding)
+- 'fillchars' defaults (in effect) to "vert:โ”‚,fold:ยท"
+- 'fsync' is disabled
- 'formatoptions' defaults to "tcqj"
- 'history' defaults to 10000 (the maximum)
- 'hlsearch' is set by default
- 'incsearch' is set by default
-- 'langnoremap' is set by default
+- 'langnoremap' is enabled by default
+- 'langremap' is disabled by default
- 'laststatus' defaults to 2 (statusline is always shown)
- 'listchars' defaults to "tab:> ,trail:-,nbsp:+"
-- 'mouse' defaults to "a"
- 'nocompatible' is always set
- 'nrformats' defaults to "bin,hex"
+- 'ruler' is set by default
- 'sessionoptions' doesn't include "options"
+- 'shortmess' sets "F" flag
+- 'showcmd' is set by default
+- 'sidescroll' defaults to 1
- 'smarttab' is set by default
- 'tabpagemax' defaults to 50
- 'tags' defaults to "./tags;,tags"
+- 'ttimeoutlen' defaults to 50
- 'ttyfast' is always set
+- 'undodir' defaults to ~/.local/share/nvim/undo (|xdg|), auto-created
- 'viminfo' includes "!"
- 'wildmenu' is set by default
==============================================================================
3. New Features *nvim-features*
+MAJOR COMPONENTS ~
-MAJOR FEATURES ~
-
-Embedded terminal emulator |terminal-emulator|
-Shared data |shada|
-RPC API |RPC|
+API |API|
+Lua scripting |lua|
Job control |job-control|
Remote plugins |remote-plugin|
-Python plugins |provider-python|
-Clipboard integration |provider-clipboard|
-XDG support
+Providers
+ Clipboard |provider-clipboard|
+ Node.js plugins |provider-nodejs|
+ Python plugins |provider-python|
+ Ruby plugins |provider-ruby|
+Shared data |shada|
+Embedded terminal |terminal|
+VimL parser |nvim_parse_expression()|
+XDG base directories |xdg|
+USER EXPERIENCE ~
-OTHER FEATURES ~
+Working intuitively and consistently is a major goal of Nvim.
-|bracketed-paste-mode| is built-in and enabled by default.
+ *feature-compile*
+- Nvim always includes ALL features, in contrast to Vim (which ships with
+ various combinations of 100+ optional features). Think of it as a leaner
+ version of Vim's "HUGE" build. This reduces surface area for bugs, and
+ removes a common source of confusion and friction for users.
-Meta (alt) chords are recognized (even in the terminal).
- <M-1>, <M-2>, ...
- <M-BS>, <M-Del>, <M-Ins>, ...
- <M-/>, <M-\>, ...
- <M-Space>, <M-Enter>, <M-=>, <M-->, <M-?>, <M-$>, ...
+- Nvim avoids features that cannot be provided on all platforms; instead that
+ is delegated to external plugins/extensions. E.g. the `-X` platform-specific
+ option is "sometimes" available in Vim (with potential surprises:
+ http://stackoverflow.com/q/14635295).
- Note: Meta chords are case-sensitive (<M-a> is distinguished from <M-A>).
+- Vim's internal test functions (test_autochdir(), test_settime(), etc.) are
+ not exposed (nor implemented); instead Nvim has a robust API.
-Some `CTRL-SHIFT-...` key chords are distinguished from `CTRL-...` variants
-(even in the terminal). Specifically, the following are known to work:
- <C-Tab>, <C-S-Tab>
- <C-BS>, <C-S-BS>
- <C-Enter>, <C-S-Enter>
+- Behaviors, options, documentation are removed if they cost users more time
+ than they save.
-Options:
- 'statusline' supports unlimited alignment sections
+Usability details have been improved where the benefit outweighs any
+backwards-compatibility cost. Some examples:
-Commands:
- |:CheckHealth|
+- |K| in help documents can be used like |CTRL-]|.
+- Directories for 'directory' and 'undodir' are auto-created.
+- Terminal features such as 'guicursor' are enabled where possible.
-Functions:
- |capture()|
+ARCHITECTURE ~
+
+External plugins run in separate processes. |remote-plugin| This improves
+stability and allows those plugins to work without blocking the editor. Even
+"legacy" Python and Ruby plugins which use the old Vim interfaces (|if_pyth|,
+|if_ruby|) run out-of-process.
+
+Platform and I/O facilities are built upon libuv. Nvim benefits from libuv
+features and bug fixes, and other projects benefit from improvements to libuv
+by Nvim developers.
+
+FEATURES ~
+
+Command-line highlighting:
+ The expression prompt (|@=|, |c_CTRL-R_=|, |i_CTRL-R_=|) is highlighted
+ using a built-in VimL expression parser. |expr-highlight|
+ *E5408* *E5409*
+ |input()|, |inputdialog()| support custom highlighting. |input()-highlight|
+ *g:Nvim_color_cmdline*
+ (Experimental) Command-line (|:|) is colored by callback defined in
+ `g:Nvim_color_cmdline` (this callback is for testing only, and will be
+ removed in the future).
+
+Commands:
+ |:checkhealth|
+ |:cquit| can use [count] to set the exit code
+ |:drop| is always available
+ |:Man| is available by default, with many improvements such as completion
+ |:sign-define| accepts a `numhl` argument, to highlight the line number
+ |:tchdir| tab-local |current-directory|
Events:
- |TabNew|
+ |DirChanged|
|TabNewEntered|
- |TabClosed|
- |TermOpen|
|TermClose|
+ |TermOpen|
+ |TextYankPost|
+ |VimResume|
+ |VimSuspend|
+
+Functions:
+ |dictwatcheradd()| notifies a callback whenever a |Dict| is modified
+ |dictwatcherdel()|
+ |menu_get()|
+ |msgpackdump()|, |msgpackparse()| provide msgpack de/serialization
+ |stdpath()|
+ |system()|, |systemlist()| can run {cmd} directly (without 'shell')
Highlight groups:
- |hl-EndOfBuffer|
+ |expr-highlight| highlight groups (prefixed with "Nvim")
+ |hl-NormalNC| highlights non-current windows
+ |hl-MsgSeparator| highlights separator for scrolled messages
+ |hl-QuickFixLine|
+ |hl-Substitute|
|hl-TermCursor|
|hl-TermCursorNC|
+ |hl-Whitespace| highlights 'listchars' whitespace
+
+Input:
+ ALT (|META|) chords always work (even in the |TUI|). Map |<M-| with any key:
+ <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|
+
+Mappings:
+ |<Cmd>| pseudokey
+
+Normal commands:
+ "Outline": Type |gO| in |:Man| and |:help| pages to see a document outline.
+
+Options:
+ 'cpoptions' flags: |cpo-_|
+ 'display' flag `msgsep` to minimize scrolling when showing messages
+ 'guicursor' works in the terminal
+ 'fillchars' flags: `msgsep` (see 'display' above)
+ and `eob` for |hl-EndOfBuffer| marker
+ 'inccommand' shows interactive results for |:substitute|-like commands
+ 'scrollback'
+ 'statusline' supports unlimited alignment sections
+ 'tabline' %@Func@foo%X can call any function on mouse-click
+ 'winhighlight' window-local highlights
+
+Variables:
+ |v:event|
+ |v:exiting|
+ |v:progpath| is always absolute ("full")
+ |v:windowid| is always available (for use by external UIs)
==============================================================================
4. Changed features *nvim-features-changed*
Nvim always builds with all features, in contrast to Vim which may have
-certain features removed/added at compile-time. This is like if Vim's "HUGE"
-build was the only Vim release type (except Nvim is smaller than Vim's "HUGE"
-build).
+certain features removed/added at compile-time. |feature-compile|
If a Python interpreter is available on your `$PATH`, |:python| and |:python3|
-are always available and may be used simultaneously in separate plugins. The
-`neovim` pip package must be installed to use Python plugins in Nvim (see
-|provider-python|).
+are always available and may be used simultaneously. See |provider-python|.
-|:!| and |system()| do not support "interactive" commands; use |:terminal| for
-that instead. Terminal Vim supports interactive |:!| and |system()|, but gui
-Vim does not. See ":help gui-pty" in Vim:
- http://vimdoc.sourceforge.net/htmldoc/gui_x11.html#gui-pty
+|:redir| nested in |execute()| works.
|mkdir()| behaviour changed:
1. Assuming /tmp/foo does not exist and /tmp can be written to
@@ -138,8 +217,6 @@ Vim does not. See ":help gui-pty" in Vim:
'p')) mkdir() will silently exit. In Vim this was an error.
3. mkdir() error messages now include strerror() text when mkdir fails.
-'encoding' cannot be changed after startup.
-
|string()| and |:echo| behaviour changed:
1. No maximum recursion depth limit is applied to nested container
structures.
@@ -160,7 +237,7 @@ Vim does not. See ":help gui-pty" in Vim:
4. Stringifyed infinite and NaN values now use |str2float()| and can be evaled
back.
5. (internal) Trying to print or stringify VAR_UNKNOWN in Vim results in
- nothing, |E908|, in Neovim it is internal error.
+ nothing, E908, in Nvim it is internal error.
|json_decode()| behaviour changed:
1. It may output |msgpack-special-dict|.
@@ -181,121 +258,231 @@ Additional differences:
- |shada-c| has no effect.
- |shada-s| now limits size of every item and not just registers.
-- When reading ShaDa files items are merged according to the timestamp.
- |shada-merging|
- 'viminfo' option got renamed to 'shada'. Old option is kept as an alias for
compatibility reasons.
- |:wviminfo| was renamed to |:wshada|, |:rviminfo| to |:rshada|. Old
commands are still kept.
-- |:oldfiles| supports !.
-- When writing (|:wshada| without bang or at exit) it merges much more data,
- and does this according to the timestamp. Vim merges only marks.
- |shada-merging|
- ShaDa file format was designed with forward and backward compatibility in
mind. |shada-compatibility|
- Some errors make ShaDa code keep temporary file in-place for user to decide
what to do with it. Vim deletes temporary file in these cases.
|shada-error-handling|
-- Vim keeps no timestamps at all, neither in viminfo file nor in the instance
- itself.
- ShaDa file keeps search direction (|v:searchforward|), viminfo does not.
-==============================================================================
-5. Missing legacy features *nvim-features-missing*
- *if_ruby* *if_lua* *if_perl* *if_mzscheme* *if_tcl*
+|printf()| returns something meaningful when used with `%p` argument: in Vim
+it used to return useless address of the string (strings are copied to the
+newly allocated memory all over the place) and fail on types which cannot be
+coerced to strings. See |id()| for more details, currently it uses
+`printf("%p", {expr})` internally.
-These legacy Vim features may be implemented in the future, but they are not
-planned for the current milestone.
+|c_CTRL-R| pasting a non-special register into |cmdline| omits the last <CR>.
-- vim.bindeval() (new feature in Vim 7.4 Python interface)
-- |if_ruby|
-- |if_lua|
-- |if_perl|
-- |if_mzscheme|
-- |if_tcl|
+Lua interface (|if_lua.txt|):
-==============================================================================
-6. Removed features *nvim-features-removed*
+- `:lua print("a\0b")` will print `a^@b`, like with `:echomsg "a\nb"` . In Vim
+ that prints `a` and `b` on separate lines, exactly like
+ `:lua print("a\nb")` .
+- `:lua error('TEST')` emits the error โ€œE5105: Error while calling lua chunk:
+ [string "<VimL compiled string>"]:1: TESTโ€, whereas Vim emits only โ€œTESTโ€.
+- Lua has direct access to Nvim |API| via `vim.api`.
+- Lua package.path and package.cpath are automatically updated according to
+ 'runtimepath': |lua-require|.
-These features are in Vim, but have been intentionally removed from Nvim.
+|input()| and |inputdialog()| support for each otherโ€™s features (return on
+cancel and completion respectively) via dictionary argument (replaces all
+other arguments if used).
-Vi-compatible mode:
- ":set nocompatible" is ignored
- ":set compatible" is an error
+|input()| and |inputdialog()| support user-defined cmdline highlighting.
-Ed-compatible mode:
- ":set noedcompatible" is ignored
- ":set edcompatible" is an error
+Highlight groups:
+ |hl-ColorColumn|, |hl-CursorColumn| are lower priority than most other
+ groups
+ |hl-CursorLine| is low-priority unless foreground color is set
-'ttyfast':
- ":set ttyfast" is ignored
- ":set nottyfast" is an error
+Macro/|recording| behavior
+ Replay of a macro recorded during :lmap produces the same actions as when it
+ was recorded. In Vim if a macro is recorded while using :lmap'ped keys then
+ the behaviour during record and replay differs.
-Encryption support:
- 'cryptmethod'
- 'key'
+ 'keymap' is implemented via :lmap instead of :lnoremap so that you can use
+ macros and 'keymap' at the same time. This also means you can use |:imap| on
+ the results of keys from 'keymap'.
-MS-DOS support:
- 'bioskey'
- 'conskey'
+Normal commands:
+ |Q| is the same as |gQ|
-Highlight groups:
- |hl-VisualNOS|
+Options:
+ 'ttimeout', 'ttimeoutlen' behavior was simplified
-Other options:
- 'antialias'
- 'cpoptions' ('g', 'w', 'H', '*', '-', 'j', and all POSIX flags were removed)
- 'guioptions' (only the 't' flag was removed)
- 'guipty'
- 'imactivatefunc'
- 'imactivatekey'
- 'imstatusfunc'
- 'macatsui'
- 'restorescreen'
- 'shelltype'
- 'shortname'
- 'swapsync'
- 'term'
- 'termencoding' (Vim 7.4.852 also removed this for Windows)
- 'textauto'
- 'textmode'
- 'toolbar'
- 'toolbariconsize'
- 'ttybuiltin'
- 'ttymouse'
- 'ttyscroll'
- 'ttytype'
- 'weirdinvert'
+Shell:
+ Shell output (|:!|, |:make|, โ€ฆ) is always routed through the UI, so it
+ cannot "mess up" the screen. (You can still use "chansend(v:stderr,โ€ฆ)" if
+ you want to mess up the screen :)
-Other commands:
- :Print
+ Nvim throttles (skips) messages from shell commands (|:!|, |:grep|, |:make|)
+ if there is too much output. No data is lost, this only affects display and
+ improves performance. |:terminal| output is never throttled.
+
+ |:!| does not support "interactive" commands. Use |:terminal| instead.
+ (GUI Vim has a similar limitation, see ":help gui-pty" in Vim.)
+
+ :!start is not special-cased on Windows.
+
+ |system()| does not support writing/reading "backgrounded" commands. |E5677|
+
+Startup:
+ |-e| and |-es| invoke the same "improved Ex mode" as -E and -Es.
+ |-E| and |-Es| reads stdin as text (into buffer 1).
+ |-s| reads Normal commands from stdin if the script name is "-".
+ Reading text (instead of commands) from stdin |--|:
+ - works by default: "-" file is optional
+ - works in more cases: |-Es|, file args
+
+TUI:
+ *:set-termcap*
+ Start Nvim with 'verbose' level 3 to show terminal capabilities: >
+ nvim -V3
+<
+ *'term'* *E529* *E530* *E531*
+ 'term' reflects the terminal type derived from |$TERM| and other environment
+ checks. For debugging only; not reliable during startup. >
+ :echo &term
+< "builtin_x" means one of the |builtin-terms| was chosen, because the expected
+ terminfo file was not found on the system.
+
+ Nvim will use 256-colour capability on Linux virtual terminals. Vim uses
+ only 8 colours plus bright foreground on Linux VTs.
+
+ Vim combines what is in its |builtin-terms| with what it reads from terminfo,
+ and has a 'ttybuiltin' setting to control how that combination works. Nvim
+ uses one or the other, it does not attempt to merge the two.
+
+UI/Display:
+ |Visual| selection highlights the character at cursor. |visual-use|
+
+VimL (Vim script) compatibility:
+ `count` does not alias to |v:count|
+ `errmsg` does not alias to |v:errmsg|
+ `shell_error` does not alias to |v:shell_error|
+ `this_session` does not alias to |v:this_session|
+
+==============================================================================
+5. Missing legacy features *nvim-features-missing*
+
+Some legacy Vim features are not implemented:
+
+- |if_py|: vim.bindeval() and vim.Function() are not supported
+- |if_lua|: the `vim` object is missing some legacy methods
+- *if_perl*
+- *if_mzscheme*
+- *if_tcl*
+
+==============================================================================
+6. Removed features *nvim-features-removed*
+
+These Vim features were intentionally removed from Nvim.
+
+Aliases:
+ ex (alias for "nvim -e")
+ exim (alias for "nvim -E")
+ gex (GUI)
+ gview (GUI)
+ gvim (GUI)
+ gvimdiff (GUI)
+ rgview (GUI)
+ rgvim (GUI)
+ rview (alias for "nvim -RZ")
+ rvim (alias for "nvim -Z")
+ view (alias for "nvim -R")
+ vimdiff (alias for "nvim -d" |diff-mode|)
+
+Commands:
:fixdel
:helpfind
:mode (no longer accepts an argument)
:open
+ :Print
:shell
+ :smile
:tearoff
-Other compile-time features:
+Compile-time features:
EBCDIC
Emacs tags support
X11 integration (see |x11-selection|)
-Nvim does not have a built-in GUI and hence the following aliases have been
-removed: gvim, gex, gview, rgvim, rgview
-
-"Easy mode" (eview, evim, nvim -y)
-"(g)vimdiff" (alias for "(g)nvim -d" |diff-mode|)
-"Vi mode" (nvim -v)
-
-The ability to start nvim via the following aliases has been removed in favor
-of just using their command line arguments:
+Options:
+ 'antialias'
+ 'bioskey' (MS-DOS)
+ 'conskey' (MS-DOS)
+ *'cp'* *'nocompatible'* *'nocp'* *'compatible'* (Nvim is always "nocompatible".)
+ 'cpoptions' (gjkHw<*- and all POSIX flags were removed)
+ *'cryptmethod'* *'cm'* *'key'* (Vim encryption implementation)
+ *'ed'* *'edcompatible'* *'noed'* *'noedcompatible'*
+ 'encoding' ("utf-8" is always used)
+ 'esckeys'
+ 'guioptions' "t" flag was removed
+ *'guipty'* (Nvim uses pipes and PTYs consistently on all platforms.)
+ 'highlight' (Names of builtin |highlight-groups| cannot be changed.)
+ *'imactivatefunc'* *'imaf'*
+ *'imactivatekey'* *'imak'*
+ *'imstatusfunc'* *'imsf'*
+ *'macatsui'*
+ 'maxmem' Nvim delegates memory-management to the OS.
+ 'maxmemtot' Nvim delegates memory-management to the OS.
+ 'maxcombine' (6 is always used)
+ *'restorescreen'* *'rs'* *'norestorescreen'* *'nors'*
+ 'shelltype'
+ *'shortname'* *'sn'* *'noshortname'* *'nosn'*
+ *'swapsync'* *'sws'*
+ *'termencoding'* *'tenc'* (Vim 7.4.852 also removed this for Windows)
+ 'textauto'
+ 'textmode'
+ *'toolbar'* *'tb'*
+ *'toolbariconsize'* *'tbis'*
+ *'ttybuiltin'* *'tbi'* *'nottybuiltin'* *'notbi'*
+ *'ttymouse'* *'ttym'*
+ *'ttyscroll'* *'tsl'*
+ *'ttytype'* *'tty'*
+ 'ttyfast'
+ 'weirdinvert'
- ex nvim -e
- exim nvim -E
- view nvim -R
- rvim nvim -Z
- rview nvim -RZ
+Startup:
+ --literal (file args are always literal; to expand wildcards on Windows, use
+ |:n| e.g. `nvim +"n *"`)
+ Easy mode: eview, evim, nvim -y
+ Vi mode: nvim -v
+
+Test functions:
+ test_alloc_fail()
+ test_autochdir()
+ test_disable_char_avail()
+ test_garbagecollect_now()
+ test_null_channel()
+ test_null_dict()
+ test_null_job()
+ test_null_list()
+ test_null_partial()
+ test_null_string()
+ test_override()
+ test_settime()
+
+TUI:
+ *t_xx* *termcap-options* *t_AB* *t_Sb* *t_vb* *t_SI*
+ Nvim does not have special `t_XX` options nor <t_XX> keycodes to configure
+ terminal capabilities. Instead Nvim treats the terminal as any other UI,
+ e.g. 'guicursor' sets the terminal cursor style if possible.
+
+ *termcap*
+ Nvim never uses the termcap database, only |terminfo| and |builtin-terms|.
+
+ *xterm-8bit* *xterm-8-bit*
+ Xterm can be run in a mode where it uses true 8-bit CSI. Supporting this
+ requires autodetection of whether the terminal is in UTF-8 mode or non-UTF-8
+ mode, as the 8-bit CSI character has to be written differently in each case.
+ Vim issues a "request version" sequence to the terminal at startup and looks
+ at how the terminal is sending CSI. Nvim does not issue such a sequence and
+ always uses 7-bit control sequences.
==============================================================================
- vim:tw=78:ts=8:noet:ft=help:norl:
+ vim:tw=78:ts=8:sw=2:noet:ft=help:norl:
diff --git a/runtime/doc/visual.txt b/runtime/doc/visual.txt
index 6810d50c11..252a1ca8b8 100644
--- a/runtime/doc/visual.txt
+++ b/runtime/doc/visual.txt
@@ -1,4 +1,4 @@
-*visual.txt* For Vim version 7.4. Last change: 2014 Mar 23
+*visual.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -11,14 +11,7 @@ operator. It is the only way to select a block of text.
This is introduced in section |04.4| of the user manual.
-1. Using Visual mode |visual-use|
-2. Starting and stopping Visual mode |visual-start|
-3. Changing the Visual area |visual-change|
-4. Operating on the Visual area |visual-operators|
-5. Blockwise operators |blockwise-operators|
-6. Repeating |visual-repeat|
-7. Examples |visual-examples|
-8. Select mode |Select-mode|
+ Type |gO| to see the table of contents.
==============================================================================
1. Using Visual mode *visual-use*
@@ -32,8 +25,7 @@ Using Visual mode consists of three parts:
3. Type an operator command.
The highlighted characters will be operated upon.
-The 'highlight' option can be used to set the display mode to use for
-highlighting in Visual mode.
+The |hl-Visual| group determines the highlighting of the visual selection.
The 'virtualedit' option can be used to allow positioning the cursor to
positions where there is no actual character.
@@ -78,10 +70,7 @@ position.
selected.
*CTRL-V* *blockwise-visual*
-[count]CTRL-V Start Visual mode blockwise. Note: Under Windows
- CTRL-V could be mapped to paste text, it doesn't work
- to start Visual mode then, see |CTRL-V-alternative|.
- [count] is used as with `v` above.
+[count]CTRL-V Start Visual mode blockwise.
If you use <Esc>, click the left mouse button or use any command that
does a jump to another buffer while in Visual mode, the highlighting stops
@@ -278,7 +267,7 @@ mode. For example, if you would like the "/" command not to extend the Visual
area, but instead take the highlighted text and search for that: >
:vmap / y/<C-R>"<CR>
(In the <> notation |<>|, when typing it you should type it literally; you
-need to remove the 'B' and '<' flags from 'cpoptions'.)
+need to remove the 'B' flag from 'cpoptions'.)
If you want to give a register name using the """ command, do this just before
typing the operator character: "v{move-around}"xd".
@@ -310,8 +299,8 @@ Visual-block Insert *v_b_I*
With a blockwise selection, I{string}<ESC> will insert {string} at the start
of block on every line of the block, provided that the line extends into the
block. Thus lines that are short will remain unmodified. TABs are split to
-retain visual columns.
-See |v_b_I_example|.
+retain visual columns. Works only for adding text to a line, not for
+deletions. See |v_b_I_example|.
Visual-block Append *v_b_A*
With a blockwise selection, A{string}<ESC> will append {string} to the end of
@@ -327,6 +316,7 @@ See |v_b_A_example|.
Note: "I" and "A" behave differently for lines that don't extend into the
selected block. This was done intentionally, so that you can do it the way
you want.
+Works only for adding text to a line, not for deletions.
Visual-block change *v_b_c*
All selected text in the block will be replaced by the same text string. When
@@ -382,7 +372,7 @@ Here is an example, to replace the selected text with the output of "date": >
:vmap _a <Esc>`>a<CR><Esc>`<i<CR><Esc>!!date<CR>kJJ
(In the <> notation |<>|, when typing it you should type it literally; you
-need to remove the 'B' and '<' flags from 'cpoptions')
+need to remove the 'B' flag from 'cpoptions')
What this does is:
<Esc> stop Visual mode
@@ -399,7 +389,7 @@ selected text: >
:vmap X y/<C-R>"<CR>
(In the <> notation |<>|, when typing it you should type it literally; you
-need to remove the 'B' and '<' flags from 'cpoptions')
+need to remove the 'B' flag from 'cpoptions')
Note that special characters (like '.' and '*') will cause problems.
@@ -534,4 +524,4 @@ g CTRL-H Start Select mode, blockwise. This is like CTRL-V,
but starts Select mode instead of Visual mode.
Mnemonic: "get Highlighted".
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/windows.txt b/runtime/doc/windows.txt
index d5c7db992e..44464c1cef 100644
--- a/runtime/doc/windows.txt
+++ b/runtime/doc/windows.txt
@@ -1,4 +1,4 @@
-*windows.txt* For Vim version 7.4. Last change: 2016 Feb 01
+*windows.txt* Nvim
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -13,18 +13,7 @@ differently when used in combination with more than one window.
The basics are explained in chapter 7 and 8 of the user manual |usr_07.txt|
|usr_08.txt|.
-1. Introduction |windows-intro|
-2. Starting Vim |windows-starting|
-3. Opening and closing a window |opening-window|
-4. Moving cursor to other windows |window-move-cursor|
-5. Moving windows around |window-moving|
-6. Window resizing |window-resize|
-7. Argument and buffer list commands |buffer-list|
-8. Do a command in all buffers or windows |list-repeat|
-9. Tag or file name under the cursor |window-tag|
-10. The preview window |preview-window|
-11. Using hidden buffers |buffer-hidden|
-12. Special kinds of buffers |special-buffers|
+ Type |gO| to see the table of contents.
==============================================================================
1. Introduction *windows-intro* *window*
@@ -69,6 +58,16 @@ places where a Normal mode command can't be used or is inconvenient.
The main Vim window can hold several split windows. There are also tab pages
|tab-page|, each of which can hold multiple windows.
+ *window-ID* *winid* *windowid*
+Each window has a unique identifier called the window ID. This identifier
+will not change within a Vim session. The |win_getid()| and |win_id2tabwin()|
+functions can be used to convert between the window/tab number and the
+identifier. There is also the window number, which may change whenever
+windows are opened or closed, see |winnr()|.
+
+Each buffer has a unique number and the number will not change within a Vim
+session. The |bufnr()| and |bufname()| functions can be used to convert
+between a buffer name and the buffer number.
==============================================================================
2. Starting Vim *windows-starting*
@@ -107,18 +106,10 @@ This option can be local to the window, so that you can have a different
status line in each window.
Normally, inversion is used to display the status line. This can be changed
-with the 's' character in the 'highlight' option. For example, "sb" sets it to
-bold characters. If no highlighting is used for the status line ("sn"), the
-'^' character is used for the current window, and '=' for other windows. If
-the mouse is supported and enabled with the 'mouse' option, a status line can
-be dragged to resize windows.
-
-Note: If you expect your status line to be in reverse video and it isn't,
-check if the 'highlight' option contains "si". In version 3.0, this meant to
-invert the status line. Now it should be "sr", reverse the status line, as
-"si" now stands for italic! If italic is not available on your terminal, the
-status line is inverted anyway; you will only see this problem on terminals
-that have termcap codes for italics.
+with the |hl-StatusLine| highlight group. If no highlighting is used for the
+status line, the '^' character is used for the current window, and '=' for
+other windows. If 'mouse' is enabled, a status line can be dragged to resize
+windows.
==============================================================================
3. Opening and closing a window *opening-window* *E36*
@@ -239,7 +230,7 @@ window will appear.
far left and occupies the full height of the Vim window.
Doesn't work for |:execute| and |:normal|.
- *:botright*
+ *:bo* *:botright*
:bo[tright] {cmd}
Execute {cmd}. If it contains a command that splits a window,
it will appear at the bottom and occupy the full width of the
@@ -277,7 +268,7 @@ CTRL-W CTRL-Q *CTRL-W_CTRL-Q*
:1quit " quit the first window
:$quit " quit the last window
:9quit " quit the last window
- " if there are less than 9 windows opened
+ " if there are fewer than 9 windows opened
:-quit " quit the previous window
:+quit " quit the next window
:+2quit " quit the second next window
@@ -320,8 +311,9 @@ CTRL-W CTRL-C *CTRL-W_CTRL-C*
*:hide*
:hid[e]
:{count}hid[e]
- Quit the current window, unless it is the last window on the
- screen. For {count} see |:quit|.
+ Without {count}: Quit the current window, unless it is the
+ last window on the screen.
+ If {count} is given quit the {count} window.
The buffer becomes hidden (unless there is another window
editing it or 'bufhidden' is `unload`, `delete` or `wipe`).
@@ -524,6 +516,9 @@ CTRL-W > Increase current window width by N (default 1).
:vertical res[ize] [N] *:vertical-resize* *CTRL-W_bar*
CTRL-W | Set current window width to N (default: widest possible).
+ *:mod* *:mode*
+:mod[e] Detects the screen size and redraws the screen.
+
You can also resize a window by dragging a status line up or down with the
mouse. Or by dragging a vertical separator line left or right. This only
works if the version of Vim that is being used supports the mouse and the
@@ -592,7 +587,8 @@ The minimal height and width of a window is set with 'winminheight' and
41. :buffers list of buffers
The meaning of [N] depends on the command:
- [N] is number of buffers to go forward/backward on ?2, ?3, and ?4
+ [N] is the number of buffers to go forward/backward on 2/12/22/32,
+ 3/13/23/33, and 4/14/24/34
[N] is an argument number, defaulting to current argument, for 1 and 21
[N] is a buffer number, defaulting to current buffer, for 11 and 31
[N] is a count for 19 and 39
@@ -675,6 +671,8 @@ can also get to them with the buffer list commands, like ":bnext".
- If the file is not open in a window edit the file in the
current window. If the current buffer can't be |abandon|ed,
the window is split first.
+ - Windows that are not in the argument list or are not full
+ width will be closed if possible.
The |argument-list| is set, like with the |:next| command.
The purpose of this command is that it can be used from a
program that wants Vim to edit another file, e.g., a debugger.
@@ -998,6 +996,9 @@ list of buffers. |unlisted-buffer|
displayed in a window |hidden-buffer|
- a buffer with 'modifiable' off
= a readonly buffer
+ R a terminal buffer with a running job
+ F a terminal buffer with a finished job
+ ? a terminal buffer without a job: `:terminal NONE`
+ a modified buffer
x a buffer with read errors
@@ -1016,6 +1017,10 @@ list of buffers. |unlisted-buffer|
h+ hidden buffers which are modified
a+ active buffers which are modified
+ When using |:filter| the pattern is matched against the
+ displayed buffer name, e.g.: >
+ filter /\.vim/ ls
+<
*:bad* *:badd*
:bad[d] [+lnum] {fname}
Add file name {fname} to the buffer list, without loading it.
@@ -1041,10 +1046,8 @@ list of buffers. |unlisted-buffer|
:%bdelete " delete all buffers
<
:bdelete[!] {bufname} *E93* *E94*
- Like ":bdelete[!] [N]", but buffer given by name. Note that a
- buffer whose name is a number cannot be referenced by that
- name; use the buffer number instead. Insert a backslash
- before a space in a buffer name.
+ Like ":bdelete[!] [N]", but buffer given by name, see
+ |{bufname}|.
:bdelete[!] N1 N2 ...
Do ":bdelete[!]" for buffer N1, N2, etc. The arguments can be
@@ -1080,10 +1083,8 @@ list of buffers. |unlisted-buffer|
into a loaded buffer.
:bunload[!] {bufname}
- Like ":bunload[!] [N]", but buffer given by name. Note that a
- buffer whose name is a number cannot be referenced by that
- name; use the buffer number instead. Insert a backslash
- before a space in a buffer name.
+ Like ":bunload[!] [N]", but buffer given by name.
+ Also see |{bufname}|.
:N,Mbunload[!] Do ":bunload[!]" for all buffers in the range N to M
|inclusive|.
@@ -1101,10 +1102,16 @@ list of buffers. |unlisted-buffer|
list, without setting the 'buflisted' flag.
Also see |+cmd|.
-:[N]b[uffer][!] [+cmd] {bufname}
- Edit buffer for {bufname} from the buffer list. See
- |:buffer-!| for [!]. This will also edit a buffer that is not
- in the buffer list, without setting the 'buflisted' flag.
+:[N]b[uffer][!] [+cmd] {bufname} *{bufname}*
+ Edit buffer for {bufname} from the buffer list. A partial
+ name also works, so long as it is unique in the list of
+ buffers.
+ Note that a buffer whose name is a number cannot be referenced
+ by that name; use the buffer number instead.
+ Insert a backslash before a space in a buffer name.
+ See |:buffer-!| for [!].
+ This will also edit a buffer that is not in the buffer list,
+ without setting the 'buflisted' flag.
Also see |+cmd|.
:[N]sb[uffer] [+cmd] [N] *:sb* *:sbuffer*
@@ -1116,7 +1123,7 @@ list of buffers. |unlisted-buffer|
Also see |+cmd|.
:[N]sb[uffer] [+cmd] {bufname}
- Split window and edit buffer for {bufname} from the buffer
+ Split window and edit buffer for |{bufname}| from the buffer
list. This will also edit a buffer that is not in the buffer
list, without setting the 'buflisted' flag.
Note: If what you want to do is split the buffer, make a copy
@@ -1238,6 +1245,9 @@ help Contains a help file. Will only be created with the |:help|
and can't be changed. The 'buflisted' option will be reset
for a help buffer.
+terminal A terminal window buffer, see |terminal|. The contents cannot
+ be read or changed until the job ends.
+
directory Displays directory contents. Can be used by a file explorer
plugin. The buffer is created with these settings: >
:setlocal buftype=nowrite
@@ -1263,4 +1273,4 @@ unlisted The buffer is not in the buffer list. It is not used for
:setlocal nobuflisted
<
- vim:tw=78:ts=8:ft=help:norl:
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/filetype.vim b/runtime/filetype.vim
index c5a3577a62..a4d46fd842 100644
--- a/runtime/filetype.vim
+++ b/runtime/filetype.vim
@@ -1,7 +1,7 @@
" Vim support file to detect file types
"
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2015 Oct 13
+" Last Change: 2018 Feb 14
" Listen very carefully, I will say this only once
if exists("did_load_filetypes")
@@ -48,28 +48,11 @@ func! s:StarSetf(ft)
endif
endfunc
+" Vim help file
+au BufNewFile,BufRead $VIMRUNTIME/doc/*.txt setf help
+
" Abaqus or Trasys
-au BufNewFile,BufRead *.inp call s:Check_inp()
-
-func! s:Check_inp()
- if getline(1) =~ '^\*'
- setf abaqus
- else
- let n = 1
- if line("$") > 500
- let nmax = 500
- else
- let nmax = line("$")
- endif
- while n <= nmax
- if getline(n) =~? "^header surface data"
- setf trasys
- break
- endif
- let n = n + 1
- endwhile
- endif
-endfunc
+au BufNewFile,BufRead *.inp call dist#ft#Check_inp()
" A-A-P recipe
au BufNewFile,BufRead *.aap setf aap
@@ -167,44 +150,7 @@ au BufNewFile,BufRead */boot/grub/menu.lst,*/boot/grub/grub.conf,*/etc/grub.conf
" Assembly (all kinds)
" *.lst is not pure assembly, it has two extra columns (address, byte codes)
-au BufNewFile,BufRead *.asm,*.[sS],*.[aA],*.mac,*.lst call s:FTasm()
-
-" This function checks for the kind of assembly that is wanted by the user, or
-" can be detected from the first five lines of the file.
-func! s:FTasm()
- " make sure b:asmsyntax exists
- if !exists("b:asmsyntax")
- let b:asmsyntax = ""
- endif
-
- if b:asmsyntax == ""
- call s:FTasmsyntax()
- endif
-
- " if b:asmsyntax still isn't set, default to asmsyntax or GNU
- if b:asmsyntax == ""
- if exists("g:asmsyntax")
- let b:asmsyntax = g:asmsyntax
- else
- let b:asmsyntax = "asm"
- endif
- endif
-
- exe "setf " . fnameescape(b:asmsyntax)
-endfunc
-
-func! s:FTasmsyntax()
- " see if file contains any asmsyntax=foo overrides. If so, change
- " b:asmsyntax appropriately
- let head = " ".getline(1)." ".getline(2)." ".getline(3)." ".getline(4).
- \" ".getline(5)." "
- let match = matchstr(head, '\sasmsyntax=\zs[a-zA-Z0-9]\+\ze\s')
- if match != ''
- let b:asmsyntax = match
- elseif ((head =~? '\.title') || (head =~? '\.ident') || (head =~? '\.macro') || (head =~? '\.subtitle') || (head =~? '\.library'))
- let b:asmsyntax = "vmasm"
- endif
-endfunc
+au BufNewFile,BufRead *.asm,*.[sS],*.[aA],*.mac,*.lst call dist#ft#FTasm()
" Macro (VAX)
au BufNewFile,BufRead *.mar setf vmasm
@@ -234,17 +180,7 @@ au BufNewFile,BufRead *.awk setf awk
au BufNewFile,BufRead *.mch,*.ref,*.imp setf b
" BASIC or Visual Basic
-au BufNewFile,BufRead *.bas call s:FTVB("basic")
-
-" Check if one of the first five lines contains "VB_Name". In that case it is
-" probably a Visual Basic file. Otherwise it's assumed to be "alt" filetype.
-func! s:FTVB(alt)
- if getline(1).getline(2).getline(3).getline(4).getline(5) =~? 'VB_Name\|Begin VB\.\(Form\|MDIForm\|UserControl\)'
- setf vb
- else
- exe "setf " . a:alt
- endif
-endfunc
+au BufNewFile,BufRead *.bas call dist#ft#FTVB("basic")
" Visual Basic Script (close to Visual Basic) or Visual Basic .NET
au BufNewFile,BufRead *.vb,*.vbs,*.dsm,*.ctl setf vb
@@ -262,14 +198,7 @@ au BufNewFile,BufRead *.cmd
\ if getline(1) =~ '^/\*' | setf rexx | else | setf dosbatch | endif
" Batch file for 4DOS
-au BufNewFile,BufRead *.btm call s:FTbtm()
-func! s:FTbtm()
- if exists("g:dosbatch_syntax_for_btm") && g:dosbatch_syntax_for_btm
- setf dosbatch
- else
- setf btm
- endif
-endfunc
+au BufNewFile,BufRead *.btm call dist#ft#FTbtm()
" BC calculator
au BufNewFile,BufRead *.bc setf bc
@@ -284,19 +213,12 @@ au BufNewFile,BufRead *.bib setf bib
au BufNewFile,BufRead *.bst setf bst
" BIND configuration
-au BufNewFile,BufRead named.conf,rndc.conf setf named
+" sudoedit uses namedXXXX.conf
+au BufNewFile,BufRead named*.conf,rndc*.conf,rndc*.key setf named
" BIND zone
au BufNewFile,BufRead named.root setf bindzone
-au BufNewFile,BufRead *.db call s:BindzoneCheck('')
-
-func! s:BindzoneCheck(default)
- if getline(1).getline(2).getline(3).getline(4) =~ '^; <<>> DiG [0-9.]\+ <<>>\|BIND.*named\|$ORIGIN\|$TTL\|IN\s\+SOA'
- setf bindzone
- elseif a:default != ''
- exe 'setf ' . a:default
- endif
-endfunc
+au BufNewFile,BufRead *.db call dist#ft#BindzoneCheck('')
" Blank
au BufNewFile,BufRead *.bl setf blank
@@ -305,24 +227,15 @@ au BufNewFile,BufRead *.bl setf blank
au BufNewFile,BufRead */etc/blkid.tab,*/etc/blkid.tab.old setf xml
" Bazel (http://bazel.io)
-autocmd BufRead,BufNewFile *.bzl,BUILD,WORKSPACE setfiletype bzl
+autocmd BufRead,BufNewFile *.bzl,WORKSPACE,BUILD.bazel setf bzl
+if has("fname_case")
+ " There is another check for BUILD further below.
+ autocmd BufRead,BufNewFile BUILD setf bzl
+endif
" C or lpc
-au BufNewFile,BufRead *.c call s:FTlpc()
-
-func! s:FTlpc()
- if exists("g:lpc_syntax_for_c")
- let lnum = 1
- while lnum <= 12
- if getline(lnum) =~# '^\(//\|inherit\|private\|protected\|nosave\|string\|object\|mapping\|mixed\)'
- setf lpc
- return
- endif
- let lnum = lnum + 1
- endwhile
- endif
- setf c
-endfunc
+au BufNewFile,BufRead *.c call dist#ft#FTlpc()
+au BufNewFile,BufRead *.lpc,*.ulpc setf lpc
" Calendar
au BufNewFile,BufRead calendar setf calendar
@@ -376,23 +289,7 @@ endif
" .h files can be C, Ch C++, ObjC or ObjC++.
" Set c_syntax_for_h if you want C, ch_syntax_for_h if you want Ch. ObjC is
" detected automatically.
-au BufNewFile,BufRead *.h call s:FTheader()
-
-func! s:FTheader()
- if match(getline(1, min([line("$"), 200])), '^@\(interface\|end\|class\)') > -1
- if exists("g:c_syntax_for_h")
- setf objc
- else
- setf objcpp
- endif
- elseif exists("g:c_syntax_for_h")
- setf c
- elseif exists("g:ch_syntax_for_h")
- setf ch
- else
- setf cpp
- endif
-endfunc
+au BufNewFile,BufRead *.h call dist#ft#FTheader()
" Ch (CHscript)
au BufNewFile,BufRead *.chf setf ch
@@ -426,36 +323,7 @@ au BufNewFile,BufRead NEWS
au BufNewFile,BufRead *..ch setf chill
" Changes for WEB and CWEB or CHILL
-au BufNewFile,BufRead *.ch call s:FTchange()
-
-" This function checks if one of the first ten lines start with a '@'. In
-" that case it is probably a change file.
-" If the first line starts with # or ! it's probably a ch file.
-" If a line has "main", "include", "//" ir "/*" it's probably ch.
-" Otherwise CHILL is assumed.
-func! s:FTchange()
- let lnum = 1
- while lnum <= 10
- if getline(lnum)[0] == '@'
- setf change
- return
- endif
- if lnum == 1 && (getline(1)[0] == '#' || getline(1)[0] == '!')
- setf ch
- return
- endif
- if getline(lnum) =~ "MODULE"
- setf chill
- return
- endif
- if getline(lnum) =~ 'main\s*(\|#\s*include\|//'
- setf ch
- return
- endif
- let lnum = lnum + 1
- endwhile
- setf chill
-endfunc
+au BufNewFile,BufRead *.ch call dist#ft#FTchange()
" ChordPro
au BufNewFile,BufRead *.chopro,*.crd,*.cho,*.crdpro,*.chordpro setf chordpro
@@ -467,27 +335,7 @@ au BufNewFile,BufRead *.dcl,*.icl setf clean
au BufNewFile,BufRead *.eni setf cl
" Clever or dtd
-au BufNewFile,BufRead *.ent call s:FTent()
-
-func! s:FTent()
- " This function checks for valid cl syntax in the first five lines.
- " Look for either an opening comment, '#', or a block start, '{".
- " If not found, assume SGML.
- let lnum = 1
- while lnum < 6
- let line = getline(lnum)
- if line =~ '^\s*[#{]'
- setf cl
- return
- elseif line !~ '^\s*$'
- " Not a blank line, not a comment, and not a block start,
- " so doesn't look like valid cl code.
- break
- endif
- let lnum = lnum + 1
- endw
- setf dtd
-endfunc
+au BufNewFile,BufRead *.ent call dist#ft#FTent()
" Clipper (or FoxPro; could also be eviews)
au BufNewFile,BufRead *.prg
@@ -527,10 +375,10 @@ au BufNewFile,BufRead *.cfm,*.cfi,*.cfc setf cf
au BufNewFile,BufRead configure.in,configure.ac setf config
" CUDA Cumpute Unified Device Architecture
-au BufNewFile,BufRead *.cu setf cuda
+au BufNewFile,BufRead *.cu,*.cuh setf cuda
" Dockerfile
-au BufNewFile,BufRead Dockerfile setf dockerfile
+au BufNewFile,BufRead Dockerfile,*.Dockerfile setf dockerfile
" WildPackets EtherPeek Decoder
au BufNewFile,BufRead *.dcd setf dcd
@@ -542,19 +390,11 @@ au BufNewFile,BufRead *enlightenment/*.cfg setf c
au BufNewFile,BufRead *Eterm/*.cfg setf eterm
" Euphoria 3 or 4
-au BufNewFile,BufRead *.eu,*.ew,*.ex,*.exu,*.exw call s:EuphoriaCheck()
+au BufNewFile,BufRead *.eu,*.ew,*.ex,*.exu,*.exw call dist#ft#EuphoriaCheck()
if has("fname_case")
- au BufNewFile,BufRead *.EU,*.EW,*.EX,*.EXU,*.EXW call s:EuphoriaCheck()
+ au BufNewFile,BufRead *.EU,*.EW,*.EX,*.EXU,*.EXW call dist#ft#EuphoriaCheck()
endif
-func! s:EuphoriaCheck()
- if exists('g:filetype_euphoria')
- exe 'setf ' . g:filetype_euphoria
- else
- setf euphoria3
- endif
-endfunc
-
" Lynx config files
au BufNewFile,BufRead lynx.cfg setf lynx
@@ -585,6 +425,13 @@ au BufNewFile,BufRead control
\| setf debcontrol
\| endif
+" Debian Copyright
+au BufNewFile,BufRead */debian/copyright setf debcopyright
+au BufNewFile,BufRead copyright
+ \ if getline(1) =~ '^Format:'
+ \| setf debcopyright
+ \| endif
+
" Debian Sources.list
au BufNewFile,BufRead */etc/apt/sources.list setf debsources
au BufNewFile,BufRead */etc/apt/sources.list.d/*.list setf debsources
@@ -599,19 +446,7 @@ au BufNewFile,BufRead */etc/dnsmasq.conf setf dnsmasq
au BufNewFile,BufRead *.desc setf desc
" the D language or dtrace
-au BufNewFile,BufRead *.d call s:DtraceCheck()
-
-func! s:DtraceCheck()
- let lines = getline(1, min([line("$"), 100]))
- if match(lines, '^module\>\|^import\>') > -1
- " D files often start with a module and/or import statement.
- setf d
- elseif match(lines, '^#!\S\+dtrace\|#pragma\s\+D\s\+option\|:\S\{-}:\S\{-}:') > -1
- setf dtrace
- else
- setf d
- endif
-endfunc
+au BufNewFile,BufRead *.d call dist#ft#DtraceCheck()
" Desktop files
au BufNewFile,BufRead *.desktop,.directory setf desktop
@@ -623,7 +458,13 @@ au BufNewFile,BufRead dict.conf,.dictrc setf dictconf
au BufNewFile,BufRead dictd.conf setf dictdconf
" Diff files
-au BufNewFile,BufRead *.diff,*.rej,*.patch setf diff
+au BufNewFile,BufRead *.diff,*.rej setf diff
+au BufNewFile,BufRead *.patch
+ \ if getline(1) =~ '^From [0-9a-f]\{40\} Mon Sep 17 00:00:00 2001$' |
+ \ setf gitsendemail |
+ \ else |
+ \ setf diff |
+ \ endif
" Dircolors
au BufNewFile,BufRead .dir_colors,.dircolors,*/etc/DIR_COLORS setf dircolors
@@ -637,7 +478,7 @@ au BufNewFile,BufRead *.rul
\ endif
" DCL (Digital Command Language - vms) or DNS zone file
-au BufNewFile,BufRead *.com call s:BindzoneCheck('dcl')
+au BufNewFile,BufRead *.com call dist#ft#BindzoneCheck('dcl')
" DOT
au BufNewFile,BufRead *.dot setf dot
@@ -669,34 +510,27 @@ au BufNewFile,BufRead *.dtd setf dtd
" DTS/DSTI (device tree files)
au BufNewFile,BufRead *.dts,*.dtsi setf dts
-" EDIF (*.edf,*.edif,*.edn,*.edo)
-au BufNewFile,BufRead *.ed\(f\|if\|n\|o\) setf edif
+" EDIF (*.edf,*.edif,*.edn,*.edo) or edn
+au BufNewFile,BufRead *.ed\(f\|if\|o\) setf edif
+au BufNewFile,BufRead *.edn
+ \ if getline(1) =~ '^\s*(\s*edif\>' |
+ \ setf edif |
+ \ else |
+ \ setf clojure |
+ \ endif
+
+" EditorConfig (close enough to dosini)
+au BufNewFile,BufRead .editorconfig setf dosini
" Embedix Component Description
au BufNewFile,BufRead *.ecd setf ecd
" Eiffel or Specman or Euphoria
-au BufNewFile,BufRead *.e,*.E call s:FTe()
+au BufNewFile,BufRead *.e,*.E call dist#ft#FTe()
" Elinks configuration
au BufNewFile,BufRead */etc/elinks.conf,*/.elinks/elinks.conf setf elinks
-func! s:FTe()
- if exists('g:filetype_euphoria')
- exe 'setf ' . g:filetype_euphoria
- else
- let n = 1
- while n < 100 && n < line("$")
- if getline(n) =~ "^\\s*\\(<'\\|'>\\)\\s*$"
- setf specman
- return
- endif
- let n = n + 1
- endwhile
- setf eiffel
- endif
-endfunc
-
" ERicsson LANGuage; Yaws is erlang too
au BufNewFile,BufRead *.erl,*.hrl,*.yaws setf erlang
@@ -748,7 +582,7 @@ au BufNewFile,BufRead auto.master setf conf
au BufNewFile,BufRead *.mas,*.master setf master
" Forth
-au BufNewFile,BufRead *.fs,*.ft setf forth
+au BufNewFile,BufRead *.fs,*.ft,*.fth setf forth
" Reva Forth
au BufNewFile,BufRead *.frt setf reva
@@ -775,15 +609,15 @@ au BufNewFile,BufRead *.mo,*.gdmo setf gdmo
au BufNewFile,BufRead *.ged,lltxxxxx.txt setf gedcom
" Git
-au BufNewFile,BufRead COMMIT_EDITMSG setf gitcommit
-au BufNewFile,BufRead MERGE_MSG setf gitcommit
-au BufNewFile,BufRead *.git/config,.gitconfig,.gitmodules setf gitconfig
-au BufNewFile,BufRead *.git/modules/*/config setf gitconfig
-au BufNewFile,BufRead */.config/git/config setf gitconfig
+au BufNewFile,BufRead COMMIT_EDITMSG,MERGE_MSG,TAG_EDITMSG setf gitcommit
+au BufNewFile,BufRead *.git/config,.gitconfig,/etc/gitconfig setf gitconfig
+au BufNewFile,BufRead */.config/git/config setf gitconfig
+au BufNewFile,BufRead .gitmodules,*.git/modules/*/config setf gitconfig
if !empty($XDG_CONFIG_HOME)
- au BufNewFile,BufRead $XDG_CONFIG_HOME/git/config setf gitconfig
+ au BufNewFile,BufRead $XDG_CONFIG_HOME/git/config setf gitconfig
endif
au BufNewFile,BufRead git-rebase-todo setf gitrebase
+au BufRead,BufNewFile .gitsendemail.msg.?????? setf gitsendemail
au BufNewFile,BufRead .msg.[0-9]*
\ if getline(1) =~ '^From.*# This line is ignored.$' |
\ setf gitsendemail |
@@ -803,6 +637,10 @@ au BufNewFile,BufRead *.gp,.gprc setf gp
au BufNewFile,BufRead */.gnupg/options setf gpg
au BufNewFile,BufRead */.gnupg/gpg.conf setf gpg
au BufNewFile,BufRead */usr/*/gnupg/options.skel setf gpg
+if !empty($GNUPGHOME)
+ au BufNewFile,BufRead $GNUPGHOME/options setf gpg
+ au BufNewFile,BufRead $GNUPGHOME/gpg.conf setf gpg
+endif
" gnash(1) configuration files
au BufNewFile,BufRead gnashrc,.gnashrc,gnashpluginrc,.gnashpluginrc setf gnash
@@ -852,7 +690,7 @@ au BufNewFile,BufRead *.ht setf haste
au BufNewFile,BufRead *.htpp setf hastepreproc
" Hercules
-au BufNewFile,BufRead *.vc,*.ev,*.rs,*.sum,*.errsum setf hercules
+au BufNewFile,BufRead *.vc,*.ev,*.sum,*.errsum setf hercules
" HEX (Intel)
au BufNewFile,BufRead *.hex,*.h32 setf hex
@@ -861,24 +699,7 @@ au BufNewFile,BufRead *.hex,*.h32 setf hex
au BufNewFile,BufRead *.t.html setf tilde
" HTML (.shtml and .stm for server side)
-au BufNewFile,BufRead *.html,*.htm,*.shtml,*.stm call s:FThtml()
-
-" Distinguish between HTML, XHTML and Django
-func! s:FThtml()
- let n = 1
- while n < 10 && n < line("$")
- if getline(n) =~ '\<DTD\s\+XHTML\s'
- setf xhtml
- return
- endif
- if getline(n) =~ '{%\s*\(extends\|block\|load\)\>\|{#\s\+'
- setf htmldjango
- return
- endif
- let n = n + 1
- endwhile
- setf html
-endfunc
+au BufNewFile,BufRead *.html,*.htm,*.shtml,*.stm call dist#ft#FThtml()
" HTML with Ruby - eRuby
au BufNewFile,BufRead *.erb,*.rhtml setf eruby
@@ -905,20 +726,7 @@ au BufNewFile,BufRead *.htt,*.htb setf httest
au BufNewFile,BufRead *.icn setf icon
" IDL (Interface Description Language)
-au BufNewFile,BufRead *.idl call s:FTidl()
-
-" Distinguish between standard IDL and MS-IDL
-func! s:FTidl()
- let n = 1
- while n < 50 && n < line("$")
- if getline(n) =~ '^\s*import\s\+"\(unknwn\|objidl\)\.idl"'
- setf msidl
- return
- endif
- let n = n + 1
- endwhile
- setf idl
-endfunc
+au BufNewFile,BufRead *.idl call dist#ft#FTidl()
" Microsoft IDL (Interface Description Language) Also *.idl
" MOF = WMI (Windows Management Instrumentation) Managed Object Format
@@ -929,25 +737,10 @@ au BufNewFile,BufRead */.icewm/menu setf icemenu
" Indent profile (must come before IDL *.pro!)
au BufNewFile,BufRead .indent.pro setf indent
-au BufNewFile,BufRead indent.pro call s:ProtoCheck('indent')
+au BufNewFile,BufRead indent.pro call dist#ft#ProtoCheck('indent')
" IDL (Interactive Data Language)
-au BufNewFile,BufRead *.pro call s:ProtoCheck('idlang')
-
-" Distinguish between "default" and Cproto prototype file. */
-func! s:ProtoCheck(default)
- " Cproto files have a comment in the first line and a function prototype in
- " the second line, it always ends in ";". Indent files may also have
- " comments, thus we can't match comments to see the difference.
- " IDL files can have a single ';' in the second line, require at least one
- " chacter before the ';'.
- if getline(2) =~ '.;$'
- setf cpp
- else
- exe 'setf ' . a:default
- endif
-endfunc
-
+au BufNewFile,BufRead *.pro call dist#ft#ProtoCheck('idlang')
" Indent RC
au BufNewFile,BufRead indentrc setf indent
@@ -960,7 +753,7 @@ au BufNewFile,BufRead */etc/initng/*/*.i,*.ii setf initng
" Innovation Data Processing
au BufRead,BufNewFile upstream.dat\c,upstream.*.dat\c,*.upstream.dat\c setf upstreamdat
-au BufRead,BufNewFile upstream.log\c,upstream.*.log\c,*.upstream.log\c setf upstreamlog
+au BufRead,BufNewFile fdrupstream.log,upstream.log\c,upstream.*.log\c,*.upstream.log\c,UPSTREAM-*.log\c setf upstreamlog
au BufRead,BufNewFile upstreaminstall.log\c,upstreaminstall.*.log\c,*.upstreaminstall.log\c setf upstreaminstalllog
au BufRead,BufNewFile usserver.log\c,usserver.*.log\c,*.usserver.log\c setf usserverlog
au BufRead,BufNewFile usw2kagt.log\c,usw2kagt.*.log\c,*.usw2kagt.log\c setf usw2kagtlog
@@ -996,7 +789,7 @@ au BufNewFile,BufRead *.java,*.jav setf java
au BufNewFile,BufRead *.jj,*.jjt setf javacc
" JavaScript, ECMAScript
-au BufNewFile,BufRead *.js,*.javascript,*.es,*.jsx setf javascript
+au BufNewFile,BufRead *.js,*.javascript,*.es,*.jsx,*.mjs setf javascript
" Java Server Pages
au BufNewFile,BufRead *.jsp setf jsp
@@ -1015,7 +808,7 @@ au BufNewFile,BufRead *.jgr setf jgraph
au BufNewFile,BufRead *.jov,*.j73,*.jovial setf jovial
" JSON
-au BufNewFile,BufRead *.json,*.jsonp setf json
+au BufNewFile,BufRead *.json,*.jsonp,*.webmanifest setf json
" Kixtart
au BufNewFile,BufRead *.kix setf kix
@@ -1124,8 +917,8 @@ au BufNewFile,BufRead *.m4
" MaGic Point
au BufNewFile,BufRead *.mgp setf mgp
-" Mail (for Elm, trn, mutt, muttng, rn, slrn)
-au BufNewFile,BufRead snd.\d\+,.letter,.letter.\d\+,.followup,.article,.article.\d\+,pico.\d\+,mutt{ng,}-*-\w\+,mutt[[:alnum:]_-]\\\{6\},ae\d\+.txt,/tmp/SLRN[0-9A-Z.]\+,*.eml setf mail
+" Mail (for Elm, trn, mutt, muttng, rn, slrn, neomutt)
+au BufNewFile,BufRead snd.\d\+,.letter,.letter.\d\+,.followup,.article,.article.\d\+,pico.\d\+,mutt{ng,}-*-\w\+,mutt[[:alnum:]_-]\\\{6\},neomutt-*-\w\+,neomutt[[:alnum:]_-]\\\{6\},ae\d\+.txt,/tmp/SLRN[0-9A-Z.]\+,*.eml setf mail
" Mail aliases
au BufNewFile,BufRead */etc/mail/aliases,*/etc/aliases setf mailaliases
@@ -1143,7 +936,7 @@ au BufNewFile,BufRead *.ist,*.mst setf ist
au BufNewFile,BufRead *.page setf mallard
" Manpage
-au BufNewFile,BufRead *.man setf man
+au BufNewFile,BufRead *.man setf nroff
" Man config
au BufNewFile,BufRead */etc/man.conf,man.config setf manconf
@@ -1160,33 +953,8 @@ au BufNewFile,BufRead *.markdown,*.mdown,*.mkd,*.mkdn,*.mdwn,*.md setf markdown
" Mason
au BufNewFile,BufRead *.mason,*.mhtml,*.comp setf mason
-" Matlab or Objective C
-au BufNewFile,BufRead *.m call s:FTm()
-
-func! s:FTm()
- let n = 1
- while n < 10
- let line = getline(n)
- if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|/\*\|//\)'
- setf objc
- return
- endif
- if line =~ '^\s*%'
- setf matlab
- return
- endif
- if line =~ '^\s*(\*'
- setf mma
- return
- endif
- let n = n + 1
- endwhile
- if exists("g:filetype_m")
- exe "setf " . g:filetype_m
- else
- setf matlab
- endif
-endfunc
+" Mathematica, Matlab, Murphi or Objective C
+au BufNewFile,BufRead *.m call dist#ft#FTm()
" Mathematica notebook
au BufNewFile,BufRead *.nb setf mma
@@ -1216,29 +984,11 @@ au BufNewFile,BufRead *.mgl setf mgl
au BufNewFile,BufRead *.mix,*.mixal setf mix
" MMIX or VMS makefile
-au BufNewFile,BufRead *.mms call s:FTmms()
+au BufNewFile,BufRead *.mms call dist#ft#FTmms()
" Symbian meta-makefile definition (MMP)
au BufNewFile,BufRead *.mmp setf mmp
-func! s:FTmms()
- let n = 1
- while n < 10
- let line = getline(n)
- if line =~ '^\s*\(%\|//\)' || line =~ '^\*'
- setf mmix
- return
- endif
- if line =~ '^\s*#'
- setf make
- return
- endif
- let n = n + 1
- endwhile
- setf mmix
-endfunc
-
-
" Modsim III (or LambdaProlog)
au BufNewFile,BufRead *.mod
\ if getline(1) =~ '\<module\>' |
@@ -1292,6 +1042,9 @@ au BufNewFile,BufRead *.mush setf mush
" Mutt setup file (also for Muttng)
au BufNewFile,BufRead Mutt{ng,}rc setf muttrc
+" N1QL
+au BufRead,BufNewfile *.n1ql,*.nql setf n1ql
+
" Nano
au BufNewFile,BufRead */etc/nanorc,*.nanorc setf nanorc
@@ -1301,6 +1054,9 @@ au BufNewFile,BufRead */etc/nanorc,*.nanorc setf nanorc
" Natural
au BufNewFile,BufRead *.NS[ACGLMNPS] setf natural
+" Noemutt setup file
+au BufNewFile,BufRead Neomuttrc setf neomuttrc
+
" Netrc
au BufNewFile,BufRead .netrc setf netrc
@@ -1316,37 +1072,17 @@ au BufNewFile,BufRead *.me
\ setf nroff |
\ endif
au BufNewFile,BufRead *.tr,*.nr,*.roff,*.tmac,*.mom setf nroff
-au BufNewFile,BufRead *.[1-9] call s:FTnroff()
-
-" This function checks if one of the first five lines start with a dot. In
-" that case it is probably an nroff file: 'filetype' is set and 1 is returned.
-func! s:FTnroff()
- if getline(1)[0] . getline(2)[0] . getline(3)[0] . getline(4)[0] . getline(5)[0] =~ '\.'
- setf nroff
- return 1
- endif
- return 0
-endfunc
+au BufNewFile,BufRead *.[1-9] call dist#ft#FTnroff()
" Nroff or Objective C++
-au BufNewFile,BufRead *.mm call s:FTmm()
-
-func! s:FTmm()
- let n = 1
- while n < 10
- let line = getline(n)
- if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|/\*\)'
- setf objcpp
- return
- endif
- let n = n + 1
- endwhile
- setf nroff
-endfunc
+au BufNewFile,BufRead *.mm call dist#ft#FTmm()
" Not Quite C
au BufNewFile,BufRead *.nqc setf nqc
+" NSE - Nmap Script Engine - uses Lua syntax
+au BufNewFile,BufRead *.nse setf lua
+
" NSIS
au BufNewFile,BufRead *.nsi,*.nsh setf nsis
@@ -1389,29 +1125,17 @@ au BufNewFile,BufRead *.dpr setf pascal
" PDF
au BufNewFile,BufRead *.pdf setf pdf
+" PCMK - HAE - crm configure edit
+au BufNewFile,BufRead *.pcmk setf pcmk
+
" Perl
if has("fname_case")
- au BufNewFile,BufRead *.pl,*.PL call s:FTpl()
+ au BufNewFile,BufRead *.pl,*.PL call dist#ft#FTpl()
else
- au BufNewFile,BufRead *.pl call s:FTpl()
+ au BufNewFile,BufRead *.pl call dist#ft#FTpl()
endif
-au BufNewFile,BufRead *.plx,*.al setf perl
-au BufNewFile,BufRead *.p6,*.pm6,*.pl6 setf perl6
-
-func! s:FTpl()
- if exists("g:filetype_pl")
- exe "setf " . g:filetype_pl
- else
- " recognize Prolog by specific text in the first non-empty line
- " require a blank after the '%' because Perl uses "%list" and "%translate"
- let l = getline(nextnonblank(1))
- if l =~ '\<prolog\>' || l =~ '^\s*\(%\+\(\s\|$\)\|/\*\)' || l =~ ':-'
- setf prolog
- else
- setf perl
- endif
- endif
-endfunc
+au BufNewFile,BufRead *.plx,*.al,*.psgi setf perl
+au BufNewFile,BufRead *.p6,*.pm6,*.pl6 setf perl6
" Perl, XPM or XPM2
au BufNewFile,BufRead *.pm
@@ -1425,15 +1149,16 @@ au BufNewFile,BufRead *.pm
" Perl POD
au BufNewFile,BufRead *.pod setf pod
-au BufNewFile,BufRead *.pod6 setf pod6
+au BufNewFile,BufRead *.pod6 setf pod6
" Php, php3, php4, etc.
" Also Phtml (was used for PHP 2 in the past)
" Also .ctp for Cake template file
au BufNewFile,BufRead *.php,*.php\d,*.phtml,*.ctp setf php
-" Pike
-au BufNewFile,BufRead *.pike,*.lpc,*.ulpc,*.pmod setf pike
+" Pike and Cmod
+au BufNewFile,BufRead *.pike,*.pmod setf pike
+au BufNewFile,BufRead *.cmod setf cmod
" Pinfo config
au BufNewFile,BufRead */etc/pinforc,*/.pinforc setf pinfo
@@ -1475,29 +1200,7 @@ au BufNewFile,BufRead *.pov setf pov
au BufNewFile,BufRead .povrayrc setf povini
" Povray, PHP or assembly
-au BufNewFile,BufRead *.inc call s:FTinc()
-
-func! s:FTinc()
- if exists("g:filetype_inc")
- exe "setf " . g:filetype_inc
- else
- let lines = getline(1).getline(2).getline(3)
- if lines =~? "perlscript"
- setf aspperl
- elseif lines =~ "<%"
- setf aspvbs
- elseif lines =~ "<?"
- setf php
- else
- call s:FTasmsyntax()
- if exists("b:asmsyntax")
- exe "setf " . fnameescape(b:asmsyntax)
- else
- setf pov
- endif
- endif
- endif
-endfunc
+au BufNewFile,BufRead *.inc call dist#ft#FTinc()
" Printcap and Termcap
au BufNewFile,BufRead *printcap
@@ -1526,74 +1229,13 @@ au BufNewFile,BufRead *.action setf privoxy
au BufNewFile,BufRead .procmail,.procmailrc setf procmail
" Progress or CWEB
-au BufNewFile,BufRead *.w call s:FTprogress_cweb()
-
-func! s:FTprogress_cweb()
- if exists("g:filetype_w")
- exe "setf " . g:filetype_w
- return
- endif
- if getline(1) =~ '&ANALYZE' || getline(3) =~ '&GLOBAL-DEFINE'
- setf progress
- else
- setf cweb
- endif
-endfunc
+au BufNewFile,BufRead *.w call dist#ft#FTprogress_cweb()
" Progress or assembly
-au BufNewFile,BufRead *.i call s:FTprogress_asm()
-
-func! s:FTprogress_asm()
- if exists("g:filetype_i")
- exe "setf " . g:filetype_i
- return
- endif
- " This function checks for an assembly comment the first ten lines.
- " If not found, assume Progress.
- let lnum = 1
- while lnum <= 10 && lnum < line('$')
- let line = getline(lnum)
- if line =~ '^\s*;' || line =~ '^\*'
- call s:FTasm()
- return
- elseif line !~ '^\s*$' || line =~ '^/\*'
- " Not an empty line: Doesn't look like valid assembly code.
- " Or it looks like a Progress /* comment
- break
- endif
- let lnum = lnum + 1
- endw
- setf progress
-endfunc
+au BufNewFile,BufRead *.i call dist#ft#FTprogress_asm()
" Progress or Pascal
-au BufNewFile,BufRead *.p call s:FTprogress_pascal()
-
-func! s:FTprogress_pascal()
- if exists("g:filetype_p")
- exe "setf " . g:filetype_p
- return
- endif
- " This function checks for valid Pascal syntax in the first ten lines.
- " Look for either an opening comment or a program start.
- " If not found, assume Progress.
- let lnum = 1
- while lnum <= 10 && lnum < line('$')
- let line = getline(lnum)
- if line =~ '^\s*\(program\|unit\|procedure\|function\|const\|type\|var\)\>'
- \ || line =~ '^\s*{' || line =~ '^\s*(\*'
- setf pascal
- return
- elseif line !~ '^\s*$' || line =~ '^/\*'
- " Not an empty line: Doesn't look like valid Pascal code.
- " Or it looks like a Progress /* comment
- break
- endif
- let lnum = lnum + 1
- endw
- setf progress
-endfunc
-
+au BufNewFile,BufRead *.p call dist#ft#FTprogress_pascal()
" Software Distributor Product Specification File (POSIX 1387.2-1995)
au BufNewFile,BufRead *.psf setf psf
@@ -1617,11 +1259,9 @@ au BufNewFile,BufRead */etc/protocols setf protocols
" Pyrex
au BufNewFile,BufRead *.pyx,*.pxd setf pyrex
-" Python
-au BufNewFile,BufRead *.py,*.pyw setf python
-
+" Python, Python Shell Startup and Python Stub Files
" Quixote (Python-based web framework)
-au BufNewFile,BufRead *.ptl setf python
+au BufNewFile,BufRead *.py,*.pyw,.pythonstartup,.pythonrc,*.ptl,*.pyi setf python
" Radiance
au BufNewFile,BufRead *.rad,*.mat setf radiance
@@ -1681,40 +1321,7 @@ else
endif
" Rexx, Rebol or R
-au BufNewFile,BufRead *.r,*.R call s:FTr()
-
-func! s:FTr()
- let max = line("$") > 50 ? 50 : line("$")
-
- for n in range(1, max)
- " Rebol is easy to recognize, check for that first
- if getline(n) =~? '\<REBOL\>'
- setf rebol
- return
- endif
- endfor
-
- for n in range(1, max)
- " R has # comments
- if getline(n) =~ '^\s*#'
- setf r
- return
- endif
- " Rexx has /* comments */
- if getline(n) =~ '^\s*/\*'
- setf rexx
- return
- endif
- endfor
-
- " Nothing recognized, use user default or assume Rexx
- if exists("g:filetype_r")
- exe "setf " . g:filetype_r
- else
- " Rexx used to be the default, but R appears to be much more popular.
- setf r
- endif
-endfunc
+au BufNewFile,BufRead *.r,*.R call dist#ft#FTr()
" Remind
au BufNewFile,BufRead .reminders,*.remind,*.rem setf remind
@@ -1752,6 +1359,9 @@ au BufNewFile,BufRead *.rb,*.rbw setf ruby
" RubyGems
au BufNewFile,BufRead *.gemspec setf ruby
+" Rust
+au BufNewFile,BufRead *.rs setf rust
+
" Rackup
au BufNewFile,BufRead *.ru setf ruby
@@ -1779,6 +1389,12 @@ au BufNewFile,BufRead *.sass setf sass
" Sather
au BufNewFile,BufRead *.sa setf sather
+" Scala
+au BufNewFile,BufRead *.scala setf scala
+
+" SBT - Scala Build Tool
+au BufNewFile,BufRead *.sbt setf sbt
+
" Scilab
au BufNewFile,BufRead *.sci,*.sce setf scilab
@@ -1794,30 +1410,14 @@ au BufNewFile,BufRead *.sdl,*.pr setf sdl
" sed
au BufNewFile,BufRead *.sed setf sed
-" Sieve (RFC 3028)
-au BufNewFile,BufRead *.siv setf sieve
+" Sieve (RFC 3028, 5228)
+au BufNewFile,BufRead *.siv,*.sieve setf sieve
" Sendmail
au BufNewFile,BufRead sendmail.cf setf sm
" Sendmail .mc files are actually m4. Could also be MS Message text file.
-au BufNewFile,BufRead *.mc call s:McSetf()
-
-func! s:McSetf()
- " Rely on the file to start with a comment.
- " MS message text files use ';', Sendmail files use '#' or 'dnl'
- for lnum in range(1, min([line("$"), 20]))
- let line = getline(lnum)
- if line =~ '^\s*\(#\|dnl\)'
- setf m4 " Sendmail .mc file
- return
- elseif line =~ '^\s*;'
- setf msmessages " MS Message text file
- return
- endif
- endfor
- setf m4 " Default: Sendmail .mc file
-endfunc
+au BufNewFile,BufRead *.mc call dist#ft#McSetf()
" Services
au BufNewFile,BufRead */etc/services setf services
@@ -1858,101 +1458,23 @@ au BufNewFile,BufRead sgml.catalog* call s:StarSetf('catalog')
" Shell scripts (sh, ksh, bash, bash2, csh); Allow .profile_foo etc.
" Gentoo ebuilds and Arch Linux PKGBUILDs are actually bash scripts
-au BufNewFile,BufRead .bashrc*,bashrc,bash.bashrc,.bash[_-]profile*,.bash[_-]logout*,.bash[_-]aliases*,*.bash,*/{,.}bash[_-]completion{,.d,.sh}{,/*},*.ebuild,*.eclass,PKGBUILD* call SetFileTypeSH("bash")
-au BufNewFile,BufRead .kshrc*,*.ksh call SetFileTypeSH("ksh")
-au BufNewFile,BufRead */etc/profile,.profile*,*.sh,*.env call SetFileTypeSH(getline(1))
+au BufNewFile,BufRead .bashrc*,bashrc,bash.bashrc,.bash[_-]profile*,.bash[_-]logout*,.bash[_-]aliases*,bash-fc[-.]*,*.bash,*/{,.}bash[_-]completion{,.d,.sh}{,/*},*.ebuild,*.eclass,PKGBUILD* call dist#ft#SetFileTypeSH("bash")
+au BufNewFile,BufRead .kshrc*,*.ksh call dist#ft#SetFileTypeSH("ksh")
+au BufNewFile,BufRead */etc/profile,.profile*,*.sh,*.env call dist#ft#SetFileTypeSH(getline(1))
" Shell script (Arch Linux) or PHP file (Drupal)
au BufNewFile,BufRead *.install
\ if getline(1) =~ '<?php' |
\ setf php |
\ else |
- \ call SetFileTypeSH("bash") |
+ \ call dist#ft#SetFileTypeSH("bash") |
\ endif
-" Also called from scripts.vim.
-func! SetFileTypeSH(name)
- if expand("<amatch>") =~ g:ft_ignore_pat
- return
- endif
- if a:name =~ '\<csh\>'
- " Some .sh scripts contain #!/bin/csh.
- call SetFileTypeShell("csh")
- return
- elseif a:name =~ '\<tcsh\>'
- " Some .sh scripts contain #!/bin/tcsh.
- call SetFileTypeShell("tcsh")
- return
- elseif a:name =~ '\<zsh\>'
- " Some .sh scripts contain #!/bin/zsh.
- call SetFileTypeShell("zsh")
- return
- elseif a:name =~ '\<ksh\>'
- let b:is_kornshell = 1
- if exists("b:is_bash")
- unlet b:is_bash
- endif
- if exists("b:is_sh")
- unlet b:is_sh
- endif
- elseif exists("g:bash_is_sh") || a:name =~ '\<bash\>' || a:name =~ '\<bash2\>'
- let b:is_bash = 1
- if exists("b:is_kornshell")
- unlet b:is_kornshell
- endif
- if exists("b:is_sh")
- unlet b:is_sh
- endif
- elseif a:name =~ '\<sh\>'
- let b:is_sh = 1
- if exists("b:is_kornshell")
- unlet b:is_kornshell
- endif
- if exists("b:is_bash")
- unlet b:is_bash
- endif
- endif
- call SetFileTypeShell("sh")
-endfunc
-
-" For shell-like file types, check for an "exec" command hidden in a comment,
-" as used for Tcl.
-" Also called from scripts.vim, thus can't be local to this script.
-func! SetFileTypeShell(name)
- if expand("<amatch>") =~ g:ft_ignore_pat
- return
- endif
- let l = 2
- while l < 20 && l < line("$") && getline(l) =~ '^\s*\(#\|$\)'
- " Skip empty and comment lines.
- let l = l + 1
- endwhile
- if l < line("$") && getline(l) =~ '\s*exec\s' && getline(l - 1) =~ '^\s*#.*\\$'
- " Found an "exec" line after a comment with continuation
- let n = substitute(getline(l),'\s*exec\s\+\([^ ]*/\)\=', '', '')
- if n =~ '\<tclsh\|\<wish'
- setf tcl
- return
- endif
- endif
- exe "setf " . a:name
-endfunc
-
" tcsh scripts
-au BufNewFile,BufRead .tcshrc*,*.tcsh,tcsh.tcshrc,tcsh.login call SetFileTypeShell("tcsh")
+au BufNewFile,BufRead .tcshrc*,*.tcsh,tcsh.tcshrc,tcsh.login call dist#ft#SetFileTypeShell("tcsh")
" csh scripts, but might also be tcsh scripts (on some systems csh is tcsh)
-au BufNewFile,BufRead .login*,.cshrc*,csh.cshrc,csh.login,csh.logout,*.csh,.alias call s:CSH()
-
-func! s:CSH()
- if exists("g:filetype_csh")
- call SetFileTypeShell(g:filetype_csh)
- elseif &shell =~ "tcsh"
- call SetFileTypeShell("tcsh")
- else
- call SetFileTypeShell("csh")
- endif
-endfunc
+au BufNewFile,BufRead .login*,.cshrc*,csh.cshrc,csh.login,csh.logout,*.csh,.alias call dist#ft#CSH()
" Z-Shell script
au BufNewFile,BufRead .zprofile,*/etc/zprofile,.zfbfmarks setf zsh
@@ -2023,42 +1545,7 @@ au BufNewFile,BufRead *.mib,*.my setf mib
" Snort Configuration
au BufNewFile,BufRead *.hog,snort.conf,vision.conf setf hog
-au BufNewFile,BufRead *.rules call s:FTRules()
-
-let s:ft_rules_udev_rules_pattern = '^\s*\cudev_rules\s*=\s*"\([^"]\{-1,}\)/*".*'
-func! s:FTRules()
- let path = expand('<amatch>:p')
- if path =~ '^/\(etc/udev/\%(rules\.d/\)\=.*\.rules\|lib/udev/\%(rules\.d/\)\=.*\.rules\)$'
- setf udevrules
- return
- endif
- if path =~ '^/etc/ufw/'
- setf conf " Better than hog
- return
- endif
- if path =~ '^/\(etc\|usr/share\)/polkit-1/rules\.d'
- setf javascript
- return
- endif
- try
- let config_lines = readfile('/etc/udev/udev.conf')
- catch /^Vim\%((\a\+)\)\=:E484/
- setf hog
- return
- endtry
- let dir = expand('<amatch>:p:h')
- for line in config_lines
- if line =~ s:ft_rules_udev_rules_pattern
- let udev_rules = substitute(line, s:ft_rules_udev_rules_pattern, '\1', "")
- if dir == udev_rules
- setf udevrules
- endif
- break
- endif
- endfor
- setf hog
-endfunc
-
+au BufNewFile,BufRead *.rules call dist#ft#FTRules()
" Spec (Linux RPM)
au BufNewFile,BufRead *.spec setf spec
@@ -2082,15 +1569,7 @@ au BufNewFile,BufRead squid.conf setf squid
au BufNewFile,BufRead *.tyb,*.typ,*.tyc,*.pkb,*.pks setf sql
" SQL
-au BufNewFile,BufRead *.sql call s:SQL()
-
-func! s:SQL()
- if exists("g:filetype_sql")
- exe "setf " . g:filetype_sql
- else
- setf sql
- endif
-endfunc
+au BufNewFile,BufRead *.sql call dist#ft#SQL()
" SQLJ
au BufNewFile,BufRead *.sqlj setf sqlj
@@ -2105,7 +1584,10 @@ au BufNewFile,BufRead ssh_config,*/.ssh/config setf sshconfig
au BufNewFile,BufRead sshd_config setf sshdconfig
" Stata
-au BufNewFile,BufRead *.ado,*.class,*.do,*.imata,*.mata setf stata
+au BufNewFile,BufRead *.ado,*.do,*.imata,*.mata setf stata
+" Also *.class, but not when it's a Java bytecode file
+au BufNewFile,BufRead *.class
+ \ if getline(1) !~ "^\xca\xfe\xba\xbe" | setf stata | endif
" SMCL
au BufNewFile,BufRead *.hlp,*.ihlp,*.smcl setf smcl
@@ -2134,32 +1616,9 @@ au BufNewFile,BufRead */etc/sudoers,sudoers.tmp setf sudoers
" SVG (Scalable Vector Graphics)
au BufNewFile,BufRead *.svg setf svg
-" If the file has an extension of 't' and is in a directory 't' or 'xt' then
-" it is almost certainly a Perl test file.
-" If the first line starts with '#' and contains 'perl' it's probably a Perl
-" file.
-" (Slow test) If a file contains a 'use' statement then it is almost certainly
-" a Perl file.
-func! s:FTperl()
- let dirname = expand("%:p:h:t")
- if expand("%:e") == 't' && (dirname == 't' || dirname == 'xt')
- setf perl
- return 1
- endif
- if getline(1)[0] == '#' && getline(1) =~ 'perl'
- setf perl
- return 1
- endif
- if search('^use\s\s*\k', 'nc', 30)
- setf perl
- return 1
- endif
- return 0
-endfunc
-
" Tads (or Nroff or Perl test file)
au BufNewFile,BufRead *.t
- \ if !s:FTnroff() && !s:FTperl() | setf tads | endif
+ \ if !dist#ft#FTnroff() && !dist#ft#FTperl() | setf tads | endif
" Tags
au BufNewFile,BufRead tags setf tags
@@ -2188,62 +1647,10 @@ au BufNewFile,BufRead *.ti setf terminfo
" TeX
au BufNewFile,BufRead *.latex,*.sty,*.dtx,*.ltx,*.bbl setf tex
-au BufNewFile,BufRead *.tex call s:FTtex()
-
-" Choose context, plaintex, or tex (LaTeX) based on these rules:
-" 1. Check the first line of the file for "%&<format>".
-" 2. Check the first 1000 non-comment lines for LaTeX or ConTeXt keywords.
-" 3. Default to "latex" or to g:tex_flavor, can be set in user's vimrc.
-func! s:FTtex()
- let firstline = getline(1)
- if firstline =~ '^%&\s*\a\+'
- let format = tolower(matchstr(firstline, '\a\+'))
- let format = substitute(format, 'pdf', '', '')
- if format == 'tex'
- let format = 'plain'
- endif
- else
- " Default value, may be changed later:
- let format = exists("g:tex_flavor") ? g:tex_flavor : 'plain'
- " Save position, go to the top of the file, find first non-comment line.
- let save_cursor = getpos('.')
- call cursor(1,1)
- let firstNC = search('^\s*[^[:space:]%]', 'c', 1000)
- if firstNC " Check the next thousand lines for a LaTeX or ConTeXt keyword.
- let lpat = 'documentclass\>\|usepackage\>\|begin{\|newcommand\>\|renewcommand\>'
- let cpat = 'start\a\+\|setup\a\+\|usemodule\|enablemode\|enableregime\|setvariables\|useencoding\|usesymbols\|stelle\a\+\|verwende\a\+\|stel\a\+\|gebruik\a\+\|usa\a\+\|imposta\a\+\|regle\a\+\|utilisemodule\>'
- let kwline = search('^\s*\\\%(' . lpat . '\)\|^\s*\\\(' . cpat . '\)',
- \ 'cnp', firstNC + 1000)
- if kwline == 1 " lpat matched
- let format = 'latex'
- elseif kwline == 2 " cpat matched
- let format = 'context'
- endif " If neither matched, keep default set above.
- " let lline = search('^\s*\\\%(' . lpat . '\)', 'cn', firstNC + 1000)
- " let cline = search('^\s*\\\%(' . cpat . '\)', 'cn', firstNC + 1000)
- " if cline > 0
- " let format = 'context'
- " endif
- " if lline > 0 && (cline == 0 || cline > lline)
- " let format = 'tex'
- " endif
- endif " firstNC
- call setpos('.', save_cursor)
- endif " firstline =~ '^%&\s*\a\+'
-
- " Translation from formats to file types. TODO: add AMSTeX, RevTex, others?
- if format == 'plain'
- setf plaintex
- elseif format == 'context'
- setf context
- else " probably LaTeX
- setf tex
- endif
- return
-endfunc
+au BufNewFile,BufRead *.tex call dist#ft#FTtex()
" ConTeXt
-au BufNewFile,BufRead tex/context/*/*.tex,*.mkii,*.mkiv setf context
+au BufNewFile,BufRead *.mkii,*.mkiv,*.mkvi setf context
" Texinfo
au BufNewFile,BufRead *.texinfo,*.texi,*.txi setf texinfo
@@ -2257,6 +1664,9 @@ au BufNewFile,BufRead .tidyrc,tidyrc setf tidy
" TF mud client
au BufNewFile,BufRead *.tf,.tfrc,tfrc setf tf
+" tmux configuration
+au BufNewFile,BufRead {.,}tmux*.conf setf tmux
+
" TPP - Text Presentation Program
au BufNewFile,BufReadPost *.tpp setf tpp
@@ -2303,7 +1713,7 @@ au BufNewFile,BufRead */etc/updatedb.conf setf updatedb
au BufNewFile,BufRead */usr/share/upstart/*.conf setf upstart
au BufNewFile,BufRead */usr/share/upstart/*.override setf upstart
au BufNewFile,BufRead */etc/init/*.conf,*/etc/init/*.override setf upstart
-au BufNewFile,BufRead */.init/*.conf,*/.init/*.override setf upstart
+au BufNewFile,BufRead */.init/*.conf,*/.init/*.override setf upstart
au BufNewFile,BufRead */.config/upstart/*.conf setf upstart
au BufNewFile,BufRead */.config/upstart/*.override setf upstart
@@ -2338,7 +1748,7 @@ au BufRead,BufNewFile *.hw,*.module,*.pkg
\ endif
" Visual Basic (also uses *.bas) or FORM
-au BufNewFile,BufRead *.frm call s:FTVB("form")
+au BufNewFile,BufRead *.frm call dist#ft#FTVB("form")
" SaxBasic is close to Visual Basic
au BufNewFile,BufRead *.sba setf vb
@@ -2355,6 +1765,9 @@ au BufNewFile,BufRead *.vroom setf vroom
" Webmacro
au BufNewFile,BufRead *.wm setf webmacro
+" WebAssembly
+au BufNewFile,BufRead *.wast,*.wat setf wast
+
" Wget config
au BufNewFile,BufRead .wgetrc,wgetrc setf wget
@@ -2367,6 +1780,9 @@ au BufNewFile,BufRead *.wbt setf winbatch
" WSML
au BufNewFile,BufRead *.wsml setf wsml
+" WPL
+au BufNewFile,BufRead *.wpl setf xml
+
" WvDial
au BufNewFile,BufRead wvdial.conf,.wvdialrc setf wvdial
@@ -2425,36 +1841,10 @@ au BufNewFile,BufRead .Xdefaults,.Xpdefaults,.Xresources,xdm-config,*.ad setf xd
" Xmath
au BufNewFile,BufRead *.msc,*.msf setf xmath
au BufNewFile,BufRead *.ms
- \ if !s:FTnroff() | setf xmath | endif
+ \ if !dist#ft#FTnroff() | setf xmath | endif
" XML specific variants: docbk and xbl
-au BufNewFile,BufRead *.xml call s:FTxml()
-
-func! s:FTxml()
- let n = 1
- while n < 100 && n < line("$")
- let line = getline(n)
- " DocBook 4 or DocBook 5.
- let is_docbook4 = line =~ '<!DOCTYPE.*DocBook'
- let is_docbook5 = line =~ ' xmlns="http://docbook.org/ns/docbook"'
- if is_docbook4 || is_docbook5
- let b:docbk_type = "xml"
- if is_docbook5
- let b:docbk_ver = 5
- else
- let b:docbk_ver = 4
- endif
- setf docbk
- return
- endif
- if line =~ 'xmlns:xbl="http://www.mozilla.org/xbl"'
- setf xbl
- return
- endif
- let n += 1
- endwhile
- setf xml
-endfunc
+au BufNewFile,BufRead *.xml call dist#ft#FTxml()
" XMI (holding UML models) is also XML
au BufNewFile,BufRead *.xmi setf xml
@@ -2474,6 +1864,9 @@ au BufNewFile,BufRead */etc/xdg/menus/*.menu setf xml
" ATI graphics driver configuration
au BufNewFile,BufRead fglrxrc setf xml
+" Web Services Description Language (WSDL)
+au BufNewFile,BufRead *.wsdl setf xml
+
" XLIFF (XML Localisation Interchange File Format) is also XML
au BufNewFile,BufRead *.xlf setf xml
au BufNewFile,BufRead *.xliff setf xml
@@ -2497,29 +1890,14 @@ au BufNewFile,BufRead *.xsl,*.xslt setf xslt
au BufNewFile,BufRead *.yy,*.yxx,*.y++ setf yacc
" Yacc or racc
-au BufNewFile,BufRead *.y call s:FTy()
-
-func! s:FTy()
- let n = 1
- while n < 100 && n < line("$")
- let line = getline(n)
- if line =~ '^\s*%'
- setf yacc
- return
- endif
- if getline(n) =~ '^\s*\(#\|class\>\)' && getline(n) !~ '^\s*#\s*include'
- setf racc
- return
- endif
- let n = n + 1
- endwhile
- setf yacc
-endfunc
-
+au BufNewFile,BufRead *.y call dist#ft#FTy()
" Yaml
au BufNewFile,BufRead *.yaml,*.yml setf yaml
+" Raml
+au BufNewFile,BufRead *.raml setf raml
+
" yum conf (close enough to dosini)
au BufNewFile,BufRead */etc/yum.conf setf dosini
@@ -2531,9 +1909,9 @@ au BufNewFile,BufRead *.zut setf zimbutempl
" Zope
" dtml (zope dynamic template markup language), pt (zope page template),
" cpt (zope form controller page template)
-au BufNewFile,BufRead *.dtml,*.pt,*.cpt call s:FThtml()
+au BufNewFile,BufRead *.dtml,*.pt,*.cpt call dist#ft#FThtml()
" zsql (zope sql method)
-au BufNewFile,BufRead *.zsql call s:SQL()
+au BufNewFile,BufRead *.zsql call dist#ft#SQL()
" Z80 assembler asz80
au BufNewFile,BufRead *.z8a setf z8a
@@ -2564,6 +1942,9 @@ au StdinReadPost * if !did_filetype() | runtime! scripts.vim | endif
" Most of these should call s:StarSetf() to avoid names ending in .gz and the
" like are used.
+" More Apache style config files
+au BufNewFile,BufRead */etc/proftpd/*.conf*,*/etc/proftpd/conf.*/* call s:StarSetf('apachestyle')
+
" More Apache config files
au BufNewFile,BufRead access.conf*,apache.conf*,apache2.conf*,httpd.conf*,srm.conf* call s:StarSetf('apache')
au BufNewFile,BufRead */etc/apache2/*.conf*,*/etc/apache2/conf.*/*,*/etc/apache2/mods-*/*,*/etc/apache2/sites-*/*,*/etc/httpd/conf.d/*.conf* call s:StarSetf('apache')
@@ -2575,6 +1956,11 @@ au BufNewFile,BufRead *asterisk*/*voicemail.conf* call s:StarSetf('asteriskvm')
" Bazaar version control
au BufNewFile,BufRead bzr_log.* setf bzr
+" Bazel build file
+if !has("fname_case")
+ au BufNewFile,BufRead BUILD setf bzl
+endif
+
" BIND zone
au BufNewFile,BufRead */named/db.*,*/bind/db.* call s:StarSetf('bindzone')
@@ -2642,7 +2028,9 @@ au BufNewFile,BufRead [mM]akefile* call s:StarSetf('make')
au BufNewFile,BufRead [rR]akefile* call s:StarSetf('ruby')
" Mail (also matches muttrc.vim, so this is below the other checks)
-au BufNewFile,BufRead mutt[[:alnum:]._-]\\\{6\} setf mail
+au BufNewFile,BufRead {neo,}mutt[[:alnum:]._-]\\\{6\} setf mail
+
+au BufNewFile,BufRead reportbug-* call s:StarSetf('mail')
" Modconf
au BufNewFile,BufRead */etc/modutils/*
@@ -2655,9 +2043,16 @@ au BufNewFile,BufRead */etc/modprobe.* call s:StarSetf('modconf')
au BufNewFile,BufRead .mutt{ng,}rc*,*/.mutt{ng,}/mutt{ng,}rc* call s:StarSetf('muttrc')
au BufNewFile,BufRead mutt{ng,}rc*,Mutt{ng,}rc* call s:StarSetf('muttrc')
+" Neomutt setup file
+au BufNewFile,BufRead .neomuttrc*,*/.neomutt/neomuttrc* call s:StarSetf('neomuttrc')
+au BufNewFile,BufRead neomuttrc*,Neomuttrc* call s:StarSetf('neomuttrc')
+
" Nroff macros
au BufNewFile,BufRead tmac.* call s:StarSetf('nroff')
+" OpenBSD hostname.if
+au BufNewFile,BufRead /etc/hostname.* call s:StarSetf('config')
+
" Pam conf
au BufNewFile,BufRead */etc/pam.d/* call s:StarSetf('pamconf')
@@ -2673,17 +2068,7 @@ au BufNewFile,BufRead *termcap*
" ReDIF
" Only used when the .rdf file was not detected to be XML.
-au BufRead,BufNewFile *.rdf call s:Redif()
-func! s:Redif()
- let lnum = 1
- while lnum <= 5 && lnum < line('$')
- if getline(lnum) =~ "^\ctemplate-type:"
- setf redif
- return
- endif
- let lnum = lnum + 1
- endwhile
-endfunc
+au BufRead,BufNewFile *.rdf call dist#ft#Redif()
" Remind
au BufNewFile,BufRead .reminders* call s:StarSetf('remind')
@@ -2721,8 +2106,13 @@ au BufNewFile,BufRead zsh*,zlog* call s:StarSetf('zsh')
" Plain text files, needs to be far down to not override others. This avoids
" the "conf" type being used if there is a line starting with '#'.
-au BufNewFile,BufRead *.txt,*.text,README setf text
+au BufNewFile,BufRead *.text,README setf text
+" Help files match *.txt but should have a last line that is a modeline.
+au BufNewFile,BufRead *.txt
+ \ if getline('$') !~ 'vim:.*ft=help'
+ \| setf text
+ \| endif
" Use the filetype detect plugins. They may overrule any of the previously
" detected filetypes.
@@ -2733,12 +2123,12 @@ runtime! ftdetect/*.vim
" state.
augroup END
-" Generic configuration file (check this last, it's just guessing!)
+" Generic configuration file. Use FALLBACK, it's just guessing!
au filetypedetect BufNewFile,BufRead,StdinReadPost *
\ if !did_filetype() && expand("<amatch>") !~ g:ft_ignore_pat
\ && (getline(1) =~ '^#' || getline(2) =~ '^#' || getline(3) =~ '^#'
\ || getline(4) =~ '^#' || getline(5) =~ '^#') |
- \ setf conf |
+ \ setf FALLBACK conf |
\ endif
diff --git a/runtime/ftplugin/a2ps.vim b/runtime/ftplugin/a2ps.vim
index 6653351949..0e24e3088f 100644
--- a/runtime/ftplugin/a2ps.vim
+++ b/runtime/ftplugin/a2ps.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: a2ps(1) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: a2ps(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/alsaconf.vim b/runtime/ftplugin/alsaconf.vim
index 5d763c8011..6d9d80a208 100644
--- a/runtime/ftplugin/alsaconf.vim
+++ b/runtime/ftplugin/alsaconf.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: alsaconf(8) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: alsaconf(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/arch.vim b/runtime/ftplugin/arch.vim
index 71d831e112..1c697b8ca1 100644
--- a/runtime/ftplugin/arch.vim
+++ b/runtime/ftplugin/arch.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: GNU Arch inventory file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: GNU Arch inventory file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/automake.vim b/runtime/ftplugin/automake.vim
index 20b06af362..9f981a7a83 100644
--- a/runtime/ftplugin/automake.vim
+++ b/runtime/ftplugin/automake.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: Automake
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: Automake
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/awk.vim b/runtime/ftplugin/awk.vim
new file mode 100644
index 0000000000..dcefc85ec3
--- /dev/null
+++ b/runtime/ftplugin/awk.vim
@@ -0,0 +1,18 @@
+" Vim filetype plugin
+" Language: awk, nawk, gawk, mawk
+" Maintainer: Antonio Colombo <azc100@gmail.com>
+" Last Change: 2017 Feb 17
+
+" This plugin was prepared by Mark Sikora
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl commentstring<"
+
+setlocal commentstring=#\ %s
diff --git a/runtime/ftplugin/bdf.vim b/runtime/ftplugin/bdf.vim
index 120c5df968..85b7b4042a 100644
--- a/runtime/ftplugin/bdf.vim
+++ b/runtime/ftplugin/bdf.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: BDF font definition
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: BDF font definition
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/c.vim b/runtime/ftplugin/c.vim
index 487ce7a165..6047f9f863 100644
--- a/runtime/ftplugin/c.vim
+++ b/runtime/ftplugin/c.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
" Language: C
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2012 Jul 10
+" Last Change: 2017 Sep 28
" Only do this when not done yet for this buffer
if exists("b:did_ftplugin")
@@ -30,9 +30,9 @@ endif
setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
" When the matchit plugin is loaded, this makes the % command skip parens and
-" braces in comments.
-let b:match_words = &matchpairs . ',^\s*#\s*if\(\|def\|ndef\)\>:^\s*#\s*elif\>:^\s*#\s*else\>:^\s*#\s*endif\>'
-let b:match_skip = 's:comment\|string\|character'
+" braces in comments properly.
+let b:match_words = '^\s*#\s*if\(\|def\|ndef\)\>:^\s*#\s*elif\>:^\s*#\s*else\>:^\s*#\s*endif\>'
+let b:match_skip = 's:comment\|string\|character\|special'
" Win32 can filter files in the browse dialog
if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
@@ -55,5 +55,7 @@ if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
endif
endif
+let b:man_default_sects = '3,2'
+
let &cpo = s:cpo_save
unlet s:cpo_save
diff --git a/runtime/ftplugin/calendar.vim b/runtime/ftplugin/calendar.vim
index 6f117e36e5..f454ba1dc8 100644
--- a/runtime/ftplugin/calendar.vim
+++ b/runtime/ftplugin/calendar.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: calendar(1) input file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: calendar(1) input file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/cdrdaoconf.vim b/runtime/ftplugin/cdrdaoconf.vim
index 557fd82c53..563bb8f5f1 100644
--- a/runtime/ftplugin/cdrdaoconf.vim
+++ b/runtime/ftplugin/cdrdaoconf.vim
@@ -1,6 +1,6 @@
" Vim filetype plugin file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2007-12-04
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-12-04
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/chicken.vim b/runtime/ftplugin/chicken.vim
new file mode 100644
index 0000000000..4dc1e57d0a
--- /dev/null
+++ b/runtime/ftplugin/chicken.vim
@@ -0,0 +1,54 @@
+" CHICKEN-specific Vim customizations
+" Last Change: 2018-03-05
+" Author: Evan Hanson <evhan@foldling.org>
+" Maintainer: Evan Hanson <evhan@foldling.org>
+" URL: https://foldling.org/vim/ftplugin/chicken.vim
+" Notes: These are supplemental settings, to be loaded after the core
+" Scheme ftplugin file (ftplugin/scheme.vim). Enable it by setting
+" b:is_chicken=1 and filetype=scheme.
+
+if !exists('b:did_scheme_ftplugin')
+ finish
+endif
+
+setl keywordprg=chicken-doc
+
+setl lispwords+=and-let*
+setl lispwords+=compiler-typecase
+setl lispwords+=condition-case
+setl lispwords+=define-compiler-syntax
+setl lispwords+=define-constant
+setl lispwords+=define-external
+setl lispwords+=define-for-syntax
+setl lispwords+=define-foreign-type
+setl lispwords+=define-inline
+setl lispwords+=define-location
+setl lispwords+=define-record
+setl lispwords+=define-record-printer
+setl lispwords+=define-specialization
+setl lispwords+=fluid-let
+setl lispwords+=foreign-lambda*
+setl lispwords+=foreign-primitive
+setl lispwords+=foreign-safe-lambda*
+setl lispwords+=functor
+setl lispwords+=handle-exceptions
+setl lispwords+=let-compiler-syntax
+setl lispwords+=let-location
+setl lispwords+=let-optionals
+setl lispwords+=let-optionals*
+setl lispwords+=letrec-values
+setl lispwords+=match
+setl lispwords+=match-let
+setl lispwords+=match-let*
+setl lispwords+=match-letrec
+setl lispwords+=module
+setl lispwords+=receive
+setl lispwords+=set!-values
+setl lispwords+=test-group
+
+let b:undo_ftplugin = b:undo_ftplugin . ' keywordprg<'
+
+if exists('g:loaded_matchit') && !exists('b:match_words')
+ let b:match_words = '#>:<#'
+ let b:undo_ftplugin = b:undo_ftplugin . ' | unlet! b:match_words'
+endif
diff --git a/runtime/ftplugin/clojure.vim b/runtime/ftplugin/clojure.vim
index 10fcb9f205..217711f26e 100644
--- a/runtime/ftplugin/clojure.vim
+++ b/runtime/ftplugin/clojure.vim
@@ -1,11 +1,11 @@
" Vim filetype plugin file
-" Language: Clojure
-" Author: Meikel Brandmeyer <mb@kotka.de>
+" Language: Clojure
+" Author: Meikel Brandmeyer <mb@kotka.de>
"
-" Maintainer: Sung Pae <self@sungpae.com>
-" URL: https://github.com/guns/vim-clojure-static
-" License: Same as Vim
-" Last Change: 27 March 2014
+" Maintainer: Sung Pae <self@sungpae.com>
+" URL: https://github.com/guns/vim-clojure-static
+" License: Same as Vim
+" Last Change: 18 July 2016
if exists("b:did_ftplugin")
finish
@@ -43,7 +43,7 @@ setlocal commentstring=;\ %s
" specially and hence are not indented specially.
"
" -*- LISPWORDS -*-
-" Generated from https://github.com/guns/vim-clojure-static/blob/vim-release-010/clj/src/vim_clojure_static/generate.clj
+" Generated from https://github.com/guns/vim-clojure-static/blob/vim-release-011/clj/src/vim_clojure_static/generate.clj
setlocal lispwords=as->,binding,bound-fn,case,catch,cond->,cond->>,condp,def,definline,definterface,defmacro,defmethod,defmulti,defn,defn-,defonce,defprotocol,defrecord,defstruct,deftest,deftest-,deftype,doseq,dotimes,doto,extend,extend-protocol,extend-type,fn,for,if,if-let,if-not,if-some,let,letfn,locking,loop,ns,proxy,reify,set-test,testing,when,when-first,when-let,when-not,when-some,while,with-bindings,with-in-str,with-local-vars,with-open,with-precision,with-redefs,with-redefs-fn,with-test
" Provide insert mode completions for special forms and clojure.core. As
@@ -82,9 +82,9 @@ endif
" Win32 can filter files in the browse dialog
if has("gui_win32") && !exists("b:browsefilter")
let b:browsefilter = "Clojure Source Files (*.clj)\t*.clj\n" .
- \ "ClojureScript Source Files (*.cljs)\t*.cljs\n" .
- \ "Java Source Files (*.java)\t*.java\n" .
- \ "All Files (*.*)\t*.*\n"
+ \ "ClojureScript Source Files (*.cljs)\t*.cljs\n" .
+ \ "Java Source Files (*.java)\t*.java\n" .
+ \ "All Files (*.*)\t*.*\n"
let b:undo_ftplugin .= ' | unlet! b:browsefilter'
endif
diff --git a/runtime/ftplugin/cmake.vim b/runtime/ftplugin/cmake.vim
new file mode 100644
index 0000000000..94c007629b
--- /dev/null
+++ b/runtime/ftplugin/cmake.vim
@@ -0,0 +1,34 @@
+" Vim filetype plugin
+" Language: CMake
+" Maintainer: Keith Smiley <keithbsmiley@gmail.com>
+" Last Change: 2018 Aug 30
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" save 'cpo' for restoration at the end of this file
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl commentstring<"
+
+if exists('loaded_matchit')
+ let b:match_words = '\<if\>:\<elseif\>\|\<else\>:\<endif\>'
+ \ . ',\<foreach\>\|\<while\>:\<break\>:\<endforeach\>\|\<endwhile\>'
+ \ . ',\<macro\>:\<endmacro\>'
+ \ . ',\<function\>:\<endfunction\>'
+ let b:match_ignorecase = 1
+
+ let b:undo_ftplugin .= "| unlet b:match_words"
+endif
+
+setlocal commentstring=#\ %s
+
+" restore 'cpo' and clean up buffer variable
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/conf.vim b/runtime/ftplugin/conf.vim
index 1b110e475b..ff2add1fa3 100644
--- a/runtime/ftplugin/conf.vim
+++ b/runtime/ftplugin/conf.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: generic configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: generic configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/context.vim b/runtime/ftplugin/context.vim
index 1c7d678375..10f1ae1648 100644
--- a/runtime/ftplugin/context.vim
+++ b/runtime/ftplugin/context.vim
@@ -1,7 +1,8 @@
" Vim filetype plugin file
-" Language: ConTeXt typesetting engine
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: ConTeXt typesetting engine
+" Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+" Former Maintainers: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2016 Oct 30
if exists("b:did_ftplugin")
finish
@@ -11,16 +12,26 @@ let b:did_ftplugin = 1
let s:cpo_save = &cpo
set cpo&vim
-let b:undo_ftplugin = "setl com< cms< def< inc< sua< fo<"
+if !exists('current_compiler')
+ compiler context
+endif
+
+let b:undo_ftplugin = "setl com< cms< def< inc< sua< fo< ofu<"
+ \ . "| unlet! b:match_ignorecase b:match_words b:match_skip"
-setlocal comments=b:%D,b:%C,b:%M,:% commentstring=%\ %s formatoptions+=tcroql
+setlocal comments=b:%D,b:%C,b:%M,:% commentstring=%\ %s formatoptions+=tjcroql2
+if get(b:, 'context_metapost', get(g:, 'context_metapost', 1))
+ setlocal omnifunc=contextcomplete#Complete
+ let g:omni_syntax_group_include_context = 'mf\w\+,mp\w\+'
+ let g:omni_syntax_group_exclude_context = 'mfTodoComment'
+endif
let &l:define='\\\%([egx]\|char\|mathchar\|count\|dimen\|muskip\|skip\|toks\)\='
\ . 'def\|\\font\|\\\%(future\)\=let'
\ . '\|\\new\%(count\|dimen\|skip\|muskip\|box\|toks\|read\|write'
\ . '\|fam\|insert\|if\)'
-let &l:include = '^\s*\%(input\|component\)'
+let &l:include = '^\s*\\\%(input\|component\|product\|project\|environment\)'
setlocal suffixesadd=.tex
@@ -31,5 +42,61 @@ if exists("loaded_matchit")
\ '\\start\(\a\+\):\\stop\1'
endif
+let s:context_regex = {
+ \ 'beginsection' : '\\\%(start\)\=\%(\%(sub\)*section\|\%(sub\)*subject\|chapter\|part\|component\|product\|title\)\>',
+ \ 'endsection' : '\\\%(stop\)\=\%(\%(sub\)*section\|\%(sub\)*subject\|chapter\|part\|component\|product\|title\)\>',
+ \ 'beginblock' : '\\\%(start\|setup\|define\)',
+ \ 'endblock' : '\\\%(stop\|setup\|define\)'
+ \ }
+
+function! s:move_around(count, what, flags, visual)
+ if a:visual
+ exe "normal! gv"
+ endif
+ call search(s:context_regex[a:what], a:flags.'s') " 's' sets previous context mark
+ call map(range(2, a:count), 'search(s:context_regex[a:what], a:flags)')
+endfunction
+
+" Move around macros.
+nnoremap <silent><buffer> [[ :<C-U>call <SID>move_around(v:count1, "beginsection", "bW", v:false) <CR>
+vnoremap <silent><buffer> [[ :<C-U>call <SID>move_around(v:count1, "beginsection", "bW", v:true) <CR>
+nnoremap <silent><buffer> ]] :<C-U>call <SID>move_around(v:count1, "beginsection", "W", v:false) <CR>
+vnoremap <silent><buffer> ]] :<C-U>call <SID>move_around(v:count1, "beginsection", "W", v:true) <CR>
+nnoremap <silent><buffer> [] :<C-U>call <SID>move_around(v:count1, "endsection", "bW", v:false) <CR>
+vnoremap <silent><buffer> [] :<C-U>call <SID>move_around(v:count1, "endsection", "bW", v:true) <CR>
+nnoremap <silent><buffer> ][ :<C-U>call <SID>move_around(v:count1, "endsection", "W", v:false) <CR>
+vnoremap <silent><buffer> ][ :<C-U>call <SID>move_around(v:count1, "endsection", "W", v:true) <CR>
+nnoremap <silent><buffer> [{ :<C-U>call <SID>move_around(v:count1, "beginblock", "bW", v:false) <CR>
+vnoremap <silent><buffer> [{ :<C-U>call <SID>move_around(v:count1, "beginblock", "bW", v:true) <CR>
+nnoremap <silent><buffer> ]} :<C-U>call <SID>move_around(v:count1, "endblock", "W", v:false) <CR>
+vnoremap <silent><buffer> ]} :<C-U>call <SID>move_around(v:count1, "endblock", "W", v:true) <CR>
+
+" Other useful mappings
+if get(g:, 'context_mappings', 1)
+ let s:tp_regex = '?^$\|^\s*\\\(item\|start\|stop\|blank\|\%(sub\)*section\|chapter\|\%(sub\)*subject\|title\|part\)'
+
+ fun! s:tp()
+ call cursor(search(s:tp_regex, 'bcW') + 1, 1)
+ normal! V
+ call cursor(search(s:tp_regex, 'W') - 1, 1)
+ endf
+
+ " Reflow paragraphs with commands like gqtp ("gq TeX paragraph")
+ onoremap <silent><buffer> tp :<c-u>call <sid>tp()<cr>
+ " Select TeX paragraph
+ vnoremap <silent><buffer> tp <esc>:<c-u>call <sid>tp()<cr>
+
+ " $...$ text object
+ onoremap <silent><buffer> i$ :<c-u>normal! T$vt$<cr>
+ onoremap <silent><buffer> a$ :<c-u>normal! F$vf$<cr>
+ vnoremap <buffer> i$ T$ot$
+ vnoremap <buffer> a$ F$of$
+endif
+
+" Commands for asynchronous typesetting
+command! -buffer -nargs=? -complete=file ConTeXt call context#typeset(<q-args>)
+command! -nargs=0 ConTeXtJobStatus call context#job_status()
+command! -nargs=0 ConTeXtStopJobs call context#stop_jobs()
+
let &cpo = s:cpo_save
unlet s:cpo_save
diff --git a/runtime/ftplugin/crm.vim b/runtime/ftplugin/crm.vim
index e86e683068..06baee883a 100644
--- a/runtime/ftplugin/crm.vim
+++ b/runtime/ftplugin/crm.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: CRM114
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: CRM114
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/css.vim b/runtime/ftplugin/css.vim
index 43d1edfa5b..ea4424418c 100644
--- a/runtime/ftplugin/css.vim
+++ b/runtime/ftplugin/css.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: CSS
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: CSS
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/cucumber.vim b/runtime/ftplugin/cucumber.vim
index 2ec1a5976f..f4848d1c60 100644
--- a/runtime/ftplugin/cucumber.vim
+++ b/runtime/ftplugin/cucumber.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin
" Language: Cucumber
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
-" Last Change: 2013 Jun 01
+" Last Change: 2016 Aug 29
" Only do this when not done yet for this buffer
if (exists("b:did_ftplugin"))
@@ -19,27 +19,23 @@ setlocal omnifunc=CucumberComplete
let b:undo_ftplugin = "setl fo< com< cms< ofu<"
let b:cucumber_root = expand('%:p:h:s?.*[\/]\%(features\|stories\)\zs[\/].*??')
+if !exists("b:cucumber_steps_glob")
+ let b:cucumber_steps_glob = b:cucumber_root.'/**/*.rb'
+endif
if !exists("g:no_plugin_maps") && !exists("g:no_cucumber_maps")
- nnoremap <silent><buffer> <C-]> :<C-U>exe <SID>jump('edit',v:count)<CR>
- nnoremap <silent><buffer> [<C-D> :<C-U>exe <SID>jump('edit',v:count)<CR>
- nnoremap <silent><buffer> ]<C-D> :<C-U>exe <SID>jump('edit',v:count)<CR>
- nnoremap <silent><buffer> <C-W>] :<C-U>exe <SID>jump('split',v:count)<CR>
- nnoremap <silent><buffer> <C-W><C-]> :<C-U>exe <SID>jump('split',v:count)<CR>
- nnoremap <silent><buffer> <C-W>d :<C-U>exe <SID>jump('split',v:count)<CR>
- nnoremap <silent><buffer> <C-W><C-D> :<C-U>exe <SID>jump('split',v:count)<CR>
- nnoremap <silent><buffer> <C-W>} :<C-U>exe <SID>jump('pedit',v:count)<CR>
- nnoremap <silent><buffer> [d :<C-U>exe <SID>jump('pedit',v:count)<CR>
- nnoremap <silent><buffer> ]d :<C-U>exe <SID>jump('pedit',v:count)<CR>
+ cnoremap <SID>foldopen <Bar>if &foldopen =~# 'tag'<Bar>exe 'norm! zv'<Bar>endif
+ nnoremap <silent> <script> <buffer> [<C-D> :<C-U>exe <SID>jump('edit',v:count)<SID>foldopen<CR>
+ nnoremap <silent> <script> <buffer> ]<C-D> :<C-U>exe <SID>jump('edit',v:count)<SID>foldopen<CR>
+ nnoremap <silent> <script> <buffer> <C-W>d :<C-U>exe <SID>jump('split',v:count)<SID>foldopen<CR>
+ nnoremap <silent> <script> <buffer> <C-W><C-D> :<C-U>exe <SID>jump('split',v:count)<SID>foldopen<CR>
+ nnoremap <silent> <script> <buffer> [d :<C-U>exe <SID>jump('pedit',v:count)<CR>
+ nnoremap <silent> <script> <buffer> ]d :<C-U>exe <SID>jump('pedit',v:count)<CR>
let b:undo_ftplugin .=
- \ "|sil! nunmap <buffer> <C-]>" .
\ "|sil! nunmap <buffer> [<C-D>" .
\ "|sil! nunmap <buffer> ]<C-D>" .
- \ "|sil! nunmap <buffer> <C-W>]" .
- \ "|sil! nunmap <buffer> <C-W><C-]>" .
\ "|sil! nunmap <buffer> <C-W>d" .
\ "|sil! nunmap <buffer> <C-W><C-D>" .
- \ "|sil! nunmap <buffer> <C-W>}" .
\ "|sil! nunmap <buffer> [d" .
\ "|sil! nunmap <buffer> ]d"
endif
@@ -59,7 +55,7 @@ endfunction
function! s:allsteps()
let step_pattern = '\C^\s*\K\k*\>\s*(\=\s*\zs\S.\{-\}\ze\s*)\=\s*\%(do\|{\)\s*\%(|[^|]*|\s*\)\=\%($\|#\)'
let steps = []
- for file in split(glob(b:cucumber_root.'/**/*.rb'),"\n")
+ for file in split(glob(b:cucumber_steps_glob),"\n")
let lines = readfile(file)
let num = 0
for line in lines
diff --git a/runtime/ftplugin/cvsrc.vim b/runtime/ftplugin/cvsrc.vim
index c410530588..34b148409e 100644
--- a/runtime/ftplugin/cvsrc.vim
+++ b/runtime/ftplugin/cvsrc.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: cvs(1) RC file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: cvs(1) RC file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/debchangelog.vim b/runtime/ftplugin/debchangelog.vim
index d2718db88e..a78f7811f1 100644
--- a/runtime/ftplugin/debchangelog.vim
+++ b/runtime/ftplugin/debchangelog.vim
@@ -1,22 +1,22 @@
" Vim filetype plugin file (GUI menu, folding and completion)
" Language: Debian Changelog
-" Maintainer: Debian Vim Maintainers <pkg-vim-maintainers@lists.alioth.debian.org>
+" Maintainer: Debian Vim Maintainers
" Former Maintainers: Michael Piefel <piefel@informatik.hu-berlin.de>
" Stefano Zacchiroli <zack@debian.org>
-" Last Change: 2014-01-31
+" Last Change: 2018-01-28
" License: Vim License
-" URL: http://hg.debian.org/hg/pkg-vim/vim/file/unstable/runtime/ftplugin/debchangelog.vim
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/master/ftplugin/debchangelog.vim
" Bug completion requires apt-listbugs installed for Debian packages or
" python-launchpadlib installed for Ubuntu packages
-if exists("b:did_ftplugin")
+if exists('b:did_ftplugin')
finish
endif
let b:did_ftplugin=1
" {{{1 Local settings (do on every load)
-if exists("g:debchangelog_fold_enable")
+if exists('g:debchangelog_fold_enable')
setlocal foldmethod=expr
setlocal foldexpr=DebGetChangelogFold(v:lnum)
setlocal foldtext=DebChangelogFoldText()
@@ -28,10 +28,10 @@ setlocal tw=78
setlocal comments=f:*
" Clean unloading
-let b:undo_ftplugin = "setlocal tw< comments< foldmethod< foldexpr< foldtext<"
+let b:undo_ftplugin = 'setlocal tw< comments< foldmethod< foldexpr< foldtext<'
" }}}1
-if exists("g:did_changelog_ftplugin")
+if exists('g:did_changelog_ftplugin')
finish
endif
@@ -44,41 +44,41 @@ let g:did_changelog_ftplugin = 1
" Returns full name, either from $DEBFULLNAME or debianfullname.
" TODO Is there a way to determine name from anywhere else?
function <SID>FullName()
- if exists("$DEBFULLNAME")
+ if exists('$DEBFULLNAME')
return $DEBFULLNAME
- elseif exists("g:debianfullname")
+ elseif exists('g:debianfullname')
return g:debianfullname
else
- return "Your Name"
+ return 'Your Name'
endif
endfunction
" Returns email address, from $DEBEMAIL, $EMAIL or debianemail.
function <SID>Email()
- if exists("$DEBEMAIL")
+ if exists('$DEBEMAIL')
return $DEBEMAIL
- elseif exists("$EMAIL")
+ elseif exists('$EMAIL')
return $EMAIL
- elseif exists("g:debianemail")
+ elseif exists('g:debianemail')
return g:debianemail
else
- return "your@email.address"
+ return 'your@email.address'
endif
endfunction
" Returns date in RFC822 format.
function <SID>Date()
let savelang = v:lc_time
- execute "language time C"
- let dateandtime = strftime("%a, %d %b %Y %X %z")
- execute "language time " . savelang
+ execute 'language time C'
+ let dateandtime = strftime('%a, %d %b %Y %X %z')
+ execute 'language time ' . savelang
return dateandtime
endfunction
function <SID>WarnIfNotUnfinalised()
- if match(getline("."), " -- [[:alpha:]][[:alnum:].]")!=-1
+ if match(getline('.'), ' -- [[:alpha:]][[:alnum:].]')!=-1
echohl WarningMsg
- echo "The entry has not been unfinalised before editing."
+ echo 'The entry has not been unfinalised before editing.'
echohl None
return 1
endif
@@ -86,10 +86,10 @@ function <SID>WarnIfNotUnfinalised()
endfunction
function <SID>Finalised()
- let savelinenum = line(".")
- normal 1G
- call search("^ -- ")
- if match(getline("."), " -- [[:alpha:]][[:alnum:].]")!=-1
+ let savelinenum = line('.')
+ 1
+ call search('^ -- ')
+ if match(getline('.'), ' -- [[:alpha:]][[:alnum:].]')!=-1
let returnvalue = 1
else
let returnvalue = 0
@@ -109,54 +109,54 @@ function NewVersion()
amenu disable Changelog.Unfinalise
amenu enable Changelog.Finalise
call append(0, substitute(getline(1), '-\([[:digit:]]\+\))', '-$$\1)', ''))
- call append(1, "")
- call append(2, "")
- call append(3, " -- ")
- call append(4, "")
- call Urgency("low")
- normal 1G0
- call search(")")
- normal h
- normal 
+ call append(1, '')
+ call append(2, '')
+ call append(3, ' -- ')
+ call append(4, '')
+ call Urgency('low')
+ normal! 1G0
+ call search(')')
+ normal! h
+ normal! 
call setline(1, substitute(getline(1), '-\$\$', '-', ''))
- if exists("g:debchangelog_fold_enable")
+ if exists('g:debchangelog_fold_enable')
foldopen
endif
call AddEntry()
endfunction
function AddEntry()
- normal 1G
- call search("^ -- ")
- normal kk
- call append(".", " * ")
- normal jjj
+ 1
+ call search('^ -- ')
+ .-2
+ call append('.', ' * ')
+ .+3
let warn=<SID>WarnIfNotUnfinalised()
- normal kk
+ .-2
if warn
echohl MoreMsg
- call input("Hit ENTER")
+ call input('Hit ENTER')
echohl None
endif
startinsert!
endfunction
function CloseBug()
- normal 1G
- call search("^ -- ")
+ 1
+ call search('^ -- ')
let warn=<SID>WarnIfNotUnfinalised()
- normal kk
- call append(".", " * (closes: #" . input("Bug number to close: ") . ")")
- normal j^ll
+ .-2
+ call append('.', ' * (closes: #' . input('Bug number to close: ') . ')')
+ normal! j^ll
startinsert
endfunction
function Distribution(dist)
- call setline(1, substitute(getline(1), ') *\%(UNRELEASED\|\l\+\);', ") " . a:dist . ";", ""))
+ call setline(1, substitute(getline(1), ') *\%(UNRELEASED\|\l\+\);', ') ' . a:dist . ';', ''))
endfunction
function Urgency(urg)
- call setline(1, substitute(getline(1), "urgency=.*$", "urgency=" . a:urg, ""))
+ call setline(1, substitute(getline(1), 'urgency=.*$', 'urgency=' . a:urg, ''))
endfunction
function <SID>UnfinaliseMenu()
@@ -172,9 +172,9 @@ endfunction
function Unfinalise()
call <SID>UnfinaliseMenu()
- normal 1G
- call search("^ -- ")
- call setline(".", " -- ")
+ 1
+ call search('^ -- ')
+ call setline('.', ' -- ')
endfunction
function <SID>FinaliseMenu()
@@ -190,9 +190,9 @@ endfunction
function Finalise()
call <SID>FinaliseMenu()
- normal 1G
- call search("^ -- ")
- call setline(".", " -- " . <SID>FullName() . " <" . <SID>Email() . "> " . <SID>Date())
+ 1
+ call search('^ -- ')
+ call setline('.', ' -- ' . <SID>FullName() . ' <' . <SID>Email() . '> ' . <SID>Date())
endfunction
@@ -239,7 +239,7 @@ function! s:getAuthor(zonestart, zoneend)
let linepos = a:zoneend
while linepos >= a:zonestart
let line = getline(linepos)
- if line =~ '^ --'
+ if line =~# '^ --'
return substitute(line, '^ --\s*\([^<]\+\)\s*.*', '\1', '')
endif
let linepos -= 1
@@ -254,7 +254,7 @@ function! DebGetPkgSrcName(lineno)
let pkgname = ''
while lineidx > 0
let curline = getline(lineidx)
- if curline =~ '^\S'
+ if curline =~# '^\S'
let pkgname = matchlist(curline, '^\(\S\+\).*$')[1]
break
endif
@@ -264,7 +264,7 @@ function! DebGetPkgSrcName(lineno)
endfunction
function! DebChangelogFoldText()
- if v:folddashes == '-' " changelog entry fold
+ if v:folddashes ==# '-' " changelog entry fold
return foldtext() . ' -- ' . s:getAuthor(v:foldstart, v:foldend) . ' '
endif
return foldtext()
@@ -272,19 +272,19 @@ endfunction
function! DebGetChangelogFold(lnum)
let line = getline(a:lnum)
- if line =~ '^\w\+'
+ if line =~# '^\w\+'
return '>1' " beginning of a changelog entry
endif
- if line =~ '^\s\+\[.*\]'
+ if line =~# '^\s\+\[.*\]'
return '>2' " beginning of an author-specific chunk
endif
- if line =~ '^ --'
+ if line =~# '^ --'
return '1'
endif
return '='
endfunction
-if exists("g:debchangelog_fold_enable")
+if exists('g:debchangelog_fold_enable')
silent! foldopen! " unfold the entry the cursor is on (usually the first one)
endif
@@ -305,13 +305,13 @@ fun! DebCompleteBugs(findstart, base)
let try_colidx = col('.') - 1
let colidx = -1 " default to no-completion-possible
- while try_colidx > 0 && line[try_colidx - 1] =~ '\s\|\d\|#\|,\|:'
+ while try_colidx > 0 && line[try_colidx - 1] =~# '\s\|\d\|#\|,\|:'
let try_colidx = try_colidx - 1
- if line[try_colidx] == '#' && colidx == -1
+ if line[try_colidx] ==# '#' && colidx == -1
" found hash, where we complete from:
let colidx = try_colidx
- elseif line[try_colidx] == ':'
- if try_colidx > 1 && strpart(line, try_colidx - 2, 3) =~ '\clp:'
+ elseif line[try_colidx] ==# ':'
+ if try_colidx > 1 && strpart(line, try_colidx - 2, 3) =~? '\clp:'
let g:debchangelog_complete_mode = 'lp'
endif
break
@@ -320,7 +320,7 @@ fun! DebCompleteBugs(findstart, base)
return colidx
else " return matches:
let bug_lines = []
- if g:debchangelog_complete_mode == 'lp'
+ if g:debchangelog_complete_mode ==? 'lp'
if ! has('python')
echoerr 'vim must be built with Python support to use LP bug completion'
return
@@ -363,7 +363,7 @@ EOF
for line in bug_lines
let parts = matchlist(line, '^\s*\(#\S\+\)\s*-\s*\(.*\)$')
" filter only those which match a:base:
- if parts[1] !~ "^" . a:base
+ if parts[1] !~ '^' . a:base
continue
endif
let completion = {}
diff --git a/runtime/ftplugin/debcontrol.vim b/runtime/ftplugin/debcontrol.vim
index 7871d9897f..3a6e39a682 100644
--- a/runtime/ftplugin/debcontrol.vim
+++ b/runtime/ftplugin/debcontrol.vim
@@ -1,18 +1,18 @@
" Vim filetype plugin file (GUI menu and folding)
" Language: Debian control files
-" Maintainer: Debian Vim Maintainers <pkg-vim-maintainers@lists.alioth.debian.org>
+" Maintainer: Debian Vim Maintainers
" Former Maintainer: Pierre Habouzit <madcoder@debian.org>
-" Last Change: 2008-03-08
-" URL: http://hg.debian.org/hg/pkg-vim/vim/raw-file/tip/runtime/ftplugin/debcontrol.vim
+" Last Change: 2018-01-28
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/master/ftplugin/debcontrol.vim
" Do these settings once per buffer
-if exists("b:did_ftplugin")
+if exists('b:did_ftplugin')
finish
endif
let b:did_ftplugin=1
" {{{1 Local settings (do on every load)
-if exists("g:debcontrol_fold_enable")
+if exists('g:debcontrol_fold_enable')
setlocal foldmethod=expr
setlocal foldexpr=DebControlFold(v:lnum)
setlocal foldtext=DebControlFoldText()
@@ -20,7 +20,7 @@ endif
setlocal textwidth=0
" Clean unloading
-let b:undo_ftplugin = "setlocal tw< foldmethod< foldexpr< foldtext<"
+let b:undo_ftplugin = 'setlocal tw< foldmethod< foldexpr< foldtext<'
" }}}1
@@ -32,7 +32,7 @@ function! s:getField(f, lnum)
while line !~ '^'.a:f.':'
let fwdsteps += 1
let line = getline(a:lnum + fwdsteps)
- if line == ''
+ if line ==# ''
return 'unknown'
endif
endwhile
@@ -40,9 +40,9 @@ function! s:getField(f, lnum)
endfunction
function! DebControlFoldText()
- if v:folddashes == '-' " debcontrol entry fold
+ if v:folddashes ==# '-' " debcontrol entry fold
let type = substitute(getline(v:foldstart), ':.*', '', '')
- if type == 'Source'
+ if type ==# 'Source'
let ftext = substitute(foldtext(), ' *Source: *', ' ', '')
return ftext . ' -- ' . s:getField('Maintainer', v:foldstart) . ' '
endif
@@ -56,11 +56,11 @@ endfunction
function! DebControlFold(l)
" This is for not merging blank lines around folds to them
- if getline(a:l) =~ '^Source:'
+ if getline(a:l) =~# '^Source:'
return '>1'
endif
- if getline(a:l) =~ '^Package:'
+ if getline(a:l) =~# '^Package:'
return '>1'
endif
diff --git a/runtime/ftplugin/denyhosts.vim b/runtime/ftplugin/denyhosts.vim
index 557fd82c53..563bb8f5f1 100644
--- a/runtime/ftplugin/denyhosts.vim
+++ b/runtime/ftplugin/denyhosts.vim
@@ -1,6 +1,6 @@
" Vim filetype plugin file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2007-12-04
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-12-04
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/dictconf.vim b/runtime/ftplugin/dictconf.vim
index 659046c176..71a2b67258 100644
--- a/runtime/ftplugin/dictconf.vim
+++ b/runtime/ftplugin/dictconf.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: dict(1) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: dict(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/dictdconf.vim b/runtime/ftplugin/dictdconf.vim
index ee738c50ce..0ee4c9d7e0 100644
--- a/runtime/ftplugin/dictdconf.vim
+++ b/runtime/ftplugin/dictdconf.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: dictd(8) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: dictd(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/dircolors.vim b/runtime/ftplugin/dircolors.vim
index 3b3d046e36..d07d1e34da 100644
--- a/runtime/ftplugin/dircolors.vim
+++ b/runtime/ftplugin/dircolors.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: dircolors(1) input file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: dircolors(1) input file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/dosini.vim b/runtime/ftplugin/dosini.vim
index 461403ca95..0d0f0f8983 100644
--- a/runtime/ftplugin/dosini.vim
+++ b/runtime/ftplugin/dosini.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: Configuration File (ini file) for MSDOS/MS Windows
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: Configuration File (ini file) for MSDOS/MS Windows
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/elinks.vim b/runtime/ftplugin/elinks.vim
index 7d9257566b..921f9c276b 100644
--- a/runtime/ftplugin/elinks.vim
+++ b/runtime/ftplugin/elinks.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: elinks(1) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: elinks(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/eruby.vim b/runtime/ftplugin/eruby.vim
index 9bb8e86ff3..32f3fb868f 100644
--- a/runtime/ftplugin/eruby.vim
+++ b/runtime/ftplugin/eruby.vim
@@ -27,7 +27,7 @@ elseif !exists("b:eruby_subtype")
let s:lines = getline(1)."\n".getline(2)."\n".getline(3)."\n".getline(4)."\n".getline(5)."\n".getline("$")
let b:eruby_subtype = matchstr(s:lines,'eruby_subtype=\zs\w\+')
if b:eruby_subtype == ''
- let b:eruby_subtype = matchstr(substitute(expand("%:t"),'\c\%(\.erb\|\.eruby\|\.erubis\)\+$','',''),'\.\zs\w\+$')
+ let b:eruby_subtype = matchstr(substitute(expand("%:t"),'\c\%(\.erb\|\.eruby\|\.erubis\)\+$','',''),'\.\zs\w\+\%(\ze+\w\+\)\=$')
endif
if b:eruby_subtype == 'rhtml'
let b:eruby_subtype = 'html'
diff --git a/runtime/ftplugin/eterm.vim b/runtime/ftplugin/eterm.vim
index e072c638b1..e2f88ef8c6 100644
--- a/runtime/ftplugin/eterm.vim
+++ b/runtime/ftplugin/eterm.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: eterm(1) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: eterm(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/fetchmail.vim b/runtime/ftplugin/fetchmail.vim
index a0d4650c03..33bb417be4 100644
--- a/runtime/ftplugin/fetchmail.vim
+++ b/runtime/ftplugin/fetchmail.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: fetchmail(1) RC File
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: fetchmail(1) RC File
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/framescript.vim b/runtime/ftplugin/framescript.vim
index 805401a89b..48fe0ace7c 100644
--- a/runtime/ftplugin/framescript.vim
+++ b/runtime/ftplugin/framescript.vim
@@ -1,7 +1,7 @@
" Vim ftplugin file
-" Language: FrameScript
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-19
+" Language: FrameScript
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-19
let s:cpo_save = &cpo
set cpo&vim
diff --git a/runtime/ftplugin/gdb.vim b/runtime/ftplugin/gdb.vim
new file mode 100644
index 0000000000..2473b13af0
--- /dev/null
+++ b/runtime/ftplugin/gdb.vim
@@ -0,0 +1,12 @@
+" Vim filetype plugin file
+" Language: gdb
+" Maintainer: Michaรซl Peeters <NOSPAMm.vim@noekeon.org>
+" Last Changed: 26 Oct 2017
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+
+setlocal commentstring=#%s
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "setlocal cms<"
diff --git a/runtime/ftplugin/git.vim b/runtime/ftplugin/git.vim
index 5fe5b2b0c3..b3d5cff804 100644
--- a/runtime/ftplugin/git.vim
+++ b/runtime/ftplugin/git.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin
" Language: generic git output
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
-" Last Change: 2013 May 30
+" Last Change: 2016 Aug 29
" Only do this when not done yet for this buffer
if (exists("b:did_ftplugin"))
@@ -12,6 +12,8 @@ let b:did_ftplugin = 1
if !exists('b:git_dir')
if expand('%:p') =~# '[\/]\.git[\/]modules[\/]'
" Stay out of the way
+ elseif expand('%:p') =~# '[\/]\.git[\/]worktrees'
+ let b:git_dir = matchstr(expand('%:p'),'.*\.git[\/]worktrees[\/][^\/]\+\>')
elseif expand('%:p') =~# '\.git\>'
let b:git_dir = matchstr(expand('%:p'),'.*\.git\>')
elseif $GIT_DIR != ''
diff --git a/runtime/ftplugin/gitcommit.vim b/runtime/ftplugin/gitcommit.vim
index e8619004bf..6767ff719e 100644
--- a/runtime/ftplugin/gitcommit.vim
+++ b/runtime/ftplugin/gitcommit.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin
" Language: git commit file
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
-" Last Change: 2013 May 30
+" Last Change: 2016 Aug 29
" Only do this when not done yet for this buffer
if (exists("b:did_ftplugin"))
@@ -11,15 +11,10 @@ endif
runtime! ftplugin/git.vim
let b:did_ftplugin = 1
-setlocal nomodeline tabstop=8 formatoptions-=croq formatoptions+=tl
-
-let b:undo_ftplugin = 'setl modeline< tabstop< formatoptions<'
-
-if &textwidth == 0
- " make sure that log messages play nice with git-log on standard terminals
- setlocal textwidth=72
- let b:undo_ftplugin .= "|setl tw<"
-endif
+setlocal comments=:# commentstring=#\ %s
+setlocal nomodeline tabstop=8 formatoptions+=tl textwidth=72
+setlocal formatoptions-=c formatoptions-=r formatoptions-=o formatoptions-=q
+let b:undo_ftplugin = 'setl modeline< tabstop< formatoptions< tw< com< cms<'
if exists("g:no_gitcommit_commands") || v:version < 700
finish
@@ -31,6 +26,8 @@ endif
command! -bang -bar -buffer -complete=custom,s:diffcomplete -nargs=* DiffGitCached :call s:gitdiffcached(<bang>0,b:git_dir,<f-args>)
+let b:undo_ftplugin = b:undo_ftplugin . "|delc DiffGitCached"
+
function! s:diffcomplete(A,L,P)
let args = ""
if a:P <= match(a:L." -- "," -- ")+3
diff --git a/runtime/ftplugin/gitrebase.vim b/runtime/ftplugin/gitrebase.vim
index 0200ba1acc..6f73b5c499 100644
--- a/runtime/ftplugin/gitrebase.vim
+++ b/runtime/ftplugin/gitrebase.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin
" Language: git rebase --interactive
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
-" Last Change: 2010 May 21
+" Last Change: 2016 Aug 29
" Only do this when not done yet for this buffer
if (exists("b:did_ftplugin"))
@@ -12,10 +12,11 @@ runtime! ftplugin/git.vim
let b:did_ftplugin = 1
setlocal comments=:# commentstring=#\ %s formatoptions-=t
+setlocal nomodeline
if !exists("b:undo_ftplugin")
let b:undo_ftplugin = ""
endif
-let b:undo_ftplugin = b:undo_ftplugin."|setl com< cms< fo<"
+let b:undo_ftplugin = b:undo_ftplugin."|setl com< cms< fo< ml<"
function! s:choose(word)
s/^\(\w\+\>\)\=\(\s*\)\ze\x\{4,40\}\>/\=(strlen(submatch(1)) == 1 ? a:word[0] : a:word) . substitute(submatch(2),'^$',' ','')/e
diff --git a/runtime/ftplugin/gpg.vim b/runtime/ftplugin/gpg.vim
index 5caa1f69c1..3f890e58f6 100644
--- a/runtime/ftplugin/gpg.vim
+++ b/runtime/ftplugin/gpg.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: gpg(1) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: gpg(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/groovy.vim b/runtime/ftplugin/groovy.vim
new file mode 100644
index 0000000000..cc7d6e35eb
--- /dev/null
+++ b/runtime/ftplugin/groovy.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: groovy
+" Maintainer: Justin M. Keyes <justinkz@gmail.com>
+" Last Change: 2016 May 22
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+let b:undo_ftplugin = 'setlocal commentstring<'
+
+setlocal commentstring=//%s
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/group.vim b/runtime/ftplugin/group.vim
index eef3cd68d9..e6b76ba607 100644
--- a/runtime/ftplugin/group.vim
+++ b/runtime/ftplugin/group.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: group(5) user group file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: group(5) user group file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/grub.vim b/runtime/ftplugin/grub.vim
index 21c4e3609d..cd6e1139e5 100644
--- a/runtime/ftplugin/grub.vim
+++ b/runtime/ftplugin/grub.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: grub(8) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: grub(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/haml.vim b/runtime/ftplugin/haml.vim
index 654f1fca90..e74530b556 100644
--- a/runtime/ftplugin/haml.vim
+++ b/runtime/ftplugin/haml.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin
" Language: Haml
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
-" Last Change: 2013 Jun 01
+" Last Change: 2016 Aug 29
" Only do this when not done yet for this buffer
if exists("b:did_ftplugin")
diff --git a/runtime/ftplugin/hamster.vim b/runtime/ftplugin/hamster.vim
index c23adc4232..6c0630fe04 100644
--- a/runtime/ftplugin/hamster.vim
+++ b/runtime/ftplugin/hamster.vim
@@ -1,8 +1,8 @@
" Vim filetype plugin
" Language: Hamster Script
" Version: 2.0.6.0
-" Maintainer: David Fishburn <fishburn@ianywhere.com>
-" Last Change: Wed Nov 08 2006 12:03:09 PM
+" Maintainer: David Fishburn <dfishburn dot vim at gmail dot com>
+" Last Change: 2017 Mar 18
" Only do this when not done yet for this buffer
if exists("b:did_ftplugin")
@@ -13,7 +13,7 @@ endif
let b:did_ftplugin = 1
let s:cpo_save = &cpo
-set cpo-=C
+set cpo&vim
let b:undo_ftplugin = "setl fo< com< tw< commentstring<"
\ . "| unlet! b:match_ignorecase b:match_words b:match_skip"
diff --git a/runtime/ftplugin/haskell.vim b/runtime/ftplugin/haskell.vim
index 144f9f6860..84f4d0563b 100644
--- a/runtime/ftplugin/haskell.vim
+++ b/runtime/ftplugin/haskell.vim
@@ -1,7 +1,8 @@
" Vim filetype plugin file
-" Language: Haskell
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: Haskell
+" Maintainer: Daniel Campoverde <alx@sillybytes.net>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2018-08-27
if exists("b:did_ftplugin")
finish
@@ -15,6 +16,7 @@ let b:undo_ftplugin = "setl com< cms< fo<"
setlocal comments=s1fl:{-,mb:-,ex:-},:-- commentstring=--\ %s
setlocal formatoptions-=t formatoptions+=croql
+setlocal omnifunc=haskellcomplete#Complete
let &cpo = s:cpo_save
unlet s:cpo_save
diff --git a/runtime/ftplugin/help.vim b/runtime/ftplugin/help.vim
index a0a0f292eb..0f448bd306 100644
--- a/runtime/ftplugin/help.vim
+++ b/runtime/ftplugin/help.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: Vim help file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: Vim help file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
@@ -11,12 +11,87 @@ let b:did_ftplugin = 1
let s:cpo_save = &cpo
set cpo&vim
-let b:undo_ftplugin = "setl fo< tw< cole< cocu<"
+let b:undo_ftplugin = "setl fo< tw< cole< cocu< keywordprg<"
setlocal formatoptions+=tcroql textwidth=78
if has("conceal")
setlocal cole=2 cocu=nc
endif
+" Prefer Vim help instead of manpages.
+setlocal keywordprg=:help
+
+if !exists('g:no_plugin_maps')
+ function! s:show_toc() abort
+ let bufname = bufname('%')
+ let info = getloclist(0, {'winid': 1})
+ if !empty(info) && getwinvar(info.winid, 'qf_toc') ==# bufname
+ lopen
+ return
+ endif
+
+ let toc = []
+ let lnum = 2
+ let last_line = line('$') - 1
+ let last_added = 0
+ let has_section = 0
+ let has_sub_section = 0
+
+ while lnum && lnum <= last_line
+ let level = 0
+ let add_text = ''
+ let text = getline(lnum)
+
+ if text =~# '^=\+$' && lnum + 1 < last_line
+ " A de-facto section heading. Other headings are inferred.
+ let has_section = 1
+ let has_sub_section = 0
+ let lnum = nextnonblank(lnum + 1)
+ let text = getline(lnum)
+ let add_text = text
+ while add_text =~# '\*[^*]\+\*\s*$'
+ let add_text = matchstr(add_text, '.*\ze\*[^*]\+\*\s*$')
+ endwhile
+ elseif text =~# '^[A-Z0-9][-A-ZA-Z0-9 .][-A-Z0-9 .():]*\%([ \t]\+\*.\+\*\)\?$'
+ " Any line that's yelling is important.
+ let has_sub_section = 1
+ let level = has_section
+ let add_text = matchstr(text, '.\{-}\ze\s*\%([ \t]\+\*.\+\*\)\?$')
+ elseif text =~# '\~$'
+ \ && matchstr(text, '^\s*\zs.\{-}\ze\s*\~$') !~# '\t\|\s\{2,}'
+ \ && getline(lnum - 1) =~# '^\s*<\?$\|^\s*\*.*\*$'
+ \ && getline(lnum + 1) =~# '^\s*>\?$\|^\s*\*.*\*$'
+ " These lines could be headers or code examples. We only want the
+ " ones that have subsequent lines at the same indent or more.
+ let l = nextnonblank(lnum + 1)
+ if getline(l) =~# '\*[^*]\+\*$'
+ " Ignore tag lines
+ let l = nextnonblank(l + 1)
+ endif
+
+ if indent(lnum) <= indent(l)
+ let level = has_section + has_sub_section
+ let add_text = matchstr(text, '\S.*')
+ endif
+ endif
+
+ let add_text = substitute(add_text, '\s\+$', '', 'g')
+ if !empty(add_text) && last_added != lnum
+ let last_added = lnum
+ call add(toc, {'bufnr': bufnr('%'), 'lnum': lnum,
+ \ 'text': repeat(' ', level) . add_text})
+ endif
+ let lnum = nextnonblank(lnum + 1)
+ endwhile
+
+ call setloclist(0, toc, ' ')
+ call setloclist(0, [], 'a', {'title': 'Help TOC'})
+ lopen
+ let w:qf_toc = bufname
+ endfunction
+
+ nnoremap <silent><buffer> gO :call <sid>show_toc()<cr>
+endif
+
let &cpo = s:cpo_save
unlet s:cpo_save
diff --git a/runtime/ftplugin/hostconf.vim b/runtime/ftplugin/hostconf.vim
index 557fd82c53..563bb8f5f1 100644
--- a/runtime/ftplugin/hostconf.vim
+++ b/runtime/ftplugin/hostconf.vim
@@ -1,6 +1,6 @@
" Vim filetype plugin file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2007-12-04
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-12-04
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/hostsaccess.vim b/runtime/ftplugin/hostsaccess.vim
index a2f55acb8a..d32485f162 100644
--- a/runtime/ftplugin/hostsaccess.vim
+++ b/runtime/ftplugin/hostsaccess.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: hosts_access(5) control file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: hosts_access(5) control file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/indent.vim b/runtime/ftplugin/indent.vim
index 0e195b0615..e6d928a073 100644
--- a/runtime/ftplugin/indent.vim
+++ b/runtime/ftplugin/indent.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: indent(1) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: indent(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/ld.vim b/runtime/ftplugin/ld.vim
index 31ce5c9ffd..1ab80d533c 100644
--- a/runtime/ftplugin/ld.vim
+++ b/runtime/ftplugin/ld.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: ld(1) script
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: ld(1) script
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/lftp.vim b/runtime/ftplugin/lftp.vim
index 9e2eeb52cb..5bc496c884 100644
--- a/runtime/ftplugin/lftp.vim
+++ b/runtime/ftplugin/lftp.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: lftp(1) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: lftp(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/libao.vim b/runtime/ftplugin/libao.vim
index 38bd3de92c..0ce5831b28 100644
--- a/runtime/ftplugin/libao.vim
+++ b/runtime/ftplugin/libao.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: libao.conf(5) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: libao.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/limits.vim b/runtime/ftplugin/limits.vim
index cd5b7b5c93..90a10a6c22 100644
--- a/runtime/ftplugin/limits.vim
+++ b/runtime/ftplugin/limits.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: limits(5) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: limits(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/loginaccess.vim b/runtime/ftplugin/loginaccess.vim
index 7c44f972f2..d27114a7ae 100644
--- a/runtime/ftplugin/loginaccess.vim
+++ b/runtime/ftplugin/loginaccess.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: login.access(5) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: login.access(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/logindefs.vim b/runtime/ftplugin/logindefs.vim
index 668d08a002..7873396808 100644
--- a/runtime/ftplugin/logindefs.vim
+++ b/runtime/ftplugin/logindefs.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: login.defs(5) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: login.defs(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/logtalk.dict b/runtime/ftplugin/logtalk.dict
index e3b9e6f2a4..3fcdfc6f6a 100644
--- a/runtime/ftplugin/logtalk.dict
+++ b/runtime/ftplugin/logtalk.dict
@@ -1,164 +1,262 @@
-encoding
+abolish
+abolish_category
+abolish_events
+abolish_object
+abolish_protocol
+abs
+acos
+acyclic_term
+after
+alias
+always_true_or_false_goals
+arg
+asin
+asserta
+assertz
+atan
+atan2
+atom
+atomic
+atom_chars
+atom_chars
+atom_codes
+atom_codes
+atom_concat
+atom_concat
+atom_length
+at_end_of_stream
+bagof
+before
+built_in
+call
+callable
calls
+catch
category
+category_property
+ceiling
+char_code
+char_conversion
+clause
+clean
+close
+code_prefix
+coinduction
+coinductive
+compare
+complements
+complements
+complements_object
+compound
+conforms_to_protocol
+context
+context_switching_calls
+copy_term
+cos
+create_category
+create_logtalk_flag
+create_object
+create_protocol
+current_category
+current_char_conversion
+current_event
+current_input
+current_logtalk_flag
+current_object
+current_op
+current_output
+current_predicate
+current_prolog_flag
+current_protocol
+debug
+define_events
+deprecated
+discontiguous
+div
+domain_error
+duplicated_directives
dynamic
+dynamic_declarations
+elif
+else
+encoding
+encoding_directive
+endif
end_category
end_object
end_protocol
-info
-initialization
-object
-protocol
-synchronized
-threaded
-uses
-alias
-discontiguous
-meta_predicate
-mode
-op
-private
-protected
-public
-current_object
-current_protocol
-current_category
-object_property
-protocol_property
-category_property
-create_object
-create_protocol
-create_category
-abolish_object
-abolish_protocol
-abolish_category
-complements
-complements_object
+engines
+ensure_loaded
+evaluation_error
+events
+existence_error
+exp
+expand_goal
+expand_term
+export
extends
+extends_category
extends_object
extends_protocol
-extends_category
+fail
+false
+findall
+float
+float_fractional_part
+float_integer_part
+floor
+flush_output
+forall
+forward
+functor
+get_byte
+get_char
+get_code
+goal_expansion
+ground
+halt
+hook
+if
+ignore
implements
implements_protocol
imports
imports_category
+include
+info
+initialization
instantiates
instantiates_class
-specializes
-specializes_class
-abolish_events
-current_event
-define_events
-logtalk_load
+instantiation_error
+integer
+keysort
+lambda_variables
+log
logtalk_compile
logtalk_library_path
-current_logtalk_flag
-set_logtalk_flag
-threaded_call
-threaded_once
-threaded_ignore
-threaded_exit
-threaded_peek
-threaded_wait
-threaded_notify
-self
-this
-sender
-parameter
-before
-after
-phrase
-expand_term
-goal_expansion
-term_expansion
-true
-fail
-call
-catch
-throw
-unify_with_occurs_check
-var
-atom
-integer
-float
-atomic
-compound
+logtalk_load
+logtalk_load_context
+logtalk_make
+logtalk_make_target_action
+max
+meta_non_terminal
+meta_predicate
+min
+missing_directives
+mod
+mode
+modules
+multifile
+nl
nonvar
number
-arg
-copy_term
-functor
-current_predicate
-predicate_property
-abolish
-assertz
-asserta
-clause
-retract
-retractall
-bagof
-findall
-forall
-setof
-current_input
-current_output
-set_input
-set_output
+numbervars
+number_chars
+number_chars
+number_codes
+number_codes
+object
+object_property
+once
+op
open
-close
-flush_output
-stream_property
-at_end_of_stream
-set_stream_position
-get_char
-get_code
+optimize
+parameter
+peek_byte
peek_char
peek_code
+permission_error
+phrase
+portability
+predicate_property
+private
+prolog_compatible_version
+prolog_compiler
+prolog_dialect
+prolog_loader
+prolog_version
+protected
+protocol
+protocol_property
+public
+put_byte
put_char
put_code
-nl
-get_byte
-peek_byte
-put_byte
read
read_term
-write
-writeq
-write_canonical
-atom_chars
-atom_codes
-atom_concat
-number_chars
-number_codes
-current_op
-char_conversion
-current_char_conversion
-once
-repeat
-atom_length
-atom_concat
-sub_atom
-atom_chars
-atom_codes
-char_code
-number_chars
-number_codes
-set_prolog_flag
-current_prolog_flag
-halt
-abs
-atan
-ceiling
-cos
-exp
-float_fractional_part
-float_integer_part
-floor
-log
-mod
+redefined_built_ins
+reexport
+reload
rem
+repeat
+report
+representation_error
+resource_error
+retract
+retractall
round
+scratch_directory
+self
+sender
+setof
+set_input
+set_logtalk_flag
+set_output
+set_prolog_flag
+set_stream_position
sign
sin
+singleton_variables
+sort
+source_data
+specializes
+specializes_class
sqrt
+stream_property
+subsumes_term
+sub_atom
+suspicious_calls
+synchronized
+syntax_error
+system_error
+tabling
+tan
+term_expansion
+term_variables
+this
+threaded
+threaded_call
+threaded_engine
+threaded_engine_create
+threaded_engine_destroy
+threaded_engine_fetch
+threaded_engine_next
+threaded_engine_next_reified
+threaded_engine_post
+threaded_engine_self
+threaded_engine_yield
+threaded_exit
+threaded_ignore
+threaded_notify
+threaded_once
+threaded_peek
+threaded_wait
+threads
+throw
+trivial_goal_fails
+true
truncate
+type_error
+undefined_predicates
+underscore_variables
+unify_with_occurs_check
+unknown_entities
+unknown_predicates
+uses
+use_module
+var
+version
+write
+writeq
+write_canonical
+xor
diff --git a/runtime/ftplugin/logtalk.vim b/runtime/ftplugin/logtalk.vim
index e71307a399..667907ce5f 100644
--- a/runtime/ftplugin/logtalk.vim
+++ b/runtime/ftplugin/logtalk.vim
@@ -1,7 +1,7 @@
" Logtalk filetype plugin file
" Language: Logtalk
" Maintainer: Paulo Moura <pmoura@logtalk.org>
-" Latest Revision: 2007-07-06
+" Latest Revision: 2018-08-03
if exists("b:did_ftplugin")
finish
@@ -10,9 +10,10 @@ let b:did_ftplugin = 1
let b:undo_ftplugin = "setl ts< sw< fdm< fdc< ai< dict<"
-"setlocal ts=4
+setlocal ts=4
setlocal sw=4
setlocal fdm=syntax
+setlocal fdn=10
setlocal fdc=2
setlocal autoindent
setlocal dict=$VIMRUNTIME/ftplugin/logtalk.dict
diff --git a/runtime/ftplugin/m4.vim b/runtime/ftplugin/m4.vim
index 0ffe0ac77e..3745507321 100644
--- a/runtime/ftplugin/m4.vim
+++ b/runtime/ftplugin/m4.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: m4
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: m4
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/mailaliases.vim b/runtime/ftplugin/mailaliases.vim
index 1b10c86ae3..0ae4b452d0 100644
--- a/runtime/ftplugin/mailaliases.vim
+++ b/runtime/ftplugin/mailaliases.vim
@@ -1,6 +1,6 @@
" Vim filetype plugin file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/mailcap.vim b/runtime/ftplugin/mailcap.vim
index f4c8c232d8..ba8573c722 100644
--- a/runtime/ftplugin/mailcap.vim
+++ b/runtime/ftplugin/mailcap.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: Mailcap configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: Mailcap configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/man.vim b/runtime/ftplugin/man.vim
index 04ab539fb1..26b51186a1 100644
--- a/runtime/ftplugin/man.vim
+++ b/runtime/ftplugin/man.vim
@@ -1,41 +1,56 @@
-" Vim filetype plugin file
-" Language: man
-" Maintainer: SungHyun Nam <goweol@gmail.com>
+" Maintainer: Anmol Sethi <anmol@aubble.com>
+" Previous Maintainer: SungHyun Nam <goweol@gmail.com>
-if has('vim_starting') && &filetype !=# 'man'
- finish
-endif
-
-" Only do this when not done yet for this buffer
-if exists('b:did_ftplugin')
+if exists('b:did_ftplugin') || &filetype !=# 'man'
finish
endif
let b:did_ftplugin = 1
-" Ensure Vim is not recursively invoked (man-db does this)
-" when doing ctrl-[ on a man page reference.
-if exists('$MANPAGER')
- let $MANPAGER = ''
-endif
+let s:pager = get(s:, 'pager', 0) || !exists('b:man_sect')
-setlocal iskeyword+=\.,-,(,)
-
-setlocal buftype=nofile noswapfile
-setlocal nomodifiable readonly bufhidden=hide nobuflisted tabstop=8
+if s:pager
+ call man#init_pager()
+endif
-if !exists("g:no_plugin_maps") && !exists("g:no_man_maps")
- nnoremap <silent> <buffer> <C-]> :call man#get_page(v:count, expand('<cword>'))<CR>
- nnoremap <silent> <buffer> <C-T> :call man#pop_page()<CR>
- nnoremap <silent> <nowait><buffer> q <C-W>c
- if &keywordprg !=# ':Man'
- nnoremap <silent> <buffer> K :call man#get_page(v:count, expand('<cword>'))<CR>
+setlocal buftype=nofile
+setlocal noswapfile
+setlocal bufhidden=hide
+setlocal nomodified
+setlocal readonly
+setlocal nomodifiable
+setlocal noexpandtab
+setlocal tabstop=8
+setlocal softtabstop=8
+setlocal shiftwidth=8
+setlocal wrap
+setlocal breakindent
+
+setlocal nonumber
+setlocal norelativenumber
+setlocal foldcolumn=0
+setlocal colorcolumn=0
+setlocal nolist
+setlocal nofoldenable
+
+if !exists('g:no_plugin_maps') && !exists('g:no_man_maps')
+ nnoremap <silent> <buffer> j gj
+ nnoremap <silent> <buffer> k gk
+ nnoremap <silent> <buffer> gO :call man#show_toc()<CR>
+ nnoremap <silent> <buffer> <C-]> :Man<CR>
+ nnoremap <silent> <buffer> K :Man<CR>
+ nnoremap <silent> <buffer> <C-T> :call man#pop_tag()<CR>
+ if 1 == bufnr('%') || s:pager
+ nnoremap <silent> <buffer> <nowait> q :lclose<CR>:q<CR>
+ else
+ nnoremap <silent> <buffer> <nowait> q :lclose<CR><C-W>c
endif
endif
-if exists('g:ft_man_folding_enable') && (g:ft_man_folding_enable == 1)
- setlocal foldmethod=indent foldnestmax=1 foldenable
+if get(g:, 'ft_man_folding_enable', 0)
+ setlocal foldenable
+ setlocal foldmethod=indent
+ setlocal foldnestmax=1
endif
-let b:undo_ftplugin = 'setlocal iskeyword<'
-
+let b:undo_ftplugin = ''
" vim: set sw=2:
diff --git a/runtime/ftplugin/manconf.vim b/runtime/ftplugin/manconf.vim
index a249a97507..aa85408cef 100644
--- a/runtime/ftplugin/manconf.vim
+++ b/runtime/ftplugin/manconf.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: man.conf(5) - man configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: man.conf(5) - man configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/markdown.vim b/runtime/ftplugin/markdown.vim
index 5d6ebecd8c..277ba94e8b 100644
--- a/runtime/ftplugin/markdown.vim
+++ b/runtime/ftplugin/markdown.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin
" Language: Markdown
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
-" Last Change: 2013 May 30
+" Last Change: 2016 Aug 29
if exists("b:did_ftplugin")
finish
@@ -11,7 +11,7 @@ runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
setlocal comments=fb:*,fb:-,fb:+,n:> commentstring=>\ %s
setlocal formatoptions+=tcqln formatoptions-=r formatoptions-=o
-setlocal formatlistpat=^\\s*\\d\\+\\.\\s\\+\\\|^[-*+]\\s\\+
+setlocal formatlistpat=^\\s*\\d\\+\\.\\s\\+\\\|^[-*+]\\s\\+\\\|^\\[^\\ze[^\\]]\\+\\]:
if exists('b:undo_ftplugin')
let b:undo_ftplugin .= "|setl cms< com< fo< flp<"
@@ -19,4 +19,32 @@ else
let b:undo_ftplugin = "setl cms< com< fo< flp<"
endif
+function! MarkdownFold()
+ let line = getline(v:lnum)
+
+ " Regular headers
+ let depth = match(line, '\(^#\+\)\@<=\( .*$\)\@=')
+ if depth > 0
+ return ">" . depth
+ endif
+
+ " Setext style headings
+ let nextline = getline(v:lnum + 1)
+ if (line =~ '^.\+$') && (nextline =~ '^=\+$')
+ return ">1"
+ endif
+
+ if (line =~ '^.\+$') && (nextline =~ '^-\+$')
+ return ">2"
+ endif
+
+ return "="
+endfunction
+
+if has("folding") && exists("g:markdown_folding")
+ setlocal foldexpr=MarkdownFold()
+ setlocal foldmethod=expr
+ let b:undo_ftplugin .= " foldexpr< foldmethod<"
+endif
+
" vim:set sw=2:
diff --git a/runtime/ftplugin/mf.vim b/runtime/ftplugin/mf.vim
index fd1d3ce646..7c9a8a1283 100644
--- a/runtime/ftplugin/mf.vim
+++ b/runtime/ftplugin/mf.vim
@@ -1,7 +1,8 @@
" Vim filetype plugin file
-" Language: MetaFont
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: METAFONT
+" Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+" Former Maintainers: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2016 Oct 2
if exists("b:did_ftplugin")
finish
@@ -11,9 +12,59 @@ let b:did_ftplugin = 1
let s:cpo_save = &cpo
set cpo&vim
-let b:undo_ftplugin = "setl com< cms< fo<"
+let b:undo_ftplugin = "setl com< cms< fo< sua< inc< def< ofu<"
+ \ . "| unlet! b:match_ignorecase b:match_words b:match_skip"
-setlocal comments=:% commentstring=%\ %s formatoptions-=t formatoptions+=croql
+setlocal comments=:% commentstring=%\ %s formatoptions-=t formatoptions+=cjroql2
+setlocal suffixesadd=.mf
+let &l:include = '\<input\>'
+let &l:define = '\<\%(let\|newinternal\|interim\|def\|vardef\)\>\|\<\%(primary\|secondary\|tertiary\)def\>\s*[^ .]\+'
+setlocal omnifunc=syntaxcomplete#Complete
+let g:omni_syntax_group_include_mf = 'mf\w\+'
+let g:omni_syntax_group_exclude_mf = 'mfTodoComment'
+
+let s:mp_regex = {
+ \ 'beginsection' : '^\s*\%(\%(\|var\|primary\|secondary\|tertiary\)def\|beginchar\|beginlogochar\)\>',
+ \ 'endsection' : '^\s*\%(enddef\|endchar\)\>',
+ \ 'beginblock' : '^\s*\%(begingroup\|if\|for\%(\|suffixes\|ever\)\)\>',
+ \ 'endblock' : '^\s*\%(endgroup\|fi\|endfor\)\>'
+ \ }
+
+function! s:move_around(count, what, flags, visual)
+ if a:visual
+ exe "normal! gv"
+ endif
+ call search(s:mp_regex[a:what], a:flags.'s') " 's' sets previous context mark
+ call map(range(2, a:count), 'search(s:mp_regex[a:what], a:flags)')
+endfunction
+
+
+" Move around macros.
+nnoremap <silent><buffer> [[ :<C-U>call <SID>move_around(v:count1, "beginsection", "bW", v:false) <CR>
+vnoremap <silent><buffer> [[ :<C-U>call <SID>move_around(v:count1, "beginsection", "bW", v:true) <CR>
+nnoremap <silent><buffer> ]] :<C-U>call <SID>move_around(v:count1, "beginsection", "W", v:false) <CR>
+vnoremap <silent><buffer> ]] :<C-U>call <SID>move_around(v:count1, "beginsection", "W", v:true) <CR>
+nnoremap <silent><buffer> [] :<C-U>call <SID>move_around(v:count1, "endsection", "bW", v:false) <CR>
+vnoremap <silent><buffer> [] :<C-U>call <SID>move_around(v:count1, "endsection", "bW", v:true) <CR>
+nnoremap <silent><buffer> ][ :<C-U>call <SID>move_around(v:count1, "endsection", "W", v:false) <CR>
+vnoremap <silent><buffer> ][ :<C-U>call <SID>move_around(v:count1, "endsection", "W", v:true) <CR>
+nnoremap <silent><buffer> [{ :<C-U>call <SID>move_around(v:count1, "beginblock", "bW", v:false) <CR>
+vnoremap <silent><buffer> [{ :<C-U>call <SID>move_around(v:count1, "beginblock", "bW", v:true) <CR>
+nnoremap <silent><buffer> ]} :<C-U>call <SID>move_around(v:count1, "endblock", "W", v:false) <CR>
+vnoremap <silent><buffer> ]} :<C-U>call <SID>move_around(v:count1, "endblock", "W", v:true) <CR>
+
+if exists("loaded_matchit")
+ let b:match_ignorecase = 0
+ let b:match_words =
+ \ '\<if\>:\<else\%[if]\>:\<fi\>,' .
+ \ '\<for\%(\|suffixes\|ever\)\>:\<exit\%(if\|unless\)\>:\<endfor\>,' .
+ \ '\<\%(\|var\|primary\|secondary\|tertiary\)def\>:\<enddef\>,' .
+ \ '\<begingroup\>:\<endgroup\>,' .
+ \ '\<begin\%(logo\)\?char\>:\<endchar\>'
+ " Ignore comments and strings
+ let b:match_skip = 'synIDattr(synID(line("."), col("."), 1), "name")
+ \ =~# "mf\\(Comment\\|String\\)$"'
+endif
let &cpo = s:cpo_save
unlet s:cpo_save
diff --git a/runtime/ftplugin/modconf.vim b/runtime/ftplugin/modconf.vim
index f200e9f61e..c8e76b538b 100644
--- a/runtime/ftplugin/modconf.vim
+++ b/runtime/ftplugin/modconf.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: modules.conf(5) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: modules.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/mp.vim b/runtime/ftplugin/mp.vim
index 316fa9bb64..3a0a3d0298 100644
--- a/runtime/ftplugin/mp.vim
+++ b/runtime/ftplugin/mp.vim
@@ -1,7 +1,8 @@
" Vim filetype plugin file
-" Language: MetaPost
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: MetaPost
+" Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+" Former Maintainers: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2016 Oct 2
if exists("b:did_ftplugin")
finish
@@ -11,9 +12,16 @@ let b:did_ftplugin = 1
let s:cpo_save = &cpo
set cpo&vim
-let b:undo_ftplugin = "setl com< cms< fo<"
+let b:undo_ftplugin = "setl com< cms< fo< sua< inc< def< ofu<"
+ \ . "| unlet! b:match_ignorecase b:match_words b:match_skip"
-setlocal comments=:% commentstring=%\ %s formatoptions-=t formatoptions+=croql
+setlocal comments=:% commentstring=%\ %s formatoptions-=t formatoptions+=cjroql2
+setlocal suffixesadd=.mp,.mpiv
+let &l:include = '\<\%(input\|loadmodule\)\>' " loadmodule is in MetaFun
+let &l:define = '\<\%(let\|newinternal\|interim\|def\|vardef\)\>\|\<\%(primary\|secondary\|tertiary\)def\>\s*[^ .]\+'
+setlocal omnifunc=syntaxcomplete#Complete
+let g:omni_syntax_group_include_mp = 'mf\w\+,mp\w\+'
+let g:omni_syntax_group_exclude_mp = 'mfTodoComment'
if exists(":FixBeginfigs") != 2
command -nargs=0 FixBeginfigs call s:fix_beginfigs()
@@ -24,5 +32,51 @@ if exists(":FixBeginfigs") != 2
endfunction
endif
+let s:mp_regex = {
+ \ 'beginsection' : '^\s*\%(\%(\|var\|primary\|secondary\|tertiary\)def\|begin\%(fig\|char\|logochar\|glyph\|graph\)\)\>',
+ \ 'endsection' : '^\s*\%(enddef\|end\%(fig\|char\|glyph\|graph\)\)\>',
+ \ 'beginblock' : '^\s*\%(begingroup\|if\|for\%(\|suffixes\|ever\)\)\>',
+ \ 'endblock' : '^\s*\%(endgroup\|fi\|endfor\)\>'
+ \ }
+
+function! s:move_around(count, what, flags, visual)
+ if a:visual
+ exe "normal! gv"
+ endif
+ call search(s:mp_regex[a:what], a:flags.'s') " 's' sets previous context mark
+ call map(range(2, a:count), 'search(s:mp_regex[a:what], a:flags)')
+endfunction
+
+
+" Move around macros.
+nnoremap <silent><buffer> [[ :<C-U>call <SID>move_around(v:count1, "beginsection", "bW", v:false) <CR>
+vnoremap <silent><buffer> [[ :<C-U>call <SID>move_around(v:count1, "beginsection", "bW", v:true) <CR>
+nnoremap <silent><buffer> ]] :<C-U>call <SID>move_around(v:count1, "beginsection", "W", v:false) <CR>
+vnoremap <silent><buffer> ]] :<C-U>call <SID>move_around(v:count1, "beginsection", "W", v:true) <CR>
+nnoremap <silent><buffer> [] :<C-U>call <SID>move_around(v:count1, "endsection", "bW", v:false) <CR>
+vnoremap <silent><buffer> [] :<C-U>call <SID>move_around(v:count1, "endsection", "bW", v:true) <CR>
+nnoremap <silent><buffer> ][ :<C-U>call <SID>move_around(v:count1, "endsection", "W", v:false) <CR>
+vnoremap <silent><buffer> ][ :<C-U>call <SID>move_around(v:count1, "endsection", "W", v:true) <CR>
+nnoremap <silent><buffer> [{ :<C-U>call <SID>move_around(v:count1, "beginblock", "bW", v:false) <CR>
+vnoremap <silent><buffer> [{ :<C-U>call <SID>move_around(v:count1, "beginblock", "bW", v:true) <CR>
+nnoremap <silent><buffer> ]} :<C-U>call <SID>move_around(v:count1, "endblock", "W", v:false) <CR>
+vnoremap <silent><buffer> ]} :<C-U>call <SID>move_around(v:count1, "endblock", "W", v:true) <CR>
+
+if exists("loaded_matchit")
+ let b:match_ignorecase = 0
+ let b:match_words =
+ \ '\<if\>:\<else\%[if]\>:\<fi\>,' .
+ \ '\<for\%(\|suffixes\|ever\)\>:\<exit\%(if\|unless\)\>:\<endfor\>,' .
+ \ '\<\%(\|var\|primary\|secondary\|tertiary\)def\>:\<enddef\>,' .
+ \ '\<beginfig\>:\<endfig\>,' .
+ \ '\<begingroup\>:\<endgroup\>,' .
+ \ '\<begin\%(logo\)\?char\>:\<endchar\>,' .
+ \ '\<beginglyph\>:\<endglyph\>,' .
+ \ '\<begingraph\>:\<endgraph\>'
+ " Ignore comments and strings
+ let b:match_skip = 'synIDattr(synID(line("."), col("."), 1), "name")
+ \ =~# "^mf\\%(Comment\\|String\\|\\)$\\|^mpTeXinsert$"'
+endif
+
let &cpo = s:cpo_save
unlet s:cpo_save
diff --git a/runtime/ftplugin/mplayerconf.vim b/runtime/ftplugin/mplayerconf.vim
index 65034a8152..86547609c3 100644
--- a/runtime/ftplugin/mplayerconf.vim
+++ b/runtime/ftplugin/mplayerconf.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: mplayer(1) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: mplayer(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/muttrc.vim b/runtime/ftplugin/muttrc.vim
index a109e5ddda..c8ad0f2ec5 100644
--- a/runtime/ftplugin/muttrc.vim
+++ b/runtime/ftplugin/muttrc.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: mutt RC File
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: mutt RC File
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/nanorc.vim b/runtime/ftplugin/nanorc.vim
index be20d12503..e45ebac0eb 100644
--- a/runtime/ftplugin/nanorc.vim
+++ b/runtime/ftplugin/nanorc.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: nanorc(5) - GNU nano configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: nanorc(5) - GNU nano configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/neomuttrc.vim b/runtime/ftplugin/neomuttrc.vim
new file mode 100644
index 0000000000..86f1cded63
--- /dev/null
+++ b/runtime/ftplugin/neomuttrc.vim
@@ -0,0 +1,23 @@
+" Vim filetype plugin file
+" Language: NeoMutt RC File
+" Previous Maintainer: Guillaume Brogi <gui-gui@netcourrier.com>
+" Latest Revision: 2017-09-17
+" Original version copied from ftplugin/muttrc.vim
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let b:undo_ftplugin = "setl com< cms< inc< fo<"
+
+setlocal comments=:# commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &l:include = '^\s*source\>'
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/netrc.vim b/runtime/ftplugin/netrc.vim
index 105a1d3a8e..02ee327295 100644
--- a/runtime/ftplugin/netrc.vim
+++ b/runtime/ftplugin/netrc.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: netrc(5) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: netrc(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/nsis.vim b/runtime/ftplugin/nsis.vim
index acc26208c4..1a35127c86 100644
--- a/runtime/ftplugin/nsis.vim
+++ b/runtime/ftplugin/nsis.vim
@@ -1,22 +1,43 @@
" Vim ftplugin file
-" Language: NSIS script
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
-
-let s:cpo_save = &cpo
-set cpo&vim
+" Language: NSIS script
+" Maintainer: Ken Takata
+" URL: https://github.com/k-takata/vim-nsis
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 2018-01-26
if exists("b:did_ftplugin")
finish
endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
let b:did_ftplugin = 1
let b:undo_ftplugin = "setl com< cms< fo< def< inc<"
+ \ " | unlet! b:match_ignorecase b:match_words"
setlocal comments=s1:/*,mb:*,ex:*/,b:#,:; commentstring=;\ %s
setlocal formatoptions-=t formatoptions+=croql
setlocal define=^\\s*!define\\%(\\%(utc\\)\\=date\\|math\\)\\=
setlocal include=^\\s*!include\\%(/NONFATAL\\)\\=
+if exists("loaded_matchit")
+ let b:match_ignorecase = 1
+ let b:match_words =
+ \ '\${\%(If\|IfNot\|Unless\)}:\${\%(Else\|ElseIf\|ElseIfNot\|ElseUnless\)}:\${\%(EndIf\|EndUnless\)},' .
+ \ '\${Select}:\${EndSelect},' .
+ \ '\${Switch}:\${EndSwitch},' .
+ \ '\${\%(Do\|DoWhile\|DoUntil\)}:\${\%(Loop\|LoopWhile\|LoopUntil\)},' .
+ \ '\${\%(For\|ForEach\)}:\${Next},' .
+ \ '\<Function\>:\<FunctionEnd\>,' .
+ \ '\<Section\>:\<SectionEnd\>,' .
+ \ '\<SectionGroup\>:\<SectionGroupEnd\>,' .
+ \ '\<PageEx\>:\<PageExEnd\>,' .
+ \ '\${MementoSection}:\${MementoSectionEnd},' .
+ \ '!if\%(\%(macro\)\?n\?def\)\?\>:!else\>:!endif\>,' .
+ \ '!macro\>:!macroend\>'
+endif
+
let &cpo = s:cpo_save
unlet s:cpo_save
diff --git a/runtime/ftplugin/pamconf.vim b/runtime/ftplugin/pamconf.vim
index 96d96461e2..f0a693e3a5 100644
--- a/runtime/ftplugin/pamconf.vim
+++ b/runtime/ftplugin/pamconf.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: pam(8) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: pam(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/passwd.vim b/runtime/ftplugin/passwd.vim
index 5088c43359..f6e0f50342 100644
--- a/runtime/ftplugin/passwd.vim
+++ b/runtime/ftplugin/passwd.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: passwd(5) password file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: passwd(5) password file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/perl.vim b/runtime/ftplugin/perl.vim
index 741cfae047..e7acf654f3 100644
--- a/runtime/ftplugin/perl.vim
+++ b/runtime/ftplugin/perl.vim
@@ -3,7 +3,7 @@
" Maintainer: vim-perl <vim-perl@googlegroups.com>
" Homepage: http://github.com/vim-perl/vim-perl
" Bugs/requests: http://github.com/vim-perl/vim-perl/issues
-" Last Change: 2013-07-21
+" Last Change: 2015-02-09
if exists("b:did_ftplugin") | finish | endif
let b:did_ftplugin = 1
@@ -33,14 +33,14 @@ endif
setlocal include=\\<\\(use\\\|require\\)\\>
setlocal includeexpr=substitute(substitute(substitute(v:fname,'::','/','g'),'->\*','',''),'$','.pm','')
setlocal define=[^A-Za-z_]
+setlocal iskeyword+=:
" The following line changes a global variable but is necessary to make
-" gf and similar commands work. The change to iskeyword was incorrect.
-" Thanks to Andrew Pimlott for pointing out the problem. If this causes a
-" problem for you, add an after/ftplugin/perl.vim file that contains
+" gf and similar commands work. Thanks to Andrew Pimlott for pointing
+" out the problem. If this causes a problem for you, add an
+" after/ftplugin/perl.vim file that contains
" set isfname-=:
set isfname+=:
-set iskeyword+=:
" Set this once, globally.
if !exists("perlpath")
@@ -77,11 +77,12 @@ endif
"---------------------------------------------
" Undo the stuff we changed.
-let b:undo_ftplugin = "setlocal fo< com< cms< inc< inex< def< isf< kp< path<" .
+let b:undo_ftplugin = "setlocal fo< com< cms< inc< inex< def< isk< isf< kp< path<" .
\ " | unlet! b:browsefilter"
" proper matching for matchit plugin
let b:match_skip = 's:comment\|string\|perlQQ\|perlShellCommand\|perlHereDoc\|perlSubstitution\|perlTranslation\|perlMatch\|perlFormatField'
+let b:match_words = '\<if\>:\<elsif\>:\<else\>'
" Restore the saved compatibility options.
let &cpo = s:save_cpo
diff --git a/runtime/ftplugin/pinfo.vim b/runtime/ftplugin/pinfo.vim
index 6ec1f87b9e..50473a8114 100644
--- a/runtime/ftplugin/pinfo.vim
+++ b/runtime/ftplugin/pinfo.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: pinfo(1) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: pinfo(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/procmail.vim b/runtime/ftplugin/procmail.vim
index cc2ceede19..d64f19274d 100644
--- a/runtime/ftplugin/procmail.vim
+++ b/runtime/ftplugin/procmail.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: procmail(1) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: procmail(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/prolog.vim b/runtime/ftplugin/prolog.vim
index caeb574c5a..f4e7d135b5 100644
--- a/runtime/ftplugin/prolog.vim
+++ b/runtime/ftplugin/prolog.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: Prolog
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: Prolog
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/protocols.vim b/runtime/ftplugin/protocols.vim
index 2486ff9370..83856ce7ba 100644
--- a/runtime/ftplugin/protocols.vim
+++ b/runtime/ftplugin/protocols.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: protocols(5) - Internet protocols definition file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: protocols(5) - Internet protocols definition file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/python.vim b/runtime/ftplugin/python.vim
index 75c7e87996..5c4a59b1a9 100644
--- a/runtime/ftplugin/python.vim
+++ b/runtime/ftplugin/python.vim
@@ -1,8 +1,10 @@
" Vim filetype plugin file
" Language: python
-" Maintainer: Johannes Zellner <johannes@zellner.org>
-" Last Change: 2014 Feb 09
-" Last Change By Johannes: Wed, 21 Apr 2004 13:13:08 CEST
+" Maintainer: Tom Picton <tom@tompicton.co.uk>
+" Previous Maintainer: James Sully <sullyj3@gmail.com>
+" Previous Maintainer: Johannes Zellner <johannes@zellner.org>
+" Last Change: Sun, 15 April 2018
+" https://github.com/tpict/vim-ftplugin-python
if exists("b:did_ftplugin") | finish | endif
let b:did_ftplugin = 1
@@ -12,41 +14,106 @@ set cpo&vim
setlocal cinkeys-=0#
setlocal indentkeys-=0#
setlocal include=^\\s*\\(from\\\|import\\)
-setlocal includeexpr=substitute(v:fname,'\\.','/','g')
+
+" For imports with leading .., append / and replace additional .s with ../
+let b:grandparent_match = '^\(.\.\)\(\.*\)'
+let b:grandparent_sub = '\=submatch(1)."/".repeat("../",strlen(submatch(2)))'
+
+" For imports with a single leading ., replace it with ./
+let b:parent_match = '^\.\(\.\)\@!'
+let b:parent_sub = './'
+
+" Replace any . sandwiched between word characters with /
+let b:child_match = '\(\w\)\.\(\w\)'
+let b:child_sub = '\1/\2'
+
+setlocal includeexpr=substitute(substitute(substitute(
+ \v:fname,
+ \b:grandparent_match,b:grandparent_sub,''),
+ \b:parent_match,b:parent_sub,''),
+ \b:child_match,b:child_sub,'g')
+
setlocal suffixesadd=.py
setlocal comments=b:#,fb:-
setlocal commentstring=#\ %s
setlocal omnifunc=pythoncomplete#Complete
+if has('python3')
+ setlocal omnifunc=python3complete#Complete
+endif
set wildignore+=*.pyc
-nnoremap <silent> <buffer> ]] :call <SID>Python_jump('/^\(class\\|def\)')<cr>
-nnoremap <silent> <buffer> [[ :call <SID>Python_jump('?^\(class\\|def\)')<cr>
-nnoremap <silent> <buffer> ]m :call <SID>Python_jump('/^\s*\(class\\|def\)')<cr>
-nnoremap <silent> <buffer> [m :call <SID>Python_jump('?^\s*\(class\\|def\)')<cr>
+let b:next_toplevel='\v%$\|^(class\|def\|async def)>'
+let b:prev_toplevel='\v^(class\|def\|async def)>'
+let b:next_endtoplevel='\v%$\|\S.*\n+(def\|class)'
+let b:prev_endtoplevel='\v\S.*\n+(def\|class)'
+let b:next='\v%$\|^\s*(class\|def\|async def)>'
+let b:prev='\v^\s*(class\|def\|async def)>'
+let b:next_end='\v\S\n*(%$\|^(\s*\n*)*(class\|def\|async def)\|^\S)'
+let b:prev_end='\v\S\n*(^(\s*\n*)*(class\|def\|async def)\|^\S)'
+
+execute "nnoremap <silent> <buffer> ]] :call <SID>Python_jump('n', '". b:next_toplevel."', 'W', v:count1)<cr>"
+execute "nnoremap <silent> <buffer> [[ :call <SID>Python_jump('n', '". b:prev_toplevel."', 'Wb', v:count1)<cr>"
+execute "nnoremap <silent> <buffer> ][ :call <SID>Python_jump('n', '". b:next_endtoplevel."', 'W', 0, v:count1)<cr>"
+execute "nnoremap <silent> <buffer> [] :call <SID>Python_jump('n', '". b:prev_endtoplevel."', 'Wb', 0, v:count1)<cr>"
+execute "nnoremap <silent> <buffer> ]m :call <SID>Python_jump('n', '". b:next."', 'W', v:count1)<cr>"
+execute "nnoremap <silent> <buffer> [m :call <SID>Python_jump('n', '". b:prev."', 'Wb', v:count1)<cr>"
+execute "nnoremap <silent> <buffer> ]M :call <SID>Python_jump('n', '". b:next_end."', 'W', 0, v:count1)<cr>"
+execute "nnoremap <silent> <buffer> [M :call <SID>Python_jump('n', '". b:prev_end."', 'Wb', 0, v:count1)<cr>"
+
+execute "onoremap <silent> <buffer> ]] :call <SID>Python_jump('o', '". b:next_toplevel."', 'W', v:count1)<cr>"
+execute "onoremap <silent> <buffer> [[ :call <SID>Python_jump('o', '". b:prev_toplevel."', 'Wb', v:count1)<cr>"
+execute "onoremap <silent> <buffer> ][ :call <SID>Python_jump('o', '". b:next_endtoplevel."', 'W', 0, v:count1)<cr>"
+execute "onoremap <silent> <buffer> [] :call <SID>Python_jump('o', '". b:prev_endtoplevel."', 'Wb', 0, v:count1)<cr>"
+execute "onoremap <silent> <buffer> ]m :call <SID>Python_jump('o', '". b:next."', 'W', v:count1)<cr>"
+execute "onoremap <silent> <buffer> [m :call <SID>Python_jump('o', '". b:prev."', 'Wb', v:count1)<cr>"
+execute "onoremap <silent> <buffer> ]M :call <SID>Python_jump('o', '". b:next_end."', 'W', 0, v:count1)<cr>"
+execute "onoremap <silent> <buffer> [M :call <SID>Python_jump('o', '". b:prev_end."', 'Wb', 0, v:count1)<cr>"
+
+execute "xnoremap <silent> <buffer> ]] :call <SID>Python_jump('x', '". b:next_toplevel."', 'W', v:count1)<cr>"
+execute "xnoremap <silent> <buffer> [[ :call <SID>Python_jump('x', '". b:prev_toplevel."', 'Wb', v:count1)<cr>"
+execute "xnoremap <silent> <buffer> ][ :call <SID>Python_jump('x', '". b:next_endtoplevel."', 'W', 0, v:count1)<cr>"
+execute "xnoremap <silent> <buffer> [] :call <SID>Python_jump('x', '". b:prev_endtoplevel."', 'Wb', 0, v:count1)<cr>"
+execute "xnoremap <silent> <buffer> ]m :call <SID>Python_jump('x', '". b:next."', 'W', v:count1)<cr>"
+execute "xnoremap <silent> <buffer> [m :call <SID>Python_jump('x', '". b:prev."', 'Wb', v:count1)<cr>"
+execute "xnoremap <silent> <buffer> ]M :call <SID>Python_jump('x', '". b:next_end."', 'W', 0, v:count1)<cr>"
+execute "xnoremap <silent> <buffer> [M :call <SID>Python_jump('x', '". b:prev_end."', 'Wb', 0, v:count1)<cr>"
if !exists('*<SID>Python_jump')
- fun! <SID>Python_jump(motion) range
- let cnt = v:count1
- let save = @/ " save last search pattern
+ fun! <SID>Python_jump(mode, motion, flags, count, ...) range
+ let l:startofline = (a:0 >= 1) ? a:1 : 1
+
+ if a:mode == 'x'
+ normal! gv
+ endif
+
+ if l:startofline == 1
+ normal! 0
+ endif
+
+ let cnt = a:count
mark '
while cnt > 0
- silent! exe a:motion
- let cnt = cnt - 1
+ call search(a:motion, a:flags)
+ let cnt = cnt - 1
endwhile
- call histdel('/', -1)
- let @/ = save " restore last search pattern
+
+ if l:startofline == 1
+ normal! ^
+ endif
endfun
endif
if has("browsefilter") && !exists("b:browsefilter")
let b:browsefilter = "Python Files (*.py)\t*.py\n" .
- \ "All Files (*.*)\t*.*\n"
+ \ "All Files (*.*)\t*.*\n"
endif
-" As suggested by PEP8.
-setlocal expandtab shiftwidth=4 softtabstop=4 tabstop=8
+if !exists("g:python_recommended_style") || g:python_recommended_style != 0
+ " As suggested by PEP8.
+ setlocal expandtab shiftwidth=4 softtabstop=4 tabstop=8
+endif
" First time: try finding "pydoc".
if !exists('g:pydoc_executable')
diff --git a/runtime/ftplugin/qf.vim b/runtime/ftplugin/qf.vim
index 98c8f932bc..80e86c4d16 100644
--- a/runtime/ftplugin/qf.vim
+++ b/runtime/ftplugin/qf.vim
@@ -14,3 +14,26 @@ let b:undo_ftplugin = "set stl<"
" Display the command that produced the list in the quickfix window:
setlocal stl=%t%{exists('w:quickfix_title')?\ '\ '.w:quickfix_title\ :\ ''}\ %=%-15(%l,%c%V%)\ %P
+
+function! s:setup_toc() abort
+ if get(w:, 'quickfix_title') !~# '\<TOC$' || &syntax != 'qf'
+ return
+ endif
+
+ let list = getloclist(0)
+ if empty(list)
+ return
+ endif
+
+ let bufnr = list[0].bufnr
+ setlocal modifiable
+ silent %delete _
+ call setline(1, map(list, 'v:val.text'))
+ setlocal nomodifiable nomodified
+ let &syntax = getbufvar(bufnr, '&syntax')
+endfunction
+
+augroup qf_toc
+ autocmd!
+ autocmd Syntax <buffer> call s:setup_toc()
+augroup END
diff --git a/runtime/ftplugin/quake.vim b/runtime/ftplugin/quake.vim
index f62693b11a..c3a2e52347 100644
--- a/runtime/ftplugin/quake.vim
+++ b/runtime/ftplugin/quake.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: Quake[1-3] configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: Quake[1-3] configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/racc.vim b/runtime/ftplugin/racc.vim
index 7ff22f8937..0cd852c365 100644
--- a/runtime/ftplugin/racc.vim
+++ b/runtime/ftplugin/racc.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: Racc input file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: Racc input file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/readline.vim b/runtime/ftplugin/readline.vim
index 0a4dbb5c03..e9ef93ec7f 100644
--- a/runtime/ftplugin/readline.vim
+++ b/runtime/ftplugin/readline.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: readline(3) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: readline(3) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/rmd.vim b/runtime/ftplugin/rmd.vim
index ec64a07675..7b0db8dbb5 100644
--- a/runtime/ftplugin/rmd.vim
+++ b/runtime/ftplugin/rmd.vim
@@ -1,18 +1,21 @@
" Vim filetype plugin file
-" Language: R help file
+" Language: R Markdown file
" Maintainer: Jakson Alves de Aquino <jalvesaq@gmail.com>
" Homepage: https://github.com/jalvesaq/R-Vim-runtime
-" Last Change: Tue Apr 07, 2015 04:37PM
-" Original work by Alex Zvoleff (adjusted for rmd by Michel Kuhlmann)
+" Last Change: Sun Jul 22, 2018 06:51PM
+" Original work by Alex Zvoleff (adjusted from R help for rmd by Michel Kuhlmann)
" Only do this when not yet done for this buffer
if exists("b:did_ftplugin")
finish
endif
-runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
+if exists('g:rmd_include_html') && g:rmd_include_html
+ runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
+endif
-setlocal comments=fb:*,fb:-,fb:+,n:> commentstring=>\ %s
+setlocal comments=fb:*,fb:-,fb:+,n:>
+setlocal commentstring=#\ %s
setlocal formatoptions+=tcqln
setlocal formatlistpat=^\\s*\\d\\+\\.\\s\\+\\\|^\\s*[-*+]\\s\\+
setlocal iskeyword=@,48-57,_,.
@@ -20,6 +23,22 @@ setlocal iskeyword=@,48-57,_,.
let s:cpo_save = &cpo
set cpo&vim
+function! FormatRmd()
+ if search("^[ \t]*```[ ]*{r", "bncW") > search("^[ \t]*```$", "bncW")
+ setlocal comments=:#',:###,:##,:#
+ else
+ setlocal comments=fb:*,fb:-,fb:+,n:>
+ endif
+ return 1
+endfunction
+
+" If you do not want 'comments' dynamically defined, put in your vimrc:
+" let g:rmd_dynamic_comments = 0
+if !exists("g:rmd_dynamic_comments") || (exists("g:rmd_dynamic_comments") && g:rmd_dynamic_comments == 1)
+ setlocal formatexpr=FormatRmd()
+endif
+
+
" Enables pandoc if it is installed
unlet! b:did_ftplugin
runtime ftplugin/pandoc.vim
diff --git a/runtime/ftplugin/rnc.vim b/runtime/ftplugin/rnc.vim
index 2b8fd50d8d..90aa111c67 100644
--- a/runtime/ftplugin/rnc.vim
+++ b/runtime/ftplugin/rnc.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: Relax NG compact syntax
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: Relax NG compact syntax
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/rrst.vim b/runtime/ftplugin/rrst.vim
index ecfd6e87a1..3e82847d35 100644
--- a/runtime/ftplugin/rrst.vim
+++ b/runtime/ftplugin/rrst.vim
@@ -2,7 +2,7 @@
" Language: reStructuredText documentation format with R code
" Maintainer: Jakson Alves de Aquino <jalvesaq@gmail.com>
" Homepage: https://github.com/jalvesaq/R-Vim-runtime
-" Last Change: Tue Apr 07, 2015 04:38PM
+" Last Change: Wed Nov 01, 2017 10:47PM
" Original work by Alex Zvoleff
" Only do this when not yet done for this buffer
@@ -16,11 +16,27 @@ let b:did_ftplugin = 1
let s:cpo_save = &cpo
set cpo&vim
-setlocal comments=fb:*,fb:-,fb:+,n:> commentstring=>\ %s
+setlocal comments=fb:*,fb:-,fb:+,n:>
+setlocal commentstring=#\ %s
setlocal formatoptions+=tcqln
setlocal formatlistpat=^\\s*\\d\\+\\.\\s\\+\\\|^\\s*[-*+]\\s\\+
setlocal iskeyword=@,48-57,_,.
+function! FormatRrst()
+ if search('^\.\. {r', "bncW") > search('^\.\. \.\.$', "bncW")
+ setlocal comments=:#',:###,:##,:#
+ else
+ setlocal comments=fb:*,fb:-,fb:+,n:>
+ endif
+ return 1
+endfunction
+
+" If you do not want 'comments' dynamically defined, put in your vimrc:
+" let g:rrst_dynamic_comments = 0
+if !exists("g:rrst_dynamic_comments") || (exists("g:rrst_dynamic_comments") && g:rrst_dynamic_comments == 1)
+ setlocal formatexpr=FormatRrst()
+endif
+
if has("gui_win32") && !exists("b:browsefilter")
let b:browsefilter = "R Source Files (*.R *.Rnw *.Rd *.Rmd *.Rrst)\t*.R;*.Rnw;*.Rd;*.Rmd;*.Rrst\n" .
\ "All Files (*.*)\t*.*\n"
diff --git a/runtime/ftplugin/rst.vim b/runtime/ftplugin/rst.vim
index b871cf1486..9d737cde44 100644
--- a/runtime/ftplugin/rst.vim
+++ b/runtime/ftplugin/rst.vim
@@ -1,10 +1,12 @@
-" Vim filetype plugin file
-" Language: reStructuredText documentation format
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" reStructuredText filetype plugin file
+" Language: reStructuredText documentation format
+" Maintainer: Marshall Ward <marshall.ward@gmail.com>
+" Original Maintainer: Nikolai Weibull <now@bitwi.se>
+" Website: https://github.com/marshallward/vim-restructuredtext
+" Latest Revision: 2018-01-07
if exists("b:did_ftplugin")
- finish
+ finish
endif
let b:did_ftplugin = 1
@@ -16,5 +18,25 @@ let b:undo_ftplugin = "setl com< cms< et< fo<"
setlocal comments=fb:.. commentstring=..\ %s expandtab
setlocal formatoptions+=tcroql
+" reStructuredText standard recommends that tabs be expanded to 8 spaces
+" The choice of 3-space indentation is to provide slightly better support for
+" directives (..) and ordered lists (1.), although it can cause problems for
+" many other cases.
+"
+" More sophisticated indentation rules should be revisted in the future.
+
+if !exists("g:rst_style") || g:rst_style != 0
+ setlocal expandtab shiftwidth=3 softtabstop=3 tabstop=8
+endif
+
+if has('patch-7.3.867') " Introduced the TextChanged event.
+ setlocal foldmethod=expr
+ setlocal foldexpr=RstFold#GetRstFold()
+ setlocal foldtext=RstFold#GetRstFoldText()
+ augroup RstFold
+ autocmd TextChanged,InsertLeave <buffer> unlet! b:RstFoldCache
+ augroup END
+endif
+
let &cpo = s:cpo_save
unlet s:cpo_save
diff --git a/runtime/ftplugin/ruby.vim b/runtime/ftplugin/ruby.vim
index 9630a940ab..84fb9930a4 100644
--- a/runtime/ftplugin/ruby.vim
+++ b/runtime/ftplugin/ruby.vim
@@ -28,12 +28,13 @@ if exists("loaded_matchit") && !exists("b:match_words")
\ ':' .
\ '\<\%(else\|elsif\|ensure\|when\|rescue\|break\|redo\|next\|retry\)\>' .
\ ':' .
- \ '\<end\>' .
+ \ '\%(^\|[^.\:@$]\)\@<=\<end\:\@!\>' .
\ ',{:},\[:\],(:)'
let b:match_skip =
\ "synIDattr(synID(line('.'),col('.'),0),'name') =~ '" .
\ "\\<ruby\\%(String\\|StringDelimiter\\|ASCIICode\\|Escape\\|" .
+ \ "Regexp\\|RegexpDelimiter\\|" .
\ "Interpolation\\|NoInterpolation\\|Comment\\|Documentation\\|" .
\ "ConditionalModifier\\|RepeatModifier\\|OptionalDo\\|" .
\ "Function\\|BlockArgument\\|KeywordAsMethod\\|ClassVariable\\|" .
@@ -43,7 +44,7 @@ endif
setlocal formatoptions-=t formatoptions+=croql
setlocal include=^\\s*\\<\\(load\\>\\\|require\\>\\\|autoload\\s*:\\=[\"']\\=\\h\\w*[\"']\\=,\\)
-setlocal includeexpr=substitute(substitute(v:fname,'::','/','g'),'$','.rb','')
+setlocal includeexpr=substitute(substitute(v:fname,'::','/','g'),'\%(\.rb\)\=$','.rb','')
setlocal suffixesadd=.rb
if exists("&ofu") && has("ruby")
@@ -66,32 +67,32 @@ if !exists('g:ruby_version_paths')
let g:ruby_version_paths = {}
endif
-function! s:query_path(root)
+function! s:query_path(root) abort
let code = "print $:.join %q{,}"
- if &shell =~# 'sh' && $PATH !~# '\s'
- let prefix = 'env PATH='.$PATH.' '
+ if &shell =~# 'sh'
+ let prefix = 'env PATH='.shellescape($PATH).' '
else
let prefix = ''
endif
if &shellxquote == "'"
- let path_check = prefix.'ruby -e "' . code . '"'
+ let path_check = prefix.'ruby --disable-gems -e "' . code . '"'
else
- let path_check = prefix."ruby -e '" . code . "'"
+ let path_check = prefix."ruby --disable-gems -e '" . code . "'"
endif
let cd = haslocaldir() ? 'lcd' : 'cd'
- let cwd = getcwd()
+ let cwd = fnameescape(getcwd())
try
exe cd fnameescape(a:root)
let path = split(system(path_check),',')
- exe cd fnameescape(cwd)
+ exe cd cwd
return path
finally
- exe cd fnameescape(cwd)
+ exe cd cwd
endtry
endfunction
-function! s:build_path(path)
+function! s:build_path(path) abort
let path = join(map(copy(a:path), 'v:val ==# "." ? "" : v:val'), ',')
if &g:path !~# '\v^\.%(,/%(usr|emx)/include)=,,$'
let path = substitute(&g:path,',,$',',','') . ',' . path
@@ -101,7 +102,7 @@ endfunction
if !exists('b:ruby_version') && !exists('g:ruby_path') && isdirectory(expand('%:p:h'))
let s:version_file = findfile('.ruby-version', '.;')
- if !empty(s:version_file)
+ if !empty(s:version_file) && filereadable(s:version_file)
let b:ruby_version = get(readfile(s:version_file, '', 1), '')
if !has_key(g:ruby_version_paths, b:ruby_version)
let g:ruby_version_paths[b:ruby_version] = s:query_path(fnamemodify(s:version_file, ':p:h'))
@@ -135,7 +136,7 @@ if exists('s:ruby_paths') && stridx(&l:tags, join(map(copy(s:ruby_paths),'v:val.
let &l:tags = &tags . ',' . join(map(copy(s:ruby_paths),'v:val."/tags"'),',')
endif
-if has("gui_win32") && !exists("b:browsefilter")
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
let b:browsefilter = "Ruby Source Files (*.rb)\t*.rb\n" .
\ "All Files (*.*)\t*.*\n"
endif
@@ -145,7 +146,22 @@ let b:undo_ftplugin = "setl fo< inc< inex< sua< def< com< cms< path< tags< kp<"
\."| if exists('&ofu') && has('ruby') | setl ofu< | endif"
\."| if has('balloon_eval') && exists('+bexpr') | setl bexpr< | endif"
+function! s:map(mode, flags, map) abort
+ let from = matchstr(a:map, '\S\+')
+ if empty(mapcheck(from, a:mode))
+ exe a:mode.'map' '<buffer>'.(a:0 ? a:1 : '') a:map
+ let b:undo_ftplugin .= '|sil! '.a:mode.'unmap <buffer> '.from
+ endif
+endfunction
+
+cmap <buffer><script><expr> <Plug><cword> substitute(RubyCursorIdentifier(),'^$',"\022\027",'')
+cmap <buffer><script><expr> <Plug><cfile> substitute(RubyCursorFile(),'^$',"\022\006",'')
+let b:undo_ftplugin .= "| sil! cunmap <buffer> <Plug><cword>| sil! cunmap <buffer> <Plug><cfile>"
+
if !exists("g:no_plugin_maps") && !exists("g:no_ruby_maps")
+ nmap <buffer><script> <SID>: :<C-U>
+ nmap <buffer><script> <SID>c: :<C-U><C-R>=v:count ? v:count : ''<CR>
+
nnoremap <silent> <buffer> [m :<C-U>call <SID>searchsyn('\<def\>','rubyDefine','b','n')<CR>
nnoremap <silent> <buffer> ]m :<C-U>call <SID>searchsyn('\<def\>','rubyDefine','','n')<CR>
nnoremap <silent> <buffer> [M :<C-U>call <SID>searchsyn('\<end\>','rubyDefine','b','n')<CR>
@@ -168,7 +184,7 @@ if !exists("g:no_plugin_maps") && !exists("g:no_ruby_maps")
\."| sil! exe 'unmap <buffer> [[' | sil! exe 'unmap <buffer> ]]' | sil! exe 'unmap <buffer> []' | sil! exe 'unmap <buffer> ]['"
\."| sil! exe 'unmap <buffer> [m' | sil! exe 'unmap <buffer> ]m' | sil! exe 'unmap <buffer> [M' | sil! exe 'unmap <buffer> ]M'"
- if maparg('im','n') == ''
+ if maparg('im','x') == '' && maparg('im','o') == '' && maparg('am','x') == '' && maparg('am','o') == ''
onoremap <silent> <buffer> im :<C-U>call <SID>wrap_i('[m',']M')<CR>
onoremap <silent> <buffer> am :<C-U>call <SID>wrap_a('[m',']M')<CR>
xnoremap <silent> <buffer> im :<C-U>call <SID>wrap_i('[m',']M')<CR>
@@ -178,7 +194,7 @@ if !exists("g:no_plugin_maps") && !exists("g:no_ruby_maps")
\."| sil! exe 'xunmap <buffer> im' | sil! exe 'xunmap <buffer> am'"
endif
- if maparg('iM','n') == ''
+ if maparg('iM','x') == '' && maparg('iM','o') == '' && maparg('aM','x') == '' && maparg('aM','o') == ''
onoremap <silent> <buffer> iM :<C-U>call <SID>wrap_i('[[','][')<CR>
onoremap <silent> <buffer> aM :<C-U>call <SID>wrap_a('[[','][')<CR>
xnoremap <silent> <buffer> iM :<C-U>call <SID>wrap_i('[[','][')<CR>
@@ -188,33 +204,24 @@ if !exists("g:no_plugin_maps") && !exists("g:no_ruby_maps")
\."| sil! exe 'xunmap <buffer> iM' | sil! exe 'xunmap <buffer> aM'"
endif
- if maparg("\<C-]>",'n') == ''
- nnoremap <silent> <buffer> <C-]> :<C-U>exe v:count1."tag <C-R>=RubyCursorIdentifier()<CR>"<CR>
- nnoremap <silent> <buffer> g<C-]> :<C-U>exe "tjump <C-R>=RubyCursorIdentifier()<CR>"<CR>
- nnoremap <silent> <buffer> g] :<C-U>exe "tselect <C-R>=RubyCursorIdentifier()<CR>"<CR>
- nnoremap <silent> <buffer> <C-W>] :<C-U>exe v:count1."stag <C-R>=RubyCursorIdentifier()<CR>"<CR>
- nnoremap <silent> <buffer> <C-W><C-]> :<C-U>exe v:count1."stag <C-R>=RubyCursorIdentifier()<CR>"<CR>
- nnoremap <silent> <buffer> <C-W>g<C-]> :<C-U>exe "stjump <C-R>=RubyCursorIdentifier()<CR>"<CR>
- nnoremap <silent> <buffer> <C-W>g] :<C-U>exe "stselect <C-R>=RubyCursorIdentifier()<CR>"<CR>
- nnoremap <silent> <buffer> <C-W>} :<C-U>exe "ptag <C-R>=RubyCursorIdentifier()<CR>"<CR>
- nnoremap <silent> <buffer> <C-W>g} :<C-U>exe "ptjump <C-R>=RubyCursorIdentifier()<CR>"<CR>
- let b:undo_ftplugin = b:undo_ftplugin
- \."| sil! exe 'nunmap <buffer> <C-]>'| sil! exe 'nunmap <buffer> g<C-]>'| sil! exe 'nunmap <buffer> g]'"
- \."| sil! exe 'nunmap <buffer> <C-W>]'| sil! exe 'nunmap <buffer> <C-W><C-]>'"
- \."| sil! exe 'nunmap <buffer> <C-W>g<C-]>'| sil! exe 'nunmap <buffer> <C-W>g]'"
- \."| sil! exe 'nunmap <buffer> <C-W>}'| sil! exe 'nunmap <buffer> <C-W>g}'"
- endif
-
- if maparg("gf",'n') == ''
- " By using findfile() rather than gf's normal behavior, we prevent
- " erroneously editing a directory.
- nnoremap <silent> <buffer> gf :<C-U>exe <SID>gf(v:count1,"gf",'edit')<CR>
- nnoremap <silent> <buffer> <C-W>f :<C-U>exe <SID>gf(v:count1,"\<Lt>C-W>f",'split')<CR>
- nnoremap <silent> <buffer> <C-W><C-F> :<C-U>exe <SID>gf(v:count1,"\<Lt>C-W>\<Lt>C-F>",'split')<CR>
- nnoremap <silent> <buffer> <C-W>gf :<C-U>exe <SID>gf(v:count1,"\<Lt>C-W>gf",'tabedit')<CR>
- let b:undo_ftplugin = b:undo_ftplugin
- \."| sil! exe 'nunmap <buffer> gf' | sil! exe 'nunmap <buffer> <C-W>f' | sil! exe 'nunmap <buffer> <C-W><C-F>' | sil! exe 'nunmap <buffer> <C-W>gf'"
- endif
+ call s:map('c', '', '<C-R><C-W> <Plug><cword>')
+ call s:map('c', '', '<C-R><C-F> <Plug><cfile>')
+
+ cmap <buffer><script><expr> <SID>tagzv &foldopen =~# 'tag' ? '<Bar>norm! zv' : ''
+ call s:map('n', '<silent>', '<C-]> <SID>:exe v:count1."tag <Plug><cword>"<SID>tagzv<CR>')
+ call s:map('n', '<silent>', 'g<C-]> <SID>:exe "tjump <Plug><cword>"<SID>tagzv<CR>')
+ call s:map('n', '<silent>', 'g] <SID>:exe "tselect <Plug><cword>"<SID>tagzv<CR>')
+ call s:map('n', '<silent>', '<C-W>] <SID>:exe v:count1."stag <Plug><cword>"<SID>tagzv<CR>')
+ call s:map('n', '<silent>', '<C-W><C-]> <SID>:exe v:count1."stag <Plug><cword>"<SID>tagzv<CR>')
+ call s:map('n', '<silent>', '<C-W>g<C-]> <SID>:exe "stjump <Plug><cword>"<SID>tagzv<CR>')
+ call s:map('n', '<silent>', '<C-W>g] <SID>:exe "stselect <Plug><cword>"<SID>tagzv<CR>')
+ call s:map('n', '<silent>', '<C-W>} <SID>:exe v:count1."ptag <Plug><cword>"<CR>')
+ call s:map('n', '<silent>', '<C-W>g} <SID>:exe "ptjump <Plug><cword>"<CR>')
+
+ call s:map('n', '<silent>', 'gf <SID>c:find <Plug><cfile><CR>')
+ call s:map('n', '<silent>', '<C-W>f <SID>c:sfind <Plug><cfile><CR>')
+ call s:map('n', '<silent>', '<C-W><C-F> <SID>c:sfind <Plug><cfile><CR>')
+ call s:map('n', '<silent>', '<C-W>gf <SID>c:tabfind <Plug><cfile><CR>')
endif
let &cpo = s:cpo_save
@@ -225,7 +232,7 @@ if exists("g:did_ruby_ftplugin_functions")
endif
let g:did_ruby_ftplugin_functions = 1
-function! RubyBalloonexpr()
+function! RubyBalloonexpr() abort
if !exists('s:ri_found')
let s:ri_found = executable('ri')
endif
@@ -274,13 +281,13 @@ function! RubyBalloonexpr()
endif
endfunction
-function! s:searchsyn(pattern,syn,flags,mode)
+function! s:searchsyn(pattern, syn, flags, mode) abort
+ let cnt = v:count1
norm! m'
if a:mode ==# 'v'
norm! gv
endif
let i = 0
- let cnt = v:count ? v:count : 1
while i < cnt
let i = i + 1
let line = line('.')
@@ -296,11 +303,11 @@ function! s:searchsyn(pattern,syn,flags,mode)
endwhile
endfunction
-function! s:synname()
+function! s:synname() abort
return synIDattr(synID(line('.'),col('.'),0),'name')
endfunction
-function! s:wrap_i(back,forward)
+function! s:wrap_i(back,forward) abort
execute 'norm k'.a:forward
let line = line('.')
execute 'norm '.a:back
@@ -310,7 +317,7 @@ function! s:wrap_i(back,forward)
execute 'norm jV'.a:forward.'k'
endfunction
-function! s:wrap_a(back,forward)
+function! s:wrap_a(back,forward) abort
execute 'norm '.a:forward
if line('.') < line('$') && getline(line('.')+1) ==# ''
let after = 1
@@ -328,37 +335,55 @@ function! s:wrap_a(back,forward)
endif
endfunction
-function! RubyCursorIdentifier()
+function! RubyCursorIdentifier() abort
let asciicode = '\%(\w\|[]})\"'."'".']\)\@<!\%(?\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\=\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)\)'
let number = '\%(\%(\w\|[]})\"'."'".']\s*\)\@<!-\)\=\%(\<[[:digit:]_]\+\%(\.[[:digit:]_]\+\)\=\%([Ee][[:digit:]_]\+\)\=\>\|\<0[xXbBoOdD][[:xdigit:]_]\+\>\)\|'.asciicode
let operator = '\%(\[\]\|<<\|<=>\|[!<>]=\=\|===\=\|[!=]\~\|>>\|\*\*\|\.\.\.\=\|=>\|[~^&|*/%+-]\)'
- let method = '\%(\<[_a-zA-Z]\w*\>\%([?!]\|\s*=>\@!\)\=\)'
+ let method = '\%(\.[_a-zA-Z]\w*\s*=>\@!\|\<[_a-zA-Z]\w*\>[?!]\=\)'
let global = '$\%([!$&"'."'".'*+,./:;<=>?@\`~]\|-\=\w\+\>\)'
let symbolizable = '\%(\%(@@\=\)\w\+\>\|'.global.'\|'.method.'\|'.operator.'\)'
let pattern = '\C\s*\%('.number.'\|\%(:\@<!:\)\='.symbolizable.'\)'
let [lnum, col] = searchpos(pattern,'bcn',line('.'))
let raw = matchstr(getline('.')[col-1 : ],pattern)
- let stripped = substitute(substitute(raw,'\s\+=$','=',''),'^\s*:\=','','')
+ let stripped = substitute(substitute(raw,'\s\+=$','=',''),'^\s*[:.]\=','','')
return stripped == '' ? expand("<cword>") : stripped
endfunction
-function! s:gf(count,map,edit) abort
- if getline('.') =~# '^\s*require_relative\s*\(["'']\).*\1\s*$'
- let target = matchstr(getline('.'),'\(["'']\)\zs.\{-\}\ze\1')
- return a:edit.' %:h/'.target.'.rb'
- elseif getline('.') =~# '^\s*\%(require[( ]\|load[( ]\|autoload[( ]:\w\+,\)\s*\s*\%(::\)\=File\.expand_path(\(["'']\)\.\./.*\1,\s*__FILE__)\s*$'
- let target = matchstr(getline('.'),'\(["'']\)\.\./\zs.\{-\}\ze\1')
- return a:edit.' %:h/'.target.'.rb'
+function! RubyCursorFile() abort
+ let isfname = &isfname
+ try
+ set isfname+=:
+ let cfile = expand('<cfile>')
+ finally
+ let isfname = &isfname
+ endtry
+ let pre = matchstr(strpart(getline('.'), 0, col('.')-1), '.*\f\@<!')
+ let post = matchstr(strpart(getline('.'), col('.')), '\f\@!.*')
+ let ext = getline('.') =~# '^\s*\%(require\%(_relative\)\=\|autoload\)\>' && cfile !~# '\.rb$' ? '.rb' : ''
+ if s:synname() ==# 'rubyConstant'
+ let cfile = substitute(cfile,'\.\w\+[?!=]\=$','','')
+ let cfile = substitute(cfile,'::','/','g')
+ let cfile = substitute(cfile,'\(\u\+\)\(\u\l\)','\1_\2', 'g')
+ let cfile = substitute(cfile,'\(\l\|\d\)\(\u\)','\1_\2', 'g')
+ return tolower(cfile) . '.rb'
+ elseif getline('.') =~# '^\s*require_relative\s*\(["'']\).*\1\s*$'
+ let cfile = expand('%:p:h') . '/' . matchstr(getline('.'),'\(["'']\)\zs.\{-\}\ze\1') . ext
+ elseif getline('.') =~# '^\s*\%(require[( ]\|load[( ]\|autoload[( ]:\w\+,\)\s*\%(::\)\=File\.expand_path(\(["'']\)\.\./.*\1,\s*__FILE__)\s*$'
+ let target = matchstr(getline('.'),'\(["'']\)\.\.\zs/.\{-\}\ze\1')
+ let cfile = expand('%:p:h') . target . ext
elseif getline('.') =~# '^\s*\%(require \|load \|autoload :\w\+,\)\s*\(["'']\).*\1\s*$'
- let target = matchstr(getline('.'),'\(["'']\)\zs.\{-\}\ze\1')
+ let cfile = matchstr(getline('.'),'\(["'']\)\zs.\{-\}\ze\1') . ext
+ elseif pre.post =~# '\<File.expand_path[( ].*[''"]\{2\}, *__FILE__\>' && cfile =~# '^\.\.'
+ let cfile = expand('%:p:h') . strpart(cfile, 2)
else
- let target = expand('<cfile>')
+ return substitute(cfile, '\C\v^(.*):(\d+)%(:in)=$', '+\2 \1', '')
endif
- let found = findfile(target, &path, a:count)
- if found ==# ''
- return 'norm! '.a:count.a:map
+ let cwdpat = '^\M' . substitute(getcwd(), '[\/]', '\\[\\/]', 'g').'\ze\[\/]'
+ let cfile = substitute(cfile, cwdpat, '.', '')
+ if fnameescape(cfile) !=# cfile
+ return '+ '.fnameescape(cfile)
else
- return a:edit.' '.fnameescape(found)
+ return cfile
endif
endfunction
diff --git a/runtime/ftplugin/rust.vim b/runtime/ftplugin/rust.vim
new file mode 100644
index 0000000000..7efca5985b
--- /dev/null
+++ b/runtime/ftplugin/rust.vim
@@ -0,0 +1,197 @@
+" Language: Rust
+" Description: Vim ftplugin for Rust
+" Maintainer: Chris Morgan <me@chrismorgan.info>
+" Maintainer: Kevin Ballard <kevin@sb.org>
+" Last Change: June 08, 2016
+" For bugs, patches and license go to https://github.com/rust-lang/rust.vim
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+augroup rust.vim
+autocmd!
+
+" Variables {{{1
+
+" The rust source code at present seems to typically omit a leader on /*!
+" comments, so we'll use that as our default, but make it easy to switch.
+" This does not affect indentation at all (I tested it with and without
+" leader), merely whether a leader is inserted by default or not.
+if exists("g:rust_bang_comment_leader") && g:rust_bang_comment_leader != 0
+ " Why is the `,s0:/*,mb:\ ,ex:*/` there, you ask? I don't understand why,
+ " but without it, */ gets indented one space even if there were no
+ " leaders. I'm fairly sure that's a Vim bug.
+ setlocal comments=s1:/*,mb:*,ex:*/,s0:/*,mb:\ ,ex:*/,:///,://!,://
+else
+ setlocal comments=s0:/*!,m:\ ,ex:*/,s1:/*,mb:*,ex:*/,:///,://!,://
+endif
+setlocal commentstring=//%s
+setlocal formatoptions-=t formatoptions+=croqnl
+" j was only added in 7.3.541, so stop complaints about its nonexistence
+silent! setlocal formatoptions+=j
+
+" smartindent will be overridden by indentexpr if filetype indent is on, but
+" otherwise it's better than nothing.
+setlocal smartindent nocindent
+
+if !exists("g:rust_recommended_style") || g:rust_recommended_style != 0
+ setlocal tabstop=4 shiftwidth=4 softtabstop=4 expandtab
+ setlocal textwidth=99
+endif
+
+" This includeexpr isn't perfect, but it's a good start
+setlocal includeexpr=substitute(v:fname,'::','/','g')
+
+setlocal suffixesadd=.rs
+
+if exists("g:ftplugin_rust_source_path")
+ let &l:path=g:ftplugin_rust_source_path . ',' . &l:path
+endif
+
+if exists("g:loaded_delimitMate")
+ if exists("b:delimitMate_excluded_regions")
+ let b:rust_original_delimitMate_excluded_regions = b:delimitMate_excluded_regions
+ endif
+
+ let s:delimitMate_extra_excluded_regions = ',rustLifetimeCandidate,rustGenericLifetimeCandidate'
+
+ " For this buffer, when delimitMate issues the `User delimitMate_map`
+ " event in the autocommand system, add the above-defined extra excluded
+ " regions to delimitMate's state, if they have not already been added.
+ autocmd User <buffer>
+ \ if expand('<afile>') ==# 'delimitMate_map' && match(
+ \ delimitMate#Get("excluded_regions"),
+ \ s:delimitMate_extra_excluded_regions) == -1
+ \| let b:delimitMate_excluded_regions =
+ \ delimitMate#Get("excluded_regions")
+ \ . s:delimitMate_extra_excluded_regions
+ \|endif
+
+ " For this buffer, when delimitMate issues the `User delimitMate_unmap`
+ " event in the autocommand system, delete the above-defined extra excluded
+ " regions from delimitMate's state (the deletion being idempotent and
+ " having no effect if the extra excluded regions are not present in the
+ " targeted part of delimitMate's state).
+ autocmd User <buffer>
+ \ if expand('<afile>') ==# 'delimitMate_unmap'
+ \| let b:delimitMate_excluded_regions = substitute(
+ \ delimitMate#Get("excluded_regions"),
+ \ '\C\V' . s:delimitMate_extra_excluded_regions,
+ \ '', 'g')
+ \|endif
+endif
+
+if has("folding") && exists('g:rust_fold') && g:rust_fold != 0
+ let b:rust_set_foldmethod=1
+ setlocal foldmethod=syntax
+ if g:rust_fold == 2
+ setlocal foldlevel<
+ else
+ setlocal foldlevel=99
+ endif
+endif
+
+if has('conceal') && exists('g:rust_conceal') && g:rust_conceal != 0
+ let b:rust_set_conceallevel=1
+ setlocal conceallevel=2
+endif
+
+" Motion Commands {{{1
+
+" Bind motion commands to support hanging indents
+nnoremap <silent> <buffer> [[ :call rust#Jump('n', 'Back')<CR>
+nnoremap <silent> <buffer> ]] :call rust#Jump('n', 'Forward')<CR>
+xnoremap <silent> <buffer> [[ :call rust#Jump('v', 'Back')<CR>
+xnoremap <silent> <buffer> ]] :call rust#Jump('v', 'Forward')<CR>
+onoremap <silent> <buffer> [[ :call rust#Jump('o', 'Back')<CR>
+onoremap <silent> <buffer> ]] :call rust#Jump('o', 'Forward')<CR>
+
+" Commands {{{1
+
+" See |:RustRun| for docs
+command! -nargs=* -complete=file -bang -buffer RustRun call rust#Run(<bang>0, <q-args>)
+
+" See |:RustExpand| for docs
+command! -nargs=* -complete=customlist,rust#CompleteExpand -bang -buffer RustExpand call rust#Expand(<bang>0, <q-args>)
+
+" See |:RustEmitIr| for docs
+command! -nargs=* -buffer RustEmitIr call rust#Emit("llvm-ir", <q-args>)
+
+" See |:RustEmitAsm| for docs
+command! -nargs=* -buffer RustEmitAsm call rust#Emit("asm", <q-args>)
+
+" See |:RustPlay| for docs
+command! -range=% RustPlay :call rust#Play(<count>, <line1>, <line2>, <f-args>)
+
+" See |:RustFmt| for docs
+command! -buffer RustFmt call rustfmt#Format()
+
+" See |:RustFmtRange| for docs
+command! -range -buffer RustFmtRange call rustfmt#FormatRange(<line1>, <line2>)
+
+" Mappings {{{1
+
+" Bind โŒ˜R in MacVim to :RustRun
+nnoremap <silent> <buffer> <D-r> :RustRun<CR>
+" Bind โŒ˜โ‡งR in MacVim to :RustRun! pre-filled with the last args
+nnoremap <buffer> <D-R> :RustRun! <C-r>=join(b:rust_last_rustc_args)<CR><C-\>erust#AppendCmdLine(' -- ' . join(b:rust_last_args))<CR>
+
+if !exists("b:rust_last_rustc_args") || !exists("b:rust_last_args")
+ let b:rust_last_rustc_args = []
+ let b:rust_last_args = []
+endif
+
+" Cleanup {{{1
+
+let b:undo_ftplugin = "
+ \ setlocal formatoptions< comments< commentstring< includeexpr< suffixesadd<
+ \|setlocal tabstop< shiftwidth< softtabstop< expandtab< textwidth<
+ \|if exists('b:rust_original_delimitMate_excluded_regions')
+ \|let b:delimitMate_excluded_regions = b:rust_original_delimitMate_excluded_regions
+ \|unlet b:rust_original_delimitMate_excluded_regions
+ \|else
+ \|unlet! b:delimitMate_excluded_regions
+ \|endif
+ \|if exists('b:rust_set_foldmethod')
+ \|setlocal foldmethod< foldlevel<
+ \|unlet b:rust_set_foldmethod
+ \|endif
+ \|if exists('b:rust_set_conceallevel')
+ \|setlocal conceallevel<
+ \|unlet b:rust_set_conceallevel
+ \|endif
+ \|unlet! b:rust_last_rustc_args b:rust_last_args
+ \|delcommand RustRun
+ \|delcommand RustExpand
+ \|delcommand RustEmitIr
+ \|delcommand RustEmitAsm
+ \|delcommand RustPlay
+ \|nunmap <buffer> <D-r>
+ \|nunmap <buffer> <D-R>
+ \|nunmap <buffer> [[
+ \|nunmap <buffer> ]]
+ \|xunmap <buffer> [[
+ \|xunmap <buffer> ]]
+ \|ounmap <buffer> [[
+ \|ounmap <buffer> ]]
+ \|set matchpairs-=<:>
+ \"
+
+" }}}1
+
+" Code formatting on save
+if get(g:, "rustfmt_autosave", 0)
+ autocmd BufWritePre *.rs silent! call rustfmt#Format()
+endif
+
+augroup END
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim: set noet sw=8 ts=8:
diff --git a/runtime/ftplugin/sass.vim b/runtime/ftplugin/sass.vim
index 64232a0894..d6909e7ad5 100644
--- a/runtime/ftplugin/sass.vim
+++ b/runtime/ftplugin/sass.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin
" Language: Sass
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
-" Last Change: 2010 Jul 26
+" Last Change: 2016 Aug 29
" Only do this when not done yet for this buffer
if exists("b:did_ftplugin")
@@ -9,8 +9,9 @@ if exists("b:did_ftplugin")
endif
let b:did_ftplugin = 1
-let b:undo_ftplugin = "setl cms< def< inc< inex< ofu< sua<"
+let b:undo_ftplugin = "setl com< cms< def< inc< inex< ofu< sua<"
+setlocal comments=://
setlocal commentstring=//\ %s
setlocal define=^\\s*\\%(@mixin\\\|=\\)
setlocal includeexpr=substitute(v:fname,'\\%(.*/\\\|^\\)\\zs','_','')
diff --git a/runtime/ftplugin/sbt.vim b/runtime/ftplugin/sbt.vim
new file mode 100644
index 0000000000..309d30e503
--- /dev/null
+++ b/runtime/ftplugin/sbt.vim
@@ -0,0 +1,15 @@
+" Vim filetype plugin file
+" Language: sbt
+" Maintainer: Steven Dobay <stevendobay at protonmail.com>
+" License: Same as Vim
+" Last Change: 2017.04.30
+" ----------------------------------------------------------------------------
+
+if exists('b:did_ftplugin') || &cp
+ finish
+endif
+
+let b:did_ftplugin = 1
+
+runtime! ftplugin/scala.vim
+
diff --git a/runtime/ftplugin/scala.vim b/runtime/ftplugin/scala.vim
new file mode 100644
index 0000000000..18e16f1d5b
--- /dev/null
+++ b/runtime/ftplugin/scala.vim
@@ -0,0 +1,35 @@
+" Vim filetype plugin file
+" Language: Scala
+" Maintainer: Derek Wyatt
+" URL: https://github.com/derekwyatt/vim-scala
+" License: Same as Vim
+" Last Change: 02 August 2016
+" ----------------------------------------------------------------------------
+
+if exists('b:did_ftplugin') || &cp
+ finish
+endif
+let b:did_ftplugin = 1
+
+" j is fairly new in Vim, so don't complain if it's not there
+setlocal formatoptions-=t formatoptions+=croqnl
+silent! setlocal formatoptions+=j
+
+" Just like c.vim, but additionally doesn't wrap text onto /** line when
+" formatting. Doesn't bungle bulleted lists when formatting.
+if get(g:, 'scala_scaladoc_indent', 0)
+ setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s2:/**,mb:*,ex:*/,s1:/*,mb:*,ex:*/,://
+else
+ setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/**,mb:*,ex:*/,s1:/*,mb:*,ex:*/,://
+endif
+setlocal commentstring=//\ %s
+
+setlocal shiftwidth=2 softtabstop=2 expandtab
+
+setlocal include='^\s*import'
+setlocal includeexpr='substitute(v:fname,"\\.","/","g")'
+
+setlocal path+=src/main/scala,src/test/scala
+setlocal suffixesadd=.scala
+
+" vim:set sw=2 sts=2 ts=8 et:
diff --git a/runtime/ftplugin/scheme.vim b/runtime/ftplugin/scheme.vim
index ab1543a5ee..62fd327e07 100644
--- a/runtime/ftplugin/scheme.vim
+++ b/runtime/ftplugin/scheme.vim
@@ -1,45 +1,57 @@
-" Vim filetype plugin
-" Language: Scheme
-" Maintainer: Sergey Khorev <sergey.khorev@gmail.com>
-" URL: http://sites.google.com/site/khorser/opensource/vim
-" Original author: Dorai Sitaram <ds26@gte.com>
-" Original URL: http://www.ccs.neu.edu/~dorai/vimplugins/vimplugins.html
-" Last Change: Oct 23, 2013
-
-" Only do this when not done yet for this buffer
-if exists("b:did_ftplugin")
+" Vim filetype plugin file
+" Language: Scheme (R7RS)
+" Last Change: 2018-03-05
+" Author: Evan Hanson <evhan@foldling.org>
+" Maintainer: Evan Hanson <evhan@foldling.org>
+" Previous Maintainer: Sergey Khorev <sergey.khorev@gmail.com>
+" URL: https://foldling.org/vim/ftplugin/scheme.vim
+
+if exists('b:did_ftplugin')
finish
endif
-" Don't load another plugin for this buffer
-let b:did_ftplugin = 1
+let s:cpo = &cpo
+set cpo&vim
-" Copy-paste from ftplugin/lisp.vim
-setl comments=:;
-setl define=^\\s*(def\\k*
-setl formatoptions-=t
-setl iskeyword+=+,-,*,/,%,<,=,>,:,$,?,!,@-@,94
setl lisp
+setl comments=:;;;;,:;;;,:;;,:;,sr:#\|,mb:\|,ex:\|#
setl commentstring=;%s
+setl define=^\\s*(def\\k*
+setl iskeyword=33,35-39,42-43,45-58,60-90,94,95,97-122,126
-setl comments^=:;;;,:;;,sr:#\|,mb:\|,ex:\|#
+let b:undo_ftplugin = 'setl lisp< comments< commentstring< define< iskeyword<'
-" Scheme-specific settings
-if exists("b:is_mzscheme") || exists("is_mzscheme")
- " improve indenting
- setl iskeyword+=#,%,^
- setl lispwords+=module,parameterize,let-values,let*-values,letrec-values
- setl lispwords+=define-values,opt-lambda,case-lambda,syntax-rules,with-syntax,syntax-case
- setl lispwords+=define-signature,unit,unit/sig,compund-unit/sig,define-values/invoke-unit/sig
-endif
+setl lispwords=case
+setl lispwords+=define
+setl lispwords+=define-record-type
+setl lispwords+=define-syntax
+setl lispwords+=define-values
+setl lispwords+=do
+setl lispwords+=guard
+setl lispwords+=lambda
+setl lispwords+=let
+setl lispwords+=let*
+setl lispwords+=let*-values
+setl lispwords+=let-syntax
+setl lispwords+=let-values
+setl lispwords+=letrec
+setl lispwords+=letrec*
+setl lispwords+=letrec-syntax
+setl lispwords+=parameterize
+setl lispwords+=set!
+setl lispwords+=syntax-rules
+setl lispwords+=unless
+setl lispwords+=when
+
+let b:undo_ftplugin = b:undo_ftplugin . ' lispwords<'
-if exists("b:is_chicken") || exists("is_chicken")
- " improve indenting
- setl iskeyword+=#,%,^
- setl lispwords+=let-optionals,let-optionals*,declare
- setl lispwords+=let-values,let*-values,letrec-values
- setl lispwords+=define-values,opt-lambda,case-lambda,syntax-rules,with-syntax,syntax-case
- setl lispwords+=cond-expand,and-let*,foreign-lambda,foreign-lambda*
+let b:did_scheme_ftplugin = 1
+
+if exists('b:is_chicken') || exists('g:is_chicken')
+ exe 'ru! ftplugin/chicken.vim'
endif
-let b:undo_ftplugin = "setlocal comments< define< formatoptions< iskeyword< lispwords< lisp< commentstring<"
+unlet b:did_scheme_ftplugin
+let b:did_ftplugin = 1
+let &cpo = s:cpo
+unlet s:cpo
diff --git a/runtime/ftplugin/screen.vim b/runtime/ftplugin/screen.vim
index 95c3849556..c22089be2c 100644
--- a/runtime/ftplugin/screen.vim
+++ b/runtime/ftplugin/screen.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: screen(1) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: screen(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/scss.vim b/runtime/ftplugin/scss.vim
index 981fb1b881..287d298f4a 100644
--- a/runtime/ftplugin/scss.vim
+++ b/runtime/ftplugin/scss.vim
@@ -1,12 +1,13 @@
" Vim filetype plugin
" Language: SCSS
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
-" Last Change: 2010 Jul 26
+" Last Change: 2016 Aug 29
if exists("b:did_ftplugin")
finish
endif
runtime! ftplugin/sass.vim
+setlocal comments=s1:/*,mb:*,ex:*/,://
" vim:set sw=2:
diff --git a/runtime/ftplugin/sensors.vim b/runtime/ftplugin/sensors.vim
index 813d14c0e1..c02a729405 100644
--- a/runtime/ftplugin/sensors.vim
+++ b/runtime/ftplugin/sensors.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: sensors.conf(5) - libsensors configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: sensors.conf(5) - libsensors configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/services.vim b/runtime/ftplugin/services.vim
index d34349ee28..dda08ac20a 100644
--- a/runtime/ftplugin/services.vim
+++ b/runtime/ftplugin/services.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: services(5) - Internet network services list
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: services(5) - Internet network services list
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/setserial.vim b/runtime/ftplugin/setserial.vim
index f9d5945787..e5823f4432 100644
--- a/runtime/ftplugin/setserial.vim
+++ b/runtime/ftplugin/setserial.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: setserial(8) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: setserial(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/sieve.vim b/runtime/ftplugin/sieve.vim
index 9a8759c024..3092b5d2d3 100644
--- a/runtime/ftplugin/sieve.vim
+++ b/runtime/ftplugin/sieve.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: Sieve filtering language input file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: Sieve filtering language input file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/slpconf.vim b/runtime/ftplugin/slpconf.vim
index 0c45689672..a975a499e5 100644
--- a/runtime/ftplugin/slpconf.vim
+++ b/runtime/ftplugin/slpconf.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: RFC 2614 - An API for Service Location configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: RFC 2614 - An API for Service Location configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/slpreg.vim b/runtime/ftplugin/slpreg.vim
index e9d533e2d4..74c7285b66 100644
--- a/runtime/ftplugin/slpreg.vim
+++ b/runtime/ftplugin/slpreg.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: RFC 2614 - An API for Service Location registration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: RFC 2614 - An API for Service Location registration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/slpspi.vim b/runtime/ftplugin/slpspi.vim
index 8d64d476f1..633555e493 100644
--- a/runtime/ftplugin/slpspi.vim
+++ b/runtime/ftplugin/slpspi.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: RFC 2614 - An API for Service Location SPI file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: RFC 2614 - An API for Service Location SPI file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/spec.vim b/runtime/ftplugin/spec.vim
index 6d5bf4b806..2a961f8244 100644
--- a/runtime/ftplugin/spec.vim
+++ b/runtime/ftplugin/spec.vim
@@ -36,10 +36,11 @@ except ImportError:
else:
specfile = vim.current.buffer.name
if specfile:
+ rpm.delMacro("dist")
spec = rpm.spec(specfile)
- headers = spec.packages[0].header
- version = headers['Version']
- release = ".".join(headers['Release'].split(".")[:-1])
+ headers = spec.sourceHeader
+ version = headers["Version"]
+ release = headers["Release"]
vim.command("let ver = " + version)
vim.command("let rel = " + release)
PYEND
@@ -113,7 +114,10 @@ if !exists("*s:SpecChangelog")
endif
endif
if (chgline != -1)
+ let tmptime = v:lc_time
+ language time C
let parsed_format = "* ".strftime(format)." - ".ver."-".rel
+ execute "language time" tmptime
let release_info = "+ ".name."-".ver."-".rel
let wrong_format = 0
let wrong_release = 0
@@ -179,12 +183,8 @@ if !exists("*s:ParseRpmVars")
endif
let varname = strpart(a:str, start+2, end-(start+2))
execute a:strline
- let definestr = "^[ \t]*%define[ \t]\\+" . varname . "[ \t]\\+\\(.*\\)$"
+ let definestr = "^[ \t]*%(?:global|define)[ \t]\\+" . varname . "[ \t]\\+\\(.*\\)$"
let linenum = search(definestr, "bW")
- if (linenum == 0)
- let definestr = substitute(definestr, "%define", "%global", "")
- let linenum = search(definestr, "bW")
- endif
if (linenum != -1)
let ret = ret . substitute(getline(linenum), definestr, "\\1", "")
else
@@ -201,7 +201,7 @@ endif
let b:match_ignorecase = 0
let b:match_words =
- \ '^Name:^%description:^%clean:^%setup:^%build:^%install:^%files:' .
+ \ '^Name:^%description:^%clean:^%(?:auto)?setup:^%build:^%install:^%files:' .
\ '^%package:^%preun:^%postun:^%changelog'
let &cpo = s:cpo_save
diff --git a/runtime/ftplugin/sql.vim b/runtime/ftplugin/sql.vim
index c2bc857947..4d6fcd9564 100644
--- a/runtime/ftplugin/sql.vim
+++ b/runtime/ftplugin/sql.vim
@@ -1,8 +1,8 @@
" SQL filetype plugin file
" Language: SQL (Common for Oracle, Microsoft SQL Server, Sybase)
-" Version: 11.0
+" Version: 12.0
" Maintainer: David Fishburn <dfishburn dot vim at gmail dot com>
-" Last Change: 2013 May 13
+" Last Change: 2017 Mar 07
" Download: http://vim.sourceforge.net/script.php?script_id=454
" For more details please use:
@@ -36,6 +36,14 @@
"
" History
"
+" Version 12.0 (April 2013)
+"
+" NF: Added support for "BEGIN TRY ... END TRY ... BEGIN CATCH ... END CATCH
+" BF: This plugin is designed to be used with other plugins to enable the
+" SQL completion with Perl, Python, Java, ... The loading mechanism
+" was not checking if the SQL objects were created, which can lead to
+" the plugin not loading the SQL support.
+"
" Version 11.0 (May 2013)
"
" NF: Updated to use SyntaxComplete's new regex support for syntax groups.
@@ -80,15 +88,17 @@
" Only do this when not done yet for this buffer
-if exists("b:did_ftplugin")
- finish
+" This ftplugin can be used with other ftplugins. So ensure loading
+" happens if all elements of this plugin have not yet loaded.
+if exists("b:did_ftplugin") && exists("b:current_ftplugin") && b:current_ftplugin == 'sql'
+ finish
endif
let s:save_cpo = &cpo
set cpo&vim
" Disable autowrapping for code, but enable for comments
-" t Auto-wrap text using textwidth
+" t Auto-wrap text using textwidth
" c Auto-wrap comments using textwidth, inserting the current comment
" leader automatically.
setlocal formatoptions-=t
@@ -171,6 +181,9 @@ if !exists("*SQL_SetType")
if exists("b:current_syntax")
" echomsg 'SQLSetType - clearing syntax'
syntax clear
+ if exists("b:current_syntax")
+ unlet b:current_syntax
+ endif
endif
if exists("b:did_indent")
" echomsg 'SQLSetType - clearing indent'
@@ -187,7 +200,7 @@ if !exists("*SQL_SetType")
" Do not specify a buffer local variable if it is
" the default value
if new_sql_type == 'sql'
- let new_sql_type = 'sqloracle'
+ let new_sql_type = 'sqloracle'
endif
let b:sql_type_override = new_sql_type
@@ -234,25 +247,26 @@ if exists("b:sql_type_override")
" echo 'sourcing buffer ftplugin/'.b:sql_type_override.'.vim'
if globpath(&runtimepath, 'ftplugin/'.b:sql_type_override.'.vim') != ''
exec 'runtime ftplugin/'.b:sql_type_override.'.vim'
- " else
- " echomsg 'ftplugin/'.b:sql_type_override.' not exist, using default'
+ " else
+ " echomsg 'ftplugin/'.b:sql_type_override.' not exist, using default'
endif
elseif exists("g:sql_type_default")
" echo 'sourcing global ftplugin/'.g:sql_type_default.'.vim'
if globpath(&runtimepath, 'ftplugin/'.g:sql_type_default.'.vim') != ''
exec 'runtime ftplugin/'.g:sql_type_default.'.vim'
- " else
- " echomsg 'ftplugin/'.g:sql_type_default.'.vim not exist, using default'
+ " else
+ " echomsg 'ftplugin/'.g:sql_type_default.'.vim not exist, using default'
endif
endif
" If the above runtime command succeeded, do not load the default settings
-if exists("b:did_ftplugin")
- finish
+" as they should have already been loaded from a previous run.
+if exists("b:did_ftplugin") && exists("b:current_ftplugin") && b:current_ftplugin == 'sql'
+ finish
endif
let b:undo_ftplugin = "setl comments< formatoptions< define< omnifunc<" .
- \ " | unlet! b:browsefilter b:match_words"
+ \ " | unlet! b:browsefilter b:match_words"
" Don't load another plugin for this buffer
let b:did_ftplugin = 1
@@ -261,7 +275,7 @@ let b:current_ftplugin = 'sql'
" Win32 can filter files in the browse dialog
if has("gui_win32") && !exists("b:browsefilter")
let b:browsefilter = "SQL Files (*.sql)\t*.sql\n" .
- \ "All Files (*.*)\t*.*\n"
+ \ "All Files (*.*)\t*.*\n"
endif
" Some standard expressions for use with the matchit strings
@@ -312,14 +326,24 @@ if !exists("b:match_words")
" WHEN column_not_found THEN
" WHEN OTHERS THEN
"
+ " begin try
+ " end try
+ " begin catch
+ " end catch
+ "
" create[ or replace] procedure|function|event
- " \ '^\s*\<\%(do\|for\|while\|loop\)\>.*:'.
+ " \ '^\s*\<\%(do\|for\|while\|loop\)\>.*:'.
" For ColdFusion support
setlocal matchpairs+=<:>
let b:match_words = &matchpairs .
- \ ',\<begin\>:\<end\>\W*$,'.
- \
+ \ ',\%(\<begin\)\%(\s\+\%(try\|catch\)\>\)\@!:\<end\>\W*$,'.
+ \
+ \ '\<begin\s\+try\>:'.
+ \ '\<end\s\+try\>:'.
+ \ '\<begin\s\+catch\>:'.
+ \ '\<end\s\+catch\>,'.
+ \
\ s:notend . '\<if\>:'.
\ '\<elsif\>\|\<elseif\>\|\<else\>:'.
\ '\<end\s\+if\>,'.
@@ -339,14 +363,14 @@ if !exists("b:match_words")
\ '\%(\<create\s\+' . s:or_replace . '\)\?'.
\ '\%(function\|procedure\|event\):'.
\ '\<returns\?\>'
- " \ '\<begin\>\|\<returns\?\>:'.
- " \ '\<end\>\(;\)\?\s*$'
- " \ '\<exception\>:'.s:when_no_matched_or_others.
- " \ ':\<when\s\+others\>,'.
- "
- " \ '\%(\<exception\>\|\%('. s:notend . '\<case\>\)\):'.
- " \ '\%(\<default\>\|'.s:when_no_matched_or_others.'\):'.
- " \ '\%(\%(\<when\s\+others\>\)\|\<end\s\+case\>\),' .
+ " \ '\<begin\>\|\<returns\?\>:'.
+ " \ '\<end\>\(;\)\?\s*$'
+ " \ '\<exception\>:'.s:when_no_matched_or_others.
+ " \ ':\<when\s\+others\>,'.
+ "
+ " \ '\%(\<exception\>\|\%('. s:notend . '\<case\>\)\):'.
+ " \ '\%(\<default\>\|'.s:when_no_matched_or_others.'\):'.
+ " \ '\%(\%(\<when\s\+others\>\)\|\<end\s\+case\>\),' .
endif
" Define how to find the macro definition of a variable using the various
diff --git a/runtime/ftplugin/sshconfig.vim b/runtime/ftplugin/sshconfig.vim
index f940af972e..d933ce0527 100644
--- a/runtime/ftplugin/sshconfig.vim
+++ b/runtime/ftplugin/sshconfig.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: OpenSSH client configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: OpenSSH client configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/sudoers.vim b/runtime/ftplugin/sudoers.vim
index 5756302178..38dbf559ee 100644
--- a/runtime/ftplugin/sudoers.vim
+++ b/runtime/ftplugin/sudoers.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: sudoers(5) configuration files
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: sudoers(5) configuration files
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/sysctl.vim b/runtime/ftplugin/sysctl.vim
index fb1098dd3b..8d331cea38 100644
--- a/runtime/ftplugin/sysctl.vim
+++ b/runtime/ftplugin/sysctl.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: sysctl.conf(5) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: sysctl.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/terminfo.vim b/runtime/ftplugin/terminfo.vim
index 7ce31d1ca1..0ffcc58f58 100644
--- a/runtime/ftplugin/terminfo.vim
+++ b/runtime/ftplugin/terminfo.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: terminfo(5) definition
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: terminfo(5) definition
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/tmux.vim b/runtime/ftplugin/tmux.vim
new file mode 100644
index 0000000000..ed9154924b
--- /dev/null
+++ b/runtime/ftplugin/tmux.vim
@@ -0,0 +1,12 @@
+" Vim filetype plugin file
+" Language: tmux(1) configuration file
+" URL: https://github.com/ericpruitt/tmux.vim/
+" Maintainer: Eric Pruitt <eric.pruitt@gmail.com>
+" Last Changed: 2017 Mar 10
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal commentstring=#\ %s
diff --git a/runtime/ftplugin/treetop.vim b/runtime/ftplugin/treetop.vim
index 2da3c405f5..f978d15303 100644
--- a/runtime/ftplugin/treetop.vim
+++ b/runtime/ftplugin/treetop.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: Treetop
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2011-03-14
+" Language: Treetop
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2011-03-14
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/tutor.vim b/runtime/ftplugin/tutor.vim
index 1579753170..30783d9799 100644
--- a/runtime/ftplugin/tutor.vim
+++ b/runtime/ftplugin/tutor.vim
@@ -19,27 +19,27 @@ setlocal noundofile
setlocal keywordprg=:help
setlocal iskeyword=@,-,_
-setlocal foldmethod=expr
+" The user will have to enable the folds himself, but we provide the foldexpr
+" function.
+setlocal foldmethod=manual
setlocal foldexpr=tutor#TutorFolds()
-setlocal foldcolumn=1
setlocal foldlevel=4
-setlocal nowrap
-setlocal statusline=%{toupper(expand('%:t:r'))}\ tutorial%=
-setlocal statusline+=%{tutor#InfoText()}
+" Load metadata if it exists: {{{1
+if filereadable(expand('%').'.json')
+ call tutor#LoadMetadata()
+endif
" Mappings: {{{1
call tutor#SetNormalMappings()
-call tutor#SetSampleTextMappings()
" Checks: {{{1
sign define tutorok text=โœ“ texthl=tutorOK
sign define tutorbad text=โœ— texthl=tutorX
-if !exists('g:tutor_debug') || g:tutor_debug == 0
- call tutor#PlaceXMarks()
- autocmd! TextChanged <buffer> call tutor#OnTextChanged()
- autocmd! TextChangedI <buffer> call tutor#OnTextChanged()
+if !exists('g:tutor_debug') || g:tutor_debug == 0
+ call tutor#ApplyMarks()
+ autocmd! TextChanged,TextChangedI <buffer> call tutor#ApplyMarksOnChanged()
endif
diff --git a/runtime/ftplugin/udevconf.vim b/runtime/ftplugin/udevconf.vim
index 6042e14413..0bbd86a0a4 100644
--- a/runtime/ftplugin/udevconf.vim
+++ b/runtime/ftplugin/udevconf.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: udev(8) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: udev(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/udevperm.vim b/runtime/ftplugin/udevperm.vim
index e7ad31d071..f8fb4d4d99 100644
--- a/runtime/ftplugin/udevperm.vim
+++ b/runtime/ftplugin/udevperm.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: udev(8) permissions file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: udev(8) permissions file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/udevrules.vim b/runtime/ftplugin/udevrules.vim
index be8d646968..6404f6c85e 100644
--- a/runtime/ftplugin/udevrules.vim
+++ b/runtime/ftplugin/udevrules.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: udev(8) rules file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: udev(8) rules file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/updatedb.vim b/runtime/ftplugin/updatedb.vim
index f4e7bcebd5..3015918d70 100644
--- a/runtime/ftplugin/updatedb.vim
+++ b/runtime/ftplugin/updatedb.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: updatedb.conf(5) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: updatedb.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/verilog.vim b/runtime/ftplugin/verilog.vim
index 6594f2ea90..cbf30a3185 100644
--- a/runtime/ftplugin/verilog.vim
+++ b/runtime/ftplugin/verilog.vim
@@ -1,8 +1,12 @@
" Vim filetype plugin file
" Language: Verilog HDL
-" Maintainer: Chih-Tsun Huang <cthuang@larc.ee.nthu.edu.tw>
-" Last Change: Wed Sep 3 15:24:49 CST 2008
-" URL: http://larc.ee.nthu.edu.tw/~cthuang/vim/ftplugin/verilog.vim
+" Maintainer: Chih-Tsun Huang <cthuang@cs.nthu.edu.tw>
+" Last Change: 2017 Aug 25 by Chih-Tsun Huang
+" URL: http://www.cs.nthu.edu.tw/~cthuang/vim/ftplugin/verilog.vim
+"
+" Credits:
+" Suggestions for improvement, bug reports by
+" Shao <shaominghai2005@163.com>
" Only do this when not done yet for this buffer
if exists("b:did_ftplugin")
@@ -45,11 +49,16 @@ if exists("loaded_matchit")
\ '\<begin\>:\<end\>,' .
\ '\<case\>\|\<casex\>\|\<casez\>:\<endcase\>,' .
\ '\<module\>:\<endmodule\>,' .
- \ '\<if\>:\<else\>,' .
+ \ '\<if\>:`\@<!\<else\>,' .
\ '\<function\>:\<endfunction\>,' .
- \ '`ifdef\>:`else\>:`endif\>,' .
+ \ '`ifn\?def\>:`elsif\>:`else\>:`endif\>,' .
\ '\<task\>:\<endtask\>,' .
- \ '\<specify\>:\<endspecify\>'
+ \ '\<specify\>:\<endspecify\>,' .
+ \ '\<config\>:\<endconfig\>,' .
+ \ '\<generate\>:\<endgenerate\>,' .
+ \ '\<fork\>:\<join\>,' .
+ \ '\<primitive\>:\<endprimitive\>,' .
+ \ '\<table\>:\<endtable\>'
endif
" Reset 'cpoptions' back to the user's setting
diff --git a/runtime/ftplugin/vim.vim b/runtime/ftplugin/vim.vim
index f355d2837d..34f5eb6db1 100644
--- a/runtime/ftplugin/vim.vim
+++ b/runtime/ftplugin/vim.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin
" Language: Vim
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2014 Sep 07
+" Last Change: 2018 Aug 07
" Only do this when not done yet for this buffer
if exists("b:did_ftplugin")
@@ -14,8 +14,28 @@ let b:did_ftplugin = 1
let s:cpo_save = &cpo
set cpo-=C
-let b:undo_ftplugin = "setl fo< isk< com< tw< commentstring<"
- \ . "| unlet! b:match_ignorecase b:match_words b:match_skip"
+if !exists('*VimFtpluginUndo')
+ func VimFtpluginUndo()
+ setl fo< isk< com< tw< commentstring< keywordprg<
+ if exists('b:did_add_maps')
+ silent! nunmap <buffer> [[
+ silent! vunmap <buffer> [[
+ silent! nunmap <buffer> ]]
+ silent! vunmap <buffer> ]]
+ silent! nunmap <buffer> []
+ silent! vunmap <buffer> []
+ silent! nunmap <buffer> ][
+ silent! vunmap <buffer> ][
+ silent! nunmap <buffer> ]"
+ silent! vunmap <buffer> ]"
+ silent! nunmap <buffer> ["
+ silent! vunmap <buffer> ["
+ endif
+ unlet! b:match_ignorecase b:match_words b:match_skip b:did_add_maps
+ endfunc
+endif
+
+let b:undo_ftplugin = "call VimFtpluginUndo()"
" Set 'formatoptions' to break comment lines but not other lines,
" and insert the comment leader when hitting <CR> or using "o".
@@ -25,6 +45,9 @@ setlocal fo-=t fo+=croql
" keyword character. E.g., for netrw#Nread().
setlocal isk+=#
+" Use :help to lookup the keyword under the cursor with K.
+setlocal keywordprg=:help
+
" Set 'comments' to format dashed lists in comments
setlocal com=sO:\"\ -,mO:\"\ \ ,eO:\"\",:\"
@@ -36,21 +59,28 @@ endif
" Comments start with a double quote
setlocal commentstring=\"%s
-" Move around functions.
-nnoremap <silent><buffer> [[ m':call search('^\s*fu\%[nction]\>', "bW")<CR>
-vnoremap <silent><buffer> [[ m':<C-U>exe "normal! gv"<Bar>call search('^\s*fu\%[nction]\>', "bW")<CR>
-nnoremap <silent><buffer> ]] m':call search('^\s*fu\%[nction]\>', "W")<CR>
-vnoremap <silent><buffer> ]] m':<C-U>exe "normal! gv"<Bar>call search('^\s*fu\%[nction]\>', "W")<CR>
-nnoremap <silent><buffer> [] m':call search('^\s*endf*\%[unction]\>', "bW")<CR>
-vnoremap <silent><buffer> [] m':<C-U>exe "normal! gv"<Bar>call search('^\s*endf*\%[unction]\>', "bW")<CR>
-nnoremap <silent><buffer> ][ m':call search('^\s*endf*\%[unction]\>', "W")<CR>
-vnoremap <silent><buffer> ][ m':<C-U>exe "normal! gv"<Bar>call search('^\s*endf*\%[unction]\>', "W")<CR>
-
-" Move around comments
-nnoremap <silent><buffer> ]" :call search('^\(\s*".*\n\)\@<!\(\s*"\)', "W")<CR>
-vnoremap <silent><buffer> ]" :<C-U>exe "normal! gv"<Bar>call search('^\(\s*".*\n\)\@<!\(\s*"\)', "W")<CR>
-nnoremap <silent><buffer> [" :call search('\%(^\s*".*\n\)\%(^\s*"\)\@!', "bW")<CR>
-vnoremap <silent><buffer> [" :<C-U>exe "normal! gv"<Bar>call search('\%(^\s*".*\n\)\%(^\s*"\)\@!', "bW")<CR>
+" Prefer Vim help instead of manpages.
+setlocal keywordprg=:help
+
+if !exists("no_plugin_maps") && !exists("no_vim_maps")
+ let b:did_add_maps = 1
+
+ " Move around functions.
+ nnoremap <silent><buffer> [[ m':call search('^\s*fu\%[nction]\>', "bW")<CR>
+ vnoremap <silent><buffer> [[ m':<C-U>exe "normal! gv"<Bar>call search('^\s*fu\%[nction]\>', "bW")<CR>
+ nnoremap <silent><buffer> ]] m':call search('^\s*fu\%[nction]\>', "W")<CR>
+ vnoremap <silent><buffer> ]] m':<C-U>exe "normal! gv"<Bar>call search('^\s*fu\%[nction]\>', "W")<CR>
+ nnoremap <silent><buffer> [] m':call search('^\s*endf\%[unction]\>', "bW")<CR>
+ vnoremap <silent><buffer> [] m':<C-U>exe "normal! gv"<Bar>call search('^\s*endf\%[unction]\>', "bW")<CR>
+ nnoremap <silent><buffer> ][ m':call search('^\s*endf\%[unction]\>', "W")<CR>
+ vnoremap <silent><buffer> ][ m':<C-U>exe "normal! gv"<Bar>call search('^\s*endf\%[unction]\>', "W")<CR>
+
+ " Move around comments
+ nnoremap <silent><buffer> ]" :call search('^\(\s*".*\n\)\@<!\(\s*"\)', "W")<CR>
+ vnoremap <silent><buffer> ]" :<C-U>exe "normal! gv"<Bar>call search('^\(\s*".*\n\)\@<!\(\s*"\)', "W")<CR>
+ nnoremap <silent><buffer> [" :call search('\%(^\s*".*\n\)\%(^\s*"\)\@!', "bW")<CR>
+ vnoremap <silent><buffer> [" :<C-U>exe "normal! gv"<Bar>call search('\%(^\s*".*\n\)\%(^\s*"\)\@!', "bW")<CR>
+endif
" Let the matchit plugin know what items can be matched.
if exists("loaded_matchit")
@@ -60,8 +90,7 @@ if exists("loaded_matchit")
\ '\<\(wh\%[ile]\|for\)\>:\<brea\%[k]\>:\<con\%[tinue]\>:\<end\(w\%[hile]\|fo\%[r]\)\>,' .
\ '\<if\>:\<el\%[seif]\>:\<en\%[dif]\>,' .
\ '\<try\>:\<cat\%[ch]\>:\<fina\%[lly]\>:\<endt\%[ry]\>,' .
- \ '\<aug\%[roup]\s\+\%(END\>\)\@!\S:\<aug\%[roup]\s\+END\>,' .
- \ '(:)'
+ \ '\<aug\%[roup]\s\+\%(END\>\)\@!\S:\<aug\%[roup]\s\+END\>,'
" Ignore syntax region commands and settings, any 'en*' would clobber
" if-endif.
" - set spl=de,en
diff --git a/runtime/ftplugin/wast.vim b/runtime/ftplugin/wast.vim
new file mode 100644
index 0000000000..0d9e98d37a
--- /dev/null
+++ b/runtime/ftplugin/wast.vim
@@ -0,0 +1,17 @@
+" Vim filetype plugin file
+" Language: WebAssembly
+" Maintainer: rhysd <lin90162@yahoo.co.jp>
+" Last Change: Jul 29, 2018
+" For bugs, patches and license go to https://github.com/rhysd/vim-wasm
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=s:(;,e:;),:;;
+setlocal commentstring=(;%s;)
+setlocal formatoptions-=t
+setlocal iskeyword+=$,.,/
+
+let b:undo_ftplugin = "setlocal comments< commentstring< formatoptions< iskeyword<"
diff --git a/runtime/ftplugin/xdefaults.vim b/runtime/ftplugin/xdefaults.vim
index cd851829ca..c1aff70176 100644
--- a/runtime/ftplugin/xdefaults.vim
+++ b/runtime/ftplugin/xdefaults.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: X resources files like ~/.Xdefaults (xrdb)
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: X resources files like ~/.Xdefaults (xrdb)
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/xf86conf.vim b/runtime/ftplugin/xf86conf.vim
index ab7569a100..5a21539dd5 100644
--- a/runtime/ftplugin/xf86conf.vim
+++ b/runtime/ftplugin/xf86conf.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: XFree86 Configuration File
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: XFree86 Configuration File
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/xinetd.vim b/runtime/ftplugin/xinetd.vim
index f209af18be..2b7b64e4fa 100644
--- a/runtime/ftplugin/xinetd.vim
+++ b/runtime/ftplugin/xinetd.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: xinetd.conf(5) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: xinetd.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/xml.vim b/runtime/ftplugin/xml.vim
index 236e870537..573a6ba441 100644
--- a/runtime/ftplugin/xml.vim
+++ b/runtime/ftplugin/xml.vim
@@ -1,8 +1,10 @@
" Vim filetype plugin file
" Language: xml
-" Maintainer: Dan Sharp <dwsharp at users dot sourceforge dot net>
-" Last Changed: 20 Jan 2009
-" URL: http://dwsharp.users.sourceforge.net/vim/ftplugin
+" Maintainer: Christian Brabandt <cb@256bit.org>
+" Last Changed: May 08th, 2018
+" Repository: https://github.com/chrisbra/vim-xml-ftplugin
+" Previous Maintainer: Dan Sharp <dwsharp at users dot sourceforge dot net>
+" URL: http://dwsharp.users.sourceforge.net/vim/ftplugin
if exists("b:did_ftplugin") | finish | endif
let b:did_ftplugin = 1
@@ -10,16 +12,16 @@ let b:did_ftplugin = 1
" Make sure the continuation lines below do not cause problems in
" compatibility mode.
let s:save_cpo = &cpo
-set cpo-=C
+set cpo&vim
setlocal commentstring=<!--%s-->
-setlocal comments=s:<!--,m:\ \ \ \ \ ,e:-->
+" Remove the middlepart from the comments section, as this causes problems:
+" https://groups.google.com/d/msg/vim_dev/x4GT-nqa0Kg/jvtRnEbtAnMJ
+setlocal comments=s:<!--,e:-->
setlocal formatoptions-=t
-if !exists("g:ft_xml_autocomment") || (g:ft_xml_autocomment == 1)
- setlocal formatoptions+=croql
-endif
-
+setlocal formatoptions+=croql
+setlocal formatexpr=xmlformat#Format()
" XML: thanks to Johannes Zellner and Akbar Ibrahim
" - case sensitive
@@ -39,7 +41,6 @@ if exists("loaded_matchit")
\ '<\@<=\%([^ \t>/]\+\)\%(\s\+[^/>]*\|$\):/>'
endif
-"
" For Omni completion, by Mikolaj Machowski.
if exists('&ofu')
setlocal ofu=xmlcomplete#CompleteTags
@@ -47,17 +48,17 @@ endif
command! -nargs=+ XMLns call xmlcomplete#CreateConnection(<f-args>)
command! -nargs=? XMLent call xmlcomplete#CreateEntConnection(<f-args>)
-
" Change the :browse e filter to primarily show xml-related files.
-if has("gui_win32")
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
let b:browsefilter="XML Files (*.xml)\t*.xml\n" .
- \ "DTD Files (*.dtd)\t*.dtd\n" .
- \ "All Files (*.*)\t*.*\n"
+ \ "DTD Files (*.dtd)\t*.dtd\n" .
+ \ "XSD Files (*.xsd)\t*.xsd\n" .
+ \ "All Files (*.*)\t*.*\n"
endif
" Undo the stuff we changed.
-let b:undo_ftplugin = "setlocal commentstring< comments< formatoptions<" .
- \ " | unlet! b:match_ignorecase b:match_words b:browsefilter"
+let b:undo_ftplugin = "setlocal commentstring< comments< formatoptions< formatexpr< " .
+ \ " | unlet! b:match_ignorecase b:match_words b:browsefilter"
" Restore the saved compatibility options.
let &cpo = s:save_cpo
diff --git a/runtime/ftplugin/xmodmap.vim b/runtime/ftplugin/xmodmap.vim
index 027ae09ff2..77fccd5b4d 100644
--- a/runtime/ftplugin/xmodmap.vim
+++ b/runtime/ftplugin/xmodmap.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: xmodmap(1) definition file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: xmodmap(1) definition file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/yaml.vim b/runtime/ftplugin/yaml.vim
index b88803ab3a..ceff36f7e4 100644
--- a/runtime/ftplugin/yaml.vim
+++ b/runtime/ftplugin/yaml.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
-" Language: YAML (YAML Ain't Markup Language)
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-09
+" Language: YAML (YAML Ain't Markup Language)
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
if exists("b:did_ftplugin")
finish
diff --git a/runtime/ftplugin/zimbu.vim b/runtime/ftplugin/zimbu.vim
index 558aea7df0..24674776cb 100644
--- a/runtime/ftplugin/zimbu.vim
+++ b/runtime/ftplugin/zimbu.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin file
" Language: Zimbu
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2012 Sep 08
+" Last Change: 2017 Dec 05
" Only do this when not done yet for this buffer
if exists("b:did_ftplugin")
@@ -135,8 +135,10 @@ iabbr <buffer> <expr> until GCUpperSpace("until")
iabbr <buffer> <expr> while GCUpperSpace("while")
iabbr <buffer> <expr> repeat GCUpper("repeat")
-nnoremap <silent> <buffer> [[ m`:call ZimbuGoStartBlock()<CR>
-nnoremap <silent> <buffer> ]] m`:call ZimbuGoEndBlock()<CR>
+if !exists("no_plugin_maps") && !exists("no_zimbu_maps")
+ nnoremap <silent> <buffer> [[ m`:call ZimbuGoStartBlock()<CR>
+ nnoremap <silent> <buffer> ]] m`:call ZimbuGoEndBlock()<CR>
+endif
" Using a function makes sure the search pattern is restored
func! ZimbuGoStartBlock()
diff --git a/runtime/ftplugin/zsh.vim b/runtime/ftplugin/zsh.vim
index 6cbc380dc3..fe8efc59ab 100644
--- a/runtime/ftplugin/zsh.vim
+++ b/runtime/ftplugin/zsh.vim
@@ -1,10 +1,10 @@
" Vim filetype plugin file
-" Language: Zsh shell script
-" Maintainer: Christian Brabandt <cb@256bit.org>
-" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2015-05-29
-" License: Vim (see :h license)
-" Repository: https://github.com/chrisbra/vim-zsh
+" Language: Zsh shell script
+" Maintainer: Christian Brabandt <cb@256bit.org>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2017-11-22
+" License: Vim (see :h license)
+" Repository: https://github.com/chrisbra/vim-zsh
if exists("b:did_ftplugin")
finish
@@ -18,9 +18,7 @@ let b:undo_ftplugin = "setl com< cms< fo<"
setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
-let b:match_words =
- \ &matchpairs
- \ . ',\<if\>:\<elif\>:\<else\>:\<fi\>'
+let b:match_words = ',\<if\>:\<elif\>:\<else\>:\<fi\>'
\ . ',\<case\>:^\s*([^)]*):\<esac\>'
\ . ',\<\%(select\|while\|until\|repeat\|for\%(each\)\=\)\>:\<done\>'
let b:match_skip = 's:comment\|string\|heredoc\|subst'
diff --git a/runtime/indent/ada.vim b/runtime/indent/ada.vim
index 575f326454..1ca7fbacbe 100644
--- a/runtime/indent/ada.vim
+++ b/runtime/indent/ada.vim
@@ -87,7 +87,7 @@ function s:MainBlockIndent (prev_indent, prev_lnum, blockstart, stop_at)
endwhile
endwhile
" Fallback - just move back one
- return a:prev_indent - &sw
+ return a:prev_indent - shiftwidth()
endfunction MainBlockIndent
" Section: s:EndBlockIndent {{{1
@@ -131,7 +131,7 @@ function s:EndBlockIndent( prev_indent, prev_lnum, blockstart, blockend )
endwhile
endwhile
" Fallback - just move back one
- return a:prev_indent - &sw
+ return a:prev_indent - shiftwidth()
endfunction EndBlockIndent
" Section: s:StatementIndent {{{1
@@ -213,15 +213,15 @@ function GetAdaIndent()
endif
" Move indent in
if ! false_match
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
elseif line =~ '^\s*\(case\|exception\)\>'
" Move indent in twice (next 'when' will move back)
- let ind = ind + 2 * &sw
+ let ind = ind + 2 * shiftwidth()
elseif line =~ '^\s*end\s*record\>'
- " Move indent back to tallying 'type' preceding the 'record'.
+ " Move indent back to tallying 'type' preceeding the 'record'.
" Allow indent to be equal to 'end record's.
- let ind = s:MainBlockIndent( ind+&sw, lnum, 'type\>', '' )
+ let ind = s:MainBlockIndent( ind+shiftwidth(), lnum, 'type\>', '' )
elseif line =~ '\(^\s*new\>.*\)\@<!)\s*[;,]\s*$'
" Revert to indent of line that started this parenthesis pair
exe lnum
@@ -235,10 +235,10 @@ function GetAdaIndent()
exe v:lnum
elseif line =~ '[.=(]\s*$'
" A statement continuation - move in one
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
elseif line =~ '^\s*new\>'
" Multiple line generic instantiation ('package blah is\nnew thingy')
- let ind = s:StatementIndent( ind - &sw, lnum )
+ let ind = s:StatementIndent( ind - shiftwidth(), lnum )
elseif line =~ ';\s*$'
" Statement end (but not 'end' ) - try to find current statement-start indent
let ind = s:StatementIndent( ind, lnum )
@@ -256,17 +256,17 @@ function GetAdaIndent()
elseif continuation && line =~ '^\s*('
" Don't do this if we've already indented due to the previous line
if ind == initind
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
elseif line =~ '^\s*\(begin\|is\)\>'
let ind = s:MainBlockIndent( ind, lnum, '\(procedure\|function\|declare\|package\|task\)\>', 'begin\>' )
elseif line =~ '^\s*record\>'
- let ind = s:MainBlockIndent( ind, lnum, 'type\>\|for\>.*\<use\>', '' ) + &sw
+ let ind = s:MainBlockIndent( ind, lnum, 'type\>\|for\>.*\<use\>', '' ) + shiftwidth()
elseif line =~ '^\s*\(else\|elsif\)\>'
let ind = s:MainBlockIndent( ind, lnum, 'if\>', '' )
elseif line =~ '^\s*when\>'
" Align 'when' one /in/ from matching block start
- let ind = s:MainBlockIndent( ind, lnum, '\(case\|exception\)\>', '' ) + &sw
+ let ind = s:MainBlockIndent( ind, lnum, '\(case\|exception\)\>', '' ) + shiftwidth()
elseif line =~ '^\s*end\>\s*\<if\>'
" End of if statements
let ind = s:EndBlockIndent( ind, lnum, 'if\>', 'end\>\s*\<if\>' )
diff --git a/runtime/indent/automake.vim b/runtime/indent/automake.vim
index 5fbc222bc7..7e38f92ebf 100644
--- a/runtime/indent/automake.vim
+++ b/runtime/indent/automake.vim
@@ -1,7 +1,7 @@
" Vim indent file
-" Language: automake
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: automake
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:did_indent")
finish
diff --git a/runtime/indent/awk.vim b/runtime/indent/awk.vim
index 6f6b70cc4e..aad73ee71f 100644
--- a/runtime/indent/awk.vim
+++ b/runtime/indent/awk.vim
@@ -60,7 +60,7 @@ function! GetAwkIndent()
" 'pattern { action }' (simple check match on /{/ increases the indent then)
if s:Get_brace_balance( prev_data, '{', '}' ) > 0
- return ind + &sw
+ return ind + shiftwidth()
endif
let brace_balance = s:Get_brace_balance( prev_data, '(', ')' )
@@ -99,7 +99,7 @@ function! GetAwkIndent()
return s:Safe_indent( ind, s:First_word_len(prev_data), getline(v:lnum))
else
" if/for/while without '{'
- return ind + &sw
+ return ind + shiftwidth()
endif
endif
endif
@@ -140,7 +140,7 @@ function! GetAwkIndent()
" Decrease indent if this line contains a '}'.
if getline(v:lnum) =~ '^\s*}'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
return ind
diff --git a/runtime/indent/bst.vim b/runtime/indent/bst.vim
index be1f63e8e9..47e3058810 100644
--- a/runtime/indent/bst.vim
+++ b/runtime/indent/bst.vim
@@ -69,7 +69,7 @@ function! GetBstIndent(lnum) abort
endif
let fakeline = substitute(line,'^}','','').matchstr(cline,'^}')
let ind = indent(lnum)
- let ind = ind + &sw * s:count(line,'{')
- let ind = ind - &sw * s:count(fakeline,'}')
+ let ind = ind + shiftwidth() * s:count(line,'{')
+ let ind = ind - shiftwidth() * s:count(fakeline,'}')
return ind
endfunction
diff --git a/runtime/indent/bzl.vim b/runtime/indent/bzl.vim
index 24e5b870cd..6904bfdedb 100644
--- a/runtime/indent/bzl.vim
+++ b/runtime/indent/bzl.vim
@@ -1,7 +1,7 @@
" Vim indent file
" Language: Bazel (http://bazel.io)
" Maintainer: David Barnett (https://github.com/google/vim-ft-bzl)
-" Last Change: 2015 Aug 11
+" Last Change: 2017 Jun 13
if exists('b:did_indent')
finish
@@ -41,11 +41,8 @@ function GetBzlIndent(lnum) abort
if exists('g:pyindent_open_paren')
let l:pyindent_open_paren = g:pyindent_open_paren
endif
- " Vim 7.3.693 and later defines a shiftwidth() function to get the effective
- " shiftwidth value. Fall back to &shiftwidth if the function doesn't exist.
- let l:sw_expr = exists('*shiftwidth') ? 'shiftwidth()' : '&shiftwidth'
- let g:pyindent_nested_paren = l:sw_expr . ' * 2'
- let g:pyindent_open_paren = l:sw_expr . ' * 2'
+ let g:pyindent_nested_paren = 'shiftwidth() * 2'
+ let g:pyindent_open_paren = 'shiftwidth() * 2'
endif
let l:indent = -1
diff --git a/runtime/indent/cdl.vim b/runtime/indent/cdl.vim
index db2b9052b2..5fae7b9046 100644
--- a/runtime/indent/cdl.vim
+++ b/runtime/indent/cdl.vim
@@ -16,7 +16,7 @@ if exists("*CdlGetIndent")
"finish
endif
-" find out if an "...=..." expresion its an asignment (or a conditional)
+" find out if an "...=..." expresion is an assignment (or a conditional)
" it scans 'line' first, and then the previos lines
fun! CdlAsignment(lnum, line)
let f = -1
@@ -47,7 +47,7 @@ fun! CdlGetIndent(lnum)
let thisline = getline(a:lnum)
if match(thisline, '^\s*\(\k\+\|\[[^]]*]\)\s*\(,\|;\s*$\)') >= 0
" it's an attributes line
- return &sw
+ return shiftwidth()
elseif match(thisline, '^\c\s*\([{}]\|\/[*/]\|dimension\|schedule\|group\|hierarchy\|class\)') >= 0
" it's a header or '{' or '}' or a comment
return 0
@@ -71,13 +71,13 @@ fun! CdlGetIndent(lnum)
let c = line[inicio-1]
" ')' and '=' don't change indent and are useless to set 'f'
if c == '{'
- return &sw
+ return shiftwidth()
elseif c != ')' && c != '='
let f = 1 " all but 'elseif' are followed by a formula
if c ==? 'n' || c ==? 'e' " 'then', 'else'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
elseif strpart(line, inicio-6, 6) ==? 'elseif' " elseif, set f to conditional
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
let f = 0
end
end
@@ -98,16 +98,16 @@ fun! CdlGetIndent(lnum)
let ind = 0
let f = 1
elseif c == ')' || c== ';' || strpart(line, inicio-5, 5) ==? 'endif'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
elseif c == '(' || c ==? 'f' " '(' or 'if'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
else " c == '='
" if it is an asignment increase indent
if f == -1 " we don't know yet, find out
let f = CdlAsignment(lnum, strpart(line, 0, inicio))
end
if f == 1 " formula increase it
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
end
end
endw
@@ -115,13 +115,13 @@ fun! CdlGetIndent(lnum)
" CURRENT LINE, if it starts with a closing element, decrease indent
" or if it starts with '=' (asignment), increase indent
if match(thisline, '^\c\s*\(else\|then\|endif\|[);]\)') >= 0
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
elseif match(thisline, '^\s*=') >= 0
if f == -1 " we don't know yet if is an asignment, find out
let f = CdlAsignment(lnum, "")
end
if f == 1 " formula increase it
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
end
end
diff --git a/runtime/indent/chaiscript.vim b/runtime/indent/chaiscript.vim
index 247e1a6e4c..445281cc46 100644
--- a/runtime/indent/chaiscript.vim
+++ b/runtime/indent/chaiscript.vim
@@ -31,19 +31,19 @@ function! GetChaiScriptIndent()
let flag = 0
let prevline = getline(lnum)
if prevline =~ '^.*{.*'
- let ind = ind + &shiftwidth
+ let ind = ind + shiftwidth()
let flag = 1
endif
" Subtract a 'shiftwidth' after lines containing a { followed by a }
" to keep it balanced
if flag == 1 && prevline =~ '.*{.*}.*'
- let ind = ind - &shiftwidth
+ let ind = ind - shiftwidth()
endif
" Subtract a 'shiftwidth' on lines ending with }
if getline(v:lnum) =~ '^\s*\%(}\)'
- let ind = ind - &shiftwidth
+ let ind = ind - shiftwidth()
endif
return ind
diff --git a/runtime/indent/clojure.vim b/runtime/indent/clojure.vim
index 476ac1de1c..7c4186e29b 100644
--- a/runtime/indent/clojure.vim
+++ b/runtime/indent/clojure.vim
@@ -1,17 +1,12 @@
" Vim indent file
-" Language: Clojure
-" Author: Meikel Brandmeyer <mb@kotka.de>
-" URL: http://kotka.de/projects/clojure/vimclojure.html
+" Language: Clojure
+" Author: Meikel Brandmeyer <mb@kotka.de>
+" URL: http://kotka.de/projects/clojure/vimclojure.html
"
-" Maintainer: Sung Pae <self@sungpae.com>
-" URL: https://github.com/guns/vim-clojure-static
-" License: Same as Vim
-" Last Change: 27 March 2014
-
-" TODO: Indenting after multibyte characters is broken:
-" (let [ฮ” (if foo
-" bar ; Indent error
-" baz)])
+" Maintainer: Sung Pae <self@sungpae.com>
+" URL: https://github.com/guns/vim-clojure-static
+" License: Same as Vim
+" Last Change: 18 July 2016
if exists("b:did_indent")
finish
@@ -57,36 +52,39 @@ if exists("*searchpairpos")
let g:clojure_align_subforms = 0
endif
- function! s:SynIdName()
+ function! s:syn_id_name()
return synIDattr(synID(line("."), col("."), 0), "name")
endfunction
- function! s:CurrentChar()
+ function! s:ignored_region()
+ return s:syn_id_name() =~? '\vstring|regex|comment|character'
+ endfunction
+
+ function! s:current_char()
return getline('.')[col('.')-1]
endfunction
- function! s:CurrentWord()
+ function! s:current_word()
return getline('.')[col('.')-1 : searchpos('\v>', 'n', line('.'))[1]-2]
endfunction
- function! s:IsParen()
- return s:CurrentChar() =~# '\v[\(\)\[\]\{\}]' &&
- \ s:SynIdName() !~? '\vstring|regex|comment|character'
+ function! s:is_paren()
+ return s:current_char() =~# '\v[\(\)\[\]\{\}]' && !s:ignored_region()
endfunction
" Returns 1 if string matches a pattern in 'patterns', which may be a
" list of patterns, or a comma-delimited string of implicitly anchored
" patterns.
- function! s:MatchesOne(patterns, string)
+ function! s:match_one(patterns, string)
let list = type(a:patterns) == type([])
- \ ? a:patterns
- \ : map(split(a:patterns, ','), '"^" . v:val . "$"')
+ \ ? a:patterns
+ \ : map(split(a:patterns, ','), '"^" . v:val . "$"')
for pat in list
if a:string =~# pat | return 1 | endif
endfor
endfunction
- function! s:MatchPairs(open, close, stopat)
+ function! s:match_pairs(open, close, stopat)
" Stop only on vector and map [ resp. {. Ignore the ones in strings and
" comments.
if a:stopat == 0
@@ -95,11 +93,11 @@ if exists("*searchpairpos")
let stopat = a:stopat
endif
- let pos = searchpairpos(a:open, '', a:close, 'bWn', "!s:IsParen()", stopat)
- return [pos[0], virtcol(pos)]
+ let pos = searchpairpos(a:open, '', a:close, 'bWn', "!s:is_paren()", stopat)
+ return [pos[0], col(pos)]
endfunction
- function! s:ClojureCheckForStringWorker()
+ function! s:clojure_check_for_string_worker()
" Check whether there is the last character of the previous line is
" highlighted as a string. If so, we check whether it's a ". In this
" case we have to check also the previous character. The " might be the
@@ -113,17 +111,17 @@ if exists("*searchpairpos")
call cursor(nb, 0)
call cursor(0, col("$") - 1)
- if s:SynIdName() !~? "string"
+ if s:syn_id_name() !~? "string"
return -1
endif
" This will not work for a " in the first column...
- if s:CurrentChar() == '"'
+ if s:current_char() == '"'
call cursor(0, col("$") - 2)
- if s:SynIdName() !~? "string"
+ if s:syn_id_name() !~? "string"
return -1
endif
- if s:CurrentChar() != '\\'
+ if s:current_char() != '\\'
return -1
endif
call cursor(0, col("$") - 1)
@@ -138,40 +136,40 @@ if exists("*searchpairpos")
return indent(".")
endfunction
- function! s:CheckForString()
+ function! s:check_for_string()
let pos = getpos('.')
try
- let val = s:ClojureCheckForStringWorker()
+ let val = s:clojure_check_for_string_worker()
finally
call setpos('.', pos)
endtry
return val
endfunction
- function! s:StripNamespaceAndMacroChars(word)
+ function! s:strip_namespace_and_macro_chars(word)
return substitute(a:word, "\\v%(.*/|[#'`~@^,]*)(.*)", '\1', '')
endfunction
- function! s:ClojureIsMethodSpecialCaseWorker(position)
+ function! s:clojure_is_method_special_case_worker(position)
" Find the next enclosing form.
call search('\S', 'Wb')
" Special case: we are at a '(('.
- if s:CurrentChar() == '('
+ if s:current_char() == '('
return 0
endif
call cursor(a:position)
- let nextParen = s:MatchPairs('(', ')', 0)
+ let next_paren = s:match_pairs('(', ')', 0)
" Special case: we are now at toplevel.
- if nextParen == [0, 0]
+ if next_paren == [0, 0]
return 0
endif
- call cursor(nextParen)
+ call cursor(next_paren)
call search('\S', 'W')
- let w = s:StripNamespaceAndMacroChars(s:CurrentWord())
+ let w = s:strip_namespace_and_macro_chars(s:current_word())
if g:clojure_special_indent_words =~# '\V\<' . w . '\>'
return 1
endif
@@ -179,27 +177,43 @@ if exists("*searchpairpos")
return 0
endfunction
- function! s:IsMethodSpecialCase(position)
+ function! s:is_method_special_case(position)
let pos = getpos('.')
try
- let val = s:ClojureIsMethodSpecialCaseWorker(a:position)
+ let val = s:clojure_is_method_special_case_worker(a:position)
finally
call setpos('.', pos)
endtry
return val
endfunction
- function! GetClojureIndent()
+ " Check if form is a reader conditional, that is, it is prefixed by #?
+ " or @#?
+ function! s:is_reader_conditional_special_case(position)
+ if getline(a:position[0])[a:position[1] - 3 : a:position[1] - 2] == "#?"
+ return 1
+ endif
+
+ return 0
+ endfunction
+
+ " Returns 1 for opening brackets, -1 for _anything else_.
+ function! s:bracket_type(char)
+ return stridx('([{', a:char) > -1 ? 1 : -1
+ endfunction
+
+ " Returns: [opening-bracket-lnum, indent]
+ function! s:clojure_indent_pos()
" Get rid of special case.
if line(".") == 1
- return 0
+ return [0, 0]
endif
" We have to apply some heuristics here to figure out, whether to use
" normal lisp indenting or not.
- let i = s:CheckForString()
+ let i = s:check_for_string()
if i > -1
- return i + !!g:clojure_align_multiline_strings
+ return [0, i + !!g:clojure_align_multiline_strings]
endif
call cursor(0, 1)
@@ -207,28 +221,28 @@ if exists("*searchpairpos")
" Find the next enclosing [ or {. We can limit the second search
" to the line, where the [ was found. If no [ was there this is
" zero and we search for an enclosing {.
- let paren = s:MatchPairs('(', ')', 0)
- let bracket = s:MatchPairs('\[', '\]', paren[0])
- let curly = s:MatchPairs('{', '}', bracket[0])
+ let paren = s:match_pairs('(', ')', 0)
+ let bracket = s:match_pairs('\[', '\]', paren[0])
+ let curly = s:match_pairs('{', '}', bracket[0])
" In case the curly brace is on a line later then the [ or - in
" case they are on the same line - in a higher column, we take the
" curly indent.
if curly[0] > bracket[0] || curly[1] > bracket[1]
if curly[0] > paren[0] || curly[1] > paren[1]
- return curly[1]
+ return curly
endif
endif
" If the curly was not chosen, we take the bracket indent - if
" there was one.
if bracket[0] > paren[0] || bracket[1] > paren[1]
- return bracket[1]
+ return bracket
endif
" There are neither { nor [ nor (, ie. we are at the toplevel.
if paren == [0, 0]
- return 0
+ return paren
endif
" Now we have to reimplement lispindent. This is surprisingly easy, as
@@ -246,58 +260,120 @@ if exists("*searchpairpos")
" - In any other case we use the column of the end of the word + 2.
call cursor(paren)
- if s:IsMethodSpecialCase(paren)
- return paren[1] + &shiftwidth - 1
+ if s:is_method_special_case(paren)
+ return [paren[0], paren[1] + shiftwidth() - 1]
+ endif
+
+ if s:is_reader_conditional_special_case(paren)
+ return paren
endif
" In case we are at the last character, we use the paren position.
if col("$") - 1 == paren[1]
- return paren[1]
+ return paren
endif
" In case after the paren is a whitespace, we search for the next word.
call cursor(0, col('.') + 1)
- if s:CurrentChar() == ' '
+ if s:current_char() == ' '
call search('\v\S', 'W')
endif
" If we moved to another line, there is no word after the (. We
" use the ( position for indent.
if line(".") > paren[0]
- return paren[1]
+ return paren
endif
" We still have to check, whether the keyword starts with a (, [ or {.
" In that case we use the ( position for indent.
- let w = s:CurrentWord()
- if stridx('([{', w[0]) > -1
- return paren[1]
+ let w = s:current_word()
+ if s:bracket_type(w[0]) == 1
+ return paren
endif
" Test words without namespace qualifiers and leading reader macro
" metacharacters.
"
" e.g. clojure.core/defn and #'defn should both indent like defn.
- let ww = s:StripNamespaceAndMacroChars(w)
+ let ww = s:strip_namespace_and_macro_chars(w)
if &lispwords =~# '\V\<' . ww . '\>'
- return paren[1] + &shiftwidth - 1
+ return [paren[0], paren[1] + shiftwidth() - 1]
endif
if g:clojure_fuzzy_indent
- \ && !s:MatchesOne(g:clojure_fuzzy_indent_blacklist, ww)
- \ && s:MatchesOne(g:clojure_fuzzy_indent_patterns, ww)
- return paren[1] + &shiftwidth - 1
+ \ && !s:match_one(g:clojure_fuzzy_indent_blacklist, ww)
+ \ && s:match_one(g:clojure_fuzzy_indent_patterns, ww)
+ return [paren[0], paren[1] + shiftwidth() - 1]
endif
call search('\v\_s', 'cW')
call search('\v\S', 'W')
if paren[0] < line(".")
- return paren[1] + (g:clojure_align_subforms ? 0 : &shiftwidth - 1)
+ return [paren[0], paren[1] + (g:clojure_align_subforms ? 0 : shiftwidth() - 1)]
endif
call search('\v\S', 'bW')
- return virtcol(".") + 1
+ return [line('.'), col('.') + 1]
+ endfunction
+
+ function! GetClojureIndent()
+ let lnum = line('.')
+ let orig_lnum = lnum
+ let orig_col = col('.')
+ let [opening_lnum, indent] = s:clojure_indent_pos()
+
+ " Account for multibyte characters
+ if opening_lnum > 0
+ let indent -= indent - virtcol([opening_lnum, indent])
+ endif
+
+ " Return if there are no previous lines to inherit from
+ if opening_lnum < 1 || opening_lnum >= lnum - 1
+ call cursor(orig_lnum, orig_col)
+ return indent
+ endif
+
+ let bracket_count = 0
+
+ " Take the indent of the first previous non-white line that is
+ " at the same sexp level. cf. src/misc1.c:get_lisp_indent()
+ while 1
+ let lnum = prevnonblank(lnum - 1)
+ let col = 1
+
+ if lnum <= opening_lnum
+ break
+ endif
+
+ call cursor(lnum, col)
+
+ " Handle bracket counting edge case
+ if s:is_paren()
+ let bracket_count += s:bracket_type(s:current_char())
+ endif
+
+ while 1
+ if search('\v[(\[{}\])]', '', lnum) < 1
+ break
+ elseif !s:ignored_region()
+ let bracket_count += s:bracket_type(s:current_char())
+ endif
+ endwhile
+
+ if bracket_count == 0
+ " Check if this is part of a multiline string
+ call cursor(lnum, 1)
+ if s:syn_id_name() !~? '\vstring|regex'
+ call cursor(orig_lnum, orig_col)
+ return indent(lnum)
+ endif
+ endif
+ endwhile
+
+ call cursor(orig_lnum, orig_col)
+ return indent
endfunction
setlocal indentexpr=GetClojureIndent()
diff --git a/runtime/indent/cmake.vim b/runtime/indent/cmake.vim
index 421afcb6d7..845bdd7655 100644
--- a/runtime/indent/cmake.vim
+++ b/runtime/indent/cmake.vim
@@ -1,14 +1,12 @@
" Vim indent file
-" Program: CMake - Cross-Platform Makefile Generator
-" Module: $RCSfile: cmake-indent.vim,v $
" Language: CMake (ft=cmake)
" Author: Andy Cedilnik <andy.cedilnik@kitware.com>
-" Maintainer: Karthik Krishnan <karthik.krishnan@kitware.com>
-" Last Change: $Date: 2008-01-16 16:53:53 $
-" Version: $Revision: 1.9 $
+" Maintainer: Dimitri Merejkowsky <d.merej@gmail.com>
+" Former Maintainer: Karthik Krishnan <karthik.krishnan@kitware.com>
+" Last Change: 2017 Sep 24
"
" Licence: The CMake license applies to this file. See
-" http://www.cmake.org/HTML/Copyright.html
+" https://cmake.org/licensing
" This implies that distribution with Vim is allowed
if exists("b:did_indent")
@@ -68,19 +66,19 @@ fun! CMakeGetIndent(lnum)
let ind = ind
else
if previous_line =~? cmake_indent_begin_regex
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
if previous_line =~? cmake_indent_open_regex
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
endif
" Subtract
if this_line =~? cmake_indent_end_regex
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
if previous_line =~? cmake_indent_close_regex
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
return ind
diff --git a/runtime/indent/cobol.vim b/runtime/indent/cobol.vim
index 8dce3cd014..c08444ac40 100644
--- a/runtime/indent/cobol.vim
+++ b/runtime/indent/cobol.vim
@@ -52,11 +52,11 @@ function! s:optionalblock(lnum,ind,blocks,clauses)
if getline(lastclause) =~? clauses && s:stripped(lastclause) !~? '^'.begin
let ind = indent(lastclause)
elseif lastclause > 0
- let ind = indent(lastclause) + &sw
- "let ind = ind + &sw
+ let ind = indent(lastclause) + shiftwidth()
+ "let ind = ind + shiftwidth()
endif
elseif line =~? clauses && cline !~? end
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
return ind
endfunction
@@ -98,8 +98,8 @@ function! GetCobolIndent(lnum) abort
let num = matchstr(line,'^\s*\zs\d\+\>')
if 0+cnum == num
return lindent
- elseif 0+cnum > num && default < lindent + &sw
- let default = lindent + &sw
+ elseif 0+cnum > num && default < lindent + shiftwidth()
+ let default = lindent + shiftwidth()
endif
elseif lindent < bshft && lindent >= ashft
break
@@ -135,13 +135,13 @@ function! GetCobolIndent(lnum) abort
if line =~? '^PERFORM\>'
let perfline = substitute(line, '\c^PERFORM\s*', "", "")
if perfline =~? '^\%(\k\+\s\+TIMES\)\=\s*$'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
elseif perfline =~? '^\%(WITH\s\+TEST\|VARYING\|UNTIL\)\>.*[^.]$'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
endif
if line =~? '^\%(IF\|THEN\|ELSE\|READ\|EVALUATE\|SEARCH\|SELECT\)\>'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
let ind = s:optionalblock(a:lnum,ind,'ADD\|COMPUTE\|DIVIDE\|MULTIPLY\|SUBTRACT','ON\s\+SIZE\s\+ERROR')
let ind = s:optionalblock(a:lnum,ind,'STRING\|UNSTRING\|ACCEPT\|DISPLAY\|CALL','ON\s\+OVERFLOW\|ON\s\+EXCEPTION')
@@ -157,10 +157,10 @@ function! GetCobolIndent(lnum) abort
"&& s:stripped(lastclause) !~? '^\%(SEARCH\|EVALUATE\|READ\)\>'
let ind = indent(lastclause)
elseif lastclause > 0
- let ind = indent(lastclause) + &sw
+ let ind = indent(lastclause) + shiftwidth()
endif
elseif line =~? '^WHEN\>'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
"I'm not sure why I had this
"if line =~? '^ELSE\>-\@!' && line !~? '\.$'
@@ -168,7 +168,7 @@ function! GetCobolIndent(lnum) abort
"endif
if cline =~? '^\(END\)\>-\@!'
" On lines with just END, 'guess' a simple shift left
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
elseif cline =~? '^\(END-IF\|THEN\|ELSE\)\>-\@!'
call cursor(a:lnum,indent(a:lnum))
let match = searchpair('\c-\@<!\<IF\>','\c-\@<!\%(THEN\|ELSE\)\>','\c-\@<!\<END-IF\>\zs','bnW',s:skip)
@@ -209,7 +209,7 @@ function! GetCobolIndent(lnum) abort
if match > 0
let ind = indent(match)
elseif cline =~? '^\(END-\(READ\|EVALUATE\|SEARCH\|PERFORM\)\)\>'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
endif
return ind < bshft ? bshft : ind
diff --git a/runtime/indent/config.vim b/runtime/indent/config.vim
index 7eb1657572..074f467bee 100644
--- a/runtime/indent/config.vim
+++ b/runtime/indent/config.vim
@@ -1,8 +1,8 @@
" Vim indent file
-" Language: Autoconf configure.{ac,in} file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-12-20
-" TODO: how about nested [()]'s in one line
+" Language: Autoconf configure.{ac,in} file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-20
+" TODO: how about nested [()]'s in one line
" what's wrong with '\\\@!'?
" Only load this indent file when no other was loaded.
diff --git a/runtime/indent/context.vim b/runtime/indent/context.vim
new file mode 100644
index 0000000000..652479f7e2
--- /dev/null
+++ b/runtime/indent/context.vim
@@ -0,0 +1,36 @@
+" ConTeXt indent file
+" Language: ConTeXt typesetting engine
+" Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+" Last Change: 2016 Oct 15
+
+if exists("b:did_indent")
+ finish
+endif
+
+if !get(b:, 'context_metapost', get(g:, 'context_metapost', 1))
+ finish
+endif
+
+" Load MetaPost indentation script
+runtime! indent/mp.vim
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+setlocal indentexpr=GetConTeXtIndent()
+
+let b:undo_indent = "setl indentexpr<"
+
+function! GetConTeXtIndent()
+ " Use MetaPost rules inside MetaPost graphic environments
+ if len(synstack(v:lnum, 1)) > 0 &&
+ \ synIDattr(synstack(v:lnum, 1)[0], "name") ==# 'contextMPGraphic'
+ return GetMetaPostIndent()
+ endif
+ return -1
+endfunc
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim:sw=2
diff --git a/runtime/indent/css.vim b/runtime/indent/css.vim
index f0a272eff9..4d15b8d2dc 100644
--- a/runtime/indent/css.vim
+++ b/runtime/indent/css.vim
@@ -2,6 +2,7 @@
" Language: CSS
" Maintainer: Nikolai Weibull <now@bitwi.se>
" Latest Revision: 2012-05-30
+" Use of shiftwidth() added by Oleg Zubchenko.
if exists("b:did_indent")
finish
@@ -75,8 +76,8 @@ function GetCSSIndent()
return 0
endif
- return indent(pnum) + s:count_braces(pnum, 1) * &sw
- \ - s:count_braces(v:lnum, 0) * &sw
+ return indent(pnum) + s:count_braces(pnum, 1) * shiftwidth()
+ \ - s:count_braces(v:lnum, 0) * shiftwidth()
endfunction
let &cpo = s:keepcpo
diff --git a/runtime/indent/cucumber.vim b/runtime/indent/cucumber.vim
index 965c7786ed..ad28a67a0d 100644
--- a/runtime/indent/cucumber.vim
+++ b/runtime/indent/cucumber.vim
@@ -1,7 +1,7 @@
" Vim indent file
" Language: Cucumber
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
-" Last Change: 2013 May 30
+" Last Change: 2017 Jun 13
if exists("b:did_indent")
finish
@@ -27,6 +27,7 @@ function! GetCucumberIndent()
let line = getline(prevnonblank(v:lnum-1))
let cline = getline(v:lnum)
let nline = getline(nextnonblank(v:lnum+1))
+ let sw = exists('*shiftwidth') ? shiftwidth() : shiftwidth()
let syn = s:syn(prevnonblank(v:lnum-1))
let csyn = s:syn(v:lnum)
let nsyn = s:syn(nextnonblank(v:lnum+1))
@@ -35,38 +36,38 @@ function! GetCucumberIndent()
return 0
elseif csyn ==# 'cucumberExamples' || cline =~# '^\s*\%(Examples\|Scenarios\):'
" examples heading
- return 2 * &sw
+ return 2 * sw
elseif csyn =~# '^cucumber\%(Background\|Scenario\|ScenarioOutline\)$' || cline =~# '^\s*\%(Background\|Scenario\|Scenario Outline\):'
" background, scenario or outline heading
- return &sw
+ return sw
elseif syn ==# 'cucumberFeature' || line =~# '^\s*Feature:'
" line after feature heading
- return &sw
+ return sw
elseif syn ==# 'cucumberExamples' || line =~# '^\s*\%(Examples\|Scenarios\):'
" line after examples heading
- return 3 * &sw
+ return 3 * sw
elseif syn =~# '^cucumber\%(Background\|Scenario\|ScenarioOutline\)$' || line =~# '^\s*\%(Background\|Scenario\|Scenario Outline\):'
" line after background, scenario or outline heading
- return 2 * &sw
+ return 2 * sw
elseif cline =~# '^\s*[@#]' && (nsyn == 'cucumberFeature' || nline =~# '^\s*Feature:' || indent(prevnonblank(v:lnum-1)) <= 0)
" tag or comment before a feature heading
return 0
elseif cline =~# '^\s*@'
" other tags
- return &sw
+ return sw
elseif cline =~# '^\s*[#|]' && line =~# '^\s*|'
" mid-table
" preserve indent
return indent(prevnonblank(v:lnum-1))
elseif cline =~# '^\s*|' && line =~# '^\s*[^|]'
" first line of a table, relative indent
- return indent(prevnonblank(v:lnum-1)) + &sw
+ return indent(prevnonblank(v:lnum-1)) + sw
elseif cline =~# '^\s*[^|]' && line =~# '^\s*|'
" line after a table, relative unindent
- return indent(prevnonblank(v:lnum-1)) - &sw
+ return indent(prevnonblank(v:lnum-1)) - sw
elseif cline =~# '^\s*#' && getline(v:lnum-1) =~ '^\s*$' && (nsyn =~# '^cucumber\%(Background\|Scenario\|ScenarioOutline\)$' || nline =~# '^\s*\%(Background\|Scenario\|Scenario Outline\):')
" comments on scenarios
- return &sw
+ return sw
endif
return indent(prevnonblank(v:lnum-1))
endfunction
diff --git a/runtime/indent/dictconf.vim b/runtime/indent/dictconf.vim
index adbc1a5242..2e15c76146 100644
--- a/runtime/indent/dictconf.vim
+++ b/runtime/indent/dictconf.vim
@@ -1,7 +1,7 @@
" Vim indent file
-" Language: dict(1) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-12-20
+" Language: dict(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-20
if exists("b:did_indent")
finish
diff --git a/runtime/indent/dictdconf.vim b/runtime/indent/dictdconf.vim
index 9427342c7e..5c4fbdafb5 100644
--- a/runtime/indent/dictdconf.vim
+++ b/runtime/indent/dictdconf.vim
@@ -1,7 +1,7 @@
" Vim indent file
-" Language: dictd(8) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-12-20
+" Language: dictd(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-20
if exists("b:did_indent")
finish
diff --git a/runtime/indent/docbk.vim b/runtime/indent/docbk.vim
index 3fde2a13b6..d8661ffbe9 100644
--- a/runtime/indent/docbk.vim
+++ b/runtime/indent/docbk.vim
@@ -1,7 +1,7 @@
" Vim indent file
-" Language: DocBook Documentation Format
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: DocBook Documentation Format
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:did_indent")
finish
diff --git a/runtime/indent/dosbatch.vim b/runtime/indent/dosbatch.vim
new file mode 100644
index 0000000000..aea2a184d4
--- /dev/null
+++ b/runtime/indent/dosbatch.vim
@@ -0,0 +1,59 @@
+" Vim indent file
+" Language: MSDOS batch file (with NT command extensions)
+" Maintainer: Ken Takata
+" URL: https://github.com/k-takata/vim-dosbatch-indent
+" Last Change: 2017 May 10
+" Filenames: *.bat
+" License: VIM License
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal nosmartindent
+setlocal noautoindent
+setlocal indentexpr=GetDosBatchIndent(v:lnum)
+setlocal indentkeys=!^F,o,O
+setlocal indentkeys+=0=)
+
+if exists("*GetDosBatchIndent")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+function! GetDosBatchIndent(lnum)
+ let l:prevlnum = prevnonblank(a:lnum-1)
+ if l:prevlnum == 0
+ " top of file
+ return 0
+ endif
+
+ " grab the previous and current line, stripping comments.
+ let l:prevl = substitute(getline(l:prevlnum), '\c^\s*\%(@\s*\)\?rem\>.*$', '', '')
+ let l:thisl = getline(a:lnum)
+ let l:previ = indent(l:prevlnum)
+
+ let l:ind = l:previ
+
+ if l:prevl =~? '^\s*@\=if\>.*(\s*$' ||
+ \ l:prevl =~? '\<do\>\s*(\s*$' ||
+ \ l:prevl =~? '\<else\>\s*\%(if\>.*\)\?(\s*$' ||
+ \ l:prevl =~? '^.*\(&&\|||\)\s*(\s*$'
+ " previous line opened a block
+ let l:ind += shiftwidth()
+ endif
+ if l:thisl =~ '^\s*)'
+ " this line closed a block
+ let l:ind -= shiftwidth()
+ endif
+
+ return l:ind
+endfunction
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8 sw=2 sts=2
diff --git a/runtime/indent/dtd.vim b/runtime/indent/dtd.vim
index 88c0c5129e..963ac408ef 100644
--- a/runtime/indent/dtd.vim
+++ b/runtime/indent/dtd.vim
@@ -1,10 +1,7 @@
" Vim indent file
-" Language: DTD (Document Type Definition for XML)
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2011-07-08
-
-let s:cpo_save = &cpo
-set cpo&vim
+" Language: DTD (Document Type Definition for XML)
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2011-07-08
setlocal indentexpr=GetDTDIndent()
setlocal indentkeys=!^F,o,O,>
@@ -14,6 +11,9 @@ if exists("*GetDTDIndent")
finish
endif
+let s:cpo_save = &cpo
+set cpo&vim
+
" TODO: Needs to be adjusted to stop at [, <, and ].
let s:token_pattern = '^[^[:space:]]\+'
@@ -84,7 +84,7 @@ function GetDTDIndent()
let [declaration, end] = s:lex1(line, col)
if declaration == ""
- return indent + &sw
+ return indent + shiftwidth()
elseif declaration == '--'
" Weโ€™re looking at a comment. Now, simply determine if the comment is
" terminated or not. If it isnโ€™t, let Vim take care of that using
@@ -100,7 +100,7 @@ function GetDTDIndent()
" Check for element name. If none exists, indent one level.
let [name, end] = s:lex(line, end)
if name == ""
- return indent + &sw
+ return indent + shiftwidth()
endif
" Check for token following element name. This can be a specification of
@@ -113,7 +113,7 @@ function GetDTDIndent()
let n += 1
endwhile
if token == ""
- return indent + &sw
+ return indent + shiftwidth()
endif
" Next comes the content model. If the token weโ€™ve found isnโ€™t a
@@ -148,7 +148,7 @@ function GetDTDIndent()
return indent
endif
" TODO: Should use s:lex here on getline(v:lnum) and check for >.
- return getline(v:lnum) =~ '^\s*>' || count(values(seen), 0) == 0 ? indent : (indent + &sw)
+ return getline(v:lnum) =~ '^\s*>' || count(values(seen), 0) == 0 ? indent : (indent + shiftwidth())
endif
" If weโ€™ve seen an addition or exception already and this is of the same
@@ -167,7 +167,7 @@ function GetDTDIndent()
" Check for element name. If none exists, indent one level.
let [name, end] = s:lex(line, end)
if name == ""
- return indent + &sw
+ return indent + shiftwidth()
endif
" Check for any number of attributes.
@@ -180,7 +180,7 @@ function GetDTDIndent()
let [name, end] = s:lex(line, end)
if name == ""
" TODO: Should use s:lex here on getline(v:lnum) and check for >.
- return getline(v:lnum) =~ '^\s*>' ? indent : (indent + &sw)
+ return getline(v:lnum) =~ '^\s*>' ? indent : (indent + shiftwidth())
elseif name == ">"
return indent
endif
@@ -194,14 +194,14 @@ function GetDTDIndent()
" (CDATA|NMTOKEN|NMTOKENS|ID|IDREF|IDREFS|ENTITY|ENTITIES)?
let [value, end] = s:lex(line, end, '^\%((\|[^[:space:]]\+\)')
if value == ""
- return indent + &sw * 2
+ return indent + shiftwidth() * 2
elseif value == 'NOTATION'
" If this is a enumerated value based on notations, read another token
" for the actual value. If it doesnโ€™t exist, indent three levels.
" TODO: If validating according to above, value must be equal to '('.
let [value, end] = s:lex(line, end, '^\%((\|[^[:space:]]\+\)')
if value == ""
- return indent + &sw * 3
+ return indent + shiftwidth() * 3
endif
endif
@@ -216,13 +216,13 @@ function GetDTDIndent()
" two levels.
let [default, end] = s:lex(line, end, '^\%("\_[^"]*"\|#\(REQUIRED\|IMPLIED\|FIXED\)\)')
if default == ""
- return indent + &sw * 2
+ return indent + shiftwidth() * 2
elseif default == '#FIXED'
" We need to look for the fixed value. If non exists, indent three
" levels.
let [default, end] = s:lex(line, end, '^"\_[^"]*"')
if default == ""
- return indent + &sw * 3
+ return indent + shiftwidth() * 3
endif
endif
endwhile
@@ -233,11 +233,11 @@ function GetDTDIndent()
" again, if none exists, indent one level.
let [name, end] = s:lex(line, end)
if name == ""
- return indent + &sw
+ return indent + shiftwidth()
elseif name == '%'
let [name, end] = s:lex(line, end)
if name == ""
- return indent + &sw
+ return indent + shiftwidth()
endif
endif
@@ -256,27 +256,27 @@ function GetDTDIndent()
" weโ€™re now done with this entity.
let [value, end] = s:lex(line, end)
if value == ""
- return indent + &sw
+ return indent + shiftwidth()
elseif value == 'SYSTEM' || value == 'PUBLIC'
let [quoted_string, end] = s:lex(line, end, '\%("[^"]\+"\|''[^'']\+''\)')
if quoted_string == ""
- return indent + &sw * 2
+ return indent + shiftwidth() * 2
endif
if value == 'PUBLIC'
let [quoted_string, end] = s:lex(line, end, '\%("[^"]\+"\|''[^'']\+''\)')
if quoted_string == ""
- return indent + &sw * 2
+ return indent + shiftwidth() * 2
endif
endif
let [ndata, end] = s:lex(line, end)
if ndata == ""
- return indent + &sw
+ return indent + shiftwidth()
endif
let [name, end] = s:lex(line, end)
- return name == "" ? (indent + &sw * 2) : indent
+ return name == "" ? (indent + shiftwidth() * 2) : indent
else
return indent
endif
@@ -284,24 +284,24 @@ function GetDTDIndent()
" Check for notation name. If none exists, indent one level.
let [name, end] = s:lex(line, end)
if name == ""
- return indent + &sw
+ return indent + shiftwidth()
endif
" Now check for the external ID. If none exists, indent one level.
let [id, end] = s:lex(line, end)
if id == ""
- return indent + &sw
+ return indent + shiftwidth()
elseif id == 'SYSTEM' || id == 'PUBLIC'
let [quoted_string, end] = s:lex(line, end, '\%("[^"]\+"\|''[^'']\+''\)')
if quoted_string == ""
- return indent + &sw * 2
+ return indent + shiftwidth() * 2
endif
if id == 'PUBLIC'
let [quoted_string, end] = s:lex(line, end, '\%("[^"]\+"\|''[^'']\+''\|>\)')
if quoted_string == ""
" TODO: Should use s:lex here on getline(v:lnum) and check for >.
- return getline(v:lnum) =~ '^\s*>' ? indent : (indent + &sw * 2)
+ return getline(v:lnum) =~ '^\s*>' ? indent : (indent + shiftwidth() * 2)
elseif quoted_string == '>'
return indent
endif
diff --git a/runtime/indent/dylan.vim b/runtime/indent/dylan.vim
index 0afcbeada7..6811ec4af5 100644
--- a/runtime/indent/dylan.vim
+++ b/runtime/indent/dylan.vim
@@ -1,7 +1,7 @@
" Vim indent file
" Language: Dylan
" Version: 0.01
-" Last Change: 2003 Feb 04
+" Last Change: 2017 Jun 13
" Maintainer: Brent A. Fulgham <bfulgham@debian.org>
" Only load this indent file when no other was loaded.
@@ -45,13 +45,13 @@ function DylanGetIndent()
" If previous line was a 'define', indent
if prevline =~? '\(^\s*\(begin\|block\|case\|define\|else\|elseif\|for\|finally\|if\|select\|unless\|while\)\|\s*\S*\s*=>$\)'
- let chg = &sw
+ let chg = shiftwidth()
" local methods indent the shift-width, plus 6 for the 'local'
elseif prevline =~? '^\s*local'
- let chg = &sw + 6
+ let chg = shiftwidth() + 6
" If previous line was a let with no closing semicolon, indent
elseif prevline =~? '^\s*let.*[^;]\s*$'
- let chg = &sw
+ let chg = shiftwidth()
" If previous line opened a parenthesis, and did not close it, indent
elseif prevline =~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
return = match( prevline, '(.*\((.*)\|[^)]\)*.*$') + 1
@@ -75,13 +75,13 @@ function DylanGetIndent()
" line doesn't start with an indentable command:
let curr_str = getline(curr_line)
if curr_str =~? '^\s*\(begin\|block\|case\|define\|else\|elseif\|for\|finally\|if\|select\|unless\|while\)'
- let chg = &sw
+ let chg = shiftwidth()
endif
endif
" If a line starts with end, un-indent (even if we just indented!)
if cline =~? '^\s*\(cleanup\|end\|else\|elseif\|exception\|finally\|otherwise\)'
- let chg = chg - &sw
+ let chg = chg - shiftwidth()
endif
return ind + chg
diff --git a/runtime/indent/eiffel.vim b/runtime/indent/eiffel.vim
index 87e82e833d..d7667a8346 100644
--- a/runtime/indent/eiffel.vim
+++ b/runtime/indent/eiffel.vim
@@ -2,9 +2,10 @@
" Language: Eiffel
" Maintainer: Jocelyn Fiat <jfiat@eiffel.com>
" Previous-Maintainer: David Clarke <gadicath@dishevelled.net>
+" Contributions from: Takuya Fujiwara
" Contributions from: Thilo Six
-" $Date: 2004/12/09 21:33:52 $
-" $Revision: 1.3 $
+" $Date: 2017/03/08 06:00:00 $
+" $Revision: 1.4 $
" URL: https://github.com/eiffelhub/vim-eiffel
" Only load this indent file when no other was loaded.
@@ -28,7 +29,7 @@ let b:undo_indent = "setl smartindent< indentkeys< indentexpr< autoindent< comme
" Define some stuff
" keywords grouped by indenting
let s:trust_user_indent = '\(+\)\(\s*\(--\).*\)\=$'
-let s:relative_indent = '^\s*\(deferred\|class\|feature\|creation\|inherit\|loop\|from\|until\|if\|else\|elseif\|ensure\|require\|check\|do\|local\|invariant\|variant\|rename\|redefine\|do\|export\)\>'
+let s:relative_indent = '^\s*\(deferred\|class\|feature\|creation\|inherit\|loop\|from\|across\|until\|if\|else\|elseif\|ensure\|require\|check\|do\|local\|invariant\|variant\|rename\|redefine\|do\|export\)\>'
let s:outdent = '^\s*\(else\|invariant\|variant\|do\|require\|until\|loop\|local\)\>'
let s:no_indent = '^\s*\(class\|feature\|creation\|inherit\)\>'
let s:single_dent = '^[^-]\+[[:alnum:]]\+ is\(\s*\(--\).*\)\=$'
@@ -63,23 +64,23 @@ function GetEiffelIndent()
" Add a 'shiftwidth' after lines that start with an indent word
let ind = indent(lnum)
if getline(lnum) =~ s:relative_indent
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
" Indent to single indent
if getline(v:lnum) =~ s:single_dent && getline(v:lnum) !~ s:relative_indent
\ && getline(v:lnum) !~ '\s*\<\(and\|or\|implies\)\>'
- let ind = &sw
+ let ind = shiftwidth()
endif
" Indent to double indent
if getline(v:lnum) =~ s:inheritance_dent
- let ind = 2 * &sw
+ let ind = 2 * shiftwidth()
endif
" Indent line after the first line of the function definition
if getline(lnum) =~ s:single_dent
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
" The following should always be at the start of a line, no indenting
@@ -91,17 +92,17 @@ function GetEiffelIndent()
" or first thing after the 'do'
if getline(v:lnum) =~ s:outdent && getline(v:lnum - 1) !~ s:single_dent
\ && getline(v:lnum - 1) !~ '^\s*do\>'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
" Subtract a shiftwidth for end statements
if getline(v:lnum) =~ '^\s*end\>'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
" set indent of zero end statements that are at an indent of 3, this should
" only ever be the class's end.
- if getline(v:lnum) =~ '^\s*end\>' && ind == &sw
+ if getline(v:lnum) =~ '^\s*end\>' && ind == shiftwidth()
let ind = 0
endif
diff --git a/runtime/indent/erlang.vim b/runtime/indent/erlang.vim
index 7569fe9106..9228f18683 100644
--- a/runtime/indent/erlang.vim
+++ b/runtime/indent/erlang.vim
@@ -669,7 +669,7 @@ function! s:BeginningOfClauseFound(stack, token, stored_vcol)
call s:Pop(a:stack)
if empty(a:stack)
call s:Log(' Stack is ["when"], so LTI is in a guard -> return')
- return [1, a:stored_vcol + &sw + 2]
+ return [1, a:stored_vcol + shiftwidth() + 2]
else
return [1, s:UnexpectedToken(a:token, a:stack)]
endif
@@ -678,7 +678,7 @@ function! s:BeginningOfClauseFound(stack, token, stored_vcol)
call s:Pop(a:stack)
if empty(a:stack)
call s:Log(' Stack is ["->"], so LTI is in function body -> return')
- return [1, a:stored_vcol + &sw]
+ return [1, a:stored_vcol + shiftwidth()]
elseif a:stack[0] ==# ';'
call s:Pop(a:stack)
if empty(a:stack)
@@ -797,7 +797,7 @@ function! s:ErlangCalcIndent2(lnum, stack)
elseif token ==# 'begin'
let [ret, res] = s:BeginElementFound(stack, token, curr_vcol,
- \stored_vcol, 'end', &sw)
+ \stored_vcol, 'end', shiftwidth())
if ret | return res | endif
" case EXPR of BRANCHES end
@@ -848,11 +848,11 @@ function! s:ErlangCalcIndent2(lnum, stack)
elseif stack == ['->']
call s:Log(' LTI is in a branch after ' .
\'"of/receive/after/if/catch" -> return')
- return stored_vcol + &sw
+ return stored_vcol + shiftwidth()
elseif stack == ['when']
call s:Log(' LTI is in a guard after ' .
\'"of/receive/after/if/catch" -> return')
- return stored_vcol + &sw
+ return stored_vcol + shiftwidth()
else
return s:UnexpectedToken(token, stack)
endif
@@ -888,7 +888,7 @@ function! s:ErlangCalcIndent2(lnum, stack)
if empty(stack)
call s:Log(' LTI is in a condition; matching ' .
\'"case/if/try/receive" found')
- let stored_vcol = curr_vcol + &sw
+ let stored_vcol = curr_vcol + shiftwidth()
elseif stack[0] ==# 'align_to_begin_element'
call s:Pop(stack)
let stored_vcol = curr_vcol
@@ -897,23 +897,23 @@ function! s:ErlangCalcIndent2(lnum, stack)
\'"case/if/try/receive" found')
call s:Pop(stack)
call s:Pop(stack)
- let stored_vcol = curr_vcol + &sw
+ let stored_vcol = curr_vcol + shiftwidth()
elseif stack[0] ==# '->'
call s:Log(' LTI is in a branch; matching ' .
\'"case/if/try/receive" found')
call s:Pop(stack)
- let stored_vcol = curr_vcol + 2 * &sw
+ let stored_vcol = curr_vcol + 2 * shiftwidth()
elseif stack[0] ==# 'when'
call s:Log(' LTI is in a guard; matching ' .
\'"case/if/try/receive" found')
call s:Pop(stack)
- let stored_vcol = curr_vcol + 2 * &sw + 2
+ let stored_vcol = curr_vcol + 2 * shiftwidth() + 2
endif
endif
let [ret, res] = s:BeginElementFound(stack, token, curr_vcol,
- \stored_vcol, 'end', &sw)
+ \stored_vcol, 'end', shiftwidth())
if ret | return res | endif
elseif token ==# 'fun'
@@ -930,7 +930,7 @@ function! s:ErlangCalcIndent2(lnum, stack)
" stack = ['when'] => LTI is in a guard
if empty(stack)
call s:Log(' LTI is in a condition; matching "fun" found')
- let stored_vcol = curr_vcol + &sw
+ let stored_vcol = curr_vcol + shiftwidth()
elseif len(stack) > 1 && stack[0] ==# '->' && stack[1] ==# ';'
call s:Log(' LTI is in a condition; matching "fun" found')
call s:Pop(stack)
@@ -938,15 +938,15 @@ function! s:ErlangCalcIndent2(lnum, stack)
elseif stack[0] ==# '->'
call s:Log(' LTI is in a branch; matching "fun" found')
call s:Pop(stack)
- let stored_vcol = curr_vcol + 2 * &sw
+ let stored_vcol = curr_vcol + 2 * shiftwidth()
elseif stack[0] ==# 'when'
call s:Log(' LTI is in a guard; matching "fun" found')
call s:Pop(stack)
- let stored_vcol = curr_vcol + 2 * &sw + 2
+ let stored_vcol = curr_vcol + 2 * shiftwidth() + 2
endif
let [ret, res] = s:BeginElementFound(stack, token, curr_vcol,
- \stored_vcol, 'end', &sw)
+ \stored_vcol, 'end', shiftwidth())
if ret | return res | endif
else
" Pass: we have a function reference (e.g. "fun f/0")
@@ -1220,7 +1220,7 @@ function! s:ErlangCalcIndent2(lnum, stack)
" when A,
" LTI
let [ret, res] = s:BeginElementFoundIfEmpty(stack, token, curr_vcol,
- \stored_vcol, &sw)
+ \stored_vcol, shiftwidth())
if ret | return res | endif
else
" Example:
@@ -1252,7 +1252,7 @@ function! s:ErlangCalcIndent2(lnum, stack)
" If LTI is between an 'after' and the corresponding
" 'end', then let's return
let [ret, res] = s:BeginElementFoundIfEmpty(stack, token, curr_vcol,
- \stored_vcol, &sw)
+ \stored_vcol, shiftwidth())
if ret | return res | endif
endif
diff --git a/runtime/indent/eruby.vim b/runtime/indent/eruby.vim
index 80cab7000e..5058325495 100644
--- a/runtime/indent/eruby.vim
+++ b/runtime/indent/eruby.vim
@@ -19,6 +19,9 @@ else
endif
unlet! b:did_indent
+" Force HTML indent to not keep state.
+let b:html_indent_usestate = 0
+
if &l:indentexpr == ''
if &l:cindent
let &l:indentexpr = 'cindent(v:lnum)'
@@ -38,7 +41,14 @@ if exists("*GetErubyIndent")
finish
endif
+" this file uses line continuations
+let s:cpo_sav = &cpo
+set cpo&vim
+
function! GetErubyIndent(...)
+ " The value of a single shift-width
+ let sw = shiftwidth()
+
if a:0 && a:1 == '.'
let v:lnum = line('.')
elseif a:0 && a:1 =~ '^\d'
@@ -52,31 +62,44 @@ function! GetErubyIndent(...)
let ind = GetRubyIndent(v:lnum)
else
exe "let ind = ".b:eruby_subtype_indentexpr
+
+ " Workaround for Andy Wokula's HTML indent. This should be removed after
+ " some time, since the newest version is fixed in a different way.
+ if b:eruby_subtype_indentexpr =~# '^HtmlIndent('
+ \ && exists('b:indent')
+ \ && type(b:indent) == type({})
+ \ && has_key(b:indent, 'lnum')
+ " Force HTML indent to not keep state
+ let b:indent.lnum = -1
+ endif
endif
let lnum = prevnonblank(v:lnum-1)
let line = getline(lnum)
let cline = getline(v:lnum)
if cline =~# '^\s*<%[-=]\=\s*\%(}\|end\|else\|\%(ensure\|rescue\|elsif\|when\).\{-\}\)\s*\%([-=]\=%>\|$\)'
- let ind = ind - &sw
+ let ind = ind - sw
endif
if line =~# '\S\s*<%[-=]\=\s*\%(}\|end\).\{-\}\s*\%([-=]\=%>\|$\)'
- let ind = ind - &sw
+ let ind = ind - sw
endif
if line =~# '\%({\|\<do\)\%(\s*|[^|]*|\)\=\s*[-=]\=%>'
- let ind = ind + &sw
+ let ind = ind + sw
elseif line =~# '<%[-=]\=\s*\%(module\|class\|def\|if\|for\|while\|until\|else\|elsif\|case\|when\|unless\|begin\|ensure\|rescue\)\>.*%>'
- let ind = ind + &sw
+ let ind = ind + sw
endif
if line =~# '^\s*<%[=#-]\=\s*$' && cline !~# '^\s*end\>'
- let ind = ind + &sw
+ let ind = ind + sw
endif
- if line !~# '^\s*<%' && line =~# '%>\s*$'
- let ind = ind - &sw
+ if line !~# '^\s*<%' && line =~# '%>\s*$' && line !~# '^\s*end\>'
+ let ind = ind - sw
endif
if cline =~# '^\s*[-=]\=%>\s*$'
- let ind = ind - &sw
+ let ind = ind - sw
endif
return ind
endfunction
+let &cpo = s:cpo_sav
+unlet! s:cpo_sav
+
" vim:set sw=2 sts=2 ts=8 noet:
diff --git a/runtime/indent/eterm.vim b/runtime/indent/eterm.vim
index f25f5f4dad..8ee342fcfa 100644
--- a/runtime/indent/eterm.vim
+++ b/runtime/indent/eterm.vim
@@ -1,7 +1,7 @@
" Vim indent file
-" Language: Eterm configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-12-20
+" Language: Eterm configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-20
if exists("b:did_indent")
finish
@@ -25,11 +25,11 @@ function GetEtermIndent()
let ind = indent(lnum)
if getline(lnum) =~ '^\s*begin\>'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
if getline(v:lnum) =~ '^\s*end\>'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
return ind
diff --git a/runtime/indent/falcon.vim b/runtime/indent/falcon.vim
index 84b16d55f0..b34e7cfd47 100644
--- a/runtime/indent/falcon.vim
+++ b/runtime/indent/falcon.vim
@@ -339,7 +339,7 @@ function FalconGetIndent(...)
" If the previous line ended with a block opening, add a level of indent.
if s:Match(lnum, s:block_regex)
- return indent(s:GetMSL(lnum)) + &sw
+ return indent(s:GetMSL(lnum)) + shiftwidth()
endif
" If it contained hanging closing brackets, find the rightmost one, find its
@@ -350,20 +350,20 @@ function FalconGetIndent(...)
if opening.pos != -1
if opening.type == '(' && searchpair('(', '', ')', 'bW', s:skip_expr) > 0
if col('.') + 1 == col('$')
- return ind + &sw
+ return ind + shiftwidth()
else
return virtcol('.')
endif
else
let nonspace = matchend(line, '\S', opening.pos + 1) - 1
- return nonspace > 0 ? nonspace : ind + &sw
+ return nonspace > 0 ? nonspace : ind + shiftwidth()
endif
elseif closing.pos != -1
call cursor(lnum, closing.pos + 1)
normal! %
if s:Match(line('.'), s:falcon_indent_keywords)
- return indent('.') + &sw
+ return indent('.') + shiftwidth()
else
return indent('.')
endif
@@ -392,7 +392,7 @@ function FalconGetIndent(...)
let col = s:Match(lnum, s:falcon_indent_keywords)
if col > 0
call cursor(lnum, col)
- let ind = virtcol('.') - 1 + &sw
+ let ind = virtcol('.') - 1 + shiftwidth()
" TODO: make this better (we need to count them) (or, if a searchpair
" fails, we know that something is lacking an end and thus we indent a
" level
@@ -422,9 +422,9 @@ function FalconGetIndent(...)
" TODO: this does not take into account contrived things such as
" module Foo; class Bar; end
if s:Match(lnum, s:falcon_indent_keywords)
- let ind = msl_ind + &sw
+ let ind = msl_ind + shiftwidth()
if s:Match(lnum, s:end_end_regex)
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
return ind
endif
@@ -433,7 +433,7 @@ function FalconGetIndent(...)
" closing bracket, indent one extra level.
if s:Match(lnum, s:non_bracket_continuation_regex) && !s:Match(lnum, '^\s*\([\])}]\|end\)')
if lnum == p_lnum
- let ind = msl_ind + &sw
+ let ind = msl_ind + shiftwidth()
else
let ind = msl_ind
endif
diff --git a/runtime/indent/fortran.vim b/runtime/indent/fortran.vim
index e19a19fb1f..2ba69e86df 100644
--- a/runtime/indent/fortran.vim
+++ b/runtime/indent/fortran.vim
@@ -1,11 +1,12 @@
" Vim indent file
" Language: Fortran 2008 (and older: Fortran 2003, 95, 90, and 77)
-" Version: 0.44
-" Last Change: 2016 Jan. 26
+" Version: 47
+" Last Change: 2016 Oct. 29
" Maintainer: Ajit J. Thakkar <ajit@unb.ca>; <http://www2.unb.ca/~ajit/>
" Usage: For instructions, do :help fortran-indent from Vim
" Credits:
-" Useful suggestions were made by: Albert Oliver Serra and Takuya Fujiwara.
+" Useful suggestions were made, in chronological order, by:
+" Albert Oliver Serra, Takuya Fujiwara and Philipp Edelmann.
" Only load this indent file when no other was loaded.
if exists("b:did_indent")
@@ -99,9 +100,9 @@ function FortranGetIndent(lnum)
endif
endif
- "Add a shiftwidth to statements following if, else, else if, case,
+ "Add a shiftwidth to statements following if, else, else if, case, class,
"where, else where, forall, type, interface and associate statements
- if prevstat =~? '^\s*\(case\|else\|else\s*if\|else\s*where\)\>'
+ if prevstat =~? '^\s*\(case\|class\|else\|else\s*if\|else\s*where\)\>'
\ ||prevstat=~? '^\s*\(type\|interface\|associate\|enum\)\>'
\ ||prevstat=~?'^\s*\(\d\+\s\)\=\s*\(\a\w*\s*:\)\=\s*\(forall\|where\|block\)\>'
\ ||prevstat=~? '^\s*\(\d\+\s\)\=\s*\(\a\w*\s*:\)\=\s*if\>'
@@ -121,7 +122,8 @@ function FortranGetIndent(lnum)
let prefix='\(\(pure\|impure\|elemental\|recursive\)\s\+\)\{,2}'
let type='\(\(integer\|real\|double\s\+precision\|complex\|logical'
\.'\|character\|type\|class\)\s*\S*\s\+\)\='
- if prevstat =~? '^\s*\(module\|contains\|program\)\>'
+ if prevstat =~? '^\s*\(contains\|submodule\|program\)\>'
+ \ ||prevstat =~? '^\s*'.'module\>\(\s*\procedure\)\@!'
\ ||prevstat =~? '^\s*'.prefix.'subroutine\>'
\ ||prevstat =~? '^\s*'.prefix.type.'function\>'
\ ||prevstat =~? '^\s*'.type.prefix.'function\>'
@@ -129,16 +131,16 @@ function FortranGetIndent(lnum)
endif
if getline(v:lnum) =~? '^\s*contains\>'
\ ||getline(v:lnum)=~? '^\s*end\s*'
- \ .'\(function\|subroutine\|module\|program\)\>'
+ \ .'\(function\|subroutine\|module\|submodule\|program\)\>'
let ind = ind - shiftwidth()
endif
endif
- "Subtract a shiftwidth from else, else if, elsewhere, case, end if,
+ "Subtract a shiftwidth from else, else if, elsewhere, case, class, end if,
" end where, end select, end forall, end interface, end associate,
- " end enum, and end type statements
+ " end enum, end type, end block and end type statements
if getline(v:lnum) =~? '^\s*\(\d\+\s\)\=\s*'
- \. '\(else\|else\s*if\|else\s*where\|case\|'
+ \. '\(else\|else\s*if\|else\s*where\|case\|class\|'
\. 'end\s*\(if\|where\|select\|interface\|'
\. 'type\|forall\|associate\|enum\|block\)\)\>'
let ind = ind - shiftwidth()
@@ -152,9 +154,6 @@ function FortranGetIndent(lnum)
if prevstat =~ '&\s*$' && prev2stat !~ '&\s*$'
let ind = ind + shiftwidth()
endif
- if prevstat =~ '&\s*$' && prevstat =~ '\<else\s*if\>'
- let ind = ind - shiftwidth()
- endif
"Line after last continuation line
if prevstat !~ '&\s*$' && prev2stat =~ '&\s*$' && prevstat !~? '\<then\>'
let ind = ind - shiftwidth()
diff --git a/runtime/indent/framescript.vim b/runtime/indent/framescript.vim
index 49ff92a81d..f9a274eab6 100644
--- a/runtime/indent/framescript.vim
+++ b/runtime/indent/framescript.vim
@@ -1,7 +1,7 @@
" Vim indent file
-" Language: FrameScript
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-07-19
+" Language: FrameScript
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-19
if exists("b:did_indent")
finish
@@ -30,11 +30,11 @@ function GetFrameScriptIndent()
let ind = indent(lnum)
if getline(lnum) =~? '^\s*\%(If\|Loop\|Sub\)'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
if getline(v:lnum) =~? '^\s*\%(Else\|End\%(If\|Loop\|Sub\)\)'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
return ind
diff --git a/runtime/indent/gitconfig.vim b/runtime/indent/gitconfig.vim
index 7d5d44b779..6a670ee271 100644
--- a/runtime/indent/gitconfig.vim
+++ b/runtime/indent/gitconfig.vim
@@ -1,7 +1,7 @@
" Vim indent file
" Language: git config file
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
-" Last Change: 2013 May 30
+" Last Change: 2017 Jun 13
if exists("b:did_indent")
finish
@@ -20,17 +20,18 @@ if exists("*GetGitconfigIndent")
endif
function! GetGitconfigIndent()
+ let sw = shiftwidth()
let line = getline(prevnonblank(v:lnum-1))
let cline = getline(v:lnum)
if line =~ '\\\@<!\%(\\\\\)*\\$'
" odd number of slashes, in a line continuation
- return 2 * &sw
+ return 2 * sw
elseif cline =~ '^\s*\['
return 0
elseif cline =~ '^\s*\a'
- return &sw
+ return sw
elseif cline == '' && line =~ '^\['
- return &sw
+ return sw
else
return -1
endif
diff --git a/runtime/indent/gitolite.vim b/runtime/indent/gitolite.vim
index 33b7c9f312..b36f30a494 100644
--- a/runtime/indent/gitolite.vim
+++ b/runtime/indent/gitolite.vim
@@ -1,8 +1,10 @@
" Vim indent file
" Language: gitolite configuration
-" URL: https://github.com/tmatilai/gitolite.vim
-" Maintainer: Teemu Matilainen <teemu.matilainen@iki.fi>
-" Last Change: 2011-12-24
+" URL: https://github.com/sitaramc/gitolite/blob/master/contrib/vim/indent/gitolite.vim
+" (https://raw.githubusercontent.com/sitaramc/gitolite/master/contrib/vim/indent/gitolite.vim)
+" Maintainer: Sitaram Chamarty <sitaramc@gmail.com>
+" (former Maintainer: Teemu Matilainen <teemu.matilainen@iki.fi>)
+" Last Change: 2017 Oct 05
if exists("b:did_indent")
finish
@@ -27,11 +29,13 @@ function! GetGitoliteIndent()
let cline = getline(v:lnum)
if cline =~ '^\s*\(C\|R\|RW\|RW+\|RWC\|RW+C\|RWD\|RW+D\|RWCD\|RW+CD\|-\)[ \t=]'
- return &sw
+ return shiftwidth()
elseif cline =~ '^\s*config\s'
- return &sw
+ return shiftwidth()
+ elseif cline =~ '^\s*option\s'
+ return shiftwidth()
elseif pline =~ '^\s*repo\s' && cline =~ '^\s*\(#.*\)\?$'
- return &sw
+ return shiftwidth()
elseif cline =~ '^\s*#'
return indent(prevln)
elseif cline =~ '^\s*$'
diff --git a/runtime/indent/go.vim b/runtime/indent/go.vim
index 412ac871c4..bf9ff75e6c 100644
--- a/runtime/indent/go.vim
+++ b/runtime/indent/go.vim
@@ -1,7 +1,7 @@
" Vim indent file
" Language: Go
" Maintainer: David Barnett (https://github.com/google/vim-ft-go)
-" Last Change: 2014 Aug 16
+" Last Change: 2017 Jun 13
"
" TODO:
" - function invocations split across lines
@@ -23,18 +23,6 @@ if exists('*GoIndent')
finish
endif
-" The shiftwidth() function is relatively new.
-" Don't require it to exist.
-if exists('*shiftwidth')
- function s:sw() abort
- return shiftwidth()
- endfunction
-else
- function s:sw() abort
- return &shiftwidth
- endfunction
-endif
-
function! GoIndent(lnum)
let l:prevlnum = prevnonblank(a:lnum-1)
if l:prevlnum == 0
@@ -51,17 +39,17 @@ function! GoIndent(lnum)
if l:prevl =~ '[({]\s*$'
" previous line opened a block
- let l:ind += s:sw()
+ let l:ind += shiftwidth()
endif
if l:prevl =~# '^\s*\(case .*\|default\):$'
" previous line is part of a switch statement
- let l:ind += s:sw()
+ let l:ind += shiftwidth()
endif
" TODO: handle if the previous line is a label.
if l:thisl =~ '^\s*[)}]'
" this line closed a block
- let l:ind -= s:sw()
+ let l:ind -= shiftwidth()
endif
" Colons are tricky.
@@ -69,7 +57,7 @@ function! GoIndent(lnum)
" We ignore trying to deal with jump labels because (a) they're rare, and
" (b) they're hard to disambiguate from a composite literal key.
if l:thisl =~# '^\s*\(case .*\|default\):$'
- let l:ind -= s:sw()
+ let l:ind -= shiftwidth()
endif
return l:ind
diff --git a/runtime/indent/haml.vim b/runtime/indent/haml.vim
index c47a8a59c7..e6416e6f53 100644
--- a/runtime/indent/haml.vim
+++ b/runtime/indent/haml.vim
@@ -1,7 +1,7 @@
" Vim indent file
" Language: Haml
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
-" Last Change: 2013 May 30
+" Last Change: 2017 Jun 13
if exists("b:did_indent")
finish
@@ -37,10 +37,11 @@ function! GetHamlIndent()
let line = substitute(line,'^\s\+','','')
let indent = indent(lnum)
let cindent = indent(v:lnum)
+ let sw = shiftwidth()
if cline =~# '\v^-\s*%(elsif|else|when)>'
- let indent = cindent < indent ? cindent : indent - &sw
+ let indent = cindent < indent ? cindent : indent - sw
endif
- let increase = indent + &sw
+ let increase = indent + sw
if indent == indent(lnum)
let indent = cindent <= indent ? -1 : increase
endif
diff --git a/runtime/indent/hamster.vim b/runtime/indent/hamster.vim
index 93e7db486e..b27a173924 100644
--- a/runtime/indent/hamster.vim
+++ b/runtime/indent/hamster.vim
@@ -27,13 +27,13 @@ function HamGetIndent(lnum)
" Add a shiftwidth to statements following if, else, elseif,
" case, select, default, do, until, while, for, start
if prevline =~? '^\s*\<\(if\|else\%(if\)\?\|for\|repeat\|do\|while\|sub\)\>'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
" Subtract a shiftwidth from else, elseif, end(if|while|for), until
let line = getline(v:lnum)
if line =~? '^\s*\(else\|elseif\|loop\|until\|end\%(if\|while\|for\|sub\)\)\>'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
return ind
diff --git a/runtime/indent/hog.vim b/runtime/indent/hog.vim
index 02ac7d4d1b..ece587d46f 100644
--- a/runtime/indent/hog.vim
+++ b/runtime/indent/hog.vim
@@ -47,7 +47,7 @@ function GetHogIndent()
" Continuation of a line that wasn't indented
let prevline = getline(prevlnum)
if prevline =~ '^\k\+.*\\\s*$'
- return &sw
+ return shiftwidth()
endif
" Continuation of a line that was indented
@@ -58,13 +58,13 @@ function GetHogIndent()
" Indent the next line if previous line contained a start of a block
" definition ('{' or '(').
if prevline =~ '^\k\+[^#]*{}\@!\s*$' " TODO || prevline =~ '^\k\+[^#]*()\@!\s*$'
- return &sw
+ return shiftwidth()
endif
" Match inside of a block
if s:IsInBlock(v:lnum)
if prevline =~ "^\k\+.*$"
- return &sw
+ return shiftwidth()
else
return indent(prevlnum)
endif
diff --git a/runtime/indent/html.vim b/runtime/indent/html.vim
index 8aaf82e21f..6c866594c5 100644
--- a/runtime/indent/html.vim
+++ b/runtime/indent/html.vim
@@ -2,7 +2,7 @@
" Header: "{{{
" Maintainer: Bram Moolenaar
" Original Author: Andy Wokula <anwoku@yahoo.de>
-" Last Change: 2015 Sep 25
+" Last Change: 2018 Mar 28
" Version: 1.0
" Description: HTML indent script with cached state for faster indenting on a
" range of lines.
@@ -25,27 +25,22 @@
if exists("b:did_indent") "{{{
finish
endif
+
+" Load the Javascript indent script first, it defines GetJavascriptIndent().
+" Undo the rest.
+" Load base python indent.
+if !exists('*GetJavascriptIndent')
+ runtime! indent/javascript.vim
+endif
let b:did_indent = 1
setlocal indentexpr=HtmlIndent()
setlocal indentkeys=o,O,<Return>,<>>,{,},!^F
-" "j1" is included to make cindent() work better with Javascript.
-setlocal cino=j1
-" "J1" should be included, but it doen't work properly before 7.4.355.
-if has("patch-7.4.355")
- setlocal cino+=J1
-endif
-" Before patch 7.4.355 indenting after "(function() {" does not work well, add
-" )2 to limit paren search.
-if !has("patch-7.4.355")
- setlocal cino+=)2
-endif
-
" Needed for % to work when finding start/end of a tag.
setlocal matchpairs+=<:>
-let b:undo_indent = "setlocal inde< indk< cino<"
+let b:undo_indent = "setlocal inde< indk<"
" b:hi_indent keeps state to speed up indenting consecutive lines.
let b:hi_indent = {"lnum": -1}
@@ -56,20 +51,14 @@ if exists("*HtmlIndent") && !exists('g:force_reload_html')
finish
endif
-" shiftwidth() exists since patch 7.3.694
-if exists('*shiftwidth')
- let s:ShiftWidth = function('shiftwidth')
-else
- func! s:ShiftWidth()
- return &shiftwidth
- endfunc
-endif
-
" Allow for line continuation below.
let s:cpo_save = &cpo
set cpo-=C
"}}}
+" Pattern to match the name of a tag, including custom elements.
+let s:tagname = '\w\+\(-\w\+\)*'
+
" Check and process settings from b:html_indent and g:html_indent... variables.
" Prefer using buffer-local settings over global settings, so that there can
" be defaults for all HTML files and exceptions for specific types of HTML
@@ -128,7 +117,7 @@ func! HtmlIndent_CheckUserSettings()
let indone = {"zero": 0
\,"auto": "indent(prevnonblank(v:lnum-1))"
- \,"inc": "b:hi_indent.blocktagind + s:ShiftWidth()"}
+ \,"inc": "b:hi_indent.blocktagind + shiftwidth()"}
let script1 = ''
if exists("b:html_indent_script1")
@@ -227,7 +216,8 @@ endfunc "}}}
" Add known tag pairs.
" Self-closing tags and tags that are sometimes {{{
" self-closing (e.g., <p>) are not here (when encountering </p> we can find
-" the matching <p>, but not the other way around).
+" the matching <p>, but not the other way around). Known self-closing tags:
+" 'p', 'img', 'source'.
" Old HTML tags:
call s:AddITags(s:indent_tags, [
\ 'a', 'abbr', 'acronym', 'address', 'b', 'bdo', 'big',
@@ -240,13 +230,13 @@ call s:AddITags(s:indent_tags, [
\ 'sup', 'table', 'textarea', 'title', 'tt', 'u', 'ul', 'var', 'th', 'td',
\ 'tr', 'tbody', 'tfoot', 'thead'])
-" Tags added 2011 Sep 09 (especially HTML5 tags):
+" New HTML5 elements:
call s:AddITags(s:indent_tags, [
\ 'area', 'article', 'aside', 'audio', 'bdi', 'canvas',
- \ 'command', 'datalist', 'details', 'embed', 'figure', 'footer',
- \ 'header', 'group', 'keygen', 'mark', 'math', 'meter', 'nav', 'output',
- \ 'progress', 'ruby', 'section', 'svg', 'texture', 'time', 'video',
- \ 'wbr', 'text'])
+ \ 'command', 'data', 'datalist', 'details', 'embed', 'figcaption',
+ \ 'figure', 'footer', 'header', 'keygen', 'main', 'mark', 'meter',
+ \ 'nav', 'output', 'picture', 'progress', 'rp', 'rt', 'ruby', 'section',
+ \ 'summary', 'svg', 'time', 'track', 'video', 'wbr'])
" Tags added for web components:
call s:AddITags(s:indent_tags, [
@@ -294,7 +284,7 @@ func! s:CountITags(text)
let s:nextrel = 0 " relative indent steps for next line [unit &sw]:
let s:block = 0 " assume starting outside of a block
let s:countonly = 1 " don't change state
- call substitute(a:text, '<\zs/\=\w\+\(-\w\+\)*\>\|<!--\[\|\[endif\]-->\|<!--\|-->', '\=s:CheckTag(submatch(0))', 'g')
+ call substitute(a:text, '<\zs/\=' . s:tagname . '\>\|<!--\[\|\[endif\]-->\|<!--\|-->', '\=s:CheckTag(submatch(0))', 'g')
let s:countonly = 0
endfunc "}}}
@@ -306,7 +296,7 @@ func! s:CountTagsAndState(text)
let s:nextrel = 0 " relative indent steps for next line [unit &sw]:
let s:block = b:hi_newstate.block
- let tmp = substitute(a:text, '<\zs/\=\w\+\(-\w\+\)*\>\|<!--\[\|\[endif\]-->\|<!--\|-->', '\=s:CheckTag(submatch(0))', 'g')
+ let tmp = substitute(a:text, '<\zs/\=' . s:tagname . '\>\|<!--\[\|\[endif\]-->\|<!--\|-->', '\=s:CheckTag(submatch(0))', 'g')
if s:block == 3
let b:hi_newstate.scripttype = s:GetScriptType(matchstr(tmp, '\C.*<SCRIPT\>\zs[^>]*'))
endif
@@ -363,7 +353,7 @@ func! s:CheckBlockTag(blocktag, ind)
endif
let b:hi_newstate.blocklnr = v:lnum
" save allover indent for the endtag
- let b:hi_newstate.blocktagind = b:hi_indent.baseindent + (s:nextrel + s:curind) * s:ShiftWidth()
+ let b:hi_newstate.blocktagind = b:hi_indent.baseindent + (s:nextrel + s:curind) * shiftwidth()
if a:ind == 3
return "SCRIPT" " all except this must be lowercase
" line is to be checked again for the type attribute
@@ -485,7 +475,7 @@ func! s:FreshState(lnum)
let state.blocklnr = stopline
" check preceding tags in the line:
call s:CountITags(tagline[: stopcol-2])
- let state.blocktagind = indent(stopline) + (s:curind + s:nextrel) * s:ShiftWidth()
+ let state.blocktagind = indent(stopline) + (s:curind + s:nextrel) * shiftwidth()
return state
elseif stopline == state.lnum
" handle special case: previous line (= state.lnum) contains a
@@ -495,7 +485,7 @@ func! s:FreshState(lnum)
if !swendtag
let [bline, bcol] = searchpos('<'.blocktag[1:].'\>', "bnW")
call s:CountITags(tolower(getline(bline)[: bcol-2]))
- let state.baseindent = indent(bline) + (s:curind + s:nextrel) * s:ShiftWidth()
+ let state.baseindent = indent(bline) + (s:curind + s:nextrel) * shiftwidth()
return state
endif
endif
@@ -516,7 +506,7 @@ func! s:FreshState(lnum)
if found == 2
let state.baseindent = b:hi_indent.baseindent
endif
- let state.blocktagind = indent(comlnum) + (s:curind + s:nextrel) * s:ShiftWidth()
+ let state.blocktagind = indent(comlnum) + (s:curind + s:nextrel) * shiftwidth()
return state
endif
@@ -535,7 +525,7 @@ func! s:FreshState(lnum)
let text = tolower(getline(comlnum)[: comcol-2])
endif
call s:CountITags(text)
- let state.baseindent = indent(comlnum) + (s:curind + s:nextrel) * s:ShiftWidth()
+ let state.baseindent = indent(comlnum) + (s:curind + s:nextrel) * shiftwidth()
" TODO check tags that follow "-->"
return state
endif
@@ -544,7 +534,7 @@ func! s:FreshState(lnum)
let swendtag = match(text, '^\s*</') >= 0
" If previous line ended in a closing tag, line up with the opening tag.
- if !swendtag && text =~ '</\w\+\s*>\s*$'
+ if !swendtag && text =~ '</' . s:tagname . '\s*>\s*$'
call cursor(state.lnum, 99999)
normal! F<
let start_lnum = HtmlIndent_FindStartTag()
@@ -555,9 +545,9 @@ func! s:FreshState(lnum)
let text = getline(start_lnum)
let swendtag = match(text, '^\s*</') >= 0
call s:CountITags(text[: col('.') - 2])
- let state.baseindent += s:nextrel * s:ShiftWidth()
+ let state.baseindent += s:nextrel * shiftwidth()
if !swendtag
- let state.baseindent += s:curind * s:ShiftWidth()
+ let state.baseindent += s:curind * shiftwidth()
endif
endif
return state
@@ -570,9 +560,9 @@ func! s:FreshState(lnum)
let text = getline(state.lnum)
let swendtag = match(text, '^\s*</') >= 0
call s:CountITags(tolower(text))
- let state.baseindent = indent(state.lnum) + s:nextrel * s:ShiftWidth()
+ let state.baseindent = indent(state.lnum) + s:nextrel * shiftwidth()
if !swendtag
- let state.baseindent += s:curind * s:ShiftWidth()
+ let state.baseindent += s:curind * shiftwidth()
endif
return state
endfunc "}}}
@@ -596,7 +586,7 @@ func! s:Alien3()
return eval(b:hi_js1indent)
endif
if b:hi_indent.scripttype == "javascript"
- return cindent(v:lnum)
+ return GetJavascriptIndent()
else
return -1
endif
@@ -651,7 +641,7 @@ func! s:CSSIndent()
" add indent after {
let brace_counts = HtmlIndent_CountBraces(prev_lnum)
- let extra = brace_counts.c_open * s:ShiftWidth()
+ let extra = brace_counts.c_open * shiftwidth()
let prev_text = getline(prev_lnum)
let below_end_brace = prev_text =~ '}\s*$'
@@ -668,22 +658,22 @@ func! s:CSSIndent()
" if the current line is not a comment or starts with @ (used by template
" systems) reduce indent if previous line is a continuation line
if !prev_hasfield && !prev_special
- let extra = -s:ShiftWidth()
+ let extra = -shiftwidth()
endif
else
let cur_hasfield = curtext =~ '^\s*[a-zA-Z0-9-]\+:'
let prev_unfinished = s:CssUnfinished(prev_text)
- if !cur_hasfield && (prev_hasfield || prev_unfinished)
+ if prev_unfinished
" Continuation line has extra indent if the previous line was not a
" continuation line.
- let extra = s:ShiftWidth()
+ let extra = shiftwidth()
" Align with @if
if prev_text =~ '^\s*@if '
let extra = 4
endif
elseif cur_hasfield && !prev_hasfield && !prev_special
" less indent below a continuation line
- let extra = -s:ShiftWidth()
+ let extra = -shiftwidth()
endif
endif
endif
@@ -704,10 +694,10 @@ func! s:CSSIndent()
if special
" do not reduce indent below @{ ... }
if extra < 0
- let extra += s:ShiftWidth()
+ let extra += shiftwidth()
endif
else
- let extra -= (brace_counts.c_close - (prev_text =~ '^\s*}')) * s:ShiftWidth()
+ let extra -= (brace_counts.c_close - (prev_text =~ '^\s*}')) * shiftwidth()
endif
endif
@@ -715,10 +705,10 @@ func! s:CSSIndent()
if extra == 0
if brace_counts.p_open > brace_counts.p_close
" previous line has more ( than ): add a shiftwidth
- let extra = s:ShiftWidth()
+ let extra = shiftwidth()
elseif brace_counts.p_open < brace_counts.p_close
" previous line has more ) than (: subtract a shiftwidth
- let extra = -s:ShiftWidth()
+ let extra = -shiftwidth()
endif
endif
@@ -726,9 +716,13 @@ func! s:CSSIndent()
endfunc "}}}
" Inside <style>: Whether a line is unfinished.
+" tag:
+" tag: blah
+" tag: blah &&
+" tag: blah ||
func! s:CssUnfinished(text)
"{{{
- return a:text =~ '\s\(||\|&&\|:\)\s*$'
+ return a:text =~ '\(||\|&&\|:\|\k\)\s*$'
endfunc "}}}
" Search back for the first unfinished line above "lnum".
@@ -749,7 +743,7 @@ func! s:CssPrevNonComment(lnum, stopline)
while 1
let ccol = match(getline(lnum), '\*/')
if ccol < 0
- " No comment end thus its something else.
+ " No comment end thus it's something else.
return lnum
endif
call cursor(lnum, ccol + 1)
@@ -821,7 +815,7 @@ func! s:Alien5()
let idx = match(prevtext, '^\s*\zs<!--')
if idx >= 0
" just below comment start, add a shiftwidth
- return idx + s:ShiftWidth()
+ return idx + shiftwidth()
endif
" Some files add 4 spaces just below a TODO line. It's difficult to detect
@@ -842,7 +836,7 @@ func! s:Alien6()
return indent(lnum)
endif
endif
- return b:hi_indent.baseindent + s:ShiftWidth()
+ return b:hi_indent.baseindent + shiftwidth()
endfunc "}}}
" When the "lnum" line ends in ">" find the line containing the matching "<".
@@ -874,7 +868,7 @@ func! HtmlIndent_FindStartTag()
" The cursor must be on or before a closing tag.
" If found, positions the cursor at the match and returns the line number.
" Otherwise returns 0.
- let tagname = matchstr(getline('.')[col('.') - 1:], '</\zs\w\+\ze')
+ let tagname = matchstr(getline('.')[col('.') - 1:], '</\zs' . s:tagname . '\ze')
let start_lnum = searchpair('<' . tagname . '\>', '', '</' . tagname . '\>', 'bW')
if start_lnum > 0
return start_lnum
@@ -890,7 +884,7 @@ func! HtmlIndent_FindTagEnd()
" a self-closing tag, to the matching ">".
" Limited to look up to b:html_indent_line_limit lines away.
let text = getline('.')
- let tagname = matchstr(text, '\w\+\|!--', col('.'))
+ let tagname = matchstr(text, s:tagname . '\|!--', col('.'))
if tagname == '!--'
call search('--\zs>')
elseif s:get_tag('/' . tagname) != 0
@@ -935,9 +929,22 @@ func! s:InsideTag(foundHtmlString)
else
let idx = match(text, '\s\zs[_a-zA-Z0-9-]\+="')
endif
+ if idx == -1
+ " try <tag attr
+ let idx = match(text, '<' . s:tagname . '\s\+\zs\w')
+ endif
+ if idx == -1
+ " after just <tag indent one level more
+ let idx = match(text, '<' . s:tagname . '$')
+ if idx >= 0
+ call cursor(lnum, idx)
+ return virtcol('.') + shiftwidth()
+ endif
+ endif
if idx > 0
- " Found the attribute. TODO: assumes spaces, no Tabs.
- return idx
+ " Found the attribute to align with.
+ call cursor(lnum, idx)
+ return virtcol('.')
endif
endwhile
return -1
@@ -952,7 +959,7 @@ func! HtmlIndent()
endif
let curtext = tolower(getline(v:lnum))
- let indentunit = s:ShiftWidth()
+ let indentunit = shiftwidth()
let b:hi_newstate = {}
let b:hi_newstate.lnum = v:lnum
@@ -1035,9 +1042,9 @@ func! HtmlIndent()
if col('.') > 2
let swendtag = match(text, '^\s*</') >= 0
call s:CountITags(text[: col('.') - 2])
- let indent += s:nextrel * s:ShiftWidth()
+ let indent += s:nextrel * shiftwidth()
if !swendtag
- let indent += s:curind * s:ShiftWidth()
+ let indent += s:curind * shiftwidth()
endif
endif
else
diff --git a/runtime/indent/idlang.vim b/runtime/indent/idlang.vim
index b4c6ae6fea..7402e8688e 100644
--- a/runtime/indent/idlang.vim
+++ b/runtime/indent/idlang.vim
@@ -1,6 +1,6 @@
" IDL (Interactive Data Language) indent file.
" Language: IDL (ft=idlang)
-" Last change: 2012 May 18
+" Last change: 2017 Jun 13
" Maintainer: Aleksandar Jelenak <ajelenak AT yahoo.com>
" Only load this indent file when no other was loaded.
@@ -34,25 +34,25 @@ function GetIdlangIndent(lnum)
" Indenting of continued lines.
if getline(pnum) =~ '\$\s*\(;.*\)\=$'
if getline(pnum2) !~ '\$\s*\(;.*\)\=$'
- let curind = curind+&sw
+ let curind = curind+shiftwidth()
endif
else
if getline(pnum2) =~ '\$\s*\(;.*\)\=$'
- let curind = curind-&sw
+ let curind = curind-shiftwidth()
endif
endif
" Indenting blocks of statements.
if getline(v:lnum) =~? '^\s*\(endif\|endelse\|endwhile\|endfor\|endrep\)\>'
if getline(pnum) =~? 'begin\>'
- elseif indent(v:lnum) > curind-&sw
- let curind = curind-&sw
+ elseif indent(v:lnum) > curind-shiftwidth()
+ let curind = curind-shiftwidth()
else
return -1
endif
elseif getline(pnum) =~? 'begin\>'
- if indent(v:lnum) < curind+&sw
- let curind = curind+&sw
+ if indent(v:lnum) < curind+shiftwidth()
+ let curind = curind+shiftwidth()
else
return -1
endif
diff --git a/runtime/indent/ishd.vim b/runtime/indent/ishd.vim
index f55f7dc79c..531244b819 100644
--- a/runtime/indent/ishd.vim
+++ b/runtime/indent/ishd.vim
@@ -50,17 +50,17 @@ fun! GetIshdIndent(lnum)
" Add
if previous_line =~ '^\s*\<\(function\|begin\|switch\|case\|default\|if.\{-}then\|else\|elseif\|while\|repeat\)\>'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
" Subtract
if this_line =~ '^\s*\<endswitch\>'
- let ind = ind - 2 * &sw
+ let ind = ind - 2 * shiftwidth()
elseif this_line =~ '^\s*\<\(begin\|end\|endif\|endwhile\|else\|elseif\|until\)\>'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
elseif this_line =~ '^\s*\<\(case\|default\)\>'
if previous_line !~ '^\s*\<switch\>'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
endif
diff --git a/runtime/indent/java.vim b/runtime/indent/java.vim
index e0aec0faef..49f8010d21 100644
--- a/runtime/indent/java.vim
+++ b/runtime/indent/java.vim
@@ -1,12 +1,14 @@
" Vim indent file
" Language: Java
" Previous Maintainer: Toby Allsopp <toby.allsopp@peace.com>
-" Current Maintainer: Hong Xu <xuhdev@gmail.com>
-" Last Change: 2012 May 18
-" Version: 1.0
+" Current Maintainer: Hong Xu <hong@topbug.net>
+" Homepage: http://www.vim.org/scripts/script.php?script_id=3899
+" https://github.com/xuhdev/indent-java.vim
+" Last Change: 2016 Mar 7
+" Version: 1.1
" License: Same as Vim.
-" Copyright (c) 2012 Hong Xu
-" Before 2012, this file is maintained by Toby Allsopp.
+" Copyright (c) 2012-2016 Hong Xu
+" Before 2012, this file was maintained by Toby Allsopp.
" Only load this indent file when no other was loaded.
if exists("b:did_indent")
@@ -29,6 +31,7 @@ let b:undo_indent = "set cin< cino< indentkeys< indentexpr<"
if exists("*GetJavaIndent")
finish
endif
+
let s:keepcpo= &cpo
set cpo&vim
@@ -70,7 +73,7 @@ function GetJavaIndent()
" If the previous line starts with '@', we should have the same indent as
" the previous one
- if getline(lnum) =~ '^\s*@\S\+\s*$'
+ if getline(lnum) =~ '^\s*@.*$'
return indent(lnum)
endif
@@ -85,9 +88,9 @@ function GetJavaIndent()
" Try to align "throws" lines for methods and "extends" and "implements" for
" classes.
- if getline(v:lnum) =~ '^\s*\(extends\|implements\)\>'
- \ && getline(lnum) !~ '^\s*\(extends\|implements\)\>'
- let theIndent = theIndent + &sw
+ if getline(v:lnum) =~ '^\s*\(throws\|extends\|implements\)\>'
+ \ && getline(lnum) !~ '^\s*\(throws\|extends\|implements\)\>'
+ let theIndent = theIndent + shiftwidth()
endif
" correct for continuation lines of "throws", "implements" and "extends"
@@ -96,27 +99,27 @@ function GetJavaIndent()
if strlen(cont_kw) > 0
let amount = strlen(cont_kw) + 1
if getline(lnum) !~ ',\s*$'
- let theIndent = theIndent - (amount + &sw)
+ let theIndent = theIndent - (amount + shiftwidth())
if theIndent < 0
let theIndent = 0
endif
elseif prev == lnum
let theIndent = theIndent + amount
if cont_kw ==# 'throws'
- let theIndent = theIndent + &sw
+ let theIndent = theIndent + shiftwidth()
endif
endif
elseif getline(prev) =~ '^\s*\(throws\|implements\|extends\)\>'
\ && (getline(prev) =~ '{\s*$'
\ || getline(v:lnum) =~ '^\s*{\s*$')
- let theIndent = theIndent - &sw
+ let theIndent = theIndent - shiftwidth()
endif
" When the line starts with a }, try aligning it with the matching {,
" skipping over "throws", "extends" and "implements" clauses.
if getline(v:lnum) =~ '^\s*}\s*\(//.*\|/\*.*\)\=$'
call cursor(v:lnum, 1)
- silent normal %
+ silent normal! %
let lnum = line('.')
if lnum < v:lnum
while lnum > 1
diff --git a/runtime/indent/javascript.vim b/runtime/indent/javascript.vim
index 21c8fff86c..f3bf96aa97 100644
--- a/runtime/indent/javascript.vim
+++ b/runtime/indent/javascript.vim
@@ -1,18 +1,480 @@
" Vim indent file
-" Language: Javascript
-" Maintainer: Going to be Darrick Wiebe
-" Last Change: 2015 Jun 09
+" Language: Javascript
+" Maintainer: Chris Paul ( https://github.com/bounceme )
+" URL: https://github.com/pangloss/vim-javascript
+" Last Change: December 4, 2017
" Only load this indent file when no other was loaded.
-if exists("b:did_indent")
- finish
+if exists('b:did_indent')
+ finish
endif
let b:did_indent = 1
-" C indenting is not too bad.
-setlocal cindent
-setlocal cinoptions+=j1,J1
-setlocal cinkeys-=0#
-setlocal cinkeys+=0]
+" Now, set up our indentation expression and keys that trigger it.
+setlocal indentexpr=GetJavascriptIndent()
+setlocal autoindent nolisp nosmartindent
+setlocal indentkeys+=0],0)
+" Testable with something like:
+" vim -eNs "+filetype plugin indent on" "+syntax on" "+set ft=javascript" \
+" "+norm! gg=G" '+%print' '+:q!' testfile.js \
+" | diff -uBZ testfile.js -
-let b:undo_indent = "setl cin<"
+let b:undo_indent = 'setlocal indentexpr< smartindent< autoindent< indentkeys<'
+
+" Only define the function once.
+if exists('*GetJavascriptIndent')
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" indent correctly if inside <script>
+" vim/vim@690afe1 for the switch from cindent
+" overridden with b:html_indent_script1
+call extend(g:,{'html_indent_script1': 'inc'},'keep')
+
+" Regex of syntax group names that are or delimit string or are comments.
+let s:bvars = {
+ \ 'syng_strcom': 'string\|comment\|regex\|special\|doc\|template\%(braces\)\@!',
+ \ 'syng_str': 'string\|template\|special' }
+" template strings may want to be excluded when editing graphql:
+" au! Filetype javascript let b:syng_str = '^\%(.*template\)\@!.*string\|special'
+" au! Filetype javascript let b:syng_strcom = '^\%(.*template\)\@!.*string\|comment\|regex\|special\|doc'
+
+function s:GetVars()
+ call extend(b:,extend(s:bvars,{'js_cache': [0,0,0]}),'keep')
+endfunction
+
+" Get shiftwidth value
+if exists('*shiftwidth')
+ function s:sw()
+ return shiftwidth()
+ endfunction
+else
+ function s:sw()
+ return &l:shiftwidth ? &l:shiftwidth : &l:tabstop
+ endfunction
+endif
+
+" Performance for forwards search(): start search at pos rather than masking
+" matches before pos.
+let s:z = has('patch-7.4.984') ? 'z' : ''
+
+" Expression used to check whether we should skip a match with searchpair().
+let s:skip_expr = "s:SynAt(line('.'),col('.')) =~? b:syng_strcom"
+let s:in_comm = s:skip_expr[:-14] . "'comment\\|doc'"
+
+let s:rel = has('reltime')
+" searchpair() wrapper
+if s:rel
+ function s:GetPair(start,end,flags,skip)
+ return searchpair('\m'.a:start,'','\m'.a:end,a:flags,a:skip,s:l1,a:skip ==# 's:SkipFunc()' ? 2000 : 200)
+ endfunction
+else
+ function s:GetPair(start,end,flags,skip)
+ return searchpair('\m'.a:start,'','\m'.a:end,a:flags,a:skip,s:l1)
+ endfunction
+endif
+
+function s:SynAt(l,c)
+ let byte = line2byte(a:l) + a:c - 1
+ let pos = index(s:synid_cache[0], byte)
+ if pos == -1
+ let s:synid_cache[:] += [[byte], [synIDattr(synID(a:l, a:c, 0), 'name')]]
+ endif
+ return s:synid_cache[1][pos]
+endfunction
+
+function s:ParseCino(f)
+ let [divider, n, cstr] = [0] + matchlist(&cino,
+ \ '\%(.*,\)\=\%(\%d'.char2nr(a:f).'\(-\)\=\([.s0-9]*\)\)\=')[1:2]
+ for c in split(cstr,'\zs')
+ if c == '.' && !divider
+ let divider = 1
+ elseif c ==# 's'
+ if n !~ '\d'
+ return n . s:sw() + 0
+ endif
+ let n = str2nr(n) * s:sw()
+ break
+ else
+ let [n, divider] .= [c, 0]
+ endif
+ endfor
+ return str2nr(n) / max([str2nr(divider),1])
+endfunction
+
+" Optimized {skip} expr, only callable from the search loop which
+" GetJavascriptIndent does to find the containing [[{(] (side-effects)
+function s:SkipFunc()
+ if s:top_col == 1
+ throw 'out of bounds'
+ elseif s:check_in
+ if eval(s:skip_expr)
+ return 1
+ endif
+ let s:check_in = 0
+ elseif getline('.') =~ '\%<'.col('.').'c\/.\{-}\/\|\%>'.col('.').'c[''"]\|\\$'
+ if eval(s:skip_expr)
+ return 1
+ endif
+ elseif search('\m`\|\${\|\*\/','nW'.s:z,s:looksyn)
+ if eval(s:skip_expr)
+ let s:check_in = 1
+ return 1
+ endif
+ else
+ let s:synid_cache[:] += [[line2byte('.') + col('.') - 1], ['']]
+ endif
+ let [s:looksyn, s:top_col] = getpos('.')[1:2]
+endfunction
+
+function s:AlternatePair()
+ let [pat, l:for] = ['[][(){};]', 2]
+ while s:SearchLoop(pat,'bW','s:SkipFunc()')
+ if s:LookingAt() == ';'
+ if !l:for
+ if s:GetPair('{','}','bW','s:SkipFunc()')
+ return
+ endif
+ break
+ else
+ let [pat, l:for] = ['[{}();]', l:for - 1]
+ endif
+ else
+ let idx = stridx('])}',s:LookingAt())
+ if idx == -1
+ return
+ elseif !s:GetPair(['\[','(','{'][idx],'])}'[idx],'bW','s:SkipFunc()')
+ break
+ endif
+ endif
+ endwhile
+ throw 'out of bounds'
+endfunction
+
+function s:Nat(int)
+ return a:int * (a:int > 0)
+endfunction
+
+function s:LookingAt()
+ return getline('.')[col('.')-1]
+endfunction
+
+function s:Token()
+ return s:LookingAt() =~ '\k' ? expand('<cword>') : s:LookingAt()
+endfunction
+
+function s:PreviousToken(...)
+ let [l:pos, tok] = [getpos('.'), '']
+ if search('\m\k\{1,}\|\S','ebW')
+ if getline('.')[col('.')-2:col('.')-1] == '*/'
+ if eval(s:in_comm) && !s:SearchLoop('\S\ze\_s*\/[/*]','bW',s:in_comm)
+ call setpos('.',l:pos)
+ else
+ let tok = s:Token()
+ endif
+ else
+ let two = a:0 || line('.') != l:pos[1] ? strridx(getline('.')[:col('.')],'//') + 1 : 0
+ if two && eval(s:in_comm)
+ call cursor(0,two)
+ let tok = s:PreviousToken(1)
+ if tok is ''
+ call setpos('.',l:pos)
+ endif
+ else
+ let tok = s:Token()
+ endif
+ endif
+ endif
+ return tok
+endfunction
+
+function s:Pure(f,...)
+ return eval("[call(a:f,a:000),cursor(a:firstline,".col('.').")][0]")
+endfunction
+
+function s:SearchLoop(pat,flags,expr)
+ return s:GetPair(a:pat,'\_$.',a:flags,a:expr)
+endfunction
+
+function s:ExprCol()
+ if getline('.')[col('.')-2] == ':'
+ return 1
+ endif
+ let bal = 0
+ while s:SearchLoop('[{}?:]','bW',s:skip_expr)
+ if s:LookingAt() == ':'
+ if getline('.')[col('.')-2] == ':'
+ call cursor(0,col('.')-1)
+ continue
+ endif
+ let bal -= 1
+ elseif s:LookingAt() == '?'
+ if getline('.')[col('.'):col('.')+1] =~ '^\.\d\@!'
+ continue
+ elseif !bal
+ return 1
+ endif
+ let bal += 1
+ elseif s:LookingAt() == '{'
+ return !s:IsBlock()
+ elseif !s:GetPair('{','}','bW',s:skip_expr)
+ break
+ endif
+ endwhile
+endfunction
+
+" configurable regexes that define continuation lines, not including (, {, or [.
+let s:opfirst = '^' . get(g:,'javascript_opfirst',
+ \ '\C\%([<>=,.?^%|/&]\|\([-:+]\)\1\@!\|\*\+\|!=\|in\%(stanceof\)\=\>\)')
+let s:continuation = get(g:,'javascript_continuation',
+ \ '\C\%([<=,.~!?/*^%|&:]\|+\@<!+\|-\@<!-\|=\@<!>\|\<\%(typeof\|new\|delete\|void\|in\|instanceof\|await\)\)') . '$'
+
+function s:Continues()
+ let tok = matchstr(strpart(getline('.'),col('.')-15,15),s:continuation)
+ if tok =~ '[a-z:]'
+ return tok == ':' ? s:ExprCol() : s:PreviousToken() != '.'
+ elseif tok !~ '[/>]'
+ return tok isnot ''
+ endif
+ return s:SynAt(line('.'),col('.')) !~? (tok == '>' ? 'jsflow\|^html' : 'regex')
+endfunction
+
+" Check if line 'lnum' has a balanced amount of parentheses.
+function s:Balanced(lnum,line)
+ let l:open = 0
+ let pos = match(a:line, '[][(){}]')
+ while pos != -1
+ if s:SynAt(a:lnum,pos + 1) !~? b:syng_strcom
+ let l:open += match(' ' . a:line[pos],'[[({]')
+ if l:open < 0
+ return
+ endif
+ endif
+ let pos = match(a:line, !l:open ? '[][(){}]' : '()' =~ a:line[pos] ?
+ \ '[()]' : '{}' =~ a:line[pos] ? '[{}]' : '[][]', pos + 1)
+ endwhile
+ return !l:open
+endfunction
+
+function s:OneScope()
+ if s:LookingAt() == ')' && s:GetPair('(', ')', 'bW', s:skip_expr)
+ let tok = s:PreviousToken()
+ return (count(split('for if let while with'),tok) ||
+ \ tok =~# '^await$\|^each$' && s:PreviousToken() ==# 'for') &&
+ \ s:Pure('s:PreviousToken') != '.' && !(tok == 'while' && s:DoWhile())
+ elseif s:Token() =~# '^else$\|^do$'
+ return s:Pure('s:PreviousToken') != '.'
+ elseif strpart(getline('.'),col('.')-2,2) == '=>'
+ call cursor(0,col('.')-1)
+ if s:PreviousToken() == ')'
+ return s:GetPair('(', ')', 'bW', s:skip_expr)
+ endif
+ return 1
+ endif
+endfunction
+
+function s:DoWhile()
+ let cpos = searchpos('\m\<','cbW')
+ while s:SearchLoop('\C[{}]\|\<\%(do\|while\)\>','bW',s:skip_expr)
+ if s:LookingAt() =~ '\a'
+ if s:Pure('s:IsBlock')
+ if s:LookingAt() ==# 'd'
+ return 1
+ endif
+ break
+ endif
+ elseif s:LookingAt() != '}' || !s:GetPair('{','}','bW',s:skip_expr)
+ break
+ endif
+ endwhile
+ call call('cursor',cpos)
+endfunction
+
+" returns total offset from braceless contexts. 'num' is the lineNr which
+" encloses the entire context, 'cont' if whether a:firstline is a continued
+" expression, which could have started in a braceless context
+function s:IsContOne(cont)
+ let [l:num, b_l] = [b:js_cache[1] + !b:js_cache[1], 0]
+ let pind = b:js_cache[1] ? indent(b:js_cache[1]) + s:sw() : 0
+ let ind = indent('.') + !a:cont
+ while line('.') > l:num && ind > pind || line('.') == l:num
+ if indent('.') < ind && s:OneScope()
+ let b_l += 1
+ elseif !a:cont || b_l || ind < indent(a:firstline)
+ break
+ else
+ call cursor(0,1)
+ endif
+ let ind = min([ind, indent('.')])
+ if s:PreviousToken() is ''
+ break
+ endif
+ endwhile
+ return b_l
+endfunction
+
+function s:IsSwitch()
+ call call('cursor',b:js_cache[1:])
+ return search('\m\C\%#.\_s*\%(\%(\/\/.*\_$\|\/\*\_.\{-}\*\/\)\@>\_s*\)*\%(case\|default\)\>','nWc'.s:z)
+endfunction
+
+" https://github.com/sweet-js/sweet.js/wiki/design#give-lookbehind-to-the-reader
+function s:IsBlock()
+ let tok = s:PreviousToken()
+ if join(s:stack) =~? 'xml\|jsx' && s:SynAt(line('.'),col('.')-1) =~? 'xml\|jsx'
+ let s:in_jsx = 1
+ return tok != '{'
+ elseif tok =~ '\k'
+ if tok ==# 'type'
+ return s:Pure('eval',"s:PreviousToken() !~# '^\\%(im\\|ex\\)port$' || s:PreviousToken() == '.'")
+ elseif tok ==# 'of'
+ return s:Pure('eval',"!s:GetPair('[[({]','[])}]','bW',s:skip_expr) || s:LookingAt() != '(' ||"
+ \ ."s:{s:PreviousToken() ==# 'await' ? 'Previous' : ''}Token() !=# 'for' || s:PreviousToken() == '.'")
+ endif
+ return index(split('return const let import export extends yield default delete var await void typeof throw case new in instanceof')
+ \ ,tok) < (line('.') != a:firstline) || s:Pure('s:PreviousToken') == '.'
+ elseif tok == '>'
+ return getline('.')[col('.')-2] == '=' || s:SynAt(line('.'),col('.')) =~? 'jsflow\|^html'
+ elseif tok == '*'
+ return s:Pure('s:PreviousToken') == ':'
+ elseif tok == ':'
+ return s:Pure('eval',"s:PreviousToken() =~ '^\\K\\k*$' && !s:ExprCol()")
+ elseif tok == '/'
+ return s:SynAt(line('.'),col('.')) =~? 'regex'
+ elseif tok !~ '[=~!<,.?^%|&([]'
+ return tok !~ '[-+]' || line('.') != a:firstline && getline('.')[col('.')-2] == tok
+ endif
+endfunction
+
+function GetJavascriptIndent()
+ call s:GetVars()
+ let s:synid_cache = [[],[]]
+ let l:line = getline(v:lnum)
+ " use synstack as it validates syn state and works in an empty line
+ let s:stack = [''] + map(synstack(v:lnum,1),"synIDattr(v:val,'name')")
+
+ " start with strings,comments,etc.
+ if s:stack[-1] =~? 'comment\|doc'
+ if l:line =~ '^\s*\*'
+ return cindent(v:lnum)
+ elseif l:line !~ '^\s*\/[/*]'
+ return -1
+ endif
+ elseif s:stack[-1] =~? b:syng_str
+ if b:js_cache[0] == v:lnum - 1 && s:Balanced(v:lnum-1,getline(v:lnum-1))
+ let b:js_cache[0] = v:lnum
+ endif
+ return -1
+ endif
+
+ let s:l1 = max([0,prevnonblank(v:lnum) - (s:rel ? 2000 : 1000),
+ \ get(get(b:,'hi_indent',{}),'blocklnr')])
+ call cursor(v:lnum,1)
+ if s:PreviousToken() is ''
+ return
+ endif
+ let [l:lnum, pline] = [line('.'), getline('.')[:col('.')-1]]
+
+ let l:line = substitute(l:line,'^\s*','','')
+ let l:line_raw = l:line
+ if l:line[:1] == '/*'
+ let l:line = substitute(l:line,'^\%(\/\*.\{-}\*\/\s*\)*','','')
+ endif
+ if l:line =~ '^\/[/*]'
+ let l:line = ''
+ endif
+
+ " the containing paren, bracket, or curly. Many hacks for performance
+ call cursor(v:lnum,1)
+ let idx = index([']',')','}'],l:line[0])
+ if b:js_cache[0] > l:lnum && b:js_cache[0] < v:lnum ||
+ \ b:js_cache[0] == l:lnum && s:Balanced(l:lnum,pline)
+ call call('cursor',b:js_cache[1:])
+ else
+ let [s:looksyn, s:top_col, s:check_in, s:l1] = [v:lnum - 1,0,0,
+ \ max([s:l1, &smc ? search('\m^.\{'.&smc.',}','nbW',s:l1 + 1) + 1 : 0])]
+ try
+ if idx != -1
+ call s:GetPair(['\[','(','{'][idx],'])}'[idx],'bW','s:SkipFunc()')
+ elseif getline(v:lnum) !~ '^\S' && s:stack[-1] =~? 'block\|^jsobject$'
+ call s:GetPair('{','}','bW','s:SkipFunc()')
+ else
+ call s:AlternatePair()
+ endif
+ catch /^\Cout of bounds$/
+ call cursor(v:lnum,1)
+ endtry
+ let b:js_cache[1:] = line('.') == v:lnum ? [0,0] : getpos('.')[1:2]
+ endif
+
+ let [b:js_cache[0], num] = [v:lnum, b:js_cache[1]]
+
+ let [num_ind, is_op, b_l, l:switch_offset, s:in_jsx] = [s:Nat(indent(num)),0,0,0,0]
+ if !num || s:LookingAt() == '{' && s:IsBlock()
+ let ilnum = line('.')
+ if num && !s:in_jsx && s:LookingAt() == ')' && s:GetPair('(',')','bW',s:skip_expr)
+ if ilnum == num
+ let [num, num_ind] = [line('.'), indent('.')]
+ endif
+ if idx == -1 && s:PreviousToken() ==# 'switch' && s:IsSwitch()
+ let l:switch_offset = &cino !~ ':' ? s:sw() : s:ParseCino(':')
+ if pline[-1:] != '.' && l:line =~# '^\%(default\|case\)\>'
+ return s:Nat(num_ind + l:switch_offset)
+ elseif &cino =~ '='
+ let l:case_offset = s:ParseCino('=')
+ endif
+ endif
+ endif
+ if idx == -1 && pline[-1:] !~ '[{;]'
+ call cursor(l:lnum, len(pline))
+ let sol = matchstr(l:line,s:opfirst)
+ if sol is '' || sol == '/' && s:SynAt(v:lnum,
+ \ 1 + len(getline(v:lnum)) - len(l:line)) =~? 'regex'
+ if s:Continues()
+ let is_op = s:sw()
+ endif
+ elseif num && sol =~# '^\%(in\%(stanceof\)\=\|\*\)$' &&
+ \ s:LookingAt() == '}' && s:GetPair('{','}','bW',s:skip_expr) &&
+ \ s:PreviousToken() == ')' && s:GetPair('(',')','bW',s:skip_expr) &&
+ \ (s:PreviousToken() == ']' || s:LookingAt() =~ '\k' &&
+ \ s:{s:PreviousToken() == '*' ? 'Previous' : ''}Token() !=# 'function')
+ return num_ind + s:sw()
+ else
+ let is_op = s:sw()
+ endif
+ call cursor(l:lnum, len(pline))
+ let b_l = s:Nat(s:IsContOne(is_op) - (!is_op && l:line =~ '^{')) * s:sw()
+ endif
+ elseif idx.s:LookingAt().&cino =~ '^-1(.*(' && (search('\m\S','nbW',num) || s:ParseCino('U'))
+ let pval = s:ParseCino('(')
+ if !pval
+ let [Wval, vcol] = [s:ParseCino('W'), virtcol('.')]
+ if search('\m\S','W',num)
+ return s:ParseCino('w') ? vcol : virtcol('.')-1
+ endif
+ return Wval ? s:Nat(num_ind + Wval) : vcol
+ endif
+ return s:Nat(num_ind + pval + searchpair('\m(','','\m)','nbrmW',s:skip_expr,num) * s:sw())
+ endif
+
+ " main return
+ if l:line =~ '^[])}]\|^|}'
+ if l:line_raw[0] == ')'
+ if s:ParseCino('M')
+ return indent(l:lnum)
+ elseif num && &cino =~# 'm' && !s:ParseCino('m')
+ return virtcol('.') - 1
+ endif
+ endif
+ return num_ind
+ elseif num
+ return s:Nat(num_ind + get(l:,'case_offset',s:sw()) + l:switch_offset + b_l + is_op)
+ endif
+ return b_l + is_op
+endfunction
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/indent/json.vim b/runtime/indent/json.vim
index 649f2b8aa5..b66a03d81b 100644
--- a/runtime/indent/json.vim
+++ b/runtime/indent/json.vim
@@ -1,7 +1,7 @@
" Vim indent file
" Language: JSON
" Mantainer: Eli Parra <eli@elzr.com> https://github.com/elzr/vim-json
-" Last Change: 2014 Aug 29
+" Last Change: 2017 Jun 13
" https://github.com/jakar/vim-json/commit/20b650e22aa750c4ab6a66aa646bdd95d7cd548a#diff-e81fc111b2052e306d126bd9989f7b7c
" Original Author: Rogerz Zhang <rogerz.zhang at gmail.com> http://github.com/rogerz/vim-json
" Acknowledgement: Based off of vim-javascript maintained by Darrick Wiebe
@@ -141,7 +141,7 @@ function GetJSONIndent()
" If the previous line ended with a block opening, add a level of indent.
" if s:Match(lnum, s:block_regex)
- " return indent(lnum) + &sw
+ " return indent(lnum) + shiftwidth()
" endif
" If the previous line contained an opening bracket, and we are still in it,
@@ -149,7 +149,7 @@ function GetJSONIndent()
if line =~ '[[({]'
let counts = s:LineHasOpeningBrackets(lnum)
if counts[0] == '1' || counts[1] == '1' || counts[2] == '1'
- return ind + &sw
+ return ind + shiftwidth()
else
call cursor(v:lnum, vcol)
end
diff --git a/runtime/indent/ld.vim b/runtime/indent/ld.vim
index eccf42b2b4..a72a3a9548 100644
--- a/runtime/indent/ld.vim
+++ b/runtime/indent/ld.vim
@@ -1,7 +1,7 @@
" Vim indent file
-" Language: ld(1) script
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-12-20
+" Language: ld(1) script
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-20
if exists("b:did_indent")
finish
@@ -65,7 +65,7 @@ function GetLDIndent()
if line =~ '^\s*\*'
return cindent(v:lnum)
elseif line =~ '^\s*}'
- return indent(v:lnum) - &sw
+ return indent(v:lnum) - shiftwidth()
endif
let pnum = s:prevnonblanknoncomment(v:lnum - 1)
@@ -73,11 +73,11 @@ function GetLDIndent()
return 0
endif
- let ind = indent(pnum) + s:count_braces(pnum, 1) * &sw
+ let ind = indent(pnum) + s:count_braces(pnum, 1) * shiftwidth()
let pline = getline(pnum)
if pline =~ '}\s*$'
- let ind -= (s:count_braces(pnum, 0) - (pline =~ '^\s*}' ? 1 : 0)) * &sw
+ let ind -= (s:count_braces(pnum, 0) - (pline =~ '^\s*}' ? 1 : 0)) * shiftwidth()
endif
return ind
diff --git a/runtime/indent/liquid.vim b/runtime/indent/liquid.vim
index 01e7223696..7beb0388d1 100644
--- a/runtime/indent/liquid.vim
+++ b/runtime/indent/liquid.vim
@@ -1,7 +1,7 @@
" Vim indent file
" Language: Liquid
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
-" Last Change: 2013 May 30
+" Last Change: 2017 Jun 13
if exists('b:did_indent')
finish
@@ -54,9 +54,10 @@ function! GetLiquidIndent(...)
let line = substitute(line,'\C^\%(\s*{%\s*end\w*\s*%}\)\+','','')
let line .= matchstr(cline,'\C^\%(\s*{%\s*end\w*\s*%}\)\+')
let cline = substitute(cline,'\C^\%(\s*{%\s*end\w*\s*%}\)\+','','')
- let ind += &sw * s:count(line,'{%\s*\%(if\|elsif\|else\|unless\|ifchanged\|case\|when\|for\|empty\|tablerow\|capture\)\>')
- let ind -= &sw * s:count(line,'{%\s*end\%(if\|unless\|ifchanged\|case\|for\|tablerow\|capture\)\>')
- let ind -= &sw * s:count(cline,'{%\s*\%(elsif\|else\|when\|empty\)\>')
- let ind -= &sw * s:count(cline,'{%\s*end\w*$')
+ let sw = shiftwidth()
+ let ind += sw * s:count(line,'{%\s*\%(if\|elsif\|else\|unless\|ifchanged\|case\|when\|for\|empty\|tablerow\|capture\)\>')
+ let ind -= sw * s:count(line,'{%\s*end\%(if\|unless\|ifchanged\|case\|for\|tablerow\|capture\)\>')
+ let ind -= sw * s:count(cline,'{%\s*\%(elsif\|else\|when\|empty\)\>')
+ let ind -= sw * s:count(cline,'{%\s*end\w*$')
return ind
endfunction
diff --git a/runtime/indent/logtalk.vim b/runtime/indent/logtalk.vim
index 99e6ec896b..8e36f86115 100644
--- a/runtime/indent/logtalk.vim
+++ b/runtime/indent/logtalk.vim
@@ -1,5 +1,5 @@
" Maintainer: Paulo Moura <pmoura@logtalk.org>
-" Revised on: 2008.06.02
+" Revised on: 2018.08.04
" Language: Logtalk
" This Logtalk indent file is a modified version of the Prolog
@@ -38,24 +38,27 @@ function! GetLogtalkIndent()
endif
" Check for entity opening directive on previous line
if pline =~ '^\s*:-\s\(object\|protocol\|category\)\ze(.*,$'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
" Check for clause head on previous line
elseif pline =~ ':-\s*\(%.*\)\?$'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
+ " Check for grammar rule head on previous line
+ elseif pline =~ '-->\s*\(%.*\)\?$'
+ let ind = ind + shiftwidth()
" Check for entity closing directive on previous line
elseif pline =~ '^\s*:-\send_\(object\|protocol\|category\)\.\(%.*\)\?$'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
" Check for end of clause on previous line
elseif pline =~ '\.\s*\(%.*\)\?$'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
" Check for opening conditional on previous line
if pline =~ '^\s*\([(;]\|->\)' && pline !~ '\.\s*\(%.*\)\?$' && pline !~ '^.*\([)][,]\s*\(%.*\)\?$\)'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
" Check for closing an unclosed paren, or middle ; or ->
if line =~ '^\s*\([);]\|->\)'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
return ind
endfunction
diff --git a/runtime/indent/lua.vim b/runtime/indent/lua.vim
index d1d2c0d600..604cd333c9 100644
--- a/runtime/indent/lua.vim
+++ b/runtime/indent/lua.vim
@@ -2,7 +2,7 @@
" Language: Lua script
" Maintainer: Marcus Aurelius Farias <marcus.cf 'at' bol.com.br>
" First Author: Max Ischenko <mfi 'at' ukr.net>
-" Last Change: 2016 Jan 10
+" Last Change: 2017 Jun 13
" Only load this indent file when no other was loaded.
if exists("b:did_indent")
@@ -48,7 +48,7 @@ function! GetLuaIndent()
" Add 'shiftwidth' if what we found previously is not in a comment and
" an "end" or "until" is not present on the same line.
if synIDattr(synID(prevlnum, midx + 1, 1), "name") != "luaComment" && prevline !~ '\<end\>\|\<until\>'
- let ind = ind + &shiftwidth
+ let ind = ind + shiftwidth()
endif
endif
@@ -56,7 +56,7 @@ function! GetLuaIndent()
" This is the part that requires 'indentkeys'.
let midx = match(getline(v:lnum), '^\s*\%(end\>\|else\>\|elseif\>\|until\>\|}\)')
if midx != -1 && synIDattr(synID(v:lnum, midx + 1, 1), "name") != "luaComment"
- let ind = ind - &shiftwidth
+ let ind = ind - shiftwidth()
endif
return ind
diff --git a/runtime/indent/make.vim b/runtime/indent/make.vim
index 8412fbb4d1..66a8a40173 100644
--- a/runtime/indent/make.vim
+++ b/runtime/indent/make.vim
@@ -1,7 +1,7 @@
" Vim indent file
-" Language: Makefile
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2007-05-07
+" Language: Makefile
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-05-07
if exists("b:did_indent")
finish
@@ -48,14 +48,14 @@ function GetMakeIndent()
if prev_prev_line =~ s:continuation_rx
return indent(prev_lnum)
elseif prev_line =~ s:rule_rx
- return &sw
+ return shiftwidth()
elseif prev_line =~ s:assignment_rx
call cursor(prev_lnum, 1)
if search(s:assignment_rx, 'W') != 0
return virtcol('.') - 1
else
" TODO: ?
- return &sw
+ return shiftwidth()
endif
else
" TODO: OK, this might be a continued shell command, so perhaps indent
@@ -66,7 +66,7 @@ function GetMakeIndent()
" return indent(prev_lnum) + 2
" endif
"endif
- return indent(prev_lnum) + &sw
+ return indent(prev_lnum) + shiftwidth()
endif
elseif prev_prev_line =~ s:continuation_rx
let folded_line = s:remove_continuation(prev_prev_line) . ' ' . s:remove_continuation(prev_line)
@@ -102,13 +102,13 @@ function GetMakeIndent()
return &ts
endif
elseif prev_line =~ s:conditional_directive_rx
- return &sw
+ return shiftwidth()
else
let line = getline(v:lnum)
if line =~ s:just_inserted_rule_rx
return 0
elseif line =~ s:end_conditional_directive_rx
- return v:lnum - 1 == 0 ? 0 : indent(v:lnum - 1) - &sw
+ return v:lnum - 1 == 0 ? 0 : indent(v:lnum - 1) - shiftwidth()
else
return v:lnum - 1 == 0 ? 0 : indent(v:lnum - 1)
endif
diff --git a/runtime/indent/matlab.vim b/runtime/indent/matlab.vim
index 7bccc7c0a7..6a31624389 100644
--- a/runtime/indent/matlab.vim
+++ b/runtime/indent/matlab.vim
@@ -44,9 +44,9 @@ function GetMatlabIndent(lnum)
" See if this line does not follow the line right after an openblock
if getline(plnum) =~ '^\s*\(for\|if\|else\|elseif\|case\|while\|switch\|try\|otherwise\|catch\)\>'
" See if the user has already dedented
- elseif indent(v:lnum) > curind - &sw
+ elseif indent(v:lnum) > curind - shiftwidth()
" If not, recommend one dedent
- let curind = curind - &sw
+ let curind = curind - shiftwidth()
else
" Otherwise, trust the user
return -1
@@ -56,9 +56,9 @@ function GetMatlabIndent(lnum)
" If the previous line opened a block
elseif getline(plnum) =~ '^\s*\(for\|if\|else\|elseif\|case\|while\|switch\|try\|otherwise\|catch\)\>'
" See if the user has already indented
- if indent(v:lnum) < curind + &sw
+ if indent(v:lnum) < curind + shiftwidth()
"If not, recommend indent
- let curind = curind + &sw
+ let curind = curind + shiftwidth()
else
" Otherwise, trust the user
return -1
diff --git a/runtime/indent/mf.vim b/runtime/indent/mf.vim
new file mode 100644
index 0000000000..88737f4e9f
--- /dev/null
+++ b/runtime/indent/mf.vim
@@ -0,0 +1,6 @@
+" METAFONT indent file
+" Language: METAFONT
+" Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+" Last Change: 2016 Oct 1
+
+runtime! indent/mp.vim
diff --git a/runtime/indent/mma.vim b/runtime/indent/mma.vim
index 356b87618d..8298ad98cd 100644
--- a/runtime/indent/mma.vim
+++ b/runtime/indent/mma.vim
@@ -49,7 +49,7 @@ function GetMmaIndent()
" also, indent only if this line if this line isn't starting a new
" block... TODO - fix this with indentkeys?
if getline(v:lnum-1) =~ '\\\@<!\%(\[[^\]]*\|([^)]*\|{[^}]*\)$' && getline(v:lnum) !~ '\s\+[\[({]'
- let ind = ind+&sw
+ let ind = ind+shiftwidth()
endif
" if this line had unmatched closing block,
diff --git a/runtime/indent/mp.vim b/runtime/indent/mp.vim
index a118eb8b60..86fa2539c1 100644
--- a/runtime/indent/mp.vim
+++ b/runtime/indent/mp.vim
@@ -1,56 +1,19 @@
" MetaPost indent file
-" Language: MetaPost
-" Maintainer: Eugene Minkovskii <emin@mccme.ru>
-" Last Change: 2012 May 18
-" Version: 0.1
-" ==========================================================================
-
-" Identation Rules: {{{1
-" First of all, MetaPost language don't expect any identation rules.
-" This screept need for you only if you (not MetaPost) need to do
-" exactly code. If you don't need to use indentation, see
-" :help filetype-indent-off
-"
-" Note: Every rules of identation in MetaPost or TeX languages (and in some
-" other of course) is very subjective. I can release only my vision of this
-" promlem.
-"
-" ..........................................................................
-" Example of correct (by me) identation {{{2
-" shiftwidth=4
-" ==========================================================================
-" for i=0 upto 99:
-" z[i] = (0,1u) rotated (i*360/100);
-" endfor
-" draw z0 -- z10 -- z20
-" withpen ... % <- 2sw because breaked line
-" withcolor ...; % <- same as previous
-" draw z0 for i=1 upto 99:
-" -- z[i] % <- 1sw from left end of 'for' satement
-" endfor withpen ... % <- 0sw from left end of 'for' satement
-" withcolor ...; % <- 2sw because breaked line
-" draw if One: % <- This is internal if (like 'for' above)
-" one
-" elsif Other:
-" other
-" fi withpen ...;
-" if one: % <- This is external if
-" draw one;
-" elseif other:
-" draw other;
-" fi
-" draw z0; draw z1;
-" }}}
-" }}}
+" Language: MetaPost
+" Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+" Former Maintainers: Eugene Minkovskii <emin@mccme.ru>
+" Last Change: 2016 Oct 2, 4:13pm
+" Version: 0.2
-" Only load this indent file when no other was loaded.
if exists("b:did_indent")
finish
endif
let b:did_indent = 1
setlocal indentexpr=GetMetaPostIndent()
-setlocal indentkeys+=;,<:>,=if,=for,=def,=end,=else,=fi
+setlocal indentkeys+==end,=else,=fi,=fill,0),0]
+
+let b:undo_indent = "setl indentkeys< indentexpr<"
" Only define the function once.
if exists("*GetMetaPostIndent")
@@ -59,151 +22,337 @@ endif
let s:keepcpo= &cpo
set cpo&vim
-" Auxiliary Definitions: {{{1
-function! MetaNextNonblankNoncomment(pos)
- " Like nextnonblank() but ignore comment lines
- let tmp = nextnonblank(a:pos)
- while tmp && getline(tmp) =~ '^\s*%'
- let tmp = nextnonblank(tmp+1)
+function GetMetaPostIndent()
+ let ignorecase_save = &ignorecase
+ try
+ let &ignorecase = 0
+ return GetMetaPostIndentIntern()
+ finally
+ let &ignorecase = ignorecase_save
+ endtry
+endfunc
+
+" Regexps {{{
+" Note: the next three variables are made global so that a user may add
+" further keywords.
+"
+" Example:
+"
+" Put these in ~/.vim/after/indent/mp.vim
+"
+" let g:mp_open_tag .= '\|\<begintest\>'
+" let g:mp_close_tag .= '\|\<endtest\>'
+
+" Expressions starting indented blocks
+let g:mp_open_tag = ''
+ \ . '\<if\>'
+ \ . '\|\<else\%[if]\>'
+ \ . '\|\<for\%(\|ever\|suffixes\)\>'
+ \ . '\|\<begingroup\>'
+ \ . '\|\<\%(\|var\|primary\|secondary\|tertiary\)def\>'
+ \ . '\|^\s*\<begin\%(fig\|graph\|glyph\|char\|logochar\)\>'
+ \ . '\|[([{]'
+
+" Expressions ending indented blocks
+let g:mp_close_tag = ''
+ \ . '\<fi\>'
+ \ . '\|\<else\%[if]\>'
+ \ . '\|\<end\%(\|for\|group\|def\|fig\|char\|glyph\|graph\)\>'
+ \ . '\|[)\]}]'
+
+" Statements that may span multiple lines and are ended by a semicolon. To
+" keep this list short, statements that are unlikely to be very long or are
+" not very common (e.g., keywords like `interim` or `showtoken`) are not
+" included.
+"
+" The regex for assignments and equations (the last branch) is tricky, because
+" it must not match things like `for i :=`, `if a=b`, `def...=`, etc... It is
+" not perfect, but it works reasonably well.
+let g:mp_statement = ''
+ \ . '\<\%(\|un\|cut\)draw\>'
+ \ . '\|\<\%(\|un\)fill\%[draw]\>'
+ \ . '\|\<draw\%(dbl\)\=arrow\>'
+ \ . '\|\<clip\>'
+ \ . '\|\<addto\>'
+ \ . '\|\<save\>'
+ \ . '\|\<setbounds\>'
+ \ . '\|\<message\>'
+ \ . '\|\<errmessage\>'
+ \ . '\|\<errhelp\>'
+ \ . '\|\<fontmapline\>'
+ \ . '\|\<pickup\>'
+ \ . '\|\<show\>'
+ \ . '\|\<special\>'
+ \ . '\|\<write\>'
+ \ . '\|\%(^\|;\)\%([^;=]*\%('.g:mp_open_tag.'\)\)\@!.\{-}:\=='
+
+" A line ends with zero or more spaces, possibly followed by a comment.
+let s:eol = '\s*\%($\|%\)'
+" }}}
+
+" Auxiliary functions {{{
+" Returns 1 if (0-based) position immediately preceding `pos` in `line` is
+" inside a string or a comment; returns 0 otherwise.
+
+" This is the function that is called more often when indenting, so it is
+" critical that it is efficient. The method we use is significantly faster
+" than using syntax attributes, and more general (it does not require
+" syntax_items). It is also faster than using a single regex matching an even
+" number of quotes. It helps that MetaPost strings cannot span more than one
+" line and cannot contain escaped quotes.
+function! s:CommentOrString(line, pos)
+ let in_string = 0
+ let q = stridx(a:line, '"')
+ let c = stridx(a:line, '%')
+ while q >= 0 && q < a:pos
+ if c >= 0 && c < q
+ if in_string " Find next percent symbol
+ let c = stridx(a:line, '%', q + 1)
+ else " Inside comment
+ return 1
+ endif
+ endif
+ let in_string = 1 - in_string
+ let q = stridx(a:line, '"', q + 1) " Find next quote
endwhile
- return tmp
+ return in_string || (c >= 0 && c <= a:pos)
endfunction
-function! MetaPrevNonblankNoncomment(pos)
- " Like prevnonblank() but ignore comment lines
- let tmp = prevnonblank(a:pos)
- while tmp && getline(tmp) =~ '^\s*%'
- let tmp = prevnonblank(tmp-1)
+" Find the first non-comment non-blank line before the current line.
+function! s:PrevNonBlankNonComment(lnum)
+ let l:lnum = prevnonblank(a:lnum - 1)
+ while getline(l:lnum) =~# '^\s*%'
+ let l:lnum = prevnonblank(l:lnum - 1)
endwhile
- return tmp
+ return l:lnum
endfunction
-function! MetaSearchNoncomment(pattern, ...)
- " Like search() but ignore commented areas
- if a:0
- let flags = a:1
- elseif &wrapscan
- let flags = "w"
- else
- let flags = "W"
- endif
- let cl = line(".")
- let cc = col(".")
- let tmp = search(a:pattern, flags)
- while tmp && synIDattr(synID(line("."), col("."), 1), "name") =~
- \ 'm[fp]\(Comment\|TeXinsert\|String\)'
- let tmp = search(a:pattern, flags)
+" Returns true if the last tag appearing in the line is an open tag; returns
+" false otherwise.
+function! s:LastTagIsOpen(line)
+ let o = s:LastValidMatchEnd(a:line, g:mp_open_tag, 0)
+ if o == - 1 | return v:false | endif
+ return s:LastValidMatchEnd(a:line, g:mp_close_tag, o) < 0
+endfunction
+
+" A simple, efficient and quite effective heuristics is used to test whether
+" a line should cause the next line to be indented: count the "opening tags"
+" (if, for, def, ...) in the line, count the "closing tags" (endif, endfor,
+" ...) in the line, and compute the difference. We call the result the
+" "weight" of the line. If the weight is positive, then the next line should
+" most likely be indented. Note that `else` and `elseif` are both opening and
+" closing tags, so they "cancel out" in almost all cases, the only exception
+" being a leading `else[if]`, which is counted as an opening tag, but not as
+" a closing tag (so that, for instance, a line containing a single `else:`
+" will have weight equal to one, not zero). We do not treat a trailing
+" `else[if]` in any special way, because lines ending with an open tag are
+" dealt with separately before this function is called (see
+" GetMetaPostIndentIntern()).
+"
+" Example:
+"
+" forsuffixes $=a,b: if x.$ = y.$ : draw else: fill fi
+" % This line will be indented because |{forsuffixes,if,else}| > |{else,fi}| (3 > 2)
+" endfor
+
+function! s:Weight(line)
+ let [o, i] = [0, s:ValidMatchEnd(a:line, g:mp_open_tag, 0)]
+ while i > 0
+ let o += 1
+ let i = s:ValidMatchEnd(a:line, g:mp_open_tag, i)
+ endwhile
+ let [c, i] = [0, matchend(a:line, '^\s*\<else\%[if]\>')] " Skip a leading else[if]
+ let i = s:ValidMatchEnd(a:line, g:mp_close_tag, i)
+ while i > 0
+ let c += 1
+ let i = s:ValidMatchEnd(a:line, g:mp_close_tag, i)
+ endwhile
+ return o - c
+endfunction
+
+" Similar to matchend(), but skips strings and comments.
+" line: a String
+function! s:ValidMatchEnd(line, pat, start)
+ let i = matchend(a:line, a:pat, a:start)
+ while i > 0 && s:CommentOrString(a:line, i)
+ let i = matchend(a:line, a:pat, i)
+ endwhile
+ return i
+endfunction
+
+" Like s:ValidMatchEnd(), but returns the end position of the last (i.e.,
+" rightmost) match.
+function! s:LastValidMatchEnd(line, pat, start)
+ let last_found = -1
+ let i = matchend(a:line, a:pat, a:start)
+ while i > 0
+ if !s:CommentOrString(a:line, i)
+ let last_found = i
+ endif
+ let i = matchend(a:line, a:pat, i)
endwhile
- if !tmp
- call cursor(cl,cc)
+ return last_found
+endfunction
+
+function! s:DecreaseIndentOnClosingTag(curr_indent)
+ let cur_text = getline(v:lnum)
+ if cur_text =~# '^\s*\%('.g:mp_close_tag.'\)'
+ return max([a:curr_indent - shiftwidth(), 0])
endif
- return tmp
+ return a:curr_indent
endfunction
" }}}
-function! GetMetaPostIndent()
- " not indent in comment ???
- if synIDattr(synID(line("."), col("."), 1), "name") =~
- \ 'm[fp]\(Comment\|TeXinsert\|String\)'
+" Main function {{{
+"
+" Note: Every rule of indentation in MetaPost is very subjective. We might get
+" creative, but things get murky very soon (there are too many corner cases).
+" So, we provide a means for the user to decide what to do when this script
+" doesn't get it. We use a simple idea: use '%>', '%<' and '%=' to explicitly
+" control indentation. The '<' and '>' symbols may be repeated many times
+" (e.g., '%>>' will cause the next line to be indented twice).
+"
+" By using '%>...', '%<...' and '%=', the indentation the user wants is
+" preserved by commands like gg=G, even if it does not follow the rules of
+" this script.
+"
+" Example:
+"
+" def foo =
+" makepen(
+" subpath(T-n,t) of r %>
+" shifted .5down %>
+" --subpath(t,T) of r shifted .5up -- cycle %<<<
+" )
+" withcolor black
+" enddef
+"
+" The default indentation of the previous example would be:
+"
+" def foo =
+" makepen(
+" subpath(T-n,t) of r
+" shifted .5down
+" --subpath(t,T) of r shifted .5up -- cycle
+" )
+" withcolor black
+" enddef
+"
+" Personally, I prefer the latter, but anyway...
+function! GetMetaPostIndentIntern()
+ " Do not touch indentation inside verbatimtex/btex.. etex blocks.
+ if synIDattr(synID(v:lnum, 1, 1), "name") =~# '^mpTeXinsert$\|^tex\|^Delimiter'
return -1
endif
- " Some RegExps: {{{1
- " end_of_item: all of end by ';'
- " + all of end by :endfor, :enddef, :endfig, :endgroup, :fi
- " + all of start by :beginfig(num), :begingroup
- " + all of start by :for, :if, :else, :elseif and end by ':'
- " + all of start by :def, :vardef and end by '='
- let end_of_item = '\(' .
- \ ';\|' .
- \ '\<\(end\(for\|def\|fig\|group\)\|fi\)\>\|' .
- \ '\<begin\(group\>\|fig\s*(\s*\d\+\s*)\)\|' .
- \ '\<\(for\|if\|else\(if\)\=\)\>.\+:\|' .
- \ '\<\(var\)\=def\>.\+=' . '\)'
- " }}}
- " Save: current position {{{1
- let cl = line (".")
- let cc = col (".")
- let cs = getline(".")
- " if it is :beginfig or :endfig use zero indent
- if cs =~ '^\s*\(begin\|end\)fig\>'
- return 0
- endif
- " }}}
- " Initialise: ind variable {{{1
- " search previous item not in current line
- let p_semicol_l = MetaSearchNoncomment(end_of_item,"bW")
- while p_semicol_l == cl
- let p_semicol_l = MetaSearchNoncomment(end_of_item,"bW")
- endwhile
- " if this is first item in program use zero indent
- if !p_semicol_l
+
+ " This is the reference line relative to which the current line is indented
+ " (but see below).
+ let lnum = s:PrevNonBlankNonComment(v:lnum)
+
+ " At the start of the file use zero indent.
+ if lnum == 0
return 0
endif
- " if this is multiline item, remember first indent
- if MetaNextNonblankNoncomment(p_semicol_l+1) < cl
- let ind = indent(MetaNextNonblankNoncomment(p_semicol_l+1))
- " else --- search pre-previous item for search first line in previous item
- else
- " search pre-previous item not in current line
- let pp_semicol_l = MetaSearchNoncomment(end_of_item,"bW")
- while pp_semicol_l == p_semicol_l
- let pp_semicol_l = MetaSearchNoncomment(end_of_item,"bW")
- endwhile
- " if we find pre-previous item, remember indent of previous item
- " else --- remember zero
- if pp_semicol_l
- let ind = indent(MetaNextNonblankNoncomment(line(".")+1))
- else
- let ind = 0
+
+ let prev_text = getline(lnum)
+
+ " User-defined overrides take precedence over anything else.
+ " See above for an example.
+ let j = match(prev_text, '%[<>=]')
+ if j > 0
+ let i = strlen(matchstr(prev_text, '%>\+', j)) - 1
+ if i > 0
+ return indent(lnum) + i * shiftwidth()
+ endif
+
+ let i = strlen(matchstr(prev_text, '%<\+', j)) - 1
+ if i > 0
+ return max([indent(lnum) - i * shiftwidth(), 0])
+ endif
+
+ if match(prev_text, '%=', j)
+ return indent(lnum)
endif
endif
- " }}}
- " Increase Indent: {{{1
- " if it is an internal/external :for or :if statements {{{2
- let pnn_s = getline(MetaPrevNonblankNoncomment(cl-1))
- if pnn_s =~ '\<\(for\|if\)\>.\+:\s*\($\|%\)'
- let ind = match(pnn_s, '\<\(for\|if\)\>.\+:\s*\($\|%\)') + &sw
- " }}}
- " if it is a :def, :vardef, :beginfig, :begingroup, :else, :elseif {{{2
- elseif pnn_s =~ '^\s*\(' .
- \ '\(var\)\=def\|' .
- \ 'begin\(group\|fig\s*(\s*\d\+\s*)\)\|' .
- \ 'else\(if\)\=' . '\)\>'
- let ind = ind + &sw
- " }}}
- " if it is a broken line {{{2
- elseif pnn_s !~ end_of_item.'\s*\($\|%\)'
- let ind = ind + (2 * &sw)
+
+ " If the reference line ends with an open tag, indent.
+ "
+ " Example:
+ "
+ " if c:
+ " 0
+ " else:
+ " 1
+ " fi if c2: % Note that this line has weight equal to zero.
+ " ... % This line will be indented
+ if s:LastTagIsOpen(prev_text)
+ return s:DecreaseIndentOnClosingTag(indent(lnum) + shiftwidth())
endif
- " }}}
- " }}}
- " Decrease Indent: {{{1
- " if this is :endfor or :enddef statements {{{2
- " this is correct because :def cannot be inside :for
- if cs =~ '\<end\(for\|def\)\=\>'
- call MetaSearchNoncomment('\<for\>.\+:\s*\($\|%\)' . '\|' .
- \ '^\s*\(var\)\=def\>',"bW")
- if col(".") > 1
- let ind = col(".") - 1
+
+ " Lines with a positive weight are unbalanced and should likely be indented.
+ "
+ " Example:
+ "
+ " def f = enddef for i = 1 upto 5: if x[i] > 0: 1 else: 2 fi
+ " ... % This line will be indented (because of the unterminated `for`)
+ if s:Weight(prev_text) > 0
+ return s:DecreaseIndentOnClosingTag(indent(lnum) + shiftwidth())
+ endif
+
+ " Unterminated statements cause indentation to kick in.
+ "
+ " Example:
+ "
+ " draw unitsquare
+ " withcolor black; % This line is indented because of `draw`.
+ " x := a + b + c
+ " + d + e; % This line is indented because of `:=`.
+ "
+ let i = s:LastValidMatchEnd(prev_text, g:mp_statement, 0)
+ if i >= 0 " Does the line contain a statement?
+ if s:ValidMatchEnd(prev_text, ';', i) < 0 " Is the statement unterminated?
+ return indent(lnum) + shiftwidth()
else
- let ind = indent(".")
+ return s:DecreaseIndentOnClosingTag(indent(lnum))
endif
- " }}}
- " if this is :fi, :else, :elseif statements {{{2
- elseif cs =~ '\<\(else\(if\)\=\|fi\)\>'
- call MetaSearchNoncomment('\<if\>.\+:\s*\($\|%\)',"bW")
- let ind = col(".") - 1
- " }}}
- " if this is :endgroup statement {{{2
- elseif cs =~ '^\s*endgroup\>'
- let ind = ind - &sw
endif
- " }}}
- " }}}
- return ind
+ " Deal with the special case of a statement spanning multiple lines. If the
+ " current reference line L ends with a semicolon, search backwards for
+ " another semicolon or a statement keyword. If the latter is found first,
+ " its line is used as the reference line for indenting the current line
+ " instead of L.
+ "
+ " Example:
+ "
+ " if cond:
+ " draw if a: z0 else: z1 fi
+ " shifted S
+ " scaled T; % L
+ "
+ " for i = 1 upto 3: % <-- Current line: this gets the same indent as `draw ...`
+ "
+ " NOTE: we get here only if L does not contain a statement (among those
+ " listed in g:mp_statement).
+ if s:ValidMatchEnd(prev_text, ';'.s:eol, 0) >= 0 " L ends with a semicolon
+ let stm_lnum = s:PrevNonBlankNonComment(lnum)
+ while stm_lnum > 0
+ let prev_text = getline(stm_lnum)
+ let sc_pos = s:LastValidMatchEnd(prev_text, ';', 0)
+ let stm_pos = s:ValidMatchEnd(prev_text, g:mp_statement, sc_pos)
+ if stm_pos > sc_pos
+ let lnum = stm_lnum
+ break
+ elseif sc_pos > stm_pos
+ break
+ endif
+ let stm_lnum = s:PrevNonBlankNonComment(stm_lnum)
+ endwhile
+ endif
+
+ return s:DecreaseIndentOnClosingTag(indent(lnum))
endfunction
-"
+" }}}
let &cpo = s:keepcpo
unlet s:keepcpo
diff --git a/runtime/indent/nsis.vim b/runtime/indent/nsis.vim
new file mode 100644
index 0000000000..223f4fa28e
--- /dev/null
+++ b/runtime/indent/nsis.vim
@@ -0,0 +1,91 @@
+" Vim indent file
+" Language: NSIS script
+" Maintainer: Ken Takata
+" URL: https://github.com/k-takata/vim-nsis
+" Last Change: 2018-01-21
+" Filenames: *.nsi
+" License: VIM License
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal nosmartindent
+setlocal noautoindent
+setlocal indentexpr=GetNsisIndent(v:lnum)
+setlocal indentkeys=!^F,o,O
+setlocal indentkeys+==~${Else,=~${EndIf,=~${EndUnless,=~${AndIf,=~${AndUnless,=~${OrIf,=~${OrUnless,=~${Case,=~${Default,=~${EndSelect,=~${EndSwith,=~${Loop,=~${Next,=~${MementoSectionEnd,=~FunctionEnd,=~SectionEnd,=~SectionGroupEnd,=~PageExEnd,0=~!macroend,0=~!if,0=~!else,0=~!endif
+
+if exists("*GetNsisIndent")
+ finish
+endif
+
+function! GetNsisIndent(lnum)
+ " If this line is explicitly joined: If the previous line was also joined,
+ " line it up with that one, otherwise add two 'shiftwidth'
+ if getline(a:lnum - 1) =~ '\\$'
+ if a:lnum > 1 && getline(a:lnum - 2) =~ '\\$'
+ return indent(a:lnum - 1)
+ endif
+ return indent(a:lnum - 1) + shiftwidth() * 2
+ endif
+
+ " Grab the current line, stripping comments.
+ let l:thisl = substitute(getline(a:lnum), '[;#].*$', '', '')
+ " Check if this line is a conditional preprocessor line.
+ let l:preproc = l:thisl =~? '^\s*!\%(if\|else\|endif\)'
+
+ " Grab the previous line, stripping comments.
+ " Skip preprocessor lines and continued lines.
+ let l:prevlnum = a:lnum
+ while 1
+ let l:prevlnum = prevnonblank(l:prevlnum - 1)
+ if l:prevlnum == 0
+ " top of file
+ return 0
+ endif
+ let l:prevl = substitute(getline(l:prevlnum), '[;#].*$', '', '')
+ let l:prevpreproc = l:prevl =~? '^\s*!\%(if\|else\|endif\)'
+ if l:preproc == l:prevpreproc && getline(l:prevlnum - 1) !~? '\\$'
+ break
+ endif
+ endwhile
+ let l:previ = indent(l:prevlnum)
+ let l:ind = l:previ
+
+ if l:preproc
+ " conditional preprocessor
+ if l:prevl =~? '^\s*!\%(if\%(\%(macro\)\?n\?def\)\?\|else\)\>'
+ let l:ind += shiftwidth()
+ endif
+ if l:thisl =~? '^\s*!\%(else\|endif\)\?\>'
+ let l:ind -= shiftwidth()
+ endif
+ return l:ind
+ endif
+
+ if l:prevl =~? '^\s*\%(\${\%(If\|IfNot\|Unless\|ElseIf\|ElseIfNot\|ElseUnless\|Else\|AndIf\|AndIfNot\|AndUnless\|OrIf\|OrIfNot\|OrUnless\|Select\|Case\|Case[2-5]\|CaseElse\|Default\|Switch\|Do\|DoWhile\|DoUntil\|For\|ForEach\|MementoSection\)}\|Function\>\|Section\>\|SectionGroup\|PageEx\>\|!macro\>\)'
+ " previous line opened a block
+ let l:ind += shiftwidth()
+ endif
+ if l:thisl =~? '^\s*\%(\${\%(ElseIf\|ElseIfNot\|ElseUnless\|Else\|EndIf\|EndUnless\|AndIf\|AndIfNot\|AndUnless\|OrIf\|OrIfNot\|OrUnless\|Loop\|LoopWhile\|LoopUntil\|Next\|MementoSectionEnd\)\>}\?\|FunctionEnd\>\|SectionEnd\>\|SectionGroupEnd\|PageExEnd\>\|!macroend\>\)'
+ " this line closed a block
+ let l:ind -= shiftwidth()
+ elseif l:thisl =~? '^\s*\${\%(Case\|Case[2-5]\|CaseElse\|Default\)\>}\?'
+ if l:prevl !~? '^\s*\${\%(Select\|Switch\)}'
+ let l:ind -= shiftwidth()
+ endif
+ elseif l:thisl =~? '^\s*\${\%(EndSelect\|EndSwitch\)\>}\?'
+ " this line closed a block
+ if l:prevl =~? '^\s*\${\%(Select\|Switch\)}'
+ let l:ind -= shiftwidth()
+ else
+ let l:ind -= shiftwidth() * 2
+ endif
+ endif
+
+ return l:ind
+endfunction
+
+" vim: ts=8 sw=2 sts=2
diff --git a/runtime/indent/ocaml.vim b/runtime/indent/ocaml.vim
index 3bd65c63f0..8fe9de3d61 100644
--- a/runtime/indent/ocaml.vim
+++ b/runtime/indent/ocaml.vim
@@ -4,7 +4,7 @@
" Mike Leary <leary@nwlink.com>
" Markus Mottl <markus.mottl@gmail.com>
" URL: http://www.ocaml.info/vim/indent/ocaml.vim
-" Last Change: 2013 Jun 29
+" Last Change: 2017 Jun 13
" 2005 Jun 25 - Fixed multiple bugs due to 'else\nreturn ind' working
" 2005 May 09 - Added an option to not indent OCaml-indents specially (MM)
" 2013 June - commented textwidth (Marc Weber)
@@ -101,7 +101,7 @@ function! GetOCamlIndent()
" Return double 'shiftwidth' after lines matching:
if lline =~ '^\s*|.*->\s*$'
- return ind + &sw + &sw
+ return ind + 2 * shiftwidth()
endif
let line = getline(v:lnum)
@@ -172,7 +172,7 @@ function! GetOCamlIndent()
" Indent if current line begins with 'and':
elseif line =~ '^\s*and\>'
if lline !~ '^\s*\(and\|let\|type\)\>\|\<end\s*$'
- return ind - &sw
+ return ind - shiftwidth()
endif
" Indent if current line begins with 'with':
@@ -199,14 +199,14 @@ function! GetOCamlIndent()
" or 'method':
elseif line =~ '^\s*\(constraint\|inherit\|initializer\|method\)\>'
if lline !~ s:obj
- return indent(search('\<\(object\|object\s*(.*)\)\s*$', 'bW')) + &sw
+ return indent(search('\<\(object\|object\s*(.*)\)\s*$', 'bW')) + shiftwidth()
endif
endif
" Add a 'shiftwidth' after lines ending with:
if lline =~ '\(:\|=\|->\|<-\|(\|\[\|{\|{<\|\[|\|\[<\|\<\(begin\|do\|else\|fun\|function\|functor\|if\|initializer\|object\|parser\|private\|sig\|struct\|then\|try\)\|\<object\s*(.*)\)\s*$'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
" Back to normal indent after lines ending with ';;':
elseif lline =~ ';;\s*$' && lline !~ '^\s*;;'
@@ -263,7 +263,7 @@ function! GetOCamlIndent()
" Subtract a 'shiftwidth' after lines matching 'match ... with parser':
if lline =~ '\<match\>.*\<with\>\s*\<parser\s*$'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
return ind
diff --git a/runtime/indent/occam.vim b/runtime/indent/occam.vim
index bebb0528bb..4acd42e3c8 100644
--- a/runtime/indent/occam.vim
+++ b/runtime/indent/occam.vim
@@ -131,7 +131,7 @@ function GetOccamIndent()
if line =~ s:FirstLevelIndent || (line =~ s:FirstLevelNonColonEndIndent && line !~ s:ColonEnd)
\ || (line !~ s:ColonStart && (prevline =~ s:SecondLevelIndent
\ || (prevline =~ s:SecondLevelNonColonEndIndent && prevline !~ s:ColonEnd)))
- let curindent = curindent + &shiftwidth
+ let curindent = curindent + shiftwidth()
" Restore magic
if !save_magic|setlocal nomagic|endif
@@ -153,7 +153,7 @@ function GetOccamIndent()
while !found
- if indent(prevlinenum) == curindent - &shiftwidth
+ if indent(prevlinenum) == curindent - shiftwidth()
let found = 1
endif
@@ -171,7 +171,7 @@ function GetOccamIndent()
if prevlinenum > 0
if getline(prevlinenum) =~ s:SecondLevelIndent
- let curindent = curindent + &shiftwidth
+ let curindent = curindent + shiftwidth()
endif
endif
diff --git a/runtime/indent/pascal.vim b/runtime/indent/pascal.vim
index 6dd3030e9c..c7955d669b 100644
--- a/runtime/indent/pascal.vim
+++ b/runtime/indent/pascal.vim
@@ -2,7 +2,7 @@
" Language: Pascal
" Maintainer: Neil Carter <n.carter@swansea.ac.uk>
" Created: 2004 Jul 13
-" Last Change: 2011 Apr 01
+" Last Change: 2017 Jun 13
"
" This is version 2.0, a complete rewrite.
"
@@ -102,12 +102,12 @@ function! GetPascalIndent( line_num )
" If the PREVIOUS LINE ended in these items, always indent
if prev_codeline =~ '\<\(type\|const\|var\)$'
- return indnt + &shiftwidth
+ return indnt + shiftwidth()
endif
if prev_codeline =~ '\<repeat$'
if this_codeline !~ '^\s*until\>'
- return indnt + &shiftwidth
+ return indnt + shiftwidth()
else
return indnt
endif
@@ -115,7 +115,7 @@ function! GetPascalIndent( line_num )
if prev_codeline =~ '\<\(begin\|record\)$'
if this_codeline !~ '^\s*end\>'
- return indnt + &shiftwidth
+ return indnt + shiftwidth()
else
return indnt
endif
@@ -125,10 +125,10 @@ function! GetPascalIndent( line_num )
" followed by "begin"
if prev_codeline =~ '\<\(\|else\|then\|do\)$' || prev_codeline =~ ':$'
if this_codeline !~ '^\s*begin\>'
- return indnt + &shiftwidth
+ return indnt + shiftwidth()
else
" If it does start with "begin" then keep the same indent
- "return indnt + &shiftwidth
+ "return indnt + shiftwidth()
return indnt
endif
endif
@@ -137,7 +137,7 @@ function! GetPascalIndent( line_num )
" only the line before the current one. TODO: Get it working for
" parameter lists longer than two lines.
if prev_codeline =~ '([^)]\+$'
- return indnt + &shiftwidth
+ return indnt + shiftwidth()
endif
@@ -146,7 +146,7 @@ function! GetPascalIndent( line_num )
" Lines starting with "else", but not following line ending with
" "end".
if this_codeline =~ '^\s*else\>' && prev_codeline !~ '\<end$'
- return indnt - &shiftwidth
+ return indnt - shiftwidth()
endif
" Lines after a single-statement branch/loop.
@@ -160,16 +160,16 @@ function! GetPascalIndent( line_num )
" additional unindentation.
if this_codeline =~ '^\s*\(end;\|except\|finally\|\)$'
" Note that we don't return from here.
- return indnt - &shiftwidth - &shiftwidth
+ return indnt - 2 * shiftwidth()
endif
- return indnt - &shiftwidth
+ return indnt - shiftwidth()
endif
" Lines starting with "until" or "end". This rule must be overridden
" by the one for "end" after a single-statement branch/loop. In
" other words that rule should come before this one.
if this_codeline =~ '^\s*\(end\|until\)\>'
- return indnt - &shiftwidth
+ return indnt - shiftwidth()
endif
@@ -201,7 +201,7 @@ function! GetPascalIndent( line_num )
" If the PREVIOUS LINE ended in these items, always indent.
if prev_codeline =~ '^\s*\(unit\|uses\|try\|except\|finally\|private\|protected\|public\|published\)$'
- return indnt + &shiftwidth
+ return indnt + shiftwidth()
endif
" ???? Indent "procedure" and "functions" if they appear within an
@@ -212,11 +212,11 @@ function! GetPascalIndent( line_num )
" UNINDENT ONCE
if this_codeline =~ '^\s*\(except\|finally\)$'
- return indnt - &shiftwidth
+ return indnt - shiftwidth()
endif
if this_codeline =~ '^\s*\(private\|protected\|public\|published\)$'
- return indnt - &shiftwidth
+ return indnt - shiftwidth()
endif
diff --git a/runtime/indent/perl.vim b/runtime/indent/perl.vim
index fc4b6a30d3..094d1d37ea 100644
--- a/runtime/indent/perl.vim
+++ b/runtime/indent/perl.vim
@@ -3,7 +3,7 @@
" Maintainer: vim-perl <vim-perl@googlegroups.com>
" Homepage: http://github.com/vim-perl/vim-perl
" Bugs/requests: http://github.com/vim-perl/vim-perl/issues
-" Last Change: 2013-07-24
+" Last Change: 2017-01-04
" Suggestions and improvements by :
" Aaron J. Sherman (use syntax for hints)
@@ -48,11 +48,6 @@ function! GetPerlIndent()
return 0
endif
- " Don't reindent comments on first column
- if cline =~ '^#.'
- return 0
- endif
-
" Get current syntax item at the line's first char
let csynid = ''
if b:indent_use_syntax
@@ -134,13 +129,14 @@ function! GetPerlIndent()
\ || synid == "perlMatchStartEnd"
\ || synid == "perlHereDoc"
\ || synid == "perlBraces"
+ \ || synid == "perlStatementIndirObj"
\ || synid =~ "^perlFiledescStatement"
\ || synid =~ '^perl\(Sub\|Block\|Package\)Fold'
let brace = strpart(line, bracepos, 1)
if brace == '(' || brace == '{' || brace == '['
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
else
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
endif
let bracepos = match(line, braceclass, bracepos + 1)
@@ -151,26 +147,27 @@ function! GetPerlIndent()
if synid == ""
\ || synid == "perlMatchStartEnd"
\ || synid == "perlBraces"
+ \ || synid == "perlStatementIndirObj"
\ || synid =~ '^perl\(Sub\|Block\|Package\)Fold'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
endif
else
if line =~ '[{[(]\s*\(#[^])}]*\)\=$'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
if cline =~ '^\s*[])}]'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
endif
" Indent lines that begin with 'or' or 'and'
if cline =~ '^\s*\(or\|and\)\>'
if line !~ '^\s*\(or\|and\)\>'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
elseif line =~ '^\s*\(or\|and\)\>'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
return ind
diff --git a/runtime/indent/perl6.vim b/runtime/indent/perl6.vim
index ff2a579f0a..8561c8c58c 100644
--- a/runtime/indent/perl6.vim
+++ b/runtime/indent/perl6.vim
@@ -3,7 +3,7 @@
" Maintainer: vim-perl <vim-perl@googlegroups.com>
" Homepage: http://github.com/vim-perl/vim-perl
" Bugs/requests: http://github.com/vim-perl/vim-perl/issues
-" Last Change: 2013-07-21
+" Last Change: 2017 Jun 13
" Contributors: Andy Lester <andy@petdance.com>
" Hinrik ร–rn Sigurรฐsson <hinrik.sig@gmail.com>
"
@@ -107,19 +107,19 @@ function! GetPerl6Indent()
endif
if line =~ '[<ยซ\[{(]\s*\(#[^)}\]ยป>]*\)\=$'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
if cline =~ '^\s*[)}\]ยป>]'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
" Indent lines that begin with 'or' or 'and'
if cline =~ '^\s*\(or\|and\)\>'
if line !~ '^\s*\(or\|and\)\>'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
elseif line =~ '^\s*\(or\|and\)\>'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
return ind
diff --git a/runtime/indent/php.vim b/runtime/indent/php.vim
index 07ecd8f141..b0430dea8d 100644
--- a/runtime/indent/php.vim
+++ b/runtime/indent/php.vim
@@ -3,8 +3,8 @@
" Author: John Wellesz <John.wellesz (AT) teaser (DOT) fr>
" URL: http://www.2072productions.com/vim/indent/php.vim
" Home: https://github.com/2072/PHP-Indenting-for-VIm
-" Last Change: 2015 September 8th
-" Version: 1.60
+" Last Change: 2018 May 18th
+" Version: 1.66
"
"
" Type :help php-indent for available options
@@ -50,25 +50,15 @@ let b:did_indent = 1
let g:php_sync_method = 0
-if exists('*shiftwidth')
- function! s:sw()
- return shiftwidth()
- endfunction
-else
- function! s:sw()
- return &shiftwidth
- endfunction
-endif
-
if exists("PHP_default_indenting")
- let b:PHP_default_indenting = PHP_default_indenting * s:sw()
+ let b:PHP_default_indenting = PHP_default_indenting * shiftwidth()
else
let b:PHP_default_indenting = 0
endif
if exists("PHP_outdentSLComments")
- let b:PHP_outdentSLComments = PHP_outdentSLComments * s:sw()
+ let b:PHP_outdentSLComments = PHP_outdentSLComments * shiftwidth()
else
let b:PHP_outdentSLComments = 0
endif
@@ -92,6 +82,12 @@ else
let b:PHP_outdentphpescape = 1
endif
+if exists("PHP_noArrowMatching")
+ let b:PHP_noArrowMatching = PHP_noArrowMatching
+else
+ let b:PHP_noArrowMatching = 0
+endif
+
if exists("PHP_vintage_case_default_indent") && PHP_vintage_case_default_indent
let b:PHP_vintage_case_default_indent = 1
@@ -140,13 +136,14 @@ endif
let s:PHP_validVariable = '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
let s:notPhpHereDoc = '\%(break\|return\|continue\|exit\|die\|else\)'
let s:blockstart = '\%(\%(\%(}\s*\)\=else\%(\s\+\)\=\)\=if\>\|\%(}\s*\)\?else\>\|do\>\|while\>\|switch\>\|case\>\|default\>\|for\%(each\)\=\>\|declare\>\|class\>\|trait\>\|use\>\|interface\>\|abstract\>\|final\>\|try\>\|\%(}\s*\)\=catch\>\|\%(}\s*\)\=finally\>\)'
-let s:functionDecl = '\<function\>\%(\s\+'.s:PHP_validVariable.'\)\=\s*(.*'
-let s:endline= '\s*\%(//.*\|#.*\|/\*.*\*/\s*\)\=$'
+let s:functionDecl = '\<function\>\%(\s\+&\='.s:PHP_validVariable.'\)\=\s*(.*'
+let s:endline = '\s*\%(//.*\|#.*\|/\*.*\*/\s*\)\=$'
+let s:unstated = '\%(^\s*'.s:blockstart.'.*)\|\%(//.*\)\@<!\<e'.'lse\>\)'.s:endline
-let s:terminated = '\%(\%(;\%(\s*\%(?>\|}\)\)\=\|<<<\s*[''"]\=\a\w*[''"]\=$\|^\s*}\|^\s*'.s:PHP_validVariable.':\)'.s:endline.'\)\|^[^''"`]*[''"`]$'
+let s:terminated = '\%(\%(;\%(\s*\%(?>\|}\)\)\=\|<<<\s*[''"]\=\a\w*[''"]\=$\|^\s*}\|^\s*'.s:PHP_validVariable.':\)'.s:endline.'\)'
let s:PHP_startindenttag = '<?\%(.*?>\)\@!\|<script[^>]*>\%(.*<\/script>\)\@!'
-
+let s:structureHead = '^\s*\%(' . s:blockstart . '\)\|'. s:functionDecl . s:endline . '\|\<new\s\+class\>'
let s:escapeDebugStops = 0
@@ -214,10 +211,28 @@ function! GetLastRealCodeLNum(startline) " {{{
let lnum = lnum - 1
endwhile
elseif lastline =~ '^[^''"`]*[''"`][;,]'.s:endline
- let tofind=substitute( lastline, '^.*\([''"`]\)[;,].*$', '^[^\1]\\+[\1]$', '')
- while getline(lnum) !~? tofind && lnum > 1
- let lnum = lnum - 1
+
+ let tofind=substitute( lastline, '^.*\([''"`]\)[;,].*$', '^[^\1]\\+[\1]$\\|^[^\1]\\+[=([]\\s*[\1]', '')
+ let trylnum = lnum
+ while getline(trylnum) !~? tofind && trylnum > 1
+ let trylnum = trylnum - 1
endwhile
+
+ if trylnum == 1
+ break
+ else
+ if lastline =~ ';'.s:endline
+ while getline(trylnum) !~? s:terminated && getline(trylnum) !~? '{'.s:endline && trylnum > 1
+ let trylnum = prevnonblank(trylnum - 1)
+ endwhile
+
+
+ if trylnum == 1
+ break
+ end
+ end
+ let lnum = trylnum
+ end
else
break
endif
@@ -247,7 +262,7 @@ endfun
function! Skippmatch() " {{{
let synname = synIDattr(synID(line("."), col("."), 0), "name")
- if synname == "Delimiter" || synname == "phpRegionDelimiter" || synname =~# "^phpParent" || synname == "phpArrayParens" || synname =~# '^php\%(Block\|Brace\)' || synname == "javaScriptBraces" || synname =~# '^php\%(Doc\)\?Comment' && b:UserIsTypingComment
+ if synname ==? "Delimiter" || synname ==? "phpRegionDelimiter" || synname =~? "^phpParent" || synname ==? "phpArrayParens" || synname =~? '^php\%(Block\|Brace\)' || synname ==? "javaScriptBraces" || synname =~? '^php\%(Doc\)\?Comment' && b:UserIsTypingComment
return 0
else
return 1
@@ -262,7 +277,7 @@ function! FindOpenBracket(lnum, blockStarter) " {{{
while line > 1
let linec = getline(line)
- if linec =~ s:terminated || linec =~ '^\s*\%(' . s:blockstart . '\)\|'. s:functionDecl . s:endline
+ if linec =~ s:terminated || linec =~ s:structureHead
break
endif
@@ -273,6 +288,62 @@ function! FindOpenBracket(lnum, blockStarter) " {{{
return line
endfun " }}}
+let s:blockChars = {'{':1, '[': 1, '(': 1, ')':-1, ']':-1, '}':-1}
+function! BalanceDirection (str)
+
+ let balance = 0
+
+ for c in split(a:str, '\zs')
+ if has_key(s:blockChars, c)
+ let balance += s:blockChars[c]
+ endif
+ endfor
+
+ return balance
+endfun
+
+function! StripEndlineComments (line)
+ return substitute(a:line,"\\(//\\|#\\)\\(\\(\\([^\"']*\\([\"']\\)[^\"']*\\5\\)\\+[^\"']*$\\)\\|\\([^\"']*$\\)\\)",'','')
+endfun
+
+function! FindArrowIndent (lnum) " {{{
+
+ let parrentArrowPos = 0
+ let lnum = a:lnum
+ while lnum > 1
+ let last_line = getline(lnum)
+ if last_line =~ '^\s*->'
+ let parrentArrowPos = indent(a:lnum)
+ break
+ else
+ call cursor(lnum, 1)
+ let cleanedLnum = StripEndlineComments(last_line)
+ if cleanedLnum =~ '->'
+ if ! b:PHP_noArrowMatching
+ let parrentArrowPos = searchpos('->', 'W', lnum)[1] - 1
+ else
+ let parrentArrowPos = indent(lnum) + shiftwidth()
+ endif
+ break
+ elseif cleanedLnum =~ ')'.s:endline && BalanceDirection(last_line) < 0
+ call searchpos(')'.s:endline, 'cW', lnum)
+ let openedparent = searchpair('(', '', ')', 'bW', 'Skippmatch()')
+ if openedparent != lnum
+ let lnum = openedparent
+ else
+ let openedparent = -1
+ endif
+
+ else
+ let parrentArrowPos = indent(lnum) + shiftwidth()
+ break
+ endif
+ endif
+ endwhile
+
+ return parrentArrowPos
+endfun "}}}
+
function! FindTheIfOfAnElse (lnum, StopAfterFirstPrevElse) " {{{
if getline(a:lnum) =~# '^\s*}\s*else\%(if\)\=\>'
@@ -323,7 +394,7 @@ function! FindTheSwitchIndent (lnum) " {{{
let test = GetLastRealCodeLNum(a:lnum - 1)
if test <= 1
- return indent(1) - s:sw() * b:PHP_vintage_case_default_indent
+ return indent(1) - shiftwidth() * b:PHP_vintage_case_default_indent
end
while getline(test) =~ '^\s*}' && test > 1
@@ -337,14 +408,14 @@ function! FindTheSwitchIndent (lnum) " {{{
if getline(test) =~# '^\s*switch\>'
return indent(test)
elseif getline(test) =~# s:defaultORcase
- return indent(test) - s:sw() * b:PHP_vintage_case_default_indent
+ return indent(test) - shiftwidth() * b:PHP_vintage_case_default_indent
else
return FindTheSwitchIndent(test)
endif
endfunction "}}}
-let s:SynPHPMatchGroups = {'phpParent':1, 'Delimiter':1, 'Define':1, 'Storageclass':1, 'StorageClass':1, 'Structure':1, 'Exception':1}
+let s:SynPHPMatchGroups = {'phpparent':1, 'delimiter':1, 'define':1, 'storageclass':1, 'structure':1, 'exception':1}
function! IslinePHP (lnum, tofind) " {{{
let cline = getline(a:lnum)
@@ -360,7 +431,7 @@ function! IslinePHP (lnum, tofind) " {{{
let synname = synIDattr(synID(a:lnum, coltotest, 0), "name")
- if synname == 'phpStringSingle' || synname == 'phpStringDouble' || synname == 'phpBacktick'
+ if synname ==? 'phpStringSingle' || synname ==? 'phpStringDouble' || synname ==? 'phpBacktick'
if cline !~ '^\s*[''"`]'
return "SpecStringEntrails"
else
@@ -368,7 +439,7 @@ function! IslinePHP (lnum, tofind) " {{{
end
end
- if get(s:SynPHPMatchGroups, synname) || synname =~ '^php' || synname =~? '^javaScript'
+ if get(s:SynPHPMatchGroups, tolower(synname)) || synname =~ '^php' || synname =~? '^javaScript'
return synname
else
return ""
@@ -399,6 +470,10 @@ endfunc
call ResetPhpOptions()
+function! GetPhpIndentVersion()
+ return "1.66-bundle"
+endfun
+
function! GetPhpIndent()
let b:GetLastRealCodeLNum_ADD = 0
@@ -410,7 +485,7 @@ function! GetPhpIndent()
endif
if b:PHP_default_indenting
- let b:PHP_default_indenting = g:PHP_default_indenting * s:sw()
+ let b:PHP_default_indenting = g:PHP_default_indenting * shiftwidth()
endif
let cline = getline(v:lnum)
@@ -456,14 +531,14 @@ function! GetPhpIndent()
endif
if synname!=""
- if synname == "SpecStringEntrails"
- let b:InPHPcode = -1
+ if synname ==? "SpecStringEntrails"
+ let b:InPHPcode = -1 " thumb down
let b:InPHPcode_tofind = ""
- elseif synname != "phpHereDoc" && synname != "phpHereDocDelimiter"
+ elseif synname !=? "phpHereDoc" && synname !=? "phpHereDocDelimiter"
let b:InPHPcode = 1
let b:InPHPcode_tofind = ""
- if synname =~# '^php\%(Doc\)\?Comment'
+ if synname =~? '^php\%(Doc\)\?Comment'
let b:UserIsTypingComment = 1
let b:InPHPcode_checked = 0
endif
@@ -532,7 +607,7 @@ function! GetPhpIndent()
if 1 == b:InPHPcode
- if !b:InPHPcode_and_script && last_line =~ '\%(<?.*\)\@<!?>\%(.*<?\)\@!' && IslinePHP(lnum, '?>')=~"Delimiter"
+ if !b:InPHPcode_and_script && last_line =~ '\%(<?.*\)\@<!?>\%(.*<?\)\@!' && IslinePHP(lnum, '?>')=~?"Delimiter"
if cline !~? s:PHP_startindenttag
let b:InPHPcode = 0
let b:InPHPcode_tofind = s:PHP_startindenttag
@@ -540,7 +615,7 @@ function! GetPhpIndent()
let b:InPHPcode_and_script = 1
endif
- elseif last_line =~ '^[^''"`]\+[''"`]$'
+ elseif last_line =~ '^[^''"`]\+[''"`]$' " a string identifier with nothing after it and no other string identifier before
let b:InPHPcode = -1
let b:InPHPcode_tofind = substitute( last_line, '^.*\([''"`]\).*$', '^[^\1]*\1[;,]$', '')
elseif last_line =~? '<<<\s*[''"]\=\a\w*[''"]\=$'
@@ -660,25 +735,26 @@ function! GetPhpIndent()
let terminated = s:terminated
- let unstated = '\%(^\s*'.s:blockstart.'.*)\|\%(//.*\)\@<!\<e'.'lse\>\)'.endline
+ let unstated = s:unstated
+
if ind != b:PHP_default_indenting && cline =~# '^\s*else\%(if\)\=\>'
let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
return indent(FindTheIfOfAnElse(v:lnum, 1))
elseif cline =~# s:defaultORcase
- return FindTheSwitchIndent(v:lnum) + s:sw() * b:PHP_vintage_case_default_indent
+ return FindTheSwitchIndent(v:lnum) + shiftwidth() * b:PHP_vintage_case_default_indent
elseif cline =~ '^\s*)\=\s*{'
let previous_line = last_line
let last_line_num = lnum
while last_line_num > 1
- if previous_line =~ terminated || previous_line =~ '^\s*\%(' . s:blockstart . '\)\|'. s:functionDecl . endline
+ if previous_line =~ terminated || previous_line =~ s:structureHead
let ind = indent(last_line_num)
if b:PHP_BracesAtCodeLevel
- let ind = ind + s:sw()
+ let ind = ind + shiftwidth()
endif
return ind
@@ -687,9 +763,10 @@ function! GetPhpIndent()
let last_line_num = GetLastRealCodeLNum(last_line_num - 1)
let previous_line = getline(last_line_num)
endwhile
-
+ elseif cline =~ '^\s*->'
+ return FindArrowIndent(lnum)
elseif last_line =~# unstated && cline !~ '^\s*);\='.endline
- let ind = ind + s:sw()
+ let ind = ind + shiftwidth() " we indent one level further when the preceding line is not stated
return ind + addSpecial
elseif (ind != b:PHP_default_indenting || last_line =~ '^[)\]]' ) && last_line =~ terminated
@@ -768,8 +845,7 @@ function! GetPhpIndent()
let AntepenultimateLine = getline(plinnum)
- let last_line = substitute(last_line,"\\(//\\|#\\)\\(\\(\\([^\"']*\\([\"']\\)[^\"']*\\5\\)\\+[^\"']*$\\)\\|\\([^\"']*$\\)\\)",'','')
-
+ let last_line = StripEndlineComments(last_line)
if ind == b:PHP_default_indenting
if last_line =~ terminated && last_line !~# s:defaultORcase
@@ -779,44 +855,53 @@ function! GetPhpIndent()
if !LastLineClosed
+ let openedparent = -1
+
- if last_line =~# '[{(\[]'.endline || last_line =~? '\h\w*\s*(.*,$' && AntepenultimateLine !~ '[,(\[]'.endline
+ if last_line =~# '[{(\[]'.endline || last_line =~? '\h\w*\s*(.*,$' && AntepenultimateLine !~ '[,(\[]'.endline && BalanceDirection(last_line) > 0
let dontIndent = 0
- if last_line =~ '\S\+\s*{'.endline && last_line !~ '^\s*)\s*{'.endline && last_line !~ '^\s*\%(' . s:blockstart . '\)\|'. s:functionDecl . s:endline
+ if last_line =~ '\S\+\s*{'.endline && last_line !~ '^\s*[)\]]\+\(\s*:\s*'.s:PHP_validVariable.'\)\=\s*{'.endline && last_line !~ s:structureHead
let dontIndent = 1
endif
if !dontIndent && (!b:PHP_BracesAtCodeLevel || last_line !~# '^\s*{')
- let ind = ind + s:sw()
+ let ind = ind + shiftwidth()
endif
if b:PHP_BracesAtCodeLevel || b:PHP_vintage_case_default_indent == 1
let b:PHP_CurrentIndentLevel = ind
- return ind + addSpecial
endif
- elseif last_line =~ '\S\+\s*),'.endline
+ elseif last_line =~ '),'.endline && BalanceDirection(last_line) < 0
call cursor(lnum, 1)
- call search('),'.endline, 'W')
+ call searchpos('),'.endline, 'cW')
let openedparent = searchpair('(', '', ')', 'bW', 'Skippmatch()')
if openedparent != lnum
let ind = indent(openedparent)
endif
- elseif last_line =~ '^\s*'.s:blockstart
- let ind = ind + s:sw()
+ elseif last_line =~ s:structureHead
+ let ind = ind + shiftwidth()
+
+
+ elseif AntepenultimateLine =~ '{'.endline && AntepenultimateLine !~? '^\s*use\>' || AntepenultimateLine =~ terminated || AntepenultimateLine =~# s:defaultORcase
+ let ind = ind + shiftwidth()
+ endif
- elseif AntepenultimateLine =~ '{'.endline || AntepenultimateLine =~ terminated || AntepenultimateLine =~# s:defaultORcase
- let ind = ind + s:sw()
+ if openedparent >= 0
+ let last_line = StripEndlineComments(getline(openedparent))
endif
+ endif
+ if cline =~ '^\s*[)\]];\='
+ let ind = ind - shiftwidth()
endif
- if cline =~ '^\s*[)\]];\='
- let ind = ind - s:sw()
+ if last_line =~ '^\s*->' && last_line !~? s:structureHead && BalanceDirection(last_line) <= 0
+ let ind = ind - shiftwidth()
endif
let b:PHP_CurrentIndentLevel = ind
diff --git a/runtime/indent/postscr.vim b/runtime/indent/postscr.vim
index b0ff48e682..2592bcf62f 100644
--- a/runtime/indent/postscr.vim
+++ b/runtime/indent/postscr.vim
@@ -41,16 +41,16 @@ function! PostscrIndentGet(lnum)
" Indent for dicts, arrays, and saves with possible trailing comment
if pline =~ '\(begin\|<<\|g\=save\|{\|[\)\s*\(%.*\)\=$'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
" Remove indent for popped dicts, and restores.
if pline =~ '\(end\|g\=restore\)\s*$'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
" Else handle immediate dedents of dicts, restores, and arrays.
elseif getline(a:lnum) =~ '\(end\|>>\|g\=restore\|}\|]\)'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
" Else handle DSC comments - always start of line.
elseif getline(a:lnum) =~ '^\s*%%'
diff --git a/runtime/indent/pov.vim b/runtime/indent/pov.vim
index 2b197635a1..e806756c8e 100644
--- a/runtime/indent/pov.vim
+++ b/runtime/indent/pov.vim
@@ -1,7 +1,7 @@
" Vim indent file
" Language: PoV-Ray Scene Description Language
" Maintainer: David Necas (Yeti) <yeti@physics.muni.cz>
-" Last Change: 2002-10-20
+" Last Change: 2017 Jun 13
" URI: http://trific.ath.cx/Ftp/vim/indent/pov.vim
" Only load this indent file when no other was loaded.
@@ -75,9 +75,9 @@ function GetPoVRayIndent()
" opening line.
let cur = s:MatchCount(v:lnum, '^\s*\%(#\s*\%(end\|else\)\>\|[]})]\)')
if cur > 0
- let final = plind + (chg - cur) * &sw
+ let final = plind + (chg - cur) * shiftwidth()
else
- let final = plind + chg * &sw
+ let final = plind + chg * shiftwidth()
endif
return final < 0 ? 0 : final
diff --git a/runtime/indent/prolog.vim b/runtime/indent/prolog.vim
index afe448e8f3..ecd0894166 100644
--- a/runtime/indent/prolog.vim
+++ b/runtime/indent/prolog.vim
@@ -2,6 +2,7 @@
" Maintainer : Gergely Kontra <kgergely@mcl.hu>
" Revised on : 2002.02.18. 23:34:05
" Language : Prolog
+" Last change by: Takuya Fujiwara, 2018 Sep 23
" TODO:
" checking with respect to syntax highlighting
@@ -37,22 +38,30 @@ function! GetPrologIndent()
let ind = indent(pnum)
" Previous line was comment -> use previous line's indent
if pline =~ '^\s*%'
- retu ind
+ return ind
+ endif
+ " Previous line was the start of block comment -> +1 after '/*' comment
+ if pline =~ '^\s*/\*'
+ return ind + 1
+ endif
+ " Previous line was the end of block comment -> -1 after '*/' comment
+ if pline =~ '^\s*\*/'
+ return ind - 1
endif
" Check for clause head on previous line
- if pline =~ ':-\s*\(%.*\)\?$'
- let ind = ind + &sw
+ if pline =~ '\%(:-\|-->\)\s*\(%.*\)\?$'
+ let ind = ind + shiftwidth()
" Check for end of clause on previous line
elseif pline =~ '\.\s*\(%.*\)\?$'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
" Check for opening conditional on previous line
if pline =~ '^\s*\([(;]\|->\)'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
" Check for closing an unclosed paren, or middle ; or ->
if line =~ '^\s*\([);]\|->\)'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
return ind
endfunction
diff --git a/runtime/indent/python.vim b/runtime/indent/python.vim
index 4ce3c234a5..7ab3cb9f50 100644
--- a/runtime/indent/python.vim
+++ b/runtime/indent/python.vim
@@ -53,6 +53,11 @@ function GetPythonIndent(lnum)
return 0
endif
+ " searchpair() can be slow sometimes, limit the time to 100 msec or what is
+ " put in g:pyindent_searchpair_timeout
+ let searchpair_stopline = 0
+ let searchpair_timeout = get(g:, 'pyindent_searchpair_timeout', 150)
+
" If the previous line is inside parenthesis, use the indent of the starting
" line.
" Trick: use the non-existing "dummy" variable to break out of the loop when
@@ -61,7 +66,8 @@ function GetPythonIndent(lnum)
let parlnum = searchpair('(\|{\|\[', '', ')\|}\|\]', 'nbW',
\ "line('.') < " . (plnum - s:maxoff) . " ? dummy :"
\ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
- \ . " =~ '\\(Comment\\|Todo\\|String\\)$'")
+ \ . " =~ '\\(Comment\\|Todo\\|String\\)$'",
+ \ searchpair_stopline, searchpair_timeout)
if parlnum > 0
let plindent = indent(parlnum)
let plnumstart = parlnum
@@ -80,14 +86,16 @@ function GetPythonIndent(lnum)
let p = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW',
\ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :"
\ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
- \ . " =~ '\\(Comment\\|Todo\\|String\\)$'")
+ \ . " =~ '\\(Comment\\|Todo\\|String\\)$'",
+ \ searchpair_stopline, searchpair_timeout)
if p > 0
if p == plnum
" When the start is inside parenthesis, only indent one 'shiftwidth'.
let pp = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW',
\ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :"
\ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
- \ . " =~ '\\(Comment\\|Todo\\|String\\)$'")
+ \ . " =~ '\\(Comment\\|Todo\\|String\\)$'",
+ \ searchpair_stopline, searchpair_timeout)
if pp > 0
return indent(plnum) + (exists("g:pyindent_nested_paren") ? eval(g:pyindent_nested_paren) : shiftwidth())
endif
diff --git a/runtime/indent/r.vim b/runtime/indent/r.vim
index 01f3812ed2..ca85a2e62d 100644
--- a/runtime/indent/r.vim
+++ b/runtime/indent/r.vim
@@ -2,7 +2,7 @@
" Language: R
" Author: Jakson Alves de Aquino <jalvesaq@gmail.com>
" Homepage: https://github.com/jalvesaq/R-Vim-runtime
-" Last Change: Thu Feb 18, 2016 06:32AM
+" Last Change: Sun Aug 19, 2018 09:13PM
" Only load this indent file when no other was loaded.
@@ -19,22 +19,16 @@ if exists("*GetRIndent")
finish
endif
+let s:cpo_save = &cpo
+set cpo&vim
+
" Options to make the indentation more similar to Emacs/ESS:
-if !exists("g:r_indent_align_args")
- let g:r_indent_align_args = 1
-endif
-if !exists("g:r_indent_ess_comments")
- let g:r_indent_ess_comments = 0
-endif
-if !exists("g:r_indent_comment_column")
- let g:r_indent_comment_column = 40
-endif
-if ! exists("g:r_indent_ess_compatible")
- let g:r_indent_ess_compatible = 0
-endif
-if ! exists("g:r_indent_op_pattern")
- let g:r_indent_op_pattern = '\(&\||\|+\|-\|\*\|/\|=\|\~\|%\|->\)\s*$'
-endif
+let g:r_indent_align_args = get(g:, 'r_indent_align_args', 1)
+let g:r_indent_ess_comments = get(g:, 'r_indent_ess_comments', 0)
+let g:r_indent_comment_column = get(g:, 'r_indent_comment_column', 40)
+let g:r_indent_ess_compatible = get(g:, 'r_indent_ess_compatible', 0)
+let g:r_indent_op_pattern = get(g:, 'r_indent_op_pattern',
+ \ '\(&\||\|+\|-\|\*\|/\|=\|\~\|%\|->\)\s*$')
function s:RDelete_quotes(line)
let i = 0
@@ -231,7 +225,7 @@ function GetRIndent()
let cline = SanitizeRLine(cline)
- if cline =~ '^\s*}' || cline =~ '^\s*}\s*)$'
+ if cline =~ '^\s*}'
let indline = s:Get_matching_brace(clnum, '{', '}', 1)
if indline > 0 && indline != clnum
let iline = SanitizeRLine(getline(indline))
@@ -244,6 +238,11 @@ function GetRIndent()
endif
endif
+ if cline =~ '^\s*)$'
+ let indline = s:Get_matching_brace(clnum, '(', ')', 1)
+ return indent(indline)
+ endif
+
" Find the first non blank line above the current line
let lnum = s:Get_prev_line(clnum)
" Hit the start of the file, use zero indent.
@@ -274,7 +273,7 @@ function GetRIndent()
let nlnum = s:Get_prev_line(nlnum)
let nline = SanitizeRLine(getline(nlnum)) . nline
endwhile
- if nline =~ '^\s*function\s*(' && indent(nlnum) == &sw
+ if nline =~ '^\s*function\s*(' && indent(nlnum) == shiftwidth()
return 0
endif
endif
@@ -285,7 +284,7 @@ function GetRIndent()
" line is an incomplete command:
if line =~ '\<\(if\|while\|for\|function\)\s*()$' || line =~ '\<else$' || line =~ '<-$' || line =~ '->$'
- return indent(lnum) + &sw
+ return indent(lnum) + shiftwidth()
endif
" Deal with () and []
@@ -293,14 +292,14 @@ function GetRIndent()
let pb = s:Get_paren_balance(line, '(', ')')
if line =~ '^\s*{$' || line =~ '(\s*{' || (pb == 0 && (line =~ '{$' || line =~ '(\s*{$'))
- return indent(lnum) + &sw
+ return indent(lnum) + shiftwidth()
endif
let s:curtabstop = repeat(' ', &tabstop)
if g:r_indent_align_args == 1
if pb > 0 && line =~ '{$'
- return s:Get_last_paren_idx(line, '(', ')', pb) + &sw
+ return s:Get_last_paren_idx(line, '(', ')', pb) + shiftwidth()
endif
let bb = s:Get_paren_balance(line, '[', ']')
@@ -364,11 +363,11 @@ function GetRIndent()
if oline =~ g:r_indent_op_pattern && s:Get_paren_balance(line, "(", ")") == 0
return indent(lnum)
else
- return indent(lnum) + &sw
+ return indent(lnum) + shiftwidth()
endif
else
if oline =~ g:r_indent_op_pattern && s:Get_paren_balance(line, "(", ")") == 0
- return indent(lnum) - &sw
+ return indent(lnum) - shiftwidth()
endif
endif
endif
@@ -383,7 +382,7 @@ function GetRIndent()
let line = linepiece . line
endwhile
if line =~ '{$' && post_block == 0
- return indent(lnum) + &sw
+ return indent(lnum) + shiftwidth()
endif
" Now we can do some tests again
@@ -393,19 +392,19 @@ function GetRIndent()
if post_block == 0
let newl = SanitizeRLine(line)
if newl =~ '\<\(if\|while\|for\|function\)\s*()$' || newl =~ '\<else$' || newl =~ '<-$'
- return indent(lnum) + &sw
+ return indent(lnum) + shiftwidth()
endif
endif
endif
if cline =~ '^\s*else'
if line =~ '<-\s*if\s*()'
- return indent(lnum) + &sw
+ return indent(lnum) + shiftwidth()
else
if line =~ '\<if\s*()'
return indent(lnum)
else
- return indent(lnum) - &sw
+ return indent(lnum) - shiftwidth()
endif
endif
endif
@@ -474,12 +473,12 @@ function GetRIndent()
let ind = indent(lnum)
if g:r_indent_align_args == 0 && pb != 0
- let ind += pb * &sw
+ let ind += pb * shiftwidth()
return ind
endif
if g:r_indent_align_args == 0 && bb != 0
- let ind += bb * &sw
+ let ind += bb * shiftwidth()
return ind
endif
@@ -489,7 +488,7 @@ function GetRIndent()
let pind = 0
endif
- if ind == pind || (ind == (pind + &sw) && pline =~ '{$' && ppost_else == 0)
+ if ind == pind || (ind == (pind + shiftwidth()) && pline =~ '{$' && ppost_else == 0)
return ind
endif
@@ -509,13 +508,15 @@ function GetRIndent()
let pbb = s:Get_paren_balance(pline, '[', ']')
endwhile
let pind = indent(plnum)
- if ind == (pind + &sw) && pline =~ '{$'
+ if ind == (pind + shiftwidth()) && pline =~ '{$'
return ind
endif
endwhile
return ind
-
endfunction
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
" vim: sw=2
diff --git a/runtime/indent/readline.vim b/runtime/indent/readline.vim
index 6ac2185bdc..e202ddfd89 100644
--- a/runtime/indent/readline.vim
+++ b/runtime/indent/readline.vim
@@ -1,7 +1,7 @@
" Vim indent file
-" Language: readline configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-12-20
+" Language: readline configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-20
if exists("b:did_indent")
finish
@@ -25,11 +25,11 @@ function GetReadlineIndent()
let ind = indent(lnum)
if getline(lnum) =~ '^\s*$\(if\|else\)\>'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
if getline(v:lnum) =~ '^\s*$\(else\|endif\)\>'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
return ind
diff --git a/runtime/indent/rhelp.vim b/runtime/indent/rhelp.vim
index 9dc2031cb6..cf69ae3392 100644
--- a/runtime/indent/rhelp.vim
+++ b/runtime/indent/rhelp.vim
@@ -82,7 +82,7 @@ function GetRHelpIndent()
let closeb = strlen(line2) - strlen(line3)
let bb = openb - closeb
- let ind = indent(lnum) + (bb * &sw)
+ let ind = indent(lnum) + (bb * shiftwidth())
if line =~ '^\s*}\s*$'
let ind = indent(lnum)
diff --git a/runtime/indent/rmd.vim b/runtime/indent/rmd.vim
index 88904405e8..182b07cbaa 100644
--- a/runtime/indent/rmd.vim
+++ b/runtime/indent/rmd.vim
@@ -2,7 +2,7 @@
" Language: Rmd
" Author: Jakson Alves de Aquino <jalvesaq@gmail.com>
" Homepage: https://github.com/jalvesaq/R-Vim-runtime
-" Last Change: Tue Apr 07, 2015 04:38PM
+" Last Change: Sun Aug 19, 2018 09:14PM
" Only load this indent file when no other was loaded.
@@ -20,7 +20,10 @@ if exists("*GetRmdIndent")
finish
endif
-function GetMdIndent()
+let s:cpo_save = &cpo
+set cpo&vim
+
+function s:GetMdIndent()
let pline = getline(v:lnum - 1)
let cline = getline(v:lnum)
if prevnonblank(v:lnum - 1) < v:lnum - 1 || cline =~ '^\s*[-\+\*]\s' || cline =~ '^\s*\d\+\.\s\+'
@@ -33,15 +36,31 @@ function GetMdIndent()
return indent(prevnonblank(v:lnum - 1))
endfunction
+function s:GetYamlIndent()
+ let pline = getline(v:lnum - 1)
+ if pline =~ ':\s*$'
+ return indent(v:lnum) + &sw
+ elseif pline =~ '^\s*- '
+ return indent(v:lnum) + 2
+ endif
+ return indent(prevnonblank(v:lnum - 1))
+endfunction
+
function GetRmdIndent()
if getline(".") =~ '^[ \t]*```{r .*}$' || getline(".") =~ '^[ \t]*```$'
return 0
endif
if search('^[ \t]*```{r', "bncW") > search('^[ \t]*```$', "bncW")
return s:RIndent()
+ elseif v:lnum > 1 && search('^---$', "bnW") == 1 &&
+ \ (search('^---$', "nW") > v:lnum || search('^...$', "nW") > v:lnum)
+ return s:GetYamlIndent()
else
- return GetMdIndent()
+ return s:GetMdIndent()
endif
endfunction
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
" vim: sw=2
diff --git a/runtime/indent/rnoweb.vim b/runtime/indent/rnoweb.vim
index 29fa5bc78f..73966868b8 100644
--- a/runtime/indent/rnoweb.vim
+++ b/runtime/indent/rnoweb.vim
@@ -2,7 +2,7 @@
" Language: Rnoweb
" Author: Jakson Alves de Aquino <jalvesaq@gmail.com>
" Homepage: https://github.com/jalvesaq/R-Vim-runtime
-" Last Change: Tue Apr 07, 2015 04:38PM
+" Last Change: Fri Apr 15, 2016 10:58PM
" Only load this indent file when no other was loaded.
@@ -10,8 +10,18 @@ if exists("b:did_indent")
finish
endif
runtime indent/tex.vim
-let s:TeXIndent = function(substitute(&indentexpr, "()", "", ""))
-unlet b:did_indent
+
+function! s:NoTeXIndent()
+ return indent(line("."))
+endfunction
+
+if &indentexpr == "" || &indentexpr == "GetRnowebIndent()"
+ let s:TeXIndent = function("s:NoTeXIndent")
+else
+ let s:TeXIndent = function(substitute(&indentexpr, "()", "", ""))
+endif
+
+unlet! b:did_indent
runtime indent/r.vim
let s:RIndent = function(substitute(&indentexpr, "()", "", ""))
let b:did_indent = 1
diff --git a/runtime/indent/rpl.vim b/runtime/indent/rpl.vim
index 07bfd06590..fab258ed2b 100644
--- a/runtime/indent/rpl.vim
+++ b/runtime/indent/rpl.vim
@@ -1,7 +1,7 @@
" Vim indent file
" Language: RPL/2
" Version: 0.2
-" Last Change: 2005 Mar 28
+" Last Change: 2017 Jun 13
" Maintainer: BERTRAND Jo๋l <rpl2@free.fr>
" Only load this indent file when no other was loaded.
@@ -32,16 +32,16 @@ function RplGetIndent(lnum)
if prevstat =~? '\<\(if\|iferr\|do\|while\)\>' && prevstat =~? '\<end\>'
elseif prevstat =~? '\(^\|\s\+\)<<\($\|\s\+\)' && prevstat =~? '\s\+>>\($\|\s\+\)'
elseif prevstat =~? '\<\(if\|iferr\|then\|else\|elseif\|select\|case\|do\|until\|while\|repeat\|for\|start\|default\)\>' || prevstat =~? '\(^\|\s\+\)<<\($\|\s\+\)'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
" Subtract a shiftwidth from then, else, elseif, end, until, repeat, next,
" step
let line = getline(v:lnum)
if line =~? '^\s*\(then\|else\|elseif\|until\|repeat\|next\|step\|default\|end\)\>'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
elseif line =~? '^\s*>>\($\|\s\+\)'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
return ind
diff --git a/runtime/indent/rst.vim b/runtime/indent/rst.vim
index 80d3308fd8..c1ef8c9957 100644
--- a/runtime/indent/rst.vim
+++ b/runtime/indent/rst.vim
@@ -1,7 +1,7 @@
" Vim indent file
-" Language: reStructuredText Documentation Format
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2011-08-03
+" Language: reStructuredText Documentation Format
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2011-08-03
if exists("b:did_indent")
finish
diff --git a/runtime/indent/ruby.vim b/runtime/indent/ruby.vim
index 095b3a43c6..d8733db305 100644
--- a/runtime/indent/ruby.vim
+++ b/runtime/indent/ruby.vim
@@ -13,12 +13,23 @@ if exists("b:did_indent")
endif
let b:did_indent = 1
+if !exists('g:ruby_indent_access_modifier_style')
+ " Possible values: "normal", "indent", "outdent"
+ let g:ruby_indent_access_modifier_style = 'normal'
+endif
+
+if !exists('g:ruby_indent_block_style')
+ " Possible values: "expression", "do"
+ let g:ruby_indent_block_style = 'expression'
+endif
+
setlocal nosmartindent
" Now, set up our indentation expression and keys that trigger it.
setlocal indentexpr=GetRubyIndent(v:lnum)
-setlocal indentkeys=0{,0},0),0],!^F,o,O,e
+setlocal indentkeys=0{,0},0),0],!^F,o,O,e,:,.
setlocal indentkeys+==end,=else,=elsif,=when,=ensure,=rescue,==begin,==end
+setlocal indentkeys+==private,=protected,=public
" Only define the function once.
if exists("*GetRubyIndent")
@@ -34,7 +45,7 @@ set cpo&vim
" Regex of syntax group names that are or delimit strings/symbols or are comments.
let s:syng_strcom = '\<ruby\%(Regexp\|RegexpDelimiter\|RegexpEscape' .
\ '\|Symbol\|String\|StringDelimiter\|StringEscape\|ASCIICode' .
- \ '\|Interpolation\|NoInterpolation\|Comment\|Documentation\)\>'
+ \ '\|Interpolation\|InterpolationDelimiter\|NoInterpolation\|Comment\|Documentation\)\>'
" Regex of syntax group names that are strings.
let s:syng_string =
@@ -49,9 +60,10 @@ let s:skip_expr =
\ "synIDattr(synID(line('.'),col('.'),1),'name') =~ '".s:syng_strcom."'"
" Regex used for words that, at the start of a line, add a level of indent.
-let s:ruby_indent_keywords = '^\s*\zs\<\%(module\|class\|def\|if\|for' .
- \ '\|while\|until\|else\|elsif\|case\|when\|unless\|begin\|ensure' .
- \ '\|rescue\):\@!\>' .
+let s:ruby_indent_keywords =
+ \ '^\s*\zs\<\%(module\|class\|if\|for' .
+ \ '\|while\|until\|else\|elsif\|case\|when\|unless\|begin\|ensure\|rescue' .
+ \ '\|\%(public\|protected\|private\)\=\s*def\):\@!\>' .
\ '\|\%([=,*/%+-]\|<<\|>>\|:\s\)\s*\zs' .
\ '\<\%(if\|for\|while\|until\|case\|unless\|begin\):\@!\>'
@@ -64,7 +76,8 @@ let s:ruby_deindent_keywords =
" TODO: the do here should be restricted somewhat (only at end of line)?
let s:end_start_regex =
\ '\C\%(^\s*\|[=,*/%+\-|;{]\|<<\|>>\|:\s\)\s*\zs' .
- \ '\<\%(module\|class\|def\|if\|for\|while\|until\|case\|unless\|begin\):\@!\>' .
+ \ '\<\%(module\|class\|if\|for\|while\|until\|case\|unless\|begin' .
+ \ '\|\%(public\|protected\|private\)\=\s*def\):\@!\>' .
\ '\|\%(^\|[^.:@$]\)\@<=\<do:\@!\>'
" Regex that defines the middle-match for the 'end' keyword.
@@ -79,19 +92,39 @@ let s:end_skip_expr = s:skip_expr .
\ ' && getline(".") =~ "^\\s*\\<\\(while\\|until\\|for\\):\\@!\\>")'
" Regex that defines continuation lines, not including (, {, or [.
-let s:non_bracket_continuation_regex = '\%([\\.,:*/%+]\|\<and\|\<or\|\%(<%\)\@<![=-]\|\W[|&?]\|||\|&&\)\s*\%(#.*\)\=$'
+let s:non_bracket_continuation_regex =
+ \ '\%([\\.,:*/%+]\|\<and\|\<or\|\%(<%\)\@<![=-]\|:\@<![^[:alnum:]:][|&?]\|||\|&&\)\s*\%(#.*\)\=$'
" Regex that defines continuation lines.
-" TODO: this needs to deal with if ...: and so on
let s:continuation_regex =
- \ '\%(%\@<![({[\\.,:*/%+]\|\<and\|\<or\|\%(<%\)\@<![=-]\|\W[|&?]\|||\|&&\)\s*\%(#.*\)\=$'
+ \ '\%(%\@<![({[\\.,:*/%+]\|\<and\|\<or\|\%(<%\)\@<![=-]\|:\@<![^[:alnum:]:][|&?]\|||\|&&\)\s*\%(#.*\)\=$'
+
+" Regex that defines continuable keywords
+let s:continuable_regex =
+ \ '\C\%(^\s*\|[=,*/%+\-|;{]\|<<\|>>\|:\s\)\s*\zs' .
+ \ '\<\%(if\|for\|while\|until\|unless\):\@!\>'
" Regex that defines bracket continuations
let s:bracket_continuation_regex = '%\@<!\%([({[]\)\s*\%(#.*\)\=$'
+" Regex that defines dot continuations
+let s:dot_continuation_regex = '%\@<!\.\s*\%(#.*\)\=$'
+
+" Regex that defines backslash continuations
+let s:backslash_continuation_regex = '%\@<!\\\s*$'
+
+" Regex that defines end of bracket continuation followed by another continuation
+let s:bracket_switch_continuation_regex = '^\([^(]\+\zs).\+\)\+'.s:continuation_regex
+
" Regex that defines the first part of a splat pattern
let s:splat_regex = '[[,(]\s*\*\s*\%(#.*\)\=$'
+" Regex that describes all indent access modifiers
+let s:access_modifier_regex = '\C^\s*\%(public\|protected\|private\)\s*\%(#.*\)\=$'
+
+" Regex that describes the indent access modifiers (excludes public)
+let s:indent_access_modifier_regex = '\C^\s*\%(protected\|private\)\s*\%(#.*\)\=$'
+
" Regex that defines blocks.
"
" Note that there's a slight problem with this regex and s:continuation_regex.
@@ -102,10 +135,13 @@ let s:splat_regex = '[[,(]\s*\*\s*\%(#.*\)\=$'
" The reason is that the pipe matches a hanging "|" operator.
"
let s:block_regex =
- \ '\%(\<do:\@!\>\|%\@<!{\)\s*\%(|\s*(*\s*\%([*@&]\=\h\w*,\=\s*\)\%(,\s*(*\s*[*@&]\=\h\w*\s*)*\s*\)*|\)\=\s*\%(#.*\)\=$'
+ \ '\%(\<do:\@!\>\|%\@<!{\)\s*\%(|[^|]*|\)\=\s*\%(#.*\)\=$'
let s:block_continuation_regex = '^\s*[^])}\t ].*'.s:block_regex
+" Regex that describes a leading operator (only a method call's dot for now)
+let s:leading_operator_regex = '^\s*[.]'
+
" 2. Auxiliary Functions {{{1
" ======================
@@ -165,7 +201,21 @@ function s:GetMSL(lnum)
" Otherwise, terminate search as we have found our MSL already.
let line = getline(lnum)
- if s:Match(lnum, s:splat_regex)
+ if !s:Match(msl, s:backslash_continuation_regex) &&
+ \ s:Match(lnum, s:backslash_continuation_regex)
+ " If the current line doesn't end in a backslash, but the previous one
+ " does, look for that line's msl
+ "
+ " Example:
+ " foo = "bar" \
+ " "baz"
+ "
+ let msl = lnum
+ elseif s:Match(msl, s:leading_operator_regex)
+ " If the current line starts with a leading operator, keep its indent
+ " and keep looking for an MSL.
+ let msl = lnum
+ elseif s:Match(lnum, s:splat_regex)
" If the above line looks like the "*" of a splat, use the current one's
" indentation.
"
@@ -175,7 +225,7 @@ function s:GetMSL(lnum)
" something
"
return msl
- elseif s:Match(line, s:non_bracket_continuation_regex) &&
+ elseif s:Match(lnum, s:non_bracket_continuation_regex) &&
\ s:Match(msl, s:non_bracket_continuation_regex)
" If the current line is a non-bracket continuation and so is the
" previous one, keep its indent and continue looking for an MSL.
@@ -186,6 +236,18 @@ function s:GetMSL(lnum)
" three
"
let msl = lnum
+ elseif s:Match(lnum, s:dot_continuation_regex) &&
+ \ (s:Match(msl, s:bracket_continuation_regex) || s:Match(msl, s:block_continuation_regex))
+ " If the current line is a bracket continuation or a block-starter, but
+ " the previous is a dot, keep going to see if the previous line is the
+ " start of another continuation.
+ "
+ " Example:
+ " parent.
+ " method_call {
+ " three
+ "
+ let msl = lnum
elseif s:Match(lnum, s:non_bracket_continuation_regex) &&
\ (s:Match(msl, s:bracket_continuation_regex) || s:Match(msl, s:block_continuation_regex))
" If the current line is a bracket continuation or a block-starter, but
@@ -299,18 +361,39 @@ function s:ExtraBrackets(lnum)
endfunction
function s:Match(lnum, regex)
- let col = match(getline(a:lnum), '\C'.a:regex) + 1
- return col > 0 && !s:IsInStringOrComment(a:lnum, col) ? col : 0
+ let line = getline(a:lnum)
+ let offset = match(line, '\C'.a:regex)
+ let col = offset + 1
+
+ while offset > -1 && s:IsInStringOrComment(a:lnum, col)
+ let offset = match(line, '\C'.a:regex, offset + 1)
+ let col = offset + 1
+ endwhile
+
+ if offset > -1
+ return col
+ else
+ return 0
+ endif
endfunction
-function s:MatchLast(lnum, regex)
- let line = getline(a:lnum)
- let col = match(line, '.*\zs' . a:regex)
- while col != -1 && s:IsInStringOrComment(a:lnum, col)
- let line = strpart(line, 0, col)
- let col = match(line, '.*' . a:regex)
+" Locates the containing class/module's definition line, ignoring nested classes
+" along the way.
+"
+function! s:FindContainingClass()
+ let saved_position = getpos('.')
+
+ while searchpair(s:end_start_regex, s:end_middle_regex, s:end_end_regex, 'bW',
+ \ s:end_skip_expr) > 0
+ if expand('<cword>') =~# '\<class\|module\>'
+ let found_lnum = line('.')
+ call setpos('.', saved_position)
+ return found_lnum
+ endif
endwhile
- return col + 1
+
+ call setpos('.', saved_position)
+ return 0
endfunction
" 3. GetRubyIndent Function {{{1
@@ -320,6 +403,9 @@ function GetRubyIndent(...)
" 3.1. Setup {{{2
" ----------
+ " The value of a single shift-width
+ let sw = shiftwidth()
+
" For the current line, use the first argument if given, else v:lnum
let clnum = a:0 ? a:1 : v:lnum
@@ -333,6 +419,24 @@ function GetRubyIndent(...)
let line = getline(clnum)
let ind = -1
+ " If this line is an access modifier keyword, align according to the closest
+ " class declaration.
+ if g:ruby_indent_access_modifier_style == 'indent'
+ if s:Match(clnum, s:access_modifier_regex)
+ let class_line = s:FindContainingClass()
+ if class_line > 0
+ return indent(class_line) + sw
+ endif
+ endif
+ elseif g:ruby_indent_access_modifier_style == 'outdent'
+ if s:Match(clnum, s:access_modifier_regex)
+ let class_line = s:FindContainingClass()
+ if class_line > 0
+ return indent(class_line)
+ endif
+ endif
+ endif
+
" If we got a closing bracket on an empty line, find its match and indent
" according to it. For parentheses we indent to its column - 1, for the
" others we indent to the containing line's MSL's level. Return -1 if fail.
@@ -343,7 +447,9 @@ function GetRubyIndent(...)
if searchpair(escape(bs[0], '\['), '', bs[1], 'bW', s:skip_expr) > 0
if line[col-1]==')' && col('.') != col('$') - 1
let ind = virtcol('.') - 1
- else
+ elseif g:ruby_indent_block_style == 'do'
+ let ind = indent(line('.'))
+ else " g:ruby_indent_block_style == 'expression'
let ind = indent(s:GetMSL(line('.')))
endif
endif
@@ -366,10 +472,17 @@ function GetRubyIndent(...)
if strpart(line, 0, col('.') - 1) =~ '=\s*$' &&
\ strpart(line, col('.') - 1, 2) !~ 'do'
+ " assignment to case/begin/etc, on the same line, hanging indent
let ind = virtcol('.') - 1
+ elseif g:ruby_indent_block_style == 'do'
+ " align to line of the "do", not to the MSL
+ let ind = indent(line('.'))
elseif getline(msl) =~ '=\s*\(#.*\)\=$'
+ " in the case of assignment to the MSL, align to the starting line,
+ " not to the MSL
let ind = indent(line('.'))
else
+ " align to the MSL
let ind = indent(msl)
endif
endif
@@ -389,6 +502,11 @@ function GetRubyIndent(...)
return 0
endif
+ " If the current line starts with a leading operator, add a level of indent.
+ if s:Match(clnum, s:leading_operator_regex)
+ return indent(s:GetMSL(clnum)) + sw
+ endif
+
" 3.3. Work on the previous line. {{{2
" -------------------------------
@@ -409,14 +527,50 @@ function GetRubyIndent(...)
let line = getline(lnum)
let ind = indent(lnum)
+ if g:ruby_indent_access_modifier_style == 'indent'
+ " If the previous line was a private/protected keyword, add a
+ " level of indent.
+ if s:Match(lnum, s:indent_access_modifier_regex)
+ return indent(lnum) + sw
+ endif
+ elseif g:ruby_indent_access_modifier_style == 'outdent'
+ " If the previous line was a private/protected/public keyword, add
+ " a level of indent, since the keyword has been out-dented.
+ if s:Match(lnum, s:access_modifier_regex)
+ return indent(lnum) + sw
+ endif
+ endif
+
+ if s:Match(lnum, s:continuable_regex) && s:Match(lnum, s:continuation_regex)
+ return indent(s:GetMSL(lnum)) + sw + sw
+ endif
+
" If the previous line ended with a block opening, add a level of indent.
if s:Match(lnum, s:block_regex)
- return indent(s:GetMSL(lnum)) + &sw
+ let msl = s:GetMSL(lnum)
+
+ if g:ruby_indent_block_style == 'do'
+ " don't align to the msl, align to the "do"
+ let ind = indent(lnum) + sw
+ elseif getline(msl) =~ '=\s*\(#.*\)\=$'
+ " in the case of assignment to the msl, align to the starting line,
+ " not to the msl
+ let ind = indent(lnum) + sw
+ else
+ let ind = indent(msl) + sw
+ endif
+ return ind
+ endif
+
+ " If the previous line started with a leading operator, use its MSL's level
+ " of indent
+ if s:Match(lnum, s:leading_operator_regex)
+ return indent(s:GetMSL(lnum))
endif
" If the previous line ended with the "*" of a splat, add a level of indent
if line =~ s:splat_regex
- return indent(lnum) + &sw
+ return indent(lnum) + sw
endif
" If the previous line contained unclosed opening brackets and we are still
@@ -431,22 +585,22 @@ function GetRubyIndent(...)
if opening.pos != -1
if opening.type == '(' && searchpair('(', '', ')', 'bW', s:skip_expr) > 0
if col('.') + 1 == col('$')
- return ind + &sw
+ return ind + sw
else
return virtcol('.')
endif
else
let nonspace = matchend(line, '\S', opening.pos + 1) - 1
- return nonspace > 0 ? nonspace : ind + &sw
+ return nonspace > 0 ? nonspace : ind + sw
endif
elseif closing.pos != -1
call cursor(lnum, closing.pos + 1)
normal! %
if s:Match(line('.'), s:ruby_indent_keywords)
- return indent('.') + &sw
+ return indent('.') + sw
else
- return indent('.')
+ return indent(s:GetMSL(line('.')))
endif
else
call cursor(clnum, vcol)
@@ -473,7 +627,7 @@ function GetRubyIndent(...)
let col = s:Match(lnum, s:ruby_indent_keywords)
if col > 0
call cursor(lnum, col)
- let ind = virtcol('.') - 1 + &sw
+ let ind = virtcol('.') - 1 + sw
" TODO: make this better (we need to count them) (or, if a searchpair
" fails, we know that something is lacking an end and thus we indent a
" level
@@ -490,10 +644,14 @@ function GetRubyIndent(...)
let p_lnum = lnum
let lnum = s:GetMSL(lnum)
- " If the previous line wasn't a MSL and is continuation return its indent.
- " TODO: the || s:IsInString() thing worries me a bit.
+ " If the previous line wasn't a MSL.
if p_lnum != lnum
- if s:Match(p_lnum, s:non_bracket_continuation_regex) || s:IsInString(p_lnum,strlen(line))
+ " If previous line ends bracket and begins non-bracket continuation decrease indent by 1.
+ if s:Match(p_lnum, s:bracket_switch_continuation_regex)
+ return ind - 1
+ " If previous line is a continuation return its indent.
+ " TODO: the || s:IsInString() thing worries me a bit.
+ elseif s:Match(p_lnum, s:non_bracket_continuation_regex) || s:IsInString(p_lnum,strlen(line))
return ind
endif
endif
@@ -506,9 +664,9 @@ function GetRubyIndent(...)
" TODO: this does not take into account contrived things such as
" module Foo; class Bar; end
if s:Match(lnum, s:ruby_indent_keywords)
- let ind = msl_ind + &sw
+ let ind = msl_ind + sw
if s:Match(lnum, s:end_end_regex)
- let ind = ind - &sw
+ let ind = ind - sw
endif
return ind
endif
@@ -517,7 +675,7 @@ function GetRubyIndent(...)
" closing bracket, indent one extra level.
if s:Match(lnum, s:non_bracket_continuation_regex) && !s:Match(lnum, '^\s*\([\])}]\|end\)')
if lnum == p_lnum
- let ind = msl_ind + &sw
+ let ind = msl_ind + sw
else
let ind = msl_ind
endif
diff --git a/runtime/indent/rust.vim b/runtime/indent/rust.vim
new file mode 100644
index 0000000000..d30629b64e
--- /dev/null
+++ b/runtime/indent/rust.vim
@@ -0,0 +1,213 @@
+" Vim indent file
+" Language: Rust
+" Author: Chris Morgan <me@chrismorgan.info>
+" Last Change: 2017 Jun 13
+" For bugs, patches and license go to https://github.com/rust-lang/rust.vim
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal cindent
+setlocal cinoptions=L0,(0,Ws,J1,j1
+setlocal cinkeys=0{,0},!^F,o,O,0[,0]
+" Don't think cinwords will actually do anything at all... never mind
+setlocal cinwords=for,if,else,while,loop,impl,mod,unsafe,trait,struct,enum,fn,extern
+
+" Some preliminary settings
+setlocal nolisp " Make sure lisp indenting doesn't supersede us
+setlocal autoindent " indentexpr isn't much help otherwise
+" Also do indentkeys, otherwise # gets shoved to column 0 :-/
+setlocal indentkeys=0{,0},!^F,o,O,0[,0]
+
+setlocal indentexpr=GetRustIndent(v:lnum)
+
+" Only define the function once.
+if exists("*GetRustIndent")
+ finish
+endif
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+" Come here when loading the script the first time.
+
+function! s:get_line_trimmed(lnum)
+ " Get the line and remove a trailing comment.
+ " Use syntax highlighting attributes when possible.
+ " NOTE: this is not accurate; /* */ or a line continuation could trick it
+ let line = getline(a:lnum)
+ let line_len = strlen(line)
+ if has('syntax_items')
+ " If the last character in the line is a comment, do a binary search for
+ " the start of the comment. synID() is slow, a linear search would take
+ " too long on a long line.
+ if synIDattr(synID(a:lnum, line_len, 1), "name") =~ 'Comment\|Todo'
+ let min = 1
+ let max = line_len
+ while min < max
+ let col = (min + max) / 2
+ if synIDattr(synID(a:lnum, col, 1), "name") =~ 'Comment\|Todo'
+ let max = col
+ else
+ let min = col + 1
+ endif
+ endwhile
+ let line = strpart(line, 0, min - 1)
+ endif
+ return substitute(line, "\s*$", "", "")
+ else
+ " Sorry, this is not complete, nor fully correct (e.g. string "//").
+ " Such is life.
+ return substitute(line, "\s*//.*$", "", "")
+ endif
+endfunction
+
+function! s:is_string_comment(lnum, col)
+ if has('syntax_items')
+ for id in synstack(a:lnum, a:col)
+ let synname = synIDattr(id, "name")
+ if synname == "rustString" || synname =~ "^rustComment"
+ return 1
+ endif
+ endfor
+ else
+ " without syntax, let's not even try
+ return 0
+ endif
+endfunction
+
+function GetRustIndent(lnum)
+
+ " Starting assumption: cindent (called at the end) will do it right
+ " normally. We just want to fix up a few cases.
+
+ let line = getline(a:lnum)
+
+ if has('syntax_items')
+ let synname = synIDattr(synID(a:lnum, 1, 1), "name")
+ if synname == "rustString"
+ " If the start of the line is in a string, don't change the indent
+ return -1
+ elseif synname =~ '\(Comment\|Todo\)'
+ \ && line !~ '^\s*/\*' " not /* opening line
+ if synname =~ "CommentML" " multi-line
+ if line !~ '^\s*\*' && getline(a:lnum - 1) =~ '^\s*/\*'
+ " This is (hopefully) the line after a /*, and it has no
+ " leader, so the correct indentation is that of the
+ " previous line.
+ return GetRustIndent(a:lnum - 1)
+ endif
+ endif
+ " If it's in a comment, let cindent take care of it now. This is
+ " for cases like "/*" where the next line should start " * ", not
+ " "* " as the code below would otherwise cause for module scope
+ " Fun fact: " /*\n*\n*/" takes two calls to get right!
+ return cindent(a:lnum)
+ endif
+ endif
+
+ " cindent gets second and subsequent match patterns/struct members wrong,
+ " as it treats the comma as indicating an unfinished statement::
+ "
+ " match a {
+ " b => c,
+ " d => e,
+ " f => g,
+ " };
+
+ " Search backwards for the previous non-empty line.
+ let prevlinenum = prevnonblank(a:lnum - 1)
+ let prevline = s:get_line_trimmed(prevlinenum)
+ while prevlinenum > 1 && prevline !~ '[^[:blank:]]'
+ let prevlinenum = prevnonblank(prevlinenum - 1)
+ let prevline = s:get_line_trimmed(prevlinenum)
+ endwhile
+
+ " Handle where clauses nicely: subsequent values should line up nicely.
+ if prevline[len(prevline) - 1] == ","
+ \ && prevline =~# '^\s*where\s'
+ return indent(prevlinenum) + 6
+ endif
+
+ if prevline[len(prevline) - 1] == ","
+ \ && s:get_line_trimmed(a:lnum) !~ '^\s*[\[\]{}]'
+ \ && prevline !~ '^\s*fn\s'
+ \ && prevline !~ '([^()]\+,$'
+ \ && s:get_line_trimmed(a:lnum) !~ '^\s*\S\+\s*=>'
+ " Oh ho! The previous line ended in a comma! I bet cindent will try to
+ " take this too far... For now, let's normally use the previous line's
+ " indent.
+
+ " One case where this doesn't work out is where *this* line contains
+ " square or curly brackets; then we normally *do* want to be indenting
+ " further.
+ "
+ " Another case where we don't want to is one like a function
+ " definition with arguments spread over multiple lines:
+ "
+ " fn foo(baz: Baz,
+ " baz: Baz) // <-- cindent gets this right by itself
+ "
+ " Another case is similar to the previous, except calling a function
+ " instead of defining it, or any conditional expression that leaves
+ " an open paren:
+ "
+ " foo(baz,
+ " baz);
+ "
+ " if baz && (foo ||
+ " bar) {
+ "
+ " Another case is when the current line is a new match arm.
+ "
+ " There are probably other cases where we don't want to do this as
+ " well. Add them as needed.
+ return indent(prevlinenum)
+ endif
+
+ if !has("patch-7.4.355")
+ " cindent before 7.4.355 doesn't do the module scope well at all; e.g.::
+ "
+ " static FOO : &'static [bool] = [
+ " true,
+ " false,
+ " false,
+ " true,
+ " ];
+ "
+ " uh oh, next statement is indented further!
+
+ " Note that this does *not* apply the line continuation pattern properly;
+ " that's too hard to do correctly for my liking at present, so I'll just
+ " start with these two main cases (square brackets and not returning to
+ " column zero)
+
+ call cursor(a:lnum, 1)
+ if searchpair('{\|(', '', '}\|)', 'nbW',
+ \ 's:is_string_comment(line("."), col("."))') == 0
+ if searchpair('\[', '', '\]', 'nbW',
+ \ 's:is_string_comment(line("."), col("."))') == 0
+ " Global scope, should be zero
+ return 0
+ else
+ " At the module scope, inside square brackets only
+ "if getline(a:lnum)[0] == ']' || search('\[', '', '\]', 'nW') == a:lnum
+ if line =~ "^\\s*]"
+ " It's the closing line, dedent it
+ return 0
+ else
+ return shiftwidth()
+ endif
+ endif
+ endif
+ endif
+
+ " Fall back on cindent, which does it mostly right
+ return cindent(a:lnum)
+endfunction
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/indent/sas.vim b/runtime/indent/sas.vim
new file mode 100644
index 0000000000..9cc9e025c4
--- /dev/null
+++ b/runtime/indent/sas.vim
@@ -0,0 +1,138 @@
+" Vim indent file
+" Language: SAS
+" Maintainer: Zhen-Huan Hu <wildkeny@gmail.com>
+" Version: 3.0.3
+" Last Change: Jun 26, 2018
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetSASIndent()
+setlocal indentkeys+=;,=~data,=~proc,=~macro
+
+if exists("*GetSASIndent")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Regex that captures the start of a data/proc section
+let s:section_str = '\v%(^|;)\s*%(data|proc)>'
+" Regex that captures the end of a run-processing section
+let s:section_run = '\v%(^|;)\s*run\s*;'
+" Regex that captures the end of a data/proc section
+let s:section_end = '\v%(^|;)\s*%(quit|enddata)\s*;'
+
+" Regex that captures the start of a control block (anything inside a section)
+let s:block_str = '\v<%(do>%([^;]+<%(to|over|while)>[^;]+)=|%(compute|define\s+%(column|footer|header|style|table|tagset|crosstabs|statgraph)|edit|layout|method|select)>[^;]+|begingraph)\s*;'
+" Regex that captures the end of a control block (anything inside a section)
+let s:block_end = '\v<%(end|endcomp|endlayout|endgraph)\s*;'
+
+" Regex that captures the start of a macro
+let s:macro_str = '\v%(^|;)\s*\%macro>'
+" Regex that captures the end of a macro
+let s:macro_end = '\v%(^|;)\s*\%mend\s*;'
+
+" Regex that defines the end of the program
+let s:program_end = '\v%(^|;)\s*endsas\s*;'
+
+" List of procs supporting run-processing
+let s:run_processing_procs = [
+ \ 'catalog', 'chart', 'datasets', 'document', 'ds2', 'plot', 'sql',
+ \ 'gareabar', 'gbarline', 'gchart', 'gkpi', 'gmap', 'gplot', 'gradar', 'greplay', 'gslide', 'gtile',
+ \ 'anova', 'arima', 'catmod', 'factex', 'glm', 'model', 'optex', 'plan', 'reg',
+ \ 'iml',
+ \ ]
+
+" Find the line number of previous keyword defined by the regex
+function! s:PrevMatch(lnum, regex)
+ let prev_lnum = prevnonblank(a:lnum - 1)
+ while prev_lnum > 0
+ let prev_line = getline(prev_lnum)
+ if prev_line =~? a:regex
+ break
+ else
+ let prev_lnum = prevnonblank(prev_lnum - 1)
+ endif
+ endwhile
+ return prev_lnum
+endfunction
+
+" Main function
+function! GetSASIndent()
+ let prev_lnum = prevnonblank(v:lnum - 1)
+ if prev_lnum ==# 0
+ " Leave the indentation of the first line unchanged
+ return indent(1)
+ else
+ let prev_line = getline(prev_lnum)
+ " Previous non-blank line contains the start of a macro/section/block
+ " while not the end of a macro/section/block (at the same line)
+ if (prev_line =~? s:section_str && prev_line !~? s:section_run && prev_line !~? s:section_end) ||
+ \ (prev_line =~? s:block_str && prev_line !~? s:block_end) ||
+ \ (prev_line =~? s:macro_str && prev_line !~? s:macro_end)
+ let ind = indent(prev_lnum) + shiftwidth()
+ elseif prev_line =~? s:section_run && prev_line !~? s:section_end
+ let prev_section_str_lnum = s:PrevMatch(v:lnum, s:section_str)
+ let prev_section_end_lnum = max([
+ \ s:PrevMatch(v:lnum, s:section_end),
+ \ s:PrevMatch(v:lnum, s:macro_end ),
+ \ s:PrevMatch(v:lnum, s:program_end)])
+ " Check if the section supports run-processing
+ if prev_section_end_lnum < prev_section_str_lnum &&
+ \ getline(prev_section_str_lnum) =~? '\v%(^|;)\s*proc\s+%(' .
+ \ join(s:run_processing_procs, '|') . ')>'
+ let ind = indent(prev_lnum) + shiftwidth()
+ else
+ let ind = indent(prev_lnum)
+ endif
+ else
+ let ind = indent(prev_lnum)
+ endif
+ endif
+ " Re-adjustments based on the inputs of the current line
+ let curr_line = getline(v:lnum)
+ if curr_line =~? s:program_end
+ " End of the program
+ " Same indentation as the first non-blank line
+ return indent(nextnonblank(1))
+ elseif curr_line =~? s:macro_end
+ " Current line is the end of a macro
+ " Match the indentation of the start of the macro
+ return indent(s:PrevMatch(v:lnum, s:macro_str))
+ elseif curr_line =~? s:block_end && curr_line !~? s:block_str
+ " Re-adjust if current line is the end of a block
+ " while not the beginning of a block (at the same line)
+ " Returning the indent of previous block start directly
+ " would not work due to nesting
+ let ind = ind - shiftwidth()
+ elseif curr_line =~? s:section_str || curr_line =~? s:section_run || curr_line =~? s:section_end
+ " Re-adjust if current line is the start/end of a section
+ " since the end of a section could be inexplicit
+ let prev_section_str_lnum = s:PrevMatch(v:lnum, s:section_str)
+ " Check if the previous section supports run-processing
+ if getline(prev_section_str_lnum) =~? '\v%(^|;)\s*proc\s+%(' .
+ \ join(s:run_processing_procs, '|') . ')>'
+ let prev_section_end_lnum = max([
+ \ s:PrevMatch(v:lnum, s:section_end),
+ \ s:PrevMatch(v:lnum, s:macro_end ),
+ \ s:PrevMatch(v:lnum, s:program_end)])
+ else
+ let prev_section_end_lnum = max([
+ \ s:PrevMatch(v:lnum, s:section_end),
+ \ s:PrevMatch(v:lnum, s:section_run),
+ \ s:PrevMatch(v:lnum, s:macro_end ),
+ \ s:PrevMatch(v:lnum, s:program_end)])
+ endif
+ if prev_section_end_lnum < prev_section_str_lnum
+ let ind = ind - shiftwidth()
+ endif
+ endif
+ return ind
+endfunction
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/indent/sass.vim b/runtime/indent/sass.vim
index b6e2e66e8a..d6dbf3a8bb 100644
--- a/runtime/indent/sass.vim
+++ b/runtime/indent/sass.vim
@@ -1,7 +1,7 @@
" Vim indent file
" Language: Sass
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
-" Last Change: 2013 May 30
+" Last Change: 2017 Jun 13
if exists("b:did_indent")
finish
@@ -29,9 +29,7 @@ function! GetSassIndent()
let indent = indent(lnum)
let cindent = indent(v:lnum)
if line !~ s:property && line !~ s:extend && cline =~ s:property
- return indent + &sw
- "elseif line =~ s:property && cline !~ s:property
- "return indent - &sw
+ return indent + shiftwidth()
else
return -1
endif
diff --git a/runtime/indent/scala.vim b/runtime/indent/scala.vim
new file mode 100644
index 0000000000..6fd8ca9d81
--- /dev/null
+++ b/runtime/indent/scala.vim
@@ -0,0 +1,609 @@
+" Vim indent file
+" Language: Scala (http://scala-lang.org/)
+" Original Author: Stefan Matthias Aust
+" Modifications By: Derek Wyatt
+" URL: https://github.com/derekwyatt/vim-scala
+" Last Change: 2016 Aug 26
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal autoindent
+setlocal indentexpr=GetScalaIndent()
+setlocal indentkeys=0{,0},0),!^F,<>>,o,O,e,=case,<CR>
+
+if exists("*GetScalaIndent")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+let s:defMatcher = '\%(\%(private\|protected\)\%(\[[^\]]*\]\)\?\s\+\|abstract\s\+\|override\s\+\)*\<def\>'
+let s:funcNameMatcher = '\w\+'
+let s:typeSpecMatcher = '\%(\s*\[\_[^\]]*\]\)'
+let s:defArgMatcher = '\%((\_.\{-})\)'
+let s:returnTypeMatcher = '\%(:\s*\w\+' . s:typeSpecMatcher . '\?\)'
+let g:fullDefMatcher = '^\s*' . s:defMatcher . '\s\+' . s:funcNameMatcher . '\s*' . s:typeSpecMatcher . '\?\s*' . s:defArgMatcher . '\?\s*' . s:returnTypeMatcher . '\?\s*[={]'
+
+function! scala#ConditionalConfirm(msg)
+ if 0
+ call confirm(a:msg)
+ endif
+endfunction
+
+function! scala#GetLine(lnum)
+ let line = substitute(getline(a:lnum), '//.*$', '', '')
+ let line = substitute(line, '"\(.\|\\"\)\{-}"', '""', 'g')
+ return line
+endfunction
+
+function! scala#CountBrackets(line, openBracket, closedBracket)
+ let line = substitute(a:line, '"\(.\|\\"\)\{-}"', '', 'g')
+ let open = substitute(line, '[^' . a:openBracket . ']', '', 'g')
+ let close = substitute(line, '[^' . a:closedBracket . ']', '', 'g')
+ return strlen(open) - strlen(close)
+endfunction
+
+function! scala#CountParens(line)
+ return scala#CountBrackets(a:line, '(', ')')
+endfunction
+
+function! scala#CountCurlies(line)
+ return scala#CountBrackets(a:line, '{', '}')
+endfunction
+
+function! scala#LineEndsInIncomplete(line)
+ if a:line =~ '[.,]\s*$'
+ return 1
+ else
+ return 0
+ endif
+endfunction
+
+function! scala#LineIsAClosingXML(line)
+ if a:line =~ '^\s*</\w'
+ return 1
+ else
+ return 0
+ endif
+endfunction
+
+function! scala#LineCompletesXML(lnum, line)
+ let savedpos = getpos('.')
+ call setpos('.', [savedpos[0], a:lnum, 0, savedpos[3]])
+ let tag = substitute(a:line, '^.*</\([^>]*\)>.*$', '\1', '')
+ let [lineNum, colnum] = searchpairpos('<' . tag . '>', '', '</' . tag . '>', 'Wbn')
+ call setpos('.', savedpos)
+ let pline = scala#GetLine(prevnonblank(lineNum - 1))
+ if pline =~ '=\s*$'
+ return 1
+ else
+ return 0
+ endif
+endfunction
+
+function! scala#IsParentCase()
+ let savedpos = getpos('.')
+ call setpos('.', [savedpos[0], savedpos[1], 0, savedpos[3]])
+ let [l, c] = searchpos('^\s*\%(' . s:defMatcher . '\|\%(\<case\>\)\)', 'bnW')
+ let retvalue = -1
+ if l != 0 && search('\%' . l . 'l\s*\<case\>', 'bnW')
+ let retvalue = l
+ endif
+ call setpos('.', savedpos)
+ return retvalue
+endfunction
+
+function! scala#CurlyMatcher()
+ let matchline = scala#GetLineThatMatchesBracket('{', '}')
+ if scala#CountParens(scala#GetLine(matchline)) < 0
+ let savedpos = getpos('.')
+ call setpos('.', [savedpos[0], matchline, 9999, savedpos[3]])
+ call searchpos('{', 'Wbc')
+ call searchpos(')', 'Wb')
+ let [lnum, colnum] = searchpairpos('(', '', ')', 'Wbn')
+ call setpos('.', savedpos)
+ let line = scala#GetLine(lnum)
+ if line =~ '^\s*' . s:defMatcher
+ return lnum
+ else
+ return matchline
+ endif
+ else
+ return matchline
+ endif
+endfunction
+
+function! scala#GetLineAndColumnThatMatchesCurly()
+ return scala#GetLineAndColumnThatMatchesBracket('{', '}')
+endfunction
+
+function! scala#GetLineAndColumnThatMatchesParen()
+ return scala#GetLineAndColumnThatMatchesBracket('(', ')')
+endfunction
+
+function! scala#GetLineAndColumnThatMatchesBracket(openBracket, closedBracket)
+ let savedpos = getpos('.')
+ let curline = scala#GetLine(line('.'))
+ if curline =~ a:closedBracket . '.*' . a:openBracket . '.*' . a:closedBracket
+ call setpos('.', [savedpos[0], savedpos[1], 0, savedpos[3]])
+ call searchpos(a:closedBracket . '\ze[^' . a:closedBracket . a:openBracket . ']*' . a:openBracket, 'W')
+ else
+ call setpos('.', [savedpos[0], savedpos[1], 9999, savedpos[3]])
+ call searchpos(a:closedBracket, 'Wbc')
+ endif
+ let [lnum, colnum] = searchpairpos(a:openBracket, '', a:closedBracket, 'Wbn')
+ call setpos('.', savedpos)
+ return [lnum, colnum]
+endfunction
+
+function! scala#GetLineThatMatchesCurly()
+ return scala#GetLineThatMatchesBracket('{', '}')
+endfunction
+
+function! scala#GetLineThatMatchesParen()
+ return scala#GetLineThatMatchesBracket('(', ')')
+endfunction
+
+function! scala#GetLineThatMatchesBracket(openBracket, closedBracket)
+ let [lnum, colnum] = scala#GetLineAndColumnThatMatchesBracket(a:openBracket, a:closedBracket)
+ return lnum
+endfunction
+
+function! scala#NumberOfBraceGroups(line)
+ let line = substitute(a:line, '[^()]', '', 'g')
+ if strlen(line) == 0
+ return 0
+ endif
+ let line = substitute(line, '^)*', '', 'g')
+ if strlen(line) == 0
+ return 0
+ endif
+ let line = substitute(line, '^(', '', 'g')
+ if strlen(line) == 0
+ return 0
+ endif
+ let c = 1
+ let counter = 0
+ let groupCount = 0
+ while counter < strlen(line)
+ let char = strpart(line, counter, 1)
+ if char == '('
+ let c = c + 1
+ elseif char == ')'
+ let c = c - 1
+ endif
+ if c == 0
+ let groupCount = groupCount + 1
+ endif
+ let counter = counter + 1
+ endwhile
+ return groupCount
+endfunction
+
+function! scala#MatchesIncompleteDefValr(line)
+ if a:line =~ '^\s*\%(' . s:defMatcher . '\|\<va[lr]\>\).*[=({]\s*$'
+ return 1
+ else
+ return 0
+ endif
+endfunction
+
+function! scala#LineIsCompleteIf(line)
+ if scala#CountBrackets(a:line, '{', '}') == 0 &&
+ \ scala#CountBrackets(a:line, '(', ')') == 0 &&
+ \ a:line =~ '^\s*\<if\>\s*([^)]*)\s*\S.*$'
+ return 1
+ else
+ return 0
+ endif
+endfunction
+
+function! scala#LineCompletesIfElse(lnum, line)
+ if a:line =~ '^\s*\%(\<if\>\|\%(}\s*\)\?\<else\>\)'
+ return 0
+ endif
+ let result = search('^\%(\s*\<if\>\s*(.*).*\n\|\s*\<if\>\s*(.*)\s*\n.*\n\)\%(\s*\<else\>\s*\<if\>\s*(.*)\s*\n.*\n\)*\%(\s*\<else\>\s*\n\|\s*\<else\>[^{]*\n\)\?\%' . a:lnum . 'l', 'Wbn')
+ if result != 0 && scala#GetLine(prevnonblank(a:lnum - 1)) !~ '{\s*$'
+ return result
+ endif
+ return 0
+endfunction
+
+function! scala#GetPrevCodeLine(lnum)
+ " This needs to skip comment lines
+ return prevnonblank(a:lnum - 1)
+endfunction
+
+function! scala#InvertBracketType(openBracket, closedBracket)
+ if a:openBracket == '('
+ return [ '{', '}' ]
+ else
+ return [ '(', ')' ]
+ endif
+endfunction
+
+function! scala#Testhelper(lnum, line, openBracket, closedBracket, iteration)
+ let bracketCount = scala#CountBrackets(a:line, a:openBracket, a:closedBracket)
+ " There are more '}' braces than '{' on this line so it may be completing the function definition
+ if bracketCount < 0
+ let [matchedLNum, matchedColNum] = scala#GetLineAndColumnThatMatchesBracket(a:openBracket, a:closedBracket)
+ if matchedLNum == a:lnum
+ return -1
+ endif
+ let matchedLine = scala#GetLine(matchedLNum)
+ if ! scala#MatchesIncompleteDefValr(matchedLine)
+ let bracketLine = substitute(substitute(matchedLine, '\%' . matchedColNum . 'c.*$', '', ''), '[^{}()]', '', 'g')
+ if bracketLine =~ '}$'
+ return scala#Testhelper(matchedLNum, matchedLine, '{', '}', a:iteration + 1)
+ elseif bracketLine =~ ')$'
+ return scala#Testhelper(matchedLNum, matchedLine, '(', ')', a:iteration + 1)
+ else
+ let prevCodeLNum = scala#GetPrevCodeLine(matchedLNum)
+ if scala#MatchesIncompleteDefValr(scala#GetLine(prevCodeLNum))
+ return prevCodeLNum
+ else
+ return -1
+ endif
+ endif
+ else
+ " return indent value instead
+ return matchedLNum
+ endif
+ " There's an equal number of '{' and '}' on this line so it may be a single line function definition
+ elseif bracketCount == 0
+ if a:iteration == 0
+ let otherBracketType = scala#InvertBracketType(a:openBracket, a:closedBracket)
+ return scala#Testhelper(a:lnum, a:line, otherBracketType[0], otherBracketType[1], a:iteration + 1)
+ else
+ let prevCodeLNum = scala#GetPrevCodeLine(a:lnum)
+ let prevCodeLine = scala#GetLine(prevCodeLNum)
+ if scala#MatchesIncompleteDefValr(prevCodeLine) && prevCodeLine !~ '{\s*$'
+ return prevCodeLNum
+ else
+ let possibleIfElse = scala#LineCompletesIfElse(a:lnum, a:line)
+ if possibleIfElse != 0
+ let defValrLine = prevnonblank(possibleIfElse - 1)
+ let possibleDefValr = scala#GetLine(defValrLine)
+ if scala#MatchesIncompleteDefValr(possibleDefValr) && possibleDefValr =~ '^.*=\s*$'
+ return possibleDefValr
+ else
+ return -1
+ endif
+ else
+ return -1
+ endif
+ endif
+ endif
+ else
+ return -1
+ endif
+endfunction
+
+function! scala#Test(lnum, line, openBracket, closedBracket)
+ return scala#Testhelper(a:lnum, a:line, a:openBracket, a:closedBracket, 0)
+endfunction
+
+function! scala#LineCompletesDefValr(lnum, line)
+ let bracketCount = scala#CountBrackets(a:line, '{', '}')
+ if bracketCount < 0
+ let matchedBracket = scala#GetLineThatMatchesBracket('{', '}')
+ if ! scala#MatchesIncompleteDefValr(scala#GetLine(matchedBracket))
+ let possibleDefValr = scala#GetLine(prevnonblank(matchedBracket - 1))
+ if matchedBracket != -1 && scala#MatchesIncompleteDefValr(possibleDefValr)
+ return 1
+ else
+ return 0
+ endif
+ else
+ return 0
+ endif
+ elseif bracketCount == 0
+ let bracketCount = scala#CountBrackets(a:line, '(', ')')
+ if bracketCount < 0
+ let matchedBracket = scala#GetLineThatMatchesBracket('(', ')')
+ if ! scala#MatchesIncompleteDefValr(scala#GetLine(matchedBracket))
+ let possibleDefValr = scala#GetLine(prevnonblank(matchedBracket - 1))
+ if matchedBracket != -1 && scala#MatchesIncompleteDefValr(possibleDefValr)
+ return 1
+ else
+ return 0
+ endif
+ else
+ return 0
+ endif
+ elseif bracketCount == 0
+ let possibleDefValr = scala#GetLine(prevnonblank(a:lnum - 1))
+ if scala#MatchesIncompleteDefValr(possibleDefValr) && possibleDefValr =~ '^.*=\s*$'
+ return 1
+ else
+ let possibleIfElse = scala#LineCompletesIfElse(a:lnum, a:line)
+ if possibleIfElse != 0
+ let possibleDefValr = scala#GetLine(prevnonblank(possibleIfElse - 1))
+ if scala#MatchesIncompleteDefValr(possibleDefValr) && possibleDefValr =~ '^.*=\s*$'
+ return 2
+ else
+ return 0
+ endif
+ else
+ return 0
+ endif
+ endif
+ else
+ return 0
+ endif
+ endif
+endfunction
+
+function! scala#SpecificLineCompletesBrackets(lnum, openBracket, closedBracket)
+ let savedpos = getpos('.')
+ call setpos('.', [savedpos[0], a:lnum, 9999, savedpos[3]])
+ let retv = scala#LineCompletesBrackets(a:openBracket, a:closedBracket)
+ call setpos('.', savedpos)
+
+ return retv
+endfunction
+
+function! scala#LineCompletesBrackets(openBracket, closedBracket)
+ let savedpos = getpos('.')
+ let offline = 0
+ while offline == 0
+ let [lnum, colnum] = searchpos(a:closedBracket, 'Wb')
+ let [lnumA, colnumA] = searchpairpos(a:openBracket, '', a:closedBracket, 'Wbn')
+ if lnum != lnumA
+ let [lnumB, colnumB] = searchpairpos(a:openBracket, '', a:closedBracket, 'Wbnr')
+ let offline = 1
+ endif
+ endwhile
+ call setpos('.', savedpos)
+ if lnumA == lnumB && colnumA == colnumB
+ return lnumA
+ else
+ return -1
+ endif
+endfunction
+
+function! GetScalaIndent()
+ " Find a non-blank line above the current line.
+ let prevlnum = prevnonblank(v:lnum - 1)
+
+ " Hit the start of the file, use zero indent.
+ if prevlnum == 0
+ return 0
+ endif
+
+ let ind = indent(prevlnum)
+ let originalIndentValue = ind
+ let prevline = scala#GetLine(prevlnum)
+ let curlnum = v:lnum
+ let curline = scala#GetLine(curlnum)
+ if get(g:, 'scala_scaladoc_indent', 0)
+ let star_indent = 2
+ else
+ let star_indent = 1
+ end
+
+ if prevline =~ '^\s*/\*\*'
+ if prevline =~ '\*/\s*$'
+ return ind
+ else
+ return ind + star_indent
+ endif
+ endif
+
+ if curline =~ '^\s*\*'
+ return cindent(curlnum)
+ endif
+
+ " If this line starts with a { then make it indent the same as the previous line
+ if curline =~ '^\s*{'
+ call scala#ConditionalConfirm("1")
+ " Unless, of course, the previous one is a { as well
+ if prevline !~ '^\s*{'
+ call scala#ConditionalConfirm("2")
+ return indent(prevlnum)
+ endif
+ endif
+
+ " '.' continuations
+ if curline =~ '^\s*\.'
+ if prevline =~ '^\s*\.'
+ return ind
+ else
+ return ind + shiftwidth()
+ endif
+ endif
+
+ " Indent html literals
+ if prevline !~ '/>\s*$' && prevline =~ '^\s*<[a-zA-Z][^>]*>\s*$'
+ call scala#ConditionalConfirm("3")
+ return ind + shiftwidth()
+ endif
+
+ " assumes curly braces around try-block
+ if curline =~ '^\s*}\s*\<catch\>'
+ return ind - shiftwidth()
+ elseif curline =~ '^\s*\<catch\>'
+ return ind
+ endif
+
+ " Add a shiftwidth()' after lines that start a block
+ " If 'if', 'for' or 'while' end with ), this is a one-line block
+ " If 'val', 'var', 'def' end with =, this is a one-line block
+ if (prevline =~ '^\s*\<\%(\%(}\?\s*else\s\+\)\?if\|for\|while\)\>.*[)=]\s*$' && scala#NumberOfBraceGroups(prevline) <= 1)
+ \ || prevline =~ '^\s*' . s:defMatcher . '.*=\s*$'
+ \ || prevline =~ '^\s*\<va[lr]\>.*[=]\s*$'
+ \ || prevline =~ '^\s*\%(}\s*\)\?\<else\>\s*$'
+ \ || prevline =~ '=\s*$'
+ call scala#ConditionalConfirm("4")
+ let ind = ind + shiftwidth()
+ elseif prevline =~ '^\s*\<\%(}\?\s*else\s\+\)\?if\>' && curline =~ '^\s*}\?\s*\<else\>'
+ return ind
+ endif
+
+ let lineCompletedBrackets = 0
+ let bracketCount = scala#CountBrackets(prevline, '{', '}')
+ if bracketCount > 0 || prevline =~ '.*{\s*$'
+ call scala#ConditionalConfirm("5b")
+ let ind = ind + shiftwidth()
+ elseif bracketCount < 0
+ call scala#ConditionalConfirm("6b")
+ " if the closing brace actually completes the braces entirely, then we
+ " have to indent to line that started the whole thing
+ let completeLine = scala#LineCompletesBrackets('{', '}')
+ if completeLine != -1
+ call scala#ConditionalConfirm("8b")
+ let prevCompleteLine = scala#GetLine(prevnonblank(completeLine - 1))
+ " However, what actually started this part looks like it was a function
+ " definition, so we need to indent to that line instead. This is
+ " actually pretty weak at the moment.
+ if prevCompleteLine =~ '=\s*$'
+ call scala#ConditionalConfirm("9b")
+ let ind = indent(prevnonblank(completeLine - 1))
+ else
+ call scala#ConditionalConfirm("10b")
+ let ind = indent(completeLine)
+ endif
+ else
+ let lineCompletedBrackets = 1
+ endif
+ endif
+
+ if ind == originalIndentValue
+ let bracketCount = scala#CountBrackets(prevline, '(', ')')
+ if bracketCount > 0 || prevline =~ '.*(\s*$'
+ call scala#ConditionalConfirm("5a")
+ let ind = ind + shiftwidth()
+ elseif bracketCount < 0
+ call scala#ConditionalConfirm("6a")
+ " if the closing brace actually completes the braces entirely, then we
+ " have to indent to line that started the whole thing
+ let completeLine = scala#LineCompletesBrackets('(', ')')
+ if completeLine != -1 && prevline !~ '^.*{\s*$'
+ call scala#ConditionalConfirm("8a")
+ let prevCompleteLine = scala#GetLine(prevnonblank(completeLine - 1))
+ " However, what actually started this part looks like it was a function
+ " definition, so we need to indent to that line instead. This is
+ " actually pretty weak at the moment.
+ if prevCompleteLine =~ '=\s*$'
+ call scala#ConditionalConfirm("9a")
+ let ind = indent(prevnonblank(completeLine - 1))
+ else
+ call scala#ConditionalConfirm("10a")
+ let ind = indent(completeLine)
+ endif
+ else
+ " This is the only part that's different from from the '{', '}' one below
+ " Yup... some refactoring is necessary at some point.
+ let ind = ind + (bracketCount * shiftwidth())
+ let lineCompletedBrackets = 1
+ endif
+ endif
+ endif
+
+ if curline =~ '^\s*}\?\s*\<else\>\%(\s\+\<if\>\s*(.*)\)\?\s*{\?\s*$' &&
+ \ ! scala#LineIsCompleteIf(prevline) &&
+ \ prevline !~ '^.*}\s*$'
+ let ind = ind - shiftwidth()
+ endif
+
+ " Subtract a shiftwidth()' on '}' or html
+ let curCurlyCount = scala#CountCurlies(curline)
+ if curCurlyCount < 0
+ call scala#ConditionalConfirm("14a")
+ let matchline = scala#CurlyMatcher()
+ return indent(matchline)
+ elseif curline =~ '^\s*</[a-zA-Z][^>]*>'
+ call scala#ConditionalConfirm("14c")
+ return ind - shiftwidth()
+ endif
+
+ let prevParenCount = scala#CountParens(prevline)
+ if prevline =~ '^\s*\<for\>.*$' && prevParenCount > 0
+ call scala#ConditionalConfirm("15")
+ let ind = indent(prevlnum) + 5
+ endif
+
+ let prevCurlyCount = scala#CountCurlies(prevline)
+ if prevCurlyCount == 0 && prevline =~ '^.*\%(=>\|โ‡’\)\s*$' && prevline !~ '^\s*this\s*:.*\%(=>\|โ‡’\)\s*$' && curline !~ '^\s*\<case\>'
+ call scala#ConditionalConfirm("16")
+ let ind = ind + shiftwidth()
+ endif
+
+ if ind == originalIndentValue && curline =~ '^\s*\<case\>'
+ call scala#ConditionalConfirm("17")
+ let parentCase = scala#IsParentCase()
+ if parentCase != -1
+ call scala#ConditionalConfirm("17a")
+ return indent(parentCase)
+ endif
+ endif
+
+ if prevline =~ '^\s*\*/'
+ \ || prevline =~ '*/\s*$'
+ call scala#ConditionalConfirm("18")
+ let ind = ind - star_indent
+ endif
+
+ if scala#LineEndsInIncomplete(prevline)
+ call scala#ConditionalConfirm("19")
+ return ind
+ endif
+
+ if scala#LineIsAClosingXML(prevline)
+ if scala#LineCompletesXML(prevlnum, prevline)
+ call scala#ConditionalConfirm("20a")
+ return ind - shiftwidth()
+ else
+ call scala#ConditionalConfirm("20b")
+ return ind
+ endif
+ endif
+
+ if ind == originalIndentValue
+ "let indentMultiplier = scala#LineCompletesDefValr(prevlnum, prevline)
+ "if indentMultiplier != 0
+ " call scala#ConditionalConfirm("19a")
+ " let ind = ind - (indentMultiplier * shiftwidth())
+ let defValrLine = scala#Test(prevlnum, prevline, '{', '}')
+ if defValrLine != -1
+ call scala#ConditionalConfirm("21a")
+ let ind = indent(defValrLine)
+ elseif lineCompletedBrackets == 0
+ call scala#ConditionalConfirm("21b")
+ if scala#GetLine(prevnonblank(prevlnum - 1)) =~ '^.*\<else\>\s*\%(//.*\)\?$'
+ call scala#ConditionalConfirm("21c")
+ let ind = ind - shiftwidth()
+ elseif scala#LineCompletesIfElse(prevlnum, prevline)
+ call scala#ConditionalConfirm("21d")
+ let ind = ind - shiftwidth()
+ elseif scala#CountParens(curline) < 0 && curline =~ '^\s*)' && scala#GetLine(scala#GetLineThatMatchesBracket('(', ')')) =~ '.*(\s*$'
+ " Handles situations that look like this:
+ "
+ " val a = func(
+ " 10
+ " )
+ "
+ " or
+ "
+ " val a = func(
+ " 10
+ " ).somethingHere()
+ call scala#ConditionalConfirm("21e")
+ let ind = ind - shiftwidth()
+ endif
+ endif
+ endif
+
+ call scala#ConditionalConfirm("returning " . ind)
+
+ return ind
+endfunction
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim:set sw=2 sts=2 ts=8 et:
+" vim600:fdm=marker fdl=1 fdc=0:
diff --git a/runtime/indent/scheme.vim b/runtime/indent/scheme.vim
index a16f4f9ea1..496da3267d 100644
--- a/runtime/indent/scheme.vim
+++ b/runtime/indent/scheme.vim
@@ -1,11 +1,14 @@
" Vim indent file
-" Language: Scheme
-" Maintainer: Sergey Khorev <sergey.khorev@gmail.com>
-" Last Change: 2005 Jun 24
+" Language: Scheme
+" Last Change: 2018 Jan 31
+" Maintainer: Evan Hanson <evhan@foldling.org>
+" Previous Maintainer: Sergey Khorev <sergey.khorev@gmail.com>
+" URL: https://foldling.org/vim/indent/scheme.vim
" Only load this indent file when no other was loaded.
if exists("b:did_indent")
finish
endif
+" Use the Lisp indenting
runtime! indent/lisp.vim
diff --git a/runtime/indent/sdl.vim b/runtime/indent/sdl.vim
index ba03f2d3f4..6ce30b6797 100644
--- a/runtime/indent/sdl.vim
+++ b/runtime/indent/sdl.vim
@@ -46,17 +46,17 @@ function! GetSDLIndent()
if (getline(lnum) =~? '^\s*\(start\|state\|system\|package\|connection\|channel\|alternative\|macro\|operator\|newtype\|select\|substructure\|decision\|generator\|refinement\|service\|method\|exceptionhandler\|asntype\|syntype\|value\|(.*):\|\(priority\s\+\)\=input\|provided\)'
\ || getline(lnum) =~? virtuality . '\(process\|procedure\|block\|object\)')
\ && getline(lnum) !~? 'end[[:alpha:]]\+;$'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
" Subtract a 'shiftwidth' after states
if getline(lnum) =~? '^\s*\(stop\|return\>\|nextstate\)'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
" Subtract a 'shiftwidth' on on end (uncompleted line)
if getline(v:lnum) =~? '^\s*end\>'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
" Put each alternatives where the corresponding decision was
diff --git a/runtime/indent/sh.vim b/runtime/indent/sh.vim
index d05bb3770f..32bc9f35bb 100644
--- a/runtime/indent/sh.vim
+++ b/runtime/indent/sh.vim
@@ -1,11 +1,24 @@
" Vim indent file
" Language: Shell Script
" Maintainer: Christian Brabandt <cb@256bit.org>
-" Previous Maintainer: Peter Aronoff <telemachus@arpinum.org>
" Original Author: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2016-02-15
+" Previous Maintainer: Peter Aronoff <telemachus@arpinum.org>
+" Latest Revision: 2018-03-26
" License: Vim (see :h license)
" Repository: https://github.com/chrisbra/vim-sh-indent
+" Changelog:
+" 20180724 - make check for zsh syntax more rigid (needs word-boundaries)
+" 20180326 - better support for line continuation
+" 20180325 - better detection of function definitions
+" 20180127 - better support for zsh complex commands
+" 20170808: - better indent of line continuation
+" 20170502: - get rid of buffer-shiftwidth function
+" 20160912: - preserve indentation of here-doc blocks
+" 20160627: - detect heredocs correctly
+" 20160213: - detect function definition correctly
+" 20160202: - use shiftwidth() function
+" 20151215: - set b:undo_indent variable
+" 20150728: - add foreach detection for zsh
if exists("b:did_indent")
finish
@@ -27,15 +40,11 @@ endif
let s:cpo_save = &cpo
set cpo&vim
-function s:buffer_shiftwidth()
- return shiftwidth()
-endfunction
-
let s:sh_indent_defaults = {
- \ 'default': function('s:buffer_shiftwidth'),
- \ 'continuation-line': function('s:buffer_shiftwidth'),
- \ 'case-labels': function('s:buffer_shiftwidth'),
- \ 'case-statements': function('s:buffer_shiftwidth'),
+ \ 'default': function('shiftwidth'),
+ \ 'continuation-line': function('shiftwidth'),
+ \ 'case-labels': function('shiftwidth'),
+ \ 'case-statements': function('shiftwidth'),
\ 'case-breaks': 0 }
function! s:indent_value(option)
@@ -54,12 +63,15 @@ function! GetShIndent()
if lnum == 0
return 0
endif
+ let line = getline(lnum)
let pnum = prevnonblank(lnum - 1)
-
+ let pline = getline(pnum)
let ind = indent(lnum)
- let line = getline(lnum)
- if line =~ '^\s*\%(if\|then\|do\|else\|elif\|case\|while\|until\|for\|select\|foreach\)\>'
+
+ " Check contents of previous lines
+ if line =~ '^\s*\%(if\|then\|do\|else\|elif\|case\|while\|until\|for\|select\|foreach\)\>' ||
+ \ (&ft is# 'zsh' && line =~ '\<\%(if\|then\|do\|else\|elif\|case\|while\|until\|for\|select\|foreach\)\>')
if line !~ '\<\%(fi\|esac\|done\|end\)\>\s*\%(#.*\)\=$'
let ind += s:indent_value('default')
endif
@@ -67,21 +79,35 @@ function! GetShIndent()
if !s:is_case_ended(line)
let ind += s:indent_value('case-statements')
endif
- elseif line =~ '^\s*\<\k\+\>\s*()\s*{' || line =~ '^\s*{' || line =~ '^\s*function\s*\w\S\+\s*\%(()\)\?\s*{'
+ " function definition
+ elseif s:is_function_definition(line)
if line !~ '}\s*\%(#.*\)\=$'
let ind += s:indent_value('default')
endif
elseif s:is_continuation_line(line)
- if pnum == 0 || !s:is_continuation_line(getline(pnum))
+ if pnum == 0 || !s:is_continuation_line(pline)
let ind += s:indent_value('continuation-line')
endif
- elseif pnum != 0 && s:is_continuation_line(getline(pnum))
- let ind = indent(s:find_continued_lnum(pnum))
+ elseif s:end_block(line) && !s:start_block(line)
+ let ind -= s:indent_value('default')
+ elseif pnum != 0 && s:is_continuation_line(pline) && !s:end_block(getline(v:lnum))
+ " only add indent, if line and pline is in the same block
+ let i = v:lnum
+ let ind2 = indent(s:find_continued_lnum(pnum))
+ while !s:is_empty(getline(i)) && i > pnum
+ let i -= 1
+ endw
+ if i == pnum
+ let ind += ind2
+ else
+ let ind = ind2
+ endif
endif
let pine = line
+ " Check content of current line
let line = getline(v:lnum)
- if line =~ '^\s*\%(then\|do\|else\|elif\|fi\|done\|end\)\>' || line =~ '^\s*}'
+ if line =~ '^\s*\%(then\|do\|else\|elif\|fi\|done\|end\)\>' || s:end_block(line)
let ind -= s:indent_value('default')
elseif line =~ '^\s*esac\>' && s:is_case_empty(getline(v:lnum - 1))
let ind -= s:indent_value('default')
@@ -102,13 +128,29 @@ function! GetShIndent()
endif
elseif s:is_case_break(line)
let ind -= s:indent_value('case-breaks')
+ elseif s:is_here_doc(line)
+ let ind = 0
+ " statements, executed within a here document. Keep the current indent
+ elseif match(map(synstack(v:lnum, 1), 'synIDattr(v:val, "name")'), '\c\mheredoc') > -1
+ return indent(v:lnum)
+ elseif s:is_comment(line) && s:is_empty(getline(v:lnum-1))
+ return indent(v:lnum)
endif
- return ind
+ return ind > 0 ? ind : 0
endfunction
function! s:is_continuation_line(line)
- return a:line =~ '\%(\%(^\|[^\\]\)\\\|&&\|||\)$'
+ " Comment, cannot be a line continuation
+ if a:line =~ '^\s*#'
+ return 0
+ else
+ " start-of-line
+ " \\ or && or || or |
+ " followed optionally by { or #
+ return a:line =~ '\%(\%(^\|[^\\]\)\\\|&&\|||\||\)' .
+ \ '\s*\({\s*\)\=\(#.*\)\=$'
+ endif
endfunction
function! s:find_continued_lnum(lnum)
@@ -119,6 +161,12 @@ function! s:find_continued_lnum(lnum)
return i
endfunction
+function! s:is_function_definition(line)
+ return a:line =~ '^\s*\<\k\+\>\s*()\s*{' ||
+ \ a:line =~ '^\s*{' ||
+ \ a:line =~ '^\s*function\s*\w\S\+\s*\%(()\)\?\s*{'
+endfunction
+
function! s:is_case_label(line, pnum)
if a:line !~ '^\s*(\=.*)'
return 0
@@ -160,6 +208,14 @@ function! s:is_case_break(line)
return a:line =~ '^\s*;[;&]'
endfunction
+function! s:is_here_doc(line)
+ if a:line =~ '^\w\+$'
+ let here_pat = '<<-\?'. s:escape(a:line). '\$'
+ return search(here_pat, 'bnW') > 0
+ endif
+ return 0
+endfunction
+
function! s:is_case_ended(line)
return s:is_case_break(a:line) || a:line =~ ';[;&]\s*\%(#.*\)\=$'
endfunction
@@ -172,5 +228,33 @@ function! s:is_case_empty(line)
endif
endfunction
+function! s:escape(pattern)
+ return '\V'. escape(a:pattern, '\\')
+endfunction
+
+function! s:is_empty(line)
+ return a:line =~ '^\s*$'
+endfunction
+
+function! s:end_block(line)
+ return a:line =~ '^\s*}'
+endfunction
+
+function! s:start_block(line)
+ return a:line =~ '{\s*\(#.*\)\?$'
+endfunction
+
+function! s:find_start_block(lnum)
+ let i = a:lnum
+ while i > 1 && !s:start_block(getline(i))
+ let i -= 1
+ endwhile
+ return i
+endfunction
+
+function! s:is_comment(line)
+ return a:line =~ '^\s*#'
+endfunction
+
let &cpo = s:cpo_save
unlet s:cpo_save
diff --git a/runtime/indent/sml.vim b/runtime/indent/sml.vim
index fbbb15ed85..e760a8e350 100644
--- a/runtime/indent/sml.vim
+++ b/runtime/indent/sml.vim
@@ -115,9 +115,9 @@ function! GetSMLIndent()
" Return double 'shiftwidth' after lines matching:
if lline =~ '^\s*|.*=>\s*$'
- return ind + &sw + &sw
+ return ind + 2 *shiftwidth()
elseif lline =~ '^\s*val\>.*=\s*$'
- return ind + &sw
+ return ind + shiftwidth()
endif
let line = getline(v:lnum)
@@ -157,7 +157,7 @@ function! GetSMLIndent()
if lastModule == -1
return 0
else
- return lastModule + &sw
+ return lastModule + shiftwidth()
endif
" Indent lines starting with '|' from matching 'case', 'handle'
@@ -172,7 +172,7 @@ function! GetSMLIndent()
if switchLine =~ '\<case\>'
return col(".") + 2
elseif switchLine =~ '\<handle\>'
- return switchLineIndent + &sw
+ return switchLineIndent + shiftwidth()
elseif switchLine =~ '\<datatype\>'
call search('=')
return col(".") - 1
@@ -184,7 +184,7 @@ function! GetSMLIndent()
" Indent if last line ends with 'sig', 'struct', 'let', 'then', 'else',
" 'in'
elseif lline =~ '\<\(sig\|struct\|let\|in\|then\|else\)\s*$'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
" Indent if last line ends with 'of', align from 'case'
elseif lline =~ '\<\(of\)\s*$'
@@ -199,14 +199,14 @@ function! GetSMLIndent()
" Indent if last line starts with 'fun', 'case', 'fn'
elseif lline =~ '^\s*\(fun\|fn\|case\)\>'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
" Don't indent 'let' if last line started with 'fun', 'fn'
if line =~ '^\s*let\>'
if lline =~ '^\s*\(fun\|fn\)'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
endif
diff --git a/runtime/indent/sqlanywhere.vim b/runtime/indent/sqlanywhere.vim
index d11c54b5af..ba35d76715 100644
--- a/runtime/indent/sqlanywhere.vim
+++ b/runtime/indent/sqlanywhere.vim
@@ -1,7 +1,7 @@
" Vim indent file
" Language: SQL
" Maintainer: David Fishburn <dfishburn dot vim at gmail dot com>
-" Last Change: 2012 Dec 06
+" Last Change: 2017 Jun 13
" Version: 3.0
" Download: http://vim.sourceforge.net/script.php?script_id=495
@@ -147,7 +147,7 @@ function! s:CheckToIgnoreRightParan( prev_lnum, num_levels )
endwhile
" Fallback - just move back one
- " return a:prev_indent - &sw
+ " return a:prev_indent - shiftwidth()
return ignore_paran
endfunction
@@ -166,7 +166,7 @@ function! s:GetStmtStarterIndent( keyword, curr_lnum )
let lnum = a:curr_lnum
" Default - reduce indent by 1
- let ind = indent(a:curr_lnum) - &sw
+ let ind = indent(a:curr_lnum) - shiftwidth()
if a:keyword =~? 'end'
exec 'normal! ^'
@@ -230,7 +230,7 @@ function! s:ModuloIndent(ind)
let ind = a:ind
if ind > 0
- let modulo = ind % &shiftwidth
+ let modulo = ind % shiftwidth()
if modulo > 0
let ind = ind - modulo
@@ -291,7 +291,7 @@ function! GetSQLIndent()
" where END IF, END, should decrease the indent.
if prevline =~? s:SQLBlockStart
" Move indent in
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
" echom 'prevl - SQLBlockStart - indent ' . ind . ' line: ' . prevline
elseif prevline =~ '[()]'
if prevline =~ '('
@@ -308,7 +308,7 @@ function! GetSQLIndent()
if num_unmatched_left > 0
" There is a open left paranethesis
" increase indent
- let ind = ind + ( &sw * num_unmatched_left )
+ let ind = ind + ( shiftwidth() * num_unmatched_left )
elseif num_unmatched_right > 0
" if it is an unbalanced paranethesis only unindent if
" it was part of a command (ie create table(..) )
@@ -323,7 +323,7 @@ function! GetSQLIndent()
endif
if (num_unmatched_right - ignore) > 0
- let ind = ind - ( &sw * (num_unmatched_right - ignore) )
+ let ind = ind - ( shiftwidth() * (num_unmatched_right - ignore) )
endif
endif
@@ -339,12 +339,12 @@ function! GetSQLIndent()
if line =~? '^\s*els'
" Any line when you type else will automatically back up one
" ident level (ie else, elseif, elsif)
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
" echom 'curr - else - indent ' . ind
elseif line =~? '^\s*end\>'
let ind = s:GetStmtStarterIndent('end', v:lnum)
" General case for end
- " let ind = ind - &sw
+ " let ind = ind - shiftwidth()
" echom 'curr - end - indent ' . ind
elseif line =~? '^\s*when\>'
let ind = s:GetStmtStarterIndent('when', v:lnum)
@@ -352,7 +352,7 @@ function! GetSQLIndent()
" clause, do not change the indent level, since these
" statements do not have a corresponding END statement.
" if stmt_starter =~? 'case'
- " let ind = ind - &sw
+ " let ind = ind - shiftwidth()
" endif
" elseif line =~ '^\s*)\s*;\?\s*$'
" elseif line =~ '^\s*)'
@@ -371,14 +371,14 @@ function! GetSQLIndent()
" let num_unmatched_right = s:CountUnbalancedParan( line, ')' )
" if num_unmatched_right > 0
" elseif strpart( line, strlen(line)-1, 1 ) =~ ')'
- " let ind = ind - &sw
+ " let ind = ind - shiftwidth()
if line =~ '^\s*)'
" let ignore = ignore + 1
" echom 'curr - begins ) unbalanced ignore: ' . ignore
endif
if (num_unmatched_right - ignore) > 0
- let ind = ind - ( &sw * (num_unmatched_right - ignore) )
+ let ind = ind - ( shiftwidth() * (num_unmatched_right - ignore) )
endif
" endif
endif
diff --git a/runtime/indent/systemverilog.vim b/runtime/indent/systemverilog.vim
index b017535535..91fba4c3b6 100644
--- a/runtime/indent/systemverilog.vim
+++ b/runtime/indent/systemverilog.vim
@@ -29,7 +29,7 @@ function SystemVerilogIndent()
if exists('b:systemverilog_indent_width')
let offset = b:systemverilog_indent_width
else
- let offset = &sw
+ let offset = shiftwidth()
endif
if exists('b:systemverilog_indent_modules')
let indent_modules = offset
diff --git a/runtime/indent/tcl.vim b/runtime/indent/tcl.vim
index a92f57d67d..e9d61e4366 100644
--- a/runtime/indent/tcl.vim
+++ b/runtime/indent/tcl.vim
@@ -56,7 +56,7 @@ function GetTclIndent()
if line =~ '^\s*\*'
return cindent(v:lnum)
elseif line =~ '^\s*}'
- return indent(v:lnum) - &sw
+ return indent(v:lnum) - shiftwidth()
endif
let pnum = s:prevnonblanknoncomment(v:lnum - 1)
@@ -64,11 +64,11 @@ function GetTclIndent()
return 0
endif
- let ind = indent(pnum) + s:count_braces(pnum, 1) * &sw
+ let ind = indent(pnum) + s:count_braces(pnum, 1) * shiftwidth()
let pline = getline(pnum)
if pline =~ '}\s*$'
- let ind -= (s:count_braces(pnum, 0) - (pline =~ '^\s*}' ? 1 : 0)) * &sw
+ let ind -= (s:count_braces(pnum, 0) - (pline =~ '^\s*}' ? 1 : 0)) * shiftwidth()
endif
return ind
diff --git a/runtime/indent/tcsh.vim b/runtime/indent/tcsh.vim
index 59a9d56f44..ed08e6c6e2 100644
--- a/runtime/indent/tcsh.vim
+++ b/runtime/indent/tcsh.vim
@@ -32,17 +32,17 @@ function TcshGetIndent()
let ind = indent(lnum)
let line = getline(lnum)
if line =~ '\v^\s*%(while|foreach)>|^\s*%(case\s.*:|default:|else)\s*$|%(<then|\\)$'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
if line =~ '\v^\s*breaksw>'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
" Subtract indent if current line has on end, endif, case commands
let line = getline(v:lnum)
if line =~ '\v^\s*%(else|end|endif)\s*$'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
return ind
diff --git a/runtime/indent/teraterm.vim b/runtime/indent/teraterm.vim
index ba24257b02..35d7354290 100644
--- a/runtime/indent/teraterm.vim
+++ b/runtime/indent/teraterm.vim
@@ -1,9 +1,9 @@
" Vim indent file
" Language: Tera Term Language (TTL)
-" Based on Tera Term Version 4.86
+" Based on Tera Term Version 4.100
" Maintainer: Ken Takata
" URL: https://github.com/k-takata/vim-teraterm
-" Last Change: 2015 Jun 4
+" Last Change: 2018-08-31
" Filenames: *.ttl
" License: VIM License
@@ -22,18 +22,6 @@ if exists("*GetTeraTermIndent")
finish
endif
-" The shiftwidth() function is relatively new.
-" Don't require it to exist.
-if exists('*shiftwidth')
- function s:sw() abort
- return shiftwidth()
- endfunction
-else
- function s:sw() abort
- return &shiftwidth
- endfunction
-endif
-
function! GetTeraTermIndent(lnum)
let l:prevlnum = prevnonblank(a:lnum-1)
if l:prevlnum == 0
@@ -48,17 +36,17 @@ function! GetTeraTermIndent(lnum)
let l:ind = l:previ
- if l:prevl =~ '^\s*if\>.*\<then\s*$'
+ if l:prevl =~ '^\s*if\>.*\<then\>'
" previous line opened a block
- let l:ind += s:sw()
+ let l:ind += shiftwidth()
endif
if l:prevl =~ '^\s*\%(elseif\|else\|do\|until\|while\|for\)\>'
" previous line opened a block
- let l:ind += s:sw()
+ let l:ind += shiftwidth()
endif
if l:thisl =~ '^\s*\%(elseif\|else\|endif\|enduntil\|endwhile\|loop\|next\)\>'
" this line closed a block
- let l:ind -= s:sw()
+ let l:ind -= shiftwidth()
endif
return l:ind
diff --git a/runtime/indent/tex.vim b/runtime/indent/tex.vim
index 0150bb9623..a748cfbb40 100644
--- a/runtime/indent/tex.vim
+++ b/runtime/indent/tex.vim
@@ -1,8 +1,8 @@
" Vim indent file
" Language: LaTeX
-" Maintainer: YiChao Zhou <broken.zhou AT gmail.com>
+" Maintainer: Yichao Zhou <broken.zhou AT gmail.com>
" Created: Sat, 16 Feb 2002 16:50:19 +0100
-" Version: 0.9.2
+" Version: 1.0.0
" Please email me if you found something I can do. Comments, bug report and
" feature request are welcome.
@@ -15,49 +15,55 @@
" 2005/06/15, Moshe Kaminsky <kaminsky AT math.huji.ac.il>
" (*) New variables:
" g:tex_items, g:tex_itemize_env, g:tex_noindent_env
-" 2011/3/6, by Zhou YiChao <broken.zhou AT gmail.com>
+" 2011/3/6, by Yichao Zhou <broken.zhou AT gmail.com>
" (*) Don't change indentation of lines starting with '%'
" I don't see any code with '%' and it doesn't work properly
" so I add some code.
" (*) New features: Add smartindent-like indent for "{}" and "[]".
" (*) New variables: g:tex_indent_brace
-" 2011/9/25, by Zhou Yichao <broken.zhou AT gmail.com>
+" 2011/9/25, by Yichao Zhou <broken.zhou AT gmail.com>
" (*) Bug fix: smartindent-like indent for "[]"
" (*) New features: Align with "&".
" (*) New variable: g:tex_indent_and.
-" 2011/10/23 by Zhou Yichao <broken.zhou AT gmail.com>
+" 2011/10/23 by Yichao Zhou <broken.zhou AT gmail.com>
" (*) Bug fix: improve the smartindent-like indent for "{}" and
" "[]".
-" 2012/02/27 by Zhou Yichao <broken.zhou AT gmail.com>
+" 2012/02/27 by Yichao Zhou <broken.zhou AT gmail.com>
" (*) Bug fix: support default folding marker.
" (*) Indent with "&" is not very handy. Make it not enable by
" default.
-" 2012/03/06 by Zhou Yichao <broken.zhou AT gmail.com>
+" 2012/03/06 by Yichao Zhou <broken.zhou AT gmail.com>
" (*) Modify "&" behavior and make it default again. Now "&"
" won't align when there are more then one "&" in the previous
" line.
" (*) Add indent "\left(" and "\right)"
" (*) Trust user when in "verbatim" and "lstlisting"
-" 2012/03/11 by Zhou Yichao <broken.zhou AT gmail.com>
+" 2012/03/11 by Yichao Zhou <broken.zhou AT gmail.com>
" (*) Modify "&" so that only indent when current line start with
" "&".
-" 2012/03/12 by Zhou Yichao <broken.zhou AT gmail.com>
+" 2012/03/12 by Yichao Zhou <broken.zhou AT gmail.com>
" (*) Modify indentkeys.
-" 2012/03/18 by Zhou Yichao <broken.zhou AT gmail.com>
+" 2012/03/18 by Yichao Zhou <broken.zhou AT gmail.com>
" (*) Add &cpo
-" 2013/05/02 by Zhou Yichao <broken.zhou AT gmail.com>
+" 2013/05/02 by Yichao Zhou <broken.zhou AT gmail.com>
" (*) Fix problem about GetTeXIndent checker. Thank Albert Netymk
" for reporting this.
-" 2014/06/23 by Zhou Yichao <broken.zhou AT gmail.com>
+" 2014/06/23 by Yichao Zhou <broken.zhou AT gmail.com>
" (*) Remove the feature g:tex_indent_and because it is buggy.
" (*) If there is not any obvious indentation hints, we do not
" alert our user's current indentation.
" (*) g:tex_indent_brace now only works if the open brace is the
" last character of that line.
-" 2014/08/03 by Zhou Yichao <broken.zhou AT gmail.com>
+" 2014/08/03 by Yichao Zhou <broken.zhou AT gmail.com>
" (*) Indent current line if last line has larger indentation
-" 2014/08/09 by Zhou Yichao <broken.zhou AT gmail.com>
-" (*) Add missing return value for s:GetEndIndentation(...)
+" 2016/11/08 by Yichao Zhou <broken.zhou AT gmail.com>
+" (*) Fix problems for \[ and \]. Thanks Bruno for reporting.
+" 2017/04/30 by Yichao Zhou <broken.zhou AT gmail.com>
+" (*) Fix a bug between g:tex_noindent_env and g:tex_indent_items
+" Now g:tex_noindent_env='document\|verbatim\|itemize' (Emacs
+" style) is supported. Thanks Miles Wheeler for reporting.
+" 2018/02/07 by Yichao Zhou <broken.zhou AT gmail.com>
+" (*) Make indentation more smart in the normal mode
"
" }}}
@@ -81,44 +87,39 @@
" % Example 2
" \tikzexternalize[
" prefix=tikz]
-"
+"
" * g:tex_indent_items
"
" If this variable is set, item-environments are indented like Emacs does
" it, i.e., continuation lines are indented with a shiftwidth.
-"
-" NOTE: I've already set the variable below; delete the corresponding line
-" if you don't like this behaviour.
"
-" Per default, it is unset.
-"
-" set unset
-" ----------------------------------------------------------------
-" \begin{itemize} \begin{itemize}
-" \item blablabla \item blablabla
-" bla bla bla bla bla bla
-" \item blablabla \item blablabla
-" bla bla bla bla bla bla
-" \end{itemize} \end{itemize}
+" set unset
+" ------------------------------------------------------
+" \begin{itemize} \begin{itemize}
+" \item blablabla \item blablabla
+" bla bla bla bla bla bla
+" \item blablabla \item blablabla
+" bla bla bla bla bla bla
+" \end{itemize} \end{itemize}
"
"
" * g:tex_items
"
-" A list of tokens to be considered as commands for the beginning of an item
-" command. The tokens should be separated with '\|'. The initial '\' should
+" A list of tokens to be considered as commands for the beginning of an item
+" command. The tokens should be separated with '\|'. The initial '\' should
" be escaped. The default is '\\bibitem\|\\item'.
"
" * g:tex_itemize_env
-"
-" A list of environment names, separated with '\|', where the items (item
-" commands matching g:tex_items) may appear. The default is
+"
+" A list of environment names, separated with '\|', where the items (item
+" commands matching g:tex_items) may appear. The default is
" 'itemize\|description\|enumerate\|thebibliography'.
"
" * g:tex_noindent_env
"
-" A list of environment names. separated with '\|', where no indentation is
+" A list of environment names. separated with '\|', where no indentation is
" required. The default is 'document\|verbatim'.
-" }}}
+" }}}
" Only define the function once
if exists("b:did_indent")
@@ -146,7 +147,7 @@ if g:tex_indent_items
let g:tex_itemize_env = 'itemize\|description\|enumerate\|thebibliography'
endif
if !exists('g:tex_items')
- let g:tex_items = '\\bibitem\|\\item'
+ let g:tex_items = '\\bibitem\|\\item'
endif
else
let g:tex_items = ''
@@ -177,7 +178,7 @@ function! GetTeXIndent() " {{{
" At the start of the file use zero indent.
if lnum == 0
- return 0
+ return 0
endif
let line = substitute(getline(lnum), '\s*%.*', '','g') " last line
@@ -191,9 +192,9 @@ function! GetTeXIndent() " {{{
return indent(v:lnum)
end
endif
-
+
if lnum == 0
- return 0
+ return 0
endif
let ind = indent(lnum)
@@ -206,17 +207,19 @@ function! GetTeXIndent() " {{{
" Add a 'shiftwidth' after beginning of environments.
" Don't add it for \begin{document} and \begin{verbatim}
- ""if line =~ '^\s*\\begin{\(.*\)}' && line !~ 'verbatim'
+ " if line =~ '^\s*\\begin{\(.*\)}' && line !~ 'verbatim'
" LH modification : \begin does not always start a line
" ZYC modification : \end after \begin won't cause wrong indent anymore
- if line =~ '\\begin{.*}' && line !~ g:tex_noindent_env
- let ind = ind + &sw
- let stay = 0
+ if line =~ '\\begin{.*}'
+ if line !~ g:tex_noindent_env
+ let ind = ind + shiftwidth()
+ let stay = 0
+ endif
if g:tex_indent_items
" Add another sw for item-environments
if line =~ g:tex_itemize_env
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
let stay = 0
endif
endif
@@ -235,39 +238,37 @@ function! GetTeXIndent() " {{{
if g:tex_indent_items
" Remove another sw for item-environments
if cline =~ g:tex_itemize_env
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
let stay = 0
endif
endif
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
let stay = 0
endif
if g:tex_indent_brace
- let char = line[strlen(line)-1]
- if char == '[' || char == '{'
- let ind += &sw
+ if line =~ '[[{]$'
+ let ind += shiftwidth()
let stay = 0
endif
- let cind = indent(v:lnum)
- let char = cline[cind]
- if (char == ']' || char == '}') &&
- \ s:CheckPairedIsLastCharacter(v:lnum, cind)
- let ind -= &sw
+ if cline =~ '^\s*\\\?[\]}]' && s:CheckPairedIsLastCharacter(v:lnum, indent(v:lnum))
+ let ind -= shiftwidth()
let stay = 0
endif
- for i in range(indent(lnum)+1, strlen(line)-1)
- let char = line[i]
- if char == ']' || char == '}'
- if s:CheckPairedIsLastCharacter(lnum, i)
- let ind -= &sw
- let stay = 0
+ if line !~ '^\s*\\\?[\]}]'
+ for i in range(indent(lnum)+1, strlen(line)-1)
+ let char = line[i]
+ if char == ']' || char == '}'
+ if s:CheckPairedIsLastCharacter(lnum, i)
+ let ind -= shiftwidth()
+ let stay = 0
+ endif
endif
- endif
- endfor
+ endfor
+ endif
endif
" Special treatment for 'item'
@@ -276,18 +277,19 @@ function! GetTeXIndent() " {{{
if g:tex_indent_items
" '\item' or '\bibitem' itself:
if cline =~ g:tex_items
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
let stay = 0
endif
" lines following to '\item' are intented once again:
if line =~ g:tex_items
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
let stay = 0
endif
endif
- if stay
- " If there is no obvious indentation hint, we trust our user.
+ if stay && mode() == 'i'
+ " If there is no obvious indentation hint, and indentation is triggered
+ " in insert mode, we trust our user.
if empty(cline)
return ind
else
@@ -309,13 +311,13 @@ function! s:GetLastBeginIndentation(lnum) " {{{
let matchend -= 1
endif
if matchend == 0
- if line =~ g:tex_itemize_env
- return indent(lnum) + 2 * &sw
- endif
if line =~ g:tex_noindent_env
return indent(lnum)
endif
- return indent(lnum) + &sw
+ if line =~ g:tex_itemize_env
+ return indent(lnum) + 2 * shiftwidth()
+ endif
+ return indent(lnum) + shiftwidth()
endif
endfor
return -1
@@ -343,17 +345,20 @@ function! s:GetEndIndentation(lnum) " {{{
let min_indent = min([min_indent, indent(lnum)])
endif
endfor
- return min_indent - &sw
+ return min_indent - shiftwidth()
endfunction
" Most of the code is from matchparen.vim
function! s:CheckPairedIsLastCharacter(lnum, col) "{{{
- " Get the character under the cursor and check if it's in 'matchpairs'.
let c_lnum = a:lnum
let c_col = a:col+1
+ let line = getline(c_lnum)
+ if line[c_col-1] == '\'
+ let c_col = c_col + 1
+ endif
+ let c = line[c_col-1]
- let c = getline(c_lnum)[c_col-1]
let plist = split(&matchpairs, '.\zs[:,]')
let i = index(plist, c)
if i < 0
diff --git a/runtime/indent/tf.vim b/runtime/indent/tf.vim
index 17597734b8..a980538506 100644
--- a/runtime/indent/tf.vim
+++ b/runtime/indent/tf.vim
@@ -1,8 +1,8 @@
" Vim indent file
" Language: tf (TinyFugue)
" Maintainer: Christian J. Robinson <heptite@gmail.com>
-" URL: http://christianrobinson.name/vim/indent/tf.vim
-" Last Change: 2002 May 29
+" URL: http://www.vim.org/scripts/script.php?script_id=174
+" Last Change: 2017 Feb 25
" Only load this indent file when no other was loaded.
if exists("b:did_indent")
@@ -38,14 +38,14 @@ function GetTFIndent()
endif
if line =~ '\(/def.*\\\|/for.*\(%;\s*\)\@\<!\\\)$'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
elseif line =~ '\(/if\|/else\|/then\)'
if line !~ '/endif'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
elseif line =~ '/while'
if line !~ '/done'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
endif
@@ -53,11 +53,11 @@ function GetTFIndent()
if line =~ '\(/else\|/endif\|/then\)'
if line !~ '/if'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
elseif line =~ '/done'
if line !~ '/while'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
endif
diff --git a/runtime/indent/tilde.vim b/runtime/indent/tilde.vim
index 5fdcfe0711..13082c8692 100644
--- a/runtime/indent/tilde.vim
+++ b/runtime/indent/tilde.vim
@@ -25,11 +25,11 @@ function GetTildeIndent(lnum)
endif
if getline(v:lnum) =~ '^\s*\~\(endif\|else\|elseif\|end\)\>'
- return indent(v:lnum) - &sw
+ return indent(v:lnum) - shiftwidth()
endif
if getline(plnum) =~ '^\s*\~\(if\|foreach\|foreach_row\|xml_loop\|file_loop\|file_write\|file_append\|imap_loopsections\|imap_index\|imap_list\|ldap_search\|post_loopall\|post_loop\|file_loop\|sql_loop_num\|sql_dbmsselect\|search\|sql_loop\|post\|for\|function_define\|silent\|while\|setvalbig\|mail_create\|systempipe\|mail_send\|dual\|elseif\|else\)\>'
- return indent(plnum) + &sw
+ return indent(plnum) + shiftwidth()
else
return -1
endif
diff --git a/runtime/indent/treetop.vim b/runtime/indent/treetop.vim
index a2af78b8c2..2c6eecf5c4 100644
--- a/runtime/indent/treetop.vim
+++ b/runtime/indent/treetop.vim
@@ -1,7 +1,7 @@
" Vim indent file
-" Language: Treetop
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2011-03-14
+" Language: Treetop
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2011-03-14
if exists("b:did_indent")
finish
@@ -26,12 +26,12 @@ function GetTreetopIndent()
let line = getline(pnum)
if line =~ '^\s*\%(grammar\|module\|rule\)\>'
- let ind += &sw
+ let ind += shiftwidth()
endif
let line = getline(v:lnum)
if line =~ '^\s*end\>'
- let ind -= &sw
+ let ind -= shiftwidth()
end
retur ind
diff --git a/runtime/indent/vb.vim b/runtime/indent/vb.vim
index 55a8ea302a..4d05345565 100644
--- a/runtime/indent/vb.vim
+++ b/runtime/indent/vb.vim
@@ -49,26 +49,26 @@ fun! VbGetIndent(lnum)
" Add
if previous_line =~? '^\s*\<\(begin\|\%(\%(private\|public\|friend\)\s\+\)\=\%(function\|sub\|property\)\|select\|case\|default\|if\|else\|elseif\|do\|for\|while\|enum\|with\)\>'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
" Subtract
if this_line =~? '^\s*\<end\>\s\+\<select\>'
if previous_line !~? '^\s*\<select\>'
- let ind = ind - 2 * &sw
+ let ind = ind - 2 * shiftwidth()
else
" this case is for an empty 'select' -- 'end select'
" (w/o any case statements) like:
"
" select case readwrite
" end select
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
elseif this_line =~? '^\s*\<\(end\|else\|elseif\|until\|loop\|next\|wend\)\>'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
elseif this_line =~? '^\s*\<\(case\|default\)\>'
if previous_line !~? '^\s*\<select\>'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
endif
diff --git a/runtime/indent/verilog.vim b/runtime/indent/verilog.vim
index ecca462636..ab3d0ba3e0 100644
--- a/runtime/indent/verilog.vim
+++ b/runtime/indent/verilog.vim
@@ -1,10 +1,12 @@
" Language: Verilog HDL
-" Maintainer: Chih-Tsun Huang <cthuang@larc.ee.nthu.edu.tw>
-" Last Change: 2011 Dec 10 by Thilo Six
-" URL: http://larc.ee.nthu.edu.tw/~cthuang/vim/indent/verilog.vim
+" Maintainer: Chih-Tsun Huang <cthuang@cs.nthu.edu.tw>
+" Last Change: 2017 Aug 25 by Chih-Tsun Huang
+" URL: http://www.cs.nthu.edu.tw/~cthuang/vim/indent/verilog.vim
"
" Credits:
" Suggestions for improvement, bug reports by
+" Takuya Fujiwara <tyru.exe@gmail.com>
+" Thilo Six <debian@Xk2c.de>
" Leo Butlero <lbutler@brocade.com>
"
" Buffer Variables:
@@ -23,7 +25,8 @@ let b:did_indent = 1
setlocal indentexpr=GetVerilogIndent()
setlocal indentkeys=!^F,o,O,0),=begin,=end,=join,=endcase
setlocal indentkeys+==endmodule,=endfunction,=endtask,=endspecify
-setlocal indentkeys+==`else,=`endif
+setlocal indentkeys+==endconfig,=endgenerate,=endprimitive,=endtable
+setlocal indentkeys+==`else,=`elsif,=`endif
" Only define the function once.
if exists("*GetVerilogIndent")
@@ -38,7 +41,7 @@ function GetVerilogIndent()
if exists('b:verilog_indent_width')
let offset = b:verilog_indent_width
else
- let offset = &sw
+ let offset = shiftwidth()
endif
if exists('b:verilog_indent_modules')
let indent_modules = offset
@@ -82,7 +85,9 @@ function GetVerilogIndent()
endif
" Indent after if/else/for/case/always/initial/specify/fork blocks
- elseif last_line =~ '`\@<!\<\(if\|else\)\>' ||
+ " Note: We exclude '`if' or '`else' and consider 'end else'
+ " 'end if' is redundant here
+ elseif last_line =~ '^\s*\(end\)\=\s*`\@<!\<\(if\|else\)\>' ||
\ last_line =~ '^\s*\<\(for\|case\%[[zx]]\)\>' ||
\ last_line =~ '^\s*\<\(always\|initial\)\>' ||
\ last_line =~ '^\s*\<\(specify\|fork\)\>'
@@ -91,8 +96,8 @@ function GetVerilogIndent()
let ind = ind + offset
if vverb | echo vverb_str "Indent after a block statement." | endif
endif
- " Indent after function/task blocks
- elseif last_line =~ '^\s*\<\(function\|task\)\>'
+ " Indent after function/task/config/generate/primitive/table blocks
+ elseif last_line =~ '^\s*\<\(function\|task\|config\|generate\|primitive\|table\)\>'
if last_line !~ '\<end\>\s*' . vlog_comment . '*$' ||
\ last_line =~ '\(//\|/\*\).*\(;\|\<end\>\)\s*' . vlog_comment . '*$'
let ind = ind + offset
@@ -159,11 +164,11 @@ function GetVerilogIndent()
let ind = ind - offset
if vverb | echo vverb_str "De-indent after a close statement." | endif
- " `ifdef and `else
- elseif last_line =~ '^\s*`\<\(ifdef\|else\)\>'
+ " `ifdef or `ifndef or `elsif or `else
+ elseif last_line =~ '^\s*`\<\(ifn\?def\|elsif\|else\)\>'
let ind = ind + offset
if vverb
- echo vverb_str "Indent after a `ifdef or `else statement."
+ echo vverb_str "Indent after a `ifdef or `ifndef or `elsif or `else statement."
endif
endif
@@ -173,7 +178,8 @@ function GetVerilogIndent()
" De-indent on the end of the block
" join/end/endcase/endfunction/endtask/endspecify
if curr_line =~ '^\s*\<\(join\|end\|endcase\)\>' ||
- \ curr_line =~ '^\s*\<\(endfunction\|endtask\|endspecify\)\>'
+ \ curr_line =~ '^\s*\<\(endfunction\|endtask\|endspecify\)\>' ||
+ \ curr_line =~ '^\s*\<\(endconfig\|endgenerate\|endprimitive\|endtable\)\>'
let ind = ind - offset
if vverb | echo vverb_str "De-indent the end of a block." | endif
elseif curr_line =~ '^\s*\<endmodule\>'
@@ -184,7 +190,7 @@ function GetVerilogIndent()
" De-indent on a stand-alone 'begin'
elseif curr_line =~ '^\s*\<begin\>'
- if last_line !~ '^\s*\<\(function\|task\|specify\|module\)\>' &&
+ if last_line !~ '^\s*\<\(function\|task\|specify\|module\|config\|generate\|primitive\|table\)\>' &&
\ last_line !~ '^\s*\()*\s*;\|)\+\)\s*' . vlog_comment . '*$' &&
\ ( last_line =~
\ '\<\(`\@<!if\|`\@<!else\|for\|case\%[[zx]]\|always\|initial\)\>' ||
@@ -206,10 +212,10 @@ function GetVerilogIndent()
echo vverb_str "De-indent the end of a multiple statement."
endif
- " De-indent `else and `endif
- elseif curr_line =~ '^\s*`\<\(else\|endif\)\>'
+ " De-indent `elsif or `else or `endif
+ elseif curr_line =~ '^\s*`\<\(elsif\|else\|endif\)\>'
let ind = ind - offset
- if vverb | echo vverb_str "De-indent `else and `endif statement." | endif
+ if vverb | echo vverb_str "De-indent `elsif or `else or `endif statement." | endif
endif
diff --git a/runtime/indent/vhdl.vim b/runtime/indent/vhdl.vim
index 3e847b9575..ad318066f4 100644
--- a/runtime/indent/vhdl.vim
+++ b/runtime/indent/vhdl.vim
@@ -1,8 +1,8 @@
" VHDL indent ('93 syntax)
" Language: VHDL
" Maintainer: Gerald Lai <laigera+vim?gmail.com>
-" Version: 1.58
-" Last Change: 2011 Sep 27
+" Version: 1.62
+" Last Change: 2017 Oct 17
" URL: http://www.vim.org/scripts/script.php?script_id=1450
" only load this indent file when no other was loaded
@@ -104,7 +104,7 @@ function GetVHDLindent()
let pn = prevnonblank(pn - 1)
let ps = getline(pn)
endwhile
- if (curs =~ '^\s*)' || curs =~? '^\s*\%(\<\%(procedure\|generic\|map\|port\)\>.*\)\@<!\w\+\s*\w*\s*\%(=>\s*\S\+\|:[^=]\@=\s*\%(\%(in\|out\|inout\|buffer\|linkage\)\>\|\w\+\s\+:=\)\)') && (prevs =~? s:NC.'\<\%(procedure\s\+\S\+\|generic\|map\|port\)\s*(\%(\s*\w\)\=' || (ps =~? s:NC.'\<\%(procedure\|generic\|map\|port\)'.s:ES && prevs =~ '^\s*('))
+ if (curs =~ '^\s*)' || curs =~? '^\s*\%(\<\%(procedure\|generic\|map\|port\)\>.*\)\@<!\w\+\s*\w*\s*\((.*)\)*\s*\%(=>\s*\S\+\|:[^=]\@=\s*\%(\%(in\|out\|inout\|buffer\|linkage\)\>\|\s\+\)\)') && (prevs =~? s:NC.'\<\%(procedure\s\+\S\+\|generic\|map\|port\)\s*(\%(\s*\w\)\=' || (ps =~? s:NC.'\<\%(procedure\|generic\|map\|port\)'.s:ES && prevs =~ '^\s*('))
" align closing ")" with opening "("
if curs =~ '^\s*)'
return ind2 + stridx(prevs_noi, '(')
@@ -114,9 +114,9 @@ function GetVHDLindent()
return ind2 + m
else
if g:vhdl_indent_genportmap
- return ind2 + stridx(prevs_noi, '(') + &sw
+ return ind2 + stridx(prevs_noi, '(') + shiftwidth()
else
- return ind2 + &sw
+ return ind2 + shiftwidth()
endif
endif
endif
@@ -128,7 +128,7 @@ function GetVHDLindent()
if g:vhdl_indent_rhsassign
return ind2 + matchend(prevs_noi, '<=\s*\ze.')
else
- return ind2 + &sw
+ return ind2 + shiftwidth()
endif
endif
@@ -218,12 +218,12 @@ function GetVHDLindent()
let ps = getline(pn)
if (ps =~? s:NC.'\<begin\>')
- return indent(pn) - &sw
+ return indent(pn) - shiftwidth()
endif
endwhile
if (pn == 0)
- return ind - &sw
+ return ind - shiftwidth()
else
return indent(pn)
endif
@@ -237,7 +237,7 @@ function GetVHDLindent()
" keyword: "type"
let s3 = s:NC.s:NE.'\<type\>'
if curs !~? s3.'.*'.s:NC.'\<\%(record\|units\)\>.*'.s:ES && prevs =~? s3
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
return ind
endif
@@ -282,7 +282,7 @@ function GetVHDLindent()
" removed: "begin", "case", "elsif", "if", "loop", "record", "units", "while"
" where: anywhere in previous line
if prevs =~? s:NC.s:NE.'\<\%(block\|process\)\>'
- return ind + &sw
+ return ind + shiftwidth()
endif
" indent: +sw
@@ -290,7 +290,7 @@ function GetVHDLindent()
" removed: "component", "for", "when", "with"
" where: start of previous line
if prevs =~? '^\s*\%(architecture\|configuration\|entity\|package\)\>'
- return ind + &sw
+ return ind + shiftwidth()
endif
" indent: +sw
@@ -298,7 +298,7 @@ function GetVHDLindent()
" removed: "generate", "is", "=>"
" where: end of previous line
if prevs =~? s:NC.'\<select'.s:ES
- return ind + &sw
+ return ind + shiftwidth()
endif
" indent: +sw
@@ -310,7 +310,7 @@ function GetVHDLindent()
" where: end of previous line
" _note_: indent allowed to leave this filter
if prevs =~? s:NC.'\%(\<begin\>\|'.s:NE.'\<\%(loop\|record\|units\)\>\)' || prevs =~? '^\s*\%(component\|else\|for\)\>' || prevs =~? s:NC.'\%('.s:NE.'\<generate\|\<\%(is\|then\)\|=>\)'.s:ES
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
" ****************************************************************************************
@@ -322,7 +322,7 @@ function GetVHDLindent()
if prevs =~? s:NC.'\<is'.s:ES
return ind
elseif prevs !~? s4
- return ind - &sw
+ return ind - shiftwidth()
else
return ind2
endif
@@ -336,7 +336,7 @@ function GetVHDLindent()
if prevs =~? '^\s*\%(elsif\|'.s5.'\)'
return ind
else
- return ind - &sw
+ return ind - shiftwidth()
endif
endif
@@ -367,9 +367,9 @@ function GetVHDLindent()
"where: start of previous non-comment line
if m == 1
if ps =~? '^\s*end\s\+case\>'
- return indent(pn) - 2 * &sw
+ return indent(pn) - 2 * shiftwidth()
elseif ps =~? '^\s*when\>'
- return indent(pn) - &sw
+ return indent(pn) - shiftwidth()
elseif ps =~? '^\s*case\>'
return indent(pn)
endif
@@ -385,14 +385,14 @@ function GetVHDLindent()
let pn = prevnonblank(pn - 1)
let ps = getline(pn)
endwhile
- return ind - &sw
+ return ind - shiftwidth()
endif
" indent: -sw
" keyword: ")"
" where: start of current line
if curs =~ '^\s*)'
- return ind - &sw
+ return ind - shiftwidth()
endif
" indent: 0
@@ -407,7 +407,7 @@ function GetVHDLindent()
" where: start of current line
"if curs =~? '^\s*end\s\+\w\+\>'
if curs =~? '^\s*end\%(\s\|;'.s:ES.'\)'
- return ind - &sw
+ return ind - shiftwidth()
endif
" ****************************************************************************************
@@ -418,6 +418,18 @@ function GetVHDLindent()
return ind2
endif
+ " ****************************************************************************************
+ " indent: maintain indent of previous opening statement, corner case which
+ " does not end in ;, but is part of a mapping
+ " keywords: without "procedure", "generic", "map", "port" + ":" but not ":=", never + ;$ and
+ " prevline without "procedure", "generic", "map", "port" + ":" but not ":=" + eventually ;$
+ " where: start of current line
+ if curs =~? '^\s*\%(\<\%(procedure\|generic\|map\|port\)\>.*\)\@<!\w\+\s*\w*\s*:[^=].*[^;].*$'
+ if prevs =~? '^\s*\%(\<\%(procedure\|generic\|map\|port\)\>.*\)\@<!\w\+\s*\w*\s*:[^=].*;.*$'
+ return ind2
+ endif
+ endif
+
" return leftover filtered indent
return ind
endfunction
diff --git a/runtime/indent/vim.vim b/runtime/indent/vim.vim
index 31b76b8c0c..8ebfa12caf 100644
--- a/runtime/indent/vim.vim
+++ b/runtime/indent/vim.vim
@@ -1,7 +1,7 @@
" Vim indent file
" Language: Vim script
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2016 Jan 24
+" Last Change: 2016 Jun 27
" Only load this indent file when no other was loaded.
if exists("b:did_indent")
@@ -60,7 +60,7 @@ function GetVimIndentIntern()
else
let ind = ind + shiftwidth() * 3
endif
- elseif prev_text =~ '^\s*aug\%[roup]' && prev_text !~ '^\s*aug\%[roup]\s*!\=\s\+END'
+ elseif prev_text =~ '^\s*aug\%[roup]\s\+' && prev_text !~ '^\s*aug\%[roup]\s\+[eE][nN][dD]\>'
let ind = ind + shiftwidth()
else
" A line starting with :au does not increment/decrement indent.
@@ -89,7 +89,7 @@ function GetVimIndentIntern()
" Subtract a 'shiftwidth' on a :endif, :endwhile, :catch, :finally, :endtry,
" :endfun, :else and :augroup END.
- if cur_text =~ '^\s*\(ene\@!\|cat\|fina\|el\|aug\%[roup]\s*!\=\s\+[eE][nN][dD]\)'
+ if cur_text =~ '^\s*\(ene\@!\|cat\|fina\|el\|aug\%[roup]\s\+[eE][nN][dD]\)'
let ind = ind - shiftwidth()
endif
diff --git a/runtime/indent/wast.vim b/runtime/indent/wast.vim
new file mode 100644
index 0000000000..1be234b6e9
--- /dev/null
+++ b/runtime/indent/wast.vim
@@ -0,0 +1,17 @@
+" Vim indent file
+" Language: WebAssembly
+" Maintainer: rhysd <lin90162@yahoo.co.jp>
+" Last Change: Jul 29, 2018
+" For bugs, patches and license go to https://github.com/rhysd/vim-wasm
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" WebAssembly text format is S-expression. We can reuse LISP indentation
+" logic.
+setlocal indentexpr=lispindent('.')
+setlocal noautoindent nosmartindent
+
+let b:undo_indent = "setl lisp< indentexpr<"
diff --git a/runtime/indent/xf86conf.vim b/runtime/indent/xf86conf.vim
index 4174a24224..5a8bc0fec1 100644
--- a/runtime/indent/xf86conf.vim
+++ b/runtime/indent/xf86conf.vim
@@ -1,7 +1,7 @@
" Vim indent file
-" Language: XFree86 Configuration File
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-12-20
+" Language: XFree86 Configuration File
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-20
if exists("b:did_indent")
finish
@@ -26,11 +26,11 @@ function GetXF86ConfIndent()
let ind = indent(lnum)
if getline(lnum) =~? '^\s*\(Sub\)\=Section\>'
- let ind = ind + &sw
+ let ind = ind + shiftwidth()
endif
if getline(v:lnum) =~? '^\s*End\(Sub\)\=Section\>'
- let ind = ind - &sw
+ let ind = ind - shiftwidth()
endif
return ind
diff --git a/runtime/indent/xinetd.vim b/runtime/indent/xinetd.vim
index c8127237e8..977ee3d33b 100644
--- a/runtime/indent/xinetd.vim
+++ b/runtime/indent/xinetd.vim
@@ -1,7 +1,7 @@
" Vim indent file
-" Language: xinetd.conf(5) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-12-20
+" Language: xinetd.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-20
if exists("b:did_indent")
finish
@@ -47,8 +47,8 @@ function GetXinetdIndent()
return 0
endif
- return indent(pnum) + s:count_braces(pnum, 1) * &sw
- \ - s:count_braces(v:lnum, 0) * &sw
+ return indent(pnum) + s:count_braces(pnum, 1) * shiftwidth()
+ \ - s:count_braces(v:lnum, 0) * shiftwidth()
endfunction
let &cpo = s:keepcpo
diff --git a/runtime/indent/xml.vim b/runtime/indent/xml.vim
index dbe5be5f25..dcafb467a6 100644
--- a/runtime/indent/xml.vim
+++ b/runtime/indent/xml.vim
@@ -1,6 +1,8 @@
" Language: xml
-" Maintainer: Johannes Zellner <johannes@zellner.org>
-" Last Change: 2012 Jul 25
+" Repository: https://github.com/chrisbra/vim-xml-ftplugin
+" Maintainer: Christian Brabandt <cb@256bit.org>
+" Previous Maintainer: Johannes Zellner <johannes@zellner.org>
+" Last Change: 20180724 - Correctly indent xml comments https://github.com/vim/vim/issues/3200
" Notes: 1) does not indent pure non-xml code (e.g. embedded scripts)
" 2) will be confused by unbalanced tags in comments
" or CDATA sections.
@@ -55,9 +57,6 @@ fun! <SID>XmlIndentSynCheck(lnum)
if '' != syn1 && syn1 !~ 'xml' && '' != syn2 && syn2 !~ 'xml'
" don't indent pure non-xml code
return 0
- elseif syn1 =~ '^xmlComment' && syn2 =~ '^xmlComment'
- " indent comments specially
- return -1
endif
endif
return 1
@@ -67,7 +66,7 @@ endfun
fun! <SID>XmlIndentSum(lnum, style, add)
let line = getline(a:lnum)
if a:style == match(line, '^\s*</')
- return (&sw *
+ return (shiftwidth() *
\ (<SID>XmlIndentWithPattern(line, b:xml_indent_open)
\ - <SID>XmlIndentWithPattern(line, b:xml_indent_close)
\ - <SID>XmlIndentWithPattern(line, '.\{-}/>'))) + a:add
diff --git a/runtime/indent/yacc.vim b/runtime/indent/yacc.vim
index 2ab7d7b38c..01ad4fc56d 100644
--- a/runtime/indent/yacc.vim
+++ b/runtime/indent/yacc.vim
@@ -1,7 +1,7 @@
" Vim indent file
-" Language: YACC input file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-12-20
+" Language: YACC input file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-20
" Only load this indent file when no other was loaded.
if exists("b:did_indent")
diff --git a/runtime/indent/yaml.vim b/runtime/indent/yaml.vim
index aa4906ce0a..3eb16f845d 100644
--- a/runtime/indent/yaml.vim
+++ b/runtime/indent/yaml.vim
@@ -1,7 +1,7 @@
" Vim indent file
" Language: YAML
" Maintainer: Nikolai Pavlov <zyx.vim@gmail.com>
-" Last Change: 2015 Nov 01
+" Last Change: 2017 Jun 13
" Only load this indent file when no other was loaded.
if exists('b:did_indent')
@@ -24,20 +24,12 @@ if exists('*GetYAMLIndent')
finish
endif
-if exists('*shiftwidth')
- let s:shiftwidth = function('shiftwidth')
-else
- function s:shiftwidth()
- return &shiftwidth
- endfunction
-endif
-
function s:FindPrevLessIndentedLine(lnum, ...)
let prevlnum = prevnonblank(a:lnum-1)
let curindent = a:0 ? a:1 : indent(a:lnum)
while prevlnum
\&& indent(prevlnum) >= curindent
- \&& getline(prevlnum) !~# '^\s*#'
+ \&& getline(prevlnum) =~# '^\s*#'
let prevlnum = prevnonblank(prevlnum-1)
endwhile
return prevlnum
@@ -51,11 +43,33 @@ function s:FindPrevLEIndentedLineMatchingRegex(lnum, regex)
return plilnum
endfunction
-let s:mapkeyregex='\v^\s*%(\''%([^'']|'''')*\'''.
- \ '|\"%([^"\\]|\\.)*\"'.
- \ '|%(%(\:\ )@!.)*)\:%(\ |$)'
+let s:mapkeyregex='\v^\s*\#@!\S@=%(\''%([^'']|\''\'')*\'''.
+ \ '|\"%([^"\\]|\\.)*\"'.
+ \ '|%(%(\:\ )@!.)*)\:%(\ |$)'
let s:liststartregex='\v^\s*%(\-%(\ |$))'
+let s:c_ns_anchor_char = '\v%([\n\r\uFEFF \t,[\]{}]@!\p)'
+let s:c_ns_anchor_name = s:c_ns_anchor_char.'+'
+let s:c_ns_anchor_property = '\v\&'.s:c_ns_anchor_name
+
+let s:ns_word_char = '\v[[:alnum:]_\-]'
+let s:ns_tag_char = '\v%(%\x\x|'.s:ns_word_char.'|[#/;?:@&=+$.~*''()])'
+let s:c_named_tag_handle = '\v\!'.s:ns_word_char.'+\!'
+let s:c_secondary_tag_handle = '\v\!\!'
+let s:c_primary_tag_handle = '\v\!'
+let s:c_tag_handle = '\v%('.s:c_named_tag_handle.
+ \ '|'.s:c_secondary_tag_handle.
+ \ '|'.s:c_primary_tag_handle.')'
+let s:c_ns_shorthand_tag = '\v'.s:c_tag_handle . s:ns_tag_char.'+'
+let s:c_non_specific_tag = '\v\!'
+let s:ns_uri_char = '\v%(%\x\x|'.s:ns_word_char.'\v|[#/;?:@&=+$,.!~*''()[\]])'
+let s:c_verbatim_tag = '\v\!\<'.s:ns_uri_char.'+\>'
+let s:c_ns_tag_property = '\v'.s:c_verbatim_tag.
+ \ '\v|'.s:c_ns_shorthand_tag.
+ \ '\v|'.s:c_non_specific_tag
+
+let s:block_scalar_header = '\v[|>]%([+-]?[1-9]|[1-9]?[+-])?'
+
function GetYAMLIndent(lnum)
if a:lnum == 1 || !prevnonblank(a:lnum-1)
return 0
@@ -97,7 +111,7 @@ function GetYAMLIndent(lnum)
"
" - |-
" Block scalar without indentation indicator
- return previndent+s:shiftwidth()
+ return previndent+shiftwidth()
elseif prevline =~# '\v[:-]\ [|>]%(\d+[+\-]?|[+\-]?\d+)%(\#.*|\s*)$'
" - |+2
" block scalar with indentation indicator
@@ -127,10 +141,13 @@ function GetYAMLIndent(lnum)
" - List with
" multiline scalar
return previndent+2
- elseif prevline =~# s:mapkeyregex
+ elseif prevline =~# s:mapkeyregex . '\v\s*%(%('.s:c_ns_tag_property.
+ \ '\v|'.s:c_ns_anchor_property.
+ \ '\v|'.s:block_scalar_header.
+ \ '\v)%(\s+|\s*%(\#.*)?$))*'
" Mapping with: value
" that is multiline scalar
- return previndent+s:shiftwidth()
+ return previndent+shiftwidth()
endif
return previndent
endfunction
diff --git a/runtime/keymap/armenian-eastern_utf-8.vim b/runtime/keymap/armenian-eastern_utf-8.vim
new file mode 100644
index 0000000000..eaa60a77f8
--- /dev/null
+++ b/runtime/keymap/armenian-eastern_utf-8.vim
@@ -0,0 +1,110 @@
+" Maintainer: Benjamin Linskey <vim@benlinskey.com>
+" Last Changed: 2016 December 5
+" URL: https://github.com/blinskey/vim-armenian-keymaps
+
+let b:keymap_name = "hy"
+
+loadkeymap
+
+" Capital letters
+A ิฑ
+B ิฒ
+C ิณ
+D ิด
+Y ิต
+Z ิถ
+E ิท
+U ิธ
+: ิน
++ ิบ
+I ิป
+L ิผ
+Q ิฝ
+? ิพ
+K ิฟ
+H ี€
+@ ี
+> ี‚
+J ีƒ
+M ี„
+# ี…
+N ี†
+< ี‡
+O ีˆ
+{ ี‰
+P ีŠ
+} ี‹
+_ ีŒ
+S ี
+V ีŽ
+T ี
+R ี
+X ี‘
+W ี’
+\" ี“
+G ี”
+) ี•
+F ี–
+
+" Lowercase letters
+a ีก
+b ีข
+c ีฃ
+d ีค
+y ีฅ
+z ีฆ
+e ีง
+u ีจ
+; ีฉ
+= ีช
+i ีซ
+l ีฌ
+q ีญ
+/ ีฎ
+k ีฏ
+h ีฐ
+2 ีฑ
+. ีฒ
+j ีณ
+m ีด
+3 ีต
+n ีถ
+, ีท
+o ีธ
+[ ีน
+p ีบ
+] ีป
+- ีผ
+s ีฝ
+v ีพ
+t ีฟ
+r ึ€
+x ึ
+w ึ‚
+' ึƒ
+g ึ„
+0 ึ…
+f ึ†
+
+& ึ‡
+
+" Punctuation
+` ี
+~ ีœ
+1 ึ‰
+4 ี›
+5 ,
+6 -
+7 .
+8 ยซ
+9 ยป
+* (
+( )
+\\ '
+| ีž
+
+" Numbers
+! 1
+$ 3
+% 4
+^ 9
diff --git a/runtime/keymap/armenian-western_utf-8.vim b/runtime/keymap/armenian-western_utf-8.vim
new file mode 100644
index 0000000000..cf3efdc00f
--- /dev/null
+++ b/runtime/keymap/armenian-western_utf-8.vim
@@ -0,0 +1,110 @@
+" Maintainer: Benjamin Linskey <vim@benlinskey.com>
+" Last Changed: 2016 December 5
+" URL: https://github.com/blinskey/vim-armenian-keymaps
+
+let b:keymap_name = "hy"
+
+loadkeymap
+
+" Capital letters
+A ิฑ
+P ิฒ
+C ิณ
+T ิด
+Y ิต
+Z ิถ
+E ิท
+U ิธ
+: ิน
++ ิบ
+I ิป
+L ิผ
+Q ิฝ
+? ิพ
+G ิฟ
+H ี€
+@ ี
+> ี‚
+J ีƒ
+M ี„
+# ี…
+N ี†
+< ี‡
+O ีˆ
+{ ี‰
+B ีŠ
+} ี‹
+_ ีŒ
+S ี
+W ีŽ
+D ี
+R ี
+X ี‘
+V ี’
+\" ี“
+K ี”
+) ี•
+F ี–
+
+" Lowercase letters
+a ีก
+p ีข
+c ีฃ
+t ีค
+y ีฅ
+z ีฆ
+e ีง
+u ีจ
+; ีฉ
+= ีช
+i ีซ
+l ีฌ
+q ีญ
+/ ีฎ
+g ีฏ
+h ีฐ
+2 ีฑ
+. ีฒ
+j ีณ
+m ีด
+3 ีต
+n ีถ
+, ีท
+o ีธ
+[ ีน
+b ีบ
+] ีป
+- ีผ
+s ีฝ
+w ีพ
+d ีฟ
+r ึ€
+x ึ
+v ึ‚
+' ึƒ
+k ึ„
+0 ึ…
+f ึ†
+
+& ึ‡
+
+" Punctuation
+` ี
+~ ีœ
+1 ึ‰
+4 ี›
+5 ,
+6 -
+7 .
+8 ยซ
+9 ยป
+* (
+( )
+\\ '
+| ีž
+
+" Numbers
+! 1
+$ 3
+% 4
+^ 9
diff --git a/runtime/keymap/kazakh-jcuken.vim b/runtime/keymap/kazakh-jcuken.vim
new file mode 100644
index 0000000000..63d122d112
--- /dev/null
+++ b/runtime/keymap/kazakh-jcuken.vim
@@ -0,0 +1,102 @@
+" Vim Keymap file for kazakh characters, layout 'jcuken', classical variant
+
+" Derived from russian-jcuken.vim by Artem Chuprina <ran@ran.pp.ru>
+" Maintainer: Darkhan Kubigenov <darkhanu@gmail.com>
+" Last Changed: 2016 Oct 25
+
+" All characters are given literally, conversion to another encoding (e.g.,
+" UTF-8) should work.
+scriptencoding utf-8
+
+let b:keymap_name = "kk"
+
+loadkeymap
+~ ) CYRILLIC CAPITAL LETTER IO
+` ( CYRILLIC SMALL LETTER IO
+F ะ CYRILLIC CAPITAL LETTER A
+< ะ‘ CYRILLIC CAPITAL LETTER BE
+D ะ’ CYRILLIC CAPITAL LETTER VE
+U ะ“ CYRILLIC CAPITAL LETTER GHE
+L ะ” CYRILLIC CAPITAL LETTER DE
+T ะ• CYRILLIC CAPITAL LETTER IE
+: ะ– CYRILLIC CAPITAL LETTER ZHE
+P ะ— CYRILLIC CAPITAL LETTER ZE
+B ะ˜ CYRILLIC CAPITAL LETTER I
+Q ะ™ CYRILLIC CAPITAL LETTER SHORT I
+R ะš CYRILLIC CAPITAL LETTER KA
+K ะ› CYRILLIC CAPITAL LETTER EL
+V ะœ CYRILLIC CAPITAL LETTER EM
+Y ะ CYRILLIC CAPITAL LETTER EN
+J ะž CYRILLIC CAPITAL LETTER O
+G ะŸ CYRILLIC CAPITAL LETTER PE
+H ะ  CYRILLIC CAPITAL LETTER ER
+C ะก CYRILLIC CAPITAL LETTER ES
+N ะข CYRILLIC CAPITAL LETTER TE
+E ะฃ CYRILLIC CAPITAL LETTER U
+A ะค CYRILLIC CAPITAL LETTER EF
+{ ะฅ CYRILLIC CAPITAL LETTER HA
+W ะฆ CYRILLIC CAPITAL LETTER TSE
+X ะง CYRILLIC CAPITAL LETTER CHE
+I ะจ CYRILLIC CAPITAL LETTER SHA
+O ะฉ CYRILLIC CAPITAL LETTER SHCHA
+} ะช CYRILLIC CAPITAL LETTER HARD SIGN
+S ะซ CYRILLIC CAPITAL LETTER YERU
+M ะฌ CYRILLIC CAPITAL LETTER SOFT SIGN
+\" ะญ CYRILLIC CAPITAL LETTER E
+> ะฎ CYRILLIC CAPITAL LETTER YU
+Z ะฏ CYRILLIC CAPITAL LETTER YA
+f ะฐ CYRILLIC SMALL LETTER A
+, ะฑ CYRILLIC SMALL LETTER BE
+d ะฒ CYRILLIC SMALL LETTER VE
+u ะณ CYRILLIC SMALL LETTER GHE
+l ะด CYRILLIC SMALL LETTER DE
+t ะต CYRILLIC SMALL LETTER IE
+; ะถ CYRILLIC SMALL LETTER ZHE
+p ะท CYRILLIC SMALL LETTER ZE
+b ะธ CYRILLIC SMALL LETTER I
+q ะน CYRILLIC SMALL LETTER SHORT I
+r ะบ CYRILLIC SMALL LETTER KA
+k ะป CYRILLIC SMALL LETTER EL
+v ะผ CYRILLIC SMALL LETTER EM
+y ะฝ CYRILLIC SMALL LETTER EN
+j ะพ CYRILLIC SMALL LETTER O
+g ะฟ CYRILLIC SMALL LETTER PE
+h ั€ CYRILLIC SMALL LETTER ER
+c ั CYRILLIC SMALL LETTER ES
+n ั‚ CYRILLIC SMALL LETTER TE
+e ัƒ CYRILLIC SMALL LETTER U
+a ั„ CYRILLIC SMALL LETTER EF
+[ ั… CYRILLIC SMALL LETTER HA
+w ั† CYRILLIC SMALL LETTER TSE
+x ั‡ CYRILLIC SMALL LETTER CHE
+i ัˆ CYRILLIC SMALL LETTER SHA
+o ั‰ CYRILLIC SMALL LETTER SHCHA
+] ัŠ CYRILLIC SMALL LETTER HARD SIGN
+s ั‹ CYRILLIC SMALL LETTER YERU
+m ัŒ CYRILLIC SMALL LETTER SOFT SIGN
+' ั CYRILLIC SMALL LETTER E
+. ัŽ CYRILLIC SMALL LETTER YU
+z ั CYRILLIC SMALL LETTER YA
+@ ำ˜ CYRILLIC CAPITAL LETTER SCHWA
+# ะ† CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+$ าข CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+% า’ CYRILLIC CAPITAL LETTER GHE WITH STROKE
+^ ;
+& :
+* าฎ CYRILLIC CAPITAL LETTER STRAIGHT U
+( าฐ CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+) าš CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+_ ำจ CYRILLIC CAPITAL LETTER BARRED O
++ าบ CYRILLIC CAPITAL LETTER SHHA
+1 "
+2 ำ™ CYRILLIC SMALL LETTER SCHWA
+3 ั– CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+4 าฃ CYRILLIC SMALL LETTER EN WITH DESCENDER
+5 า“ CYRILLIC SMALL LETTER GHE WITH STROKE
+6 ,
+7 .
+8 าฏ CYRILLIC SMALL LETTER STRAIGHT U
+9 าฑ CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+0 า› CYRILLIC SMALL LETTER KA WITH DESCENDER
+- ำฉ CYRILLIC SMALL LETTER BARRED O
+= าป CYRILLIC SMALL LETTER SHHA
diff --git a/runtime/keymap/oldturkic-orkhon_utf-8.vim b/runtime/keymap/oldturkic-orkhon_utf-8.vim
new file mode 100644
index 0000000000..e1f0015a2a
--- /dev/null
+++ b/runtime/keymap/oldturkic-orkhon_utf-8.vim
@@ -0,0 +1,143 @@
+" Maintainer: Oliver Corff <oliver.corff@email.de>
+" Last Changed: 2018 Feb 12
+
+scriptencoding utf-8
+
+" oto = Old Turkic, Orkhon
+let b:keymap_name = "oto"
+highlight lCursor guibg=red guifg=NONE
+
+" map F8 to toggle keymap (Ctrl-^ not present on keyboard)
+noremap <F8> :let &iminsert = ! &iminsert<CR>
+lnoremap <F8> <C-^>
+noremap! <F8> <C-^>
+
+loadkeymap
+A ๐ฐ€ 10C00 OLD TURKIC LETTER ORKHON A
+00 ๐ฐ€ 10C00 OLD TURKIC LETTER ORKHON A
+I ๐ฐƒ 10C03 OLD TURKIC LETTER ORKHON I
+03 ๐ฐƒ 10C03 OLD TURKIC LETTER ORKHON I
+O ๐ฐ† 10C06 OLD TURKIC LETTER ORKHON O
+U ๐ฐ† 10C06 OLD TURKIC LETTER ORKHON O
+06 ๐ฐ† 10C06 OLD TURKIC LETTER ORKHON O
+OE ๐ฐ‡ 10C07 OLD TURKIC LETTER ORKHON OE
+UE ๐ฐ‡ 10C07 OLD TURKIC LETTER ORKHON OE
+07 ๐ฐ‡ 10C07 OLD TURKIC LETTER ORKHON OE
+ab ๐ฐ‰ 10C09 OLD TURKIC LETTER ORKHON AB
+b1 ๐ฐ‰ 10C09 OLD TURKIC LETTER ORKHON AB
+09 ๐ฐ‰ 10C09 OLD TURKIC LETTER ORKHON AB
+aeb ๐ฐ‹ 10C0B OLD TURKIC LETTER ORKHON AEB
+eb ๐ฐ‹ 10C0B OLD TURKIC LETTER ORKHON AEB
+b2 ๐ฐ‹ 10C0B OLD TURKIC LETTER ORKHON AEB
+0b ๐ฐ‹ 10C0B OLD TURKIC LETTER ORKHON AEB
+ag ๐ฐ 10C0D OLD TURKIC LETTER ORKHON AG
+g1 ๐ฐ 10C0D OLD TURKIC LETTER ORKHON AG
+0d ๐ฐ 10C0D OLD TURKIC LETTER ORKHON AG
+aeg ๐ฐ 10C0F OLD TURKIC LETTER ORKHON AEG
+eg ๐ฐ 10C0F OLD TURKIC LETTER ORKHON AEG
+g2 ๐ฐ 10C0F OLD TURKIC LETTER ORKHON AEG
+0f ๐ฐ 10C0F OLD TURKIC LETTER ORKHON AEG
+ad ๐ฐ‘ 10C11 OLD TURKIC LETTER ORKHON AD
+d1 ๐ฐ‘ 10C11 OLD TURKIC LETTER ORKHON AD
+11 ๐ฐ‘ 10C11 OLD TURKIC LETTER ORKHON AD
+aed ๐ฐ“ 10C13 OLD TURKIC LETTER ORKHON AED
+ed ๐ฐ“ 10C13 OLD TURKIC LETTER ORKHON AED
+d2 ๐ฐ“ 10C13 OLD TURKIC LETTER ORKHON AED
+13 ๐ฐ“ 10C13 OLD TURKIC LETTER ORKHON AED
+ez ๐ฐ” 10C14 OLD TURKIC LETTER ORKHON EZ
+z ๐ฐ” 10C14 OLD TURKIC LETTER ORKHON EZ
+14 ๐ฐ” 10C14 OLD TURKIC LETTER ORKHON EZ
+ay ๐ฐ– 10C16 OLD TURKIC LETTER ORKHON AY
+y1 ๐ฐ– 10C16 OLD TURKIC LETTER ORKHON AY
+16 ๐ฐ– 10C16 OLD TURKIC LETTER ORKHON AY
+aey ๐ฐ˜ 10C18 OLD TURKIC LETTER ORKHON AEY
+ey ๐ฐ˜ 10C18 OLD TURKIC LETTER ORKHON AEY
+y2 ๐ฐ˜ 10C18 OLD TURKIC LETTER ORKHON AEY
+18 ๐ฐ˜ 10C18 OLD TURKIC LETTER ORKHON AEY
+aek ๐ฐš 10C1A OLD TURKIC LETTER ORKHON AEK
+k ๐ฐš 10C1A OLD TURKIC LETTER ORKHON AEK
+1a ๐ฐš 10C1A OLD TURKIC LETTER ORKHON AEK
+oek ๐ฐœ 10C1C OLD TURKIC LETTER ORKHON OEK
+q ๐ฐœ 10C1C OLD TURKIC LETTER ORKHON OEK
+1c ๐ฐœ 10C1C OLD TURKIC LETTER ORKHON OEK
+al ๐ฐž 10C1E OLD TURKIC LETTER ORKHON AL
+l1 ๐ฐž 10C1E OLD TURKIC LETTER ORKHON AL
+1e ๐ฐž 10C1E OLD TURKIC LETTER ORKHON AL
+ael ๐ฐ  10C20 OLD TURKIC LETTER ORKHON AEL
+el ๐ฐ  10C20 OLD TURKIC LETTER ORKHON AEL
+l2 ๐ฐ  10C20 OLD TURKIC LETTER ORKHON AEL
+20 ๐ฐ  10C20 OLD TURKIC LETTER ORKHON AEL
+elt ๐ฐก 10C21 OLD TURKIC LETTER ORKHON ELT
+lt ๐ฐก 10C21 OLD TURKIC LETTER ORKHON ELT
+21 ๐ฐก 10C21 OLD TURKIC LETTER ORKHON ELT
+em ๐ฐข 10C22 OLD TURKIC LETTER ORKHON EM
+m ๐ฐข 10C22 OLD TURKIC LETTER ORKHON EM
+22 ๐ฐข 10C22 OLD TURKIC LETTER ORKHON EM
+an ๐ฐฃ 10C23 OLD TURKIC LETTER ORKHON AN
+n1 ๐ฐฃ 10C23 OLD TURKIC LETTER ORKHON AN
+23 ๐ฐฃ 10C23 OLD TURKIC LETTER ORKHON AN
+en ๐ฐค 10C24 OLD TURKIC LETTER ORKHON AEN
+n2 ๐ฐค 10C24 OLD TURKIC LETTER ORKHON AEN
+24 ๐ฐค 10C24 OLD TURKIC LETTER ORKHON AEN
+ent ๐ฐฆ 10C26 OLD TURKIC LETTER ORKHON ENT
+nt ๐ฐฆ 10C26 OLD TURKIC LETTER ORKHON ENT
+26 ๐ฐฆ 10C26 OLD TURKIC LETTER ORKHON ENT
+enc ๐ฐจ 10C28 OLD TURKIC LETTER ORKHON ENC
+nc ๐ฐจ 10C28 OLD TURKIC LETTER ORKHON ENC
+28 ๐ฐจ 10C28 OLD TURKIC LETTER ORKHON ENC
+eny ๐ฐช 10C2A OLD TURKIC LETTER ORKHON ENY
+ny ๐ฐช 10C2A OLD TURKIC LETTER ORKHON ENY
+2a ๐ฐช 10C2A OLD TURKIC LETTER ORKHON ENY
+eng ๐ฐญ 10C2D OLD TURKIC LETTER ORKHON ENG
+ng ๐ฐญ 10C2D OLD TURKIC LETTER ORKHON ENG
+2d ๐ฐญ 10C2D OLD TURKIC LETTER ORKHON ENG
+ep ๐ฐฏ 10C2F OLD TURKIC LETTER ORKHON EP
+p ๐ฐฏ 10C2F OLD TURKIC LETTER ORKHON EP
+2f ๐ฐฏ 10C2F OLD TURKIC LETTER ORKHON EP
+op ๐ฐฐ 10C30 OLD TURKIC LETTER ORKHON OP
+up ๐ฐฐ 10C30 OLD TURKIC LETTER ORKHON OP
+30 ๐ฐฐ 10C30 OLD TURKIC LETTER ORKHON OP
+ic ๐ฐฑ 10C31 OLD TURKIC LETTER ORKHON IC
+31 ๐ฐฑ 10C31 OLD TURKIC LETTER ORKHON IC
+ec ๐ฐฒ 10C32 OLD TURKIC LETTER ORKHON EC
+32 ๐ฐฒ 10C32 OLD TURKIC LETTER ORKHON EC
+aq ๐ฐด 10C34 OLD TURKIC LETTER ORKHON AQ
+34 ๐ฐด 10C34 OLD TURKIC LETTER ORKHON AQ
+iq ๐ฐถ 10C36 OLD TURKIC LETTER ORKHON IQ
+yq ๐ฐถ 10C36 OLD TURKIC LETTER ORKHON IQ
+36 ๐ฐถ 10C36 OLD TURKIC LETTER ORKHON IQ
+oq ๐ฐธ 10C38 OLD TURKIC LETTER ORKHON OQ
+uq ๐ฐธ 10C38 OLD TURKIC LETTER ORKHON OQ
+38 ๐ฐธ 10C38 OLD TURKIC LETTER ORKHON OQ
+ar ๐ฐบ 10C3A OLD TURKIC LETTER ORKHON AR
+r1 ๐ฐบ 10C3A OLD TURKIC LETTER ORKHON AR
+3a ๐ฐบ 10C3A OLD TURKIC LETTER ORKHON AR
+aer ๐ฐผ 10C3C OLD TURKIC LETTER ORKHON AER
+er ๐ฐผ 10C3C OLD TURKIC LETTER ORKHON AER
+r2 ๐ฐผ 10C3C OLD TURKIC LETTER ORKHON AER
+3c ๐ฐผ 10C3C OLD TURKIC LETTER ORKHON AER
+as ๐ฐฝ 10C3D OLD TURKIC LETTER ORKHON AS
+s1 ๐ฐฝ 10C3D OLD TURKIC LETTER ORKHON AS
+3d ๐ฐฝ 10C3D OLD TURKIC LETTER ORKHON AS
+aes ๐ฐพ 10C3E OLD TURKIC LETTER ORKHON AES
+es ๐ฐพ 10C3E OLD TURKIC LETTER ORKHON AES
+s2 ๐ฐพ 10C3E OLD TURKIC LETTER ORKHON AES
+3e ๐ฐพ 10C3E OLD TURKIC LETTER ORKHON AES
+ash ๐ฐฟ 10C3F OLD TURKIC LETTER ORKHON ASH
+sh1 ๐ฐฟ 10C3F OLD TURKIC LETTER ORKHON ASH
+3f ๐ฐฟ 10C3F OLD TURKIC LETTER ORKHON ASH
+esh ๐ฑ 10C41 OLD TURKIC LETTER ORKHON ESH
+sh2 ๐ฑ 10C41 OLD TURKIC LETTER ORKHON ESH
+41 ๐ฑ 10C41 OLD TURKIC LETTER ORKHON ESH
+at ๐ฑƒ 10C43 OLD TURKIC LETTER ORKHON AT
+t1 ๐ฑƒ 10C43 OLD TURKIC LETTER ORKHON AT
+43 ๐ฑƒ 10C43 OLD TURKIC LETTER ORKHON AT
+aet ๐ฑ… 10C45 OLD TURKIC LETTER ORKHON AET
+et ๐ฑ… 10C45 OLD TURKIC LETTER ORKHON AET
+t2 ๐ฑ… 10C45 OLD TURKIC LETTER ORKHON AET
+45 ๐ฑ… 10C45 OLD TURKIC LETTER ORKHON AET
+ot ๐ฑ‡ 10C47 OLD TURKIC LETTER ORKHON OT
+ut ๐ฑ‡ 10C47 OLD TURKIC LETTER ORKHON OT
+47 ๐ฑ‡ 10C47 OLD TURKIC LETTER ORKHON OT
+bash ๐ฑˆ 10C48 OLD TURKIC LETTER ORKHON BASH
+48 ๐ฑˆ 10C48 OLD TURKIC LETTER ORKHON BASH
diff --git a/runtime/keymap/oldturkic-yenisei_utf-8.vim b/runtime/keymap/oldturkic-yenisei_utf-8.vim
new file mode 100644
index 0000000000..f939f0a405
--- /dev/null
+++ b/runtime/keymap/oldturkic-yenisei_utf-8.vim
@@ -0,0 +1,115 @@
+" Maintainer: Oliver Corff <oliver.corff@yemail.de>
+" Last Changed: 2018 Feb 12
+
+" All characters are given literally, conversion to another encoding (e.g.,
+" UTF-8) should work.
+scriptencoding utf-8
+
+let b:keymap_name = "oto"
+highlight lCursor guibg=red guifg=NONE
+
+" map F8 to toggle keymap (Ctrl-^ not present on keyboard)
+noremap <F8> :let &iminsert = ! &iminsert<CR>
+lnoremap <F8> <C-^>
+noremap! <F8> <C-^>
+
+loadkeymap
+A ๐ฐ 10C01 OLD TURKIC LETTER YENISEI A
+01 ๐ฐ 10C01 OLD TURKIC LETTER YENISEI A
+AE ๐ฐ‚ 10C02 OLD TURKIC LETTER YENISEI AE
+02 ๐ฐ‚ 10C02 OLD TURKIC LETTER YENISEI AE
+I ๐ฐ„ 10C04 OLD TURKIC LETTER YENISEI I
+04 ๐ฐ„ 10C04 OLD TURKIC LETTER YENISEI I
+E ๐ฐ… 10C05 OLD TURKIC LETTER YENISEI E
+05 ๐ฐ… 10C05 OLD TURKIC LETTER YENISEI E
+OE ๐ฐˆ 10C08 OLD TURKIC LETTER YENISEI OE
+UE ๐ฐˆ 10C08 OLD TURKIC LETTER YENISEI OE
+08 ๐ฐˆ 10C08 OLD TURKIC LETTER YENISEI OE
+ab ๐ฐŠ 10C0A OLD TURKIC LETTER YENISEI AB
+b1 ๐ฐŠ 10C0A OLD TURKIC LETTER YENISEI AB
+0a ๐ฐŠ 10C0A OLD TURKIC LETTER YENISEI AB
+aeb ๐ฐŒ 10C0C OLD TURKIC LETTER YENISEI AEB
+eb ๐ฐŒ 10C0C OLD TURKIC LETTER YENISEI AEB
+b2 ๐ฐŒ 10C0C OLD TURKIC LETTER YENISEI AEB
+0c ๐ฐŒ 10C0C OLD TURKIC LETTER YENISEI AEB
+ag ๐ฐŽ 10C0E OLD TURKIC LETTER YENISEI AG
+g1 ๐ฐŽ 10C0E OLD TURKIC LETTER YENISEI AG
+0e ๐ฐŽ 10C0E OLD TURKIC LETTER YENISEI AG
+aeg ๐ฐ 10C10 OLD TURKIC LETTER YENISEI AEG
+eg ๐ฐ 10C10 OLD TURKIC LETTER YENISEI AEG
+g2 ๐ฐ 10C10 OLD TURKIC LETTER YENISEI AEG
+10 ๐ฐ 10C10 OLD TURKIC LETTER YENISEI AEG
+ad ๐ฐ’ 10C12 OLD TURKIC LETTER YENISEI AD
+d1 ๐ฐ’ 10C12 OLD TURKIC LETTER YENISEI AD
+12 ๐ฐ’ 10C12 OLD TURKIC LETTER YENISEI AD
+ez ๐ฐ• 10C15 OLD TURKIC LETTER YENISEI EZ
+z ๐ฐ• 10C15 OLD TURKIC LETTER YENISEI EZ
+15 ๐ฐ• 10C15 OLD TURKIC LETTER YENISEI EZ
+ay ๐ฐ— 10C17 OLD TURKIC LETTER YENISEI AY
+y1 ๐ฐ— 10C17 OLD TURKIC LETTER YENISEI AY
+17 ๐ฐ— 10C17 OLD TURKIC LETTER YENISEI AY
+aey ๐ฐ™ 10C19 OLD TURKIC LETTER YENISEI AEY
+ey ๐ฐ™ 10C19 OLD TURKIC LETTER YENISEI AEY
+y2 ๐ฐ™ 10C19 OLD TURKIC LETTER YENISEI AEY
+19 ๐ฐ™ 10C19 OLD TURKIC LETTER YENISEI AEY
+aek ๐ฐ› 10C1B OLD TURKIC LETTER YENISEI AEK
+ak ๐ฐ› 10C1B OLD TURKIC LETTER YENISEI AEK
+k ๐ฐ› 10C1B OLD TURKIC LETTER YENISEI AEK
+1b ๐ฐ› 10C1B OLD TURKIC LETTER YENISEI AEK
+oek ๐ฐ 10C1D OLD TURKIC LETTER YENISEI OEK
+รถk ๐ฐ 10C1D OLD TURKIC LETTER YENISEI OEK
+uek ๐ฐ 10C1D OLD TURKIC LETTER YENISEI OEK
+รผk ๐ฐ 10C1D OLD TURKIC LETTER YENISEI OEK
+1d ๐ฐ 10C1D OLD TURKIC LETTER YENISEI OEK
+al ๐ฐŸ 10C1F OLD TURKIC LETTER YENISEI AL
+l ๐ฐŸ 10C1F OLD TURKIC LETTER YENISEI AL
+l1 ๐ฐŸ 10C1F OLD TURKIC LETTER YENISEI AL
+1f ๐ฐŸ 10C1F OLD TURKIC LETTER YENISEI AL
+aen ๐ฐฅ 10C25 OLD TURKIC LETTER YENISEI AEN
+en ๐ฐฅ 10C25 OLD TURKIC LETTER YENISEI AEN
+n2 ๐ฐฅ 10C25 OLD TURKIC LETTER YENISEI AEN
+25 ๐ฐฅ 10C25 OLD TURKIC LETTER YENISEI AEN
+ent ๐ฐง 10C27 OLD TURKIC LETTER YENISEI ENT
+nt ๐ฐง 10C27 OLD TURKIC LETTER YENISEI ENT
+27 ๐ฐง 10C27 OLD TURKIC LETTER YENISEI ENT
+enc ๐ฐฉ 10C29 OLD TURKIC LETTER YENISEI ENC
+nc ๐ฐฉ 10C29 OLD TURKIC LETTER YENISEI ENC
+29 ๐ฐฉ 10C29 OLD TURKIC LETTER YENISEI ENC
+eny ๐ฐซ 10C2B OLD TURKIC LETTER YENISEI ENY
+ny ๐ฐซ 10C2B OLD TURKIC LETTER YENISEI ENY
+2b ๐ฐซ 10C2B OLD TURKIC LETTER YENISEI ENY
+ang ๐ฐฌ 10C2C OLD TURKIC LETTER YENISEI ANG
+ng ๐ฐฌ 10C2C OLD TURKIC LETTER YENISEI ANG
+2c ๐ฐฌ 10C2C OLD TURKIC LETTER YENISEI ANG
+aeng ๐ฐฎ 10C2E OLD TURKIC LETTER YENISEI AENG
+eng ๐ฐฎ 10C2E OLD TURKIC LETTER YENISEI AENG
+2e ๐ฐฎ 10C2E OLD TURKIC LETTER YENISEI AENG
+ec ๐ฐณ 10C33 OLD TURKIC LETTER YENISEI EC
+c ๐ฐณ 10C33 OLD TURKIC LETTER YENISEI EC
+33 ๐ฐณ 10C33 OLD TURKIC LETTER YENISEI EC
+aq ๐ฐต 10C35 OLD TURKIC LETTER YENISEI AQ
+q ๐ฐต 10C35 OLD TURKIC LETTER YENISEI AQ
+35 ๐ฐต 10C35 OLD TURKIC LETTER YENISEI AQ
+iq ๐ฐท 10C37 OLD TURKIC LETTER YENISEI IQ
+yq ๐ฐท 10C37 OLD TURKIC LETTER YENISEI IQ
+37 ๐ฐท 10C37 OLD TURKIC LETTER YENISEI IQ
+oq ๐ฐน 10C39 OLD TURKIC LETTER YENISEI OQ
+uq ๐ฐน 10C39 OLD TURKIC LETTER YENISEI OQ
+39 ๐ฐน 10C39 OLD TURKIC LETTER YENISEI OQ
+ar ๐ฐป 10C3B OLD TURKIC LETTER YENISEI AR
+r ๐ฐป 10C3B OLD TURKIC LETTER YENISEI AR
+r1 ๐ฐป 10C3B OLD TURKIC LETTER YENISEI AR
+3b ๐ฐป 10C3B OLD TURKIC LETTER YENISEI AR
+ash ๐ฑ€ 10C40 OLD TURKIC LETTER YENISEI ASH
+sh1 ๐ฑ€ 10C40 OLD TURKIC LETTER YENISEI ASH
+40 ๐ฑ€ 10C40 OLD TURKIC LETTER YENISEI ASH
+esh ๐ฑ‚ 10C42 OLD TURKIC LETTER YENISEI ESH
+sh2 ๐ฑ‚ 10C42 OLD TURKIC LETTER YENISEI ESH
+42 ๐ฑ‚ 10C42 OLD TURKIC LETTER YENISEI ESH
+at ๐ฑ„ 10C44 OLD TURKIC LETTER YENISEI AT
+t1 ๐ฑ„ 10C44 OLD TURKIC LETTER YENISEI AT
+44 ๐ฑ„ 10C44 OLD TURKIC LETTER YENISEI AT
+aet ๐ฑ† 10C46 OLD TURKIC LETTER YENISEI AET
+et ๐ฑ† 10C46 OLD TURKIC LETTER YENISEI AET
+t2 ๐ฑ† 10C46 OLD TURKIC LETTER YENISEI AET
+46 ๐ฑ† 10C46 OLD TURKIC LETTER YENISEI AET
diff --git a/runtime/keymap/pinyin.vim b/runtime/keymap/pinyin.vim
index 757850b83f..253814c753 100644
--- a/runtime/keymap/pinyin.vim
+++ b/runtime/keymap/pinyin.vim
@@ -1,5 +1,5 @@
" Vim Keymap file for Hanyu Pinyin tone marks through numbers.
-" Maintainer: Fredrik Roubert <roubert@df.lth.se>
+" Maintainer: Fredrik Roubert <fredrik@roubert.name>
" Last Changed: February 15, 2004
" All characters are given literally.
diff --git a/runtime/keymap/russian-jcukenmac.vim b/runtime/keymap/russian-jcukenmac.vim
new file mode 100644
index 0000000000..e2120ca1d4
--- /dev/null
+++ b/runtime/keymap/russian-jcukenmac.vim
@@ -0,0 +1,94 @@
+" Vim Keymap file for russian characters, layout 'jcuken', Mac variant
+
+" Derived from russian-jcuken.vim by Artem Chuprina <ran@ran.pp.ru>
+" Maintainer: Anton Fonarev <avfonarev@gmail.com>
+" Last Changed: 2016 August 17
+
+" All characters are given literally, conversion to another encoding (e.g.,
+" UTF-8) should work.
+
+scriptencoding utf-8
+
+let b:keymap_name = "ru"
+
+loadkeymap
+
+\| ะ CYRILLIC CAPITAL LETTER IO
+\\ ั‘ CYRILLIC SMALL LETTER IO
+
+F ะ CYRILLIC CAPITAL LETTER A
+< ะ‘ CYRILLIC CAPITAL LETTER BE
+D ะ’ CYRILLIC CAPITAL LETTER VE
+U ะ“ CYRILLIC CAPITAL LETTER GHE
+L ะ” CYRILLIC CAPITAL LETTER DE
+T ะ• CYRILLIC CAPITAL LETTER IE
+: ะ– CYRILLIC CAPITAL LETTER ZHE
+P ะ— CYRILLIC CAPITAL LETTER ZE
+B ะ˜ CYRILLIC CAPITAL LETTER I
+Q ะ™ CYRILLIC CAPITAL LETTER SHORT I
+R ะš CYRILLIC CAPITAL LETTER KA
+K ะ› CYRILLIC CAPITAL LETTER EL
+V ะœ CYRILLIC CAPITAL LETTER EM
+Y ะ CYRILLIC CAPITAL LETTER EN
+J ะž CYRILLIC CAPITAL LETTER O
+G ะŸ CYRILLIC CAPITAL LETTER PE
+H ะ  CYRILLIC CAPITAL LETTER ER
+C ะก CYRILLIC CAPITAL LETTER ES
+N ะข CYRILLIC CAPITAL LETTER TE
+E ะฃ CYRILLIC CAPITAL LETTER U
+A ะค CYRILLIC CAPITAL LETTER EF
+{ ะฅ CYRILLIC CAPITAL LETTER HA
+W ะฆ CYRILLIC CAPITAL LETTER TSE
+X ะง CYRILLIC CAPITAL LETTER CHE
+I ะจ CYRILLIC CAPITAL LETTER SHA
+O ะฉ CYRILLIC CAPITAL LETTER SHCHA
+} ะช CYRILLIC CAPITAL LETTER HARD SIGN
+S ะซ CYRILLIC CAPITAL LETTER YERU
+M ะฌ CYRILLIC CAPITAL LETTER SOFT SIGN
+\" ะญ CYRILLIC CAPITAL LETTER E
+> ะฎ CYRILLIC CAPITAL LETTER YU
+Z ะฏ CYRILLIC CAPITAL LETTER YA
+f ะฐ CYRILLIC SMALL LETTER A
+, ะฑ CYRILLIC SMALL LETTER BE
+d ะฒ CYRILLIC SMALL LETTER VE
+u ะณ CYRILLIC SMALL LETTER GHE
+l ะด CYRILLIC SMALL LETTER DE
+t ะต CYRILLIC SMALL LETTER IE
+; ะถ CYRILLIC SMALL LETTER ZHE
+p ะท CYRILLIC SMALL LETTER ZE
+b ะธ CYRILLIC SMALL LETTER I
+q ะน CYRILLIC SMALL LETTER SHORT I
+r ะบ CYRILLIC SMALL LETTER KA
+k ะป CYRILLIC SMALL LETTER EL
+v ะผ CYRILLIC SMALL LETTER EM
+y ะฝ CYRILLIC SMALL LETTER EN
+j ะพ CYRILLIC SMALL LETTER O
+g ะฟ CYRILLIC SMALL LETTER PE
+h ั€ CYRILLIC SMALL LETTER ER
+c ั CYRILLIC SMALL LETTER ES
+n ั‚ CYRILLIC SMALL LETTER TE
+e ัƒ CYRILLIC SMALL LETTER U
+a ั„ CYRILLIC SMALL LETTER EF
+[ ั… CYRILLIC SMALL LETTER HA
+w ั† CYRILLIC SMALL LETTER TSE
+x ั‡ CYRILLIC SMALL LETTER CHE
+i ัˆ CYRILLIC SMALL LETTER SHA
+o ั‰ CYRILLIC SMALL LETTER SHCHA
+] ัŠ CYRILLIC SMALL LETTER HARD SIGN
+s ั‹ CYRILLIC SMALL LETTER YERU
+m ัŒ CYRILLIC SMALL LETTER SOFT SIGN
+' ั CYRILLIC SMALL LETTER E
+. ัŽ CYRILLIC SMALL LETTER YU
+z ั CYRILLIC SMALL LETTER YA
+
+ยง >
+ยฑ <
+@ "
+# โ„–
+$ %
+% :
+^ ,
+& .
+* ;
+` ]
+~ [
diff --git a/runtime/keymap/vietnamese-telex_utf-8.vim b/runtime/keymap/vietnamese-telex_utf-8.vim
new file mode 100644
index 0000000000..f9fd055d14
--- /dev/null
+++ b/runtime/keymap/vietnamese-telex_utf-8.vim
@@ -0,0 +1,196 @@
+" Vim Keymap file for Vietnamese through Telex method
+" Maintainer: Raphael McSinyx <vn.mcsinyx@gmail.com>
+" Last Change: 2016-06-13
+
+scriptencoding utf-8
+
+let b:keymap_name = "vi"
+
+loadkeymap
+
+A\\ A
+AF ร€
+AS ร
+AR แบข
+AX รƒ
+AJ แบ 
+
+AW ฤ‚
+AW\\ ฤ‚
+AWF แบฐ
+AWS แบฎ
+AWR แบฒ
+AWX แบด
+AWJ แบถ
+
+AA ร‚
+AA\\ ร‚
+AAF แบฆ
+AAS แบค
+AAR แบจ
+AAX แบช
+AAJ แบฌ
+
+D\\ D
+DD ฤ
+
+E E
+E\\ E
+EF รˆ
+ES ร‰
+ER แบบ
+EX แบผ
+EJ แบธ
+
+EE รŠ
+EE\\ รŠ
+EEF แป€
+EES แบพ
+EER แป‚
+EEX แป„
+EEJ แป†
+
+I\\ I
+IF รŒ
+IS ร
+IR แปˆ
+IX ฤจ
+IJ แปŠ
+
+O\\ O
+OF ร’
+OS ร“
+OR แปŽ
+OX ร•
+OJ แปŒ
+
+OO ร”
+OO\\ ร”
+OOF แป’
+OOS แป
+OOR แป”
+OOX แป–
+OOJ แป˜
+
+OW ฦ 
+OW\\ ฦ 
+OWF แปœ
+OWS แปš
+OWR แปž
+OWX แป 
+OWJ แปข
+
+U\\ U
+UF ร™
+US รš
+UR แปฆ
+UX ลจ
+UJ แปค
+
+UW ฦฏ
+UW\\ ฦฏ
+UWF แปช
+UWS แปจ
+UWR แปฌ
+UWX แปฎ
+UWJ แปฐ
+
+Y\\ Y
+YF แปฒ
+YS ร
+YR แปถ
+YX แปธ
+YJ แปด
+
+a\\ a
+af ร 
+as รก
+ar แบฃ
+ax รฃ
+aj แบก
+
+aw ฤƒ
+aw\\ ฤƒ
+awf แบฑ
+aws แบฏ
+awr แบณ
+awx แบต
+awj แบท
+
+aa รข
+aa\\ รข
+aaf แบง
+aas แบฅ
+aar แบฉ
+aax แบซ
+aaj แบญ
+
+d\\ d
+dd ฤ‘
+
+e\\ e
+ef รจ
+es รฉ
+er แบป
+ex แบฝ
+ej แบน
+
+ee รช
+ee\\ รช
+eef แป
+ees แบฟ
+eer แปƒ
+eex แป…
+eej แป‡
+
+i\\ i
+if รฌ
+is รญ
+ir แป‰
+ix ฤฉ
+ij แป‹
+
+o\\ o
+of รฒ
+os รณ
+or แป
+ox รต
+oj แป
+
+oo รด
+oo\\ รด
+oof แป“
+oos แป‘
+oor แป•
+oox แป—
+ooj แป™
+
+ow ฦก
+ow\\ ฦก
+owf แป
+ows แป›
+owr แปŸ
+owx แปก
+owj แปฃ
+
+u\\ u
+uf รน
+us รบ
+ur แปง
+ux ลฉ
+uj แปฅ
+
+uw ฦฐ
+uw\\ ฦฐ
+uwf แปซ
+uws แปฉ
+uwr แปญ
+uwx แปฏ
+uwj แปฑ
+
+y\\ y
+yf แปณ
+ys รฝ
+yr แปท
+yx แปน
+yj แปต
diff --git a/runtime/keymap/vietnamese-vni_utf-8.vim b/runtime/keymap/vietnamese-vni_utf-8.vim
new file mode 100644
index 0000000000..c9312c6854
--- /dev/null
+++ b/runtime/keymap/vietnamese-vni_utf-8.vim
@@ -0,0 +1,196 @@
+" Vim Keymap file for Vietnamese through VNI method
+" Maintainer: Raphael McSinyx <vn.mcsinyx@gmail.com>
+" Last Change: 2016-06-13
+
+scriptencoding utf-8
+
+let b:keymap_name = "vi"
+
+loadkeymap
+
+A\\ A
+A1 ร
+A2 ร€
+A3 แบข
+A4 รƒ
+A5 แบ 
+
+A8 ฤ‚
+A8\\ ฤ‚
+A81 แบฎ
+A82 แบฐ
+A83 แบฒ
+A84 แบด
+A85 แบถ
+
+A6 ร‚
+A6\\ ร‚
+A61 แบค
+A62 แบฆ
+A63 แบจ
+A64 แบช
+A65 แบฌ
+
+D D
+D\\ D
+D9 ฤ
+
+E\\ E
+E1 ร‰
+E2 รˆ
+E3 แบบ
+E4 แบผ
+E5 แบธ
+
+E6 รŠ
+E6\\ รŠ
+E61 แบพ
+E62 แป€
+E63 แป‚
+E64 แป„
+E65 แป†
+
+I\\ I
+I1 ร
+I2 รŒ
+I3 แปˆ
+I4 ฤจ
+I5 แปŠ
+
+O\\ O
+O1 ร“
+O2 ร’
+O3 แปŽ
+O4 ร•
+O5 แปŒ
+
+O6 ร”
+O6\\ ร”
+O61 แป
+O62 แป’
+O63 แป”
+O64 แป–
+O65 แป˜
+
+O7 ฦ 
+O7\\ ฦ 
+O71 แปš
+O72 แปœ
+O73 แปž
+O74 แป 
+O75 แปข
+
+U\\ U
+U1 รš
+U2 ร™
+U3 แปฆ
+U4 ลจ
+U5 แปค
+
+U7 ฦฏ
+U7\\ ฦฏ
+U71 แปจ
+U72 แปช
+U73 แปฌ
+U74 แปฎ
+U75 แปฐ
+
+Y\\ Y
+Y1 ร
+Y2 แปฒ
+Y3 แปถ
+Y4 แปธ
+Y5 แปด
+
+a\\ a
+a1 รก
+a2 ร 
+a3 แบฃ
+a4 รฃ
+a5 แบก
+
+a8 ฤƒ
+a8\\ ฤƒ
+a81 แบฏ
+a82 แบฑ
+a83 แบณ
+a84 แบต
+a85 แบท
+
+a6 รข
+a6\\ รข
+a61 แบฅ
+a62 แบง
+a63 แบฉ
+a64 แบซ
+a65 แบญ
+
+d\\ d
+d9 ฤ‘
+
+e\\ e
+e1 รฉ
+e2 รจ
+e3 แบป
+e4 แบฝ
+e5 แบน
+
+e6 รช
+e6\\ รช
+e61 แบฟ
+e62 แป
+e63 แปƒ
+e64 แป…
+e65 แป‡
+
+i\\ i
+i1 รญ
+i2 รฌ
+i3 แป‰
+i4 ฤฉ
+i5 แป‹
+
+o\\ o
+o1 รณ
+o2 รฒ
+o3 แป
+o4 รต
+o5 แป
+
+o6 รด
+o6\\ รด
+o61 แป‘
+o62 แป“
+o63 แป•
+o64 แป—
+o65 แป™
+
+o7 ฦก
+o7\\ ฦก
+o71 แป›
+o72 แป
+o73 แปŸ
+o74 แปก
+o75 แปฃ
+
+u\\ u
+u1 รบ
+u2 รน
+u3 แปง
+u4 ลฉ
+u5 แปฅ
+
+u7 ฦฐ
+u7\\ ฦฐ
+u71 แปฉ
+u72 แปซ
+u73 แปญ
+u74 แปฏ
+u75 แปฑ
+
+y\\ y
+y1 รฝ
+y2 แปณ
+y3 แปท
+y4 แปน
+y5 แปต
diff --git a/runtime/lua/man.lua b/runtime/lua/man.lua
new file mode 100644
index 0000000000..1da8ed85fc
--- /dev/null
+++ b/runtime/lua/man.lua
@@ -0,0 +1,170 @@
+require('vim.compat')
+
+local buf_hls = {}
+
+local function highlight_line(line, linenr)
+ local chars = {}
+ local prev_char = ''
+ local overstrike, escape = false, false
+ local hls = {} -- Store highlight groups as { attr, start, final }
+ local NONE, BOLD, UNDERLINE, ITALIC = 0, 1, 2, 3
+ local hl_groups = {[BOLD]="manBold", [UNDERLINE]="manUnderline", [ITALIC]="manItalic"}
+ local attr = NONE
+ local byte = 0 -- byte offset
+
+ local function end_attr_hl(attr_)
+ for i, hl in ipairs(hls) do
+ if hl.attr == attr_ and hl.final == -1 then
+ hl.final = byte
+ hls[i] = hl
+ end
+ end
+ end
+
+ local function add_attr_hl(code)
+ local continue_hl = true
+ if code == 0 then
+ attr = NONE
+ continue_hl = false
+ elseif code == 1 then
+ attr = BOLD
+ elseif code == 22 then
+ attr = BOLD
+ continue_hl = false
+ elseif code == 3 then
+ attr = ITALIC
+ elseif code == 23 then
+ attr = ITALIC
+ continue_hl = false
+ elseif code == 4 then
+ attr = UNDERLINE
+ elseif code == 24 then
+ attr = UNDERLINE
+ continue_hl = false
+ else
+ attr = NONE
+ return
+ end
+
+ if continue_hl then
+ hls[#hls + 1] = {attr=attr, start=byte, final=-1}
+ else
+ if attr == NONE then
+ for a, _ in pairs(hl_groups) do
+ end_attr_hl(a)
+ end
+ else
+ end_attr_hl(attr)
+ end
+ end
+ end
+
+ -- Break input into UTF8 code points. ASCII code points (from 0x00 to 0x7f)
+ -- can be represented in one byte. Any code point above that is represented by
+ -- a leading byte (0xc0 and above) and continuation bytes (0x80 to 0xbf, or
+ -- decimal 128 to 191).
+ for char in line:gmatch("[^\128-\191][\128-\191]*") do
+ if overstrike then
+ local last_hl = hls[#hls]
+ if char == prev_char then
+ if char == '_' and attr == UNDERLINE and last_hl and last_hl.final == byte then
+ -- This underscore is in the middle of an underlined word
+ attr = UNDERLINE
+ else
+ attr = BOLD
+ end
+ elseif prev_char == '_' then
+ -- char is underlined
+ attr = UNDERLINE
+ elseif prev_char == '+' and char == 'o' then
+ -- bullet (overstrike text '+^Ho')
+ attr = BOLD
+ char = 'ยท'
+ elseif prev_char == 'ยท' and char == 'o' then
+ -- bullet (additional handling for '+^H+^Ho^Ho')
+ attr = BOLD
+ char = 'ยท'
+ else
+ -- use plain char
+ attr = NONE
+ end
+
+ -- Grow the previous highlight group if possible
+ if last_hl and last_hl.attr == attr and last_hl.final == byte then
+ last_hl.final = byte + #char
+ else
+ hls[#hls + 1] = {attr=attr, start=byte, final=byte + #char}
+ end
+
+ overstrike = false
+ prev_char = ''
+ byte = byte + #char
+ chars[#chars + 1] = char
+ elseif escape then
+ -- Use prev_char to store the escape sequence
+ prev_char = prev_char .. char
+ -- We only want to match against SGR sequences, which consist of ESC
+ -- followed by '[', then a series of parameter and intermediate bytes in
+ -- the range 0x20 - 0x3f, then 'm'. (See ECMA-48, sections 5.4 & 8.3.117)
+ local sgr = prev_char:match("^%[([\032-\063]*)m$")
+ if sgr then
+ local match
+ while sgr and #sgr > 0 do
+ -- Match against SGR parameters, which may be separated by ';'
+ match, sgr = sgr:match("^(%d*);?(.*)")
+ add_attr_hl(match + 0) -- coerce to number
+ end
+ escape = false
+ elseif not prev_char:match("^%[[\032-\063]*$") then
+ -- Stop looking if this isn't a partial CSI sequence
+ escape = false
+ end
+ elseif char == "\027" then
+ escape = true
+ prev_char = ''
+ elseif char == "\b" then
+ overstrike = true
+ prev_char = chars[#chars]
+ byte = byte - #prev_char
+ chars[#chars] = nil
+ else
+ byte = byte + #char
+ chars[#chars + 1] = char
+ end
+ end
+
+ for _, hl in ipairs(hls) do
+ if hl.attr ~= NONE then
+ buf_hls[#buf_hls + 1] = {
+ 0,
+ -1,
+ hl_groups[hl.attr],
+ linenr - 1,
+ hl.start,
+ hl.final
+ }
+ end
+ end
+
+ return table.concat(chars, '')
+end
+
+local function highlight_man_page()
+ local mod = vim.api.nvim_buf_get_option(0, "modifiable")
+ vim.api.nvim_buf_set_option(0, "modifiable", true)
+
+ local lines = vim.api.nvim_buf_get_lines(0, 0, -1, false)
+ for i, line in ipairs(lines) do
+ lines[i] = highlight_line(line, i)
+ end
+ vim.api.nvim_buf_set_lines(0, 0, -1, false, lines)
+
+ for _, args in ipairs(buf_hls) do
+ vim.api.nvim_buf_add_highlight(unpack(args))
+ end
+ buf_hls = {}
+
+ vim.api.nvim_buf_set_option(0, "modifiable", mod)
+end
+
+return { highlight_man_page = highlight_man_page }
diff --git a/runtime/lua/vim/compat.lua b/runtime/lua/vim/compat.lua
new file mode 100644
index 0000000000..168979bb95
--- /dev/null
+++ b/runtime/lua/vim/compat.lua
@@ -0,0 +1,12 @@
+-- Lua 5.1 forward-compatibility layer.
+-- For background see https://github.com/neovim/neovim/pull/9280
+--
+-- Reference the lua-compat-5.2 project for hints:
+-- https://github.com/keplerproject/lua-compat-5.2/blob/c164c8f339b95451b572d6b4b4d11e944dc7169d/compat52/mstrict.lua
+-- https://github.com/keplerproject/lua-compat-5.2/blob/c164c8f339b95451b572d6b4b4d11e944dc7169d/tests/test.lua
+
+local lua_version = _VERSION:sub(-3)
+
+if lua_version >= "5.2" then
+ unpack = table.unpack -- luacheck: ignore 121 143
+end
diff --git a/runtime/lua/vim/inspect.lua b/runtime/lua/vim/inspect.lua
new file mode 100644
index 0000000000..7cb40ca64d
--- /dev/null
+++ b/runtime/lua/vim/inspect.lua
@@ -0,0 +1,333 @@
+local inspect ={
+ _VERSION = 'inspect.lua 3.1.0',
+ _URL = 'http://github.com/kikito/inspect.lua',
+ _DESCRIPTION = 'human-readable representations of tables',
+ _LICENSE = [[
+ MIT LICENSE
+
+ Copyright (c) 2013 Enrique Garcรญa Cota
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ ]]
+}
+
+local tostring = tostring
+
+inspect.KEY = setmetatable({}, {__tostring = function() return 'inspect.KEY' end})
+inspect.METATABLE = setmetatable({}, {__tostring = function() return 'inspect.METATABLE' end})
+
+local function rawpairs(t)
+ return next, t, nil
+end
+
+-- Apostrophizes the string if it has quotes, but not aphostrophes
+-- Otherwise, it returns a regular quoted string
+local function smartQuote(str)
+ if str:match('"') and not str:match("'") then
+ return "'" .. str .. "'"
+ end
+ return '"' .. str:gsub('"', '\\"') .. '"'
+end
+
+-- \a => '\\a', \0 => '\\0', 31 => '\31'
+local shortControlCharEscapes = {
+ ["\a"] = "\\a", ["\b"] = "\\b", ["\f"] = "\\f", ["\n"] = "\\n",
+ ["\r"] = "\\r", ["\t"] = "\\t", ["\v"] = "\\v"
+}
+local longControlCharEscapes = {} -- \a => nil, \0 => \000, 31 => \031
+for i=0, 31 do
+ local ch = string.char(i)
+ if not shortControlCharEscapes[ch] then
+ shortControlCharEscapes[ch] = "\\"..i
+ longControlCharEscapes[ch] = string.format("\\%03d", i)
+ end
+end
+
+local function escape(str)
+ return (str:gsub("\\", "\\\\")
+ :gsub("(%c)%f[0-9]", longControlCharEscapes)
+ :gsub("%c", shortControlCharEscapes))
+end
+
+local function isIdentifier(str)
+ return type(str) == 'string' and str:match( "^[_%a][_%a%d]*$" )
+end
+
+local function isSequenceKey(k, sequenceLength)
+ return type(k) == 'number'
+ and 1 <= k
+ and k <= sequenceLength
+ and math.floor(k) == k
+end
+
+local defaultTypeOrders = {
+ ['number'] = 1, ['boolean'] = 2, ['string'] = 3, ['table'] = 4,
+ ['function'] = 5, ['userdata'] = 6, ['thread'] = 7
+}
+
+local function sortKeys(a, b)
+ local ta, tb = type(a), type(b)
+
+ -- strings and numbers are sorted numerically/alphabetically
+ if ta == tb and (ta == 'string' or ta == 'number') then return a < b end
+
+ local dta, dtb = defaultTypeOrders[ta], defaultTypeOrders[tb]
+ -- Two default types are compared according to the defaultTypeOrders table
+ if dta and dtb then return defaultTypeOrders[ta] < defaultTypeOrders[tb]
+ elseif dta then return true -- default types before custom ones
+ elseif dtb then return false -- custom types after default ones
+ end
+
+ -- custom types are sorted out alphabetically
+ return ta < tb
+end
+
+-- For implementation reasons, the behavior of rawlen & # is "undefined" when
+-- tables aren't pure sequences. So we implement our own # operator.
+local function getSequenceLength(t)
+ local len = 1
+ local v = rawget(t,len)
+ while v ~= nil do
+ len = len + 1
+ v = rawget(t,len)
+ end
+ return len - 1
+end
+
+local function getNonSequentialKeys(t)
+ local keys, keysLength = {}, 0
+ local sequenceLength = getSequenceLength(t)
+ for k,_ in rawpairs(t) do
+ if not isSequenceKey(k, sequenceLength) then
+ keysLength = keysLength + 1
+ keys[keysLength] = k
+ end
+ end
+ table.sort(keys, sortKeys)
+ return keys, keysLength, sequenceLength
+end
+
+local function countTableAppearances(t, tableAppearances)
+ tableAppearances = tableAppearances or {}
+
+ if type(t) == 'table' then
+ if not tableAppearances[t] then
+ tableAppearances[t] = 1
+ for k,v in rawpairs(t) do
+ countTableAppearances(k, tableAppearances)
+ countTableAppearances(v, tableAppearances)
+ end
+ countTableAppearances(getmetatable(t), tableAppearances)
+ else
+ tableAppearances[t] = tableAppearances[t] + 1
+ end
+ end
+
+ return tableAppearances
+end
+
+local copySequence = function(s)
+ local copy, len = {}, #s
+ for i=1, len do copy[i] = s[i] end
+ return copy, len
+end
+
+local function makePath(path, ...)
+ local keys = {...}
+ local newPath, len = copySequence(path)
+ for i=1, #keys do
+ newPath[len + i] = keys[i]
+ end
+ return newPath
+end
+
+local function processRecursive(process, item, path, visited)
+ if item == nil then return nil end
+ if visited[item] then return visited[item] end
+
+ local processed = process(item, path)
+ if type(processed) == 'table' then
+ local processedCopy = {}
+ visited[item] = processedCopy
+ local processedKey
+
+ for k,v in rawpairs(processed) do
+ processedKey = processRecursive(process, k, makePath(path, k, inspect.KEY), visited)
+ if processedKey ~= nil then
+ processedCopy[processedKey] = processRecursive(process, v, makePath(path, processedKey), visited)
+ end
+ end
+
+ local mt = processRecursive(process, getmetatable(processed), makePath(path, inspect.METATABLE), visited)
+ if type(mt) ~= 'table' then mt = nil end -- ignore not nil/table __metatable field
+ setmetatable(processedCopy, mt)
+ processed = processedCopy
+ end
+ return processed
+end
+
+
+
+-------------------------------------------------------------------
+
+local Inspector = {}
+local Inspector_mt = {__index = Inspector}
+
+function Inspector:puts(...)
+ local args = {...}
+ local buffer = self.buffer
+ local len = #buffer
+ for i=1, #args do
+ len = len + 1
+ buffer[len] = args[i]
+ end
+end
+
+function Inspector:down(f)
+ self.level = self.level + 1
+ f()
+ self.level = self.level - 1
+end
+
+function Inspector:tabify()
+ self:puts(self.newline, string.rep(self.indent, self.level))
+end
+
+function Inspector:alreadyVisited(v)
+ return self.ids[v] ~= nil
+end
+
+function Inspector:getId(v)
+ local id = self.ids[v]
+ if not id then
+ local tv = type(v)
+ id = (self.maxIds[tv] or 0) + 1
+ self.maxIds[tv] = id
+ self.ids[v] = id
+ end
+ return tostring(id)
+end
+
+function Inspector:putKey(k)
+ if isIdentifier(k) then return self:puts(k) end
+ self:puts("[")
+ self:putValue(k)
+ self:puts("]")
+end
+
+function Inspector:putTable(t)
+ if t == inspect.KEY or t == inspect.METATABLE then
+ self:puts(tostring(t))
+ elseif self:alreadyVisited(t) then
+ self:puts('<table ', self:getId(t), '>')
+ elseif self.level >= self.depth then
+ self:puts('{...}')
+ else
+ if self.tableAppearances[t] > 1 then self:puts('<', self:getId(t), '>') end
+
+ local nonSequentialKeys, nonSequentialKeysLength, sequenceLength = getNonSequentialKeys(t)
+ local mt = getmetatable(t)
+
+ self:puts('{')
+ self:down(function()
+ local count = 0
+ for i=1, sequenceLength do
+ if count > 0 then self:puts(',') end
+ self:puts(' ')
+ self:putValue(t[i])
+ count = count + 1
+ end
+
+ for i=1, nonSequentialKeysLength do
+ local k = nonSequentialKeys[i]
+ if count > 0 then self:puts(',') end
+ self:tabify()
+ self:putKey(k)
+ self:puts(' = ')
+ self:putValue(t[k])
+ count = count + 1
+ end
+
+ if type(mt) == 'table' then
+ if count > 0 then self:puts(',') end
+ self:tabify()
+ self:puts('<metatable> = ')
+ self:putValue(mt)
+ end
+ end)
+
+ if nonSequentialKeysLength > 0 or type(mt) == 'table' then -- result is multi-lined. Justify closing }
+ self:tabify()
+ elseif sequenceLength > 0 then -- array tables have one extra space before closing }
+ self:puts(' ')
+ end
+
+ self:puts('}')
+ end
+end
+
+function Inspector:putValue(v)
+ local tv = type(v)
+
+ if tv == 'string' then
+ self:puts(smartQuote(escape(v)))
+ elseif tv == 'number' or tv == 'boolean' or tv == 'nil' or
+ tv == 'cdata' or tv == 'ctype' then
+ self:puts(tostring(v))
+ elseif tv == 'table' then
+ self:putTable(v)
+ else
+ self:puts('<', tv, ' ', self:getId(v), '>')
+ end
+end
+
+-------------------------------------------------------------------
+
+function inspect.inspect(root, options)
+ options = options or {}
+
+ local depth = options.depth or math.huge
+ local newline = options.newline or '\n'
+ local indent = options.indent or ' '
+ local process = options.process
+
+ if process then
+ root = processRecursive(process, root, {}, {})
+ end
+
+ local inspector = setmetatable({
+ depth = depth,
+ level = 0,
+ buffer = {},
+ ids = {},
+ maxIds = {},
+ newline = newline,
+ indent = indent,
+ tableAppearances = countTableAppearances(root)
+ }, Inspector_mt)
+
+ inspector:putValue(root)
+
+ return table.concat(inspector.buffer)
+end
+
+setmetatable(inspect, { __call = function(_, ...) return inspect.inspect(...) end })
+
+return inspect
diff --git a/runtime/macros/justify.vim b/runtime/macros/justify.vim
index 4ef3bf95fa..011a911401 100644
--- a/runtime/macros/justify.vim
+++ b/runtime/macros/justify.vim
@@ -1,316 +1,3 @@
-" Function to left and right align text.
-"
-" Written by: Preben "Peppe" Guldberg <c928400@student.dtu.dk>
-" Created: 980806 14:13 (or around that time anyway)
-" Revised: 001103 00:36 (See "Revisions" below)
-
-
-" function Justify( [ textwidth [, maxspaces [, indent] ] ] )
-"
-" Justify() will left and right align a line by filling in an
-" appropriate amount of spaces. Extra spaces are added to existing
-" spaces starting from the right side of the line. As an example, the
-" following documentation has been justified.
-"
-" The function takes the following arguments:
-
-" textwidth argument
-" ------------------
-" If not specified, the value of the 'textwidth' option is used. If
-" 'textwidth' is zero a value of 80 is used.
-"
-" Additionally the arguments 'tw' and '' are accepted. The value of
-" 'textwidth' will be used. These are handy, if you just want to specify
-" the maxspaces argument.
-
-" maxspaces argument
-" ------------------
-" If specified, alignment will only be done, if the longest space run
-" after alignment is no longer than maxspaces.
-"
-" An argument of '' is accepted, should the user like to specify all
-" arguments.
-"
-" To aid user defined commands, negative values are accepted aswell.
-" Using a negative value specifies the default behaviour: any length of
-" space runs will be used to justify the text.
-
-" indent argument
-" ---------------
-" This argument specifies how a line should be indented. The default is
-" to keep the current indentation.
-"
-" Negative values: Keep current amount of leading whitespace.
-" Positive values: Indent all lines with leading whitespace using this
-" amount of whitespace.
-"
-" Note that the value 0, needs to be quoted as a string. This value
-" leads to a left flushed text.
-"
-" Additionally units of 'shiftwidth'/'sw' and 'tabstop'/'ts' may be
-" added. In this case, if the value of indent is positive, the amount of
-" whitespace to be added will be multiplied by the value of the
-" 'shiftwidth' and 'tabstop' settings. If these units are used, the
-" argument must be given as a string, eg. Justify('','','2sw').
-"
-" If the values of 'sw' or 'tw' are negative, they are treated as if
-" they were 0, which means that the text is flushed left. There is no
-" check if a negative number prefix is used to change the sign of a
-" negative 'sw' or 'ts' value.
-"
-" As with the other arguments, '' may be used to get the default
-" behaviour.
-
-
-" Notes:
-"
-" If the line, adjusted for space runs and leading/trailing whitespace,
-" is wider than the used textwidth, the line will be left untouched (no
-" whitespace removed). This should be equivalent to the behaviour of
-" :left, :right and :center.
-"
-" If the resulting line is shorter than the used textwidth it is left
-" untouched.
-"
-" All space runs in the line are truncated before the alignment is
-" carried out.
-"
-" If you have set 'noexpandtab', :retab! is used to replace space runs
-" with whitespace using the value of 'tabstop'. This should be
-" conformant with :left, :right and :center.
-"
-" If joinspaces is set, an extra space is added after '.', '?' and '!'.
-" If 'cpooptions' include 'j', extra space is only added after '.'.
-" (This may on occasion conflict with maxspaces.)
-
-
-" Related mappings:
-"
-" Mappings that will align text using the current text width, using at
-" most four spaces in a space run and keeping current indentation.
-nmap _j :%call Justify('tw',4)<CR>
-vmap _j :call Justify('tw',4)<CR>
-"
-" Mappings that will remove space runs and format lines (might be useful
-" prior to aligning the text).
-nmap ,gq :%s/\s\+/ /g<CR>gq1G
-vmap ,gq :s/\s\+/ /g<CR>gvgq
-
-
-" User defined command:
-"
-" The following is an ex command that works as a shortcut to the Justify
-" function. Arguments to Justify() can be added after the command.
-com! -range -nargs=* Justify <line1>,<line2>call Justify(<f-args>)
-"
-" The following commands are all equivalent:
-"
-" 1. Simplest use of Justify():
-" :call Justify()
-" :Justify
-"
-" 2. The _j mapping above via the ex command:
-" :%Justify tw 4
-"
-" 3. Justify visualised text at 72nd column while indenting all
-" previously indented text two shiftwidths
-" :'<,'>call Justify(72,'','2sw')
-" :'<,'>Justify 72 -1 2sw
-"
-" This documentation has been justified using the following command:
-":se et|kz|1;/^" function Justify(/+,'z-g/^" /s/^" //|call Justify(70,3)|s/^/" /
-
-" Revisions:
-" 001103: If 'joinspaces' was set, calculations could be wrong.
-" Tabs at start of line could also lead to errors.
-" Use setline() instead of "exec 's/foo/bar/' - safer.
-" Cleaned up the code a bit.
-"
-" Todo: Convert maps to the new script specific form
-
-" Error function
-function! Justify_error(message)
- echohl Error
- echo "Justify([tw, [maxspaces [, indent]]]): " . a:message
- echohl None
-endfunction
-
-
-" Now for the real thing
-function! Justify(...) range
-
- if a:0 > 3
- call Justify_error("Too many arguments (max 3)")
- return 1
- endif
-
- " Set textwidth (accept 'tw' and '' as arguments)
- if a:0 >= 1
- if a:1 =~ '^\(tw\)\=$'
- let tw = &tw
- elseif a:1 =~ '^\d\+$'
- let tw = a:1
- else
- call Justify_error("tw must be a number (>0), '' or 'tw'")
- return 2
- endif
- else
- let tw = &tw
- endif
- if tw == 0
- let tw = 80
- endif
-
- " Set maximum number of spaces between WORDs
- if a:0 >= 2
- if a:2 == ''
- let maxspaces = tw
- elseif a:2 =~ '^-\d\+$'
- let maxspaces = tw
- elseif a:2 =~ '^\d\+$'
- let maxspaces = a:2
- else
- call Justify_error("maxspaces must be a number or ''")
- return 3
- endif
- else
- let maxspaces = tw
- endif
- if maxspaces <= 1
- call Justify_error("maxspaces should be larger than 1")
- return 4
- endif
-
- " Set the indentation style (accept sw and ts units)
- let indent_fix = ''
- if a:0 >= 3
- if (a:3 == '') || a:3 =~ '^-[1-9]\d*\(shiftwidth\|sw\|tabstop\|ts\)\=$'
- let indent = -1
- elseif a:3 =~ '^-\=0\(shiftwidth\|sw\|tabstop\|ts\)\=$'
- let indent = 0
- elseif a:3 =~ '^\d\+\(shiftwidth\|sw\|tabstop\|ts\)\=$'
- let indent = substitute(a:3, '\D', '', 'g')
- elseif a:3 =~ '^\(shiftwidth\|sw\|tabstop\|ts\)$'
- let indent = 1
- else
- call Justify_error("indent: a number with 'sw'/'ts' unit")
- return 5
- endif
- if indent >= 0
- while indent > 0
- let indent_fix = indent_fix . ' '
- let indent = indent - 1
- endwhile
- let indent_sw = 0
- if a:3 =~ '\(shiftwidth\|sw\)'
- let indent_sw = &sw
- elseif a:3 =~ '\(tabstop\|ts\)'
- let indent_sw = &ts
- endif
- let indent_fix2 = ''
- while indent_sw > 0
- let indent_fix2 = indent_fix2 . indent_fix
- let indent_sw = indent_sw - 1
- endwhile
- let indent_fix = indent_fix2
- endif
- else
- let indent = -1
- endif
-
- " Avoid substitution reports
- let save_report = &report
- set report=1000000
-
- " Check 'joinspaces' and 'cpo'
- if &js == 1
- if &cpo =~ 'j'
- let join_str = '\(\. \)'
- else
- let join_str = '\([.!?!] \)'
- endif
- endif
-
- let cur = a:firstline
- while cur <= a:lastline
-
- let str_orig = getline(cur)
- let save_et = &et
- set et
- exec cur . "retab"
- let &et = save_et
- let str = getline(cur)
-
- let indent_str = indent_fix
- let indent_n = strlen(indent_str)
- " Shall we remember the current indentation
- if indent < 0
- let indent_orig = matchstr(str_orig, '^\s*')
- if strlen(indent_orig) > 0
- let indent_str = indent_orig
- let indent_n = strlen(matchstr(str, '^\s*'))
- endif
- endif
-
- " Trim trailing, leading and running whitespace
- let str = substitute(str, '\s\+$', '', '')
- let str = substitute(str, '^\s\+', '', '')
- let str = substitute(str, '\s\+', ' ', 'g')
- let str_n = strdisplaywidth(str)
-
- " Possible addition of space after punctuation
- if exists("join_str")
- let str = substitute(str, join_str, '\1 ', 'g')
- endif
- let join_n = strdisplaywidth(str) - str_n
-
- " Can extraspaces be added?
- " Note that str_n may be less than strlen(str) [joinspaces above]
- if strdisplaywidth(str) <= tw - indent_n && str_n > 0
- " How many spaces should be added
- let s_add = tw - str_n - indent_n - join_n
- let s_nr = strlen(substitute(str, '\S', '', 'g') ) - join_n
- let s_dup = s_add / s_nr
- let s_mod = s_add % s_nr
-
- " Test if the changed line fits with tw
- if 0 <= (str_n + (maxspaces - 1)*s_nr + indent_n) - tw
-
- " Duplicate spaces
- while s_dup > 0
- let str = substitute(str, '\( \+\)', ' \1', 'g')
- let s_dup = s_dup - 1
- endwhile
-
- " Add extra spaces from the end
- while s_mod > 0
- let str = substitute(str, '\(\(\s\+\S\+\)\{' . s_mod . '}\)$', ' \1', '')
- let s_mod = s_mod - 1
- endwhile
-
- " Indent the line
- if indent_n > 0
- let str = substitute(str, '^', indent_str, '' )
- endif
-
- " Replace the line
- call setline(cur, str)
-
- " Convert to whitespace
- if &et == 0
- exec cur . 'retab!'
- endif
-
- endif " Change of line
- endif " Possible change
-
- let cur = cur + 1
- endwhile
-
- norm ^
-
- let &report = save_report
-
-endfunction
-
-" EOF vim: tw=78 ts=8 sw=4 sts=4 noet ai
+" Load the justify package.
+" For those users who were loading the justify plugin from here.
+packadd justify
diff --git a/runtime/macros/less.vim b/runtime/macros/less.vim
index 7ccbeb32ea..aad122d70a 100644
--- a/runtime/macros/less.vim
+++ b/runtime/macros/less.vim
@@ -1,6 +1,6 @@
" Vim script to work like "less"
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2015 Nov 15
+" Last Change: 2017 Mar 31
" Avoid loading this file twice, allow the user to define his own script.
if exists("loaded_less")
@@ -81,6 +81,10 @@ fun! s:Help()
echo "\n"
echo "/pattern Search for pattern ?pattern Search backward for pattern"
echo "n next pattern match N Previous pattern match"
+ if &foldmethod != "manual"
+ echo "\n"
+ echo "zR open all folds zm increase fold level"
+ endif
echo "\n"
echo ":n<Enter> Next file :p<Enter> Previous file"
echo "\n"
@@ -96,7 +100,11 @@ map <C-F> <Space>
map <PageDown> <Space>
map <kPageDown> <Space>
map <S-Down> <Space>
-map z <Space>
+" If 'foldmethod' was changed keep the "z" commands, e.g. "zR" to open all
+" folds.
+if &foldmethod == "manual"
+ map z <Space>
+endif
map <Esc><Space> <Space>
fun! s:NextPage()
if line(".") == line("$")
diff --git a/runtime/macros/shellmenu.vim b/runtime/macros/shellmenu.vim
index 6175d1d9a6..4eb72a556a 100644
--- a/runtime/macros/shellmenu.vim
+++ b/runtime/macros/shellmenu.vim
@@ -1,94 +1,3 @@
-" When you're writing shell scripts and you are in doubt which test to use,
-" which shell environment variables are defined, what the syntax of the case
-" statement is, and you need to invoke 'man sh'?
-"
-" Your problems are over now!
-"
-" Attached is a Vim script file for turning gvim into a shell script editor.
-" It may also be used as an example how to use menus in Vim.
-"
-" Written by: Lennart Schultz <les@dmi.min.dk>
-
-imenu Stmts.for for in do doneki kk0elli
-imenu Stmts.case case in ) ;; esacbki k0elli
-imenu Stmts.if if then fiki kk0elli
-imenu Stmts.if-else if then else fiki kki kk0elli
-imenu Stmts.elif elif then ki kk0elli
-imenu Stmts.while while do doneki kk0elli
-imenu Stmts.break break
-imenu Stmts.continue continue
-imenu Stmts.function () { }ki k0i
-imenu Stmts.return return
-imenu Stmts.return-true return 0
-imenu Stmts.return-false return 1
-imenu Stmts.exit exit
-imenu Stmts.shift shift
-imenu Stmts.trap trap
-imenu Test.existence [ -e ]hi
-imenu Test.existence - file [ -f ]hi
-imenu Test.existence - file (not empty) [ -s ]hi
-imenu Test.existence - directory [ -d ]hi
-imenu Test.existence - executable [ -x ]hi
-imenu Test.existence - readable [ -r ]hi
-imenu Test.existence - writable [ -w ]hi
-imenu Test.String is empty [ x = "x$" ]hhi
-imenu Test.String is not empty [ x != "x$" ]hhi
-imenu Test.Strings is equal [ "" = "" ]hhhhhhhi
-imenu Test.Strings is not equal [ "" != "" ]hhhhhhhhi
-imenu Test.Values is greater than [ -gt ]hhhhhhi
-imenu Test.Values is greater equal [ -ge ]hhhhhhi
-imenu Test.Values is equal [ -eq ]hhhhhhi
-imenu Test.Values is not equal [ -ne ]hhhhhhi
-imenu Test.Values is less than [ -lt ]hhhhhhi
-imenu Test.Values is less equal [ -le ]hhhhhhi
-imenu ParmSub.Substitute word if parm not set ${:-}hhi
-imenu ParmSub.Set parm to word if not set ${:=}hhi
-imenu ParmSub.Substitute word if parm set else nothing ${:+}hhi
-imenu ParmSub.If parm not set print word and exit ${:?}hhi
-imenu SpShVars.Number of positional parameters ${#}
-imenu SpShVars.All positional parameters (quoted spaces) ${*}
-imenu SpShVars.All positional parameters (unquoted spaces) ${@}
-imenu SpShVars.Flags set ${-}
-imenu SpShVars.Return code of last command ${?}
-imenu SpShVars.Process number of this shell ${$}
-imenu SpShVars.Process number of last background command ${!}
-imenu Environ.HOME ${HOME}
-imenu Environ.PATH ${PATH}
-imenu Environ.CDPATH ${CDPATH}
-imenu Environ.MAIL ${MAIL}
-imenu Environ.MAILCHECK ${MAILCHECK}
-imenu Environ.PS1 ${PS1}
-imenu Environ.PS2 ${PS2}
-imenu Environ.IFS ${IFS}
-imenu Environ.SHACCT ${SHACCT}
-imenu Environ.SHELL ${SHELL}
-imenu Environ.LC_CTYPE ${LC_CTYPE}
-imenu Environ.LC_MESSAGES ${LC_MESSAGES}
-imenu Builtins.cd cd
-imenu Builtins.echo echo
-imenu Builtins.eval eval
-imenu Builtins.exec exec
-imenu Builtins.export export
-imenu Builtins.getopts getopts
-imenu Builtins.hash hash
-imenu Builtins.newgrp newgrp
-imenu Builtins.pwd pwd
-imenu Builtins.read read
-imenu Builtins.readonly readonly
-imenu Builtins.return return
-imenu Builtins.times times
-imenu Builtins.type type
-imenu Builtins.umask umask
-imenu Builtins.wait wait
-imenu Set.set set
-imenu Set.unset unset
-imenu Set.mark modified or modified variables set -a
-imenu Set.exit when command returns non-zero exit code set -e
-imenu Set.Disable file name generation set -f
-imenu Set.remember function commands set -h
-imenu Set.All keyword arguments are placed in the environment set -k
-imenu Set.Read commands but do not execute them set -n
-imenu Set.Exit after reading and executing one command set -t
-imenu Set.Treat unset variables as an error when substituting set -u
-imenu Set.Print shell input lines as they are read set -v
-imenu Set.Print commands and their arguments as they are executed set -x
+" Load the shellmenu package.
+" For those users who were loading the shellmenu plugin from here.
+packadd shellmenu
diff --git a/runtime/macros/swapmous.vim b/runtime/macros/swapmous.vim
index 8b85be050b..5884d83473 100644
--- a/runtime/macros/swapmous.vim
+++ b/runtime/macros/swapmous.vim
@@ -1,22 +1,3 @@
-" These macros swap the left and right mouse buttons (for left handed)
-" Don't forget to do ":set mouse=a" or the mouse won't work at all
-noremap <LeftMouse> <RightMouse>
-noremap <2-LeftMouse> <2-RightMouse>
-noremap <3-LeftMouse> <3-RightMouse>
-noremap <4-LeftMouse> <4-RightMouse>
-noremap <LeftDrag> <RightDrag>
-noremap <LeftRelease> <RightRelease>
-noremap <RightMouse> <LeftMouse>
-noremap <2-RightMouse> <2-LeftMouse>
-noremap <3-RightMouse> <3-LeftMouse>
-noremap <4-RightMouse> <4-LeftMouse>
-noremap <RightDrag> <LeftDrag>
-noremap <RightRelease> <LeftRelease>
-noremap g<LeftMouse> <C-RightMouse>
-noremap g<RightMouse> <C-LeftMouse>
-noremap! <LeftMouse> <RightMouse>
-noremap! <LeftDrag> <RightDrag>
-noremap! <LeftRelease> <RightRelease>
-noremap! <RightMouse> <LeftMouse>
-noremap! <RightDrag> <LeftDrag>
-noremap! <RightRelease> <LeftRelease>
+" Load the swapmouse package.
+" For those users who were loading the swapmous plugin from here.
+packadd swapmouse
diff --git a/runtime/menu.vim b/runtime/menu.vim
index 5cbc0faabd..5e4bd1f11b 100644
--- a/runtime/menu.vim
+++ b/runtime/menu.vim
@@ -2,7 +2,7 @@
" You can also use this as a start for your own set of menus.
"
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2014 May 22
+" Last Change: 2018 May 17
" Note that ":an" (short for ":anoremenu") is often used to make a menu work
" in all modes and avoid side effects from mappings defined by the user.
@@ -56,6 +56,13 @@ if exists("v:lang") || &langmenu != ""
let s:lang = substitute(s:lang, '\.[^.]*', "", "")
exe "runtime! lang/menu_" . s:lang . "[^a-z]*vim"
+ if !exists("did_menu_trans") && s:lang =~ '_'
+ " If the language includes a region try matching without that region.
+ " (e.g. find menu_de.vim if s:lang == de_DE).
+ let langonly = substitute(s:lang, '_.*', "", "")
+ exe "runtime! lang/menu_" . langonly . "[^a-z]*vim"
+ endif
+
if !exists("did_menu_trans") && strlen($LANG) > 1 && s:lang !~ '^en_us'
" On windows locale names are complicated, try using $LANG, it might
" have been set by set_init_1(). But don't do this for "en" or "en_us".
@@ -70,7 +77,7 @@ endif
" Help menu
an 9999.10 &Help.&Overview<Tab><F1> :help<CR>
an 9999.20 &Help.&User\ Manual :help usr_toc<CR>
-an 9999.30 &Help.&How-to\ links :help how-to<CR>
+an 9999.30 &Help.&How-To\ Links :help how-to<CR>
an <silent> 9999.40 &Help.&Find\.\.\. :call <SID>Helpfind()<CR>
an 9999.45 &Help.-sep1- <Nop>
an 9999.50 &Help.&Credits :help credits<CR>
@@ -112,7 +119,7 @@ an 10.350 &File.Save\ &As\.\.\.<Tab>:sav :browse confirm saveas<CR>
if has("diff")
an 10.400 &File.-SEP2- <Nop>
- an 10.410 &File.Split\ &Diff\ with\.\.\. :browse vert diffsplit<CR>
+ an 10.410 &File.Split\ &Diff\ With\.\.\. :browse vert diffsplit<CR>
an 10.420 &File.Split\ Patched\ &By\.\.\. :browse vert diffpatch<CR>
endif
@@ -159,7 +166,7 @@ nnoremenu 20.370 &Edit.Put\ &Before<Tab>[p [p
inoremenu &Edit.Put\ &Before<Tab>[p <C-O>[p
nnoremenu 20.380 &Edit.Put\ &After<Tab>]p ]p
inoremenu &Edit.Put\ &After<Tab>]p <C-O>]p
-if has("win32") || has("win16")
+if has("win32")
vnoremenu 20.390 &Edit.&Delete<Tab>x x
endif
noremenu <script> <silent> 20.400 &Edit.&Select\ All<Tab>ggVG :<C-U>call <SID>SelectAll()<CR>
@@ -167,7 +174,7 @@ inoremenu <script> <silent> 20.400 &Edit.&Select\ All<Tab>ggVG <C-O>:call <SID>S
cnoremenu <script> <silent> 20.400 &Edit.&Select\ All<Tab>ggVG <C-U>call <SID>SelectAll()<CR>
an 20.405 &Edit.-SEP2- <Nop>
-if has("win32") || has("win16") || has("gui_gtk") || has("gui_kde") || has("gui_motif")
+if has("win32") || has("gui_gtk") || has("gui_kde") || has("gui_motif")
an 20.410 &Edit.&Find\.\.\. :promptfind<CR>
vunmenu &Edit.&Find\.\.\.
vnoremenu <silent> &Edit.&Find\.\.\. y:promptfind <C-R>=<SID>FixFText()<CR><CR>
@@ -188,12 +195,14 @@ an 20.435 &Edit.Startup\ &Settings :call <SID>EditVimrc()<CR>
fun! s:EditVimrc()
if $MYVIMRC != ''
let fname = $MYVIMRC
- elseif has("win32") || has("dos32") || has("dos16")
+ elseif has("win32")
if $HOME != ''
let fname = $HOME . "/_vimrc"
else
let fname = $VIM . "/_vimrc"
endif
+ elseif has("amiga")
+ let fname = "s:.vimrc"
else
let fname = $HOME . "/.vimrc"
endif
@@ -212,25 +221,25 @@ endfun
" Edit/Global Settings
an 20.440.100 &Edit.&Global\ Settings.Toggle\ Pattern\ &Highlight<Tab>:set\ hls! :set hls! hls?<CR>
-an 20.440.110 &Edit.&Global\ Settings.Toggle\ &Ignore-case<Tab>:set\ ic! :set ic! ic?<CR>
-an 20.440.110 &Edit.&Global\ Settings.Toggle\ &Showmatch<Tab>:set\ sm! :set sm! sm?<CR>
-
-an 20.440.120 &Edit.&Global\ Settings.&Context\ lines.\ 1\ :set so=1<CR>
-an 20.440.120 &Edit.&Global\ Settings.&Context\ lines.\ 2\ :set so=2<CR>
-an 20.440.120 &Edit.&Global\ Settings.&Context\ lines.\ 3\ :set so=3<CR>
-an 20.440.120 &Edit.&Global\ Settings.&Context\ lines.\ 4\ :set so=4<CR>
-an 20.440.120 &Edit.&Global\ Settings.&Context\ lines.\ 5\ :set so=5<CR>
-an 20.440.120 &Edit.&Global\ Settings.&Context\ lines.\ 7\ :set so=7<CR>
-an 20.440.120 &Edit.&Global\ Settings.&Context\ lines.\ 10\ :set so=10<CR>
-an 20.440.120 &Edit.&Global\ Settings.&Context\ lines.\ 100\ :set so=100<CR>
+an 20.440.110 &Edit.&Global\ Settings.Toggle\ &Ignoring\ Case<Tab>:set\ ic! :set ic! ic?<CR>
+an 20.440.110 &Edit.&Global\ Settings.Toggle\ &Showing\ Matched\ Pairs<Tab>:set\ sm! :set sm! sm?<CR>
+
+an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 1\ :set so=1<CR>
+an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 2\ :set so=2<CR>
+an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 3\ :set so=3<CR>
+an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 4\ :set so=4<CR>
+an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 5\ :set so=5<CR>
+an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 7\ :set so=7<CR>
+an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 10\ :set so=10<CR>
+an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 100\ :set so=100<CR>
an 20.440.130.40 &Edit.&Global\ Settings.&Virtual\ Edit.Never :set ve=<CR>
an 20.440.130.50 &Edit.&Global\ Settings.&Virtual\ Edit.Block\ Selection :set ve=block<CR>
-an 20.440.130.60 &Edit.&Global\ Settings.&Virtual\ Edit.Insert\ mode :set ve=insert<CR>
+an 20.440.130.60 &Edit.&Global\ Settings.&Virtual\ Edit.Insert\ Mode :set ve=insert<CR>
an 20.440.130.70 &Edit.&Global\ Settings.&Virtual\ Edit.Block\ and\ Insert :set ve=block,insert<CR>
an 20.440.130.80 &Edit.&Global\ Settings.&Virtual\ Edit.Always :set ve=all<CR>
an 20.440.140 &Edit.&Global\ Settings.Toggle\ Insert\ &Mode<Tab>:set\ im! :set im!<CR>
-an 20.440.145 &Edit.&Global\ Settings.Toggle\ Vi\ C&ompatible<Tab>:set\ cp! :set cp!<CR>
+an 20.440.145 &Edit.&Global\ Settings.Toggle\ Vi\ C&ompatibility<Tab>:set\ cp! :set cp!<CR>
an <silent> 20.440.150 &Edit.&Global\ Settings.Search\ &Path\.\.\. :call <SID>SearchP()<CR>
an <silent> 20.440.160 &Edit.&Global\ Settings.Ta&g\ Files\.\.\. :call <SID>TagFiles()<CR>
"
@@ -274,13 +283,13 @@ endfun
" Boolean options
an 20.440.100 &Edit.F&ile\ Settings.Toggle\ Line\ &Numbering<Tab>:set\ nu! :set nu! nu?<CR>
-an 20.440.105 &Edit.F&ile\ Settings.Toggle\ relati&ve\ Line\ Numbering<Tab>:set\ rnu! :set rnu! rnu?<CR>
+an 20.440.105 &Edit.F&ile\ Settings.Toggle\ Relati&ve\ Line\ Numbering<Tab>:set\ rnu! :set rnu! rnu?<CR>
an 20.440.110 &Edit.F&ile\ Settings.Toggle\ &List\ Mode<Tab>:set\ list! :set list! list?<CR>
-an 20.440.120 &Edit.F&ile\ Settings.Toggle\ Line\ &Wrap<Tab>:set\ wrap! :set wrap! wrap?<CR>
-an 20.440.130 &Edit.F&ile\ Settings.Toggle\ W&rap\ at\ word<Tab>:set\ lbr! :set lbr! lbr?<CR>
-an 20.440.160 &Edit.F&ile\ Settings.Toggle\ &expand-tab<Tab>:set\ et! :set et! et?<CR>
-an 20.440.170 &Edit.F&ile\ Settings.Toggle\ &auto-indent<Tab>:set\ ai! :set ai! ai?<CR>
-an 20.440.180 &Edit.F&ile\ Settings.Toggle\ &C-indenting<Tab>:set\ cin! :set cin! cin?<CR>
+an 20.440.120 &Edit.F&ile\ Settings.Toggle\ Line\ &Wrapping<Tab>:set\ wrap! :set wrap! wrap?<CR>
+an 20.440.130 &Edit.F&ile\ Settings.Toggle\ W&rapping\ at\ Word<Tab>:set\ lbr! :set lbr! lbr?<CR>
+an 20.440.160 &Edit.F&ile\ Settings.Toggle\ Tab\ &Expanding<Tab>:set\ et! :set et! et?<CR>
+an 20.440.170 &Edit.F&ile\ Settings.Toggle\ &Auto\ Indenting<Tab>:set\ ai! :set ai! ai?<CR>
+an 20.440.180 &Edit.F&ile\ Settings.Toggle\ &C-Style\ Indenting<Tab>:set\ cin! :set cin! cin?<CR>
" other options
an 20.440.600 &Edit.F&ile\ Settings.-SEP2- <Nop>
@@ -309,7 +318,7 @@ fun! s:TextWidth()
" Remove leading zeros to avoid it being used as an octal number.
" But keep a zero by itself.
let tw = substitute(n, "^0*", "", "")
- let &tw = tw == '' ? 0 : tw
+ let &tw = tw == '' ? 0 : tw
endif
endfun
@@ -337,63 +346,83 @@ fun! s:FileFormat()
endif
endfun
+let s:did_setup_color_schemes = 0
" Setup the Edit.Color Scheme submenu
-
-" get NL separated string with file names
-let s:n = globpath(&runtimepath, "colors/*.vim")
-
-" split at NL, ignore case for Windows, sort on name
-let s:names = sort(map(split(s:n, "\n"), 'substitute(v:val, "\\c.*[/\\\\:\\]]\\([^/\\\\:]*\\)\\.vim", "\\1", "")'), 1)
-
-" define all the submenu entries
-let s:idx = 100
-for s:name in s:names
- exe "an 20.450." . s:idx . ' &Edit.C&olor\ Scheme.' . s:name . " :colors " . s:name . "<CR>"
- let s:idx = s:idx + 10
-endfor
-unlet s:name s:names s:n s:idx
+func! s:SetupColorSchemes() abort
+ if s:did_setup_color_schemes
+ return
+ endif
+ let s:did_setup_color_schemes = 1
+
+ let n = globpath(&runtimepath, "colors/*.vim", 1, 1)
+ let n += globpath(&runtimepath, "pack/*/start/*/colors/*.vim", 1, 1)
+ let n += globpath(&runtimepath, "pack/*/opt/*/colors/*.vim", 1, 1)
+
+ " Ignore case for VMS and windows, sort on name
+ let names = sort(map(n, 'substitute(v:val, "\\c.*[/\\\\:\\]]\\([^/\\\\:]*\\)\\.vim", "\\1", "")'), 1)
+
+ " define all the submenu entries
+ let idx = 100
+ for name in names
+ exe "an 20.450." . idx . ' &Edit.C&olor\ Scheme.' . name . " :colors " . name . "<CR>"
+ let idx = idx + 10
+ endfor
+ silent! aunmenu &Edit.Show\ C&olor\ Schemes\ in\ Menu
+endfun
+if exists("do_no_lazyload_menus")
+ call s:SetupColorSchemes()
+else
+ an <silent> 20.450 &Edit.Show\ C&olor\ Schemes\ in\ Menu :call <SID>SetupColorSchemes()<CR>
+endif
" Setup the Edit.Keymap submenu
if has("keymap")
- let s:n = globpath(&runtimepath, "keymap/*.vim")
- if s:n != ""
- let s:idx = 100
- an 20.460.90 &Edit.&Keymap.None :set keymap=<CR>
- while strlen(s:n) > 0
- let s:i = stridx(s:n, "\n")
- if s:i < 0
- let s:name = s:n
- let s:n = ""
- else
- let s:name = strpart(s:n, 0, s:i)
- let s:n = strpart(s:n, s:i + 1, 19999)
- endif
- " Ignore case for Windows
- let s:name = substitute(s:name, '\c.*[/\\:\]]\([^/\\:_]*\)\(_[0-9a-zA-Z-]*\)\=\.vim', '\1', '')
- exe "an 20.460." . s:idx . ' &Edit.&Keymap.' . s:name . " :set keymap=" . s:name . "<CR>"
- unlet s:name
- unlet s:i
- let s:idx = s:idx + 10
- endwhile
- unlet s:idx
+ let s:did_setup_keymaps = 0
+
+ func! s:SetupKeymaps() abort
+ if s:did_setup_keymaps
+ return
+ endif
+ let s:did_setup_keymaps = 1
+
+ let n = globpath(&runtimepath, "keymap/*.vim", 1, 1)
+ if !empty(n)
+ let idx = 100
+ an 20.460.90 &Edit.&Keymap.None :set keymap=<CR>
+ for name in n
+ " Ignore case for VMS and windows
+ let name = substitute(name, '\c.*[/\\:\]]\([^/\\:_]*\)\(_[0-9a-zA-Z-]*\)\=\.vim', '\1', '')
+ exe "an 20.460." . idx . ' &Edit.&Keymap.' . name . " :set keymap=" . name . "<CR>"
+ let idx = idx + 10
+ endfor
+ endif
+ silent! aunmenu &Edit.Show\ &Keymaps\ in\ Menu
+ endfun
+ if exists("do_no_lazyload_menus")
+ call s:SetupKeymaps()
+ else
+ an <silent> 20.460 &Edit.Show\ &Keymaps\ in\ Menu :call <SID>SetupKeymaps()<CR>
endif
- unlet s:n
endif
-if has("win32") || has("win16") || has("gui_motif") || has("gui_gtk") || has("gui_kde") || has("gui_mac")
+if has("win32") || has("gui_motif") || has("gui_gtk") || has("gui_kde") || has("gui_photon") || has("gui_mac")
an 20.470 &Edit.Select\ Fo&nt\.\.\. :set guifont=*<CR>
endif
" Programming menu
if !exists("g:ctags_command")
- let g:ctags_command = "ctags -R ."
+ if has("vms")
+ let g:ctags_command = "mc vim:ctags *.*"
+ else
+ let g:ctags_command = "ctags -R ."
+ endif
endif
-an 40.300 &Tools.&Jump\ to\ this\ tag<Tab>g^] g<C-]>
-vunmenu &Tools.&Jump\ to\ this\ tag<Tab>g^]
-vnoremenu &Tools.&Jump\ to\ this\ tag<Tab>g^] g<C-]>
-an 40.310 &Tools.Jump\ &back<Tab>^T <C-T>
+an 40.300 &Tools.&Jump\ to\ This\ Tag<Tab>g^] g<C-]>
+vunmenu &Tools.&Jump\ to\ This\ Tag<Tab>g^]
+vnoremenu &Tools.&Jump\ to\ This\ Tag<Tab>g^] g<C-]>
+an 40.310 &Tools.Jump\ &Back<Tab>^T <C-T>
an 40.320 &Tools.Build\ &Tags\ File :exe "!" . g:ctags_command<CR>
if has("folding") || has("spell")
@@ -404,17 +433,17 @@ endif
if has("spell")
an 40.335.110 &Tools.&Spelling.&Spell\ Check\ On :set spell<CR>
an 40.335.120 &Tools.&Spelling.Spell\ Check\ &Off :set nospell<CR>
- an 40.335.130 &Tools.&Spelling.To\ &Next\ error<Tab>]s ]s
- an 40.335.130 &Tools.&Spelling.To\ &Previous\ error<Tab>[s [s
+ an 40.335.130 &Tools.&Spelling.To\ &Next\ Error<Tab>]s ]s
+ an 40.335.130 &Tools.&Spelling.To\ &Previous\ Error<Tab>[s [s
an 40.335.140 &Tools.&Spelling.Suggest\ &Corrections<Tab>z= z=
- an 40.335.150 &Tools.&Spelling.&Repeat\ correction<Tab>:spellrepall :spellrepall<CR>
+ an 40.335.150 &Tools.&Spelling.&Repeat\ Correction<Tab>:spellrepall :spellrepall<CR>
an 40.335.200 &Tools.&Spelling.-SEP1- <Nop>
- an 40.335.210 &Tools.&Spelling.Set\ language\ to\ "en" :set spl=en spell<CR>
- an 40.335.220 &Tools.&Spelling.Set\ language\ to\ "en_au" :set spl=en_au spell<CR>
- an 40.335.230 &Tools.&Spelling.Set\ language\ to\ "en_ca" :set spl=en_ca spell<CR>
- an 40.335.240 &Tools.&Spelling.Set\ language\ to\ "en_gb" :set spl=en_gb spell<CR>
- an 40.335.250 &Tools.&Spelling.Set\ language\ to\ "en_nz" :set spl=en_nz spell<CR>
- an 40.335.260 &Tools.&Spelling.Set\ language\ to\ "en_us" :set spl=en_us spell<CR>
+ an 40.335.210 &Tools.&Spelling.Set\ Language\ to\ "en" :set spl=en spell<CR>
+ an 40.335.220 &Tools.&Spelling.Set\ Language\ to\ "en_au" :set spl=en_au spell<CR>
+ an 40.335.230 &Tools.&Spelling.Set\ Language\ to\ "en_ca" :set spl=en_ca spell<CR>
+ an 40.335.240 &Tools.&Spelling.Set\ Language\ to\ "en_gb" :set spl=en_gb spell<CR>
+ an 40.335.250 &Tools.&Spelling.Set\ Language\ to\ "en_nz" :set spl=en_nz spell<CR>
+ an 40.335.260 &Tools.&Spelling.Set\ Language\ to\ "en_us" :set spl=en_us spell<CR>
an <silent> 40.335.270 &Tools.&Spelling.&Find\ More\ Languages :call <SID>SpellLang()<CR>
let s:undo_spellang = ['aun &Tools.&Spelling.&Find\ More\ Languages']
@@ -431,14 +460,14 @@ if has("spell")
endif
if !exists("g:menutrans_set_lang_to")
- let g:menutrans_set_lang_to = 'Set language to'
+ let g:menutrans_set_lang_to = 'Set Language to'
endif
let found = 0
- let s = globpath(&rtp, "spell/*." . enc . ".spl")
- if s != ""
+ let s = globpath(&runtimepath, "spell/*." . enc . ".spl", 1, 1)
+ if !empty(s)
let n = 300
- for f in split(s, "\n")
+ for f in s
let nm = substitute(f, '.*spell[/\\]\(..\)\.[^/\\]*\.spl', '\1', "")
if nm != "en" && nm !~ '/'
let _nm = nm
@@ -468,14 +497,14 @@ endif
" Tools.Fold Menu
if has("folding")
" open close folds
- an 40.340.110 &Tools.&Folding.&Enable/Disable\ folds<Tab>zi zi
+ an 40.340.110 &Tools.&Folding.&Enable/Disable\ Folds<Tab>zi zi
an 40.340.120 &Tools.&Folding.&View\ Cursor\ Line<Tab>zv zv
- an 40.340.120 &Tools.&Folding.Vie&w\ Cursor\ Line\ only<Tab>zMzx zMzx
- inoremenu 40.340.120 &Tools.&Folding.Vie&w\ Cursor\ Line\ only<Tab>zMzx <C-O>zM<C-O>zx
- an 40.340.130 &Tools.&Folding.C&lose\ more\ folds<Tab>zm zm
- an 40.340.140 &Tools.&Folding.&Close\ all\ folds<Tab>zM zM
- an 40.340.150 &Tools.&Folding.O&pen\ more\ folds<Tab>zr zr
- an 40.340.160 &Tools.&Folding.&Open\ all\ folds<Tab>zR zR
+ an 40.340.120 &Tools.&Folding.Vie&w\ Cursor\ Line\ Only<Tab>zMzx zMzx
+ inoremenu 40.340.120 &Tools.&Folding.Vie&w\ Cursor\ Line\ Only<Tab>zMzx <C-O>zM<C-O>zx
+ an 40.340.130 &Tools.&Folding.C&lose\ More\ Folds<Tab>zm zm
+ an 40.340.140 &Tools.&Folding.&Close\ All\ Folds<Tab>zM zM
+ an 40.340.150 &Tools.&Folding.O&pen\ More\ Folds<Tab>zr zr
+ an 40.340.160 &Tools.&Folding.&Open\ All\ Folds<Tab>zR zR
" fold method
an 40.340.200 &Tools.&Folding.-SEP1- <Nop>
an 40.340.210 &Tools.&Folding.Fold\ Met&hod.M&anual :set fdm=manual<CR>
@@ -490,14 +519,14 @@ if has("folding")
an 40.340.240 &Tools.&Folding.Delete\ &All\ Folds<Tab>zD zD
" moving around in folds
an 40.340.300 &Tools.&Folding.-SEP2- <Nop>
- an 40.340.310.10 &Tools.&Folding.Fold\ col&umn\ width.\ &0\ :set fdc=0<CR>
- an 40.340.310.20 &Tools.&Folding.Fold\ col&umn\ width.\ &2\ :set fdc=2<CR>
- an 40.340.310.30 &Tools.&Folding.Fold\ col&umn\ width.\ &3\ :set fdc=3<CR>
- an 40.340.310.40 &Tools.&Folding.Fold\ col&umn\ width.\ &4\ :set fdc=4<CR>
- an 40.340.310.50 &Tools.&Folding.Fold\ col&umn\ width.\ &5\ :set fdc=5<CR>
- an 40.340.310.60 &Tools.&Folding.Fold\ col&umn\ width.\ &6\ :set fdc=6<CR>
- an 40.340.310.70 &Tools.&Folding.Fold\ col&umn\ width.\ &7\ :set fdc=7<CR>
- an 40.340.310.80 &Tools.&Folding.Fold\ col&umn\ width.\ &8\ :set fdc=8<CR>
+ an 40.340.310.10 &Tools.&Folding.Fold\ Col&umn\ Width.\ &0\ :set fdc=0<CR>
+ an 40.340.310.20 &Tools.&Folding.Fold\ Col&umn\ Width.\ &2\ :set fdc=2<CR>
+ an 40.340.310.30 &Tools.&Folding.Fold\ Col&umn\ Width.\ &3\ :set fdc=3<CR>
+ an 40.340.310.40 &Tools.&Folding.Fold\ Col&umn\ Width.\ &4\ :set fdc=4<CR>
+ an 40.340.310.50 &Tools.&Folding.Fold\ Col&umn\ Width.\ &5\ :set fdc=5<CR>
+ an 40.340.310.60 &Tools.&Folding.Fold\ Col&umn\ Width.\ &6\ :set fdc=6<CR>
+ an 40.340.310.70 &Tools.&Folding.Fold\ Col&umn\ Width.\ &7\ :set fdc=7<CR>
+ an 40.340.310.80 &Tools.&Folding.Fold\ Col&umn\ Width.\ &8\ :set fdc=8<CR>
endif " has folding
if has("diff")
@@ -525,15 +554,19 @@ an 40.430.70 &Tools.Error\ &Window.&Close<Tab>:cclose :cclose<CR>
an 40.520 &Tools.-SEP3- <Nop>
an <silent> 40.530 &Tools.&Convert\ to\ HEX<Tab>:%!xxd
\ :call <SID>XxdConv()<CR>
-an <silent> 40.540 &Tools.Conve&rt\ back<Tab>:%!xxd\ -r
+an <silent> 40.540 &Tools.Conve&rt\ Back<Tab>:%!xxd\ -r
\ :call <SID>XxdBack()<CR>
" Use a function to do the conversion, so that it also works with 'insertmode'
" set.
func! s:XxdConv()
let mod = &mod
- call s:XxdFind()
- exe '%!"' . g:xxdprogram . '"'
+ if has("vms")
+ %!mc vim:xxd
+ else
+ call s:XxdFind()
+ exe '%!"' . g:xxdprogram . '"'
+ endif
if getline(1) =~ "^0000000:" " only if it worked
set ft=xxd
endif
@@ -542,8 +575,12 @@ endfun
func! s:XxdBack()
let mod = &mod
- call s:XxdFind()
- exe '%!"' . g:xxdprogram . '" -r'
+ if has("vms")
+ %!mc vim:xxd -r
+ else
+ call s:XxdFind()
+ exe '%!"' . g:xxdprogram . '" -r'
+ endif
set ft=
doautocmd filetypedetect BufReadPost
let &mod = mod
@@ -552,7 +589,7 @@ endfun
func! s:XxdFind()
if !exists("g:xxdprogram")
" On the PC xxd may not be in the path but in the install directory
- if (has("win32") || has("dos32")) && !executable("xxd")
+ if has("win32") && !executable("xxd")
let g:xxdprogram = $VIMRUNTIME . (&shellslash ? '/' : '\') . "xxd.exe"
else
let g:xxdprogram = "xxd"
@@ -560,27 +597,46 @@ func! s:XxdFind()
endif
endfun
+let s:did_setup_compilers = 0
+
" Setup the Tools.Compiler submenu
-let s:n = globpath(&runtimepath, "compiler/*.vim")
-let s:idx = 100
-while strlen(s:n) > 0
- let s:i = stridx(s:n, "\n")
- if s:i < 0
- let s:name = s:n
- let s:n = ""
- else
- let s:name = strpart(s:n, 0, s:i)
- let s:n = strpart(s:n, s:i + 1, 19999)
+func! s:SetupCompilers() abort
+ if s:did_setup_compilers
+ return
endif
- " Ignore case for Windows
- let s:name = substitute(s:name, '\c.*[/\\:\]]\([^/\\:]*\)\.vim', '\1', '')
- exe "an 30.440." . s:idx . ' &Tools.Se&T\ Compiler.' . s:name . " :compiler " . s:name . "<CR>"
- unlet s:name
- unlet s:i
- let s:idx = s:idx + 10
-endwhile
-unlet s:n
-unlet s:idx
+ let s:did_setup_compilers = 1
+
+ let n = globpath(&runtimepath, "compiler/*.vim", 1, 1)
+ let idx = 100
+ for name in n
+ " Ignore case for VMS and windows
+ let name = substitute(name, '\c.*[/\\:\]]\([^/\\:]*\)\.vim', '\1', '')
+ exe "an 30.440." . idx . ' &Tools.Se&t\ Compiler.' . name . " :compiler " . name . "<CR>"
+ let idx = idx + 10
+ endfor
+ silent! aunmenu &Tools.Show\ Compiler\ Se&ttings\ in\ Menu
+endfun
+if exists("do_no_lazyload_menus")
+ call s:SetupCompilers()
+else
+ an <silent> 30.440 &Tools.Show\ Compiler\ Se&ttings\ in\ Menu :call <SID>SetupCompilers()<CR>
+endif
+
+" Load ColorScheme, Compiler Setting and Keymap menus when idle.
+if !exists("do_no_lazyload_menus")
+ func! s:SetupLazyloadMenus()
+ call s:SetupColorSchemes()
+ call s:SetupCompilers()
+ if has("keymap")
+ call s:SetupKeymaps()
+ endif
+ endfunc
+ augroup SetupLazyloadMenus
+ au!
+ au CursorHold,CursorHoldI * call <SID>SetupLazyloadMenus() | au! SetupLazyloadMenus
+ augroup END
+endif
+
if !exists("no_buffers_menu")
@@ -683,13 +739,21 @@ endfunc
func! s:BMHash(name)
" Make name all upper case, so that chars are between 32 and 96
let nm = substitute(a:name, ".*", '\U\0', "")
- let sp = char2nr(' ')
+ if has("ebcdic")
+ " HACK: Replace all non alphabetics with 'Z'
+ " Just to make it work for now.
+ let nm = substitute(nm, "[^A-Z]", 'Z', "g")
+ let sp = char2nr('A') - 1
+ else
+ let sp = char2nr(' ')
+ endif
" convert first six chars into a number for sorting:
return (char2nr(nm[0]) - sp) * 0x800000 + (char2nr(nm[1]) - sp) * 0x20000 + (char2nr(nm[2]) - sp) * 0x1000 + (char2nr(nm[3]) - sp) * 0x80 + (char2nr(nm[4]) - sp) * 0x20 + (char2nr(nm[5]) - sp)
endfunc
func! s:BMHash2(name)
let nm = substitute(a:name, ".", '\L\0', "")
+ " Not exactly right for EBCDIC...
if nm[0] < 'a' || nm[0] > 'z'
return '&others.'
elseif nm[0] <= 'd'
@@ -754,7 +818,7 @@ func! s:BMMunge(fname, bnum)
let name = a:fname
if name == ''
if !exists("g:menutrans_no_file")
- let g:menutrans_no_file = "[No file]"
+ let g:menutrans_no_file = "[No Name]"
endif
let name = g:menutrans_no_file
else
@@ -807,8 +871,8 @@ an 70.345 &Window.Close\ &Other(s)<Tab>^Wo :confirm only<CR>
an 70.350 &Window.-SEP2- <Nop>
an 70.355 &Window.Move\ &To.&Top<Tab>^WK <C-W>K
an 70.355 &Window.Move\ &To.&Bottom<Tab>^WJ <C-W>J
-an 70.355 &Window.Move\ &To.&Left\ side<Tab>^WH <C-W>H
-an 70.355 &Window.Move\ &To.&Right\ side<Tab>^WL <C-W>L
+an 70.355 &Window.Move\ &To.&Left\ Side<Tab>^WH <C-W>H
+an 70.355 &Window.Move\ &To.&Right\ Side<Tab>^WL <C-W>L
an 70.360 &Window.Rotate\ &Up<Tab>^WR <C-W>R
an 70.362 &Window.Rotate\ &Down<Tab>^Wr <C-W>r
an 70.365 &Window.-SEP3- <Nop>
@@ -891,7 +955,10 @@ if has("spell")
let s:suglist = spellsuggest(w, 10)
endif
if len(s:suglist) > 0
- let s:changeitem = 'change\ "' . escape(w, ' .'). '"\ to'
+ if !exists("g:menutrans_spell_change_ARG_to")
+ let g:menutrans_spell_change_ARG_to = 'Change\ "%s"\ to'
+ endif
+ let s:changeitem = printf(g:menutrans_spell_change_ARG_to, escape(w, ' .'))
let s:fromword = w
let pri = 1
" set 'cpo' to include the <CR>
@@ -903,10 +970,16 @@ if has("spell")
let pri += 1
endfor
- let s:additem = 'add\ "' . escape(w, ' .') . '"\ to\ word\ list'
+ if !exists("g:menutrans_spell_add_ARG_to_word_list")
+ let g:menutrans_spell_add_ARG_to_word_list = 'Add\ "%s"\ to\ Word\ List'
+ endif
+ let s:additem = printf(g:menutrans_spell_add_ARG_to_word_list, escape(w, ' .'))
exe 'anoremenu 1.6 PopUp.' . s:additem . ' :spellgood ' . w . '<CR>'
- let s:ignoreitem = 'ignore\ "' . escape(w, ' .') . '"'
+ if !exists("g:menutrans_spell_ignore_ARG")
+ let g:menutrans_spell_ignore_ARG = 'Ignore\ "%s"'
+ endif
+ let s:ignoreitem = printf(g:menutrans_spell_ignore_ARG, escape(w, ' .'))
exe 'anoremenu 1.7 PopUp.' . s:ignoreitem . ' :spellgood! ' . w . '<CR>'
anoremenu 1.8 PopUp.-SpellSep- :
@@ -1045,7 +1118,7 @@ endif " !exists("did_install_default_menus")
if !exists("did_install_syntax_menu")
an 50.212 &Syntax.&Manual :syn manual<CR>
an 50.214 &Syntax.A&utomatic :syn on<CR>
- an <silent> 50.216 &Syntax.on/off\ for\ &This\ file :call <SID>SynOnOff()<CR>
+ an <silent> 50.216 &Syntax.On/Off\ for\ &This\ File :call <SID>SynOnOff()<CR>
if !exists("*s:SynOnOff")
fun s:SynOnOff()
if has("syntax_items")
@@ -1073,14 +1146,14 @@ if (exists("did_load_filetypes") || exists("syntax_on"))
if exists("do_syntax_sel_menu")
runtime! synmenu.vim
else
- an 50.10 &Syntax.&Show\ filetypes\ in\ menu :let do_syntax_sel_menu = 1<Bar>runtime! synmenu.vim<Bar>aunmenu &Syntax.&Show\ filetypes\ in\ menu<CR>
+ an <silent> 50.10 &Syntax.&Show\ File\ Types\ in\ Menu :let do_syntax_sel_menu = 1<Bar>runtime! synmenu.vim<Bar>aunmenu &Syntax.&Show\ File\ Types\ in\ Menu<CR>
an 50.195 &Syntax.-SEP1- <Nop>
endif
an 50.210 &Syntax.&Off :syn off<CR>
an 50.700 &Syntax.-SEP3- <Nop>
-an 50.710 &Syntax.Co&lor\ test :sp $VIMRUNTIME/syntax/colortest.vim<Bar>so %<CR>
-an 50.720 &Syntax.&Highlight\ test :runtime syntax/hitest.vim<CR>
+an 50.710 &Syntax.Co&lor\ Test :sp $VIMRUNTIME/syntax/colortest.vim<Bar>so %<CR>
+an 50.720 &Syntax.&Highlight\ Test :runtime syntax/hitest.vim<CR>
an 50.730 &Syntax.&Convert\ to\ HTML :runtime syntax/2html.vim<CR>
endif " !exists("did_install_syntax_menu")
diff --git a/runtime/mswin.vim b/runtime/mswin.vim
index ca280d227c..5ec21491fe 100644
--- a/runtime/mswin.vim
+++ b/runtime/mswin.vim
@@ -1,7 +1,7 @@
" Set options and add mapping such that Vim behaves a lot like MS-Windows
"
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last change: 2012 Jul 25
+" Last change: 2017 Oct 28
" bail out if this isn't wanted (mrsvim.vim uses this).
if exists("g:skip_loading_mswin") && g:skip_loading_mswin
@@ -23,20 +23,22 @@ set backspace=indent,eol,start whichwrap+=<,>,[,]
" backspace in Visual mode deletes selection
vnoremap <BS> d
-" CTRL-X and SHIFT-Del are Cut
-vnoremap <C-X> "+x
-vnoremap <S-Del> "+x
+if has("clipboard")
+ " CTRL-X and SHIFT-Del are Cut
+ vnoremap <C-X> "+x
+ vnoremap <S-Del> "+x
-" CTRL-C and CTRL-Insert are Copy
-vnoremap <C-C> "+y
-vnoremap <C-Insert> "+y
+ " CTRL-C and CTRL-Insert are Copy
+ vnoremap <C-C> "+y
+ vnoremap <C-Insert> "+y
-" CTRL-V and SHIFT-Insert are Paste
-map <C-V> "+gP
-map <S-Insert> "+gP
+ " CTRL-V and SHIFT-Insert are Paste
+ map <C-V> "+gP
+ map <S-Insert> "+gP
-cmap <C-V> <C-R>+
-cmap <S-Insert> <C-R>+
+ cmap <C-V> <C-R>+
+ cmap <S-Insert> <C-R>+
+endif
" Pasting blockwise and linewise selections is not possible in Insert and
" Visual mode without the +virtualedit feature. They are pasted as if they
@@ -44,8 +46,10 @@ cmap <S-Insert> <C-R>+
" Uses the paste.vim autoload script.
" Use CTRL-G u to have CTRL-Z only undo the paste.
-exe 'inoremap <script> <C-V> <C-G>u' . paste#paste_cmd['i']
-exe 'vnoremap <script> <C-V> ' . paste#paste_cmd['v']
+if 1
+ exe 'inoremap <script> <C-V> <C-G>u' . paste#paste_cmd['i']
+ exe 'vnoremap <script> <C-V> ' . paste#paste_cmd['v']
+endif
imap <S-Insert> <C-V>
vmap <S-Insert> <C-V>
@@ -53,10 +57,11 @@ vmap <S-Insert> <C-V>
" Use CTRL-Q to do what CTRL-V used to do
noremap <C-Q> <C-V>
-" Use CTRL-S for saving, also in Insert mode
+" Use CTRL-S for saving, also in Insert mode (<C-O> doesn't work well when
+" using completions).
noremap <C-S> :update<CR>
vnoremap <C-S> <C-C>:update<CR>
-inoremap <C-S> <C-O>:update<CR>
+inoremap <C-S> <Esc>:update<CR>gi
" For CTRL-V to work autoselect must be off.
" On Unix we have two selections, autoselect can be used.
@@ -99,6 +104,19 @@ inoremap <C-F4> <C-O><C-W>c
cnoremap <C-F4> <C-C><C-W>c
onoremap <C-F4> <C-C><C-W>c
+if has("gui")
+ " CTRL-F is the search dialog
+ noremap <expr> <C-F> has("gui_running") ? ":promptfind\<CR>" : "/"
+ inoremap <expr> <C-F> has("gui_running") ? "\<C-\>\<C-O>:promptfind\<CR>" : "\<C-\>\<C-O>/"
+ cnoremap <expr> <C-F> has("gui_running") ? "\<C-\>\<C-C>:promptfind\<CR>" : "\<C-\>\<C-O>/"
+
+ " CTRL-H is the replace dialog,
+ " but in console, it might be backspace, so don't map it there
+ nnoremap <expr> <C-H> has("gui_running") ? ":promptrepl\<CR>" : "\<C-H>"
+ inoremap <expr> <C-H> has("gui_running") ? "\<C-\>\<C-O>:promptrepl\<CR>" : "\<C-H>"
+ cnoremap <expr> <C-H> has("gui_running") ? "\<C-\>\<C-C>:promptrepl\<CR>" : "\<C-H>"
+endif
+
" restore 'cpoptions'
set cpo&
if 1
diff --git a/runtime/nvim.appdata.xml b/runtime/nvim.appdata.xml
new file mode 100644
index 0000000000..095e6c6fa8
--- /dev/null
+++ b/runtime/nvim.appdata.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2018 Neovim contributors
+
+ See also:
+ https://appimage.github.io/neovim/
+ https://github.com/flathub/io.neovim.nvim
+-->
+<component type="desktop-application">
+ <id>nvim</id>
+ <project_license>Apache-2.0</project_license>
+ <metadata_license>CC0-1.0</metadata_license>
+ <name>Neovim</name>
+ <summary>Vim-fork focused on extensibility and usability</summary>
+
+ <description>
+ <p>Neovim is a refactor of the Vim text editor designed to encourage new features, advanced UIs, and powerful extensions.</p>
+ </description>
+
+ <screenshots>
+ <screenshot type="default">
+ <caption>Live :substitute feature</caption>
+ <image>https://neovim.io/images/nvim-screenshot-1.png</image>
+ </screenshot>
+ </screenshots>
+
+ <launchable type="desktop-id">nvim.desktop</launchable>
+ <url type="homepage">https://neovim.io/</url>
+ <url type="bugtracker">https://github.com/neovim/neovim/issues</url>
+ <url type="faq">https://github.com/neovim/neovim/wiki/FAQ</url>
+ <url type="help">https://neovim.io/doc/</url>
+ <url type="donation">https://neovim.io/#sponsor</url>
+ <url type="translate">https://github.com/neovim/neovim/tree/master/src/nvim/po</url>
+ <provides>
+ <binary>nvim</binary>
+ </provides>
+</component>
diff --git a/runtime/nvim.desktop b/runtime/nvim.desktop
new file mode 100644
index 0000000000..be6a2eda82
--- /dev/null
+++ b/runtime/nvim.desktop
@@ -0,0 +1,81 @@
+[Desktop Entry]
+Name=Neovim
+GenericName=Text Editor
+GenericName[de]=Texteditor
+Comment=Edit text files
+Comment[af]=Redigeer tekslรชers
+Comment[am]=แ‹จแŒฝแˆ‘แ แ‹แ‹ญแˆŽแ‰ฝ แ‹ซแˆตแ‰ฐแŠซแŠญแˆ‰
+Comment[ar]=ุญุฑู‘ุฑ ู…ู„ูุงุช ู†ุตูŠุฉ
+Comment[az]=Mษ™tn fayllarฤฑnฤฑ redaktษ™ edin
+Comment[be]=ะ ัะดะฐะณะฐะฒะฐะฝัŒะฝะต ั‚ัะบัั‚ะฐะฒั‹ั… ั„ะฐะนะปะฐัž
+Comment[bg]=ะ ะตะดะฐะบั‚ะธั€ะฐะฝะต ะฝะฐ ั‚ะตะบัั‚ะพะฒะธ ั„ะฐะนะปะพะฒะต
+Comment[bn]=เฆŸเง‡เฆ•เงเฆธเงเฆŸ เฆซเฆพเฆ‡เฆฒ เฆเฆกเฆฟเฆŸ เฆ•เฆฐเงเฆจ
+Comment[bs]=Izmijeni tekstualne datoteke
+Comment[ca]=Edita fitxers de text
+Comment[cs]=รšprava textovรฝch souborลฏ
+Comment[cy]=Golygu ffeiliau testun
+Comment[da]=Redigรฉr tekstfiler
+Comment[de]=Textdateien bearbeiten
+Comment[el]=ฮ•ฯ€ฮตฮพฮตฯฮณฮฑฯƒฮฏฮฑ ฮฑฯฯ‡ฮตฮฏฯ‰ฮฝ ฮบฮตฮนฮผฮญฮฝฮฟฯ…
+Comment[en_CA]=Edit text files
+Comment[en_GB]=Edit text files
+Comment[es]=Edita archivos de texto
+Comment[et]=Redigeeri tekstifaile
+Comment[eu]=Editatu testu-fitxategiak
+Comment[fa]=ูˆŒุฑุงŒุด ูพุฑูˆู†ุฏู‡โ€Œู‡ุงŒ ู…ุชู†Œ
+Comment[fi]=Muokkaa tekstitiedostoja
+Comment[fr]=ร‰dite des fichiers texte
+Comment[ga]=Eagar comhad Tรฉacs
+Comment[gu]=เชฒเช–เชพเชฃ เชซเชพเช‡เชฒเซ‹เชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐ เช•เชฐเซ‹
+Comment[he]=ืขืจื•ืš ืงื‘ืฆื™ ื˜ืงืกื˜
+Comment[hi]=เคชเคพเค  เคซเคผเคพเค‡เคฒเฅ‡เค‚ เคธเค‚เคชเคพเคฆเคฟเคค เค•เคฐเฅ‡เค‚
+Comment[hr]=Ureฤ‘ivanje tekstualne datoteke
+Comment[hu]=Szรถvegfรกjlok szerkesztรฉse
+Comment[id]=Edit file teks
+Comment[it]=Modifica file di testo
+Comment[ja]=ใƒ†ใ‚ญใ‚นใƒˆใƒ•ใ‚กใ‚คใƒซใ‚’็ทจ้›†ใ—ใพใ™
+Comment[kn]=เฒชเฒ เณเฒฏ เฒ•เฒกเฒคเฒ—เฒณเฒจเณเฒจเณ เฒธเฒ‚เฒชเฒพเฒฆเฒฟเฒธเณ
+Comment[ko]=ํ…์ŠคํŠธ ํŒŒ์ผ์„ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค
+Comment[lt]=Redaguoti tekstines bylas
+Comment[lv]=Rediฤฃฤ“t teksta failus
+Comment[mk]=ะฃั€ะตะดะธ ั‚ะตะบัั‚ัƒะฐะปะฝะธ ั„ะฐั˜ะปะพะฒะธ
+Comment[ml]=เดตเดพเดšเด• เดฐเดšเดจเด•เดณเต เดคเดฟเดฐเตเดคเตเดคเตเด•
+Comment[mn]=ะขะตะบัั‚ ั„ะฐะนะป ะฑะพะปะพะฒัั€ัƒัƒะปะฐั…
+Comment[mr]=เค—เคฆเฅเคฏ เคซเคพเค‡เคฒ เคธเค‚เคชเคพเคฆเคฟเคค เค•เคฐเคพ
+Comment[ms]=Edit fail teks
+Comment[nb]=Rediger tekstfiler
+Comment[ne]=เคชเคพเค  เคซเคพเค‡เคฒเคฒเคพเคˆ เคธเค‚เคถเฅ‹เคงเคจ เค—เคฐเฅเคจเฅเคนเฅ‹เคธเฅ
+Comment[nl]=Tekstbestanden bewerken
+Comment[nn]=Rediger tekstfiler
+Comment[no]=Rediger tekstfiler
+Comment[or]=เฌชเฌพเฌ เญเฌฏ เฌซเฌพเฌ‡เฌฒเฌ—เญเฌกเฌผเฌฟเฌ•เญ เฌธเฌฎเญเฌชเฌพเฌฆเฌจ เฌ•เฌฐเฌจเญเฌคเญ
+Comment[pa]=เจชเจพเจ  เจซเจพเจ‡เจฒเจพเจ‚ เจธเฉฐเจชเจพเจฆเจจ
+Comment[pl]=Edytor plikรณw tekstowych
+Comment[pt]=Editar ficheiros de texto
+Comment[pt_BR]=Edite arquivos de texto
+Comment[ro]=Editare fiลŸiere text
+Comment[ru]=ะ ะตะดะฐะบั‚ะพั€ ั‚ะตะบัั‚ะพะฒั‹ั… ั„ะฐะนะปะพะฒ
+Comment[sk]=รšprava textovรฝch sรบborov
+Comment[sl]=Urejanje datotek z besedili
+Comment[sq]=Pรซrpuno files teksti
+Comment[sr]=ะ˜ะทะผะตะฝะธ ั‚ะตะบัั‚ัƒะฐะปะฝะต ะดะฐั‚ะพั‚ะตะบะต
+Comment[sr@Latn]=Izmeni tekstualne datoteke
+Comment[sv]=Redigera textfiler
+Comment[ta]=เฎ‰เฎฐเฏˆ เฎ•เฏ‹เฎชเฏเฎชเฏเฎ•เฎณเฏˆ เฎคเฏŠเฎ•เฏเฎ•เฏเฎ•เฎตเฏเฎฎเฏ
+Comment[th]=เนเธเน‰เน„เธ‚เนเธŸเน‰เธกเธ‚เน‰เธญเธ„เธงเธฒเธก
+Comment[tk]=Metin faรฝllary editle
+Comment[tr]=Metin dosyalarฤฑnฤฑ dรผzenle
+Comment[uk]=ะ ะตะดะฐะบั‚ะพั€ ั‚ะตะบัั‚ะพะฒะธั… ั„ะฐะนะปั–ะฒ
+Comment[vi]=Soแบกn thแบฃo tแบญp tin vฤƒn bแบฃn
+Comment[wa]=Asspougnรฎ des fitchรฎs tecses
+Comment[zh_CN]=็ผ–่พ‘ๆ–‡ๆœฌๆ–‡ไปถ
+Comment[zh_TW]=็ทจ่ผฏๆ–‡ๅญ—ๆช”
+TryExec=nvim
+Exec=nvim %F
+Terminal=true
+Type=Application
+Keywords=Text;editor;
+Icon=nvim
+Categories=Utility;TextEditor;
+StartupNotify=false
+MimeType=text/english;text/plain;text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-chdr;text/x-csrc;text/x-java;text/x-moc;text/x-pascal;text/x-tcl;text/x-tex;application/x-shellscript;text/x-c;text/x-c++;
diff --git a/runtime/nvim.png b/runtime/nvim.png
new file mode 100644
index 0000000000..dbc65ef363
--- /dev/null
+++ b/runtime/nvim.png
Binary files differ
diff --git a/runtime/optwin.vim b/runtime/optwin.vim
index bfcf4d5294..2e9f4723dd 100644
--- a/runtime/optwin.vim
+++ b/runtime/optwin.vim
@@ -1,20 +1,17 @@
" These commands create the option window.
"
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2016 Mar 19
+" Last Change: 2018 May 15
" If there already is an option window, jump to that one.
-if bufwinnr("option-window") > 0
- let s:thiswin = winnr()
- while 1
- if @% == "option-window"
+let buf = bufnr('option-window')
+if buf >= 0
+ let winids = win_findbuf(buf)
+ if len(winids) > 0
+ if win_gotoid(winids[0]) == 1
finish
endif
- wincmd w
- if s:thiswin == winnr()
- break
- endif
- endwhile
+ endif
endif
" Make sure the '<' flag is not included in 'cpoptions', otherwise <CR> would
@@ -125,11 +122,13 @@ fun! <SID>Update(lnum, line, local, thiswin)
endfun
" Reset 'title' and 'icon' to make it work faster.
+" Reset 'undolevels' to avoid undo'ing until the buffer is empty.
let s:old_title = &title
let s:old_icon = &icon
let s:old_sc = &sc
let s:old_ru = &ru
-set notitle noicon nosc noru
+let s:old_ul = &ul
+set notitle noicon nosc noru ul=-1
" If the current window is a help window, try finding a non-help window.
" Relies on syntax highlighting to be switched on.
@@ -141,8 +140,8 @@ while exists("b:current_syntax") && b:current_syntax == "help"
endif
endwhile
-" Open the window
-new option-window
+" Open the window. $OPTWIN_CMD is set to "tab" for ":tab options".
+exe $OPTWIN_CMD . ' new option-window'
setlocal ts=15 tw=0 noro buftype=nofile
" Insert help and a "set" command for each option.
@@ -326,7 +325,8 @@ call <SID>OptionL("scr")
call append("$", "scrolloff\tnumber of screen lines to show around the cursor")
call append("$", " \tset so=" . &so)
call append("$", "wrap\tlong lines wrap")
-call <SID>BinOptionG("wrap", &wrap)
+call append("$", "\t(local to window)")
+call <SID>BinOptionL("wrap")
call append("$", "linebreak\twrap long lines at a character in 'breakat'")
call append("$", "\t(local to window)")
call <SID>BinOptionL("lbr")
@@ -506,6 +506,14 @@ if has("cursorbind")
call append("$", "\t(local to window)")
call <SID>BinOptionL("crb")
endif
+if has("terminal")
+ call append("$", "termsize\tsize of a terminal window")
+ call append("$", "\t(local to window)")
+ call <SID>OptionL("tms")
+ call append("$", "termkey\tkey that precedes Vim commands in a terminal window")
+ call append("$", "\t(local to window)")
+ call <SID>OptionL("tk")
+endif
call <SID>Header("multiple tab pages")
@@ -524,8 +532,6 @@ endif
call <SID>Header("terminal")
-call append("$", "esckeys\trecognize keys that start with <Esc> in Insert mode")
-call <SID>BinOptionG("ek", &ek)
call append("$", "scrolljump\tminimal number of lines to scroll at a time")
call append("$", " \tset sj=" . &sj)
if has("gui") || has("msdos") || has("win32")
@@ -591,8 +597,6 @@ if has("gui")
call append("$", "toolbariconsize\tsize of toolbar icons")
call <SID>OptionG("tbis", &tbis)
endif
- call append("$", "guiheadroom\troom (in pixels) left above/below the window")
- call append("$", " \tset ghr=" . &ghr)
endif
if has("browse")
call append("$", "browsedir\t\"last\", \"buffer\" or \"current\": which directory used for the file browser")
@@ -610,11 +614,17 @@ if has("gui")
endif
call append("$", "linespace\tnumber of pixel lines to use between characters")
call append("$", " \tset lsp=" . &lsp)
- if has("balloon_eval")
+ if has("balloon_eval") || has("balloon_eval_term")
call append("$", "balloondelay\tdelay in milliseconds before a balloon may pop up")
call append("$", " \tset bdlay=" . &bdlay)
- call append("$", "ballooneval\twhether the balloon evaluation is to be used")
- call <SID>BinOptionG("beval", &beval)
+ if has("balloon_eval")
+ call append("$", "ballooneval\tuse balloon evaluation in the GUI")
+ call <SID>BinOptionG("beval", &beval)
+ endif
+ if has("balloon_eval_term")
+ call append("$", "balloonevalterm\tuse balloon evaluation in the terminal")
+ call <SID>BinOptionG("bevalterm", &beval)
+ endif
if has("eval")
call append("$", "balloonexpr\texpression to show in balloon eval")
call append("$", " \tset bexpr=" . &bexpr)
@@ -709,7 +719,11 @@ call <SID>OptionG("km", &km)
call <SID>Header("editing text")
call append("$", "undolevels\tmaximum number of changes that can be undone")
call append("$", "\t(global or local to buffer)")
-call append("$", " \tset ul=" . &ul)
+call append("$", " \tset ul=" . s:old_ul)
+call append("$", "undofile\tautomatically save and restore undo history")
+call <SID>BinOptionG("udf", &udf)
+call append("$", "undodir\tlist of directories for undo files")
+call <SID>OptionG("udir", &udir)
call append("$", "undoreload\tmaximum number lines to save for undo on a buffer reload")
call append("$", " \tset ur=" . &ur)
call append("$", "modified\tchanges have been made and not written to a file")
@@ -751,6 +765,10 @@ if has("insert_expand")
call <SID>OptionG("cot", &cot)
call append("$", "pumheight\tmaximum height of the popup menu")
call <SID>OptionG("ph", &ph)
+ if exists("&pw")
+ call append("$", "pumwidth\tminimum width of the popup menu")
+ call <SID>OptionG("pw", &pw)
+ endif
call append("$", "completefunc\tuser defined function for Insert mode completion")
call append("$", "\t(local to buffer)")
call <SID>OptionL("cfu")
@@ -887,7 +905,7 @@ if has("folding")
call append("$", "foldmarker\tmarkers used when 'foldmethod' is \"marker\"")
call append("$", "\t(local to window)")
call <SID>OptionL("fmr")
- call append("$", "foldnestmax\tmaximum fold depth for when 'foldmethod is \"indent\" or \"syntax\"")
+ call append("$", "foldnestmax\tmaximum fold depth for when 'foldmethod' is \"indent\" or \"syntax\"")
call append("$", "\t(local to window)")
call <SID>OptionL("fdn")
endif
@@ -988,10 +1006,6 @@ call append("$", "updatecount\tnumber of characters typed to cause a swap file u
call append("$", " \tset uc=" . &uc)
call append("$", "updatetime\ttime in msec after which the swap file will be updated")
call append("$", " \tset ut=" . &ut)
-call append("$", "maxmem\tmaximum amount of memory in Kbyte used for one buffer")
-call append("$", " \tset mm=" . &mm)
-call append("$", "maxmemtot\tmaximum amount of memory in Kbyte used for all buffers")
-call append("$", " \tset mmt=" . &mmt)
call <SID>Header("command line editing")
@@ -1032,10 +1046,6 @@ if has("vertsplit")
call append("$", "cmdwinheight\theight of the command-line window")
call <SID>OptionG("cwh", &cwh)
endif
-call append("$", "undofile\tautomatically save and restore undo history")
-call <SID>BinOptionG("udf", &udf)
-call append("$", "undodir\tlist of directories for undo files")
-call <SID>OptionG("udir", &udir)
call <SID>Header("executing external commands")
@@ -1083,6 +1093,9 @@ if has("quickfix")
call <SID>OptionG("gp", &gp)
call append("$", "grepformat\tlist of formats for output of 'grepprg'")
call <SID>OptionG("gfm", &gfm)
+ call append("$", "makeencoding\tencoding of the \":make\" and \":grep\" output")
+ call append("$", "\t(global or local to buffer)")
+ call <SID>OptionG("menc", &menc)
endif
@@ -1150,8 +1163,8 @@ endif
if has("langmap")
call append("$", "langmap\tlist of characters that are translated in Normal mode")
call <SID>OptionG("lmap", &lmap)
- call append("$", "langnoremap\tdon't apply 'langmap' to mapped characters")
- call <SID>BinOptionG("lnr", &lnr)
+ call append("$", "langremap\tapply 'langmap' to mapped characters")
+ call <SID>BinOptionG("lrm", &lrm)
endif
if has("xim")
call append("$", "imdisable\twhen set never use IM; overrules following IM options")
@@ -1195,6 +1208,8 @@ if has("multi_byte")
endif
call append("$", "ambiwidth\twidth of ambiguous width characters")
call <SID>OptionG("ambw", &ambw)
+ call append("$", "emoji\temoji characters are full width")
+ call <SID>BinOptionG("emo", &emo)
endif
@@ -1248,6 +1263,9 @@ call append("$", "\t(local to buffer)")
call <SID>BinOptionL("bl")
call append("$", "debug\tset to \"msg\" to see all error messages")
call append("$", " \tset debug=" . &debug)
+call append("$", "signcolumn\twhether to show the signcolumn")
+call append("$", "\t(local to window)")
+call <SID>OptionL("scl")
set cpo&vim
@@ -1271,6 +1289,16 @@ if has("syntax")
hi link optwinComment Comment
endif
endif
+if exists("&mzschemedll")
+ call append("$", "mzschemedll\tname of the Tcl dynamic library")
+ call <SID>OptionG("mzschemedll", &mzschemedll)
+ call append("$", "mzschemegcdll\tname of the Tcl GC dynamic library")
+ call <SID>OptionG("mzschemegcdll", &mzschemegcdll)
+endif
+if has('pythonx')
+ call append("$", "pyxversion\twhether to use Python 2 or 3")
+ call append("$", " \tset pyx=" . &wd)
+endif
" Install autocommands to enable mappings in option-window
noremap <silent> <buffer> <CR> <C-\><C-N>:call <SID>CR()<CR>
@@ -1304,6 +1332,7 @@ let &icon = s:old_icon
let &ru = s:old_ru
let &sc = s:old_sc
let &cpo = s:cpo_save
-unlet s:old_title s:old_icon s:old_ru s:old_sc s:cpo_save s:idx s:lnum
+let &ul = s:old_ul
+unlet s:old_title s:old_icon s:old_ru s:old_sc s:cpo_save s:idx s:lnum s:old_ul
" vim: ts=8 sw=2 sts=2
diff --git a/runtime/pack/dist/opt/cfilter/plugin/cfilter.vim b/runtime/pack/dist/opt/cfilter/plugin/cfilter.vim
new file mode 100644
index 0000000000..7a6464fc98
--- /dev/null
+++ b/runtime/pack/dist/opt/cfilter/plugin/cfilter.vim
@@ -0,0 +1,43 @@
+" 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
+"
+" Commands to filter the quickfix list:
+" :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}
+" Same as :Cfilter but operates on the current location list.
+"
+if exists("loaded_cfilter")
+ finish
+endif
+let loaded_cfilter = 1
+
+func s:Qf_filter(qf, pat, bang)
+ if a:qf
+ let Xgetlist = function('getqflist')
+ let Xsetlist = function('setqflist')
+ let cmd = ':Cfilter' . a:bang
+ else
+ let Xgetlist = function('getloclist', [0])
+ let Xsetlist = function('setloclist', [0])
+ let cmd = ':Lfilter' . a:bang
+ endif
+
+ if a:bang == '!'
+ let cond = 'v:val.text !~# a:pat && bufname(v:val.bufnr) !~# a:pat'
+ else
+ let cond = 'v:val.text =~# a:pat || bufname(v:val.bufnr) =~# a:pat'
+ endif
+
+ let items = filter(Xgetlist(), cond)
+ let title = cmd . ' ' . a:pat
+ call Xsetlist([], ' ', {'title' : title, 'items' : items})
+endfunc
+
+com! -nargs=+ -bang Cfilter call s:Qf_filter(1, <q-args>, <q-bang>)
+com! -nargs=+ -bang Lfilter call s:Qf_filter(0, <q-args>, <q-bang>)
diff --git a/runtime/pack/dist/opt/justify/plugin/justify.vim b/runtime/pack/dist/opt/justify/plugin/justify.vim
new file mode 100644
index 0000000000..4ef3bf95fa
--- /dev/null
+++ b/runtime/pack/dist/opt/justify/plugin/justify.vim
@@ -0,0 +1,316 @@
+" Function to left and right align text.
+"
+" Written by: Preben "Peppe" Guldberg <c928400@student.dtu.dk>
+" Created: 980806 14:13 (or around that time anyway)
+" Revised: 001103 00:36 (See "Revisions" below)
+
+
+" function Justify( [ textwidth [, maxspaces [, indent] ] ] )
+"
+" Justify() will left and right align a line by filling in an
+" appropriate amount of spaces. Extra spaces are added to existing
+" spaces starting from the right side of the line. As an example, the
+" following documentation has been justified.
+"
+" The function takes the following arguments:
+
+" textwidth argument
+" ------------------
+" If not specified, the value of the 'textwidth' option is used. If
+" 'textwidth' is zero a value of 80 is used.
+"
+" Additionally the arguments 'tw' and '' are accepted. The value of
+" 'textwidth' will be used. These are handy, if you just want to specify
+" the maxspaces argument.
+
+" maxspaces argument
+" ------------------
+" If specified, alignment will only be done, if the longest space run
+" after alignment is no longer than maxspaces.
+"
+" An argument of '' is accepted, should the user like to specify all
+" arguments.
+"
+" To aid user defined commands, negative values are accepted aswell.
+" Using a negative value specifies the default behaviour: any length of
+" space runs will be used to justify the text.
+
+" indent argument
+" ---------------
+" This argument specifies how a line should be indented. The default is
+" to keep the current indentation.
+"
+" Negative values: Keep current amount of leading whitespace.
+" Positive values: Indent all lines with leading whitespace using this
+" amount of whitespace.
+"
+" Note that the value 0, needs to be quoted as a string. This value
+" leads to a left flushed text.
+"
+" Additionally units of 'shiftwidth'/'sw' and 'tabstop'/'ts' may be
+" added. In this case, if the value of indent is positive, the amount of
+" whitespace to be added will be multiplied by the value of the
+" 'shiftwidth' and 'tabstop' settings. If these units are used, the
+" argument must be given as a string, eg. Justify('','','2sw').
+"
+" If the values of 'sw' or 'tw' are negative, they are treated as if
+" they were 0, which means that the text is flushed left. There is no
+" check if a negative number prefix is used to change the sign of a
+" negative 'sw' or 'ts' value.
+"
+" As with the other arguments, '' may be used to get the default
+" behaviour.
+
+
+" Notes:
+"
+" If the line, adjusted for space runs and leading/trailing whitespace,
+" is wider than the used textwidth, the line will be left untouched (no
+" whitespace removed). This should be equivalent to the behaviour of
+" :left, :right and :center.
+"
+" If the resulting line is shorter than the used textwidth it is left
+" untouched.
+"
+" All space runs in the line are truncated before the alignment is
+" carried out.
+"
+" If you have set 'noexpandtab', :retab! is used to replace space runs
+" with whitespace using the value of 'tabstop'. This should be
+" conformant with :left, :right and :center.
+"
+" If joinspaces is set, an extra space is added after '.', '?' and '!'.
+" If 'cpooptions' include 'j', extra space is only added after '.'.
+" (This may on occasion conflict with maxspaces.)
+
+
+" Related mappings:
+"
+" Mappings that will align text using the current text width, using at
+" most four spaces in a space run and keeping current indentation.
+nmap _j :%call Justify('tw',4)<CR>
+vmap _j :call Justify('tw',4)<CR>
+"
+" Mappings that will remove space runs and format lines (might be useful
+" prior to aligning the text).
+nmap ,gq :%s/\s\+/ /g<CR>gq1G
+vmap ,gq :s/\s\+/ /g<CR>gvgq
+
+
+" User defined command:
+"
+" The following is an ex command that works as a shortcut to the Justify
+" function. Arguments to Justify() can be added after the command.
+com! -range -nargs=* Justify <line1>,<line2>call Justify(<f-args>)
+"
+" The following commands are all equivalent:
+"
+" 1. Simplest use of Justify():
+" :call Justify()
+" :Justify
+"
+" 2. The _j mapping above via the ex command:
+" :%Justify tw 4
+"
+" 3. Justify visualised text at 72nd column while indenting all
+" previously indented text two shiftwidths
+" :'<,'>call Justify(72,'','2sw')
+" :'<,'>Justify 72 -1 2sw
+"
+" This documentation has been justified using the following command:
+":se et|kz|1;/^" function Justify(/+,'z-g/^" /s/^" //|call Justify(70,3)|s/^/" /
+
+" Revisions:
+" 001103: If 'joinspaces' was set, calculations could be wrong.
+" Tabs at start of line could also lead to errors.
+" Use setline() instead of "exec 's/foo/bar/' - safer.
+" Cleaned up the code a bit.
+"
+" Todo: Convert maps to the new script specific form
+
+" Error function
+function! Justify_error(message)
+ echohl Error
+ echo "Justify([tw, [maxspaces [, indent]]]): " . a:message
+ echohl None
+endfunction
+
+
+" Now for the real thing
+function! Justify(...) range
+
+ if a:0 > 3
+ call Justify_error("Too many arguments (max 3)")
+ return 1
+ endif
+
+ " Set textwidth (accept 'tw' and '' as arguments)
+ if a:0 >= 1
+ if a:1 =~ '^\(tw\)\=$'
+ let tw = &tw
+ elseif a:1 =~ '^\d\+$'
+ let tw = a:1
+ else
+ call Justify_error("tw must be a number (>0), '' or 'tw'")
+ return 2
+ endif
+ else
+ let tw = &tw
+ endif
+ if tw == 0
+ let tw = 80
+ endif
+
+ " Set maximum number of spaces between WORDs
+ if a:0 >= 2
+ if a:2 == ''
+ let maxspaces = tw
+ elseif a:2 =~ '^-\d\+$'
+ let maxspaces = tw
+ elseif a:2 =~ '^\d\+$'
+ let maxspaces = a:2
+ else
+ call Justify_error("maxspaces must be a number or ''")
+ return 3
+ endif
+ else
+ let maxspaces = tw
+ endif
+ if maxspaces <= 1
+ call Justify_error("maxspaces should be larger than 1")
+ return 4
+ endif
+
+ " Set the indentation style (accept sw and ts units)
+ let indent_fix = ''
+ if a:0 >= 3
+ if (a:3 == '') || a:3 =~ '^-[1-9]\d*\(shiftwidth\|sw\|tabstop\|ts\)\=$'
+ let indent = -1
+ elseif a:3 =~ '^-\=0\(shiftwidth\|sw\|tabstop\|ts\)\=$'
+ let indent = 0
+ elseif a:3 =~ '^\d\+\(shiftwidth\|sw\|tabstop\|ts\)\=$'
+ let indent = substitute(a:3, '\D', '', 'g')
+ elseif a:3 =~ '^\(shiftwidth\|sw\|tabstop\|ts\)$'
+ let indent = 1
+ else
+ call Justify_error("indent: a number with 'sw'/'ts' unit")
+ return 5
+ endif
+ if indent >= 0
+ while indent > 0
+ let indent_fix = indent_fix . ' '
+ let indent = indent - 1
+ endwhile
+ let indent_sw = 0
+ if a:3 =~ '\(shiftwidth\|sw\)'
+ let indent_sw = &sw
+ elseif a:3 =~ '\(tabstop\|ts\)'
+ let indent_sw = &ts
+ endif
+ let indent_fix2 = ''
+ while indent_sw > 0
+ let indent_fix2 = indent_fix2 . indent_fix
+ let indent_sw = indent_sw - 1
+ endwhile
+ let indent_fix = indent_fix2
+ endif
+ else
+ let indent = -1
+ endif
+
+ " Avoid substitution reports
+ let save_report = &report
+ set report=1000000
+
+ " Check 'joinspaces' and 'cpo'
+ if &js == 1
+ if &cpo =~ 'j'
+ let join_str = '\(\. \)'
+ else
+ let join_str = '\([.!?!] \)'
+ endif
+ endif
+
+ let cur = a:firstline
+ while cur <= a:lastline
+
+ let str_orig = getline(cur)
+ let save_et = &et
+ set et
+ exec cur . "retab"
+ let &et = save_et
+ let str = getline(cur)
+
+ let indent_str = indent_fix
+ let indent_n = strlen(indent_str)
+ " Shall we remember the current indentation
+ if indent < 0
+ let indent_orig = matchstr(str_orig, '^\s*')
+ if strlen(indent_orig) > 0
+ let indent_str = indent_orig
+ let indent_n = strlen(matchstr(str, '^\s*'))
+ endif
+ endif
+
+ " Trim trailing, leading and running whitespace
+ let str = substitute(str, '\s\+$', '', '')
+ let str = substitute(str, '^\s\+', '', '')
+ let str = substitute(str, '\s\+', ' ', 'g')
+ let str_n = strdisplaywidth(str)
+
+ " Possible addition of space after punctuation
+ if exists("join_str")
+ let str = substitute(str, join_str, '\1 ', 'g')
+ endif
+ let join_n = strdisplaywidth(str) - str_n
+
+ " Can extraspaces be added?
+ " Note that str_n may be less than strlen(str) [joinspaces above]
+ if strdisplaywidth(str) <= tw - indent_n && str_n > 0
+ " How many spaces should be added
+ let s_add = tw - str_n - indent_n - join_n
+ let s_nr = strlen(substitute(str, '\S', '', 'g') ) - join_n
+ let s_dup = s_add / s_nr
+ let s_mod = s_add % s_nr
+
+ " Test if the changed line fits with tw
+ if 0 <= (str_n + (maxspaces - 1)*s_nr + indent_n) - tw
+
+ " Duplicate spaces
+ while s_dup > 0
+ let str = substitute(str, '\( \+\)', ' \1', 'g')
+ let s_dup = s_dup - 1
+ endwhile
+
+ " Add extra spaces from the end
+ while s_mod > 0
+ let str = substitute(str, '\(\(\s\+\S\+\)\{' . s_mod . '}\)$', ' \1', '')
+ let s_mod = s_mod - 1
+ endwhile
+
+ " Indent the line
+ if indent_n > 0
+ let str = substitute(str, '^', indent_str, '' )
+ endif
+
+ " Replace the line
+ call setline(cur, str)
+
+ " Convert to whitespace
+ if &et == 0
+ exec cur . 'retab!'
+ endif
+
+ endif " Change of line
+ endif " Possible change
+
+ let cur = cur + 1
+ endwhile
+
+ norm ^
+
+ let &report = save_report
+
+endfunction
+
+" EOF vim: tw=78 ts=8 sw=4 sts=4 noet ai
diff --git a/runtime/pack/dist/opt/shellmenu/plugin/shellmenu.vim b/runtime/pack/dist/opt/shellmenu/plugin/shellmenu.vim
new file mode 100644
index 0000000000..6175d1d9a6
--- /dev/null
+++ b/runtime/pack/dist/opt/shellmenu/plugin/shellmenu.vim
@@ -0,0 +1,94 @@
+" When you're writing shell scripts and you are in doubt which test to use,
+" which shell environment variables are defined, what the syntax of the case
+" statement is, and you need to invoke 'man sh'?
+"
+" Your problems are over now!
+"
+" Attached is a Vim script file for turning gvim into a shell script editor.
+" It may also be used as an example how to use menus in Vim.
+"
+" Written by: Lennart Schultz <les@dmi.min.dk>
+
+imenu Stmts.for for in do doneki kk0elli
+imenu Stmts.case case in ) ;; esacbki k0elli
+imenu Stmts.if if then fiki kk0elli
+imenu Stmts.if-else if then else fiki kki kk0elli
+imenu Stmts.elif elif then ki kk0elli
+imenu Stmts.while while do doneki kk0elli
+imenu Stmts.break break
+imenu Stmts.continue continue
+imenu Stmts.function () { }ki k0i
+imenu Stmts.return return
+imenu Stmts.return-true return 0
+imenu Stmts.return-false return 1
+imenu Stmts.exit exit
+imenu Stmts.shift shift
+imenu Stmts.trap trap
+imenu Test.existence [ -e ]hi
+imenu Test.existence - file [ -f ]hi
+imenu Test.existence - file (not empty) [ -s ]hi
+imenu Test.existence - directory [ -d ]hi
+imenu Test.existence - executable [ -x ]hi
+imenu Test.existence - readable [ -r ]hi
+imenu Test.existence - writable [ -w ]hi
+imenu Test.String is empty [ x = "x$" ]hhi
+imenu Test.String is not empty [ x != "x$" ]hhi
+imenu Test.Strings is equal [ "" = "" ]hhhhhhhi
+imenu Test.Strings is not equal [ "" != "" ]hhhhhhhhi
+imenu Test.Values is greater than [ -gt ]hhhhhhi
+imenu Test.Values is greater equal [ -ge ]hhhhhhi
+imenu Test.Values is equal [ -eq ]hhhhhhi
+imenu Test.Values is not equal [ -ne ]hhhhhhi
+imenu Test.Values is less than [ -lt ]hhhhhhi
+imenu Test.Values is less equal [ -le ]hhhhhhi
+imenu ParmSub.Substitute word if parm not set ${:-}hhi
+imenu ParmSub.Set parm to word if not set ${:=}hhi
+imenu ParmSub.Substitute word if parm set else nothing ${:+}hhi
+imenu ParmSub.If parm not set print word and exit ${:?}hhi
+imenu SpShVars.Number of positional parameters ${#}
+imenu SpShVars.All positional parameters (quoted spaces) ${*}
+imenu SpShVars.All positional parameters (unquoted spaces) ${@}
+imenu SpShVars.Flags set ${-}
+imenu SpShVars.Return code of last command ${?}
+imenu SpShVars.Process number of this shell ${$}
+imenu SpShVars.Process number of last background command ${!}
+imenu Environ.HOME ${HOME}
+imenu Environ.PATH ${PATH}
+imenu Environ.CDPATH ${CDPATH}
+imenu Environ.MAIL ${MAIL}
+imenu Environ.MAILCHECK ${MAILCHECK}
+imenu Environ.PS1 ${PS1}
+imenu Environ.PS2 ${PS2}
+imenu Environ.IFS ${IFS}
+imenu Environ.SHACCT ${SHACCT}
+imenu Environ.SHELL ${SHELL}
+imenu Environ.LC_CTYPE ${LC_CTYPE}
+imenu Environ.LC_MESSAGES ${LC_MESSAGES}
+imenu Builtins.cd cd
+imenu Builtins.echo echo
+imenu Builtins.eval eval
+imenu Builtins.exec exec
+imenu Builtins.export export
+imenu Builtins.getopts getopts
+imenu Builtins.hash hash
+imenu Builtins.newgrp newgrp
+imenu Builtins.pwd pwd
+imenu Builtins.read read
+imenu Builtins.readonly readonly
+imenu Builtins.return return
+imenu Builtins.times times
+imenu Builtins.type type
+imenu Builtins.umask umask
+imenu Builtins.wait wait
+imenu Set.set set
+imenu Set.unset unset
+imenu Set.mark modified or modified variables set -a
+imenu Set.exit when command returns non-zero exit code set -e
+imenu Set.Disable file name generation set -f
+imenu Set.remember function commands set -h
+imenu Set.All keyword arguments are placed in the environment set -k
+imenu Set.Read commands but do not execute them set -n
+imenu Set.Exit after reading and executing one command set -t
+imenu Set.Treat unset variables as an error when substituting set -u
+imenu Set.Print shell input lines as they are read set -v
+imenu Set.Print commands and their arguments as they are executed set -x
diff --git a/runtime/pack/dist/opt/swapmouse/plugin/swapmouse.vim b/runtime/pack/dist/opt/swapmouse/plugin/swapmouse.vim
new file mode 100644
index 0000000000..8b85be050b
--- /dev/null
+++ b/runtime/pack/dist/opt/swapmouse/plugin/swapmouse.vim
@@ -0,0 +1,22 @@
+" These macros swap the left and right mouse buttons (for left handed)
+" Don't forget to do ":set mouse=a" or the mouse won't work at all
+noremap <LeftMouse> <RightMouse>
+noremap <2-LeftMouse> <2-RightMouse>
+noremap <3-LeftMouse> <3-RightMouse>
+noremap <4-LeftMouse> <4-RightMouse>
+noremap <LeftDrag> <RightDrag>
+noremap <LeftRelease> <RightRelease>
+noremap <RightMouse> <LeftMouse>
+noremap <2-RightMouse> <2-LeftMouse>
+noremap <3-RightMouse> <3-LeftMouse>
+noremap <4-RightMouse> <4-LeftMouse>
+noremap <RightDrag> <LeftDrag>
+noremap <RightRelease> <LeftRelease>
+noremap g<LeftMouse> <C-RightMouse>
+noremap g<RightMouse> <C-LeftMouse>
+noremap! <LeftMouse> <RightMouse>
+noremap! <LeftDrag> <RightDrag>
+noremap! <LeftRelease> <RightRelease>
+noremap! <RightMouse> <LeftMouse>
+noremap! <RightDrag> <LeftDrag>
+noremap! <RightRelease> <LeftRelease>
diff --git a/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim b/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
new file mode 100644
index 0000000000..b002cad4c6
--- /dev/null
+++ b/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
@@ -0,0 +1,40 @@
+" Debugger commands.
+"
+" WORK IN PROGRESS - much doesn't work yet
+"
+" Open two terminal windows:
+" 1. run a pty, as with ":term NONE"
+" 2. run gdb, passing the pty
+" The current window is used to edit source code and follows gdb.
+"
+" Author: Bram Moolenaar
+" Copyright: Vim license applies
+
+" In case this gets loaded twice.
+if exists(':Termdebug')
+ finish
+endif
+
+command -nargs=* -complete=file Termdebug call s:StartDebug(<q-args>)
+
+if !exists('debugger')
+ let debugger = 'gdb'
+endif
+
+func s:StartDebug(cmd)
+ " Open a terminal window without a job, to run the debugged program
+ let s:ptybuf = term_start('NONE', {})
+ let pty = job_info(term_getjob(s:ptybuf))['tty']
+
+ " Open a terminal window to run the debugger.
+ let cmd = [g:debugger, '-tty', pty, a:cmd]
+ echomsg 'executing "' . join(cmd) . '"'
+ let gdbbuf = term_start(cmd, {
+ \ 'exit_cb': function('s:EndDebug'),
+ \ 'term_finish': 'close'
+ \ })
+endfunc
+
+func s:EndDebug(job, status)
+ exe 'bwipe! ' . s:ptybuf
+endfunc
diff --git a/runtime/pack/dist/opt/vimball/autoload/vimball.vim b/runtime/pack/dist/opt/vimball/autoload/vimball.vim
index 1af6b19c88..9c7dcbda0f 100644
--- a/runtime/pack/dist/opt/vimball/autoload/vimball.vim
+++ b/runtime/pack/dist/opt/vimball/autoload/vimball.vim
@@ -347,7 +347,7 @@ fun! vimball#Vimball(really,...)
" call Decho("exe tabn ".curtabnr)
exe "tabn ".curtabnr
- " set up help if its a doc/*.txt file
+ " set up help if it's a doc/*.txt file
" call Decho("didhelp<".didhelp."> fname<".fname.">")
if a:really && didhelp == "" && fname =~ 'doc/[^/]\+\.\(txt\|..x\)$'
let didhelp= substitute(fname,'^\(.*\<doc\)[/\\][^.]*\.\(txt\|..x\)$','\1','')
diff --git a/runtime/plugin/README.txt b/runtime/plugin/README.txt
deleted file mode 100644
index 37e22e57c0..0000000000
--- a/runtime/plugin/README.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-The plugin directory is for standard Vim plugin scripts.
-
-All files here ending in .vim will be sourced by Vim when it starts up.
-Look in the file for hints on how it can be disabled without deleting it.
-
-getscriptPlugin.vim get latest version of Vim scripts
-gzip.vim edit compressed files
-matchparen.vim highlight paren matching the one under the cursor
-netrwPlugin.vim edit files over a network and browse (remote) directories
-rrhelper.vim used for --remote-wait editing
-spellfile.vim download a spellfile when it's missing
-tarPlugin.vim edit (compressed) tar files
-tohtml.vim convert a file with syntax highlighting to HTML
-vimballPlugin.vim create and unpack .vba files
-zipPlugin.vim edit zip archives
-
-Note: the explorer.vim plugin is no longer here, the netrw.vim plugin has
-taken over browsing directories (also for remote directories).
-
diff --git a/runtime/plugin/gzip.vim b/runtime/plugin/gzip.vim
index edef149537..5e13b92d1e 100644
--- a/runtime/plugin/gzip.vim
+++ b/runtime/plugin/gzip.vim
@@ -1,6 +1,6 @@
" Vim plugin for editing compressed files.
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2010 Mar 10
+" Last Change: 2016 Oct 30
" Exit quickly when:
" - this plugin was already loaded
@@ -20,25 +20,33 @@ augroup gzip
"
" Set binary mode before reading the file.
" Use "gzip -d", gunzip isn't always available.
- autocmd BufReadPre,FileReadPre *.gz,*.bz2,*.Z,*.lzma,*.xz setlocal bin
+ autocmd BufReadPre,FileReadPre *.gz,*.bz2,*.Z,*.lzma,*.xz,*.lz,*.zst setlocal bin
autocmd BufReadPost,FileReadPost *.gz call gzip#read("gzip -dn")
autocmd BufReadPost,FileReadPost *.bz2 call gzip#read("bzip2 -d")
autocmd BufReadPost,FileReadPost *.Z call gzip#read("uncompress")
autocmd BufReadPost,FileReadPost *.lzma call gzip#read("lzma -d")
autocmd BufReadPost,FileReadPost *.xz call gzip#read("xz -d")
+ autocmd BufReadPost,FileReadPost *.lz call gzip#read("lzip -d")
+ autocmd BufReadPost,FileReadPost *.zst call gzip#read("zstd -d --rm")
autocmd BufWritePost,FileWritePost *.gz call gzip#write("gzip")
autocmd BufWritePost,FileWritePost *.bz2 call gzip#write("bzip2")
autocmd BufWritePost,FileWritePost *.Z call gzip#write("compress -f")
autocmd BufWritePost,FileWritePost *.lzma call gzip#write("lzma -z")
autocmd BufWritePost,FileWritePost *.xz call gzip#write("xz -z")
+ autocmd BufWritePost,FileWritePost *.lz call gzip#write("lzip")
+ autocmd BufWritePost,FileWritePost *.zst call gzip#write("zstd --rm")
autocmd FileAppendPre *.gz call gzip#appre("gzip -dn")
autocmd FileAppendPre *.bz2 call gzip#appre("bzip2 -d")
autocmd FileAppendPre *.Z call gzip#appre("uncompress")
autocmd FileAppendPre *.lzma call gzip#appre("lzma -d")
autocmd FileAppendPre *.xz call gzip#appre("xz -d")
+ autocmd FileAppendPre *.lz call gzip#appre("lzip -d")
+ autocmd FileAppendPre *.zst call gzip#appre("zstd -d --rm")
autocmd FileAppendPost *.gz call gzip#write("gzip")
autocmd FileAppendPost *.bz2 call gzip#write("bzip2")
autocmd FileAppendPost *.Z call gzip#write("compress -f")
autocmd FileAppendPost *.lzma call gzip#write("lzma -z")
autocmd FileAppendPost *.xz call gzip#write("xz -z")
+ autocmd FileAppendPost *.lz call gzip#write("lzip")
+ autocmd FileAppendPost *.zst call gzip#write("zstd --rm")
augroup END
diff --git a/runtime/plugin/health.vim b/runtime/plugin/health.vim
index db094a03a4..66ae8fb239 100644
--- a/runtime/plugin/health.vim
+++ b/runtime/plugin/health.vim
@@ -1 +1 @@
-command! -bang CheckHealth call health#check(<bang>0)
+autocmd CmdUndefined CheckHealth checkhealth
diff --git a/runtime/plugin/man.vim b/runtime/plugin/man.vim
index 8e5062a209..e18a5528bb 100644
--- a/runtime/plugin/man.vim
+++ b/runtime/plugin/man.vim
@@ -1,6 +1,15 @@
-if get(g:, 'loaded_man', 0)
+" Maintainer: Anmol Sethi <anmol@aubble.com>
+
+if exists('g:loaded_man')
finish
endif
let g:loaded_man = 1
-command! -count=0 -nargs=+ Man call man#get_page(<count>, <f-args>)
+command! -bang -bar -range=0 -complete=customlist,man#complete -nargs=* Man
+ \ if <bang>0 | set ft=man |
+ \ else | call man#open_page(v:count, v:count1, <q-mods>, <f-args>) | endif
+
+augroup man
+ autocmd!
+ autocmd BufReadCmd man://* call man#read_page(matchstr(expand('<amatch>'), 'man://\zs.*'))
+augroup END
diff --git a/runtime/plugin/matchit.vim b/runtime/plugin/matchit.vim
index 70867b1f93..c160522f90 100644
--- a/runtime/plugin/matchit.vim
+++ b/runtime/plugin/matchit.vim
@@ -1,7 +1,10 @@
" matchit.vim: (global plugin) Extended "%" matching
-" Last Change: Fri Jan 25 10:00 AM 2008 EST
+" Last Change: 2018 Jul 3 by Christian Brabandt
" Maintainer: Benji Fisher PhD <benji@member.AMS.org>
-" Version: 1.13.2, for Vim 6.3+
+" Version: 1.13.3, for Vim 6.3+
+" Fix from Tommy Allen included.
+" Fix from Fernando Torres included.
+" Improvement from Ken Takata included.
" URL: http://www.vim.org/script.php?script_id=39
" Documentation:
@@ -43,6 +46,7 @@ endif
let loaded_matchit = 1
let s:last_mps = ""
let s:last_words = ":"
+let s:patBR = ""
let s:save_cpo = &cpo
set cpo&vim
@@ -86,12 +90,15 @@ let s:notslash = '\\\@<!\%(\\\\\)*'
function! s:Match_wrapper(word, forward, mode) range
" In s:CleanUp(), :execute "set" restore_options .
- let restore_options = (&ic ? " " : " no") . "ignorecase"
- if exists("b:match_ignorecase")
+ let restore_options = ""
+ if exists("b:match_ignorecase") && b:match_ignorecase != &ic
+ let restore_options .= (&ic ? " " : " no") . "ignorecase"
let &ignorecase = b:match_ignorecase
endif
- let restore_options = " ve=" . &ve . restore_options
- set ve=
+ if &ve != ''
+ let restore_options = " ve=" . &ve . restore_options
+ set ve=
+ endif
" If this function was called from Visual mode, make sure that the cursor
" is at the correct end of the Visual range:
if a:mode == "v"
@@ -120,9 +127,8 @@ function! s:Match_wrapper(word, forward, mode) range
execute "let match_words =" b:match_words
endif
" Thanks to Preben "Peppe" Guldberg and Bram Moolenaar for this suggestion!
- if (match_words != s:last_words) || (&mps != s:last_mps) ||
- \ exists("b:match_debug")
- let s:last_words = match_words
+ if (match_words != s:last_words) || (&mps != s:last_mps)
+ \ || exists("b:match_debug")
let s:last_mps = &mps
" The next several lines were here before
" BF started messing with this script.
@@ -134,6 +140,7 @@ function! s:Match_wrapper(word, forward, mode) range
\ '\/\*:\*\/,#\s*if\%(def\)\=:#\s*else\>:#\s*elif\>:#\s*endif\>'
" s:all = pattern with all the keywords
let match_words = match_words . (strlen(match_words) ? "," : "") . default
+ let s:last_words = match_words
if match_words !~ s:notslash . '\\\d'
let s:do_BR = 0
let s:pat = match_words
@@ -147,6 +154,10 @@ function! s:Match_wrapper(word, forward, mode) range
if exists("b:match_debug")
let b:match_pat = s:pat
endif
+ " Reconstruct the version with unresolved backrefs.
+ let s:patBR = substitute(match_words.',',
+ \ s:notslash.'\zs[,:]*,[,:]*', ',', 'g')
+ let s:patBR = substitute(s:patBR, s:notslash.'\zs:\{2,}', ':', 'g')
endif
" Second step: set the following local variables:
@@ -191,14 +202,10 @@ function! s:Match_wrapper(word, forward, mode) range
" group = colon-separated list of patterns, one of which matches
" = ini:mid:fin or ini:fin
"
- " Reconstruct the version with unresolved backrefs.
- let patBR = substitute(match_words.',',
- \ s:notslash.'\zs[,:]*,[,:]*', ',', 'g')
- let patBR = substitute(patBR, s:notslash.'\zs:\{2,}', ':', 'g')
" Now, set group and groupBR to the matching group: 'if:endif' or
" 'while:endwhile' or whatever. A bit of a kluge: s:Choose() returns
" group . "," . groupBR, and we pick it apart.
- let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, patBR)
+ let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, s:patBR)
let i = matchend(group, s:notslash . ",")
let groupBR = strpart(group, i)
let group = strpart(group, 0, i-1)
@@ -254,26 +261,21 @@ function! s:Match_wrapper(word, forward, mode) range
" Fifth step: actually start moving the cursor and call searchpair().
" Later, :execute restore_cursor to get to the original screen.
- let restore_cursor = virtcol(".") . "|"
- normal! g0
- let restore_cursor = line(".") . "G" . virtcol(".") . "|zs" . restore_cursor
- normal! H
- let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor
- execute restore_cursor
+ let view = winsaveview()
call cursor(0, curcol + 1)
" normal! 0
" if curcol
" execute "normal!" . curcol . "l"
" endif
if skip =~ 'synID' && !(has("syntax") && exists("g:syntax_on"))
- let skip = "0"
+ let skip = '0'
else
execute "if " . skip . "| let skip = '0' | endif"
endif
let sp_return = searchpair(ini, mid, fin, flag, skip)
let final_position = "call cursor(" . line(".") . "," . col(".") . ")"
" Restore cursor position and original screen.
- execute restore_cursor
+ call winrestview(view)
normal! m'
if sp_return > 0
execute final_position
@@ -284,7 +286,9 @@ endfun
" Restore options and do some special handling for Operator-pending mode.
" The optional argument is the tail of the matching group.
fun! s:CleanUp(options, mode, startline, startcol, ...)
- execute "set" a:options
+ if strlen(a:options)
+ execute "set" a:options
+ endif
" Open folds, if appropriate.
if a:mode != "o"
if &foldopen =~ "percent"
@@ -634,10 +638,11 @@ endfun
" idea to give it its own matching patterns.
fun! s:MultiMatch(spflag, mode)
if !exists("b:match_words") || b:match_words == ""
- return ""
+ return {}
end
- let restore_options = (&ic ? "" : "no") . "ignorecase"
- if exists("b:match_ignorecase")
+ let restore_options = ""
+ if exists("b:match_ignorecase") && b:match_ignorecase != &ic
+ let restore_options .= (&ic ? " " : " no") . "ignorecase"
let &ignorecase = b:match_ignorecase
endif
let startline = line(".")
@@ -660,6 +665,7 @@ fun! s:MultiMatch(spflag, mode)
\ exists("b:match_debug")
let s:last_words = match_words
let s:last_mps = &mps
+ let match_words = match_words . (strlen(match_words) ? "," : "") . default
if match_words !~ s:notslash . '\\\d'
let s:do_BR = 0
let s:pat = match_words
@@ -667,8 +673,8 @@ fun! s:MultiMatch(spflag, mode)
let s:do_BR = 1
let s:pat = s:ParseWords(match_words)
endif
- let s:all = '\%(' . substitute(s:pat . (strlen(s:pat)?",":"") . default,
- \ '[,:]\+','\\|','g') . '\)'
+ let s:all = '\%(' . substitute(s:pat . (strlen(s:pat) ? "," : "") . default,
+ \ '[,:]\+', '\\|', 'g') . '\)'
if exists("b:match_debug")
let b:match_pat = s:pat
endif
@@ -694,15 +700,7 @@ fun! s:MultiMatch(spflag, mode)
let skip = 's:comment\|string'
endif
let skip = s:ParseSkip(skip)
- " let restore_cursor = line(".") . "G" . virtcol(".") . "|"
- " normal! H
- " let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor
- let restore_cursor = virtcol(".") . "|"
- normal! g0
- let restore_cursor = line(".") . "G" . virtcol(".") . "|zs" . restore_cursor
- normal! H
- let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor
- execute restore_cursor
+ let view = winsaveview()
" Third step: call searchpair().
" Replace '\('--but not '\\('--with '\%(' and ',' with '\|'.
@@ -710,24 +708,30 @@ fun! s:MultiMatch(spflag, mode)
let openpat = substitute(openpat, ',', '\\|', 'g')
let closepat = substitute(close, '\(\\\@<!\(\\\\\)*\)\@<=\\(', '\\%(', 'g')
let closepat = substitute(closepat, ',', '\\|', 'g')
+
if skip =~ 'synID' && !(has("syntax") && exists("g:syntax_on"))
let skip = '0'
else
- execute "if " . skip . "| let skip = '0' | endif"
+ try
+ execute "if " . skip . "| let skip = '0' | endif"
+ catch /^Vim\%((\a\+)\)\=:E363/
+ " We won't find anything, so skip searching, should keep Vim responsive.
+ return {}
+ endtry
endif
mark '
let level = v:count1
while level
if searchpair(openpat, '', closepat, a:spflag, skip) < 1
call s:CleanUp(restore_options, a:mode, startline, startcol)
- return ""
+ return {}
endif
let level = level - 1
endwhile
- " Restore options and return a string to restore the original position.
+ " Restore options and return view dict to restore the original position.
call s:CleanUp(restore_options, a:mode, startline, startcol)
- return restore_cursor
+ return view
endfun
" Search backwards for "if" or "while" or "<tag>" or ...
diff --git a/runtime/plugin/matchparen.vim b/runtime/plugin/matchparen.vim
index 5db1f64c78..65b9fe57bf 100644
--- a/runtime/plugin/matchparen.vim
+++ b/runtime/plugin/matchparen.vim
@@ -1,6 +1,6 @@
" Vim plugin for showing matching parens
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2016 Feb 16
+" Last Change: 2018 Jul 3
" Exit quickly when:
" - this plugin was already loaded (or disabled)
@@ -103,18 +103,28 @@ function! s:Highlight_Matching_Pair()
call cursor(c_lnum, c_col - before)
endif
- " Build an expression that detects whether the current cursor position is in
- " certain syntax types (string, comment, etc.), for use as searchpairpos()'s
- " skip argument.
- " We match "escape" for special items, such as lispEscapeSpecial.
- let s_skip = '!empty(filter(map(synstack(line("."), col(".")), ''synIDattr(v:val, "name")''), ' .
+ if !has("syntax") || !exists("g:syntax_on")
+ let s_skip = "0"
+ else
+ " Build an expression that detects whether the current cursor position is
+ " in certain syntax types (string, comment, etc.), for use as
+ " searchpairpos()'s skip argument.
+ " We match "escape" for special items, such as lispEscapeSpecial.
+ let s_skip = '!empty(filter(map(synstack(line("."), col(".")), ''synIDattr(v:val, "name")''), ' .
\ '''v:val =~? "string\\|character\\|singlequote\\|escape\\|comment"''))'
- " If executing the expression determines that the cursor is currently in
- " one of the syntax types, then we want searchpairpos() to find the pair
- " within those syntax types (i.e., not skip). Otherwise, the cursor is
- " outside of the syntax types and s_skip should keep its value so we skip any
- " matching pair inside the syntax types.
- execute 'if' s_skip '| let s_skip = 0 | endif'
+ " If executing the expression determines that the cursor is currently in
+ " one of the syntax types, then we want searchpairpos() to find the pair
+ " within those syntax types (i.e., not skip). Otherwise, the cursor is
+ " outside of the syntax types and s_skip should keep its value so we skip
+ " any matching pair inside the syntax types.
+ " Catch if this throws E363: pattern uses more memory than 'maxmempattern'.
+ try
+ execute 'if ' . s_skip . ' | let s_skip = "0" | endif'
+ catch /^Vim\%((\a\+)\)\=:E363/
+ " We won't find anything, so skip searching, should keep Vim responsive.
+ return
+ endtry
+ endif
" Limit the search to lines visible in the window.
let stoplinebottom = line('w$')
@@ -186,9 +196,23 @@ function! s:Highlight_Matching_Pair()
endfunction
" Define commands that will disable and enable the plugin.
-command! NoMatchParen windo silent! call matchdelete(3) | unlet! g:loaded_matchparen |
- \ au! matchparen
-command! DoMatchParen runtime plugin/matchparen.vim | windo doau CursorMoved
+command! DoMatchParen call s:DoMatchParen()
+command! NoMatchParen call s:NoMatchParen()
+
+func! s:NoMatchParen()
+ let w = winnr()
+ noau windo silent! call matchdelete(3)
+ unlet! g:loaded_matchparen
+ exe "noau ". w . "wincmd w"
+ au! matchparen
+endfunc
+
+func! s:DoMatchParen()
+ runtime plugin/matchparen.vim
+ let w = winnr()
+ silent windo doau CursorMoved
+ exe "noau ". w . "wincmd w"
+endfunc
let &cpo = s:cpo_save
unlet s:cpo_save
diff --git a/runtime/plugin/netrwPlugin.vim b/runtime/plugin/netrwPlugin.vim
index 69902b1f19..28e1c3ecf8 100644
--- a/runtime/plugin/netrwPlugin.vim
+++ b/runtime/plugin/netrwPlugin.vim
@@ -20,7 +20,7 @@
if &cp || exists("g:loaded_netrwPlugin")
finish
endif
-let g:loaded_netrwPlugin = "v155"
+let g:loaded_netrwPlugin = "v156"
let s:keepcpo = &cpo
set cpo&vim
"DechoRemOn
diff --git a/runtime/plugin/rplugin.vim b/runtime/plugin/rplugin.vim
index b4b03032b3..122d8d47f8 100644
--- a/runtime/plugin/rplugin.vim
+++ b/runtime/plugin/rplugin.vim
@@ -1,16 +1,65 @@
if exists('g:loaded_remote_plugins')
finish
endif
-let g:loaded_remote_plugins = 1
-
-command! UpdateRemotePlugins call remote#host#UpdateRemotePlugins()
-
-augroup nvim-rplugin
- autocmd!
- autocmd FuncUndefined *
- \ call remote#host#LoadRemotePluginsEvent(
- \ 'FuncUndefined', expand('<amatch>'))
- autocmd CmdUndefined *
- \ call remote#host#LoadRemotePluginsEvent(
- \ 'CmdUndefined', expand('<amatch>'))
-augroup END
+let g:loaded_remote_plugins = '/path/to/manifest'
+
+" Get the path to the rplugin manifest file.
+function! s:GetManifestPath() abort
+ let manifest_base = ''
+
+ if exists('$NVIM_RPLUGIN_MANIFEST')
+ return fnamemodify($NVIM_RPLUGIN_MANIFEST, ':p')
+ endif
+
+ let dest = stdpath('data')
+ if !empty(dest)
+ if !isdirectory(dest)
+ call mkdir(dest, 'p', 0700)
+ endif
+ let manifest_base = dest
+ endif
+
+ return manifest_base.'/rplugin.vim'
+endfunction
+
+" Old manifest file based on known script locations.
+function! s:GetOldManifestPaths() abort
+ let prefix = exists('$MYVIMRC')
+ \ ? $MYVIMRC
+ \ : matchstr(get(split(execute('scriptnames'), '\n'), 0, ''), '\f\+$')
+ let origpath = fnamemodify(expand(prefix, 1), ':h')
+ \.'/.'.fnamemodify(prefix, ':t').'-rplugin~'
+ if !has('win32')
+ return [origpath]
+ endif
+ " Windows used to use $APPLOCALDATA/nvim but stdpath('data') is
+ " $XDG_DATA_DIR/nvim-data
+ let pseudostdpath = exists('$LOCALAPPDATA') ? '$LOCALAPPDATA' : '~/AppData/Local'
+ let pseudostdpath = fnamemodify(expand(pseudostdpath), ':p')
+ return [substitute(pseudostdpath, '[/\\]\=$', '/', '') . 'nvim/rplugin.vim', origpath]
+endfunction
+
+function! s:GetManifest() abort
+ let manifest = s:GetManifestPath()
+ if !filereadable(manifest)
+ " Check if an old manifest file exists and move it to the new location.
+ for old_manifest in s:GetOldManifestPaths()
+ if filereadable(old_manifest)
+ call rename(old_manifest, manifest)
+ break
+ endif
+ endfor
+ endif
+ return manifest
+endfunction
+
+function! s:LoadRemotePlugins() abort
+ let g:loaded_remote_plugins = s:GetManifest()
+ if filereadable(g:loaded_remote_plugins)
+ execute 'source' fnameescape(g:loaded_remote_plugins)
+ endif
+endfunction
+
+command! -bar UpdateRemotePlugins call remote#host#UpdateRemotePlugins()
+
+call s:LoadRemotePlugins()
diff --git a/runtime/plugin/rrhelper.vim b/runtime/plugin/rrhelper.vim
deleted file mode 100644
index b09cbc10b9..0000000000
--- a/runtime/plugin/rrhelper.vim
+++ /dev/null
@@ -1,48 +0,0 @@
-" Vim plugin with helper function(s) for --remote-wait
-" Maintainer: Flemming Madsen <fma@cci.dk>
-" Last Change: 2008 May 29
-
-" Has this already been loaded?
-if exists("loaded_rrhelper") || !has("clientserver")
- finish
-endif
-let loaded_rrhelper = 1
-
-" Setup answers for a --remote-wait client who will assume
-" a SetupRemoteReplies() function in the command server
-
-function SetupRemoteReplies()
- let cnt = 0
- let max = argc()
-
- let id = expand("<client>")
- if id == 0
- return
- endif
- while cnt < max
- " Handle same file from more clients and file being more than once
- " on the command line by encoding this stuff in the group name
- let uniqueGroup = "RemoteReply_".id."_".cnt
-
- " Path separators are always forward slashes for the autocommand pattern.
- " Escape special characters with a backslash.
- let f = substitute(argv(cnt), '\\', '/', "g")
- if exists('*fnameescape')
- let f = fnameescape(f)
- else
- let f = escape(f, " \t\n*?[{`$\\%#'\"|!<")
- endif
- execute "augroup ".uniqueGroup
- execute "autocmd ".uniqueGroup." BufUnload ". f ." call DoRemoteReply('".id."', '".cnt."', '".uniqueGroup."', '". f ."')"
- let cnt = cnt + 1
- endwhile
- augroup END
-endfunc
-
-function DoRemoteReply(id, cnt, group, file)
- call server2client(a:id, a:cnt)
- execute 'autocmd! '.a:group.' BufUnload '.a:file
- execute 'augroup! '.a:group
-endfunc
-
-" vim: set sw=2 sts=2 :
diff --git a/runtime/plugin/tarPlugin.vim b/runtime/plugin/tarPlugin.vim
index 034cbe225a..6d9e6bd540 100644
--- a/runtime/plugin/tarPlugin.vim
+++ b/runtime/plugin/tarPlugin.vim
@@ -40,6 +40,7 @@ augroup tar
au BufReadCmd *.tar.bz2 call tar#Browse(expand("<amatch>"))
au BufReadCmd *.tar.Z call tar#Browse(expand("<amatch>"))
au BufReadCmd *.tgz call tar#Browse(expand("<amatch>"))
+ au BufReadCmd *.tbz call tar#Browse(expand("<amatch>"))
au BufReadCmd *.tar.lzma call tar#Browse(expand("<amatch>"))
au BufReadCmd *.tar.xz call tar#Browse(expand("<amatch>"))
au BufReadCmd *.txz call tar#Browse(expand("<amatch>"))
diff --git a/runtime/plugin/zipPlugin.vim b/runtime/plugin/zipPlugin.vim
index e9bd0dc4bd..c04d5344b1 100644
--- a/runtime/plugin/zipPlugin.vim
+++ b/runtime/plugin/zipPlugin.vim
@@ -1,9 +1,9 @@
" zipPlugin.vim: Handles browsing zipfiles
" PLUGIN PORTION
-" Date: Jun 07, 2013
+" Date: Sep 13, 2016
" Maintainer: Charles E Campbell <NdrOchip@ScampbellPfamily.AbizM-NOSPAM>
" License: Vim License (see vim's :help license)
-" Copyright: Copyright (C) 2005-2013 Charles E. Campbell {{{1
+" Copyright: Copyright (C) 2005-2016 Charles E. Campbell {{{1
" Permission is hereby granted to use and distribute this code,
" with or without modifications, provided that this copyright
" notice is copied with it. Like anything else that's free,
@@ -20,14 +20,14 @@
if &cp || exists("g:loaded_zipPlugin")
finish
endif
-let g:loaded_zipPlugin = "v27"
+let g:loaded_zipPlugin = "v28"
let s:keepcpo = &cpo
set cpo&vim
" ---------------------------------------------------------------------
" Options: {{{1
if !exists("g:zipPlugin_ext")
- let g:zipPlugin_ext= '*.zip,*.jar,*.xpi,*.ja,*.war,*.ear,*.celzip,*.oxt,*.kmz,*.wsz,*.xap,*.docx,*.docm,*.dotx,*.dotm,*.potx,*.potm,*.ppsx,*.ppsm,*.pptx,*.pptm,*.ppam,*.sldx,*.thmx,*.xlam,*.xlsx,*.xlsm,*.xlsb,*.xltx,*.xltm,*.xlam,*.crtx,*.vdw,*.glox,*.gcsx,*.gqsx'
+ let g:zipPlugin_ext='*.apk,*.celzip,*.crtx,*.docm,*.docx,*.dotm,*.dotx,*.ear,*.epub,*.gcsx,*.glox,*.gqsx,*.ja,*.jar,*.kmz,*.oxt,*.potm,*.potx,*.ppam,*.ppsm,*.ppsx,*.pptm,*.pptx,*.sldx,*.thmx,*.vdw,*.war,*.wsz,*.xap,*.xlam,*.xlam,*.xlsb,*.xlsm,*.xlsx,*.xltm,*.xltx,*.xpi,*.zip'
endif
" ---------------------------------------------------------------------
diff --git a/runtime/scripts.vim b/runtime/scripts.vim
index b62b0a5db8..ab66c0c0a1 100644
--- a/runtime/scripts.vim
+++ b/runtime/scripts.vim
@@ -1,11 +1,15 @@
" Vim support file to detect file types in scripts
"
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last change: 2014 Aug 24
+" Last change: 2018 Feb 03
" This file is called by an autocommand for every file that has just been
" loaded into a buffer. It checks if the type of file can be recognized by
" the file contents. The autocommand is in $VIMRUNTIME/filetype.vim.
+"
+" Note that the pattern matches are done with =~# to avoid the value of the
+" 'ignorecase' option making a difference. Where case is to be ignored use
+" =~? instead. Do not use =~ anywhere.
" Only do the rest when the FileType autocommand has not been triggered yet.
@@ -28,12 +32,12 @@ set cpo&vim
let s:line1 = getline(1)
-if s:line1 =~ "^#!"
+if s:line1 =~# "^#!"
" A script that starts with "#!".
" Check for a line like "#!/usr/bin/env VAR=val bash". Turn it into
" "#!/usr/bin/bash" to make matching easier.
- if s:line1 =~ '^#!\s*\S*\<env\s'
+ if s:line1 =~# '^#!\s*\S*\<env\s'
let s:line1 = substitute(s:line1, '\S\+=\S\+', '', 'g')
let s:line1 = substitute(s:line1, '\<env\s\+', '', '')
endif
@@ -44,11 +48,11 @@ if s:line1 =~ "^#!"
" "#!/usr/bin/env perl [path/args]"
" If there is no path use the first word: "#!perl [path/args]".
" Otherwise get the last word after a slash: "#!/usr/bin/perl [path/args]".
- if s:line1 =~ '^#!\s*\a:[/\\]'
+ if s:line1 =~# '^#!\s*\a:[/\\]'
let s:name = substitute(s:line1, '^#!.*[/\\]\(\i\+\).*', '\1', '')
- elseif s:line1 =~ '^#!.*\<env\>'
+ elseif s:line1 =~# '^#!.*\<env\>'
let s:name = substitute(s:line1, '^#!.*\<env\>\s\+\(\i\+\).*', '\1', '')
- elseif s:line1 =~ '^#!\s*[^/\\ ]*\>\([^/\\]\|$\)'
+ elseif s:line1 =~# '^#!\s*[^/\\ ]*\>\([^/\\]\|$\)'
let s:name = substitute(s:line1, '^#!\s*\([^/\\ ]*\>\).*', '\1', '')
else
let s:name = substitute(s:line1, '^#!\s*\S*[/\\]\(\i\+\).*', '\1', '')
@@ -56,106 +60,126 @@ if s:line1 =~ "^#!"
" tcl scripts may have #!/bin/sh in the first line and "exec wish" in the
" third line. Suggested by Steven Atkinson.
- if getline(3) =~ '^exec wish'
+ if getline(3) =~# '^exec wish'
let s:name = 'wish'
endif
" Bourne-like shell scripts: bash bash2 ksh ksh93 sh
- if s:name =~ '^\(bash\d*\|\|ksh\d*\|sh\)\>'
- call SetFileTypeSH(s:line1) " defined in filetype.vim
+ if s:name =~# '^\(bash\d*\|\|ksh\d*\|sh\)\>'
+ call dist#ft#SetFileTypeSH(s:line1) " defined in filetype.vim
" csh scripts
- elseif s:name =~ '^csh\>'
+ elseif s:name =~# '^csh\>'
if exists("g:filetype_csh")
- call SetFileTypeShell(g:filetype_csh)
+ call dist#ft#SetFileTypeShell(g:filetype_csh)
else
- call SetFileTypeShell("csh")
+ call dist#ft#SetFileTypeShell("csh")
endif
" tcsh scripts
- elseif s:name =~ '^tcsh\>'
- call SetFileTypeShell("tcsh")
+ elseif s:name =~# '^tcsh\>'
+ call dist#ft#SetFileTypeShell("tcsh")
" Z shell scripts
- elseif s:name =~ '^zsh\>'
+ elseif s:name =~# '^zsh\>'
set ft=zsh
" TCL scripts
- elseif s:name =~ '^\(tclsh\|wish\|expectk\|itclsh\|itkwish\)\>'
+ elseif s:name =~# '^\(tclsh\|wish\|expectk\|itclsh\|itkwish\)\>'
set ft=tcl
" Expect scripts
- elseif s:name =~ '^expect\>'
+ elseif s:name =~# '^expect\>'
set ft=expect
" Gnuplot scripts
- elseif s:name =~ '^gnuplot\>'
+ elseif s:name =~# '^gnuplot\>'
set ft=gnuplot
" Makefiles
- elseif s:name =~ 'make\>'
+ elseif s:name =~# 'make\>'
set ft=make
+ " Pike
+ elseif s:name =~# '^pike\%(\>\|[0-9]\)'
+ set ft=pike
+
" Lua
- elseif s:name =~ 'lua'
+ elseif s:name =~# 'lua'
set ft=lua
" Perl 6
- elseif s:name =~ 'perl6'
+ elseif s:name =~# 'perl6'
set ft=perl6
" Perl
- elseif s:name =~ 'perl'
+ elseif s:name =~# 'perl'
set ft=perl
" PHP
- elseif s:name =~ 'php'
+ elseif s:name =~# 'php'
set ft=php
" Python
- elseif s:name =~ 'python'
+ elseif s:name =~# 'python'
set ft=python
" Groovy
- elseif s:name =~ '^groovy\>'
+ elseif s:name =~# '^groovy\>'
set ft=groovy
" Ruby
- elseif s:name =~ 'ruby'
+ elseif s:name =~# 'ruby'
set ft=ruby
+ " JavaScript
+ elseif s:name =~# 'node\(js\)\=\>\|js\>' || s:name =~# 'rhino\>'
+ set ft=javascript
+
" BC calculator
- elseif s:name =~ '^bc\>'
+ elseif s:name =~# '^bc\>'
set ft=bc
" sed
- elseif s:name =~ 'sed\>'
+ elseif s:name =~# 'sed\>'
set ft=sed
" OCaml-scripts
- elseif s:name =~ 'ocaml'
+ elseif s:name =~# 'ocaml'
set ft=ocaml
" Awk scripts
- elseif s:name =~ 'awk\>'
+ elseif s:name =~# 'awk\>'
set ft=awk
" Website MetaLanguage
- elseif s:name =~ 'wml'
+ elseif s:name =~# 'wml'
set ft=wml
" Scheme scripts
- elseif s:name =~ 'scheme'
+ elseif s:name =~# 'scheme'
set ft=scheme
" CFEngine scripts
- elseif s:name =~ 'cfengine'
+ elseif s:name =~# 'cfengine'
set ft=cfengine
" Erlang scripts
- elseif s:name =~ 'escript'
+ elseif s:name =~# 'escript'
set ft=erlang
+ " Haskell
+ elseif s:name =~# 'haskell'
+ set ft=haskell
+
+ " Scala
+ elseif s:name =~# 'scala\>'
+ set ft=scala
+
+ " Clojure
+ elseif s:name =~# 'clojure'
+ set ft=clojure
+
endif
unlet s:name
@@ -168,28 +192,28 @@ else
let s:line5 = getline(5)
" Bourne-like shell scripts: sh ksh bash bash2
- if s:line1 =~ '^:$'
- call SetFileTypeSH(s:line1) " defined in filetype.vim
+ if s:line1 =~# '^:$'
+ call dist#ft#SetFileTypeSH(s:line1) " defined in filetype.vim
" Z shell scripts
- elseif s:line1 =~ '^#compdef\>' || s:line1 =~ '^#autoload\>' ||
- \ "\n".s:line1."\n".s:line2."\n".s:line3."\n".s:line4."\n".s:line5 =~ '\n\s*emulate\s\+\%(-[LR]\s\+\)\=[ckz]\=sh\>'
+ elseif s:line1 =~# '^#compdef\>' || s:line1 =~# '^#autoload\>' ||
+ \ "\n".s:line1."\n".s:line2."\n".s:line3."\n".s:line4."\n".s:line5 =~# '\n\s*emulate\s\+\%(-[LR]\s\+\)\=[ckz]\=sh\>'
set ft=zsh
" ELM Mail files
- elseif s:line1 =~ '^From \([a-zA-Z][a-zA-Z_0-9\.=-]*\(@[^ ]*\)\=\|-\) .* \(19\|20\)\d\d$'
+ elseif s:line1 =~# '^From \([a-zA-Z][a-zA-Z_0-9\.=-]*\(@[^ ]*\)\=\|-\) .* \(19\|20\)\d\d$'
set ft=mail
" Mason
- elseif s:line1 =~ '^<[%&].*>'
+ elseif s:line1 =~# '^<[%&].*>'
set ft=mason
" Vim scripts (must have '" vim' as the first line to trigger this)
- elseif s:line1 =~ '^" *[vV]im$'
+ elseif s:line1 =~# '^" *[vV]im$'
set ft=vim
" MOO
- elseif s:line1 =~ '^\*\* LambdaMOO Database, Format Version \%([1-3]\>\)\@!\d\+ \*\*$'
+ elseif s:line1 =~# '^\*\* LambdaMOO Database, Format Version \%([1-3]\>\)\@!\d\+ \*\*$'
set ft=moo
" Diff file:
@@ -203,137 +227,143 @@ else
" - "=== ", "--- ", "+++ " (bzr diff, common case)
" - "=== (removed|added|renamed|modified)" (bzr diff, alternative)
" - "# HG changeset patch" in first line (Mercurial export format)
- elseif s:line1 =~ '^\(diff\>\|Only in \|\d\+\(,\d\+\)\=[cda]\d\+\>\|# It was generated by makepatch \|Index:\s\+\f\+\r\=$\|===== \f\+ \d\+\.\d\+ vs edited\|==== //\f\+#\d\+\|# HG changeset patch\)'
- \ || (s:line1 =~ '^--- ' && s:line2 =~ '^+++ ')
- \ || (s:line1 =~ '^\* looking for ' && s:line2 =~ '^\* comparing to ')
- \ || (s:line1 =~ '^\*\*\* ' && s:line2 =~ '^--- ')
- \ || (s:line1 =~ '^=== ' && ((s:line2 =~ '^=\{66\}' && s:line3 =~ '^--- ' && s:line4 =~ '^+++') || (s:line2 =~ '^--- ' && s:line3 =~ '^+++ ')))
- \ || (s:line1 =~ '^=== \(removed\|added\|renamed\|modified\)')
+ elseif s:line1 =~# '^\(diff\>\|Only in \|\d\+\(,\d\+\)\=[cda]\d\+\>\|# It was generated by makepatch \|Index:\s\+\f\+\r\=$\|===== \f\+ \d\+\.\d\+ vs edited\|==== //\f\+#\d\+\|# HG changeset patch\)'
+ \ || (s:line1 =~# '^--- ' && s:line2 =~# '^+++ ')
+ \ || (s:line1 =~# '^\* looking for ' && s:line2 =~# '^\* comparing to ')
+ \ || (s:line1 =~# '^\*\*\* ' && s:line2 =~# '^--- ')
+ \ || (s:line1 =~# '^=== ' && ((s:line2 =~# '^=\{66\}' && s:line3 =~# '^--- ' && s:line4 =~# '^+++') || (s:line2 =~# '^--- ' && s:line3 =~# '^+++ ')))
+ \ || (s:line1 =~# '^=== \(removed\|added\|renamed\|modified\)')
set ft=diff
" PostScript Files (must have %!PS as the first line, like a2ps output)
- elseif s:line1 =~ '^%![ \t]*PS'
+ elseif s:line1 =~# '^%![ \t]*PS'
set ft=postscr
" M4 scripts: Guess there is a line that starts with "dnl".
- elseif s:line1 =~ '^\s*dnl\>'
- \ || s:line2 =~ '^\s*dnl\>'
- \ || s:line3 =~ '^\s*dnl\>'
- \ || s:line4 =~ '^\s*dnl\>'
- \ || s:line5 =~ '^\s*dnl\>'
+ elseif s:line1 =~# '^\s*dnl\>'
+ \ || s:line2 =~# '^\s*dnl\>'
+ \ || s:line3 =~# '^\s*dnl\>'
+ \ || s:line4 =~# '^\s*dnl\>'
+ \ || s:line5 =~# '^\s*dnl\>'
set ft=m4
+ " AmigaDos scripts
+ elseif $TERM == "amiga"
+ \ && (s:line1 =~# "^;" || s:line1 =~? '^\.bra')
+ set ft=amiga
+
" SiCAD scripts (must have procn or procd as the first line to trigger this)
elseif s:line1 =~? '^ *proc[nd] *$'
set ft=sicad
" Purify log files start with "**** Purify"
- elseif s:line1 =~ '^\*\*\*\* Purify'
+ elseif s:line1 =~# '^\*\*\*\* Purify'
set ft=purifylog
" XML
- elseif s:line1 =~ '<?\s*xml.*?>'
+ elseif s:line1 =~# '<?\s*xml.*?>'
set ft=xml
" XHTML (e.g.: PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN")
- elseif s:line1 =~ '\<DTD\s\+XHTML\s'
+ elseif s:line1 =~# '\<DTD\s\+XHTML\s'
set ft=xhtml
" HTML (e.g.: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN")
- elseif s:line1 =~? '\<DOCTYPE\s\+html\>'
+ " Avoid "doctype html", used by slim.
+ elseif s:line1 =~? '<!DOCTYPE\s\+html\>'
set ft=html
" PDF
- elseif s:line1 =~ '^%PDF-'
+ elseif s:line1 =~# '^%PDF-'
set ft=pdf
" XXD output
- elseif s:line1 =~ '^\x\{7}: \x\{2} \=\x\{2} \=\x\{2} \=\x\{2} '
+ elseif s:line1 =~# '^\x\{7}: \x\{2} \=\x\{2} \=\x\{2} \=\x\{2} '
set ft=xxd
" RCS/CVS log output
- elseif s:line1 =~ '^RCS file:' || s:line2 =~ '^RCS file:'
+ elseif s:line1 =~# '^RCS file:' || s:line2 =~# '^RCS file:'
set ft=rcslog
" CVS commit
- elseif s:line2 =~ '^CVS:' || getline("$") =~ '^CVS: '
+ elseif s:line2 =~# '^CVS:' || getline("$") =~# '^CVS: '
set ft=cvs
" Prescribe
- elseif s:line1 =~ '^!R!'
+ elseif s:line1 =~# '^!R!'
set ft=prescribe
" Send-pr
- elseif s:line1 =~ '^SEND-PR:'
+ elseif s:line1 =~# '^SEND-PR:'
set ft=sendpr
" SNNS files
- elseif s:line1 =~ '^SNNS network definition file'
+ elseif s:line1 =~# '^SNNS network definition file'
set ft=snnsnet
- elseif s:line1 =~ '^SNNS pattern definition file'
+ elseif s:line1 =~# '^SNNS pattern definition file'
set ft=snnspat
- elseif s:line1 =~ '^SNNS result file'
+ elseif s:line1 =~# '^SNNS result file'
set ft=snnsres
" Virata
- elseif s:line1 =~ '^%.\{-}[Vv]irata'
- \ || s:line2 =~ '^%.\{-}[Vv]irata'
- \ || s:line3 =~ '^%.\{-}[Vv]irata'
- \ || s:line4 =~ '^%.\{-}[Vv]irata'
- \ || s:line5 =~ '^%.\{-}[Vv]irata'
+ elseif s:line1 =~# '^%.\{-}[Vv]irata'
+ \ || s:line2 =~# '^%.\{-}[Vv]irata'
+ \ || s:line3 =~# '^%.\{-}[Vv]irata'
+ \ || s:line4 =~# '^%.\{-}[Vv]irata'
+ \ || s:line5 =~# '^%.\{-}[Vv]irata'
set ft=virata
" Strace
- elseif s:line1 =~ '^\(\[pid \d\+\] \)\=[0-9:.]* *execve(' || s:line1 =~ '^__libc_start_main'
+ elseif s:line1 =~# '[0-9:.]* *execve(' || s:line1 =~# '^__libc_start_main'
set ft=strace
" VSE JCL
- elseif s:line1 =~ '^\* $$ JOB\>' || s:line1 =~ '^// *JOB\>'
+ elseif s:line1 =~# '^\* $$ JOB\>' || s:line1 =~# '^// *JOB\>'
set ft=vsejcl
" TAK and SINDA
- elseif s:line4 =~ 'K & K Associates' || s:line2 =~ 'TAK 2000'
+ elseif s:line4 =~# 'K & K Associates' || s:line2 =~# 'TAK 2000'
set ft=takout
- elseif s:line3 =~ 'S Y S T E M S I M P R O V E D '
+ elseif s:line3 =~# 'S Y S T E M S I M P R O V E D '
set ft=sindaout
- elseif getline(6) =~ 'Run Date: '
+ elseif getline(6) =~# 'Run Date: '
set ft=takcmp
- elseif getline(9) =~ 'Node File 1'
+ elseif getline(9) =~# 'Node File 1'
set ft=sindacmp
" DNS zone files
- elseif s:line1.s:line2.s:line3.s:line4 =~ '^; <<>> DiG [0-9.]\+ <<>>\|BIND.*named\|$ORIGIN\|$TTL\|IN\s\+SOA'
+ elseif s:line1.s:line2.s:line3.s:line4 =~# '^; <<>> DiG [0-9.]\+.* <<>>\|$ORIGIN\|$TTL\|IN\s\+SOA'
set ft=bindzone
" BAAN
- elseif s:line1 =~ '|\*\{1,80}' && s:line2 =~ 'VRC '
- \ || s:line2 =~ '|\*\{1,80}' && s:line3 =~ 'VRC '
+ elseif s:line1 =~# '|\*\{1,80}' && s:line2 =~# 'VRC '
+ \ || s:line2 =~# '|\*\{1,80}' && s:line3 =~# 'VRC '
set ft=baan
" Valgrind
- elseif s:line1 =~ '^==\d\+== valgrind' || s:line3 =~ '^==\d\+== Using valgrind'
+ elseif s:line1 =~# '^==\d\+== valgrind' || s:line3 =~# '^==\d\+== Using valgrind'
set ft=valgrind
" Go docs
- elseif s:line1 =~ '^PACKAGE DOCUMENTATION$'
+ elseif s:line1 =~# '^PACKAGE DOCUMENTATION$'
set ft=godoc
" Renderman Interface Bytestream
- elseif s:line1 =~ '^##RenderMan'
+ elseif s:line1 =~# '^##RenderMan'
set ft=rib
" Scheme scripts
- elseif s:line1 =~ 'exec\s\+\S*scheme' || s:line2 =~ 'exec\s\+\S*scheme'
+ elseif s:line1 =~# 'exec\s\+\S*scheme' || s:line2 =~# 'exec\s\+\S*scheme'
set ft=scheme
" Git output
- elseif s:line1 =~ '^\(commit\|tree\|object\) \x\{40\}\>\|^tag \S\+$'
+ elseif s:line1 =~# '^\(commit\|tree\|object\) \x\{40\}\>\|^tag \S\+$'
set ft=git
" Gprof (gnu profiler)
elseif s:line1 == 'Flat profile:'
\ && s:line2 == ''
- \ && s:line3 =~ '^Each sample counts as .* seconds.$'
+ \ && s:line3 =~# '^Each sample counts as .* seconds.$'
set ft=gprof
" Erlang terms
@@ -344,18 +374,18 @@ else
" CVS diff
else
let s:lnum = 1
- while getline(s:lnum) =~ "^? " && s:lnum < line("$")
+ while getline(s:lnum) =~# "^? " && s:lnum < line("$")
let s:lnum += 1
endwhile
- if getline(s:lnum) =~ '^Index:\s\+\f\+$'
+ if getline(s:lnum) =~# '^Index:\s\+\f\+$'
set ft=diff
" locale input files: Formal Definitions of Cultural Conventions
" filename must be like en_US, fr_FR@euro or en_US.UTF-8
- elseif expand("%") =~ '\a\a_\a\a\($\|[.@]\)\|i18n$\|POSIX$\|translit_'
+ elseif expand("%") =~# '\a\a_\a\a\($\|[.@]\)\|i18n$\|POSIX$\|translit_'
let s:lnum = 1
while s:lnum < 100 && s:lnum < line("$")
- if getline(s:lnum) =~ '^LC_\(IDENTIFICATION\|CTYPE\|COLLATE\|MONETARY\|NUMERIC\|TIME\|MESSAGES\|PAPER\|TELEPHONE\|MEASUREMENT\|NAME\|ADDRESS\)$'
+ if getline(s:lnum) =~# '^LC_\(IDENTIFICATION\|CTYPE\|COLLATE\|MONETARY\|NUMERIC\|TIME\|MESSAGES\|PAPER\|TELEPHONE\|MEASUREMENT\|NAME\|ADDRESS\)$'
setf fdcc
break
endif
diff --git a/runtime/spell/en.utf-8.spl b/runtime/spell/en.utf-8.spl
new file mode 100644
index 0000000000..83b9b8f7c2
--- /dev/null
+++ b/runtime/spell/en.utf-8.spl
Binary files differ
diff --git a/runtime/synmenu.vim b/runtime/synmenu.vim
index 76f60131f2..6814c60e88 100644
--- a/runtime/synmenu.vim
+++ b/runtime/synmenu.vim
@@ -2,7 +2,7 @@
" This file is normally sourced from menu.vim.
"
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2014 Aug 13
+" Last Change: 2017 Oct 28
" Define the SetSyn function, used for the Syntax menu entries.
" Set 'filetype' and also 'syntax' if it is manually selected.
@@ -161,31 +161,31 @@ an 50.30.290 &Syntax.DE.Doxygen.C\ with\ doxygen :cal SetSyn("c.doxygen")<CR>
an 50.30.300 &Syntax.DE.Doxygen.C++\ with\ doxygen :cal SetSyn("cpp.doxygen")<CR>
an 50.30.310 &Syntax.DE.Doxygen.IDL\ with\ doxygen :cal SetSyn("idl.doxygen")<CR>
an 50.30.320 &Syntax.DE.Doxygen.Java\ with\ doxygen :cal SetSyn("java.doxygen")<CR>
-an 50.30.320 &Syntax.DE.Doxygen.DataScript\ with\ doxygen :cal SetSyn("datascript.doxygen")<CR>
-an 50.30.330 &Syntax.DE.Dracula :cal SetSyn("dracula")<CR>
-an 50.30.340 &Syntax.DE.DSSSL :cal SetSyn("dsl")<CR>
-an 50.30.350 &Syntax.DE.DTD :cal SetSyn("dtd")<CR>
-an 50.30.360 &Syntax.DE.DTML\ (Zope) :cal SetSyn("dtml")<CR>
-an 50.30.370 &Syntax.DE.DTrace :cal SetSyn("dtrace")<CR>
-an 50.30.380 &Syntax.DE.Dts/dtsi :cal SetSyn("dts")<CR>
-an 50.30.390 &Syntax.DE.Dylan.Dylan :cal SetSyn("dylan")<CR>
-an 50.30.400 &Syntax.DE.Dylan.Dylan\ interface :cal SetSyn("dylanintr")<CR>
-an 50.30.410 &Syntax.DE.Dylan.Dylan\ lid :cal SetSyn("dylanlid")<CR>
-an 50.30.430 &Syntax.DE.EDIF :cal SetSyn("edif")<CR>
-an 50.30.440 &Syntax.DE.Eiffel :cal SetSyn("eiffel")<CR>
-an 50.30.450 &Syntax.DE.Elinks\ config :cal SetSyn("elinks")<CR>
-an 50.30.460 &Syntax.DE.Elm\ filter\ rules :cal SetSyn("elmfilt")<CR>
-an 50.30.470 &Syntax.DE.Embedix\ Component\ Description :cal SetSyn("ecd")<CR>
-an 50.30.480 &Syntax.DE.ERicsson\ LANGuage :cal SetSyn("erlang")<CR>
-an 50.30.490 &Syntax.DE.ESMTP\ rc :cal SetSyn("esmtprc")<CR>
-an 50.30.500 &Syntax.DE.ESQL-C :cal SetSyn("esqlc")<CR>
-an 50.30.510 &Syntax.DE.Essbase\ script :cal SetSyn("csc")<CR>
-an 50.30.520 &Syntax.DE.Esterel :cal SetSyn("esterel")<CR>
-an 50.30.530 &Syntax.DE.Eterm\ config :cal SetSyn("eterm")<CR>
-an 50.30.540 &Syntax.DE.Eviews :cal SetSyn("eviews")<CR>
-an 50.30.550 &Syntax.DE.Exim\ conf :cal SetSyn("exim")<CR>
-an 50.30.560 &Syntax.DE.Expect :cal SetSyn("expect")<CR>
-an 50.30.570 &Syntax.DE.Exports :cal SetSyn("exports")<CR>
+an 50.30.330 &Syntax.DE.Doxygen.DataScript\ with\ doxygen :cal SetSyn("datascript.doxygen")<CR>
+an 50.30.340 &Syntax.DE.Dracula :cal SetSyn("dracula")<CR>
+an 50.30.350 &Syntax.DE.DSSSL :cal SetSyn("dsl")<CR>
+an 50.30.360 &Syntax.DE.DTD :cal SetSyn("dtd")<CR>
+an 50.30.370 &Syntax.DE.DTML\ (Zope) :cal SetSyn("dtml")<CR>
+an 50.30.380 &Syntax.DE.DTrace :cal SetSyn("dtrace")<CR>
+an 50.30.390 &Syntax.DE.Dts/dtsi :cal SetSyn("dts")<CR>
+an 50.30.400 &Syntax.DE.Dylan.Dylan :cal SetSyn("dylan")<CR>
+an 50.30.410 &Syntax.DE.Dylan.Dylan\ interface :cal SetSyn("dylanintr")<CR>
+an 50.30.420 &Syntax.DE.Dylan.Dylan\ lid :cal SetSyn("dylanlid")<CR>
+an 50.30.440 &Syntax.DE.EDIF :cal SetSyn("edif")<CR>
+an 50.30.450 &Syntax.DE.Eiffel :cal SetSyn("eiffel")<CR>
+an 50.30.460 &Syntax.DE.Elinks\ config :cal SetSyn("elinks")<CR>
+an 50.30.470 &Syntax.DE.Elm\ filter\ rules :cal SetSyn("elmfilt")<CR>
+an 50.30.480 &Syntax.DE.Embedix\ Component\ Description :cal SetSyn("ecd")<CR>
+an 50.30.490 &Syntax.DE.ERicsson\ LANGuage :cal SetSyn("erlang")<CR>
+an 50.30.500 &Syntax.DE.ESMTP\ rc :cal SetSyn("esmtprc")<CR>
+an 50.30.510 &Syntax.DE.ESQL-C :cal SetSyn("esqlc")<CR>
+an 50.30.520 &Syntax.DE.Essbase\ script :cal SetSyn("csc")<CR>
+an 50.30.530 &Syntax.DE.Esterel :cal SetSyn("esterel")<CR>
+an 50.30.540 &Syntax.DE.Eterm\ config :cal SetSyn("eterm")<CR>
+an 50.30.550 &Syntax.DE.Eviews :cal SetSyn("eviews")<CR>
+an 50.30.560 &Syntax.DE.Exim\ conf :cal SetSyn("exim")<CR>
+an 50.30.570 &Syntax.DE.Expect :cal SetSyn("expect")<CR>
+an 50.30.580 &Syntax.DE.Exports :cal SetSyn("exports")<CR>
an 50.40.100 &Syntax.FG.Falcon :cal SetSyn("falcon")<CR>
an 50.40.110 &Syntax.FG.Fantom :cal SetSyn("fan")<CR>
an 50.40.120 &Syntax.FG.Fetchmail :cal SetSyn("fetchmail")<CR>
@@ -327,7 +327,6 @@ an 50.70.270 &Syntax.M.Messages\ (/var/log) :cal SetSyn("messages")<CR>
an 50.70.280 &Syntax.M.Metafont :cal SetSyn("mf")<CR>
an 50.70.290 &Syntax.M.MetaPost :cal SetSyn("mp")<CR>
an 50.70.300 &Syntax.M.MGL :cal SetSyn("mgl")<CR>
-an 50.70.305 &Syntax.M.MIX :cal SetSyn("mix")<CR>
an 50.70.310 &Syntax.M.MMIX :cal SetSyn("mmix")<CR>
an 50.70.320 &Syntax.M.Modconf :cal SetSyn("modconf")<CR>
an 50.70.330 &Syntax.M.Model :cal SetSyn("model")<CR>
@@ -352,12 +351,13 @@ an 50.70.510 &Syntax.M.Muttrc :cal SetSyn("muttrc")<CR>
an 50.80.100 &Syntax.NO.Nanorc :cal SetSyn("nanorc")<CR>
an 50.80.110 &Syntax.NO.Nastran\ input/DMAP :cal SetSyn("nastran")<CR>
an 50.80.120 &Syntax.NO.Natural :cal SetSyn("natural")<CR>
-an 50.80.130 &Syntax.NO.Netrc :cal SetSyn("netrc")<CR>
-an 50.80.140 &Syntax.NO.Ninja :cal SetSyn("ninja")<CR>
-an 50.80.150 &Syntax.NO.Novell\ NCF\ batch :cal SetSyn("ncf")<CR>
-an 50.80.160 &Syntax.NO.Not\ Quite\ C\ (LEGO) :cal SetSyn("nqc")<CR>
-an 50.80.170 &Syntax.NO.Nroff :cal SetSyn("nroff")<CR>
-an 50.80.180 &Syntax.NO.NSIS\ script :cal SetSyn("nsis")<CR>
+an 50.80.130 &Syntax.NO.Neomuttrc :cal SetSyn("neomuttrc")<CR>
+an 50.80.140 &Syntax.NO.Netrc :cal SetSyn("netrc")<CR>
+an 50.80.150 &Syntax.NO.Ninja :cal SetSyn("ninja")<CR>
+an 50.80.160 &Syntax.NO.Novell\ NCF\ batch :cal SetSyn("ncf")<CR>
+an 50.80.170 &Syntax.NO.Not\ Quite\ C\ (LEGO) :cal SetSyn("nqc")<CR>
+an 50.80.180 &Syntax.NO.Nroff :cal SetSyn("nroff")<CR>
+an 50.80.190 &Syntax.NO.NSIS\ script :cal SetSyn("nsis")<CR>
an 50.80.200 &Syntax.NO.Obj\ 3D\ wavefront :cal SetSyn("obj")<CR>
an 50.80.210 &Syntax.NO.Objective\ C :cal SetSyn("objc")<CR>
an 50.80.220 &Syntax.NO.Objective\ C++ :cal SetSyn("objcpp")<CR>
@@ -605,11 +605,11 @@ an 50.150.430 &Syntax.WXYZ.Zimbu :cal SetSyn("zimbu")<CR>
an 50.195 &Syntax.-SEP1- <Nop>
-an <silent> 50.200 &Syntax.Set\ '&syntax'\ only :call <SID>Setsynonly()<CR>
+an <silent> 50.200 &Syntax.Set\ '&syntax'\ Only :call <SID>Setsynonly()<CR>
fun! s:Setsynonly()
let s:syntax_menu_synonly = 1
endfun
-an <silent> 50.202 &Syntax.Set\ '&filetype'\ too :call <SID>Nosynonly()<CR>
+an <silent> 50.202 &Syntax.Set\ '&filetype'\ Too :call <SID>Nosynonly()<CR>
fun! s:Nosynonly()
if exists("s:syntax_menu_synonly")
unlet s:syntax_menu_synonly
diff --git a/runtime/syntax/a2ps.vim b/runtime/syntax/a2ps.vim
index 2a87d62f90..afe3af1eed 100644
--- a/runtime/syntax/a2ps.vim
+++ b/runtime/syntax/a2ps.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: a2ps(1) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: a2ps(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/a65.vim b/runtime/syntax/a65.vim
index 94198e6a42..b232e826cd 100644
--- a/runtime/syntax/a65.vim
+++ b/runtime/syntax/a65.vim
@@ -1,13 +1,10 @@
" Vim syntax file
" Language: xa 6502 cross assembler
" Maintainer: Clemens Kirchgatterer <clemens@1541.org>
-" Last Change: 2014 Jan 05
+" Last Change: 2016 Aug 31
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -138,29 +135,19 @@ syn match a65End excludenl /end$/ contained
syn match a65Continue "\\$" contained
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_a65_syntax_inits")
- if version < 508
- let did_a65_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink a65Section Special
- HiLink a65Address Special
- HiLink a65Comment Comment
- HiLink a65PreProc PreProc
- HiLink a65Number Number
- HiLink a65String String
- HiLink a65Type Statement
- HiLink a65Opcode Type
- HiLink a65PC Error
- HiLink a65Todo Todo
- HiLink a65HiLo Number
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link a65Section Special
+hi def link a65Address Special
+hi def link a65Comment Comment
+hi def link a65PreProc PreProc
+hi def link a65Number Number
+hi def link a65String String
+hi def link a65Type Statement
+hi def link a65Opcode Type
+hi def link a65PC Error
+hi def link a65Todo Todo
+hi def link a65HiLo Number
+
let b:current_syntax = "a65"
diff --git a/runtime/syntax/abap.vim b/runtime/syntax/abap.vim
index 1d1f6afd0d..c2857a5f30 100644
--- a/runtime/syntax/abap.vim
+++ b/runtime/syntax/abap.vim
@@ -5,11 +5,8 @@
" Last Change: 2013 Jun 13
" Comment: Thanks to EPI-USE Labs for all your assistance. :)
-" For version < 6.0: Clear all syntax items
-" For version >= 6.0: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -43,11 +40,7 @@ syn match abapStringEscape contained "``"
syn match abapNumber "\-\=\<\d\+\>"
syn region abapHex matchgroup=abapHex start="X'" end="'"
-if version >= 600
- setlocal iskeyword=48-57,_,A-Z,a-z,/
-else
- set iskeyword=48-57,_,A-Z,a-z,/
-endif
+setlocal iskeyword=48-57,_,A-Z,a-z,/
syn match abapNamespace "\</\w\+/"
@@ -175,38 +168,28 @@ syn keyword abapTodo contained TODO NOTE
syn match abapTodo "\#EC\W\+\w\+"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_abap_syntax_inits")
- if version < 508
- let did_abap_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink abapError Error
- HiLink abapComment Comment
- HiLink abapInclude Include
- HiLink abapStatement Statement
- HiLink abapComplexStatement Statement
- HiLink abapSpecial Special
- HiLink abapNamespace Special
- HiLink abapSpecialTables Special
- HiLink abapSymbolOperator abapOperator
- HiLink abapOperator Operator
- HiLink abapCharString String
- HiLink abapString String
- HiLink abapFloat Float
- HiLink abapTypes Type
- HiLink abapSymbol Structure
- HiLink abapStructure Structure
- HiLink abapField Variable
- HiLink abapNumber Number
- HiLink abapHex Number
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link abapError Error
+hi def link abapComment Comment
+hi def link abapInclude Include
+hi def link abapStatement Statement
+hi def link abapComplexStatement Statement
+hi def link abapSpecial Special
+hi def link abapNamespace Special
+hi def link abapSpecialTables Special
+hi def link abapSymbolOperator abapOperator
+hi def link abapOperator Operator
+hi def link abapCharString String
+hi def link abapString String
+hi def link abapFloat Float
+hi def link abapTypes Type
+hi def link abapSymbol Structure
+hi def link abapStructure Structure
+hi def link abapField Variable
+hi def link abapNumber Number
+hi def link abapHex Number
+
let b:current_syntax = "abap"
diff --git a/runtime/syntax/abaqus.vim b/runtime/syntax/abaqus.vim
index cf4b0828fa..db2717f818 100644
--- a/runtime/syntax/abaqus.vim
+++ b/runtime/syntax/abaqus.vim
@@ -4,11 +4,8 @@
" Last Change: 2002 Feb 24
" Remark: Huge improvement in folding performance--see filetype plugin
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -25,24 +22,14 @@ syn match abaqusValue "=\s*[^,]*"lc=1 contained display
syn match abaqusBadLine "^\s\+\*.*" display
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_abaqus_syn_inits")
- if version < 508
- let did_abaqus_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default methods for highlighting. Can be overridden later
- HiLink abaqusComment Comment
- HiLink abaqusKeyword Statement
- HiLink abaqusParameter Identifier
- HiLink abaqusValue Constant
- HiLink abaqusBadLine Error
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+" The default methods for highlighting. Can be overridden later
+hi def link abaqusComment Comment
+hi def link abaqusKeyword Statement
+hi def link abaqusParameter Identifier
+hi def link abaqusValue Constant
+hi def link abaqusBadLine Error
+
let b:current_syntax = "abaqus"
diff --git a/runtime/syntax/abc.vim b/runtime/syntax/abc.vim
index 3dc098e730..1a7b3bf4be 100644
--- a/runtime/syntax/abc.vim
+++ b/runtime/syntax/abc.vim
@@ -4,11 +4,8 @@
" URL: http://perun.hscs.wmin.ac.uk/~jra/vim/syntax/abc.vim
" Last Change: 27th April 2001
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -36,28 +33,18 @@ syn match abcComment "%.*$"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_abc_syn_inits")
- if version < 508
- let did_abc_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
+
+hi def link abcComment Comment
+hi def link abcHeadField Type
+hi def link abcBodyField Special
+hi def link abcBar Statement
+hi def link abcTuple Statement
+hi def link abcBroken Statement
+hi def link abcTie Statement
+hi def link abcGuitarChord Identifier
+hi def link abcNote Constant
- HiLink abcComment Comment
- HiLink abcHeadField Type
- HiLink abcBodyField Special
- HiLink abcBar Statement
- HiLink abcTuple Statement
- HiLink abcBroken Statement
- HiLink abcTie Statement
- HiLink abcGuitarChord Identifier
- HiLink abcNote Constant
-
- delcommand HiLink
-endif
let b:current_syntax = "abc"
diff --git a/runtime/syntax/abel.vim b/runtime/syntax/abel.vim
index 05e8dac913..67d7e4f786 100644
--- a/runtime/syntax/abel.vim
+++ b/runtime/syntax/abel.vim
@@ -3,11 +3,8 @@
" Maintainer: John Cook <johncook3@gmail.com>
" Last Change: 2011 Dec 27
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -123,48 +120,38 @@ endif
syn sync minlines=1
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_abel_syn_inits")
- if version < 508
- let did_abel_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default highlighting.
- HiLink abelHeader abelStatement
- HiLink abelSection abelStatement
- HiLink abelDeclaration abelStatement
- HiLink abelLogicalOperator abelOperator
- HiLink abelRangeOperator abelOperator
- HiLink abelAlternateOperator abelOperator
- HiLink abelArithmeticOperator abelOperator
- HiLink abelRelationalOperator abelOperator
- HiLink abelAssignmentOperator abelOperator
- HiLink abelTruthTableOperator abelOperator
- HiLink abelSpecifier abelStatement
- HiLink abelOperator abelStatement
- HiLink abelStatement Statement
- HiLink abelIdentifier Identifier
- HiLink abelTypeId abelType
- HiLink abelTypeIdChar abelType
- HiLink abelType Type
- HiLink abelNumber abelString
- HiLink abelString String
- HiLink abelConstant Constant
- HiLink abelComment Comment
- HiLink abelExtension abelSpecial
- HiLink abelSpecialChar abelSpecial
- HiLink abelTypeIdEnd abelSpecial
- HiLink abelSpecial Special
- HiLink abelDirective PreProc
- HiLink abelTodo Todo
- HiLink abelError Error
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+" The default highlighting.
+hi def link abelHeader abelStatement
+hi def link abelSection abelStatement
+hi def link abelDeclaration abelStatement
+hi def link abelLogicalOperator abelOperator
+hi def link abelRangeOperator abelOperator
+hi def link abelAlternateOperator abelOperator
+hi def link abelArithmeticOperator abelOperator
+hi def link abelRelationalOperator abelOperator
+hi def link abelAssignmentOperator abelOperator
+hi def link abelTruthTableOperator abelOperator
+hi def link abelSpecifier abelStatement
+hi def link abelOperator abelStatement
+hi def link abelStatement Statement
+hi def link abelIdentifier Identifier
+hi def link abelTypeId abelType
+hi def link abelTypeIdChar abelType
+hi def link abelType Type
+hi def link abelNumber abelString
+hi def link abelString String
+hi def link abelConstant Constant
+hi def link abelComment Comment
+hi def link abelExtension abelSpecial
+hi def link abelSpecialChar abelSpecial
+hi def link abelTypeIdEnd abelSpecial
+hi def link abelSpecial Special
+hi def link abelDirective PreProc
+hi def link abelTodo Todo
+hi def link abelError Error
+
let b:current_syntax = "abel"
diff --git a/runtime/syntax/acedb.vim b/runtime/syntax/acedb.vim
index 114e4aba9e..2c2cd701b7 100644
--- a/runtime/syntax/acedb.vim
+++ b/runtime/syntax/acedb.vim
@@ -7,11 +7,8 @@
" Syntax file to handle all $ACEDB/wspec/*.wrm files, primarily models.wrm
" AceDB software is available from http://www.acedb.org
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -86,35 +83,25 @@ syn region acedbString start=/"/ end=/"/ skip=/\\"/ oneline
" Rest of syntax highlighting rules start here
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_acedb_syn_inits")
- if version < 508
- let did_acedb_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink acedbMagic Special
- HiLink acedbHyb Special
- HiLink acedbType Type
- HiLink acedbOption Type
- HiLink acedbSubclass Type
- HiLink acedbSubtag Include
- HiLink acedbFlag Include
- HiLink acedbTag Include
- HiLink acedbClass Todo
- HiLink acedbHelp Todo
- HiLink acedbXref Identifier
- HiLink acedbModifier Label
- HiLink acedbComment Comment
- HiLink acedbBlock ModeMsg
- HiLink acedbNumber Number
- HiLink acedbString String
+hi def link acedbMagic Special
+hi def link acedbHyb Special
+hi def link acedbType Type
+hi def link acedbOption Type
+hi def link acedbSubclass Type
+hi def link acedbSubtag Include
+hi def link acedbFlag Include
+hi def link acedbTag Include
+hi def link acedbClass Todo
+hi def link acedbHelp Todo
+hi def link acedbXref Identifier
+hi def link acedbModifier Label
+hi def link acedbComment Comment
+hi def link acedbBlock ModeMsg
+hi def link acedbNumber Number
+hi def link acedbString String
- delcommand HiLink
-endif
let b:current_syntax = "acedb"
diff --git a/runtime/syntax/aflex.vim b/runtime/syntax/aflex.vim
index 592c98e4f3..aa8b5f84fe 100644
--- a/runtime/syntax/aflex.vim
+++ b/runtime/syntax/aflex.vim
@@ -7,21 +7,14 @@
" Comment: Replaced sourcing c.vim file by ada.vim and rename lex*
" in aflex*
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" Read the Ada syntax to start with
-if version < 600
- so <sfile>:p:h/ada.vim
-else
- runtime! syntax/ada.vim
- unlet b:current_syntax
-endif
+runtime! syntax/ada.vim
+unlet b:current_syntax
" --- AfLex stuff ---
@@ -69,31 +62,20 @@ syn sync match aflexSyncPat groupthere aflexPatBlock "^<$"
syn sync match aflexSyncPat groupthere aflexPatBlock "^%%$"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-
-if version >= 508 || !exists("did_aflex_syntax_inits")
- if version < 508
- let did_aflex_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink aflexSlashQuote aflexPat
- HiLink aflexBrace aflexPat
- HiLink aflexAbbrvComment aflexPatComment
-
- HiLink aflexAbbrv SpecialChar
- HiLink aflexAbbrvRegExp Macro
- HiLink aflexCFunctions Function
- HiLink aflexMorePat SpecialChar
- HiLink aflexPat Function
- HiLink aflexPatComment Comment
- HiLink aflexPatString Function
- HiLink aflexPatTag Special
- HiLink aflexSep Delimiter
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+hi def link aflexSlashQuote aflexPat
+hi def link aflexBrace aflexPat
+hi def link aflexAbbrvComment aflexPatComment
+
+hi def link aflexAbbrv SpecialChar
+hi def link aflexAbbrvRegExp Macro
+hi def link aflexCFunctions Function
+hi def link aflexMorePat SpecialChar
+hi def link aflexPat Function
+hi def link aflexPatComment Comment
+hi def link aflexPatString Function
+hi def link aflexPatTag Special
+hi def link aflexSep Delimiter
let b:current_syntax = "aflex"
diff --git a/runtime/syntax/ahdl.vim b/runtime/syntax/ahdl.vim
index b1417c374d..664bd3837d 100644
--- a/runtime/syntax/ahdl.vim
+++ b/runtime/syntax/ahdl.vim
@@ -3,11 +3,8 @@
" Maintainer: John Cook <john.cook@kla-tencor.com>
" Last Change: 2001 Apr 25
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -66,29 +63,19 @@ syn match ahdlSpecialChar "[\[\]().,;]"
syn sync minlines=1
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_ahdl_syn_inits")
- if version < 508
- let did_ahdl_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default highlighting.
- HiLink ahdlNumber ahdlString
- HiLink ahdlMegafunction ahdlIdentifier
- HiLink ahdlSpecialChar SpecialChar
- HiLink ahdlKeyword Statement
- HiLink ahdlString String
- HiLink ahdlComment Comment
- HiLink ahdlIdentifier Identifier
- HiLink ahdlOperator Operator
- HiLink ahdlTodo Todo
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+" The default highlighting.
+hi def link ahdlNumber ahdlString
+hi def link ahdlMegafunction ahdlIdentifier
+hi def link ahdlSpecialChar SpecialChar
+hi def link ahdlKeyword Statement
+hi def link ahdlString String
+hi def link ahdlComment Comment
+hi def link ahdlIdentifier Identifier
+hi def link ahdlOperator Operator
+hi def link ahdlTodo Todo
+
let b:current_syntax = "ahdl"
" vim:ts=8
diff --git a/runtime/syntax/alsaconf.vim b/runtime/syntax/alsaconf.vim
index 8fd51f0ac4..143fcc0a2e 100644
--- a/runtime/syntax/alsaconf.vim
+++ b/runtime/syntax/alsaconf.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: alsaconf(8) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: alsaconf(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/amiga.vim b/runtime/syntax/amiga.vim
index 4ccab1950f..eab9f66169 100644
--- a/runtime/syntax/amiga.vim
+++ b/runtime/syntax/amiga.vim
@@ -1,15 +1,12 @@
" Vim syntax file
" Language: AmigaDos
" Maintainer: Charles E. Campbell <NdrOchipS@PcampbellAfamily.Mbiz>
-" Last Change: Oct 23, 2014
-" Version: 7
+" Last Change: Aug 31, 2016
+" Version: 9
" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_AMIGA
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -72,30 +69,20 @@ syn match amiComment ";.*$" contains=amiCommentGroup
syn sync lines=50
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_amiga_syn_inits")
- if version < 508
- let did_amiga_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink amiAlias Type
- HiLink amiComment Comment
- HiLink amiDev Type
- HiLink amiEcho String
- HiLink amiElse Statement
- HiLink amiError Error
- HiLink amiKey Statement
- HiLink amiNumber Number
- HiLink amiString String
- HiLink amiTest Special
-
- delcommand HiLink
-endif
+if !exists("skip_amiga_syntax_inits")
+
+ hi def link amiAlias Type
+ hi def link amiComment Comment
+ hi def link amiDev Type
+ hi def link amiEcho String
+ hi def link amiElse Statement
+ hi def link amiError Error
+ hi def link amiKey Statement
+ hi def link amiNumber Number
+ hi def link amiString String
+ hi def link amiTest Special
+endif
let b:current_syntax = "amiga"
" vim:ts=15
diff --git a/runtime/syntax/aml.vim b/runtime/syntax/aml.vim
index 7cb16f1c1f..46621edbe9 100644
--- a/runtime/syntax/aml.vim
+++ b/runtime/syntax/aml.vim
@@ -9,11 +9,8 @@
" of [], in order to avoid -read highlighted,
" or [quote] strings highlighted
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -123,35 +120,25 @@ syn region amlSkip matchgroup=amlOutput start="&typ" end="$" contains=amlVar
syn region amlSkip matchgroup=amlOutput start="&type" end="$" contains=amlVar
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_aml_syntax_inits")
- if version < 508
- let did_aml_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink amlComment Comment
- HiLink amlNumber Number
- HiLink amlQuote String
- HiLink amlVar Identifier
- HiLink amlVar2 Identifier
- HiLink amlFunction PreProc
- HiLink amlDir Statement
- HiLink amlDir2 Statement
- HiLink amlDirSym Statement
- HiLink amlOutput Statement
- HiLink amlArcCmd ModeMsg
- HiLink amlFormedCmd amlArcCmd
- HiLink amlTabCmd amlArcCmd
- HiLink amlInfoCmd amlArcCmd
- HiLink amlVtrCmd amlArcCmd
- HiLink amlFormed amlArcCmd
- HiLink amlTab amlArcCmd
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link amlComment Comment
+hi def link amlNumber Number
+hi def link amlQuote String
+hi def link amlVar Identifier
+hi def link amlVar2 Identifier
+hi def link amlFunction PreProc
+hi def link amlDir Statement
+hi def link amlDir2 Statement
+hi def link amlDirSym Statement
+hi def link amlOutput Statement
+hi def link amlArcCmd ModeMsg
+hi def link amlFormedCmd amlArcCmd
+hi def link amlTabCmd amlArcCmd
+hi def link amlInfoCmd amlArcCmd
+hi def link amlVtrCmd amlArcCmd
+hi def link amlFormed amlArcCmd
+hi def link amlTab amlArcCmd
+
let b:current_syntax = "aml"
diff --git a/runtime/syntax/ampl.vim b/runtime/syntax/ampl.vim
index 7f4dfa9942..ad78f7d729 100644
--- a/runtime/syntax/ampl.vim
+++ b/runtime/syntax/ampl.vim
@@ -3,9 +3,8 @@
" Last Change: 2003 May 11
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -115,33 +114,24 @@ syn keyword amplTodo contained TODO FIXME XXX
-if version >= 508 || !exists("did_ampl_syntax_inits")
- if version < 508
- let did_ampl_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- " The default methods for highlighting. Can be overridden later.
- HiLink amplEntityKeyword Keyword
- HiLink amplType Type
- HiLink amplStatement Statement
- HiLink amplOperators Operator
- HiLink amplBasicOperators Operator
- HiLink amplConditional Conditional
- HiLink amplRepeat Repeat
- HiLink amplStrings String
- HiLink amplNumerics Number
- HiLink amplSetFunction Function
- HiLink amplBuiltInFunction Function
- HiLink amplRandomGenerator Function
- HiLink amplComment Comment
- HiLink amplDotSuffix Special
- HiLink amplPiecewise Special
+" The default methods for highlighting. Can be overridden later.
+hi def link amplEntityKeyword Keyword
+hi def link amplType Type
+hi def link amplStatement Statement
+hi def link amplOperators Operator
+hi def link amplBasicOperators Operator
+hi def link amplConditional Conditional
+hi def link amplRepeat Repeat
+hi def link amplStrings String
+hi def link amplNumerics Number
+hi def link amplSetFunction Function
+hi def link amplBuiltInFunction Function
+hi def link amplRandomGenerator Function
+hi def link amplComment Comment
+hi def link amplDotSuffix Special
+hi def link amplPiecewise Special
- delcommand HiLink
-endif
let b:current_syntax = "ampl"
diff --git a/runtime/syntax/antlr.vim b/runtime/syntax/antlr.vim
index 19000293fb..9b0b061ae1 100644
--- a/runtime/syntax/antlr.vim
+++ b/runtime/syntax/antlr.vim
@@ -4,11 +4,8 @@
" LastChange: 02 May 2001
" Original: Comes from JavaCC.vim
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -18,12 +15,8 @@ endif
" Those files usually have the extension *.jj
" source the java.vim file
-if version < 600
- so <sfile>:p:h/java.vim
-else
- runtime! syntax/java.vim
- unlet b:current_syntax
-endif
+runtime! syntax/java.vim
+unlet b:current_syntax
"remove catching errors caused by wrong parenthesis (does not work in antlr
"files) (first define them in case they have not been defined in java)
@@ -53,17 +46,8 @@ syn match antlrSep "[|:]\|\.\."
syn keyword antlrActionToken TOKEN SKIP MORE SPECIAL_TOKEN
syn keyword antlrError DEBUG IGNORE_IN_BNF
-if version >= 508 || !exists("did_antlr_syntax_inits")
- if version < 508
- let did_antlr_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink antlrSep Statement
- HiLink antlrPackages Statement
- delcommand HiLink
-endif
+hi def link antlrSep Statement
+hi def link antlrPackages Statement
let b:current_syntax = "antlr"
diff --git a/runtime/syntax/apache.vim b/runtime/syntax/apache.vim
index 85cda4095a..e2315db0d7 100644
--- a/runtime/syntax/apache.vim
+++ b/runtime/syntax/apache.vim
@@ -9,13 +9,9 @@
" make it really linewise?
" + add `display' where appropriate
-" Setup
-if version >= 600
- if exists("b:current_syntax")
- finish
- endif
-else
- syntax clear
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
endif
syn case ignore
@@ -178,37 +174,28 @@ syn match apacheSection "<\/\=\(<IfVersion\)[^>]*>" contains=apacheAnything
syn keyword apacheDeclaration VirtualDocumentRoot VirtualDocumentRootIP VirtualScriptAlias VirtualScriptAliasIP
" Define the default highlighting
-if version >= 508 || !exists("did_apache_syntax_inits")
- if version < 508
- let did_apache_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink apacheAllowOverride apacheDeclaration
- HiLink apacheAllowOverrideValue apacheOption
- HiLink apacheAuthType apacheDeclaration
- HiLink apacheAuthTypeValue apacheOption
- HiLink apacheOptionOption apacheOption
- HiLink apacheDeclaration Function
- HiLink apacheAnything apacheOption
- HiLink apacheOption Number
- HiLink apacheComment Comment
- HiLink apacheFixme Todo
- HiLink apacheLimitSectionKeyword apacheLimitSection
- HiLink apacheLimitSection apacheSection
- HiLink apacheSection Label
- HiLink apacheMethodOption Type
- HiLink apacheAllowDeny Include
- HiLink apacheAllowDenyValue Identifier
- HiLink apacheOrder Special
- HiLink apacheOrderValue String
- HiLink apacheString String
- HiLink apacheError Error
- HiLink apacheUserID Number
+hi def link apacheAllowOverride apacheDeclaration
+hi def link apacheAllowOverrideValue apacheOption
+hi def link apacheAuthType apacheDeclaration
+hi def link apacheAuthTypeValue apacheOption
+hi def link apacheOptionOption apacheOption
+hi def link apacheDeclaration Function
+hi def link apacheAnything apacheOption
+hi def link apacheOption Number
+hi def link apacheComment Comment
+hi def link apacheFixme Todo
+hi def link apacheLimitSectionKeyword apacheLimitSection
+hi def link apacheLimitSection apacheSection
+hi def link apacheSection Label
+hi def link apacheMethodOption Type
+hi def link apacheAllowDeny Include
+hi def link apacheAllowDenyValue Identifier
+hi def link apacheOrder Special
+hi def link apacheOrderValue String
+hi def link apacheString String
+hi def link apacheError Error
+hi def link apacheUserID Number
- delcommand HiLink
-endif
let b:current_syntax = "apache"
diff --git a/runtime/syntax/apachestyle.vim b/runtime/syntax/apachestyle.vim
index 375fc70a9c..bd5c89d30f 100644
--- a/runtime/syntax/apachestyle.vim
+++ b/runtime/syntax/apachestyle.vim
@@ -1,8 +1,10 @@
" Vim syntax file
" Language: Apache-Style configuration files (proftpd.conf/apache.conf/..)
-" Maintainer: Christian Hammers <ch@westend.com>
-" URL: none
+" Maintainer: Ben RUBSON <ben.rubson@gmail.com>
+" Former Maintainer: Christian Hammers <ch@westend.com>
" ChangeLog:
+" 2017-12-17,ch
+" correctly detect comments
" 2001-05-04,ch
" adopted Vim 6.0 syntax style
" 1999-10-28,ch
@@ -20,18 +22,15 @@
" </SubSection>
" </Section>
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
syn case ignore
-syn match apComment /^\s*#.*$/
syn match apOption /^\s*[^ \t#<=]*/
+syn match apComment /^\s*#.*$/
"syn match apLastValue /[^ \t<=#]*$/ contains=apComment ugly
" tags
@@ -41,25 +40,15 @@ syn match apTagOption contained / [-\/_\.:*a-zA-Z0-9]\+/ms=s+1
syn match apTagError contained /[^>]</ms=s+1
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_apachestyle_syn_inits")
- if version < 508
- let did_apachestyle_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink apComment Comment
- HiLink apOption Keyword
- "HiLink apLastValue Identifier ugly?
- HiLink apTag Special
- HiLink apTagOption Identifier
- HiLink apTagError Error
+hi def link apComment Comment
+hi def link apOption Keyword
+"hi def link apLastValue Identifier ugly?
+hi def link apTag Special
+hi def link apTagOption Identifier
+hi def link apTagError Error
- delcommand HiLink
-endif
let b:current_syntax = "apachestyle"
" vim: ts=8
diff --git a/runtime/syntax/aptconf.vim b/runtime/syntax/aptconf.vim
index 7a31b2d15e..8cb14321e2 100644
--- a/runtime/syntax/aptconf.vim
+++ b/runtime/syntax/aptconf.vim
@@ -3,12 +3,9 @@
" Maintainer: Yann Amar <quidame@poivron.org>
" Last Change: 2015 Dec 22
-" For version 5.x: Clear all syntax items
-" For version 6.x and 7.x: Quit when a syntax file was already loaded
+" quit when a syntax file was already loaded
if !exists("main_syntax")
- if version < 600
- syntax clear
- elseif exists("b:current_syntax")
+ if exists("b:current_syntax")
finish
endif
let main_syntax = 'aptconf'
diff --git a/runtime/syntax/arch.vim b/runtime/syntax/arch.vim
index fa9c3f02c3..f9d095e443 100644
--- a/runtime/syntax/arch.vim
+++ b/runtime/syntax/arch.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: GNU Arch inventory file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2007-06-17
+" Language: GNU Arch inventory file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-06-17
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/arduino.vim b/runtime/syntax/arduino.vim
index 14299a441a..4a4ef82072 100644
--- a/runtime/syntax/arduino.vim
+++ b/runtime/syntax/arduino.vim
@@ -10,20 +10,13 @@
" Thanks to Rik, Erik Nomitch, Adam Obeng and Graeme Cross for helpful feedback!
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" Read the C syntax to start with
-if version < 600
- so <sfile>:p:h/cpp.vim
-else
- runtime! syntax/cpp.vim
-endif
+runtime! syntax/cpp.vim
syn keyword arduinoConstant HIGH LOW INPUT OUTPUT
syn keyword arduinoConstant DEC BIN HEX OCT BYTE
diff --git a/runtime/syntax/asm.vim b/runtime/syntax/asm.vim
index e5f16c5bdc..492e3e8e92 100644
--- a/runtime/syntax/asm.vim
+++ b/runtime/syntax/asm.vim
@@ -7,11 +7,8 @@
" Thanks to Ori Avtalion for feedback on the comment markers!
-" For version 5.x: Clear all syntax items
-" For version 6.0 and later: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -103,37 +100,27 @@ syn match asmDirective "\.[A-Za-z][0-9A-Za-z-_]*"
syn case match
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_asm_syntax_inits")
- if version < 508
- let did_asm_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default methods for highlighting. Can be overridden later
- HiLink asmSection Special
- HiLink asmLabel Label
- HiLink asmComment Comment
- HiLink asmTodo Todo
- HiLink asmDirective Statement
-
- HiLink asmInclude Include
- HiLink asmCond PreCondit
- HiLink asmMacro Macro
-
- HiLink hexNumber Number
- HiLink decNumber Number
- HiLink octNumber Number
- HiLink binNumber Number
-
- HiLink asmIdentifier Identifier
- HiLink asmType Type
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+" The default methods for highlighting. Can be overridden later
+hi def link asmSection Special
+hi def link asmLabel Label
+hi def link asmComment Comment
+hi def link asmTodo Todo
+hi def link asmDirective Statement
+
+hi def link asmInclude Include
+hi def link asmCond PreCondit
+hi def link asmMacro Macro
+
+hi def link hexNumber Number
+hi def link decNumber Number
+hi def link octNumber Number
+hi def link binNumber Number
+
+hi def link asmIdentifier Identifier
+hi def link asmType Type
+
let b:current_syntax = "asm"
diff --git a/runtime/syntax/asm68k.vim b/runtime/syntax/asm68k.vim
index cd23517cad..1607507909 100644
--- a/runtime/syntax/asm68k.vim
+++ b/runtime/syntax/asm68k.vim
@@ -8,11 +8,8 @@
" Feel free to contribute...
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -328,63 +325,53 @@ syn match asm68kDirective "\<XREF\(\.S\)\=\s"
syn case match
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_asm68k_syntax_inits")
- if version < 508
- let did_asm68k_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default methods for highlighting. Can be overridden later
- " Comment Constant Error Identifier PreProc Special Statement Todo Type
- "
- " Constant Boolean Character Number String
- " Identifier Function
- " PreProc Define Include Macro PreCondit
- " Special Debug Delimiter SpecialChar SpecialComment Tag
- " Statement Conditional Exception Keyword Label Operator Repeat
- " Type StorageClass Structure Typedef
-
- HiLink asm68kComment Comment
- HiLink asm68kTodo Todo
-
- HiLink hexNumber Number " Constant
- HiLink octNumber Number " Constant
- HiLink binNumber Number " Constant
- HiLink decNumber Number " Constant
- HiLink floatNumber Number " Constant
- HiLink floatExponent Number " Constant
- HiLink floatE SpecialChar " Statement
- "HiLink floatE Number " Constant
-
- HiLink asm68kImmediate SpecialChar " Statement
- "HiLink asm68kSymbol Constant
-
- HiLink asm68kString String " Constant
- HiLink asm68kCharError Error
- HiLink asm68kStringError Error
-
- HiLink asm68kReg Identifier
- HiLink asm68kOperator Identifier
-
- HiLink asm68kInclude Include " PreProc
- HiLink asm68kMacro Macro " PreProc
- HiLink asm68kMacroParam Keyword " Statement
-
- HiLink asm68kDirective Special
- HiLink asm68kPreCond Special
-
-
- HiLink asm68kOpcode Statement
- HiLink asm68kCond Conditional " Statement
- HiLink asm68kRepeat Repeat " Statement
-
- HiLink asm68kLabel Type
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+" The default methods for highlighting. Can be overridden later
+" Comment Constant Error Identifier PreProc Special Statement Todo Type
+"
+" Constant Boolean Character Number String
+" Identifier Function
+" PreProc Define Include Macro PreCondit
+" Special Debug Delimiter SpecialChar SpecialComment Tag
+" Statement Conditional Exception Keyword Label Operator Repeat
+" Type StorageClass Structure Typedef
+
+hi def link asm68kComment Comment
+hi def link asm68kTodo Todo
+
+hi def link hexNumber Number " Constant
+hi def link octNumber Number " Constant
+hi def link binNumber Number " Constant
+hi def link decNumber Number " Constant
+hi def link floatNumber Number " Constant
+hi def link floatExponent Number " Constant
+hi def link floatE SpecialChar " Statement
+"hi def link floatE Number " Constant
+
+hi def link asm68kImmediate SpecialChar " Statement
+"hi def link asm68kSymbol Constant
+
+hi def link asm68kString String " Constant
+hi def link asm68kCharError Error
+hi def link asm68kStringError Error
+
+hi def link asm68kReg Identifier
+hi def link asm68kOperator Identifier
+
+hi def link asm68kInclude Include " PreProc
+hi def link asm68kMacro Macro " PreProc
+hi def link asm68kMacroParam Keyword " Statement
+
+hi def link asm68kDirective Special
+hi def link asm68kPreCond Special
+
+
+hi def link asm68kOpcode Statement
+hi def link asm68kCond Conditional " Statement
+hi def link asm68kRepeat Repeat " Statement
+
+hi def link asm68kLabel Type
let b:current_syntax = "asm68k"
diff --git a/runtime/syntax/asmh8300.vim b/runtime/syntax/asmh8300.vim
index 48699d89c5..8560fb7ae4 100644
--- a/runtime/syntax/asmh8300.vim
+++ b/runtime/syntax/asmh8300.vim
@@ -3,11 +3,8 @@
" Maintainer: Kevin Dahlhausen <kdahlhaus@yahoo.com>
" Last Change: 2002 Sep 19
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -52,33 +49,19 @@ syn case match
" Read the general asm syntax
-if version < 600
- source <sfile>:p:h/asm.vim
-else
- runtime! syntax/asm.vim
-endif
+runtime! syntax/asm.vim
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_hitachi_syntax_inits")
- if version < 508
- let did_hitachi_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink asmOpcode Statement
- HiLink asmRegister Identifier
+hi def link asmOpcode Statement
+hi def link asmRegister Identifier
- " My default-color overrides:
- "hi asmOpcode ctermfg=yellow
- "hi asmReg ctermfg=lightmagenta
+" My default-color overrides:
+"hi asmOpcode ctermfg=yellow
+"hi asmReg ctermfg=lightmagenta
- delcommand HiLink
-endif
let b:current_syntax = "asmh8300"
diff --git a/runtime/syntax/asn.vim b/runtime/syntax/asn.vim
index 28c8efba95..e90c7e079c 100644
--- a/runtime/syntax/asn.vim
+++ b/runtime/syntax/asn.vim
@@ -4,11 +4,8 @@
" URL: http://www.fleiner.com/vim/syntax/asn.vim
" Last Change: 2012 Oct 05
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -50,34 +47,24 @@ syn match asnBraces "[{}]"
syn sync ccomment asnComment
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_asn_syn_inits")
- if version < 508
- let did_asn_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink asnDefinition Function
- HiLink asnBraces Function
- HiLink asnStructure Statement
- HiLink asnBoolValue Boolean
- HiLink asnSpecial Special
- HiLink asnString String
- HiLink asnCharacter Character
- HiLink asnSpecialCharacter asnSpecial
- HiLink asnNumber asnValue
- HiLink asnComment Comment
- HiLink asnLineComment asnComment
- HiLink asnType Type
- HiLink asnTypeInfo PreProc
- HiLink asnValue Number
- HiLink asnExternal Include
- HiLink asnTagModifier Function
- HiLink asnFieldOption Type
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+hi def link asnDefinition Function
+hi def link asnBraces Function
+hi def link asnStructure Statement
+hi def link asnBoolValue Boolean
+hi def link asnSpecial Special
+hi def link asnString String
+hi def link asnCharacter Character
+hi def link asnSpecialCharacter asnSpecial
+hi def link asnNumber asnValue
+hi def link asnComment Comment
+hi def link asnLineComment asnComment
+hi def link asnType Type
+hi def link asnTypeInfo PreProc
+hi def link asnValue Number
+hi def link asnExternal Include
+hi def link asnTagModifier Function
+hi def link asnFieldOption Type
let &cpo = s:cpo_save
unlet s:cpo_save
diff --git a/runtime/syntax/aspperl.vim b/runtime/syntax/aspperl.vim
index 0f7ef46872..5a9abedb19 100644
--- a/runtime/syntax/aspperl.vim
+++ b/runtime/syntax/aspperl.vim
@@ -4,11 +4,8 @@
" URL: http://nim.dhs.org/~edh/aspperl.vim
" Last Change: 2001 May 09
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -16,14 +13,9 @@ if !exists("main_syntax")
let main_syntax = 'perlscript'
endif
-if version < 600
- so <sfile>:p:h/html.vim
- syn include @AspPerlScript <sfile>:p:h/perl.vim
-else
- runtime! syntax/html.vim
- unlet b:current_syntax
- syn include @AspPerlScript syntax/perl.vim
-endif
+runtime! syntax/html.vim
+unlet b:current_syntax
+syn include @AspPerlScript syntax/perl.vim
syn cluster htmlPreproc add=AspPerlScriptInsideHtmlTags
diff --git a/runtime/syntax/aspvbs.vim b/runtime/syntax/aspvbs.vim
index f1435cb04b..f0861d8b5a 100644
--- a/runtime/syntax/aspvbs.vim
+++ b/runtime/syntax/aspvbs.vim
@@ -11,10 +11,8 @@
" Thanks to Dean Hall <hall@apt7.com> for testing the use of classes in
" VBScripts which I've been too scared to do.
-" Quit when a syntax file was already loaded
-if version < 600
- syn clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -22,11 +20,7 @@ if !exists("main_syntax")
let main_syntax = 'aspvbs'
endif
-if version < 600
- source <sfile>:p:h/html.vim
-else
- runtime! syntax/html.vim
-endif
+runtime! syntax/html.vim
unlet b:current_syntax
syn cluster htmlPreProc add=AspVBScriptInsideHtmlTags
@@ -163,31 +157,21 @@ syn sync match htmlHighlight grouphere htmlTag "%>"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_aspvbs_syn_inits")
- if version < 508
- let did_aspvbs_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- "HiLink AspVBScript Special
- HiLink AspVBSLineNumber Comment
- HiLink AspVBSNumber Number
- HiLink AspVBSError Error
- HiLink AspVBSStatement Statement
- HiLink AspVBSString String
- HiLink AspVBSComment Comment
- HiLink AspVBSTodo Todo
- HiLink AspVBSFunction Identifier
- HiLink AspVBSMethods PreProc
- HiLink AspVBSEvents Special
- HiLink AspVBSTypeSpecifier Type
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+"hi def link AspVBScript Special
+hi def link AspVBSLineNumber Comment
+hi def link AspVBSNumber Number
+hi def link AspVBSError Error
+hi def link AspVBSStatement Statement
+hi def link AspVBSString String
+hi def link AspVBSComment Comment
+hi def link AspVBSTodo Todo
+hi def link AspVBSFunction Identifier
+hi def link AspVBSMethods PreProc
+hi def link AspVBSEvents Special
+hi def link AspVBSTypeSpecifier Type
+
let b:current_syntax = "aspvbs"
diff --git a/runtime/syntax/asterisk.vim b/runtime/syntax/asterisk.vim
index fd4ec39c91..4a922d3f11 100644
--- a/runtime/syntax/asterisk.vim
+++ b/runtime/syntax/asterisk.vim
@@ -5,10 +5,9 @@
" Updated for 1.2 by Tilghman Lesher (Corydon76)
" Last Change: 2015 Feb 27
" version 0.4
-"
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -57,42 +56,33 @@ syn match asteriskSetting "^port\s*=\s*\d\{1,5}\s*$" contains=aste
syn match asteriskSetting "^host\s*=\s*\(dynamic\|\(\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}\)\|\([[:alnum:]][[:alnum:]\-\.]*\.[[:alpha:]]{2,10}\)\)" contains=asteriskIP,asteriskHostname
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_conf_syntax_inits")
- if version < 508
- let did_conf_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
+
+hi def link asteriskComment Comment
+hi def link asteriskExten String
+hi def link asteriskContext Preproc
+hi def link asteriskPattern Type
+hi def link asteriskApp Statement
+hi def link asteriskInclude Preproc
+hi def link asteriskIncludeBad Error
+hi def link asteriskPriority Preproc
+hi def link asteriskLabel Type
+hi def link asteriskVar String
+hi def link asteriskVarLen Function
+hi def link asteriskExp Type
+hi def link asteriskCodecsPermit Preproc
+hi def link asteriskCodecs String
+hi def link asteriskType Statement
+hi def link asteriskTypeType Type
+hi def link asteriskAuth String
+hi def link asteriskAuthType Type
+hi def link asteriskIPRange Identifier
+hi def link asteriskIP Identifier
+hi def link asteriskPort Identifier
+hi def link asteriskHostname Identifier
+hi def link asteriskSetting Statement
+hi def link asteriskError Error
- HiLink asteriskComment Comment
- HiLink asteriskExten String
- HiLink asteriskContext Preproc
- HiLink asteriskPattern Type
- HiLink asteriskApp Statement
- HiLink asteriskInclude Preproc
- HiLink asteriskIncludeBad Error
- HiLink asteriskPriority Preproc
- HiLink asteriskLabel Type
- HiLink asteriskVar String
- HiLink asteriskVarLen Function
- HiLink asteriskExp Type
- HiLink asteriskCodecsPermit Preproc
- HiLink asteriskCodecs String
- HiLink asteriskType Statement
- HiLink asteriskTypeType Type
- HiLink asteriskAuth String
- HiLink asteriskAuthType Type
- HiLink asteriskIPRange Identifier
- HiLink asteriskIP Identifier
- HiLink asteriskPort Identifier
- HiLink asteriskHostname Identifier
- HiLink asteriskSetting Statement
- HiLink asteriskError Error
- delcommand HiLink
-endif
let b:current_syntax = "asterisk"
" vim: ts=8 sw=2
diff --git a/runtime/syntax/asteriskvm.vim b/runtime/syntax/asteriskvm.vim
index a6c9dba418..fa55af5451 100644
--- a/runtime/syntax/asteriskvm.vim
+++ b/runtime/syntax/asteriskvm.vim
@@ -3,10 +3,9 @@
" Maintainer: Tilghman Lesher (Corydon76)
" Last Change: 2006 Mar 21
" version 0.2
-"
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -33,28 +32,18 @@ syn match mailboxEmail ",\zs[^@=,]*@[[:alnum:]\-\.]\+\.[[:alpha
syn match comma "[,|]" contained
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-:if version >= 508 || !exists("did_conf_syntax_inits")
- if version < 508
- let did_conf_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink asteriskvmComment Comment
- HiLink asteriskvmContext Identifier
- HiLink asteriskvmZone Type
- HiLink zoneName String
- HiLink zoneDef String
- HiLink asteriskvmSetting Type
- HiLink asteriskvmSettingBool Type
-
- HiLink asteriskvmMailbox Statement
- HiLink mailboxEmail String
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link asteriskvmComment Comment
+hi def link asteriskvmContext Identifier
+hi def link asteriskvmZone Type
+hi def link zoneName String
+hi def link zoneDef String
+hi def link asteriskvmSetting Type
+hi def link asteriskvmSettingBool Type
+
+hi def link asteriskvmMailbox Statement
+hi def link mailboxEmail String
let b:current_syntax = "asteriskvm"
diff --git a/runtime/syntax/atlas.vim b/runtime/syntax/atlas.vim
index b8fe4356b5..1cdceab4ce 100644
--- a/runtime/syntax/atlas.vim
+++ b/runtime/syntax/atlas.vim
@@ -3,11 +3,8 @@
" Maintainer: Inaki Saez <jisaez@sfe.indra.es>
" Last Change: 2001 May 09
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -61,37 +58,27 @@ syn sync maxlines=100
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_atlas_syntax_inits")
- if version < 508
- let did_atlas_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink atlasConditional Conditional
- HiLink atlasRepeat Repeat
- HiLink atlasStatement Statement
- HiLink atlasNumber Number
- HiLink atlasHexNumber Number
- HiLink atlasOctalNumber Number
- HiLink atlasBinNumber Number
- HiLink atlasDecimalNumber Float
- HiLink atlasFormatString String
- HiLink atlasString String
- HiLink atlasComment Comment
- HiLink atlasComment2 Comment
- HiLink atlasInclude Include
- HiLink atlasDefine Macro
- HiLink atlasReserved PreCondit
- HiLink atlasStorageClass StorageClass
- HiLink atlasIdentifier NONE
- HiLink atlasSpecial Special
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link atlasConditional Conditional
+hi def link atlasRepeat Repeat
+hi def link atlasStatement Statement
+hi def link atlasNumber Number
+hi def link atlasHexNumber Number
+hi def link atlasOctalNumber Number
+hi def link atlasBinNumber Number
+hi def link atlasDecimalNumber Float
+hi def link atlasFormatString String
+hi def link atlasString String
+hi def link atlasComment Comment
+hi def link atlasComment2 Comment
+hi def link atlasInclude Include
+hi def link atlasDefine Macro
+hi def link atlasReserved PreCondit
+hi def link atlasStorageClass StorageClass
+hi def link atlasIdentifier NONE
+hi def link atlasSpecial Special
+
let b:current_syntax = "atlas"
diff --git a/runtime/syntax/autodoc.vim b/runtime/syntax/autodoc.vim
new file mode 100644
index 0000000000..67a627e46c
--- /dev/null
+++ b/runtime/syntax/autodoc.vim
@@ -0,0 +1,101 @@
+" Vim syntax file
+" Language: Autodoc
+" Maintainer: Stephen R. van den Berg <srb@cuci.nl>
+" Last Change: 2018 Jan 23
+" Version: 2.9
+" Remark: Included by pike.vim, cmod.vim and optionally c.vim
+" Remark: In order to make c.vim use it, set: c_autodoc
+
+" Quit when a (custom) syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn case match
+
+" A bunch of useful autodoc keywords
+syn keyword autodocStatement contained appears belongs global
+syn keyword autodocStatement contained decl directive inherit
+syn keyword autodocStatement contained deprecated obsolete bugs
+syn keyword autodocStatement contained copyright example fixme note param returns
+syn keyword autodocStatement contained seealso thanks throws constant
+syn keyword autodocStatement contained member index elem
+syn keyword autodocStatement contained value type item
+
+syn keyword autodocRegion contained enum mapping code multiset array
+syn keyword autodocRegion contained int string section mixed ol ul dl
+syn keyword autodocRegion contained class module namespace
+syn keyword autodocRegion contained endenum endmapping endcode endmultiset
+syn keyword autodocRegion contained endarray endint endstring endsection
+syn keyword autodocRegion contained endmixed endol endul enddl
+syn keyword autodocRegion contained endclass endmodule endnamespace
+
+syn keyword autodocIgnore contained ignore endignore
+
+syn keyword autodocStatAcc contained b i u tt url pre sub sup
+syn keyword autodocStatAcc contained ref rfc xml dl expr image
+
+syn keyword autodocTodo contained TODO FIXME XXX
+
+syn match autodocLineStart display "\(//\|/\?\*\)\@2<=!"
+syn match autodocWords "[^!@{}[\]]\+" display contains=@Spell
+
+syn match autodocLink "@\[[^[\]]\+]"hs=s+2,he=e-1 display contains=autodocLead
+syn match autodocAtStmt "@[a-z]\+\%(\s\|$\)\@="hs=s+1 display contains=autodocStatement,autodocIgnore,autodocLead,autodocRegion
+
+" Due to limitations of the matching algorithm, we cannot highlight
+" nested autodocNStmtAcc structures correctly
+syn region autodocNStmtAcc start="@[a-z]\+{" end="@}" contains=autodocStatAcc,autodocLead keepend
+
+syn match autodocUrl contained display ".\+"
+syn region autodocAtUrlAcc start="{"ms=s+1 end="@}"he=e-1,me=e-2 contained display contains=autodocUrl,autodocLead keepend
+syn region autodocNUrlAcc start="@url{" end="@}" contains=autodocStatAcc,autodocAtUrlAcc,autodocLead transparent
+
+syn match autodocSpecial "@@" display
+syn match autodocLead "@" display contained
+
+"when wanted, highlight trailing white space
+if exists("c_space_errors")
+ if !exists("c_no_trail_space_error")
+ syn match autodocSpaceError display excludenl "\s\+$"
+ endif
+ if !exists("c_no_tab_space_error")
+ syn match autodocSpaceError display " \+\t"me=e-1
+ endif
+endif
+
+if exists("c_minlines")
+ let b:c_minlines = c_minlines
+else
+ if !exists("c_no_if0")
+ let b:c_minlines = 50 " #if 0 constructs can be long
+ else
+ let b:c_minlines = 15 " mostly for () constructs
+ endif
+endif
+exec "syn sync ccomment autodocComment minlines=" . b:c_minlines
+
+" Define the default highlighting.
+" Only used when an item doesn't have highlighting yet
+hi def link autodocStatement Statement
+hi def link autodocStatAcc Statement
+hi def link autodocRegion Structure
+hi def link autodocAtStmt Error
+hi def link autodocNStmtAcc Identifier
+hi def link autodocLink Type
+hi def link autodocTodo Todo
+hi def link autodocSpaceError Error
+hi def link autodocLineStart SpecialComment
+hi def link autodocSpecial SpecialChar
+hi def link autodocUrl Underlined
+hi def link autodocLead Statement
+hi def link autodocIgnore Delimiter
+
+let b:current_syntax = "autodoc"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=8
diff --git a/runtime/syntax/autohotkey.vim b/runtime/syntax/autohotkey.vim
index 764f94b11a..c6a68f7a21 100644
--- a/runtime/syntax/autohotkey.vim
+++ b/runtime/syntax/autohotkey.vim
@@ -1,8 +1,10 @@
" Vim syntax file
" Language: AutoHotkey script file
-" Maintainer: SungHyun Nam <goweol@gmail.com>
-" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2015-10-29
+" Maintainer: Michael Wong
+" https://github.com/mmikeww/autohotkey.vim
+" Latest Revision: 2017-04-03
+" Previous Maintainers: SungHyun Nam <goweol@gmail.com>
+" Nikolai Weibull <now@bitwi.se>
if exists("b:current_syntax")
finish
@@ -17,68 +19,11 @@ syn keyword autohotkeyTodo
\ contained
\ TODO FIXME XXX NOTE
-syn cluster autohotkeyCommentGroup
- \ contains=
- \ autohotkeyTodo,
- \ @Spell
-
-syn match autohotkeyComment
- \ display
- \ contains=@autohotkeyCommentGroup
- \ '`\@<!;.*$'
-
-syn region autohotkeyComment
- \ contains=@autohotkeyCommentGroup
- \ matchgroup=autohotkeyCommentStart
- \ start='/\*'
- \ end='\*/'
-
+" only these chars are valid as escape sequences: ,%`;nrbtvaf
+" https://autohotkey.com/docs/commands/_EscapeChar.htm
syn match autohotkeyEscape
\ display
- \ '`.'
-
-syn match autohotkeyHotkey
- \ contains=autohotkeyKey,
- \ autohotkeyHotkeyDelimiter
- \ display
- \ '^.\{-}::'
-
-syn match autohotkeyKey
- \ contained
- \ display
- \ '^.\{-}'
-
-syn match autohotkeyDelimiter
- \ contained
- \ display
- \ '::'
-
-syn match autohotkeyHotstringDefinition
- \ contains=autohotkeyHotstring,
- \ autohotkeyHotstringDelimiter
- \ display
- \ '^:\%(B0\|C1\|K\d\+\|P\d\+\|S[IPE]\|Z\d\=\|[*?COR]\)*:.\{-}::'
-
-syn match autohotkeyHotstring
- \ contained
- \ display
- \ '.\{-}'
-
-syn match autohotkeyHotstringDelimiter
- \ contained
- \ display
- \ '::'
-
-syn match autohotkeyHotstringDelimiter
- \ contains=autohotkeyHotstringOptions
- \ contained
- \ display
- \ ':\%(B0\|C1\|K\d\+\|P\d\+\|S[IPE]\|Z\d\=\|[*?COR]\):'
-
-syn match autohotkeyHotstringOptions
- \ contained
- \ display
- \ '\%(B0\|C1\|K\d\+\|P\d\+\|S[IPE]\|Z\d\=\|[*?COR]\)'
+ \ '`[,%`;nrbtvaf]'
syn region autohotkeyString
\ display
@@ -88,39 +33,46 @@ syn region autohotkeyString
\ end=+"+
\ contains=autohotkeyEscape
-syn region autohotkeyVariable
+syn match autohotkeyVariable
\ display
\ oneline
\ contains=autohotkeyBuiltinVariable
- \ matchgroup=autohotkeyVariableDelimiter
- \ start="%"
- \ end="%"
\ keepend
+ \ '%\S\{-}%'
syn keyword autohotkeyBuiltinVariable
\ A_Space A_Tab
- \ A_WorkingDir A_ScriptDir A_ScriptName A_ScriptFullPath A_LineNumber
- \ A_LineFile A_AhkVersion A_AhkPAth A_IsCompiled A_ExitReason
- \ A_YYYY A_MM A_DD A_MMMM A_MMM A_DDDD A_DDD A_WDay A_YWeek A_Hour A_Min
+ \ A_WorkingDir A_ScriptDir A_ScriptName A_ScriptFullPath A_ScriptHwnd A_LineNumber
+ \ A_LineFile A_ThisFunc A_ThisLabel A_AhkVersion A_AhkPath A_IsUnicode A_IsCompiled A_ExitReason
+ \ A_YYYY A_MM A_DD A_MMMM A_MMM A_DDDD A_DDD A_WDay A_YDay A_YWeek A_Hour A_Min
+ \ A_Mon A_Year A_MDay A_NumBatchLines
\ A_Sec A_MSec A_Now A_NowUTC A_TickCount
- \ A_IsSuspended A_BatchLines A_TitleMatchMode A_TitleMatchModeSpeed
- \ A_DetectHiddenWindows A_DetectHiddenText A_AutoTrim A_STringCaseSense
- \ A_FormatInteger A_FormatFloat A_KeyDelay A_WinDelay A_ControlDelay
- \ A_MouseDelay A_DefaultMouseSpeed A_IconHidden A_IconTip A_IconFile
+ \ A_IsSuspended A_IsPaused A_IsCritical A_BatchLines A_TitleMatchMode A_TitleMatchModeSpeed
+ \ A_DetectHiddenWindows A_DetectHiddenText A_AutoTrim A_StringCaseSense
+ \ A_FileEncoding A_FormatInteger A_FormatFloat A_KeyDelay A_WinDelay A_ControlDelay
+ \ A_SendMode A_SendLevel A_StoreCapsLockMode A_KeyDelay A_KeyDelayDuration
+ \ A_KeyDelayPlay A_KeyDelayPlayDuration A_MouseDelayPlay
+ \ A_MouseDelay A_DefaultMouseSpeed A_RegView A_IconHidden A_IconTip A_IconFile
+ \ A_CoordModeToolTip A_CoordModePixel A_CoordModeMouse A_CoordModeCaret A_CoordModeMenu
\ A_IconNumber
- \ A_TimeIdle A_TimeIdlePhysical
+ \ A_TimeIdle A_TimeIdlePhysical A_DefaultGui A_DefaultListView A_DefaultTreeView
\ A_Gui A_GuiControl A_GuiWidth A_GuiHeight A_GuiX A_GuiY A_GuiEvent
\ A_GuiControlEvent A_EventInfo
\ A_ThisMenuItem A_ThisMenu A_ThisMenuItemPos A_ThisHotkey A_PriorHotkey
- \ A_TimeSinceThisHotkey A_TimeSincePriorHotkey A_EndChar
+ \ A_PriorKey A_TimeSinceThisHotkey A_TimeSincePriorHotkey A_EndChar
\ ComSpec A_Temp A_OSType A_OSVersion A_Language A_ComputerName A_UserName
+ \ A_Is64BitOS A_PtrSize
\ A_WinDir A_ProgramFiles ProgramFiles A_AppData A_AppDataCommon A_Desktop
\ A_DesktopCommon A_StartMenu A_StartMenuCommon A_Programs
\ A_ProgramsCommon A_Startup A_StartupCommon A_MyDocuments A_IsAdmin
- \ A_ScreenWidth A_ScreenHeight A_IPAddress1 A_IPAddress2 A_IPAddress3
+ \ A_ScreenWidth A_ScreenHeight A_ScreenDPI A_IPAddress1 A_IPAddress2 A_IPAddress3
\ A_IPAddress4
\ A_Cursor A_CaretX A_CaretY Clipboard ClipboardAll ErrorLevel A_LastError
\ A_Index A_LoopFileName A_LoopRegName A_LoopReadLine A_LoopField
+ \ A_LoopFileExt A_LoopFileFullPath A_LoopFileLongPath A_LoopFileShortPath
+ \ A_LoopFileShortName A_LoopFileDir A_LoopFileTimeModified A_LoopFileTimeCreated
+ \ A_LoopFileTimeAccessed A_LoopFileAttrib A_LoopFileSize A_LoopFileSizeKB A_LoopFileSizeMB
+ \ A_LoopRegType A_LoopRegKey A_LoopRegSubKey A_LoopRegTimeModified
syn match autohotkeyBuiltinVariable
\ contained
@@ -130,7 +82,7 @@ syn match autohotkeyBuiltinVariable
syn keyword autohotkeyCommand
\ ClipWait EnvGet EnvSet EnvUpdate
\ Drive DriveGet DriveSpaceFree FileAppend FileCopy FileCopyDir
- \ FileCreateDir FileCreateShortcut FileDelete FileGetAttrib
+ \ FileCreateDir FileCreateShortcut FileDelete FileGetAttrib FileEncoding
\ FileGetShortcut FileGetSize FileGetTime FileGetVersion FileInstall
\ FileMove FileMoveDir FileReadLine FileRead FileRecycle FileRecycleEmpty
\ FileRemoveDir FileSelectFolder FileSelectFile FileSetAttrib FileSetTime
@@ -153,7 +105,8 @@ syn keyword autohotkeyCommand
\ SoundSetWaveVolume
\ FormatTime IfInString IfNotInString Sort StringCaseSense StringGetPos
\ StringLeft StringRight StringLower StringUpper StringMid StringReplace
- \ StringSplit StringTrimLeft StringTrimRight
+ \ StringSplit StringTrimLeft StringTrimRight StringLen
+ \ StrSplit StrReplace Throw
\ Control ControlClick ControlFocus ControlGet ControlGetFocus
\ ControlGetPos ControlGetText ControlMove ControlSend ControlSendRaw
\ ControlSetText Menu PostMessage SendMessage SetControlDelay
@@ -164,23 +117,30 @@ syn keyword autohotkeyCommand
\ WinGetText WinGetTitle WinHide WinKill WinMaximize WinMinimize
\ WinMinimizeAll WinMinimizeAllUndo WinMove WinRestore WinSet
\ WinSetTitle WinShow WinWait WinWaitActive WinWaitNotActive WinWaitClose
+ \ SetCapsLockState SetNumLockState SetScrollLockState
syn keyword autohotkeyFunction
- \ InStr RegExMatch RegExReplace StrLen SubStr Asc Chr
+ \ InStr RegExMatch RegExReplace StrLen SubStr Asc Chr Func
\ DllCall VarSetCapacity WinActive WinExist IsLabel OnMessage
\ Abs Ceil Exp Floor Log Ln Mod Round Sqrt Sin Cos Tan ASin ACos ATan
- \ FileExist GetKeyState
+ \ FileExist GetKeyState NumGet NumPut StrGet StrPut RegisterCallback
+ \ IsFunc Trim LTrim RTrim IsObject Object Array FileOpen
+ \ ComObjActive ComObjArray ComObjConnect ComObjCreate ComObjGet
+ \ ComObjError ComObjFlags ComObjQuery ComObjType ComObjValue ComObject
+ \ Format Exception
syn keyword autohotkeyStatement
\ Break Continue Exit ExitApp Gosub Goto OnExit Pause Return
- \ Suspend Reload
+ \ Suspend Reload new class extends
syn keyword autohotkeyRepeat
\ Loop
syn keyword autohotkeyConditional
\ IfExist IfNotExist If IfEqual IfLess IfGreater Else
- \ IfWinExist IfWinNotExist
+ \ IfWinExist IfWinNotExist IfWinActive IfWinNotActive
+ \ IfNotEqual IfLessOrEqual IfGreaterOrEqual
+ \ while until for in try catch finally
syn match autohotkeyPreProcStart
\ nextgroup=
@@ -200,6 +160,7 @@ syn keyword autohotkeyPreProc
\ HotkeyInterval HotKeyModifierTimeout
\ Hotstring
\ IfWinActive IfWinNotActive IfWinExist IfWinNotExist
+ \ If IfTimeout
\ MaxHotkeysPerInterval MaxThreads MaxThreadsBuffer MaxThreadsPerHotkey
\ UseHook InstallKeybdHook InstallMouseHook
\ KeyHistory
@@ -213,9 +174,13 @@ syn keyword autohotkeyPreProc
\ MaxMem
\ NoEnv
\ Persistent
+ \ LTrim
+ \ InputLevel
+ \ MenuMaskKey
+ \ Warn
syn keyword autohotkeyMatchClass
- \ ahk_group ahk_class ahk_id ahk_pid
+ \ ahk_group ahk_class ahk_id ahk_pid ahk_exe
syn match autohotkeyNumbers
\ display
@@ -243,11 +208,74 @@ syn match autohotkeyFloat
syn keyword autohotkeyType
\ local
\ global
+ \ static
+ \ byref
syn keyword autohotkeyBoolean
\ true
\ false
+syn match autohotkeyHotkey
+ \ contains=autohotkeyKey,
+ \ autohotkeyHotkeyDelimiter
+ \ display
+ \ '^\s*\S*\%( Up\)\?::'
+
+syn match autohotkeyKey
+ \ contained
+ \ display
+ \ '^.\{-}'
+
+syn match autohotkeyDelimiter
+ \ contained
+ \ display
+ \ '::'
+
+" allowable hotstring options:
+" https://autohotkey.com/docs/Hotstrings.htm
+syn match autohotkeyHotstringDefinition
+ \ contains=autohotkeyHotstring,
+ \ autohotkeyHotstringDelimiter
+ \ display
+ \ '^\s*:\%([*?]\|[BORZ]0\?\|C[01]\?\|K\d\+\|P\d\+\|S[IPE]\)*:.\{-}::'
+
+syn match autohotkeyHotstring
+ \ contained
+ \ display
+ \ '.\{-}'
+
+syn match autohotkeyHotstringDelimiter
+ \ contained
+ \ display
+ \ '::'
+
+syn match autohotkeyHotstringDelimiter
+ \ contains=autohotkeyHotstringOptions
+ \ contained
+ \ display
+ \ ':\%([*?]\|[BORZ]0\?\|C[01]\?\|K\d\+\|P\d\+\|S[IPE]\)*:'
+
+syn match autohotkeyHotstringOptions
+ \ contained
+ \ display
+ \ '\%([*?]\|[BORZ]0\?\|C[01]\?\|K\d\+\|P\d\+\|S[IPE]\)*'
+
+syn cluster autohotkeyCommentGroup
+ \ contains=
+ \ autohotkeyTodo,
+ \ @Spell
+
+syn match autohotkeyComment
+ \ display
+ \ contains=@autohotkeyCommentGroup
+ \ '\%(^;\|\s\+;\).*$'
+
+syn region autohotkeyComment
+ \ contains=@autohotkeyCommentGroup
+ \ matchgroup=autohotkeyCommentStart
+ \ start='^\s*/\*'
+ \ end='^\s*\*/'
+
" TODO: Shouldn't we look for g:, b:, variables before defaulting to
" something?
if exists("g:autohotkey_syntax_sync_minlines")
diff --git a/runtime/syntax/automake.vim b/runtime/syntax/automake.vim
index eea2a9f38c..2a215a9e04 100644
--- a/runtime/syntax/automake.vim
+++ b/runtime/syntax/automake.vim
@@ -18,18 +18,12 @@
" EXTRA_SOURCES.
" Standard syntax initialization
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+if exists("b:current_syntax")
finish
endif
" Read the Makefile syntax to start with
-if version < 600
- source <sfile>:p:h/make.vim
-else
- runtime! syntax/make.vim
-endif
+runtime! syntax/make.vim
syn match automakePrimary "^\w\+\(_PROGRAMS\|_LIBRARIES\|_LISP\|_PYTHON\|_JAVA\|_SCRIPTS\|_DATA\|_HEADERS\|_MANS\|_TEXINFOS\|_LTLIBRARIES\)\s*\ze+\=="
syn match automakePrimary "^TESTS\s*\ze+\=="me=e-1
@@ -59,34 +53,24 @@ syn region automakeMakeSString start=+'+ skip=+\\'+ end=+'+ contains=makeIde
syn region automakeMakeBString start=+`+ skip=+\\`+ end=+`+ contains=makeIdent,makeSString,makeDString,makeNextLine,automakeSubstitution
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_automake_syntax_inits")
- if version < 508
- let did_automake_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink automakePrimary Statement
- HiLink automakeSecondary Type
- HiLink automakeExtra Special
- HiLink automakeOptions Special
- HiLink automakeClean Special
- HiLink automakeSubdirs Statement
- HiLink automakeConditional PreProc
- HiLink automakeSubst PreProc
- HiLink automakeComment1 makeComment
- HiLink automakeComment2 makeComment
- HiLink automakeMakeError makeError
- HiLink automakeBadSubst makeError
- HiLink automakeMakeDString makeDString
- HiLink automakeMakeSString makeSString
- HiLink automakeMakeBString makeBString
+hi def link automakePrimary Statement
+hi def link automakeSecondary Type
+hi def link automakeExtra Special
+hi def link automakeOptions Special
+hi def link automakeClean Special
+hi def link automakeSubdirs Statement
+hi def link automakeConditional PreProc
+hi def link automakeSubst PreProc
+hi def link automakeComment1 makeComment
+hi def link automakeComment2 makeComment
+hi def link automakeMakeError makeError
+hi def link automakeBadSubst makeError
+hi def link automakeMakeDString makeDString
+hi def link automakeMakeSString makeSString
+hi def link automakeMakeBString makeBString
- delcommand HiLink
-endif
let b:current_syntax = "automake"
diff --git a/runtime/syntax/ave.vim b/runtime/syntax/ave.vim
index 2a0a9d85af..e63e7d2c30 100644
--- a/runtime/syntax/ave.vim
+++ b/runtime/syntax/ave.vim
@@ -11,11 +11,8 @@
" I use some technologies to automatically load avenue scripts
" into ArcView.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -37,7 +34,7 @@ syn match aveNumber "[+-]\=\<[0-9]\+\>"
" Operator
syn keyword aveOperator or and max min xor mod by
-" 'not' is a kind of a problem: Its an Operator as well as a method
+" 'not' is a kind of a problem: It's an Operator as well as a method
" 'not' is only marked as an Operator if not applied as method
syn match aveOperator "[^\.]not[^a-zA-Z]"
@@ -59,34 +56,24 @@ syn match aveTypos "=="
syn match aveTypos "!="
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting+yet
-if version >= 508 || !exists("did_ave_syn_inits")
- if version < 508
- let did_ave_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting+yet
- HiLink aveStatement Statement
+hi def link aveStatement Statement
- HiLink aveString String
- HiLink aveNumber Number
+hi def link aveString String
+hi def link aveNumber Number
- HiLink aveFixVariables Special
- HiLink aveVariables Identifier
- HiLink globalVariables Special
- HiLink aveConst Special
+hi def link aveFixVariables Special
+hi def link aveVariables Identifier
+hi def link globalVariables Special
+hi def link aveConst Special
- HiLink aveClassMethods Function
+hi def link aveClassMethods Function
- HiLink aveOperator Operator
- HiLink aveComment Comment
+hi def link aveOperator Operator
+hi def link aveComment Comment
- HiLink aveTypos Error
+hi def link aveTypos Error
- delcommand HiLink
-endif
let b:current_syntax = "ave"
diff --git a/runtime/syntax/avra.vim b/runtime/syntax/avra.vim
new file mode 100644
index 0000000000..0e02bd8397
--- /dev/null
+++ b/runtime/syntax/avra.vim
@@ -0,0 +1,71 @@
+" Vim syntax file
+" Language: AVR Assembler (AVRA)
+" AVRA Home: http://avra.sourceforge.net/index.html
+" AVRA Version: 1.3.0
+" Last Update: 2016 Oct 7
+" Maintainer: Marius Ghita <mhitza@gmail.com>
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn case ignore
+
+syn keyword avraRegister r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14
+syn keyword avraRegister r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27
+syn keyword avraRegister r28 r29 r30 r31
+
+syn keyword avraInstr add adc adiw sub subi sbc sbci sbiw and andi or ori eor
+syn keyword avraInstr com neg sbr cbr inc dec tst clr ser mul muls mulsu fmul
+syn keyword avraInstr fmuls fmulsu des rjmp ijmp eijmp jmp rcall icall eicall
+syn keyword avraInstr call ret reti cpse cp cpc cpi sbrc sbrs sbic sbis brbs
+syn keyword avraInstr brbc breq brne brcs brcc brsh brlo brmi brpl brge brlt
+syn keyword avraInstr brhs brhc brts brtc brvs brvc brie brid mov movw ldi lds
+syn keyword avraInstr ld ldd sts st std lpm elpm spm in out push pop xch las
+syn keyword avraInstr lac lat lsl lsr rol ror asr swap bset bclr sbi cbi bst bld
+syn keyword avraInstr sec clc sen cln sez clz sei cli ses cls sev clv set clt
+syn keyword avraInstr seh clh break nop sleep wdr
+
+syn keyword avraDirective .byte .cseg .db .def .device .dseg .dw .endmacro .equ
+syn keyword avraDirective .eseg .exit .include .list .listmac .macro .nolist
+syn keyword avraDirective .org .set .define .undef .ifdef .ifndef .if .else
+syn keyword avraDirective .elif .elseif .warning
+
+syn keyword avraOperator low high byte2 byte3 byte4 lwrd hwrd page exp2 log2
+
+syn match avraNumericOperator "[-*/+]"
+syn match avraUnaryOperator "!"
+syn match avraBinaryOperator "<<\|>>\|<\|<=\|>\|>=\|==\|!="
+syn match avraBitwiseOperator "[~&^|]\|&&\|||"
+
+syn match avraBinaryNumber "\<0[bB][0-1]*\>"
+syn match avraHexNumber "\<0[xX][0-9a-fA-F]\+\>"
+syn match avraDecNumber "\<\(0\|[1-9]\d*\)\>"
+
+syn region avraComment start=";" end="$"
+syn region avraString start="\"" end="\"\|$"
+
+syn match avraLabel "^\s*[^; \t]\+:"
+
+hi def link avraBinaryNumber avraNumber
+hi def link avraHexNumber avraNumber
+hi def link avraDecNumber avraNumber
+
+hi def link avraNumericOperator avraOperator
+hi def link avraUnaryOperator avraOperator
+hi def link avraBinaryOperator avraOperator
+hi def link avraBitwiseOperator avraOperator
+
+
+hi def link avraOperator operator
+hi def link avraComment comment
+hi def link avraDirective preproc
+hi def link avraRegister type
+hi def link avraNumber constant
+hi def link avraString String
+hi def link avraInstr keyword
+hi def link avraLabel label
+
+let b:current_syntax = "avra"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/awk.vim b/runtime/syntax/awk.vim
index 40491eea1a..7c0682ce9f 100644
--- a/runtime/syntax/awk.vim
+++ b/runtime/syntax/awk.vim
@@ -1,15 +1,15 @@
" Vim syntax file
" Language: awk, nawk, gawk, mawk
" Maintainer: Antonio Colombo <azc100@gmail.com>
-" Last Change: 2014 Oct 21
+" Last Change: 2016 Sep 05
-" AWK ref. is: Alfred V. Aho, Brian W. Kernighan, Peter J. Weinberger
+" AWK ref. is: Alfred V. Aho, Brian W. Kernighan, Peter J. Weinberger
" The AWK Programming Language, Addison-Wesley, 1988
" GAWK ref. is: Arnold D. Robbins
" Effective AWK Programming, Third Edition, O'Reilly, 2001
" Effective AWK Programming, Fourth Edition, O'Reilly, 2015
-" (also available with the gawk source distribution)
+" (also available and updated with the gawk source distribution)
" MAWK is a "new awk" meaning it implements AWK ref.
" mawk conforms to the Posix 1003.2 (draft 11.3)
@@ -19,11 +19,8 @@
" TODO:
" Dig into the commented out syntax expressions below.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syn clear
-elseif exists("b:current_syntax")
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -35,13 +32,13 @@ set cpo&vim
syn keyword awkStatement break continue delete exit
syn keyword awkStatement function getline next
syn keyword awkStatement print printf return
-" GAWK ref. Chapter 7
-syn keyword awkStatement nextfile
+" GAWK ref. Chapter 7-9
+syn keyword awkStatement switch nextfile
+syn keyword awkStatement func
"
" GAWK ref. Chapter 9, Functions
-"
" Numeric Functions
-syn keyword awkFunction atan2 cos div exp int log rand sin sqrt srand
+syn keyword awkFunction atan2 cos exp int intdiv log rand sin sqrt srand
" String Manipulation Functions
syn keyword awkFunction asort asort1 gensub gsub index length match
syn keyword awkFunction patsplit split sprintf strtonum sub substr
@@ -52,17 +49,17 @@ syn keyword awkFunction close fflush system
syn keyword awkFunction mktime strftime systime
" Bit Manipulation Functions
syn keyword awkFunction and compl lshift or rshift xor
-" Getting Type Function
-syn keyword awkFunction isarray
+" Getting Type Functions
+syn keyword awkFunction isarray typeof
" String-Translation Functions
syn keyword awkFunction bindtextdomain dcgettext dcngetext
syn keyword awkConditional if else
-syn keyword awkRepeat while for
+syn keyword awkRepeat while for do
-syn keyword awkTodo contained TODO
+syn keyword awkTodo contained TODO
-syn keyword awkPatterns BEGIN END
+syn keyword awkPatterns BEGIN END BEGINFILE ENDFILE
" GAWK ref. Chapter 7
" Built-in Variables That Control awk
@@ -74,20 +71,22 @@ syn keyword awkVariables ARGC ARGV ARGIND ENVIRON ERRNO FILENAME
syn keyword awkVariables FNR NF FUNCTAB NR PROCINFO RLENGTH RSTART
syn keyword awkVariables RT SYMTAB
-syn keyword awkRepeat do
+" Arithmetic operators: +, and - take care of ++, and --
+syn match awkOperator "+\|-\|\*\|/\|%\|="
+syn match awkOperator "+=\|-=\|\*=\|/=\|%="
+syn match awkOperator "\^\|\^="
" Octal format character.
syn match awkSpecialCharacter display contained "\\[0-7]\{1,3\}"
-syn keyword awkStatement func nextfile
" Hex format character.
syn match awkSpecialCharacter display contained "\\x[0-9A-Fa-f]\+"
syn match awkFieldVars "\$\d\+"
-"catch errors caused by wrong parenthesis
-syn region awkParen transparent start="(" end=")" contains=ALLBUT,awkParenError,awkSpecialCharacter,awkArrayElement,awkArrayArray,awkTodo,awkRegExp,awkBrktRegExp,awkBrackets,awkCharClass
+" catch errors caused by wrong parenthesis
+syn region awkParen transparent start="(" end=")" contains=ALLBUT,awkParenError,awkSpecialCharacter,awkArrayElement,awkArrayArray,awkTodo,awkRegExp,awkBrktRegExp,awkBrackets,awkCharClass,awkComment
syn match awkParenError display ")"
-syn match awkInParen display contained "[{}]"
+"syn match awkInParen display contained "[{}]"
" 64 lines for complex &&'s, and ||'s in a big "if"
syn sync ccomment awkParen maxlines=64
@@ -129,11 +128,6 @@ syn case match
"syn match awkIdentifier "\<[a-zA-Z_][a-zA-Z0-9_]*\>"
-" Arithmetic operators: +, and - take care of ++, and --
-syn match awkOperator "+\|-\|\*\|/\|%\|="
-syn match awkOperator "+=\|-=\|\*=\|/=\|%="
-syn match awkOperator "^\|^="
-
" Comparison expressions.
syn match awkExpression "==\|>=\|=>\|<=\|=<\|\!="
syn match awkExpression "\~\|\!\~"
@@ -141,7 +135,7 @@ syn match awkExpression "?\|:"
syn keyword awkExpression in
" Boolean Logic (OR, AND, NOT)
-"syn match awkBoolLogic "||\|&&\|\!"
+syn match awkBoolLogic "||\|&&\|\!"
" This is overridden by less-than & greater-than.
" Put this above those to override them.
@@ -171,63 +165,41 @@ syn region awkArray transparent start="\[" end="\]" contains=awkArray,awkArrayE
" (for the few instances where it would be more than "oneline")
syn sync ccomment awkArray maxlines=10
-" define the default highlighting
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_awk_syn_inits")
- if version < 508
- let did_awk_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink awkConditional Conditional
- HiLink awkFunction Function
- HiLink awkRepeat Repeat
- HiLink awkStatement Statement
-
- HiLink awkString String
- HiLink awkSpecialPrintf Special
- HiLink awkSpecialCharacter Special
-
- HiLink awkSearch String
- HiLink awkBrackets awkRegExp
- HiLink awkBrktRegExp awkNestRegExp
- HiLink awkCharClass awkNestRegExp
- HiLink awkNestRegExp Keyword
- HiLink awkRegExp Special
-
- HiLink awkNumber Number
- HiLink awkFloat Float
-
- HiLink awkFileIO Special
- HiLink awkOperator Special
- HiLink awkExpression Special
- HiLink awkBoolLogic Special
-
- HiLink awkPatterns Special
- HiLink awkVariables Special
- HiLink awkFieldVars Special
-
- HiLink awkLineSkip Special
- HiLink awkSemicolon Special
- HiLink awkComma Special
- "HiLink awkIdentifier Identifier
-
- HiLink awkComment Comment
- HiLink awkTodo Todo
-
- " Change this if you want nested array names to be highlighted.
- HiLink awkArrayArray awkArray
- HiLink awkArrayElement Special
-
- HiLink awkParenError awkError
- HiLink awkInParen awkError
- HiLink awkError Error
-
- delcommand HiLink
-endif
+" Define the default highlighting.
+hi def link awkConditional Conditional
+hi def link awkFunction Function
+hi def link awkRepeat Repeat
+hi def link awkStatement Statement
+hi def link awkString String
+hi def link awkSpecialPrintf Special
+hi def link awkSpecialCharacter Special
+hi def link awkSearch String
+hi def link awkBrackets awkRegExp
+hi def link awkBrktRegExp awkNestRegExp
+hi def link awkCharClass awkNestRegExp
+hi def link awkNestRegExp Keyword
+hi def link awkRegExp Special
+hi def link awkNumber Number
+hi def link awkFloat Float
+hi def link awkFileIO Special
+hi def link awkOperator Special
+hi def link awkExpression Special
+hi def link awkBoolLogic Special
+hi def link awkPatterns Special
+hi def link awkVariables Special
+hi def link awkFieldVars Special
+hi def link awkLineSkip Special
+hi def link awkSemicolon Special
+hi def link awkComma Special
+hi def link awkIdentifier Identifier
+hi def link awkComment Comment
+hi def link awkTodo Todo
+" Change this if you want nested array names to be highlighted.
+hi def link awkArrayArray awkArray
+hi def link awkArrayElement Special
+hi def link awkParenError awkError
+hi def link awkInParen awkError
+hi def link awkError Error
let b:current_syntax = "awk"
diff --git a/runtime/syntax/ayacc.vim b/runtime/syntax/ayacc.vim
index fedd0e80a0..6fb6aec85d 100644
--- a/runtime/syntax/ayacc.vim
+++ b/runtime/syntax/ayacc.vim
@@ -6,21 +6,14 @@
" Comment: Replaced sourcing c.vim file by ada.vim and rename yacc*
" in ayacc*
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" Read the Ada syntax to start with
-if version < 600
- so <sfile>:p:h/ada.vim
-else
- runtime! syntax/ada.vim
- unlet b:current_syntax
-endif
+runtime! syntax/ada.vim
+unlet b:current_syntax
let s:cpo_save = &cpo
set cpo&vim
@@ -54,35 +47,26 @@ syn match ayaccSep "^[ \t]*%}"
syn match ayaccCurlyError "[{}]"
syn region ayaccAction matchgroup=ayaccCurly start="{" end="}" contains=ALLBUT,@ayaccActionGroup
-if version >= 508 || !exists("did_ayacc_syntax_inits")
- if version < 508
- let did_ayacc_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- " Internal ayacc highlighting links
- HiLink ayaccBrkt ayaccStmt
- HiLink ayaccKey ayaccStmt
- HiLink ayaccOper ayaccStmt
- HiLink ayaccUnionStart ayaccKey
+" Internal ayacc highlighting links
+hi def link ayaccBrkt ayaccStmt
+hi def link ayaccKey ayaccStmt
+hi def link ayaccOper ayaccStmt
+hi def link ayaccUnionStart ayaccKey
- " External ayacc highlighting links
- HiLink ayaccCurly Delimiter
- HiLink ayaccCurlyError Error
- HiLink ayaccDefinition Function
- HiLink ayaccDelim Function
- HiLink ayaccKeyActn Special
- HiLink ayaccSectionSep Todo
- HiLink ayaccSep Delimiter
- HiLink ayaccStmt Statement
- HiLink ayaccType Type
+" External ayacc highlighting links
+hi def link ayaccCurly Delimiter
+hi def link ayaccCurlyError Error
+hi def link ayaccDefinition Function
+hi def link ayaccDelim Function
+hi def link ayaccKeyActn Special
+hi def link ayaccSectionSep Todo
+hi def link ayaccSep Delimiter
+hi def link ayaccStmt Statement
+hi def link ayaccType Type
- " since Bram doesn't like my Delimiter :|
- HiLink Delimiter Type
- delcommand HiLink
-endif
+" since Bram doesn't like my Delimiter :|
+hi def link Delimiter Type
let b:current_syntax = "ayacc"
diff --git a/runtime/syntax/b.vim b/runtime/syntax/b.vim
index b470ab9ef3..01532be75d 100644
--- a/runtime/syntax/b.vim
+++ b/runtime/syntax/b.vim
@@ -5,11 +5,8 @@
" LastChange: 8 Dec 2007
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -69,58 +66,48 @@ syn region bPreProc start="^\s*#\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error
syn sync ccomment bComment minlines=10
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-
-if version >= 508 || !exists("did_b_syntax_inits")
- if version < 508
- let did_b_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default methods for highlighting. Can be overridden later
- HiLink bLabel Label
- HiLink bUserLabel Label
- HiLink bConditional Conditional
- HiLink bRepeat Repeat
- HiLink bLogic Special
- HiLink bCharacter Character
- HiLink bSpecialCharacter bSpecial
- HiLink bNumber Number
- HiLink bFloat Float
- HiLink bOctalError bError
- HiLink bParenError bError
-" HiLink bInParen bError
- HiLink bCommentError bError
- HiLink bBoolean Identifier
- HiLink bConstant Identifier
- HiLink bGuard Identifier
- HiLink bOperator Operator
- HiLink bKeywords Operator
- HiLink bOps Identifier
- HiLink bStructure Structure
- HiLink bStorageClass StorageClass
- HiLink bInclude Include
- HiLink bPreProc PreProc
- HiLink bDefine Macro
- HiLink bIncluded bString
- HiLink bError Error
- HiLink bStatement Statement
- HiLink bPreCondit PreCondit
- HiLink bType Type
- HiLink bCommentError bError
- HiLink bCommentString bString
- HiLink bComment2String bString
- HiLink bCommentSkip bComment
- HiLink bString String
- HiLink bComment Comment
- HiLink bSpecial SpecialChar
- HiLink bTodo Todo
- "hi link bIdentifier Identifier
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+
+" The default methods for highlighting. Can be overridden later
+hi def link bLabel Label
+hi def link bUserLabel Label
+hi def link bConditional Conditional
+hi def link bRepeat Repeat
+hi def link bLogic Special
+hi def link bCharacter Character
+hi def link bSpecialCharacter bSpecial
+hi def link bNumber Number
+hi def link bFloat Float
+hi def link bOctalError bError
+hi def link bParenError bError
+" hi def link bInParen bError
+hi def link bCommentError bError
+hi def link bBoolean Identifier
+hi def link bConstant Identifier
+hi def link bGuard Identifier
+hi def link bOperator Operator
+hi def link bKeywords Operator
+hi def link bOps Identifier
+hi def link bStructure Structure
+hi def link bStorageClass StorageClass
+hi def link bInclude Include
+hi def link bPreProc PreProc
+hi def link bDefine Macro
+hi def link bIncluded bString
+hi def link bError Error
+hi def link bStatement Statement
+hi def link bPreCondit PreCondit
+hi def link bType Type
+hi def link bCommentError bError
+hi def link bCommentString bString
+hi def link bComment2String bString
+hi def link bCommentSkip bComment
+hi def link bString String
+hi def link bComment Comment
+hi def link bSpecial SpecialChar
+hi def link bTodo Todo
+"hi link bIdentifier Identifier
let b:current_syntax = "b"
diff --git a/runtime/syntax/baan.vim b/runtime/syntax/baan.vim
index 5009218b60..9a42a43918 100644
--- a/runtime/syntax/baan.vim
+++ b/runtime/syntax/baan.vim
@@ -4,15 +4,8 @@
" Originally owned by: Erwin Smit / Her van de Vliert
" Last change: v1.17 2006/04/26 10:40:18
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-"
-if version < 600
- syntax clear
- if exists("baan_fold")
- unlet baan_fold
- endif
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -1894,40 +1887,30 @@ syn keyword baanBshell bclm.productidlicensed
syn keyword baanBshell bclm.set.desktop
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_baan_syn_inits")
- if version < 508
- let did_baan_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink baanConditional Conditional
- HiLink baan3gl Statement
- HiLink baan3glpre PreProc
- HiLink baan4gl Statement
- HiLink baan4glh Statement
- HiLink baansql Statement
- HiLink baansqlh Statement
- HiLink baanDalHook Statement
- HiLink baanNumber Number
- HiLink baanString String
- HiLink baanOpenStringError Error
- HiLink baanConstant Constant
- HiLink baanComment Comment
- HiLink baanCommenth Comment
- HiLink baanUncommented Comment
- HiLink baanDLLUsage Comment
- HiLink baanFunUsage Comment
- HiLink baanIdentifier Normal
- HiLink baanBshell Function
- HiLink baanType Type
- HiLink baanStorageClass StorageClass
+hi def link baanConditional Conditional
+hi def link baan3gl Statement
+hi def link baan3glpre PreProc
+hi def link baan4gl Statement
+hi def link baan4glh Statement
+hi def link baansql Statement
+hi def link baansqlh Statement
+hi def link baanDalHook Statement
+hi def link baanNumber Number
+hi def link baanString String
+hi def link baanOpenStringError Error
+hi def link baanConstant Constant
+hi def link baanComment Comment
+hi def link baanCommenth Comment
+hi def link baanUncommented Comment
+hi def link baanDLLUsage Comment
+hi def link baanFunUsage Comment
+hi def link baanIdentifier Normal
+hi def link baanBshell Function
+hi def link baanType Type
+hi def link baanStorageClass StorageClass
- delcommand HiLink
-endif
let b:current_syntax = "baan"
diff --git a/runtime/syntax/basic.vim b/runtime/syntax/basic.vim
index c72032da27..488ddc0ec4 100644
--- a/runtime/syntax/basic.vim
+++ b/runtime/syntax/basic.vim
@@ -8,11 +8,8 @@
" This syntax file not a complete implementation yet. Send suggestions to the
" maintainer.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -143,34 +140,24 @@ syn match basicFilenumber "#\d\+"
syn match basicMathsOperator "-\|=\|[:<>+\*^/\\]\|AND\|OR"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_basic_syntax_inits")
- if version < 508
- let did_basic_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink basicLabel Label
- HiLink basicConditional Conditional
- HiLink basicRepeat Repeat
- HiLink basicLineNumber Comment
- HiLink basicNumber Number
- HiLink basicError Error
- HiLink basicStatement Statement
- HiLink basicString String
- HiLink basicComment Comment
- HiLink basicSpecial Special
- HiLink basicTodo Todo
- HiLink basicFunction Identifier
- HiLink basicTypeSpecifier Type
- HiLink basicFilenumber basicTypeSpecifier
- "hi basicMathsOperator term=bold cterm=bold gui=bold
+hi def link basicLabel Label
+hi def link basicConditional Conditional
+hi def link basicRepeat Repeat
+hi def link basicLineNumber Comment
+hi def link basicNumber Number
+hi def link basicError Error
+hi def link basicStatement Statement
+hi def link basicString String
+hi def link basicComment Comment
+hi def link basicSpecial Special
+hi def link basicTodo Todo
+hi def link basicFunction Identifier
+hi def link basicTypeSpecifier Type
+hi def link basicFilenumber basicTypeSpecifier
+"hi basicMathsOperator term=bold cterm=bold gui=bold
- delcommand HiLink
-endif
let b:current_syntax = "basic"
diff --git a/runtime/syntax/bc.vim b/runtime/syntax/bc.vim
index 965afc35b1..4cd9d6388a 100644
--- a/runtime/syntax/bc.vim
+++ b/runtime/syntax/bc.vim
@@ -5,11 +5,8 @@
" (Dominique Pelle added @Spell)
" Available on: www.gjh.sk/~vlado/bc.vim
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -53,27 +50,17 @@ syn match bcParenError ")"
syn case match
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_bc_syntax_inits")
- if version < 508
- let did_bc_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink bcKeyword Statement
- HiLink bcType Type
- HiLink bcConstant Constant
- HiLink bcNumber Number
- HiLink bcComment Comment
- HiLink bcString String
- HiLink bcSpecialChar SpecialChar
- HiLink bcParenError Error
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link bcKeyword Statement
+hi def link bcType Type
+hi def link bcConstant Constant
+hi def link bcNumber Number
+hi def link bcComment Comment
+hi def link bcString String
+hi def link bcSpecialChar SpecialChar
+hi def link bcParenError Error
+
let b:current_syntax = "bc"
" vim: ts=8
diff --git a/runtime/syntax/bdf.vim b/runtime/syntax/bdf.vim
index d0c73eb601..cc1a337569 100644
--- a/runtime/syntax/bdf.vim
+++ b/runtime/syntax/bdf.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: BDF font definition
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: BDF font definition
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/bib.vim b/runtime/syntax/bib.vim
index f84d5ca95a..ac8dcda678 100644
--- a/runtime/syntax/bib.vim
+++ b/runtime/syntax/bib.vim
@@ -2,17 +2,14 @@
" Language: BibTeX (bibliographic database format for (La)TeX)
" Maintainer: Bernd Feige <Bernd.Feige@gmx.net>
" Filenames: *.bib
-" Last Change: 2014 Mar 26
+" Last Change: 2017 Sep 29
" Thanks to those who pointed out problems with this file or supplied fixes!
" Initialization
" ==============
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -35,14 +32,46 @@ syn keyword bibEntryKw contained crossref edition editor howpublished
syn keyword bibEntryKw contained institution journal key month note
syn keyword bibEntryKw contained number organization pages publisher
syn keyword bibEntryKw contained school series title type volume year
+
+" biblatex keywords, cf. http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf
+syn keyword bibType contained mvbook bookinbook suppbook collection mvcollection suppcollection
+syn keyword bibType contained online patent periodical suppperiodical mvproceedings reference
+syn keyword bibType contained mvreference inreference report set thesis xdata customa customb
+syn keyword bibType contained customc customd custome customf electronic www artwork audio bibnote
+syn keyword bibType contained commentary image jurisdiction legislation legal letter movie music
+syn keyword bibType contained performance review software standard video
+
+syn keyword bibEntryKw contained abstract isbn issn keywords url
+syn keyword bibEntryKw contained addendum afterwordannotation annotation annotator authortype
+syn keyword bibEntryKw contained bookauthor bookpagination booksubtitle booktitleaddon
+syn keyword bibEntryKw contained commentator date doi editora editorb editorc editortype
+syn keyword bibEntryKw contained editoratype editorbtype editorctype eid entrysubtype
+syn keyword bibEntryKw contained eprint eprintclass eprinttype eventdate eventtitle
+syn keyword bibEntryKw contained eventtitleaddon file foreword holder indextitle
+syn keyword bibEntryKw contained introduction isan ismn isrn issue issuesubtitle
+syn keyword bibEntryKw contained issuetitle iswc journalsubtitle journaltitle label
+syn keyword bibEntryKw contained language library location mainsubtitle maintitle
+syn keyword bibEntryKw contained maintitleaddon nameaddon origdate origlanguage
+syn keyword bibEntryKw contained origlocation origpublisher origtitle pagetotal
+syn keyword bibEntryKw contained pagination part pubstate reprinttitle shortauthor
+syn keyword bibEntryKw contained shorteditor shorthand shorthandintro shortjournal
+syn keyword bibEntryKw contained shortseries shorttitle subtitle titleaddon translator
+syn keyword bibEntryKw contained urldate venue version volumes entryset execute gender
+syn keyword bibEntryKw contained langid langidopts ids indexsorttitle options presort
+syn keyword bibEntryKw contained related relatedoptions relatedtype relatedstring
+syn keyword bibEntryKw contained sortkey sortname sortshorthand sorttitle sortyear xdata
+syn keyword bibEntryKw contained xref namea nameb namec nameatype namebtype namectype
+syn keyword bibEntryKw contained lista listb listc listd liste listf usera userb userc
+syn keyword bibEntryKw contained userd usere userf verba verbb verbc archiveprefix pdf
+syn keyword bibEntryKw contained primaryclass
+
" Non-standard:
-syn keyword bibNSEntryKw contained abstract isbn issn keywords url
" AMS mref http://www.ams.org/mref
syn keyword bibNSEntryKw contained mrclass mrnumber mrreviewer fjournal coden
" Clusters
" ========
-syn cluster bibVarContents contains=bibUnescapedSpecial,bibBrace,bibParen
+syn cluster bibVarContents contains=bibUnescapedSpecial,bibBrace,bibParen,bibMath
" This cluster is empty but things can be added externally:
"syn cluster bibCommentContents
@@ -52,19 +81,18 @@ syn match bibUnescapedSpecial contained /[^\\][%&]/hs=s+1
syn match bibKey contained /\s*[^ \t}="]\+,/hs=s,he=e-1 nextgroup=bibField
syn match bibVariable contained /[^{}," \t=]/
syn region bibComment start=/./ end=/^\s*@/me=e-1 contains=@bibCommentContents nextgroup=bibEntry
+syn region bibMath contained start=/\(\\\)\@<!\$/ end=/\$/ skip=/\(\\\$\)/
syn region bibQuote contained start=/"/ end=/"/ skip=/\(\\"\)/ contains=@bibVarContents
syn region bibBrace contained start=/{/ end=/}/ skip=/\(\\[{}]\)/ contains=@bibVarContents
syn region bibParen contained start=/(/ end=/)/ skip=/\(\\[()]\)/ contains=@bibVarContents
syn region bibField contained start="\S\+\s*=\s*" end=/[}),]/me=e-1 contains=bibEntryKw,bibNSEntryKw,bibBrace,bibParen,bibQuote,bibVariable
-syn region bibEntryData contained start=/[{(]/ms=e+1 end=/[})]/me=e-1 contains=bibKey,bibField
+syn region bibEntryData contained start=/[{(]/ms=e+1 end=/[})]/me=e-1 contains=bibKey,bibField,bibComment3
" Actually, 5.8 <= Vim < 6.0 would ignore the `fold' keyword anyway, but Vim<5.8 would produce
" an error, so we explicitly distinguish versions with and without folding functionality:
-if version < 600
- syn region bibEntry start=/@\S\+\s*[{(]/ end=/^\s*[})]/ transparent contains=bibType,bibEntryData nextgroup=bibComment
-else
- syn region bibEntry start=/@\S\+\s*[{(]/ end=/^\s*[})]/ transparent fold contains=bibType,bibEntryData nextgroup=bibComment
-endif
+syn region bibEntry start=/@\S\+\s*[{(]/ end=/^\s*[})]/ transparent fold contains=bibType,bibEntryData nextgroup=bibComment
syn region bibComment2 start=/@Comment\s*[{(]/ end=/^\s*[})]/me=e-1 contains=@bibCommentContents nextgroup=bibEntry
+" biblatex style comments inside a bibEntry
+syn match bibComment3 "%.*"
" Synchronization
" ===============
@@ -75,25 +103,17 @@ syn sync minlines=50
" Highlighting defaults
" =====================
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_bib_syn_inits")
- if version < 508
- let did_bib_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink bibType Identifier
- HiLink bibEntryKw Statement
- HiLink bibNSEntryKw PreProc
- HiLink bibKey Special
- HiLink bibVariable Constant
- HiLink bibUnescapedSpecial Error
- HiLink bibComment Comment
- HiLink bibComment2 Comment
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link bibType Identifier
+hi def link bibEntryKw Statement
+hi def link bibNSEntryKw PreProc
+hi def link bibKey Special
+hi def link bibVariable Constant
+hi def link bibUnescapedSpecial Error
+hi def link bibComment Comment
+hi def link bibComment2 Comment
+hi def link bibComment3 Comment
let b:current_syntax = "bib"
diff --git a/runtime/syntax/bindzone.vim b/runtime/syntax/bindzone.vim
index d599a85db2..df3c789d98 100644
--- a/runtime/syntax/bindzone.vim
+++ b/runtime/syntax/bindzone.vim
@@ -9,11 +9,8 @@
"
" $Id: bindzone.vim 12 2011-07-16 21:09:57Z julian $
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -70,40 +67,30 @@ syn region zoneParen contained start="(" end=")" contains=zoneSerial,
syn match zoneComment /;.*/
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_bind_zone_syn_inits")
- if version < 508
- let did_bind_zone_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink zoneDirective Macro
-
- HiLink zoneUnknown Error
-
- HiLink zoneOrigin Statement
- HiLink zoneOwnerName Statement
- HiLink zoneDomain Identifier
-
- HiLink zoneSpecial Special
- HiLink zoneTTL Constant
- HiLink zoneClass Include
- HiLink zoneRRType Type
-
- HiLink zoneIPAddr Number
- HiLink zoneIP6Addr Number
- HiLink zoneText String
- HiLink zoneNumber Number
- HiLink zoneSerial Special
-
- HiLink zoneErrParen Error
- HiLink zoneComment Comment
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link zoneDirective Macro
+
+hi def link zoneUnknown Error
+
+hi def link zoneOrigin Statement
+hi def link zoneOwnerName Statement
+hi def link zoneDomain Identifier
+
+hi def link zoneSpecial Special
+hi def link zoneTTL Constant
+hi def link zoneClass Include
+hi def link zoneRRType Type
+
+hi def link zoneIPAddr Number
+hi def link zoneIP6Addr Number
+hi def link zoneText String
+hi def link zoneNumber Number
+hi def link zoneSerial Special
+
+hi def link zoneErrParen Error
+hi def link zoneComment Comment
+
let b:current_syntax = "bindzone"
diff --git a/runtime/syntax/blank.vim b/runtime/syntax/blank.vim
index 60251c966c..6d2e3fd7bd 100644
--- a/runtime/syntax/blank.vim
+++ b/runtime/syntax/blank.vim
@@ -3,11 +3,8 @@
" Maintainer: Rafal M. Sulejman <unefunge@friko2.onet.pl>
" Last change: 2011 Dec 28 by Thilo Six
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -28,22 +25,12 @@ syn match blankNumber "\[[0-9]\+\]"
syn case match
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_blank_syntax_inits")
- if version < 508
- let did_blank_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink blankInstruction Statement
- HiLink blankNumber Number
- HiLink blankString String
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link blankInstruction Statement
+hi def link blankNumber Number
+hi def link blankString String
+
let b:current_syntax = "blank"
diff --git a/runtime/syntax/bst.vim b/runtime/syntax/bst.vim
index e7836d7811..5ebef16460 100644
--- a/runtime/syntax/bst.vim
+++ b/runtime/syntax/bst.vim
@@ -4,21 +4,12 @@
" Filenames: *.bst
" $Id: bst.vim,v 1.2 2007/05/05 18:24:42 vimboss Exp $
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
-if version < 600
- command -nargs=1 SetIsk set iskeyword=<args>
-else
- command -nargs=1 SetIsk setlocal iskeyword=<args>
-endif
-SetIsk 48-57,#,$,',.,A-Z,a-z
-delcommand SetIsk
+setlocal iskeyword=48-57,#,$,',.,A-Z,a-z
syn case ignore
@@ -62,27 +53,17 @@ syn keyword bstField title type
syn keyword bstField volume year
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_bst_syn_inits")
- if version < 508
- let did_bst_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink bstComment Comment
- HiLink bstString String
- HiLink bstCommand PreProc
- HiLink bstBuiltIn Statement
- HiLink bstField Special
- HiLink bstNumber Number
- HiLink bstType Type
- HiLink bstIdentifier Identifier
- HiLink bstError Error
- delcommand HiLink
-endif
+hi def link bstComment Comment
+hi def link bstString String
+hi def link bstCommand PreProc
+hi def link bstBuiltIn Statement
+hi def link bstField Special
+hi def link bstNumber Number
+hi def link bstType Type
+hi def link bstIdentifier Identifier
+hi def link bstError Error
let b:current_syntax = "bst"
diff --git a/runtime/syntax/btm.vim b/runtime/syntax/btm.vim
index 4fd5b2db99..4f9253ff9f 100644
--- a/runtime/syntax/btm.vim
+++ b/runtime/syntax/btm.vim
@@ -11,11 +11,8 @@
"//- After unary operators like "defined" can assume token type.
"// Should there be more of these?
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -184,45 +181,35 @@ syn keyword btmCommand unlock unset ver verify vol
syn keyword btmCommand vscrput y
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_btm_syntax_inits")
- if version < 508
- let did_btm_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink btmLabel Special
- HiLink btmLabelMark Special
- HiLink btmCmdDivider Special
- HiLink btmConditional btmStatement
- HiLink btmDotBoolOp btmStatement
- HiLink btmRepeat btmStatement
- HiLink btmEchoCommand btmStatement
- HiLink btmEchoParam btmStatement
- HiLink btmStatement Statement
- HiLink btmTodo Todo
- HiLink btmString String
- HiLink btmNumber Number
- HiLink btmComment Comment
- HiLink btmArgument Identifier
- HiLink btmVariable Identifier
- HiLink btmEcho String
- HiLink btmBIFMatch btmStatement
- HiLink btmBuiltInFunc btmStatement
- HiLink btmBuiltInVar btmStatement
- HiLink btmSpecialVar btmStatement
- HiLink btmCommand btmStatement
-
- "optional highlighting
- "HiLink btmShowTab Error
- "HiLink btmShowTabc Error
- "hiLink btmIdentifier Identifier
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link btmLabel Special
+hi def link btmLabelMark Special
+hi def link btmCmdDivider Special
+hi def link btmConditional btmStatement
+hi def link btmDotBoolOp btmStatement
+hi def link btmRepeat btmStatement
+hi def link btmEchoCommand btmStatement
+hi def link btmEchoParam btmStatement
+hi def link btmStatement Statement
+hi def link btmTodo Todo
+hi def link btmString String
+hi def link btmNumber Number
+hi def link btmComment Comment
+hi def link btmArgument Identifier
+hi def link btmVariable Identifier
+hi def link btmEcho String
+hi def link btmBIFMatch btmStatement
+hi def link btmBuiltInFunc btmStatement
+hi def link btmBuiltInVar btmStatement
+hi def link btmSpecialVar btmStatement
+hi def link btmCommand btmStatement
+
+"optional highlighting
+"hi def link btmShowTab Error
+"hi def link btmShowTabc Error
+"hi def link btmIdentifier Identifier
+
let b:current_syntax = "btm"
diff --git a/runtime/syntax/bzr.vim b/runtime/syntax/bzr.vim
index ef5445bf45..43178b8a1a 100644
--- a/runtime/syntax/bzr.vim
+++ b/runtime/syntax/bzr.vim
@@ -11,11 +11,8 @@
" Gioele Barabucci
" for idea of diff highlighting
-" For version 5.x: Clear all syntax items.
-" For version 6.x: Quit when a syntax file was already loaded.
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded.
+if exists("b:current_syntax")
finish
endif
@@ -40,24 +37,14 @@ syn sync clear
syn sync match bzrSync grouphere bzrRegion "^-\{14} This line and the following will be ignored -\{14}$"me=s-1
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already.
-" For version 5.8 and later: only when an item doesn't have highlighting yet.
-if version >= 508 || !exists("did_bzr_syn_inits")
- if version <= 508
- let did_bzr_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink bzrRemoved Constant
- HiLink bzrAdded Identifier
- HiLink bzrModified Special
- HiLink bzrRenamed Special
- HiLink bzrUnchanged Special
- HiLink bzrUnknown Special
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet.
+
+hi def link bzrRemoved Constant
+hi def link bzrAdded Identifier
+hi def link bzrModified Special
+hi def link bzrRenamed Special
+hi def link bzrUnchanged Special
+hi def link bzrUnknown Special
+
let b:current_syntax = "bzr"
diff --git a/runtime/syntax/c.vim b/runtime/syntax/c.vim
index 3fe3256059..95d3455dde 100644
--- a/runtime/syntax/c.vim
+++ b/runtime/syntax/c.vim
@@ -1,7 +1,7 @@
" Vim syntax file
" Language: C
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2016 Apr 10
+" Last Change: 2018 Sep 21
" Quit when a (custom) syntax file was already loaded
if exists("b:current_syntax")
@@ -13,6 +13,14 @@ set cpo&vim
let s:ft = matchstr(&ft, '^\([^.]\)\+')
+" Optional embedded Autodoc parsing
+" To enable it add: let g:c_autodoc = 1
+" to your .vimrc
+if exists("c_autodoc")
+ syn include @cAutodoc <sfile>:p:h/autodoc.vim
+ unlet b:current_syntax
+endif
+
" A bunch of useful C keywords
syn keyword cStatement goto break return continue asm
syn keyword cLabel case default
@@ -212,7 +220,7 @@ if exists("c_comment_strings")
syn match cCommentSkip contained "^\s*\*\($\|\s\+\)"
syn region cCommentString contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=cSpecial,cCommentSkip
syn region cComment2String contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=cSpecial
- syn region cCommentL start="//" skip="\\$" end="$" keepend contains=@cCommentGroup,cComment2String,cCharacter,cNumbersCom,cSpaceError,@Spell
+ syn region cCommentL start="//" skip="\\$" end="$" keepend contains=@cCommentGroup,cComment2String,cCharacter,cNumbersCom,cSpaceError,cWrongComTail,@Spell
if exists("c_no_comment_fold")
" Use "extend" here to have preprocessor lines not terminate halfway a
" comment.
@@ -231,6 +239,7 @@ endif
" keep a // comment separately, it terminates a preproc. conditional
syn match cCommentError display "\*/"
syn match cCommentStartError display "/\*"me=e-1 contained
+syn match cWrongComTail display "\*/"
syn keyword cOperator sizeof
if exists("c_gnu")
@@ -295,7 +304,7 @@ if !exists("c_no_ansi") || exists("c_ansi_constants") || exists("c_gnu")
syn keyword cConstant SCHAR_MIN SINT_MIN SLONG_MIN SSHRT_MIN
syn keyword cConstant SCHAR_MAX SINT_MAX SLONG_MAX SSHRT_MAX
if !exists("c_no_c99")
- syn keyword cConstant __func__
+ syn keyword cConstant __func__ __VA_ARGS__
syn keyword cConstant LLONG_MIN LLONG_MAX ULLONG_MAX
syn keyword cConstant INT8_MIN INT16_MIN INT32_MIN INT64_MIN
syn keyword cConstant INT8_MAX INT16_MAX INT32_MAX INT64_MAX
@@ -311,44 +320,32 @@ if !exists("c_no_ansi") || exists("c_ansi_constants") || exists("c_gnu")
syn keyword cConstant PTRDIFF_MIN PTRDIFF_MAX SIG_ATOMIC_MIN SIG_ATOMIC_MAX
syn keyword cConstant SIZE_MAX WCHAR_MIN WCHAR_MAX WINT_MIN WINT_MAX
endif
- syn keyword cConstant FLT_RADIX FLT_ROUNDS
- syn keyword cConstant FLT_DIG FLT_MANT_DIG FLT_EPSILON
- syn keyword cConstant DBL_DIG DBL_MANT_DIG DBL_EPSILON
- syn keyword cConstant LDBL_DIG LDBL_MANT_DIG LDBL_EPSILON
- syn keyword cConstant FLT_MIN FLT_MAX FLT_MIN_EXP FLT_MAX_EXP
- syn keyword cConstant FLT_MIN_10_EXP FLT_MAX_10_EXP
- syn keyword cConstant DBL_MIN DBL_MAX DBL_MIN_EXP DBL_MAX_EXP
- syn keyword cConstant DBL_MIN_10_EXP DBL_MAX_10_EXP
- syn keyword cConstant LDBL_MIN LDBL_MAX LDBL_MIN_EXP LDBL_MAX_EXP
- syn keyword cConstant LDBL_MIN_10_EXP LDBL_MAX_10_EXP
- syn keyword cConstant HUGE_VAL CLOCKS_PER_SEC NULL
- syn keyword cConstant LC_ALL LC_COLLATE LC_CTYPE LC_MONETARY
- syn keyword cConstant LC_NUMERIC LC_TIME
- syn keyword cConstant SIG_DFL SIG_ERR SIG_IGN
- syn keyword cConstant SIGABRT SIGFPE SIGILL SIGHUP SIGINT SIGSEGV SIGTERM
+ syn keyword cConstant FLT_RADIX FLT_ROUNDS FLT_DIG FLT_MANT_DIG FLT_EPSILON DBL_DIG DBL_MANT_DIG DBL_EPSILON
+ syn keyword cConstant LDBL_DIG LDBL_MANT_DIG LDBL_EPSILON FLT_MIN FLT_MAX FLT_MIN_EXP FLT_MAX_EXP FLT_MIN_10_EXP FLT_MAX_10_EXP
+ syn keyword cConstant DBL_MIN DBL_MAX DBL_MIN_EXP DBL_MAX_EXP DBL_MIN_10_EXP DBL_MAX_10_EXP LDBL_MIN LDBL_MAX LDBL_MIN_EXP LDBL_MAX_EXP
+ syn keyword cConstant LDBL_MIN_10_EXP LDBL_MAX_10_EXP HUGE_VAL CLOCKS_PER_SEC NULL LC_ALL LC_COLLATE LC_CTYPE LC_MONETARY
+ syn keyword cConstant LC_NUMERIC LC_TIME SIG_DFL SIG_ERR SIG_IGN SIGABRT SIGFPE SIGILL SIGHUP SIGINT SIGSEGV SIGTERM
" Add POSIX signals as well...
- syn keyword cConstant SIGABRT SIGALRM SIGCHLD SIGCONT SIGFPE SIGHUP
- syn keyword cConstant SIGILL SIGINT SIGKILL SIGPIPE SIGQUIT SIGSEGV
- syn keyword cConstant SIGSTOP SIGTERM SIGTRAP SIGTSTP SIGTTIN SIGTTOU
- syn keyword cConstant SIGUSR1 SIGUSR2
- syn keyword cConstant _IOFBF _IOLBF _IONBF BUFSIZ EOF WEOF
- syn keyword cConstant FOPEN_MAX FILENAME_MAX L_tmpnam
- syn keyword cConstant SEEK_CUR SEEK_END SEEK_SET
- syn keyword cConstant TMP_MAX stderr stdin stdout
- syn keyword cConstant EXIT_FAILURE EXIT_SUCCESS RAND_MAX
+ syn keyword cConstant SIGABRT SIGALRM SIGCHLD SIGCONT SIGFPE SIGHUP SIGILL SIGINT SIGKILL SIGPIPE SIGQUIT SIGSEGV
+ syn keyword cConstant SIGSTOP SIGTERM SIGTRAP SIGTSTP SIGTTIN SIGTTOU SIGUSR1 SIGUSR2
+ syn keyword cConstant _IOFBF _IOLBF _IONBF BUFSIZ EOF WEOF FOPEN_MAX FILENAME_MAX L_tmpnam
+ syn keyword cConstant SEEK_CUR SEEK_END SEEK_SET TMP_MAX stderr stdin stdout EXIT_FAILURE EXIT_SUCCESS RAND_MAX
" POSIX 2001
- syn keyword cConstant SIGBUS SIGPOLL SIGPROF SIGSYS SIGURG
- syn keyword cConstant SIGVTALRM SIGXCPU SIGXFSZ
+ syn keyword cConstant SIGBUS SIGPOLL SIGPROF SIGSYS SIGURG SIGVTALRM SIGXCPU SIGXFSZ
" non-POSIX signals
syn keyword cConstant SIGWINCH SIGINFO
- " Add POSIX errors as well
- syn keyword cConstant E2BIG EACCES EAGAIN EBADF EBADMSG EBUSY
- syn keyword cConstant ECANCELED ECHILD EDEADLK EDOM EEXIST EFAULT
- syn keyword cConstant EFBIG EILSEQ EINPROGRESS EINTR EINVAL EIO EISDIR
- syn keyword cConstant EMFILE EMLINK EMSGSIZE ENAMETOOLONG ENFILE ENODEV
- syn keyword cConstant ENOENT ENOEXEC ENOLCK ENOMEM ENOSPC ENOSYS
- syn keyword cConstant ENOTDIR ENOTEMPTY ENOTSUP ENOTTY ENXIO EPERM
- syn keyword cConstant EPIPE ERANGE EROFS ESPIPE ESRCH ETIMEDOUT EXDEV
+ " Add POSIX errors as well. List comes from:
+ " http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html
+ syn keyword cConstant E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT EAGAIN EALREADY EBADF
+ syn keyword cConstant EBADMSG EBUSY ECANCELED ECHILD ECONNABORTED ECONNREFUSED ECONNRESET EDEADLK
+ syn keyword cConstant EDESTADDRREQ EDOM EDQUOT EEXIST EFAULT EFBIG EHOSTUNREACH EIDRM EILSEQ
+ syn keyword cConstant EINPROGRESS EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK EMSGSIZE
+ syn keyword cConstant EMULTIHOP ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH ENFILE ENOBUFS ENODATA
+ syn keyword cConstant ENODEV ENOENT ENOEXEC ENOLCK ENOLINK ENOMEM ENOMSG ENOPROTOOPT ENOSPC ENOSR
+ syn keyword cConstant ENOSTR ENOSYS ENOTCONN ENOTDIR ENOTEMPTY ENOTRECOVERABLE ENOTSOCK ENOTSUP
+ syn keyword cConstant ENOTTY ENXIO EOPNOTSUPP EOVERFLOW EOWNERDEAD EPERM EPIPE EPROTO
+ syn keyword cConstant EPROTONOSUPPORT EPROTOTYPE ERANGE EROFS ESPIPE ESRCH ESTALE ETIME ETIMEDOUT
+ syn keyword cConstant ETXTBSY EWOULDBLOCK EXDEV
" math.h
syn keyword cConstant M_E M_LOG2E M_LOG10E M_LN2 M_LN10 M_PI M_PI_2 M_PI_4
syn keyword cConstant M_1_PI M_2_PI M_2_SQRTPI M_SQRT2 M_SQRT1_2
@@ -358,11 +355,11 @@ if !exists("c_no_c99") " ISO C99
endif
" Accept %: for # (C99)
-syn region cPreCondit start="^\s*\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" keepend contains=cComment,cCommentL,cCppString,cCharacter,cCppParen,cParenError,cNumbers,cCommentError,cSpaceError
-syn match cPreConditMatch display "^\s*\(%:\|#\)\s*\(else\|endif\)\>"
+syn region cPreCondit start="^\s*\zs\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" keepend contains=cComment,cCommentL,cCppString,cCharacter,cCppParen,cParenError,cNumbers,cCommentError,cSpaceError
+syn match cPreConditMatch display "^\s*\zs\(%:\|#\)\s*\(else\|endif\)\>"
if !exists("c_no_if0")
syn cluster cCppOutInGroup contains=cCppInIf,cCppInElse,cCppInElse2,cCppOutIf,cCppOutIf2,cCppOutElse,cCppInSkip,cCppOutSkip
- syn region cCppOutWrapper start="^\s*\(%:\|#\)\s*if\s\+0\+\s*\($\|//\|/\*\|&\)" end=".\@=\|$" contains=cCppOutIf,cCppOutElse,@NoSpell fold
+ syn region cCppOutWrapper start="^\s*\zs\(%:\|#\)\s*if\s\+0\+\s*\($\|//\|/\*\|&\)" end=".\@=\|$" contains=cCppOutIf,cCppOutElse,@NoSpell fold
syn region cCppOutIf contained start="0\+" matchgroup=cCppOutWrapper end="^\s*\(%:\|#\)\s*endif\>" contains=cCppOutIf2,cCppOutElse
if !exists("c_no_if0_fold")
syn region cCppOutIf2 contained matchgroup=cCppOutWrapper start="0\+" end="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0\+\s*\($\|//\|/\*\|&\)\)\@!\|endif\>\)"me=s-1 contains=cSpaceError,cCppOutSkip,@Spell fold
@@ -370,7 +367,7 @@ if !exists("c_no_if0")
syn region cCppOutIf2 contained matchgroup=cCppOutWrapper start="0\+" end="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0\+\s*\($\|//\|/\*\|&\)\)\@!\|endif\>\)"me=s-1 contains=cSpaceError,cCppOutSkip,@Spell
endif
syn region cCppOutElse contained matchgroup=cCppOutWrapper start="^\s*\(%:\|#\)\s*\(else\|elif\)" end="^\s*\(%:\|#\)\s*endif\>"me=s-1 contains=TOP,cPreCondit
- syn region cCppInWrapper start="^\s*\(%:\|#\)\s*if\s\+0*[1-9]\d*\s*\($\|//\|/\*\||\)" end=".\@=\|$" contains=cCppInIf,cCppInElse fold
+ syn region cCppInWrapper start="^\s*\zs\(%:\|#\)\s*if\s\+0*[1-9]\d*\s*\($\|//\|/\*\||\)" end=".\@=\|$" contains=cCppInIf,cCppInElse fold
syn region cCppInIf contained matchgroup=cCppInWrapper start="\d\+" end="^\s*\(%:\|#\)\s*endif\>" contains=TOP,cPreCondit
if !exists("c_no_if0_fold")
syn region cCppInElse contained start="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0*[1-9]\d*\s*\($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=cCppInIf contains=cCppInElse2 fold
@@ -383,11 +380,18 @@ if !exists("c_no_if0")
endif
syn region cIncluded display contained start=+"+ skip=+\\\\\|\\"+ end=+"+
syn match cIncluded display contained "<[^>]*>"
-syn match cInclude display "^\s*\(%:\|#\)\s*include\>\s*["<]" contains=cIncluded
+syn match cInclude display "^\s*\zs\(%:\|#\)\s*include\>\s*["<]" contains=cIncluded
"syn match cLineSkip "\\$"
syn cluster cPreProcGroup contains=cPreCondit,cIncluded,cInclude,cDefine,cErrInParen,cErrInBracket,cUserLabel,cSpecial,cOctalZero,cCppOutWrapper,cCppInWrapper,@cCppOutInGroup,cFormat,cNumber,cFloat,cOctal,cOctalError,cNumbersCom,cString,cCommentSkip,cCommentString,cComment2String,@cCommentGroup,cCommentStartError,cParen,cBracket,cMulti,cBadBlock
-syn region cDefine start="^\s*\(%:\|#\)\s*\(define\|undef\)\>" skip="\\$" end="$" keepend contains=ALLBUT,@cPreProcGroup,@Spell
-syn region cPreProc start="^\s*\(%:\|#\)\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@cPreProcGroup,@Spell
+syn region cDefine start="^\s*\zs\(%:\|#\)\s*\(define\|undef\)\>" skip="\\$" end="$" keepend contains=ALLBUT,@cPreProcGroup,@Spell
+syn region cPreProc start="^\s*\zs\(%:\|#\)\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@cPreProcGroup,@Spell
+
+" Optional embedded Autodoc parsing
+if exists("c_autodoc")
+ syn match cAutodocReal display contained "\%(//\|[/ \t\v]\*\|^\*\)\@2<=!.*" contains=@cAutodoc containedin=cComment,cCommentL
+ syn cluster cCommentGroup add=cAutodocReal
+ syn cluster cPreProcGroup add=cAutodocReal
+endif
" Highlight User Labels
syn cluster cMultiGroup contains=cIncluded,cSpecial,cCommentSkip,cCommentString,cComment2String,@cCommentGroup,cCommentStartError,cUserCont,cUserLabel,cBitField,cOctalZero,cCppOutWrapper,cCppInWrapper,@cCppOutInGroup,cFormat,cNumber,cFloat,cOctal,cOctalError,cNumbersCom,cCppParen,cCppBracket,cCppString
@@ -396,21 +400,21 @@ if s:ft ==# 'c' || exists("cpp_no_cpp11")
endif
" Avoid matching foo::bar() in C++ by requiring that the next char is not ':'
syn cluster cLabelGroup contains=cUserLabel
-syn match cUserCont display "^\s*\I\i*\s*:$" contains=@cLabelGroup
-syn match cUserCont display ";\s*\I\i*\s*:$" contains=@cLabelGroup
+syn match cUserCont display "^\s*\zs\I\i*\s*:$" contains=@cLabelGroup
+syn match cUserCont display ";\s*\zs\I\i*\s*:$" contains=@cLabelGroup
if s:ft ==# 'cpp'
- syn match cUserCont display "^\s*\%(class\|struct\|enum\)\@!\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup
- syn match cUserCont display ";\s*\%(class\|struct\|enum\)\@!\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup
+ syn match cUserCont display "^\s*\zs\%(class\|struct\|enum\)\@!\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup
+ syn match cUserCont display ";\s*\zs\%(class\|struct\|enum\)\@!\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup
else
- syn match cUserCont display "^\s*\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup
- syn match cUserCont display ";\s*\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup
+ syn match cUserCont display "^\s*\zs\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup
+ syn match cUserCont display ";\s*\zs\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup
endif
syn match cUserLabel display "\I\i*" contained
" Avoid recognizing most bitfields as labels
-syn match cBitField display "^\s*\I\i*\s*:\s*[1-9]"me=e-1 contains=cType
-syn match cBitField display ";\s*\I\i*\s*:\s*[1-9]"me=e-1 contains=cType
+syn match cBitField display "^\s*\zs\I\i*\s*:\s*[1-9]"me=e-1 contains=cType
+syn match cBitField display ";\s*\zs\I\i*\s*:\s*[1-9]"me=e-1 contains=cType
if exists("c_minlines")
let b:c_minlines = c_minlines
@@ -450,6 +454,7 @@ hi def link cErrInBracket cError
hi def link cCommentError cError
hi def link cCommentStartError cError
hi def link cSpaceError cError
+hi def link cWrongComTail cError
hi def link cSpecialError cError
hi def link cCurlyError cError
hi def link cOperator Operator
diff --git a/runtime/syntax/cabal.vim b/runtime/syntax/cabal.vim
index 4130bac894..8af47d4042 100644
--- a/runtime/syntax/cabal.vim
+++ b/runtime/syntax/cabal.vim
@@ -1,8 +1,22 @@
" Vim syntax file
-" Language: Haskell Cabal Build file
-" Maintainer: Vincent Berthoux <twinside@gmail.com>
-" File Types: .cabal
-" Last Change: 2010 May 18
+" Language: Haskell Cabal Build file
+" Author: Vincent Berthoux <twinside@gmail.com>
+" Maintainer: Marcin Szamotulski <profunctor@pm.me>
+" Previous Maintainer: Vincent Berthoux <twinside@gmail.com>
+" File Types: .cabal
+" Last Change: 15 May 2018
+" v1.5: Incorporated changes from
+" https://github.com/sdiehl/haskell-vim-proto/blob/master/vim/syntax/cabal.vim
+" Use `syn keyword` instead of `syn match`.
+" Added cabalStatementRegion to limit matches of keywords, which fixes
+" the highlighting of description's value.
+" Added cabalVersionRegion to limit the scope of cabalVersionOperator
+" and cabalVersion matches.
+" Added cabalLanguage keyword.
+" Added calbalTitle, cabalAuthor and cabalMaintainer syntax groups.
+" Added ! and ^>= operators (calbal 2.0)
+" Added build-type keywords
+" v1.4: Add benchmark support, thanks to Simon Meier
" v1.3: Updated to the last version of cabal
" Added more highlighting for cabal function, true/false
" and version number. Also added missing comment highlighting.
@@ -18,115 +32,210 @@
" v1.0: Cabal syntax in vimball format
" (thanks to Magnus Therning)
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
-syn keyword cabalCategory Library library Executable executable Flag flag
-syn keyword cabalCategory source-repository Source-Repository
-
-syn keyword cabalConditional if else
-syn match cabalOperator "&&\|||\|!\|==\|>=\|<="
-syn keyword cabalFunction os arche impl flag
-syn match cabalComment /--.*$/
-syn match cabalVersion "\d\+\(.\(\d\)\+\)\+"
-
-syn match cabalTruth "\ctrue"
-syn match cabalTruth "\cfalse"
-
-syn match cabalCompiler "\cghc"
-syn match cabalCompiler "\cnhc"
-syn match cabalCompiler "\cyhc"
-syn match cabalCompiler "\chugs"
-syn match cabalCompiler "\chbc"
-syn match cabalCompiler "\chelium"
-syn match cabalCompiler "\cjhc"
-syn match cabalCompiler "\clhc"
-
-
-syn match cabalStatement "\cauthor"
-syn match cabalStatement "\cbranch"
-syn match cabalStatement "\cbug-reports"
-syn match cabalStatement "\cbuild-depends"
-syn match cabalStatement "\cbuild-tools"
-syn match cabalStatement "\cbuild-type"
-syn match cabalStatement "\cbuildable"
-syn match cabalStatement "\cc-sources"
-syn match cabalStatement "\ccabal-version"
-syn match cabalStatement "\ccategory"
-syn match cabalStatement "\ccc-options"
-syn match cabalStatement "\ccopyright"
-syn match cabalStatement "\ccpp-options"
-syn match cabalStatement "\cdata-dir"
-syn match cabalStatement "\cdata-files"
-syn match cabalStatement "\cdefault"
-syn match cabalStatement "\cdescription"
-syn match cabalStatement "\cexecutable"
-syn match cabalStatement "\cexposed-modules"
-syn match cabalStatement "\cexposed"
-syn match cabalStatement "\cextensions"
-syn match cabalStatement "\cextra-lib-dirs"
-syn match cabalStatement "\cextra-libraries"
-syn match cabalStatement "\cextra-source-files"
-syn match cabalStatement "\cextra-tmp-files"
-syn match cabalStatement "\cfor example"
-syn match cabalStatement "\cframeworks"
-syn match cabalStatement "\cghc-options"
-syn match cabalStatement "\cghc-prof-options"
-syn match cabalStatement "\cghc-shared-options"
-syn match cabalStatement "\chomepage"
-syn match cabalStatement "\chs-source-dirs"
-syn match cabalStatement "\chugs-options"
-syn match cabalStatement "\cinclude-dirs"
-syn match cabalStatement "\cincludes"
-syn match cabalStatement "\cinstall-includes"
-syn match cabalStatement "\cld-options"
-syn match cabalStatement "\clicense-file"
-syn match cabalStatement "\clicense"
-syn match cabalStatement "\clocation"
-syn match cabalStatement "\cmain-is"
-syn match cabalStatement "\cmaintainer"
-syn match cabalStatement "\cmodule"
-syn match cabalStatement "\cname"
-syn match cabalStatement "\cnhc98-options"
-syn match cabalStatement "\cother-modules"
-syn match cabalStatement "\cpackage-url"
-syn match cabalStatement "\cpkgconfig-depends"
-syn match cabalStatement "\cstability"
-syn match cabalStatement "\csubdir"
-syn match cabalStatement "\csynopsis"
-syn match cabalStatement "\ctag"
-syn match cabalStatement "\ctested-with"
-syn match cabalStatement "\ctype"
-syn match cabalStatement "\cversion"
+" this file uses line continuation
+let s:cpo_save = &cpo
+set cpo&vim
+
+" set iskeyword for this syntax script
+syn iskeyword @,48-57,192-255,-
+
+" Case sensitive matches
+syn case match
+
+syn keyword cabalConditional if else
+syn keyword cabalFunction os arche impl flag
+syn match cabalComment /--.*$/
+
+" Case insensitive matches
+syn case ignore
+
+syn keyword cabalCategory contained
+ \ executable
+ \ library
+ \ benchmark
+ \ test-suite
+ \ source-repository
+ \ flag
+ \ custom-setup
+syn match cabalCategoryTitle contained /[^{]*\ze{\?/
+syn match cabalCategoryRegion
+ \ contains=cabalCategory,cabalCategoryTitle
+ \ nextgroup=cabalCategory skipwhite
+ \ /^\c\s*\(contained\|executable\|library\|benchmark\|test-suite\|source-repository\|flag\|custom-setup\)\+\s*\%(.*$\|$\)/
+syn keyword cabalTruth true false
+
+" cabalStatementRegion which limits the scope of cabalStatement keywords, this
+" way they are not highlighted in description.
+syn region cabalStatementRegion start=+^\s*\(--\)\@<!\k\+\s*:+ end=+:+
+syn keyword cabalStatement contained containedin=cabalStatementRegion
+ \ default-language
+ \ default-extensions
+ \ author
+ \ branch
+ \ bug-reports
+ \ build-depends
+ \ build-tools
+ \ build-type
+ \ buildable
+ \ c-sources
+ \ cabal-version
+ \ category
+ \ cc-options
+ \ copyright
+ \ cpp-options
+ \ data-dir
+ \ data-files
+ \ default
+ \ description
+ \ executable
+ \ exposed-modules
+ \ exposed
+ \ extensions
+ \ extra-tmp-files
+ \ extra-doc-files
+ \ extra-lib-dirs
+ \ extra-libraries
+ \ extra-source-files
+ \ exta-tmp-files
+ \ for example
+ \ frameworks
+ \ ghc-options
+ \ ghc-prof-options
+ \ ghc-shared-options
+ \ homepage
+ \ hs-source-dirs
+ \ hugs-options
+ \ include-dirs
+ \ includes
+ \ install-includes
+ \ ld-options
+ \ license
+ \ license-file
+ \ location
+ \ main-is
+ \ maintainer
+ \ manual
+ \ module
+ \ name
+ \ nhc98-options
+ \ other-extensions
+ \ other-modules
+ \ package-url
+ \ pkgconfig-depends
+ \ setup-depends
+ \ stability
+ \ subdir
+ \ synopsis
+ \ tag
+ \ tested-with
+ \ type
+ \ version
+ \ virtual-modules
+
+" operators and version operators
+syn match cabalOperator /&&\|||\|!/
+syn match cabalVersionOperator contained
+ \ /!\|==\|\^\?>=\|<=\|<\|>/
+" match version: `[%]\@<!` is to exclude `%20` in http addresses.
+syn match cabalVersion contained
+ \ /[%$_-]\@<!\<\d\+\%(\.\d\+\)*\%(\.\*\)\?\>/
+" cabalVersionRegion which limits the scope of cabalVersion pattern.
+syn match cabalVersionRegionA
+ \ contains=cabalVersionOperator,cabalVersion
+ \ keepend
+ \ /\%(==\|\^\?>=\|<=\|<\|>\)\s*\d\+\%(\.\d\+\)*\%(\.\*\)\?\>/
+" version inside `version: ...`
+syn match cabalVersionRegionB
+ \ contains=cabalStatementRegion,cabalVersionOperator,cabalVersion
+ \ /^\s*\%(cabal-\)\?version\s*:.*$/
+
+syn keyword cabalLanguage Haskell98 Haskell2010
+
+" title region
+syn match cabalName contained /:\@<=.*/
+syn match cabalNameRegion
+ \ contains=cabalStatementRegion,cabalName
+ \ nextgroup=cabalStatementRegion
+ \ oneline
+ \ /^\c\s*name\s*:.*$/
+
+" author region
+syn match cabalAuthor contained /:\@<=.*/
+syn match cabalAuthorRegion
+ \ contains=cabalStatementRegion,cabalStatement,cabalAuthor
+ \ nextgroup=cabalStatementRegion
+ \ oneline
+ \ /^\c\s*author\s*:.*$/
+
+" maintainer region
+syn match cabalMaintainer contained /:\@<=.*/
+syn match cabalMaintainerRegion
+ \ contains=cabalStatementRegion,cabalStatement,cabalMaintainer
+ \ nextgroup=cabalStatementRegion
+ \ oneline
+ \ /^\c\s*maintainer\s*:.*$/
+
+" license region
+syn match cabalLicense contained /:\@<=.*/
+syn match cabalLicenseRegion
+ \ contains=cabalStatementRegion,cabalStatement,cabalLicense
+ \ nextgroup=cabalStatementRegion
+ \ oneline
+ \ /^\c\s*license\s*:.*$/
+
+" license-file region
+syn match cabalLicenseFile contained /:\@<=.*/
+syn match cabalLicenseFileRegion
+ \ contains=cabalStatementRegion,cabalStatement,cabalLicenseFile
+ \ nextgroup=cabalStatementRegion
+ \ oneline
+ \ /^\c\s*license-file\s*:.*$/
+
+" tested-with region with compilers and versions
+syn keyword cabalCompiler contained ghc nhc yhc hugs hbc helium jhc lhc
+syn match cabalTestedWithRegion
+ \ contains=cabalStatementRegion,cabalStatement,cabalCompiler,cabalVersionRegionA
+ \ nextgroup=cabalStatementRegion
+ \ oneline
+ \ /^\c\s*tested-with\s*:.*$/
+
+" build type keywords
+syn keyword cabalBuildType contained
+ \ simple custom configure
+syn match cabalBuildTypeRegion
+ \ contains=cabalStatementRegion,cabalStatement,cabalBuildType
+ \ nextgroup=cabalStatementRegion
+ \ /^\c\s*build-type\s*:.*$/
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_cabal_syn_inits")
- if version < 508
- let did_cabal_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink cabalVersion Number
- HiLink cabalTruth Boolean
- HiLink cabalComment Comment
- HiLink cabalStatement Statement
- HiLink cabalCategory Type
- HiLink cabalFunction Function
- HiLink cabalConditional Conditional
- HiLink cabalOperator Operator
- HiLink cabalCompiler Constant
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+hi def link cabalName Title
+hi def link cabalAuthor Normal
+hi def link cabalMaintainer Normal
+hi def link cabalCategoryTitle Title
+hi def link cabalLicense Normal
+hi def link cabalLicenseFile Normal
+hi def link cabalBuildType Keyword
+hi def link cabalVersion Number
+hi def link cabalTruth Boolean
+hi def link cabalComment Comment
+hi def link cabalStatement Statement
+hi def link cabalLanguage Type
+hi def link cabalCategory Type
+hi def link cabalFunction Function
+hi def link cabalConditional Conditional
+hi def link cabalOperator Operator
+hi def link cabalVersionOperator Operator
+hi def link cabalCompiler Constant
let b:current_syntax = "cabal"
+let &cpo = s:cpo_save
+unlet! s:cpo_save
+
" vim: ts=8
diff --git a/runtime/syntax/calendar.vim b/runtime/syntax/calendar.vim
index 588b41a4b8..4250109019 100644
--- a/runtime/syntax/calendar.vim
+++ b/runtime/syntax/calendar.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: calendar(1) input file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: calendar(1) input file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/cdrdaoconf.vim b/runtime/syntax/cdrdaoconf.vim
index 5058c23a24..0fa65103fb 100644
--- a/runtime/syntax/cdrdaoconf.vim
+++ b/runtime/syntax/cdrdaoconf.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: cdrdao(1) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2007-09-02
+" Language: cdrdao(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-09-02
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/cdrtoc.vim b/runtime/syntax/cdrtoc.vim
index fa752dbfb8..866784d7c2 100644
--- a/runtime/syntax/cdrtoc.vim
+++ b/runtime/syntax/cdrtoc.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: cdrdao(1) TOC file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2007-05-10
+" Language: cdrdao(1) TOC file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-05-10
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/cf.vim b/runtime/syntax/cf.vim
index 63d976d9ce..04f9f5967b 100644
--- a/runtime/syntax/cf.vim
+++ b/runtime/syntax/cf.vim
@@ -1,440 +1,1018 @@
" Vim syntax file
-" Language: CFML
-" Maintainer: Toby Woodwark (toby.woodwark+vim@gmail.com)
-" Last Change: 2010-03-02
-" Filenames: *.cfc *.cfm
-" Version: Adobe ColdFusion 9
-" Usage: This file contains both syntax definitions
-" and a list of known builtin tags, functions and keywords.
-" Refs -
-" http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WS8f0cc78011fffa71866534d11cdad96e4e-8000.html
-" http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec17324-8000.html
-" TODO:
-" Support the limited array literal and struct literal syntax in CF8+.
-" Highlight namespaced tags fom cfimport.
-" Complete CF9+ cfscript support.
-" Railo support.
-" Options:
-" d_noinclude_html - set to prevent HTML highlighting. Use this if you are not working on HTML.
-
-" Quit if a syntax file is already loaded.
+"
+" Language: CFML (ColdFusion)
+" Author: Ernst M. van der Linden <ernst.vanderlinden@ernestoz.com>
+" License: The MIT License (MIT)
+"
+" Maintainer: Ernst M. van der Linden <ernst.vanderlinden@ernestoz.com>
+" URL: https://github.com/ernstvanderlinden/vim-coldfusion
+" Last Change: 2017 Nov 28
+"
+" Filenames: *.cfc *.cfm
+
+" Quit when a syntax file was already loaded.
if exists("b:current_syntax")
finish
endif
-if exists("d_noinclude_html")
- " Define alternatives to the HTML syntax file.
-
- " Copied from html.vim - the rules for matching a CF tag match those for HTML/SGML.
- " CFML syntax is more permissive when it comes to superfluous <> chars.
- syn region htmlString contained start=+"+ end=+"+ contains=@htmlPreproc
- syn region htmlString contained start=+'+ end=+'+ contains=@htmlPreproc
- syn match htmlValue contained "=[\t ]*[^'" \t>][^ \t>]*"hs=s+1 contains=@htmlPreproc
- " Hacked htmlTag so that it only matches cf tags and not random <> chars.
- syn region htmlEndTag start=+</cf+ end=+>+ contains=htmlTagN,htmlTagError
- syn region htmlTag start=+<\s*cf[^/]+ end=+>+ contains=htmlTagN,htmlString,htmlArg,htmlValue,htmlTagError,@htmlPreproc,@htmlArgCluster
- syn match htmlTagN contained +<\s*[-a-zA-Z0-9]\++hs=s+1 contains=htmlTagName,@htmlTagNameCluster
- syn match htmlTagN contained +</\s*[-a-zA-Z0-9]\++hs=s+2 contains=htmlTagName,@htmlTagNameCluster
- syn match htmlTagError contained "[^>]<"ms=s+1
-else
- " Use all the stuff from the HTML syntax file.
- " This means eg HTML comments are highlighted as comments, even if they include cf tags.
- runtime! syntax/html.vim
-endif
-
-syn sync fromstart
-syn sync maxlines=200
-syn case ignore
-
-" Scopes and keywords.
-syn keyword cfScope contained cgi cffile cookie request caller this thistag
-syn keyword cfScope contained cfcatch variables application server session client form url local
-syn keyword cfScope contained arguments super cfhttp attributes error
-syn keyword cfBool contained yes no true false
-
-" Operator strings.
-" ColdFusion <=7:
-syn keyword cfOperator contained xor eqv and or lt le lte gt ge gte equal eq neq not is mod contains
-syn match cfOperatorMatch contained "+"
-syn match cfOperatorMatch contained "\-"
-syn match cfOperatorMatch contained "[\*\/\\\^\&][\+\-\*\/\\\^\&]\@!"
-syn match cfOperatorMatch contained "\<\(not\_s\+\)\?equal\>"
-syn match cfOperatorMatch contained "\<does\_s\+not\_s\+contain\>"
-syn match cfOperatorMatch contained "\<\(greater\|less\)\_s\+than\(\_s\+or\_s\+equal\_s\+to\)\?\>"
-" ColdFusion 8:
-syn keyword cfOperator contained imp
-syn match cfOperatorMatch contained "[?%:!]"
-syn match cfOperatorMatch contained "[\+\-\*\/\&]="
-syn match cfOperatorMatch contained "++"
-syn match cfOperatorMatch contained "--"
-syn match cfOperatorMatch contained "&&"
-syn match cfOperatorMatch contained "||"
-
-syn cluster cfOperatorCluster contains=cfOperator,cfOperatorMatch
-
-" Custom tags called with the <cf_xxx> syntax.
-syn match cfCustomTagName contained "\<cf_[a-zA-Z0-9_]\+\>"
-" (TODO match namespaced tags imported using cfimport, similarly.)
-
-" Tag names.
-" ColdFusion <=7:
-syn keyword cfTagName contained cfabort cfapplet cfapplication cfargument cfassociate
-syn keyword cfTagName contained cfbreak cfcache cfcalendar cfcase cfcatch
-syn keyword cfTagName contained cfchart cfchartdata cfchartseries cfcol cfcollection
-syn keyword cfTagName contained cfcomponent cfcontent cfcookie cfdefaultcase cfdirectory
-syn keyword cfTagName contained cfdocument cfdocumentitem cfdocumentsection cfdump cfelse
-syn keyword cfTagName contained cfelseif cferror cfexecute cfexit cffile cfflush cfform
-syn keyword cfTagName contained cfformgroup cfformitem cfftp cffunction
-syn keyword cfTagName contained cfgrid cfgridcolumn cfgridrow cfgridupdate cfheader
-syn keyword cfTagName contained cfhtmlhead cfhttp cfhttpparam cfif cfimport
-syn keyword cfTagName contained cfinclude cfindex cfinput cfinsert cfinvoke cfinvokeargument
-syn keyword cfTagName contained cfldap cflocation cflock cflog cflogin cfloginuser cflogout
-syn keyword cfTagName contained cfloop cfmail cfmailparam cfmailpart cfmodule
-syn keyword cfTagName contained cfNTauthenticate cfobject cfobjectcache cfoutput cfparam
-syn keyword cfTagName contained cfpop cfprocessingdirective cfprocparam cfprocresult
-syn keyword cfTagName contained cfproperty cfquery cfqueryparam cfregistry cfreport
-syn keyword cfTagName contained cfreportparam cfrethrow cfreturn cfsavecontent cfschedule
-syn keyword cfTagName contained cfscript cfsearch cfselect cfservletparam cfset
-syn keyword cfTagName contained cfsetting cfsilent cfslider cfstoredproc cfswitch cftable
-syn keyword cfTagName contained cftextarea cftextinput cfthrow cftimer cftrace cftransaction
-syn keyword cfTagName contained cftree cftreeitem cftry cfupdate cfwddx cfxml
-" ColdFusion 8:
-syn keyword cfTagName contained cfajaximport cfajaxproxy cfdbinfo cfdiv cfexchangecalendar
-syn keyword cfTagName contained cfexchangeconnection cfexchangecontact cfexchangefilter
-syn keyword cfTagName contained cfexchangemail cfexchangetask cffeed
-syn keyword cfTagName contained cfinterface cflayout cflayoutarea cfmenu cfmenuitem
-syn keyword cfTagName contained cfpdf cfpdfform cfpdfformparam cfpdfparam cfpdfsubform cfpod
-syn keyword cfTagName contained cfpresentation cfpresentationslide cfpresenter cfprint
-syn keyword cfTagName contained cfsprydataset cfthread cftooltip cfwindow cfzip cfzipparam
-" ColdFusion 9:
-syn keyword cfTagName contained cfcontinue cffileupload cffinally
-syn keyword cfTagName contained cfimage cfimap
-syn keyword cfTagName contained cfmap cfmapitem cfmediaplayer cfmessagebox
-syn keyword cfTagName contained cfprocparam cfprogressbar
-syn keyword cfTagName contained cfsharepoint cfspreadsheet
-
-" Tag attributes.
-" XXX Not updated for ColdFusion 8/9.
-" These are becoming a headache to maintain, so might be removed.
-syn keyword cfArg contained abort accept access accessible action addnewline addtoken
-syn keyword cfArg contained agentname align appendkey appletsource application
-syn keyword cfArg contained applicationtimeout applicationtoken archive
-syn keyword cfArg contained argumentcollection arguments asciiextensionlist
-syn keyword cfArg contained attachmentpath attributecollection attributes autowidth
-syn keyword cfArg contained backgroundvisible basetag bcc bgcolor bind bindingname
-syn keyword cfArg contained blockfactor body bold border branch cachedafter cachedwithin
-syn keyword cfArg contained casesensitive category categorytree cc cfsqltype charset
-syn keyword cfArg contained chartheight chartwidth checked class clientmanagement
-syn keyword cfArg contained clientstorage codebase colheaderalign colheaderbold
-syn keyword cfArg contained colheaderfont colheaderfontsize colheaderitalic colheaders
-syn keyword cfArg contained colheadertextcolor collection colorlist colspacing columns
-syn keyword cfArg contained completepath component condition connection contentid
-syn keyword cfArg contained context contextbytes contexthighlightbegin
-syn keyword cfArg contained contexthighlightend contextpassages cookiedomain criteria
-syn keyword cfArg contained custom1 custom2 custom3 custom4 data dataalign
-syn keyword cfArg contained databackgroundcolor datacollection datasource daynames
-syn keyword cfArg contained dbname dbserver dbtype dbvarname debug default delete
-syn keyword cfArg contained deletebutton deletefile delimiter delimiters description
-syn keyword cfArg contained destination detail directory disabled display displayname
-syn keyword cfArg contained disposition dn domain editable enablecab enablecfoutputonly
-syn keyword cfArg contained enabled encoded encryption enctype enddate endrange endtime
-syn keyword cfArg contained entry errorcode exception existing expand expires expireurl
-syn keyword cfArg contained expression extendedinfo extends extensions external
-syn keyword cfArg contained failifexists failto file filefield filename filter
-syn keyword cfArg contained firstdayofweek firstrowasheaders fixnewline font fontbold
-syn keyword cfArg contained fontembed fontitalic fontsize foregroundcolor format
-syn keyword cfArg contained formfields formula from generateuniquefilenames getasbinary
-syn keyword cfArg contained grid griddataalign gridlines groovecolor group
-syn keyword cfArg contained groupcasesensitive header headeralign headerbold headerfont
-syn keyword cfArg contained headerfontsize headeritalic headerlines headertextcolor
-syn keyword cfArg contained height highlighthref hint href hrefkey hscroll hspace html
-syn keyword cfArg contained htmltable id idletimeout img imgopen imgstyle index inline
-syn keyword cfArg contained input insert insertbutton interval isolation italic item
-syn keyword cfArg contained itemcolumn key keyonly label labelformat language list
-syn keyword cfArg contained listgroups locale localfile log loginstorage lookandfeel
-syn keyword cfArg contained mailerid mailto marginbottom marginleft marginright
-syn keyword cfArg contained margintop markersize markerstyle mask max maxlength maxrows
-syn keyword cfArg contained message messagenumber method mimeattach mimetype min mode
-syn keyword cfArg contained modifytype monthnames multipart multiple name nameconflict
-syn keyword cfArg contained namespace new newdirectory notsupported null numberformat
-syn keyword cfArg contained object omit onblur onchange onclick onerror onfocus
-syn keyword cfArg contained onkeydown onkeyup onload onmousedown onmouseup onreset
-syn keyword cfArg contained onsubmit onvalidate operation orderby orientation output
-syn keyword cfArg contained outputfile overwrite ownerpassword pageencoding pageheight
-syn keyword cfArg contained pagetype pagewidth paintstyle param_1 param_2 param_3
-syn keyword cfArg contained param_4 param_5 param_6 param_7 param_8 param_9 parent
-syn keyword cfArg contained parrent passive passthrough password path pattern
-syn keyword cfArg contained permissions picturebar pieslicestyle port porttypename
-syn keyword cfArg contained prefix preloader preservedata previouscriteria procedure
-syn keyword cfArg contained protocol provider providerdsn proxybypass proxypassword
-syn keyword cfArg contained proxyport proxyserver proxyuser publish query queryasroot
-syn keyword cfArg contained queryposition range rebind recurse redirect referral
-syn keyword cfArg contained refreshlabel remotefile replyto report requesttimeout
-syn keyword cfArg contained required reset resoleurl resolveurl result resultset
-syn keyword cfArg contained retrycount returnasbinary returncode returntype
-syn keyword cfArg contained returnvariable roles rotated rowheaderalign rowheaderbold
-syn keyword cfArg contained rowheaderfont rowheaderfontsize rowheaderitalic rowheaders
-syn keyword cfArg contained rowheadertextcolor rowheaderwidth rowheight scale scalefrom
-syn keyword cfArg contained scaleto scope scriptprotect scriptsrc secure securitycontext
-syn keyword cfArg contained select selectcolor selected selecteddate selectedindex
-syn keyword cfArg contained selectmode separator seriescolor serieslabel seriesplacement
-syn keyword cfArg contained server serviceport serviceportname sessionmanagement
-syn keyword cfArg contained sessiontimeout setclientcookies setcookie setdomaincookies
-syn keyword cfArg contained show3d showborder showdebugoutput showerror showlegend
-syn keyword cfArg contained showmarkers showxgridlines showygridlines size skin sort
-syn keyword cfArg contained sortascendingbutton sortcontrol sortdescendingbutton
-syn keyword cfArg contained sortxaxis source spoolenable sql src srcfile start startdate
-syn keyword cfArg contained startrange startrow starttime status statuscode statustext
-syn keyword cfArg contained step stoponerror style subject suggestions
-syn keyword cfArg contained suppresswhitespace tablename tableowner tablequalifier
-syn keyword cfArg contained taglib target task template text textcolor textqualifier
-syn keyword cfArg contained throwonerror throwonerror throwonfailure throwontimeout
-syn keyword cfArg contained timeout timespan tipbgcolor tipstyle title to tooltip
-syn keyword cfArg contained toplevelvariable transfermode type uid unit url urlpath
-syn keyword cfArg contained useragent username userpassword usetimezoneinfo validate
-syn keyword cfArg contained validateat value valuecolumn values valuesdelimiter
-syn keyword cfArg contained valuesdisplay var variable vertical visible vscroll vspace
-syn keyword cfArg contained webservice width wmode wraptext wsdlfile xaxistitle
-syn keyword cfArg contained xaxistype xoffset yaxistitle yaxistype yoffset
-
-" Functions.
-" ColdFusion <=7:
-syn keyword cfFunctionName contained ACos ASin Abs AddSOAPRequestHeader AddSOAPResponseHeader
-syn keyword cfFunctionName contained ArrayAppend ArrayAvg ArrayClear ArrayDeleteAt ArrayInsertAt
-syn keyword cfFunctionName contained ArrayIsEmpty ArrayLen ArrayMax ArrayMin ArrayNew
-syn keyword cfFunctionName contained ArrayPrepend ArrayResize ArraySet ArraySort ArraySum
-syn keyword cfFunctionName contained ArraySwap ArrayToList Asc Atn AuthenticatedContext
-syn keyword cfFunctionName contained AuthenticatedUser BinaryDecode BinaryEncode BitAnd
-syn keyword cfFunctionName contained BitMaskClear BitMaskRead BitMaskSet BitNot BitOr BitSHLN
-syn keyword cfFunctionName contained BitSHRN BitXor CJustify Ceiling CharsetDecode CharsetEncode
-syn keyword cfFunctionName contained Chr Compare CompareNoCase Cos CreateDate CreateDateTime
-syn keyword cfFunctionName contained CreateODBCDate CreateODBCDateTime CreateODBCTime
-syn keyword cfFunctionName contained CreateObject CreateTime CreateTimeSpan CreateUUID DE DateAdd
-syn keyword cfFunctionName contained DateCompare DateConvert DateDiff DateFormat DatePart Day
-syn keyword cfFunctionName contained DayOfWeek DayOfWeekAsString DayOfYear DaysInMonth DaysInYear
-syn keyword cfFunctionName contained DecimalFormat DecrementValue Decrypt DecryptBinary
-syn keyword cfFunctionName contained DeleteClientVariable DirectoryExists DollarFormat Duplicate
-syn keyword cfFunctionName contained Encrypt EncryptBinary Evaluate Exp ExpandPath FileExists
-syn keyword cfFunctionName contained Find FindNoCase FindOneOf FirstDayOfMonth Fix FormatBaseN
-syn keyword cfFunctionName contained GenerateSecretKey GetAuthUser GetBaseTagData GetBaseTagList
-syn keyword cfFunctionName contained GetBaseTemplatePath GetClientVariablesList GetContextRoot
-syn keyword cfFunctionName contained GetCurrentTemplatePath GetDirectoryFromPath GetEncoding
-syn keyword cfFunctionName contained GetException GetFileFromPath GetFunctionList
-syn keyword cfFunctionName contained GetGatewayHelper GetHttpRequestData GetHttpTimeString
-syn keyword cfFunctionName contained GetLocalHostIP
-syn keyword cfFunctionName contained GetLocale GetLocaleDisplayName GetMetaData GetMetricData
-syn keyword cfFunctionName contained GetPageContext GetProfileSections GetProfileString
-syn keyword cfFunctionName contained GetSOAPRequest GetSOAPRequestHeader GetSOAPResponse
-syn keyword cfFunctionName contained GetSOAPResponseHeader GetTempDirectory GetTempFile
-syn keyword cfFunctionName contained GetTickCount GetTimeZoneInfo GetToken
-syn keyword cfFunctionName contained HTMLCodeFormat HTMLEditFormat Hash Hour IIf IncrementValue
-syn keyword cfFunctionName contained InputBaseN Insert Int IsArray IsAuthenticated IsAuthorized
-syn keyword cfFunctionName contained IsBinary IsBoolean IsCustomFunction IsDate IsDebugMode
-syn keyword cfFunctionName contained IsDefined
-syn keyword cfFunctionName contained IsLeapYear IsLocalHost IsNumeric
-syn keyword cfFunctionName contained IsNumericDate IsObject IsProtected IsQuery IsSOAPRequest
-syn keyword cfFunctionName contained IsSimpleValue IsStruct IsUserInRole IsValid IsWDDX IsXML
-syn keyword cfFunctionName contained IsXmlAttribute IsXmlDoc IsXmlElem IsXmlNode IsXmlRoot
-syn keyword cfFunctionName contained JSStringFormat JavaCast LCase LJustify LSCurrencyFormat
-syn keyword cfFunctionName contained LSDateFormat LSEuroCurrencyFormat LSIsCurrency LSIsDate
-syn keyword cfFunctionName contained LSIsNumeric LSNumberFormat LSParseCurrency LSParseDateTime
-syn keyword cfFunctionName contained LSParseEuroCurrency LSParseNumber LSTimeFormat LTrim Left
-syn keyword cfFunctionName contained Len ListAppend ListChangeDelims ListContains
-syn keyword cfFunctionName contained ListContainsNoCase ListDeleteAt ListFind ListFindNoCase
-syn keyword cfFunctionName contained ListFirst ListGetAt ListInsertAt ListLast ListLen
-syn keyword cfFunctionName contained ListPrepend ListQualify ListRest ListSetAt ListSort
-syn keyword cfFunctionName contained ListToArray ListValueCount ListValueCountNoCase Log Log10
-syn keyword cfFunctionName contained Max Mid Min Minute Month MonthAsString Now NumberFormat
-syn keyword cfFunctionName contained ParagraphFormat ParseDateTime Pi
-syn keyword cfFunctionName contained PreserveSingleQuotes Quarter QueryAddColumn QueryAddRow
-syn keyword cfFunctionName contained QueryNew QuerySetCell QuotedValueList REFind REFindNoCase
-syn keyword cfFunctionName contained REReplace REReplaceNoCase RJustify RTrim Rand RandRange
-syn keyword cfFunctionName contained Randomize ReleaseComObject RemoveChars RepeatString Replace
-syn keyword cfFunctionName contained ReplaceList ReplaceNoCase Reverse Right Round Second
-syn keyword cfFunctionName contained SendGatewayMessage SetEncoding SetLocale SetProfileString
-syn keyword cfFunctionName contained SetVariable Sgn Sin SpanExcluding SpanIncluding Sqr StripCR
-syn keyword cfFunctionName contained StructAppend StructClear StructCopy StructCount StructDelete
-syn keyword cfFunctionName contained StructFind StructFindKey StructFindValue StructGet
-syn keyword cfFunctionName contained StructInsert StructIsEmpty StructKeyArray StructKeyExists
-syn keyword cfFunctionName contained StructKeyList StructNew StructSort StructUpdate Tan
-syn keyword cfFunctionName contained TimeFormat ToBase64 ToBinary ToScript ToString Trim UCase
-syn keyword cfFunctionName contained URLDecode URLEncodedFormat URLSessionFormat Val ValueList
-syn keyword cfFunctionName contained Week Wrap WriteOutput XmlChildPos XmlElemNew XmlFormat
-syn keyword cfFunctionName contained XmlGetNodeType XmlNew XmlParse XmlSearch XmlTransform
-syn keyword cfFunctionName contained XmlValidate Year YesNoFormat
-" ColdFusion 8:
-syn keyword cfFunctionName contained AjaxLink AjaxOnLoad ArrayIsDefined BinaryDecode BinaryEncode CharsetDecode CharsetEncode
-syn keyword cfFunctionName contained DecryptBinary DeserializeJSON DotNetToCFType EncryptBinary FileClose FileCopy FileDelete
-syn keyword cfFunctionName contained FileIsEOF FileMove FileOpen FileRead FileReadBinary FileReadLine FileSetAccessMode FileSetAttribute
-syn keyword cfFunctionName contained FileSetLastModified FileWrite GenerateSecretKey GetGatewayHelper GetAuthUser GetComponentMetaData
-syn keyword cfFunctionName contained GetContextRoot GetEncoding GetFileInfo GetLocaleDisplayName GetLocalHostIP GetMetaData
-syn keyword cfFunctionName contained GetPageContext GetPrinterInfo GetProfileSections GetReadableImageFormats GetSOAPRequest
-syn keyword cfFunctionName contained GetSOAPRequestHeader GetSOAPResponse GetSOAPResponseHeader GetUserRoles GetWriteableImageFormats
-syn keyword cfFunctionName contained ImageAddBorder ImageBlur ImageClearRect ImageCopy ImageCrop ImageDrawArc ImageDrawBeveledRect
-syn keyword cfFunctionName contained ImageDrawCubicCurve ImageDrawPoint ImageDrawLine ImageDrawLines ImageDrawOval
-syn keyword cfFunctionName contained ImageDrawQuadraticCurve ImageDrawRect ImageDrawRoundRect ImageDrawText ImageFlip ImageGetBlob
-syn keyword cfFunctionName contained ImageGetBufferedImage ImageGetEXIFMetadata ImageGetEXIFTag ImageGetHeight ImageGetIPTCMetadata
-syn keyword cfFunctionName contained ImageGetIPTCTag ImageGetWidth ImageGrayscale ImageInfo ImageNegative ImageNew ImageOverlay
-syn keyword cfFunctionName contained ImagePaste ImageRead ImageReadBase64 ImageResize ImageRotate ImageRotateDrawingAxis ImageScaleToFit
-" ColdFusion 9:
-syn keyword cfFunctionName contained ApplicationStop ArrayContains ArrayDelete ArrayFind ArrayFindNoCase IsSpreadsheetFile
-syn keyword cfFunctionName contained IsSpreadsheetObject FileSkipBytes Location ObjectLoad SpreadsheetFormatColumn
-syn keyword cfFunctionName contained SpreadsheetFormatColumns SpreadsheetFormatRow SpreadsheetFormatRows SpreadsheetGetCellComment
-syn keyword cfFunctionName contained CacheGetAllIds CacheGetMetadata CacheGetProperties CacheGet CachePut ObjectSave ORMClearSession
-syn keyword cfFunctionName contained ORMCloseSession ORMEvictQueries ORMEvictCollection SpreadsheetGetCellFormula SpreadsheetGetCellValue
-syn keyword cfFunctionName contained SpreadsheetInfo SpreadsheetMergeCells SpreadsheetNew CacheRemove CacheSetProperties DirectoryCreate
-syn keyword cfFunctionName contained DirectoryDelete DirectoryExists ORMEvictEntity ORMEvictQueries ORMExecuteQuery ORMFlush
-syn keyword cfFunctionName contained ORMGetSession SpreadsheetRead SpreadsheetReadBinary SpreadsheetSetActiveSheetNumber
-syn keyword cfFunctionName contained SpreadsheetSetCellComment SpreadsheetSetCellFormula DirectoryList DirectoryRename EntityDelete
-syn keyword cfFunctionName contained EntityLoad EntityLoadByExample ORMGetSessionFactory ORMReload ObjectEquals SpreadsheetAddColumn
-syn keyword cfFunctionName contained SpreadsheetAddFreezePane SpreadsheetSetCellValue SpreadsheetSetActiveSheet SpreadsheetSetFooter
-syn keyword cfFunctionName contained SpreadsheetSetHeader SpreadsheetSetColumnWidth EntityLoadByPK EntityMerge EntityNew EntityReload
-syn keyword cfFunctionName contained EntitySave SpreadsheetAddImage SpreadsheetAddInfo SpreadsheetAddRow SpreadsheetAddRows
-syn keyword cfFunctionName contained SpreadsheetAddSplitPane SpreadsheetShiftColumns SpreadsheetShiftRows SpreadsheetSetRowHeight
-syn keyword cfFunctionName contained SpreadsheetWrite Trace FileDelete FileSeek FileWriteLine GetFunctionCalledName GetVFSMetaData IsIPv6
-syn keyword cfFunctionName contained IsNull SpreadsheetCreateSheet SpreadsheetDeleteColumn SpreadsheetDeleteColumns SpreadsheetDeleteRow
-syn keyword cfFunctionName contained SpreadsheetDeleteRows SpreadsheetFormatCell TransactionCommit TransactionRollback
-syn keyword cfFunctionName contained TransactionSetSavePoint ThreadTerminate ThreadJoin Throw Writedump Writelog
-
-" Deprecated or obsoleted tags and functions.
-syn keyword cfDeprecatedTag contained cfauthenticate cfimpersonate cfgraph cfgraphdata
-syn keyword cfDeprecatedTag contained cfservlet cfservletparam cftextinput
-syn keyword cfDeprecatedTag contained cfinternaladminsecurity cfnewinternaladminsecurity
-syn keyword cfDeprecatedFunction contained GetK2ServerDocCount GetK2ServerDocCountLimit GetTemplatePath
-syn keyword cfDeprecatedFunction contained IsK2ServerABroker IsK2ServerDocCountExceeded IsK2ServerOnline
-syn keyword cfDeprecatedFunction contained ParameterExists AuthenticatedContext AuthenticatedUser
-syn keyword cfDeprecatedFunction contained isAuthenticated isAuthorized isProtected
-
-" Add to the HTML clusters.
-syn cluster htmlTagNameCluster add=cfTagName,cfCustomTagName,cfDeprecatedTag
-syn cluster htmlArgCluster add=cfArg,cfHashRegion,cfScope
-syn cluster htmlPreproc add=cfHashRegion
-
-syn cluster cfExpressionCluster contains=cfFunctionName,cfScope,@cfOperatorCluster,cfScriptStringD,cfScriptStringS,cfScriptNumber,cfBool,cfComment
-
-" Evaluation; skip strings ( this helps with cases like nested IIf() )
-" containedin to add to the TOP of cfOutputRegion.
-syn region cfHashRegion start=+#+ skip=+"[^"]*"\|'[^']*'+ end=+#+ contained containedin=cfOutputRegion contains=@cfExpressionCluster,cfScriptParenError
-
-" Hashmarks are significant inside cfoutput tags.
-" cfoutput tags may be nested indefinitely.
-syn region cfOutputRegion matchgroup=NONE transparent start=+<cfoutput>+ end=+</cfoutput>+ contains=TOP
-
-" <cfset>, <cfif>, <cfelseif>, <cfreturn> are analogous to hashmarks (implicit
-" evaluation) and have 'var'
-syn region cfSetRegion start="<cfset\>" start="<cfreturn\>" start="<cfelseif\>" start="<cfif\>" end='>' keepend contains=@cfExpressionCluster,cfSetLHSRegion,cfSetTagEnd,cfScriptStatement
-syn region cfSetLHSRegion contained start="<cfreturn" start="<cfelseif" start="<cfif" start="<cfset" end="." keepend contains=cfTagName,htmlTag
-syn match cfSetTagEnd contained '>'
-
-" CF comments: similar to SGML comments, but can be nested.
-syn region cfComment start='<!---' end='--->' contains=cfCommentTodo,cfComment
-syn keyword cfCommentTodo contained TODO FIXME XXX TBD WTF
-
-" CFscript
-" TODO better support for new component/function def syntax
-" TODO better support for 'new'
-" TODO highlight metadata (@ ...) inside comments.
-syn match cfScriptLineComment contained "\/\/.*$" contains=cfCommentTodo
-syn region cfScriptComment contained start="/\*" end="\*/" contains=cfCommentTodo
-syn match cfScriptBraces contained "[{}]"
-syn keyword cfScriptStatement contained return var
-" in CF, quotes are escaped by doubling
-syn region cfScriptStringD contained start=+"+ skip=+\\\\\|""+ end=+"+ extend contains=@htmlPreproc,cfHashRegion
-syn region cfScriptStringS contained start=+'+ skip=+\\\\\|''+ end=+'+ extend contains=@htmlPreproc,cfHashRegion
-syn match cfScriptNumber contained "\<\d\+\>"
-syn keyword cfScriptConditional contained if else
-syn keyword cfScriptRepeat contained while for in
-syn keyword cfScriptBranch contained break switch case default try catch continue finally
-syn keyword cfScriptKeyword contained function
-" argumentCollection is a special argument to function calls
-syn keyword cfScriptSpecial contained argumentcollection
-" ColdFusion 9:
-syn keyword cfScriptStatement contained new import
-" CFscript equivalents of some tags
-syn keyword cfScriptKeyword contained abort component exit import include
-syn keyword cfScriptKeyword contained interface param pageencoding property rethrow thread transaction
-" function/component syntax
-syn keyword cfScriptSpecial contained required extends
-
-
-syn cluster cfScriptCluster contains=cfScriptParen,cfScriptLineComment,cfScriptComment,cfScriptStringD,cfScriptStringS,cfScriptFunction,cfScriptNumber,cfScriptRegexpString,cfScriptBoolean,cfScriptBraces,cfHashRegion,cfFunctionName,cfDeprecatedFunction,cfScope,@cfOperatorCluster,cfScriptConditional,cfScriptRepeat,cfScriptBranch,@cfExpressionCluster,cfScriptStatement,cfScriptSpecial,cfScriptKeyword
-
-" Errors caused by wrong parenthesis; skip strings
-syn region cfScriptParen contained transparent skip=+"[^"]*"\|'[^']*'+ start=+(+ end=+)+ contains=@cfScriptCluster
-syn match cfScrParenError contained +)+
-
-syn region cfscriptBlock matchgroup=NONE start="<cfscript>" end="<\/cfscript>"me=s-1 keepend contains=@cfScriptCluster,cfscriptTag,cfScrParenError
-syn region cfscriptTag contained start='<cfscript' end='>' keepend contains=cfTagName,htmlTag
-
-" CFML
-syn cluster cfmlCluster contains=cfComment,@htmlTagNameCluster,@htmlPreproc,cfSetRegion,cfscriptBlock,cfOutputRegion
-
-" cfquery = sql syntax
-if exists("b:current_syntax")
- unlet b:current_syntax
-endif
-syn include @cfSql $VIMRUNTIME/syntax/sql.vim
-unlet b:current_syntax
-syn region cfqueryTag contained start=+<cfquery+ end=+>+ keepend contains=cfTagName,htmlTag
-syn region cfSqlregion start=+<cfquery\_[^>]*>+ keepend end=+</cfquery>+me=s-1 matchgroup=NONE contains=@cfSql,cfComment,@htmlTagNameCluster,cfqueryTag,cfHashRegion
-
-" Define the highlighting.
-command -nargs=+ CfHiLink hi def link <args>
-
-if exists("d_noinclude_html")
- " The default html-style highlighting copied from html.vim.
- CfHiLink htmlTag Function
- CfHiLink htmlEndTag Identifier
- CfHiLink htmlArg Type
- CfHiLink htmlTagName htmlStatement
- CfHiLink htmlValue String
- CfHiLink htmlPreProc PreProc
- CfHiLink htmlString String
- CfHiLink htmlStatement Statement
- CfHiLink htmlValue String
- CfHiLink htmlTagError htmlError
- CfHiLink htmlError Error
-endif
-
-CfHiLink cfTagName Statement
-CfHiLink cfCustomTagName Statement
-CfHiLink cfArg Type
-CfHiLink cfFunctionName Function
-CfHiLink cfHashRegion PreProc
-CfHiLink cfComment Comment
-CfHiLink cfCommentTodo Todo
-CfHiLink cfOperator Operator
-CfHiLink cfOperatorMatch Operator
-CfHiLink cfScope Title
-CfHiLink cfBool Constant
-
-CfHiLink cfscriptBlock Special
-CfHiLink cfscriptTag htmlTag
-CfHiLink cfSetRegion PreProc
-CfHiLink cfSetLHSRegion htmlTag
-CfHiLink cfSetTagEnd htmlTag
-
-CfHiLink cfScriptLineComment Comment
-CfHiLink cfScriptComment Comment
-CfHiLink cfScriptStringS String
-CfHiLink cfScriptStringD String
-CfHiLink cfScriptNumber cfScriptValue
-CfHiLink cfScriptConditional Conditional
-CfHiLink cfScriptRepeat Repeat
-CfHiLink cfScriptBranch Conditional
-CfHiLink cfScriptSpecial Type
-CfHiLink cfScriptStatement Statement
-CfHiLink cfScriptBraces Function
-CfHiLink cfScriptKeyword Function
-CfHiLink cfScriptError Error
-CfHiLink cfDeprecatedTag Error
-CfHiLink cfDeprecatedFunction Error
-CfHiLink cfScrParenError cfScriptError
-
-CfHiLink cfqueryTag htmlTag
-
-delcommand CfHiLink
-
-let b:current_syntax = "cf"
-
-" vim: nowrap sw=2 ts=8 noet
+" Using line continuation here.
+let s:cpo_save=&cpo
+set cpo-=C
+
+sy sync fromstart
+" 20171126: disabled as we have fast computers now.
+"sy sync maxlines=2000
+sy case ignore
+
+" INCLUDES {{{
+sy include @sqlSyntax $VIMRUNTIME/syntax/sql.vim
+" 20161010: Disabled include html highlighting as it contains huge keywords
+" regex, so it will have impact on performance. Use own simple SGML tag
+" coloring instead.
+"runtime! syntax/html.vim
+" / INCLUDES }}}
+
+" NUMBER {{{
+sy match cfmlNumber
+ \ "\v<\d+>"
+" / NUMBER }}}
+
+" EQUAL SIGN {{{
+sy match cfmlEqualSign
+ \ "\v\="
+" / EQUAL SIGN }}}
+
+" BOOLEAN {{{
+sy match cfmlBoolean
+ \ "\v<(true|false)>"
+" / BOOLEAN }}}
+
+" HASH SURROUNDED {{{
+sy region cfmlHashSurround
+ \ keepend
+ \ oneline
+ \ start="#"
+ \ end="#"
+ \ skip="##"
+ \ contains=
+ \@cfmlOperator,
+ \@cfmlPunctuation,
+ \cfmlBoolean,
+ \cfmlCoreKeyword,
+ \cfmlCoreScope,
+ \cfmlCustomKeyword,
+ \cfmlCustomScope,
+ \cfmlEqualSign,
+ \cfmlFunctionName,
+ \cfmlNumber
+" / HASH SURROUNDED }}}
+
+" OPERATOR {{{
+
+" OPERATOR - ARITHMETIC {{{
+" +7 -7
+" ++i --i
+" i++ i--
+" + - * / %
+" += -= *= /= %=
+" ^ mod
+sy match cfmlArithmeticOperator
+ \ "\v
+ \(\+|-)\ze\d
+ \|(\+\+|--)\ze\w
+ \|\w\zs(\+\+|--)
+ \|(\s(
+ \(\+|-|\*|\/|\%){1}\={,1}
+ \|\^
+ \|mod
+ \)\s)
+ \"
+" / OPERATOR - ARITHMETIC }}}
+
+" OPERATOR - BOOLEAN {{{
+" not and or xor eqv imp
+" ! && ||
+sy match cfmlBooleanOperator
+ \ "\v\s
+ \(not|and|or|xor|eqv|imp
+ \|\!|\&\&|\|\|
+ \)(\s|\))
+ \|\s\!\ze\w
+ \"
+" / OPERATOR - BOOLEAN }}}
+
+" OPERATOR - DECISION {{{
+"is|equal|eq
+"is not|not equal|neq
+"contains|does not contain
+"greater than|gt
+"less than|lt
+"greater than or equal to|gte|ge
+"less than or equal to|lte|le
+"==|!=|>|<|>=|<=
+sy match cfmlDecisionOperator
+ \ "\v\s
+ \(is|equal|eq
+ \|is not|not equal|neq
+ \|contains|does not contain
+ \|greater than|gt
+ \|less than|lt
+ \|greater than or equal to|gte|ge
+ \|less than or equal to|lte|le
+ \|(!|\<|\>|\=){1}\=
+ \|\<
+ \|\>
+ \)\s"
+" / OPERATOR - DECISION }}}
+
+" OPERATOR - STRING {{{
+" &
+" &=
+sy match cfmlStringOperator
+ \ "\v\s\&\={,1}\s"
+" / OPERATOR - STRING }}}
+
+" OPERATOR - TERNARY {{{
+" ? :
+sy match cfmlTernaryOperator
+ \ "\v\s
+ \\?|\:
+ \\s"
+" / OPERATOR - TERNARY }}}
+
+sy cluster cfmlOperator
+ \ contains=
+ \cfmlArithmeticOperator,
+ \cfmlBooleanOperator,
+ \cfmlDecisionOperator,
+ \cfmlStringOperator,
+ \cfmlTernaryOperator
+" / OPERATOR }}}
+
+" PARENTHESIS {{{
+sy cluster cfmlParenthesisRegionContains
+ \ contains=
+ \@cfmlAttribute,
+ \@cfmlComment,
+ \@cfmlFlowStatement,
+ \@cfmlOperator,
+ \@cfmlPunctuation,
+ \cfmlBoolean,
+ \cfmlBrace,
+ \cfmlCoreKeyword,
+ \cfmlCoreScope,
+ \cfmlCustomKeyword,
+ \cfmlCustomScope,
+ \cfmlEqualSign,
+ \cfmlFunctionName,
+ \cfmlNumber,
+ \cfmlStorageKeyword,
+ \cfmlStorageType
+
+sy region cfmlParenthesisRegion1
+ \ extend
+ \ matchgroup=cfmlParenthesis1
+ \ transparent
+ \ start=/(/
+ \ end=/)/
+ \ contains=
+ \cfmlParenthesisRegion2,
+ \@cfmlParenthesisRegionContains
+sy region cfmlParenthesisRegion2
+ \ matchgroup=cfmlParenthesis2
+ \ transparent
+ \ start=/(/
+ \ end=/)/
+ \ contains=
+ \cfmlParenthesisRegion3,
+ \@cfmlParenthesisRegionContains
+sy region cfmlParenthesisRegion3
+ \ matchgroup=cfmlParenthesis3
+ \ transparent
+ \ start=/(/
+ \ end=/)/
+ \ contains=
+ \cfmlParenthesisRegion1,
+ \@cfmlParenthesisRegionContains
+sy cluster cfmlParenthesisRegion
+ \ contains=
+ \cfmlParenthesisRegion1,
+ \cfmlParenthesisRegion2,
+ \cfmlParenthesisRegion3
+" / PARENTHESIS }}}
+
+" BRACE {{{
+sy match cfmlBrace
+ \ "{\|}"
+
+sy region cfmlBraceRegion
+ \ extend
+ \ fold
+ \ keepend
+ \ transparent
+ \ start="{"
+ \ end="}"
+" / BRACE }}}
+
+" PUNCTUATION {{{
+
+" PUNCTUATION - BRACKET {{{
+sy match cfmlBracket
+ \ "\(\[\|\]\)"
+ \ contained
+" / PUNCTUATION - BRACKET }}}
+
+" PUNCTUATION - CHAR {{{
+sy match cfmlComma ","
+sy match cfmlDot "\."
+sy match cfmlSemiColon ";"
+
+" / PUNCTUATION - CHAR }}}
+
+" PUNCTUATION - QUOTE {{{
+sy region cfmlSingleQuotedValue
+ \ matchgroup=cfmlSingleQuote
+ \ start=/'/
+ \ skip=/''/
+ \ end=/'/
+ \ contains=
+ \cfmlHashSurround
+
+sy region cfmlDoubleQuotedValue
+ \ matchgroup=cfmlDoubleQuote
+ \ start=/"/
+ \ skip=/""/
+ \ end=/"/
+ \ contains=
+ \cfmlHashSurround
+
+sy cluster cfmlQuotedValue
+ \ contains=
+ \cfmlDoubleQuotedValue,
+ \cfmlSingleQuotedValue
+
+sy cluster cfmlQuote
+ \ contains=
+ \cfmlDoubleQuote,
+ \cfmlSingleQuote
+" / PUNCTUATION - QUOTE }}}
+
+sy cluster cfmlPunctuation
+ \ contains=
+ \@cfmlQuote,
+ \@cfmlQuotedValue,
+ \cfmlBracket,
+ \cfmlComma,
+ \cfmlDot,
+ \cfmlSemiColon
+
+" / PUNCTUATION }}}
+
+" TAG START AND END {{{
+" tag start
+" <cf...>
+" s^^ e
+sy region cfmlTagStart
+ \ keepend
+ \ transparent
+ \ start="\c<cf_*"
+ \ end=">"
+\ contains=
+ \@cfmlAttribute,
+ \@cfmlComment,
+ \@cfmlOperator,
+ \@cfmlParenthesisRegion,
+ \@cfmlPunctuation,
+ \@cfmlQuote,
+ \@cfmlQuotedValue,
+ \cfmlAttrEqualSign,
+ \cfmlBoolean,
+ \cfmlBrace,
+ \cfmlCoreKeyword,
+ \cfmlCoreScope,
+ \cfmlCustomKeyword,
+ \cfmlCustomScope,
+ \cfmlEqualSign,
+ \cfmlFunctionName,
+ \cfmlNumber,
+ \cfmlStorageKeyword,
+ \cfmlStorageType,
+ \cfmlTagBracket,
+ \cfmlTagName
+
+" tag end
+" </cf...>
+" s^^^ e
+sy match cfmlTagEnd
+ \ transparent
+ \ "\c</cf_*[^>]*>"
+ \ contains=
+ \cfmlTagBracket,
+ \cfmlTagName
+
+" tag bracket
+" </...>
+" ^^ ^
+sy match cfmlTagBracket
+ \ contained
+ \ "\(<\|>\|\/\)"
+
+" tag name
+" <cf...>
+" s^^^e
+sy match cfmlTagName
+ \ contained
+ \ "\v<\/*\zs\ccf\w*"
+" / TAG START AND END }}}
+
+" ATTRIBUTE NAME AND VALUE {{{
+sy match cfmlAttrName
+ \ contained
+ \ "\v(var\s)@<!\w+\ze\s*\=([^\=])+"
+
+sy match cfmlAttrValue
+ \ contained
+ \ "\v(\=\"*)\zs\s*\w*"
+
+sy match cfmlAttrEqualSign
+ \ contained
+ \ "\v\="
+
+sy cluster cfmlAttribute
+\ contains=
+ \@cfmlQuotedValue,
+ \cfmlAttrEqualSign,
+ \cfmlAttrName,
+ \cfmlAttrValue,
+ \cfmlCoreKeyword,
+ \cfmlCoreScope
+" / ATTRIBUTE NAME AND VALUE }}}
+
+" TAG REGION AND FOLDING {{{
+
+" CFCOMPONENT REGION AND FOLD {{{
+" <cfcomponent
+" s^^^^^^^^^^^
+" </cfcomponent>
+" ^^^^^^^^^^^^^e
+sy region cfmlComponentTagRegion
+ \ fold
+ \ keepend
+ \ transparent
+ \ start="\c<cfcomponent"
+ \ end="\c</cfcomponent>"
+
+" / CFCOMPONENT REGION AND FOLD }}}
+
+" CFFUNCTION REGION AND FOLD {{{
+" <cffunction
+" s^^^^^^^^^^
+" </cffunction>
+" ^^^^^^^^^^^^e
+sy region cfmlFunctionTagRegion
+ \ fold
+ \ keepend
+ \ transparent
+ \ start="\c<cffunction"
+ \ end="\c</cffunction>"
+" / CFFUNCTION REGION AND FOLD }}}
+
+" CFIF REGION AND FOLD {{{
+" <cfif
+" s^^^^
+" </cfif>
+" ^^^^^^e
+sy region cfmlIfTagRegion
+ \ fold
+ \ keepend
+ \ transparent
+ \ start="\c<cfif"
+ \ end="\c</cfif>"
+" / CFIF REGION AND FOLD }}}
+
+" CFLOOP REGION AND FOLD {{{
+" <cfloop
+" s^^^^^^
+" </cfloop>
+" ^^^^^^^^e
+sy region cfmlLoopTagRegion
+ \ fold
+ \ keepend
+ \ transparent
+ \ start="\c<cfloop"
+ \ end="\c</cfloop>"
+" / CFLOOP REGION AND FOLD }}}
+
+" CFOUTPUT REGION AND FOLD {{{
+" <cfoutput
+" s^^^^^^^^
+" </cfoutput>
+" ^^^^^^^^^^e
+sy region cfmlOutputTagRegion
+ \ fold
+ \ keepend
+ \ transparent
+ \ start="\c<cfoutput"
+ \ end="\c</cfoutput>"
+" / CFOUTPUT REGION AND FOLD }}}
+
+" CFQUERY REGION AND FOLD {{{
+" <cfquery
+" s^^^^^^^
+" </cfquery>
+" ^^^^^^^^^e
+ "\@cfmlSqlStatement,
+sy region cfmlQueryTagRegion
+ \ fold
+ \ keepend
+ \ transparent
+ \ start="\c<cfquery"
+ \ end="\c</cfquery>"
+ \ contains=
+ \@cfmlSqlStatement,
+ \cfmlTagStart,
+ \cfmlTagEnd,
+ \cfmlTagComment
+" / CFQUERY REGION AND FOLD }}}
+
+" SAVECONTENT REGION AND FOLD {{{
+" <savecontent
+" s^^^^^^^^^^^
+" </savecontent>
+" ^^^^^^^^^^^^^e
+sy region cfmlSavecontentTagRegion
+ \ fold
+ \ keepend
+ \ transparent
+ \ start="\c<cfsavecontent"
+ \ end="\c</cfsavecontent>"
+" / SAVECONTENT REGION AND FOLD }}}
+
+" CFSCRIPT REGION AND FOLD {{{
+" <cfscript>
+" s^^^^^^^^^
+" </cfscript>
+" ^^^^^^^^^^e
+"\cfmlCustomScope,
+sy region cfmlScriptTagRegion
+ \ fold
+ \ keepend
+ \ transparent
+ \ start="\c<cfscript>"
+ \ end="\c</cfscript>"
+ \ contains=
+ \@cfmlComment,
+ \@cfmlFlowStatement,
+ \cfmlHashSurround,
+ \@cfmlOperator,
+ \@cfmlParenthesisRegion,
+ \@cfmlPunctuation,
+ \cfmlBoolean,
+ \cfmlBrace,
+ \cfmlCoreKeyword,
+ \cfmlCoreScope,
+ \cfmlCustomKeyword,
+ \cfmlCustomScope,
+ \cfmlEqualSign,
+ \cfmlFunctionDefinition,
+ \cfmlFunctionName,
+ \cfmlNumber,
+ \cfmlOddFunction,
+ \cfmlStorageKeyword,
+ \cfmlTagEnd,
+ \cfmlTagStart
+" / CFSCRIPT REGION AND FOLD }}}
+
+" CFSWITCH REGION AND FOLD {{{
+" <cfswitch
+" s^^^^^^^^
+" </cfswitch>
+" ^^^^^^^^^^e
+sy region cfmlSwitchTagRegion
+ \ fold
+ \ keepend
+ \ transparent
+ \ start="\c<cfswitch"
+ \ end="\c</cfswitch>"
+" / CFSWITCH REGION AND FOLD }}}
+
+" CFTRANSACTION REGION AND FOLD {{{
+" <cftransaction
+" s^^^^^^^^^^^^^
+" </cftransaction>
+" ^^^^^^^^^^^^^^^e
+sy region cfmlTransactionTagRegion
+ \ fold
+ \ keepend
+ \ transparent
+ \ start="\c<cftransaction"
+ \ end="\c</cftransaction>"
+" / CFTRANSACTION REGION AND FOLD }}}
+
+" CUSTOM TAG REGION AND FOLD {{{
+" <cf_...>
+" s^^^ ^
+" </cf_...>
+" ^^^^^ e
+sy region cfmlCustomTagRegion
+ \ fold
+ \ keepend
+ \ transparent
+ \ start="\c<cf_[^>]*>"
+ \ end="\c</cf_[^>]*>"
+" / CUSTOM TAG REGION AND FOLD }}}
+
+" / TAG REGION AND FOLDING }}}
+
+" COMMENT {{{
+
+" COMMENT BLOCK {{{
+" /*...*/
+" s^ ^e
+sy region cfmlCommentBlock
+ \ keepend
+ \ start="/\*"
+ \ end="\*/"
+ \ contains=
+ \cfmlMetaData
+" / COMMENT BLOCK }}}
+
+" COMMENT LINE {{{
+" //...
+" s^
+sy match cfmlCommentLine
+ \ "\/\/.*"
+" / COMMENT LINE }}}
+
+sy cluster cfmlComment
+ \ contains=
+ \cfmlCommentBlock,
+ \cfmlCommentLine
+" / COMMENT }}}
+
+" TAG COMMENT {{{
+" <!---...--->
+" s^^^^ ^^^e
+sy region cfmlTagComment
+ \ keepend
+ \ start="<!---"
+ \ end="--->"
+ \ contains=
+ \cfmlTagComment
+" / TAG COMMENT }}}
+
+" FLOW STATEMENT {{{
+" BRANCH FLOW KEYWORD {{{
+sy keyword cfmlBranchFlowKeyword
+ \ break
+ \ continue
+ \ return
+
+" / BRANCH KEYWORD }}}
+
+" DECISION FLOW KEYWORD {{{
+sy keyword cfmlDecisionFlowKeyword
+ \ case
+ \ defaultcase
+ \ else
+ \ if
+ \ switch
+
+" / DECISION FLOW KEYWORD }}}
+
+" LOOP FLOW KEYWORD {{{
+sy keyword cfmlLoopFlowKeyword
+ \ do
+ \ for
+ \ in
+ \ while
+
+" / LOOP FLOW KEYWORD }}}
+
+" TRY FLOW KEYWORD {{{
+sy keyword cfmlTryFlowKeyword
+ \ catch
+ \ finally
+ \ rethrow
+ \ throw
+ \ try
+
+" / TRY FLOW KEYWORD }}}
+
+sy cluster cfmlFlowStatement
+ \ contains=
+ \cfmlBranchFlowKeyword,
+ \cfmlDecisionFlowKeyword,
+ \cfmlLoopFlowKeyword,
+ \cfmlTryFlowKeyword
+
+" / FLOW STATEMENT }}}
+
+" STORAGE KEYWORD {{{
+sy keyword cfmlStorageKeyword
+ \ var
+" / STORAGE KEYWORD }}}
+
+" STORAGE TYPE {{{
+sy match cfmlStorageType
+ \ contained
+ \ "\v<
+ \(any
+ \|array
+ \|binary
+ \|boolean
+ \|date
+ \|numeric
+ \|query
+ \|string
+ \|struct
+ \|uuid
+ \|void
+ \|xml
+ \){1}\ze(\s*\=)@!"
+" / STORAGE TYPE }}}
+
+" CORE KEYWORD {{{
+sy match cfmlCoreKeyword
+ \ "\v<
+ \(new
+ \|required
+ \)\ze\s"
+" / CORE KEYWORD }}}
+
+" CORE SCOPE {{{
+sy match cfmlCoreScope
+ \ "\v<
+ \(application
+ \|arguments
+ \|attributes
+ \|caller
+ \|cfcatch
+ \|cffile
+ \|cfhttp
+ \|cgi
+ \|client
+ \|cookie
+ \|form
+ \|local
+ \|request
+ \|server
+ \|session
+ \|super
+ \|this
+ \|thisTag
+ \|thread
+ \|variables
+ \|url
+ \){1}\ze(,|\.|\[|\)|\s)"
+" / CORE SCOPE }}}
+
+" SQL STATEMENT {{{
+sy cluster cfmlSqlStatement
+ \ contains=
+ \@cfmlParenthesisRegion,
+ \@cfmlQuote,
+ \@cfmlQuotedValue,
+ \@sqlSyntax,
+ \cfmlBoolean,
+ \cfmlDot,
+ \cfmlEqualSign,
+ \cfmlFunctionName,
+ \cfmlHashSurround,
+ \cfmlNumber
+" / SQL STATEMENT }}}
+
+" TAG IN SCRIPT {{{
+sy match cfmlTagNameInScript
+ \ "\vcf_*\w+\s*\ze\("
+" / TAG IN SCRIPT }}}
+
+" METADATA {{{
+sy region cfmlMetaData
+ \ contained
+ \ keepend
+ \ start="@\w\+"
+ \ end="$"
+ \ contains=
+ \cfmlMetaDataName
+
+sy match cfmlMetaDataName
+ \ contained
+ \ "@\w\+"
+" / METADATA }}}
+
+" COMPONENT DEFINITION {{{
+sy region cfmlComponentDefinition
+ \ start="component"
+ \ end="{"me=e-1
+ \ contains=
+ \@cfmlAttribute,
+ \cfmlComponentKeyword
+
+sy match cfmlComponentKeyword
+ \ contained
+ \ "\v<component>"
+" / COMPONENT DEFINITION }}}
+
+" INTERFACE DEFINITION {{{
+sy match cfmlInterfaceDefinition
+ \ "interface\s.*{"me=e-1
+ \ contains=
+ \cfmlInterfaceKeyword
+
+sy match cfmlInterfaceKeyword
+ \ contained
+ \ "\v<interface>"
+" / INTERFACE DEFINITION }}}
+
+" PROPERTY {{{
+sy region cfmlProperty
+ \ transparent
+ \ start="\v<property>"
+ \ end=";"me=e-1
+ \ contains=
+ \@cfmlQuotedValue,
+ \cfmlAttrEqualSign,
+ \cfmlAttrName,
+ \cfmlAttrValue,
+ \cfmlPropertyKeyword
+
+sy match cfmlPropertyKeyword
+ \ contained
+ \ "\v<property>"
+" / PROPERTY }}}
+
+" FUNCTION DEFINITION {{{
+sy match cfmlFunctionDefinition
+ \ "\v
+ \(<(public|private|package)\s){,1}
+ \(<
+ \(any
+ \|array
+ \|binary
+ \|boolean
+ \|date
+ \|numeric
+ \|query
+ \|string
+ \|struct
+ \|uuid
+ \|void
+ \|xml
+ \)\s){,1}
+ \<function\s\w+\s*\("me=e-1
+ \ contains=
+ \cfmlFunctionKeyword,
+ \cfmlFunctionModifier,
+ \cfmlFunctionName,
+ \cfmlFunctionReturnType
+
+" FUNCTION KEYWORD {{{
+sy match cfmlFunctionKeyword
+ \ contained
+ \ "\v<function>"
+" / FUNCTION KEYWORD }}}
+
+" FUNCTION MODIFIER {{{
+sy match cfmlFunctionModifier
+ \ contained
+ \ "\v<
+ \(public
+ \|private
+ \|package
+ \)>"
+" / FUNCTION MODIFIER }}}
+
+" FUNCTION RETURN TYPE {{{
+sy match cfmlFunctionReturnType
+ \ contained
+ \ "\v
+ \(any
+ \|array
+ \|binary
+ \|boolean
+ \|date
+ \|numeric
+ \|query
+ \|string
+ \|struct
+ \|uuid
+ \|void
+ \|xml
+ \)"
+" / FUNCTION RETURN TYPE }}}
+
+" FUNCTION NAME {{{
+" specific regex for core functions decreases performance
+" so use the same highlighting for both function types
+sy match cfmlFunctionName
+ \ "\v<(cf|if|elseif|throw)@!\w+\s*\ze\("
+" / FUNCTION NAME }}}
+
+" / FUNCTION DEFINITION }}}
+
+" ODD FUNCTION {{{
+sy region cfmlOddFunction
+ \ transparent
+ \ start="\v<
+ \(abort
+ \|exit
+ \|import
+ \|include
+ \|lock
+ \|pageencoding
+ \|param
+ \|savecontent
+ \|thread
+ \|transaction
+ \){1}"
+ \ end="\v(\{|;)"me=e-1
+ \ contains=
+ \@cfmlQuotedValue,
+ \cfmlAttrEqualSign,
+ \cfmlAttrName,
+ \cfmlAttrValue,
+ \cfmlCoreKeyword,
+ \cfmlOddFunctionKeyword,
+ \cfmlCoreScope
+
+" ODD FUNCTION KEYWORD {{{
+sy match cfmlOddFunctionKeyword
+ \ contained
+ \ "\v<
+ \(abort
+ \|exit
+ \|import
+ \|include
+ \|lock
+ \|pageencoding
+ \|param
+ \|savecontent
+ \|thread
+ \|transaction
+ \)\ze(\s|$|;)"
+" / ODD FUNCTION KEYWORD }}}
+
+" / ODD FUNCTION }}}
+
+" CUSTOM {{{
+
+" CUSTOM KEYWORD {{{
+sy match cfmlCustomKeyword
+ \ contained
+ \ "\v<
+ \(customKeyword1
+ \|customKeyword2
+ \|customKeyword3
+ \)>"
+" / CUSTOM KEYWORD }}}
+
+" CUSTOM SCOPE {{{
+sy match cfmlCustomScope
+ \ contained
+ \ "\v<
+ \(prc
+ \|rc
+ \|event
+ \|(\w+Service)
+ \){1}\ze(\.|\[)"
+" / CUSTOM SCOPE }}}
+
+" / CUSTOM }}}
+
+" SGML TAG START AND END {{{
+" SGML tag start
+" <...>
+" s^^^e
+sy region cfmlSGMLTagStart
+ \ keepend
+ \ transparent
+ \ start="\v(\<cf)@!\zs\<\w+"
+ \ end=">"
+ \ contains=
+ \@cfmlAttribute,
+ \@cfmlComment,
+ \@cfmlOperator,
+ \@cfmlParenthesisRegion,
+ \@cfmlPunctuation,
+ \@cfmlQuote,
+ \@cfmlQuotedValue,
+ \cfmlAttrEqualSign,
+ \cfmlBoolean,
+ \cfmlBrace,
+ \cfmlCoreKeyword,
+ \cfmlCoreScope,
+ \cfmlCustomKeyword,
+ \cfmlCustomScope,
+ \cfmlEqualSign,
+ \cfmlFunctionName,
+ \cfmlNumber,
+ \cfmlStorageKeyword,
+ \cfmlStorageType,
+ \cfmlTagBracket,
+ \cfmlSGMLTagName
+
+" SGML tag end
+" </...>
+" s^^^^e
+sy match cfmlSGMLTagEnd
+ \ transparent
+ \ "\v(\<\/cf)@!\zs\<\/\w+\>"
+ \ contains=
+ \cfmlTagBracket,
+ \cfmlSGMLTagName
+
+" SGML tag name
+" <...>
+" s^^^e
+sy match cfmlSGMLTagName
+ \ contained
+ \ "\v(\<\/*)\zs\w+"
+
+" / SGML TAG START AND END }}}
+
+" HIGHLIGHTING {{{
+
+hi link cfmlNumber Number
+hi link cfmlBoolean Boolean
+hi link cfmlEqualSign Keyword
+" HASH SURROUND
+hi link cfmlHash PreProc
+hi link cfmlHashSurround PreProc
+" OPERATOR
+hi link cfmlArithmeticOperator Function
+hi link cfmlBooleanOperator Function
+hi link cfmlDecisionOperator Function
+hi link cfmlStringOperator Function
+hi link cfmlTernaryOperator Function
+" PARENTHESIS
+hi link cfmlParenthesis1 Statement
+hi link cfmlParenthesis2 String
+hi link cfmlParenthesis3 Delimiter
+" BRACE
+hi link cfmlBrace PreProc
+" PUNCTUATION - BRACKET
+hi link cfmlBracket Statement
+" PUNCTUATION - CHAR
+hi link cfmlComma Comment
+hi link cfmlDot Comment
+hi link cfmlSemiColon Comment
+" PUNCTUATION - QUOTE
+hi link cfmlDoubleQuote String
+hi link cfmlDoubleQuotedValue String
+hi link cfmlSingleQuote String
+hi link cfmlSingleQuotedValue String
+" TAG START AND END
+hi link cfmlTagName Function
+hi link cfmlTagBracket Comment
+" ATTRIBUTE NAME AND VALUE
+hi link cfmlAttrName Type
+hi link cfmlAttrValue Special
+" COMMENT
+hi link cfmlCommentBlock Comment
+hi link cfmlCommentLine Comment
+hi link cfmlTagComment Comment
+" FLOW STATEMENT
+hi link cfmlDecisionFlowKeyword Conditional
+hi link cfmlLoopFlowKeyword Repeat
+hi link cfmlTryFlowKeyword Exception
+hi link cfmlBranchFlowKeyword Keyword
+" STORAGE KEYWORD
+hi link cfmlStorageKeyword Keyword
+" STORAGE TYPE
+hi link cfmlStorageType Keyword
+" CORE KEYWORD
+hi link cfmlCoreKeyword PreProc
+" CORE SCOPE
+hi link cfmlCoreScope Keyword
+" TAG IN SCRIPT
+hi link cfmlTagNameInScript Function
+" METADATA
+" meta data value = cfmlMetaData
+hi link cfmlMetaData String
+hi link cfmlMetaDataName Type
+" COMPONENT DEFINITION
+hi link cfmlComponentKeyword Keyword
+" INTERFACE DEFINITION
+hi link cfmlInterfaceKeyword Keyword
+" PROPERTY
+hi link cfmlPropertyKeyword Keyword
+" FUNCTION DEFINITION
+hi link cfmlFunctionKeyword Keyword
+hi link cfmlFunctionModifier Keyword
+hi link cfmlFunctionReturnType Keyword
+hi link cfmlFunctionName Function
+" ODD FUNCTION
+hi link cfmlOddFunctionKeyword Function
+" CUSTOM
+hi link cfmlCustomKeyword Keyword
+hi link cfmlCustomScope Structure
+" SGML TAG
+hi link cfmlSGMLTagName Ignore
+
+" / HIGHLIGHTING }}}
+
+let b:current_syntax = "cfml"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/cfg.vim b/runtime/syntax/cfg.vim
index b82fb26fc0..a50297d418 100644
--- a/runtime/syntax/cfg.vim
+++ b/runtime/syntax/cfg.vim
@@ -3,11 +3,8 @@
" Maintainer: Igor N. Prischepoff (igor@tyumbit.ru, pri_igor@mail.ru)
" Last change: 2012 Aug 11
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists ("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists ("b:current_syntax")
finish
endif
@@ -36,25 +33,16 @@ syn match CfgComment ";.*"
syn match CfgComment "\/\/.*"
" Define the default hightlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_cfg_syn_inits")
- if version < 508
- let did_cfg_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink CfgOnOff Label
- HiLink CfgComment Comment
- HiLink CfgSection Type
- HiLink CfgString String
- HiLink CfgParams Keyword
- HiLink CfgValues Constant
- HiLink CfgDirectory Directory
- HiLink UncPath Directory
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+hi def link CfgOnOff Label
+hi def link CfgComment Comment
+hi def link CfgSection Type
+hi def link CfgString String
+hi def link CfgParams Keyword
+hi def link CfgValues Constant
+hi def link CfgDirectory Directory
+hi def link UncPath Directory
+
+
let b:current_syntax = "cfg"
" vim:ts=8
diff --git a/runtime/syntax/ch.vim b/runtime/syntax/ch.vim
index add7395093..61f475bc99 100644
--- a/runtime/syntax/ch.vim
+++ b/runtime/syntax/ch.vim
@@ -8,21 +8,14 @@
" Ch is a C/C++ interpreter with many high level extensions
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" Read the C syntax to start with
-if version < 600
- so <sfile>:p:h/c.vim
-else
- runtime! syntax/c.vim
- unlet b:current_syntax
-endif
+runtime! syntax/c.vim
+unlet b:current_syntax
" Ch extentions
@@ -33,20 +26,12 @@ syn keyword chStructure class
syn keyword chType string_t array
" Default highlighting
-if version >= 508 || !exists("did_ch_syntax_inits")
- if version < 508
- let did_ch_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink chAccess chStatement
- HiLink chExceptions Exception
- HiLink chStatement Statement
- HiLink chType Type
- HiLink chStructure Structure
- delcommand HiLink
-endif
+
+hi def link chAccess chStatement
+hi def link chExceptions Exception
+hi def link chStatement Statement
+hi def link chType Type
+hi def link chStructure Structure
let b:current_syntax = "ch"
diff --git a/runtime/syntax/change.vim b/runtime/syntax/change.vim
index e9bf88b9d6..a92767e903 100644
--- a/runtime/syntax/change.vim
+++ b/runtime/syntax/change.vim
@@ -7,11 +7,8 @@
" in the articles by Donald E. Knuth and Silvio Levy cited in "web.vim" and
" "cweb.vim" respectively.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syn clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -21,21 +18,11 @@ syn region changeFromMaterial start="^@x.*$"ms=e+1 end="^@y.*$"me=s-1
syn region changeToMaterial start="^@y.*$"ms=e+1 end="^@z.*$"me=s-1
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_change_syntax_inits")
- if version < 508
- let did_change_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink changeFromMaterial String
- HiLink changeToMaterial Statement
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link changeFromMaterial String
+hi def link changeToMaterial Statement
+
let b:current_syntax = "change"
diff --git a/runtime/syntax/changelog.vim b/runtime/syntax/changelog.vim
index 33d31ba466..cf9021ef05 100644
--- a/runtime/syntax/changelog.vim
+++ b/runtime/syntax/changelog.vim
@@ -4,11 +4,8 @@
" Maintainer: Corinna Vinschen <vinschen@redhat.com>
" Last Change: June 1, 2003
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -28,17 +25,12 @@ endif
syn match changelogText "^\s.*$" contains=changelogMail,changelogNumber,changelogMonth,changelogDay,changelogError
syn match changelogHeader "^\S.*$" contains=changelogNumber,changelogMonth,changelogDay,changelogMail
-if version < 600
- syn region changelogFiles start="^\s\+[+*]\s" end=":\s" end="^$" contains=changelogBullet,changelogColon,changelogError keepend
- syn region changelogFiles start="^\s\+[([]" end=":\s" end="^$" contains=changelogBullet,changelogColon,changelogError keepend
- syn match changelogColon contained ":\s"
-else
- syn region changelogFiles start="^\s\+[+*]\s" end=":" end="^$" contains=changelogBullet,changelogColon,changelogFuncs,changelogError keepend
- syn region changelogFiles start="^\s\+[([]" end=":" end="^$" contains=changelogBullet,changelogColon,changelogFuncs,changelogError keepend
- syn match changelogFuncs contained "(.\{-})" extend
- syn match changelogFuncs contained "\[.\{-}]" extend
- syn match changelogColon contained ":"
-endif
+syn region changelogFiles start="^\s\+[+*]\s" end=":" end="^$" contains=changelogBullet,changelogColon,changelogFuncs,changelogError keepend
+syn region changelogFiles start="^\s\+[([]" end=":" end="^$" contains=changelogBullet,changelogColon,changelogFuncs,changelogError keepend
+syn match changelogFuncs contained "(.\{-})" extend
+syn match changelogFuncs contained "\[.\{-}]" extend
+syn match changelogColon contained ":"
+
syn match changelogBullet contained "^\s\+[+*]\s" contains=changelogError
syn match changelogMail contained "<[A-Za-z0-9\._:+-]\+@[A-Za-z0-9\._-]\+>"
syn keyword changelogMonth contained jan feb mar apr may jun jul aug sep oct nov dec
@@ -46,32 +38,20 @@ syn keyword changelogDay contained mon tue wed thu fri sat sun
syn match changelogNumber contained "[.-]*[0-9]\+"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_changelog_syntax_inits")
- if version < 508
- let did_changelog_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
+
+hi def link changelogText Normal
+hi def link changelogBullet Type
+hi def link changelogColon Type
+hi def link changelogFiles Comment
+hi def link changelogFuncs Comment
+hi def link changelogHeader Statement
+hi def link changelogMail Special
+hi def link changelogNumber Number
+hi def link changelogMonth Number
+hi def link changelogDay Number
+hi def link changelogError Folded
- HiLink changelogText Normal
- HiLink changelogBullet Type
- HiLink changelogColon Type
- HiLink changelogFiles Comment
- if version >= 600
- HiLink changelogFuncs Comment
- endif
- HiLink changelogHeader Statement
- HiLink changelogMail Special
- HiLink changelogNumber Number
- HiLink changelogMonth Number
- HiLink changelogDay Number
- HiLink changelogError Folded
-
- delcommand HiLink
-endif
let b:current_syntax = "changelog"
diff --git a/runtime/syntax/chaskell.vim b/runtime/syntax/chaskell.vim
index 3f764d0e8a..4b1e8c53be 100644
--- a/runtime/syntax/chaskell.vim
+++ b/runtime/syntax/chaskell.vim
@@ -9,10 +9,6 @@
let b:hs_chs=1
" Include standard Haskell highlighting
-if version < 600
- source <sfile>:p:h/haskell.vim
-else
- runtime! syntax/haskell.vim
-endif
+runtime! syntax/haskell.vim
" vim: ts=8
diff --git a/runtime/syntax/cheetah.vim b/runtime/syntax/cheetah.vim
index 7eb17567cf..9567ecbbca 100644
--- a/runtime/syntax/cheetah.vim
+++ b/runtime/syntax/cheetah.vim
@@ -8,11 +8,8 @@
" PSP-style tags: <% .. %> (obsoleted feature)
" doc-strings and header comments (rarely used feature)
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -36,25 +33,15 @@ syn match cheetahComment "##.*$" display
syn region cheetahMultiLineComment start="#\*" end="\*#"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_cheetah_syn_inits")
- if version < 508
- let did_cheetah_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink cheetahPlaceHolder Identifier
- HiLink cheetahDirective PreCondit
- HiLink cheetahKeyword Define
- HiLink cheetahContinuation Special
- HiLink cheetahComment Comment
- HiLink cheetahMultiLineComment Comment
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link cheetahPlaceHolder Identifier
+hi def link cheetahDirective PreCondit
+hi def link cheetahKeyword Define
+hi def link cheetahContinuation Special
+hi def link cheetahComment Comment
+hi def link cheetahMultiLineComment Comment
+
let b:current_syntax = "cheetah"
diff --git a/runtime/syntax/chicken.vim b/runtime/syntax/chicken.vim
new file mode 100644
index 0000000000..c3f949f823
--- /dev/null
+++ b/runtime/syntax/chicken.vim
@@ -0,0 +1,77 @@
+" Vim syntax file
+" Language: Scheme (CHICKEN)
+" Last Change: 2018-02-05
+" Author: Evan Hanson <evhan@foldling.org>
+" Maintainer: Evan Hanson <evhan@foldling.org>
+" URL: https://foldling.org/vim/syntax/chicken.vim
+" Notes: This is supplemental syntax, to be loaded after the core Scheme
+" syntax file (syntax/scheme.vim). Enable it by setting b:is_chicken=1
+" and filetype=scheme.
+
+" Only to be used on top of the Scheme syntax.
+if !exists('b:did_scheme_syntax')
+ finish
+endif
+
+" Lighten parentheses.
+hi! def link schemeParentheses Comment
+
+" foo#bar
+syn match schemeExtraSyntax /[^ #'`\t\n()\[\]"|;]\+#[^ '`\t\n()\[\]"|;]\+/
+
+" ##foo#bar
+syn match schemeExtraSyntax /##[^ '`\t\n()\[\]"|;]\+/
+
+" Heredocs.
+syn region schemeString start=/#<[<#]\s*\z(.*\)/ end=/^\z1$/
+
+" Keywords.
+syn match schemeKeyword /#[!:][a-zA-Z0-9!$%&*+-./:<=>?@^_~#]\+/
+syn match schemeKeyword /[a-zA-Z0-9!$%&*+-./:<=>?@^_~#]\+:\>/
+
+" C/C++ syntax.
+let s:c = globpath(&rtp, 'syntax/cpp.vim', 0, 1)
+if len(s:c)
+ exe 'syn include @c ' s:c[0]
+ syn region c matchgroup=schemeComment start=/#>/ end=/<#/ contains=@c
+endif
+
+syn keyword schemeSyntax define-record
+
+syn keyword schemeLibrarySyntax declare
+syn keyword schemeLibrarySyntax module
+syn keyword schemeLibrarySyntax reexport
+syn keyword schemeLibrarySyntax require-library
+
+syn keyword schemeTypeSyntax -->
+syn keyword schemeTypeSyntax ->
+syn keyword schemeTypeSyntax :
+syn keyword schemeTypeSyntax assume
+syn keyword schemeTypeSyntax compiler-typecase
+syn keyword schemeTypeSyntax define-specialization
+syn keyword schemeTypeSyntax define-type
+syn keyword schemeTypeSyntax the
+
+syn keyword schemeExtraSyntax and-let*
+syn keyword schemeExtraSyntax match
+syn keyword schemeExtraSyntax match-lambda
+syn keyword schemeExtraSyntax match-lambda*
+
+syn keyword schemeSpecialSyntax define-compiler-syntax
+syn keyword schemeSpecialSyntax define-constant
+syn keyword schemeSpecialSyntax define-external
+syn keyword schemeSpecialSyntax define-inline
+syn keyword schemeSpecialSyntax foreign-code
+syn keyword schemeSpecialSyntax foreign-declare
+syn keyword schemeSpecialSyntax foreign-lambda
+syn keyword schemeSpecialSyntax foreign-lambda*
+syn keyword schemeSpecialSyntax foreign-primitive
+syn keyword schemeSpecialSyntax foreign-safe-lambda
+syn keyword schemeSpecialSyntax foreign-safe-lambda*
+syn keyword schemeSpecialSyntax foreign-value
+
+syn keyword schemeSyntaxSyntax begin-for-syntax
+syn keyword schemeSyntaxSyntax define-for-syntax
+syn keyword schemeSyntaxSyntax er-macro-transformer
+syn keyword schemeSyntaxSyntax ir-macro-transformer
+syn keyword schemeSyntaxSyntax require-library-for-syntax
diff --git a/runtime/syntax/chill.vim b/runtime/syntax/chill.vim
index e5200fe722..b95df68bc8 100644
--- a/runtime/syntax/chill.vim
+++ b/runtime/syntax/chill.vim
@@ -11,11 +11,8 @@
" & Communications LTd.)
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -124,67 +121,57 @@ endif
exec "syn sync ccomment chillComment minlines=" . chill_minlines
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_ch_syntax_inits")
- if version < 508
- let did_ch_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink chillLabel Label
- HiLink chillUserLabel Label
- HiLink chillConditional Conditional
- " hi chillConditional term=bold ctermfg=red guifg=red gui=bold
-
- HiLink chillRepeat Repeat
- HiLink chillProcess Repeat
- HiLink chillSignal Repeat
- HiLink chillCharacter Character
- HiLink chillSpecialCharacter chillSpecial
- HiLink chillNumber Number
- HiLink chillFloat Float
- HiLink chillOctalError chillError
- HiLink chillParenError chillError
- HiLink chillInParen chillError
- HiLink chillCommentError chillError
- HiLink chillSpaceError chillError
- HiLink chillOperator Operator
- HiLink chillStructure Structure
- HiLink chillBlock Operator
- HiLink chillScope Operator
- "hi chillEDML term=underline ctermfg=DarkRed guifg=Red
- HiLink chillEDML PreProc
- "hi chillBoolConst term=bold ctermfg=brown guifg=brown
- HiLink chillBoolConst Constant
- "hi chillLogical term=bold ctermfg=brown guifg=brown
- HiLink chillLogical Constant
- HiLink chillStorageClass StorageClass
- HiLink chillInclude Include
- HiLink chillPreProc PreProc
- HiLink chillDefine Macro
- HiLink chillIncluded chillString
- HiLink chillError Error
- HiLink chillStatement Statement
- HiLink chillPreCondit PreCondit
- HiLink chillType Type
- HiLink chillCommentError chillError
- HiLink chillCommentString chillString
- HiLink chillComment2String chillString
- HiLink chillCommentSkip chillComment
- HiLink chillString String
- HiLink chillComment Comment
- " hi chillComment term=None ctermfg=lightblue guifg=lightblue
- HiLink chillSpecial SpecialChar
- HiLink chillTodo Todo
- HiLink chillBlock Statement
- "HiLink chillIdentifier Identifier
- HiLink chillBracket Delimiter
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link chillLabel Label
+hi def link chillUserLabel Label
+hi def link chillConditional Conditional
+" hi def link chillConditional term=bold ctermfg=red guifg=red gui=bold
+
+hi def link chillRepeat Repeat
+hi def link chillProcess Repeat
+hi def link chillSignal Repeat
+hi def link chillCharacter Character
+hi def link chillSpecialCharacter chillSpecial
+hi def link chillNumber Number
+hi def link chillFloat Float
+hi def link chillOctalError chillError
+hi def link chillParenError chillError
+hi def link chillInParen chillError
+hi def link chillCommentError chillError
+hi def link chillSpaceError chillError
+hi def link chillOperator Operator
+hi def link chillStructure Structure
+hi def link chillBlock Operator
+hi def link chillScope Operator
+"hi def link chillEDML term=underline ctermfg=DarkRed guifg=Red
+hi def link chillEDML PreProc
+"hi def link chillBoolConst term=bold ctermfg=brown guifg=brown
+hi def link chillBoolConst Constant
+"hi def link chillLogical term=bold ctermfg=brown guifg=brown
+hi def link chillLogical Constant
+hi def link chillStorageClass StorageClass
+hi def link chillInclude Include
+hi def link chillPreProc PreProc
+hi def link chillDefine Macro
+hi def link chillIncluded chillString
+hi def link chillError Error
+hi def link chillStatement Statement
+hi def link chillPreCondit PreCondit
+hi def link chillType Type
+hi def link chillCommentError chillError
+hi def link chillCommentString chillString
+hi def link chillComment2String chillString
+hi def link chillCommentSkip chillComment
+hi def link chillString String
+hi def link chillComment Comment
+" hi def link chillComment term=None ctermfg=lightblue guifg=lightblue
+hi def link chillSpecial SpecialChar
+hi def link chillTodo Todo
+hi def link chillBlock Statement
+"hi def link chillIdentifier Identifier
+hi def link chillBracket Delimiter
+
let b:current_syntax = "chill"
diff --git a/runtime/syntax/cl.vim b/runtime/syntax/cl.vim
index 41c045fb09..b765682547 100644
--- a/runtime/syntax/cl.vim
+++ b/runtime/syntax/cl.vim
@@ -10,19 +10,12 @@
" Version: 6
" Last Change: Mar 06 2013
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
-if version >= 600
- setlocal iskeyword=@,48-57,_,-
-else
- set iskeyword=@,48-57,_,-
-endif
+setlocal iskeyword=@,48-57,_,-
syn case ignore
@@ -75,40 +68,30 @@ syn keyword clFunction asc asize chr name random slen srandom day getarg getcgi
syn keyword clStatement clear clear_eol clear_eos close copy create unique with where empty define define ldefine delay_form delete escape exit_block exit_do exit_process field fork format get getfile getnext getprev goto head join maintain message no_join on_eop on_key on_exit on_delete openin openout openapp pause popenin popenout popenio print put range read redisplay refresh restart_block screen select sleep text unlock write and not or do
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_cl_syntax_inits")
- if version < 508
- let did_cl_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink clifError Error
- HiLink clSpaceError Error
- HiLink clWhile Repeat
- HiLink clConditional Conditional
- HiLink clDebug Debug
- HiLink clNeedsWork Todo
- HiLink clTodo Todo
- HiLink clComment Comment
- HiLink clProcedure Procedure
- HiLink clBreak Procedure
- HiLink clInclude Include
- HiLink clSetOption Statement
- HiLink clSet Identifier
- HiLink clPreProc PreProc
- HiLink clOperator Operator
- HiLink clNumber Number
- HiLink clString String
- HiLink clQuote Delimiter
- HiLink clReserved Identifier
- HiLink clFunction Function
- HiLink clStatement Statement
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link clifError Error
+hi def link clSpaceError Error
+hi def link clWhile Repeat
+hi def link clConditional Conditional
+hi def link clDebug Debug
+hi def link clNeedsWork Todo
+hi def link clTodo Todo
+hi def link clComment Comment
+hi def link clProcedure Procedure
+hi def link clBreak Procedure
+hi def link clInclude Include
+hi def link clSetOption Statement
+hi def link clSet Identifier
+hi def link clPreProc PreProc
+hi def link clOperator Operator
+hi def link clNumber Number
+hi def link clString String
+hi def link clQuote Delimiter
+hi def link clReserved Identifier
+hi def link clFunction Function
+hi def link clStatement Statement
+
let b:current_syntax = "cl"
diff --git a/runtime/syntax/clean.vim b/runtime/syntax/clean.vim
index ea95aa209e..70bf654fb7 100644
--- a/runtime/syntax/clean.vim
+++ b/runtime/syntax/clean.vim
@@ -4,11 +4,8 @@
" Co-Author: Arthur van Leeuwen <arthurvl@sci.kun.nl>
" Last Change: 2013 Oct 15 by Jurriรซn Stutterheim
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -52,49 +49,39 @@ syn match cleanFuncTypeDef "\([a-zA-Z].*\|(\=[-~@#$%^?!+*<>\/|&=:]\+)\=\)\s*\(in
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_clean_syntax_init")
- if version < 508
- let did_clean_syntax_init = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- " Comments
- HiLink cleanComment Comment
- " Constants and denotations
- HiLink cleanStringDenot String
- HiLink cleanCharDenot Character
- HiLink cleanIntegerDenot Number
- HiLink cleanBoolDenot Boolean
- HiLink cleanRealDenot Float
- " Identifiers
- " Statements
- HiLink cleanTypeClass Keyword
- HiLink cleanConditional Conditional
- HiLink cleanLabel Label
- HiLink cleanKeyword Keyword
- " Generic Preprocessing
- HiLink cleanIncludeKeyword Include
- HiLink cleanModuleSystem PreProc
- " Type
- HiLink cleanBasicType Type
- HiLink cleanSpecialType Type
- HiLink cleanFuncTypeDef Typedef
- " Special
- HiLink cleanSpecial Special
- HiLink cleanList Special
- HiLink cleanArray Special
- HiLink cleanRecord Special
- HiLink cleanTuple Special
- " Error
- " Todo
- HiLink cleanTodo Todo
+ " Comments
+ hi def link cleanComment Comment
+ " Constants and denotations
+ hi def link cleanStringDenot String
+ hi def link cleanCharDenot Character
+ hi def link cleanIntegerDenot Number
+ hi def link cleanBoolDenot Boolean
+ hi def link cleanRealDenot Float
+ " Identifiers
+ " Statements
+ hi def link cleanTypeClass Keyword
+ hi def link cleanConditional Conditional
+ hi def link cleanLabel Label
+ hi def link cleanKeyword Keyword
+ " Generic Preprocessing
+ hi def link cleanIncludeKeyword Include
+ hi def link cleanModuleSystem PreProc
+ " Type
+ hi def link cleanBasicType Type
+ hi def link cleanSpecialType Type
+ hi def link cleanFuncTypeDef Typedef
+ " Special
+ hi def link cleanSpecial Special
+ hi def link cleanList Special
+ hi def link cleanArray Special
+ hi def link cleanRecord Special
+ hi def link cleanTuple Special
+ " Error
+ " Todo
+ hi def link cleanTodo Todo
- delcommand HiLink
-endif
let b:current_syntax = "clean"
diff --git a/runtime/syntax/clipper.vim b/runtime/syntax/clipper.vim
index 6ee3892845..38ba9a4fe9 100644
--- a/runtime/syntax/clipper.vim
+++ b/runtime/syntax/clipper.vim
@@ -4,11 +4,8 @@
" Some things based on c.vim by Bram Moolenaar and pascal.vim by Mario Eusebio
" Last Change: 2011 Dec 29 by Thilo Six
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -114,32 +111,22 @@ syntax match clipperComment "^\*.*"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_clipper_syntax_inits")
- if version < 508
- let did_clipper_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink clipperConditional Conditional
- HiLink clipperRepeat Repeat
- HiLink clipperNumber Number
- HiLink clipperInclude Include
- HiLink clipperComment Comment
- HiLink clipperOperator Operator
- HiLink clipperStorageClass StorageClass
- HiLink clipperStatement Statement
- HiLink clipperString String
- HiLink clipperFunction Function
- HiLink clipperLineContinuation Special
- HiLink clipperDelimiters Delimiter
- HiLink clipperUserVariable Identifier
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link clipperConditional Conditional
+hi def link clipperRepeat Repeat
+hi def link clipperNumber Number
+hi def link clipperInclude Include
+hi def link clipperComment Comment
+hi def link clipperOperator Operator
+hi def link clipperStorageClass StorageClass
+hi def link clipperStatement Statement
+hi def link clipperString String
+hi def link clipperFunction Function
+hi def link clipperLineContinuation Special
+hi def link clipperDelimiters Delimiter
+hi def link clipperUserVariable Identifier
+
let b:current_syntax = "clipper"
diff --git a/runtime/syntax/clojure.vim b/runtime/syntax/clojure.vim
index 4dc1cde05c..ffdd5c2ab0 100644
--- a/runtime/syntax/clojure.vim
+++ b/runtime/syntax/clojure.vim
@@ -1,37 +1,68 @@
" Vim syntax file
-" Language: Clojure
-" Authors: Toralf Wittner <toralf.wittner@gmail.com>
-" modified by Meikel Brandmeyer <mb@kotka.de>
-" URL: http://kotka.de/projects/clojure/vimclojure.html
+" Language: Clojure
+" Authors: Toralf Wittner <toralf.wittner@gmail.com>
+" modified by Meikel Brandmeyer <mb@kotka.de>
+" URL: http://kotka.de/projects/clojure/vimclojure.html
"
-" Contributors: Joel Holdbrooks <cjholdbrooks@gmail.com> (Regexp support, bug fixes)
+" Contributors: Joel Holdbrooks <cjholdbrooks@gmail.com> (Regexp support, bug fixes)
"
-" Maintainer: Sung Pae <self@sungpae.com>
-" URL: https://github.com/guns/vim-clojure-static
-" License: Same as Vim
-" Last Change: 27 March 2014
+" Maintainer: Sung Pae <self@sungpae.com>
+" URL: https://github.com/guns/vim-clojure-static
+" License: Same as Vim
+" Last Change: 18 July 2016
if exists("b:current_syntax")
finish
endif
+let s:cpo_sav = &cpo
+set cpo&vim
+
if has("folding") && exists("g:clojure_fold") && g:clojure_fold > 0
setlocal foldmethod=syntax
endif
" -*- KEYWORDS -*-
-" Generated from https://github.com/guns/vim-clojure-static/blob/vim-release-010/clj/src/vim_clojure_static/generate.clj
-" Clojure version 1.6.0
-syntax keyword clojureConstant nil
-syntax keyword clojureBoolean false true
-syntax keyword clojureSpecial . catch clojure.core/fn clojure.core/let clojure.core/loop def do finally fn if let loop monitor-enter monitor-exit new quote recur set! throw try var
-syntax keyword clojureException catch finally throw try
-syntax keyword clojureCond case clojure.core/case clojure.core/cond clojure.core/cond-> clojure.core/cond->> clojure.core/condp clojure.core/if-let clojure.core/if-not clojure.core/if-some clojure.core/when clojure.core/when-first clojure.core/when-let clojure.core/when-not clojure.core/when-some cond cond-> cond->> condp if-let if-not if-some when when-first when-let when-not when-some
-syntax keyword clojureRepeat clojure.core/doseq clojure.core/dotimes clojure.core/while doseq dotimes while
-syntax keyword clojureDefine clojure.core/definline clojure.core/definterface clojure.core/defmacro clojure.core/defmethod clojure.core/defmulti clojure.core/defn clojure.core/defn- clojure.core/defonce clojure.core/defprotocol clojure.core/defrecord clojure.core/defstruct clojure.core/deftype definline definterface defmacro defmethod defmulti defn defn- defonce defprotocol defrecord defstruct deftype
-syntax keyword clojureMacro -> ->> .. amap and areduce as-> assert binding bound-fn clojure.core/-> clojure.core/->> clojure.core/.. clojure.core/amap clojure.core/and clojure.core/areduce clojure.core/as-> clojure.core/assert clojure.core/binding clojure.core/bound-fn clojure.core/comment clojure.core/declare clojure.core/delay clojure.core/dosync clojure.core/doto clojure.core/extend-protocol clojure.core/extend-type clojure.core/for clojure.core/future clojure.core/gen-class clojure.core/gen-interface clojure.core/import clojure.core/io! clojure.core/lazy-cat clojure.core/lazy-seq clojure.core/letfn clojure.core/locking clojure.core/memfn clojure.core/ns clojure.core/or clojure.core/proxy clojure.core/proxy-super clojure.core/pvalues clojure.core/refer-clojure clojure.core/reify clojure.core/some-> clojure.core/some->> clojure.core/sync clojure.core/time clojure.core/with-bindings clojure.core/with-in-str clojure.core/with-loading-context clojure.core/with-local-vars clojure.core/with-open clojure.core/with-out-str clojure.core/with-precision clojure.core/with-redefs comment declare delay dosync doto extend-protocol extend-type for future gen-class gen-interface import io! lazy-cat lazy-seq letfn locking memfn ns or proxy proxy-super pvalues refer-clojure reify some-> some->> sync time with-bindings with-in-str with-loading-context with-local-vars with-open with-out-str with-precision with-redefs
-syntax keyword clojureFunc * *' + +' - -' ->ArrayChunk ->Vec ->VecNode ->VecSeq -cache-protocol-fn -reset-methods / < <= = == > >= accessor aclone add-classpath add-watch agent agent-error agent-errors aget alength alias all-ns alter alter-meta! alter-var-root ancestors apply array-map aset aset-boolean aset-byte aset-char aset-double aset-float aset-int aset-long aset-short assoc assoc! assoc-in associative? atom await await-for await1 bases bean bigdec bigint biginteger bit-and bit-and-not bit-clear bit-flip bit-not bit-or bit-set bit-shift-left bit-shift-right bit-test bit-xor boolean boolean-array booleans bound-fn* bound? butlast byte byte-array bytes cast char char-array char? chars chunk chunk-append chunk-buffer chunk-cons chunk-first chunk-next chunk-rest chunked-seq? class class? clear-agent-errors clojure-version clojure.core/* clojure.core/*' clojure.core/+ clojure.core/+' clojure.core/- clojure.core/-' clojure.core/->ArrayChunk clojure.core/->Vec clojure.core/->VecNode clojure.core/->VecSeq clojure.core/-cache-protocol-fn clojure.core/-reset-methods clojure.core// clojure.core/< clojure.core/<= clojure.core/= clojure.core/== clojure.core/> clojure.core/>= clojure.core/accessor clojure.core/aclone clojure.core/add-classpath clojure.core/add-watch clojure.core/agent clojure.core/agent-error clojure.core/agent-errors clojure.core/aget clojure.core/alength clojure.core/alias clojure.core/all-ns clojure.core/alter clojure.core/alter-meta! clojure.core/alter-var-root clojure.core/ancestors clojure.core/apply clojure.core/array-map clojure.core/aset clojure.core/aset-boolean clojure.core/aset-byte clojure.core/aset-char clojure.core/aset-double clojure.core/aset-float clojure.core/aset-int clojure.core/aset-long clojure.core/aset-short clojure.core/assoc clojure.core/assoc! clojure.core/assoc-in clojure.core/associative? clojure.core/atom clojure.core/await clojure.core/await-for clojure.core/await1 clojure.core/bases clojure.core/bean clojure.core/bigdec clojure.core/bigint clojure.core/biginteger clojure.core/bit-and clojure.core/bit-and-not clojure.core/bit-clear clojure.core/bit-flip clojure.core/bit-not clojure.core/bit-or clojure.core/bit-set clojure.core/bit-shift-left clojure.core/bit-shift-right clojure.core/bit-test clojure.core/bit-xor clojure.core/boolean clojure.core/boolean-array clojure.core/booleans clojure.core/bound-fn* clojure.core/bound? clojure.core/butlast clojure.core/byte clojure.core/byte-array clojure.core/bytes clojure.core/cast clojure.core/char clojure.core/char-array clojure.core/char? clojure.core/chars clojure.core/chunk clojure.core/chunk-append clojure.core/chunk-buffer clojure.core/chunk-cons clojure.core/chunk-first clojure.core/chunk-next clojure.core/chunk-rest clojure.core/chunked-seq? clojure.core/class clojure.core/class? clojure.core/clear-agent-errors clojure.core/clojure-version clojure.core/coll? clojure.core/commute clojure.core/comp clojure.core/comparator clojure.core/compare clojure.core/compare-and-set! clojure.core/compile clojure.core/complement clojure.core/concat clojure.core/conj clojure.core/conj! clojure.core/cons clojure.core/constantly clojure.core/construct-proxy clojure.core/contains? clojure.core/count clojure.core/counted? clojure.core/create-ns clojure.core/create-struct clojure.core/cycle clojure.core/dec clojure.core/dec' clojure.core/decimal? clojure.core/delay? clojure.core/deliver clojure.core/denominator clojure.core/deref clojure.core/derive clojure.core/descendants clojure.core/destructure clojure.core/disj clojure.core/disj! clojure.core/dissoc clojure.core/dissoc! clojure.core/distinct clojure.core/distinct? clojure.core/doall clojure.core/dorun clojure.core/double clojure.core/double-array clojure.core/doubles clojure.core/drop clojure.core/drop-last clojure.core/drop-while clojure.core/empty clojure.core/empty? clojure.core/ensure clojure.core/enumeration-seq clojure.core/error-handler clojure.core/error-mode clojure.core/eval clojure.core/even? clojure.core/every-pred clojure.core/every? clojure.core/ex-data clojure.core/ex-info clojure.core/extend clojure.core/extenders clojure.core/extends? clojure.core/false? clojure.core/ffirst clojure.core/file-seq clojure.core/filter clojure.core/filterv clojure.core/find clojure.core/find-keyword clojure.core/find-ns clojure.core/find-protocol-impl clojure.core/find-protocol-method clojure.core/find-var clojure.core/first clojure.core/flatten clojure.core/float clojure.core/float-array clojure.core/float? clojure.core/floats clojure.core/flush clojure.core/fn? clojure.core/fnext clojure.core/fnil clojure.core/force clojure.core/format clojure.core/frequencies clojure.core/future-call clojure.core/future-cancel clojure.core/future-cancelled? clojure.core/future-done? clojure.core/future? clojure.core/gensym clojure.core/get clojure.core/get-in clojure.core/get-method clojure.core/get-proxy-class clojure.core/get-thread-bindings clojure.core/get-validator clojure.core/group-by clojure.core/hash clojure.core/hash-combine clojure.core/hash-map clojure.core/hash-ordered-coll clojure.core/hash-set clojure.core/hash-unordered-coll clojure.core/identical? clojure.core/identity clojure.core/ifn? clojure.core/in-ns clojure.core/inc clojure.core/inc' clojure.core/init-proxy clojure.core/instance? clojure.core/int clojure.core/int-array clojure.core/integer? clojure.core/interleave clojure.core/intern clojure.core/interpose clojure.core/into clojure.core/into-array clojure.core/ints clojure.core/isa? clojure.core/iterate clojure.core/iterator-seq clojure.core/juxt clojure.core/keep clojure.core/keep-indexed clojure.core/key clojure.core/keys clojure.core/keyword clojure.core/keyword? clojure.core/last clojure.core/line-seq clojure.core/list clojure.core/list* clojure.core/list? clojure.core/load clojure.core/load-file clojure.core/load-reader clojure.core/load-string clojure.core/loaded-libs clojure.core/long clojure.core/long-array clojure.core/longs clojure.core/macroexpand clojure.core/macroexpand-1 clojure.core/make-array clojure.core/make-hierarchy clojure.core/map clojure.core/map-indexed clojure.core/map? clojure.core/mapcat clojure.core/mapv clojure.core/max clojure.core/max-key clojure.core/memoize clojure.core/merge clojure.core/merge-with clojure.core/meta clojure.core/method-sig clojure.core/methods clojure.core/min clojure.core/min-key clojure.core/mix-collection-hash clojure.core/mod clojure.core/munge clojure.core/name clojure.core/namespace clojure.core/namespace-munge clojure.core/neg? clojure.core/newline clojure.core/next clojure.core/nfirst clojure.core/nil? clojure.core/nnext clojure.core/not clojure.core/not-any? clojure.core/not-empty clojure.core/not-every? clojure.core/not= clojure.core/ns-aliases clojure.core/ns-imports clojure.core/ns-interns clojure.core/ns-map clojure.core/ns-name clojure.core/ns-publics clojure.core/ns-refers clojure.core/ns-resolve clojure.core/ns-unalias clojure.core/ns-unmap clojure.core/nth clojure.core/nthnext clojure.core/nthrest clojure.core/num clojure.core/number? clojure.core/numerator clojure.core/object-array clojure.core/odd? clojure.core/parents clojure.core/partial clojure.core/partition clojure.core/partition-all clojure.core/partition-by clojure.core/pcalls clojure.core/peek clojure.core/persistent! clojure.core/pmap clojure.core/pop clojure.core/pop! clojure.core/pop-thread-bindings clojure.core/pos? clojure.core/pr clojure.core/pr-str clojure.core/prefer-method clojure.core/prefers clojure.core/print clojure.core/print-ctor clojure.core/print-dup clojure.core/print-method clojure.core/print-simple clojure.core/print-str clojure.core/printf clojure.core/println clojure.core/println-str clojure.core/prn clojure.core/prn-str clojure.core/promise clojure.core/proxy-call-with-super clojure.core/proxy-mappings clojure.core/proxy-name clojure.core/push-thread-bindings clojure.core/quot clojure.core/rand clojure.core/rand-int clojure.core/rand-nth clojure.core/range clojure.core/ratio? clojure.core/rational? clojure.core/rationalize clojure.core/re-find clojure.core/re-groups clojure.core/re-matcher clojure.core/re-matches clojure.core/re-pattern clojure.core/re-seq clojure.core/read clojure.core/read-line clojure.core/read-string clojure.core/realized? clojure.core/record? clojure.core/reduce clojure.core/reduce-kv clojure.core/reduced clojure.core/reduced? clojure.core/reductions clojure.core/ref clojure.core/ref-history-count clojure.core/ref-max-history clojure.core/ref-min-history clojure.core/ref-set clojure.core/refer clojure.core/release-pending-sends clojure.core/rem clojure.core/remove clojure.core/remove-all-methods clojure.core/remove-method clojure.core/remove-ns clojure.core/remove-watch clojure.core/repeat clojure.core/repeatedly clojure.core/replace clojure.core/replicate clojure.core/require clojure.core/reset! clojure.core/reset-meta! clojure.core/resolve clojure.core/rest clojure.core/restart-agent clojure.core/resultset-seq clojure.core/reverse clojure.core/reversible? clojure.core/rseq clojure.core/rsubseq clojure.core/satisfies? clojure.core/second clojure.core/select-keys clojure.core/send clojure.core/send-off clojure.core/send-via clojure.core/seq clojure.core/seq? clojure.core/seque clojure.core/sequence clojure.core/sequential? clojure.core/set clojure.core/set-agent-send-executor! clojure.core/set-agent-send-off-executor! clojure.core/set-error-handler! clojure.core/set-error-mode! clojure.core/set-validator! clojure.core/set? clojure.core/short clojure.core/short-array clojure.core/shorts clojure.core/shuffle clojure.core/shutdown-agents clojure.core/slurp clojure.core/some clojure.core/some-fn clojure.core/some? clojure.core/sort clojure.core/sort-by clojure.core/sorted-map clojure.core/sorted-map-by clojure.core/sorted-set clojure.core/sorted-set-by clojure.core/sorted? clojure.core/special-symbol? clojure.core/spit clojure.core/split-at clojure.core/split-with clojure.core/str clojure.core/string? clojure.core/struct clojure.core/struct-map clojure.core/subs clojure.core/subseq clojure.core/subvec clojure.core/supers clojure.core/swap! clojure.core/symbol clojure.core/symbol? clojure.core/take clojure.core/take-last clojure.core/take-nth clojure.core/take-while clojure.core/test clojure.core/the-ns clojure.core/thread-bound? clojure.core/to-array clojure.core/to-array-2d clojure.core/trampoline clojure.core/transient clojure.core/tree-seq clojure.core/true? clojure.core/type clojure.core/unchecked-add clojure.core/unchecked-add-int clojure.core/unchecked-byte clojure.core/unchecked-char clojure.core/unchecked-dec clojure.core/unchecked-dec-int clojure.core/unchecked-divide-int clojure.core/unchecked-double clojure.core/unchecked-float clojure.core/unchecked-inc clojure.core/unchecked-inc-int clojure.core/unchecked-int clojure.core/unchecked-long clojure.core/unchecked-multiply clojure.core/unchecked-multiply-int clojure.core/unchecked-negate clojure.core/unchecked-negate-int clojure.core/unchecked-remainder-int clojure.core/unchecked-short clojure.core/unchecked-subtract clojure.core/unchecked-subtract-int clojure.core/underive clojure.core/unsigned-bit-shift-right clojure.core/update-in clojure.core/update-proxy clojure.core/use clojure.core/val clojure.core/vals clojure.core/var-get clojure.core/var-set clojure.core/var? clojure.core/vary-meta clojure.core/vec clojure.core/vector clojure.core/vector-of clojure.core/vector? clojure.core/with-bindings* clojure.core/with-meta clojure.core/with-redefs-fn clojure.core/xml-seq clojure.core/zero? clojure.core/zipmap coll? commute comp comparator compare compare-and-set! compile complement concat conj conj! cons constantly construct-proxy contains? count counted? create-ns create-struct cycle dec dec' decimal? delay? deliver denominator deref derive descendants destructure disj disj! dissoc dissoc! distinct distinct? doall dorun double double-array doubles drop drop-last drop-while empty empty? ensure enumeration-seq error-handler error-mode eval even? every-pred every? ex-data ex-info extend extenders extends? false? ffirst file-seq filter filterv find find-keyword find-ns find-protocol-impl find-protocol-method find-var first flatten float float-array float? floats flush fn? fnext fnil force format frequencies future-call future-cancel future-cancelled? future-done? future? gensym get get-in get-method get-proxy-class get-thread-bindings get-validator group-by hash hash-combine hash-map hash-ordered-coll hash-set hash-unordered-coll identical? identity ifn? in-ns inc inc' init-proxy instance? int int-array integer? interleave intern interpose into into-array ints isa? iterate iterator-seq juxt keep keep-indexed key keys keyword keyword? last line-seq list list* list? load load-file load-reader load-string loaded-libs long long-array longs macroexpand macroexpand-1 make-array make-hierarchy map map-indexed map? mapcat mapv max max-key memoize merge merge-with meta method-sig methods min min-key mix-collection-hash mod munge name namespace namespace-munge neg? newline next nfirst nil? nnext not not-any? not-empty not-every? not= ns-aliases ns-imports ns-interns ns-map ns-name ns-publics ns-refers ns-resolve ns-unalias ns-unmap nth nthnext nthrest num number? numerator object-array odd? parents partial partition partition-all partition-by pcalls peek persistent! pmap pop pop! pop-thread-bindings pos? pr pr-str prefer-method prefers print print-ctor print-dup print-method print-simple print-str printf println println-str prn prn-str promise proxy-call-with-super proxy-mappings proxy-name push-thread-bindings quot rand rand-int rand-nth range ratio? rational? rationalize re-find re-groups re-matcher re-matches re-pattern re-seq read read-line read-string realized? record? reduce reduce-kv reduced reduced? reductions ref ref-history-count ref-max-history ref-min-history ref-set refer release-pending-sends rem remove remove-all-methods remove-method remove-ns remove-watch repeat repeatedly replace replicate require reset! reset-meta! resolve rest restart-agent resultset-seq reverse reversible? rseq rsubseq satisfies? second select-keys send send-off send-via seq seq? seque sequence sequential? set set-agent-send-executor! set-agent-send-off-executor! set-error-handler! set-error-mode! set-validator! set? short short-array shorts shuffle shutdown-agents slurp some some-fn some? sort sort-by sorted-map sorted-map-by sorted-set sorted-set-by sorted? special-symbol? spit split-at split-with str string? struct struct-map subs subseq subvec supers swap! symbol symbol? take take-last take-nth take-while test the-ns thread-bound? to-array to-array-2d trampoline transient tree-seq true? type unchecked-add unchecked-add-int unchecked-byte unchecked-char unchecked-dec unchecked-dec-int unchecked-divide-int unchecked-double unchecked-float unchecked-inc unchecked-inc-int unchecked-int unchecked-long unchecked-multiply unchecked-multiply-int unchecked-negate unchecked-negate-int unchecked-remainder-int unchecked-short unchecked-subtract unchecked-subtract-int underive unsigned-bit-shift-right update-in update-proxy use val vals var-get var-set var? vary-meta vec vector vector-of vector? with-bindings* with-meta with-redefs-fn xml-seq zero? zipmap
-syntax keyword clojureVariable *1 *2 *3 *agent* *allow-unresolved-vars* *assert* *clojure-version* *command-line-args* *compile-files* *compile-path* *compiler-options* *data-readers* *default-data-reader-fn* *e *err* *file* *flush-on-newline* *fn-loader* *in* *math-context* *ns* *out* *print-dup* *print-length* *print-level* *print-meta* *print-readably* *read-eval* *source-path* *unchecked-math* *use-context-classloader* *verbose-defrecords* *warn-on-reflection* EMPTY-NODE char-escape-string char-name-string clojure.core/*1 clojure.core/*2 clojure.core/*3 clojure.core/*agent* clojure.core/*allow-unresolved-vars* clojure.core/*assert* clojure.core/*clojure-version* clojure.core/*command-line-args* clojure.core/*compile-files* clojure.core/*compile-path* clojure.core/*compiler-options* clojure.core/*data-readers* clojure.core/*default-data-reader-fn* clojure.core/*e clojure.core/*err* clojure.core/*file* clojure.core/*flush-on-newline* clojure.core/*fn-loader* clojure.core/*in* clojure.core/*math-context* clojure.core/*ns* clojure.core/*out* clojure.core/*print-dup* clojure.core/*print-length* clojure.core/*print-level* clojure.core/*print-meta* clojure.core/*print-readably* clojure.core/*read-eval* clojure.core/*source-path* clojure.core/*unchecked-math* clojure.core/*use-context-classloader* clojure.core/*verbose-defrecords* clojure.core/*warn-on-reflection* clojure.core/EMPTY-NODE clojure.core/char-escape-string clojure.core/char-name-string clojure.core/default-data-readers clojure.core/primitives-classnames clojure.core/unquote clojure.core/unquote-splicing default-data-readers primitives-classnames unquote unquote-splicing
+" Generated from https://github.com/guns/vim-clojure-static/blob/vim-release-011/clj/src/vim_clojure_static/generate.clj
+" Clojure version 1.8.0
+let s:clojure_syntax_keywords = {
+ \ 'clojureBoolean': ["false","true"]
+ \ , 'clojureCond': ["case","clojure.core/case","clojure.core/cond","clojure.core/cond->","clojure.core/cond->>","clojure.core/condp","clojure.core/if-let","clojure.core/if-not","clojure.core/if-some","clojure.core/when","clojure.core/when-first","clojure.core/when-let","clojure.core/when-not","clojure.core/when-some","cond","cond->","cond->>","condp","if-let","if-not","if-some","when","when-first","when-let","when-not","when-some"]
+ \ , 'clojureConstant': ["nil"]
+ \ , 'clojureDefine': ["clojure.core/definline","clojure.core/definterface","clojure.core/defmacro","clojure.core/defmethod","clojure.core/defmulti","clojure.core/defn","clojure.core/defn-","clojure.core/defonce","clojure.core/defprotocol","clojure.core/defrecord","clojure.core/defstruct","clojure.core/deftype","definline","definterface","defmacro","defmethod","defmulti","defn","defn-","defonce","defprotocol","defrecord","defstruct","deftype"]
+ \ , 'clojureException': ["catch","finally","throw","try"]
+ \ , 'clojureFunc': ["*","*'","+","+'","-","-'","->ArrayChunk","->Eduction","->Vec","->VecNode","->VecSeq","-cache-protocol-fn","-reset-methods","/","<","<=","=","==",">",">=","Throwable->map","accessor","aclone","add-classpath","add-watch","agent","agent-error","agent-errors","aget","alength","alias","all-ns","alter","alter-meta!","alter-var-root","ancestors","apply","array-map","aset","aset-boolean","aset-byte","aset-char","aset-double","aset-float","aset-int","aset-long","aset-short","assoc","assoc!","assoc-in","associative?","atom","await","await-for","await1","bases","bean","bigdec","bigint","biginteger","bit-and","bit-and-not","bit-clear","bit-flip","bit-not","bit-or","bit-set","bit-shift-left","bit-shift-right","bit-test","bit-xor","boolean","boolean-array","booleans","bound-fn*","bound?","butlast","byte","byte-array","bytes","cast","cat","char","char-array","char?","chars","chunk","chunk-append","chunk-buffer","chunk-cons","chunk-first","chunk-next","chunk-rest","chunked-seq?","class","class?","clear-agent-errors","clojure-version","clojure.core/*","clojure.core/*'","clojure.core/+","clojure.core/+'","clojure.core/-","clojure.core/-'","clojure.core/->ArrayChunk","clojure.core/->Eduction","clojure.core/->Vec","clojure.core/->VecNode","clojure.core/->VecSeq","clojure.core/-cache-protocol-fn","clojure.core/-reset-methods","clojure.core//","clojure.core/<","clojure.core/<=","clojure.core/=","clojure.core/==","clojure.core/>","clojure.core/>=","clojure.core/Throwable->map","clojure.core/accessor","clojure.core/aclone","clojure.core/add-classpath","clojure.core/add-watch","clojure.core/agent","clojure.core/agent-error","clojure.core/agent-errors","clojure.core/aget","clojure.core/alength","clojure.core/alias","clojure.core/all-ns","clojure.core/alter","clojure.core/alter-meta!","clojure.core/alter-var-root","clojure.core/ancestors","clojure.core/apply","clojure.core/array-map","clojure.core/aset","clojure.core/aset-boolean","clojure.core/aset-byte","clojure.core/aset-char","clojure.core/aset-double","clojure.core/aset-float","clojure.core/aset-int","clojure.core/aset-long","clojure.core/aset-short","clojure.core/assoc","clojure.core/assoc!","clojure.core/assoc-in","clojure.core/associative?","clojure.core/atom","clojure.core/await","clojure.core/await-for","clojure.core/await1","clojure.core/bases","clojure.core/bean","clojure.core/bigdec","clojure.core/bigint","clojure.core/biginteger","clojure.core/bit-and","clojure.core/bit-and-not","clojure.core/bit-clear","clojure.core/bit-flip","clojure.core/bit-not","clojure.core/bit-or","clojure.core/bit-set","clojure.core/bit-shift-left","clojure.core/bit-shift-right","clojure.core/bit-test","clojure.core/bit-xor","clojure.core/boolean","clojure.core/boolean-array","clojure.core/booleans","clojure.core/bound-fn*","clojure.core/bound?","clojure.core/butlast","clojure.core/byte","clojure.core/byte-array","clojure.core/bytes","clojure.core/cast","clojure.core/cat","clojure.core/char","clojure.core/char-array","clojure.core/char?","clojure.core/chars","clojure.core/chunk","clojure.core/chunk-append","clojure.core/chunk-buffer","clojure.core/chunk-cons","clojure.core/chunk-first","clojure.core/chunk-next","clojure.core/chunk-rest","clojure.core/chunked-seq?","clojure.core/class","clojure.core/class?","clojure.core/clear-agent-errors","clojure.core/clojure-version","clojure.core/coll?","clojure.core/commute","clojure.core/comp","clojure.core/comparator","clojure.core/compare","clojure.core/compare-and-set!","clojure.core/compile","clojure.core/complement","clojure.core/completing","clojure.core/concat","clojure.core/conj","clojure.core/conj!","clojure.core/cons","clojure.core/constantly","clojure.core/construct-proxy","clojure.core/contains?","clojure.core/count","clojure.core/counted?","clojure.core/create-ns","clojure.core/create-struct","clojure.core/cycle","clojure.core/dec","clojure.core/dec'","clojure.core/decimal?","clojure.core/dedupe","clojure.core/delay?","clojure.core/deliver","clojure.core/denominator","clojure.core/deref","clojure.core/derive","clojure.core/descendants","clojure.core/destructure","clojure.core/disj","clojure.core/disj!","clojure.core/dissoc","clojure.core/dissoc!","clojure.core/distinct","clojure.core/distinct?","clojure.core/doall","clojure.core/dorun","clojure.core/double","clojure.core/double-array","clojure.core/doubles","clojure.core/drop","clojure.core/drop-last","clojure.core/drop-while","clojure.core/eduction","clojure.core/empty","clojure.core/empty?","clojure.core/ensure","clojure.core/ensure-reduced","clojure.core/enumeration-seq","clojure.core/error-handler","clojure.core/error-mode","clojure.core/eval","clojure.core/even?","clojure.core/every-pred","clojure.core/every?","clojure.core/ex-data","clojure.core/ex-info","clojure.core/extend","clojure.core/extenders","clojure.core/extends?","clojure.core/false?","clojure.core/ffirst","clojure.core/file-seq","clojure.core/filter","clojure.core/filterv","clojure.core/find","clojure.core/find-keyword","clojure.core/find-ns","clojure.core/find-protocol-impl","clojure.core/find-protocol-method","clojure.core/find-var","clojure.core/first","clojure.core/flatten","clojure.core/float","clojure.core/float-array","clojure.core/float?","clojure.core/floats","clojure.core/flush","clojure.core/fn?","clojure.core/fnext","clojure.core/fnil","clojure.core/force","clojure.core/format","clojure.core/frequencies","clojure.core/future-call","clojure.core/future-cancel","clojure.core/future-cancelled?","clojure.core/future-done?","clojure.core/future?","clojure.core/gensym","clojure.core/get","clojure.core/get-in","clojure.core/get-method","clojure.core/get-proxy-class","clojure.core/get-thread-bindings","clojure.core/get-validator","clojure.core/group-by","clojure.core/hash","clojure.core/hash-combine","clojure.core/hash-map","clojure.core/hash-ordered-coll","clojure.core/hash-set","clojure.core/hash-unordered-coll","clojure.core/identical?","clojure.core/identity","clojure.core/ifn?","clojure.core/in-ns","clojure.core/inc","clojure.core/inc'","clojure.core/init-proxy","clojure.core/instance?","clojure.core/int","clojure.core/int-array","clojure.core/integer?","clojure.core/interleave","clojure.core/intern","clojure.core/interpose","clojure.core/into","clojure.core/into-array","clojure.core/ints","clojure.core/isa?","clojure.core/iterate","clojure.core/iterator-seq","clojure.core/juxt","clojure.core/keep","clojure.core/keep-indexed","clojure.core/key","clojure.core/keys","clojure.core/keyword","clojure.core/keyword?","clojure.core/last","clojure.core/line-seq","clojure.core/list","clojure.core/list*","clojure.core/list?","clojure.core/load","clojure.core/load-file","clojure.core/load-reader","clojure.core/load-string","clojure.core/loaded-libs","clojure.core/long","clojure.core/long-array","clojure.core/longs","clojure.core/macroexpand","clojure.core/macroexpand-1","clojure.core/make-array","clojure.core/make-hierarchy","clojure.core/map","clojure.core/map-entry?","clojure.core/map-indexed","clojure.core/map?","clojure.core/mapcat","clojure.core/mapv","clojure.core/max","clojure.core/max-key","clojure.core/memoize","clojure.core/merge","clojure.core/merge-with","clojure.core/meta","clojure.core/method-sig","clojure.core/methods","clojure.core/min","clojure.core/min-key","clojure.core/mix-collection-hash","clojure.core/mod","clojure.core/munge","clojure.core/name","clojure.core/namespace","clojure.core/namespace-munge","clojure.core/neg?","clojure.core/newline","clojure.core/next","clojure.core/nfirst","clojure.core/nil?","clojure.core/nnext","clojure.core/not","clojure.core/not-any?","clojure.core/not-empty","clojure.core/not-every?","clojure.core/not=","clojure.core/ns-aliases","clojure.core/ns-imports","clojure.core/ns-interns","clojure.core/ns-map","clojure.core/ns-name","clojure.core/ns-publics","clojure.core/ns-refers","clojure.core/ns-resolve","clojure.core/ns-unalias","clojure.core/ns-unmap","clojure.core/nth","clojure.core/nthnext","clojure.core/nthrest","clojure.core/num","clojure.core/number?","clojure.core/numerator","clojure.core/object-array","clojure.core/odd?","clojure.core/parents","clojure.core/partial","clojure.core/partition","clojure.core/partition-all","clojure.core/partition-by","clojure.core/pcalls","clojure.core/peek","clojure.core/persistent!","clojure.core/pmap","clojure.core/pop","clojure.core/pop!","clojure.core/pop-thread-bindings","clojure.core/pos?","clojure.core/pr","clojure.core/pr-str","clojure.core/prefer-method","clojure.core/prefers","clojure.core/print","clojure.core/print-ctor","clojure.core/print-dup","clojure.core/print-method","clojure.core/print-simple","clojure.core/print-str","clojure.core/printf","clojure.core/println","clojure.core/println-str","clojure.core/prn","clojure.core/prn-str","clojure.core/promise","clojure.core/proxy-call-with-super","clojure.core/proxy-mappings","clojure.core/proxy-name","clojure.core/push-thread-bindings","clojure.core/quot","clojure.core/rand","clojure.core/rand-int","clojure.core/rand-nth","clojure.core/random-sample","clojure.core/range","clojure.core/ratio?","clojure.core/rational?","clojure.core/rationalize","clojure.core/re-find","clojure.core/re-groups","clojure.core/re-matcher","clojure.core/re-matches","clojure.core/re-pattern","clojure.core/re-seq","clojure.core/read","clojure.core/read-line","clojure.core/read-string","clojure.core/reader-conditional","clojure.core/reader-conditional?","clojure.core/realized?","clojure.core/record?","clojure.core/reduce","clojure.core/reduce-kv","clojure.core/reduced","clojure.core/reduced?","clojure.core/reductions","clojure.core/ref","clojure.core/ref-history-count","clojure.core/ref-max-history","clojure.core/ref-min-history","clojure.core/ref-set","clojure.core/refer","clojure.core/release-pending-sends","clojure.core/rem","clojure.core/remove","clojure.core/remove-all-methods","clojure.core/remove-method","clojure.core/remove-ns","clojure.core/remove-watch","clojure.core/repeat","clojure.core/repeatedly","clojure.core/replace","clojure.core/replicate","clojure.core/require","clojure.core/reset!","clojure.core/reset-meta!","clojure.core/resolve","clojure.core/rest","clojure.core/restart-agent","clojure.core/resultset-seq","clojure.core/reverse","clojure.core/reversible?","clojure.core/rseq","clojure.core/rsubseq","clojure.core/run!","clojure.core/satisfies?","clojure.core/second","clojure.core/select-keys","clojure.core/send","clojure.core/send-off","clojure.core/send-via","clojure.core/seq","clojure.core/seq?","clojure.core/seque","clojure.core/sequence","clojure.core/sequential?","clojure.core/set","clojure.core/set-agent-send-executor!","clojure.core/set-agent-send-off-executor!","clojure.core/set-error-handler!","clojure.core/set-error-mode!","clojure.core/set-validator!","clojure.core/set?","clojure.core/short","clojure.core/short-array","clojure.core/shorts","clojure.core/shuffle","clojure.core/shutdown-agents","clojure.core/slurp","clojure.core/some","clojure.core/some-fn","clojure.core/some?","clojure.core/sort","clojure.core/sort-by","clojure.core/sorted-map","clojure.core/sorted-map-by","clojure.core/sorted-set","clojure.core/sorted-set-by","clojure.core/sorted?","clojure.core/special-symbol?","clojure.core/spit","clojure.core/split-at","clojure.core/split-with","clojure.core/str","clojure.core/string?","clojure.core/struct","clojure.core/struct-map","clojure.core/subs","clojure.core/subseq","clojure.core/subvec","clojure.core/supers","clojure.core/swap!","clojure.core/symbol","clojure.core/symbol?","clojure.core/tagged-literal","clojure.core/tagged-literal?","clojure.core/take","clojure.core/take-last","clojure.core/take-nth","clojure.core/take-while","clojure.core/test","clojure.core/the-ns","clojure.core/thread-bound?","clojure.core/to-array","clojure.core/to-array-2d","clojure.core/trampoline","clojure.core/transduce","clojure.core/transient","clojure.core/tree-seq","clojure.core/true?","clojure.core/type","clojure.core/unchecked-add","clojure.core/unchecked-add-int","clojure.core/unchecked-byte","clojure.core/unchecked-char","clojure.core/unchecked-dec","clojure.core/unchecked-dec-int","clojure.core/unchecked-divide-int","clojure.core/unchecked-double","clojure.core/unchecked-float","clojure.core/unchecked-inc","clojure.core/unchecked-inc-int","clojure.core/unchecked-int","clojure.core/unchecked-long","clojure.core/unchecked-multiply","clojure.core/unchecked-multiply-int","clojure.core/unchecked-negate","clojure.core/unchecked-negate-int","clojure.core/unchecked-remainder-int","clojure.core/unchecked-short","clojure.core/unchecked-subtract","clojure.core/unchecked-subtract-int","clojure.core/underive","clojure.core/unreduced","clojure.core/unsigned-bit-shift-right","clojure.core/update","clojure.core/update-in","clojure.core/update-proxy","clojure.core/use","clojure.core/val","clojure.core/vals","clojure.core/var-get","clojure.core/var-set","clojure.core/var?","clojure.core/vary-meta","clojure.core/vec","clojure.core/vector","clojure.core/vector-of","clojure.core/vector?","clojure.core/volatile!","clojure.core/volatile?","clojure.core/vreset!","clojure.core/with-bindings*","clojure.core/with-meta","clojure.core/with-redefs-fn","clojure.core/xml-seq","clojure.core/zero?","clojure.core/zipmap","coll?","commute","comp","comparator","compare","compare-and-set!","compile","complement","completing","concat","conj","conj!","cons","constantly","construct-proxy","contains?","count","counted?","create-ns","create-struct","cycle","dec","dec'","decimal?","dedupe","delay?","deliver","denominator","deref","derive","descendants","destructure","disj","disj!","dissoc","dissoc!","distinct","distinct?","doall","dorun","double","double-array","doubles","drop","drop-last","drop-while","eduction","empty","empty?","ensure","ensure-reduced","enumeration-seq","error-handler","error-mode","eval","even?","every-pred","every?","ex-data","ex-info","extend","extenders","extends?","false?","ffirst","file-seq","filter","filterv","find","find-keyword","find-ns","find-protocol-impl","find-protocol-method","find-var","first","flatten","float","float-array","float?","floats","flush","fn?","fnext","fnil","force","format","frequencies","future-call","future-cancel","future-cancelled?","future-done?","future?","gensym","get","get-in","get-method","get-proxy-class","get-thread-bindings","get-validator","group-by","hash","hash-combine","hash-map","hash-ordered-coll","hash-set","hash-unordered-coll","identical?","identity","ifn?","in-ns","inc","inc'","init-proxy","instance?","int","int-array","integer?","interleave","intern","interpose","into","into-array","ints","isa?","iterate","iterator-seq","juxt","keep","keep-indexed","key","keys","keyword","keyword?","last","line-seq","list","list*","list?","load","load-file","load-reader","load-string","loaded-libs","long","long-array","longs","macroexpand","macroexpand-1","make-array","make-hierarchy","map","map-entry?","map-indexed","map?","mapcat","mapv","max","max-key","memoize","merge","merge-with","meta","method-sig","methods","min","min-key","mix-collection-hash","mod","munge","name","namespace","namespace-munge","neg?","newline","next","nfirst","nil?","nnext","not","not-any?","not-empty","not-every?","not=","ns-aliases","ns-imports","ns-interns","ns-map","ns-name","ns-publics","ns-refers","ns-resolve","ns-unalias","ns-unmap","nth","nthnext","nthrest","num","number?","numerator","object-array","odd?","parents","partial","partition","partition-all","partition-by","pcalls","peek","persistent!","pmap","pop","pop!","pop-thread-bindings","pos?","pr","pr-str","prefer-method","prefers","print","print-ctor","print-dup","print-method","print-simple","print-str","printf","println","println-str","prn","prn-str","promise","proxy-call-with-super","proxy-mappings","proxy-name","push-thread-bindings","quot","rand","rand-int","rand-nth","random-sample","range","ratio?","rational?","rationalize","re-find","re-groups","re-matcher","re-matches","re-pattern","re-seq","read","read-line","read-string","reader-conditional","reader-conditional?","realized?","record?","reduce","reduce-kv","reduced","reduced?","reductions","ref","ref-history-count","ref-max-history","ref-min-history","ref-set","refer","release-pending-sends","rem","remove","remove-all-methods","remove-method","remove-ns","remove-watch","repeat","repeatedly","replace","replicate","require","reset!","reset-meta!","resolve","rest","restart-agent","resultset-seq","reverse","reversible?","rseq","rsubseq","run!","satisfies?","second","select-keys","send","send-off","send-via","seq","seq?","seque","sequence","sequential?","set","set-agent-send-executor!","set-agent-send-off-executor!","set-error-handler!","set-error-mode!","set-validator!","set?","short","short-array","shorts","shuffle","shutdown-agents","slurp","some","some-fn","some?","sort","sort-by","sorted-map","sorted-map-by","sorted-set","sorted-set-by","sorted?","special-symbol?","spit","split-at","split-with","str","string?","struct","struct-map","subs","subseq","subvec","supers","swap!","symbol","symbol?","tagged-literal","tagged-literal?","take","take-last","take-nth","take-while","test","the-ns","thread-bound?","to-array","to-array-2d","trampoline","transduce","transient","tree-seq","true?","type","unchecked-add","unchecked-add-int","unchecked-byte","unchecked-char","unchecked-dec","unchecked-dec-int","unchecked-divide-int","unchecked-double","unchecked-float","unchecked-inc","unchecked-inc-int","unchecked-int","unchecked-long","unchecked-multiply","unchecked-multiply-int","unchecked-negate","unchecked-negate-int","unchecked-remainder-int","unchecked-short","unchecked-subtract","unchecked-subtract-int","underive","unreduced","unsigned-bit-shift-right","update","update-in","update-proxy","use","val","vals","var-get","var-set","var?","vary-meta","vec","vector","vector-of","vector?","volatile!","volatile?","vreset!","with-bindings*","with-meta","with-redefs-fn","xml-seq","zero?","zipmap"]
+ \ , 'clojureMacro': ["->","->>","..","amap","and","areduce","as->","assert","binding","bound-fn","clojure.core/->","clojure.core/->>","clojure.core/..","clojure.core/amap","clojure.core/and","clojure.core/areduce","clojure.core/as->","clojure.core/assert","clojure.core/binding","clojure.core/bound-fn","clojure.core/comment","clojure.core/declare","clojure.core/delay","clojure.core/dosync","clojure.core/doto","clojure.core/extend-protocol","clojure.core/extend-type","clojure.core/for","clojure.core/future","clojure.core/gen-class","clojure.core/gen-interface","clojure.core/import","clojure.core/io!","clojure.core/lazy-cat","clojure.core/lazy-seq","clojure.core/letfn","clojure.core/locking","clojure.core/memfn","clojure.core/ns","clojure.core/or","clojure.core/proxy","clojure.core/proxy-super","clojure.core/pvalues","clojure.core/refer-clojure","clojure.core/reify","clojure.core/some->","clojure.core/some->>","clojure.core/sync","clojure.core/time","clojure.core/vswap!","clojure.core/with-bindings","clojure.core/with-in-str","clojure.core/with-loading-context","clojure.core/with-local-vars","clojure.core/with-open","clojure.core/with-out-str","clojure.core/with-precision","clojure.core/with-redefs","comment","declare","delay","dosync","doto","extend-protocol","extend-type","for","future","gen-class","gen-interface","import","io!","lazy-cat","lazy-seq","letfn","locking","memfn","ns","or","proxy","proxy-super","pvalues","refer-clojure","reify","some->","some->>","sync","time","vswap!","with-bindings","with-in-str","with-loading-context","with-local-vars","with-open","with-out-str","with-precision","with-redefs"]
+ \ , 'clojureRepeat': ["clojure.core/doseq","clojure.core/dotimes","clojure.core/while","doseq","dotimes","while"]
+ \ , 'clojureSpecial': [".","clojure.core/fn","clojure.core/let","clojure.core/loop","def","do","fn","if","let","loop","monitor-enter","monitor-exit","new","quote","recur","set!","var"]
+ \ , 'clojureVariable': ["*1","*2","*3","*agent*","*allow-unresolved-vars*","*assert*","*clojure-version*","*command-line-args*","*compile-files*","*compile-path*","*compiler-options*","*data-readers*","*default-data-reader-fn*","*e","*err*","*file*","*flush-on-newline*","*fn-loader*","*in*","*math-context*","*ns*","*out*","*print-dup*","*print-length*","*print-level*","*print-meta*","*print-readably*","*read-eval*","*source-path*","*suppress-read*","*unchecked-math*","*use-context-classloader*","*verbose-defrecords*","*warn-on-reflection*","EMPTY-NODE","char-escape-string","char-name-string","clojure.core/*1","clojure.core/*2","clojure.core/*3","clojure.core/*agent*","clojure.core/*allow-unresolved-vars*","clojure.core/*assert*","clojure.core/*clojure-version*","clojure.core/*command-line-args*","clojure.core/*compile-files*","clojure.core/*compile-path*","clojure.core/*compiler-options*","clojure.core/*data-readers*","clojure.core/*default-data-reader-fn*","clojure.core/*e","clojure.core/*err*","clojure.core/*file*","clojure.core/*flush-on-newline*","clojure.core/*fn-loader*","clojure.core/*in*","clojure.core/*math-context*","clojure.core/*ns*","clojure.core/*out*","clojure.core/*print-dup*","clojure.core/*print-length*","clojure.core/*print-level*","clojure.core/*print-meta*","clojure.core/*print-readably*","clojure.core/*read-eval*","clojure.core/*source-path*","clojure.core/*suppress-read*","clojure.core/*unchecked-math*","clojure.core/*use-context-classloader*","clojure.core/*verbose-defrecords*","clojure.core/*warn-on-reflection*","clojure.core/EMPTY-NODE","clojure.core/char-escape-string","clojure.core/char-name-string","clojure.core/default-data-readers","clojure.core/primitives-classnames","clojure.core/unquote","clojure.core/unquote-splicing","default-data-readers","primitives-classnames","unquote","unquote-splicing"]
+ \ }
+
+function! s:syntax_keyword(dict)
+ for key in keys(a:dict)
+ execute 'syntax keyword' key join(a:dict[key], ' ')
+ endfor
+endfunction
+
+if exists('b:clojure_syntax_without_core_keywords') && b:clojure_syntax_without_core_keywords
+ " Only match language specials and primitives
+ for s:key in ['clojureBoolean', 'clojureConstant', 'clojureException', 'clojureSpecial']
+ execute 'syntax keyword' s:key join(s:clojure_syntax_keywords[s:key], ' ')
+ endfor
+else
+ call s:syntax_keyword(s:clojure_syntax_keywords)
+endif
+
+if exists('g:clojure_syntax_keywords')
+ call s:syntax_keyword(g:clojure_syntax_keywords)
+endif
+
+if exists('b:clojure_syntax_keywords')
+ call s:syntax_keyword(b:clojure_syntax_keywords)
+endif
+
+unlet! s:key
+delfunction s:syntax_keyword
" Keywords are symbols:
" static Pattern symbolPat = Pattern.compile("[:]?([\\D&&[^/]].*/)?([\\D&&[^/]][^/]*)");
@@ -43,7 +74,7 @@ syntax match clojureKeyword "\v<:{1,2}%([^ \n\r\t()\[\]{}";@^`~\\%/]+/)*[^ \n\r\
syntax match clojureStringEscape "\v\\%([\\btnfr"]|u\x{4}|[0-3]\o{2}|\o{1,2})" contained
-syntax region clojureString start=/"/ skip=/\\\\\|\\"/ end=/"/ contains=clojureStringEscape,@Spell
+syntax region clojureString matchgroup=clojureStringDelimiter start=/"/ skip=/\\\\\|\\"/ end=/"/ contains=clojureStringEscape,@Spell
syntax match clojureCharacter "\\."
syntax match clojureCharacter "\\o\%([0-3]\o\{2\}\|\o\{1,2\}\)"
@@ -77,7 +108,7 @@ syntax match clojureMeta "\^"
syntax match clojureDeref "@"
syntax match clojureDispatch "\v#[\^'=<_]?"
-" Clojure permits no more than 20 params.
+" Clojure permits no more than 20 anonymous params.
syntax match clojureAnonArg "%\(20\|1\d\|[1-9]\|&\)\?"
syntax match clojureRegexpEscape "\v\\%([\\tnrfae.()\[\]{}^$*?+]|c\u|0[0-3]?\o{1,2}|x%(\x{2}|\{\x{1,6}\})|u\x{4})" contained display
@@ -85,27 +116,27 @@ syntax region clojureRegexpQuoted start=/\\Q/ms=e+1 skip=/\\\\\|\\"/ end=/\\E/me
syntax region clojureRegexpQuote start=/\\Q/ skip=/\\\\\|\\"/ end=/\\E/ end=/"/me=s-1 contains=clojureRegexpQuoted keepend contained
" -*- CHARACTER PROPERTY CLASSES -*-
-" Generated from https://github.com/guns/vim-clojure-static/blob/vim-release-010/clj/src/vim_clojure_static/generate.clj
-" Java version 1.7.0_51
+" Generated from https://github.com/guns/vim-clojure-static/blob/vim-release-011/clj/src/vim_clojure_static/generate.clj
+" Java version 1.8.0_92
syntax match clojureRegexpPosixCharClass "\v\\[pP]\{%(Cntrl|A%(l%(pha|num)|SCII)|Space|Graph|Upper|P%(rint|unct)|Blank|XDigit|Digit|Lower)\}" contained display
syntax match clojureRegexpJavaCharClass "\v\\[pP]\{java%(Whitespace|JavaIdentifier%(Part|Start)|SpaceChar|Mirrored|TitleCase|I%(SOControl|de%(ographic|ntifierIgnorable))|D%(efined|igit)|U%(pperCase|nicodeIdentifier%(Part|Start))|L%(etter%(OrDigit)?|owerCase)|Alphabetic)\}" contained display
-syntax match clojureRegexpUnicodeCharClass "\v\\[pP]\{\cIs%(l%(owercase|etter)|hex%(digit|_digit)|w%(hite%(_space|space)|ord)|noncharacter%(_code_point|codepoint)|p%(rint|unctuation)|ideographic|graph|a%(l%(num|phabetic)|ssigned)|uppercase|titlecase|blank|digit|control)\}" contained display
+syntax match clojureRegexpUnicodeCharClass "\v\\[pP]\{\cIs%(l%(owercase|etter)|hex%(digit|_digit)|w%(hite%(_space|space)|ord)|noncharacter%(_code_point|codepoint)|p%(rint|unctuation)|ideographic|graph|a%(l%(num|phabetic)|ssigned)|uppercase|join%(control|_control)|titlecase|blank|digit|control)\}" contained display
syntax match clojureRegexpUnicodeCharClass "\v\\[pP][NSCMZPL]" contained display
syntax match clojureRegexpUnicodeCharClass "\v\\[pP]\{%(N[dlo]?|P[dcifeos]?|C[ncfos]?|M[nce]?|Z[lsp]?|S[mcko]?|L[muCDlto]?)\}" contained display
syntax match clojureRegexpUnicodeCharClass "\v\\[pP]\{%(Is|gc\=|general_category\=)?%(N[dlo]?|P[dcifeos]?|C[ncfos]?|M[nce]?|Z[lsp]?|S[mcko]?|L[muCDlto]?)\}" contained display
-syntax match clojureRegexpUnicodeCharClass "\v\\[pP]\{\c%(Is|sc\=|script\=)%(l%(epc%(ha)?|y%([dc]i%(an)?)|a%(t%(n|in)|na|oo?)|i%(n%(b|ear_b)|mbu?|su))|vaii?|d%(srt|e%(seret|va%(nagari)?))|g%(lag%(olitic)?|eor%(gian)?|oth%(ic)?|re%(k|ek)|u%(j%(arati|r)|r%(u|mukhi)))|u%(gar%(itic)?|nknown)|a%(r%(ab%(ic)?|m%([ni]|enian))|v%(st|estan))|e%(thi%(opic)?|gyp%(tian_hieroglyphs)?)|z%(inh|yyy|zzz)|r%(un%(ic|r)|ejang|jng)|m%(a%(nd%(aic)?|layalam)|lym|y%(anmar|mr)|tei|ong%(olian)?|eetei_mayek)|c%(a%(n%(adian_aboriginal|s)|ri%(an)?)|y%(priot|r%(l|illic))|prt|uneiform|o%(pt%(ic)?|mmon)|h%(er%(okee)?|am))|i%(n%(scriptional_pa%(rthian|hlavi)|herited)|mperial_aramaic|tal)|b%(eng%(ali)?|a%(t%(ak|k)|li%(nese)?|mum?)|ra%(i%(lle)?|h%(mi)?)|opo%(mofo)?|u%(gi%(nese)?|h%(d|id)))|o%(g%(am|ham)|r%(iya|kh|ya)|sma%(nya)?|l%(d_%(south_arabian|persian|italic|turkic)|ck|_chiki))|p%(rti|h%(oenician|li|ag%(s_pa)?|nx))|k%(h%(m%(r|er)|ar%(oshthi)?)|nda|a%(li|n%(a|nada)|takana|yah_li|ithi)|thi)|yi%(ii)?|t%(elu%(gu)?|i%(finagh|b%(t|etan))|ha%(i|a%(na)?)|a%(i_%(le|tham|viet)|g%(alog|b%(anwa)?)|vt|l[ue]|m%(il|l))|fng|glg)|x%(peo|sux)|n%(ew_tai_lue|koo?)|h%(ira%(gana)?|an%([io]|unoo|g%(ul)?)?|ebr%(ew)?)|java%(nese)?|s%(inh%(ala)?|ha%(vian|w)|a%(ur%(ashtra)?|m%(r|aritan)|rb)|y%(r%(c|iac)|lo%(ti_nagri)?)|und%(anese)?))\}" contained display
-syntax match clojureRegexpUnicodeCharClass "\v\\[pP]\{\c%(In|blk\=|block\=)%(javanese|h%(a%(lfwidth%( and fullwidth forms|andfullwidthforms|_and_fullwidth_forms)|n%(unoo|gul%(compatibilityjamo|syllables|jamo%(extended\-[ab])?|_%(syllables|jamo%(_extended_[ab])?|compatibility_jamo)| %(syllables|compatibility jamo|jamo%( extended\-[ab])?))))|i%(ragana|gh%( %(private use surrogates|surrogates)|_%(private_use_surrogates|surrogates)|surrogates|privateusesurrogates))|ebrew)|i%(pa%([ _]extensions|extensions)|deographic%( description characters|_description_characters|descriptioncharacters)|nscriptional%(%([ _]pa%(rthian|hlavi))|pa%(rthian|hlavi))|mperial%(aramaic|[_ ]aramaic))|l%(e%(tterlike%([_ ]symbols|symbols)|pcha)|ow%([_ ]surrogates|surrogates)|i%(mbu|near%(_b_%(ideograms|syllabary)|b%(ideograms|syllabary)| b %(ideograms|syllabary))|su)|a%(tin%(extended%(additional|\-[dacb])| extended%( additional|\-[dacb])|\-1%(supplement| supplement)|_%(extended_%([dcb]|a%(dditional)?)|1_supplement))|o)|y[cd]ian)|b%(u%(ginese|hid)|ra%(hmi|ille%(patterns|[_ ]patterns))|o%(x%([ _]drawing|drawing)|pomofo%([ _]extended|extended)?)|lock%([ _]elements|elements)|yzantine%( musical symbols|musicalsymbols|_musical_symbols)|engali|a%(linese|mum%(supplement|[ _]supplement)?|tak|sic%([ _]latin|latin)))|e%(gyptian%([ _]hieroglyphs|hieroglyphs)|moticons|nclosed%( %(cjk letters and months|ideographic supplement|alphanumeric%( supplement|s))|cjklettersandmonths|_%(ideographic_supplement|alphanumeric%(_supplement|s)|cjk_letters_and_months)|alphanumerics%(upplement)?|ideographicsupplement)|thiopic%(supplement|_%(supplement|extended%(_a)?)| %(supplement|extended%(\-a)?)|extended%(\-a)?)?)|k%(h%(aroshthi|mer%([_ ]symbols|symbols)?)|a%(takana%(_phonetic_extensions|phoneticextensions| phonetic extensions)?|n%(gxi%([_ ]radicals|radicals)|a%(supplement|[ _]supplement)|bun|nada)|ithi|yah%([ _]li|li)))|r%(u%(nic|mi%(numeralsymbols| numeral symbols|_numeral_symbols))|ejang)|n%(umber%(forms|[ _]forms)|ko|ew%(_tai_lue|tailue| tai lue))|m%(iscellaneous%(technical|symbols%(and%(pictographs|arrows))?|mathematicalsymbols\-[ab]| %(technical|mathematical symbols\-[ab]|symbols%( and %(pictographs|arrows))?)|_%(technical|symbols%(_and_%(pictographs|arrows))?|mathematical_symbols_[ab]))|usical%([_ ]symbols|symbols)|eetei%(mayek|[_ ]mayek)|a%(ndaic|hjong%([ _]tiles|tiles)|layalam|thematical%(alphanumericsymbols| %(alphanumeric symbols|operators)|_%(alphanumeric_symbols|operators)|operators))|yanmar%(extended\-a|_extended_a| extended\-a)?|o%(difier%(_tone_letters| tone letters|toneletters)|ngolian))|d%(e%(seret|vanagari%([ _]extended|extended)?)|ingbats|omino%([ _]tiles|tiles))|yi%(syllables|%([_ ]%(syllables|radicals))|radicals|jing%(hexagramsymbols| hexagram symbols|_hexagram_symbols))|s%(havian|mall%( form variants|formvariants|_form_variants)|p%(acing%(_modifier_letters| modifier letters|modifierletters)|ecials)|a%(maritan|urashtra)|u%(p%(erscripts%(_and_subscripts|andsubscripts| and subscripts)|plementa%(ry%(_private_use_area_[ab]|privateusearea\-[ab]| private use area\-[ab])|l%(_%(arrows_[ab]|mathematical_operators|punctuation)| %(mathematical operators|punctuation|arrows\-[ab])|mathematicaloperators|punctuation|arrows\-[ab])))|rrogates_area|ndanese)|inhala|y%(riac|loti%([_ ]nagri|nagri)))|p%(h%(o%(enician|netic%( extensions%( supplement)?|extensions%(supplement)?|_extensions%(_supplement)?))|a%(istos%([ _]disc|disc)|gs[_\-]pa))|laying%(cards|[_ ]cards)|rivate%(usearea| use area|_use_area))|o%(smanya|l%([ _]chiki|d%( %(south arabian|persian|italic|turkic)|southarabian|_%(south_arabian|persian|italic|turkic)|persian|italic|turkic)|chiki)|riya|ptical%( character recognition|_character_recognition|characterrecognition)|gham)|g%(u%(jarati|rmukhi)|othic|lagolitic|e%(o%(rgian%(supplement|[ _]supplement)?|metric%(shapes|[ _]shapes))|neral%([_ ]punctuation|punctuation))|reek%( %(and coptic|extended)|andcoptic|_extended|extended)?)|c%(o%(ntrol%(pictures|[ _]pictures)|m%(bining%(diacriticalmarks%(supplement|forsymbols)?|halfmarks| %(diacritical marks%( %(supplement|for symbols))?|half marks|marks for symbols)|marksforsymbols|_%(marks_for_symbols|half_marks|diacritical_marks%(_supplement)?))|mon%(_indic_number_forms|indicnumberforms| indic number forms))|ptic|unting%( rod numerals|_rod_numerals|rodnumerals))|y%(rillic%(extended\-[ab]|_%(extended_[ab]|supplementary)|supplement%(ary)?| %(extended\-[ab]|supplement%(ary)?))?|priot%(syllabary|[ _]syllabary))|u%(rrency%([_ ]symbols|symbols)|neiform%(_numbers_and_punctuation|numbersandpunctuation| numbers and punctuation)?)|arian|h%(erokee|am)|jk%(s%(ymbolsandpunctuation|trokes)|compatibility%(forms|ideographs%(supplement)?)?|radicalssupplement| %(compatibility%( %(ideographs%( supplement)?|forms))?|radicals supplement|unified ideographs%( extension [dacb])?|s%(ymbols and punctuation|trokes))|_%(s%(trokes|ymbols_and_punctuation)|radicals_supplement|compatibility%(_%(forms|ideographs%(_supplement)?))?|unified_ideographs%(_extension_[dacb])?)|unifiedideographs%(extension[dacb])?))|t%(i%(betan|finagh)|elugu|a%(mil|i%(xuanjingsymbols|_%(le|xuan_jing_symbols|tham|viet)|le| %(xuan jing symbols|le|tham|viet)|tham|viet)|g%(alog|s|banwa))|ransport%( and map symbols|_and_map_symbols|andmapsymbols)|ha%(i|ana))|a%(l%(chemical%([_ ]symbols|symbols)|phabetic%( presentation forms|_presentation_forms|presentationforms))|ncient%(_%(greek_%(musical_notation|numbers)|symbols)|greek%(numbers|musicalnotation)| %(greek %(numbers|musical notation)|symbols)|symbols)|egean%(numbers|[ _]numbers)|vestan|r%(abic%( %(supplement|presentation forms\-[ab])|supplement|_%(presentation_forms_[ab]|supplement)|presentationforms\-[ab])?|menian|rows))|u%(garitic|nified%(canadianaboriginalsyllabics%(extended)?|_canadian_aboriginal_syllabics%(_extended)?| canadian aboriginal syllabics%( extended)?))|v%(a%(i|riation%( selectors%( supplement)?|selectors%(supplement)?|_selectors%(_supplement)?))|e%(rtical%(forms|[ _]forms)|dic%([ _]extensions|extensions))))\}" contained display
-
-syntax match clojureRegexpPredefinedCharClass "\v%(\\[dDsSwW]|\.)" contained display
-syntax cluster clojureRegexpCharPropertyClasses contains=clojureRegexpPosixCharClass,clojureRegexpJavaCharClass,clojureRegexpUnicodeCharClass
-syntax cluster clojureRegexpCharClasses contains=clojureRegexpPredefinedCharClass,clojureRegexpCharClass,@clojureRegexpCharPropertyClasses
-syntax region clojureRegexpCharClass start="\[" skip=/\\\\\|\\]/ end="]" contained contains=clojureRegexpPredefinedCharClass,@clojureRegexpCharPropertyClasses
-syntax match clojureRegexpBoundary "\\[bBAGZz]" contained display
-syntax match clojureRegexpBoundary "[$^]" contained display
-syntax match clojureRegexpQuantifier "[?*+][?+]\=" contained display
-syntax match clojureRegexpQuantifier "\v\{\d+%(,|,\d+)?}\??" contained display
-syntax match clojureRegexpOr "|" contained display
-syntax match clojureRegexpBackRef "\v\\%([1-9]\d*|k\<[a-zA-z]+\>)" contained display
+syntax match clojureRegexpUnicodeCharClass "\v\\[pP]\{\c%(Is|sc\=|script\=)%(l%(epc%(ha)?|y%([dc]i%(an)?)|a%(t%(n|in)|na|oo?)|i%(n%(b|ear_b)|mbu?|su))|p%(rti|lrd|h%(oenician|li|ag%(s_pa)?|nx))|vaii?|d%(srt|e%(seret|va%(nagari)?))|g%(lag%(olitic)?|eor%(gian)?|oth%(ic)?|re%(k|ek)|u%(j%(arati|r)|r%(u|mukhi)))|u%(gar%(itic)?|nknown)|a%(r%(ab%(ic)?|m%([ni]|enian))|v%(st|estan))|e%(thi%(opic)?|gyp%(tian_hieroglyphs)?)|z%(inh|yyy|zzz)|r%(un%(ic|r)|ejang|jng)|s%(inh%(ala)?|h%(rd|a%(vian|rada|w))|a%(ur%(ashtra)?|m%(r|aritan)|rb)|y%(r%(c|iac)|lo%(ti_nagri)?)|und%(anese)?|ora%(_sompeng)?)|i%(n%(scriptional_pa%(rthian|hlavi)|herited)|mperial_aramaic|tal)|b%(eng%(ali)?|a%(t%(ak|k)|li%(nese)?|mum?)|ra%(i%(lle)?|h%(mi)?)|opo%(mofo)?|u%(gi%(nese)?|h%(d|id)))|o%(g%(am|ham)|r%(iya|kh|ya)|sma%(nya)?|l%(d_%(south_arabian|persian|italic|turkic)|ck|_chiki))|k%(h%(m%(r|er)|ar%(oshthi)?)|nda|a%(li|n%(a|nada)|takana|yah_li|ithi)|thi)|m%(a%(nd%(aic)?|layalam)|lym|y%(anmar|mr)|tei|e%(r%(c|o%(itic_%(hieroglyphs|cursive))?)|etei_mayek)|ong%(olian)?|iao)|yi%(ii)?|x%(peo|sux)|n%(ew_tai_lue|koo?)|h%(ira%(gana)?|an%([io]|unoo|g%(ul)?)?|ebr%(ew)?)|c%(y%(priot|r%(l|illic))|a%(km|n%(adian_aboriginal|s)|ri%(an)?)|prt|h%(er%(okee)?|a%(m|kma))|uneiform|o%(pt%(ic)?|mmon))|t%(elu%(gu)?|i%(finagh|b%(t|etan))|ha%(i|a%(na)?)|a%(i_%(le|tham|viet)|g%(alog|b%(anwa)?)|vt|kri?|l[ue]|m%(il|l))|fng|glg)|java%(nese)?)\}" contained display
+syntax match clojureRegexpUnicodeCharClass "\v\\[pP]\{\c%(In|blk\=|block\=)%(javanese|h%(a%(lfwidth%( and fullwidth forms|andfullwidthforms|_and_fullwidth_forms)|n%(unoo|gul%(compatibilityjamo|syllables|jamo%(extended\-[ab])?|_%(syllables|jamo%(_extended_[ab])?|compatibility_jamo)| %(syllables|compatibility jamo|jamo%( extended\-[ab])?))))|i%(ragana|gh%( %(private use surrogates|surrogates)|_%(private_use_surrogates|surrogates)|surrogates|privateusesurrogates))|ebrew)|i%(pa%([ _]extensions|extensions)|deographic%( description characters|_description_characters|descriptioncharacters)|nscriptional%(%([ _]pa%(rthian|hlavi))|pa%(rthian|hlavi))|mperial%(aramaic|[_ ]aramaic))|l%(e%(tterlike%([_ ]symbols|symbols)|pcha)|ow%([_ ]surrogates|surrogates)|i%(mbu|near%(_b_%(ideograms|syllabary)|b%(ideograms|syllabary)| b %(ideograms|syllabary))|su)|a%(tin%(extended%(additional|\-[dacb])| extended%( additional|\-[dacb])|\-1%(supplement| supplement)|_%(extended_%([dcb]|a%(dditional)?)|1_supplement))|o)|y[cd]ian)|b%(u%(ginese|hid)|ra%(hmi|ille%(patterns|[_ ]patterns))|o%(x%([ _]drawing|drawing)|pomofo%([ _]extended|extended)?)|lock%([ _]elements|elements)|yzantine%( musical symbols|musicalsymbols|_musical_symbols)|engali|a%(linese|mum%(supplement|[ _]supplement)?|tak|sic%([ _]latin|latin)))|e%(gyptian%([ _]hieroglyphs|hieroglyphs)|moticons|nclosed%( %(cjk letters and months|ideographic supplement|alphanumeric%( supplement|s))|cjklettersandmonths|_%(ideographic_supplement|alphanumeric%(_supplement|s)|cjk_letters_and_months)|alphanumerics%(upplement)?|ideographicsupplement)|thiopic%(supplement|_%(supplement|extended%(_a)?)| %(supplement|extended%(\-a)?)|extended%(\-a)?)?)|k%(h%(aroshthi|mer%([_ ]symbols|symbols)?)|a%(takana%(_phonetic_extensions|phoneticextensions| phonetic extensions)?|n%(gxi%([_ ]radicals|radicals)|a%(supplement|[ _]supplement)|bun|nada)|ithi|yah%([ _]li|li)))|m%(i%(ao|scellaneous%(technical|symbols%(and%(pictographs|arrows))?|mathematicalsymbols\-[ab]| %(technical|mathematical symbols\-[ab]|symbols%( and %(pictographs|arrows))?)|_%(technical|symbols%(_and_%(pictographs|arrows))?|mathematical_symbols_[ab])))|usical%([_ ]symbols|symbols)|e%(etei%(mayek%(extensions)?|_mayek%(_extensions)?| mayek%( extensions)?)|roitic%(hieroglyphs|%([_ ]%(hieroglyphs|cursive))|cursive))|a%(ndaic|hjong%([ _]tiles|tiles)|layalam|thematical%(alphanumericsymbols| %(alphanumeric symbols|operators)|_%(alphanumeric_symbols|operators)|operators))|yanmar%(extended\-a|_extended_a| extended\-a)?|o%(difier%(_tone_letters| tone letters|toneletters)|ngolian))|r%(u%(nic|mi%(numeralsymbols| numeral symbols|_numeral_symbols))|ejang)|n%(umber%(forms|[ _]forms)|ko|ew%(_tai_lue|tailue| tai lue))|c%(o%(ntrol%(pictures|[ _]pictures)|m%(bining%(diacriticalmarks%(supplement|forsymbols)?|halfmarks| %(diacritical marks%( %(supplement|for symbols))?|half marks|marks for symbols)|marksforsymbols|_%(marks_for_symbols|half_marks|diacritical_marks%(_supplement)?))|mon%(_indic_number_forms|indicnumberforms| indic number forms))|ptic|unting%( rod numerals|_rod_numerals|rodnumerals))|y%(rillic%(extended\-[ab]|_%(extended_[ab]|supplementary)|supplement%(ary)?| %(extended\-[ab]|supplement%(ary)?))?|priot%(syllabary|[ _]syllabary))|u%(rrency%([_ ]symbols|symbols)|neiform%(_numbers_and_punctuation|numbersandpunctuation| numbers and punctuation)?)|h%(a%(m|kma)|erokee)|arian|jk%(s%(ymbolsandpunctuation|trokes)|compatibility%(forms|ideographs%(supplement)?)?|radicalssupplement| %(compatibility%( %(ideographs%( supplement)?|forms))?|radicals supplement|unified ideographs%( extension [dacb])?|s%(ymbols and punctuation|trokes))|_%(s%(trokes|ymbols_and_punctuation)|radicals_supplement|compatibility%(_%(forms|ideographs%(_supplement)?))?|unified_ideographs%(_extension_[dacb])?)|unifiedideographs%(extension[dacb])?))|d%(e%(seret|vanagari%([ _]extended|extended)?)|ingbats|omino%([ _]tiles|tiles))|yi%(syllables|%([_ ]%(syllables|radicals))|radicals|jing%(hexagramsymbols| hexagram symbols|_hexagram_symbols))|s%(mall%( form variants|formvariants|_form_variants)|p%(acing%(_modifier_letters| modifier letters|modifierletters)|ecials)|ora%(sompeng|[ _]sompeng)|ha%(vian|rada)|a%(maritan|urashtra)|inhala|y%(riac|loti%([_ ]nagri|nagri))|u%(ndanese%(supplement|[ _]supplement)?|p%(erscripts%(_and_subscripts|andsubscripts| and subscripts)|plementa%(ry%(_private_use_area_[ab]|privateusearea\-[ab]| private use area\-[ab])|l%(_%(arrows_[ab]|mathematical_operators|punctuation)| %(mathematical operators|punctuation|arrows\-[ab])|mathematicaloperators|punctuation|arrows\-[ab])))|rrogates_area))|p%(h%(o%(enician|netic%( extensions%( supplement)?|extensions%(supplement)?|_extensions%(_supplement)?))|a%(istos%([ _]disc|disc)|gs[_\-]pa))|laying%(cards|[_ ]cards)|rivate%(usearea| use area|_use_area))|o%(smanya|l%([ _]chiki|d%( %(south arabian|persian|italic|turkic)|southarabian|_%(south_arabian|persian|italic|turkic)|persian|italic|turkic)|chiki)|riya|ptical%( character recognition|_character_recognition|characterrecognition)|gham)|g%(u%(jarati|rmukhi)|othic|lagolitic|e%(o%(rgian%(supplement|[ _]supplement)?|metric%(shapes|[ _]shapes))|neral%([_ ]punctuation|punctuation))|reek%( %(and coptic|extended)|andcoptic|_extended|extended)?)|t%(i%(betan|finagh)|elugu|ransport%( and map symbols|_and_map_symbols|andmapsymbols)|a%(mil|kri|i%(xuanjingsymbols|_%(le|xuan_jing_symbols|tham|viet)|le| %(xuan jing symbols|le|tham|viet)|tham|viet)|g%(alog|s|banwa))|ha%(i|ana))|a%(l%(chemical%([_ ]symbols|symbols)|phabetic%( presentation forms|_presentation_forms|presentationforms))|r%(menian|abic%(extended\-a|mathematicalalphabeticsymbols|supplement|_%(presentation_forms_[ab]|supplement|extended_a|mathematical_alphabetic_symbols)| %(extended\-a|mathematical alphabetic symbols|supplement|presentation forms\-[ab])|presentationforms\-[ab])?|rows)|ncient%(_%(greek_%(musical_notation|numbers)|symbols)|greek%(numbers|musicalnotation)| %(greek %(numbers|musical notation)|symbols)|symbols)|egean%(numbers|[ _]numbers)|vestan)|u%(garitic|nified%(canadianaboriginalsyllabics%(extended)?|_canadian_aboriginal_syllabics%(_extended)?| canadian aboriginal syllabics%( extended)?))|v%(a%(i|riation%( selectors%( supplement)?|selectors%(supplement)?|_selectors%(_supplement)?))|e%(rtical%(forms|[ _]forms)|dic%([ _]extensions|extensions))))\}" contained display
+
+syntax match clojureRegexpPredefinedCharClass "\v%(\\[dDsSwW]|\.)" contained display
+syntax cluster clojureRegexpCharPropertyClasses contains=clojureRegexpPosixCharClass,clojureRegexpJavaCharClass,clojureRegexpUnicodeCharClass
+syntax cluster clojureRegexpCharClasses contains=clojureRegexpPredefinedCharClass,clojureRegexpCharClass,@clojureRegexpCharPropertyClasses
+syntax region clojureRegexpCharClass start="\[" skip=/\\\\\|\\]/ end="]" contained contains=clojureRegexpPredefinedCharClass,@clojureRegexpCharPropertyClasses
+syntax match clojureRegexpBoundary "\\[bBAGZz]" contained display
+syntax match clojureRegexpBoundary "[$^]" contained display
+syntax match clojureRegexpQuantifier "[?*+][?+]\=" contained display
+syntax match clojureRegexpQuantifier "\v\{\d+%(,|,\d+)?}\??" contained display
+syntax match clojureRegexpOr "|" contained display
+syntax match clojureRegexpBackRef "\v\\%([1-9]\d*|k\<[a-zA-Z]+\>)" contained display
" Mode modifiers, mode-modified spans, lookaround, regular and atomic
" grouping, and named-capturing.
@@ -123,66 +154,70 @@ syntax match clojureComment ";.*$" contains=clojureCommentTodo,@Spell
syntax match clojureComment "#!.*$"
" -*- TOP CLUSTER -*-
-" Generated from https://github.com/guns/vim-clojure-static/blob/vim-release-010/clj/src/vim_clojure_static/generate.clj
+" Generated from https://github.com/guns/vim-clojure-static/blob/vim-release-011/clj/src/vim_clojure_static/generate.clj
syntax cluster clojureTop contains=@Spell,clojureAnonArg,clojureBoolean,clojureCharacter,clojureComment,clojureCond,clojureConstant,clojureDefine,clojureDeref,clojureDispatch,clojureError,clojureException,clojureFunc,clojureKeyword,clojureMacro,clojureMap,clojureMeta,clojureNumber,clojureQuote,clojureRegexp,clojureRepeat,clojureSexp,clojureSpecial,clojureString,clojureSymbol,clojureUnquote,clojureVarArg,clojureVariable,clojureVector
-syntax region clojureSexp matchgroup=clojureParen start="(" matchgroup=clojureParen end=")" contains=@clojureTop fold
-syntax region clojureVector matchgroup=clojureParen start="\[" matchgroup=clojureParen end="]" contains=@clojureTop fold
-syntax region clojureMap matchgroup=clojureParen start="{" matchgroup=clojureParen end="}" contains=@clojureTop fold
+syntax region clojureSexp matchgroup=clojureParen start="(" end=")" contains=@clojureTop fold
+syntax region clojureVector matchgroup=clojureParen start="\[" end="]" contains=@clojureTop fold
+syntax region clojureMap matchgroup=clojureParen start="{" end="}" contains=@clojureTop fold
" Highlight superfluous closing parens, brackets and braces.
syntax match clojureError "]\|}\|)"
syntax sync fromstart
-highlight default link clojureConstant Constant
-highlight default link clojureBoolean Boolean
-highlight default link clojureCharacter Character
-highlight default link clojureKeyword Keyword
-highlight default link clojureNumber Number
-highlight default link clojureString String
-highlight default link clojureStringEscape Character
-
-highlight default link clojureRegexp Constant
-highlight default link clojureRegexpEscape Character
-highlight default link clojureRegexpCharClass SpecialChar
-highlight default link clojureRegexpPosixCharClass clojureRegexpCharClass
-highlight default link clojureRegexpJavaCharClass clojureRegexpCharClass
-highlight default link clojureRegexpUnicodeCharClass clojureRegexpCharClass
-highlight default link clojureRegexpPredefinedCharClass clojureRegexpCharClass
-highlight default link clojureRegexpBoundary SpecialChar
-highlight default link clojureRegexpQuantifier SpecialChar
-highlight default link clojureRegexpMod SpecialChar
-highlight default link clojureRegexpOr SpecialChar
-highlight default link clojureRegexpBackRef SpecialChar
-highlight default link clojureRegexpGroup clojureRegexp
-highlight default link clojureRegexpQuoted clojureString
-highlight default link clojureRegexpQuote clojureRegexpBoundary
-
-highlight default link clojureVariable Identifier
-highlight default link clojureCond Conditional
-highlight default link clojureDefine Define
-highlight default link clojureException Exception
-highlight default link clojureFunc Function
-highlight default link clojureMacro Macro
-highlight default link clojureRepeat Repeat
-
-highlight default link clojureSpecial Special
-highlight default link clojureVarArg Special
-highlight default link clojureQuote SpecialChar
-highlight default link clojureUnquote SpecialChar
-highlight default link clojureMeta SpecialChar
-highlight default link clojureDeref SpecialChar
-highlight default link clojureAnonArg SpecialChar
-highlight default link clojureDispatch SpecialChar
-
-highlight default link clojureComment Comment
-highlight default link clojureCommentTodo Todo
-
-highlight default link clojureError Error
-
-highlight default link clojureParen Delimiter
+highlight default link clojureConstant Constant
+highlight default link clojureBoolean Boolean
+highlight default link clojureCharacter Character
+highlight default link clojureKeyword Keyword
+highlight default link clojureNumber Number
+highlight default link clojureString String
+highlight default link clojureStringDelimiter String
+highlight default link clojureStringEscape Character
+
+highlight default link clojureRegexp Constant
+highlight default link clojureRegexpEscape Character
+highlight default link clojureRegexpCharClass SpecialChar
+highlight default link clojureRegexpPosixCharClass clojureRegexpCharClass
+highlight default link clojureRegexpJavaCharClass clojureRegexpCharClass
+highlight default link clojureRegexpUnicodeCharClass clojureRegexpCharClass
+highlight default link clojureRegexpPredefinedCharClass clojureRegexpCharClass
+highlight default link clojureRegexpBoundary SpecialChar
+highlight default link clojureRegexpQuantifier SpecialChar
+highlight default link clojureRegexpMod SpecialChar
+highlight default link clojureRegexpOr SpecialChar
+highlight default link clojureRegexpBackRef SpecialChar
+highlight default link clojureRegexpGroup clojureRegexp
+highlight default link clojureRegexpQuoted clojureString
+highlight default link clojureRegexpQuote clojureRegexpBoundary
+
+highlight default link clojureVariable Identifier
+highlight default link clojureCond Conditional
+highlight default link clojureDefine Define
+highlight default link clojureException Exception
+highlight default link clojureFunc Function
+highlight default link clojureMacro Macro
+highlight default link clojureRepeat Repeat
+
+highlight default link clojureSpecial Special
+highlight default link clojureVarArg Special
+highlight default link clojureQuote SpecialChar
+highlight default link clojureUnquote SpecialChar
+highlight default link clojureMeta SpecialChar
+highlight default link clojureDeref SpecialChar
+highlight default link clojureAnonArg SpecialChar
+highlight default link clojureDispatch SpecialChar
+
+highlight default link clojureComment Comment
+highlight default link clojureCommentTodo Todo
+
+highlight default link clojureError Error
+
+highlight default link clojureParen Delimiter
let b:current_syntax = "clojure"
-" vim:sts=8:sw=8:ts=8:noet:smc=0
+let &cpo = s:cpo_sav
+unlet! s:cpo_sav
+
+" vim:sts=8:sw=8:ts=8:noet
diff --git a/runtime/syntax/cmake.vim b/runtime/syntax/cmake.vim
index 4586940c5e..f7616e4c6d 100644
--- a/runtime/syntax/cmake.vim
+++ b/runtime/syntax/cmake.vim
@@ -1,87 +1,477 @@
" Vim syntax file
" Program: CMake - Cross-Platform Makefile Generator
-" Module: $RCSfile: cmake-syntax.vim,v $
+" Version: cmake version 3.9.20170830-ge0713
" Language: CMake
-" Maintainer: Dimitri Merejkowsky <d.merej@gmail.com>
-" Former Maintainer: Karthik Krishnan <karthik.krishnan@kitware.com>
-" Author: Andy Cedilnik <andy.cedilnik@kitware.com>
-" Last Change: 2015 Dec 17
-" Version: $Revision: 1.10 $
+" Author: Andy Cedilnik <andy.cedilnik@kitware.com>,
+" Nicholas Hutchinson <nshutchinson@gmail.com>,
+" Patrick Boettcher <patrick.boettcher@posteo.de>
+" Maintainer: Dimitri Merejkowsky <d.merej@gmail.com>
+" Former Maintainer: Karthik Krishnan <karthik.krishnan@kitware.com>
+" Last Change: 2017 Aug 30
"
" Licence: The CMake license applies to this file. See
-" http://www.cmake.org/HTML/Copyright.html
+" https://cmake.org/licensing
" This implies that distribution with Vim is allowed
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+if exists("b:current_syntax")
finish
endif
let s:keepcpo= &cpo
set cpo&vim
-syn case ignore
+syn region cmakeComment start="#" end="$" contains=cmakeTodo,cmakeLuaComment,@Spell
+syn region cmakeLuaComment start="\[\z(=*\)\[" end="\]\z1\]" contains=cmakeTodo,@Spell
+
syn match cmakeEscaped /\(\\\\\|\\"\|\\n\|\\t\)/ contained
-syn region cmakeComment start="#" end="$" contains=@Spell,cmakeTodo
-syn region cmakeRegistry start=/\[/ end=/]/
- \ contained oneline contains=CONTAINED,cmakeTodo,cmakeEscaped
-syn region cmakeVariableValue start=/\${/ end=/}/
- \ contained oneline contains=CONTAINED,cmakeTodo
-syn region cmakeEnvironment start=/\$ENV{/ end=/}/
- \ contained oneline contains=CONTAINED,cmakeTodo
-syn region cmakeString start=/"/ end=/"/
- \ contains=CONTAINED,cmakeTodo,cmakeOperators
-syn region cmakeArguments start=/(/ end=/)/
- \ contains=ALLBUT,cmakeArguments,cmakeTodo
-syn keyword cmakeSystemVariables
- \ WIN32 UNIX APPLE CYGWIN BORLAND MINGW MSVC MSVC_IDE MSVC60 MSVC70 MSVC71 MSVC80 MSVC90
-syn keyword cmakeOperators
- \ ABSOLUTE AND BOOL CACHE COMMAND DEFINED DOC EQUAL EXISTS EXT FALSE GREATER INTERNAL LESS MATCHES NAME NAMES NAME_WE NOT OFF ON OR PATH PATHS PROGRAM STREQUAL STRGREATER STRING STRLESS TRUE
- \ contained
-syn keyword cmakeDeprecated ABSTRACT_FILES BUILD_NAME SOURCE_FILES SOURCE_FILES_REMOVE VTK_MAKE_INSTANTIATOR VTK_WRAP_JAVA VTK_WRAP_PYTHON VTK_WRAP_TCL WRAP_EXCLUDE_FILES
- \ nextgroup=cmakeArguments
+syn region cmakeRegistry start="\[" end="]" contained oneline contains=cmakeTodo,cmakeEscaped
+
+syn region cmakeGeneratorExpression start="$<" end=">" contained oneline contains=cmakeVariableValue,cmakeProperty,cmakeGeneratorExpressions,cmakeTodo
+
+syn region cmakeString start='"' end='"' contained contains=cmakeTodo,cmakeVariableValue,cmakeEscaped
+
+syn region cmakeVariableValue start="${" end="}" contained oneline contains=cmakeVariable,cmakeTodo
+
+syn region cmakeEnvironment start="$ENV{" end="}" contained oneline contains=cmakeTodo
+
+syn region cmakeArguments start="(" end=")" contains=ALLBUT,cmakeCommand,cmakeCommandConditional,cmakeCommandRepeat,cmakeCommandDeprecated,cmakeArguments,cmakeTodo
+
+syn case match
+
+syn keyword cmakeProperty contained
+ \ ABSTRACT ADDITIONAL_MAKE_CLEAN_FILES ADVANCED ALIASED_TARGET ALLOW_DUPLICATE_CUSTOM_TARGETS ANDROID_ANT_ADDITIONAL_OPTIONS ANDROID_API ANDROID_API_MIN ANDROID_ARCH ANDROID_ASSETS_DIRECTORIES ANDROID_GUI ANDROID_JAR_DEPENDENCIES ANDROID_JAR_DIRECTORIES ANDROID_JAVA_SOURCE_DIR ANDROID_NATIVE_LIB_DEPENDENCIES ANDROID_NATIVE_LIB_DIRECTORIES ANDROID_PROCESS_MAX ANDROID_PROGUARD ANDROID_PROGUARD_CONFIG_PATH ANDROID_SECURE_PROPS_PATH ANDROID_SKIP_ANT_STEP ANDROID_STL_TYPE ARCHIVE_OUTPUT_DIRECTORY ARCHIVE_OUTPUT_NAME ATTACHED_FILES ATTACHED_FILES_ON_FAIL AUTOGEN_BUILD_DIR AUTOGEN_SOURCE_GROUP AUTOGEN_TARGETS_FOLDER AUTOGEN_TARGET_DEPENDS AUTOMOC AUTOMOC_DEPEND_FILTERS AUTOMOC_MACRO_NAMES AUTOMOC_MOC_OPTIONS AUTOMOC_SOURCE_GROUP AUTOMOC_TARGETS_FOLDER AUTORCC AUTORCC_OPTIONS AUTORCC_SOURCE_GROUP AUTOUIC AUTOUIC_OPTIONS AUTOUIC_SEARCH_PATHS BINARY_DIR BUILDSYSTEM_TARGETS BUILD_RPATH BUILD_WITH_INSTALL_NAME_DIR BUILD_WITH_INSTALL_RPATH BUNDLE BUNDLE_EXTENSION CACHE_VARIABLES CLEAN_NO_CUSTOM CMAKE_CONFIGURE_DEPENDS CMAKE_CXX_KNOWN_FEATURES CMAKE_C_KNOWN_FEATURES COMPATIBLE_INTERFACE_BOOL COMPATIBLE_INTERFACE_NUMBER_MAX COMPATIBLE_INTERFACE_NUMBER_MIN COMPATIBLE_INTERFACE_STRING COMPILE_DEFINITIONS COMPILE_FEATURES COMPILE_FLAGS COMPILE_OPTIONS COMPILE_PDB_NAME COMPILE_PDB_OUTPUT_DIRECTORY COST CPACK_DESKTOP_SHORTCUTS CPACK_NEVER_OVERWRITE CPACK_PERMANENT CPACK_STARTUP_SHORTCUTS CPACK_START_MENU_SHORTCUTS CPACK_WIX_ACL CROSSCOMPILING_EMULATOR CUDA_EXTENSIONS CUDA_PTX_COMPILATION CUDA_RESOLVE_DEVICE_SYMBOLS CUDA_SEPARABLE_COMPILATION CUDA_STANDARD CUDA_STANDARD_REQUIRED CXX_EXTENSIONS CXX_STANDARD CXX_STANDARD_REQUIRED C_EXTENSIONS C_STANDARD C_STANDARD_REQUIRED DEBUG_CONFIGURATIONS DEBUG_POSTFIX DEFINE_SYMBOL DEFINITIONS DEPENDS DEPLOYMENT_REMOTE_DIRECTORY DISABLED DISABLED_FEATURES ECLIPSE_EXTRA_NATURES ENABLED_FEATURES ENABLED_LANGUAGES ENABLE_EXPORTS ENVIRONMENT EXCLUDE_FROM_ALL EXCLUDE_FROM_DEFAULT_BUILD EXPORT_NAME EXTERNAL_OBJECT EchoString FAIL_REGULAR_EXPRESSION FIND_LIBRARY_USE_LIB32_PATHS FIND_LIBRARY_USE_LIB64_PATHS FIND_LIBRARY_USE_LIBX32_PATHS FIND_LIBRARY_USE_OPENBSD_VERSIONING FIXTURES_CLEANUP FIXTURES_REQUIRED FIXTURES_SETUP FOLDER FRAMEWORK FRAMEWORK_VERSION Fortran_FORMAT Fortran_MODULE_DIRECTORY GENERATED GENERATOR_FILE_NAME GENERATOR_IS_MULTI_CONFIG GLOBAL_DEPENDS_DEBUG_MODE GLOBAL_DEPENDS_NO_CYCLES GNUtoMS HAS_CXX HEADER_FILE_ONLY HELPSTRING IMPLICIT_DEPENDS_INCLUDE_TRANSFORM IMPORTED IMPORTED_CONFIGURATIONS IMPORTED_IMPLIB IMPORTED_LIBNAME IMPORTED_LINK_DEPENDENT_LIBRARIES IMPORTED_LINK_INTERFACE_LANGUAGES IMPORTED_LINK_INTERFACE_LIBRARIES IMPORTED_LINK_INTERFACE_MULTIPLICITY IMPORTED_LOCATION IMPORTED_NO_SONAME IMPORTED_OBJECTS IMPORTED_SONAME IMPORT_PREFIX IMPORT_SUFFIX INCLUDE_DIRECTORIES INCLUDE_REGULAR_EXPRESSION INSTALL_NAME_DIR INSTALL_RPATH INSTALL_RPATH_USE_LINK_PATH INTERFACE_AUTOUIC_OPTIONS INTERFACE_COMPILE_DEFINITIONS INTERFACE_COMPILE_FEATURES INTERFACE_COMPILE_OPTIONS INTERFACE_INCLUDE_DIRECTORIES INTERFACE_LINK_LIBRARIES INTERFACE_POSITION_INDEPENDENT_CODE INTERFACE_SOURCES INTERFACE_SYSTEM_INCLUDE_DIRECTORIES INTERPROCEDURAL_OPTIMIZATION IN_TRY_COMPILE IOS_INSTALL_COMBINED JOB_POOLS JOB_POOL_COMPILE JOB_POOL_LINK KEEP_EXTENSION LABELS LANGUAGE LIBRARY_OUTPUT_DIRECTORY LIBRARY_OUTPUT_NAME LINKER_LANGUAGE LINK_DEPENDS LINK_DEPENDS_NO_SHARED LINK_DIRECTORIES LINK_FLAGS LINK_INTERFACE_LIBRARIES LINK_INTERFACE_MULTIPLICITY LINK_LIBRARIES LINK_SEARCH_END_STATIC LINK_SEARCH_START_STATIC LINK_WHAT_YOU_USE LISTFILE_STACK LOCATION MACOSX_BUNDLE MACOSX_BUNDLE_INFO_PLIST MACOSX_FRAMEWORK_INFO_PLIST MACOSX_PACKAGE_LOCATION MACOSX_RPATH MACROS MANUALLY_ADDED_DEPENDENCIES MEASUREMENT MODIFIED NAME NO_SONAME NO_SYSTEM_FROM_IMPORTED OBJECT_DEPENDS OBJECT_OUTPUTS OSX_ARCHITECTURES OUTPUT_NAME PACKAGES_FOUND PACKAGES_NOT_FOUND PARENT_DIRECTORY PASS_REGULAR_EXPRESSION PDB_NAME PDB_OUTPUT_DIRECTORY POSITION_INDEPENDENT_CODE POST_INSTALL_SCRIPT PREDEFINED_TARGETS_FOLDER PREFIX PRE_INSTALL_SCRIPT PRIVATE_HEADER PROCESSORS PROJECT_LABEL PUBLIC_HEADER REPORT_UNDEFINED_PROPERTIES REQUIRED_FILES RESOURCE RESOURCE_LOCK RULE_LAUNCH_COMPILE RULE_LAUNCH_CUSTOM RULE_LAUNCH_LINK RULE_MESSAGES RUNTIME_OUTPUT_DIRECTORY RUNTIME_OUTPUT_NAME RUN_SERIAL SKIP_AUTOGEN SKIP_AUTOMOC SKIP_AUTORCC SKIP_AUTOUIC SKIP_BUILD_RPATH SKIP_RETURN_CODE SOURCES SOURCE_DIR SOVERSION STATIC_LIBRARY_FLAGS STRINGS SUBDIRECTORIES SUFFIX SYMBOLIC TARGET_ARCHIVES_MAY_BE_SHARED_LIBS TARGET_MESSAGES TARGET_SUPPORTS_SHARED_LIBS TEST_INCLUDE_FILE TEST_INCLUDE_FILES TIMEOUT TIMEOUT_AFTER_MATCH TYPE USE_FOLDERS VALUE VARIABLES VERSION VISIBILITY_INLINES_HIDDEN VS_CONFIGURATION_TYPE VS_COPY_TO_OUT_DIR VS_DEBUGGER_WORKING_DIRECTORY VS_DEPLOYMENT_CONTENT VS_DEPLOYMENT_LOCATION VS_DESKTOP_EXTENSIONS_VERSION VS_DOTNET_REFERENCES VS_DOTNET_REFERENCES_COPY_LOCAL VS_DOTNET_TARGET_FRAMEWORK_VERSION VS_GLOBAL_KEYWORD VS_GLOBAL_PROJECT_TYPES VS_GLOBAL_ROOTNAMESPACE VS_INCLUDE_IN_VSIX VS_IOT_EXTENSIONS_VERSION VS_IOT_STARTUP_TASK VS_KEYWORD VS_MOBILE_EXTENSIONS_VERSION VS_RESOURCE_GENERATOR VS_SCC_AUXPATH VS_SCC_LOCALPATH VS_SCC_PROJECTNAME VS_SCC_PROVIDER VS_SDK_REFERENCES VS_SHADER_ENTRYPOINT VS_SHADER_FLAGS VS_SHADER_MODEL VS_SHADER_TYPE VS_STARTUP_PROJECT VS_TOOL_OVERRIDE VS_USER_PROPS VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION VS_WINRT_COMPONENT VS_WINRT_EXTENSIONS VS_WINRT_REFERENCES VS_XAML_TYPE WILL_FAIL WIN32_EXECUTABLE WINDOWS_EXPORT_ALL_SYMBOLS WORKING_DIRECTORY WRAP_EXCLUDE XCODE_EMIT_EFFECTIVE_PLATFORM_NAME XCODE_EXPLICIT_FILE_TYPE XCODE_FILE_ATTRIBUTES XCODE_LAST_KNOWN_FILE_TYPE XCODE_PRODUCT_TYPE XCTEST
+
+syn keyword cmakeVariable contained
+ \ ANDROID APPLE BORLAND BUILD_SHARED_LIBS CMAKE_ABSOLUTE_DESTINATION_FILES CMAKE_ANDROID_ANT_ADDITIONAL_OPTIONS CMAKE_ANDROID_API CMAKE_ANDROID_API_MIN CMAKE_ANDROID_ARCH CMAKE_ANDROID_ARCH_ABI CMAKE_ANDROID_ARM_MODE CMAKE_ANDROID_ARM_NEON CMAKE_ANDROID_ASSETS_DIRECTORIES CMAKE_ANDROID_GUI CMAKE_ANDROID_JAR_DEPENDENCIES CMAKE_ANDROID_JAR_DIRECTORIES CMAKE_ANDROID_JAVA_SOURCE_DIR CMAKE_ANDROID_NATIVE_LIB_DEPENDENCIES CMAKE_ANDROID_NATIVE_LIB_DIRECTORIES CMAKE_ANDROID_NDK CMAKE_ANDROID_NDK_DEPRECATED_HEADERS CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION CMAKE_ANDROID_PROCESS_MAX CMAKE_ANDROID_PROGUARD CMAKE_ANDROID_PROGUARD_CONFIG_PATH CMAKE_ANDROID_SECURE_PROPS_PATH CMAKE_ANDROID_SKIP_ANT_STEP CMAKE_ANDROID_STANDALONE_TOOLCHAIN CMAKE_ANDROID_STL_TYPE CMAKE_APPBUNDLE_PATH CMAKE_AR CMAKE_ARCHIVE_OUTPUT_DIRECTORY CMAKE_ARGC CMAKE_ARGV0 CMAKE_AUTOMOC CMAKE_AUTOMOC_DEPEND_FILTERS CMAKE_AUTOMOC_MACRO_NAMES CMAKE_AUTOMOC_MOC_OPTIONS CMAKE_AUTOMOC_RELAXED_MODE CMAKE_AUTORCC CMAKE_AUTORCC_OPTIONS CMAKE_AUTOUIC CMAKE_AUTOUIC_OPTIONS CMAKE_AUTOUIC_SEARCH_PATHS CMAKE_BACKWARDS_COMPATIBILITY CMAKE_BINARY_DIR CMAKE_BUILD_RPATH CMAKE_BUILD_TOOL CMAKE_BUILD_TYPE CMAKE_BUILD_WITH_INSTALL_NAME_DIR CMAKE_BUILD_WITH_INSTALL_RPATH CMAKE_CACHEFILE_DIR CMAKE_CACHE_MAJOR_VERSION CMAKE_CACHE_MINOR_VERSION CMAKE_CACHE_PATCH_VERSION CMAKE_CFG_INTDIR CMAKE_CL_64 CMAKE_CODELITE_USE_TARGETS CMAKE_COLOR_MAKEFILE CMAKE_COMMAND CMAKE_COMPILER_2005 CMAKE_COMPILER_IS_GNUCC CMAKE_COMPILER_IS_GNUCXX CMAKE_COMPILER_IS_GNUG77 CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY CMAKE_CONFIGURATION_TYPES CMAKE_CROSSCOMPILING CMAKE_CROSSCOMPILING_EMULATOR CMAKE_CTEST_COMMAND CMAKE_CUDA_EXTENSIONS CMAKE_CUDA_STANDARD CMAKE_CUDA_STANDARD_REQUIRED CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES CMAKE_CURRENT_BINARY_DIR CMAKE_CURRENT_LIST_DIR CMAKE_CURRENT_LIST_FILE CMAKE_CURRENT_LIST_LINE CMAKE_CURRENT_SOURCE_DIR CMAKE_CXX_COMPILE_FEATURES CMAKE_CXX_EXTENSIONS CMAKE_CXX_STANDARD CMAKE_CXX_STANDARD_REQUIRED CMAKE_C_COMPILE_FEATURES CMAKE_C_EXTENSIONS CMAKE_C_STANDARD CMAKE_C_STANDARD_REQUIRED CMAKE_DEBUG_POSTFIX CMAKE_DEBUG_TARGET_PROPERTIES CMAKE_DEPENDS_IN_PROJECT_ONLY CMAKE_DIRECTORY_LABELS CMAKE_DL_LIBS CMAKE_ECLIPSE_GENERATE_LINKED_RESOURCES CMAKE_ECLIPSE_GENERATE_SOURCE_PROJECT CMAKE_ECLIPSE_MAKE_ARGUMENTS CMAKE_ECLIPSE_VERSION CMAKE_EDIT_COMMAND CMAKE_ENABLE_EXPORTS CMAKE_ERROR_DEPRECATED CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION CMAKE_EXECUTABLE_SUFFIX CMAKE_EXE_LINKER_FLAGS CMAKE_EXE_LINKER_FLAGS_INIT CMAKE_EXPORT_COMPILE_COMMANDS CMAKE_EXPORT_NO_PACKAGE_REGISTRY CMAKE_EXTRA_GENERATOR CMAKE_EXTRA_SHARED_LIBRARY_SUFFIXES CMAKE_FIND_APPBUNDLE CMAKE_FIND_FRAMEWORK CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX CMAKE_FIND_LIBRARY_PREFIXES CMAKE_FIND_LIBRARY_SUFFIXES CMAKE_FIND_NO_INSTALL_PREFIX CMAKE_FIND_PACKAGE_NAME CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY CMAKE_FIND_PACKAGE_SORT_DIRECTION CMAKE_FIND_PACKAGE_SORT_ORDER CMAKE_FIND_PACKAGE_WARN_NO_MODULE CMAKE_FIND_ROOT_PATH CMAKE_FIND_ROOT_PATH_MODE_INCLUDE CMAKE_FIND_ROOT_PATH_MODE_LIBRARY CMAKE_FIND_ROOT_PATH_MODE_PACKAGE CMAKE_FIND_ROOT_PATH_MODE_PROGRAM CMAKE_FRAMEWORK_PATH CMAKE_Fortran_FORMAT CMAKE_Fortran_MODDIR_DEFAULT CMAKE_Fortran_MODDIR_FLAG CMAKE_Fortran_MODOUT_FLAG CMAKE_Fortran_MODULE_DIRECTORY CMAKE_GENERATOR CMAKE_GENERATOR_PLATFORM CMAKE_GENERATOR_TOOLSET CMAKE_GNUtoMS CMAKE_HOME_DIRECTORY CMAKE_HOST_APPLE CMAKE_HOST_SOLARIS CMAKE_HOST_SYSTEM CMAKE_HOST_SYSTEM_NAME CMAKE_HOST_SYSTEM_PROCESSOR CMAKE_HOST_SYSTEM_VERSION CMAKE_HOST_UNIX CMAKE_HOST_WIN32 CMAKE_IGNORE_PATH CMAKE_IMPORT_LIBRARY_PREFIX CMAKE_IMPORT_LIBRARY_SUFFIX CMAKE_INCLUDE_CURRENT_DIR CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE CMAKE_INCLUDE_DIRECTORIES_BEFORE CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE CMAKE_INCLUDE_PATH CMAKE_INSTALL_DEFAULT_COMPONENT_NAME CMAKE_INSTALL_MESSAGE CMAKE_INSTALL_NAME_DIR CMAKE_INSTALL_PREFIX CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT CMAKE_INSTALL_RPATH CMAKE_INSTALL_RPATH_USE_LINK_PATH CMAKE_INTERNAL_PLATFORM_ABI CMAKE_INTERPROCEDURAL_OPTIMIZATION CMAKE_IOS_INSTALL_COMBINED CMAKE_JOB_POOL_COMPILE CMAKE_JOB_POOL_LINK CMAKE_LIBRARY_ARCHITECTURE CMAKE_LIBRARY_ARCHITECTURE_REGEX CMAKE_LIBRARY_OUTPUT_DIRECTORY CMAKE_LIBRARY_PATH CMAKE_LIBRARY_PATH_FLAG CMAKE_LINK_DEF_FILE_FLAG CMAKE_LINK_DEPENDS_NO_SHARED CMAKE_LINK_INTERFACE_LIBRARIES CMAKE_LINK_LIBRARY_FILE_FLAG CMAKE_LINK_LIBRARY_FLAG CMAKE_LINK_LIBRARY_SUFFIX CMAKE_LINK_SEARCH_END_STATIC CMAKE_LINK_SEARCH_START_STATIC CMAKE_LINK_WHAT_YOU_USE CMAKE_MACOSX_BUNDLE CMAKE_MACOSX_RPATH CMAKE_MAJOR_VERSION CMAKE_MAKE_PROGRAM CMAKE_MATCH_COUNT CMAKE_MFC_FLAG CMAKE_MINIMUM_REQUIRED_VERSION CMAKE_MINOR_VERSION CMAKE_MODULE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS_INIT CMAKE_MODULE_PATH CMAKE_MSVCIDE_RUN_PATH CMAKE_NINJA_OUTPUT_PATH_PREFIX CMAKE_NOT_USING_CONFIG_FLAGS CMAKE_NO_BUILTIN_CHRPATH CMAKE_NO_SYSTEM_FROM_IMPORTED CMAKE_OBJECT_PATH_MAX CMAKE_OSX_ARCHITECTURES CMAKE_OSX_DEPLOYMENT_TARGET CMAKE_OSX_SYSROOT CMAKE_PARENT_LIST_FILE CMAKE_PATCH_VERSION CMAKE_PDB_OUTPUT_DIRECTORY CMAKE_POSITION_INDEPENDENT_CODE CMAKE_PREFIX_PATH CMAKE_PROGRAM_PATH CMAKE_PROJECT_DESCRIPTION CMAKE_PROJECT_NAME CMAKE_RANLIB CMAKE_ROOT CMAKE_RUNTIME_OUTPUT_DIRECTORY CMAKE_SCRIPT_MODE_FILE CMAKE_SHARED_LIBRARY_PREFIX CMAKE_SHARED_LIBRARY_SUFFIX CMAKE_SHARED_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS_INIT CMAKE_SHARED_MODULE_PREFIX CMAKE_SHARED_MODULE_SUFFIX CMAKE_SIZEOF_VOID_P CMAKE_SKIP_BUILD_RPATH CMAKE_SKIP_INSTALL_ALL_DEPENDENCY CMAKE_SKIP_INSTALL_RPATH CMAKE_SKIP_INSTALL_RULES CMAKE_SKIP_RPATH CMAKE_SOURCE_DIR CMAKE_STAGING_PREFIX CMAKE_STATIC_LIBRARY_PREFIX CMAKE_STATIC_LIBRARY_SUFFIX CMAKE_STATIC_LINKER_FLAGS CMAKE_STATIC_LINKER_FLAGS_INIT CMAKE_SUBLIME_TEXT_2_ENV_SETTINGS CMAKE_SUBLIME_TEXT_2_EXCLUDE_BUILD_TREE CMAKE_SYSROOT CMAKE_SYSROOT_COMPILE CMAKE_SYSROOT_LINK CMAKE_SYSTEM CMAKE_SYSTEM_APPBUNDLE_PATH CMAKE_SYSTEM_FRAMEWORK_PATH CMAKE_SYSTEM_IGNORE_PATH CMAKE_SYSTEM_INCLUDE_PATH CMAKE_SYSTEM_LIBRARY_PATH CMAKE_SYSTEM_NAME CMAKE_SYSTEM_PREFIX_PATH CMAKE_SYSTEM_PROCESSOR CMAKE_SYSTEM_PROGRAM_PATH CMAKE_SYSTEM_VERSION CMAKE_Swift_LANGUAGE_VERSION CMAKE_TOOLCHAIN_FILE CMAKE_TRY_COMPILE_CONFIGURATION CMAKE_TRY_COMPILE_PLATFORM_VARIABLES CMAKE_TRY_COMPILE_TARGET_TYPE CMAKE_TWEAK_VERSION CMAKE_USER_MAKE_RULES_OVERRIDE CMAKE_USE_RELATIVE_PATHS CMAKE_VERBOSE_MAKEFILE CMAKE_VERSION CMAKE_VISIBILITY_INLINES_HIDDEN CMAKE_VS_DEVENV_COMMAND CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD CMAKE_VS_INCLUDE_PACKAGE_TO_DEFAULT_BUILD CMAKE_VS_INTEL_Fortran_PROJECT_VERSION CMAKE_VS_MSBUILD_COMMAND CMAKE_VS_NsightTegra_VERSION CMAKE_VS_PLATFORM_NAME CMAKE_VS_PLATFORM_TOOLSET CMAKE_VS_PLATFORM_TOOLSET_CUDA CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION CMAKE_WARN_DEPRECATED CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION CMAKE_WIN32_EXECUTABLE CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS CMAKE_XCODE_GENERATE_SCHEME CMAKE_XCODE_PLATFORM_TOOLSET CPACK_ABSOLUTE_DESTINATION_FILES CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION CPACK_INCLUDE_TOPLEVEL_DIRECTORY CPACK_INSTALL_SCRIPT CPACK_PACKAGING_INSTALL_PREFIX CPACK_SET_DESTDIR CPACK_WARN_ON_ABSOLUTE_INSTALL_DESTINATION CTEST_BINARY_DIRECTORY CTEST_BUILD_COMMAND CTEST_BUILD_NAME CTEST_BZR_COMMAND CTEST_BZR_UPDATE_OPTIONS CTEST_CHANGE_ID CTEST_CHECKOUT_COMMAND CTEST_CONFIGURATION_TYPE CTEST_CONFIGURE_COMMAND CTEST_COVERAGE_COMMAND CTEST_COVERAGE_EXTRA_FLAGS CTEST_CURL_OPTIONS CTEST_CUSTOM_COVERAGE_EXCLUDE CTEST_CUSTOM_ERROR_EXCEPTION CTEST_CUSTOM_ERROR_MATCH CTEST_CUSTOM_ERROR_POST_CONTEXT CTEST_CUSTOM_ERROR_PRE_CONTEXT CTEST_CUSTOM_MAXIMUM_FAILED_TEST_OUTPUT_SIZE CTEST_CUSTOM_MAXIMUM_NUMBER_OF_ERRORS CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE CTEST_CUSTOM_MEMCHECK_IGNORE CTEST_CUSTOM_POST_MEMCHECK CTEST_CUSTOM_POST_TEST CTEST_CUSTOM_PRE_MEMCHECK CTEST_CUSTOM_PRE_TEST CTEST_CUSTOM_TEST_IGNORE CTEST_CUSTOM_WARNING_EXCEPTION CTEST_CUSTOM_WARNING_MATCH CTEST_CVS_CHECKOUT CTEST_CVS_COMMAND CTEST_CVS_UPDATE_OPTIONS CTEST_DROP_LOCATION CTEST_DROP_METHOD CTEST_DROP_SITE CTEST_DROP_SITE_CDASH CTEST_DROP_SITE_PASSWORD CTEST_DROP_SITE_USER CTEST_EXTRA_COVERAGE_GLOB CTEST_GIT_COMMAND CTEST_GIT_INIT_SUBMODULES CTEST_GIT_UPDATE_CUSTOM CTEST_GIT_UPDATE_OPTIONS CTEST_HG_COMMAND CTEST_HG_UPDATE_OPTIONS CTEST_LABELS_FOR_SUBPROJECTS CTEST_MEMORYCHECK_COMMAND CTEST_MEMORYCHECK_COMMAND_OPTIONS CTEST_MEMORYCHECK_SANITIZER_OPTIONS CTEST_MEMORYCHECK_SUPPRESSIONS_FILE CTEST_MEMORYCHECK_TYPE CTEST_NIGHTLY_START_TIME CTEST_P4_CLIENT CTEST_P4_COMMAND CTEST_P4_OPTIONS CTEST_P4_UPDATE_OPTIONS CTEST_SCP_COMMAND CTEST_SITE CTEST_SOURCE_DIRECTORY CTEST_SVN_COMMAND CTEST_SVN_OPTIONS CTEST_SVN_UPDATE_OPTIONS CTEST_TEST_LOAD CTEST_TEST_TIMEOUT CTEST_TRIGGER_SITE CTEST_UPDATE_COMMAND CTEST_UPDATE_OPTIONS CTEST_UPDATE_VERSION_ONLY CTEST_USE_LAUNCHERS CYGWIN ENV EXECUTABLE_OUTPUT_PATH GHS-MULTI LIBRARY_OUTPUT_PATH MINGW MSVC MSVC10 MSVC11 MSVC12 MSVC14 MSVC60 MSVC70 MSVC71 MSVC80 MSVC90 MSVC_IDE MSVC_VERSION PROJECT_BINARY_DIR PROJECT_DESCRIPTION PROJECT_NAME PROJECT_SOURCE_DIR PROJECT_VERSION PROJECT_VERSION_MAJOR PROJECT_VERSION_MINOR PROJECT_VERSION_PATCH PROJECT_VERSION_TWEAK UNIX WIN32 WINCE WINDOWS_PHONE WINDOWS_STORE XCODE XCODE_VERSION
+
+syn keyword cmakeModule contained
+ \ ExternalProject
+
+syn keyword cmakeKWExternalProject contained
+ \ ALGO AWS BINARY_DIR BUILD_ALWAYS BUILD_BYPRODUCTS BUILD_COMMAND BUILD_IN_SOURCE CMAKE_ARGS CMAKE_CACHE_ARGS CMAKE_CACHE_DEFAULT_ARGS CMAKE_TLS_CAINFO CMAKE_TLS_VERIFY COMMENT CONFIGURE_COMMAND CVS CVSROOT CVS_MODULE CVS_REPOSITORY CVS_TAG DEPENDEES DEPENDERS DEPENDS DOWNLOADED_FILE DOWNLOAD_COMMAND DOWNLOAD_DIR DOWNLOAD_NAME DOWNLOAD_NO_EXTRACT DOWNLOAD_NO_PROGRESS EP_BASE EP_INDEPENDENT_STEP_TARGETS EP_PREFIX EP_STEP_TARGETS EP_UPDATE_DISCONNECTED EXCLUDE_FROM_ALL FORCE GIT_CONFIG GIT_PROGRESS GIT_REMOTE_NAME GIT_REPOSITORY GIT_SHALLOW GIT_SUBMODULES GIT_TAG HG_REPOSITORY HG_TAG HTTP_HEADER HTTP_PASSWORD HTTP_USERNAME INDEPENDENT_STEP_TARGETS INSTALL_COMMAND INSTALL_DIR JOB_POOLS LIST_SEPARATOR LOG_ LOG_BUILD LOG_CONFIGURE LOG_DOWNLOAD LOG_INSTALL LOG_TEST LOG_UPDATE MAKE_EXE NAMES NOTE NO_DEPENDS PATCH_COMMAND PREFIX PROPERTY SOURCE_DIR SOURCE_SUBDIR STAMP_DIR STEP_TARGETS STRING SVN_PASSWORD SVN_REPOSITORY SVN_REVISION SVN_TRUST_CERT SVN_USERNAME TEST_AFTER_INSTALL TEST_BEFORE_INSTALL TEST_COMMAND TEST_EXCLUDE_FROM_MAIN TIMEOUT TLS_CAINFO TLS_VERIFY TMP_DIR TRUE UPDATE_COMMAND UPDATE_DISCONNECTED URL URL_HASH USES_TERMINAL_BUILD USES_TERMINAL_CONFIGURE USES_TERMINAL_DOWNLOAD USES_TERMINAL_INSTALL USES_TERMINAL_TEST USES_TERMINAL_UPDATE WORKING_DIRECTORY
+
+syn keyword cmakeKWadd_compile_options contained
+ \ COMPILE_OPTIONS
+
+syn keyword cmakeKWadd_custom_command contained
+ \ APPEND ARGS BYPRODUCTS CC COMMAND COMMAND_EXPAND_LISTS COMMENT CROSSCOMPILING_EMULATOR DEPENDS DEPFILE GENERATED IMPLICIT_DEPENDS INCLUDE_DIRECTORIES JOIN MAIN_DEPENDENCY NOT OUTPUT POST_BUILD PRE_BUILD PRE_LINK SYMBOLIC TARGET_FILE TARGET_PROPERTY USES_TERMINAL VERBATIM WORKING_DIRECTORY
+
+syn keyword cmakeKWadd_custom_target contained
+ \ ALL BYPRODUCTS CC COMMAND COMMAND_EXPAND_LISTS COMMENT CROSSCOMPILING_EMULATOR DEPENDS GENERATED INCLUDE_DIRECTORIES JOIN SOURCES TARGET_PROPERTY USES_TERMINAL VERBATIM WORKING_DIRECTORY
+
+syn keyword cmakeKWadd_definitions contained
+ \ COMPILE_DEFINITIONS
+
+syn keyword cmakeKWadd_dependencies contained
+ \ DEPENDS OBJECT_DEPENDS
+
+syn keyword cmakeKWadd_executable contained
+ \ ALIAS CONFIG EXCLUDE_FROM_ALL GLOBAL HEADER_FILE_ONLY IMPORTED IMPORTED_ IMPORTED_LOCATION IMPORTED_LOCATION_ MACOSX_BUNDLE OUTPUT_NAME RUNTIME_OUTPUT_DIRECTORY TARGET
+
+syn keyword cmakeKWadd_library contained
+ \ ALIAS ARCHIVE_OUTPUT_DIRECTORY CLI CONFIG DLL EXCLUDE_FROM_ALL FRAMEWORK GLOBAL HEADER_FILE_ONLY IMPORTED IMPORTED_ IMPORTED_LOCATION IMPORTED_LOCATION_ INTERFACE_ LIBRARY_OUTPUT_DIRECTORY MODULE OBJECT ON OUTPUT_NAME POSITION_INDEPENDENT_CODE POST_BUILD PRE_BUILD PRE_LINK RUNTIME_OUTPUT_DIRECTORY SHARED STATIC TARGET_OBJECTS UNKNOWN
+
+syn keyword cmakeKWadd_subdirectory contained
+ \ EXCLUDE_FROM_ALL
+
+syn keyword cmakeKWadd_test contained
+ \ BUILD_TESTING COMMAND CONFIGURATIONS FAIL_REGULAR_EXPRESSION NAME PASS_REGULAR_EXPRESSION TARGET_FILE WILL_FAIL WORKING_DIRECTORY
+
+syn keyword cmakeKWbuild_command contained
+ \ CONFIGURATION TARGET
+
+syn keyword cmakeKWbuild_name contained
+ \ CMAKE_CXX_COMPILER
+
+syn keyword cmakeKWcmake_host_system_information contained
+ \ AVAILABLE_PHYSICAL_MEMORY AVAILABLE_VIRTUAL_MEMORY FQDN HAS_FPU HAS_MMX HAS_MMX_PLUS HAS_SERIAL_NUMBER HAS_SSE HAS_SSE_FP HAS_SSE_MMX HOSTNAME ID NUMBER_OF_LOGICAL_CORES NUMBER_OF_PHYSICAL_CORES OS_NAME OS_PLATFORM OS_RELEASE OS_VERSION PROCESSOR_DESCRIPTION PROCESSOR_NAME PROCESSOR_SERIAL_NUMBER QUERY RESULT TOTAL_PHYSICAL_MEMORY TOTAL_VIRTUAL_MEMORY
+
+syn keyword cmakeKWcmake_minimum_required contained
+ \ FATAL_ERROR VERSION
+
+syn keyword cmakeKWcmake_parse_arguments contained
+ \ ARGN CONFIGURATIONS DESTINATION FALSE FAST FILES MY_INSTALL MY_INSTALL_CONFIGURATIONS MY_INSTALL_DESTINATION MY_INSTALL_FAST MY_INSTALL_OPTIONAL MY_INSTALL_RENAME MY_INSTALL_TARGETS MY_INSTALL_UNPARSED_ARGUMENTS OPTIONAL PARSE_ARGV RENAME TARGETS TRUE _UNPARSED_ARGUMENTS
+
+syn keyword cmakeKWcmake_policy contained
+ \ CMAKE_POLICY_DEFAULT_CMP CMP GET NNNN NO_POLICY_SCOPE OLD POP PUSH SET VERSION
+
+syn keyword cmakeKWconfigure_file contained
+ \ COPYONLY CRLF DOS ESCAPE_QUOTES FOO_ENABLE FOO_STRING LF NEWLINE_STYLE VAR
+
+syn keyword cmakeKWcreate_test_sourcelist contained
+ \ CMAKE_TESTDRIVER_AFTER_TESTMAIN CMAKE_TESTDRIVER_BEFORE_TESTMAIN EXTRA_INCLUDE FUNCTION
+
+syn keyword cmakeKWctest_build contained
+ \ ALL_BUILD APPEND BUILD CAPTURE_CMAKE_ERROR CONFIGURATION CTEST_BUILD_CONFIGURATION CTEST_BUILD_FLAGS CTEST_BUILD_TARGET CTEST_PROJECT_NAME FLAGS NUMBER_ERRORS NUMBER_WARNINGS QUIET RETURN_VALUE TARGET
+
+syn keyword cmakeKWctest_configure contained
+ \ APPEND BUILD CAPTURE_CMAKE_ERROR OPTIONS QUIET RETURN_VALUE SOURCE
+
+syn keyword cmakeKWctest_coverage contained
+ \ APPEND BUILD CAPTURE_CMAKE_ERROR LABELS QUIET RETURN_VALUE
+
+syn keyword cmakeKWctest_memcheck contained
+ \ APPEND BUILD DEFECT_COUNT EXCLUDE EXCLUDE_FIXTURE EXCLUDE_FIXTURE_CLEANUP EXCLUDE_FIXTURE_SETUP EXCLUDE_LABEL INCLUDE INCLUDE_LABEL OFF ON PARALLEL_LEVEL QUIET RETURN_VALUE SCHEDULE_RANDOM START STOP_TIME STRIDE TEST_LOAD
+
+syn keyword cmakeKWctest_run_script contained
+ \ NEW_PROCESS RETURN_VALUE
+
+syn keyword cmakeKWctest_start contained
+ \ APPEND QUIET TAG TRACK
+
+syn keyword cmakeKWctest_submit contained
+ \ API CDASH_UPLOAD CDASH_UPLOAD_TYPE CTEST_EXTRA_SUBMIT_FILES CTEST_NOTES_FILES FILES HTTPHEADER PARTS QUIET RETRY_COUNT RETRY_DELAY RETURN_VALUE
+
+syn keyword cmakeKWctest_test contained
+ \ APPEND BUILD CAPTURE_CMAKE_ERROR CPU EXCLUDE EXCLUDE_FIXTURE EXCLUDE_FIXTURE_CLEANUP EXCLUDE_FIXTURE_SETUP EXCLUDE_LABEL INCLUDE INCLUDE_LABEL OFF ON PARALLEL_LEVEL QUIET RETURN_VALUE SCHEDULE_RANDOM START STOP_TIME STRIDE TEST_LOAD
+
+syn keyword cmakeKWctest_update contained
+ \ QUIET RETURN_VALUE SOURCE
+
+syn keyword cmakeKWctest_upload contained
+ \ CAPTURE_CMAKE_ERROR FILES QUIET
+
+syn keyword cmakeKWdefine_property contained
+ \ BRIEF_DOCS CACHED_VARIABLE DIRECTORY FULL_DOCS GLOBAL INHERITED PROPERTY SOURCE TARGET TEST VARIABLE
+
+syn keyword cmakeKWenable_language contained
+ \ OPTIONAL
+
+syn keyword cmakeKWexec_program contained
+ \ ARGS OUTPUT_VARIABLE RETURN_VALUE
+
+syn keyword cmakeKWexecute_process contained
+ \ ANSI AUTO COMMAND ENCODING ERROR_FILE ERROR_QUIET ERROR_STRIP_TRAILING_WHITESPACE ERROR_VARIABLE INPUT_FILE NONE OEM OUTPUT_FILE OUTPUT_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE RESULTS_VARIABLE RESULT_VARIABLE TIMEOUT UTF VERBATIM WORKING_DIRECTORY
+
+syn keyword cmakeKWexport contained
+ \ ANDROID_MK APPEND CONFIG EXPORT EXPORT_LINK_INTERFACE_LIBRARIES FILE IMPORTED IMPORTED_ NAMESPACE NDK OLD PACKAGE TARGETS
+
+syn keyword cmakeKWexport_library_dependencies contained
+ \ APPEND EXPORT INCLUDE LINK_INTERFACE_LIBRARIES SET
+
+syn keyword cmakeKWfile contained
+ \ ALGO APPEND ASCII CMAKE_TLS_CAINFO CMAKE_TLS_VERIFY CONDITION CONFIG CONTENT COPY CR DESTINATION DIRECTORY_PERMISSIONS DOWNLOAD ENCODING EXCLUDE EXPECTED_HASH FILES_MATCHING FILE_PERMISSIONS FOLLOW_SYMLINKS FUNCTION GENERATE GLOB GLOB_RECURSE GUARD HASH HEX HTTPHEADER INACTIVITY_TIMEOUT INSTALL LENGTH_MAXIMUM LENGTH_MINIMUM LF LIMIT LIMIT_COUNT LIMIT_INPUT LIMIT_OUTPUT LIST_DIRECTORIES LOCK LOG MAKE_DIRECTORY NEWLINE_CONSUME NO_HEX_CONVERSION NO_SOURCE_PERMISSIONS OFFSET OLD PATTERN PROCESS READ REGEX RELATIVE RELATIVE_PATH RELEASE REMOVE REMOVE_RECURSE RENAME RESULT_VARIABLE SHOW_PROGRESS SSL STATUS STRINGS TIMESTAMP TLS_CAINFO TLS_VERIFY TO_CMAKE_PATH TO_NATIVE_PATH UPLOAD USERPWD USE_SOURCE_PERMISSIONS UTC UTF WRITE
+
+syn keyword cmakeKWfind_file contained
+ \ CMAKE_FIND_ROOT_PATH_BOTH DOC DVAR HINTS INCLUDE NAMES NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_FIND_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_SYSTEM_PATH NO_DEFAULT_PATH NO_SYSTEM_ENVIRONMENT_PATH ONLY_CMAKE_FIND_ROOT_PATH OS PATHS PATH_SUFFIXES VAR
+
+syn keyword cmakeKWfind_library contained
+ \ CMAKE_FIND_ROOT_PATH_BOTH DOC DVAR HINTS LIB NAMES NAMES_PER_DIR NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_FIND_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_SYSTEM_PATH NO_DEFAULT_PATH NO_SYSTEM_ENVIRONMENT_PATH ONLY_CMAKE_FIND_ROOT_PATH OS PATHS PATH_SUFFIXES VAR
+
+syn keyword cmakeKWfind_package contained
+ \ CMAKE_DISABLE_FIND_PACKAGE_ CMAKE_FIND_ROOT_PATH_BOTH COMPONENTS CONFIG CONFIGS DEC DVAR EXACT HINTS MODULE NAMES NATURAL NO_CMAKE_BUILDS_PATH NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_FIND_ROOT_PATH NO_CMAKE_PACKAGE_REGISTRY NO_CMAKE_PATH NO_CMAKE_SYSTEM_PACKAGE_REGISTRY NO_CMAKE_SYSTEM_PATH NO_DEFAULT_PATH NO_MODULE NO_POLICY_SCOPE NO_SYSTEM_ENVIRONMENT_PATH ONLY_CMAKE_FIND_ROOT_PATH OPTIONAL_COMPONENTS OS PACKAGE_FIND_NAME PACKAGE_FIND_VERSION PACKAGE_FIND_VERSION_COUNT PACKAGE_FIND_VERSION_MAJOR PACKAGE_FIND_VERSION_MINOR PACKAGE_FIND_VERSION_PATCH PACKAGE_FIND_VERSION_TWEAK PACKAGE_VERSION PACKAGE_VERSION_COMPATIBLE PACKAGE_VERSION_EXACT PACKAGE_VERSION_UNSUITABLE PATHS PATH_SUFFIXES QUIET REQUIRED SET TRUE _CONFIG _CONSIDERED_CONFIGS _CONSIDERED_VERSIONS _DIR _FIND_COMPONENTS _FIND_QUIETLY _FIND_REQUIRED _FIND_REQUIRED_ _FIND_VERSION_EXACT _FOUND
+
+syn keyword cmakeKWfind_path contained
+ \ CMAKE_FIND_ROOT_PATH_BOTH DOC DVAR HINTS INCLUDE NAMES NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_FIND_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_SYSTEM_PATH NO_DEFAULT_PATH NO_SYSTEM_ENVIRONMENT_PATH ONLY_CMAKE_FIND_ROOT_PATH OS PATHS PATH_SUFFIXES VAR
+
+syn keyword cmakeKWfind_program contained
+ \ CMAKE_FIND_ROOT_PATH_BOTH DOC DVAR HINTS NAMES NAMES_PER_DIR NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_FIND_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_SYSTEM_PATH NO_DEFAULT_PATH NO_SYSTEM_ENVIRONMENT_PATH ONLY_CMAKE_FIND_ROOT_PATH OS PATHS PATH_SUFFIXES VAR
+
+syn keyword cmakeKWfltk_wrap_ui contained
+ \ FLTK
+
+syn keyword cmakeKWforeach contained
+ \ ARGS IN ITEMS LISTS RANGE
+
+syn keyword cmakeKWfunction contained
+ \ ARGC ARGN ARGS ARGV PARENT_SCOPE
+
+syn keyword cmakeKWget_cmake_property contained
+ \ COMPONENTS GLOBAL MACROS VAR VARIABLES
+
+syn keyword cmakeKWget_directory_property contained
+ \ DEFINITION DIRECTORY
+
+syn keyword cmakeKWget_filename_component contained
+ \ ABSOLUTE ARG_VAR BASE_DIR CACHE COMP DIRECTORY EXT NAME NAME_WE PATH PROGRAM PROGRAM_ARGS REALPATH VAR
+
+syn keyword cmakeKWget_property contained
+ \ BRIEF_DOCS CACHE DEFINED DIRECTORY FULL_DOCS GLOBAL INSTALL PROPERTY SET SOURCE TARGET TEST VARIABLE
+
+syn keyword cmakeKWget_source_file_property contained
+ \ LOCATION VAR
-" The keywords are generated as: cmake --help-command-list | tr "\n" " "
-syn keyword cmakeStatement
- \ ADD_CUSTOM_COMMAND ADD_CUSTOM_TARGET ADD_DEFINITIONS ADD_DEPENDENCIES ADD_EXECUTABLE ADD_LIBRARY ADD_SUBDIRECTORY ADD_TEST AUX_SOURCE_DIRECTORY BUILD_COMMAND BUILD_NAME CMAKE_MINIMUM_REQUIRED CONFIGURE_FILE CREATE_TEST_SOURCELIST ELSE ELSEIF ENABLE_LANGUAGE ENABLE_TESTING ENDFOREACH ENDFUNCTION ENDIF ENDMACRO ENDWHILE EXEC_PROGRAM EXECUTE_PROCESS EXPORT_LIBRARY_DEPENDENCIES FILE FIND_FILE FIND_LIBRARY FIND_PACKAGE FIND_PATH FIND_PROGRAM FLTK_WRAP_UI FOREACH FUNCTION GET_CMAKE_PROPERTY GET_DIRECTORY_PROPERTY GET_FILENAME_COMPONENT GET_SOURCE_FILE_PROPERTY GET_TARGET_PROPERTY GET_TEST_PROPERTY IF INCLUDE INCLUDE_DIRECTORIES INCLUDE_EXTERNAL_MSPROJECT INCLUDE_REGULAR_EXPRESSION INSTALL INSTALL_FILES INSTALL_PROGRAMS INSTALL_TARGETS LINK_DIRECTORIES LINK_LIBRARIES LIST LOAD_CACHE LOAD_COMMAND MACRO MAKE_DIRECTORY MARK_AS_ADVANCED MATH MESSAGE OPTION OUTPUT_REQUIRED_FILES PROJECT QT_WRAP_CPP QT_WRAP_UI REMOVE REMOVE_DEFINITIONS SEPARATE_ARGUMENTS SET SET_DIRECTORY_PROPERTIES SET_SOURCE_FILES_PROPERTIES SET_TARGET_PROPERTIES SET_TESTS_PROPERTIES SITE_NAME SOURCE_GROUP STRING SUBDIR_DEPENDS SUBDIRS TARGET_LINK_LIBRARIES TRY_COMPILE TRY_RUN UNSET USE_MANGLED_MESA UTILITY_SOURCE VARIABLE_REQUIRES VTK_MAKE_INSTANTIATOR VTK_WRAP_JAVA VTK_WRAP_PYTHON VTK_WRAP_TCL WHILE WRITE_FILE
+syn keyword cmakeKWget_target_property contained
+ \ VAR
+
+syn keyword cmakeKWget_test_property contained
+ \ VAR
+
+syn keyword cmakeKWif contained
+ \ ARGS CMAKE_MATCH_ CMP COMMAND DEFINED EQUAL EXISTS FALSE GREATER GREATER_EQUAL IGNORE IN_LIST IS_ABSOLUTE IS_DIRECTORY IS_NEWER_THAN IS_SYMLINK LESS LESS_EQUAL MATCHES NNNN NOT OFF OR POLICY STREQUAL STRGREATER STRGREATER_EQUAL STRLESS STRLESS_EQUAL TARGET TEST THEN TRUE VERSION_EQUAL VERSION_GREATER VERSION_GREATER_EQUAL VERSION_LESS VERSION_LESS_EQUAL YES
+
+syn keyword cmakeKWinclude contained
+ \ NO_POLICY_SCOPE OPTIONAL RESULT_VARIABLE
+
+syn keyword cmakeKWinclude_directories contained
+ \ AFTER BEFORE INCLUDE_DIRECTORIES ON SYSTEM
+
+syn keyword cmakeKWinclude_external_msproject contained
+ \ GUID MAP_IMPORTED_CONFIG_ PLATFORM TYPE WIX
+
+syn keyword cmakeKWinclude_guard contained
+ \ DIRECTORY GLOBAL TRUE __CURRENT_FILE_VAR__
+
+syn keyword cmakeKWinstall contained
+ \ ARCHIVE BUNDLE CODE COMPONENT CONFIGURATIONS CVS DESTDIR DESTINATION DIRECTORY DIRECTORY_PERMISSIONS DLL EXCLUDE_FROM_ALL EXPORT EXPORT_ANDROID_MK EXPORT_LINK_INTERFACE_LIBRARIES FILES FILES_MATCHING FILE_PERMISSIONS FRAMEWORK GROUP_EXECUTE GROUP_READ GROUP_WRITE IMPORTED_ INCLUDES INSTALL_PREFIX INTERFACE_INCLUDE_DIRECTORIES LIBRARY MACOSX_BUNDLE MESSAGE_NEVER NAMELINK_ONLY NAMELINK_SKIP NAMESPACE NDK OBJECTS OPTIONAL OWNER_EXECUTE OWNER_READ OWNER_WRITE PATTERN PERMISSIONS POST_INSTALL_SCRIPT PRE_INSTALL_SCRIPT PRIVATE_HEADER PROGRAMS PUBLIC_HEADER REGEX RENAME RESOURCE RUNTIME SCRIPT SETGID SETUID SOVERSION TARGETS TRUE USE_SOURCE_PERMISSIONS VERSION WORLD_EXECUTE WORLD_READ WORLD_WRITE
+
+syn keyword cmakeKWinstall_files contained
+ \ FILES GLOB
+
+syn keyword cmakeKWinstall_programs contained
+ \ FILES GLOB PROGRAMS TARGETS
+
+syn keyword cmakeKWinstall_targets contained
+ \ DLL RUNTIME_DIRECTORY TARGETS
+
+syn keyword cmakeKWlist contained
+ \ APPEND CACHE EXCLUDE FILTER FIND GET INCLUDE INSERT INTERNAL LENGTH LIST NOTES PARENT_SCOPE REGEX REMOVE_AT REMOVE_DUPLICATES REMOVE_ITEM REVERSE SORT
+
+syn keyword cmakeKWload_cache contained
+ \ EXCLUDE INCLUDE_INTERNALS READ_WITH_PREFIX
+
+syn keyword cmakeKWload_command contained
+ \ CMAKE_LOADED_COMMAND_ COMMAND_NAME
+
+syn keyword cmakeKWmacro contained
+ \ ARGC ARGN ARGS ARGV DEFINED GREATER LISTS NOT _BAR _FOO
+
+syn keyword cmakeKWmake_directory contained
+ \ MAKE_DIRECTORY
+
+syn keyword cmakeKWmark_as_advanced contained
+ \ CLEAR FORCE VAR
+
+syn keyword cmakeKWmath contained
+ \ EXPR
+
+syn keyword cmakeKWmessage contained
+ \ AUTHOR_WARNING DEPRECATION FATAL_ERROR GUI SEND_ERROR STATUS WARNING
+
+syn keyword cmakeKWoption contained
+ \ OFF ON
+
+syn keyword cmakeKWproject contained
+ \ CMAKE_PROJECT_ DESCRIPTION LANGUAGES NAME NONE PROJECT VERSION _BINARY_DIR _INCLUDE _SOURCE_DIR _VERSION _VERSION_MAJOR _VERSION_MINOR _VERSION_PATCH _VERSION_TWEAK
+
+syn keyword cmakeKWremove contained
+ \ REMOVE_ITEM VALUE VAR
+
+syn keyword cmakeKWseparate_arguments contained
+ \ MSDN NATIVE NATIVE_COMMAND UNIX_COMMAND WINDOWS WINDOWS_COMMAND _COMMAND
+
+syn keyword cmakeKWset contained
+ \ BOOL CACHE FILEPATH FORCE INTERNAL OFF ON PARENT_SCOPE STRING STRINGS
+
+syn keyword cmakeKWset_directory_properties contained
+ \ PROPERTIES
+
+syn keyword cmakeKWset_property contained
+ \ APPEND APPEND_STRING CACHE DIRECTORY GLOBAL INSTALL PROPERTY SOURCE TARGET TEST WIX
+
+syn keyword cmakeKWset_source_files_properties contained
+ \ PROPERTIES
+
+syn keyword cmakeKWset_target_properties contained
+ \ PROPERTIES
+
+syn keyword cmakeKWset_tests_properties contained
+ \ PROPERTIES
+
+syn keyword cmakeKWsource_group contained
+ \ FILES PREFIX REGULAR_EXPRESSION TREE
+
+syn keyword cmakeKWstring contained
+ \ ALPHABET APPEND ASCII CMAKE_MATCH_ COMPARE CONCAT CONFIGURE EQUAL ESCAPE_QUOTES FIND GENEX_STRIP GREATER GREATER_EQUAL GUID HASH LENGTH LESS LESS_EQUAL MAKE_C_IDENTIFIER MATCH MATCHALL MATCHES NAMESPACE NOTEQUAL ONLY PREPEND RANDOM RANDOM_SEED REGEX REPLACE REVERSE RFC SHA SOURCE_DATE_EPOCH STRIP SUBSTRING SZ TIMESTAMP TOLOWER TOUPPER TYPE US UTC UUID
+
+syn keyword cmakeKWsubdirs contained
+ \ EXCLUDE_FROM_ALL PREORDER
+
+syn keyword cmakeKWtarget_compile_definitions contained
+ \ COMPILE_DEFINITIONS INTERFACE INTERFACE_COMPILE_DEFINITIONS PRIVATE PUBLIC
+
+syn keyword cmakeKWtarget_compile_features contained
+ \ COMPILE_FEATURES IMPORTED INTERFACE INTERFACE_COMPILE_FEATURES PRIVATE PUBLIC
+
+syn keyword cmakeKWtarget_compile_options contained
+ \ BEFORE COMPILE_OPTIONS IMPORTED INTERFACE INTERFACE_COMPILE_OPTIONS PRIVATE PUBLIC
+
+syn keyword cmakeKWtarget_include_directories contained
+ \ BEFORE BUILD_INTERFACE IMPORTED INCLUDE_DIRECTORIES INSTALL_INTERFACE INTERFACE INTERFACE_INCLUDE_DIRECTORIES INTERFACE_LINK_LIBRARIES INTERFACE_SYSTEM_INCLUDE_DIRECTORIES PRIVATE PUBLIC SYSTEM
+
+syn keyword cmakeKWtarget_link_libraries contained
+ \ ALIAS DAG DEBUG_CONFIGURATIONS IMPORTED IMPORTED_NO_SONAME INTERFACE INTERFACE_LINK_LIBRARIES LINK_FLAGS LINK_INTERFACE_LIBRARIES LINK_INTERFACE_LIBRARIES_DEBUG LINK_INTERFACE_MULTIPLICITY LINK_PRIVATE LINK_PUBLIC OLD OSX PRIVATE PUBLIC STATIC
+
+syn keyword cmakeKWtarget_sources contained
+ \ IMPORTED INTERFACE INTERFACE_SOURCES PRIVATE PUBLIC SOURCES
+
+syn keyword cmakeKWtry_compile contained
+ \ ALL_BUILD CMAKE_FLAGS COMPILE_DEFINITIONS COPY_FILE COPY_FILE_ERROR CUDA_EXTENSIONS CUDA_STANDARD CUDA_STANDARD_REQUIRED CXX_EXTENSIONS CXX_STANDARD CXX_STANDARD_REQUIRED C_EXTENSIONS C_STANDARD C_STANDARD_REQUIRED DEFINED DLINK_LIBRARIES DVAR FALSE INCLUDE_DIRECTORIES LANG LINK_DIRECTORIES LINK_LIBRARIES NOT OUTPUT_VARIABLE RESULT_VAR SOURCES TRUE TYPE VALUE _EXTENSIONS _STANDARD _STANDARD_REQUIRED
+
+syn keyword cmakeKWtry_run contained
+ \ ARGS CMAKE_FLAGS COMPILE_DEFINITIONS COMPILE_OUTPUT_VARIABLE COMPILE_RESULT_VAR DLINK_LIBRARIES DVAR FAILED_TO_RUN FALSE INCLUDE_DIRECTORIES LINK_DIRECTORIES LINK_LIBRARIES RUN_OUTPUT_VARIABLE RUN_RESULT_VAR TRUE TYPE VALUE __TRYRUN_OUTPUT
+
+syn keyword cmakeKWunset contained
+ \ CACHE LD_LIBRARY_PATH PARENT_SCOPE
+
+syn keyword cmakeKWuse_mangled_mesa contained
+ \ GL OUTPUT_DIRECTORY PATH_TO_MESA
+
+syn keyword cmakeKWvariable_requires contained
+ \ RESULT_VARIABLE TEST_VARIABLE
+
+syn keyword cmakeKWvariable_watch contained
+ \ COMMAND
+
+syn keyword cmakeKWwhile contained
+ \ ARGS
+
+syn keyword cmakeKWwrite_file contained
+ \ APPEND CONFIGURE_FILE NOTE WRITE
+
+
+syn keyword cmakeGeneratorExpressions contained
+ \ LINK_LIBRARIES INCLUDE_DIRECTORIES COMPILE_DEFINITIONS CONFIG DEBUG_MODE BOOL AND NOT IF STREQUAL MAP_IMPORTED_CONFIG_ PLATFORM_ID C_COMPILER_ID CXX_COMPILER_ID VERSION_LESS VERSION_GREATER VERSION_EQUAL VERSION_LESS_EQUAL VERSION_GREATER_EQUAL C_COMPILER_VERSION CXX_COMPILER_VERSION TARGET_POLICY COMPILE_FEATURES C_STANDARD CXX_STANDARD COMPILE_LANGUAGE PRIVATE PUBLIC COMPILING_CXX GNU OLD_COMPILER CMAKE_CXX_COMPILER_VERSION CONFIGURATION TARGET_FILE TARGET_FILE_NAME TARGET_FILE_DIR TARGET_LINKER_FILE TARGET_LINKER_FILE_NAME TARGET_LINKER_FILE_DIR TARGET_SONAME_FILE TARGET_SONAME_FILE_NAME TARGET_SONAME_FILE_DIR TARGET_PDB_FILE PDB_NAME PDB_OUTPUT_DIRECTORY PDB_NAME_ PDB_OUTPUT_DIRECTORY_ TARGET_PDB_FILE_NAME TARGET_PDB_FILE_DIR TARGET_BUNDLE_DIR TARGET_BUNDLE_CONTENT_DIR SDK TARGET_PROPERTY INSTALL_PREFIX EXPORT JOIN ANGLE COMMA SEMICOLON TARGET_NAME LINK_ONLY INTERFACE_LINK_LIBRARIES INSTALL_INTERFACE BUILD_INTERFACE LOWER_CASE UPPER_CASE MAKE_C_IDENTIFIER TARGET_OBJECTS OBJECT_LIBRARY SHELL_PATH MSYS
+
+syn case ignore
+
+syn keyword cmakeCommand
+ \ add_compile_options add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_subdirectory add_test aux_source_directory break build_command cmake_host_system_information cmake_minimum_required cmake_parse_arguments cmake_policy configure_file continue create_test_sourcelist ctest_build ctest_configure ctest_coverage ctest_empty_binary_directory ctest_memcheck ctest_read_custom_files ctest_run_script ctest_sleep ctest_start ctest_submit ctest_test ctest_update ctest_upload define_property enable_language enable_testing endfunction endmacro execute_process export file find_file find_library find_package find_path find_program fltk_wrap_ui function get_cmake_property get_directory_property get_filename_component get_property get_source_file_property get_target_property get_test_property include include_directories include_external_msproject include_guard include_regular_expression install link_directories list load_cache load_command macro mark_as_advanced math message option project qt_wrap_cpp qt_wrap_ui remove_definitions return separate_arguments set set_directory_properties set_property set_source_files_properties set_target_properties set_tests_properties site_name source_group string target_compile_definitions target_compile_features target_compile_options target_include_directories target_link_libraries target_sources try_compile try_run unset variable_watch
+ \ nextgroup=cmakeArguments
+
+syn keyword cmakeCommandConditional
+ \ else elseif endif if
\ nextgroup=cmakeArguments
+
+syn keyword cmakeCommandRepeat
+ \ endforeach endwhile foreach while
+ \ nextgroup=cmakeArguments
+
+syn keyword cmakeCommandDeprecated
+ \ build_name exec_program export_library_dependencies install_files install_programs install_targets link_libraries make_directory output_required_files remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file
+ \ nextgroup=cmakeArguments
+
+syn case match
+
syn keyword cmakeTodo
\ TODO FIXME XXX
\ contained
-" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_cmake_syntax_inits")
- if version < 508
- let did_cmake_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink cmakeStatement Statement
- HiLink cmakeComment Comment
- HiLink cmakeString String
- HiLink cmakeVariableValue Type
- HiLink cmakeRegistry Underlined
- HiLink cmakeArguments Identifier
- HiLink cmakeArgument Constant
- HiLink cmakeEnvironment Special
- HiLink cmakeOperators Operator
- HiLink cmakeMacro PreProc
- HiLink cmakeError Error
- HiLink cmakeTodo TODO
- HiLink cmakeEscaped Special
-
- delcommand HiLink
-endif
+hi def link cmakeCommand Function
+hi def link cmakeCommandConditional Conditional
+hi def link cmakeCommandDeprecated WarningMsg
+hi def link cmakeCommandRepeat Repeat
+hi def link cmakeComment Comment
+hi def link cmakeEnvironment Special
+hi def link cmakeEscaped Special
+hi def link cmakeGeneratorExpression WarningMsg
+hi def link cmakeGeneratorExpressions Constant
+hi def link cmakeLuaComment Comment
+hi def link cmakeModule Include
+hi def link cmakeProperty Constant
+hi def link cmakeRegistry Underlined
+hi def link cmakeString String
+hi def link cmakeTodo TODO
+hi def link cmakeVariableValue Type
+hi def link cmakeVariable Identifier
+
+hi def link cmakeKWExternalProject ModeMsg
+hi def link cmakeKWadd_compile_options ModeMsg
+hi def link cmakeKWadd_custom_command ModeMsg
+hi def link cmakeKWadd_custom_target ModeMsg
+hi def link cmakeKWadd_definitions ModeMsg
+hi def link cmakeKWadd_dependencies ModeMsg
+hi def link cmakeKWadd_executable ModeMsg
+hi def link cmakeKWadd_library ModeMsg
+hi def link cmakeKWadd_subdirectory ModeMsg
+hi def link cmakeKWadd_test ModeMsg
+hi def link cmakeKWbuild_command ModeMsg
+hi def link cmakeKWbuild_name ModeMsg
+hi def link cmakeKWcmake_host_system_information ModeMsg
+hi def link cmakeKWcmake_minimum_required ModeMsg
+hi def link cmakeKWcmake_parse_arguments ModeMsg
+hi def link cmakeKWcmake_policy ModeMsg
+hi def link cmakeKWconfigure_file ModeMsg
+hi def link cmakeKWcreate_test_sourcelist ModeMsg
+hi def link cmakeKWctest_build ModeMsg
+hi def link cmakeKWctest_configure ModeMsg
+hi def link cmakeKWctest_coverage ModeMsg
+hi def link cmakeKWctest_memcheck ModeMsg
+hi def link cmakeKWctest_run_script ModeMsg
+hi def link cmakeKWctest_start ModeMsg
+hi def link cmakeKWctest_submit ModeMsg
+hi def link cmakeKWctest_test ModeMsg
+hi def link cmakeKWctest_update ModeMsg
+hi def link cmakeKWctest_upload ModeMsg
+hi def link cmakeKWdefine_property ModeMsg
+hi def link cmakeKWenable_language ModeMsg
+hi def link cmakeKWexec_program ModeMsg
+hi def link cmakeKWexecute_process ModeMsg
+hi def link cmakeKWexport ModeMsg
+hi def link cmakeKWexport_library_dependencies ModeMsg
+hi def link cmakeKWfile ModeMsg
+hi def link cmakeKWfind_file ModeMsg
+hi def link cmakeKWfind_library ModeMsg
+hi def link cmakeKWfind_package ModeMsg
+hi def link cmakeKWfind_path ModeMsg
+hi def link cmakeKWfind_program ModeMsg
+hi def link cmakeKWfltk_wrap_ui ModeMsg
+hi def link cmakeKWforeach ModeMsg
+hi def link cmakeKWfunction ModeMsg
+hi def link cmakeKWget_cmake_property ModeMsg
+hi def link cmakeKWget_directory_property ModeMsg
+hi def link cmakeKWget_filename_component ModeMsg
+hi def link cmakeKWget_property ModeMsg
+hi def link cmakeKWget_source_file_property ModeMsg
+hi def link cmakeKWget_target_property ModeMsg
+hi def link cmakeKWget_test_property ModeMsg
+hi def link cmakeKWif ModeMsg
+hi def link cmakeKWinclude ModeMsg
+hi def link cmakeKWinclude_directories ModeMsg
+hi def link cmakeKWinclude_external_msproject ModeMsg
+hi def link cmakeKWinclude_guard ModeMsg
+hi def link cmakeKWinstall ModeMsg
+hi def link cmakeKWinstall_files ModeMsg
+hi def link cmakeKWinstall_programs ModeMsg
+hi def link cmakeKWinstall_targets ModeMsg
+hi def link cmakeKWlist ModeMsg
+hi def link cmakeKWload_cache ModeMsg
+hi def link cmakeKWload_command ModeMsg
+hi def link cmakeKWmacro ModeMsg
+hi def link cmakeKWmake_directory ModeMsg
+hi def link cmakeKWmark_as_advanced ModeMsg
+hi def link cmakeKWmath ModeMsg
+hi def link cmakeKWmessage ModeMsg
+hi def link cmakeKWoption ModeMsg
+hi def link cmakeKWproject ModeMsg
+hi def link cmakeKWremove ModeMsg
+hi def link cmakeKWseparate_arguments ModeMsg
+hi def link cmakeKWset ModeMsg
+hi def link cmakeKWset_directory_properties ModeMsg
+hi def link cmakeKWset_property ModeMsg
+hi def link cmakeKWset_source_files_properties ModeMsg
+hi def link cmakeKWset_target_properties ModeMsg
+hi def link cmakeKWset_tests_properties ModeMsg
+hi def link cmakeKWsource_group ModeMsg
+hi def link cmakeKWstring ModeMsg
+hi def link cmakeKWsubdirs ModeMsg
+hi def link cmakeKWtarget_compile_definitions ModeMsg
+hi def link cmakeKWtarget_compile_features ModeMsg
+hi def link cmakeKWtarget_compile_options ModeMsg
+hi def link cmakeKWtarget_include_directories ModeMsg
+hi def link cmakeKWtarget_link_libraries ModeMsg
+hi def link cmakeKWtarget_sources ModeMsg
+hi def link cmakeKWtry_compile ModeMsg
+hi def link cmakeKWtry_run ModeMsg
+hi def link cmakeKWunset ModeMsg
+hi def link cmakeKWuse_mangled_mesa ModeMsg
+hi def link cmakeKWvariable_requires ModeMsg
+hi def link cmakeKWvariable_watch ModeMsg
+hi def link cmakeKWwhile ModeMsg
+hi def link cmakeKWwrite_file ModeMsg
let b:current_syntax = "cmake"
let &cpo = s:keepcpo
unlet s:keepcpo
-"EOF"
+" vim: set nowrap:
diff --git a/runtime/syntax/cmod.vim b/runtime/syntax/cmod.vim
new file mode 100644
index 0000000000..ea37682ff6
--- /dev/null
+++ b/runtime/syntax/cmod.vim
@@ -0,0 +1,144 @@
+" Vim syntax file
+" Language: Cmod
+" Current Maintainer: Stephen R. van den Berg <srb@cuci.nl>
+" Last Change: 2018 Jan 23
+" Version: 2.9
+" Remark: Is used to edit Cmod files for Pike development.
+" Remark: Includes a highlighter for any embedded Autodoc format.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Read the C syntax to start with
+runtime! syntax/c.vim
+unlet b:current_syntax
+
+if !exists("c_autodoc")
+ " For embedded Autodoc documentation
+ syn include @cmodAutodoc <sfile>:p:h/autodoc.vim
+ unlet b:current_syntax
+endif
+
+" Supports rotating amongst several same-level preprocessor conditionals
+packadd! matchit
+let b:match_words = "({:}\\@1<=),^\s*#\s*\%(if\%(n\?def\)\|else\|el\%(se\)\?if\|endif\)\>"
+
+" Cmod extensions
+syn keyword cmodStatement __INIT INIT EXIT GC_RECURSE GC_CHECK
+syn keyword cmodStatement EXTRA OPTIMIZE RETURN
+syn keyword cmodStatement ADD_EFUN ADD_EFUN2 ADD_FUNCTION
+syn keyword cmodStatement MK_STRING MK_STRING_SVALUE CONSTANT_STRLEN
+
+syn keyword cmodStatement SET_SVAL pop_n_elems pop_stack
+syn keyword cmodStatement SIMPLE_ARG_TYPE_ERROR Pike_sp Pike_fp MKPCHARP
+syn keyword cmodStatement SET_SVAL_TYPE REF_MAKE_CONST_STRING INC_PCHARP
+syn keyword cmodStatement PTR_FROM_INT INHERIT_FROM_PTR
+syn keyword cmodStatement DECLARE_CYCLIC BEGIN_CYCLIC END_CYCLIC
+syn keyword cmodStatement UPDATE_LOCATION UNSAFE_IS_ZERO SAFE_IS_ZERO
+syn keyword cmodStatement MKPCHARP_STR APPLY_MASTER current_storage
+syn keyword cmodStatement PIKE_MAP_VARIABLE size_shift
+syn keyword cmodStatement THREADS_ALLOW THREADS_DISALLOW
+
+syn keyword cmodStatement add_integer_constant ref_push_object
+syn keyword cmodStatement push_string apply_svalue free_svalue
+syn keyword cmodStatement get_inherit_storage get_storage
+syn keyword cmodStatement make_shared_binary_string push_int64
+syn keyword cmodStatement begin_shared_string end_shared_string
+syn keyword cmodStatement add_ref fast_clone_object clone_object
+syn keyword cmodStatement push_undefined push_int ref_push_string
+syn keyword cmodStatement free_string push_ulongest free_object
+syn keyword cmodStatement convert_stack_top_to_bignum push_array
+syn keyword cmodStatement push_object reduce_stack_top_bignum
+syn keyword cmodStatement push_static_text apply_current
+syn keyword cmodStatement assign_svalue free_program destruct_object
+syn keyword cmodStatement start_new_program low_inherit stack_swap
+syn keyword cmodStatement generic_error_program end_program
+syn keyword cmodStatement free_array apply_external copy_mapping
+syn keyword cmodStatement push_constant_text ref_push_mapping
+syn keyword cmodStatement mapping_insert mapping_string_insert_string
+syn keyword cmodStatement f_aggregate_mapping f_aggregate apply
+syn keyword cmodStatement push_mapping push_svalue low_mapping_lookup
+syn keyword cmodStatement assign_svalues_no_free f_add
+syn keyword cmodStatement push_empty_string stack_dup assign_lvalue
+syn keyword cmodStatement low_mapping_string_lookup allocate_mapping
+syn keyword cmodStatement copy_shared_string make_shared_binary_string0
+syn keyword cmodStatement f_call_function f_index f_utf8_to_string
+syn keyword cmodStatement finish_string_builder init_string_builder
+syn keyword cmodStatement reset_string_builder free_string_builder
+syn keyword cmodStatement string_builder_putchar get_all_args
+syn keyword cmodStatement add_shared_strings check_all_args
+syn keyword cmodStatement do_inherit add_string_constant
+syn keyword cmodStatement add_program_constant set_init_callback
+syn keyword cmodStatement simple_mapping_string_lookup
+syn keyword cmodStatement f_sprintf push_text string_has_null
+syn keyword cmodStatement end_and_resize_shared_string
+
+syn keyword cmodStatement args sp
+
+syn keyword cmodStatement free
+
+syn keyword cmodConstant ID_PROTECTED ID_FINAL PIKE_DEBUG
+syn keyword cmodConstant NUMBER_NUMBER
+syn keyword cmodConstant PIKE_T_INT PIKE_T_STRING PIKE_T_ARRAY
+syn keyword cmodConstant PIKE_T_MULTISET PIKE_T_OBJECT PIKE_T_MAPPING
+syn keyword cmodConstant NUMBER_UNDEFINED PIKE_T_PROGRAM PIKE_T_FUNCTION
+syn keyword cmodConstant T_OBJECT T_STRING T_ARRAY T_MAPPING
+
+syn keyword cmodException SET_ONERROR UNSET_ONERROR ONERROR
+syn keyword cmodException CALL_AND_UNSET_ONERROR
+
+syn keyword cmodDebug Pike_fatal Pike_error check_stack
+
+syn keyword cmodAccess public protected private INHERIT
+syn keyword cmodAccess CTYPE CVAR PIKEVAR PIKEFUN
+
+syn keyword cmodModifier efun export flags optflags optfunc
+syn keyword cmodModifier type rawtype errname name c_name prototype
+syn keyword cmodModifier program_flags gc_trivial PMOD_EXPORT
+syn keyword cmodModifier ATTRIBUTE noclone noinline
+syn keyword cmodModifier tOr tFuncV tInt tMix tVoid tStr tMap tPrg
+syn keyword cmodModifier tSetvar tArr tMult tMultiset
+syn keyword cmodModifier tArray tMapping tString tSetvar tVar
+
+syn keyword cmodType bool mapping string multiset array mixed
+syn keyword cmodType object function program auto svalue
+syn keyword cmodType bignum longest zero pike_string
+syn keyword cmodType this this_program THIS INT_TYPE INT64 INT32
+syn keyword cmodType p_wchar2 PCHARP p_wchar1 p_wchar0 MP_INT
+
+syn keyword cmodOperator _destruct create __hash _sizeof _indices _values
+syn keyword cmodOperator _is_type _sprintf _equal _m_delete _get_iterator
+syn keyword cmodOperator _search _types _serialize _deserialize
+syn keyword cmodOperator _size_object _random _sqrt TYPEOF SUBTYPEOF
+syn keyword cmodOperator LIKELY UNLIKELY
+
+syn keyword cmodStructure DECLARATIONS PIKECLASS DECLARE_STORAGE
+
+if !exists("c_autodoc")
+ syn match cmodAutodocReal display contained "\%(//\|[/ \t\v]\*\|^\*\)\@2<=!.*" contains=@cmodAutodoc containedin=cComment,cCommentL
+ syn cluster cCommentGroup add=cmodAutodocReal
+ syn cluster cPreProcGroup add=cmodAutodocReal
+endif
+
+" Default highlighting
+hi def link cmodAccess Statement
+hi def link cmodOperator Operator
+hi def link cmodStatement Statement
+hi def link cmodConstant Constant
+hi def link cmodModifier Type
+hi def link cmodType Type
+hi def link cmodStorageClass StorageClass
+hi def link cmodStructure Structure
+hi def link cmodException Exception
+hi def link cmodDebug Debug
+
+let b:current_syntax = "cmod"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=8
diff --git a/runtime/syntax/cmusrc.vim b/runtime/syntax/cmusrc.vim
index e36a69c698..b821affd57 100644
--- a/runtime/syntax/cmusrc.vim
+++ b/runtime/syntax/cmusrc.vim
@@ -1,6 +1,6 @@
" Vim syntax file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2007-06-17
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-06-17
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/cobol.vim b/runtime/syntax/cobol.vim
index 51ca3d8773..2d481bba0b 100644
--- a/runtime/syntax/cobol.vim
+++ b/runtime/syntax/cobol.vim
@@ -6,20 +6,13 @@
" James Mitchell <james_mitchell@acm.org>)
" Last Change: 2015 Feb 13
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" MOST important - else most of the keywords wont work!
-if version < 600
- set isk=@,48-57,-
-else
- setlocal isk=@,48-57,-
-endif
+setlocal isk=@,48-57,-
syn case ignore
@@ -157,52 +150,42 @@ else
endif
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_cobol_syntax_inits")
- if version < 508
- let did_cobol_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink cobolBAD Error
- HiLink cobolBadID Error
- HiLink cobolBadLine Error
- if exists("g:cobol_legacy_code")
- HiLink cobolMarker Comment
- else
- HiLink cobolMarker Error
- endif
- HiLink cobolCALLs Function
- HiLink cobolComment Comment
- HiLink cobolKeys Comment
- HiLink cobolAreaB Special
- HiLink cobolCompiler PreProc
- HiLink cobolCondFlow Special
- HiLink cobolCopy PreProc
- HiLink cobolDeclA cobolDecl
- HiLink cobolDecl Type
- HiLink cobolExtras Special
- HiLink cobolGoTo Special
- HiLink cobolConstant Constant
- HiLink cobolNumber Constant
- HiLink cobolPic Constant
- HiLink cobolReserved Statement
- HiLink cobolDivision Label
- HiLink cobolSection Label
- HiLink cobolParagraph Label
- HiLink cobolDivisionName Keyword
- HiLink cobolSectionName Keyword
- HiLink cobolParagraphName Keyword
- HiLink cobolString Constant
- HiLink cobolTodo Todo
- HiLink cobolWatch Special
- HiLink cobolIndicator Special
-
- delcommand HiLink
+" Only when an item doesn't have highlighting yet
+
+hi def link cobolBAD Error
+hi def link cobolBadID Error
+hi def link cobolBadLine Error
+if exists("g:cobol_legacy_code")
+ hi def link cobolMarker Comment
+else
+ hi def link cobolMarker Error
endif
+hi def link cobolCALLs Function
+hi def link cobolComment Comment
+hi def link cobolKeys Comment
+hi def link cobolAreaB Special
+hi def link cobolCompiler PreProc
+hi def link cobolCondFlow Special
+hi def link cobolCopy PreProc
+hi def link cobolDeclA cobolDecl
+hi def link cobolDecl Type
+hi def link cobolExtras Special
+hi def link cobolGoTo Special
+hi def link cobolConstant Constant
+hi def link cobolNumber Constant
+hi def link cobolPic Constant
+hi def link cobolReserved Statement
+hi def link cobolDivision Label
+hi def link cobolSection Label
+hi def link cobolParagraph Label
+hi def link cobolDivisionName Keyword
+hi def link cobolSectionName Keyword
+hi def link cobolParagraphName Keyword
+hi def link cobolString Constant
+hi def link cobolTodo Todo
+hi def link cobolWatch Special
+hi def link cobolIndicator Special
+
let b:current_syntax = "cobol"
diff --git a/runtime/syntax/coco.vim b/runtime/syntax/coco.vim
index 4094a55303..ae32348bcb 100644
--- a/runtime/syntax/coco.vim
+++ b/runtime/syntax/coco.vim
@@ -5,9 +5,8 @@
" Remark: Coco/R syntax partially implemented.
" License: Vim license
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/config.vim b/runtime/syntax/config.vim
index cd83b24352..3636ed4130 100644
--- a/runtime/syntax/config.vim
+++ b/runtime/syntax/config.vim
@@ -1,9 +1,10 @@
" Vim syntax file
" Language: configure.in script: M4 with sh
-" Maintainer: Christian Hammesr <ch@lathspell.westend.com>
-" Last Change: 2015 Jan 14
+" Former Maintainer: Christian Hammesr <ch@lathspell.westend.com>
+" Last Change: 2018 Feb 03
" (patch from Yngve Inntjore Levinsen to detect AC_MSG)
" (patch from Khym Chanur to add @Spell)
+" (patch from James McCoy to fix paren matching)
" Well, I actually even do not know much about m4. This explains why there
" is probably very much missing here, yet !
@@ -11,11 +12,8 @@
" script, so I wrote this quick and dirty patch.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -33,32 +31,23 @@ syn keyword configspecial cat rm eval
syn region configstring start=+\z(["'`]\)+ skip=+\\\z1+ end=+\z1+ contains=@Spell
" Anything inside AC_MSG_TYPE([...]) and AC_MSG_TYPE(...) is a string.
-syn region configstring matchgroup=configfunction start="AC_MSG_[A-Z]*\ze(\[" matchgroup=configdelimiter end="\])" contains=configdelimiter,@Spell
-syn region configstring matchgroup=configfunction start="AC_MSG_[A-Z]*\ze([^[]" matchgroup=configdelimiter end=")" contains=configdelimiter,@Spell
+syn region configmsg matchgroup=configfunction start="AC_MSG_[A-Z]*\ze(\[" matchgroup=configdelimiter end="\])" contains=configdelimiter,@Spell
+syn region configmsg matchgroup=configfunction start="AC_MSG_[A-Z]*\ze([^[]" matchgroup=configdelimiter end=")" contains=configdelimiter,@Spell
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_config_syntax_inits")
- if version < 508
- let did_config_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
+
+hi def link configdelimiter Delimiter
+hi def link configoperator Operator
+hi def link configcomment Comment
+hi def link configDnl Comment
+hi def link configfunction Function
+hi def link confignumber Number
+hi def link configkeyword Keyword
+hi def link configspecial Special
+hi def link configstring String
+hi def link configmsg String
- HiLink configdelimiter Delimiter
- HiLink configoperator Operator
- HiLink configcomment Comment
- HiLink configDnl Comment
- HiLink configfunction Function
- HiLink confignumber Number
- HiLink configkeyword Keyword
- HiLink configspecial Special
- HiLink configstring String
-
- delcommand HiLink
-endif
let b:current_syntax = "config"
diff --git a/runtime/syntax/context.vim b/runtime/syntax/context.vim
index 225cc6efc2..b29f256baa 100644
--- a/runtime/syntax/context.vim
+++ b/runtime/syntax/context.vim
@@ -1,7 +1,8 @@
" Vim syntax file
-" Language: ConTeXt typesetting engine
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-08-10
+" Language: ConTeXt typesetting engine
+" Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+" Former Maintainers: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2016 Oct 16
if exists("b:current_syntax")
finish
@@ -13,65 +14,93 @@ unlet b:current_syntax
let s:cpo_save = &cpo
set cpo&vim
-if !exists('g:context_include')
- let g:context_include = ['mp', 'javascript', 'xml']
+" Dictionary of (filetype, group) pairs to highlight between \startGROUP \stopGROUP.
+let s:context_include = get(b:, 'context_include', get(g:, 'context_include', {'xml': 'XML'}))
+
+" For backward compatibility (g:context_include used to be a List)
+if type(s:context_include) ==# type([])
+ let g:context_metapost = (index(s:context_include, 'mp') != -1)
+ let s:context_include = filter(
+ \ {'c': 'C', 'javascript': 'JS', 'ruby': 'Ruby', 'xml': 'XML'},
+ \ { k,_ -> index(s:context_include, k) != -1 }
+ \ )
endif
+syn iskeyword @,48-57,a-z,A-Z,192-255
+
syn spell toplevel
-syn match contextBlockDelim display '\\\%(start\|stop\)\a\+'
- \ contains=@NoSpell
+" ConTeXt options, i.e., [...] blocks
+syn region contextOptions matchgroup=contextDelimiter start='\[' end=']\|\ze\\stop' skip='\\\[\|\\\]' contains=ALLBUT,contextBeginEndLua,@Spell
+
+" Highlight braces
+syn match contextDelimiter '[{}]'
-syn region contextEscaped display matchgroup=contextPreProc
- \ start='\\type\z(\A\)' end='\z1'
-syn region contextEscaped display matchgroup=contextPreProc
- \ start='\\type\={' end='}'
-syn region contextEscaped display matchgroup=contextPreProc
- \ start='\\type\=<<' end='>>'
+" Comments
+syn match contextComment '\\\@<!\%(\\\\\)*\zs%.*$' display contains=initexTodo
+syn match contextComment '^\s*%[CDM].*$' display contains=initexTodo
+
+syn match contextBlockDelim '\\\%(start\|stop\)\a\+' contains=@NoSpell
+
+syn region contextEscaped matchgroup=contextPreProc start='\\type\%(\s*\|\n\)*\z([^A-Za-z%]\)' end='\z1'
+syn region contextEscaped matchgroup=contextPreProc start='\\type\=\%(\s\|\n\)*{' end='}'
+syn region contextEscaped matchgroup=contextPreProc start='\\type\=\%(\s*\|\n\)*<<' end='>>'
syn region contextEscaped matchgroup=contextPreProc
\ start='\\start\z(\a*\%(typing\|typen\)\)'
\ end='\\stop\z1' contains=plaintexComment keepend
-syn region contextEscaped display matchgroup=contextPreProc
- \ start='\\\h\+Type{' end='}'
-syn region contextEscaped display matchgroup=contextPreProc
- \ start='\\Typed\h\+{' end='}'
+syn region contextEscaped matchgroup=contextPreProc start='\\\h\+Type\%(\s\|\n\)*{' end='}'
+syn region contextEscaped matchgroup=contextPreProc start='\\Typed\h\+\%(\s\|\n\)*{' end='}'
syn match contextBuiltin display contains=@NoSpell
- \ '\\\%(unprotect\|protect\|unexpanded\)'
+ \ '\\\%(unprotect\|protect\|unexpanded\)\>'
-syn match contextPreProc '^\s*\\\%(start\|stop\)\=\%(component\|environment\|project\|product\).*$'
+syn match contextPreProc '^\s*\\\%(start\|stop\)\=\%(component\|environment\|project\|product\)\>'
\ contains=@NoSpell
-if index(g:context_include, 'mp') != -1
+if get(b:, 'context_metapost', get(g:, 'context_metapost', 1))
+ let b:mp_metafun_macros = 1 " Highlight MetaFun keywords
syn include @mpTop syntax/mp.vim
unlet b:current_syntax
- syn region contextMPGraphic transparent matchgroup=contextBlockDelim
- \ start='\\start\z(\a*MPgraphic\|MP\%(page\|inclusions\|run\)\).*'
+ syn region contextMPGraphic matchgroup=contextBlockDelim
+ \ start='\\start\z(MP\%(clip\|code\|definitions\|drawing\|environment\|extensions\|inclusions\|initializations\|page\|\)\)\>.*$'
+ \ end='\\stop\z1'
+ \ contains=@mpTop,@NoSpell
+ syn region contextMPGraphic matchgroup=contextBlockDelim
+ \ start='\\start\z(\%(\%[re]usable\|use\|unique\|static\)MPgraphic\|staticMPfigure\|uniqueMPpagegraphic\)\>.*$'
\ end='\\stop\z1'
- \ contains=@mpTop
+ \ contains=@mpTop,@NoSpell
endif
-" TODO: also need to implement this for \\typeC or something along those
-" lines.
-function! s:include_syntax(name, group)
- if index(g:context_include, a:name) != -1
- execute 'syn include @' . a:name . 'Top' 'syntax/' . a:name . '.vim'
- unlet b:current_syntax
- execute 'syn region context' . a:group . 'Code'
- \ 'transparent matchgroup=contextBlockDelim'
- \ 'start=+\\start' . a:group . '+ end=+\\stop' . a:group . '+'
- \ 'contains=@' . a:name . 'Top'
- endif
-endfunction
-
-call s:include_syntax('c', 'C')
-call s:include_syntax('ruby', 'Ruby')
-call s:include_syntax('javascript', 'JS')
-call s:include_syntax('xml', 'XML')
-
-syn match contextSectioning '\\chapter\>' contains=@NoSpell
-syn match contextSectioning '\\\%(sub\)*section\>' contains=@NoSpell
+if get(b:, 'context_lua', get(g:, 'context_lua', 1))
+ syn include @luaTop syntax/lua.vim
+ unlet b:current_syntax
+
+ syn region contextLuaCode matchgroup=contextBlockDelim
+ \ start='\\startluacode\>'
+ \ end='\\stopluacode\>' keepend
+ \ contains=@luaTop,@NoSpell
+
+ syn match contextDirectLua "\\\%(directlua\|ctxlua\)\>\%(\s*%.*$\)\="
+ \ nextgroup=contextBeginEndLua skipwhite skipempty
+ \ contains=initexComment
+ syn region contextBeginEndLua matchgroup=contextSpecial
+ \ start="{" end="}" skip="\\[{}]"
+ \ contained contains=@luaTop,@NoSpell
+endif
+
+for synname in keys(s:context_include)
+ execute 'syn include @' . synname . 'Top' 'syntax/' . synname . '.vim'
+ unlet b:current_syntax
+ execute 'syn region context' . s:context_include[synname] . 'Code'
+ \ 'matchgroup=contextBlockDelim'
+ \ 'start=+\\start' . s:context_include[synname] . '+'
+ \ 'end=+\\stop' . s:context_include[synname] . '+'
+ \ 'contains=@' . synname . 'Top,@NoSpell'
+endfor
+
+syn match contextSectioning '\\\%(start\|stop\)\=\%(\%(sub\)*section\|\%(sub\)*subject\|chapter\|part\|component\|product\|title\)\>'
+ \ contains=@NoSpell
syn match contextSpecial '\\crlf\>\|\\par\>\|-\{2,3}\||[<>/]\=|'
\ contains=@NoSpell
@@ -92,15 +121,19 @@ syn match contextFont '\\\%(vi\{1,3}\|ix\|xi\{0,2}\)\>'
syn match contextFont '\\\%(tf\|b[si]\|s[cl]\|os\)\%(xx\|[xabcd]\)\=\>'
\ contains=@NoSpell
+hi def link contextOptions Typedef
+hi def link contextComment Comment
hi def link contextBlockDelim Keyword
hi def link contextBuiltin Keyword
hi def link contextDelimiter Delimiter
+hi def link contextEscaped String
hi def link contextPreProc PreProc
hi def link contextSectioning PreProc
hi def link contextSpecial Special
hi def link contextType Type
hi def link contextStyle contextType
hi def link contextFont contextType
+hi def link contextDirectLua Keyword
let b:current_syntax = "context"
diff --git a/runtime/syntax/cpp.vim b/runtime/syntax/cpp.vim
index c7a68388be..9cb0860e84 100644
--- a/runtime/syntax/cpp.vim
+++ b/runtime/syntax/cpp.vim
@@ -2,23 +2,16 @@
" Language: C++
" Current Maintainer: vim-jp (https://github.com/vim-jp/vim-cpp)
" Previous Maintainer: Ken Shan <ccshan@post.harvard.edu>
-" Last Change: 2015 Nov 10
+" Last Change: 2017 Jun 05
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" Read the C syntax to start with
-if version < 600
- so <sfile>:p:h/c.vim
-else
- runtime! syntax/c.vim
- unlet b:current_syntax
-endif
+runtime! syntax/c.vim
+unlet b:current_syntax
" C++ extensions
syn keyword cppStatement new delete this friend using
@@ -38,7 +31,7 @@ syn keyword cppConstant __cplusplus
" C++ 11 extensions
if !exists("cpp_no_cpp11")
syn keyword cppModifier override final
- syn keyword cppType nullptr_t
+ syn keyword cppType nullptr_t auto
syn keyword cppExceptions noexcept
syn keyword cppStorageClass constexpr decltype thread_local
syn keyword cppConstant nullptr
@@ -53,35 +46,31 @@ endif
" C++ 14 extensions
if !exists("cpp_no_cpp14")
- syn match cppNumber display "\<0b[01]\+\(u\=l\{0,2}\|ll\=u\)\>"
+ syn case ignore
+ syn match cppNumber display "\<0b[01]\('\=[01]\+\)*\(u\=l\{0,2}\|ll\=u\)\>"
+ syn match cppNumber display "\<[1-9]\('\=\d\+\)*\(u\=l\{0,2}\|ll\=u\)\>" contains=cFloat
+ syn match cppNumber display "\<0x\x\('\=\x\+\)*\(u\=l\{0,2}\|ll\=u\)\>"
+ syn case match
endif
" The minimum and maximum operators in GNU C++
syn match cppMinMax "[<>]?"
" Default highlighting
-if version >= 508 || !exists("did_cpp_syntax_inits")
- if version < 508
- let did_cpp_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink cppAccess cppStatement
- HiLink cppCast cppStatement
- HiLink cppExceptions Exception
- HiLink cppOperator Operator
- HiLink cppStatement Statement
- HiLink cppModifier Type
- HiLink cppType Type
- HiLink cppStorageClass StorageClass
- HiLink cppStructure Structure
- HiLink cppBoolean Boolean
- HiLink cppConstant Constant
- HiLink cppRawStringDelimiter Delimiter
- HiLink cppRawString String
- delcommand HiLink
-endif
+hi def link cppAccess cppStatement
+hi def link cppCast cppStatement
+hi def link cppExceptions Exception
+hi def link cppOperator Operator
+hi def link cppStatement Statement
+hi def link cppModifier Type
+hi def link cppType Type
+hi def link cppStorageClass StorageClass
+hi def link cppStructure Structure
+hi def link cppBoolean Boolean
+hi def link cppConstant Constant
+hi def link cppRawStringDelimiter Delimiter
+hi def link cppRawString String
+hi def link cppNumber Number
let b:current_syntax = "cpp"
diff --git a/runtime/syntax/crm.vim b/runtime/syntax/crm.vim
index 17b67d44f0..5285de3e23 100644
--- a/runtime/syntax/crm.vim
+++ b/runtime/syntax/crm.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: CRM114
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: CRM114
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/crontab.vim b/runtime/syntax/crontab.vim
index fd1c30023f..5e38ffaafe 100644
--- a/runtime/syntax/crontab.vim
+++ b/runtime/syntax/crontab.vim
@@ -10,11 +10,8 @@
" crontab line format:
" Minutes Hours Days Months Days_of_Week Commands # comments
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -39,41 +36,31 @@ syntax match crontabCmnt "^\s*#.*" contains=@Spell
syntax match crontabPercent "[^\\]%.*"lc=1 contained
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_crontab_syn_inits")
- if version < 508
- let did_crontab_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink crontabMin Number
- HiLink crontabHr PreProc
- HiLink crontabDay Type
-
- HiLink crontabMnth Number
- HiLink crontabMnth12 Number
- HiLink crontabMnthS Number
- HiLink crontabMnthN Number
-
- HiLink crontabDow PreProc
- HiLink crontabDow7 PreProc
- HiLink crontabDowS PreProc
- HiLink crontabDowN PreProc
-
- HiLink crontabNick Special
- HiLink crontabVar Identifier
- HiLink crontabPercent Special
+" Only when an item doesn't have highlighting yet
+
+hi def link crontabMin Number
+hi def link crontabHr PreProc
+hi def link crontabDay Type
+
+hi def link crontabMnth Number
+hi def link crontabMnth12 Number
+hi def link crontabMnthS Number
+hi def link crontabMnthN Number
+
+hi def link crontabDow PreProc
+hi def link crontabDow7 PreProc
+hi def link crontabDowS PreProc
+hi def link crontabDowN PreProc
+
+hi def link crontabNick Special
+hi def link crontabVar Identifier
+hi def link crontabPercent Special
" comment out next line for to suppress unix commands coloring.
- HiLink crontabCmd Statement
+hi def link crontabCmd Statement
- HiLink crontabCmnt Comment
+hi def link crontabCmnt Comment
- delcommand HiLink
-endif
let b:current_syntax = "crontab"
diff --git a/runtime/syntax/cs.vim b/runtime/syntax/cs.vim
index 0443a1ff3d..116afe0b72 100644
--- a/runtime/syntax/cs.vim
+++ b/runtime/syntax/cs.vim
@@ -1,10 +1,12 @@
" Vim syntax file
-" Language: C#
-" Maintainer: Anduin Withers <awithers@anduin.com>
-" Former Maintainer: Johannes Zellner <johannes@zellner.org>
-" Last Change: Fri Aug 14 13:56:37 PDT 2009
-" Filenames: *.cs
-" $Id: cs.vim,v 1.4 2006/05/03 21:20:02 vimboss Exp $
+" Language: C#
+" Maintainer: Nick Jensen <nickspoon@gmail.com>
+" Former Maintainers: Anduin Withers <awithers@anduin.com>
+" Johannes Zellner <johannes@zellner.org>
+" Last Change: 2018-06-29
+" Filenames: *.cs
+" License: Vim (see :h license)
+" Repository: https://github.com/nickspoons/vim-cs
"
" REFERENCES:
" [1] ECMA TC39: C# Language Specification (WD13Oct01.doc)
@@ -17,136 +19,190 @@ let s:cs_cpo_save = &cpo
set cpo&vim
-" type
-syn keyword csType bool byte char decimal double float int long object sbyte short string uint ulong ushort void
-" storage
-syn keyword csStorage class delegate enum interface namespace struct
-" repeat / condition / label
-syn keyword csRepeat break continue do for foreach goto return while
-syn keyword csConditional else if switch
-syn keyword csLabel case default
+syn keyword csType bool byte char decimal double float int long object sbyte short string T uint ulong ushort var void dynamic
+syn keyword csStorage delegate enum interface namespace struct
+syn keyword csRepeat break continue do for foreach goto return while
+syn keyword csConditional else if switch
+syn keyword csLabel case default
+syn match csOperatorError display +::+
+syn match csGlobal display +global::+
" user labels (see [1] 8.6 Statements)
-syn match csLabel display +^\s*\I\i*\s*:\([^:]\)\@=+
-" modifier
-syn keyword csModifier abstract const extern internal override private protected public readonly sealed static virtual volatile
-" constant
-syn keyword csConstant false null true
-" exception
-syn keyword csException try catch finally throw
-
-" TODO:
-syn keyword csUnspecifiedStatement as base checked event fixed in is lock new operator out params ref sizeof stackalloc this typeof unchecked unsafe using
-" TODO:
-syn keyword csUnsupportedStatement add remove value
-" TODO:
-syn keyword csUnspecifiedKeyword explicit implicit
+syn match csLabel display +^\s*\I\i*\s*:\([^:]\)\@=+
+syn keyword csModifier abstract const extern internal override private protected public readonly sealed static virtual volatile
+syn keyword csConstant false null true
+syn keyword csException try catch finally throw when
+syn keyword csLinq ascending by descending equals from group in into join let on orderby select where
+syn keyword csAsync async await
+syn keyword csUnspecifiedStatement as base checked event fixed in is lock nameof operator out params ref sizeof stackalloc this typeof unchecked unsafe using
+syn keyword csUnsupportedStatement add remove value
+syn keyword csUnspecifiedKeyword explicit implicit
" Contextual Keywords
-syn match csContextualStatement /\<yield[[:space:]\n]\+\(return\|break\)/me=s+5
-syn match csContextualStatement /\<partial[[:space:]\n]\+\(class\|struct\|interface\)/me=s+7
-syn match csContextualStatement /\<\(get\|set\)[[:space:]\n]*{/me=s+3
-syn match csContextualStatement /\<where\>[^:]\+:/me=s+5
+syn match csContextualStatement /\<yield[[:space:]\n]\+\(return\|break\)/me=s+5
+syn match csContextualStatement /\<partial[[:space:]\n]\+\(class\|struct\|interface\)/me=s+7
+syn match csContextualStatement /\<\(get\|set\)\(;\|[[:space:]\n]*{\)/me=s+3
+syn match csContextualStatement /\<where\>[^:]\+:/me=s+5
+
+" Punctuation
+syn match csBraces "[{}\[\]]" display
+syn match csParens "[()]" display
+syn match csOpSymbols "[+\-><=]\{1,2}" display
+syn match csOpSymbols "[!><+\-*/]=" display
+syn match csOpSymbols "[!*/^]" display
+syn match csOpSymbols "=>" display
+syn match csEndColon ";" display
+syn match csLogicSymbols "&&" display
+syn match csLogicSymbols "||" display
+syn match csLogicSymbols "?" display
+syn match csLogicSymbols ":" display
" Comments
"
" PROVIDES: @csCommentHook
-"
-" TODO: include strings ?
-"
-syn keyword csTodo contained TODO FIXME XXX NOTE
-syn region csComment start="/\*" end="\*/" contains=@csCommentHook,csTodo,@Spell
-syn match csComment "//.*$" contains=@csCommentHook,csTodo,@Spell
+syn keyword csTodo contained TODO FIXME XXX NOTE HACK TBD
+syn region csComment start="/\*" end="\*/" contains=@csCommentHook,csTodo,@Spell
+syn match csComment "//.*$" contains=@csCommentHook,csTodo,@Spell
" xml markup inside '///' comments
-syn cluster xmlRegionHook add=csXmlCommentLeader
-syn cluster xmlCdataHook add=csXmlCommentLeader
-syn cluster xmlStartTagHook add=csXmlCommentLeader
-syn keyword csXmlTag contained Libraries Packages Types Excluded ExcludedTypeName ExcludedLibraryName
-syn keyword csXmlTag contained ExcludedBucketName TypeExcluded Type TypeKind TypeSignature AssemblyInfo
-syn keyword csXmlTag contained AssemblyName AssemblyPublicKey AssemblyVersion AssemblyCulture Base
-syn keyword csXmlTag contained BaseTypeName Interfaces Interface InterfaceName Attributes Attribute
-syn keyword csXmlTag contained AttributeName Members Member MemberSignature MemberType MemberValue
-syn keyword csXmlTag contained ReturnValue ReturnType Parameters Parameter MemberOfPackage
-syn keyword csXmlTag contained ThreadingSafetyStatement Docs devdoc example overload remarks returns summary
-syn keyword csXmlTag contained threadsafe value internalonly nodoc exception param permission platnote
-syn keyword csXmlTag contained seealso b c i pre sub sup block code note paramref see subscript superscript
-syn keyword csXmlTag contained list listheader item term description altcompliant altmember
+syn cluster xmlRegionHook add=csXmlCommentLeader
+syn cluster xmlCdataHook add=csXmlCommentLeader
+syn cluster xmlStartTagHook add=csXmlCommentLeader
+syn keyword csXmlTag contained Libraries Packages Types Excluded ExcludedTypeName ExcludedLibraryName
+syn keyword csXmlTag contained ExcludedBucketName TypeExcluded Type TypeKind TypeSignature AssemblyInfo
+syn keyword csXmlTag contained AssemblyName AssemblyPublicKey AssemblyVersion AssemblyCulture Base
+syn keyword csXmlTag contained BaseTypeName Interfaces Interface InterfaceName Attributes Attribute
+syn keyword csXmlTag contained AttributeName Members Member MemberSignature MemberType MemberValue
+syn keyword csXmlTag contained ReturnValue ReturnType Parameters Parameter MemberOfPackage
+syn keyword csXmlTag contained ThreadingSafetyStatement Docs devdoc example overload remarks returns summary
+syn keyword csXmlTag contained threadsafe value internalonly nodoc exception param permission platnote
+syn keyword csXmlTag contained seealso b c i pre sub sup block code note paramref see subscript superscript
+syn keyword csXmlTag contained list listheader item term description altcompliant altmember
syn cluster xmlTagHook add=csXmlTag
-syn match csXmlCommentLeader +\/\/\/+ contained
-syn match csXmlComment +\/\/\/.*$+ contains=csXmlCommentLeader,@csXml,@Spell
-syntax include @csXml syntax/xml.vim
-hi def link xmlRegion Comment
+syn match csXmlCommentLeader +\/\/\/+ contained
+syn match csXmlComment +\/\/\/.*$+ contains=csXmlCommentLeader,@csXml,@Spell
+syn include @csXml syntax/xml.vim
+hi def link xmlRegion Comment
" [1] 9.5 Pre-processing directives
-syn region csPreCondit
- \ start="^\s*#\s*\(define\|undef\|if\|elif\|else\|endif\|line\|error\|warning\)"
- \ skip="\\$" end="$" contains=csComment keepend
-syn region csRegion matchgroup=csPreCondit start="^\s*#\s*region.*$"
- \ end="^\s*#\s*endregion" transparent fold contains=TOP
+syn region csPreCondit start="^\s*#\s*\(define\|undef\|if\|elif\|else\|endif\|line\|error\|warning\)" skip="\\$" end="$" contains=csComment keepend
+syn region csRegion matchgroup=csPreCondit start="^\s*#\s*region.*$" end="^\s*#\s*endregion" transparent fold contains=TOP
+syn region csSummary start="^\s*/// <summary" end="^\%\(\s*///\)\@!" transparent fold keepend
+syn region csClassType start="@\@1<!\<class\>"hs=s+6 end="[:\n{]"me=e-1 contains=csClass
+syn region csNewType start="@\@1<!\<new\>"hs=s+4 end="[;\n{(<\[]"me=e-1 contains=csNew contains=csNewType
+syn region csIsType start=" is "hs=s+4 end="[A-Za-z0-9]\+" oneline contains=csIsAs
+syn region csIsType start=" as "hs=s+4 end="[A-Za-z0-9]\+" oneline contains=csIsAs
+syn keyword csNew new contained
+syn keyword csClass class contained
+syn keyword csIsAs is as
" Strings and constants
-syn match csSpecialError contained "\\."
-syn match csSpecialCharError contained "[^']"
+syn match csSpecialError "\\." contained
+syn match csSpecialCharError "[^']" contained
" [1] 9.4.4.4 Character literals
-syn match csSpecialChar contained +\\["\\'0abfnrtvx]+
-" unicode characters
-syn match csUnicodeNumber +\\\(u\x\{4}\|U\x\{8}\)+ contained contains=csUnicodeSpecifier
-syn match csUnicodeSpecifier +\\[uU]+ contained
-syn region csVerbatimString start=+@"+ end=+"+ skip=+""+ contains=csVerbatimSpec,@Spell
-syn match csVerbatimSpec +@"+he=s+1 contained
-syn region csString start=+"+ end=+"+ end=+$+ contains=csSpecialChar,csSpecialError,csUnicodeNumber,@Spell
-syn match csCharacter "'[^']*'" contains=csSpecialChar,csSpecialCharError
-syn match csCharacter "'\\''" contains=csSpecialChar
-syn match csCharacter "'[^\\]'"
-syn match csNumber "\<\(0[0-7]*\|0[xX]\x\+\|\d\+\)[lL]\=\>"
-syn match csNumber "\(\<\d\+\.\d*\|\.\d\+\)\([eE][-+]\=\d\+\)\=[fFdD]\="
-syn match csNumber "\<\d\+[eE][-+]\=\d\+[fFdD]\=\>"
-syn match csNumber "\<\d\+\([eE][-+]\=\d\+\)\=[fFdD]\>"
+syn match csSpecialChar +\\["\\'0abfnrtvx]+ contained display
+syn match csUnicodeNumber +\\u\x\{4}+ contained contains=csUnicodeSpecifier display
+syn match csUnicodeNumber +\\U\x\{8}+ contained contains=csUnicodeSpecifier display
+syn match csUnicodeSpecifier +\\[uU]+ contained display
+
+syn region csString matchgroup=csQuote start=+"+ end=+"+ end=+$+ extend contains=csSpecialChar,csSpecialError,csUnicodeNumber,@Spell
+syn match csCharacter "'[^']*'" contains=csSpecialChar,csSpecialCharError display
+syn match csCharacter "'\\''" contains=csSpecialChar display
+syn match csCharacter "'[^\\]'" display
+syn match csNumber "\<0[0-7]*[lL]\=\>" display
+syn match csNumber "\<0[xX]\x\+[lL]\=\>" display
+syn match csNumber "\<\d\+[lL]\=\>" display
+syn match csNumber "\<\d\+\.\d*\%\([eE][-+]\=\d\+\)\=[fFdD]\=" display
+syn match csNumber "\.\d\+\%\([eE][-+]\=\d\+\)\=[fFdD]\=" display
+syn match csNumber "\<\d\+[eE][-+]\=\d\+[fFdD]\=\>" display
+syn match csNumber "\<\d\+\%\([eE][-+]\=\d\+\)\=[fFdD]\>" display
+
+syn region csInterpolatedString matchgroup=csQuote start=+\$"+ end=+"+ end=+$+ extend contains=csInterpolation,csEscapedInterpolation,csSpecialChar,csSpecialError,csUnicodeNumber,@Spell
+
+syn region csInterpolation matchgroup=csInterpolationDelimiter start=+{+ end=+}+ keepend contained contains=@csAll,csBracketed,csInterpolationAlign,csInterpolationFormat
+syn match csEscapedInterpolation "{{" transparent contains=NONE display
+syn match csEscapedInterpolation "}}" transparent contains=NONE display
+syn region csInterpolationAlign matchgroup=csInterpolationAlignDel start=+,+ end=+}+ end=+:+me=e-1 contained contains=csNumber,csConstant,csCharacter,csParens,csOpSymbols,csString,csBracketed display
+syn match csInterpolationFormat +:[^}]\+}+ contained contains=csInterpolationFormatDel display
+syn match csInterpolationAlignDel +,+ contained display
+syn match csInterpolationFormatDel +:+ contained display
+
+syn region csVerbatimString matchgroup=csQuote start=+@"+ end=+"+ skip=+""+ extend contains=csVerbatimQuote,@Spell
+syn match csVerbatimQuote +""+ contained
+syn match csQuoteError +@$"+he=s+2,me=s+2
+
+syn region csInterVerbString matchgroup=csQuote start=+\$@"+ end=+"+ skip=+""+ extend contains=csInterpolation,csEscapedInterpolation,csSpecialChar,csSpecialError,csUnicodeNumber,csVerbatimQuote,@Spell
+
+syn region csBracketed matchgroup=csParens start=+(+ end=+)+ contained transparent contains=@csAll,csBracketed
+
+syn cluster csAll contains=csCharacter,csClassType,csComment,csContextualStatement,csEndColon,csInterpolatedString,csIsType,csLabel,csLogicSymbols,csNewType,csConstant,csNumber,csOpSymbols,csOperatorError,csParens,csPreCondit,csRegion,csString,csSummary,csUnicodeNumber,csUnicodeSpecifier,csVerbatimString
" The default highlighting.
-hi def link csType Type
-hi def link csStorage StorageClass
-hi def link csRepeat Repeat
-hi def link csConditional Conditional
-hi def link csLabel Label
-hi def link csModifier StorageClass
-hi def link csConstant Constant
-hi def link csException Exception
-hi def link csUnspecifiedStatement Statement
-hi def link csUnsupportedStatement Statement
-hi def link csUnspecifiedKeyword Keyword
-hi def link csContextualStatement Statement
-hi def link csOperatorError Error
-
-hi def link csTodo Todo
-hi def link csComment Comment
-
-hi def link csSpecialError Error
-hi def link csSpecialCharError Error
-hi def link csString String
-hi def link csVerbatimString String
-hi def link csVerbatimSpec SpecialChar
-hi def link csPreCondit PreCondit
-hi def link csCharacter Character
-hi def link csSpecialChar SpecialChar
-hi def link csNumber Number
-hi def link csUnicodeNumber SpecialChar
-hi def link csUnicodeSpecifier SpecialChar
+hi def link csType Type
+hi def link csNewType Type
+hi def link csClassType Type
+hi def link csIsType Type
+hi def link csStorage StorageClass
+hi def link csClass StorageClass
+hi def link csRepeat Repeat
+hi def link csConditional Conditional
+hi def link csLabel Label
+hi def link csModifier StorageClass
+hi def link csConstant Constant
+hi def link csException Exception
+hi def link csUnspecifiedStatement Statement
+hi def link csUnsupportedStatement Statement
+hi def link csUnspecifiedKeyword Keyword
+hi def link csNew Statement
+hi def link csLinq Statement
+hi def link csIsAs Keyword
+hi def link csAsync Keyword
+hi def link csContextualStatement Statement
+hi def link csOperatorError Error
+hi def link csInterfaceDeclaration Include
+
+hi def link csTodo Todo
+hi def link csComment Comment
+
+hi def link csEndColon Statement
+hi def link csOpSymbols Operator
+hi def link csLogicSymbols Boolean
+hi def link csBraces Function
+hi def link csParens Operator
+
+hi def link csSpecialError Error
+hi def link csSpecialCharError Error
+hi def link csString String
+hi def link csQuote String
+hi def link csQuoteError Error
+hi def link csInterpolatedString String
+hi def link csVerbatimString String
+hi def link csInterVerbString String
+hi def link csVerbatimQuote SpecialChar
+hi def link csPreCondit PreCondit
+hi def link csCharacter Character
+hi def link csSpecialChar SpecialChar
+hi def link csNumber Number
+hi def link csUnicodeNumber SpecialChar
+hi def link csUnicodeSpecifier SpecialChar
+hi def link csInterpolationDelimiter Delimiter
+hi def link csInterpolationAlignDel csInterpolationDelimiter
+hi def link csInterpolationFormat csInterpolationDelimiter
+hi def link csInterpolationFormatDel csInterpolationDelimiter
" xml markup
-hi def link csXmlCommentLeader Comment
-hi def link csXmlComment Comment
-hi def link csXmlTag Statement
+hi def link csXmlCommentLeader Comment
+hi def link csXmlComment Comment
+hi def link csXmlTag Statement
let b:current_syntax = "cs"
let &cpo = s:cs_cpo_save
unlet s:cs_cpo_save
-" vim: ts=8
+" vim: vts=16,28
diff --git a/runtime/syntax/csc.vim b/runtime/syntax/csc.vim
index 5493b17f5f..6e5d8b9f37 100644
--- a/runtime/syntax/csc.vim
+++ b/runtime/syntax/csc.vim
@@ -3,11 +3,8 @@
" Maintainer: Raul Segura Acevedo <raulseguraaceved@netscape.net>
" Last change: 2011 Dec 25 by Thilo Six
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -145,7 +142,7 @@ sy match cscBPMacro contained "!"
sy match cscBPW "!\s*\a*" contains=cscBPmacro
" when wanted, highlighting lhs members or erros in asignments (may lag the editing)
-if version >= 600 && exists("csc_asignment")
+if exists("csc_asignment")
sy match cscEqError '\("[^"]*"\s*\|[^][\t !%()*+,--/:;<=>{}~]\+\s*\|->\s*\)*=\([^=]\@=\|$\)'
sy region cscFormula transparent matchgroup=cscVarName start='\("[^"]*"\|[^][\t !%()*+,--/:;<=>{}~]\+\)\s*=\([^=]\@=\|\n\)' skip='"[^"]*"' end=';' contains=ALLBUT,cscFormula,cscFormulaIn,cscBPMacro,cscCondition
sy region cscFormulaIn matchgroup=cscVarName transparent start='\("[^"]*"\|[^][\t !%()*+,--/:;<=>{}~]\+\)\(->\("[^"]*"\|[^][\t !%()*+,--/:;<=>{}~]\+\)\)*\s*=\([^=]\@=\|$\)' skip='"[^"]*"' end=';' contains=ALLBUT,cscFormula,cscFormulaIn,cscBPMacro,cscCondition contained
@@ -158,44 +155,34 @@ endif
exec "sy sync ccomment cscComment minlines=" . csc_minlines
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_csc_syntax_inits")
- if version < 508
- let did_csc_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
+
+hi cscVarName term=bold ctermfg=9 gui=bold guifg=blue
+
+hi def link cscNumber Number
+hi def link cscOctal Number
+hi def link cscFloat Float
+hi def link cscParenE Error
+hi def link cscCommentE Error
+hi def link cscSpaceE Error
+hi def link cscError Error
+hi def link cscString String
+hi def link cscComment Comment
+hi def link cscTodo Todo
+hi def link cscStatement Statement
+hi def link cscIfError Error
+hi def link cscEqError Error
+hi def link cscFunction Statement
+hi def link cscCondition Statement
+hi def link cscWarn WarningMsg
+
+hi def link cscComE Error
+hi def link cscCom Statement
+hi def link cscComW WarningMsg
+
+hi def link cscBPMacro Identifier
+hi def link cscBPW WarningMsg
- hi cscVarName term=bold ctermfg=9 gui=bold guifg=blue
-
- HiLink cscNumber Number
- HiLink cscOctal Number
- HiLink cscFloat Float
- HiLink cscParenE Error
- HiLink cscCommentE Error
- HiLink cscSpaceE Error
- HiLink cscError Error
- HiLink cscString String
- HiLink cscComment Comment
- HiLink cscTodo Todo
- HiLink cscStatement Statement
- HiLink cscIfError Error
- HiLink cscEqError Error
- HiLink cscFunction Statement
- HiLink cscCondition Statement
- HiLink cscWarn WarningMsg
-
- HiLink cscComE Error
- HiLink cscCom Statement
- HiLink cscComW WarningMsg
-
- HiLink cscBPMacro Identifier
- HiLink cscBPW WarningMsg
-
- delcommand HiLink
-endif
let b:current_syntax = "csc"
diff --git a/runtime/syntax/csh.vim b/runtime/syntax/csh.vim
index 9dc2c4ef56..c134aa7ef3 100644
--- a/runtime/syntax/csh.vim
+++ b/runtime/syntax/csh.vim
@@ -1,15 +1,12 @@
" Vim syntax file
" Language: C-shell (csh)
" Maintainer: Charles E. Campbell <NdrOchipS@PcampbellAfamily.Mbiz>
-" Last Change: Oct 23, 2014
-" Version: 11
+" Last Change: Aug 31, 2016
+" Version: 13
" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_CSH
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -100,59 +97,45 @@ syn match cshNumber "-\=\<\d\+\>"
"syn match cshIdentifier "\<[a-zA-Z._][a-zA-Z0-9._]*\>"
" Shell Input Redirection (Here Documents)
-if version < 600
- syn region cshHereDoc matchgroup=cshRedir start="<<-\=\s*\**END[a-zA-Z_0-9]*\**" matchgroup=cshRedir end="^END[a-zA-Z_0-9]*$"
- syn region cshHereDoc matchgroup=cshRedir start="<<-\=\s*\**EOF\**" matchgroup=cshRedir end="^EOF$"
-else
- syn region cshHereDoc matchgroup=cshRedir start="<<-\=\s*\**\z(\h\w*\)\**" matchgroup=cshRedir end="^\z1$"
-endif
+syn region cshHereDoc matchgroup=cshRedir start="<<-\=\s*\**\z(\h\w*\)\**" matchgroup=cshRedir end="^\z1$"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_csh_syntax_inits")
- if version < 508
- let did_csh_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink cshArgv cshVariables
- HiLink cshBckQuote cshCommand
- HiLink cshDblQuote cshString
- HiLink cshExtVar cshVariables
- HiLink cshHereDoc cshString
- HiLink cshNoEndlineBQ cshNoEndline
- HiLink cshNoEndlineDQ cshNoEndline
- HiLink cshNoEndlineSQ cshNoEndline
- HiLink cshQtyWord cshVariables
- HiLink cshRedir cshOperator
- HiLink cshSelector cshVariables
- HiLink cshSetStmt cshStatement
- HiLink cshSetVariables cshVariables
- HiLink cshSnglQuote cshString
- HiLink cshSubst cshVariables
-
- HiLink cshCommand Statement
- HiLink cshComment Comment
- HiLink cshConditional Conditional
- HiLink cshIdentifier Error
- HiLink cshModifier Special
- HiLink cshNoEndline Error
- HiLink cshNumber Number
- HiLink cshOperator Operator
- HiLink cshRedir Statement
- HiLink cshRepeat Repeat
- HiLink cshShellVariables Special
- HiLink cshSpecial Special
- HiLink cshStatement Statement
- HiLink cshString String
- HiLink cshSubstError Error
- HiLink cshTodo Todo
- HiLink cshVariables Type
-
- delcommand HiLink
+if !exists("skip_csh_syntax_inits")
+
+ hi def link cshArgv cshVariables
+ hi def link cshBckQuote cshCommand
+ hi def link cshDblQuote cshString
+ hi def link cshExtVar cshVariables
+ hi def link cshHereDoc cshString
+ hi def link cshNoEndlineBQ cshNoEndline
+ hi def link cshNoEndlineDQ cshNoEndline
+ hi def link cshNoEndlineSQ cshNoEndline
+ hi def link cshQtyWord cshVariables
+ hi def link cshRedir cshOperator
+ hi def link cshSelector cshVariables
+ hi def link cshSetStmt cshStatement
+ hi def link cshSetVariables cshVariables
+ hi def link cshSnglQuote cshString
+ hi def link cshSubst cshVariables
+
+ hi def link cshCommand Statement
+ hi def link cshComment Comment
+ hi def link cshConditional Conditional
+ hi def link cshIdentifier Error
+ hi def link cshModifier Special
+ hi def link cshNoEndline Error
+ hi def link cshNumber Number
+ hi def link cshOperator Operator
+ hi def link cshRedir Statement
+ hi def link cshRepeat Repeat
+ hi def link cshShellVariables Special
+ hi def link cshSpecial Special
+ hi def link cshStatement Statement
+ hi def link cshString String
+ hi def link cshSubstError Error
+ hi def link cshTodo Todo
+ hi def link cshVariables Type
+
endif
let b:current_syntax = "csh"
diff --git a/runtime/syntax/csp.vim b/runtime/syntax/csp.vim
index bd6213efd9..8001b1fe7e 100644
--- a/runtime/syntax/csp.vim
+++ b/runtime/syntax/csp.vim
@@ -15,11 +15,8 @@
" - The additional syntax for the RT-Tester (pseudo-comments)
" should be optional.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -149,46 +146,36 @@ syn match cspSdlRttComment "pragma\s\+SDL_MATCH\s\+" nextgroup=cspRttPragmaSdlAr
syn sync lines=250
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_csp_syn_inits")
- if version < 508
- let did_csp_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default methods for highlighting. Can be overridden later
- " (For vim version <=5.7, the command groups are defined in
- " $VIMRUNTIME/syntax/synload.vim )
- HiLink cspComment Comment
- HiLink cspNumber Number
- HiLink cspConditional Conditional
- HiLink cspOperator Delimiter
- HiLink cspKeyword Keyword
- HiLink cspReserved SpecialChar
- HiLink cspInclude Error
- HiLink cspIncludeKeyword Include
- HiLink cspIncludeArg Include
- HiLink cspAssert PreCondit
- HiLink cspType Type
- HiLink cspProcess Function
- HiLink cspTodo Todo
- HiLink cspOldRttComment Define
- HiLink cspRttPragmaKeyword Define
- HiLink cspSdlRttComment Define
- HiLink cspRttPragmaArg Define
- HiLink cspRttPragmaSdlArg Define
- HiLink cspRttPragmaSdlName Default
- HiLink cspRttPragmaSdlTailArg Define
- HiLink cspRttPragmaSdlTransName Default
- HiLink cspRttPragmaSdlTransTailArg Define
- HiLink cspReservedIdentifier Error
- " (Currently unused vim method: Debug)
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+" The default methods for highlighting. Can be overridden later
+" (For vim version <=5.7, the command groups are defined in
+" $VIMRUNTIME/syntax/synload.vim )
+hi def link cspComment Comment
+hi def link cspNumber Number
+hi def link cspConditional Conditional
+hi def link cspOperator Delimiter
+hi def link cspKeyword Keyword
+hi def link cspReserved SpecialChar
+hi def link cspInclude Error
+hi def link cspIncludeKeyword Include
+hi def link cspIncludeArg Include
+hi def link cspAssert PreCondit
+hi def link cspType Type
+hi def link cspProcess Function
+hi def link cspTodo Todo
+hi def link cspOldRttComment Define
+hi def link cspRttPragmaKeyword Define
+hi def link cspSdlRttComment Define
+hi def link cspRttPragmaArg Define
+hi def link cspRttPragmaSdlArg Define
+hi def link cspRttPragmaSdlName Default
+hi def link cspRttPragmaSdlTailArg Define
+hi def link cspRttPragmaSdlTransName Default
+hi def link cspRttPragmaSdlTransTailArg Define
+hi def link cspReservedIdentifier Error
+" (Currently unused vim method: Debug)
+
let b:current_syntax = "csp"
diff --git a/runtime/syntax/css.vim b/runtime/syntax/css.vim
index 51758ca98f..ecdbc1795c 100644
--- a/runtime/syntax/css.vim
+++ b/runtime/syntax/css.vim
@@ -4,16 +4,14 @@
" Claudio Fleiner <claudio@fleiner.com> (Maintainer)
" Yeti (Add full CSS2, HTML4 support)
" Nikolai Weibull (Add CSS2 support)
-" Maintainer: Jules Wang <w.jq0722@gmail.com>
" URL: https://github.com/JulesWang/css.vim
-" Last Change: 2015 Apr.17
+" Maintainer: Jules Wang <w.jq0722@gmail.com>
+" Last Change: 2018 Feb. 27
+" cssClassName updated by Ryuichi Hayashida Jan 2016
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
+" quit when a syntax file was already loaded
if !exists("main_syntax")
- if version < 600
- syntax clear
- elseif exists("b:current_syntax")
+ if exists("b:current_syntax")
finish
endif
let main_syntax = 'css'
@@ -59,7 +57,7 @@ syn match cssSelectorOp2 "[~|^$*]\?=" contained
syn region cssAttributeSelector matchgroup=cssSelectorOp start="\[" end="]" contains=cssUnicodeEscape,cssSelectorOp2,cssStringQ,cssStringQQ
" .class and #id
-syn match cssClassName "\.[A-Za-z][A-Za-z0-9_-]\+" contains=cssClassNameDot
+syn match cssClassName "\.-\=[A-Za-z_][A-Za-z0-9_-]*" contains=cssClassNameDot
syn match cssClassNameDot contained '\.'
try
@@ -71,74 +69,12 @@ endtry
" digits
syn match cssValueInteger contained "[-+]\=\d\+" contains=cssUnitDecorators
syn match cssValueNumber contained "[-+]\=\d\+\(\.\d*\)\=" contains=cssUnitDecorators
-syn match cssValueLength contained "[-+]\=\d\+\(\.\d*\)\=\(%\|mm\|cm\|in\|pt\|pc\|em\|ex\|px\|rem\|dpi\|dppx\|dpcm\)\>" contains=cssUnitDecorators
+syn match cssValueLength contained "[-+]\=\d\+\(\.\d*\)\=\(mm\|cm\|in\|pt\|pc\|em\|ex\|px\|rem\|dpi\|dppx\|dpcm\)\>" contains=cssUnitDecorators
+syn match cssValueLength contained "[-+]\=\d\+\(\.\d*\)\=%" contains=cssUnitDecorators
syn match cssValueAngle contained "[-+]\=\d\+\(\.\d*\)\=\(deg\|grad\|rad\)\>" contains=cssUnitDecorators
syn match cssValueTime contained "+\=\d\+\(\.\d*\)\=\(ms\|s\)\>" contains=cssUnitDecorators
syn match cssValueFrequency contained "+\=\d\+\(\.\d*\)\=\(Hz\|kHz\)\>" contains=cssUnitDecorators
-
-syn match cssIncludeKeyword /@\(-[a-z]\+-\)\=\(media\|keyframes\|import\|charset\|namespace\|page\)/ contained
-" @media
-syn region cssInclude start=/@media\>/ end=/\ze{/ skipwhite skipnl contains=cssMediaProp,cssValueLength,cssMediaKeyword,cssValueInteger,cssMediaAttr,cssVendor,cssMediaType,cssIncludeKeyword,cssMediaComma,cssComment nextgroup=cssMediaBlock
-syn keyword cssMediaType contained screen print aural braille embossed handheld projection tty tv speech all contained skipwhite skipnl
-syn keyword cssMediaKeyword only not and contained
-syn region cssMediaBlock transparent matchgroup=cssBraces start='{' end='}' contains=css.*Attr,css.*Prop,cssComment,cssValue.*,cssColor,cssURL,cssImportant,cssError,cssStringQ,cssStringQQ,cssFunction,cssUnicodeEscape,cssVendor,cssDefinition,cssTagName,cssClassName,cssIdentifier,cssPseudoClass,cssSelectorOp,cssSelectorOp2,cssAttributeSelector fold
-syn match cssMediaComma "," skipwhite skipnl contained
-
-" Reference: http://www.w3.org/TR/css3-mediaqueries/
-syn keyword cssMediaProp contained width height orientation scan grid
-syn match cssMediaProp contained /\(\(max\|min\)-\)\=\(\(device\)-\)\=aspect-ratio/
-syn match cssMediaProp contained /\(\(max\|min\)-\)\=device-pixel-ratio/
-syn match cssMediaProp contained /\(\(max\|min\)-\)\=device-\(height\|width\)/
-syn match cssMediaProp contained /\(\(max\|min\)-\)\=\(height\|width\|resolution\|monochrome\|color\(-index\)\=\)/
-syn keyword cssMediaAttr contained portrait landscape progressive interlace
-
-" @page
-" http://www.w3.org/TR/css3-page/
-syn match cssPage "@page\>[^{]*{\@=" contains=cssPagePseudo,cssIncludeKeyword nextgroup=cssPageWrap transparent skipwhite skipnl
-syn match cssPagePseudo /:\(left\|right\|first\|blank\)/ contained skipwhite skipnl
-syn region cssPageWrap contained transparent matchgroup=cssBraces start="{" end="}" contains=cssPageMargin,cssPageProp,cssAttrRegion,css.*Prop,cssComment,cssValue.*,cssColor,cssURL,cssImportant,cssError,cssStringQ,cssStringQQ,cssFunction,cssUnicodeEscape,cssVendor,cssDefinition,cssHacks
-syn match cssPageMargin /@\(\(top\|left\|right\|bottom\)-\(left\|center\|right\|middle\|bottom\)\)\(-corner\)\=/ contained nextgroup=cssDefinition skipwhite skipnl
-syn keyword cssPageProp contained content size
-" http://www.w3.org/TR/CSS2/page.html#break-inside
-syn keyword cssPageProp contained orphans widows
-
-" @keyframe
-" http://www.w3.org/TR/css3-animations/#keyframes
-syn match cssKeyFrame "@\(-[a-z]\+-\)\=keyframes\>[^{]*{\@=" nextgroup=cssKeyFrameWrap contains=cssVendor,cssIncludeKeyword skipwhite skipnl transparent
-syn region cssKeyFrameWrap contained transparent matchgroup=cssBraces start="{" end="}" contains=cssKeyFrameSelector
-syn match cssKeyFrameSelector /\(\d*%\|from\|to\)\=/ contained skipwhite skipnl nextgroup=cssDefinition
-
-" @import
-syn region cssInclude start=/@import\>/ end=/\ze;/ transparent contains=cssStringQ,cssStringQQ,cssUnicodeEscape,cssComment,cssIncludeKeyword,cssURL,cssMediaProp,cssValueLength,cssMediaKeyword,cssValueInteger,cssMediaAttr,cssVendor,cssMediaType
-syn region cssInclude start=/@charset\>/ end=/\ze;/ transparent contains=cssStringQ,cssStringQQ,cssUnicodeEscape,cssComment,cssIncludeKeyword
-syn region cssInclude start=/@namespace\>/ end=/\ze;/ transparent contains=cssStringQ,cssStringQQ,cssUnicodeEscape,cssComment,cssIncludeKeyword
-
-" @font-face
-" http://www.w3.org/TR/css3-fonts/#at-font-face-rule
-syn match cssFontDescriptor "@font-face\>" nextgroup=cssFontDescriptorBlock skipwhite skipnl
-syn region cssFontDescriptorBlock contained transparent matchgroup=cssBraces start="{" end="}" contains=cssComment,cssError,cssUnicodeEscape,cssCommonAttr,cssFontDescriptorProp,cssValue.*,cssFontDescriptorFunction,cssFontDescriptorAttr,cssNoise
-
-syn match cssFontDescriptorProp contained "\<font-family\>"
-syn keyword cssFontDescriptorProp contained src
-syn match cssFontDescriptorProp contained "\<font-\(style\|weight\|stretch\)\>"
-syn match cssFontDescriptorProp contained "\<unicode-range\>"
-syn match cssFontDescriptorProp contained "\<font-\(variant\|feature-settings\)\>"
-
-" src functions
-syn region cssFontDescriptorFunction contained matchgroup=cssFunctionName start="\<\(uri\|url\|local\|format\)\s*(" end=")" contains=cssStringQ,cssStringQQ oneline keepend
-" font-sytle and font-weight attributes
-syn keyword cssFontDescriptorAttr contained normal italic oblique bold
-" font-stretch attributes
-syn match cssFontDescriptorAttr contained "\<\(\(ultra\|extra\|semi\)-\)\=\(condensed\|expanded\)\>"
-" unicode-range attributes
-syn match cssFontDescriptorAttr contained "U+[0-9A-Fa-f?]\+"
-syn match cssFontDescriptorAttr contained "U+\x\+-\x\+"
-" font-feature-settings attributes
-syn keyword cssFontDescriptorAttr contained on off
-
-
-
" The 16 basic color names
syn keyword cssColor contained aqua black blue fuchsia gray green lime maroon navy olive purple red silver teal yellow
@@ -164,8 +100,8 @@ syn keyword cssColor contained midnightblue mintcream mistyrose moccasin navajow
syn keyword cssColor contained oldlace olivedrab orange orangered orchid
syn match cssColor contained /\<pale\(goldenrod\|green\|turquoise\|violetred\)\>/
syn keyword cssColor contained papayawhip peachpuff peru pink plum powderblue
-syn keyword cssColor contained rosybrown royalblue saddlebrown salmon sandybrown
-syn keyword cssColor contained seagreen seashell sienna skyblue slateblue
+syn keyword cssColor contained rosybrown royalblue rebeccapurple saddlebrown salmon
+syn keyword cssColor contained sandybrown seagreen seashell sienna skyblue slateblue
syn keyword cssColor contained slategray slategrey snow springgreen steelblue tan
syn keyword cssColor contained thistle tomato turquoise violet wheat
syn keyword cssColor contained whitesmoke yellowgreen
@@ -182,10 +118,11 @@ syn match cssImportant contained "!\s*important\>"
syn match cssColor contained "\<transparent\>"
syn match cssColor contained "\<currentColor\>"
syn match cssColor contained "\<white\>"
-syn match cssColor contained "#[0-9A-Fa-f]\{3\}\>" contains=cssUnitDecorators
-syn match cssColor contained "#[0-9A-Fa-f]\{6\}\>" contains=cssUnitDecorators
+syn match cssColor contained "#\x\{3,4\}\>" contains=cssUnitDecorators
+syn match cssColor contained "#\x\{6\}\>" contains=cssUnitDecorators
+syn match cssColor contained "#\x\{8\}\>" contains=cssUnitDecorators
-syn region cssURL contained matchgroup=cssFunctionName start="\<url\s*(" end=")" contains=cssStringQ,cssStringQQ oneline
+syn region cssURL contained matchgroup=cssFunctionName start="\<\(uri\|url\|local\|format\)\s*(" end=")" contains=cssStringQ,cssStringQQ oneline
syn region cssFunction contained matchgroup=cssFunctionName start="\<\(rgb\|clip\|attr\|counter\|rect\|cubic-bezier\|steps\)\s*(" end=")" oneline contains=cssValueInteger,cssValueNumber,cssValueLength,cssFunctionComma
syn region cssFunction contained matchgroup=cssFunctionName start="\<\(rgba\|hsl\|hsla\|color-stop\|from\|to\)\s*(" end=")" oneline contains=cssColor,cssValueInteger,cssValueNumber,cssValueLength,cssFunctionComma,cssFunction
syn region cssFunction contained matchgroup=cssFunctionName start="\<\(linear-\|radial-\)\=\gradient\s*(" end=")" oneline contains=cssColor,cssValueInteger,cssValueNumber,cssValueLength,cssFunction,cssGradientAttr,cssFunctionComma
@@ -226,7 +163,6 @@ syn keyword cssBackgroundAttr contained left center right top bottom
" background-repeat attributes
syn match cssBackgroundAttr contained "\<no-repeat\>"
syn match cssBackgroundAttr contained "\<repeat\(-[xy]\)\=\>"
-syn keyword cssBackgroundAttr contained space round
" background-size attributes
syn keyword cssBackgroundAttr contained cover contain
@@ -238,7 +174,7 @@ syn match cssBorderProp contained "\<box-decoration-break\>"
syn match cssBorderProp contained "\<box-shadow\>"
" border-image attributes
-syn keyword cssBorderAttr contained stretch round space fill
+syn keyword cssBorderAttr contained stretch round fill
" border-style attributes
syn keyword cssBorderAttr contained dotted dashed solid double groove ridge inset outset
@@ -266,14 +202,18 @@ syn match cssDimensionProp contained "\<\(min\|max\)-\(width\|height\)\>"
syn keyword cssDimensionProp contained height
syn keyword cssDimensionProp contained width
-" shadow and sizing are in other property groups
-syn match cssFlexibleBoxProp contained "\<box-\(align\|direction\|flex\|ordinal-group\|orient\|pack\|shadow\|sizing\)\>"
-syn keyword cssFlexibleBoxAttr contained start end baseline
-syn keyword cssFlexibleBoxAttr contained reverse
-syn keyword cssFlexibleBoxAttr contained single multiple
-syn keyword cssFlexibleBoxAttr contained horizontal
-syn match cssFlexibleBoxAttr contained "\<vertical\(-align\)\@!\>" "escape vertical-align
-syn match cssFlexibleBoxAttr contained "\<\(inline\|block\)-axis\>"
+" CSS Flexible Box Layout Module Level 1
+" http://www.w3.org/TR/css3-flexbox/
+" CSS Box Alignment Module Level 3
+" http://www.w3.org/TR/css-align-3/
+syn match cssFlexibleBoxProp contained "\<flex\(-\(direction\|wrap\|flow\|grow\|shrink\|basis\)\)\=\>"
+syn match cssFlexibleBoxProp contained "\<\(align\|justify\)\(-\(items\|self\|content\)\)\=\>"
+syn keyword cssFlexibleBoxProp contained order
+
+syn match cssFlexibleBoxAttr contained "\<\(row\|column\|wrap\)\(-reverse\)\=\>"
+syn keyword cssFlexibleBoxAttr contained nowrap stretch baseline center
+syn match cssFlexibleBoxAttr contained "\<flex\(-\(start\|end\)\)\=\>"
+syn match cssFlexibleBoxAttr contained "\<space\(-\(between\|around\)\)\=\>"
" CSS Fonts Module Level 3
" http://www.w3.org/TR/css-fonts-3/
@@ -281,11 +221,11 @@ syn match cssFontProp contained "\<font\(-\(family\|\|feature-settings\|kerning\
" font attributes
syn keyword cssFontAttr contained icon menu caption
-syn match cssFontAttr contained "\<small-\(caps\|caption\)\>"
syn match cssFontAttr contained "\<message-box\>"
syn match cssFontAttr contained "\<status-bar\>"
syn keyword cssFontAttr contained larger smaller
syn match cssFontAttr contained "\<\(x\{1,2\}-\)\=\(large\|small\)\>"
+syn match cssFontAttr contained "\<small-\(caps\|caption\)\>"
" font-family attributes
syn match cssFontAttr contained "\<\(sans-\)\=serif\>"
syn keyword cssFontAttr contained Antiqua Arial Black Book Charcoal Comic Courier Dingbats Gadget Geneva Georgia Grande Helvetica Impact Linotype Lucida MS Monaco Neue New Palatino Roboto Roman Symbol Tahoma Times Trebuchet Verdana Webdings Wingdings York Zapf
@@ -314,12 +254,16 @@ syn match cssMultiColumnProp contained "\<break-\(after\|before\|inside\)\>"
syn match cssMultiColumnProp contained "\<column-\(count\|fill\|gap\|rule\(-\(color\|style\|width\)\)\=\|span\|width\)\>"
syn keyword cssMultiColumnProp contained columns
syn keyword cssMultiColumnAttr contained balance medium
-syn keyword cssMultiColumnAttr contained always avoid left right page column
-syn match cssMultiColumnAttr contained "\<avoid-\(page\|column\)\>"
+syn keyword cssMultiColumnAttr contained always left right page column
+syn match cssMultiColumnAttr contained "\<avoid\(-\(page\|column\)\)\=\>"
" http://www.w3.org/TR/css3-break/#page-break
syn match cssMultiColumnProp contained "\<page\(-break-\(before\|after\|inside\)\)\=\>"
+" http://www.w3.org/TR/SVG11/interact.html
+syn match cssInteractProp contained "\<pointer-events\>"
+syn match cssInteractAttr contained "\<\(visible\)\=\(Painted\|Fill\|Stroke\)\=\>"
+
" TODO find following items in w3c docs.
syn keyword cssGeneratedContentProp contained quotes crop
syn match cssGeneratedContentProp contained "\<counter-\(reset\|increment\)\>"
@@ -327,7 +271,12 @@ syn match cssGeneratedContentProp contained "\<move-to\>"
syn match cssGeneratedContentProp contained "\<page-policy\>"
syn match cssGeneratedContentAttr contained "\<\(no-\)\=\(open\|close\)-quote\>"
-syn match cssGridProp contained "\<grid-\(columns\|rows\)\>"
+" https://www.w3.org/TR/css-grid-1/
+syn match cssGridProp contained "\<grid\>"
+syn match cssGridProp contained "\<grid\(-\(template\|auto\)\)\=\(-\(columns\|rows\|areas\)\)\>"
+syn match cssGridProp contained "\<grid-\(column\|row\)\(-\(start\|end\|gap\)\)\=\>"
+syn match cssGridProp contained "\<grid-\(area\|gap\)\>"
+syn match cssGridProp contained "\<grid-auto-flow\>"
syn match cssHyerlinkProp contained "\<target\(-\(name\|new\|position\)\)\=\>"
@@ -341,14 +290,14 @@ syn keyword cssListAttr contained inside outside
syn keyword cssPositioningProp contained bottom clear clip display float left
syn keyword cssPositioningProp contained position right top visibility
syn match cssPositioningProp contained "\<z-index\>"
-syn keyword cssPositioningAttr contained block compact
+syn keyword cssPositioningAttr contained block compact grid
syn match cssPositioningAttr contained "\<table\(-\(row-group\|\(header\|footer\)-group\|row\|column\(-group\)\=\|cell\|caption\)\)\=\>"
syn keyword cssPositioningAttr contained left right both
syn match cssPositioningAttr contained "\<list-item\>"
-syn match cssPositioningAttr contained "\<inline\(-\(block\|box\|table\)\)\=\>"
-syn keyword cssPositioningAttr contained static relative absolute fixed
+syn match cssPositioningAttr contained "\<inline\(-\(block\|box\|table\|grid\|flex\)\)\=\>"
+syn keyword cssPositioningAttr contained static relative absolute fixed subgrid
-syn keyword cssPrintAttr contained landscape portrait crop cross always avoid
+syn keyword cssPrintAttr contained landscape portrait crop cross always
syn match cssTableProp contained "\<\(caption-side\|table-layout\|border-collapse\|border-spacing\|empty-cells\)\>"
syn keyword cssTableAttr contained fixed collapse separate show hide once always
@@ -421,17 +370,20 @@ syn keyword cssUIAttr contained both horizontal vertical
syn match cssUIProp contained "\<text-overflow\>"
syn keyword cssUIAttr contained clip ellipsis
-" Already highlighted Props: font content
+syn match cssUIProp contained "\<image-rendering\>"
+syn keyword cssUIAttr contained pixellated
+syn match cssUIAttr contained "\<crisp-edges\>"
+
"------------------------------------------------
" Webkit/iOS specific attributes
-syn match cssUIAttr contained '\(preserve-3d\)'
+syn match cssUIAttr contained '\<preserve-3d\>'
" IE specific attributes
-syn match cssIEUIAttr contained '\(bicubic\)'
+syn match cssIEUIAttr contained '\<bicubic\>'
" Webkit/iOS specific properties
-syn match cssUIProp contained '\(tap-highlight-color\|user-select\|touch-callout\)'
+syn match cssUIProp contained '\<tap-highlight-color\|user-select\|touch-callout\>'
" IE specific properties
-syn match cssIEUIProp contained '\(interpolation-mode\|zoom\|filter\)'
+syn match cssIEUIProp contained '\<interpolation-mode\|zoom\|filter\>'
" Webkit/Firebox specific properties/attributes
syn keyword cssUIProp contained appearance
@@ -456,11 +408,25 @@ syn keyword cssAuralAttr contained male female child code digits continuous
" mobile text
syn match cssMobileTextProp contained "\<text-size-adjust\>"
-
+syn keyword cssMediaProp contained width height orientation scan grid
+syn match cssMediaProp contained /\(\(max\|min\)-\)\=\(\(device\)-\)\=aspect-ratio/
+syn match cssMediaProp contained /\(\(max\|min\)-\)\=device-pixel-ratio/
+syn match cssMediaProp contained /\(\(max\|min\)-\)\=device-\(height\|width\)/
+syn match cssMediaProp contained /\(\(max\|min\)-\)\=\(height\|width\|resolution\|monochrome\|color\(-index\)\=\)/
+syn keyword cssMediaAttr contained portrait landscape progressive interlace
+syn match cssKeyFrameProp /\d*%\|from\|to/ contained nextgroup=cssDefinition
+syn match cssPageMarginProp /@\(\(top\|left\|right\|bottom\)-\(left\|center\|right\|middle\|bottom\)\)\(-corner\)\=/ contained nextgroup=cssDefinition
+syn keyword cssPageProp contained content size
+syn keyword cssPageProp contained orphans widows
+syn keyword cssFontDescriptorProp contained src
+syn match cssFontDescriptorProp contained "\<unicode-range\>"
+" unicode-range attributes
+syn match cssFontDescriptorAttr contained "U+[0-9A-Fa-f?]\+"
+syn match cssFontDescriptorAttr contained "U+\x\+-\x\+"
syn match cssBraces contained "[{}]"
syn match cssError contained "{@<>"
-syn region cssDefinition transparent matchgroup=cssBraces start='{' end='}' contains=cssAttrRegion,css.*Prop,cssComment,cssValue.*,cssColor,cssURL,cssImportant,cssError,cssStringQ,cssStringQQ,cssFunction,cssUnicodeEscape,cssVendor,cssDefinition,cssHacks,cssNoise fold
+syn region cssDefinition transparent matchgroup=cssBraces start='{' end='}' contains=cssTagName,cssAttributeSelector,cssClassName,cssIdentifier,cssAtRule,cssAttrRegion,css.*Prop,cssComment,cssValue.*,cssColor,cssURL,cssImportant,cssError,cssStringQ,cssStringQQ,cssFunction,cssUnicodeEscape,cssVendor,cssDefinition,cssHacks,cssNoise fold
syn match cssBraceError "}"
syn match cssAttrComma ","
@@ -479,7 +445,7 @@ syn match cssPseudoClassId contained "\<focus\(-inner\)\=\>"
syn match cssPseudoClassId contained "\<\(input-\)\=placeholder\>"
" Misc highlight groups
-syntax match cssUnitDecorators /\(#\|-\|%\|mm\|cm\|in\|pt\|pc\|em\|ex\|px\|ch\|rem\|vh\|vw\|vmin\|vmax\|dpi\|dppx\|dpcm\|Hz\|kHz\|s\|ms\|deg\|grad\|rad\)/ contained
+syntax match cssUnitDecorators /\(#\|-\|+\|%\|mm\|cm\|in\|pt\|pc\|em\|ex\|px\|ch\|rem\|vh\|vw\|vmin\|vmax\|dpi\|dppx\|dpcm\|Hz\|kHz\|s\|ms\|deg\|grad\|rad\)/ contained
syntax match cssNoise contained /\(:\|;\|\/\)/
" Comment
@@ -492,7 +458,7 @@ syn region cssStringQQ start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=cssUnicodeEsc
syn region cssStringQ start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=cssUnicodeEscape,cssSpecialCharQ
" Vendor Prefix
-syn match cssVendor contained "\(-\(webkit\|moz\|o\|ms\)-\)"
+syn match cssVendor contained "-\(webkit\|moz\|o\|ms\)-"
" Various CSS Hack characters
" In earlier versions of IE (6 and 7), one can prefix property names
@@ -510,145 +476,160 @@ syn region cssAttrRegion start=/:/ end=/\ze\(;\|)\|}\)/ contained contains=css.*
" 'transition' has Props after ':'.
syn region cssAttrRegion start=/transition\s*:/ end=/\ze\(;\|)\|}\)/ contained contains=css.*Prop,css.*Attr,cssColor,cssImportant,cssValue.*,cssFunction,cssString.*,cssURL,cssComment,cssUnicodeEscape,cssVendor,cssError,cssAttrComma,cssNoise
+syn match cssAtKeyword /@\(font-face\|media\|keyframes\|import\|charset\|namespace\|page\|supports\)/ contained
+
+syn keyword cssAtRuleLogical only not and contained
+
+" @media
+" Reference: http://www.w3.org/TR/css3-mediaqueries/
+syn region cssAtRule start=/@media\>/ end=/\ze{/ skipwhite skipnl matchgroup=cssAtKeyword contains=cssMediaProp,cssValueLength,cssAtRuleLogical,cssValueInteger,cssMediaAttr,cssVendor,cssMediaType,cssComment nextgroup=cssDefinition
+syn keyword cssMediaType contained screen print aural braille embossed handheld projection tty tv speech all contained
+
+" @page
+" http://www.w3.org/TR/css3-page/
+syn region cssAtRule start=/@page\>/ end=/\ze{/ skipwhite skipnl matchgroup=cssAtKeyword contains=cssPagePseudo,cssComment nextgroup=cssDefinition
+syn match cssPagePseudo /:\(left\|right\|first\|blank\)/ contained skipwhite skipnl
+" @keyframe
+" http://www.w3.org/TR/css3-animations/#keyframes
+syn region cssAtRule start=/@\(-[a-z]\+-\)\=keyframes\>/ end=/\ze{/ skipwhite skipnl matchgroup=cssAtKeyword contains=cssVendor,cssComment nextgroup=cssDefinition
+
+syn region cssAtRule start=/@import\>/ end=/\ze;/ contains=cssStringQ,cssStringQQ,cssUnicodeEscape,cssComment,cssAtKeyword,cssURL,cssMediaProp,cssValueLength,cssAtRuleLogical,cssValueInteger,cssMediaAttr,cssMediaType
+syn region cssAtRule start=/@charset\>/ end=/\ze;/ contains=cssStringQ,cssStringQQ,cssUnicodeEscape,cssComment,cssAtKeyword
+syn region cssAtRule start=/@namespace\>/ end=/\ze;/ contains=cssStringQ,cssStringQQ,cssUnicodeEscape,cssComment,cssAtKeyword
+
+" @font-face
+" http://www.w3.org/TR/css3-fonts/#at-font-face-rule
+syn match cssAtRule "@font-face\>" nextgroup=cssFontDescriptorBlock
+" @supports
+" https://www.w3.org/TR/css3-conditional/#at-supports
+syn region cssAtRule start=/@supports\>/ end=/\ze{/ skipwhite skipnl contains=cssAtRuleLogical,cssAttrRegion,css.*Prop,cssValue.*,cssVendor,cssAtKeyword,cssComment nextgroup=cssDefinition
+
if main_syntax == "css"
syn sync minlines=10
endif
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_css_syn_inits")
- if version < 508
- let did_css_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink cssComment Comment
- HiLink cssVendor Comment
- HiLink cssHacks Comment
- HiLink cssTagName Statement
- HiLink cssDeprecated Error
- HiLink cssSelectorOp Special
- HiLink cssSelectorOp2 Special
- HiLink cssAttrComma Special
-
- HiLink cssAnimationProp cssProp
- HiLink cssBackgroundProp cssProp
- HiLink cssBorderProp cssProp
- HiLink cssBoxProp cssProp
- HiLink cssColorProp cssProp
- HiLink cssContentForPagedMediaProp cssProp
- HiLink cssDimensionProp cssProp
- HiLink cssFlexibleBoxProp cssProp
- HiLink cssFontProp cssProp
- HiLink cssGeneratedContentProp cssProp
- HiLink cssGridProp cssProp
- HiLink cssHyerlinkProp cssProp
- HiLink cssLineboxProp cssProp
- HiLink cssListProp cssProp
- HiLink cssMarqueeProp cssProp
- HiLink cssMultiColumnProp cssProp
- HiLink cssPagedMediaProp cssProp
- HiLink cssPositioningProp cssProp
- HiLink cssPrintProp cssProp
- HiLink cssRubyProp cssProp
- HiLink cssSpeechProp cssProp
- HiLink cssTableProp cssProp
- HiLink cssTextProp cssProp
- HiLink cssTransformProp cssProp
- HiLink cssTransitionProp cssProp
- HiLink cssUIProp cssProp
- HiLink cssIEUIProp cssProp
- HiLink cssAuralProp cssProp
- HiLink cssRenderProp cssProp
- HiLink cssMobileTextProp cssProp
-
- HiLink cssAnimationAttr cssAttr
- HiLink cssBackgroundAttr cssAttr
- HiLink cssBorderAttr cssAttr
- HiLink cssBoxAttr cssAttr
- HiLink cssContentForPagedMediaAttr cssAttr
- HiLink cssDimensionAttr cssAttr
- HiLink cssFlexibleBoxAttr cssAttr
- HiLink cssFontAttr cssAttr
- HiLink cssGeneratedContentAttr cssAttr
- HiLink cssGridAttr cssAttr
- HiLink cssHyerlinkAttr cssAttr
- HiLink cssLineboxAttr cssAttr
- HiLink cssListAttr cssAttr
- HiLink cssMarginAttr cssAttr
- HiLink cssMarqueeAttr cssAttr
- HiLink cssMultiColumnAttr cssAttr
- HiLink cssPaddingAttr cssAttr
- HiLink cssPagedMediaAttr cssAttr
- HiLink cssPositioningAttr cssAttr
- HiLink cssGradientAttr cssAttr
- HiLink cssPrintAttr cssAttr
- HiLink cssRubyAttr cssAttr
- HiLink cssSpeechAttr cssAttr
- HiLink cssTableAttr cssAttr
- HiLink cssTextAttr cssAttr
- HiLink cssTransformAttr cssAttr
- HiLink cssTransitionAttr cssAttr
- HiLink cssUIAttr cssAttr
- HiLink cssIEUIAttr cssAttr
- HiLink cssAuralAttr cssAttr
- HiLink cssRenderAttr cssAttr
- HiLink cssCommonAttr cssAttr
-
- HiLink cssPseudoClassId PreProc
- HiLink cssPseudoClassLang Constant
- HiLink cssValueLength Number
- HiLink cssValueInteger Number
- HiLink cssValueNumber Number
- HiLink cssValueAngle Number
- HiLink cssValueTime Number
- HiLink cssValueFrequency Number
- HiLink cssFunction Constant
- HiLink cssURL String
- HiLink cssFunctionName Function
- HiLink cssFunctionComma Function
- HiLink cssColor Constant
- HiLink cssIdentifier Function
- HiLink cssInclude Include
- HiLink cssIncludeKeyword atKeyword
- HiLink cssImportant Special
- HiLink cssBraces Function
- HiLink cssBraceError Error
- HiLink cssError Error
- HiLink cssUnicodeEscape Special
- HiLink cssStringQQ String
- HiLink cssStringQ String
- HiLink cssAttributeSelector String
- HiLink cssMedia atKeyword
- HiLink cssMediaType Special
- HiLink cssMediaComma Normal
- HiLink cssMediaKeyword Statement
- HiLink cssMediaProp cssProp
- HiLink cssMediaAttr cssAttr
- HiLink cssPage atKeyword
- HiLink cssPagePseudo PreProc
- HiLink cssPageMargin atKeyword
- HiLink cssPageProp cssProp
- HiLink cssKeyFrame atKeyword
- HiLink cssKeyFrameSelector Constant
- HiLink cssFontDescriptor Special
- HiLink cssFontDescriptorFunction Constant
- HiLink cssFontDescriptorProp cssProp
- HiLink cssFontDescriptorAttr cssAttr
- HiLink cssUnicodeRange Constant
- HiLink cssClassName Function
- HiLink cssClassNameDot Function
- HiLink cssProp StorageClass
- HiLink cssAttr Constant
- HiLink cssUnitDecorators Number
- HiLink cssNoise Noise
- HiLink atKeyword PreProc
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link cssComment Comment
+hi def link cssVendor Comment
+hi def link cssHacks Comment
+hi def link cssTagName Statement
+hi def link cssDeprecated Error
+hi def link cssSelectorOp Special
+hi def link cssSelectorOp2 Special
+hi def link cssAttrComma Special
+
+hi def link cssAnimationProp cssProp
+hi def link cssBackgroundProp cssProp
+hi def link cssBorderProp cssProp
+hi def link cssBoxProp cssProp
+hi def link cssColorProp cssProp
+hi def link cssContentForPagedMediaProp cssProp
+hi def link cssDimensionProp cssProp
+hi def link cssFlexibleBoxProp cssProp
+hi def link cssFontProp cssProp
+hi def link cssGeneratedContentProp cssProp
+hi def link cssGridProp cssProp
+hi def link cssHyerlinkProp cssProp
+hi def link cssInteractProp cssProp
+hi def link cssLineboxProp cssProp
+hi def link cssListProp cssProp
+hi def link cssMarqueeProp cssProp
+hi def link cssMultiColumnProp cssProp
+hi def link cssPagedMediaProp cssProp
+hi def link cssPositioningProp cssProp
+hi def link cssPrintProp cssProp
+hi def link cssRubyProp cssProp
+hi def link cssSpeechProp cssProp
+hi def link cssTableProp cssProp
+hi def link cssTextProp cssProp
+hi def link cssTransformProp cssProp
+hi def link cssTransitionProp cssProp
+hi def link cssUIProp cssProp
+hi def link cssIEUIProp cssProp
+hi def link cssAuralProp cssProp
+hi def link cssRenderProp cssProp
+hi def link cssMobileTextProp cssProp
+
+hi def link cssAnimationAttr cssAttr
+hi def link cssBackgroundAttr cssAttr
+hi def link cssBorderAttr cssAttr
+hi def link cssBoxAttr cssAttr
+hi def link cssContentForPagedMediaAttr cssAttr
+hi def link cssDimensionAttr cssAttr
+hi def link cssFlexibleBoxAttr cssAttr
+hi def link cssFontAttr cssAttr
+hi def link cssGeneratedContentAttr cssAttr
+hi def link cssGridAttr cssAttr
+hi def link cssHyerlinkAttr cssAttr
+hi def link cssInteractAttr cssAttr
+hi def link cssLineboxAttr cssAttr
+hi def link cssListAttr cssAttr
+hi def link cssMarginAttr cssAttr
+hi def link cssMarqueeAttr cssAttr
+hi def link cssMultiColumnAttr cssAttr
+hi def link cssPaddingAttr cssAttr
+hi def link cssPagedMediaAttr cssAttr
+hi def link cssPositioningAttr cssAttr
+hi def link cssGradientAttr cssAttr
+hi def link cssPrintAttr cssAttr
+hi def link cssRubyAttr cssAttr
+hi def link cssSpeechAttr cssAttr
+hi def link cssTableAttr cssAttr
+hi def link cssTextAttr cssAttr
+hi def link cssTransformAttr cssAttr
+hi def link cssTransitionAttr cssAttr
+hi def link cssUIAttr cssAttr
+hi def link cssIEUIAttr cssAttr
+hi def link cssAuralAttr cssAttr
+hi def link cssRenderAttr cssAttr
+hi def link cssCommonAttr cssAttr
+
+hi def link cssPseudoClassId PreProc
+hi def link cssPseudoClassLang Constant
+hi def link cssValueLength Number
+hi def link cssValueInteger Number
+hi def link cssValueNumber Number
+hi def link cssValueAngle Number
+hi def link cssValueTime Number
+hi def link cssValueFrequency Number
+hi def link cssFunction Constant
+hi def link cssURL String
+hi def link cssFunctionName Function
+hi def link cssFunctionComma Function
+hi def link cssColor Constant
+hi def link cssIdentifier Function
+hi def link cssAtRule Include
+hi def link cssAtKeyword PreProc
+hi def link cssImportant Special
+hi def link cssBraces Function
+hi def link cssBraceError Error
+hi def link cssError Error
+hi def link cssUnicodeEscape Special
+hi def link cssStringQQ String
+hi def link cssStringQ String
+hi def link cssAttributeSelector String
+hi def link cssMediaType Special
+hi def link cssMediaComma Normal
+hi def link cssAtRuleLogical Statement
+hi def link cssMediaProp cssProp
+hi def link cssMediaAttr cssAttr
+hi def link cssPagePseudo PreProc
+hi def link cssPageMarginProp cssAtKeyword
+hi def link cssPageProp cssProp
+hi def link cssKeyFrameProp Constant
+hi def link cssFontDescriptor Special
+hi def link cssFontDescriptorProp cssProp
+hi def link cssFontDescriptorAttr cssAttr
+hi def link cssUnicodeRange Constant
+hi def link cssClassName Function
+hi def link cssClassNameDot Function
+hi def link cssProp StorageClass
+hi def link cssAttr Constant
+hi def link cssUnitDecorators Number
+hi def link cssNoise Noise
let b:current_syntax = "css"
diff --git a/runtime/syntax/cterm.vim b/runtime/syntax/cterm.vim
index 139a0d5e17..1b6cb2893f 100644
--- a/runtime/syntax/cterm.vim
+++ b/runtime/syntax/cterm.vim
@@ -4,11 +4,8 @@
" Last Change: 2002 Apr 13
" Version Info: @(#)cterm.vim 1.7 97/12/15 09:23:14
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -142,48 +139,38 @@ syn match ctermCharacter "'[^\\]'"
syn match ctermSpecialCharacter "'\\.'"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_cterm_syntax_inits")
- if version < 508
- let did_cterm_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink ctermStatement Statement
- HiLink ctermFunction Statement
- HiLink ctermStrFunction Statement
- HiLink ctermIntFunction Statement
- HiLink ctermLabel Statement
- HiLink ctermConditional Statement
- HiLink ctermRepeat Statement
- HiLink ctermLibFunc UserDefFunc
- HiLink ctermType Type
- HiLink ctermFuncArg PreCondit
-
- HiLink ctermPreVarRO PreCondit
- HiLink ctermPreVarRW PreConditBold
- HiLink ctermVar Type
-
- HiLink ctermComment Comment
-
- HiLink ctermCharacter SpecialChar
- HiLink ctermSpecial Special
- HiLink ctermSpecialCharacter SpecialChar
- HiLink ctermSymbols Special
- HiLink ctermString String
- HiLink ctermTodo Todo
- HiLink ctermOperator Statement
- HiLink ctermNumber Number
-
- " redefine the colors
- "hi PreConditBold term=bold ctermfg=1 cterm=bold guifg=Purple gui=bold
- "hi Special term=bold ctermfg=6 guifg=SlateBlue gui=underline
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link ctermStatement Statement
+hi def link ctermFunction Statement
+hi def link ctermStrFunction Statement
+hi def link ctermIntFunction Statement
+hi def link ctermLabel Statement
+hi def link ctermConditional Statement
+hi def link ctermRepeat Statement
+hi def link ctermLibFunc UserDefFunc
+hi def link ctermType Type
+hi def link ctermFuncArg PreCondit
+
+hi def link ctermPreVarRO PreCondit
+hi def link ctermPreVarRW PreConditBold
+hi def link ctermVar Type
+
+hi def link ctermComment Comment
+
+hi def link ctermCharacter SpecialChar
+hi def link ctermSpecial Special
+hi def link ctermSpecialCharacter SpecialChar
+hi def link ctermSymbols Special
+hi def link ctermString String
+hi def link ctermTodo Todo
+hi def link ctermOperator Statement
+hi def link ctermNumber Number
+
+" redefine the colors
+"hi PreConditBold term=bold ctermfg=1 cterm=bold guifg=Purple gui=bold
+"hi Special term=bold ctermfg=6 guifg=SlateBlue gui=underline
+
let b:current_syntax = "cterm"
diff --git a/runtime/syntax/cuda.vim b/runtime/syntax/cuda.vim
index 77930e3fd4..13d70e343a 100644
--- a/runtime/syntax/cuda.vim
+++ b/runtime/syntax/cuda.vim
@@ -1,22 +1,15 @@
" Vim syntax file
" Language: CUDA (NVIDIA Compute Unified Device Architecture)
" Maintainer: Timothy B. Terriberry <tterribe@users.sourceforge.net>
-" Last Change: 2007 Oct 13
+" Last Change: 2018 Feb 06
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
-" Read the C syntax to start with
-if version < 600
- source <sfile>:p:h/c.vim
-else
- runtime! syntax/c.vim
-endif
+" Read the C++ syntax to start with
+runtime! syntax/cpp.vim
" CUDA extentions
syn keyword cudaStorageClass __device__ __global__ __host__
diff --git a/runtime/syntax/cupl.vim b/runtime/syntax/cupl.vim
index 545d873af2..5b93b0db93 100644
--- a/runtime/syntax/cupl.vim
+++ b/runtime/syntax/cupl.vim
@@ -3,11 +3,8 @@
" Maintainer: John Cook <johncook3@gmail.com>
" Last Change: 2011 Dec 27
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -95,39 +92,29 @@ syn region cuplComment start=+/\*+ end=+\*/+ contains=cuplNumber,cuplTodo
syn sync minlines=1
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_cupl_syn_inits")
- if version < 508
- let did_cupl_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default highlighting.
- HiLink cuplHeader cuplStatement
- HiLink cuplLogicalOperator cuplOperator
- HiLink cuplRangeOperator cuplOperator
- HiLink cuplArithmeticOperator cuplOperator
- HiLink cuplAssignmentOperator cuplOperator
- HiLink cuplEqualityOperator cuplOperator
- HiLink cuplTruthTableOperator cuplOperator
- HiLink cuplOperator cuplStatement
- HiLink cuplFunction cuplStatement
- HiLink cuplStatement Statement
- HiLink cuplNumberRange cuplNumber
- HiLink cuplNumber cuplString
- HiLink cuplString String
- HiLink cuplComment Comment
- HiLink cuplExtension cuplSpecial
- HiLink cuplSpecialChar cuplSpecial
- HiLink cuplSpecial Special
- HiLink cuplDirective PreProc
- HiLink cuplTodo Todo
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+" The default highlighting.
+hi def link cuplHeader cuplStatement
+hi def link cuplLogicalOperator cuplOperator
+hi def link cuplRangeOperator cuplOperator
+hi def link cuplArithmeticOperator cuplOperator
+hi def link cuplAssignmentOperator cuplOperator
+hi def link cuplEqualityOperator cuplOperator
+hi def link cuplTruthTableOperator cuplOperator
+hi def link cuplOperator cuplStatement
+hi def link cuplFunction cuplStatement
+hi def link cuplStatement Statement
+hi def link cuplNumberRange cuplNumber
+hi def link cuplNumber cuplString
+hi def link cuplString String
+hi def link cuplComment Comment
+hi def link cuplExtension cuplSpecial
+hi def link cuplSpecialChar cuplSpecial
+hi def link cuplSpecial Special
+hi def link cuplDirective PreProc
+hi def link cuplTodo Todo
+
let b:current_syntax = "cupl"
diff --git a/runtime/syntax/cuplsim.vim b/runtime/syntax/cuplsim.vim
index 18a30ce256..36eb4c3555 100644
--- a/runtime/syntax/cuplsim.vim
+++ b/runtime/syntax/cuplsim.vim
@@ -3,21 +3,14 @@
" Maintainer: John Cook <john.cook@kla-tencor.com>
" Last Change: 2001 Apr 25
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" Read the CUPL syntax to start with
-if version < 600
- source <sfile>:p:h/cupl.vim
-else
- runtime! syntax/cupl.vim
- unlet b:current_syntax
-endif
+runtime! syntax/cupl.vim
+unlet b:current_syntax
" omit definition-specific stuff
syn clear cuplStatement
@@ -53,28 +46,18 @@ syn match cuplsimOutput +"\x\+"+
syn sync minlines=1
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_cuplsim_syn_inits")
- if version < 508
- let did_cuplsim_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " append to the highlighting links in cupl.vim
- " The default highlighting.
- HiLink cuplsimOrder cuplStatement
- HiLink cuplsimBase cuplStatement
- HiLink cuplsimBaseType cuplStatement
- HiLink cuplsimVectors cuplStatement
- HiLink cuplsimStimulus cuplNumber
- HiLink cuplsimOutput cuplNumber
- HiLink cuplsimOrderFormat cuplNumber
+" Only when an item doesn't have highlighting yet
+
+" append to the highlighting links in cupl.vim
+" The default highlighting.
+hi def link cuplsimOrder cuplStatement
+hi def link cuplsimBase cuplStatement
+hi def link cuplsimBaseType cuplStatement
+hi def link cuplsimVectors cuplStatement
+hi def link cuplsimStimulus cuplNumber
+hi def link cuplsimOutput cuplNumber
+hi def link cuplsimOrderFormat cuplNumber
- delcommand HiLink
-endif
let b:current_syntax = "cuplsim"
" vim:ts=8
diff --git a/runtime/syntax/cvs.vim b/runtime/syntax/cvs.vim
index 94b2a809eb..3eac191637 100644
--- a/runtime/syntax/cvs.vim
+++ b/runtime/syntax/cvs.vim
@@ -4,11 +4,8 @@
" URL: http://www.zotikos.com/downloads/cvs.vim
" Last Change: Sat Nov 24 23:25:11 CET 2001
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -20,24 +17,14 @@ syn region cvsCom start="Committing in" end="$" contains=cvsDir contained extend
syn match cvsDir contained "\S\+$"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_cvs_syn_inits")
- if version < 508
- let did_cvs_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink cvsLine Comment
- HiLink cvsDir cvsFile
- HiLink cvsFile Constant
- HiLink cvsFiles cvsCom
- HiLink cvsTag cvsCom
- HiLink cvsCom Statement
+hi def link cvsLine Comment
+hi def link cvsDir cvsFile
+hi def link cvsFile Constant
+hi def link cvsFiles cvsCom
+hi def link cvsTag cvsCom
+hi def link cvsCom Statement
- delcommand HiLink
-endif
let b:current_syntax = "cvs"
diff --git a/runtime/syntax/cvsrc.vim b/runtime/syntax/cvsrc.vim
index 6c2c4eea04..9522de6436 100644
--- a/runtime/syntax/cvsrc.vim
+++ b/runtime/syntax/cvsrc.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: cvs(1) RC file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: cvs(1) RC file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/cweb.vim b/runtime/syntax/cweb.vim
index 39b593d2be..4e06b3646d 100644
--- a/runtime/syntax/cweb.vim
+++ b/runtime/syntax/cweb.vim
@@ -13,11 +13,8 @@
" TODO: names, and leaves C/C++ comments as such. (On the other hand,
" TODO: switching to TeX mode in C/C++ comments might be colour overkill.)
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -25,12 +22,8 @@ endif
" level in the CWEB syntax, e.g., in the preamble. In general, a CWEB source
" code can be seen as a normal TeX document with some C/C++ material
" interspersed in certain defined regions.
-if version < 600
- source <sfile>:p:h/tex.vim
-else
- runtime! syntax/tex.vim
- unlet b:current_syntax
-endif
+runtime! syntax/tex.vim
+unlet b:current_syntax
" Read the C/C++ syntax too; C/C++ syntax items are treated as such in the
" C/C++ section of a CWEB chunk or in inner C/C++ context in "|...|" groups.
@@ -63,20 +56,10 @@ syntax region webRestrictedTeX start="@[\^\.:t=q]" end="@>" oneline
syntax match webIgnoredStuff "@@"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_cweb_syntax_inits")
- if version < 508
- let did_cweb_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink webRestrictedTeX String
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link webRestrictedTeX String
+
let b:current_syntax = "cweb"
diff --git a/runtime/syntax/cynlib.vim b/runtime/syntax/cynlib.vim
index a9985074d6..24ad2a2e31 100644
--- a/runtime/syntax/cynlib.vim
+++ b/runtime/syntax/cynlib.vim
@@ -15,22 +15,15 @@
" Remove any old syntax stuff hanging around
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" Read the C++ syntax to start with - this includes the C syntax
-if version < 600
- source <sfile>:p:h/cpp.vim
-else
- runtime! syntax/cpp.vim
-endif
+runtime! syntax/cpp.vim
unlet b:current_syntax
" Cynlib extensions
@@ -69,23 +62,13 @@ syn match cynlibOperator "<<="
syn keyword cynlibType In Out InST OutST Int Uint Const Cynclock
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_cynlib_syntax_inits")
- if version < 508
- let did_cynlib_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink cynlibOperator Operator
- HiLink cynlibMacro Statement
- HiLink cynlibFunction Statement
- HiLink cynlibppMacro Statement
- HiLink cynlibType Type
+hi def link cynlibOperator Operator
+hi def link cynlibMacro Statement
+hi def link cynlibFunction Statement
+hi def link cynlibppMacro Statement
+hi def link cynlibType Type
- delcommand HiLink
-endif
let b:current_syntax = "cynlib"
diff --git a/runtime/syntax/cynpp.vim b/runtime/syntax/cynpp.vim
index b984bace35..3064b11a63 100644
--- a/runtime/syntax/cynpp.vim
+++ b/runtime/syntax/cynpp.vim
@@ -19,21 +19,13 @@
-" Remove any old syntax stuff hanging around
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" Read the Cynlib syntax to start with - this includes the C++ syntax
-if version < 600
- source <sfile>:p:h/cynlib.vim
-else
- runtime! syntax/cynlib.vim
-endif
+runtime! syntax/cynlib.vim
unlet b:current_syntax
@@ -49,20 +41,10 @@ syn keyword cynppMacro Thread EndThread
syn keyword cynppMacro Instantiate
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_cynpp_syntax_inits")
- if version < 508
- let did_cynpp_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink cLabel Label
- HiLink cynppMacro Statement
+hi def link cLabel Label
+hi def link cynppMacro Statement
- delcommand HiLink
-endif
let b:current_syntax = "cynpp"
diff --git a/runtime/syntax/datascript.vim b/runtime/syntax/datascript.vim
index a983b8e34c..7b686a144e 100644
--- a/runtime/syntax/datascript.vim
+++ b/runtime/syntax/datascript.vim
@@ -8,9 +8,8 @@
"
" http://dstools.sourceforge.net/DataScriptLanguageOverview.html
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
let s:keepcpo= &cpo
diff --git a/runtime/syntax/dcd.vim b/runtime/syntax/dcd.vim
index a566745fbe..058d272375 100644
--- a/runtime/syntax/dcd.vim
+++ b/runtime/syntax/dcd.vim
@@ -3,11 +3,8 @@
" Maintainer: Christopher Shinn <christopher@lucent.com>
" Last Change: 2003 Apr 25
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -40,25 +37,15 @@ syn keyword dcdSpecial PRV1 PRV2 PRV3 PRV4 PRV5 PRV6 PRV7 PRV8
syn region dcdComment start="\*" end="\;"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_dcd_syntax_inits")
- if version < 508
- let did_dcd_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink dcdFunction Identifier
- HiLink dcdLabel Constant
- HiLink dcdConditional Conditional
- HiLink dcdDisplay Type
- HiLink dcdStatement Statement
- HiLink dcdSpecial Special
- HiLink dcdComment Comment
+hi def link dcdFunction Identifier
+hi def link dcdLabel Constant
+hi def link dcdConditional Conditional
+hi def link dcdDisplay Type
+hi def link dcdStatement Statement
+hi def link dcdSpecial Special
+hi def link dcdComment Comment
- delcommand HiLink
-endif
let b:current_syntax = "dcd"
diff --git a/runtime/syntax/dcl.vim b/runtime/syntax/dcl.vim
index b08adec31d..b973db3434 100644
--- a/runtime/syntax/dcl.vim
+++ b/runtime/syntax/dcl.vim
@@ -1,19 +1,16 @@
" Vim syntax file
" Language: DCL (Digital Command Language - vms)
" Maintainer: Charles E. Campbell <NdrOchipS@PcampbellAfamily.Mbiz>
-" Last Change: Jan 20, 2016
-" Version: 8
+" Last Change: Aug 31, 2016
+" Version: 11
" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_DCL
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
-if !has("patch-7.4.1141")
+if !has("patch-7.4.1142")
setlocal iskeyword=$,@,48-57,_
else
syn iskeyword $,@,48-57,_
@@ -111,49 +108,40 @@ syn region dclFuncList matchgroup=Delimiter start="(" matchgroup=Delimiter end=
syn match dclError ")"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_dcl_syntax_inits")
- if version < 508
- let did_dcl_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink dclLogOper dclError
- HiLink dclLogical dclOper
- HiLink dclLogSep dclSep
-
- HiLink dclAssign Operator
- HiLink dclCmdProc Special
- HiLink dclCmdProcStart Operator
- HiLink dclComment Comment
- HiLink dclContinue Statement
- HiLink dclDevice Identifier
- HiLink dclDirPath Identifier
- HiLink dclDirPath Identifier
- HiLink dclDirSep Delimiter
- HiLink dclError Error
- HiLink dclExe Statement
- HiLink dclFilename NONE
- HiLink dclGotoLabel Label
- HiLink dclInstr Statement
- HiLink dclLexical Function
- HiLink dclMdfy Type
- HiLink dclMdfyBrkt Delimiter
- HiLink dclMdfySep Delimiter
- HiLink dclMdfySet Type
- HiLink dclMdfySetString String
- HiLink dclNumber Number
- HiLink dclOper Operator
- HiLink dclParam Special
- HiLink dclSep Delimiter
- HiLink dclStart Delimiter
- HiLink dclString String
- HiLink dclTodo Todo
-
- delcommand HiLink
+if !exists("skip_dcl_syntax_inits")
+
+ hi def link dclLogOper dclError
+ hi def link dclLogical dclOper
+ hi def link dclLogSep dclSep
+
+ hi def link dclAssign Operator
+ hi def link dclCmdProc Special
+ hi def link dclCmdProcStart Operator
+ hi def link dclComment Comment
+ hi def link dclContinue Statement
+ hi def link dclDevice Identifier
+ hi def link dclDirPath Identifier
+ hi def link dclDirPath Identifier
+ hi def link dclDirSep Delimiter
+ hi def link dclError Error
+ hi def link dclExe Statement
+ hi def link dclFilename NONE
+ hi def link dclGotoLabel Label
+ hi def link dclInstr Statement
+ hi def link dclLexical Function
+ hi def link dclMdfy Type
+ hi def link dclMdfyBrkt Delimiter
+ hi def link dclMdfySep Delimiter
+ hi def link dclMdfySet Type
+ hi def link dclMdfySetString String
+ hi def link dclNumber Number
+ hi def link dclOper Operator
+ hi def link dclParam Special
+ hi def link dclSep Delimiter
+ hi def link dclStart Delimiter
+ hi def link dclString String
+ hi def link dclTodo Todo
+
endif
let b:current_syntax = "dcl"
diff --git a/runtime/syntax/debchangelog.vim b/runtime/syntax/debchangelog.vim
index 4f1d6d4b11..edaaf6128f 100644
--- a/runtime/syntax/debchangelog.vim
+++ b/runtime/syntax/debchangelog.vim
@@ -1,29 +1,27 @@
" Vim syntax file
" Language: Debian changelog files
-" Maintainer: Debian Vim Maintainers <pkg-vim-maintainers@lists.alioth.debian.org>
+" Maintainer: Debian Vim Maintainers
" Former Maintainers: Gerfried Fuchs <alfie@ist.org>
" Wichert Akkerman <wakkerma@debian.org>
-" Last Change: 2015 Oct 24
-" URL: https://anonscm.debian.org/cgit/pkg-vim/vim.git/plain/runtime/syntax/debchangelog.vim
+" Last Change: 2018 May 03
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/master/syntax/debchangelog.vim
" Standard syntax initialization
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+if exists('b:current_syntax')
finish
endif
" Case doesn't matter for us
syn case ignore
-let urgency='urgency=\(low\|medium\|high\|critical\)\( [^[:space:],][^,]*\)\='
-let binNMU='binary-only=yes'
+let s:urgency='urgency=\(low\|medium\|high\|critical\)\( [^[:space:],][^,]*\)\='
+let s:binNMU='binary-only=yes'
" Define some common expressions we can use later on
syn match debchangelogName contained "^[[:alnum:]][[:alnum:].+-]\+ "
-exe 'syn match debchangelogFirstKV contained "; \('.urgency.'\|'.binNMU.'\)"'
-exe 'syn match debchangelogOtherKV contained ", \('.urgency.'\|'.binNMU.'\)"'
-syn match debchangelogTarget contained "\v %(frozen|unstable|sid|%(testing|%(old)=stable)%(-proposed-updates|-security)=|experimental|squeeze-%(backports%(-sloppy)=|volatile|lts|security)|wheezy-%(backports%(-sloppy)=|security)|jessie%(-backports|-security)=|stretch|%(devel|precise|trusty|vivid|wily|xenial)%(-%(security|proposed|updates|backports|commercial|partner))=)+"
+exe 'syn match debchangelogFirstKV contained "; \('.s:urgency.'\|'.s:binNMU.'\)"'
+exe 'syn match debchangelogOtherKV contained ", \('.s:urgency.'\|'.s:binNMU.'\)"'
+syn match debchangelogTarget contained "\v %(frozen|unstable|sid|%(testing|%(old)=stable)%(-proposed-updates|-security)=|experimental|squeeze-%(backports%(-sloppy)=|volatile|lts|security)|%(wheezy|jessie)%(-backports%(-sloppy)=|-security)=|stretch%(-backports|-security)=|%(devel|precise|trusty|vivid|wily|xenial|yakkety|zesty|artful|bionic|cosmic)%(-%(security|proposed|updates|backports|commercial|partner))=)+"
syn match debchangelogVersion contained "(.\{-})"
syn match debchangelogCloses contained "closes:\_s*\(bug\)\=#\=\_s\=\d\+\(,\_s*\(bug\)\=#\=\_s\=\d\+\)*"
syn match debchangelogLP contained "\clp:\s\+#\d\+\(,\s*#\d\+\)*"
@@ -36,29 +34,18 @@ syn region debchangelogFooter start="^ [^ ]" end="$" contains=debchangelogEmail
syn region debchangelogEntry start="^ " end="$" contains=debchangelogCloses,debchangelogLP oneline
" Associate our matches and regions with pretty colours
-if version >= 508 || !exists("did_debchangelog_syn_inits")
- if version < 508
- let did_debchangelog_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink debchangelogHeader Error
- HiLink debchangelogFooter Identifier
- HiLink debchangelogEntry Normal
- HiLink debchangelogCloses Statement
- HiLink debchangelogLP Statement
- HiLink debchangelogFirstKV Identifier
- HiLink debchangelogOtherKV Identifier
- HiLink debchangelogName Comment
- HiLink debchangelogVersion Identifier
- HiLink debchangelogTarget Identifier
- HiLink debchangelogEmail Special
-
- delcommand HiLink
-endif
-
-let b:current_syntax = "debchangelog"
+hi def link debchangelogHeader Error
+hi def link debchangelogFooter Identifier
+hi def link debchangelogEntry Normal
+hi def link debchangelogCloses Statement
+hi def link debchangelogLP Statement
+hi def link debchangelogFirstKV Identifier
+hi def link debchangelogOtherKV Identifier
+hi def link debchangelogName Comment
+hi def link debchangelogVersion Identifier
+hi def link debchangelogTarget Identifier
+hi def link debchangelogEmail Special
+
+let b:current_syntax = 'debchangelog'
" vim: ts=8 sw=2
diff --git a/runtime/syntax/debcontrol.vim b/runtime/syntax/debcontrol.vim
index 4fb53a55ca..9085cd01d5 100644
--- a/runtime/syntax/debcontrol.vim
+++ b/runtime/syntax/debcontrol.vim
@@ -1,15 +1,13 @@
" Vim syntax file
" Language: Debian control files
-" Maintainer: Debian Vim Maintainers <pkg-vim-maintainers@lists.alioth.debian.org>
+" Maintainer: Debian Vim Maintainers
" Former Maintainers: Gerfried Fuchs <alfie@ist.org>
" Wichert Akkerman <wakkerma@debian.org>
-" Last Change: 2015 Oct 24
-" URL: https://anonscm.debian.org/cgit/pkg-vim/vim.git/plain/runtime/syntax/debcontrol.vim
+" Last Change: 2018 Aug 11
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/master/syntax/debcontrol.vim
" Standard syntax initialization
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+if exists('b:current_syntax')
finish
endif
@@ -19,31 +17,59 @@ set cpo&vim
" Should match case except for the keys of each field
syn case match
+syn iskeyword @,48-57,-,/
+
" Everything that is not explicitly matched by the rules below
syn match debcontrolElse "^.*$"
" Common seperators
-syn match debControlComma ", *"
-syn match debControlSpace " "
-
-let s:kernels = '\%(linux\|hurd\|kfreebsd\|knetbsd\|kopensolaris\|netbsd\)'
-let s:archs = '\%(alpha\|amd64\|armeb\|armel\|armhf\|arm64\|avr32\|hppa\|i386'
- \ . '\|ia64\|lpia\|m32r\|m68k\|mipsel\|mips\|powerpcspe\|powerpc\|ppc64el'
- \ . '\|ppc64\|s390x\|s390\|sh3eb\|sh3\|sh4eb\|sh4\|sh\|sparc64\|sparc\|x32\)'
-let s:pairs = 'hurd-i386\|kfreebsd-i386\|kfreebsd-amd64\|knetbsd-i386\|kopensolaris-i386\|netbsd-alpha\|netbsd-i386'
+syn match debControlComma ",[ \t]*"
+syn match debControlSpace "[ \t]"
+
+let s:kernels = ['linux', 'hurd', 'kfreebsd', 'knetbsd', 'kopensolaris', 'netbsd']
+let s:archs = [
+ \ 'alpha', 'amd64', 'armeb', 'armel', 'armhf', 'arm64', 'avr32', 'hppa'
+ \, 'i386', 'ia64', 'lpia', 'm32r', 'm68k', 'mipsel', 'mips64el', 'mips'
+ \, 'powerpcspe', 'powerpc', 'ppc64el', 'ppc64', 'riscv64', 's390x', 's390', 'sh3eb'
+ \, 'sh3', 'sh4eb', 'sh4', 'sh', 'sparc64', 'sparc', 'x32'
+ \ ]
+let s:pairs = [
+ \ 'hurd-i386', 'kfreebsd-i386', 'kfreebsd-amd64', 'knetbsd-i386'
+ \, 'kopensolaris-i386', 'netbsd-alpha', 'netbsd-i386'
+ \ ]
" Define some common expressions we can use later on
-exe 'syn match debcontrolArchitecture contained "\%(all\|'. s:kernels .'-any\|\%(any-\)\='. s:archs .'\|'. s:pairs .'\|any\)"'
+syn keyword debcontrolArchitecture contained all any
+exe 'syn keyword debcontrolArchitecture contained '. join(map(copy(s:kernels), {k,v -> v .'-any'}))
+exe 'syn keyword debcontrolArchitecture contained '. join(map(copy(s:archs), {k,v -> 'any-'.v}))
+exe 'syn keyword debcontrolArchitecture contained '. join(s:archs)
+exe 'syn keyword debcontrolArchitecture contained '. join(s:pairs)
unlet s:kernels s:archs s:pairs
-syn match debcontrolMultiArch contained "\%(no\|foreign\|allowed\|same\)"
+let s:sections = [
+ \ 'admin', 'cli-mono', 'comm', 'database', 'debian-installer', 'debug'
+ \, 'devel', 'doc', 'editors', 'education', 'electronics', 'embedded'
+ \, 'fonts', 'games', 'gnome', 'gnustep', 'gnu-r', 'golang', 'graphics'
+ \, 'hamradio', 'haskell', 'httpd', 'interpreters', 'introspection'
+ \, 'java\%(script\)\=', 'kde', 'kernel', 'libs', 'libdevel', 'lisp'
+ \, 'localization', 'mail', 'math', 'metapackages', 'misc', 'net'
+ \, 'news', 'ocaml', 'oldlibs', 'otherosfs', 'perl', 'php', 'python'
+ \, 'ruby', 'rust', 'science', 'shells', 'sound', 'text', 'tex'
+ \, 'utils', 'vcs', 'video', 'web', 'x11', 'xfce', 'zope'
+ \ ]
+
+syn keyword debcontrolMultiArch contained no foreign allowed same
syn match debcontrolName contained "[a-z0-9][a-z0-9+.-]\+"
-syn match debcontrolPriority contained "\(extra\|important\|optional\|required\|standard\)"
-syn match debcontrolSection contained "\v((contrib|non-free|non-US/main|non-US/contrib|non-US/non-free|restricted|universe|multiverse)/)?(admin|cli-mono|comm|database|debian-installer|debug|devel|doc|editors|education|electronics|embedded|fonts|games|gnome|gnustep|gnu-r|graphics|hamradio|haskell|httpd|interpreters|introspection|java|kde|kernel|libs|libdevel|lisp|localization|mail|math|metapackages|misc|net|news|ocaml|oldlibs|otherosfs|perl|php|python|ruby|science|shells|sound|text|tex|utils|vcs|video|web|x11|xfce|zope)"
-syn match debcontrolPackageType contained "u\?deb"
+syn keyword debcontrolPriority contained extra important optional required standard
+exe 'syn match debcontrolSection contained "\%(\%(contrib\|non-free\|non-US/main\|non-US/contrib\|non-US/non-free\|restricted\|universe\|multiverse\)/\)\=\%('.join(s:sections, '\|').'\)"'
+syn keyword debcontrolPackageType contained udeb deb
syn match debcontrolVariable contained "\${.\{-}}"
-syn match debcontrolDmUpload contained "\cyes"
+syn keyword debcontrolDmUpload contained yes
+syn keyword debcontrolYesNo contained yes no
+syn match debcontrolR3 contained "\<\%(no\|binary-targets\|[[:graph:]]\+/[[:graph:]]\+\%( \+[[:graph:]]\+/[[:graph:]]\+\)*\)\>"
+
+unlet s:sections
" A URL (using the domain name definitions from RFC 1034 and 1738), right now
" only enforce protocol and some sanity on the server/path part;
@@ -61,64 +87,55 @@ syn match debcontrolComment "^#.*$" contains=@Spell
syn case ignore
-" List of all legal keys
-syn match debcontrolKey contained "^\%(Source\|Package\|Section\|Priority\|\%(XSBC-Original-\)\=Maintainer\|Uploaders\|Build-\%(Conflicts\|Depends\)\%(-Indep\)\=\|Standards-Version\|\%(Pre-\)\=Depends\|Recommends\|Suggests\|Provides\|Replaces\|Conflicts\|Enhances\|Breaks\|Essential\|Architecture\|Multi-Arch\|Description\|Bugs\|Origin\|X[SB]-Python-Version\|Homepage\|\(XS-\)\=Vcs-\(Browser\|Arch\|Bzr\|Cvs\|Darcs\|Git\|Hg\|Mtn\|Svn\)\|\%(XC-\)\=Package-Type\): *"
-
-syn match debcontrolDeprecatedKey contained "^\%(\%(XS-\)\=DM-Upload-Allowed\): *"
+" Handle all fields from deb-src-control(5)
" Fields for which we do strict syntax checking
-syn region debcontrolStrictField start="^Architecture" end="$" contains=debcontrolKey,debcontrolArchitecture,debcontrolSpace oneline
-syn region debcontrolStrictField start="^Multi-Arch" end="$" contains=debcontrolKey,debcontrolMultiArch oneline
-syn region debcontrolStrictField start="^\(Package\|Source\)" end="$" contains=debcontrolKey,debcontrolName oneline
-syn region debcontrolStrictField start="^Priority" end="$" contains=debcontrolKey,debcontrolPriority oneline
-syn region debcontrolStrictField start="^Section" end="$" contains=debcontrolKey,debcontrolSection oneline
-syn region debcontrolStrictField start="^\%(XC-\)\=Package-Type" end="$" contains=debcontrolKey,debcontrolPackageType oneline
-syn region debcontrolStrictField start="^Homepage" end="$" contains=debcontrolKey,debcontrolHTTPUrl oneline keepend
-syn region debcontrolStrictField start="^\%(XS-\)\=Vcs-\%(Browser\|Arch\|Bzr\|Darcs\|Hg\)" end="$" contains=debcontrolKey,debcontrolHTTPUrl oneline keepend
-syn region debcontrolStrictField start="^\%(XS-\)\=Vcs-Svn" end="$" contains=debcontrolKey,debcontrolVcsSvn,debcontrolHTTPUrl oneline keepend
-syn region debcontrolStrictField start="^\%(XS-\)\=Vcs-Cvs" end="$" contains=debcontrolKey,debcontrolVcsCvs oneline keepend
-syn region debcontrolStrictField start="^\%(XS-\)\=Vcs-Git" end="$" contains=debcontrolKey,debcontrolVcsGit oneline keepend
-syn region debcontrolStrictField start="^\%(XS-\)\=DM-Upload-Allowed" end="$" contains=debcontrolDeprecatedKey,debcontrolDmUpload oneline
+syn region debcontrolStrictField matchgroup=debcontrolKey start="^Architecture: *" end="$" contains=debcontrolArchitecture,debcontrolSpace oneline
+syn region debcontrolStrictField matchgroup=debcontrolKey start="^Multi-Arch: *" end="$" contains=debcontrolMultiArch oneline
+syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(Package\|Source\): *" end="$" contains=debcontrolName oneline
+syn region debcontrolStrictField matchgroup=debcontrolKey start="^Priority: *" end="$" contains=debcontrolPriority oneline
+syn region debcontrolStrictField matchgroup=debcontrolKey start="^Section: *" end="$" contains=debcontrolSection oneline
+syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XC-\)\=Package-Type: *" end="$" contains=debcontrolPackageType oneline
+syn region debcontrolStrictField matchgroup=debcontrolKey start="^Homepage: *" end="$" contains=debcontrolHTTPUrl oneline keepend
+syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XS-\)\=Vcs-\%(Browser\|Arch\|Bzr\|Darcs\|Hg\): *" end="$" contains=debcontrolHTTPUrl oneline keepend
+syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XS-\)\=Vcs-Svn: *" end="$" contains=debcontrolVcsSvn,debcontrolHTTPUrl oneline keepend
+syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XS-\)\=Vcs-Cvs: *" end="$" contains=debcontrolVcsCvs oneline keepend
+syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XS-\)\=Vcs-Git: *" end="$" contains=debcontrolVcsGit oneline keepend
+syn region debcontrolStrictField matchgroup=debcontrolKey start="^Rules-Requires-Root: *" end="$" contains=debcontrolR3 oneline
+syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(Build-\)\=Essential: *" end="$" contains=debcontrolYesNo oneline
+
+syn region debcontrolStrictField matchgroup=debcontrolDeprecatedKey start="^\%(XS-\)\=DM-Upload-Allowed: *" end="$" contains=debcontrolDmUpload oneline
" Catch-all for the other legal fields
-syn region debcontrolField start="^\%(\%(XSBC-Original-\)\=Maintainer\|Standards-Version\|Essential\|Bugs\|Origin\|X[SB]-Python-Version\|\%(XS-\)\=Vcs-Mtn\):" end="$" contains=debcontrolKey,debcontrolVariable,debcontrolEmail oneline
-syn region debcontrolMultiField start="^\%(Build-\%(Conflicts\|Depends\)\%(-Indep\)\=\|\%(Pre-\)\=Depends\|Recommends\|Suggests\|Provides\|Replaces\|Conflicts\|Enhances\|Breaks\|Uploaders\|Description\):" skip="^ " end="^$"me=s-1 end="^[^ #]"me=s-1 contains=debcontrolKey,debcontrolEmail,debcontrolVariable,debcontrolComment
-syn region debcontrolMultiFieldSpell start="^\%(Description\):" skip="^ " end="^$"me=s-1 end="^[^ #]"me=s-1 contains=debcontrolKey,debcontrolEmail,debcontrolVariable,debcontrolComment,@Spell
+syn region debcontrolField matchgroup=debcontrolKey start="^\%(\%(XSBC-Original-\)\=Maintainer\|Standards-Version\|Bugs\|Origin\|X[SB]-Python-Version\|\%(XS-\)\=Vcs-Mtn\|\%(XS-\)\=Testsuite\%(-Triggers\)\=\|Build-Profiles\|Tag\|Subarchitecture\|Kernel-Version\|Installer-Menu-Item\): " end="$" contains=debcontrolVariable,debcontrolEmail oneline
+syn region debcontrolMultiField matchgroup=debcontrolKey start="^\%(Build-\%(Conflicts\|Depends\)\%(-Arch\|-Indep\)\=\|\%(Pre-\)\=Depends\|Recommends\|Suggests\|Breaks\|Enhances\|Replaces\|Conflicts\|Provides\|Built-Using\|Uploaders\|X[SBC]\{0,3\}\%(Private-\)\=-[-a-zA-Z0-9]\+\): *" skip="^[ \t]" end="^$"me=s-1 end="^[^ \t#]"me=s-1 contains=debcontrolEmail,debcontrolVariable,debcontrolComment
+syn region debcontrolMultiFieldSpell matchgroup=debcontrolKey start="^Description: *" skip="^[ \t]" end="^$"me=s-1 end="^[^ \t#]"me=s-1 contains=debcontrolEmail,debcontrolVariable,debcontrolComment,@Spell
" Associate our matches and regions with pretty colours
-if version >= 508 || !exists("did_debcontrol_syn_inits")
- if version < 508
- let did_debcontrol_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink debcontrolKey Keyword
- HiLink debcontrolField Normal
- HiLink debcontrolStrictField Error
- HiLink debcontrolDeprecatedKey Error
- HiLink debcontrolMultiField Normal
- HiLink debcontrolArchitecture Normal
- HiLink debcontrolMultiArch Normal
- HiLink debcontrolName Normal
- HiLink debcontrolPriority Normal
- HiLink debcontrolSection Normal
- HiLink debcontrolPackageType Normal
- HiLink debcontrolVariable Identifier
- HiLink debcontrolEmail Identifier
- HiLink debcontrolVcsSvn Identifier
- HiLink debcontrolVcsCvs Identifier
- HiLink debcontrolVcsGit Identifier
- HiLink debcontrolHTTPUrl Identifier
- HiLink debcontrolDmUpload Identifier
- HiLink debcontrolComment Comment
- HiLink debcontrolElse Special
-
- delcommand HiLink
-endif
-
-let b:current_syntax = "debcontrol"
+hi def link debcontrolKey Keyword
+hi def link debcontrolField Normal
+hi def link debcontrolStrictField Error
+hi def link debcontrolDeprecatedKey Error
+hi def link debcontrolMultiField Normal
+hi def link debcontrolArchitecture Normal
+hi def link debcontrolMultiArch Normal
+hi def link debcontrolName Normal
+hi def link debcontrolPriority Normal
+hi def link debcontrolSection Normal
+hi def link debcontrolPackageType Normal
+hi def link debcontrolVariable Identifier
+hi def link debcontrolEmail Identifier
+hi def link debcontrolVcsSvn Identifier
+hi def link debcontrolVcsCvs Identifier
+hi def link debcontrolVcsGit Identifier
+hi def link debcontrolHTTPUrl Identifier
+hi def link debcontrolDmUpload Identifier
+hi def link debcontrolYesNo Identifier
+hi def link debcontrolR3 Identifier
+hi def link debcontrolComment Comment
+hi def link debcontrolElse Special
+
+let b:current_syntax = 'debcontrol'
let &cpo = s:cpo_save
unlet s:cpo_save
diff --git a/runtime/syntax/debcopyright.vim b/runtime/syntax/debcopyright.vim
new file mode 100644
index 0000000000..c85ca372d0
--- /dev/null
+++ b/runtime/syntax/debcopyright.vim
@@ -0,0 +1,33 @@
+" Vim syntax file
+" Language: Debian copyright file
+" Maintainer: Debian Vim Maintainers
+" Last Change: 2018 Feb 05
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/master/syntax/debcopyright.vim
+
+" Standard syntax initialization
+if exists('b:current_syntax')
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn case match
+
+syn match debcopyrightUrl "\vhttps?://[[:alnum:]][-[:alnum:]]*[[:alnum:]]?(\.[[:alnum:]][-[:alnum:]]*[[:alnum:]]?)*\.[[:alpha:]][-[:alnum:]]*[[:alpha:]]?(:\d+)?(/[^[:space:]]*)?$"
+syn match debcopyrightKey "^\%(Format\|Upstream-Name\|Upstream-Contact\|Disclaimer\|Source\|Comment\|Files\|Copyright\|License\): *"
+syn match debcopyrightEmail "[_=[:alnum:]\.+-]\+@[[:alnum:]\./\-]\+"
+syn match debcopyrightEmail "<.\{-}>"
+syn match debcopyrightComment "^#.*$" contains=@Spell
+
+hi def link debcopyrightUrl Identifier
+hi def link debcopyrightKey Keyword
+hi def link debcopyrightEmail Identifier
+hi def link debcopyrightComment Comment
+
+let b:current_syntax = 'debcopyright'
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/debsources.vim b/runtime/syntax/debsources.vim
index e0c5f4075f..74e8d42d1c 100644
--- a/runtime/syntax/debsources.vim
+++ b/runtime/syntax/debsources.vim
@@ -1,14 +1,12 @@
" Vim syntax file
" Language: Debian sources.list
-" Maintainer: Debian Vim Maintainers <pkg-vim-maintainers@lists.alioth.debian.org>
+" Maintainer: Debian Vim Maintainers
" Former Maintainer: Matthijs Mohlmann <matthijs@cacholong.nl>
-" Last Change: 2015 Oct 24
-" URL: https://anonscm.debian.org/cgit/pkg-vim/vim.git/plain/runtime/syntax/debsources.vim
+" Last Change: 2018 Aug 11
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/master/syntax/debsources.vim
" Standard syntax initialization
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+if exists('b:current_syntax')
finish
endif
@@ -25,25 +23,25 @@ let s:cpo = &cpo
set cpo-=C
let s:supported = [
\ 'oldstable', 'stable', 'testing', 'unstable', 'experimental',
- \ 'squeeze', 'wheezy', 'jessie', 'stretch', 'sid', 'rc-buggy',
+ \ 'wheezy', 'jessie', 'stretch', 'sid', 'rc-buggy',
\
- \ 'precise', 'trusty', 'vivid', 'wily', 'xenial', 'devel'
+ \ 'trusty', 'xenial', 'bionic', 'cosmic', 'devel'
\ ]
let s:unsupported = [
\ 'buzz', 'rex', 'bo', 'hamm', 'slink', 'potato',
- \ 'woody', 'sarge', 'etch', 'lenny',
+ \ 'woody', 'sarge', 'etch', 'lenny', 'squeeze',
\
\ 'warty', 'hoary', 'breezy', 'dapper', 'edgy', 'feisty',
\ 'gutsy', 'hardy', 'intrepid', 'jaunty', 'karmic', 'lucid',
- \ 'maverick', 'natty', 'oneiric', 'quantal', 'raring', 'saucy',
- \ 'utopic'
+ \ 'maverick', 'natty', 'oneiric', 'precise', 'quantal', 'raring', 'saucy',
+ \ 'utopic', 'vivid', 'wily', 'yakkety', 'zesty', 'artful'
\ ]
let &cpo=s:cpo
" Match uri's
-syn match debsourcesUri +\(http://\|ftp://\|[rs]sh://\|debtorrent://\|\(cdrom\|copy\|file\):\)[^' <>"]\++
-exe 'syn match debsourcesDistrKeyword +\([[:alnum:]_./]*\)\('. join(s:supported, '\|'). '\)\([-[:alnum:]_./]*\)+'
-exe 'syn match debsourcesUnsupportedDistrKeyword +\([[:alnum:]_./]*\)\('. join(s:unsupported, '\|') .'\)\([-[:alnum:]_./]*\)+'
+syn match debsourcesUri '\(https\?://\|ftp://\|[rs]sh://\|debtorrent://\|\(cdrom\|copy\|file\):\)[^' <>"]\+'
+exe 'syn match debsourcesDistrKeyword +\([[:alnum:]_./]*\)\<\('. join(s:supported, '\|'). '\)\>\([-[:alnum:]_./]*\)+'
+exe 'syn match debsourcesUnsupportedDistrKeyword +\([[:alnum:]_./]*\)\<\('. join(s:unsupported, '\|') .'\)\>\([-[:alnum:]_./]*\)+'
" Associate our matches and regions with pretty colours
hi def link debsourcesLine Error
@@ -53,4 +51,4 @@ hi def link debsourcesUnsupportedDistrKeyword WarningMsg
hi def link debsourcesComment Comment
hi def link debsourcesUri Constant
-let b:current_syntax = "debsources"
+let b:current_syntax = 'debsources'
diff --git a/runtime/syntax/def.vim b/runtime/syntax/def.vim
index 5efb41bc43..a17714c41e 100644
--- a/runtime/syntax/def.vim
+++ b/runtime/syntax/def.vim
@@ -5,11 +5,8 @@
" Last Change: $Date: 2007/10/02 13:51:24 $
" $Revision: 1.2 $
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -32,25 +29,15 @@ syn match defNumber "0x\x\+"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_def_syntax_inits")
- if version < 508
- let did_def_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink defComment Comment
- HiLink defKeyword Keyword
- HiLink defStorage StorageClass
- HiLink defString String
- HiLink defNumber Number
- HiLink defOrdinal Operator
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link defComment Comment
+hi def link defKeyword Keyword
+hi def link defStorage StorageClass
+hi def link defString String
+hi def link defNumber Number
+hi def link defOrdinal Operator
+
let b:current_syntax = "def"
diff --git a/runtime/syntax/denyhosts.vim b/runtime/syntax/denyhosts.vim
index 0ec09ba13e..f32faab168 100644
--- a/runtime/syntax/denyhosts.vim
+++ b/runtime/syntax/denyhosts.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: denyhosts configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2007-06-25
+" Language: denyhosts configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-06-25
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/desc.vim b/runtime/syntax/desc.vim
index ca47176ff7..84b9cd0f34 100644
--- a/runtime/syntax/desc.vim
+++ b/runtime/syntax/desc.vim
@@ -3,11 +3,8 @@
" Maintainer: Renรฉ Rebe <rene@exactcode.de>, Piotr Esden-Tempski <esden@rocklinux.org>
" Last Change: 2006 Aug 14
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -63,40 +60,29 @@ syn region descTagRegion start=/^\[\(F\|FLAG\)\]/ end=/$/ contains=descTag,descF
syn region descTagRegion start=/^\[\(L\|LICENSE\)\]/ end=/$/ contains=descTag,descLicense
-" For version 5.7 and earlier: only when not done already
-" Define the default highlighting.
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_desc_syntax_inits")
- if version < 508
- let did_desc_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink descFlag Identifier
- HiLink descLicense Identifier
- HiLink descCategory Identifier
-
- HiLink descTag Type
- HiLink descUrl Underlined
- HiLink descEmail Underlined
-
- " priority tag colors
- HiLink descInstallX Boolean
- HiLink descInstallO Type
- HiLink descDash Operator
- HiLink descDigit Number
- HiLink descCompilePriority Number
-
- " download tag colors
- HiLink descSum Number
- HiLink descTarball Underlined
-
- " tag region colors
- HiLink descText Comment
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link descFlag Identifier
+hi def link descLicense Identifier
+hi def link descCategory Identifier
+
+hi def link descTag Type
+hi def link descUrl Underlined
+hi def link descEmail Underlined
+
+" priority tag colors
+hi def link descInstallX Boolean
+hi def link descInstallO Type
+hi def link descDash Operator
+hi def link descDigit Number
+hi def link descCompilePriority Number
+
+" download tag colors
+hi def link descSum Number
+hi def link descTarball Underlined
+
+" tag region colors
+hi def link descText Comment
+
let b:current_syntax = "desc"
diff --git a/runtime/syntax/desktop.vim b/runtime/syntax/desktop.vim
index 5b71e51192..915107887a 100644
--- a/runtime/syntax/desktop.vim
+++ b/runtime/syntax/desktop.vim
@@ -3,14 +3,12 @@
" according to freedesktop.org specification 0.9.4
" http://pdx.freedesktop.org/Standards/desktop-entry-spec/desktop-entry-spec-0.9.4.html
" Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
-" Last Change: 2004 May 16
+" Last Change: 2016 Apr 02
+" (added "Keywords")
" Version Info: desktop.vim 0.9.4-1.2
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -53,8 +51,8 @@ syn keyword dtBooleanKey StartupNotify ReadOnly Terminal Hidden NoDisplay nextgr
syn keyword dtBooleanValue true false containedin=dtBoolean contained
" String
-syn match dtString /^\s*\<\(Encoding\|Icon\|Path\|Actions\|FSType\|MountPoint\|UnmountIcon\|URL\|Categories\|OnlyShowIn\|NotShowIn\|StartupWMClass\|FilePattern\|MimeType\)\>.*/ contains=dtStringKey,dtDelim transparent
-syn keyword dtStringKey Type Encoding TryExec Exec Path Actions FSType MountPoint URL Categories OnlyShowIn NotShowIn StartupWMClass FilePattern MimeType nextgroup=dtDelim containedin=dtString contained
+syn match dtString /^\s*\<\(Encoding\|Icon\|Path\|Actions\|FSType\|MountPoint\|UnmountIcon\|URL\|Keywords\|Categories\|OnlyShowIn\|NotShowIn\|StartupWMClass\|FilePattern\|MimeType\)\>.*/ contains=dtStringKey,dtDelim transparent
+syn keyword dtStringKey Type Encoding TryExec Exec Path Actions FSType MountPoint URL Keywords Categories OnlyShowIn NotShowIn StartupWMClass FilePattern MimeType nextgroup=dtDelim containedin=dtString contained
" Exec
syn match dtExec /^\s*\<\(Exec\|TryExec\|SwallowExec\)\>.*/ contains=dtExecKey,dtDelim,dtExecParam transparent
@@ -78,41 +76,31 @@ syn match dtALocale /\[.\{-}\]\s*=\@=/ containedin=ALL
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_desktop_syntax_inits")
- if version < 508
- let did_dosini_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink dtGroup Special
- HiLink dtComment Comment
- HiLink dtDelim String
-
- HiLink dtLocaleKey Type
- HiLink dtLocaleName Identifier
- HiLink dtXLocale Identifier
- HiLink dtALocale Identifier
-
- HiLink dtNumericKey Type
-
- HiLink dtBooleanKey Type
- HiLink dtBooleanValue Constant
-
- HiLink dtStringKey Type
-
- HiLink dtExecKey Type
- HiLink dtExecParam Special
- HiLink dtTypeKey Type
- HiLink dtTypeValue Constant
- HiLink dtNotStLabel Type
- HiLink dtXAddKey Type
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link dtGroup Special
+hi def link dtComment Comment
+hi def link dtDelim String
+
+hi def link dtLocaleKey Type
+hi def link dtLocaleName Identifier
+hi def link dtXLocale Identifier
+hi def link dtALocale Identifier
+
+hi def link dtNumericKey Type
+
+hi def link dtBooleanKey Type
+hi def link dtBooleanValue Constant
+
+hi def link dtStringKey Type
+
+hi def link dtExecKey Type
+hi def link dtExecParam Special
+hi def link dtTypeKey Type
+hi def link dtTypeValue Constant
+hi def link dtNotStLabel Type
+hi def link dtXAddKey Type
+
let b:current_syntax = "desktop"
diff --git a/runtime/syntax/dictconf.vim b/runtime/syntax/dictconf.vim
index e7fa476975..c762808c89 100644
--- a/runtime/syntax/dictconf.vim
+++ b/runtime/syntax/dictconf.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: dict(1) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: dict(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/dictdconf.vim b/runtime/syntax/dictdconf.vim
index 44bf6f8bad..ecf5fd346f 100644
--- a/runtime/syntax/dictdconf.vim
+++ b/runtime/syntax/dictdconf.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: dictd(8) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: dictd(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/diff.vim b/runtime/syntax/diff.vim
index 885feaebdd..b656cd97a6 100644
--- a/runtime/syntax/diff.vim
+++ b/runtime/syntax/diff.vim
@@ -2,7 +2,7 @@
" Language: Diff (context or unified)
" Maintainer: Bram Moolenaar <Bram@vim.org>
" Translations by Jakson Alves de Aquino.
-" Last Change: 2015 Feb 03
+" Last Change: 2016 Apr 02
" Quit when a (custom) syntax file was already loaded
if exists("b:current_syntax")
@@ -342,7 +342,7 @@ syn match diffLine "^\<\d\+\>.*"
syn match diffLine "^\*\*\*\*.*"
syn match diffLine "^---$"
-"Some versions of diff have lines like "#c#" and "#d#" (where # is a number)
+" Some versions of diff have lines like "#c#" and "#d#" (where # is a number)
syn match diffLine "^\d\+\(,\d\+\)\=[cda]\d\+\>.*"
syn match diffFile "^diff\>.*"
@@ -352,12 +352,16 @@ syn match diffFile "^==== .*"
syn match diffOldFile "^\*\*\* .*"
syn match diffNewFile "^--- .*"
+" Used by git
+syn match diffIndexLine "^index \x\x\x\x.*"
+
syn match diffComment "^#.*"
" Define the default highlighting.
" Only used when an item doesn't have highlighting yet
hi def link diffOldFile diffFile
hi def link diffNewFile diffFile
+hi def link diffIndexLine PreProc
hi def link diffFile Type
hi def link diffOnly Constant
hi def link diffIdentical Constant
diff --git a/runtime/syntax/dircolors.vim b/runtime/syntax/dircolors.vim
index 1b598c39b5..74a7068488 100644
--- a/runtime/syntax/dircolors.vim
+++ b/runtime/syntax/dircolors.vim
@@ -2,7 +2,7 @@
" Language: dircolors(1) input file
" Maintainer: Jan Larres <jan@majutsushi.net>
" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2013-08-17
+" Latest Revision: 2018-02-19
if exists("b:current_syntax")
finish
@@ -32,7 +32,7 @@ syntax match dircolorsEscape '\\[abefnrtv?_\\^#]'
syntax match dircolorsEscape '\\[0-9]\{3}'
syntax match dircolorsEscape '\\x[0-9a-f]\{3}'
-if !has('gui_running') && &t_Co == ''
+if !(has('gui_running') || &termguicolors) && &t_Co == ''
syntax match dircolorsNumber '\<\d\+\>'
highlight default link dircolorsNumber Number
endif
@@ -84,7 +84,7 @@ endfunction
function! s:get_hi_str(color, place) abort
if a:color >= 0 && a:color <= 255
- if has('gui_running')
+ if has('gui_running') || &termguicolors
return ' gui' . a:place . '=' . s:termguicolors[a:color]
elseif a:color <= 7 || &t_Co == 256 || &t_Co == 88
return ' cterm' . a:place . '=' . a:color
@@ -135,6 +135,12 @@ function! s:preview_color(linenr) abort
elseif item >= 40 && item <= 47
" ANSI SGR background color
let hi_str .= s:get_hi_str(item - 40, 'bg')
+ elseif item >= 90 && item <= 97
+ " ANSI SGR+8 foreground color (xterm 16-color support)
+ let hi_str .= s:get_hi_str(item - 82, 'fg')
+ elseif item >= 100 && item <= 107
+ " ANSI SGR+8 background color (xterm 16-color support)
+ let hi_str .= s:get_hi_str(item - 92, 'bg')
elseif item == 38
" Foreground for terminals with 88/256 color support
let color = s:get_256color(colors)
@@ -169,7 +175,7 @@ function! s:preview_color(linenr) abort
\ ' "\_s\zs' . colordef . '\ze\_s"'
let hi_attrs_str = ''
if !empty(hi_attrs)
- if has('gui_running')
+ if has('gui_running') || &termguicolors
let hi_attrs_str = ' gui=' . join(hi_attrs, ',')
else
let hi_attrs_str = ' cterm=' . join(hi_attrs, ',')
@@ -199,11 +205,11 @@ endfunction
let b:dc_next_index = 0
-if has('gui_running')
+if has('gui_running') || &termguicolors
call s:set_guicolors()
endif
-if has('gui_running') || &t_Co != ''
+if has('gui_running') || &termguicolors || &t_Co != ''
call s:reset_colors()
autocmd CursorMoved,CursorMovedI <buffer> call s:preview_color('.')
diff --git a/runtime/syntax/diva.vim b/runtime/syntax/diva.vim
index 78668fd85a..127a0b4663 100644
--- a/runtime/syntax/diva.vim
+++ b/runtime/syntax/diva.vim
@@ -11,11 +11,7 @@
" Don't remove any old syntax stuff hanging around! We need stuff
" from skill.vim.
if !exists("did_skill_syntax_inits")
- if version < 600
- so <sfile>:p:h/skill.vim
- else
- runtime! syntax/skill.vim
- endif
+ runtime! syntax/skill.vim
endif
syn keyword divaDRCKeywords area enc notch ovlp sep width
@@ -81,29 +77,19 @@ syn match divaGeomFunctions "(geom\u\a\+\(45\|90\)\=\>"hs=s+1
syn match divaGeomFunctions "\<geom\u\a\+\(45\|90\)\=("he=e-1
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_diva_syntax_inits")
- if version < 508
- let did_diva_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink divaDRCKeywords Statement
- HiLink divaMeasKeywords Statement
- HiLink divaCtrlFunctions Conditional
- HiLink divaExtFunctions Function
- HiLink divaDRCFunctions Function
- HiLink divaFunctions Function
- HiLink divaLayerFunctions Function
- HiLink divaChkFunctions Function
- HiLink divaLVSFunctions Function
- HiLink divaGeomFunctions Function
+hi def link divaDRCKeywords Statement
+hi def link divaMeasKeywords Statement
+hi def link divaCtrlFunctions Conditional
+hi def link divaExtFunctions Function
+hi def link divaDRCFunctions Function
+hi def link divaFunctions Function
+hi def link divaLayerFunctions Function
+hi def link divaChkFunctions Function
+hi def link divaLVSFunctions Function
+hi def link divaGeomFunctions Function
- delcommand HiLink
-endif
let b:current_syntax = "diva"
diff --git a/runtime/syntax/django.vim b/runtime/syntax/django.vim
index da315ac302..d3ca4de0e2 100644
--- a/runtime/syntax/django.vim
+++ b/runtime/syntax/django.vim
@@ -3,11 +3,8 @@
" Maintainer: Dave Hodder <dmh@dmh.org.uk>
" Last Change: 2014 Jul 13
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -68,29 +65,19 @@ syn region djangoComment start="{%\s*comment\(\s\+.\{-}\)\?%}" end="{%\s*endcomm
syn region djangoComBlock start="{#" end="#}" contains=djangoTodo
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_django_syn_inits")
- if version < 508
- let did_django_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink djangoTagBlock PreProc
- HiLink djangoVarBlock PreProc
- HiLink djangoStatement Statement
- HiLink djangoFilter Identifier
- HiLink djangoArgument Constant
- HiLink djangoTagError Error
- HiLink djangoVarError Error
- HiLink djangoError Error
- HiLink djangoComment Comment
- HiLink djangoComBlock Comment
- HiLink djangoTodo Todo
+hi def link djangoTagBlock PreProc
+hi def link djangoVarBlock PreProc
+hi def link djangoStatement Statement
+hi def link djangoFilter Identifier
+hi def link djangoArgument Constant
+hi def link djangoTagError Error
+hi def link djangoVarError Error
+hi def link djangoError Error
+hi def link djangoComment Comment
+hi def link djangoComBlock Comment
+hi def link djangoTodo Todo
- delcommand HiLink
-endif
let b:current_syntax = "django"
diff --git a/runtime/syntax/dnsmasq.vim b/runtime/syntax/dnsmasq.vim
index 9fa32077b6..a4cc8b577b 100644
--- a/runtime/syntax/dnsmasq.vim
+++ b/runtime/syntax/dnsmasq.vim
@@ -20,10 +20,8 @@
" endif
"
-" For version 5.x: Clear all syntax items
-if v:version < 600
- syntax clear
-elseif exists("b:current_syntax") || &compatible
+" quit when a syntax file was already loaded
+if exists("b:current_syntax") || &compatible
finish
endif
diff --git a/runtime/syntax/docbk.vim b/runtime/syntax/docbk.vim
index fc679eecaf..809f2894e6 100644
--- a/runtime/syntax/docbk.vim
+++ b/runtime/syntax/docbk.vim
@@ -13,11 +13,8 @@
" http://www.open-oasis.org/docbook/
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -174,26 +171,15 @@ syn region docbkRemark start="<comment>"lc=9 end="</comment>"me=e-10 contains=x
syn region docbkCite start="<citation>"lc=10 end="</citation>"me=e-11 contains=xmlRegion,xmlEntity,sgmlRegion,sgmlEntity keepend
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_docbk_syn_inits")
- if version < 508
- let did_docbk_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- hi DocbkBold term=bold cterm=bold gui=bold
- else
- command -nargs=+ HiLink hi def link <args>
- hi def DocbkBold term=bold cterm=bold gui=bold
- endif
+" Only when an item doesn't have highlighting yet
+hi def DocbkBold term=bold cterm=bold gui=bold
- HiLink docbkKeyword Statement
- HiLink docbkRegion DocbkBold
- HiLink docbkTitle Title
- HiLink docbkRemark Comment
- HiLink docbkCite Constant
+hi def link docbkKeyword Statement
+hi def link docbkRegion DocbkBold
+hi def link docbkTitle Title
+hi def link docbkRemark Comment
+hi def link docbkCite Constant
- delcommand HiLink
-endif
let b:current_syntax = "docbk"
diff --git a/runtime/syntax/dockerfile.vim b/runtime/syntax/dockerfile.vim
index d1693cba41..15b66925e5 100644
--- a/runtime/syntax/dockerfile.vim
+++ b/runtime/syntax/dockerfile.vim
@@ -1,7 +1,7 @@
" dockerfile.vim - Syntax highlighting for Dockerfiles
-" Maintainer: Honza Pokorny <http://honza.ca>
-" Version: 0.5
-" Last Change: 2014 Aug 29
+" Maintainer: Honza Pokorny <https://honza.ca>
+" Version: 0.6
+" Last Change: 2016 Aug 9
" License: BSD
@@ -13,7 +13,7 @@ let b:current_syntax = "dockerfile"
syntax case ignore
-syntax match dockerfileKeyword /\v^\s*(ONBUILD\s+)?(ADD|CMD|ENTRYPOINT|ENV|EXPOSE|FROM|MAINTAINER|RUN|USER|VOLUME|WORKDIR|COPY)\s/
+syntax match dockerfileKeyword /\v^\s*(ONBUILD\s+)?(ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)\s/
syntax region dockerfileString start=/\v"/ skip=/\v\\./ end=/\v"/
diff --git a/runtime/syntax/dosbatch.vim b/runtime/syntax/dosbatch.vim
index d9b1aa6703..249e6f7c46 100644
--- a/runtime/syntax/dosbatch.vim
+++ b/runtime/syntax/dosbatch.vim
@@ -9,11 +9,8 @@
" dosbatch_cmdextversion - 1 = Windows NT, 2 = Windows 2000 [default]
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -111,49 +108,39 @@ syn keyword dosbatchImplicit sort start subst time title tree type ver verify
syn keyword dosbatchImplicit vol xcopy
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_dosbatch_syntax_inits")
- if version < 508
- let did_dosbatch_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink dosbatchTodo Todo
-
- HiLink dosbatchStatement Statement
- HiLink dosbatchCommands dosbatchStatement
- HiLink dosbatchLabel Label
- HiLink dosbatchConditional Conditional
- HiLink dosbatchRepeat Repeat
-
- HiLink dosbatchOperator Operator
- HiLink dosbatchEchoOperator dosbatchOperator
- HiLink dosbatchIfOperator dosbatchOperator
-
- HiLink dosbatchArgument Identifier
- HiLink dosbatchIdentifier Identifier
- HiLink dosbatchVariable dosbatchIdentifier
-
- HiLink dosbatchSpecialChar SpecialChar
- HiLink dosbatchString String
- HiLink dosbatchNumber Number
- HiLink dosbatchInteger dosbatchNumber
- HiLink dosbatchHex dosbatchNumber
- HiLink dosbatchBinary dosbatchNumber
- HiLink dosbatchOctal dosbatchNumber
-
- HiLink dosbatchComment Comment
- HiLink dosbatchImplicit Function
-
- HiLink dosbatchSwitch Special
-
- HiLink dosbatchCmd PreProc
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link dosbatchTodo Todo
+
+hi def link dosbatchStatement Statement
+hi def link dosbatchCommands dosbatchStatement
+hi def link dosbatchLabel Label
+hi def link dosbatchConditional Conditional
+hi def link dosbatchRepeat Repeat
+
+hi def link dosbatchOperator Operator
+hi def link dosbatchEchoOperator dosbatchOperator
+hi def link dosbatchIfOperator dosbatchOperator
+
+hi def link dosbatchArgument Identifier
+hi def link dosbatchIdentifier Identifier
+hi def link dosbatchVariable dosbatchIdentifier
+
+hi def link dosbatchSpecialChar SpecialChar
+hi def link dosbatchString String
+hi def link dosbatchNumber Number
+hi def link dosbatchInteger dosbatchNumber
+hi def link dosbatchHex dosbatchNumber
+hi def link dosbatchBinary dosbatchNumber
+hi def link dosbatchOctal dosbatchNumber
+
+hi def link dosbatchComment Comment
+hi def link dosbatchImplicit Function
+
+hi def link dosbatchSwitch Special
+
+hi def link dosbatchCmd PreProc
+
let b:current_syntax = "dosbatch"
diff --git a/runtime/syntax/dosini.vim b/runtime/syntax/dosini.vim
index e474f21116..cf42819bcd 100644
--- a/runtime/syntax/dosini.vim
+++ b/runtime/syntax/dosini.vim
@@ -1,50 +1,39 @@
" Vim syntax file
" Language: Configuration File (ini file) for MSDOS/MS Windows
-" Version: 2.1
+" Version: 2.2
" Original Author: Sean M. McKee <mckee@misslink.net>
" Previous Maintainer: Nima Talebi <nima@it.net.au>
-" Current Maintainer: Hong Xu <xuhdev@gmail.com>
+" Current Maintainer: Hong Xu <hong@topbug.net>
" Homepage: http://www.vim.org/scripts/script.php?script_id=3747
-" https://bitbucket.org/xuhdev/syntax-dosini.vim
-" Last Change: 2011 Nov 8
+" Repository: https://github.com/xuhdev/syntax-dosini.vim
+" Last Change: 2018 Sep 11
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" shut case off
syn case ignore
-syn match dosiniNumber "\<\d\+\>"
-syn match dosiniNumber "\<\d*\.\d\+\>"
-syn match dosiniNumber "\<\d\+e[+-]\=\d\+\>"
-syn match dosiniLabel "^.\{-}="
+syn match dosiniLabel "^.\{-}\ze\s*=" nextgroup=dosiniNumber,dosiniValue
+syn match dosiniValue "=\zs.*"
+syn match dosiniNumber "=\zs\s*\d\+\s*$"
+syn match dosiniNumber "=\zs\s*\d*\.\d\+\s*$"
+syn match dosiniNumber "=\zs\s*\d\+e[+-]\=\d\+\s*$"
syn region dosiniHeader start="^\s*\[" end="\]"
syn match dosiniComment "^[#;].*$"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_dosini_syntax_inits")
- if version < 508
- let did_dosini_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink dosiniNumber Number
- HiLink dosiniHeader Special
- HiLink dosiniComment Comment
- HiLink dosiniLabel Type
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link dosiniNumber Number
+hi def link dosiniHeader Special
+hi def link dosiniComment Comment
+hi def link dosiniLabel Type
+hi def link dosiniValue String
+
let b:current_syntax = "dosini"
diff --git a/runtime/syntax/dot.vim b/runtime/syntax/dot.vim
index 4cc6f4f21d..0fdd6ea080 100644
--- a/runtime/syntax/dot.vim
+++ b/runtime/syntax/dot.vim
@@ -6,11 +6,8 @@
" Last Change: 2011 May 17 - improved identifier matching + two new keywords
" 2001 May 04 - initial version
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -74,36 +71,26 @@ syn sync minlines=50
syn sync maxlines=500
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_dot_syntax_inits")
- if version < 508
- let did_dot_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink dotParErr Error
- HiLink dotBraceErr Error
- HiLink dotBrackErr Error
-
- HiLink dotComment Comment
- HiLink dotTodo Todo
-
- HiLink dotParEncl Keyword
- HiLink dotBrackEncl Keyword
- HiLink dotBraceEncl Keyword
-
- HiLink dotKeyword Keyword
- HiLink dotType Type
- HiLink dotKeyChar Keyword
-
- HiLink dotString String
- HiLink dotIdentifier Identifier
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link dotParErr Error
+hi def link dotBraceErr Error
+hi def link dotBrackErr Error
+
+hi def link dotComment Comment
+hi def link dotTodo Todo
+
+hi def link dotParEncl Keyword
+hi def link dotBrackEncl Keyword
+hi def link dotBraceEncl Keyword
+
+hi def link dotKeyword Keyword
+hi def link dotType Type
+hi def link dotKeyChar Keyword
+
+hi def link dotString String
+hi def link dotIdentifier Identifier
+
let b:current_syntax = "dot"
diff --git a/runtime/syntax/doxygen.vim b/runtime/syntax/doxygen.vim
index cadbf54dc5..adc0c41dd6 100644
--- a/runtime/syntax/doxygen.vim
+++ b/runtime/syntax/doxygen.vim
@@ -2,10 +2,10 @@
" Language: doxygen on top of c, cpp, idl, java, php
" Maintainer: Michael Geddes <vimmer@frog.wheelycreek.net>
" Author: Michael Geddes
-" Last Change: Jan 2009 (\tparam by Domnique Pelle, Aug 2013)
-" Version: 1.23
+" Last Change: November 2017 (\throws by Candy Gumdrop)
+" Version: 1.27
"
-" Copyright 2004-2008 Michael Geddes
+" Copyright 2004-2017 Michael Geddes
" Please feel free to use, modify & distribute all or part of this script,
" providing this copyright message remains.
" I would appreciate being acknowledged in any derived scripts, and would
@@ -58,52 +58,76 @@ try
"
" C/C++ Style line comments
- syn region doxygenComment start=+/\*\(\*/\)\@![*!]+ end=+\*/+ contains=doxygenSyncStart,doxygenStart,doxygenTODO keepend fold containedin=phpRegion
- syn region doxygenCommentL start=+//[/!]<\@!+me=e-1 end=+$+ contains=doxygenStartL,@Spell keepend skipwhite skipnl nextgroup=doxygenComment2 fold containedin=phpRegion
+ syn match doxygenCommentWhite +\s*\ze/\*\(\*/\)\@![*!]+ containedin=phpRegion
+ syn match doxygenCommentWhite +\s*\ze//[/!]+ containedin=phpRegion
+ syn match doxygenCommentWhite +\s*\ze/\*\(\*/\)\@![*!]+
+ syn match doxygenCommentWhite +\s*\ze//[/!]+ containedin=phpRegion
+
+ syn region doxygenComment start=+/\*\(\*/\)\@![*!]+ end=+\*/+ contains=doxygenSyncStart,doxygenStart,doxygenTODO,doxygenLeadingWhite keepend fold containedin=phpRegion
+ syn region doxygenCommentL start=+//[/!]<\@!+me=e-1 end=+$+ contains=doxygenLeadingLWhite,doxygenStartL,@Spell keepend skipwhite skipnl nextgroup=doxygenCommentWhite2 fold containedin=phpRegion
syn region doxygenCommentL start=+//[/!]<+me=e-2 end=+$+ contains=doxygenStartL,@Spell keepend skipwhite skipnl fold containedin=phpRegion
syn region doxygenCommentL start=+//@\ze[{}]+ end=+$+ contains=doxygenGroupDefine,doxygenGroupDefineSpecial,@Spell fold containedin=phpRegion
+ syn region doxygenComment start=+/\*@\ze[{}]+ end=+\*/+ contains=doxygenGroupDefine,doxygenGroupDefineSpecial,@Spell fold containedin=phpRegion
" Single line brief followed by multiline comment.
+ syn match doxygenCommentWhite2 +\_s*\ze/\*\(\*/\)\@![*!]+ contained nextgroup=doxygenComment2
syn region doxygenComment2 start=+/\*\(\*/\)\@![*!]+ end=+\*/+ contained contains=doxygenSyncStart2,doxygenStart2,doxygenTODO keepend fold
" This helps with sync-ing as for some reason, syncing behaves differently to a normal region, and the start pattern does not get matched.
syn match doxygenSyncStart2 +[^*/]+ contained nextgroup=doxygenBody,doxygenPrev,doxygenStartSpecial,doxygenSkipComment,doxygenStartSkip2 skipwhite skipnl
" Skip empty lines at the start for when comments start on the 2nd/3rd line.
- syn match doxygenStartSkip2 +^\s*\*[^/]+me=e-1 contained nextgroup=doxygenBody,doxygenStartSpecial,doxygenStartSkip skipwhite skipnl
- syn match doxygenStartSkip2 +^\s*\*$+ contained nextgroup=doxygenBody,doxygenStartSpecial,,doxygenStartSkip skipwhite skipnl
+ syn match doxygenStartSkip2 +^\s*\*[^/]+me=e-1 contained nextgroup=doxygenBody,doxygenStartSpecial,doxygenStartSkipWhite skipwhite skipnl
+ syn match doxygenStartSkip2 +^\s*\*$+ contained nextgroup=doxygenBody,doxygenStartSpecial,doxygenStartSkipWhite skipwhite skipnl
syn match doxygenStart2 +/\*[*!]+ contained nextgroup=doxygenBody,doxygenPrev,doxygenStartSpecial,doxygenStartSkip2 skipwhite skipnl
" Match the Starting pattern (effectively creating the start of a BNF)
if !exists('g:doxygen_javadoc_autobrief') || g:doxygen_javadoc_autobrief
- syn match doxygenStart +/\*[*!]+ contained nextgroup=doxygenBrief,doxygenPrev,doxygenFindBriefSpecial,doxygenStartSpecial,doxygenStartSkip,doxygenPage skipwhite skipnl
- syn match doxygenStartL +//[/!]+ contained nextgroup=doxygenPrevL,doxygenBriefL,doxygenSpecial skipwhite
+ syn match doxygenStart +/\*[*!]+ contained nextgroup=doxygenBrief,doxygenPrev,doxygenFindBriefSpecial,doxygenStartSpecial,doxygenStartSkipWhite,doxygenPage skipwhite skipnl
+ syn match doxygenLeadingLWhite +\s\++ contained nextgroup=doxygenPrevL,doxygenBriefL,doxygenSpecial
+ syn match doxygenStartL +//[/!]+ contained nextgroup=doxygenLeaingLWhite,doxygenPrevL,doxygenBriefL,doxygenSpecial
" Match the first sentence as a brief comment
if ! exists('g:doxygen_end_punctuation')
let g:doxygen_end_punctuation='[.]'
endif
- exe 'syn region doxygenBrief contained start=+[\\@]\([npcbea]\>\|em\>\|ref\>\|link\>\|f\$\|[$\\&<>#]\)\|[^ \t\\@*]+ start=+\(^\s*\)\@<!\*/\@!+ start=+\<\k+ skip=+'.doxygen_end_punctuation.'\S\@=+ end=+'.doxygen_end_punctuation.'+ end=+\(\s*\(\n\s*\*\=\s*\)[@\\]\([npcbea]\>\|em\>\|ref\>\|link\>\|f\$\|[$\\&<>#]\)\@!\)\@=+ contains=doxygenSmallSpecial,doxygenContinueComment,doxygenBriefEndComment,doxygenFindBriefSpecial,doxygenSmallSpecial,@doxygenHtmlGroup,doxygenTODO,doxygenHyperLink,doxygenHashLink,@Spell skipnl nextgroup=doxygenBody'
+ exe 'syn region doxygenBrief contained start=+[\\@]\([npcbea]\>\|em\>\|ref\>\|link\>\|f\$\|[$\\&<>#]\)\|[^ \t\\@*]+ start=+\(^\s*\)\@<!\*/\@!+ start=+\<\k+ skip=+'.doxygen_end_punctuation.'\S\@=+ end=+'.doxygen_end_punctuation.'+ end=+\(\s*\(\n\s*\*\=\s*\)[@\\]\([npcbea]\>\|em\>\|ref\>\|link\>\|f\$\|[$\\&<>#]\)\@!\)\@=+ contains=doxygenSmallSpecial,doxygenContinueCommentWhite,doxygenLeadingWhite,doxygenBriefEndComment,doxygenFindBriefSpecial,doxygenSmallSpecial,@doxygenHtmlGroup,doxygenTODO,doxygenHyperLink,doxygenHashLink,@Spell skipnl nextgroup=doxygenBody'
syn match doxygenBriefEndComment +\*/+ contained
exe 'syn region doxygenBriefL start=+@\k\@!\|[\\@]\([npcbea]\>\|em\>\|ref\>\|link\>\|f\$\|[$\\&<>#]\)\|[^ \t\\@]+ start=+\<+ skip=+'.doxygen_end_punctuation.'\S+ end=+'.doxygen_end_punctuation.'\|$+ contained contains=doxygenSmallSpecial,doxygenHyperLink,doxygenHashLink,@doxygenHtmlGroup,@Spell keepend'
syn match doxygenPrevL +<+ contained nextgroup=doxygenBriefL,doxygenSpecial skipwhite
else
- syn match doxygenStart +/\*[*!]+ contained nextgroup=doxygenBody,doxygenPrev,doxygenFindBriefSpecial,doxygenStartSpecial,doxygenStartSkip,doxygenPage skipwhite skipnl
- syn match doxygenStartL +//[/!]+ contained nextgroup=doxygenPrevL,doxygenLine,doxygenSpecial skipwhite
+ syn match doxygenStart +/\*[*!]+ contained nextgroup=doxygenBody,doxygenPrev,doxygenFindBriefSpecial,doxygenStartSpecial,doxygenStartSkipWhite,doxygenPage skipwhite skipnl
+ syn match doxygenStartL +//[/!]+ contained nextgroup=doxygenLeadingLWhite,doxygenPrevL,doxygenLine,doxygenSpecial
+ syn match doxygenLeadingLWhite +\s\++ contained nextgroup=doxygenPrevL,doxygenLine,doxygenSpecial
syn region doxygenLine start=+@\k\@!\|[\\@]\([npcbea]\>\|em\>\|ref\>\|link\>\|f\$\|[$\\&<>#]\)\|[^ \t\\@<]+ start=+\<+ end='$' contained contains=doxygenSmallSpecial,doxygenHyperLink,doxygenHashLink,@doxygenHtmlGroup,@Spell keepend
syn match doxygenPrevL +<+ contained nextgroup=doxygenLine,doxygenSpecial skipwhite
endif
" This helps with sync-ing as for some reason, syncing behaves differently to a normal region, and the start pattern does not get matched.
- syn match doxygenSyncStart +\ze[^*/]+ contained nextgroup=doxygenBrief,doxygenPrev,doxygenStartSpecial,doxygenFindBriefSpecial,doxygenStartSkip,doxygenPage skipwhite skipnl
+ syn match doxygenSyncStart +\ze[^*/]+ contained nextgroup=doxygenBrief,doxygenPrev,doxygenStartSpecial,doxygenFindBriefSpecial,doxygenStartSkipWhite,doxygenPage skipwhite skipnl
+ " Match an [@\]brief so that it moves to body-mode.
+ "
+ "
+ " syn match doxygenBriefLine contained
+ syn match doxygenBriefSpecial contained +[@\\]+ nextgroup=doxygenBriefWord skipwhite
+ " syn region doxygenFindBriefSpecial start=+[@\\]brief\>+ end=+\(\n\s*\*\=\s*\([@\\]\([npcbea]\>\|em\>\|ref\>\|link\>\|f\$\|[$\\&<>#]\)\@!\)\|\s*$\)\@=+ keepend contains=doxygenBriefSpecial nextgroup=doxygenBody keepend skipwhite skipnl contained
+ syn region doxygenFindBriefSpecial start=+[@\\]brief\>+ skip=+^\s*\(\*/\@!\s*\)\=\(\<\|[@\\]\<\([npcbea]\>\|em\>\|ref\|link\>\>\|f\$\|[$\\&<>#]\)\|[^ \t\\@*]\)+ end=+^+ keepend contains=doxygenBriefSpecial nextgroup=doxygenBody keepend skipwhite skipnl contained
+
+
+
+" end=+\(\n\s*\*\=\s*\([@\\]\([npcbea]\>\|em\>\|ref\>\|link\>\|f\$\|[$\\&<>#]\)\@!\)\|\s*$\)\@=+
+"syn region doxygenBriefLine contained start=+\<\k+ skip=+^\s*\(\*/\@!\s*\)\=\(\<\|[@\\]\<\([npcbea]\>\|em\>\|ref\|link\>\>\|f\$\|[$\\&<>#]\)\|[^ \t\\@*]\)+ end=+^+ contains=doxygenContinueCommentWhite,doxygenSmallSpecial,@doxygenHtmlGroup,doxygenTODO,doxygenHyperLink,doxygenHashLink,@Spell skipwhite keepend matchgroup=xxx
+syn region doxygenBriefLine contained start=+\<\k+ skip=+^\s*\(\*/\@!\s*\)\=\(\<\|[@\\]\<\([npcbea]\>\|em\>\|ref\|link\>\>\|f\$\|[$\\&<>#]\)\|[^ \t\\@*]\)+ end=+^+ skipwhite keepend matchgroup=xxx
+" syn region doxygenBriefLine matchgroup=xxxy contained start=+\<\k.\++ skip=+^\s*\k+ end=+end+ skipwhite keepend
+"doxygenFindBriefSpecial,
+ "" syn region doxygenSpecialMultilineDesc start=+.\++ contained contains=doxygenSpecialContinueCommentWhite,doxygenSmallSpecial,doxygenHyperLink,doxygenHashLink,@doxygenHtmlGroup,@Spell skipwhite keepend
- syn region doxygenBriefLine contained start=+\<\k+ end=+\(\n\s*\*\=\s*\([@\\]\([npcbea]\>\|em\>\|ref\>\|link\>\|f\$\|[$\\&<>#]\)\@!\)\|\s*$\)\@=+ contains=doxygenContinueComment,doxygenFindBriefSpecial,doxygenSmallSpecial,@doxygenHtmlGroup,doxygenTODO,doxygenHyperLink,doxygenHashLink,@Spell skipwhite keepend
" Match a '<' for applying a comment to the previous element.
- syn match doxygenPrev +<+ contained nextgroup=doxygenBrief,doxygenBody,doxygenSpecial,doxygenStartSkip skipwhite
+ syn match doxygenPrev +<+ contained nextgroup=doxygenBrief,doxygenBody,doxygenSpecial,doxygenStartSkipWhite skipwhite
if exists("c_comment_strings")
" These are anti-Doxygen comments. If there are more than two asterisks or 3 '/'s
@@ -122,10 +146,11 @@ endif
"syn region doxygenBodyBit contained start=+$+
" The main body of a doxygen comment.
- syn region doxygenBody contained start=+\(/\*[*!]\)\@<!<\|[^<]\|$+ matchgroup=doxygenEndComment end=+\*/+re=e-2,me=e-2 contains=doxygenContinueComment,doxygenTODO,doxygenSpecial,doxygenSmallSpecial,doxygenHyperLink,doxygenHashLink,@doxygenHtmlGroup,@Spell
+ syn region doxygenBody contained start=+\(/\*[*!]\)\@<!<\|[^<]\|$+ matchgroup=doxygenEndComment end=+\*/+re=e-2,me=e-2 contains=doxygenContinueCommentWhite,doxygenTODO,doxygenSpecial,doxygenSmallSpecial,doxygenHyperLink,doxygenHashLink,@doxygenHtmlGroup,@Spell
" These allow the skipping of comment continuation '*' characters.
- syn match doxygenContinueComment contained +^\s*\*/\@!\s*+
+ syn match doxygenContinueCommentWhite contained +^\s*\ze\*+ nextgroup=doxygenContinueComment
+ syn match doxygenContinueComment contained +\*/\@!+
" Catch a Brief comment without punctuation - flag it as an error but
" make sure the end comment is picked up also.
@@ -134,27 +159,19 @@ endif
" Skip empty lines at the start for when comments start on the 2nd/3rd line.
if !exists('g:doxygen_javadoc_autobrief') || g:doxygen_javadoc_autobrief
- syn match doxygenStartSkip +^\s*\*[^/]+me=e-1 contained nextgroup=doxygenBrief,doxygenStartSpecial,doxygenFindBriefSpecial,doxygenStartSkip,doxygenPage skipwhite skipnl
- syn match doxygenStartSkip +^\s*\*$+ contained nextgroup=doxygenBrief,doxygenStartSpecial,doxygenFindBriefSpecial,doxygenStartSkip,doxygenPage skipwhite skipnl
+ syn match doxygenStartSkipWhite +^\s*\ze\*/\@!+ contained nextgroup=doxygenBrief,doxygenStartSpecial,doxygenFindBriefSpecial,doxygenStartSkipWhite,doxygenPage skipwhite skipnl
+ "syn match doxygenStartSkipWhite +^\s*\ze\*$+ contained nextgroup=doxygenBrief,doxygenStartSpecial,doxygenFindBriefSpecial,doxygenStartSkipWhite,doxygenPage skipwhite skipnl
else
- syn match doxygenStartSkip +^\s*\*[^/]+me=e-1 contained nextgroup=doxygenStartSpecial,doxygenFindBriefSpecial,doxygenStartSkip,doxygenPage,doxygenBody skipwhite skipnl
- syn match doxygenStartSkip +^\s*\*$+ contained nextgroup=doxygenStartSpecial,doxygenFindBriefSpecial,doxygenStartSkip,doxygenPage,doxygenBody skipwhite skipnl
+ syn match doxygenStartSkipWhite +^\s*\*[^/]+me=e-1 contained nextgroup=doxygenStartSpecial,doxygenFindBriefSpecial,doxygenStartSkipWhite,doxygenPage,doxygenBody skipwhite skipnl
+ syn match doxygenStartSkipWhite +^\s*\*$+ contained nextgroup=doxygenStartSpecial,doxygenFindBriefSpecial,doxygenStartSkipWhite,doxygenPage,doxygenBody skipwhite skipnl
endif
- " Match an [@\]brief so that it moves to body-mode.
- "
- "
- " syn match doxygenBriefLine contained
- syn match doxygenBriefSpecial contained +[@\\]+ nextgroup=doxygenBriefWord skipwhite
- syn region doxygenFindBriefSpecial start=+[@\\]brief\>+ end=+\(\n\s*\*\=\s*\([@\\]\([npcbea]\>\|em\>\|ref\>\|link\>\|f\$\|[$\\&<>#]\)\@!\)\|\s*$\)\@=+ keepend contains=doxygenBriefSpecial nextgroup=doxygenBody keepend skipwhite skipnl contained
-
-
" Create the single word matching special identifiers.
fun! s:DxyCreateSmallSpecial( kword, name )
let mx='[-:0-9A-Za-z_%=&+*/!~>|]\@<!\([-0-9A-Za-z_%=+*/!~>|#]\+[-0-9A-Za-z_%=+*/!~>|]\@!\|\\[\\<>&.]@\|[.,][0-9a-zA-Z_]\@=\|::\|([^)]*)\|&[0-9a-zA-Z]\{2,7};\)\+'
- exe 'syn region doxygenSpecial'.a:name.'Word contained start=+'.a:kword.'+ end=+\(\_s\+'.mx.'\)\@<=[-a-zA-Z_0-9+*/^%|~!=&\\]\@!+ skipwhite contains=doxygenContinueComment,doxygen'.a:name.'Word'
+ exe 'syn region doxygenSpecial'.a:name.'Word contained start=+'.a:kword.'+ end=+\(\_s\+'.mx.'\)\@<=[-a-zA-Z_0-9+*/^%|~!=&\\]\@!+ skipwhite contains=doxygenContinueCommentWhite,doxygen'.a:name.'Word'
exe 'syn match doxygen'.a:name.'Word contained "\_s\@<='.mx.'" contains=doxygenHtmlSpecial,@Spell keepend'
endfun
call s:DxyCreateSmallSpecial('p', 'Code')
@@ -179,40 +196,42 @@ endif
" Match parameters and retvals (highlighting the first word as special).
syn match doxygenParamDirection contained "\v\[(\s*in>((]\s*\[|\s*,\s*)out>)=|out>((]\s*\[|\s*,\s*)in>)=)\]" nextgroup=doxygenParamName skipwhite
- syn keyword doxygenParam contained param tparam nextgroup=doxygenParamName,doxygenParamDirection skipwhite
+ syn keyword doxygenParam contained param nextgroup=doxygenParamName,doxygenParamDirection skipwhite
+ syn keyword doxygenTParam contained tparam nextgroup=doxygenParamName skipwhite
syn match doxygenParamName contained +[A-Za-z0-9_:]\++ nextgroup=doxygenSpecialMultilineDesc skipwhite
- syn keyword doxygenRetval contained retval throw exception nextgroup=doxygenParamName skipwhite
+ syn keyword doxygenRetval contained retval throw throws exception nextgroup=doxygenParamName skipwhite
" Match one line identifiers.
syn keyword doxygenOther contained addindex anchor
\ dontinclude endhtmlonly endlatexonly showinitializer hideinitializer
- \ example htmlonly image include ingroup internal latexonly line
+ \ example htmlonly image include includelineno ingroup internal latexonly line
\ overload relates relatesalso sa skip skipline
\ until verbinclude version addtogroup htmlinclude copydoc dotfile
\ xmlonly endxmlonly
- \ nextgroup=doxygenSpecialOnelineDesc
+ \ nextgroup=doxygenSpecialOnelineDesc copybrief copydetails copyright dir extends
+ \ implements
- syn region doxygenCodeRegion contained matchgroup=doxygenOther start=+\<code\>+ matchgroup=doxygenOther end=+[\\@]\@<=\<endcode\>+ contains=doxygenCodeRegionSpecial,doxygenContinueComment,doxygenErrorComment,@NoSpell
+ syn region doxygenCodeRegion contained matchgroup=doxygenOther start=+\<code\>+ matchgroup=doxygenOther end=+[\\@]\@<=\<endcode\>+ contains=doxygenCodeRegionSpecial,doxygenContinueCommentWhite,doxygenErrorComment,@NoSpell
syn match doxygenCodeRegionSpecial contained +[\\@]\(endcode\>\)\@=+
- syn region doxygenVerbatimRegion contained matchgroup=doxygenOther start=+\<verbatim\>+ matchgroup=doxygenOther end=+[\\@]\@<=\<endverbatim\>+ contains=doxygenVerbatimRegionSpecial,doxygenContinueComment,doxygenErrorComment,@NoSpell
+ syn region doxygenVerbatimRegion contained matchgroup=doxygenOther start=+\<verbatim\>+ matchgroup=doxygenOther end=+[\\@]\@<=\<endverbatim\>+ contains=doxygenVerbatimRegionSpecial,doxygenContinueCommentWhite,doxygenErrorComment,@NoSpell
syn match doxygenVerbatimRegionSpecial contained +[\\@]\(endverbatim\>\)\@=+
- if exists('b:current_syntax')
+ if exists('b:current_syntax')
let b:doxygen_syntax_save=b:current_syntax
unlet b:current_syntax
endif
syn include @Dotx syntax/dot.vim
- if exists('b:doxygen_syntax_save')
+ if exists('b:doxygen_syntax_save')
let b:current_syntax=b:doxygen_syntax_save
unlet b:doxygen_syntax_save
else
unlet b:current_syntax
endif
- syn region doxygenDotRegion contained matchgroup=doxygenOther start=+\<dot\>+ matchgroup=doxygenOther end=+[\\@]\@<=\<enddot\>+ contains=doxygenDotRegionSpecial,doxygenErrorComment,doxygenContinueComment,@NoSpell,@Dotx
+ syn region doxygenDotRegion contained matchgroup=doxygenOther start=+\<dot\>+ matchgroup=doxygenOther end=+[\\@]\@<=\<enddot\>+ contains=doxygenDotRegionSpecial,doxygenErrorComment,doxygenContinueCommentWhite,@NoSpell,@Dotx
syn match doxygenDotRegionSpecial contained +[\\@]\(enddot\>\)\@=+
" Match single line identifiers.
@@ -223,13 +242,13 @@ endif
syn keyword doxygenOther contained par nextgroup=doxygenHeaderLine
syn region doxygenHeaderLine start=+.+ end=+^+ contained skipwhite nextgroup=doxygenSpecialMultilineDesc
- syn keyword doxygenOther contained arg author date deprecated li return returns see invariant note post pre remarks since test nextgroup=doxygenSpecialMultilineDesc
+ syn keyword doxygenOther contained arg author authors date deprecated li return returns see invariant note post pre remarks since test nextgroup=doxygenSpecialMultilineDesc
syn keyword doxygenOtherTODO contained todo attention nextgroup=doxygenSpecialMultilineDesc
syn keyword doxygenOtherWARN contained warning nextgroup=doxygenSpecialMultilineDesc
syn keyword doxygenOtherBUG contained bug nextgroup=doxygenSpecialMultilineDesc
" Handle \link, \endlink, highlighting the link-to and the link text bits separately.
- syn region doxygenOtherLink matchgroup=doxygenOther start=+\<link\>+ end=+[\@]\@<=endlink\>+ contained contains=doxygenLinkWord,doxygenContinueComment,doxygenLinkError,doxygenEndlinkSpecial
+ syn region doxygenOtherLink matchgroup=doxygenOther start=+\<link\>+ end=+[\@]\@<=endlink\>+ contained contains=doxygenLinkWord,doxygenContinueCommentWhite,doxygenLinkError,doxygenEndlinkSpecial
syn match doxygenEndlinkSpecial contained +[\\@]\zeendlink\>+
syn match doxygenLinkWord "[_a-zA-Z:#()][_a-z0-9A-Z:#()]*\>" contained skipnl nextgroup=doxygenLinkRest,doxygenContinueLinkComment
@@ -249,7 +268,7 @@ endif
" Handle section
syn keyword doxygenOther defgroup section subsection subsubsection weakgroup contained skipwhite nextgroup=doxygenSpecialIdent
- syn region doxygenSpecialSectionDesc start=+.\++ end=+$+ contained skipwhite contains=doxygenSmallSpecial,@doxygenHtmlGroup keepend skipwhite skipnl nextgroup=doxygenContinueComment
+ syn region doxygenSpecialSectionDesc start=+.\++ end=+$+ contained skipwhite contains=doxygenSmallSpecial,@doxygenHtmlGroup keepend skipwhite skipnl nextgroup=doxygenContinueCommentWhite
syn match doxygenSpecialIdent "\<[a-zA-Z_0-9]\+\>" contained nextgroup=doxygenSpecialSectionDesc
" Does the one-line description for the one-line type identifiers.
@@ -259,8 +278,12 @@ endif
" Handle the multiline description for the multiline type identifiers.
" Continue until an 'empty' line (can contain a '*' continuation) or until the
" next whole-line @ command \ command.
- syn region doxygenSpecialMultilineDesc start=+.\++ skip=+^\s*\(\*/\@!\s*\)\=\(\<\|[@\\]\<\([npcbea]\>\|em\>\|ref\|link\>\>\|f\$\|[$\\&<>#]\)\|[^ \t\\@*]\)+ end=+^+ contained contains=doxygenSpecialContinueComment,doxygenSmallSpecial,doxygenHyperLink,doxygenHashLink,@doxygenHtmlGroup,@Spell skipwhite keepend
- syn match doxygenSpecialContinueComment contained +^\s*\*/\@!\s*+ nextgroup=doxygenSpecial skipwhite
+ syn region doxygenSpecialMultilineDesc start=+.\++ skip=+^\s*\(\*/\@!\s*\)\=\(\<\|[@\\]\<\([npcbea]\>\|em\>\|ref\|link\>\>\|f\$\|[$\\&<>#]\)\|[^ \t\\@*]\)+ end=+^+ contained contains=doxygenSpecialContinueCommentWhite,doxygenSmallSpecial,doxygenHyperLink,doxygenHashLink,@doxygenHtmlGroup,@Spell skipwhite keepend
+
+" syn match doxygenSpecialContinueComment contained +^\s*\*/\@!\s*+ nextgroup=doxygenSpecial skipwhite
+ syn match doxygenSpecialContinueCommentWhite contained +^\s*\ze\*+ nextgroup=doxygenSpecialContinueComment
+ syn match doxygenSpecialContinueComment contained +\*/\@!+
+
" Handle special cases 'bold' and 'group'
syn keyword doxygenBold contained bold nextgroup=doxygenSpecialHeading
@@ -287,7 +310,7 @@ endif
" Supported HTML subset. Not perfect, but okay.
syn case ignore
- syn region doxygenHtmlTag contained matchgroup=doxygenHtmlCh start=+\v\</=\ze([biuap]|em|strong|img|br|center|code|dfn|d[ldt]|hr|h[0-3]|li|[ou]l|pre|small|sub|sup|table|tt|var|caption|src|alt|longdesc|name|height|width|usemap|ismap|href|type)>+ skip=+\\<\|\<\k\+=\("[^"]*"\|'[^']*\)+ end=+>+ contains=doxygenHtmlCmd,doxygenContinueComment,doxygenHtmlVar
+ syn region doxygenHtmlTag contained matchgroup=doxygenHtmlCh start=+\v\</=\ze([biuap]|em|strong|img|br|center|code|dfn|d[ldt]|hr|h[0-3]|li|[ou]l|pre|small|sub|sup|table|tt|var|caption|src|alt|longdesc|name|height|width|usemap|ismap|href|type)>+ skip=+\\<\|\<\k\+=\("[^"]*"\|'[^']*\)+ end=+>+ contains=doxygenHtmlCmd,doxygenContinueCommentWhite,doxygenHtmlVar
syn keyword doxygenHtmlCmd contained b i em strong u img a br p center code dfn dl dd dt hr h1 h2 h3 li ol ul pre small sub sup table tt var caption nextgroup=doxygenHtmlVar skipwhite
syn keyword doxygenHtmlVar contained src alt longdesc name height width usemap ismap href type nextgroup=doxygenHtmlEqu skipwhite
syn match doxygenHtmlEqu contained +=+ nextgroup=doxygenHtmlExpr skipwhite
@@ -297,7 +320,7 @@ endif
syn cluster doxygenHtmlGroup contains=doxygenHtmlCode,doxygenHtmlBold,doxygenHtmlUnderline,doxygenHtmlItalic,doxygenHtmlSpecial,doxygenHtmlTag,doxygenHtmlLink
- syn cluster doxygenHtmlTop contains=@Spell,doxygenHtmlSpecial,doxygenHtmlTag,doxygenContinueComment
+ syn cluster doxygenHtmlTop contains=@Spell,doxygenHtmlSpecial,doxygenHtmlTag,doxygenContinueCommentWhite
" Html Support
syn region doxygenHtmlLink contained start=+<[aA]\>\s*\(\n\s*\*\s*\)\=\(\(name\|href\)=\("[^"]*"\|'[^']*'\)\)\=\s*>+ end=+</[aA]>+me=e-4 contains=@doxygenHtmlTop
hi link doxygenHtmlLink Underlined
@@ -342,7 +365,7 @@ endif
syn cluster rcGroup add=doxygen.*
let s:my_syncolor=0
- if !exists(':SynColor')
+ if !exists(':SynColor')
command -nargs=+ SynColor hi def <args>
let s:my_syncolor=1
endif
@@ -468,6 +491,8 @@ endif
call s:Doxygen_Hilights()
+ syn match doxygenLeadingWhite +\(^\s*\*\)\@<=\s*+ contained
+
" This is still a proposal, but won't do any harm.
aug doxygengroup
au!
@@ -482,6 +507,7 @@ endif
SynLink doxygenOtherTODO Todo
SynLink doxygenOtherWARN Todo
SynLink doxygenOtherBUG Todo
+ SynLink doxygenLeadingLWhite doxygenBody
SynLink doxygenErrorSpecial Error
SynLink doxygenErrorEnd Error
@@ -516,7 +542,10 @@ endif
SynLink doxygenBriefL doxygenBrief
SynLink doxygenBriefLine doxygenBrief
SynLink doxygenHeaderLine doxygenSpecialHeading
- SynLink doxygenStartSkip doxygenContinueComment
+ SynLink doxygenCommentWhite Normal
+ SynLink doxygenCommentWhite2 doxygenCommentWhite
+ SynLink doxygenContinueCommentWhite doxygenCommentWhite
+ SynLink doxygenStartSkipWhite doxygenContinueCommentWhite
SynLink doxygenLinkWord doxygenParamName
SynLink doxygenLinkRest doxygenSpecialMultilineDesc
SynLink doxygenHyperLink doxygenLinkWord
@@ -590,5 +619,5 @@ finally
let &cpo = s:cpo_save
unlet s:cpo_save
endtry
-
+let suppress_doxygen=1
" vim:et sw=2 sts=2
diff --git a/runtime/syntax/dracula.vim b/runtime/syntax/dracula.vim
index 6a3806028e..a373dc200c 100644
--- a/runtime/syntax/dracula.vim
+++ b/runtime/syntax/dracula.vim
@@ -8,11 +8,8 @@
" the purposes of Design Rule Checking, Layout vs. Schematic
" verification, and Layout Parameter Extraction.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -61,24 +58,14 @@ syn match draculaPreProc "^#.*"
syn sync lines=50
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_dracula_syn_inits")
- if version < 508
- let did_dracula_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink draculaIdentifier Identifier
- HiLink draculaStatement Statement
- HiLink draculaType Type
- HiLink draculaComment Comment
- HiLink draculaPreProc PreProc
+hi def link draculaIdentifier Identifier
+hi def link draculaStatement Statement
+hi def link draculaType Type
+hi def link draculaComment Comment
+hi def link draculaPreProc PreProc
- delcommand HiLink
-endif
let b:current_syntax = "dracula"
diff --git a/runtime/syntax/dtd.vim b/runtime/syntax/dtd.vim
index 001dbbddd3..ae0bd1288e 100644
--- a/runtime/syntax/dtd.vim
+++ b/runtime/syntax/dtd.vim
@@ -126,41 +126,31 @@ syn keyword dtdTodo contained TODO FIXME XXX
syn sync lines=250
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_dtd_syn_inits")
- if version < 508
- let did_dtd_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default highlighting.
- HiLink dtdFunction Function
- HiLink dtdTag Normal
- HiLink dtdType Type
- HiLink dtdAttrType dtdType
- HiLink dtdAttrDef dtdType
- HiLink dtdConstant Constant
- HiLink dtdString dtdConstant
- HiLink dtdEnum dtdConstant
- HiLink dtdCard dtdFunction
-
- HiLink dtdEntity Statement
- HiLink dtdEntityPunct dtdType
- HiLink dtdParamEntityInst dtdConstant
- HiLink dtdParamEntityPunct dtdType
- HiLink dtdParamEntityDecl dtdType
- HiLink dtdParamEntityDPunct dtdComment
-
- HiLink dtdComment Comment
- HiLink dtdTagName Statement
- HiLink dtdError Error
- HiLink dtdTodo Todo
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+" The default highlighting.
+hi def link dtdFunction Function
+hi def link dtdTag Normal
+hi def link dtdType Type
+hi def link dtdAttrType dtdType
+hi def link dtdAttrDef dtdType
+hi def link dtdConstant Constant
+hi def link dtdString dtdConstant
+hi def link dtdEnum dtdConstant
+hi def link dtdCard dtdFunction
+
+hi def link dtdEntity Statement
+hi def link dtdEntityPunct dtdType
+hi def link dtdParamEntityInst dtdConstant
+hi def link dtdParamEntityPunct dtdType
+hi def link dtdParamEntityDecl dtdType
+hi def link dtdParamEntityDPunct dtdComment
+
+hi def link dtdComment Comment
+hi def link dtdTagName Statement
+hi def link dtdError Error
+hi def link dtdTodo Todo
+
let &cpo = s:dtd_cpo_save
unlet s:dtd_cpo_save
diff --git a/runtime/syntax/dtml.vim b/runtime/syntax/dtml.vim
index 7de722aabd..cb09de8091 100644
--- a/runtime/syntax/dtml.vim
+++ b/runtime/syntax/dtml.vim
@@ -9,20 +9,13 @@
" hacked out of the Zope Quick Reference in case someone finds something
" sensible to do with them. I certainly haven't.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" First load the HTML syntax
-if version < 600
- source <sfile>:p:h/html.vim
-else
- runtime! syntax/html.vim
-endif
+runtime! syntax/html.vim
syn case match
@@ -196,25 +189,15 @@ syn match htmlTagN contained +<\s*[-a-zA-Z0-9]\++hs=s+1 contains=htmlTagNa
syn match htmlTagN contained +</\s*[-a-zA-Z0-9]\++hs=s+2 contains=htmlTagName,htmlSpecialTagName,dtmlIsTag,dtmlAttribute,dtmlMethod,@htmlTagNameCluster
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_dtml_syntax_inits")
- if version < 508
- let did_dtml_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink dtmlIsTag PreProc
- HiLink dtmlAttribute Identifier
- HiLink dtmlMethod Function
- HiLink dtmlComment Comment
- HiLink dtmlTODO Todo
- HiLink dtmlSpecialChar Special
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link dtmlIsTag PreProc
+hi def link dtmlAttribute Identifier
+hi def link dtmlMethod Function
+hi def link dtmlComment Comment
+hi def link dtmlTODO Todo
+hi def link dtmlSpecialChar Special
+
let b:current_syntax = "dtml"
diff --git a/runtime/syntax/dtrace.vim b/runtime/syntax/dtrace.vim
index 493de1ed0f..7ed9766e77 100644
--- a/runtime/syntax/dtrace.vim
+++ b/runtime/syntax/dtrace.vim
@@ -10,19 +10,14 @@
" http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libdtrace/common/dt_lex.l
" http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libdtrace/common/dt_grammar.y
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" Read the C syntax to start with
-if version < 600
- so <sfile>:p:h/c.vim
-else
- runtime! syntax/c.vim
- unlet b:current_syntax
-endif
+runtime! syntax/c.vim
+unlet b:current_syntax
syn clear cCommentL " dtrace doesn't support // style comments
diff --git a/runtime/syntax/dylan.vim b/runtime/syntax/dylan.vim
index 14262d53d6..345e932e60 100644
--- a/runtime/syntax/dylan.vim
+++ b/runtime/syntax/dylan.vim
@@ -8,21 +8,14 @@
" syntax files.
" Part 1: Syntax definition
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
syn case ignore
-if version < 600
- set lisp
-else
- setlocal lisp
-endif
+setlocal lisp
" Highlight special characters (those that have backslashes) differently
syn match dylanSpecial display contained "\\\(x\x\+\|\o\{1,3}\|.\|$\)"
@@ -67,42 +60,32 @@ syn region dylanPrecondit start="^\s*#\s*\(if\>\|else\>\|endif\>\)" skip="\\$"
syn region dylanHeader start="^[Mm]odule:" end="^$"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_dylan_syntax_inits")
- if version < 508
- let did_dylan_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink dylanBlock PreProc
- HiLink dylanBoolean Boolean
- HiLink dylanCharacter Character
- HiLink dylanClass Structure
- HiLink dylanClassMods StorageClass
- HiLink dylanComment Comment
- HiLink dylanConditional Conditional
- HiLink dylanConstant Constant
- HiLink dylanException Exception
- HiLink dylanHeader Macro
- HiLink dylanImport Include
- HiLink dylanLabel Label
- HiLink dylanMiscMods StorageClass
- HiLink dylanNumber Number
- HiLink dylanOther Keyword
- HiLink dylanOperator Operator
- HiLink dylanParamDefs Keyword
- HiLink dylanPrecondit PreCondit
- HiLink dylanRepeat Repeat
- HiLink dylanSimpleDefs Keyword
- HiLink dylanStatement Macro
- HiLink dylanString String
- HiLink dylanVariable Identifier
+hi def link dylanBlock PreProc
+hi def link dylanBoolean Boolean
+hi def link dylanCharacter Character
+hi def link dylanClass Structure
+hi def link dylanClassMods StorageClass
+hi def link dylanComment Comment
+hi def link dylanConditional Conditional
+hi def link dylanConstant Constant
+hi def link dylanException Exception
+hi def link dylanHeader Macro
+hi def link dylanImport Include
+hi def link dylanLabel Label
+hi def link dylanMiscMods StorageClass
+hi def link dylanNumber Number
+hi def link dylanOther Keyword
+hi def link dylanOperator Operator
+hi def link dylanParamDefs Keyword
+hi def link dylanPrecondit PreCondit
+hi def link dylanRepeat Repeat
+hi def link dylanSimpleDefs Keyword
+hi def link dylanStatement Macro
+hi def link dylanString String
+hi def link dylanVariable Identifier
- delcommand HiLink
-endif
let b:current_syntax = "dylan"
diff --git a/runtime/syntax/dylanintr.vim b/runtime/syntax/dylanintr.vim
index 11ef816681..692db34985 100644
--- a/runtime/syntax/dylanintr.vim
+++ b/runtime/syntax/dylanintr.vim
@@ -4,11 +4,8 @@
" Last Change: Fri Sep 29 13:53:27 PDT 2000
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -26,26 +23,16 @@ syn match dylanintrInclude "^\s*#\s*include\>\s*["<]" contains=intrIncluded
"syn keyword intrMods pointer struct
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_dylan_intr_syntax_inits")
- if version < 508
- let did_dylan_intr_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink dylanintrInfo Special
- HiLink dylanintrInterface Operator
- HiLink dylanintrMods Type
- HiLink dylanintrClass StorageClass
- HiLink dylanintrType Type
- HiLink dylanintrIncluded String
- HiLink dylanintrInclude Include
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link dylanintrInfo Special
+hi def link dylanintrInterface Operator
+hi def link dylanintrMods Type
+hi def link dylanintrClass StorageClass
+hi def link dylanintrType Type
+hi def link dylanintrIncluded String
+hi def link dylanintrInclude Include
+
let b:current_syntax = "dylanintr"
diff --git a/runtime/syntax/dylanlid.vim b/runtime/syntax/dylanlid.vim
index ec7b40114c..dae0bf94b1 100644
--- a/runtime/syntax/dylanlid.vim
+++ b/runtime/syntax/dylanlid.vim
@@ -5,11 +5,8 @@
" Last Change: Fri Sep 29 13:50:20 PDT 2000
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -21,21 +18,11 @@ syn region dylanlidEntry matchgroup=Statement start=":%" end="$" oneline
syn sync lines=50
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_dylan_lid_syntax_inits")
- if version < 508
- let did_dylan_lid_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink dylanlidInfo Type
- HiLink dylanlidEntry String
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link dylanlidInfo Type
+hi def link dylanlidEntry String
+
let b:current_syntax = "dylanlid"
diff --git a/runtime/syntax/ecd.vim b/runtime/syntax/ecd.vim
index fff7a4b883..1276f2bd9d 100644
--- a/runtime/syntax/ecd.vim
+++ b/runtime/syntax/ecd.vim
@@ -8,10 +8,8 @@
" This syntax file was derived from apachestyle.vim
" by Christian Hammers <ch@westend.com>
-" Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -31,26 +29,16 @@ syn match ecdTagN contained +<[/\s]*[-a-zA-Z0-9_]\++ms=s+1
syn match ecdTagError contained "[^>]<"ms=s+1
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_ecd_syn_inits")
- if version < 508
- let did_ecd_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink ecdComment Comment
- HiLink ecdAttr Type
- HiLink ecdAttrN Statement
- HiLink ecdAttrV Value
- HiLink ecdTag Function
- HiLink ecdTagN Statement
- HiLink ecdTagError Error
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link ecdComment Comment
+hi def link ecdAttr Type
+hi def link ecdAttrN Statement
+hi def link ecdAttrV Value
+hi def link ecdTag Function
+hi def link ecdTagN Statement
+hi def link ecdTagError Error
+
let b:current_syntax = "ecd"
" vim: ts=8
diff --git a/runtime/syntax/edif.vim b/runtime/syntax/edif.vim
index 0c17834947..002c9f89e1 100644
--- a/runtime/syntax/edif.vim
+++ b/runtime/syntax/edif.vim
@@ -8,18 +8,12 @@
" IEC 61690-1 (EDIF Version 3 0 0)
" IEC 61690-2 (EDIF Version 4 0 0)
-" Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
-if version >= 600
- setlocal iskeyword=48-57,-,+,A-Z,a-z,_,&
-else
- set iskeyword=A-Z,a-z,_,&
-endif
+setlocal iskeyword=48-57,-,+,A-Z,a-z,_,&
syn region edifList matchgroup=Delimiter start="(" end=")" contains=edifList,edifKeyword,edifString,edifNumber
@@ -37,28 +31,15 @@ syn match edifKeyword "(\@<=\s*[a-zA-Z&][a-zA-Z_0-9]*\>" contained
syn match edifError ")"
" synchronization
-if version < 600
- syntax sync maxlines=250
-else
- syntax sync fromstart
-endif
+syntax sync fromstart
" Define the default highlighting.
-if version >= 508 || !exists("did_edif_syntax_inits")
- if version < 508
- let did_edif_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink edifInString SpecialChar
- HiLink edifKeyword Keyword
- HiLink edifNumber Number
- HiLink edifInStringError edifError
- HiLink edifError Error
- HiLink edifString String
- delcommand HiLink
-endif
+hi def link edifInString SpecialChar
+hi def link edifKeyword Keyword
+hi def link edifNumber Number
+hi def link edifInStringError edifError
+hi def link edifError Error
+hi def link edifString String
let b:current_syntax = "edif"
diff --git a/runtime/syntax/eiffel.vim b/runtime/syntax/eiffel.vim
index a91f85d03e..c6634871cc 100644
--- a/runtime/syntax/eiffel.vim
+++ b/runtime/syntax/eiffel.vim
@@ -5,11 +5,8 @@
" Contributions from: Thilo Six
"
" URL: https://github.com/eiffelhub/vim-eiffel
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -141,68 +138,58 @@ endif
syn sync lines=40
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_eiffel_syntax_inits")
- if version < 508
- let did_eiffel_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink eiffelKeyword Statement
- HiLink eiffelProperty Statement
- HiLink eiffelInheritClause Statement
- HiLink eiffelStatement Statement
- HiLink eiffelDeclaration Statement
- HiLink eiffelAssertion Statement
- HiLink eiffelDebug Statement
- HiLink eiffelException Statement
- HiLink eiffelGenericCreate Statement
+hi def link eiffelKeyword Statement
+hi def link eiffelProperty Statement
+hi def link eiffelInheritClause Statement
+hi def link eiffelStatement Statement
+hi def link eiffelDeclaration Statement
+hi def link eiffelAssertion Statement
+hi def link eiffelDebug Statement
+hi def link eiffelException Statement
+hi def link eiffelGenericCreate Statement
- HiLink eiffelAgent Statement
- HiLink eiffelConvert Statement
+hi def link eiffelAgent Statement
+hi def link eiffelConvert Statement
- HiLink eiffelTopStruct PreProc
+hi def link eiffelTopStruct PreProc
- HiLink eiffelAll Special
- HiLink eiffelAnchored Special
- HiLink eiffelBitType Special
+hi def link eiffelAll Special
+hi def link eiffelAnchored Special
+hi def link eiffelBitType Special
- HiLink eiffelBool Boolean
- HiLink eiffelString String
- HiLink eiffelCharacter Character
- HiLink eiffelClassName Type
- HiLink eiffelNumber Number
+hi def link eiffelBool Boolean
+hi def link eiffelString String
+hi def link eiffelCharacter Character
+hi def link eiffelClassName Type
+hi def link eiffelNumber Number
- HiLink eiffelStringEscape Special
+hi def link eiffelStringEscape Special
- HiLink eiffelOperator Special
- HiLink eiffelArray Special
- HiLink eiffelExport Special
- HiLink eiffelCreation Special
- HiLink eiffelBrackets Special
- HiLink eiffelGeneric Special
- HiLink eiffelGenericDecl Special
- HiLink eiffelConstraint Special
- HiLink eiffelCreate Special
+hi def link eiffelOperator Special
+hi def link eiffelArray Special
+hi def link eiffelExport Special
+hi def link eiffelCreation Special
+hi def link eiffelBrackets Special
+hi def link eiffelGeneric Special
+hi def link eiffelGenericDecl Special
+hi def link eiffelConstraint Special
+hi def link eiffelCreate Special
- HiLink eiffelPredefined Constant
+hi def link eiffelPredefined Constant
- HiLink eiffelComment Comment
+hi def link eiffelComment Comment
- HiLink eiffelError Error
- HiLink eiffelBadConstant Error
- HiLink eiffelStringError Error
- HiLink eiffelParenError Error
- HiLink eiffelBracketError Error
+hi def link eiffelError Error
+hi def link eiffelBadConstant Error
+hi def link eiffelStringError Error
+hi def link eiffelParenError Error
+hi def link eiffelBracketError Error
- HiLink eiffelTodo Todo
+hi def link eiffelTodo Todo
- delcommand HiLink
-endif
let b:current_syntax = "eiffel"
diff --git a/runtime/syntax/elf.vim b/runtime/syntax/elf.vim
index 621e063ff8..e695dbc79a 100644
--- a/runtime/syntax/elf.vim
+++ b/runtime/syntax/elf.vim
@@ -10,11 +10,8 @@
" This is the Applix Inc., Macro and Builder programming language.
" It has nothing in common with the binary format called ELF.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -63,32 +60,22 @@ syn match elfParens "[\[\]()]"
syn match elfPunct "[,;]"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_elf_syn_inits")
- if version < 508
- let did_elf_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default methods for highlighting. Can be overridden later.
- HiLink elfComment Comment
- HiLink elfPPCom Include
- HiLink elfKeyword Keyword
- HiLink elfSpecial Special
- HiLink elfEnvironment Special
- HiLink elfBraceError Error
- HiLink elfConditional Conditional
- HiLink elfMacro Function
- HiLink elfNumber Number
- HiLink elfString String
- HiLink elfParens Delimiter
- HiLink elfPunct Delimiter
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+" The default methods for highlighting. Can be overridden later.
+hi def link elfComment Comment
+hi def link elfPPCom Include
+hi def link elfKeyword Keyword
+hi def link elfSpecial Special
+hi def link elfEnvironment Special
+hi def link elfBraceError Error
+hi def link elfConditional Conditional
+hi def link elfMacro Function
+hi def link elfNumber Number
+hi def link elfString String
+hi def link elfParens Delimiter
+hi def link elfPunct Delimiter
+
let b:current_syntax = "elf"
diff --git a/runtime/syntax/elinks.vim b/runtime/syntax/elinks.vim
index b4d9e02ef6..98252a24d3 100644
--- a/runtime/syntax/elinks.vim
+++ b/runtime/syntax/elinks.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: elinks(1) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2007-06-17
+" Language: elinks(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-06-17
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/elmfilt.vim b/runtime/syntax/elmfilt.vim
index e7d5df22aa..ec97af038d 100644
--- a/runtime/syntax/elmfilt.vim
+++ b/runtime/syntax/elmfilt.vim
@@ -1,15 +1,12 @@
" Vim syntax file
" Language: Elm Filter rules
" Maintainer: Charles E. Campbell <NdrOchipS@PcampbellAfamily.Mbiz>
-" Last Change: Oct 23, 2014
-" Version: 6
+" Last Change: Aug 31, 2016
+" Version: 8
" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_ELMFILT
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -38,32 +35,23 @@ syn region elmfiltString contained start="'" skip="'\(\\\\\)*\\['%]" end="'" con
syn match elmfiltSpaceError contained "\s.*$"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_elmfilt_syntax_inits")
- if version < 508
- let did_elmfilt_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+if !exists("skip_elmfilt_syntax_inits")
+
+ hi def link elmfiltAction Statement
+ hi def link elmfiltArg Special
+ hi def link elmfiltComment Comment
+ hi def link elmfiltCond Statement
+ hi def link elmfiltIf Statement
+ hi def link elmfiltMatch Special
+ hi def link elmfiltMatchError Error
+ hi def link elmfiltNumber Number
+ hi def link elmfiltOper Operator
+ hi def link elmfiltOperKey Type
+ hi def link elmfiltParenError Error
+ hi def link elmfiltSpaceError Error
+ hi def link elmfiltString String
+ hi def link elmfiltThenError Error
- HiLink elmfiltAction Statement
- HiLink elmfiltArg Special
- HiLink elmfiltComment Comment
- HiLink elmfiltCond Statement
- HiLink elmfiltIf Statement
- HiLink elmfiltMatch Special
- HiLink elmfiltMatchError Error
- HiLink elmfiltNumber Number
- HiLink elmfiltOper Operator
- HiLink elmfiltOperKey Type
- HiLink elmfiltParenError Error
- HiLink elmfiltSpaceError Error
- HiLink elmfiltString String
- HiLink elmfiltThenError Error
-
- delcommand HiLink
endif
let b:current_syntax = "elmfilt"
diff --git a/runtime/syntax/erlang.vim b/runtime/syntax/erlang.vim
index 02597e75f3..870fcca106 100644
--- a/runtime/syntax/erlang.vim
+++ b/runtime/syntax/erlang.vim
@@ -1,9 +1,10 @@
" Vim syntax file
" Language: Erlang (http://www.erlang.org)
" Maintainer: Csaba Hoch <csaba.hoch@gmail.com>
-" Last Update: 2013-Jul-25
+" Contributor: Adam Rutkowski <hq@mtod.org>
+" Last Update: 2017-Mar-05
" License: Vim license
-" URL: https://github.com/hcs42/vim-erlang
+" URL: https://github.com/vim-erlang/vim-erlang-runtime
" Acknowledgements: This script was originally created by Kresimir Marzic [1].
" The script was then revamped by Csaba Hoch [2]. During the revamp, the new
@@ -28,11 +29,8 @@
"
" syn keyword erlangAttribute myattr1 myattr2 contained
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -42,16 +40,13 @@ set cpo&vim
" Case sensitive
syn case match
-if version >= 600
- setlocal iskeyword+=$,@-@
-endif
+setlocal iskeyword+=$,@-@
" Comments
syn match erlangComment '%.*$' contains=erlangCommentAnnotation,erlangTodo
syn match erlangCommentAnnotation ' \@<=@\%(clear\|docfile\|end\|headerfile\|todo\|TODO\|type\|author\|copyright\|doc\|reference\|see\|since\|title\|version\|deprecated\|hidden\|private\|equiv\|spec\|throws\)' contained
syn match erlangCommentAnnotation /`[^']*'/ contained
syn keyword erlangTodo TODO FIXME XXX contained
-syn match erlangShebang '^#!.*'
" Numbers (minimum base is 2, maximum is 36.)
syn match erlangNumberInteger '\<\d\+\>'
@@ -61,12 +56,12 @@ syn match erlangNumberFloat '\<\d\+\.\d\+\%([eE][+-]\=\d\+\)\=\>'
" Strings, atoms, characters
syn region erlangString start=/"/ end=/"/ contains=erlangStringModifier
syn region erlangQuotedAtom start=/'/ end=/'/ contains=erlangQuotedAtomModifier
-syn match erlangStringModifier '\~\a\|\\\%(\o\{1,3}\|x\x\x\|x{\x\+}\|\^.\|.\)' contained
-syn match erlangQuotedAtomModifier '\~\a\|\\\%(\o\{1,3}\|x\x\x\|x{\x\+}\|\^.\|.\)' contained
+syn match erlangStringModifier '\\\%(\o\{1,3}\|x\x\x\|x{\x\+}\|\^.\|.\)\|\~\%([ni~]\|\%(-\=\d\+\|\*\)\=\.\=\%(\*\|\d\+\)\=\%(\..\)\=[tl]*[cfegswpWPBX#bx+]\)' contained
+syn match erlangQuotedAtomModifier '\\\%(\o\{1,3}\|x\x\x\|x{\x\+}\|\^.\|.\)' contained
syn match erlangModifier '\$\%([^\\]\|\\\%(\o\{1,3}\|x\x\x\|x{\x\+}\|\^.\|.\)\)'
" Operators, separators
-syn match erlangOperator '==\|=:=\|/=\|=/=\|<\|=<\|>\|>=\|++\|--\|=\|!\|<-\|+\|-\|\*\|\/'
+syn match erlangOperator '==\|=:=\|/=\|=/=\|<\|=<\|>\|>=\|=>\|:=\|++\|--\|=\|!\|<-\|+\|-\|\*\|\/'
syn keyword erlangOperator div rem or xor bor bxor bsl bsr and band not bnot andalso orelse
syn match erlangBracket '{\|}\|\[\|]\||\|||'
syn match erlangPipe '|'
@@ -77,14 +72,19 @@ syn match erlangAtom '\<\l[[:alnum:]_@]*' contains=erlangBoolean
syn keyword erlangBoolean true false contained
syn match erlangLocalFuncCall '\<\a[[:alnum:]_@]*\>\%(\%(\s\|\n\|%.*\n\)*(\)\@=' contains=erlangBIF
syn match erlangLocalFuncRef '\<\a[[:alnum:]_@]*\>\%(\%(\s\|\n\|%.*\n\)*/\)\@='
-syn match erlangGlobalFuncCall '\<\%(\a[[:alnum:]_@]*\%(\s\|\n\|%.*\n\)*\.\%(\s\|\n\|%.*\n\)*\)*\a[[:alnum:]_@]*\%(\s\|\n\|%.*\n\)*:\%(\s\|\n\|%.*\n\)*\a[[:alnum:]_@]*\>\%(\%(\s\|\n\|%.*\n\)*(\)\@=' contains=erlangComment
-syn match erlangGlobalFuncRef '\<\%(\a[[:alnum:]_@]*\%(\s\|\n\|%.*\n\)*\.\%(\s\|\n\|%.*\n\)*\)*\a[[:alnum:]_@]*\%(\s\|\n\|%.*\n\)*:\%(\s\|\n\|%.*\n\)*\a[[:alnum:]_@]*\>\%(\%(\s\|\n\|%.*\n\)*/\)\@=' contains=erlangComment
+syn match erlangGlobalFuncCall '\<\%(\a[[:alnum:]_@]*\%(\s\|\n\|%.*\n\)*\.\%(\s\|\n\|%.*\n\)*\)*\a[[:alnum:]_@]*\%(\s\|\n\|%.*\n\)*:\%(\s\|\n\|%.*\n\)*\a[[:alnum:]_@]*\>\%(\%(\s\|\n\|%.*\n\)*(\)\@=' contains=erlangComment,erlangVariable
+syn match erlangGlobalFuncRef '\<\%(\a[[:alnum:]_@]*\%(\s\|\n\|%.*\n\)*\.\%(\s\|\n\|%.*\n\)*\)*\a[[:alnum:]_@]*\%(\s\|\n\|%.*\n\)*:\%(\s\|\n\|%.*\n\)*\a[[:alnum:]_@]*\>\%(\%(\s\|\n\|%.*\n\)*/\)\@=' contains=erlangComment,erlangVariable
-" Variables, macros, records
+" Variables, macros, records, maps
syn match erlangVariable '\<[A-Z_][[:alnum:]_@]*'
syn match erlangMacro '??\=[[:alnum:]_@]\+'
syn match erlangMacro '\%(-define(\)\@<=[[:alnum:]_@]\+'
+syn match erlangMap '#'
syn match erlangRecord '#\s*\l[[:alnum:]_@]*'
+syn region erlangQuotedRecord start=/#\s*'/ end=/'/ contains=erlangQuotedAtomModifier
+
+" Shebang (this line has to be after the ErlangMap)
+syn match erlangShebang '^#!.*'
" Bitstrings
syn match erlangBitType '\%(\/\%(\s\|\n\|%.*\n\)*\)\@<=\%(integer\|float\|binary\|bytes\|bitstring\|bits\|binary\|utf8\|utf16\|utf32\|signed\|unsigned\|big\|little\|native\|unit\)\%(\%(\s\|\n\|%.*\n\)*-\%(\s\|\n\|%.*\n\)*\%(integer\|float\|binary\|bytes\|bitstring\|bits\|binary\|utf8\|utf16\|utf32\|signed\|unsigned\|big\|little\|native\|unit\)\)*' contains=erlangComment
@@ -99,7 +99,7 @@ syn match erlangPreCondit '^\s*-\%(\s\|\n\|%.*\n\)*\%(ifdef\|ifndef\|else\|endif
syn match erlangType '^\s*-\%(\s\|\n\|%.*\n\)*\%(spec\|type\|opaque\|callback\)\>' contains=erlangComment
" Keywords
-syn keyword erlangKeyword after begin case catch cond end fun if let of query
+syn keyword erlangKeyword after begin case catch cond end fun if let of
syn keyword erlangKeyword receive when try
" Build-in-functions (BIFs)
@@ -147,116 +147,109 @@ let b:erlang_syntax_synced = 1
let s:old_style = (exists("g:erlang_old_style_highlight") &&
\g:erlang_old_style_highlight == 1)
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_erlang_inits")
- if version < 508
- let did_erlang_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " Comments
- HiLink erlangComment Comment
- HiLink erlangCommentAnnotation Special
- HiLink erlangTodo Todo
- HiLink erlangShebang Comment
-
- " Numbers
- HiLink erlangNumberInteger Number
- HiLink erlangNumberFloat Float
-
- " Strings, atoms, characters
- HiLink erlangString String
-
- if s:old_style
- HiLink erlangQuotedAtom Type
- else
- HiLink erlangQuotedAtom String
- endif
-
- HiLink erlangStringModifier Special
- HiLink erlangQuotedAtomModifier Special
- HiLink erlangModifier Special
-
- " Operators, separators
- HiLink erlangOperator Operator
- HiLink erlangRightArrow Operator
- if s:old_style
- HiLink erlangBracket Normal
- HiLink erlangPipe Normal
- else
- HiLink erlangBracket Delimiter
- HiLink erlangPipe Delimiter
- endif
-
- " Atoms, functions, variables, macros
- if s:old_style
- HiLink erlangAtom Normal
- HiLink erlangLocalFuncCall Normal
- HiLink erlangLocalFuncRef Normal
- HiLink erlangGlobalFuncCall Function
- HiLink erlangGlobalFuncRef Function
- HiLink erlangVariable Normal
- HiLink erlangMacro Normal
- HiLink erlangRecord Normal
- else
- HiLink erlangAtom String
- HiLink erlangLocalFuncCall Normal
- HiLink erlangLocalFuncRef Normal
- HiLink erlangGlobalFuncCall Normal
- HiLink erlangGlobalFuncRef Normal
- HiLink erlangVariable Identifier
- HiLink erlangMacro Macro
- HiLink erlangRecord Structure
- endif
-
- " Bitstrings
- if !s:old_style
- HiLink erlangBitType Type
- endif
-
- " Constants and Directives
- if s:old_style
- HiLink erlangAttribute Type
- HiLink erlangMacroDef Type
- HiLink erlangUnknownAttribute Normal
- HiLink erlangInclude Type
- HiLink erlangRecordDef Type
- HiLink erlangDefine Type
- HiLink erlangPreCondit Type
- HiLink erlangType Type
- else
- HiLink erlangAttribute Keyword
- HiLink erlangMacroDef Macro
- HiLink erlangUnknownAttribute Normal
- HiLink erlangInclude Include
- HiLink erlangRecordDef Keyword
- HiLink erlangDefine Define
- HiLink erlangPreCondit PreCondit
- HiLink erlangType Type
- endif
-
- " Keywords
- HiLink erlangKeyword Keyword
-
- " Build-in-functions (BIFs)
- HiLink erlangBIF Function
-
- if s:old_style
- HiLink erlangBoolean Statement
- HiLink erlangExtra Statement
- HiLink erlangSignal Statement
- else
- HiLink erlangBoolean Boolean
- HiLink erlangExtra Statement
- HiLink erlangSignal Statement
- endif
-
- delcommand HiLink
+
+" Comments
+hi def link erlangComment Comment
+hi def link erlangCommentAnnotation Special
+hi def link erlangTodo Todo
+hi def link erlangShebang Comment
+
+" Numbers
+hi def link erlangNumberInteger Number
+hi def link erlangNumberFloat Float
+
+" Strings, atoms, characters
+hi def link erlangString String
+
+if s:old_style
+hi def link erlangQuotedAtom Type
+else
+hi def link erlangQuotedAtom String
+endif
+
+hi def link erlangStringModifier Special
+hi def link erlangQuotedAtomModifier Special
+hi def link erlangModifier Special
+
+" Operators, separators
+hi def link erlangOperator Operator
+hi def link erlangRightArrow Operator
+if s:old_style
+hi def link erlangBracket Normal
+hi def link erlangPipe Normal
+else
+hi def link erlangBracket Delimiter
+hi def link erlangPipe Delimiter
+endif
+
+" Atoms, functions, variables, macros
+if s:old_style
+hi def link erlangAtom Normal
+hi def link erlangLocalFuncCall Normal
+hi def link erlangLocalFuncRef Normal
+hi def link erlangGlobalFuncCall Function
+hi def link erlangGlobalFuncRef Function
+hi def link erlangVariable Normal
+hi def link erlangMacro Normal
+hi def link erlangRecord Normal
+hi def link erlangQuotedRecord Normal
+hi def link erlangMap Normal
+else
+hi def link erlangAtom String
+hi def link erlangLocalFuncCall Normal
+hi def link erlangLocalFuncRef Normal
+hi def link erlangGlobalFuncCall Normal
+hi def link erlangGlobalFuncRef Normal
+hi def link erlangVariable Identifier
+hi def link erlangMacro Macro
+hi def link erlangRecord Structure
+hi def link erlangQuotedRecord Structure
+hi def link erlangMap Structure
+endif
+
+" Bitstrings
+if !s:old_style
+hi def link erlangBitType Type
+endif
+
+" Constants and Directives
+if s:old_style
+hi def link erlangAttribute Type
+hi def link erlangMacroDef Type
+hi def link erlangUnknownAttribute Normal
+hi def link erlangInclude Type
+hi def link erlangRecordDef Type
+hi def link erlangDefine Type
+hi def link erlangPreCondit Type
+hi def link erlangType Type
+else
+hi def link erlangAttribute Keyword
+hi def link erlangMacroDef Macro
+hi def link erlangUnknownAttribute Normal
+hi def link erlangInclude Include
+hi def link erlangRecordDef Keyword
+hi def link erlangDefine Define
+hi def link erlangPreCondit PreCondit
+hi def link erlangType Type
endif
+" Keywords
+hi def link erlangKeyword Keyword
+
+" Build-in-functions (BIFs)
+hi def link erlangBIF Function
+
+if s:old_style
+hi def link erlangBoolean Statement
+hi def link erlangExtra Statement
+hi def link erlangSignal Statement
+else
+hi def link erlangBoolean Boolean
+hi def link erlangExtra Statement
+hi def link erlangSignal Statement
+endif
+
+
let b:current_syntax = "erlang"
let &cpo = s:cpo_save
diff --git a/runtime/syntax/eruby.vim b/runtime/syntax/eruby.vim
index c20b086ba5..4e175bcc25 100644
--- a/runtime/syntax/eruby.vim
+++ b/runtime/syntax/eruby.vim
@@ -22,7 +22,7 @@ elseif !exists("b:eruby_subtype") && main_syntax == 'eruby'
let s:lines = getline(1)."\n".getline(2)."\n".getline(3)."\n".getline(4)."\n".getline(5)."\n".getline("$")
let b:eruby_subtype = matchstr(s:lines,'eruby_subtype=\zs\w\+')
if b:eruby_subtype == ''
- let b:eruby_subtype = matchstr(substitute(expand("%:t"),'\c\%(\.erb\|\.eruby\|\.erubis\)\+$','',''),'\.\zs\w\+$')
+ let b:eruby_subtype = matchstr(substitute(expand("%:t"),'\c\%(\.erb\|\.eruby\|\.erubis\)\+$','',''),'\.\zs\w\+\%(\ze+\w\+\)\=$')
endif
if b:eruby_subtype == 'rhtml'
let b:eruby_subtype = 'html'
diff --git a/runtime/syntax/esmtprc.vim b/runtime/syntax/esmtprc.vim
index b22b1a1416..81f074b59c 100644
--- a/runtime/syntax/esmtprc.vim
+++ b/runtime/syntax/esmtprc.vim
@@ -3,11 +3,8 @@
" Maintainer: Kornel Kielczewski <kornel@gazeta.pl>
" Last Change: 16 Feb 2005
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/esqlc.vim b/runtime/syntax/esqlc.vim
index 6ad167a7e6..792e5d37f3 100644
--- a/runtime/syntax/esqlc.vim
+++ b/runtime/syntax/esqlc.vim
@@ -3,20 +3,13 @@
" Maintainer: Jonathan A. George <jageorge@tel.gte.com>
" Last Change: 2001 May 09
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" Read the C++ syntax to start with
-if version < 600
- source <sfile>:p:h/cpp.vim
-else
- runtime! syntax/cpp.vim
-endif
+runtime! syntax/cpp.vim
" ESQL-C extentions
@@ -52,24 +45,14 @@ syntax keyword esqlcStatement rename revoke rollback savepoint select set
syntax keyword esqlcStatement truncate update
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_esqlc_syntax_inits")
- if version < 508
- let did_esqlc_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink esqlcOperator Operator
- HiLink esqlcStatement Statement
- HiLink esqlcKeyword esqlcSpecial
- HiLink esqlcSpecial Special
- HiLink esqlcPreProc PreProc
+hi def link esqlcOperator Operator
+hi def link esqlcStatement Statement
+hi def link esqlcKeyword esqlcSpecial
+hi def link esqlcSpecial Special
+hi def link esqlcPreProc PreProc
- delcommand HiLink
-endif
let b:current_syntax = "esqlc"
diff --git a/runtime/syntax/esterel.vim b/runtime/syntax/esterel.vim
index d853e75208..b0105216d7 100644
--- a/runtime/syntax/esterel.vim
+++ b/runtime/syntax/esterel.vim
@@ -6,11 +6,8 @@
" Last Change: Tue May 6 13:29:56 CEST 2008
" Version: 0.8
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -65,26 +62,17 @@ syn match esterelNone "\<else\s\+if\>$"
syn match esterelNone "\<else\s\+if\>\s"
" Class Linking
-if version >= 508 || !exists("did_esterel_syntax_inits")
- if version < 508
- let did_esterel_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink esterelStatement Statement
- HiLink esterelType Type
- HiLink esterelComment Comment
- HiLink esterelBoolean Number
- HiLink esterelExpressions Number
- HiLink esterelIO String
- HiLink esterelOperator Type
- HiLink esterelSysCall Type
- HiLink esterelFunctions Type
- HiLink esterelSpecial Special
+hi def link esterelStatement Statement
+hi def link esterelType Type
+hi def link esterelComment Comment
+hi def link esterelBoolean Number
+hi def link esterelExpressions Number
+hi def link esterelIO String
+hi def link esterelOperator Type
+hi def link esterelSysCall Type
+hi def link esterelFunctions Type
+hi def link esterelSpecial Special
- delcommand HiLink
-endif
let b:current_syntax = "esterel"
diff --git a/runtime/syntax/eterm.vim b/runtime/syntax/eterm.vim
index f6c50a20cb..9b43cb255f 100644
--- a/runtime/syntax/eterm.vim
+++ b/runtime/syntax/eterm.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: eterm(1) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-21
+" Language: eterm(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-21
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/euphoria3.vim b/runtime/syntax/euphoria3.vim
index 1254b96247..ece14027ba 100644
--- a/runtime/syntax/euphoria3.vim
+++ b/runtime/syntax/euphoria3.vim
@@ -5,10 +5,8 @@
" Remark: Euphoria has two syntax files, euphoria3.vim and euphoria4.vim;
" For details see :help ft-euphoria-syntax
-" Quit if a (custom) syntax file was already loaded (compatible with Vim 5.8):
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/euphoria4.vim b/runtime/syntax/euphoria4.vim
index 53f5cea917..5e668a7d67 100644
--- a/runtime/syntax/euphoria4.vim
+++ b/runtime/syntax/euphoria4.vim
@@ -5,10 +5,8 @@
" Remark: Euphoria has two syntax files, euphoria3.vim and euphoria4.vim;
" For details see :help ft-euphoria-syntax
-" Quit if a (custom) syntax file was already loaded (compatible with Vim 5.8):
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/eviews.vim b/runtime/syntax/eviews.vim
index aa65fda3ff..03cfb25e60 100644
--- a/runtime/syntax/eviews.vim
+++ b/runtime/syntax/eviews.vim
@@ -4,19 +4,12 @@
" Last Change: 2006 Apr 30
" Filenames: *.prg
" URL: http://uosis.mif.vu.lt/~zemlys/vim-syntax/eviews.vim
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
-if version >= 600
- setlocal iskeyword=@,48-57,_,.
-else
- set iskeyword=@,48-57,_,.
-endif
+setlocal iskeyword=@,48-57,_,.
syn case match
@@ -69,35 +62,25 @@ syn match eCurlyError /[)\]]/ contained
syn match eParenError /[\]}]/ contained
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_r_syn_inits")
- if version < 508
- let did_r_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink eComment Comment
- HiLink eConstant Identifier
- HiLink eStringId Identifier
- HiLink eCommand Type
- HiLink eString String
- HiLink eNumber Number
- HiLink eBoolean Boolean
- HiLink eFloat Float
- HiLink eConditional Conditional
- HiLink eProgLang Statement
- HiLink eOVP Statement
- HiLink eStdCmd Statement
- HiLink eIdentifier Normal
- HiLink eDelimiter Delimiter
- HiLink eError Error
- HiLink eBraceError Error
- HiLink eCurlyError Error
- HiLink eParenError Error
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+hi def link eComment Comment
+hi def link eConstant Identifier
+hi def link eStringId Identifier
+hi def link eCommand Type
+hi def link eString String
+hi def link eNumber Number
+hi def link eBoolean Boolean
+hi def link eFloat Float
+hi def link eConditional Conditional
+hi def link eProgLang Statement
+hi def link eOVP Statement
+hi def link eStdCmd Statement
+hi def link eIdentifier Normal
+hi def link eDelimiter Delimiter
+hi def link eError Error
+hi def link eBraceError Error
+hi def link eCurlyError Error
+hi def link eParenError Error
let b:current_syntax="eviews"
diff --git a/runtime/syntax/exim.vim b/runtime/syntax/exim.vim
index ff8066f8af..4edc0d7948 100644
--- a/runtime/syntax/exim.vim
+++ b/runtime/syntax/exim.vim
@@ -6,12 +6,9 @@
" URL: http://trific.ath.cx/Ftp/vim/syntax/exim.vim
" Setup
-if version >= 600
- if exists("b:current_syntax")
- finish
- endif
-else
- syntax clear
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
endif
syn case match
@@ -91,27 +88,18 @@ syn keyword eximKeyword server_prompts server_condition client_send
syn keyword eximKeyword server_secret client_name client_secret
" Define the default highlighting
-if version >= 508 || !exists("did_exim_syntax_inits")
- if version < 508
- let did_exim_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink eximComment Comment
- HiLink eximFixme Todo
- HiLink eximEnd Keyword
- HiLink eximNumber Number
- HiLink eximDriverName Constant
- HiLink eximConstant Constant
- HiLink eximTime Constant
- HiLink eximKeyword Type
- HiLink eximSpecialChar Special
- HiLink eximMacroName Preproc
- HiLink eximTransport Identifier
+hi def link eximComment Comment
+hi def link eximFixme Todo
+hi def link eximEnd Keyword
+hi def link eximNumber Number
+hi def link eximDriverName Constant
+hi def link eximConstant Constant
+hi def link eximTime Constant
+hi def link eximKeyword Type
+hi def link eximSpecialChar Special
+hi def link eximMacroName Preproc
+hi def link eximTransport Identifier
- delcommand HiLink
-endif
let b:current_syntax = "exim"
diff --git a/runtime/syntax/expect.vim b/runtime/syntax/expect.vim
index 6ff7d4142c..75cbd3eddf 100644
--- a/runtime/syntax/expect.vim
+++ b/runtime/syntax/expect.vim
@@ -4,11 +4,8 @@
" Last Change: 2012 Jun 01
" (Dominique Pelle added @Spell)
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -81,35 +78,25 @@ syn match expectComment "#.*$" contains=@Spell,expectTodo
syn match expectSharpBang "\%^#!.*"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_expect_syntax_inits")
- if version < 508
- let did_expect_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink expectSharpBang PreProc
- HiLink expectVariables Special
- HiLink expectCommand Function
- HiLink expectStatement Statement
- HiLink expectConditional Conditional
- HiLink expectRepeat Repeat
- HiLink expectExpectOpts Keyword
- HiLink expectOutVar Special
- HiLink expectSpecial Special
- HiLink expectNumber Number
-
- HiLink expectString String
-
- HiLink expectComment Comment
- HiLink expectTodo Todo
- "HiLink expectIdentifier Identifier
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link expectSharpBang PreProc
+hi def link expectVariables Special
+hi def link expectCommand Function
+hi def link expectStatement Statement
+hi def link expectConditional Conditional
+hi def link expectRepeat Repeat
+hi def link expectExpectOpts Keyword
+hi def link expectOutVar Special
+hi def link expectSpecial Special
+hi def link expectNumber Number
+
+hi def link expectString String
+
+hi def link expectComment Comment
+hi def link expectTodo Todo
+"hi def link expectIdentifier Identifier
+
let b:current_syntax = "expect"
diff --git a/runtime/syntax/exports.vim b/runtime/syntax/exports.vim
index f695dc8d21..55efbb1e50 100644
--- a/runtime/syntax/exports.vim
+++ b/runtime/syntax/exports.vim
@@ -1,16 +1,13 @@
" Vim syntax file
" Language: exports
" Maintainer: Charles E. Campbell <NdrOchipS@PcampbellAfamily.Mbiz>
-" Last Change: Oct 23, 2014
-" Version: 5
+" Last Change: Aug 31, 2016
+" Version: 7
" Notes: This file includes both SysV and BSD 'isms
" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_EXPORTS
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -39,31 +36,22 @@ syn match exportsSeparator "[,:]"
syn match exportsComment "^\s*#.*$" contains=@Spell
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_exports_syntax_inits")
- if version < 508
- let did_exports_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+if !exists("skip_exports_syntax_inits")
- HiLink exportsKeyOptSet exportsKeySettings
- HiLink exportsOptSet exportsSettings
+ hi def link exportsKeyOptSet exportsKeySettings
+ hi def link exportsOptSet exportsSettings
- HiLink exportsComment Comment
- HiLink exportsKeyOptions Type
- HiLink exportsKeySettings Keyword
- HiLink exportsOptions Constant
- HiLink exportsSeparator Constant
- HiLink exportsSettings Constant
+ hi def link exportsComment Comment
+ hi def link exportsKeyOptions Type
+ hi def link exportsKeySettings Keyword
+ hi def link exportsOptions Constant
+ hi def link exportsSeparator Constant
+ hi def link exportsSettings Constant
- HiLink exportsOptError Error
- HiLink exportsOptSetError Error
- HiLink exportsSetError Error
+ hi def link exportsOptError Error
+ hi def link exportsOptSetError Error
+ hi def link exportsSetError Error
- delcommand HiLink
endif
let b:current_syntax = "exports"
diff --git a/runtime/syntax/falcon.vim b/runtime/syntax/falcon.vim
index 1f6fefa9ff..e022c7a54a 100644
--- a/runtime/syntax/falcon.vim
+++ b/runtime/syntax/falcon.vim
@@ -163,34 +163,32 @@ syn sync minlines=10 maxlines=100
" Define the default highlighting
if !exists("did_falcon_syn_inits")
- command -nargs=+ HiLink hi def link <args>
-
- HiLink falconKeyword Keyword
- HiLink falconCommentString String
- HiLink falconTodo Todo
- HiLink falconConditional Keyword
- HiLink falconRepeat Repeat
- HiLink falconcommentSkip Comment
- HiLink falconComment Comment
- HiLink falconCommentL Comment
- HiLink falconConst Constant
- HiLink falconConstants Constant
- HiLink falconOperator Operator
- HiLink falconSymbol Normal
- HiLink falconSpaceError Error
- HiLink falconHexadecimal Number
- HiLink falconOctal Number
- HiLink falconIntLiteral Number
- HiLink falconFloatLiteral Float
- HiLink falconStringEscape Special
- HiLink falconStringDelimiter Delimiter
- HiLink falconString String
- HiLink falconBool Constant
- HiLink falconSharpBang PreProc
- HiLink falconInclude Include
- HiLink falconSymbol Constant
- HiLink falconSymbolOther Delimiter
- delcommand HiLink
+
+ hi def link falconKeyword Keyword
+ hi def link falconCommentString String
+ hi def link falconTodo Todo
+ hi def link falconConditional Keyword
+ hi def link falconRepeat Repeat
+ hi def link falconcommentSkip Comment
+ hi def link falconComment Comment
+ hi def link falconCommentL Comment
+ hi def link falconConst Constant
+ hi def link falconConstants Constant
+ hi def link falconOperator Operator
+ hi def link falconSymbol Normal
+ hi def link falconSpaceError Error
+ hi def link falconHexadecimal Number
+ hi def link falconOctal Number
+ hi def link falconIntLiteral Number
+ hi def link falconFloatLiteral Float
+ hi def link falconStringEscape Special
+ hi def link falconStringDelimiter Delimiter
+ hi def link falconString String
+ hi def link falconBool Constant
+ hi def link falconSharpBang PreProc
+ hi def link falconInclude Include
+ hi def link falconSymbol Constant
+ hi def link falconSymbolOther Delimiter
endif
let b:current_syntax = "falcon"
diff --git a/runtime/syntax/fasm.vim b/runtime/syntax/fasm.vim
index 696e05b4ca..172ba7c9b6 100644
--- a/runtime/syntax/fasm.vim
+++ b/runtime/syntax/fasm.vim
@@ -6,9 +6,8 @@
" FASM Home: http://flatassembler.net/
" FASM Version: 1.56
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/fdcc.vim b/runtime/syntax/fdcc.vim
index 38717ebfb8..f7b296b9c6 100644
--- a/runtime/syntax/fdcc.vim
+++ b/runtime/syntax/fdcc.vim
@@ -4,11 +4,8 @@
" Last Change: 2004 May 16
" Remarks: FDCC (Formal Definitions of Cultural Conventions) see ISO TR 14652
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -58,56 +55,46 @@ syn region fdccBlank matchgroup=fdccLCName start=/^LC_NAME$/ end=/^END LC_NAME$/
syn region fdccBlank matchgroup=fdccLCAddress start=/^LC_ADDRESS$/ end=/^END LC_ADDRESS$/ contains=fdccKeywordAddress,fdccString,fdccComment,fdccNumber
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_fdcc_syn_inits")
- if version < 508
- let did_fdcc_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink fdccBlank Blank
-
- HiLink fdccTodo Todo
- HiLink fdccComment Comment
- HiLink fdccVariable Type
-
- HiLink fdccLCIdentification Statement
- HiLink fdccLCCtype Statement
- HiLink fdccLCCollate Statement
- HiLink fdccLCMonetary Statement
- HiLink fdccLCNumeric Statement
- HiLink fdccLCTime Statement
- HiLink fdccLCMessages Statement
- HiLink fdccLCPaper Statement
- HiLink fdccLCTelephone Statement
- HiLink fdccLCMeasurement Statement
- HiLink fdccLCName Statement
- HiLink fdccLCAddress Statement
-
- HiLink fdccUnicodeInValid Error
- HiLink fdccUnicodeValid String
- HiLink fdccString String
- HiLink fdccNumber Blank
-
- HiLink fdccKeywordIdentification fdccKeyword
- HiLink fdccKeywordCtype fdccKeyword
- HiLink fdccKeywordCollate fdccKeyword
- HiLink fdccKeywordMonetary fdccKeyword
- HiLink fdccKeywordNumeric fdccKeyword
- HiLink fdccKeywordTime fdccKeyword
- HiLink fdccKeywordMessages fdccKeyword
- HiLink fdccKeywordPaper fdccKeyword
- HiLink fdccKeywordTelephone fdccKeyword
- HiLink fdccKeywordMeasurement fdccKeyword
- HiLink fdccKeywordName fdccKeyword
- HiLink fdccKeywordAddress fdccKeyword
- HiLink fdccKeyword Identifier
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link fdccBlank Blank
+
+hi def link fdccTodo Todo
+hi def link fdccComment Comment
+hi def link fdccVariable Type
+
+hi def link fdccLCIdentification Statement
+hi def link fdccLCCtype Statement
+hi def link fdccLCCollate Statement
+hi def link fdccLCMonetary Statement
+hi def link fdccLCNumeric Statement
+hi def link fdccLCTime Statement
+hi def link fdccLCMessages Statement
+hi def link fdccLCPaper Statement
+hi def link fdccLCTelephone Statement
+hi def link fdccLCMeasurement Statement
+hi def link fdccLCName Statement
+hi def link fdccLCAddress Statement
+
+hi def link fdccUnicodeInValid Error
+hi def link fdccUnicodeValid String
+hi def link fdccString String
+hi def link fdccNumber Blank
+
+hi def link fdccKeywordIdentification fdccKeyword
+hi def link fdccKeywordCtype fdccKeyword
+hi def link fdccKeywordCollate fdccKeyword
+hi def link fdccKeywordMonetary fdccKeyword
+hi def link fdccKeywordNumeric fdccKeyword
+hi def link fdccKeywordTime fdccKeyword
+hi def link fdccKeywordMessages fdccKeyword
+hi def link fdccKeywordPaper fdccKeyword
+hi def link fdccKeywordTelephone fdccKeyword
+hi def link fdccKeywordMeasurement fdccKeyword
+hi def link fdccKeywordName fdccKeyword
+hi def link fdccKeywordAddress fdccKeyword
+hi def link fdccKeyword Identifier
+
let b:current_syntax = "fdcc"
diff --git a/runtime/syntax/fetchmail.vim b/runtime/syntax/fetchmail.vim
index 89de1ff80d..7a421050d0 100644
--- a/runtime/syntax/fetchmail.vim
+++ b/runtime/syntax/fetchmail.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: fetchmail(1) RC File
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: fetchmail(1) RC File
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/fgl.vim b/runtime/syntax/fgl.vim
index 1b2fe19a88..1b75d137b6 100644
--- a/runtime/syntax/fgl.vim
+++ b/runtime/syntax/fgl.vim
@@ -7,11 +7,8 @@
" - Conditionally allow case insensitive keywords (Julian Bridle)
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -119,28 +116,18 @@ syn match fglSpecial "--@"
syn sync ccomment fglComment
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_fgl_syntax_inits")
- if version < 508
- let did_fgl_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink fglComment Comment
- "HiLink fglKeyword fglSpecial
- HiLink fglKeyword fglStatement
- HiLink fglNumber Number
- HiLink fglOperator fglStatement
- HiLink fglSpecial Special
- HiLink fglStatement Statement
- HiLink fglString String
- HiLink fglType Type
+hi def link fglComment Comment
+"hi def link fglKeyword fglSpecial
+hi def link fglKeyword fglStatement
+hi def link fglNumber Number
+hi def link fglOperator fglStatement
+hi def link fglSpecial Special
+hi def link fglStatement Statement
+hi def link fglString String
+hi def link fglType Type
- delcommand HiLink
-endif
let b:current_syntax = "fgl"
diff --git a/runtime/syntax/flexwiki.vim b/runtime/syntax/flexwiki.vim
index 34f893d927..6b15ab2d90 100644
--- a/runtime/syntax/flexwiki.vim
+++ b/runtime/syntax/flexwiki.vim
@@ -14,10 +14,8 @@
" regexes, which use a different syntax than Vim (fewer \s).
" The primary test case is FlexWiki\FormattingRules.wiki
-" Quit if syntax file is already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/focexec.vim b/runtime/syntax/focexec.vim
index 8be1b65cc4..a75aed47cb 100644
--- a/runtime/syntax/focexec.vim
+++ b/runtime/syntax/focexec.vim
@@ -11,11 +11,8 @@
" I think some of these things should get different hilights -
" should MODIFY commands look different than TABLE?
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -69,32 +66,22 @@ syn match focexecNumber "\<\d\+\.\d*\>"
syn match focexecComment "-\*.*"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_focexec_syntax_inits")
- if version < 508
- let did_focexec_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink focexecString1 String
- HiLink focexecString2 String
- HiLink focexecNumber Number
- HiLink focexecComment Comment
- HiLink focexecTable Keyword
- HiLink focexecModify Keyword
- HiLink focexecNormal Keyword
- HiLink focexecSet Keyword
- HiLink focexecDash Keyword
- HiLink focexecFileDef Keyword
- HiLink focexecJoin Keyword
- HiLink focexecAmperVar Identifier
- HiLink focexecFuse Function
+hi def link focexecString1 String
+hi def link focexecString2 String
+hi def link focexecNumber Number
+hi def link focexecComment Comment
+hi def link focexecTable Keyword
+hi def link focexecModify Keyword
+hi def link focexecNormal Keyword
+hi def link focexecSet Keyword
+hi def link focexecDash Keyword
+hi def link focexecFileDef Keyword
+hi def link focexecJoin Keyword
+hi def link focexecAmperVar Identifier
+hi def link focexecFuse Function
- delcommand HiLink
-endif
let b:current_syntax = "focexec"
diff --git a/runtime/syntax/form.vim b/runtime/syntax/form.vim
index 19a47ed6b9..9718480da3 100644
--- a/runtime/syntax/form.vim
+++ b/runtime/syntax/form.vim
@@ -11,11 +11,8 @@
" This syntax file is still in development. Please send suggestions
" to the maintainer.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -88,7 +85,7 @@ syn match formComment "\;\ *\*.*$" contains=formTodo
syn region formString start=+"+ end=+"+ contains=formSpecial
syn region formString start=+'+ end=+'+
syn region formNestedString start=+`+ end=+'+ contains=formNestedString
-syn match formPreProc "^\=\#[a-zA-z][a-zA-Z0-9]*\>"
+syn match formPreProc "^\=\#[a-zA-Z][a-zA-Z0-9]*\>"
syn match formNumber "\<\d\+\>"
syn match formNumber "\<\d\+\.\d*\>"
syn match formNumber "\.\d\+\>"
@@ -97,61 +94,51 @@ syn match formNumber "-\.\d" contains=Number
syn match formNumber "i_\+\>"
syn match formNumber "fac_\+\>"
" pattern matching wildcards
-syn match formNumber "?[A-z0-9]*"
+syn match formNumber "?[a-zA-Z0-9]*"
" dollar-variables (new in 3.x)
-syn match formNumber "\\$[A-z0-9]*"
+syn match formNumber "\\$[a-zA-Z0-9]*"
" scalar products
-syn match formNumber "^\=[a-zA-z][a-zA-Z0-9]*\.[a-zA-z][a-zA-Z0-9]*\>"
+syn match formNumber "^\=[a-zA-Z][a-zA-Z0-9]*\.[a-zA-Z][a-zA-Z0-9]*\>"
-syn match formDirective "^\=\.[a-zA-z][a-zA-Z0-9]*\>"
+syn match formDirective "^\=\.[a-zA-Z][a-zA-Z0-9]*\>"
" hi User Labels
syn sync ccomment formComment minlines=10
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_form_syn_inits")
- if version < 508
- let did_form_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink formConditional Conditional
- HiLink formNumber Number
- HiLink formStatement Statement
- HiLink formComment Comment
- HiLink formPreProc PreProc
- HiLink formDirective PreProc
- HiLink formType Type
- HiLink formString String
- HiLink formNestedString String
- HiLink formReserved Error
- HiLink formTodo Todo
- HiLink formSpecial SpecialChar
-
- if !exists("form_enhanced_color")
- HiLink formHeaderStatement Statement
- else
- " enhanced color mode
- HiLink formHeaderStatement HeaderStatement
- " dark and a light background for local types
- if &background == "dark"
- hi HeaderStatement term=underline ctermfg=LightGreen guifg=LightGreen gui=bold
- else
- hi HeaderStatement term=underline ctermfg=DarkGreen guifg=SeaGreen gui=bold
- endif
- " change slightly the default for dark gvim
- if has("gui_running") && &background == "dark"
- hi Conditional guifg=LightBlue gui=bold
- hi Statement guifg=LightYellow
- endif
- endif
-
- delcommand HiLink
+" Only when an item doesn't have highlighting yet
+
+hi def link formConditional Conditional
+hi def link formNumber Number
+hi def link formStatement Statement
+hi def link formComment Comment
+hi def link formPreProc PreProc
+hi def link formDirective PreProc
+hi def link formType Type
+hi def link formString String
+hi def link formNestedString String
+hi def link formReserved Error
+hi def link formTodo Todo
+hi def link formSpecial SpecialChar
+
+if !exists("form_enhanced_color")
+hi def link formHeaderStatement Statement
+else
+" enhanced color mode
+hi def link formHeaderStatement HeaderStatement
+" dark and a light background for local types
+if &background == "dark"
+hi HeaderStatement term=underline ctermfg=LightGreen guifg=LightGreen gui=bold
+else
+hi HeaderStatement term=underline ctermfg=DarkGreen guifg=SeaGreen gui=bold
endif
+" change slightly the default for dark gvim
+if has("gui_running") && &background == "dark"
+hi Conditional guifg=LightBlue gui=bold
+hi Statement guifg=LightYellow
+endif
+endif
+
let b:current_syntax = "form"
diff --git a/runtime/syntax/forth.vim b/runtime/syntax/forth.vim
index 99e9400b95..a1912461e6 100644
--- a/runtime/syntax/forth.vim
+++ b/runtime/syntax/forth.vim
@@ -1,90 +1,13 @@
" Vim syntax file
" Language: FORTH
-" Maintainer: Christian V. J. Brssow <cvjb@cvjb.de>
-" Last Change: So 27 Mai 2012 15:56:28 CEST
+" Current Maintainer: Johan Kotlinski <kotlinski@gmail.com>
+" Previous Maintainer: Christian V. J. Brssow <cvjb@cvjb.de>
+" Last Change: 2018-03-29
" Filenames: *.fs,*.ft
-" URL: http://www.cvjb.de/comp/vim/forth.vim
-
-" $Id: forth.vim,v 1.14 2012/05/27 15:57:22 bruessow Exp $
-
-" The list of keywords is incomplete, compared with the official ANS
-" wordlist. If you use this language, please improve it, and send me
-" the patches.
-"
-" Before sending me patches, please download the newest version of this file
-" from http://www.cvjb.de/comp/vim/forth.vim or http://www.vim.org/ (search
-" for forth.vim).
-
-" Many Thanks to...
-"
-" 2012-05-13:
-" Dominique Pell้ <dominique dot pelle at gmail dot com> for sending the
-" patch to allow spellchecking of strings, comments, ...
-"
-" 2012-01-07:
-" Thilo Six <T.Six at gmx dot de> send a patch for cpoptions.
-" See the discussion at http://thread.gmane.org/gmane.editors.vim.devel/32151
-"
-" 2009-06-28:
-" Josh Grams send a patch to allow the parenthesis comments at the
-" beginning of a line. That patch also fixed a typo in one of the
-" comments.
-"
-" 2008-02-09:
-" Shawn K. Quinn <sjquinn at speakeasy dot net> send a big patch with
-" new words commonly used in Forth programs or defined by GNU Forth.
-"
-" 2007-07-11:
-" Benjamin Krill <ben at codiert dot org> send me a patch
-" to highlight space errors.
-" You can toggle this feature on through setting the
-" flag forth_space_errors in you vimrc. If you have switched it on,
-" you can turn off highlighting of trailing spaces in comments by
-" setting forth_no_trail_space_error in your vimrc. If you do not want
-" the highlighting of a tabulator following a space in comments, you
-" can turn this off by setting forth_no_tab_space_error.
-"
-" 2006-05-25:
-" Bill McCarthy <WJMc@...> and Ilya Sher <ilya-vim@...>
-" Who found a bug in the ccomment line in 2004!!!
-" I'm really very sorry, that it has taken two years to fix that
-" in the official version of this file. Shame on me.
-" I think my face will be red the next ten years...
-"
-" 2006-05-21:
-" Thomas E. Vaughan <tevaugha at ball dot com> send me a patch
-" for the parenthesis comment word, so words with a trailing
-" parenthesis will not start the highlighting for such comments.
-"
-" 2003-05-10:
-" Andrew Gaul <andrew at gaul.org> send me a patch for
-" forthOperators.
-"
-" 2003-04-03:
-" Ron Aaron <ron at ronware dot org> made updates for an
-" improved Win32Forth support.
-"
-" 2002-04-22:
-" Charles Shattuck <charley at forth dot org> helped me to settle up with the
-" binary and hex number highlighting.
-"
-" 2002-04-20:
-" Charles Shattuck <charley at forth dot org> send me some code for correctly
-" highlighting char and [char] followed by an opening paren. He also added
-" some words for operators, conditionals, and definitions; and added the
-" highlighting for s" and c".
-"
-" 2000-03-28:
-" John Providenza <john at probo dot com> made improvements for the
-" highlighting of strings, and added the code for highlighting hex numbers.
-"
-
-
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" URL: https://github.com/jkotlinski/forth.vim
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -104,11 +27,7 @@ syn match forthTodo contained 'Copyright\(\s([Cc])\)\=\(\s[0-9]\{2,4}\)\='
" Characters allowed in keywords
" I don't know if 128-255 are allowed in ANS-FORTH
-if version >= 600
- setlocal iskeyword=!,@,33-35,%,$,38-64,A-Z,91-96,a-z,123-126,128-255
-else
- set iskeyword=!,@,33-35,%,$,38-64,A-Z,91-96,a-z,123-126,128-255
-endif
+setlocal iskeyword=!,@,33-35,%,$,38-64,A-Z,91-96,a-z,123-126,128-255
" when wanted, highlight trailing white space
if exists("forth_space_errors")
@@ -136,7 +55,10 @@ syn keyword forthOperators F~REL F~ABS F~
syn keyword forthOperators 0< 0<= 0<> 0= 0> 0>= < <= <> = > >= U< U<=
syn keyword forthOperators U> U>= D0< D0<= D0<> D0= D0> D0>= D< D<= D<>
syn keyword forthOperators D= D> D>= DU< DU<= DU> DU>= WITHIN ?NEGATE
-syn keyword forthOperators ?DNEGATE
+syn keyword forthOperators ?DNEGATE TRUE FALSE
+
+" various words that take an input and do something with it
+syn keyword forthFunction . U. .R U.R
" stack manipulations
syn keyword forthStack DROP NIP DUP OVER TUCK SWAP ROT -ROT ?DUP PICK ROLL
@@ -148,7 +70,7 @@ syn keyword forthRstack 4>R 4R> 4R@ 4RDROP
syn keyword forthFStack FDROP FNIP FDUP FOVER FTUCK FSWAP FROT
" stack pointer manipulations
-syn keyword forthSP SP@ SP! FP@ FP! RP@ RP! LP@ LP!
+syn keyword forthSP SP@ SP! FP@ FP! RP@ RP! LP@ LP! DEPTH
" address operations
syn keyword forthMemory @ ! +! C@ C! 2@ 2! F@ F! SF@ SF! DF@ DF!
@@ -157,7 +79,7 @@ syn keyword forthAdrArith FLOAT+ FLOAT FALIGN FALIGNED SFLOATS SFLOAT+
syn keyword forthAdrArith SFALIGN SFALIGNED DFLOATS DFLOAT+ DFALIGN DFALIGNED
syn keyword forthAdrArith MAXALIGN MAXALIGNED CFALIGN CFALIGNED
syn keyword forthAdrArith ADDRESS-UNIT-BITS ALLOT ALLOCATE HERE
-syn keyword forthMemBlks MOVE ERASE CMOVE CMOVE> FILL BLANK
+syn keyword forthMemBlks MOVE ERASE CMOVE CMOVE> FILL BLANK UNUSED
" conditionals
syn keyword forthCond IF ELSE ENDIF THEN CASE OF ENDOF ENDCASE ?DUP-IF
@@ -166,7 +88,7 @@ syn keyword forthCond ?DUP-0=-IF AHEAD CS-PICK CS-ROLL CATCH THROW WITHIN
" iterations
syn keyword forthLoop BEGIN WHILE REPEAT UNTIL AGAIN
syn keyword forthLoop ?DO LOOP I J K +DO U+DO -DO U-DO DO +LOOP -LOOP
-syn keyword forthLoop UNLOOP LEAVE ?LEAVE EXIT DONE FOR NEXT
+syn keyword forthLoop UNLOOP LEAVE ?LEAVE EXIT DONE FOR NEXT RECURSE
" new words
syn match forthClassDef '\<:class\s*[^ \t]\+\>'
@@ -181,8 +103,8 @@ syn keyword forthDefine COMPILE-ONLY COMPILE RESTRICT INTERPRET POSTPONE EXECUTE
syn keyword forthDefine LITERAL CREATE-INTERPRET/COMPILE INTERPRETATION>
syn keyword forthDefine <INTERPRETATION COMPILATION> <COMPILATION ] LASTXT
syn keyword forthDefine COMP' POSTPONE, FIND-NAME NAME>INT NAME?INT NAME>COMP
-syn keyword forthDefine NAME>STRING STATE C; CVARIABLE
-syn keyword forthDefine , 2, F, C,
+syn keyword forthDefine NAME>STRING STATE C; CVARIABLE BUFFER: MARKER
+syn keyword forthDefine , 2, F, C, COMPILE,
syn match forthDefine "\[IFDEF]"
syn match forthDefine "\[IFUNDEF]"
syn match forthDefine "\[THEN]"
@@ -203,6 +125,7 @@ syn match forthDefine "'"
syn match forthDefine '\<\[\>'
syn match forthDefine "\[']"
syn match forthDefine '\[COMPILE]'
+syn match forthDefine '\[CHAR]'
" debugging
syn keyword forthDebug PRINTDEBUGDATA PRINTDEBUGLINE
@@ -213,7 +136,7 @@ syn keyword forthAssembler ASSEMBLER CODE END-CODE ;CODE FLUSH-ICACHE C,
" basic character operations
syn keyword forthCharOps (.) CHAR EXPECT FIND WORD TYPE -TRAILING EMIT KEY
-syn keyword forthCharOps KEY? TIB CR
+syn keyword forthCharOps KEY? TIB CR BL COUNT SPACE SPACES
" recognize 'char (' or '[char] (' correctly, so it doesn't
" highlight everything after the paren as a comment till a closing ')'
syn match forthCharOps '\<char\s\S\s'
@@ -223,12 +146,15 @@ syn region forthCharOps start=+."\s+ skip=+\\"+ end=+"+
" char-number conversion
syn keyword forthConversion <<# <# # #> #>> #S (NUMBER) (NUMBER?) CONVERT D>F
syn keyword forthConversion D>S DIGIT DPL F>D HLD HOLD NUMBER S>D SIGN >NUMBER
-syn keyword forthConversion F>S S>F
+syn keyword forthConversion F>S S>F HOLDS
" interpreter, wordbook, compiler
syn keyword forthForth (LOCAL) BYE COLD ABORT >BODY >NEXT >LINK CFA >VIEW HERE
syn keyword forthForth PAD WORDS VIEW VIEW> N>LINK NAME> LINK> L>NAME FORGET
syn keyword forthForth BODY> ASSERT( ASSERT0( ASSERT1( ASSERT2( ASSERT3( )
+syn keyword forthForth >IN ACCEPT ENVIRONMENT? EVALUATE QUIT SOURCE ACTION-OF
+syn keyword forthForth DEFER! DEFER@ PARSE PARSE-NAME REFILL RESTORE-INPUT
+syn keyword forthForth SAVE-INPUT SOURCE-ID
syn region forthForth start=+ABORT"\s+ skip=+\\"+ end=+"+
" vocabularies
@@ -243,16 +169,17 @@ syn keyword forthFileWords KEY?-FILE WRITE-FILE WRITE-LINE EMIT-FILE
syn keyword forthFileWords FLUSH-FILE FILE-STATUS FILE-POSITION
syn keyword forthFileWords REPOSITION-FILE FILE-SIZE RESIZE-FILE
syn keyword forthFileWords SLURP-FILE SLURP-FID STDIN STDOUT STDERR
+syn keyword forthFileWords INCLUDE-FILE INCLUDED REQUIRED
syn keyword forthBlocks OPEN-BLOCKS USE LOAD --> BLOCK-OFFSET
syn keyword forthBlocks GET-BLOCK-FID BLOCK-POSITION LIST SCR BLOCK
syn keyword forthBlocks BUFER EMPTY-BUFFERS EMPTY-BUFFER UPDATE UPDATED?
syn keyword forthBlocks SAVE-BUFFERS SAVE-BUFFER FLUSH THRU +LOAD +THRU
-syn keyword forthBlocks BLOCK-INCLUDED
+syn keyword forthBlocks BLOCK-INCLUDED BLK
" numbers
syn keyword forthMath DECIMAL HEX BASE
-syn match forthInteger '\<-\=[0-9.]*[0-9.]\+\>'
-syn match forthInteger '\<&-\=[0-9.]*[0-9.]\+\>'
+syn match forthInteger '\<-\=[0-9]\+.\=\>'
+syn match forthInteger '\<&-\=[0-9]\+.\=\>'
" recognize hex and binary numbers, the '$' and '%' notation is for gforth
syn match forthInteger '\<\$\x*\x\+\>' " *1* --- dont't mess
syn match forthInteger '\<\x*\d\x*\>' " *2* --- this order!
@@ -260,28 +187,29 @@ syn match forthInteger '\<%[0-1]*[0-1]\+\>'
syn match forthFloat '\<-\=\d*[.]\=\d\+[DdEe]\d\+\>'
syn match forthFloat '\<-\=\d*[.]\=\d\+[DdEe][-+]\d\+\>'
-" XXX If you find this overkill you can remove it. This has to come after the
+" XXX If you find this overkill you can remove it. this has to come after the
" highlighting for numbers otherwise it has no effect.
syn region forthComment start='0 \[if\]' end='\[endif\]' end='\[then\]' contains=forthTodo
" Strings
-syn region forthString start=+\.*\"+ end=+"+ end=+$+ contains=@Spell
+syn region forthString start=+\.*\"+ end=+"+ end=+$+
" XXX
-syn region forthString start=+s\"+ end=+"+ end=+$+ contains=@Spell
-syn region forthString start=+c\"+ end=+"+ end=+$+ contains=@Spell
+syn region forthString start=+s\"+ end=+"+ end=+$+
+syn region forthString start=+s\\\"+ end=+"+ end=+$+
+syn region forthString start=+c\"+ end=+"+ end=+$+
" Comments
-syn match forthComment '\\\s.*$' contains=@Spell,forthTodo,forthSpaceError
-syn region forthComment start='\\S\s' end='.*' contains=@Spell,forthTodo,forthSpaceError
-syn match forthComment '\.(\s[^)]*)' contains=@Spell,forthTodo,forthSpaceError
-syn region forthComment start='\(^\|\s\)\zs(\s' skip='\\)' end=')' contains=@Spell,forthTodo,forthSpaceError
-syn region forthComment start='/\*' end='\*/' contains=@Spell,forthTodo,forthSpaceError
+syn match forthComment '\\\s.*$' contains=forthTodo,forthSpaceError
+syn region forthComment start='\\S\s' end='.*' contains=forthTodo,forthSpaceError
+syn match forthComment '\.(\s[^)]*)' contains=forthTodo,forthSpaceError
+syn region forthComment start='\(^\|\s\)\zs(\s' skip='\\)' end=')' contains=forthTodo,forthSpaceError
+syn region forthComment start='/\*' end='\*/' contains=forthTodo,forthSpaceError
" Include files
syn match forthInclude '^INCLUDE\s\+\k\+'
-syn match forthInclude '^require\s\+\k\+'
-syn match forthInclude '^fload\s\+'
-syn match forthInclude '^needs\s\+'
+syn match forthInclude '^REQUIRE\s\+\k\+'
+syn match forthInclude '^FLOAD\s\+'
+syn match forthInclude '^NEEDS\s\+'
" Locals definitions
syn region forthLocals start='{\s' start='{$' end='\s}' end='^}'
@@ -289,56 +217,43 @@ syn match forthLocals '{ }' " otherwise, at least two spaces between
syn region forthDeprecated start='locals|' end='|'
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_forth_syn_inits")
- if version < 508
- let did_forth_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default methods for highlighting. Can be overridden later.
- HiLink forthTodo Todo
- HiLink forthOperators Operator
- HiLink forthMath Number
- HiLink forthInteger Number
- HiLink forthFloat Float
- HiLink forthStack Special
- HiLink forthRstack Special
- HiLink forthFStack Special
- HiLink forthSP Special
- HiLink forthMemory Function
- HiLink forthAdrArith Function
- HiLink forthMemBlks Function
- HiLink forthCond Conditional
- HiLink forthLoop Repeat
- HiLink forthColonDef Define
- HiLink forthEndOfColonDef Define
- HiLink forthDefine Define
- HiLink forthDebug Debug
- HiLink forthAssembler Include
- HiLink forthCharOps Character
- HiLink forthConversion String
- HiLink forthForth Statement
- HiLink forthVocs Statement
- HiLink forthString String
- HiLink forthComment Comment
- HiLink forthClassDef Define
- HiLink forthEndOfClassDef Define
- HiLink forthObjectDef Define
- HiLink forthEndOfObjectDef Define
- HiLink forthInclude Include
- HiLink forthLocals Type " nothing else uses type and locals must stand out
- HiLink forthDeprecated Error " if you must, change to Type
- HiLink forthFileMode Function
- HiLink forthFileWords Statement
- HiLink forthBlocks Statement
- HiLink forthSpaceError Error
-
- delcommand HiLink
-endif
+hi def link forthTodo Todo
+hi def link forthOperators Operator
+hi def link forthMath Number
+hi def link forthInteger Number
+hi def link forthFloat Float
+hi def link forthStack Special
+hi def link forthRstack Special
+hi def link forthFStack Special
+hi def link forthSP Special
+hi def link forthMemory Function
+hi def link forthAdrArith Function
+hi def link forthMemBlks Function
+hi def link forthCond Conditional
+hi def link forthLoop Repeat
+hi def link forthColonDef Define
+hi def link forthEndOfColonDef Define
+hi def link forthDefine Define
+hi def link forthDebug Debug
+hi def link forthAssembler Include
+hi def link forthCharOps Character
+hi def link forthConversion String
+hi def link forthForth Statement
+hi def link forthVocs Statement
+hi def link forthString String
+hi def link forthComment Comment
+hi def link forthClassDef Define
+hi def link forthEndOfClassDef Define
+hi def link forthObjectDef Define
+hi def link forthEndOfObjectDef Define
+hi def link forthInclude Include
+hi def link forthLocals Type " nothing else uses type and locals must stand out
+hi def link forthDeprecated Error " if you must, change to Type
+hi def link forthFileMode Function
+hi def link forthFunction Function
+hi def link forthFileWords Statement
+hi def link forthBlocks Statement
+hi def link forthSpaceError Error
let b:current_syntax = "forth"
diff --git a/runtime/syntax/fortran.vim b/runtime/syntax/fortran.vim
index b470e56f60..4c26e78f16 100644
--- a/runtime/syntax/fortran.vim
+++ b/runtime/syntax/fortran.vim
@@ -1,16 +1,17 @@
" Vim syntax file
" Language: Fortran 2008 (and older: Fortran 2003, 95, 90, and 77)
-" Version: 0.97
-" Last Change: 2016 Feb. 26
+" Version: 100
+" Last Change: 2016 Oct. 29
" Maintainer: Ajit J. Thakkar <ajit@unb.ca>; <http://www2.unb.ca/~ajit/>
" Usage: For instructions, do :help fortran-syntax from Vim
" Credits:
-" Version 0.1 (April 2000) was based on the fortran 77 syntax file by Mario Eusebio and
-" Preben Guldberg. Since then, useful suggestions and contributions have been made,
-" in chronological order, by:
+" Version 0.1 (April 2000) for Fortran 95 was based on the Fortran 77 syntax file by
+" Mario Eusebio and Preben Guldberg. Since then, useful suggestions and contributions
+" have been made, in chronological order, by:
" Andrej Panjkov, Bram Moolenaar, Thomas Olsen, Michael Sternberg, Christian Reile,
" Walter Dieudonn้, Alexander Wagner, Roman Bertle, Charles Rendleman,
-" Andrew Griffiths, Joe Krahn, Hendrik Merx, Matt Thompson, and Jan Hermann.
+" Andrew Griffiths, Joe Krahn, Hendrik Merx, Matt Thompson, Jan Hermann,
+" Stefano Zaghi, Vishnu V. Krishnan and Judica๋l Grasset
if exists("b:current_syntax")
finish
@@ -108,6 +109,7 @@ syn match fortranUnitHeader "\<subroutine\>"
syn keyword fortranCall call
syn match fortranUnitHeader "\<function\>"
syn match fortranUnitHeader "\<program\>"
+syn match fortranUnitHeader "\<block\>"
syn keyword fortranKeyword return stop
syn keyword fortranConditional else then
syn match fortranConditional "\<if\>"
@@ -208,6 +210,7 @@ syn match fortranStorageClass "\<kind\s*="me=s+4
syn match fortranStorageClass "\<len\s*="me=s+3
syn match fortranUnitHeader "\<module\>"
+syn match fortranUnitHeader "\<submodule\>"
syn keyword fortranUnitHeader use only contains
syn keyword fortranUnitHeader result operator assignment
syn match fortranUnitHeader "\<interface\>"
@@ -231,8 +234,10 @@ syn match fortranIntrinsic "\<kind\>\s*[(,]"me=s+4
syn match fortranUnitHeader "\<end\s*function"
syn match fortranUnitHeader "\<end\s*interface"
syn match fortranUnitHeader "\<end\s*module"
+syn match fortranUnitHeader "\<end\s*submodule"
syn match fortranUnitHeader "\<end\s*program"
syn match fortranUnitHeader "\<end\s*subroutine"
+syn match fortranUnitHeader "\<end\s*block"
syn match fortranRepeat "\<end\s*do"
syn match fortranConditional "\<end\s*where"
syn match fortranConditional "\<select\s*case"
@@ -267,6 +272,7 @@ syn match fortranRepeat "\<end\s*forall"
syn keyword fortranIntrinsic null cpu_time
syn match fortranType "\<elemental\>"
syn match fortranType "\<pure\>"
+syn match fortranType "\<impure\>"
if exists("fortran_more_precise")
syn match fortranConstructName "\(\<end\s*forall\s\+\)\@<=\a\w*\>"
endif
@@ -286,8 +292,9 @@ if b:fortran_dialect == "f08"
syn keyword fortranReadWrite flush wait
syn keyword fortranIO decimal round iomsg
- syn keyword fortranType asynchronous nopass non_overridable pass protected volatile abstract extends import
+ syn keyword fortranType asynchronous nopass non_overridable pass protected volatile extends import
syn keyword fortranType non_intrinsic value bind deferred generic final enumerator
+ syn match fortranType "\<abstract\>"
syn match fortranType "\<class\>"
syn match fortranType "\<associate\>"
syn match fortranType "\<end\s*associate"
@@ -305,6 +312,7 @@ if b:fortran_dialect == "f08"
syn keyword fortranIntrinsic bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image
syn keyword fortranIO newunit
syn keyword fortranType contiguous
+ syn keyword fortranRepeat concurrent
" CUDA fortran
syn match fortranTypeCUDA "\<attributes\>"
@@ -360,6 +368,7 @@ else
endif
syn match fortranComment excludenl "!.*$" contains=@fortranCommentGroup,@spell
+syn match fortranOpenMP excludenl "^\s*!\$\(OMP\)\=&\=\s.*$"
"cpp is often used with Fortran
syn match cPreProc "^\s*#\s*\(define\|ifdef\)\>.*"
@@ -383,20 +392,24 @@ if exists("fortran_fold")
if (b:fortran_fixed_source == 1)
syn region fortranProgram transparent fold keepend start="^\s*program\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\(program\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranModule
+ syn region fortranModule transparent fold keepend start="^\s*submodule\s\+(\a\w*\s*\(:\a\w*\s*\)*)\s*\z\(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\(submodule\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranProgram,fortranModule
syn region fortranModule transparent fold keepend start="^\s*module\s\+\(procedure\)\@!\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\(module\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranProgram
- syn region fortranFunction transparent fold keepend extend start="^\s*\(elemental \|pure \|recursive \)\=\s*\(\(\(real \|integer \|logical \|complex \|double \s*precision \)\s*\((\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\|type\s\+(\s*\w\+\s*) \|character \((\(\s*len\s*=\)\=\s*\d\+\s*)\|(\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\=\s*function\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|function\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
- syn region fortranSubroutine transparent fold keepend extend start="^\s*\(elemental \|pure \|recursive \)\=\s*subroutine\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|subroutine\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
+ syn region fortranFunction transparent fold keepend extend start="^\s*\(elemental \|pure \|impure \|module \|recursive \)\=\s*\(\(\(real \|integer \|logical \|complex \|double \s*precision \)\s*\((\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\|type\s\+(\s*\w\+\s*) \|character \((\(\s*len\s*=\)\=\s*\d\+\s*)\|(\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\=\s*function\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|function\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
+ syn region fortranSubroutine transparent fold keepend extend start="^\s*\(elemental \|pure \|impure \|module \|recursive \)\=\s*subroutine\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|subroutine\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
syn region fortranBlockData transparent fold keepend start="\<block\s*data\(\s\+\z(\a\w*\)\)\=" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|block\s*data\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
- syn region fortranInterface transparent fold keepend extend start="^\s*interface\>" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*interface\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
- syn region fortranTypeDef transparent fold keepend extend start="^\s*type\s*\(,\s*\(public\|private\)\)\=\s*::" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*type\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
+ syn region fortranAssociate transparent fold keepend start="^\s*\<associate\s\+" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*associate" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction
+ syn region fortranInterface transparent fold keepend extend start="^\s*\(abstract \)\=\s*interface\>" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*interface\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
+ syn region fortranTypeDef transparent fold keepend extend start="^\s*type\s*\(,\s*\(public\|private\|abstract\)\)\=\s*::" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*type\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock,fortranInterface
else
syn region fortranProgram transparent fold keepend start="^\s*program\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\(program\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranModule
+ syn region fortranModule transparent fold keepend start="^\s*submodule\s\+(\a\w*\s*\(:\a\w*\s*\)*)\s*\z\(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\(submodule\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranProgram,fortranModule
syn region fortranModule transparent fold keepend start="^\s*module\s\+\(procedure\)\@!\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\(module\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranProgram
- syn region fortranFunction transparent fold keepend extend start="^\s*\(elemental \|pure \|recursive \)\=\s*\(\(\(real \|integer \|logical \|complex \|double \s*precision \)\s*\((\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\|type\s\+(\s*\w\+\s*) \|character \((\(\s*len\s*=\)\=\s*\d\+\s*)\|(\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\=\s*function\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|function\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
- syn region fortranSubroutine transparent fold keepend extend start="^\s*\(elemental \|pure \|recursive \)\=\s*subroutine\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|subroutine\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
+ syn region fortranFunction transparent fold keepend extend start="^\s*\(elemental \|pure \|impure \|module \|recursive \)\=\s*\(\(\(real \|integer \|logical \|complex \|double \s*precision \)\s*\((\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\|type\s\+(\s*\w\+\s*) \|character \((\(\s*len\s*=\)\=\s*\d\+\s*)\|(\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\=\s*function\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|function\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
+ syn region fortranSubroutine transparent fold keepend extend start="^\s*\(elemental \|pure \|impure \|module \|recursive \)\=\s*subroutine\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|subroutine\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
syn region fortranBlockData transparent fold keepend start="\<block\s*data\(\s\+\z(\a\w*\)\)\=" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|block\s*data\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
- syn region fortranInterface transparent fold keepend extend start="^\s*interface\>" skip="^\s*[!#].*$" excludenl end="\<end\s*interface\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
- syn region fortranTypeDef transparent fold keepend extend start="^\s*type\s*\(,\s*\(public\|private\)\)\=\s*::" skip="^\s*[!#].*$" excludenl end="\<end\s*type\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
+ syn region fortranAssociate transparent fold keepend start="^\s*\<associate\s\+" skip="^\s*[!#].*$" excludenl end="\<end\s*associate" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction
+ syn region fortranInterface transparent fold keepend extend start="^\s*\(abstract \)\=\s*interface\>" skip="^\s*[!#].*$" excludenl end="\<end\s*interface\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
+ syn region fortranTypeDef transparent fold keepend extend start="^\s*type\s*\(,\s*\(public\|private\|abstract\)\)\=\s*::" skip="^\s*[!#].*$" excludenl end="\<end\s*type\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock,fortranInterface
endif
if exists("fortran_fold_conditionals")
@@ -404,12 +417,12 @@ if exists("fortran_fold")
syn region fortran77Loop transparent fold keepend start="\<do\s\+\z(\d\+\)" end="^\s*\z1\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
syn region fortran90Loop transparent fold keepend extend start="\(\<end\s\+\)\@<!\<do\(\s\+\a\|\s*$\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*do\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
syn region fortranIfBlock transparent fold keepend extend start="\(\<e\(nd\|lse\)\s\+\)\@<!\<if\s*(.\+)\s*then\>" skip="^\([!c*]\|\s*#\).*$" end="\<end\s*if\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
- syn region fortranCase transparent fold keepend extend start="\<select\s*case\>" skip="^\([!c*]\|\s*#\).*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
+ syn region fortranCase transparent fold keepend extend start="\<select\s*\(case\|type\)\>" skip="^\([!c*]\|\s*#\).*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
else
syn region fortran77Loop transparent fold keepend start="\<do\s\+\z(\d\+\)" end="^\s*\z1\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
syn region fortran90Loop transparent fold keepend extend start="\(\<end\s\+\)\@<!\<do\(\s\+\a\|\s*$\)" skip="^\s*[!#].*$" excludenl end="\<end\s*do\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
syn region fortranIfBlock transparent fold keepend extend start="\(\<e\(nd\|lse\)\s\+\)\@<!\<if\s*(\(.\|&\s*\n\)\+)\(\s\|&\s*\n\)*then\>" skip="^\s*[!#].*$" end="\<end\s*if\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
- syn region fortranCase transparent fold keepend extend start="\<select\s*case\>" skip="^\s*[!#].*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
+ syn region fortranCase transparent fold keepend extend start="\<select\s*\(case\|type\)\>" skip="^\s*[!#].*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
endif
endif
@@ -507,6 +520,7 @@ hi def link cIncluded fortranString
hi def link cInclude Include
hi def link cPreProc PreProc
hi def link cPreCondit PreCondit
+hi def link fortranOpenMP PreProc
hi def link fortranParenError Error
hi def link fortranComment Comment
hi def link fortranSerialNumber Todo
diff --git a/runtime/syntax/foxpro.vim b/runtime/syntax/foxpro.vim
index ca5d7e2f9d..795859eac9 100644
--- a/runtime/syntax/foxpro.vim
+++ b/runtime/syntax/foxpro.vim
@@ -13,9 +13,8 @@
" corrected highlighting of comments at end of line (&&)
"
"
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -691,37 +690,27 @@ syn match foxproParenErr ")"
syn sync minlines=1 maxlines=3
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_foxpro_syn_inits")
- if version < 508
- let did_foxpro_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink foxproSpecial Special
- HiLink foxproAtSymbol Special
- HiLink foxproAtCmd Statement
- HiLink foxproPreProc PreProc
- HiLink foxproFunc Identifier
- HiLink foxproCmd Statement
- HiLink foxproEnBlk Type
- HiLink foxproSysVar String
- HiLink foxproString String
- HiLink foxproConst Constant
- HiLink foxproNumber Number
- HiLink foxproFloat Float
- HiLink foxproComment Comment
- HiLink foxproParenErr Error
- HiLink foxproCBConst PreProc
- HiLink foxproCBField Special
- HiLink foxproCBVar Identifier
- HiLink foxproCBWin Special
- HiLink foxproCBObject Identifier
+hi def link foxproSpecial Special
+hi def link foxproAtSymbol Special
+hi def link foxproAtCmd Statement
+hi def link foxproPreProc PreProc
+hi def link foxproFunc Identifier
+hi def link foxproCmd Statement
+hi def link foxproEnBlk Type
+hi def link foxproSysVar String
+hi def link foxproString String
+hi def link foxproConst Constant
+hi def link foxproNumber Number
+hi def link foxproFloat Float
+hi def link foxproComment Comment
+hi def link foxproParenErr Error
+hi def link foxproCBConst PreProc
+hi def link foxproCBField Special
+hi def link foxproCBVar Identifier
+hi def link foxproCBWin Special
+hi def link foxproCBObject Identifier
- delcommand HiLink
-endif
let b:current_syntax = "foxpro"
diff --git a/runtime/syntax/framescript.vim b/runtime/syntax/framescript.vim
index 39d75e8826..8b16d048a0 100644
--- a/runtime/syntax/framescript.vim
+++ b/runtime/syntax/framescript.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: FrameScript v4.0
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2007-02-22
+" Language: FrameScript v4.0
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-02-22
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/fstab.vim b/runtime/syntax/fstab.vim
index 3006d21fea..56237c0770 100644
--- a/runtime/syntax/fstab.vim
+++ b/runtime/syntax/fstab.vim
@@ -2,8 +2,8 @@
" Language: fstab file
" Maintainer: Radu Dineiu <radu.dineiu@gmail.com>
" URL: https://raw.github.com/rid9/vim-fstab/master/fstab.vim
-" Last Change: 2013 May 21
-" Version: 1.0
+" Last Change: 2017 Nov 09
+" Version: 1.2
"
" Credits:
" David Necas (Yeti) <yeti@physics.muni.cz>
@@ -19,9 +19,8 @@
" let fstab_unknown_device_errors = 0
" do not highlight unknown devices as errors
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -39,10 +38,14 @@ syn match fsDeviceError /\%([^a-zA-Z0-9_\/#@:\.-]\|^\w\{-}\ze\W\)/ contained
syn keyword fsDeviceKeyword contained none proc linproc tmpfs devpts devtmpfs sysfs usbfs
syn keyword fsDeviceKeyword contained LABEL nextgroup=fsDeviceLabel
syn keyword fsDeviceKeyword contained UUID nextgroup=fsDeviceUUID
+syn keyword fsDeviceKeyword contained PARTLABEL nextgroup=fsDevicePARTLABEL
+syn keyword fsDeviceKeyword contained PARTUUID nextgroup=fsDevicePARTUUID
syn keyword fsDeviceKeyword contained sshfs nextgroup=fsDeviceSshfs
syn match fsDeviceKeyword contained /^[a-zA-Z0-9.\-]\+\ze:/
syn match fsDeviceLabel contained /=[^ \t]\+/hs=s+1 contains=fsOperator
syn match fsDeviceUUID contained /=[^ \t]\+/hs=s+1 contains=fsOperator
+syn match fsDevicePARTLABEL contained /=[^ \t]\+/hs=s+1 contains=fsOperator
+syn match fsDevicePARTUUID contained /=[^ \t]\+/hs=s+1 contains=fsOperator
syn match fsDeviceSshfs contained /#[_=[:alnum:]\.\/+-]\+@[a-z0-9._-]\+\a\{2}:[^ \t]\+/hs=s+1 contains=fsOperator
" Mount Point
@@ -65,7 +68,7 @@ syn match fsOptionsString /[a-zA-Z0-9_-]\+/
syn keyword fsOptionsYesNo yes no
syn cluster fsOptionsCheckCluster contains=fsOptionsExt2Check,fsOptionsFatCheck
syn keyword fsOptionsSize 512 1024 2048
-syn keyword fsOptionsGeneral async atime auto bind current defaults dev devgid devmode devmtime devuid dirsync exec force fstab kudzu loop mand move noatime noauto noclusterr noclusterw nodev nodevmtime nodiratime noexec nomand nosuid nosymfollow nouser owner rbind rdonly remount ro rq rw suid suiddir supermount sw sync union update user users xx
+syn keyword fsOptionsGeneral async atime auto bind current defaults dev devgid devmode devmtime devuid dirsync exec force fstab kudzu loop mand move noatime noauto noclusterr noclusterw nodev nodevmtime nodiratime noexec nomand norelatime nosuid nosymfollow nouser owner rbind rdonly relatime remount ro rq rw suid suiddir supermount sw sync union update user users wxallowed xx
syn match fsOptionsGeneral /_netdev/
" Options: adfs
@@ -138,7 +141,7 @@ syn match fsOptionsKeywords contained /\<\%(dir\|file\|\)_umask=/ nextgroup=fsOp
syn match fsOptionsKeywords contained /\<\%(session\|part\)=/ nextgroup=fsOptionsNumber
" Options: ffs
-syn keyword fsOptionsKeyWords contained softdep
+syn keyword fsOptionsKeyWords contained noperm softdep
" Options: hpfs
syn match fsOptionsKeywords contained /\<case=/ nextgroup=fsOptionsHpfsCase
@@ -229,66 +232,57 @@ syn match fsFreqPass /\s\+.\{-}$/ contains=@fsFreqPassCluster,@fsGeneralCluster
" Whole line comments
syn match fsCommentLine /^#.*$/ contains=@Spell
-if version >= 508 || !exists("did_config_syntax_inits")
- if version < 508
- let did_config_syntax_inits = 1
- command! -nargs=+ HiLink hi link <args>
- else
- command! -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink fsOperator Operator
- HiLink fsComment Comment
- HiLink fsCommentLine Comment
-
- HiLink fsTypeKeyword Type
- HiLink fsDeviceKeyword Identifier
- HiLink fsDeviceLabel String
- HiLink fsDeviceUUID String
- HiLink fsDeviceSshfs String
- HiLink fsFreqPassNumber Number
-
- if exists('fstab_unknown_fs_errors') && fstab_unknown_fs_errors == 1
- HiLink fsTypeUnknown Error
- endif
-
- if !exists('fstab_unknown_device_errors') || fstab_unknown_device_errors == 1
- HiLink fsDeviceError Error
- endif
-
- HiLink fsMountPointError Error
- HiLink fsMountPointKeyword Keyword
- HiLink fsFreqPassError Error
-
- HiLink fsOptionsGeneral Type
- HiLink fsOptionsKeywords Keyword
- HiLink fsOptionsNumber Number
- HiLink fsOptionsNumberOctal Number
- HiLink fsOptionsString String
- HiLink fsOptionsSize Number
- HiLink fsOptionsExt2Check String
- HiLink fsOptionsExt2Errors String
- HiLink fsOptionsExt3Journal String
- HiLink fsOptionsExt3Data String
- HiLink fsOptionsExt4Journal String
- HiLink fsOptionsExt4Data String
- HiLink fsOptionsExt4Barrier Number
- HiLink fsOptionsFatCheck String
- HiLink fsOptionsConv String
- HiLink fsOptionsFatType Number
- HiLink fsOptionsYesNo String
- HiLink fsOptionsHpfsCase String
- HiLink fsOptionsIsoMap String
- HiLink fsOptionsReiserHash String
- HiLink fsOptionsSshYesNoAsk String
- HiLink fsOptionsUfsType String
- HiLink fsOptionsUfsError String
-
- HiLink fsOptionsVfatShortname String
-
- delcommand HiLink
+hi def link fsOperator Operator
+hi def link fsComment Comment
+hi def link fsCommentLine Comment
+
+hi def link fsTypeKeyword Type
+hi def link fsDeviceKeyword Identifier
+hi def link fsDeviceLabel String
+hi def link fsDeviceUUID String
+hi def link fsDevicePARTLABEL String
+hi def link fsDevicePARTUUID String
+hi def link fsDeviceSshfs String
+hi def link fsFreqPassNumber Number
+
+if exists('fstab_unknown_fs_errors') && fstab_unknown_fs_errors == 1
+ hi def link fsTypeUnknown Error
endif
+if !exists('fstab_unknown_device_errors') || fstab_unknown_device_errors == 1
+ hi def link fsDeviceError Error
+endif
+
+hi def link fsMountPointError Error
+hi def link fsMountPointKeyword Keyword
+hi def link fsFreqPassError Error
+
+hi def link fsOptionsGeneral Type
+hi def link fsOptionsKeywords Keyword
+hi def link fsOptionsNumber Number
+hi def link fsOptionsNumberOctal Number
+hi def link fsOptionsString String
+hi def link fsOptionsSize Number
+hi def link fsOptionsExt2Check String
+hi def link fsOptionsExt2Errors String
+hi def link fsOptionsExt3Journal String
+hi def link fsOptionsExt3Data String
+hi def link fsOptionsExt4Journal String
+hi def link fsOptionsExt4Data String
+hi def link fsOptionsExt4Barrier Number
+hi def link fsOptionsFatCheck String
+hi def link fsOptionsConv String
+hi def link fsOptionsFatType Number
+hi def link fsOptionsYesNo String
+hi def link fsOptionsHpfsCase String
+hi def link fsOptionsIsoMap String
+hi def link fsOptionsReiserHash String
+hi def link fsOptionsSshYesNoAsk String
+hi def link fsOptionsUfsType String
+hi def link fsOptionsUfsError String
+
+hi def link fsOptionsVfatShortname String
+
let b:current_syntax = "fstab"
let &cpo = s:cpo_save
diff --git a/runtime/syntax/fvwm2m4.vim b/runtime/syntax/fvwm2m4.vim
index 243da18fa7..e296273e31 100644
--- a/runtime/syntax/fvwm2m4.vim
+++ b/runtime/syntax/fvwm2m4.vim
@@ -5,12 +5,9 @@
" URI: http://physics.muni.cz/~yeti/download/syntax/fvwmm4.vim
" Setup
-if version >= 600
- if exists('b:current_syntax')
- finish
- endif
-else
- syntax clear
+" quit when a syntax file was already loaded
+if exists('b:current_syntax')
+ finish
endif
" Let included files know they are included
@@ -19,19 +16,11 @@ if !exists('main_syntax')
endif
" Include M4 syntax
-if version >= 600
- runtime! syntax/m4.vim
-else
- so <sfile>:p:h/m4.vim
-endif
+runtime! syntax/m4.vim
unlet b:current_syntax
" Include Fvwm2 syntax (Fvwm1 doesn't have M4 preprocessor)
-if version >= 600
- runtime! syntax/fvwm.vim
-else
- so <sfile>:p:h/fvwm.vim
-endif
+runtime! syntax/fvwm.vim
unlet b:current_syntax
" That's all!
diff --git a/runtime/syntax/gdb.vim b/runtime/syntax/gdb.vim
index 64e89cce7f..25a21d184e 100644
--- a/runtime/syntax/gdb.vim
+++ b/runtime/syntax/gdb.vim
@@ -4,11 +4,8 @@
" URL: http://www.fleiner.com/vim/syntax/gdb.vim
" Last Change: 2012 Oct 05
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -87,27 +84,17 @@ endif
exec "syn sync ccomment gdbComment minlines=" . gdb_minlines
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_gdb_syn_inits")
- if version < 508
- let did_gdb_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink gdbFuncDef Function
- HiLink gdbComment Comment
- HiLink gdbStatement Statement
- HiLink gdbString String
- HiLink gdbCharacter Character
- HiLink gdbVariable Identifier
- HiLink gdbSet Constant
- HiLink gdbInfo Type
- HiLink gdbDocument Special
- HiLink gdbNumber Number
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+hi def link gdbFuncDef Function
+hi def link gdbComment Comment
+hi def link gdbStatement Statement
+hi def link gdbString String
+hi def link gdbCharacter Character
+hi def link gdbVariable Identifier
+hi def link gdbSet Constant
+hi def link gdbInfo Type
+hi def link gdbDocument Special
+hi def link gdbNumber Number
let b:current_syntax = "gdb"
diff --git a/runtime/syntax/gdmo.vim b/runtime/syntax/gdmo.vim
index 86c6d5c76c..009f402ffa 100644
--- a/runtime/syntax/gdmo.vim
+++ b/runtime/syntax/gdmo.vim
@@ -5,11 +5,8 @@
" URL: http://classicalprogrammer.wikidot.com/local--files/vim-syntax-file-for-gdmo/gdmo.vim
" Last change: 8th June, 2011
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -64,32 +61,22 @@ syn match gdmoBraces "[{}]"
syn sync ccomment gdmoComment
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_gdmo_syntax_inits")
- if version < 508
- let did_gdmo_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink gdmoCategory Structure
- HiLink gdmoRelationship Macro
- HiLink gdmoDefinition Statement
- HiLink gdmoReference Type
- HiLink gdmoExtension Operator
- HiLink gdmoBraces Function
- HiLink gdmoSpecial Special
- HiLink gdmoString String
- HiLink gdmoCharacter Character
- HiLink gdmoSpecialCharacter gdmoSpecial
- HiLink gdmoComment Comment
- HiLink gdmoLineComment gdmoComment
- HiLink gdmoType Type
+hi def link gdmoCategory Structure
+hi def link gdmoRelationship Macro
+hi def link gdmoDefinition Statement
+hi def link gdmoReference Type
+hi def link gdmoExtension Operator
+hi def link gdmoBraces Function
+hi def link gdmoSpecial Special
+hi def link gdmoString String
+hi def link gdmoCharacter Character
+hi def link gdmoSpecialCharacter gdmoSpecial
+hi def link gdmoComment Comment
+hi def link gdmoLineComment gdmoComment
+hi def link gdmoType Type
- delcommand HiLink
-endif
let b:current_syntax = "gdmo"
diff --git a/runtime/syntax/gedcom.vim b/runtime/syntax/gedcom.vim
index 98851cc942..cd09e0fa22 100644
--- a/runtime/syntax/gedcom.vim
+++ b/runtime/syntax/gedcom.vim
@@ -3,11 +3,8 @@
" Maintainer: Paul Johnson (pjcj@transeda.com)
" Version 1.059 - 23rd December 1999
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -41,26 +38,16 @@ syntax match gedcom_date "\d\{1,2}\s\+\(jan\|feb\|mar\|apr\|may\|jun\|jul\|aug\|
syntax match gedcom_date ".*" contained
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_gedcom_syntax_inits")
- if version < 508
- let did_gedcom_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink gedcom_record Statement
- HiLink gedcom_id Comment
- HiLink gedcom_ii PreProc
- HiLink gedcom_in Type
- HiLink gedcom_name PreProc
- HiLink gedcom_cname Type
- HiLink gedcom_surname Identifier
- HiLink gedcom_date Constant
+hi def link gedcom_record Statement
+hi def link gedcom_id Comment
+hi def link gedcom_ii PreProc
+hi def link gedcom_in Type
+hi def link gedcom_name PreProc
+hi def link gedcom_cname Type
+hi def link gedcom_surname Identifier
+hi def link gedcom_date Constant
- delcommand HiLink
-endif
let b:current_syntax = "gedcom"
diff --git a/runtime/syntax/gitcommit.vim b/runtime/syntax/gitcommit.vim
index b0315a9465..5e0642fbcc 100644
--- a/runtime/syntax/gitcommit.vim
+++ b/runtime/syntax/gitcommit.vim
@@ -2,7 +2,7 @@
" Language: git commit file
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
" Filenames: *.git/COMMIT_EDITMSG
-" Last Change: 2013 May 30
+" Last Change: 2016 Aug 29
if exists("b:current_syntax")
finish
@@ -39,9 +39,10 @@ syn region gitcommitDiscarded start=/^# Change\%(s not staged for commit\|d but
syn region gitcommitSelected start=/^# Changes to be committed:/ end=/^#$\|^#\@!/ contains=gitcommitHeader,gitcommitHead,gitcommitSelectedType fold
syn region gitcommitUnmerged start=/^# Unmerged paths:/ end=/^#$\|^#\@!/ contains=gitcommitHeader,gitcommitHead,gitcommitUnmergedType fold
-syn match gitcommitDiscardedType "\t\@<=[a-z][a-z ]*[a-z]: "he=e-2 contained containedin=gitcommitComment nextgroup=gitcommitDiscardedFile skipwhite
-syn match gitcommitSelectedType "\t\@<=[a-z][a-z ]*[a-z]: "he=e-2 contained containedin=gitcommitComment nextgroup=gitcommitSelectedFile skipwhite
-syn match gitcommitUnmergedType "\t\@<=[a-z][a-z ]*[a-z]: "he=e-2 contained containedin=gitcommitComment nextgroup=gitcommitUnmergedFile skipwhite
+
+syn match gitcommitDiscardedType "\t\@<=[[:lower:]][^:]*[[:lower:]]: "he=e-2 contained containedin=gitcommitComment nextgroup=gitcommitDiscardedFile skipwhite
+syn match gitcommitSelectedType "\t\@<=[[:lower:]][^:]*[[:lower:]]: "he=e-2 contained containedin=gitcommitComment nextgroup=gitcommitSelectedFile skipwhite
+syn match gitcommitUnmergedType "\t\@<=[[:lower:]][^:]*[[:lower:]]: "he=e-2 contained containedin=gitcommitComment nextgroup=gitcommitUnmergedFile skipwhite
syn match gitcommitDiscardedFile ".\{-\}\%($\| -> \)\@=" contained nextgroup=gitcommitDiscardedArrow
syn match gitcommitSelectedFile ".\{-\}\%($\| -> \)\@=" contained nextgroup=gitcommitSelectedArrow
syn match gitcommitUnmergedFile ".\{-\}\%($\| -> \)\@=" contained nextgroup=gitcommitSelectedArrow
diff --git a/runtime/syntax/gitolite.vim b/runtime/syntax/gitolite.vim
index 718aad0de9..3a6da26cc6 100644
--- a/runtime/syntax/gitolite.vim
+++ b/runtime/syntax/gitolite.vim
@@ -1,8 +1,10 @@
" Vim syntax file
" Language: gitolite configuration
-" URL: https://github.com/tmatilai/gitolite.vim
-" Maintainer: Teemu Matilainen <teemu.matilainen@iki.fi>
-" Last Change: 2011-12-25
+" URL: https://github.com/sitaramc/gitolite/blob/master/contrib/vim/syntax/gitolite.vim
+" (https://raw.githubusercontent.com/sitaramc/gitolite/master/contrib/vim/syntax/gitolite.vim)
+" Maintainer: Sitaram Chamarty <sitaramc@gmail.com>
+" (former Maintainer: Teemu Matilainen <teemu.matilainen@iki.fi>)
+" Last Change: 2017 Oct 05
if exists("b:current_syntax")
finish
@@ -11,74 +13,80 @@ endif
let s:cpo_save = &cpo
set cpo&vim
-" Comment
-syn match gitoliteComment "\(^\|\s\)#.*" contains=gitoliteTodo
-syn keyword gitoliteTodo TODO FIXME XXX NOT contained
-
-" Groups, users and repos
-syn match gitoliteGroupDef "\(^\s*\)\@<=@[^=]\{-1,}\(\s*=\)\@=" contains=gitoliteSpaceError,gitoliteUserError nextgroup=gitoliteGroupDefSep
-syn match gitoliteGroupDefSep "\s*=" contained nextgroup=gitoliteRepoLine
-syn match gitoliteRepoDef "^\s*repo\s" nextgroup=gitoliteRepoLine
-
-syn match gitoliteRepoLine ".*" contained transparent contains=gitoliteGroup,gitoliteWildRepo,gitoliteCreator,gitoliteExtCmdHelper,gitoliteRepoError,gitoliteComment
-syn match gitoliteUserLine ".*" contained transparent contains=gitoliteGroup,gitolitePreProc,gitoliteUserError,gitoliteComment
-
-syn match gitoliteWildRepo "[ \t=]\@<=[^ \t]*[\\^$|()[\]*?{},][^ \t]*" contained contains=gitoliteCreator,gitoliteRepoError
-syn match gitoliteGroup "[ \t=]\@<=@[^ \t]\+" contained contains=gitoliteUserError
-
-syn keyword gitoliteCreator CREATER CREATOR contained
-syn keyword gitolitePreProc CREATER CREATOR READERS WRITERS contained
-
-syn match gitoliteExtCmdHelper "[ \t=]\@<=EXTCMD/" contained nextgroup=gitoliteExtCmd
-syn match gitoliteExtCmd "rsync\(\s\|$\)" contained
-
-" Illegal characters
-syn match gitoliteRepoError "[^ \t0-9a-zA-Z._@+/\\^$|()[\]*?{},-]\+" contained
-syn match gitoliteUserError "[^ \t0-9a-zA-Z._@+-]\+" contained
-syn match gitoliteSpaceError "\s\+" contained
-
-" Permission
-syn match gitoliteKeyword "^\s*\(C\|R\|RW\|RW+\|RWC\|RW+C\|RWD\|RW+D\|RWCD\|RW+CD\)[ \t=]\@=" nextgroup=gitoliteRefex
-syn match gitoliteKeyword "^\s*-[ \t=]\@=" nextgroup=gitoliteDenyRefex
-syn match gitoliteRefex "[^=]*="he=e-1 contained contains=gitoliteSpecialRefex,gitoliteGroup nextgroup=gitoliteUserLine
-syn match gitoliteDenyRefex "[^=]*="he=e-1 contained contains=gitoliteSpecialRefex,gitoliteGroup nextgroup=gitoliteDenyUsers
-syn match gitoliteSpecialRefex "\sNAME/"he=e-1 contained
-syn match gitoliteSpecialRefex "/USER/"hs=s+1,he=e-1 contained
-syn match gitoliteDenyUsers ".*" contained contains=gitoliteUserError,gitoliteComment
-
-" Configuration
-syn match gitoliteKeyword "^\s*config\s\+" nextgroup=gitoliteConfVariable
-syn match gitoliteConfVariable "[^=]*" contained
-
-" Include
-syn match gitoliteInclude "^\s*\(include\|subconf\)\s"
-
-" String
-syn region gitoliteString start=+"+ end=+"+ oneline
-
-" Define the default highlighting
-hi def link gitoliteComment Comment
-hi def link gitoliteTodo Todo
-hi def link gitoliteGroupDef gitoliteGroup
-hi def link gitoliteGroup Identifier
-hi def link gitoliteWildRepo Special
-hi def link gitoliteRepoError gitoliteError
-hi def link gitoliteUserError gitoliteError
-hi def link gitoliteSpaceError gitoliteError
-hi def link gitoliteError Error
-hi def link gitoliteCreator gitolitePreProc
-hi def link gitolitePreProc PreProc
-hi def link gitoliteExtCmdHelper PreProc
-hi def link gitoliteExtCmd Special
-hi def link gitoliteRepoDef Type
-hi def link gitoliteKeyword Keyword
-hi def link gitoliteRefex String
-hi def link gitoliteDenyRefex gitoliteRefex
-hi def link gitoliteSpecialRefex PreProc
-hi def link gitoliteDenyUsers WarningMsg
-hi def link gitoliteConfVariable Identifier
-hi def link gitoliteInclude Include
-hi def link gitoliteString String
+" this seems to be the best way, for now.
+syntax sync fromstart
+
+" ---- common stuff
+
+syn match gitoliteGroup '@\S\+'
+
+syn match gitoliteComment '#.*' contains=gitoliteTodo
+syn keyword gitoliteTodo TODO FIXME XXX NOT contained
+
+" ---- main section
+
+" catch template-data syntax appearing outside template-data section
+syn match gitoliteRepoError '^\s*repo.*='
+syn match gitoliteRepoError '^\s*\S\+\s*=' " this gets overridden later when first word is a perm, don't worry
+
+" normal gitolite group and repo lines
+syn match gitoliteGroupLine '^\s*@\S\+\s*=\s*\S.*$' contains=gitoliteGroup,gitoliteComment
+syn match gitoliteRepoLine '^\s*repo\s\+[^=]*$' contains=gitoliteRepo,gitoliteGroup,gitoliteComment
+syn keyword gitoliteRepo repo contained
+
+syn keyword gitoliteSpecialRepo CREATOR
+
+" normal gitolite rule lines
+syn match gitoliteRuleLine '^\s*\(-\|C\|R\|RW+\?C\?D\?\)\s[^#]*' contains=gitoliteRule,gitoliteCreateRule,gitoliteDenyRule,gitoliteRefex,gitoliteUsers,gitoliteGroup
+syn match gitoliteRule '\(^\s*\)\@<=\(-\|C\|R\|RW+\?C\?D\?\)\s\@=' contained
+syn match gitoliteRefex '\(^\s*\(-\|R\|RW+\?C\?D\?\)\s\+\)\@<=\S.\{-}\(\s*=\)\@=' contains=gitoliteSpecialRefex
+syn match gitoliteSpecialRefex 'NAME/'
+syn match gitoliteSpecialRefex '/USER/'
+syn match gitoliteCreateRule '\(^\s*C\s.*=\s*\)\@<=\S[^#]*[^# ]' contained contains=gitoliteGroup
+syn match gitoliteDenyRule '\(^\s*-\s.*=\s*\)\@<=\S[^#]*[^# ]' contained
+
+" normal gitolite config (and similar) lines
+syn match gitoliteConfigLine '^\s*\(config\|option\|include\|subconf\)\s[^#]*' contains=gitoliteConfigKW,gitoliteConfigKey,gitoliteConfigVal,gitoliteComment
+syn keyword gitoliteConfigKW config option include subconf contained
+syn match gitoliteConfigKey '\(\(config\|option\)\s\+\)\@<=[^ =]*' contained
+syn match gitoliteConfigVal '\(=\s*\)\@<=\S.*' contained
+
+" ---- template-data section
+
+syn region gitoliteTemplateLine matchgroup=PreProc start='^=begin template-data$' end='^=end$' contains=gitoliteTplRepoLine,gitoliteTplRoleLine,gitoliteGroup,gitoliteComment,gitoliteTplError
+
+syn match gitoliteTplRepoLine '^\s*repo\s\+\S.*=.*' contained contains=gitoliteTplRepo,gitoliteTplTemplates,gitoliteGroup
+syn keyword gitoliteTplRepo repo contained
+syn match gitoliteTplTemplates '\(=\s*\)\@<=\S.*' contained contains=gitoliteGroup,gitoliteComment
+
+syn match gitoliteTplRoleLine '^\s*\S\+\s*=\s*.*' contained contains=gitoliteTplRole,gitoliteGroup,gitoliteComment
+syn match gitoliteTplRole '\S\+\s*='he=e-1 contained
+
+" catch normal gitolite rules appearing in template-data section
+syn match gitoliteTplError '^\s*repo[^=]*$' contained
+syn match gitoliteTplError '^\s*\(-\|R\|RW+\?C\?D\?\)\s'he=e-1 contained
+syn match gitoliteTplError '^\s*\(config\|option\|include\|subconf\)\s'he=e-1 contained
+syn match gitoliteTplError '^\s*@\S\+\s*=' contained contains=NONE
+
+hi def link gitoliteGroup Identifier
+hi def link gitoliteComment Comment
+hi def link gitoliteTodo ToDo
+hi def link gitoliteRepoError Error
+hi def link gitoliteGroupLine PreProc
+hi def link gitoliteRepo Keyword
+hi def link gitoliteSpecialRepo PreProc
+hi def link gitoliteRule Keyword
+hi def link gitoliteCreateRule PreProc
+hi def link gitoliteDenyRule WarningMsg
+hi def link gitoliteRefex Constant
+hi def link gitoliteSpecialRefex PreProc
+hi def link gitoliteConfigKW Keyword
+hi def link gitoliteConfigKey Identifier
+hi def link gitoliteConfigVal String
+hi def link gitoliteTplRepo Keyword
+hi def link gitoliteTplTemplates Constant
+hi def link gitoliteTplRole Constant
+hi def link gitoliteTplError Error
let b:current_syntax = "gitolite"
diff --git a/runtime/syntax/gitrebase.vim b/runtime/syntax/gitrebase.vim
index a7460280d3..a944c14dd7 100644
--- a/runtime/syntax/gitrebase.vim
+++ b/runtime/syntax/gitrebase.vim
@@ -2,7 +2,7 @@
" Language: git rebase --interactive
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
" Filenames: git-rebase-todo
-" Last Change: 2013 May 30
+" Last Change: 2016 Aug 29
if exists("b:current_syntax")
finish
@@ -18,6 +18,7 @@ syn match gitrebaseEdit "\v^e%(dit)=>" nextgroup=gitrebaseCommit skipwhite
syn match gitrebaseSquash "\v^s%(quash)=>" nextgroup=gitrebaseCommit skipwhite
syn match gitrebaseFixup "\v^f%(ixup)=>" nextgroup=gitrebaseCommit skipwhite
syn match gitrebaseExec "\v^%(x|exec)>" nextgroup=gitrebaseCommand skipwhite
+syn match gitrebaseDrop "\v^d%(rop)=>" nextgroup=gitrebaseCommit skipwhite
syn match gitrebaseSummary ".*" contains=gitrebaseHash contained
syn match gitrebaseCommand ".*" contained
syn match gitrebaseComment "^#.*" contains=gitrebaseHash
@@ -31,6 +32,7 @@ hi def link gitrebaseEdit PreProc
hi def link gitrebaseSquash Type
hi def link gitrebaseFixup Special
hi def link gitrebaseExec Function
+hi def link gitrebaseDrop Comment
hi def link gitrebaseSummary String
hi def link gitrebaseComment Comment
hi def link gitrebaseSquashError Error
diff --git a/runtime/syntax/gitsendemail.vim b/runtime/syntax/gitsendemail.vim
index 8b938116fa..8fdf6839c8 100644
--- a/runtime/syntax/gitsendemail.vim
+++ b/runtime/syntax/gitsendemail.vim
@@ -1,14 +1,18 @@
" Vim syntax file
" Language: git send-email message
" Maintainer: Tim Pope
-" Filenames: *.msg.[0-9]* (first line is "From ... # This line is ignored.")
-" Last Change: 2010 May 21
+" Filenames: .gitsendemail.*
+" Last Change: 2016 Aug 29
if exists("b:current_syntax")
finish
endif
runtime! syntax/mail.vim
+unlet! b:current_syntax
+syn include @gitsendemailDiff syntax/diff.vim
+syn region gitsendemailDiff start=/\%(^diff --\%(git\|cc\|combined\) \)\@=/ end=/^-- %/ fold contains=@gitsendemailDiff
+
syn case match
syn match gitsendemailComment "\%^From.*#.*"
diff --git a/runtime/syntax/gkrellmrc.vim b/runtime/syntax/gkrellmrc.vim
index 6ce1238416..f005ca2dc8 100644
--- a/runtime/syntax/gkrellmrc.vim
+++ b/runtime/syntax/gkrellmrc.vim
@@ -6,19 +6,12 @@
" URL: http://trific.ath.cx/Ftp/vim/syntax/gkrellmrc.vim
" Setup
-if version >= 600
- if exists("b:current_syntax")
- finish
- endif
-else
- syntax clear
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
endif
-if version >= 600
- setlocal iskeyword=_,-,a-z,A-Z,48-57
-else
- set iskeyword=_,-,a-z,A-Z,48-57
-endif
+setlocal iskeyword=_,-,a-z,A-Z,48-57
syn case match
@@ -55,37 +48,28 @@ syn keyword gkrellmrcStyleCmd StyleMeter StyleChart StylePanel
syn keyword gkrellmrcStyleItem textcolor alt_textcolor font alt_font transparency border label_position margin margins left_margin right_margin top_margin bottom_margin krell_depth krell_yoff krell_x_hot krell_expand krell_left_margin krell_right_margin
" Define the default highlighting
-if version >= 508 || !exists("did_gtkrc_syntax_inits")
- if version < 508
- let did_gtkrc_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink gkrellmrcComment Comment
- HiLink gkrellmrcFixme Todo
+hi def link gkrellmrcComment Comment
+hi def link gkrellmrcFixme Todo
- HiLink gkrellmrcString gkrellmrcConstant
- HiLink gkrellmrcNumber gkrellmrcConstant
- HiLink gkrellmrcRGBColor gkrellmrcConstant
- HiLink gkrellmrcExpandMode gkrellmrcConstant
- HiLink gkrellmrcConstant Constant
+hi def link gkrellmrcString gkrellmrcConstant
+hi def link gkrellmrcNumber gkrellmrcConstant
+hi def link gkrellmrcRGBColor gkrellmrcConstant
+hi def link gkrellmrcExpandMode gkrellmrcConstant
+hi def link gkrellmrcConstant Constant
- HiLink gkrellmrcMeterName gkrellmrcClass
- HiLink gkrellmrcChartName gkrellmrcClass
- HiLink gkrellmrcSpecialClassName gkrellmrcClass
- HiLink gkrellmrcClass Type
+hi def link gkrellmrcMeterName gkrellmrcClass
+hi def link gkrellmrcChartName gkrellmrcClass
+hi def link gkrellmrcSpecialClassName gkrellmrcClass
+hi def link gkrellmrcClass Type
- HiLink gkrellmrcGlobal gkrellmrcItem
- HiLink gkrellmrcBuiltinExt gkrellmrcItem
- HiLink gkrellmrcStyleItem gkrellmrcItem
- HiLink gkrellmrcItem Function
+hi def link gkrellmrcGlobal gkrellmrcItem
+hi def link gkrellmrcBuiltinExt gkrellmrcItem
+hi def link gkrellmrcStyleItem gkrellmrcItem
+hi def link gkrellmrcItem Function
- HiLink gkrellmrcSetCmd Special
- HiLink gkrellmrcStyleCmd Statement
+hi def link gkrellmrcSetCmd Special
+hi def link gkrellmrcStyleCmd Statement
- delcommand HiLink
-endif
let b:current_syntax = "gkrellmrc"
diff --git a/runtime/syntax/gnash.vim b/runtime/syntax/gnash.vim
index f9e2b519a5..cce522dd86 100644
--- a/runtime/syntax/gnash.vim
+++ b/runtime/syntax/gnash.vim
@@ -15,11 +15,8 @@
" Vim is Charityware, see ":help Uganda"
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax") || &compatible
+" quit when a syntax file was already loaded
+if exists("b:current_syntax") || &compatible
finish
endif
diff --git a/runtime/syntax/gnuplot.vim b/runtime/syntax/gnuplot.vim
index d85932d401..7777cc9e46 100644
--- a/runtime/syntax/gnuplot.vim
+++ b/runtime/syntax/gnuplot.vim
@@ -20,9 +20,8 @@
" For vim version 5.x: Clear all syntax items
" For vim version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -501,54 +500,44 @@ syn keyword gnuplotStatement shell splot spstats stats system test undefine
syn keyword gnuplotStatement unset update
" ---- Define the default highlighting ---- "
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_gnuplot_syntax_inits")
- if version < 508
- let did_gnuplot_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " ---- Comments ---- "
- HiLink gnuplotComment Comment
-
- " ---- Constants ---- "
- HiLink gnuplotString String
- HiLink gnuplotNumber Number
- HiLink gnuplotFloat Float
-
- " ---- Identifiers ---- "
- HiLink gnuplotIdentifier Identifier
-
- " ---- Statements ---- "
- HiLink gnuplotConditional Conditional
- HiLink gnuplotRepeat Repeat
- HiLink gnuplotKeyword Keyword
- HiLink gnuplotOperator Operator
-
- " ---- PreProcs ---- "
- HiLink gnuplotMacro Macro
-
- " ---- Types ---- "
- HiLink gnuplotStatement Type
- HiLink gnuplotFunc Identifier
-
- " ---- Specials ---- "
- HiLink gnuplotSpecial Special
- HiLink gnuplotUnit Special
- HiLink gnuplotExternal Special
-
- " ---- Errors ---- "
- HiLink gnuplotError Error
- HiLink gnuplotOctalError Error
-
- " ---- Todos ---- "
- HiLink gnuplotTodo Todo
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+" ---- Comments ---- "
+hi def link gnuplotComment Comment
+
+" ---- Constants ---- "
+hi def link gnuplotString String
+hi def link gnuplotNumber Number
+hi def link gnuplotFloat Float
+
+" ---- Identifiers ---- "
+hi def link gnuplotIdentifier Identifier
+
+" ---- Statements ---- "
+hi def link gnuplotConditional Conditional
+hi def link gnuplotRepeat Repeat
+hi def link gnuplotKeyword Keyword
+hi def link gnuplotOperator Operator
+
+" ---- PreProcs ---- "
+hi def link gnuplotMacro Macro
+
+" ---- Types ---- "
+hi def link gnuplotStatement Type
+hi def link gnuplotFunc Identifier
+
+" ---- Specials ---- "
+hi def link gnuplotSpecial Special
+hi def link gnuplotUnit Special
+hi def link gnuplotExternal Special
+
+" ---- Errors ---- "
+hi def link gnuplotError Error
+hi def link gnuplotOctalError Error
+
+" ---- Todos ---- "
+hi def link gnuplotTodo Todo
+
let b:current_syntax = "gnuplot"
diff --git a/runtime/syntax/godoc.vim b/runtime/syntax/godoc.vim
index 3a07903a77..0603f51c83 100644
--- a/runtime/syntax/godoc.vim
+++ b/runtime/syntax/godoc.vim
@@ -10,11 +10,9 @@ endif
syn case match
syn match godocTitle "^\([A-Z][A-Z ]*\)$"
-command -nargs=+ HiLink hi def link <args>
-HiLink godocTitle Title
+hi def link godocTitle Title
-delcommand HiLink
let b:current_syntax = 'godoc'
diff --git a/runtime/syntax/gp.vim b/runtime/syntax/gp.vim
index f46a465215..aecf7df48b 100644
--- a/runtime/syntax/gp.vim
+++ b/runtime/syntax/gp.vim
@@ -4,9 +4,8 @@
" Last change: 2012 Jan 08
" URL: http://pari.math.u-bordeaux.fr
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -59,33 +58,24 @@ syntax region gpParen transparent start='(' end=')' contains=ALLBUT,gpParenErro
syntax match gpParenError ")"
syntax match gpInParen contained "[{}]"
-if version >= 508 || !exists("did_gp_syn_inits")
- if version < 508
- let did_gp_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink gpConditional Conditional
- HiLink gpRepeat Repeat
- HiLink gpError Error
- HiLink gpParenError gpError
- HiLink gpInParen gpError
- HiLink gpStatement Statement
- HiLink gpString String
- HiLink gpComment Comment
- HiLink gpInterface Type
- HiLink gpInput Type
- HiLink gpInterfaceKey Statement
- HiLink gpFunction Function
- HiLink gpScope Type
- " contained ones
- HiLink gpSpecial Special
- HiLink gpTodo Todo
- HiLink gpArgs Type
- delcommand HiLink
-endif
+hi def link gpConditional Conditional
+hi def link gpRepeat Repeat
+hi def link gpError Error
+hi def link gpParenError gpError
+hi def link gpInParen gpError
+hi def link gpStatement Statement
+hi def link gpString String
+hi def link gpComment Comment
+hi def link gpInterface Type
+hi def link gpInput Type
+hi def link gpInterfaceKey Statement
+hi def link gpFunction Function
+hi def link gpScope Type
+" contained ones
+hi def link gpSpecial Special
+hi def link gpTodo Todo
+hi def link gpArgs Type
let b:current_syntax = "gp"
let &cpo = s:cpo_save
diff --git a/runtime/syntax/gpg.vim b/runtime/syntax/gpg.vim
index cde21ee563..46e2099994 100644
--- a/runtime/syntax/gpg.vim
+++ b/runtime/syntax/gpg.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: gpg(1) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2010-10-14
+" Language: gpg(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2010-10-14
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/grads.vim b/runtime/syntax/grads.vim
index 0b88549d40..50be14bb22 100644
--- a/runtime/syntax/grads.vim
+++ b/runtime/syntax/grads.vim
@@ -7,11 +7,8 @@
" This syntax file defines highlighting for only very few features of
" the GrADS scripting language.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -53,34 +50,24 @@ syn match gradsComment "\*.*"
" syn match gradsTypos "!="
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't hgs highlighting+yet
-if version >= 508 || !exists("did_gs_syn_inits")
- if version < 508
- let did_gs_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't hgs highlighting+yet
- HiLink gradsStatement Statement
+hi def link gradsStatement Statement
- HiLink gradsString String
- HiLink gradsNumber Number
+hi def link gradsString String
+hi def link gradsNumber Number
- HiLink gradsFixVariables Special
- HiLink gradsVariables Identifier
- HiLink gradsglobalVariables Special
- HiLink gradsConst Special
+hi def link gradsFixVariables Special
+hi def link gradsVariables Identifier
+hi def link gradsglobalVariables Special
+hi def link gradsConst Special
- HiLink gradsClassMethods Function
+hi def link gradsClassMethods Function
- HiLink gradsOperator Operator
- HiLink gradsComment Comment
+hi def link gradsOperator Operator
+hi def link gradsComment Comment
- HiLink gradsTypos Error
+hi def link gradsTypos Error
- delcommand HiLink
-endif
let b:current_syntax = "grads"
diff --git a/runtime/syntax/gretl.vim b/runtime/syntax/gretl.vim
index 37299b894a..671142a9ea 100644
--- a/runtime/syntax/gretl.vim
+++ b/runtime/syntax/gretl.vim
@@ -4,20 +4,13 @@
" Last Change: 2006 Apr 30
" Filenames: *.inp *.gretl
" URL: http://uosis.mif.vu.lt/~zemlys/vim-syntax/gretl.vim
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
-if version >= 600
- setlocal iskeyword=@,48-57,_,.
-else
- set iskeyword=@,48-57,_,.
-endif
+setlocal iskeyword=@,48-57,_,.
syn case match
@@ -68,34 +61,24 @@ syn match gBCend /\*)/
syn region gBlockComment matchgroup=gCommentStart start="(\*" end="\*)"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_r_syn_inits")
- if version < 508
- let did_r_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink gComment Comment
- HiLink gCommentStart Comment
- HiLink gBlockComment Comment
- HiLink gString String
- HiLink gNumber Number
- HiLink gBoolean Boolean
- HiLink gFloat Float
- HiLink gCommands Repeat
- HiLink gGenrFunc Type
- HiLink gDelimiter Delimiter
- HiLink gError Error
- HiLink gBraceError Error
- HiLink gCurlyError Error
- HiLink gParenError Error
- HiLink gIdentifier Normal
- HiLink gVariable Identifier
- HiLink gArrow Repeat
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+hi def link gComment Comment
+hi def link gCommentStart Comment
+hi def link gBlockComment Comment
+hi def link gString String
+hi def link gNumber Number
+hi def link gBoolean Boolean
+hi def link gFloat Float
+hi def link gCommands Repeat
+hi def link gGenrFunc Type
+hi def link gDelimiter Delimiter
+hi def link gError Error
+hi def link gBraceError Error
+hi def link gCurlyError Error
+hi def link gParenError Error
+hi def link gIdentifier Normal
+hi def link gVariable Identifier
+hi def link gArrow Repeat
let b:current_syntax="gretl"
diff --git a/runtime/syntax/groovy.vim b/runtime/syntax/groovy.vim
index 42fcf4abac..2245b79d04 100644
--- a/runtime/syntax/groovy.vim
+++ b/runtime/syntax/groovy.vim
@@ -2,9 +2,9 @@
" Language: Groovy
" Original Author: Alessio Pace <billy.corgan@tiscali.it>
" Maintainer: Tobias Rapp <yahuxo@gmx.de>
-" Version: 0.1.14
+" Version: 0.1.16
" URL: http://www.vim.org/scripts/script.php?script_id=945
-" Last Change: 2015 Apr 21
+" Last Change: 2016 May 23
" THE ORIGINAL AUTHOR'S NOTES:
"
@@ -44,11 +44,9 @@
" Let me know if you like it or send me patches, so that I can improve it
" when I have time
-" Quit when a syntax file was already loaded
+" quit when a syntax file was already loaded
if !exists("main_syntax")
- if version < 600
- syntax clear
- elseif exists("b:current_syntax")
+ if exists("b:current_syntax")
finish
endif
" we define it here so that included files can test for it
@@ -58,13 +56,6 @@ endif
let s:cpo_save = &cpo
set cpo&vim
-" don't use standard HiLink, it will not work with included syntax files
-if version < 508
- command! -nargs=+ GroovyHiLink hi link <args>
-else
- command! -nargs=+ GroovyHiLink hi def link <args>
-endif
-
" ##########################
" Java stuff taken from java.vim
" some characters that cannot be in a groovy program (outside a string)
@@ -144,9 +135,9 @@ if exists("groovy_highlight_groovy_lang_ids") || exists("groovy_highlight_groovy
syn keyword groovyJavaLangObject clone equals finalize getClass hashCode
syn keyword groovyJavaLangObject notify notifyAll toString wait
- GroovyHiLink groovyLangClass groovyConstant
- GroovyHiLink groovyJavaLangClass groovyExternal
- GroovyHiLink groovyJavaLangObject groovyConstant
+ hi def link groovyLangClass groovyConstant
+ hi def link groovyJavaLangClass groovyExternal
+ hi def link groovyJavaLangObject groovyConstant
syn cluster groovyTop add=groovyJavaLangObject,groovyJavaLangClass,groovyLangClass
syn cluster groovyClasses add=groovyJavaLangClass,groovyLangClass
endif
@@ -220,9 +211,9 @@ syn region groovyComment start="/\*" end="\*/" contains=@groovyCommen
syn match groovyCommentStar contained "^\s*\*[^/]"me=e-1
syn match groovyCommentStar contained "^\s*\*$"
syn match groovyLineComment "//.*" contains=@groovyCommentSpecial2,groovyTodo,@Spell
-GroovyHiLink groovyCommentString groovyString
-GroovyHiLink groovyComment2String groovyString
-GroovyHiLink groovyCommentCharacter groovyCharacter
+hi def link groovyCommentString groovyString
+hi def link groovyComment2String groovyString
+hi def link groovyCommentCharacter groovyCharacter
syn cluster groovyTop add=groovyComment,groovyLineComment
@@ -255,17 +246,20 @@ syn region groovyString start=+"+ end=+"+ end=+$+ contains=groovySpeci
syn region groovyString start=+'+ end=+'+ end=+$+ contains=groovySpecialChar,groovySpecialError,@Spell
syn region groovyString start=+"""+ end=+"""+ contains=groovySpecialChar,groovySpecialError,@Spell,groovyELExpr
syn region groovyString start=+'''+ end=+'''+ contains=groovySpecialChar,groovySpecialError,@Spell
-" regex string
-syn region groovyString start='/[^/]' end='/' contains=groovySpecialChar,groovyRegexChar,groovyELExpr
+if exists("groovy_regex_strings")
+ " regex strings interfere with the division operator and thus are disabled
+ " by default
+ syn region groovyString start='/[^/*]' end='/' contains=groovySpecialChar,groovyRegexChar,groovyELExpr
+endif
" syn region groovyELExpr start=+${+ end=+}+ keepend contained
syn match groovyELExpr /\${.\{-}}/ contained
syn match groovyELExpr /\$[a-zA-Z_][a-zA-Z0-9_.]*/ contained
-GroovyHiLink groovyELExpr Identifier
+hi def link groovyELExpr Identifier
" TODO: better matching. I am waiting to understand how it really works in groovy
" syn region groovyClosureParamsBraces start=+|+ end=+|+ contains=groovyClosureParams
" syn match groovyClosureParams "[ a-zA-Z0-9_*]\+" contained
-" GroovyHiLink groovyClosureParams Identifier
+" hi def link groovyClosureParams Identifier
" next line disabled, it can cause a crash for a long line
"syn match groovyStringError +"\([^"\\]\|\\.\)*$+
@@ -326,23 +320,21 @@ if exists("groovy_highlight_debug")
syn cluster groovyTop add=groovyDebug
- if version >= 508 || !exists("did_c_syn_inits")
- GroovyHiLink groovyDebug Debug
- GroovyHiLink groovyDebugString DebugString
- GroovyHiLink groovyDebugStringError groovyError
- GroovyHiLink groovyDebugType DebugType
- GroovyHiLink groovyDebugBoolean DebugBoolean
- GroovyHiLink groovyDebugNumber Debug
- GroovyHiLink groovyDebugSpecial DebugSpecial
- GroovyHiLink groovyDebugSpecialCharacter DebugSpecial
- GroovyHiLink groovyDebugCharacter DebugString
- GroovyHiLink groovyDebugParen Debug
-
- GroovyHiLink DebugString String
- GroovyHiLink DebugSpecial Special
- GroovyHiLink DebugBoolean Boolean
- GroovyHiLink DebugType Type
- endif
+ hi def link groovyDebug Debug
+ hi def link groovyDebugString DebugString
+ hi def link groovyDebugStringError groovyError
+ hi def link groovyDebugType DebugType
+ hi def link groovyDebugBoolean DebugBoolean
+ hi def link groovyDebugNumber Debug
+ hi def link groovyDebugSpecial DebugSpecial
+ hi def link groovyDebugSpecialCharacter DebugSpecial
+ hi def link groovyDebugCharacter DebugString
+ hi def link groovyDebugParen Debug
+
+ hi def link DebugString String
+ hi def link DebugSpecial Special
+ hi def link DebugBoolean Boolean
+ hi def link DebugType Type
endif
" Match all Exception classes
@@ -376,7 +368,7 @@ exec "syn sync ccomment groovyComment minlines=" . groovy_minlines
if exists("groovy_mark_braces_in_parens_as_errors")
syn match groovyInParen contained "[{}]"
- GroovyHiLink groovyInParen groovyError
+ hi def link groovyInParen groovyError
syn cluster groovyTop add=groovyInParen
endif
@@ -385,7 +377,7 @@ syn region groovyParenT transparent matchgroup=groovyParen start="(" end=")"
syn region groovyParenT1 transparent matchgroup=groovyParen1 start="(" end=")" contains=@groovyTop,groovyParenT2 contained
syn region groovyParenT2 transparent matchgroup=groovyParen2 start="(" end=")" contains=@groovyTop,groovyParenT contained
syn match groovyParenError ")"
-GroovyHiLink groovyParenError groovyError
+hi def link groovyParenError groovyError
" catch errors caused by wrong square parenthesis
syn region groovyParenT transparent matchgroup=groovyParen start="\[" end="\]" contains=@groovyTop,groovyParenT1
@@ -395,61 +387,54 @@ syn match groovyParenError "\]"
" ###############################
" java.vim default highlighting
-if version >= 508 || !exists("did_groovy_syn_inits")
- if version < 508
- let did_groovy_syn_inits = 1
- endif
- GroovyHiLink groovyFuncDef Function
- GroovyHiLink groovyBraces Function
- GroovyHiLink groovyBranch Conditional
- GroovyHiLink groovyUserLabelRef groovyUserLabel
- GroovyHiLink groovyLabel Label
- GroovyHiLink groovyUserLabel Label
- GroovyHiLink groovyConditional Conditional
- GroovyHiLink groovyRepeat Repeat
- GroovyHiLink groovyExceptions Exception
- GroovyHiLink groovyAssert Statement
- GroovyHiLink groovyStorageClass StorageClass
- GroovyHiLink groovyMethodDecl groovyStorageClass
- GroovyHiLink groovyClassDecl groovyStorageClass
- GroovyHiLink groovyScopeDecl groovyStorageClass
- GroovyHiLink groovyBoolean Boolean
- GroovyHiLink groovySpecial Special
- GroovyHiLink groovySpecialError Error
- GroovyHiLink groovySpecialCharError Error
- GroovyHiLink groovyString String
- GroovyHiLink groovyRegexChar String
- GroovyHiLink groovyCharacter Character
- GroovyHiLink groovySpecialChar SpecialChar
- GroovyHiLink groovyNumber Number
- GroovyHiLink groovyError Error
- GroovyHiLink groovyStringError Error
- GroovyHiLink groovyStatement Statement
- GroovyHiLink groovyOperator Operator
- GroovyHiLink groovyComment Comment
- GroovyHiLink groovyDocComment Comment
- GroovyHiLink groovyLineComment Comment
- GroovyHiLink groovyConstant Constant
- GroovyHiLink groovyTypedef Typedef
- GroovyHiLink groovyTodo Todo
-
- GroovyHiLink groovyCommentTitle SpecialComment
- GroovyHiLink groovyDocTags Special
- GroovyHiLink groovyDocParam Function
- GroovyHiLink groovyCommentStar groovyComment
-
- GroovyHiLink groovyType Type
- GroovyHiLink groovyExternal Include
-
- GroovyHiLink htmlComment Special
- GroovyHiLink htmlCommentPart Special
- GroovyHiLink groovySpaceError Error
- GroovyHiLink groovyJDKBuiltin Special
- GroovyHiLink groovyJDKOperOverl Operator
- GroovyHiLink groovyJDKMethods Function
-endif
-
-delcommand GroovyHiLink
+hi def link groovyFuncDef Function
+hi def link groovyBraces Function
+hi def link groovyBranch Conditional
+hi def link groovyUserLabelRef groovyUserLabel
+hi def link groovyLabel Label
+hi def link groovyUserLabel Label
+hi def link groovyConditional Conditional
+hi def link groovyRepeat Repeat
+hi def link groovyExceptions Exception
+hi def link groovyAssert Statement
+hi def link groovyStorageClass StorageClass
+hi def link groovyMethodDecl groovyStorageClass
+hi def link groovyClassDecl groovyStorageClass
+hi def link groovyScopeDecl groovyStorageClass
+hi def link groovyBoolean Boolean
+hi def link groovySpecial Special
+hi def link groovySpecialError Error
+hi def link groovySpecialCharError Error
+hi def link groovyString String
+hi def link groovyRegexChar String
+hi def link groovyCharacter Character
+hi def link groovySpecialChar SpecialChar
+hi def link groovyNumber Number
+hi def link groovyError Error
+hi def link groovyStringError Error
+hi def link groovyStatement Statement
+hi def link groovyOperator Operator
+hi def link groovyComment Comment
+hi def link groovyDocComment Comment
+hi def link groovyLineComment Comment
+hi def link groovyConstant Constant
+hi def link groovyTypedef Typedef
+hi def link groovyTodo Todo
+
+hi def link groovyCommentTitle SpecialComment
+hi def link groovyDocTags Special
+hi def link groovyDocParam Function
+hi def link groovyCommentStar groovyComment
+
+hi def link groovyType Type
+hi def link groovyExternal Include
+
+hi def link htmlComment Special
+hi def link htmlCommentPart Special
+hi def link groovySpaceError Error
+hi def link groovyJDKBuiltin Special
+hi def link groovyJDKOperOverl Operator
+hi def link groovyJDKMethods Function
let b:current_syntax = "groovy"
diff --git a/runtime/syntax/group.vim b/runtime/syntax/group.vim
index ab2d56d6a5..f62a4a1d69 100644
--- a/runtime/syntax/group.vim
+++ b/runtime/syntax/group.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: group(5) user group file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2012-08-05
+" Language: group(5) user group file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2012-08-05
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/grub.vim b/runtime/syntax/grub.vim
index f63449db0e..3743ae3643 100644
--- a/runtime/syntax/grub.vim
+++ b/runtime/syntax/grub.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: grub(8) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: grub(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/gsp.vim b/runtime/syntax/gsp.vim
index e7b1b1632f..6270b2af64 100644
--- a/runtime/syntax/gsp.vim
+++ b/runtime/syntax/gsp.vim
@@ -5,11 +5,8 @@
" Filenames: *.gsp
" URL: http://www.constructicon.com/~nharward/vim/syntax/gsp.vim
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -18,21 +15,13 @@ if !exists("main_syntax")
endif
" Source HTML syntax
-if version < 600
- source <sfile>:p:h/html.vim
-else
- runtime! syntax/html.vim
-endif
+runtime! syntax/html.vim
unlet b:current_syntax
syn case match
" Include Java syntax
-if version < 600
- syn include @gspJava <sfile>:p:h/java.vim
-else
- syn include @gspJava syntax/java.vim
-endif
+syn include @gspJava syntax/java.vim
let s:cpo_save = &cpo
set cpo&vim
diff --git a/runtime/syntax/gtkrc.vim b/runtime/syntax/gtkrc.vim
index 57054a21d3..9c1bc2abb8 100644
--- a/runtime/syntax/gtkrc.vim
+++ b/runtime/syntax/gtkrc.vim
@@ -6,19 +6,12 @@
" URL: http://trific.ath.cx/Ftp/vim/syntax/gtkrc.vim
" Setup
-if version >= 600
- if exists("b:current_syntax")
- finish
- endif
-else
- syntax clear
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
endif
-if version >= 600
- setlocal iskeyword=_,-,a-z,A-Z,48-57
-else
- set iskeyword=_,-,a-z,A-Z,48-57
-endif
+setlocal iskeyword=_,-,a-z,A-Z,48-57
syn case match
@@ -86,57 +79,48 @@ syn sync minlines=50
syn sync match gtkrcSyncClass groupthere NONE "^\s*class\>"
" Define the default highlighting
-if version >= 508 || !exists("did_gtkrc_syntax_inits")
- if version < 508
- let did_gtkrc_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink gtkrcComment Comment
- HiLink gtkrcFixme Todo
-
- HiLink gtkrcInclude Preproc
-
- HiLink gtkrcACString gtkrcString
- HiLink gtkrcBString gtkrcString
- HiLink gtkrcString String
- HiLink gtkrcNumber Number
- HiLink gtkrcStateName gtkrcConstant
- HiLink gtkrcPriorityName gtkrcConstant
- HiLink gtkrcTextDirName gtkrcConstant
- HiLink gtkrcSettingsName Function
- HiLink gtkrcStockName Function
- HiLink gtkrcConstant Constant
-
- HiLink gtkrcPathSpecial gtkrcSpecial
- HiLink gtkrcWPathSpecial gtkrcSpecial
- HiLink gtkrcRGBColor gtkrcSpecial
- HiLink gtkrcKeyMod gtkrcSpecial
- HiLink gtkrcSpecial Special
-
- HiLink gtkrcTop gtkrcKeyword
- HiLink gtkrcPathSet gtkrcKeyword
- HiLink gtkrcStyleKeyword gtkrcKeyword
- HiLink gtkrcFunction gtkrcKeyword
- HiLink gtkrcBind gtkrcKeyword
- HiLink gtkrcKeyword Keyword
-
- HiLink gtkrcClassNameGnome gtkrcGtkClass
- HiLink gtkrcClassName gtkrcGtkClass
- HiLink gtkrcFunctionName gtkrcGtkClass
- HiLink gtkrcGtkClass Type
-
- HiLink gtkrcImage gtkrcOtherword
- HiLink gtkrcOtherword Function
-
- HiLink gtkrcParenError gtkrcError
- HiLink gtkrcBraceError gtkrcError
- HiLink gtkrcBracketError gtkrcError
- HiLink gtkrcError Error
-
- delcommand HiLink
-endif
+
+hi def link gtkrcComment Comment
+hi def link gtkrcFixme Todo
+
+hi def link gtkrcInclude Preproc
+
+hi def link gtkrcACString gtkrcString
+hi def link gtkrcBString gtkrcString
+hi def link gtkrcString String
+hi def link gtkrcNumber Number
+hi def link gtkrcStateName gtkrcConstant
+hi def link gtkrcPriorityName gtkrcConstant
+hi def link gtkrcTextDirName gtkrcConstant
+hi def link gtkrcSettingsName Function
+hi def link gtkrcStockName Function
+hi def link gtkrcConstant Constant
+
+hi def link gtkrcPathSpecial gtkrcSpecial
+hi def link gtkrcWPathSpecial gtkrcSpecial
+hi def link gtkrcRGBColor gtkrcSpecial
+hi def link gtkrcKeyMod gtkrcSpecial
+hi def link gtkrcSpecial Special
+
+hi def link gtkrcTop gtkrcKeyword
+hi def link gtkrcPathSet gtkrcKeyword
+hi def link gtkrcStyleKeyword gtkrcKeyword
+hi def link gtkrcFunction gtkrcKeyword
+hi def link gtkrcBind gtkrcKeyword
+hi def link gtkrcKeyword Keyword
+
+hi def link gtkrcClassNameGnome gtkrcGtkClass
+hi def link gtkrcClassName gtkrcGtkClass
+hi def link gtkrcFunctionName gtkrcGtkClass
+hi def link gtkrcGtkClass Type
+
+hi def link gtkrcImage gtkrcOtherword
+hi def link gtkrcOtherword Function
+
+hi def link gtkrcParenError gtkrcError
+hi def link gtkrcBraceError gtkrcError
+hi def link gtkrcBracketError gtkrcError
+hi def link gtkrcError Error
+
let b:current_syntax = "gtkrc"
diff --git a/runtime/syntax/haml.vim b/runtime/syntax/haml.vim
index bf7a073633..5369695c22 100644
--- a/runtime/syntax/haml.vim
+++ b/runtime/syntax/haml.vim
@@ -2,7 +2,7 @@
" Language: Haml
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
" Filenames: *.haml
-" Last Change: 2010 Aug 09
+" Last Change: 2016 Aug 29
if exists("b:current_syntax")
finish
@@ -67,7 +67,7 @@ syn region hamlJavascriptFilter matchgroup=hamlFilter start="^\z(\s*\):javascri
syn region hamlCSSFilter matchgroup=hamlFilter start="^\z(\s*\):css\s*$" end="^\%(\z1 \| *$\)\@!" contains=@htmlCss,hamlInterpolation keepend
syn region hamlSassFilter matchgroup=hamlFilter start="^\z(\s*\):sass\s*$" end="^\%(\z1 \| *$\)\@!" contains=@hamlSassTop
-syn region hamlJavascriptBlock start="^\z(\s*\)%script" nextgroup=@hamlComponent,hamlError end="^\%(\z1 \| *$\)\@!" contains=@hamlTop,@htmlJavaScript keepend
+syn region hamlJavascriptBlock start="^\z(\s*\)%script\%((type=[\"']text/javascript[\"'])\)\=\s*$" nextgroup=@hamlComponent,hamlError end="^\%(\z1 \| *$\)\@!" contains=@hamlTop,@htmlJavaScript keepend
syn region hamlCssBlock start="^\z(\s*\)%style" nextgroup=@hamlComponent,hamlError end="^\%(\z1 \| *$\)\@!" contains=@hamlTop,@htmlCss keepend
syn match hamlError "\$" contained
diff --git a/runtime/syntax/hamster.vim b/runtime/syntax/hamster.vim
index bd52300ca0..64d9598a71 100644
--- a/runtime/syntax/hamster.vim
+++ b/runtime/syntax/hamster.vim
@@ -12,10 +12,8 @@
" for news and mail, a build-in script language, the GUI allows translation to
" other languages, it can be used in a network and that's not all features...
"
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -358,24 +356,14 @@ syn cluster hamsterComment contains=hamsterHashComment
syn sync ccomment hamsterHashComment
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_hamster_syn_inits")
- if version < 508
- let did_hamster_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink hamsterHashComment Comment
- HiLink hamsterSpecial Special
- HiLink hamsterStatement Statement
- HiLink hamsterString String
- HiLink hamsterFunction Function
+hi def link hamsterHashComment Comment
+hi def link hamsterSpecial Special
+hi def link hamsterStatement Statement
+hi def link hamsterString String
+hi def link hamsterFunction Function
- delcommand HiLink
-endif
let b:current_syntax = "hamster"
diff --git a/runtime/syntax/haskell.vim b/runtime/syntax/haskell.vim
index 8afca048cc..e5128a12ab 100644
--- a/runtime/syntax/haskell.vim
+++ b/runtime/syntax/haskell.vim
@@ -1,7 +1,7 @@
" Vim syntax file
" Language: Haskell
" Maintainer: Haskell Cafe mailinglist <haskell-cafe@haskell.org>
-" Last Change: 2008 Dec 15
+" Last Change: 2018 Mar 29 by Marcin Szamotulski
" Original Author: John Williams <jrw@pobox.com>
"
" Thanks to Ryan Crumley for suggestions and John Meacham for
@@ -32,16 +32,14 @@
" to attribution of work.
" 2008 Dec 15: Added comments as contained element in import statements
-" Remove any old syntax stuff hanging around
-if version < 600
- syn clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" (Qualified) identifiers (no default highlighting)
-syn match ConId "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=\<[A-Z][a-zA-Z0-9_']*\>"
-syn match VarId "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=\<[a-z][a-zA-Z0-9_']*\>"
+syn match ConId "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=\<[A-Z][a-zA-Z0-9_']*\>" contains=@NoSpell
+syn match VarId "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=\<[a-z][a-zA-Z0-9_']*\>" contains=@NoSpell
" Infix operators--most punctuation characters and any (qualified) identifier
" enclosed in `backquotes`. An operator starting with : is a constructor,
@@ -58,18 +56,18 @@ syn match hsDelimiter "(\|)\|\[\|\]\|,\|;\|_\|{\|}"
syn match hsSpecialChar contained "\\\([0-9]\+\|o[0-7]\+\|x[0-9a-fA-F]\+\|[\"\\'&\\abfnrtv]\|^[A-Z^_\[\\\]]\)"
syn match hsSpecialChar contained "\\\(NUL\|SOH\|STX\|ETX\|EOT\|ENQ\|ACK\|BEL\|BS\|HT\|LF\|VT\|FF\|CR\|SO\|SI\|DLE\|DC1\|DC2\|DC3\|DC4\|NAK\|SYN\|ETB\|CAN\|EM\|SUB\|ESC\|FS\|GS\|RS\|US\|SP\|DEL\)"
syn match hsSpecialCharError contained "\\&\|'''\+"
-syn region hsString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=hsSpecialChar
+syn region hsString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=hsSpecialChar,@NoSpell
syn match hsCharacter "[^a-zA-Z0-9_']'\([^\\]\|\\[^']\+\|\\'\)'"lc=1 contains=hsSpecialChar,hsSpecialCharError
syn match hsCharacter "^'\([^\\]\|\\[^']\+\|\\'\)'" contains=hsSpecialChar,hsSpecialCharError
-syn match hsNumber "\<[0-9]\+\>\|\<0[xX][0-9a-fA-F]\+\>\|\<0[oO][0-7]\+\>"
-syn match hsFloat "\<[0-9]\+\.[0-9]\+\([eE][-+]\=[0-9]\+\)\=\>"
+syn match hsNumber "\v<[0-9]%(_*[0-9])*>|<0[xX]_*[0-9a-fA-F]%(_*[0-9a-fA-F])*>|<0[oO]_*%(_*[0-7])*>|<0[bB]_*[01]%(_*[01])*>"
+syn match hsFloat "\v<[0-9]%(_*[0-9])*\.[0-9]%(_*[0-9])*%(_*[eE][-+]?[0-9]%(_*[0-9])*)?>|<[0-9]%(_*[0-9])*_*[eE][-+]?[0-9]%(_*[0-9])*>|<0[xX]_*[0-9a-fA-F]%(_*[0-9a-fA-F])*\.[0-9a-fA-F]%(_*[0-9a-fA-F])*%(_*[pP][-+]?[0-9]%(_*[0-9])*)?>|<0[xX]_*[0-9a-fA-F]%(_*[0-9a-fA-F])*_*[pP][-+]?[0-9]%(_*[0-9])*>"
-" Keyword definitions. These must be patters instead of keywords
+" Keyword definitions. These must be patterns instead of keywords
" because otherwise they would match as keywords at the start of a
" "literate" comment (see lhs.vim).
syn match hsModule "\<module\>"
-syn match hsImport "\<import\>.*"he=s+6 contains=hsImportMod,hsLineComment,hsBlockComment
-syn match hsImportMod contained "\<\(as\|qualified\|hiding\)\>"
+syn match hsImport "\<import\>.*"he=s+6 contains=hsImportMod,hsLineComment,hsBlockComment,@NoSpell
+syn match hsImportMod contained "\<\(as\|qualified\|hiding\)\>" contains=@NoSpell
syn match hsInfix "\<\(infix\|infixl\|infixr\)\>"
syn match hsStructure "\<\(class\|data\|deriving\|instance\|default\|where\)\>"
syn match hsTypedef "\<\(type\|newtype\)\>"
@@ -99,8 +97,8 @@ endif
" Comments
-syn match hsLineComment "---*\([^-!#$%&\*\+./<=>\?@\\^|~].*\)\?$"
-syn region hsBlockComment start="{-" end="-}" contains=hsBlockComment
+syn match hsLineComment "---*\([^-!#$%&\*\+./<=>\?@\\^|~].*\)\?$" contains=@Spell
+syn region hsBlockComment start="{-" end="-}" contains=hsBlockComment,@Spell
syn region hsPragma start="{-#" end="#-}"
" C Preprocessor directives. Shamelessly ripped from c.vim and trimmed
@@ -127,67 +125,57 @@ syntax match cCommentStartError display "/\*"me=e-1 contained
syn region cCppString start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial contained
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_hs_syntax_inits")
- if version < 508
- let did_hs_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink hsModule hsStructure
- HiLink hsImport Include
- HiLink hsImportMod hsImport
- HiLink hsInfix PreProc
- HiLink hsStructure Structure
- HiLink hsStatement Statement
- HiLink hsConditional Conditional
- HiLink hsSpecialChar SpecialChar
- HiLink hsTypedef Typedef
- HiLink hsVarSym hsOperator
- HiLink hsConSym hsOperator
- HiLink hsOperator Operator
- if exists("hs_highlight_delimiters")
- " Some people find this highlighting distracting.
- HiLink hsDelimiter Delimiter
- endif
- HiLink hsSpecialCharError Error
- HiLink hsString String
- HiLink hsCharacter Character
- HiLink hsNumber Number
- HiLink hsFloat Float
- HiLink hsConditional Conditional
- HiLink hsLiterateComment hsComment
- HiLink hsBlockComment hsComment
- HiLink hsLineComment hsComment
- HiLink hsComment Comment
- HiLink hsPragma SpecialComment
- HiLink hsBoolean Boolean
- HiLink hsType Type
- HiLink hsMaybe hsEnumConst
- HiLink hsOrdering hsEnumConst
- HiLink hsEnumConst Constant
- HiLink hsDebug Debug
-
- HiLink cCppString hsString
- HiLink cCommentStart hsComment
- HiLink cCommentError hsError
- HiLink cCommentStartError hsError
- HiLink cInclude Include
- HiLink cPreProc PreProc
- HiLink cDefine Macro
- HiLink cIncluded hsString
- HiLink cError Error
- HiLink cPreCondit PreCondit
- HiLink cComment Comment
- HiLink cCppSkip cCppOut
- HiLink cCppOut2 cCppOut
- HiLink cCppOut Comment
-
- delcommand HiLink
+" Only when an item doesn't have highlighting yet
+
+hi def link hsModule hsStructure
+hi def link hsImport Include
+hi def link hsImportMod hsImport
+hi def link hsInfix PreProc
+hi def link hsStructure Structure
+hi def link hsStatement Statement
+hi def link hsConditional Conditional
+hi def link hsSpecialChar SpecialChar
+hi def link hsTypedef Typedef
+hi def link hsVarSym hsOperator
+hi def link hsConSym hsOperator
+hi def link hsOperator Operator
+if exists("hs_highlight_delimiters")
+" Some people find this highlighting distracting.
+hi def link hsDelimiter Delimiter
endif
+hi def link hsSpecialCharError Error
+hi def link hsString String
+hi def link hsCharacter Character
+hi def link hsNumber Number
+hi def link hsFloat Float
+hi def link hsConditional Conditional
+hi def link hsLiterateComment hsComment
+hi def link hsBlockComment hsComment
+hi def link hsLineComment hsComment
+hi def link hsComment Comment
+hi def link hsPragma SpecialComment
+hi def link hsBoolean Boolean
+hi def link hsType Type
+hi def link hsMaybe hsEnumConst
+hi def link hsOrdering hsEnumConst
+hi def link hsEnumConst Constant
+hi def link hsDebug Debug
+
+hi def link cCppString hsString
+hi def link cCommentStart hsComment
+hi def link cCommentError hsError
+hi def link cCommentStartError hsError
+hi def link cInclude Include
+hi def link cPreProc PreProc
+hi def link cDefine Macro
+hi def link cIncluded hsString
+hi def link cError Error
+hi def link cPreCondit PreCondit
+hi def link cComment Comment
+hi def link cCppSkip cCppOut
+hi def link cCppOut2 cCppOut
+hi def link cCppOut Comment
+
let b:current_syntax = "haskell"
diff --git a/runtime/syntax/haste.vim b/runtime/syntax/haste.vim
index b889c5c594..79e9f5ec56 100644
--- a/runtime/syntax/haste.vim
+++ b/runtime/syntax/haste.vim
@@ -12,11 +12,8 @@
if exists("b:current_syntax")
finish
endif
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/hastepreproc.vim b/runtime/syntax/hastepreproc.vim
index 3fcb8ddd31..f08bf3fbf3 100644
--- a/runtime/syntax/hastepreproc.vim
+++ b/runtime/syntax/hastepreproc.vim
@@ -5,24 +5,13 @@
" files
" Version: 0.5
-" HASTE
+" quit when a syntax file was already loaded
if exists("b:current_syntax")
- finish
-endif
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
finish
endif
-" Read the C syntax to start with
-if version < 600
- so <sfile>:p:h/haste.vim
-else
- runtime! syntax/haste.vim
- unlet b:current_syntax
-endif
+" Read the haste syntax to start with
+runtime! syntax/haste.vim
+unlet b:current_syntax
" case is significant
syn case match
diff --git a/runtime/syntax/hb.vim b/runtime/syntax/hb.vim
index d4de3ff1e1..7bff1df9fb 100644
--- a/runtime/syntax/hb.vim
+++ b/runtime/syntax/hb.vim
@@ -4,11 +4,8 @@
" URL: http://bachue.com/hb/vim/syntax/hb.vim
" Last Change: 2012 Jan 08 by Thilo Six
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -63,31 +60,21 @@ syn region HBText matchgroup=HBDirectiveKeyword start=/^:\(set\|out\)\s*\S\+.*$/
syn match HBComment "^#.*$"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_hb_syntax_inits")
- if version < 508
- let did_hb_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink HBhtmlString String
- HiLink HBhtmlTagN Function
- HiLink htmlSpecialChar String
-
- HiLink HBInvalidLine Error
- HiLink HBFoobar Comment
- hi HBFileName guibg=lightgray guifg=black
- HiLink HBDirectiveError Error
- HiLink HBDirectiveBlockEnd HBDirectiveKeyword
- hi HBDirectiveKeyword guibg=lightgray guifg=darkgreen
- HiLink HBComment Comment
- HiLink HBhtmlTagSk Statement
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link HBhtmlString String
+hi def link HBhtmlTagN Function
+hi def link htmlSpecialChar String
+
+hi def link HBInvalidLine Error
+hi def link HBFoobar Comment
+hi HBFileName guibg=lightgray guifg=black
+hi def link HBDirectiveError Error
+hi def link HBDirectiveBlockEnd HBDirectiveKeyword
+hi HBDirectiveKeyword guibg=lightgray guifg=darkgreen
+hi def link HBComment Comment
+hi def link HBhtmlTagSk Statement
+
syn sync match Normal grouphere NONE "^:\s*$"
syn sync match Normal grouphere NONE "^:\s*lib\s\+[^ \t]\+$"
diff --git a/runtime/syntax/help.vim b/runtime/syntax/help.vim
index d133c6a804..db5ad3728c 100644
--- a/runtime/syntax/help.vim
+++ b/runtime/syntax/help.vim
@@ -1,7 +1,7 @@
" Vim syntax file
" Language: Vim help file
" Maintainer: Bram Moolenaar (Bram@vim.org)
-" Last Change: 2014 Feb 12
+" Last Change: 2017 Oct 19
" Quit when a (custom) syntax file was already loaded
if exists("b:current_syntax")
@@ -36,11 +36,11 @@ syn match helpNormal "|||"
syn match helpNormal ":|vim:|" " for :help modeline
syn match helpVim "\<Vim version [0-9][0-9.a-z]*"
syn match helpVim "VIM REFERENCE.*"
-syn match helpVim "\<Nvim\."
syn match helpVim "NVIM REFERENCE.*"
syn match helpOption "'[a-z]\{2,\}'"
syn match helpOption "'t_..'"
syn match helpCommand "`[^` \t]\+`"hs=s+1,he=e-1 contains=helpBacktick
+syn match helpCommand "\(^\|[^a-z"[]\)\zs`[^`]\+`\ze\([^a-z\t."']\|$\)"hs=s+1,he=e-1 contains=helpBacktick
syn match helpHeader "\s*\zs.\{-}\ze\s\=\~$" nextgroup=helpIgnore
syn match helpGraphic ".* \ze`$" nextgroup=helpIgnore
if has("conceal")
@@ -49,16 +49,19 @@ else
syn match helpIgnore "." contained
endif
syn keyword helpNote note Note NOTE note: Note: NOTE: Notes Notes:
+syn keyword helpWarning WARNING WARNING: Warning:
+syn keyword helpDeprecated DEPRECATED DEPRECATED: Deprecated:
syn match helpSpecial "\<N\>"
syn match helpSpecial "\<N\.$"me=e-1
syn match helpSpecial "\<N\.\s"me=e-2
syn match helpSpecial "(N\>"ms=s+1
+
syn match helpSpecial "\[N]"
" avoid highlighting N N in help.txt
syn match helpSpecial "N N"he=s+1
syn match helpSpecial "Nth"me=e-2
syn match helpSpecial "N-1"me=e-2
-syn match helpSpecial "{[-a-zA-Z0-9'"*+/:%#=[\]<>.,]\+}"
+syn match helpSpecial "{[-_a-zA-Z0-9'"*+/:%#=[\]<>.,]\+}"
syn match helpSpecial "\s\[[-a-z^A-Z0-9_]\{2,}]"ms=s+1
syn match helpSpecial "<[-a-zA-Z0-9_]\+>"
syn match helpSpecial "<[SCM]-.>"
@@ -78,6 +81,9 @@ syn match helpSpecial "\[arguments]"
syn match helpSpecial "\[ident]"
syn match helpSpecial "\[addr]"
syn match helpSpecial "\[group]"
+" Don't highlight [converted] and others that do not have a tag
+syn match helpNormal "\[\(readonly\|fifo\|socket\|converted\|crypted\)]"
+
syn match helpSpecial "CTRL-."
syn match helpSpecial "CTRL-Break"
syn match helpSpecial "CTRL-PageUp"
@@ -85,6 +91,8 @@ syn match helpSpecial "CTRL-PageDown"
syn match helpSpecial "CTRL-Insert"
syn match helpSpecial "CTRL-Del"
syn match helpSpecial "CTRL-{char}"
+syn match helpSpecial "META-."
+syn match helpSpecial "ALT-."
" Highlight group items in their own color.
syn match helpComment "\t[* ]Comment\t\+[a-z].*"
@@ -160,6 +168,8 @@ hi def link helpExample Comment
hi def link helpOption Type
hi def link helpSpecial Special
hi def link helpNote Todo
+hi def link helpWarning Todo
+hi def link helpDeprecated Todo
hi def link helpComment Comment
hi def link helpConstant Constant
diff --git a/runtime/syntax/hercules.vim b/runtime/syntax/hercules.vim
index 02d8e9bb78..d305707662 100644
--- a/runtime/syntax/hercules.vim
+++ b/runtime/syntax/hercules.vim
@@ -7,11 +7,8 @@
" that an IC's physical design matches its logical design and
" satisfies manufacturing rules.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -101,32 +98,21 @@ syn match herculesOutput "error\s*=\s*(.*)"
syn sync lines=100
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_hercules_syntax_inits")
- if version < 508
- let did_hercules_syntax_inits = 1
- " Default methods for highlighting.
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink herculesStatement Statement
- HiLink herculesType Type
- HiLink herculesComment Comment
- HiLink herculesPreProc PreProc
- HiLink herculesTodo Todo
- HiLink herculesOutput Include
- HiLink herculesCmdCmnt Identifier
- HiLink herculesNumber Number
- HiLink herculesBraceError herculesError
- HiLink herculesCurlyError herculesError
- HiLink herculesParenError herculesError
- HiLink herculesError Error
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link herculesStatement Statement
+hi def link herculesType Type
+hi def link herculesComment Comment
+hi def link herculesPreProc PreProc
+hi def link herculesTodo Todo
+hi def link herculesOutput Include
+hi def link herculesCmdCmnt Identifier
+hi def link herculesNumber Number
+hi def link herculesBraceError herculesError
+hi def link herculesCurlyError herculesError
+hi def link herculesParenError herculesError
+hi def link herculesError Error
+
let b:current_syntax = "hercules"
diff --git a/runtime/syntax/hex.vim b/runtime/syntax/hex.vim
index 40f7f0dd10..35edf08e9f 100644
--- a/runtime/syntax/hex.vim
+++ b/runtime/syntax/hex.vim
@@ -25,11 +25,8 @@
" States in parentheses in the upper format description indicate that they
" should not appear in a valid file.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -68,34 +65,24 @@ syn match hexChecksum "[0-9a-fA-F]\{2}$" contained
syn region hexExtAdrBlock start="^:[0-9a-fA-F]\{7}[24]" skip="^:[0-9a-fA-F]\{7}0" end="^:"me=s-1 fold transparent
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_hex_syntax_inits")
- if version < 508
- let did_hex_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- " The default methods for highlighting. Can be overridden later
- HiLink hexRecStart hexRecType
- HiLink hexDataByteCount Constant
- hi def hexAddressFieldUnknown term=italic cterm=italic gui=italic
- HiLink hexDataAddress Comment
- HiLink hexNoAddress DiffAdd
- HiLink hexRecTypeUnknown hexRecType
- HiLink hexRecType WarningMsg
- hi def hexDataFieldUnknown term=italic cterm=italic gui=italic
- hi def hexDataOdd term=bold cterm=bold gui=bold
- hi def hexDataEven term=NONE cterm=NONE gui=NONE
- HiLink hexDataUnexpected Error
- HiLink hexExtendedAddress hexDataAddress
- HiLink hexStartAddress hexDataAddress
- HiLink hexChecksum DiffChange
+" The default methods for highlighting. Can be overridden later
+hi def link hexRecStart hexRecType
+hi def link hexDataByteCount Constant
+hi def hexAddressFieldUnknown term=italic cterm=italic gui=italic
+hi def link hexDataAddress Comment
+hi def link hexNoAddress DiffAdd
+hi def link hexRecTypeUnknown hexRecType
+hi def link hexRecType WarningMsg
+hi def hexDataFieldUnknown term=italic cterm=italic gui=italic
+hi def hexDataOdd term=bold cterm=bold gui=bold
+hi def hexDataEven term=NONE cterm=NONE gui=NONE
+hi def link hexDataUnexpected Error
+hi def link hexExtendedAddress hexDataAddress
+hi def link hexStartAddress hexDataAddress
+hi def link hexChecksum DiffChange
- delcommand HiLink
-endif
let b:current_syntax = "hex"
diff --git a/runtime/syntax/hitest.vim b/runtime/syntax/hitest.vim
index 7489101060..1e39451dcd 100644
--- a/runtime/syntax/hitest.vim
+++ b/runtime/syntax/hitest.vim
@@ -1,7 +1,7 @@
" Vim syntax file
" Language: none; used to see highlighting
" Maintainer: Ronald Schild <rs@scutum.de>
-" Last Change: 2001 Sep 02
+" Last Change: 2017 Jul 28
" Version: 5.4n.1
" To see your current highlight settings, do
@@ -111,17 +111,6 @@ endif
nohlsearch
normal 0
-" add autocommands to remove temporary file from buffer list
-aug highlighttest
- au!
- au BufUnload Highlight\ test if expand("<afile>") == "Highlight test"
- au BufUnload Highlight\ test bdelete! Highlight\ test
- au BufUnload Highlight\ test endif
- au VimLeavePre * if bufexists("Highlight test")
- au VimLeavePre * bdelete! Highlight\ test
- au VimLeavePre * endif
-aug END
-
" we don't want to save this temporary file
set nomodified
diff --git a/runtime/syntax/hog.vim b/runtime/syntax/hog.vim
index f37f7ae899..7206815202 100644
--- a/runtime/syntax/hog.vim
+++ b/runtime/syntax/hog.vim
@@ -4,9 +4,8 @@
" Last Change: 2015 Oct 24 -> Rename syntax items from Snort -> Hog
" 2012 Oct 24 -> Originalish release
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/hostconf.vim b/runtime/syntax/hostconf.vim
index 4fc8af0ba3..593ed72eed 100644
--- a/runtime/syntax/hostconf.vim
+++ b/runtime/syntax/hostconf.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: host.conf(5) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2007-06-25
+" Language: host.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-06-25
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/hostsaccess.vim b/runtime/syntax/hostsaccess.vim
index 8a9f02eff5..7201816f48 100644
--- a/runtime/syntax/hostsaccess.vim
+++ b/runtime/syntax/hostsaccess.vim
@@ -15,12 +15,8 @@ if exists("b:current_syntax")
endif
" For a starter we just use conf.vim for highlighting
-if version < 600
- so <sfile>:p:h/conf.vim
-else
- runtime! syntax/conf.vim
- unlet b:current_syntax
-endif
+runtime! syntax/conf.vim
+unlet b:current_syntax
let b:current_syntax = "hostsaccess"
diff --git a/runtime/syntax/html.vim b/runtime/syntax/html.vim
index ab1f9b3c13..cde5269d02 100644
--- a/runtime/syntax/html.vim
+++ b/runtime/syntax/html.vim
@@ -1,18 +1,17 @@
" Vim syntax file
-" Language: HTML
-" Maintainer: Claudio Fleiner <claudio@fleiner.com>
-" URL: http://www.fleiner.com/vim/syntax/html.vim
-" Last Change: 2015 Jan 07
-" included patch from David Felix
+" Language: HTML
+" Maintainer: Jorge Maldonado Ventura <jorgesumle@freakspot.net>
+" Previous Maintainer: Claudio Fleiner <claudio@fleiner.com>
+" Repository: https://notabug.org/jorgesumle/vim-html-syntax
+" Last Change: 2018 May 31
+" Included patch from Jay Sitter to add WAI-ARIA htmlArg keywords
+"
" Please check :help html.vim for some comments and a description of the options
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
+" quit when a syntax file was already loaded
if !exists("main_syntax")
- if version < 600
- syntax clear
- elseif exists("b:current_syntax")
+ if exists("b:current_syntax")
finish
endif
let main_syntax = 'html'
@@ -21,13 +20,6 @@ endif
let s:cpo_save = &cpo
set cpo&vim
-" don't use standard HiLink, it will not work with included syntax files
-if version < 508
- command! -nargs=+ HtmlHiLink hi link <args>
-else
- command! -nargs=+ HtmlHiLink hi def link <args>
-endif
-
syntax spell toplevel
syn case ignore
@@ -54,15 +46,23 @@ syn keyword htmlTagName contained cite code dd dfn dir div dl dt font
syn keyword htmlTagName contained form hr html img
syn keyword htmlTagName contained input isindex kbd li link map menu
syn keyword htmlTagName contained meta ol option param pre p samp span
-syn keyword htmlTagName contained select small strike sub sup
+syn keyword htmlTagName contained select small sub sup
syn keyword htmlTagName contained table td textarea th tr tt ul var xmp
syn match htmlTagName contained "\<\(b\|i\|u\|h[1-6]\|em\|strong\|head\|body\|title\)\>"
" new html 4.0 tags
syn keyword htmlTagName contained abbr acronym bdo button col label
-syn keyword htmlTagName contained colgroup del fieldset iframe ins legend
+syn keyword htmlTagName contained colgroup fieldset iframe ins legend
syn keyword htmlTagName contained object optgroup q s tbody tfoot thead
+" new html 5 tags
+syn keyword htmlTagName contained article aside audio bdi canvas data
+syn keyword htmlTagName contained datalist details embed figcaption figure
+syn keyword htmlTagName contained footer header hgroup keygen main mark
+syn keyword htmlTagName contained menuitem meter nav output picture
+syn keyword htmlTagName contained progress rb rp rt rtc ruby section
+syn keyword htmlTagName contained slot source template time track video wbr
+
" legal arg names
syn keyword htmlArg contained action
syn keyword htmlArg contained align alink alt archive background bgcolor
@@ -77,6 +77,29 @@ syn keyword htmlArg contained size src start target text type url
syn keyword htmlArg contained usemap ismap valign value vlink vspace width wrap
syn match htmlArg contained "\<\(http-equiv\|href\|title\)="me=e-1
+" aria attributes
+syn match htmlArg contained "\<\(aria-activedescendant\|aria-atomic\)\>"
+syn match htmlArg contained "\<\(aria-autocomplete\|aria-busy\|aria-checked\)\>"
+syn match htmlArg contained "\<\(aria-colcount\|aria-colindex\|aria-colspan\)\>"
+syn match htmlArg contained "\<\(aria-controls\|aria-current\)\>"
+syn match htmlArg contained "\<\(aria-describedby\|aria-details\)\>"
+syn match htmlArg contained "\<\(aria-disabled\|aria-dropeffect\)\>"
+syn match htmlArg contained "\<\(aria-errormessage\|aria-expanded\)\>"
+syn match htmlArg contained "\<\(aria-flowto\|aria-grabbed\|aria-haspopup\)\>"
+syn match htmlArg contained "\<\(aria-hidden\|aria-invalid\)\>"
+syn match htmlArg contained "\<\(aria-keyshortcuts\|aria-label\)\>"
+syn match htmlArg contained "\<\(aria-labelledby\|aria-level\|aria-live\)\>"
+syn match htmlArg contained "\<\(aria-modal\|aria-multiline\)\>"
+syn match htmlArg contained "\<\(aria-multiselectable\|aria-orientation\)\>"
+syn match htmlArg contained "\<\(aria-owns\|aria-placeholder\|aria-posinset\)\>"
+syn match htmlArg contained "\<\(aria-pressed\|aria-readonly\|aria-relevant\)\>"
+syn match htmlArg contained "\<\(aria-required\|aria-roledescription\)\>"
+syn match htmlArg contained "\<\(aria-rowcount\|aria-rowindex\|aria-rowspan\)\>"
+syn match htmlArg contained "\<\(aria-selected\|aria-setsize\|aria-sort\)\>"
+syn match htmlArg contained "\<\(aria-valuemax\|aria-valuemin\)\>"
+syn match htmlArg contained "\<\(aria-valuenow\|aria-valuetext\)\>"
+syn keyword htmlArg contained role
+
" Netscape extensions
syn keyword htmlTagName contained frame noframes frameset nobr blink
syn keyword htmlTagName contained layer ilayer nolayer spacer
@@ -97,6 +120,19 @@ syn keyword htmlArg contained multiple nohref nowrap object profile readonly
syn keyword htmlArg contained rules scheme scope span standby style
syn keyword htmlArg contained summary tabindex valuetype version
+" html 5 arg names
+syn keyword htmlArg contained allowfullscreen async autocomplete autofocus
+syn keyword htmlArg contained autoplay challenge contenteditable contextmenu
+syn keyword htmlArg contained controls crossorigin default dialog dirname
+syn keyword htmlArg contained download draggable dropzone form formaction
+syn keyword htmlArg contained formenctype formmethod formnovalidate formtarget
+syn keyword htmlArg contained hidden high icon inputmode keytype kind list loop
+syn keyword htmlArg contained low max min minlength muted nonce novalidate open
+syn keyword htmlArg contained optimum pattern placeholder poster preload
+syn keyword htmlArg contained radiogroup required reversed sandbox spellcheck
+syn keyword htmlArg contained sizes srcset srcdoc srclang step title translate
+syn keyword htmlArg contained typemustmatch
+
" special characters
syn match htmlSpecialChar "&#\=[0-9A-Za-z]\{1,8};"
@@ -123,6 +159,9 @@ if !exists("html_no_rendering")
" rendering
syn cluster htmlTop contains=@Spell,htmlTag,htmlEndTag,htmlSpecialChar,htmlPreProc,htmlComment,htmlLink,javaScript,@htmlPreproc
+ syn region htmlStrike start="<del\>" end="</del>"me=e-6 contains=@htmlTop
+ syn region htmlStrike start="<strike\>" end="</strike>"me=e-9 contains=@htmlTop
+
syn region htmlBold start="<b\>" end="</b>"me=e-4 contains=@htmlTop,htmlBoldUnderline,htmlBoldItalic
syn region htmlBold start="<strong\>" end="</strong>"me=e-9 contains=@htmlTop,htmlBoldUnderline,htmlBoldItalic
syn region htmlBoldUnderline contained start="<u\>" end="</u>"me=e-4 contains=@htmlTop,htmlBoldUnderlineItalic
@@ -171,7 +210,7 @@ if main_syntax != 'java' || exists("java_javascript")
unlet b:current_syntax
syn region javaScript start=+<script\_[^>]*>+ keepend end=+</script\_[^>]*>+me=s-1 contains=@htmlJavaScript,htmlCssStyleComment,htmlScriptTag,@htmlPreproc
syn region htmlScriptTag contained start=+<script+ end=+>+ fold contains=htmlTagN,htmlString,htmlArg,htmlValue,htmlTagError,htmlEvent
- HtmlHiLink htmlScriptTag htmlTag
+ hi def link htmlScriptTag htmlTag
" html events (i.e. arguments that include javascript commands)
if exists("html_extended_events")
@@ -183,8 +222,8 @@ if main_syntax != 'java' || exists("java_javascript")
endif
syn region htmlEventSQ contained start=+'+ms=s+1 end=+'+me=s-1 contains=@htmlJavaScript
syn region htmlEventDQ contained start=+"+ms=s+1 end=+"+me=s-1 contains=@htmlJavaScript
- HtmlHiLink htmlEventSQ htmlEvent
- HtmlHiLink htmlEventDQ htmlEvent
+ hi def link htmlEventSQ htmlEvent
+ hi def link htmlEventDQ htmlEvent
" a javascript expression is used as an arg value
syn region javaScriptExpression contained start=+&{+ keepend end=+};+ contains=@htmlJavaScript,@htmlPreproc
@@ -207,7 +246,7 @@ if main_syntax != 'java' || exists("java_css")
syn region cssStyle start=+<style+ keepend end=+</style>+ contains=@htmlCss,htmlTag,htmlEndTag,htmlCssStyleComment,@htmlPreproc
syn match htmlCssStyleComment contained "\(<!--\|-->\)"
syn region htmlCssDefinition matchgroup=htmlArg start='style="' keepend matchgroup=htmlString end='"' contains=css.*Attr,css.*Prop,cssComment,cssLength,cssColor,cssURL,cssImportant,cssError,cssString,@htmlPreproc
- HtmlHiLink htmlStyleArg htmlString
+ hi def link htmlStyleArg htmlString
endif
if main_syntax == "html"
@@ -221,73 +260,71 @@ if main_syntax == "html"
endif
" The default highlighting.
-if version >= 508 || !exists("did_html_syn_inits")
- if version < 508
- let did_html_syn_inits = 1
- endif
- HtmlHiLink htmlTag Function
- HtmlHiLink htmlEndTag Identifier
- HtmlHiLink htmlArg Type
- HtmlHiLink htmlTagName htmlStatement
- HtmlHiLink htmlSpecialTagName Exception
- HtmlHiLink htmlValue String
- HtmlHiLink htmlSpecialChar Special
-
- if !exists("html_no_rendering")
- HtmlHiLink htmlH1 Title
- HtmlHiLink htmlH2 htmlH1
- HtmlHiLink htmlH3 htmlH2
- HtmlHiLink htmlH4 htmlH3
- HtmlHiLink htmlH5 htmlH4
- HtmlHiLink htmlH6 htmlH5
- HtmlHiLink htmlHead PreProc
- HtmlHiLink htmlTitle Title
- HtmlHiLink htmlBoldItalicUnderline htmlBoldUnderlineItalic
- HtmlHiLink htmlUnderlineBold htmlBoldUnderline
- HtmlHiLink htmlUnderlineItalicBold htmlBoldUnderlineItalic
- HtmlHiLink htmlUnderlineBoldItalic htmlBoldUnderlineItalic
- HtmlHiLink htmlItalicUnderline htmlUnderlineItalic
- HtmlHiLink htmlItalicBold htmlBoldItalic
- HtmlHiLink htmlItalicBoldUnderline htmlBoldUnderlineItalic
- HtmlHiLink htmlItalicUnderlineBold htmlBoldUnderlineItalic
- HtmlHiLink htmlLink Underlined
- HtmlHiLink htmlLeadingSpace None
- if !exists("html_my_rendering")
- hi def htmlBold term=bold cterm=bold gui=bold
- hi def htmlBoldUnderline term=bold,underline cterm=bold,underline gui=bold,underline
- hi def htmlBoldItalic term=bold,italic cterm=bold,italic gui=bold,italic
- hi def htmlBoldUnderlineItalic term=bold,italic,underline cterm=bold,italic,underline gui=bold,italic,underline
- hi def htmlUnderline term=underline cterm=underline gui=underline
- hi def htmlUnderlineItalic term=italic,underline cterm=italic,underline gui=italic,underline
- hi def htmlItalic term=italic cterm=italic gui=italic
+hi def link htmlTag Function
+hi def link htmlEndTag Identifier
+hi def link htmlArg Type
+hi def link htmlTagName htmlStatement
+hi def link htmlSpecialTagName Exception
+hi def link htmlValue String
+hi def link htmlSpecialChar Special
+
+if !exists("html_no_rendering")
+ hi def link htmlH1 Title
+ hi def link htmlH2 htmlH1
+ hi def link htmlH3 htmlH2
+ hi def link htmlH4 htmlH3
+ hi def link htmlH5 htmlH4
+ hi def link htmlH6 htmlH5
+ hi def link htmlHead PreProc
+ hi def link htmlTitle Title
+ hi def link htmlBoldItalicUnderline htmlBoldUnderlineItalic
+ hi def link htmlUnderlineBold htmlBoldUnderline
+ hi def link htmlUnderlineItalicBold htmlBoldUnderlineItalic
+ hi def link htmlUnderlineBoldItalic htmlBoldUnderlineItalic
+ hi def link htmlItalicUnderline htmlUnderlineItalic
+ hi def link htmlItalicBold htmlBoldItalic
+ hi def link htmlItalicBoldUnderline htmlBoldUnderlineItalic
+ hi def link htmlItalicUnderlineBold htmlBoldUnderlineItalic
+ hi def link htmlLink Underlined
+ hi def link htmlLeadingSpace None
+ if !exists("html_my_rendering")
+ hi def htmlBold term=bold cterm=bold gui=bold
+ hi def htmlBoldUnderline term=bold,underline cterm=bold,underline gui=bold,underline
+ hi def htmlBoldItalic term=bold,italic cterm=bold,italic gui=bold,italic
+ hi def htmlBoldUnderlineItalic term=bold,italic,underline cterm=bold,italic,underline gui=bold,italic,underline
+ hi def htmlUnderline term=underline cterm=underline gui=underline
+ hi def htmlUnderlineItalic term=italic,underline cterm=italic,underline gui=italic,underline
+ hi def htmlItalic term=italic cterm=italic gui=italic
+ if v:version > 800 || v:version == 800 && has("patch1038")
+ hi def htmlStrike term=strikethrough cterm=strikethrough gui=strikethrough
+ else
+ hi def htmlStrike term=underline cterm=underline gui=underline
endif
endif
-
- HtmlHiLink htmlPreStmt PreProc
- HtmlHiLink htmlPreError Error
- HtmlHiLink htmlPreProc PreProc
- HtmlHiLink htmlPreAttr String
- HtmlHiLink htmlPreProcAttrName PreProc
- HtmlHiLink htmlPreProcAttrError Error
- HtmlHiLink htmlSpecial Special
- HtmlHiLink htmlSpecialChar Special
- HtmlHiLink htmlString String
- HtmlHiLink htmlStatement Statement
- HtmlHiLink htmlComment Comment
- HtmlHiLink htmlCommentPart Comment
- HtmlHiLink htmlValue String
- HtmlHiLink htmlCommentError htmlError
- HtmlHiLink htmlTagError htmlError
- HtmlHiLink htmlEvent javaScript
- HtmlHiLink htmlError Error
-
- HtmlHiLink javaScript Special
- HtmlHiLink javaScriptExpression javaScript
- HtmlHiLink htmlCssStyleComment Comment
- HtmlHiLink htmlCssDefinition Special
endif
-delcommand HtmlHiLink
+hi def link htmlPreStmt PreProc
+hi def link htmlPreError Error
+hi def link htmlPreProc PreProc
+hi def link htmlPreAttr String
+hi def link htmlPreProcAttrName PreProc
+hi def link htmlPreProcAttrError Error
+hi def link htmlSpecial Special
+hi def link htmlSpecialChar Special
+hi def link htmlString String
+hi def link htmlStatement Statement
+hi def link htmlComment Comment
+hi def link htmlCommentPart Comment
+hi def link htmlValue String
+hi def link htmlCommentError htmlError
+hi def link htmlTagError htmlError
+hi def link htmlEvent javaScript
+hi def link htmlError Error
+
+hi def link javaScript Special
+hi def link javaScriptExpression javaScript
+hi def link htmlCssStyleComment Comment
+hi def link htmlCssDefinition Special
let b:current_syntax = "html"
diff --git a/runtime/syntax/htmlcheetah.vim b/runtime/syntax/htmlcheetah.vim
index f57df90dea..0721c76b44 100644
--- a/runtime/syntax/htmlcheetah.vim
+++ b/runtime/syntax/htmlcheetah.vim
@@ -3,11 +3,8 @@
" Maintainer: Max Ischenko <mfi@ukr.net>
" Last Change: 2003-05-11
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -15,14 +12,9 @@ if !exists("main_syntax")
let main_syntax = 'html'
endif
-if version < 600
- so <sfile>:p:h/cheetah.vim
- so <sfile>:p:h/html.vim
-else
- runtime! syntax/cheetah.vim
- runtime! syntax/html.vim
- unlet b:current_syntax
-endif
+runtime! syntax/cheetah.vim
+runtime! syntax/html.vim
+unlet b:current_syntax
syntax cluster htmlPreproc add=cheetahPlaceHolder
syntax cluster htmlString add=cheetahPlaceHolder
diff --git a/runtime/syntax/htmldjango.vim b/runtime/syntax/htmldjango.vim
index 58afd1b62d..07b1c375e8 100644
--- a/runtime/syntax/htmldjango.vim
+++ b/runtime/syntax/htmldjango.vim
@@ -3,11 +3,8 @@
" Maintainer: Dave Hodder <dmh@dmh.org.uk>
" Last Change: 2014 Jul 13
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -15,14 +12,9 @@ if !exists("main_syntax")
let main_syntax = 'html'
endif
-if version < 600
- so <sfile>:p:h/django.vim
- so <sfile>:p:h/html.vim
-else
- runtime! syntax/django.vim
- runtime! syntax/html.vim
- unlet b:current_syntax
-endif
+runtime! syntax/django.vim
+runtime! syntax/html.vim
+unlet b:current_syntax
syn cluster djangoBlocks add=djangoTagBlock,djangoVarBlock,djangoComment,djangoComBlock
diff --git a/runtime/syntax/htmlm4.vim b/runtime/syntax/htmlm4.vim
index 3119d2d1ad..ee1f06e5f4 100644
--- a/runtime/syntax/htmlm4.vim
+++ b/runtime/syntax/htmlm4.vim
@@ -4,11 +4,8 @@
" URL: http://www.fleiner.com/vim/syntax/htmlm4.vim
" Last Change: 2001 Apr 30
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -17,19 +14,12 @@ if !exists("main_syntax")
let main_syntax='htmlm4'
endif
-if version < 600
- so <sfile>:p:h/html.vim
-else
- runtime! syntax/html.vim
-endif
+runtime! syntax/html.vim
unlet b:current_syntax
syn case match
-if version < 600
- so <sfile>:p:h/m4.vim
-else
- runtime! syntax/m4.vim
-endif
+runtime! syntax/m4.vim
+
unlet b:current_syntax
syn cluster htmlPreproc add=@m4Top
syn cluster m4StringContents add=htmlTag,htmlEndTag
diff --git a/runtime/syntax/htmlos.vim b/runtime/syntax/htmlos.vim
index f31b9f6543..b54ca7a921 100644
--- a/runtime/syntax/htmlos.vim
+++ b/runtime/syntax/htmlos.vim
@@ -6,11 +6,8 @@
" Last Change: 2003 May 11
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -18,12 +15,8 @@ if !exists("main_syntax")
let main_syntax = 'htmlos'
endif
-if version < 600
- so <sfile>:p:h/html.vim
-else
- runtime! syntax/html.vim
- unlet b:current_syntax
-endif
+runtime! syntax/html.vim
+unlet b:current_syntax
syn cluster htmlPreproc add=htmlosRegion
@@ -121,42 +114,32 @@ else
endif
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_htmlos_syn_inits")
- if version < 508
- let did_htmlos_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default methods for highlighting. Can be overridden later
- HiLink htmlosSpecialIdentifier Operator
- HiLink htmlosIdentifier Identifier
- HiLink htmlosStorageClass StorageClass
- HiLink htmlosComment Comment
- HiLink htmlosBoolean Boolean
- HiLink htmlosStringSingle String
- HiLink htmlosStringDouble String
- HiLink htmlosNumber Number
- HiLink htmlosFloat Float
- HiLink htmlosFunctions Function
- HiLink htmlosRepeat Repeat
- HiLink htmlosConditional Conditional
- HiLink htmlosLabel Label
- HiLink htmlosStatement Statement
- HiLink htmlosKeyword Statement
- HiLink htmlosType Type
- HiLink htmlosDefine Define
- HiLink htmlosParent Delimiter
- HiLink htmlosError Error
- HiLink htmlosTodo Todo
- HiLink htmlosOperator Operator
- HiLink htmlosRelation Operator
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+" The default methods for highlighting. Can be overridden later
+hi def link htmlosSpecialIdentifier Operator
+hi def link htmlosIdentifier Identifier
+hi def link htmlosStorageClass StorageClass
+hi def link htmlosComment Comment
+hi def link htmlosBoolean Boolean
+hi def link htmlosStringSingle String
+hi def link htmlosStringDouble String
+hi def link htmlosNumber Number
+hi def link htmlosFloat Float
+hi def link htmlosFunctions Function
+hi def link htmlosRepeat Repeat
+hi def link htmlosConditional Conditional
+hi def link htmlosLabel Label
+hi def link htmlosStatement Statement
+hi def link htmlosKeyword Statement
+hi def link htmlosType Type
+hi def link htmlosDefine Define
+hi def link htmlosParent Delimiter
+hi def link htmlosError Error
+hi def link htmlosTodo Todo
+hi def link htmlosOperator Operator
+hi def link htmlosRelation Operator
+
let b:current_syntax = "htmlos"
if main_syntax == 'htmlos'
diff --git a/runtime/syntax/ia64.vim b/runtime/syntax/ia64.vim
index ebfdc95bae..544fcd402c 100644
--- a/runtime/syntax/ia64.vim
+++ b/runtime/syntax/ia64.vim
@@ -6,11 +6,8 @@
" File Version: 0.7
" Last Change: 2006 Sep 08
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -19,11 +16,7 @@ endif
syn case ignore
" Identifier Keyword characters (defines \k)
-if version >= 600
- setlocal iskeyword=@,48-57,#,$,.,:,?,@-@,_,~
-else
- set iskeyword=@,48-57,#,$,.,:,?,@-@,_,~
-endif
+setlocal iskeyword=@,48-57,#,$,.,:,?,@-@,_,~
syn sync minlines=5
@@ -268,43 +261,33 @@ syn match ia64data "real\([48]\|1[06]\)\(\(\(\.ua\)\=\(\.msb\|\.lsb\)\=\)\|\(\(\
syn match ia64data "stringz\=\(\(\(\.ua\)\=\(\.msb\|\.lsb\)\=\)\|\(\(\.msb\|\.lsb\)\=\(\.ua\)\=\)\)\=\>"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_ia64_syn_inits")
- if version < 508
- let did_ia64_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- "put masm groups with our groups
- HiLink masmOperator ia64operator
- HiLink masmDirective ia64Directive
- HiLink masmOpcode ia64Opcode
- HiLink masmIdentifier ia64Identifier
- HiLink masmFloat ia64Float
+"put masm groups with our groups
+hi def link masmOperator ia64operator
+hi def link masmDirective ia64Directive
+hi def link masmOpcode ia64Opcode
+hi def link masmIdentifier ia64Identifier
+hi def link masmFloat ia64Float
- "ia64 specific stuff
- HiLink ia64Label Define
- HiLink ia64Comment Comment
- HiLink ia64Directive Type
- HiLink ia64opcode Statement
- HiLink ia64registers Operator
- HiLink ia64string String
- HiLink ia64Hex Number
- HiLink ia64Binary Number
- HiLink ia64Octal Number
- HiLink ia64Float Float
- HiLink ia64Decimal Number
- HiLink ia64Identifier Identifier
- HiLink ia64data Type
- HiLink ia64delimiter Delimiter
- HiLink ia64operator Operator
- HiLink ia64Todo Todo
+"ia64 specific stuff
+hi def link ia64Label Define
+hi def link ia64Comment Comment
+hi def link ia64Directive Type
+hi def link ia64opcode Statement
+hi def link ia64registers Operator
+hi def link ia64string String
+hi def link ia64Hex Number
+hi def link ia64Binary Number
+hi def link ia64Octal Number
+hi def link ia64Float Float
+hi def link ia64Decimal Number
+hi def link ia64Identifier Identifier
+hi def link ia64data Type
+hi def link ia64delimiter Delimiter
+hi def link ia64operator Operator
+hi def link ia64Todo Todo
- delcommand HiLink
-endif
let b:current_syntax = "ia64"
diff --git a/runtime/syntax/icemenu.vim b/runtime/syntax/icemenu.vim
index d3a733d579..6513287dfc 100644
--- a/runtime/syntax/icemenu.vim
+++ b/runtime/syntax/icemenu.vim
@@ -6,10 +6,8 @@
" Comment: Icewm is a lightweight window manager. This adds syntax
" highlighting when editing your user's menu file (~/.icewm/menu).
-" clear existing syntax
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/icon.vim b/runtime/syntax/icon.vim
index 1a73c43d8f..179d75cd28 100644
--- a/runtime/syntax/icon.vim
+++ b/runtime/syntax/icon.vim
@@ -4,11 +4,8 @@
" URL: ftp://ftp.halcyon.com/pub/users/wturner/icon.vim
" Last Change: 2003 May 11
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -157,56 +154,46 @@ exec "syn sync ccomment iconComment minlines=" . icon_minlines
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting
-if version >= 508 || !exists("did_icon_syn_inits")
- if version < 508
- let did_icon_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default methods for highlighting. Can be overridden later
-
- " HiLink iconSpecialCharacter iconSpecial
-
- HiLink iconOctalError iconError
- HiLink iconParenError iconError
- HiLink iconInParen iconError
- HiLink iconCommentError iconError
- HiLink iconSpaceError iconError
- HiLink iconCommentError iconError
- HiLink iconIncluded iconString
- HiLink iconCommentString iconString
- HiLink iconComment2String iconString
- HiLink iconCommentSkip iconComment
-
- HiLink iconUserLabel Label
- HiLink iconCharacter Character
- HiLink iconNumber Number
- HiLink iconRadix Number
- HiLink iconFloat Float
- HiLink iconInclude Include
- HiLink iconPreProc PreProc
- HiLink iconDefine Macro
- HiLink iconError Error
- HiLink iconStatement Statement
- HiLink iconPreCondit PreCondit
- HiLink iconString String
- HiLink iconCset String
- HiLink iconComment Comment
- HiLink iconSpecial SpecialChar
- HiLink iconTodo Todo
- HiLink iconStorageClass StorageClass
- HiLink iconFunction Statement
- HiLink iconReserved Label
- HiLink iconKeyword Operator
-
- "HiLink iconIdentifier Identifier
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting
+
+" The default methods for highlighting. Can be overridden later
+
+" hi def link iconSpecialCharacter iconSpecial
+
+hi def link iconOctalError iconError
+hi def link iconParenError iconError
+hi def link iconInParen iconError
+hi def link iconCommentError iconError
+hi def link iconSpaceError iconError
+hi def link iconCommentError iconError
+hi def link iconIncluded iconString
+hi def link iconCommentString iconString
+hi def link iconComment2String iconString
+hi def link iconCommentSkip iconComment
+
+hi def link iconUserLabel Label
+hi def link iconCharacter Character
+hi def link iconNumber Number
+hi def link iconRadix Number
+hi def link iconFloat Float
+hi def link iconInclude Include
+hi def link iconPreProc PreProc
+hi def link iconDefine Macro
+hi def link iconError Error
+hi def link iconStatement Statement
+hi def link iconPreCondit PreCondit
+hi def link iconString String
+hi def link iconCset String
+hi def link iconComment Comment
+hi def link iconSpecial SpecialChar
+hi def link iconTodo Todo
+hi def link iconStorageClass StorageClass
+hi def link iconFunction Statement
+hi def link iconReserved Label
+hi def link iconKeyword Operator
+
+"hi def link iconIdentifier Identifier
+
let b:current_syntax = "icon"
diff --git a/runtime/syntax/idl.vim b/runtime/syntax/idl.vim
index c51850b13a..6a4ce7e087 100644
--- a/runtime/syntax/idl.vim
+++ b/runtime/syntax/idl.vim
@@ -222,100 +222,98 @@ try
if !exists("did_idl_syntax_inits")
let did_idl_syntax_inits = 1
" The default methods for highlighting. Can be overridden later
- command -nargs=+ HiLink hi def link <args>
-
- HiLink idlInclude Include
- HiLink idlPreProc PreProc
- HiLink idlPreCondit PreCondit
- HiLink idlDefine Macro
- HiLink idlIncluded String
- HiLink idlString String
- HiLink idlComment Comment
- HiLink idlTodo Todo
- HiLink idlLiteral Number
- HiLink idlUuid Number
- HiLink idlType Type
- HiLink idlVariantType idlType
-
- HiLink idlModule Keyword
- HiLink idlInterface Keyword
- HiLink idlEnum Keyword
- HiLink idlStruct Keyword
- HiLink idlUnion Keyword
- HiLink idlTypedef Keyword
- HiLink idlException Keyword
- HiLink idlTypedefOtherTypeQualifier keyword
-
- HiLink idlModuleName Typedef
- HiLink idlInterfaceName Typedef
- HiLink idlEnumName Typedef
- HiLink idlStructName Typedef
- HiLink idlUnionName Typedef
-
- HiLink idlBaseTypeInt idlType
- HiLink idlBaseType idlType
- HiLink idlSeqType idlType
- HiLink idlD1 Paren
- HiLink idlD2 Paren
- HiLink idlD3 Paren
- HiLink idlD4 Paren
- "HiLink idlArraySize Paren
- "HiLink idlArraySize1 Paren
- HiLink idlModuleContent Paren
- HiLink idlUnionContent Paren
- HiLink idlStructContent Paren
- HiLink idlEnumContents Paren
- HiLink idlInterfaceContent Paren
-
- HiLink idlSimpDecl Identifier
- HiLink idlROAttr StorageClass
- HiLink idlAttr Keyword
- HiLink idlConst StorageClass
-
- HiLink idlOneWayOp StorageClass
- HiLink idlOp idlType
- HiLink idlParmType idlType
- HiLink idlOpName Function
- HiLink idlOpParms SpecialComment
- HiLink idlParmName Identifier
- HiLink idlInheritFrom Identifier
- HiLink idlAttribute SpecialComment
-
- HiLink idlId Constant
- "HiLink idlCase Keyword
- HiLink idlCaseLabel Constant
-
- HiLink idlErrorBracket Error
- HiLink idlErrorBrace Error
- HiLink idlErrorSquareBracket Error
-
- HiLink idlImport Keyword
- HiLink idlImportString idlString
- HiLink idlCoclassAttribute StorageClass
- HiLink idlLibrary Keyword
- HiLink idlImportlib Keyword
- HiLink idlCoclass Keyword
- HiLink idlLibraryName Typedef
- HiLink idlCoclassName Typedef
- " hi idlLibraryContent guifg=red
- HiLink idlTypedefDecl Typedef
- HiLink idlDefEnum Keyword
- HiLink idlDefv1Enum Keyword
- HiLink idlDefEnumName Typedef
- HiLink idlDefEnumContents Paren
- HiLink idlDefBaseTypeInt idlType
- HiLink idlDefBaseType idlType
- HiLink idlDefSeqType idlType
- HiLink idlInterfaceSections Label
+
+ hi def link idlInclude Include
+ hi def link idlPreProc PreProc
+ hi def link idlPreCondit PreCondit
+ hi def link idlDefine Macro
+ hi def link idlIncluded String
+ hi def link idlString String
+ hi def link idlComment Comment
+ hi def link idlTodo Todo
+ hi def link idlLiteral Number
+ hi def link idlUuid Number
+ hi def link idlType Type
+ hi def link idlVariantType idlType
+
+ hi def link idlModule Keyword
+ hi def link idlInterface Keyword
+ hi def link idlEnum Keyword
+ hi def link idlStruct Keyword
+ hi def link idlUnion Keyword
+ hi def link idlTypedef Keyword
+ hi def link idlException Keyword
+ hi def link idlTypedefOtherTypeQualifier keyword
+
+ hi def link idlModuleName Typedef
+ hi def link idlInterfaceName Typedef
+ hi def link idlEnumName Typedef
+ hi def link idlStructName Typedef
+ hi def link idlUnionName Typedef
+
+ hi def link idlBaseTypeInt idlType
+ hi def link idlBaseType idlType
+ hi def link idlSeqType idlType
+ hi def link idlD1 Paren
+ hi def link idlD2 Paren
+ hi def link idlD3 Paren
+ hi def link idlD4 Paren
+ "hi def link idlArraySize Paren
+ "hi def link idlArraySize1 Paren
+ hi def link idlModuleContent Paren
+ hi def link idlUnionContent Paren
+ hi def link idlStructContent Paren
+ hi def link idlEnumContents Paren
+ hi def link idlInterfaceContent Paren
+
+ hi def link idlSimpDecl Identifier
+ hi def link idlROAttr StorageClass
+ hi def link idlAttr Keyword
+ hi def link idlConst StorageClass
+
+ hi def link idlOneWayOp StorageClass
+ hi def link idlOp idlType
+ hi def link idlParmType idlType
+ hi def link idlOpName Function
+ hi def link idlOpParms SpecialComment
+ hi def link idlParmName Identifier
+ hi def link idlInheritFrom Identifier
+ hi def link idlAttribute SpecialComment
+
+ hi def link idlId Constant
+ "hi def link idlCase Keyword
+ hi def link idlCaseLabel Constant
+
+ hi def link idlErrorBracket Error
+ hi def link idlErrorBrace Error
+ hi def link idlErrorSquareBracket Error
+
+ hi def link idlImport Keyword
+ hi def link idlImportString idlString
+ hi def link idlCoclassAttribute StorageClass
+ hi def link idlLibrary Keyword
+ hi def link idlImportlib Keyword
+ hi def link idlCoclass Keyword
+ hi def link idlLibraryName Typedef
+ hi def link idlCoclassName Typedef
+ " hi def link idlLibraryContent guifg=red
+ hi def link idlTypedefDecl Typedef
+ hi def link idlDefEnum Keyword
+ hi def link idlDefv1Enum Keyword
+ hi def link idlDefEnumName Typedef
+ hi def link idlDefEnumContents Paren
+ hi def link idlDefBaseTypeInt idlType
+ hi def link idlDefBaseType idlType
+ hi def link idlDefSeqType idlType
+ hi def link idlInterfaceSections Label
if exists("idlsyntax_showerror")
if exists("idlsyntax_showerror_soft")
hi default idlError guibg=#d0ffd0
else
- HiLink idlError Error
+ hi def link idlError Error
endif
endif
- delcommand HiLink
endif
let b:current_syntax = "idl"
diff --git a/runtime/syntax/idlang.vim b/runtime/syntax/idlang.vim
index 670d080a7d..14e976ce05 100644
--- a/runtime/syntax/idlang.vim
+++ b/runtime/syntax/idlang.vim
@@ -4,11 +4,8 @@
" Created by: Hermann Rochholz <Hermann.Rochholz AT gmx.de>
" Remove any old syntax stuff hanging around
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -219,35 +216,25 @@ syn keyword idlangRoutine XSQ_TEST XSURFACE XVAREDIT XVOLUME XVOLUME_ROTATE
syn keyword idlangRoutine XVOLUME_WRITE_IMAGE XYOUTS ZOOM ZOOM_24
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_idlang_syn_inits")
- if version < 508
- let did_idlang_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
-else
- command -nargs=+ HiLink hi def link <args>
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link idlangConditional Conditional
+hi def link idlangRoutine Type
+hi def link idlangStatement Statement
+hi def link idlangContinueLine Todo
+hi def link idlangRealNumber Float
+hi def link idlangNumber Number
+hi def link idlangString String
+hi def link idlangOperator Operator
+hi def link idlangComment Comment
+hi def link idlangTodo Todo
+hi def link idlangPreCondit Identifier
+hi def link idlangDblCommaError Error
+hi def link idlangStop Error
+hi def link idlangStrucvar PreProc
+hi def link idlangSystem Identifier
+hi def link idlangKeyword Special
- HiLink idlangConditional Conditional
- HiLink idlangRoutine Type
- HiLink idlangStatement Statement
- HiLink idlangContinueLine Todo
- HiLink idlangRealNumber Float
- HiLink idlangNumber Number
- HiLink idlangString String
- HiLink idlangOperator Operator
- HiLink idlangComment Comment
- HiLink idlangTodo Todo
- HiLink idlangPreCondit Identifier
- HiLink idlangDblCommaError Error
- HiLink idlangStop Error
- HiLink idlangStrucvar PreProc
- HiLink idlangSystem Identifier
- HiLink idlangKeyword Special
-
- delcommand HiLink
-endif
let b:current_syntax = "idlang"
" vim: ts=18
diff --git a/runtime/syntax/indent.vim b/runtime/syntax/indent.vim
index 389101a522..ddeae67e0d 100644
--- a/runtime/syntax/indent.vim
+++ b/runtime/syntax/indent.vim
@@ -1,10 +1,10 @@
" Vim syntax file
-" Language: indent(1) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2010-01-23
-" indent_is_bsd: If exists, will change somewhat to match BSD implementation
+" Language: indent(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2010-01-23
+" indent_is_bsd: If exists, will change somewhat to match BSD implementation
"
-" TODO: is the deny-all (a la lilo.vim nice or no?)...
+" TODO: is the deny-all (a la lilo.vim nice or no?)...
" irritating to be wrong to the last char...
" would be sweet if right until one char fails
diff --git a/runtime/syntax/inform.vim b/runtime/syntax/inform.vim
index d8ba43dcee..e3e1b3e1f0 100644
--- a/runtime/syntax/inform.vim
+++ b/runtime/syntax/inform.vim
@@ -4,10 +4,8 @@
" URL: http://www.gowarthomas.com/informvim
" Last Change: 2006 April 20
-" Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -294,13 +292,8 @@ endif
" Handling for different versions of VIM.
-if version >= 600
- setlocal iskeyword+=$
- command -nargs=+ SynDisplay syntax <args> display
-else
- set iskeyword+=$
- command -nargs=+ SynDisplay syntax <args>
-endif
+setlocal iskeyword+=$
+command -nargs=+ SynDisplay syntax <args> display
" Grammar sections.
@@ -347,61 +340,52 @@ syn sync maxlines=500
delcommand SynDisplay
" The default highlighting.
-if version >= 508 || !exists("did_inform_syn_inits")
- if version < 508
- let did_inform_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink informDefine Define
- HiLink informType Type
- HiLink informInclude Include
- HiLink informPreCondit PreCondit
- HiLink informPreProc PreProc
- HiLink informGramPreProc PreProc
- HiLink informAsm Special
- if !exists("inform_suppress_obsolete")
- HiLink informAsmObsolete informError
- HiLink informKeywordObsolete informError
- else
- HiLink informAsmObsolete Special
- HiLink informKeywordObsolete Keyword
- endif
- HiLink informPredicate Operator
- HiLink informSysFunc Identifier
- HiLink informSysConst Identifier
- HiLink informConditional Conditional
- HiLink informRepeat Repeat
- HiLink informStatement Statement
- HiLink informOperator Operator
- HiLink informKeyword Keyword
- HiLink informGrammar Keyword
- HiLink informDictString String
- HiLink informNumber Number
- HiLink informError Error
- HiLink informString String
- HiLink informComment Comment
- HiLink informAccent Special
- HiLink informStringUnicode Special
- HiLink informStringCode Special
- HiLink informTodo Todo
- if !exists("inform_highlight_simple")
- HiLink informLibAttrib Identifier
- HiLink informLibProp Identifier
- HiLink informLibObj Identifier
- HiLink informLibRoutine Identifier
- HiLink informLibVariable Identifier
- HiLink informLibConst Identifier
- HiLink informLibAction Identifier
- endif
- HiLink informBadDictString informError
- HiLink informBadAccent informError
- HiLink informBadStrUnicode informError
- delcommand HiLink
+hi def link informDefine Define
+hi def link informType Type
+hi def link informInclude Include
+hi def link informPreCondit PreCondit
+hi def link informPreProc PreProc
+hi def link informGramPreProc PreProc
+hi def link informAsm Special
+if !exists("inform_suppress_obsolete")
+hi def link informAsmObsolete informError
+hi def link informKeywordObsolete informError
+else
+hi def link informAsmObsolete Special
+hi def link informKeywordObsolete Keyword
endif
+hi def link informPredicate Operator
+hi def link informSysFunc Identifier
+hi def link informSysConst Identifier
+hi def link informConditional Conditional
+hi def link informRepeat Repeat
+hi def link informStatement Statement
+hi def link informOperator Operator
+hi def link informKeyword Keyword
+hi def link informGrammar Keyword
+hi def link informDictString String
+hi def link informNumber Number
+hi def link informError Error
+hi def link informString String
+hi def link informComment Comment
+hi def link informAccent Special
+hi def link informStringUnicode Special
+hi def link informStringCode Special
+hi def link informTodo Todo
+if !exists("inform_highlight_simple")
+hi def link informLibAttrib Identifier
+hi def link informLibProp Identifier
+hi def link informLibObj Identifier
+hi def link informLibRoutine Identifier
+hi def link informLibVariable Identifier
+hi def link informLibConst Identifier
+hi def link informLibAction Identifier
+endif
+hi def link informBadDictString informError
+hi def link informBadAccent informError
+hi def link informBadStrUnicode informError
+
let b:current_syntax = "inform"
diff --git a/runtime/syntax/initex.vim b/runtime/syntax/initex.vim
index 8f3462f5cf..564a6e0cca 100644
--- a/runtime/syntax/initex.vim
+++ b/runtime/syntax/initex.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: TeX (core definition)
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: TeX (core definition)
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
@@ -11,7 +11,7 @@ let s:cpo_save = &cpo
set cpo&vim
" This follows the grouping (sort of) found at
-" http://www.tug.org/utilities/plain/cseq.html#top-fam
+" http: //www.tug.org/utilities/plain/cseq.html#top-fam
syn keyword initexTodo TODO FIXME XXX NOTE
diff --git a/runtime/syntax/inittab.vim b/runtime/syntax/inittab.vim
index b7472f9e0f..82bf660105 100644
--- a/runtime/syntax/inittab.vim
+++ b/runtime/syntax/inittab.vim
@@ -6,12 +6,9 @@
" URL: http://physics.muni.cz/~yeti/download/syntax/inittab.vim
" Setup
-if version >= 600
- if exists("b:current_syntax")
- finish
- endif
-else
- syntax clear
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
endif
syn case match
@@ -45,31 +42,22 @@ syn match inittabProcessPlus "+" contained nextgroup=inittabProcess,inittabError
syn region inittabProcess start="/" end="$" transparent oneline contained contains=@inittabSh,inittabComment
" Define the default highlighting
-if version >= 508 || !exists("did_inittab_syntax_inits")
- if version < 508
- let did_inittab_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink inittabComment Comment
- HiLink inittabFixme Todo
- HiLink inittabActionName Type
- HiLink inittabError Error
- HiLink inittabId Identifier
- HiLink inittabRunLevels Special
+hi def link inittabComment Comment
+hi def link inittabFixme Todo
+hi def link inittabActionName Type
+hi def link inittabError Error
+hi def link inittabId Identifier
+hi def link inittabRunLevels Special
- HiLink inittabColonProcess inittabColon
- HiLink inittabColonAction inittabColon
- HiLink inittabColonRunLevels inittabColon
- HiLink inittabColon PreProc
+hi def link inittabColonProcess inittabColon
+hi def link inittabColonAction inittabColon
+hi def link inittabColonRunLevels inittabColon
+hi def link inittabColon PreProc
- HiLink inittabShString String
- HiLink inittabShOption Special
- HiLink inittabShCommand Statement
+hi def link inittabShString String
+hi def link inittabShOption Special
+hi def link inittabShCommand Statement
- delcommand HiLink
-endif
let b:current_syntax = "inittab"
diff --git a/runtime/syntax/ipfilter.vim b/runtime/syntax/ipfilter.vim
index db99812852..a7b7df2bac 100644
--- a/runtime/syntax/ipfilter.vim
+++ b/runtime/syntax/ipfilter.vim
@@ -9,11 +9,8 @@
" not correctly identified.
" Please send comments to hendrik@scholz.net
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/ishd.vim b/runtime/syntax/ishd.vim
index 1c011f1b92..3c468e361f 100644
--- a/runtime/syntax/ishd.vim
+++ b/runtime/syntax/ishd.vim
@@ -3,11 +3,8 @@
" Maintainer: Robert M. Cortopassi <cortopar@mindspring.com>
" Last Change: 2001 May 09
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -387,35 +384,25 @@ syn cluster ishdPreProcGroup contains=ishdPreCondit,ishdIncluded,ishdInclude,ish
syn region ishdDefine start="^\s*#\s*\(define\|undef\)\>" end="$" contains=ALLBUT,@ishdPreProcGroup
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_is_syntax_inits")
- if version < 508
- let did_is_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink ishdNumber Number
- HiLink ishdError Error
- HiLink ishdStatement Statement
- HiLink ishdString String
- HiLink ishdComment Comment
- HiLink ishdTodo Todo
- HiLink ishdFunction Identifier
- HiLink ishdConstant PreProc
- HiLink ishdType Type
- HiLink ishdInclude Include
- HiLink ishdDefine Macro
- HiLink ishdIncluded String
- HiLink ishdPreCondit PreCondit
- HiLink ishdHashIf0Skip ishdHashIf0
- HiLink ishdHashIf0End ishdHashIf0
- HiLink ishdHashIf0 Comment
+hi def link ishdNumber Number
+hi def link ishdError Error
+hi def link ishdStatement Statement
+hi def link ishdString String
+hi def link ishdComment Comment
+hi def link ishdTodo Todo
+hi def link ishdFunction Identifier
+hi def link ishdConstant PreProc
+hi def link ishdType Type
+hi def link ishdInclude Include
+hi def link ishdDefine Macro
+hi def link ishdIncluded String
+hi def link ishdPreCondit PreCondit
+hi def link ishdHashIf0Skip ishdHashIf0
+hi def link ishdHashIf0End ishdHashIf0
+hi def link ishdHashIf0 Comment
- delcommand HiLink
-endif
let b:current_syntax = "ishd"
diff --git a/runtime/syntax/iss.vim b/runtime/syntax/iss.vim
index 26d9150b5a..e58c618b7f 100644
--- a/runtime/syntax/iss.vim
+++ b/runtime/syntax/iss.vim
@@ -9,11 +9,8 @@
" - Pascal scripting syntax is not recognized.
" - Embedded double quotes confuse string matches. e.g. "asfd""asfa"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -105,44 +102,34 @@ syn keyword issTasksFlags checkedonce dontinheritcheck exclusive restart uncheck
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_iss_syntax_inits")
- if version < 508
- let did_iss_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default methods for highlighting. Can be overridden later
- HiLink issSection Special
- HiLink issComment Comment
- HiLink issDirective Type
- HiLink issParam Type
- HiLink issFolder Special
- HiLink issString String
- HiLink issURL Include
- HiLink issPreProc PreProc
-
- HiLink issDirsFlags Keyword
- HiLink issFilesCopyMode Keyword
- HiLink issFilesAttribs Keyword
- HiLink issFilesPermissions Keyword
- HiLink issFilesFlags Keyword
- HiLink issIconsFlags Keyword
- HiLink issINIFlags Keyword
- HiLink issRegRootKey Keyword
- HiLink issRegValueType Keyword
- HiLink issRegFlags Keyword
- HiLink issRunFlags Keyword
- HiLink issTypesFlags Keyword
- HiLink issComponentsFlags Keyword
- HiLink issInstallDeleteType Keyword
- HiLink issTasksFlags Keyword
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+" The default methods for highlighting. Can be overridden later
+hi def link issSection Special
+hi def link issComment Comment
+hi def link issDirective Type
+hi def link issParam Type
+hi def link issFolder Special
+hi def link issString String
+hi def link issURL Include
+hi def link issPreProc PreProc
+
+hi def link issDirsFlags Keyword
+hi def link issFilesCopyMode Keyword
+hi def link issFilesAttribs Keyword
+hi def link issFilesPermissions Keyword
+hi def link issFilesFlags Keyword
+hi def link issIconsFlags Keyword
+hi def link issINIFlags Keyword
+hi def link issRegRootKey Keyword
+hi def link issRegValueType Keyword
+hi def link issRegFlags Keyword
+hi def link issRunFlags Keyword
+hi def link issTypesFlags Keyword
+hi def link issComponentsFlags Keyword
+hi def link issInstallDeleteType Keyword
+hi def link issTasksFlags Keyword
+
let b:current_syntax = "iss"
diff --git a/runtime/syntax/ist.vim b/runtime/syntax/ist.vim
index 131d833cbc..e34edac272 100644
--- a/runtime/syntax/ist.vim
+++ b/runtime/syntax/ist.vim
@@ -3,22 +3,15 @@
" Maintainer: Peter Meszaros <pmeszaros@effice.hu>
" Last Change: 2012 Jan 08 by Thilo Six
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
let s:cpo_save = &cpo
set cpo&vim
-if version >= 600
- setlocal iskeyword=$,@,48-57,_
-else
- set iskeyword=$,@,48-57,_
-endif
+setlocal iskeyword=$,@,48-57,_
syn case ignore
syn keyword IstInpSpec actual arg_close arg_open encap escape
@@ -45,28 +38,18 @@ syn match IstSpecial "\\\\\|{\|}\|#\|\\n" contained
syn match IstTodo "DEBUG\|TODO" contained
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_dummy_syn_inits")
- if version < 508
- let did_dummy_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink IstInpSpec Type
- HiLink IstOutSpec Identifier
- HiLink IstString String
- HiLink IstNumber Number
- HiLink IstComment Comment
- HiLink IstTodo Todo
- HiLink IstSpecial Special
- HiLink IstDoubleQuote Label
- HiLink IstCharacter Label
+" Only when an item doesn't have highlighting yet
+
+hi def link IstInpSpec Type
+hi def link IstOutSpec Identifier
+hi def link IstString String
+hi def link IstNumber Number
+hi def link IstComment Comment
+hi def link IstTodo Todo
+hi def link IstSpecial Special
+hi def link IstDoubleQuote Label
+hi def link IstCharacter Label
- delcommand HiLink
-endif
let b:current_syntax = "ist"
diff --git a/runtime/syntax/jal.vim b/runtime/syntax/jal.vim
index d0ba672851..460bc01752 100644
--- a/runtime/syntax/jal.vim
+++ b/runtime/syntax/jal.vim
@@ -9,11 +9,8 @@
"
" TODO test.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -171,77 +168,67 @@ endif
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_jal_syn_inits")
-if version < 508
- let did_jal_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
-else
- command -nargs=+ HiLink hi def link <args>
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link jalAcces jalStatement
+hi def link jalBoolean Boolean
+hi def link jalBit Boolean
+hi def link jalComment Comment
+hi def link jalConditional Conditional
+hi def link jalConstant Constant
+hi def link jalDelimiter Identifier
+hi def link jalDirective PreProc
+hi def link jalException Exception
+hi def link jalFloat Float
+hi def link jalFunction Function
+hi def link jalPsudoVarsKey Function
+hi def link jalLabel Label
+hi def link jalMatrixDelimiter Identifier
+hi def link jalModifier Type
+hi def link jalNumber Number
+hi def link jalBinNumber Number
+hi def link jalHexNumber Number
+hi def link jalOperator Operator
+hi def link jalPredefined Constant
+hi def link jalPreProc PreProc
+hi def link jalRepeat Repeat
+hi def link jalStatement Statement
+hi def link jalString String
+hi def link jalStringEscape Special
+hi def link jalStringEscapeGPC Special
+hi def link jalStringError Error
+hi def link jalStruct jalStatement
+hi def link jalSymbolOperator jalOperator
+hi def link jalTodo Todo
+hi def link jalType Type
+hi def link jalUnclassified Statement
+hi def link jalAsm Assembler
+hi def link jalError Error
+hi def link jalAsmKey Statement
+hi def link jalPIC Statement
+
+hi def link jalShowTab Error
+
+hi def link picTodo Todo
+hi def link picComment Comment
+hi def link picDirective Statement
+hi def link picLabel Label
+hi def link picString String
+
+hi def link picOpcode Keyword
+hi def link picRegister Structure
+hi def link picRegisterPart Special
+hi def link picPinDir SPecial
+hi def link picPortDir SPecial
+
+hi def link picASCII String
+hi def link picBinary Number
+hi def link picDecimal Number
+hi def link picHexadecimal Number
+hi def link picOctal Number
+
+hi def link picIdentifier Identifier
- HiLink jalAcces jalStatement
- HiLink jalBoolean Boolean
- HiLink jalBit Boolean
- HiLink jalComment Comment
- HiLink jalConditional Conditional
- HiLink jalConstant Constant
- HiLink jalDelimiter Identifier
- HiLink jalDirective PreProc
- HiLink jalException Exception
- HiLink jalFloat Float
- HiLink jalFunction Function
- HiLink jalPsudoVarsKey Function
- HiLink jalLabel Label
- HiLink jalMatrixDelimiter Identifier
- HiLink jalModifier Type
- HiLink jalNumber Number
- HiLink jalBinNumber Number
- HiLink jalHexNumber Number
- HiLink jalOperator Operator
- HiLink jalPredefined Constant
- HiLink jalPreProc PreProc
- HiLink jalRepeat Repeat
- HiLink jalStatement Statement
- HiLink jalString String
- HiLink jalStringEscape Special
- HiLink jalStringEscapeGPC Special
- HiLink jalStringError Error
- HiLink jalStruct jalStatement
- HiLink jalSymbolOperator jalOperator
- HiLink jalTodo Todo
- HiLink jalType Type
- HiLink jalUnclassified Statement
- HiLink jalAsm Assembler
- HiLink jalError Error
- HiLink jalAsmKey Statement
- HiLink jalPIC Statement
-
- HiLink jalShowTab Error
-
- HiLink picTodo Todo
- HiLink picComment Comment
- HiLink picDirective Statement
- HiLink picLabel Label
- HiLink picString String
-
- HiLink picOpcode Keyword
- HiLink picRegister Structure
- HiLink picRegisterPart Special
- HiLink picPinDir SPecial
- HiLink picPortDir SPecial
-
- HiLink picASCII String
- HiLink picBinary Number
- HiLink picDecimal Number
- HiLink picHexadecimal Number
- HiLink picOctal Number
-
- HiLink picIdentifier Identifier
-
- delcommand HiLink
-endif
let b:current_syntax = "jal"
diff --git a/runtime/syntax/jam.vim b/runtime/syntax/jam.vim
index cbd99bb9ce..fc7f49d1f0 100644
--- a/runtime/syntax/jam.vim
+++ b/runtime/syntax/jam.vim
@@ -3,22 +3,15 @@
" Maintainer: Ralf Lemke (ralflemk@t-online.de)
" Last change: 2012 Jan 08 by Thilo Six
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
let s:cpo_save = &cpo
set cpo&vim
-if version >= 600
- setlocal iskeyword=@,48-57,_,-
-else
- set iskeyword=@,48-57,_,-
-endif
+setlocal iskeyword=@,48-57,_,-
" A bunch of useful jam keywords
syn keyword jamStatement break call dbms flush global include msg parms proc public receive return send unload vars
@@ -167,88 +160,78 @@ syntax match jamCommentError "\*/"
syntax match jamOperator3Error "*/"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_jam_syn_inits")
- if version < 508
- let did_jam_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink jamCommentL jamComment
- HiLink jamCommentL2 jamComment
- HiLink jamOperator3Error jamError
- HiLink jamConditional Conditional
- HiLink jamRepeat Repeat
- HiLink jamCharacter Character
- HiLink jamSpecialCharacter jamSpecial
- HiLink jamNumber Number
- HiLink jamParenError jamError
- HiLink jamErrInParen jamError
- HiLink jamErrInBracket jamError
- HiLink jamCommentError jamError
- HiLink jamSpaceError jamError
- HiLink jamSpecialError jamError
- HiLink jamOperator1 jamOperator
- HiLink jamOperator2 jamOperator
- HiLink jamOperator3 jamOperator
- HiLink jamOperator4 jamOperator
- HiLink jamOperator5 jamOperator
- HiLink jamOperator6 jamOperator
- HiLink jamOperator7 jamOperator
- HiLink jamOperator8 jamOperator
- HiLink jamOperator9 jamOperator
- HiLink jamOperator10 jamOperator
- HiLink jamOperator11 jamOperator
- HiLink jamOperator12 jamOperator
- HiLink jamOperator13 jamOperator
- HiLink jamOperator14 jamOperator
- HiLink jamError Error
- HiLink jamStatement Statement
- HiLink jamPreCondit PreCondit
- HiLink jamCommentError jamError
- HiLink jamCommentString jamString
- HiLink jamComment2String jamString
- HiLink jamCommentSkip jamComment
- HiLink jamString String
- HiLink jamComment Comment
- HiLink jamSpecial SpecialChar
- HiLink jamTodo Todo
- HiLink jamCppSkip jamCppOut
- HiLink jamCppOut2 jamCppOut
- HiLink jamCppOut Comment
- HiLink jamDBState1 Identifier
- HiLink jamDBState2 Identifier
- HiLink jamSQLState1 jamSQL
- HiLink jamSQLState2 jamSQL
- HiLink jamLibFunc1 jamLibFunc
- HiLink jamLibFunc2 jamLibFunc
- HiLink jamLibFunc3 jamLibFunc
- HiLink jamLibFunc4 jamLibFunc
- HiLink jamLibFunc5 jamLibFunc
- HiLink jamLibFunc6 jamLibFunc
- HiLink jamLibFunc7 jamLibFunc
- HiLink jamLibFunc8 jamLibFunc
- HiLink jamLibFunc9 jamLibFunc
- HiLink jamVariable1 jamVariablen
- HiLink jamVariable2 jamVariablen
- HiLink jamVariable3 jamVariablen
- HiLink jamVariable4 jamVariablen
- HiLink jamVariable5 jamVariablen
- HiLink jamVariable6 jamVariablen
- HiLink jamVariable7 jamVariablen
- HiLink jamVariable8 jamVariablen
- HiLink jamVariable9 jamVariablen
- HiLink jamVariable10 jamVariablen
- HiLink jamVariablen Constant
- HiLink jamSQL Type
- HiLink jamLibFunc PreProc
- HiLink jamOperator Special
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link jamCommentL jamComment
+hi def link jamCommentL2 jamComment
+hi def link jamOperator3Error jamError
+hi def link jamConditional Conditional
+hi def link jamRepeat Repeat
+hi def link jamCharacter Character
+hi def link jamSpecialCharacter jamSpecial
+hi def link jamNumber Number
+hi def link jamParenError jamError
+hi def link jamErrInParen jamError
+hi def link jamErrInBracket jamError
+hi def link jamCommentError jamError
+hi def link jamSpaceError jamError
+hi def link jamSpecialError jamError
+hi def link jamOperator1 jamOperator
+hi def link jamOperator2 jamOperator
+hi def link jamOperator3 jamOperator
+hi def link jamOperator4 jamOperator
+hi def link jamOperator5 jamOperator
+hi def link jamOperator6 jamOperator
+hi def link jamOperator7 jamOperator
+hi def link jamOperator8 jamOperator
+hi def link jamOperator9 jamOperator
+hi def link jamOperator10 jamOperator
+hi def link jamOperator11 jamOperator
+hi def link jamOperator12 jamOperator
+hi def link jamOperator13 jamOperator
+hi def link jamOperator14 jamOperator
+hi def link jamError Error
+hi def link jamStatement Statement
+hi def link jamPreCondit PreCondit
+hi def link jamCommentError jamError
+hi def link jamCommentString jamString
+hi def link jamComment2String jamString
+hi def link jamCommentSkip jamComment
+hi def link jamString String
+hi def link jamComment Comment
+hi def link jamSpecial SpecialChar
+hi def link jamTodo Todo
+hi def link jamCppSkip jamCppOut
+hi def link jamCppOut2 jamCppOut
+hi def link jamCppOut Comment
+hi def link jamDBState1 Identifier
+hi def link jamDBState2 Identifier
+hi def link jamSQLState1 jamSQL
+hi def link jamSQLState2 jamSQL
+hi def link jamLibFunc1 jamLibFunc
+hi def link jamLibFunc2 jamLibFunc
+hi def link jamLibFunc3 jamLibFunc
+hi def link jamLibFunc4 jamLibFunc
+hi def link jamLibFunc5 jamLibFunc
+hi def link jamLibFunc6 jamLibFunc
+hi def link jamLibFunc7 jamLibFunc
+hi def link jamLibFunc8 jamLibFunc
+hi def link jamLibFunc9 jamLibFunc
+hi def link jamVariable1 jamVariablen
+hi def link jamVariable2 jamVariablen
+hi def link jamVariable3 jamVariablen
+hi def link jamVariable4 jamVariablen
+hi def link jamVariable5 jamVariablen
+hi def link jamVariable6 jamVariablen
+hi def link jamVariable7 jamVariablen
+hi def link jamVariable8 jamVariablen
+hi def link jamVariable9 jamVariablen
+hi def link jamVariable10 jamVariablen
+hi def link jamVariablen Constant
+hi def link jamSQL Type
+hi def link jamLibFunc PreProc
+hi def link jamOperator Special
+
let b:current_syntax = "jam"
diff --git a/runtime/syntax/jargon.vim b/runtime/syntax/jargon.vim
index 25a88bc981..415f2bc972 100644
--- a/runtime/syntax/jargon.vim
+++ b/runtime/syntax/jargon.vim
@@ -3,11 +3,8 @@
" Maintainer: <rms@poczta.onet.pl>
" Last Change: 2001 May 26
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -17,20 +14,10 @@ syn match jargonUrl +\(http\|ftp\)://[^\t )"]*+
syn match jargonMark /{[^}]*}/
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_jargon_syntax_inits")
- if version < 508
- let did_jargon_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink jargonChaptTitle Title
- HiLink jargonEmailAddr Comment
- HiLink jargonUrl Comment
- HiLink jargonMark Label
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+hi def link jargonChaptTitle Title
+hi def link jargonEmailAddr Comment
+hi def link jargonUrl Comment
+hi def link jargonMark Label
let b:current_syntax = "jargon"
diff --git a/runtime/syntax/java.vim b/runtime/syntax/java.vim
index e113a904c3..c9bb5dc2d4 100644
--- a/runtime/syntax/java.vim
+++ b/runtime/syntax/java.vim
@@ -1,16 +1,14 @@
" Vim syntax file
" Language: Java
" Maintainer: Claudio Fleiner <claudio@fleiner.com>
-" URL: http://www.fleiner.com/vim/syntax/java.vim
-" Last Change: 2015 March 01
+" URL: https://github.com/fleiner/vim/blob/master/runtime/syntax/java.vim
+" Last Change: 2018 July 26
" Please check :help java.vim for comments on some of the options available.
-" Quit when a syntax file was already loaded
+" quit when a syntax file was already loaded
if !exists("main_syntax")
- if version < 600
- syntax clear
- elseif exists("b:current_syntax")
+ if exists("b:current_syntax")
finish
endif
" we define it here so that included files can test for it
@@ -21,13 +19,6 @@ endif
let s:cpo_save = &cpo
set cpo&vim
-" don't use standard HiLink, it will not work with included syntax files
-if version < 508
- command! -nargs=+ JavaHiLink hi link <args>
-else
- command! -nargs=+ JavaHiLink hi def link <args>
-endif
-
" some characters that cannot be in a java program (outside a string)
syn match javaError "[\\@`]"
syn match javaError "<<<\|\.\.\|=>\|||=\|&&=\|\*\/"
@@ -36,9 +27,7 @@ syn match javaOK "\.\.\."
" use separate name so that it can be deleted in javacc.vim
syn match javaError2 "#\|=<"
-JavaHiLink javaError2 javaError
-
-
+hi def link javaError2 javaError
" keyword definitions
syn keyword javaExternal native package
@@ -49,7 +38,7 @@ syn keyword javaRepeat while for do
syn keyword javaBoolean true false
syn keyword javaConstant null
syn keyword javaTypedef this super
-syn keyword javaOperator new instanceof
+syn keyword javaOperator var new instanceof
syn keyword javaType boolean char byte short int long float double
syn keyword javaType void
syn keyword javaStatement return
@@ -63,48 +52,56 @@ syn match javaTypedef "\.\s*\<class\>"ms=s+1
syn keyword javaClassDecl enum
syn match javaClassDecl "^class\>"
syn match javaClassDecl "[^.]\s*\<class\>"ms=s+1
-syn match javaAnnotation "@\([_$a-zA-Z][_$a-zA-Z0-9]*\.\)*[_$a-zA-Z][_$a-zA-Z0-9]*\>\(([^)]*)\)\=" contains=javaString
+syn match javaAnnotation "@\([_$a-zA-Z][_$a-zA-Z0-9]*\.\)*[_$a-zA-Z][_$a-zA-Z0-9]*\>" contains=javaString
syn match javaClassDecl "@interface\>"
syn keyword javaBranch break continue nextgroup=javaUserLabelRef skipwhite
syn match javaUserLabelRef "\k\+" contained
syn match javaVarArg "\.\.\."
syn keyword javaScopeDecl public protected private abstract
+" Java Modules(Since Java 9, for "module-info.java" file)
+if fnamemodify(bufname("%"), ":t") == "module-info.java"
+ syn keyword javaModuleStorageClass module transitive
+ syn keyword javaModuleStmt open requires exports opens uses provides
+ syn keyword javaModuleExternal to with
+ syn cluster javaTop add=javaModuleStorageClass,javaModuleStmt,javaModuleExternal
+endif
+
if exists("java_highlight_java_lang_ids")
let java_highlight_all=1
endif
-if exists("java_highlight_all") || exists("java_highlight_java") || exists("java_highlight_java_lang")
+if exists("java_highlight_all") || exists("java_highlight_java") || exists("java_highlight_java_lang")
" java.lang.*
syn match javaLangClass "\<System\>"
syn keyword javaR_JavaLang NegativeArraySizeException ArrayStoreException IllegalStateException RuntimeException IndexOutOfBoundsException UnsupportedOperationException ArrayIndexOutOfBoundsException ArithmeticException ClassCastException EnumConstantNotPresentException StringIndexOutOfBoundsException IllegalArgumentException IllegalMonitorStateException IllegalThreadStateException NumberFormatException NullPointerException TypeNotPresentException SecurityException
syn cluster javaTop add=javaR_JavaLang
syn cluster javaClasses add=javaR_JavaLang
- JavaHiLink javaR_JavaLang javaR_Java
+ hi def link javaR_JavaLang javaR_Java
syn keyword javaC_JavaLang Process RuntimePermission StringKeySet CharacterData01 Class ThreadLocal ThreadLocalMap CharacterData0E Package Character StringCoding Long ProcessImpl ProcessEnvironment Short AssertionStatusDirectives 1PackageInfoProxy UnicodeBlock InheritableThreadLocal AbstractStringBuilder StringEnvironment ClassLoader ConditionalSpecialCasing CharacterDataPrivateUse StringBuffer StringDecoder Entry StringEntry WrappedHook StringBuilder StrictMath State ThreadGroup Runtime CharacterData02 MethodArray Object CharacterDataUndefined Integer Gate Boolean Enum Variable Subset StringEncoder Void Terminator CharsetSD IntegerCache CharacterCache Byte CharsetSE Thread SystemClassLoaderAction CharacterDataLatin1 StringValues StackTraceElement Shutdown ShortCache String ConverterSD ByteCache Lock EnclosingMethodInfo Math Float Value Double SecurityManager LongCache ProcessBuilder StringEntrySet Compiler Number UNIXProcess ConverterSE ExternalData CaseInsensitiveComparator CharacterData00 NativeLibrary
syn cluster javaTop add=javaC_JavaLang
syn cluster javaClasses add=javaC_JavaLang
- JavaHiLink javaC_JavaLang javaC_Java
+ hi def link javaC_JavaLang javaC_Java
syn keyword javaE_JavaLang IncompatibleClassChangeError InternalError UnknownError ClassCircularityError AssertionError ThreadDeath IllegalAccessError NoClassDefFoundError ClassFormatError UnsupportedClassVersionError NoSuchFieldError VerifyError ExceptionInInitializerError InstantiationError LinkageError NoSuchMethodError Error UnsatisfiedLinkError StackOverflowError AbstractMethodError VirtualMachineError OutOfMemoryError
syn cluster javaTop add=javaE_JavaLang
syn cluster javaClasses add=javaE_JavaLang
- JavaHiLink javaE_JavaLang javaE_Java
+ hi def link javaE_JavaLang javaE_Java
syn keyword javaX_JavaLang CloneNotSupportedException Exception NoSuchMethodException IllegalAccessException NoSuchFieldException Throwable InterruptedException ClassNotFoundException InstantiationException
syn cluster javaTop add=javaX_JavaLang
syn cluster javaClasses add=javaX_JavaLang
- JavaHiLink javaX_JavaLang javaX_Java
+ hi def link javaX_JavaLang javaX_Java
- JavaHiLink javaR_Java javaR_
- JavaHiLink javaC_Java javaC_
- JavaHiLink javaE_Java javaE_
- JavaHiLink javaX_Java javaX_
- JavaHiLink javaX_ javaExceptions
- JavaHiLink javaR_ javaExceptions
- JavaHiLink javaE_ javaExceptions
- JavaHiLink javaC_ javaConstant
+ hi def link javaR_Java javaR_
+ hi def link javaC_Java javaC_
+ hi def link javaE_Java javaE_
+ hi def link javaX_Java javaX_
+ hi def link javaX_ javaExceptions
+ hi def link javaR_ javaExceptions
+ hi def link javaE_ javaExceptions
+ hi def link javaC_ javaConstant
syn keyword javaLangObject clone equals finalize getClass hashCode
syn keyword javaLangObject notify notifyAll toString wait
- JavaHiLink javaLangObject javaConstant
+ hi def link javaLangObject javaConstant
syn cluster javaTop add=javaLangObject
endif
@@ -147,9 +144,9 @@ syn region javaComment start="/\*" end="\*/" contains=@javaCommentSpecial,ja
syn match javaCommentStar contained "^\s*\*[^/]"me=e-1
syn match javaCommentStar contained "^\s*\*$"
syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,@Spell
-JavaHiLink javaCommentString javaString
-JavaHiLink javaComment2String javaString
-JavaHiLink javaCommentCharacter javaCharacter
+hi def link javaCommentString javaString
+hi def link javaComment2String javaString
+hi def link javaCommentCharacter javaCharacter
syn cluster javaTop add=javaComment,javaLineComment
@@ -242,28 +239,26 @@ if exists("java_highlight_debug")
syn cluster javaTop add=javaDebug
- if version >= 508 || !exists("did_c_syn_inits")
- JavaHiLink javaDebug Debug
- JavaHiLink javaDebugString DebugString
- JavaHiLink javaDebugStringError javaError
- JavaHiLink javaDebugType DebugType
- JavaHiLink javaDebugBoolean DebugBoolean
- JavaHiLink javaDebugNumber Debug
- JavaHiLink javaDebugSpecial DebugSpecial
- JavaHiLink javaDebugSpecialCharacter DebugSpecial
- JavaHiLink javaDebugCharacter DebugString
- JavaHiLink javaDebugParen Debug
-
- JavaHiLink DebugString String
- JavaHiLink DebugSpecial Special
- JavaHiLink DebugBoolean Boolean
- JavaHiLink DebugType Type
- endif
+ hi def link javaDebug Debug
+ hi def link javaDebugString DebugString
+ hi def link javaDebugStringError javaError
+ hi def link javaDebugType DebugType
+ hi def link javaDebugBoolean DebugBoolean
+ hi def link javaDebugNumber Debug
+ hi def link javaDebugSpecial DebugSpecial
+ hi def link javaDebugSpecialCharacter DebugSpecial
+ hi def link javaDebugCharacter DebugString
+ hi def link javaDebugParen Debug
+
+ hi def link DebugString String
+ hi def link DebugSpecial Special
+ hi def link DebugBoolean Boolean
+ hi def link DebugType Type
endif
if exists("java_mark_braces_in_parens_as_errors")
syn match javaInParen contained "[{}]"
- JavaHiLink javaInParen javaError
+ hi def link javaInParen javaError
syn cluster javaTop add=javaInParen
endif
@@ -278,7 +273,7 @@ syn region javaParenT1 transparent matchgroup=javaParen1 start="\[" end="\]" co
syn region javaParenT2 transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT contained
syn match javaParenError "\]"
-JavaHiLink javaParenError javaError
+hi def link javaParenError javaError
if exists("java_highlight_functions")
syn match javaLambdaDef "([a-zA-Z0-9_<>\[\], \t]*)\s*->"
@@ -291,62 +286,62 @@ endif
exec "syn sync ccomment javaComment minlines=" . java_minlines
" The default highlighting.
-if version >= 508 || !exists("did_java_syn_inits")
- if version < 508
- let did_java_syn_inits = 1
- endif
- JavaHiLink javaLambdaDef Function
- JavaHiLink javaFuncDef Function
- JavaHiLink javaVarArg Function
- JavaHiLink javaBraces Function
- JavaHiLink javaBranch Conditional
- JavaHiLink javaUserLabelRef javaUserLabel
- JavaHiLink javaLabel Label
- JavaHiLink javaUserLabel Label
- JavaHiLink javaConditional Conditional
- JavaHiLink javaRepeat Repeat
- JavaHiLink javaExceptions Exception
- JavaHiLink javaAssert Statement
- JavaHiLink javaStorageClass StorageClass
- JavaHiLink javaMethodDecl javaStorageClass
- JavaHiLink javaClassDecl javaStorageClass
- JavaHiLink javaScopeDecl javaStorageClass
- JavaHiLink javaBoolean Boolean
- JavaHiLink javaSpecial Special
- JavaHiLink javaSpecialError Error
- JavaHiLink javaSpecialCharError Error
- JavaHiLink javaString String
- JavaHiLink javaCharacter Character
- JavaHiLink javaSpecialChar SpecialChar
- JavaHiLink javaNumber Number
- JavaHiLink javaError Error
- JavaHiLink javaStringError Error
- JavaHiLink javaStatement Statement
- JavaHiLink javaOperator Operator
- JavaHiLink javaComment Comment
- JavaHiLink javaDocComment Comment
- JavaHiLink javaLineComment Comment
- JavaHiLink javaConstant Constant
- JavaHiLink javaTypedef Typedef
- JavaHiLink javaTodo Todo
- JavaHiLink javaAnnotation PreProc
-
- JavaHiLink javaCommentTitle SpecialComment
- JavaHiLink javaDocTags Special
- JavaHiLink javaDocParam Function
- JavaHiLink javaDocSeeTagParam Function
- JavaHiLink javaCommentStar javaComment
-
- JavaHiLink javaType Type
- JavaHiLink javaExternal Include
-
- JavaHiLink htmlComment Special
- JavaHiLink htmlCommentPart Special
- JavaHiLink javaSpaceError Error
+hi def link javaLambdaDef Function
+hi def link javaFuncDef Function
+hi def link javaVarArg Function
+hi def link javaBraces Function
+hi def link javaBranch Conditional
+hi def link javaUserLabelRef javaUserLabel
+hi def link javaLabel Label
+hi def link javaUserLabel Label
+hi def link javaConditional Conditional
+hi def link javaRepeat Repeat
+hi def link javaExceptions Exception
+hi def link javaAssert Statement
+hi def link javaStorageClass StorageClass
+hi def link javaMethodDecl javaStorageClass
+hi def link javaClassDecl javaStorageClass
+hi def link javaScopeDecl javaStorageClass
+
+hi def link javaBoolean Boolean
+hi def link javaSpecial Special
+hi def link javaSpecialError Error
+hi def link javaSpecialCharError Error
+hi def link javaString String
+hi def link javaCharacter Character
+hi def link javaSpecialChar SpecialChar
+hi def link javaNumber Number
+hi def link javaError Error
+hi def link javaStringError Error
+hi def link javaStatement Statement
+hi def link javaOperator Operator
+hi def link javaComment Comment
+hi def link javaDocComment Comment
+hi def link javaLineComment Comment
+hi def link javaConstant Constant
+hi def link javaTypedef Typedef
+hi def link javaTodo Todo
+hi def link javaAnnotation PreProc
+
+hi def link javaCommentTitle SpecialComment
+hi def link javaDocTags Special
+hi def link javaDocParam Function
+hi def link javaDocSeeTagParam Function
+hi def link javaCommentStar javaComment
+
+hi def link javaType Type
+hi def link javaExternal Include
+
+hi def link htmlComment Special
+hi def link htmlCommentPart Special
+hi def link javaSpaceError Error
+
+if fnamemodify(bufname("%"), ":t") == "module-info.java"
+ hi def link javaModuleStorageClass StorageClass
+ hi def link javaModuleStmt Statement
+ hi def link javaModuleExternal Include
endif
-delcommand JavaHiLink
-
let b:current_syntax = "java"
if main_syntax == 'java'
diff --git a/runtime/syntax/javacc.vim b/runtime/syntax/javacc.vim
index 5458de754e..a80572d510 100644
--- a/runtime/syntax/javacc.vim
+++ b/runtime/syntax/javacc.vim
@@ -7,11 +7,8 @@
" Uses java.vim, and adds a few special things for JavaCC Parser files.
" Those files usually have the extension *.jj
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -19,11 +16,7 @@ let s:cpo_save = &cpo
set cpo&vim
" source the java.vim file
-if version < 600
- source <sfile>:p:h/java.vim
-else
- runtime! syntax/java.vim
-endif
+runtime! syntax/java.vim
unlet b:current_syntax
"remove catching errors caused by wrong parenthesis (does not work in javacc
@@ -58,22 +51,12 @@ syn keyword javaccActionToken TOKEN SKIP MORE SPECIAL_TOKEN
syn keyword javaccError DEBUG IGNORE_IN_BNF
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_css_syn_inits")
- if version < 508
- let did_css_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink javaccSpecToken Statement
- HiLink javaccActionToken Type
- HiLink javaccPackages javaScopeDecl
- HiLink javaccToken String
- HiLink javaccError Error
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+hi def link javaccSpecToken Statement
+hi def link javaccActionToken Type
+hi def link javaccPackages javaScopeDecl
+hi def link javaccToken String
+hi def link javaccError Error
let b:current_syntax = "javacc"
let &cpo = s:cpo_save
diff --git a/runtime/syntax/javascript.vim b/runtime/syntax/javascript.vim
index 1b20f987d9..78714d0170 100644
--- a/runtime/syntax/javascript.vim
+++ b/runtime/syntax/javascript.vim
@@ -7,18 +7,16 @@
" (ss) repaired several quoting and grouping glitches
" (ss) fixed regex parsing issue with multiple qualifiers [gi]
" (ss) additional factoring of keywords, globals, and members
-" Last Change: 2012 Oct 05
+" Last Change: 2018 Jul 28
" 2013 Jun 12: adjusted javaScriptRegexpString (Kevin Locke)
+" 2018 Apr 14: adjusted javaScriptRegexpString (LongJohnCoder)
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
" tuning parameters:
" unlet javaScript_fold
if !exists("main_syntax")
- if version < 600
- syntax clear
- elseif exists("b:current_syntax")
+ " quit when a syntax file was already loaded
+ if exists("b:current_syntax")
finish
endif
let main_syntax = 'javascript'
@@ -29,11 +27,6 @@ endif
let s:cpo_save = &cpo
set cpo&vim
-" Drop fold if it set but vim doesn't support it.
-if version < 600 && exists("javaScript_fold")
- unlet javaScript_fold
-endif
-
syn keyword javaScriptCommentTodo TODO FIXME XXX TBD contained
syn match javaScriptLineComment "\/\/.*" contains=@Spell,javaScriptCommentTodo
@@ -42,10 +35,13 @@ syn region javaScriptComment start="/\*" end="\*/" contains=@Spell,java
syn match javaScriptSpecial "\\\d\d\d\|\\."
syn region javaScriptStringD start=+"+ skip=+\\\\\|\\"+ end=+"\|$+ contains=javaScriptSpecial,@htmlPreproc
syn region javaScriptStringS start=+'+ skip=+\\\\\|\\'+ end=+'\|$+ contains=javaScriptSpecial,@htmlPreproc
+syn region javaScriptStringT start=+`+ skip=+\\\\\|\\`+ end=+`+ contains=javaScriptSpecial,javaScriptEmbed,@htmlPreproc
+
+syn region javaScriptEmbed start=+${+ end=+}+ contains=@javaScriptEmbededExpr
syn match javaScriptSpecialCharacter "'\\.'"
syn match javaScriptNumber "-\=\<\d\+L\=\>\|0[xX][0-9a-fA-F]\+\>"
-syn region javaScriptRegexpString start=+/[^/*]+me=e-1 skip=+\\\\\|\\/+ end=+/[gim]\{0,2\}\s*$+ end=+/[gim]\{0,2\}\s*[;.,)\]}]+me=e-1 contains=@htmlPreproc oneline
+syn region javaScriptRegexpString start=+[,(=+]\s*/[^/*]+ms=e-1,me=e-1 skip=+\\\\\|\\/+ end=+/[gimuys]\{0,2\}\s*$+ end=+/[gimuys]\{0,2\}\s*[+;.,)\]}]+me=e-1 end=+/[gimuys]\{0,2\}\s\+\/+me=e-1 contains=@htmlPreproc,javaScriptComment oneline
syn keyword javaScriptConditional if else switch
syn keyword javaScriptRepeat while for do in
@@ -64,6 +60,8 @@ syn keyword javaScriptMember document event location
syn keyword javaScriptDeprecated escape unescape
syn keyword javaScriptReserved abstract boolean byte char class const debugger double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile
+syn cluster javaScriptEmbededExpr contains=javaScriptBoolean,javaScriptNull,javaScriptIdentifier,javaScriptStringD,javaScriptStringS,javaScriptStringT
+
if exists("javaScript_fold")
syn match javaScriptFunction "\<function\>"
syn region javaScriptFunctionFold start="\<function\>.*[^};]$" end="^\z1}.*$" transparent fold keepend
@@ -87,51 +85,44 @@ if main_syntax == "javascript"
endif
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_javascript_syn_inits")
- if version < 508
- let did_javascript_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink javaScriptComment Comment
- HiLink javaScriptLineComment Comment
- HiLink javaScriptCommentTodo Todo
- HiLink javaScriptSpecial Special
- HiLink javaScriptStringS String
- HiLink javaScriptStringD String
- HiLink javaScriptCharacter Character
- HiLink javaScriptSpecialCharacter javaScriptSpecial
- HiLink javaScriptNumber javaScriptValue
- HiLink javaScriptConditional Conditional
- HiLink javaScriptRepeat Repeat
- HiLink javaScriptBranch Conditional
- HiLink javaScriptOperator Operator
- HiLink javaScriptType Type
- HiLink javaScriptStatement Statement
- HiLink javaScriptFunction Function
- HiLink javaScriptBraces Function
- HiLink javaScriptError Error
- HiLink javaScrParenError javaScriptError
- HiLink javaScriptNull Keyword
- HiLink javaScriptBoolean Boolean
- HiLink javaScriptRegexpString String
-
- HiLink javaScriptIdentifier Identifier
- HiLink javaScriptLabel Label
- HiLink javaScriptException Exception
- HiLink javaScriptMessage Keyword
- HiLink javaScriptGlobal Keyword
- HiLink javaScriptMember Keyword
- HiLink javaScriptDeprecated Exception
- HiLink javaScriptReserved Keyword
- HiLink javaScriptDebug Debug
- HiLink javaScriptConstant Label
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+hi def link javaScriptComment Comment
+hi def link javaScriptLineComment Comment
+hi def link javaScriptCommentTodo Todo
+hi def link javaScriptSpecial Special
+hi def link javaScriptStringS String
+hi def link javaScriptStringD String
+hi def link javaScriptStringT String
+hi def link javaScriptCharacter Character
+hi def link javaScriptSpecialCharacter javaScriptSpecial
+hi def link javaScriptNumber javaScriptValue
+hi def link javaScriptConditional Conditional
+hi def link javaScriptRepeat Repeat
+hi def link javaScriptBranch Conditional
+hi def link javaScriptOperator Operator
+hi def link javaScriptType Type
+hi def link javaScriptStatement Statement
+hi def link javaScriptFunction Function
+hi def link javaScriptBraces Function
+hi def link javaScriptError Error
+hi def link javaScrParenError javaScriptError
+hi def link javaScriptNull Keyword
+hi def link javaScriptBoolean Boolean
+hi def link javaScriptRegexpString String
+
+hi def link javaScriptIdentifier Identifier
+hi def link javaScriptLabel Label
+hi def link javaScriptException Exception
+hi def link javaScriptMessage Keyword
+hi def link javaScriptGlobal Keyword
+hi def link javaScriptMember Keyword
+hi def link javaScriptDeprecated Exception
+hi def link javaScriptReserved Keyword
+hi def link javaScriptDebug Debug
+hi def link javaScriptConstant Label
+hi def link javaScriptEmbed Special
+
+
let b:current_syntax = "javascript"
if main_syntax == 'javascript'
diff --git a/runtime/syntax/jess.vim b/runtime/syntax/jess.vim
index 243bab351e..67d3715a30 100644
--- a/runtime/syntax/jess.vim
+++ b/runtime/syntax/jess.vim
@@ -4,19 +4,12 @@
" Last change: September 14, 2000
" Based on lisp.vim by : Dr. Charles E. Campbell, Jr.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
-if version < 600
- set iskeyword=42,43,45,47-58,60-62,64-90,97-122,_
-else
- setlocal iskeyword=42,43,45,47-58,60-62,64-90,97-122,_
-endif
+setlocal iskeyword=42,43,45,47-58,60-62,64-90,97-122,_
" Lists
syn match jessSymbol ![^()'`,"; \t]\+! contained
@@ -125,36 +118,26 @@ syn match jessComment ";.*$"
syn sync lines=100
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_jess_syntax_inits")
- if version < 508
- let did_jess_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink jessAtomNmbr jessNumber
- HiLink jessAtomMark jessMark
-
- HiLink jessAtom Identifier
- HiLink jessAtomBarSymbol Special
- HiLink jessBarSymbol Special
- HiLink jessComment Comment
- HiLink jessConcat Statement
- HiLink jessDeclaration Statement
- HiLink jessFunc Statement
- HiLink jessKey Type
- HiLink jessMark Delimiter
- HiLink jessNumber Number
- HiLink jessParenError Error
- HiLink jessSpecial Type
- HiLink jessString String
- HiLink jessVar Identifier
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link jessAtomNmbr jessNumber
+hi def link jessAtomMark jessMark
+
+hi def link jessAtom Identifier
+hi def link jessAtomBarSymbol Special
+hi def link jessBarSymbol Special
+hi def link jessComment Comment
+hi def link jessConcat Statement
+hi def link jessDeclaration Statement
+hi def link jessFunc Statement
+hi def link jessKey Type
+hi def link jessMark Delimiter
+hi def link jessNumber Number
+hi def link jessParenError Error
+hi def link jessSpecial Type
+hi def link jessString String
+hi def link jessVar Identifier
+
let b:current_syntax = "jess"
diff --git a/runtime/syntax/jgraph.vim b/runtime/syntax/jgraph.vim
index 7ecd5afaec..a29a21a73b 100644
--- a/runtime/syntax/jgraph.vim
+++ b/runtime/syntax/jgraph.vim
@@ -5,11 +5,8 @@
" this syntax file is not yet complete
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -36,23 +33,13 @@ syn match jgraphNumber "\-\=\.\d\+\>"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_jgraph_syn_inits")
- if version < 508
- let did_jgraph_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink jgraphComment Comment
- HiLink jgraphCmd Identifier
- HiLink jgraphType Type
- HiLink jgraphNumber Number
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link jgraphComment Comment
+hi def link jgraphCmd Identifier
+hi def link jgraphType Type
+hi def link jgraphNumber Number
+
let b:current_syntax = "jgraph"
diff --git a/runtime/syntax/jproperties.vim b/runtime/syntax/jproperties.vim
index 9343bd292b..628c03097f 100644
--- a/runtime/syntax/jproperties.vim
+++ b/runtime/syntax/jproperties.vim
@@ -43,11 +43,8 @@ endif
" =============================================================================
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -120,28 +117,18 @@ syn match jpropertiesComment "^\s*[#!].*$" contains=jpropertiesTODO
syn keyword jpropertiesTodo TODO FIXME XXX contained
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_jproperties_syntax_inits")
- if version < 508
- let did_jproperties_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink jpropertiesComment Comment
- HiLink jpropertiesTodo Todo
- HiLink jpropertiesIdentifier Identifier
- HiLink jpropertiesString String
- HiLink jpropertiesExtendString String
- HiLink jpropertiesCharacter Character
- HiLink jpropertiesSpecial Special
- HiLink jpropertiesSpecialChar SpecialChar
- HiLink jpropertiesError Error
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link jpropertiesComment Comment
+hi def link jpropertiesTodo Todo
+hi def link jpropertiesIdentifier Identifier
+hi def link jpropertiesString String
+hi def link jpropertiesExtendString String
+hi def link jpropertiesCharacter Character
+hi def link jpropertiesSpecial Special
+hi def link jpropertiesSpecialChar SpecialChar
+hi def link jpropertiesError Error
+
let b:current_syntax = "jproperties"
diff --git a/runtime/syntax/json.vim b/runtime/syntax/json.vim
index 1fdfea2d09..d80af84312 100644
--- a/runtime/syntax/json.vim
+++ b/runtime/syntax/json.vim
@@ -5,9 +5,8 @@
" Version: 0.12
if !exists("main_syntax")
- if version < 600
- syntax clear
- elseif exists("b:current_syntax")
+ " quit when a syntax file was already loaded
+ if exists("b:current_syntax")
finish
endif
let main_syntax = 'json'
@@ -93,39 +92,29 @@ syn region jsonFold matchgroup=jsonBraces start="{" end=/}\(\_s\+\ze\("\|{\)\)\
syn region jsonFold matchgroup=jsonBraces start="\[" end=/]\(\_s\+\ze"\)\@!/ transparent fold
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_json_syn_inits")
- if version < 508
- let did_json_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink jsonPadding Operator
- HiLink jsonString String
- HiLink jsonTest Label
- HiLink jsonEscape Special
- HiLink jsonNumber Number
- HiLink jsonBraces Delimiter
- HiLink jsonNull Function
- HiLink jsonBoolean Boolean
- HiLink jsonKeyword Label
-
- if (!exists("g:vim_json_warnings") || g:vim_json_warnings==1)
- HiLink jsonNumError Error
- HiLink jsonCommentError Error
- HiLink jsonSemicolonError Error
- HiLink jsonTrailingCommaError Error
- HiLink jsonMissingCommaError Error
- HiLink jsonStringSQError Error
- HiLink jsonNoQuotesError Error
- HiLink jsonTripleQuotesError Error
- endif
- HiLink jsonQuote Quote
- HiLink jsonNoise Noise
- delcommand HiLink
+" Only when an item doesn't have highlighting yet
+hi def link jsonPadding Operator
+hi def link jsonString String
+hi def link jsonTest Label
+hi def link jsonEscape Special
+hi def link jsonNumber Number
+hi def link jsonBraces Delimiter
+hi def link jsonNull Function
+hi def link jsonBoolean Boolean
+hi def link jsonKeyword Label
+
+if (!exists("g:vim_json_warnings") || g:vim_json_warnings==1)
+hi def link jsonNumError Error
+hi def link jsonCommentError Error
+hi def link jsonSemicolonError Error
+hi def link jsonTrailingCommaError Error
+hi def link jsonMissingCommaError Error
+hi def link jsonStringSQError Error
+hi def link jsonNoQuotesError Error
+hi def link jsonTripleQuotesError Error
endif
+hi def link jsonQuote Quote
+hi def link jsonNoise Noise
let b:current_syntax = "json"
if main_syntax == 'json'
diff --git a/runtime/syntax/jsp.vim b/runtime/syntax/jsp.vim
index 9766657596..1c3cc35a31 100644
--- a/runtime/syntax/jsp.vim
+++ b/runtime/syntax/jsp.vim
@@ -6,11 +6,8 @@
" Credits : Patch by Darren Greaves (recognizes <jsp:...> tags)
" Patch by Thomas Kimpton (recognizes jspExpr inside HTML tags)
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -19,11 +16,7 @@ if !exists("main_syntax")
endif
" Source HTML syntax
-if version < 600
- source <sfile>:p:h/html.vim
-else
- runtime! syntax/html.vim
-endif
+runtime! syntax/html.vim
unlet b:current_syntax
" Next syntax items are case-sensitive
@@ -52,29 +45,19 @@ syn clear htmlTag
syn region htmlTag start=+<[^/%]+ end=+>+ contains=htmlTagN,htmlString,htmlArg,htmlValue,htmlTagError,htmlEvent,htmlCssDefinition,@htmlPreproc,@htmlArgCluster,jspExpr,javaScript
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_jsp_syn_inits")
- if version < 508
- let did_jsp_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- " java.vim has redefined htmlComment highlighting
- HiLink htmlComment Comment
- HiLink htmlCommentPart Comment
- " Be consistent with html highlight settings
- HiLink jspComment htmlComment
- HiLink jspTag htmlTag
- HiLink jspDirective jspTag
- HiLink jspDirName htmlTagName
- HiLink jspDirArg htmlArg
- HiLink jspCommand jspTag
- HiLink jspCommandName htmlTagName
- HiLink jspCommandArg htmlArg
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+" java.vim has redefined htmlComment highlighting
+hi def link htmlComment Comment
+hi def link htmlCommentPart Comment
+" Be consistent with html highlight settings
+hi def link jspComment htmlComment
+hi def link jspTag htmlTag
+hi def link jspDirective jspTag
+hi def link jspDirName htmlTagName
+hi def link jspDirArg htmlArg
+hi def link jspCommand jspTag
+hi def link jspCommandName htmlTagName
+hi def link jspCommandArg htmlArg
if main_syntax == 'jsp'
unlet main_syntax
diff --git a/runtime/syntax/kix.vim b/runtime/syntax/kix.vim
index 800e286042..8efe02baee 100644
--- a/runtime/syntax/kix.vim
+++ b/runtime/syntax/kix.vim
@@ -19,10 +19,8 @@
" Work out how to error too many "(", i.e. (() should be an error.
" Similarly, "if" without "endif" and similar constructs should error.
-" Clear legacy syntax rules for version 5.x, exit if already processed for version 6+
-if version < 600
- syn clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -130,52 +128,42 @@ syn match kixExpression "<\|>\|<=\|>=\|<>"
" Default highlighting.
-" Version < 5.8 set default highlight if file not already processed.
-" Version >= 5.8 set default highlight only if it doesn't already have a value.
-if version > 508 || !exists("did_kix_syn_inits")
- if version < 508
- let did_kix_syn_inits=1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink kixDoubleString String
- HiLink kixSingleString String
- HiLink kixStatement Statement
- HiLink kixRepeat Repeat
- HiLink kixComment Comment
- HiLink kixBuiltin Function
- HiLink kixLocalVar Special
- HiLink kixMacro Special
- HiLink kixEnvVar Special
- HiLink kixLabel Type
- HiLink kixFunction Function
- HiLink kixInteger Number
- HiLink kixHex Number
- HiLink kixFloat Number
- HiLink kixOperator Operator
- HiLink kixExpression Operator
-
- HiLink kixParenCloseError Error
- HiLink kixBrackCloseError Error
- HiLink kixStringError Error
-
- HiLink kixWhileError Error
- HiLink kixWhileOK Conditional
- HiLink kixDoError Error
- HiLink kixDoOK Conditional
- HiLink kixIfError Error
- HiLink kixIfOK Conditional
- HiLink kixSelectError Error
- HiLink kixSelectOK Conditional
- HiLink kixForNextError Error
- HiLink kixForNextOK Conditional
- HiLink kixForEachError Error
- HiLink kixForEachOK Conditional
-
- delcommand HiLink
-endif
+" Set default highlight only if it doesn't already have a value.
+
+hi def link kixDoubleString String
+hi def link kixSingleString String
+hi def link kixStatement Statement
+hi def link kixRepeat Repeat
+hi def link kixComment Comment
+hi def link kixBuiltin Function
+hi def link kixLocalVar Special
+hi def link kixMacro Special
+hi def link kixEnvVar Special
+hi def link kixLabel Type
+hi def link kixFunction Function
+hi def link kixInteger Number
+hi def link kixHex Number
+hi def link kixFloat Number
+hi def link kixOperator Operator
+hi def link kixExpression Operator
+
+hi def link kixParenCloseError Error
+hi def link kixBrackCloseError Error
+hi def link kixStringError Error
+
+hi def link kixWhileError Error
+hi def link kixWhileOK Conditional
+hi def link kixDoError Error
+hi def link kixDoOK Conditional
+hi def link kixIfError Error
+hi def link kixIfOK Conditional
+hi def link kixSelectError Error
+hi def link kixSelectOK Conditional
+hi def link kixForNextError Error
+hi def link kixForNextOK Conditional
+hi def link kixForEachError Error
+hi def link kixForEachOK Conditional
+
let b:current_syntax = "kix"
diff --git a/runtime/syntax/kscript.vim b/runtime/syntax/kscript.vim
index cefbe39a29..e6776208d4 100644
--- a/runtime/syntax/kscript.vim
+++ b/runtime/syntax/kscript.vim
@@ -4,11 +4,8 @@
" URL: http://aquila.rezel.enst.fr/thomas/vim/kscript.vim
" CVS: $Id: kscript.vim,v 1.1 2004/06/13 17:40:02 vimboss Exp $
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -37,33 +34,23 @@ syn region kscriptString start=+"""+ end=+"""+
syn region kscriptString start=+'''+ end=+'''+
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_kscript_syntax_inits")
- if version < 508
- let did_kscript_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
+
+hi def link kscriptConditional Conditional
+hi def link kscriptRepeat Repeat
+hi def link kscriptExceptions Statement
+hi def link kscriptFunction Function
+hi def link kscriptConst Constant
+hi def link kscriptStatement Statement
+hi def link kscriptLabel Label
+hi def link kscriptStorageClass StorageClass
+hi def link kscriptType Type
+hi def link kscriptTodo Todo
+hi def link kscriptComment Comment
+hi def link kscriptString String
+hi def link kscriptPreCondit PreCondit
+hi def link kscriptHardCoded Statement
- HiLink kscriptConditional Conditional
- HiLink kscriptRepeat Repeat
- HiLink kscriptExceptions Statement
- HiLink kscriptFunction Function
- HiLink kscriptConst Constant
- HiLink kscriptStatement Statement
- HiLink kscriptLabel Label
- HiLink kscriptStorageClass StorageClass
- HiLink kscriptType Type
- HiLink kscriptTodo Todo
- HiLink kscriptComment Comment
- HiLink kscriptString String
- HiLink kscriptPreCondit PreCondit
- HiLink kscriptHardCoded Statement
-
- delcommand HiLink
-endif
let b:current_syntax = "kscript"
diff --git a/runtime/syntax/kwt.vim b/runtime/syntax/kwt.vim
index 4c2c9d9dc0..ecda5bb985 100644
--- a/runtime/syntax/kwt.vim
+++ b/runtime/syntax/kwt.vim
@@ -3,21 +3,14 @@
" Maintainer: Michael Piefel <entwurf@piefel.de>
" Last Change: 2 May 2001
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" Read the C++ syntax to start with
-if version < 600
- source <sfile>:p:h/cpp.vim
-else
- runtime! syntax/cpp.vim
- unlet b:current_syntax
-endif
+runtime! syntax/cpp.vim
+unlet b:current_syntax
" kimwitu++ extentions
@@ -58,27 +51,17 @@ syn region kwtUnpBody transparent keepend extend fold start="->\s*\[" start="^\
syn region kwtRewBody transparent keepend extend fold start="->\s*<" start="^\s*<" end="\s>\s\=;\=$" end="^>\s\=;\=$"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_kwt_syn_inits")
- if version < 508
- let did_kwt_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink kwtStatement cppStatement
- HiLink kwtDecl cppStatement
- HiLink kwtCast cppStatement
- HiLink kwtSep Delimiter
- HiLink kwtViews Label
- HiLink kwtPhylum Type
- HiLink kwtOption PreProc
- "HiLink cText Comment
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link kwtStatement cppStatement
+hi def link kwtDecl cppStatement
+hi def link kwtCast cppStatement
+hi def link kwtSep Delimiter
+hi def link kwtViews Label
+hi def link kwtPhylum Type
+hi def link kwtOption PreProc
+"hi def link cText Comment
+
syn sync lines=300
diff --git a/runtime/syntax/lace.vim b/runtime/syntax/lace.vim
index 9e64eea7d1..9a83851f2b 100644
--- a/runtime/syntax/lace.vim
+++ b/runtime/syntax/lace.vim
@@ -9,11 +9,8 @@
" it to the maintainer at <utilities@eiffel.com>
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -85,50 +82,40 @@ syn region laceParen transparent start="(" end=")" contains=ALLBUT,laceParenErr
syn sync lines=40
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_lace_syntax_inits")
- if version < 508
- let did_lace_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink laceTopStruct PreProc
-
- HiLink laceOptionClause Statement
- HiLink laceOptionMark Constant
- HiLink laceClusterProp Label
- HiLink laceAdaptClassName Label
- HiLink laceExternal Statement
- HiLink laceCluster ModeMsg
-
- HiLink laceEscape Special
-
- HiLink laceBool Boolean
- HiLink laceString String
- HiLink laceCharacter Character
- HiLink laceClassName Type
- HiLink laceNumber Number
-
- HiLink laceOperator Special
- HiLink laceArray Special
- HiLink laceExport Special
- HiLink laceCreation Special
- HiLink laceBrackets Special
- HiLink laceConstraint Special
-
- HiLink laceComment Comment
-
- HiLink laceError Error
- HiLink laceStringError Error
- HiLink laceParenError Error
- HiLink laceBracketError Error
- HiLink laceTodo Todo
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link laceTopStruct PreProc
+
+hi def link laceOptionClause Statement
+hi def link laceOptionMark Constant
+hi def link laceClusterProp Label
+hi def link laceAdaptClassName Label
+hi def link laceExternal Statement
+hi def link laceCluster ModeMsg
+
+hi def link laceEscape Special
+
+hi def link laceBool Boolean
+hi def link laceString String
+hi def link laceCharacter Character
+hi def link laceClassName Type
+hi def link laceNumber Number
+
+hi def link laceOperator Special
+hi def link laceArray Special
+hi def link laceExport Special
+hi def link laceCreation Special
+hi def link laceBrackets Special
+hi def link laceConstraint Special
+
+hi def link laceComment Comment
+
+hi def link laceError Error
+hi def link laceStringError Error
+hi def link laceParenError Error
+hi def link laceBracketError Error
+hi def link laceTodo Todo
+
let b:current_syntax = "lace"
diff --git a/runtime/syntax/latte.vim b/runtime/syntax/latte.vim
index e2a8729f3f..e30ae42e38 100644
--- a/runtime/syntax/latte.vim
+++ b/runtime/syntax/latte.vim
@@ -7,11 +7,8 @@
" I based this on the TeX and Scheme syntax files (but mostly scheme).
" See http://www.latte.org for info on the language.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -20,11 +17,7 @@ syn match latteOther "\\{"
syn match latteOther "\\}"
syn match latteOther "\\\\"
-if version < 600
- set iskeyword=33,43,45,48-57,63,65-90,95,97-122,_
-else
- setlocal iskeyword=33,43,45,48-57,63,65-90,95,97-122,_
-endif
+setlocal iskeyword=33,43,45,48-57,63,65-90,95,97-122,_
syn region latteVar matchgroup=SpecialChar start=!\\[A-Za-z_]!rs=s+1 end=![^A-Za-z0-9?!+_-]!me=e-1 contains=ALLBUT,latteNumber,latteOther
syn region latteVar matchgroup=SpecialChar start=!\\[=\&][A-Za-z_]!rs=s+2 end=![^A-Za-z0-9?!+_-]!me=e-1 contains=ALLBUT,latteNumber,latteOther
@@ -70,29 +63,19 @@ syn sync match matchPlace grouphere NONE "^[^ \t]"
" ... i.e. synchronize on a line that starts at the left margin
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_latte_syntax_inits")
- if version < 508
- let did_latte_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink latteSyntax Statement
- HiLink latteVar Function
+hi def link latteSyntax Statement
+hi def link latteVar Function
- HiLink latteString String
- HiLink latteQuote String
+hi def link latteString String
+hi def link latteQuote String
- HiLink latteDelimiter Delimiter
- HiLink latteOperator Operator
+hi def link latteDelimiter Delimiter
+hi def link latteOperator Operator
- HiLink latteComment Comment
- HiLink latteError Error
+hi def link latteComment Comment
+hi def link latteError Error
- delcommand HiLink
-endif
let b:current_syntax = "latte"
diff --git a/runtime/syntax/ld.vim b/runtime/syntax/ld.vim
index fc12919c50..22949d9759 100644
--- a/runtime/syntax/ld.vim
+++ b/runtime/syntax/ld.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: ld(1) script
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: ld(1) script
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/ldapconf.vim b/runtime/syntax/ldapconf.vim
index 70ddaab57a..662ea203be 100644
--- a/runtime/syntax/ldapconf.vim
+++ b/runtime/syntax/ldapconf.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: ldap.conf(5) configuration file.
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-12-11
+" Language: ldap.conf(5) configuration file.
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-11
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/ldif.vim b/runtime/syntax/ldif.vim
index 9f67b57f51..576e4c023d 100644
--- a/runtime/syntax/ldif.vim
+++ b/runtime/syntax/ldif.vim
@@ -3,9 +3,8 @@
" Maintainer: Zak Johnson <zakj@nox.cx>
" Last Change: 2003-12-30
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -21,23 +20,14 @@ syn region ldifFileValue matchgroup=ldifPunctuation start=/:< / end=/\_$/ skip
syn region ldifComment start=/^#/ end=/\_$/ skip=/\n /
-if version >= 508 || !exists("did_ldif_syn_inits")
- if version < 508
- let did_ldif_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink ldifAttribute Type
- HiLink ldifOption Identifier
- HiLink ldifPunctuation Normal
- HiLink ldifStringValue String
- HiLink ldifBase64Value Special
- HiLink ldifFileValue Special
- HiLink ldifComment Comment
-
- delcommand HiLink
-endif
+
+hi def link ldifAttribute Type
+hi def link ldifOption Identifier
+hi def link ldifPunctuation Normal
+hi def link ldifStringValue String
+hi def link ldifBase64Value Special
+hi def link ldifFileValue Special
+hi def link ldifComment Comment
+
let b:current_syntax = "ldif"
diff --git a/runtime/syntax/lex.vim b/runtime/syntax/lex.vim
index b7aff34d6b..560aa44be3 100644
--- a/runtime/syntax/lex.vim
+++ b/runtime/syntax/lex.vim
@@ -1,18 +1,15 @@
" Vim syntax file
" Language: Lex
" Maintainer: Charles E. Campbell <NdrOchipS@PcampbellAfamily.Mbiz>
-" Last Change: Nov 14, 2012
-" Version: 14
-" URL: http://mysite.verizon.net/astronaut/vim/index.html#vimlinks_syntax
+" Last Change: Aug 31, 2016
+" Version: 16
+" URL: http://mysite.verizon.net/astronaut/vim/index.html#SYNTAX_LEX
"
" Option:
" lex_uses_cpp : if this variable exists, then C++ is loaded rather than C
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -122,22 +119,24 @@ syn sync match lexSyncPat groupthere lexPatBlock "^<$"
syn sync match lexSyncPat groupthere lexPatBlock "^%%$"
" The default highlighting.
-hi def link lexAbbrvComment lexPatComment
-hi def link lexAbbrvRegExp Macro
-hi def link lexAbbrv SpecialChar
-hi def link lexBrace lexPat
-hi def link lexCFunctions Function
-hi def link lexCstruct cStructure
-hi def link lexMorePat SpecialChar
-hi def link lexOptions PreProc
-hi def link lexPatComment Comment
-hi def link lexPat Function
-hi def link lexPatString Function
-hi def link lexPatTag Special
-hi def link lexPatTagZone lexPatTag
-hi def link lexSep Delimiter
-hi def link lexSlashQuote lexPat
-hi def link lexStartState Statement
+if !exists("skip_lex_syntax_inits")
+ hi def link lexAbbrvComment lexPatComment
+ hi def link lexAbbrvRegExp Macro
+ hi def link lexAbbrv SpecialChar
+ hi def link lexBrace lexPat
+ hi def link lexCFunctions Function
+ hi def link lexCstruct cStructure
+ hi def link lexMorePat SpecialChar
+ hi def link lexOptions PreProc
+ hi def link lexPatComment Comment
+ hi def link lexPat Function
+ hi def link lexPatString Function
+ hi def link lexPatTag Special
+ hi def link lexPatTagZone lexPatTag
+ hi def link lexSep Delimiter
+ hi def link lexSlashQuote lexPat
+ hi def link lexStartState Statement
+endif
let b:current_syntax = "lex"
diff --git a/runtime/syntax/lftp.vim b/runtime/syntax/lftp.vim
index 6a8e4f9e19..20ddee5bcb 100644
--- a/runtime/syntax/lftp.vim
+++ b/runtime/syntax/lftp.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: lftp(1) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2007-06-17
+" Language: lftp(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-06-17
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/lhaskell.vim b/runtime/syntax/lhaskell.vim
index 077549a0c8..0a8a076ff4 100644
--- a/runtime/syntax/lhaskell.vim
+++ b/runtime/syntax/lhaskell.vim
@@ -36,11 +36,8 @@
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -84,15 +81,10 @@ endif
" If user wants us to highlight TeX syntax or guess thinks it's TeX, read it.
if b:lhs_markup == "tex"
- if version < 600
- source <sfile>:p:h/tex.vim
- set isk+=_
- else
- runtime! syntax/tex.vim
- unlet b:current_syntax
- " Tex.vim removes "_" from 'iskeyword', but we need it for Haskell.
- setlocal isk+=_
- endif
+ runtime! syntax/tex.vim
+ unlet b:current_syntax
+ " Tex.vim removes "_" from 'iskeyword', but we need it for Haskell.
+ setlocal isk+=_
syntax cluster lhsTeXContainer contains=tex.*Zone,texAbstract
else
syntax cluster lhsTeXContainer contains=.*
@@ -100,11 +92,7 @@ endif
" Literate Haskell is Haskell in between text, so at least read Haskell
" highlighting
-if version < 600
- syntax include @haskellTop <sfile>:p:h/haskell.vim
-else
- syntax include @haskellTop syntax/haskell.vim
-endif
+syntax include @haskellTop syntax/haskell.vim
syntax region lhsHaskellBirdTrack start="^>" end="\%(^[^>]\)\@=" contains=@haskellTop,lhsBirdTrack containedin=@lhsTeXContainer
syntax region lhsHaskellBeginEndBlock start="^\\begin{code}\s*$" matchgroup=NONE end="\%(^\\end{code}.*$\)\@=" contains=@haskellTop,beginCodeBegin containedin=@lhsTeXContainer
@@ -115,23 +103,13 @@ syntax match beginCodeBegin "^\\begin" nextgroup=beginCodeCode contained
syntax region beginCodeCode matchgroup=texDelimiter start="{" end="}"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_tex_syntax_inits")
- if version < 508
- let did_tex_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink lhsBirdTrack Comment
-
- HiLink beginCodeBegin texCmdName
- HiLink beginCodeCode texSection
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link lhsBirdTrack Comment
+
+hi def link beginCodeBegin texCmdName
+hi def link beginCodeCode texSection
+
" Restore cursor to original position, as it may have been disturbed
" by the searches in our guessing code
diff --git a/runtime/syntax/libao.vim b/runtime/syntax/libao.vim
index 25b6e8284e..1a3bd90cc5 100644
--- a/runtime/syntax/libao.vim
+++ b/runtime/syntax/libao.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: libao.conf(5) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: libao.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/lifelines.vim b/runtime/syntax/lifelines.vim
index f8bea015bd..ff4692888e 100644
--- a/runtime/syntax/lifelines.vim
+++ b/runtime/syntax/lifelines.vim
@@ -11,9 +11,8 @@
" For version 5.x: Clear all syntax items
" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -110,9 +109,7 @@ syn match lifelinesNumber "-\=\<\d\+\.\d*\>"
syn match lifelinesNumber "-\=\.\d\+\>"
" folding using {}
-if version >= 600
- syn region lifelinesFoldBlock start="{" end="}" transparent fold
-endif
+syn region lifelinesFoldBlock start="{" end="}" transparent fold
"catch errors caused by wrong parenthesis
"adapted from original c.vim written by Bram Moolenaar
@@ -123,44 +120,34 @@ syn match lifelinesParenError ")"
syn match lifelinesErrInParen contained "[{}]"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-
-if version >= 508 || !exists("did_lifelines_syn_inits")
- if version < 508
- let did_lifelines_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink lifelinesConditional Conditional
- HiLink lifelinesArithm Operator
- HiLink lifelinesLogical Conditional
- HiLink lifelinesInclude Include
- HiLink lifelinesComment Comment
- HiLink lifelinesStatement Statement
- HiLink lifelinesUser Statement
- HiLink lifelinesFunct Statement
- HiLink lifelinesTable Statement
- HiLink lifelinesGedcom Statement
- HiLink lifelinesList Statement
- HiLink lifelinesRepeat Repeat
- HiLink lifelinesFam Statement
- HiLink lifelinesIndi Statement
- HiLink lifelinesProc Statement
- HiLink lifelinesDef Statement
- HiLink lifelinesString String
- HiLink lifelinesSpecial Special
- HiLink lifelinesNumber Number
- HiLink lifelinesParenError Error
- HiLink lifelinesErrInParen Error
- HiLink lifelinesError Error
- HiLink lifelinesTodo Todo
- HiLink lifelinesDecl PreProc
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+
+hi def link lifelinesConditional Conditional
+hi def link lifelinesArithm Operator
+hi def link lifelinesLogical Conditional
+hi def link lifelinesInclude Include
+hi def link lifelinesComment Comment
+hi def link lifelinesStatement Statement
+hi def link lifelinesUser Statement
+hi def link lifelinesFunct Statement
+hi def link lifelinesTable Statement
+hi def link lifelinesGedcom Statement
+hi def link lifelinesList Statement
+hi def link lifelinesRepeat Repeat
+hi def link lifelinesFam Statement
+hi def link lifelinesIndi Statement
+hi def link lifelinesProc Statement
+hi def link lifelinesDef Statement
+hi def link lifelinesString String
+hi def link lifelinesSpecial Special
+hi def link lifelinesNumber Number
+hi def link lifelinesParenError Error
+hi def link lifelinesErrInParen Error
+hi def link lifelinesError Error
+hi def link lifelinesTodo Todo
+hi def link lifelinesDecl PreProc
+
let b:current_syntax = "lifelines"
diff --git a/runtime/syntax/lilo.vim b/runtime/syntax/lilo.vim
index 3e9459267b..a87dafb734 100644
--- a/runtime/syntax/lilo.vim
+++ b/runtime/syntax/lilo.vim
@@ -5,21 +5,12 @@
" Last Change: 2010-02-03
" Setup
-if version >= 600
- if exists("b:current_syntax")
- finish
- endif
-else
- syntax clear
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
endif
-if version >= 600
- command -nargs=1 SetIsk setlocal iskeyword=<args>
-else
- command -nargs=1 SetIsk set iskeyword=<args>
-endif
-SetIsk @,48-57,.,-,_
-delcommand SetIsk
+setlocal iskeyword=@,48-57,.,-,_
syn case ignore
@@ -128,65 +119,56 @@ syn match liloDecNumberPListComment "#.*$" contained nextgroup=liloDecNumberPLis
syn match liloAnythingComment "#.*$" contained nextgroup=liloAnything,liloAnythingComment,liloError skipwhite skipempty
" Define the default highlighting
-if version >= 508 || !exists("did_lilo_syntax_inits")
- if version < 508
- let did_lilo_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink liloEqPath liloEquals
- HiLink liloEqWord liloEquals
- HiLink liloEqVga liloEquals
- HiLink liloEqDecNumber liloEquals
- HiLink liloEqHexNumber liloEquals
- HiLink liloEqNumber liloEquals
- HiLink liloEqString liloEquals
- HiLink liloEqAnything liloEquals
- HiLink liloEquals Special
-
- HiLink liloError Error
-
- HiLink liloEqPathComment liloComment
- HiLink liloEqVgaComment liloComment
- HiLink liloEqDecNumberComment liloComment
- HiLink liloEqHexNumberComment liloComment
- HiLink liloEqStringComment liloComment
- HiLink liloEqAnythingComment liloComment
- HiLink liloPathComment liloComment
- HiLink liloVgaComment liloComment
- HiLink liloDecNumberComment liloComment
- HiLink liloHexNumberComment liloComment
- HiLink liloNumberComment liloComment
- HiLink liloStringComment liloComment
- HiLink liloAnythingComment liloComment
- HiLink liloComment Comment
-
- HiLink liloDiskOpt liloOption
- HiLink liloKernelOpt liloOption
- HiLink liloImageOpt liloOption
- HiLink liloOption Keyword
-
- HiLink liloDecNumber liloNumber
- HiLink liloHexNumber liloNumber
- HiLink liloDecNumberP liloNumber
- HiLink liloNumber Number
- HiLink liloString String
- HiLink liloPath Constant
-
- HiLink liloSpecial Special
- HiLink liloLabel Title
- HiLink liloDecNumberList Special
- HiLink liloDecNumberPList Special
- HiLink liloAnything Normal
- HiLink liloEnviron Identifier
- HiLink liloVgaKeyword Identifier
- HiLink liloImage Type
- HiLink liloChRules Preproc
- HiLink liloDisk Preproc
-
- delcommand HiLink
-endif
+
+hi def link liloEqPath liloEquals
+hi def link liloEqWord liloEquals
+hi def link liloEqVga liloEquals
+hi def link liloEqDecNumber liloEquals
+hi def link liloEqHexNumber liloEquals
+hi def link liloEqNumber liloEquals
+hi def link liloEqString liloEquals
+hi def link liloEqAnything liloEquals
+hi def link liloEquals Special
+
+hi def link liloError Error
+
+hi def link liloEqPathComment liloComment
+hi def link liloEqVgaComment liloComment
+hi def link liloEqDecNumberComment liloComment
+hi def link liloEqHexNumberComment liloComment
+hi def link liloEqStringComment liloComment
+hi def link liloEqAnythingComment liloComment
+hi def link liloPathComment liloComment
+hi def link liloVgaComment liloComment
+hi def link liloDecNumberComment liloComment
+hi def link liloHexNumberComment liloComment
+hi def link liloNumberComment liloComment
+hi def link liloStringComment liloComment
+hi def link liloAnythingComment liloComment
+hi def link liloComment Comment
+
+hi def link liloDiskOpt liloOption
+hi def link liloKernelOpt liloOption
+hi def link liloImageOpt liloOption
+hi def link liloOption Keyword
+
+hi def link liloDecNumber liloNumber
+hi def link liloHexNumber liloNumber
+hi def link liloDecNumberP liloNumber
+hi def link liloNumber Number
+hi def link liloString String
+hi def link liloPath Constant
+
+hi def link liloSpecial Special
+hi def link liloLabel Title
+hi def link liloDecNumberList Special
+hi def link liloDecNumberPList Special
+hi def link liloAnything Normal
+hi def link liloEnviron Identifier
+hi def link liloVgaKeyword Identifier
+hi def link liloImage Type
+hi def link liloChRules Preproc
+hi def link liloDisk Preproc
+
let b:current_syntax = "lilo"
diff --git a/runtime/syntax/limits.vim b/runtime/syntax/limits.vim
index a6d245ae11..96bd423869 100644
--- a/runtime/syntax/limits.vim
+++ b/runtime/syntax/limits.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: limits(5) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: limits(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/lisp.vim b/runtime/syntax/lisp.vim
index f496398d50..b6aa04b2c7 100644
--- a/runtime/syntax/lisp.vim
+++ b/runtime/syntax/lisp.vim
@@ -1,9 +1,9 @@
" Vim syntax file
" Language: Lisp
" Maintainer: Charles E. Campbell <NdrOchipS@PcampbellAfamily.Mbiz>
-" Last Change: Jan 20, 2016
-" Version: 24
-" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_LISP
+" Last Change: Feb 15, 2018
+" Version: 27
+" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_LISP
"
" Thanks to F Xavier Noria for a list of 978 Common Lisp symbols taken from HyperSpec
" Clisp additions courtesy of http://clisp.cvs.sourceforge.net/*checkout*/clisp/clisp/emacs/lisp.vim
@@ -16,7 +16,7 @@ endif
if exists("g:lisp_isk")
exe "setl isk=".g:lisp_isk
-elseif !has("patch-7.4.1141")
+elseif !has("patch-7.4.1142")
setl isk=38,42,43,45,47-58,60-62,64-90,97-122,_
else
syn iskeyword 38,42,43,45,47-58,60-62,64-90,97-122,_
@@ -40,8 +40,8 @@ syn case ignore
" ---------------------------------------------------------------------
" Lists: {{{1
-syn match lispSymbol contained ![^()'`,"; \t]\+!
-syn match lispBarSymbol contained !|..\{-}|!
+syn match lispSymbol contained ![^()'`,"; \t]\+!
+syn match lispBarSymbol contained !|..\{-}|!
if exists("g:lisp_rainbow") && g:lisp_rainbow != 0
syn region lispParen0 matchgroup=hlLevel0 start="`\=(" end=")" skip="|.\{-}|" contains=@lispListCluster,lispParen1
syn region lispParen1 contained matchgroup=hlLevel1 start="`\=(" end=")" skip="|.\{-}|" contains=@lispListCluster,lispParen2
@@ -71,320 +71,320 @@ syn match lispLeadWhite contained "^\s\+"
" ---------------------------------------------------------------------
" Standard Lisp Functions and Macros: {{{1
-syn keyword lispFunc * find-method pprint-indent
-syn keyword lispFunc ** find-package pprint-linear
-syn keyword lispFunc *** find-restart pprint-logical-block
-syn keyword lispFunc + find-symbol pprint-newline
-syn keyword lispFunc ++ finish-output pprint-pop
-syn keyword lispFunc +++ first pprint-tab
-syn keyword lispFunc - fixnum pprint-tabular
-syn keyword lispFunc / flet prin1
-syn keyword lispFunc // float prin1-to-string
-syn keyword lispFunc /// float-digits princ
-syn keyword lispFunc /= float-precision princ-to-string
-syn keyword lispFunc 1+ float-radix print
-syn keyword lispFunc 1- float-sign print-not-readable
-syn keyword lispFunc < floating-point-inexact print-not-readable-object
-syn keyword lispFunc <= floating-point-invalid-operation print-object
-syn keyword lispFunc = floating-point-overflow print-unreadable-object
-syn keyword lispFunc > floating-point-underflow probe-file
-syn keyword lispFunc >= floatp proclaim
-syn keyword lispFunc abort floor prog
-syn keyword lispFunc abs fmakunbound prog*
-syn keyword lispFunc access force-output prog1
-syn keyword lispFunc acons format prog2
-syn keyword lispFunc acos formatter progn
-syn keyword lispFunc acosh fourth program-error
-syn keyword lispFunc add-method fresh-line progv
-syn keyword lispFunc adjoin fround provide
-syn keyword lispFunc adjust-array ftruncate psetf
-syn keyword lispFunc adjustable-array-p ftype psetq
-syn keyword lispFunc allocate-instance funcall push
-syn keyword lispFunc alpha-char-p function pushnew
-syn keyword lispFunc alphanumericp function-keywords putprop
-syn keyword lispFunc and function-lambda-expression quote
-syn keyword lispFunc append functionp random
-syn keyword lispFunc apply gbitp random-state
-syn keyword lispFunc applyhook gcd random-state-p
-syn keyword lispFunc apropos generic-function rassoc
-syn keyword lispFunc apropos-list gensym rassoc-if
-syn keyword lispFunc aref gentemp rassoc-if-not
-syn keyword lispFunc arithmetic-error get ratio
-syn keyword lispFunc arithmetic-error-operands get-decoded-time rational
-syn keyword lispFunc arithmetic-error-operation get-dispatch-macro-character rationalize
-syn keyword lispFunc array get-internal-real-time rationalp
-syn keyword lispFunc array-dimension get-internal-run-time read
-syn keyword lispFunc array-dimension-limit get-macro-character read-byte
-syn keyword lispFunc array-dimensions get-output-stream-string read-char
-syn keyword lispFunc array-displacement get-properties read-char-no-hang
-syn keyword lispFunc array-element-type get-setf-expansion read-delimited-list
-syn keyword lispFunc array-has-fill-pointer-p get-setf-method read-eval-print
-syn keyword lispFunc array-in-bounds-p get-universal-time read-from-string
-syn keyword lispFunc array-rank getf read-line
-syn keyword lispFunc array-rank-limit gethash read-preserving-whitespace
-syn keyword lispFunc array-row-major-index go read-sequence
-syn keyword lispFunc array-total-size graphic-char-p reader-error
-syn keyword lispFunc array-total-size-limit handler-bind readtable
-syn keyword lispFunc arrayp handler-case readtable-case
-syn keyword lispFunc ash hash-table readtablep
-syn keyword lispFunc asin hash-table-count real
-syn keyword lispFunc asinh hash-table-p realp
-syn keyword lispFunc assert hash-table-rehash-size realpart
-syn keyword lispFunc assoc hash-table-rehash-threshold reduce
-syn keyword lispFunc assoc-if hash-table-size reinitialize-instance
-syn keyword lispFunc assoc-if-not hash-table-test rem
-syn keyword lispFunc atan host-namestring remf
-syn keyword lispFunc atanh identity remhash
-syn keyword lispFunc atom if remove
-syn keyword lispFunc base-char if-exists remove-duplicates
-syn keyword lispFunc base-string ignorable remove-if
-syn keyword lispFunc bignum ignore remove-if-not
-syn keyword lispFunc bit ignore-errors remove-method
-syn keyword lispFunc bit-and imagpart remprop
-syn keyword lispFunc bit-andc1 import rename-file
-syn keyword lispFunc bit-andc2 in-package rename-package
-syn keyword lispFunc bit-eqv in-package replace
-syn keyword lispFunc bit-ior incf require
-syn keyword lispFunc bit-nand initialize-instance rest
-syn keyword lispFunc bit-nor inline restart
-syn keyword lispFunc bit-not input-stream-p restart-bind
-syn keyword lispFunc bit-orc1 inspect restart-case
-syn keyword lispFunc bit-orc2 int-char restart-name
-syn keyword lispFunc bit-vector integer return
-syn keyword lispFunc bit-vector-p integer-decode-float return-from
-syn keyword lispFunc bit-xor integer-length revappend
-syn keyword lispFunc block integerp reverse
-syn keyword lispFunc boole interactive-stream-p room
-syn keyword lispFunc boole-1 intern rotatef
-syn keyword lispFunc boole-2 internal-time-units-per-second round
-syn keyword lispFunc boole-and intersection row-major-aref
-syn keyword lispFunc boole-andc1 invalid-method-error rplaca
-syn keyword lispFunc boole-andc2 invoke-debugger rplacd
-syn keyword lispFunc boole-c1 invoke-restart safety
-syn keyword lispFunc boole-c2 invoke-restart-interactively satisfies
-syn keyword lispFunc boole-clr isqrt sbit
-syn keyword lispFunc boole-eqv keyword scale-float
-syn keyword lispFunc boole-ior keywordp schar
-syn keyword lispFunc boole-nand labels search
-syn keyword lispFunc boole-nor lambda second
-syn keyword lispFunc boole-orc1 lambda-list-keywords sequence
-syn keyword lispFunc boole-orc2 lambda-parameters-limit serious-condition
-syn keyword lispFunc boole-set last set
-syn keyword lispFunc boole-xor lcm set-char-bit
-syn keyword lispFunc boolean ldb set-difference
-syn keyword lispFunc both-case-p ldb-test set-dispatch-macro-character
-syn keyword lispFunc boundp ldiff set-exclusive-or
-syn keyword lispFunc break least-negative-double-float set-macro-character
-syn keyword lispFunc broadcast-stream least-negative-long-float set-pprint-dispatch
-syn keyword lispFunc broadcast-stream-streams least-negative-normalized-double-float set-syntax-from-char
-syn keyword lispFunc built-in-class least-negative-normalized-long-float setf
-syn keyword lispFunc butlast least-negative-normalized-short-float setq
-syn keyword lispFunc byte least-negative-normalized-single-float seventh
-syn keyword lispFunc byte-position least-negative-short-float shadow
-syn keyword lispFunc byte-size least-negative-single-float shadowing-import
-syn keyword lispFunc call-arguments-limit least-positive-double-float shared-initialize
-syn keyword lispFunc call-method least-positive-long-float shiftf
-syn keyword lispFunc call-next-method least-positive-normalized-double-float short-float
-syn keyword lispFunc capitalize least-positive-normalized-long-float short-float-epsilon
-syn keyword lispFunc car least-positive-normalized-short-float short-float-negative-epsilon
-syn keyword lispFunc case least-positive-normalized-single-float short-site-name
-syn keyword lispFunc catch least-positive-short-float signal
-syn keyword lispFunc ccase least-positive-single-float signed-byte
-syn keyword lispFunc cdr length signum
-syn keyword lispFunc ceiling let simple-condition
-syn keyword lispFunc cell-error let* simple-array
-syn keyword lispFunc cell-error-name lisp simple-base-string
-syn keyword lispFunc cerror lisp-implementation-type simple-bit-vector
-syn keyword lispFunc change-class lisp-implementation-version simple-bit-vector-p
-syn keyword lispFunc char list simple-condition-format-arguments
-syn keyword lispFunc char-bit list* simple-condition-format-control
-syn keyword lispFunc char-bits list-all-packages simple-error
-syn keyword lispFunc char-bits-limit list-length simple-string
-syn keyword lispFunc char-code listen simple-string-p
-syn keyword lispFunc char-code-limit listp simple-type-error
-syn keyword lispFunc char-control-bit load simple-vector
-syn keyword lispFunc char-downcase load-logical-pathname-translations simple-vector-p
-syn keyword lispFunc char-equal load-time-value simple-warning
-syn keyword lispFunc char-font locally sin
-syn keyword lispFunc char-font-limit log single-flaot-epsilon
-syn keyword lispFunc char-greaterp logand single-float
-syn keyword lispFunc char-hyper-bit logandc1 single-float-epsilon
-syn keyword lispFunc char-int logandc2 single-float-negative-epsilon
-syn keyword lispFunc char-lessp logbitp sinh
-syn keyword lispFunc char-meta-bit logcount sixth
-syn keyword lispFunc char-name logeqv sleep
-syn keyword lispFunc char-not-equal logical-pathname slot-boundp
-syn keyword lispFunc char-not-greaterp logical-pathname-translations slot-exists-p
-syn keyword lispFunc char-not-lessp logior slot-makunbound
-syn keyword lispFunc char-super-bit lognand slot-missing
-syn keyword lispFunc char-upcase lognor slot-unbound
-syn keyword lispFunc char/= lognot slot-value
-syn keyword lispFunc char< logorc1 software-type
-syn keyword lispFunc char<= logorc2 software-version
-syn keyword lispFunc char= logtest some
-syn keyword lispFunc char> logxor sort
-syn keyword lispFunc char>= long-float space
-syn keyword lispFunc character long-float-epsilon special
-syn keyword lispFunc characterp long-float-negative-epsilon special-form-p
-syn keyword lispFunc check-type long-site-name special-operator-p
-syn keyword lispFunc cis loop speed
-syn keyword lispFunc class loop-finish sqrt
-syn keyword lispFunc class-name lower-case-p stable-sort
-syn keyword lispFunc class-of machine-instance standard
-syn keyword lispFunc clear-input machine-type standard-char
-syn keyword lispFunc clear-output machine-version standard-char-p
-syn keyword lispFunc close macro-function standard-class
-syn keyword lispFunc clrhash macroexpand standard-generic-function
-syn keyword lispFunc code-char macroexpand-1 standard-method
-syn keyword lispFunc coerce macroexpand-l standard-object
-syn keyword lispFunc commonp macrolet step
-syn keyword lispFunc compilation-speed make-array storage-condition
-syn keyword lispFunc compile make-array store-value
-syn keyword lispFunc compile-file make-broadcast-stream stream
-syn keyword lispFunc compile-file-pathname make-char stream-element-type
-syn keyword lispFunc compiled-function make-concatenated-stream stream-error
-syn keyword lispFunc compiled-function-p make-condition stream-error-stream
-syn keyword lispFunc compiler-let make-dispatch-macro-character stream-external-format
-syn keyword lispFunc compiler-macro make-echo-stream streamp
-syn keyword lispFunc compiler-macro-function make-hash-table streamup
-syn keyword lispFunc complement make-instance string
-syn keyword lispFunc complex make-instances-obsolete string-capitalize
-syn keyword lispFunc complexp make-list string-char
-syn keyword lispFunc compute-applicable-methods make-load-form string-char-p
-syn keyword lispFunc compute-restarts make-load-form-saving-slots string-downcase
-syn keyword lispFunc concatenate make-method string-equal
-syn keyword lispFunc concatenated-stream make-package string-greaterp
-syn keyword lispFunc concatenated-stream-streams make-pathname string-left-trim
-syn keyword lispFunc cond make-random-state string-lessp
-syn keyword lispFunc condition make-sequence string-not-equal
-syn keyword lispFunc conjugate make-string string-not-greaterp
-syn keyword lispFunc cons make-string-input-stream string-not-lessp
-syn keyword lispFunc consp make-string-output-stream string-right-strim
-syn keyword lispFunc constantly make-symbol string-right-trim
-syn keyword lispFunc constantp make-synonym-stream string-stream
-syn keyword lispFunc continue make-two-way-stream string-trim
-syn keyword lispFunc control-error makunbound string-upcase
-syn keyword lispFunc copy-alist map string/=
-syn keyword lispFunc copy-list map-into string<
-syn keyword lispFunc copy-pprint-dispatch mapc string<=
-syn keyword lispFunc copy-readtable mapcan string=
-syn keyword lispFunc copy-seq mapcar string>
-syn keyword lispFunc copy-structure mapcon string>=
-syn keyword lispFunc copy-symbol maphash stringp
-syn keyword lispFunc copy-tree mapl structure
-syn keyword lispFunc cos maplist structure-class
-syn keyword lispFunc cosh mask-field structure-object
-syn keyword lispFunc count max style-warning
-syn keyword lispFunc count-if member sublim
-syn keyword lispFunc count-if-not member-if sublis
-syn keyword lispFunc ctypecase member-if-not subseq
-syn keyword lispFunc debug merge subsetp
-syn keyword lispFunc decf merge-pathname subst
-syn keyword lispFunc declaim merge-pathnames subst-if
-syn keyword lispFunc declaration method subst-if-not
-syn keyword lispFunc declare method-combination substitute
-syn keyword lispFunc decode-float method-combination-error substitute-if
-syn keyword lispFunc decode-universal-time method-qualifiers substitute-if-not
-syn keyword lispFunc defclass min subtypep
-syn keyword lispFunc defconstant minusp svref
-syn keyword lispFunc defgeneric mismatch sxhash
-syn keyword lispFunc define-compiler-macro mod symbol
-syn keyword lispFunc define-condition most-negative-double-float symbol-function
-syn keyword lispFunc define-method-combination most-negative-fixnum symbol-macrolet
-syn keyword lispFunc define-modify-macro most-negative-long-float symbol-name
-syn keyword lispFunc define-setf-expander most-negative-short-float symbol-package
-syn keyword lispFunc define-setf-method most-negative-single-float symbol-plist
-syn keyword lispFunc define-symbol-macro most-positive-double-float symbol-value
-syn keyword lispFunc defmacro most-positive-fixnum symbolp
-syn keyword lispFunc defmethod most-positive-long-float synonym-stream
-syn keyword lispFunc defpackage most-positive-short-float synonym-stream-symbol
-syn keyword lispFunc defparameter most-positive-single-float sys
-syn keyword lispFunc defsetf muffle-warning system
-syn keyword lispFunc defstruct multiple-value-bind t
-syn keyword lispFunc deftype multiple-value-call tagbody
-syn keyword lispFunc defun multiple-value-list tailp
-syn keyword lispFunc defvar multiple-value-prog1 tan
-syn keyword lispFunc delete multiple-value-seteq tanh
-syn keyword lispFunc delete-duplicates multiple-value-setq tenth
-syn keyword lispFunc delete-file multiple-values-limit terpri
-syn keyword lispFunc delete-if name-char the
-syn keyword lispFunc delete-if-not namestring third
-syn keyword lispFunc delete-package nbutlast throw
-syn keyword lispFunc denominator nconc time
-syn keyword lispFunc deposit-field next-method-p trace
-syn keyword lispFunc describe nil translate-logical-pathname
-syn keyword lispFunc describe-object nintersection translate-pathname
-syn keyword lispFunc destructuring-bind ninth tree-equal
-syn keyword lispFunc digit-char no-applicable-method truename
-syn keyword lispFunc digit-char-p no-next-method truncase
-syn keyword lispFunc directory not truncate
-syn keyword lispFunc directory-namestring notany two-way-stream
-syn keyword lispFunc disassemble notevery two-way-stream-input-stream
-syn keyword lispFunc division-by-zero notinline two-way-stream-output-stream
-syn keyword lispFunc do nreconc type
-syn keyword lispFunc do* nreverse type-error
-syn keyword lispFunc do-all-symbols nset-difference type-error-datum
-syn keyword lispFunc do-exeternal-symbols nset-exclusive-or type-error-expected-type
-syn keyword lispFunc do-external-symbols nstring type-of
-syn keyword lispFunc do-symbols nstring-capitalize typecase
-syn keyword lispFunc documentation nstring-downcase typep
-syn keyword lispFunc dolist nstring-upcase unbound-slot
-syn keyword lispFunc dotimes nsublis unbound-slot-instance
-syn keyword lispFunc double-float nsubst unbound-variable
-syn keyword lispFunc double-float-epsilon nsubst-if undefined-function
-syn keyword lispFunc double-float-negative-epsilon nsubst-if-not unexport
-syn keyword lispFunc dpb nsubstitute unintern
-syn keyword lispFunc dribble nsubstitute-if union
-syn keyword lispFunc dynamic-extent nsubstitute-if-not unless
-syn keyword lispFunc ecase nth unread
-syn keyword lispFunc echo-stream nth-value unread-char
-syn keyword lispFunc echo-stream-input-stream nthcdr unsigned-byte
-syn keyword lispFunc echo-stream-output-stream null untrace
-syn keyword lispFunc ed number unuse-package
-syn keyword lispFunc eighth numberp unwind-protect
-syn keyword lispFunc elt numerator update-instance-for-different-class
-syn keyword lispFunc encode-universal-time nunion update-instance-for-redefined-class
-syn keyword lispFunc end-of-file oddp upgraded-array-element-type
-syn keyword lispFunc endp open upgraded-complex-part-type
-syn keyword lispFunc enough-namestring open-stream-p upper-case-p
-syn keyword lispFunc ensure-directories-exist optimize use-package
-syn keyword lispFunc ensure-generic-function or use-value
-syn keyword lispFunc eq otherwise user
-syn keyword lispFunc eql output-stream-p user-homedir-pathname
-syn keyword lispFunc equal package values
-syn keyword lispFunc equalp package-error values-list
-syn keyword lispFunc error package-error-package vector
-syn keyword lispFunc etypecase package-name vector-pop
-syn keyword lispFunc eval package-nicknames vector-push
-syn keyword lispFunc eval-when package-shadowing-symbols vector-push-extend
-syn keyword lispFunc evalhook package-use-list vectorp
-syn keyword lispFunc evenp package-used-by-list warn
-syn keyword lispFunc every packagep warning
-syn keyword lispFunc exp pairlis when
-syn keyword lispFunc export parse-error wild-pathname-p
-syn keyword lispFunc expt parse-integer with-accessors
-syn keyword lispFunc extended-char parse-namestring with-compilation-unit
-syn keyword lispFunc fboundp pathname with-condition-restarts
-syn keyword lispFunc fceiling pathname-device with-hash-table-iterator
-syn keyword lispFunc fdefinition pathname-directory with-input-from-string
-syn keyword lispFunc ffloor pathname-host with-open-file
-syn keyword lispFunc fifth pathname-match-p with-open-stream
-syn keyword lispFunc file-author pathname-name with-output-to-string
-syn keyword lispFunc file-error pathname-type with-package-iterator
-syn keyword lispFunc file-error-pathname pathname-version with-simple-restart
-syn keyword lispFunc file-length pathnamep with-slots
-syn keyword lispFunc file-namestring peek-char with-standard-io-syntax
-syn keyword lispFunc file-position phase write
-syn keyword lispFunc file-stream pi write-byte
-syn keyword lispFunc file-string-length plusp write-char
-syn keyword lispFunc file-write-date pop write-line
-syn keyword lispFunc fill position write-sequence
-syn keyword lispFunc fill-pointer position-if write-string
-syn keyword lispFunc find position-if-not write-to-string
-syn keyword lispFunc find-all-symbols pprint y-or-n-p
-syn keyword lispFunc find-class pprint-dispatch yes-or-no-p
-syn keyword lispFunc find-if pprint-exit-if-list-exhausted zerop
-syn keyword lispFunc find-if-not pprint-fill
+syn keyword lispFunc < find-method pprint-indent
+syn keyword lispFunc <= find-package pprint-linear
+syn keyword lispFunc = find-restart pprint-logical-block
+syn keyword lispFunc > find-symbol pprint-newline
+syn keyword lispFunc >= finish-output pprint-pop
+syn keyword lispFunc - first pprint-tab
+syn keyword lispFunc / fixnum pprint-tabular
+syn keyword lispFunc /= flet prin1
+syn keyword lispFunc // float prin1-to-string
+syn keyword lispFunc /// float-digits princ
+syn keyword lispFunc * floating-point-inexact princ-to-string
+syn keyword lispFunc ** floating-point-invalid-operation print
+syn keyword lispFunc *** floating-point-overflow print-not-readable
+syn keyword lispFunc + floating-point-underflow print-not-readable-object
+syn keyword lispFunc ++ floatp print-object
+syn keyword lispFunc +++ float-precision print-unreadable-object
+syn keyword lispFunc 1- float-radix probe-file
+syn keyword lispFunc 1+ float-sign proclaim
+syn keyword lispFunc abort floor prog
+syn keyword lispFunc abs fmakunbound prog*
+syn keyword lispFunc access force-output prog1
+syn keyword lispFunc acons format prog2
+syn keyword lispFunc acos formatter progn
+syn keyword lispFunc acosh fourth program-error
+syn keyword lispFunc add-method fresh-line progv
+syn keyword lispFunc adjoin fround provide
+syn keyword lispFunc adjustable-array-p ftruncate psetf
+syn keyword lispFunc adjust-array ftype psetq
+syn keyword lispFunc allocate-instance funcall push
+syn keyword lispFunc alpha-char-p function pushnew
+syn keyword lispFunc alphanumericp function-keywords putprop
+syn keyword lispFunc and function-lambda-expression quote
+syn keyword lispFunc append functionp random
+syn keyword lispFunc apply gbitp random-state
+syn keyword lispFunc applyhook gcd random-state-p
+syn keyword lispFunc apropos generic-function rassoc
+syn keyword lispFunc apropos-list gensym rassoc-if
+syn keyword lispFunc aref gentemp rassoc-if-not
+syn keyword lispFunc arithmetic-error get ratio
+syn keyword lispFunc arithmetic-error-operands get-decoded-time rational
+syn keyword lispFunc arithmetic-error-operation get-dispatch-macro-character rationalize
+syn keyword lispFunc array getf rationalp
+syn keyword lispFunc array-dimension gethash read
+syn keyword lispFunc array-dimension-limit get-internal-real-time read-byte
+syn keyword lispFunc array-dimensions get-internal-run-time read-char
+syn keyword lispFunc array-displacement get-macro-character read-char-no-hang
+syn keyword lispFunc array-element-type get-output-stream-string read-delimited-list
+syn keyword lispFunc array-has-fill-pointer-p get-properties reader-error
+syn keyword lispFunc array-in-bounds-p get-setf-expansion read-eval-print
+syn keyword lispFunc arrayp get-setf-method read-from-string
+syn keyword lispFunc array-rank get-universal-time read-line
+syn keyword lispFunc array-rank-limit go read-preserving-whitespace
+syn keyword lispFunc array-row-major-index graphic-char-p read-sequence
+syn keyword lispFunc array-total-size handler-bind readtable
+syn keyword lispFunc array-total-size-limit handler-case readtable-case
+syn keyword lispFunc ash hash-table readtablep
+syn keyword lispFunc asin hash-table-count real
+syn keyword lispFunc asinh hash-table-p realp
+syn keyword lispFunc assert hash-table-rehash-size realpart
+syn keyword lispFunc assoc hash-table-rehash-threshold reduce
+syn keyword lispFunc assoc-if hash-table-size reinitialize-instance
+syn keyword lispFunc assoc-if-not hash-table-test rem
+syn keyword lispFunc atan host-namestring remf
+syn keyword lispFunc atanh identity remhash
+syn keyword lispFunc atom if remove
+syn keyword lispFunc base-char if-exists remove-duplicates
+syn keyword lispFunc base-string ignorable remove-if
+syn keyword lispFunc bignum ignore remove-if-not
+syn keyword lispFunc bit ignore-errors remove-method
+syn keyword lispFunc bit-and imagpart remprop
+syn keyword lispFunc bit-andc1 import rename-file
+syn keyword lispFunc bit-andc2 incf rename-package
+syn keyword lispFunc bit-eqv initialize-instance replace
+syn keyword lispFunc bit-ior inline require
+syn keyword lispFunc bit-nand in-package rest
+syn keyword lispFunc bit-nor in-package restart
+syn keyword lispFunc bit-not input-stream-p restart-bind
+syn keyword lispFunc bit-orc1 inspect restart-case
+syn keyword lispFunc bit-orc2 int-char restart-name
+syn keyword lispFunc bit-vector integer return
+syn keyword lispFunc bit-vector-p integer-decode-float return-from
+syn keyword lispFunc bit-xor integer-length revappend
+syn keyword lispFunc block integerp reverse
+syn keyword lispFunc boole interactive-stream-p room
+syn keyword lispFunc boole-1 intern rotatef
+syn keyword lispFunc boole-2 internal-time-units-per-second round
+syn keyword lispFunc boolean intersection row-major-aref
+syn keyword lispFunc boole-and invalid-method-error rplaca
+syn keyword lispFunc boole-andc1 invoke-debugger rplacd
+syn keyword lispFunc boole-andc2 invoke-restart safety
+syn keyword lispFunc boole-c1 invoke-restart-interactively satisfies
+syn keyword lispFunc boole-c2 isqrt sbit
+syn keyword lispFunc boole-clr keyword scale-float
+syn keyword lispFunc boole-eqv keywordp schar
+syn keyword lispFunc boole-ior labels search
+syn keyword lispFunc boole-nand lambda second
+syn keyword lispFunc boole-nor lambda-list-keywords sequence
+syn keyword lispFunc boole-orc1 lambda-parameters-limit serious-condition
+syn keyword lispFunc boole-orc2 last set
+syn keyword lispFunc boole-set lcm set-char-bit
+syn keyword lispFunc boole-xor ldb set-difference
+syn keyword lispFunc both-case-p ldb-test set-dispatch-macro-character
+syn keyword lispFunc boundp ldiff set-exclusive-or
+syn keyword lispFunc break least-negative-double-float setf
+syn keyword lispFunc broadcast-stream least-negative-long-float set-macro-character
+syn keyword lispFunc broadcast-stream-streams least-negative-normalized-double-float set-pprint-dispatch
+syn keyword lispFunc built-in-class least-negative-normalized-long-float setq
+syn keyword lispFunc butlast least-negative-normalized-short-float set-syntax-from-char
+syn keyword lispFunc byte least-negative-normalized-single-float seventh
+syn keyword lispFunc byte-position least-negative-short-float shadow
+syn keyword lispFunc byte-size least-negative-single-float shadowing-import
+syn keyword lispFunc call-arguments-limit least-positive-double-float shared-initialize
+syn keyword lispFunc call-method least-positive-long-float shiftf
+syn keyword lispFunc call-next-method least-positive-normalized-double-float short-float
+syn keyword lispFunc capitalize least-positive-normalized-long-float short-float-epsilon
+syn keyword lispFunc car least-positive-normalized-short-float short-float-negative-epsilon
+syn keyword lispFunc case least-positive-normalized-single-float short-site-name
+syn keyword lispFunc catch least-positive-short-float signal
+syn keyword lispFunc ccase least-positive-single-float signed-byte
+syn keyword lispFunc cdr length signum
+syn keyword lispFunc ceiling let simple-array
+syn keyword lispFunc cell-error let* simple-base-string
+syn keyword lispFunc cell-error-name lisp simple-bit-vector
+syn keyword lispFunc cerror lisp-implementation-type simple-bit-vector-p
+syn keyword lispFunc change-class lisp-implementation-version simple-condition
+syn keyword lispFunc char list simple-condition-format-arguments
+syn keyword lispFunc char< list* simple-condition-format-control
+syn keyword lispFunc char<= list-all-packages simple-error
+syn keyword lispFunc char= listen simple-string
+syn keyword lispFunc char> list-length simple-string-p
+syn keyword lispFunc char>= listp simple-type-error
+syn keyword lispFunc char/= load simple-vector
+syn keyword lispFunc character load-logical-pathname-translations simple-vector-p
+syn keyword lispFunc characterp load-time-value simple-warning
+syn keyword lispFunc char-bit locally sin
+syn keyword lispFunc char-bits log single-flaot-epsilon
+syn keyword lispFunc char-bits-limit logand single-float
+syn keyword lispFunc char-code logandc1 single-float-epsilon
+syn keyword lispFunc char-code-limit logandc2 single-float-negative-epsilon
+syn keyword lispFunc char-control-bit logbitp sinh
+syn keyword lispFunc char-downcase logcount sixth
+syn keyword lispFunc char-equal logeqv sleep
+syn keyword lispFunc char-font logical-pathname slot-boundp
+syn keyword lispFunc char-font-limit logical-pathname-translations slot-exists-p
+syn keyword lispFunc char-greaterp logior slot-makunbound
+syn keyword lispFunc char-hyper-bit lognand slot-missing
+syn keyword lispFunc char-int lognor slot-unbound
+syn keyword lispFunc char-lessp lognot slot-value
+syn keyword lispFunc char-meta-bit logorc1 software-type
+syn keyword lispFunc char-name logorc2 software-version
+syn keyword lispFunc char-not-equal logtest some
+syn keyword lispFunc char-not-greaterp logxor sort
+syn keyword lispFunc char-not-lessp long-float space
+syn keyword lispFunc char-super-bit long-float-epsilon special
+syn keyword lispFunc char-upcase long-float-negative-epsilon special-form-p
+syn keyword lispFunc check-type long-site-name special-operator-p
+syn keyword lispFunc cis loop speed
+syn keyword lispFunc class loop-finish sqrt
+syn keyword lispFunc class-name lower-case-p stable-sort
+syn keyword lispFunc class-of machine-instance standard
+syn keyword lispFunc clear-input machine-type standard-char
+syn keyword lispFunc clear-output machine-version standard-char-p
+syn keyword lispFunc close macroexpand standard-class
+syn keyword lispFunc clrhash macroexpand-1 standard-generic-function
+syn keyword lispFunc code-char macroexpand-l standard-method
+syn keyword lispFunc coerce macro-function standard-object
+syn keyword lispFunc commonp macrolet step
+syn keyword lispFunc compilation-speed make-array storage-condition
+syn keyword lispFunc compile make-array store-value
+syn keyword lispFunc compiled-function make-broadcast-stream stream
+syn keyword lispFunc compiled-function-p make-char stream-element-type
+syn keyword lispFunc compile-file make-concatenated-stream stream-error
+syn keyword lispFunc compile-file-pathname make-condition stream-error-stream
+syn keyword lispFunc compiler-let make-dispatch-macro-character stream-external-format
+syn keyword lispFunc compiler-macro make-echo-stream streamp
+syn keyword lispFunc compiler-macro-function make-hash-table streamup
+syn keyword lispFunc complement make-instance string
+syn keyword lispFunc complex make-instances-obsolete string<
+syn keyword lispFunc complexp make-list string<=
+syn keyword lispFunc compute-applicable-methods make-load-form string=
+syn keyword lispFunc compute-restarts make-load-form-saving-slots string>
+syn keyword lispFunc concatenate make-method string>=
+syn keyword lispFunc concatenated-stream make-package string/=
+syn keyword lispFunc concatenated-stream-streams make-pathname string-capitalize
+syn keyword lispFunc cond make-random-state string-char
+syn keyword lispFunc condition make-sequence string-char-p
+syn keyword lispFunc conjugate make-string string-downcase
+syn keyword lispFunc cons make-string-input-stream string-equal
+syn keyword lispFunc consp make-string-output-stream string-greaterp
+syn keyword lispFunc constantly make-symbol string-left-trim
+syn keyword lispFunc constantp make-synonym-stream string-lessp
+syn keyword lispFunc continue make-two-way-stream string-not-equal
+syn keyword lispFunc control-error makunbound string-not-greaterp
+syn keyword lispFunc copy-alist map string-not-lessp
+syn keyword lispFunc copy-list mapc stringp
+syn keyword lispFunc copy-pprint-dispatch mapcan string-right-strim
+syn keyword lispFunc copy-readtable mapcar string-right-trim
+syn keyword lispFunc copy-seq mapcon string-stream
+syn keyword lispFunc copy-structure maphash string-trim
+syn keyword lispFunc copy-symbol map-into string-upcase
+syn keyword lispFunc copy-tree mapl structure
+syn keyword lispFunc cos maplist structure-class
+syn keyword lispFunc cosh mask-field structure-object
+syn keyword lispFunc count max style-warning
+syn keyword lispFunc count-if member sublim
+syn keyword lispFunc count-if-not member-if sublis
+syn keyword lispFunc ctypecase member-if-not subseq
+syn keyword lispFunc debug merge subsetp
+syn keyword lispFunc decf merge-pathname subst
+syn keyword lispFunc declaim merge-pathnames subst-if
+syn keyword lispFunc declaration method subst-if-not
+syn keyword lispFunc declare method-combination substitute
+syn keyword lispFunc decode-float method-combination-error substitute-if
+syn keyword lispFunc decode-universal-time method-qualifiers substitute-if-not
+syn keyword lispFunc defclass min subtypep
+syn keyword lispFunc defconstant minusp svref
+syn keyword lispFunc defgeneric mismatch sxhash
+syn keyword lispFunc define-compiler-macro mod symbol
+syn keyword lispFunc define-condition most-negative-double-float symbol-function
+syn keyword lispFunc define-method-combination most-negative-fixnum symbol-macrolet
+syn keyword lispFunc define-modify-macro most-negative-long-float symbol-name
+syn keyword lispFunc define-setf-expander most-negative-short-float symbolp
+syn keyword lispFunc define-setf-method most-negative-single-float symbol-package
+syn keyword lispFunc define-symbol-macro most-positive-double-float symbol-plist
+syn keyword lispFunc defmacro most-positive-fixnum symbol-value
+syn keyword lispFunc defmethod most-positive-long-float synonym-stream
+syn keyword lispFunc defpackage most-positive-short-float synonym-stream-symbol
+syn keyword lispFunc defparameter most-positive-single-float sys
+syn keyword lispFunc defsetf muffle-warning system
+syn keyword lispFunc defstruct multiple-value-bind t
+syn keyword lispFunc deftype multiple-value-call tagbody
+syn keyword lispFunc defun multiple-value-list tailp
+syn keyword lispFunc defvar multiple-value-prog1 tan
+syn keyword lispFunc delete multiple-value-seteq tanh
+syn keyword lispFunc delete-duplicates multiple-value-setq tenth
+syn keyword lispFunc delete-file multiple-values-limit terpri
+syn keyword lispFunc delete-if name-char the
+syn keyword lispFunc delete-if-not namestring third
+syn keyword lispFunc delete-package nbutlast throw
+syn keyword lispFunc denominator nconc time
+syn keyword lispFunc deposit-field next-method-p trace
+syn keyword lispFunc describe nil translate-logical-pathname
+syn keyword lispFunc describe-object nintersection translate-pathname
+syn keyword lispFunc destructuring-bind ninth tree-equal
+syn keyword lispFunc digit-char no-applicable-method truename
+syn keyword lispFunc digit-char-p no-next-method truncase
+syn keyword lispFunc directory not truncate
+syn keyword lispFunc directory-namestring notany two-way-stream
+syn keyword lispFunc disassemble notevery two-way-stream-input-stream
+syn keyword lispFunc division-by-zero notinline two-way-stream-output-stream
+syn keyword lispFunc do nreconc type
+syn keyword lispFunc do* nreverse typecase
+syn keyword lispFunc do-all-symbols nset-difference type-error
+syn keyword lispFunc documentation nset-exclusive-or type-error-datum
+syn keyword lispFunc do-exeternal-symbols nstring type-error-expected-type
+syn keyword lispFunc do-external-symbols nstring-capitalize type-of
+syn keyword lispFunc dolist nstring-downcase typep
+syn keyword lispFunc do-symbols nstring-upcase unbound-slot
+syn keyword lispFunc dotimes nsublis unbound-slot-instance
+syn keyword lispFunc double-float nsubst unbound-variable
+syn keyword lispFunc double-float-epsilon nsubst-if undefined-function
+syn keyword lispFunc double-float-negative-epsilon nsubst-if-not unexport
+syn keyword lispFunc dpb nsubstitute unintern
+syn keyword lispFunc dribble nsubstitute-if union
+syn keyword lispFunc dynamic-extent nsubstitute-if-not unless
+syn keyword lispFunc ecase nth unread
+syn keyword lispFunc echo-stream nthcdr unread-char
+syn keyword lispFunc echo-stream-input-stream nth-value unsigned-byte
+syn keyword lispFunc echo-stream-output-stream null untrace
+syn keyword lispFunc ed number unuse-package
+syn keyword lispFunc eighth numberp unwind-protect
+syn keyword lispFunc elt numerator update-instance-for-different-class
+syn keyword lispFunc encode-universal-time nunion update-instance-for-redefined-class
+syn keyword lispFunc end-of-file oddp upgraded-array-element-type
+syn keyword lispFunc endp open upgraded-complex-part-type
+syn keyword lispFunc enough-namestring open-stream-p upper-case-p
+syn keyword lispFunc ensure-directories-exist optimize use-package
+syn keyword lispFunc ensure-generic-function or user
+syn keyword lispFunc eq otherwise user-homedir-pathname
+syn keyword lispFunc eql output-stream-p use-value
+syn keyword lispFunc equal package values
+syn keyword lispFunc equalp package-error values-list
+syn keyword lispFunc error package-error-package variable
+syn keyword lispFunc etypecase package-name vector
+syn keyword lispFunc eval package-nicknames vectorp
+syn keyword lispFunc evalhook packagep vector-pop
+syn keyword lispFunc eval-when package-shadowing-symbols vector-push
+syn keyword lispFunc evenp package-used-by-list vector-push-extend
+syn keyword lispFunc every package-use-list warn
+syn keyword lispFunc exp pairlis warning
+syn keyword lispFunc export parse-error when
+syn keyword lispFunc expt parse-integer wild-pathname-p
+syn keyword lispFunc extended-char parse-namestring with-accessors
+syn keyword lispFunc fboundp pathname with-compilation-unit
+syn keyword lispFunc fceiling pathname-device with-condition-restarts
+syn keyword lispFunc fdefinition pathname-directory with-hash-table-iterator
+syn keyword lispFunc ffloor pathname-host with-input-from-string
+syn keyword lispFunc fifth pathname-match-p with-open-file
+syn keyword lispFunc file-author pathname-name with-open-stream
+syn keyword lispFunc file-error pathnamep with-output-to-string
+syn keyword lispFunc file-error-pathname pathname-type with-package-iterator
+syn keyword lispFunc file-length pathname-version with-simple-restart
+syn keyword lispFunc file-namestring peek-char with-slots
+syn keyword lispFunc file-position phase with-standard-io-syntax
+syn keyword lispFunc file-stream pi write
+syn keyword lispFunc file-string-length plusp write-byte
+syn keyword lispFunc file-write-date pop write-char
+syn keyword lispFunc fill position write-line
+syn keyword lispFunc fill-pointer position-if write-sequence
+syn keyword lispFunc find position-if-not write-string
+syn keyword lispFunc find-all-symbols pprint write-to-string
+syn keyword lispFunc find-class pprint-dispatch yes-or-no-p
+syn keyword lispFunc find-if pprint-exit-if-list-exhausted y-or-n-p
+syn keyword lispFunc find-if-not pprint-fill zerop
syn match lispFunc "\<c[ad]\+r\>"
if exists("g:lispsyntax_clisp")
@@ -561,59 +561,55 @@ syn sync lines=100
" ---------------------------------------------------------------------
" Define Highlighting: {{{1
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508
- command -nargs=+ HiLink hi def link <args>
+if !exists("skip_lisp_syntax_inits")
- HiLink lispCommentRegion lispComment
- HiLink lispAtomNmbr lispNumber
- HiLink lispAtomMark lispMark
- HiLink lispInStringString lispString
+ hi def link lispCommentRegion lispComment
+ hi def link lispAtomNmbr lispNumber
+ hi def link lispAtomMark lispMark
+ hi def link lispInStringString lispString
- HiLink lispAtom Identifier
- HiLink lispAtomBarSymbol Special
- HiLink lispBarSymbol Special
- HiLink lispComment Comment
- HiLink lispConcat Statement
- HiLink lispDecl Statement
- HiLink lispFunc Statement
- HiLink lispKey Type
- HiLink lispMark Delimiter
- HiLink lispNumber Number
- HiLink lispParenError Error
- HiLink lispEscapeSpecial Type
- HiLink lispString String
- HiLink lispTodo Todo
- HiLink lispVar Statement
+ hi def link lispAtom Identifier
+ hi def link lispAtomBarSymbol Special
+ hi def link lispBarSymbol Special
+ hi def link lispComment Comment
+ hi def link lispConcat Statement
+ hi def link lispDecl Statement
+ hi def link lispFunc Statement
+ hi def link lispKey Type
+ hi def link lispMark Delimiter
+ hi def link lispNumber Number
+ hi def link lispParenError Error
+ hi def link lispEscapeSpecial Type
+ hi def link lispString String
+ hi def link lispTodo Todo
+ hi def link lispVar Statement
if exists("g:lisp_rainbow") && g:lisp_rainbow != 0
if &bg == "dark"
- hi def hlLevel0 ctermfg=red guifg=red1
- hi def hlLevel1 ctermfg=yellow guifg=orange1
- hi def hlLevel2 ctermfg=green guifg=yellow1
- hi def hlLevel3 ctermfg=cyan guifg=greenyellow
- hi def hlLevel4 ctermfg=magenta guifg=green1
- hi def hlLevel5 ctermfg=red guifg=springgreen1
- hi def hlLevel6 ctermfg=yellow guifg=cyan1
- hi def hlLevel7 ctermfg=green guifg=slateblue1
- hi def hlLevel8 ctermfg=cyan guifg=magenta1
- hi def hlLevel9 ctermfg=magenta guifg=purple1
+ hi def hlLevel0 ctermfg=red guifg=red1
+ hi def hlLevel1 ctermfg=yellow guifg=orange1
+ hi def hlLevel2 ctermfg=green guifg=yellow1
+ hi def hlLevel3 ctermfg=cyan guifg=greenyellow
+ hi def hlLevel4 ctermfg=magenta guifg=green1
+ hi def hlLevel5 ctermfg=red guifg=springgreen1
+ hi def hlLevel6 ctermfg=yellow guifg=cyan1
+ hi def hlLevel7 ctermfg=green guifg=slateblue1
+ hi def hlLevel8 ctermfg=cyan guifg=magenta1
+ hi def hlLevel9 ctermfg=magenta guifg=purple1
else
- hi def hlLevel0 ctermfg=red guifg=red3
- hi def hlLevel1 ctermfg=darkyellow guifg=orangered3
- hi def hlLevel2 ctermfg=darkgreen guifg=orange2
- hi def hlLevel3 ctermfg=blue guifg=yellow3
- hi def hlLevel4 ctermfg=darkmagenta guifg=olivedrab4
- hi def hlLevel5 ctermfg=red guifg=green4
- hi def hlLevel6 ctermfg=darkyellow guifg=paleturquoise3
- hi def hlLevel7 ctermfg=darkgreen guifg=deepskyblue4
- hi def hlLevel8 ctermfg=blue guifg=darkslateblue
- hi def hlLevel9 ctermfg=darkmagenta guifg=darkviolet
+ hi def hlLevel0 ctermfg=red guifg=red3
+ hi def hlLevel1 ctermfg=darkyellow guifg=orangered3
+ hi def hlLevel2 ctermfg=darkgreen guifg=orange2
+ hi def hlLevel3 ctermfg=blue guifg=yellow3
+ hi def hlLevel4 ctermfg=darkmagenta guifg=olivedrab4
+ hi def hlLevel5 ctermfg=red guifg=green4
+ hi def hlLevel6 ctermfg=darkyellow guifg=paleturquoise3
+ hi def hlLevel7 ctermfg=darkgreen guifg=deepskyblue4
+ hi def hlLevel8 ctermfg=blue guifg=darkslateblue
+ hi def hlLevel9 ctermfg=darkmagenta guifg=darkviolet
endif
endif
- delcommand HiLink
endif
let b:current_syntax = "lisp"
diff --git a/runtime/syntax/lite.vim b/runtime/syntax/lite.vim
index 8abc51dea1..a8d26892d4 100644
--- a/runtime/syntax/lite.vim
+++ b/runtime/syntax/lite.vim
@@ -8,11 +8,8 @@
" Options lite_sql_query = 1 for SQL syntax highligthing inside strings
" lite_minlines = x to sync at least x lines backwards
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -138,39 +135,29 @@ if main_syntax == 'lite'
endif
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_lite_syn_inits")
- if version < 508
- let did_lite_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
+
+hi def link liteComment Comment
+hi def link liteString String
+hi def link liteNumber Number
+hi def link liteFloat Float
+hi def link liteIdentifier Identifier
+hi def link liteGlobalIdentifier Identifier
+hi def link liteIntVar Identifier
+hi def link liteFunctions Function
+hi def link liteRepeat Repeat
+hi def link liteConditional Conditional
+hi def link liteStatement Statement
+hi def link liteType Type
+hi def link liteInclude Include
+hi def link liteDefine Define
+hi def link liteSpecialChar SpecialChar
+hi def link liteParentError liteError
+hi def link liteError Error
+hi def link liteTodo Todo
+hi def link liteOperator Operator
+hi def link liteRelation Operator
- HiLink liteComment Comment
- HiLink liteString String
- HiLink liteNumber Number
- HiLink liteFloat Float
- HiLink liteIdentifier Identifier
- HiLink liteGlobalIdentifier Identifier
- HiLink liteIntVar Identifier
- HiLink liteFunctions Function
- HiLink liteRepeat Repeat
- HiLink liteConditional Conditional
- HiLink liteStatement Statement
- HiLink liteType Type
- HiLink liteInclude Include
- HiLink liteDefine Define
- HiLink liteSpecialChar SpecialChar
- HiLink liteParentError liteError
- HiLink liteError Error
- HiLink liteTodo Todo
- HiLink liteOperator Operator
- HiLink liteRelation Operator
-
- delcommand HiLink
-endif
let b:current_syntax = "lite"
diff --git a/runtime/syntax/litestep.vim b/runtime/syntax/litestep.vim
index b4c15faf65..e3d967f010 100644
--- a/runtime/syntax/litestep.vim
+++ b/runtime/syntax/litestep.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: LiteStep RC file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2007-02-22
+" Language: LiteStep RC file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-02-22
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/loginaccess.vim b/runtime/syntax/loginaccess.vim
index 07d60eeca0..650e067d18 100644
--- a/runtime/syntax/loginaccess.vim
+++ b/runtime/syntax/loginaccess.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: login.access(5) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: login.access(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/logindefs.vim b/runtime/syntax/logindefs.vim
index 59d18e7ef4..8cb4295eda 100644
--- a/runtime/syntax/logindefs.vim
+++ b/runtime/syntax/logindefs.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: login.defs(5) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2010-11-29
+" Language: login.defs(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2010-11-29
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/logtalk.vim b/runtime/syntax/logtalk.vim
index be34c7ed74..a7fe9ce925 100644
--- a/runtime/syntax/logtalk.vim
+++ b/runtime/syntax/logtalk.vim
@@ -2,14 +2,11 @@
"
" Language: Logtalk
" Maintainer: Paulo Moura <pmoura@logtalk.org>
-" Last Change: February 4, 2012
+" Last Change: August 3, 2018
-" Quit when a syntax file was already loaded:
-
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -82,13 +79,13 @@ syn region logtalkDir matchgroup=logtalkDirTag start=":- elif(" matchgroup=log
syn match logtalkDirTag ":- else\."
syn match logtalkDirTag ":- endif\."
syn region logtalkDir matchgroup=logtalkDirTag start=":- alias(" matchgroup=logtalkDirTag end=")\." contains=ALL
-syn region logtalkDir matchgroup=logtalkDirTag start=":- calls(" matchgroup=logtalkDirTag end=")\." contains=ALL
syn region logtalkDir matchgroup=logtalkDirTag start=":- coinductive(" matchgroup=logtalkDirTag end=")\." contains=ALL
syn region logtalkDir matchgroup=logtalkDirTag start=":- encoding(" matchgroup=logtalkDirTag end=")\." contains=ALL
syn region logtalkDir matchgroup=logtalkDirTag start=":- initialization(" matchgroup=logtalkDirTag end=")\." contains=ALL
syn region logtalkDir matchgroup=logtalkDirTag start=":- info(" matchgroup=logtalkDirTag end=")\." contains=ALL
syn region logtalkDir matchgroup=logtalkDirTag start=":- mode(" matchgroup=logtalkDirTag end=")\." contains=logtalkOperator, logtalkAtom
syn region logtalkDir matchgroup=logtalkDirTag start=":- dynamic(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn match logtalkDirTag ":- built_in\."
syn match logtalkDirTag ":- dynamic\."
syn region logtalkDir matchgroup=logtalkDirTag start=":- discontiguous(" matchgroup=logtalkDirTag end=")\." contains=ALL
syn region logtalkDir matchgroup=logtalkDirTag start=":- multifile(" matchgroup=logtalkDirTag end=")\." contains=ALL
@@ -134,17 +131,20 @@ syn match logtalkBuiltIn "\<\(instantiat\|specializ\)es_class\ze("
syn match logtalkBuiltIn "\<\(abolish\|define\)_events\ze("
syn match logtalkBuiltIn "\<current_event\ze("
-syn match logtalkBuiltIn "\<\(curren\|se\)t_logtalk_flag\ze("
+syn match logtalkBuiltIn "\<\(create\|current\|set\)_logtalk_flag\ze("
-syn match logtalkBuiltIn "\<logtalk_\(compile\|l\(ibrary_path\|oad\|oad_context\)\)\ze("
+syn match logtalkBuiltIn "\<logtalk_\(compile\|l\(ibrary_path\|oad\|oad_context\)\|make\(_target_action\)\?\)\ze("
+syn match logtalkBuiltIn "\<logtalk_make\>"
syn match logtalkBuiltIn "\<\(for\|retract\)all\ze("
syn match logtalkBuiltIn "\<threaded\(_\(call\|once\|ignore\|exit\|peek\|wait\|notify\)\)\?\ze("
+syn match logtalkBuiltIn "\<threaded_engine\(_\(create\|destroy\|self\|next\|next_reified\|yield\|post\|fetch\)\)\?\ze("
" Logtalk built-in methods
+syn match logtalkBuiltInMethod "\<context\ze("
syn match logtalkBuiltInMethod "\<parameter\ze("
syn match logtalkBuiltInMethod "\<se\(lf\|nder\)\ze("
syn match logtalkBuiltInMethod "\<this\ze("
@@ -162,6 +162,8 @@ syn match logtalkBuiltInMethod "\<f\(ind\|or\)all\ze("
syn match logtalkBuiltInMethod "\<before\ze("
syn match logtalkBuiltInMethod "\<after\ze("
+syn match logtalkBuiltInMethod "\<forward\ze("
+
syn match logtalkBuiltInMethod "\<expand_\(goal\|term\)\ze("
syn match logtalkBuiltInMethod "\<\(goal\|term\)_expansion\ze("
syn match logtalkBuiltInMethod "\<phrase\ze("
@@ -177,6 +179,7 @@ syn match logtalkOperator "@"
syn match logtalkKeyword "\<true\>"
syn match logtalkKeyword "\<fail\>"
+syn match logtalkKeyword "\<false\>"
syn match logtalkKeyword "\<ca\(ll\|tch\)\ze("
syn match logtalkOperator "!"
" syn match logtalkOperator ","
@@ -184,11 +187,14 @@ syn match logtalkOperator ";"
syn match logtalkOperator "-->"
syn match logtalkOperator "->"
syn match logtalkKeyword "\<throw\ze("
+syn match logtalkKeyword "\<\(instantiation\|system\)_error\>"
+syn match logtalkKeyword "\<\(type\|domain\|existence\|permission\|representation\|evaluation\|resource\|syntax\)_error\ze("
" Term unification
syn match logtalkOperator "="
+syn match logtalkKeyword "\<subsumes_term\ze("
syn match logtalkKeyword "\<unify_with_occurs_check\ze("
syn match logtalkOperator "\\="
@@ -202,6 +208,7 @@ syn match logtalkKeyword "\<float\ze("
syn match logtalkKeyword "\<c\(allable\|ompound\)\ze("
syn match logtalkKeyword "\<n\(onvar\|umber\)\ze("
syn match logtalkKeyword "\<ground\ze("
+syn match logtalkKeyword "\<acyclic_term\ze("
" Term comparison
@@ -222,14 +229,20 @@ syn match logtalkKeyword "\<arg\ze("
syn match logtalkOperator "=\.\."
syn match logtalkKeyword "\<copy_term\ze("
syn match logtalkKeyword "\<numbervars\ze("
+syn match logtalkKeyword "\<term_variables\ze("
+
+
+" Predicate aliases
+syn match logtalkOperator "\<as\>"
-" Arithemtic evaluation
+
+" Arithmetic evaluation
syn match logtalkOperator "\<is\>"
-" Arithemtic comparison
+" Arithmetic comparison
syn match logtalkOperator "=:="
syn match logtalkOperator "=\\="
@@ -302,16 +315,18 @@ syn match logtalkOperator "-"
syn match logtalkOperator "\*"
syn match logtalkOperator "//"
syn match logtalkOperator "/"
+syn match logtalkKeyword "\<div\ze("
syn match logtalkKeyword "\<r\(ound\|em\)\ze("
syn match logtalkKeyword "\<e\>"
syn match logtalkKeyword "\<pi\>"
+syn match logtalkKeyword "\<div\>"
syn match logtalkKeyword "\<rem\>"
-syn match logtalkKeyword "\<mod\ze("
+syn match logtalkKeyword "\<m\(ax\|in\|od\)\ze("
syn match logtalkKeyword "\<mod\>"
syn match logtalkKeyword "\<abs\ze("
syn match logtalkKeyword "\<sign\ze("
syn match logtalkKeyword "\<flo\(or\|at\(_\(integer\|fractional\)_part\)\?\)\ze("
-syn match logtalkKeyword "\<truncate\ze("
+syn match logtalkKeyword "\<t\(an\|runcate\)\ze("
syn match logtalkKeyword "\<ceiling\ze("
@@ -320,7 +335,7 @@ syn match logtalkKeyword "\<ceiling\ze("
syn match logtalkOperator "\*\*"
syn match logtalkKeyword "\<s\(in\|qrt\)\ze("
syn match logtalkKeyword "\<cos\ze("
-syn match logtalkKeyword "\<atan\ze("
+syn match logtalkKeyword "\<a\(cos\|sin\|tan\|tan2\)\ze("
syn match logtalkKeyword "\<exp\ze("
syn match logtalkKeyword "\<log\ze("
@@ -332,6 +347,7 @@ syn match logtalkOperator "<<"
syn match logtalkOperator "/\\"
syn match logtalkOperator "\\/"
syn match logtalkOperator "\\"
+syn match logtalkKeyword "\<xor\ze("
" Logtalk list operator
@@ -350,7 +366,7 @@ syn match logtalkNumber "\<\d\+\>"
syn match logtalkNumber "\<\d\+\.\d\+\>"
syn match logtalkNumber "\<\d\+[eE][-+]\=\d\+\>"
syn match logtalkNumber "\<\d\+\.\d\+[eE][-+]\=\d\+\>"
-syn match logtalkNumber "\<0'.\|0''\|0'\"\>"
+syn match logtalkNumber "\<0'[\\]\?.\|0''\|0'\"\>"
syn match logtalkNumber "\<0b[0-1]\+\>"
syn match logtalkNumber "\<0o\o\+\>"
syn match logtalkNumber "\<0x\x\+\>"
@@ -389,59 +405,47 @@ syn sync ccomment logtalkBlockComment maxlines=50
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-
-if version >= 508 || !exists("did_logtalk_syn_inits")
- if version < 508
- let did_logtalk_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink logtalkBlockComment Comment
- HiLink logtalkLineComment Comment
+hi def link logtalkBlockComment Comment
+hi def link logtalkLineComment Comment
- HiLink logtalkOpenEntityDir Normal
- HiLink logtalkOpenEntityDirTag PreProc
+hi def link logtalkOpenEntityDir Normal
+hi def link logtalkOpenEntityDirTag PreProc
- HiLink logtalkIfContainer PreProc
- HiLink logtalkIf PreProc
- HiLink logtalkElseIf PreProc
- HiLink logtalkElse PreProc
+hi def link logtalkIfContainer PreProc
+hi def link logtalkIf PreProc
+hi def link logtalkElseIf PreProc
+hi def link logtalkElse PreProc
- HiLink logtalkEntity Normal
+hi def link logtalkEntity Normal
- HiLink logtalkEntityRel Normal
- HiLink logtalkEntityRelTag PreProc
+hi def link logtalkEntityRel Normal
+hi def link logtalkEntityRelTag PreProc
- HiLink logtalkCloseEntityDir PreProc
+hi def link logtalkCloseEntityDir PreProc
- HiLink logtalkDir Normal
- HiLink logtalkDirTag PreProc
+hi def link logtalkDir Normal
+hi def link logtalkDirTag PreProc
- HiLink logtalkAtom String
- HiLink logtalkString String
- HiLink logtalkEscapeSequence SpecialChar
+hi def link logtalkAtom String
+hi def link logtalkString String
+hi def link logtalkEscapeSequence SpecialChar
- HiLink logtalkNumber Number
+hi def link logtalkNumber Number
- HiLink logtalkKeyword Keyword
+hi def link logtalkKeyword Keyword
- HiLink logtalkBuiltIn Keyword
- HiLink logtalkBuiltInMethod Keyword
+hi def link logtalkBuiltIn Keyword
+hi def link logtalkBuiltInMethod Keyword
- HiLink logtalkOperator Operator
+hi def link logtalkOperator Operator
- HiLink logtalkExtCall Normal
- HiLink logtalkExtCallTag Operator
+hi def link logtalkExtCall Normal
+hi def link logtalkExtCallTag Operator
- HiLink logtalkVariable Identifier
+hi def link logtalkVariable Identifier
- delcommand HiLink
-
-endif
let b:current_syntax = "logtalk"
diff --git a/runtime/syntax/lotos.vim b/runtime/syntax/lotos.vim
index 3cd83c4d86..8262e1d9ef 100644
--- a/runtime/syntax/lotos.vim
+++ b/runtime/syntax/lotos.vim
@@ -7,11 +7,8 @@
" I'm not sure I understand all of the syntax highlight language,
" but this file seems to do the job for standard LOTOS.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -56,26 +53,16 @@ syn keyword lotosType using
syn sync lines=250
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_lotos_syntax_inits")
- if version < 508
- let did_lotos_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink lotosStatement Statement
- HiLink lotosProcess Label
- HiLink lotosOperator Operator
- HiLink lotosSort Function
- HiLink lotosType Type
- HiLink lotosComment Comment
- HiLink lotosDelimiter String
+hi def link lotosStatement Statement
+hi def link lotosProcess Label
+hi def link lotosOperator Operator
+hi def link lotosSort Function
+hi def link lotosType Type
+hi def link lotosComment Comment
+hi def link lotosDelimiter String
- delcommand HiLink
-endif
let b:current_syntax = "lotos"
diff --git a/runtime/syntax/lout.vim b/runtime/syntax/lout.vim
index 9a34328ac3..30c87fce51 100644
--- a/runtime/syntax/lout.vim
+++ b/runtime/syntax/lout.vim
@@ -16,11 +16,8 @@
" See the discussion at http://thread.gmane.org/gmane.editors.vim.devel/32151
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -36,11 +33,7 @@ syn sync lines=1000
" Characters allowed in keywords
" I don't know if 128-255 are allowed in ANS-FORHT
-if version >= 600
- setlocal iskeyword=@,48-57,.,@-@,_,192-255
-else
- set iskeyword=@,48-57,.,@-@,_,192-255
-endif
+setlocal iskeyword=@,48-57,.,@-@,_,192-255
" Some special keywords
syn keyword loutTodo contained TODO lout Lout LOUT
@@ -106,44 +99,33 @@ syn region loutBoldItalic matchgroup=loutBIBraces start='@BI\s*{' matchgroup=lou
syn region loutHeadings matchgroup=loutHeads start='@\(\(Title\)\|\(Caption\)\)\s*{' matchgroup=loutHeads end='}' contains=ALLBUT,loutBraceError
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_lout_syn_inits")
- if version < 508
- let did_lout_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default methods for highlighting. Can be overrriden later.
- HiLink loutTodo Todo
- HiLink loutDefine Define
- HiLink loutEOmlDef Define
- HiLink loutFunction Function
- HiLink loutBraceError Error
- HiLink loutNULL Special
- HiLink loutComment Comment
- HiLink loutSpecial Special
- HiLink loutSymbols Character
- HiLink loutInclude Include
- HiLink loutKeyword Keyword
- HiLink loutTag Tag
- HiLink loutMath Number
-
- " HiLink Not really needed here, but I think it is more consistent.
- HiLink loutMBraces loutMath
- hi loutItalic term=italic cterm=italic gui=italic
- HiLink loutIBraces loutItalic
- hi loutBold term=bold cterm=bold gui=bold
- HiLink loutBBraces loutBold
- hi loutBoldItalic term=bold,italic cterm=bold,italic gui=bold,italic
- HiLink loutBIBraces loutBoldItalic
- hi loutHeadings term=bold cterm=bold guifg=indianred
- HiLink loutHeads loutHeadings
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+" The default methods for highlighting. Can be overrriden later.
+hi def link loutTodo Todo
+hi def link loutDefine Define
+hi def link loutEOmlDef Define
+hi def link loutFunction Function
+hi def link loutBraceError Error
+hi def link loutNULL Special
+hi def link loutComment Comment
+hi def link loutSpecial Special
+hi def link loutSymbols Character
+hi def link loutInclude Include
+hi def link loutKeyword Keyword
+hi def link loutTag Tag
+hi def link loutMath Number
+
+hi def link loutMBraces loutMath
+hi loutItalic term=italic cterm=italic gui=italic
+hi def link loutIBraces loutItalic
+hi loutBold term=bold cterm=bold gui=bold
+hi def link loutBBraces loutBold
+hi loutBoldItalic term=bold,italic cterm=bold,italic gui=bold,italic
+hi def link loutBIBraces loutBoldItalic
+hi loutHeadings term=bold cterm=bold guifg=indianred
+hi def link loutHeads loutHeadings
+
let b:current_syntax = "lout"
diff --git a/runtime/syntax/lpc.vim b/runtime/syntax/lpc.vim
index e948f3d70c..7d85fce8e2 100644
--- a/runtime/syntax/lpc.vim
+++ b/runtime/syntax/lpc.vim
@@ -2,18 +2,15 @@
" Language: LPC
" Maintainer: Shizhu Pan <poet@mudbuilder.net>
" URL: http://poet.tomud.com/pub/lpc.vim.bz2
-" Last Change: 2011 Dec 10 by Thilo Six
+" Last Change: 2016 Aug 31
" Comments: If you are using Vim 6.2 or later, see :h lpc.vim for
" file type recognizing, if not, you had to use modeline.
" Nodule: This is the start nodule. {{{1
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -360,94 +357,84 @@ endif
" Nodule: Highlight links {{{1
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_lpc_syn_inits")
- if version < 508
- let did_lpc_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
+
+hi def link lpcModifier lpcStorageClass
+
+hi def link lpcQuotedFmt lpcFormat
+hi def link lpcFormat lpcSpecial
+hi def link lpcCppString lpcString " Cpp means
+ " C Pre-Processor
+hi def link lpcCommentL lpcComment
+hi def link lpcCommentStart lpcComment
+hi def link lpcUserLabel lpcLabel
+hi def link lpcSpecialCharacter lpcSpecial
+hi def link lpcOctal lpcPreProc
+hi def link lpcOctalZero lpcSpecial " LPC will treat octal numbers
+ " as decimals, programmers should
+ " be aware of that.
+hi def link lpcEfunError lpcError
+hi def link lpcKeywdError lpcError
+hi def link lpcOctalError lpcError
+hi def link lpcParenError lpcError
+hi def link lpcErrInParen lpcError
+hi def link lpcErrInBracket lpcError
+hi def link lpcCommentError lpcError
+hi def link lpcCommentStartError lpcError
+hi def link lpcSpaceError lpcError
+hi def link lpcSpecialError lpcError
+hi def link lpcErrFunc lpcError
- HiLink lpcModifier lpcStorageClass
-
- HiLink lpcQuotedFmt lpcFormat
- HiLink lpcFormat lpcSpecial
- HiLink lpcCppString lpcString " Cpp means
- " C Pre-Processor
- HiLink lpcCommentL lpcComment
- HiLink lpcCommentStart lpcComment
- HiLink lpcUserLabel lpcLabel
- HiLink lpcSpecialCharacter lpcSpecial
- HiLink lpcOctal lpcPreProc
- HiLink lpcOctalZero lpcSpecial " LPC will treat octal numbers
- " as decimals, programmers should
- " be aware of that.
- HiLink lpcEfunError lpcError
- HiLink lpcKeywdError lpcError
- HiLink lpcOctalError lpcError
- HiLink lpcParenError lpcError
- HiLink lpcErrInParen lpcError
- HiLink lpcErrInBracket lpcError
- HiLink lpcCommentError lpcError
- HiLink lpcCommentStartError lpcError
- HiLink lpcSpaceError lpcError
- HiLink lpcSpecialError lpcError
- HiLink lpcErrFunc lpcError
-
- if exists("lpc_pre_v22")
- HiLink lpcOldEfuns lpc_efuns
- HiLink lpcNewEfuns lpcError
- else
- HiLink lpcOldEfuns lpcReserved
- HiLink lpcNewEfuns lpc_efuns
- endif
- HiLink lpc_efuns lpcFunction
-
- HiLink lpcReserved lpcPreProc
- HiLink lpcTextString lpcString " This should be preprocessors, but
- HiLink lpcArrayString lpcPreProc " let's make some difference
- " between text and array
-
- HiLink lpcIncluded lpcString
- HiLink lpcCommentString lpcString
- HiLink lpcComment2String lpcString
- HiLink lpcCommentSkip lpcComment
- HiLink lpcCommentFunc lpcComment
-
- HiLink lpcCppSkip lpcCppOut
- HiLink lpcCppOut2 lpcCppOut
- HiLink lpcCppOut lpcComment
-
- " Standard type below
- HiLink lpcApplies Special
- HiLink lpcCharacter Character
- HiLink lpcComment Comment
- HiLink lpcConditional Conditional
- HiLink lpcConstant Constant
- HiLink lpcDefine Macro
- HiLink lpcError Error
- HiLink lpcFloat Float
- HiLink lpcFunction Function
- HiLink lpcIdentifier Identifier
- HiLink lpcInclude Include
- HiLink lpcLabel Label
- HiLink lpcNumber Number
- HiLink lpcOperator Operator
- HiLink lpcPreCondit PreCondit
- HiLink lpcPreProc PreProc
- HiLink lpcRepeat Repeat
- HiLink lpcStatement Statement
- HiLink lpcStorageClass StorageClass
- HiLink lpcString String
- HiLink lpcStructure Structure
- HiLink lpcSpecial LineNr
- HiLink lpcTodo Todo
- HiLink lpcType Type
-
- delcommand HiLink
+if exists("lpc_pre_v22")
+ hi def link lpcOldEfuns lpc_efuns
+ hi def link lpcNewEfuns lpcError
+else
+ hi def link lpcOldEfuns lpcReserved
+ hi def link lpcNewEfuns lpc_efuns
endif
+hi def link lpc_efuns lpcFunction
+
+hi def link lpcReserved lpcPreProc
+hi def link lpcTextString lpcString " This should be preprocessors, but
+hi def link lpcArrayString lpcPreProc " let's make some difference
+ " between text and array
+
+hi def link lpcIncluded lpcString
+hi def link lpcCommentString lpcString
+hi def link lpcComment2String lpcString
+hi def link lpcCommentSkip lpcComment
+hi def link lpcCommentFunc lpcComment
+
+hi def link lpcCppSkip lpcCppOut
+hi def link lpcCppOut2 lpcCppOut
+hi def link lpcCppOut lpcComment
+
+" Standard type below
+hi def link lpcApplies Special
+hi def link lpcCharacter Character
+hi def link lpcComment Comment
+hi def link lpcConditional Conditional
+hi def link lpcConstant Constant
+hi def link lpcDefine Macro
+hi def link lpcError Error
+hi def link lpcFloat Float
+hi def link lpcFunction Function
+hi def link lpcIdentifier Identifier
+hi def link lpcInclude Include
+hi def link lpcLabel Label
+hi def link lpcNumber Number
+hi def link lpcOperator Operator
+hi def link lpcPreCondit PreCondit
+hi def link lpcPreProc PreProc
+hi def link lpcRepeat Repeat
+hi def link lpcStatement Statement
+hi def link lpcStorageClass StorageClass
+hi def link lpcString String
+hi def link lpcStructure Structure
+hi def link lpcSpecial LineNr
+hi def link lpcTodo Todo
+hi def link lpcType Type
+
" Nodule: This is the end nodule. {{{1
diff --git a/runtime/syntax/lprolog.vim b/runtime/syntax/lprolog.vim
index 086c00fd5d..85c3537fed 100644
--- a/runtime/syntax/lprolog.vim
+++ b/runtime/syntax/lprolog.vim
@@ -7,11 +7,8 @@
" 2001 Apr 26 - Upgraded for new Vim version
" 2000 Jun 5 - Initial release
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -96,41 +93,31 @@ syn sync maxlines=500
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_lprolog_syntax_inits")
- if version < 508
- let did_lprolog_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink lprologComment Comment
- HiLink lprologTodo Todo
-
- HiLink lprologKeyword Keyword
- HiLink lprologSpecial Special
- HiLink lprologOperator Operator
- HiLink lprologIdentifier Normal
-
- HiLink lprologInteger Number
- HiLink lprologReal Number
- HiLink lprologString String
-
- HiLink lprologCommentErr Error
- HiLink lprologBrackErr Error
- HiLink lprologParenErr Error
-
- HiLink lprologModuleName Special
- HiLink lprologTypeName Identifier
-
- HiLink lprologVariable Keyword
- HiLink lprologAtom Normal
- HiLink lprologClause Type
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link lprologComment Comment
+hi def link lprologTodo Todo
+
+hi def link lprologKeyword Keyword
+hi def link lprologSpecial Special
+hi def link lprologOperator Operator
+hi def link lprologIdentifier Normal
+
+hi def link lprologInteger Number
+hi def link lprologReal Number
+hi def link lprologString String
+
+hi def link lprologCommentErr Error
+hi def link lprologBrackErr Error
+hi def link lprologParenErr Error
+
+hi def link lprologModuleName Special
+hi def link lprologTypeName Identifier
+
+hi def link lprologVariable Keyword
+hi def link lprologAtom Normal
+hi def link lprologClause Type
+
let b:current_syntax = "lprolog"
diff --git a/runtime/syntax/lscript.vim b/runtime/syntax/lscript.vim
index 648a0ebeab..3c4a0fffda 100644
--- a/runtime/syntax/lscript.vim
+++ b/runtime/syntax/lscript.vim
@@ -9,11 +9,8 @@
" and b) I'm not so crash hot at LotusScript either. If you see any problems
" feel free to email me with them.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -179,34 +176,24 @@ syn region lscriptLineNumber start="^\d" end="\s"
syn match lscriptTypeSpecifier "[a-zA-Z0-9][\$%&!#]"ms=s+1
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_lscript_syntax_inits")
- if version < 508
- let did_lscript_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- hi lscriptNotesType term=underline ctermfg=DarkGreen guifg=SeaGreen gui=bold
-
- HiLink lscriptNotesConst lscriptNotesType
- HiLink lscriptLineNumber Comment
- HiLink lscriptDatatype Type
- HiLink lscriptNumber Number
- HiLink lscriptError Error
- HiLink lscriptStatement Statement
- HiLink lscriptString String
- HiLink lscriptComment Comment
- HiLink lscriptTodo Todo
- HiLink lscriptFunction Identifier
- HiLink lscriptMethods PreProc
- HiLink lscriptEvents Special
- HiLink lscriptTypeSpecifier Type
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi lscriptNotesType term=underline ctermfg=DarkGreen guifg=SeaGreen gui=bold
+
+hi def link lscriptNotesConst lscriptNotesType
+hi def link lscriptLineNumber Comment
+hi def link lscriptDatatype Type
+hi def link lscriptNumber Number
+hi def link lscriptError Error
+hi def link lscriptStatement Statement
+hi def link lscriptString String
+hi def link lscriptComment Comment
+hi def link lscriptTodo Todo
+hi def link lscriptFunction Identifier
+hi def link lscriptMethods PreProc
+hi def link lscriptEvents Special
+hi def link lscriptTypeSpecifier Type
+
let b:current_syntax = "lscript"
diff --git a/runtime/syntax/lss.vim b/runtime/syntax/lss.vim
index 6620707f92..6ee717bcb4 100644
--- a/runtime/syntax/lss.vim
+++ b/runtime/syntax/lss.vim
@@ -3,11 +3,8 @@
" Maintainer: Scott Bigham <dsb@killerbunnies.org>
" Last Change: 2004 Oct 06
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -70,64 +67,57 @@ syn case match
syn match lssComment "#.*$"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_lss_syntax_inits")
- if version < 508
- let did_lss_syntax_inits = 1
- endif
-
- hi def link lssComment Comment
- hi def link lssElement Identifier
-
- hi def lssBold term=bold cterm=bold
- hi def lssReverse term=reverse cterm=reverse
- hi def lssUnderline term=underline cterm=underline
- hi def lssStandout term=standout cterm=standout
-
- hi def lssRedFg ctermfg=red
- hi def lssBlueFg ctermfg=blue
- hi def lssGreenFg ctermfg=green
- hi def lssBrownFg ctermfg=brown
- hi def lssMagentaFg ctermfg=magenta
- hi def lssCyanFg ctermfg=cyan
- hi def lssGrayFg ctermfg=gray
- if $COLORTERM == "rxvt"
- " On rxvt's, bright colors are activated by setting the bold attribute.
- hi def lssLightgrayFg ctermfg=gray cterm=bold
- hi def lssBrightredFg ctermfg=red cterm=bold
- hi def lssBrightgreenFg ctermfg=green cterm=bold
- hi def lssYellowFg ctermfg=yellow cterm=bold
- hi def lssBrightblueFg ctermfg=blue cterm=bold
- hi def lssBrightmagentaFg ctermfg=magenta cterm=bold
- hi def lssBrightcyanFg ctermfg=cyan cterm=bold
- else
- hi def lssLightgrayFg ctermfg=lightgray
- hi def lssBrightredFg ctermfg=lightred
- hi def lssBrightgreenFg ctermfg=lightgreen
- hi def lssYellowFg ctermfg=yellow
- hi def lssBrightblueFg ctermfg=lightblue
- hi def lssBrightmagentaFg ctermfg=lightmagenta
- hi def lssBrightcyanFg ctermfg=lightcyan
- endif
-
- hi def lssRedBg ctermbg=red
- hi def lssBlueBg ctermbg=blue
- hi def lssGreenBg ctermbg=green
- hi def lssBrownBg ctermbg=brown
- hi def lssMagentaBg ctermbg=magenta
- hi def lssCyanBg ctermbg=cyan
- hi def lssLightgrayBg ctermbg=lightgray
- hi def lssGrayBg ctermbg=gray
- hi def lssBrightredBg ctermbg=lightred
- hi def lssBrightgreenBg ctermbg=lightgreen
- hi def lssYellowBg ctermbg=yellow
- hi def lssBrightblueBg ctermbg=lightblue
- hi def lssBrightmagentaBg ctermbg=lightmagenta
- hi def lssBrightcyanBg ctermbg=lightcyan
- hi def lssWhiteBg ctermbg=white ctermfg=black
+" Only when an item doesn't have highlighting yet
+hi def link lssComment Comment
+hi def link lssElement Identifier
+
+hi def lssBold term=bold cterm=bold
+hi def lssReverse term=reverse cterm=reverse
+hi def lssUnderline term=underline cterm=underline
+hi def lssStandout term=standout cterm=standout
+
+hi def lssRedFg ctermfg=red
+hi def lssBlueFg ctermfg=blue
+hi def lssGreenFg ctermfg=green
+hi def lssBrownFg ctermfg=brown
+hi def lssMagentaFg ctermfg=magenta
+hi def lssCyanFg ctermfg=cyan
+hi def lssGrayFg ctermfg=gray
+if $COLORTERM == "rxvt"
+ " On rxvt's, bright colors are activated by setting the bold attribute.
+ hi def lssLightgrayFg ctermfg=gray cterm=bold
+ hi def lssBrightredFg ctermfg=red cterm=bold
+ hi def lssBrightgreenFg ctermfg=green cterm=bold
+ hi def lssYellowFg ctermfg=yellow cterm=bold
+ hi def lssBrightblueFg ctermfg=blue cterm=bold
+ hi def lssBrightmagentaFg ctermfg=magenta cterm=bold
+ hi def lssBrightcyanFg ctermfg=cyan cterm=bold
+else
+ hi def lssLightgrayFg ctermfg=lightgray
+ hi def lssBrightredFg ctermfg=lightred
+ hi def lssBrightgreenFg ctermfg=lightgreen
+ hi def lssYellowFg ctermfg=yellow
+ hi def lssBrightblueFg ctermfg=lightblue
+ hi def lssBrightmagentaFg ctermfg=lightmagenta
+ hi def lssBrightcyanFg ctermfg=lightcyan
endif
+hi def lssRedBg ctermbg=red
+hi def lssBlueBg ctermbg=blue
+hi def lssGreenBg ctermbg=green
+hi def lssBrownBg ctermbg=brown
+hi def lssMagentaBg ctermbg=magenta
+hi def lssCyanBg ctermbg=cyan
+hi def lssLightgrayBg ctermbg=lightgray
+hi def lssGrayBg ctermbg=gray
+hi def lssBrightredBg ctermbg=lightred
+hi def lssBrightgreenBg ctermbg=lightgreen
+hi def lssYellowBg ctermbg=yellow
+hi def lssBrightblueBg ctermbg=lightblue
+hi def lssBrightmagentaBg ctermbg=lightmagenta
+hi def lssBrightcyanBg ctermbg=lightcyan
+hi def lssWhiteBg ctermbg=white ctermfg=black
+
let b:current_syntax = "lss"
" vim: ts=8
diff --git a/runtime/syntax/lua.vim b/runtime/syntax/lua.vim
index 3ff80b1ebe..f313c14e7a 100644
--- a/runtime/syntax/lua.vim
+++ b/runtime/syntax/lua.vim
@@ -7,11 +7,8 @@
" lua_subversion = 0 (4.0, 5.0) or 1 (5.1) or 2 (5.2)
" default 5.2
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -325,40 +322,30 @@ elseif lua_version == 5
endif
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_lua_syntax_inits")
- if version < 508
- let did_lua_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink luaStatement Statement
- HiLink luaRepeat Repeat
- HiLink luaFor Repeat
- HiLink luaString String
- HiLink luaString2 String
- HiLink luaNumber Number
- HiLink luaOperator Operator
- HiLink luaIn Operator
- HiLink luaConstant Constant
- HiLink luaCond Conditional
- HiLink luaElse Conditional
- HiLink luaFunction Function
- HiLink luaComment Comment
- HiLink luaTodo Todo
- HiLink luaTable Structure
- HiLink luaError Error
- HiLink luaParenError Error
- HiLink luaBraceError Error
- HiLink luaSpecial SpecialChar
- HiLink luaFunc Identifier
- HiLink luaLabel Label
+hi def link luaStatement Statement
+hi def link luaRepeat Repeat
+hi def link luaFor Repeat
+hi def link luaString String
+hi def link luaString2 String
+hi def link luaNumber Number
+hi def link luaOperator Operator
+hi def link luaIn Operator
+hi def link luaConstant Constant
+hi def link luaCond Conditional
+hi def link luaElse Conditional
+hi def link luaFunction Function
+hi def link luaComment Comment
+hi def link luaTodo Todo
+hi def link luaTable Structure
+hi def link luaError Error
+hi def link luaParenError Error
+hi def link luaBraceError Error
+hi def link luaSpecial SpecialChar
+hi def link luaFunc Identifier
+hi def link luaLabel Label
- delcommand HiLink
-endif
let b:current_syntax = "lua"
diff --git a/runtime/syntax/m4.vim b/runtime/syntax/m4.vim
index ba7a294d14..6f229ea1ab 100644
--- a/runtime/syntax/m4.vim
+++ b/runtime/syntax/m4.vim
@@ -8,15 +8,12 @@
" capital letters and have at least one argument (i.e. the '('
" must be there). Let me know if this is a problem.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
+" quit when a syntax file was already loaded
if !exists("main_syntax")
- if version < 600
- syntax clear
- elseif exists("b:current_syntax")
- finish
-endif
-" we define it here so that included files can test for it
+ if exists("b:current_syntax")
+ finish
+ endif
+ " we define it here so that included files can test for it
let main_syntax='m4'
endif
@@ -39,30 +36,20 @@ syn region m4String start="`" end="'" contained contains=@m4Top,@m4StringConte
syn cluster m4Top contains=m4Comment,m4Constants,m4Special,m4Variable,m4String,m4Paren,m4Command,m4Statement,m4Function
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_m4_syn_inits")
- if version < 508
- let did_m4_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink m4Delimiter Delimiter
- HiLink m4Comment Comment
- HiLink m4Function Function
- HiLink m4Keyword Keyword
- HiLink m4Special Special
- HiLink m4String String
- HiLink m4Statement Statement
- HiLink m4Preproc PreProc
- HiLink m4Type Type
- HiLink m4Special Special
- HiLink m4Variable Special
- HiLink m4Constants Constant
- HiLink m4Builtin Statement
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+hi def link m4Delimiter Delimiter
+hi def link m4Comment Comment
+hi def link m4Function Function
+hi def link m4Keyword Keyword
+hi def link m4Special Special
+hi def link m4String String
+hi def link m4Statement Statement
+hi def link m4Preproc PreProc
+hi def link m4Type Type
+hi def link m4Special Special
+hi def link m4Variable Special
+hi def link m4Constants Constant
+hi def link m4Builtin Statement
let b:current_syntax = "m4"
diff --git a/runtime/syntax/mailaliases.vim b/runtime/syntax/mailaliases.vim
index 743068f66f..a5282aa074 100644
--- a/runtime/syntax/mailaliases.vim
+++ b/runtime/syntax/mailaliases.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: aliases(5) local alias database file
-" Maintainer: Nikolai Weibull <nikolai@bitwi.se>
-" Latest Revision: 2008-04-14
+" Language: aliases(5) local alias database file
+" Previous Maintainer: Nikolai Weibull <nikolai@bitwi.se>
+" Latest Revision: 2008-04-14
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/make.vim b/runtime/syntax/make.vim
index 35b09341a6..7072bab988 100644
--- a/runtime/syntax/make.vim
+++ b/runtime/syntax/make.vim
@@ -4,11 +4,8 @@
" URL: http://www.fleiner.com/vim/syntax/make.vim
" Last Change: 2015 Feb 28
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -101,40 +98,30 @@ syn sync match makeCommandSync groupthere makeCommands "^[A-Za-z0-9_./$()%-][A-Z
syn sync match makeCommandSync groupthere makeCommands "^[A-Za-z0-9_./$()%-][A-Za-z0-9_./\t $()%-]*:\{1,2}\s*$"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_make_syn_inits")
- if version < 508
- let did_make_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink makeNextLine makeSpecial
- HiLink makeCmdNextLine makeSpecial
- HiLink makeSpecTarget Statement
- if !exists("make_no_commands")
- HiLink makeCommands Number
- endif
- HiLink makeImplicit Function
- HiLink makeTarget Function
- HiLink makeInclude Include
- HiLink makePreCondit PreCondit
- HiLink makeStatement Statement
- HiLink makeIdent Identifier
- HiLink makeSpecial Special
- HiLink makeComment Comment
- HiLink makeDString String
- HiLink makeSString String
- HiLink makeBString Function
- HiLink makeError Error
- HiLink makeTodo Todo
- HiLink makeDefine Define
- HiLink makeCommandError Error
- HiLink makeConfig PreCondit
- delcommand HiLink
+" Only when an item doesn't have highlighting yet
+
+hi def link makeNextLine makeSpecial
+hi def link makeCmdNextLine makeSpecial
+hi def link makeSpecTarget Statement
+if !exists("make_no_commands")
+hi def link makeCommands Number
endif
+hi def link makeImplicit Function
+hi def link makeTarget Function
+hi def link makeInclude Include
+hi def link makePreCondit PreCondit
+hi def link makeStatement Statement
+hi def link makeIdent Identifier
+hi def link makeSpecial Special
+hi def link makeComment Comment
+hi def link makeDString String
+hi def link makeSString String
+hi def link makeBString Function
+hi def link makeError Error
+hi def link makeTodo Todo
+hi def link makeDefine Define
+hi def link makeCommandError Error
+hi def link makeConfig PreCondit
let b:current_syntax = "make"
diff --git a/runtime/syntax/man.vim b/runtime/syntax/man.vim
index fbc1847e6e..6afe56a6e3 100644
--- a/runtime/syntax/man.vim
+++ b/runtime/syntax/man.vim
@@ -1,67 +1,59 @@
-" Vim syntax file
-" Language: Man page
-" Maintainer: SungHyun Nam <goweol@gmail.com>
-" Previous Maintainer: Gautam H. Mudunuri <gmudunur@informatica.com>
-" Version Info:
-" Last Change: 2015 Nov 24
+" Maintainer: Anmol Sethi <anmol@aubble.com>
+" Previous Maintainer: SungHyun Nam <goweol@gmail.com>
-" Additional highlighting by Johannes Tanzler <johannes.tanzler@aon.at>:
-" * manSubHeading
-" * manSynopsis (only for sections 2 and 3)
-
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+if exists('b:current_syntax')
finish
endif
-" Get the CTRL-H syntax to handle backspaced text
-if version >= 600
- runtime! syntax/ctrlh.vim
-else
- source <sfile>:p:h/ctrlh.vim
+syntax case ignore
+syntax match manReference display '[^()[:space:]]\+([0-9nx][a-z]*)'
+syntax match manSectionHeading display '^\S.*$'
+syntax match manTitle display '^\%1l.*$'
+syntax match manSubHeading display '^ \{3\}\S.*$'
+syntax match manOptionDesc display '^\s\+\%(+\|-\)\S\+'
+
+highlight default link manTitle Title
+highlight default link manSectionHeading Statement
+highlight default link manOptionDesc Constant
+highlight default link manReference PreProc
+highlight default link manSubHeading Function
+
+highlight default manUnderline cterm=underline gui=underline
+highlight default manBold cterm=bold gui=bold
+highlight default manItalic cterm=italic gui=italic
+
+if &filetype != 'man'
+ " May have been included by some other filetype.
+ finish
endif
-syn case ignore
-syn match manReference "\f\+([1-9][a-z]\=)"
-syn match manTitle "^\f\+([0-9]\+[a-z]\=).*"
-syn match manSectionHeading "^[a-z][a-z -]*[a-z]$"
-syn match manSubHeading "^\s\{3\}[a-z][a-z -]*[a-z]$"
-syn match manOptionDesc "^\s*[+-][a-z0-9]\S*"
-syn match manLongOptionDesc "^\s*--[a-z0-9-]\S*"
-" syn match manHistory "^[a-z].*last change.*$"
-
-if getline(1) =~ '^[a-zA-Z_]\+([23])'
- syntax include @cCode <sfile>:p:h/c.vim
- syn match manCFuncDefinition display "\<\h\w*\>\s*("me=e-1 contained
- syn region manSynopsis start="^SYNOPSIS"hs=s+8 end="^\u\+\s*$"me=e-12 keepend contains=manSectionHeading,@cCode,manCFuncDefinition
+if !exists('b:man_sect')
+ call man#init_pager()
endif
-
-
-" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_man_syn_inits")
- if version < 508
- let did_man_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink manTitle Title
- HiLink manSectionHeading Statement
- HiLink manOptionDesc Constant
- HiLink manLongOptionDesc Constant
- HiLink manReference PreProc
- HiLink manSubHeading Function
- HiLink manCFuncDefinition Function
-
- delcommand HiLink
+if b:man_sect =~# '^[023]'
+ syntax case match
+ syntax include @c $VIMRUNTIME/syntax/c.vim
+ syntax match manCFuncDefinition display '\<\h\w*\>\ze\(\s\|\n\)*(' contained
+ syntax match manLowerSentence /\n\s\{7}\l.\+[()]\=\%(\:\|.\|-\)[()]\=[{};]\@<!\n$/ display keepend contained contains=manReference
+ syntax region manSentence start=/^\s\{7}\%(\u\|\*\)[^{}=]*/ end=/\n$/ end=/\ze\n\s\{3,7}#/ keepend contained contains=manReference
+ syntax region manSynopsis start='^\%(
+ \SYNOPSIS\|
+ \SYNTAX\|
+ \SINTASSI\|
+ \SKลADNIA\|
+ \ะกะ˜ะะขะะšะกะ˜ะก\|
+ \ๆ›ธๅผ\)$' end='^\%(\S.*\)\=\S$' keepend contains=manLowerSentence,manSentence,manSectionHeading,@c,manCFuncDefinition
+ highlight default link manCFuncDefinition Function
+
+ syntax region manExample start='^EXAMPLES\=$' end='^\%(\S.*\)\=\S$' keepend contains=manLowerSentence,manSentence,manSectionHeading,manSubHeading,@c,manCFuncDefinition
+
+ " XXX: groupthere doesn't seem to work
+ syntax sync minlines=500
+ "syntax sync match manSyncExample groupthere manExample '^EXAMPLES\=$'
+ "syntax sync match manSyncExample groupthere NONE '^\%(EXAMPLES\=\)\@!\%(\S.*\)\=\S$'
endif
-let b:current_syntax = "man"
+" Prevent everything else from matching the last line
+execute 'syntax match manFooter display "^\%'.line('$').'l.*$"'
-" vim:ts=8 sts=2 sw=2:
+let b:current_syntax = 'man'
diff --git a/runtime/syntax/manconf.vim b/runtime/syntax/manconf.vim
index 90ecc8ec17..2c17568d87 100644
--- a/runtime/syntax/manconf.vim
+++ b/runtime/syntax/manconf.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: man.conf(5) - man configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: man.conf(5) - man configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/maple.vim b/runtime/syntax/maple.vim
index 9a4db26dd8..1261ff5a47 100644
--- a/runtime/syntax/maple.vim
+++ b/runtime/syntax/maple.vim
@@ -1,8 +1,8 @@
" Vim syntax file
" Language: Maple V (based on release 4)
" Maintainer: Charles E. Campbell <NdrOchipS@PcampbellAfamily.Mbiz>
-" Last Change: Jan 20, 2016
-" Version: 12
+" Last Change: Aug 31, 2016
+" Version: 15
" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_MAPLE
"
" Package Function Selection: {{{1
@@ -21,16 +21,13 @@
" but only the contents of packages of Maple V Release 4, and the top-level
" routines of Release 4. <Jacques Carette - carette@mcmaster.ca>
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" Iskeyword Effects: {{{1
-if !has("patch-7.4.1141")
+if !has("patch-7.4.1142")
setl isk=$,48-57,_,a-z,@-Z
else
syn iskeyword $,48-57,_,a-z,@-Z
@@ -551,81 +548,73 @@ endif
" =====================================================================
" Highlighting: Define the default highlighting. {{{1
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_maplev_syntax_inits")
- if version < 508
- let did_maplev_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
+if !exists("skip_maplev_syntax_inits")
" Maple->Maple Links {{{2
- HiLink mvBraceError mvError
- HiLink mvCurlyError mvError
- HiLink mvDebug mvTodo
- HiLink mvParenError mvError
- HiLink mvPkg_DEtools mvPkgFunc
- HiLink mvPkg_Galois mvPkgFunc
- HiLink mvPkg_GaussInt mvPkgFunc
- HiLink mvPkg_LREtools mvPkgFunc
- HiLink mvPkg_combinat mvPkgFunc
- HiLink mvPkg_combstruct mvPkgFunc
- HiLink mvPkg_difforms mvPkgFunc
- HiLink mvPkg_finance mvPkgFunc
- HiLink mvPkg_genfunc mvPkgFunc
- HiLink mvPkg_geometry mvPkgFunc
- HiLink mvPkg_grobner mvPkgFunc
- HiLink mvPkg_group mvPkgFunc
- HiLink mvPkg_inttrans mvPkgFunc
- HiLink mvPkg_liesymm mvPkgFunc
- HiLink mvPkg_linalg mvPkgFunc
- HiLink mvPkg_logic mvPkgFunc
- HiLink mvPkg_networks mvPkgFunc
- HiLink mvPkg_numapprox mvPkgFunc
- HiLink mvPkg_numtheory mvPkgFunc
- HiLink mvPkg_orthopoly mvPkgFunc
- HiLink mvPkg_padic mvPkgFunc
- HiLink mvPkg_plots mvPkgFunc
- HiLink mvPkg_plottools mvPkgFunc
- HiLink mvPkg_powseries mvPkgFunc
- HiLink mvPkg_process mvPkgFunc
- HiLink mvPkg_simplex mvPkgFunc
- HiLink mvPkg_stats mvPkgFunc
- HiLink mvPkg_student mvPkgFunc
- HiLink mvPkg_sumtools mvPkgFunc
- HiLink mvPkg_tensor mvPkgFunc
- HiLink mvPkg_totorder mvPkgFunc
- HiLink mvRange mvOper
- HiLink mvSemiError mvError
- HiLink mvDelim Delimiter
+ hi def link mvBraceError mvError
+ hi def link mvCurlyError mvError
+ hi def link mvDebug mvTodo
+ hi def link mvParenError mvError
+ hi def link mvPkg_DEtools mvPkgFunc
+ hi def link mvPkg_Galois mvPkgFunc
+ hi def link mvPkg_GaussInt mvPkgFunc
+ hi def link mvPkg_LREtools mvPkgFunc
+ hi def link mvPkg_combinat mvPkgFunc
+ hi def link mvPkg_combstruct mvPkgFunc
+ hi def link mvPkg_difforms mvPkgFunc
+ hi def link mvPkg_finance mvPkgFunc
+ hi def link mvPkg_genfunc mvPkgFunc
+ hi def link mvPkg_geometry mvPkgFunc
+ hi def link mvPkg_grobner mvPkgFunc
+ hi def link mvPkg_group mvPkgFunc
+ hi def link mvPkg_inttrans mvPkgFunc
+ hi def link mvPkg_liesymm mvPkgFunc
+ hi def link mvPkg_linalg mvPkgFunc
+ hi def link mvPkg_logic mvPkgFunc
+ hi def link mvPkg_networks mvPkgFunc
+ hi def link mvPkg_numapprox mvPkgFunc
+ hi def link mvPkg_numtheory mvPkgFunc
+ hi def link mvPkg_orthopoly mvPkgFunc
+ hi def link mvPkg_padic mvPkgFunc
+ hi def link mvPkg_plots mvPkgFunc
+ hi def link mvPkg_plottools mvPkgFunc
+ hi def link mvPkg_powseries mvPkgFunc
+ hi def link mvPkg_process mvPkgFunc
+ hi def link mvPkg_simplex mvPkgFunc
+ hi def link mvPkg_stats mvPkgFunc
+ hi def link mvPkg_student mvPkgFunc
+ hi def link mvPkg_sumtools mvPkgFunc
+ hi def link mvPkg_tensor mvPkgFunc
+ hi def link mvPkg_totorder mvPkgFunc
+ hi def link mvRange mvOper
+ hi def link mvSemiError mvError
+ hi def link mvDelim Delimiter
" Maple->Standard Links {{{2
- HiLink mvAssign Delimiter
- HiLink mvBool Boolean
- HiLink mvComma Delimiter
- HiLink mvComment Comment
- HiLink mvCond Conditional
- HiLink mvConstant Number
- HiLink mvDelayEval Label
- HiLink mvDcolon Delimiter
- HiLink mvError Error
- HiLink mvLibrary Statement
- HiLink mvNumber Number
- HiLink mvOper Operator
- HiLink mvAssign Delimiter
- HiLink mvPackage Type
- HiLink mvPkgFunc Function
- HiLink mvPktOption Special
- HiLink mvRepeat Repeat
- HiLink mvSpecial Special
- HiLink mvStatement Statement
- HiLink mvName String
- HiLink mvString String
- HiLink mvTodo Todo
-
- delcommand HiLink
+ hi def link mvAssign Delimiter
+ hi def link mvBool Boolean
+ hi def link mvComma Delimiter
+ hi def link mvComment Comment
+ hi def link mvCond Conditional
+ hi def link mvConstant Number
+ hi def link mvDelayEval Label
+ hi def link mvDcolon Delimiter
+ hi def link mvError Error
+ hi def link mvLibrary Statement
+ hi def link mvNumber Number
+ hi def link mvOper Operator
+ hi def link mvAssign Delimiter
+ hi def link mvPackage Type
+ hi def link mvPkgFunc Function
+ hi def link mvPktOption Special
+ hi def link mvRepeat Repeat
+ hi def link mvSpecial Special
+ hi def link mvStatement Statement
+ hi def link mvName String
+ hi def link mvString String
+ hi def link mvTodo Todo
+
endif
" Current Syntax: {{{1
diff --git a/runtime/syntax/markdown.vim b/runtime/syntax/markdown.vim
index 068115e92d..1955a7443e 100644
--- a/runtime/syntax/markdown.vim
+++ b/runtime/syntax/markdown.vim
@@ -2,7 +2,7 @@
" Language: Markdown
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
" Filenames: *.markdown
-" Last Change: 2013 May 30
+" Last Change: 2016 Aug 29
if exists("b:current_syntax")
finish
@@ -70,29 +70,34 @@ syn region markdownUrlTitle matchgroup=markdownUrlTitleDelimiter start=+"+ end=+
syn region markdownUrlTitle matchgroup=markdownUrlTitleDelimiter start=+'+ end=+'+ keepend contained
syn region markdownUrlTitle matchgroup=markdownUrlTitleDelimiter start=+(+ end=+)+ keepend contained
-syn region markdownLinkText matchgroup=markdownLinkTextDelimiter start="!\=\[\%(\_[^]]*]\%( \=[[(]\)\)\@=" end="\]\%( \=[[(]\)\@=" keepend nextgroup=markdownLink,markdownId skipwhite contains=@markdownInline,markdownLineStart
+syn region markdownLinkText matchgroup=markdownLinkTextDelimiter start="!\=\[\%(\_[^]]*]\%( \=[[(]\)\)\@=" end="\]\%( \=[[(]\)\@=" nextgroup=markdownLink,markdownId skipwhite contains=@markdownInline,markdownLineStart
syn region markdownLink matchgroup=markdownLinkDelimiter start="(" end=")" contains=markdownUrl keepend contained
syn region markdownId matchgroup=markdownIdDelimiter start="\[" end="\]" keepend contained
syn region markdownAutomaticLink matchgroup=markdownUrlDelimiter start="<\%(\w\+:\|[[:alnum:]_+-]\+@\)\@=" end=">" keepend oneline
-syn region markdownItalic start="\S\@<=\*\|\*\S\@=" end="\S\@<=\*\|\*\S\@=" keepend contains=markdownLineStart
-syn region markdownItalic start="\S\@<=_\|_\S\@=" end="\S\@<=_\|_\S\@=" keepend contains=markdownLineStart
-syn region markdownBold start="\S\@<=\*\*\|\*\*\S\@=" end="\S\@<=\*\*\|\*\*\S\@=" keepend contains=markdownLineStart,markdownItalic
-syn region markdownBold start="\S\@<=__\|__\S\@=" end="\S\@<=__\|__\S\@=" keepend contains=markdownLineStart,markdownItalic
-syn region markdownBoldItalic start="\S\@<=\*\*\*\|\*\*\*\S\@=" end="\S\@<=\*\*\*\|\*\*\*\S\@=" keepend contains=markdownLineStart
-syn region markdownBoldItalic start="\S\@<=___\|___\S\@=" end="\S\@<=___\|___\S\@=" keepend contains=markdownLineStart
+let s:concealends = has('conceal') ? ' concealends' : ''
+exe 'syn region markdownItalic matchgroup=markdownItalicDelimiter start="\S\@<=\*\|\*\S\@=" end="\S\@<=\*\|\*\S\@=" keepend contains=markdownLineStart' . s:concealends
+exe 'syn region markdownItalic matchgroup=markdownItalicDelimiter start="\S\@<=_\|_\S\@=" end="\S\@<=_\|_\S\@=" keepend contains=markdownLineStart' . s:concealends
+exe 'syn region markdownBold matchgroup=markdownBoldDelimiter start="\S\@<=\*\*\|\*\*\S\@=" end="\S\@<=\*\*\|\*\*\S\@=" keepend contains=markdownLineStart,markdownItalic' . s:concealends
+exe 'syn region markdownBold matchgroup=markdownBoldDelimiter start="\S\@<=__\|__\S\@=" end="\S\@<=__\|__\S\@=" keepend contains=markdownLineStart,markdownItalic' . s:concealends
+exe 'syn region markdownBoldItalic matchgroup=markdownBoldItalicDelimiter start="\S\@<=\*\*\*\|\*\*\*\S\@=" end="\S\@<=\*\*\*\|\*\*\*\S\@=" keepend contains=markdownLineStart' . s:concealends
+exe 'syn region markdownBoldItalic matchgroup=markdownBoldItalicDelimiter start="\S\@<=___\|___\S\@=" end="\S\@<=___\|___\S\@=" keepend contains=markdownLineStart' . s:concealends
+
syn region markdownCode matchgroup=markdownCodeDelimiter start="`" end="`" keepend contains=markdownLineStart
syn region markdownCode matchgroup=markdownCodeDelimiter start="`` \=" end=" \=``" keepend contains=markdownLineStart
syn region markdownCode matchgroup=markdownCodeDelimiter start="^\s*```.*$" end="^\s*```\ze\s*$" keepend
+syn match markdownFootnote "\[^[^\]]\+\]"
+syn match markdownFootnoteDefinition "^\[^[^\]]\+\]:"
+
if main_syntax ==# 'markdown'
for s:type in g:markdown_fenced_languages
- exe 'syn region markdownHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\..*','','').' matchgroup=markdownCodeDelimiter start="^\s*```'.matchstr(s:type,'[^=]*').'\>.*$" end="^\s*```\ze\s*$" keepend contains=@markdownHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\.','','g')
+ exe 'syn region markdownHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\..*','','').' matchgroup=markdownCodeDelimiter start="^\s*```\s*'.matchstr(s:type,'[^=]*').'\>.*$" end="^\s*```\ze\s*$" keepend contains=@markdownHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\.','','g')
endfor
unlet! s:type
endif
-syn match markdownEscape "\\[][\\`*_{}()#+.!-]"
+syn match markdownEscape "\\[][\\`*_{}()<>#+.!-]"
syn match markdownError "\w\@<=_\w\@="
hi def link markdownH1 htmlH1
@@ -108,6 +113,9 @@ hi def link markdownListMarker htmlTagName
hi def link markdownBlockquote Comment
hi def link markdownRule PreProc
+hi def link markdownFootnote Typedef
+hi def link markdownFootnoteDefinition Typedef
+
hi def link markdownLinkText htmlLink
hi def link markdownIdDeclaration Typedef
hi def link markdownId Type
@@ -119,8 +127,11 @@ hi def link markdownUrlDelimiter htmlTag
hi def link markdownUrlTitleDelimiter Delimiter
hi def link markdownItalic htmlItalic
+hi def link markdownItalicDelimiter markdownItalic
hi def link markdownBold htmlBold
+hi def link markdownBoldDelimiter markdownBold
hi def link markdownBoldItalic htmlBoldItalic
+hi def link markdownBoldItalicDelimiter markdownBoldItalic
hi def link markdownCodeDelimiter Delimiter
hi def link markdownEscape Special
diff --git a/runtime/syntax/mason.vim b/runtime/syntax/mason.vim
index 40bdb0eaa4..f087def794 100644
--- a/runtime/syntax/mason.vim
+++ b/runtime/syntax/mason.vim
@@ -1,24 +1,18 @@
" Vim syntax file
-" Language: Mason (Perl embedded in HTML)
-" Maintainer: Andrew Smith <andrewdsmith@yahoo.com>
-" Last change: 2003 May 11
-" URL: http://www.masonhq.com/editors/mason.vim
+" Language: Mason (Perl embedded in HTML)
+" Maintainer: vim-perl <vim-perl@googlegroups.com>
+" Homepage: http://github.com/vim-perl/vim-perl/tree/master
+" Bugs/requests: http://github.com/vim-perl/vim-perl/issues
+" Last Change: 2017-09-12
+" Contributors: Hinrik ร–rn Sigurรฐsson <hinrik.sig@gmail.com>
+" Andrew Smith <andrewdsmith@yahoo.com>
"
-" This seems to work satisfactorily with html.vim and perl.vim for version 5.5.
-" Please mail any fixes or improvements to the above address. Things that need
-" doing include:
-"
-" - Add match for component names in <& &> blocks.
-" - Add match for component names in <%def> and <%method> block delimiters.
+" TODO:
" - Fix <%text> blocks to show HTML tags but ignore Mason tags.
"
-" Clear previous syntax settings unless this is v6 or above, in which case just
-" exit without doing anything.
-"
-if version < 600
- syn clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -30,46 +24,46 @@ endif
" First pull in the HTML syntax.
"
-if version < 600
- so <sfile>:p:h/html.vim
-else
- runtime! syntax/html.vim
- unlet b:current_syntax
-endif
+runtime! syntax/html.vim
+unlet b:current_syntax
syn cluster htmlPreproc add=@masonTop
" Now pull in the Perl syntax.
"
-if version < 600
- syn include @perlTop <sfile>:p:h/perl.vim
-else
- syn include @perlTop syntax/perl.vim
-endif
+syn include @perlTop syntax/perl.vim
+unlet b:current_syntax
+syn include @podTop syntax/pod.vim
" It's hard to reduce down to the correct sub-set of Perl to highlight in some
" of these cases so I've taken the safe option of just using perlTop in all of
" them. If you have any suggestions, please let me know.
"
-syn region masonLine matchgroup=Delimiter start="^%" end="$" contains=@perlTop
-syn region masonExpr matchgroup=Delimiter start="<%" end="%>" contains=@perlTop
-syn region masonPerl matchgroup=Delimiter start="<%perl>" end="</%perl>" contains=@perlTop
-syn region masonComp keepend matchgroup=Delimiter start="<&" end="&>" contains=@perlTop
+syn region masonPod start="^=[a-z]" end="^=cut" keepend contained contains=@podTop
+syn cluster perlTop remove=perlBraces
+syn region masonLine matchgroup=Delimiter start="^%" end="$" keepend contains=@perlTop
+syn region masonPerlComment start="#" end="\%(%>\)\@=\|$" contained contains=perlTodo,@Spell
+syn region masonExpr matchgroup=Delimiter start="<%" end="%>" contains=@perlTop,masonPerlComment
+syn region masonPerl matchgroup=Delimiter start="<%perl>" end="</%perl>" contains=masonPod,@perlTop
+syn region masonComp keepend matchgroup=Delimiter start="<&\s*\%([-._/[:alnum:]]\+:\)\?[-._/[:alnum:]]*" end="&>" contains=@perlTop
+syn region masonComp keepend matchgroup=Delimiter skipnl start="<&|\s*\%([-._/[:alnum:]]\+:\)\?[-._/[:alnum:]]*" end="&>" contains=@perlTop nextgroup=masonCompContent
+syn region masonCompContent matchgroup=Delimiter start="" end="</&>" contained contains=@masonTop
-syn region masonArgs matchgroup=Delimiter start="<%args>" end="</%args>" contains=@perlTop
+syn region masonArgs matchgroup=Delimiter start="<%args>" end="</%args>" contains=masonPod,@perlTop
-syn region masonInit matchgroup=Delimiter start="<%init>" end="</%init>" contains=@perlTop
-syn region masonCleanup matchgroup=Delimiter start="<%cleanup>" end="</%cleanup>" contains=@perlTop
-syn region masonOnce matchgroup=Delimiter start="<%once>" end="</%once>" contains=@perlTop
-syn region masonShared matchgroup=Delimiter start="<%shared>" end="</%shared>" contains=@perlTop
+syn region masonInit matchgroup=Delimiter start="<%init>" end="</%init>" contains=masonPod,@perlTop
+syn region masonCleanup matchgroup=Delimiter start="<%cleanup>" end="</%cleanup>" contains=masonPod,@perlTop
+syn region masonOnce matchgroup=Delimiter start="<%once>" end="</%once>" contains=masonPod,@perlTop
+syn region masonClass matchgroup=Delimiter start="<%class>" end="</%class>" contains=masonPod,@perlTop
+syn region masonShared matchgroup=Delimiter start="<%shared>" end="</%shared>" contains=masonPod,@perlTop
-syn region masonDef matchgroup=Delimiter start="<%def[^>]*>" end="</%def>" contains=@htmlTop
-syn region masonMethod matchgroup=Delimiter start="<%method[^>]*>" end="</%method>" contains=@htmlTop
+syn region masonDef matchgroup=Delimiter start="<%def\s*[-._/[:alnum:]]\+\s*>" end="</%def>" contains=@htmlTop
+syn region masonMethod matchgroup=Delimiter start="<%method\s*[-._/[:alnum:]]\+\s*>" end="</%method>" contains=@htmlTop
-syn region masonFlags matchgroup=Delimiter start="<%flags>" end="</%flags>" contains=@perlTop
-syn region masonAttr matchgroup=Delimiter start="<%attr>" end="</%attr>" contains=@perlTop
+syn region masonFlags matchgroup=Delimiter start="<%flags>" end="</%flags>" contains=masonPod,@perlTop
+syn region masonAttr matchgroup=Delimiter start="<%attr>" end="</%attr>" contains=masonPod,@perlTop
-syn region masonFilter matchgroup=Delimiter start="<%filter>" end="</%filter>" contains=@perlTop
+syn region masonFilter matchgroup=Delimiter start="<%filter>" end="</%filter>" contains=masonPod,@perlTop
syn region masonDoc matchgroup=Delimiter start="<%doc>" end="</%doc>"
syn region masonText matchgroup=Delimiter start="<%text>" end="</%text>"
@@ -78,19 +72,9 @@ syn cluster masonTop contains=masonLine,masonExpr,masonPerl,masonComp,masonArgs,
" Set up default highlighting. Almost all of this is done in the included
" syntax files.
-"
-if version >= 508 || !exists("did_mason_syn_inits")
- if version < 508
- let did_mason_syn_inits = 1
- com -nargs=+ HiLink hi link <args>
- else
- com -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink masonDoc Comment
-
- delc HiLink
-endif
+hi def link masonDoc Comment
+hi def link masonPod Comment
+hi def link masonPerlComment perlComment
let b:current_syntax = "mason"
diff --git a/runtime/syntax/master.vim b/runtime/syntax/master.vim
index 40d644eef9..f89c5b2f1c 100644
--- a/runtime/syntax/master.vim
+++ b/runtime/syntax/master.vim
@@ -8,11 +8,8 @@
" this is a very simple syntax file - I will be improving it
" add entire DEFINE syntax
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -28,22 +25,12 @@ syn region masterString start=+'+ end=+'+
syn match masterComment "\$.*"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_master_syntax_inits")
- if version < 508
- let did_master_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink masterKeyword Keyword
- HiLink masterComment Comment
- HiLink masterString String
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link masterKeyword Keyword
+hi def link masterComment Comment
+hi def link masterString String
+
let b:current_syntax = "master"
diff --git a/runtime/syntax/matlab.vim b/runtime/syntax/matlab.vim
index 3828f3e8a8..5228bb5c43 100644
--- a/runtime/syntax/matlab.vim
+++ b/runtime/syntax/matlab.vim
@@ -1,18 +1,17 @@
" Vim syntax file
" Language: Matlab
-" Maintainer: Maurizio Tranchero - maurizio(.)tranchero(@)gmail(.)com
+" Maintainer: Alex Burka <vim@alexburka.com>
" Credits: Preben 'Peppe' Guldberg <peppe-vim@wielders.org>
+" Maurizio Tranchero - maurizio(.)tranchero(@)gmail(.)com
" Original author: Mario Eusebio
-" Last Change: Wed Jan 13 11:12:34 CET 2010
-" sinh added to matlab implicit commands
+" Last Change: Mon Jan 23 2017
+" added support for cell mode
" Change History:
+" - now highlights cell-mode separator comments
" - 'global' and 'persistent' keyword are now recognized
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -63,6 +62,7 @@ syn match matlabComment "%.*$" contains=matlabTodo,matlabTab
" MT_ADDON - correctly highlights words after '...' as comments
syn match matlabComment "\.\.\..*$" contains=matlabTodo,matlabTab
syn region matlabMultilineComment start=+%{+ end=+%}+ contains=matlabTodo,matlabTab
+syn match matlabCellComment "^%%.*$"
syn keyword matlabOperator break zeros default margin round ones rand
syn keyword matlabOperator ceil floor size clear zeros eye mean std cov
@@ -76,49 +76,40 @@ syn match matlabError "-\=\<\d\+\.\d\+\.[^*/\\^]"
syn match matlabError "-\=\<\d\+\.\d\+[eEdD][-+]\=\d\+\.\([^*/\\^]\)"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_matlab_syntax_inits")
- if version < 508
- let did_matlab_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink matlabTransposeOperator matlabOperator
- HiLink matlabOperator Operator
- HiLink matlabLineContinuation Special
- HiLink matlabLabel Label
- HiLink matlabConditional Conditional
- HiLink matlabExceptions Conditional
- HiLink matlabRepeat Repeat
- HiLink matlabTodo Todo
- HiLink matlabString String
- HiLink matlabDelimiter Identifier
- HiLink matlabTransposeOther Identifier
- HiLink matlabNumber Number
- HiLink matlabFloat Float
- HiLink matlabFunction Function
- HiLink matlabError Error
- HiLink matlabImplicit matlabStatement
- HiLink matlabStatement Statement
- HiLink matlabOO Statement
- HiLink matlabSemicolon SpecialChar
- HiLink matlabComment Comment
- HiLink matlabMultilineComment Comment
- HiLink matlabScope Type
-
- HiLink matlabArithmeticOperator matlabOperator
- HiLink matlabRelationalOperator matlabOperator
- HiLink matlabLogicalOperator matlabOperator
+" Only when an item doesn't have highlighting yet
+
+hi def link matlabTransposeOperator matlabOperator
+hi def link matlabOperator Operator
+hi def link matlabLineContinuation Special
+hi def link matlabLabel Label
+hi def link matlabConditional Conditional
+hi def link matlabExceptions Conditional
+hi def link matlabRepeat Repeat
+hi def link matlabTodo Todo
+hi def link matlabString String
+hi def link matlabDelimiter Identifier
+hi def link matlabTransposeOther Identifier
+hi def link matlabNumber Number
+hi def link matlabFloat Float
+hi def link matlabFunction Function
+hi def link matlabError Error
+hi def link matlabImplicit matlabStatement
+hi def link matlabStatement Statement
+hi def link matlabOO Statement
+hi def link matlabSemicolon SpecialChar
+hi def link matlabComment Comment
+hi def link matlabMultilineComment Comment
+hi def link matlabCellComment Todo
+hi def link matlabScope Type
+
+hi def link matlabArithmeticOperator matlabOperator
+hi def link matlabRelationalOperator matlabOperator
+hi def link matlabLogicalOperator matlabOperator
"optional highlighting
- "HiLink matlabIdentifier Identifier
- "HiLink matlabTab Error
+"hi def link matlabIdentifier Identifier
+"hi def link matlabTab Error
- delcommand HiLink
-endif
let b:current_syntax = "matlab"
diff --git a/runtime/syntax/maxima.vim b/runtime/syntax/maxima.vim
index 27dcc18842..46e1e4ff84 100644
--- a/runtime/syntax/maxima.vim
+++ b/runtime/syntax/maxima.vim
@@ -6,11 +6,8 @@
" Adapted mostly from xmath.vim
" Number formats adapted from r.vim
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -234,41 +231,31 @@ syn sync match maximaSyncComment grouphere maximaCommentBlock "/*"
syn sync match maximaSyncComment groupthere NONE "*/"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_maxima_syntax_inits")
- if version < 508
- let did_maxima_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink maximaBraceError maximaError
- HiLink maximaCmd maximaStatement
- HiLink maximaCurlyError maximaError
- HiLink maximaFuncCmd maximaStatement
- HiLink maximaParenError maximaError
+hi def link maximaBraceError maximaError
+hi def link maximaCmd maximaStatement
+hi def link maximaCurlyError maximaError
+hi def link maximaFuncCmd maximaStatement
+hi def link maximaParenError maximaError
- " The default methods for highlighting. Can be overridden later
- HiLink maximaCharacter Character
- HiLink maximaComma Function
- HiLink maximaCommentBlock Comment
- HiLink maximaConditional Conditional
- HiLink maximaError Error
- HiLink maximaFunc Delimiter
- HiLink maximaOp Delimiter
- HiLink maximaLabel PreProc
- HiLink maximaNumber Number
- HiLink maximaFloat Float
- HiLink maximaRepeat Repeat
- HiLink maximaSpecial Type
- HiLink maximaSpecialChar SpecialChar
- HiLink maximaStatement Statement
- HiLink maximaString String
- HiLink maximaTodo Todo
+" The default methods for highlighting. Can be overridden later
+hi def link maximaCharacter Character
+hi def link maximaComma Function
+hi def link maximaCommentBlock Comment
+hi def link maximaConditional Conditional
+hi def link maximaError Error
+hi def link maximaFunc Delimiter
+hi def link maximaOp Delimiter
+hi def link maximaLabel PreProc
+hi def link maximaNumber Number
+hi def link maximaFloat Float
+hi def link maximaRepeat Repeat
+hi def link maximaSpecial Type
+hi def link maximaSpecialChar SpecialChar
+hi def link maximaStatement Statement
+hi def link maximaString String
+hi def link maximaTodo Todo
- delcommand HiLink
-endif
let b:current_syntax = "maxima"
diff --git a/runtime/syntax/mel.vim b/runtime/syntax/mel.vim
index a668e70378..ea6e75fa22 100644
--- a/runtime/syntax/mel.vim
+++ b/runtime/syntax/mel.vim
@@ -4,11 +4,8 @@
" Last Change: May 27 1999
" Based on: Bram Moolenaar <Bram@vim.org> C syntax file
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -77,45 +74,35 @@ endif
exec "sy sync ccomment melComment minlines=" . mel_minlines
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_mel_syntax_inits")
- if version < 508
- let did_mel_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink melBoolean Boolean
- HiLink melFunction Function
- HiLink melIdentifier Identifier
- HiLink melStatement Statement
- HiLink melConditional Conditional
- HiLink melRepeat Repeat
- HiLink melLabel Label
- HiLink melOperator Operator
- HiLink melKeyword Keyword
- HiLink melException Exception
- HiLink melInclude Include
- HiLink melType Type
- HiLink melStorageClass StorageClass
- HiLink melDebug Debug
- HiLink melTodo Todo
- HiLink melCharSpecial SpecialChar
- HiLink melString String
- HiLink melInteger Number
- HiLink melFloat Float
- HiLink melMatrixVector Float
- HiLink melComment Comment
- HiLink melError Error
- HiLink melSpaceError melError
- HiLink melCharError melError
- HiLink melParenError melError
- HiLink melInParen melError
- HiLink melCommentError melError
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link melBoolean Boolean
+hi def link melFunction Function
+hi def link melIdentifier Identifier
+hi def link melStatement Statement
+hi def link melConditional Conditional
+hi def link melRepeat Repeat
+hi def link melLabel Label
+hi def link melOperator Operator
+hi def link melKeyword Keyword
+hi def link melException Exception
+hi def link melInclude Include
+hi def link melType Type
+hi def link melStorageClass StorageClass
+hi def link melDebug Debug
+hi def link melTodo Todo
+hi def link melCharSpecial SpecialChar
+hi def link melString String
+hi def link melInteger Number
+hi def link melFloat Float
+hi def link melMatrixVector Float
+hi def link melComment Comment
+hi def link melError Error
+hi def link melSpaceError melError
+hi def link melCharError melError
+hi def link melParenError melError
+hi def link melInParen melError
+hi def link melCommentError melError
+
let b:current_syntax = "mel"
diff --git a/runtime/syntax/mf.vim b/runtime/syntax/mf.vim
index 8bc48fee46..3589e4db3c 100644
--- a/runtime/syntax/mf.vim
+++ b/runtime/syntax/mf.vim
@@ -1,197 +1,295 @@
" Vim syntax file
-" Language: Metafont
-" Maintainer: Andreas Scherer <andreas.scherer@pobox.com>
-" Last Change: April 25, 2001
-
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syn clear
-elseif exists("b:current_syntax")
+" Language: METAFONT
+" Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+" Former Maintainers: Andreas Scherer <andreas.scherer@pobox.com>
+" Last Change: 2016 Oct 1
+
+if exists("b:current_syntax")
finish
endif
-" Metafont 'primitives' as defined in chapter 25 of 'The METAFONTbook'
+syn iskeyword @,_
+
+" METAFONT 'primitives' as defined in chapter 25 of 'The METAFONTbook'
" Page 210: 'boolean expressions'
-syn keyword mfBoolExp true false known unknown odd charexists not and or
+syn keyword mfBoolExp and charexists false known not odd or true unknown
" Page 210: 'numeric expression'
-syn keyword mfNumExp normaldeviate length ASCII oct hex angle turningnumber
-syn keyword mfNumExp totalweight directiontime xpart ypart xxpart xypart
-syn keyword mfNumExp yxpart yypart sqrt sind cosd mlog mexp floor
-syn keyword mfNumExp uniformdeviate
+syn keyword mfNumExp ASCII angle cosd directiontime floor hex length
+syn keyword mfNumExp mexp mlog normaldeviate oct sind sqrt totalweight
+syn keyword mfNumExp turningnumber uniformdeviate xpart xxpart xypart
+syn keyword mfNumExp ypart yxpart yypart
" Page 211: 'internal quantities'
-syn keyword mfInternal tracingtitles tracingequations tracingcapsules
-syn keyword mfInternal tracingchoices tracingspecs tracingpens
-syn keyword mfInternal tracingcommands tracingrestores tracingmacros
-syn keyword mfInternal tracingedges tracingoutput tracingonline tracingstats
-syn keyword mfInternal pausing showstopping fontmaking proofing
-syn keyword mfInternal turningcheck warningcheck smoothing autorounding
-syn keyword mfInternal granularity fillin year month day time
-syn keyword mfInternal charcode charext charwd charht chardp charic
-syn keyword mfInternal chardx chardy designsize hppp vppp xoffset yoffset
-syn keyword mfInternal boundarychar
+syn keyword mfInternal autorounding boundarychar charcode chardp chardx
+syn keyword mfInternal chardy charext charht charic charwd day designsize
+syn keyword mfInternal fillin fontmaking granularity hppp jobname month
+syn keyword mfInternal pausing proofing showstopping smoothing time
+syn keyword mfInternal tracingcapsules tracingchoices tracingcommands
+syn keyword mfInternal tracingedges tracingequations tracingmacros
+syn keyword mfInternal tracingonline tracingoutput tracingpens
+syn keyword mfInternal tracingrestores tracingspecs tracingstats
+syn keyword mfInternal tracingtitles turningcheck vppp warningcheck
+syn keyword mfInternal xoffset year yoffset
" Page 212: 'pair expressions'
-syn keyword mfPairExp point of precontrol postcontrol penoffset rotated
-syn keyword mfPairExp scaled shifted slanted transformed xscaled yscaled
-syn keyword mfPairExp zscaled
+syn keyword mfPairExp of penoffset point postcontrol precontrol rotated
+syn keyword mfPairExp scaled shifted slanted transformed xscaled yscaled
+syn keyword mfPairExp zscaled
" Page 213: 'path expressions'
-syn keyword mfPathExp makepath reverse subpath curl tension atleast
-syn keyword mfPathExp controls cycle
+syn keyword mfPathExp atleast controls curl cycle makepath reverse
+syn keyword mfPathExp subpath tension
" Page 214: 'pen expressions'
-syn keyword mfPenExp nullpen pencircle makepen
+syn keyword mfPenExp makepen nullpen pencircle
-" Page 214: 'picutre expressions'
-syn keyword mfPicExp nullpicture
+" Page 214: 'picture expressions'
+syn keyword mfPicExp nullpicture
" Page 214: 'string expressions'
-syn keyword mfStringExp jobname readstring str char decimal substring
+syn keyword mfStringExp char decimal readstring str substring
" Page 217: 'commands and statements'
-syn keyword mfCommand end dump save interim newinternal randomseed let
-syn keyword mfCommand delimiters outer everyjob show showvariable showtoken
-syn keyword mfCommand showdependencies showstats message errmessage errhelp
-syn keyword mfCommand batchmode nonstopmode scrollmode errorstopmode
-syn keyword mfCommand addto also contour doublepath withpen withweight cull
-syn keyword mfCommand keeping dropping display inwindow openwindow at from to
-syn keyword mfCommand shipout special numspecial
+syn keyword mfCommand addto also at batchmode contour cull delimiters
+syn keyword mfCommand display doublepath dropping dump end errhelp
+syn keyword mfCommand errmessage errorstopmode everyjob from interim
+syn keyword mfCommand inwindow keeping let message newinternal
+syn keyword mfCommand nonstopmode numspecial openwindow outer randomseed
+syn keyword mfCommand save scrollmode shipout show showdependencies
+syn keyword mfCommand showstats showtoken showvariable special to withpen
+syn keyword mfCommand withweight
" Page 56: 'types'
-syn keyword mfType boolean numeric pair path pen picture string transform
+syn keyword mfType boolean numeric pair path pen picture string
+syn keyword mfType transform
" Page 155: 'grouping'
-syn keyword mfStatement begingroup endgroup
+syn keyword mfStatement begingroup endgroup
" Page 165: 'definitions'
-syn keyword mfDefinition enddef def expr suffix text primary secondary
-syn keyword mfDefinition tertiary vardef primarydef secondarydef tertiarydef
+syn keyword mfDefinition def enddef expr primary primarydef secondary
+syn keyword mfDefinition secondarydef suffix tertiary tertiarydef text
+syn keyword mfDefinition vardef
" Page 169: 'conditions and loops'
-syn keyword mfCondition if fi else elseif endfor for forsuffixes forever
-syn keyword mfCondition step until exitif
+syn keyword mfCondition else elseif endfor exitif fi for forever
+syn keyword mfCondition forsuffixes if step until
" Other primitives listed in the index
-syn keyword mfPrimitive charlist endinput expandafter extensible
-syn keyword mfPrimitive fontdimen headerbyte inner input intersectiontimes
-syn keyword mfPrimitive kern ligtable quote scantokens skipto
+syn keyword mfPrimitive charlist endinput expandafter extensible fontdimen
+syn keyword mfPrimitive headerbyte inner input intersectiontimes kern
+syn keyword mfPrimitive ligtable quote scantokens skipto
+
+" Implicit suffix parameters
+syn match mfSuffixParam "@#\|#@\|@"
+
+" These are just tags, but given their special status, we
+" highlight them as variables
+syn keyword mfVariable x y
" Keywords defined by plain.mf (defined on pp.262-278)
-if !exists("plain_mf_macros")
- let plain_mf_macros = 1 " Set this to '0' if your source gets too colourful
- " metapost.vim does so to turn off Metafont macros
+if get(g:, "plain_mf_macros", 1)
+ syn keyword mfDef addto_currentpicture beginchar capsule_def
+ syn keyword mfDef change_width clear_pen_memory clearit clearpen
+ syn keyword mfDef clearxy culldraw cullit cutdraw
+ syn keyword mfDef define_blacker_pixels define_corrected_pixels
+ syn keyword mfDef define_good_x_pixels define_good_y_pixels
+ syn keyword mfDef define_horizontal_corrected_pixels define_pixels
+ syn keyword mfDef define_whole_blacker_pixels define_whole_pixels
+ syn keyword mfDef define_whole_vertical_blacker_pixels
+ syn keyword mfDef define_whole_vertical_pixels downto draw drawdot
+ syn keyword mfDef endchar erase exitunless fill filldraw fix_units
+ syn keyword mfDef flex font_coding_scheme font_extra_space
+ syn keyword mfDef font_identifier font_normal_shrink
+ syn keyword mfDef font_normal_space font_normal_stretch font_quad
+ syn keyword mfDef font_size font_slant font_x_height gfcorners gobble
+ syn keyword mfDef hide imagerules interact italcorr killtext
+ syn keyword mfDef loggingall lowres_fix makebox makegrid maketicks
+ syn keyword mfDef mode_def mode_setup nodisplays notransforms numtok
+ syn keyword mfDef openit penrazor pensquare penstroke pickup
+ syn keyword mfDef proofoffset proofrule range reflectedabout
+ syn keyword mfDef rotatedaround screenchars screenrule screenstrokes
+ syn keyword mfDef shipit showit smode stop superellipse takepower
+ syn keyword mfDef tracingall tracingnone undraw undrawdot unfill
+ syn keyword mfDef unfilldraw upto z
+ syn match mfDef "???"
+ syn keyword mfVardef bot byte ceiling counterclockwise cutoff decr dir
+ syn keyword mfVardef direction directionpoint grayfont hround incr
+ syn keyword mfVardef interpath inverse labelfont labels lft magstep
+ " Note: nodot is not a vardef, it is used as in makelabel.lft.nodot("5",z5)
+ " (METAFONT only)
+ syn keyword mfVardef makelabel max min nodot penlabels penpos
+ syn keyword mfVardef proofrulethickness round rt savepen slantfont solve
+ syn keyword mfVardef tensepath titlefont top unitvector vround whatever
+ syn match mpVardef "\<good\.\%(x\|y\|lft\|rt\|top\|bot\)\>"
+ syn keyword mfPrimaryDef div dotprod gobbled mod
+ syn keyword mfSecondaryDef intersectionpoint
+ syn keyword mfTertiaryDef softjoin thru
+ syn keyword mfNewInternal blacker currentwindow displaying eps epsilon
+ syn keyword mfNewInternal infinity join_radius number_of_modes o_correction
+ syn keyword mfNewInternal pen_bot pen_lft pen_rt pen_top pixels_per_inch
+ syn keyword mfNewInternal screen_cols screen_rows tolerance
+ " Predefined constants
+ syn keyword mfConstant base_name base_version blankpicture ditto down
+ syn keyword mfConstant fullcircle halfcircle identity left lowres origin
+ syn keyword mfConstant penspeck proof quartercircle right rulepen smoke
+ syn keyword mfConstant unitpixel unitsquare up
+ " Other predefined variables
+ syn keyword mfVariable aspect_ratio currentpen extra_beginchar
+ syn keyword mfVariable extra_endchar currentpen_path currentpicture
+ syn keyword mfVariable currenttransform d extra_setup h localfont mag mode
+ syn keyword mfVariable mode_name w
+ " let statements:
+ syn keyword mfnumExp abs
+ syn keyword mfPairExp rotatedabout
+ syn keyword mfCommand bye relax
endif
-if plain_mf_macros
- syn keyword mfMacro abs addto_currentpicture aspect_ratio base_name
- syn keyword mfMacro base_version beginchar blacker blankpicture bot bye byte
- syn keyword mfMacro capsule_def ceiling change_width clear_pen_memory clearit
- syn keyword mfMacro clearpen clearxy counterclockwise culldraw cullit
- syn keyword mfMacro currentpen currentpen_path currentpicture
- syn keyword mfMacro currenttransform currentwindow cutdraw cutoff d decr
- syn keyword mfMacro define_blacker_pixels define_corrected_pixels
- syn keyword mfMacro define_good_x_pixels define_good_y_pixels
- syn keyword mfMacro define_horizontal_corrected_pixels define_pixels
- syn keyword mfMacro define_whole_blacker_pixels define_whole_pixels
- syn keyword mfMacro define_whole_vertical_blacker_pixels
- syn keyword mfMacro define_whole_vertical_pixels dir direction directionpoint
- syn keyword mfMacro displaying ditto div dotprod down downto draw drawdot
- syn keyword mfMacro endchar eps epsilon extra_beginchar extra_endchar
- syn keyword mfMacro extra_setup erase exitunless fill filldraw fix_units flex
- syn keyword mfMacro font_coding_scheme font_extra_space font_identifier
- syn keyword mfMacro font_normal_shrink font_normal_space font_normal_stretch
- syn keyword mfMacro font_quad font_setup font_size font_slant font_x_height
- syn keyword mfMacro fullcircle generate gfcorners gobble gobbled grayfont h
- syn keyword mfMacro halfcircle hide hround identity image_rules incr infinity
- syn keyword mfMacro interact interpath intersectionpoint inverse italcorr
- syn keyword mfMacro join_radius killtext labelfont labels left lft localfont
- syn keyword mfMacro loggingall lowres lowres_fix mag magstep makebox makegrid
- syn keyword mfMacro makelabel maketicks max min mod mode mode_def mode_name
- syn keyword mfMacro mode_setup nodisplays notransforms number_of_modes numtok
- syn keyword mfMacro o_correction openit origin pen_bot pen_lft pen_rt pen_top
- syn keyword mfMacro penlabels penpos penrazor penspeck pensquare penstroke
- syn keyword mfMacro pickup pixels_per_inch proof proofoffset proofrule
- syn keyword mfMacro proofrulethickness quartercircle range reflectedabout
- syn keyword mfMacro relax right rotatedabout rotatedaround round rt rulepen
- syn keyword mfMacro savepen screenchars screen_rows screen_cols screenrule
- syn keyword mfMacro screenstrokes shipit showit slantfont smode smoke softjoin
- syn keyword mfMacro solve stop superellipse takepower tensepath titlefont
- syn keyword mfMacro tolerance top tracingall tracingnone undraw undrawdot
- syn keyword mfMacro unfill unfilldraw unitpixel unitsquare unitvector up upto
- syn keyword mfMacro vround w whatever
+
+" By default, METAFONT loads modes.mf, too
+if get(g:, "plain_mf_modes", 1)
+ syn keyword mfConstant APSSixMed AgfaFourZeroZero AgfaThreeFourZeroZero
+ syn keyword mfConstant AtariNineFive AtariNineSix AtariSLMEightZeroFour
+ syn keyword mfConstant AtariSMOneTwoFour CItohEightFiveOneZero
+ syn keyword mfConstant CItohThreeOneZero CanonBJCSixZeroZero CanonCX
+ syn keyword mfConstant CanonEX CanonLBPLX CanonLBPTen CanonSX ChelgraphIBX
+ syn keyword mfConstant CompugraphicEightSixZeroZero
+ syn keyword mfConstant CompugraphicNineSixZeroZero DD DEClarge DECsmall
+ syn keyword mfConstant DataDiscNew EightThree EpsonAction
+ syn keyword mfConstant EpsonLQFiveZeroZeroLo EpsonLQFiveZeroZeroMed
+ syn keyword mfConstant EpsonMXFX EpsonSQEightSevenZero EpsonStylusPro
+ syn keyword mfConstant EpsonStylusProHigh EpsonStylusProLow
+ syn keyword mfConstant EpsonStylusProMed FourFour GThreefax HPDeskJet
+ syn keyword mfConstant HPLaserJetIIISi IBMFourTwoFiveZero IBMFourTwoOneSix
+ syn keyword mfConstant IBMFourTwoThreeZero IBMFourZeroOneNine
+ syn keyword mfConstant IBMFourZeroThreeNine IBMFourZeroTwoNine
+ syn keyword mfConstant IBMProPrinter IBMSixOneFiveFour IBMSixSixSevenZero
+ syn keyword mfConstant IBMThreeEightOneTwo IBMThreeEightTwoZero
+ syn keyword mfConstant IBMThreeOneNineThree IBMThreeOneSevenNine
+ syn keyword mfConstant IBMUlfHolleberg LASevenFive LNOthreR LNOthree
+ syn keyword mfConstant LNZeroOne LNZeroThree LPSFourZero LPSTwoZero
+ syn keyword mfConstant LexmarkFourZeroThreeNine LexmarkOptraR
+ syn keyword mfConstant LexmarkOptraS LinotypeLThreeThreeZero
+ syn keyword mfConstant LinotypeOneZeroZero LinotypeOneZeroZeroLo
+ syn keyword mfConstant LinotypeThreeZeroZeroHi MacTrueSize NeXTprinter
+ syn keyword mfConstant NeXTscreen NecTwoZeroOne Newgen NineOne
+ syn keyword mfConstant OCESixSevenFiveZeroPS OneTwoZero OneZeroZero
+ syn keyword mfConstant PrintwareSevenTwoZeroIQ Prism QMSOneSevenTwoFive
+ syn keyword mfConstant QMSOneSevenZeroZero QMSTwoFourTwoFive RicohA
+ syn keyword mfConstant RicohFortyEighty RicohFourZeroEightZero RicohLP
+ syn keyword mfConstant SparcPrinter StarNLOneZero VAXstation VTSix
+ syn keyword mfConstant VarityperFiveZeroSixZeroW
+ syn keyword mfConstant VarityperFourThreeZeroZeroHi
+ syn keyword mfConstant VarityperFourThreeZeroZeroLo
+ syn keyword mfConstant VarityperFourTwoZeroZero VarityperSixZeroZero
+ syn keyword mfConstant XeroxDocutech XeroxEightSevenNineZero
+ syn keyword mfConstant XeroxFourZeroFiveZero XeroxNineSevenZeroZero
+ syn keyword mfConstant XeroxPhaserSixTwoZeroZeroDP XeroxThreeSevenZeroZero
+ syn keyword mfConstant Xerox_world agfafzz agfatfzz amiga aps apssixhi
+ syn keyword mfConstant aselect atariezf atarinf atarins atariotf bitgraph
+ syn keyword mfConstant bjtenex bjtzzex bjtzzl bjtzzs boise canonbjc
+ syn keyword mfConstant canonex canonlbp cg cgl cgnszz citohtoz corona crs
+ syn keyword mfConstant cthreeten cx datadisc declarge decsmall deskjet
+ syn keyword mfConstant docutech dover dp dpdfezzz eighthre elvira epscszz
+ syn keyword mfConstant epsdraft epsdrft epsdrftl epsfast epsfastl epshi
+ syn keyword mfConstant epslo epsmed epsmedl epson epsonact epsonfx epsonl
+ syn keyword mfConstant epsonlo epsonlol epsonlq epsonsq epstylus epstylwr
+ syn keyword mfConstant epstyplo epstypmd epstypml epstypro epswlo epswlol
+ syn keyword mfConstant esphi fourfour gpx gtfax gtfaxhi gtfaxl gtfaxlo
+ syn keyword mfConstant gtfaxlol help hifax highfax hplaser hprugged ibm_a
+ syn keyword mfConstant ibmd ibmega ibmegal ibmfzon ibmfztn ibmpp ibmppl
+ syn keyword mfConstant ibmsoff ibmteot ibmtetz ibmtont ibmtosn ibmtosnl
+ syn keyword mfConstant ibmvga ibx imagen imagewriter itoh itohl itohtoz
+ syn keyword mfConstant itohtozl iw jetiiisi kyocera laserjet laserjetfive
+ syn keyword mfConstant laserjetfivemp laserjetfour laserjetfourthousand
+ syn keyword mfConstant laserjetfourzerozerozero laserjethi laserjetlo
+ syn keyword mfConstant laserjettwoonezerozero
+ syn keyword mfConstant laserjettwoonezerozerofastres lasermaster
+ syn keyword mfConstant laserwriter lasf lexmarkr lexmarks lexmarku
+ syn keyword mfConstant linohalf linohi linolo linolttz linoone linosuper
+ syn keyword mfConstant linothree linothreelo linotzzh ljfive ljfivemp
+ syn keyword mfConstant ljfour ljfzzz ljfzzzfr ljlo ljtozz ljtozzfr lmaster
+ syn keyword mfConstant lnotr lnzo lps lpstz lqhires lqlores lqmed lqmedl
+ syn keyword mfConstant lqmedres lview lviewl lwpro macmag mactrue modes_mf
+ syn keyword mfConstant ncd nec nechi neclm nectzo newdd newddl nexthi
+ syn keyword mfConstant nextscreen nextscrn nineone nullmode ocessfz
+ syn keyword mfConstant okidata okidatal okifourten okifte okihi onetz
+ syn keyword mfConstant onezz pcprevw pcscreen phaser phaserfs phasertf
+ syn keyword mfConstant phasertfl phasertl pixpt printware prntware
+ syn keyword mfConstant proprinter qms qmsesz qmsostf qmsoszz qmstftf ricoh
+ syn keyword mfConstant ricoha ricohlp ricohsp sherpa sparcptr starnlt
+ syn keyword mfConstant starnltl styletwo stylewr stylewri stylewriter sun
+ syn keyword mfConstant supre swtwo toshiba ultre varityper vs vtftzz
+ syn keyword mfConstant vtftzzhi vtftzzlo vtfzszw vtszz xpstzz xpstzzl
+ syn keyword mfConstant xrxesnz xrxfzfz xrxnszz xrxtszz
+ syn keyword mfDef BCPL_string coding_scheme font_face_byte
+ syn keyword mfDef font_family landscape
+ syn keyword mfDef mode_extra_info mode_help mode_param
+ syn keyword mfNewInternal blacker_min
endif
" Some other basic macro names, e.g., from cmbase, logo, etc.
-if !exists("other_mf_macros")
- let other_mf_macros = 1 " Set this to '0' if your code gets too colourful
- " metapost.vim does so to turn off Metafont macros
-endif
-if other_mf_macros
- syn keyword mfMacro beginlogochar
+if get(g:, "other_mf_macros", 1)
+ syn keyword mfDef beginlogochar
+ syn keyword mfDef font_setup
+ syn keyword mfPrimitive generate
endif
" Numeric tokens
-syn match mfNumeric "[-]\=\d\+"
-syn match mfNumeric "[-]\=\.\d\+"
-syn match mfNumeric "[-]\=\d\+\.\d\+"
+syn match mfNumeric "[-]\=\d\+"
+syn match mfNumeric "[-]\=\.\d\+"
+syn match mfNumeric "[-]\=\d\+\.\d\+"
-" Metafont lengths
-syn match mfLength "\<\(bp\|cc\|cm\|dd\|in\|mm\|pc\|pt\)\>"
-syn match mfLength "\<[-]\=\d\+\(bp\|cc\|cm\|dd\|in\|mm\|pc\|pt\)\#\=\>"
-syn match mfLength "\<[-]\=\.\d\+\(bp\|cc\|cm\|dd\|in\|mm\|pc\|pt\)\#\=\>"
-syn match mfLength "\<[-]\=\d\+\.\d\+\(bp\|cc\|cm\|dd\|in\|mm\|pc\|pt\)\#\=\>"
-
-" Metafont coordinates and points
-syn match mfCoord "\<[xy]\d\+\>"
-syn match mfPoint "\<z\d\+\>"
+" METAFONT lengths
+syn match mfLength "\<\(bp\|cc\|cm\|dd\|in\|mm\|pc\|pt\)\>"
+syn match mfLength "[-]\=\d\+\(bp\|cc\|cm\|dd\|in\|mm\|pc\|pt\)\#\="
+syn match mfLength "[-]\=\.\d\+\(bp\|cc\|cm\|dd\|in\|mm\|pc\|pt\)\#\="
+syn match mfLength "[-]\=\d\+\.\d\+\(bp\|cc\|cm\|dd\|in\|mm\|pc\|pt\)\#\="
" String constants
-syn region mfString start=+"+ end=+"+
+syn match mfOpenString /"[^"]*/
+syn region mfString oneline keepend start=+"+ end=+"+
" Comments:
-syn match mfComment "%.*$"
+syn keyword mfTodoComment contained TODO FIXME XXX DEBUG NOTE
+syn match mfComment "%.*$" contains=mfTodoComment,@Spell
" synchronizing
syn sync maxlines=50
" Define the default highlighting
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_mf_syntax_inits")
- if version < 508
- let did_mf_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink mfBoolExp Statement
- HiLink mfNumExp Statement
- HiLink mfInternal Identifier
- HiLink mfPairExp Statement
- HiLink mfPathExp Statement
- HiLink mfPenExp Statement
- HiLink mfPicExp Statement
- HiLink mfStringExp Statement
- HiLink mfCommand Statement
- HiLink mfType Type
- HiLink mfStatement Statement
- HiLink mfDefinition Statement
- HiLink mfCondition Conditional
- HiLink mfPrimitive Statement
- HiLink mfMacro Macro
- HiLink mfCoord Identifier
- HiLink mfPoint Identifier
- HiLink mfNumeric Number
- HiLink mfLength Number
- HiLink mfComment Comment
- HiLink mfString String
-
- delcommand HiLink
-endif
+hi def link mfBoolExp Statement
+hi def link mfNumExp Statement
+hi def link mfPairExp Statement
+hi def link mfPathExp Statement
+hi def link mfPenExp Statement
+hi def link mfPicExp Statement
+hi def link mfStringExp Statement
+hi def link mfInternal Identifier
+hi def link mfCommand Statement
+hi def link mfType Type
+hi def link mfStatement Statement
+hi def link mfDefinition Statement
+hi def link mfCondition Conditional
+hi def link mfPrimitive Statement
+hi def link mfDef Function
+hi def link mfVardef mfDef
+hi def link mfPrimaryDef mfDef
+hi def link mfSecondaryDef mfDef
+hi def link mfTertiaryDef mfDef
+hi def link mfCoord Identifier
+hi def link mfPoint Identifier
+hi def link mfNumeric Number
+hi def link mfLength Number
+hi def link mfComment Comment
+hi def link mfString String
+hi def link mfOpenString Todo
+hi def link mfSuffixParam Label
+hi def link mfNewInternal mfInternal
+hi def link mfVariable Identifier
+hi def link mfConstant Constant
+hi def link mfTodoComment Todo
let b:current_syntax = "mf"
-" vim: ts=8
+" vim:sw=2
diff --git a/runtime/syntax/mgl.vim b/runtime/syntax/mgl.vim
index 55ae137f2f..f7bc617f5a 100644
--- a/runtime/syntax/mgl.vim
+++ b/runtime/syntax/mgl.vim
@@ -6,9 +6,8 @@
"
" $Id: mgl.vim,v 1.1 2006/02/21 22:08:20 vimboss Exp $
"
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -84,43 +83,33 @@ syn keyword mglPredefined exception
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_mgl_syn_inits")
- if version < 508
- let did_mgl_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink mglBoolean Boolean
- HiLink mglComment Comment
- HiLink mglConditional Conditional
- HiLink mglConstant Constant
- HiLink mglException Exception
- HiLink mglFunction Function
- HiLink mglLabel Label
- HiLink mglMatrixDelimiter Identifier
- HiLink mglNumber Number
- HiLink mglHexNumber Number
- HiLink mglCharacter Number
- HiLink mglIpAddr Number
- HiLink mglOperator Operator
- HiLink mglPredefined mglFunction
- HiLink mglPreProc PreProc
- HiLink mglRepeat Repeat
- HiLink mglStatement Statement
- HiLink mglString String
- HiLink mglStringEscape Special
- HiLink mglStringEscapeGPC Special
- HiLink mglStringError Error
- HiLink mglStruct mglStatement
- HiLink mglSymbolOperator mglOperator
- HiLink mglType Type
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link mglBoolean Boolean
+hi def link mglComment Comment
+hi def link mglConditional Conditional
+hi def link mglConstant Constant
+hi def link mglException Exception
+hi def link mglFunction Function
+hi def link mglLabel Label
+hi def link mglMatrixDelimiter Identifier
+hi def link mglNumber Number
+hi def link mglHexNumber Number
+hi def link mglCharacter Number
+hi def link mglIpAddr Number
+hi def link mglOperator Operator
+hi def link mglPredefined mglFunction
+hi def link mglPreProc PreProc
+hi def link mglRepeat Repeat
+hi def link mglStatement Statement
+hi def link mglString String
+hi def link mglStringEscape Special
+hi def link mglStringEscapeGPC Special
+hi def link mglStringError Error
+hi def link mglStruct mglStatement
+hi def link mglSymbolOperator mglOperator
+hi def link mglType Type
+
let b:current_syntax = "mgl"
diff --git a/runtime/syntax/mgp.vim b/runtime/syntax/mgp.vim
index 76b96612e2..7227804550 100644
--- a/runtime/syntax/mgp.vim
+++ b/runtime/syntax/mgp.vim
@@ -10,11 +10,8 @@
" SPAM is _NOT_ welcome - be ready to be reported!
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syn clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -48,36 +45,25 @@ syn match mgpNoDefault +^%nodefault$+
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_mgp_syn_inits")
- let did_mgp_syn_inits = 1
- if version < 508
- let did_mgp_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink mgpLineSkip Special
+hi def link mgpLineSkip Special
- HiLink mgpHash mgpComment
- HiLink mgpPercent mgpComment
- HiLink mgpComment Comment
+hi def link mgpHash mgpComment
+hi def link mgpPercent mgpComment
+hi def link mgpComment Comment
- HiLink mgpCommand Identifier
+hi def link mgpCommand Identifier
- HiLink mgpLine Type
+hi def link mgpLine Type
- HiLink mgpFile String
- HiLink mgpSize Number
- HiLink mgpValue Number
+hi def link mgpFile String
+hi def link mgpSize Number
+hi def link mgpValue Number
- HiLink mgpPage mgpDefine
- HiLink mgpNoDefault mgpDefine
- HiLink mgpDefine Define
+hi def link mgpPage mgpDefine
+hi def link mgpNoDefault mgpDefine
+hi def link mgpDefine Define
- delcommand HiLink
-endif
let b:current_syntax = "mgp"
diff --git a/runtime/syntax/mix.vim b/runtime/syntax/mix.vim
index 9ab98eacf8..564d344cc8 100644
--- a/runtime/syntax/mix.vim
+++ b/runtime/syntax/mix.vim
@@ -2,7 +2,7 @@
" Language: MIX (Donald Knuth's assembly language used in TAOCP)
" Maintainer: Wu Yongwei <wuyongwei@gmail.com>
" Filenames: *.mixal *.mix
-" Last Change: 2013 Nov 13
+" Last Change: 2017-11-26 15:21:36 +0800
" Quit when a syntax file was already loaded
if exists("b:current_syntax")
@@ -16,7 +16,7 @@ syn case ignore
" Special processing of ALF directive: implementations vary whether quotation
" marks are needed
-syn match mixAlfParam #\s\{1,2\}"\?[^"]\{,5\}"\?# contains=mixAlfDirective,mixString nextgroup=mixEndComment contained
+syn match mixAlfParam #\s\{1,2\}"\?[^"]\{,5\}"\?# contains=mixString nextgroup=mixEndComment contained
" Region for parameters
syn match mixParam #[-+*/:=0-9a-z,()"]\+# contains=mixIdentifier,mixSpecial,mixNumber,mixString,mixLabel nextgroup=mixEndComment contained
@@ -46,6 +46,7 @@ syn keyword mixDirective ALF nextgroup=mixAlfParam contained
" Opcodes
syn keyword mixOpcode NOP HLT NUM CHAR FLOT FIX nextgroup=mixEndComment contained
syn keyword mixOpcode FADD FSUB FMUL FDIV FCMP MOVE ADD SUB MUL DIV IOC IN OUT JRED JBUS JMP JSJ JOV JNOV JL JE JG JLE JNE JGE SLA SRA SLAX SRAX SLC SRC nextgroup=mixParam contained skipwhite
+syn keyword mixOpcode SLB SRB JAE JAO JXE JXO nextgroup=mixParam contained skipwhite
syn match mixOpcode "LD[AX1-6]N\?\>" nextgroup=mixParam contained skipwhite
syn match mixOpcode "ST[AX1-6JZ]\>" nextgroup=mixParam contained skipwhite
@@ -58,7 +59,7 @@ syn match mixOpcode "J[AX1-6]N\?[NZP]\>" nextgroup=mixParam contained skipwhite
" Switch back to being case sensitive
syn case match
-" Registers (only to used in comments now)
+" Registers (only to be used in comments now)
syn keyword mixRegister rA rX rI1 rI2 rI3 rI4 rI5 rI6 rJ contained
" The default highlighting
diff --git a/runtime/syntax/mma.vim b/runtime/syntax/mma.vim
index c63beb1195..0683adc573 100644
--- a/runtime/syntax/mma.vim
+++ b/runtime/syntax/mma.vim
@@ -35,9 +35,8 @@
" fix nesting
" finish populating popular symbols
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -283,47 +282,38 @@ syntax sync fromstart
"set foldnestmax=1
"set foldminlines=15
-if version >= 508 || !exists("did_mma_syn_inits")
- if version < 508
- let did_mma_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " NOTE - the following links are not guaranteed to
- " look good under all colorschemes. You might need to
- " :so $VIMRUNTIME/syntax/hitest.vim and tweak these to
- " look good in yours
-
-
- HiLink mmaComment Comment
- HiLink mmaCommentStar Comment
- HiLink mmaFunctionComment Comment
- HiLink mmaLooseQuote Comment
- HiLink mmaGenericFunction Function
- HiLink mmaVariable Identifier
-" HiLink mmaSymbol Identifier
- HiLink mmaOperator Operator
- HiLink mmaPatternOp Operator
- HiLink mmaPureFunction Operator
- HiLink mmaString String
- HiLink mmaCommentString String
- HiLink mmaUnicode String
- HiLink mmaMessage Type
- HiLink mmaNumber Type
- HiLink mmaPattern Type
- HiLink mmaError Error
- HiLink mmaFixme Error
- HiLink mmaPatternError Error
- HiLink mmaTodo Todo
- HiLink mmaemPHAsis Special
- HiLink mmaFunctionTitle Special
- HiLink mmaMessageType Special
- HiLink mmaItem Preproc
-
- delcommand HiLink
-endif
+
+" NOTE - the following links are not guaranteed to
+" look good under all colorschemes. You might need to
+" :so $VIMRUNTIME/syntax/hitest.vim and tweak these to
+" look good in yours
+
+
+hi def link mmaComment Comment
+hi def link mmaCommentStar Comment
+hi def link mmaFunctionComment Comment
+hi def link mmaLooseQuote Comment
+hi def link mmaGenericFunction Function
+hi def link mmaVariable Identifier
+" hi def link mmaSymbol Identifier
+hi def link mmaOperator Operator
+hi def link mmaPatternOp Operator
+hi def link mmaPureFunction Operator
+hi def link mmaString String
+hi def link mmaCommentString String
+hi def link mmaUnicode String
+hi def link mmaMessage Type
+hi def link mmaNumber Type
+hi def link mmaPattern Type
+hi def link mmaError Error
+hi def link mmaFixme Error
+hi def link mmaPatternError Error
+hi def link mmaTodo Todo
+hi def link mmaemPHAsis Special
+hi def link mmaFunctionTitle Special
+hi def link mmaMessageType Special
+hi def link mmaItem Preproc
+
let b:current_syntax = "mma"
diff --git a/runtime/syntax/mmix.vim b/runtime/syntax/mmix.vim
index 79ca781402..39e209336e 100644
--- a/runtime/syntax/mmix.vim
+++ b/runtime/syntax/mmix.vim
@@ -9,9 +9,8 @@
" Limitations: Comments must start with either % or //
" (preferably %, Knuth-Style)
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -119,44 +118,34 @@ syn match mmixRegister "r[A-Z]"
syn keyword mmixRegister rBB rTT rWW rXX rYY rZZ
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_mmix_syntax_inits")
- if version < 508
- let did_mmix_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default methods for highlighting. Can be overridden later
- HiLink mmixAt Type
- HiLink mmixPseudo Type
- HiLink mmixRegister Special
- HiLink mmixSegments Type
-
- HiLink mmixLabel Special
- HiLink mmixComment Comment
- HiLink mmixOpcode Keyword
-
- HiLink hexNumber Number
- HiLink decNumber Number
- HiLink octNumber Number
-
- HiLink mmixString String
- HiLink mmixChar String
-
- HiLink mmixType Type
- HiLink mmixIdentifier Normal
- HiLink mmixSpecialComment Comment
-
- " My default color overrides:
- " hi mmixSpecialComment ctermfg=red
- "hi mmixLabel ctermfg=lightcyan
- " hi mmixType ctermbg=black ctermfg=brown
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+" The default methods for highlighting. Can be overridden later
+hi def link mmixAt Type
+hi def link mmixPseudo Type
+hi def link mmixRegister Special
+hi def link mmixSegments Type
+
+hi def link mmixLabel Special
+hi def link mmixComment Comment
+hi def link mmixOpcode Keyword
+
+hi def link hexNumber Number
+hi def link decNumber Number
+hi def link octNumber Number
+
+hi def link mmixString String
+hi def link mmixChar String
+
+hi def link mmixType Type
+hi def link mmixIdentifier Normal
+hi def link mmixSpecialComment Comment
+
+" My default color overrides:
+" hi mmixSpecialComment ctermfg=red
+"hi mmixLabel ctermfg=lightcyan
+" hi mmixType ctermbg=black ctermfg=brown
+
let b:current_syntax = "mmix"
diff --git a/runtime/syntax/mmp.vim b/runtime/syntax/mmp.vim
index 0117e77925..d0b9f7cfb5 100644
--- a/runtime/syntax/mmp.vim
+++ b/runtime/syntax/mmp.vim
@@ -5,11 +5,8 @@
" URL: http://ronware.org/wiki/vim/mmp
" Filetypes: *.mmp
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -34,8 +31,7 @@ syn match mmpNumber "0x\x\+"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
+" Only when an item doesn't have highlighting yet
if !exists("did_mmp_syntax_inits")
let did_mmp_syntax_inits=1
diff --git a/runtime/syntax/modconf.vim b/runtime/syntax/modconf.vim
index 54b6593b66..76b36edcf0 100644
--- a/runtime/syntax/modconf.vim
+++ b/runtime/syntax/modconf.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: modules.conf(5) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2007-10-25
+" Language: modules.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-10-25
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/modsim3.vim b/runtime/syntax/modsim3.vim
index 04e9ab9ab6..ce35033402 100644
--- a/runtime/syntax/modsim3.vim
+++ b/runtime/syntax/modsim3.vim
@@ -12,10 +12,8 @@
"
" very basic things only (based on the modula2 and c files).
-if version < 600
- " Remove any old syntax stuff hanging around
- syn clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -77,31 +75,21 @@ syn region modsim3String start=+"+ end=+"+
syn match modsim3Literal "'[^']'\|''''"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_modsim3_syntax_inits")
- if version < 508
- let did_modsim3_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default methods for highlighting. Can be overridden later
- HiLink modsim3Keyword Statement
- HiLink modsim3Block Statement
- HiLink modsim3Comment1 Comment
- HiLink modsim3Comment2 Comment
- HiLink modsim3String String
- HiLink modsim3Literal Character
- HiLink modsim3Include Statement
- HiLink modsim3Type Type
- HiLink modsim3ParenError Error
- HiLink modsim3Builtin Function
- HiLink modsim3BuiltinNoParen Function
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+" The default methods for highlighting. Can be overridden later
+hi def link modsim3Keyword Statement
+hi def link modsim3Block Statement
+hi def link modsim3Comment1 Comment
+hi def link modsim3Comment2 Comment
+hi def link modsim3String String
+hi def link modsim3Literal Character
+hi def link modsim3Include Statement
+hi def link modsim3Type Type
+hi def link modsim3ParenError Error
+hi def link modsim3Builtin Function
+hi def link modsim3BuiltinNoParen Function
+
let b:current_syntax = "modsim3"
diff --git a/runtime/syntax/modula2.vim b/runtime/syntax/modula2.vim
index 3018900e80..4a14cf1f6f 100644
--- a/runtime/syntax/modula2.vim
+++ b/runtime/syntax/modula2.vim
@@ -4,11 +4,8 @@
" based on original work of Bram Moolenaar <Bram@vim.org>
" Last Change: 2001 May 09
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -54,32 +51,22 @@ syn region modula2String start="'" end="'"
syn region modula2Set start="{" end="}"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_modula2_syntax_inits")
- if version < 508
- let did_modula2_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink modula2Ident Identifier
- HiLink modula2StdConst Boolean
- HiLink modula2Type Identifier
- HiLink modula2StdFunc Identifier
- HiLink modula2Header Type
- HiLink modula2Keyword Statement
- HiLink modula2AttKeyword PreProc
- HiLink modula2Comment Comment
- " The following is just a matter of taste (you want to try this instead):
- " hi modula2Comment term=bold ctermfg=DarkBlue guifg=Blue gui=bold
- HiLink modula2Todo Todo
- HiLink modula2String String
- HiLink modula2Set String
+hi def link modula2Ident Identifier
+hi def link modula2StdConst Boolean
+hi def link modula2Type Identifier
+hi def link modula2StdFunc Identifier
+hi def link modula2Header Type
+hi def link modula2Keyword Statement
+hi def link modula2AttKeyword PreProc
+hi def link modula2Comment Comment
+" The following is just a matter of taste (you want to try this instead):
+" hi modula2Comment term=bold ctermfg=DarkBlue guifg=Blue gui=bold
+hi def link modula2Todo Todo
+hi def link modula2String String
+hi def link modula2Set String
- delcommand HiLink
-endif
let b:current_syntax = "modula2"
diff --git a/runtime/syntax/modula3.vim b/runtime/syntax/modula3.vim
index d6f72afbca..d9b89ca7ce 100644
--- a/runtime/syntax/modula3.vim
+++ b/runtime/syntax/modula3.vim
@@ -6,11 +6,8 @@
" Basic things only...
" Based on the modula 2 syntax file
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -46,24 +43,14 @@ syn region modula3String start=+"+ end=+"+
syn region modula3String start=+'+ end=+'+
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_modula3_syntax_inits")
- if version < 508
- let did_modula3_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- " The default methods for highlighting. Can be overridden later
- HiLink modula3Keyword Statement
- HiLink modula3Block PreProc
- HiLink modula3Comment Comment
- HiLink modula3String String
+" The default methods for highlighting. Can be overridden later
+hi def link modula3Keyword Statement
+hi def link modula3Block PreProc
+hi def link modula3Comment Comment
+hi def link modula3String String
- delcommand HiLink
-endif
let b:current_syntax = "modula3"
diff --git a/runtime/syntax/monk.vim b/runtime/syntax/monk.vim
index afe2b56190..3af810173a 100644
--- a/runtime/syntax/monk.vim
+++ b/runtime/syntax/monk.vim
@@ -21,11 +21,8 @@
" Initializing:
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -60,11 +57,7 @@ syn region monkUnquote matchgroup=Delimiter start=",@#(" end=")" contains=ALLBUT
" R5RS Scheme Functions and Syntax:
-if version < 600
- set iskeyword=33,35-39,42-58,60-90,94,95,97-122,126,_
-else
- setlocal iskeyword=33,35-39,42-58,60-90,94,95,97-122,126,_
-endif
+setlocal iskeyword=33,35-39,42-58,60-90,94,95,97-122,126,_
syn keyword monkSyntax lambda and or if cond case define let let* letrec
syn keyword monkSyntax begin do delay set! else =>
@@ -201,32 +194,22 @@ syn sync match matchPlace grouphere NONE "^[^ \t]"
" ... i.e. synchronize on a line that starts at the left margin
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_monk_syntax_inits")
- if version < 508
- let did_monk_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink monkSyntax Statement
- HiLink monkFunc Function
-
- HiLink monkString String
- HiLink monkChar Character
- HiLink monkNumber Number
- HiLink monkBoolean Boolean
-
- HiLink monkDelimiter Delimiter
- HiLink monkConstant Constant
-
- HiLink monkComment Comment
- HiLink monkError Error
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link monkSyntax Statement
+hi def link monkFunc Function
+
+hi def link monkString String
+hi def link monkChar Character
+hi def link monkNumber Number
+hi def link monkBoolean Boolean
+
+hi def link monkDelimiter Delimiter
+hi def link monkConstant Constant
+
+hi def link monkComment Comment
+hi def link monkError Error
+
let b:current_syntax = "monk"
diff --git a/runtime/syntax/moo.vim b/runtime/syntax/moo.vim
index 10c5d3b4bc..617058f8e3 100644
--- a/runtime/syntax/moo.vim
+++ b/runtime/syntax/moo.vim
@@ -4,8 +4,8 @@
" Last Change: 2001 Oct 06
" Note: Requires Vim 6.0 or above
-" Quit when a syntax file was already loaded
-if version < 600 || exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/mp.vim b/runtime/syntax/mp.vim
index c0fd60b3da..a8fa36fe0a 100644
--- a/runtime/syntax/mp.vim
+++ b/runtime/syntax/mp.vim
@@ -1,132 +1,769 @@
" Vim syntax file
-" Language: MetaPost
-" Maintainer: Andreas Scherer <andreas.scherer@pobox.com>
-" Last Change: April 30, 2001
-
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syn clear
-elseif exists("b:current_syntax")
+" Language: MetaPost
+" Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+" Former Maintainers: Andreas Scherer <andreas.scherer@pobox.com>
+" Last Change: 2016 Oct 14
+
+if exists("b:current_syntax")
finish
endif
-let plain_mf_macros = 0 " plain.mf has no special meaning for MetaPost
-let other_mf_macros = 0 " cmbase.mf, logo.mf, ... neither
+let s:cpo_sav = &cpo
+set cpo&vim
+
+if exists("g:plain_mf_macros")
+ let s:plain_mf_macros = g:plain_mf_macros
+endif
+if exists("g:plain_mf_modes")
+ let s:plain_mf_modes = g:plain_mf_modes
+endif
+if exists("g:other_mf_macros")
+ let s:other_mf_macros = g:other_mf_macros
+endif
+
+let g:plain_mf_macros = 0 " plain.mf has no special meaning for MetaPost
+let g:plain_mf_modes = 0 " No METAFONT modes
+let g:other_mf_macros = 0 " cmbase.mf, logo.mf, ... neither
-" Read the Metafont syntax to start with
-if version < 600
- source <sfile>:p:h/mf.vim
+" Read the METAFONT syntax to start with
+runtime! syntax/mf.vim
+unlet b:current_syntax " Necessary for syn include below
+
+" Restore the value of existing global variables
+if exists("s:plain_mf_macros")
+ let g:plain_mf_macros = s:plain_mf_macros
+else
+ unlet g:plain_mf_macros
+endif
+if exists("s:plain_mf_modes")
+ let g:plain_mf_modes = s:plain_mf_modes
+else
+ unlet g:plain_mf_modes
+endif
+if exists("s:other_mf_macros")
+ let g:other_mf_macros = s:other_mf_macros
else
- runtime! syntax/mf.vim
+ unlet g:other_mf_macros
endif
-" MetaPost has TeX inserts for typeset labels
-" verbatimtex, btex, and etex will be treated as keywords
-syn match mpTeXbegin "\(verbatimtex\|btex\)"
-syn match mpTeXend "etex"
-syn region mpTeXinsert start="\(verbatimtex\|btex\)"hs=e+1 end="etex"he=s-1 contains=mpTeXbegin,mpTeXend keepend
+" Use TeX highlighting inside verbatimtex/btex... etex
+syn include @MPTeX syntax/tex.vim
+unlet b:current_syntax
+" These are defined as keywords rather than using matchgroup
+" in order to make them available to syntaxcomplete.
+syn keyword mpTeXdelim btex etex verbatimtex contained
+syn region mpTeXinsert
+ \ start=/\<verbatimtex\>\|\<btex\>/rs=e+1
+ \ end=/\<etex\>/re=s-1 keepend
+ \ contains=@MPTeX,mpTeXdelim
-" MetaPost primitives not found in Metafont
-syn keyword mpInternal bluepart clip color dashed fontsize greenpart infont
-syn keyword mpInternal linecap linejoin llcorner lrcorner miterlimit mpxbreak
-syn keyword mpInternal prologues redpart setbounds tracinglostchars
-syn keyword mpInternal truecorners ulcorner urcorner withcolor
+" iskeyword must be set after the syn include above, because tex.vim sets `syn
+" iskeyword`. Note that keywords do not contain numbers (numbers are
+" subscripts)
+syntax iskeyword @,_
-" Metafont primitives not found in MetaPost
-syn keyword notDefined autorounding chardx chardy fillin granularity hppp
-syn keyword notDefined proofing smoothing tracingedges tracingpens
-syn keyword notDefined turningcheck vppp xoffset yoffset
+" MetaPost primitives not found in METAFONT
+syn keyword mpBoolExp bounded clipped filled stroked textual arclength
+syn keyword mpNumExp arctime blackpart bluepart colormodel cyanpart
+syn keyword mpNumExp fontsize greenpart greypart magentapart redpart
+syn keyword mpPairExp yellowpart llcorner lrcorner ulcorner urcorner
+" envelope is seemingly undocumented, but it exists since mpost 1.003.
+" The syntax is: envelope <polygonal pen> of <path primary>. For example,
+" path p;
+" p := envelope pensquare of (up--left);
+" (Thanks to Daniel H. Luecking for the example!)
+syn keyword mpPathExp envelope pathpart
+syn keyword mpPenExp penpart
+syn keyword mpPicExp dashpart glyph infont
+syn keyword mpStringExp fontpart readfrom textpart
+syn keyword mpType cmykcolor color rgbcolor
+" Other MetaPost primitives listed in the manual
+syn keyword mpPrimitive mpxbreak within
+" Internal quantities not found in METAFONT
+" (Table 6 in MetaPost: A User's Manual)
+syn keyword mpInternal defaultcolormodel hour minute linecap linejoin
+syn keyword mpInternal miterlimit mpprocset mpversion numberprecision
+syn keyword mpInternal numbersystem outputfilename outputformat
+syn keyword mpInternal outputformatoptions outputtemplate prologues
+syn keyword mpInternal restoreclipcolor tracinglostchars troffmode
+syn keyword mpInternal truecorners
+" List of commands not found in METAFONT (from MetaPost: A User's Manual)
+syn keyword mpCommand clip closefrom dashed filenametemplate fontmapfile
+syn keyword mpCommand fontmapline setbounds withcmykcolor withcolor
+syn keyword mpCommand withgreyscale withoutcolor withpostscript
+syn keyword mpCommand withprescript withrgbcolor write
+" METAFONT internal variables not found in MetaPost
+syn keyword notDefined autorounding chardx chardy fillin granularity
+syn keyword notDefined proofing smoothing tracingedges tracingpens
+syn keyword notDefined turningcheck xoffset yoffset
+" Suffix defined only in METAFONT:
+syn keyword notDefined nodot
+" Other not implemented primitives (see MetaPost: A User's Manual, ยงC.1)
+syn keyword notDefined cull display openwindow numspecial totalweight
+syn keyword notDefined withweight
" Keywords defined by plain.mp
-if !exists("plain_mp_macros")
- let plain_mp_macros = 1 " Set this to '0' if your source gets too colourful
-endif
-if plain_mp_macros
- syn keyword mpMacro ahangle ahlength background bbox bboxmargin beginfig
- syn keyword mpMacro beveled black blue buildcycle butt center cutafter
- syn keyword mpMacro cutbefore cuttings dashpattern defaultfont defaultpen
- syn keyword mpMacro defaultscale dotlabel dotlabels drawarrow drawdblarrow
- syn keyword mpMacro drawoptions endfig evenly extra_beginfig extra_endfig
- syn keyword mpMacro green label labeloffset mitered red rounded squared
- syn keyword mpMacro thelabel white base_name base_version
- syn keyword mpMacro upto downto exitunless relax gobble gobbled
- syn keyword mpMacro interact loggingall tracingall tracingnone
- syn keyword mpMacro eps epsilon infinity right left up down origin
- syn keyword mpMacro quartercircle halfcircle fullcircle unitsquare identity
- syn keyword mpMacro blankpicture withdots ditto EOF pensquare penrazor
- syn keyword mpMacro penspeck whatever abs round ceiling byte dir unitvector
- syn keyword mpMacro inverse counterclockwise tensepath mod div dotprod
- syn keyword mpMacro takepower direction directionpoint intersectionpoint
- syn keyword mpMacro softjoin incr decr reflectedabout rotatedaround
- syn keyword mpMacro rotatedabout min max flex superellipse interpath
- syn keyword mpMacro magstep currentpen currentpen_path currentpicture
- syn keyword mpMacro fill draw filldraw drawdot unfill undraw unfilldraw
- syn keyword mpMacro undrawdot erase cutdraw image pickup numeric_pickup
- syn keyword mpMacro pen_lft pen_rt pen_top pen_bot savepen clearpen
- syn keyword mpMacro clear_pen_memory lft rt top bot ulft urt llft lrt
- syn keyword mpMacro penpos penstroke arrowhead makelabel labels penlabel
- syn keyword mpMacro range numtok thru clearxy clearit clearpen pickup
- syn keyword mpMacro shipit bye hide stop solve
+if get(g:, "plain_mp_macros", 1) || get(g:, "mp_metafun_macros", 0)
+ syn keyword mpDef beginfig clear_pen_memory clearit clearpen clearpen
+ syn keyword mpDef clearxy colorpart cutdraw downto draw drawarrow
+ syn keyword mpDef drawdblarrow drawdot drawoptions endfig erase
+ syn keyword mpDef exitunless fill filldraw flex gobble hide interact
+ syn keyword mpDef label loggingall makelabel numtok penstroke pickup
+ syn keyword mpDef range reflectedabout rotatedaround shipit
+ syn keyword mpDef stop superellipse takepower tracingall tracingnone
+ syn keyword mpDef undraw undrawdot unfill unfilldraw upto
+ syn match mpDef "???"
+ syn keyword mpVardef arrowhead bbox bot buildcycle byte ceiling center
+ syn keyword mpVardef counterclockwise decr dir direction directionpoint
+ syn keyword mpVardef dotlabel dotlabels image incr interpath inverse
+ syn keyword mpVardef labels lft magstep max min penlabels penpos round
+ syn keyword mpVardef rt savepen solve tensepath thelabel top unitvector
+ syn keyword mpVardef whatever z
+ syn keyword mpPrimaryDef div dotprod gobbled mod
+ syn keyword mpSecondaryDef intersectionpoint
+ syn keyword mpTertiaryDef cutafter cutbefore softjoin thru
+ syn keyword mpNewInternal ahangle ahlength bboxmargin beveled butt defaultpen
+ syn keyword mpNewInternal defaultscale dotlabeldiam eps epsilon infinity
+ syn keyword mpNewInternal join_radius labeloffset mitered pen_bot pen_lft
+ syn keyword mpNewInternal pen_rt pen_top rounded squared tolerance
+ " Predefined constants
+ syn keyword mpConstant EOF background base_name base_version black
+ syn keyword mpConstant blankpicture blue ditto down evenly fullcircle
+ syn keyword mpConstant green halfcircle identity left origin penrazor
+ syn keyword mpConstant penspeck pensquare quartercircle red right
+ syn keyword mpConstant unitsquare up white withdots
+ " Other predefined variables
+ syn keyword mpVariable currentpen currentpen_path currentpicture cuttings
+ syn keyword mpVariable defaultfont extra_beginfig extra_endfig
+ syn match mpVariable /\<\%(laboff\|labxf\|labyf\)\>/
+ syn match mpVariable /\<\%(laboff\|labxf\|labyf\)\.\%(lft\|rt\|bot\|top\|ulft\|urt\|llft\|lrt\)\>/
+ " let statements:
+ syn keyword mpnumExp abs
+ syn keyword mpDef rotatedabout
+ syn keyword mpCommand bye relax
+ " on and off are not technically keywords, but it is nice to highlight them
+ " inside dashpattern().
+ syn keyword mpOnOff off on contained
+ syn keyword mpDash dashpattern contained
+ syn region mpDashPattern
+ \ start="dashpattern\s*"
+ \ end=")"he=e-1
+ \ contains=mfNumeric,mfLength,mpOnOff,mpDash
endif
" Keywords defined by mfplain.mp
-if !exists("mfplain_mp_macros")
- let mfplain_mp_macros = 0 " Set this to '1' to include these macro names
-endif
-if mfplain_mp_macros
- syn keyword mpMacro beginchar blacker capsule_def change_width
- syn keyword mpMacro define_blacker_pixels define_corrected_pixels
- syn keyword mpMacro define_good_x_pixels define_good_y_pixels
- syn keyword mpMacro define_horizontal_corrected_pixels
- syn keyword mpMacro define_pixels define_whole_blacker_pixels
- syn keyword mpMacro define_whole_vertical_blacker_pixels
- syn keyword mpMacro define_whole_vertical_pixels endchar
- syn keyword mpMacro extra_beginchar extra_endchar extra_setup
- syn keyword mpMacro font_coding_scheme font_extra_space font_identifier
- syn keyword mpMacro font_normal_shrink font_normal_space
- syn keyword mpMacro font_normal_stretch font_quad font_size
- syn keyword mpMacro font_slant font_x_height italcorr labelfont
- syn keyword mpMacro makebox makegrid maketicks mode_def mode_setup
- syn keyword mpMacro o_correction proofrule proofrulethickness rulepen smode
-
+if get(g:, "mfplain_mp_macros", 0)
+ syn keyword mpDef beginchar capsule_def change_width
+ syn keyword mpDef define_blacker_pixels define_corrected_pixels
+ syn keyword mpDef define_good_x_pixels define_good_y_pixels
+ syn keyword mpDef define_horizontal_corrected_pixels define_pixels
+ syn keyword mpDef define_whole_blacker_pixels define_whole_pixels
+ syn keyword mpDef define_whole_vertical_blacker_pixels
+ syn keyword mpDef define_whole_vertical_pixels endchar
+ syn keyword mpDef font_coding_scheme font_extra_space font_identifier
+ syn keyword mpDef font_normal_shrink font_normal_space
+ syn keyword mpDef font_normal_stretch font_quad font_size font_slant
+ syn keyword mpDef font_x_height italcorr labelfont lowres_fix makebox
+ syn keyword mpDef makegrid maketicks mode_def mode_setup proofrule
+ syn keyword mpDef smode
+ syn keyword mpVardef hround proofrulethickness vround
+ syn keyword mpNewInternal blacker o_correction
+ syn keyword mpVariable extra_beginchar extra_endchar extra_setup rulepen
" plus some no-ops, also from mfplain.mp
- syn keyword mpMacro cullit currenttransform gfcorners grayfont hround
- syn keyword mpMacro imagerules lowres_fix nodisplays notransforms openit
- syn keyword mpMacro proofoffset screenchars screenrule screenstrokes
- syn keyword mpMacro showit slantfont titlefont unitpixel vround
+ syn keyword mpDef cull cullit gfcorners imagerules nodisplays
+ syn keyword mpDef notransforms openit proofoffset screenchars
+ syn keyword mpDef screenrule screenstrokes showit
+ syn keyword mpVardef grayfont slantfont titlefont
+ syn keyword mpVariable currenttransform
+ syn keyword mpConstant unitpixel
+ " These are not listed in the MetaPost manual, and some are ignored by
+ " MetaPost, but are nonetheless defined in mfplain.mp
+ syn keyword mpDef killtext
+ syn match mpVardef "\<good\.\%(x\|y\|lft\|rt\|top\|bot\)\>"
+ syn keyword mpVariable aspect_ratio localfont mag mode mode_name
+ syn keyword mpVariable proofcolor
+ syn keyword mpConstant lowres proof smoke
+ syn keyword mpNewInternal autorounding bp_per_pixel granularity
+ syn keyword mpNewInternal number_of_modes proofing smoothing turningcheck
endif
-" Keywords defined by other macro packages, e.g., boxes.mp
-if !exists("other_mp_macros")
- let other_mp_macros = 1 " Set this to '0' if your source gets too colourful
-endif
-if other_mp_macros
- syn keyword mpMacro circmargin defaultdx defaultdy
- syn keyword mpMacro boxit boxjoin bpath circleit drawboxed drawboxes
- syn keyword mpMacro drawunboxed fixpos fixsize pic
+" Keywords defined by all base macro packages:
+" - (r)boxes.mp
+" - format.mp
+" - graph.mp
+" - marith.mp
+" - sarith.mp
+" - string.mp
+" - TEX.mp
+if get(g:, "other_mp_macros", 1)
+ " boxes and rboxes
+ syn keyword mpDef boxjoin drawboxed drawboxes drawunboxed
+ syn keyword mpNewInternal circmargin defaultdx defaultdy rbox_radius
+ syn keyword mpVardef boxit bpath circleit fixpos fixsize generic_declare
+ syn keyword mpVardef generic_redeclare generisize pic rboxit str_prefix
+ " format
+ syn keyword mpVardef Mformat format init_numbers roundd
+ syn keyword mpVariable Fe_base Fe_plus
+ syn keyword mpConstant Ten_to
+ " graph
+ syn keyword mpDef Gfor Gxyscale OUT auto begingraph endgraph gdata
+ syn keyword mpDef gdraw gdrawarrow gdrawdblarrow gfill plot
+ syn keyword mpVardef augment autogrid frame gdotlabel glabel grid itick
+ syn keyword mpVardef otick
+ syn keyword mpVardef Mreadpath setcoords setrange
+ syn keyword mpNewInternal Gmarks Gminlog Gpaths linear log
+ syn keyword mpVariable Autoform Gemarks Glmarks Gumarks
+ syn keyword mpConstant Gtemplate
+ syn match mpVariable /Gmargin\.\%(low\|high\)/
+ " marith
+ syn keyword mpVardef Mabs Meform Mexp Mexp_str Mlog Mlog_Str Mlog_str
+ syn keyword mpPrimaryDef Mdiv Mmul
+ syn keyword mpSecondaryDef Madd Msub
+ syn keyword mpTertiaryDef Mleq
+ syn keyword mpNewInternal Mten Mzero
+ " sarith
+ syn keyword mpVardef Sabs Scvnum
+ syn keyword mpPrimaryDef Sdiv Smul
+ syn keyword mpSecondaryDef Sadd Ssub
+ syn keyword mpTertiaryDef Sleq Sneq
+ " string
+ syn keyword mpVardef cspan isdigit loptok
+ " TEX
+ syn keyword mpVardef TEX TEXPOST TEXPRE
endif
+" Up to date as of 23-Sep-2016.
+if get(b:, 'mp_metafun_macros', get(g:, 'mp_metafun_macros', 0))
+ " Highlight TeX keywords (for use in ConTeXt documents)
+ syn match mpTeXKeyword '\\[a-zA-Z@]\+'
+
+ " These keywords have been added manually.
+ syn keyword mpPrimitive runscript
+
+ " The following MetaFun keywords have been extracted automatically from
+ " ConTeXt source code. They include all "public" macros (where a macro is
+ " considered public if and only if it does not start with _, mfun_, mlib_, or
+ " do_, and it does not end with _), all "public" unsaved variables, and all
+ " `let` statements.
+
+ " mp-abck.mpiv
+ syn keyword mpDef abck_grid_line anchor_box box_found boxfilloptions
+ syn keyword mpDef boxgridoptions boxlineoptions draw_multi_pars
+ syn keyword mpDef draw_multi_side draw_multi_side_path freeze_box
+ syn keyword mpDef initialize_box initialize_box_pos
+ syn keyword mpDef multi_side_draw_options show_multi_kind
+ syn keyword mpDef show_multi_pars
+ syn keyword mpVardef abck_baseline_grid abck_draw_path abck_graphic_grid
+ syn keyword mpVariable boxdashtype boxfilloffset boxfilltype
+ syn keyword mpVariable boxgriddirection boxgriddistance boxgridshift
+ syn keyword mpVariable boxgridtype boxgridwidth boxlineoffset
+ syn keyword mpVariable boxlineradius boxlinetype boxlinewidth multikind
+ syn keyword mpConstant context_abck
+ " mp-apos.mpiv
+ syn keyword mpDef anch_sidebars_draw boxfilloptions boxlineoptions
+ syn keyword mpDef connect_positions
+ syn keyword mpConstant context_apos
+ " mp-asnc.mpiv
+ syn keyword mpDef FlushSyncTasks ProcessSyncTask ResetSyncTasks
+ syn keyword mpDef SetSyncColor SetSyncThreshold SyncTask
+ syn keyword mpVardef PrepareSyncTasks SyncBox TheSyncColor
+ syn keyword mpVardef TheSyncThreshold
+ syn keyword mpVariable CurrentSyncClass NOfSyncPaths SyncColor
+ syn keyword mpVariable SyncLeftOffset SyncPaths SyncTasks SyncThreshold
+ syn keyword mpVariable SyncThresholdMethod SyncWidth
+ syn keyword mpConstant context_asnc
+ " mp-back.mpiv
+ syn keyword mpDef some_double_back some_hash
+ syn keyword mpVariable back_nillcolor
+ syn keyword mpConstant context_back
+ " mp-bare.mpiv
+ syn keyword mpVardef colordecimals rawtextext
+ syn keyword mpPrimaryDef infont
+ syn keyword mpConstant context_bare
+ " mp-base.mpiv
+ " This is essentially plain.mp with only a few keywords added
+ syn keyword mpNumExp graypart
+ syn keyword mpType graycolor greycolor
+ syn keyword mpConstant cyan magenta yellow
+ " mp-butt.mpiv
+ syn keyword mpDef predefinedbutton some_button
+ syn keyword mpConstant context_butt
+ " mp-char.mpiv
+ syn keyword mpDef flow_begin_chart flow_begin_sub_chart
+ syn keyword mpDef flow_chart_draw_comment flow_chart_draw_exit
+ syn keyword mpDef flow_chart_draw_label flow_chart_draw_text
+ syn keyword mpDef flow_clip_chart flow_collapse_points
+ syn keyword mpDef flow_connect_bottom_bottom flow_connect_bottom_left
+ syn keyword mpDef flow_connect_bottom_right flow_connect_bottom_top
+ syn keyword mpDef flow_connect_left_bottom flow_connect_left_left
+ syn keyword mpDef flow_connect_left_right flow_connect_left_top
+ syn keyword mpDef flow_connect_right_bottom flow_connect_right_left
+ syn keyword mpDef flow_connect_right_right flow_connect_right_top
+ syn keyword mpDef flow_connect_top_bottom flow_connect_top_left
+ syn keyword mpDef flow_connect_top_right flow_connect_top_top
+ syn keyword mpDef flow_draw_connection flow_draw_connection_point
+ syn keyword mpDef flow_draw_midpoint flow_draw_shape
+ syn keyword mpDef flow_draw_test_area flow_draw_test_shape
+ syn keyword mpDef flow_draw_test_shapes flow_end_chart
+ syn keyword mpDef flow_end_sub_chart flow_flush_connections
+ syn keyword mpDef flow_flush_picture flow_flush_pictures
+ syn keyword mpDef flow_flush_shape flow_flush_shapes
+ syn keyword mpDef flow_initialize_grid flow_new_chart flow_new_shape
+ syn keyword mpDef flow_scaled_to_grid flow_show_connection
+ syn keyword mpDef flow_show_connections flow_show_shapes
+ syn keyword mpDef flow_xy_offset flow_y_pos
+ syn keyword mpVardef flow_connection_path flow_down_on_grid
+ syn keyword mpVardef flow_down_to_grid flow_i_point flow_left_on_grid
+ syn keyword mpVardef flow_left_to_grid flow_offset
+ syn keyword mpVardef flow_points_initialized flow_right_on_grid
+ syn keyword mpVardef flow_right_to_grid flow_smooth_connection
+ syn keyword mpVardef flow_trim_points flow_trimmed flow_up_on_grid
+ syn keyword mpVardef flow_up_to_grid flow_valid_connection
+ syn keyword mpVardef flow_x_on_grid flow_xy_bottom flow_xy_left
+ syn keyword mpVardef flow_xy_on_grid flow_xy_right flow_xy_top
+ syn keyword mpVardef flow_y_on_grid
+ syn keyword mpVariable flow_arrowtip flow_chart_background_color
+ syn keyword mpVariable flow_chart_offset flow_comment_offset
+ syn keyword mpVariable flow_connection_arrow_size
+ syn keyword mpVariable flow_connection_dash_size
+ syn keyword mpVariable flow_connection_line_color
+ syn keyword mpVariable flow_connection_line_width
+ syn keyword mpVariable flow_connection_smooth_size flow_connections
+ syn keyword mpVariable flow_cpath flow_dash_pattern flow_dashline
+ syn keyword mpVariable flow_exit_offset flow_forcevalid flow_grid_height
+ syn keyword mpVariable flow_grid_width flow_label_offset flow_max_x
+ syn keyword mpVariable flow_max_y flow_peepshape flow_reverse_connection
+ syn keyword mpVariable flow_reverse_y flow_shape_action flow_shape_archive
+ syn keyword mpVariable flow_shape_decision flow_shape_down
+ syn keyword mpVariable flow_shape_fill_color flow_shape_height
+ syn keyword mpVariable flow_shape_left flow_shape_line_color
+ syn keyword mpVariable flow_shape_line_width flow_shape_loop
+ syn keyword mpVariable flow_shape_multidocument flow_shape_node
+ syn keyword mpVariable flow_shape_procedure flow_shape_product
+ syn keyword mpVariable flow_shape_right flow_shape_singledocument
+ syn keyword mpVariable flow_shape_subprocedure flow_shape_up
+ syn keyword mpVariable flow_shape_wait flow_shape_width
+ syn keyword mpVariable flow_show_all_points flow_show_con_points
+ syn keyword mpVariable flow_show_mid_points flow_showcrossing flow_smooth
+ syn keyword mpVariable flow_touchshape flow_xypoint flow_zfactor
+ syn keyword mpConstant context_flow
+ " mp-chem.mpiv
+ syn keyword mpDef chem_init_all chem_reset chem_start_structure
+ syn keyword mpDef chem_transformed
+ syn keyword mpVardef chem_ad chem_adj chem_align chem_arrow chem_au
+ syn keyword mpVardef chem_b chem_bb chem_bd chem_bw chem_c chem_cc
+ syn keyword mpVardef chem_ccd chem_cd chem_crz chem_cz chem_dash chem_db
+ syn keyword mpVardef chem_diff chem_dir chem_do chem_dr chem_draw
+ syn keyword mpVardef chem_drawarrow chem_eb chem_ed chem_ep chem_er
+ syn keyword mpVardef chem_es chem_et chem_fill chem_hb chem_init_some
+ syn keyword mpVardef chem_label chem_ldb chem_ldd chem_line chem_lr
+ syn keyword mpVardef chem_lrb chem_lrbd chem_lrd chem_lrh chem_lrn
+ syn keyword mpVardef chem_lrt chem_lrz chem_lsr chem_lsub chem_mark
+ syn keyword mpVardef chem_marked chem_mid chem_mids chem_midz chem_mir
+ syn keyword mpVardef chem_mov chem_move chem_number chem_oe chem_off
+ syn keyword mpVardef chem_pb chem_pe chem_r chem_r_fragment chem_rb
+ syn keyword mpVardef chem_rbd chem_rd chem_rdb chem_rdd chem_restore
+ syn keyword mpVardef chem_rh chem_rm chem_rn chem_rot chem_rr chem_rrb
+ syn keyword mpVardef chem_rrbd chem_rrd chem_rrh chem_rrn chem_rrt
+ syn keyword mpVardef chem_rrz chem_rsr chem_rsub chem_rt chem_rz chem_s
+ syn keyword mpVardef chem_save chem_sb chem_sd chem_set chem_sr chem_ss
+ syn keyword mpVardef chem_start_component chem_stop_component
+ syn keyword mpVardef chem_stop_structure chem_sub chem_symbol chem_tb
+ syn keyword mpVardef chem_text chem_z chem_zln chem_zlt chem_zn chem_zrn
+ syn keyword mpVardef chem_zrt chem_zt
+ syn keyword mpVariable chem_mark_pair chem_stack_mirror chem_stack_origin
+ syn keyword mpVariable chem_stack_p chem_stack_previous
+ syn keyword mpVariable chem_stack_rotation chem_trace_boundingbox
+ syn keyword mpVariable chem_trace_nesting chem_trace_text
+ syn keyword mpConstant context_chem
+ " mp-core.mpiv
+ syn keyword mpDef FlushSyncTasks ProcessSyncTask
+ syn keyword mpDef RegisterLocalTextArea RegisterPlainTextArea
+ syn keyword mpDef RegisterRegionTextArea RegisterTextArea
+ syn keyword mpDef ResetLocalTextArea ResetSyncTasks ResetTextAreas
+ syn keyword mpDef SaveTextAreas SetSyncColor SetSyncThreshold
+ syn keyword mpDef SyncTask anchor_box box_found boxfilloptions
+ syn keyword mpDef boxgridoptions boxlineoptions collapse_multi_pars
+ syn keyword mpDef draw_box draw_multi_pars draw_par freeze_box
+ syn keyword mpDef initialize_area initialize_area_par initialize_box
+ syn keyword mpDef initialize_box_pos initialize_par
+ syn keyword mpDef prepare_multi_pars relocate_multipars save_multipar
+ syn keyword mpDef set_par_line_height show_multi_pars show_par
+ syn keyword mpDef simplify_multi_pars sort_multi_pars
+ syn keyword mpVardef InsideSavedTextArea InsideSomeSavedTextArea
+ syn keyword mpVardef InsideSomeTextArea InsideTextArea PrepareSyncTasks
+ syn keyword mpVardef SyncBox TextAreaH TextAreaW TextAreaWH TextAreaX
+ syn keyword mpVardef TextAreaXY TextAreaY TheSyncColor TheSyncThreshold
+ syn keyword mpVardef baseline_grid graphic_grid multi_par_at_top
+ syn keyword mpVariable CurrentSyncClass NOfSavedTextAreas
+ syn keyword mpVariable NOfSavedTextColumns NOfSyncPaths NOfTextAreas
+ syn keyword mpVariable NOfTextColumns PlainTextArea RegionTextArea
+ syn keyword mpVariable SavedTextColumns SyncColor SyncLeftOffset SyncPaths
+ syn keyword mpVariable SyncTasks SyncThreshold SyncThresholdMethod
+ syn keyword mpVariable SyncWidth TextAreas TextColumns
+ syn keyword mpVariable auto_multi_par_hsize boxdashtype boxfilloffset
+ syn keyword mpVariable boxfilltype boxgriddirection boxgriddistance
+ syn keyword mpVariable boxgridshift boxgridtype boxgridwidth boxlineradius
+ syn keyword mpVariable boxlinetype boxlinewidth check_multi_par_chain
+ syn keyword mpVariable compensate_multi_par_topskip
+ syn keyword mpVariable enable_multi_par_fallback force_multi_par_chain
+ syn keyword mpVariable ignore_multi_par_page last_multi_par_shift lefthang
+ syn keyword mpVariable local_multi_par_area multi_column_first_page_hack
+ syn keyword mpVariable multi_par_pages multiloc multilocs multipar
+ syn keyword mpVariable multipars multiref multirefs nofmultipars
+ syn keyword mpVariable obey_multi_par_hang obey_multi_par_more
+ syn keyword mpVariable one_piece_multi_par par_hang_after par_hang_indent
+ syn keyword mpVariable par_indent par_left_skip par_line_height
+ syn keyword mpVariable par_right_skip par_start_pos par_stop_pos
+ syn keyword mpVariable par_strut_depth par_strut_height ppos righthang
+ syn keyword mpVariable snap_multi_par_tops somehang span_multi_column_pars
+ syn keyword mpVariable use_multi_par_region
+ syn keyword mpConstant context_core
+ syn keyword LET anchor_area anchor_par draw_area
+ " mp-cows.mpiv
+ syn keyword mpConstant context_cows cow
+ " mp-crop.mpiv
+ syn keyword mpDef page_marks_add_color page_marks_add_lines
+ syn keyword mpDef page_marks_add_marking page_marks_add_number
+ syn keyword mpVardef crop_color crop_gray crop_marks_cmyk
+ syn keyword mpVardef crop_marks_cmykrgb crop_marks_gray crop_marks_lines
+ syn keyword mpVariable crop_colors more page
+ syn keyword mpConstant context_crop
+ " mp-figs.mpiv
+ syn keyword mpDef naturalfigure registerfigure
+ syn keyword mpVardef figuredimensions figureheight figuresize
+ syn keyword mpVardef figurewidth
+ syn keyword mpConstant context_figs
+ " mp-fobg.mpiv
+ syn keyword mpDef DrawFoFrame
+ syn keyword mpVardef equalpaths
+ syn keyword mpPrimaryDef inset outset
+ syn keyword mpVariable FoBackground FoBackgroundColor FoFrame FoLineColor
+ syn keyword mpVariable FoLineStyle FoLineWidth FoSplit
+ syn keyword mpConstant FoAll FoBottom FoDash FoDotted FoDouble FoGroove
+ syn keyword mpConstant FoHidden FoInset FoLeft FoMedium FoNoColor FoNone
+ syn keyword mpConstant FoOutset FoRidge FoRight FoSolid FoThick FoThin
+ syn keyword mpConstant FoTop context_fobg
+ " mp-form.mpiv
+ syn keyword mpConstant context_form
+ " mp-func.mpiv
+ syn keyword mpDef constructedfunction constructedpairs
+ syn keyword mpDef constructedpath curvedfunction curvedpairs
+ syn keyword mpDef curvedpath function pathconnectors straightfunction
+ syn keyword mpDef straightpairs straightpath
+ syn keyword mpConstant context_func
+ " mp-grap.mpiv
+ syn keyword mpDef Gfor OUT auto begingraph circles crosses diamonds
+ syn keyword mpDef downtriangles endgraph gdata gdraw gdrawarrow
+ syn keyword mpDef gdrawdblarrow gfill graph_addto
+ syn keyword mpDef graph_addto_currentpicture graph_comma
+ syn keyword mpDef graph_coordinate_multiplication graph_draw
+ syn keyword mpDef graph_draw_label graph_errorbar_text graph_fill
+ syn keyword mpDef graph_generate_exponents
+ syn keyword mpDef graph_generate_label_position
+ syn keyword mpDef graph_generate_numbers graph_label_location
+ syn keyword mpDef graph_scan_mark graph_scan_marks graph_setbounds
+ syn keyword mpDef graph_suffix graph_tick_label
+ syn keyword mpDef graph_with_pen_and_color graph_withlist
+ syn keyword mpDef graph_xyscale lefttriangles makefunctionpath plot
+ syn keyword mpDef plotsymbol points rainbow righttriangles smoothpath
+ syn keyword mpDef squares stars uptriangles witherrorbars
+ syn keyword mpVardef addtopath augment autogrid constant_fit
+ syn keyword mpVardef constant_function det escaped_format exp
+ syn keyword mpVardef exponential_fit exponential_function format
+ syn keyword mpVardef formatted frame functionpath gaussian_fit
+ syn keyword mpVardef gaussian_function gdotlabel glabel graph_Feform
+ syn keyword mpVardef graph_Meform graph_arrowhead_extent graph_bounds
+ syn keyword mpVardef graph_clear_bounds
+ syn keyword mpVardef graph_convert_user_path_to_internal graph_cspan
+ syn keyword mpVardef graph_draw_arrowhead graph_error graph_errorbars
+ syn keyword mpVardef graph_exp graph_factor_and_exponent_to_string
+ syn keyword mpVardef graph_gridline_picture graph_is_null
+ syn keyword mpVardef graph_label_convert_user_to_internal graph_loptok
+ syn keyword mpVardef graph_match_exponents graph_mlog
+ syn keyword mpVardef graph_modified_exponent_ypart graph_pair_adjust
+ syn keyword mpVardef graph_picture_conversion graph_post_draw
+ syn keyword mpVardef graph_read_line graph_readpath graph_remap
+ syn keyword mpVardef graph_scan_path graph_select_exponent_mark
+ syn keyword mpVardef graph_select_mark graph_set_bounds
+ syn keyword mpVardef graph_set_default_bounds graph_shapesize
+ syn keyword mpVardef graph_stash_label graph_tick_mark_spacing
+ syn keyword mpVardef graph_unknown_pair_bbox grid isdigit itick
+ syn keyword mpVardef linear_fit linear_function ln logten lorentzian_fit
+ syn keyword mpVardef lorentzian_function otick polynomial_fit
+ syn keyword mpVardef polynomial_function power_law_fit
+ syn keyword mpVardef power_law_function powten setcoords setrange
+ syn keyword mpVardef sortpath strfmt tick varfmt
+ syn keyword mpNewInternal Mzero doubleinfinity graph_log_minimum
+ syn keyword mpNewInternal graph_minimum_number_of_marks largestmantissa
+ syn keyword mpNewInternal linear lntwo log mlogten singleinfinity
+ syn keyword mpVariable Autoform determinant fit_chi_squared
+ syn keyword mpVariable graph_errorbar_picture graph_exp_marks
+ syn keyword mpVariable graph_frame_pair_a graph_frame_pair_b
+ syn keyword mpVariable graph_lin_marks graph_log_marks graph_modified_bias
+ syn keyword mpVariable graph_modified_higher graph_modified_lower
+ syn keyword mpVariable graph_shape r_s resistance_color resistance_name
+ syn keyword mpConstant context_grap
+ " mp-grid.mpiv
+ syn keyword mpDef hlingrid hloggrid vlingrid vloggrid
+ syn keyword mpVardef hlinlabel hlintext hlogtext linlin linlinpath
+ syn keyword mpVardef linlog linlogpath loglin loglinpath loglog
+ syn keyword mpVardef loglogpath processpath vlinlabel vlintext vlogtext
+ syn keyword mpVariable fmt_initialize fmt_pictures fmt_precision
+ syn keyword mpVariable fmt_separator fmt_zerocheck grid_eps
+ syn keyword mpConstant context_grid
+ " mp-grph.mpiv
+ syn keyword mpDef beginfig begingraphictextfig data_mpo_file
+ syn keyword mpDef data_mpy_file doloadfigure draw endfig
+ syn keyword mpDef endgraphictextfig fill fixedplace graphictext
+ syn keyword mpDef loadfigure new_graphictext normalwithshade number
+ syn keyword mpDef old_graphictext outlinefill protectgraphicmacros
+ syn keyword mpDef resetfig reversefill withdrawcolor withfillcolor
+ syn keyword mpDef withshade
+ syn keyword mpVariable currentgraphictext figureshift
+ syn keyword mpConstant context_grph
+ " mp-idea.mpiv
+ syn keyword mpVardef bcomponent ccomponent gcomponent mcomponent
+ syn keyword mpVardef rcomponent somecolor ycomponent
+ " mp-luas.mpiv
+ syn keyword mpDef luacall message
+ syn keyword mpVardef MP lua lualist
+ syn keyword mpConstant context_luas
+ " mp-mlib.mpiv
+ syn keyword mpDef autoalign bitmapimage circular_shade cmyk comment
+ syn keyword mpDef defineshade eofill eofillup externalfigure figure
+ syn keyword mpDef fillup label linear_shade multitonecolor namedcolor
+ syn keyword mpDef nofill onlayer passarrayvariable passvariable
+ syn keyword mpDef plain_label register resolvedcolor scantokens
+ syn keyword mpDef set_circular_vector set_linear_vector shaded
+ syn keyword mpDef spotcolor startpassingvariable stoppassingvariable
+ syn keyword mpDef thelabel transparent[] usemetafunlabels
+ syn keyword mpDef useplainlabels withcircularshade withlinearshade
+ syn keyword mpDef withmask withproperties withshadecenter
+ syn keyword mpDef withshadecolors withshadedirection withshadedomain
+ syn keyword mpDef withshadefactor withshadefraction withshadeorigin
+ syn keyword mpDef withshaderadius withshadestep withshadetransform
+ syn keyword mpDef withshadevector withtransparency
+ syn keyword mpVardef anchored checkbounds checkedbounds
+ syn keyword mpVardef define_circular_shade define_linear_shade dotlabel
+ syn keyword mpVardef escaped_format fmttext fontsize format formatted
+ syn keyword mpVardef installlabel onetimefmttext onetimetextext
+ syn keyword mpVardef outlinetext plain_thelabel properties rawfmttext
+ syn keyword mpVardef rawtexbox rawtextext rule strfmt strut texbox
+ syn keyword mpVardef textext thefmttext thelabel thetexbox thetextext
+ syn keyword mpVardef tostring transparency_alternative_to_number
+ syn keyword mpVardef validtexbox varfmt verbatim
+ syn keyword mpPrimaryDef asgroup infont normalinfont shadedinto
+ syn keyword mpPrimaryDef shownshadecenter shownshadedirection
+ syn keyword mpPrimaryDef shownshadeorigin shownshadevector withshade
+ syn keyword mpPrimaryDef withshademethod
+ syn keyword mpNewInternal colorburntransparent colordodgetransparent
+ syn keyword mpNewInternal colortransparent darkentransparent
+ syn keyword mpNewInternal differencetransparent exclusiontransparent
+ syn keyword mpNewInternal hardlighttransparent huetransparent
+ syn keyword mpNewInternal lightentransparent luminositytransparent
+ syn keyword mpNewInternal multiplytransparent normaltransparent
+ syn keyword mpNewInternal overlaytransparent saturationtransparent
+ syn keyword mpNewInternal screentransparent shadefactor softlighttransparent
+ syn keyword mpNewInternal textextoffset
+ syn keyword mpType property transparency
+ syn keyword mpVariable currentoutlinetext shadeddown shadedleft
+ syn keyword mpVariable shadedright shadedup shadeoffset trace_shades
+ syn keyword mpConstant context_mlib
+ " mp-page.mpiv
+ syn keyword mpDef BoundCoverAreas BoundPageAreas Enlarged FakeRule
+ syn keyword mpDef FakeWord LoadPageState OverlayBox RuleColor
+ syn keyword mpDef SetAreaVariables SetPageArea SetPageBackPage
+ syn keyword mpDef SetPageCoverPage SetPageField SetPageFrontPage
+ syn keyword mpDef SetPageHsize SetPageHstep SetPageLocation
+ syn keyword mpDef SetPagePage SetPageSpine SetPageVariables
+ syn keyword mpDef SetPageVsize SetPageVstep StartCover StartPage
+ syn keyword mpDef StopCover StopPage SwapPageState innerenlarged
+ syn keyword mpDef llEnlarged lrEnlarged outerenlarged ulEnlarged
+ syn keyword mpDef urEnlarged
+ syn keyword mpVardef BackPageHeight BackPageWidth BackSpace BaseLineSkip
+ syn keyword mpVardef BodyFontSize BottomDistance BottomHeight
+ syn keyword mpVardef BottomSpace CoverHeight CoverWidth CurrentColumn
+ syn keyword mpVardef CurrentHeight CurrentWidth CutSpace EmWidth
+ syn keyword mpVardef ExHeight FooterDistance FooterHeight
+ syn keyword mpVardef FrontPageHeight FrontPageWidth HSize HeaderDistance
+ syn keyword mpVardef HeaderHeight InPageBody InnerEdgeDistance
+ syn keyword mpVardef InnerEdgeWidth InnerMarginDistance InnerMarginWidth
+ syn keyword mpVardef InnerSpaceWidth LastPageNumber LayoutColumnDistance
+ syn keyword mpVardef LayoutColumnWidth LayoutColumns LeftEdgeDistance
+ syn keyword mpVardef LeftEdgeWidth LeftMarginDistance LeftMarginWidth
+ syn keyword mpVardef LineHeight MakeupHeight MakeupWidth NOfColumns
+ syn keyword mpVardef NOfPages OnOddPage OnRightPage OuterEdgeDistance
+ syn keyword mpVardef OuterEdgeWidth OuterMarginDistance OuterMarginWidth
+ syn keyword mpVardef OuterSpaceWidth OverlayDepth OverlayHeight
+ syn keyword mpVardef OverlayLineWidth OverlayOffset OverlayWidth
+ syn keyword mpVardef PageDepth PageFraction PageNumber PageOffset
+ syn keyword mpVardef PaperBleed PaperHeight PaperWidth PrintPaperHeight
+ syn keyword mpVardef PrintPaperWidth RealPageNumber RightEdgeDistance
+ syn keyword mpVardef RightEdgeWidth RightMarginDistance RightMarginWidth
+ syn keyword mpVardef SpineHeight SpineWidth StrutDepth StrutHeight
+ syn keyword mpVardef TextHeight TextWidth TopDistance TopHeight TopSkip
+ syn keyword mpVardef TopSpace VSize defaultcolormodel
+ syn keyword mpVariable Area BackPage CoverPage CurrentLayout Field
+ syn keyword mpVariable FrontPage HorPos Hsize Hstep Location Page
+ syn keyword mpVariable PageStateAvailable RuleDepth RuleDirection
+ syn keyword mpVariable RuleFactor RuleH RuleHeight RuleOffset RuleOption
+ syn keyword mpVariable RuleThickness RuleV RuleWidth Spine VerPos Vsize
+ syn keyword mpVariable Vstep
+ syn keyword mpConstant context_page
+ " mp-shap.mpiv
+ syn keyword mpDef drawline drawshape some_shape
+ syn keyword mpDef start_predefined_shape_definition
+ syn keyword mpDef stop_predefined_shape_definition
+ syn keyword mpVardef drawpredefinedline drawpredefinedshape
+ syn keyword mpVardef some_shape_path
+ syn keyword mpVariable predefined_shapes predefined_shapes_xradius
+ syn keyword mpVariable predefined_shapes_xxradius
+ syn keyword mpVariable predefined_shapes_yradius
+ syn keyword mpVariable predefined_shapes_yyradius
+ syn keyword mpConstant context_shap
+ " mp-step.mpiv
+ syn keyword mpDef initialize_step_variables midbottomboundary
+ syn keyword mpDef midtopboundary step_begin_cell step_begin_chart
+ syn keyword mpDef step_cell_ali step_cell_bot step_cell_top
+ syn keyword mpDef step_cells step_end_cell step_end_chart
+ syn keyword mpDef step_text_bot step_text_mid step_text_top
+ syn keyword mpDef step_texts
+ syn keyword mpVariable cell_distance_x cell_distance_y cell_fill_color
+ syn keyword mpVariable cell_line_color cell_line_width cell_offset
+ syn keyword mpVariable chart_align chart_category chart_vertical
+ syn keyword mpVariable line_distance line_height line_line_color
+ syn keyword mpVariable line_line_width line_offset nofcells
+ syn keyword mpVariable text_distance_set text_fill_color text_line_color
+ syn keyword mpVariable text_line_width text_offset
+ syn keyword mpConstant context_cell
+ " mp-symb.mpiv
+ syn keyword mpDef finishglyph prepareglyph
+ syn keyword mpConstant lefttriangle midbar onebar righttriangle sidebar
+ syn keyword mpConstant sublefttriangle subrighttriangle twobar
+ " mp-text.mpiv
+ syn keyword mpDef build_parshape
+ syn keyword mpVardef found_point
+ syn keyword mpVariable trace_parshape
+ syn keyword mpConstant context_text
+ " mp-tool.mpiv
+ syn keyword mpCommand dump
+ syn keyword mpDef addbackground b_color beginglyph break centerarrow
+ syn keyword mpDef clearxy condition data_mpd_file detaileddraw
+ syn keyword mpDef detailpaths dowithpath draw drawboundary
+ syn keyword mpDef drawboundingbox drawcontrollines drawcontrolpoints
+ syn keyword mpDef drawfill draworigin drawpath drawpathonly
+ syn keyword mpDef drawpathwithpoints drawpoint drawpointlabels
+ syn keyword mpDef drawpoints drawticks drawwholepath drawxticks
+ syn keyword mpDef drawyticks endglyph fill finishsavingdata g_color
+ syn keyword mpDef inner_boundingbox job_name leftarrow loadmodule
+ syn keyword mpDef midarrowhead naturalizepaths newboolean newcolor
+ syn keyword mpDef newnumeric newpair newpath newpicture newstring
+ syn keyword mpDef newtransform normalcolors normaldraw normalfill
+ syn keyword mpDef normalwithcolor outer_boundingbox pop_boundingbox
+ syn keyword mpDef popboundingbox popcurrentpicture push_boundingbox
+ syn keyword mpDef pushboundingbox pushcurrentpicture r_color readfile
+ syn keyword mpDef recolor redraw refill register_dirty_chars
+ syn keyword mpDef remapcolor remapcolors remappedcolor reprocess
+ syn keyword mpDef resetarrows resetcolormap resetdrawoptions
+ syn keyword mpDef resolvedcolor restroke retext rightarrow savedata
+ syn keyword mpDef saveoptions scale_currentpicture set_ahlength
+ syn keyword mpDef set_grid showgrid startplaincompatibility
+ syn keyword mpDef startsavingdata stopplaincompatibility
+ syn keyword mpDef stopsavingdata stripe_path_a stripe_path_n undashed
+ syn keyword mpDef undrawfill untext visualizeddraw visualizedfill
+ syn keyword mpDef visualizepaths withcolor withgray
+ syn keyword mpDef xscale_currentpicture xshifted
+ syn keyword mpDef xyscale_currentpicture yscale_currentpicture
+ syn keyword mpDef yshifted
+ syn keyword mpVardef acos acosh anglebetween area arrowhead
+ syn keyword mpVardef arrowheadonpath arrowpath asciistring asin asinh
+ syn keyword mpVardef atan basiccolors bbheight bbwidth bcomponent
+ syn keyword mpVardef blackcolor bottomboundary boundingbox c_phantom
+ syn keyword mpVardef ccomponent center cleanstring colorcircle
+ syn keyword mpVardef colordecimals colordecimalslist colorlike colorpart
+ syn keyword mpVardef colortype complementary complemented copylist cos
+ syn keyword mpVardef cosh cot cotd curved ddddecimal dddecimal ddecimal
+ syn keyword mpVardef decorated drawarrowpath epsed exp freedotlabel
+ syn keyword mpVardef freelabel gcomponent getunstringed grayed greyed
+ syn keyword mpVardef hsvtorgb infinite innerboundingbox interpolated inv
+ syn keyword mpVardef invcos inverted invsin invtan laddered leftboundary
+ syn keyword mpVardef leftpath leftrightpath listsize listtocurves
+ syn keyword mpVardef listtolines ln log mcomponent new_on_grid
+ syn keyword mpVardef outerboundingbox paired pen_size penpoint phantom
+ syn keyword mpVardef pointarrow pow punked rangepath rcomponent
+ syn keyword mpVardef redecorated repathed rightboundary rightpath
+ syn keyword mpVardef rotation roundedsquare set_inner_boundingbox
+ syn keyword mpVardef set_outer_boundingbox setunstringed shapedlist
+ syn keyword mpVardef simplified sin sinh sortlist sqr straightpath tan
+ syn keyword mpVardef tand tanh tensecircle thefreelabel topboundary
+ syn keyword mpVardef tripled undecorated unitvector unspiked unstringed
+ syn keyword mpVardef whitecolor ycomponent
+ syn keyword mpPrimaryDef along blownup bottomenlarged cornered crossed
+ syn keyword mpPrimaryDef enlarged enlonged leftenlarged llenlarged llmoved
+ syn keyword mpPrimaryDef lrenlarged lrmoved on paralleled randomized
+ syn keyword mpPrimaryDef randomizedcontrols randomshifted rightenlarged
+ syn keyword mpPrimaryDef shortened sized smoothed snapped softened squeezed
+ syn keyword mpPrimaryDef stretched superellipsed topenlarged ulenlarged
+ syn keyword mpPrimaryDef ulmoved uncolored urenlarged urmoved xsized
+ syn keyword mpPrimaryDef xstretched xyscaled xysized ysized ystretched zmod
+ syn keyword mpSecondaryDef anglestriped intersection_point numberstriped
+ syn keyword mpSecondaryDef peepholed
+ syn keyword mpTertiaryDef cutends
+ syn keyword mpNewInternal ahdimple ahvariant anglelength anglemethod
+ syn keyword mpNewInternal angleoffset charscale cmykcolormodel graycolormodel
+ syn keyword mpNewInternal greycolormodel maxdimensions metapostversion
+ syn keyword mpNewInternal nocolormodel rgbcolormodel striped_normal_inner
+ syn keyword mpNewInternal striped_normal_outer striped_reverse_inner
+ syn keyword mpNewInternal striped_reverse_outer
+ syn keyword mpType grayscale greyscale quadruplet triplet
+ syn keyword mpVariable ahfactor collapse_data color_map drawoptionsfactor
+ syn keyword mpVariable freedotlabelsize freelabeloffset grid grid_full
+ syn keyword mpVariable grid_h grid_left grid_nx grid_ny grid_w grid_x
+ syn keyword mpVariable grid_y intersection_found originlength
+ syn keyword mpVariable plain_compatibility_data pointlabelfont
+ syn keyword mpVariable pointlabelscale refillbackground savingdata
+ syn keyword mpVariable savingdatadone swappointlabels ticklength tickstep
+ syn keyword mpConstant CRLF DQUOTE PERCENT SPACE bcircle context_tool crlf
+ syn keyword mpConstant darkblue darkcyan darkgray darkgreen darkmagenta
+ syn keyword mpConstant darkred darkyellow downtriangle dquote freesquare
+ syn keyword mpConstant fulldiamond fullsquare fulltriangle lcircle
+ syn keyword mpConstant lefttriangle lightgray llcircle lltriangle lrcircle
+ syn keyword mpConstant lrtriangle mpversion nocolor noline oddly
+ syn keyword mpConstant originpath percent rcircle righttriangle space
+ syn keyword mpConstant tcircle triangle ulcircle ultriangle unitcircle
+ syn keyword mpConstant unitdiamond unittriangle uptriangle urcircle
+ syn keyword mpConstant urtriangle
+endif " MetaFun macros
+
" Define the default highlighting
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_mp_syntax_inits")
- if version < 508
- let did_mp_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink mpTeXinsert String
- HiLink mpTeXbegin Statement
- HiLink mpTeXend Statement
- HiLink mpInternal mfInternal
- HiLink mpMacro Macro
-
- delcommand HiLink
-endif
+hi def link mpTeXdelim mpPrimitive
+hi def link mpBoolExp mfBoolExp
+hi def link mpNumExp mfNumExp
+hi def link mpPairExp mfPairExp
+hi def link mpPathExp mfPathExp
+hi def link mpPenExp mfPenExp
+hi def link mpPicExp mfPicExp
+hi def link mpStringExp mfStringExp
+hi def link mpInternal mfInternal
+hi def link mpCommand mfCommand
+hi def link mpType mfType
+hi def link mpPrimitive mfPrimitive
+hi def link mpDef mfDef
+hi def link mpVardef mpDef
+hi def link mpPrimaryDef mpDef
+hi def link mpSecondaryDef mpDef
+hi def link mpTertiaryDef mpDef
+hi def link mpNewInternal mpInternal
+hi def link mpVariable mfVariable
+hi def link mpConstant mfConstant
+hi def link mpOnOff mpPrimitive
+hi def link mpDash mpPrimitive
+hi def link mpTeXKeyword Identifier
let b:current_syntax = "mp"
-" vim: ts=8
+let &cpo = s:cpo_sav
+unlet! s:cpo_sav
+
+" vim:sw=2
diff --git a/runtime/syntax/msidl.vim b/runtime/syntax/msidl.vim
index 79585bebc6..57eaecaa4f 100644
--- a/runtime/syntax/msidl.vim
+++ b/runtime/syntax/msidl.vim
@@ -3,11 +3,8 @@
" Maintainer: Vadim Zeitlin <vadim@wxwindows.org>
" Last Change: 2012 Feb 12 by Thilo Six
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -56,39 +53,29 @@ syn region msidlSafeArray start="SAFEARRAY(" end=")" contains=msidlStandar
syn sync lines=50
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_msidl_syntax_inits")
- if version < 508
- let did_msidl_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink msidlInclude Include
- HiLink msidlPreProc PreProc
- HiLink msidlPreCondit PreCondit
- HiLink msidlDefine Macro
- HiLink msidlIncluded String
- HiLink msidlString String
- HiLink msidlComment Comment
- HiLink msidlTodo Todo
- HiLink msidlSpecial SpecialChar
- HiLink msidlLiteral Number
- HiLink msidlUUID Number
-
- HiLink msidlImport Include
- HiLink msidlEnum StorageClass
- HiLink msidlStruct Structure
- HiLink msidlTypedef Typedef
- HiLink msidlAttribute StorageClass
-
- HiLink msidlStandardType Type
- HiLink msidlSafeArray Type
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link msidlInclude Include
+hi def link msidlPreProc PreProc
+hi def link msidlPreCondit PreCondit
+hi def link msidlDefine Macro
+hi def link msidlIncluded String
+hi def link msidlString String
+hi def link msidlComment Comment
+hi def link msidlTodo Todo
+hi def link msidlSpecial SpecialChar
+hi def link msidlLiteral Number
+hi def link msidlUUID Number
+
+hi def link msidlImport Include
+hi def link msidlEnum StorageClass
+hi def link msidlStruct Structure
+hi def link msidlTypedef Typedef
+hi def link msidlAttribute StorageClass
+
+hi def link msidlStandardType Type
+hi def link msidlSafeArray Type
+
let b:current_syntax = "msidl"
diff --git a/runtime/syntax/msmessages.vim b/runtime/syntax/msmessages.vim
index 60588571c9..5faee978b4 100644
--- a/runtime/syntax/msmessages.vim
+++ b/runtime/syntax/msmessages.vim
@@ -7,11 +7,8 @@
" See format description at <http://msdn2.microsoft.com/en-us/library/aa385646.aspx>
" This file is based on the rc.vim and c.vim
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/msql.vim b/runtime/syntax/msql.vim
index 0716fbb1f6..60e75a7ef6 100644
--- a/runtime/syntax/msql.vim
+++ b/runtime/syntax/msql.vim
@@ -8,11 +8,8 @@
" Options msql_sql_query = 1 for SQL syntax highligthing inside strings
" msql_minlines = x to sync at least x lines backwards
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -20,12 +17,8 @@ if !exists("main_syntax")
let main_syntax = 'msql'
endif
-if version < 600
- so <sfile>:p:h/html.vim
-else
- runtime! syntax/html.vim
- unlet b:current_syntax
-endif
+runtime! syntax/html.vim
+unlet b:current_syntax
syn cluster htmlPreproc add=msqlRegion
@@ -57,39 +50,29 @@ else
endif
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_msql_syn_inits")
- if version < 508
- let did_msql_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink msqlComment Comment
- HiLink msqlString String
- HiLink msqlNumber Number
- HiLink msqlFloat Float
- HiLink msqlIdentifier Identifier
- HiLink msqlGlobalIdentifier Identifier
- HiLink msqlIntVar Identifier
- HiLink msqlEnvVar Identifier
- HiLink msqlFunctions Function
- HiLink msqlRepeat Repeat
- HiLink msqlConditional Conditional
- HiLink msqlStatement Statement
- HiLink msqlType Type
- HiLink msqlInclude Include
- HiLink msqlDefine Define
- HiLink msqlSpecialChar SpecialChar
- HiLink msqlParentError Error
- HiLink msqlTodo Todo
- HiLink msqlOperator Operator
- HiLink msqlRelation Operator
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link msqlComment Comment
+hi def link msqlString String
+hi def link msqlNumber Number
+hi def link msqlFloat Float
+hi def link msqlIdentifier Identifier
+hi def link msqlGlobalIdentifier Identifier
+hi def link msqlIntVar Identifier
+hi def link msqlEnvVar Identifier
+hi def link msqlFunctions Function
+hi def link msqlRepeat Repeat
+hi def link msqlConditional Conditional
+hi def link msqlStatement Statement
+hi def link msqlType Type
+hi def link msqlInclude Include
+hi def link msqlDefine Define
+hi def link msqlSpecialChar SpecialChar
+hi def link msqlParentError Error
+hi def link msqlTodo Todo
+hi def link msqlOperator Operator
+hi def link msqlRelation Operator
+
let b:current_syntax = "msql"
diff --git a/runtime/syntax/mupad.vim b/runtime/syntax/mupad.vim
index 109f880ee1..55ea9c4e43 100644
--- a/runtime/syntax/mupad.vim
+++ b/runtime/syntax/mupad.vim
@@ -5,11 +5,8 @@
" Date: 6/30/2004
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -268,28 +265,19 @@ syn keyword mupadIdentifier Tubular
" graphics meta-documentation Attributes
syn keyword mupadIdentifier objectGroupsListed
-if version >= 508 || !exists("did_mupad_syntax_inits")
- if version < 508
- let did_mupad_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink mupadComment Comment
- HiLink mupadString String
- HiLink mupadOperator Operator
- HiLink mupadSpecial Special
- HiLink mupadStatement Statement
- HiLink mupadUnderlined Underlined
- HiLink mupadConditional Conditional
- HiLink mupadRepeat Repeat
- HiLink mupadFunction Function
- HiLink mupadType Type
- HiLink mupadDefine Define
- HiLink mupadIdentifier Identifier
+hi def link mupadComment Comment
+hi def link mupadString String
+hi def link mupadOperator Operator
+hi def link mupadSpecial Special
+hi def link mupadStatement Statement
+hi def link mupadUnderlined Underlined
+hi def link mupadConditional Conditional
+hi def link mupadRepeat Repeat
+hi def link mupadFunction Function
+hi def link mupadType Type
+hi def link mupadDefine Define
+hi def link mupadIdentifier Identifier
- delcommand HiLink
-endif
" TODO More comprehensive listing.
diff --git a/runtime/syntax/murphi.vim b/runtime/syntax/murphi.vim
new file mode 100644
index 0000000000..b2faa8c119
--- /dev/null
+++ b/runtime/syntax/murphi.vim
@@ -0,0 +1,127 @@
+" Vim syntax file
+" Language: Murphi model checking language
+" Maintainer: Matthew Fernandez <matthew.fernandez@gmail.com>
+" Last Change: 2017 Aug 27
+" Version: 2
+" Remark: Originally authored by Diego Ongaro <ongaro@cs.stanford.edu>
+
+if version < 600
+ syntax clear
+elseif exists("b:current_syntax")
+ finish
+endif
+
+" Keywords are case insensitive.
+" Keep these in alphabetical order.
+syntax case ignore
+syn keyword murphiKeyword alias
+syn keyword murphiStructure array
+syn keyword murphiKeyword assert
+syn keyword murphiKeyword begin
+syn keyword murphiType boolean
+syn keyword murphiKeyword by
+syn keyword murphiLabel case
+syn keyword murphiKeyword clear
+syn keyword murphiLabel const
+syn keyword murphiRepeat do
+syn keyword murphiConditional else
+syn keyword murphiConditional elsif
+syn keyword murphiKeyword end
+syn keyword murphiKeyword endalias
+syn keyword murphiRepeat endexists
+syn keyword murphiRepeat endfor
+syn keyword murphiRepeat endforall
+syn keyword murphiKeyword endfunction
+syn keyword murphiConditional endif
+syn keyword murphiKeyword endprocedure
+syn keyword murphiStructure endrecord
+syn keyword murphiKeyword endrule
+syn keyword murphiKeyword endruleset
+syn keyword murphiKeyword endstartstate
+syn keyword murphiConditional endswitch
+syn keyword murphiRepeat endwhile
+syn keyword murphiStructure enum
+syn keyword murphiKeyword error
+syn keyword murphiRepeat exists
+syn keyword murphiBoolean false
+syn keyword murphiRepeat for
+syn keyword murphiRepeat forall
+syn keyword murphiKeyword function
+syn keyword murphiConditional if
+syn keyword murphiKeyword in
+syn keyword murphiKeyword interleaved
+syn keyword murphiLabel invariant
+syn keyword murphiFunction ismember
+syn keyword murphiFunction isundefined
+syn keyword murphiKeyword log
+syn keyword murphiStructure of
+syn keyword murphiType multiset
+syn keyword murphiFunction multisetadd
+syn keyword murphiFunction multisetcount
+syn keyword murphiFunction multisetremove
+syn keyword murphiFunction multisetremovepred
+syn keyword murphiKeyword procedure
+syn keyword murphiKeyword process
+syn keyword murphiKeyword program
+syn keyword murphiKeyword put
+syn keyword murphiStructure record
+syn keyword murphiKeyword return
+syn keyword murphiLabel rule
+syn keyword murphiLabel ruleset
+syn keyword murphiType scalarset
+syn keyword murphiLabel startstate
+syn keyword murphiConditional switch
+syn keyword murphiConditional then
+syn keyword murphiRepeat to
+syn keyword murphiKeyword traceuntil
+syn keyword murphiBoolean true
+syn keyword murphiLabel type
+syn keyword murphiKeyword undefine
+syn keyword murphiStructure union
+syn keyword murphiLabel var
+syn keyword murphiRepeat while
+
+syn keyword murphiTodo contained todo xxx fixme
+syntax case match
+
+" Integers.
+syn match murphiNumber "\<\d\+\>"
+
+" Operators and special characters.
+syn match murphiOperator "[\+\-\*\/%&|=!<>:\?]\|\."
+syn match murphiDelimiter "\(:[^=]\|[;,]\)"
+syn match murphiSpecial "[()\[\]]"
+
+" Double equal sign is a common error: use one equal sign for equality testing.
+syn match murphiError "==[^>]"he=e-1
+" Double && and || are errors.
+syn match murphiError "&&\|||"
+
+" Strings. This is defined so late so that it overrides previous matches.
+syn region murphiString start=+"+ end=+"+
+
+" Comments. This is defined so late so that it overrides previous matches.
+syn region murphiComment start="--" end="$" contains=murphiTodo
+syn region murphiComment start="/\*" end="\*/" contains=murphiTodo
+
+" Link the rules to some groups.
+hi def link murphiComment Comment
+hi def link murphiString String
+hi def link murphiNumber Number
+hi def link murphiBoolean Boolean
+hi def link murphiIdentifier Identifier
+hi def link murphiFunction Function
+hi def link murphiStatement Statement
+hi def link murphiConditional Conditional
+hi def link murphiRepeat Repeat
+hi def link murphiLabel Label
+hi def link murphiOperator Operator
+hi def link murphiKeyword Keyword
+hi def link murphiType Type
+hi def link murphiStructure Structure
+hi def link murphiSpecial Special
+hi def link murphiDelimiter Delimiter
+hi def link murphiError Error
+hi def link murphiTodo Todo
+
+let b:current_syntax = "murphi"
diff --git a/runtime/syntax/mush.vim b/runtime/syntax/mush.vim
index 0645f33565..efaae50ae3 100644
--- a/runtime/syntax/mush.vim
+++ b/runtime/syntax/mush.vim
@@ -3,11 +3,8 @@
" Based on vim Syntax file by: Bek Oberin <gossamer@tertius.net.au>
" Last Updated: Fri Nov 04 20:28:15 2005
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -185,42 +182,33 @@ syntax keyword mushAttribute use va vb vc vd ve vf vg vh vi vj vk vl vm vn
syntax keyword mushAttribute vo vp vq vr vs vt vu vv vw vx vy vz
-if version >= 508 || !exists("did_mush_syntax_inits")
- if version < 508
- let did_mush_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default methods for highlighting. Can be overridden later
- HiLink mushAttribute Constant
- HiLink mushCommand Function
- HiLink mushNumber Number
- HiLink mushSetting PreProc
- HiLink mushFunction Statement
- HiLink mushVariable Identifier
- HiLink mushSpecial Special
- HiLink mushTodo Todo
- HiLink mushFlag Special
- HiLink mushIdentifier Identifier
- HiLink mushDefine Macro
- HiLink mushPreProc PreProc
- HiLink mushPreProcGroup PreProc
- HiLink mushPreCondit PreCondit
- HiLink mushIncluded cString
- HiLink mushInclude Include
+
+" The default methods for highlighting. Can be overridden later
+hi def link mushAttribute Constant
+hi def link mushCommand Function
+hi def link mushNumber Number
+hi def link mushSetting PreProc
+hi def link mushFunction Statement
+hi def link mushVariable Identifier
+hi def link mushSpecial Special
+hi def link mushTodo Todo
+hi def link mushFlag Special
+hi def link mushIdentifier Identifier
+hi def link mushDefine Macro
+hi def link mushPreProc PreProc
+hi def link mushPreProcGroup PreProc
+hi def link mushPreCondit PreCondit
+hi def link mushIncluded cString
+hi def link mushInclude Include
" Comments
- HiLink mushCommentStart mushComment
- HiLink mushComment Comment
- HiLink mushCommentString mushString
+hi def link mushCommentStart mushComment
+hi def link mushComment Comment
+hi def link mushCommentString mushString
- delcommand HiLink
-endif
let b:current_syntax = "mush"
diff --git a/runtime/syntax/muttrc.vim b/runtime/syntax/muttrc.vim
index abe9bfd76b..830664e0eb 100644
--- a/runtime/syntax/muttrc.vim
+++ b/runtime/syntax/muttrc.vim
@@ -2,16 +2,12 @@
" Language: Mutt setup files
" Original: Preben 'Peppe' Guldberg <peppe-vim@wielders.org>
" Maintainer: Kyle Wheeler <kyle-muttrc.vim@memoryhole.net>
-" Last Change: 2 Feb 2012
+" Last Change: 21 May 2018
-" This file covers mutt version 1.5.21 (and most of the mercurial tip)
-" Included are also a few features from 1.4.2.1
+" This file covers mutt version 1.10.0
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -19,11 +15,7 @@ let s:cpo_save = &cpo
set cpo&vim
" Set the keyword characters
-if version < 600
- set isk=@,48-57,_,-
-else
- setlocal isk=@,48-57,_,-
-endif
+setlocal isk=@,48-57,_,-
" handling optional variables
if !exists("use_mutt_sidebar")
@@ -98,7 +90,7 @@ syn match muttrcSetNumAssignment contained skipwhite /=\s*'\d\+'/hs=s+1 nextgrou
" Now catch some email addresses and headers (purified version from mail.vim)
syn match muttrcEmail "[a-zA-Z0-9._-]\+@[a-zA-Z0-9./-]\+"
-syn match muttrcHeader "\<\%(From\|To\|C[Cc]\|B[Cc][Cc]\|Reply-To\|Subject\|Return-Path\|Received\|Date\|Replied\|Attach\)\>:\="
+syn match muttrcHeader "\<\c\%(From\|To\|C[Cc]\|B[Cc][Cc]\|Reply-To\|Subject\|Return-Path\|Received\|Date\|Replied\|Attach\)\>:\="
syn match muttrcKeySpecial contained +\%(\\[Cc'"]\|\^\|\\[01]\d\{2}\)+
syn match muttrcKey contained "\S\+" contains=muttrcKeySpecial,muttrcKeyName
@@ -109,143 +101,179 @@ syn match muttrcKeyName contained "\\[trne]"
syn match muttrcKeyName contained "\c<\%(BackSpace\|BackTab\|Delete\|Down\|End\|Enter\|Esc\|Home\|Insert\|Left\|PageDown\|PageUp\|Return\|Right\|Space\|Tab\|Up\)>"
syn match muttrcKeyName contained "<F[0-9]\+>"
-syn keyword muttrcVarBool skipwhite contained allow_8bit allow_ansi arrow_cursor ascii_chars askbcc askcc attach_split auto_tag autoedit beep beep_new nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained bounce_delivered braille_friendly check_new check_mbox_size nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained collapse_unread confirmappend confirmcreate crypt_autoencrypt nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained crypt_autopgp crypt_autosign crypt_autosmime crypt_replyencrypt nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained crypt_replysign crypt_replysignencrypted crypt_timestamp nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained crypt_use_gpgme crypt_use_pka delete_untag digest_collapse duplicate_threads nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained edit_hdrs edit_headers encode_from envelope_from fast_reply nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained fcc_clear followup_to force_name forw_decode nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained forw_decrypt forw_quote forward_decode forward_decrypt nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained forward_quote hdrs header help hidden_host hide_limited nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained hide_missing hide_thread_subject hide_top_limited nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained hide_top_missing honor_disposition ignore_linear_white_space ignore_list_reply_to imap_check_subscribed nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained imap_list_subscribed imap_passive imap_peek imap_servernoise nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained implicit_autoview include_onlyfirst keep_flagged nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained mailcap_sanitize maildir_header_cache_verify maildir_trash nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained mark_old markers menu_move_off menu_scroll message_cache_clean meta_key nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained metoo mh_purge mime_forward_decode narrow_tree pager_stop nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained pgp_auto_decode pgp_auto_traditional pgp_autoencrypt nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained pgp_autoinline pgp_autosign pgp_check_exit nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained pgp_create_traditional pgp_ignore_subkeys pgp_long_ids nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained pgp_replyencrypt pgp_replyinline pgp_replysign nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained pgp_replysignencrypted pgp_retainable_sigs pgp_show_unusable nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained pgp_strict_enc pgp_use_gpg_agent pipe_decode pipe_split nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained pop_auth_try_all pop_last print_decode print_split nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained prompt_after read_only reply_self resolve reverse_alias nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained reverse_name reverse_realname rfc2047_parameters save_address nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained save_empty save_name score sig_dashes sig_on_top nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained smart_wrap smime_ask_cert_label smime_decrypt_use_default_key nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained smime_is_default sort_re ssl_force_tls ssl_use_sslv2 nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained ssl_use_sslv3 ssl_use_tlsv1 ssl_usesystemcerts ssl_verify_dates ssl_verify_host status_on_top nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained strict_mime strict_threads suspend text_flowed thorough_search nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained thread_received tilde uncollapse_jump use_8bitmime nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained use_domain use_envelope_from use_from use_idn use_ipv6 nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained user_agent wait_key weed wrap_search write_bcc nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-
-syn keyword muttrcVarBool skipwhite contained noallow_8bit noallow_ansi noarrow_cursor noascii_chars noaskbcc nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained noaskcc noattach_split noauto_tag noautoedit nobeep nobeep_new nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nobounce_delivered nobraille_friendly nocheck_new nocollapse_unread nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained noconfirmappend noconfirmcreate nocrypt_autoencrypt nocrypt_autopgp nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nocrypt_autosign nocrypt_autosmime nocrypt_replyencrypt nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nocrypt_replysign nocrypt_replysignencrypted nocrypt_timestamp nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nocrypt_use_gpgme nodelete_untag nodigest_collapse noduplicate_threads nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained noedit_hdrs noedit_headers noencode_from noenvelope_from nofast_reply nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nofcc_clear nofollowup_to noforce_name noforw_decode nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained noforw_decrypt noforw_quote noforward_decode noforward_decrypt nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained noforward_quote nohdrs noheader nohelp nohidden_host nohide_limited nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nohide_missing nohide_thread_subject nohide_top_limited nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nohide_top_missing nohonor_disposition noignore_list_reply_to noimap_check_subscribed nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained noimap_list_subscribed noimap_passive noimap_peek noimap_servernoise nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained noimplicit_autoview noinclude_onlyfirst nokeep_flagged nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nomailcap_sanitize nomaildir_header_cache_verify nomaildir_trash nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nomark_old nomarkers nomenu_move_off nomenu_scroll nometa_key nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nometoo nomh_purge nomime_forward_decode nonarrow_tree nopager_stop nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nopgp_auto_decode nopgp_auto_traditional nopgp_autoencrypt nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nopgp_autoinline nopgp_autosign nopgp_check_exit nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nopgp_create_traditional nopgp_ignore_subkeys nopgp_long_ids nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nopgp_replyencrypt nopgp_replyinline nopgp_replysign nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nopgp_replysignencrypted nopgp_retainable_sigs nopgp_show_unusable nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nopgp_strict_enc nopgp_use_gpg_agent nopipe_decode nopipe_split nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nopop_auth_try_all nopop_last noprint_decode noprint_split nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained noprompt_after noread_only noreply_self noresolve noreverse_alias nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained noreverse_name noreverse_realname norfc2047_parameters nosave_address nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nosave_empty nosave_name noscore nosig_dashes nosig_on_top nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nosmart_wrap nosmime_ask_cert_label nosmime_decrypt_use_default_key nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nosmime_is_default nosort_re nossl_force_tls nossl_use_sslv2 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nossl_use_sslv3 nossl_use_tlsv1 nossl_usesystemcerts nostatus_on_top nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nostrict_threads nosuspend notext_flowed nothorough_search nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nothread_received notilde nouncollapse_jump nouse_8bitmime nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nouse_domain nouse_envelope_from nouse_from nouse_idn nouse_ipv6 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained nouser_agent nowait_key noweed nowrap_search nowrite_bcc nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-
-syn keyword muttrcVarBool skipwhite contained invallow_8bit invallow_ansi invarrow_cursor invascii_chars invaskbcc nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invaskcc invattach_split invauto_tag invautoedit invbeep invbeep_new nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invbounce_delivered invbraille_friendly invcheck_new invcollapse_unread nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invconfirmappend invconfirmcreate invcrypt_autoencrypt invcrypt_autopgp nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invcrypt_autosign invcrypt_autosmime invcrypt_replyencrypt nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invcrypt_replysign invcrypt_replysignencrypted invcrypt_timestamp nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invcrypt_use_gpgme invdelete_untag invdigest_collapse invduplicate_threads nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invedit_hdrs invedit_headers invencode_from invenvelope_from invfast_reply nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invfcc_clear invfollowup_to invforce_name invforw_decode nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invforw_decrypt invforw_quote invforward_decode invforward_decrypt nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invforward_quote invhdrs invheader invhelp invhidden_host invhide_limited nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invhide_missing invhide_thread_subject invhide_top_limited nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invhide_top_missing invhonor_disposition invignore_list_reply_to invimap_check_subscribed nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invimap_list_subscribed invimap_passive invimap_peek invimap_servernoise nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invimplicit_autoview invinclude_onlyfirst invkeep_flagged nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invmailcap_sanitize invmaildir_header_cache_verify invmaildir_trash nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invmark_old invmarkers invmenu_move_off invmenu_scroll invmeta_key nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invmetoo invmh_purge invmime_forward_decode invnarrow_tree invpager_stop nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invpgp_auto_decode invpgp_auto_traditional invpgp_autoencrypt nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invpgp_autoinline invpgp_autosign invpgp_check_exit nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invpgp_create_traditional invpgp_ignore_subkeys invpgp_long_ids nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invpgp_replyencrypt invpgp_replyinline invpgp_replysign nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invpgp_replysignencrypted invpgp_retainable_sigs invpgp_show_unusable nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invpgp_strict_enc invpgp_use_gpg_agent invpipe_decode invpipe_split nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invpop_auth_try_all invpop_last invprint_decode invprint_split nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invprompt_after invread_only invreply_self invresolve invreverse_alias nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invreverse_name invreverse_realname invrfc2047_parameters invsave_address nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invsave_empty invsave_name invscore invsig_dashes invsig_on_top nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invsmart_wrap invsmime_ask_cert_label invsmime_decrypt_use_default_key nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invsmime_is_default invsort_re invssl_force_tls invssl_use_sslv2 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invssl_use_sslv3 invssl_use_tlsv1 invssl_usesystemcerts invstatus_on_top nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invstrict_threads invsuspend invtext_flowed invthorough_search nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invthread_received invtilde invuncollapse_jump invuse_8bitmime nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invuse_domain invuse_envelope_from invuse_from invuse_idn invuse_ipv6 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarBool skipwhite contained invuser_agent invwait_key invweed invwrap_search invwrite_bcc nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-if use_mutt_sidebar == 1
- syn keyword muttrcVarBool skipwhite contained sidebar_visible sidebar_sort nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-endif
-
-syn keyword muttrcVarQuad skipwhite contained abort_nosubject abort_unmodified bounce copy nextgroup=muttrcSetQuadAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarQuad skipwhite contained crypt_verify_sig delete fcc_attach forward_edit honor_followup_to nextgroup=muttrcSetQuadAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarQuad skipwhite contained include mime_forward mime_forward_rest mime_fwd move nextgroup=muttrcSetQuadAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarQuad skipwhite contained pgp_mime_auto pgp_verify_sig pop_delete pop_reconnect nextgroup=muttrcSetQuadAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarQuad skipwhite contained postpone print quit recall reply_to ssl_starttls nextgroup=muttrcSetQuadAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-
-syn keyword muttrcVarQuad skipwhite contained noabort_nosubject noabort_unmodified nobounce nocopy nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarQuad skipwhite contained nocrypt_verify_sig nodelete nofcc_attach noforward_edit nohonor_followup_to nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarQuad skipwhite contained noinclude nomime_forward nomime_forward_rest nomime_fwd nomove nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarQuad skipwhite contained nopgp_mime_auto nopgp_verify_sig nopop_delete nopop_reconnect nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarQuad skipwhite contained nopostpone noprint noquit norecall noreply_to nossl_starttls nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-
-syn keyword muttrcVarQuad skipwhite contained invabort_nosubject invabort_unmodified invbounce invcopy nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarQuad skipwhite contained invcrypt_verify_sig invdelete invfcc_attach invforward_edit invhonor_followup_to nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarQuad skipwhite contained invinclude invmime_forward invmime_forward_rest invmime_fwd invmove nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarQuad skipwhite contained invpgp_mime_auto invpgp_verify_sig invpop_delete invpop_reconnect nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarQuad skipwhite contained invpostpone invprint invquit invrecall invreply_to invssl_starttls nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-
-syn keyword muttrcVarNum skipwhite contained connect_timeout history imap_keepalive imap_pipeline_depth mail_check nextgroup=muttrcSetNumAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarNum skipwhite contained menu_context net_inc pager_context pager_index_lines pgp_timeout nextgroup=muttrcSetNumAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarNum skipwhite contained pop_checkinterval read_inc save_history score_threshold_delete nextgroup=muttrcSetNumAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarNum skipwhite contained score_threshold_flag score_threshold_read search_context sendmail_wait sleep_time nextgroup=muttrcSetNumAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarNum skipwhite contained smime_timeout ssl_min_dh_prime_bits timeout time_inc wrap wrapmargin nextgroup=muttrcSetNumAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarNum skipwhite contained write_inc nextgroup=muttrcSetNumAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-if use_mutt_sidebar == 1
- syn keyword muttrcVarNum skipwhite contained sidebar_width nextgroup=muttrcSetNumAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-endif
+syn keyword muttrcVarBool skipwhite contained
+ \ allow_8bit allow_ansi arrow_cursor ascii_chars askbcc askcc attach_split
+ \ auto_tag autoedit beep beep_new bounce_delivered braille_friendly
+ \ browser_abbreviate_mailboxes change_folder_next check_mbox_size check_new
+ \ collapse_unread confirmappend confirmcreate crypt_autoencrypt crypt_autopgp
+ \ crypt_autosign crypt_autosmime crypt_confirmhook crypt_opportunistic_encrypt
+ \ crypt_replyencrypt crypt_replysign crypt_replysignencrypted crypt_timestamp
+ \ crypt_use_gpgme crypt_use_pka delete_untag digest_collapse duplicate_threads
+ \ edit_hdrs edit_headers encode_from envelope_from fast_reply fcc_clear
+ \ flag_safe followup_to force_name forw_decode forw_decrypt forw_quote
+ \ forward_decode forward_decrypt forward_quote hdrs header
+ \ header_color_partial help hidden_host hide_limited hide_missing
+ \ hide_thread_subject hide_top_limited hide_top_missing history_remove_dups
+ \ honor_disposition idn_decode idn_encode ignore_linear_white_space
+ \ ignore_list_reply_to imap_check_subscribed imap_list_subscribed imap_passive
+ \ imap_peek imap_servernoise implicit_autoview include_onlyfirst keep_flagged
+ \ mail_check_recent mail_check_stats mailcap_sanitize maildir_check_cur
+ \ maildir_header_cache_verify maildir_trash mark_old markers menu_move_off
+ \ menu_scroll message_cache_clean meta_key metoo mh_purge mime_forward_decode
+ \ mime_type_query_first narrow_tree pager_stop pgp_auto_decode
+ \ pgp_auto_traditional pgp_autoencrypt pgp_autoinline pgp_autosign
+ \ pgp_check_exit pgp_create_traditional pgp_ignore_subkeys pgp_long_ids
+ \ pgp_replyencrypt pgp_replyinline pgp_replysign pgp_replysignencrypted
+ \ pgp_retainable_sigs pgp_self_encrypt pgp_self_encrypt_as pgp_show_unusable
+ \ pgp_strict_enc pgp_use_gpg_agent pipe_decode pipe_split pop_auth_try_all
+ \ pop_last postpone_encrypt postpone_encrypt_as print_decode print_split
+ \ prompt_after read_only reflow_space_quotes reflow_text reflow_wrap
+ \ reply_self resolve resume_draft_files resume_edited_draft_files
+ \ reverse_alias reverse_name reverse_realname rfc2047_parameters save_address
+ \ save_empty save_name score sidebar_folder_indent sidebar_new_mail_only
+ \ sidebar_next_new_wrap sidebar_short_path sidebar_sort sidebar_visible
+ \ sig_dashes sig_on_top smart_wrap smime_ask_cert_label
+ \ smime_decrypt_use_default_key smime_is_default smime_self_encrypt
+ \ smime_self_encrypt_as sort_re ssl_force_tls ssl_use_sslv2 ssl_use_sslv3
+ \ ssl_use_tlsv1 ssl_usesystemcerts ssl_verify_dates ssl_verify_host
+ \ ssl_verify_partial_chains status_on_top strict_mime strict_threads suspend
+ \ text_flowed thorough_search thread_received tilde ts_enabled uncollapse_jump
+ \ use_8bitmime use_domain use_envelope_from use_from use_idn use_ipv6
+ \ uncollapse_new user_agent wait_key weed wrap_search write_bcc
+ \ nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+
+syn keyword muttrcVarBool skipwhite contained
+ \ noallow_8bit noallow_ansi noarrow_cursor noascii_chars noaskbcc noaskcc
+ \ noattach_split noauto_tag noautoedit nobeep nobeep_new nobounce_delivered
+ \ nobraille_friendly nobrowser_abbreviate_mailboxes nochange_folder_next
+ \ nocheck_mbox_size nocheck_new nocollapse_unread noconfirmappend
+ \ noconfirmcreate nocrypt_autoencrypt nocrypt_autopgp nocrypt_autosign
+ \ nocrypt_autosmime nocrypt_confirmhook nocrypt_opportunistic_encrypt
+ \ nocrypt_replyencrypt nocrypt_replysign nocrypt_replysignencrypted
+ \ nocrypt_timestamp nocrypt_use_gpgme nocrypt_use_pka nodelete_untag
+ \ nodigest_collapse noduplicate_threads noedit_hdrs noedit_headers
+ \ noencode_from noenvelope_from nofast_reply nofcc_clear noflag_safe
+ \ nofollowup_to noforce_name noforw_decode noforw_decrypt noforw_quote
+ \ noforward_decode noforward_decrypt noforward_quote nohdrs noheader
+ \ noheader_color_partial nohelp nohidden_host nohide_limited nohide_missing
+ \ nohide_thread_subject nohide_top_limited nohide_top_missing
+ \ nohistory_remove_dups nohonor_disposition noidn_decode noidn_encode
+ \ noignore_linear_white_space noignore_list_reply_to noimap_check_subscribed
+ \ noimap_list_subscribed noimap_passive noimap_peek noimap_servernoise
+ \ noimplicit_autoview noinclude_onlyfirst nokeep_flagged nomail_check_recent
+ \ nomail_check_stats nomailcap_sanitize nomaildir_check_cur
+ \ nomaildir_header_cache_verify nomaildir_trash nomark_old nomarkers
+ \ nomenu_move_off nomenu_scroll nomessage_cache_clean nometa_key nometoo
+ \ nomh_purge nomime_forward_decode nomime_type_query_first nonarrow_tree
+ \ nopager_stop nopgp_auto_decode nopgp_auto_traditional nopgp_autoencrypt
+ \ nopgp_autoinline nopgp_autosign nopgp_check_exit nopgp_create_traditional
+ \ nopgp_ignore_subkeys nopgp_long_ids nopgp_replyencrypt nopgp_replyinline
+ \ nopgp_replysign nopgp_replysignencrypted nopgp_retainable_sigs
+ \ nopgp_self_encrypt nopgp_self_encrypt_as nopgp_show_unusable
+ \ nopgp_strict_enc nopgp_use_gpg_agent nopipe_decode nopipe_split
+ \ nopop_auth_try_all nopop_last nopostpone_encrypt nopostpone_encrypt_as
+ \ noprint_decode noprint_split noprompt_after noread_only
+ \ noreflow_space_quotes noreflow_text noreflow_wrap noreply_self noresolve
+ \ noresume_draft_files noresume_edited_draft_files noreverse_alias
+ \ noreverse_name noreverse_realname norfc2047_parameters nosave_address
+ \ nosave_empty nosave_name noscore nosidebar_folder_indent
+ \ nosidebar_new_mail_only nosidebar_next_new_wrap nosidebar_short_path
+ \ nosidebar_sort nosidebar_visible nosig_dashes nosig_on_top nosmart_wrap
+ \ nosmime_ask_cert_label nosmime_decrypt_use_default_key nosmime_is_default
+ \ nosmime_self_encrypt nosmime_self_encrypt_as nosort_re nossl_force_tls
+ \ nossl_use_sslv2 nossl_use_sslv3 nossl_use_tlsv1 nossl_usesystemcerts
+ \ nossl_verify_dates nossl_verify_host nossl_verify_partial_chains
+ \ nostatus_on_top nostrict_mime nostrict_threads nosuspend notext_flowed
+ \ nothorough_search nothread_received notilde nots_enabled nouncollapse_jump
+ \ nouse_8bitmime nouse_domain nouse_envelope_from nouse_from nouse_idn
+ \ nouse_ipv6 nouncollapse_new nouser_agent nowait_key noweed nowrap_search
+ \ nowrite_bcc
+ \ nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+
+syn keyword muttrcVarBool skipwhite contained
+ \ invallow_8bit invallow_ansi invarrow_cursor invascii_chars invaskbcc
+ \ invaskcc invattach_split invauto_tag invautoedit invbeep invbeep_new
+ \ invbounce_delivered invbraille_friendly invbrowser_abbreviate_mailboxes
+ \ invchange_folder_next invcheck_mbox_size invcheck_new invcollapse_unread
+ \ invconfirmappend invconfirmcreate invcrypt_autoencrypt invcrypt_autopgp
+ \ invcrypt_autosign invcrypt_autosmime invcrypt_confirmhook
+ \ invcrypt_opportunistic_encrypt invcrypt_replyencrypt invcrypt_replysign
+ \ invcrypt_replysignencrypted invcrypt_timestamp invcrypt_use_gpgme
+ \ invcrypt_use_pka invdelete_untag invdigest_collapse invduplicate_threads
+ \ invedit_hdrs invedit_headers invencode_from invenvelope_from invfast_reply
+ \ invfcc_clear invflag_safe invfollowup_to invforce_name invforw_decode
+ \ invforw_decrypt invforw_quote invforward_decode invforward_decrypt
+ \ invforward_quote invhdrs invheader invheader_color_partial invhelp
+ \ invhidden_host invhide_limited invhide_missing invhide_thread_subject
+ \ invhide_top_limited invhide_top_missing invhistory_remove_dups
+ \ invhonor_disposition invidn_decode invidn_encode
+ \ invignore_linear_white_space invignore_list_reply_to
+ \ invimap_check_subscribed invimap_list_subscribed invimap_passive
+ \ invimap_peek invimap_servernoise invimplicit_autoview invinclude_onlyfirst
+ \ invkeep_flagged invmail_check_recent invmail_check_stats invmailcap_sanitize
+ \ invmaildir_check_cur invmaildir_header_cache_verify invmaildir_trash
+ \ invmark_old invmarkers invmenu_move_off invmenu_scroll
+ \ invmessage_cache_clean invmeta_key invmetoo invmh_purge
+ \ invmime_forward_decode invmime_type_query_first invnarrow_tree invpager_stop
+ \ invpgp_auto_decode invpgp_auto_traditional invpgp_autoencrypt
+ \ invpgp_autoinline invpgp_autosign invpgp_check_exit
+ \ invpgp_create_traditional invpgp_ignore_subkeys invpgp_long_ids
+ \ invpgp_replyencrypt invpgp_replyinline invpgp_replysign
+ \ invpgp_replysignencrypted invpgp_retainable_sigs invpgp_self_encrypt
+ \ invpgp_self_encrypt_as invpgp_show_unusable invpgp_strict_enc
+ \ invpgp_use_gpg_agent invpipe_decode invpipe_split invpop_auth_try_all
+ \ invpop_last invpostpone_encrypt invpostpone_encrypt_as invprint_decode
+ \ invprint_split invprompt_after invread_only invreflow_space_quotes
+ \ invreflow_text invreflow_wrap invreply_self invresolve invresume_draft_files
+ \ invresume_edited_draft_files invreverse_alias invreverse_name
+ \ invreverse_realname invrfc2047_parameters invsave_address invsave_empty
+ \ invsave_name invscore invsidebar_folder_indent invsidebar_new_mail_only
+ \ invsidebar_next_new_wrap invsidebar_short_path invsidebar_sort
+ \ invsidebar_visible invsig_dashes invsig_on_top invsmart_wrap
+ \ invsmime_ask_cert_label invsmime_decrypt_use_default_key invsmime_is_default
+ \ invsmime_self_encrypt invsmime_self_encrypt_as invsort_re invssl_force_tls
+ \ invssl_use_sslv2 invssl_use_sslv3 invssl_use_tlsv1 invssl_usesystemcerts
+ \ invssl_verify_dates invssl_verify_host invssl_verify_partial_chains
+ \ invstatus_on_top invstrict_mime invstrict_threads invsuspend invtext_flowed
+ \ invthorough_search invthread_received invtilde invts_enabled
+ \ invuncollapse_jump invuse_8bitmime invuse_domain invuse_envelope_from
+ \ invuse_from invuse_idn invuse_ipv6 invuncollapse_new invuser_agent
+ \ invwait_key invweed invwrap_search invwrite_bcc
+ \ nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+
+syn keyword muttrcVarQuad skipwhite contained
+ \ abort_nosubject abort_unmodified abort_noattach bounce copy crypt_verify_sig
+ \ delete fcc_attach forward_edit honor_followup_to include mime_forward
+ \ mime_forward_rest mime_fwd move pgp_mime_auto pgp_verify_sig pop_delete
+ \ pop_reconnect postpone print quit recall reply_to ssl_starttls
+ \ nextgroup=muttrcSetQuadAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+
+syn keyword muttrcVarQuad skipwhite contained
+ \ noabort_nosubject noabort_unmodified noabort_noattach nobounce nocopy
+ \ nocrypt_verify_sig nodelete nofcc_attach noforward_edit nohonor_followup_to
+ \ noinclude nomime_forward nomime_forward_rest nomime_fwd nomove
+ \ nopgp_mime_auto nopgp_verify_sig nopop_delete nopop_reconnect nopostpone
+ \ noprint noquit norecall noreply_to nossl_starttls
+ \ nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+
+syn keyword muttrcVarQuad skipwhite contained
+ \ invabort_nosubject invabort_unmodified invabort_noattach invbounce invcopy
+ \ invcrypt_verify_sig invdelete invfcc_attach invforward_edit
+ \ invhonor_followup_to invinclude invmime_forward invmime_forward_rest
+ \ invmime_fwd invmove invpgp_mime_auto invpgp_verify_sig invpop_delete
+ \ invpop_reconnect invpostpone invprint invquit invrecall invreply_to
+ \ invssl_starttls
+ \ nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+
+syn keyword muttrcVarNum skipwhite contained
+ \ connect_timeout error_history history imap_keepalive imap_pipeline_depth
+ \ imap_poll_timeout mail_check mail_check_stats_interval menu_context net_inc
+ \ pager_context pager_index_lines pgp_timeout pop_checkinterval read_inc
+ \ save_history score_threshold_delete score_threshold_flag
+ \ score_threshold_read search_context sendmail_wait sidebar_width sleep_time
+ \ smime_timeout ssl_min_dh_prime_bits time_inc timeout wrap wrap_headers
+ \ wrapmargin write_inc
+ \ nextgroup=muttrcSetNumAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
syn match muttrcFormatErrors contained /%./
@@ -289,7 +317,7 @@ syn match muttrcAliasFormatEscapes contained /%\%(\%(-\?[0-9]\+\)\?\%(\.[0-9]\+\
syn match muttrcQueryFormatEscapes contained /%\%(\%(-\?[0-9]\+\)\?\%(\.[0-9]\+\)\?\)\?[:_]\?[acent%]/
syn match muttrcQueryFormatConditionals contained /%?[e]?/ nextgroup=muttrcFormatConditionals2
" The following info was pulled from mutt_attach_fmt in recvattach.c
-syn match muttrcAttachFormatEscapes contained /%\%(\%(-\?[0-9]\+\)\?\%(\.[0-9]\+\)\?\)\?[:_]\?[CcDdefImMnQstTuX%]/
+syn match muttrcAttachFormatEscapes contained /%\%(\%(-\?[0-9]\+\)\?\%(\.[0-9]\+\)\?\)\?[:_]\?[CcDdeFfImMnQstTuX%]/
syn match muttrcAttachFormatEscapes contained /%[>|*]./
syn match muttrcAttachFormatConditionals contained /%?[CcdDefInmMQstTuX]?/ nextgroup=muttrcFormatConditionals2
syn match muttrcFormatConditionals2 contained /[^?]*?/
@@ -313,7 +341,7 @@ syn match muttrcPGPFormatConditionals contained /%?[nkualfct]?/
syn match muttrcPGPCmdFormatEscapes contained /%\%(\%(-\?[0-9]\+\)\?\%(\.[0-9]\+\)\?\)\?[:_]\?[pfsar%]/
syn match muttrcPGPCmdFormatConditionals contained /%?[pfsar]?/ nextgroup=muttrcFormatConditionals2
" The following info was pulled from status_format_str in status.c
-syn match muttrcStatusFormatEscapes contained /%\%(\%(-\?[0-9]\+\)\?\%(\.[0-9]\+\)\?\)\?[:_]\?[bdfFhlLmMnopPrsStuvV%]/
+syn match muttrcStatusFormatEscapes contained /%\%(\%(-\?[0-9]\+\)\?\%(\.[0-9]\+\)\?\)\?[:_]\?[bdfFhlLmMnopPRrsStuvV%]/
syn match muttrcStatusFormatEscapes contained /%[>|*]./
syn match muttrcStatusFormatConditionals contained /%?[bdFlLmMnoptuV]?/ nextgroup=muttrcFormatConditionals2
" This matches the documentation, but directly contradicts the code
@@ -349,7 +377,7 @@ syn keyword muttrcVarStr contained skipwhite query_format nextgroup=muttrcVarEqu
syn match muttrcVarEqualsQueryFmt contained skipwhite "=" nextgroup=muttrcQueryFormatStr
syn keyword muttrcVarStr contained skipwhite pgp_decode_command pgp_verify_command pgp_decrypt_command pgp_clearsign_command pgp_sign_command pgp_encrypt_sign_command pgp_encrypt_only_command pgp_import_command pgp_export_command pgp_verify_key_command pgp_list_secring_command pgp_list_pubring_command nextgroup=muttrcVarEqualsPGPCmdFmt
syn match muttrcVarEqualsPGPCmdFmt contained skipwhite "=" nextgroup=muttrcPGPCmdFormatStr
-syn keyword muttrcVarStr contained skipwhite status_format nextgroup=muttrcVarEqualsStatusFmt
+syn keyword muttrcVarStr contained skipwhite ts_icon_format ts_status_format status_format nextgroup=muttrcVarEqualsStatusFmt
syn match muttrcVarEqualsStatusFmt contained skipwhite "=" nextgroup=muttrcStatusFormatStr
syn keyword muttrcVarStr contained skipwhite pgp_getkeys_command nextgroup=muttrcVarEqualsPGPGetKeysFmt
syn match muttrcVarEqualsPGPGetKeysFmt contained skipwhite "=" nextgroup=muttrcPGPGetKeysFormatStr
@@ -361,34 +389,29 @@ syn match muttrcVarEqualsStrftimeFmt contained skipwhite "=" nextgroup=muttrcStr
syn match muttrcVPrefix contained /[?&]/ nextgroup=muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
syn match muttrcVarStr contained skipwhite 'my_[a-zA-Z0-9_]\+' nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite alias_file assumed_charset attach_charset attach_sep nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite certificate_file charset config_charset content_type nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite default_hook display_filter dotlock_program dsn_notify nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite dsn_return editor entropy_file envelope_from_address escape folder nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite forw_format forward_format from gecos_mask hdr_format nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite header_cache header_cache_compress header_cache_pagesize nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite history_file hostname imap_authenticators nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite imap_delim_chars imap_headers imap_idle imap_login imap_pass nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite imap_user indent_str indent_string ispell locale mailcap_path nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite mask mbox mbox_type message_cachedir mh_seq_flagged mh_seq_replied nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite mh_seq_unseen mixmaster msg_format pager nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite pgp_good_sign nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite pgp_mime_signature_filename nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite pgp_mime_signature_description pgp_sign_as nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite pgp_sort_keys nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite pipe_sep pop_authenticators pop_host pop_pass pop_user post_indent_str nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite post_indent_string postponed preconnect print_cmd print_command nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite query_command quote_regexp realname record reply_regexp send_charset nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite sendmail shell signature simple_search smileys smime_ca_location nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite smime_certificates smime_default_key nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite smime_encrypt_with nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite smime_keys smime_sign_as nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite smtp_url smtp_authenticators smtp_pass sort sort_alias sort_aux nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite sort_browser spam_separator spoolfile ssl_ca_certificates_file ssl_client_cert nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-syn keyword muttrcVarStr contained skipwhite status_chars tmpdir to_chars tunnel visual nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-if use_mutt_sidebar == 1
- syn keyword muttrcVarStr skipwhite contained sidebar_delim nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
-endif
+syn keyword muttrcVarStr contained skipwhite
+ \ abort_noattach_regexp alias_file assumed_charset attach_charset attach_sep
+ \ attribution_locale certificate_file charset config_charset content_type
+ \ default_hook display_filter dotlock_program dsn_notify dsn_return editor
+ \ entropy_file envelope_from_address escape folder forw_format
+ \ forward_attribution_intro forward_attribution_trailer forward_format from gecos_mask
+ \ hdr_format header_cache header_cache_compress header_cache_pagesize history_file
+ \ hostname imap_authenticators imap_delim_chars imap_headers imap_idle imap_login
+ \ imap_pass imap_user indent_str indent_string ispell locale mailcap_path
+ \ mark_macro_prefix mask mbox mbox_type message_cachedir mh_seq_flagged mh_seq_replied
+ \ mh_seq_unseen mime_type_query_command mixmaster msg_format new_mail_command pager
+ \ pgp_default_key pgp_decryption_okay pgp_good_sign pgp_mime_signature_description
+ \ pgp_mime_signature_filename pgp_sign_as pgp_sort_keys pipe_sep pop_authenticators
+ \ pop_host pop_pass pop_user post_indent_str post_indent_string postpone_encrypt_as
+ \ postponed preconnect print_cmd print_command query_command quote_regexp realname
+ \ record reply_regexp send_charset sendmail shell sidebar_delim sidebar_delim_chars
+ \ sidebar_divider_char sidebar_format sidebar_indent_string sidebar_sort_method
+ \ signature simple_search smileys smime_ca_location smime_certificates
+ \ smime_default_key smime_encrypt_with smime_keys smime_sign_as smime_sign_digest_alg
+ \ smtp_authenticators smtp_pass smtp_url sort sort_alias sort_aux sort_browser
+ \ spam_separator spoolfile ssl_ca_certificates_file ssl_ciphers ssl_client_cert
+ \ status_chars tmpdir to_chars trash ts_icon_format ts_status_format tunnel visual
+ \ nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
" Present in 1.4.2.1 (pgp_create_traditional was a bool then)
syn keyword muttrcVarBool contained skipwhite imap_force_ssl noimap_force_ssl invimap_force_ssl nextgroup=muttrcSetBoolAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
@@ -401,12 +424,12 @@ syn match muttrcMenuCommas /,/ contained
syn keyword muttrcHooks contained skipwhite account-hook charset-hook iconv-hook message-hook folder-hook mbox-hook save-hook fcc-hook fcc-save-hook send-hook send2-hook reply-hook crypt-hook
-syn keyword muttrcCommand auto_view alternative_order exec unalternative_order
-syn keyword muttrcCommand hdr_order iconv-hook ignore mailboxes my_hdr unmailboxes
-syn keyword muttrcCommand pgp-hook push score source unauto_view unhdr_order
-syn keyword muttrcCommand unignore unmono unmy_hdr unscore
-syn keyword muttrcCommand mime_lookup unmime_lookup ungroup
-syn keyword muttrcCommand unalternative_order
+syn keyword muttrcCommand skipwhite
+ \ alternative_order auto_view exec hdr_order iconv-hook ignore mailboxes
+ \ mailto_allow mime_lookup my_hdr pgp-hook push score sidebar_whitelist source
+ \ unalternative_order unalternative_order unauto_view ungroup unhdr_order
+ \ unignore unmailboxes unmailto_allow unmime_lookup unmono unmy_hdr unscore
+ \ unsidebar_whitelist
syn keyword muttrcCommand skipwhite charset-hook nextgroup=muttrcRXString
syn keyword muttrcCommand skipwhite unhook nextgroup=muttrcHooks
@@ -441,7 +464,7 @@ syn match muttrcVariableInner contained "\$[a-zA-Z_-]\+"
syn match muttrcEscapedVariable contained "\\\$[a-zA-Z_-]\+"
syn match muttrcBadAction contained "[^<>]\+" contains=muttrcEmail
-syn match muttrcFunction contained "\<\%(attach\|bounce\|copy\|delete\|display\|flag\|forward\|parent\|pipe\|postpone\|print\|recall\|resend\|save\|send\|tag\|undelete\)-message\>"
+syn match muttrcFunction contained "\<\%(attach\|bounce\|copy\|delete\|display\|flag\|forward\|mark\|parent\|pipe\|postpone\|print\|purge\|recall\|resend\|root\|save\|send\|tag\|undelete\)-message\>"
syn match muttrcFunction contained "\<\%(delete\|next\|previous\|read\|tag\|break\|undelete\)-thread\>"
syn match muttrcFunction contained "\<link-threads\>"
syn match muttrcFunction contained "\<\%(backward\|capitalize\|downcase\|forward\|kill\|upcase\)-word\>"
@@ -453,10 +476,12 @@ syn match muttrcFunction contained "\<current-\%(bottom\|middle\|top\)\>"
syn match muttrcFunction contained "\<decode-\%(copy\|save\)\>"
syn match muttrcFunction contained "\<delete-\%(char\|pattern\|subthread\)\>"
syn match muttrcFunction contained "\<display-\%(address\|toggle-weed\)\>"
-syn match muttrcFunction contained "\<edit\%(-\%(bcc\|cc\|description\|encoding\|fcc\|file\|from\|headers\|mime\|reply-to\|subject\|to\|type\)\)\?\>"
+syn match muttrcFunction contained "\<echo\>"
+syn match muttrcFunction contained "\<edit\%(-\%(bcc\|cc\|description\|encoding\|fcc\|file\|from\|headers\|label\|mime\|reply-to\|subject\|to\|type\)\)\?\>"
syn match muttrcFunction contained "\<enter-\%(command\|mask\)\>"
+syn match muttrcFunction contained "\<error-history\>"
syn match muttrcFunction contained "\<half-\%(up\|down\)\>"
-syn match muttrcFunction contained "\<history-\%(up\|down\)\>"
+syn match muttrcFunction contained "\<history-\%(up\|down\|search\)\>"
syn match muttrcFunction contained "\<kill-\%(eol\|eow\|line\)\>"
syn match muttrcFunction contained "\<next-\%(line\|new\%(-then-unread\)\?\|page\|subthread\|undeleted\|unread\|unread-mailbox\)\>"
syn match muttrcFunction contained "\<previous-\%(line\|new\%(-then-unread\)\?\|page\|subthread\|undeleted\|unread\)\>"
@@ -465,11 +490,16 @@ syn match muttrcFunction contained "\<show-\%(limit\|version\)\>"
syn match muttrcFunction contained "\<sort-\%(mailbox\|reverse\)\>"
syn match muttrcFunction contained "\<tag-\%(pattern\|\%(sub\)\?thread\|prefix\%(-cond\)\?\)\>"
syn match muttrcFunction contained "\<end-cond\>"
+syn match muttrcFunction contained "\<sidebar-\%(next\|next-new\|open\|page-down\|page-up\|prev\|prev-new\|toggle-visible\)\>"
syn match muttrcFunction contained "\<toggle-\%(mailboxes\|new\|quoted\|subscribed\|unlink\|write\)\>"
syn match muttrcFunction contained "\<undelete-\%(pattern\|subthread\)\>"
syn match muttrcFunction contained "\<collapse-\%(parts\|thread\|all\)\>"
+syn match muttrcFunction contained "\<rename-attachment\>"
+syn match muttrcFunction contained "\<subjectrx\>"
+syn match muttrcFunction contained "\<\%(un\)\?setenv\>"
syn match muttrcFunction contained "\<view-\%(attach\|attachments\|file\|mailcap\|name\|text\)\>"
syn match muttrcFunction contained "\<\%(backspace\|backward-char\|bol\|bottom\|bottom-page\|buffy-cycle\|clear-flag\|complete\%(-query\)\?\|copy-file\|create-alias\|detach-file\|eol\|exit\|extract-keys\|\%(imap-\)\?fetch-mail\|forget-passphrase\|forward-char\|group-reply\|help\|ispell\|jump\|limit\|list-reply\|mail\|mail-key\|mark-as-new\|middle-page\|new-mime\|noop\|pgp-menu\|query\|query-append\|quit\|quote-char\|read-subthread\|redraw-screen\|refresh\|rename-file\|reply\|select-new\|set-flag\|shell-escape\|skip-quoted\|sort\|subscribe\|sync-mailbox\|top\|top-page\|transpose-chars\|unsubscribe\|untag-pattern\|verify-key\|what-key\|write-fcc\)\>"
+syn keyword muttrcFunction contained imap-logout-all
if use_mutt_sidebar == 1
syn match muttrcFunction contained "\<sidebar-\%(prev\|next\|open\|scroll-up\|scroll-down\)"
endif
@@ -568,6 +598,7 @@ syn match muttrcOptPattern contained skipwhite /[.]/ nextgroup=muttrcString,mutt
syn region muttrcPattern contained matchgroup=Type keepend skipwhite start=+"+ skip=+\\"+ end=+"+ contains=muttrcSimplePat,muttrcUnHighlightSpace,muttrcSimplePatMetas
syn region muttrcPattern contained matchgroup=Type keepend skipwhite start=+'+ skip=+\\'+ end=+'+ contains=muttrcSimplePat,muttrcUnHighlightSpace,muttrcSimplePatMetas
syn region muttrcPattern contained keepend skipwhite start=+[~](+ end=+)+ skip=+\\)+ contains=muttrcSimplePat
+syn region muttrcPattern contained keepend skipwhite start=+[~][<>](+ end=+)+ skip=+\\)+ contains=muttrcSimplePat
syn match muttrcPattern contained skipwhite /[~][A-Za-z]/ contains=muttrcSimplePat
syn match muttrcPattern contained skipwhite /[.]/
syn region muttrcPatternInner contained keepend start=+"[~=%!(^]+ms=s+1 skip=+\\"+ end=+"+me=e-1 contains=muttrcSimplePat,muttrcUnHighlightSpace,muttrcSimplePatMetas
@@ -578,7 +609,11 @@ syn match muttrcColorMatchCount contained "[0-9]\+"
syn match muttrcColorMatchCountNL contained skipwhite skipnl "\s*\\$" nextgroup=muttrcColorMatchCount,muttrcColorMatchCountNL
syn region muttrcColorRXPat contained start=+\s*'+ skip=+\\'+ end=+'\s*+ keepend skipwhite contains=muttrcRXString2 nextgroup=muttrcColorMatchCount,muttrcColorMatchCountNL
syn region muttrcColorRXPat contained start=+\s*"+ skip=+\\"+ end=+"\s*+ keepend skipwhite contains=muttrcRXString2 nextgroup=muttrcColorMatchCount,muttrcColorMatchCountNL
-syn keyword muttrcColorField contained attachment body bold error hdrdefault header index indicator markers message normal quoted search signature status tilde tree underline
+syn keyword muttrcColorField skipwhite contained
+ \ attachment body bold error hdrdefault header index indicator markers message
+ \ normal prompt quoted search sidebar-divider sidebar-flagged sidebar-highlight
+ \ sidebar-indicator sidebar-new sidebar-spoolfile signature status tilde tree
+ \ underline
syn match muttrcColorField contained "\<quoted\d\=\>"
if use_mutt_sidebar == 1
syn keyword muttrcColorField contained sidebar_new
@@ -634,160 +669,150 @@ syn keyword muttrcMono contained mono skipwhite nextgroup=muttrcColorField
syn match muttrcMonoLine "^\s*mono\s\+\S\+" skipwhite nextgroup=muttrcMonoAttrib contains=muttrcMono
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_muttrc_syntax_inits")
- if version < 508
- let did_muttrc_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink muttrcComment Comment
- HiLink muttrcEscape SpecialChar
- HiLink muttrcRXChars SpecialChar
- HiLink muttrcString String
- HiLink muttrcRXString String
- HiLink muttrcRXString2 String
- HiLink muttrcSpecial Special
- HiLink muttrcHooks Type
- HiLink muttrcGroupFlag Type
- HiLink muttrcGroupDef Macro
- HiLink muttrcAddrDef muttrcGroupFlag
- HiLink muttrcRXDef muttrcGroupFlag
- HiLink muttrcRXPat String
- HiLink muttrcAliasGroupName Macro
- HiLink muttrcAliasKey Identifier
- HiLink muttrcUnAliasKey Identifier
- HiLink muttrcAliasEncEmail Identifier
- HiLink muttrcAliasParens Type
- HiLink muttrcSetNumAssignment Number
- HiLink muttrcSetBoolAssignment Boolean
- HiLink muttrcSetQuadAssignment Boolean
- HiLink muttrcSetStrAssignment String
- HiLink muttrcEmail Special
- HiLink muttrcVariableInner Special
- HiLink muttrcEscapedVariable String
- HiLink muttrcHeader Type
- HiLink muttrcKeySpecial SpecialChar
- HiLink muttrcKey Type
- HiLink muttrcKeyName SpecialChar
- HiLink muttrcVarBool Identifier
- HiLink muttrcVarQuad Identifier
- HiLink muttrcVarNum Identifier
- HiLink muttrcVarStr Identifier
- HiLink muttrcMenu Identifier
- HiLink muttrcCommand Keyword
- HiLink muttrcMacroDescr String
- HiLink muttrcAction Macro
- HiLink muttrcBadAction Error
- HiLink muttrcBindFunction Error
- HiLink muttrcBindMenuList Error
- HiLink muttrcFunction Macro
- HiLink muttrcGroupKeyword muttrcCommand
- HiLink muttrcGroupLine Error
- HiLink muttrcSubscribeKeyword muttrcCommand
- HiLink muttrcSubscribeLine Error
- HiLink muttrcListsKeyword muttrcCommand
- HiLink muttrcListsLine Error
- HiLink muttrcAlternateKeyword muttrcCommand
- HiLink muttrcAlternatesLine Error
- HiLink muttrcAttachmentsLine muttrcCommand
- HiLink muttrcAttachmentsFlag Type
- HiLink muttrcAttachmentsMimeType String
- HiLink muttrcColorLine Error
- HiLink muttrcColorContext Error
- HiLink muttrcColorContextI Identifier
- HiLink muttrcColorContextH Identifier
- HiLink muttrcColorKeyword muttrcCommand
- HiLink muttrcColorKeywordI muttrcColorKeyword
- HiLink muttrcColorKeywordH muttrcColorKeyword
- HiLink muttrcColorField Identifier
- HiLink muttrcColor Type
- HiLink muttrcColorFG Error
- HiLink muttrcColorFGI Error
- HiLink muttrcColorFGH Error
- HiLink muttrcColorBG Error
- HiLink muttrcColorBGI Error
- HiLink muttrcColorBGH Error
- HiLink muttrcMonoAttrib muttrcColor
- HiLink muttrcMono muttrcCommand
- HiLink muttrcSimplePat Identifier
- HiLink muttrcSimplePatString Macro
- HiLink muttrcSimplePatMetas Special
- HiLink muttrcPattern Error
- HiLink muttrcUnColorLine Error
- HiLink muttrcUnColorKeyword muttrcCommand
- HiLink muttrcUnColorIndex Identifier
- HiLink muttrcShellString muttrcEscape
- HiLink muttrcRXHooks muttrcCommand
- HiLink muttrcRXHookNot Type
- HiLink muttrcPatHooks muttrcCommand
- HiLink muttrcPatHookNot Type
- HiLink muttrcFormatConditionals2 Type
- HiLink muttrcIndexFormatStr muttrcString
- HiLink muttrcIndexFormatEscapes muttrcEscape
- HiLink muttrcIndexFormatConditionals muttrcFormatConditionals2
- HiLink muttrcAliasFormatStr muttrcString
- HiLink muttrcAliasFormatEscapes muttrcEscape
- HiLink muttrcAttachFormatStr muttrcString
- HiLink muttrcAttachFormatEscapes muttrcEscape
- HiLink muttrcAttachFormatConditionals muttrcFormatConditionals2
- HiLink muttrcComposeFormatStr muttrcString
- HiLink muttrcComposeFormatEscapes muttrcEscape
- HiLink muttrcFolderFormatStr muttrcString
- HiLink muttrcFolderFormatEscapes muttrcEscape
- HiLink muttrcFolderFormatConditionals muttrcFormatConditionals2
- HiLink muttrcMixFormatStr muttrcString
- HiLink muttrcMixFormatEscapes muttrcEscape
- HiLink muttrcMixFormatConditionals muttrcFormatConditionals2
- HiLink muttrcPGPFormatStr muttrcString
- HiLink muttrcPGPFormatEscapes muttrcEscape
- HiLink muttrcPGPFormatConditionals muttrcFormatConditionals2
- HiLink muttrcPGPCmdFormatStr muttrcString
- HiLink muttrcPGPCmdFormatEscapes muttrcEscape
- HiLink muttrcPGPCmdFormatConditionals muttrcFormatConditionals2
- HiLink muttrcStatusFormatStr muttrcString
- HiLink muttrcStatusFormatEscapes muttrcEscape
- HiLink muttrcStatusFormatConditionals muttrcFormatConditionals2
- HiLink muttrcPGPGetKeysFormatStr muttrcString
- HiLink muttrcPGPGetKeysFormatEscapes muttrcEscape
- HiLink muttrcSmimeFormatStr muttrcString
- HiLink muttrcSmimeFormatEscapes muttrcEscape
- HiLink muttrcSmimeFormatConditionals muttrcFormatConditionals2
- HiLink muttrcTimeEscapes muttrcEscape
- HiLink muttrcPGPTimeEscapes muttrcEscape
- HiLink muttrcStrftimeEscapes Type
- HiLink muttrcStrftimeFormatStr muttrcString
- HiLink muttrcFormatErrors Error
-
- HiLink muttrcBindFunctionNL SpecialChar
- HiLink muttrcBindKeyNL SpecialChar
- HiLink muttrcBindMenuListNL SpecialChar
- HiLink muttrcMacroDescrNL SpecialChar
- HiLink muttrcMacroBodyNL SpecialChar
- HiLink muttrcMacroKeyNL SpecialChar
- HiLink muttrcMacroMenuListNL SpecialChar
- HiLink muttrcColorMatchCountNL SpecialChar
- HiLink muttrcColorNL SpecialChar
- HiLink muttrcColorRXNL SpecialChar
- HiLink muttrcColorBGNL SpecialChar
- HiLink muttrcColorFGNL SpecialChar
- HiLink muttrcAliasNameNL SpecialChar
- HiLink muttrcAliasENNL SpecialChar
- HiLink muttrcAliasNL SpecialChar
- HiLink muttrcUnAliasNL SpecialChar
- HiLink muttrcAliasGroupDefNL SpecialChar
- HiLink muttrcAliasEncEmailNL SpecialChar
- HiLink muttrcPatternNL SpecialChar
- HiLink muttrcUnColorPatNL SpecialChar
- HiLink muttrcUnColorAPNL SpecialChar
- HiLink muttrcUnColorIndexNL SpecialChar
- HiLink muttrcStringNL SpecialChar
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link muttrcComment Comment
+hi def link muttrcEscape SpecialChar
+hi def link muttrcRXChars SpecialChar
+hi def link muttrcString String
+hi def link muttrcRXString String
+hi def link muttrcRXString2 String
+hi def link muttrcSpecial Special
+hi def link muttrcHooks Type
+hi def link muttrcGroupFlag Type
+hi def link muttrcGroupDef Macro
+hi def link muttrcAddrDef muttrcGroupFlag
+hi def link muttrcRXDef muttrcGroupFlag
+hi def link muttrcRXPat String
+hi def link muttrcAliasGroupName Macro
+hi def link muttrcAliasKey Identifier
+hi def link muttrcUnAliasKey Identifier
+hi def link muttrcAliasEncEmail Identifier
+hi def link muttrcAliasParens Type
+hi def link muttrcSetNumAssignment Number
+hi def link muttrcSetBoolAssignment Boolean
+hi def link muttrcSetQuadAssignment Boolean
+hi def link muttrcSetStrAssignment String
+hi def link muttrcEmail Special
+hi def link muttrcVariableInner Special
+hi def link muttrcEscapedVariable String
+hi def link muttrcHeader Type
+hi def link muttrcKeySpecial SpecialChar
+hi def link muttrcKey Type
+hi def link muttrcKeyName SpecialChar
+hi def link muttrcVarBool Identifier
+hi def link muttrcVarQuad Identifier
+hi def link muttrcVarNum Identifier
+hi def link muttrcVarStr Identifier
+hi def link muttrcMenu Identifier
+hi def link muttrcCommand Keyword
+hi def link muttrcMacroDescr String
+hi def link muttrcAction Macro
+hi def link muttrcBadAction Error
+hi def link muttrcBindFunction Error
+hi def link muttrcBindMenuList Error
+hi def link muttrcFunction Macro
+hi def link muttrcGroupKeyword muttrcCommand
+hi def link muttrcGroupLine Error
+hi def link muttrcSubscribeKeyword muttrcCommand
+hi def link muttrcSubscribeLine Error
+hi def link muttrcListsKeyword muttrcCommand
+hi def link muttrcListsLine Error
+hi def link muttrcAlternateKeyword muttrcCommand
+hi def link muttrcAlternatesLine Error
+hi def link muttrcAttachmentsLine muttrcCommand
+hi def link muttrcAttachmentsFlag Type
+hi def link muttrcAttachmentsMimeType String
+hi def link muttrcColorLine Error
+hi def link muttrcColorContext Error
+hi def link muttrcColorContextI Identifier
+hi def link muttrcColorContextH Identifier
+hi def link muttrcColorKeyword muttrcCommand
+hi def link muttrcColorKeywordI muttrcColorKeyword
+hi def link muttrcColorKeywordH muttrcColorKeyword
+hi def link muttrcColorField Identifier
+hi def link muttrcColor Type
+hi def link muttrcColorFG Error
+hi def link muttrcColorFGI Error
+hi def link muttrcColorFGH Error
+hi def link muttrcColorBG Error
+hi def link muttrcColorBGI Error
+hi def link muttrcColorBGH Error
+hi def link muttrcMonoAttrib muttrcColor
+hi def link muttrcMono muttrcCommand
+hi def link muttrcSimplePat Identifier
+hi def link muttrcSimplePatString Macro
+hi def link muttrcSimplePatMetas Special
+hi def link muttrcPattern Error
+hi def link muttrcUnColorLine Error
+hi def link muttrcUnColorKeyword muttrcCommand
+hi def link muttrcUnColorIndex Identifier
+hi def link muttrcShellString muttrcEscape
+hi def link muttrcRXHooks muttrcCommand
+hi def link muttrcRXHookNot Type
+hi def link muttrcPatHooks muttrcCommand
+hi def link muttrcPatHookNot Type
+hi def link muttrcFormatConditionals2 Type
+hi def link muttrcIndexFormatStr muttrcString
+hi def link muttrcIndexFormatEscapes muttrcEscape
+hi def link muttrcIndexFormatConditionals muttrcFormatConditionals2
+hi def link muttrcAliasFormatStr muttrcString
+hi def link muttrcAliasFormatEscapes muttrcEscape
+hi def link muttrcAttachFormatStr muttrcString
+hi def link muttrcAttachFormatEscapes muttrcEscape
+hi def link muttrcAttachFormatConditionals muttrcFormatConditionals2
+hi def link muttrcComposeFormatStr muttrcString
+hi def link muttrcComposeFormatEscapes muttrcEscape
+hi def link muttrcFolderFormatStr muttrcString
+hi def link muttrcFolderFormatEscapes muttrcEscape
+hi def link muttrcFolderFormatConditionals muttrcFormatConditionals2
+hi def link muttrcMixFormatStr muttrcString
+hi def link muttrcMixFormatEscapes muttrcEscape
+hi def link muttrcMixFormatConditionals muttrcFormatConditionals2
+hi def link muttrcPGPFormatStr muttrcString
+hi def link muttrcPGPFormatEscapes muttrcEscape
+hi def link muttrcPGPFormatConditionals muttrcFormatConditionals2
+hi def link muttrcPGPCmdFormatStr muttrcString
+hi def link muttrcPGPCmdFormatEscapes muttrcEscape
+hi def link muttrcPGPCmdFormatConditionals muttrcFormatConditionals2
+hi def link muttrcStatusFormatStr muttrcString
+hi def link muttrcStatusFormatEscapes muttrcEscape
+hi def link muttrcStatusFormatConditionals muttrcFormatConditionals2
+hi def link muttrcPGPGetKeysFormatStr muttrcString
+hi def link muttrcPGPGetKeysFormatEscapes muttrcEscape
+hi def link muttrcSmimeFormatStr muttrcString
+hi def link muttrcSmimeFormatEscapes muttrcEscape
+hi def link muttrcSmimeFormatConditionals muttrcFormatConditionals2
+hi def link muttrcTimeEscapes muttrcEscape
+hi def link muttrcPGPTimeEscapes muttrcEscape
+hi def link muttrcStrftimeEscapes Type
+hi def link muttrcStrftimeFormatStr muttrcString
+hi def link muttrcFormatErrors Error
+
+hi def link muttrcBindFunctionNL SpecialChar
+hi def link muttrcBindKeyNL SpecialChar
+hi def link muttrcBindMenuListNL SpecialChar
+hi def link muttrcMacroDescrNL SpecialChar
+hi def link muttrcMacroBodyNL SpecialChar
+hi def link muttrcMacroKeyNL SpecialChar
+hi def link muttrcMacroMenuListNL SpecialChar
+hi def link muttrcColorMatchCountNL SpecialChar
+hi def link muttrcColorNL SpecialChar
+hi def link muttrcColorRXNL SpecialChar
+hi def link muttrcColorBGNL SpecialChar
+hi def link muttrcColorFGNL SpecialChar
+hi def link muttrcAliasNameNL SpecialChar
+hi def link muttrcAliasENNL SpecialChar
+hi def link muttrcAliasNL SpecialChar
+hi def link muttrcUnAliasNL SpecialChar
+hi def link muttrcAliasGroupDefNL SpecialChar
+hi def link muttrcAliasEncEmailNL SpecialChar
+hi def link muttrcPatternNL SpecialChar
+hi def link muttrcUnColorPatNL SpecialChar
+hi def link muttrcUnColorAPNL SpecialChar
+hi def link muttrcUnColorIndexNL SpecialChar
+hi def link muttrcStringNL SpecialChar
+
let b:current_syntax = "muttrc"
diff --git a/runtime/syntax/mysql.vim b/runtime/syntax/mysql.vim
index d7cf74710d..8bd7b6459a 100644
--- a/runtime/syntax/mysql.vim
+++ b/runtime/syntax/mysql.vim
@@ -6,11 +6,8 @@
" URL: ftp://cedar-solutions.com/software/mysql.vim
" Note: The definitions below are taken from the mysql user manual as of April 2002, for version 3.23
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -273,29 +270,19 @@ syn region mysqlFunction start="weekday(" end=")" contains=ALL
syn region mysqlFunction start="yearweek(" end=")" contains=ALL
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_mysql_syn_inits")
- if version < 508
- let did_mysql_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink mysqlKeyword Statement
- HiLink mysqlSpecial Special
- HiLink mysqlString String
- HiLink mysqlNumber Number
- HiLink mysqlVariable Identifier
- HiLink mysqlComment Comment
- HiLink mysqlType Type
- HiLink mysqlOperator Statement
- HiLink mysqlFlow Statement
- HiLink mysqlFunction Function
+hi def link mysqlKeyword Statement
+hi def link mysqlSpecial Special
+hi def link mysqlString String
+hi def link mysqlNumber Number
+hi def link mysqlVariable Identifier
+hi def link mysqlComment Comment
+hi def link mysqlType Type
+hi def link mysqlOperator Statement
+hi def link mysqlFlow Statement
+hi def link mysqlFunction Function
- delcommand HiLink
-endif
let b:current_syntax = "mysql"
diff --git a/runtime/syntax/n1ql.vim b/runtime/syntax/n1ql.vim
new file mode 100644
index 0000000000..bef65d8f64
--- /dev/null
+++ b/runtime/syntax/n1ql.vim
@@ -0,0 +1,434 @@
+" Vim syntax file
+" Language: N1QL / Couchbase Server
+" Maintainer: Eugene Ciurana <n1ql AT cime.net>
+" Version: 1.0
+" Source: https://github.com/pr3d4t0r/n1ql-vim-syntax
+"
+" License: Vim is Charityware. n1ql.vim syntax is Charityware.
+" (c) Copyright 2017 by Eugene Ciurana / pr3d4t0r. Licensed
+" under the standard VIM LICENSE - Vim command :help uganda.txt
+" for details.
+"
+" Questions, comments: <n1ql AT cime.net>
+" https://ciurana.eu/pgp, https://keybase.io/pr3d4t0r
+"
+" vim: set fileencoding=utf-8:
+
+
+if exists("b:current_syntax")
+ finish
+endif
+
+
+syn case ignore
+
+syn keyword n1qlSpecial DATASTORES
+syn keyword n1qlSpecial DUAL
+syn keyword n1qlSpecial FALSE
+syn keyword n1qlSpecial INDEXES
+syn keyword n1qlSpecial KEYSPACES
+syn keyword n1qlSpecial MISSING
+syn keyword n1qlSpecial NAMESPACES
+syn keyword n1qlSpecial NULL
+syn keyword n1qlSpecial TRUE
+
+
+"
+" *** keywords ***
+"
+syn keyword n1qlKeyword ALL
+syn keyword n1qlKeyword ANY
+syn keyword n1qlKeyword ASC
+syn keyword n1qlKeyword BEGIN
+syn keyword n1qlKeyword BETWEEN
+syn keyword n1qlKeyword BREAK
+syn keyword n1qlKeyword BUCKET
+syn keyword n1qlKeyword CALL
+syn keyword n1qlKeyword CASE
+syn keyword n1qlKeyword CAST
+syn keyword n1qlKeyword CLUSTER
+syn keyword n1qlKeyword COLLATE
+syn keyword n1qlKeyword COLLECTION
+syn keyword n1qlKeyword CONNECT
+syn keyword n1qlKeyword CONTINUE
+syn keyword n1qlKeyword CORRELATE
+syn keyword n1qlKeyword COVER
+syn keyword n1qlKeyword DATABASE
+syn keyword n1qlKeyword DATASET
+syn keyword n1qlKeyword DATASTORE
+syn keyword n1qlKeyword DECLARE
+syn keyword n1qlKeyword DECREMENT
+syn keyword n1qlKeyword DERIVED
+syn keyword n1qlKeyword DESC
+syn keyword n1qlKeyword DESCRIBE
+syn keyword n1qlKeyword DO
+syn keyword n1qlKeyword EACH
+syn keyword n1qlKeyword ELEMENT
+syn keyword n1qlKeyword ELSE
+syn keyword n1qlKeyword END
+syn keyword n1qlKeyword EVERY
+syn keyword n1qlKeyword EXCLUDE
+syn keyword n1qlKeyword EXISTS
+syn keyword n1qlKeyword FETCH
+syn keyword n1qlKeyword FIRST
+syn keyword n1qlKeyword FLATTEN
+syn keyword n1qlKeyword FOR
+syn keyword n1qlKeyword FORCE
+syn keyword n1qlKeyword FROM
+syn keyword n1qlKeyword FUNCTION
+syn keyword n1qlKeyword GROUP
+syn keyword n1qlKeyword GSI
+syn keyword n1qlKeyword HAVING
+syn keyword n1qlKeyword IF
+syn keyword n1qlKeyword IGNORE
+syn keyword n1qlKeyword INCLUDE
+syn keyword n1qlKeyword INCREMENT
+syn keyword n1qlKeyword INDEX
+syn keyword n1qlKeyword INITIAL
+syn keyword n1qlKeyword INLINE
+syn keyword n1qlKeyword INNER
+syn keyword n1qlKeyword INTO
+syn keyword n1qlKeyword KEY
+syn keyword n1qlKeyword KEYS
+syn keyword n1qlKeyword KEYSPACE
+syn keyword n1qlKeyword KNOWN
+syn keyword n1qlKeyword LAST
+syn keyword n1qlKeyword LET
+syn keyword n1qlKeyword LETTING
+syn keyword n1qlKeyword LIMIT
+syn keyword n1qlKeyword LOOP
+syn keyword n1qlKeyword LSM
+syn keyword n1qlKeyword MAP
+syn keyword n1qlKeyword MAPPING
+syn keyword n1qlKeyword MATCHED
+syn keyword n1qlKeyword MATERIALIZED
+syn keyword n1qlKeyword MERGE
+syn keyword n1qlKeyword NAMESPACE
+syn keyword n1qlKeyword NEST
+syn keyword n1qlKeyword OPTION
+syn keyword n1qlKeyword ORDER
+syn keyword n1qlKeyword OUTER
+syn keyword n1qlKeyword OVER
+syn keyword n1qlKeyword PARSE
+syn keyword n1qlKeyword PARTITION
+syn keyword n1qlKeyword PASSWORD
+syn keyword n1qlKeyword PATH
+syn keyword n1qlKeyword POOL
+syn keyword n1qlKeyword PRIMARY
+syn keyword n1qlKeyword PRIVATE
+syn keyword n1qlKeyword PRIVILEGE
+syn keyword n1qlKeyword PROCEDURE
+syn keyword n1qlKeyword PUBLIC
+syn keyword n1qlKeyword REALM
+syn keyword n1qlKeyword REDUCE
+syn keyword n1qlKeyword RETURN
+syn keyword n1qlKeyword RETURNING
+syn keyword n1qlKeyword ROLE
+syn keyword n1qlKeyword SATISFIES
+syn keyword n1qlKeyword SCHEMA
+syn keyword n1qlKeyword SELF
+syn keyword n1qlKeyword SEMI
+syn keyword n1qlKeyword SHOW
+syn keyword n1qlKeyword START
+syn keyword n1qlKeyword STATISTICS
+syn keyword n1qlKeyword SYSTEM
+syn keyword n1qlKeyword THEN
+syn keyword n1qlKeyword TRANSACTION
+syn keyword n1qlKeyword TRIGGER
+syn keyword n1qlKeyword UNDER
+syn keyword n1qlKeyword UNKNOWN
+syn keyword n1qlKeyword UNSET
+syn keyword n1qlKeyword USE
+syn keyword n1qlKeyword USER
+syn keyword n1qlKeyword USING
+syn keyword n1qlKeyword VALIDATE
+syn keyword n1qlKeyword VALUE
+syn keyword n1qlKeyword VALUED
+syn keyword n1qlKeyword VALUES
+syn keyword n1qlKeyword VIEW
+syn keyword n1qlKeyword WHEN
+syn keyword n1qlKeyword WHERE
+syn keyword n1qlKeyword WHILE
+syn keyword n1qlKeyword WITHIN
+syn keyword n1qlKeyword WORK
+
+
+"
+" *** functions ***
+"
+syn keyword n1qlOperator ABS
+syn keyword n1qlOperator ACOS
+syn keyword n1qlOperator ARRAY_AGG
+syn keyword n1qlOperator ARRAY_APPEND
+syn keyword n1qlOperator ARRAY_AVG
+syn keyword n1qlOperator ARRAY_CONCAT
+syn keyword n1qlOperator ARRAY_CONTAINS
+syn keyword n1qlOperator ARRAY_COUNT
+syn keyword n1qlOperator ARRAY_DISTINCT
+syn keyword n1qlOperator ARRAY_FLATTEN
+syn keyword n1qlOperator ARRAY_IFNULL
+syn keyword n1qlOperator ARRAY_INSERT
+syn keyword n1qlOperator ARRAY_INTERSECT
+syn keyword n1qlOperator ARRAY_LENGTH
+syn keyword n1qlOperator ARRAY_MAX
+syn keyword n1qlOperator ARRAY_MIN
+syn keyword n1qlOperator ARRAY_POSITION
+syn keyword n1qlOperator ARRAY_PREPEND
+syn keyword n1qlOperator ARRAY_PUT
+syn keyword n1qlOperator ARRAY_RANGE
+syn keyword n1qlOperator ARRAY_REMOVE
+syn keyword n1qlOperator ARRAY_REPEAT
+syn keyword n1qlOperator ARRAY_REPLACE
+syn keyword n1qlOperator ARRAY_REVERSE
+syn keyword n1qlOperator ARRAY_SORT
+syn keyword n1qlOperator ARRAY_START
+syn keyword n1qlOperator ARRAY_SUM
+syn keyword n1qlOperator ARRAY_SYMDIFF
+syn keyword n1qlOperator ARRAY_UNION
+syn keyword n1qlOperator ASIN
+syn keyword n1qlOperator ATAN
+syn keyword n1qlOperator ATAN2
+syn keyword n1qlOperator AVG
+syn keyword n1qlOperator BASE64
+syn keyword n1qlOperator BASE64_DECODE
+syn keyword n1qlOperator BASE64_ENCODE
+syn keyword n1qlOperator CEIL
+syn keyword n1qlOperator CLOCK_LOCAL
+syn keyword n1qlOperator CLOCK_STR
+syn keyword n1qlOperator CLOCK_TZ
+syn keyword n1qlOperator CLOCK_UTC
+syn keyword n1qlOperator CLOCL_MILLIS
+syn keyword n1qlOperator CONTAINS
+syn keyword n1qlOperator COS
+syn keyword n1qlOperator COUNT
+syn keyword n1qlOperator DATE_ADD_MILLIS
+syn keyword n1qlOperator DATE_ADD_STR
+syn keyword n1qlOperator DATE_DIFF_MILLIS
+syn keyword n1qlOperator DATE_DIFF_STR
+syn keyword n1qlOperator DATE_FORMAT_STR
+syn keyword n1qlOperator DATE_PART_MILLIS
+syn keyword n1qlOperator DATE_PART_STR
+syn keyword n1qlOperator DATE_RANGE_MILLIS
+syn keyword n1qlOperator DATE_RANGE_STR
+syn keyword n1qlOperator DATE_TRUC_STR
+syn keyword n1qlOperator DATE_TRUNC_MILLIS
+syn keyword n1qlOperator DECODE_JSON
+syn keyword n1qlOperator DEGREES
+syn keyword n1qlOperator DURATION_TO_STR
+syn keyword n1qlOperator E
+syn keyword n1qlOperator ENCODED_SIZE
+syn keyword n1qlOperator ENCODE_JSON
+syn keyword n1qlOperator EXP
+syn keyword n1qlOperator FLOOR
+syn keyword n1qlOperator GREATEST
+syn keyword n1qlOperator IFINF
+syn keyword n1qlOperator IFMISSING
+syn keyword n1qlOperator IFMISSINGORNULL
+syn keyword n1qlOperator IFNAN
+syn keyword n1qlOperator IFNANORINF
+syn keyword n1qlOperator IFNULL
+syn keyword n1qlOperator INITCAP
+syn keyword n1qlOperator ISARRAY
+syn keyword n1qlOperator ISATOM
+syn keyword n1qlOperator ISBOOLEAN
+syn keyword n1qlOperator ISNUMBER
+syn keyword n1qlOperator ISOBJECT
+syn keyword n1qlOperator ISSTRING
+syn keyword n1qlOperator LEAST
+syn keyword n1qlOperator LENGTH
+syn keyword n1qlOperator LN
+syn keyword n1qlOperator LOG
+syn keyword n1qlOperator LOWER
+syn keyword n1qlOperator LTRIM
+syn keyword n1qlOperator MAX
+syn keyword n1qlOperator META
+syn keyword n1qlOperator MILLIS
+syn keyword n1qlOperator MILLIS_TO_LOCAL
+syn keyword n1qlOperator MILLIS_TO_STR
+syn keyword n1qlOperator MILLIS_TO_TZ
+syn keyword n1qlOperator MILLIS_TO_UTC
+syn keyword n1qlOperator MILLIS_TO_ZONE_NAME
+syn keyword n1qlOperator MIN
+syn keyword n1qlOperator MISSINGIF
+syn keyword n1qlOperator NANIF
+syn keyword n1qlOperator NEGINFIF
+syn keyword n1qlOperator NOW_LOCAL
+syn keyword n1qlOperator NOW_MILLIS
+syn keyword n1qlOperator NOW_STR
+syn keyword n1qlOperator NOW_TZ
+syn keyword n1qlOperator NOW_UTC
+syn keyword n1qlOperator NULLIF
+syn keyword n1qlOperator OBJECT_ADD
+syn keyword n1qlOperator OBJECT_CONCAT
+syn keyword n1qlOperator OBJECT_INNER_PAIRS
+syn keyword n1qlOperator OBJECT_INNER_VALUES
+syn keyword n1qlOperator OBJECT_LENGTH
+syn keyword n1qlOperator OBJECT_NAMES
+syn keyword n1qlOperator OBJECT_PAIRS
+syn keyword n1qlOperator OBJECT_PUT
+syn keyword n1qlOperator OBJECT_REMOVE
+syn keyword n1qlOperator OBJECT_RENAME
+syn keyword n1qlOperator OBJECT_REPLACE
+syn keyword n1qlOperator OBJECT_UNWRAP
+syn keyword n1qlOperator OBJECT_VALUES
+syn keyword n1qlOperator PI
+syn keyword n1qlOperator POLY_LENGTH
+syn keyword n1qlOperator POSINIF
+syn keyword n1qlOperator POSITION
+syn keyword n1qlOperator POWER
+syn keyword n1qlOperator RADIANS
+syn keyword n1qlOperator RANDOM
+syn keyword n1qlOperator REGEXP_CONTAINS
+syn keyword n1qlOperator REGEXP_LIKE
+syn keyword n1qlOperator REGEXP_POSITION
+syn keyword n1qlOperator REGEXP_REPLACE
+syn keyword n1qlOperator REPEAT
+syn keyword n1qlOperator REPLACE
+syn keyword n1qlOperator REVERSE
+syn keyword n1qlOperator ROUND
+syn keyword n1qlOperator RTRIM
+syn keyword n1qlOperator SIGN
+syn keyword n1qlOperator SIN
+syn keyword n1qlOperator SPLIT
+syn keyword n1qlOperator SQRT
+syn keyword n1qlOperator STR_TO_DURATION
+syn keyword n1qlOperator STR_TO_MILLIS
+syn keyword n1qlOperator STR_TO_TZ
+syn keyword n1qlOperator STR_TO_UTC
+syn keyword n1qlOperator STR_TO_ZONE_NAME
+syn keyword n1qlOperator SUBSTR
+syn keyword n1qlOperator SUFFIXES
+syn keyword n1qlOperator SUM
+syn keyword n1qlOperator TAN
+syn keyword n1qlOperator TITLE
+syn keyword n1qlOperator TOARRAY
+syn keyword n1qlOperator TOATOM
+syn keyword n1qlOperator TOBOOLEAN
+syn keyword n1qlOperator TOKENS
+syn keyword n1qlOperator TONUMBER
+syn keyword n1qlOperator TOOBJECT
+syn keyword n1qlOperator TOSTRING
+syn keyword n1qlOperator TRIM
+syn keyword n1qlOperator TRUNC
+syn keyword n1qlOperator TYPE
+syn keyword n1qlOperator UPPER
+syn keyword n1qlOperator UUID
+syn keyword n1qlOperator WEEKDAY_MILLIS
+syn keyword n1qlOperator WEEKDAY_STR
+
+
+"
+" *** operators ***
+"
+syn keyword n1qlOperator AND
+syn keyword n1qlOperator AS
+syn keyword n1qlOperator BY
+syn keyword n1qlOperator DISTINCT
+syn keyword n1qlOperator EXCEPT
+syn keyword n1qlOperator ILIKE
+syn keyword n1qlOperator IN
+syn keyword n1qlOperator INTERSECT
+syn keyword n1qlOperator IS
+syn keyword n1qlOperator JOIN
+syn keyword n1qlOperator LEFT
+syn keyword n1qlOperator LIKE
+syn keyword n1qlOperator MINUS
+syn keyword n1qlOperator NEST
+syn keyword n1qlOperator NESTING
+syn keyword n1qlOperator NOT
+syn keyword n1qlOperator OFFSET
+syn keyword n1qlOperator ON
+syn keyword n1qlOperator OR
+syn keyword n1qlOperator OUT
+syn keyword n1qlOperator RIGHT
+syn keyword n1qlOperator SOME
+syn keyword n1qlOperator TO
+syn keyword n1qlOperator UNION
+syn keyword n1qlOperator UNIQUE
+syn keyword n1qlOperator UNNEST
+syn keyword n1qlOperator VIA
+syn keyword n1qlOperator WITH
+syn keyword n1qlOperator XOR
+
+
+"
+" *** statements ***
+"
+syn keyword n1qlStatement ALTER
+syn keyword n1qlStatement ANALYZE
+syn keyword n1qlStatement BUILD
+syn keyword n1qlStatement COMMIT
+syn keyword n1qlStatement CREATE
+syn keyword n1qlStatement DELETE
+syn keyword n1qlStatement DROP
+syn keyword n1qlStatement EXECUTE
+syn keyword n1qlStatement EXPLAIN
+syn keyword n1qlStatement GRANT
+syn keyword n1qlStatement INFER
+syn keyword n1qlStatement INSERT
+syn keyword n1qlStatement MERGE
+syn keyword n1qlStatement PREPARE
+syn keyword n1qlStatement RENAME
+syn keyword n1qlStatement REVOKE
+syn keyword n1qlStatement ROLLBACK
+syn keyword n1qlStatement SELECT
+syn keyword n1qlStatement SET
+syn keyword n1qlStatement TRUNCATE
+syn keyword n1qlStatement UPDATE
+syn keyword n1qlStatement UPSERT
+
+
+"
+" *** types ***
+"
+syn keyword n1qlType ARRAY
+syn keyword n1qlType BINARY
+syn keyword n1qlType BOOLEAN
+syn keyword n1qlType NUMBER
+syn keyword n1qlType OBJECT
+syn keyword n1qlType RAW
+syn keyword n1qlType STRING
+
+
+"
+" *** strings and characters ***
+"
+syn region n1qlString start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn region n1qlString start=+'+ skip=+\\\\\|\\'+ end=+'+
+syn region n1qlBucketSpec start=+`+ skip=+\\\\\|\\'+ end=+`+
+
+
+"
+" *** numbers ***
+"
+syn match n1qlNumber "-\=\<\d*\.\=[0-9_]\>"
+
+
+"
+" *** comments ***
+"
+syn region n1qlComment start="/\*" end="\*/" contains=n1qlTODO
+syn match n1qlComment "--.*$" contains=n1qlTODO
+syn sync ccomment n1qlComment
+
+
+"
+" *** TODO ***
+"
+syn keyword n1qlTODO contained TODO FIXME XXX DEBUG NOTE
+
+
+"
+" *** enable ***
+"
+hi def link n1qlBucketSpec Underlined
+hi def link n1qlComment Comment
+hi def link n1qlKeyword Macro
+hi def link n1qlOperator Function
+hi def link n1qlSpecial Special
+hi def link n1qlStatement Statement
+hi def link n1qlString String
+hi def link n1qlTODO Todo
+hi def link n1qlType Type
+
+let b:current_syntax = "n1ql"
diff --git a/runtime/syntax/named.vim b/runtime/syntax/named.vim
index faec5f68e5..210d387ece 100644
--- a/runtime/syntax/named.vim
+++ b/runtime/syntax/named.vim
@@ -1,7 +1,7 @@
" Vim syntax file
" Language: BIND configuration file
" Maintainer: Nick Hibma <nick@van-laarhoven.org>
-" Last change: 2007-01-30
+" Last Change: 2007-01-30
" Filenames: named.conf, rndc.conf
" Location: http://www.van-laarhoven.org/vim/syntax/named.vim
"
@@ -11,25 +11,16 @@
" This file could do with a lot of improvements, so comments are welcome.
" Please submit the named.conf (segment) with any comments.
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
syn case match
-if version >= 600
- setlocal iskeyword=.,-,48-58,A-Z,a-z,_
-else
- set iskeyword=.,-,48-58,A-Z,a-z,_
-endif
+setlocal iskeyword=.,-,48-58,A-Z,a-z,_
-if version >= 600
- syn sync match namedSync grouphere NONE "^(zone|controls|acl|key)"
-endif
+syn sync match namedSync grouphere NONE "^(zone|controls|acl|key)"
let s:save_cpo = &cpo
set cpo-=C
@@ -197,48 +188,38 @@ syn match namedEParenError contained +{+
syn match namedParenError +}\([^;]\|$\)+
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_named_syn_inits")
- if version < 508
- let did_named_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink namedComment Comment
- HiLink namedInclude Include
- HiLink namedKeyword Keyword
- HiLink namedIntKeyword Keyword
- HiLink namedIdentifier Identifier
- HiLink namedIntIdent Identifier
-
- HiLink namedString String
- HiLink namedBool Type
- HiLink namedNotBool Error
- HiLink namedNumber Number
- HiLink namedNotNumber Error
-
- HiLink namedOption namedKeyword
- HiLink namedLogOption namedKeyword
- HiLink namedCNOption namedKeyword
- HiLink namedQSKeywords Type
- HiLink namedCNKeywords Type
- HiLink namedLogCategory Type
- HiLink namedIPaddr Number
- HiLink namedDomain Identifier
- HiLink namedZoneOpt namedKeyword
- HiLink namedZoneType Type
- HiLink namedParenError Error
- HiLink namedEParenError Error
- HiLink namedIllegalDom Error
- HiLink namedIPerror Error
- HiLink namedSpareDot Error
- HiLink namedError Error
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link namedComment Comment
+hi def link namedInclude Include
+hi def link namedKeyword Keyword
+hi def link namedIntKeyword Keyword
+hi def link namedIdentifier Identifier
+hi def link namedIntIdent Identifier
+
+hi def link namedString String
+hi def link namedBool Type
+hi def link namedNotBool Error
+hi def link namedNumber Number
+hi def link namedNotNumber Error
+
+hi def link namedOption namedKeyword
+hi def link namedLogOption namedKeyword
+hi def link namedCNOption namedKeyword
+hi def link namedQSKeywords Type
+hi def link namedCNKeywords Type
+hi def link namedLogCategory Type
+hi def link namedIPaddr Number
+hi def link namedDomain Identifier
+hi def link namedZoneOpt namedKeyword
+hi def link namedZoneType Type
+hi def link namedParenError Error
+hi def link namedEParenError Error
+hi def link namedIllegalDom Error
+hi def link namedIPerror Error
+hi def link namedSpareDot Error
+hi def link namedError Error
+
let &cpo = s:save_cpo
unlet s:save_cpo
diff --git a/runtime/syntax/nanorc.vim b/runtime/syntax/nanorc.vim
index 2ae4961fdb..606ac7fdf1 100644
--- a/runtime/syntax/nanorc.vim
+++ b/runtime/syntax/nanorc.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: nanorc(5) - GNU nano configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: nanorc(5) - GNU nano configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/nasm.vim b/runtime/syntax/nasm.vim
index a6ed056650..4f70a0f334 100644
--- a/runtime/syntax/nasm.vim
+++ b/runtime/syntax/nasm.vim
@@ -1,18 +1,17 @@
" Vim syntax file
" Language: NASM - The Netwide Assembler (v0.98)
-" Maintainer: Andriy Sokolov <andriy145@gmail.com>
+" Maintainer: Andrii Sokolov <andriy145@gmail.com>
" Original Author: Manuel M.H. Stol <Manuel.Stol@allieddata.nl>
" Former Maintainer: Manuel M.H. Stol <Manuel.Stol@allieddata.nl>
-" Last Change: 2012 Feb 7
+" Contributors: Leonard Kรถnig <leonard.r.koenig@gmail.com> (C string highlighting)
+" Last Change: 2017 Jan 23
" NASM Home: http://www.nasm.us/
" Setup Syntax:
-" Clear old syntax settings
-if version < 600
- syn clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" Assembler syntax is case insensetive
@@ -21,18 +20,10 @@ syn case ignore
" Vim search and movement commands on identifers
-if version < 600
- " Comments at start of a line inside which to skip search for indentifiers
- set comments=:;
- " Identifier Keyword characters (defines \k)
- set iskeyword=@,48-57,#,$,.,?,@-@,_,~
-else
- " Comments at start of a line inside which to skip search for indentifiers
- setlocal comments=:;
- " Identifier Keyword characters (defines \k)
- setlocal iskeyword=@,48-57,#,$,.,?,@-@,_,~
-endif
-
+" Comments at start of a line inside which to skip search for indentifiers
+setlocal comments=:;
+" Identifier Keyword characters (defines \k)
+setlocal iskeyword=@,48-57,#,$,.,?,@-@,_,~
" Comments:
@@ -77,8 +68,23 @@ syn match nasmLabelError "\<\~\s*\(\k*\s*:\|\$\=\.\k*\)"
" Constants:
-syn match nasmStringError +["']+
+syn match nasmStringError +["'`]+
+" NASM is case sensitive here: eg. u-prefix allows for 4-digit, U-prefix for
+" 8-digit Unicode characters
+syn case match
+" one-char escape-sequences
+syn match nasmCStringEscape display contained "\\[โ€™"โ€˜\\\?abtnvfre]"
+" hex and octal numbers
+syn match nasmCStringEscape display contained "\\\(x\x\{2}\|\o\{1,3}\)"
+" Unicode characters
+syn match nasmCStringEscape display contained "\\\(u\x\{4}\|U\x\{8}\)"
+" ISO C99 format strings (copied from cFormat in runtime/syntax/c.vim)
+syn match nasmCStringFormat display "%\(\d\+\$\)\=[-+' #0*]*\(\d*\|\*\|\*\d\+\$\)\(\.\(\d*\|\*\|\*\d\+\$\)\)\=\([hlLjzt]\|ll\|hh\)\=\([aAbdiuoxXDOUfFeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained
+syn match nasmCStringFormat display "%%" contained
syn match nasmString +\("[^"]\{-}"\|'[^']\{-}'\)+
+" Highlight C escape- and format-sequences within ``-strings
+syn match nasmCString +\(`[^`]\{-}`\)+ contains=nasmCStringEscape,nasmCStringFormat extend
+syn case ignore
syn match nasmBinNumber "\<[0-1]\+b\>"
syn match nasmBinNumber "\<\~[0-1]\+b\>"lc=1
syn match nasmOctNumber "\<\o\+q\>"
@@ -431,96 +437,89 @@ syn sync match nasmSync grouphere NONE "^\s*%endmacro\>"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later : only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_nasm_syntax_inits")
- if version < 508
- let did_nasm_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
+
+" Sub Links:
+hi def link nasmInMacDirective nasmDirective
+hi def link nasmInMacLabel nasmLocalLabel
+hi def link nasmInMacLblWarn nasmLabelWarn
+hi def link nasmInMacMacro nasmMacro
+hi def link nasmInMacParam nasmMacro
+hi def link nasmInMacParamNum nasmDecNumber
+hi def link nasmInMacPreCondit nasmPreCondit
+hi def link nasmInMacPreProc nasmPreProc
+hi def link nasmInPreCondit nasmPreCondit
+hi def link nasmInStructure nasmStructure
+hi def link nasmStructureLabel nasmStructure
+
+" Comment Group:
+hi def link nasmComment Comment
+hi def link nasmSpecialComment SpecialComment
+hi def link nasmInCommentTodo Todo
+
+" Constant Group:
+hi def link nasmString String
+hi def link nasmCString String
+hi def link nasmStringError Error
+hi def link nasmCStringEscape SpecialChar
+hi def link nasmCStringFormat SpecialChar
+hi def link nasmBinNumber Number
+hi def link nasmOctNumber Number
+hi def link nasmDecNumber Number
+hi def link nasmHexNumber Number
+hi def link nasmFltNumber Float
+hi def link nasmNumberError Error
+
+" Identifier Group:
+hi def link nasmLabel Identifier
+hi def link nasmLocalLabel Identifier
+hi def link nasmSpecialLabel Special
+hi def link nasmLabelError Error
+hi def link nasmLabelWarn Todo
+
+" PreProc Group:
+hi def link nasmPreProc PreProc
+hi def link nasmDefine Define
+hi def link nasmInclude Include
+hi def link nasmMacro Macro
+hi def link nasmPreCondit PreCondit
+hi def link nasmPreProcError Error
+hi def link nasmPreProcWarn Todo
+
+" Type Group:
+hi def link nasmType Type
+hi def link nasmStorage StorageClass
+hi def link nasmStructure Structure
+hi def link nasmTypeError Error
+
+" Directive Group:
+hi def link nasmConstant Constant
+hi def link nasmInstrModifier Operator
+hi def link nasmRepeat Repeat
+hi def link nasmDirective Keyword
+hi def link nasmStdDirective Operator
+hi def link nasmFmtDirective Keyword
+
+" Register Group:
+hi def link nasmCtrlRegister Special
+hi def link nasmDebugRegister Debug
+hi def link nasmTestRegister Special
+hi def link nasmRegisterError Error
+hi def link nasmMemRefError Error
+
+" Instruction Group:
+hi def link nasmStdInstruction Statement
+hi def link nasmSysInstruction Statement
+hi def link nasmDbgInstruction Debug
+hi def link nasmFpuInstruction Statement
+hi def link nasmMmxInstruction Statement
+hi def link nasmSseInstruction Statement
+hi def link nasmNowInstruction Statement
+hi def link nasmAmdInstruction Special
+hi def link nasmCrxInstruction Special
+hi def link nasmUndInstruction Todo
+hi def link nasmInstructnError Error
- " Sub Links:
- HiLink nasmInMacDirective nasmDirective
- HiLink nasmInMacLabel nasmLocalLabel
- HiLink nasmInMacLblWarn nasmLabelWarn
- HiLink nasmInMacMacro nasmMacro
- HiLink nasmInMacParam nasmMacro
- HiLink nasmInMacParamNum nasmDecNumber
- HiLink nasmInMacPreCondit nasmPreCondit
- HiLink nasmInMacPreProc nasmPreProc
- HiLink nasmInPreCondit nasmPreCondit
- HiLink nasmInStructure nasmStructure
- HiLink nasmStructureLabel nasmStructure
-
- " Comment Group:
- HiLink nasmComment Comment
- HiLink nasmSpecialComment SpecialComment
- HiLink nasmInCommentTodo Todo
-
- " Constant Group:
- HiLink nasmString String
- HiLink nasmStringError Error
- HiLink nasmBinNumber Number
- HiLink nasmOctNumber Number
- HiLink nasmDecNumber Number
- HiLink nasmHexNumber Number
- HiLink nasmFltNumber Float
- HiLink nasmNumberError Error
-
- " Identifier Group:
- HiLink nasmLabel Identifier
- HiLink nasmLocalLabel Identifier
- HiLink nasmSpecialLabel Special
- HiLink nasmLabelError Error
- HiLink nasmLabelWarn Todo
-
- " PreProc Group:
- HiLink nasmPreProc PreProc
- HiLink nasmDefine Define
- HiLink nasmInclude Include
- HiLink nasmMacro Macro
- HiLink nasmPreCondit PreCondit
- HiLink nasmPreProcError Error
- HiLink nasmPreProcWarn Todo
-
- " Type Group:
- HiLink nasmType Type
- HiLink nasmStorage StorageClass
- HiLink nasmStructure Structure
- HiLink nasmTypeError Error
-
- " Directive Group:
- HiLink nasmConstant Constant
- HiLink nasmInstrModifier Operator
- HiLink nasmRepeat Repeat
- HiLink nasmDirective Keyword
- HiLink nasmStdDirective Operator
- HiLink nasmFmtDirective Keyword
-
- " Register Group:
- HiLink nasmCtrlRegister Special
- HiLink nasmDebugRegister Debug
- HiLink nasmTestRegister Special
- HiLink nasmRegisterError Error
- HiLink nasmMemRefError Error
-
- " Instruction Group:
- HiLink nasmStdInstruction Statement
- HiLink nasmSysInstruction Statement
- HiLink nasmDbgInstruction Debug
- HiLink nasmFpuInstruction Statement
- HiLink nasmMmxInstruction Statement
- HiLink nasmSseInstruction Statement
- HiLink nasmNowInstruction Statement
- HiLink nasmAmdInstruction Special
- HiLink nasmCrxInstruction Special
- HiLink nasmUndInstruction Todo
- HiLink nasmInstructnError Error
-
- delcommand HiLink
-endif
let b:current_syntax = "nasm"
diff --git a/runtime/syntax/nastran.vim b/runtime/syntax/nastran.vim
index f7927693fa..239fd6e49d 100644
--- a/runtime/syntax/nastran.vim
+++ b/runtime/syntax/nastran.vim
@@ -6,11 +6,8 @@
" Since DMAP shares some traits with fortran, this syntax file
" is based on the fortran.vim syntax file.
"----------------------------------------------------------------------
-" Remove any old syntax stuff hanging around
-"syn clear
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" DMAP is not case dependent
@@ -156,37 +153,28 @@ syn region nastranBulkData start=+ *[Bb][Uu][Ll][Kk] *$+ end=+^ [Ee][Nn][Dd] *[D
syn keyword nastranUtilCard ECHOON ECHOOFF INCLUDE PARAM
-if version >= 508 || !exists("did_nastran_syntax_inits")
- if version < 508
- let did_nastran_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi link <args>
- endif
- " The default methods for highlighting. Can be overridden later
- HiLink nastranDmapexecmod Statement
- HiLink nastranDmapType Type
- HiLink nastranDmapPreCondit Error
- HiLink nastranDmapUtilmod PreProc
- HiLink nastranDmapMatmod nastranDmapUtilmod
- HiLink nastranDmapString String
- HiLink nastranDmapNumber Constant
- HiLink nastranDmapFloat nastranDmapNumber
- HiLink nastranDmapInitTab nastranDmapNumber
- HiLink nastranDmapTab nastranDmapNumber
- HiLink nastranDmapLogical nastranDmapExecmod
- HiLink nastranDmapImplicit Identifier
- HiLink nastranDmapComment Comment
- HiLink nastranDmapRepeat nastranDmapexecmod
- HiLink nastranNastranCard nastranDmapPreCondit
- HiLink nastranECSCard nastranDmapUtilmod
- HiLink nastranFMSCard nastranNastranCard
- HiLink nastranCC nastranDmapexecmod
- HiLink nastranDelimiter Special
- HiLink nastranBulkData nastranDmapType
- HiLink nastranUtilCard nastranDmapexecmod
- delcommand HiLink
-endif
+" The default methods for highlighting. Can be overridden later
+hi def link nastranDmapexecmod Statement
+hi def link nastranDmapType Type
+hi def link nastranDmapPreCondit Error
+hi def link nastranDmapUtilmod PreProc
+hi def link nastranDmapMatmod nastranDmapUtilmod
+hi def link nastranDmapString String
+hi def link nastranDmapNumber Constant
+hi def link nastranDmapFloat nastranDmapNumber
+hi def link nastranDmapInitTab nastranDmapNumber
+hi def link nastranDmapTab nastranDmapNumber
+hi def link nastranDmapLogical nastranDmapExecmod
+hi def link nastranDmapImplicit Identifier
+hi def link nastranDmapComment Comment
+hi def link nastranDmapRepeat nastranDmapexecmod
+hi def link nastranNastranCard nastranDmapPreCondit
+hi def link nastranECSCard nastranDmapUtilmod
+hi def link nastranFMSCard nastranNastranCard
+hi def link nastranCC nastranDmapexecmod
+hi def link nastranDelimiter Special
+hi def link nastranBulkData nastranDmapType
+hi def link nastranUtilCard nastranDmapexecmod
let b:current_syntax = "nastran"
diff --git a/runtime/syntax/natural.vim b/runtime/syntax/natural.vim
index 4fbc916be2..be529f2d85 100644
--- a/runtime/syntax/natural.vim
+++ b/runtime/syntax/natural.vim
@@ -6,16 +6,11 @@
" Last Changed: 2012-02-05 18:50:43
" Support: http://www.von-oppen.com/
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when this syntax file was already loaded
-if v:version < 600
- syntax clear
- set iskeyword+=-,*,#,+,_,/
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
-else
- setlocal iskeyword+=-,*,#,+,_,/
endif
+setlocal iskeyword+=-,*,#,+,_,/
let s:cpo_save = &cpo
set cpo&vim
@@ -153,59 +148,50 @@ if v:version >= 600
endif
-if v:version >= 508 || !exists("did_natural_syntax_inits")
- if v:version < 508
- let did_natural_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- " The default methods for highlighting. Can be overridden later
-
- " Constants
- HiLink naturalFormat Constant
- HiLink naturalAttribute Constant
- HiLink naturalNumber Number
- HiLink naturalString String
- HiLink naturalBoolean Boolean
-
- " All kinds of keywords
- HiLink naturalConditional Conditional
- HiLink naturalRepeat Repeat
- HiLink naturalLoop Repeat
- HiLink naturalFlow Keyword
- HiLink naturalError Keyword
- HiLink naturalKeyword Keyword
- HiLink naturalOperator Operator
- HiLink naturalParGui Operator
-
- " Labels
- HiLink naturalLabel Label
- HiLink naturalRefLabel Label
-
- " Comments
- HiLink naturalPComment Comment
- HiLink naturalComment Comment
- HiLink naturalTodo Todo
- HiLink naturalCommentMark PreProc
-
- HiLink naturalInclude Include
- HiLink naturalSysVar Identifier
- HiLink naturalLineNo LineNr
- HiLink naturalLineRef Error
- HiLink naturalSpecial Special
- HiLink naturalComKey Todo
-
- " illegal things
- HiLink naturalRMKeyword Error
- HiLink naturalLegalIdent Error
-
- HiLink naturalType Type
- HiLink naturalFunction Function
- HiLink naturalObjName PreProc
-
- delcommand HiLink
-endif
+" The default methods for highlighting. Can be overridden later
+
+" Constants
+hi def link naturalFormat Constant
+hi def link naturalAttribute Constant
+hi def link naturalNumber Number
+hi def link naturalString String
+hi def link naturalBoolean Boolean
+
+" All kinds of keywords
+hi def link naturalConditional Conditional
+hi def link naturalRepeat Repeat
+hi def link naturalLoop Repeat
+hi def link naturalFlow Keyword
+hi def link naturalError Keyword
+hi def link naturalKeyword Keyword
+hi def link naturalOperator Operator
+hi def link naturalParGui Operator
+
+" Labels
+hi def link naturalLabel Label
+hi def link naturalRefLabel Label
+
+" Comments
+hi def link naturalPComment Comment
+hi def link naturalComment Comment
+hi def link naturalTodo Todo
+hi def link naturalCommentMark PreProc
+
+hi def link naturalInclude Include
+hi def link naturalSysVar Identifier
+hi def link naturalLineNo LineNr
+hi def link naturalLineRef Error
+hi def link naturalSpecial Special
+hi def link naturalComKey Todo
+
+" illegal things
+hi def link naturalRMKeyword Error
+hi def link naturalLegalIdent Error
+
+hi def link naturalType Type
+hi def link naturalFunction Function
+hi def link naturalObjName PreProc
+
let b:current_syntax = "natural"
diff --git a/runtime/syntax/ncf.vim b/runtime/syntax/ncf.vim
index 2019c03723..0027fd4ef8 100644
--- a/runtime/syntax/ncf.vim
+++ b/runtime/syntax/ncf.vim
@@ -4,10 +4,8 @@
" Last Change: Tue, 04 Sep 2001 16:20:33 CDT
" $Id: ncf.vim,v 1.1 2004/06/13 16:31:58 vimboss Exp $
-" Remove any old syntax stuff hanging around
-if version < 600
- syn clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -217,42 +215,33 @@ if exists("ncf_highlight_unknowns")
syn match Error "[^ \t]*" contains=ALL
endif
-if version >= 508 || !exists("did_ncf_syntax_inits")
- if version < 508
- let did_ncf_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- " The default methods for highlighting. Can be overridden later
- HiLink ncfCommands Statement
- HiLink ncfSetCommands ncfCommands
- HiLink ncfLogins ncfCommands
- HiLink ncfString String
- HiLink ncfContString ncfString
- HiLink ncfComment Comment
- HiLink ncfImplicit Type
- HiLink ncfBoolean Boolean
- HiLink ncfScript Identifier
- HiLink ncfNumber Number
- HiLink ncfIPAddr ncfNumber
- HiLink ncfHexNumber ncfNumber
- HiLink ncfTime ncfNumber
- HiLink ncfDSTTime ncfNumber
- HiLink ncfPath Constant
- HiLink ncfServerName Special
- HiLink ncfIPXNet ncfServerName
- HiLink ncfTimeTypes Constant
- HiLink ncfSetCommandsNum ncfSetCommands
- HiLink ncfSetCommandsBool ncfSetCommands
- HiLink ncfSetCommandsStr ncfSetCommands
- HiLink ncfSetCommandsTime ncfSetCommands
- HiLink ncfSetCommandsTimeDate ncfSetCommands
- HiLink ncfSetCommandsBindCon ncfSetCommands
+" The default methods for highlighting. Can be overridden later
+hi def link ncfCommands Statement
+hi def link ncfSetCommands ncfCommands
+hi def link ncfLogins ncfCommands
+hi def link ncfString String
+hi def link ncfContString ncfString
+hi def link ncfComment Comment
+hi def link ncfImplicit Type
+hi def link ncfBoolean Boolean
+hi def link ncfScript Identifier
+hi def link ncfNumber Number
+hi def link ncfIPAddr ncfNumber
+hi def link ncfHexNumber ncfNumber
+hi def link ncfTime ncfNumber
+hi def link ncfDSTTime ncfNumber
+hi def link ncfPath Constant
+hi def link ncfServerName Special
+hi def link ncfIPXNet ncfServerName
+hi def link ncfTimeTypes Constant
+hi def link ncfSetCommandsNum ncfSetCommands
+hi def link ncfSetCommandsBool ncfSetCommands
+hi def link ncfSetCommandsStr ncfSetCommands
+hi def link ncfSetCommandsTime ncfSetCommands
+hi def link ncfSetCommandsTimeDate ncfSetCommands
+hi def link ncfSetCommandsBindCon ncfSetCommands
- delcommand HiLink
-endif
let b:current_syntax = "ncf"
diff --git a/runtime/syntax/neomuttrc.vim b/runtime/syntax/neomuttrc.vim
new file mode 100644
index 0000000000..7ff89879d9
--- /dev/null
+++ b/runtime/syntax/neomuttrc.vim
@@ -0,0 +1,1049 @@
+" Vim syntax file
+" Language: NeoMutt setup files
+" Maintainer: Guillaume Brogi <gui-gui@netcourrier.com>
+" Last Change: 2018-03-25
+" Original version based on syntax/muttrc.vim
+
+" This file covers NeoMutt 2018-03-23
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Set the keyword characters
+setlocal isk=@,48-57,_,-
+
+" handling optional variables
+syntax match muttrcComment "^# .*$" contains=@Spell
+syntax match muttrcComment "^#[^ ].*$"
+syntax match muttrcComment "^#$"
+syntax match muttrcComment "[^\\]#.*$"lc=1
+
+" Escape sequences (back-tick and pipe goes here too)
+syntax match muttrcEscape +\\[#tnr"'Cc ]+
+syntax match muttrcEscape +[`|]+
+syntax match muttrcEscape +\\$+
+
+" The variables takes the following arguments
+"syn match muttrcString contained "=\s*[^ #"'`]\+"lc=1 contains=muttrcEscape
+syntax region muttrcString contained keepend start=+"+ms=e skip=+\\"+ end=+"+ contains=muttrcEscape,muttrcCommand,muttrcAction,muttrcShellString
+syntax region muttrcString contained keepend start=+'+ms=e skip=+\\'+ end=+'+ contains=muttrcEscape,muttrcCommand,muttrcAction
+syntax match muttrcStringNL contained skipwhite skipnl "\s*\\$" nextgroup=muttrcString,muttrcStringNL
+
+syntax region muttrcShellString matchgroup=muttrcEscape keepend start=+`+ skip=+\\`+ end=+`+ contains=muttrcVarStr,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcCommand,muttrcVarDeprecatedStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad
+
+syntax match muttrcRXChars contained /[^\\][][.*?+]\+/hs=s+1
+syntax match muttrcRXChars contained /[][|()][.*?+]*/
+syntax match muttrcRXChars contained /['"]^/ms=s+1
+syntax match muttrcRXChars contained /$['"]/me=e-1
+syntax match muttrcRXChars contained /\\/
+" Why does muttrcRXString2 work with one \ when muttrcRXString requires two?
+syntax region muttrcRXString contained skipwhite start=+'+ skip=+\\'+ end=+'+ contains=muttrcRXChars
+syntax region muttrcRXString contained skipwhite start=+"+ skip=+\\"+ end=+"+ contains=muttrcRXChars
+syntax region muttrcRXString contained skipwhite start=+[^ "'^]+ skip=+\\\s+ end=+\s+re=e-1 contains=muttrcRXChars
+" For some reason, skip refuses to match backslashes here...
+syntax region muttrcRXString contained matchgroup=muttrcRXChars skipwhite start=+\^+ end=+[^\\]\s+re=e-1 contains=muttrcRXChars
+syntax region muttrcRXString contained matchgroup=muttrcRXChars skipwhite start=+\^+ end=+$\s+ contains=muttrcRXChars
+syntax region muttrcRXString2 contained skipwhite start=+'+ skip=+\'+ end=+'+ contains=muttrcRXChars
+syntax region muttrcRXString2 contained skipwhite start=+"+ skip=+\"+ end=+"+ contains=muttrcRXChars
+
+" these must be kept synchronized with muttrcRXString, but are intended for
+" muttrcRXHooks
+syntax region muttrcRXHookString contained keepend skipwhite start=+'+ skip=+\\'+ end=+'+ contains=muttrcRXString nextgroup=muttrcString,muttrcStringNL
+syntax region muttrcRXHookString contained keepend skipwhite start=+"+ skip=+\\"+ end=+"+ contains=muttrcRXString nextgroup=muttrcString,muttrcStringNL
+syntax region muttrcRXHookString contained keepend skipwhite start=+[^ "'^]+ skip=+\\\s+ end=+\s+re=e-1 contains=muttrcRXString nextgroup=muttrcString,muttrcStringNL
+syntax region muttrcRXHookString contained keepend skipwhite start=+\^+ end=+[^\\]\s+re=e-1 contains=muttrcRXString nextgroup=muttrcString,muttrcStringNL
+syntax region muttrcRXHookString contained keepend matchgroup=muttrcRXChars skipwhite start=+\^+ end=+$\s+ contains=muttrcRXString nextgroup=muttrcString,muttrcStringNL
+syntax match muttrcRXHookStringNL contained skipwhite skipnl "\s*\\$" nextgroup=muttrcRXHookString,muttrcRXHookStringNL
+
+" these are exclusively for args lists (e.g. -rx pat pat pat ...)
+syntax region muttrcRXPat contained keepend skipwhite start=+'+ skip=+\\'+ end=+'\s*+ contains=muttrcRXString nextgroup=muttrcRXPat
+syntax region muttrcRXPat contained keepend skipwhite start=+"+ skip=+\\"+ end=+"\s*+ contains=muttrcRXString nextgroup=muttrcRXPat
+syntax match muttrcRXPat contained /[^-'"#!]\S\+/ skipwhite contains=muttrcRXChars nextgroup=muttrcRXPat
+syntax match muttrcRXDef contained "-rx\s\+" skipwhite nextgroup=muttrcRXPat
+
+syntax match muttrcSpecial +\(['"]\)!\1+
+
+syntax match muttrcSetStrAssignment contained skipwhite /=\s*\%(\\\?\$\)\?[0-9A-Za-z_-]\+/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr contains=muttrcVariable,muttrcEscapedVariable
+syntax region muttrcSetStrAssignment contained skipwhite keepend start=+=\s*"+hs=s+1 end=+"+ skip=+\\"+ nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr contains=muttrcString
+syntax region muttrcSetStrAssignment contained skipwhite keepend start=+=\s*'+hs=s+1 end=+'+ skip=+\\'+ nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr contains=muttrcString
+syntax match muttrcSetBoolAssignment contained skipwhite /=\s*\\\?\$\w\+/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr contains=muttrcVariable,muttrcEscapedVariable
+syntax match muttrcSetBoolAssignment contained skipwhite /=\s*\%(yes\|no\)/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax match muttrcSetBoolAssignment contained skipwhite /=\s*"\%(yes\|no\)"/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax match muttrcSetBoolAssignment contained skipwhite /=\s*'\%(yes\|no\)'/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax match muttrcSetQuadAssignment contained skipwhite /=\s*\\\?\$\w\+/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr contains=muttrcVariable,muttrcEscapedVariable
+syntax match muttrcSetQuadAssignment contained skipwhite /=\s*\%(ask-\)\?\%(yes\|no\)/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax match muttrcSetQuadAssignment contained skipwhite /=\s*"\%(ask-\)\?\%(yes\|no\)"/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax match muttrcSetQuadAssignment contained skipwhite /=\s*'\%(ask-\)\?\%(yes\|no\)'/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax match muttrcSetNumAssignment contained skipwhite /=\s*\\\?\$\w\+/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr contains=muttrcVariable,muttrcEscapedVariable
+syntax match muttrcSetNumAssignment contained skipwhite /=\s*\d\+/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax match muttrcSetNumAssignment contained skipwhite /=\s*"\d\+"/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax match muttrcSetNumAssignment contained skipwhite /=\s*'\d\+'/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+
+" Now catch some email addresses and headers (purified version from mail.vim)
+syntax match muttrcEmail "[a-zA-Z0-9._-]\+@[a-zA-Z0-9./-]\+"
+syntax match muttrcHeader "\<\c\%(From\|To\|C[Cc]\|B[Cc][Cc]\|Reply-To\|Subject\|Return-Path\|Received\|Date\|Replied\|Attach\)\>:\="
+
+syntax match muttrcKeySpecial contained +\%(\\[Cc'"]\|\^\|\\[01]\d\{2}\)+
+syntax match muttrcKey contained "\S\+" contains=muttrcKeySpecial,muttrcKeyName
+syntax region muttrcKey contained start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=muttrcKeySpecial,muttrcKeyName
+syntax region muttrcKey contained start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=muttrcKeySpecial,muttrcKeyName
+syntax match muttrcKeyName contained "\\[trne]"
+syntax match muttrcKeyName contained "\c<\%(BackSpace\|BackTab\|Delete\|Down\|End\|Enter\|Esc\|Home\|Insert\|Left\|Next\|PageDown\|PageUp\|Return\|Right\|Space\|Tab\|Up\)>"
+syntax match muttrcKeyName contained "\c<F\d\+>"
+
+syntax match muttrcFormatErrors contained /%./
+
+syntax match muttrcStrftimeEscapes contained /%[AaBbCcDdeFGgHhIjklMmnpRrSsTtUuVvWwXxYyZz+%]/
+syntax match muttrcStrftimeEscapes contained /%E[cCxXyY]/
+syntax match muttrcStrftimeEscapes contained /%O[BdeHImMSuUVwWy]/
+
+syntax region muttrcIndexFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcIndexFormatEscapes,muttrcIndexFormatConditionals,muttrcFormatErrors,muttrcTimeEscapes nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcIndexFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcIndexFormatEscapes,muttrcIndexFormatConditionals,muttrcFormatErrors,muttrcTimeEscapes nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcGroupIndexFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcGroupIndexFormatEscapes,muttrcGroupIndexFormatConditionals,muttrcFormatErrors,muttrcTimeEscapes nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcGroupIndexFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcGroupIndexFormatEscapes,muttrcGroupIndexFormatConditionals,muttrcFormatErrors,muttrcTimeEscapes nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcSidebarFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcSidebarFormatEscapes,muttrcSidebarFormatConditionals,muttrcFormatErrors,muttrcTimeEscapes nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcSidebarFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcSidebarFormatEscapes,muttrcSidebarFormatConditionals,muttrcFormatErrors,muttrcTimeEscapes nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcQueryFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcQueryFormatEscapes,muttrcQueryFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcAliasFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcAliasFormatEscapes,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcAliasFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcAliasFormatEscapes,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcAttachFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcAttachFormatEscapes,muttrcAttachFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcAttachFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcAttachFormatEscapes,muttrcAttachFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcComposeFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcComposeFormatEscapes,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcComposeFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcComposeFormatEscapes,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcFolderFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcFolderFormatEscapes,muttrcFolderFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcFolderFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcFolderFormatEscapes,muttrcFolderFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcMixFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcMixFormatEscapes,muttrcMixFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcMixFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcMixFormatEscapes,muttrcMixFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcPGPFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcPGPFormatEscapes,muttrcPGPFormatConditionals,muttrcFormatErrors,muttrcPGPTimeEscapes nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcPGPFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcPGPFormatEscapes,muttrcPGPFormatConditionals,muttrcFormatErrors,muttrcPGPTimeEscapes nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcPGPCmdFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcPGPCmdFormatEscapes,muttrcPGPCmdFormatConditionals,muttrcVariable,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcPGPCmdFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcPGPCmdFormatEscapes,muttrcPGPCmdFormatConditionals,muttrcVariable,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcStatusFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcStatusFormatEscapes,muttrcStatusFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcStatusFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcStatusFormatEscapes,muttrcStatusFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcPGPGetKeysFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcPGPGetKeysFormatEscapes,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcPGPGetKeysFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcPGPGetKeysFormatEscapes,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcSmimeFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcSmimeFormatEscapes,muttrcSmimeFormatConditionals,muttrcVariable,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcSmimeFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcSmimeFormatEscapes,muttrcSmimeFormatConditionals,muttrcVariable,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcStrftimeFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcStrftimeEscapes,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax region muttrcStrftimeFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcStrftimeEscapes,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+
+" Format escapes and conditionals
+syntax match muttrcFormatConditionals2 contained /[^?]*?/
+function! s:escapesConditionals(baseName, sequence, alignment, secondary)
+ exec 'syntax match muttrc' . a:baseName . 'Escapes contained /%\%(\%(-\?[0-9]\+\)\?\%(\.[0-9]\+\)\?\)\?[:_]\?\%(' . a:sequence . '\|%\)/'
+ if a:alignment
+ exec 'syntax match muttrc' . a:baseName . 'Escapes contained /%[>|*]./'
+ endif
+ if a:secondary
+ exec 'syntax match muttrc' . a:baseName . 'Conditionals contained /%?\%(' . a:sequence . '\)?/ nextgroup=muttrcFormatConditionals2'
+ else
+ exec 'syntax match muttrc' . a:baseName . 'Conditionals contained /%?\%(' . a:sequence . '\)?/'
+ endif
+endfunction
+
+" CHECKED 2018-04-18
+" Ref: index_format_str() in hdrline.c
+call s:escapesConditionals('IndexFormat', '[AaBbCcDdEeFfgHIiJKLlMmNnOPqRrSsTtuvWXxYyZz(<[{]\|G[a-zA-Z]\+', 1, 1)
+" Ref: alias_format_str() in addrbook.c
+syntax match muttrcAliasFormatEscapes contained /%\%(\%(-\?[0-9]\+\)\?\%(\.[0-9]\+\)\?\)\?[:_]\?[afnrt%]/
+" Ref: group_index_format_str() in browser.c
+call s:escapesConditionals('GroupIndexFormat', '[CdfMNns]', 1, 1)
+" Ref: sidebar_format_str() in sidebar.c
+call s:escapesConditionals('SidebarFormat', '[BdFLNnSt!]', 1, 1)
+" Ref: query_format_str() in query.c
+call s:escapesConditionals('QueryFormat', '[acent]', 0, 1)
+" Ref: attach_format_str() in recvattach.c
+call s:escapesConditionals('AttachFormat', '[CcDdeFfIMmnQsTtuX]', 1, 1)
+" Ref: compose_format_str() in compose.c
+syntax match muttrcComposeFormatEscapes contained /%\%(\%(-\?[0-9]\+\)\?\%(\.[0-9]\+\)\?\)\?[:_]\?[ahlv%]/
+syntax match muttrcComposeFormatEscapes contained /%[>|*]./
+" Ref: folder_format_str() in browser.c
+call s:escapesConditionals('FolderFormat', '[CDdFfglmNnstu]', 1, 0)
+" Ref: mix_format_str() in remailer.c
+call s:escapesConditionals('MixFormat', '[acns]', 0, 0)
+" Ref: status_format_str() in status.c
+call s:escapesConditionals('StatusFormat', '[bdFfhLlMmnoPpRrSstuVv]', 1, 1)
+" Ref: fmt_smime_command() in ncrypt/smime.c
+call s:escapesConditionals('SmimeFormat', '[aCcdfiks]', 0, 1)
+" Ref: crypt_format_str() in ncrypt/crypt_gpgme.c
+" Ref: pgp_entry_fmt() in ncrypt/pgpkey.c
+" Note: crypt_format_str() supports 'p', but pgp_entry_fmt() does not
+call s:escapesConditionals('PGPFormat', '[acfklnptu[]', 0, 0)
+" Ref: fmt_pgp_command() ncrypt/pgpinvoke.c
+call s:escapesConditionals('PGPCmdFormat', '[afprs]', 0, 1)
+
+" This matches the documentation, but directly contradicts the code
+" (according to the code, this should be identical to the muttrcPGPCmdFormatEscapes
+syntax match muttrcPGPGetKeysFormatEscapes contained /%\%(\%(-\?[0-9]\+\)\?\%(\.[0-9]\+\)\?\)\?[:_]\?[acfklntu[%]/
+
+syntax region muttrcTimeEscapes contained start=+%{+ end=+}+ contains=muttrcStrftimeEscapes
+syntax region muttrcTimeEscapes contained start=+%\[+ end=+\]+ contains=muttrcStrftimeEscapes
+syntax region muttrcTimeEscapes contained start=+%(+ end=+)+ contains=muttrcStrftimeEscapes
+syntax region muttrcTimeEscapes contained start=+%<+ end=+>+ contains=muttrcStrftimeEscapes
+syntax region muttrcPGPTimeEscapes contained start=+%\[+ end=+\]+ contains=muttrcStrftimeEscapes
+
+syntax match muttrcVarEqualsAliasFmt contained skipwhite "=" nextgroup=muttrcAliasFormatStr
+syntax match muttrcVarEqualsAttachFmt contained skipwhite "=" nextgroup=muttrcAttachFormatStr
+syntax match muttrcVarEqualsComposeFmt contained skipwhite "=" nextgroup=muttrcComposeFormatStr
+syntax match muttrcVarEqualsFolderFmt contained skipwhite "=" nextgroup=muttrcFolderFormatStr
+syntax match muttrcVarEqualsGrpIdxFmt contained skipwhite "=" nextgroup=muttrcGroupIndexFormatStr
+syntax match muttrcVarEqualsIdxFmt contained skipwhite "=" nextgroup=muttrcIndexFormatStr
+syntax match muttrcVarEqualsMixFmt contained skipwhite "=" nextgroup=muttrcMixFormatStr
+syntax match muttrcVarEqualsPGPCmdFmt contained skipwhite "=" nextgroup=muttrcPGPCmdFormatStr
+syntax match muttrcVarEqualsPGPFmt contained skipwhite "=" nextgroup=muttrcPGPFormatStr
+syntax match muttrcVarEqualsPGPGetKeysFmt contained skipwhite "=" nextgroup=muttrcPGPGetKeysFormatStr
+syntax match muttrcVarEqualsQueryFmt contained skipwhite "=" nextgroup=muttrcQueryFormatStr
+syntax match muttrcVarEqualsSdbFmt contained skipwhite "=" nextgroup=muttrcSidebarFormatStr
+syntax match muttrcVarEqualsSmimeFmt contained skipwhite "=" nextgroup=muttrcSmimeFormatStr
+syntax match muttrcVarEqualsStatusFmt contained skipwhite "=" nextgroup=muttrcStatusFormatStr
+syntax match muttrcVarEqualsStrftimeFmt contained skipwhite "=" nextgroup=muttrcStrftimeFormatStr
+
+syntax match muttrcVPrefix contained /[?&]/ nextgroup=muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+
+" CHECKED 2018-04-18
+" List of the different screens in mutt
+syntax keyword muttrcMenu contained alias attach browser compose editor generic index key_select_pgp key_select_smime mix pager pgp postpone query smime
+syntax match muttrcMenuList "\S\+" contained contains=muttrcMenu
+syntax match muttrcMenuCommas /,/ contained
+
+" CHECKED 2018-04-18
+" List of hooks in Commands in init.h
+syntax keyword muttrcHooks contained skipwhite
+ \ account-hook append-hook close-hook crypt-hook fcc-hook fcc-save-hook
+ \ folder-hook iconv-hook mbox-hook message-hook open-hook pgp-hook
+ \ reply-hook save-hook send-hook send2-hook
+syntax keyword muttrcHooks skipwhite shutdown-hook startup-hook timeout-hook nextgroup=muttrcCommand
+
+syntax region muttrcSpamPattern contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcPattern nextgroup=muttrcString,muttrcStringNL
+syntax region muttrcSpamPattern contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcPattern nextgroup=muttrcString,muttrcStringNL
+
+syntax region muttrcNoSpamPattern contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcPattern
+syntax region muttrcNoSpamPattern contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcPattern
+
+syntax match muttrcAttachmentsMimeType contained "[*a-z0-9_-]\+/[*a-z0-9._-]\+\s*" skipwhite nextgroup=muttrcAttachmentsMimeType
+syntax match muttrcAttachmentsFlag contained "[+-]\%([AI]\|inline\|attachment\)\s\+" skipwhite nextgroup=muttrcAttachmentsMimeType
+syntax match muttrcAttachmentsLine "^\s*\%(un\)\?attachments\s\+" skipwhite nextgroup=muttrcAttachmentsFlag
+
+syntax match muttrcUnHighlightSpace contained "\%(\s\+\|\\$\)"
+
+syntax keyword muttrcAsterisk contained *
+syntax keyword muttrcListsKeyword lists skipwhite nextgroup=muttrcGroupDef,muttrcComment
+syntax keyword muttrcListsKeyword unlists skipwhite nextgroup=muttrcAsterisk,muttrcComment
+
+syntax keyword muttrcSubscribeKeyword subscribe nextgroup=muttrcGroupDef,muttrcComment
+syntax keyword muttrcSubscribeKeyword unsubscribe nextgroup=muttrcAsterisk,muttrcComment
+
+syntax keyword muttrcAlternateKeyword contained alternates unalternates
+syntax region muttrcAlternatesLine keepend start=+^\s*\%(un\)\?alternates\s+ skip=+\\$+ end=+$+ contains=muttrcAlternateKeyword,muttrcGroupDef,muttrcRXPat,muttrcUnHighlightSpace,muttrcComment
+
+" muttrcVariable includes a prefix because partial strings are considered
+" valid.
+syntax match muttrcVariable contained "\\\@<![a-zA-Z_-]*\$[a-zA-Z_-]\+" contains=muttrcVariableInner
+syntax match muttrcVariableInner contained "\$[a-zA-Z_-]\+"
+syntax match muttrcEscapedVariable contained "\\\$[a-zA-Z_-]\+"
+
+syntax match muttrcBadAction contained "[^<>]\+" contains=muttrcEmail
+syntax match muttrcAction contained "<[^>]\{-}>" contains=muttrcBadAction,muttrcFunction,muttrcKeyName
+
+" First, functions that take regular expressions:
+syntax match muttrcRXHookNot contained /!\s*/ skipwhite nextgroup=muttrcRXHookString,muttrcRXHookStringNL
+syntax match muttrcRXHooks /\<\%(account\|append\|close\|crypt\|folder\|mbox\|open\|pgp\)-hook\>/ skipwhite nextgroup=muttrcRXHookNot,muttrcRXHookString,muttrcRXHookStringNL
+
+" Now, functions that take patterns
+syntax match muttrcPatHookNot contained /!\s*/ skipwhite nextgroup=muttrcPattern
+syntax match muttrcPatHooks /\<\%(charset\|iconv\)-hook\>/ skipwhite nextgroup=muttrcPatHookNot,muttrcPattern
+syntax match muttrcPatHooks /\<\%(message\|reply\|send\|send2\|save\|fcc\|fcc-save\)-hook\>/ skipwhite nextgroup=muttrcPatHookNot,muttrcOptPattern
+
+syntax match muttrcBindFunction contained /\S\+\>/ skipwhite contains=muttrcFunction
+syntax match muttrcBindFunctionNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcBindFunction,muttrcBindFunctionNL
+syntax match muttrcBindKey contained /\S\+/ skipwhite contains=muttrcKey nextgroup=muttrcBindFunction,muttrcBindFunctionNL
+syntax match muttrcBindKeyNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcBindKey,muttrcBindKeyNL
+syntax match muttrcBindMenuList contained /\S\+/ skipwhite contains=muttrcMenu,muttrcMenuCommas nextgroup=muttrcBindKey,muttrcBindKeyNL
+syntax match muttrcBindMenuListNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcBindMenuList,muttrcBindMenuListNL
+
+syntax region muttrcMacroDescr contained keepend skipwhite start=+\s*\S+ms=e skip=+\\ + end=+ \|$+me=s
+syntax region muttrcMacroDescr contained keepend skipwhite start=+'+ms=e skip=+\\'+ end=+'+me=s
+syntax region muttrcMacroDescr contained keepend skipwhite start=+"+ms=e skip=+\\"+ end=+"+me=s
+syntax match muttrcMacroDescrNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcMacroDescr,muttrcMacroDescrNL
+syntax region muttrcMacroBody contained skipwhite start="\S" skip='\\ \|\\$' end=' \|$' contains=muttrcEscape,muttrcSet,muttrcUnset,muttrcReset,muttrcToggle,muttrcCommand,muttrcAction nextgroup=muttrcMacroDescr,muttrcMacroDescrNL
+syntax region muttrcMacroBody matchgroup=Type contained skipwhite start=+'+ms=e skip=+\\'+ end=+'\|\%(\%(\\\\\)\@<!$\)+me=s contains=muttrcEscape,muttrcSet,muttrcUnset,muttrcReset,muttrcToggle,muttrcSpam,muttrcNoSpam,muttrcCommand,muttrcAction,muttrcVariable nextgroup=muttrcMacroDescr,muttrcMacroDescrNL
+syntax region muttrcMacroBody matchgroup=Type contained skipwhite start=+"+ms=e skip=+\\"+ end=+"\|\%(\%(\\\\\)\@<!$\)+me=s contains=muttrcEscape,muttrcSet,muttrcUnset,muttrcReset,muttrcToggle,muttrcSpam,muttrcNoSpam,muttrcCommand,muttrcAction,muttrcVariable nextgroup=muttrcMacroDescr,muttrcMacroDescrNL
+syntax match muttrcMacroBodyNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcMacroBody,muttrcMacroBodyNL
+syntax match muttrcMacroKey contained /\S\+/ skipwhite contains=muttrcKey nextgroup=muttrcMacroBody,muttrcMacroBodyNL
+syntax match muttrcMacroKeyNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcMacroKey,muttrcMacroKeyNL
+syntax match muttrcMacroMenuList contained /\S\+/ skipwhite contains=muttrcMenu,muttrcMenuCommas nextgroup=muttrcMacroKey,muttrcMacroKeyNL
+syntax match muttrcMacroMenuListNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcMacroMenuList,muttrcMacroMenuListNL
+
+syntax match muttrcAddrContent contained "[a-zA-Z0-9._-]\+@[a-zA-Z0-9./-]\+\s*" skipwhite contains=muttrcEmail nextgroup=muttrcAddrContent
+syntax region muttrcAddrContent contained start=+'+ end=+'\s*+ skip=+\\'+ skipwhite contains=muttrcEmail nextgroup=muttrcAddrContent
+syntax region muttrcAddrContent contained start=+"+ end=+"\s*+ skip=+\\"+ skipwhite contains=muttrcEmail nextgroup=muttrcAddrContent
+syntax match muttrcAddrDef contained "-addr\s\+" skipwhite nextgroup=muttrcAddrContent
+
+syntax match muttrcGroupFlag contained "-group"
+syntax region muttrcGroupDef contained start="-group\s\+" skip="\\$" end="\s" skipwhite keepend contains=muttrcGroupFlag,muttrcUnHighlightSpace
+
+syntax keyword muttrcGroupKeyword contained group ungroup
+syntax region muttrcGroupLine keepend start=+^\s*\%(un\)\?group\s+ skip=+\\$+ end=+$+ contains=muttrcGroupKeyword,muttrcGroupDef,muttrcAddrDef,muttrcRXDef,muttrcUnHighlightSpace,muttrcComment
+
+syntax match muttrcAliasGroupName contained /\w\+/ skipwhite nextgroup=muttrcAliasGroupDef,muttrcAliasKey,muttrcAliasNL
+syntax match muttrcAliasGroupDefNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcAliasGroupName,muttrcAliasGroupDefNL
+syntax match muttrcAliasGroupDef contained /\s*-group/ skipwhite nextgroup=muttrcAliasGroupName,muttrcAliasGroupDefNL contains=muttrcGroupFlag
+syntax match muttrcAliasComma contained /,/ skipwhite nextgroup=muttrcAliasEmail,muttrcAliasEncEmail,muttrcAliasNameNoParens,muttrcAliasENNL
+syntax match muttrcAliasEmail contained /\S\+@\S\+/ contains=muttrcEmail nextgroup=muttrcAliasName,muttrcAliasNameNL skipwhite
+syntax match muttrcAliasEncEmail contained /<[^>]\+>/ contains=muttrcEmail nextgroup=muttrcAliasComma
+syntax match muttrcAliasEncEmailNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcAliasEncEmail,muttrcAliasEncEmailNL
+syntax match muttrcAliasNameNoParens contained /[^<(@]\+\s\+/ nextgroup=muttrcAliasEncEmail,muttrcAliasEncEmailNL
+syntax region muttrcAliasName contained matchgroup=Type start=/(/ end=/)/ skipwhite
+syntax match muttrcAliasNameNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcAliasName,muttrcAliasNameNL
+syntax match muttrcAliasENNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcAliasEmail,muttrcAliasEncEmail,muttrcAliasNameNoParens,muttrcAliasENNL
+syntax match muttrcAliasKey contained /\s*[^- \t]\S\+/ skipwhite nextgroup=muttrcAliasEmail,muttrcAliasEncEmail,muttrcAliasNameNoParens,muttrcAliasENNL
+syntax match muttrcAliasNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcAliasGroupDef,muttrcAliasKey,muttrcAliasNL
+
+syntax match muttrcUnAliasKey contained "\s*\w\+\s*" skipwhite nextgroup=muttrcUnAliasKey,muttrcUnAliasNL
+syntax match muttrcUnAliasNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcUnAliasKey,muttrcUnAliasNL
+
+syntax match muttrcSimplePat contained "!\?\^\?[~][ADEFgGklNOpPQRSTuUvV=$]"
+syntax match muttrcSimplePat contained "!\?\^\?[~][mnXz]\s*\%([<>-][0-9]\+[kM]\?\|[0-9]\+[kM]\?[-]\%([0-9]\+[kM]\?\)\?\)"
+syntax match muttrcSimplePat contained "!\?\^\?[~][dr]\s*\%(\%(-\?[0-9]\{1,2}\%(/[0-9]\{1,2}\%(/[0-9]\{2}\%([0-9]\{2}\)\?\)\?\)\?\%([+*-][0-9]\+[ymwd]\)*\)\|\%(\%([0-9]\{1,2}\%(/[0-9]\{1,2}\%(/[0-9]\{2}\%([0-9]\{2}\)\?\)\?\)\?\%([+*-][0-9]\+[ymwd]\)*\)-\%([0-9]\{1,2}\%(/[0-9]\{1,2}\%(/[0-9]\{2}\%([0-9]\{2}\)\?\)\?\)\?\%([+*-][0-9]\+[ymwd]\)\?\)\?\)\|\%([<>=][0-9]\+[ymwd]\)\|\%(`[^`]\+`\)\|\%(\$[a-zA-Z0-9_-]\+\)\)" contains=muttrcShellString,muttrcVariable
+syntax match muttrcSimplePat contained "!\?\^\?[~][bBcCefhHiLstxy]\s*" nextgroup=muttrcSimplePatRXContainer
+syntax match muttrcSimplePat contained "!\?\^\?[%][bBcCefhHiLstxy]\s*" nextgroup=muttrcSimplePatString
+syntax match muttrcSimplePat contained "!\?\^\?[=][bcCefhHiLstxy]\s*" nextgroup=muttrcSimplePatString
+syntax region muttrcSimplePat contained keepend start=+!\?\^\?[~](+ end=+)+ contains=muttrcSimplePat
+"syn match muttrcSimplePat contained /'[^~=%][^']*/ contains=muttrcRXString
+syntax region muttrcSimplePatString contained keepend start=+"+ end=+"+ skip=+\\"+
+syntax region muttrcSimplePatString contained keepend start=+'+ end=+'+ skip=+\\'+
+syntax region muttrcSimplePatString contained keepend start=+[^ "']+ skip=+\\ + end=+\s+re=e-1
+syntax region muttrcSimplePatRXContainer contained keepend start=+"+ end=+"+ skip=+\\"+ contains=muttrcRXString
+syntax region muttrcSimplePatRXContainer contained keepend start=+'+ end=+'+ skip=+\\'+ contains=muttrcRXString
+syntax region muttrcSimplePatRXContainer contained keepend start=+[^ "']+ skip=+\\ + end=+\s+re=e-1 contains=muttrcRXString
+syntax match muttrcSimplePatMetas contained /[(|)]/
+
+syntax match muttrcOptSimplePat contained skipwhite /[~=%!(^].*/ contains=muttrcSimplePat,muttrcSimplePatMetas
+syntax match muttrcOptSimplePat contained skipwhite /[^~=%!(^].*/ contains=muttrcRXString
+syntax region muttrcOptPattern contained matchgroup=Type keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcOptSimplePat,muttrcUnHighlightSpace nextgroup=muttrcString,muttrcStringNL
+syntax region muttrcOptPattern contained matchgroup=Type keepend skipwhite start=+'+ skip=+\\'+ end=+'+ contains=muttrcOptSimplePat,muttrcUnHighlightSpace nextgroup=muttrcString,muttrcStringNL
+syntax region muttrcOptPattern contained keepend skipwhite start=+[~](+ end=+)+ skip=+\\)+ contains=muttrcSimplePat nextgroup=muttrcString,muttrcStringNL
+syntax match muttrcOptPattern contained skipwhite /[~][A-Za-z]/ contains=muttrcSimplePat nextgroup=muttrcString,muttrcStringNL
+syntax match muttrcOptPattern contained skipwhite /[.]/ nextgroup=muttrcString,muttrcStringNL
+" Keep muttrcPattern and muttrcOptPattern synchronized
+syntax region muttrcPattern contained matchgroup=Type keepend skipwhite start=+"+ skip=+\\"+ end=+"+ contains=muttrcSimplePat,muttrcUnHighlightSpace,muttrcSimplePatMetas
+syntax region muttrcPattern contained matchgroup=Type keepend skipwhite start=+'+ skip=+\\'+ end=+'+ contains=muttrcSimplePat,muttrcUnHighlightSpace,muttrcSimplePatMetas
+syntax region muttrcPattern contained keepend skipwhite start=+[~](+ end=+)+ skip=+\\)+ contains=muttrcSimplePat
+syntax match muttrcPattern contained skipwhite /[~][A-Za-z]/ contains=muttrcSimplePat
+syntax match muttrcPattern contained skipwhite /[.]/
+syntax region muttrcPatternInner contained keepend start=+"[~=%!(^]+ms=s+1 skip=+\\"+ end=+"+me=e-1 contains=muttrcSimplePat,muttrcUnHighlightSpace,muttrcSimplePatMetas
+syntax region muttrcPatternInner contained keepend start=+'[~=%!(^]+ms=s+1 skip=+\\'+ end=+'+me=e-1 contains=muttrcSimplePat,muttrcUnHighlightSpace,muttrcSimplePatMetas
+
+" Colour definitions takes object, foreground and background arguments (regexps excluded).
+syntax match muttrcColorMatchCount contained "[0-9]\+"
+syntax match muttrcColorMatchCountNL contained skipwhite skipnl "\s*\\$" nextgroup=muttrcColorMatchCount,muttrcColorMatchCountNL
+syntax region muttrcColorRXPat contained start=+\s*'+ skip=+\\'+ end=+'\s*+ keepend skipwhite contains=muttrcRXString2 nextgroup=muttrcColorMatchCount,muttrcColorMatchCountNL
+syntax region muttrcColorRXPat contained start=+\s*"+ skip=+\\"+ end=+"\s*+ keepend skipwhite contains=muttrcRXString2 nextgroup=muttrcColorMatchCount,muttrcColorMatchCountNL
+syntax keyword muttrcColor contained black blue cyan default green magenta red white yellow
+syntax keyword muttrcColor contained brightblack brightblue brightcyan brightdefault brightgreen brightmagenta brightred brightwhite brightyellow
+syntax match muttrcColor contained "\<\%(bright\)\=color\d\{1,3}\>"
+" Now for the structure of the color line
+syntax match muttrcColorRXNL contained skipnl "\s*\\$" nextgroup=muttrcColorRXPat,muttrcColorRXNL
+syntax match muttrcColorBG contained /\s*[$]\?\w\+/ contains=muttrcColor,muttrcVariable,muttrcUnHighlightSpace nextgroup=muttrcColorRXPat,muttrcColorRXNL
+syntax match muttrcColorBGNL contained skipnl "\s*\\$" nextgroup=muttrcColorBG,muttrcColorBGNL
+syntax match muttrcColorFG contained /\s*[$]\?\w\+/ contains=muttrcColor,muttrcVariable,muttrcUnHighlightSpace nextgroup=muttrcColorBG,muttrcColorBGNL
+syntax match muttrcColorFGNL contained skipnl "\s*\\$" nextgroup=muttrcColorFG,muttrcColorFGNL
+syntax match muttrcColorContext contained /\s*[$]\?\w\+/ contains=muttrcColorField,muttrcVariable,muttrcUnHighlightSpace,muttrcColorCompose nextgroup=muttrcColorFG,muttrcColorFGNL
+syntax match muttrcColorNL contained skipnl "\s*\\$" nextgroup=muttrcColorContext,muttrcColorNL,muttrcColorCompose
+syntax match muttrcColorKeyword contained /^\s*color\s\+/ nextgroup=muttrcColorContext,muttrcColorNL,muttrcColorCompose
+" And now color's brother:
+syntax region muttrcUnColorPatterns contained skipwhite start=+\s*'+ end=+'+ skip=+\\'+ contains=muttrcPattern nextgroup=muttrcUnColorPatterns,muttrcUnColorPatNL
+syntax region muttrcUnColorPatterns contained skipwhite start=+\s*"+ end=+"+ skip=+\\"+ contains=muttrcPattern nextgroup=muttrcUnColorPatterns,muttrcUnColorPatNL
+syntax match muttrcUnColorPatterns contained skipwhite /\s*[^'"\s]\S\*/ contains=muttrcPattern nextgroup=muttrcUnColorPatterns,muttrcUnColorPatNL
+syntax match muttrcUnColorPatNL contained skipwhite skipnl /\s*\\$/ nextgroup=muttrcUnColorPatterns,muttrcUnColorPatNL
+syntax match muttrcUnColorAll contained skipwhite /[*]/
+syntax match muttrcUnColorAPNL contained skipwhite skipnl /\s*\\$/ nextgroup=muttrcUnColorPatterns,muttrcUnColorAll,muttrcUnColorAPNL
+syntax match muttrcUnColorIndex contained skipwhite /\s*index\s\+/ nextgroup=muttrcUnColorPatterns,muttrcUnColorAll,muttrcUnColorAPNL
+syntax match muttrcUnColorIndexNL contained skipwhite skipnl /\s*\\$/ nextgroup=muttrcUnColorIndex,muttrcUnColorIndexNL
+syntax match muttrcUnColorKeyword contained skipwhite /^\s*uncolor\s\+/ nextgroup=muttrcUnColorIndex,muttrcUnColorIndexNL
+syntax region muttrcUnColorLine keepend start=+^\s*uncolor\s+ skip=+\\$+ end=+$+ contains=muttrcUnColorKeyword,muttrcComment,muttrcUnHighlightSpace
+
+syntax keyword muttrcMonoAttrib contained bold none normal reverse standout underline
+syntax keyword muttrcMono contained mono skipwhite nextgroup=muttrcColorField,muttrcColorCompose
+syntax match muttrcMonoLine "^\s*mono\s\+\S\+" skipwhite nextgroup=muttrcMonoAttrib contains=muttrcMono
+
+" CHECKED 2018-04-18
+" List of fields in Fields in color.c
+syntax keyword muttrcColorField skipwhite contained
+ \ attachment attach_headers body bold error hdrdefault header index
+ \ index_author index_collapsed index_date index_flags index_label
+ \ index_number index_size index_subject index_tag index_tags indicator
+ \ markers message normal progress prompt quoted search sidebar_divider
+ \ sidebar_flagged sidebar_highlight sidebar_indicator sidebar_new
+ \ sidebar_ordinary sidebar_spoolfile signature status tilde tree underline
+ \ nextgroup=muttrcColor
+syntax match muttrcColorField contained "\<quoted\d\=\>"
+
+syntax match muttrcColorCompose skipwhite contained /\s*compose\s*/ nextgroup=muttrcColorComposeField
+
+" CHECKED 2018-04-18
+" List of fields in ComposeFields in color.c
+syntax keyword muttrcColorComposeField skipwhite contained
+ \ header security_both security_encrypt security_none security_sign
+ \ nextgroup=muttrcColorFG,muttrcColorFGNL
+syntax region muttrcColorLine keepend start=/^\s*color\s\+/ skip=+\\$+ end=+$+ contains=muttrcColorKeyword,muttrcComment,muttrcUnHighlightSpace
+
+
+function! s:boolQuadGen(type, vars, deprecated)
+ let l:novars = copy(a:vars)
+ call map(l:novars, '"no" . v:val')
+ let l:invvars = copy(a:vars)
+ call map(l:invvars, '"inv" . v:val')
+
+ let l:orig_type = copy(a:type)
+ if a:deprecated
+ let l:type = 'Deprecated' . a:type
+ else
+ let l:type = a:type
+ endif
+
+ exec 'syntax keyword muttrcVar' . l:type . ' skipwhite contained ' . join(a:vars) . ' nextgroup=muttrcSet' . l:orig_type . 'Assignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr'
+ exec 'syntax keyword muttrcVar' . l:type . ' skipwhite contained ' . join(l:novars) . ' nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr'
+ exec 'syntax keyword muttrcVar' . l:type . ' skipwhite contained ' . join(l:invvars) . ' nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr'
+endfunction
+
+" CHECKED 2018-04-18
+" List of DT_BOOL in MuttVars in init.h
+call s:boolQuadGen('Bool', [
+ \ 'allow_8bit', 'allow_ansi', 'arrow_cursor', 'ascii_chars', 'askbcc',
+ \ 'askcc', 'ask_follow_up', 'ask_x_comment_to', 'attach_split', 'autoedit',
+ \ 'auto_tag', 'beep', 'beep_new', 'bounce_delivered', 'braille_friendly',
+ \ 'change_folder_next', 'check_mbox_size', 'check_new', 'collapse_all',
+ \ 'collapse_flagged', 'collapse_unread', 'confirmappend', 'confirmcreate',
+ \ 'crypt_autoencrypt', 'crypt_autopgp', 'crypt_autosign', 'crypt_autosmime',
+ \ 'crypt_confirmhook', 'crypt_opportunistic_encrypt', 'crypt_replyencrypt',
+ \ 'crypt_replysign', 'crypt_replysignencrypted', 'crypt_timestamp',
+ \ 'crypt_use_gpgme', 'crypt_use_pka', 'delete_untag', 'digest_collapse',
+ \ 'duplicate_threads', 'edit_headers', 'encode_from', 'fast_reply',
+ \ 'fcc_clear', 'flag_safe', 'followup_to', 'force_name', 'forward_decode',
+ \ 'forward_decrypt', 'forward_quote', 'forward_references', 'hdrs',
+ \ 'header', 'header_cache_compress', 'header_color_partial', 'help',
+ \ 'hidden_host', 'hide_limited', 'hide_missing', 'hide_thread_subject',
+ \ 'hide_top_limited', 'hide_top_missing', 'history_remove_dups',
+ \ 'honor_disposition', 'idn_decode', 'idn_encode', 'ignore_list_reply_to',
+ \ 'imap_check_subscribed', 'imap_idle', 'imap_list_subscribed',
+ \ 'imap_passive', 'imap_peek', 'imap_servernoise', 'implicit_autoview',
+ \ 'include_onlyfirst', 'keep_flagged', 'mailcap_sanitize',
+ \ 'maildir_check_cur', 'maildir_header_cache_verify', 'maildir_trash',
+ \ 'mail_check_recent', 'mail_check_stats', 'markers', 'mark_old',
+ \ 'menu_move_off', 'menu_scroll', 'message_cache_clean', 'meta_key',
+ \ 'metoo', 'mh_purge', 'mime_forward_decode', 'mime_subject',
+ \ 'mime_type_query_first', 'narrow_tree', 'nm_record', 'nntp_listgroup',
+ \ 'nntp_load_description', 'pager_stop', 'pgp_autoinline',
+ \ 'pgp_auto_decode', 'pgp_check_exit', 'pgp_ignore_subkeys', 'pgp_long_ids',
+ \ 'pgp_replyinline', 'pgp_retainable_sigs', 'pgp_self_encrypt',
+ \ 'pgp_show_unusable', 'pgp_strict_enc', 'pgp_use_gpg_agent', 'pipe_decode',
+ \ 'pipe_split', 'pop_auth_try_all', 'pop_last', 'postpone_encrypt',
+ \ 'print_decode', 'print_split', 'prompt_after', 'read_only',
+ \ 'reflow_space_quotes', 'reflow_text', 'reply_self', 'reply_with_xorig',
+ \ 'resolve', 'resume_draft_files', 'resume_edited_draft_files',
+ \ 'reverse_alias', 'reverse_name', 'reverse_realname', 'rfc2047_parameters',
+ \ 'save_address', 'save_empty', 'save_name', 'save_unsubscribed', 'score',
+ \ 'show_new_news', 'show_only_unread', 'sidebar_folder_indent',
+ \ 'sidebar_new_mail_only', 'sidebar_next_new_wrap', 'sidebar_on_right',
+ \ 'sidebar_short_path', 'sidebar_visible', 'sig_dashes', 'sig_on_top',
+ \ 'smart_wrap', 'smime_ask_cert_label', 'smime_decrypt_use_default_key',
+ \ 'smime_is_default', 'smime_self_encrypt', 'sort_re', 'ssl_force_tls',
+ \ 'ssl_usesystemcerts', 'ssl_use_sslv2', 'ssl_use_sslv3', 'ssl_use_tlsv1',
+ \ 'ssl_use_tlsv1_1', 'ssl_use_tlsv1_2', 'ssl_verify_dates',
+ \ 'ssl_verify_host', 'ssl_verify_partial_chains', 'status_on_top',
+ \ 'strict_threads', 'suspend', 'text_flowed', 'thorough_search',
+ \ 'thread_received', 'tilde', 'ts_enabled', 'uncollapse_jump',
+ \ 'uncollapse_new', 'user_agent', 'use_8bitmime', 'use_domain',
+ \ 'use_envelope_from', 'use_from', 'use_ipv6', 'virtual_spoolfile',
+ \ 'wait_key', 'weed', 'wrap_search', 'write_bcc', 'x_comment_to'
+ \ ], 0)
+
+" CHECKED 2018-04-18
+" Deprecated Bools
+" List of DT_SYNONYM synonyms of Bools in MuttVars in init.h
+call s:boolQuadGen('Bool', [
+ \ 'edit_hdrs', 'envelope_from', 'forw_decode', 'forw_decrypt',
+ \ 'forw_quote', 'ignore_linear_white_space', 'pgp_autoencrypt',
+ \ 'pgp_autosign', 'pgp_auto_traditional', 'pgp_create_traditional',
+ \ 'pgp_replyencrypt', 'pgp_replysign', 'pgp_replysignencrypted',
+ \ 'xterm_set_titles'
+ \ ], 1)
+
+" CHECKED 2018-04-18
+" List of DT_QUAD in MuttVars in init.h
+call s:boolQuadGen('Quad', [
+ \ 'abort_noattach', 'abort_nosubject', 'abort_unmodified', 'bounce',
+ \ 'catchup_newsgroup', 'copy', 'crypt_verify_sig', 'delete', 'fcc_attach',
+ \ 'followup_to_poster', 'forward_edit', 'honor_followup_to', 'include',
+ \ 'mime_forward', 'mime_forward_rest', 'move', 'pgp_mime_auto',
+ \ 'pop_delete', 'pop_reconnect', 'postpone', 'post_moderated', 'print',
+ \ 'quit', 'recall', 'reply_to', 'ssl_starttls'
+ \ ], 0)
+
+" CHECKED 2018-04-18
+" Deprecated Quads
+" List of DT_SYNONYM synonyms of Quads in MuttVars in init.h
+call s:boolQuadGen('Quad', [
+ \ 'mime_fwd', 'pgp_encrypt_self', 'pgp_verify_sig', 'smime_encrypt_self'
+ \ ], 1)
+
+" CHECKED 2018-04-18
+" List of DT_NUMBER in MuttVars in init.h
+syntax keyword muttrcVarNum skipwhite contained
+ \ connect_timeout debug_level history imap_keepalive imap_pipeline_depth
+ \ imap_poll_timeout mail_check mail_check_stats_interval menu_context
+ \ net_inc nm_db_limit nm_open_timeout nm_query_window_current_position
+ \ nm_query_window_duration nntp_context nntp_poll pager_context
+ \ pager_index_lines pgp_timeout pop_checkinterval read_inc reflow_wrap
+ \ save_history score_threshold_delete score_threshold_flag
+ \ score_threshold_read search_context sendmail_wait sidebar_component_depth
+ \ sidebar_width skip_quoted_offset sleep_time smime_timeout
+ \ ssl_min_dh_prime_bits timeout time_inc wrap wrap_headers write_inc
+ \ nextgroup=muttrcSetNumAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax keyword muttrcVarDeprecatedNum contained skipwhite
+ \ wrapmargin
+ \ nextgroup=muttrcSetNumAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+
+" CHECKED 2018-04-18
+" List of DT_STRING in MuttVars in init.h
+" Special cases first, and all the rest at the end
+" Formats themselves must be updated in their respective groups
+" See s:escapesConditionals
+syntax match muttrcVarStr contained skipwhite 'my_[a-zA-Z0-9_]\+' nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax keyword muttrcVarStr contained skipwhite alias_format nextgroup=muttrcVarEqualsAliasFmt
+syntax keyword muttrcVarStr contained skipwhite attach_format nextgroup=muttrcVarEqualsAttachFmt
+syntax keyword muttrcVarStr contained skipwhite compose_format nextgroup=muttrcVarEqualsComposeFmt
+syntax keyword muttrcVarStr contained skipwhite folder_format vfolder_format nextgroup=muttrcVarEqualsFolderFmt
+syntax keyword muttrcVarStr contained skipwhite attribution index_format message_format pager_format nextgroup=muttrcVarEqualsIdxFmt
+" Deprecated format
+syntax keyword muttrcVarDeprecatedStr contained skipwhite hdr_format msg_format nextgroup=muttrcVarEqualsIdxFmt
+syntax keyword muttrcVarStr contained skipwhite mix_entry_format nextgroup=muttrcVarEqualsMixFmt
+syntax keyword muttrcVarStr contained skipwhite
+ \ pgp_clearsign_command pgp_decode_command pgp_decrypt_command
+ \ pgp_encrypt_only_command pgp_encrypt_sign_command pgp_export_command
+ \ pgp_import_command pgp_list_pubring_command pgp_list_secring_command
+ \ pgp_sign_command pgp_verify_command pgp_verify_key_command
+ \ nextgroup=muttrcVarEqualsPGPCmdFmt
+syntax keyword muttrcVarStr contained skipwhite pgp_entry_format nextgroup=muttrcVarEqualsPGPFmt
+syntax keyword muttrcVarStr contained skipwhite pgp_getkeys_command nextgroup=muttrcVarEqualsPGPGetKeysFmt
+syntax keyword muttrcVarStr contained skipwhite query_format nextgroup=muttrcVarEqualsQueryFmt
+syntax keyword muttrcVarStr contained skipwhite
+ \ smime_decrypt_command smime_encrypt_command smime_get_cert_command
+ \ smime_get_cert_email_command smime_get_signer_cert_command
+ \ smime_import_cert_command smime_pk7out_command smime_sign_command
+ \ smime_verify_command smime_verify_opaque_command
+ \ nextgroup=muttrcVarEqualsSmimeFmt
+syntax keyword muttrcVarStr contained skipwhite ts_icon_format ts_status_format status_format nextgroup=muttrcVarEqualsStatusFmt
+" Deprecated format
+syntax keyword muttrcVarDeprecatedStr contained skipwhite xterm_icon xterm_title nextgroup=muttrcVarEqualsStatusFmt
+syntax keyword muttrcVarStr contained skipwhite date_format nextgroup=muttrcVarEqualsStrftimeFmt
+syntax keyword muttrcVarStr contained skipwhite group_index_format nextgroup=muttrcVarEqualsGrpIdxFmt
+syntax keyword muttrcVarStr contained skipwhite sidebar_format nextgroup=muttrcVarEqualsSdbFmt
+syntax keyword muttrcVarStr contained skipwhite
+ \ assumed_charset attach_charset attach_sep attribution_locale charset
+ \ config_charset content_type default_hook dsn_notify dsn_return
+ \ empty_subject escape forward_attribution_intro forward_attribution_trailer
+ \ forward_format header_cache_pagesize hidden_tags hostname
+ \ imap_authenticators imap_delim_chars imap_headers imap_login imap_pass
+ \ imap_user indent_string mailcap_path mark_macro_prefix mh_seq_flagged
+ \ mh_seq_replied mh_seq_unseen mime_type_query_command newsgroups_charset
+ \ news_server nm_default_uri nm_exclude_tags nm_query_type
+ \ nm_query_window_current_search nm_query_window_timebase nm_record_tags
+ \ nm_unread_tag nntp_authenticators nntp_pass nntp_user pgp_default_key
+ \ pgp_sign_as pipe_sep pop_authenticators pop_host pop_pass pop_user
+ \ postpone_encrypt_as post_indent_string preconnect realname send_charset
+ \ show_multipart_alternative sidebar_delim_chars sidebar_divider_char
+ \ sidebar_indent_string simple_search smime_default_key smime_encrypt_with
+ \ smime_sign_as smime_sign_digest_alg smtp_authenticators smtp_pass smtp_url
+ \ spam_separator ssl_ciphers tunnel
+ \ nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+" Deprecated strings
+syntax keyword muttrcVarDeprecatedStr contained skipwhite
+ \ forw_format indent_str pgp_self_encrypt_as post_indent_str
+ \ smime_self_encrypt_as
+ \ nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+
+" CHECKED 2018-04-18
+" List of DT_ADDRESS
+syntax keyword muttrcVarStr contained skipwhite envelope_from_address from nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+" List of DT_HCACHE
+syntax keyword muttrcVarStr contained skipwhite header_cache_backend nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+" List of DT_MAGIC
+syntax keyword muttrcVarStr contained skipwhite mbox_type nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+" List of DT_MBTABLE
+syntax keyword muttrcVarStr contained skipwhite flag_chars from_chars status_chars to_chars nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+
+" CHECKED 2018-04-18
+" List of DT_PATH
+syntax keyword muttrcVarStr contained skipwhite
+ \ alias_file certificate_file debug_file display_filter editor entropy_file
+ \ folder header_cache history_file inews ispell mbox message_cachedir mixmaster
+ \ new_mail_command news_cache_dir newsrc pager postponed print_command
+ \ query_command record sendmail shell signature smime_ca_location
+ \ smime_certificates smime_keys spoolfile ssl_ca_certificates_file
+ \ ssl_client_cert tmpdir trash visual
+ \ nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+
+" CHECKED 2018-04-18
+" List of DT_REGEX
+syntax keyword muttrcVarStr contained skipwhite
+ \ abort_noattach_regex gecos_mask mask pgp_decryption_okay pgp_good_sign
+ \ quote_regex reply_regex smileys
+ \ nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+" List of deprecated DT_PATH
+syntax keyword muttrcVarDeprecatedStr contained skipwhite print_cmd nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+" List of deprecated DT_REGEX
+syntax keyword muttrcVarDeprecatedStr contained skipwhite abort_noattach_regexp attach_keyword quote_regexp reply_regexp nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+" List of DT_SORT
+syntax keyword muttrcVarStr contained skipwhite
+ \ pgp_sort_keys sidebar_sort_method sort sort_alias sort_aux sort_browser
+ \ nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+
+" CHECKED 2018-04-18
+" List of commands in Commands in init.h
+" Remember to remove hooks, they have already been dealt with
+syntax keyword muttrcCommand skipwhite charset-hook nextgroup=muttrcRXString
+syntax keyword muttrcCommand skipwhite unhook nextgroup=muttrcHooks
+syntax keyword muttrcCommand skipwhite spam nextgroup=muttrcSpamPattern
+syntax keyword muttrcCommand skipwhite nospam nextgroup=muttrcNoSpamPattern
+syntax keyword muttrcCommand skipwhite bind nextgroup=muttrcBindMenuList,muttrcBindMenuListNL
+syntax keyword muttrcCommand skipwhite macro nextgroup=muttrcMacroMenuList,muttrcMacroMenuListNL
+syntax keyword muttrcCommand skipwhite alias nextgroup=muttrcAliasGroupDef,muttrcAliasKey,muttrcAliasNL
+syntax keyword muttrcCommand skipwhite unalias nextgroup=muttrcUnAliasKey,muttrcUnAliasNL
+syntax keyword muttrcCommand skipwhite set unset reset toggle nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr,muttrcVarDeprecatedBool,muttrcVarDeprecatedQuad,muttrcVarDeprecatedStr
+syntax keyword muttrcCommand skipwhite exec nextgroup=muttrcFunction
+syntax keyword muttrcCommand skipwhite
+ \ alternative_order attachments auto_view finish hdr_order ifdef ifndef
+ \ ignore lua lua-source mailboxes mailto_allow mime_lookup my_hdr push score
+ \ setenv sidebar_whitelist source subjectrx subscribe-to tag-formats
+ \ tag-transforms unalternative_order unattachments unauto_view uncolor
+ \ unhdr_order unignore unmailboxes unmailto_allow unmime_lookup unmono
+ \ unmy_hdr unscore unsetenv unsidebar_whitelist unsubjectrx unsubscribe-from
+ \ unvirtual-mailboxes virtual-mailboxes
+
+" CHECKED 2018-04-18
+" List of functions in functions.h
+syntax match muttrcFunction contained "\<accept\>"
+syntax match muttrcFunction contained "\<append\>"
+syntax match muttrcFunction contained "\<attach-file\>"
+syntax match muttrcFunction contained "\<attach-key\>"
+syntax match muttrcFunction contained "\<attach-message\>"
+syntax match muttrcFunction contained "\<attach-news-message\>"
+syntax match muttrcFunction contained "\<backspace\>"
+syntax match muttrcFunction contained "\<backward-char\>"
+syntax match muttrcFunction contained "\<backward-word\>"
+syntax match muttrcFunction contained "\<bol\>"
+syntax match muttrcFunction contained "\<bottom-page\>"
+syntax match muttrcFunction contained "\<bottom\>"
+syntax match muttrcFunction contained "\<bounce-message\>"
+syntax match muttrcFunction contained "\<break-thread\>"
+syntax match muttrcFunction contained "\<buffy-cycle\>"
+syntax match muttrcFunction contained "\<buffy-list\>"
+syntax match muttrcFunction contained "\<capitalize-word\>"
+syntax match muttrcFunction contained "\<catchup\>"
+syntax match muttrcFunction contained "\<chain-next\>"
+syntax match muttrcFunction contained "\<chain-prev\>"
+syntax match muttrcFunction contained "\<change-dir\>"
+syntax match muttrcFunction contained "\<change-folder-readonly\>"
+syntax match muttrcFunction contained "\<change-folder\>"
+syntax match muttrcFunction contained "\<change-newsgroup-readonly\>"
+syntax match muttrcFunction contained "\<change-newsgroup\>"
+syntax match muttrcFunction contained "\<change-vfolder\>"
+syntax match muttrcFunction contained "\<check-new\>"
+syntax match muttrcFunction contained "\<check-traditional-pgp\>"
+syntax match muttrcFunction contained "\<clear-flag\>"
+syntax match muttrcFunction contained "\<collapse-all\>"
+syntax match muttrcFunction contained "\<collapse-parts\>"
+syntax match muttrcFunction contained "\<collapse-thread\>"
+syntax match muttrcFunction contained "\<complete-query\>"
+syntax match muttrcFunction contained "\<complete\>"
+syntax match muttrcFunction contained "\<compose-to-sender\>"
+syntax match muttrcFunction contained "\<copy-file\>"
+syntax match muttrcFunction contained "\<copy-message\>"
+syntax match muttrcFunction contained "\<create-alias\>"
+syntax match muttrcFunction contained "\<create-mailbox\>"
+syntax match muttrcFunction contained "\<current-bottom\>"
+syntax match muttrcFunction contained "\<current-middle\>"
+syntax match muttrcFunction contained "\<current-top\>"
+syntax match muttrcFunction contained "\<decode-copy\>"
+syntax match muttrcFunction contained "\<decode-save\>"
+syntax match muttrcFunction contained "\<decrypt-copy\>"
+syntax match muttrcFunction contained "\<decrypt-save\>"
+syntax match muttrcFunction contained "\<delete-char\>"
+syntax match muttrcFunction contained "\<delete-entry\>"
+syntax match muttrcFunction contained "\<delete-mailbox\>"
+syntax match muttrcFunction contained "\<delete-message\>"
+syntax match muttrcFunction contained "\<delete-pattern\>"
+syntax match muttrcFunction contained "\<delete-subthread\>"
+syntax match muttrcFunction contained "\<delete-thread\>"
+syntax match muttrcFunction contained "\<delete\>"
+syntax match muttrcFunction contained "\<detach-file\>"
+syntax match muttrcFunction contained "\<display-address\>"
+syntax match muttrcFunction contained "\<display-filename\>"
+syntax match muttrcFunction contained "\<display-message\>"
+syntax match muttrcFunction contained "\<display-toggle-weed\>"
+syntax match muttrcFunction contained "\<downcase-word\>"
+syntax match muttrcFunction contained "\<edit-bcc\>"
+syntax match muttrcFunction contained "\<edit-cc\>"
+syntax match muttrcFunction contained "\<edit-description\>"
+syntax match muttrcFunction contained "\<edit-encoding\>"
+syntax match muttrcFunction contained "\<edit-fcc\>"
+syntax match muttrcFunction contained "\<edit-file\>"
+syntax match muttrcFunction contained "\<edit-followup-to\>"
+syntax match muttrcFunction contained "\<edit-from\>"
+syntax match muttrcFunction contained "\<edit-headers\>"
+syntax match muttrcFunction contained "\<edit-label\>"
+syntax match muttrcFunction contained "\<edit-message\>"
+syntax match muttrcFunction contained "\<edit-mime\>"
+syntax match muttrcFunction contained "\<edit-newsgroups\>"
+syntax match muttrcFunction contained "\<edit-or-view-raw-message\>"
+syntax match muttrcFunction contained "\<edit-raw-message\>"
+syntax match muttrcFunction contained "\<edit-reply-to\>"
+syntax match muttrcFunction contained "\<edit-subject\>"
+syntax match muttrcFunction contained "\<edit-to\>"
+syntax match muttrcFunction contained "\<edit-type\>"
+syntax match muttrcFunction contained "\<edit-x-comment-to\>"
+syntax match muttrcFunction contained "\<edit\>"
+syntax match muttrcFunction contained "\<end-cond\>"
+syntax match muttrcFunction contained "\<enter-command\>"
+syntax match muttrcFunction contained "\<enter-mask\>"
+syntax match muttrcFunction contained "\<entire-thread\>"
+syntax match muttrcFunction contained "\<eol\>"
+syntax match muttrcFunction contained "\<exit\>"
+syntax match muttrcFunction contained "\<extract-keys\>"
+syntax match muttrcFunction contained "\<fetch-mail\>"
+syntax match muttrcFunction contained "\<filter-entry\>"
+syntax match muttrcFunction contained "\<first-entry\>"
+syntax match muttrcFunction contained "\<flag-message\>"
+syntax match muttrcFunction contained "\<followup-message\>"
+syntax match muttrcFunction contained "\<forget-passphrase\>"
+syntax match muttrcFunction contained "\<forward-char\>"
+syntax match muttrcFunction contained "\<forward-message\>"
+syntax match muttrcFunction contained "\<forward-to-group\>"
+syntax match muttrcFunction contained "\<forward-word\>"
+syntax match muttrcFunction contained "\<get-attachment\>"
+syntax match muttrcFunction contained "\<get-children\>"
+syntax match muttrcFunction contained "\<get-message\>"
+syntax match muttrcFunction contained "\<get-parent\>"
+syntax match muttrcFunction contained "\<goto-folder\>"
+syntax match muttrcFunction contained "\<goto-parent\>"
+syntax match muttrcFunction contained "\<group-reply\>"
+syntax match muttrcFunction contained "\<half-down\>"
+syntax match muttrcFunction contained "\<half-up\>"
+syntax match muttrcFunction contained "\<help\>"
+syntax match muttrcFunction contained "\<history-down\>"
+syntax match muttrcFunction contained "\<history-search\>"
+syntax match muttrcFunction contained "\<history-up\>"
+syntax match muttrcFunction contained "\<imap-fetch-mail\>"
+syntax match muttrcFunction contained "\<imap-logout-all\>"
+syntax match muttrcFunction contained "\<insert\>"
+syntax match muttrcFunction contained "\<ispell\>"
+syntax match muttrcFunction contained "\<jump\>"
+syntax match muttrcFunction contained "\<kill-eol\>"
+syntax match muttrcFunction contained "\<kill-eow\>"
+syntax match muttrcFunction contained "\<kill-line\>"
+syntax match muttrcFunction contained "\<kill-word\>"
+syntax match muttrcFunction contained "\<last-entry\>"
+syntax match muttrcFunction contained "\<limit-current-thread\>"
+syntax match muttrcFunction contained "\<limit\>"
+syntax match muttrcFunction contained "\<link-threads\>"
+syntax match muttrcFunction contained "\<list-reply\>"
+syntax match muttrcFunction contained "\<mail-key\>"
+syntax match muttrcFunction contained "\<mail\>"
+syntax match muttrcFunction contained "\<mark-as-new\>"
+syntax match muttrcFunction contained "\<mark-message\>"
+syntax match muttrcFunction contained "\<middle-page\>"
+syntax match muttrcFunction contained "\<mix\>"
+syntax match muttrcFunction contained "\<modify-labels-then-hide\>"
+syntax match muttrcFunction contained "\<modify-labels\>"
+syntax match muttrcFunction contained "\<modify-tags-then-hide\>"
+syntax match muttrcFunction contained "\<modify-tags\>"
+syntax match muttrcFunction contained "\<new-mime\>"
+syntax match muttrcFunction contained "\<next-entry\>"
+syntax match muttrcFunction contained "\<next-line\>"
+syntax match muttrcFunction contained "\<next-new-then-unread\>"
+syntax match muttrcFunction contained "\<next-new\>"
+syntax match muttrcFunction contained "\<next-page\>"
+syntax match muttrcFunction contained "\<next-subthread\>"
+syntax match muttrcFunction contained "\<next-thread\>"
+syntax match muttrcFunction contained "\<next-undeleted\>"
+syntax match muttrcFunction contained "\<next-unread-mailbox\>"
+syntax match muttrcFunction contained "\<next-unread\>"
+syntax match muttrcFunction contained "\<noop\>"
+syntax match muttrcFunction contained "\<parent-message\>"
+syntax match muttrcFunction contained "\<pgp-menu\>"
+syntax match muttrcFunction contained "\<pipe-entry\>"
+syntax match muttrcFunction contained "\<pipe-message\>"
+syntax match muttrcFunction contained "\<post-message\>"
+syntax match muttrcFunction contained "\<postpone-message\>"
+syntax match muttrcFunction contained "\<previous-entry\>"
+syntax match muttrcFunction contained "\<previous-line\>"
+syntax match muttrcFunction contained "\<previous-new-then-unread\>"
+syntax match muttrcFunction contained "\<previous-new\>"
+syntax match muttrcFunction contained "\<previous-page\>"
+syntax match muttrcFunction contained "\<previous-subthread\>"
+syntax match muttrcFunction contained "\<previous-thread\>"
+syntax match muttrcFunction contained "\<previous-undeleted\>"
+syntax match muttrcFunction contained "\<previous-unread\>"
+syntax match muttrcFunction contained "\<print-entry\>"
+syntax match muttrcFunction contained "\<print-message\>"
+syntax match muttrcFunction contained "\<purge-message\>"
+syntax match muttrcFunction contained "\<purge-thread\>"
+syntax match muttrcFunction contained "\<quasi-delete\>"
+syntax match muttrcFunction contained "\<query-append\>"
+syntax match muttrcFunction contained "\<query\>"
+syntax match muttrcFunction contained "\<quit\>"
+syntax match muttrcFunction contained "\<quote-char\>"
+syntax match muttrcFunction contained "\<read-subthread\>"
+syntax match muttrcFunction contained "\<read-thread\>"
+syntax match muttrcFunction contained "\<recall-message\>"
+syntax match muttrcFunction contained "\<reconstruct-thread\>"
+syntax match muttrcFunction contained "\<redraw-screen\>"
+syntax match muttrcFunction contained "\<refresh\>"
+syntax match muttrcFunction contained "\<reload-active\>"
+syntax match muttrcFunction contained "\<rename-attachment\>"
+syntax match muttrcFunction contained "\<rename-file\>"
+syntax match muttrcFunction contained "\<rename-mailbox\>"
+syntax match muttrcFunction contained "\<reply\>"
+syntax match muttrcFunction contained "\<resend-message\>"
+syntax match muttrcFunction contained "\<root-message\>"
+syntax match muttrcFunction contained "\<save-entry\>"
+syntax match muttrcFunction contained "\<save-message\>"
+syntax match muttrcFunction contained "\<search-next\>"
+syntax match muttrcFunction contained "\<search-opposite\>"
+syntax match muttrcFunction contained "\<search-reverse\>"
+syntax match muttrcFunction contained "\<search-toggle\>"
+syntax match muttrcFunction contained "\<search\>"
+syntax match muttrcFunction contained "\<select-entry\>"
+syntax match muttrcFunction contained "\<select-new\>"
+syntax match muttrcFunction contained "\<send-message\>"
+syntax match muttrcFunction contained "\<set-flag\>"
+syntax match muttrcFunction contained "\<shell-escape\>"
+syntax match muttrcFunction contained "\<show-limit\>"
+syntax match muttrcFunction contained "\<show-log-messages\>"
+syntax match muttrcFunction contained "\<show-version\>"
+syntax match muttrcFunction contained "\<sidebar-next-new\>"
+syntax match muttrcFunction contained "\<sidebar-next\>"
+syntax match muttrcFunction contained "\<sidebar-open\>"
+syntax match muttrcFunction contained "\<sidebar-page-down\>"
+syntax match muttrcFunction contained "\<sidebar-page-up\>"
+syntax match muttrcFunction contained "\<sidebar-prev-new\>"
+syntax match muttrcFunction contained "\<sidebar-prev\>"
+syntax match muttrcFunction contained "\<sidebar-toggle-virtual\>"
+syntax match muttrcFunction contained "\<sidebar-toggle-visible\>"
+syntax match muttrcFunction contained "\<skip-quoted\>"
+syntax match muttrcFunction contained "\<smime-menu\>"
+syntax match muttrcFunction contained "\<sort-mailbox\>"
+syntax match muttrcFunction contained "\<sort-reverse\>"
+syntax match muttrcFunction contained "\<sort\>"
+syntax match muttrcFunction contained "\<subscribe-pattern\>"
+syntax match muttrcFunction contained "\<subscribe\>"
+syntax match muttrcFunction contained "\<sync-mailbox\>"
+syntax match muttrcFunction contained "\<tag-entry\>"
+syntax match muttrcFunction contained "\<tag-message\>"
+syntax match muttrcFunction contained "\<tag-pattern\>"
+syntax match muttrcFunction contained "\<tag-prefix-cond\>"
+syntax match muttrcFunction contained "\<tag-prefix\>"
+syntax match muttrcFunction contained "\<tag-subthread\>"
+syntax match muttrcFunction contained "\<tag-thread\>"
+syntax match muttrcFunction contained "\<toggle-disposition\>"
+syntax match muttrcFunction contained "\<toggle-mailboxes\>"
+syntax match muttrcFunction contained "\<toggle-new\>"
+syntax match muttrcFunction contained "\<toggle-quoted\>"
+syntax match muttrcFunction contained "\<toggle-read\>"
+syntax match muttrcFunction contained "\<toggle-recode\>"
+syntax match muttrcFunction contained "\<toggle-subscribed\>"
+syntax match muttrcFunction contained "\<toggle-unlink\>"
+syntax match muttrcFunction contained "\<toggle-write\>"
+syntax match muttrcFunction contained "\<top-page\>"
+syntax match muttrcFunction contained "\<top\>"
+syntax match muttrcFunction contained "\<transpose-chars\>"
+syntax match muttrcFunction contained "\<uncatchup\>"
+syntax match muttrcFunction contained "\<undelete-entry\>"
+syntax match muttrcFunction contained "\<undelete-message\>"
+syntax match muttrcFunction contained "\<undelete-pattern\>"
+syntax match muttrcFunction contained "\<undelete-subthread\>"
+syntax match muttrcFunction contained "\<undelete-thread\>"
+syntax match muttrcFunction contained "\<unsubscribe-pattern\>"
+syntax match muttrcFunction contained "\<unsubscribe\>"
+syntax match muttrcFunction contained "\<untag-pattern\>"
+syntax match muttrcFunction contained "\<upcase-word\>"
+syntax match muttrcFunction contained "\<update-encoding\>"
+syntax match muttrcFunction contained "\<verify-key\>"
+syntax match muttrcFunction contained "\<vfolder-from-query\>"
+syntax match muttrcFunction contained "\<vfolder-window-backward\>"
+syntax match muttrcFunction contained "\<vfolder-window-forward\>"
+syntax match muttrcFunction contained "\<view-attachments\>"
+syntax match muttrcFunction contained "\<view-attach\>"
+syntax match muttrcFunction contained "\<view-file\>"
+syntax match muttrcFunction contained "\<view-mailcap\>"
+syntax match muttrcFunction contained "\<view-name\>"
+syntax match muttrcFunction contained "\<view-raw-message\>"
+syntax match muttrcFunction contained "\<view-text\>"
+syntax match muttrcFunction contained "\<what-key\>"
+syntax match muttrcFunction contained "\<write-fcc\>"
+
+
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+highlight def link muttrcComment Comment
+highlight def link muttrcEscape SpecialChar
+highlight def link muttrcRXChars SpecialChar
+highlight def link muttrcString String
+highlight def link muttrcRXString String
+highlight def link muttrcRXString2 String
+highlight def link muttrcSpecial Special
+highlight def link muttrcHooks Type
+highlight def link muttrcGroupFlag Type
+highlight def link muttrcGroupDef Macro
+highlight def link muttrcAddrDef muttrcGroupFlag
+highlight def link muttrcRXDef muttrcGroupFlag
+highlight def link muttrcRXPat String
+highlight def link muttrcAliasGroupName Macro
+highlight def link muttrcAliasKey Identifier
+highlight def link muttrcUnAliasKey Identifier
+highlight def link muttrcAliasEncEmail Identifier
+highlight def link muttrcAliasParens Type
+highlight def link muttrcSetNumAssignment Number
+highlight def link muttrcSetBoolAssignment Boolean
+highlight def link muttrcSetQuadAssignment Boolean
+highlight def link muttrcSetStrAssignment String
+highlight def link muttrcEmail Special
+highlight def link muttrcVariableInner Special
+highlight def link muttrcEscapedVariable String
+highlight def link muttrcHeader Type
+highlight def link muttrcKeySpecial SpecialChar
+highlight def link muttrcKey Type
+highlight def link muttrcKeyName SpecialChar
+highlight def link muttrcVarBool Identifier
+highlight def link muttrcVarQuad Identifier
+highlight def link muttrcVarNum Identifier
+highlight def link muttrcVarStr Identifier
+highlight def link muttrcMenu Identifier
+highlight def link muttrcCommand Keyword
+highlight def link muttrcMacroDescr String
+highlight def link muttrcAction Macro
+highlight def link muttrcBadAction Error
+highlight def link muttrcBindFunction Error
+highlight def link muttrcBindMenuList Error
+highlight def link muttrcFunction Macro
+highlight def link muttrcGroupKeyword muttrcCommand
+highlight def link muttrcGroupLine Error
+highlight def link muttrcSubscribeKeyword muttrcCommand
+highlight def link muttrcSubscribeLine Error
+highlight def link muttrcListsKeyword muttrcCommand
+highlight def link muttrcListsLine Error
+highlight def link muttrcAlternateKeyword muttrcCommand
+highlight def link muttrcAlternatesLine Error
+highlight def link muttrcAttachmentsLine muttrcCommand
+highlight def link muttrcAttachmentsFlag Type
+highlight def link muttrcAttachmentsMimeType String
+highlight def link muttrcColorLine Error
+highlight def link muttrcColorContext Error
+highlight def link muttrcColorContextI Identifier
+highlight def link muttrcColorContextH Identifier
+highlight def link muttrcColorKeyword muttrcCommand
+highlight def link muttrcColorField Identifier
+highlight def link muttrcColorCompose Identifier
+highlight def link muttrcColorComposeField Identifier
+highlight def link muttrcColor Type
+highlight def link muttrcColorFG Error
+highlight def link muttrcColorFGI Error
+highlight def link muttrcColorFGH Error
+highlight def link muttrcColorBG Error
+highlight def link muttrcColorBGI Error
+highlight def link muttrcColorBGH Error
+highlight def link muttrcMonoAttrib muttrcColor
+highlight def link muttrcMono muttrcCommand
+highlight def link muttrcSimplePat Identifier
+highlight def link muttrcSimplePatString Macro
+highlight def link muttrcSimplePatMetas Special
+highlight def link muttrcPattern Error
+highlight def link muttrcUnColorLine Error
+highlight def link muttrcUnColorKeyword muttrcCommand
+highlight def link muttrcUnColorIndex Identifier
+highlight def link muttrcShellString muttrcEscape
+highlight def link muttrcRXHooks muttrcCommand
+highlight def link muttrcRXHookNot Type
+highlight def link muttrcPatHooks muttrcCommand
+highlight def link muttrcPatHookNot Type
+highlight def link muttrcFormatConditionals2 Type
+highlight def link muttrcIndexFormatStr muttrcString
+highlight def link muttrcIndexFormatEscapes muttrcEscape
+highlight def link muttrcIndexFormatConditionals muttrcFormatConditionals2
+highlight def link muttrcAliasFormatStr muttrcString
+highlight def link muttrcAliasFormatEscapes muttrcEscape
+highlight def link muttrcAttachFormatStr muttrcString
+highlight def link muttrcAttachFormatEscapes muttrcEscape
+highlight def link muttrcAttachFormatConditionals muttrcFormatConditionals2
+highlight def link muttrcComposeFormatStr muttrcString
+highlight def link muttrcComposeFormatEscapes muttrcEscape
+highlight def link muttrcFolderFormatStr muttrcString
+highlight def link muttrcFolderFormatEscapes muttrcEscape
+highlight def link muttrcFolderFormatConditionals muttrcFormatConditionals2
+highlight def link muttrcMixFormatStr muttrcString
+highlight def link muttrcMixFormatEscapes muttrcEscape
+highlight def link muttrcMixFormatConditionals muttrcFormatConditionals2
+highlight def link muttrcPGPFormatStr muttrcString
+highlight def link muttrcPGPFormatEscapes muttrcEscape
+highlight def link muttrcPGPFormatConditionals muttrcFormatConditionals2
+highlight def link muttrcPGPCmdFormatStr muttrcString
+highlight def link muttrcPGPCmdFormatEscapes muttrcEscape
+highlight def link muttrcPGPCmdFormatConditionals muttrcFormatConditionals2
+highlight def link muttrcStatusFormatStr muttrcString
+highlight def link muttrcStatusFormatEscapes muttrcEscape
+highlight def link muttrcStatusFormatConditionals muttrcFormatConditionals2
+highlight def link muttrcPGPGetKeysFormatStr muttrcString
+highlight def link muttrcPGPGetKeysFormatEscapes muttrcEscape
+highlight def link muttrcSmimeFormatStr muttrcString
+highlight def link muttrcSmimeFormatEscapes muttrcEscape
+highlight def link muttrcSmimeFormatConditionals muttrcFormatConditionals2
+highlight def link muttrcTimeEscapes muttrcEscape
+highlight def link muttrcPGPTimeEscapes muttrcEscape
+highlight def link muttrcStrftimeEscapes Type
+highlight def link muttrcStrftimeFormatStr muttrcString
+highlight def link muttrcFormatErrors Error
+
+highlight def link muttrcBindFunctionNL SpecialChar
+highlight def link muttrcBindKeyNL SpecialChar
+highlight def link muttrcBindMenuListNL SpecialChar
+highlight def link muttrcMacroDescrNL SpecialChar
+highlight def link muttrcMacroBodyNL SpecialChar
+highlight def link muttrcMacroKeyNL SpecialChar
+highlight def link muttrcMacroMenuListNL SpecialChar
+highlight def link muttrcColorMatchCountNL SpecialChar
+highlight def link muttrcColorNL SpecialChar
+highlight def link muttrcColorRXNL SpecialChar
+highlight def link muttrcColorBGNL SpecialChar
+highlight def link muttrcColorFGNL SpecialChar
+highlight def link muttrcAliasNameNL SpecialChar
+highlight def link muttrcAliasENNL SpecialChar
+highlight def link muttrcAliasNL SpecialChar
+highlight def link muttrcUnAliasNL SpecialChar
+highlight def link muttrcAliasGroupDefNL SpecialChar
+highlight def link muttrcAliasEncEmailNL SpecialChar
+highlight def link muttrcPatternNL SpecialChar
+highlight def link muttrcUnColorPatNL SpecialChar
+highlight def link muttrcUnColorAPNL SpecialChar
+highlight def link muttrcUnColorIndexNL SpecialChar
+highlight def link muttrcStringNL SpecialChar
+
+highlight def link muttrcVarDeprecatedBool Error
+highlight def link muttrcVarDeprecatedQuad Error
+highlight def link muttrcVarDeprecatedStr Error
+
+
+let b:current_syntax = "neomuttrc"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8 noet tw=100 sw=8 sts=0 ft=vim isk+=-
diff --git a/runtime/syntax/netrc.vim b/runtime/syntax/netrc.vim
index 9f15d16637..4d068a1b76 100644
--- a/runtime/syntax/netrc.vim
+++ b/runtime/syntax/netrc.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: netrc(5) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2010-01-03
+" Language: netrc(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2010-01-03
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/netrw.vim b/runtime/syntax/netrw.vim
index 718cee1429..3d3aa993bd 100644
--- a/runtime/syntax/netrw.vim
+++ b/runtime/syntax/netrw.vim
@@ -5,9 +5,8 @@
" ---------------------------------------------------------------------
" Syntax Clearing: {{{1
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/ninja.vim b/runtime/syntax/ninja.vim
index f34588f60c..a53567e585 100644
--- a/runtime/syntax/ninja.vim
+++ b/runtime/syntax/ninja.vim
@@ -1,16 +1,16 @@
" ninja build file syntax.
" Language: ninja build file as described at
-" http://martine.github.com/ninja/manual.html
-" Version: 1.4
-" Last Change: 2014/05/13
+" http://ninja-build.org/manual.html
+" Version: 1.5
+" Last Change: 2018/04/05
" Maintainer: Nicolas Weber <nicolasweber@gmx.de>
-" Version 1.4 of this script is in the upstream vim repository and will be
+" Version 1.5 of this script is in the upstream vim repository and will be
" included in the next vim release. If you change this, please send your change
" upstream.
" ninja lexer and parser are at
-" https://github.com/martine/ninja/blob/master/src/lexer.in.cc
-" https://github.com/martine/ninja/blob/master/src/manifest_parser.cc
+" https://github.com/ninja-build/ninja/blob/master/src/lexer.in.cc
+" https://github.com/ninja-build/ninja/blob/master/src/manifest_parser.cc
if exists("b:current_syntax")
finish
@@ -21,7 +21,10 @@ set cpo&vim
syn case match
-syn match ninjaComment /#.*/ contains=@Spell
+" Comments are only matched when the # is at the beginning of the line (with
+" optional whitespace), as long as the prior line didn't end with a $
+" continuation.
+syn match ninjaComment /\(\$\n\)\@<!\_^\s*#.*$/ contains=@Spell
" Toplevel statements are the ones listed here and
" toplevel variable assignments (ident '=' value).
@@ -38,12 +41,13 @@ syn match ninjaKeyword "^subninja\>"
" limited set of magic variables, 'build' allows general
" let assignments.
" manifest_parser.cc, ParseRule()
-syn region ninjaRule start="^rule" end="^\ze\S" contains=ALL transparent
-syn keyword ninjaRuleCommand contained command deps depfile description generator
+syn region ninjaRule start="^rule" end="^\ze\S" contains=TOP transparent
+syn keyword ninjaRuleCommand contained containedin=ninjaRule command
+ \ deps depfile description generator
\ pool restat rspfile rspfile_content
-syn region ninjaPool start="^pool" end="^\ze\S" contains=ALL transparent
-syn keyword ninjaPoolCommand contained depth
+syn region ninjaPool start="^pool" end="^\ze\S" contains=TOP transparent
+syn keyword ninjaPoolCommand contained containedin=ninjaPool depth
" Strings are parsed as follows:
" lexer.in.cc, ReadEvalString()
diff --git a/runtime/syntax/nqc.vim b/runtime/syntax/nqc.vim
index 0a3cd6bc73..d09c106f98 100644
--- a/runtime/syntax/nqc.vim
+++ b/runtime/syntax/nqc.vim
@@ -6,11 +6,8 @@
" URL: http://www.enotes.de/twiki/pub/Home/LegoMindstorms/nqc.vim
" Filenames: .nqc
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -326,52 +323,42 @@ endif
exec "syn sync ccomment nqcComment minlines=" . nqc_minlines
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_nqc_syn_inits")
- if version < 508
- let did_nqc_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
+
+" The default methods for highlighting. Can be overridden later
+hi def link nqcLabel Label
+hi def link nqcConditional Conditional
+hi def link nqcRepeat Repeat
+hi def link nqcCharacter Character
+hi def link nqcNumber Number
+hi def link nqcFloat Float
+hi def link nqcFunction Function
+hi def link nqcParenError nqcError
+hi def link nqcErrInParen nqcError
+hi def link nqcErrInBracket nqcError
+hi def link nqcCommentL nqcComment
+hi def link nqcCommentStart nqcComment
+hi def link nqcCommentError nqcError
+hi def link nqcCommentStartError nqcError
+hi def link nqcSpaceError nqcError
+hi def link nqcStorageClass StorageClass
+hi def link nqcInclude Include
+hi def link nqcPreProc PreProc
+hi def link nqcDefine Macro
+hi def link nqcIncluded String
+hi def link nqcError Error
+hi def link nqcStatement Statement
+hi def link nqcEvents Statement
+hi def link nqcPreCondit PreCondit
+hi def link nqcType Type
+hi def link nqcConstant Constant
+hi def link nqcCommentSkip nqcComment
+hi def link nqcComment Comment
+hi def link nqcTodo Todo
+hi def link nqcCppSkip nqcCppOut
+hi def link nqcCppOut2 nqcCppOut
+hi def link nqcCppOut Comment
- " The default methods for highlighting. Can be overridden later
- HiLink nqcLabel Label
- HiLink nqcConditional Conditional
- HiLink nqcRepeat Repeat
- HiLink nqcCharacter Character
- HiLink nqcNumber Number
- HiLink nqcFloat Float
- HiLink nqcFunction Function
- HiLink nqcParenError nqcError
- HiLink nqcErrInParen nqcError
- HiLink nqcErrInBracket nqcError
- HiLink nqcCommentL nqcComment
- HiLink nqcCommentStart nqcComment
- HiLink nqcCommentError nqcError
- HiLink nqcCommentStartError nqcError
- HiLink nqcSpaceError nqcError
- HiLink nqcStorageClass StorageClass
- HiLink nqcInclude Include
- HiLink nqcPreProc PreProc
- HiLink nqcDefine Macro
- HiLink nqcIncluded String
- HiLink nqcError Error
- HiLink nqcStatement Statement
- HiLink nqcEvents Statement
- HiLink nqcPreCondit PreCondit
- HiLink nqcType Type
- HiLink nqcConstant Constant
- HiLink nqcCommentSkip nqcComment
- HiLink nqcComment Comment
- HiLink nqcTodo Todo
- HiLink nqcCppSkip nqcCppOut
- HiLink nqcCppOut2 nqcCppOut
- HiLink nqcCppOut Comment
-
- delcommand HiLink
-endif
let b:current_syntax = "nqc"
diff --git a/runtime/syntax/nroff.vim b/runtime/syntax/nroff.vim
index 280ba9e7d9..3a8cf95856 100644
--- a/runtime/syntax/nroff.vim
+++ b/runtime/syntax/nroff.vim
@@ -22,12 +22,9 @@
"
" {{{1 Start syntax highlighting.
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
+" quit when a syntax file was already loaded
"
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+if exists("b:current_syntax")
finish
endif
@@ -197,65 +194,53 @@ syn keyword nroffTodo TODO XXX FIXME contained
"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
+" Only when an item doesn't have highlighting yet
"
-if version >= 508 || !exists("did_nroff_syn_inits")
-
- if version < 508
- let did_nroff_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink nroffEscChar nroffSpecialChar
- HiLink nroffEscCharAr nroffSpecialChar
- HiLink nroffSpecialChar SpecialChar
- HiLink nroffSpace Delimiter
-
- HiLink nroffEscRegArg2 nroffEscRegArg
- HiLink nroffEscRegArg nroffIdent
-
- HiLink nroffEscArg2 nroffEscArg
- HiLink nroffEscPar nroffEscape
-
- HiLink nroffEscRegPar nroffEscape
- HiLink nroffEscArg nroffEscape
- HiLink nroffSize nroffEscape
- HiLink nroffEscape Preproc
-
- HiLink nroffIgnore Comment
- HiLink nroffComment Comment
- HiLink nroffTodo Todo
-
- HiLink nroffReqLeader nroffRequest
- HiLink nroffReqName nroffRequest
- HiLink nroffRequest Statement
- HiLink nroffCond PreCondit
- HiLink nroffDefIdent nroffIdent
- HiLink nroffIdent Identifier
-
- HiLink nroffEquation PreProc
- HiLink nroffTable PreProc
- HiLink nroffPicture PreProc
- HiLink nroffRefer PreProc
- HiLink nroffGrap PreProc
- HiLink nroffGremlin PreProc
-
- HiLink nroffNumber Number
- HiLink nroffBadChar nroffError
- HiLink nroffSpaceError nroffError
- HiLink nroffError Error
-
- HiLink nroffPreserve String
- HiLink nroffString String
- HiLink nroffDefinition String
- HiLink nroffDefSpecial Special
-
- delcommand HiLink
-endif
+hi def link nroffEscChar nroffSpecialChar
+hi def link nroffEscCharAr nroffSpecialChar
+hi def link nroffSpecialChar SpecialChar
+hi def link nroffSpace Delimiter
+
+hi def link nroffEscRegArg2 nroffEscRegArg
+hi def link nroffEscRegArg nroffIdent
+
+hi def link nroffEscArg2 nroffEscArg
+hi def link nroffEscPar nroffEscape
+
+hi def link nroffEscRegPar nroffEscape
+hi def link nroffEscArg nroffEscape
+hi def link nroffSize nroffEscape
+hi def link nroffEscape Preproc
+
+hi def link nroffIgnore Comment
+hi def link nroffComment Comment
+hi def link nroffTodo Todo
+
+hi def link nroffReqLeader nroffRequest
+hi def link nroffReqName nroffRequest
+hi def link nroffRequest Statement
+hi def link nroffCond PreCondit
+hi def link nroffDefIdent nroffIdent
+hi def link nroffIdent Identifier
+
+hi def link nroffEquation PreProc
+hi def link nroffTable PreProc
+hi def link nroffPicture PreProc
+hi def link nroffRefer PreProc
+hi def link nroffGrap PreProc
+hi def link nroffGremlin PreProc
+
+hi def link nroffNumber Number
+hi def link nroffBadChar nroffError
+hi def link nroffSpaceError nroffError
+hi def link nroffError Error
+
+hi def link nroffPreserve String
+hi def link nroffString String
+hi def link nroffDefinition String
+hi def link nroffDefSpecial Special
+
let b:current_syntax = "nroff"
diff --git a/runtime/syntax/nsis.vim b/runtime/syntax/nsis.vim
index d6d803714e..3389771b78 100644
--- a/runtime/syntax/nsis.vim
+++ b/runtime/syntax/nsis.vim
@@ -1,55 +1,72 @@
" Vim syntax file
-" Language: NSIS script, for version of NSIS 1.91 and later
-" Maintainer: Alex Jakushev <Alex.Jakushev@kemek.lt>
-" Last Change: 2004 May 12
-
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" Language: NSIS script, for version of NSIS 3.03 and later
+" Maintainer: Ken Takata
+" URL: https://github.com/k-takata/vim-nsis
+" Previous Maintainer: Alex Jakushev <Alex.Jakushev@kemek.lt>
+" Last Change: 2018-10-02
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
+let s:cpo_save = &cpo
+set cpo&vim
+
syn case ignore
-"COMMENTS
+"Pseudo definitions
+syn match nsisLine nextgroup=@nsisPseudoStatement skipwhite "^"
+syn cluster nsisPseudoStatement contains=nsisFirstComment,nsisLocalLabel,nsisGlobalLabel
+syn cluster nsisPseudoStatement add=nsisDefine,nsisPreCondit,nsisMacro,nsisInclude,nsisSystem
+syn cluster nsisPseudoStatement add=nsisAttribute,nsisCompiler,nsisVersionInfo,nsisInstruction,nsisStatement
+
+"COMMENTS (4.1)
syn keyword nsisTodo todo attention note fixme readme
-syn region nsisComment start=";" end="$" contains=nsisTodo
-syn region nsisComment start="#" end="$" contains=nsisTodo
-
-"LABELS
-syn match nsisLocalLabel "\a\S\{-}:"
-syn match nsisGlobalLabel "\.\S\{-1,}:"
-
-"PREPROCESSOR
-syn match nsisPreprocSubst "${.\{-}}"
-syn match nsisDefine "!define\>"
-syn match nsisDefine "!undef\>"
-syn match nsisPreCondit "!ifdef\>"
-syn match nsisPreCondit "!ifndef\>"
-syn match nsisPreCondit "!endif\>"
-syn match nsisPreCondit "!else\>"
-syn match nsisMacro "!macro\>"
-syn match nsisMacro "!macroend\>"
-syn match nsisMacro "!insertmacro\>"
-
-"COMPILER UTILITY
-syn match nsisInclude "!include\>"
-syn match nsisSystem "!cd\>"
-syn match nsisSystem "!system\>"
-syn match nsisSystem "!packhdr\>"
-
-"VARIABLES
+syn region nsisComment start="[;#]" end="$" contains=nsisTodo,nsisLineContinuation,@Spell oneline
+syn region nsisComment start=".\@1<=/\*" end="\*/" contains=nsisTodo,@Spell
+syn region nsisFirstComment start="/\*" end="\*/" contained contains=nsisTodo,@Spell skipwhite
+ \ nextgroup=@nsisPseudoStatement
+
+syn match nsisLineContinuation "\\$"
+
+"STRINGS (4.1)
+syn region nsisString start=/"/ end=/"/ contains=@nsisStringItems,@Spell
+syn region nsisString start=/'/ end=/'/ contains=@nsisStringItems,@Spell
+syn region nsisString start=/`/ end=/`/ contains=@nsisStringItems,@Spell
+
+syn cluster nsisStringItems contains=nsisPreprocSubst,nsisPreprocLangStr,nsisPreprocEnvVar,nsisUserVar,nsisSysVar,nsisRegistry,nsisLineContinuation
+
+"NUMBERS (4.1)
+syn match nsisNumber "\<[1-9]\d*\>"
+syn match nsisNumber "\<0x\x\+\>"
+syn match nsisNumber "\<0\o*\>"
+
+"STRING REPLACEMENT (5.4, 4.9.15.2, 5.3.1)
+syn region nsisPreprocSubst start="\${" end="}" contains=nsisPreprocSubst,nsisPreprocLangStr,nsisPreprocEnvVar
+syn region nsisPreprocLangStr start="\$(" end=")" contains=nsisPreprocSubst,nsisPreprocLangStr,nsisPreprocEnvVar
+syn region nsisPreprocEnvVar start="\$%" end="%" contains=nsisPreprocSubst,nsisPreprocLangStr,nsisPreprocEnvVar
+
+"VARIABLES (4.2.2)
syn match nsisUserVar "$\d"
syn match nsisUserVar "$R\d"
syn match nsisSysVar "$INSTDIR"
syn match nsisSysVar "$OUTDIR"
syn match nsisSysVar "$CMDLINE"
+syn match nsisSysVar "$LANGUAGE"
+"CONSTANTS (4.2.3)
syn match nsisSysVar "$PROGRAMFILES"
+syn match nsisSysVar "$PROGRAMFILES32"
+syn match nsisSysVar "$PROGRAMFILES64"
+syn match nsisSysVar "$COMMONFILES"
+syn match nsisSysVar "$COMMONFILES32"
+syn match nsisSysVar "$COMMONFILES64"
syn match nsisSysVar "$DESKTOP"
syn match nsisSysVar "$EXEDIR"
+syn match nsisSysVar "$EXEFILE"
+syn match nsisSysVar "$EXEPATH"
+syn match nsisSysVar "${NSISDIR}"
syn match nsisSysVar "$WINDIR"
syn match nsisSysVar "$SYSDIR"
syn match nsisSysVar "$TEMP"
@@ -57,215 +74,609 @@ syn match nsisSysVar "$STARTMENU"
syn match nsisSysVar "$SMPROGRAMS"
syn match nsisSysVar "$SMSTARTUP"
syn match nsisSysVar "$QUICKLAUNCH"
+syn match nsisSysVar "$DOCUMENTS"
+syn match nsisSysVar "$SENDTO"
+syn match nsisSysVar "$RECENT"
+syn match nsisSysVar "$FAVORITES"
+syn match nsisSysVar "$MUSIC"
+syn match nsisSysVar "$PICTURES"
+syn match nsisSysVar "$VIDEOS"
+syn match nsisSysVar "$NETHOOD"
+syn match nsisSysVar "$FONTS"
+syn match nsisSysVar "$TEMPLATES"
+syn match nsisSysVar "$APPDATA"
+syn match nsisSysVar "$LOCALAPPDATA"
+syn match nsisSysVar "$PRINTHOOD"
+syn match nsisSysVar "$INTERNET_CACHE"
+syn match nsisSysVar "$COOKIES"
+syn match nsisSysVar "$HISTORY"
+syn match nsisSysVar "$PROFILE"
+syn match nsisSysVar "$ADMINTOOLS"
+syn match nsisSysVar "$RESOURCES"
+syn match nsisSysVar "$RESOURCES_LOCALIZED"
+syn match nsisSysVar "$CDBURN_AREA"
syn match nsisSysVar "$HWNDPARENT"
+syn match nsisSysVar "$PLUGINSDIR"
syn match nsisSysVar "$\\r"
syn match nsisSysVar "$\\n"
+syn match nsisSysVar "$\\t"
syn match nsisSysVar "$\$"
+syn match nsisSysVar "$\\["'`]"
-"STRINGS
-syn region nsisString start=/"/ skip=/'\|`/ end=/"/ contains=nsisPreprocSubst,nsisUserVar,nsisSysVar,nsisRegistry
-syn region nsisString start=/'/ skip=/"\|`/ end=/'/ contains=nsisPreprocSubst,nsisUserVar,nsisSysVar,nsisRegistry
-syn region nsisString start=/`/ skip=/"\|'/ end=/`/ contains=nsisPreprocSubst,nsisUserVar,nsisSysVar,nsisRegistry
+"LABELS (4.3)
+syn match nsisLocalLabel contained "[^-+!$0-9;"'#. \t/*][^ \t:;#]*:\ze\%($\|[ \t;#]\|\/\*\)"
+syn match nsisGlobalLabel contained "\.[^-+!$0-9;"'# \t/*][^ \t:;#]*:\ze\%($\|[ \t;#]\|\/\*\)"
"CONSTANTS
-syn keyword nsisBoolean true false on off
-
-syn keyword nsisAttribOptions hide show nevershow auto force try ifnewer normal silent silentlog
-syn keyword nsisAttribOptions smooth colored SET CUR END RO none listonly textonly both current all
-syn keyword nsisAttribOptions zlib bzip2 lzma
-
-syn match nsisAttribOptions '\/NOCUSTOM'
-syn match nsisAttribOptions '\/CUSTOMSTRING'
-syn match nsisAttribOptions '\/COMPONENTSONLYONCUSTOM'
-syn match nsisAttribOptions '\/windows'
-syn match nsisAttribOptions '\/r'
-syn match nsisAttribOptions '\/oname'
-syn match nsisAttribOptions '\/REBOOTOK'
-syn match nsisAttribOptions '\/SILENT'
-syn match nsisAttribOptions '\/FILESONLY'
-syn match nsisAttribOptions '\/SHORT'
-
-syn keyword nsisExecShell SW_SHOWNORMAL SW_SHOWMAXIMIZED SW_SHOWMINIMIZED
-
-syn keyword nsisRegistry HKCR HKLM HKCU HKU HKCC HKDD HKPD
-syn keyword nsisRegistry HKEY_CLASSES_ROOT HKEY_LOCAL_MACHINE HKEY_CURRENT_USER HKEY_USERS
-syn keyword nsisRegistry HKEY_CURRENT_CONFIG HKEY_DYN_DATA HKEY_PERFORMANCE_DATA
-
-syn keyword nsisFileAttrib NORMAL ARCHIVE HIDDEN OFFLINE READONLY SYSTEM TEMPORARY
-syn keyword nsisFileAttrib FILE_ATTRIBUTE_NORMAL FILE_ATTRIBUTE_ARCHIVE FILE_ATTRIBUTE_HIDDEN
-syn keyword nsisFileAttrib FILE_ATTRIBUTE_OFFLINE FILE_ATTRIBUTE_READONLY FILE_ATTRIBUTE_SYSTEM
-syn keyword nsisFileAttrib FILE_ATTRIBUTE_TEMPORARY
-
-syn keyword nsisMessageBox MB_OK MB_OKCANCEL MB_ABORTRETRYIGNORE MB_RETRYCANCEL MB_YESNO MB_YESNOCANCEL
-syn keyword nsisMessageBox MB_ICONEXCLAMATION MB_ICONINFORMATION MB_ICONQUESTION MB_ICONSTOP
-syn keyword nsisMessageBox MB_TOPMOST MB_SETFOREGROUND MB_RIGHT
-syn keyword nsisMessageBox MB_DEFBUTTON1 MB_DEFBUTTON2 MB_DEFBUTTON3 MB_DEFBUTTON4
-syn keyword nsisMessageBox IDABORT IDCANCEL IDIGNORE IDNO IDOK IDRETRY IDYES
-
-syn match nsisNumber "\<[^0]\d*\>"
-syn match nsisNumber "\<0x\x\+\>"
-syn match nsisNumber "\<0\o*\>"
+syn keyword nsisBoolean contained true false
+syn keyword nsisOnOff contained on off
+
+syn keyword nsisRegistry contained HKCR HKLM HKCU HKU HKCC HKDD HKPD SHCTX
+syn keyword nsisRegistry contained HKCR32 HKCR64 HKCU32 HKCU64 HKLM32 HKLM64
+syn keyword nsisRegistry contained HKEY_CLASSES_ROOT HKEY_LOCAL_MACHINE HKEY_CURRENT_USER HKEY_USERS
+syn keyword nsisRegistry contained HKEY_CLASSES_ROOT32 HKEY_CLASSES_ROOT64
+syn keyword nsisRegistry contained HKEY_CURRENT_USER32 HKEY_CURRENT_USER64
+syn keyword nsisRegistry contained HKEY_LOCAL_MACHINE32 HKEY_LOCAL_MACHINE64
+syn keyword nsisRegistry contained HKEY_CURRENT_CONFIG HKEY_DYN_DATA HKEY_PERFORMANCE_DATA
+syn keyword nsisRegistry contained SHELL_CONTEXT
+
+
+" common options
+syn cluster nsisAnyOpt contains=nsisComment,nsisLineContinuation,nsisPreprocSubst,nsisPreprocLangStr,nsisPreprocEnvVar,nsisUserVar,nsisSysVar,nsisString,nsisNumber
+syn region nsisBooleanOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisBoolean
+syn region nsisOnOffOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisOnOff
+syn region nsisLangOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisLangKwd
+syn match nsisLangKwd contained "/LANG\>"
+syn region nsisFontOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisFontKwd
+syn match nsisFontKwd contained "/\%(ITALIC\|UNDERLINE\|STRIKE\)\>"
+
+"STATEMENTS - pages (4.5)
+syn keyword nsisStatement contained Page UninstPage nextgroup=nsisPageOpt skipwhite
+syn region nsisPageOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisPageKwd
+syn keyword nsisPageKwd contained custom license components directory instfiles uninstConfirm
+syn match nsisPageKwd contained "/ENABLECANCEL\>"
+
+syn keyword nsisStatement contained PageEx nextgroup=nsisPageExOpt skipwhite
+syn region nsisPageExOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisPageExKwd
+syn match nsisPageExKwd contained "\<\%(un\.\)\?\%(custom\|license\|components\|directory\|instfiles\|uninstConfirm\)\>"
+
+syn keyword nsisStatement contained PageExEnd PageCallbacks
+
+"STATEMENTS - sections (4.6.1)
+syn keyword nsisStatement contained AddSize SectionEnd SectionGroupEnd
+
+syn keyword nsisStatement contained Section nextgroup=nsisSectionOpt skipwhite
+syn region nsisSectionOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisSectionKwd
+syn match nsisSectionKwd contained "/o\>"
+
+syn keyword nsisStatement contained SectionIn nextgroup=nsisSectionInOpt skipwhite
+syn region nsisSectionInOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisSectionInKwd
+syn keyword nsisSectionInKwd contained RO
+
+syn keyword nsisStatement contained SectionGroup nextgroup=nsisSectionGroupOpt skipwhite
+syn region nsisSectionGroupOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisSectionGroupKwd
+syn match nsisSectionGroupKwd contained "/e\>"
+
+"STATEMENTS - functions (4.7.1)
+syn keyword nsisStatement contained Function FunctionEnd
+
+
+"STATEMENTS - LogicLib.nsh
+syn match nsisStatement "${If}"
+syn match nsisStatement "${IfNot}"
+syn match nsisStatement "${Unless}"
+syn match nsisStatement "${ElseIf}"
+syn match nsisStatement "${ElseIfNot}"
+syn match nsisStatement "${ElseUnless}"
+syn match nsisStatement "${Else}"
+syn match nsisStatement "${EndIf}"
+syn match nsisStatement "${EndUnless}"
+syn match nsisStatement "${AndIf}"
+syn match nsisStatement "${AndIfNot}"
+syn match nsisStatement "${AndUnless}"
+syn match nsisStatement "${OrIf}"
+syn match nsisStatement "${OrIfNot}"
+syn match nsisStatement "${OrUnless}"
+syn match nsisStatement "${IfThen}"
+syn match nsisStatement "${IfNotThen}"
+syn match nsisStatement "${||\?}" nextgroup=@nsisPseudoStatement skipwhite
+syn match nsisStatement "${IfCmd}" nextgroup=@nsisPseudoStatement skipwhite
+syn match nsisStatement "${Select}"
+syn match nsisStatement "${Case}"
+syn match nsisStatement "${Case[2-5]}"
+syn match nsisStatement "${CaseElse}"
+syn match nsisStatement "${Default}"
+syn match nsisStatement "${EndSelect}"
+syn match nsisStatement "${Switch}"
+syn match nsisStatement "${EndSwitch}"
+syn match nsisStatement "${Break}"
+syn match nsisStatement "${Do}"
+syn match nsisStatement "${DoWhile}"
+syn match nsisStatement "${DoUntil}"
+syn match nsisStatement "${ExitDo}"
+syn match nsisStatement "${Continue}"
+syn match nsisStatement "${Loop}"
+syn match nsisStatement "${LoopWhile}"
+syn match nsisStatement "${LoopUntil}"
+syn match nsisStatement "${For}"
+syn match nsisStatement "${ForEach}"
+syn match nsisStatement "${ExitFor}"
+syn match nsisStatement "${Next}"
+"STATEMENTS - Memento.nsh
+syn match nsisStatement "${MementoSection}"
+syn match nsisStatement "${MementoSectionEnd}"
+
+
+"USER VARIABLES (4.2.1)
+syn keyword nsisInstruction contained Var nextgroup=nsisVarOpt skipwhite
+syn region nsisVarOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisVarKwd
+syn match nsisVarKwd contained "/GLOBAL\>"
+
+"INSTALLER ATTRIBUTES (4.8.1)
+syn keyword nsisAttribute contained Caption ChangeUI CheckBitmap CompletedText ComponentText
+syn keyword nsisAttribute contained DetailsButtonText DirText DirVar
+syn keyword nsisAttribute contained FileErrorText Icon InstallButtonText
+syn keyword nsisAttribute contained InstallDir InstProgressFlags
+syn keyword nsisAttribute contained LicenseData LicenseText
+syn keyword nsisAttribute contained MiscButtonText Name OutFile
+syn keyword nsisAttribute contained SpaceTexts SubCaption UninstallButtonText UninstallCaption
+syn keyword nsisAttribute contained UninstallIcon UninstallSubCaption UninstallText
+
+syn keyword nsisAttribute contained AddBrandingImage nextgroup=nsisAddBrandingImageOpt skipwhite
+syn region nsisAddBrandingImageOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisAddBrandingImageKwd
+syn keyword nsisAddBrandingImageKwd contained left right top bottom width height
+
+syn keyword nsisAttribute contained nextgroup=nsisBooleanOpt skipwhite
+ \ AllowRootDirInstall AutoCloseWindow
+
+syn keyword nsisAttribute contained BGFont nextgroup=nsisFontOpt skipwhite
+
+syn keyword nsisAttribute contained BGGradient nextgroup=nsisBGGradientOpt skipwhite
+syn region nsisBGGradientOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisBGGradientKwd
+syn keyword nsisBGGradientKwd contained off
+
+syn keyword nsisAttribute contained BrandingText nextgroup=nsisBrandingTextOpt skipwhite
+syn region nsisBrandingTextOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisBrandingTextKwd
+syn match nsisBrandingTextKwd contained "/TRIM\%(LEFT\|RIGHT\|CENTER\)\>"
+
+syn keyword nsisAttribute contained CRCCheck nextgroup=nsisCRCCheckOpt skipwhite
+syn region nsisCRCCheckOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisCRCCheckKwd
+syn keyword nsisCRCCheckKwd contained on off force
+
+syn keyword nsisAttribute contained DirVerify nextgroup=nsisDirVerifyOpt skipwhite
+syn region nsisDirVerifyOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisDirVerifyKwd
+syn keyword nsisDirVerifyKwd contained auto leave
+
+syn keyword nsisAttribute contained InstallColors nextgroup=nsisInstallColorsOpt skipwhite
+syn region nsisInstallColorsOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisInstallColorsKwd
+syn match nsisInstallColorsKwd contained "/windows\>"
+
+syn keyword nsisAttribute contained InstallDirRegKey nextgroup=nsisRegistryOpt skipwhite
+
+syn keyword nsisAttribute contained InstType nextgroup=nsisInstTypeOpt skipwhite
+syn region nsisInstTypeOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisInstTypeKwd
+syn match nsisInstTypeKwd contained "/\%(NOCUSTOM\|CUSTOMSTRING\|COMPONENTSONLYONCUSTOM\)\>"
+
+syn keyword nsisAttribute contained LicenseBkColor nextgroup=nsisLicenseBkColorOpt skipwhite
+syn region nsisLicenseBkColorOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisLicenseBkColorKwd
+syn match nsisLicenseBkColorKwd contained "/\%(gray\|windows\)\>"
+
+syn keyword nsisAttribute contained LicenseForceSelection nextgroup=nsisLicenseForceSelectionOpt skipwhite
+syn region nsisLicenseForceSelectionOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisLicenseForceSelectionKwd
+syn keyword nsisLicenseForceSelectionKwd contained checkbox radiobuttons off
+
+syn keyword nsisAttribute contained ManifestDPIAware nextgroup=nsisManifestDPIAwareOpt skipwhite
+syn region nsisManifestDPIAwareOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisManifestDPIAwareKwd
+syn keyword nsisManifestDPIAwareKwd contained notset true false
+
+syn keyword nsisAttribute contained ManifestSupportedOS nextgroup=nsisManifestSupportedOSOpt skipwhite
+syn region nsisManifestSupportedOSOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisManifestSupportedOSKwd
+syn match nsisManifestSupportedOSKwd contained "\<\%(none\|all\|WinVista\|Win7\|Win8\|Win8\.1\|Win10\)\>"
+
+syn keyword nsisAttribute contained RequestExecutionLevel nextgroup=nsisRequestExecutionLevelOpt skipwhite
+syn region nsisRequestExecutionLevelOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisRequestExecutionLevelKwd
+syn keyword nsisRequestExecutionLevelKwd contained none user highest admin
+
+syn keyword nsisAttribute contained SetFont nextgroup=nsisLangOpt skipwhite
+
+syn keyword nsisAttribute contained nextgroup=nsisShowInstDetailsOpt skipwhite
+ \ ShowInstDetails ShowUninstDetails
+syn region nsisShowInstDetailsOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisShowInstDetailsKwd
+syn keyword nsisShowInstDetailsKwd contained hide show nevershow
+
+syn keyword nsisAttribute contained SilentInstall nextgroup=nsisSilentInstallOpt skipwhite
+syn region nsisSilentInstallOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisSilentInstallKwd
+syn keyword nsisSilentInstallKwd contained normal silent silentlog
+
+syn keyword nsisAttribute contained SilentUnInstall nextgroup=nsisSilentUnInstallOpt skipwhite
+syn region nsisSilentUnInstallOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisSilentUnInstallKwd
+syn keyword nsisSilentUnInstallKwd contained normal silent
+
+syn keyword nsisAttribute contained nextgroup=nsisOnOffOpt skipwhite
+ \ WindowIcon XPStyle
+
+"COMPILER FLAGS (4.8.2)
+syn keyword nsisCompiler contained nextgroup=nsisOnOffOpt skipwhite
+ \ AllowSkipFiles SetDatablockOptimize SetDateSave
+
+syn keyword nsisCompiler contained FileBufSize SetCompressorDictSize
+
+syn keyword nsisCompiler contained SetCompress nextgroup=nsisSetCompressOpt skipwhite
+syn region nsisSetCompressOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisSetCompressKwd
+syn keyword nsisSetCompressKwd contained auto force off
+
+syn keyword nsisCompiler contained SetCompressor nextgroup=nsisSetCompressorOpt skipwhite
+syn region nsisSetCompressorOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisSetCompressorKwd
+syn keyword nsisSetCompressorKwd contained zlib bzip2 lzma
+syn match nsisSetCompressorKwd contained "/\%(SOLID\|FINAL\)"
+
+syn keyword nsisCompiler contained SetOverwrite nextgroup=nsisSetOverwriteOpt skipwhite
+syn region nsisSetOverwriteOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisSetOverwriteKwd
+syn keyword nsisSetOverwriteKwd contained on off try ifnewer ifdiff lastused
+
+syn keyword nsisCompiler contained Unicode nextgroup=nsisBooleanOpt skipwhite
+
+"VERSION INFORMATION (4.8.3)
+syn keyword nsisVersionInfo contained VIAddVersionKey nextgroup=nsisLangOpt skipwhite
+
+syn keyword nsisVersionInfo contained VIProductVersion VIFileVersion
+
+
+"FUNCTIONS - basic (4.9.1)
+syn keyword nsisInstruction contained Delete Rename nextgroup=nsisDeleteOpt skipwhite
+syn region nsisDeleteOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisDeleteKwd
+syn match nsisDeleteKwd contained "/REBOOTOK\>"
+
+syn keyword nsisInstruction contained Exec ExecWait SetOutPath
+
+syn keyword nsisInstruction contained ExecShell ExecShellWait nextgroup=nsisExecShellOpt skipwhite
+syn region nsisExecShellOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisExecShellKwd
+syn keyword nsisExecShellKwd contained SW_SHOWDEFAULT SW_SHOWNORMAL SW_SHOWMAXIMIZED SW_SHOWMINIMIZED SW_HIDE
+syn match nsisExecShellKwd contained "/INVOKEIDLIST\>"
+
+syn keyword nsisInstruction contained File nextgroup=nsisFileOpt skipwhite
+syn region nsisFileOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisFileKwd
+syn match nsisFileKwd contained "/\%(nonfatal\|[arx]\|oname\)\>"
+
+syn keyword nsisInstruction contained ReserveFile nextgroup=nsisReserveFileOpt skipwhite
+syn region nsisReserveFileOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisReserveFileKwd
+syn match nsisReserveFileKwd contained "/\%(nonfatal\|[rx]\|plugin\)\>"
+
+syn keyword nsisInstruction contained RMDir nextgroup=nsisRMDirOpt skipwhite
+syn region nsisRMDirOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisRMDirKwd
+syn match nsisRMDirKwd contained "/\%(REBOOTOK\|r\)\>"
-"INSTALLER ATTRIBUTES - General installer configuration
-syn keyword nsisAttribute OutFile Name Caption SubCaption BrandingText Icon
-syn keyword nsisAttribute WindowIcon BGGradient SilentInstall SilentUnInstall
-syn keyword nsisAttribute CRCCheck MiscButtonText InstallButtonText FileErrorText
+"FUNCTIONS - registry & ini (4.9.2)
+syn keyword nsisInstruction contained DeleteINISec DeleteINIStr FlushINI ReadINIStr WriteINIStr
+syn keyword nsisInstruction contained ExpandEnvStrings ReadEnvStr
-"INSTALLER ATTRIBUTES - Install directory configuration
-syn keyword nsisAttribute InstallDir InstallDirRegKey
+syn keyword nsisInstruction contained DeleteRegKey nextgroup=nsisDeleteRegKeyOpt skipwhite
+syn region nsisDeleteRegKeyOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisDeleteRegKeyKwd,nsisRegistry
+syn match nsisDeleteRegKeyKwd contained "/ifempty\>"
-"INSTALLER ATTRIBUTES - License page configuration
-syn keyword nsisAttribute LicenseText LicenseData
+syn keyword nsisInstruction contained nextgroup=nsisRegistryOpt skipwhite
+ \ DeleteRegValue EnumRegKey EnumRegValue ReadRegDWORD ReadRegStr WriteRegBin WriteRegDWORD WriteRegExpandStr WriteRegStr
+syn region nsisRegistryOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisRegistry
-"INSTALLER ATTRIBUTES - Component page configuration
-syn keyword nsisAttribute ComponentText InstType EnabledBitmap DisabledBitmap SpaceTexts
+syn keyword nsisInstruction contained WriteRegMultiStr nextgroup=nsisWriteRegMultiStrOpt skipwhite
+syn region nsisWriteRegMultiStrOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisRegistry,nsisWriteRegMultiStrKwd
+syn match nsisWriteRegMultiStrKwd contained "/REGEDIT5\>"
-"INSTALLER ATTRIBUTES - Directory page configuration
-syn keyword nsisAttribute DirShow DirText AllowRootDirInstall
+syn keyword nsisInstruction contained SetRegView nextgroup=nsisSetRegViewOpt skipwhite
+syn region nsisSetRegViewOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisSetRegViewKwd
+syn keyword nsisSetRegViewKwd contained default lastused
-"INSTALLER ATTRIBUTES - Install page configuration
-syn keyword nsisAttribute InstallColors InstProgressFlags AutoCloseWindow
-syn keyword nsisAttribute ShowInstDetails DetailsButtonText CompletedText
+"FUNCTIONS - general purpose (4.9.3)
+syn keyword nsisInstruction contained CallInstDLL CreateDirectory GetDLLVersion
+syn keyword nsisInstruction contained GetDLLVersionLocal GetFileTime GetFileTimeLocal
+syn keyword nsisInstruction contained GetTempFileName SearchPath RegDLL UnRegDLL
-"INSTALLER ATTRIBUTES - Uninstall configuration
-syn keyword nsisAttribute UninstallText UninstallIcon UninstallCaption
-syn keyword nsisAttribute UninstallSubCaption ShowUninstDetails UninstallButtonText
+syn keyword nsisInstruction contained CopyFiles nextgroup=nsisCopyFilesOpt skipwhite
+syn region nsisCopyFilesOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisCopyFilesKwd
+syn match nsisCopyFilesKwd contained "/\%(SILENT\|FILESONLY\)\>"
-"COMPILER ATTRIBUTES
-syn keyword nsisCompiler SetOverwrite SetCompress SetCompressor SetDatablockOptimize SetDateSave
+syn keyword nsisInstruction contained CreateShortcut nextgroup=nsisCreateShortcutOpt skipwhite
+syn region nsisCreateShortcutOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisCreateShortcutKwd
+syn match nsisCreateShortcutKwd contained "/NoWorkingDir\>"
+syn keyword nsisInstruction contained GetFullPathName nextgroup=nsisGetFullPathNameOpt skipwhite
+syn region nsisGetFullPathNameOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisGetFullPathNameKwd
+syn match nsisGetFullPathNameKwd contained "/SHORT\>"
-"FUNCTIONS - general purpose
-syn keyword nsisInstruction SetOutPath File Exec ExecWait ExecShell
-syn keyword nsisInstruction Rename Delete RMDir
+syn keyword nsisInstruction contained SetFileAttributes nextgroup=nsisSetFileAttributesOpt skipwhite
+syn region nsisSetFileAttributesOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisFileAttrib
+syn keyword nsisFileAttrib contained NORMAL ARCHIVE HIDDEN OFFLINE READONLY SYSTEM TEMPORARY
+syn keyword nsisFileAttrib contained FILE_ATTRIBUTE_NORMAL FILE_ATTRIBUTE_ARCHIVE FILE_ATTRIBUTE_HIDDEN
+syn keyword nsisFileAttrib contained FILE_ATTRIBUTE_OFFLINE FILE_ATTRIBUTE_READONLY FILE_ATTRIBUTE_SYSTEM
+syn keyword nsisFileAttrib contained FILE_ATTRIBUTE_TEMPORARY
-"FUNCTIONS - registry & ini
-syn keyword nsisInstruction WriteRegStr WriteRegExpandStr WriteRegDWORD WriteRegBin
-syn keyword nsisInstruction WriteINIStr ReadRegStr ReadRegDWORD ReadINIStr ReadEnvStr
-syn keyword nsisInstruction ExpandEnvStrings DeleteRegValue DeleteRegKey EnumRegKey
-syn keyword nsisInstruction EnumRegValue DeleteINISec DeleteINIStr
+"FUNCTIONS - Flow Control (4.9.4)
+syn keyword nsisInstruction contained Abort Call ClearErrors GetCurrentAddress
+syn keyword nsisInstruction contained GetFunctionAddress GetLabelAddress Goto
+syn keyword nsisInstruction contained IfAbort IfErrors IfFileExists IfRebootFlag IfSilent
+syn keyword nsisInstruction contained IntCmp IntCmpU Int64Cmp Int64CmpU IntPtrCmp IntPtrCmpU
+syn keyword nsisInstruction contained Return Quit SetErrors StrCmp StrCmpS
-"FUNCTIONS - general purpose, advanced
-syn keyword nsisInstruction CreateDirectory CopyFiles SetFileAttributes CreateShortCut
-syn keyword nsisInstruction GetFullPathName SearchPath GetTempFileName CallInstDLL
-syn keyword nsisInstruction RegDLL UnRegDLL GetDLLVersion GetDLLVersionLocal
-syn keyword nsisInstruction GetFileTime GetFileTimeLocal
+syn keyword nsisInstruction contained MessageBox nextgroup=nsisMessageBoxOpt skipwhite
+syn region nsisMessageBoxOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisMessageBox
+syn keyword nsisMessageBox contained MB_OK MB_OKCANCEL MB_ABORTRETRYIGNORE MB_RETRYCANCEL MB_YESNO MB_YESNOCANCEL
+syn keyword nsisMessageBox contained MB_ICONEXCLAMATION MB_ICONINFORMATION MB_ICONQUESTION MB_ICONSTOP MB_USERICON
+syn keyword nsisMessageBox contained MB_TOPMOST MB_SETFOREGROUND MB_RIGHT MB_RTLREADING
+syn keyword nsisMessageBox contained MB_DEFBUTTON1 MB_DEFBUTTON2 MB_DEFBUTTON3 MB_DEFBUTTON4
+syn keyword nsisMessageBox contained IDABORT IDCANCEL IDIGNORE IDNO IDOK IDRETRY IDYES
+syn match nsisMessageBox contained "/SD\>"
-"FUNCTIONS - Branching, flow control, error checking, user interaction, etc instructions
-syn keyword nsisInstruction Goto Call Return IfErrors ClearErrors SetErrors FindWindow
-syn keyword nsisInstruction SendMessage IsWindow IfFileExists MessageBox StrCmp
-syn keyword nsisInstruction IntCmp IntCmpU Abort Quit GetFunctionAddress GetLabelAddress
-syn keyword nsisInstruction GetCurrentAddress
+"FUNCTIONS - File and directory i/o instructions (4.9.5)
+syn keyword nsisInstruction contained FileClose FileOpen FileRead FileReadUTF16LE
+syn keyword nsisInstruction contained FileReadByte FileReadWord FileSeek FileWrite
+syn keyword nsisInstruction contained FileWriteByte FileWriteWord
+syn keyword nsisInstruction contained FindClose FindFirst FindNext
-"FUNCTIONS - File and directory i/o instructions
-syn keyword nsisInstruction FindFirst FindNext FindClose FileOpen FileClose FileRead
-syn keyword nsisInstruction FileWrite FileReadByte FileWriteByte FileSeek
+syn keyword nsisInstruction contained FileWriteUTF16LE nextgroup=nsisFileWriteUTF16LEOpt skipwhite
+syn region nsisFileWriteUTF16LEOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisFileWriteUTF16LEKwd
+syn match nsisFileWriteUTF16LEKwd contained "/BOM\>"
-"FUNCTIONS - Misc instructions
-syn keyword nsisInstruction SetDetailsView SetDetailsPrint SetAutoClose DetailPrint
-syn keyword nsisInstruction Sleep BringToFront HideWindow SetShellVarContext
+"FUNCTIONS - Uninstaller instructions (4.9.6)
+syn keyword nsisInstruction contained WriteUninstaller
-"FUNCTIONS - String manipulation support
-syn keyword nsisInstruction StrCpy StrLen
+"FUNCTIONS - Misc instructions (4.9.7)
+syn keyword nsisInstruction contained GetErrorLevel GetInstDirError InitPluginsDir Nop
+syn keyword nsisInstruction contained SetErrorLevel Sleep
-"FUNCTIONS - Stack support
-syn keyword nsisInstruction Push Pop Exch
+syn keyword nsisInstruction contained SetShellVarContext nextgroup=nsisSetShellVarContextOpt skipwhite
+syn region nsisSetShellVarContextOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisSetShellVarContextKwd
+syn keyword nsisSetShellVarContextKwd contained current all
-"FUNCTIONS - Integer manipulation support
-syn keyword nsisInstruction IntOp IntFmt
+"FUNCTIONS - String manipulation support (4.9.8)
+syn keyword nsisInstruction contained StrCpy StrLen
-"FUNCTIONS - Rebooting support
-syn keyword nsisInstruction Reboot IfRebootFlag SetRebootFlag
+"FUNCTIONS - Stack support (4.9.9)
+syn keyword nsisInstruction contained Exch Push Pop
-"FUNCTIONS - Uninstaller instructions
-syn keyword nsisInstruction WriteUninstaller
+"FUNCTIONS - Integer manipulation support (4.9.10)
+syn keyword nsisInstruction contained IntFmt Int64Fmt IntOp IntPtrOp
-"FUNCTIONS - Install logging instructions
-syn keyword nsisInstruction LogSet LogText
+"FUNCTIONS - Rebooting support (4.9.11)
+syn keyword nsisInstruction contained Reboot SetRebootFlag
-"FUNCTIONS - Section management instructions
-syn keyword nsisInstruction SectionSetFlags SectionGetFlags SectionSetText
-syn keyword nsisInstruction SectionGetText
+"FUNCTIONS - Install logging instructions (4.9.12)
+syn keyword nsisInstruction contained LogSet nextgroup=nsisOnOffOpt skipwhite
+syn keyword nsisInstruction contained LogText
+"FUNCTIONS - Section management instructions (4.9.13)
+syn keyword nsisInstruction contained SectionSetFlags SectionGetFlags SectionSetText
+syn keyword nsisInstruction contained SectionGetText SectionSetInstTypes SectionGetInstTypes
+syn keyword nsisInstruction contained SectionSetSize SectionGetSize SetCurInstType GetCurInstType
+syn keyword nsisInstruction contained InstTypeSetText InstTypeGetText
-"SPECIAL FUNCTIONS - install
+"FUNCTIONS - User Interface Instructions (4.9.14)
+syn keyword nsisInstruction contained BringToFront DetailPrint EnableWindow
+syn keyword nsisInstruction contained FindWindow GetDlgItem HideWindow IsWindow
+syn keyword nsisInstruction contained ShowWindow
+
+syn keyword nsisInstruction contained CreateFont nextgroup=nsisFontOpt skipwhite
+
+syn keyword nsisInstruction contained nextgroup=nsisBooleanOpt skipwhite
+ \ LockWindow SetAutoClose
+
+syn keyword nsisInstruction contained SendMessage nextgroup=nsisSendMessageOpt skipwhite
+syn region nsisSendMessageOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisSendMessageKwd
+syn match nsisSendMessageKwd contained "/TIMEOUT\>"
+
+syn keyword nsisInstruction contained SetBrandingImage nextgroup=nsisSetBrandingImageOpt skipwhite
+syn region nsisSetBrandingImageOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisSetBrandingImageKwd
+syn match nsisSetBrandingImageKwd contained "/\%(IMGID\|RESIZETOFIT\)\>"
+
+syn keyword nsisInstruction contained SetDetailsView nextgroup=nsisSetDetailsViewOpt skipwhite
+syn region nsisSetDetailsViewOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisSetDetailsViewKwd
+syn keyword nsisSetDetailsViewKwd contained show hide
+
+syn keyword nsisInstruction contained SetDetailsPrint nextgroup=nsisSetDetailsPrintOpt skipwhite
+syn region nsisSetDetailsPrintOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisSetDetailsPrintKwd
+syn keyword nsisSetDetailsPrintKwd contained none listonly textonly both lastused
+
+syn keyword nsisInstruction contained SetCtlColors nextgroup=nsisSetCtlColorsOpt skipwhite
+syn region nsisSetCtlColorsOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisSetCtlColorsKwd
+syn match nsisSetCtlColorsKwd contained "/BRANDING\>"
+
+syn keyword nsisInstruction contained SetSilent nextgroup=nsisSetSilentOpt skipwhite
+syn region nsisSetSilentOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisSetSilentKwd
+syn keyword nsisSetSilentKwd contained silent normal
+
+
+"FUNCTIONS - Multiple Languages Instructions (4.9.15)
+syn keyword nsisInstruction contained LoadLanguageFile LangString LicenseLangString
+
+
+"SPECIAL FUNCTIONS - install (4.7.2.1)
+syn match nsisCallback "\.onGUIInit"
syn match nsisCallback "\.onInit"
-syn match nsisCallback "\.onUserAbort"
-syn match nsisCallback "\.onInstSuccess"
syn match nsisCallback "\.onInstFailed"
-syn match nsisCallback "\.onVerifyInstDir"
-syn match nsisCallback "\.onNextPage"
-syn match nsisCallback "\.onPrevPage"
+syn match nsisCallback "\.onInstSuccess"
+syn match nsisCallback "\.onGUIEnd"
+syn match nsisCallback "\.onMouseOverSection"
+syn match nsisCallback "\.onRebootFailed"
syn match nsisCallback "\.onSelChange"
+syn match nsisCallback "\.onUserAbort"
+syn match nsisCallback "\.onVerifyInstDir"
-"SPECIAL FUNCTIONS - uninstall
+"SPECIAL FUNCTIONS - uninstall (4.7.2.2)
+syn match nsisCallback "un\.onGUIInit"
syn match nsisCallback "un\.onInit"
+syn match nsisCallback "un\.onUninstFailed"
+syn match nsisCallback "un\.onUninstSuccess"
+syn match nsisCallback "un\.onGUIEnd"
+syn match nsisCallback "un\.onRebootFailed"
+syn match nsisCallback "un\.onSelChange"
syn match nsisCallback "un\.onUserAbort"
-syn match nsisCallback "un\.onInstSuccess"
-syn match nsisCallback "un\.onInstFailed"
-syn match nsisCallback "un\.onVerifyInstDir"
-syn match nsisCallback "un\.onNextPage"
-"STATEMENTS - sections
-syn keyword nsisStatement Section SectionIn SectionEnd SectionDivider
-syn keyword nsisStatement AddSize
+"COMPILER UTILITY (5.1)
+syn match nsisInclude contained "!include\>" nextgroup=nsisIncludeOpt skipwhite
+syn region nsisIncludeOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisIncludeKwd
+syn match nsisIncludeKwd contained "/\%(NONFATAL\|CHARSET\)\>"
+
+syn match nsisSystem contained "!addincludedir\>"
+
+syn match nsisSystem contained "!addplugindir\>" nextgroup=nsisAddplugindirOpt skipwhite
+syn region nsisAddplugindirOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisAddplugindirKwd
+syn match nsisAddplugindirKwd contained "/\%(x86-ansi\|x86-unicode\)\>"
+
+syn match nsisSystem contained "!appendfile\>" nextgroup=nsisAppendfileOpt skipwhite
+syn region nsisAppendfileOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisAppendfileKwd
+syn match nsisAppendfileKwd contained "/\%(CHARSET\|RawNL\)\>"
+
+syn match nsisSystem contained "!cd\>"
+
+syn match nsisSystem contained "!delfile\>" nextgroup=nsisDelfileOpt skipwhite
+syn region nsisDelfileOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisDelfileKwd
+syn match nsisDelfileKwd contained "/nonfatal\>"
+
+syn match nsisSystem contained "!echo\>"
+syn match nsisSystem contained "!error\>"
+syn match nsisSystem contained "!execute\>"
+syn match nsisSystem contained "!makensis\>"
+syn match nsisSystem contained "!packhdr\>"
+syn match nsisSystem contained "!finalize\>"
+syn match nsisSystem contained "!system\>"
+syn match nsisSystem contained "!tempfile\>"
+syn match nsisSystem contained "!getdllversion\>"
+syn match nsisSystem contained "!gettlbversion\>"
+syn match nsisSystem contained "!warning\>"
-"STATEMENTS - functions
-syn keyword nsisStatement Function FunctionEnd
+syn match nsisSystem contained "!pragma\>" nextgroup=nsisPragmaOpt skipwhite
+syn region nsisPragmaOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisPragmaKwd
+syn keyword nsisPragmaKwd contained enable disable default push pop
-"STATEMENTS - pages
-syn keyword nsisStatement Page UninstPage PageEx PageExEnc PageCallbacks
+syn match nsisSystem contained "!verbose\>" nextgroup=nsisVerboseOpt skipwhite
+syn region nsisVerboseOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisVerboseKwd
+syn keyword nsisVerboseKwd contained push pop
+"PREPROCESSOR (5.4)
+syn match nsisDefine contained "!define\>" nextgroup=nsisDefineOpt skipwhite
+syn region nsisDefineOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisDefineKwd
+syn match nsisDefineKwd contained "/\%(ifndef\|redef\|date\|utcdate\|math\|file\)\>"
+
+syn match nsisDefine contained "!undef\>"
+syn match nsisPreCondit contained "!ifdef\>"
+syn match nsisPreCondit contained "!ifndef\>"
+
+syn match nsisPreCondit contained "!if\>" nextgroup=nsisIfOpt skipwhite
+syn region nsisIfOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisIfKwd
+syn match nsisIfKwd contained "/FileExists\>"
+
+syn match nsisPreCondit contained "!ifmacrodef\>"
+syn match nsisPreCondit contained "!ifmacrondef\>"
+syn match nsisPreCondit contained "!else\>"
+syn match nsisPreCondit contained "!endif\>"
+syn match nsisMacro contained "!insertmacro\>"
+syn match nsisMacro contained "!macro\>"
+syn match nsisMacro contained "!macroend\>"
+syn match nsisMacro contained "!macroundef\>"
+
+syn match nsisMacro contained "!searchparse\>" nextgroup=nsisSearchparseOpt skipwhite
+syn region nsisSearchparseOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisSearchparseKwd
+syn match nsisSearchparseKwd contained "/\%(ignorecase\|noerrors\|file\)\>"
+
+syn match nsisMacro contained "!searchreplace\>" nextgroup=nsisSearchreplaceOpt skipwhite
+syn region nsisSearchreplaceOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisSearchreplaceKwd
+syn match nsisSearchreplaceKwd contained "/ignorecase\>"
-"ERROR
-syn keyword nsisError UninstallExeName
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_nsis_syn_inits")
-
- if version < 508
- let did_nsys_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
-
- HiLink nsisInstruction Function
- HiLink nsisComment Comment
- HiLink nsisLocalLabel Label
- HiLink nsisGlobalLabel Label
- HiLink nsisStatement Statement
- HiLink nsisString String
- HiLink nsisBoolean Boolean
- HiLink nsisAttribOptions Constant
- HiLink nsisExecShell Constant
- HiLink nsisFileAttrib Constant
- HiLink nsisMessageBox Constant
- HiLink nsisRegistry Identifier
- HiLink nsisNumber Number
- HiLink nsisError Error
- HiLink nsisUserVar Identifier
- HiLink nsisSysVar Identifier
- HiLink nsisAttribute Type
- HiLink nsisCompiler Type
- HiLink nsisTodo Todo
- HiLink nsisCallback Operator
- " preprocessor commands
- HiLink nsisPreprocSubst PreProc
- HiLink nsisDefine Define
- HiLink nsisMacro Macro
- HiLink nsisPreCondit PreCondit
- HiLink nsisInclude Include
- HiLink nsisSystem PreProc
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link nsisInstruction Function
+hi def link nsisComment Comment
+hi def link nsisFirstComment Comment
+hi def link nsisLocalLabel Label
+hi def link nsisGlobalLabel Label
+hi def link nsisStatement Statement
+hi def link nsisString String
+hi def link nsisBoolean Boolean
+hi def link nsisOnOff Boolean
+hi def link nsisFontKwd Constant
+hi def link nsisLangKwd Constant
+hi def link nsisPageKwd Constant
+hi def link nsisPageExKwd Constant
+hi def link nsisSectionKwd Constant
+hi def link nsisSectionInKwd Constant
+hi def link nsisSectionGroupKwd Constant
+hi def link nsisVarKwd Constant
+hi def link nsisAddBrandingImageKwd Constant
+hi def link nsisBGGradientKwd Constant
+hi def link nsisBrandingTextKwd Constant
+hi def link nsisCRCCheckKwd Constant
+hi def link nsisDirVerifyKwd Constant
+hi def link nsisInstallColorsKwd Constant
+hi def link nsisInstTypeKwd Constant
+hi def link nsisLicenseBkColorKwd Constant
+hi def link nsisLicenseForceSelectionKwd Constant
+hi def link nsisManifestDPIAwareKwd Constant
+hi def link nsisManifestSupportedOSKwd Constant
+hi def link nsisRequestExecutionLevelKwd Constant
+hi def link nsisShowInstDetailsKwd Constant
+hi def link nsisSilentInstallKwd Constant
+hi def link nsisSilentUnInstallKwd Constant
+hi def link nsisSetCompressKwd Constant
+hi def link nsisSetCompressorKwd Constant
+hi def link nsisSetOverwriteKwd Constant
+hi def link nsisDeleteKwd Constant
+hi def link nsisExecShellKwd Constant
+hi def link nsisFileKwd Constant
+hi def link nsisReserveFileKwd Constant
+hi def link nsisRMDirKwd Constant
+hi def link nsisDeleteRegKeyKwd Constant
+hi def link nsisWriteRegMultiStrKwd Constant
+hi def link nsisSetRegViewKwd Constant
+hi def link nsisCopyFilesKwd Constant
+hi def link nsisCreateShortcutKwd Constant
+hi def link nsisGetFullPathNameKwd Constant
+hi def link nsisFileAttrib Constant
+hi def link nsisMessageBox Constant
+hi def link nsisFileWriteUTF16LEKwd Constant
+hi def link nsisSetShellVarContextKwd Constant
+hi def link nsisSendMessageKwd Constant
+hi def link nsisSetBrandingImageKwd Constant
+hi def link nsisSetDetailsViewKwd Constant
+hi def link nsisSetDetailsPrintKwd Constant
+hi def link nsisSetCtlColorsKwd Constant
+hi def link nsisSetSilentKwd Constant
+hi def link nsisRegistry Identifier
+hi def link nsisNumber Number
+hi def link nsisError Error
+hi def link nsisUserVar Identifier
+hi def link nsisSysVar Identifier
+hi def link nsisAttribute Type
+hi def link nsisCompiler Type
+hi def link nsisVersionInfo Type
+hi def link nsisTodo Todo
+hi def link nsisCallback Identifier
+" preprocessor commands
+hi def link nsisPreprocSubst PreProc
+hi def link nsisPreprocLangStr PreProc
+hi def link nsisPreprocEnvVar PreProc
+hi def link nsisDefine Define
+hi def link nsisMacro Macro
+hi def link nsisPreCondit PreCondit
+hi def link nsisInclude Include
+hi def link nsisSystem PreProc
+hi def link nsisLineContinuation Special
+hi def link nsisIncludeKwd Constant
+hi def link nsisAddplugindirKwd Constant
+hi def link nsisAppendfileKwd Constant
+hi def link nsisDelfileKwd Constant
+hi def link nsisPragmaKwd Constant
+hi def link nsisVerboseKwd Constant
+hi def link nsisDefineKwd Constant
+hi def link nsisIfKwd Constant
+hi def link nsisSearchparseKwd Constant
+hi def link nsisSearchreplaceKwd Constant
+
let b:current_syntax = "nsis"
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/obj.vim b/runtime/syntax/obj.vim
index 66cd6c2bde..df4dbca5d7 100644
--- a/runtime/syntax/obj.vim
+++ b/runtime/syntax/obj.vim
@@ -4,11 +4,8 @@
" File Types: .obj (used in 3D)
" Last Change: 2010 May 18
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -62,34 +59,24 @@ syn match objInt "\d\+"
syn match objIndex "\d\+\/\d*\/\d*"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_cabal_syn_inits")
- if version < 508
- let did_cabal_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink objError Error
- HiLink objComment Comment
- HiLink objInclude PreProc
- HiLink objFloat Float
- HiLink objInt Number
- HiLink objGroup Structure
- HiLink objIndex Constant
- HiLink objMaterial Label
+hi def link objError Error
+hi def link objComment Comment
+hi def link objInclude PreProc
+hi def link objFloat Float
+hi def link objInt Number
+hi def link objGroup Structure
+hi def link objIndex Constant
+hi def link objMaterial Label
- HiLink objVertex Keyword
- HiLink objNormale Keyword
- HiLink objVertice Keyword
- HiLink objFace Keyword
- HiLink objKeywords Keyword
+hi def link objVertex Keyword
+hi def link objNormale Keyword
+hi def link objVertice Keyword
+hi def link objFace Keyword
+hi def link objKeywords Keyword
- delcommand HiLink
-endif
let b:current_syntax = "obj"
diff --git a/runtime/syntax/objcpp.vim b/runtime/syntax/objcpp.vim
index e80eed900d..f11e307444 100644
--- a/runtime/syntax/objcpp.vim
+++ b/runtime/syntax/objcpp.vim
@@ -4,23 +4,15 @@
" Ex-Maintainer: Anthony Hodsdon <ahodsdon@fastmail.fm>
" Last Change: 2007 Oct 29
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" Read in C++ and ObjC syntax files
-if version < 600
- so <sfile>:p:h/cpp.vim
- so <sfile>:p:h/objc.vim
-else
- runtime! syntax/cpp.vim
- unlet b:current_syntax
- runtime! syntax/objc.vim
-endif
+runtime! syntax/cpp.vim
+unlet b:current_syntax
+runtime! syntax/objc.vim
syn keyword objCppNonStructure class template namespace transparent contained
syn keyword objCppNonStatement new delete friend using transparent contained
diff --git a/runtime/syntax/ocaml.vim b/runtime/syntax/ocaml.vim
index 24116f0e02..68c1feddae 100644
--- a/runtime/syntax/ocaml.vim
+++ b/runtime/syntax/ocaml.vim
@@ -13,11 +13,8 @@
" can be distinguished from begin/end, which is used for indentation,
" and folding. (David Baelde)
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax") && b:current_syntax == "ocaml"
+" quit when a syntax file was already loaded
+if exists("b:current_syntax") && b:current_syntax == "ocaml"
finish
endif
@@ -253,78 +250,68 @@ syn sync match ocamlSigSync grouphere ocamlSig "\<sig\>"
syn sync match ocamlSigSync groupthere ocamlSig "\<end\>"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_ocaml_syntax_inits")
- if version < 508
- let did_ocaml_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink ocamlBraceErr Error
- HiLink ocamlBrackErr Error
- HiLink ocamlParenErr Error
- HiLink ocamlArrErr Error
-
- HiLink ocamlCommentErr Error
-
- HiLink ocamlCountErr Error
- HiLink ocamlDoErr Error
- HiLink ocamlDoneErr Error
- HiLink ocamlEndErr Error
- HiLink ocamlThenErr Error
-
- HiLink ocamlCharErr Error
-
- HiLink ocamlErr Error
-
- HiLink ocamlComment Comment
-
- HiLink ocamlModPath Include
- HiLink ocamlObject Include
- HiLink ocamlModule Include
- HiLink ocamlModParam1 Include
- HiLink ocamlModType Include
- HiLink ocamlMPRestr3 Include
- HiLink ocamlFullMod Include
- HiLink ocamlModTypeRestr Include
- HiLink ocamlWith Include
- HiLink ocamlMTDef Include
-
- HiLink ocamlScript Include
-
- HiLink ocamlConstructor Constant
-
- HiLink ocamlVal Keyword
- HiLink ocamlModPreRHS Keyword
- HiLink ocamlMPRestr2 Keyword
- HiLink ocamlKeyword Keyword
- HiLink ocamlMethod Include
- HiLink ocamlFunDef Keyword
- HiLink ocamlRefAssign Keyword
- HiLink ocamlKeyChar Keyword
- HiLink ocamlAnyVar Keyword
- HiLink ocamlTopStop Keyword
- HiLink ocamlOperator Keyword
-
- HiLink ocamlBoolean Boolean
- HiLink ocamlCharacter Character
- HiLink ocamlNumber Number
- HiLink ocamlFloat Float
- HiLink ocamlString String
-
- HiLink ocamlLabel Identifier
-
- HiLink ocamlType Type
-
- HiLink ocamlTodo Todo
-
- HiLink ocamlEncl Keyword
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link ocamlBraceErr Error
+hi def link ocamlBrackErr Error
+hi def link ocamlParenErr Error
+hi def link ocamlArrErr Error
+
+hi def link ocamlCommentErr Error
+
+hi def link ocamlCountErr Error
+hi def link ocamlDoErr Error
+hi def link ocamlDoneErr Error
+hi def link ocamlEndErr Error
+hi def link ocamlThenErr Error
+
+hi def link ocamlCharErr Error
+
+hi def link ocamlErr Error
+
+hi def link ocamlComment Comment
+
+hi def link ocamlModPath Include
+hi def link ocamlObject Include
+hi def link ocamlModule Include
+hi def link ocamlModParam1 Include
+hi def link ocamlModType Include
+hi def link ocamlMPRestr3 Include
+hi def link ocamlFullMod Include
+hi def link ocamlModTypeRestr Include
+hi def link ocamlWith Include
+hi def link ocamlMTDef Include
+
+hi def link ocamlScript Include
+
+hi def link ocamlConstructor Constant
+
+hi def link ocamlVal Keyword
+hi def link ocamlModPreRHS Keyword
+hi def link ocamlMPRestr2 Keyword
+hi def link ocamlKeyword Keyword
+hi def link ocamlMethod Include
+hi def link ocamlFunDef Keyword
+hi def link ocamlRefAssign Keyword
+hi def link ocamlKeyChar Keyword
+hi def link ocamlAnyVar Keyword
+hi def link ocamlTopStop Keyword
+hi def link ocamlOperator Keyword
+
+hi def link ocamlBoolean Boolean
+hi def link ocamlCharacter Character
+hi def link ocamlNumber Number
+hi def link ocamlFloat Float
+hi def link ocamlString String
+
+hi def link ocamlLabel Identifier
+
+hi def link ocamlType Type
+
+hi def link ocamlTodo Todo
+
+hi def link ocamlEncl Keyword
+
let b:current_syntax = "ocaml"
diff --git a/runtime/syntax/occam.vim b/runtime/syntax/occam.vim
index 1c84bf00f6..01d139bd09 100644
--- a/runtime/syntax/occam.vim
+++ b/runtime/syntax/occam.vim
@@ -4,9 +4,8 @@
" Maintainer: Mario Schweigler <ms44@kent.ac.uk>
" Last Change: 24 May 2003
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -86,41 +85,32 @@ syn match occamCDString /<\|>\|=\|(\|)/ contained
syn region occamCDirective start=/#\(USE\|INCLUDE\|PRAGMA\|DEFINE\|UNDEFINE\|UNDEF\|IF\|ELIF\|ELSE\|ENDIF\|WARNING\|ERROR\|RELAX\)\>/ end=/$/ contains=occamString,occamComment,occamCDString
-if version >= 508 || !exists("did_occam_syn_inits")
- if version < 508
- let did_occam_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink occamType Type
- HiLink occamKeyword Keyword
- HiLink occamComment Comment
- HiLink occamCommentTitle PreProc
- HiLink occamTodo Todo
- HiLink occamNote Todo
- HiLink occamString String
- HiLink occamCharString String
- HiLink occamNumber Number
- HiLink occamCDirective PreProc
- HiLink occamCDString String
- HiLink occamPPIdentifier PreProc
- HiLink occamBoolean Boolean
- HiLink occamSpecialChar SpecialChar
- HiLink occamChar Character
- HiLink occamStructure Structure
- HiLink occamIdentifier Identifier
- HiLink occamConstant Constant
- HiLink occamOperator Operator
- HiLink occamFunction Ignore
- HiLink occamRepeat Repeat
- HiLink occamConditional Conditional
- HiLink occamBrackets Type
- HiLink occamParantheses Delimiter
-
- delcommand HiLink
-endif
+
+hi def link occamType Type
+hi def link occamKeyword Keyword
+hi def link occamComment Comment
+hi def link occamCommentTitle PreProc
+hi def link occamTodo Todo
+hi def link occamNote Todo
+hi def link occamString String
+hi def link occamCharString String
+hi def link occamNumber Number
+hi def link occamCDirective PreProc
+hi def link occamCDString String
+hi def link occamPPIdentifier PreProc
+hi def link occamBoolean Boolean
+hi def link occamSpecialChar SpecialChar
+hi def link occamChar Character
+hi def link occamStructure Structure
+hi def link occamIdentifier Identifier
+hi def link occamConstant Constant
+hi def link occamOperator Operator
+hi def link occamFunction Ignore
+hi def link occamRepeat Repeat
+hi def link occamConditional Conditional
+hi def link occamBrackets Type
+hi def link occamParantheses Delimiter
+
let b:current_syntax = "occam"
diff --git a/runtime/syntax/omnimark.vim b/runtime/syntax/omnimark.vim
index 698b3c09fb..6294945ffb 100644
--- a/runtime/syntax/omnimark.vim
+++ b/runtime/syntax/omnimark.vim
@@ -3,19 +3,12 @@
" Maintainer: Paul Terray <mailto:terray@4dconcept.fr>
" Last Change: 11 Oct 2000
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
-if version < 600
- set iskeyword=@,48-57,_,128-167,224-235,-
-else
- setlocal iskeyword=@,48-57,_,128-167,224-235,-
-endif
+setlocal iskeyword=@,48-57,_,128-167,224-235,-
syn keyword omnimarkKeywords ACTIVATE AGAIN
syn keyword omnimarkKeywords CATCH CLEAR CLOSE COPY COPY-CLEAR CROSS-TRANSLATE
@@ -96,26 +89,16 @@ syn match omnimarkEscape contained +%[0-9][0-9]#+
syn sync minlines=2000
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_omnimark_syntax_inits")
- if version < 508
- let did_omnimark_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink omnimarkCommands Statement
- HiLink omnimarkKeywords Identifier
- HiLink omnimarkString String
- HiLink omnimarkPatterns Macro
-" HiLink omnimarkNumber Number
- HiLink omnimarkComment Comment
- HiLink omnimarkEscape Special
+hi def link omnimarkCommands Statement
+hi def link omnimarkKeywords Identifier
+hi def link omnimarkString String
+hi def link omnimarkPatterns Macro
+" hi def link omnimarkNumber Number
+hi def link omnimarkComment Comment
+hi def link omnimarkEscape Special
- delcommand HiLink
-endif
let b:current_syntax = "omnimark"
diff --git a/runtime/syntax/openroad.vim b/runtime/syntax/openroad.vim
index 3f9a78d552..e09f233647 100644
--- a/runtime/syntax/openroad.vim
+++ b/runtime/syntax/openroad.vim
@@ -3,12 +3,8 @@
" Maintainer: Luis Moreno <lmoreno@eresmas.net>
" Last change: 2001 Jun 12
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-"
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -235,32 +231,22 @@ else
endif
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
+" Only when an item doesn't have highlighting yet
"
-if version >= 508 || !exists("did_openroad_syntax_inits")
- if version < 508
- let did_openroad_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink openroadKeyword Statement
- HiLink openroadNumber Number
- HiLink openroadString String
- HiLink openroadComment Comment
- HiLink openroadOperator Operator
- HiLink openroadType Type
- HiLink openroadFunc Special
- HiLink openroadClass Type
- HiLink openroadEvent Statement
- HiLink openroadConst Constant
- HiLink openroadVar Identifier
- HiLink openroadIdent Identifier
- HiLink openroadTodo Todo
+hi def link openroadKeyword Statement
+hi def link openroadNumber Number
+hi def link openroadString String
+hi def link openroadComment Comment
+hi def link openroadOperator Operator
+hi def link openroadType Type
+hi def link openroadFunc Special
+hi def link openroadClass Type
+hi def link openroadEvent Statement
+hi def link openroadConst Constant
+hi def link openroadVar Identifier
+hi def link openroadIdent Identifier
+hi def link openroadTodo Todo
- delcommand HiLink
-endif
let b:current_syntax = "openroad"
diff --git a/runtime/syntax/opl.vim b/runtime/syntax/opl.vim
index 1b07e3596c..8b66a5b345 100644
--- a/runtime/syntax/opl.vim
+++ b/runtime/syntax/opl.vim
@@ -6,11 +6,8 @@
" Open Psion Language... (EPOC16/EPOC32)
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -75,25 +72,15 @@ syn region OPLComment start="REM[\t ]" end="$"
syn match OPLMathsOperator "-\|=\|[:<>+\*^/\\]"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_OPL_syntax_inits")
- if version < 508
- let did_OPL_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink OPLStatement Statement
- HiLink OPLNumber Number
- HiLink OPLString String
- HiLink OPLComment Comment
- HiLink OPLMathsOperator Conditional
-" HiLink OPLError Error
+hi def link OPLStatement Statement
+hi def link OPLNumber Number
+hi def link OPLString String
+hi def link OPLComment Comment
+hi def link OPLMathsOperator Conditional
+" hi def link OPLError Error
- delcommand HiLink
-endif
let b:current_syntax = "opl"
diff --git a/runtime/syntax/ora.vim b/runtime/syntax/ora.vim
index bf5d3220a0..99034793f2 100644
--- a/runtime/syntax/ora.vim
+++ b/runtime/syntax/ora.vim
@@ -11,10 +11,8 @@
" sqlnet-ora and tnsnames.ora; since will not cause(?) problems
" is easier to follow separately each file's keywords)
-" Remove any old syntax stuff hanging around, if needed
-if version < 600
- syn clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -437,35 +435,23 @@ syn cluster oraAll add=oraValue,oraModifier,oraString,oraSpecial,oraComment
"==============================================================================
" highlighting
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_ora_syn_inits")
-
- if version < 508
- let did_ora_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink oraKeyword Statement "usual keywords
- HiLink oraKeywordGroup Type "keywords which group other keywords
- HiLink oraKeywordPref oraKeywordGroup "keywords which act as prefixes
- HiLink oraKeywordObs Todo "obsolete keywords
- HiLink oraKeywordUnd PreProc "undocumented keywords
- HiLink oraKeywordUndObs oraKeywordObs "undocumented obsolete keywords
- HiLink oraValue Identifier "values, like true or false
- HiLink oraModifier oraValue "modifies values
- HiLink oraString String "strings
-
- HiLink oraSpecial Special "special characters
- HiLink oraError Error "errors
- HiLink oraParenError oraError "errors caused by mismatching parantheses
-
- HiLink oraComment Comment "comments
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link oraKeyword Statement "usual keywords
+hi def link oraKeywordGroup Type "keywords which group other keywords
+hi def link oraKeywordPref oraKeywordGroup "keywords which act as prefixes
+hi def link oraKeywordObs Todo "obsolete keywords
+hi def link oraKeywordUnd PreProc "undocumented keywords
+hi def link oraKeywordUndObs oraKeywordObs "undocumented obsolete keywords
+hi def link oraValue Identifier "values, like true or false
+hi def link oraModifier oraValue "modifies values
+hi def link oraString String "strings
+
+hi def link oraSpecial Special "special characters
+hi def link oraError Error "errors
+hi def link oraParenError oraError "errors caused by mismatching parantheses
+
+hi def link oraComment Comment "comments
diff --git a/runtime/syntax/pamconf.vim b/runtime/syntax/pamconf.vim
index e3c8ba87fd..10d667bdf5 100644
--- a/runtime/syntax/pamconf.vim
+++ b/runtime/syntax/pamconf.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: pam(8) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2011-08-03
+" Language: pam(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2011-08-03
if exists("b:current_syntax")
diff --git a/runtime/syntax/papp.vim b/runtime/syntax/papp.vim
index d86dce603f..5b65f05cf4 100644
--- a/runtime/syntax/papp.vim
+++ b/runtime/syntax/papp.vim
@@ -14,41 +14,24 @@
" pod is, btw, allowed everywhere, which is actually wrong :(
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" source is basically xml, with included html (this is common) and perl bits
-if version < 600
- so <sfile>:p:h/xml.vim
-else
- runtime! syntax/xml.vim
-endif
+runtime! syntax/xml.vim
unlet b:current_syntax
if exists("papp_include_html")
- if version < 600
- syn include @PAppHtml <sfile>:p:h/html.vim
- else
- syn include @PAppHtml syntax/html.vim
- endif
+ syn include @PAppHtml syntax/html.vim
unlet b:current_syntax
syntax spell default " added by Bram
endif
-if version < 600
- syn include @PAppPerl <sfile>:p:h/perl.vim
-else
- syn include @PAppPerl syntax/perl.vim
-endif
+syn include @PAppPerl syntax/perl.vim
-if v:version >= 600
- syn cluster xmlFoldCluster add=papp_perl,papp_xperl,papp_phtml,papp_pxml,papp_perlPOD
-endif
+syn cluster xmlFoldCluster add=papp_perl,papp_xperl,papp_phtml,papp_pxml,papp_perlPOD
" preprocessor commands
syn region papp_prep matchgroup=papp_prep start="^#\s*\(if\|elsif\)" end="$" keepend contains=@perlExpr contained
diff --git a/runtime/syntax/pascal.vim b/runtime/syntax/pascal.vim
index d2b6060acc..2a58ee43f6 100644
--- a/runtime/syntax/pascal.vim
+++ b/runtime/syntax/pascal.vim
@@ -12,11 +12,8 @@
" Austin Ziegler <austin@halostatue.ca>,
" Markus Koenig <markus@stber-koenig.de>
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -320,52 +317,42 @@ if !exists("pascal_traditional")
endif
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_pascal_syn_inits")
- if version < 508
- let did_pascal_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
+
+hi def link pascalAcces pascalStatement
+hi def link pascalBoolean Boolean
+hi def link pascalComment Comment
+hi def link pascalConditional Conditional
+hi def link pascalConstant Constant
+hi def link pascalDelimiter Identifier
+hi def link pascalDirective pascalStatement
+hi def link pascalException Exception
+hi def link pascalFloat Float
+hi def link pascalFunction Function
+hi def link pascalLabel Label
+hi def link pascalMatrixDelimiter Identifier
+hi def link pascalModifier Type
+hi def link pascalNumber Number
+hi def link pascalOperator Operator
+hi def link pascalPredefined pascalStatement
+hi def link pascalPreProc PreProc
+hi def link pascalRepeat Repeat
+hi def link pascalSpaceError Error
+hi def link pascalStatement Statement
+hi def link pascalString String
+hi def link pascalStringEscape Special
+hi def link pascalStringEscapeGPC Special
+hi def link pascalStringError Error
+hi def link pascalStruct pascalStatement
+hi def link pascalSymbolOperator pascalOperator
+hi def link pascalTodo Todo
+hi def link pascalType Type
+hi def link pascalUnclassified pascalStatement
+" hi def link pascalAsm Assembler
+hi def link pascalError Error
+hi def link pascalAsmKey pascalStatement
+hi def link pascalShowTab Error
- HiLink pascalAcces pascalStatement
- HiLink pascalBoolean Boolean
- HiLink pascalComment Comment
- HiLink pascalConditional Conditional
- HiLink pascalConstant Constant
- HiLink pascalDelimiter Identifier
- HiLink pascalDirective pascalStatement
- HiLink pascalException Exception
- HiLink pascalFloat Float
- HiLink pascalFunction Function
- HiLink pascalLabel Label
- HiLink pascalMatrixDelimiter Identifier
- HiLink pascalModifier Type
- HiLink pascalNumber Number
- HiLink pascalOperator Operator
- HiLink pascalPredefined pascalStatement
- HiLink pascalPreProc PreProc
- HiLink pascalRepeat Repeat
- HiLink pascalSpaceError Error
- HiLink pascalStatement Statement
- HiLink pascalString String
- HiLink pascalStringEscape Special
- HiLink pascalStringEscapeGPC Special
- HiLink pascalStringError Error
- HiLink pascalStruct pascalStatement
- HiLink pascalSymbolOperator pascalOperator
- HiLink pascalTodo Todo
- HiLink pascalType Type
- HiLink pascalUnclassified pascalStatement
- " HiLink pascalAsm Assembler
- HiLink pascalError Error
- HiLink pascalAsmKey pascalStatement
- HiLink pascalShowTab Error
-
- delcommand HiLink
-endif
let b:current_syntax = "pascal"
diff --git a/runtime/syntax/passwd.vim b/runtime/syntax/passwd.vim
index cdaed58cc0..ad90202b06 100644
--- a/runtime/syntax/passwd.vim
+++ b/runtime/syntax/passwd.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: passwd(5) password file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-10-03
+" Language: passwd(5) password file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-10-03
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/pcap.vim b/runtime/syntax/pcap.vim
index 17d0d42c0b..e0eed633c1 100644
--- a/runtime/syntax/pcap.vim
+++ b/runtime/syntax/pcap.vim
@@ -4,20 +4,13 @@
" Modified by Bram
" Last Change: 2003 May 11
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
"define keywords
-if version < 600
- set isk=@,46-57,_,-,#,=,192-255
-else
- setlocal isk=@,46-57,_,-,#,=,192-255
-endif
+setlocal isk=@,46-57,_,-,#,=,192-255
"first all the bad guys
syn match pcapBad '^.\+$' "define any line as bad
@@ -43,22 +36,12 @@ syn sync minlines=50
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_pcap_syntax_inits")
- if version < 508
- let did_pcap_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink pcapBad WarningMsg
- HiLink pcapBadword WarningMsg
- HiLink pcapComment Comment
+hi def link pcapBad WarningMsg
+hi def link pcapBadword WarningMsg
+hi def link pcapComment Comment
- delcommand HiLink
-endif
let b:current_syntax = "pcap"
diff --git a/runtime/syntax/pccts.vim b/runtime/syntax/pccts.vim
index 8341f5bd43..780035798b 100644
--- a/runtime/syntax/pccts.vim
+++ b/runtime/syntax/pccts.vim
@@ -3,20 +3,13 @@
" Maintainer: Scott Bigham <dsb@killerbunnies.org>
" Last Change: 10 Aug 1999
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" Read the C++ syntax to start with
-if version < 600
- syn include @cppTopLevel <sfile>:p:h/cpp.vim
-else
- syn include @cppTopLevel syntax/cpp.vim
-endif
+syn include @cppTopLevel syntax/cpp.vim
syn region pcctsAction matchgroup=pcctsDelim start="<<" end=">>?\=" contains=@cppTopLevel,pcctsRuleRef
@@ -72,34 +65,24 @@ syn sync match pcctsSyncRule grouphere pcctsRule "\<[a-z][A-Za-z0-9_]*\>\s*\[[^]
syn sync match pcctsSyncRule grouphere pcctsRule "\<[a-z][A-Za-z0-9_]*\>\(\s*\[[^]]*\]\)\=\s*>\s*\[[^]]*\]\s*:"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_pccts_syntax_inits")
- if version < 508
- let did_pccts_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink pcctsDelim Special
- HiLink pcctsTokenName Identifier
- HiLink pcctsRuleName Statement
- HiLink pcctsLabelHack Label
- HiLink pcctsDirective PreProc
- HiLink pcctsString String
- HiLink pcctsComment Comment
- HiLink pcctsClass Statement
- HiLink pcctsClassName Identifier
- HiLink pcctsException Statement
- HiLink pcctsExceptionHandler Keyword
- HiLink pcctsExceptionRuleRef pcctsDelim
- HiLink pcctsExceptionID Identifier
- HiLink pcctsRuleRef Identifier
- HiLink pcctsSpecialChar SpecialChar
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link pcctsDelim Special
+hi def link pcctsTokenName Identifier
+hi def link pcctsRuleName Statement
+hi def link pcctsLabelHack Label
+hi def link pcctsDirective PreProc
+hi def link pcctsString String
+hi def link pcctsComment Comment
+hi def link pcctsClass Statement
+hi def link pcctsClassName Identifier
+hi def link pcctsException Statement
+hi def link pcctsExceptionHandler Keyword
+hi def link pcctsExceptionRuleRef pcctsDelim
+hi def link pcctsExceptionID Identifier
+hi def link pcctsRuleRef Identifier
+hi def link pcctsSpecialChar SpecialChar
+
let b:current_syntax = "pccts"
diff --git a/runtime/syntax/perl.vim b/runtime/syntax/perl.vim
index c09373a5cd..6ac28f6915 100644
--- a/runtime/syntax/perl.vim
+++ b/runtime/syntax/perl.vim
@@ -3,7 +3,7 @@
" Maintainer: vim-perl <vim-perl@googlegroups.com>
" Homepage: http://github.com/vim-perl/vim-perl/tree/master
" Bugs/requests: http://github.com/vim-perl/vim-perl/issues
-" Last Change: 2013-07-23
+" Last Change: 2017-09-12
" Contributors: Andy Lester <andy@petdance.com>
" Hinrik ร–rn Sigurรฐsson <hinrik.sig@gmail.com>
" Lukas Mai <l.mai.web.de>
@@ -28,8 +28,9 @@
" unlet perl_fold
" unlet perl_fold_blocks
" unlet perl_nofold_packages
-" let perl_nofold_subs = 1
+" unlet perl_nofold_subs
" unlet perl_fold_anonymous_subs
+" unlet perl_no_subprototype_error
if exists("b:current_syntax")
finish
@@ -38,11 +39,6 @@ endif
let s:cpo_save = &cpo
set cpo&vim
-if exists('&regexpengine')
- let s:regexpengine=&regexpengine
- set regexpengine=1
-endif
-
" POD starts with ^=<word> and ends with ^=cut
if !exists("perl_include_pod") || perl_include_pod == 1
@@ -83,7 +79,7 @@ syn match perlControl "\<\%(BEGIN\|CHECK\|INIT\|END\|UNITCHECK\)\>\_s*" nextgr
syn match perlStatementStorage "\<\%(my\|our\|local\|state\)\>"
syn match perlStatementControl "\<\%(return\|last\|next\|redo\|goto\|break\)\>"
-syn match perlStatementScalar "\<\%(chom\=p\|chr\|crypt\|r\=index\|lc\%(first\)\=\|length\|ord\|pack\|sprintf\|substr\|uc\%(first\)\=\)\>"
+syn match perlStatementScalar "\<\%(chom\=p\|chr\|crypt\|r\=index\|lc\%(first\)\=\|length\|ord\|pack\|sprintf\|substr\|fc\|uc\%(first\)\=\)\>"
syn match perlStatementRegexp "\<\%(pos\|quotemeta\|split\|study\)\>"
syn match perlStatementNumeric "\<\%(abs\|atan2\|cos\|exp\|hex\|int\|log\|oct\|rand\|sin\|sqrt\|srand\)\>"
syn match perlStatementList "\<\%(splice\|unshift\|shift\|push\|pop\|join\|reverse\|grep\|map\|sort\|unpack\)\>"
@@ -94,9 +90,9 @@ syn match perlStatementFiledesc "\<\%(fcntl\|flock\|ioctl\|open\%(dir\)\=\|read
syn match perlStatementVector "\<vec\>"
syn match perlStatementFiles "\<\%(ch\%(dir\|mod\|own\|root\)\|glob\|link\|mkdir\|readlink\|rename\|rmdir\|symlink\|umask\|unlink\|utime\)\>"
syn match perlStatementFiles "-[rwxoRWXOezsfdlpSbctugkTBMAC]\>"
-syn match perlStatementFlow "\<\%(caller\|die\|dump\|eval\|exit\|wantarray\)\>"
-syn match perlStatementInclude "\<\%(require\|import\)\>"
-syn match perlStatementInclude "\<\%(use\|no\)\s\+\%(\%(attributes\|attrs\|autouse\|parent\|base\|big\%(int\|num\|rat\)\|blib\|bytes\|charnames\|constant\|diagnostics\|encoding\%(::warnings\)\=\|feature\|fields\|filetest\|if\|integer\|less\|lib\|locale\|mro\|open\|ops\|overload\|re\|sigtrap\|sort\|strict\|subs\|threads\%(::shared\)\=\|utf8\|vars\|version\|vmsish\|warnings\%(::register\)\=\)\>\)\="
+syn match perlStatementFlow "\<\%(caller\|die\|dump\|eval\|exit\|wantarray\|evalbytes\)\>"
+syn match perlStatementInclude "\<\%(require\|import\|unimport\)\>"
+syn match perlStatementInclude "\<\%(use\|no\)\s\+\%(\%(attributes\|attrs\|autodie\|autouse\|parent\|base\|big\%(int\|num\|rat\)\|blib\|bytes\|charnames\|constant\|diagnostics\|encoding\%(::warnings\)\=\|feature\|fields\|filetest\|if\|integer\|less\|lib\|locale\|mro\|open\|ops\|overload\|overloading\|re\|sigtrap\|sort\|strict\|subs\|threads\%(::shared\)\=\|utf8\|vars\|version\|vmsish\|warnings\%(::register\)\=\)\>\)\="
syn match perlStatementProc "\<\%(alarm\|exec\|fork\|get\%(pgrp\|ppid\|priority\)\|kill\|pipe\|set\%(pgrp\|priority\)\|sleep\|system\|times\|wait\%(pid\)\=\)\>"
syn match perlStatementSocket "\<\%(accept\|bind\|connect\|get\%(peername\|sock\%(name\|opt\)\)\|listen\|recv\|send\|setsockopt\|shutdown\|socket\%(pair\)\=\)\>"
syn match perlStatementIPC "\<\%(msg\%(ctl\|get\|rcv\|snd\)\|sem\%(ctl\|get\|op\)\|shm\%(ctl\|get\|read\|write\)\)\>"
@@ -108,7 +104,7 @@ syn match perlStatementMisc "\<\%(warn\|format\|formline\|reset\|scalar\|protot
syn keyword perlTodo TODO TODO: TBD TBD: FIXME FIXME: XXX XXX: NOTE NOTE: contained
-syn region perlStatementIndirObjWrap matchgroup=perlStatementIndirObj start="\<\%(map\|grep\|sort\|printf\=\|say\|system\|exec\)\>\s*{" end="}" contains=@perlTop,perlBraces extend
+syn region perlStatementIndirObjWrap matchgroup=perlStatementIndirObj start="\%(\<\%(map\|grep\|sort\|printf\=\|say\|system\|exec\)\>\s*\)\@<={" end="}" transparent extend
syn match perlLabel "^\s*\h\w*\s*::\@!\%(\<v\d\+\s*:\)\@<!"
@@ -125,7 +121,7 @@ syn match perlLabel "^\s*\h\w*\s*::\@!\%(\<v\d\+\s*:\)\@<!"
" Special variables first ($^A, ...) and ($|, $', ...)
syn match perlVarPlain "$^[ACDEFHILMNOPRSTVWX]\="
syn match perlVarPlain "$[\\\"\[\]'&`+*.,;=%~!?@#$<>(-]"
-syn match perlVarPlain "%+"
+syn match perlVarPlain "@[-+]"
syn match perlVarPlain "$\%(0\|[1-9]\d*\)"
" Same as above, but avoids confusion in $::foo (equivalent to $main::foo)
syn match perlVarPlain "$::\@!"
@@ -143,41 +139,46 @@ syn match perlPackageRef "[$@#%*&]\%(\%(::\|'\)\=\I\i*\%(\%(::\|'\)\I\i*\)*\)\
" just set the variable "perl_no_extended_vars"...
if !exists("perl_no_scope_in_variables")
- syn match perlVarPlain "\%([@$]\|\$#\)\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod
- syn match perlVarPlain2 "%\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef
- syn match perlFunctionName "&\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod
+ syn match perlVarPlain "\%([@$]\|\$#\)\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref
+ syn match perlVarPlain2 "%\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref
+ syn match perlFunctionName "&\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref
else
- syn match perlVarPlain "\%([@$]\|\$#\)\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod
- syn match perlVarPlain2 "%\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)"
- syn match perlFunctionName "&\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod
+ syn match perlVarPlain "\%([@$]\|\$#\)\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref
+ syn match perlVarPlain2 "%\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref
+ syn match perlFunctionName "&\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref
endif
+syn match perlVarPlain2 "%[-+]"
+
if !exists("perl_no_extended_vars")
syn cluster perlExpr contains=perlStatementIndirObjWrap,perlStatementScalar,perlStatementRegexp,perlStatementNumeric,perlStatementList,perlStatementHash,perlStatementFiles,perlStatementTime,perlStatementMisc,perlVarPlain,perlVarPlain2,perlVarNotInMatches,perlVarSlash,perlVarBlock,perlVarBlock2,perlShellCommand,perlFloat,perlNumber,perlStringUnexpanded,perlString,perlQQ,perlArrow,perlBraces
- syn region perlArrow matchgroup=perlArrow start="->\s*(" end=")" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod contained
- syn region perlArrow matchgroup=perlArrow start="->\s*\[" end="\]" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod contained
- syn region perlArrow matchgroup=perlArrow start="->\s*{" end="}" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod contained
- syn match perlArrow "->\s*{\s*\I\i*\s*}" contains=perlVarSimpleMemberName nextgroup=perlVarMember,perlVarSimpleMember,perlMethod contained
- syn region perlArrow matchgroup=perlArrow start="->\s*\$*\I\i*\s*(" end=")" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod contained
- syn region perlVarBlock matchgroup=perlVarPlain start="\%($#\|[$@]\)\$*{" skip="\\}" end=+}\|\%(\%(<<\%('\|"\)\?\)\@=\)+ contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod extend
- syn region perlVarBlock2 matchgroup=perlVarPlain start="[%&*]\$*{" skip="\\}" end=+}\|\%(\%(<<\%('\|"\)\?\)\@=\)+ contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod extend
- syn match perlVarPlain2 "[%&*]\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod extend
- syn match perlVarPlain "\%(\$#\|[@$]\)\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod extend
- syn region perlVarMember matchgroup=perlVarPlain start="\%(->\)\={" skip="\\}" end="}" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod extend
- syn match perlVarSimpleMember "\%(->\)\={\s*\I\i*\s*}" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod contains=perlVarSimpleMemberName contained extend
+ syn region perlArrow matchgroup=perlArrow start="->\s*(" end=")" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref contained
+ syn region perlArrow matchgroup=perlArrow start="->\s*\[" end="\]" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref contained
+ syn region perlArrow matchgroup=perlArrow start="->\s*{" end="}" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref contained
+ syn match perlArrow "->\s*{\s*\I\i*\s*}" contains=perlVarSimpleMemberName nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref contained
+ syn region perlArrow matchgroup=perlArrow start="->\s*\$*\I\i*\s*(" end=")" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref contained
+ syn region perlVarBlock matchgroup=perlVarPlain start="\%($#\|[$@]\)\$*{" skip="\\}" end=+}\|\%(\%(<<\%('\|"\)\?\)\@=\)+ contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref extend
+ syn region perlVarBlock2 matchgroup=perlVarPlain start="[%&*]\$*{" skip="\\}" end=+}\|\%(\%(<<\%('\|"\)\?\)\@=\)+ contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref extend
+ syn match perlVarPlain2 "[%&*]\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref extend
+ syn match perlVarPlain "\%(\$#\|[@$]\)\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref extend
+ syn region perlVarMember matchgroup=perlVarPlain start="\%(->\)\={" skip="\\}" end="}" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref extend
+ syn match perlVarSimpleMember "\%(->\)\={\s*\I\i*\s*}" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref contains=perlVarSimpleMemberName contained extend
syn match perlVarSimpleMemberName "\I\i*" contained
- syn region perlVarMember matchgroup=perlVarPlain start="\%(->\)\=\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod extend
- syn match perlPackageConst "__PACKAGE__" nextgroup=perlMethod
- syn match perlMethod "->\$*\I\i*" contained nextgroup=perlVarSimpleMember,perlVarMember,perlMethod
+ syn region perlVarMember matchgroup=perlVarPlain start="\%(->\)\=\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref extend
+ syn match perlPackageConst "__PACKAGE__" nextgroup=perlMethod,perlPostDeref
+ syn match perlMethod "->\$*\I\i*" contained nextgroup=perlVarSimpleMember,perlVarMember,perlMethod,perlPostDeref
+ syn match perlPostDeref "->\%($#\|[$@%&*]\)\*" contained nextgroup=perlVarSimpleMember,perlVarMember,perlMethod,perlPostDeref
+ syn region perlPostDeref start="->\%($#\|[$@%&*]\)\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarSimpleMember,perlVarMember,perlMethod,perlPostDeref
+ syn region perlPostDeref matchgroup=perlPostDeref start="->\%($#\|[$@%&*]\){" skip="\\}" end="}" contained contains=@perlExpr nextgroup=perlVarSimpleMember,perlVarMember,perlMethod,perlPostDeref
endif
" File Descriptors
syn match perlFiledescRead "<\h\w*>"
-syn match perlFiledescStatementComma "(\=\s*\u\w*\s*,"me=e-1 transparent contained contains=perlFiledescStatement
-syn match perlFiledescStatementNocomma "(\=\s*\u\w*\s*[^, \t]"me=e-1 transparent contained contains=perlFiledescStatement
+syn match perlFiledescStatementComma "(\=\s*\<\u\w*\>\s*,"me=e-1 transparent contained contains=perlFiledescStatement
+syn match perlFiledescStatementNocomma "(\=\s*\<\u\w*\>\s*[^, \t]"me=e-1 transparent contained contains=perlFiledescStatement
-syn match perlFiledescStatement "\u\w*" contained
+syn match perlFiledescStatement "\<\u\w*\>" contained
" Special characters in strings and matches
syn match perlSpecialString "\\\%(\o\{1,3}\|x\%({\x\+}\|\x\{1,2}\)\|c.\|[^cx]\)" contained extend
@@ -241,20 +242,18 @@ syn region perlAnglesDQ start=+<+ end=+>+ extend contained contains=perlAnglesD
" Simple version of searches and matches
-syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\>\s*\z([^[:space:]'([{<#]\)+ end=+\z1[msixpodualgc]*+ contains=@perlInterpMatch keepend extend
-syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m#+ end=+#[msixpodualgc]*+ contains=@perlInterpMatch keepend extend
-syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*'+ end=+'[msixpodualgc]*+ contains=@perlInterpSQ keepend extend
-syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*/+ end=+/[msixpodualgc]*+ contains=@perlInterpSlash keepend extend
-syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*(+ end=+)[msixpodualgc]*+ contains=@perlInterpMatch,perlParensDQ keepend extend
-
-" A special case for m{}, m<> and m[] which allows for comments and extra whitespace in the pattern
-syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*{+ end=+}[msixpodualgc]*+ contains=@perlInterpMatch,perlComment,perlBracesDQ extend
-syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*<+ end=+>[msixpodualgc]*+ contains=@perlInterpMatch,perlAnglesDQ keepend extend
-syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*\[+ end=+\][msixpodualgc]*+ contains=@perlInterpMatch,perlComment,perlBracketsDQ keepend extend
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\>\s*\z([^[:space:]'([{<#]\)+ end=+\z1[msixpodualgcn]*+ contains=@perlInterpMatch keepend extend
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m#+ end=+#[msixpodualgcn]*+ contains=@perlInterpMatch keepend extend
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*'+ end=+'[msixpodualgcn]*+ contains=@perlInterpSQ keepend extend
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*/+ end=+/[msixpodualgcn]*+ contains=@perlInterpSlash keepend extend
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*(+ end=+)[msixpodualgcn]*+ contains=@perlInterpMatch,perlParensDQ keepend extend
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*{+ end=+}[msixpodualgcn]*+ contains=@perlInterpMatch,perlBracesDQ extend
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*<+ end=+>[msixpodualgcn]*+ contains=@perlInterpMatch,perlAnglesDQ keepend extend
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*\[+ end=+\][msixpodualgcn]*+ contains=@perlInterpMatch,perlBracketsDQ keepend extend
" Below some hacks to recognise the // variant. This is virtually impossible to catch in all
" cases as the / is used in so many other ways, but these should be the most obvious ones.
-syn region perlMatch matchgroup=perlMatchStartEnd start="\%([$@%&*]\@<!\%(\<split\|\<while\|\<if\|\<unless\|\.\.\|[-+*!~(\[{=]\)\s*\)\@<=/\%(/=\)\@!" start=+^/\%(/=\)\@!+ start=+\s\@<=/\%(/=\)\@![^[:space:][:digit:]$@%=]\@=\%(/\_s*\%([([{$@%&*[:digit:]"'`]\|\_s\w\|[[:upper:]_abd-fhjklnqrt-wyz]\)\)\@!+ skip=+\\/+ end=+/[msixpodualgc]*+ contains=@perlInterpSlash extend
+syn region perlMatch matchgroup=perlMatchStartEnd start="\%([$@%&*]\@<!\%(\<split\|\<while\|\<if\|\<unless\|\.\.\|[-+*!~(\[{=]\)\s*\)\@<=/\%(/=\)\@!" start=+^/\%(/=\)\@!+ start=+\s\@<=/\%(/=\)\@![^[:space:][:digit:]$@%=]\@=\%(/\_s*\%([([{$@%&*[:digit:]"'`]\|\_s\w\|[[:upper:]_abd-fhjklnqrt-wyz]\)\)\@!+ skip=+\\/+ end=+/[msixpodualgcn]*+ contains=@perlInterpSlash extend
" Substitutions
@@ -267,12 +266,12 @@ syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s
syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*<+ end=+>+ contains=@perlInterpMatch,perlAnglesDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*\[+ end=+\]+ contains=@perlInterpMatch,perlBracketsDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*{+ end=+}+ contains=@perlInterpMatch,perlBracesDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
-syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+\z([^[:space:]'([{<]\)+ end=+\z1[msixpodualgcer]*+ keepend contained contains=@perlInterpDQ extend
-syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+(+ end=+)[msixpodualgcer]*+ contained contains=@perlInterpDQ,perlParensDQ keepend extend
-syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+\[+ end=+\][msixpodualgcer]*+ contained contains=@perlInterpDQ,perlBracketsDQ keepend extend
-syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+{+ end=+}[msixpodualgcer]*+ contained contains=@perlInterpDQ,perlBracesDQ keepend extend extend
-syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+<+ end=+>[msixpodualgcer]*+ contained contains=@perlInterpDQ,perlAnglesDQ keepend extend
-syn region perlSubstitutionSQ matchgroup=perlMatchStartEnd start=+'+ end=+'[msixpodualgcer]*+ contained contains=@perlInterpSQ keepend extend
+syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+\z([^[:space:]'([{<]\)+ end=+\z1[msixpodualgcern]*+ keepend contained contains=@perlInterpDQ extend
+syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+(+ end=+)[msixpodualgcern]*+ contained contains=@perlInterpDQ,perlParensDQ keepend extend
+syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+\[+ end=+\][msixpodualgcern]*+ contained contains=@perlInterpDQ,perlBracketsDQ keepend extend
+syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+{+ end=+}[msixpodualgcern]*+ contained contains=@perlInterpDQ,perlBracesDQ keepend extend extend
+syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+<+ end=+>[msixpodualgcern]*+ contained contains=@perlInterpDQ,perlAnglesDQ keepend extend
+syn region perlSubstitutionSQ matchgroup=perlMatchStartEnd start=+'+ end=+'[msixpodualgcern]*+ contained contains=@perlInterpSQ keepend extend
" Translations
" perlMatch is the first part, perlTranslation* is the second, translator part.
@@ -314,35 +313,40 @@ syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s
syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*{+ end=+}+ contains=@perlInterpSQ,perlBracesSQ keepend extend
syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*<+ end=+>+ contains=@perlInterpSQ,perlAnglesSQ keepend extend
-syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\>\s*\z([^[:space:]#([{<'/]\)+ end=+\z1[imosx]*+ contains=@perlInterpMatch keepend extend
-syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*/+ end=+/[imosx]*+ contains=@perlInterpSlash keepend extend
-syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr#+ end=+#[imosx]*+ contains=@perlInterpMatch keepend extend
-syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*'+ end=+'[imosx]*+ contains=@perlInterpSQ keepend extend
-syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*(+ end=+)[imosx]*+ contains=@perlInterpMatch,perlParensDQ keepend extend
+syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\>\s*\z([^[:space:]#([{<'/]\)+ end=+\z1[imosxdual]*+ contains=@perlInterpMatch keepend extend
+syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*/+ end=+/[imosxdual]*+ contains=@perlInterpSlash keepend extend
+syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr#+ end=+#[imosxdual]*+ contains=@perlInterpMatch keepend extend
+syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*'+ end=+'[imosxdual]*+ contains=@perlInterpSQ keepend extend
+syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*(+ end=+)[imosxdual]*+ contains=@perlInterpMatch,perlParensDQ keepend extend
" A special case for qr{}, qr<> and qr[] which allows for comments and extra whitespace in the pattern
-syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*{+ end=+}[imosx]*+ contains=@perlInterpMatch,perlBracesDQ,perlComment keepend extend
-syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*<+ end=+>[imosx]*+ contains=@perlInterpMatch,perlAnglesDQ,perlComment keepend extend
-syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*\[+ end=+\][imosx]*+ contains=@perlInterpMatch,perlBracketsDQ,perlComment keepend extend
+syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*{+ end=+}[imosxdual]*+ contains=@perlInterpMatch,perlBracesDQ,perlComment keepend extend
+syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*<+ end=+>[imosxdual]*+ contains=@perlInterpMatch,perlAnglesDQ,perlComment keepend extend
+syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*\[+ end=+\][imosxdual]*+ contains=@perlInterpMatch,perlBracketsDQ,perlComment keepend extend
" Constructs such as print <<EOF [...] EOF, 'here' documents
"
" XXX Any statements after the identifier are in perlString colour (i.e.
" 'if $a' in 'print <<EOF if $a'). This is almost impossible to get right it
" seems due to the 'auto-extending nature' of regions.
+syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\z(\I\i*\)+ end=+$+ contains=@perlTop oneline
+syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ end=+$+ contains=@perlTop oneline
+syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ end=+$+ contains=@perlTop oneline
+syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\s*""+ end=+$+ contains=@perlTop oneline
+syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\s*''+ end=+$+ contains=@perlTop oneline
if exists("perl_fold")
- syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\z(\I\i*\).*+ end=+^\z1$+ contains=@perlInterpDQ fold extend
- syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ end=+^\z1$+ contains=@perlInterpDQ fold extend
- syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ end=+^\z1$+ contains=@perlInterpSQ fold extend
- syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*""+ end=+^$+ contains=@perlInterpDQ,perlNotEmptyLine fold extend
- syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*''+ end=+^$+ contains=@perlInterpSQ,perlNotEmptyLine fold extend
+ syn region perlHereDoc start=+<<\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ fold extend
+ syn region perlHereDoc start=+<<\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ fold extend
+ syn region perlHereDoc start=+<<\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpSQ fold extend
+ syn region perlHereDoc start=+<<\s*""+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine fold extend
+ syn region perlHereDoc start=+<<\s*''+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpSQ,perlNotEmptyLine fold extend
syn region perlAutoload matchgroup=perlStringStartEnd start=+<<\s*\(['"]\=\)\z(END_\%(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)\1+ end=+^\z1$+ contains=ALL fold extend
else
- syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\z(\I\i*\).*+ end=+^\z1$+ contains=@perlInterpDQ
- syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ end=+^\z1$+ contains=@perlInterpDQ
- syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ end=+^\z1$+ contains=@perlInterpSQ
- syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*""+ end=+^$+ contains=@perlInterpDQ,perlNotEmptyLine
- syn region perlHereDoc matchgroup=perlStringStartEnd start=+<<\s*''+ end=+^$+ contains=@perlInterpSQ,perlNotEmptyLine
+ syn region perlHereDoc start=+<<\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ
+ syn region perlHereDoc start=+<<\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ
+ syn region perlHereDoc start=+<<\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpSQ
+ syn region perlHereDoc start=+<<\s*""+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine
+ syn region perlHereDoc start=+<<\s*''+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpSQ,perlNotEmptyLine
syn region perlAutoload matchgroup=perlStringStartEnd start=+<<\s*\(['"]\=\)\z(END_\%(SUB\|OF_FUNC\|OF_AUTOLOAD\)\)\1+ end=+^\z1$+ contains=ALL
endif
@@ -356,27 +360,21 @@ syn keyword perlStatementPackage package contained
" sub [name] [(prototype)] {
"
syn match perlSubError "[^[:space:];{#]" contained
-if v:version == 701 && !has('patch221') " XXX I hope that's the right one
- syn match perlSubAttributes ":" contained
+syn match perlSubAttributesCont "\h\w*\_s*\%(:\_s*\)\=" nextgroup=@perlSubAttrMaybe contained
+syn region perlSubAttributesCont matchgroup=perlSubAttributesCont start="\h\w*(" end=")\_s*\%(:\_s*\)\=" nextgroup=@perlSubAttrMaybe contained contains=@perlInterpSQ,perlParensSQ
+syn cluster perlSubAttrMaybe contains=perlSubAttributesCont,perlSubError,perlFakeGroup
+syn match perlSubAttributes "" contained nextgroup=perlSubError
+syn match perlSubAttributes ":\_s*" contained nextgroup=@perlSubAttrMaybe
+if get(g:, "perl_sub_signatures", 0)
+ syn match perlSignature +(\_[^)]*)\_s*+ nextgroup=perlSubAttributes,perlComment contained
else
- syn match perlSubAttributesCont "\h\w*\_s*\%(:\_s*\)\=" nextgroup=@perlSubAttrMaybe contained
- syn region perlSubAttributesCont matchgroup=perlSubAttributesCont start="\h\w*(" end=")\_s*\%(:\_s*\)\=" nextgroup=@perlSubAttrMaybe contained contains=@perlInterpSQ,perlParensSQ
- syn cluster perlSubAttrMaybe contains=perlSubAttributesCont,perlSubError,perlFakeGroup
- syn match perlSubAttributes "" contained nextgroup=perlSubError
- syn match perlSubAttributes ":\_s*" contained nextgroup=@perlSubAttrMaybe
+ syn match perlSubPrototypeError "(\%(\_s*\%(\%(\\\%([$@%&*]\|\[[$@%&*]\+\]\)\|[$&*]\|[@%]\%(\_s*)\)\@=\|;\%(\_s*[)$@%&*\\]\)\@=\|_\%(\_s*[);]\)\@=\)\_s*\)*\)\@>\zs\_[^)]\+" contained
+ syn match perlSubPrototype +(\_[^)]*)\_s*+ nextgroup=perlSubAttributes,perlComment contained contains=perlSubPrototypeError
endif
-syn match perlSubPrototypeError "(\%(\_s*\%(\%(\\\%([$@%&*]\|\[[$@%&*]\+\]\)\|[$&*]\|[@%]\%(\_s*)\)\@=\|;\%(\_s*[)$@%&*\\]\)\@=\|_\%(\_s*[);]\)\@=\)\_s*\)*\)\@>\zs\_[^)]\+" contained
-syn match perlSubPrototype +(\_[^)]*)\_s*\|+ nextgroup=perlSubAttributes,perlComment contained contains=perlSubPrototypeError
-syn match perlSubName +\%(\h\|::\|'\w\)\%(\w\|::\|'\w\)*\_s*\|+ contained nextgroup=perlSubPrototype,perlComment
-syn match perlFunction +\<sub\>\_s*+ nextgroup=perlSubName
+syn match perlSubName +\%(\h\|::\|'\w\)\%(\w\|::\|'\w\)*\_s*\|+ contained nextgroup=perlSubPrototype,perlSignature,perlSubAttributes,perlComment
-if !exists("perl_no_scope_in_variables")
- syn match perlFunctionPRef "\h\w*::" contained
- syn match perlFunctionName "\h\w*[^:]" contained
-else
- syn match perlFunctionName "\h[[:alnum:]_:]*" contained
-endif
+syn match perlFunction +\<sub\>\_s*+ nextgroup=perlSubName
" The => operator forces a bareword to the left of it to be interpreted as
" a string
@@ -397,10 +395,10 @@ syn match perlFormatField "@$" contained
" __END__ and __DATA__ clauses
if exists("perl_fold")
- syntax region perlDATA start="^__DATA__$" skip="." end="." fold
+ syntax region perlDATA start="^__DATA__$" skip="." end="." contains=@perlDATA fold
syntax region perlDATA start="^__END__$" skip="." end="." contains=perlPOD,@perlDATA fold
else
- syntax region perlDATA start="^__DATA__$" skip="." end="."
+ syntax region perlDATA start="^__DATA__$" skip="." end="." contains=@perlDATA
syntax region perlDATA start="^__END__$" skip="." end="." contains=perlPOD,@perlDATA
endif
@@ -414,9 +412,9 @@ if exists("perl_fold")
syn region perlPackageFold start="^package \S\+;\s*\%(#.*\)\=$" end="^1;\=\s*\%(#.*\)\=$" end="\n\+package"me=s-1 transparent fold keepend
endif
if !exists("perl_nofold_subs")
- if exists("perl_fold_anonymous_subs") && perl_fold_anonymous_subs
- syn region perlSubFold start="\<sub\>[^\n;]*{" end="}" transparent fold keepend extend
- syn region perlSubFold start="\<\%(BEGIN\|END\|CHECK\|INIT\)\>\s*{" end="}" transparent fold keepend
+ if get(g:, "perl_fold_anonymous_subs", 0)
+ syn region perlSubFold start="\<sub\>[^{]*{" end="}" transparent fold keepend extend
+ syn region perlSubFold start="\<\%(BEGIN\|END\|CHECK\|INIT\)\>\s*{" end="}" transparent fold keepend
else
syn region perlSubFold start="^\z(\s*\)\<sub\>.*[^};]$" end="^\z1}\s*\%(#.*\)\=$" transparent fold keepend
syn region perlSubFold start="^\z(\s*\)\<\%(BEGIN\|END\|CHECK\|INIT\|UNITCHECK\)\>.*[^};]$" end="^\z1}\s*$" transparent fold keepend
@@ -424,7 +422,7 @@ if exists("perl_fold")
endif
if exists("perl_fold_blocks")
- syn region perlBlockFold start="^\z(\s*\)\%(if\|elsif\|unless\|for\|while\|until\|given\)\s*(.*)\%(\s*{\)\=\s*\%(#.*\)\=$" start="^\z(\s*\)foreach\s*\%(\%(my\|our\)\=\s*\S\+\s*\)\=(.*)\%(\s*{\)\=\s*\%(#.*\)\=$" end="^\z1}\s*;\=\%(#.*\)\=$" transparent fold keepend
+ syn region perlBlockFold start="^\z(\s*\)\%(if\|elsif\|unless\|for\|while\|until\|given\)\s*(.*)\%(\s*{\)\=\s*\%(#.*\)\=$" start="^\z(\s*\)for\%(each\)\=\s*\%(\%(my\|our\)\=\s*\S\+\s*\)\=(.*)\%(\s*{\)\=\s*\%(#.*\)\=$" end="^\z1}\s*;\=\%(#.*\)\=$" transparent fold keepend
syn region perlBlockFold start="^\z(\s*\)\%(do\|else\)\%(\s*{\)\=\s*\%(#.*\)\=$" end="^\z1}\s*while" end="^\z1}\s*;\=\%(#.*\)\=$" transparent fold keepend
endif
@@ -435,121 +433,121 @@ else
syn sync minlines=0
endif
-command -nargs=+ HiLink hi def link <args>
-
" NOTE: If you're linking new highlight groups to perlString, please also put
" them into b:match_skip in ftplugin/perl.vim.
" The default highlighting.
-HiLink perlSharpBang PreProc
-HiLink perlControl PreProc
-HiLink perlInclude Include
-HiLink perlSpecial Special
-HiLink perlString String
-HiLink perlCharacter Character
-HiLink perlNumber Number
-HiLink perlFloat Float
-HiLink perlType Type
-HiLink perlIdentifier Identifier
-HiLink perlLabel Label
-HiLink perlStatement Statement
-HiLink perlConditional Conditional
-HiLink perlRepeat Repeat
-HiLink perlOperator Operator
-HiLink perlFunction Keyword
-HiLink perlSubName Function
-HiLink perlSubPrototype Type
-HiLink perlSubAttributes PreProc
-HiLink perlSubAttributesCont perlSubAttributes
-HiLink perlComment Comment
-HiLink perlTodo Todo
+hi def link perlSharpBang PreProc
+hi def link perlControl PreProc
+hi def link perlInclude Include
+hi def link perlSpecial Special
+hi def link perlString String
+hi def link perlCharacter Character
+hi def link perlNumber Number
+hi def link perlFloat Float
+hi def link perlType Type
+hi def link perlIdentifier Identifier
+hi def link perlLabel Label
+hi def link perlStatement Statement
+hi def link perlConditional Conditional
+hi def link perlRepeat Repeat
+hi def link perlOperator Operator
+hi def link perlFunction Keyword
+hi def link perlSubName Function
+hi def link perlSubPrototype Type
+hi def link perlSignature Type
+hi def link perlSubAttributes PreProc
+hi def link perlSubAttributesCont perlSubAttributes
+hi def link perlComment Comment
+hi def link perlTodo Todo
if exists("perl_string_as_statement")
- HiLink perlStringStartEnd perlStatement
+ hi def link perlStringStartEnd perlStatement
else
- HiLink perlStringStartEnd perlString
+ hi def link perlStringStartEnd perlString
+endif
+hi def link perlVStringV perlStringStartEnd
+hi def link perlList perlStatement
+hi def link perlMisc perlStatement
+hi def link perlVarPlain perlIdentifier
+hi def link perlVarPlain2 perlIdentifier
+hi def link perlArrow perlIdentifier
+hi def link perlFiledescRead perlIdentifier
+hi def link perlFiledescStatement perlIdentifier
+hi def link perlVarSimpleMember perlIdentifier
+hi def link perlVarSimpleMemberName perlString
+hi def link perlVarNotInMatches perlIdentifier
+hi def link perlVarSlash perlIdentifier
+hi def link perlQQ perlString
+hi def link perlHereDoc perlString
+hi def link perlStringUnexpanded perlString
+hi def link perlSubstitutionSQ perlString
+hi def link perlSubstitutionGQQ perlString
+hi def link perlTranslationGQ perlString
+hi def link perlMatch perlString
+hi def link perlMatchStartEnd perlStatement
+hi def link perlFormatName perlIdentifier
+hi def link perlFormatField perlString
+hi def link perlPackageDecl perlType
+hi def link perlStorageClass perlType
+hi def link perlPackageRef perlType
+hi def link perlStatementPackage perlStatement
+hi def link perlStatementStorage perlStatement
+hi def link perlStatementControl perlStatement
+hi def link perlStatementScalar perlStatement
+hi def link perlStatementRegexp perlStatement
+hi def link perlStatementNumeric perlStatement
+hi def link perlStatementList perlStatement
+hi def link perlStatementHash perlStatement
+hi def link perlStatementIOfunc perlStatement
+hi def link perlStatementFiledesc perlStatement
+hi def link perlStatementVector perlStatement
+hi def link perlStatementFiles perlStatement
+hi def link perlStatementFlow perlStatement
+hi def link perlStatementInclude perlStatement
+hi def link perlStatementProc perlStatement
+hi def link perlStatementSocket perlStatement
+hi def link perlStatementIPC perlStatement
+hi def link perlStatementNetwork perlStatement
+hi def link perlStatementPword perlStatement
+hi def link perlStatementTime perlStatement
+hi def link perlStatementMisc perlStatement
+hi def link perlStatementIndirObj perlStatement
+hi def link perlFunctionName perlIdentifier
+hi def link perlMethod perlIdentifier
+hi def link perlPostDeref perlIdentifier
+hi def link perlFunctionPRef perlType
+if !get(g:, 'perl_include_pod', 1)
+ hi def link perlPOD perlComment
endif
-HiLink perlVStringV perlStringStartEnd
-HiLink perlList perlStatement
-HiLink perlMisc perlStatement
-HiLink perlVarPlain perlIdentifier
-HiLink perlVarPlain2 perlIdentifier
-HiLink perlArrow perlIdentifier
-HiLink perlFiledescRead perlIdentifier
-HiLink perlFiledescStatement perlIdentifier
-HiLink perlVarSimpleMember perlIdentifier
-HiLink perlVarSimpleMemberName perlString
-HiLink perlVarNotInMatches perlIdentifier
-HiLink perlVarSlash perlIdentifier
-HiLink perlQQ perlString
-HiLink perlHereDoc perlString
-HiLink perlStringUnexpanded perlString
-HiLink perlSubstitutionSQ perlString
-HiLink perlSubstitutionGQQ perlString
-HiLink perlTranslationGQ perlString
-HiLink perlMatch perlString
-HiLink perlMatchStartEnd perlStatement
-HiLink perlFormatName perlIdentifier
-HiLink perlFormatField perlString
-HiLink perlPackageDecl perlType
-HiLink perlStorageClass perlType
-HiLink perlPackageRef perlType
-HiLink perlStatementPackage perlStatement
-HiLink perlStatementStorage perlStatement
-HiLink perlStatementControl perlStatement
-HiLink perlStatementScalar perlStatement
-HiLink perlStatementRegexp perlStatement
-HiLink perlStatementNumeric perlStatement
-HiLink perlStatementList perlStatement
-HiLink perlStatementHash perlStatement
-HiLink perlStatementIOfunc perlStatement
-HiLink perlStatementFiledesc perlStatement
-HiLink perlStatementVector perlStatement
-HiLink perlStatementFiles perlStatement
-HiLink perlStatementFlow perlStatement
-HiLink perlStatementInclude perlStatement
-HiLink perlStatementProc perlStatement
-HiLink perlStatementSocket perlStatement
-HiLink perlStatementIPC perlStatement
-HiLink perlStatementNetwork perlStatement
-HiLink perlStatementPword perlStatement
-HiLink perlStatementTime perlStatement
-HiLink perlStatementMisc perlStatement
-HiLink perlStatementIndirObj perlStatement
-HiLink perlFunctionName perlIdentifier
-HiLink perlMethod perlIdentifier
-HiLink perlFunctionPRef perlType
-HiLink perlPOD perlComment
-HiLink perlShellCommand perlString
-HiLink perlSpecialAscii perlSpecial
-HiLink perlSpecialDollar perlSpecial
-HiLink perlSpecialString perlSpecial
-HiLink perlSpecialStringU perlSpecial
-HiLink perlSpecialMatch perlSpecial
-HiLink perlDATA perlComment
+hi def link perlShellCommand perlString
+hi def link perlSpecialAscii perlSpecial
+hi def link perlSpecialDollar perlSpecial
+hi def link perlSpecialString perlSpecial
+hi def link perlSpecialStringU perlSpecial
+hi def link perlSpecialMatch perlSpecial
+hi def link perlDATA perlComment
" NOTE: Due to a bug in Vim (or more likely, a misunderstanding on my part),
" I had to remove the transparent property from the following regions
" in order to get them to highlight correctly. Feel free to remove
" these and reinstate the transparent property if you know how.
-HiLink perlParensSQ perlString
-HiLink perlBracketsSQ perlString
-HiLink perlBracesSQ perlString
-HiLink perlAnglesSQ perlString
+hi def link perlParensSQ perlString
+hi def link perlBracketsSQ perlString
+hi def link perlBracesSQ perlString
+hi def link perlAnglesSQ perlString
-HiLink perlParensDQ perlString
-HiLink perlBracketsDQ perlString
-HiLink perlBracesDQ perlString
-HiLink perlAnglesDQ perlString
+hi def link perlParensDQ perlString
+hi def link perlBracketsDQ perlString
+hi def link perlBracesDQ perlString
+hi def link perlAnglesDQ perlString
-HiLink perlSpecialStringU2 perlString
+hi def link perlSpecialStringU2 perlString
" Possible errors
-HiLink perlNotEmptyLine Error
-HiLink perlElseIfError Error
-HiLink perlSubPrototypeError Error
-HiLink perlSubError Error
-
-delcommand HiLink
+hi def link perlNotEmptyLine Error
+hi def link perlElseIfError Error
+hi def link perlSubPrototypeError Error
+hi def link perlSubError Error
" Syncing to speed up processing
"
@@ -577,11 +575,6 @@ syn sync match perlSyncPOD grouphere NONE "^=cut"
let b:current_syntax = "perl"
-if exists('&regexpengine')
- let &regexpengine=s:regexpengine
- unlet s:regexpengine
-endif
-
let &cpo = s:cpo_save
unlet s:cpo_save
diff --git a/runtime/syntax/perl6.vim b/runtime/syntax/perl6.vim
index 3d82ced89f..3bcd9ff0e9 100644
--- a/runtime/syntax/perl6.vim
+++ b/runtime/syntax/perl6.vim
@@ -61,11 +61,8 @@
" unlet perl6_extended_q
" unlet perl6_extended_all
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
let s:keepcpo= &cpo
@@ -2063,176 +2060,166 @@ syn region p6PodFormatFrench
\ contains=p6PodFormatAnglesFrench,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodVerticalBar,p6PodSemiColon,p6PodComma
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_perl6_syntax_inits")
- if version < 508
- let did_perl6_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
+
+hi def link p6EscOctOld p6Error
+hi def link p6PackageTwigil p6Twigil
+hi def link p6StringAngle p6String
+hi def link p6StringFrench p6String
+hi def link p6StringAngles p6String
+hi def link p6StringSQ p6String
+hi def link p6StringDQ p6String
+hi def link p6StringQ p6String
+hi def link p6RxStringSQ p6String
+hi def link p6RxStringDQ p6String
+hi def link p6Substitution p6String
+hi def link p6Transliteration p6String
+hi def link p6StringAuto p6String
+hi def link p6StringP5Auto p6String
+hi def link p6Key p6String
+hi def link p6Match p6String
+hi def link p6RegexBlock p6String
+hi def link p6RxP5CharClass p6String
+hi def link p6RxP5QuoteMeta p6String
+hi def link p6RxCharClass p6String
+hi def link p6RxQuoteWords p6String
+hi def link p6ReduceOp p6Operator
+hi def link p6ReverseCrossOp p6Operator
+hi def link p6HyperOp p6Operator
+hi def link p6QuoteQ p6Operator
+hi def link p6RxRange p6StringSpecial
+hi def link p6RxAnchor p6StringSpecial
+hi def link p6RxP5Anchor p6StringSpecial
+hi def link p6CodePoint p6StringSpecial
+hi def link p6RxMeta p6StringSpecial
+hi def link p6RxP5Range p6StringSpecial
+hi def link p6RxP5CPId p6StringSpecial
+hi def link p6RxP5Posix p6StringSpecial
+hi def link p6RxP5Mod p6StringSpecial
+hi def link p6RxP5HexSeq p6StringSpecial
+hi def link p6RxP5OctSeq p6StringSpecial
+hi def link p6RxP5WriteRefId p6StringSpecial
+hi def link p6HexSequence p6StringSpecial
+hi def link p6OctSequence p6StringSpecial
+hi def link p6RxP5Named p6StringSpecial
+hi def link p6RxP5PropId p6StringSpecial
+hi def link p6RxP5Quantifier p6StringSpecial
+hi def link p6RxP5CountId p6StringSpecial
+hi def link p6RxP5Verb p6StringSpecial
+hi def link p6Escape p6StringSpecial2
+hi def link p6EscNull p6StringSpecial2
+hi def link p6EscHash p6StringSpecial2
+hi def link p6EscQQ p6StringSpecial2
+hi def link p6EscQuote p6StringSpecial2
+hi def link p6EscDoubleQuote p6StringSpecial2
+hi def link p6EscBackTick p6StringSpecial2
+hi def link p6EscForwardSlash p6StringSpecial2
+hi def link p6EscVerticalBar p6StringSpecial2
+hi def link p6EscExclamation p6StringSpecial2
+hi def link p6EscDollar p6StringSpecial2
+hi def link p6EscOpenCurly p6StringSpecial2
+hi def link p6EscCloseCurly p6StringSpecial2
+hi def link p6EscCloseBracket p6StringSpecial2
+hi def link p6EscCloseAngle p6StringSpecial2
+hi def link p6EscCloseFrench p6StringSpecial2
+hi def link p6EscBackSlash p6StringSpecial2
+hi def link p6RxEscape p6StringSpecial2
+hi def link p6RxCapture p6StringSpecial2
+hi def link p6RxAlternation p6StringSpecial2
+hi def link p6RxP5 p6StringSpecial2
+hi def link p6RxP5ReadRef p6StringSpecial2
+hi def link p6RxP5Oct p6StringSpecial2
+hi def link p6RxP5Hex p6StringSpecial2
+hi def link p6RxP5EscMeta p6StringSpecial2
+hi def link p6RxP5Meta p6StringSpecial2
+hi def link p6RxP5Escape p6StringSpecial2
+hi def link p6RxP5CodePoint p6StringSpecial2
+hi def link p6RxP5WriteRef p6StringSpecial2
+hi def link p6RxP5Prop p6StringSpecial2
+
+hi def link p6Property Tag
+hi def link p6Attention Todo
+hi def link p6Type Type
+hi def link p6Error Error
+hi def link p6BlockLabel Label
+hi def link p6Float Float
+hi def link p6Normal Normal
+hi def link p6Package Normal
+hi def link p6PackageScope Normal
+hi def link p6Number Number
+hi def link p6VersionNum Number
+hi def link p6String String
+hi def link p6Repeat Repeat
+hi def link p6Keyword Keyword
+hi def link p6Pragma Keyword
+hi def link p6Module Keyword
+hi def link p6DeclareRoutine Keyword
+hi def link p6VarStorage Special
+hi def link p6FlowControl Special
+hi def link p6NumberBase Special
+hi def link p6Twigil Special
+hi def link p6StringSpecial2 Special
+hi def link p6VersionDot Special
+hi def link p6Comment Comment
+hi def link p6Include Include
+hi def link p6Shebang PreProc
+hi def link p6ClosureTrait PreProc
+hi def link p6Routine Function
+hi def link p6Operator Operator
+hi def link p6Version Operator
+hi def link p6Context Operator
+hi def link p6Quote Delimiter
+hi def link p6TypeConstraint PreCondit
+hi def link p6Exception Exception
+hi def link p6Placeholder Identifier
+hi def link p6Variable Identifier
+hi def link p6VarSlash Identifier
+hi def link p6VarNum Identifier
+hi def link p6VarExclam Identifier
+hi def link p6VarMatch Identifier
+hi def link p6VarName Identifier
+hi def link p6MatchVar Identifier
+hi def link p6RxP5ReadRefId Identifier
+hi def link p6RxP5ModDef Identifier
+hi def link p6RxP5ModName Identifier
+hi def link p6Conditional Conditional
+hi def link p6StringSpecial SpecialChar
+
+hi def link p6PodAbbr p6Pod
+hi def link p6PodAbbrEOF p6Pod
+hi def link p6PodAbbrNoCode p6Pod
+hi def link p6PodAbbrCode p6PodCode
+hi def link p6PodPara p6Pod
+hi def link p6PodParaEOF p6Pod
+hi def link p6PodParaNoCode p6Pod
+hi def link p6PodParaCode p6PodCode
+hi def link p6PodDelim p6Pod
+hi def link p6PodDelimEOF p6Pod
+hi def link p6PodDelimNoCode p6Pod
+hi def link p6PodDelimCode p6PodCode
+hi def link p6PodImplicitCode p6PodCode
+hi def link p6PodExtraConfig p6PodPrefix
+hi def link p6PodVerticalBar p6PodFormatCode
+hi def link p6PodColon p6PodFormatCode
+hi def link p6PodSemicolon p6PodFormatCode
+hi def link p6PodComma p6PodFormatCode
+hi def link p6PodFormatOne p6PodFormat
+hi def link p6PodFormatTwo p6PodFormat
+hi def link p6PodFormatThree p6PodFormat
+hi def link p6PodFormatFrench p6PodFormat
+
+hi def link p6PodType Type
+hi def link p6PodConfigOption String
+hi def link p6PodCode PreProc
+hi def link p6Pod Comment
+hi def link p6PodComment Comment
+hi def link p6PodAutoQuote Operator
+hi def link p6PodConfigOperator Operator
+hi def link p6PodPrefix Statement
+hi def link p6PodName Identifier
+hi def link p6PodFormatCode SpecialChar
+hi def link p6PodFormat SpecialComment
- HiLink p6EscOctOld p6Error
- HiLink p6PackageTwigil p6Twigil
- HiLink p6StringAngle p6String
- HiLink p6StringFrench p6String
- HiLink p6StringAngles p6String
- HiLink p6StringSQ p6String
- HiLink p6StringDQ p6String
- HiLink p6StringQ p6String
- HiLink p6RxStringSQ p6String
- HiLink p6RxStringDQ p6String
- HiLink p6Substitution p6String
- HiLink p6Transliteration p6String
- HiLink p6StringAuto p6String
- HiLink p6StringP5Auto p6String
- HiLink p6Key p6String
- HiLink p6Match p6String
- HiLink p6RegexBlock p6String
- HiLink p6RxP5CharClass p6String
- HiLink p6RxP5QuoteMeta p6String
- HiLink p6RxCharClass p6String
- HiLink p6RxQuoteWords p6String
- HiLink p6ReduceOp p6Operator
- HiLink p6ReverseCrossOp p6Operator
- HiLink p6HyperOp p6Operator
- HiLink p6QuoteQ p6Operator
- HiLink p6RxRange p6StringSpecial
- HiLink p6RxAnchor p6StringSpecial
- HiLink p6RxP5Anchor p6StringSpecial
- HiLink p6CodePoint p6StringSpecial
- HiLink p6RxMeta p6StringSpecial
- HiLink p6RxP5Range p6StringSpecial
- HiLink p6RxP5CPId p6StringSpecial
- HiLink p6RxP5Posix p6StringSpecial
- HiLink p6RxP5Mod p6StringSpecial
- HiLink p6RxP5HexSeq p6StringSpecial
- HiLink p6RxP5OctSeq p6StringSpecial
- HiLink p6RxP5WriteRefId p6StringSpecial
- HiLink p6HexSequence p6StringSpecial
- HiLink p6OctSequence p6StringSpecial
- HiLink p6RxP5Named p6StringSpecial
- HiLink p6RxP5PropId p6StringSpecial
- HiLink p6RxP5Quantifier p6StringSpecial
- HiLink p6RxP5CountId p6StringSpecial
- HiLink p6RxP5Verb p6StringSpecial
- HiLink p6Escape p6StringSpecial2
- HiLink p6EscNull p6StringSpecial2
- HiLink p6EscHash p6StringSpecial2
- HiLink p6EscQQ p6StringSpecial2
- HiLink p6EscQuote p6StringSpecial2
- HiLink p6EscDoubleQuote p6StringSpecial2
- HiLink p6EscBackTick p6StringSpecial2
- HiLink p6EscForwardSlash p6StringSpecial2
- HiLink p6EscVerticalBar p6StringSpecial2
- HiLink p6EscExclamation p6StringSpecial2
- HiLink p6EscDollar p6StringSpecial2
- HiLink p6EscOpenCurly p6StringSpecial2
- HiLink p6EscCloseCurly p6StringSpecial2
- HiLink p6EscCloseBracket p6StringSpecial2
- HiLink p6EscCloseAngle p6StringSpecial2
- HiLink p6EscCloseFrench p6StringSpecial2
- HiLink p6EscBackSlash p6StringSpecial2
- HiLink p6RxEscape p6StringSpecial2
- HiLink p6RxCapture p6StringSpecial2
- HiLink p6RxAlternation p6StringSpecial2
- HiLink p6RxP5 p6StringSpecial2
- HiLink p6RxP5ReadRef p6StringSpecial2
- HiLink p6RxP5Oct p6StringSpecial2
- HiLink p6RxP5Hex p6StringSpecial2
- HiLink p6RxP5EscMeta p6StringSpecial2
- HiLink p6RxP5Meta p6StringSpecial2
- HiLink p6RxP5Escape p6StringSpecial2
- HiLink p6RxP5CodePoint p6StringSpecial2
- HiLink p6RxP5WriteRef p6StringSpecial2
- HiLink p6RxP5Prop p6StringSpecial2
-
- HiLink p6Property Tag
- HiLink p6Attention Todo
- HiLink p6Type Type
- HiLink p6Error Error
- HiLink p6BlockLabel Label
- HiLink p6Float Float
- HiLink p6Normal Normal
- HiLink p6Package Normal
- HiLink p6PackageScope Normal
- HiLink p6Number Number
- HiLink p6VersionNum Number
- HiLink p6String String
- HiLink p6Repeat Repeat
- HiLink p6Keyword Keyword
- HiLink p6Pragma Keyword
- HiLink p6Module Keyword
- HiLink p6DeclareRoutine Keyword
- HiLink p6VarStorage Special
- HiLink p6FlowControl Special
- HiLink p6NumberBase Special
- HiLink p6Twigil Special
- HiLink p6StringSpecial2 Special
- HiLink p6VersionDot Special
- HiLink p6Comment Comment
- HiLink p6Include Include
- HiLink p6Shebang PreProc
- HiLink p6ClosureTrait PreProc
- HiLink p6Routine Function
- HiLink p6Operator Operator
- HiLink p6Version Operator
- HiLink p6Context Operator
- HiLink p6Quote Delimiter
- HiLink p6TypeConstraint PreCondit
- HiLink p6Exception Exception
- HiLink p6Placeholder Identifier
- HiLink p6Variable Identifier
- HiLink p6VarSlash Identifier
- HiLink p6VarNum Identifier
- HiLink p6VarExclam Identifier
- HiLink p6VarMatch Identifier
- HiLink p6VarName Identifier
- HiLink p6MatchVar Identifier
- HiLink p6RxP5ReadRefId Identifier
- HiLink p6RxP5ModDef Identifier
- HiLink p6RxP5ModName Identifier
- HiLink p6Conditional Conditional
- HiLink p6StringSpecial SpecialChar
-
- HiLink p6PodAbbr p6Pod
- HiLink p6PodAbbrEOF p6Pod
- HiLink p6PodAbbrNoCode p6Pod
- HiLink p6PodAbbrCode p6PodCode
- HiLink p6PodPara p6Pod
- HiLink p6PodParaEOF p6Pod
- HiLink p6PodParaNoCode p6Pod
- HiLink p6PodParaCode p6PodCode
- HiLink p6PodDelim p6Pod
- HiLink p6PodDelimEOF p6Pod
- HiLink p6PodDelimNoCode p6Pod
- HiLink p6PodDelimCode p6PodCode
- HiLink p6PodImplicitCode p6PodCode
- HiLink p6PodExtraConfig p6PodPrefix
- HiLink p6PodVerticalBar p6PodFormatCode
- HiLink p6PodColon p6PodFormatCode
- HiLink p6PodSemicolon p6PodFormatCode
- HiLink p6PodComma p6PodFormatCode
- HiLink p6PodFormatOne p6PodFormat
- HiLink p6PodFormatTwo p6PodFormat
- HiLink p6PodFormatThree p6PodFormat
- HiLink p6PodFormatFrench p6PodFormat
-
- HiLink p6PodType Type
- HiLink p6PodConfigOption String
- HiLink p6PodCode PreProc
- HiLink p6Pod Comment
- HiLink p6PodComment Comment
- HiLink p6PodAutoQuote Operator
- HiLink p6PodConfigOperator Operator
- HiLink p6PodPrefix Statement
- HiLink p6PodName Identifier
- HiLink p6PodFormatCode SpecialChar
- HiLink p6PodFormat SpecialComment
-
- delcommand HiLink
-endif
" Syncing to speed up processing
"syn sync match p6SyncPod groupthere p6PodAbbrRegion "^=\K\k*\>"
diff --git a/runtime/syntax/pf.vim b/runtime/syntax/pf.vim
index 1a8f34bbba..b928dc4fbb 100644
--- a/runtime/syntax/pf.vim
+++ b/runtime/syntax/pf.vim
@@ -2,30 +2,23 @@
" Language: OpenBSD packet filter configuration (pf.conf)
" Original Author: Camiel Dobbelaar <cd@sentia.nl>
" Maintainer: Lauri Tirkkonen <lotheac@iki.fi>
-" Last Change: 2013 Apr 02
+" Last Change: 2018 Jul 16
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+if exists("b:current_syntax")
finish
endif
+let b:current_syntax = "pf"
setlocal foldmethod=syntax
+syn iskeyword @,48-57,_,-,+
syn sync fromstart
syn cluster pfNotLS contains=pfTodo,pfVarAssign
-syn keyword pfCmd altq anchor antispoof binat nat pass
-syn keyword pfCmd queue rdr scrub table set
-syn keyword pfService auth bgp domain finger ftp http https ident
-syn keyword pfService imap irc isakmp kerberos mail nameserver nfs
-syn keyword pfService nntp ntp pop3 portmap pptp rpcbind rsync smtp
-syn keyword pfService snmp snmptrap socks ssh sunrpc syslog telnet
-syn keyword pfService tftp www
+syn keyword pfCmd anchor antispoof block include match pass queue
+syn keyword pfCmd queue set table
+syn match pfCmd /^\s*load\sanchor\>/
syn keyword pfTodo TODO XXX contained
-syn keyword pfWildAddr all any
-syn match pfCmd /block\s/
+syn keyword pfWildAddr any no-route urpf-failed self
syn match pfComment /#.*$/ contains=pfTodo
syn match pfCont /\\$/
syn match pfErrClose /}/
@@ -34,43 +27,307 @@ syn match pfIPv6 /[a-fA-F0-9:]*::[a-fA-F0-9:.]*/
syn match pfIPv6 /[a-fA-F0-9:]\+:[a-fA-F0-9:]\+:[a-fA-F0-9:.]\+/
syn match pfNetmask /\/\d\+/
syn match pfNum /[a-zA-Z0-9_:.]\@<!\d\+[a-zA-Z0-9_:.]\@!/
-syn match pfTable /<\s*[a-zA-Z][a-zA-Z0-9_]*\s*>/
+syn match pfTable /<\s*[a-zA-Z0-9_:][a-zA-Z0-9_:.-]*\s*>/
syn match pfVar /$[a-zA-Z][a-zA-Z0-9_]*/
syn match pfVarAssign /^\s*[a-zA-Z][a-zA-Z0-9_]*\s*=/me=e-1
syn region pfFold1 start=/^#\{1}>/ end=/^#\{1,3}>/me=s-1 transparent fold
syn region pfFold2 start=/^#\{2}>/ end=/^#\{2,3}>/me=s-1 transparent fold
syn region pfFold3 start=/^#\{3}>/ end=/^#\{3}>/me=s-1 transparent fold
syn region pfList start=/{/ end=/}/ transparent contains=ALLBUT,pfErrClose,@pfNotLS
-syn region pfString start=/"/ end=/"/ transparent contains=ALLBUT,pfString,@pfNotLS
-syn region pfString start=/'/ end=/'/ transparent contains=ALLBUT,pfString,@pfNotLS
-
-" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_c_syn_inits")
- if version < 508
- let did_c_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+syn region pfString start=/"/ skip=/\\"/ end=/"/ contains=pfIPv4,pfIPv6,pfNetmask,pfTable,pfVar
+syn region pfString start=/'/ skip=/\\'/ end=/'/ contains=pfIPv4,pfIPv6,pfNetmask,pfTable,pfVar
- HiLink pfCmd Statement
- HiLink pfComment Comment
- HiLink pfCont Statement
- HiLink pfErrClose Error
- HiLink pfIPv4 Type
- HiLink pfIPv6 Type
- HiLink pfNetmask Constant
- HiLink pfNum Constant
- HiLink pfService Constant
- HiLink pfTable Identifier
- HiLink pfTodo Todo
- HiLink pfVar Identifier
- HiLink pfVarAssign Identifier
- HiLink pfWildAddr Type
+hi def link pfCmd Statement
+hi def link pfComment Comment
+hi def link pfCont Statement
+hi def link pfErrClose Error
+hi def link pfIPv4 Type
+hi def link pfIPv6 Type
+hi def link pfNetmask Constant
+hi def link pfNum Constant
+hi def link pfService Constant
+hi def link pfString String
+hi def link pfTable Identifier
+hi def link pfTodo Todo
+hi def link pfVar Identifier
+hi def link pfVarAssign Identifier
+hi def link pfWildAddr Type
- delcommand HiLink
-endif
-
-let b:current_syntax = "pf"
+" from OpenBSD src/etc/services r1.95
+syn keyword pfService 802-11-iapp
+syn keyword pfService Microsoft-SQL-Monitor
+syn keyword pfService Microsoft-SQL-Server
+syn keyword pfService NeXTStep
+syn keyword pfService NextStep
+syn keyword pfService afpovertcp
+syn keyword pfService afs3-bos
+syn keyword pfService afs3-callback
+syn keyword pfService afs3-errors
+syn keyword pfService afs3-fileserver
+syn keyword pfService afs3-kaserver
+syn keyword pfService afs3-prserver
+syn keyword pfService afs3-rmtsys
+syn keyword pfService afs3-update
+syn keyword pfService afs3-vlserver
+syn keyword pfService afs3-volser
+syn keyword pfService amt-redir-tcp
+syn keyword pfService amt-redir-tls
+syn keyword pfService amt-soap-http
+syn keyword pfService amt-soap-https
+syn keyword pfService asf-rmcp
+syn keyword pfService at-echo
+syn keyword pfService at-nbp
+syn keyword pfService at-rtmp
+syn keyword pfService at-zis
+syn keyword pfService auth
+syn keyword pfService authentication
+syn keyword pfService bfd-control
+syn keyword pfService bfd-echo
+syn keyword pfService bftp
+syn keyword pfService bgp
+syn keyword pfService bgpd
+syn keyword pfService biff
+syn keyword pfService bootpc
+syn keyword pfService bootps
+syn keyword pfService canna
+syn keyword pfService cddb
+syn keyword pfService cddbp
+syn keyword pfService chargen
+syn keyword pfService chat
+syn keyword pfService cmd
+syn keyword pfService cmip-agent
+syn keyword pfService cmip-man
+syn keyword pfService comsat
+syn keyword pfService conference
+syn keyword pfService conserver
+syn keyword pfService courier
+syn keyword pfService csnet-ns
+syn keyword pfService cso-ns
+syn keyword pfService cvspserver
+syn keyword pfService daap
+syn keyword pfService datametrics
+syn keyword pfService daytime
+syn keyword pfService dhcpd-sync
+syn keyword pfService dhcpv6-client
+syn keyword pfService dhcpv6-server
+syn keyword pfService discard
+syn keyword pfService domain
+syn keyword pfService echo
+syn keyword pfService efs
+syn keyword pfService eklogin
+syn keyword pfService ekshell
+syn keyword pfService ekshell2
+syn keyword pfService epmap
+syn keyword pfService eppc
+syn keyword pfService exec
+syn keyword pfService finger
+syn keyword pfService ftp
+syn keyword pfService ftp-data
+syn keyword pfService git
+syn keyword pfService gopher
+syn keyword pfService gre-in-udp
+syn keyword pfService gre-udp-dtls
+syn keyword pfService hostname
+syn keyword pfService hostnames
+syn keyword pfService hprop
+syn keyword pfService http
+syn keyword pfService https
+syn keyword pfService hunt
+syn keyword pfService hylafax
+syn keyword pfService iapp
+syn keyword pfService icb
+syn keyword pfService ident
+syn keyword pfService imap
+syn keyword pfService imap2
+syn keyword pfService imap3
+syn keyword pfService imaps
+syn keyword pfService ingreslock
+syn keyword pfService ipp
+syn keyword pfService iprop
+syn keyword pfService ipsec-msft
+syn keyword pfService ipsec-nat-t
+syn keyword pfService ipx
+syn keyword pfService irc
+syn keyword pfService isakmp
+syn keyword pfService iscsi
+syn keyword pfService isisd
+syn keyword pfService iso-tsap
+syn keyword pfService kauth
+syn keyword pfService kdc
+syn keyword pfService kerberos
+syn keyword pfService kerberos-adm
+syn keyword pfService kerberos-iv
+syn keyword pfService kerberos-sec
+syn keyword pfService kerberos_master
+syn keyword pfService kf
+syn keyword pfService kip
+syn keyword pfService klogin
+syn keyword pfService kpasswd
+syn keyword pfService kpop
+syn keyword pfService krb524
+syn keyword pfService krb_prop
+syn keyword pfService krbupdate
+syn keyword pfService krcmd
+syn keyword pfService kreg
+syn keyword pfService kshell
+syn keyword pfService kx
+syn keyword pfService l2tp
+syn keyword pfService ldap
+syn keyword pfService ldaps
+syn keyword pfService ldp
+syn keyword pfService link
+syn keyword pfService login
+syn keyword pfService mail
+syn keyword pfService mdns
+syn keyword pfService mdnsresponder
+syn keyword pfService microsoft-ds
+syn keyword pfService ms-sql-m
+syn keyword pfService ms-sql-s
+syn keyword pfService msa
+syn keyword pfService msp
+syn keyword pfService mtp
+syn keyword pfService mysql
+syn keyword pfService name
+syn keyword pfService nameserver
+syn keyword pfService netbios-dgm
+syn keyword pfService netbios-ns
+syn keyword pfService netbios-ssn
+syn keyword pfService netnews
+syn keyword pfService netplan
+syn keyword pfService netrjs
+syn keyword pfService netstat
+syn keyword pfService netwall
+syn keyword pfService newdate
+syn keyword pfService nextstep
+syn keyword pfService nfs
+syn keyword pfService nfsd
+syn keyword pfService nicname
+syn keyword pfService nnsp
+syn keyword pfService nntp
+syn keyword pfService ntalk
+syn keyword pfService ntp
+syn keyword pfService null
+syn keyword pfService openwebnet
+syn keyword pfService ospf6d
+syn keyword pfService ospfapi
+syn keyword pfService ospfd
+syn keyword pfService photuris
+syn keyword pfService pop2
+syn keyword pfService pop3
+syn keyword pfService pop3pw
+syn keyword pfService pop3s
+syn keyword pfService poppassd
+syn keyword pfService portmap
+syn keyword pfService postgresql
+syn keyword pfService postoffice
+syn keyword pfService pptp
+syn keyword pfService presence
+syn keyword pfService printer
+syn keyword pfService prospero
+syn keyword pfService prospero-np
+syn keyword pfService puppet
+syn keyword pfService pwdgen
+syn keyword pfService qotd
+syn keyword pfService quote
+syn keyword pfService radacct
+syn keyword pfService radius
+syn keyword pfService radius-acct
+syn keyword pfService rdp
+syn keyword pfService readnews
+syn keyword pfService remotefs
+syn keyword pfService resource
+syn keyword pfService rfb
+syn keyword pfService rfe
+syn keyword pfService rfs
+syn keyword pfService rfs_server
+syn keyword pfService ripd
+syn keyword pfService ripng
+syn keyword pfService rje
+syn keyword pfService rkinit
+syn keyword pfService rlp
+syn keyword pfService routed
+syn keyword pfService router
+syn keyword pfService rpc
+syn keyword pfService rpcbind
+syn keyword pfService rsync
+syn keyword pfService rtelnet
+syn keyword pfService rtsp
+syn keyword pfService sa-msg-port
+syn keyword pfService sane-port
+syn keyword pfService sftp
+syn keyword pfService shell
+syn keyword pfService sieve
+syn keyword pfService silc
+syn keyword pfService sink
+syn keyword pfService sip
+syn keyword pfService smtp
+syn keyword pfService smtps
+syn keyword pfService smux
+syn keyword pfService snmp
+syn keyword pfService snmp-trap
+syn keyword pfService snmptrap
+syn keyword pfService snpp
+syn keyword pfService socks
+syn keyword pfService source
+syn keyword pfService spamd
+syn keyword pfService spamd-cfg
+syn keyword pfService spamd-sync
+syn keyword pfService spooler
+syn keyword pfService spop3
+syn keyword pfService ssdp
+syn keyword pfService ssh
+syn keyword pfService submission
+syn keyword pfService sunrpc
+syn keyword pfService supdup
+syn keyword pfService supfiledbg
+syn keyword pfService supfilesrv
+syn keyword pfService support
+syn keyword pfService svn
+syn keyword pfService svrloc
+syn keyword pfService swat
+syn keyword pfService syslog
+syn keyword pfService syslog-tls
+syn keyword pfService systat
+syn keyword pfService tacacs
+syn keyword pfService tacas+
+syn keyword pfService talk
+syn keyword pfService tap
+syn keyword pfService tcpmux
+syn keyword pfService telnet
+syn keyword pfService tempo
+syn keyword pfService tftp
+syn keyword pfService time
+syn keyword pfService timed
+syn keyword pfService timeserver
+syn keyword pfService timserver
+syn keyword pfService tsap
+syn keyword pfService ttylink
+syn keyword pfService ttytst
+syn keyword pfService ub-dns-control
+syn keyword pfService ulistserv
+syn keyword pfService untp
+syn keyword pfService usenet
+syn keyword pfService users
+syn keyword pfService uucp
+syn keyword pfService uucp-path
+syn keyword pfService uucpd
+syn keyword pfService vnc
+syn keyword pfService vxlan
+syn keyword pfService wais
+syn keyword pfService webster
+syn keyword pfService who
+syn keyword pfService whod
+syn keyword pfService whois
+syn keyword pfService www
+syn keyword pfService x400
+syn keyword pfService x400-snd
+syn keyword pfService xcept
+syn keyword pfService xdmcp
+syn keyword pfService xmpp-bosh
+syn keyword pfService xmpp-client
+syn keyword pfService xmpp-server
+syn keyword pfService z3950
+syn keyword pfService zabbix-agent
+syn keyword pfService zabbix-trapper
+syn keyword pfService zebra
+syn keyword pfService zebrasrv
diff --git a/runtime/syntax/pfmain.vim b/runtime/syntax/pfmain.vim
index 32ed6975c0..af58da70ef 100644
--- a/runtime/syntax/pfmain.vim
+++ b/runtime/syntax/pfmain.vim
@@ -7,17 +7,12 @@
" URL: http://cern.ch/fuji/vim/syntax/pfmain.vim
" Comment: Based on Postfix 2.12/3.0 postconf.5.html.
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
-if version >= 600
- setlocal iskeyword=@,48-57,_,-
-else
- set iskeyword=@,48-57,_,-
-endif
+setlocal iskeyword=@,48-57,_,-
syntax case match
syntax sync minlines=1
@@ -1816,33 +1811,24 @@ syntax match pfmainSpecial "\<smtpd\>"
syntax match pfmainSpecial "\<trace\>"
syntax match pfmainSpecial "\<verify\>"
-if version >= 508 || !exists("pfmain_syntax_init")
- if version < 508
- let pfmain_syntax_init = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink pfmainConf Statement
- HiLink pfmainRef PreProc
- HiLink pfmainWord identifier
+hi def link pfmainConf Statement
+hi def link pfmainRef PreProc
+hi def link pfmainWord identifier
- HiLink pfmainDict Type
- HiLink pfmainQueueDir Constant
- HiLink pfmainTransport Constant
- HiLink pfmainLock Constant
- HiLink pfmainAnswer Constant
+hi def link pfmainDict Type
+hi def link pfmainQueueDir Constant
+hi def link pfmainTransport Constant
+hi def link pfmainLock Constant
+hi def link pfmainAnswer Constant
- HiLink pfmainComment Comment
- HiLink pfmainNumber Number
- HiLink pfmainTime Number
- HiLink pfmainIP Number
- HiLink pfmainVariable Error
- HiLink pfmainSpecial Special
+hi def link pfmainComment Comment
+hi def link pfmainNumber Number
+hi def link pfmainTime Number
+hi def link pfmainIP Number
+hi def link pfmainVariable Error
+hi def link pfmainSpecial Special
- delcommand HiLink
-endif
let b:current_syntax = "pfmain"
diff --git a/runtime/syntax/php.vim b/runtime/syntax/php.vim
index 4e1a84651c..5a7a2c3794 100644
--- a/runtime/syntax/php.vim
+++ b/runtime/syntax/php.vim
@@ -1,42 +1,38 @@
" Vim syntax file
-" Language: php PHP 3/4/5
+" Language: php PHP 3/4/5/7
" Maintainer: Jason Woofenden <jason@jasonwoof.com>
-" Last Change: Dec 26, 2015
+" Last Change: Jun 20, 2018
" URL: https://jasonwoof.com/gitweb/?p=vim-syntax.git;a=blob;f=php.vim;hb=HEAD
" Former Maintainers: Peter Hodge <toomuchphp-vim@yahoo.com>
" Debian VIM Maintainers <pkg-vim-maintainers@lists.alioth.debian.org>
"
-" Note: If you are using a colour terminal with dark background, you will probably find
-" the 'elflord' colorscheme is much better for PHP's syntax than the default
-" colourscheme, because elflord's colours will better highlight the break-points
-" (Statements) in your code.
+" Note: If you are using a colour terminal with dark background, you will
+" probably find the 'elflord' colorscheme is much better for PHP's syntax
+" than the default colourscheme, because elflord's colours will better
+" highlight the break-points (Statements) in your code.
"
-" Options: php_sql_query = 1 for SQL syntax highlighting inside strings
-" php_htmlInStrings = 1 for HTML syntax highlighting inside strings
-" php_baselib = 1 for highlighting baselib functions
-" php_asp_tags = 1 for highlighting ASP-style short tags
-" php_parent_error_close = 1 for highlighting parent error ] or )
-" php_parent_error_open = 1 for skipping an php end tag, if there exists an open ( or [ without a closing one
-" php_oldStyle = 1 for using old colorstyle
-" php_noShortTags = 1 don't sync <? ?> as php
-" php_folding = 1 for folding classes and functions
-" php_folding = 2 for folding all { } regions
-" php_sync_method = x
-" x=-1 to sync by search ( default )
-" x>0 to sync at least x lines backwards
-" x=0 to sync from start
-"
-" Added by Peter Hodge On June 9, 2006:
-" php_special_functions = 1|0 to highlight functions with abnormal behaviour
-" php_alt_comparisons = 1|0 to highlight comparison operators in an alternate colour
-" php_alt_assignByReference = 1|0 to highlight '= &' in an alternate colour
-"
-" Note: these all default to 1 (On), so you would set them to '0' to turn them off.
-" E.g., in your .vimrc or _vimrc file:
-" let php_special_functions = 0
-" let php_alt_comparisons = 0
-" let php_alt_assignByReference = 0
-" Unletting these variables will revert back to their default (On).
+" Options:
+" Set to anything to enable:
+" php_sql_query SQL syntax highlighting inside strings
+" php_htmlInStrings HTML syntax highlighting inside strings
+" php_baselib highlighting baselib functions
+" php_asp_tags highlighting ASP-style short tags
+" php_parent_error_close highlighting parent error ] or )
+" php_parent_error_open skipping an php end tag, if there exists
+" an open ( or [ without a closing one
+" php_oldStyle use old colorstyle
+" php_noShortTags don't sync <? ?> as php
+" Set to a specific value:
+" php_folding = 1 fold classes and functions
+" php_folding = 2 fold all { } regions
+" php_sync_method = x where x is an integer:
+" -1 sync by search ( default )
+" >0 sync at least x lines backwards
+" 0 sync from start
+" Set to 0 to _disable_: (Added by Peter Hodge On June 9, 2006)
+" php_special_functions = 0 highlight functions with abnormal behaviour
+" php_alt_comparisons = 0 comparison operators in an alternate colour
+" php_alt_assignByReference = 0 '= &' in an alternate colour
"
"
" Note:
@@ -55,11 +51,8 @@
" ii) Same problem if you are setting php_folding = 2 with a closing
" } inside an string on the first line of this string.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -67,16 +60,8 @@ if !exists("main_syntax")
let main_syntax = 'php'
endif
-if version < 600
- unlet! php_folding
- if exists("php_sync_method") && !php_sync_method
- let php_sync_method=-1
- endif
- so <sfile>:p:h/html.vim
-else
- runtime! syntax/html.vim
- unlet b:current_syntax
-endif
+runtime! syntax/html.vim
+unlet b:current_syntax
" accept old options
if !exists("php_sync_method")
@@ -94,11 +79,7 @@ endif
syn cluster htmlPreproc add=phpRegion,phpRegionAsp,phpRegionSc
-if version < 600
- syn include @sqlTop <sfile>:p:h/sql.vim
-else
- syn include @sqlTop syntax/sql.vim
-endif
+syn include @sqlTop syntax/sql.vim
syn sync clear
unlet b:current_syntax
syn cluster sqlTop remove=sqlString,sqlComment
@@ -120,7 +101,7 @@ syn case match
syn keyword phpEnvVar GATEWAY_INTERFACE SERVER_NAME SERVER_SOFTWARE SERVER_PROTOCOL REQUEST_METHOD QUERY_STRING DOCUMENT_ROOT HTTP_ACCEPT HTTP_ACCEPT_CHARSET HTTP_ENCODING HTTP_ACCEPT_LANGUAGE HTTP_CONNECTION HTTP_HOST HTTP_REFERER HTTP_USER_AGENT REMOTE_ADDR REMOTE_PORT SCRIPT_FILENAME SERVER_ADMIN SERVER_PORT SERVER_SIGNATURE PATH_TRANSLATED SCRIPT_NAME REQUEST_URI contained
" Internal Variables
-syn keyword phpIntVar GLOBALS PHP_ERRMSG PHP_SELF HTTP_GET_VARS HTTP_POST_VARS HTTP_COOKIE_VARS HTTP_POST_FILES HTTP_ENV_VARS HTTP_SERVER_VARS HTTP_SESSION_VARS HTTP_RAW_POST_DATA HTTP_STATE_VARS _GET _POST _COOKIE _FILES _SERVER _ENV _SERVER _REQUEST _SESSION contained
+syn keyword phpIntVar GLOBALS PHP_ERRMSG PHP_SELF HTTP_GET_VARS HTTP_POST_VARS HTTP_COOKIE_VARS HTTP_POST_FILES HTTP_ENV_VARS HTTP_SERVER_VARS HTTP_SESSION_VARS HTTP_RAW_POST_DATA HTTP_STATE_VARS _GET _POST _COOKIE _FILES _SERVER _ENV _SERVER _REQUEST _SESSION contained
" Constants
syn keyword phpCoreConstant PHP_VERSION PHP_OS DEFAULT_INCLUDE_PATH PEAR_INSTALL_DIR PEAR_EXTENSION_DIR PHP_EXTENSION_DIR PHP_BINDIR PHP_LIBDIR PHP_DATADIR PHP_SYSCONFDIR PHP_LOCALSTATEDIR PHP_CONFIG_FILE_PATH PHP_OUTPUT_HANDLER_START PHP_OUTPUT_HANDLER_CONT PHP_OUTPUT_HANDLER_END contained
@@ -131,185 +112,185 @@ syn keyword phpCoreConstant E_ALL E_COMPILE_ERROR E_COMPILE_WARNING E_CORE_ERROR
syn case ignore
-syn keyword phpConstant __LINE__ __FILE__ __FUNCTION__ __METHOD__ __CLASS__ __DIR__ __NAMESPACE__ contained
+syn keyword phpConstant __LINE__ __FILE__ __FUNCTION__ __METHOD__ __CLASS__ __DIR__ __NAMESPACE__ __TRAIT__ contained
" Function and Methods ripped from php_manual_de.tar.gz Jan 2003
-syn keyword phpFunctions apache_child_terminate apache_get_modules apache_get_version apache_getenv apache_lookup_uri apache_note apache_request_headers apache_response_headers apache_setenv ascii2ebcdic ebcdic2ascii getallheaders virtual contained
-syn keyword phpFunctions array_change_key_case array_chunk array_combine array_count_values array_diff_assoc array_diff_uassoc array_diff array_fill array_filter array_flip array_intersect_assoc array_intersect array_key_exists array_keys array_map array_merge_recursive array_merge array_multisort array_pad array_pop array_push array_rand array_reduce array_reverse array_search array_shift array_slice array_splice array_sum array_udiff_assoc array_udiff_uassoc array_udiff array_unique array_unshift array_values array_walk array arsort asort compact count current each end extract in_array key krsort ksort list natcasesort natsort next pos prev range reset rsort shuffle sizeof sort uasort uksort usort contained
-syn keyword phpFunctions aspell_check aspell_new aspell_suggest contained
-syn keyword phpFunctions bcadd bccomp bcdiv bcmod bcmul bcpow bcpowmod bcscale bcsqrt bcsub contained
-syn keyword phpFunctions bzclose bzcompress bzdecompress bzerrno bzerror bzerrstr bzflush bzopen bzread bzwrite contained
-syn keyword phpFunctions cal_days_in_month cal_from_jd cal_info cal_to_jd easter_date easter_days frenchtojd gregoriantojd jddayofweek jdmonthname jdtofrench jdtogregorian jdtojewish jdtojulian jdtounix jewishtojd juliantojd unixtojd contained
-syn keyword phpFunctions ccvs_add ccvs_auth ccvs_command ccvs_count ccvs_delete ccvs_done ccvs_init ccvs_lookup ccvs_new ccvs_report ccvs_return ccvs_reverse ccvs_sale ccvs_status ccvs_textvalue ccvs_void contained
-syn keyword phpFunctions call_user_method_array call_user_method class_exists get_class_methods get_class_vars get_class get_declared_classes get_object_vars get_parent_class is_a is_subclass_of method_exists contained
-syn keyword phpFunctions com VARIANT com_addref com_get com_invoke com_isenum com_load_typelib com_load com_propget com_propput com_propset com_release com_set contained
-syn keyword phpFunctions cpdf_add_annotation cpdf_add_outline cpdf_arc cpdf_begin_text cpdf_circle cpdf_clip cpdf_close cpdf_closepath_fill_stroke cpdf_closepath_stroke cpdf_closepath cpdf_continue_text cpdf_curveto cpdf_end_text cpdf_fill_stroke cpdf_fill cpdf_finalize_page cpdf_finalize cpdf_global_set_document_limits cpdf_import_jpeg cpdf_lineto cpdf_moveto cpdf_newpath cpdf_open cpdf_output_buffer cpdf_page_init cpdf_place_inline_image cpdf_rect cpdf_restore cpdf_rlineto cpdf_rmoveto cpdf_rotate_text cpdf_rotate cpdf_save_to_file cpdf_save cpdf_scale cpdf_set_action_url cpdf_set_char_spacing cpdf_set_creator cpdf_set_current_page cpdf_set_font_directories cpdf_set_font_map_file cpdf_set_font cpdf_set_horiz_scaling cpdf_set_keywords cpdf_set_leading cpdf_set_page_animation cpdf_set_subject cpdf_set_text_matrix cpdf_set_text_pos cpdf_set_text_rendering cpdf_set_text_rise cpdf_set_title cpdf_set_viewer_preferences cpdf_set_word_spacing cpdf_setdash cpdf_setflat cpdf_setgray_fill cpdf_setgray_stroke cpdf_setgray cpdf_setlinecap cpdf_setlinejoin cpdf_setlinewidth cpdf_setmiterlimit cpdf_setrgbcolor_fill cpdf_setrgbcolor_stroke cpdf_setrgbcolor cpdf_show_xy cpdf_show cpdf_stringwidth cpdf_stroke cpdf_text cpdf_translate contained
-syn keyword phpFunctions crack_check crack_closedict crack_getlastmessage crack_opendict contained
-syn keyword phpFunctions ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_graph ctype_lower ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit contained
-syn keyword phpFunctions curl_close curl_errno curl_error curl_exec curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_setopt curl_version contained
-syn keyword phpFunctions cybercash_base64_decode cybercash_base64_encode cybercash_decr cybercash_encr contained
-syn keyword phpFunctions cyrus_authenticate cyrus_bind cyrus_close cyrus_connect cyrus_query cyrus_unbind contained
-syn keyword phpFunctions checkdate date getdate gettimeofday gmdate gmmktime gmstrftime localtime microtime mktime strftime strtotime time contained
-syn keyword phpFunctions dba_close dba_delete dba_exists dba_fetch dba_firstkey dba_handlers dba_insert dba_key_split dba_list dba_nextkey dba_open dba_optimize dba_popen dba_replace dba_sync contained
-syn keyword phpFunctions dbase_add_record dbase_close dbase_create dbase_delete_record dbase_get_header_info dbase_get_record_with_names dbase_get_record dbase_numfields dbase_numrecords dbase_open dbase_pack dbase_replace_record contained
-syn keyword phpFunctions dblist dbmclose dbmdelete dbmexists dbmfetch dbmfirstkey dbminsert dbmnextkey dbmopen dbmreplace contained
-syn keyword phpFunctions dbplus_add dbplus_aql dbplus_chdir dbplus_close dbplus_curr dbplus_errcode dbplus_errno dbplus_find dbplus_first dbplus_flush dbplus_freealllocks dbplus_freelock dbplus_freerlocks dbplus_getlock dbplus_getunique dbplus_info dbplus_last dbplus_lockrel dbplus_next dbplus_open dbplus_prev dbplus_rchperm dbplus_rcreate dbplus_rcrtexact dbplus_rcrtlike dbplus_resolve dbplus_restorepos dbplus_rkeys dbplus_ropen dbplus_rquery dbplus_rrename dbplus_rsecindex dbplus_runlink dbplus_rzap dbplus_savepos dbplus_setindex dbplus_setindexbynumber dbplus_sql dbplus_tcl dbplus_tremove dbplus_undo dbplus_undoprepare dbplus_unlockrel dbplus_unselect dbplus_update dbplus_xlockrel dbplus_xunlockrel contained
-syn keyword phpFunctions dbx_close dbx_compare dbx_connect dbx_error dbx_escape_string dbx_fetch_row dbx_query dbx_sort contained
-syn keyword phpFunctions dio_close dio_fcntl dio_open dio_read dio_seek dio_stat dio_tcsetattr dio_truncate dio_write contained
-syn keyword phpFunctions chdir chroot dir closedir getcwd opendir readdir rewinddir scandir contained
-syn keyword phpFunctions domxml_new_doc domxml_open_file domxml_open_mem domxml_version domxml_xmltree domxml_xslt_stylesheet_doc domxml_xslt_stylesheet_file domxml_xslt_stylesheet xpath_eval_expression xpath_eval xpath_new_context xptr_eval xptr_new_context contained
-syn keyword phpMethods name specified value create_attribute create_cdata_section create_comment create_element_ns create_element create_entity_reference create_processing_instruction create_text_node doctype document_element dump_file dump_mem get_element_by_id get_elements_by_tagname html_dump_mem xinclude entities internal_subset name notations public_id system_id get_attribute_node get_attribute get_elements_by_tagname has_attribute remove_attribute set_attribute tagname add_namespace append_child append_sibling attributes child_nodes clone_node dump_node first_child get_content has_attributes has_child_nodes insert_before is_blank_node last_child next_sibling node_name node_type node_value owner_document parent_node prefix previous_sibling remove_child replace_child replace_node set_content set_name set_namespace unlink_node data target process result_dump_file result_dump_mem contained
-syn keyword phpFunctions dotnet_load contained
-syn keyword phpFunctions debug_backtrace debug_print_backtrace error_log error_reporting restore_error_handler set_error_handler trigger_error user_error contained
-syn keyword phpFunctions escapeshellarg escapeshellcmd exec passthru proc_close proc_get_status proc_nice proc_open proc_terminate shell_exec system contained
-syn keyword phpFunctions fam_cancel_monitor fam_close fam_monitor_collection fam_monitor_directory fam_monitor_file fam_next_event fam_open fam_pending fam_resume_monitor fam_suspend_monitor contained
-syn keyword phpFunctions fbsql_affected_rows fbsql_autocommit fbsql_change_user fbsql_close fbsql_commit fbsql_connect fbsql_create_blob fbsql_create_clob fbsql_create_db fbsql_data_seek fbsql_database_password fbsql_database fbsql_db_query fbsql_db_status fbsql_drop_db fbsql_errno fbsql_error fbsql_fetch_array fbsql_fetch_assoc fbsql_fetch_field fbsql_fetch_lengths fbsql_fetch_object fbsql_fetch_row fbsql_field_flags fbsql_field_len fbsql_field_name fbsql_field_seek fbsql_field_table fbsql_field_type fbsql_free_result fbsql_get_autostart_info fbsql_hostname fbsql_insert_id fbsql_list_dbs fbsql_list_fields fbsql_list_tables fbsql_next_result fbsql_num_fields fbsql_num_rows fbsql_password fbsql_pconnect fbsql_query fbsql_read_blob fbsql_read_clob fbsql_result fbsql_rollback fbsql_select_db fbsql_set_lob_mode fbsql_set_transaction fbsql_start_db fbsql_stop_db fbsql_tablename fbsql_username fbsql_warnings contained
-syn keyword phpFunctions fdf_add_doc_javascript fdf_add_template fdf_close fdf_create fdf_enum_values fdf_errno fdf_error fdf_get_ap fdf_get_attachment fdf_get_encoding fdf_get_file fdf_get_flags fdf_get_opt fdf_get_status fdf_get_value fdf_get_version fdf_header fdf_next_field_name fdf_open_string fdf_open fdf_remove_item fdf_save_string fdf_save fdf_set_ap fdf_set_encoding fdf_set_file fdf_set_flags fdf_set_javascript_action fdf_set_opt fdf_set_status fdf_set_submit_form_action fdf_set_target_frame fdf_set_value fdf_set_version contained
-syn keyword phpFunctions filepro_fieldcount filepro_fieldname filepro_fieldtype filepro_fieldwidth filepro_retrieve filepro_rowcount filepro contained
-syn keyword phpFunctions basename chgrp chmod chown clearstatcache copy delete dirname disk_free_space disk_total_space diskfreespace fclose feof fflush fgetc fgetcsv fgets fgetss file_exists file_get_contents file_put_contents file fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype flock fnmatch fopen fpassthru fputs fread fscanf fseek fstat ftell ftruncate fwrite glob is_dir is_executable is_file is_link is_readable is_uploaded_file is_writable is_writeable link linkinfo lstat mkdir move_uploaded_file parse_ini_file pathinfo pclose popen readfile readlink realpath rename rewind rmdir set_file_buffer stat symlink tempnam tmpfile touch umask unlink contained
-syn keyword phpFunctions fribidi_log2vis contained
-syn keyword phpFunctions ftp_alloc ftp_cdup ftp_chdir ftp_chmod ftp_close ftp_connect ftp_delete ftp_exec ftp_fget ftp_fput ftp_get_option ftp_get ftp_login ftp_mdtm ftp_mkdir ftp_nb_continue ftp_nb_fget ftp_nb_fput ftp_nb_get ftp_nb_put ftp_nlist ftp_pasv ftp_put ftp_pwd ftp_quit ftp_raw ftp_rawlist ftp_rename ftp_rmdir ftp_set_option ftp_site ftp_size ftp_ssl_connect ftp_systype contained
-syn keyword phpFunctions call_user_func_array call_user_func create_function func_get_arg func_get_args func_num_args function_exists get_defined_functions register_shutdown_function register_tick_function unregister_tick_function contained
-syn keyword phpFunctions bind_textdomain_codeset bindtextdomain dcgettext dcngettext dgettext dngettext gettext ngettext textdomain contained
-syn keyword phpFunctions gmp_abs gmp_add gmp_and gmp_clrbit gmp_cmp gmp_com gmp_div_q gmp_div_qr gmp_div_r gmp_div gmp_divexact gmp_fact gmp_gcd gmp_gcdext gmp_hamdist gmp_init gmp_intval gmp_invert gmp_jacobi gmp_legendre gmp_mod gmp_mul gmp_neg gmp_or gmp_perfect_square gmp_popcount gmp_pow gmp_powm gmp_prob_prime gmp_random gmp_scan0 gmp_scan1 gmp_setbit gmp_sign gmp_sqrt gmp_sqrtrem gmp_sqrtrm gmp_strval gmp_sub gmp_xor contained
-syn keyword phpFunctions header headers_list headers_sent setcookie contained
-syn keyword phpFunctions hw_api_attribute hwapi_hgcsp hw_api_content hw_api_object contained
-syn keyword phpMethods key langdepvalue value values checkin checkout children mimetype read content copy dbstat dcstat dstanchors dstofsrcanchors count reason find ftstat hwstat identify info insert insertanchor insertcollection insertdocument link lock move assign attreditable count insert remove title value object objectbyanchor parents description type remove replace setcommitedversion srcanchors srcsofdst unlock user userlist contained
-syn keyword phpFunctions hw_Array2Objrec hw_changeobject hw_Children hw_ChildrenObj hw_Close hw_Connect hw_connection_info hw_cp hw_Deleteobject hw_DocByAnchor hw_DocByAnchorObj hw_Document_Attributes hw_Document_BodyTag hw_Document_Content hw_Document_SetContent hw_Document_Size hw_dummy hw_EditText hw_Error hw_ErrorMsg hw_Free_Document hw_GetAnchors hw_GetAnchorsObj hw_GetAndLock hw_GetChildColl hw_GetChildCollObj hw_GetChildDocColl hw_GetChildDocCollObj hw_GetObject hw_GetObjectByQuery hw_GetObjectByQueryColl hw_GetObjectByQueryCollObj hw_GetObjectByQueryObj hw_GetParents hw_GetParentsObj hw_getrellink hw_GetRemote hw_getremotechildren hw_GetSrcByDestObj hw_GetText hw_getusername hw_Identify hw_InCollections hw_Info hw_InsColl hw_InsDoc hw_insertanchors hw_InsertDocument hw_InsertObject hw_mapid hw_Modifyobject hw_mv hw_New_Document hw_objrec2array hw_Output_Document hw_pConnect hw_PipeDocument hw_Root hw_setlinkroot hw_stat hw_Unlock hw_Who contained
-syn keyword phpFunctions ibase_add_user ibase_affected_rows ibase_blob_add ibase_blob_cancel ibase_blob_close ibase_blob_create ibase_blob_echo ibase_blob_get ibase_blob_import ibase_blob_info ibase_blob_open ibase_close ibase_commit_ret ibase_commit ibase_connect ibase_delete_user ibase_drop_db ibase_errcode ibase_errmsg ibase_execute ibase_fetch_assoc ibase_fetch_object ibase_fetch_row ibase_field_info ibase_free_event_handler ibase_free_query ibase_free_result ibase_gen_id ibase_modify_user ibase_name_result ibase_num_fields ibase_num_params ibase_param_info ibase_pconnect ibase_prepare ibase_query ibase_rollback_ret ibase_rollback ibase_set_event_handler ibase_timefmt ibase_trans ibase_wait_event contained
-syn keyword phpFunctions iconv_get_encoding iconv_mime_decode_headers iconv_mime_decode iconv_mime_encode iconv_set_encoding iconv_strlen iconv_strpos iconv_strrpos iconv_substr iconv ob_iconv_handler contained
-syn keyword phpFunctions ifx_affected_rows ifx_blobinfile_mode ifx_byteasvarchar ifx_close ifx_connect ifx_copy_blob ifx_create_blob ifx_create_char ifx_do ifx_error ifx_errormsg ifx_fetch_row ifx_fieldproperties ifx_fieldtypes ifx_free_blob ifx_free_char ifx_free_result ifx_get_blob ifx_get_char ifx_getsqlca ifx_htmltbl_result ifx_nullformat ifx_num_fields ifx_num_rows ifx_pconnect ifx_prepare ifx_query ifx_textasvarchar ifx_update_blob ifx_update_char ifxus_close_slob ifxus_create_slob ifxus_free_slob ifxus_open_slob ifxus_read_slob ifxus_seek_slob ifxus_tell_slob ifxus_write_slob contained
-syn keyword phpFunctions exif_imagetype exif_read_data exif_thumbnail gd_info getimagesize image_type_to_mime_type image2wbmp imagealphablending imageantialias imagearc imagechar imagecharup imagecolorallocate imagecolorallocatealpha imagecolorat imagecolorclosest imagecolorclosestalpha imagecolorclosesthwb imagecolordeallocate imagecolorexact imagecolorexactalpha imagecolormatch imagecolorresolve imagecolorresolvealpha imagecolorset imagecolorsforindex imagecolorstotal imagecolortransparent imagecopy imagecopymerge imagecopymergegray imagecopyresampled imagecopyresized imagecreate imagecreatefromgd2 imagecreatefromgd2part imagecreatefromgd imagecreatefromgif imagecreatefromjpeg imagecreatefrompng imagecreatefromstring imagecreatefromwbmp imagecreatefromxbm imagecreatefromxpm imagecreatetruecolor imagedashedline imagedestroy imageellipse imagefill imagefilledarc imagefilledellipse imagefilledpolygon imagefilledrectangle imagefilltoborder imagefontheight imagefontwidth imageftbbox imagefttext imagegammacorrect imagegd2 imagegd imagegif imageinterlace imageistruecolor imagejpeg imageline imageloadfont imagepalettecopy imagepng imagepolygon imagepsbbox imagepscopyfont imagepsencodefont imagepsextendfont imagepsfreefont imagepsloadfont imagepsslantfont imagepstext imagerectangle imagerotate imagesavealpha imagesetbrush imagesetpixel imagesetstyle imagesetthickness imagesettile imagestring imagestringup imagesx imagesy imagetruecolortopalette imagettfbbox imagettftext imagetypes imagewbmp iptcembed iptcparse jpeg2wbmp png2wbmp read_exif_data contained
-syn keyword phpFunctions imap_8bit imap_alerts imap_append imap_base64 imap_binary imap_body imap_bodystruct imap_check imap_clearflag_full imap_close imap_createmailbox imap_delete imap_deletemailbox imap_errors imap_expunge imap_fetch_overview imap_fetchbody imap_fetchheader imap_fetchstructure imap_get_quota imap_get_quotaroot imap_getacl imap_getmailboxes imap_getsubscribed imap_header imap_headerinfo imap_headers imap_last_error imap_list imap_listmailbox imap_listscan imap_listsubscribed imap_lsub imap_mail_compose imap_mail_copy imap_mail_move imap_mail imap_mailboxmsginfo imap_mime_header_decode imap_msgno imap_num_msg imap_num_recent imap_open imap_ping imap_qprint imap_renamemailbox imap_reopen imap_rfc822_parse_adrlist imap_rfc822_parse_headers imap_rfc822_write_address imap_scanmailbox imap_search imap_set_quota imap_setacl imap_setflag_full imap_sort imap_status imap_subscribe imap_thread imap_timeout imap_uid imap_undelete imap_unsubscribe imap_utf7_decode imap_utf7_encode imap_utf8 contained
-syn keyword phpFunctions assert_options assert dl extension_loaded get_cfg_var get_current_user get_defined_constants get_extension_funcs get_include_path get_included_files get_loaded_extensions get_magic_quotes_gpc get_magic_quotes_runtime get_required_files getenv getlastmod getmygid getmyinode getmypid getmyuid getopt getrusage ini_alter ini_get_all ini_get ini_restore ini_set main memory_get_usage php_ini_scanned_files php_logo_guid php_sapi_name php_uname phpcredits phpinfo phpversion putenv restore_include_path set_include_path set_magic_quotes_runtime set_time_limit version_compare zend_logo_guid zend_version contained
-syn keyword phpFunctions ingres_autocommit ingres_close ingres_commit ingres_connect ingres_fetch_array ingres_fetch_object ingres_fetch_row ingres_field_length ingres_field_name ingres_field_nullable ingres_field_precision ingres_field_scale ingres_field_type ingres_num_fields ingres_num_rows ingres_pconnect ingres_query ingres_rollback contained
-syn keyword phpFunctions ircg_channel_mode ircg_disconnect ircg_fetch_error_msg ircg_get_username ircg_html_encode ircg_ignore_add ircg_ignore_del ircg_is_conn_alive ircg_join ircg_kick ircg_lookup_format_messages ircg_msg ircg_nick ircg_nickname_escape ircg_nickname_unescape ircg_notice ircg_part ircg_pconnect ircg_register_format_messages ircg_set_current ircg_set_file ircg_set_on_die ircg_topic ircg_whois contained
-syn keyword phpFunctions java_last_exception_clear java_last_exception_get contained
-syn keyword phpFunctions json_decode json_encode json_last_error contained
-syn keyword phpFunctions ldap_8859_to_t61 ldap_add ldap_bind ldap_close ldap_compare ldap_connect ldap_count_entries ldap_delete ldap_dn2ufn ldap_err2str ldap_errno ldap_error ldap_explode_dn ldap_first_attribute ldap_first_entry ldap_first_reference ldap_free_result ldap_get_attributes ldap_get_dn ldap_get_entries ldap_get_option ldap_get_values_len ldap_get_values ldap_list ldap_mod_add ldap_mod_del ldap_mod_replace ldap_modify ldap_next_attribute ldap_next_entry ldap_next_reference ldap_parse_reference ldap_parse_result ldap_read ldap_rename ldap_search ldap_set_option ldap_set_rebind_proc ldap_sort ldap_start_tls ldap_t61_to_8859 ldap_unbind contained
-syn keyword phpFunctions lzf_compress lzf_decompress lzf_optimized_for contained
-syn keyword phpFunctions ezmlm_hash mail contained
-syn keyword phpFunctions mailparse_determine_best_xfer_encoding mailparse_msg_create mailparse_msg_extract_part_file mailparse_msg_extract_part mailparse_msg_free mailparse_msg_get_part_data mailparse_msg_get_part mailparse_msg_get_structure mailparse_msg_parse_file mailparse_msg_parse mailparse_rfc822_parse_addresses mailparse_stream_encode mailparse_uudecode_all contained
-syn keyword phpFunctions abs acos acosh asin asinh atan2 atan atanh base_convert bindec ceil cos cosh decbin dechex decoct deg2rad exp expm1 floor fmod getrandmax hexdec hypot is_finite is_infinite is_nan lcg_value log10 log1p log max min mt_getrandmax mt_rand mt_srand octdec pi pow rad2deg rand round sin sinh sqrt srand tan tanh contained
-syn keyword phpFunctions mb_convert_case mb_convert_encoding mb_convert_kana mb_convert_variables mb_decode_mimeheader mb_decode_numericentity mb_detect_encoding mb_detect_order mb_encode_mimeheader mb_encode_numericentity mb_ereg_match mb_ereg_replace mb_ereg_search_getpos mb_ereg_search_getregs mb_ereg_search_init mb_ereg_search_pos mb_ereg_search_regs mb_ereg_search_setpos mb_ereg_search mb_ereg mb_eregi_replace mb_eregi mb_get_info mb_http_input mb_http_output mb_internal_encoding mb_language mb_output_handler mb_parse_str mb_preferred_mime_name mb_regex_encoding mb_regex_set_options mb_send_mail mb_split mb_strcut mb_strimwidth mb_strlen mb_strpos mb_strrpos mb_strtolower mb_strtoupper mb_strwidth mb_substitute_character mb_substr_count mb_substr contained
-syn keyword phpFunctions mcal_append_event mcal_close mcal_create_calendar mcal_date_compare mcal_date_valid mcal_day_of_week mcal_day_of_year mcal_days_in_month mcal_delete_calendar mcal_delete_event mcal_event_add_attribute mcal_event_init mcal_event_set_alarm mcal_event_set_category mcal_event_set_class mcal_event_set_description mcal_event_set_end mcal_event_set_recur_daily mcal_event_set_recur_monthly_mday mcal_event_set_recur_monthly_wday mcal_event_set_recur_none mcal_event_set_recur_weekly mcal_event_set_recur_yearly mcal_event_set_start mcal_event_set_title mcal_expunge mcal_fetch_current_stream_event mcal_fetch_event mcal_is_leap_year mcal_list_alarms mcal_list_events mcal_next_recurrence mcal_open mcal_popen mcal_rename_calendar mcal_reopen mcal_snooze mcal_store_event mcal_time_valid mcal_week_of_year contained
-syn keyword phpFunctions mcrypt_cbc mcrypt_cfb mcrypt_create_iv mcrypt_decrypt mcrypt_ecb mcrypt_enc_get_algorithms_name mcrypt_enc_get_block_size mcrypt_enc_get_iv_size mcrypt_enc_get_key_size mcrypt_enc_get_modes_name mcrypt_enc_get_supported_key_sizes mcrypt_enc_is_block_algorithm_mode mcrypt_enc_is_block_algorithm mcrypt_enc_is_block_mode mcrypt_enc_self_test mcrypt_encrypt mcrypt_generic_deinit mcrypt_generic_end mcrypt_generic_init mcrypt_generic mcrypt_get_block_size mcrypt_get_cipher_name mcrypt_get_iv_size mcrypt_get_key_size mcrypt_list_algorithms mcrypt_list_modes mcrypt_module_close mcrypt_module_get_algo_block_size mcrypt_module_get_algo_key_size mcrypt_module_get_supported_key_sizes mcrypt_module_is_block_algorithm_mode mcrypt_module_is_block_algorithm mcrypt_module_is_block_mode mcrypt_module_open mcrypt_module_self_test mcrypt_ofb mdecrypt_generic contained
-syn keyword phpFunctions mcve_adduser mcve_adduserarg mcve_bt mcve_checkstatus mcve_chkpwd mcve_chngpwd mcve_completeauthorizations mcve_connect mcve_connectionerror mcve_deleteresponse mcve_deletetrans mcve_deleteusersetup mcve_deluser mcve_destroyconn mcve_destroyengine mcve_disableuser mcve_edituser mcve_enableuser mcve_force mcve_getcell mcve_getcellbynum mcve_getcommadelimited mcve_getheader mcve_getuserarg mcve_getuserparam mcve_gft mcve_gl mcve_gut mcve_initconn mcve_initengine mcve_initusersetup mcve_iscommadelimited mcve_liststats mcve_listusers mcve_maxconntimeout mcve_monitor mcve_numcolumns mcve_numrows mcve_override mcve_parsecommadelimited mcve_ping mcve_preauth mcve_preauthcompletion mcve_qc mcve_responseparam mcve_return mcve_returncode mcve_returnstatus mcve_sale mcve_setblocking mcve_setdropfile mcve_setip mcve_setssl_files mcve_setssl mcve_settimeout mcve_settle mcve_text_avs mcve_text_code mcve_text_cv mcve_transactionauth mcve_transactionavs mcve_transactionbatch mcve_transactioncv mcve_transactionid mcve_transactionitem mcve_transactionssent mcve_transactiontext mcve_transinqueue mcve_transnew mcve_transparam mcve_transsend mcve_ub mcve_uwait mcve_verifyconnection mcve_verifysslcert mcve_void contained
-syn keyword phpFunctions mhash_count mhash_get_block_size mhash_get_hash_name mhash_keygen_s2k mhash contained
-syn keyword phpFunctions mime_content_type contained
-syn keyword phpFunctions ming_setcubicthreshold ming_setscale ming_useswfversion SWFAction SWFBitmap swfbutton_keypress SWFbutton SWFDisplayItem SWFFill SWFFont SWFGradient SWFMorph SWFMovie SWFShape SWFSprite SWFText SWFTextField contained
-syn keyword phpMethods getHeight getWidth addAction addShape setAction setdown setHit setOver setUp addColor move moveTo multColor remove Rotate rotateTo scale scaleTo setDepth setName setRatio skewX skewXTo skewY skewYTo moveTo rotateTo scaleTo skewXTo skewYTo getwidth addEntry getshape1 getshape2 add nextframe output remove save setbackground setdimension setframes setrate streammp3 addFill drawCurve drawCurveTo drawLine drawLineTo movePen movePenTo setLeftFill setLine setRightFill add nextframe remove setframes addString getWidth moveTo setColor setFont setHeight setSpacing addstring align setbounds setcolor setFont setHeight setindentation setLeftMargin setLineSpacing setMargins setname setrightMargin contained
-syn keyword phpFunctions connection_aborted connection_status connection_timeout constant define defined die eval exit get_browser highlight_file highlight_string ignore_user_abort pack show_source sleep uniqid unpack usleep contained
-syn keyword phpFunctions udm_add_search_limit udm_alloc_agent udm_api_version udm_cat_list udm_cat_path udm_check_charset udm_check_stored udm_clear_search_limits udm_close_stored udm_crc32 udm_errno udm_error udm_find udm_free_agent udm_free_ispell_data udm_free_res udm_get_doc_count udm_get_res_field udm_get_res_param udm_load_ispell_data udm_open_stored udm_set_agent_param contained
-syn keyword phpFunctions msession_connect msession_count msession_create msession_destroy msession_disconnect msession_find msession_get_array msession_get msession_getdata msession_inc msession_list msession_listvar msession_lock msession_plugin msession_randstr msession_set_array msession_set msession_setdata msession_timeout msession_uniq msession_unlock contained
-syn keyword phpFunctions msql_affected_rows msql_close msql_connect msql_create_db msql_createdb msql_data_seek msql_dbname msql_drop_db msql_dropdb msql_error msql_fetch_array msql_fetch_field msql_fetch_object msql_fetch_row msql_field_seek msql_fieldflags msql_fieldlen msql_fieldname msql_fieldtable msql_fieldtype msql_free_result msql_freeresult msql_list_dbs msql_list_fields msql_list_tables msql_listdbs msql_listfields msql_listtables msql_num_fields msql_num_rows msql_numfields msql_numrows msql_pconnect msql_query msql_regcase msql_result msql_select_db msql_selectdb msql_tablename msql contained
-syn keyword phpFunctions mssql_bind mssql_close mssql_connect mssql_data_seek mssql_execute mssql_fetch_array mssql_fetch_assoc mssql_fetch_batch mssql_fetch_field mssql_fetch_object mssql_fetch_row mssql_field_length mssql_field_name mssql_field_seek mssql_field_type mssql_free_result mssql_free_statement mssql_get_last_message mssql_guid_string mssql_init mssql_min_error_severity mssql_min_message_severity mssql_next_result mssql_num_fields mssql_num_rows mssql_pconnect mssql_query mssql_result mssql_rows_affected mssql_select_db contained
-syn keyword phpFunctions muscat_close muscat_get muscat_give muscat_setup_net muscat_setup contained
-syn keyword phpFunctions mysql_affected_rows mysql_change_user mysql_client_encoding mysql_close mysql_connect mysql_create_db mysql_data_seek mysql_db_name mysql_db_query mysql_drop_db mysql_errno mysql_error mysql_escape_string mysql_fetch_array mysql_fetch_assoc mysql_fetch_field mysql_fetch_lengths mysql_fetch_object mysql_fetch_row mysql_field_flags mysql_field_len mysql_field_name mysql_field_seek mysql_field_table mysql_field_type mysql_free_result mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql_insert_id mysql_list_dbs mysql_list_fields mysql_list_processes mysql_list_tables mysql_num_fields mysql_num_rows mysql_pconnect mysql_ping mysql_query mysql_real_escape_string mysql_result mysql_select_db mysql_stat mysql_tablename mysql_thread_id mysql_unbuffered_query contained
-syn keyword phpFunctions mysqli_affected_rows mysqli_autocommit mysqli_bind_param mysqli_bind_result mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect mysqli_data_seek mysqli_debug mysqli_disable_reads_from_master mysqli_disable_rpl_parse mysqli_dump_debug_info mysqli_enable_reads_from_master mysqli_enable_rpl_parse mysqli_errno mysqli_error mysqli_execute mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_fetch mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_client_info mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_master_query mysqli_num_fields mysqli_num_rows mysqli_options mysqli_param_count mysqli_ping mysqli_prepare_result mysqli_prepare mysqli_profiler mysqli_query mysqli_read_query_result mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reload mysqli_rollback mysqli_rpl_parse_enabled mysqli_rpl_probe mysqli_rpl_query_type mysqli_select_db mysqli_send_long_data mysqli_send_query mysqli_slave_query mysqli_ssl_set mysqli_stat mysqli_stmt_affected_rows mysqli_stmt_close mysqli_stmt_errno mysqli_stmt_error mysqli_stmt_store_result mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count contained
-syn keyword phpFunctions ncurses_addch ncurses_addchnstr ncurses_addchstr ncurses_addnstr ncurses_addstr ncurses_assume_default_colors ncurses_attroff ncurses_attron ncurses_attrset ncurses_baudrate ncurses_beep ncurses_bkgd ncurses_bkgdset ncurses_border ncurses_bottom_panel ncurses_can_change_color ncurses_cbreak ncurses_clear ncurses_clrtobot ncurses_clrtoeol ncurses_color_content ncurses_color_set ncurses_curs_set ncurses_def_prog_mode ncurses_def_shell_mode ncurses_define_key ncurses_del_panel ncurses_delay_output ncurses_delch ncurses_deleteln ncurses_delwin ncurses_doupdate ncurses_echo ncurses_echochar ncurses_end ncurses_erase ncurses_erasechar ncurses_filter ncurses_flash ncurses_flushinp ncurses_getch ncurses_getmaxyx ncurses_getmouse ncurses_getyx ncurses_halfdelay ncurses_has_colors ncurses_has_ic ncurses_has_il ncurses_has_key ncurses_hide_panel ncurses_hline ncurses_inch ncurses_init_color ncurses_init_pair ncurses_init ncurses_insch ncurses_insdelln ncurses_insertln ncurses_insstr ncurses_instr ncurses_isendwin ncurses_keyok ncurses_keypad ncurses_killchar ncurses_longname ncurses_meta ncurses_mouse_trafo ncurses_mouseinterval ncurses_mousemask ncurses_move_panel ncurses_move ncurses_mvaddch ncurses_mvaddchnstr ncurses_mvaddchstr ncurses_mvaddnstr ncurses_mvaddstr ncurses_mvcur ncurses_mvdelch ncurses_mvgetch ncurses_mvhline ncurses_mvinch ncurses_mvvline ncurses_mvwaddstr ncurses_napms ncurses_new_panel ncurses_newpad ncurses_newwin ncurses_nl ncurses_nocbreak ncurses_noecho ncurses_nonl ncurses_noqiflush ncurses_noraw ncurses_pair_content ncurses_panel_above ncurses_panel_below ncurses_panel_window ncurses_pnoutrefresh ncurses_prefresh ncurses_putp ncurses_qiflush ncurses_raw ncurses_refresh ncurses_replace_panel ncurses_reset_prog_mode ncurses_reset_shell_mode ncurses_resetty ncurses_savetty ncurses_scr_dump ncurses_scr_init ncurses_scr_restore ncurses_scr_set ncurses_scrl ncurses_show_panel ncurses_slk_attr ncurses_slk_attroff ncurses_slk_attron ncurses_slk_attrset ncurses_slk_clear ncurses_slk_color ncurses_slk_init ncurses_slk_noutrefresh ncurses_slk_refresh ncurses_slk_restore ncurses_slk_set ncurses_slk_touch ncurses_standend ncurses_standout ncurses_start_color ncurses_termattrs ncurses_termname ncurses_timeout ncurses_top_panel ncurses_typeahead ncurses_ungetch ncurses_ungetmouse ncurses_update_panels ncurses_use_default_colors ncurses_use_env ncurses_use_extended_names ncurses_vidattr ncurses_vline ncurses_waddch ncurses_waddstr ncurses_wattroff ncurses_wattron ncurses_wattrset ncurses_wborder ncurses_wclear ncurses_wcolor_set ncurses_werase ncurses_wgetch ncurses_whline ncurses_wmouse_trafo ncurses_wmove ncurses_wnoutrefresh ncurses_wrefresh ncurses_wstandend ncurses_wstandout ncurses_wvline contained
-syn keyword phpFunctions checkdnsrr closelog debugger_off debugger_on define_syslog_variables dns_check_record dns_get_mx dns_get_record fsockopen gethostbyaddr gethostbyname gethostbynamel getmxrr getprotobyname getprotobynumber getservbyname getservbyport ip2long long2ip openlog pfsockopen socket_get_status socket_set_blocking socket_set_timeout syslog contained
-syn keyword phpFunctions yp_all yp_cat yp_err_string yp_errno yp_first yp_get_default_domain yp_master yp_match yp_next yp_order contained
-syn keyword phpFunctions notes_body notes_copy_db notes_create_db notes_create_note notes_drop_db notes_find_note notes_header_info notes_list_msgs notes_mark_read notes_mark_unread notes_nav_create notes_search notes_unread notes_version contained
-syn keyword phpFunctions nsapi_request_headers nsapi_response_headers nsapi_virtual contained
-syn keyword phpFunctions aggregate_info aggregate_methods_by_list aggregate_methods_by_regexp aggregate_methods aggregate_properties_by_list aggregate_properties_by_regexp aggregate_properties aggregate aggregation_info deaggregate contained
-syn keyword phpFunctions ocibindbyname ocicancel ocicloselob ocicollappend ocicollassign ocicollassignelem ocicollgetelem ocicollmax ocicollsize ocicolltrim ocicolumnisnull ocicolumnname ocicolumnprecision ocicolumnscale ocicolumnsize ocicolumntype ocicolumntyperaw ocicommit ocidefinebyname ocierror ociexecute ocifetch ocifetchinto ocifetchstatement ocifreecollection ocifreecursor ocifreedesc ocifreestatement ociinternaldebug ociloadlob ocilogoff ocilogon ocinewcollection ocinewcursor ocinewdescriptor ocinlogon ocinumcols ociparse ociplogon ociresult ocirollback ocirowcount ocisavelob ocisavelobfile ociserverversion ocisetprefetch ocistatementtype ociwritelobtofile ociwritetemporarylob contained
-syn keyword phpFunctions odbc_autocommit odbc_binmode odbc_close_all odbc_close odbc_columnprivileges odbc_columns odbc_commit odbc_connect odbc_cursor odbc_data_source odbc_do odbc_error odbc_errormsg odbc_exec odbc_execute odbc_fetch_array odbc_fetch_into odbc_fetch_object odbc_fetch_row odbc_field_len odbc_field_name odbc_field_num odbc_field_precision odbc_field_scale odbc_field_type odbc_foreignkeys odbc_free_result odbc_gettypeinfo odbc_longreadlen odbc_next_result odbc_num_fields odbc_num_rows odbc_pconnect odbc_prepare odbc_primarykeys odbc_procedurecolumns odbc_procedures odbc_result_all odbc_result odbc_rollback odbc_setoption odbc_specialcolumns odbc_statistics odbc_tableprivileges odbc_tables contained
-syn keyword phpFunctions openssl_csr_export_to_file openssl_csr_export openssl_csr_new openssl_csr_sign openssl_error_string openssl_free_key openssl_get_privatekey openssl_get_publickey openssl_open openssl_pkcs7_decrypt openssl_pkcs7_encrypt openssl_pkcs7_sign openssl_pkcs7_verify openssl_pkey_export_to_file openssl_pkey_export openssl_pkey_get_private openssl_pkey_get_public openssl_pkey_new openssl_private_decrypt openssl_private_encrypt openssl_public_decrypt openssl_public_encrypt openssl_seal openssl_sign openssl_verify openssl_x509_check_private_key openssl_x509_checkpurpose openssl_x509_export_to_file openssl_x509_export openssl_x509_free openssl_x509_parse openssl_x509_read contained
-syn keyword phpFunctions ora_bind ora_close ora_columnname ora_columnsize ora_columntype ora_commit ora_commitoff ora_commiton ora_do ora_error ora_errorcode ora_exec ora_fetch_into ora_fetch ora_getcolumn ora_logoff ora_logon ora_numcols ora_numrows ora_open ora_parse ora_plogon ora_rollback contained
-syn keyword phpFunctions flush ob_clean ob_end_clean ob_end_flush ob_flush ob_get_clean ob_get_contents ob_get_flush ob_get_length ob_get_level ob_get_status ob_gzhandler ob_implicit_flush ob_list_handlers ob_start output_add_rewrite_var output_reset_rewrite_vars contained
-syn keyword phpFunctions overload contained
-syn keyword phpFunctions ovrimos_close ovrimos_commit ovrimos_connect ovrimos_cursor ovrimos_exec ovrimos_execute ovrimos_fetch_into ovrimos_fetch_row ovrimos_field_len ovrimos_field_name ovrimos_field_num ovrimos_field_type ovrimos_free_result ovrimos_longreadlen ovrimos_num_fields ovrimos_num_rows ovrimos_prepare ovrimos_result_all ovrimos_result ovrimos_rollback contained
-syn keyword phpFunctions pcntl_exec pcntl_fork pcntl_signal pcntl_waitpid pcntl_wexitstatus pcntl_wifexited pcntl_wifsignaled pcntl_wifstopped pcntl_wstopsig pcntl_wtermsig contained
-syn keyword phpFunctions preg_grep preg_match_all preg_match preg_quote preg_replace_callback preg_replace preg_split contained
-syn keyword phpFunctions pdf_add_annotation pdf_add_bookmark pdf_add_launchlink pdf_add_locallink pdf_add_note pdf_add_outline pdf_add_pdflink pdf_add_thumbnail pdf_add_weblink pdf_arc pdf_arcn pdf_attach_file pdf_begin_page pdf_begin_pattern pdf_begin_template pdf_circle pdf_clip pdf_close_image pdf_close_pdi_page pdf_close_pdi pdf_close pdf_closepath_fill_stroke pdf_closepath_stroke pdf_closepath pdf_concat pdf_continue_text pdf_curveto pdf_delete pdf_end_page pdf_end_pattern pdf_end_template pdf_endpath pdf_fill_stroke pdf_fill pdf_findfont pdf_get_buffer pdf_get_font pdf_get_fontname pdf_get_fontsize pdf_get_image_height pdf_get_image_width pdf_get_majorversion pdf_get_minorversion pdf_get_parameter pdf_get_pdi_parameter pdf_get_pdi_value pdf_get_value pdf_initgraphics pdf_lineto pdf_makespotcolor pdf_moveto pdf_new pdf_open_CCITT pdf_open_file pdf_open_gif pdf_open_image_file pdf_open_image pdf_open_jpeg pdf_open_memory_image pdf_open_pdi_page pdf_open_pdi pdf_open_png pdf_open_tiff pdf_open pdf_place_image pdf_place_pdi_page pdf_rect pdf_restore pdf_rotate pdf_save pdf_scale pdf_set_border_color pdf_set_border_dash pdf_set_border_style pdf_set_char_spacing pdf_set_duration pdf_set_font pdf_set_horiz_scaling pdf_set_info_author pdf_set_info_creator pdf_set_info_keywords pdf_set_info_subject pdf_set_info_title pdf_set_info pdf_set_leading pdf_set_parameter pdf_set_text_matrix pdf_set_text_pos pdf_set_text_rendering pdf_set_text_rise pdf_set_value pdf_set_word_spacing pdf_setcolor pdf_setdash pdf_setflat pdf_setfont pdf_setgray_fill pdf_setgray_stroke pdf_setgray pdf_setlinecap pdf_setlinejoin pdf_setlinewidth pdf_setmatrix pdf_setmiterlimit pdf_setpolydash pdf_setrgbcolor_fill pdf_setrgbcolor_stroke pdf_setrgbcolor pdf_show_boxed pdf_show_xy pdf_show pdf_skew pdf_stringwidth pdf_stroke pdf_translate contained
-syn keyword phpFunctions pfpro_cleanup pfpro_init pfpro_process_raw pfpro_process pfpro_version contained
-syn keyword phpFunctions pg_affected_rows pg_cancel_query pg_client_encoding pg_close pg_connect pg_connection_busy pg_connection_reset pg_connection_status pg_convert pg_copy_from pg_copy_to pg_dbname pg_delete pg_end_copy pg_escape_bytea pg_escape_string pg_fetch_all pg_fetch_array pg_fetch_assoc pg_fetch_object pg_fetch_result pg_fetch_row pg_field_is_null pg_field_name pg_field_num pg_field_prtlen pg_field_size pg_field_type pg_free_result pg_get_notify pg_get_pid pg_get_result pg_host pg_insert pg_last_error pg_last_notice pg_last_oid pg_lo_close pg_lo_create pg_lo_export pg_lo_import pg_lo_open pg_lo_read_all pg_lo_read pg_lo_seek pg_lo_tell pg_lo_unlink pg_lo_write pg_meta_data pg_num_fields pg_num_rows pg_options pg_pconnect pg_ping pg_port pg_put_line pg_query pg_result_error pg_result_seek pg_result_status pg_select pg_send_query pg_set_client_encoding pg_trace pg_tty pg_unescape_bytea pg_untrace pg_update contained
-syn keyword phpFunctions posix_ctermid posix_get_last_error posix_getcwd posix_getegid posix_geteuid posix_getgid posix_getgrgid posix_getgrnam posix_getgroups posix_getlogin posix_getpgid posix_getpgrp posix_getpid posix_getppid posix_getpwnam posix_getpwuid posix_getrlimit posix_getsid posix_getuid posix_isatty posix_kill posix_mkfifo posix_setegid posix_seteuid posix_setgid posix_setpgid posix_setsid posix_setuid posix_strerror posix_times posix_ttyname posix_uname contained
-syn keyword phpFunctions printer_abort printer_close printer_create_brush printer_create_dc printer_create_font printer_create_pen printer_delete_brush printer_delete_dc printer_delete_font printer_delete_pen printer_draw_bmp printer_draw_chord printer_draw_elipse printer_draw_line printer_draw_pie printer_draw_rectangle printer_draw_roundrect printer_draw_text printer_end_doc printer_end_page printer_get_option printer_list printer_logical_fontheight printer_open printer_select_brush printer_select_font printer_select_pen printer_set_option printer_start_doc printer_start_page printer_write contained
-syn keyword phpFunctions pspell_add_to_personal pspell_add_to_session pspell_check pspell_clear_session pspell_config_create pspell_config_ignore pspell_config_mode pspell_config_personal pspell_config_repl pspell_config_runtogether pspell_config_save_repl pspell_new_config pspell_new_personal pspell_new pspell_save_wordlist pspell_store_replacement pspell_suggest contained
-syn keyword phpFunctions qdom_error qdom_tree contained
-syn keyword phpFunctions readline_add_history readline_clear_history readline_completion_function readline_info readline_list_history readline_read_history readline_write_history readline contained
-syn keyword phpFunctions recode_file recode_string recode contained
-syn keyword phpFunctions ereg_replace ereg eregi_replace eregi split spliti sql_regcase contained
-syn keyword phpFunctions ftok msg_get_queue msg_receive msg_remove_queue msg_send msg_set_queue msg_stat_queue sem_acquire sem_get sem_release sem_remove shm_attach shm_detach shm_get_var shm_put_var shm_remove_var shm_remove contained
-syn keyword phpFunctions sesam_affected_rows sesam_commit sesam_connect sesam_diagnostic sesam_disconnect sesam_errormsg sesam_execimm sesam_fetch_array sesam_fetch_result sesam_fetch_row sesam_field_array sesam_field_name sesam_free_result sesam_num_fields sesam_query sesam_rollback sesam_seek_row sesam_settransaction contained
-syn keyword phpFunctions session_cache_expire session_cache_limiter session_decode session_destroy session_encode session_get_cookie_params session_id session_is_registered session_module_name session_name session_regenerate_id session_register session_save_path session_set_cookie_params session_set_save_handler session_start session_unregister session_unset session_write_close contained
-syn keyword phpFunctions shmop_close shmop_delete shmop_open shmop_read shmop_size shmop_write contained
-syn keyword phpFunctions snmp_get_quick_print snmp_set_quick_print snmpget snmprealwalk snmpset snmpwalk snmpwalkoid contained
-syn keyword phpFunctions socket_accept socket_bind socket_clear_error socket_close socket_connect socket_create_listen socket_create_pair socket_create socket_get_option socket_getpeername socket_getsockname socket_iovec_add socket_iovec_alloc socket_iovec_delete socket_iovec_fetch socket_iovec_free socket_iovec_set socket_last_error socket_listen socket_read socket_readv socket_recv socket_recvfrom socket_recvmsg socket_select socket_send socket_sendmsg socket_sendto socket_set_block socket_set_nonblock socket_set_option socket_shutdown socket_strerror socket_write socket_writev contained
-syn keyword phpFunctions sqlite_array_query sqlite_busy_timeout sqlite_changes sqlite_close sqlite_column sqlite_create_aggregate sqlite_create_function sqlite_current sqlite_error_string sqlite_escape_string sqlite_fetch_array sqlite_fetch_single sqlite_fetch_string sqlite_field_name sqlite_has_more sqlite_last_error sqlite_last_insert_rowid sqlite_libencoding sqlite_libversion sqlite_next sqlite_num_fields sqlite_num_rows sqlite_open sqlite_popen sqlite_query sqlite_rewind sqlite_seek sqlite_udf_decode_binary sqlite_udf_encode_binary sqlite_unbuffered_query contained
-syn keyword phpFunctions stream_context_create stream_context_get_options stream_context_set_option stream_context_set_params stream_copy_to_stream stream_filter_append stream_filter_prepend stream_filter_register stream_get_contents stream_get_filters stream_get_line stream_get_meta_data stream_get_transports stream_get_wrappers stream_register_wrapper stream_select stream_set_blocking stream_set_timeout stream_set_write_buffer stream_socket_accept stream_socket_client stream_socket_get_name stream_socket_recvfrom stream_socket_sendto stream_socket_server stream_wrapper_register contained
-syn keyword phpFunctions addcslashes addslashes bin2hex chop chr chunk_split convert_cyr_string count_chars crc32 crypt explode fprintf get_html_translation_table hebrev hebrevc html_entity_decode htmlentities htmlspecialchars implode join levenshtein localeconv ltrim md5_file md5 metaphone money_format nl_langinfo nl2br number_format ord parse_str print printf quoted_printable_decode quotemeta rtrim setlocale sha1_file sha1 similar_text soundex sprintf sscanf str_ireplace str_pad str_repeat str_replace str_rot13 str_shuffle str_split str_word_count strcasecmp strchr strcmp strcoll strcspn strip_tags stripcslashes stripos stripslashes stristr strlen strnatcasecmp strnatcmp strncasecmp strncmp strpos strrchr strrev strripos strrpos strspn strstr strtok strtolower strtoupper strtr substr_compare substr_count substr_replace substr trim ucfirst ucwords vprintf vsprintf wordwrap contained
-syn keyword phpFunctions swf_actiongeturl swf_actiongotoframe swf_actiongotolabel swf_actionnextframe swf_actionplay swf_actionprevframe swf_actionsettarget swf_actionstop swf_actiontogglequality swf_actionwaitforframe swf_addbuttonrecord swf_addcolor swf_closefile swf_definebitmap swf_definefont swf_defineline swf_definepoly swf_definerect swf_definetext swf_endbutton swf_enddoaction swf_endshape swf_endsymbol swf_fontsize swf_fontslant swf_fonttracking swf_getbitmapinfo swf_getfontinfo swf_getframe swf_labelframe swf_lookat swf_modifyobject swf_mulcolor swf_nextid swf_oncondition swf_openfile swf_ortho2 swf_ortho swf_perspective swf_placeobject swf_polarview swf_popmatrix swf_posround swf_pushmatrix swf_removeobject swf_rotate swf_scale swf_setfont swf_setframe swf_shapearc swf_shapecurveto3 swf_shapecurveto swf_shapefillbitmapclip swf_shapefillbitmaptile swf_shapefilloff swf_shapefillsolid swf_shapelinesolid swf_shapelineto swf_shapemoveto swf_showframe swf_startbutton swf_startdoaction swf_startshape swf_startsymbol swf_textwidth swf_translate swf_viewport contained
-syn keyword phpFunctions sybase_affected_rows sybase_close sybase_connect sybase_data_seek sybase_deadlock_retry_count sybase_fetch_array sybase_fetch_assoc sybase_fetch_field sybase_fetch_object sybase_fetch_row sybase_field_seek sybase_free_result sybase_get_last_message sybase_min_client_severity sybase_min_error_severity sybase_min_message_severity sybase_min_server_severity sybase_num_fields sybase_num_rows sybase_pconnect sybase_query sybase_result sybase_select_db sybase_set_message_handler sybase_unbuffered_query contained
-syn keyword phpFunctions tidy_access_count tidy_clean_repair tidy_config_count tidy_diagnose tidy_error_count tidy_get_body tidy_get_config tidy_get_error_buffer tidy_get_head tidy_get_html_ver tidy_get_html tidy_get_output tidy_get_release tidy_get_root tidy_get_status tidy_getopt tidy_is_xhtml tidy_load_config tidy_parse_file tidy_parse_string tidy_repair_file tidy_repair_string tidy_reset_config tidy_save_config tidy_set_encoding tidy_setopt tidy_warning_count contained
-syn keyword phpMethods attributes children get_attr get_nodes has_children has_siblings is_asp is_comment is_html is_jsp is_jste is_text is_xhtml is_xml next prev tidy_node contained
-syn keyword phpFunctions token_get_all token_name contained
-syn keyword phpFunctions base64_decode base64_encode get_meta_tags http_build_query parse_url rawurldecode rawurlencode urldecode urlencode contained
-syn keyword phpFunctions doubleval empty floatval get_defined_vars get_resource_type gettype import_request_variables intval is_array is_bool is_callable is_double is_float is_int is_integer is_long is_null is_numeric is_object is_real is_resource is_scalar is_string isset print_r serialize settype strval unserialize unset var_dump var_export contained
-syn keyword phpFunctions vpopmail_add_alias_domain_ex vpopmail_add_alias_domain vpopmail_add_domain_ex vpopmail_add_domain vpopmail_add_user vpopmail_alias_add vpopmail_alias_del_domain vpopmail_alias_del vpopmail_alias_get_all vpopmail_alias_get vpopmail_auth_user vpopmail_del_domain_ex vpopmail_del_domain vpopmail_del_user vpopmail_error vpopmail_passwd vpopmail_set_user_quota contained
-syn keyword phpFunctions w32api_deftype w32api_init_dtype w32api_invoke_function w32api_register_function w32api_set_call_method contained
-syn keyword phpFunctions wddx_add_vars wddx_deserialize wddx_packet_end wddx_packet_start wddx_serialize_value wddx_serialize_vars contained
-syn keyword phpFunctions utf8_decode utf8_encode xml_error_string xml_get_current_byte_index xml_get_current_column_number xml_get_current_line_number xml_get_error_code xml_parse_into_struct xml_parse xml_parser_create_ns xml_parser_create xml_parser_free xml_parser_get_option xml_parser_set_option xml_set_character_data_handler xml_set_default_handler xml_set_element_handler xml_set_end_namespace_decl_handler xml_set_external_entity_ref_handler xml_set_notation_decl_handler xml_set_object xml_set_processing_instruction_handler xml_set_start_namespace_decl_handler xml_set_unparsed_entity_decl_handler contained
-syn keyword phpFunctions xmlrpc_decode_request xmlrpc_decode xmlrpc_encode_request xmlrpc_encode xmlrpc_get_type xmlrpc_parse_method_descriptions xmlrpc_server_add_introspection_data xmlrpc_server_call_method xmlrpc_server_create xmlrpc_server_destroy xmlrpc_server_register_introspection_callback xmlrpc_server_register_method xmlrpc_set_type contained
-syn keyword phpFunctions xslt_create xslt_errno xslt_error xslt_free xslt_output_process xslt_set_base xslt_set_encoding xslt_set_error_handler xslt_set_log xslt_set_sax_handler xslt_set_sax_handlers xslt_set_scheme_handler xslt_set_scheme_handlers contained
-syn keyword phpFunctions yaz_addinfo yaz_ccl_conf yaz_ccl_parse yaz_close yaz_connect yaz_database yaz_element yaz_errno yaz_error yaz_es_result yaz_get_option yaz_hits yaz_itemorder yaz_present yaz_range yaz_record yaz_scan_result yaz_scan yaz_schema yaz_search yaz_set_option yaz_sort yaz_syntax yaz_wait contained
-syn keyword phpFunctions zip_close zip_entry_close zip_entry_compressedsize zip_entry_compressionmethod zip_entry_filesize zip_entry_name zip_entry_open zip_entry_read zip_open zip_read contained
-syn keyword phpFunctions gzclose gzcompress gzdeflate gzencode gzeof gzfile gzgetc gzgets gzgetss gzinflate gzopen gzpassthru gzputs gzread gzrewind gzseek gztell gzuncompress gzwrite readgzfile zlib_get_coding_type contained
+syn keyword phpFunctions apache_child_terminate apache_get_modules apache_get_version apache_getenv apache_lookup_uri apache_note apache_request_headers apache_response_headers apache_setenv ascii2ebcdic ebcdic2ascii getallheaders virtual contained
+syn keyword phpFunctions array_change_key_case array_chunk array_column array_combine array_count_values array_diff_assoc array_diff_key array_diff_uassoc array_diff_ukey array_diff array_fill_keys array_fill array_filter array_flip array_intersect_assoc array_intersect_key array_intersect_uassoc array_intersect_ukey array_intersect array_key_exists array_keys array_map array_merge_recursive array_merge array_multisort array_pad array_pop array_product array_push array_rand array_reduce array_replace_recursive array_replace array_reverse array_search array_shift array_slice array_splice array_sum array_udiff_assoc array_udiff_uassoc array_udiff array_uintersect_assoc array_uintersect_uassoc array_uintersect array_unique array_unshift array_values array_walk_recursive array_walk arsort asort count current each end in_array key_exists key krsort ksort natcasesort natsort next pos prev range reset rsort shuffle sizeof sort uasort uksort usort contained
+syn keyword phpFunctions aspell_check aspell_new aspell_suggest contained
+syn keyword phpFunctions bcadd bccomp bcdiv bcmod bcmul bcpow bcpowmod bcscale bcsqrt bcsub contained
+syn keyword phpFunctions bzclose bzcompress bzdecompress bzerrno bzerror bzerrstr bzflush bzopen bzread bzwrite contained
+syn keyword phpFunctions cal_days_in_month cal_from_jd cal_info cal_to_jd easter_date easter_days frenchtojd gregoriantojd jddayofweek jdmonthname jdtofrench jdtogregorian jdtojewish jdtojulian jdtounix jewishtojd juliantojd unixtojd contained
+syn keyword phpFunctions ccvs_add ccvs_auth ccvs_command ccvs_count ccvs_delete ccvs_done ccvs_init ccvs_lookup ccvs_new ccvs_report ccvs_return ccvs_reverse ccvs_sale ccvs_status ccvs_textvalue ccvs_void contained
+syn keyword phpFunctions call_user_method_array call_user_method class_exists get_class_methods get_class_vars get_class get_declared_classes get_object_vars get_parent_class is_a is_subclass_of method_exists contained
+syn keyword phpFunctions com VARIANT com_addref com_get com_invoke com_isenum com_load_typelib com_load com_propget com_propput com_propset com_release com_set contained
+syn keyword phpFunctions cpdf_add_annotation cpdf_add_outline cpdf_arc cpdf_begin_text cpdf_circle cpdf_clip cpdf_close cpdf_closepath_fill_stroke cpdf_closepath_stroke cpdf_closepath cpdf_continue_text cpdf_curveto cpdf_end_text cpdf_fill_stroke cpdf_fill cpdf_finalize_page cpdf_finalize cpdf_global_set_document_limits cpdf_import_jpeg cpdf_lineto cpdf_moveto cpdf_newpath cpdf_open cpdf_output_buffer cpdf_page_init cpdf_place_inline_image cpdf_rect cpdf_restore cpdf_rlineto cpdf_rmoveto cpdf_rotate_text cpdf_rotate cpdf_save_to_file cpdf_save cpdf_scale cpdf_set_action_url cpdf_set_char_spacing cpdf_set_creator cpdf_set_current_page cpdf_set_font_directories cpdf_set_font_map_file cpdf_set_font cpdf_set_horiz_scaling cpdf_set_keywords cpdf_set_leading cpdf_set_page_animation cpdf_set_subject cpdf_set_text_matrix cpdf_set_text_pos cpdf_set_text_rendering cpdf_set_text_rise cpdf_set_title cpdf_set_viewer_preferences cpdf_set_word_spacing cpdf_setdash cpdf_setflat cpdf_setgray_fill cpdf_setgray_stroke cpdf_setgray cpdf_setlinecap cpdf_setlinejoin cpdf_setlinewidth cpdf_setmiterlimit cpdf_setrgbcolor_fill cpdf_setrgbcolor_stroke cpdf_setrgbcolor cpdf_show_xy cpdf_show cpdf_stringwidth cpdf_stroke cpdf_text cpdf_translate contained
+syn keyword phpFunctions crack_check crack_closedict crack_getlastmessage crack_opendict contained
+syn keyword phpFunctions ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_graph ctype_lower ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit contained
+syn keyword phpFunctions curl_close curl_errno curl_error curl_exec curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_setopt curl_version contained
+syn keyword phpFunctions cybercash_base64_decode cybercash_base64_encode cybercash_decr cybercash_encr contained
+syn keyword phpFunctions cyrus_authenticate cyrus_bind cyrus_close cyrus_connect cyrus_query cyrus_unbind contained
+syn keyword phpFunctions checkdate date getdate gettimeofday gmdate gmmktime gmstrftime localtime microtime mktime strftime strtotime time contained
+syn keyword phpFunctions dba_close dba_delete dba_exists dba_fetch dba_firstkey dba_handlers dba_insert dba_key_split dba_list dba_nextkey dba_open dba_optimize dba_popen dba_replace dba_sync contained
+syn keyword phpFunctions dbase_add_record dbase_close dbase_create dbase_delete_record dbase_get_header_info dbase_get_record_with_names dbase_get_record dbase_numfields dbase_numrecords dbase_open dbase_pack dbase_replace_record contained
+syn keyword phpFunctions dblist dbmclose dbmdelete dbmexists dbmfetch dbmfirstkey dbminsert dbmnextkey dbmopen dbmreplace contained
+syn keyword phpFunctions dbplus_add dbplus_aql dbplus_chdir dbplus_close dbplus_curr dbplus_errcode dbplus_errno dbplus_find dbplus_first dbplus_flush dbplus_freealllocks dbplus_freelock dbplus_freerlocks dbplus_getlock dbplus_getunique dbplus_info dbplus_last dbplus_lockrel dbplus_next dbplus_open dbplus_prev dbplus_rchperm dbplus_rcreate dbplus_rcrtexact dbplus_rcrtlike dbplus_resolve dbplus_restorepos dbplus_rkeys dbplus_ropen dbplus_rquery dbplus_rrename dbplus_rsecindex dbplus_runlink dbplus_rzap dbplus_savepos dbplus_setindex dbplus_setindexbynumber dbplus_sql dbplus_tcl dbplus_tremove dbplus_undo dbplus_undoprepare dbplus_unlockrel dbplus_unselect dbplus_update dbplus_xlockrel dbplus_xunlockrel contained
+syn keyword phpFunctions dbx_close dbx_compare dbx_connect dbx_error dbx_escape_string dbx_fetch_row dbx_query dbx_sort contained
+syn keyword phpFunctions dio_close dio_fcntl dio_open dio_read dio_seek dio_stat dio_tcsetattr dio_truncate dio_write contained
+syn keyword phpFunctions chdir chroot dir closedir getcwd opendir readdir rewinddir scandir contained
+syn keyword phpFunctions domxml_new_doc domxml_open_file domxml_open_mem domxml_version domxml_xmltree domxml_xslt_stylesheet_doc domxml_xslt_stylesheet_file domxml_xslt_stylesheet xpath_eval_expression xpath_eval xpath_new_context xptr_eval xptr_new_context contained
+syn keyword phpMethods name specified value create_attribute create_cdata_section create_comment create_element_ns create_element create_entity_reference create_processing_instruction create_text_node doctype document_element dump_file dump_mem get_element_by_id get_elements_by_tagname html_dump_mem xinclude entities internal_subset name notations public_id system_id get_attribute_node get_attribute get_elements_by_tagname has_attribute remove_attribute set_attribute tagname add_namespace append_child append_sibling attributes child_nodes clone_node dump_node first_child get_content has_attributes has_child_nodes insert_before is_blank_node last_child next_sibling node_name node_type node_value owner_document parent_node prefix previous_sibling remove_child replace_child replace_node set_content set_name set_namespace unlink_node data target process result_dump_file result_dump_mem contained
+syn keyword phpFunctions dotnet_load contained
+syn keyword phpFunctions debug_backtrace debug_print_backtrace error_log error_reporting restore_error_handler set_error_handler trigger_error user_error contained
+syn keyword phpFunctions escapeshellarg escapeshellcmd exec passthru proc_close proc_get_status proc_nice proc_open proc_terminate shell_exec system contained
+syn keyword phpFunctions fam_cancel_monitor fam_close fam_monitor_collection fam_monitor_directory fam_monitor_file fam_next_event fam_open fam_pending fam_resume_monitor fam_suspend_monitor contained
+syn keyword phpFunctions fbsql_affected_rows fbsql_autocommit fbsql_change_user fbsql_close fbsql_commit fbsql_connect fbsql_create_blob fbsql_create_clob fbsql_create_db fbsql_data_seek fbsql_database_password fbsql_database fbsql_db_query fbsql_db_status fbsql_drop_db fbsql_errno fbsql_error fbsql_fetch_array fbsql_fetch_assoc fbsql_fetch_field fbsql_fetch_lengths fbsql_fetch_object fbsql_fetch_row fbsql_field_flags fbsql_field_len fbsql_field_name fbsql_field_seek fbsql_field_table fbsql_field_type fbsql_free_result fbsql_get_autostart_info fbsql_hostname fbsql_insert_id fbsql_list_dbs fbsql_list_fields fbsql_list_tables fbsql_next_result fbsql_num_fields fbsql_num_rows fbsql_password fbsql_pconnect fbsql_query fbsql_read_blob fbsql_read_clob fbsql_result fbsql_rollback fbsql_select_db fbsql_set_lob_mode fbsql_set_transaction fbsql_start_db fbsql_stop_db fbsql_tablename fbsql_username fbsql_warnings contained
+syn keyword phpFunctions fdf_add_doc_javascript fdf_add_template fdf_close fdf_create fdf_enum_values fdf_errno fdf_error fdf_get_ap fdf_get_attachment fdf_get_encoding fdf_get_file fdf_get_flags fdf_get_opt fdf_get_status fdf_get_value fdf_get_version fdf_header fdf_next_field_name fdf_open_string fdf_open fdf_remove_item fdf_save_string fdf_save fdf_set_ap fdf_set_encoding fdf_set_file fdf_set_flags fdf_set_javascript_action fdf_set_opt fdf_set_status fdf_set_submit_form_action fdf_set_target_frame fdf_set_value fdf_set_version contained
+syn keyword phpFunctions filepro_fieldcount filepro_fieldname filepro_fieldtype filepro_fieldwidth filepro_retrieve filepro_rowcount filepro contained
+syn keyword phpFunctions basename chgrp chmod chown clearstatcache copy delete dirname disk_free_space disk_total_space diskfreespace fclose feof fflush fgetc fgetcsv fgets fgetss file_exists file_get_contents file_put_contents file fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype flock fnmatch fopen fpassthru fputs fread fscanf fseek fstat ftell ftruncate fwrite glob is_dir is_executable is_file is_link is_readable is_uploaded_file is_writable is_writeable link linkinfo lstat mkdir move_uploaded_file parse_ini_file pathinfo pclose popen readfile readlink realpath rename rewind rmdir set_file_buffer stat symlink tempnam tmpfile touch umask unlink contained
+syn keyword phpFunctions fribidi_log2vis contained
+syn keyword phpFunctions ftp_alloc ftp_cdup ftp_chdir ftp_chmod ftp_close ftp_connect ftp_delete ftp_exec ftp_fget ftp_fput ftp_get_option ftp_get ftp_login ftp_mdtm ftp_mkdir ftp_nb_continue ftp_nb_fget ftp_nb_fput ftp_nb_get ftp_nb_put ftp_nlist ftp_pasv ftp_put ftp_pwd ftp_quit ftp_raw ftp_rawlist ftp_rename ftp_rmdir ftp_set_option ftp_site ftp_size ftp_ssl_connect ftp_systype contained
+syn keyword phpFunctions call_user_func_array call_user_func create_function func_get_arg func_get_args func_num_args function_exists get_defined_functions register_shutdown_function register_tick_function unregister_tick_function contained
+syn keyword phpFunctions bind_textdomain_codeset bindtextdomain dcgettext dcngettext dgettext dngettext gettext ngettext textdomain contained
+syn keyword phpFunctions gmp_abs gmp_add gmp_and gmp_clrbit gmp_cmp gmp_com gmp_div_q gmp_div_qr gmp_div_r gmp_div gmp_divexact gmp_fact gmp_gcd gmp_gcdext gmp_hamdist gmp_init gmp_intval gmp_invert gmp_jacobi gmp_legendre gmp_mod gmp_mul gmp_neg gmp_or gmp_perfect_square gmp_popcount gmp_pow gmp_powm gmp_prob_prime gmp_random gmp_scan0 gmp_scan1 gmp_setbit gmp_sign gmp_sqrt gmp_sqrtrem gmp_sqrtrm gmp_strval gmp_sub gmp_xor contained
+syn keyword phpFunctions header headers_list headers_sent setcookie contained
+syn keyword phpFunctions hw_api_attribute hwapi_hgcsp hw_api_content hw_api_object contained
+syn keyword phpMethods key langdepvalue value values checkin checkout children mimetype read content copy dbstat dcstat dstanchors dstofsrcanchors count reason find ftstat hwstat identify info insert insertanchor insertcollection insertdocument link lock move assign attreditable count insert remove title value object objectbyanchor parents description type remove replace setcommitedversion srcanchors srcsofdst unlock user userlist contained
+syn keyword phpFunctions hw_Array2Objrec hw_changeobject hw_Children hw_ChildrenObj hw_Close hw_Connect hw_connection_info hw_cp hw_Deleteobject hw_DocByAnchor hw_DocByAnchorObj hw_Document_Attributes hw_Document_BodyTag hw_Document_Content hw_Document_SetContent hw_Document_Size hw_dummy hw_EditText hw_Error hw_ErrorMsg hw_Free_Document hw_GetAnchors hw_GetAnchorsObj hw_GetAndLock hw_GetChildColl hw_GetChildCollObj hw_GetChildDocColl hw_GetChildDocCollObj hw_GetObject hw_GetObjectByQuery hw_GetObjectByQueryColl hw_GetObjectByQueryCollObj hw_GetObjectByQueryObj hw_GetParents hw_GetParentsObj hw_getrellink hw_GetRemote hw_getremotechildren hw_GetSrcByDestObj hw_GetText hw_getusername hw_Identify hw_InCollections hw_Info hw_InsColl hw_InsDoc hw_insertanchors hw_InsertDocument hw_InsertObject hw_mapid hw_Modifyobject hw_mv hw_New_Document hw_objrec2array hw_Output_Document hw_pConnect hw_PipeDocument hw_Root hw_setlinkroot hw_stat hw_Unlock hw_Who contained
+syn keyword phpFunctions ibase_add_user ibase_affected_rows ibase_blob_add ibase_blob_cancel ibase_blob_close ibase_blob_create ibase_blob_echo ibase_blob_get ibase_blob_import ibase_blob_info ibase_blob_open ibase_close ibase_commit_ret ibase_commit ibase_connect ibase_delete_user ibase_drop_db ibase_errcode ibase_errmsg ibase_execute ibase_fetch_assoc ibase_fetch_object ibase_fetch_row ibase_field_info ibase_free_event_handler ibase_free_query ibase_free_result ibase_gen_id ibase_modify_user ibase_name_result ibase_num_fields ibase_num_params ibase_param_info ibase_pconnect ibase_prepare ibase_query ibase_rollback_ret ibase_rollback ibase_set_event_handler ibase_timefmt ibase_trans ibase_wait_event contained
+syn keyword phpFunctions iconv_get_encoding iconv_mime_decode_headers iconv_mime_decode iconv_mime_encode iconv_set_encoding iconv_strlen iconv_strpos iconv_strrpos iconv_substr iconv ob_iconv_handler contained
+syn keyword phpFunctions ifx_affected_rows ifx_blobinfile_mode ifx_byteasvarchar ifx_close ifx_connect ifx_copy_blob ifx_create_blob ifx_create_char ifx_do ifx_error ifx_errormsg ifx_fetch_row ifx_fieldproperties ifx_fieldtypes ifx_free_blob ifx_free_char ifx_free_result ifx_get_blob ifx_get_char ifx_getsqlca ifx_htmltbl_result ifx_nullformat ifx_num_fields ifx_num_rows ifx_pconnect ifx_prepare ifx_query ifx_textasvarchar ifx_update_blob ifx_update_char ifxus_close_slob ifxus_create_slob ifxus_free_slob ifxus_open_slob ifxus_read_slob ifxus_seek_slob ifxus_tell_slob ifxus_write_slob contained
+syn keyword phpFunctions exif_imagetype exif_read_data exif_thumbnail gd_info getimagesize image_type_to_mime_type image2wbmp imagealphablending imageantialias imagearc imagechar imagecharup imagecolorallocate imagecolorallocatealpha imagecolorat imagecolorclosest imagecolorclosestalpha imagecolorclosesthwb imagecolordeallocate imagecolorexact imagecolorexactalpha imagecolormatch imagecolorresolve imagecolorresolvealpha imagecolorset imagecolorsforindex imagecolorstotal imagecolortransparent imagecopy imagecopymerge imagecopymergegray imagecopyresampled imagecopyresized imagecreate imagecreatefromgd2 imagecreatefromgd2part imagecreatefromgd imagecreatefromgif imagecreatefromjpeg imagecreatefrompng imagecreatefromstring imagecreatefromwbmp imagecreatefromxbm imagecreatefromxpm imagecreatetruecolor imagedashedline imagedestroy imageellipse imagefill imagefilledarc imagefilledellipse imagefilledpolygon imagefilledrectangle imagefilltoborder imagefontheight imagefontwidth imageftbbox imagefttext imagegammacorrect imagegd2 imagegd imagegif imageinterlace imageistruecolor imagejpeg imageline imageloadfont imagepalettecopy imagepng imagepolygon imagepsbbox imagepscopyfont imagepsencodefont imagepsextendfont imagepsfreefont imagepsloadfont imagepsslantfont imagepstext imagerectangle imagerotate imagesavealpha imagesetbrush imagesetpixel imagesetstyle imagesetthickness imagesettile imagestring imagestringup imagesx imagesy imagetruecolortopalette imagettfbbox imagettftext imagetypes imagewbmp iptcembed iptcparse jpeg2wbmp png2wbmp read_exif_data contained
+syn keyword phpFunctions imap_8bit imap_alerts imap_append imap_base64 imap_binary imap_body imap_bodystruct imap_check imap_clearflag_full imap_close imap_createmailbox imap_delete imap_deletemailbox imap_errors imap_expunge imap_fetch_overview imap_fetchbody imap_fetchheader imap_fetchstructure imap_get_quota imap_get_quotaroot imap_getacl imap_getmailboxes imap_getsubscribed imap_header imap_headerinfo imap_headers imap_last_error imap_list imap_listmailbox imap_listscan imap_listsubscribed imap_lsub imap_mail_compose imap_mail_copy imap_mail_move imap_mail imap_mailboxmsginfo imap_mime_header_decode imap_msgno imap_num_msg imap_num_recent imap_open imap_ping imap_qprint imap_renamemailbox imap_reopen imap_rfc822_parse_adrlist imap_rfc822_parse_headers imap_rfc822_write_address imap_scanmailbox imap_search imap_set_quota imap_setacl imap_setflag_full imap_sort imap_status imap_subscribe imap_thread imap_timeout imap_uid imap_undelete imap_unsubscribe imap_utf7_decode imap_utf7_encode imap_utf8 contained
+syn keyword phpFunctions assert_options assert dl extension_loaded get_cfg_var get_current_user get_defined_constants get_extension_funcs get_include_path get_included_files get_loaded_extensions get_magic_quotes_gpc get_magic_quotes_runtime get_required_files getenv getlastmod getmygid getmyinode getmypid getmyuid getopt getrusage ini_alter ini_get_all ini_get ini_restore ini_set main memory_get_usage php_ini_scanned_files php_logo_guid php_sapi_name php_uname phpcredits phpinfo phpversion putenv restore_include_path set_include_path set_magic_quotes_runtime set_time_limit version_compare zend_logo_guid zend_version contained
+syn keyword phpFunctions ingres_autocommit ingres_close ingres_commit ingres_connect ingres_fetch_array ingres_fetch_object ingres_fetch_row ingres_field_length ingres_field_name ingres_field_nullable ingres_field_precision ingres_field_scale ingres_field_type ingres_num_fields ingres_num_rows ingres_pconnect ingres_query ingres_rollback contained
+syn keyword phpFunctions ircg_channel_mode ircg_disconnect ircg_fetch_error_msg ircg_get_username ircg_html_encode ircg_ignore_add ircg_ignore_del ircg_is_conn_alive ircg_join ircg_kick ircg_lookup_format_messages ircg_msg ircg_nick ircg_nickname_escape ircg_nickname_unescape ircg_notice ircg_part ircg_pconnect ircg_register_format_messages ircg_set_current ircg_set_file ircg_set_on_die ircg_topic ircg_whois contained
+syn keyword phpFunctions java_last_exception_clear java_last_exception_get contained
+syn keyword phpFunctions json_decode json_encode json_last_error contained
+syn keyword phpFunctions ldap_8859_to_t61 ldap_add ldap_bind ldap_close ldap_compare ldap_connect ldap_count_entries ldap_delete ldap_dn2ufn ldap_err2str ldap_errno ldap_error ldap_explode_dn ldap_first_attribute ldap_first_entry ldap_first_reference ldap_free_result ldap_get_attributes ldap_get_dn ldap_get_entries ldap_get_option ldap_get_values_len ldap_get_values ldap_list ldap_mod_add ldap_mod_del ldap_mod_replace ldap_modify ldap_next_attribute ldap_next_entry ldap_next_reference ldap_parse_reference ldap_parse_result ldap_read ldap_rename ldap_search ldap_set_option ldap_set_rebind_proc ldap_sort ldap_start_tls ldap_t61_to_8859 ldap_unbind contained
+syn keyword phpFunctions lzf_compress lzf_decompress lzf_optimized_for contained
+syn keyword phpFunctions ezmlm_hash mail contained
+syn keyword phpFunctions mailparse_determine_best_xfer_encoding mailparse_msg_create mailparse_msg_extract_part_file mailparse_msg_extract_part mailparse_msg_free mailparse_msg_get_part_data mailparse_msg_get_part mailparse_msg_get_structure mailparse_msg_parse_file mailparse_msg_parse mailparse_rfc822_parse_addresses mailparse_stream_encode mailparse_uudecode_all contained
+syn keyword phpFunctions abs acos acosh asin asinh atan2 atan atanh base_convert bindec ceil cos cosh decbin dechex decoct deg2rad exp expm1 floor fmod getrandmax hexdec hypot is_finite is_infinite is_nan lcg_value log10 log1p log max min mt_getrandmax mt_rand mt_srand octdec pi pow rad2deg rand round sin sinh sqrt srand tan tanh contained
+syn keyword phpFunctions mb_convert_case mb_convert_encoding mb_convert_kana mb_convert_variables mb_decode_mimeheader mb_decode_numericentity mb_detect_encoding mb_detect_order mb_encode_mimeheader mb_encode_numericentity mb_ereg_match mb_ereg_replace mb_ereg_search_getpos mb_ereg_search_getregs mb_ereg_search_init mb_ereg_search_pos mb_ereg_search_regs mb_ereg_search_setpos mb_ereg_search mb_ereg mb_eregi_replace mb_eregi mb_get_info mb_http_input mb_http_output mb_internal_encoding mb_language mb_output_handler mb_parse_str mb_preferred_mime_name mb_regex_encoding mb_regex_set_options mb_send_mail mb_split mb_strcut mb_strimwidth mb_strlen mb_strpos mb_strrpos mb_strtolower mb_strtoupper mb_strwidth mb_substitute_character mb_substr_count mb_substr contained
+syn keyword phpFunctions mcal_append_event mcal_close mcal_create_calendar mcal_date_compare mcal_date_valid mcal_day_of_week mcal_day_of_year mcal_days_in_month mcal_delete_calendar mcal_delete_event mcal_event_add_attribute mcal_event_init mcal_event_set_alarm mcal_event_set_category mcal_event_set_class mcal_event_set_description mcal_event_set_end mcal_event_set_recur_daily mcal_event_set_recur_monthly_mday mcal_event_set_recur_monthly_wday mcal_event_set_recur_none mcal_event_set_recur_weekly mcal_event_set_recur_yearly mcal_event_set_start mcal_event_set_title mcal_expunge mcal_fetch_current_stream_event mcal_fetch_event mcal_is_leap_year mcal_list_alarms mcal_list_events mcal_next_recurrence mcal_open mcal_popen mcal_rename_calendar mcal_reopen mcal_snooze mcal_store_event mcal_time_valid mcal_week_of_year contained
+syn keyword phpFunctions mcrypt_cbc mcrypt_cfb mcrypt_create_iv mcrypt_decrypt mcrypt_ecb mcrypt_enc_get_algorithms_name mcrypt_enc_get_block_size mcrypt_enc_get_iv_size mcrypt_enc_get_key_size mcrypt_enc_get_modes_name mcrypt_enc_get_supported_key_sizes mcrypt_enc_is_block_algorithm_mode mcrypt_enc_is_block_algorithm mcrypt_enc_is_block_mode mcrypt_enc_self_test mcrypt_encrypt mcrypt_generic_deinit mcrypt_generic_end mcrypt_generic_init mcrypt_generic mcrypt_get_block_size mcrypt_get_cipher_name mcrypt_get_iv_size mcrypt_get_key_size mcrypt_list_algorithms mcrypt_list_modes mcrypt_module_close mcrypt_module_get_algo_block_size mcrypt_module_get_algo_key_size mcrypt_module_get_supported_key_sizes mcrypt_module_is_block_algorithm_mode mcrypt_module_is_block_algorithm mcrypt_module_is_block_mode mcrypt_module_open mcrypt_module_self_test mcrypt_ofb mdecrypt_generic contained
+syn keyword phpFunctions mcve_adduser mcve_adduserarg mcve_bt mcve_checkstatus mcve_chkpwd mcve_chngpwd mcve_completeauthorizations mcve_connect mcve_connectionerror mcve_deleteresponse mcve_deletetrans mcve_deleteusersetup mcve_deluser mcve_destroyconn mcve_destroyengine mcve_disableuser mcve_edituser mcve_enableuser mcve_force mcve_getcell mcve_getcellbynum mcve_getcommadelimited mcve_getheader mcve_getuserarg mcve_getuserparam mcve_gft mcve_gl mcve_gut mcve_initconn mcve_initengine mcve_initusersetup mcve_iscommadelimited mcve_liststats mcve_listusers mcve_maxconntimeout mcve_monitor mcve_numcolumns mcve_numrows mcve_override mcve_parsecommadelimited mcve_ping mcve_preauth mcve_preauthcompletion mcve_qc mcve_responseparam mcve_return mcve_returncode mcve_returnstatus mcve_sale mcve_setblocking mcve_setdropfile mcve_setip mcve_setssl_files mcve_setssl mcve_settimeout mcve_settle mcve_text_avs mcve_text_code mcve_text_cv mcve_transactionauth mcve_transactionavs mcve_transactionbatch mcve_transactioncv mcve_transactionid mcve_transactionitem mcve_transactionssent mcve_transactiontext mcve_transinqueue mcve_transnew mcve_transparam mcve_transsend mcve_ub mcve_uwait mcve_verifyconnection mcve_verifysslcert mcve_void contained
+syn keyword phpFunctions mhash_count mhash_get_block_size mhash_get_hash_name mhash_keygen_s2k mhash contained
+syn keyword phpFunctions mime_content_type contained
+syn keyword phpFunctions ming_setcubicthreshold ming_setscale ming_useswfversion SWFAction SWFBitmap swfbutton_keypress SWFbutton SWFDisplayItem SWFFill SWFFont SWFGradient SWFMorph SWFMovie SWFShape SWFSprite SWFText SWFTextField contained
+syn keyword phpMethods getHeight getWidth addAction addShape setAction setdown setHit setOver setUp addColor move moveTo multColor remove Rotate rotateTo scale scaleTo setDepth setName setRatio skewX skewXTo skewY skewYTo moveTo rotateTo scaleTo skewXTo skewYTo getwidth addEntry getshape1 getshape2 add nextframe output remove save setbackground setdimension setframes setrate streammp3 addFill drawCurve drawCurveTo drawLine drawLineTo movePen movePenTo setLeftFill setLine setRightFill add nextframe remove setframes addString getWidth moveTo setColor setFont setHeight setSpacing addstring align setbounds setcolor setFont setHeight setindentation setLeftMargin setLineSpacing setMargins setname setrightMargin contained
+syn keyword phpFunctions connection_aborted connection_status connection_timeout constant define defined die eval exit get_browser highlight_file highlight_string ignore_user_abort pack show_source sleep uniqid unpack usleep contained
+syn keyword phpFunctions udm_add_search_limit udm_alloc_agent udm_api_version udm_cat_list udm_cat_path udm_check_charset udm_check_stored udm_clear_search_limits udm_close_stored udm_crc32 udm_errno udm_error udm_find udm_free_agent udm_free_ispell_data udm_free_res udm_get_doc_count udm_get_res_field udm_get_res_param udm_load_ispell_data udm_open_stored udm_set_agent_param contained
+syn keyword phpFunctions msession_connect msession_count msession_create msession_destroy msession_disconnect msession_find msession_get_array msession_get msession_getdata msession_inc msession_list msession_listvar msession_lock msession_plugin msession_randstr msession_set_array msession_set msession_setdata msession_timeout msession_uniq msession_unlock contained
+syn keyword phpFunctions msql_affected_rows msql_close msql_connect msql_create_db msql_createdb msql_data_seek msql_dbname msql_drop_db msql_dropdb msql_error msql_fetch_array msql_fetch_field msql_fetch_object msql_fetch_row msql_field_seek msql_fieldflags msql_fieldlen msql_fieldname msql_fieldtable msql_fieldtype msql_free_result msql_freeresult msql_list_dbs msql_list_fields msql_list_tables msql_listdbs msql_listfields msql_listtables msql_num_fields msql_num_rows msql_numfields msql_numrows msql_pconnect msql_query msql_regcase msql_result msql_select_db msql_selectdb msql_tablename msql contained
+syn keyword phpFunctions mssql_bind mssql_close mssql_connect mssql_data_seek mssql_execute mssql_fetch_array mssql_fetch_assoc mssql_fetch_batch mssql_fetch_field mssql_fetch_object mssql_fetch_row mssql_field_length mssql_field_name mssql_field_seek mssql_field_type mssql_free_result mssql_free_statement mssql_get_last_message mssql_guid_string mssql_init mssql_min_error_severity mssql_min_message_severity mssql_next_result mssql_num_fields mssql_num_rows mssql_pconnect mssql_query mssql_result mssql_rows_affected mssql_select_db contained
+syn keyword phpFunctions muscat_close muscat_get muscat_give muscat_setup_net muscat_setup contained
+syn keyword phpFunctions mysql_affected_rows mysql_change_user mysql_client_encoding mysql_close mysql_connect mysql_create_db mysql_data_seek mysql_db_name mysql_db_query mysql_drop_db mysql_errno mysql_error mysql_escape_string mysql_fetch_array mysql_fetch_assoc mysql_fetch_field mysql_fetch_lengths mysql_fetch_object mysql_fetch_row mysql_field_flags mysql_field_len mysql_field_name mysql_field_seek mysql_field_table mysql_field_type mysql_free_result mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql_insert_id mysql_list_dbs mysql_list_fields mysql_list_processes mysql_list_tables mysql_num_fields mysql_num_rows mysql_pconnect mysql_ping mysql_query mysql_real_escape_string mysql_result mysql_select_db mysql_stat mysql_tablename mysql_thread_id mysql_unbuffered_query contained
+syn keyword phpFunctions mysqli_affected_rows mysqli_autocommit mysqli_bind_param mysqli_bind_result mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect mysqli_data_seek mysqli_debug mysqli_disable_reads_from_master mysqli_disable_rpl_parse mysqli_dump_debug_info mysqli_enable_reads_from_master mysqli_enable_rpl_parse mysqli_errno mysqli_error mysqli_execute mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_fetch mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_client_info mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_master_query mysqli_num_fields mysqli_num_rows mysqli_options mysqli_param_count mysqli_ping mysqli_prepare_result mysqli_prepare mysqli_profiler mysqli_query mysqli_read_query_result mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reload mysqli_rollback mysqli_rpl_parse_enabled mysqli_rpl_probe mysqli_rpl_query_type mysqli_select_db mysqli_send_long_data mysqli_send_query mysqli_slave_query mysqli_ssl_set mysqli_stat mysqli_stmt_affected_rows mysqli_stmt_close mysqli_stmt_errno mysqli_stmt_error mysqli_stmt_store_result mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count contained
+syn keyword phpFunctions ncurses_addch ncurses_addchnstr ncurses_addchstr ncurses_addnstr ncurses_addstr ncurses_assume_default_colors ncurses_attroff ncurses_attron ncurses_attrset ncurses_baudrate ncurses_beep ncurses_bkgd ncurses_bkgdset ncurses_border ncurses_bottom_panel ncurses_can_change_color ncurses_cbreak ncurses_clear ncurses_clrtobot ncurses_clrtoeol ncurses_color_content ncurses_color_set ncurses_curs_set ncurses_def_prog_mode ncurses_def_shell_mode ncurses_define_key ncurses_del_panel ncurses_delay_output ncurses_delch ncurses_deleteln ncurses_delwin ncurses_doupdate ncurses_echo ncurses_echochar ncurses_end ncurses_erase ncurses_erasechar ncurses_filter ncurses_flash ncurses_flushinp ncurses_getch ncurses_getmaxyx ncurses_getmouse ncurses_getyx ncurses_halfdelay ncurses_has_colors ncurses_has_ic ncurses_has_il ncurses_has_key ncurses_hide_panel ncurses_hline ncurses_inch ncurses_init_color ncurses_init_pair ncurses_init ncurses_insch ncurses_insdelln ncurses_insertln ncurses_insstr ncurses_instr ncurses_isendwin ncurses_keyok ncurses_keypad ncurses_killchar ncurses_longname ncurses_meta ncurses_mouse_trafo ncurses_mouseinterval ncurses_mousemask ncurses_move_panel ncurses_move ncurses_mvaddch ncurses_mvaddchnstr ncurses_mvaddchstr ncurses_mvaddnstr ncurses_mvaddstr ncurses_mvcur ncurses_mvdelch ncurses_mvgetch ncurses_mvhline ncurses_mvinch ncurses_mvvline ncurses_mvwaddstr ncurses_napms ncurses_new_panel ncurses_newpad ncurses_newwin ncurses_nl ncurses_nocbreak ncurses_noecho ncurses_nonl ncurses_noqiflush ncurses_noraw ncurses_pair_content ncurses_panel_above ncurses_panel_below ncurses_panel_window ncurses_pnoutrefresh ncurses_prefresh ncurses_putp ncurses_qiflush ncurses_raw ncurses_refresh ncurses_replace_panel ncurses_reset_prog_mode ncurses_reset_shell_mode ncurses_resetty ncurses_savetty ncurses_scr_dump ncurses_scr_init ncurses_scr_restore ncurses_scr_set ncurses_scrl ncurses_show_panel ncurses_slk_attr ncurses_slk_attroff ncurses_slk_attron ncurses_slk_attrset ncurses_slk_clear ncurses_slk_color ncurses_slk_init ncurses_slk_noutrefresh ncurses_slk_refresh ncurses_slk_restore ncurses_slk_set ncurses_slk_touch ncurses_standend ncurses_standout ncurses_start_color ncurses_termattrs ncurses_termname ncurses_timeout ncurses_top_panel ncurses_typeahead ncurses_ungetch ncurses_ungetmouse ncurses_update_panels ncurses_use_default_colors ncurses_use_env ncurses_use_extended_names ncurses_vidattr ncurses_vline ncurses_waddch ncurses_waddstr ncurses_wattroff ncurses_wattron ncurses_wattrset ncurses_wborder ncurses_wclear ncurses_wcolor_set ncurses_werase ncurses_wgetch ncurses_whline ncurses_wmouse_trafo ncurses_wmove ncurses_wnoutrefresh ncurses_wrefresh ncurses_wstandend ncurses_wstandout ncurses_wvline contained
+syn keyword phpFunctions checkdnsrr closelog debugger_off debugger_on define_syslog_variables dns_check_record dns_get_mx dns_get_record fsockopen gethostbyaddr gethostbyname gethostbynamel getmxrr getprotobyname getprotobynumber getservbyname getservbyport ip2long long2ip openlog pfsockopen socket_get_status socket_set_blocking socket_set_timeout syslog contained
+syn keyword phpFunctions yp_all yp_cat yp_err_string yp_errno yp_first yp_get_default_domain yp_master yp_match yp_next yp_order contained
+syn keyword phpFunctions notes_body notes_copy_db notes_create_db notes_create_note notes_drop_db notes_find_note notes_header_info notes_list_msgs notes_mark_read notes_mark_unread notes_nav_create notes_search notes_unread notes_version contained
+syn keyword phpFunctions nsapi_request_headers nsapi_response_headers nsapi_virtual contained
+syn keyword phpFunctions aggregate_info aggregate_methods_by_list aggregate_methods_by_regexp aggregate_methods aggregate_properties_by_list aggregate_properties_by_regexp aggregate_properties aggregate aggregation_info deaggregate contained
+syn keyword phpFunctions ocibindbyname ocicancel ocicloselob ocicollappend ocicollassign ocicollassignelem ocicollgetelem ocicollmax ocicollsize ocicolltrim ocicolumnisnull ocicolumnname ocicolumnprecision ocicolumnscale ocicolumnsize ocicolumntype ocicolumntyperaw ocicommit ocidefinebyname ocierror ociexecute ocifetch ocifetchinto ocifetchstatement ocifreecollection ocifreecursor ocifreedesc ocifreestatement ociinternaldebug ociloadlob ocilogoff ocilogon ocinewcollection ocinewcursor ocinewdescriptor ocinlogon ocinumcols ociparse ociplogon ociresult ocirollback ocirowcount ocisavelob ocisavelobfile ociserverversion ocisetprefetch ocistatementtype ociwritelobtofile ociwritetemporarylob contained
+syn keyword phpFunctions odbc_autocommit odbc_binmode odbc_close_all odbc_close odbc_columnprivileges odbc_columns odbc_commit odbc_connect odbc_cursor odbc_data_source odbc_do odbc_error odbc_errormsg odbc_exec odbc_execute odbc_fetch_array odbc_fetch_into odbc_fetch_object odbc_fetch_row odbc_field_len odbc_field_name odbc_field_num odbc_field_precision odbc_field_scale odbc_field_type odbc_foreignkeys odbc_free_result odbc_gettypeinfo odbc_longreadlen odbc_next_result odbc_num_fields odbc_num_rows odbc_pconnect odbc_prepare odbc_primarykeys odbc_procedurecolumns odbc_procedures odbc_result_all odbc_result odbc_rollback odbc_setoption odbc_specialcolumns odbc_statistics odbc_tableprivileges odbc_tables contained
+syn keyword phpFunctions openssl_cipher_iv_length openssl_csr_export_to_file openssl_csr_export openssl_csr_get_public_key openssl_csr_get_subject openssl_csr_new openssl_csr_sign openssl_decrypt openssl_dh_compute_key openssl_digest openssl_encrypt openssl_error_string openssl_free_key openssl_get_cert_locations openssl_get_cipher_methods openssl_get_md_methods openssl_get_privatekey openssl_get_publickey openssl_open openssl_pbkdf2 openssl_pkcs12_export_to_file openssl_pkcs12_export openssl_pkcs12_read openssl_pkcs7_decrypt openssl_pkcs7_encrypt openssl_pkcs7_sign openssl_pkcs7_verify openssl_pkey_export_to_file openssl_pkey_export openssl_pkey_free openssl_pkey_get_details openssl_pkey_get_private openssl_pkey_get_public openssl_pkey_new openssl_private_decrypt openssl_private_encrypt openssl_public_decrypt openssl_public_encrypt openssl_random_pseudo_bytes openssl_seal openssl_sign openssl_spki_export_challenge openssl_spki_export openssl_spki_new openssl_spki_verify openssl_verify openssl_x509_check_private_key openssl_x509_checkpurpose openssl_x509_export_to_file openssl_x509_export openssl_x509_fingerprint openssl_x509_free openssl_x509_parse openssl_x509_read contained
+syn keyword phpFunctions ora_bind ora_close ora_columnname ora_columnsize ora_columntype ora_commit ora_commitoff ora_commiton ora_do ora_error ora_errorcode ora_exec ora_fetch_into ora_fetch ora_getcolumn ora_logoff ora_logon ora_numcols ora_numrows ora_open ora_parse ora_plogon ora_rollback contained
+syn keyword phpFunctions flush ob_clean ob_end_clean ob_end_flush ob_flush ob_get_clean ob_get_contents ob_get_flush ob_get_length ob_get_level ob_get_status ob_gzhandler ob_implicit_flush ob_list_handlers ob_start output_add_rewrite_var output_reset_rewrite_vars contained
+syn keyword phpFunctions overload contained
+syn keyword phpFunctions ovrimos_close ovrimos_commit ovrimos_connect ovrimos_cursor ovrimos_exec ovrimos_execute ovrimos_fetch_into ovrimos_fetch_row ovrimos_field_len ovrimos_field_name ovrimos_field_num ovrimos_field_type ovrimos_free_result ovrimos_longreadlen ovrimos_num_fields ovrimos_num_rows ovrimos_prepare ovrimos_result_all ovrimos_result ovrimos_rollback contained
+syn keyword phpFunctions pcntl_exec pcntl_fork pcntl_signal pcntl_waitpid pcntl_wexitstatus pcntl_wifexited pcntl_wifsignaled pcntl_wifstopped pcntl_wstopsig pcntl_wtermsig contained
+syn keyword phpFunctions preg_grep preg_match_all preg_match preg_quote preg_replace_callback preg_replace preg_split contained
+syn keyword phpFunctions pdf_add_annotation pdf_add_bookmark pdf_add_launchlink pdf_add_locallink pdf_add_note pdf_add_outline pdf_add_pdflink pdf_add_thumbnail pdf_add_weblink pdf_arc pdf_arcn pdf_attach_file pdf_begin_page pdf_begin_pattern pdf_begin_template pdf_circle pdf_clip pdf_close_image pdf_close_pdi_page pdf_close_pdi pdf_close pdf_closepath_fill_stroke pdf_closepath_stroke pdf_closepath pdf_concat pdf_continue_text pdf_curveto pdf_delete pdf_end_page pdf_end_pattern pdf_end_template pdf_endpath pdf_fill_stroke pdf_fill pdf_findfont pdf_get_buffer pdf_get_font pdf_get_fontname pdf_get_fontsize pdf_get_image_height pdf_get_image_width pdf_get_majorversion pdf_get_minorversion pdf_get_parameter pdf_get_pdi_parameter pdf_get_pdi_value pdf_get_value pdf_initgraphics pdf_lineto pdf_makespotcolor pdf_moveto pdf_new pdf_open_CCITT pdf_open_file pdf_open_gif pdf_open_image_file pdf_open_image pdf_open_jpeg pdf_open_memory_image pdf_open_pdi_page pdf_open_pdi pdf_open_png pdf_open_tiff pdf_open pdf_place_image pdf_place_pdi_page pdf_rect pdf_restore pdf_rotate pdf_save pdf_scale pdf_set_border_color pdf_set_border_dash pdf_set_border_style pdf_set_char_spacing pdf_set_duration pdf_set_font pdf_set_horiz_scaling pdf_set_info_author pdf_set_info_creator pdf_set_info_keywords pdf_set_info_subject pdf_set_info_title pdf_set_info pdf_set_leading pdf_set_parameter pdf_set_text_matrix pdf_set_text_pos pdf_set_text_rendering pdf_set_text_rise pdf_set_value pdf_set_word_spacing pdf_setcolor pdf_setdash pdf_setflat pdf_setfont pdf_setgray_fill pdf_setgray_stroke pdf_setgray pdf_setlinecap pdf_setlinejoin pdf_setlinewidth pdf_setmatrix pdf_setmiterlimit pdf_setpolydash pdf_setrgbcolor_fill pdf_setrgbcolor_stroke pdf_setrgbcolor pdf_show_boxed pdf_show_xy pdf_show pdf_skew pdf_stringwidth pdf_stroke pdf_translate contained
+syn keyword phpFunctions pfpro_cleanup pfpro_init pfpro_process_raw pfpro_process pfpro_version contained
+syn keyword phpFunctions pg_affected_rows pg_cancel_query pg_client_encoding pg_close pg_connect pg_connection_busy pg_connection_reset pg_connection_status pg_convert pg_copy_from pg_copy_to pg_dbname pg_delete pg_end_copy pg_escape_bytea pg_escape_string pg_fetch_all pg_fetch_array pg_fetch_assoc pg_fetch_object pg_fetch_result pg_fetch_row pg_field_is_null pg_field_name pg_field_num pg_field_prtlen pg_field_size pg_field_type pg_free_result pg_get_notify pg_get_pid pg_get_result pg_host pg_insert pg_last_error pg_last_notice pg_last_oid pg_lo_close pg_lo_create pg_lo_export pg_lo_import pg_lo_open pg_lo_read_all pg_lo_read pg_lo_seek pg_lo_tell pg_lo_unlink pg_lo_write pg_meta_data pg_num_fields pg_num_rows pg_options pg_pconnect pg_ping pg_port pg_put_line pg_query pg_result_error pg_result_seek pg_result_status pg_select pg_send_query pg_set_client_encoding pg_trace pg_tty pg_unescape_bytea pg_untrace pg_update contained
+syn keyword phpFunctions posix_ctermid posix_get_last_error posix_getcwd posix_getegid posix_geteuid posix_getgid posix_getgrgid posix_getgrnam posix_getgroups posix_getlogin posix_getpgid posix_getpgrp posix_getpid posix_getppid posix_getpwnam posix_getpwuid posix_getrlimit posix_getsid posix_getuid posix_isatty posix_kill posix_mkfifo posix_setegid posix_seteuid posix_setgid posix_setpgid posix_setsid posix_setuid posix_strerror posix_times posix_ttyname posix_uname contained
+syn keyword phpFunctions printer_abort printer_close printer_create_brush printer_create_dc printer_create_font printer_create_pen printer_delete_brush printer_delete_dc printer_delete_font printer_delete_pen printer_draw_bmp printer_draw_chord printer_draw_elipse printer_draw_line printer_draw_pie printer_draw_rectangle printer_draw_roundrect printer_draw_text printer_end_doc printer_end_page printer_get_option printer_list printer_logical_fontheight printer_open printer_select_brush printer_select_font printer_select_pen printer_set_option printer_start_doc printer_start_page printer_write contained
+syn keyword phpFunctions pspell_add_to_personal pspell_add_to_session pspell_check pspell_clear_session pspell_config_create pspell_config_ignore pspell_config_mode pspell_config_personal pspell_config_repl pspell_config_runtogether pspell_config_save_repl pspell_new_config pspell_new_personal pspell_new pspell_save_wordlist pspell_store_replacement pspell_suggest contained
+syn keyword phpFunctions qdom_error qdom_tree contained
+syn keyword phpFunctions readline_add_history readline_clear_history readline_completion_function readline_info readline_list_history readline_read_history readline_write_history readline contained
+syn keyword phpFunctions recode_file recode_string recode contained
+syn keyword phpFunctions ereg_replace ereg eregi_replace eregi split spliti sql_regcase contained
+syn keyword phpFunctions ftok msg_get_queue msg_receive msg_remove_queue msg_send msg_set_queue msg_stat_queue sem_acquire sem_get sem_release sem_remove shm_attach shm_detach shm_get_var shm_put_var shm_remove_var shm_remove contained
+syn keyword phpFunctions sesam_affected_rows sesam_commit sesam_connect sesam_diagnostic sesam_disconnect sesam_errormsg sesam_execimm sesam_fetch_array sesam_fetch_result sesam_fetch_row sesam_field_array sesam_field_name sesam_free_result sesam_num_fields sesam_query sesam_rollback sesam_seek_row sesam_settransaction contained
+syn keyword phpFunctions session_cache_expire session_cache_limiter session_decode session_destroy session_encode session_get_cookie_params session_id session_is_registered session_module_name session_name session_regenerate_id session_register session_save_path session_set_cookie_params session_set_save_handler session_start session_unregister session_unset session_write_close contained
+syn keyword phpFunctions shmop_close shmop_delete shmop_open shmop_read shmop_size shmop_write contained
+syn keyword phpFunctions snmp_get_quick_print snmp_set_quick_print snmpget snmprealwalk snmpset snmpwalk snmpwalkoid contained
+syn keyword phpFunctions socket_accept socket_bind socket_clear_error socket_close socket_connect socket_create_listen socket_create_pair socket_create socket_get_option socket_getpeername socket_getsockname socket_iovec_add socket_iovec_alloc socket_iovec_delete socket_iovec_fetch socket_iovec_free socket_iovec_set socket_last_error socket_listen socket_read socket_readv socket_recv socket_recvfrom socket_recvmsg socket_select socket_send socket_sendmsg socket_sendto socket_set_block socket_set_nonblock socket_set_option socket_shutdown socket_strerror socket_write socket_writev contained
+syn keyword phpFunctions sqlite_array_query sqlite_busy_timeout sqlite_changes sqlite_close sqlite_column sqlite_create_aggregate sqlite_create_function sqlite_current sqlite_error_string sqlite_escape_string sqlite_fetch_array sqlite_fetch_single sqlite_fetch_string sqlite_field_name sqlite_has_more sqlite_last_error sqlite_last_insert_rowid sqlite_libencoding sqlite_libversion sqlite_next sqlite_num_fields sqlite_num_rows sqlite_open sqlite_popen sqlite_query sqlite_rewind sqlite_seek sqlite_udf_decode_binary sqlite_udf_encode_binary sqlite_unbuffered_query contained
+syn keyword phpFunctions stream_context_create stream_context_get_options stream_context_set_option stream_context_set_params stream_copy_to_stream stream_filter_append stream_filter_prepend stream_filter_register stream_get_contents stream_get_filters stream_get_line stream_get_meta_data stream_get_transports stream_get_wrappers stream_register_wrapper stream_select stream_set_blocking stream_set_timeout stream_set_write_buffer stream_socket_accept stream_socket_client stream_socket_get_name stream_socket_recvfrom stream_socket_sendto stream_socket_server stream_wrapper_register contained
+syn keyword phpFunctions addcslashes addslashes bin2hex chop chr chunk_split convert_cyr_string count_chars crc32 crypt explode fprintf get_html_translation_table hebrev hebrevc html_entity_decode htmlentities htmlspecialchars implode join levenshtein localeconv ltrim md5_file md5 metaphone money_format nl_langinfo nl2br number_format ord parse_str print printf quoted_printable_decode quotemeta rtrim setlocale sha1_file sha1 similar_text soundex sprintf sscanf str_ireplace str_pad str_repeat str_replace str_rot13 str_shuffle str_split str_word_count strcasecmp strchr strcmp strcoll strcspn strip_tags stripcslashes stripos stripslashes stristr strlen strnatcasecmp strnatcmp strncasecmp strncmp strpos strrchr strrev strripos strrpos strspn strstr strtok strtolower strtoupper strtr substr_compare substr_count substr_replace substr trim ucfirst ucwords vprintf vsprintf wordwrap contained
+syn keyword phpFunctions swf_actiongeturl swf_actiongotoframe swf_actiongotolabel swf_actionnextframe swf_actionplay swf_actionprevframe swf_actionsettarget swf_actionstop swf_actiontogglequality swf_actionwaitforframe swf_addbuttonrecord swf_addcolor swf_closefile swf_definebitmap swf_definefont swf_defineline swf_definepoly swf_definerect swf_definetext swf_endbutton swf_enddoaction swf_endshape swf_endsymbol swf_fontsize swf_fontslant swf_fonttracking swf_getbitmapinfo swf_getfontinfo swf_getframe swf_labelframe swf_lookat swf_modifyobject swf_mulcolor swf_nextid swf_oncondition swf_openfile swf_ortho2 swf_ortho swf_perspective swf_placeobject swf_polarview swf_popmatrix swf_posround swf_pushmatrix swf_removeobject swf_rotate swf_scale swf_setfont swf_setframe swf_shapearc swf_shapecurveto3 swf_shapecurveto swf_shapefillbitmapclip swf_shapefillbitmaptile swf_shapefilloff swf_shapefillsolid swf_shapelinesolid swf_shapelineto swf_shapemoveto swf_showframe swf_startbutton swf_startdoaction swf_startshape swf_startsymbol swf_textwidth swf_translate swf_viewport contained
+syn keyword phpFunctions sybase_affected_rows sybase_close sybase_connect sybase_data_seek sybase_deadlock_retry_count sybase_fetch_array sybase_fetch_assoc sybase_fetch_field sybase_fetch_object sybase_fetch_row sybase_field_seek sybase_free_result sybase_get_last_message sybase_min_client_severity sybase_min_error_severity sybase_min_message_severity sybase_min_server_severity sybase_num_fields sybase_num_rows sybase_pconnect sybase_query sybase_result sybase_select_db sybase_set_message_handler sybase_unbuffered_query contained
+syn keyword phpFunctions tidy_access_count tidy_clean_repair tidy_config_count tidy_diagnose tidy_error_count tidy_get_body tidy_get_config tidy_get_error_buffer tidy_get_head tidy_get_html_ver tidy_get_html tidy_get_output tidy_get_release tidy_get_root tidy_get_status tidy_getopt tidy_is_xhtml tidy_load_config tidy_parse_file tidy_parse_string tidy_repair_file tidy_repair_string tidy_reset_config tidy_save_config tidy_set_encoding tidy_setopt tidy_warning_count contained
+syn keyword phpMethods attributes children get_attr get_nodes has_children has_siblings is_asp is_comment is_html is_jsp is_jste is_text is_xhtml is_xml next prev tidy_node contained
+syn keyword phpFunctions token_get_all token_name contained
+syn keyword phpFunctions base64_decode base64_encode get_meta_tags http_build_query parse_url rawurldecode rawurlencode urldecode urlencode contained
+syn keyword phpFunctions doubleval empty floatval get_defined_vars get_resource_type gettype import_request_variables intval is_array is_bool is_callable is_double is_float is_int is_integer is_long is_null is_numeric is_object is_real is_resource is_scalar is_string isset print_r serialize settype strval unserialize unset var_dump var_export contained
+syn keyword phpFunctions vpopmail_add_alias_domain_ex vpopmail_add_alias_domain vpopmail_add_domain_ex vpopmail_add_domain vpopmail_add_user vpopmail_alias_add vpopmail_alias_del_domain vpopmail_alias_del vpopmail_alias_get_all vpopmail_alias_get vpopmail_auth_user vpopmail_del_domain_ex vpopmail_del_domain vpopmail_del_user vpopmail_error vpopmail_passwd vpopmail_set_user_quota contained
+syn keyword phpFunctions w32api_deftype w32api_init_dtype w32api_invoke_function w32api_register_function w32api_set_call_method contained
+syn keyword phpFunctions wddx_add_vars wddx_deserialize wddx_packet_end wddx_packet_start wddx_serialize_value wddx_serialize_vars contained
+syn keyword phpFunctions utf8_decode utf8_encode xml_error_string xml_get_current_byte_index xml_get_current_column_number xml_get_current_line_number xml_get_error_code xml_parse_into_struct xml_parse xml_parser_create_ns xml_parser_create xml_parser_free xml_parser_get_option xml_parser_set_option xml_set_character_data_handler xml_set_default_handler xml_set_element_handler xml_set_end_namespace_decl_handler xml_set_external_entity_ref_handler xml_set_notation_decl_handler xml_set_object xml_set_processing_instruction_handler xml_set_start_namespace_decl_handler xml_set_unparsed_entity_decl_handler contained
+syn keyword phpFunctions xmlrpc_decode_request xmlrpc_decode xmlrpc_encode_request xmlrpc_encode xmlrpc_get_type xmlrpc_parse_method_descriptions xmlrpc_server_add_introspection_data xmlrpc_server_call_method xmlrpc_server_create xmlrpc_server_destroy xmlrpc_server_register_introspection_callback xmlrpc_server_register_method xmlrpc_set_type contained
+syn keyword phpFunctions xslt_create xslt_errno xslt_error xslt_free xslt_output_process xslt_set_base xslt_set_encoding xslt_set_error_handler xslt_set_log xslt_set_sax_handler xslt_set_sax_handlers xslt_set_scheme_handler xslt_set_scheme_handlers contained
+syn keyword phpFunctions yaz_addinfo yaz_ccl_conf yaz_ccl_parse yaz_close yaz_connect yaz_database yaz_element yaz_errno yaz_error yaz_es_result yaz_get_option yaz_hits yaz_itemorder yaz_present yaz_range yaz_record yaz_scan_result yaz_scan yaz_schema yaz_search yaz_set_option yaz_sort yaz_syntax yaz_wait contained
+syn keyword phpFunctions zip_close zip_entry_close zip_entry_compressedsize zip_entry_compressionmethod zip_entry_filesize zip_entry_name zip_entry_open zip_entry_read zip_open zip_read contained
+syn keyword phpFunctions gzclose gzcompress gzdeflate gzencode gzeof gzfile gzgetc gzgets gzgetss gzinflate gzopen gzpassthru gzputs gzread gzrewind gzseek gztell gzuncompress gzwrite readgzfile zlib_get_coding_type contained
if exists( "php_baselib" )
- syn keyword phpMethods query next_record num_rows affected_rows nf f p np num_fields haltmsg seek link_id query_id metadata table_names nextid connect halt free register unregister is_registered delete url purl self_url pself_url hidden_session add_query padd_query reimport_get_vars reimport_post_vars reimport_cookie_vars set_container set_tokenname release_token put_headers get_id get_id put_id freeze thaw gc reimport_any_vars start url purl login_if is_authenticated auth_preauth auth_loginform auth_validatelogin auth_refreshlogin auth_registerform auth_doregister start check have_perm permsum perm_invalid contained
- syn keyword phpFunctions page_open page_close sess_load sess_save contained
+ syn keyword phpMethods query next_record num_rows affected_rows nf f p np num_fields haltmsg seek link_id query_id metadata table_names nextid connect halt free register unregister is_registered delete url purl self_url pself_url hidden_session add_query padd_query reimport_get_vars reimport_post_vars reimport_cookie_vars set_container set_tokenname release_token put_headers get_id get_id put_id freeze thaw gc reimport_any_vars start url purl login_if is_authenticated auth_preauth auth_loginform auth_validatelogin auth_refreshlogin auth_registerform auth_doregister start check have_perm permsum perm_invalid contained
+ syn keyword phpFunctions page_open page_close sess_load sess_save contained
endif
" Conditional
-syn keyword phpConditional declare else enddeclare endswitch elseif endif if switch contained
+syn keyword phpConditional declare else enddeclare endswitch elseif endif if switch contained
" Repeat
-syn keyword phpRepeat as do endfor endforeach endwhile for foreach while contained
+syn keyword phpRepeat as do endfor endforeach endwhile for foreach while contained
" Repeat
-syn keyword phpLabel case default switch contained
+syn keyword phpLabel case default switch contained
" Statement
-syn keyword phpStatement return break continue exit goto contained
+syn keyword phpStatement return break continue exit goto yield contained
" Keyword
-syn keyword phpKeyword var const contained
+syn keyword phpKeyword var const contained
" Type
-syn keyword phpType bool boolean int integer real double float string array object NULL contained
+syn keyword phpType bool boolean int integer real double float string array object NULL callable iterable contained
" Structure
-syn keyword phpStructure namespace extends implements instanceof parent self contained
+syn keyword phpStructure namespace extends implements instanceof parent self contained
" Operator
syn match phpOperator "[-=+%^&|*!.~?:]" contained display
-syn match phpOperator "[-+*/%^&|.]=" contained display
-syn match phpOperator "/[^*/]"me=e-1 contained display
-syn match phpOperator "\$" contained display
+syn match phpOperator "[-+*/%^&|.]=" contained display
+syn match phpOperator "/[^*/]"me=e-1 contained display
+syn match phpOperator "\$" contained display
syn match phpOperator "&&\|\<and\>" contained display
syn match phpOperator "||\|\<x\=or\>" contained display
syn match phpRelation "[!=<>]=" contained display
-syn match phpRelation "[<>]" contained display
-syn match phpMemberSelector "->" contained display
-syn match phpVarSelector "\$" contained display
+syn match phpRelation "[<>]" contained display
+syn match phpMemberSelector "->" contained display
+syn match phpVarSelector "\$" contained display
" Identifier
-syn match phpIdentifier "$\h\w*" contained contains=phpEnvVar,phpIntVar,phpVarSelector display
-syn match phpIdentifierSimply "${\h\w*}" contains=phpOperator,phpParent contained display
-syn region phpIdentifierComplex matchgroup=phpParent start="{\$"rs=e-1 end="}" contains=phpIdentifier,phpMemberSelector,phpVarSelector,phpIdentifierComplexP contained extend
-syn region phpIdentifierComplexP matchgroup=phpParent start="\[" end="]" contains=@phpClInside contained
+syn match phpIdentifier "$\h\w*" contained contains=phpEnvVar,phpIntVar,phpVarSelector display
+syn match phpIdentifierSimply "${\h\w*}" contains=phpOperator,phpParent contained display
+syn region phpIdentifierComplex matchgroup=phpParent start="{\$"rs=e-1 end="}" contains=phpIdentifier,phpMemberSelector,phpVarSelector,phpIdentifierComplexP contained extend
+syn region phpIdentifierComplexP matchgroup=phpParent start="\[" end="]" contains=@phpClInside contained
" Interpolated indentifiers (inside strings)
syn match phpBrackets "[][}{]" contained display
" errors
- syn match phpInterpSimpleError "\[[^]]*\]" contained display " fallback (if nothing else matches)
+ syn match phpInterpSimpleError "\[[^]]*\]" contained display " fallback (if nothing else matches)
syn match phpInterpSimpleError "->[^a-zA-Z_]" contained display
" make sure these stay above the correct DollarCurlies so they don't take priority
- syn match phpInterpBogusDollarCurley "${[^}]*}" contained display " fallback (if nothing else matches)
+ syn match phpInterpBogusDollarCurley "${[^}]*}" contained display " fallback (if nothing else matches)
syn match phpinterpSimpleBracketsInner "\w\+" contained
syn match phpInterpSimpleBrackets "\[\h\w*]" contained contains=phpBrackets,phpInterpSimpleBracketsInner
syn match phpInterpSimpleBrackets "\[\d\+]" contained contains=phpBrackets,phpInterpSimpleBracketsInner
@@ -317,7 +298,7 @@ syn region phpIdentifierComplexP matchgroup=phpParent start="\[" end="]" contai
syn match phpInterpSimple "\$\h\w*\(\[[^]]*\]\|->\h\w*\)\?" contained contains=phpInterpSimpleBrackets,phpIdentifier,phpInterpSimpleError,phpMethods,phpMemberSelector display
syn match phpInterpVarname "\h\w*" contained
syn match phpInterpMethodName "\h\w*" contained " default color
- syn match phpInterpSimpleCurly "\${\h\w*}" contains=phpInterpVarname contained extend
+ syn match phpInterpSimpleCurly "\${\h\w*}" contains=phpInterpVarname contained extend
syn region phpInterpDollarCurley1Helper matchgroup=phpParent start="{" end="\[" contains=phpInterpVarname contained
syn region phpInterpDollarCurly1 matchgroup=phpParent start="\${\h\w*\["rs=s+1 end="]}" contains=phpInterpDollarCurley1Helper,@phpClConst contained extend
@@ -337,28 +318,27 @@ syn region phpIdentifierComplexP matchgroup=phpParent start="\[" end="]" contai
syn match phpMethodsVar "->\h\w*" contained contains=phpMethods,phpMemberSelector display
" Include
-syn keyword phpInclude include require include_once require_once use contained
+syn keyword phpInclude include require include_once require_once use contained
-" Peter Hodge - added 'clone' keyword
" Define
syn keyword phpDefine new clone contained
" Boolean
-syn keyword phpBoolean true false contained
+syn keyword phpBoolean true false contained
" Number
syn match phpNumber "-\=\<\d\+\>" contained display
-syn match phpNumber "\<0x\x\{1,8}\>" contained display
+syn match phpNumber "\<0x\x\{1,8}\>" contained display
" Float
-syn match phpFloat "\(-\=\<\d+\|-\=\)\.\d\+\>" contained display
+syn match phpFloat "\(-\=\<\d+\|-\=\)\.\d\+\>" contained display
" Backslash escapes
syn case match
" for double quotes and heredoc
- syn match phpBackslashSequences "\\[fnrtv\\\"$]" contained display
- syn match phpBackslashSequences "\\\d\{1,3}" contained contains=phpOctalError display
- syn match phpBackslashSequences "\\x\x\{1,2}" contained display
+ syn match phpBackslashSequences "\\[fnrtv\\\"$]" contained display
+ syn match phpBackslashSequences "\\\d\{1,3}" contained contains=phpOctalError display
+ syn match phpBackslashSequences "\\x\x\{1,2}" contained display
" additional sequence for double quotes only
syn match phpBackslashDoubleQuote "\\[\"]" contained display
" for single quotes only
@@ -367,66 +347,57 @@ syn match phpFloat "\(-\=\<\d+\|-\=\)\.\d\+\>" contained display
" Error
-syn match phpOctalError "[89]" contained display
+syn match phpOctalError "[89]" contained display
if exists("php_parent_error_close")
- syn match phpParentError "[)\]}]" contained display
+ syn match phpParentError "[)\]}]" contained display
endif
" Todo
-syn keyword phpTodo todo fixme xxx contained
+syn keyword phpTodo todo fixme xxx contained
" Comment
if exists("php_parent_error_open")
- syn region phpComment start="/\*" end="\*/" contained contains=phpTodo
+ syn region phpComment start="/\*" end="\*/" contained contains=phpTodo,@Spell
else
- syn region phpComment start="/\*" end="\*/" contained contains=phpTodo extend
-endif
-if version >= 600
- syn match phpComment "#.\{-}\(?>\|$\)\@=" contained contains=phpTodo
- syn match phpComment "//.\{-}\(?>\|$\)\@=" contained contains=phpTodo
-else
- syn match phpComment "#.\{-}$" contained contains=phpTodo
- syn match phpComment "#.\{-}?>"me=e-2 contained contains=phpTodo
- syn match phpComment "//.\{-}$" contained contains=phpTodo
- syn match phpComment "//.\{-}?>"me=e-2 contained contains=phpTodo
+ syn region phpComment start="/\*" end="\*/" contained contains=phpTodo,@Spell extend
endif
+syn match phpComment "#.\{-}\(?>\|$\)\@=" contained contains=phpTodo,@Spell
+syn match phpComment "//.\{-}\(?>\|$\)\@=" contained contains=phpTodo,@Spell
" String
if exists("php_parent_error_open")
- syn region phpStringDouble matchgroup=phpStringDouble start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@phpAddStrings,phpBackslashSequences,phpBackslashDoubleQuote,@phpInterpDouble contained keepend
- syn region phpBacktick matchgroup=phpBacktick start=+`+ skip=+\\\\\|\\"+ end=+`+ contains=@phpAddStrings,phpIdentifier,phpBackslashSequences,phpIdentifierSimply,phpIdentifierComplex contained keepend
- syn region phpStringSingle matchgroup=phpStringSingle start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=@phpAddStrings,phpBackslashSingleQuote contained keepend
+ syn region phpStringDouble matchgroup=phpStringDouble start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@phpAddStrings,phpBackslashSequences,phpBackslashDoubleQuote,@phpInterpDouble,@Spell contained keepend
+ syn region phpBacktick matchgroup=phpBacktick start=+`+ skip=+\\\\\|\\"+ end=+`+ contains=@phpAddStrings,phpIdentifier,phpBackslashSequences,phpIdentifierSimply,phpIdentifierComplex contained keepend
+ syn region phpStringSingle matchgroup=phpStringSingle start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=@phpAddStrings,phpBackslashSingleQuote,@Spell contained keepend
else
- syn region phpStringDouble matchgroup=phpStringDouble start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@phpAddStrings,phpBackslashSequences,phpBackslashDoubleQuote,@phpInterpDouble contained extend keepend
- syn region phpBacktick matchgroup=phpBacktick start=+`+ skip=+\\\\\|\\"+ end=+`+ contains=@phpAddStrings,phpIdentifier,phpBackslashSequences,phpIdentifierSimply,phpIdentifierComplex contained extend keepend
- syn region phpStringSingle matchgroup=phpStringSingle start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=@phpAddStrings,phpBackslashSingleQuote contained keepend extend
+ syn region phpStringDouble matchgroup=phpStringDouble start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@phpAddStrings,phpBackslashSequences,phpBackslashDoubleQuote,@phpInterpDouble,@Spell contained extend keepend
+ syn region phpBacktick matchgroup=phpBacktick start=+`+ skip=+\\\\\|\\"+ end=+`+ contains=@phpAddStrings,phpIdentifier,phpBackslashSequences,phpIdentifierSimply,phpIdentifierComplex contained extend keepend
+ syn region phpStringSingle matchgroup=phpStringSingle start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=@phpAddStrings,phpBackslashSingleQuote,@Spell contained keepend extend
endif
" HereDoc and NowDoc
-if version >= 600
- syn case match
+syn case match
- " HereDoc
- syn region phpHereDoc matchgroup=Delimiter start="\(<<<\)\@<=\(\"\=\)\z(\I\i*\)\2$" end="^\z1\(;\=$\)\@=" contained contains=phpIdentifier,phpIdentifierSimply,phpIdentifierComplex,phpBackslashSequences,phpMethodsVar keepend extend
+" HereDoc
+syn region phpHereDoc matchgroup=Delimiter start="\(<<<\)\@<=\(\"\=\)\z(\I\i*\)\2$" end="^\z1\(;\=$\)\@=" contained contains=phpIdentifier,phpIdentifierSimply,phpIdentifierComplex,phpBackslashSequences,phpMethodsVar,@Spell keepend extend
" including HTML,JavaScript,SQL even if not enabled via options
- syn region phpHereDoc matchgroup=Delimiter start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(html\)\c\(\i*\)\)\2$" end="^\z1\(;\=$\)\@=" contained contains=@htmlTop,phpIdentifier,phpIdentifierSimply,phpIdentifierComplex,phpBackslashSequences,phpMethodsVar keepend extend
- syn region phpHereDoc matchgroup=Delimiter start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(sql\)\c\(\i*\)\)\2$" end="^\z1\(;\=$\)\@=" contained contains=@sqlTop,phpIdentifier,phpIdentifierSimply,phpIdentifierComplex,phpBackslashSequences,phpMethodsVar keepend extend
- syn region phpHereDoc matchgroup=Delimiter start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(javascript\)\c\(\i*\)\)\2$" end="^\z1\(;\=$\)\@=" contained contains=@htmlJavascript,phpIdentifierSimply,phpIdentifier,phpIdentifierComplex,phpBackslashSequences,phpMethodsVar keepend extend
+syn region phpHereDoc matchgroup=Delimiter start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(html\)\c\(\i*\)\)\2$" end="^\z1\(;\=$\)\@=" contained contains=@htmlTop,phpIdentifier,phpIdentifierSimply,phpIdentifierComplex,phpBackslashSequences,phpMethodsVar,@Spell keepend extend
+syn region phpHereDoc matchgroup=Delimiter start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(sql\)\c\(\i*\)\)\2$" end="^\z1\(;\=$\)\@=" contained contains=@sqlTop,phpIdentifier,phpIdentifierSimply,phpIdentifierComplex,phpBackslashSequences,phpMethodsVar,@Spell keepend extend
+syn region phpHereDoc matchgroup=Delimiter start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(javascript\)\c\(\i*\)\)\2$" end="^\z1\(;\=$\)\@=" contained contains=@htmlJavascript,phpIdentifierSimply,phpIdentifier,phpIdentifierComplex,phpBackslashSequences,phpMethodsVar,@Spell keepend extend
- " NowDoc
- syn region phpNowDoc matchgroup=Delimiter start="\(<<<\)\@<='\z(\I\i*\)'$" end="^\z1\(;\=$\)\@=" contained keepend extend
+" NowDoc
+syn region phpNowDoc matchgroup=Delimiter start="\(<<<\)\@<='\z(\I\i*\)'$" end="^\z1\(;\=$\)\@=" contained contains=@Spell keepend extend
" including HTML,JavaScript,SQL even if not enabled via options
- syn region phpNowDoc matchgroup=Delimiter start="\(<<<\)\@<='\z(\(\I\i*\)\=\(html\)\c\(\i*\)\)'$" end="^\z1\(;\=$\)\@=" contained contains=@htmlTop keepend extend
- syn region phpNowDoc matchgroup=Delimiter start="\(<<<\)\@<='\z(\(\I\i*\)\=\(sql\)\c\(\i*\)\)'$" end="^\z1\(;\=$\)\@=" contained contains=@sqlTop keepend extend
- syn region phpNowDoc matchgroup=Delimiter start="\(<<<\)\@<='\z(\(\I\i*\)\=\(javascript\)\c\(\i*\)\)'$" end="^\z1\(;\=$\)\@=" contained contains=@htmlJavascript keepend extend
- syn case ignore
-endif
+syn region phpNowDoc matchgroup=Delimiter start="\(<<<\)\@<='\z(\(\I\i*\)\=\(html\)\c\(\i*\)\)'$" end="^\z1\(;\=$\)\@=" contained contains=@htmlTop,@Spell keepend extend
+syn region phpNowDoc matchgroup=Delimiter start="\(<<<\)\@<='\z(\(\I\i*\)\=\(sql\)\c\(\i*\)\)'$" end="^\z1\(;\=$\)\@=" contained contains=@sqlTop,@Spell keepend extend
+syn region phpNowDoc matchgroup=Delimiter start="\(<<<\)\@<='\z(\(\I\i*\)\=\(javascript\)\c\(\i*\)\)'$" end="^\z1\(;\=$\)\@=" contained contains=@htmlJavascript,@Spell keepend extend
+syn case ignore
" Parent
if exists("php_parent_error_close") || exists("php_parent_error_open")
- syn match phpParent "[{}]" contained
- syn region phpParent matchgroup=Delimiter start="(" end=")" contained contains=@phpClInside transparent
- syn region phpParent matchgroup=Delimiter start="\[" end="\]" contained contains=@phpClInside transparent
+ syn match phpParent "[{}]" contained
+ syn region phpParent matchgroup=Delimiter start="(" end=")" contained contains=@phpClInside transparent
+ syn region phpParent matchgroup=Delimiter start="\[" end="\]" contained contains=@phpClInside transparent
if !exists("php_parent_error_close")
syn match phpParent "[\])]" contained
endif
@@ -434,73 +405,67 @@ else
syn match phpParent "[({[\]})]" contained
endif
-syn cluster phpClConst contains=phpFunctions,phpIdentifier,phpConditional,phpRepeat,phpStatement,phpOperator,phpRelation,phpStringSingle,phpStringDouble,phpBacktick,phpNumber,phpFloat,phpKeyword,phpType,phpBoolean,phpStructure,phpMethodsVar,phpConstant,phpCoreConstant,phpException
+syn cluster phpClConst contains=phpFunctions,phpIdentifier,phpConditional,phpRepeat,phpStatement,phpOperator,phpRelation,phpStringSingle,phpStringDouble,phpBacktick,phpNumber,phpFloat,phpKeyword,phpType,phpBoolean,phpStructure,phpMethodsVar,phpConstant,phpCoreConstant,phpException
syn cluster phpClInside contains=@phpClConst,phpComment,phpLabel,phpParent,phpParentError,phpInclude,phpHereDoc,phpNowDoc
syn cluster phpClFunction contains=@phpClInside,phpDefine,phpParentError,phpStorageClass
-syn cluster phpClTop contains=@phpClFunction,phpFoldFunction,phpFoldClass,phpFoldInterface,phpFoldTry,phpFoldCatch
+syn cluster phpClTop contains=@phpClFunction,phpFoldFunction,phpFoldClass,phpFoldInterface,phpFoldTry,phpFoldCatch
" Php Region
if exists("php_parent_error_open")
if exists("php_noShortTags")
- syn region phpRegion matchgroup=Delimiter start="<?php" end="?>" contains=@phpClTop
+ syn region phpRegion matchgroup=Delimiter start="<?php" end="?>" contains=@phpClTop
else
- syn region phpRegion matchgroup=Delimiter start="<?\(php\)\=" end="?>" contains=@phpClTop
+ syn region phpRegion matchgroup=Delimiter start="<?\(php\)\=" end="?>" contains=@phpClTop
endif
- syn region phpRegionSc matchgroup=Delimiter start=+<script language="php">+ end=+</script>+ contains=@phpClTop
+ syn region phpRegionSc matchgroup=Delimiter start=+<script language="php">+ end=+</script>+ contains=@phpClTop
if exists("php_asp_tags")
- syn region phpRegionAsp matchgroup=Delimiter start="<%\(=\)\=" end="%>" contains=@phpClTop
+ syn region phpRegionAsp matchgroup=Delimiter start="<%\(=\)\=" end="%>" contains=@phpClTop
endif
else
if exists("php_noShortTags")
- syn region phpRegion matchgroup=Delimiter start="<?php" end="?>" contains=@phpClTop keepend
+ syn region phpRegion matchgroup=Delimiter start="<?php" end="?>" contains=@phpClTop keepend
else
- syn region phpRegion matchgroup=Delimiter start="<?\(php\)\=" end="?>" contains=@phpClTop keepend
+ syn region phpRegion matchgroup=Delimiter start="<?\(php\)\=" end="?>" contains=@phpClTop keepend
endif
- syn region phpRegionSc matchgroup=Delimiter start=+<script language="php">+ end=+</script>+ contains=@phpClTop keepend
+ syn region phpRegionSc matchgroup=Delimiter start=+<script language="php">+ end=+</script>+ contains=@phpClTop keepend
if exists("php_asp_tags")
- syn region phpRegionAsp matchgroup=Delimiter start="<%\(=\)\=" end="%>" contains=@phpClTop keepend
+ syn region phpRegionAsp matchgroup=Delimiter start="<%\(=\)\=" end="%>" contains=@phpClTop keepend
endif
endif
" Fold
if exists("php_folding") && php_folding==1
" match one line constructs here and skip them at folding
- syn keyword phpSCKeyword abstract final private protected public static contained
- syn keyword phpFCKeyword function contained
- syn keyword phpStorageClass global contained
- syn match phpDefine "\(\s\|^\)\(abstract\s\+\|final\s\+\|private\s\+\|protected\s\+\|public\s\+\|static\s\+\)*function\(\s\+.*[;}]\)\@=" contained contains=phpSCKeyword
- syn match phpStructure "\(\s\|^\)\(abstract\s\+\|final\s\+\)*class\(\s\+.*}\)\@=" contained
- syn match phpStructure "\(\s\|^\)interface\(\s\+.*}\)\@=" contained
- syn match phpException "\(\s\|^\)try\(\s\+.*}\)\@=" contained
- syn match phpException "\(\s\|^\)catch\(\s\+.*}\)\@=" contained
-
- set foldmethod=syntax
- syn region phpFoldHtmlInside matchgroup=Delimiter start="?>" end="<?\(php\)\=" contained transparent contains=@htmlTop
- syn region phpFoldFunction matchgroup=Storageclass start="^\z(\s*\)\(abstract\s\+\|final\s\+\|private\s\+\|protected\s\+\|public\s\+\|static\s\+\)*function\s\([^};]*$\)\@="rs=e-9 matchgroup=Delimiter end="^\z1}" contains=@phpClFunction,phpFoldHtmlInside,phpFCKeyword contained transparent fold extend
- syn region phpFoldFunction matchgroup=Define start="^function\s\([^};]*$\)\@=" matchgroup=Delimiter end="^}" contains=@phpClFunction,phpFoldHtmlInside contained transparent fold extend
- syn region phpFoldClass matchgroup=Structure start="^\z(\s*\)\(abstract\s\+\|final\s\+\)*class\s\+\([^}]*$\)\@=" matchgroup=Delimiter end="^\z1}" contains=@phpClFunction,phpFoldFunction,phpSCKeyword contained transparent fold extend
- syn region phpFoldInterface matchgroup=Structure start="^\z(\s*\)interface\s\+\([^}]*$\)\@=" matchgroup=Delimiter end="^\z1}" contains=@phpClFunction,phpFoldFunction contained transparent fold extend
- syn region phpFoldCatch matchgroup=Exception start="^\z(\s*\)catch\s\+\([^}]*$\)\@=" matchgroup=Delimiter end="^\z1}" contains=@phpClFunction,phpFoldFunction contained transparent fold extend
- syn region phpFoldTry matchgroup=Exception start="^\z(\s*\)try\s\+\([^}]*$\)\@=" matchgroup=Delimiter end="^\z1}" contains=@phpClFunction,phpFoldFunction contained transparent fold extend
-elseif exists("php_folding") && php_folding==2
- syn keyword phpDefine function contained
- syn keyword phpStructure abstract class interface contained
- syn keyword phpException catch throw try contained
- syn keyword phpStorageClass final global private protected public static contained
-
- set foldmethod=syntax
- syn region phpFoldHtmlInside matchgroup=Delimiter start="?>" end="<?\(php\)\=" contained transparent contains=@htmlTop
- syn region phpParent matchgroup=Delimiter start="{" end="}" contained contains=@phpClFunction,phpFoldHtmlInside transparent fold
+ syn keyword phpSCKeyword abstract final private protected public static contained
+ syn keyword phpFCKeyword function contained
+ syn keyword phpStorageClass global contained
+ syn match phpDefine "\(\s\|^\)\(abstract\s\+\|final\s\+\|private\s\+\|protected\s\+\|public\s\+\|static\s\+\)*function\(\s\+.*[;}]\)\@=" contained contains=phpSCKeyword
+ syn match phpStructure "\(\s\|^\)\(abstract\s\+\|final\s\+\)*\(trait\|class\)\(\s\+.*}\)\@=" contained
+ syn match phpStructure "\(\s\|^\)interface\(\s\+.*}\)\@=" contained
+ syn match phpException "\(\s\|^\)try\(\s\+.*}\)\@=" contained
+ syn match phpException "\(\s\|^\)catch\(\s\+.*}\)\@=" contained
+ syn match phpException "\(\s\|^\)finally\(\s\+.*}\)\@=" contained
+
+ setlocal foldmethod=syntax
+ syn region phpFoldHtmlInside matchgroup=Delimiter start="?>" end="<?\(php\)\=" contained transparent contains=@htmlTop
+ syn region phpFoldFunction matchgroup=Storageclass start="^\z(\s*\)\(abstract\s\+\|final\s\+\|private\s\+\|protected\s\+\|public\s\+\|static\s\+\)*function\s\([^};]*$\)\@="rs=e-9 matchgroup=Delimiter end="^\z1}" contains=@phpClFunction,phpFoldHtmlInside,phpFCKeyword contained transparent fold extend
+ syn region phpFoldFunction matchgroup=Define start="^function\s\([^};]*$\)\@=" matchgroup=Delimiter end="^}" contains=@phpClFunction,phpFoldHtmlInside contained transparent fold extend
+ syn region phpFoldClass matchgroup=Structure start="^\z(\s*\)\(abstract\s\+\|final\s\+\)*\(trait\|class\)\s\+\([^}]*$\)\@=" matchgroup=Delimiter end="^\z1}" contains=@phpClFunction,phpFoldFunction,phpSCKeyword contained transparent fold extend
+ syn region phpFoldInterface matchgroup=Structure start="^\z(\s*\)interface\s\+\([^}]*$\)\@=" matchgroup=Delimiter end="^\z1}" contains=@phpClFunction,phpFoldFunction contained transparent fold extend
+ syn region phpFoldCatch matchgroup=Exception start="^\z(\s*\)catch\s\+\([^}]*$\)\@=" matchgroup=Delimiter end="^\z1}" contains=@phpClFunction,phpFoldFunction contained transparent fold extend
+ syn region phpFoldTry matchgroup=Exception start="^\z(\s*\)try\s\+\([^}]*$\)\@=" matchgroup=Delimiter end="^\z1}" contains=@phpClFunction,phpFoldFunction contained transparent fold extend
else
- syn keyword phpDefine function contained
- syn keyword phpStructure abstract class interface contained
- syn keyword phpException catch throw try contained
- syn keyword phpStorageClass final global private protected public static contained
+ syn keyword phpDefine function contained
+ syn keyword phpStructure abstract class trait interface contained
+ syn keyword phpException catch throw try finally contained
+ syn keyword phpStorageClass final global private protected public static contained
+ if exists("php_folding") && php_folding==2
+ setlocal foldmethod=syntax
+ syn region phpFoldHtmlInside matchgroup=Delimiter start="?>" end="<?\(php\)\=" contained transparent contains=@htmlTop
+ syn region phpParent matchgroup=Delimiter start="{" end="}" contained contains=@phpClFunction,phpFoldHtmlInside transparent fold
+ endif
endif
-" TODO: fold on "trait". For now just make sure it gets colored:
-syn keyword phpStructure trait
-
" ================================================================
" Peter Hodge - June 9, 2006
" Some of these changes (highlighting isset/unset/echo etc) are not so
@@ -515,11 +480,11 @@ syntax keyword phpStatement die contained
" Highlighting for PHP5's user-definable magic class methods
syntax keyword phpSpecialFunction containedin=ALLBUT,phpComment,phpStringDouble,phpStringSingle,phpIdentifier
- \ __construct __destruct __call __callStatic __get __set __isset __unset __sleep __wakeup __toString __invoke __set_state __clone __debugInfo
+ \ __construct __destruct __call __callStatic __get __set __isset __unset __sleep __wakeup __toString __invoke __set_state __clone __debugInfo
" Highlighting for __autoload slightly different from line above
syntax keyword phpSpecialFunction containedin=ALLBUT,phpComment,phpStringDouble,phpStringSingle,phpIdentifier,phpMethodsVar
\ __autoload
-highlight link phpSpecialFunction phpOperator
+hi def link phpSpecialFunction phpOperator
" Highlighting for PHP5's built-in classes
" - built-in classes harvested from get_declared_classes() in 5.1.4
@@ -542,42 +507,42 @@ syntax keyword phpClasses containedin=ALLBUT,phpComment,phpStringDouble,phpStrin
\ DOMCharacterData DOMAttr DOMElement DOMText DOMComment DOMTypeinfo DOMUserDataHandler
\ DOMLocator DOMConfiguration DOMCdataSection DOMDocumentType DOMNotation DOMEntity
\ DOMEntityReference DOMProcessingInstruction DOMStringExtend DOMXPath
-highlight link phpClasses phpFunctions
+hi def link phpClasses phpFunctions
" Highlighting for PHP5's built-in interfaces
" - built-in classes harvested from get_declared_interfaces() in 5.1.4
syntax keyword phpInterfaces containedin=ALLBUT,phpComment,phpStringDouble,phpStringSingle,phpIdentifier,phpMethodsVar
\ Iterator IteratorAggregate RecursiveIterator OuterIterator SeekableIterator
\ Traversable ArrayAccess Serializable Countable SplObserver SplSubject Reflector
-highlight link phpInterfaces phpConstant
+hi def link phpInterfaces phpConstant
" option defaults:
if ! exists('php_special_functions')
- let php_special_functions = 1
+ let php_special_functions = 1
endif
if ! exists('php_alt_comparisons')
- let php_alt_comparisons = 1
+ let php_alt_comparisons = 1
endif
if ! exists('php_alt_assignByReference')
- let php_alt_assignByReference = 1
+ let php_alt_assignByReference = 1
endif
if php_special_functions
- " Highlighting for PHP built-in functions which exhibit special behaviours
- " - isset()/unset()/empty() are not real functions.
- " - compact()/extract() directly manipulate variables in the local scope where
- " regular functions would not be able to.
- " - eval() is the token 'make_your_code_twice_as_complex()' function for PHP.
- " - user_error()/trigger_error() can be overloaded by set_error_handler and also
- " have the capacity to terminate your script when type is E_USER_ERROR.
- syntax keyword phpSpecialFunction containedin=ALLBUT,phpComment,phpStringDouble,phpStringSingle
+ " Highlighting for PHP built-in functions which exhibit special behaviours
+ " - isset()/unset()/empty() are not real functions.
+ " - compact()/extract() directly manipulate variables in the local scope where
+ " regular functions would not be able to.
+ " - eval() is the token 'make_your_code_twice_as_complex()' function for PHP.
+ " - user_error()/trigger_error() can be overloaded by set_error_handler and also
+ " have the capacity to terminate your script when type is E_USER_ERROR.
+ syntax keyword phpSpecialFunction containedin=ALLBUT,phpComment,phpStringDouble,phpStringSingle
\ user_error trigger_error isset unset eval extract compact empty
endif
if php_alt_assignByReference
- " special highlighting for '=&' operator
- syntax match phpAssignByRef /=\s*&/ containedin=ALLBUT,phpComment,phpStringDouble,phpStringSingle
- highlight link phpAssignByRef Type
+ " special highlighting for '=&' operator
+ syntax match phpAssignByRef /=\s*&/ containedin=ALLBUT,phpComment,phpStringDouble,phpStringSingle
+ hi def link phpAssignByRef Type
endif
if php_alt_comparisons
@@ -589,7 +554,7 @@ if php_alt_comparisons
syntax case ignore
syntax keyword phpComparison instanceof contained containedin=phpRegion
- hi link phpComparison Statement
+ hi def link phpComparison Statement
endif
" ================================================================
@@ -615,88 +580,78 @@ else
exec "syn sync fromstart"
endif
-syntax match phpDocCustomTags "@[a-zA-Z]*\(\s\+\|\n\|\r\)" containedin=phpComment
-syntax region phpDocTags start="{@\(example\|id\|internal\|inheritdoc\|link\|source\|toc\|tutorial\)" end="}" containedin=phpComment
-syntax match phpDocTags "@\(abstract\|access\|author\|category\|copyright\|deprecated\|example\|final\|global\|ignore\|internal\|license\|link\|method\|name\|package\|param\|property\|return\|see\|since\|static\|staticvar\|subpackage\|tutorial\|uses\|var\|version\|contributor\|modified\|filename\|description\|filesource\|throws\)\(\s\+\)\?" containedin=phpComment
-syntax match phpDocTodo "@\(todo\|fixme\|xxx\)\(\s\+\)\?" containedin=phpComment
+syntax match phpDocCustomTags "@[a-zA-Z]*\(\s\+\|\n\|\r\)" containedin=phpComment
+syntax region phpDocTags start="{@\(example\|id\|internal\|inheritdoc\|link\|source\|toc\|tutorial\)" end="}" containedin=phpComment
+syntax match phpDocTags "@\(abstract\|access\|author\|category\|copyright\|deprecated\|example\|final\|global\|ignore\|internal\|license\|link\|method\|name\|package\|param\|property\|return\|see\|since\|static\|staticvar\|subpackage\|tutorial\|uses\|var\|version\|contributor\|modified\|filename\|description\|filesource\|throws\)\(\s\+\)\?" containedin=phpComment
+syntax match phpDocTodo "@\(todo\|fixme\|xxx\)\(\s\+\)\?" containedin=phpComment
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_php_syn_inits")
- if version < 508
- let did_php_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink phpConstant Constant
- HiLink phpCoreConstant Constant
- HiLink phpComment Comment
- HiLink phpDocTags PreProc
- HiLink phpDocCustomTags Type
- HiLink phpException Exception
- HiLink phpBoolean Boolean
- HiLink phpStorageClass StorageClass
- HiLink phpSCKeyword StorageClass
- HiLink phpFCKeyword Define
- HiLink phpStructure Structure
- HiLink phpStringSingle String
- HiLink phpStringDouble String
- HiLink phpBacktick String
- HiLink phpNumber Number
- HiLink phpFloat Float
- HiLink phpMethods Function
- HiLink phpFunctions Function
- HiLink phpBaselib Function
- HiLink phpRepeat Repeat
- HiLink phpConditional Conditional
- HiLink phpLabel Label
- HiLink phpStatement Statement
- HiLink phpKeyword Statement
- HiLink phpType Type
- HiLink phpInclude Include
- HiLink phpDefine Define
- HiLink phpBackslashSequences SpecialChar
- HiLink phpBackslashDoubleQuote SpecialChar
- HiLink phpBackslashSingleQuote SpecialChar
- HiLink phpParent Delimiter
- HiLink phpBrackets Delimiter
- HiLink phpIdentifierConst Delimiter
- HiLink phpParentError Error
- HiLink phpOctalError Error
- HiLink phpInterpSimpleError Error
- HiLink phpInterpBogusDollarCurley Error
- HiLink phpInterpDollarCurly1 Error
- HiLink phpInterpDollarCurly2 Error
- HiLink phpInterpSimpleBracketsInner String
- HiLink phpInterpSimpleCurly Delimiter
- HiLink phpInterpVarname Identifier
- HiLink phpTodo Todo
- HiLink phpDocTodo Todo
- HiLink phpMemberSelector Structure
- if exists("php_oldStyle")
- hi phpIntVar guifg=Red ctermfg=DarkRed
- hi phpEnvVar guifg=Red ctermfg=DarkRed
- hi phpOperator guifg=SeaGreen ctermfg=DarkGreen
- hi phpVarSelector guifg=SeaGreen ctermfg=DarkGreen
- hi phpRelation guifg=SeaGreen ctermfg=DarkGreen
- hi phpIdentifier guifg=DarkGray ctermfg=Brown
- hi phpIdentifierSimply guifg=DarkGray ctermfg=Brown
- else
- HiLink phpIntVar Identifier
- HiLink phpEnvVar Identifier
- HiLink phpOperator Operator
- HiLink phpVarSelector Operator
- HiLink phpRelation Operator
- HiLink phpIdentifier Identifier
- HiLink phpIdentifierSimply Identifier
- endif
-
- delcommand HiLink
+" Only when an item doesn't have highlighting yet
+
+hi def link phpConstant Constant
+hi def link phpCoreConstant Constant
+hi def link phpComment Comment
+hi def link phpDocTags PreProc
+hi def link phpDocCustomTags Type
+hi def link phpException Exception
+hi def link phpBoolean Boolean
+hi def link phpStorageClass StorageClass
+hi def link phpSCKeyword StorageClass
+hi def link phpFCKeyword Define
+hi def link phpStructure Structure
+hi def link phpStringSingle String
+hi def link phpStringDouble String
+hi def link phpBacktick String
+hi def link phpNumber Number
+hi def link phpFloat Float
+hi def link phpMethods Function
+hi def link phpFunctions Function
+hi def link phpBaselib Function
+hi def link phpRepeat Repeat
+hi def link phpConditional Conditional
+hi def link phpLabel Label
+hi def link phpStatement Statement
+hi def link phpKeyword Statement
+hi def link phpType Type
+hi def link phpInclude Include
+hi def link phpDefine Define
+hi def link phpBackslashSequences SpecialChar
+hi def link phpBackslashDoubleQuote SpecialChar
+hi def link phpBackslashSingleQuote SpecialChar
+hi def link phpParent Delimiter
+hi def link phpBrackets Delimiter
+hi def link phpIdentifierConst Delimiter
+hi def link phpParentError Error
+hi def link phpOctalError Error
+hi def link phpInterpSimpleError Error
+hi def link phpInterpBogusDollarCurley Error
+hi def link phpInterpDollarCurly1 Error
+hi def link phpInterpDollarCurly2 Error
+hi def link phpInterpSimpleBracketsInner String
+hi def link phpInterpSimpleCurly Delimiter
+hi def link phpInterpVarname Identifier
+hi def link phpTodo Todo
+hi def link phpDocTodo Todo
+hi def link phpMemberSelector Structure
+if exists("php_oldStyle")
+ hi def phpIntVar guifg=Red ctermfg=DarkRed
+ hi def phpEnvVar guifg=Red ctermfg=DarkRed
+ hi def phpOperator guifg=SeaGreen ctermfg=DarkGreen
+ hi def phpVarSelector guifg=SeaGreen ctermfg=DarkGreen
+ hi def phpRelation guifg=SeaGreen ctermfg=DarkGreen
+ hi def phpIdentifier guifg=DarkGray ctermfg=Brown
+ hi def phpIdentifierSimply guifg=DarkGray ctermfg=Brown
+else
+ hi def link phpIntVar Identifier
+ hi def link phpEnvVar Identifier
+ hi def link phpOperator Operator
+ hi def link phpVarSelector Operator
+ hi def link phpRelation Operator
+ hi def link phpIdentifier Identifier
+ hi def link phpIdentifierSimply Identifier
endif
+
let b:current_syntax = "php"
if main_syntax == 'php'
diff --git a/runtime/syntax/pic.vim b/runtime/syntax/pic.vim
index adc964ea96..bcb01f4dbd 100644
--- a/runtime/syntax/pic.vim
+++ b/runtime/syntax/pic.vim
@@ -5,11 +5,8 @@
" URL: http://galeb.etf.bg.ac.yu/~alexa/vim/syntax/pic.vim
" Revision: 1.01
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -91,36 +88,26 @@ syn match picDirective "#\=DEFINE"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_pic16f84_syntax_inits")
- if version < 508
- let did_pic16f84_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink picTodo Todo
- HiLink picComment Comment
- HiLink picDirective Statement
- HiLink picLabel Label
- HiLink picString String
-
- "HiLink picOpcode Keyword
- "HiLink picRegister Structure
- "HiLink picRegisterPart Special
-
- HiLink picASCII String
- HiLink picBinary Number
- HiLink picDecimal Number
- HiLink picHexadecimal Number
- HiLink picOctal Number
-
- HiLink picIdentifier Identifier
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link picTodo Todo
+hi def link picComment Comment
+hi def link picDirective Statement
+hi def link picLabel Label
+hi def link picString String
+
+"hi def link picOpcode Keyword
+"hi def link picRegister Structure
+"hi def link picRegisterPart Special
+
+hi def link picASCII String
+hi def link picBinary Number
+hi def link picDecimal Number
+hi def link picHexadecimal Number
+hi def link picOctal Number
+
+hi def link picIdentifier Identifier
+
let b:current_syntax = "pic"
diff --git a/runtime/syntax/pike.vim b/runtime/syntax/pike.vim
index efbafd5d82..2c34cb4f38 100644
--- a/runtime/syntax/pike.vim
+++ b/runtime/syntax/pike.vim
@@ -1,62 +1,184 @@
" Vim syntax file
-" Language: Pike
-" Maintainer: Francesco Chemolli <kinkie@kame.usr.dsi.unimi.it>
-" Last Change: 2001 May 10
-
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" Language: Pike
+" Maintainer: Stephen R. van den Berg <srb@cuci.nl>
+" Maintainer of previous implementation: Francesco Chemolli <kinkie@kame.usr.dsi.unimi.it>
+" Last Change: 2018 Jan 28
+" Version: 2.9
+" Remark: Derived from the C-syntax; fixed several bugs in the C-syntax
+" Remark: and extended it with the Pike syntax.
+" Remark: Includes a highlighter for all Pike types of parenthesis errors.
+" Remark: Includes a highlighter for SQL on multiline strings.
+" Remark: Includes a highlighter for any embedded Autodoc format.
+
+" Quit when a (custom) syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
-" A bunch of useful C keywords
-syn keyword pikeStatement goto break return continue
-syn keyword pikeLabel case default
-syn keyword pikeConditional if else switch
-syn keyword pikeRepeat while for foreach do
-syn keyword pikeStatement gauge destruct lambda inherit import typeof
-syn keyword pikeException catch
-syn keyword pikeType inline nomask private protected public static
+let s:cpo_save = &cpo
+set cpo&vim
+
+" For multiline strings, try formatting them as SQL
+syn include @pikeSQL <sfile>:p:h/sqloracle.vim
+unlet b:current_syntax
+
+" For embedded Autodoc documentation (WIP)
+syn include @pikeAutodoc <sfile>:p:h/autodoc.vim
+unlet b:current_syntax
+
+syn case match
+
+" Supports array, multiset, mapping multi-character delimiter matching
+" Supports rotating amongst several same-level preprocessor conditionals
+packadd! matchit
+let b:match_words = "({:}\\@1<=),(\\[:]\\@1<=),(<:>\\@1<=),^\s*#\s*\%(if\%(n\?def\)\|else\|el\%(se\)\?if\|endif\)\>"
+
+" A bunch of useful Pike keywords
+syn keyword pikeDebug gauge backtrace describe_backtrace werror _Static_assert static_assert
+syn keyword pikeException error catch throw
+syn keyword pikeLabel case default break return continue
+syn keyword pikeConditional if else switch
+syn keyword pikeRepeat while for foreach do
+syn keyword pikePredef RegGetKeyNames RegGetValue RegGetValues
+syn keyword pikePredef __automap__ __empty_program
+syn keyword pikePredef __handle_sprintf_format __parse_pike_type _disable_threads
+syn keyword pikePredef _do_call_outs _exit _gdb_breakpoint
+syn keyword pikePredef abs access acos acosh add_constant alarm all_constants
+syn keyword pikePredef array_sscanf asin asinh atan atan2 atanh atexit
+syn keyword pikePredef basetype call_function call_out call_out_info cd ceil
+syn keyword pikePredef combine_path combine_path_nt
+syn keyword pikePredef combine_path_unix compile copy_value cos cosh cpp crypt
+syn keyword pikePredef ctime decode_value delay encode_value encode_value_canonic
+syn keyword pikePredef enumerate errno exece exit exp file_stat file_truncate
+syn keyword pikePredef filesystem_stat find_call_out floor fork function_name
+syn keyword pikePredef function_object function_program gc
+syn keyword pikePredef get_active_compilation_handler get_active_error_handler
+syn keyword pikePredef get_all_groups get_all_users get_dir get_groups_for_user
+syn keyword pikePredef get_iterator get_profiling_info get_weak_flag getcwd
+syn keyword pikePredef getgrgid getgrnam gethrdtime gethrtime gethrvtime getpid
+syn keyword pikePredef getpwnam getpwuid getxattr glob gmtime has_index has_prefix
+syn keyword pikePredef has_suffix has_value hash hash_7_0 hash_7_4 hash_8_0
+syn keyword pikePredef hash_value kill limit listxattr load_module localtime
+syn keyword pikePredef log lower_case master max min mkdir mktime mv
+syn keyword pikePredef object_program pow query_num_arg random_seed
+syn keyword pikePredef remove_call_out removexattr replace_master rm round
+syn keyword pikePredef set_priority set_weak_flag setxattr sgn signal signame
+syn keyword pikePredef signum sin sinh sleep sort sprintf sqrt sscanf strerror
+syn keyword pikePredef string_filter_non_unicode string_to_unicode string_to_utf8
+syn keyword pikePredef tan tanh time trace types ualarm unicode_to_string
+syn keyword pikePredef upper_case utf8_to_string version
-syn keyword pikeTodo contained TODO FIXME XXX
+syn keyword pikePredef write lock try_lock
+syn keyword pikePredef MutexKey Timestamp Date Time TimeTZ Interval Inet Range
+syn keyword pikePredef Null null inf nan
+
+syn keyword pikeTodo contained TODO FIXME XXX
+
+" Match parengroups: allows for highlighting indices of mappings and
+" highlighting semicolons that are out of place due to a paren imbalance
+syn cluster pikePreShort contains=pikeDefine,pikePreProc,pikeCppOutWrapper,pikeCppInWrapper,pikePreCondit,pikePreConditMatch
+syn cluster pikeExprGroup contains=pikeMappIndex,@pikeStmt,pikeNest,@pikeBadGroup,pikeSoftCast
+syn match pikeWord transparent contained /[^()'"[\]{},;:]\+/ contains=ALLBUT,@pikePreProcGroup,@pikeExprGroup
+syn match pikeFirstWord transparent display contained /^\s*#[^()'"[\]{},;:]\+/ contains=@pikePreShort
+syn cluster pikeMappElm contains=pikeMappIndex,@pikeStmt
+syn cluster pikeStmt contains=pikeFirstWord,pikeCharacter,pikeString,pikeMlString,pikeWord,pikeNest
+syn cluster pikeBadGroup contains=pikeBadPClose,pikeBadAClose,pikeBadBClose,pikeBadSPClose,pikeBadSAClose,pikeBadSBClose,pikeBadSClose,pikeBadSPAClose,pikeBadSBAClose
+syn match pikeBadPClose display contained "[}\]]"
+syn match pikeBadAClose display contained "[)\]]"
+syn match pikeBadBClose display contained "[)}]"
+syn match pikeBadSPClose display contained "[;}\]]"
+syn match pikeBadSAClose display contained "[;)\]]"
+syn match pikeBadSPAClose display contained "[;\]]"
+syn match pikeBadSBAClose display contained "[;}]"
+syn match pikeBadSClose display contained "[;)}\]]"
+syn region pikeNest transparent start="(\@1<!{" end="}" contains=@pikeStmt,pikeUserLabel,pikeBadAClose
+syn region pikeNest transparent start="\%(\<for\%(each\)\?\s\?\)\@8<!([[{<]\@!" end=")" contains=@pikeStmt,pikeBadSPClose
+syn region pikeNest transparent start="\%(\<for\%(each\)\?\s\?\)\@8<=(" end=")" contains=@pikeStmt,pikeBadPClose
+syn region pikeNest transparent start="(\@1<!\[" end="]" contains=@pikeStmt,pikeBadSBClose
+syn region pikeNest transparent start="(\zs\[" end="])" contains=@pikeMappElm,pikeBadSBAClose
+" For some reason specifying a matchgroup on the pikeNest below makes it
+" override the shorter variant; consider it a kludge, no idea why it works
+syn region pikeNest transparent matchgroup=pikeSoftCast start=%(\zs\[[ \t\v\r\n.a-zA-Z0-9_():,|]\+])\@!% end=")" contains=@pikeStmt
+syn region pikeNest transparent start="(\zs{" end="})" contains=@pikeStmt,pikeBadSPAClose
+syn region pikeNest transparent start="(\zs<" end=">)" contains=@pikeStmt,pikeBadSPClose keepend
+
+" It's easy to accidentally add a space after a backslash that was intended
+" for line continuation. Some compilers allow it, which makes it
+" unpredictable and should be avoided.
+syn match pikeBadContinuation contained "\\\s\+$"
+
+" pikeCommentGroup allows adding matches for special things in comments
+syn cluster pikeCommentGroup contains=pikeTodo,pikeBadContinuation
" String and Character constants
" Highlight special characters (those which have a backslash) differently
-syn match pikeSpecial contained "\\[0-7][0-7][0-7]\=\|\\."
-syn region pikeString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=pikeSpecial
-syn match pikeCharacter "'[^\\]'"
-syn match pikeSpecialCharacter "'\\.'"
-syn match pikeSpecialCharacter "'\\[0-7][0-7]'"
-syn match pikeSpecialCharacter "'\\[0-7][0-7][0-7]'"
-
-" Compound data types
-syn region pikeCompoundType start='({' contains=pikeString,pikeCompoundType,pikeNumber,pikeFloat end='})'
-syn region pikeCompoundType start='(\[' contains=pikeString,pikeCompoundType,pikeNumber,pikeFloat end='\])'
-syn region pikeCompoundType start='(<' contains=pikeString,pikeCompoundType,pikeNumber,pikeFloat end='>)'
-
-"catch errors caused by wrong parenthesis
-syn region pikeParen transparent start='([^{[<(]' end=')' contains=ALLBUT,pikeParenError,pikeIncluded,pikeSpecial,pikeTodo,pikeUserLabel,pikeBitField
-syn match pikeParenError ")"
-syn match pikeInParen contained "[^(][{}][^)]"
+syn match pikeSpecial display contained "\\\%(x\x*\|d\d*\|\o\+\|u\x\{4}\|U\x\{8}\|[abefnrtv]\|$\)"
+
+" ISO C11 or ISO C++ 11
+if !exists("c_no_cformat")
+ " Highlight % items in strings.
+ syn match pikeFormat display "%\%(\d\+\$\)\=[-+' #0*]*\%(\d*\|\*\|\*\d\+\$\)\%(\.\%(\d*\|\*\|\*\d\+\$\)\)\=\%([hlLjzt]\|ll\|hh\)\=\%([aAbdiuoxXDOUfFeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained
+ syn match pikeFormat display "%%" contained
+ syn region pikeString start=+"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=pikeSpecial,pikeDelimiterDQ,pikeFormat,@Spell keepend
+ syn region pikeMlString start=+#"+ skip=+\\\\\|\\"+ end=+"+ contains=pikeSpecial,pikeFormat,pikeDelimiterDQ,@Spell,pikeEmbeddedString keepend
+else
+ syn region pikeString start=+"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=pikeSpecial,pikeDelimiterDQ,@Spell
+ syn region pikeMlString transparent start=+#"+ skip=+\\\\\|\\"+ end=+"+ contains=pikeSpecial,pikeDelimiterDQ,@Spell,pikeEmbeddedString keepend
+endif
+
+" Use SQL-syntax highlighting in multiline string if it starts with
+" a standard SQL keyword
+syn case ignore
+" FIXME Use explicit newline match to cover up a bug in the regexp engine
+" If the kludge is not used, the match will only start unless at least a space
+" follows the initial doublequote on the first line (or the keyword is on
+" the first line).
+syn region pikeEmbeddedString contained start=+\%(#"\n\?\)\@2<=\_s*\%(SELECT\|INSERT\|UPDATE\|DELETE\|WITH\|CREATE\|DROP\|ALTER\)\>+ skip=+\\\\\|\\"+ end=+[\\#]\@1<!"+ contains=@pikeSQL,pikeBindings keepend
+syn case match
+
+syn match pikeBindings display contained ":\@1<!:\I\i*"
+
+syn match pikeCharacter "'[^\\']'" contains=pikeDelimiterSQ
+syn match pikeCharacter "'[^']*'" contains=pikeSpecial,pikeDelimiterSQ
+syn match pikeSpecialError "'\\[^'\"?\\abefnrtv]'"
+syn match pikeDelimiterDQ display +"+ contained
+syn match pikeDelimiterSQ display +'+ contained
+
+"when wanted, highlight trailing white space
+if exists("c_space_errors")
+ if !exists("c_no_trail_space_error")
+ syn match pikeSpaceError display excludenl "\s\+$"
+ endif
+ if !exists("c_no_tab_space_error")
+ syn match pikeSpaceError display " \+\ze\t"
+ endif
+endif
"integer number, or floating point number without a dot and with "f".
syn case ignore
-syn match pikeNumber "\<\d\+\(u\=l\=\|lu\|f\)\>"
+syn match pikeNumbers display transparent "\<\d\|\.\d" contains=pikeNumber,pikeFloat,pikeOctalError,pikeOctal
+" Same, but without octal error (for comments)
+syn match pikeNumbersCom display contained transparent "\<\d\|\.\d" contains=pikeNumber,pikeFloat,pikeOctal
+syn match pikeNumber display contained "\<\d\+\%(u\=l\{0,2}\|ll\=u\)\>"
+"hex number
+syn match pikeNumber display contained "\<0x\x\+\%(u\=l\{0,2}\|ll\=u\)\>"
+" Flag the first zero of an octal number as something special
+syn match pikeOctal display contained "\<0\o\+\%(u\=l\{0,2}\|ll\=u\)\>" contains=pikeOctalZero
+syn match pikeOctalZero display contained "\<0"
"floating point number, with dot, optional exponent
-syn match pikeFloat "\<\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\=\>"
+syn match pikeFloat display contained "\<\d\+\%(f\|\.[0-9.]\@!\d*\%(e[-+]\=\d\+\)\=[fl]\=\)"
"floating point number, starting with a dot, optional exponent
-syn match pikeFloat "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
+syn match pikeFloat display contained "[0-9.]\@1<!\.\d\+\%(e[-+]\=\d\+\)\=[fl]\=\>"
"floating point number, without dot, with exponent
-syn match pikeFloat "\<\d\+e[-+]\=\d\+[fl]\=\>"
-"hex number
-syn match pikeNumber "\<0x[0-9a-f]\+\(u\=l\=\|lu\)\>"
-"syn match pikeIdentifier "\<[a-z_][a-z0-9_]*\>"
-syn case match
+syn match pikeFloat display contained "\<\d\+e[-+]\=\d\+[fl]\=\>"
+
+"hexadecimal floating point number, two variants, with exponent
+syn match pikeFloat display contained "\<0x\%(\x\+\.\?\|\x*\.\x\+\)p[-+]\=\d\+[fl]\=\>"
+
" flag an octal number with wrong digits
-syn match pikeOctalError "\<0[0-7]*[89]"
+syn match pikeOctalError display contained "\<0\o*[89]\d*"
+syn case match
if exists("c_comment_strings")
" A comment can contain pikeString, pikeCharacter and pikeNumber.
@@ -64,92 +186,201 @@ if exists("c_comment_strings")
" need to use a special type of pikeString: pikeCommentString, which also ends on
" "*/", and sees a "*" at the start of the line as comment again.
" Unfortunately this doesn't very well work for // type of comments :-(
- syntax match pikeCommentSkip contained "^\s*\*\($\|\s\+\)"
- syntax region pikeCommentString contained start=+"+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=pikeSpecial,pikeCommentSkip
- syntax region pikeComment2String contained start=+"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=pikeSpecial
- syntax region pikeComment start="/\*" end="\*/" contains=pikeTodo,pikeCommentString,pikeCharacter,pikeNumber,pikeFloat
- syntax match pikeComment "//.*" contains=pikeTodo,pikeComment2String,pikeCharacter,pikeNumber
- syntax match pikeComment "#\!.*" contains=pikeTodo,pikeComment2String,pikeCharacter,pikeNumber
+ syn match pikeCommentSkip contained "^\s*\*\%($\|\s\+\)"
+ syn region pikeCommentString contained start=+\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end=+\ze\*/+ contains=pikeSpecial,pikeCommentSkip
+ syn region pikeComment2String contained start=+\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=pikeSpecial
+ syn region pikeCommentL start="//" skip="\\$" end="$" keepend contains=@pikeCommentGroup,pikeComment2String,pikeCharacter,pikeNumbersCom,pikeSpaceError,@Spell containedin=pikeWord,pikeFirstWord
+ if exists("c_no_comment_fold")
+ " Use "extend" here to have preprocessor lines not terminate halfway a
+ " comment.
+ syn region pikeComment matchgroup=pikeCommentStart start="/\*" end="\*/" contains=@pikeCommentGroup,pikeCommentStartError,pikeCommentString,pikeCharacter,pikeNumbersCom,pikeSpaceError,@Spell extend containedin=pikeWord,pikeFirstWord
+ else
+ syn region pikeComment matchgroup=pikeCommentStart start="/\*" end="\*/" contains=@pikeCommentGroup,pikeCommentStartError,pikeCommentString,pikeCharacter,pikeNumbersCom,pikeSpaceError,@Spell fold extend containedin=pikeWord,pikeFirstWord
+ endif
else
- syn region pikeComment start="/\*" end="\*/" contains=pikeTodo
- syn match pikeComment "//.*" contains=pikeTodo
- syn match pikeComment "#!.*" contains=pikeTodo
+ syn region pikeCommentL start="//" skip="\\$" end="$" keepend contains=@pikeCommentGroup,pikeSpaceError,@Spell containedin=pikeWord,pikeFirstWord
+ if exists("c_no_comment_fold")
+ syn region pikeComment matchgroup=pikeCommentStart start="/\*" end="\*/" contains=@pikeCommentGroup,pikeCommentStartError,pikeSpaceError,@Spell extend containedin=pikeWord,pikeFirstWord
+ else
+ syn region pikeComment matchgroup=pikeCommentStart start="/\*" end="\*/" contains=@pikeCommentGroup,pikeCommentStartError,pikeSpaceError,@Spell fold extend containedin=pikeWord,pikeFirstWord
+ endif
endif
-syntax match pikeCommentError "\*/"
+" keep a // comment separately, it terminates a preproc. conditional
+syn match pikeCommentError display "\*/"
+syn match pikeCommentStartError display "/\ze\*" contained
-syn keyword pikeOperator sizeof
-syn keyword pikeType int string void float mapping array multiset mixed
-syn keyword pikeType program object function
+syn keyword pikeOperator sizeof
+syn keyword pikeOperator typeof _typeof _refs
+syn keyword pikeOperator zero_type intp stringp arrayp mappingp multisetp
+syn keyword pikeOperator objectp functionp programp callablep destructedp
+syn keyword pikeOperator object_variablep undefinedp
+syn keyword pikeOperator allocate equal
+syn keyword pikeOperator aggregate aggregate_mapping aggregate_multiset
+syn keyword pikeOperator map filter search replace reverse column rows
+syn keyword pikeOperator indices values mkmapping mkmultiset m_delete sort
+syn keyword pikeOperator m_delete destruct
+syn keyword pikeOperator create _destruct _sprintf cast _encode _decode
+syn keyword pikeOperator __hash _sizeof _values _indices __INIT _equal
+syn keyword pikeOperator _is_type _m_delete _get_iterator _search
+syn keyword pikeOperator _serialize _deserialize _sqrt _types _random
+syn keyword pikeOperator _size_object
-syn region pikePreCondit start="^\s*#\s*\(if\>\|ifdef\>\|ifndef\>\|elif\>\|else\>\|endif\>\)" skip="\\$" end="$" contains=pikeComment,pikeString,pikeCharacter,pikeNumber,pikeCommentError
-syn region pikeIncluded contained start=+"+ skip=+\\\\\|\\"+ end=+"+
-syn match pikeIncluded contained "<[^>]*>"
-syn match pikeInclude "^\s*#\s*include\>\s*["<]" contains=pikeIncluded
-"syn match pikeLineSkip "\\$"
-syn region pikeDefine start="^\s*#\s*\(define\>\|undef\>\)" skip="\\$" end="$" contains=ALLBUT,pikePreCondit,pikeIncluded,pikeInclude,pikeDefine,pikeInParen
-syn region pikePreProc start="^\s*#\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" contains=ALLBUT,pikePreCondit,pikeIncluded,pikeInclude,pikeDefine,pikeInParen
+syn keyword pikeType int void
+syn keyword pikeType float
+syn keyword pikeType bool string array mapping multiset mixed
+syn keyword pikeType object function program auto
-" Highlight User Labels
-syn region pikeMulti transparent start='?' end=':' contains=ALLBUT,pikeIncluded,pikeSpecial,pikeTodo,pikeUserLabel,pikeBitField
-" Avoid matching foo::bar() in C++ by requiring that the next char is not ':'
-syn match pikeUserLabel "^\s*\I\i*\s*:$"
-syn match pikeUserLabel ";\s*\I\i*\s*:$"ms=s+1
-syn match pikeUserLabel "^\s*\I\i*\s*:[^:]"me=e-1
-syn match pikeUserLabel ";\s*\I\i*\s*:[^:]"ms=s+1,me=e-1
+syn keyword pikeType this this_object this_program
+syn keyword pikeType sprintf_args sprintf_format sprintf_result
+syn keyword pikeType strict_sprintf_format
-" Avoid recognizing most bitfields as labels
-syn match pikeBitField "^\s*\I\i*\s*:\s*[1-9]"me=e-1
-syn match pikeBitField ";\s*\I\i*\s*:\s*[1-9]"me=e-1
+syn keyword pikeStructure class enum typedef inherit import
+syn keyword pikeTypedef typedef
+syn keyword pikeStorageClass private protected public constant final variant
+syn keyword pikeStorageClass optional inline extern static __deprecated__ lambda
-syn sync ccomment pikeComment minlines=10
+syn keyword pikeConstant __LINE__ __FILE__ __DIR__ __DATE__ __TIME__
+syn keyword pikeConstant __AUTO_BIGNUM__ __NT__
+syn keyword pikeConstant __BUILD__ __COUNTER__ _MAJOR__ __MINOR__ __VERSION__
+syn keyword pikeConstant __REAL_BUILD__ _REAL_MAJOR__ __REAL_MINOR__
+syn keyword pikeConstant __REAL_VERSION__ __PIKE__ UNDEFINED
-" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_pike_syntax_inits")
- if version < 508
- let did_pike_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
+" These should actually only be parsed in preprocessor conditionals
+syn keyword pikeCppOperator contained defined constant efun _Pragma
+
+syn keyword pikeBoolean true false
+
+syn match pikeCppPrefix display "^\s*\zs#\s*[a-z]\+" contained
+syn region pikePreCondit start="^\s*#\s*\%(if\%(n\?def\)\?\|el\%(se\)\?if\)\>" skip="\\$" end="$" transparent keepend contains=pikeString,pikeCharacter,pikeNumbers,pikeCommentError,pikeSpaceError,pikeCppOperator,pikeCppPrefix
+syn match pikePreConditMatch display "^\s*\zs#\s*\%(else\|endif\)\>"
+if !exists("c_no_if0")
+ syn cluster pikeCppOutInGroup contains=pikeCppInIf,pikeCppInElse,pikeCppInElse2,pikeCppOutIf,pikeCppOutIf2,pikeCppOutElse,pikeCppInSkip,pikeCppOutSkip
+ syn region pikeCppOutWrapper start="^\s*\zs#\s*if\s\+0\+\s*\%($\|//\|/\*\|&\)" end=".\@=\|$" contains=pikeCppOutIf,pikeCppOutElse,@NoSpell fold
+ syn region pikeCppOutIf contained start="0\+" matchgroup=pikeCppOutWrapper end="^\s*#\s*endif\>" contains=pikeCppOutIf2,pikeCppOutElse
+ if !exists("c_no_if0_fold")
+ syn region pikeCppOutIf2 contained matchgroup=pikeCppOutWrapper start="0\+" end="^\ze\s*#\s*\%(else\>\|el\%(se\)\?if\s\+\%(0\+\s*\%($\|//\|/\*\|&\)\)\@!\|endif\>\)" contains=pikeSpaceError,pikeCppOutSkip,@Spell fold
else
- command -nargs=+ HiLink hi def link <args>
+ syn region pikeCppOutIf2 contained matchgroup=pikeCppOutWrapper start="0\+" end="^\ze\s*#\s*\%(else\>\|el\%(se\)\?if\s\+\%(0\+\s*\%($\|//\|/\*\|&\)\)\@!\|endif\>\)" contains=pikeSpaceError,pikeCppOutSkip,@Spell
endif
+ syn region pikeCppOutElse contained matchgroup=pikeCppOutWrapper start="^\s*#\s*\%(else\|el\%(se\)\?if\)" end="^\s*#\s*endif\>" contains=TOP,pikePreCondit
+ syn region pikeCppInWrapper start="^\s*\zs#\s*if\s\+0*[1-9]\d*\s*\%($\|//\|/\*\||\)" end=".\@=\|$" contains=pikeCppInIf,pikeCppInElse fold
+ syn region pikeCppInIf contained matchgroup=pikeCppInWrapper start="\d\+" end="^\s*#\s*endif\>" contains=TOP,pikePreCondit
+ if !exists("c_no_if0_fold")
+ syn region pikeCppInElse contained start="^\s*#\s*\%(else\>\|el\%(se\)\?if\s\+\%(0*[1-9]\d*\s*\%($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=pikeCppInIf contains=pikeCppInElse2 fold
+ else
+ syn region pikeCppInElse contained start="^\s*#\s*\%(else\>\|el\%(se\)\?if\s\+\%(0*[1-9]\d*\s*\%($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=pikeCppInIf contains=pikeCppInElse2
+ endif
+ syn region pikeCppInElse2 contained matchgroup=pikeCppInWrapper start="^\s*#\s*\%(else\|el\%(se\)\?if\)\%([^/]\|/[^/*]\)*" end="^\ze\s*#\s*endif\>" contains=pikeSpaceError,pikeCppOutSkip,@Spell
+ syn region pikeCppOutSkip contained start="^\s*#\s*if\%(n\?def\)\?\>" skip="\\$" end="^\s*#\s*endif\>" contains=pikeSpaceError,pikeCppOutSkip
+ syn region pikeCppInSkip contained matchgroup=pikeCppInWrapper start="^\s*#\s*\%(if\s\+\%(\d\+\s*\%($\|//\|/\*\||\|&\)\)\@!\|ifn\?def\>\)" skip="\\$" end="^\s*#\s*endif\>" containedin=pikeCppOutElse,pikeCppInIf,pikeCppInSkip contains=TOP,pikePreProc
+endif
+syn region pikeIncluded display contained start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=pikeDelimiterDQ keepend
+syn match pikeIncluded display contained "<[^>]*>"
+syn match pikeInclude display "^\s*\zs#\s*include\>\s*["<]" contains=pikeIncluded
+syn cluster pikePreProcGroup contains=pikeIncluded,pikeInclude,pikeEmbeddedString,pikeCppOutWrapper,pikeCppInWrapper,@pikeCppOutInGroup,pikeFormat,pikeMlString,pikeCommentStartError,@pikeBadGroup,pikeWord
+syn region pikeDefine start="^\s*\zs#\s*\%(define\|undef\)\>" skip="\\$" end="$" keepend contains=@pikeStmt,@pikeBadGroup
+syn region pikePreProc start="^\s*\zs#\s*\%(pragma\|charset\|pike\|require\|string\|line\|warning\|error\)\>" skip="\\$" end="$" transparent keepend contains=pikeString,pikeCharacter,pikeNumbers,pikeCommentError,pikeSpaceError,pikeCppOperator,pikeCppPrefix,@Spell,pikeConstant
- HiLink pikeLabel Label
- HiLink pikeUserLabel Label
- HiLink pikeConditional Conditional
- HiLink pikeRepeat Repeat
- HiLink pikeCharacter Character
- HiLink pikeSpecialCharacter pikeSpecial
- HiLink pikeNumber Number
- HiLink pikeFloat Float
- HiLink pikeOctalError pikeError
- HiLink pikeParenError pikeError
- HiLink pikeInParen pikeError
- HiLink pikeCommentError pikeError
- HiLink pikeOperator Operator
- HiLink pikeInclude Include
- HiLink pikePreProc PreProc
- HiLink pikeDefine Macro
- HiLink pikeIncluded pikeString
- HiLink pikeError Error
- HiLink pikeStatement Statement
- HiLink pikePreCondit PreCondit
- HiLink pikeType Type
- HiLink pikeCommentError pikeError
- HiLink pikeCommentString pikeString
- HiLink pikeComment2String pikeString
- HiLink pikeCommentSkip pikeComment
- HiLink pikeString String
- HiLink pikeComment Comment
- HiLink pikeSpecial SpecialChar
- HiLink pikeTodo Todo
- HiLink pikeException pikeStatement
- HiLink pikeCompoundType Constant
- "HiLink pikeIdentifier Identifier
-
- delcommand HiLink
+syn match pikeAutodocReal display contained "\%(//\|[/ \t\v]\*\|^\*\)\@2<=!.*" contains=@pikeAutodoc containedin=pikeComment,pikeCommentL
+syn cluster pikeCommentGroup add=pikeAutodocReal
+syn cluster pikePreProcGroup add=pikeAutodocReal
+
+" Highlight User Labels
+" Avoid matching foo::bar() in C++ by requiring that the next char is not ':'
+syn match pikeUserLabel display "\%(^\|[{};]\)\zs\I\i*\s*\ze:\%([^:]\|$\)" contained contains=NONE
+syn match pikeUserLabel display "\%(\<\%(break\|continue\)\_s\+\)\@10<=\I\i*" contained contains=NONE
+syn match pikeUserLabel display "\%(\<case\)\@5<=\s\+[^<()[\]{},;:]\+\ze::\@!" contained contains=pikeDelimiterDQ,pikeDelimiterSQ
+
+syn match pikeMappIndex display contained "[^<()[\]{},;:]\+\ze::\@!" contains=pikeDelimiterDQ,pikeDelimiterSQ
+syn match pikeSoftCast display contained "\[[ \t\v\r\n.a-zA-Z0-9_():,|\+]" contains=NONE
+
+if exists("c_minlines")
+ let b:c_minlines = c_minlines
+else
+ if !exists("c_no_if0")
+ let b:c_minlines = 400 " #if 0 constructs can be long
+ else
+ let b:c_minlines = 200 " mostly for multiline strings
+ endif
endif
+exec "syn sync ccomment pikeComment minlines=" . b:c_minlines
+syn sync match pikeMlStringSync grouphere pikeMlString +^[^"#]\+#\"+
+syn sync match pikeAutodocSync grouphere pikeCommentL "^\s*//!"
+
+" Define the default highlighting.
+" Only used when an item doesn't have highlighting yet
+hi def link pikeFormat SpecialChar
+hi def link pikeMlString String
+hi def link pikeCommentL Comment
+hi def link pikeCommentStart Comment
+hi def link pikeLabel Label
+hi def link pikeUserLabel Identifier
+hi def link pikeConditional Conditional
+hi def link pikeRepeat Repeat
+hi def link pikeCharacter Character
+hi def link pikeDelimiterDQ Delimiter
+hi def link pikeDelimiterSQ Delimiter
+hi def link pikeNumber Number
+hi def link pikeOctal Number
+hi def link pikeOctalZero PreProc " link this to Error if you want
+hi def link pikeFloat Float
+hi def link pikeOctalError Error
+hi def link pikeCommentError Error
+hi def link pikeCommentStartError Error
+hi def link pikeSpaceError Error
+hi def link pikeSpecialError Error
+hi def link pikeOperator Operator
+hi def link pikeCppOperator Operator
+hi def link pikeStructure Structure
+hi def link pikeTypedef Typedef
+hi def link pikeStorageClass StorageClass
+hi def link pikeInclude Include
+hi def link pikeCppPrefix PreCondit
+hi def link pikePreProc PreProc
+hi def link pikeDefine Macro
+hi def link pikeIncluded String
+hi def link pikeError Error
+hi def link pikeDebug Debug
+hi def link pikeException Exception
+hi def link pikeStatement Statement
+hi def link pikeType Type
+hi def link pikeConstant Constant
+hi def link pikeBoolean Boolean
+hi def link pikeCommentString String
+hi def link pikeComment2String String
+hi def link pikeCommentSkip Comment
+hi def link pikeString String
+hi def link pikeComment Comment
+hi def link pikeSpecial SpecialChar
+hi def link pikeTodo Todo
+hi def link pikeBadContinuation Error
+
+hi def link pikeCppInWrapper PreCondit
+hi def link pikeCppOutWrapper PreCondit
+hi def link pikePreConditMatch PreCondit
+
+hi def link pikeCppOutSkip Comment
+hi def link pikeCppInElse2 Comment
+hi def link pikeCppOutIf2 Comment
+hi def link pikeCppOut Comment
+
+hi def link pikePredef Statement
+hi def link pikeBindings Identifier
+hi def link pikeMappIndex Identifier
+hi def link pikeSoftCast Type
+hi def link pikeBadGroup Error
+hi def link pikeBadPClose Error
+hi def link pikeBadAClose Error
+hi def link pikeBadBClose Error
+hi def link pikeBadSPClose Error
+hi def link pikeBadSAClose Error
+hi def link pikeBadSBClose Error
+hi def link pikeBadSPAClose Error
+hi def link pikeBadSBAClose Error
+hi def link pikeBadSClose Error
let b:current_syntax = "pike"
+let &cpo = s:cpo_save
+unlet s:cpo_save
" vim: ts=8
diff --git a/runtime/syntax/pilrc.vim b/runtime/syntax/pilrc.vim
index 86d5611589..f0e5f9bbc7 100644
--- a/runtime/syntax/pilrc.vim
+++ b/runtime/syntax/pilrc.vim
@@ -4,10 +4,8 @@
" Last change: 2003 May 11
" Available on: http://www.schau.com/pilrcvim/pilrc.vim
-" Remove any old syntax
-if version < 600
- syn clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -119,30 +117,20 @@ syn region pilrcInclude start="public class" end="}"
syn sync ccomment pilrcComment
-if version >= 508 || !exists("did_pilrc_syntax_inits")
- if version < 508
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- let did_pilrc_syntax_inits = 1
-
- " The default methods for highlighting
- HiLink pilrcKeyword Statement
- HiLink pilrcType Type
- HiLink pilrcError Error
- HiLink pilrcCountry SpecialChar
- HiLink pilrcLanguage SpecialChar
- HiLink pilrcString SpecialChar
- HiLink pilrcNumber Number
- HiLink pilrcComment Comment
- HiLink pilrcConstant Constant
- HiLink pilrcFunction Function
- HiLink pilrcInclude SpecialChar
- HiLink pilrcIdentifier Number
-
- delcommand HiLink
-endif
+
+" The default methods for highlighting
+hi def link pilrcKeyword Statement
+hi def link pilrcType Type
+hi def link pilrcError Error
+hi def link pilrcCountry SpecialChar
+hi def link pilrcLanguage SpecialChar
+hi def link pilrcString SpecialChar
+hi def link pilrcNumber Number
+hi def link pilrcComment Comment
+hi def link pilrcConstant Constant
+hi def link pilrcFunction Function
+hi def link pilrcInclude SpecialChar
+hi def link pilrcIdentifier Number
+
let b:current_syntax = "pilrc"
diff --git a/runtime/syntax/pine.vim b/runtime/syntax/pine.vim
index 4c64b9bbc7..aadf50be15 100644
--- a/runtime/syntax/pine.vim
+++ b/runtime/syntax/pine.vim
@@ -3,19 +3,12 @@
" Maintainer: David Pascoe <pascoedj@spamcop.net>
" Last Change: Thu Feb 27 10:18:48 WST 2003, update for pine 4.53
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
-if version >= 600
- setlocal iskeyword=@,48-57,_,128-167,224-235,-
-else
- set iskeyword=@,48-57,_,128-167,224-235,-
-endif
+setlocal iskeyword=@,48-57,_,128-167,224-235,-
syn keyword pineConfig addrbook-sort-rule
syn keyword pineConfig address-book
@@ -351,21 +344,11 @@ syn keyword pineOption vertical-folder-list
syn match pineComment "^#.*$"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_pine_syn_inits")
- if version < 508
- let did_pine_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink pineConfig Type
- HiLink pineComment Comment
- HiLink pineOption Macro
- delcommand HiLink
-endif
+hi def link pineConfig Type
+hi def link pineComment Comment
+hi def link pineOption Macro
let b:current_syntax = "pine"
diff --git a/runtime/syntax/pinfo.vim b/runtime/syntax/pinfo.vim
index bf4126e59a..cb9e60ebb3 100644
--- a/runtime/syntax/pinfo.vim
+++ b/runtime/syntax/pinfo.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: pinfo(1) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2007-06-17
+" Language: pinfo(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-06-17
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/plaintex.vim b/runtime/syntax/plaintex.vim
index 7020c68e9b..5cb49a0bfc 100644
--- a/runtime/syntax/plaintex.vim
+++ b/runtime/syntax/plaintex.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: TeX (plain.tex format)
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-10-26
+" Language: TeX (plain.tex format)
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-10-26
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/pli.vim b/runtime/syntax/pli.vim
index f8d7e51cf3..a274cc40bf 100644
--- a/runtime/syntax/pli.vim
+++ b/runtime/syntax/pli.vim
@@ -3,9 +3,8 @@
" using keywords from http://www.kednos.com/pli/docs/reference_manual/6291pro_contents.html
" 2012-11-13 Alan Thompson
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -222,57 +221,46 @@ endif
syn sync minlines=10 maxlines=100
" Define the default highlighting.
-" For version 5.x and earlier, only when not done already.
-" For version 5.8 and later, only when and item doesn't have highlighting
-" yet.
-if version >= 508 || !exists("did_pl1_syn_inits")
- if version < 508
- let did_pl1_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when and item doesn't have highlighting yet.
- HiLink pl1Attribute Macro
- HiLink pl1BlockError Error
- HiLink pl1BooleanLiteral Boolean
- HiLink pl1CharLiteral Character
- HiLink pl1Comment Comment
- HiLink pl1CommentL Comment
- HiLink pl1Conditional Conditional
- HiLink pl1Error Error
- HiLink pl1ErrInBracket Error
- HiLink pl1ErrInBlock Error
- HiLink pl1ErrInParen Error
- HiLink pl1Exception Function
- HiLink pl1FloatLiteral Float
- HiLink pl1Function Function
- HiLink pl1Garbage Error
- HiLink pl1HostIdentifier Label
- HiLink pl1Identifier Normal
- HiLink pl1IntLiteral Number
- HiLink pl1Operator Operator
- HiLink pl1Paren Normal
- HiLink pl1ParenError Error
- HiLink pl1SpaceError Error
- HiLink pl1Pseudo PreProc
- HiLink pl1PreProc PreProc
- HiLink pl1PreProcSym PreProc
- HiLink pl1Keyword Keyword
- HiLink pl1Other Keyword
- HiLink pl1Repeat Repeat
- HiLink pl1Statement Keyword
- HiLink pl1Storage StorageClass
- HiLink pl1StringError Error
- HiLink pl1StringLiteral String
- HiLink pl1CommentString String
- HiLink pl1Comment2String String
- HiLink pl1Symbol Normal
- HiLink pl1Trigger Function
- HiLink pl1TypeAttribute StorageClass
- HiLink pl1Todo Todo
+hi def link pl1Attribute Macro
+hi def link pl1BlockError Error
+hi def link pl1BooleanLiteral Boolean
+hi def link pl1CharLiteral Character
+hi def link pl1Comment Comment
+hi def link pl1CommentL Comment
+hi def link pl1Conditional Conditional
+hi def link pl1Error Error
+hi def link pl1ErrInBracket Error
+hi def link pl1ErrInBlock Error
+hi def link pl1ErrInParen Error
+hi def link pl1Exception Function
+hi def link pl1FloatLiteral Float
+hi def link pl1Function Function
+hi def link pl1Garbage Error
+hi def link pl1HostIdentifier Label
+hi def link pl1Identifier Normal
+hi def link pl1IntLiteral Number
+hi def link pl1Operator Operator
+hi def link pl1Paren Normal
+hi def link pl1ParenError Error
+hi def link pl1SpaceError Error
+hi def link pl1Pseudo PreProc
+hi def link pl1PreProc PreProc
+hi def link pl1PreProcSym PreProc
+hi def link pl1Keyword Keyword
+hi def link pl1Other Keyword
+hi def link pl1Repeat Repeat
+hi def link pl1Statement Keyword
+hi def link pl1Storage StorageClass
+hi def link pl1StringError Error
+hi def link pl1StringLiteral String
+hi def link pl1CommentString String
+hi def link pl1Comment2String String
+hi def link pl1Symbol Normal
+hi def link pl1Trigger Function
+hi def link pl1TypeAttribute StorageClass
+hi def link pl1Todo Todo
- delcommand HiLink
-endif
let b:current_syntax = "pl1"
diff --git a/runtime/syntax/plm.vim b/runtime/syntax/plm.vim
index bf7c32fd1c..c6618adacb 100644
--- a/runtime/syntax/plm.vim
+++ b/runtime/syntax/plm.vim
@@ -3,11 +3,8 @@
" Maintainer: Philippe Coulonges <cphil@cphil.net>
" Last change: 2003 May 11
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -103,43 +100,33 @@ syn keyword plm386w16BuiltIn SETD SKIPD SKIPRD
syn sync lines=50
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_plm_syntax_inits")
- if version < 508
- let did_plm_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default methods for highlighting. Can be overridden later
-" HiLink plmLabel Label
-" HiLink plmConditional Conditional
-" HiLink plmRepeat Repeat
- HiLink plmTodo Todo
- HiLink plmNumber Number
- HiLink plmOperator Operator
- HiLink plmDelimiter Operator
- "HiLink plmShowTab Error
- "HiLink plmShowTabc Error
- HiLink plmIdentifier Identifier
- HiLink plmBuiltIn Statement
- HiLink plm286BuiltIn Statement
- HiLink plm386BuiltIn Statement
- HiLink plm386w16BuiltIn Statement
- HiLink plmReserved Statement
- HiLink plm386Reserved Statement
- HiLink plmPreProc PreProc
- HiLink plmCommentError plmError
- HiLink plmCommentString plmString
- HiLink plmComment2String plmString
- HiLink plmCommentSkip plmComment
- HiLink plmString String
- HiLink plmComment Comment
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+" The default methods for highlighting. Can be overridden later
+" hi def link plmLabel Label
+" hi def link plmConditional Conditional
+" hi def link plmRepeat Repeat
+hi def link plmTodo Todo
+hi def link plmNumber Number
+hi def link plmOperator Operator
+hi def link plmDelimiter Operator
+"hi def link plmShowTab Error
+"hi def link plmShowTabc Error
+hi def link plmIdentifier Identifier
+hi def link plmBuiltIn Statement
+hi def link plm286BuiltIn Statement
+hi def link plm386BuiltIn Statement
+hi def link plm386w16BuiltIn Statement
+hi def link plmReserved Statement
+hi def link plm386Reserved Statement
+hi def link plmPreProc PreProc
+hi def link plmCommentError plmError
+hi def link plmCommentString plmString
+hi def link plmComment2String plmString
+hi def link plmCommentSkip plmComment
+hi def link plmString String
+hi def link plmComment Comment
+
let b:current_syntax = "plm"
diff --git a/runtime/syntax/plp.vim b/runtime/syntax/plp.vim
index f59702d3b5..48dc4b249e 100644
--- a/runtime/syntax/plp.vim
+++ b/runtime/syntax/plp.vim
@@ -7,11 +7,8 @@
" Add to filetype.vim the following line (without quote sign):
" au BufNewFile,BufRead *.plp setf plp
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -19,14 +16,9 @@ if !exists("main_syntax")
let main_syntax = 'perlscript'
endif
-if version < 600
- so <sfile>:p:h/html.vim
- syn include @PLPperl <sfile>:p:h/perl.vim
-else
- runtime! syntax/html.vim
- unlet b:current_syntax
- syn include @PLPperl syntax/perl.vim
-endif
+runtime! syntax/html.vim
+unlet b:current_syntax
+syn include @PLPperl syntax/perl.vim
syn cluster htmlPreproc add=PLPperlblock
diff --git a/runtime/syntax/plsql.vim b/runtime/syntax/plsql.vim
index 6e513660f8..1868c9cb16 100644
--- a/runtime/syntax/plsql.vim
+++ b/runtime/syntax/plsql.vim
@@ -9,11 +9,8 @@
" Austin Ziegler (austin at halostatue dot ca)
" Added 8i+ features.
"
-" For version 5.x, clear all syntax items.
-" For version 6.x, quit when a syntax file was already loaded.
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -223,54 +220,44 @@ endif
syn sync minlines=10 maxlines=100
" Define the default highlighting.
-" For version 5.x and earlier, only when not done already.
-" For version 5.8 and later, only when an item doesn't have highlighting yet.
-if version >= 508 || !exists("did_plsql_syn_inits")
- if version < 508
- let did_plsql_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet.
- HiLink plsqlAttribute Macro
- HiLink plsqlBlockError Error
- HiLink plsqlBooleanLiteral Boolean
- HiLink plsqlCharLiteral Character
- HiLink plsqlComment Comment
- HiLink plsqlCommentL Comment
- HiLink plsqlConditional Conditional
- HiLink plsqlError Error
- HiLink plsqlErrInBracket Error
- HiLink plsqlErrInBlock Error
- HiLink plsqlErrInParen Error
- HiLink plsqlException Function
- HiLink plsqlFloatLiteral Float
- HiLink plsqlFunction Function
- HiLink plsqlGarbage Error
- HiLink plsqlHostIdentifier Label
- HiLink plsqlIdentifier Normal
- HiLink plsqlIntLiteral Number
- HiLink plsqlOperator Operator
- HiLink plsqlParen Normal
- HiLink plsqlParenError Error
- HiLink plsqlSpaceError Error
- HiLink plsqlPseudo PreProc
- HiLink plsqlKeyword Keyword
- HiLink plsqlRepeat Repeat
- HiLink plsqlStorage StorageClass
- HiLink plsqlSQLKeyword Function
- HiLink plsqlStringError Error
- HiLink plsqlStringLiteral String
- HiLink plsqlCommentString String
- HiLink plsqlComment2String String
- HiLink plsqlSymbol Normal
- HiLink plsqlTrigger Function
- HiLink plsqlTypeAttribute StorageClass
- HiLink plsqlTodo Todo
+hi def link plsqlAttribute Macro
+hi def link plsqlBlockError Error
+hi def link plsqlBooleanLiteral Boolean
+hi def link plsqlCharLiteral Character
+hi def link plsqlComment Comment
+hi def link plsqlCommentL Comment
+hi def link plsqlConditional Conditional
+hi def link plsqlError Error
+hi def link plsqlErrInBracket Error
+hi def link plsqlErrInBlock Error
+hi def link plsqlErrInParen Error
+hi def link plsqlException Function
+hi def link plsqlFloatLiteral Float
+hi def link plsqlFunction Function
+hi def link plsqlGarbage Error
+hi def link plsqlHostIdentifier Label
+hi def link plsqlIdentifier Normal
+hi def link plsqlIntLiteral Number
+hi def link plsqlOperator Operator
+hi def link plsqlParen Normal
+hi def link plsqlParenError Error
+hi def link plsqlSpaceError Error
+hi def link plsqlPseudo PreProc
+hi def link plsqlKeyword Keyword
+hi def link plsqlRepeat Repeat
+hi def link plsqlStorage StorageClass
+hi def link plsqlSQLKeyword Function
+hi def link plsqlStringError Error
+hi def link plsqlStringLiteral String
+hi def link plsqlCommentString String
+hi def link plsqlComment2String String
+hi def link plsqlSymbol Normal
+hi def link plsqlTrigger Function
+hi def link plsqlTypeAttribute StorageClass
+hi def link plsqlTodo Todo
- delcommand HiLink
-endif
let b:current_syntax = "plsql"
diff --git a/runtime/syntax/po.vim b/runtime/syntax/po.vim
index 2ab13ac0b1..15d09b18bd 100644
--- a/runtime/syntax/po.vim
+++ b/runtime/syntax/po.vim
@@ -6,11 +6,8 @@
" Leonardo Fontenelle (Spell checking)
" Nam SungHyun <namsh@kldp.org> (Original maintainer)
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
let s:keepcpo= &cpo
@@ -82,61 +79,51 @@ syn match poAcceleratorStr contained "[^&_~][&_~]\(\a\|\d\)[^:]"ms=s+1,me=e-1 c
syn match poVariable contained "%\d"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_po_syn_inits")
- if version < 508
- let did_po_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink poCommentSources PreProc
- HiLink poComment Comment
- HiLink poCommentAutomatic Comment
- HiLink poCommentTranslator Comment
- HiLink poCommentFlags Special
- HiLink poCommentDiff Comment
- HiLink poCopyrightUnset Todo
- HiLink poFlagFuzzy Todo
- HiLink poDiffOld Todo
- HiLink poDiffNew Special
- HiLink poObsolete Comment
-
- HiLink poStatementMsgid Statement
- HiLink poStatementMsgstr Statement
- HiLink poStatementMsgidplural Statement
- HiLink poStatementMsgCTxt Statement
- HiLink poPluralCaseN Constant
-
- HiLink poStringCTxt Comment
- HiLink poStringID String
- HiLink poStringSTR String
- HiLink poCommentKDE Comment
- HiLink poCommentKDEError Error
- HiLink poPluralKDE Comment
- HiLink poPluralKDEError Error
- HiLink poHeaderItem Identifier
- HiLink poHeaderUndefined Todo
- HiLink poKDEdesktopFile Identifier
-
- HiLink poHtml Identifier
- HiLink poHtmlNot String
- HiLink poHtmlTranslatables String
- HiLink poLineBreak String
-
- HiLink poFormat poSpecial
- HiLink poSpecial Special
- HiLink poAcceleratorId Special
- HiLink poAcceleratorStr Special
- HiLink poVariable Special
-
- HiLink poMsguniqError Special
- HiLink poMsguniqErrorMarkers Comment
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link poCommentSources PreProc
+hi def link poComment Comment
+hi def link poCommentAutomatic Comment
+hi def link poCommentTranslator Comment
+hi def link poCommentFlags Special
+hi def link poCommentDiff Comment
+hi def link poCopyrightUnset Todo
+hi def link poFlagFuzzy Todo
+hi def link poDiffOld Todo
+hi def link poDiffNew Special
+hi def link poObsolete Comment
+
+hi def link poStatementMsgid Statement
+hi def link poStatementMsgstr Statement
+hi def link poStatementMsgidplural Statement
+hi def link poStatementMsgCTxt Statement
+hi def link poPluralCaseN Constant
+
+hi def link poStringCTxt Comment
+hi def link poStringID String
+hi def link poStringSTR String
+hi def link poCommentKDE Comment
+hi def link poCommentKDEError Error
+hi def link poPluralKDE Comment
+hi def link poPluralKDEError Error
+hi def link poHeaderItem Identifier
+hi def link poHeaderUndefined Todo
+hi def link poKDEdesktopFile Identifier
+
+hi def link poHtml Identifier
+hi def link poHtmlNot String
+hi def link poHtmlTranslatables String
+hi def link poLineBreak String
+
+hi def link poFormat poSpecial
+hi def link poSpecial Special
+hi def link poAcceleratorId Special
+hi def link poAcceleratorStr Special
+hi def link poVariable Special
+
+hi def link poMsguniqError Special
+hi def link poMsguniqErrorMarkers Comment
+
let b:current_syntax = "po"
diff --git a/runtime/syntax/pod.vim b/runtime/syntax/pod.vim
index b9f2e0854f..604713260b 100644
--- a/runtime/syntax/pod.vim
+++ b/runtime/syntax/pod.vim
@@ -4,7 +4,7 @@
" Previously: Scott Bigham <dsb@killerbunnies.org>
" Homepage: http://github.com/vim-perl/vim-perl
" Bugs/requests: http://github.com/vim-perl/vim-perl/issues
-" Last Change: 2013-07-21
+" Last Change: 2017-09-12
" To add embedded POD documentation highlighting to your syntax file, add
" the commands:
@@ -19,11 +19,8 @@
" Remove any old syntax stuff hanging around (this is suppressed
" automatically by ":syn include" if necessary).
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -67,28 +64,17 @@ syn match podEscape "\I\i*>"me=e-1 contained contains=@NoSpell
syn match podEscape2 "\d\+>"me=e-1 contained contains=@NoSpell
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_pod_syntax_inits")
- if version < 508
- let did_pod_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink podCommand Statement
- HiLink podCmdText String
- HiLink podOverIndent Number
- HiLink podForKeywd Identifier
- HiLink podFormat Identifier
- HiLink podVerbatimLine PreProc
- HiLink podSpecial Identifier
- HiLink podEscape String
- HiLink podEscape2 Number
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link podCommand Statement
+hi def link podCmdText String
+hi def link podOverIndent Number
+hi def link podForKeywd Identifier
+hi def link podFormat Identifier
+hi def link podVerbatimLine PreProc
+hi def link podSpecial Identifier
+hi def link podEscape String
+hi def link podEscape2 Number
if exists("perl_pod_spellcheck_headings")
" Spell-check headings
diff --git a/runtime/syntax/postscr.vim b/runtime/syntax/postscr.vim
index 8b051d33b3..d5dc9a22d6 100644
--- a/runtime/syntax/postscr.vim
+++ b/runtime/syntax/postscr.vim
@@ -13,11 +13,8 @@
" postscr_encodings - highlight encoding names (there are a lot)
" postscr_andornot_binary - highlight and, or, and not as binary operators (not logical)
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -25,11 +22,7 @@ endif
syn case match
" Keyword characters - all 7-bit ASCII bar PS delimiters and ws
-if version >= 600
- setlocal iskeyword=33-127,^(,^),^<,^>,^[,^],^{,^},^/,^%
-else
- set iskeyword=33-127,^(,^),^<,^>,^[,^],^{,^},^/,^%
-endif
+setlocal iskeyword=33-127,^(,^),^<,^>,^[,^],^{,^},^/,^%
" Yer trusty old TODO highlghter!
syn keyword postscrTodo contained TODO
@@ -730,68 +723,58 @@ if exists("postscr_ghostscript")
endif " GhostScript highlighting
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_postscr_syntax_inits")
- if version < 508
- let did_postscr_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink postscrComment Comment
-
- HiLink postscrConstant Constant
- HiLink postscrString String
- HiLink postscrASCIIString postscrString
- HiLink postscrHexString postscrString
- HiLink postscrASCII85String postscrString
- HiLink postscrNumber Number
- HiLink postscrInteger postscrNumber
- HiLink postscrHex postscrNumber
- HiLink postscrRadix postscrNumber
- HiLink postscrFloat Float
- HiLink postscrBoolean Boolean
-
- HiLink postscrIdentifier Identifier
- HiLink postscrProcedure Function
-
- HiLink postscrName Statement
- HiLink postscrConditional Conditional
- HiLink postscrRepeat Repeat
- HiLink postscrL2Repeat postscrRepeat
- HiLink postscrOperator Operator
- HiLink postscrL1Operator postscrOperator
- HiLink postscrL2Operator postscrOperator
- HiLink postscrL3Operator postscrOperator
- HiLink postscrMathOperator postscrOperator
- HiLink postscrLogicalOperator postscrOperator
- HiLink postscrBinaryOperator postscrOperator
-
- HiLink postscrDSCComment SpecialComment
- HiLink postscrSpecialChar SpecialChar
-
- HiLink postscrTodo Todo
-
- HiLink postscrError Error
- HiLink postscrSpecialCharError postscrError
- HiLink postscrASCII85CharError postscrError
- HiLink postscrHexCharError postscrError
- HiLink postscrASCIIStringError postscrError
- HiLink postscrIdentifierError postscrError
-
- if exists("postscr_ghostscript")
- HiLink postscrGSOperator postscrOperator
- HiLink postscrGSMathOperator postscrMathOperator
- else
- HiLink postscrGSOperator postscrError
- HiLink postscrGSMathOperator postscrError
- endif
-
- delcommand HiLink
+" Only when an item doesn't have highlighting yet
+
+hi def link postscrComment Comment
+
+hi def link postscrConstant Constant
+hi def link postscrString String
+hi def link postscrASCIIString postscrString
+hi def link postscrHexString postscrString
+hi def link postscrASCII85String postscrString
+hi def link postscrNumber Number
+hi def link postscrInteger postscrNumber
+hi def link postscrHex postscrNumber
+hi def link postscrRadix postscrNumber
+hi def link postscrFloat Float
+hi def link postscrBoolean Boolean
+
+hi def link postscrIdentifier Identifier
+hi def link postscrProcedure Function
+
+hi def link postscrName Statement
+hi def link postscrConditional Conditional
+hi def link postscrRepeat Repeat
+hi def link postscrL2Repeat postscrRepeat
+hi def link postscrOperator Operator
+hi def link postscrL1Operator postscrOperator
+hi def link postscrL2Operator postscrOperator
+hi def link postscrL3Operator postscrOperator
+hi def link postscrMathOperator postscrOperator
+hi def link postscrLogicalOperator postscrOperator
+hi def link postscrBinaryOperator postscrOperator
+
+hi def link postscrDSCComment SpecialComment
+hi def link postscrSpecialChar SpecialChar
+
+hi def link postscrTodo Todo
+
+hi def link postscrError Error
+hi def link postscrSpecialCharError postscrError
+hi def link postscrASCII85CharError postscrError
+hi def link postscrHexCharError postscrError
+hi def link postscrASCIIStringError postscrError
+hi def link postscrIdentifierError postscrError
+
+if exists("postscr_ghostscript")
+hi def link postscrGSOperator postscrOperator
+hi def link postscrGSMathOperator postscrMathOperator
+else
+hi def link postscrGSOperator postscrError
+hi def link postscrGSMathOperator postscrError
endif
+
let b:current_syntax = "postscr"
" vim: ts=8
diff --git a/runtime/syntax/pov.vim b/runtime/syntax/pov.vim
index 4c1fd9624a..8595bcb151 100644
--- a/runtime/syntax/pov.vim
+++ b/runtime/syntax/pov.vim
@@ -5,14 +5,8 @@
" Required Vim Version: 6.0
" Setup
-if version >= 600
- " Quit when a syntax file was already loaded
- if exists("b:current_syntax")
- finish
- endif
-else
- " Croak when an old Vim is sourcing us.
- echo "Sorry, but this syntax file relies on Vim 6 features. Either upgrade Vim or use a version of " . expand("<sfile>:t:r") . " syntax file appropriate for Vim " . version/100 . "." . version %100 . "."
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/povini.vim b/runtime/syntax/povini.vim
index 726fe1fc74..ac1f87875e 100644
--- a/runtime/syntax/povini.vim
+++ b/runtime/syntax/povini.vim
@@ -5,14 +5,8 @@
" Required Vim Version: 6.0
" Setup
-if version >= 600
- " Quit when a syntax file was already loaded
- if exists("b:current_syntax")
- finish
- endif
-else
- " Croak when an old Vim is sourcing us.
- echo "Sorry, but this syntax file relies on Vim 6 features. Either upgrade Vim or usea version of " . expand("<sfile>:t:r") . " syntax file appropriate for Vim " . version/100 . "." . version %100 . "."
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/ppd.vim b/runtime/syntax/ppd.vim
index 192f70c05d..da67e1f39f 100644
--- a/runtime/syntax/ppd.vim
+++ b/runtime/syntax/ppd.vim
@@ -3,11 +3,8 @@
" Maintainer: Bjoern Jacke <bjacke@suse.de>
" Last Change: 2001-10-06
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -21,27 +18,17 @@ syn match ppdGUIText "/.*:"
syn match ppdContraints "^*UIConstraints:"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_ahdl_syn_inits")
- if version < 508
- let did_ahdl_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
-
- HiLink ppdComment Comment
- HiLink ppdDefine Statement
- HiLink ppdUI Function
- HiLink ppdUIGroup Function
- HiLink ppdDef String
- HiLink ppdGUIText Type
- HiLink ppdContraints Special
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+
+hi def link ppdComment Comment
+hi def link ppdDefine Statement
+hi def link ppdUI Function
+hi def link ppdUIGroup Function
+hi def link ppdDef String
+hi def link ppdGUIText Type
+hi def link ppdContraints Special
+
let b:current_syntax = "ppd"
diff --git a/runtime/syntax/ppwiz.vim b/runtime/syntax/ppwiz.vim
index d3d7b3a17a..514f8f36cc 100644
--- a/runtime/syntax/ppwiz.vim
+++ b/runtime/syntax/ppwiz.vim
@@ -6,11 +6,8 @@
" Filename: ppwiz.vim
" Remove old syntax stuff
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -63,33 +60,23 @@ syn match ppwizInteger "\d\+" contained
syn cluster ppwizArgVal add=ppwizString,ppwizInteger
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_ppwiz_syn_inits")
- if version < 508
- let did_ppwiz_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink ppwizSpecial Special
- HiLink ppwizEqual ppwizSpecial
- HiLink ppwizOperator ppwizSpecial
- HiLink ppwizComment Comment
- HiLink ppwizDef PreProc
- HiLink ppwizMacro Statement
- HiLink ppwizArg Identifier
- HiLink ppwizStdVar Identifier
- HiLink ppwizRexxVar Identifier
- HiLink ppwizString Constant
- HiLink ppwizInteger Constant
- HiLink ppwizCont ppwizSpecial
- HiLink ppwizError Error
- HiLink ppwizHTML Type
+hi def link ppwizSpecial Special
+hi def link ppwizEqual ppwizSpecial
+hi def link ppwizOperator ppwizSpecial
+hi def link ppwizComment Comment
+hi def link ppwizDef PreProc
+hi def link ppwizMacro Statement
+hi def link ppwizArg Identifier
+hi def link ppwizStdVar Identifier
+hi def link ppwizRexxVar Identifier
+hi def link ppwizString Constant
+hi def link ppwizInteger Constant
+hi def link ppwizCont ppwizSpecial
+hi def link ppwizError Error
+hi def link ppwizHTML Type
- delcommand HiLink
-endif
let b:current_syntax = "ppwiz"
diff --git a/runtime/syntax/prescribe.vim b/runtime/syntax/prescribe.vim
index d89ee35253..cd5ddbeedd 100644
--- a/runtime/syntax/prescribe.vim
+++ b/runtime/syntax/prescribe.vim
@@ -4,11 +4,8 @@
" URL: http://www.hampft.de/vim/syntax/prescribe.vim
" Last Change: 2005 Mar 04
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -44,25 +41,15 @@ syn region prescribeString start=+'+ end=+'+ skip=+\\'+
syn region prescribeComment start=+CMNT+ end=+;+
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_prescribe_syn_inits")
- if version < 508
- let did_prescribe_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink prescribeSpecial PreProc
- HiLink prescribeStatement Statement
- HiLink prescribeNumber Number
- HiLink prescribeCSETArg String
- HiLink prescribeFRPOArg String
- HiLink prescribeComment Comment
+hi def link prescribeSpecial PreProc
+hi def link prescribeStatement Statement
+hi def link prescribeNumber Number
+hi def link prescribeCSETArg String
+hi def link prescribeFRPOArg String
+hi def link prescribeComment Comment
- delcommand HiLink
-endif
let b:current_syntax = "prescribe"
diff --git a/runtime/syntax/procmail.vim b/runtime/syntax/procmail.vim
index c2ffa39883..93f50fe9ef 100644
--- a/runtime/syntax/procmail.vim
+++ b/runtime/syntax/procmail.vim
@@ -4,11 +4,8 @@
" Last Change: 2003 Aug 14
" Author: Sonia Heimann
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -33,34 +30,24 @@ syn region procmailActionNested start=+^\s*{+ end=+^\s*}+ contains=procmailRecip
syn region procmailRecipe start=+^\s*:.*$+ end=+^\s*\($\|}\)+me=e-1 contains=procmailComment,procmailCondition,procmailActionFolder,procmailActionVariable,procmailActionForward,procmailActionPipe,procmailActionNested,procmailVarDeclRegion
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_procmail_syntax_inits")
- if version < 508
- let did_procmail_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink procmailComment Comment
- HiLink procmailTodo Todo
+hi def link procmailComment Comment
+hi def link procmailTodo Todo
- HiLink procmailRecipe Statement
- "HiLink procmailCondition Statement
+hi def link procmailRecipe Statement
+"hi def link procmailCondition Statement
- HiLink procmailActionFolder procmailAction
- HiLink procmailActionVariable procmailAction
- HiLink procmailActionForward procmailAction
- HiLink procmailActionPipe procmailAction
- HiLink procmailAction Function
- HiLink procmailVar Identifier
- HiLink procmailVarDecl Identifier
+hi def link procmailActionFolder procmailAction
+hi def link procmailActionVariable procmailAction
+hi def link procmailActionForward procmailAction
+hi def link procmailActionPipe procmailAction
+hi def link procmailAction Function
+hi def link procmailVar Identifier
+hi def link procmailVarDecl Identifier
- HiLink procmailString String
+hi def link procmailString String
- delcommand HiLink
-endif
let b:current_syntax = "procmail"
diff --git a/runtime/syntax/progress.vim b/runtime/syntax/progress.vim
index 85a54a6505..5e7cfef299 100644
--- a/runtime/syntax/progress.vim
+++ b/runtime/syntax/progress.vim
@@ -11,22 +11,15 @@
" Version: 13
" Last Change: Nov 11 2012
-" For version 5.x: Clear all syntax item
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
let s:cpo_save = &cpo
set cpo&vim
-if version >= 600
- setlocal iskeyword=@,48-57,_,-,!,#,$,%
-else
- set iskeyword=@,48-57,_,-,!,#,$,%
-endif
+setlocal iskeyword=@,48-57,_,-,!,#,$,%
" The Progress editor doesn't cope with tabs very well.
set expandtab
@@ -282,44 +275,34 @@ syn keyword ProgressType char[acter] int[eger] int64 dec[imal] log[ical] da[te]
syn sync lines=800
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_progress_syntax_inits")
- if version < 508
- let did_progress_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- " The default methods for highlighting. Can be overridden later.
- HiLink ProgressByte Number
- HiLink ProgressCase Repeat
- HiLink ProgressComment Comment
- HiLink ProgressConditional Conditional
- HiLink ProgressDebug Debug
- HiLink ProgressDo Repeat
- HiLink ProgressEndError Error
- HiLink ProgressFor Repeat
- HiLink ProgressFunction Procedure
- HiLink ProgressIdentifier Identifier
- HiLink ProgressInclude Include
- HiLink ProgressMatrixDelimiter Identifier
- HiLink ProgressNumber Number
- HiLink ProgressOperator Operator
- HiLink ProgressPreProc PreProc
- HiLink ProgressProcedure Procedure
- HiLink ProgressQuote Delimiter
- HiLink ProgressRepeat Repeat
- HiLink ProgressReserved Statement
- HiLink ProgressSpaceError Error
- HiLink ProgressString String
- HiLink ProgressTodo Todo
- HiLink ProgressType Statement
- HiLink ProgressShowTab Error
+" The default methods for highlighting. Can be overridden later.
+hi def link ProgressByte Number
+hi def link ProgressCase Repeat
+hi def link ProgressComment Comment
+hi def link ProgressConditional Conditional
+hi def link ProgressDebug Debug
+hi def link ProgressDo Repeat
+hi def link ProgressEndError Error
+hi def link ProgressFor Repeat
+hi def link ProgressFunction Procedure
+hi def link ProgressIdentifier Identifier
+hi def link ProgressInclude Include
+hi def link ProgressMatrixDelimiter Identifier
+hi def link ProgressNumber Number
+hi def link ProgressOperator Operator
+hi def link ProgressPreProc PreProc
+hi def link ProgressProcedure Procedure
+hi def link ProgressQuote Delimiter
+hi def link ProgressRepeat Repeat
+hi def link ProgressReserved Statement
+hi def link ProgressSpaceError Error
+hi def link ProgressString String
+hi def link ProgressTodo Todo
+hi def link ProgressType Statement
+hi def link ProgressShowTab Error
- delcommand HiLink
-endif
let b:current_syntax = "progress"
diff --git a/runtime/syntax/prolog.vim b/runtime/syntax/prolog.vim
index f5f0e673ec..3b09bb3548 100644
--- a/runtime/syntax/prolog.vim
+++ b/runtime/syntax/prolog.vim
@@ -1,17 +1,17 @@
" Vim syntax file
" Language: PROLOG
-" Maintainers: Thomas Koehler <jean-luc@picard.franken.de>
-" Last Change: 2013 May 23
+" Maintainer: Thomas Koehler <jean-luc@picard.franken.de>
+" Please be aware: I'm often slow to answer email due to a high
+" non-computer related workload (sometimes 4-8 weeks)
+" Last Change: 2016 September 6
" URL: http://gott-gehabt.de/800_wer_wir_sind/thomas/Homepage/Computer/vim/syntax/prolog.vim
" There are two sets of highlighting in here:
" If the "prolog_highlighting_clean" variable exists, it is rather sparse.
" Otherwise you get more highlighting.
-" Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -78,46 +78,36 @@ syn sync maxlines=50
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_prolog_syn_inits")
- if version < 508
- let did_prolog_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default highlighting.
- HiLink prologComment Comment
- HiLink prologCComment Comment
- HiLink prologCharCode Special
-
- if exists ("prolog_highlighting_clean")
-
- HiLink prologKeyword Statement
- HiLink prologClauseHead Statement
- HiLink prologClause Normal
-
- else
-
- HiLink prologKeyword Keyword
- HiLink prologClauseHead Constant
- HiLink prologClause Normal
- HiLink prologQuestion PreProc
- HiLink prologSpecialCharacter Special
- HiLink prologNumber Number
- HiLink prologAsIs Normal
- HiLink prologCommentError Error
- HiLink prologAtom String
- HiLink prologString String
- HiLink prologOperator Operator
-
- endif
-
- delcommand HiLink
+" Only when an item doesn't have highlighting yet
+
+" The default highlighting.
+hi def link prologComment Comment
+hi def link prologCComment Comment
+hi def link prologCharCode Special
+
+if exists ("prolog_highlighting_clean")
+
+hi def link prologKeyword Statement
+hi def link prologClauseHead Statement
+hi def link prologClause Normal
+
+else
+
+hi def link prologKeyword Keyword
+hi def link prologClauseHead Constant
+hi def link prologClause Normal
+hi def link prologQuestion PreProc
+hi def link prologSpecialCharacter Special
+hi def link prologNumber Number
+hi def link prologAsIs Normal
+hi def link prologCommentError Error
+hi def link prologAtom String
+hi def link prologString String
+hi def link prologOperator Operator
+
endif
+
let b:current_syntax = "prolog"
" vim: ts=8
diff --git a/runtime/syntax/promela.vim b/runtime/syntax/promela.vim
index e812bc2749..add4514561 100644
--- a/runtime/syntax/promela.vim
+++ b/runtime/syntax/promela.vim
@@ -5,11 +5,8 @@
" Last Change: Thu Aug 7 21:22:48 CEST 2008
" Version: 0.5
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/proto.vim b/runtime/syntax/proto.vim
index 4d6a77e84a..4615e0ca0e 100644
--- a/runtime/syntax/proto.vim
+++ b/runtime/syntax/proto.vim
@@ -22,9 +22,8 @@
"
" http://code.google.com/p/protobuf/
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/protocols.vim b/runtime/syntax/protocols.vim
index 1dc109caf6..f31ca5a4b7 100644
--- a/runtime/syntax/protocols.vim
+++ b/runtime/syntax/protocols.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: protocols(5) - Internet protocols definition file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: protocols(5) - Internet protocols definition file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/psf.vim b/runtime/syntax/psf.vim
index 2b376f94cc..0971fe96bf 100644
--- a/runtime/syntax/psf.vim
+++ b/runtime/syntax/psf.vim
@@ -4,10 +4,8 @@
" Maintainer: Rex Barzee <rex_barzee@hp.com>
" Last change: 25 Apr 2001
-if version < 600
- " Remove any old syntax stuff hanging around
- syn clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -73,27 +71,17 @@ syn match psfComment "#.*$"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_psf_syntax_inits")
- if version < 508
- let did_psf_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink psfObject Statement
- HiLink psfAttrib Type
- HiLink psfQuotString String
- HiLink psfObjTag Identifier
- HiLink psfAttAbbrev PreProc
- HiLink psfObjTags Identifier
-
- HiLink psfComment Comment
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link psfObject Statement
+hi def link psfAttrib Type
+hi def link psfQuotString String
+hi def link psfObjTag Identifier
+hi def link psfAttAbbrev PreProc
+hi def link psfObjTags Identifier
+
+hi def link psfComment Comment
+
" Long descriptions and copyrights confuse the syntax highlighting, so
" force vim to backup at least 100 lines before the top visible line
diff --git a/runtime/syntax/ptcap.vim b/runtime/syntax/ptcap.vim
index 45590cf61b..1ebeb5227b 100644
--- a/runtime/syntax/ptcap.vim
+++ b/runtime/syntax/ptcap.vim
@@ -4,11 +4,8 @@
" URL: http://folk.uio.no/hakonrk/vim/syntax/ptcap.vim
" Last Change: 2001 May 15
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syn clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -73,34 +70,25 @@ syn region ptcapField start=":" skip="[^\\]\(\\\\\)*\\$" end="[^\\]\(\\\\\)*
syn region ptcapString matchgroup=ptcapOperator start="=" skip="[^\\]\(\\\\\)*\\:" matchgroup=ptcapDelimiter end=":"me=e-1 matchgroup=NONE end="[^\\]\(\\\\\)*[^\\]$" end="^$" contains=ptcapEscapedChar,ptcapLineCont keepend contained
syn region ptcapComment start="^\s*#" end="$" contains=ptcapLeadBlank
-if version >= 508 || !exists("did_ptcap_syntax_inits")
- if version < 508
- let did_ptcap_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink ptcapComment Comment
- HiLink ptcapDelimiter Delimiter
- " The highlighting of "ptcapEntry" should always be overridden by
- " its contents, so I use Todo highlighting to indicate that there
- " is work to be done with the syntax file if you can see it :-)
- HiLink ptcapEntry Todo
- HiLink ptcapError Error
- HiLink ptcapEscapedChar SpecialChar
- HiLink ptcapField Type
- HiLink ptcapLeadBlank NONE
- HiLink ptcapLineCont Special
- HiLink ptcapNames Label
- HiLink ptcapNumber NONE
- HiLink ptcapNumberError Error
- HiLink ptcapOperator Operator
- HiLink ptcapSpecialCap Type
- HiLink ptcapString NONE
-
- delcommand HiLink
-endif
+
+hi def link ptcapComment Comment
+hi def link ptcapDelimiter Delimiter
+" The highlighting of "ptcapEntry" should always be overridden by
+" its contents, so I use Todo highlighting to indicate that there
+" is work to be done with the syntax file if you can see it :-)
+hi def link ptcapEntry Todo
+hi def link ptcapError Error
+hi def link ptcapEscapedChar SpecialChar
+hi def link ptcapField Type
+hi def link ptcapLeadBlank NONE
+hi def link ptcapLineCont Special
+hi def link ptcapNames Label
+hi def link ptcapNumber NONE
+hi def link ptcapNumberError Error
+hi def link ptcapOperator Operator
+hi def link ptcapSpecialCap Type
+hi def link ptcapString NONE
+
let b:current_syntax = "ptcap"
diff --git a/runtime/syntax/purifylog.vim b/runtime/syntax/purifylog.vim
index 8bcfb4b006..2143d9fe28 100644
--- a/runtime/syntax/purifylog.vim
+++ b/runtime/syntax/purifylog.vim
@@ -3,11 +3,8 @@
" Maintainer: Gautam H. Mudunuri <gmudunur@informatica.com>
" Last Change: 2003 May 11
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -57,62 +54,52 @@ syn match purifyLogZPR "^ZPR:.*$"
syn match purifyLogZPW "^ZPW:.*$"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_purifyLog_syntax_inits")
- if version < 508
- let did_purifyLog_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink purifyLogFIU purifyLogInformational
- HiLink purifyLogMAF purifyLogInformational
- HiLink purifyLogMIU purifyLogInformational
- HiLink purifyLogSIG purifyLogInformational
- HiLink purifyLogWPF purifyLogInformational
- HiLink purifyLogWPM purifyLogInformational
- HiLink purifyLogWPN purifyLogInformational
- HiLink purifyLogWPR purifyLogInformational
- HiLink purifyLogWPW purifyLogInformational
- HiLink purifyLogWPX purifyLogInformational
+hi def link purifyLogFIU purifyLogInformational
+hi def link purifyLogMAF purifyLogInformational
+hi def link purifyLogMIU purifyLogInformational
+hi def link purifyLogSIG purifyLogInformational
+hi def link purifyLogWPF purifyLogInformational
+hi def link purifyLogWPM purifyLogInformational
+hi def link purifyLogWPN purifyLogInformational
+hi def link purifyLogWPR purifyLogInformational
+hi def link purifyLogWPW purifyLogInformational
+hi def link purifyLogWPX purifyLogInformational
- HiLink purifyLogABR purifyLogWarning
- HiLink purifyLogBSR purifyLogWarning
- HiLink purifyLogBSW purifyLogWarning
- HiLink purifyLogFMR purifyLogWarning
- HiLink purifyLogMLK purifyLogWarning
- HiLink purifyLogMSE purifyLogWarning
- HiLink purifyLogPAR purifyLogWarning
- HiLink purifyLogPLK purifyLogWarning
- HiLink purifyLogSBR purifyLogWarning
- HiLink purifyLogSOF purifyLogWarning
- HiLink purifyLogUMC purifyLogWarning
- HiLink purifyLogUMR purifyLogWarning
+hi def link purifyLogABR purifyLogWarning
+hi def link purifyLogBSR purifyLogWarning
+hi def link purifyLogBSW purifyLogWarning
+hi def link purifyLogFMR purifyLogWarning
+hi def link purifyLogMLK purifyLogWarning
+hi def link purifyLogMSE purifyLogWarning
+hi def link purifyLogPAR purifyLogWarning
+hi def link purifyLogPLK purifyLogWarning
+hi def link purifyLogSBR purifyLogWarning
+hi def link purifyLogSOF purifyLogWarning
+hi def link purifyLogUMC purifyLogWarning
+hi def link purifyLogUMR purifyLogWarning
- HiLink purifyLogABW purifyLogCorrupting
- HiLink purifyLogBRK purifyLogCorrupting
- HiLink purifyLogFMW purifyLogCorrupting
- HiLink purifyLogFNH purifyLogCorrupting
- HiLink purifyLogFUM purifyLogCorrupting
- HiLink purifyLogMRE purifyLogCorrupting
- HiLink purifyLogSBW purifyLogCorrupting
+hi def link purifyLogABW purifyLogCorrupting
+hi def link purifyLogBRK purifyLogCorrupting
+hi def link purifyLogFMW purifyLogCorrupting
+hi def link purifyLogFNH purifyLogCorrupting
+hi def link purifyLogFUM purifyLogCorrupting
+hi def link purifyLogMRE purifyLogCorrupting
+hi def link purifyLogSBW purifyLogCorrupting
- HiLink purifyLogCOR purifyLogFatal
- HiLink purifyLogNPR purifyLogFatal
- HiLink purifyLogNPW purifyLogFatal
- HiLink purifyLogZPR purifyLogFatal
- HiLink purifyLogZPW purifyLogFatal
+hi def link purifyLogCOR purifyLogFatal
+hi def link purifyLogNPR purifyLogFatal
+hi def link purifyLogNPW purifyLogFatal
+hi def link purifyLogZPR purifyLogFatal
+hi def link purifyLogZPW purifyLogFatal
- HiLink purifyLogHeader Comment
- HiLink purifyLogInformational PreProc
- HiLink purifyLogWarning Type
- HiLink purifyLogCorrupting Error
- HiLink purifyLogFatal Error
+hi def link purifyLogHeader Comment
+hi def link purifyLogInformational PreProc
+hi def link purifyLogWarning Type
+hi def link purifyLogCorrupting Error
+hi def link purifyLogFatal Error
- delcommand HiLink
-endif
let b:current_syntax = "purifylog"
diff --git a/runtime/syntax/pyrex.vim b/runtime/syntax/pyrex.vim
index 7dc9b955b0..b860658975 100644
--- a/runtime/syntax/pyrex.vim
+++ b/runtime/syntax/pyrex.vim
@@ -4,21 +4,14 @@
" URL: http://marcobari.altervista.org/pyrex_vim.html
" Last Change: 2009 Nov 09
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" Read the Python syntax to start with
-if version < 600
- so <sfile>:p:h/python.vim
-else
- runtime! syntax/python.vim
- unlet b:current_syntax
-endif
+runtime! syntax/python.vim
+unlet b:current_syntax
" Pyrex extentions
syn keyword pyrexStatement cdef typedef ctypedef sizeof
@@ -44,24 +37,15 @@ syn match pythonInclude "from"
syn match pyrexForFrom "\(for[^:]*\)\@<=from"
" Default highlighting
-if version >= 508 || !exists("did_pyrex_syntax_inits")
- if version < 508
- let did_pyrex_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink pyrexStatement Statement
- HiLink pyrexType Type
- HiLink pyrexStructure Structure
- HiLink pyrexInclude PreCondit
- HiLink pyrexAccess pyrexStatement
- if exists("python_highlight_builtins") || exists("pyrex_highlight_builtins")
- HiLink pyrexBuiltin Function
- endif
- HiLink pyrexForFrom Statement
-
- delcommand HiLink
+hi def link pyrexStatement Statement
+hi def link pyrexType Type
+hi def link pyrexStructure Structure
+hi def link pyrexInclude PreCondit
+hi def link pyrexAccess pyrexStatement
+if exists("python_highlight_builtins") || exists("pyrex_highlight_builtins")
+hi def link pyrexBuiltin Function
endif
+hi def link pyrexForFrom Statement
+
let b:current_syntax = "pyrex"
diff --git a/runtime/syntax/python.vim b/runtime/syntax/python.vim
index 2a0ea5de2b..5aec2fe3d2 100644
--- a/runtime/syntax/python.vim
+++ b/runtime/syntax/python.vim
@@ -1,7 +1,7 @@
" Vim syntax file
" Language: Python
" Maintainer: Zvezdan Petkovic <zpetkovic@acm.org>
-" Last Change: 2016 Feb 20
+" Last Change: 2016 Oct 29
" Credits: Neil Schemenauer <nas@python.ca>
" Dmitry Vasiliev
"
@@ -36,11 +36,8 @@
" let python_highlight_all = 1
"
-" For version 5.x: Clear all syntax items.
-" For version 6.x: Quit when a syntax file was already loaded.
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded.
+if exists("b:current_syntax")
finish
endif
@@ -49,6 +46,29 @@ endif
let s:cpo_save = &cpo
set cpo&vim
+if exists("python_no_doctest_highlight")
+ let python_no_doctest_code_highlight = 1
+endif
+
+if exists("python_highlight_all")
+ if exists("python_no_builtin_highlight")
+ unlet python_no_builtin_highlight
+ endif
+ if exists("python_no_doctest_code_highlight")
+ unlet python_no_doctest_code_highlight
+ endif
+ if exists("python_no_doctest_highlight")
+ unlet python_no_doctest_highlight
+ endif
+ if exists("python_no_exception_highlight")
+ unlet python_no_exception_highlight
+ endif
+ if exists("python_no_number_highlight")
+ unlet python_no_number_highlight
+ endif
+ let python_space_error_highlight = 1
+endif
+
" Keep Python keywords in alphabetical order inside groups for easy
" comparison with the table in the 'Python Language Reference'
" https://docs.python.org/2/reference/lexical_analysis.html#keywords,
@@ -72,7 +92,7 @@ set cpo&vim
" built-in below (use 'from __future__ import print_function' in 2)
" - async and await were added in Python 3.5 and are soft keywords.
"
-syn keyword pythonStatement False, None, True
+syn keyword pythonStatement False None True
syn keyword pythonStatement as assert break continue del exec global
syn keyword pythonStatement lambda nonlocal pass print return with yield
syn keyword pythonStatement class def nextgroup=pythonFunction skipwhite
@@ -84,14 +104,31 @@ syn keyword pythonInclude from import
syn keyword pythonAsync async await
" Decorators (new in Python 2.4)
-syn match pythonDecorator "@" display nextgroup=pythonFunction skipwhite
-" The zero-length non-grouping match before the function name is
-" extremely important in pythonFunction. Without it, everything is
-" interpreted as a function inside the contained environment of
-" doctests.
" A dot must be allowed because of @MyClass.myfunc decorators.
-syn match pythonFunction
- \ "\%(\%(def\s\|class\s\|@\)\s*\)\@<=\h\%(\w\|\.\)*" contained
+syn match pythonDecorator "@" display contained
+syn match pythonDecoratorName "@\s*\h\%(\w\|\.\)*" display contains=pythonDecorator
+
+" Python 3.5 introduced the use of the same symbol for matrix multiplication:
+" https://www.python.org/dev/peps/pep-0465/. We now have to exclude the
+" symbol from highlighting when used in that context.
+" Single line multiplication.
+syn match pythonMatrixMultiply
+ \ "\%(\w\|[])]\)\s*@"
+ \ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue
+ \ transparent
+" Multiplication continued on the next line after backslash.
+syn match pythonMatrixMultiply
+ \ "[^\\]\\\s*\n\%(\s*\.\.\.\s\)\=\s\+@"
+ \ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue
+ \ transparent
+" Multiplication in a parenthesized expression over multiple lines with @ at
+" the start of each continued line; very similar to decorators and complex.
+syn match pythonMatrixMultiply
+ \ "^\s*\%(\%(>>>\|\.\.\.\)\s\+\)\=\zs\%(\h\|\%(\h\|[[(]\).\{-}\%(\w\|[])]\)\)\s*\n\%(\s*\.\.\.\s\)\=\s\+@\%(.\{-}\n\%(\s*\.\.\.\s\)\=\s\+@\)*"
+ \ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue
+ \ transparent
+
+syn match pythonFunction "\h\w*" display contained
syn match pythonComment "#.*$" contains=pythonTodo,@Spell
syn keyword pythonTodo FIXME NOTE NOTES TODO XXX contained
@@ -118,25 +155,6 @@ syn match pythonEscape "\%(\\u\x\{4}\|\\U\x\{8}\)" contained
syn match pythonEscape "\\N{\a\+\%(\s\a\+\)*}" contained
syn match pythonEscape "\\$"
-if exists("python_highlight_all")
- if exists("python_no_builtin_highlight")
- unlet python_no_builtin_highlight
- endif
- if exists("python_no_doctest_code_highlight")
- unlet python_no_doctest_code_highlight
- endif
- if exists("python_no_doctest_highlight")
- unlet python_no_doctest_highlight
- endif
- if exists("python_no_exception_highlight")
- unlet python_no_exception_highlight
- endif
- if exists("python_no_number_highlight")
- unlet python_no_number_highlight
- endif
- let python_space_error_highlight = 1
-endif
-
" It is very important to understand all details before changing the
" regular expressions below or their order.
" The word boundaries are *not* the floating-point number boundaries
@@ -200,7 +218,9 @@ if !exists("python_no_builtin_highlight")
" non-essential built-in functions; Python 2 only
syn keyword pythonBuiltin apply buffer coerce intern
" avoid highlighting attributes as builtins
- syn match pythonAttribute /\.\h\w*/hs=s+1 contains=ALLBUT,pythonBuiltin transparent
+ syn match pythonAttribute /\.\h\w*/hs=s+1
+ \ contains=ALLBUT,pythonBuiltin,pythonFunction,pythonAsync
+ \ transparent
endif
" From the 'Python Library Reference' class hierarchy at the bottom.
@@ -262,7 +282,7 @@ if !exists("python_no_doctest_highlight")
if !exists("python_no_doctest_code_highlight")
syn region pythonDoctest
\ start="^\s*>>>\s" end="^\s*$"
- \ contained contains=ALLBUT,pythonDoctest,@Spell
+ \ contained contains=ALLBUT,pythonDoctest,pythonFunction,@Spell
syn region pythonDoctestValue
\ start=+^\s*\%(>>>\s\|\.\.\.\s\|"""\|'''\)\@!\S\++ end="$"
\ contained
@@ -274,51 +294,41 @@ if !exists("python_no_doctest_highlight")
endif
" Sync at the beginning of class, function, or method definition.
-syn sync match pythonSync grouphere NONE "^\s*\%(def\|class\)\s\+\h\w*\s*("
-
-if version >= 508 || !exists("did_python_syn_inits")
- if version <= 508
- let did_python_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+syn sync match pythonSync grouphere NONE "^\%(def\|class\)\s\+\h\w*\s*[(:]"
- " The default highlight links. Can be overridden later.
- HiLink pythonStatement Statement
- HiLink pythonConditional Conditional
- HiLink pythonRepeat Repeat
- HiLink pythonOperator Operator
- HiLink pythonException Exception
- HiLink pythonInclude Include
- HiLink pythonAsync Statement
- HiLink pythonDecorator Define
- HiLink pythonFunction Function
- HiLink pythonComment Comment
- HiLink pythonTodo Todo
- HiLink pythonString String
- HiLink pythonRawString String
- HiLink pythonQuotes String
- HiLink pythonTripleQuotes pythonQuotes
- HiLink pythonEscape Special
- if !exists("python_no_number_highlight")
- HiLink pythonNumber Number
- endif
- if !exists("python_no_builtin_highlight")
- HiLink pythonBuiltin Function
- endif
- if !exists("python_no_exception_highlight")
- HiLink pythonExceptions Structure
- endif
- if exists("python_space_error_highlight")
- HiLink pythonSpaceError Error
- endif
- if !exists("python_no_doctest_highlight")
- HiLink pythonDoctest Special
- HiLink pythonDoctestValue Define
- endif
-
- delcommand HiLink
+" The default highlight links. Can be overridden later.
+hi def link pythonStatement Statement
+hi def link pythonConditional Conditional
+hi def link pythonRepeat Repeat
+hi def link pythonOperator Operator
+hi def link pythonException Exception
+hi def link pythonInclude Include
+hi def link pythonAsync Statement
+hi def link pythonDecorator Define
+hi def link pythonDecoratorName Function
+hi def link pythonFunction Function
+hi def link pythonComment Comment
+hi def link pythonTodo Todo
+hi def link pythonString String
+hi def link pythonRawString String
+hi def link pythonQuotes String
+hi def link pythonTripleQuotes pythonQuotes
+hi def link pythonEscape Special
+if !exists("python_no_number_highlight")
+ hi def link pythonNumber Number
+endif
+if !exists("python_no_builtin_highlight")
+ hi def link pythonBuiltin Function
+endif
+if !exists("python_no_exception_highlight")
+ hi def link pythonExceptions Structure
+endif
+if exists("python_space_error_highlight")
+ hi def link pythonSpaceError Error
+endif
+if !exists("python_no_doctest_highlight")
+ hi def link pythonDoctest Special
+ hi def link pythonDoctestValue Define
endif
let b:current_syntax = "python"
diff --git a/runtime/syntax/quake.vim b/runtime/syntax/quake.vim
index 3a9b68d6f3..7db53106ad 100644
--- a/runtime/syntax/quake.vim
+++ b/runtime/syntax/quake.vim
@@ -1,11 +1,11 @@
" Vim syntax file
-" Language: Quake[1-3] configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2007-06-17
+" Language: Quake[1-3] configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-06-17
" quake_is_quake1 - the syntax is to be used for quake1 configs
" quake_is_quake2 - the syntax is to be used for quake2 configs
" quake_is_quake3 - the syntax is to be used for quake3 configs
-" Credits: Tomasz Kalkosinski wrote the original quake3Colors stuff
+" Credits: Tomasz Kalkosinski wrote the original quake3Colors stuff
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/r.vim b/runtime/syntax/r.vim
index d96bf96acb..9e25dae363 100644
--- a/runtime/syntax/r.vim
+++ b/runtime/syntax/r.vim
@@ -5,10 +5,10 @@
" Tom Payne <tom@tompayne.org>
" Contributor: Johannes Ranke <jranke@uni-bremen.de>
" Homepage: https://github.com/jalvesaq/R-Vim-runtime
-" Last Change: Thu Mar 10, 2016 12:26PM
+" Last Change: Wed Aug 01, 2018 10:10PM
" Filenames: *.R *.r *.Rhistory *.Rt
"
-" NOTE: The highlighting of R functions is defined in
+" NOTE: The highlighting of R functions might be defined in
" runtime files created by a filetype plugin, if installed.
"
" CONFIGURATION:
@@ -18,7 +18,7 @@
"
" ROxygen highlighting can be turned off by
"
-" let r_hl_roxygen = 0
+" let r_syntax_hl_roxygen = 0
"
" Some lines of code were borrowed from Zhuojun Chen.
@@ -26,35 +26,136 @@ if exists("b:current_syntax")
finish
endif
-setlocal iskeyword=@,48-57,_,.
+if has("patch-7.4.1142")
+ syn iskeyword @,48-57,_,.
+else
+ setlocal iskeyword=@,48-57,_,.
+endif
+
+" The variables g:r_hl_roxygen and g:r_syn_minlines were renamed on April 8, 2017.
+if exists("g:r_hl_roxygen")
+ let g:r_syntax_hl_roxygen = g:r_hl_roxygen
+endif
+if exists("g:r_syn_minlines")
+ let g:r_syntax_minlines = g:r_syn_minlines
+endif
if exists("g:r_syntax_folding") && g:r_syntax_folding
setlocal foldmethod=syntax
endif
-if !exists("g:r_hl_roxygen")
- let g:r_hl_roxygen = 1
-endif
+
+let g:r_syntax_hl_roxygen = get(g:, 'r_syntax_hl_roxygen', 1)
syn case match
" Comment
syn match rCommentTodo contained "\(BUG\|FIXME\|NOTE\|TODO\):"
-syn match rComment contains=@Spell,rCommentTodo,rOBlock "#.*"
+syn match rTodoParen contained "\(BUG\|FIXME\|NOTE\|TODO\)\s*(.\{-})\s*:" contains=rTodoKeyw,rTodoInfo transparent
+syn keyword rTodoKeyw BUG FIXME NOTE TODO contained
+syn match rTodoInfo "(\zs.\{-}\ze)" contained
+syn match rComment contains=@Spell,rCommentTodo,rTodoParen,rOBlock "#.*"
" Roxygen
-if g:r_hl_roxygen
- syn region rOBlock start="^\s*\n#\{1,2}' " start="\%^#\{1,2}' " end="^\(#\{1,2}'\)\@!" contains=rOTitle,rOKeyword,rOExamples,@Spell keepend
- syn region rOTitle start="^\s*\n#\{1,2}' " start="\%^#\{1,2}' " end="^\(#\{1,2}'\s*$\)\@=" contained contains=rOCommentKey
- syn match rOCommentKey "#\{1,2}'" containedin=rOTitle contained
-
- syn region rOExamples start="^#\{1,2}' @examples.*"rs=e+1,hs=e+1 end="^\(#\{1,2}' @.*\)\@=" end="^\(#\{1,2}'\)\@!" contained contains=rOKeyword
-
- syn match rOKeyword contained "@\(param\|return\|name\|rdname\|examples\|example\|include\|docType\)"
- syn match rOKeyword contained "@\(S3method\|TODO\|aliases\|alias\|assignee\|author\|callGraphDepth\|callGraph\)"
- syn match rOKeyword contained "@\(callGraphPrimitives\|concept\|exportClass\|exportMethod\|exportPattern\|export\|formals\)"
- syn match rOKeyword contained "@\(format\|importClassesFrom\|importFrom\|importMethodsFrom\|import\|keywords\|useDynLib\)"
- syn match rOKeyword contained "@\(method\|noRd\|note\|references\|seealso\|setClass\|slot\|source\|title\|usage\)"
- syn match rOKeyword contained "@\(family\|template\|templateVar\|description\|details\|inheritParams\|field\)"
+if g:r_syntax_hl_roxygen
+ " A roxygen block can start at the beginning of a file (first version) and
+ " after a blank line (second version). It ends when a line that does not
+ " contain a roxygen comment. In the following comments, any line containing
+ " a roxygen comment marker (one or two hash signs # followed by a single
+ " quote ' and preceded only by whitespace) is called a roxygen line. A
+ " roxygen line containing only a roxygen comment marker, optionally followed
+ " by whitespace is called an empty roxygen line.
+
+ " First we match all roxygen blocks as containing only a title. In case an
+ " empty roxygen line ending the title or a tag is found, this will be
+ " overridden later by the definitions of rOBlock.
+ syn match rOTitleBlock "\%^\(\s*#\{1,2}' .*\n\)\{1,}" contains=rOCommentKey,rOTitleTag
+ syn match rOTitleBlock "^\s*\n\(\s*#\{1,2}' .*\n\)\{1,}" contains=rOCommentKey,rOTitleTag
+
+ " When a roxygen block has a title and additional content, the title
+ " consists of one or more roxygen lines (as little as possible are matched),
+ " followed either by an empty roxygen line
+ syn region rOBlock start="\%^\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" end="^\s*\(#\{1,2}'\)\@!" contains=rOTitle,rOTag,rOExamples,@Spell keepend fold
+ syn region rOBlock start="^\s*\n\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" end="^\s*\(#\{1,2}'\)\@!" contains=rOTitle,rOTag,rOExamples,@Spell keepend fold
+
+ " or by a roxygen tag (we match everything starting with @ but not @@ which is used as escape sequence for a literal @).
+ syn region rOBlock start="\%^\(\s*#\{1,2}' .*\n\)\{-}\s*#\{1,2}' @\(@\)\@!" end="^\s*\(#\{1,2}'\)\@!" contains=rOTitle,rOTag,rOExamples,@Spell keepend fold
+ syn region rOBlock start="^\s*\n\(\s*#\{1,2}' .*\n\)\{-}\s*#\{1,2}' @\(@\)\@!" end="^\s*\(#\{1,2}'\)\@!" contains=rOTitle,rOTag,rOExamples,@Spell keepend fold
+
+ " If a block contains an @rdname, @describeIn tag, it may have paragraph breaks, but does not have a title
+ syn region rOBlockNoTitle start="\%^\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*\n\(\s*#\{1,2}'.*\n\)\{-}\s*#\{1,2}' @rdname" end="^\s*\(#\{1,2}'\)\@!" contains=rOTag,rOExamples,@Spell keepend fold
+ syn region rOBlockNoTitle start="^\s*\n\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*\n\(\s*#\{1,2}'.*\n\)\{-}\s*#\{1,2}' @rdname" end="^\s*\(#\{1,2}'\)\@!" contains=rOTag,rOExamples,@Spell keepend fold
+ syn region rOBlockNoTitle start="\%^\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*\n\(\s*#\{1,2}'.*\n\)\{-}\s*#\{1,2}' @describeIn" end="^\s*\(#\{1,2}'\)\@!" contains=rOTag,rOExamples,@Spell keepend fold
+ syn region rOBlockNoTitle start="^\s*\n\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*\n\(\s*#\{1,2}'.*\n\)\{-}\s*#\{1,2}' @describeIn" end="^\s*\(#\{1,2}'\)\@!" contains=rOTag,rOExamples,@Spell keepend fold
+
+ " A title as part of a block is always at the beginning of the block, i.e.
+ " either at the start of a file or after a completely empty line.
+ syn match rOTitle "\%^\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" contained contains=rOCommentKey,rOTitleTag
+ syn match rOTitle "^\s*\n\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" contained contains=rOCommentKey,rOTitleTag
+ syn match rOTitleTag contained "@title"
+
+ syn match rOCommentKey "^\s*#\{1,2}'" contained
+ syn region rOExamples start="^#\{1,2}' @examples.*"rs=e+1,hs=e+1 end="^\(#\{1,2}' @.*\)\@=" end="^\(#\{1,2}'\)\@!" contained contains=rOTag fold
+
+ " rOTag list generated from the lists in
+ " https://github.com/klutometis/roxygen/R/rd.R and
+ " https://github.com/klutometis/roxygen/R/namespace.R
+ " using s/^ \([A-Za-z0-9]*\) = .*/ syn match rOTag contained "@\1"/
+ " Plus we need the @include tag
+
+ " rd.R
+ syn match rOTag contained "@aliases"
+ syn match rOTag contained "@author"
+ syn match rOTag contained "@backref"
+ syn match rOTag contained "@concept"
+ syn match rOTag contained "@describeIn"
+ syn match rOTag contained "@description"
+ syn match rOTag contained "@details"
+ syn match rOTag contained "@docType"
+ syn match rOTag contained "@encoding"
+ syn match rOTag contained "@evalRd"
+ syn match rOTag contained "@example"
+ syn match rOTag contained "@examples"
+ syn match rOTag contained "@family"
+ syn match rOTag contained "@field"
+ syn match rOTag contained "@format"
+ syn match rOTag contained "@inherit"
+ syn match rOTag contained "@inheritParams"
+ syn match rOTag contained "@inheritDotParams"
+ syn match rOTag contained "@inheritSection"
+ syn match rOTag contained "@keywords"
+ syn match rOTag contained "@method"
+ syn match rOTag contained "@name"
+ syn match rOTag contained "@md"
+ syn match rOTag contained "@noMd"
+ syn match rOTag contained "@noRd"
+ syn match rOTag contained "@note"
+ syn match rOTag contained "@param"
+ syn match rOTag contained "@rdname"
+ syn match rOTag contained "@rawRd"
+ syn match rOTag contained "@references"
+ syn match rOTag contained "@return"
+ syn match rOTag contained "@section"
+ syn match rOTag contained "@seealso"
+ syn match rOTag contained "@slot"
+ syn match rOTag contained "@source"
+ syn match rOTag contained "@template"
+ syn match rOTag contained "@templateVar"
+ syn match rOTag contained "@title"
+ syn match rOTag contained "@usage"
+ " namespace.R
+ syn match rOTag contained "@export"
+ syn match rOTag contained "@exportClass"
+ syn match rOTag contained "@exportMethod"
+ syn match rOTag contained "@exportPattern"
+ syn match rOTag contained "@import"
+ syn match rOTag contained "@importClassesFrom"
+ syn match rOTag contained "@importFrom"
+ syn match rOTag contained "@importMethodsFrom"
+ syn match rOTag contained "@rawNamespace"
+ syn match rOTag contained "@S3method"
+ syn match rOTag contained "@useDynLib"
+ " other
+ syn match rOTag contained "@include"
endif
@@ -157,6 +258,7 @@ if exists("g:r_syntax_folding")
syn region rRegion matchgroup=Delimiter start=/(/ matchgroup=Delimiter end=/)/ transparent contains=ALLBUT,rError,rBraceError,rCurlyError fold
syn region rRegion matchgroup=Delimiter start=/{/ matchgroup=Delimiter end=/}/ transparent contains=ALLBUT,rError,rBraceError,rParenError fold
syn region rRegion matchgroup=Delimiter start=/\[/ matchgroup=Delimiter end=/]/ transparent contains=ALLBUT,rError,rCurlyError,rParenError fold
+ syn region rSection matchgroup=Title start=/^#.*[-=#]\{4,}/ end=/^#.*[-=#]\{4,}/ms=s-2,me=s-1 transparent contains=ALL fold
else
syn region rRegion matchgroup=Delimiter start=/(/ matchgroup=Delimiter end=/)/ transparent contains=ALLBUT,rError,rBraceError,rCurlyError
syn region rRegion matchgroup=Delimiter start=/{/ matchgroup=Delimiter end=/}/ transparent contains=ALLBUT,rError,rBraceError,rParenError
@@ -168,14 +270,23 @@ syn match rBraceError "[)}]" contained
syn match rCurlyError "[)\]]" contained
syn match rParenError "[\]}]" contained
-if !exists("g:R_hi_fun")
- let g:R_hi_fun = 1
+" Use Nvim-R to highlight functions dynamically if it is installed
+if !exists("g:r_syntax_fun_pattern")
+ let s:ff = split(substitute(globpath(&rtp, "R/functions.vim"), "functions.vim", "", "g"), "\n")
+ if len(s:ff) > 0
+ let g:r_syntax_fun_pattern = 0
+ else
+ let g:r_syntax_fun_pattern = 1
+ endif
endif
-if g:R_hi_fun
+
+" Only use Nvim-R to highlight functions if they should not be highlighted
+" according to a generic pattern
+if g:r_syntax_fun_pattern == 1
+ syn match rFunction '[0-9a-zA-Z_\.]\+\s*\ze('
+else
" Nvim-R:
runtime R/functions.vim
- " Vim-R-plugin:
- runtime r-plugin/functions.vim
endif
syn match rDollar display contained "\$"
@@ -198,7 +309,7 @@ syn keyword rType array category character complex double function integer list
" Name of object with spaces
if &filetype != "rmd" && &filetype != "rrst"
- syn region rNameWSpace start="`" end="`"
+ syn region rNameWSpace start="`" end="`" contains=rSpaceFun
endif
if &filetype == "rhelp"
@@ -207,8 +318,8 @@ if &filetype == "rhelp"
syn match rhSection "\\dontrun\>"
endif
-if exists("r_syn_minlines")
- exe "syn sync minlines=" . r_syn_minlines
+if exists("r_syntax_minlines")
+ exe "syn sync minlines=" . r_syntax_minlines
else
syn sync minlines=40
endif
@@ -218,7 +329,10 @@ hi def link rAssign Statement
hi def link rBoolean Boolean
hi def link rBraceError Error
hi def link rComment Comment
+hi def link rTodoParen Comment
+hi def link rTodoInfo SpecialComment
hi def link rCommentTodo Todo
+hi def link rTodoKeyw Todo
hi def link rComplex Number
hi def link rConditional Conditional
hi def link rConstant Constant
@@ -228,6 +342,7 @@ hi def link rDollar SpecialChar
hi def link rError Error
hi def link rFloat Float
hi def link rFunction Function
+hi def link rSpaceFun Function
hi def link rHelpIdent Identifier
hi def link rhPreProc PreProc
hi def link rhSection PreCondit
@@ -245,15 +360,17 @@ hi def link rStatement Statement
hi def link rString String
hi def link rStrError Error
hi def link rType Type
-if g:r_hl_roxygen
- hi def link rOKeyword Title
- hi def link rOBlock Comment
+if g:r_syntax_hl_roxygen
+ hi def link rOTitleTag Operator
+ hi def link rOTag Operator
+ hi def link rOTitleBlock Title
+ hi def link rOBlock Comment
+ hi def link rOBlockNoTitle Comment
hi def link rOTitle Title
hi def link rOCommentKey Comment
hi def link rOExamples SpecialComment
endif
-
let b:current_syntax="r"
" vim: ts=8 sw=2
diff --git a/runtime/syntax/racc.vim b/runtime/syntax/racc.vim
index d412227cbd..2d4c176eb7 100644
--- a/runtime/syntax/racc.vim
+++ b/runtime/syntax/racc.vim
@@ -1,7 +1,7 @@
" Vim default file
-" Language: Racc input file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2008-06-22
+" Language: Racc input file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-06-22
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/radiance.vim b/runtime/syntax/radiance.vim
index 461b708f0e..c49e339a28 100644
--- a/runtime/syntax/radiance.vim
+++ b/runtime/syntax/radiance.vim
@@ -18,20 +18,13 @@
" comments, external command names and the null-modifier "void".
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" all printing characters except '#' and '!' are valid in names.
-if version >= 600
- setlocal iskeyword=\",$-~
-else
- set iskeyword=\",$-~
-endif
+setlocal iskeyword=\",$-~
" The null-modifier
syn keyword radianceKeyword void
@@ -130,29 +123,19 @@ syn keyword radianceTodo contained TODO XXX
syn match radianceComment "#.*$" contains=radianceTodo
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_radiance_syn_inits")
- if version < 508
- let did_radiance_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink radianceKeyword Keyword
- HiLink radianceExtraType Type
- HiLink radianceSurfType Type
- HiLink radianceLightType Type
- HiLink radianceMatType Type
- HiLink radiancePatType Type
- HiLink radianceTexType Type
- HiLink radianceMixType Type
- HiLink radianceComment Comment
- HiLink radianceCommand Function
- HiLink radianceID String
- HiLink radianceTodo Todo
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+hi def link radianceKeyword Keyword
+hi def link radianceExtraType Type
+hi def link radianceSurfType Type
+hi def link radianceLightType Type
+hi def link radianceMatType Type
+hi def link radiancePatType Type
+hi def link radianceTexType Type
+hi def link radianceMixType Type
+hi def link radianceComment Comment
+hi def link radianceCommand Function
+hi def link radianceID String
+hi def link radianceTodo Todo
let b:current_syntax = "radiance"
diff --git a/runtime/syntax/ratpoison.vim b/runtime/syntax/ratpoison.vim
index 9fc59bec0d..af8676c43d 100644
--- a/runtime/syntax/ratpoison.vim
+++ b/runtime/syntax/ratpoison.vim
@@ -5,11 +5,8 @@
" Last Change: 2011 Apr 11
" Previous Maintainer: Doug Kearns <djkea2@gus.gscit.monash.edu.au>
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -247,33 +244,23 @@ syn match ratpoisonVoidCommand "^\s*\zsvsplit\ze\s*$"
syn match ratpoisonVoidCommand "^\s*\zswindows\ze\s*$"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_ratpoison_syn_inits")
- if version < 508
- let did_ratpoison_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink ratpoisonBooleanArg Boolean
- HiLink ratpoisonCommandArg Keyword
- HiLink ratpoisonComment Comment
- HiLink ratpoisonDefCommand Identifier
- HiLink ratpoisonGravityArg Constant
- HiLink ratpoisonKeySeqArg Special
- HiLink ratpoisonNumberArg Number
- HiLink ratpoisonSetArg Keyword
- HiLink ratpoisonStringCommand Identifier
- HiLink ratpoisonTodo Todo
- HiLink ratpoisonVoidCommand Identifier
- HiLink ratpoisonWinFmtArg Special
- HiLink ratpoisonWinNameArg Constant
- HiLink ratpoisonWinListArg Constant
+hi def link ratpoisonBooleanArg Boolean
+hi def link ratpoisonCommandArg Keyword
+hi def link ratpoisonComment Comment
+hi def link ratpoisonDefCommand Identifier
+hi def link ratpoisonGravityArg Constant
+hi def link ratpoisonKeySeqArg Special
+hi def link ratpoisonNumberArg Number
+hi def link ratpoisonSetArg Keyword
+hi def link ratpoisonStringCommand Identifier
+hi def link ratpoisonTodo Todo
+hi def link ratpoisonVoidCommand Identifier
+hi def link ratpoisonWinFmtArg Special
+hi def link ratpoisonWinNameArg Constant
+hi def link ratpoisonWinListArg Constant
- delcommand HiLink
-endif
let b:current_syntax = "ratpoison"
diff --git a/runtime/syntax/rc.vim b/runtime/syntax/rc.vim
index a2d5824d3e..4c6856bc83 100644
--- a/runtime/syntax/rc.vim
+++ b/runtime/syntax/rc.vim
@@ -8,11 +8,8 @@
" This file is based on the c.vim
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -148,55 +145,45 @@ syn region rcPreProc start="^\s*#\s*\(pragma\>\|line\>\|warning\>\|warn\>\|erro
syn sync ccomment rcComment minlines=10
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_rc_syntax_inits")
- if version < 508
- let did_rc_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink rcCharacter Character
- HiLink rcSpecialCharacter rcSpecial
- HiLink rcNumber Number
- HiLink rcFloat Float
- HiLink rcOctalError rcError
- HiLink rcParenError rcError
- HiLink rcInParen rcError
- HiLink rcCommentError rcError
- HiLink rcInclude Include
- HiLink rcPreProc PreProc
- HiLink rcDefine Macro
- HiLink rcIncluded rcString
- HiLink rcError Error
- HiLink rcPreCondit PreCondit
- HiLink rcCommentString rcString
- HiLink rcComment2String rcString
- HiLink rcCommentSkip rcComment
- HiLink rcString String
- HiLink rcComment Comment
- HiLink rcSpecial SpecialChar
- HiLink rcTodo Todo
-
- HiLink rcAttribute rcCommonAttribute
- HiLink rcStdId rcStatement
- HiLink rcStatement Statement
-
- " Default color overrides
- hi def rcLanguage term=reverse ctermbg=Red ctermfg=Yellow guibg=Red guifg=Yellow
- hi def rcMainObject term=underline ctermfg=Blue guifg=Blue
- hi def rcSubObject ctermfg=Green guifg=Green
- hi def rcCaptionParam term=underline ctermfg=DarkGreen guifg=Green
- hi def rcParam ctermfg=DarkGreen guifg=DarkGreen
- hi def rcStatement ctermfg=DarkGreen guifg=DarkGreen
- hi def rcCommonAttribute ctermfg=Brown guifg=Brown
-
- "HiLink rcIdentifier Identifier
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link rcCharacter Character
+hi def link rcSpecialCharacter rcSpecial
+hi def link rcNumber Number
+hi def link rcFloat Float
+hi def link rcOctalError rcError
+hi def link rcParenError rcError
+hi def link rcInParen rcError
+hi def link rcCommentError rcError
+hi def link rcInclude Include
+hi def link rcPreProc PreProc
+hi def link rcDefine Macro
+hi def link rcIncluded rcString
+hi def link rcError Error
+hi def link rcPreCondit PreCondit
+hi def link rcCommentString rcString
+hi def link rcComment2String rcString
+hi def link rcCommentSkip rcComment
+hi def link rcString String
+hi def link rcComment Comment
+hi def link rcSpecial SpecialChar
+hi def link rcTodo Todo
+
+hi def link rcAttribute rcCommonAttribute
+hi def link rcStdId rcStatement
+hi def link rcStatement Statement
+
+" Default color overrides
+hi def rcLanguage term=reverse ctermbg=Red ctermfg=Yellow guibg=Red guifg=Yellow
+hi def rcMainObject term=underline ctermfg=Blue guifg=Blue
+hi def rcSubObject ctermfg=Green guifg=Green
+hi def rcCaptionParam term=underline ctermfg=DarkGreen guifg=Green
+hi def rcParam ctermfg=DarkGreen guifg=DarkGreen
+hi def rcStatement ctermfg=DarkGreen guifg=DarkGreen
+hi def rcCommonAttribute ctermfg=Brown guifg=Brown
+
+"hi def link rcIdentifier Identifier
+
let b:current_syntax = "rc"
diff --git a/runtime/syntax/rcs.vim b/runtime/syntax/rcs.vim
index e45d5fdbb6..5a34802ada 100644
--- a/runtime/syntax/rcs.vim
+++ b/runtime/syntax/rcs.vim
@@ -9,11 +9,8 @@
" Options:
" rcs_folding = 1 For folding strings
-" For version 5.x: Clear all syntax items.
-" For version 6.x: Quit when a syntax file was already loaded.
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded.
+if exists("b:current_syntax")
finish
endif
@@ -52,25 +49,15 @@ else
endif
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already.
-" For version 5.8 and later: only when an item doesn't have highlighting yet.
-if version >= 508 || !exists("did_rcs_syn_inits")
- if version <= 508
- let did_rcs_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet.
- HiLink rcsKeyword Keyword
- HiLink rcsNumber Identifier
- HiLink rcsString String
- HiLink rcsTextStr String
- HiLink rcsSpecial Special
- HiLink rcsDiffLines Special
- HiLink rcsEOFError Error
+hi def link rcsKeyword Keyword
+hi def link rcsNumber Identifier
+hi def link rcsString String
+hi def link rcsTextStr String
+hi def link rcsSpecial Special
+hi def link rcsDiffLines Special
+hi def link rcsEOFError Error
- delcommand HiLink
-endif
let b:current_syntax = "rcs"
diff --git a/runtime/syntax/rcslog.vim b/runtime/syntax/rcslog.vim
index acacfa124b..18f4593c77 100644
--- a/runtime/syntax/rcslog.vim
+++ b/runtime/syntax/rcslog.vim
@@ -3,11 +3,8 @@
" Maintainer: Joe Karthauser <joe@freebsd.org>
" Last Change: 2001 May 09
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -16,22 +13,12 @@ syn match rcslogFile "^RCS file:.*"
syn match rcslogDate "^date: .*$"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_rcslog_syntax_inits")
- if version < 508
- let did_rcslog_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink rcslogFile Type
- HiLink rcslogRevision Constant
- HiLink rcslogDate Identifier
+hi def link rcslogFile Type
+hi def link rcslogRevision Constant
+hi def link rcslogDate Identifier
- delcommand HiLink
-endif
let b:current_syntax = "rcslog"
diff --git a/runtime/syntax/readline.vim b/runtime/syntax/readline.vim
index 091722e5e5..3831ae1149 100644
--- a/runtime/syntax/readline.vim
+++ b/runtime/syntax/readline.vim
@@ -1,9 +1,10 @@
" Vim syntax file
-" Language: readline(3) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2012-04-25
-" readline_has_bash - if defined add support for bash specific
-" settings/functions
+" Language: readline(3) configuration file
+" Maintainer: Daniel Moch <daniel@danielmoch.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2018-07-26
+" Add new functions for Readline 7 / Bash 4.4
+" (credit: Github user bewuethr)
if exists('b:current_syntax')
finish
@@ -110,7 +111,7 @@ syn keyword readlineKeyword contained
\ nextgroup=readlineVariable
\ skipwhite
-syn keyword readlineVariable contained
+syn keyword readlineVariable contained
\ nextgroup=readlineBellStyle
\ skipwhite
\ bell-style
@@ -119,11 +120,15 @@ syn keyword readlineVariable contained
\ nextgroup=readlineBoolean
\ skipwhite
\ bind-tty-special-chars
+ \ blink-matching-paren
+ \ colored-completion-prefix
+ \ colored-stats
\ completion-ignore-case
\ completion-map-case
\ convert-meta
\ disable-completion
\ echo-control-characters
+ \ enable-bracketed-paste
\ enable-keypad
\ enable-meta-key
\ expand-tilde
@@ -142,6 +147,7 @@ syn keyword readlineVariable contained
\ revert-all-at-newline
\ show-all-if-ambiguous
\ show-all-if-unmodified
+ \ show-mode-in-prompt
\ skip-completed-text
\ visible-stats
@@ -150,6 +156,9 @@ syn keyword readlineVariable contained
\ skipwhite
\ comment-begin
\ isearch-terminators
+ \ vi-cmd-mode-string
+ \ vi-ins-mode-string
+ \ emacs-mode-string
syn keyword readlineVariable contained
\ nextgroup=readlineNumber
@@ -158,6 +167,7 @@ syn keyword readlineVariable contained
\ completion-prefix-display-length
\ completion-query-items
\ history-size
+ \ keyseq-timeout
syn keyword readlineVariable contained
\ nextgroup=readlineEditingMode
@@ -262,6 +272,7 @@ syn keyword readlineFunction contained
\ start-kbd-macro
\ end-kbd-macro
\ call-last-kbd-macro
+ \ print-last-kbd-macro
\
\ re-read-init-file
\ abort
@@ -332,6 +343,8 @@ syn keyword readlineFunction contained
if exists("readline_has_bash")
syn keyword readlineFunction contained
+ \ shell-forward-word
+ \ shell-backward-word
\ shell-expand-line
\ history-expand-line
\ magic-space
@@ -340,6 +353,8 @@ if exists("readline_has_bash")
\ insert-last-argument
\ operate-and-get-next
\ forward-backward-delete-char
+ \ shell-kill-word
+ \ shell-backward-kill-word
\ delete-char-or-list
\ complete-filename
\ possible-filename-completions
@@ -352,6 +367,7 @@ if exists("readline_has_bash")
\ complete-command
\ possible-command-completions
\ dynamic-complete-history
+ \ dabbrev-expand
\ complete-into-braces
\ glob-expand-word
\ glob-list-expansions
diff --git a/runtime/syntax/rebol.vim b/runtime/syntax/rebol.vim
index e6395758f3..a5d50c4ab1 100644
--- a/runtime/syntax/rebol.vim
+++ b/runtime/syntax/rebol.vim
@@ -6,11 +6,8 @@
" URL: http://www.eandem.co.uk/mrw/vim
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -18,11 +15,7 @@ endif
syn case ignore
" As per current users documentation
-if version < 600
- set isk=@,48-57,?,!,.,',+,-,*,&,\|,=,_,~
-else
- setlocal isk=@,48-57,?,!,.,',+,-,*,&,\|,=,_,~
-endif
+setlocal isk=@,48-57,?,!,.,',+,-,*,&,\|,=,_,~
" Yer TODO highlighter
syn keyword rebolTodo contained TODO
@@ -145,65 +138,55 @@ syn keyword rebolConstant none
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_rebol_syntax_inits")
- if version < 508
- let did_rebol_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
+
+hi def link rebolTodo Todo
+
+hi def link rebolStatement Statement
+hi def link rebolLabel Label
+hi def link rebolConditional Conditional
+hi def link rebolRepeat Repeat
+
+hi def link rebolOperator Operator
+hi def link rebolLogicOperator rebolOperator
+hi def link rebolLogicFunction rebolLogicOperator
+hi def link rebolMathOperator rebolOperator
+hi def link rebolMathFunction rebolMathOperator
+hi def link rebolBinaryOperator rebolOperator
+hi def link rebolBinaryFunction rebolBinaryOperator
+
+hi def link rebolType Type
+hi def link rebolTypeFunction rebolOperator
+
+hi def link rebolWord Identifier
+hi def link rebolWordPath rebolWord
+hi def link rebolFunction Function
+
+hi def link rebolCharacter Character
+hi def link rebolSpecialCharacter SpecialChar
+hi def link rebolString String
+
+hi def link rebolNumber Number
+hi def link rebolInteger rebolNumber
+hi def link rebolDecimal rebolNumber
+hi def link rebolTime rebolNumber
+hi def link rebolDate rebolNumber
+hi def link rebolMoney rebolNumber
+hi def link rebolBinary rebolNumber
+hi def link rebolEmail rebolString
+hi def link rebolFile rebolString
+hi def link rebolURL rebolString
+hi def link rebolIssue rebolNumber
+hi def link rebolTuple rebolNumber
+hi def link rebolFloat Float
+hi def link rebolBoolean Boolean
+
+hi def link rebolConstant Constant
+
+hi def link rebolComment Comment
+
+hi def link rebolError Error
- HiLink rebolTodo Todo
-
- HiLink rebolStatement Statement
- HiLink rebolLabel Label
- HiLink rebolConditional Conditional
- HiLink rebolRepeat Repeat
-
- HiLink rebolOperator Operator
- HiLink rebolLogicOperator rebolOperator
- HiLink rebolLogicFunction rebolLogicOperator
- HiLink rebolMathOperator rebolOperator
- HiLink rebolMathFunction rebolMathOperator
- HiLink rebolBinaryOperator rebolOperator
- HiLink rebolBinaryFunction rebolBinaryOperator
-
- HiLink rebolType Type
- HiLink rebolTypeFunction rebolOperator
-
- HiLink rebolWord Identifier
- HiLink rebolWordPath rebolWord
- HiLink rebolFunction Function
-
- HiLink rebolCharacter Character
- HiLink rebolSpecialCharacter SpecialChar
- HiLink rebolString String
-
- HiLink rebolNumber Number
- HiLink rebolInteger rebolNumber
- HiLink rebolDecimal rebolNumber
- HiLink rebolTime rebolNumber
- HiLink rebolDate rebolNumber
- HiLink rebolMoney rebolNumber
- HiLink rebolBinary rebolNumber
- HiLink rebolEmail rebolString
- HiLink rebolFile rebolString
- HiLink rebolURL rebolString
- HiLink rebolIssue rebolNumber
- HiLink rebolTuple rebolNumber
- HiLink rebolFloat Float
- HiLink rebolBoolean Boolean
-
- HiLink rebolConstant Constant
-
- HiLink rebolComment Comment
-
- HiLink rebolError Error
-
- delcommand HiLink
-endif
if exists("my_rebol_file")
if file_readable(expand(my_rebol_file))
diff --git a/runtime/syntax/redif.vim b/runtime/syntax/redif.vim
index 1a44a9f479..725067fd32 100644
--- a/runtime/syntax/redif.vim
+++ b/runtime/syntax/redif.vim
@@ -7,10 +7,8 @@
" File Extension: rdf
" Note: The ReDIF format is used by RePEc.
-" To be compatible with Vim 5.8 use:
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/registry.vim b/runtime/syntax/registry.vim
index 4524247a08..67b5e49bcb 100644
--- a/runtime/syntax/registry.vim
+++ b/runtime/syntax/registry.vim
@@ -6,11 +6,8 @@
" Included patch from Alexander A. Ulitin
" clear any unwanted syntax defs
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -85,29 +82,20 @@ syn match registryHex "^\s*\([0-9a-fA-F]\{2},\)\{0,999}\([0-9a-fA-F]\{2}\|\\\)$
" Dword (32 bits)
syn match registryDword "dword:[0-9a-fA-F]\{8}$" contains=registrySpecial
-if version >= 508 || !exists("did_registry_syntax_inits")
- if version < 508
- let did_registry_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
" The default methods for highlighting. Can be overridden later
- HiLink registryComment Comment
- HiLink registryHead Constant
- HiLink registryHKEY Constant
- HiLink registryPath Special
- HiLink registryRemove PreProc
- HiLink registryGUID Identifier
- HiLink registrySpecial Special
- HiLink registrySubKey Type
- HiLink registryString String
- HiLink registryHex Number
- HiLink registryDword Number
-
- delcommand HiLink
-endif
+hi def link registryComment Comment
+hi def link registryHead Constant
+hi def link registryHKEY Constant
+hi def link registryPath Special
+hi def link registryRemove PreProc
+hi def link registryGUID Identifier
+hi def link registrySpecial Special
+hi def link registrySubKey Type
+hi def link registryString String
+hi def link registryHex Number
+hi def link registryDword Number
+
let b:current_syntax = "registry"
diff --git a/runtime/syntax/remind.vim b/runtime/syntax/remind.vim
index 98064e043a..9e7ff22e14 100644
--- a/runtime/syntax/remind.vim
+++ b/runtime/syntax/remind.vim
@@ -13,9 +13,8 @@
" version 0.7: updated email and link
" version 0.6: added THROUGH keyword (courtesy of Ben Orchard)
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -48,35 +47,26 @@ syn match remindDates "'[0-9]\{4}[/-][0-9]\{1,2}[/-][0-9]\{1,2}\(@[0-9]\{1,2}[:
syn match remindWarning display excludenl "\S\s\+$"ms=s+1
-if version >= 508 || !exists("did_remind_syn_inits")
- if version < 508
- let did_remind_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink remindCommands Function
- HiLink remindExpiry Repeat
- HiLink remindTag Label
- HiLink remindTimed Statement
- HiLink remindMove Statement
- HiLink remindSpecial Include
- HiLink remindRun Function
- HiLink remindConditional Conditional
- HiLink remindComment Comment
- HiLink remindTimes String
- HiLink remindString String
- HiLink remindDebug Debug
- HiLink remindVar Identifier
- HiLink remindSubst Constant
- HiLink remindAdvanceNumber Number
- HiLink remindDateSeparators Comment
- HiLink remindDates String
- HiLink remindWarning Error
+hi def link remindCommands Function
+hi def link remindExpiry Repeat
+hi def link remindTag Label
+hi def link remindTimed Statement
+hi def link remindMove Statement
+hi def link remindSpecial Include
+hi def link remindRun Function
+hi def link remindConditional Conditional
+hi def link remindComment Comment
+hi def link remindTimes String
+hi def link remindString String
+hi def link remindDebug Debug
+hi def link remindVar Identifier
+hi def link remindSubst Constant
+hi def link remindAdvanceNumber Number
+hi def link remindDateSeparators Comment
+hi def link remindDates String
+hi def link remindWarning Error
- delcommand HiLink
-endif
let b:current_syntax = "remind"
diff --git a/runtime/syntax/resolv.vim b/runtime/syntax/resolv.vim
index 06d6885c1c..a879116a5f 100644
--- a/runtime/syntax/resolv.vim
+++ b/runtime/syntax/resolv.vim
@@ -9,9 +9,8 @@
" David Necas (Yeti) <yeti@physics.muni.cz>
" Stefano Zacchiroli <zack@debian.org>
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -50,38 +49,29 @@ syn match resolvOption /\<\%(ndots\|timeout\|attempts\):\d\+\>/ contained contai
" Additional errors
syn match resolvError /^search .\{257,}/
-if version >= 508 || !exists("did_config_syntax_inits")
- if version < 508
- let did_config_syntax_inits = 1
- command! -nargs=+ HiLink hi link <args>
- else
- command! -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink resolvIP Number
- HiLink resolvIPNetmask Number
- HiLink resolvHostname String
- HiLink resolvOption String
-
- HiLink resolvIPNameserver Number
- HiLink resolvHostnameSearch String
- HiLink resolvIPNetmaskSortList Number
-
- HiLink resolvNameServer Identifier
- HiLink resolvLwserver Identifier
- HiLink resolvDomain Identifier
- HiLink resolvSearch Identifier
- HiLink resolvSortList Identifier
- HiLink resolvOptions Identifier
-
- HiLink resolvComment Comment
- HiLink resolvOperator Operator
- HiLink resolvError Error
- HiLink resolvIPError Error
- HiLink resolvIPSpecial Special
-
- delcommand HiLink
-endif
+
+hi def link resolvIP Number
+hi def link resolvIPNetmask Number
+hi def link resolvHostname String
+hi def link resolvOption String
+
+hi def link resolvIPNameserver Number
+hi def link resolvHostnameSearch String
+hi def link resolvIPNetmaskSortList Number
+
+hi def link resolvNameServer Identifier
+hi def link resolvLwserver Identifier
+hi def link resolvDomain Identifier
+hi def link resolvSearch Identifier
+hi def link resolvSortList Identifier
+hi def link resolvOptions Identifier
+
+hi def link resolvComment Comment
+hi def link resolvOperator Operator
+hi def link resolvError Error
+hi def link resolvIPError Error
+hi def link resolvIPSpecial Special
+
let b:current_syntax = "resolv"
diff --git a/runtime/syntax/reva.vim b/runtime/syntax/reva.vim
index 03dfc9d4c3..f605992190 100644
--- a/runtime/syntax/reva.vim
+++ b/runtime/syntax/reva.vim
@@ -7,13 +7,8 @@
" Filetypes: *.rf *.frt
" NOTE: You should also have the ftplugin/reva.vim file to set 'isk'
-" For version 5.x: Clear all syntax items and don't load
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
- echo "Reva syntax file requires version 6.0 or later of vim!"
- finish
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/rexx.vim b/runtime/syntax/rexx.vim
index ef698a5351..360fc8ff9f 100644
--- a/runtime/syntax/rexx.vim
+++ b/runtime/syntax/rexx.vim
@@ -6,11 +6,8 @@
" Special Thanks to Dan Sharp <dwsharp@hotmail.com> and Rony G. Flatscher
" <Rony.Flatscher@wu-wien.ac.at> for comments and additions
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -244,87 +241,77 @@ syn sync linecont "\(,\|-\ze-\@!\)\ze\s*\(--.*\|\/\*.*\)*$"
exec "syn sync fromstart"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_rexx_syn_inits")
- if version < 508
- let did_rexx_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " make binary and hex strings stand out
- hi rexxStringConstant term=bold,underline ctermfg=5 cterm=bold guifg=darkMagenta gui=bold
-
- HiLink rexxLabel2 Function
- HiLink doLoopSelectLabelRegion rexxKeyword
- HiLink endIterateLeaveLabelRegion rexxKeyword
- HiLink rexxLoopKeywords rexxKeyword " Todo
-
- HiLink rexxNumber Normal "DiffChange
-" HiLink rexxIdentifier DiffChange
-
- HiLink rexxRegularCallSignal Statement
- HiLink rexxExceptionHandling Statement
-
- HiLink rexxLabel Function
- HiLink rexxCharacter Character
- HiLink rexxParenError rexxError
- HiLink rexxInParen rexxError
- HiLink rexxCommentError rexxError
- HiLink rexxError Error
- HiLink rexxKeyword Statement
- HiLink rexxKeywordStatements Statement
-
- HiLink rexxFunction Function
- HiLink rexxString String
- HiLink rexxComment Comment
- HiLink rexxTodo Todo
- HiLink rexxSpecialVariable Special
- HiLink rexxConditional rexxKeyword
-
- HiLink rexxOperator Operator
- HiLink rexxMessageOperator rexxOperator
- HiLink rexxLineComment Comment
-
- HiLink rexxLineContinue WildMenu
-
- HiLink rexxDirective rexxKeyword
- HiLink rexxClassDirective Type
- HiLink rexxMethodDirective rexxFunction
- HiLink rexxAttributeDirective rexxFunction
- HiLink rexxRequiresDirective Include
- HiLink rexxRoutineDirective rexxFunction
+" Only when an item doesn't have highlighting yet
+
+" make binary and hex strings stand out
+hi rexxStringConstant term=bold,underline ctermfg=5 cterm=bold guifg=darkMagenta gui=bold
+
+hi def link rexxLabel2 Function
+hi def link doLoopSelectLabelRegion rexxKeyword
+hi def link endIterateLeaveLabelRegion rexxKeyword
+hi def link rexxLoopKeywords rexxKeyword " Todo
+
+hi def link rexxNumber Normal "DiffChange
+" hi def link rexxIdentifier DiffChange
+
+hi def link rexxRegularCallSignal Statement
+hi def link rexxExceptionHandling Statement
+
+hi def link rexxLabel Function
+hi def link rexxCharacter Character
+hi def link rexxParenError rexxError
+hi def link rexxInParen rexxError
+hi def link rexxCommentError rexxError
+hi def link rexxError Error
+hi def link rexxKeyword Statement
+hi def link rexxKeywordStatements Statement
+
+hi def link rexxFunction Function
+hi def link rexxString String
+hi def link rexxComment Comment
+hi def link rexxTodo Todo
+hi def link rexxSpecialVariable Special
+hi def link rexxConditional rexxKeyword
+
+hi def link rexxOperator Operator
+hi def link rexxMessageOperator rexxOperator
+hi def link rexxLineComment Comment
+
+hi def link rexxLineContinue WildMenu
+
+hi def link rexxDirective rexxKeyword
+hi def link rexxClassDirective Type
+hi def link rexxMethodDirective rexxFunction
+hi def link rexxAttributeDirective rexxFunction
+hi def link rexxRequiresDirective Include
+hi def link rexxRoutineDirective rexxFunction
" rgf, 2012-09-09
- HiLink rexxOptionsDirective rexxFunction
- HiLink rexxOptionsDirective2 rexxOptionsDirective
- HiLink rexxOptionsDirective3 Normal " rexxOptionsDirective
+hi def link rexxOptionsDirective rexxFunction
+hi def link rexxOptionsDirective2 rexxOptionsDirective
+hi def link rexxOptionsDirective3 Normal " rexxOptionsDirective
- HiLink rexxConstantDirective rexxFunction
+hi def link rexxConstantDirective rexxFunction
- HiLink rexxConst Constant
- HiLink rexxTypeSpecifier Type
- HiLink rexxBuiltinClass rexxTypeSpecifier
+hi def link rexxConst Constant
+hi def link rexxTypeSpecifier Type
+hi def link rexxBuiltinClass rexxTypeSpecifier
- HiLink rexxEnvironmentSymbol rexxConst
- HiLink rexxMessage rexxFunction
+hi def link rexxEnvironmentSymbol rexxConst
+hi def link rexxMessage rexxFunction
- HiLink rexxParse rexxKeyword
- HiLink rexxParse2 rexxParse
+hi def link rexxParse rexxKeyword
+hi def link rexxParse2 rexxParse
- HiLink rexxGuard rexxKeyword
- HiLink rexxTrace rexxKeyword
+hi def link rexxGuard rexxKeyword
+hi def link rexxTrace rexxKeyword
- HiLink rexxRaise rexxKeyword
- HiLink rexxRaise2 rexxRaise
+hi def link rexxRaise rexxKeyword
+hi def link rexxRaise2 rexxRaise
- HiLink rexxForward rexxKeyword
- HiLink rexxForward2 rexxForward
+hi def link rexxForward rexxKeyword
+hi def link rexxForward2 rexxForward
- delcommand HiLink
-endif
let b:current_syntax = "rexx"
diff --git a/runtime/syntax/rhelp.vim b/runtime/syntax/rhelp.vim
index 47c764e296..8cac585bb0 100644
--- a/runtime/syntax/rhelp.vim
+++ b/runtime/syntax/rhelp.vim
@@ -3,7 +3,7 @@
" Maintainer: Jakson Aquino <jalvesaq@gmail.com>
" Former Maintainer: Johannes Ranke <jranke@uni-bremen.de>
" Homepage: https://github.com/jalvesaq/R-Vim-runtime
-" Last Change: Sat Feb 06, 2016 11:34AM
+" Last Change: Tue Jun 28, 2016 08:53AM
" Remarks: - Includes R syntax highlighting in the appropriate
" sections if an r.vim file is in the same directory or in the
" default debian location.
@@ -17,7 +17,6 @@ if exists("b:current_syntax")
endif
scriptencoding utf-8
-setlocal iskeyword=@,48-57,_,.
syn case match
diff --git a/runtime/syntax/rib.vim b/runtime/syntax/rib.vim
index 6b9f2b0bd4..0ee607122f 100644
--- a/runtime/syntax/rib.vim
+++ b/runtime/syntax/rib.vim
@@ -4,10 +4,8 @@
" Last Change: 2003 May 11
"
-" Remove any old syntax stuff hanging around
-if version < 600
- syn clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -46,26 +44,17 @@ syn match ribFloat display contained "[-]\=\.\d\+\(e[-+]\=\d\+\)\=\>"
syn match ribFloat display contained "[-]\=\d\+e[-+]\d\+\>"
syn case match
-if version >= 508 || !exists("did_rib_syntax_inits")
- if version < 508
- let did_rib_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink ribStructure Structure
- HiLink ribCommand Statement
+hi def link ribStructure Structure
+hi def link ribCommand Statement
- HiLink ribStructureComment SpecialComment
- HiLink ribLineComment Comment
+hi def link ribStructureComment SpecialComment
+hi def link ribLineComment Comment
- HiLink ribString String
- HiLink ribNumber Number
- HiLink ribFloat Float
+hi def link ribString String
+hi def link ribNumber Number
+hi def link ribFloat Float
- delcommand HiLink
-end
let b:current_syntax = "rib"
diff --git a/runtime/syntax/rmd.vim b/runtime/syntax/rmd.vim
index 4cde7441d3..a26389024d 100644
--- a/runtime/syntax/rmd.vim
+++ b/runtime/syntax/rmd.vim
@@ -1,87 +1,118 @@
" markdown Text with R statements
" Language: markdown with R code chunks
" Homepage: https://github.com/jalvesaq/R-Vim-runtime
-" Last Change: Sat Feb 06, 2016 06:45AM
+" Last Change: Sat Aug 25, 2018 03:44PM
"
-" CONFIGURATION:
-" To highlight chunk headers as R code, put in your vimrc:
-" let rmd_syn_hl_chunk = 1
+" For highlighting pandoc extensions to markdown like citations and TeX and
+" many other advanced features like folding of markdown sections, it is
+" recommended to install the vim-pandoc filetype plugin as well as the
+" vim-pandoc-syntax filetype plugin from https://github.com/vim-pandoc.
+
if exists("b:current_syntax")
finish
endif
-" load all of pandoc info
+" Configuration if not using pandoc syntax:
+" Add syntax highlighting of YAML header
+let g:rmd_syn_hl_yaml = get(g:, 'rmd_syn_hl_yaml', 1)
+" Add syntax highlighting of citation keys
+let g:rmd_syn_hl_citations = get(g:, 'rmd_syn_hl_citations', 1)
+" Highlight the header of the chunk of R code
+let g:rmd_syn_hl_chunk = get(g:, 'g:rmd_syn_hl_chunk', 0)
+
+" Pandoc-syntax has more features, but it is slower.
+" https://github.com/vim-pandoc/vim-pandoc-syntax
+let g:pandoc#syntax#codeblocks#embeds#langs = get(g:, 'pandoc#syntax#codeblocks#embeds#langs', ['r'])
runtime syntax/pandoc.vim
if exists("b:current_syntax")
- let rmdIsPandoc = 1
- unlet b:current_syntax
-else
- let rmdIsPandoc = 0
- runtime syntax/markdown.vim
- if exists("b:current_syntax")
- unlet b:current_syntax
- endif
+ " Fix recognition of R code
+ syn region pandocDelimitedCodeBlock_r start=/^```{r\>.*}$/ end=/^```$/ contained containedin=pandocDelimitedCodeBlock contains=@R
+ syn region rmdrInline matchgroup=rmdInlineDelim start="`r " end="`" contains=@R containedin=pandocLaTeXRegion,yamlFlowString keepend
+ hi def link rmdInlineDelim Delimiter
+ let b:current_syntax = "rmd"
+ finish
endif
-" load all of the r syntax highlighting rules into @R
-syntax include @R syntax/r.vim
-if exists("b:current_syntax")
- unlet b:current_syntax
-endif
+let s:cpo_save = &cpo
+set cpo&vim
-if exists("g:rmd_syn_hl_chunk")
- " highlight R code inside chunk header
- syntax match rmdChunkDelim "^[ \t]*```{r" contained
- syntax match rmdChunkDelim "}$" contained
+" R chunks will not be highlighted by syntax/markdown because their headers
+" follow a non standard pattern: "```{lang" instead of "^```lang".
+" Make a copy of g:markdown_fenced_languages to highlight the chunks later:
+if exists('g:markdown_fenced_languages')
+ if !exists('g:rmd_fenced_languages')
+ let g:rmd_fenced_languages = deepcopy(g:markdown_fenced_languages)
+ let g:markdown_fenced_languages = []
+ endif
else
- syntax match rmdChunkDelim "^[ \t]*```{r.*}$" contained
+ let g:rmd_fenced_languages = ['r']
endif
-syntax match rmdChunkDelim "^[ \t]*```$" contained
-syntax region rmdChunk start="^[ \t]*``` *{r.*}$" end="^[ \t]*```$" contains=@R,rmdChunkDelim keepend fold
-" also match and syntax highlight in-line R code
-syntax match rmdEndInline "`" contained
-syntax match rmdBeginInline "`r " contained
-syntax region rmdrInline start="`r " end="`" contains=@R,rmdBeginInline,rmdEndInline keepend
+runtime syntax/markdown.vim
-" match slidify special marker
-syntax match rmdSlidifySpecial "\*\*\*"
-
-
-if rmdIsPandoc == 0
- syn match rmdBlockQuote /^\s*>.*\n\(.*\n\@<!\n\)*/ skipnl
- " LaTeX
- syntax include @LaTeX syntax/tex.vim
- if exists("b:current_syntax")
- unlet b:current_syntax
+" Now highlight chunks:
+for s:type in g:rmd_fenced_languages
+ if s:type =~ '='
+ let s:lng = substitute(s:type, '=.*', '')
+ let s:nm = substitute(s:type, '.*=', '')
+ else
+ let s:lng = s:type
+ let s:nm = s:type
endif
- " Extend cluster
- syn cluster texMathZoneGroup add=rmdrInline
- " Inline
- syntax match rmdLaTeXInlDelim "\$"
- syntax match rmdLaTeXInlDelim "\\\$"
- syn region texMathZoneX matchgroup=Delimiter start="\$" skip="\\\\\|\\\$" matchgroup=Delimiter end="\$" end="%stopzone\>" contains=@texMathZoneGroup
- " Region
- syntax match rmdLaTeXRegDelim "\$\$" contained
- syntax match rmdLaTeXRegDelim "\$\$latex$" contained
- syntax region rmdLaTeXRegion start="^\$\$" skip="\\\$" end="\$\$$" contains=@LaTeX,rmdLaTeXSt,rmdLaTeXRegDelim keepend
- syntax region rmdLaTeXRegion2 start="^\\\[" end="\\\]" contains=@LaTeX,rmdLaTeXSt,rmdLaTeXRegDelim keepend
- hi def link rmdLaTeXSt Statement
- hi def link rmdLaTeXInlDelim Special
- hi def link rmdLaTeXRegDelim Special
-endif
+ unlet! b:current_syntax
+ exe 'syn include @Rmd'.s:nm.' syntax/'.s:lng.'.vim'
+ if g:rmd_syn_hl_chunk
+ exe 'syn region rmd'.s:nm.'ChunkDelim matchgroup=rmdCodeDelim start="^\s*```\s*{\s*'.s:nm.'\>" matchgroup=rmdCodeDelim end="}$" keepend containedin=rmd'.s:nm.'Chunk contains=@Rmd'.s:nm
+ exe 'syn region rmd'.s:nm.'Chunk start="^\s*```\s*{\s*'.s:nm.'\>.*$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend contains=rmd'.s:nm.'ChunkDelim,@Rmd'.s:nm
+ else
+ exe 'syn region rmd'.s:nm.'Chunk matchgroup=rmdCodeDelim start="^\s*```\s*{\s*'.s:nm.'\>.*$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend contains=@Rmd'.s:nm
+ endif
+ exe 'syn region rmd'.s:nm.'Inline matchgroup=rmdInlineDelim start="`'.s:nm.' " end="`" contains=@Rmd'.s:nm.' keepend'
+endfor
+unlet! s:type
-setlocal iskeyword=@,48-57,_,.
+hi def link rmdInlineDelim Delimiter
+hi def link rmdCodeDelim Delimiter
-syn sync match rmdSyncChunk grouphere rmdChunk "^[ \t]*``` *{r"
+" You don't need this if either your markdown/syntax.vim already highlights
+" the YAML header or you are writing standard markdown
+if g:rmd_syn_hl_yaml
+ " Minimum highlighting of yaml header
+ syn match rmdYamlFieldTtl /^\s*\zs\w*\ze:/ contained
+ syn match rmdYamlFieldTtl /^\s*-\s*\zs\w*\ze:/ contained
+ syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start='"' skip='\\"' end='"' contains=yamlEscape,rmdrInline contained
+ syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start="'" skip="''" end="'" contains=yamlSingleEscape,rmdrInline contained
+ syn match yamlEscape contained '\\\%([\\"abefnrtv\^0_ NLP\n]\|x\x\x\|u\x\{4}\|U\x\{8}\)'
+ syn match yamlSingleEscape contained "''"
+ syn region pandocYAMLHeader matchgroup=rmdYamlBlockDelim start=/\%(\%^\|\_^\s*\n\)\@<=\_^-\{3}\ze\n.\+/ end=/^\([-.]\)\1\{2}$/ keepend contains=rmdYamlFieldTtl,yamlFlowString
+ hi def link rmdYamlBlockDelim Delimiter
+ hi def link rmdYamlFieldTtl Identifier
+ hi def link yamlFlowString String
+endif
-hi def link rmdChunkDelim Special
-hi def link rmdBeginInline Special
-hi def link rmdEndInline Special
-hi def link rmdBlockQuote Comment
-hi def link rmdSlidifySpecial Special
+" You don't need this if either your markdown/syntax.vim already highlights
+" citations or you are writing standard markdown
+if g:rmd_syn_hl_citations
+ " From vim-pandoc-syntax
+ " parenthetical citations
+ syn match pandocPCite /\^\@<!\[[^\[\]]\{-}-\{0,1}@[[:alnum:]_][[:alnum:]ร -รถรธ-รฟร€-ร–ร˜-รŸ_:.#$%&\-+?<>~\/]*.\{-}\]/ contains=pandocEmphasis,pandocStrong,pandocLatex,pandocCiteKey,@Spell,pandocAmpersandEscape display
+ " in-text citations with location
+ syn match pandocICite /@[[:alnum:]_][[:alnum:]ร -รถรธ-รฟร€-ร–ร˜-รŸ_:.#$%&\-+?<>~\/]*\s\[.\{-1,}\]/ contains=pandocCiteKey,@Spell display
+ " cite keys
+ syn match pandocCiteKey /\(-\=@[[:alnum:]_][[:alnum:]ร -รถรธ-รฟร€-ร–ร˜-รŸ_:.#$%&\-+?<>~\/]*\)/ containedin=pandocPCite,pandocICite contains=@NoSpell display
+ syn match pandocCiteAnchor /[-@]/ contained containedin=pandocCiteKey display
+ syn match pandocCiteLocator /[\[\]]/ contained containedin=pandocPCite,pandocICite
+ hi def link pandocPCite Operator
+ hi def link pandocICite Operator
+ hi def link pandocCiteKey Label
+ hi def link pandocCiteAnchor Operator
+ hi def link pandocCiteLocator Operator
+endif
let b:current_syntax = "rmd"
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
" vim: ts=8 sw=2
diff --git a/runtime/syntax/rnc.vim b/runtime/syntax/rnc.vim
index 8436c88755..7d3907e991 100644
--- a/runtime/syntax/rnc.vim
+++ b/runtime/syntax/rnc.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: Relax NG compact syntax
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2007-06-17
+" Language: Relax NG compact syntax
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-06-17
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/rnoweb.vim b/runtime/syntax/rnoweb.vim
index 665acc53e2..b2ba17d68d 100644
--- a/runtime/syntax/rnoweb.vim
+++ b/runtime/syntax/rnoweb.vim
@@ -1,7 +1,7 @@
" Vim syntax file
" Language: R noweb Files
" Maintainer: Johannes Ranke <jranke@uni-bremen.de>
-" Last Change: Sat Feb 06, 2016 06:47AM
+" Last Change: Thu Apr 05, 2018 11:06PM
" Version: 0.9.1
" Remarks: - This file is inspired by the proposal of
" Fernando Henrique Ferraz Pereira da Rosa <feferraz@ime.usp.br>
@@ -16,7 +16,7 @@ syn case match
" Extension of Tex clusters {{{1
runtime syntax/tex.vim
-unlet b:current_syntax
+unlet! b:current_syntax
syn cluster texMatchGroup add=@rnoweb
syn cluster texMathMatchGroup add=rnowebSexpr
diff --git a/runtime/syntax/robots.vim b/runtime/syntax/robots.vim
index 066628bb3c..396bf52b25 100644
--- a/runtime/syntax/robots.vim
+++ b/runtime/syntax/robots.vim
@@ -5,11 +5,8 @@
" URL: http://www.mggen.com/vim/syntax/robots.zip
" Last change: 2001 May 09
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -41,26 +38,17 @@ syn match robotsUrl "http[s]\=://\S*"
syn match robotsMail "\S*@\S*"
syn region robotsString start=+L\="+ skip=+\\\\\|\\"+ end=+"+
-if version >= 508 || !exists("did_robos_syntax_inits")
- if version < 508
- let did_robots_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink robotsComment Comment
- HiLink robotsAgent Type
- HiLink robotsDisallow Statement
- HiLink robotsLine Special
- HiLink robotsStar Operator
- HiLink robotsDelimiter Delimiter
- HiLink robotsUrl String
- HiLink robotsMail String
- HiLink robotsString String
-
- delcommand HiLink
-endif
+
+hi def link robotsComment Comment
+hi def link robotsAgent Type
+hi def link robotsDisallow Statement
+hi def link robotsLine Special
+hi def link robotsStar Operator
+hi def link robotsDelimiter Delimiter
+hi def link robotsUrl String
+hi def link robotsMail String
+hi def link robotsString String
+
let b:current_syntax = "robots"
diff --git a/runtime/syntax/rpcgen.vim b/runtime/syntax/rpcgen.vim
index 85036dc049..08183d43a4 100644
--- a/runtime/syntax/rpcgen.vim
+++ b/runtime/syntax/rpcgen.vim
@@ -1,8 +1,8 @@
" Vim syntax file
" Language: rpcgen
" Maintainer: Charles E. Campbell <NdrOchipS@PcampbellAfamily.Mbiz>
-" Last Change: Jan 13, 2015
-" Version: 10
+" Last Change: Aug 31, 2016
+" Version: 12
" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_RPCGEN
if exists("b:current_syntax")
@@ -10,11 +10,7 @@ if exists("b:current_syntax")
endif
" Read the C syntax to start with
-if version < 600
- source <sfile>:p:h/c.vim
-else
- runtime! syntax/c.vim
-endif
+runtime! syntax/c.vim
syn keyword rpcProgram program skipnl skipwhite nextgroup=rpcProgName
syn match rpcProgName contained "\<\i\I*\>" skipnl skipwhite nextgroup=rpcProgZone
@@ -28,30 +24,21 @@ syn match rpcProgNmbrErr contained "=\s*0x[^23]\x*"ms=s+1
syn match rpcPassThru "^\s*%.*$"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_rpcgen_syntax_inits")
- if version < 508
- let did_rpcgen_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink rpcProgName rpcName
- HiLink rpcProgram rpcStatement
- HiLink rpcVersName rpcName
- HiLink rpcVersion rpcStatement
-
- HiLink rpcDecl cType
- HiLink rpcPassThru cComment
-
- HiLink rpcName Special
- HiLink rpcProcNmbr Delimiter
- HiLink rpcProgNmbrErr Error
- HiLink rpcStatement Statement
-
- delcommand HiLink
+if !exists("skip_rpcgen_syntax_inits")
+
+ hi def link rpcProgName rpcName
+ hi def link rpcProgram rpcStatement
+ hi def link rpcVersName rpcName
+ hi def link rpcVersion rpcStatement
+
+ hi def link rpcDecl cType
+ hi def link rpcPassThru cComment
+
+ hi def link rpcName Special
+ hi def link rpcProcNmbr Delimiter
+ hi def link rpcProgNmbrErr Error
+ hi def link rpcStatement Statement
+
endif
let b:current_syntax = "rpcgen"
diff --git a/runtime/syntax/rpl.vim b/runtime/syntax/rpl.vim
index 6457803a06..f339f7ae6e 100644
--- a/runtime/syntax/rpl.vim
+++ b/runtime/syntax/rpl.vim
@@ -6,11 +6,8 @@
" URL: http://www.makalis.fr/~bertrand/rpl2/download/vim/indent/rpl.vim
" Credits: Nothing
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -417,77 +414,67 @@ syntax region rplString start=+\(^\|\s\+\)"+ end=+"\ze\($\|\s\+\)+ contains=rplS
syntax match rplTab "\t" transparent
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_rpl_syntax_inits")
- if version < 508
- let did_rpl_syntax_inits = 1
- command -nargs=+ HiLink highlight link <args>
- else
- command -nargs=+ HiLink highlight default link <args>
- endif
-
- " The default highlighting.
-
- HiLink rplControl Statement
- HiLink rplStatement Statement
- HiLink rplAlgConditional Conditional
- HiLink rplConditional Repeat
- HiLink rplConditionalError Error
- HiLink rplRepeat Repeat
- HiLink rplCycle Repeat
- HiLink rplUntil Repeat
- HiLink rplIntrinsic Special
- HiLink rplStorage StorageClass
- HiLink rplStorageExpr StorageClass
- HiLink rplStorageError Error
- HiLink rplReadWrite rplIntrinsic
-
- HiLink rplOperator Operator
-
- HiLink rplList Special
- HiLink rplArray Special
- HiLink rplConstant Identifier
- HiLink rplExpr Type
-
- HiLink rplString String
- HiLink rplStringGuilles String
- HiLink rplStringAntislash String
-
- HiLink rplBinary Boolean
- HiLink rplOctal Boolean
- HiLink rplDecimal Boolean
- HiLink rplHexadecimal Boolean
- HiLink rplInteger Number
- HiLink rplFloat Float
- HiLink rplComplex Float
- HiLink rplBoolean Identifier
-
- HiLink rplObsolete Todo
-
- HiLink rplPreCondit PreCondit
- HiLink rplInclude Include
- HiLink rplIncluded rplString
- HiLink rplInclude Include
- HiLink rplExecPath Include
- HiLink rplPreProc PreProc
- HiLink rplComment Comment
- HiLink rplCommentLine Comment
- HiLink rplCommentString Comment
- HiLink rplSubDelimitor rplStorage
- HiLink rplCommentError Error
- HiLink rplParenError Error
- HiLink rplSubError Error
- HiLink rplArrayError Error
- HiLink rplListError Error
- HiLink rplTab Error
- HiLink rplBinaryError Error
- HiLink rplOctalError Error
- HiLink rplDecimalError Error
- HiLink rplHexadecimalError Error
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+" The default highlighting.
+
+hi def link rplControl Statement
+hi def link rplStatement Statement
+hi def link rplAlgConditional Conditional
+hi def link rplConditional Repeat
+hi def link rplConditionalError Error
+hi def link rplRepeat Repeat
+hi def link rplCycle Repeat
+hi def link rplUntil Repeat
+hi def link rplIntrinsic Special
+hi def link rplStorage StorageClass
+hi def link rplStorageExpr StorageClass
+hi def link rplStorageError Error
+hi def link rplReadWrite rplIntrinsic
+
+hi def link rplOperator Operator
+
+hi def link rplList Special
+hi def link rplArray Special
+hi def link rplConstant Identifier
+hi def link rplExpr Type
+
+hi def link rplString String
+hi def link rplStringGuilles String
+hi def link rplStringAntislash String
+
+hi def link rplBinary Boolean
+hi def link rplOctal Boolean
+hi def link rplDecimal Boolean
+hi def link rplHexadecimal Boolean
+hi def link rplInteger Number
+hi def link rplFloat Float
+hi def link rplComplex Float
+hi def link rplBoolean Identifier
+
+hi def link rplObsolete Todo
+
+hi def link rplPreCondit PreCondit
+hi def link rplInclude Include
+hi def link rplIncluded rplString
+hi def link rplInclude Include
+hi def link rplExecPath Include
+hi def link rplPreProc PreProc
+hi def link rplComment Comment
+hi def link rplCommentLine Comment
+hi def link rplCommentString Comment
+hi def link rplSubDelimitor rplStorage
+hi def link rplCommentError Error
+hi def link rplParenError Error
+hi def link rplSubError Error
+hi def link rplArrayError Error
+hi def link rplListError Error
+hi def link rplTab Error
+hi def link rplBinaryError Error
+hi def link rplOctalError Error
+hi def link rplDecimalError Error
+hi def link rplHexadecimalError Error
+
let b:current_syntax = "rpl"
diff --git a/runtime/syntax/rrst.vim b/runtime/syntax/rrst.vim
index 24d3844df0..3a56342cd8 100644
--- a/runtime/syntax/rrst.vim
+++ b/runtime/syntax/rrst.vim
@@ -2,7 +2,7 @@
" Language: reST with R code chunks
" Maintainer: Alex Zvoleff, azvoleff@mail.sdsu.edu
" Homepage: https://github.com/jalvesaq/R-Vim-runtime
-" Last Change: Sat Feb 06, 2016 06:45AM
+" Last Change: Thu Apr 05, 2018 11:06PM
"
" CONFIGURATION:
" To highlight chunk headers as R code, put in your vimrc:
@@ -14,13 +14,11 @@ endif
" load all of the rst info
runtime syntax/rst.vim
-unlet b:current_syntax
+unlet! b:current_syntax
" load all of the r syntax highlighting rules into @R
syntax include @R syntax/r.vim
-setlocal iskeyword=@,48-57,_,.
-
" highlight R chunks
if exists("g:rrst_syn_hl_chunk")
" highlight R code inside chunk header
diff --git a/runtime/syntax/rst.vim b/runtime/syntax/rst.vim
index b3c89f8352..d620d91f4a 100644
--- a/runtime/syntax/rst.vim
+++ b/runtime/syntax/rst.vim
@@ -2,7 +2,8 @@
" Language: reStructuredText documentation format
" Maintainer: Marshall Ward <marshall.ward@gmail.com>
" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2016-01-05
+" Website: https://github.com/marshallward/vim-restructuredtext
+" Latest Revision: 2018-07-23
if exists("b:current_syntax")
finish
@@ -49,7 +50,10 @@ syn cluster rstDirectives contains=rstFootnote,rstCitation,
syn match rstExplicitMarkup '^\s*\.\.\_s'
\ nextgroup=@rstDirectives,rstComment,rstSubstitutionDefinition
-let s:ReferenceName = '[[:alnum:]]\+\%([_.-][[:alnum:]]\+\)*'
+" "Simple reference names are single words consisting of alphanumerics plus
+" isolated (no two adjacent) internal hyphens, underscores, periods, colons
+" and plus signs."
+let s:ReferenceName = '[[:alnum:]]\%([-_.:+]\?[[:alnum:]]\+\)*'
syn keyword rstTodo contained FIXME TODO XXX NOTE
@@ -82,14 +86,14 @@ execute 'syn region rstExDirective contained matchgroup=rstDirective' .
\ ' end=+^\s\@!+ contains=@rstCruft,rstLiteralBlock'
execute 'syn match rstSubstitutionDefinition contained' .
- \ ' /|' . s:ReferenceName . '|\_s\+/ nextgroup=@rstDirectives'
+ \ ' /|.*|\_s\+/ nextgroup=@rstDirectives'
function! s:DefineOneInlineMarkup(name, start, middle, end, char_left, char_right)
execute 'syn region rst' . a:name .
\ ' start=+' . a:char_left . '\zs' . a:start .
\ '\ze[^[:space:]' . a:char_right . a:start[strlen(a:start) - 1] . ']+' .
\ a:middle .
- \ ' end=+\S' . a:end . '\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)+'
+ \ ' end=+\S' . a:end . '\ze\%($\|\s\|[''"โ€™)\]}>/:.,;!?\\-]\)+'
endfunction
function! s:DefineInlineMarkup(name, start, middle, end)
@@ -103,11 +107,13 @@ function! s:DefineInlineMarkup(name, start, middle, end)
call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '\[', '\]')
call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '{', '}')
call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '<', '>')
+ call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, 'โ€™', 'โ€™')
+ " TODO: Additional Unicode Pd, Po, Pi, Pf, Ps characters
- call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '\%(^\|\s\|[/:]\)', '')
+ call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '\%(^\|\s\|\%ua0\|[/:]\)', '')
execute 'syn match rst' . a:name .
- \ ' +\%(^\|\s\|[''"([{</:]\)\zs' . a:start .
+ \ ' +\%(^\|\s\|\%ua0\|[''"([{</:]\)\zs' . a:start .
\ '[^[:space:]' . a:start[strlen(a:start) - 1] . ']'
\ a:end . '\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)+'
@@ -121,14 +127,31 @@ call s:DefineInlineMarkup('InlineLiteral', '``', "", '``')
call s:DefineInlineMarkup('SubstitutionReference', '|', '|', '|_\{0,2}')
call s:DefineInlineMarkup('InlineInternalTargets', '_`', '`', '`')
-syn match rstSections "^\%(\([=`:.'"~^_*+#-]\)\1\+\n\)\=.\+\n\([=`:.'"~^_*+#-]\)\2\+$"
+" Sections are identified through their titles, which are marked up with
+" adornment: "underlines" below the title text, or underlines and matching
+" "overlines" above the title. An underline/overline is a single repeated
+" punctuation character that begins in column 1 and forms a line extending at
+" least as far as the right edge of the title text.
+"
+" It is difficult to count characters in a regex, but we at least special-case
+" the case where the title has at least three characters to require the
+" adornment to have at least three characters as well, in order to handle
+" properly the case of a literal block:
+"
+" this is the end of a paragraph
+" ::
+" this is a literal block
+syn match rstSections "\v^%(([=`:.'"~^_*+#-])\1+\n)?.{1,2}\n([=`:.'"~^_*+#-])\2+$"
+ \ contains=@Spell
+syn match rstSections "\v^%(([=`:.'"~^_*+#-])\1{2,}\n)?.{3,}\n([=`:.'"~^_*+#-])\2{2,}$"
+ \ contains=@Spell
" TODO: Canโ€™t remember why these two canโ€™t be defined like the ones above.
execute 'syn match rstFootnoteReference contains=@NoSpell' .
- \ ' +\[\%(\d\+\|#\%(' . s:ReferenceName . '\)\=\|\*\)\]_+'
+ \ ' +\%(\s\|^\)\[\%(\d\+\|#\%(' . s:ReferenceName . '\)\=\|\*\)\]_+'
execute 'syn match rstCitationReference contains=@NoSpell' .
- \ ' +\[' . s:ReferenceName . '\]_\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)+'
+ \ ' +\%(\s\|^\)\[' . s:ReferenceName . '\]_\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)+'
execute 'syn match rstHyperlinkReference' .
\ ' /\<' . s:ReferenceName . '__\=\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)/'
@@ -137,27 +160,69 @@ syn match rstStandaloneHyperlink contains=@NoSpell
\ "\<\%(\%(\%(https\=\|file\|ftp\|gopher\)://\|\%(mailto\|news\):\)[^[:space:]'\"<>]\+\|www[[:alnum:]_-]*\.[[:alnum:]_-]\+\.[^[:space:]'\"<>]\+\)[[:alnum:]/]"
syn region rstCodeBlock contained matchgroup=rstDirective
- \ start=+\%(sourcecode\|code\%(-block\)\=\)::\_s*\n\ze\z(\s\+\)+
+ \ start=+\%(sourcecode\|code\%(-block\)\=\)::\s\+.*\_s*\n\ze\z(\s\+\)+
\ skip=+^$+
\ end=+^\z1\@!+
\ contains=@NoSpell
syn cluster rstDirectives add=rstCodeBlock
if !exists('g:rst_syntax_code_list')
- let g:rst_syntax_code_list = ['vim', 'java', 'cpp', 'lisp', 'php',
- \ 'python', 'perl', 'sh']
+ " A mapping from a Vim filetype to a list of alias patterns (pattern
+ " branches to be specific, see ':help /pattern'). E.g. given:
+ "
+ " let g:rst_syntax_code_list = {
+ " \ 'cpp': ['cpp', 'c++'],
+ " \ }
+ "
+ " then the respective contents of the following two rST directives:
+ "
+ " .. code:: cpp
+ "
+ " auto i = 42;
+ "
+ " .. code:: C++
+ "
+ " auto i = 42;
+ "
+ " will both be highlighted as C++ code. As shown by the latter block
+ " pattern matching will be case-insensitive.
+ let g:rst_syntax_code_list = {
+ \ 'vim': ['vim'],
+ \ 'java': ['java'],
+ \ 'cpp': ['cpp', 'c++'],
+ \ 'lisp': ['lisp'],
+ \ 'php': ['php'],
+ \ 'python': ['python'],
+ \ 'perl': ['perl'],
+ \ 'sh': ['sh'],
+ \ }
+elseif type(g:rst_syntax_code_list) == type([])
+ " backward compatibility with former list format
+ let s:old_spec = g:rst_syntax_code_list
+ let g:rst_syntax_code_list = {}
+ for s:elem in s:old_spec
+ let g:rst_syntax_code_list[s:elem] = [s:elem]
+ endfor
endif
-for code in g:rst_syntax_code_list
+for s:filetype in keys(g:rst_syntax_code_list)
unlet! b:current_syntax
" guard against setting 'isk' option which might cause problems (issue #108)
let prior_isk = &l:iskeyword
- exe 'syn include @rst'.code.' syntax/'.code.'.vim'
- exe 'syn region rstDirective'.code.' matchgroup=rstDirective fold '
- \.'start=#\%(sourcecode\|code\%(-block\)\=\)::\s\+'.code.'\_s*\n\ze\z(\s\+\)# '
- \.'skip=#^$# '
- \.'end=#^\z1\@!# contains=@NoSpell,@rst'.code
- exe 'syn cluster rstDirectives add=rstDirective'.code
+ let s:alias_pattern = ''
+ \.'\%('
+ \.join(g:rst_syntax_code_list[s:filetype], '\|')
+ \.'\)'
+
+ exe 'syn include @rst'.s:filetype.' syntax/'.s:filetype.'.vim'
+ exe 'syn region rstDirective'.s:filetype
+ \.' matchgroup=rstDirective fold'
+ \.' start="\c\%(sourcecode\|code\%(-block\)\=\)::\s\+'.s:alias_pattern.'\_s*\n\ze\z(\s\+\)"'
+ \.' skip=#^$#'
+ \.' end=#^\z1\@!#'
+ \.' contains=@NoSpell,@rst'.s:filetype
+ exe 'syn cluster rstDirectives add=rstDirective'.s:filetype
+
" reset 'isk' setting, if it has been changed
if &l:iskeyword !=# prior_isk
let &l:iskeyword = prior_isk
@@ -165,6 +230,9 @@ for code in g:rst_syntax_code_list
unlet! prior_isk
endfor
+" Enable top level spell checking
+syntax spell toplevel
+
" TODO: Use better syncing.
syn sync minlines=50 linebreaks=2
@@ -185,10 +253,6 @@ hi def link rstHyperlinkTarget String
hi def link rstExDirective String
hi def link rstSubstitutionDefinition rstDirective
hi def link rstDelimiter Delimiter
-" TODO: I dunno...
-hi def rstEmphasis term=italic cterm=italic gui=italic
-hi def link rstStrongEmphasis Special
-"term=bold cterm=bold gui=bold
hi def link rstInterpretedTextOrHyperlinkReference Identifier
hi def link rstInlineLiteral String
hi def link rstSubstitutionReference PreProc
@@ -198,6 +262,14 @@ hi def link rstCitationReference Identifier
hi def link rstHyperLinkReference Identifier
hi def link rstStandaloneHyperlink Identifier
hi def link rstCodeBlock String
+if exists('g:rst_use_emphasis_colors')
+ " TODO: Less arbitrary color selection
+ hi def rstEmphasis ctermfg=13 term=italic cterm=italic gui=italic
+ hi def rstStrongEmphasis ctermfg=1 term=bold cterm=bold gui=bold
+else
+ hi def rstEmphasis term=italic cterm=italic gui=italic
+ hi def rstStrongEmphasis term=bold cterm=bold gui=bold
+endif
let b:current_syntax = "rst"
diff --git a/runtime/syntax/rtf.vim b/runtime/syntax/rtf.vim
index 8f5ea71a36..c856f9ffcf 100644
--- a/runtime/syntax/rtf.vim
+++ b/runtime/syntax/rtf.vim
@@ -13,11 +13,8 @@
" TODO: render underline, italic, bold
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -52,35 +49,25 @@ syn match rtfBlue "\\blue[0-9][0-9]*"
syn match rtfFootNote "[#$K+]{\\footnote.*}" contains=rtfControlWord,rtfNewControlWord
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_rtf_syntax_inits")
- if version < 508
- let did_rtf_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
-
- HiLink rtfControlWord Statement
- HiLink rtfNewControlWord Special
- HiLink rtfControlSymbol Constant
- HiLink rtfCharacter Character
- HiLink rtfUnicodeCharacter SpecialChar
- HiLink rtfFootNote Comment
-
- " Define colors for the syntax file
- hi rtfRed term=underline cterm=underline ctermfg=DarkRed gui=underline guifg=DarkRed
- hi rtfGreen term=underline cterm=underline ctermfg=DarkGreen gui=underline guifg=DarkGreen
- hi rtfBlue term=underline cterm=underline ctermfg=DarkBlue gui=underline guifg=DarkBlue
-
- HiLink rtfRed rtfRed
- HiLink rtfGreen rtfGreen
- HiLink rtfBlue rtfBlue
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+
+hi def link rtfControlWord Statement
+hi def link rtfNewControlWord Special
+hi def link rtfControlSymbol Constant
+hi def link rtfCharacter Character
+hi def link rtfUnicodeCharacter SpecialChar
+hi def link rtfFootNote Comment
+
+" Define colors for the syntax file
+hi rtfRed term=underline cterm=underline ctermfg=DarkRed gui=underline guifg=DarkRed
+hi rtfGreen term=underline cterm=underline ctermfg=DarkGreen gui=underline guifg=DarkGreen
+hi rtfBlue term=underline cterm=underline ctermfg=DarkBlue gui=underline guifg=DarkBlue
+
+hi def link rtfRed rtfRed
+hi def link rtfGreen rtfGreen
+hi def link rtfBlue rtfBlue
+
let b:current_syntax = "rtf"
diff --git a/runtime/syntax/ruby.vim b/runtime/syntax/ruby.vim
index 28f553decb..ca7f51b1ea 100644
--- a/runtime/syntax/ruby.vim
+++ b/runtime/syntax/ruby.vim
@@ -9,16 +9,45 @@
" Thanks to perl.vim authors, and to Reimer Behrends. :-) (MN)
" ----------------------------------------------------------------------------
+" Prelude {{{1
if exists("b:current_syntax")
finish
endif
+" this file uses line continuations
+let s:cpo_sav = &cpo
+set cpo&vim
+
+" Folding Config {{{1
if has("folding") && exists("ruby_fold")
setlocal foldmethod=syntax
endif
+let s:foldable_groups = split(
+ \ get(
+ \ b:,
+ \ 'ruby_foldable_groups',
+ \ get(g:, 'ruby_foldable_groups', 'ALL')
+ \ )
+ \ )
+
+function! s:foldable(...) abort
+ if index(s:foldable_groups, 'ALL') > -1
+ return 1
+ endif
+
+ for l:i in a:000
+ if index(s:foldable_groups, l:i) > -1
+ return 1
+ endif
+ endfor
+
+ return 0
+endfunction " }}}
+
syn cluster rubyNotTop contains=@rubyExtendedStringSpecial,@rubyRegexpSpecial,@rubyDeclaration,rubyConditional,rubyExceptional,rubyMethodExceptional,rubyTodo
+" Whitespace Errors {{{1
if exists("ruby_space_errors")
if !exists("ruby_no_trail_space_error")
syn match rubySpaceError display excludenl "\s\+$"
@@ -28,14 +57,14 @@ if exists("ruby_space_errors")
endif
endif
-" Operators
+" Operators {{{1
if exists("ruby_operators")
- syn match rubyOperator "[~!^&|*/%+-]\|\%(class\s*\)\@<!<<\|<=>\|<=\|\%(<\|\<class\s\+\u\w*\s*\)\@<!<[^<]\@=\|===\|==\|=\~\|>>\|>=\|=\@<!>\|\*\*\|\.\.\.\|\.\.\|::"
+ syn match rubyOperator "[~!^|*/%+-]\|&\.\@!\|\%(class\s*\)\@<!<<\|<=>\|<=\|\%(<\|\<class\s\+\u\w*\s*\)\@<!<[^<]\@=\|===\|==\|=\~\|>>\|>=\|=\@1<!>\|\*\*\|\.\.\.\|\.\.\|::"
syn match rubyOperator "->\|-=\|/=\|\*\*=\|\*=\|&&=\|&=\|&&\|||=\||=\|||\|%=\|+=\|!\~\|!="
- syn region rubyBracketOperator matchgroup=rubyOperator start="\%(\w[?!]\=\|[]})]\)\@<=\[\s*" end="\s*]" contains=ALLBUT,@rubyNotTop
+ syn region rubyBracketOperator matchgroup=rubyOperator start="\%(\w[?!]\=\|[]})]\)\@2<=\[\s*" end="\s*]" contains=ALLBUT,@rubyNotTop
endif
-" Expression Substitution and Backslash Notation
+" Expression Substitution and Backslash Notation {{{1
syn match rubyStringEscape "\\\\\|\\[abefnrstv]\|\\\o\{1,3}\|\\x\x\{1,2}" contained display
syn match rubyStringEscape "\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)" contained display
syn match rubyQuoteEscape "\\[\\']" contained display
@@ -45,18 +74,19 @@ syn match rubyInterpolation "#\%(\$\|@@\=\)\w\+" display contained con
syn match rubyInterpolationDelimiter "#\ze\%(\$\|@@\=\)\w\+" display contained
syn match rubyInterpolation "#\$\%(-\w\|\W\)" display contained contains=rubyInterpolationDelimiter,rubyPredefinedVariable,rubyInvalidVariable
syn match rubyInterpolationDelimiter "#\ze\$\%(-\w\|\W\)" display contained
-syn region rubyNoInterpolation start="\\#{" end="}" contained
+syn region rubyNoInterpolation start="\\#{" end="}" contained
syn match rubyNoInterpolation "\\#{" display contained
syn match rubyNoInterpolation "\\#\%(\$\|@@\=\)\w\+" display contained
syn match rubyNoInterpolation "\\#\$\W" display contained
-syn match rubyDelimEscape "\\[(<{\[)>}\]]" transparent display contained contains=NONE
+syn match rubyDelimiterEscape "\\[(<{\[)>}\]]" transparent display contained contains=NONE
syn region rubyNestedParentheses start="(" skip="\\\\\|\\)" matchgroup=rubyString end=")" transparent contained
syn region rubyNestedCurlyBraces start="{" skip="\\\\\|\\}" matchgroup=rubyString end="}" transparent contained
syn region rubyNestedAngleBrackets start="<" skip="\\\\\|\\>" matchgroup=rubyString end=">" transparent contained
syn region rubyNestedSquareBrackets start="\[" skip="\\\\\|\\\]" matchgroup=rubyString end="\]" transparent contained
+" Regular Expression Metacharacters {{{1
" These are mostly Oniguruma ready
syn region rubyRegexpComment matchgroup=rubyRegexpSpecial start="(?#" skip="\\)" end=")" contained
syn region rubyRegexpParens matchgroup=rubyRegexpSpecial start="(\(?:\|?<\=[=!]\|?>\|?<[a-z_]\w*>\|?[imx]*-[imx]*:\=\|\%(?#\)\@!\)" skip="\\)" end=")" contained transparent contains=@rubyRegexpSpecial
@@ -79,36 +109,40 @@ syn cluster rubyStringSpecial contains=rubyInterpolation,rubyNoInterpolati
syn cluster rubyExtendedStringSpecial contains=@rubyStringSpecial,rubyNestedParentheses,rubyNestedCurlyBraces,rubyNestedAngleBrackets,rubyNestedSquareBrackets
syn cluster rubyRegexpSpecial contains=rubyInterpolation,rubyNoInterpolation,rubyStringEscape,rubyRegexpSpecial,rubyRegexpEscape,rubyRegexpBrackets,rubyRegexpCharClass,rubyRegexpDot,rubyRegexpQuantifier,rubyRegexpAnchor,rubyRegexpParens,rubyRegexpComment
-" Numbers and ASCII Codes
-syn match rubyASCIICode "\%(\w\|[]})\"'/]\)\@<!\%(?\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\=\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)\)"
-syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<0[xX]\x\+\%(_\x\+\)*\>" display
-syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<\%(0[dD]\)\=\%(0\|[1-9]\d*\%(_\d\+\)*\)\>" display
-syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<0[oO]\=\o\+\%(_\o\+\)*\>" display
-syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<0[bB][01]\+\%(_[01]\+\)*\>" display
-syn match rubyFloat "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\.\d\+\%(_\d\+\)*\>" display
-syn match rubyFloat "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\%(\.\d\+\%(_\d\+\)*\)\=\%([eE][-+]\=\d\+\%(_\d\+\)*\)\>" display
+" Numbers and ASCII Codes {{{1
+syn match rubyASCIICode "\%(\w\|[]})\"'/]\)\@1<!\%(?\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\=\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)\)"
+syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<0[xX]\x\+\%(_\x\+\)*r\=i\=\>" display
+syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<\%(0[dD]\)\=\%(0\|[1-9]\d*\%(_\d\+\)*\)r\=i\=\>" display
+syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<0[oO]\=\o\+\%(_\o\+\)*r\=i\=\>" display
+syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<0[bB][01]\+\%(_[01]\+\)*r\=i\=\>" display
+syn match rubyFloat "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\.\d\+\%(_\d\+\)*r\=i\=\>" display
+syn match rubyFloat "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\%(\.\d\+\%(_\d\+\)*\)\=\%([eE][-+]\=\d\+\%(_\d\+\)*\)r\=i\=\>" display
-" Identifiers
+" Identifiers {{{1
syn match rubyLocalVariableOrMethod "\<[_[:lower:]][_[:alnum:]]*[?!=]\=" contains=NONE display transparent
syn match rubyBlockArgument "&[_[:lower:]][_[:alnum:]]" contains=NONE display transparent
-syn match rubyConstant "\%(\%([.@$]\@<!\.\)\@<!\<\|::\)\_s*\zs\u\w*\%(\>\|::\)\@=\%(\s*(\)\@!"
+syn match rubyConstant "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\u\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)\@!"
syn match rubyClassVariable "@@\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*" display
-syn match rubyInstanceVariable "@\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*" display
+syn match rubyInstanceVariable "@\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*" display
syn match rubyGlobalVariable "$\%(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\|-.\)"
-syn match rubySymbol "[]})\"':]\@<!:\%(\^\|\~\|<<\|<=>\|<=\|<\|===\|[=!]=\|[=!]\~\|!\|>>\|>=\|>\||\|-@\|-\|/\|\[]=\|\[]\|\*\*\|\*\|&\|%\|+@\|+\|`\)"
-syn match rubySymbol "[]})\"':]\@<!:\$\%(-.\|[`~<=>_,;:!?/.'"@$*\&+0]\)"
-syn match rubySymbol "[]})\"':]\@<!:\%(\$\|@@\=\)\=\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*"
-syn match rubySymbol "[]})\"':]\@<!:\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\%([?!=]>\@!\)\="
-syn match rubySymbol "\%([{(,]\_s*\)\@<=\l\w*[!?]\=::\@!"he=e-1
-syn match rubySymbol "[]})\"':]\@<!\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*[!?]\=:\s\@="he=e-1
-syn match rubySymbol "\%([{(,]\_s*\)\@<=[[:space:],{]\l\w*[!?]\=::\@!"hs=s+1,he=e-1
-syn match rubySymbol "[[:space:],{]\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*[!?]\=:\s\@="hs=s+1,he=e-1
-syn region rubySymbol start="[]})\"':]\@<!:'" end="'" skip="\\\\\|\\'" contains=rubyQuoteEscape fold
-syn region rubySymbol start="[]})\"':]\@<!:\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial fold
+syn match rubySymbol "[]})\"':]\@1<!:\%(\^\|\~@\|\~\|<<\|<=>\|<=\|<\|===\|[=!]=\|[=!]\~\|!@\|!\|>>\|>=\|>\||\|-@\|-\|/\|\[]=\|\[]\|\*\*\|\*\|&\|%\|+@\|+\|`\)"
+syn match rubySymbol "[]})\"':]\@1<!:\$\%(-.\|[`~<=>_,;:!?/.'"@$*\&+0]\)"
+syn match rubySymbol "[]})\"':]\@1<!:\%(\$\|@@\=\)\=\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*"
+syn match rubySymbol "[]})\"':]\@1<!:\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\%([?!=]>\@!\)\="
+
+if s:foldable(':')
+ syn region rubySymbol start="[]})\"':]\@1<!:'" end="'" skip="\\\\\|\\'" contains=rubyQuoteEscape fold
+ syn region rubySymbol start="[]})\"':]\@1<!:\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial fold
+else
+ syn region rubySymbol start="[]})\"':]\@1<!:'" end="'" skip="\\\\\|\\'" contains=rubyQuoteEscape
+ syn region rubySymbol start="[]})\"':]\@1<!:\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial
+endif
+
+syn match rubyCapitalizedMethod "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\u\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)*\s*(\@="
syn match rubyBlockParameter "\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*" contained
-syn region rubyBlockParameterList start="\%(\%(\<do\>\|{\)\s*\)\@<=|" end="|" oneline display contains=rubyBlockParameter
+syn region rubyBlockParameterList start="\%(\%(\<do\>\|{\)\_s*\)\@32<=|" end="|" oneline display contains=rubyBlockParameter
syn match rubyInvalidVariable "$[^ A-Za-z_-]"
syn match rubyPredefinedVariable #$[!$&"'*+,./0:;<=>?@\`~]#
@@ -117,93 +151,187 @@ syn match rubyPredefinedVariable "$_\>" display
syn match rubyPredefinedVariable "$-[0FIKadilpvw]\>" display
syn match rubyPredefinedVariable "$\%(deferr\|defout\|stderr\|stdin\|stdout\)\>" display
syn match rubyPredefinedVariable "$\%(DEBUG\|FILENAME\|KCODE\|LOADED_FEATURES\|LOAD_PATH\|PROGRAM_NAME\|SAFE\|VERBOSE\)\>" display
-syn match rubyPredefinedConstant "\%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(MatchingData\|ARGF\|ARGV\|ENV\)\>\%(\s*(\)\@!"
-syn match rubyPredefinedConstant "\%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(DATA\|FALSE\|NIL\)\>\%(\s*(\)\@!"
-syn match rubyPredefinedConstant "\%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(STDERR\|STDIN\|STDOUT\|TOPLEVEL_BINDING\|TRUE\)\>\%(\s*(\)\@!"
-syn match rubyPredefinedConstant "\%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(RUBY_\%(VERSION\|RELEASE_DATE\|PLATFORM\|PATCHLEVEL\|REVISION\|DESCRIPTION\|COPYRIGHT\|ENGINE\)\)\>\%(\s*(\)\@!"
-
-" Normal Regular Expression
-syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\%(^\|\<\%(and\|or\|while\|until\|unless\|if\|elsif\|when\|not\|then\|else\)\|[;\~=!|&(,[<>?:*+-]\)\s*\)\@<=/" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial fold
-syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\h\k*\s\+\)\@<=/[ \t=]\@!" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial fold
-
-" Generalized Regular Expression
-syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\z([~`!@#$%^&*_\-+=|\:;"',.? /]\)" end="\z1[iomxneus]*" skip="\\\\\|\\\z1" contains=@rubyRegexpSpecial fold
-syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r{" end="}[iomxneus]*" skip="\\\\\|\\}" contains=@rubyRegexpSpecial fold
-syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r<" end=">[iomxneus]*" skip="\\\\\|\\>" contains=@rubyRegexpSpecial,rubyNestedAngleBrackets,rubyDelimEscape fold
-syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\[" end="\][iomxneus]*" skip="\\\\\|\\\]" contains=@rubyRegexpSpecial fold
-syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r(" end=")[iomxneus]*" skip="\\\\\|\\)" contains=@rubyRegexpSpecial fold
-
-" Normal String and Shell Command Output
-syn region rubyString matchgroup=rubyStringDelimiter start="\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial,@Spell fold
-syn region rubyString matchgroup=rubyStringDelimiter start="'" end="'" skip="\\\\\|\\'" contains=rubyQuoteEscape,@Spell fold
-syn region rubyString matchgroup=rubyStringDelimiter start="`" end="`" skip="\\\\\|\\`" contains=@rubyStringSpecial fold
-
-" Generalized Single Quoted String, Symbol and Array of Strings
-syn region rubyString matchgroup=rubyStringDelimiter start="%[qwi]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" fold
-syn region rubyString matchgroup=rubyStringDelimiter start="%[qwi]{" end="}" skip="\\\\\|\\}" fold contains=rubyNestedCurlyBraces,rubyDelimEscape
-syn region rubyString matchgroup=rubyStringDelimiter start="%[qwi]<" end=">" skip="\\\\\|\\>" fold contains=rubyNestedAngleBrackets,rubyDelimEscape
-syn region rubyString matchgroup=rubyStringDelimiter start="%[qwi]\[" end="\]" skip="\\\\\|\\\]" fold contains=rubyNestedSquareBrackets,rubyDelimEscape
-syn region rubyString matchgroup=rubyStringDelimiter start="%[qwi](" end=")" skip="\\\\\|\\)" fold contains=rubyNestedParentheses,rubyDelimEscape
-syn region rubyString matchgroup=rubyStringDelimiter start="%q " end=" " skip="\\\\\|\\)" fold
-syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s\z([~`!@#$%^&*_\-+=|\:;"',.? /]\)" end="\z1" skip="\\\\\|\\\z1" fold
-syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s{" end="}" skip="\\\\\|\\}" fold contains=rubyNestedCurlyBraces,rubyDelimEscape
-syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s<" end=">" skip="\\\\\|\\>" fold contains=rubyNestedAngleBrackets,rubyDelimEscape
-syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s\[" end="\]" skip="\\\\\|\\\]" fold contains=rubyNestedSquareBrackets,rubyDelimEscape
-syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s(" end=")" skip="\\\\\|\\)" fold contains=rubyNestedParentheses,rubyDelimEscape
-
-" Generalized Double Quoted String and Array of Strings and Shell Command Output
+syn match rubyPredefinedConstant "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\%(ARGF\|ARGV\|ENV\|DATA\|FALSE\|NIL\|STDERR\|STDIN\|STDOUT\|TOPLEVEL_BINDING\|TRUE\)\>\%(\s*(\)\@!"
+syn match rubyPredefinedConstant "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\%(RUBY_\%(VERSION\|RELEASE_DATE\|PLATFORM\|PATCHLEVEL\|REVISION\|DESCRIPTION\|COPYRIGHT\|ENGINE\)\)\>\%(\s*(\)\@!"
+
+" Normal Regular Expression {{{1
+if s:foldable('/')
+ syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\%(^\|\<\%(and\|or\|while\|until\|unless\|if\|elsif\|when\|not\|then\|else\)\|[;\~=!|&(,{[<>?:*+-]\)\s*\)\@<=/" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial fold
+ syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\h\k*\s\+\)\@<=/[ \t=]\@!" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial fold
+else
+ syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\%(^\|\<\%(and\|or\|while\|until\|unless\|if\|elsif\|when\|not\|then\|else\)\|[;\~=!|&(,{[<>?:*+-]\)\s*\)\@<=/" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial
+ syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\h\k*\s\+\)\@<=/[ \t=]\@!" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial
+endif
+
+" Generalized Regular Expression {{{1
+if s:foldable('%')
+ syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1[iomxneus]*" skip="\\\\\|\\\z1" contains=@rubyRegexpSpecial fold
+ syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r{" end="}[iomxneus]*" skip="\\\\\|\\}" contains=@rubyRegexpSpecial fold
+ syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r<" end=">[iomxneus]*" skip="\\\\\|\\>" contains=@rubyRegexpSpecial,rubyNestedAngleBrackets,rubyDelimiterEscape fold
+ syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\[" end="\][iomxneus]*" skip="\\\\\|\\\]" contains=@rubyRegexpSpecial fold
+ syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r(" end=")[iomxneus]*" skip="\\\\\|\\)" contains=@rubyRegexpSpecial fold
+ syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\z(\s\)" end="\z1[iomxneus]*" skip="\\\\\|\\\z1" contains=@rubyRegexpSpecial fold
+else
+ syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1[iomxneus]*" skip="\\\\\|\\\z1" contains=@rubyRegexpSpecial
+ syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r{" end="}[iomxneus]*" skip="\\\\\|\\}" contains=@rubyRegexpSpecial
+ syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r<" end=">[iomxneus]*" skip="\\\\\|\\>" contains=@rubyRegexpSpecial,rubyNestedAngleBrackets,rubyDelimiterEscape
+ syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\[" end="\][iomxneus]*" skip="\\\\\|\\\]" contains=@rubyRegexpSpecial
+ syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r(" end=")[iomxneus]*" skip="\\\\\|\\)" contains=@rubyRegexpSpecial
+ syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\z(\s\)" end="\z1[iomxneus]*" skip="\\\\\|\\\z1" contains=@rubyRegexpSpecial
+endif
+
+" Normal String {{{1
+let s:spell_cluster = exists('ruby_spellcheck_strings') ? ',@Spell' : ''
+exe 'syn region rubyString matchgroup=rubyStringDelimiter start="\"" end="\"" skip="\\\\\|\\\"" ' .
+ \ (s:foldable('%') ? 'fold' : '') . ' contains=@rubyStringSpecial' . s:spell_cluster
+exe 'syn region rubyString matchgroup=rubyStringDelimiter start="''" end="''" skip="\\\\\|\\''" ' .
+ \ (s:foldable('%') ? 'fold' : '') . ' contains=rubyQuoteEscape' . s:spell_cluster
+
+" Shell Command Output {{{1
+if s:foldable('%')
+ syn region rubyString matchgroup=rubyStringDelimiter start="`" end="`" skip="\\\\\|\\`" contains=@rubyStringSpecial fold
+else
+ syn region rubyString matchgroup=rubyStringDelimiter start="`" end="`" skip="\\\\\|\\`" contains=@rubyStringSpecial
+endif
+
+" Generalized Single Quoted String, Symbol and Array of Strings {{{1
+if s:foldable('%')
+ syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" fold
+ syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]{" end="}" skip="\\\\\|\\}" fold contains=rubyNestedCurlyBraces,rubyDelimiterEscape
+ syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]<" end=">" skip="\\\\\|\\>" fold contains=rubyNestedAngleBrackets,rubyDelimiterEscape
+ syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]\[" end="\]" skip="\\\\\|\\\]" fold contains=rubyNestedSquareBrackets,rubyDelimiterEscape
+ syn region rubyString matchgroup=rubyStringDelimiter start="%[qw](" end=")" skip="\\\\\|\\)" fold contains=rubyNestedParentheses,rubyDelimiterEscape
+ syn region rubyString matchgroup=rubyStringDelimiter start="%q\z(\s\)" end="\z1" skip="\\\\\|\\\z1" fold
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" fold
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s{" end="}" skip="\\\\\|\\}" fold contains=rubyNestedCurlyBraces,rubyDelimiterEscape
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s<" end=">" skip="\\\\\|\\>" fold contains=rubyNestedAngleBrackets,rubyDelimiterEscape
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s\[" end="\]" skip="\\\\\|\\\]" fold contains=rubyNestedSquareBrackets,rubyDelimiterEscape
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s(" end=")" skip="\\\\\|\\)" fold contains=rubyNestedParentheses,rubyDelimiterEscape
+ syn region rubyString matchgroup=rubyStringDelimiter start="%s\z(\s\)" end="\z1" skip="\\\\\|\\\z1" fold
+else
+ syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1"
+ syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]{" end="}" skip="\\\\\|\\}" contains=rubyNestedCurlyBraces,rubyDelimiterEscape
+ syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]<" end=">" skip="\\\\\|\\>" contains=rubyNestedAngleBrackets,rubyDelimiterEscape
+ syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]\[" end="\]" skip="\\\\\|\\\]" contains=rubyNestedSquareBrackets,rubyDelimiterEscape
+ syn region rubyString matchgroup=rubyStringDelimiter start="%[qw](" end=")" skip="\\\\\|\\)" contains=rubyNestedParentheses,rubyDelimiterEscape
+ syn region rubyString matchgroup=rubyStringDelimiter start="%q\z(\s\)" end="\z1" skip="\\\\\|\\\z1"
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1"
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s{" end="}" skip="\\\\\|\\}" contains=rubyNestedCurlyBraces,rubyDelimiterEscape
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s<" end=">" skip="\\\\\|\\>" contains=rubyNestedAngleBrackets,rubyDelimiterEscape
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s\[" end="\]" skip="\\\\\|\\\]" contains=rubyNestedSquareBrackets,rubyDelimiterEscape
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s(" end=")" skip="\\\\\|\\)" contains=rubyNestedParentheses,rubyDelimiterEscape
+ syn region rubyString matchgroup=rubyStringDelimiter start="%s\z(\s\)" end="\z1" skip="\\\\\|\\\z1"
+endif
+
+" Generalized Double Quoted String and Array of Strings and Shell Command Output {{{1
" Note: %= is not matched here as the beginning of a double quoted string
-syn region rubyString matchgroup=rubyStringDelimiter start="%\z([~`!@#$%^&*_\-+|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
-syn region rubyString matchgroup=rubyStringDelimiter start="%[QWIx]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
-syn region rubyString matchgroup=rubyStringDelimiter start="%[QWIx]\={" end="}" skip="\\\\\|\\}" contains=@rubyStringSpecial,rubyNestedCurlyBraces,rubyDelimEscape fold
-syn region rubyString matchgroup=rubyStringDelimiter start="%[QWIx]\=<" end=">" skip="\\\\\|\\>" contains=@rubyStringSpecial,rubyNestedAngleBrackets,rubyDelimEscape fold
-syn region rubyString matchgroup=rubyStringDelimiter start="%[QWIx]\=\[" end="\]" skip="\\\\\|\\\]" contains=@rubyStringSpecial,rubyNestedSquareBrackets,rubyDelimEscape fold
-syn region rubyString matchgroup=rubyStringDelimiter start="%[QWIx]\=(" end=")" skip="\\\\\|\\)" contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimEscape fold
-syn region rubyString matchgroup=rubyStringDelimiter start="%[Qx] " end=" " skip="\\\\\|\\)" contains=@rubyStringSpecial fold
-
-" Here Document
-syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs\%(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
-syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs"\%([^"]*\)"+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
-syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs'\%([^']*\)'+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
-syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs`\%([^`]*\)`+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
-
-syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial fold keepend
-syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<"\z([^"]*\)"\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial fold keepend
-syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<'\z([^']*\)'\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc fold keepend
-syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<`\z([^`]*\)`\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial fold keepend
-
-syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<-\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
-syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<-"\z([^"]*\)"\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
-syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<-'\z([^']*\)'\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart fold keepend
-syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<-`\z([^`]*\)`\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
+if s:foldable('%')
+ syn region rubyString matchgroup=rubyStringDelimiter start="%\z([~`!@#$%^&*_\-+|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
+ syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
+ syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\={" end="}" skip="\\\\\|\\}" contains=@rubyStringSpecial,rubyNestedCurlyBraces,rubyDelimiterEscape fold
+ syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=<" end=">" skip="\\\\\|\\>" contains=@rubyStringSpecial,rubyNestedAngleBrackets,rubyDelimiterEscape fold
+ syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=\[" end="\]" skip="\\\\\|\\\]" contains=@rubyStringSpecial,rubyNestedSquareBrackets,rubyDelimiterEscape fold
+ syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=(" end=")" skip="\\\\\|\\)" contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimiterEscape fold
+ syn region rubyString matchgroup=rubyStringDelimiter start="%[Qx]\z(\s\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
+else
+ syn region rubyString matchgroup=rubyStringDelimiter start="%\z([~`!@#$%^&*_\-+|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial
+ syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial
+ syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\={" end="}" skip="\\\\\|\\}" contains=@rubyStringSpecial,rubyNestedCurlyBraces,rubyDelimiterEscape
+ syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=<" end=">" skip="\\\\\|\\>" contains=@rubyStringSpecial,rubyNestedAngleBrackets,rubyDelimiterEscape
+ syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=\[" end="\]" skip="\\\\\|\\\]" contains=@rubyStringSpecial,rubyNestedSquareBrackets,rubyDelimiterEscape
+ syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=(" end=")" skip="\\\\\|\\)" contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimiterEscape
+ syn region rubyString matchgroup=rubyStringDelimiter start="%[Qx]\z(\s\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial
+endif
+
+" Array of Symbols {{{1
+if s:foldable('%')
+ " Array of Symbols
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%i\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" fold
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%i{" end="}" skip="\\\\\|\\}" fold contains=rubyNestedCurlyBraces,rubyDelimiterEscape
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%i<" end=">" skip="\\\\\|\\>" fold contains=rubyNestedAngleBrackets,rubyDelimiterEscape
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%i\[" end="\]" skip="\\\\\|\\\]" fold contains=rubyNestedSquareBrackets,rubyDelimiterEscape
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%i(" end=")" skip="\\\\\|\\)" fold contains=rubyNestedParentheses,rubyDelimiterEscape
+
+ " Array of interpolated Symbols
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%I\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%I{" end="}" skip="\\\\\|\\}" contains=@rubyStringSpecial,rubyNestedCurlyBraces,rubyDelimiterEscape fold
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%I<" end=">" skip="\\\\\|\\>" contains=@rubyStringSpecial,rubyNestedAngleBrackets,rubyDelimiterEscape fold
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%I\[" end="\]" skip="\\\\\|\\\]" contains=@rubyStringSpecial,rubyNestedSquareBrackets,rubyDelimiterEscape fold
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%I(" end=")" skip="\\\\\|\\)" contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimiterEscape fold
+else
+ " Array of Symbols
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%i\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1"
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%i{" end="}" skip="\\\\\|\\}" contains=rubyNestedCurlyBraces,rubyDelimiterEscape
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%i<" end=">" skip="\\\\\|\\>" contains=rubyNestedAngleBrackets,rubyDelimiterEscape
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%i\[" end="\]" skip="\\\\\|\\\]" contains=rubyNestedSquareBrackets,rubyDelimiterEscape
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%i(" end=")" skip="\\\\\|\\)" contains=rubyNestedParentheses,rubyDelimiterEscape
+
+ " Array of interpolated Symbols
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%I\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%I{" end="}" skip="\\\\\|\\}" contains=@rubyStringSpecial,rubyNestedCurlyBraces,rubyDelimiterEscape
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%I<" end=">" skip="\\\\\|\\>" contains=@rubyStringSpecial,rubyNestedAngleBrackets,rubyDelimiterEscape
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%I\[" end="\]" skip="\\\\\|\\\]" contains=@rubyStringSpecial,rubyNestedSquareBrackets,rubyDelimiterEscape
+ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%I(" end=")" skip="\\\\\|\\)" contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimiterEscape
+endif
+
+" Here Document {{{1
+syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<[-~]\=\zs\%(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
+syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<[-~]\=\zs"\%([^"]*\)"+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
+syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<[-~]\=\zs'\%([^']*\)'+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
+syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<[-~]\=\zs`\%([^`]*\)`+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
+
+if s:foldable('<<')
+ syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial fold keepend
+ syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<"\z([^"]*\)"\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial fold keepend
+ syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<'\z([^']*\)'\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc fold keepend
+ syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<`\z([^`]*\)`\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial fold keepend
+
+ syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<[-~]\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
+ syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<[-~]"\z([^"]*\)"\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
+ syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<[-~]'\z([^']*\)'\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart fold keepend
+ syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<[-~]`\z([^`]*\)`\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
+else
+ syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial keepend
+ syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<"\z([^"]*\)"\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial keepend
+ syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<'\z([^']*\)'\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc keepend
+ syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<`\z([^`]*\)`\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial keepend
+
+ syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<[-~]\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
+ syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<[-~]"\z([^"]*\)"\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
+ syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<[-~]'\z([^']*\)'\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart keepend
+ syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<[-~]`\z([^`]*\)`\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
+endif
+" eRuby Config {{{1
if exists('main_syntax') && main_syntax == 'eruby'
let b:ruby_no_expensive = 1
end
+" Module, Class, Method and Alias Declarations {{{1
syn match rubyAliasDeclaration "[^[:space:];#.()]\+" contained contains=rubySymbol,rubyGlobalVariable,rubyPredefinedVariable nextgroup=rubyAliasDeclaration2 skipwhite
syn match rubyAliasDeclaration2 "[^[:space:];#.()]\+" contained contains=rubySymbol,rubyGlobalVariable,rubyPredefinedVariable
syn match rubyMethodDeclaration "[^[:space:];#(]\+" contained contains=rubyConstant,rubyBoolean,rubyPseudoVariable,rubyInstanceVariable,rubyClassVariable,rubyGlobalVariable
syn match rubyClassDeclaration "[^[:space:];#<]\+" contained contains=rubyConstant,rubyOperator
syn match rubyModuleDeclaration "[^[:space:];#<]\+" contained contains=rubyConstant,rubyOperator
syn match rubyFunction "\<[_[:alpha:]][_[:alnum:]]*[?!=]\=[[:alnum:]_.:?!=]\@!" contained containedin=rubyMethodDeclaration
-syn match rubyFunction "\%(\s\|^\)\@<=[_[:alpha:]][_[:alnum:]]*[?!=]\=\%(\s\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2
-syn match rubyFunction "\%([[:space:].]\|^\)\@<=\%(\[\]=\=\|\*\*\|[+-]@\=\|[*/%|&^~]\|<<\|>>\|[<>]=\=\|<=>\|===\|[=!]=\|[=!]\~\|!\|`\)\%([[:space:];#(]\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration
+syn match rubyFunction "\%(\s\|^\)\@1<=[_[:alpha:]][_[:alnum:]]*[?!=]\=\%(\s\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2
+syn match rubyFunction "\%([[:space:].]\|^\)\@2<=\%(\[\]=\=\|\*\*\|[-+!~]@\=\|[*/%|&^~]\|<<\|>>\|[<>]=\=\|<=>\|===\|[=!]=\|[=!]\~\|!\|`\)\%([[:space:];#(]\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration
syn cluster rubyDeclaration contains=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration,rubyModuleDeclaration,rubyClassDeclaration,rubyFunction,rubyBlockParameter
-" Keywords
+" Keywords {{{1
" Note: the following keywords have already been defined:
" begin case class def do end for if module unless until while
syn match rubyControl "\<\%(and\|break\|in\|next\|not\|or\|redo\|rescue\|retry\|return\)\>[?!]\@!"
syn match rubyOperator "\<defined?" display
syn match rubyKeyword "\<\%(super\|yield\)\>[?!]\@!"
syn match rubyBoolean "\<\%(true\|false\)\>[?!]\@!"
-syn match rubyPseudoVariable "\<\%(nil\|self\|__ENCODING__\|__FILE__\|__LINE__\|__callee__\|__method__\)\>[?!]\@!" " TODO: reorganise
+syn match rubyPseudoVariable "\<\%(nil\|self\|__ENCODING__\|__dir__\|__FILE__\|__LINE__\|__callee__\|__method__\)\>[?!]\@!" " TODO: reorganise
syn match rubyBeginEnd "\<\%(BEGIN\|END\)\>[?!]\@!"
-" Expensive Mode - match 'end' with the appropriate opening keyword for syntax
-" based folding and special highlighting of module/class/method definitions
+" Expensive Mode {{{1
+" Match 'end' with the appropriate opening keyword for syntax based folding
+" and special highlighting of module/class/method definitions
if !exists("b:ruby_no_expensive") && !exists("ruby_no_expensive")
syn match rubyDefine "\<alias\>" nextgroup=rubyAliasDeclaration skipwhite skipnl
syn match rubyDefine "\<def\>" nextgroup=rubyMethodDeclaration skipwhite skipnl
@@ -211,23 +339,66 @@ if !exists("b:ruby_no_expensive") && !exists("ruby_no_expensive")
syn match rubyClass "\<class\>" nextgroup=rubyClassDeclaration skipwhite skipnl
syn match rubyModule "\<module\>" nextgroup=rubyModuleDeclaration skipwhite skipnl
- syn region rubyMethodBlock start="\<def\>" matchgroup=rubyDefine end="\%(\<def\_s\+\)\@<!\<end\>" contains=ALLBUT,@rubyNotTop fold
- syn region rubyBlock start="\<class\>" matchgroup=rubyClass end="\<end\>" contains=ALLBUT,@rubyNotTop fold
- syn region rubyBlock start="\<module\>" matchgroup=rubyModule end="\<end\>" contains=ALLBUT,@rubyNotTop fold
+ if s:foldable('def')
+ syn region rubyMethodBlock start="\<def\>" matchgroup=rubyDefine end="\%(\<def\_s\+\)\@<!\<end\>" contains=ALLBUT,@rubyNotTop fold
+ else
+ syn region rubyMethodBlock start="\<def\>" matchgroup=rubyDefine end="\%(\<def\_s\+\)\@<!\<end\>" contains=ALLBUT,@rubyNotTop
+ endif
+
+ if s:foldable('class')
+ syn region rubyBlock start="\<class\>" matchgroup=rubyClass end="\<end\>" contains=ALLBUT,@rubyNotTop fold
+ else
+ syn region rubyBlock start="\<class\>" matchgroup=rubyClass end="\<end\>" contains=ALLBUT,@rubyNotTop
+ endif
+
+ if s:foldable('module')
+ syn region rubyBlock start="\<module\>" matchgroup=rubyModule end="\<end\>" contains=ALLBUT,@rubyNotTop fold
+ else
+ syn region rubyBlock start="\<module\>" matchgroup=rubyModule end="\<end\>" contains=ALLBUT,@rubyNotTop
+ endif
" modifiers
- syn match rubyConditionalModifier "\<\%(if\|unless\)\>" display
- syn match rubyRepeatModifier "\<\%(while\|until\)\>" display
+ syn match rubyLineContinuation "\\$" nextgroup=rubyConditionalModifier,rubyRepeatModifier skipwhite skipnl
+ syn match rubyConditionalModifier "\<\%(if\|unless\)\>"
+ syn match rubyRepeatModifier "\<\%(while\|until\)\>"
+
+ if s:foldable('do')
+ syn region rubyDoBlock matchgroup=rubyControl start="\<do\>" end="\<end\>" contains=ALLBUT,@rubyNotTop fold
+ else
+ syn region rubyDoBlock matchgroup=rubyControl start="\<do\>" end="\<end\>" contains=ALLBUT,@rubyNotTop
+ endif
- syn region rubyDoBlock matchgroup=rubyControl start="\<do\>" end="\<end\>" contains=ALLBUT,@rubyNotTop fold
" curly bracket block or hash literal
- syn region rubyCurlyBlock matchgroup=rubyCurlyBlockDelimiter start="{" end="}" contains=ALLBUT,@rubyNotTop fold
- syn region rubyArrayLiteral matchgroup=rubyArrayDelimiter start="\%(\w\|[\]})]\)\@<!\[" end="]" contains=ALLBUT,@rubyNotTop fold
+ if s:foldable('{')
+ syn region rubyCurlyBlock matchgroup=rubyCurlyBlockDelimiter start="{" end="}" contains=ALLBUT,@rubyNotTop fold
+ else
+ syn region rubyCurlyBlock matchgroup=rubyCurlyBlockDelimiter start="{" end="}" contains=ALLBUT,@rubyNotTop
+ endif
+
+ if s:foldable('[')
+ syn region rubyArrayLiteral matchgroup=rubyArrayDelimiter start="\%(\w\|[\]})]\)\@<!\[" end="]" contains=ALLBUT,@rubyNotTop fold
+ else
+ syn region rubyArrayLiteral matchgroup=rubyArrayDelimiter start="\%(\w\|[\]})]\)\@<!\[" end="]" contains=ALLBUT,@rubyNotTop
+ endif
" statements without 'do'
- syn region rubyBlockExpression matchgroup=rubyControl start="\<begin\>" end="\<end\>" contains=ALLBUT,@rubyNotTop fold
- syn region rubyCaseExpression matchgroup=rubyConditional start="\<case\>" end="\<end\>" contains=ALLBUT,@rubyNotTop fold
- syn region rubyConditionalExpression matchgroup=rubyConditional start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+=-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![?!]\)\s*\)\@<=\%(if\|unless\)\>" end="\%(\%(\%(\.\@<!\.\)\|::\)\s*\)\@<!\<end\>" contains=ALLBUT,@rubyNotTop fold
+ if s:foldable('begin')
+ syn region rubyBlockExpression matchgroup=rubyControl start="\<begin\>" end="\<end\>" contains=ALLBUT,@rubyNotTop fold
+ else
+ syn region rubyBlockExpression matchgroup=rubyControl start="\<begin\>" end="\<end\>" contains=ALLBUT,@rubyNotTop
+ endif
+
+ if s:foldable('case')
+ syn region rubyCaseExpression matchgroup=rubyConditional start="\<case\>" end="\<end\>" contains=ALLBUT,@rubyNotTop fold
+ else
+ syn region rubyCaseExpression matchgroup=rubyConditional start="\<case\>" end="\<end\>" contains=ALLBUT,@rubyNotTop
+ endif
+
+ if s:foldable('if')
+ syn region rubyConditionalExpression matchgroup=rubyConditional start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*%&^|+=-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![?!]\)\s*\)\@<=\%(if\|unless\)\>" end="\%(\%(\%(\.\@1<!\.\)\|::\)\s*\)\@<!\<end\>" contains=ALLBUT,@rubyNotTop fold
+ else
+ syn region rubyConditionalExpression matchgroup=rubyConditional start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*%&^|+=-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![?!]\)\s*\)\@<=\%(if\|unless\)\>" end="\%(\%(\%(\.\@1<!\.\)\|::\)\s*\)\@<!\<end\>" contains=ALLBUT,@rubyNotTop
+ endif
syn match rubyConditional "\<\%(then\|else\|when\)\>[?!]\@!" contained containedin=rubyCaseExpression
syn match rubyConditional "\<\%(then\|else\|elsif\)\>[?!]\@!" contained containedin=rubyConditionalExpression
@@ -237,7 +408,12 @@ if !exists("b:ruby_no_expensive") && !exists("ruby_no_expensive")
" statements with optional 'do'
syn region rubyOptionalDoLine matchgroup=rubyRepeat start="\<for\>[?!]\@!" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![!=?]\)\s*\)\@<=\<\%(until\|while\)\>" matchgroup=rubyOptionalDo end="\%(\<do\>\)" end="\ze\%(;\|$\)" oneline contains=ALLBUT,@rubyNotTop
- syn region rubyRepeatExpression start="\<for\>[?!]\@!" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![!=?]\)\s*\)\@<=\<\%(until\|while\)\>" matchgroup=rubyRepeat end="\<end\>" contains=ALLBUT,@rubyNotTop nextgroup=rubyOptionalDoLine fold
+
+ if s:foldable('for')
+ syn region rubyRepeatExpression start="\<for\>[?!]\@!" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![!=?]\)\s*\)\@<=\<\%(until\|while\)\>" matchgroup=rubyRepeat end="\<end\>" contains=ALLBUT,@rubyNotTop nextgroup=rubyOptionalDoLine fold
+ else
+ syn region rubyRepeatExpression start="\<for\>[?!]\@!" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![!=?]\)\s*\)\@<=\<\%(until\|while\)\>" matchgroup=rubyRepeat end="\<end\>" contains=ALLBUT,@rubyNotTop nextgroup=rubyOptionalDoLine
+ endif
if !exists("ruby_minlines")
let ruby_minlines = 500
@@ -252,7 +428,7 @@ else
syn match rubyKeyword "\<\%(alias\|undef\)\>[?!]\@!"
endif
-" Special Methods
+" Special Methods {{{1
if !exists("ruby_no_special_methods")
syn keyword rubyAccess public protected private public_class_method private_class_method public_constant private_constant module_function
" attr is a common variable name
@@ -263,40 +439,40 @@ if !exists("ruby_no_special_methods")
syn keyword rubyException raise fail catch throw
" false positive with 'include?'
syn match rubyInclude "\<include\>[?!]\@!"
- syn keyword rubyInclude autoload extend load prepend require require_relative
+ syn keyword rubyInclude autoload extend load prepend refine require require_relative using
syn keyword rubyKeyword callcc caller lambda proc
endif
-" Comments and Documentation
+" Comments and Documentation {{{1
syn match rubySharpBang "\%^#!.*" display
-syn keyword rubyTodo FIXME NOTE TODO OPTIMIZE XXX todo contained
+syn keyword rubyTodo FIXME NOTE TODO OPTIMIZE HACK REVIEW XXX todo contained
syn match rubyComment "#.*" contains=rubySharpBang,rubySpaceError,rubyTodo,@Spell
-if !exists("ruby_no_comment_fold")
- syn region rubyMultilineComment start="\%(\%(^\s*#.*\n\)\@<!\%(^\s*#.*\n\)\)\%(\(^\s*#.*\n\)\{1,}\)\@=" end="\%(^\s*#.*\n\)\@<=\%(^\s*#.*\n\)\%(^\s*#\)\@!" contains=rubyComment transparent fold keepend
+if !exists("ruby_no_comment_fold") && s:foldable('#')
+ syn region rubyMultilineComment start="^\s*#.*\n\%(^\s*#\)\@=" end="^\s*#.*\n\%(^\s*#\)\@!" contains=rubyComment transparent fold keepend
syn region rubyDocumentation start="^=begin\ze\%(\s.*\)\=$" end="^=end\%(\s.*\)\=$" contains=rubySpaceError,rubyTodo,@Spell fold
else
syn region rubyDocumentation start="^=begin\s*$" end="^=end\s*$" contains=rubySpaceError,rubyTodo,@Spell
endif
+" Keyword Nobbling {{{1
" Note: this is a hack to prevent 'keywords' being highlighted as such when called as methods with an explicit receiver
-syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(alias\|and\|begin\|break\|case\|class\|def\|defined\|do\|else\)\>" transparent contains=NONE
-syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(elsif\|end\|ensure\|false\|for\|if\|in\|module\|next\|nil\)\>" transparent contains=NONE
-syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(not\|or\|redo\|rescue\|retry\|return\|self\|super\|then\|true\)\>" transparent contains=NONE
-syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(undef\|unless\|until\|when\|while\|yield\|BEGIN\|END\|__FILE__\|__LINE__\)\>" transparent contains=NONE
-
-syn match rubyKeywordAsMethod "\<\%(alias\|begin\|case\|class\|def\|do\|end\)[?!]" transparent contains=NONE
-syn match rubyKeywordAsMethod "\<\%(if\|module\|undef\|unless\|until\|while\)[?!]" transparent contains=NONE
-
-syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(abort\|at_exit\|attr\|attr_accessor\|attr_reader\)\>" transparent contains=NONE
-syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(attr_writer\|autoload\|callcc\|catch\|caller\)\>" transparent contains=NONE
-syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(eval\|class_eval\|instance_eval\|module_eval\|exit\)\>" transparent contains=NONE
-syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(extend\|fail\|fork\|include\|lambda\)\>" transparent contains=NONE
-syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(load\|loop\|prepend\|private\|proc\|protected\)\>" transparent contains=NONE
-syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(public\|require\|require_relative\|raise\|throw\|trap\)\>" transparent contains=NONE
-
-" __END__ Directive
-syn region rubyData matchgroup=rubyDataDirective start="^__END__$" end="\%$" fold
+syn match rubyKeywordAsMethod "\%(\%(\.\@1<!\.\)\|::\)\_s*\%([_[:lower:]][_[:alnum:]]*\|\<\%(BEGIN\|END\)\>\)" transparent contains=NONE
+syn match rubyKeywordAsMethod "\(defined?\|exit!\)\@!\<[_[:lower:]][_[:alnum:]]*[?!]" transparent contains=NONE
+
+" More Symbols {{{1
+syn match rubySymbol "\%([{(,]\_s*\)\zs\l\w*[!?]\=::\@!"he=e-1
+syn match rubySymbol "[]})\"':]\@1<!\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*[!?]\=:[[:space:],]\@="he=e-1
+syn match rubySymbol "\%([{(,]\_s*\)\zs[[:space:],{]\l\w*[!?]\=::\@!"hs=s+1,he=e-1
+syn match rubySymbol "[[:space:],{(]\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*[!?]\=:[[:space:],]\@="hs=s+1,he=e-1
+
+" __END__ Directive {{{1
+if s:foldable('__END__')
+ syn region rubyData matchgroup=rubyDataDirective start="^__END__$" end="\%$" fold
+else
+ syn region rubyData matchgroup=rubyDataDirective start="^__END__$" end="\%$"
+endif
+" Default Highlighting {{{1
hi def link rubyClass rubyDefine
hi def link rubyModule rubyDefine
hi def link rubyMethodExceptional rubyDefine
@@ -336,6 +512,7 @@ hi def link rubyAccess Statement
hi def link rubyAttribute Statement
hi def link rubyEval Statement
hi def link rubyPseudoVariable Constant
+hi def link rubyCapitalizedMethod rubyLocalVariableOrMethod
hi def link rubyComment Comment
hi def link rubyData Comment
@@ -349,7 +526,7 @@ hi def link rubyInterpolationDelimiter Delimiter
hi def link rubyNoInterpolation rubyString
hi def link rubySharpBang PreProc
hi def link rubyRegexpDelimiter rubyStringDelimiter
-hi def link rubySymbolDelimiter rubyStringDelimiter
+hi def link rubySymbolDelimiter rubySymbol
hi def link rubyStringDelimiter Delimiter
hi def link rubyHeredoc rubyString
hi def link rubyString String
@@ -366,6 +543,10 @@ hi def link rubyInvalidVariable Error
hi def link rubyError Error
hi def link rubySpaceError rubyError
+" Postscript {{{1
let b:current_syntax = "ruby"
-" vim: nowrap sw=2 sts=2 ts=8 noet:
+let &cpo = s:cpo_sav
+unlet! s:cpo_sav
+
+" vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker:
diff --git a/runtime/syntax/rust.vim b/runtime/syntax/rust.vim
new file mode 100644
index 0000000000..57343301e0
--- /dev/null
+++ b/runtime/syntax/rust.vim
@@ -0,0 +1,295 @@
+" Vim syntax file
+" Language: Rust
+" Maintainer: Patrick Walton <pcwalton@mozilla.com>
+" Maintainer: Ben Blum <bblum@cs.cmu.edu>
+" Maintainer: Chris Morgan <me@chrismorgan.info>
+" Last Change: Feb 24, 2016
+" For bugs, patches and license go to https://github.com/rust-lang/rust.vim
+
+if version < 600
+ syntax clear
+elseif exists("b:current_syntax")
+ finish
+endif
+
+" Syntax definitions {{{1
+" Basic keywords {{{2
+syn keyword rustConditional match if else
+syn keyword rustRepeat for loop while
+syn keyword rustTypedef type nextgroup=rustIdentifier skipwhite skipempty
+syn keyword rustStructure struct enum nextgroup=rustIdentifier skipwhite skipempty
+syn keyword rustUnion union nextgroup=rustIdentifier skipwhite skipempty contained
+syn match rustUnionContextual /\<union\_s\+\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*/ transparent contains=rustUnion
+syn keyword rustOperator as
+
+syn match rustAssert "\<assert\(\w\)*!" contained
+syn match rustPanic "\<panic\(\w\)*!" contained
+syn keyword rustKeyword break
+syn keyword rustKeyword box nextgroup=rustBoxPlacement skipwhite skipempty
+syn keyword rustKeyword continue
+syn keyword rustKeyword extern nextgroup=rustExternCrate,rustObsoleteExternMod skipwhite skipempty
+syn keyword rustKeyword fn nextgroup=rustFuncName skipwhite skipempty
+syn keyword rustKeyword in impl let
+syn keyword rustKeyword pub nextgroup=rustPubScope skipwhite skipempty
+syn keyword rustKeyword return
+syn keyword rustSuper super
+syn keyword rustKeyword unsafe where
+syn keyword rustKeyword use nextgroup=rustModPath skipwhite skipempty
+" FIXME: Scoped impl's name is also fallen in this category
+syn keyword rustKeyword mod trait nextgroup=rustIdentifier skipwhite skipempty
+syn keyword rustStorage move mut ref static const
+syn match rustDefault /\<default\ze\_s\+\(impl\|fn\|type\|const\)\>/
+
+syn keyword rustInvalidBareKeyword crate
+
+syn keyword rustPubScopeCrate crate contained
+syn match rustPubScopeDelim /[()]/ contained
+syn match rustPubScope /([^()]*)/ contained contains=rustPubScopeDelim,rustPubScopeCrate,rustSuper,rustModPath,rustModPathSep,rustSelf transparent
+
+syn keyword rustExternCrate crate contained nextgroup=rustIdentifier,rustExternCrateString skipwhite skipempty
+" This is to get the `bar` part of `extern crate "foo" as bar;` highlighting.
+syn match rustExternCrateString /".*"\_s*as/ contained nextgroup=rustIdentifier skipwhite transparent skipempty contains=rustString,rustOperator
+syn keyword rustObsoleteExternMod mod contained nextgroup=rustIdentifier skipwhite skipempty
+
+syn match rustIdentifier contains=rustIdentifierPrime "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained
+syn match rustFuncName "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained
+
+syn region rustBoxPlacement matchgroup=rustBoxPlacementParens start="(" end=")" contains=TOP contained
+" Ideally we'd have syntax rules set up to match arbitrary expressions. Since
+" we don't, we'll just define temporary contained rules to handle balancing
+" delimiters.
+syn region rustBoxPlacementBalance start="(" end=")" containedin=rustBoxPlacement transparent
+syn region rustBoxPlacementBalance start="\[" end="\]" containedin=rustBoxPlacement transparent
+" {} are handled by rustFoldBraces
+
+syn region rustMacroRepeat matchgroup=rustMacroRepeatDelimiters start="$(" end=")" contains=TOP nextgroup=rustMacroRepeatCount
+syn match rustMacroRepeatCount ".\?[*+]" contained
+syn match rustMacroVariable "$\w\+"
+
+" Reserved (but not yet used) keywords {{{2
+syn keyword rustReservedKeyword alignof become do offsetof priv pure sizeof typeof unsized yield abstract virtual final override macro
+
+" Built-in types {{{2
+syn keyword rustType isize usize char bool u8 u16 u32 u64 u128 f32
+syn keyword rustType f64 i8 i16 i32 i64 i128 str Self
+
+" Things from the libstd v1 prelude (src/libstd/prelude/v1.rs) {{{2
+" This section is just straight transformation of the contents of the prelude,
+" to make it easy to update.
+
+" Reexported core operators {{{3
+syn keyword rustTrait Copy Send Sized Sync
+syn keyword rustTrait Drop Fn FnMut FnOnce
+
+" Reexported functions {{{3
+" Thereโ€™s no point in highlighting these; when one writes drop( or drop::< it
+" gets the same highlighting anyway, and if someone writes `let drop = โ€ฆ;` we
+" donโ€™t really want *that* drop to be highlighted.
+"syn keyword rustFunction drop
+
+" Reexported types and traits {{{3
+syn keyword rustTrait Box
+syn keyword rustTrait ToOwned
+syn keyword rustTrait Clone
+syn keyword rustTrait PartialEq PartialOrd Eq Ord
+syn keyword rustTrait AsRef AsMut Into From
+syn keyword rustTrait Default
+syn keyword rustTrait Iterator Extend IntoIterator
+syn keyword rustTrait DoubleEndedIterator ExactSizeIterator
+syn keyword rustEnum Option
+syn keyword rustEnumVariant Some None
+syn keyword rustEnum Result
+syn keyword rustEnumVariant Ok Err
+syn keyword rustTrait SliceConcatExt
+syn keyword rustTrait String ToString
+syn keyword rustTrait Vec
+
+" Other syntax {{{2
+syn keyword rustSelf self
+syn keyword rustBoolean true false
+
+" If foo::bar changes to foo.bar, change this ("::" to "\.").
+" If foo::bar changes to Foo::bar, change this (first "\w" to "\u").
+syn match rustModPath "\w\(\w\)*::[^<]"he=e-3,me=e-3
+syn match rustModPathSep "::"
+
+syn match rustFuncCall "\w\(\w\)*("he=e-1,me=e-1
+syn match rustFuncCall "\w\(\w\)*::<"he=e-3,me=e-3 " foo::<T>();
+
+" This is merely a convention; note also the use of [A-Z], restricting it to
+" latin identifiers rather than the full Unicode uppercase. I have not used
+" [:upper:] as it depends upon 'noignorecase'
+"syn match rustCapsIdent display "[A-Z]\w\(\w\)*"
+
+syn match rustOperator display "\%(+\|-\|/\|*\|=\|\^\|&\||\|!\|>\|<\|%\)=\?"
+" This one isn't *quite* right, as we could have binary-& with a reference
+syn match rustSigil display /&\s\+[&~@*][^)= \t\r\n]/he=e-1,me=e-1
+syn match rustSigil display /[&~@*][^)= \t\r\n]/he=e-1,me=e-1
+" This isn't actually correct; a closure with no arguments can be `|| { }`.
+" Last, because the & in && isn't a sigil
+syn match rustOperator display "&&\|||"
+" This is rustArrowCharacter rather than rustArrow for the sake of matchparen,
+" so it skips the ->; see http://stackoverflow.com/a/30309949 for details.
+syn match rustArrowCharacter display "->"
+syn match rustQuestionMark display "?\([a-zA-Z]\+\)\@!"
+
+syn match rustMacro '\w\(\w\)*!' contains=rustAssert,rustPanic
+syn match rustMacro '#\w\(\w\)*' contains=rustAssert,rustPanic
+
+syn match rustEscapeError display contained /\\./
+syn match rustEscape display contained /\\\([nrt0\\'"]\|x\x\{2}\)/
+syn match rustEscapeUnicode display contained /\\u{\x\{1,6}}/
+syn match rustStringContinuation display contained /\\\n\s*/
+syn region rustString start=+b"+ skip=+\\\\\|\\"+ end=+"+ contains=rustEscape,rustEscapeError,rustStringContinuation
+syn region rustString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=rustEscape,rustEscapeUnicode,rustEscapeError,rustStringContinuation,@Spell
+syn region rustString start='b\?r\z(#*\)"' end='"\z1' contains=@Spell
+
+syn region rustAttribute start="#!\?\[" end="\]" contains=rustString,rustDerive,rustCommentLine,rustCommentBlock,rustCommentLineDocError,rustCommentBlockDocError
+syn region rustDerive start="derive(" end=")" contained contains=rustDeriveTrait
+" This list comes from src/libsyntax/ext/deriving/mod.rs
+" Some are deprecated (Encodable, Decodable) or to be removed after a new snapshot (Show).
+syn keyword rustDeriveTrait contained Clone Hash RustcEncodable RustcDecodable Encodable Decodable PartialEq Eq PartialOrd Ord Rand Show Debug Default FromPrimitive Send Sync Copy
+
+" Number literals
+syn match rustDecNumber display "\<[0-9][0-9_]*\%([iu]\%(size\|8\|16\|32\|64\|128\)\)\="
+syn match rustHexNumber display "\<0x[a-fA-F0-9_]\+\%([iu]\%(size\|8\|16\|32\|64\|128\)\)\="
+syn match rustOctNumber display "\<0o[0-7_]\+\%([iu]\%(size\|8\|16\|32\|64\|128\)\)\="
+syn match rustBinNumber display "\<0b[01_]\+\%([iu]\%(size\|8\|16\|32\|64\|128\)\)\="
+
+" Special case for numbers of the form "1." which are float literals, unless followed by
+" an identifier, which makes them integer literals with a method call or field access,
+" or by another ".", which makes them integer literals followed by the ".." token.
+" (This must go first so the others take precedence.)
+syn match rustFloat display "\<[0-9][0-9_]*\.\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\|\.\)\@!"
+" To mark a number as a normal float, it must have at least one of the three things integral values don't have:
+" a decimal point and more numbers; an exponent; and a type suffix.
+syn match rustFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\%([eE][+-]\=[0-9_]\+\)\=\(f32\|f64\)\="
+syn match rustFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\=\%([eE][+-]\=[0-9_]\+\)\(f32\|f64\)\="
+syn match rustFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\=\%([eE][+-]\=[0-9_]\+\)\=\(f32\|f64\)"
+
+" For the benefit of delimitMate
+syn region rustLifetimeCandidate display start=/&'\%(\([^'\\]\|\\\(['nrt0\\\"]\|x\x\{2}\|u{\x\{1,6}}\)\)'\)\@!/ end=/[[:cntrl:][:space:][:punct:]]\@=\|$/ contains=rustSigil,rustLifetime
+syn region rustGenericRegion display start=/<\%('\|[^[cntrl:][:space:][:punct:]]\)\@=')\S\@=/ end=/>/ contains=rustGenericLifetimeCandidate
+syn region rustGenericLifetimeCandidate display start=/\%(<\|,\s*\)\@<='/ end=/[[:cntrl:][:space:][:punct:]]\@=\|$/ contains=rustSigil,rustLifetime
+
+"rustLifetime must appear before rustCharacter, or chars will get the lifetime highlighting
+syn match rustLifetime display "\'\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*"
+syn match rustLabel display "\'\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*:"
+syn match rustCharacterInvalid display contained /b\?'\zs[\n\r\t']\ze'/
+" The groups negated here add up to 0-255 but nothing else (they do not seem to go beyond ASCII).
+syn match rustCharacterInvalidUnicode display contained /b'\zs[^[:cntrl:][:graph:][:alnum:][:space:]]\ze'/
+syn match rustCharacter /b'\([^\\]\|\\\(.\|x\x\{2}\)\)'/ contains=rustEscape,rustEscapeError,rustCharacterInvalid,rustCharacterInvalidUnicode
+syn match rustCharacter /'\([^\\]\|\\\(.\|x\x\{2}\|u{\x\{1,6}}\)\)'/ contains=rustEscape,rustEscapeUnicode,rustEscapeError,rustCharacterInvalid
+
+syn match rustShebang /\%^#![^[].*/
+syn region rustCommentLine start="//" end="$" contains=rustTodo,@Spell
+syn region rustCommentLineDoc start="//\%(//\@!\|!\)" end="$" contains=rustTodo,@Spell
+syn region rustCommentLineDocError start="//\%(//\@!\|!\)" end="$" contains=rustTodo,@Spell contained
+syn region rustCommentBlock matchgroup=rustCommentBlock start="/\*\%(!\|\*[*/]\@!\)\@!" end="\*/" contains=rustTodo,rustCommentBlockNest,@Spell
+syn region rustCommentBlockDoc matchgroup=rustCommentBlockDoc start="/\*\%(!\|\*[*/]\@!\)" end="\*/" contains=rustTodo,rustCommentBlockDocNest,@Spell
+syn region rustCommentBlockDocError matchgroup=rustCommentBlockDocError start="/\*\%(!\|\*[*/]\@!\)" end="\*/" contains=rustTodo,rustCommentBlockDocNestError,@Spell contained
+syn region rustCommentBlockNest matchgroup=rustCommentBlock start="/\*" end="\*/" contains=rustTodo,rustCommentBlockNest,@Spell contained transparent
+syn region rustCommentBlockDocNest matchgroup=rustCommentBlockDoc start="/\*" end="\*/" contains=rustTodo,rustCommentBlockDocNest,@Spell contained transparent
+syn region rustCommentBlockDocNestError matchgroup=rustCommentBlockDocError start="/\*" end="\*/" contains=rustTodo,rustCommentBlockDocNestError,@Spell contained transparent
+" FIXME: this is a really ugly and not fully correct implementation. Most
+" importantly, a case like ``/* */*`` should have the final ``*`` not being in
+" a comment, but in practice at present it leaves comments open two levels
+" deep. But as long as you stay away from that particular case, I *believe*
+" the highlighting is correct. Due to the way Vim's syntax engine works
+" (greedy for start matches, unlike Rust's tokeniser which is searching for
+" the earliest-starting match, start or end), I believe this cannot be solved.
+" Oh you who would fix it, don't bother with things like duplicating the Block
+" rules and putting ``\*\@<!`` at the start of them; it makes it worse, as
+" then you must deal with cases like ``/*/**/*/``. And don't try making it
+" worse with ``\%(/\@<!\*\)\@<!``, either...
+
+syn keyword rustTodo contained TODO FIXME XXX NB NOTE
+
+" Folding rules {{{2
+" Trivial folding rules to begin with.
+" FIXME: use the AST to make really good folding
+syn region rustFoldBraces start="{" end="}" transparent fold
+
+" Default highlighting {{{1
+hi def link rustDecNumber rustNumber
+hi def link rustHexNumber rustNumber
+hi def link rustOctNumber rustNumber
+hi def link rustBinNumber rustNumber
+hi def link rustIdentifierPrime rustIdentifier
+hi def link rustTrait rustType
+hi def link rustDeriveTrait rustTrait
+
+hi def link rustMacroRepeatCount rustMacroRepeatDelimiters
+hi def link rustMacroRepeatDelimiters Macro
+hi def link rustMacroVariable Define
+hi def link rustSigil StorageClass
+hi def link rustEscape Special
+hi def link rustEscapeUnicode rustEscape
+hi def link rustEscapeError Error
+hi def link rustStringContinuation Special
+hi def link rustString String
+hi def link rustCharacterInvalid Error
+hi def link rustCharacterInvalidUnicode rustCharacterInvalid
+hi def link rustCharacter Character
+hi def link rustNumber Number
+hi def link rustBoolean Boolean
+hi def link rustEnum rustType
+hi def link rustEnumVariant rustConstant
+hi def link rustConstant Constant
+hi def link rustSelf Constant
+hi def link rustFloat Float
+hi def link rustArrowCharacter rustOperator
+hi def link rustOperator Operator
+hi def link rustKeyword Keyword
+hi def link rustTypedef Keyword " More precise is Typedef, but it doesn't feel right for Rust
+hi def link rustStructure Keyword " More precise is Structure
+hi def link rustUnion rustStructure
+hi def link rustPubScopeDelim Delimiter
+hi def link rustPubScopeCrate rustKeyword
+hi def link rustSuper rustKeyword
+hi def link rustReservedKeyword Error
+hi def link rustRepeat Conditional
+hi def link rustConditional Conditional
+hi def link rustIdentifier Identifier
+hi def link rustCapsIdent rustIdentifier
+hi def link rustModPath Include
+hi def link rustModPathSep Delimiter
+hi def link rustFunction Function
+hi def link rustFuncName Function
+hi def link rustFuncCall Function
+hi def link rustShebang Comment
+hi def link rustCommentLine Comment
+hi def link rustCommentLineDoc SpecialComment
+hi def link rustCommentLineDocError Error
+hi def link rustCommentBlock rustCommentLine
+hi def link rustCommentBlockDoc rustCommentLineDoc
+hi def link rustCommentBlockDocError Error
+hi def link rustAssert PreCondit
+hi def link rustPanic PreCondit
+hi def link rustMacro Macro
+hi def link rustType Type
+hi def link rustTodo Todo
+hi def link rustAttribute PreProc
+hi def link rustDerive PreProc
+hi def link rustDefault StorageClass
+hi def link rustStorage StorageClass
+hi def link rustObsoleteStorage Error
+hi def link rustLifetime Special
+hi def link rustLabel Label
+hi def link rustInvalidBareKeyword Error
+hi def link rustExternCrate rustKeyword
+hi def link rustObsoleteExternMod Error
+hi def link rustBoxPlacementParens Delimiter
+hi def link rustQuestionMark Special
+
+" Other Suggestions:
+" hi rustAttribute ctermfg=cyan
+" hi rustDerive ctermfg=cyan
+" hi rustAssert ctermfg=yellow
+" hi rustPanic ctermfg=red
+" hi rustMacro ctermfg=magenta
+
+syn sync minlines=200
+syn sync maxlines=500
+
+let b:current_syntax = "rust"
diff --git a/runtime/syntax/samba.vim b/runtime/syntax/samba.vim
index 93029cc202..5b866cc6d9 100644
--- a/runtime/syntax/samba.vim
+++ b/runtime/syntax/samba.vim
@@ -8,11 +8,8 @@
"
" Don't forget to run your config file through testparm(1)!
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -107,24 +104,14 @@ syn keyword sambaKeyword contained shutdown signing special spnego
syn keyword sambaKeyword contained store unknown unwriteable
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_samba_syn_inits")
- if version < 508
- let did_samba_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink sambaParameter Normal
- HiLink sambaKeyword Type
- HiLink sambaSection Statement
- HiLink sambaMacro PreProc
- HiLink sambaComment Comment
- HiLink sambaContinue Operator
- HiLink sambaBoolean Constant
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+hi def link sambaParameter Normal
+hi def link sambaKeyword Type
+hi def link sambaSection Statement
+hi def link sambaMacro PreProc
+hi def link sambaComment Comment
+hi def link sambaContinue Operator
+hi def link sambaBoolean Constant
let b:current_syntax = "samba"
diff --git a/runtime/syntax/sas.vim b/runtime/syntax/sas.vim
index dc70e1fd90..fad6066737 100644
--- a/runtime/syntax/sas.vim
+++ b/runtime/syntax/sas.vim
@@ -1,279 +1,259 @@
" Vim syntax file
-" Language: SAS
-" Maintainer: James Kidd <james.kidd@covance.com>
-" Last Change: 2012 Apr 20
-" Corrected bug causing some keywords to appear as strings instead
-" 18 Jul 2008 by Paulo Tanimoto <ptanimoto@gmail.com>
-" Fixed comments with * taking multiple lines.
-" Fixed highlighting of macro keywords.
-" Added words to cases that didn't fit anywhere.
-" 02 Jun 2003
-" Added highlighting for additional keywords and such;
-" Attempted to match SAS default syntax colors;
-" Changed syncing so it doesn't lose colors on large blocks;
-" Much thanks to Bob Heckel for knowledgeable tweaking.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
- finish
-endif
-
-syn case ignore
-
-syn region sasString start=+"+ skip=+\\\\\|\\"+ end=+"+
-syn region sasString start=+'+ skip=+\\\\\|\\"+ end=+'+
-
-" Want region from 'cards;' to ';' to be captured (Bob Heckel)
-syn region sasCards start="^\s*CARDS.*" end="^\s*;\s*$"
-syn region sasCards start="^\s*DATALINES.*" end="^\s*;\s*$"
-
-syn match sasNumber "-\=\<\d*\.\=[0-9_]\>"
-
-" Block comment
-syn region sasComment start="/\*" end="\*/" contains=sasTodo
-
-" Ignore misleading //JCL SYNTAX... (Bob Heckel)
-syn region sasComment start="[^/][^/]/\*" end="\*/" contains=sasTodo
-
-" Previous code for comments was written by Bob Heckel
-" Comments with * may take multiple lines (Paulo Tanimoto)
-syn region sasComment start=";\s*\*"hs=s+1 end=";" contains=sasTodo
-
-" Comments with * starting after a semicolon (Paulo Tanimoto)
-syn region sasComment start="^\s*\*" end=";" contains=sasTodo
-
-" This line defines macro variables in code. HiLink at end of file
-" defines the color scheme. Begin region with ampersand and end with
-" any non-word character offset by -1; put ampersand in the skip list
-" just in case it is used to concatenate macro variable values.
-
-" Thanks to ronald h๖llwarth for this fix to an intra-versioning
-" problem with this little feature
+" Language: SAS
+" Maintainer: Zhen-Huan Hu <wildkeny@gmail.com>
+" Original Maintainer: James Kidd <james.kidd@covance.com>
+" Version: 3.0.0
+" Last Change: Aug 26, 2017
+"
+" 2017 Mar 7
+"
+" Upgrade version number to 3.0. Improvements include:
+" - Improve sync speed
+" - Largely enhance precision
+" - Update keywords in the latest SAS (as of Mar 2017)
+" - Add syntaxes for date/time constants
+" - Add syntax for data lines
+" - Add (back) syntax for TODO in comments
+"
+" 2017 Feb 9
+"
+" Add syntax folding
+"
+" 2016 Oct 10
+"
+" Add highlighting for functions
+"
+" 2016 Sep 14
+"
+" Change the implementation of syntaxing
+" macro function names so that macro parameters same
+" as SAS keywords won't be highlighted
+" (Thank Joug Raw for the suggestion)
+" Add section highlighting:
+" - Use /** and **/ to define a section
+" - It functions the same as a comment but
+" with different highlighting
+"
+" 2016 Jun 14
+"
+" Major changes so upgrade version number to 2.0
+" Overhaul the entire script (again). Improvements include:
+" - Higher precision
+" - Faster synchronization
+" - Separate color for control statements
+" - Highlight hash and java objects
+" - Highlight macro variables in double quoted strings
+" - Update all syntaxes based on SAS 9.4
+" - Add complete SAS/GRAPH and SAS/STAT procedure syntaxes
+" - Add Proc TEMPLATE and GTL syntaxes
+" - Add complete DS2 syntaxes
+" - Add basic IML syntaxes
+" - Many other improvements and bug fixes
+" Drop support for VIM version < 600
if version < 600
- syn region sasMacroVar start="\&" skip="[_&]" end="\W"he=e-1
-else " for the older Vim's just do it their way ...
- syn region sasMacroVar start="&" skip="[_&]" end="\W"he=e-1
+ syntax clear
+elseif exists('b:current_syntax')
+ finish
endif
+let s:cpo_save = &cpo
+set cpo&vim
-" I dont think specific PROCs need to be listed if use this line (Bob Heckel).
-syn match sasProc "^\s*PROC \w\+"
-syn keyword sasStep RUN QUIT DATA
-
-
-" Base SAS Procs - version 8.1
-
-syn keyword sasConditional DO ELSE END IF THEN UNTIL WHILE
-
-syn keyword sasStatement ABORT ARRAY ATTRIB BY CALL CARDS CARDS4 CATNAME
-syn keyword sasStatement CONTINUE DATALINES DATALINES4 DELETE DISPLAY
-syn keyword sasStatement DM DROP ENDSAS ERROR FILE FILENAME FOOTNOTE
-syn keyword sasStatement FORMAT GOTO INFILE INFORMAT INPUT KEEP
-syn keyword sasStatement LABEL LEAVE LENGTH LIBNAME LINK LIST LOSTCARD
-syn keyword sasStatement MERGE MISSING MODIFY OPTIONS OUTPUT PAGE
-syn keyword sasStatement PUT REDIRECT REMOVE RENAME REPLACE RETAIN
-syn keyword sasStatement RETURN SELECT SET SKIP STARTSAS STOP TITLE
-syn keyword sasStatement UPDATE WAITSAS WHERE WINDOW X SYSTASK
-
-" Keywords that are used in Proc SQL
-" I left them as statements because SAS's enhanced editor highlights
-" them the same as normal statements used in data steps (Jim Kidd)
-
-syn keyword sasStatement ADD AND ALTER AS CASCADE CHECK CREATE
-syn keyword sasStatement DELETE DESCRIBE DISTINCT DROP FOREIGN
-syn keyword sasStatement FROM GROUP HAVING INDEX INSERT INTO IN
-syn keyword sasStatement KEY LIKE MESSAGE MODIFY MSGTYPE NOT
-syn keyword sasStatement NULL ON OR ORDER PRIMARY REFERENCES
-syn keyword sasStatement RESET RESTRICT SELECT SET TABLE
-syn keyword sasStatement UNIQUE UPDATE VALIDATE VIEW WHERE
-
-" Match declarations have to appear one per line (Paulo Tanimoto)
-syn match sasStatement "FOOTNOTE\d"
-syn match sasStatement "TITLE\d"
-
-" Match declarations have to appear one per line (Paulo Tanimoto)
-syn match sasMacro "%BQUOTE"
-syn match sasMacro "%NRBQUOTE"
-syn match sasMacro "%CMPRES"
-syn match sasMacro "%QCMPRES"
-syn match sasMacro "%COMPSTOR"
-syn match sasMacro "%DATATYP"
-syn match sasMacro "%DISPLAY"
-syn match sasMacro "%DO"
-syn match sasMacro "%ELSE"
-syn match sasMacro "%END"
-syn match sasMacro "%EVAL"
-syn match sasMacro "%GLOBAL"
-syn match sasMacro "%GOTO"
-syn match sasMacro "%IF"
-syn match sasMacro "%INDEX"
-syn match sasMacro "%INPUT"
-syn match sasMacro "%KEYDEF"
-syn match sasMacro "%LABEL"
-syn match sasMacro "%LEFT"
-syn match sasMacro "%LENGTH"
-syn match sasMacro "%LET"
-syn match sasMacro "%LOCAL"
-syn match sasMacro "%LOWCASE"
-syn match sasMacro "%MACRO"
-syn match sasMacro "%MEND"
-syn match sasMacro "%NRBQUOTE"
-syn match sasMacro "%NRQUOTE"
-syn match sasMacro "%NRSTR"
-syn match sasMacro "%PUT"
-syn match sasMacro "%QCMPRES"
-syn match sasMacro "%QLEFT"
-syn match sasMacro "%QLOWCASE"
-syn match sasMacro "%QSCAN"
-syn match sasMacro "%QSUBSTR"
-syn match sasMacro "%QSYSFUNC"
-syn match sasMacro "%QTRIM"
-syn match sasMacro "%QUOTE"
-syn match sasMacro "%QUPCASE"
-syn match sasMacro "%SCAN"
-syn match sasMacro "%STR"
-syn match sasMacro "%SUBSTR"
-syn match sasMacro "%SUPERQ"
-syn match sasMacro "%SYSCALL"
-syn match sasMacro "%SYSEVALF"
-syn match sasMacro "%SYSEXEC"
-syn match sasMacro "%SYSFUNC"
-syn match sasMacro "%SYSGET"
-syn match sasMacro "%SYSLPUT"
-syn match sasMacro "%SYSPROD"
-syn match sasMacro "%SYSRC"
-syn match sasMacro "%SYSRPUT"
-syn match sasMacro "%THEN"
-syn match sasMacro "%TO"
-syn match sasMacro "%TRIM"
-syn match sasMacro "%UNQUOTE"
-syn match sasMacro "%UNTIL"
-syn match sasMacro "%UPCASE"
-syn match sasMacro "%VERIFY"
-syn match sasMacro "%WHILE"
-syn match sasMacro "%WINDOW"
-
-" SAS Functions
-
-syn keyword sasFunction ABS ADDR AIRY ARCOS ARSIN ATAN ATTRC ATTRN
-syn keyword sasFunction BAND BETAINV BLSHIFT BNOT BOR BRSHIFT BXOR
-syn keyword sasFunction BYTE CDF CEIL CEXIST CINV CLOSE CNONCT COLLATE
-syn keyword sasFunction COMPBL COMPOUND COMPRESS COS COSH CSS CUROBS
-syn keyword sasFunction CV DACCDB DACCDBSL DACCSL DACCSYD DACCTAB
-syn keyword sasFunction DAIRY DATE DATEJUL DATEPART DATETIME DAY
-syn keyword sasFunction DCLOSE DEPDB DEPDBSL DEPDBSL DEPSL DEPSL
-syn keyword sasFunction DEPSYD DEPSYD DEPTAB DEPTAB DEQUOTE DHMS
-syn keyword sasFunction DIF DIGAMMA DIM DINFO DNUM DOPEN DOPTNAME
-syn keyword sasFunction DOPTNUM DREAD DROPNOTE DSNAME ERF ERFC EXIST
-syn keyword sasFunction EXP FAPPEND FCLOSE FCOL FDELETE FETCH FETCHOBS
-syn keyword sasFunction FEXIST FGET FILEEXIST FILENAME FILEREF FINFO
-syn keyword sasFunction FINV FIPNAME FIPNAMEL FIPSTATE FLOOR FNONCT
-syn keyword sasFunction FNOTE FOPEN FOPTNAME FOPTNUM FPOINT FPOS
-syn keyword sasFunction FPUT FREAD FREWIND FRLEN FSEP FUZZ FWRITE
-syn keyword sasFunction GAMINV GAMMA GETOPTION GETVARC GETVARN HBOUND
-syn keyword sasFunction HMS HOSTHELP HOUR IBESSEL INDEX INDEXC
-syn keyword sasFunction INDEXW INPUT INPUTC INPUTN INT INTCK INTNX
-syn keyword sasFunction INTRR IRR JBESSEL JULDATE KURTOSIS LAG LBOUND
-syn keyword sasFunction LEFT LENGTH LGAMMA LIBNAME LIBREF LOG LOG10
-syn keyword sasFunction LOG2 LOGPDF LOGPMF LOGSDF LOWCASE MAX MDY
-syn keyword sasFunction MEAN MIN MINUTE MOD MONTH MOPEN MORT N
-syn keyword sasFunction NETPV NMISS NORMAL NOTE NPV OPEN ORDINAL
-syn keyword sasFunction PATHNAME PDF PEEK PEEKC PMF POINT POISSON POKE
-syn keyword sasFunction PROBBETA PROBBNML PROBCHI PROBF PROBGAM
-syn keyword sasFunction PROBHYPR PROBIT PROBNEGB PROBNORM PROBT PUT
-syn keyword sasFunction PUTC PUTN QTR QUOTE RANBIN RANCAU RANEXP
-syn keyword sasFunction RANGAM RANGE RANK RANNOR RANPOI RANTBL RANTRI
-syn keyword sasFunction RANUNI REPEAT RESOLVE REVERSE REWIND RIGHT
-syn keyword sasFunction ROUND SAVING SCAN SDF SECOND SIGN SIN SINH
-syn keyword sasFunction SKEWNESS SOUNDEX SPEDIS SQRT STD STDERR STFIPS
-syn keyword sasFunction STNAME STNAMEL SUBSTR SUM SYMGET SYSGET SYSMSG
-syn keyword sasFunction SYSPROD SYSRC SYSTEM TAN TANH TIME TIMEPART
-syn keyword sasFunction TINV TNONCT TODAY TRANSLATE TRANWRD TRIGAMMA
-syn keyword sasFunction TRIM TRIMN TRUNC UNIFORM UPCASE USS VAR
-syn keyword sasFunction VARFMT VARINFMT VARLABEL VARLEN VARNAME
-syn keyword sasFunction VARNUM VARRAY VARRAYX VARTYPE VERIFY VFORMAT
-syn keyword sasFunction VFORMATD VFORMATDX VFORMATN VFORMATNX VFORMATW
-syn keyword sasFunction VFORMATWX VFORMATX VINARRAY VINARRAYX VINFORMAT
-syn keyword sasFunction VINFORMATD VINFORMATDX VINFORMATN VINFORMATNX
-syn keyword sasFunction VINFORMATW VINFORMATWX VINFORMATX VLABEL
-syn keyword sasFunction VLABELX VLENGTH VLENGTHX VNAME VNAMEX VTYPE
-syn keyword sasFunction VTYPEX WEEKDAY YEAR YYQ ZIPFIPS ZIPNAME ZIPNAMEL
-syn keyword sasFunction ZIPSTATE
-
-" Handy settings for using vim with log files
-syn keyword sasLogMsg NOTE
-syn keyword sasWarnMsg WARNING
-syn keyword sasErrMsg ERROR
-
-" Always contained in a comment (Bob Heckel)
-syn keyword sasTodo TODO TBD FIXME contained
-
-" These don't fit anywhere else (Bob Heckel).
-" Added others that were missing.
-syn keyword sasUnderscore _ALL_ _AUTOMATIC_ _CHARACTER_ _INFILE_ _N_ _NAME_ _NULL_ _NUMERIC_ _USER_ _WEBOUT_
-
-" End of SAS Functions
-
-" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-
-if version >= 508 || !exists("did_sas_syntax_inits")
- if version < 508
- let did_sas_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " Default sas enhanced editor color syntax
- hi sComment term=bold cterm=NONE ctermfg=Green ctermbg=Black gui=NONE guifg=DarkGreen guibg=White
- hi sCard term=bold cterm=NONE ctermfg=Black ctermbg=Yellow gui=NONE guifg=Black guibg=LightYellow
- hi sDate_Time term=NONE cterm=bold ctermfg=Green ctermbg=Black gui=bold guifg=SeaGreen guibg=White
- hi sKeyword term=NONE cterm=NONE ctermfg=Blue ctermbg=Black gui=NONE guifg=Blue guibg=White
- hi sFmtInfmt term=NONE cterm=NONE ctermfg=LightGreen ctermbg=Black gui=NONE guifg=SeaGreen guibg=White
- hi sString term=NONE cterm=NONE ctermfg=Magenta ctermbg=Black gui=NONE guifg=Purple guibg=White
- hi sText term=NONE cterm=NONE ctermfg=White ctermbg=Black gui=bold guifg=Black guibg=White
- hi sNumber term=NONE cterm=bold ctermfg=Green ctermbg=Black gui=bold guifg=SeaGreen guibg=White
- hi sProc term=NONE cterm=bold ctermfg=Blue ctermbg=Black gui=bold guifg=Navy guibg=White
- hi sSection term=NONE cterm=bold ctermfg=Blue ctermbg=Black gui=bold guifg=Navy guibg=White
- hi mDefine term=NONE cterm=bold ctermfg=White ctermbg=Black gui=bold guifg=Black guibg=White
- hi mKeyword term=NONE cterm=NONE ctermfg=Blue ctermbg=Black gui=NONE guifg=Blue guibg=White
- hi mReference term=NONE cterm=bold ctermfg=White ctermbg=Black gui=bold guifg=Blue guibg=White
- hi mSection term=NONE cterm=NONE ctermfg=Blue ctermbg=Black gui=bold guifg=Navy guibg=White
- hi mText term=NONE cterm=NONE ctermfg=White ctermbg=Black gui=bold guifg=Black guibg=White
-
-" Colors that closely match SAS log colors for default color scheme
- hi lError term=NONE cterm=NONE ctermfg=Red ctermbg=Black gui=none guifg=Red guibg=White
- hi lWarning term=NONE cterm=NONE ctermfg=Green ctermbg=Black gui=none guifg=Green guibg=White
- hi lNote term=NONE cterm=NONE ctermfg=Cyan ctermbg=Black gui=none guifg=Blue guibg=White
-
-
- " Special hilighting for the SAS proc section
+syn case ignore
- HiLink sasComment sComment
- HiLink sasConditional sKeyword
- HiLink sasStep sSection
- HiLink sasFunction sKeyword
- HiLink sasMacro mKeyword
- HiLink sasMacroVar NonText
- HiLink sasNumber sNumber
- HiLink sasStatement sKeyword
- HiLink sasString sString
- HiLink sasProc sProc
- " (Bob Heckel)
- HiLink sasTodo Todo
- HiLink sasErrMsg lError
- HiLink sasWarnMsg lWarning
- HiLink sasLogMsg lNote
- HiLink sasCards sCard
- " (Bob Heckel)
- HiLink sasUnderscore PreProc
- delcommand HiLink
-endif
+" Basic SAS syntaxes
+syn keyword sasOperator and eq ge gt in le lt ne not of or
+syn keyword sasReserved _all_ _automatic_ _char_ _character_ _data_ _infile_ _last_ _n_ _name_ _null_ _num_ _numeric_ _temporary_ _user_ _webout_
+" Strings
+syn region sasString start=+'+ skip=+''+ end=+'+ contains=@Spell
+syn region sasString start=+"+ skip=+""+ end=+"+ contains=sasMacroVariable,@Spell
+" Constants
+syn match sasNumber /\v<\d+%(\.\d+)=%(>|e[\-+]=\d+>)/ display
+syn match sasDateTime /\v(['"])\d{2}%(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d{2}%(\d{2})=:\d{2}:\d{2}%(:\d{2})=%(am|pm)\1dt>/ display
+syn match sasDateTime /\v(['"])\d{2}%(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d{2}%(\d{2})=\1d>/ display
+syn match sasDateTime /\v(['"])\d{2}:\d{2}%(:\d{2})=%(am|pm)\1t>/ display
+" Comments
+syn keyword sasTodo todo tbd fixme contained
+syn region sasComment start='/\*' end='\*/' contains=sasTodo
+syn region sasComment start='\v%(^|;)\s*\zs\%=\*' end=';'me=s-1 contains=sasTodo
+syn region sasSectLbl matchgroup=sasSectLblEnds start='/\*\*\s*' end='\s*\*\*/' concealends
+" Macros
+syn match sasMacroVariable '\v\&+\w+%(\.\w+)=' display
+syn match sasMacroReserved '\v\%%(abort|by|copy|display|do|else|end|global|goto|if|include|input|let|list|local|macro|mend|put|return|run|symdel|syscall|sysexec|syslput|sysrput|then|to|until|window|while)>' display
+syn region sasMacroFunction matchgroup=sasMacroFunctionName start='\v\%\w+\ze\(' end=')'he=s-1 contains=@sasBasicSyntax,sasMacroFunction
+syn region sasMacroFunction matchgroup=sasMacroFunctionName start='\v\%q=sysfunc\ze\(' end=')'he=s-1 contains=@sasBasicSyntax,sasMacroFunction,sasDataStepFunction
+" Syntax cluster for basic SAS syntaxes
+syn cluster sasBasicSyntax contains=sasOperator,sasReserved,sasNumber,sasDateTime,sasString,sasComment,sasMacroReserved,sasMacroFunction,sasMacroVariable,sasSectLbl
+
+" Formats
+syn match sasFormat '\v\$\w+\.' display contained
+syn match sasFormat '\v<\w+\.%(\d+>)=' display contained
+syn region sasFormatContext start='.' end=';'me=s-1 contained contains=@sasBasicSyntax,sasFormat
+
+" Define global statements that can be accessed out of data step or procedures
+syn keyword sasGlobalStatementKeyword catname dm endsas filename footnote footnote1 footnote2 footnote3 footnote4 footnote5 footnote6 footnote7 footnote8 footnote9 footnote10 missing libname lock ods options page quit resetline run sasfile skip sysecho title title1 title2 title3 title4 title5 title6 title7 title8 title9 title10 contained
+syn keyword sasGlobalStatementODSKeyword chtml csvall docbook document escapechar epub epub2 epub3 exclude excel graphics html html3 html5 htmlcss imode listing markup output package path pcl pdf preferences phtml powerpoint printer proclabel proctitle ps results rtf select show tagsets trace usegopt verify wml contained
+syn match sasGlobalStatement '\v%(^|;)\s*\zs\h\w*>' display transparent contains=sasGlobalStatementKeyword
+syn match sasGlobalStatement '\v%(^|;)\s*\zsods>' display transparent contains=sasGlobalStatementKeyword nextgroup=sasGlobalStatementODSKeyword skipwhite skipnl skipempty
+
+" Data step statements, 9.4
+syn keyword sasDataStepFunctionName abs addr addrlong airy allcomb allperm anyalnum anyalpha anycntrl anydigit anyfirst anygraph anylower anyname anyprint anypunct anyspace anyupper anyxdigit arcos arcosh arsin arsinh artanh atan atan2 attrc attrn band beta betainv blackclprc blackptprc blkshclprc blkshptprc blshift bnot bor brshift bxor byte cat catq cats catt catx cdf ceil ceilz cexist char choosec choosen cinv close cmiss cnonct coalesce coalescec collate comb compare compbl compfuzz compged complev compound compress constant convx convxp cos cosh cot count countc countw csc css cumipmt cumprinc curobs cv daccdb daccdbsl daccsl daccsyd dacctab dairy datdif date datejul datepart datetime day dclose dcreate depdb depdbsl depsl depsyd deptab dequote deviance dhms dif digamma dim dinfo divide dnum dopen doptname doptnum dosubl dread dropnote dsname dsncatlgd dur durp effrate envlen erf erfc euclid exist exp fact fappend fclose fcol fcopy fdelete fetch fetchobs fexist fget fileexist filename fileref finance find findc findw finfo finv fipname fipnamel fipstate first floor floorz fmtinfo fnonct fnote fopen foptname foptnum fpoint fpos fput fread frewind frlen fsep fuzz fwrite gaminv gamma garkhclprc garkhptprc gcd geodist geomean geomeanz getoption getvarc getvarn graycode harmean harmeanz hbound hms holiday holidayck holidaycount holidayname holidaynx holidayny holidaytest hour htmldecode htmlencode ibessel ifc ifn index indexc indexw input inputc inputn int intcindex intck intcycle intfit intfmt intget intindex intnx intrr intseas intshift inttest intz iorcmsg ipmt iqr irr jbessel juldate juldate7 kurtosis lag largest lbound lcm lcomb left length lengthc lengthm lengthn lexcomb lexcombi lexperk lexperm lfact lgamma libname libref log log1px log10 log2 logbeta logcdf logistic logpdf logsdf lowcase lperm lpnorm mad margrclprc margrptprc max md5 mdy mean median min minute missing mod modexist module modulec modulen modz month mopen mort msplint mvalid contained
+syn keyword sasDataStepFunctionName n netpv nliteral nmiss nomrate normal notalnum notalpha notcntrl notdigit note notfirst notgraph notlower notname notprint notpunct notspace notupper notxdigit npv nvalid nwkdom open ordinal pathname pctl pdf peek peekc peekclong peeklong perm pmt point poisson ppmt probbeta probbnml probbnrm probchi probf probgam probhypr probit probmc probnegb probnorm probt propcase prxchange prxmatch prxparen prxparse prxposn ptrlongadd put putc putn pvp qtr quantile quote ranbin rancau rand ranexp rangam range rank rannor ranpoi rantbl rantri ranuni rename repeat resolve reverse rewind right rms round rounde roundz saving savings scan sdf sec second sha256 sha256hex sha256hmachex sign sin sinh skewness sleep smallest soapweb soapwebmeta soapwipservice soapwipsrs soapws soapwsmeta soundex spedis sqrt squantile std stderr stfips stname stnamel strip subpad substr substrn sum sumabs symexist symget symglobl symlocal sysexist sysget sysmsg sysparm sysprocessid sysprocessname sysprod sysrc system tan tanh time timepart timevalue tinv tnonct today translate transtrn tranwrd trigamma trim trimn trunc tso typeof tzoneid tzonename tzoneoff tzones2u tzoneu2s uniform upcase urldecode urlencode uss uuidgen var varfmt varinfmt varlabel varlen varname varnum varray varrayx vartype verify vformat vformatd vformatdx vformatn vformatnx vformatw vformatwx vformatx vinarray vinarrayx vinformat vinformatd vinformatdx vinformatn vinformatnx vinformatw vinformatwx vinformatx vlabel vlabelx vlength vlengthx vname vnamex vtype vtypex vvalue vvaluex week weekday whichc whichn wto year yieldp yrdif yyq zipcity zipcitydistance zipfips zipname zipnamel zipstate contained
+syn keyword sasDataStepCallRoutineName allcomb allcombi allperm cats catt catx compcost execute graycode is8601_convert label lexcomb lexcombi lexperk lexperm logistic missing module poke pokelong prxchange prxdebug prxfree prxnext prxposn prxsubstr ranbin rancau rancomb ranexp rangam rannor ranperk ranperm ranpoi rantbl rantri ranuni scan set sleep softmax sortc sortn stdize streaminit symput symputx system tanh tso vname vnext wto contained
+syn region sasDataStepFunctionContext start='(' end=')' contained contains=@sasBasicSyntax,sasDataStepFunction
+syn region sasDataStepFunctionFormatContext start='(' end=')' contained contains=@sasBasicSyntax,sasDataStepFunction,sasFormat
+syn match sasDataStepFunction '\v<\w+\ze\(' contained contains=sasDataStepFunctionName,sasDataStepCallRoutineName nextgroup=sasDataStepFunctionContext
+syn match sasDataStepFunction '\v%(input|put)\ze\(' contained contains=sasDataStepFunctionName nextgroup=sasDataStepFunctionFormatContext
+syn keyword sasDataStepHashMethodName add check clear definedata definedone definekey delete do_over equals find find_next find_prev first has_next has_prev last next output prev ref remove removedup replace replacedup reset_dup setcur sum sumdup contained
+syn region sasDataStepHashMethodContext start='(' end=')' contained contains=@sasBasicSyntax,sasDataStepFunction
+syn match sasDataStepHashMethod '\v\.\w+\ze\(' contained contains=sasDataStepHashMethodName nextgroup=sasDataStepHashMethodContext
+syn keyword sasDataStepHashAttributeName item_size num_items contained
+syn match sasDataStepHashAttribute '\v\.\w+>\ze\_[^(]' display contained contains=sasDataStepHashAttributeName
+syn keyword sasDataStepControl continue do end go goto if leave link otherwise over return select to until when while contained
+syn keyword sasDataStepControl else then contained nextgroup=sasDataStepStatementKeyword skipwhite skipnl skipempty
+syn keyword sasDataStepHashOperator _new_ contained
+syn keyword sasDataStepStatementKeyword abort array attrib by call cards cards4 datalines datalines4 dcl declare delete describe display drop error execute file format infile informat input keep label length lines lines4 list lostcard merge modify output put putlog redirect remove rename replace retain set stop update where window contained
+syn keyword sasDataStepStatementHashKeyword hash hiter javaobj contained
+syn match sasDataStepStatement '\v%(^|;)\s*\zs\h\w*>' display contained contains=sasDataStepStatementKeyword,sasGlobalStatementKeyword
+syn match sasDataStepStatement '\v%(^|;)\s*\zs%(dcl|declare)>' display contained contains=sasDataStepStatementKeyword nextgroup=sasDataStepStatementHashKeyword skipwhite skipnl skipempty
+syn match sasDataStepStatement '\v%(^|;)\s*\zsods>' display contained contains=sasGlobalStatementKeyword nextgroup=sasGlobalStatementODSKeyword skipwhite skipnl skipempty
+syn match sasDataStepStatement '\v%(^|;)\s*\zs%(format|informat|input|put)>' display contained contains=sasDataStepStatementKeyword nextgroup=sasFormatContext skipwhite skipnl skipempty
+syn match sasDataStepStatement '\v%(^|;)\s*\zs%(cards|datalines|lines)4=\s*;' display contained contains=sasDataStepStatementKeyword nextgroup=sasDataLine skipwhite skipnl skipempty
+syn region sasDataLine start='^' end='^\s*;'me=s-1 contained
+syn region sasDataStep matchgroup=sasSectionKeyword start='\v%(^|;)\s*\zsdata>' end='\v%(^|;)\s*%(run|data|proc|endsas)>'me=s-1 fold contains=@sasBasicSyntax,@sasDataStepSyntax
+syn cluster sasDataStepSyntax contains=sasDataStepFunction,sasDataStepHashOperator,sasDataStepHashAttribute,sasDataStepHashMethod,sasDataStepControl,sasDataStepStatement
+
+" Procedures, base SAS, 9.4
+syn keyword sasProcStatementKeyword abort age append array attrib audit block break by calid cdfplot change checkbox class classlev column compute contents copy create datarow dbencoding define delete deletefunc deletesubr delimiter device dialog dur endcomp exact exchange exclude explore fin fmtlib fontfile fontpath format formats freq function getnames guessingrows hbar hdfs histogram holidur holifin holistart holivar id idlabel informat inset invalue item key keylabel keyword label line link listfunc listsubr mapmiss mapreduce mean menu messages meta modify opentype outargs outdur outfin output outstart pageby partial picture pie pig plot ppplot printer probplot profile prompter qqplot radiobox ranks rbreak rbutton rebuild record remove rename repair report roptions save select selection separator source star start statistics struct submenu subroutine sum sumby table tables test text trantab truetype type1 types value var vbar ways weight where with write contained
+syn match sasProcStatement '\v%(^|;)\s*\zs\h\w*>' display contained contains=sasProcStatementKeyword,sasGlobalStatementKeyword
+syn match sasProcStatement '\v%(^|;)\s*\zsods>' display contained contains=sasGlobalStatementKeyword nextgroup=sasGlobalStatementODSKeyword skipwhite skipnl skipempty
+syn match sasProcStatement '\v%(^|;)\s*\zs%(format|informat)>' display contained contains=sasProcStatementKeyword nextgroup=sasFormatContext skipwhite skipnl skipempty
+syn region sasProc matchgroup=sasSectionKeyword start='\v%(^|;)\s*\zsproc%(\s+\h\w*)=>' end='\v%(^|;)\s*%(run|data|proc|endsas)>'me=s-1 fold contains=@sasBasicSyntax,sasDataStepFunction,sasProcStatement
+syn region sasProc matchgroup=sasSectionKeyword start='\v%(^|;)\s*\zsproc\s+%(catalog|chart|datasets|document|plot)>' end='\v%(^|;)\s*%(quit|data|proc|endsas)>'me=s-1 fold contains=@sasBasicSyntax,sasDataStepFunction,sasProcStatement
+
+" Procedures, SAS/GRAPH, 9.4
+syn keyword sasGraphProcStatementKeyword add area axis bar block bubble2 byline cc ccopy cdef cdelete chart cmap choro copy delete device dial donut exclude flow format fs goptions gout grid group hbar hbar3d hbullet hslider htrafficlight id igout label legend list modify move nobyline note pattern pie pie3d plot plot2 preview prism quit rename replay select scatter speedometer star surface symbol tc tcopy tdef tdelete template tile toggle treplay vbar vbar3d vtrafficlight vbullet vslider where contained
+syn match sasGraphProcStatement '\v%(^|;)\s*\zs\h\w*>' display contained contains=sasGraphProcStatementKeyword,sasGlobalStatementKeyword
+syn match sasGraphProcStatement '\v%(^|;)\s*\zsformat>' display contained contains=sasGraphProcStatementKeyword nextgroup=sasFormatContext skipwhite skipnl skipempty
+syn region sasGraphProc matchgroup=sasSectionKeyword start='\v%(^|;)\s*\zsproc\s+%(g3d|g3grid|ganno|gcontour|gdevice|geocode|gfont|ginside|goptions|gproject|greduce|gremove|mapimport)>' end='\v%(^|;)\s*%(run|data|proc|endsas)>'me=s-1 fold contains=@sasBasicSyntax,sasDataStepFunction,sasGraphProcStatement
+syn region sasGraphProc matchgroup=sasSectionKeyword start='\v%(^|;)\s*\zsproc\s+%(gareabar|gbarline|gchart|gkpi|gmap|gplot|gradar|greplay|gslide|gtile)>' end='\v%(^|;)\s*%(quit|data|proc|endsas)>'me=s-1 fold contains=@sasBasicSyntax,sasDataStepFunction,sasGraphProcStatement
+
+" Procedures, SAS/STAT, 14.1
+syn keyword sasAnalyticalProcStatementKeyword absorb add array assess baseline bayes beginnodata bivar bootstrap bounds by cdfplot cells class cluster code compute condition contrast control coordinates copy cosan cov covtest coxreg der design determ deviance direct directions domain effect effectplot effpart em endnodata equality estimate exact exactoptions factor factors fcs filter fitindex format freq fwdlink gender grid group grow hazardratio height hyperprior id impjoint inset insetgroup invar invlink ippplot lincon lineqs lismod lmtests location logistic loglin lpredplot lsmeans lsmestimate manova matings matrix mcmc mean means missmodel mnar model modelaverage modeleffects monotone mstruct mtest multreg name nlincon nloptions oddsratio onecorr onesamplefreq onesamplemeans onewayanova outfiles output paired pairedfreq pairedmeans parameters parent parms partial partition path pathdiagram pcov performance plot population poststrata power preddist predict predpplot priors process probmodel profile prune pvar ram random ratio reference refit refmodel renameparm repeated replicate repweights response restore restrict retain reweight ridge rmsstd roc roccontrast rules samplesize samplingunit seed size scale score selection show simtests simulate slice std stderr store strata structeq supplementary table tables test testclass testfreq testfunc testid time transform treatments trend twosamplefreq twosamplemeans towsamplesurvival twosamplewilcoxon uds units univar var variance varnames weight where with zeromodel contained
+syn match sasAnalyticalProcStatement '\v%(^|;)\s*\zs\h\w*>' display contained contains=sasAnalyticalProcStatementKeyword,sasGlobalStatementKeyword
+syn match sasAnalyticalProcStatement '\v%(^|;)\s*\zsods>' display contained contains=sasGlobalStatementKeyword nextgroup=sasGlobalStatementODSKeyword skipwhite skipnl skipempty
+syn match sasAnalyticalProcStatement '\v%(^|;)\s*\zsformat>' display contained contains=sasAnalyticalProcStatementKeyword nextgroup=sasFormatContext skipwhite skipnl skipempty
+syn region sasAnalyticalProc matchgroup=sasSectionKeyword start='\v%(^|;)\s*\zsproc\s+%(aceclus|adaptivereg|bchoice|boxplot|calis|cancorr|candisc|cluster|corresp|discrim|distance|factor|fastclus|fmm|freq|gam|gampl|gee|genmod|glimmix|glmmod|glmpower|glmselect|hpcandisc|hpfmm|hpgenselect|hplmixed|hplogistic|hpmixed|hpnlmod|hppls|hpprincomp|hpquantselect|hpreg|hpsplit|iclifetest|icphreg|inbreed|irt|kde|krige2d|lattice|lifereg|lifetest|loess|logistic|mcmc|mds|mi|mianalyze|mixed|modeclus|multtest|nested|nlin|nlmixed|npar1way|orthoreg|phreg|plm|pls|power|princomp|prinqual|probit|quantlife|quantreg|quantselect|robustreg|rsreg|score|seqdesign|seqtest|sim2d|simnormal|spp|stdize|stdrate|stepdisc|surveyfreq|surveyimpute|surveylogistic|surveymeans|surveyphreg|surveyreg|surveyselect|tpspline|transreg|tree|ttest|varclus|varcomp|variogram)>' end='\v%(^|;)\s*%(run|data|proc|endsas)>'me=s-1 fold contains=@sasBasicSyntax,sasDataStepControl,sasDataStepFunction,sasAnalyticalProcStatement
+syn region sasAnalyticalProc matchgroup=sasSectionKeyword start='\v%(^|;)\s*\zsproc\s+%(anova|arima|catmod|factex|glm|model|optex|plan|reg)>' end='\v%(^|;)\s*%(quit|data|proc|endsas)>'me=s-1 fold contains=@sasBasicSyntax,sasDataStepControl,sasDataStepFunction,sasAnalyticalProcStatement
+
+" Procedures, ODS graphics, 9.4
+syn keyword sasODSGraphicsProcStatementKeyword band block bubble by colaxis compare dattrvar density dot dropline dynamic ellipse ellipseparm format fringe gradlegend hbar hbarbasic hbarparm hbox heatmap heatmapparm highlow histogram hline inset keylegend label lineparm loess matrix needle parent panelby pbspline plot polygon refline reg rowaxis scatter series spline step style styleattrs symbolchar symbolimage text vbar vbarbasic vbarparm vbox vector vline waterfall where xaxis x2axis yaxis y2axis yaxistable contained
+syn match sasODSGraphicsProcStatement '\v%(^|;)\s*\zs\h\w*>' display contained contains=sasODSGraphicsProcStatementKeyword,sasGlobalStatementKeyword
+syn match sasODSGraphicsProcStatement '\v%(^|;)\s*\zsods>' display contained contains=sasGlobalStatementKeyword nextgroup=sasGlobalStatementODSKeyword skipwhite skipnl skipempty
+syn match sasODSGraphicsProcStatement '\v%(^|;)\s*\zsformat>' display contained contains=sasODSGraphicsProcStatementKeyword nextgroup=sasFormatContext skipwhite skipnl skipempty
+syn region sasODSGraphicsProc matchgroup=sasSectionKeyword start='\v%(^|;)\s*\zsproc\s+%(sgdesign|sgpanel|sgplot|sgrender|sgscatter)>' end='\v%(^|;)\s*%(run|data|proc|endsas)>'me=s-1 fold contains=@sasBasicSyntax,sasDataStepFunction,sasODSGraphicsProcStatement
+
+" Proc TEMPLATE, 9.4
+syn keyword sasProcTemplateClause as into
+syn keyword sasProcTemplateStatementKeyword block break cellstyle class close column compute continue define delete delstream do done dynamic edit else end eval flush footer header import iterate link list mvar ndent next nmvar notes open path put putl putlog putq putstream putvars replace set source stop style test text text2 text3 translate trigger unblock unset xdent contained
+syn keyword sasProcTemplateStatementComplexKeyword cellvalue column crosstabs event footer header statgraph style table tagset contained
+syn keyword sasProcTemplateGTLStatementKeyword axislegend axistable bandplot barchart barchartparm begingraph beginpolygon beginpolyline bihistogram3dparm blockplot boxplot boxplotparm bubbleplot continuouslegend contourplotparm dendrogram discretelegend drawarrow drawimage drawline drawoval drawrectangle drawtext dropline ellipse ellipseparm endgraph endinnermargin endlayout endpolygon endpolyline endsidebar entry entryfootnote entrytitle fringeplot heatmap heatmapparm highlowplot histogram histogramparm innermargin layout legenditem legendtextitems linechart lineparm loessplot mergedlegend modelband needleplot pbsplineplot polygonplot referenceline regressionplot scatterplot seriesplot sidebar stepplot surfaceplotparm symbolchar symbolimage textplot vectorplot waterfallchart contained
+syn keyword sasProcTemplateGTLComplexKeyword datalattice datapanel globallegend gridded lattice overlay overlayequated overlay3d region contained
+syn match sasProcTemplateStatement '\v%(^|;)\s*\zs\h\w*>' display contained contains=sasProcTemplateStatementKeyword,sasProcTemplateGTLStatementKeyword,sasGlobalStatementKeyword
+syn match sasProcTemplateStatement '\v%(^|;)\s*\zsdefine>' display contained contains=sasProcTemplateStatementKeyword nextgroup=sasProcTemplateStatementComplexKeyword skipwhite skipnl skipempty
+syn match sasProcTemplateStatement '\v%(^|;)\s*\zslayout>' display contained contains=sasProcTemplateGTLStatementKeyword nextgroup=sasProcTemplateGTLComplexKeyword skipwhite skipnl skipempty
+syn match sasProcTemplateStatement '\v%(^|;)\s*\zsods>' display contained contains=sasGlobalStatementKeyword nextgroup=sasGlobalStatementODSKeyword skipwhite skipnl skipempty
+syn region sasProcTemplate matchgroup=sasSectionKeyword start='\v%(^|;)\s*\zsproc\s+template>' end='\v%(^|;)\s*%(run|data|proc|endsas)>'me=s-1 fold contains=@sasBasicSyntax,sasProcTemplateClause,sasProcTemplateStatement
+
+" Proc SQL, 9.4
+syn keyword sasProcSQLFunctionName avg count css cv freq max mean median min n nmiss prt range std stderr sum sumwgt t uss var contained
+syn region sasProcSQLFunctionContext start='(' end=')' contained contains=@sasBasicSyntax,sasProcSQLFunction
+syn match sasProcSQLFunction '\v<\w+\ze\(' contained contains=sasProcSQLFunctionName,sasDataStepFunctionName nextgroup=sasProcSQLFunctionContext
+syn keyword sasProcSQLClause add asc between by calculated cascade case check connection constraint cross desc distinct drop else end escape except exists foreign from full group having in inner intersect into is join key left libname like modify natural newline notrim null on order outer primary references restrict right separated set then to trimmed union unique user using values when where contained
+syn keyword sasProcSQLClause as contained nextgroup=sasProcSQLStatementKeyword skipwhite skipnl skipempty
+syn keyword sasProcSQLStatementKeyword connect delete disconnect execute insert reset select update validate contained
+syn keyword sasProcSQLStatementComplexKeyword alter create describe drop contained nextgroup=sasProcSQLStatementNextKeyword skipwhite skipnl skipempty
+syn keyword sasProcSQLStatementNextKeyword index table view contained
+syn match sasProcSQLStatement '\v%(^|;)\s*\zs\h\w*>' display contained contains=sasProcSQLStatementKeyword,sasGlobalStatementKeyword
+syn match sasProcSQLStatement '\v%(^|;)\s*\zs%(alter|create|describe|drop)>' display contained contains=sasProcSQLStatementComplexKeyword nextgroup=sasProcSQLStatementNextKeyword skipwhite skipnl skipempty
+syn match sasProcSQLStatement '\v%(^|;)\s*\zsvalidate>' display contained contains=sasProcSQLStatementKeyword nextgroup=sasProcSQLStatementKeyword,sasProcSQLStatementComplexKeyword skipwhite skipnl skipempty
+syn match sasProcSQLStatement '\v%(^|;)\s*\zsods>' display contained contains=sasGlobalStatementKeyword nextgroup=sasGlobalStatementODSKeyword skipwhite skipnl skipempty
+syn region sasProcSQL matchgroup=sasSectionKeyword start='\v%(^|;)\s*\zsproc\s+sql>' end='\v%(^|;)\s*%(quit|data|proc|endsas)>'me=s-1 fold contains=@sasBasicSyntax,sasProcSQLFunction,sasProcSQLClause,sasProcSQLStatement
+
+" SAS/DS2, 9.4
+syn keyword sasDS2FunctionName abs anyalnum anyalpha anycntrl anydigit anyfirst anygraph anylower anyname anyprint anypunct anyspace anyupper anyxdigit arcos arcosh arsin arsinh artanh atan atan2 band beta betainv blackclprc blackptprc blkshclprc blkshptprc blshift bnot bor brshift bxor byte cat cats catt catx ceil ceilz choosec choosen cmp cmpt coalesce coalescec comb compare compbl compfuzz compound compress constant convx convxp cos cosh count countc countw css cumipmt cumprinc cv datdif date datejul datepart datetime day dequote deviance dhms dif digamma dim divide dur durp effrate erf erfc exp fact find findc findw floor floorz fmtinfo fuzz gaminv gamma garkhclprc garkhptprc gcd geodist geomean geomeanz harmean harmeanz hbound hms holiday hour index indexc indexw inputc inputn int intcindex intck intcycle intdt intfit intget intindex intnest intnx intrr intseas intshift inttest intts intz ipmt iqr irr juldate juldate7 kcount kstrcat kstrip kupdate kupdates kurtosis lag largest lbound lcm left length lengthc lengthm lengthn lgamma log logbeta log10 log1px log2 lowcase mad margrclprc margrptprc max md5 mdy mean median min minute missing mod modz month mort n ndims netpv nmiss nomrate notalnum notalpha notcntrl notdigit notfirst notgraph notlower notname notprint notpunct notspace notupper notxdigit npv null nwkdom ordinal pctl perm pmt poisson power ppmt probbeta probbnml probbnrm probchi probdf probf probgam probhypr probit probmc probmed probnegb probnorm probt prxchange prxmatch prxparse prxposn put pvp qtr quote ranbin rancau rand ranexp rangam range rank rannor ranpoi rantbl rantri ranuni repeat reverse right rms round rounde roundz savings scan sec second sha256hex sha256hmachex sign sin sinh skewness sleep smallest sqlexec sqrt std stderr streaminit strip substr substrn sum sumabs tan tanh time timepart timevalue tinv to_date to_double to_time to_timestamp today translate transtrn tranwrd trigamma trim trimn trunc uniform upcase uss uuidgen var verify vformat vinarray vinformat vlabel vlength vname vtype week weekday whichc whichn year yieldp yrdif yyq contained
+syn region sasDS2FunctionContext start='(' end=')' contained contains=@sasBasicSyntax,sasDS2Function
+syn match sasDS2Function '\v<\w+\ze\(' contained contains=sasDS2FunctionName nextgroup=sasDS2FunctionContext
+syn keyword sasDS2Control continue data dcl declare do drop else end enddata endpackage endthread from go goto if leave method otherwise package point return select then thread to until when while contained
+syn keyword sasDS2StatementKeyword array by forward keep merge output put rename retain set stop vararray varlist contained
+syn keyword sasDS2StatementComplexKeyword package thread contained
+syn match sasDS2Statement '\v%(^|;)\s*\zs\h\w*>' display contained contains=sasDS2StatementKeyword,sasGlobalStatementKeyword
+syn match sasDS2Statement '\v%(^|;)\s*\zs%(dcl|declare|drop)>' display contained contains=sasDS2StatementKeyword nextgroup=sasDS2StatementComplexKeyword skipwhite skipnl skipempty
+syn match sasDS2Statement '\v%(^|;)\s*\zsods>' display contained contains=sasGlobalStatementKeyword nextgroup=sasGlobalStatementODSKeyword skipwhite skipnl skipempty
+syn region sasDS2 matchgroup=sasSectionKeyword start='\v%(^|;)\s*\zsproc\s+ds2>' end='\v%(^|;)\s*%(quit|data|proc|endsas)>'me=s-1 fold contains=@sasBasicSyntax,sasDS2Function,sasDS2Control,sasDS2Statement
+
+" SAS/IML, 14.1
+syn keyword sasIMLFunctionName abs all allcomb allperm any apply armasim bin blankstr block branks bspline btran byte char choose col colvec concat contents convexit corr corr2cov countmiss countn countunique cov cov2corr covlag cshape cusum cuprod cv cvexhull datasets design designf det diag dif dimension distance do duration echelon eigval eigvec element exp expmatrix expandgrid fft forward froot full gasetup geomean ginv hadamard half hankel harmean hdir hermite homogen i ifft insert int inv invupdt isempty isskipped j jroot kurtosis lag length loc log logabsdet mad magic mahalanobis max mean median min mod moduleic modulein name ncol ndx2sub nleng norm normal nrow num opscal orpol parentname palette polyroot prod product pv quartile rancomb randdirichlet randfun randmultinomial randmvt randnormal randwishart ranperk ranperm range rank ranktie rates ratio remove repeat root row rowcat rowcatc rowvec rsubstr sample setdif shape shapecol skewness solve sparse splinev spot sqrsym sqrt sqrvech ssq standard std storage sub2ndx substr sum sweep symsqr t toeplitz trace trisolv type uniform union unique uniqueby value var vecdiag vech xmult xsect yield contained
+syn keyword sasIMLCallRoutineName appcort armacov armalik bar box change comport delete eigen execute exportdatasettor exportmatrixtor farmacov farmafit farmalik farmasim fdif gaend gagetmem gagetval gainit gareeval garegen gasetcro gasetmut gasetobj gasetsel gblkvp gblkvpd gclose gdelete gdraw gdrawl geneig ggrid ginclude gopen gpie gpiexy gpoint gpoly gport gportpop gportstk gscale gscript gset gshow gsorth gstart gstop gstrlen gtext gvtext gwindow gxaxis gyaxis heatmapcont heatmapdisc histogram importdatasetfromr importmatrixfromr ipf itsolver kalcvf kalcvs kaldff kaldfs lav lcp lms lp lpsolve lts lupdt marg maxqform mcd milpsolve modulei mve nlpcg nlpdd nlpfdd nlpfea nlphqn nlplm nlpnms nlpnra nlpnrr nlpqn nlpqua nlptr ode odsgraph ortvec pgraf push qntl qr quad queue randgen randseed rdodt rupdt rename rupdt rzlind scatter seq seqscale seqshift seqscale seqshift series solvelin sort sortndx sound spline splinec svd tabulate tpspline tpsplnev tsbaysea tsdecomp tsmlocar tsmlomar tsmulmar tspears tspred tsroot tstvcar tsunimar valset varmacov varmalik varmasim vnormal vtsroot wavft wavget wavift wavprint wavthrsh contained
+syn region sasIMLFunctionContext start='(' end=')' contained contains=@sasBasicSyntax,sasIMLFunction
+syn match sasIMLFunction '\v<\w+\ze\(' contained contains=sasIMLFunctionName,sasDataStepFunction nextgroup=sasIMLFunctionContext
+syn keyword sasIMLControl abort by do else end finish goto if link pause quit resume return run start stop then to until while contained
+syn keyword sasIMLStatementKeyword append call close closefile create delete display edit file find force free index infile input list load mattrib print purge read remove replace reset save setin setout show sort store summary use window contained
+syn match sasIMLStatement '\v%(^|;)\s*\zs\h\w*>' display contained contains=sasIMLStatementKeyword,sasGlobalStatementKeyword
+syn match sasIMLStatement '\v%(^|;)\s*\zsods>' display contained contains=sasGlobalStatementKeyword nextgroup=sasGlobalStatementODSKeyword skipwhite skipnl skipempty
+syn region sasIML matchgroup=sasSectionKeyword start='\v%(^|;)\s*\zsproc\s+iml>' end='\v%(^|;)\s*%(quit|data|proc|endsas)>'me=s-1 fold contains=@sasBasicSyntax,sasIMLFunction,sasIMLControl,sasIMLStatement
+
+" Macro definition
+syn region sasMacro start='\v\%macro>' end='\v\%mend>' fold keepend contains=@sasBasicSyntax,@sasDataStepSyntax,sasDataStep,sasProc,sasODSGraphicsProc,sasGraphProc,sasAnalyticalProc,sasProcTemplate,sasProcSQL,sasDS2,sasIML
+
+" Define default highlighting
+hi def link sasComment Comment
+hi def link sasTodo Delimiter
+hi def link sasSectLbl Title
+hi def link sasSectLblEnds Comment
+hi def link sasNumber Number
+hi def link sasDateTime Constant
+hi def link sasString String
+hi def link sasDataStepControl Keyword
+hi def link sasProcTemplateClause Keyword
+hi def link sasProcSQLClause Keyword
+hi def link sasDS2Control Keyword
+hi def link sasIMLControl Keyword
+hi def link sasOperator Operator
+hi def link sasGlobalStatementKeyword Statement
+hi def link sasGlobalStatementODSKeyword Statement
+hi def link sasSectionKeyword Statement
+hi def link sasDataStepFunctionName Function
+hi def link sasDataStepCallRoutineName Function
+hi def link sasDataStepStatementKeyword Statement
+hi def link sasDataStepStatementHashKeyword Statement
+hi def link sasDataStepHashOperator Operator
+hi def link sasDataStepHashMethodName Function
+hi def link sasDataStepHashAttributeName Identifier
+hi def link sasProcStatementKeyword Statement
+hi def link sasODSGraphicsProcStatementKeyword Statement
+hi def link sasGraphProcStatementKeyword Statement
+hi def link sasAnalyticalProcStatementKeyword Statement
+hi def link sasProcTemplateStatementKeyword Statement
+hi def link sasProcTemplateStatementComplexKeyword Statement
+hi def link sasProcTemplateGTLStatementKeyword Statement
+hi def link sasProcTemplateGTLComplexKeyword Statement
+hi def link sasProcSQLFunctionName Function
+hi def link sasProcSQLStatementKeyword Statement
+hi def link sasProcSQLStatementComplexKeyword Statement
+hi def link sasProcSQLStatementNextKeyword Statement
+hi def link sasDS2FunctionName Function
+hi def link sasDS2StatementKeyword Statement
+hi def link sasIMLFunctionName Function
+hi def link sasIMLCallRoutineName Function
+hi def link sasIMLStatementKeyword Statement
+hi def link sasMacroReserved PreProc
+hi def link sasMacroVariable Define
+hi def link sasMacroFunctionName Define
+hi def link sasDataLine SpecialChar
+hi def link sasFormat SpecialChar
+hi def link sasReserved Special
" Syncronize from beginning to keep large blocks from losing
" syntax coloring while moving through code.
@@ -281,4 +261,5 @@ syn sync fromstart
let b:current_syntax = "sas"
-" vim: ts=8
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/sass.vim b/runtime/syntax/sass.vim
index 2ea0722696..d075c8736e 100644
--- a/runtime/syntax/sass.vim
+++ b/runtime/syntax/sass.vim
@@ -2,7 +2,7 @@
" Language: Sass
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
" Filenames: *.sass
-" Last Change: 2013 May 30
+" Last Change: 2016 Aug 29
if exists("b:current_syntax")
finish
@@ -13,7 +13,7 @@ runtime! syntax/css.vim
syn case ignore
syn cluster sassCssProperties contains=cssFontProp,cssFontDescriptorProp,cssColorProp,cssTextProp,cssBoxProp,cssGeneratedContentProp,cssPagingProp,cssUIProp,cssRenderProp,cssAuralProp,cssTableProp
-syn cluster sassCssAttributes contains=css.*Attr,scssComment,cssValue.*,cssColor,cssURL,sassDefault,cssImportant,cssError,cssStringQ,cssStringQQ,cssFunction,cssUnicodeEscape,cssRenderProp
+syn cluster sassCssAttributes contains=css.*Attr,sassEndOfLineComment,scssComment,cssValue.*,cssColor,cssURL,sassDefault,cssImportant,cssError,cssStringQ,cssStringQQ,cssFunction,cssUnicodeEscape,cssRenderProp
syn region sassDefinition matchgroup=cssBraces start="{" end="}" contains=TOP
@@ -58,6 +58,9 @@ syn match sassAmpersand "&"
" TODO: Attribute namespaces
" TODO: Arithmetic (including strings and concatenation)
+syn region sassMediaQuery matchgroup=sassMedia start="@media" end="[{};]\@=\|$" contains=sassMediaOperators
+syn keyword sassMediaOperators and not only contained
+syn region sassCharset start="@charset" end=";\|$" contains=scssComment,cssStringQ,cssStringQQ,cssURL,cssUnicodeEscape,cssMediaType
syn region sassInclude start="@import" end=";\|$" contains=scssComment,cssStringQ,cssStringQQ,cssURL,cssUnicodeEscape,cssMediaType
syn region sassDebugLine end=";\|$" matchgroup=sassDebug start="@debug\>" contains=@sassCssAttributes,sassVariable,sassFunction
syn region sassWarnLine end=";\|$" matchgroup=sassWarn start="@warn\>" contains=@sassCssAttributes,sassVariable,sassFunction
@@ -67,7 +70,9 @@ syn keyword sassFor from to through in contained
syn keyword sassTodo FIXME NOTE TODO OPTIMIZE XXX contained
syn region sassComment start="^\z(\s*\)//" end="^\%(\z1 \)\@!" contains=sassTodo,@Spell
syn region sassCssComment start="^\z(\s*\)/\*" end="^\%(\z1 \)\@!" contains=sassTodo,@Spell
+syn match sassEndOfLineComment "//.*" contains=sassComment,sassTodo,@Spell
+hi def link sassEndOfLineComment sassComment
hi def link sassCssComment sassComment
hi def link sassComment Comment
hi def link sassDefault cssImportant
@@ -80,6 +85,9 @@ hi def link sassExtend PreProc
hi def link sassFunctionDecl PreProc
hi def link sassReturn PreProc
hi def link sassTodo Todo
+hi def link sassCharset PreProc
+hi def link sassMedia PreProc
+hi def link sassMediaOperators PreProc
hi def link sassInclude Include
hi def link sassDebug sassControl
hi def link sassWarn sassControl
diff --git a/runtime/syntax/sather.vim b/runtime/syntax/sather.vim
index 103cf0b8cd..baa3a825d8 100644
--- a/runtime/syntax/sather.vim
+++ b/runtime/syntax/sather.vim
@@ -9,11 +9,8 @@
" Homepage: http://www.icsi.berkeley.edu/~sather
" Sather files use .sa as suffix
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -61,44 +58,34 @@ syn match satherComment "--.*" contains=satherComment2String,satherCharacter
syn sync ccomment satherComment
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_sather_syn_inits")
- if version < 508
- let did_sather_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink satherBranch satherStatement
- HiLink satherLabel satherStatement
- HiLink satherConditional satherStatement
- HiLink satherSynchronize satherStatement
- HiLink satherRepeat satherStatement
- HiLink satherExceptions satherStatement
- HiLink satherStorageClass satherDeclarative
- HiLink satherMethodDecl satherDeclarative
- HiLink satherClassDecl satherDeclarative
- HiLink satherScopeDecl satherDeclarative
- HiLink satherBoolValue satherValue
- HiLink satherSpecial satherValue
- HiLink satherString satherValue
- HiLink satherCharacter satherValue
- HiLink satherSpecialCharacter satherValue
- HiLink satherNumber satherValue
- HiLink satherStatement Statement
- HiLink satherOperator Statement
- HiLink satherComment Comment
- HiLink satherType Type
- HiLink satherValue String
- HiLink satherString String
- HiLink satherSpecial String
- HiLink satherCharacter String
- HiLink satherDeclarative Type
- HiLink satherExternal PreCondit
- delcommand HiLink
-endif
+hi def link satherBranch satherStatement
+hi def link satherLabel satherStatement
+hi def link satherConditional satherStatement
+hi def link satherSynchronize satherStatement
+hi def link satherRepeat satherStatement
+hi def link satherExceptions satherStatement
+hi def link satherStorageClass satherDeclarative
+hi def link satherMethodDecl satherDeclarative
+hi def link satherClassDecl satherDeclarative
+hi def link satherScopeDecl satherDeclarative
+hi def link satherBoolValue satherValue
+hi def link satherSpecial satherValue
+hi def link satherString satherValue
+hi def link satherCharacter satherValue
+hi def link satherSpecialCharacter satherValue
+hi def link satherNumber satherValue
+hi def link satherStatement Statement
+hi def link satherOperator Statement
+hi def link satherComment Comment
+hi def link satherType Type
+hi def link satherValue String
+hi def link satherString String
+hi def link satherSpecial String
+hi def link satherCharacter String
+hi def link satherDeclarative Type
+hi def link satherExternal PreCondit
let b:current_syntax = "sather"
diff --git a/runtime/syntax/sbt.vim b/runtime/syntax/sbt.vim
new file mode 100644
index 0000000000..cbf73beafe
--- /dev/null
+++ b/runtime/syntax/sbt.vim
@@ -0,0 +1,32 @@
+" Vim syntax file
+" Language: sbt
+" Maintainer: Steven Dobay <stevendobay at protonmail.com>
+" Last Change: 2017.04.30
+
+if exists("b:current_syntax")
+ finish
+endif
+
+runtime! syntax/scala.vim
+
+syn region sbtString start="\"[^"]" skip="\\\"" end="\"" contains=sbtStringEscape
+syn match sbtStringEscape "\\u[0-9a-fA-F]\{4}" contained
+syn match sbtStringEscape "\\[nrfvb\\\"]" contained
+
+syn match sbtIdentitifer "^\S\+\ze\s*\(:=\|++=\|+=\|<<=\|<+=\)"
+syn match sbtBeginningSeq "^[Ss]eq\>"
+
+syn match sbtSpecial "\(:=\|++=\|+=\|<<=\|<+=\)"
+
+syn match sbtLineComment "//.*"
+syn region sbtComment start="/\*" end="\*/"
+syn region sbtDocComment start="/\*\*" end="\*/" keepend
+
+hi link sbtString String
+hi link sbtIdentitifer Keyword
+hi link sbtBeginningSeq Keyword
+hi link sbtSpecial Special
+hi link sbtComment Comment
+hi link sbtLineComment Comment
+hi link sbtDocComment Comment
+
diff --git a/runtime/syntax/scala.vim b/runtime/syntax/scala.vim
new file mode 100644
index 0000000000..c5a175fd77
--- /dev/null
+++ b/runtime/syntax/scala.vim
@@ -0,0 +1,232 @@
+" Vim syntax file
+" Language: Scala
+" Maintainer: Derek Wyatt
+" URL: https://github.com/derekwyatt/vim-scala
+" License: Same as Vim
+" Last Change: 20 May 2016
+" ----------------------------------------------------------------------------
+
+if !exists('main_syntax')
+ " quit when a syntax file was already loaded
+ if exists("b:current_syntax")
+ finish
+ endif
+ let main_syntax = 'scala'
+endif
+
+scriptencoding utf-8
+
+let b:current_syntax = "scala"
+
+" Allows for embedding, see #59; main_syntax convention instead? Refactor TOP
+"
+" The @Spell here is a weird hack, it means *exclude* if the first group is
+" TOP. Otherwise we get spelling errors highlighted on code elements that
+" match scalaBlock, even with `syn spell notoplevel`.
+function! s:ContainedGroup()
+ try
+ silent syn list @scala
+ return '@scala,@NoSpell'
+ catch /E392/
+ return 'TOP,@Spell'
+ endtry
+endfunction
+
+unlet! b:current_syntax
+
+syn case match
+syn sync minlines=200 maxlines=1000
+
+syn keyword scalaKeyword catch do else final finally for forSome if
+syn keyword scalaKeyword match return throw try while yield macro
+syn keyword scalaKeyword class trait object extends with nextgroup=scalaInstanceDeclaration skipwhite
+syn keyword scalaKeyword case nextgroup=scalaKeyword,scalaCaseFollowing skipwhite
+syn keyword scalaKeyword val nextgroup=scalaNameDefinition,scalaQuasiQuotes skipwhite
+syn keyword scalaKeyword def var nextgroup=scalaNameDefinition skipwhite
+hi link scalaKeyword Keyword
+
+exe 'syn region scalaBlock start=/{/ end=/}/ contains=' . s:ContainedGroup() . ' fold'
+
+syn keyword scalaAkkaSpecialWord when goto using startWith initialize onTransition stay become unbecome
+hi link scalaAkkaSpecialWord PreProc
+
+syn keyword scalatestSpecialWord shouldBe
+syn match scalatestShouldDSLA /^\s\+\zsit should/
+syn match scalatestShouldDSLB /\<should\>/
+hi link scalatestSpecialWord PreProc
+hi link scalatestShouldDSLA PreProc
+hi link scalatestShouldDSLB PreProc
+
+syn match scalaSymbol /'[_A-Za-z0-9$]\+/
+hi link scalaSymbol Number
+
+syn match scalaChar /'.'/
+syn match scalaChar /'\\[\\"'ntbrf]'/ contains=scalaEscapedChar
+syn match scalaChar /'\\u[A-Fa-f0-9]\{4}'/ contains=scalaUnicodeChar
+syn match scalaEscapedChar /\\[\\"'ntbrf]/
+syn match scalaUnicodeChar /\\u[A-Fa-f0-9]\{4}/
+hi link scalaChar Character
+hi link scalaEscapedChar Function
+hi link scalaUnicodeChar Special
+
+syn match scalaOperator "||"
+syn match scalaOperator "&&"
+syn match scalaOperator "|"
+syn match scalaOperator "&"
+hi link scalaOperator Special
+
+syn match scalaNameDefinition /\<[_A-Za-z0-9$]\+\>/ contained nextgroup=scalaPostNameDefinition,scalaVariableDeclarationList
+syn match scalaNameDefinition /`[^`]\+`/ contained nextgroup=scalaPostNameDefinition
+syn match scalaVariableDeclarationList /\s*,\s*/ contained nextgroup=scalaNameDefinition
+syn match scalaPostNameDefinition /\_s*:\_s*/ contained nextgroup=scalaTypeDeclaration
+hi link scalaNameDefinition Function
+
+syn match scalaInstanceDeclaration /\<[_\.A-Za-z0-9$]\+\>/ contained nextgroup=scalaInstanceHash
+syn match scalaInstanceDeclaration /`[^`]\+`/ contained
+syn match scalaInstanceHash /#/ contained nextgroup=scalaInstanceDeclaration
+hi link scalaInstanceDeclaration Special
+hi link scalaInstanceHash Type
+
+syn match scalaUnimplemented /???/
+hi link scalaUnimplemented ERROR
+
+syn match scalaCapitalWord /\<[A-Z][A-Za-z0-9$]*\>/
+hi link scalaCapitalWord Special
+
+" Handle type declarations specially
+syn region scalaTypeStatement matchgroup=Keyword start=/\<type\_s\+\ze/ end=/$/ contains=scalaTypeTypeDeclaration,scalaSquareBrackets,scalaTypeTypeEquals,scalaTypeStatement
+
+" Ugh... duplication of all the scalaType* stuff to handle special highlighting
+" of `type X =` declarations
+syn match scalaTypeTypeDeclaration /(/ contained nextgroup=scalaTypeTypeExtension,scalaTypeTypeEquals contains=scalaRoundBrackets skipwhite
+syn match scalaTypeTypeDeclaration /\%(โ‡’\|=>\)\ze/ contained nextgroup=scalaTypeTypeDeclaration contains=scalaTypeTypeExtension skipwhite
+syn match scalaTypeTypeDeclaration /\<[_\.A-Za-z0-9$]\+\>/ contained nextgroup=scalaTypeTypeExtension,scalaTypeTypeEquals skipwhite
+syn match scalaTypeTypeEquals /=\ze[^>]/ contained nextgroup=scalaTypeTypePostDeclaration skipwhite
+syn match scalaTypeTypeExtension /)\?\_s*\zs\%(โ‡’\|=>\|<:\|:>\|=:=\|::\|#\)/ contained nextgroup=scalaTypeTypeDeclaration skipwhite
+syn match scalaTypeTypePostDeclaration /\<[_\.A-Za-z0-9$]\+\>/ contained nextgroup=scalaTypeTypePostExtension skipwhite
+syn match scalaTypeTypePostExtension /\%(โ‡’\|=>\|<:\|:>\|=:=\|::\)/ contained nextgroup=scalaTypeTypePostDeclaration skipwhite
+hi link scalaTypeTypeDeclaration Type
+hi link scalaTypeTypeExtension Keyword
+hi link scalaTypeTypePostDeclaration Special
+hi link scalaTypeTypePostExtension Keyword
+
+syn match scalaTypeDeclaration /(/ contained nextgroup=scalaTypeExtension contains=scalaRoundBrackets skipwhite
+syn match scalaTypeDeclaration /\%(โ‡’\|=>\)\ze/ contained nextgroup=scalaTypeDeclaration contains=scalaTypeExtension skipwhite
+syn match scalaTypeDeclaration /\<[_\.A-Za-z0-9$]\+\>/ contained nextgroup=scalaTypeExtension skipwhite
+syn match scalaTypeExtension /)\?\_s*\zs\%(โ‡’\|=>\|<:\|:>\|=:=\|::\|#\)/ contained nextgroup=scalaTypeDeclaration skipwhite
+hi link scalaTypeDeclaration Type
+hi link scalaTypeExtension Keyword
+hi link scalaTypePostExtension Keyword
+
+syn match scalaTypeAnnotation /\%([_a-zA-Z0-9$\s]:\_s*\)\ze[_=(\.A-Za-z0-9$]\+/ skipwhite nextgroup=scalaTypeDeclaration contains=scalaRoundBrackets
+syn match scalaTypeAnnotation /)\_s*:\_s*\ze[_=(\.A-Za-z0-9$]\+/ skipwhite nextgroup=scalaTypeDeclaration
+hi link scalaTypeAnnotation Normal
+
+syn match scalaCaseFollowing /\<[_\.A-Za-z0-9$]\+\>/ contained
+syn match scalaCaseFollowing /`[^`]\+`/ contained
+hi link scalaCaseFollowing Special
+
+syn keyword scalaKeywordModifier abstract override final lazy implicit implicitly private protected sealed null require super
+hi link scalaKeywordModifier Function
+
+syn keyword scalaSpecial this true false ne eq
+syn keyword scalaSpecial new nextgroup=scalaInstanceDeclaration skipwhite
+syn match scalaSpecial "\%(=>\|โ‡’\|<-\|โ†\|->\|โ†’\)"
+syn match scalaSpecial /`[^`]\+`/ " Backtick literals
+hi link scalaSpecial PreProc
+
+syn keyword scalaExternal package import
+hi link scalaExternal Include
+
+syn match scalaStringEmbeddedQuote /\\"/ contained
+syn region scalaString start=/"/ end=/"/ contains=scalaStringEmbeddedQuote,scalaEscapedChar,scalaUnicodeChar
+hi link scalaString String
+hi link scalaStringEmbeddedQuote String
+
+syn region scalaIString matchgroup=scalaInterpolationBrackets start=/\<[a-zA-Z][a-zA-Z0-9_]*"/ skip=/\\"/ end=/"/ contains=scalaInterpolation,scalaInterpolationB,scalaEscapedChar,scalaUnicodeChar
+syn region scalaTripleIString matchgroup=scalaInterpolationBrackets start=/\<[a-zA-Z][a-zA-Z0-9_]*"""/ end=/"""\ze\%([^"]\|$\)/ contains=scalaInterpolation,scalaInterpolationB,scalaEscapedChar,scalaUnicodeChar
+hi link scalaIString String
+hi link scalaTripleIString String
+
+syn match scalaInterpolation /\$[a-zA-Z0-9_$]\+/ contained
+exe 'syn region scalaInterpolationB matchgroup=scalaInterpolationBoundary start=/\${/ end=/}/ contained contains=' . s:ContainedGroup()
+hi link scalaInterpolation Function
+hi link scalaInterpolationB Normal
+
+syn region scalaFString matchgroup=scalaInterpolationBrackets start=/f"/ skip=/\\"/ end=/"/ contains=scalaFInterpolation,scalaFInterpolationB,scalaEscapedChar,scalaUnicodeChar
+syn match scalaFInterpolation /\$[a-zA-Z0-9_$]\+\(%[-A-Za-z0-9\.]\+\)\?/ contained
+exe 'syn region scalaFInterpolationB matchgroup=scalaInterpolationBoundary start=/${/ end=/}\(%[-A-Za-z0-9\.]\+\)\?/ contained contains=' . s:ContainedGroup()
+hi link scalaFString String
+hi link scalaFInterpolation Function
+hi link scalaFInterpolationB Normal
+
+syn region scalaTripleString start=/"""/ end=/"""\%([^"]\|$\)/ contains=scalaEscapedChar,scalaUnicodeChar
+syn region scalaTripleFString matchgroup=scalaInterpolationBrackets start=/f"""/ end=/"""\%([^"]\|$\)/ contains=scalaFInterpolation,scalaFInterpolationB,scalaEscapedChar,scalaUnicodeChar
+hi link scalaTripleString String
+hi link scalaTripleFString String
+
+hi link scalaInterpolationBrackets Special
+hi link scalaInterpolationBoundary Function
+
+syn match scalaNumber /\<0[dDfFlL]\?\>/ " Just a bare 0
+syn match scalaNumber /\<[1-9]\d*[dDfFlL]\?\>/ " A multi-digit number - octal numbers with leading 0's are deprecated in Scala
+syn match scalaNumber /\<0[xX][0-9a-fA-F]\+[dDfFlL]\?\>/ " Hex number
+syn match scalaNumber /\%(\<\d\+\.\d*\|\.\d\+\)\%([eE][-+]\=\d\+\)\=[fFdD]\=/ " exponential notation 1
+syn match scalaNumber /\<\d\+[eE][-+]\=\d\+[fFdD]\=\>/ " exponential notation 2
+syn match scalaNumber /\<\d\+\%([eE][-+]\=\d\+\)\=[fFdD]\>/ " exponential notation 3
+hi link scalaNumber Number
+
+syn region scalaRoundBrackets start="(" end=")" skipwhite contained contains=scalaTypeDeclaration,scalaSquareBrackets,scalaRoundBrackets
+
+syn region scalaSquareBrackets matchgroup=scalaSquareBracketsBrackets start="\[" end="\]" skipwhite nextgroup=scalaTypeExtension contains=scalaTypeDeclaration,scalaSquareBrackets,scalaTypeOperator,scalaTypeAnnotationParameter
+syn match scalaTypeOperator /[-+=:<>]\+/ contained
+syn match scalaTypeAnnotationParameter /@\<[`_A-Za-z0-9$]\+\>/ contained
+hi link scalaSquareBracketsBrackets Type
+hi link scalaTypeOperator Keyword
+hi link scalaTypeAnnotationParameter Function
+
+syn match scalaShebang "\%^#!.*" display
+syn region scalaMultilineComment start="/\*" end="\*/" contains=scalaMultilineComment,scalaDocLinks,scalaParameterAnnotation,scalaCommentAnnotation,scalaTodo,scalaCommentCodeBlock,@Spell keepend fold
+syn match scalaCommentAnnotation "@[_A-Za-z0-9$]\+" contained
+syn match scalaParameterAnnotation "\%(@tparam\|@param\|@see\)" nextgroup=scalaParamAnnotationValue skipwhite contained
+syn match scalaParamAnnotationValue /[.`_A-Za-z0-9$]\+/ contained
+syn region scalaDocLinks start="\[\[" end="\]\]" contained
+syn region scalaCommentCodeBlock matchgroup=Keyword start="{{{" end="}}}" contained
+syn match scalaTodo "\vTODO|FIXME|XXX" contained
+hi link scalaShebang Comment
+hi link scalaMultilineComment Comment
+hi link scalaDocLinks Function
+hi link scalaParameterAnnotation Function
+hi link scalaParamAnnotationValue Keyword
+hi link scalaCommentAnnotation Function
+hi link scalaCommentCodeBlockBrackets String
+hi link scalaCommentCodeBlock String
+hi link scalaTodo Todo
+
+syn match scalaAnnotation /@\<[`_A-Za-z0-9$]\+\>/
+hi link scalaAnnotation PreProc
+
+syn match scalaTrailingComment "//.*$" contains=scalaTodo,@Spell
+hi link scalaTrailingComment Comment
+
+syn match scalaAkkaFSM /goto([^)]*)\_s\+\<using\>/ contains=scalaAkkaFSMGotoUsing
+syn match scalaAkkaFSM /stay\_s\+using/
+syn match scalaAkkaFSM /^\s*stay\s*$/
+syn match scalaAkkaFSM /when\ze([^)]*)/
+syn match scalaAkkaFSM /startWith\ze([^)]*)/
+syn match scalaAkkaFSM /initialize\ze()/
+syn match scalaAkkaFSM /onTransition/
+syn match scalaAkkaFSM /onTermination/
+syn match scalaAkkaFSM /whenUnhandled/
+syn match scalaAkkaFSMGotoUsing /\<using\>/
+syn match scalaAkkaFSMGotoUsing /\<goto\>/
+hi link scalaAkkaFSM PreProc
+hi link scalaAkkaFSMGotoUsing PreProc
+
+let b:current_syntax = 'scala'
+
+if main_syntax ==# 'scala'
+ unlet main_syntax
+endif
+
+" vim:set sw=2 sts=2 ts=8 et:
diff --git a/runtime/syntax/scheme.vim b/runtime/syntax/scheme.vim
index a210b0c720..e209729f57 100644
--- a/runtime/syntax/scheme.vim
+++ b/runtime/syntax/scheme.vim
@@ -1,330 +1,464 @@
" Vim syntax file
-" Language: Scheme (R5RS + some R6RS extras)
-" Last Change: 2012 May 13
-" Maintainer: Sergey Khorev <sergey.khorev@gmail.com>
-" Original author: Dirk van Deun <dirk@igwe.vub.ac.be>
-
-" This script incorrectly recognizes some junk input as numerals:
-" parsing the complete system of Scheme numerals using the pattern
-" language is practically impossible: I did a lax approximation.
-
-" MzScheme extensions can be activated with setting is_mzscheme variable
-
-" Suggestions and bug reports are solicited by the author.
-
-" Initializing:
-
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" Language: Scheme (R7RS)
+" Last Change: 2018-01-06
+" Author: Evan Hanson <evhan@foldling.org>
+" Maintainer: Evan Hanson <evhan@foldling.org>
+" Previous Author: Dirk van Deun <dirk@igwe.vub.ac.be>
+" Previous Maintainer: Sergey Khorev <sergey.khorev@gmail.com>
+" URL: https://foldling.org/vim/syntax/scheme.vim
+
+if exists('b:current_syntax')
finish
endif
-let s:cpo_save = &cpo
+let s:cpo = &cpo
set cpo&vim
-syn case ignore
+syn match schemeParentheses "[^ '`\t\n()\[\]";]\+"
+syn match schemeParentheses "[)\]]"
-" Fascist highlighting: everything that doesn't fit the rules is an error...
+syn match schemeIdentifier /[^ '`\t\n()\[\]"|;][^ '`\t\n()\[\]"|;]*/
-syn match schemeError ![^ \t()\[\]";]*!
-syn match schemeError ")"
+syn region schemeQuote matchgroup=schemeData start=/'[`']*/ end=/[ \t\n()\[\]";]/me=e-1
+syn region schemeQuote matchgroup=schemeData start=/'['`]*"/ skip=/\\[\\"]/ end=/"/
+syn region schemeQuote matchgroup=schemeData start=/'['`]*|/ skip=/\\[\\|]/ end=/|/
+syn region schemeQuote matchgroup=schemeData start=/'['`]*#\?(/ end=/)/ contains=ALLBUT,schemeQuasiquote,schemeQuasiquoteForm,schemeUnquote,schemeForm,schemeDatumCommentForm,schemeImport,@schemeImportCluster,@schemeSyntaxCluster
-" Quoted and backquoted stuff
+syn region schemeQuasiquote matchgroup=schemeData start=/`['`]*/ end=/[ \t\n()\[\]";]/me=e-1
+syn region schemeQuasiquote matchgroup=schemeData start=/`['`]*#\?(/ end=/)/ contains=ALLBUT,schemeQuote,schemeQuoteForm,schemeForm,schemeDatumCommentForm,schemeImport,@schemeImportCluster,@schemeSyntaxCluster
-syn region schemeQuoted matchgroup=Delimiter start="['`]" end=![ \t()\[\]";]!me=e-1 contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
+syn region schemeUnquote matchgroup=schemeParentheses start=/,/ end=/[ `'\t\n\[\]()";]/me=e-1 contained contains=ALLBUT,schemeDatumCommentForm,@schemeImportCluster
+syn region schemeUnquote matchgroup=schemeParentheses start=/,@/ end=/[ `'\t\n\[\]()";]/me=e-1 contained contains=ALLBUT,schemeDatumCommentForm,@schemeImportCluster
+syn region schemeUnquote matchgroup=schemeParentheses start=/,(/ end=/)/ contained contains=ALLBUT,schemeDatumCommentForm,@schemeImportCluster
+syn region schemeUnquote matchgroup=schemeParentheses start=/,@(/ end=/)/ contained contains=ALLBUT,schemeDatumCommentForm,@schemeImportCluster
-syn region schemeQuoted matchgroup=Delimiter start="['`](" matchgroup=Delimiter end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
-syn region schemeQuoted matchgroup=Delimiter start="['`]#(" matchgroup=Delimiter end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
+syn region schemeQuoteForm matchgroup=schemeData start=/(/ end=/)/ contained contains=ALLBUT,schemeQuasiquote,schemeQuasiquoteForm,schemeUnquote,schemeForm,schemeDatumCommentForm,schemeImport,@schemeImportCluster,@schemeSyntaxCluster
+syn region schemeQuasiquoteForm matchgroup=schemeData start=/(/ end=/)/ contained contains=ALLBUT,schemeQuote,schemeForm,schemeDatumCommentForm,schemeImport,@schemeImportCluster,@schemeSyntaxCluster
-syn region schemeStrucRestricted matchgroup=Delimiter start="(" matchgroup=Delimiter end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
-syn region schemeStrucRestricted matchgroup=Delimiter start="#(" matchgroup=Delimiter end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
+syn region schemeString start=/\(\\\)\@<!"/ skip=/\\[\\"]/ end=/"/
+syn region schemeSymbol start=/\(\\\)\@<!|/ skip=/\\[\\|]/ end=/|/
-" Popular Scheme extension:
-" using [] as well as ()
-syn region schemeStrucRestricted matchgroup=Delimiter start="\[" matchgroup=Delimiter end="\]" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
-syn region schemeStrucRestricted matchgroup=Delimiter start="#\[" matchgroup=Delimiter end="\]" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
+syn match schemeNumber /\(#[dbeio]\)*[+\-]*\([0-9]\+\|inf.0\|nan.0\)\(\/\|\.\)\?[0-9+\-@\ilns]*\>/
+syn match schemeNumber /#x[+\-]*[0-9a-fA-F]\+\>/
-syn region schemeUnquote matchgroup=Delimiter start="," end=![ \t\[\]()";]!me=e-1 contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
-syn region schemeUnquote matchgroup=Delimiter start=",@" end=![ \t\[\]()";]!me=e-1 contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
+syn match schemeBoolean /#t\(rue\)\?/
+syn match schemeBoolean /#f\(alse\)\?/
-syn region schemeUnquote matchgroup=Delimiter start=",(" end=")" contains=ALL
-syn region schemeUnquote matchgroup=Delimiter start=",@(" end=")" contains=ALL
+syn match schemeCharacter /#\\.[^ `'\t\n\[\]()]*/
+syn match schemeCharacter /#\\x[0-9a-fA-F]\+/
-syn region schemeUnquote matchgroup=Delimiter start=",#(" end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
-syn region schemeUnquote matchgroup=Delimiter start=",@#(" end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
+syn match schemeComment /;.*$/
-syn region schemeUnquote matchgroup=Delimiter start=",\[" end="\]" contains=ALL
-syn region schemeUnquote matchgroup=Delimiter start=",@\[" end="\]" contains=ALL
+syn region schemeMultilineComment start=/#|/ end=/|#/ contains=schemeMultilineComment
-syn region schemeUnquote matchgroup=Delimiter start=",#\[" end="\]" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
-syn region schemeUnquote matchgroup=Delimiter start=",@#\[" end="\]" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
+syn region schemeForm matchgroup=schemeParentheses start="(" end=")" contains=ALLBUT,schemeUnquote,schemeDatumCommentForm,@schemeImportCluster
+syn region schemeForm matchgroup=schemeParentheses start="\[" end="\]" contains=ALLBUT,schemeUnquote,schemeDatumCommentForm,@schemeImportCluster
-" R5RS Scheme Functions and Syntax:
+syn region schemeVector matchgroup=schemeData start="#(" end=")" contains=ALLBUT,schemeQuasiquote,schemeQuasiquoteForm,schemeUnquote,schemeForm,schemeDatumCommentForm,schemeImport,@schemeImportCluster,@schemeSyntaxCluster
+syn region schemeVector matchgroup=schemeData start="#[fsu]\d\+(" end=")" contains=schemeNumber,schemeComment,schemeDatumComment
-if version < 600
- set iskeyword=33,35-39,42-58,60-90,94,95,97-122,126,_
+if exists('g:is_chicken') || exists('b:is_chicken')
+ syn region schemeImport matchgroup=schemeImport start="\(([ \t\n]*\)\@<=\(import\|import-syntax\|use\|require-extension\)\(-for-syntax\)\?\>" end=")"me=e-1 contained contains=schemeImportForm,schemeIdentifier,schemeComment,schemeDatumComment
else
- setlocal iskeyword=33,35-39,42-58,60-90,94,95,97-122,126,_
-endif
-
-syn keyword schemeSyntax lambda and or if cond case define let let* letrec
-syn keyword schemeSyntax begin do delay set! else =>
-syn keyword schemeSyntax quote quasiquote unquote unquote-splicing
-syn keyword schemeSyntax define-syntax let-syntax letrec-syntax syntax-rules
-" R6RS
-syn keyword schemeSyntax define-record-type fields protocol
-
-syn keyword schemeFunc not boolean? eq? eqv? equal? pair? cons car cdr set-car!
-syn keyword schemeFunc set-cdr! caar cadr cdar cddr caaar caadr cadar caddr
-syn keyword schemeFunc cdaar cdadr cddar cdddr caaaar caaadr caadar caaddr
-syn keyword schemeFunc cadaar cadadr caddar cadddr cdaaar cdaadr cdadar cdaddr
-syn keyword schemeFunc cddaar cddadr cdddar cddddr null? list? list length
-syn keyword schemeFunc append reverse list-ref memq memv member assq assv assoc
-syn keyword schemeFunc symbol? symbol->string string->symbol number? complex?
-syn keyword schemeFunc real? rational? integer? exact? inexact? = < > <= >=
-syn keyword schemeFunc zero? positive? negative? odd? even? max min + * - / abs
-syn keyword schemeFunc quotient remainder modulo gcd lcm numerator denominator
-syn keyword schemeFunc floor ceiling truncate round rationalize exp log sin cos
-syn keyword schemeFunc tan asin acos atan sqrt expt make-rectangular make-polar
-syn keyword schemeFunc real-part imag-part magnitude angle exact->inexact
-syn keyword schemeFunc inexact->exact number->string string->number char=?
-syn keyword schemeFunc char-ci=? char<? char-ci<? char>? char-ci>? char<=?
-syn keyword schemeFunc char-ci<=? char>=? char-ci>=? char-alphabetic? char?
-syn keyword schemeFunc char-numeric? char-whitespace? char-upper-case?
-syn keyword schemeFunc char-lower-case?
-syn keyword schemeFunc char->integer integer->char char-upcase char-downcase
-syn keyword schemeFunc string? make-string string string-length string-ref
-syn keyword schemeFunc string-set! string=? string-ci=? string<? string-ci<?
-syn keyword schemeFunc string>? string-ci>? string<=? string-ci<=? string>=?
-syn keyword schemeFunc string-ci>=? substring string-append vector? make-vector
-syn keyword schemeFunc vector vector-length vector-ref vector-set! procedure?
-syn keyword schemeFunc apply map for-each call-with-current-continuation
-syn keyword schemeFunc call-with-input-file call-with-output-file input-port?
-syn keyword schemeFunc output-port? current-input-port current-output-port
-syn keyword schemeFunc open-input-file open-output-file close-input-port
-syn keyword schemeFunc close-output-port eof-object? read read-char peek-char
-syn keyword schemeFunc write display newline write-char call/cc
-syn keyword schemeFunc list-tail string->list list->string string-copy
-syn keyword schemeFunc string-fill! vector->list list->vector vector-fill!
-syn keyword schemeFunc force with-input-from-file with-output-to-file
-syn keyword schemeFunc char-ready? load transcript-on transcript-off eval
-syn keyword schemeFunc dynamic-wind port? values call-with-values
-syn keyword schemeFunc scheme-report-environment null-environment
-syn keyword schemeFunc interaction-environment
-" R6RS
-syn keyword schemeFunc make-eq-hashtable make-eqv-hashtable make-hashtable
-syn keyword schemeFunc hashtable? hashtable-size hashtable-ref hashtable-set!
-syn keyword schemeFunc hashtable-delete! hashtable-contains? hashtable-update!
-syn keyword schemeFunc hashtable-copy hashtable-clear! hashtable-keys
-syn keyword schemeFunc hashtable-entries hashtable-equivalence-function hashtable-hash-function
-syn keyword schemeFunc hashtable-mutable? equal-hash string-hash string-ci-hash symbol-hash
-syn keyword schemeFunc find for-all exists filter partition fold-left fold-right
-syn keyword schemeFunc remp remove remv remq memp assp cons*
-
-" ... so that a single + or -, inside a quoted context, would not be
-" interpreted as a number (outside such contexts, it's a schemeFunc)
-
-syn match schemeDelimiter !\.[ \t\[\]()";]!me=e-1
-syn match schemeDelimiter !\.$!
-" ... and a single dot is not a number but a delimiter
-
-" This keeps all other stuff unhighlighted, except *stuff* and <stuff>:
-
-syn match schemeOther ,[a-z!$%&*/:<=>?^_~+@#%-][-a-z!$%&*/:<=>?^_~0-9+.@#%]*,
-syn match schemeError ,[a-z!$%&*/:<=>?^_~+@#%-][-a-z!$%&*/:<=>?^_~0-9+.@#%]*[^-a-z!$%&*/:<=>?^_~0-9+.@ \t\[\]()";]\+[^ \t\[\]()";]*,
-
-syn match schemeOther "\.\.\."
-syn match schemeError !\.\.\.[^ \t\[\]()";]\+!
-" ... a special identifier
-
-syn match schemeConstant ,\*[-a-z!$%&*/:<=>?^_~0-9+.@]\+\*[ \t\[\]()";],me=e-1
-syn match schemeConstant ,\*[-a-z!$%&*/:<=>?^_~0-9+.@]\+\*$,
-syn match schemeError ,\*[-a-z!$%&*/:<=>?^_~0-9+.@]*\*[^-a-z!$%&*/:<=>?^_~0-9+.@ \t\[\]()";]\+[^ \t\[\]()";]*,
-
-syn match schemeConstant ,<[-a-z!$%&*/:<=>?^_~0-9+.@]*>[ \t\[\]()";],me=e-1
-syn match schemeConstant ,<[-a-z!$%&*/:<=>?^_~0-9+.@]*>$,
-syn match schemeError ,<[-a-z!$%&*/:<=>?^_~0-9+.@]*>[^-a-z!$%&*/:<=>?^_~0-9+.@ \t\[\]()";]\+[^ \t\[\]()";]*,
-
-" Non-quoted lists, and strings:
-
-syn region schemeStruc matchgroup=Delimiter start="(" matchgroup=Delimiter end=")" contains=ALL
-syn region schemeStruc matchgroup=Delimiter start="#(" matchgroup=Delimiter end=")" contains=ALL
-
-syn region schemeStruc matchgroup=Delimiter start="\[" matchgroup=Delimiter end="\]" contains=ALL
-syn region schemeStruc matchgroup=Delimiter start="#\[" matchgroup=Delimiter end="\]" contains=ALL
-
-" Simple literals:
-syn region schemeString start=+\%(\\\)\@<!"+ skip=+\\[\\"]+ end=+"+ contains=@Spell
-
-" Comments:
-
-syn match schemeComment ";.*$" contains=@Spell
-
-
-" Writing out the complete description of Scheme numerals without
-" using variables is a day's work for a trained secretary...
-
-syn match schemeOther ![+-][ \t\[\]()";]!me=e-1
-syn match schemeOther ![+-]$!
-"
-" This is a useful lax approximation:
-syn match schemeNumber "[-#+.]\=[0-9][-#+/0-9a-f@i.boxesfdl]*"
-syn match schemeError ![-#+0-9.][-#+/0-9a-f@i.boxesfdl]*[^-#+/0-9a-f@i.boxesfdl \t\[\]()";][^ \t\[\]()";]*!
-
-syn match schemeBoolean "#[tf]"
-syn match schemeError !#[tf][^ \t\[\]()";]\+!
-
-syn match schemeCharacter "#\\"
-syn match schemeCharacter "#\\."
-syn match schemeError !#\\.[^ \t\[\]()";]\+!
-syn match schemeCharacter "#\\space"
-syn match schemeError !#\\space[^ \t\[\]()";]\+!
-syn match schemeCharacter "#\\newline"
-syn match schemeError !#\\newline[^ \t\[\]()";]\+!
-
-" R6RS
-syn match schemeCharacter "#\\x[0-9a-fA-F]\+"
-
-
-if exists("b:is_mzscheme") || exists("is_mzscheme")
- " MzScheme extensions
- " multiline comment
- syn region schemeComment start="#|" end="|#" contains=@Spell
-
- " #%xxx are the special MzScheme identifiers
- syn match schemeOther "#%[-a-z!$%&*/:<=>?^_~0-9+.@#%]\+"
- " anything limited by |'s is identifier
- syn match schemeOther "|[^|]\+|"
-
- syn match schemeCharacter "#\\\%(return\|tab\)"
-
- " Modules require stmt
- syn keyword schemeExtSyntax module require dynamic-require lib prefix all-except prefix-all-except rename
- " modules provide stmt
- syn keyword schemeExtSyntax provide struct all-from all-from-except all-defined all-defined-except
- " Other from MzScheme
- syn keyword schemeExtSyntax with-handlers when unless instantiate define-struct case-lambda syntax-case
- syn keyword schemeExtSyntax free-identifier=? bound-identifier=? module-identifier=? syntax-object->datum
- syn keyword schemeExtSyntax datum->syntax-object
- syn keyword schemeExtSyntax let-values let*-values letrec-values set!-values fluid-let parameterize begin0
- syn keyword schemeExtSyntax error raise opt-lambda define-values unit unit/sig define-signature
- syn keyword schemeExtSyntax invoke-unit/sig define-values/invoke-unit/sig compound-unit/sig import export
- syn keyword schemeExtSyntax link syntax quasisyntax unsyntax with-syntax
-
- syn keyword schemeExtFunc format system-type current-extension-compiler current-extension-linker
- syn keyword schemeExtFunc use-standard-linker use-standard-compiler
- syn keyword schemeExtFunc find-executable-path append-object-suffix append-extension-suffix
- syn keyword schemeExtFunc current-library-collection-paths current-extension-compiler-flags make-parameter
- syn keyword schemeExtFunc current-directory build-path normalize-path current-extension-linker-flags
- syn keyword schemeExtFunc file-exists? directory-exists? delete-directory/files delete-directory delete-file
- syn keyword schemeExtFunc system compile-file system-library-subpath getenv putenv current-standard-link-libraries
- syn keyword schemeExtFunc remove* file-size find-files fold-files directory-list shell-execute split-path
- syn keyword schemeExtFunc current-error-port process/ports process printf fprintf open-input-string open-output-string
- syn keyword schemeExtFunc get-output-string
- " exceptions
- syn keyword schemeExtFunc exn exn:application:arity exn:application:continuation exn:application:fprintf:mismatch
- syn keyword schemeExtFunc exn:application:mismatch exn:application:type exn:application:mismatch exn:break exn:i/o:filesystem exn:i/o:port
- syn keyword schemeExtFunc exn:i/o:port:closed exn:i/o:tcp exn:i/o:udp exn:misc exn:misc:application exn:misc:unsupported exn:module exn:read
- syn keyword schemeExtFunc exn:read:non-char exn:special-comment exn:syntax exn:thread exn:user exn:variable exn:application:mismatch
- syn keyword schemeExtFunc exn? exn:application:arity? exn:application:continuation? exn:application:fprintf:mismatch? exn:application:mismatch?
- syn keyword schemeExtFunc exn:application:type? exn:application:mismatch? exn:break? exn:i/o:filesystem? exn:i/o:port? exn:i/o:port:closed?
- syn keyword schemeExtFunc exn:i/o:tcp? exn:i/o:udp? exn:misc? exn:misc:application? exn:misc:unsupported? exn:module? exn:read? exn:read:non-char?
- syn keyword schemeExtFunc exn:special-comment? exn:syntax? exn:thread? exn:user? exn:variable? exn:application:mismatch?
- " Command-line parsing
- syn keyword schemeExtFunc command-line current-command-line-arguments once-any help-labels multi once-each
-
- " syntax quoting, unquoting and quasiquotation
- syn region schemeUnquote matchgroup=Delimiter start="#," end=![ \t\[\]()";]!me=e-1 contains=ALL
- syn region schemeUnquote matchgroup=Delimiter start="#,@" end=![ \t\[\]()";]!me=e-1 contains=ALL
- syn region schemeUnquote matchgroup=Delimiter start="#,(" end=")" contains=ALL
- syn region schemeUnquote matchgroup=Delimiter start="#,@(" end=")" contains=ALL
- syn region schemeUnquote matchgroup=Delimiter start="#,\[" end="\]" contains=ALL
- syn region schemeUnquote matchgroup=Delimiter start="#,@\[" end="\]" contains=ALL
- syn region schemeQuoted matchgroup=Delimiter start="#['`]" end=![ \t()\[\]";]!me=e-1 contains=ALL
- syn region schemeQuoted matchgroup=Delimiter start="#['`](" matchgroup=Delimiter end=")" contains=ALL
+ syn region schemeImport matchgroup=schemeImport start="\(([ \t\n]*\)\@<=\(import\)\>" end=")"me=e-1 contained contains=schemeImportForm,schemeIdentifier,schemeComment,schemeDatumComment
endif
-
-if exists("b:is_chicken") || exists("is_chicken")
- " multiline comment
- syntax region schemeMultilineComment start=/#|/ end=/|#/ contains=@Spell,schemeMultilineComment
-
- syn match schemeOther "##[-a-z!$%&*/:<=>?^_~0-9+.@#%]\+"
- syn match schemeExtSyntax "#:[-a-z!$%&*/:<=>?^_~0-9+.@#%]\+"
-
- syn keyword schemeExtSyntax unit uses declare hide foreign-declare foreign-parse foreign-parse/spec
- syn keyword schemeExtSyntax foreign-lambda foreign-lambda* define-external define-macro load-library
- syn keyword schemeExtSyntax let-values let*-values letrec-values ->string require-extension
- syn keyword schemeExtSyntax let-optionals let-optionals* define-foreign-variable define-record
- syn keyword schemeExtSyntax pointer tag-pointer tagged-pointer? define-foreign-type
- syn keyword schemeExtSyntax require require-for-syntax cond-expand and-let* receive argc+argv
- syn keyword schemeExtSyntax fixnum? fx= fx> fx< fx>= fx<= fxmin fxmax
- syn keyword schemeExtFunc ##core#inline ##sys#error ##sys#update-errno
-
- " here-string
- syn region schemeString start=+#<<\s*\z(.*\)+ end=+^\z1$+ contains=@Spell
-
- if filereadable(expand("<sfile>:p:h")."/cpp.vim")
- unlet! b:current_syntax
- syn include @ChickenC <sfile>:p:h/cpp.vim
- syn region ChickenC matchgroup=schemeOther start=+(\@<=foreign-declare "+ end=+")\@=+ contains=@ChickenC
- syn region ChickenC matchgroup=schemeComment start=+foreign-declare\s*#<<\z(.*\)$+hs=s+15 end=+^\z1$+ contains=@ChickenC
- syn region ChickenC matchgroup=schemeOther start=+(\@<=foreign-parse "+ end=+")\@=+ contains=@ChickenC
- syn region ChickenC matchgroup=schemeComment start=+foreign-parse\s*#<<\z(.*\)$+hs=s+13 end=+^\z1$+ contains=@ChickenC
- syn region ChickenC matchgroup=schemeOther start=+(\@<=foreign-parse/spec "+ end=+")\@=+ contains=@ChickenC
- syn region ChickenC matchgroup=schemeComment start=+foreign-parse/spec\s*#<<\z(.*\)$+hs=s+18 end=+^\z1$+ contains=@ChickenC
- syn region ChickenC matchgroup=schemeComment start=+#>+ end=+<#+ contains=@ChickenC
- syn region ChickenC matchgroup=schemeComment start=+#>?+ end=+<#+ contains=@ChickenC
- syn region ChickenC matchgroup=schemeComment start=+#>!+ end=+<#+ contains=@ChickenC
- syn region ChickenC matchgroup=schemeComment start=+#>\$+ end=+<#+ contains=@ChickenC
- syn region ChickenC matchgroup=schemeComment start=+#>%+ end=+<#+ contains=@ChickenC
- endif
-
- " suggested by Alex Queiroz
- syn match schemeExtSyntax "#![-a-z!$%&*/:<=>?^_~0-9+.@#%]\+"
- syn region schemeString start=+#<#\s*\z(.*\)+ end=+^\z1$+ contains=@Spell
-endif
-
-" Synchronization and the wrapping up...
-
-syn sync match matchPlace grouphere NONE "^[^ \t]"
-" ... i.e. synchronize on a line that starts at the left margin
-
-" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_scheme_syntax_inits")
- if version < 508
- let did_scheme_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink schemeSyntax Statement
- HiLink schemeFunc Function
-
- HiLink schemeString String
- HiLink schemeCharacter Character
- HiLink schemeNumber Number
- HiLink schemeBoolean Boolean
-
- HiLink schemeDelimiter Delimiter
- HiLink schemeConstant Constant
-
- HiLink schemeComment Comment
- HiLink schemeMultilineComment Comment
- HiLink schemeError Error
-
- HiLink schemeExtSyntax Type
- HiLink schemeExtFunc PreProc
- delcommand HiLink
+syn match schemeImportKeyword "\(([ \t\n]*\)\@<=\(except\|only\|prefix\|rename\|srfi\)\>"
+syn region schemeImportForm matchgroup=schemeParentheses start="(" end=")" contained contains=schemeIdentifier,schemeComment,schemeDatumComment,@schemeImportCluster
+syn cluster schemeImportCluster contains=schemeImportForm,schemeImportKeyword
+
+syn region schemeDatumComment matchgroup=schemeDatumComment start=/#;[ \t\n`']*/ end=/[ \t\n()\[\]";]/me=e-1
+syn region schemeDatumComment matchgroup=schemeDatumComment start=/#;[ \t\n`']*"/ skip=/\\[\\"]/ end=/"/
+syn region schemeDatumComment matchgroup=schemeDatumComment start=/#;[ \t\n`']*|/ skip=/\\[\\|]/ end=/|/
+syn region schemeDatumComment matchgroup=schemeDatumComment start=/#;[ \t\n`']*\(#\([usf]\d\+\)\?\)\?(/ end=/)/ contains=schemeDatumCommentForm
+syn region schemeDatumCommentForm start="(" end=")" contained contains=schemeDatumCommentForm
+
+syn cluster schemeSyntaxCluster contains=schemeFunction,schemeKeyword,schemeSyntax,schemeExtraSyntax,schemeLibrarySyntax,schemeSyntaxSyntax
+
+syn keyword schemeLibrarySyntax define-library
+syn keyword schemeLibrarySyntax export
+syn keyword schemeLibrarySyntax include
+syn keyword schemeLibrarySyntax include-ci
+syn keyword schemeLibrarySyntax include-library-declarations
+syn keyword schemeLibrarySyntax library
+syn keyword schemeLibrarySyntax cond-expand
+
+syn keyword schemeSyntaxSyntax define-syntax
+syn keyword schemeSyntaxSyntax let-syntax
+syn keyword schemeSyntaxSyntax letrec-syntax
+syn keyword schemeSyntaxSyntax syntax-rules
+
+syn keyword schemeSyntax =>
+syn keyword schemeSyntax and
+syn keyword schemeSyntax begin
+syn keyword schemeSyntax case
+syn keyword schemeSyntax case-lambda
+syn keyword schemeSyntax cond
+syn keyword schemeSyntax define
+syn keyword schemeSyntax define-record-type
+syn keyword schemeSyntax define-values
+syn keyword schemeSyntax delay
+syn keyword schemeSyntax delay-force
+syn keyword schemeSyntax do
+syn keyword schemeSyntax else
+syn keyword schemeSyntax guard
+syn keyword schemeSyntax if
+syn keyword schemeSyntax lambda
+syn keyword schemeSyntax let
+syn keyword schemeSyntax let*
+syn keyword schemeSyntax let*-values
+syn keyword schemeSyntax let-values
+syn keyword schemeSyntax letrec
+syn keyword schemeSyntax letrec*
+syn keyword schemeSyntax or
+syn keyword schemeSyntax parameterize
+syn keyword schemeSyntax quasiquote
+syn keyword schemeSyntax quote
+syn keyword schemeSyntax set!
+syn keyword schemeSyntax unless
+syn keyword schemeSyntax unquote
+syn keyword schemeSyntax unquote-splicing
+syn keyword schemeSyntax when
+
+syn keyword schemeFunction *
+syn keyword schemeFunction +
+syn keyword schemeFunction -
+syn keyword schemeFunction /
+syn keyword schemeFunction <
+syn keyword schemeFunction <=
+syn keyword schemeFunction =
+syn keyword schemeFunction >
+syn keyword schemeFunction >=
+syn keyword schemeFunction abs
+syn keyword schemeFunction acos
+syn keyword schemeFunction acos
+syn keyword schemeFunction angle
+syn keyword schemeFunction append
+syn keyword schemeFunction apply
+syn keyword schemeFunction asin
+syn keyword schemeFunction assoc
+syn keyword schemeFunction assq
+syn keyword schemeFunction assv
+syn keyword schemeFunction atan
+syn keyword schemeFunction binary-port?
+syn keyword schemeFunction boolean=?
+syn keyword schemeFunction boolean?
+syn keyword schemeFunction bytevector
+syn keyword schemeFunction bytevector-append
+syn keyword schemeFunction bytevector-append
+syn keyword schemeFunction bytevector-copy
+syn keyword schemeFunction bytevector-copy!
+syn keyword schemeFunction bytevector-length
+syn keyword schemeFunction bytevector-u8-ref
+syn keyword schemeFunction bytevector-u8-set!
+syn keyword schemeFunction bytevector?
+syn keyword schemeFunction caaaar
+syn keyword schemeFunction caaadr
+syn keyword schemeFunction caaar
+syn keyword schemeFunction caadar
+syn keyword schemeFunction caaddr
+syn keyword schemeFunction caadr
+syn keyword schemeFunction caar
+syn keyword schemeFunction cadaar
+syn keyword schemeFunction cadadr
+syn keyword schemeFunction cadar
+syn keyword schemeFunction caddar
+syn keyword schemeFunction cadddr
+syn keyword schemeFunction caddr
+syn keyword schemeFunction cadr
+syn keyword schemeFunction call-with-current-continuation
+syn keyword schemeFunction call-with-input-file
+syn keyword schemeFunction call-with-output-file
+syn keyword schemeFunction call-with-port
+syn keyword schemeFunction call-with-values
+syn keyword schemeFunction call/cc
+syn keyword schemeFunction car
+syn keyword schemeFunction cdaaar
+syn keyword schemeFunction cdaadr
+syn keyword schemeFunction cdaar
+syn keyword schemeFunction cdadar
+syn keyword schemeFunction cdaddr
+syn keyword schemeFunction cdadr
+syn keyword schemeFunction cdar
+syn keyword schemeFunction cddaar
+syn keyword schemeFunction cddadr
+syn keyword schemeFunction cddar
+syn keyword schemeFunction cdddar
+syn keyword schemeFunction cddddr
+syn keyword schemeFunction cdddr
+syn keyword schemeFunction cddr
+syn keyword schemeFunction cdr
+syn keyword schemeFunction ceiling
+syn keyword schemeFunction char->integer
+syn keyword schemeFunction char-alphabetic?
+syn keyword schemeFunction char-ci<=?
+syn keyword schemeFunction char-ci<?
+syn keyword schemeFunction char-ci=?
+syn keyword schemeFunction char-ci>=?
+syn keyword schemeFunction char-ci>?
+syn keyword schemeFunction char-downcase
+syn keyword schemeFunction char-foldcase
+syn keyword schemeFunction char-lower-case?
+syn keyword schemeFunction char-numeric?
+syn keyword schemeFunction char-ready?
+syn keyword schemeFunction char-upcase
+syn keyword schemeFunction char-upper-case?
+syn keyword schemeFunction char-whitespace?
+syn keyword schemeFunction char<=?
+syn keyword schemeFunction char<?
+syn keyword schemeFunction char=?
+syn keyword schemeFunction char>=?
+syn keyword schemeFunction char>?
+syn keyword schemeFunction char?
+syn keyword schemeFunction close-input-port
+syn keyword schemeFunction close-output-port
+syn keyword schemeFunction close-port
+syn keyword schemeFunction command-line
+syn keyword schemeFunction complex?
+syn keyword schemeFunction cons
+syn keyword schemeFunction cos
+syn keyword schemeFunction current-error-port
+syn keyword schemeFunction current-input-port
+syn keyword schemeFunction current-jiffy
+syn keyword schemeFunction current-output-port
+syn keyword schemeFunction current-second
+syn keyword schemeFunction delete-file
+syn keyword schemeFunction denominator
+syn keyword schemeFunction digit-value
+syn keyword schemeFunction display
+syn keyword schemeFunction dynamic-wind
+syn keyword schemeFunction emergency-exit
+syn keyword schemeFunction environment
+syn keyword schemeFunction eof-object
+syn keyword schemeFunction eof-object?
+syn keyword schemeFunction eq?
+syn keyword schemeFunction equal?
+syn keyword schemeFunction eqv?
+syn keyword schemeFunction error
+syn keyword schemeFunction error-object-irritants
+syn keyword schemeFunction error-object-message
+syn keyword schemeFunction error-object?
+syn keyword schemeFunction eval
+syn keyword schemeFunction even?
+syn keyword schemeFunction exact
+syn keyword schemeFunction exact->inexact
+syn keyword schemeFunction exact-integer-sqrt
+syn keyword schemeFunction exact-integer?
+syn keyword schemeFunction exact?
+syn keyword schemeFunction exit
+syn keyword schemeFunction exp
+syn keyword schemeFunction expt
+syn keyword schemeFunction features
+syn keyword schemeFunction file-error?
+syn keyword schemeFunction file-exists?
+syn keyword schemeFunction finite?
+syn keyword schemeFunction floor
+syn keyword schemeFunction floor-quotient
+syn keyword schemeFunction floor-remainder
+syn keyword schemeFunction floor/
+syn keyword schemeFunction flush-output-port
+syn keyword schemeFunction for-each
+syn keyword schemeFunction force
+syn keyword schemeFunction gcd
+syn keyword schemeFunction get-environment-variable
+syn keyword schemeFunction get-environment-variables
+syn keyword schemeFunction get-output-bytevector
+syn keyword schemeFunction get-output-string
+syn keyword schemeFunction imag-part
+syn keyword schemeFunction inexact
+syn keyword schemeFunction inexact->exact
+syn keyword schemeFunction inexact?
+syn keyword schemeFunction infinite?
+syn keyword schemeFunction input-port-open?
+syn keyword schemeFunction input-port?
+syn keyword schemeFunction integer->char
+syn keyword schemeFunction integer?
+syn keyword schemeFunction interaction-environment
+syn keyword schemeFunction jiffies-per-second
+syn keyword schemeFunction lcm
+syn keyword schemeFunction length
+syn keyword schemeFunction list
+syn keyword schemeFunction list->string
+syn keyword schemeFunction list->vector
+syn keyword schemeFunction list-copy
+syn keyword schemeFunction list-ref
+syn keyword schemeFunction list-set!
+syn keyword schemeFunction list-tail
+syn keyword schemeFunction list?
+syn keyword schemeFunction load
+syn keyword schemeFunction log
+syn keyword schemeFunction magnitude
+syn keyword schemeFunction make-bytevector
+syn keyword schemeFunction make-list
+syn keyword schemeFunction make-parameter
+syn keyword schemeFunction make-polar
+syn keyword schemeFunction make-promise
+syn keyword schemeFunction make-rectangular
+syn keyword schemeFunction make-string
+syn keyword schemeFunction make-vector
+syn keyword schemeFunction map
+syn keyword schemeFunction max
+syn keyword schemeFunction member
+syn keyword schemeFunction memq
+syn keyword schemeFunction memv
+syn keyword schemeFunction min
+syn keyword schemeFunction modulo
+syn keyword schemeFunction nan?
+syn keyword schemeFunction negative?
+syn keyword schemeFunction newline
+syn keyword schemeFunction not
+syn keyword schemeFunction null-environment
+syn keyword schemeFunction null?
+syn keyword schemeFunction number->string
+syn keyword schemeFunction number?
+syn keyword schemeFunction numerator
+syn keyword schemeFunction odd?
+syn keyword schemeFunction open-binary-input-file
+syn keyword schemeFunction open-binary-output-file
+syn keyword schemeFunction open-input-bytevector
+syn keyword schemeFunction open-input-file
+syn keyword schemeFunction open-input-string
+syn keyword schemeFunction open-output-bytevector
+syn keyword schemeFunction open-output-file
+syn keyword schemeFunction open-output-string
+syn keyword schemeFunction output-port-open?
+syn keyword schemeFunction output-port?
+syn keyword schemeFunction pair?
+syn keyword schemeFunction peek-char
+syn keyword schemeFunction peek-u8
+syn keyword schemeFunction port?
+syn keyword schemeFunction positive?
+syn keyword schemeFunction procedure?
+syn keyword schemeFunction promise?
+syn keyword schemeFunction quotient
+syn keyword schemeFunction raise
+syn keyword schemeFunction raise-continuable
+syn keyword schemeFunction rational?
+syn keyword schemeFunction rationalize
+syn keyword schemeFunction read
+syn keyword schemeFunction read-bytevector
+syn keyword schemeFunction read-bytevector!
+syn keyword schemeFunction read-char
+syn keyword schemeFunction read-error?
+syn keyword schemeFunction read-line
+syn keyword schemeFunction read-string
+syn keyword schemeFunction read-u8
+syn keyword schemeFunction real-part
+syn keyword schemeFunction real?
+syn keyword schemeFunction remainder
+syn keyword schemeFunction reverse
+syn keyword schemeFunction round
+syn keyword schemeFunction scheme-report-environment
+syn keyword schemeFunction set-car!
+syn keyword schemeFunction set-cdr!
+syn keyword schemeFunction sin
+syn keyword schemeFunction sqrt
+syn keyword schemeFunction square
+syn keyword schemeFunction string
+syn keyword schemeFunction string->list
+syn keyword schemeFunction string->number
+syn keyword schemeFunction string->symbol
+syn keyword schemeFunction string->utf8
+syn keyword schemeFunction string->vector
+syn keyword schemeFunction string-append
+syn keyword schemeFunction string-ci<=?
+syn keyword schemeFunction string-ci<?
+syn keyword schemeFunction string-ci=?
+syn keyword schemeFunction string-ci>=?
+syn keyword schemeFunction string-ci>?
+syn keyword schemeFunction string-copy
+syn keyword schemeFunction string-copy!
+syn keyword schemeFunction string-downcase
+syn keyword schemeFunction string-fill!
+syn keyword schemeFunction string-foldcase
+syn keyword schemeFunction string-for-each
+syn keyword schemeFunction string-length
+syn keyword schemeFunction string-map
+syn keyword schemeFunction string-ref
+syn keyword schemeFunction string-set!
+syn keyword schemeFunction string-upcase
+syn keyword schemeFunction string<=?
+syn keyword schemeFunction string<?
+syn keyword schemeFunction string=?
+syn keyword schemeFunction string>=?
+syn keyword schemeFunction string>?
+syn keyword schemeFunction string?
+syn keyword schemeFunction substring
+syn keyword schemeFunction symbol->string
+syn keyword schemeFunction symbol=?
+syn keyword schemeFunction symbol?
+syn keyword schemeFunction syntax-error
+syn keyword schemeFunction tan
+syn keyword schemeFunction textual-port?
+syn keyword schemeFunction transcript-off
+syn keyword schemeFunction transcript-on
+syn keyword schemeFunction truncate
+syn keyword schemeFunction truncate-quotient
+syn keyword schemeFunction truncate-remainder
+syn keyword schemeFunction truncate/
+syn keyword schemeFunction u8-ready?
+syn keyword schemeFunction utf8->string
+syn keyword schemeFunction values
+syn keyword schemeFunction vector
+syn keyword schemeFunction vector->list
+syn keyword schemeFunction vector->string
+syn keyword schemeFunction vector-append
+syn keyword schemeFunction vector-copy
+syn keyword schemeFunction vector-copy!
+syn keyword schemeFunction vector-fill!
+syn keyword schemeFunction vector-for-each
+syn keyword schemeFunction vector-length
+syn keyword schemeFunction vector-map
+syn keyword schemeFunction vector-ref
+syn keyword schemeFunction vector-set!
+syn keyword schemeFunction vector?
+syn keyword schemeFunction with-exception-handler
+syn keyword schemeFunction with-input-from-file
+syn keyword schemeFunction with-output-to-file
+syn keyword schemeFunction write
+syn keyword schemeFunction write-bytevector
+syn keyword schemeFunction write-char
+syn keyword schemeFunction write-shared
+syn keyword schemeFunction write-simple
+syn keyword schemeFunction write-string
+syn keyword schemeFunction write-u8
+syn keyword schemeFunction zero?
+
+hi def link schemeBoolean Boolean
+hi def link schemeCharacter Character
+hi def link schemeComment Comment
+hi def link schemeConstant Constant
+hi def link schemeData Delimiter
+hi def link schemeDatumComment Comment
+hi def link schemeDatumCommentForm Comment
+hi def link schemeDelimiter Delimiter
+hi def link schemeError Error
+hi def link schemeExtraSyntax Underlined
+hi def link schemeFunction Function
+hi def link schemeIdentifier Normal
+hi def link schemeImport PreProc
+hi def link schemeImportKeyword PreProc
+hi def link schemeKeyword Type
+hi def link schemeLibrarySyntax PreProc
+hi def link schemeMultilineComment Comment
+hi def link schemeNumber Number
+hi def link schemeParentheses Normal
+hi def link schemeQuasiquote Delimiter
+hi def link schemeQuote Delimiter
+hi def link schemeSpecialSyntax Special
+hi def link schemeString String
+hi def link schemeSymbol Normal
+hi def link schemeSyntax Statement
+hi def link schemeSyntaxSyntax PreProc
+hi def link schemeTypeSyntax Type
+
+let b:did_scheme_syntax = 1
+
+if exists('b:is_chicken') || exists('g:is_chicken')
+ exe 'ru! syntax/chicken.vim'
endif
-let b:current_syntax = "scheme"
-
-let &cpo = s:cpo_save
-unlet s:cpo_save
+unlet b:did_scheme_syntax
+let b:current_syntax = 'scheme'
+let &cpo = s:cpo
+unlet s:cpo
diff --git a/runtime/syntax/scilab.vim b/runtime/syntax/scilab.vim
index 1bfc003678..03e123b058 100644
--- a/runtime/syntax/scilab.vim
+++ b/runtime/syntax/scilab.vim
@@ -9,11 +9,8 @@
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -66,49 +63,39 @@ syn match scilabOverload "%[A-Za-z0-9?!_#$]\+_[A-Za-z0-9?!_#$]\+"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_scilab_syntax_inits")
- if version < 508
- let did_scilab_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink scilabStatement Statement
- HiLink scilabFunction Keyword
- HiLink scilabPredicate Keyword
- HiLink scilabKeyword Keyword
- HiLink scilabDebug Debug
- HiLink scilabRepeat Repeat
- HiLink scilabConditional Conditional
- HiLink scilabMultiplex Conditional
-
- HiLink scilabConstant Constant
- HiLink scilabBoolean Boolean
-
- HiLink scilabDelimiter Delimiter
- HiLink scilabMlistAccess Delimiter
- HiLink scilabComparison Operator
- HiLink scilabLogical Operator
- HiLink scilabAssignment Operator
- HiLink scilabArithmetic Operator
- HiLink scilabRange Operator
- HiLink scilabLineContinuation Underlined
- HiLink scilabTransposition Operator
-
- HiLink scilabTodo Todo
- HiLink scilabComment Comment
-
- HiLink scilabNumber Number
- HiLink scilabString String
-
- HiLink scilabIdentifier Identifier
- HiLink scilabOverload Special
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link scilabStatement Statement
+hi def link scilabFunction Keyword
+hi def link scilabPredicate Keyword
+hi def link scilabKeyword Keyword
+hi def link scilabDebug Debug
+hi def link scilabRepeat Repeat
+hi def link scilabConditional Conditional
+hi def link scilabMultiplex Conditional
+
+hi def link scilabConstant Constant
+hi def link scilabBoolean Boolean
+
+hi def link scilabDelimiter Delimiter
+hi def link scilabMlistAccess Delimiter
+hi def link scilabComparison Operator
+hi def link scilabLogical Operator
+hi def link scilabAssignment Operator
+hi def link scilabArithmetic Operator
+hi def link scilabRange Operator
+hi def link scilabLineContinuation Underlined
+hi def link scilabTransposition Operator
+
+hi def link scilabTodo Todo
+hi def link scilabComment Comment
+
+hi def link scilabNumber Number
+hi def link scilabString String
+
+hi def link scilabIdentifier Identifier
+hi def link scilabOverload Special
+
let b:current_syntax = "scilab"
diff --git a/runtime/syntax/sd.vim b/runtime/syntax/sd.vim
index 7fa0e04492..b497ba5eaa 100644
--- a/runtime/syntax/sd.vim
+++ b/runtime/syntax/sd.vim
@@ -5,9 +5,8 @@
" URL: http://netstudent.polito.it/vim_syntax/
" Last Change: 2012 Feb 03 by Thilo Six
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -51,29 +50,20 @@ syn keyword sdSpecial TRUE FALSE NULL
syn keyword sdDelimiter STREAM STREAM_END
syn match sdError /^search .\{257,}/
-if version >= 508 || !exists("did_config_syntax_inits")
- if version < 508
- let did_config_syntax_inits = 1
- command! -nargs=+ HiLink hi link <args>
- else
- command! -nargs=+ HiLink hi def link <args>
- endif
- HiLink sdIP Number
- HiLink sdHostname Type
- HiLink sdEncoding Identifier
- HiLink sdCoding Identifier
- HiLink sdSource Identifier
- HiLink sdComment Comment
- HiLink sdIPError Error
- HiLink sdError Error
- HiLink sdStatement Statement
- HiLink sdIPSpecial Special
- HiLink sdSpecial Special
- HiLink sdDelimiter Delimiter
+hi def link sdIP Number
+hi def link sdHostname Type
+hi def link sdEncoding Identifier
+hi def link sdCoding Identifier
+hi def link sdSource Identifier
+hi def link sdComment Comment
+hi def link sdIPError Error
+hi def link sdError Error
+hi def link sdStatement Statement
+hi def link sdIPSpecial Special
+hi def link sdSpecial Special
+hi def link sdDelimiter Delimiter
- delcommand HiLink
-endif
let b:current_syntax = "sd"
diff --git a/runtime/syntax/sdl.vim b/runtime/syntax/sdl.vim
index b524b72266..7df38d1955 100644
--- a/runtime/syntax/sdl.vim
+++ b/runtime/syntax/sdl.vim
@@ -3,11 +3,8 @@
" Maintainer: Michael Piefel <entwurf@piefel.de>
" Last Change: 2 May 2001
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -129,38 +126,27 @@ syn keyword sdlType STRING OBJECT IDENTIFIER NULL
syn sync ccomment sdlComment
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_sdl_syn_inits")
- if version < 508
- let did_sdl_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- command -nargs=+ Hi hi <args>
- else
- command -nargs=+ HiLink hi def link <args>
- command -nargs=+ Hi hi def <args>
- endif
-
- HiLink sdlException Label
- HiLink sdlConditional sdlStatement
- HiLink sdlVirtual sdlStatement
- HiLink sdlExported sdlFlag
- HiLink sdlCommentError sdlError
- HiLink sdlOperator Operator
- HiLink sdlStructure sdlType
- Hi sdlStatement term=bold ctermfg=4 guifg=Blue
- Hi sdlFlag term=bold ctermfg=4 guifg=Blue gui=italic
- Hi sdlNewState term=italic ctermfg=2 guifg=Magenta gui=underline
- Hi sdlInput term=bold guifg=Red
- HiLink sdlType Type
- HiLink sdlString String
- HiLink sdlComment Comment
- HiLink sdlSpecial Special
- HiLink sdlError Error
-
- delcommand HiLink
- delcommand Hi
-endif
+" Only when an item doesn't have highlighting yet
+command -nargs=+ Hi hi def <args>
+
+hi def link sdlException Label
+hi def link sdlConditional sdlStatement
+hi def link sdlVirtual sdlStatement
+hi def link sdlExported sdlFlag
+hi def link sdlCommentError sdlError
+hi def link sdlOperator Operator
+hi def link sdlStructure sdlType
+Hi sdlStatement term=bold ctermfg=4 guifg=Blue
+Hi sdlFlag term=bold ctermfg=4 guifg=Blue gui=italic
+Hi sdlNewState term=italic ctermfg=2 guifg=Magenta gui=underline
+Hi sdlInput term=bold guifg=Red
+hi def link sdlType Type
+hi def link sdlString String
+hi def link sdlComment Comment
+hi def link sdlSpecial Special
+hi def link sdlError Error
+
+delcommand Hi
let b:current_syntax = "sdl"
diff --git a/runtime/syntax/sed.vim b/runtime/syntax/sed.vim
index f0f80300d6..63b39db81f 100644
--- a/runtime/syntax/sed.vim
+++ b/runtime/syntax/sed.vim
@@ -4,11 +4,8 @@
" URL: http://folk.uio.no/hakonrk/vim/syntax/sed.vim
" Last Change: 2010 May 29
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syn clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -49,8 +46,12 @@ syn match sedReplaceMeta "&\|\\\($\|.\)" contains=sedTab contained
" Metacharacters: $ * . \ ^ [ ~
" @ is used as delimiter and treated on its own below
let __at = char2nr("@")
-let __sed_i = char2nr(" ") " ASCII: 32
-let __sed_last = 126
+let __sed_i = char2nr(" ") " ASCII: 32, EBCDIC: 64
+if has("ebcdic")
+ let __sed_last = 255
+else
+ let __sed_last = 126
+endif
let __sed_metacharacters = '$*.\^[~'
while __sed_i <= __sed_last
let __sed_delimiter = escape(nr2char(__sed_i), __sed_metacharacters)
@@ -71,45 +72,36 @@ syn region sedReplacement64 matchgroup=Special start=+@\(\\\\\|\\@\)*+ skip=+[^\
" (y) does not allow any flags. To save memory, I ignore this problem.
syn match sedST "[sy]" nextgroup=sedRegexp\d\+
-if version >= 508 || !exists("did_sed_syntax_inits")
- if version < 508
- let did_sed_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink sedAddress Macro
- HiLink sedACI NONE
- HiLink sedBranch Label
- HiLink sedComment Comment
- HiLink sedDelete Function
- HiLink sedError Error
- HiLink sedFlag Type
- HiLink sedFlagwrite Constant
- HiLink sedFunction Function
- HiLink sedLabel Label
- HiLink sedLineCont Special
- HiLink sedPutHoldspc Function
- HiLink sedReplaceMeta Special
- HiLink sedRegexpMeta Special
- HiLink sedRW Constant
- HiLink sedSemicolon Special
- HiLink sedST Function
- HiLink sedSpecial Special
- HiLink sedWhitespace NONE
- if exists("highlight_sedtabs")
- HiLink sedTab Todo
- endif
- let __sed_i = char2nr(" ") " ASCII: 32
- while __sed_i <= __sed_last
- exe "HiLink sedRegexp".__sed_i "Macro"
- exe "HiLink sedReplacement".__sed_i "NONE"
- let __sed_i = __sed_i + 1
- endwhile
- delcommand HiLink
+hi def link sedAddress Macro
+hi def link sedACI NONE
+hi def link sedBranch Label
+hi def link sedComment Comment
+hi def link sedDelete Function
+hi def link sedError Error
+hi def link sedFlag Type
+hi def link sedFlagwrite Constant
+hi def link sedFunction Function
+hi def link sedLabel Label
+hi def link sedLineCont Special
+hi def link sedPutHoldspc Function
+hi def link sedReplaceMeta Special
+hi def link sedRegexpMeta Special
+hi def link sedRW Constant
+hi def link sedSemicolon Special
+hi def link sedST Function
+hi def link sedSpecial Special
+hi def link sedWhitespace NONE
+if exists("highlight_sedtabs")
+hi def link sedTab Todo
endif
+let __sed_i = char2nr(" ") " ASCII: 32, EBCDIC: 64
+while __sed_i <= __sed_last
+exe "hi def link sedRegexp".__sed_i "Macro"
+exe "hi def link sedReplacement".__sed_i "NONE"
+let __sed_i = __sed_i + 1
+endwhile
+
unlet __sed_i __sed_last __sed_delimiter __sed_metacharacters
diff --git a/runtime/syntax/sendpr.vim b/runtime/syntax/sendpr.vim
index 6cf9395fe9..2e07802047 100644
--- a/runtime/syntax/sendpr.vim
+++ b/runtime/syntax/sendpr.vim
@@ -5,11 +5,8 @@
"
" http://raisdorf.net/files/misc/send-pr.vim
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/sensors.vim b/runtime/syntax/sensors.vim
index 63cececc68..f8bc4c696b 100644
--- a/runtime/syntax/sensors.vim
+++ b/runtime/syntax/sensors.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: sensors.conf(5) - libsensors configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: sensors.conf(5) - libsensors configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/services.vim b/runtime/syntax/services.vim
index 661f57a7e8..94e39ae219 100644
--- a/runtime/syntax/services.vim
+++ b/runtime/syntax/services.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: services(5) - Internet network services list
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: services(5) - Internet network services list
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/setserial.vim b/runtime/syntax/setserial.vim
index cdd309d7f2..967fa5f6d2 100644
--- a/runtime/syntax/setserial.vim
+++ b/runtime/syntax/setserial.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: setserial(8) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: setserial(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/sgml.vim b/runtime/syntax/sgml.vim
index c0c3643dd2..d60040c5d9 100644
--- a/runtime/syntax/sgml.vim
+++ b/runtime/syntax/sgml.vim
@@ -5,11 +5,8 @@
" Filenames: *.sgml,*.sgm
" $Id: sgml.vim,v 1.1 2004/06/13 17:52:57 vimboss Exp $
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/sgmldecl.vim b/runtime/syntax/sgmldecl.vim
index 13551b21c1..6c1cde15ae 100644
--- a/runtime/syntax/sgmldecl.vim
+++ b/runtime/syntax/sgmldecl.vim
@@ -5,11 +5,8 @@
" You can modify and maintain this file, in other case send comments
" the maintainer email address.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
let s:keepcpo= &cpo
@@ -52,30 +49,20 @@ syn sync lines=250
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_sgmldecl_syntax_init")
- if version < 508
- let did_sgmldecl_syntax_init = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink sgmldeclDeclKeys Keyword
- HiLink sgmldeclTypes Type
- HiLink sgmldeclConst Constant
- HiLink sgmldeclNConst Constant
- HiLink sgmldeclString String
- HiLink sgmldeclDeclBlock Normal
- HiLink sgmldeclBool Boolean
- HiLink sgmldeclSpecial Special
- HiLink sgmldeclComment Comment
- HiLink sgmldeclStatem Statement
- HiLink sgmldeclVariables Type
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link sgmldeclDeclKeys Keyword
+hi def link sgmldeclTypes Type
+hi def link sgmldeclConst Constant
+hi def link sgmldeclNConst Constant
+hi def link sgmldeclString String
+hi def link sgmldeclDeclBlock Normal
+hi def link sgmldeclBool Boolean
+hi def link sgmldeclSpecial Special
+hi def link sgmldeclComment Comment
+hi def link sgmldeclStatem Statement
+hi def link sgmldeclVariables Type
+
let b:current_syntax = "sgmldecl"
diff --git a/runtime/syntax/sgmllnx.vim b/runtime/syntax/sgmllnx.vim
index 28224f601e..ccd78f494a 100644
--- a/runtime/syntax/sgmllnx.vim
+++ b/runtime/syntax/sgmllnx.vim
@@ -3,11 +3,8 @@
" Maintainer: SungHyun Nam <goweol@gmail.com>
" Last Change: 2013 May 13
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -36,31 +33,21 @@ syn region sgmllnxComment start=+<!--+ end=+-->+
syn region sgmllnxDocType start=+<!doctype+ end=+>+
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_sgmllnx_syn_inits")
- if version < 508
- let did_sgmllnx_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
+
+hi def link sgmllnxTag2 Function
+hi def link sgmllnxTagN2 Function
+hi def link sgmllnxTag Special
+hi def link sgmllnxEndTag Special
+hi def link sgmllnxParen Special
+hi def link sgmllnxEntity Type
+hi def link sgmllnxDocEnt Type
+hi def link sgmllnxTagName Statement
+hi def link sgmllnxComment Comment
+hi def link sgmllnxSpecial Special
+hi def link sgmllnxDocType PreProc
+hi def link sgmllnxTagError Error
- HiLink sgmllnxTag2 Function
- HiLink sgmllnxTagN2 Function
- HiLink sgmllnxTag Special
- HiLink sgmllnxEndTag Special
- HiLink sgmllnxParen Special
- HiLink sgmllnxEntity Type
- HiLink sgmllnxDocEnt Type
- HiLink sgmllnxTagName Statement
- HiLink sgmllnxComment Comment
- HiLink sgmllnxSpecial Special
- HiLink sgmllnxDocType PreProc
- HiLink sgmllnxTagError Error
-
- delcommand HiLink
-endif
let b:current_syntax = "sgmllnx"
diff --git a/runtime/syntax/sh.vim b/runtime/syntax/sh.vim
index 6ef5bf0d16..5e0d1fd76a 100644
--- a/runtime/syntax/sh.vim
+++ b/runtime/syntax/sh.vim
@@ -2,35 +2,38 @@
" Language: shell (sh) Korn shell (ksh) bash (sh)
" Maintainer: Charles E. Campbell <NdrOchipS@PcampbellAfamily.Mbiz>
" Previous Maintainer: Lennart Schultz <Lennart.Schultz@ecmwf.int>
-" Last Change: Apr 11, 2016
-" Version: 147
+" Last Change: Sep 04, 2018
+" Version: 182
" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_SH
" For options and settings, please use: :help ft-sh-syntax
" This file includes many ideas from Eric Brunet (eric.brunet@ens.fr)
-" For version 5.x: Clear all syntax items {{{1
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded {{{1
+if exists("b:current_syntax")
finish
endif
" trying to answer the question: which shell is /bin/sh, really?
" If the user has not specified any of g:is_kornshell, g:is_bash, g:is_posix, g:is_sh, then guess.
-if !exists("g:is_kornshell") && !exists("g:is_bash") && !exists("g:is_posix") && !exists("g:is_sh")
+if getline(1) =~ '\<ksh$'
+ let b:is_kornshell = 1
+elseif getline(1) =~ '\<bash$'
+ let b:is_bash = 1
+elseif getline(1) =~ '\<dash$'
+ let b:is_posix = 1
+elseif !exists("g:is_kornshell") && !exists("g:is_bash") && !exists("g:is_posix") && !exists("g:is_sh")
let s:shell = ""
if executable("/bin/sh")
let s:shell = resolve("/bin/sh")
elseif executable("/usr/bin/sh")
let s:shell = resolve("/usr/bin/sh")
endif
- if s:shell =~ 'bash$'
- let g:is_bash= 1
- elseif s:shell =~ 'ksh$'
- let g:is_kornshell = 1
+ if s:shell =~ 'ksh$'
+ let b:is_kornshell= 1
+ elseif s:shell =~ 'bash$'
+ let b:is_bash = 1
elseif s:shell =~ 'dash$'
- let g:is_posix = 1
+ let b:is_posix = 1
endif
unlet s:shell
endif
@@ -86,8 +89,12 @@ if g:sh_fold_enabled && &fdm == "manual"
endif
" set up the syntax-highlighting iskeyword
-if has("patch-7.4.1141")
- exe "syn iskeyword ".&iskeyword.",-"
+if has("patch-7.4.1142")
+ if exists("b:is_bash")
+ exe "syn iskeyword ".&iskeyword.",-,:"
+ else
+ exe "syn iskeyword ".&iskeyword.",-"
+ endif
endif
" Set up folding commands for shell {{{1
@@ -114,22 +121,22 @@ syn case match
" Clusters: contains=@... clusters {{{1
"==================================
syn cluster shErrorList contains=shDoError,shIfError,shInError,shCaseError,shEsacError,shCurlyError,shParenError,shTestError,shOK
-if exists("b:is_kornshell")
+if exists("b:is_kornshell") || exists("b:is_bash")
syn cluster ErrorList add=shDTestError
endif
-syn cluster shArithParenList contains=shArithmetic,shCaseEsac,shComment,shDeref,shDo,shDerefSimple,shEcho,shEscape,shNumber,shOperator,shPosnParm,shExSingleQuote,shExDoubleQuote,shRedir,shSingleQuote,shDoubleQuote,shStatement,shVariable,shAlias,shTest,shCtrlSeq,shSpecial,shParen,bashSpecialVariables,bashStatement,shIf,shFor
+syn cluster shArithParenList contains=shArithmetic,shCaseEsac,shComment,shDeref,shDo,shDerefSimple,shEcho,shEscape,shNumber,shOperator,shPosnParm,shExSingleQuote,shExDoubleQuote,shHereString,shRedir,shSingleQuote,shDoubleQuote,shStatement,shVariable,shAlias,shTest,shCtrlSeq,shSpecial,shParen,bashSpecialVariables,bashStatement,shIf,shFor
syn cluster shArithList contains=@shArithParenList,shParenError
-syn cluster shCaseEsacList contains=shCaseStart,shCase,shCaseBar,shCaseIn,shComment,shDeref,shDerefSimple,shCaseCommandSub,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote,shCtrlSeq,@shErrorList,shStringSpecial,shCaseRange
-syn cluster shCaseList contains=@shCommandSubList,shCaseEsac,shColon,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq
-syn cluster shCommandSubList contains=shAlias,shArithmetic,shComment,shCmdParenRegion,shCtrlSeq,shDeref,shDerefSimple,shDoubleQuote,shEcho,shEscape,shExDoubleQuote,shExpr,shExSingleQuote,shNumber,shOperator,shOption,shPosnParm,shSingleQuote,shSpecial,shStatement,shSubSh,shTest,shVariable
+syn cluster shCaseEsacList contains=shCaseStart,shCaseLabel,shCase,shCaseBar,shCaseIn,shComment,shDeref,shDerefSimple,shCaseCommandSub,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote,shCtrlSeq,@shErrorList,shStringSpecial,shCaseRange
+syn cluster shCaseList contains=@shCommandSubList,shCaseEsac,shColon,shCommandSub,shCommandSubBQ,shComment,shDo,shEcho,shExpr,shFor,shForPP,shHereDoc,shIf,shHereString,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq
+syn cluster shCommandSubList contains=shAlias,shArithmetic,shCmdParenRegion,shCommandSub,shComment,shCtrlSeq,shDeref,shDerefSimple,shDoubleQuote,shEcho,shEscape,shExDoubleQuote,shExpr,shExSingleQuote,shHereDoc,shNumber,shOperator,shOption,shPosnParm,shHereString,shRedir,shSingleQuote,shSpecial,shStatement,shSubSh,shTest,shVariable
syn cluster shCurlyList contains=shNumber,shComma,shDeref,shDerefSimple,shDerefSpecial
-syn cluster shDblQuoteList contains=shCommandSub,shDeref,shDerefSimple,shEscape,shPosnParm,shCtrlSeq,shSpecial
+syn cluster shDblQuoteList contains=shArithmetic,shCommandSub,shCommandSubBQ,shDeref,shDerefSimple,shEscape,shPosnParm,shCtrlSeq,shSpecial,shSpecialDQ
syn cluster shDerefList contains=shDeref,shDerefSimple,shDerefVar,shDerefSpecial,shDerefWordError,shDerefPSR,shDerefPPS
-syn cluster shDerefVarList contains=shDerefOp,shDerefVarArray,shDerefOpError
-syn cluster shEchoList contains=shArithmetic,shCommandSub,shDeref,shDerefSimple,shEscape,shExpr,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shCtrlSeq,shEchoQuote
+syn cluster shDerefVarList contains=shDerefOff,shDerefOp,shDerefVarArray,shDerefOpError
+syn cluster shEchoList contains=shArithmetic,shCommandSub,shCommandSubBQ,shDeref,shDerefSimple,shEscape,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shCtrlSeq,shEchoQuote
syn cluster shExprList1 contains=shCharClass,shNumber,shOperator,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shExpr,shDblBrace,shDeref,shDerefSimple,shCtrlSeq
syn cluster shExprList2 contains=@shExprList1,@shCaseList,shTest
-syn cluster shFunctionList contains=@shCommandSubList,shCaseEsac,shColon,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shOption,shRedir,shSetList,shSource,shStatement,shVariable,shOperator,shCtrlSeq
+syn cluster shFunctionList contains=@shCommandSubList,shCaseEsac,shColon,shComment,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shOption,shHereString,shRedir,shSetList,shSource,shStatement,shVariable,shOperator,shCtrlSeq
if exists("b:is_kornshell") || exists("b:is_bash")
syn cluster shFunctionList add=shRepeat
syn cluster shFunctionList add=shDblBrace,shDblParen
@@ -137,11 +144,14 @@ endif
syn cluster shHereBeginList contains=@shCommandSubList
syn cluster shHereList contains=shBeginHere,shHerePayload
syn cluster shHereListDQ contains=shBeginHere,@shDblQuoteList,shHerePayload
-syn cluster shIdList contains=shCommandSub,shWrapLineOperator,shSetOption,shDeref,shDerefSimple,shRedir,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shExpr,shCtrlSeq,shStringSpecial,shAtExpr
+syn cluster shIdList contains=shCommandSub,shCommandSubBQ,shWrapLineOperator,shSetOption,shComment,shDeref,shDerefSimple,shHereString,shRedir,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shExpr,shCtrlSeq,shStringSpecial,shAtExpr
syn cluster shIfList contains=@shLoopList,shDblBrace,shDblParen,shFunctionKey,shFunctionOne,shFunctionTwo
syn cluster shLoopList contains=@shCaseList,@shErrorList,shCaseEsac,shConditional,shDblBrace,shExpr,shFor,shForPP,shIf,shOption,shSet,shTest,shTestOpr,shTouch
-syn cluster shSubShList contains=@shCommandSubList,shCaseEsac,shColon,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shIf,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq,shOperator
-syn cluster shTestList contains=shCharClass,shCommandSub,shCtrlSeq,shDeref,shDerefSimple,shDoubleQuote,shExDoubleQuote,shExpr,shExSingleQuote,shNumber,shOperator,shSingleQuote,shTest,shTestOpr
+syn cluster shPPSRightList contains=shComment,shDeref,shDerefSimple,shEscape,shPosnParm
+syn cluster shSubShList contains=@shCommandSubList,shCommandSubBQ,shCaseEsac,shColon,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shIf,shHereString,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq,shOperator
+syn cluster shTestList contains=shCharClass,shCommandSub,shCommandSubBQ,shCtrlSeq,shDeref,shDerefSimple,shDoubleQuote,shSpecialDQ,shExDoubleQuote,shExpr,shExSingleQuote,shNumber,shOperator,shSingleQuote,shTest,shTestOpr
+syn cluster shNoZSList contains=shSpecialNoZS
+syn cluster shForList contains=shTestOpr,shNumber,shDerefSimple,shDeref,shCommandSub,shCommandSubBQ,shArithmetic
" Echo: {{{1
" ====
@@ -155,14 +165,14 @@ syn region shEmbeddedEcho contained matchgroup=shStatement start="\<print\>" ski
" Alias: {{{1
" =====
-if exists("b:is_kornshell") || exists("b:is_bash")
+if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
syn match shStatement "\<alias\>"
syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]\+\)\@=" skip="\\$" end="\>\|`"
syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]\+=\)\@=" skip="\\$" end="="
" Touch: {{{1
" =====
- syn match shTouch '\<touch\>[^;#]*' skipwhite nextgroup=shTouchList contains=shTouchCmd
+ syn match shTouch '\<touch\>[^;#]*' skipwhite nextgroup=shComment contains=shTouchCmd,shDoubleQuote,shSingleQuote,shDeref,shDerefSimple
syn match shTouchCmd '\<touch\>' contained
endif
@@ -177,7 +187,7 @@ if !exists("g:sh_no_error")
syn match shCurlyError "}"
syn match shParenError ")"
syn match shOK '\.\(done\|fi\|in\|esac\)'
- if exists("b:is_kornshell")
+ if exists("b:is_kornshell") || exists("b:is_bash")
syn match shDTestError "]]"
endif
syn match shTestError "]"
@@ -205,22 +215,23 @@ syn match shPattern "\<\S\+\())\)\@=" contained contains=shExSingleQuote,shSin
" Subshells: {{{1
" ==========
-syn region shExpr transparent matchgroup=shExprRegion start="{" end="}" contains=@shExprList2 nextgroup=shMoreSpecial
-syn region shSubSh transparent matchgroup=shSubShRegion start="[^(]\zs(" end=")" contains=@shSubShList nextgroup=shMoreSpecial
+syn region shExpr transparent matchgroup=shExprRegion start="{" end="}" contains=@shExprList2 nextgroup=shSpecialNxt
+syn region shSubSh transparent matchgroup=shSubShRegion start="[^(]\zs(" end=")" contains=@shSubShList nextgroup=shSpecialNxt
" Tests: {{{1
"=======
syn region shExpr matchgroup=shRange start="\[" skip=+\\\\\|\\$\|\[+ end="\]" contains=@shTestList,shSpecial
syn region shTest transparent matchgroup=shStatement start="\<test\s" skip=+\\\\\|\\$+ matchgroup=NONE end="[;&|]"me=e-1 end="$" contains=@shExprList1
-syn region shNoQuote start='\S' skip='\%(\\\\\)*\\.' end='\ze\s' contained
+syn region shNoQuote start='\S' skip='\%(\\\\\)*\\.' end='\ze\s' end="\ze['"]" contained contains=shDerefSimple,shDeref
+syn match shAstQuote contained '\*\ze"' nextgroup=shString
syn match shTestOpr contained '[^-+/%]\zs=' skipwhite nextgroup=shTestDoubleQuote,shTestSingleQuote,shTestPattern
syn match shTestOpr contained "<=\|>=\|!=\|==\|=\~\|-.\>\|-\(nt\|ot\|ef\|eq\|ne\|lt\|le\|gt\|ge\)\>\|[!<>]"
syn match shTestPattern contained '\w\+'
-syn region shTestDoubleQuote contained start='\%(\%(\\\\\)*\\\)\@<!"' skip=+\\\\\|\\"+ end='"'
-syn match shTestSingleQuote contained '\\.'
+syn region shTestDoubleQuote contained start='\%(\%(\\\\\)*\\\)\@<!"' skip=+\\\\\|\\"+ end='"' contains=shDeref,shDerefSimple,shDerefSpecial
+syn match shTestSingleQuote contained '\\.' nextgroup=shTestSingleQuote
syn match shTestSingleQuote contained "'[^']*'"
if exists("b:is_kornshell") || exists("b:is_bash")
- syn region shDblBrace matchgroup=Delimiter start="\[\[" skip=+\%(\\\\\)*\\$+ end="\]\]" contains=@shTestList,shNoQuote,shComment
+ syn region shDblBrace matchgroup=Delimiter start="\[\[" skip=+\%(\\\\\)*\\$+ end="\]\]" contains=@shTestList,shAstQuote,shNoQuote,shComment
syn region shDblParen matchgroup=Delimiter start="((" skip=+\%(\\\\\)*\\$+ end="))" contains=@shTestList,shComment
endif
@@ -233,14 +244,16 @@ syn match shCharClass contained "\[:\(backspace\|escape\|return\|xdigit\|alnum
ShFoldIfDoFor syn region shDo transparent matchgroup=shConditional start="\<do\>" matchgroup=shConditional end="\<done\>" contains=@shLoopList
ShFoldIfDoFor syn region shIf transparent matchgroup=shConditional start="\<if\_s" matchgroup=shConditional skip=+-fi\>+ end="\<;\_s*then\>" end="\<fi\>" contains=@shIfList
ShFoldIfDoFor syn region shFor matchgroup=shLoop start="\<for\ze\_s\s*\%(((\)\@!" end="\<in\>" end="\<do\>"me=e-2 contains=@shLoopList,shDblParen skipwhite nextgroup=shCurlyIn
-ShFoldIfDoFor syn region shForPP matchgroup=shLoop start='\<for\>\_s*((' end='))' contains=shTestOpr
+ShFoldIfDoFor syn region shForPP matchgroup=shLoop start='\<for\>\_s*((' end='))' contains=@shForList
-if exists("b:is_kornshell") || exists("b:is_bash")
+if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
syn cluster shCaseList add=shRepeat
syn cluster shFunctionList add=shRepeat
- syn region shRepeat matchgroup=shLoop start="\<while\_s" end="\<in\_s" end="\<do\>"me=e-2 contains=@shLoopList,shDblParen,shDblBrace
- syn region shRepeat matchgroup=shLoop start="\<until\_s" end="\<in\_s" end="\<do\>"me=e-2 contains=@shLoopList,shDblParen,shDblBrace
- syn region shCaseEsac matchgroup=shConditional start="\<select\s" matchgroup=shConditional end="\<in\>" end="\<do\>" contains=@shLoopList
+ syn region shRepeat matchgroup=shLoop start="\<while\_s" end="\<do\>"me=e-2 contains=@shLoopList,shDblParen,shDblBrace
+ syn region shRepeat matchgroup=shLoop start="\<until\_s" end="\<do\>"me=e-2 contains=@shLoopList,shDblParen,shDblBrace
+ if !exists("b:is_posix")
+ syn region shCaseEsac matchgroup=shConditional start="\<select\s" matchgroup=shConditional end="\<in\>" end="\<do\>" contains=@shLoopList
+ endif
else
syn region shRepeat matchgroup=shLoop start="\<while\_s" end="\<do\>"me=e-2 contains=@shLoopList
syn region shRepeat matchgroup=shLoop start="\<until\_s" end="\<do\>"me=e-2 contains=@shLoopList
@@ -250,10 +263,15 @@ syn match shComma contained ","
" Case: case...esac {{{1
" ====
-syn match shCaseBar contained skipwhite "\(^\|[^\\]\)\(\\\\\)*\zs|" nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote
-syn match shCaseStart contained skipwhite skipnl "(" nextgroup=shCase,shCaseBar
-ShFoldIfDoFor syn region shCase contained skipwhite skipnl matchgroup=shSnglCase start="\%(\\.\|[^#$()'" \t]\)\{-}\zs)" end=";;" end="esac"me=s-1 contains=@shCaseList nextgroup=shCaseStart,shCase,shComment
-ShFoldIfDoFor syn region shCaseEsac matchgroup=shConditional start="\<case\>" end="\<esac\>" contains=@shCaseEsacList
+syn match shCaseBar contained skipwhite "\(^\|[^\\]\)\(\\\\\)*\zs|" nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote
+syn match shCaseStart contained skipwhite skipnl "(" nextgroup=shCase,shCaseBar
+syn match shCaseLabel contained skipwhite "\%(\\.\|[-a-zA-Z0-9_*.]\)\+" contains=shCharClass
+if exists("b:is_bash")
+ ShFoldIfDoFor syn region shCase contained skipwhite skipnl matchgroup=shSnglCase start="\%(\\.\|[^#$()'" \t]\)\{-}\zs)" end=";;" end=";&" end=";;&" end="esac"me=s-1 contains=@shCaseList nextgroup=shCaseStart,shCase,shComment
+else
+ ShFoldIfDoFor syn region shCase contained skipwhite skipnl matchgroup=shSnglCase start="\%(\\.\|[^#$()'" \t]\)\{-}\zs)" end=";;" end="esac"me=s-1 contains=@shCaseList nextgroup=shCaseStart,shCase,shComment
+endif
+ShFoldIfDoFor syn region shCaseEsac matchgroup=shConditional start="\<case\>" end="\<esac\>" contains=@shCaseEsacList
syn keyword shCaseIn contained skipwhite skipnl in nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote
if exists("b:is_bash")
@@ -273,8 +291,8 @@ endif
" Misc: {{{1
"======
syn match shWrapLineOperator "\\$"
-syn region shCommandSub start="`" skip="\\\\\|\\." end="`" contains=@shCommandSubList
-syn match shEscape contained '\%(^\)\@!\%(\\\\\)*\\.'
+syn region shCommandSubBQ start="`" skip="\\\\\|\\." end="`" contains=shBQComment,@shCommandSubList
+syn match shEscape contained '\%(^\)\@!\%(\\\\\)*\\.' nextgroup=shSingleQuote,shDoubleQuote,shComment
" $() and $(()): {{{1
" $(..) is not supported by sh (Bourne shell). However, apparently
@@ -282,7 +300,7 @@ syn match shEscape contained '\%(^\)\@!\%(\\\\\)*\\.'
" (ie. Posix compliant shell). /bin/ksh should work for those
" systems too, however, so the following syntax will flag $(..) as
" an Error under /bin/sh. By consensus of vimdev'ers!
-if exists("b:is_kornshell") || exists("b:is_bash")
+if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
syn region shCommandSub matchgroup=shCmdSubRegion start="\$(" skip='\\\\\|\\.' end=")" contains=@shCommandSubList
syn region shArithmetic matchgroup=shArithRegion start="\$((" skip='\\\\\|\\.' end="))" contains=@shArithList
syn region shArithmetic matchgroup=shArithRegion start="\$\[" skip='\\\\\|\\.' end="\]" contains=@shArithList
@@ -296,12 +314,12 @@ if exists("b:is_bash")
syn cluster shCommandSubList add=bashSpecialVariables,bashStatement
syn cluster shCaseList add=bashAdminStatement,bashStatement
syn keyword bashSpecialVariables contained auto_resume BASH BASH_ALIASES BASH_ALIASES BASH_ARGC BASH_ARGC BASH_ARGV BASH_ARGV BASH_CMDS BASH_CMDS BASH_COMMAND BASH_COMMAND BASH_ENV BASH_EXECUTION_STRING BASH_EXECUTION_STRING BASH_LINENO BASH_LINENO BASHOPTS BASHOPTS BASHPID BASHPID BASH_REMATCH BASH_REMATCH BASH_SOURCE BASH_SOURCE BASH_SUBSHELL BASH_SUBSHELL BASH_VERSINFO BASH_VERSION BASH_XTRACEFD BASH_XTRACEFD CDPATH COLUMNS COLUMNS COMP_CWORD COMP_CWORD COMP_KEY COMP_KEY COMP_LINE COMP_LINE COMP_POINT COMP_POINT COMPREPLY COMPREPLY COMP_TYPE COMP_TYPE COMP_WORDBREAKS COMP_WORDBREAKS COMP_WORDS COMP_WORDS COPROC COPROC DIRSTACK EMACS EMACS ENV ENV EUID FCEDIT FIGNORE FUNCNAME FUNCNAME FUNCNEST FUNCNEST GLOBIGNORE GROUPS histchars HISTCMD HISTCONTROL HISTFILE HISTFILESIZE HISTIGNORE HISTSIZE HISTTIMEFORMAT HISTTIMEFORMAT HOME HOSTFILE HOSTNAME HOSTTYPE IFS IGNOREEOF INPUTRC LANG LC_ALL LC_COLLATE LC_CTYPE LC_CTYPE LC_MESSAGES LC_NUMERIC LC_NUMERIC LINENO LINES LINES MACHTYPE MAIL MAILCHECK MAILPATH MAPFILE MAPFILE OLDPWD OPTARG OPTERR OPTIND OSTYPE PATH PIPESTATUS POSIXLY_CORRECT POSIXLY_CORRECT PPID PROMPT_COMMAND PS1 PS2 PS3 PS4 PWD RANDOM READLINE_LINE READLINE_LINE READLINE_POINT READLINE_POINT REPLY SECONDS SHELL SHELL SHELLOPTS SHLVL TIMEFORMAT TIMEOUT TMPDIR TMPDIR UID
- syn keyword bashStatement chmod clear complete du egrep expr fgrep find gnufind gnugrep grep less ls mkdir mv rm rmdir rpm sed sleep sort strip tail
+ syn keyword bashStatement chmod clear complete du egrep expr fgrep find gnufind gnugrep grep less ls mkdir mv rm rmdir rpm sed sleep sort strip tail
syn keyword bashAdminStatement daemon killall killproc nice reload restart start status stop
syn keyword bashStatement command compgen
endif
-if exists("b:is_kornshell")
+if exists("b:is_kornshell") || exists("b:is_posix")
syn cluster shCommandSubList add=kshSpecialVariables,kshStatement
syn cluster shCaseList add=kshStatement
syn keyword kshSpecialVariables contained CDPATH COLUMNS EDITOR ENV ERRNO FCEDIT FPATH HISTFILE HISTSIZE HOME IFS LINENO LINES MAIL MAILCHECK MAILPATH OLDPWD OPTARG OPTIND PATH PPID PS1 PS2 PS3 PS4 PWD RANDOM REPLY SECONDS SHELL TMOUT VISUAL
@@ -313,73 +331,76 @@ syn match shSource "^\.\s"
syn match shSource "\s\.\s"
"syn region shColon start="^\s*:" end="$" end="\s#"me=e-2 contains=@shColonList
"syn region shColon start="^\s*\zs:" end="$" end="\s#"me=e-2
-syn match shColon '^\s*\zs:'
+if exists("b:is_kornshell") || exists("b:is_posix")
+ syn match shColon '^\s*\zs:'
+endif
" String And Character Constants: {{{1
"================================
syn match shNumber "\<\d\+\>#\="
-syn match shNumber "-\=\.\=\d\+\>#\="
-syn match shCtrlSeq "\\\d\d\d\|\\[abcfnrtv0]" contained
-if exists("b:is_bash")
- syn match shSpecial "\\\o\o\o\|\\x\x\x\|\\c[^"]\|\\[abefnrtv]" contained
-endif
+syn match shNumber "\<-\=\.\=\d\+\>#\="
+syn match shCtrlSeq "\\\d\d\d\|\\[abcfnrtv0]" contained
if exists("b:is_bash")
- syn region shExSingleQuote matchgroup=shQuote start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial,shSpecial
- syn region shExDoubleQuote matchgroup=shQuote start=+\$"+ skip=+\\\\\|\\.\|\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial,shSpecial
+ syn match shSpecial "[^\\]\(\\\\\)*\zs\\\o\o\o\|\\x\x\x\|\\c[^"]\|\\[abefnrtv]" contained
+ syn match shSpecial "^\(\\\\\)*\zs\\\o\o\o\|\\x\x\x\|\\c[^"]\|\\[abefnrtv]" contained
+ syn region shExSingleQuote matchgroup=shQuote start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial,shSpecial nextgroup=shSpecialNxt
+ syn region shExDoubleQuote matchgroup=shQuote start=+\$"+ skip=+\\\\\|\\.\|\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial,shSpecial nextgroup=shSpecialNxt
elseif !exists("g:sh_no_error")
syn region shExSingleQuote matchGroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial
syn region shExDoubleQuote matchGroup=Error start=+\$"+ skip=+\\\\\|\\.+ end=+"+ contains=shStringSpecial
endif
-syn region shSingleQuote matchgroup=shQuote start=+'+ end=+'+ contains=@Spell
-syn region shDoubleQuote matchgroup=shQuote start=+\%(\%(\\\\\)*\\\)\@<!"+ skip=+\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial,@Spell
-syn match shStringSpecial "[^[:print:] \t]" contained
-syn match shStringSpecial "\%(\\\\\)*\\[\\"'`$()#]"
-syn match shSpecial "[^\\]\zs\%(\\\\\)*\\[\\"'`$()#]"
+syn region shSingleQuote matchgroup=shQuote start=+'+ end=+'+ contains=@Spell nextgroup=shSpecialStart,shSpecialSQ
+syn region shDoubleQuote matchgroup=shQuote start=+\%(\%(\\\\\)*\\\)\@<!"+ skip=+\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial,@Spell nextgroup=shSpecialStart
+syn region shDoubleQuote matchgroup=shQuote start=+"+ skip=+\\"+ end=+"+ contained contains=@shDblQuoteList,shStringSpecial,@Spell nextgroup=shSpecialStart
+syn match shStringSpecial "[^[:print:] \t]" contained
+syn match shStringSpecial "[^\\]\zs\%(\\\\\)*\\[\\"'`$()#]" nextgroup=shComment
+syn match shSpecialSQ "[^\\]\zs\%(\\\\\)*\\[\\"'`$()#]" contained nextgroup=shBkslshSnglQuote,@shNoZSList
+syn match shSpecialDQ "[^\\]\zs\%(\\\\\)*\\[\\"'`$()#]" contained nextgroup=shBkslshDblQuote,@shNoZSList
+syn match shSpecialStart "\%(\\\\\)*\\[\\"'`$()#]" contained nextgroup=shBkslshSnglQuote,shBkslshDblQuote,@shNoZSList
syn match shSpecial "^\%(\\\\\)*\\[\\"'`$()#]"
-syn match shMoreSpecial "\%(\\\\\)*\\[\\"'`$()#]" nextgroup=shMoreSpecial contained
+syn match shSpecialNoZS contained "\%(\\\\\)*\\[\\"'`$()#]"
+syn match shSpecialNxt contained "\\[\\"'`$()#]"
+syn region shBkslshSnglQuote contained matchgroup=shQuote start=+'+ end=+'+ contains=@Spell nextgroup=shSpecialStart
+syn region shBkslshDblQuote contained matchgroup=shQuote start=+"+ skip=+\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial,@Spell nextgroup=shSpecialStart
" Comments: {{{1
"==========
syn cluster shCommentGroup contains=shTodo,@Spell
-syn keyword shTodo contained COMBAK FIXME TODO XXX
+if exists("b:is_bash")
+ syn match shTodo contained "\<\%(COMBAK\|FIXME\|TODO\|XXX\)\ze:\=\>"
+else
+ syn keyword shTodo contained COMBAK FIXME TODO XXX
+endif
syn match shComment "^\s*\zs#.*$" contains=@shCommentGroup
syn match shComment "\s\zs#.*$" contains=@shCommentGroup
syn match shComment contained "#.*$" contains=@shCommentGroup
syn match shQuickComment contained "#.*$"
+syn match shBQComment contained "#.\{-}\ze`" contains=@shCommentGroup
" Here Documents: {{{1
" =========================================
-if version < 600
- syn region shHereDoc matchgroup=shHereDoc01 start="<<\s*\**END[a-zA-Z_0-9]*\**" matchgroup=shHereDoc01 end="^END[a-zA-Z_0-9]*$" contains=@shDblQuoteList
- syn region shHereDoc matchgroup=shHereDoc02 start="<<-\s*\**END[a-zA-Z_0-9]*\**" matchgroup=shHereDoc02 end="^\s*END[a-zA-Z_0-9]*$" contains=@shDblQuoteList
- syn region shHereDoc matchgroup=shHereDoc03 start="<<\s*\**EOF\**" matchgroup=shHereDoc03 end="^EOF$" contains=@shDblQuoteList
- syn region shHereDoc matchgroup=shHereDoc04 start="<<-\s*\**EOF\**" matchgroup=shHereDoc04 end="^\s*EOF$" contains=@shDblQuoteList
- syn region shHereDoc matchgroup=shHereDoc05 start="<<\s*\**\.\**" matchgroup=shHereDoc05 end="^\.$" contains=@shDblQuoteList
- syn region shHereDoc matchgroup=shHereDoc06 start="<<-\s*\**\.\**" matchgroup=shHereDoc06 end="^\s*\.$" contains=@shDblQuoteList
-
-else
- ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc07 start="<<\s*\\\=\z([^ \t|]\+\)" matchgroup=shHereDoc07 end="^\z1\s*$" contains=@shDblQuoteList
- ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc08 start="<<\s*\"\z([^ \t|]\+\)\"" matchgroup=shHereDoc08 end="^\z1\s*$"
- ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc09 start="<<-\s*\z([^ \t|]\+\)" matchgroup=shHereDoc09 end="^\s*\z1\s*$" contains=@shDblQuoteList
- ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc10 start="<<-\s*'\z([^ \t|]\+\)'" matchgroup=shHereDoc10 end="^\s*\z1\s*$"
- ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc11 start="<<\s*'\z([^ \t|]\+\)'" matchgroup=shHereDoc11 end="^\z1\s*$"
- ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc12 start="<<-\s*\"\z([^ \t|]\+\)\"" matchgroup=shHereDoc12 end="^\s*\z1\s*$"
- ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc13 start="<<\s*\\\_$\_s*\z([^ \t|]\+\)" matchgroup=shHereDoc13 end="^\z1\s*$" contains=@shDblQuoteList
- ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc14 start="<<\s*\\\_$\_s*'\z([^ \t|]\+\)'" matchgroup=shHereDoc14 end="^\z1\s*$"
- ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc15 start="<<\s*\\\_$\_s*\"\z([^ \t|]\+\)\"" matchgroup=shHereDoc15 end="^\z1\s*$"
- ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc16 start="<<-\s*\\\_$\_s*\z([^ \t|]\+\)" matchgroup=shHereDoc16 end="^\s*\z1\s*$"
- ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc17 start="<<-\s*\\\_$\_s*\\\z([^ \t|]\+\)" matchgroup=shHereDoc17 end="^\s*\z1\s*$"
- ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc18 start="<<-\s*\\\_$\_s*'\z([^ \t|]\+\)'" matchgroup=shHereDoc18 end="^\s*\z1\s*$"
- ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc19 start="<<-\s*\\\_$\_s*\"\z([^ \t|]\+\)\"" matchgroup=shHereDoc19 end="^\s*\z1\s*$"
- ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc20 start="<<\\\z([^ \t|]\+\)" matchgroup=shHereDoc20 end="^\z1\s*$"
- ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc21 start="<<-\s*\\\z([^ \t|]\+\)" matchgroup=shHereDoc21 end="^\s*\z1\s*$"
-endif
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc01 start="<<\s*\\\=\z([^ \t0-9|>]\+\)" matchgroup=shHereDoc01 end="^\z1\s*$" contains=@shDblQuoteList
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc02 start="<<\s*\"\z([^ \t|>]\+\)\"" matchgroup=shHereDoc02 end="^\z1\s*$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc03 start="<<-\s*\z([^ \t0-9|>]\+\)" matchgroup=shHereDoc03 end="^\s*\z1\s*$" contains=@shDblQuoteList
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc04 start="<<-\s*'\z([^']\+\)'" matchgroup=shHereDoc04 end="^\s*\z1\s*$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc05 start="<<\s*'\z([^']\+\)'" matchgroup=shHereDoc05 end="^\z1\s*$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc06 start="<<-\s*\"\z([^ \t|>]\+\)\"" matchgroup=shHereDoc06 end="^\s*\z1\s*$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc07 start="<<\s*\\\_$\_s*\z([^ \t0-9|>]\+\)" matchgroup=shHereDoc07 end="^\z1\s*$" contains=@shDblQuoteList
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc08 start="<<\s*\\\_$\_s*'\z([^ \t0-9|>]\+\)'" matchgroup=shHereDoc08 end="^\z1\s*$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc09 start="<<\s*\\\_$\_s*\"\z([^ \t0-9|>]\+\)\"" matchgroup=shHereDoc09 end="^\z1\s*$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc10 start="<<-\s*\\\_$\_s*\z([^ \t0-9|>]\+\)" matchgroup=shHereDoc10 end="^\s*\z1\s*$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc11 start="<<-\s*\\\_$\_s*\\\z([^ \t0-9|>]\+\)" matchgroup=shHereDoc11 end="^\s*\z1\s*$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc12 start="<<-\s*\\\_$\_s*'\z([^ \t|>]\+\)'" matchgroup=shHereDoc12 end="^\s*\z1\s*$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc13 start="<<-\s*\\\_$\_s*\"\z([^ \t|>]\+\)\"" matchgroup=shHereDoc13 end="^\s*\z1\s*$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc14 start="<<\\\z([^ \t0-9|>]\+\)" matchgroup=shHereDoc14 end="^\z1\s*$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc15 start="<<-\s*\\\z([^ \t0-9|>]\+\)" matchgroup=shHereDoc15 end="^\s*\z1\s*$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc16 start="<<-\s*\\\z([^ \t0-9|>]\+\)" matchgroup=shHereDoc15 end="^\s*\z1\s*$"
" Here Strings: {{{1
" =============
" available for: bash; ksh (really should be ksh93 only) but not if its a posix
-if exists("b:is_bash") || (exists("b:is_kornshell") && !exists("g:is_posix"))
- syn match shRedir "<<<" skipwhite nextgroup=shCmdParenRegion
+if exists("b:is_bash") || (exists("b:is_kornshell") && !exists("b:is_posix"))
+ syn match shHereString "<<<" skipwhite nextgroup=shCmdParenRegion
endif
" Identifiers: {{{1
@@ -389,9 +410,11 @@ syn match shVariable "\<\([bwglsav]:\)\=[a-zA-Z0-9.!@_%+,]*\ze=" nextgroup=shVa
syn match shVarAssign "=" contained nextgroup=shCmdParenRegion,shPattern,shDeref,shDerefSimple,shDoubleQuote,shExDoubleQuote,shSingleQuote,shExSingleQuote
syn region shAtExpr contained start="@(" end=")" contains=@shIdList
if exists("b:is_bash")
+ syn match shSet "^\s*set\ze\s*$"
syn region shSetList oneline matchgroup=shSet start="\<\(declare\|typeset\|local\|export\|unset\)\>\ze[^/]" end="$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+#\|=" contains=@shIdList
- syn region shSetList oneline matchgroup=shSet start="\<set\>\ze[^/]" end="\ze[;|)]\|$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+=" contains=@shIdList
-elseif exists("b:is_kornshell")
+ syn region shSetList oneline matchgroup=shSet start="\<set\>\ze[^/]" end="\ze[;|#)]\|$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+=" contains=@shIdList nextgroup=shComment
+elseif exists("b:is_kornshell") || exists("b:is_posix")
+ syn match shSet "^\s*set\ze\s*$"
syn region shSetList oneline matchgroup=shSet start="\<\(typeset\|export\|unset\)\>\ze[^/]" end="$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]" contains=@shIdList
syn region shSetList oneline matchgroup=shSet start="\<set\>\ze[^/]" end="$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]" contains=@shIdList
else
@@ -399,57 +422,59 @@ else
endif
" Functions: {{{1
-if !exists("g:is_posix")
+if !exists("b:is_posix")
syn keyword shFunctionKey function skipwhite skipnl nextgroup=shFunctionTwo
endif
if exists("b:is_bash")
- ShFoldFunctions syn region shFunctionOne matchgroup=shFunction start="^\s*\h[-a-zA-Z_0-9]*\s*()\_s*{" end="}" contains=@shFunctionList skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
- ShFoldFunctions syn region shFunctionTwo matchgroup=shFunction start="\<[^d][^o]\&\h[-a-zA-Z_0-9]*\s*\%(()\)\=\_s*{" end="}" contains=shFunctionKey,@shFunctionList contained skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
- ShFoldFunctions syn region shFunctionThree matchgroup=shFunction start="^\s*\h[-a-zA-Z_0-9]*\s*()\_s*(" end=")" contains=@shFunctionList skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
- ShFoldFunctions syn region shFunctionFour matchgroup=shFunction start="\<[^d][^o]\&\h[-a-zA-Z_0-9]*\s*\%(()\)\=\_s*)" end=")" contains=shFunctionKey,@shFunctionList contained skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
+ ShFoldFunctions syn region shFunctionOne matchgroup=shFunction start="^\s*[A-Za-z_0-9:][-a-zA-Z_0-9:]*\s*()\_s*{" end="}" contains=@shFunctionList skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
+ ShFoldFunctions syn region shFunctionTwo matchgroup=shFunction start="\%(do\)\@!\&\<[A-Za-z_0-9:][-a-zA-Z_0-9:]*\>\s*\%(()\)\=\_s*{" end="}" contains=shFunctionKey,@shFunctionList contained skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
+ ShFoldFunctions syn region shFunctionThree matchgroup=shFunction start="^\s*[A-Za-z_0-9:][-a-zA-Z_0-9:]*\s*()\_s*(" end=")" contains=@shFunctionList skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
+ ShFoldFunctions syn region shFunctionFour matchgroup=shFunction start="\%(do\)\@!\&\<[A-Za-z_0-9:][-a-zA-Z_0-9:]*\>\s*\%(()\)\=\_s*)" end=")" contains=shFunctionKey,@shFunctionList contained skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
else
- ShFoldFunctions syn region shFunctionOne matchgroup=shFunction start="^\s*\h\w*\s*()\_s*{" end="}" contains=@shFunctionList skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
- ShFoldFunctions syn region shFunctionTwo matchgroup=shFunction start="\<[^d][^o]\&\h\w*\s*\%(()\)\=\_s*{" end="}" contains=shFunctionKey,@shFunctionList contained skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
- ShFoldFunctions syn region shFunctionThree matchgroup=shFunction start="^\s*\h\w*\s*()\_s*(" end=")" contains=@shFunctionList skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
- ShFoldFunctions syn region shFunctionFour matchgroup=shFunction start="\<[^d][^o]\&\h\w*\s*\%(()\)\=\_s*(" end=")" contains=shFunctionKey,@shFunctionList contained skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
+ ShFoldFunctions syn region shFunctionOne matchgroup=shFunction start="^\s*\h\w*\s*()\_s*{" end="}" contains=@shFunctionList skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
+ ShFoldFunctions syn region shFunctionTwo matchgroup=shFunction start="\%(do\)\@!\&\<\h\w*\>\s*\%(()\)\=\_s*{" end="}" contains=shFunctionKey,@shFunctionList contained skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
+ ShFoldFunctions syn region shFunctionThree matchgroup=shFunction start="^\s*\h\w*\s*()\_s*(" end=")" contains=@shFunctionList skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
+ ShFoldFunctions syn region shFunctionFour matchgroup=shFunction start="\%(do\)\@!\&\<\h\w*\>\s*\%(()\)\=\_s*(" end=")" contains=shFunctionKey,@shFunctionList contained skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
endif
" Parameter Dereferencing: {{{1
" ========================
if !exists("g:sh_no_error")
- syn match shDerefWordError "[^}$[]" contained
+ syn match shDerefWordError "[^}$[~]" contained
endif
-syn match shDerefSimple "\$\%(\k\+\|\d\)"
+syn match shDerefSimple "\$\%(\h\w*\|\d\)" nextgroup=@shNoZSList
syn region shDeref matchgroup=PreProc start="\${" end="}" contains=@shDerefList,shDerefVarArray
-syn match shDerefSimple "\$[-#*@!?]"
-syn match shDerefSimple "\$\$"
-if exists("b:is_bash") || exists("b:is_kornshell")
- syn region shDeref matchgroup=PreProc start="\${##\=" end="}" contains=@shDerefList
- syn region shDeref matchgroup=PreProc start="\${\$\$" end="}" contains=@shDerefList
+syn match shDerefSimple "\$[-#*@!?]" nextgroup=@shNoZSList
+syn match shDerefSimple "\$\$" nextgroup=@shNoZSList
+syn match shDerefSimple "\${\d}" nextgroup=@shNoZSList
+if exists("b:is_bash") || exists("b:is_kornshell") || exists("b:is_posix")
+ syn region shDeref matchgroup=PreProc start="\${##\=" end="}" contains=@shDerefList nextgroup=@shSpecialNoZS
+ syn region shDeref matchgroup=PreProc start="\${\$\$" end="}" contains=@shDerefList nextgroup=@shSpecialNoZS
endif
" ksh: ${!var[*]} array index list syntax: {{{1
" ========================================
-if exists("b:is_kornshell")
+if exists("b:is_kornshell") || exists("b:is_posix")
syn region shDeref matchgroup=PreProc start="\${!" end="}" contains=@shDerefVarArray
endif
" bash: ${!prefix*} and ${#parameter}: {{{1
" ====================================
if exists("b:is_bash")
- syn region shDeref matchgroup=PreProc start="\${!" end="\*\=}" contains=@shDerefList,shDerefOp
- syn match shDerefVar contained "{\@<=!\k\+" nextgroup=@shDerefVarList
+ syn region shDeref matchgroup=PreProc start="\${!" end="\*\=}" contains=@shDerefList,shDerefOff
+ syn match shDerefVar contained "{\@<=!\h\w*" nextgroup=@shDerefVarList
endif
if exists("b:is_kornshell")
- syn match shDerefVar contained "{\@<=!\k[[:alnum:]_.]*" nextgroup=@shDerefVarList
+ syn match shDerefVar contained "{\@<=!\h\w*[[:alnum:]_.]*" nextgroup=@shDerefVarList
endif
syn match shDerefSpecial contained "{\@<=[-*@?0]" nextgroup=shDerefOp,shDerefOpError
syn match shDerefSpecial contained "\({[#!]\)\@<=[[:alnum:]*@_]\+" nextgroup=@shDerefVarList,shDerefOp
-syn match shDerefVar contained "{\@<=\k\+" nextgroup=@shDerefVarList
-if exists("b:is_kornshell")
- syn match shDerefVar contained "{\@<=\k[[:alnum:]_.]*" nextgroup=@shDerefVarList
+syn match shDerefVar contained "{\@<=\h\w*" nextgroup=@shDerefVarList
+syn match shDerefVar contained '\d' nextgroup=@shDerefVarList
+if exists("b:is_kornshell") || exists("b:is_posix")
+ syn match shDerefVar contained "{\@<=\h\w*[[:alnum:]_.]*" nextgroup=@shDerefVarList
endif
" sh ksh bash : ${var[... ]...} array reference: {{{1
@@ -474,35 +499,36 @@ if !exists("g:sh_no_error")
endif
syn match shDerefOp contained ":\=[-=?]" nextgroup=@shDerefPatternList
syn match shDerefOp contained ":\=+" nextgroup=@shDerefPatternList
-if exists("b:is_bash") || exists("b:is_kornshell")
- syn match shDerefOp contained "#\{1,2}" nextgroup=@shDerefPatternList
- syn match shDerefOp contained "%\{1,2}" nextgroup=@shDerefPatternList
- syn match shDerefPattern contained "[^{}]\+" contains=shDeref,shDerefSimple,shDerefPattern,shDerefString,shCommandSub,shDerefEscape nextgroup=shDerefPattern
+if exists("b:is_bash") || exists("b:is_kornshell") || exists("b:is_posix")
+ syn match shDerefOp contained "#\{1,2}" nextgroup=@shDerefPatternList
+ syn match shDerefOp contained "%\{1,2}" nextgroup=@shDerefPatternList
+ syn match shDerefPattern contained "[^{}]\+" contains=shDeref,shDerefSimple,shDerefPattern,shDerefString,shCommandSub,shDerefEscape nextgroup=shDerefPattern
syn region shDerefPattern contained start="{" end="}" contains=shDeref,shDerefSimple,shDerefString,shCommandSub nextgroup=shDerefPattern
syn match shDerefEscape contained '\%(\\\\\)*\\.'
endif
if exists("b:is_bash")
syn match shDerefOp contained "[,^]\{1,2}" nextgroup=@shDerefPatternList
endif
-syn region shDerefString contained matchgroup=shDerefDelim start=+\%(\\\)\@<!'+ end=+'+ contains=shStringSpecial
+syn region shDerefString contained matchgroup=shDerefDelim start=+\%(\\\)\@<!'+ end=+'+ contains=shStringSpecial
syn region shDerefString contained matchgroup=shDerefDelim start=+\%(\\\)\@<!"+ skip=+\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial
syn match shDerefString contained "\\["']" nextgroup=shDerefPattern
if exists("b:is_bash")
" bash : ${parameter:offset}
" bash : ${parameter:offset:length}
- syn region shDerefOp contained start=":[$[:alnum:]_]"me=e-1 end=":"me=e-1 end="}"me=e-1 contains=@shCommandSubList nextgroup=shDerefPOL
- syn match shDerefPOL contained ":[^}]\+" contains=@shCommandSubList
+ syn region shDerefOff contained start=':[^-=?+]' end='\ze:' end='\ze}' contains=shDeref,shDerefSimple,shDerefEscape nextgroup=shDerefLen,shDeref,shDerefSimple
+ syn region shDerefOff contained start=':\s-' end='\ze:' end='\ze}' contains=shDeref,shDerefSimple,shDerefEscape nextgroup=shDerefLen,shDeref,shDerefSimple
+ syn match shDerefLen contained ":[^}]\+" contains=shDeref,shDerefSimple,shArithmetic
" bash : ${parameter//pattern/string}
" bash : ${parameter//pattern}
syn match shDerefPPS contained '/\{1,2}' nextgroup=shDerefPPSleft
syn region shDerefPPSleft contained start='.' skip=@\%(\\\\\)*\\/@ matchgroup=shDerefOp end='/' end='\ze}' nextgroup=shDerefPPSright contains=@shCommandSubList
- syn region shDerefPPSright contained start='.' skip=@\%(\\\\\)\+@ end='\ze}' contains=@shCommandSubList
+ syn region shDerefPPSright contained start='.' skip=@\%(\\\\\)\+@ end='\ze}' contains=@shPPSRightList
" bash : ${parameter/#substring/replacement}
- syn match shDerefPSR contained '/#' nextgroup=shDerefPSRleft
- syn region shDerefPSRleft contained start='.' skip=@\%(\\\\\)*\\/@ matchgroup=shDerefOp end='/' end='\ze}' nextgroup=shDerefPSRright
+ syn match shDerefPSR contained '/#' nextgroup=shDerefPSRleft,shDoubleQuote,shSingleQuote
+ syn region shDerefPSRleft contained start='[^"']' skip=@\%(\\\\\)*\\/@ matchgroup=shDerefOp end='/' end='\ze}' nextgroup=shDerefPSRright
syn region shDerefPSRright contained start='.' skip=@\%(\\\\\)\+@ end='\ze}'
endif
@@ -510,7 +536,7 @@ endif
"syn region shParen matchgroup=shArithRegion start='[^$]\zs(\%(\ze[^(]\|$\)' end=')' contains=@shArithParenList
syn region shParen matchgroup=shArithRegion start='\$\@!(\%(\ze[^(]\|$\)' end=')' contains=@shArithParenList
-" Useful sh Keywords: {{{1
+" Additional sh Keywords: {{{1
" ===================
syn keyword shStatement break cd chdir continue eval exec exit kill newgrp pwd read readonly return shift test trap ulimit umask wait
syn keyword shConditional contained elif else then
@@ -518,20 +544,22 @@ if !exists("g:sh_no_error")
syn keyword shCondError elif else then
endif
-" Useful ksh Keywords: {{{1
-" ====================
-if exists("b:is_kornshell") || exists("b:is_bash")
- syn keyword shStatement autoload bg false fc fg functions getopts hash history integer jobs let nohup printf r stop suspend times true type unalias whence
- if exists("g:is_posix")
+" Additional ksh Keywords and Aliases: {{{1
+" ===================================
+if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
+ syn keyword shStatement bg builtin disown enum export false fg getconf getopts hist jobs let printf sleep true typeset unalias unset whence
+ syn keyword shStatement autoload compound fc float functions hash history integer nameref nohup r redirect source stop suspend times type
+ if exists("b:is_posix")
syn keyword shStatement command
else
syn keyword shStatement time
endif
-" Useful bash Keywords: {{{1
+" Additional bash Keywords: {{{1
" =====================
if exists("b:is_bash")
- syn keyword shStatement bind builtin dirs disown enable help local logout popd pushd shopt source
+" syn keyword shStatement bind builtin dirs disown enable help logout popd pushd shopt source
+syn keyword shStatement bind builtin caller compopt declare dirs disown enable export help local logout mapfile popd pushd readarray shopt source typeset unset
else
syn keyword shStatement login newgrp
endif
@@ -566,138 +594,142 @@ syn sync match shWhileSync grouphere shRepeat "\<while\>"
" Default Highlighting: {{{1
" =====================
-hi def link shArithRegion shShellVariables
-hi def link shAtExpr shSetList
-hi def link shBeginHere shRedir
-hi def link shCaseBar shConditional
-hi def link shCaseCommandSub shCommandSub
-hi def link shCaseDoubleQuote shDoubleQuote
-hi def link shCaseIn shConditional
-hi def link shQuote shOperator
-hi def link shCaseSingleQuote shSingleQuote
-hi def link shCaseStart shConditional
-hi def link shCmdSubRegion shShellVariables
-hi def link shColon shComment
-hi def link shDerefOp shOperator
-hi def link shDerefPOL shDerefOp
-hi def link shDerefPPS shDerefOp
-hi def link shDerefPSR shDerefOp
-hi def link shDeref shShellVariables
-hi def link shDerefDelim shOperator
-hi def link shDerefSimple shDeref
-hi def link shDerefSpecial shDeref
-hi def link shDerefString shDoubleQuote
-hi def link shDerefVar shDeref
-hi def link shDoubleQuote shString
-hi def link shEcho shString
-hi def link shEchoDelim shOperator
-hi def link shEchoQuote shString
-hi def link shForPP shLoop
-hi def link shEmbeddedEcho shString
-hi def link shEscape shCommandSub
-hi def link shExDoubleQuote shDoubleQuote
-hi def link shExSingleQuote shSingleQuote
-hi def link shFunction Function
-hi def link shHereDoc shString
-hi def link shHerePayload shHereDoc
-hi def link shLoop shStatement
-hi def link shMoreSpecial shSpecial
-hi def link shNoQuote shDoubleQuote
-hi def link shOption shCommandSub
-hi def link shPattern shString
-hi def link shParen shArithmetic
-hi def link shPosnParm shShellVariables
-hi def link shQuickComment shComment
-hi def link shRange shOperator
-hi def link shRedir shOperator
-hi def link shSetListDelim shOperator
-hi def link shSetOption shOption
-hi def link shSingleQuote shString
-hi def link shSource shOperator
-hi def link shStringSpecial shSpecial
-hi def link shSubShRegion shOperator
-hi def link shTestOpr shConditional
-hi def link shTestPattern shString
-hi def link shTestDoubleQuote shString
-hi def link shTestSingleQuote shString
-hi def link shTouchCmd shStatement
-hi def link shVariable shSetList
-hi def link shWrapLineOperator shOperator
+if !exists("skip_sh_syntax_inits")
+ hi def link shArithRegion shShellVariables
+ hi def link shAstQuote shDoubleQuote
+ hi def link shAtExpr shSetList
+ hi def link shBkslshSnglQuote shSingleQuote
+ hi def link shBkslshDblQuote shDOubleQuote
+ hi def link shBeginHere shRedir
+ hi def link shCaseBar shConditional
+ hi def link shCaseCommandSub shCommandSub
+ hi def link shCaseDoubleQuote shDoubleQuote
+ hi def link shCaseIn shConditional
+ hi def link shQuote shOperator
+ hi def link shCaseSingleQuote shSingleQuote
+ hi def link shCaseStart shConditional
+ hi def link shCmdSubRegion shShellVariables
+ hi def link shColon shComment
+ hi def link shDerefOp shOperator
+ hi def link shDerefPOL shDerefOp
+ hi def link shDerefPPS shDerefOp
+ hi def link shDerefPSR shDerefOp
+ hi def link shDeref shShellVariables
+ hi def link shDerefDelim shOperator
+ hi def link shDerefSimple shDeref
+ hi def link shDerefSpecial shDeref
+ hi def link shDerefString shDoubleQuote
+ hi def link shDerefVar shDeref
+ hi def link shDoubleQuote shString
+ hi def link shEcho shString
+ hi def link shEchoDelim shOperator
+ hi def link shEchoQuote shString
+ hi def link shForPP shLoop
+ hi def link shFunction Function
+ hi def link shEmbeddedEcho shString
+ hi def link shEscape shCommandSub
+ hi def link shExDoubleQuote shDoubleQuote
+ hi def link shExSingleQuote shSingleQuote
+ hi def link shHereDoc shString
+ hi def link shHereString shRedir
+ hi def link shHerePayload shHereDoc
+ hi def link shLoop shStatement
+ hi def link shSpecialNxt shSpecial
+ hi def link shNoQuote shDoubleQuote
+ hi def link shOption shCommandSub
+ hi def link shPattern shString
+ hi def link shParen shArithmetic
+ hi def link shPosnParm shShellVariables
+ hi def link shQuickComment shComment
+ hi def link shBQComment shComment
+ hi def link shRange shOperator
+ hi def link shRedir shOperator
+ hi def link shSetListDelim shOperator
+ hi def link shSetOption shOption
+ hi def link shSingleQuote shString
+ hi def link shSource shOperator
+ hi def link shStringSpecial shSpecial
+ hi def link shSpecialStart shSpecial
+ hi def link shSubShRegion shOperator
+ hi def link shTestOpr shConditional
+ hi def link shTestPattern shString
+ hi def link shTestDoubleQuote shString
+ hi def link shTestSingleQuote shString
+ hi def link shTouchCmd shStatement
+ hi def link shVariable shSetList
+ hi def link shWrapLineOperator shOperator
-if exists("b:is_bash")
- hi def link bashAdminStatement shStatement
- hi def link bashSpecialVariables shShellVariables
- hi def link bashStatement shStatement
- hi def link shFunctionParen Delimiter
- hi def link shFunctionDelim Delimiter
- hi def link shCharClass shSpecial
-endif
-if exists("b:is_kornshell")
- hi def link kshSpecialVariables shShellVariables
- hi def link kshStatement shStatement
- hi def link shFunctionParen Delimiter
-endif
+ if exists("b:is_bash")
+ hi def link bashAdminStatement shStatement
+ hi def link bashSpecialVariables shShellVariables
+ hi def link bashStatement shStatement
+ hi def link shCharClass shSpecial
+ hi def link shDerefOff shDerefOp
+ hi def link shDerefLen shDerefOff
+ endif
+ if exists("b:is_kornshell") || exists("b:is_posix")
+ hi def link kshSpecialVariables shShellVariables
+ hi def link kshStatement shStatement
+ endif
-if !exists("g:sh_no_error")
- hi def link shCaseError Error
- hi def link shCondError Error
- hi def link shCurlyError Error
- hi def link shDerefError Error
- hi def link shDerefOpError Error
- hi def link shDerefWordError Error
- hi def link shDoError Error
- hi def link shEsacError Error
- hi def link shIfError Error
- hi def link shInError Error
- hi def link shParenError Error
- hi def link shTestError Error
- if exists("b:is_kornshell")
- hi def link shDTestError Error
+ if !exists("g:sh_no_error")
+ hi def link shCaseError Error
+ hi def link shCondError Error
+ hi def link shCurlyError Error
+ hi def link shDerefOpError Error
+ hi def link shDerefWordError Error
+ hi def link shDoError Error
+ hi def link shEsacError Error
+ hi def link shIfError Error
+ hi def link shInError Error
+ hi def link shParenError Error
+ hi def link shTestError Error
+ if exists("b:is_kornshell") || exists("b:is_posix")
+ hi def link shDTestError Error
+ endif
endif
-endif
-hi def link shArithmetic Special
-hi def link shCharClass Identifier
-hi def link shSnglCase Statement
-hi def link shCommandSub Special
-hi def link shComment Comment
-hi def link shConditional Conditional
-hi def link shCtrlSeq Special
-hi def link shExprRegion Delimiter
-hi def link shFunctionKey Function
-hi def link shFunctionName Function
-hi def link shNumber Number
-hi def link shOperator Operator
-hi def link shRepeat Repeat
-hi def link shSet Statement
-hi def link shSetList Identifier
-hi def link shShellVariables PreProc
-hi def link shSpecial Special
-hi def link shStatement Statement
-hi def link shString String
-hi def link shTodo Todo
-hi def link shAlias Identifier
-hi def link shHereDoc01 shRedir
-hi def link shHereDoc02 shRedir
-hi def link shHereDoc03 shRedir
-hi def link shHereDoc04 shRedir
-hi def link shHereDoc05 shRedir
-hi def link shHereDoc06 shRedir
-hi def link shHereDoc07 shRedir
-hi def link shHereDoc08 shRedir
-hi def link shHereDoc09 shRedir
-hi def link shHereDoc10 shRedir
-hi def link shHereDoc11 shRedir
-hi def link shHereDoc12 shRedir
-hi def link shHereDoc13 shRedir
-hi def link shHereDoc14 shRedir
-hi def link shHereDoc15 shRedir
-hi def link shHereDoc16 shRedir
-hi def link shHereDoc17 shRedir
-hi def link shHereDoc18 shRedir
-hi def link shHereDoc19 shRedir
-hi def link shHereDoc20 shRedir
-hi def link shHereDoc21 shRedir
+ hi def link shArithmetic Special
+ hi def link shCharClass Identifier
+ hi def link shSnglCase Statement
+ hi def link shCommandSub Special
+ hi def link shCommandSubBQ shCommandSub
+ hi def link shComment Comment
+ hi def link shConditional Conditional
+ hi def link shCtrlSeq Special
+ hi def link shExprRegion Delimiter
+ hi def link shFunctionKey Function
+ hi def link shFunctionName Function
+ hi def link shNumber Number
+ hi def link shOperator Operator
+ hi def link shRepeat Repeat
+ hi def link shSet Statement
+ hi def link shSetList Identifier
+ hi def link shShellVariables PreProc
+ hi def link shSpecial Special
+ hi def link shSpecialDQ Special
+ hi def link shSpecialSQ Special
+ hi def link shSpecialNoZS shSpecial
+ hi def link shStatement Statement
+ hi def link shString String
+ hi def link shTodo Todo
+ hi def link shAlias Identifier
+ hi def link shHereDoc01 shRedir
+ hi def link shHereDoc02 shRedir
+ hi def link shHereDoc03 shRedir
+ hi def link shHereDoc04 shRedir
+ hi def link shHereDoc05 shRedir
+ hi def link shHereDoc06 shRedir
+ hi def link shHereDoc07 shRedir
+ hi def link shHereDoc08 shRedir
+ hi def link shHereDoc09 shRedir
+ hi def link shHereDoc10 shRedir
+ hi def link shHereDoc11 shRedir
+ hi def link shHereDoc12 shRedir
+ hi def link shHereDoc13 shRedir
+ hi def link shHereDoc14 shRedir
+ hi def link shHereDoc15 shRedir
+endif
" Delete shell folding commands {{{1
" =============================
@@ -711,6 +743,8 @@ if exists("b:is_bash")
let b:current_syntax = "bash"
elseif exists("b:is_kornshell")
let b:current_syntax = "ksh"
+elseif exists("b:is_posix")
+ let b:current_syntax = "posix"
else
let b:current_syntax = "sh"
endif
diff --git a/runtime/syntax/sicad.vim b/runtime/syntax/sicad.vim
index 7e32451bed..20eb14cba1 100644
--- a/runtime/syntax/sicad.vim
+++ b/runtime/syntax/sicad.vim
@@ -4,28 +4,17 @@
" Last Change: 2003 May 11
" URL: http://lmark.mgx.hu:81/download/vim/sicad.vim
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" use SQL highlighting after 'sql' command
-if version >= 600
- syn include @SQL syntax/sql.vim
-else
- syn include @SQL <sfile>:p:h/sql.vim
-endif
+syn include @SQL syntax/sql.vim
unlet b:current_syntax
" spaces are used in (auto)indents since sicad hates tabulator characters
-if version >= 600
- setlocal expandtab
-else
- set expandtab
-endif
+setlocal expandtab
" ignore case
syn case ignore
@@ -369,44 +358,32 @@ syn keyword sicadStatement zparbn zparf zparfn zparfw zparfwn
syn keyword sicadStatement zparp zparpn zwinkp zwinkpn
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_sicad_syntax_inits")
-
- if version < 508
- let did_sicad_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink sicadLabel PreProc
- HiLink sicadLabel1 sicadLabel
- HiLink sicadLabel2 sicadLabel
- HiLink sicadConditional Conditional
- HiLink sicadBoolean Boolean
- HiLink sicadNumber Number
- HiLink sicadFloat Float
- HiLink sicadOperator Operator
- HiLink sicadStatement Statement
- HiLink sicadParameter sicadStatement
- HiLink sicadGoto sicadStatement
- HiLink sicadLineCont sicadStatement
- HiLink sicadString String
- HiLink sicadComment Comment
- HiLink sicadSpecial Special
- HiLink sicadIdentifier Type
-" HiLink sicadIdentifier Identifier
- HiLink sicadError Error
- HiLink sicadParenError sicadError
- HiLink sicadApostropheError sicadError
- HiLink sicadStringError sicadError
- HiLink sicadCommentError sicadError
-" HiLink sqlStatement Special " modified highlight group in sql.vim
+hi def link sicadLabel PreProc
+hi def link sicadLabel1 sicadLabel
+hi def link sicadLabel2 sicadLabel
+hi def link sicadConditional Conditional
+hi def link sicadBoolean Boolean
+hi def link sicadNumber Number
+hi def link sicadFloat Float
+hi def link sicadOperator Operator
+hi def link sicadStatement Statement
+hi def link sicadParameter sicadStatement
+hi def link sicadGoto sicadStatement
+hi def link sicadLineCont sicadStatement
+hi def link sicadString String
+hi def link sicadComment Comment
+hi def link sicadSpecial Special
+hi def link sicadIdentifier Type
+" hi def link sicadIdentifier Identifier
+hi def link sicadError Error
+hi def link sicadParenError sicadError
+hi def link sicadApostropheError sicadError
+hi def link sicadStringError sicadError
+hi def link sicadCommentError sicadError
+" hi def link sqlStatement Special " modified highlight group in sql.vim
- delcommand HiLink
-
-endif
let b:current_syntax = "sicad"
diff --git a/runtime/syntax/sieve.vim b/runtime/syntax/sieve.vim
index 4bb4417f39..35b4dfb79c 100644
--- a/runtime/syntax/sieve.vim
+++ b/runtime/syntax/sieve.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: Sieve filtering language input file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2007-10-25
+" Language: Sieve filtering language input file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-10-25
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/simula.vim b/runtime/syntax/simula.vim
index e952ee26c3..82f66d049e 100644
--- a/runtime/syntax/simula.vim
+++ b/runtime/syntax/simula.vim
@@ -4,11 +4,8 @@
" URL: http://folk.uio.no/hakonrk/vim/syntax/simula.vim
" Last Change: 2001 May 15
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syn clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -58,42 +55,33 @@ syn match simulaReal "-\=\<\d\+\(\.\d\+\)\=\(&&\=[+-]\=\d\+\)\=\>"
" Real starting with a `.', optional exponent
syn match simulaReal "-\=\.\d\+\(&&\=[+-]\=\d\+\)\=\>"
-if version >= 508 || !exists("did_simula_syntax_inits")
- if version < 508
- let did_simula_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink simulaAssigned Identifier
- HiLink simulaBoolean Boolean
- HiLink simulaCharacter Character
- HiLink simulaCharError Error
- HiLink simulaComment Comment
- HiLink simulaCompound Statement
- HiLink simulaConditional Conditional
- HiLink simulaConstant Constant
- HiLink simulaFunction Function
- HiLink simulaNumber Number
- HiLink simulaOperator Operator
- HiLink simulaReal Float
- HiLink simulaReferenceType Type
- HiLink simulaRepeat Repeat
- HiLink simulaReserved Error
- HiLink simulaSemicolon Statement
- HiLink simulaSpecial Special
- HiLink simulaSpecialChar SpecialChar
- HiLink simulaSpecialCharErr Error
- HiLink simulaStatement Statement
- HiLink simulaStorageClass StorageClass
- HiLink simulaString String
- HiLink simulaStructure Structure
- HiLink simulaTodo Todo
- HiLink simulaType Type
+hi def link simulaAssigned Identifier
+hi def link simulaBoolean Boolean
+hi def link simulaCharacter Character
+hi def link simulaCharError Error
+hi def link simulaComment Comment
+hi def link simulaCompound Statement
+hi def link simulaConditional Conditional
+hi def link simulaConstant Constant
+hi def link simulaFunction Function
+hi def link simulaNumber Number
+hi def link simulaOperator Operator
+hi def link simulaReal Float
+hi def link simulaReferenceType Type
+hi def link simulaRepeat Repeat
+hi def link simulaReserved Error
+hi def link simulaSemicolon Statement
+hi def link simulaSpecial Special
+hi def link simulaSpecialChar SpecialChar
+hi def link simulaSpecialCharErr Error
+hi def link simulaStatement Statement
+hi def link simulaStorageClass StorageClass
+hi def link simulaString String
+hi def link simulaStructure Structure
+hi def link simulaTodo Todo
+hi def link simulaType Type
- delcommand HiLink
-endif
let b:current_syntax = "simula"
" vim: sts=4 sw=4 ts=8
diff --git a/runtime/syntax/sinda.vim b/runtime/syntax/sinda.vim
index 2bde267c2f..a6e5b45fcd 100644
--- a/runtime/syntax/sinda.vim
+++ b/runtime/syntax/sinda.vim
@@ -8,11 +8,8 @@
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -32,11 +29,7 @@ syn case ignore
let fortran_free_source=1
" Load FORTRAN syntax file
-if version < 600
- source <sfile>:p:h/fortran.vim
-else
- runtime! syntax/fortran.vim
-endif
+runtime! syntax/fortran.vim
unlet b:current_syntax
@@ -106,39 +99,29 @@ endif
" Define the default highlighting
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_sinda_syntax_inits")
- if version < 508
- let did_sinda_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink sindaMacro Macro
- HiLink sindaOptions Special
- HiLink sindaRoutine Type
- HiLink sindaControl Special
- HiLink sindaSubRoutine Function
- HiLink sindaIdentifier Identifier
-
- HiLink sindaFortran PreProc
- HiLink sindaMotran PreProc
-
- HiLink sindaComment Comment
- HiLink sindaHeader Typedef
- HiLink sindaIncludeFile Type
- HiLink sindaInteger Number
- HiLink sindaFloat Float
- HiLink sindaScientific Float
-
- HiLink sindaEndData Macro
-
- HiLink sindaTodo Todo
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link sindaMacro Macro
+hi def link sindaOptions Special
+hi def link sindaRoutine Type
+hi def link sindaControl Special
+hi def link sindaSubRoutine Function
+hi def link sindaIdentifier Identifier
+
+hi def link sindaFortran PreProc
+hi def link sindaMotran PreProc
+
+hi def link sindaComment Comment
+hi def link sindaHeader Typedef
+hi def link sindaIncludeFile Type
+hi def link sindaInteger Number
+hi def link sindaFloat Float
+hi def link sindaScientific Float
+
+hi def link sindaEndData Macro
+
+hi def link sindaTodo Todo
+
let b:current_syntax = "sinda"
diff --git a/runtime/syntax/sindacmp.vim b/runtime/syntax/sindacmp.vim
index 87b483409a..88373eb285 100644
--- a/runtime/syntax/sindacmp.vim
+++ b/runtime/syntax/sindacmp.vim
@@ -8,11 +8,8 @@
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -45,28 +42,18 @@ syn match sindacmpFloat "-\=\<[0-9]*\.[0-9]*"
" Define the default highlighting
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_sindacmp_syntax_inits")
- if version < 508
- let did_sindacmp_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink sindacmpTitle Type
- HiLink sindacmpUnit PreProc
+hi def link sindacmpTitle Type
+hi def link sindacmpUnit PreProc
- HiLink sindacmpLabel Statement
+hi def link sindacmpLabel Statement
- HiLink sindacmpHeader sindaHeader
+hi def link sindacmpHeader sindaHeader
- HiLink sindacmpInteger Number
- HiLink sindacmpFloat Special
+hi def link sindacmpInteger Number
+hi def link sindacmpFloat Special
- delcommand HiLink
-endif
let b:current_syntax = "sindacmp"
diff --git a/runtime/syntax/sindaout.vim b/runtime/syntax/sindaout.vim
index b557e017eb..c362f19467 100644
--- a/runtime/syntax/sindaout.vim
+++ b/runtime/syntax/sindaout.vim
@@ -8,11 +8,8 @@
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -24,11 +21,7 @@ syn case match
" Load SINDA syntax file
-if version < 600
- source <sfile>:p:h/sinda.vim
-else
- runtime! syntax/sinda.vim
-endif
+runtime! syntax/sinda.vim
unlet b:current_syntax
@@ -66,33 +59,23 @@ syn match sindaoutError "<<< Error >>>"
" Define the default highlighting
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_sindaout_syntax_inits")
- if version < 508
- let did_sindaout_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- hi sindaHeaderDelim ctermfg=Black ctermbg=Green guifg=Black guibg=Green
-
- HiLink sindaoutPos Statement
- HiLink sindaoutNeg PreProc
- HiLink sindaoutTitle Type
- HiLink sindaoutFile sindaIncludeFile
- HiLink sindaoutInteger sindaInteger
-
- HiLink sindaoutSectionDelim Delimiter
- HiLink sindaoutSectionTitle Exception
- HiLink sindaoutHeaderDelim SpecialComment
- HiLink sindaoutLabel Identifier
-
- HiLink sindaoutError Error
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi sindaHeaderDelim ctermfg=Black ctermbg=Green guifg=Black guibg=Green
+
+hi def link sindaoutPos Statement
+hi def link sindaoutNeg PreProc
+hi def link sindaoutTitle Type
+hi def link sindaoutFile sindaIncludeFile
+hi def link sindaoutInteger sindaInteger
+
+hi def link sindaoutSectionDelim Delimiter
+hi def link sindaoutSectionTitle Exception
+hi def link sindaoutHeaderDelim SpecialComment
+hi def link sindaoutLabel Identifier
+
+hi def link sindaoutError Error
+
let b:current_syntax = "sindaout"
diff --git a/runtime/syntax/sisu.vim b/runtime/syntax/sisu.vim
index 0e0f2dbe0a..264aae0600 100644
--- a/runtime/syntax/sisu.vim
+++ b/runtime/syntax/sisu.vim
@@ -1,16 +1,14 @@
" SiSU Vim syntax file
" SiSU Maintainer: Ralph Amissah <ralph.amissah@gmail.com>
" SiSU Markup: SiSU (sisu-5.6.7)
-" Last Change: 2014-09-14
+" Last Change: 2017 Jun 22
" URL: <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=blob;f=data/sisu/conf/editor-syntax-etc/vim/syntax/sisu.vim;hb=HEAD>
" <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=blob_plain;f=data/sisu/conf/editor-syntax-etc/vim/syntax/sisu.vim;hb=HEAD>
"(originally looked at Ruby Vim by Mirko Nasato)
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
-else
endif
let s:cpo_save = &cpo
set cpo&vim
@@ -104,7 +102,7 @@ syn region sisu_content_alt contains=sisu_strikeout,sisu_number,sisu_bold,sisu_c
syn region sisu_content_alt contains=sisu_strikeout,sisu_number,sisu_bold,sisu_control,sisu_identifier,sisu_error matchgroup=sisu_contain start="^```\s\+table" end="^```\(\s\|$\)"
syn region sisu_content_alt contains=sisu_strikeout,sisu_number,sisu_bold,sisu_control,sisu_identifier,sisu_error matchgroup=sisu_contain start="^{\(t\|table\)\(\~h\)\?\(\sc[0-9]\+;\)\?[0-9; ]*}" end="\n$"
" block, group, poem, alt
-syn region sisu_content_alt contains=sisu_mark_endnote,sisu_content_endnote,sisu_link,sisu_mark,sisu_strikeout,sisu_number,sisu_control,sisu_identifier,sisu_error matchgroup=sisu_contain start="^\(block\|group\|poem\|alt\){" end="^}\1"
+syn region sisu_content_alt contains=sisu_mark_endnote,sisu_content_endnote,sisu_link,sisu_mark,sisu_strikeout,sisu_number,sisu_control,sisu_identifier,sisu_error matchgroup=sisu_contain start="^\z(block\|group\|poem\|alt\){" end="^}\z1"
syn region sisu_content_alt contains=sisu_mark_endnote,sisu_content_endnote,sisu_link,sisu_mark,sisu_strikeout,sisu_number,sisu_control,sisu_identifier,sisu_error matchgroup=sisu_contain start="^```\s\+\(block\|group\|poem\|alt\)" end="^```\(\s\|$\)"
" box
syn region sisu_content_alt contains=sisu_mark_endnote,sisu_content_endnote,sisu_link,sisu_mark,sisu_strikeout,sisu_number,sisu_control,sisu_identifier,sisu_error matchgroup=sisu_contain start="^box\(\.[a-z]\+\)\?{" end="^}box"
diff --git a/runtime/syntax/skill.vim b/runtime/syntax/skill.vim
index 8b960441f6..47afffc0a9 100644
--- a/runtime/syntax/skill.vim
+++ b/runtime/syntax/skill.vim
@@ -9,11 +9,8 @@
" database. This file also defines syntax highlighting for
" certain Design Framework II interface functions.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -525,37 +522,27 @@ syn match skillCommentError "\*/"
syn sync ccomment skillComment minlines=10
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_skill_syntax_inits")
- if version < 508
- let did_skill_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink skillcdfFunctions Function
- HiLink skillgeFunctions Function
- HiLink skillhiFunctions Function
- HiLink skillleFunctions Function
- HiLink skilldbefFunctions Function
- HiLink skillddFunctions Function
- HiLink skillpcFunctions Function
- HiLink skilltechFunctions Function
- HiLink skillConstants Constant
- HiLink skillFunction Function
- HiLink skillKeywords Statement
- HiLink skillConditional Conditional
- HiLink skillRepeat Repeat
- HiLink skillString String
- HiLink skillTodo Todo
- HiLink skillNote Todo
- HiLink skillComment Comment
- HiLink skillCommentError Error
+hi def link skillcdfFunctions Function
+hi def link skillgeFunctions Function
+hi def link skillhiFunctions Function
+hi def link skillleFunctions Function
+hi def link skilldbefFunctions Function
+hi def link skillddFunctions Function
+hi def link skillpcFunctions Function
+hi def link skilltechFunctions Function
+hi def link skillConstants Constant
+hi def link skillFunction Function
+hi def link skillKeywords Statement
+hi def link skillConditional Conditional
+hi def link skillRepeat Repeat
+hi def link skillString String
+hi def link skillTodo Todo
+hi def link skillNote Todo
+hi def link skillComment Comment
+hi def link skillCommentError Error
- delcommand HiLink
-endif
let b:current_syntax = "skill"
diff --git a/runtime/syntax/sl.vim b/runtime/syntax/sl.vim
index fa3bca06dd..1f6c847353 100644
--- a/runtime/syntax/sl.vim
+++ b/runtime/syntax/sl.vim
@@ -3,11 +3,8 @@
" Maintainer: Dan Piponi <dan@tanelorn.demon.co.uk>
" Last Change: 2001 May 09
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -75,45 +72,35 @@ syn keyword slVariable dtime dPdtime
syn sync ccomment slComment minlines=10
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_sl_syntax_inits")
- if version < 508
- let did_sl_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink slLabel Label
- HiLink slUserLabel Label
- HiLink slConditional Conditional
- HiLink slRepeat Repeat
- HiLink slCharacter Character
- HiLink slSpecialCharacter slSpecial
- HiLink slNumber Number
- HiLink slFloat Float
- HiLink slParenError slError
- HiLink slInParen slError
- HiLink slCommentError slError
- HiLink slOperator Operator
- HiLink slStorageClass StorageClass
- HiLink slError Error
- HiLink slStatement Statement
- HiLink slType Type
- HiLink slCommentError slError
- HiLink slCommentString slString
- HiLink slComment2String slString
- HiLink slCommentSkip slComment
- HiLink slString String
- HiLink slComment Comment
- HiLink slSpecial SpecialChar
- HiLink slTodo Todo
- HiLink slVariable Identifier
- "HiLink slIdentifier Identifier
+hi def link slLabel Label
+hi def link slUserLabel Label
+hi def link slConditional Conditional
+hi def link slRepeat Repeat
+hi def link slCharacter Character
+hi def link slSpecialCharacter slSpecial
+hi def link slNumber Number
+hi def link slFloat Float
+hi def link slParenError slError
+hi def link slInParen slError
+hi def link slCommentError slError
+hi def link slOperator Operator
+hi def link slStorageClass StorageClass
+hi def link slError Error
+hi def link slStatement Statement
+hi def link slType Type
+hi def link slCommentError slError
+hi def link slCommentString slString
+hi def link slComment2String slString
+hi def link slCommentSkip slComment
+hi def link slString String
+hi def link slComment Comment
+hi def link slSpecial SpecialChar
+hi def link slTodo Todo
+hi def link slVariable Identifier
+"hi def link slIdentifier Identifier
- delcommand HiLink
-endif
let b:current_syntax = "sl"
diff --git a/runtime/syntax/slang.vim b/runtime/syntax/slang.vim
index 9fa89b4d61..53ede4dc5a 100644
--- a/runtime/syntax/slang.vim
+++ b/runtime/syntax/slang.vim
@@ -3,11 +3,8 @@
" Maintainer: Jan Hlavacek <lahvak@math.ohio-state.edu>
" Last Change: 980216
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -55,47 +52,37 @@ syn keyword slangOperator sizeof
syn region slangPreCondit start="^\s*#\s*\(ifdef\>\|ifndef\>\|iftrue\>\|ifnfalse\>\|iffalse\>\|ifntrue\>\|if\$\|ifn\$\|\|elif\>\|else\>\|endif\>\)" skip="\\$" end="$" contains=cComment,slangString,slangCharacter,slangNumber
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_slang_syntax_inits")
- if version < 508
- let did_slang_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink slangDefinition Type
- HiLink slangBlock slangDefinition
- HiLink slangLabel Label
- HiLink slangConditional Conditional
- HiLink slangRepeat Repeat
- HiLink slangCharacter Character
- HiLink slangFloat Float
- HiLink slangImaginary Float
- HiLink slangDecimal slangNumber
- HiLink slangOctal slangNumber
- HiLink slangHex slangNumber
- HiLink slangNumber Number
- HiLink slangParenError Error
- HiLink slangOctalError Error
- HiLink slangOperator Operator
- HiLink slangStructure Structure
- HiLink slangInclude Include
- HiLink slangPreCondit PreCondit
- HiLink slangError Error
- HiLink slangStatement Statement
- HiLink slangType Type
- HiLink slangString String
- HiLink slangConstant Constant
- HiLink slangRangeArray slangConstant
- HiLink slangComment Comment
- HiLink slangSpecial SpecialChar
- HiLink slangTodo Todo
- HiLink slangDelim Delimiter
+hi def link slangDefinition Type
+hi def link slangBlock slangDefinition
+hi def link slangLabel Label
+hi def link slangConditional Conditional
+hi def link slangRepeat Repeat
+hi def link slangCharacter Character
+hi def link slangFloat Float
+hi def link slangImaginary Float
+hi def link slangDecimal slangNumber
+hi def link slangOctal slangNumber
+hi def link slangHex slangNumber
+hi def link slangNumber Number
+hi def link slangParenError Error
+hi def link slangOctalError Error
+hi def link slangOperator Operator
+hi def link slangStructure Structure
+hi def link slangInclude Include
+hi def link slangPreCondit PreCondit
+hi def link slangError Error
+hi def link slangStatement Statement
+hi def link slangType Type
+hi def link slangString String
+hi def link slangConstant Constant
+hi def link slangRangeArray slangConstant
+hi def link slangComment Comment
+hi def link slangSpecial SpecialChar
+hi def link slangTodo Todo
+hi def link slangDelim Delimiter
- delcommand HiLink
-endif
let b:current_syntax = "slang"
diff --git a/runtime/syntax/slice.vim b/runtime/syntax/slice.vim
index 4e2f9a8604..3a57ece913 100644
--- a/runtime/syntax/slice.vim
+++ b/runtime/syntax/slice.vim
@@ -3,11 +3,8 @@
" Maintainer: Morel Bodin <slice06@nym.hush.com>
" Last Change: 2005 Dec 03
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -58,33 +55,23 @@ syn match sliceComment "//.*"
syn sync ccomment sliceComment
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_slice_syn_inits")
- if version < 508
- let did_slice_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink sliceComment Comment
- HiLink sliceConstruct Keyword
- HiLink sliceType Type
- HiLink sliceString String
- HiLink sliceIncluded String
- HiLink sliceQualifier Keyword
- HiLink sliceInclude Include
- HiLink sliceGuard PreProc
- HiLink sliceBoolean Boolean
- HiLink sliceFloat Number
- HiLink sliceNumber Number
- HiLink sliceOctal Number
- HiLink sliceOctalZero Special
- HiLink sliceNumberError Special
+hi def link sliceComment Comment
+hi def link sliceConstruct Keyword
+hi def link sliceType Type
+hi def link sliceString String
+hi def link sliceIncluded String
+hi def link sliceQualifier Keyword
+hi def link sliceInclude Include
+hi def link sliceGuard PreProc
+hi def link sliceBoolean Boolean
+hi def link sliceFloat Number
+hi def link sliceNumber Number
+hi def link sliceOctal Number
+hi def link sliceOctalZero Special
+hi def link sliceNumberError Special
- delcommand HiLink
-endif
let b:current_syntax = "slice"
diff --git a/runtime/syntax/slpconf.vim b/runtime/syntax/slpconf.vim
index 9fe4503780..712ba90719 100644
--- a/runtime/syntax/slpconf.vim
+++ b/runtime/syntax/slpconf.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: RFC 2614 - An API for Service Location configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: RFC 2614 - An API for Service Location configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/slpreg.vim b/runtime/syntax/slpreg.vim
index f3c8a7fc8e..a177b063f0 100644
--- a/runtime/syntax/slpreg.vim
+++ b/runtime/syntax/slpreg.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: RFC 2614 - An API for Service Location registration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: RFC 2614 - An API for Service Location registration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/slpspi.vim b/runtime/syntax/slpspi.vim
index 8507e3de69..eaeb02a80f 100644
--- a/runtime/syntax/slpspi.vim
+++ b/runtime/syntax/slpspi.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: RFC 2614 - An API for Service Location SPI file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: RFC 2614 - An API for Service Location SPI file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/slrnrc.vim b/runtime/syntax/slrnrc.vim
index 038b62e166..cf0734ae85 100644
--- a/runtime/syntax/slrnrc.vim
+++ b/runtime/syntax/slrnrc.vim
@@ -3,11 +3,8 @@
" Maintainer: Preben 'Peppe' Guldberg <peppe-vim@wielders.org>
" Last Change: 23 April 2006
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -150,44 +147,34 @@ syn match slrnrcSetkey "^\s*setkey\>" skipwhite nextgroup=slrnrcSetkeyArt,slrn
syn match slrnrcUnsetkey '^\s*unsetkey\s\+\("\)\=\(article\|group\|readline\)\>\1' skipwhite nextgroup=slrnrcKey contains=slrnrcSetkeyObj\(Str\)\=
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_slrnrc_syntax_inits")
- if version < 508
- let did_slrnrc_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink slrnrcTodo Todo
- HiLink slrnrcSpaceError Error
- HiLink slrnrcNumber Number
- HiLink slrnrcSpecKey SpecialChar
- HiLink slrnrcKey String
- HiLink slrnrcSpecChar SpecialChar
- HiLink slrnrcString String
- HiLink slrnSlangPreCondit Special
- HiLink slrnrcComment Comment
- HiLink slrnrcVarInt Identifier
- HiLink slrnrcVarStr Identifier
- HiLink slrnrcCmd slrnrcSet
- HiLink slrnrcSet Operator
- HiLink slrnrcColor Keyword
- HiLink slrnrcColorObj Identifier
- HiLink slrnrcColorVal String
- HiLink slrnrcMono Keyword
- HiLink slrnrcMonoObj Identifier
- HiLink slrnrcMonoVal String
- HiLink slrnrcFunArt Macro
- HiLink slrnrcFunGroup Macro
- HiLink slrnrcFunRead Macro
- HiLink slrnrcSetkeyObj Identifier
- HiLink slrnrcSetkey Keyword
- HiLink slrnrcUnsetkey slrnrcSetkey
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link slrnrcTodo Todo
+hi def link slrnrcSpaceError Error
+hi def link slrnrcNumber Number
+hi def link slrnrcSpecKey SpecialChar
+hi def link slrnrcKey String
+hi def link slrnrcSpecChar SpecialChar
+hi def link slrnrcString String
+hi def link slrnSlangPreCondit Special
+hi def link slrnrcComment Comment
+hi def link slrnrcVarInt Identifier
+hi def link slrnrcVarStr Identifier
+hi def link slrnrcCmd slrnrcSet
+hi def link slrnrcSet Operator
+hi def link slrnrcColor Keyword
+hi def link slrnrcColorObj Identifier
+hi def link slrnrcColorVal String
+hi def link slrnrcMono Keyword
+hi def link slrnrcMonoObj Identifier
+hi def link slrnrcMonoVal String
+hi def link slrnrcFunArt Macro
+hi def link slrnrcFunGroup Macro
+hi def link slrnrcFunRead Macro
+hi def link slrnrcSetkeyObj Identifier
+hi def link slrnrcSetkey Keyword
+hi def link slrnrcUnsetkey slrnrcSetkey
+
let b:current_syntax = "slrnrc"
diff --git a/runtime/syntax/slrnsc.vim b/runtime/syntax/slrnsc.vim
index 838af6ad1c..9f51cad380 100644
--- a/runtime/syntax/slrnsc.vim
+++ b/runtime/syntax/slrnsc.vim
@@ -3,20 +3,13 @@
" Maintainer: Preben 'Peppe' Guldberg <peppe@wielders.org>
" Last Change: 8 Oct 2004
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" characters in newsgroup names
-if version < 600
- set isk=@,48-57,.,-,_,+
-else
- setlocal isk=@,48-57,.,-,_,+
-endif
+setlocal isk=@,48-57,.,-,_,+
syn match slrnscComment "%.*$"
syn match slrnscSectionCom ".].*"lc=2
@@ -51,34 +44,24 @@ syn match slrnscScoreIdent contained "%.*"
syn match slrnScoreLine "^\s*Score::\=\s\+=\=[-+]\=\d\+\s*\(%.*\)\=$" skipempty nextgroup=slrnscScoreItem contains=slrnscScore,slrnscDelim,slrnscOper,slrnscNumber,slrnscScoreIdent
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_slrnsc_syntax_inits")
- if version < 508
- let did_slrnsc_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink slrnscComment Comment
- HiLink slrnscSectionCom slrnscComment
- HiLink slrnscGroup String
- HiLink slrnscNumber Number
- HiLink slrnscDate Special
- HiLink slrnscDelim Delimiter
- HiLink slrnscComma SpecialChar
- HiLink slrnscOper SpecialChar
- HiLink slrnscEsc String
- HiLink slrnscSectionStd Type
- HiLink slrnscSectionNot Delimiter
- HiLink slrnscItem Statement
- HiLink slrnscScore Keyword
- HiLink slrnscScoreIdent Identifier
- HiLink slrnscInclude Keyword
+hi def link slrnscComment Comment
+hi def link slrnscSectionCom slrnscComment
+hi def link slrnscGroup String
+hi def link slrnscNumber Number
+hi def link slrnscDate Special
+hi def link slrnscDelim Delimiter
+hi def link slrnscComma SpecialChar
+hi def link slrnscOper SpecialChar
+hi def link slrnscEsc String
+hi def link slrnscSectionStd Type
+hi def link slrnscSectionNot Delimiter
+hi def link slrnscItem Statement
+hi def link slrnscScore Keyword
+hi def link slrnscScoreIdent Identifier
+hi def link slrnscInclude Keyword
- delcommand HiLink
-endif
let b:current_syntax = "slrnsc"
diff --git a/runtime/syntax/sm.vim b/runtime/syntax/sm.vim
index 8fdc14b71a..0ecc96875f 100644
--- a/runtime/syntax/sm.vim
+++ b/runtime/syntax/sm.vim
@@ -1,10 +1,9 @@
" Vim syntax file
" Language: sendmail
" Maintainer: Charles E. Campbell <NdrOchipS@PcampbellAfamily.Mbiz>
-" Last Change: Oct 23, 2014
-" Version: 7
+" Last Change: Oct 25, 2016
+" Version: 8
" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_SM
-
if exists("b:current_syntax")
finish
endif
@@ -56,36 +55,25 @@ syn match smClauseCont contained "^\t"
syn region smClause matchgroup=Delimiter start="\$?." matchgroup=Delimiter end="\$\." contains=smElse,smClause,smVar,smClauseCont
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_smil_syntax_inits")
- if version < 508
- let did_smil_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink smClause Special
- HiLink smClauseError Error
- HiLink smComment Comment
- HiLink smDefine Statement
- HiLink smElse Delimiter
- HiLink smHeader Statement
- HiLink smHeaderSep String
- HiLink smMesg Special
- HiLink smPrecedence Number
- HiLink smRewrite Statement
- HiLink smRewriteComment Comment
- HiLink smRewriteLhsToken String
- HiLink smRewriteLhsUser Statement
- HiLink smRewriteRhsToken String
- HiLink smRuleset Preproc
- HiLink smTrusted Special
- HiLink smVar String
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link smClause Special
+hi def link smClauseError Error
+hi def link smComment Comment
+hi def link smDefine Statement
+hi def link smElse Delimiter
+hi def link smHeader Statement
+hi def link smHeaderSep String
+hi def link smMesg Special
+hi def link smPrecedence Number
+hi def link smRewrite Statement
+hi def link smRewriteComment Comment
+hi def link smRewriteLhsToken String
+hi def link smRewriteLhsUser Statement
+hi def link smRewriteRhsToken String
+hi def link smRuleset Preproc
+hi def link smTrusted Special
+hi def link smVar String
let b:current_syntax = "sm"
diff --git a/runtime/syntax/smarty.vim b/runtime/syntax/smarty.vim
index 6dda366ba2..a39c290abe 100644
--- a/runtime/syntax/smarty.vim
+++ b/runtime/syntax/smarty.vim
@@ -8,11 +8,10 @@
" For version 5.x: Clear all syntax items
" For version 6.x: Quit when a syntax file was already loaded
if !exists("main_syntax")
- if version < 600
- syntax clear
- elseif exists("b:current_syntax")
- finish
-endif
+ " quit when a syntax file was already loaded
+ if exists("b:current_syntax")
+ finish
+ endif
let main_syntax = 'smarty'
endif
@@ -57,25 +56,16 @@ syn region htmlString contained start=+'+ end=+'+ contains=htmlSpecialChar,ja
syn region htmlLink start="<a\>\_[^>]*\<href\>" end="</a>"me=e-4 contains=@Spell,htmlTag,htmlEndTag,htmlSpecialChar,htmlPreProc,htmlComment,javaScript,@htmlPreproc,smartyZone
-if version >= 508 || !exists("did_smarty_syn_inits")
- if version < 508
- let did_smarty_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink smartyTagName Identifier
- HiLink smartyProperty Constant
- " if you want the text inside the braces to be colored, then
- " remove the comment in from of the next statement
- "HiLink smartyZone Include
- HiLink smartyInFunc Function
- HiLink smartyBlock Constant
- HiLink smartyDot SpecialChar
- HiLink smartyModifier Function
- delcommand HiLink
-endif
+hi def link smartyTagName Identifier
+hi def link smartyProperty Constant
+" if you want the text inside the braces to be colored, then
+" remove the comment in from of the next statement
+"hi def link smartyZone Include
+hi def link smartyInFunc Function
+hi def link smartyBlock Constant
+hi def link smartyDot SpecialChar
+hi def link smartyModifier Function
let b:current_syntax = "smarty"
diff --git a/runtime/syntax/smcl.vim b/runtime/syntax/smcl.vim
index d9afba6de5..a5baa47e96 100644
--- a/runtime/syntax/smcl.vim
+++ b/runtime/syntax/smcl.vim
@@ -10,9 +10,8 @@
" check for 'b:current_syntax', removed 'did_smcl_syntax_inits'
" 26apr2006 changed 'stata_smcl' to 'smcl'
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/smil.vim b/runtime/syntax/smil.vim
index 6b5a002868..4cf6e84710 100644
--- a/runtime/syntax/smil.vim
+++ b/runtime/syntax/smil.vim
@@ -7,11 +7,8 @@
" To learn more about SMIL, please refer to http://www.w3.org/AudioVideo/
" and to http://www.helio.org/products/smil/tutorial/
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -115,38 +112,28 @@ endif
syn region smilComment start=+<!DOCTYPE+ keepend end=+>+
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_smil_syntax_inits")
- if version < 508
- let did_smil_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink smilTag Function
- HiLink smilEndTag Identifier
- HiLink smilArg Type
- HiLink smilTagName smilStatement
- HiLink smilSpecialTagName Exception
- HiLink smilValue Value
- HiLink smilSpecialChar Special
-
- HiLink smilSpecial Special
- HiLink smilSpecialChar Special
- HiLink smilString String
- HiLink smilStatement Statement
- HiLink smilComment Comment
- HiLink smilCommentPart Comment
- HiLink smilPreProc PreProc
- HiLink smilValue String
- HiLink smilCommentError smilError
- HiLink smilTagError smilError
- HiLink smilError Error
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link smilTag Function
+hi def link smilEndTag Identifier
+hi def link smilArg Type
+hi def link smilTagName smilStatement
+hi def link smilSpecialTagName Exception
+hi def link smilValue Value
+hi def link smilSpecialChar Special
+
+hi def link smilSpecial Special
+hi def link smilSpecialChar Special
+hi def link smilString String
+hi def link smilStatement Statement
+hi def link smilComment Comment
+hi def link smilCommentPart Comment
+hi def link smilPreProc PreProc
+hi def link smilValue String
+hi def link smilCommentError smilError
+hi def link smilTagError smilError
+hi def link smilError Error
+
let b:current_syntax = "smil"
diff --git a/runtime/syntax/smith.vim b/runtime/syntax/smith.vim
index e05ce69683..b045d3b963 100644
--- a/runtime/syntax/smith.vim
+++ b/runtime/syntax/smith.vim
@@ -3,11 +3,8 @@
" Maintainer: Rafal M. Sulejman <rms@poczta.onet.pl>
" Last Change: 21.07.2000
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -28,24 +25,14 @@ syn region smithString start=+"+ skip=+\\\\\|\\"+ end=+"+
syn case match
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_smith_syntax_inits")
- if version < 508
- let did_smith_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink smithRegister Identifier
- HiLink smithKeyword Keyword
- HiLink smithComment Comment
- HiLink smithString String
- HiLink smithNumber Number
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link smithRegister Identifier
+hi def link smithKeyword Keyword
+hi def link smithComment Comment
+hi def link smithString String
+hi def link smithNumber Number
+
let b:current_syntax = "smith"
diff --git a/runtime/syntax/sml.vim b/runtime/syntax/sml.vim
index aa7d64a33a..fa4524f93d 100644
--- a/runtime/syntax/sml.vim
+++ b/runtime/syntax/sml.vim
@@ -8,11 +8,8 @@
" 2002 Jun 02 - Fixed small typo (MM)
" 2001 Nov 20 - Fixed small highlighting bug with modules (MM)
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -168,62 +165,52 @@ syn sync match smlSigSync grouphere smlSig "\<sig\>"
syn sync match smlSigSync groupthere smlSig "\<end\>"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_sml_syntax_inits")
- if version < 508
- let did_sml_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink smlBraceErr Error
- HiLink smlBrackErr Error
- HiLink smlParenErr Error
-
- HiLink smlCommentErr Error
-
- HiLink smlEndErr Error
- HiLink smlThenErr Error
-
- HiLink smlCharErr Error
-
- HiLink smlComment Comment
-
- HiLink smlModPath Include
- HiLink smlModule Include
- HiLink smlModParam1 Include
- HiLink smlModType Include
- HiLink smlMPRestr3 Include
- HiLink smlFullMod Include
- HiLink smlModTypeRestr Include
- HiLink smlWith Include
- HiLink smlMTDef Include
-
- HiLink smlConstructor Constant
-
- HiLink smlModPreRHS Keyword
- HiLink smlMPRestr2 Keyword
- HiLink smlKeyword Keyword
- HiLink smlFunDef Keyword
- HiLink smlRefAssign Keyword
- HiLink smlKeyChar Keyword
- HiLink smlAnyVar Keyword
- HiLink smlTopStop Keyword
- HiLink smlOperator Keyword
-
- HiLink smlBoolean Boolean
- HiLink smlCharacter Character
- HiLink smlNumber Number
- HiLink smlReal Float
- HiLink smlString String
- HiLink smlType Type
- HiLink smlTodo Todo
- HiLink smlEncl Keyword
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link smlBraceErr Error
+hi def link smlBrackErr Error
+hi def link smlParenErr Error
+
+hi def link smlCommentErr Error
+
+hi def link smlEndErr Error
+hi def link smlThenErr Error
+
+hi def link smlCharErr Error
+
+hi def link smlComment Comment
+
+hi def link smlModPath Include
+hi def link smlModule Include
+hi def link smlModParam1 Include
+hi def link smlModType Include
+hi def link smlMPRestr3 Include
+hi def link smlFullMod Include
+hi def link smlModTypeRestr Include
+hi def link smlWith Include
+hi def link smlMTDef Include
+
+hi def link smlConstructor Constant
+
+hi def link smlModPreRHS Keyword
+hi def link smlMPRestr2 Keyword
+hi def link smlKeyword Keyword
+hi def link smlFunDef Keyword
+hi def link smlRefAssign Keyword
+hi def link smlKeyChar Keyword
+hi def link smlAnyVar Keyword
+hi def link smlTopStop Keyword
+hi def link smlOperator Keyword
+
+hi def link smlBoolean Boolean
+hi def link smlCharacter Character
+hi def link smlNumber Number
+hi def link smlReal Float
+hi def link smlString String
+hi def link smlType Type
+hi def link smlTodo Todo
+hi def link smlEncl Keyword
+
let b:current_syntax = "sml"
diff --git a/runtime/syntax/snnsnet.vim b/runtime/syntax/snnsnet.vim
index 6b24de5634..9dc9e06e78 100644
--- a/runtime/syntax/snnsnet.vim
+++ b/runtime/syntax/snnsnet.vim
@@ -8,9 +8,8 @@
" SNNS http://www-ra.informatik.uni-tuebingen.de/SNNS/
" is a simulator for neural networks.
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -54,23 +53,14 @@ syn match snnsnetNumbers "\d" contained
syn match snnsnetComment "#.*$" contains=snnsnetTodo
syn keyword snnsnetTodo TODO XXX FIXME contained
-if version >= 508 || !exists("did_snnsnet_syn_inits")
- if version < 508
- let did_snnsnet_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink snnsnetType Type
- HiLink snnsnetComment Comment
- HiLink snnsnetNumbers Number
- HiLink snnsnetSection Statement
- HiLink snnsnetTitle Label
- HiLink snnsnetTodo Todo
+hi def link snnsnetType Type
+hi def link snnsnetComment Comment
+hi def link snnsnetNumbers Number
+hi def link snnsnetSection Statement
+hi def link snnsnetTitle Label
+hi def link snnsnetTodo Todo
- delcommand HiLink
-endif
let b:current_syntax = "snnsnet"
diff --git a/runtime/syntax/snnspat.vim b/runtime/syntax/snnspat.vim
index 5bfa48e624..cb6e9c5bd1 100644
--- a/runtime/syntax/snnspat.vim
+++ b/runtime/syntax/snnspat.vim
@@ -8,9 +8,8 @@
" SNNS http://www-ra.informatik.uni-tuebingen.de/SNNS/
" is a simulator for neural networks.
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -44,26 +43,17 @@ syn match snnspatNumbers "\d" contained
syn match snnspatComment "#.*$" contains=snnspatTodo
syn keyword snnspatTodo TODO XXX FIXME contained
-if version >= 508 || !exists("did_snnspat_syn_inits")
- if version < 508
- let did_snnspat_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink snnspatGen Statement
- HiLink snnspatHeader Error
- HiLink snnspatNoHeader Define
- HiLink snnspatNumbers Number
- HiLink snnspatComment Comment
- HiLink snnspatError Error
- HiLink snnspatTodo Todo
- HiLink snnspatAccepted NONE
- HiLink snnspatBrac NONE
+hi def link snnspatGen Statement
+hi def link snnspatHeader Error
+hi def link snnspatNoHeader Define
+hi def link snnspatNumbers Number
+hi def link snnspatComment Comment
+hi def link snnspatError Error
+hi def link snnspatTodo Todo
+hi def link snnspatAccepted NONE
+hi def link snnspatBrac NONE
- delcommand HiLink
-endif
let b:current_syntax = "snnspat"
diff --git a/runtime/syntax/snnsres.vim b/runtime/syntax/snnsres.vim
index 4c1d596009..2f19b67dbe 100644
--- a/runtime/syntax/snnsres.vim
+++ b/runtime/syntax/snnsres.vim
@@ -8,9 +8,8 @@
" SNNS http://www-ra.informatik.uni-tuebingen.de/SNNS/
" is a simulator for neural networks.
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -37,23 +36,14 @@ syn match snnsresNumbers "\d" contained
syn match snnsresComment "#.*$" contains=snnsresTodo
syn keyword snnsresTodo TODO XXX FIXME contained
-if version >= 508 || !exists("did_snnsres_syn_inits")
- if version < 508
- let did_snnsres_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink snnsresGen Statement
- HiLink snnsresHeader Statement
- HiLink snnsresNoHeader Define
- HiLink snnsresNumbers Number
- HiLink snnsresComment Comment
- HiLink snnsresTodo Todo
-
- delcommand HiLink
-endif
+
+hi def link snnsresGen Statement
+hi def link snnsresHeader Statement
+hi def link snnsresNoHeader Define
+hi def link snnsresNumbers Number
+hi def link snnsresComment Comment
+hi def link snnsresTodo Todo
+
let b:current_syntax = "snnsres"
diff --git a/runtime/syntax/snobol4.vim b/runtime/syntax/snobol4.vim
index 07eb63dec7..11ce2e0059 100644
--- a/runtime/syntax/snobol4.vim
+++ b/runtime/syntax/snobol4.vim
@@ -2,19 +2,17 @@
" Language: SNOBOL4
" Maintainer: Rafal Sulejman <rms@poczta.onet.pl>
" Site: http://rms.republika.pl/vim/syntax/snobol4.vim
-" Last change: 2006 may 10
+" Last change: : Thu, 25 Jan 2018 14:21:24 +0100
" Changes:
+" - system variables updated for SNOBOL4 2.0+
" - strict snobol4 mode (set snobol4_strict_mode to activate)
" - incorrect HL of dots in strings corrected
" - incorrect HL of dot-variables in parens corrected
" - one character labels weren't displayed correctly.
" - nonexistent Snobol4 keywords displayed as errors.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -62,7 +60,7 @@ syn match snobol4Constant /"[^a-z"']\.[a-z][a-z0-9\-]*"/hs=s+1
syn region snobol4Goto start=":[sf]\{0,1}(" end=")\|$\|;" contains=ALLBUT,snobol4ParenError
syn match snobol4Number "\<\d*\(\.\d\d*\)*\>"
syn match snobol4BogusSysVar "&\w\{1,}"
-syn match snobol4SysVar "&\(abort\|alphabet\|anchor\|arb\|bal\|case\|code\|dump\|errlimit\|errtext\|errtype\|fail\|fence\|fnclevel\|ftrace\|fullscan\|input\|lastno\|lcase\|maxlngth\|output\|parm\|rem\|rtntype\|stcount\|stfcount\|stlimit\|stno\|succeed\|trace\|trim\|ucase\)"
+syn match snobol4SysVar "&\<\(abort\|alphabet\|anchor\|arb\|bal\|case\|code\|digits\|dump\|errlimit\|errtext\|errtype\|fail\|fence\|fnclevel\|ftrace\|fullscan\|input\|lastno\|lcase\|maxlngth\|output\|parm\|rem\|rtntype\|stcount\|stfcount\|stlimit\|stno\|succeed\|trace\|trim\|ucase\)\>"
syn match snobol4ExtSysVar "&\(gtrace\|line\|file\|lastline\|lastfile\)"
syn match snobol4Label "\(^\|;\)[^-\.\+ \t\*\.]\{1,}[^ \t\*\;]*"
syn match snobol4Comment "\(^\|;\)\([\*\|!;#].*$\)"
@@ -79,47 +77,37 @@ syn match snobol4ErrInBracket display contained "[){}]\|<%\|%>"
" syn match snobol4Comment "^\#\!.*$"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_snobol4_syntax_inits")
- if version < 508
- let did_snobol4_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink snobol4Constant Constant
- HiLink snobol4Label Label
- HiLink snobol4Goto Repeat
- HiLink snobol4Conditional Conditional
- HiLink snobol4Repeat Repeat
- HiLink snobol4Number Number
- HiLink snobol4Error Error
- HiLink snobol4Statement PreProc
- HiLink snobol4BogusStatement snobol4Error
- HiLink snobol4String String
- HiLink snobol4Comment Comment
- HiLink snobol4Special Special
- HiLink snobol4Todo Todo
- HiLink snobol4Keyword Keyword
- HiLink snobol4Function Function
- HiLink snobol4MathsOperator Operator
- HiLink snobol4ParenError snobol4Error
- HiLink snobol4ErrInParen snobol4Error
- HiLink snobol4ErrInBracket snobol4Error
- HiLink snobol4SysVar Keyword
- HiLink snobol4BogusSysVar snobol4Error
- if exists("snobol4_strict_mode")
- HiLink snobol4ExtSysVar WarningMsg
- HiLink snobol4ExtKeyword WarningMsg
- else
- HiLink snobol4ExtSysVar snobol4SysVar
- HiLink snobol4ExtKeyword snobol4Keyword
- endif
-
- delcommand HiLink
+hi def link snobol4Constant Constant
+hi def link snobol4Label Label
+hi def link snobol4Goto Repeat
+hi def link snobol4Conditional Conditional
+hi def link snobol4Repeat Repeat
+hi def link snobol4Number Number
+hi def link snobol4Error Error
+hi def link snobol4Statement PreProc
+hi def link snobol4BogusStatement snobol4Error
+hi def link snobol4String String
+hi def link snobol4Comment Comment
+hi def link snobol4Special Special
+hi def link snobol4Todo Todo
+hi def link snobol4Keyword Keyword
+hi def link snobol4Function Function
+hi def link snobol4MathsOperator Operator
+hi def link snobol4ParenError snobol4Error
+hi def link snobol4ErrInParen snobol4Error
+hi def link snobol4ErrInBracket snobol4Error
+hi def link snobol4SysVar Keyword
+hi def link snobol4BogusSysVar snobol4Error
+if exists("snobol4_strict_mode")
+ hi def link snobol4ExtSysVar WarningMsg
+ hi def link snobol4ExtKeyword WarningMsg
+else
+ hi def link snobol4ExtSysVar snobol4SysVar
+ hi def link snobol4ExtKeyword snobol4Keyword
endif
+
let b:current_syntax = "snobol4"
" vim: ts=8
diff --git a/runtime/syntax/spec.vim b/runtime/syntax/spec.vim
index 5d96b57a8a..3a7dc9e422 100644
--- a/runtime/syntax/spec.vim
+++ b/runtime/syntax/spec.vim
@@ -3,13 +3,10 @@
" Language: SPEC: Build/install scripts for Linux RPM packages
" Maintainer: Igor Gnatenko i.gnatenko.brain@gmail.com
" Former Maintainer: Donovan Rebbechi elflord@panix.com (until March 2014)
-" Last Change: Sun Mar 2 10:33 MSK 2014 Igor Gnatenko
+" Last Change: Sat Apr 9 15:30 2016 Filip Szymaล„ski
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -83,8 +80,8 @@ syn keyword specMacroNameLocal contained _arch _binary_payload _bindir _build _b
"One line macros - valid in all ScriptAreas
"tip: remember do include new items on specScriptArea's skip section
-syn region specSectionMacroArea oneline matchgroup=specSectionMacro start='^%\(define\|global\|patch\d*\|setup\|configure\|GNUconfigure\|find_lang\|makeinstall\|make_install\|include\)\>' end='$' contains=specCommandOpts,specMacroIdentifier
-syn region specSectionMacroBracketArea oneline matchgroup=specSectionMacro start='^%{\(configure\|GNUconfigure\|find_lang\|makeinstall\|make_install\)}' end='$' contains=specCommandOpts,specMacroIdentifier
+syn region specSectionMacroArea oneline matchgroup=specSectionMacro start='^%\(define\|global\|patch\d*\|setup\|autosetup\|autopatch\|configure\|GNUconfigure\|find_lang\|make_build\|makeinstall\|make_install\|include\)\>' end='$' contains=specCommandOpts,specMacroIdentifier
+syn region specSectionMacroBracketArea oneline matchgroup=specSectionMacro start='^%{\(configure\|GNUconfigure\|find_lang\|make_build\|makeinstall\|make_install\)}' end='$' contains=specCommandOpts,specMacroIdentifier
"%% Files Section %%
"TODO %config valid parameters: missingok\|noreplace
@@ -105,7 +102,7 @@ syn case ignore
"%% PreAmble Section %%
"Copyright and Serial were deprecated by License and Epoch
syn region specPreAmbleDeprecated oneline matchgroup=specError start='^\(Copyright\|Serial\)' end='$' contains=specEmail,specURL,specURLMacro,specLicense,specColon,specVariables,specSpecialChar,specMacroIdentifier
-syn region specPreAmble oneline matchgroup=specCommand start='^\(Prereq\|Summary\|Name\|Version\|Packager\|Requires\|Icon\|URL\|Source\d*\|Patch\d*\|Prefix\|Packager\|Group\|License\|Release\|BuildRoot\|Distribution\|Vendor\|Provides\|ExclusiveArch\|ExcludeArch\|ExclusiveOS\|Obsoletes\|BuildArch\|BuildArchitectures\|BuildRequires\|BuildConflicts\|BuildPreReq\|Conflicts\|AutoRequires\|AutoReq\|AutoReqProv\|AutoProv\|Epoch\)' end='$' contains=specEmail,specURL,specURLMacro,specLicense,specColon,specVariables,specSpecialChar,specMacroIdentifier
+syn region specPreAmble oneline matchgroup=specCommand start='^\(Prereq\|Summary\|Name\|Version\|Packager\|Requires\|Recommends\|Suggests\|Supplements\|Enhances\|Icon\|URL\|Source\d*\|Patch\d*\|Prefix\|Packager\|Group\|License\|Release\|BuildRoot\|Distribution\|Vendor\|Provides\|ExclusiveArch\|ExcludeArch\|ExclusiveOS\|Obsoletes\|BuildArch\|BuildArchitectures\|BuildRequires\|BuildConflicts\|BuildPreReq\|Conflicts\|AutoRequires\|AutoReq\|AutoReqProv\|AutoProv\|Epoch\)' end='$' contains=specEmail,specURL,specURLMacro,specLicense,specColon,specVariables,specSpecialChar,specMacroIdentifier
"%% Description Section %%
syn region specDescriptionArea matchgroup=specSection start='^%description' end='^%'me=e-1 contains=specDescriptionOpts,specEmail,specURL,specNumber,specMacroIdentifier,specComment
@@ -114,7 +111,7 @@ syn region specDescriptionArea matchgroup=specSection start='^%description' end=
syn region specPackageArea matchgroup=specSection start='^%package' end='^%'me=e-1 contains=specPackageOpts,specPreAmble,specComment
"%% Scripts Section %%
-syn region specScriptArea matchgroup=specSection start='^%\(prep\|build\|install\|clean\|pre\|postun\|preun\|post\|posttrans\)\>' skip='^%{\|^%\(define\|patch\d*\|configure\|GNUconfigure\|setup\|find_lang\|makeinstall\|make_install\)\>' end='^%'me=e-1 contains=specSpecialVariables,specVariables,@specCommands,specVariables,shDo,shFor,shCaseEsac,specNoNumberHilite,specCommandOpts,shComment,shIf,specSpecialChar,specMacroIdentifier,specSectionMacroArea,specSectionMacroBracketArea,shOperator,shQuote1,shQuote2
+syn region specScriptArea matchgroup=specSection start='^%\(prep\|build\|install\|clean\|pre\|postun\|preun\|post\|posttrans\)\>' skip='^%{\|^%\(define\|patch\d*\|configure\|GNUconfigure\|setup\|autosetup\|autopatch\|find_lang\|make_build\|makeinstall\|make_install\)\>' end='^%'me=e-1 contains=specSpecialVariables,specVariables,@specCommands,specVariables,shDo,shFor,shCaseEsac,specNoNumberHilite,specCommandOpts,shComment,shIf,specSpecialChar,specMacroIdentifier,specSectionMacroArea,specSectionMacroBracketArea,shOperator,shQuote1,shQuote2
"%% Changelog Section %%
syn region specChangelogArea matchgroup=specSection start='^%changelog' end='^%'me=e-1 contains=specEmail,specURL,specWeekday,specMonth,specNumber,specComment,specLicense
@@ -159,78 +156,68 @@ syn sync match shCaseEsacSync grouphere shCaseEsac "\<case\>"
syn sync match shCaseEsacSync groupthere shCaseEsac "\<esac\>"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_spec_syntax_inits")
- if version < 508
- let did_spec_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- "main types color definitions
- HiLink specSection Structure
- HiLink specSectionMacro Macro
- HiLink specWWWlink PreProc
- HiLink specOpts Operator
-
- "yes, it's ugly, but white is sooo cool
- if &background == "dark"
- hi def specGlobalMacro ctermfg=white
- else
- HiLink specGlobalMacro Identifier
- endif
-
- "sh colors
- HiLink shComment Comment
- HiLink shIf Statement
- HiLink shOperator Special
- HiLink shQuote1 String
- HiLink shQuote2 String
- HiLink shQuoteDelim Statement
-
- "spec colors
- HiLink specBlock Function
- HiLink specColon Special
- HiLink specCommand Statement
- HiLink specCommandOpts specOpts
- HiLink specCommandSpecial Special
- HiLink specComment Comment
- HiLink specConfigure specCommand
- HiLink specDate String
- HiLink specDescriptionOpts specOpts
- HiLink specEmail specWWWlink
- HiLink specError Error
- HiLink specFilesDirective specSectionMacro
- HiLink specFilesOpts specOpts
- HiLink specLicense String
- HiLink specMacroNameLocal specGlobalMacro
- HiLink specMacroNameOther specGlobalMacro
- HiLink specManpageFile NONE
- HiLink specMonth specDate
- HiLink specNoNumberHilite NONE
- HiLink specNumber Number
- HiLink specPackageOpts specOpts
- HiLink specPercent Special
- HiLink specSpecialChar Special
- HiLink specSpecialVariables specGlobalMacro
- HiLink specSpecialVariablesNames specGlobalMacro
- HiLink specTarCommand specCommand
- HiLink specURL specWWWlink
- HiLink specURLMacro specWWWlink
- HiLink specVariables Identifier
- HiLink specWeekday specDate
- HiLink specListedFilesBin Statement
- HiLink specListedFilesDoc Statement
- HiLink specListedFilesEtc Statement
- HiLink specListedFilesLib Statement
- HiLink specListedFilesPrefix Statement
- HiLink specListedFilesShare Statement
-
- delcommand HiLink
+" Only when an item doesn't have highlighting yet
+
+"main types color definitions
+hi def link specSection Structure
+hi def link specSectionMacro Macro
+hi def link specWWWlink PreProc
+hi def link specOpts Operator
+
+"yes, it's ugly, but white is sooo cool
+if &background == "dark"
+hi def specGlobalMacro ctermfg=white
+else
+hi def link specGlobalMacro Identifier
endif
+"sh colors
+hi def link shComment Comment
+hi def link shIf Statement
+hi def link shOperator Special
+hi def link shQuote1 String
+hi def link shQuote2 String
+hi def link shQuoteDelim Statement
+
+"spec colors
+hi def link specBlock Function
+hi def link specColon Special
+hi def link specCommand Statement
+hi def link specCommandOpts specOpts
+hi def link specCommandSpecial Special
+hi def link specComment Comment
+hi def link specConfigure specCommand
+hi def link specDate String
+hi def link specDescriptionOpts specOpts
+hi def link specEmail specWWWlink
+hi def link specError Error
+hi def link specFilesDirective specSectionMacro
+hi def link specFilesOpts specOpts
+hi def link specLicense String
+hi def link specMacroNameLocal specGlobalMacro
+hi def link specMacroNameOther specGlobalMacro
+hi def link specManpageFile NONE
+hi def link specMonth specDate
+hi def link specNoNumberHilite NONE
+hi def link specNumber Number
+hi def link specPackageOpts specOpts
+hi def link specPercent Special
+hi def link specSpecialChar Special
+hi def link specSpecialVariables specGlobalMacro
+hi def link specSpecialVariablesNames specGlobalMacro
+hi def link specTarCommand specCommand
+hi def link specURL specWWWlink
+hi def link specURLMacro specWWWlink
+hi def link specVariables Identifier
+hi def link specWeekday specDate
+hi def link specListedFilesBin Statement
+hi def link specListedFilesDoc Statement
+hi def link specListedFilesEtc Statement
+hi def link specListedFilesLib Statement
+hi def link specListedFilesPrefix Statement
+hi def link specListedFilesShare Statement
+
+
let b:current_syntax = "spec"
" vim: ts=8
diff --git a/runtime/syntax/specman.vim b/runtime/syntax/specman.vim
index 93fb4a86c6..9387925ef2 100644
--- a/runtime/syntax/specman.vim
+++ b/runtime/syntax/specman.vim
@@ -10,11 +10,8 @@
"---------------------------------------------------------
" Remove any old syntax stuff hanging around
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -137,46 +134,36 @@ syn region specmanString start=+"+ end=+"+
syn sync lines=50
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_specman_syn_inits")
- if version < 508
- let did_specman_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- " The default methods for highlighting. Can be overridden later
- HiLink specmanConditional Conditional
- HiLink specmanConstraint Conditional
- HiLink specmanRepeat Repeat
- HiLink specmanString String
- HiLink specmanComment Comment
- HiLink specmanConstant Macro
- HiLink specmanNumber Number
- HiLink specmanCompare Operator
- HiLink specmanOperator Operator
- HiLink specmanLogical Operator
- HiLink specmanStatement Statement
- HiLink specmanHDL SpecialChar
- HiLink specmanMethod Function
- HiLink specmanInclude Include
- HiLink specmanStructure Structure
- HiLink specmanBoolean Boolean
- HiLink specmanFSM Label
- HiLink specmanSpecial Special
- HiLink specmanType Type
- HiLink specmanTemporal Type
- HiLink specmanFile Include
- HiLink specmanPreCondit Include
- HiLink specmanDefine Typedef
- HiLink specmanLabel Label
- HiLink specmanPacking keyword
- HiLink specmanTodo Todo
- HiLink specmanParenError Error
- HiLink specmanErrInParen Error
- HiLink specmanErrInBracket Error
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+" The default methods for highlighting. Can be overridden later
+hi def link specmanConditional Conditional
+hi def link specmanConstraint Conditional
+hi def link specmanRepeat Repeat
+hi def link specmanString String
+hi def link specmanComment Comment
+hi def link specmanConstant Macro
+hi def link specmanNumber Number
+hi def link specmanCompare Operator
+hi def link specmanOperator Operator
+hi def link specmanLogical Operator
+hi def link specmanStatement Statement
+hi def link specmanHDL SpecialChar
+hi def link specmanMethod Function
+hi def link specmanInclude Include
+hi def link specmanStructure Structure
+hi def link specmanBoolean Boolean
+hi def link specmanFSM Label
+hi def link specmanSpecial Special
+hi def link specmanType Type
+hi def link specmanTemporal Type
+hi def link specmanFile Include
+hi def link specmanPreCondit Include
+hi def link specmanDefine Typedef
+hi def link specmanLabel Label
+hi def link specmanPacking keyword
+hi def link specmanTodo Todo
+hi def link specmanParenError Error
+hi def link specmanErrInParen Error
+hi def link specmanErrInBracket Error
let b:current_syntax = "specman"
diff --git a/runtime/syntax/spice.vim b/runtime/syntax/spice.vim
index 200e1aaea4..306039bc74 100644
--- a/runtime/syntax/spice.vim
+++ b/runtime/syntax/spice.vim
@@ -7,11 +7,8 @@
" This is based on sh.vim by Lennart Schultz
" but greatly simplified
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -53,28 +50,18 @@ syn match spiceParenError ")"
syn sync minlines=50
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_spice_syntax_inits")
- if version < 508
- let did_spice_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink spiceTodo Todo
- HiLink spiceWrapLineOperator spiceOperator
- HiLink spiceSinglequote spiceExpr
- HiLink spiceExpr Function
- HiLink spiceParenError Error
- HiLink spiceStatement Statement
- HiLink spiceNumber Number
- HiLink spiceComment Comment
- HiLink spiceOperator Operator
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link spiceTodo Todo
+hi def link spiceWrapLineOperator spiceOperator
+hi def link spiceSinglequote spiceExpr
+hi def link spiceExpr Function
+hi def link spiceParenError Error
+hi def link spiceStatement Statement
+hi def link spiceNumber Number
+hi def link spiceComment Comment
+hi def link spiceOperator Operator
+
let b:current_syntax = "spice"
diff --git a/runtime/syntax/splint.vim b/runtime/syntax/splint.vim
index dc09d8b9d6..8eba57d288 100644
--- a/runtime/syntax/splint.vim
+++ b/runtime/syntax/splint.vim
@@ -15,20 +15,13 @@
" in your vimrc file or filetype.vim
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" Read the C syntax to start with
-if version < 600
- so <sfile>:p:h/c.vim
-else
- runtime! syntax/c.vim
-endif
+runtime! syntax/c.vim
" FIXME: uses and changes several clusters defined in c.vim
@@ -199,61 +192,51 @@ syn cluster cPreProcGroup add=@splintAllStuff
syn cluster cMultiGroup add=@splintAllStuff
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_splint_syntax_inits")
- if version < 508
- let did_splint_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink splintShortAnn splintAnnotation
- HiLink splintAnnotation Comment
- HiLink splintAnnError splintError
- HiLink splintAnnError2 splintError
- HiLink splintFlag SpecialComment
- HiLink splintGlobalFlag splintError
- HiLink splintSpecialAnnot splintAnnKey
- HiLink splintStateAnnot splintAnnKey
- HiLink splintSpecTag splintAnnKey
- HiLink splintModifies splintAnnKey
- HiLink splintRequires splintAnnKey
- HiLink splintGlobals splintAnnKey
- HiLink splintGlobitem Constant
- HiLink splintGlobannot splintAnnKey
- HiLink splintWarning splintAnnKey
- HiLink splintModitem Constant
- HiLink splintIter splintAnnKey
- HiLink splintConst splintAnnKey
- HiLink splintAlt splintAnnKey
- HiLink splintType splintAnnKey
- HiLink splintGlobalType splintAnnKey
- HiLink splintMemMgm splintAnnKey
- HiLink splintAlias splintAnnKey
- HiLink splintExposure splintAnnKey
- HiLink splintDefState splintAnnKey
- HiLink splintGlobState splintAnnKey
- HiLink splintNullState splintAnnKey
- HiLink splintNullPred splintAnnKey
- HiLink splintExit splintAnnKey
- HiLink splintExec splintAnnKey
- HiLink splintSef splintAnnKey
- HiLink splintDecl splintAnnKey
- HiLink splintCase splintAnnKey
- HiLink splintBreak splintAnnKey
- HiLink splintUnreach splintAnnKey
- HiLink splintSpecFunc splintAnnKey
- HiLink splintErrSupp splintAnnKey
- HiLink splintTypeAcc splintAnnKey
- HiLink splintMacro splintAnnKey
- HiLink splintSpecType splintAnnKey
- HiLink splintAnnKey Type
- HiLink splintError Error
+" Only when an item doesn't have highlighting yet
+
+hi def link splintShortAnn splintAnnotation
+hi def link splintAnnotation Comment
+hi def link splintAnnError splintError
+hi def link splintAnnError2 splintError
+hi def link splintFlag SpecialComment
+hi def link splintGlobalFlag splintError
+hi def link splintSpecialAnnot splintAnnKey
+hi def link splintStateAnnot splintAnnKey
+hi def link splintSpecTag splintAnnKey
+hi def link splintModifies splintAnnKey
+hi def link splintRequires splintAnnKey
+hi def link splintGlobals splintAnnKey
+hi def link splintGlobitem Constant
+hi def link splintGlobannot splintAnnKey
+hi def link splintWarning splintAnnKey
+hi def link splintModitem Constant
+hi def link splintIter splintAnnKey
+hi def link splintConst splintAnnKey
+hi def link splintAlt splintAnnKey
+hi def link splintType splintAnnKey
+hi def link splintGlobalType splintAnnKey
+hi def link splintMemMgm splintAnnKey
+hi def link splintAlias splintAnnKey
+hi def link splintExposure splintAnnKey
+hi def link splintDefState splintAnnKey
+hi def link splintGlobState splintAnnKey
+hi def link splintNullState splintAnnKey
+hi def link splintNullPred splintAnnKey
+hi def link splintExit splintAnnKey
+hi def link splintExec splintAnnKey
+hi def link splintSef splintAnnKey
+hi def link splintDecl splintAnnKey
+hi def link splintCase splintAnnKey
+hi def link splintBreak splintAnnKey
+hi def link splintUnreach splintAnnKey
+hi def link splintSpecFunc splintAnnKey
+hi def link splintErrSupp splintAnnKey
+hi def link splintTypeAcc splintAnnKey
+hi def link splintMacro splintAnnKey
+hi def link splintSpecType splintAnnKey
+hi def link splintAnnKey Type
+hi def link splintError Error
- delcommand HiLink
-endif
let b:current_syntax = "splint"
diff --git a/runtime/syntax/spup.vim b/runtime/syntax/spup.vim
index 8d7a9e525c..743c7b5711 100644
--- a/runtime/syntax/spup.vim
+++ b/runtime/syntax/spup.vim
@@ -17,11 +17,8 @@
" If you encounter problems or have questions or suggestions, mail me
" Remove old syntax stuff
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -206,74 +203,64 @@ syn sync match spupSyncTitle grouphere spupTitle "^TITLE"
syn sync match spupSyncUnit grouphere spupUnit "^UNIT"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_spup_syn_inits")
- if version < 508
- let did_spup_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink spupCdi spupSection
- HiLink spupConditions spupSection
- HiLink spupDeclare spupSection
- HiLink spupEstimation spupSection
- HiLink spupExternal spupSection
- HiLink spupFlowsheet spupSection
- HiLink spupFunction spupSection
- HiLink spupGlobal spupSection
- HiLink spupHomotopy spupSection
- HiLink spupMacro spupSection
- HiLink spupModel spupSection
- HiLink spupOperation spupSection
- HiLink spupOptions spupSection
- HiLink spupProcedure spupSection
- HiLink spupProfiles spupSection
- HiLink spupReport spupSection
- HiLink spupTitle spupConstant " this is correct, truly ;)
- HiLink spupUnit spupSection
+hi def link spupCdi spupSection
+hi def link spupConditions spupSection
+hi def link spupDeclare spupSection
+hi def link spupEstimation spupSection
+hi def link spupExternal spupSection
+hi def link spupFlowsheet spupSection
+hi def link spupFunction spupSection
+hi def link spupGlobal spupSection
+hi def link spupHomotopy spupSection
+hi def link spupMacro spupSection
+hi def link spupModel spupSection
+hi def link spupOperation spupSection
+hi def link spupOptions spupSection
+hi def link spupProcedure spupSection
+hi def link spupProfiles spupSection
+hi def link spupReport spupSection
+hi def link spupTitle spupConstant " this is correct, truly ;)
+hi def link spupUnit spupSection
- HiLink spupCdiSubs spupSubs
- HiLink spupConditionsSubs spupSubs
- HiLink spupDeclareSubs spupSubs
- HiLink spupEstimationSubs spupSubs
- HiLink spupExternalSubs spupSubs
- HiLink spupFlowsheetSubs spupSubs
- HiLink spupFunctionSubs spupSubs
- HiLink spupHomotopySubs spupSubs
- HiLink spupMacroSubs spupSubs
- HiLink spupModelSubs spupSubs
- HiLink spupOperationSubs spupSubs
- HiLink spupOptionsSubs spupSubs
- HiLink spupProcedureSubs spupSubs
- HiLink spupReportSubs spupSubs
- HiLink spupUnitSubs spupSubs
+hi def link spupCdiSubs spupSubs
+hi def link spupConditionsSubs spupSubs
+hi def link spupDeclareSubs spupSubs
+hi def link spupEstimationSubs spupSubs
+hi def link spupExternalSubs spupSubs
+hi def link spupFlowsheetSubs spupSubs
+hi def link spupFunctionSubs spupSubs
+hi def link spupHomotopySubs spupSubs
+hi def link spupMacroSubs spupSubs
+hi def link spupModelSubs spupSubs
+hi def link spupOperationSubs spupSubs
+hi def link spupOptionsSubs spupSubs
+hi def link spupProcedureSubs spupSubs
+hi def link spupReportSubs spupSubs
+hi def link spupUnitSubs spupSubs
- HiLink spupCode Normal
- HiLink spupComment Comment
- HiLink spupComment2 spupComment
- HiLink spupConditional Statement
- HiLink spupConstant Constant
- HiLink spupError Error
- HiLink spupHelp Normal
- HiLink spupIdentifier Identifier
- HiLink spupNumber Constant
- HiLink spupOperator Special
- HiLink spupOpenBrace spupError
- HiLink spupSection Statement
- HiLink spupSpecial spupTextprocGeneric
- HiLink spupStreams Type
- HiLink spupString Constant
- HiLink spupSubs Statement
- HiLink spupSymbol Special
- HiLink spupTextprocError Normal
- HiLink spupTextprocGeneric PreProc
- HiLink spupTypes Type
+hi def link spupCode Normal
+hi def link spupComment Comment
+hi def link spupComment2 spupComment
+hi def link spupConditional Statement
+hi def link spupConstant Constant
+hi def link spupError Error
+hi def link spupHelp Normal
+hi def link spupIdentifier Identifier
+hi def link spupNumber Constant
+hi def link spupOperator Special
+hi def link spupOpenBrace spupError
+hi def link spupSection Statement
+hi def link spupSpecial spupTextprocGeneric
+hi def link spupStreams Type
+hi def link spupString Constant
+hi def link spupSubs Statement
+hi def link spupSymbol Special
+hi def link spupTextprocError Normal
+hi def link spupTextprocGeneric PreProc
+hi def link spupTypes Type
- delcommand HiLink
-endif
let b:current_syntax = "spup"
diff --git a/runtime/syntax/spyce.vim b/runtime/syntax/spyce.vim
index e76cb1a1a2..169de199dc 100644
--- a/runtime/syntax/spyce.vim
+++ b/runtime/syntax/spyce.vim
@@ -4,11 +4,8 @@
" URL: http://spyce.sourceforge.net
" Last Change: 2009 Nov 11
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -20,13 +17,9 @@ endif
" Read the HTML syntax to start with
let b:did_indent = 1 " don't perform HTML indentation!
let html_no_rendering = 1 " do not render <b>,<i>, etc...
-if version < 600
- so <sfile>:p:h/html.vim
-else
- runtime! syntax/html.vim
- unlet b:current_syntax
- syntax spell default " added by Bram
-endif
+runtime! syntax/html.vim
+unlet b:current_syntax
+syntax spell default " added by Bram
" include python
syn include @Python <sfile>:p:h/python.vim
diff --git a/runtime/syntax/sql.vim b/runtime/syntax/sql.vim
index 7ba20f3446..6de3f4a5c0 100644
--- a/runtime/syntax/sql.vim
+++ b/runtime/syntax/sql.vim
@@ -10,11 +10,8 @@
" If the above exist, it will source the type specified.
" If none exist, it will source the default sql.vim file.
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/sqlanywhere.vim b/runtime/syntax/sqlanywhere.vim
index 05b05c9f4f..e91a99de65 100644
--- a/runtime/syntax/sqlanywhere.vim
+++ b/runtime/syntax/sqlanywhere.vim
@@ -12,11 +12,8 @@
" Updated to Adaptive Server Anywhere 9.0.1
" Updated to Adaptive Server Anywhere 9.0.0
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/sqlforms.vim b/runtime/syntax/sqlforms.vim
index 055b2ae870..6077dd1e94 100644
--- a/runtime/syntax/sqlforms.vim
+++ b/runtime/syntax/sqlforms.vim
@@ -7,21 +7,14 @@
"
" TODO Find a new maintainer who knows SQL*Forms.
- " For version 5.x, clear all syntax items.
- " For version 6.x, quit when a syntax file was already loaded.
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
syntax case ignore
-if version >= 600
- setlocal iskeyword=a-z,A-Z,48-57,_,.,-,>
-else
- set iskeyword=a-z,A-Z,48-57,_,.,-,>
-endif
+setlocal iskeyword=a-z,A-Z,48-57,_,.,-,>
" The SQL reserved words, defined as keywords.
@@ -138,30 +131,21 @@ syntax match sqlNumber "-\=\<[0-9]*\.\=[0-9_]\>"
syntax sync ccomment sqlComment
-if version >= 508 || !exists("did_sqlforms_syn_inits")
- if version < 508
- let did_sqlforms_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink sqlComment Comment
- HiLink sqlKeyword Statement
- HiLink sqlNumber Number
- HiLink sqlOperator Statement
- HiLink sqlProcedure Statement
- HiLink sqlFunction Statement
- HiLink sqlSystem Identifier
- HiLink sqlSpecial Special
- HiLink sqlStatement Statement
- HiLink sqlString String
- HiLink sqlType Type
- HiLink sqlCodes Identifier
- HiLink sqlTriggers PreProc
-
- delcommand HiLink
-endif
+
+hi def link sqlComment Comment
+hi def link sqlKeyword Statement
+hi def link sqlNumber Number
+hi def link sqlOperator Statement
+hi def link sqlProcedure Statement
+hi def link sqlFunction Statement
+hi def link sqlSystem Identifier
+hi def link sqlSpecial Special
+hi def link sqlStatement Statement
+hi def link sqlString String
+hi def link sqlType Type
+hi def link sqlCodes Identifier
+hi def link sqlTriggers PreProc
+
let b:current_syntax = "sqlforms"
diff --git a/runtime/syntax/sqlhana.vim b/runtime/syntax/sqlhana.vim
index 1410e99eb4..2e334bb56e 100644
--- a/runtime/syntax/sqlhana.vim
+++ b/runtime/syntax/sqlhana.vim
@@ -7,11 +7,8 @@
" Description: Updated to SAP HANA SP4
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/sqlinformix.vim b/runtime/syntax/sqlinformix.vim
index b4d023600c..e01912bc40 100644
--- a/runtime/syntax/sqlinformix.vim
+++ b/runtime/syntax/sqlinformix.vim
@@ -4,11 +4,8 @@
" Maintainer: Dean Hill <dhill@hotmail.com>
" Last Change: 2004 Aug 30
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -154,43 +151,33 @@ syn keyword sqlTodo TODO FIXME XXX DEBUG NOTE
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_sql_syn_inits")
- if version < 508
- let did_sql_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
-
- " === Comment syntax group ===
- HiLink sqlComment Comment
-
- " === Constant syntax group ===
- HiLink sqlNumber Number
- HiLink sqlBoolean Boolean
- HiLink sqlString String
-
- " === Statment syntax group ===
- HiLink sqlStatement Statement
- HiLink sqlConditional Conditional
- HiLink sqlRepeat Repeat
- HiLink sqlKeyword Keyword
- HiLink sqlOperator Operator
- HiLink sqlException Exception
-
- " === Identifier syntax group ===
- HiLink sqlFunction Function
-
- " === Type syntax group ===
- HiLink sqlType Type
-
- " === Todo syntax group ===
- HiLink sqlTodo Todo
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+
+" === Comment syntax group ===
+hi def link sqlComment Comment
+
+" === Constant syntax group ===
+hi def link sqlNumber Number
+hi def link sqlBoolean Boolean
+hi def link sqlString String
+
+" === Statment syntax group ===
+hi def link sqlStatement Statement
+hi def link sqlConditional Conditional
+hi def link sqlRepeat Repeat
+hi def link sqlKeyword Keyword
+hi def link sqlOperator Operator
+hi def link sqlException Exception
+
+" === Identifier syntax group ===
+hi def link sqlFunction Function
+
+" === Type syntax group ===
+hi def link sqlType Type
+
+" === Todo syntax group ===
+hi def link sqlTodo Todo
+
let b:current_syntax = "sqlinformix"
diff --git a/runtime/syntax/sqlj.vim b/runtime/syntax/sqlj.vim
index 51398ef9c2..c901145c3c 100644
--- a/runtime/syntax/sqlj.vim
+++ b/runtime/syntax/sqlj.vim
@@ -8,10 +8,8 @@
" au BufNewFile,BufRead *.sqlj so $VIM/syntax/sqlj.vim
-" Remove any old syntax stuff hanging around
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -76,27 +74,18 @@ syn match sqlComment "--.*"
syn sync ccomment sqljComment
-if version >= 508 || !exists("did_sqlj_syn_inits")
- if version < 508
- let did_sqlj_syn_inits = 1
- command! -nargs=+ HiLink hi link <args>
- else
- command! -nargs=+ HiLink hi def link <args>
- endif
-
- " The default methods for highlighting. Can be overridden later.
- HiLink sqljComment Comment
- HiLink sqljKeyword sqljSpecial
- HiLink sqljNumber Number
- HiLink sqljOperator sqljStatement
- HiLink sqljSpecial Special
- HiLink sqljStatement Statement
- HiLink sqljString String
- HiLink sqljType Type
- HiLink sqljPre PreProc
-
- delcommand HiLink
-endif
+
+" The default methods for highlighting. Can be overridden later.
+hi def link sqljComment Comment
+hi def link sqljKeyword sqljSpecial
+hi def link sqljNumber Number
+hi def link sqljOperator sqljStatement
+hi def link sqljSpecial Special
+hi def link sqljStatement Statement
+hi def link sqljString String
+hi def link sqljType Type
+hi def link sqljPre PreProc
+
let b:current_syntax = "sqlj"
diff --git a/runtime/syntax/sqloracle.vim b/runtime/syntax/sqloracle.vim
index 8afe2686bf..0907b48f0e 100644
--- a/runtime/syntax/sqloracle.vim
+++ b/runtime/syntax/sqloracle.vim
@@ -4,7 +4,15 @@
" Repository: https://github.com/chrisbra/vim-sqloracle-syntax
" License: Vim
" Previous Maintainer: Paul Moore
-" Last Change: 2015 Nov 24
+" Last Change: 2018 June 24
+
+" Changes:
+" 02.04.2016: Support for when keyword
+" 03.04.2016: Support for join related keywords
+" 22.07.2016: Support Oracle Q-Quote-Syntax
+" 25.07.2016: Support for Oracle N'-Quote syntax
+" 22.06.2018: Remove skip part for sqlString (do not escape strings)
+" (https://web.archive.org/web/20150922065035/https://mariadb.com/kb/en/sql-99/character-string-literals/)
if exists("b:current_syntax")
finish
@@ -24,10 +32,11 @@ syn keyword sqlKeyword index initial initrans into is level link logging loop
syn keyword sqlKeyword maxextents maxtrans mode modify monitoring
syn keyword sqlKeyword nocache nocompress nologging noparallel nowait of offline on online start
syn keyword sqlKeyword parallel successful synonym table tablespace then to trigger uid
-syn keyword sqlKeyword unique user validate values view whenever
+syn keyword sqlKeyword unique user validate values view when whenever
syn keyword sqlKeyword where with option order pctfree pctused privileges procedure
syn keyword sqlKeyword public resource return row rowlabel rownum rows
syn keyword sqlKeyword session share size smallint type using
+syn keyword sqlKeyword join cross inner outer left right
syn keyword sqlOperator not and or
syn keyword sqlOperator in any some all between exists
@@ -43,12 +52,19 @@ syn keyword sqlStatement truncate
" next ones are contained, so folding works.
syn keyword sqlStatement create update alter select insert contained
-syn keyword sqlType boolean char character date float integer long
-syn keyword sqlType mlslabel number raw rowid varchar varchar2 varray
+syn keyword sqlType bfile blob boolean char character clob date datetime
+syn keyword sqlType dec decimal float int integer long mlslabel nchar
+syn keyword sqlType nclob number numeric nvarchar2 precision raw rowid
+syn keyword sqlType smallint real timestamp urowid varchar varchar2 varray
" Strings:
-syn region sqlString start=+"+ skip=+\\\\\|\\"+ end=+"+
-syn region sqlString start=+'+ skip=+\\\\\|\\'+ end=+'+
+syn region sqlString matchgroup=Quote start=+n\?"+ end=+"+
+syn region sqlString matchgroup=Quote start=+n\?'+ end=+'+
+syn region sqlString matchgroup=Quote start=+n\?q'\z([^[(<{]\)+ end=+\z1'+
+syn region sqlString matchgroup=Quote start=+n\?q'<+ end=+>'+
+syn region sqlString matchgroup=Quote start=+n\?q'{+ end=+}'+
+syn region sqlString matchgroup=Quote start=+n\?q'(+ end=+)'+
+syn region sqlString matchgroup=Quote start=+n\?q'\[+ end=+]'+
" Numbers:
syn match sqlNumber "-\=\<\d*\.\=[0-9_]\>"
@@ -56,6 +72,7 @@ syn match sqlNumber "-\=\<\d*\.\=[0-9_]\>"
" Comments:
syn region sqlComment start="/\*" end="\*/" contains=sqlTodo,@Spell fold
syn match sqlComment "--.*$" contains=sqlTodo,@Spell
+syn match sqlComment "^rem.*$" contains=sqlTodo,@Spell
" Setup Folding:
" this is a hack, to get certain statements folded.
@@ -117,18 +134,17 @@ syn keyword sqlFunction xmlparse xmlpatch xmlpi xmlquery xmlroot xmlsequence xml
syn keyword sqlTodo TODO FIXME XXX DEBUG NOTE contained
" Define the default highlighting.
-command -nargs=+ HiLink hi def link <args>
-HiLink sqlComment Comment
-HiLink sqlFunction Function
-HiLink sqlKeyword sqlSpecial
-HiLink sqlNumber Number
-HiLink sqlOperator sqlStatement
-HiLink sqlSpecial Special
-HiLink sqlStatement Statement
-HiLink sqlString String
-HiLink sqlType Type
-HiLink sqlTodo Todo
-
-delcommand HiLink
+hi def link Quote Special
+hi def link sqlComment Comment
+hi def link sqlFunction Function
+hi def link sqlKeyword sqlSpecial
+hi def link sqlNumber Number
+hi def link sqlOperator sqlStatement
+hi def link sqlSpecial Special
+hi def link sqlStatement Statement
+hi def link sqlString String
+hi def link sqlType Type
+hi def link sqlTodo Todo
+
let b:current_syntax = "sql"
" vim: ts=8
diff --git a/runtime/syntax/sqr.vim b/runtime/syntax/sqr.vim
index 8c9e7b49e4..40b48358c6 100644
--- a/runtime/syntax/sqr.vim
+++ b/runtime/syntax/sqr.vim
@@ -16,19 +16,12 @@
" http://lanzarotta.tripod.com/vim.html
" jefflanzarotta at yahoo dot com
-" For version 5.x, clear all syntax items.
-" For version 6.x, quit when a syntax file was already loaded.
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
-if version >= 600
- setlocal iskeyword=@,48-57,_,-,#,$,{,}
-else
- set iskeyword=@,48-57,_,-,#,$,{,}
-endif
+setlocal iskeyword=@,48-57,_,-,#,$,{,}
syn case ignore
@@ -220,75 +213,49 @@ syn match sqrNumber /-\=\<\d*\.\=[0-9_]\>/
syn keyword sqrTodo TODO FIXME XXX DEBUG NOTE ###
syn match sqrTodo /???/
-if version >= 600
- " See also the sqrString section above for handling of ! characters
- " inside of strings. (Those patterns override the ones below.)
- syn match sqrComment /!\@<!!\([^!=].*\|$\)/ contains=sqrTodo
- " the ! can't be preceded by another !,
- " and must be followed by at least one
- " character other than ! or =, or immediately
- " by the end-of-line
- syn match sqrComment /^!=.*/ contains=sqrTodo
- syn match sqrComment /^!!.*/ contains=sqrTodo
- syn match sqrError /^\s\+\zs!=.*/
- " it's an error to have "!=" preceded by
- " just whitespace on the line ("!="
- " preceded by non-whitespace is treated
- " as neither a comment nor an error, since
- " it is often correct, i.e.
- " if #count != 7
- syn match sqrError /.\+\zs!!.*/
- " a "!!" anywhere but at the beginning of
- " the line is always an error
-else "For versions before 6.0, same idea as above but we are limited
- "to simple patterns only. Also, the sqrString patterns above
- "don't seem to take precedence in v5 as they do in v6, so
- "we split the last rule to ignore comments found inside of
- "string literals.
- syn match sqrComment /!\([^!=].*\|$\)/ contains=sqrTodo
- syn match sqrComment /^!=.*/ contains=sqrTodo
- syn match sqrComment /^!!.*/ contains=sqrTodo
- syn match sqrError /^\s\+!=.*/
- syn match sqrError /^[^'!]\+!!/
- " flag !! on lines that don't have ! or '
- syn match sqrError /^\([^!']*'[^']*'[^!']*\)\+!!/
- " flag !! found after matched ' ' chars
- " (that aren't also commented)
-endif
+" See also the sqrString section above for handling of ! characters
+" inside of strings. (Those patterns override the ones below.)
+syn match sqrComment /!\@<!!\([^!=].*\|$\)/ contains=sqrTodo
+" the ! can't be preceded by another !,
+" and must be followed by at least one
+" character other than ! or =, or immediately
+" by the end-of-line
+syn match sqrComment /^!=.*/ contains=sqrTodo
+syn match sqrComment /^!!.*/ contains=sqrTodo
+syn match sqrError /^\s\+\zs!=.*/
+" it's an error to have "!=" preceded by
+" just whitespace on the line ("!="
+" preceded by non-whitespace is treated
+" as neither a comment nor an error, since
+" it is often correct, i.e.
+" if #count != 7
+syn match sqrError /.\+\zs!!.*/
+" a "!!" anywhere but at the beginning of
+" the line is always an error
" Define the default highlighting.
-" For version 5.7 and earlier, only when not done already.
-" For version 5.8 and later, only when an item doesn't have highlighting yet.
-if version >= 508 || !exists("did_sqr_syn_inits")
- if version < 508
- let did_sqr_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink sqrSection Statement
- HiLink sqrParagraph Statement
- HiLink sqrReserved Statement
- HiLink sqrParameter Statement
- HiLink sqrPreProc PreProc
- HiLink sqrSubstVar PreProc
- HiLink sqrCommand Statement
- HiLink sqrParam Type
- HiLink sqrFunction Special
-
- HiLink sqrString String
- HiLink sqrStrOpen Todo
- HiLink sqrNumber Number
- HiLink sqrVariable Identifier
-
- HiLink sqrComment Comment
- HiLink sqrTodo Todo
- HiLink sqrError Error
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet.
+
+hi def link sqrSection Statement
+hi def link sqrParagraph Statement
+hi def link sqrReserved Statement
+hi def link sqrParameter Statement
+hi def link sqrPreProc PreProc
+hi def link sqrSubstVar PreProc
+hi def link sqrCommand Statement
+hi def link sqrParam Type
+hi def link sqrFunction Special
+
+hi def link sqrString String
+hi def link sqrStrOpen Todo
+hi def link sqrNumber Number
+hi def link sqrVariable Identifier
+
+hi def link sqrComment Comment
+hi def link sqrTodo Todo
+hi def link sqrError Error
+
let b:current_syntax = "sqr"
diff --git a/runtime/syntax/squid.vim b/runtime/syntax/squid.vim
index a8462bbdce..a8abd180a0 100644
--- a/runtime/syntax/squid.vim
+++ b/runtime/syntax/squid.vim
@@ -7,11 +7,8 @@
" Michael Dotzler <Michael.Dotzler@leoni.com>
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -123,30 +120,20 @@ syn match squidRegexOpt contained "\(^\s*acl\s\+\S\+\s\+\S\+\(_regex\|_mime_type
syn sync minlines=3
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_squid_syntax_inits")
- if version < 508
- let did_squid_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink squidTodo Todo
- HiLink squidComment Comment
- HiLink squidTag Special
- HiLink squidConf Keyword
- HiLink squidOpt Constant
- HiLink squidAction String
- HiLink squidNumber Number
- HiLink squidIP Number
- HiLink squidAcl Keyword
- HiLink squidStr String
- HiLink squidRegexOpt Special
+hi def link squidTodo Todo
+hi def link squidComment Comment
+hi def link squidTag Special
+hi def link squidConf Keyword
+hi def link squidOpt Constant
+hi def link squidAction String
+hi def link squidNumber Number
+hi def link squidIP Number
+hi def link squidAcl Keyword
+hi def link squidStr String
+hi def link squidRegexOpt Special
- delcommand HiLink
-endif
let b:current_syntax = "squid"
diff --git a/runtime/syntax/srec.vim b/runtime/syntax/srec.vim
index 19b6d97426..6ac22d9062 100644
--- a/runtime/syntax/srec.vim
+++ b/runtime/syntax/srec.vim
@@ -24,11 +24,8 @@
" States in parentheses in the upper format description indicate that they
" should not appear in a valid file.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -63,33 +60,23 @@ syn match srecDataUnexpected "[0-9a-fA-F]\{2}" contained nextgroup=srecDataUnexp
syn match srecChecksum "[0-9a-fA-F]\{2}$" contained
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_srec_syntax_inits")
- if version < 508
- let did_srec_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- " The default methods for highlighting. Can be overridden later
- HiLink srecRecStart srecRecType
- HiLink srecRecTypeUnknown srecRecType
- HiLink srecRecType WarningMsg
- HiLink srecByteCount Constant
- hi def srecAddressFieldUnknown term=italic cterm=italic gui=italic
- HiLink srecNoAddress DiffAdd
- HiLink srecDataAddress Comment
- HiLink srecRecCount srecNoAddress
- HiLink srecStartAddress srecDataAddress
- hi def srecDataOdd term=bold cterm=bold gui=bold
- hi def srecDataEven term=NONE cterm=NONE gui=NONE
- HiLink srecDataUnexpected Error
- HiLink srecChecksum DiffChange
+" The default methods for highlighting. Can be overridden later
+hi def link srecRecStart srecRecType
+hi def link srecRecTypeUnknown srecRecType
+hi def link srecRecType WarningMsg
+hi def link srecByteCount Constant
+hi def srecAddressFieldUnknown term=italic cterm=italic gui=italic
+hi def link srecNoAddress DiffAdd
+hi def link srecDataAddress Comment
+hi def link srecRecCount srecNoAddress
+hi def link srecStartAddress srecDataAddress
+hi def srecDataOdd term=bold cterm=bold gui=bold
+hi def srecDataEven term=NONE cterm=NONE gui=NONE
+hi def link srecDataUnexpected Error
+hi def link srecChecksum DiffChange
- delcommand HiLink
-endif
let b:current_syntax = "srec"
diff --git a/runtime/syntax/sshconfig.vim b/runtime/syntax/sshconfig.vim
index 44b3c67a96..755d08e768 100644
--- a/runtime/syntax/sshconfig.vim
+++ b/runtime/syntax/sshconfig.vim
@@ -4,24 +4,18 @@
" Maintainer: Dominik Fischer <d dot f dot fischer at web dot de>
" Contributor: Leonard Ehrenfried <leonard.ehrenfried@web.de>
" Contributor: Karsten Hopp <karsten@redhat.com>
-" Last Change: 2016 Mar 1
-" SSH Version: 7.2
+" Contributor: Dean, Adam Kenneth <adam.ken.dean@hpe.com>
+" Last Change: 2016 Dec 28
+" SSH Version: 7.4p1
"
" Setup
-if version >= 600
- if exists("b:current_syntax")
- finish
- endif
-else
- syntax clear
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
endif
-if version >= 600
- setlocal iskeyword=_,-,a-z,A-Z,48-57
-else
- set iskeyword=_,-,a-z,A-Z,48-57
-endif
+setlocal iskeyword=_,-,a-z,A-Z,48-57
" case on
@@ -36,7 +30,7 @@ syn keyword sshconfigTodo TODO FIXME NOTE contained
" Constants
-syn keyword sshconfigYesNo yes no ask
+syn keyword sshconfigYesNo yes no ask confirm
syn keyword sshconfigYesNo any auto
syn keyword sshconfigYesNo force autoask none
@@ -139,6 +133,7 @@ syn keyword sshconfigHostSect Host
syn keyword sshconfigMatch canonical exec host originalhost user localuser all
syn keyword sshconfigKeyword AddressFamily
+syn keyword sshconfigKeyword AddKeysToAgent
syn keyword sshconfigKeyword BatchMode
syn keyword sshconfigKeyword BindAddress
syn keyword sshconfigKeyword CanonicalDomains
@@ -186,6 +181,7 @@ syn keyword sshconfigKeyword IPQoS
syn keyword sshconfigKeyword IdentitiesOnly
syn keyword sshconfigKeyword IdentityFile
syn keyword sshconfigKeyword IgnoreUnknown
+syn keyword sshconfigKeyword Include
syn keyword sshconfigKeyword IPQoS
syn keyword sshconfigKeyword KbdInteractiveAuthentication
syn keyword sshconfigKeyword KbdInteractiveDevices
@@ -204,6 +200,7 @@ syn keyword sshconfigKeyword Port
syn keyword sshconfigKeyword PreferredAuthentications
syn keyword sshconfigKeyword Protocol
syn keyword sshconfigKeyword ProxyCommand
+syn keyword sshconfigKeyword ProxyJump
syn keyword sshconfigKeyword ProxyUseFDPass
syn keyword sshconfigKeyword PubkeyAcceptedKeyTypes
syn keyword sshconfigKeyword PubkeyAuthentication
@@ -230,40 +227,31 @@ syn keyword sshconfigKeyword VisualHostKey
syn keyword sshconfigKeyword XAuthLocation
" Define the default highlighting
-if version >= 508 || !exists("did_sshconfig_syntax_inits")
- if version < 508
- let did_sshconfig_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink sshconfigComment Comment
- HiLink sshconfigTodo Todo
- HiLink sshconfigHostPort sshconfigConstant
- HiLink sshconfigNumber sshconfigConstant
- HiLink sshconfigConstant Constant
- HiLink sshconfigYesNo sshconfigEnum
- HiLink sshconfigCipher sshconfigEnum
- HiLink sshconfigCiphers sshconfigEnum
- HiLink sshconfigMAC sshconfigEnum
- HiLink sshconfigHostKeyAlgo sshconfigEnum
- HiLink sshconfigLogLevel sshconfigEnum
- HiLink sshconfigSysLogFacility sshconfigEnum
- HiLink sshconfigAddressFamily sshconfigEnum
- HiLink sshconfigIPQoS sshconfigEnum
- HiLink sshconfigKbdInteractive sshconfigEnum
- HiLink sshconfigKexAlgo sshconfigEnum
- HiLink sshconfigTunnel sshconfigEnum
- HiLink sshconfigPreferredAuth sshconfigEnum
- HiLink sshconfigVar sshconfigEnum
- HiLink sshconfigEnum Identifier
- HiLink sshconfigSpecial Special
- HiLink sshconfigKeyword Keyword
- HiLink sshconfigHostSect Type
- HiLink sshconfigMatch Type
- delcommand HiLink
-endif
+hi def link sshconfigComment Comment
+hi def link sshconfigTodo Todo
+hi def link sshconfigHostPort sshconfigConstant
+hi def link sshconfigNumber sshconfigConstant
+hi def link sshconfigConstant Constant
+hi def link sshconfigYesNo sshconfigEnum
+hi def link sshconfigCipher sshconfigEnum
+hi def link sshconfigCiphers sshconfigEnum
+hi def link sshconfigMAC sshconfigEnum
+hi def link sshconfigHostKeyAlgo sshconfigEnum
+hi def link sshconfigLogLevel sshconfigEnum
+hi def link sshconfigSysLogFacility sshconfigEnum
+hi def link sshconfigAddressFamily sshconfigEnum
+hi def link sshconfigIPQoS sshconfigEnum
+hi def link sshconfigKbdInteractive sshconfigEnum
+hi def link sshconfigKexAlgo sshconfigEnum
+hi def link sshconfigTunnel sshconfigEnum
+hi def link sshconfigPreferredAuth sshconfigEnum
+hi def link sshconfigVar sshconfigEnum
+hi def link sshconfigEnum Identifier
+hi def link sshconfigSpecial Special
+hi def link sshconfigKeyword Keyword
+hi def link sshconfigHostSect Type
+hi def link sshconfigMatch Type
let b:current_syntax = "sshconfig"
diff --git a/runtime/syntax/sshdconfig.vim b/runtime/syntax/sshdconfig.vim
index 6b7b98d893..3924aaf94a 100644
--- a/runtime/syntax/sshdconfig.vim
+++ b/runtime/syntax/sshdconfig.vim
@@ -6,24 +6,17 @@
" Contributor: Leonard Ehrenfried <leonard.ehrenfried@web.de>
" Contributor: Karsten Hopp <karsten@redhat.com>
" Originally: 2009-07-09
-" Last Change: 2016 Mar 1
-" SSH Version: 7.2
+" Last Change: 2017 Oct 25
+" SSH Version: 7.6p1
"
" Setup
-if version >= 600
- if exists("b:current_syntax")
- finish
- endif
-else
- syntax clear
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
endif
-if version >= 600
- setlocal iskeyword=_,-,a-z,A-Z,48-57
-else
- set iskeyword=_,-,a-z,A-Z,48-57
-endif
+setlocal iskeyword=_,-,a-z,A-Z,48-57
" case on
@@ -168,6 +161,7 @@ syn keyword sshdconfigKeyword Compression
syn keyword sshdconfigKeyword DebianBanner
syn keyword sshdconfigKeyword DenyGroups
syn keyword sshdconfigKeyword DenyUsers
+syn keyword sshdconfigKeyword DisableForwarding
syn keyword sshdconfigKeyword ForceCommand
syn keyword sshdconfigKeyword GSSAPIAuthentication
syn keyword sshdconfigKeyword GSSAPICleanupCredentials
@@ -230,7 +224,6 @@ syn keyword sshdconfigKeyword TrustedUserCAKeys
syn keyword sshdconfigKeyword UseDNS
syn keyword sshdconfigKeyword UseLogin
syn keyword sshdconfigKeyword UsePAM
-syn keyword sshdconfigKeyword UsePrivilegeSeparation
syn keyword sshdconfigKeyword VersionAddendum
syn keyword sshdconfigKeyword X11DisplayOffset
syn keyword sshdconfigKeyword X11Forwarding
@@ -239,43 +232,34 @@ syn keyword sshdconfigKeyword XAuthLocation
" Define the default highlighting
-if version >= 508 || !exists("did_sshdconfig_syntax_inits")
- if version < 508
- let did_sshdconfig_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink sshdconfigComment Comment
- HiLink sshdconfigTodo Todo
- HiLink sshdconfigHostPort sshdconfigConstant
- HiLink sshdconfigTime sshdconfigConstant
- HiLink sshdconfigNumber sshdconfigConstant
- HiLink sshdconfigConstant Constant
- HiLink sshdconfigYesNo sshdconfigEnum
- HiLink sshdconfigAddressFamily sshdconfigEnum
- HiLink sshdconfigPrivilegeSeparation sshdconfigEnum
- HiLink sshdconfigTcpForwarding sshdconfigEnum
- HiLink sshdconfigRootLogin sshdconfigEnum
- HiLink sshdconfigCiphers sshdconfigEnum
- HiLink sshdconfigMAC sshdconfigEnum
- HiLink sshdconfigHostKeyAlgo sshdconfigEnum
- HiLink sshdconfigRootLogin sshdconfigEnum
- HiLink sshdconfigLogLevel sshdconfigEnum
- HiLink sshdconfigSysLogFacility sshdconfigEnum
- HiLink sshdconfigVar sshdconfigEnum
- HiLink sshdconfigCompression sshdconfigEnum
- HiLink sshdconfigIPQoS sshdconfigEnum
- HiLink sshdconfigKexAlgo sshdconfigEnum
- HiLink sshdconfigTunnel sshdconfigEnum
- HiLink sshdconfigSubsystem sshdconfigEnum
- HiLink sshdconfigEnum Function
- HiLink sshdconfigSpecial Special
- HiLink sshdconfigKeyword Keyword
- HiLink sshdconfigMatch Type
- delcommand HiLink
-endif
+
+hi def link sshdconfigComment Comment
+hi def link sshdconfigTodo Todo
+hi def link sshdconfigHostPort sshdconfigConstant
+hi def link sshdconfigTime sshdconfigConstant
+hi def link sshdconfigNumber sshdconfigConstant
+hi def link sshdconfigConstant Constant
+hi def link sshdconfigYesNo sshdconfigEnum
+hi def link sshdconfigAddressFamily sshdconfigEnum
+hi def link sshdconfigPrivilegeSeparation sshdconfigEnum
+hi def link sshdconfigTcpForwarding sshdconfigEnum
+hi def link sshdconfigRootLogin sshdconfigEnum
+hi def link sshdconfigCiphers sshdconfigEnum
+hi def link sshdconfigMAC sshdconfigEnum
+hi def link sshdconfigHostKeyAlgo sshdconfigEnum
+hi def link sshdconfigRootLogin sshdconfigEnum
+hi def link sshdconfigLogLevel sshdconfigEnum
+hi def link sshdconfigSysLogFacility sshdconfigEnum
+hi def link sshdconfigVar sshdconfigEnum
+hi def link sshdconfigCompression sshdconfigEnum
+hi def link sshdconfigIPQoS sshdconfigEnum
+hi def link sshdconfigKexAlgo sshdconfigEnum
+hi def link sshdconfigTunnel sshdconfigEnum
+hi def link sshdconfigSubsystem sshdconfigEnum
+hi def link sshdconfigEnum Function
+hi def link sshdconfigSpecial Special
+hi def link sshdconfigKeyword Keyword
+hi def link sshdconfigMatch Type
let b:current_syntax = "sshdconfig"
diff --git a/runtime/syntax/st.vim b/runtime/syntax/st.vim
index 47aa07de5d..8160c7704a 100644
--- a/runtime/syntax/st.vim
+++ b/runtime/syntax/st.vim
@@ -3,11 +3,8 @@
" Maintainer: Arndt Hesse <hesse@self.de>
" Last Change: 2012 Feb 12 by Thilo Six
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -77,30 +74,20 @@ hi link stBlockError stError
syn sync minlines=50
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_st_syntax_inits")
- if version < 508
- let did_st_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink stKeyword Statement
- HiLink stMethod Statement
- HiLink stComment Comment
- HiLink stCharacter Constant
- HiLink stString Constant
- HiLink stSymbol Special
- HiLink stNumber Type
- HiLink stFloat Type
- HiLink stError Error
- HiLink stLocalVariables Identifier
- HiLink stBlockVariable Identifier
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link stKeyword Statement
+hi def link stMethod Statement
+hi def link stComment Comment
+hi def link stCharacter Constant
+hi def link stString Constant
+hi def link stSymbol Special
+hi def link stNumber Type
+hi def link stFloat Type
+hi def link stError Error
+hi def link stLocalVariables Identifier
+hi def link stBlockVariable Identifier
+
let b:current_syntax = "st"
diff --git a/runtime/syntax/stata.vim b/runtime/syntax/stata.vim
index e1f19c84fc..29f5052ebe 100644
--- a/runtime/syntax/stata.vim
+++ b/runtime/syntax/stata.vim
@@ -12,9 +12,8 @@
" 26apr2006 fixed brace confusion in stataErrInParen and stataErrInBracket
" fixed paren/bracket confusion in stataFuncGroup
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/stp.vim b/runtime/syntax/stp.vim
index f4f0f3b615..2992d8be47 100644
--- a/runtime/syntax/stp.vim
+++ b/runtime/syntax/stp.vim
@@ -4,11 +4,8 @@
" URL: http://lanzarotta.tripod.com/vim/syntax/stp.vim.zip
" Last Change: March 05, 2002
-" For version 5.x, clear all syntax items.
-" For version 6.x, quit when a syntax file was already loaded.
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -131,36 +128,26 @@ syn match stpParenError ")"
syn sync minlines=10 maxlines=100
" Define the default highlighting.
-" For version 5.x and earlier, only when not done already.
-" For version 5.8 and later, only when and item doesn't have highlighting yet.
-if version >= 508 || !exists("did_stp_syn_inits")
- if version < 508
- let did_stp_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink stpConditional Conditional
- HiLink stpComment Comment
- HiLink stpKeyword Keyword
- HiLink stpNumber Number
- HiLink stpOperator Operator
- HiLink stpSpecial Special
- HiLink stpStatement Statement
- HiLink stpString String
- HiLink stpStringError Error
- HiLink stpType Type
- HiLink stpTodo Todo
- HiLink stpFunction Function
- HiLink stpGlobals Macro
- HiLink stpParen Normal
- HiLink stpParenError Error
- HiLink stpSQLKeyword Function
- HiLink stpRepeat Repeat
-
- delcommand HiLink
-endif
+" Only when and item doesn't have highlighting yet.
+
+hi def link stpConditional Conditional
+hi def link stpComment Comment
+hi def link stpKeyword Keyword
+hi def link stpNumber Number
+hi def link stpOperator Operator
+hi def link stpSpecial Special
+hi def link stpStatement Statement
+hi def link stpString String
+hi def link stpStringError Error
+hi def link stpType Type
+hi def link stpTodo Todo
+hi def link stpFunction Function
+hi def link stpGlobals Macro
+hi def link stpParen Normal
+hi def link stpParenError Error
+hi def link stpSQLKeyword Function
+hi def link stpRepeat Repeat
+
let b:current_syntax = "stp"
diff --git a/runtime/syntax/strace.vim b/runtime/syntax/strace.vim
index 0f686fd808..206c58919e 100644
--- a/runtime/syntax/strace.vim
+++ b/runtime/syntax/strace.vim
@@ -5,12 +5,9 @@
" Last Change: 2015-01-16
" Setup
-if version >= 600
- if exists("b:current_syntax")
- finish
- endif
-else
- syntax clear
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
endif
syn case match
@@ -35,31 +32,22 @@ syn match straceOperator "[-+=*/!%&|:,]"
syn region straceComment start="/\*" end="\*/" oneline
" Define the default highlighting
-if version >= 508 || !exists("did_strace_syntax_inits")
- if version < 508
- let did_strace_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink straceComment Comment
- HiLink straceVerbosed Comment
- HiLink stracePID PreProc
- HiLink straceNumber Number
- HiLink straceNumberRHS Type
- HiLink straceOtherRHS Type
- HiLink straceString String
- HiLink straceConstant Function
- HiLink straceEquals Type
- HiLink straceSysCallEmbed straceSysCall
- HiLink straceSysCall Statement
- HiLink straceParenthesis Statement
- HiLink straceOperator Normal
- HiLink straceSpecialChar Special
- HiLink straceOtherPID PreProc
+hi def link straceComment Comment
+hi def link straceVerbosed Comment
+hi def link stracePID PreProc
+hi def link straceNumber Number
+hi def link straceNumberRHS Type
+hi def link straceOtherRHS Type
+hi def link straceString String
+hi def link straceConstant Function
+hi def link straceEquals Type
+hi def link straceSysCallEmbed straceSysCall
+hi def link straceSysCall Statement
+hi def link straceParenthesis Statement
+hi def link straceOperator Normal
+hi def link straceSpecialChar Special
+hi def link straceOtherPID PreProc
- delcommand HiLink
-endif
let b:current_syntax = "strace"
diff --git a/runtime/syntax/sudoers.vim b/runtime/syntax/sudoers.vim
index fffc1cf8bb..019b0ada32 100644
--- a/runtime/syntax/sudoers.vim
+++ b/runtime/syntax/sudoers.vim
@@ -1,7 +1,9 @@
" Vim syntax file
-" Language: sudoers(5) configuration files
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2011-02-24
+" Language: sudoers(5) configuration files
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2018-08-18
+" Recent Changes: Support for #include and #includedir.
+" Added many new options (Samuel D. Leslie)
if exists("b:current_syntax")
finish
@@ -24,6 +26,7 @@ syn cluster sudoersCmndSpecList contains=sudoersUserRunasBegin,sudoersPASS
syn keyword sudoersTodo contained TODO FIXME XXX NOTE
syn region sudoersComment display oneline start='#' end='$' contains=sudoersTodo
+syn region sudoersInclude display oneline start='#\(include\|includedir\)' end='$'
syn keyword sudoersAlias User_Alias Runas_Alias nextgroup=sudoersUserAlias skipwhite skipnl
syn keyword sudoersAlias Host_Alias nextgroup=sudoersHostAlias skipwhite skipnl
@@ -150,77 +153,120 @@ syn match sudoersDefaultTypeGreaterThan contained '>' nextgroup=@sudoersUser s
" TODO: could also deal with special characters here
syn match sudoersBooleanParameter contained '!' nextgroup=sudoersBooleanParameter skipwhite skipnl
syn keyword sudoersBooleanParameter contained skipwhite skipnl
+ \ always_query_group_plugin
\ always_set_home
\ authenticate
\ closefrom_override
+ \ compress_io
\ env_editor
\ env_reset
+ \ exec_background
+ \ fast_glob
\ fqdn
+ \ ignore_audit_errors
\ ignore_dot
+ \ ignore_iolog_errors
\ ignore_local_sudoers
+ \ ignore_logfile_errors
+ \ ignore_unknown_defaults
\ insults
\ log_host
+ \ log_input
+ \ log_output
\ log_year
\ long_otp_prompt
+ \ mail_all_cmnds
\ mail_always
\ mail_badpass
\ mail_no_host
\ mail_no_perms
\ mail_no_user
+ \ match_group_by_gid
+ \ netgroup_tuple
\ noexec
- \ path_info
+ \ pam_session
+ \ pam_setcred
\ passprompt_override
+ \ path_info
\ preserve_groups
+ \ pwfeedback
\ requiretty
\ root_sudo
\ rootpw
\ runaspw
\ set_home
\ set_logname
+ \ set_utmp
\ setenv
\ shell_noargs
\ stay_setuid
+ \ sudoedit_checkdir
+ \ sudoedit_fellow
+ \ syslog_pid
\ targetpw
\ tty_tickets
+ \ umask_override
+ \ use_netgroups
+ \ use_pty
+ \ user_command_timeouts
+ \ utmp_runas
\ visiblepw
syn keyword sudoersIntegerParameter contained
\ nextgroup=sudoersIntegerParameterEquals
\ skipwhite skipnl
\ closefrom
- \ passwd_tries
+ \ command_timeout
\ loglinelen
+ \ maxseq
\ passwd_timeout
+ \ passwd_tries
+ \ syslog_maxlen
\ timestamp_timeout
\ umask
syn keyword sudoersStringParameter contained
\ nextgroup=sudoersStringParameterEquals
\ skipwhite skipnl
+ \ askpass
\ badpass_message
\ editor
- \ mailsub
- \ noexec_file
- \ passprompt
- \ runas_default
- \ syslog_badpri
- \ syslog_goodpri
- \ sudoers_locale
- \ timestampdir
- \ timestampowner
- \ askpass
\ env_file
\ exempt_group
+ \ fdexec
+ \ group_plugin
+ \ iolog_dir
+ \ iolog_file
+ \ iolog_flush
+ \ iolog_group
+ \ iolog_mode
+ \ iolog_user
\ lecture
\ lecture_file
+ \ lecture_status_dir
\ listpw
\ logfile
\ mailerflags
\ mailerpath
\ mailfrom
+ \ mailsub
\ mailto
+ \ noexec_file
+ \ pam_login_service
+ \ pam_service
+ \ passprompt
+ \ restricted_env_file
+ \ role
+ \ runas_default
\ secure_path
+ \ sudoers_locale
\ syslog
+ \ syslog_badpri
+ \ syslog_goodpri
+ \ timestamp_type
+ \ timestampdir
+ \ timestampowner
+ \ type
\ verifypw
syn keyword sudoersListParameter contained
@@ -335,6 +381,7 @@ hi def link sudoersIntegerValue Number
hi def link sudoersStringValue String
hi def link sudoersListValue String
hi def link sudoersPASSWD Special
+hi def link sudoersInclude Statement
let b:current_syntax = "sudoers"
diff --git a/runtime/syntax/svn.vim b/runtime/syntax/svn.vim
index 6536d6d11c..6239790f12 100644
--- a/runtime/syntax/svn.vim
+++ b/runtime/syntax/svn.vim
@@ -15,11 +15,8 @@
" Myk Taylor
" Stefano Zacchiroli
-" For version 5.x: Clear all syntax items.
-" For version 6.x: Quit when a syntax file was already loaded.
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded.
+if exists("b:current_syntax")
finish
endif
@@ -42,28 +39,18 @@ syn sync clear
syn sync match svnSync grouphere svnRegion "^--.*--$"me=s-1
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already.
-" For version 5.8 and later: only when an item doesn't have highlighting yet.
-if version >= 508 || !exists("did_svn_syn_inits")
- if version <= 508
- let did_svn_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet.
- HiLink svnSummary Keyword
- HiLink svnBlank Error
+hi def link svnSummary Keyword
+hi def link svnBlank Error
- HiLink svnRegion Comment
- HiLink svnDelimiter NonText
- HiLink svnRemoved Constant
- HiLink svnAdded Identifier
- HiLink svnModified Special
- HiLink svnProperty Special
- HiLink svnRenamed Special
+hi def link svnRegion Comment
+hi def link svnDelimiter NonText
+hi def link svnRemoved Constant
+hi def link svnAdded Identifier
+hi def link svnModified Special
+hi def link svnProperty Special
+hi def link svnRenamed Special
- delcommand HiLink
-endif
let b:current_syntax = "svn"
diff --git a/runtime/syntax/synload.vim b/runtime/syntax/synload.vim
index 6183f33a59..ab918c645b 100644
--- a/runtime/syntax/synload.vim
+++ b/runtime/syntax/synload.vim
@@ -1,6 +1,6 @@
" Vim syntax support file
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2012 Sep 25
+" Last Change: 2016 Nov 04
" This file sets up for syntax highlighting.
" It is loaded from "syntax.vim" and "manual.vim".
@@ -69,8 +69,11 @@ au Syntax c,cpp,cs,idl,java,php,datascript
" Source the user-specified syntax highlighting file
-if exists("mysyntaxfile") && filereadable(expand(mysyntaxfile))
- execute "source " . mysyntaxfile
+if exists("mysyntaxfile")
+ let s:fname = expand(mysyntaxfile)
+ if filereadable(s:fname)
+ execute "source " . fnameescape(s:fname)
+ endif
endif
" Restore 'cpoptions'
diff --git a/runtime/syntax/sysctl.vim b/runtime/syntax/sysctl.vim
index 748054fd73..d99ac01835 100644
--- a/runtime/syntax/sysctl.vim
+++ b/runtime/syntax/sysctl.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: sysctl.conf(5) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2011-05-02
+" Language: sysctl.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2011-05-02
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/systemverilog.vim b/runtime/syntax/systemverilog.vim
index 5bf2935078..f99ea8d889 100644
--- a/runtime/syntax/systemverilog.vim
+++ b/runtime/syntax/systemverilog.vim
@@ -3,21 +3,14 @@
" Maintainer: kocha <kocha.lsifrontend@gmail.com>
" Last Change: 12-Aug-2013.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" Read in Verilog syntax files
-if version < 600
- so <sfile>:p:h/verilog.vim
-else
- runtime! syntax/verilog.vim
- unlet b:current_syntax
-endif
+runtime! syntax/verilog.vim
+unlet b:current_syntax
" IEEE1800-2005
syn keyword systemverilogStatement always_comb always_ff always_latch
@@ -76,25 +69,16 @@ syn keyword systemverilogStatement implements
syn keyword systemverilogStatement interconnect soft nettype
" Define the default highlighting.
-if version >= 508 || !exists("did_systemverilog_syn_inits")
- if version < 508
- let did_systemverilog_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- " The default highlighting.
- HiLink systemverilogStatement Statement
- HiLink systemverilogTypeDef TypeDef
- HiLink systemverilogConditional Conditional
- HiLink systemverilogRepeat Repeat
- HiLink systemverilogLabel Label
- HiLink systemverilogGlobal Define
- HiLink systemverilogNumber Number
+" The default highlighting.
+hi def link systemverilogStatement Statement
+hi def link systemverilogTypeDef TypeDef
+hi def link systemverilogConditional Conditional
+hi def link systemverilogRepeat Repeat
+hi def link systemverilogLabel Label
+hi def link systemverilogGlobal Define
+hi def link systemverilogNumber Number
- delcommand HiLink
-endif
let b:current_syntax = "systemverilog"
diff --git a/runtime/syntax/tads.vim b/runtime/syntax/tads.vim
index 260ff360f7..23a65b99ec 100644
--- a/runtime/syntax/tads.vim
+++ b/runtime/syntax/tads.vim
@@ -13,11 +13,8 @@
" Actually, should cvtstr etc. be functions?! (change tadsFunction)
" Make global etc. into Identifiers, since we don't have regular variables?
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -122,57 +119,47 @@ endif
execute "syn sync maxlines=" . tads_sync_dist
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_tads_syn_inits")
- if version < 508
- let did_tads_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default methods for highlighting. Can be overridden later
- HiLink tadsFunctionDef Function
- HiLink tadsFunction Structure
- HiLink tadsClass Structure
- HiLink tadsClassDef Identifier
- HiLink tadsObjectDef Identifier
+" Only when an item doesn't have highlighting yet
+
+" The default methods for highlighting. Can be overridden later
+hi def link tadsFunctionDef Function
+hi def link tadsFunction Structure
+hi def link tadsClass Structure
+hi def link tadsClassDef Identifier
+hi def link tadsObjectDef Identifier
" no highlight for tadsEmbedded, so it prints as normal text w/in the string
- HiLink tadsOperator Operator
- HiLink tadsStructure Structure
- HiLink tadsTodo Todo
- HiLink tadsLabel Label
- HiLink tadsConditional Conditional
- HiLink tadsRepeat Repeat
- HiLink tadsException Exception
- HiLink tadsStatement Statement
- HiLink tadsStorageClass StorageClass
- HiLink tadsKeyWord Keyword
- HiLink tadsSpecial SpecialChar
- HiLink tadsNumber Number
- HiLink tadsBoolean Boolean
- HiLink tadsDoubleString tadsString
- HiLink tadsSingleString tadsString
-
- HiLink tadsOctalError tadsError
- HiLink tadsCommentError tadsError
- HiLink tadsBraceError tadsError
- HiLink tadsInBrace tadsError
- HiLink tadsError Error
-
- HiLink tadsInclude Include
- HiLink tadsPreProc PreProc
- HiLink tadsDefine Macro
- HiLink tadsIncluded tadsString
- HiLink tadsPreCondit PreCondit
-
- HiLink tadsString String
- HiLink tadsComment Comment
-
- delcommand HiLink
-endif
+hi def link tadsOperator Operator
+hi def link tadsStructure Structure
+hi def link tadsTodo Todo
+hi def link tadsLabel Label
+hi def link tadsConditional Conditional
+hi def link tadsRepeat Repeat
+hi def link tadsException Exception
+hi def link tadsStatement Statement
+hi def link tadsStorageClass StorageClass
+hi def link tadsKeyWord Keyword
+hi def link tadsSpecial SpecialChar
+hi def link tadsNumber Number
+hi def link tadsBoolean Boolean
+hi def link tadsDoubleString tadsString
+hi def link tadsSingleString tadsString
+
+hi def link tadsOctalError tadsError
+hi def link tadsCommentError tadsError
+hi def link tadsBraceError tadsError
+hi def link tadsInBrace tadsError
+hi def link tadsError Error
+
+hi def link tadsInclude Include
+hi def link tadsPreProc PreProc
+hi def link tadsDefine Macro
+hi def link tadsIncluded tadsString
+hi def link tadsPreCondit PreCondit
+
+hi def link tadsString String
+hi def link tadsComment Comment
+
let b:current_syntax = "tads"
diff --git a/runtime/syntax/tags.vim b/runtime/syntax/tags.vim
index c86f17a618..f34696d4b0 100644
--- a/runtime/syntax/tags.vim
+++ b/runtime/syntax/tags.vim
@@ -1,47 +1,31 @@
" Language: tags
" Maintainer: Charles E. Campbell <NdrOchip@PcampbellAfamily.Mbiz>
-" Last Change: Oct 23, 2014
-" Version: 4
+" Last Change: Oct 26, 2016
+" Version: 7
" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_TAGS
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
-syn match tagName "^[^\t]\+" skipwhite nextgroup=tagPath
-syn match tagPath "[^\t]\+" contained skipwhite nextgroup=tagAddr contains=tagBaseFile
+syn match tagName "^[^\t]\+" skipwhite nextgroup=tagPath
+syn match tagPath "[^\t]\+" contained skipwhite nextgroup=tagAddr contains=tagBaseFile
syn match tagBaseFile "[a-zA-Z_]\+[\.a-zA-Z_0-9]*\t"me=e-1 contained
-syn match tagAddr "\d*" contained skipwhite nextgroup=tagComment
-syn region tagAddr matchgroup=tagDelim start="/" skip="\(\\\\\)*\\/" matchgroup=tagDelim end="$\|/" oneline contained skipwhite nextgroup=tagComment
-syn match tagComment ";.*$" contained contains=tagField
+syn match tagAddr "\d*" contained skipwhite nextgroup=tagComment
+syn region tagAddr matchgroup=tagDelim start="/" skip="\(\\\\\)*\\/" matchgroup=tagDelim end="$\|/" oneline contained skipwhite nextgroup=tagComment
+syn match tagComment ";.*$" contained contains=tagField
syn match tagComment "^!_TAG_.*$"
-syn match tagField contained "[a-z]*:"
+syn match tagField contained "[a-z]*:"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_drchip_tags_inits")
- if version < 508
- let did_drchip_tags_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink tagBaseFile PreProc
- HiLink tagComment Comment
- HiLink tagDelim Delimiter
- HiLink tagField Number
- HiLink tagName Identifier
- HiLink tagPath PreProc
-
- delcommand HiLink
+if !exists("skip_drchip_tags_inits")
+ hi def link tagBaseFile PreProc
+ hi def link tagComment Comment
+ hi def link tagDelim Delimiter
+ hi def link tagField Number
+ hi def link tagName Identifier
+ hi def link tagPath PreProc
endif
let b:current_syntax = "tags"
-
-" vim: ts=12
diff --git a/runtime/syntax/tak.vim b/runtime/syntax/tak.vim
index 20186db143..7a8fceb860 100644
--- a/runtime/syntax/tak.vim
+++ b/runtime/syntax/tak.vim
@@ -8,11 +8,8 @@
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -32,11 +29,7 @@ syn case ignore
let fortran_free_source=1
" Load FORTRAN syntax file
-if version < 600
- source <sfile>:p:h/fortran.vim
-else
- runtime! syntax/fortran.vim
-endif
+runtime! syntax/fortran.vim
unlet b:current_syntax
@@ -95,40 +88,30 @@ endif
" Define the default highlighting
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_tak_syntax_inits")
- if version < 508
- let did_tak_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink takMacro Macro
- HiLink takOptions Special
- HiLink takRoutine Type
- HiLink takControl Special
- HiLink takSolids Special
- HiLink takSolidsArg Statement
- HiLink takIdentifier Identifier
-
- HiLink takFortran PreProc
- HiLink takMotran PreProc
-
- HiLink takComment Comment
- HiLink takHeader Typedef
- HiLink takIncludeFile Type
- HiLink takInteger Number
- HiLink takFloat Float
- HiLink takScientific Float
-
- HiLink takEndData Macro
-
- HiLink takTodo Todo
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link takMacro Macro
+hi def link takOptions Special
+hi def link takRoutine Type
+hi def link takControl Special
+hi def link takSolids Special
+hi def link takSolidsArg Statement
+hi def link takIdentifier Identifier
+
+hi def link takFortran PreProc
+hi def link takMotran PreProc
+
+hi def link takComment Comment
+hi def link takHeader Typedef
+hi def link takIncludeFile Type
+hi def link takInteger Number
+hi def link takFloat Float
+hi def link takScientific Float
+
+hi def link takEndData Macro
+
+hi def link takTodo Todo
+
let b:current_syntax = "tak"
diff --git a/runtime/syntax/takcmp.vim b/runtime/syntax/takcmp.vim
index a94609b325..9426e02223 100644
--- a/runtime/syntax/takcmp.vim
+++ b/runtime/syntax/takcmp.vim
@@ -8,11 +8,8 @@
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -51,30 +48,20 @@ syn case ignore
" Define the default highlighting
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_takcmp_syntax_inits")
- if version < 508
- let did_takcmp_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink takcmpTitle Type
- HiLink takcmpUnit PreProc
+hi def link takcmpTitle Type
+hi def link takcmpUnit PreProc
- HiLink takcmpLabel Statement
+hi def link takcmpLabel Statement
- HiLink takcmpHeader takHeader
+hi def link takcmpHeader takHeader
- HiLink takcmpDate Identifier
- HiLink takcmpTime Identifier
- HiLink takcmpInteger Number
- HiLink takcmpFloat Special
+hi def link takcmpDate Identifier
+hi def link takcmpTime Identifier
+hi def link takcmpInteger Number
+hi def link takcmpFloat Special
- delcommand HiLink
-endif
let b:current_syntax = "takcmp"
diff --git a/runtime/syntax/takout.vim b/runtime/syntax/takout.vim
index 774353942a..5e5d360767 100644
--- a/runtime/syntax/takout.vim
+++ b/runtime/syntax/takout.vim
@@ -8,11 +8,8 @@
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -24,11 +21,7 @@ syn case match
" Load TAK syntax file
-if version < 600
- source <sfile>:p:h/tak.vim
-else
- runtime! syntax/tak.vim
-endif
+runtime! syntax/tak.vim
unlet b:current_syntax
@@ -70,31 +63,21 @@ syn match takoutError "<<< Error >>>"
" Define the default highlighting
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_takout_syntax_inits")
- if version < 508
- let did_takout_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink takoutPos Statement
- HiLink takoutNeg PreProc
- HiLink takoutTitle Type
- HiLink takoutFile takIncludeFile
- HiLink takoutInteger takInteger
-
- HiLink takoutSectionDelim Delimiter
- HiLink takoutSectionTitle Exception
- HiLink takoutHeaderDelim SpecialComment
- HiLink takoutLabel Identifier
-
- HiLink takoutError Error
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link takoutPos Statement
+hi def link takoutNeg PreProc
+hi def link takoutTitle Type
+hi def link takoutFile takIncludeFile
+hi def link takoutInteger takInteger
+
+hi def link takoutSectionDelim Delimiter
+hi def link takoutSectionTitle Exception
+hi def link takoutHeaderDelim SpecialComment
+hi def link takoutLabel Identifier
+
+hi def link takoutError Error
+
let b:current_syntax = "takout"
diff --git a/runtime/syntax/tap.vim b/runtime/syntax/tap.vim
new file mode 100644
index 0000000000..db37bb8980
--- /dev/null
+++ b/runtime/syntax/tap.vim
@@ -0,0 +1,97 @@
+" Vim syntax file
+" Language: Verbose TAP Output
+" Maintainer: Rufus Cable <rufus@threebytesfull.com>
+" Remark: Simple syntax highlighting for TAP output
+" License:
+" Copyright: (c) 2008-2013 Rufus Cable
+" Last Change: 2014-12-13
+
+if exists("b:current_syntax")
+ finish
+endif
+
+syn match tapTestDiag /^ *#.*/ contains=tapTestTodo
+syn match tapTestTime /^ *\[\d\d:\d\d:\d\d\].*/ contains=tapTestFile
+syn match tapTestFile /\w\+\/[^. ]*/ contained
+syn match tapTestFileWithDot /\w\+\/[^ ]*/ contained
+
+syn match tapTestPlan /^ *\d\+\.\.\d\+$/
+
+" tapTest is a line like 'ok 1', 'not ok 2', 'ok 3 - xxxx'
+syn match tapTest /^ *\(not \)\?ok \d\+.*/ contains=tapTestStatusOK,tapTestStatusNotOK,tapTestLine
+
+" tapTestLine is the line without the ok/not ok status - i.e. number and
+" optional message
+syn match tapTestLine /\d\+\( .*\|$\)/ contains=tapTestNumber,tapTestLoadMessage,tapTestTodo,tapTestSkip contained
+
+" turn ok/not ok messages green/red respectively
+syn match tapTestStatusOK /ok/ contained
+syn match tapTestStatusNotOK /not ok/ contained
+
+" highlight todo tests
+syn match tapTestTodo /\(# TODO\|Failed (TODO)\) .*$/ contained contains=tapTestTodoRev
+syn match tapTestTodoRev /\<TODO\>/ contained
+
+" highlight skipped tests
+syn match tapTestSkip /# skip .*$/ contained contains=tapTestSkipTag
+syn match tapTestSkipTag /\(# \)\@<=skip\>/ contained
+
+" look behind so "ok 123" and "not ok 124" match test number
+syn match tapTestNumber /\(ok \)\@<=\d\d*/ contained
+syn match tapTestLoadMessage /\*\*\*.*\*\*\*/ contained contains=tapTestThreeStars,tapTestFileWithDot
+syn match tapTestThreeStars /\*\*\*/ contained
+
+syn region tapTestRegion start=/^ *\(not \)\?ok.*$/me=e+1 end=/^\(\(not \)\?ok\|# Looks like you planned \|All tests successful\|Bailout called\)/me=s-1 fold transparent excludenl
+syn region tapTestResultsOKRegion start=/^\(All tests successful\|Result: PASS\)/ end=/$/
+syn region tapTestResultsNotOKRegion start=/^\(# Looks like you planned \|Bailout called\|# Looks like you failed \|Result: FAIL\)/ end=/$/
+syn region tapTestResultsSummaryRegion start=/^Test Summary Report/ end=/^Files=.*$/ contains=tapTestResultsSummaryHeading,tapTestResultsSummaryNotOK
+
+syn region tapTestResultsSummaryHeading start=/^Test Summary Report/ end=/^-\+$/ contained
+syn region tapTestResultsSummaryNotOK start=/TODO passed:/ end=/$/ contained
+
+syn region tapTestInstructionsRegion start=/\%1l/ end=/^$/
+
+set foldtext=TAPTestLine_foldtext()
+function! TAPTestLine_foldtext()
+ let line = getline(v:foldstart)
+ let sub = substitute(line, '/\*\|\*/\|{{{\d\=', '', 'g')
+ return sub
+endfunction
+
+set foldminlines=5
+set foldcolumn=2
+set foldenable
+set foldmethod=syntax
+syn sync fromstart
+
+if !exists("did_tapverboseoutput_syntax_inits")
+ let did_tapverboseoutput_syntax_inits = 1
+
+ hi tapTestStatusOK term=bold ctermfg=green guifg=Green
+ hi tapTestStatusNotOK term=reverse ctermfg=black ctermbg=red guifg=Black guibg=Red
+ hi tapTestTodo term=bold ctermfg=yellow ctermbg=black guifg=Yellow guibg=Black
+ hi tapTestTodoRev term=reverse ctermfg=black ctermbg=yellow guifg=Black guibg=Yellow
+ hi tapTestSkip term=bold ctermfg=lightblue guifg=LightBlue
+ hi tapTestSkipTag term=reverse ctermfg=black ctermbg=lightblue guifg=Black guibg=LightBlue
+ hi tapTestTime term=bold ctermfg=blue guifg=Blue
+ hi tapTestFile term=reverse ctermfg=black ctermbg=yellow guibg=Black guifg=Yellow
+ hi tapTestLoadedFile term=bold ctermfg=black ctermbg=cyan guibg=Cyan guifg=Black
+ hi tapTestThreeStars term=reverse ctermfg=blue guifg=Blue
+ hi tapTestPlan term=bold ctermfg=yellow guifg=Yellow
+
+ hi link tapTestFileWithDot tapTestLoadedFile
+ hi link tapTestNumber Number
+ hi link tapTestDiag Comment
+
+ hi tapTestRegion ctermbg=green
+
+ hi tapTestResultsOKRegion ctermbg=green ctermfg=black
+ hi tapTestResultsNotOKRegion ctermbg=red ctermfg=black
+
+ hi tapTestResultsSummaryHeading ctermbg=blue ctermfg=white
+ hi tapTestResultsSummaryNotOK ctermbg=red ctermfg=black
+
+ hi tapTestInstructionsRegion ctermbg=lightmagenta ctermfg=black
+endif
+
+let b:current_syntax="tapVerboseOutput"
diff --git a/runtime/syntax/taskdata.vim b/runtime/syntax/taskdata.vim
index b37c70cc1f..63a8284adf 100644
--- a/runtime/syntax/taskdata.vim
+++ b/runtime/syntax/taskdata.vim
@@ -4,11 +4,8 @@
" Updated: Wed Jul 8 19:46:20 EDT 2009
-" For version 5.x: Clear all syntax items.
-" For version 6.x: Quit when a syntax file was already loaded.
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded.
+if exists("b:current_syntax")
finish
endif
let s:keepcpo= &cpo
diff --git a/runtime/syntax/taskedit.vim b/runtime/syntax/taskedit.vim
index 170153c0ee..d33ca78650 100644
--- a/runtime/syntax/taskedit.vim
+++ b/runtime/syntax/taskedit.vim
@@ -4,11 +4,8 @@
" Updated: Wed Jul 8 19:46:32 EDT 2009
-" For version 5.x: Clear all syntax items.
-" For version 6.x: Quit when a syntax file was already loaded.
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded.
+if exists("b:current_syntax")
finish
endif
let s:keepcpo= &cpo
diff --git a/runtime/syntax/tasm.vim b/runtime/syntax/tasm.vim
index 2f8559610e..c9fc8186d0 100644
--- a/runtime/syntax/tasm.vim
+++ b/runtime/syntax/tasm.vim
@@ -3,11 +3,8 @@
" Maintaner: FooLman of United Force <foolman@bigfoot.com>
" Last Change: 2012 Feb 03 by Thilo Six
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -95,32 +92,22 @@ syn match tasmOct "\<[0-7]\+O\>"
syn match tasmBin "\<[01]\+B\>"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_tasm_syntax_inits")
- if version < 508
- let did_tasm_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink tasmString String
- HiLink tasmDec Number
- HiLink tasmHex Number
- HiLink tasmOct Number
- HiLink tasmBin Number
- HiLink tasmInstruction Keyword
- HiLink tasmCoprocInstr Keyword
- HiLink tasmMMXInst Keyword
- HiLink tasmDirective PreProc
- HiLink tasmRegister Identifier
- HiLink tasmProctype PreProc
- HiLink tasmComment Comment
- HiLink tasmLabel Label
+hi def link tasmString String
+hi def link tasmDec Number
+hi def link tasmHex Number
+hi def link tasmOct Number
+hi def link tasmBin Number
+hi def link tasmInstruction Keyword
+hi def link tasmCoprocInstr Keyword
+hi def link tasmMMXInst Keyword
+hi def link tasmDirective PreProc
+hi def link tasmRegister Identifier
+hi def link tasmProctype PreProc
+hi def link tasmComment Comment
+hi def link tasmLabel Label
- delcommand HiLink
-endif
let b:curret_syntax = "tasm"
diff --git a/runtime/syntax/tcl.vim b/runtime/syntax/tcl.vim
index 06629d077f..64efd6fec4 100644
--- a/runtime/syntax/tcl.vim
+++ b/runtime/syntax/tcl.vim
@@ -10,11 +10,8 @@
" Version: 1.14
" URL: http://bitbucket.org/taylor_venable/metasyntax/src/tip/Config/vim/syntax/tcl.vim
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -238,49 +235,39 @@ syn region tclComment start=/;\s*\#/hs=s+1 skip="\\$" end="$" contains=tclTodo
"syn sync ccomment tclComment
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_tcl_syntax_inits")
- if version < 508
- let did_tcl_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink tcltkSwitch Special
- HiLink tclExpand Special
- HiLink tclLabel Label
- HiLink tclConditional Conditional
- HiLink tclRepeat Repeat
- HiLink tclNumber Number
- HiLink tclError Error
- HiLink tclCommand Statement
- HiLink tclProcCommand Type
- HiLink tclString String
- HiLink tclComment Comment
- HiLink tclSpecial Special
- HiLink tclTodo Todo
- " Below here are the commands and their options.
- HiLink tcltkCommandColor Statement
- HiLink tcltkWidgetColor Structure
- HiLink tclLineContinue WarningMsg
+" Only when an item doesn't have highlighting yet
+
+hi def link tcltkSwitch Special
+hi def link tclExpand Special
+hi def link tclLabel Label
+hi def link tclConditional Conditional
+hi def link tclRepeat Repeat
+hi def link tclNumber Number
+hi def link tclError Error
+hi def link tclCommand Statement
+hi def link tclProcCommand Type
+hi def link tclString String
+hi def link tclComment Comment
+hi def link tclSpecial Special
+hi def link tclTodo Todo
+" Below here are the commands and their options.
+hi def link tcltkCommandColor Statement
+hi def link tcltkWidgetColor Structure
+hi def link tclLineContinue WarningMsg
if exists('g:tcl_warn_continuation')
- HiLink tclNotLineContinue ErrorMsg
-endif
- HiLink tcltkStringSwitch Special
- HiLink tcltkArraySwitch Special
- HiLink tcltkLsortSwitch Special
- HiLink tcltkPackSwitch Special
- HiLink tcltkPackConfSwitch Special
- HiLink tcltkMaths Special
- HiLink tcltkNamespaceSwitch Special
- HiLink tcltkWidgetSwitch Special
- HiLink tcltkPackConfColor Identifier
- HiLink tclVarRef Identifier
-
- delcommand HiLink
+hi def link tclNotLineContinue ErrorMsg
endif
+hi def link tcltkStringSwitch Special
+hi def link tcltkArraySwitch Special
+hi def link tcltkLsortSwitch Special
+hi def link tcltkPackSwitch Special
+hi def link tcltkPackConfSwitch Special
+hi def link tcltkMaths Special
+hi def link tcltkNamespaceSwitch Special
+hi def link tcltkWidgetSwitch Special
+hi def link tcltkPackConfColor Identifier
+hi def link tclVarRef Identifier
+
let b:current_syntax = "tcl"
diff --git a/runtime/syntax/teraterm.vim b/runtime/syntax/teraterm.vim
index 521331d8ce..9115320bfb 100644
--- a/runtime/syntax/teraterm.vim
+++ b/runtime/syntax/teraterm.vim
@@ -1,9 +1,9 @@
" Vim syntax file
" Language: Tera Term Language (TTL)
-" Based on Tera Term Version 4.86
+" Based on Tera Term Version 4.100
" Maintainer: Ken Takata
" URL: https://github.com/k-takata/vim-teraterm
-" Last Change: 2015 Jun 24
+" Last Change: 2018-08-31
" Filenames: *.ttl
" License: VIM License
@@ -33,7 +33,7 @@ syn keyword ttlOperator and or xor not
syn match ttlVar "\<groupmatchstr\d\>"
syn match ttlVar "\<param\d\>"
-syn keyword ttlVar inputstr matchstr paramcnt result timeout mtimeout
+syn keyword ttlVar inputstr matchstr paramcnt params result timeout mtimeout
syn match ttlLine nextgroup=ttlStatement "^"
@@ -75,12 +75,13 @@ syn keyword ttlCommunicationCommand contained
\ logrotate logstart logwrite quickvanrecv
\ quickvansend recvln restoresetup scprecv scpsend
\ send sendbreak sendbroadcast sendfile sendkcode
- \ sendln sendlnbroadcast sendmulticast setbaud
- \ setdebug setdtr setecho setmulticastname setrts
- \ setsync settitle showtt testlink unlink wait
- \ wait4all waitevent waitln waitn waitrecv waitregex
- \ xmodemrecv xmodemsend ymodemrecv ymodemsend
- \ zmodemrecv zmodemsend
+ \ sendln sendlnbroadcast sendlnmulticast sendmulticast
+ \ setbaud setdebug setdtr setecho setflowctrl
+ \ setmulticastname setrts setspeed setsync settitle
+ \ showtt testlink unlink wait wait4all waitevent
+ \ waitln waitn waitrecv waitregex xmodemrecv
+ \ xmodemsend ymodemrecv ymodemsend zmodemrecv
+ \ zmodemsend
syn keyword ttlStringCommand contained
\ code2str expandenv int2str regexoption sprintf
\ sprintf2 str2code str2int strcompare strconcat
diff --git a/runtime/syntax/terminfo.vim b/runtime/syntax/terminfo.vim
index 0ea112ad47..2b0ab0860a 100644
--- a/runtime/syntax/terminfo.vim
+++ b/runtime/syntax/terminfo.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: terminfo(5) definition
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: terminfo(5) definition
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/tex.vim b/runtime/syntax/tex.vim
index d6d5dd81ee..18c3a04877 100644
--- a/runtime/syntax/tex.vim
+++ b/runtime/syntax/tex.vim
@@ -1,8 +1,8 @@
" Vim syntax file
" Language: TeX
" Maintainer: Charles E. Campbell <NdrchipO@ScampbellPfamily.AbizM>
-" Last Change: Apr 11, 2016
-" Version: 94
+" Last Change: Sep 09, 2018
+" Version: 110
" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_TEX
"
" Notes: {{{1
@@ -40,29 +40,14 @@
" using conceal mode :help tex-conceal
" Version Clears: {{{1
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
let s:keepcpo= &cpo
set cpo&vim
scriptencoding utf-8
-" Define the default highlighting. {{{1
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_tex_syntax_inits")
- let did_tex_syntax_inits = 1
- if version < 508
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-endif
-
" by default, enable all region-based highlighting
let s:tex_fast= "bcmMprsSvV"
if exists("g:tex_fast")
@@ -83,12 +68,12 @@ else
let s:tex_conceal= g:tex_conceal
endif
if !exists("g:tex_superscripts")
- let s:tex_superscripts= "[0-9a-zA-W.,:;+-<>/()=]"
+ let s:tex_superscripts= '[0-9a-zA-W.,:;+-<>/()=]'
else
let s:tex_superscripts= g:tex_superscripts
endif
if !exists("g:tex_subscripts")
- let s:tex_subscripts= "[0-9aehijklmnoprstuvx,+-/().]"
+ let s:tex_subscripts= '[0-9aehijklmnoprstuvx,+-/().]'
else
let s:tex_subscripts= g:tex_subscripts
endif
@@ -132,14 +117,20 @@ endif
" One may override this iskeyword setting by providing
" g:tex_isk
if exists("g:tex_isk")
- exe "setlocal isk=".g:tex_isk
-elseif !has("patch-7.4.1141")
- setl isk=48-57,a-z,A-Z,192-255
+ if b:tex_stylish && g:tex_isk !~ '@'
+ let b:tex_isk= '@,'.g:tex_isk
+ else
+ let b:tex_isk= g:tex_isk
+ endif
+elseif b:tex_stylish
+ let b:tex_isk="@,48-57,a-z,A-Z,192-255"
else
- syn iskeyword 48-57,a-z,A-Z,192-255
+ let b:tex_isk="48-57,a-z,A-Z,192-255"
endif
-if b:tex_stylish
- setlocal isk+=@-@
+if v:version > 704 || (v:version == 704 && has("patch-7.4.1142"))
+ exe "syn iskeyword ".b:tex_isk
+else
+ exe "setl isk=".b:tex_isk
endif
if exists("g:tex_no_error") && g:tex_no_error
let s:tex_no_error= 1
@@ -159,7 +150,7 @@ endif
" Clusters: {{{1
" --------
-syn cluster texCmdGroup contains=texCmdBody,texComment,texDefParm,texDelimiter,texDocType,texInput,texLength,texLigature,texMathDelim,texMathOper,texNewCmd,texNewEnv,texRefZone,texSection,texBeginEnd,texBeginEndName,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle
+syn cluster texCmdGroup contains=texCmdBody,texComment,texDefParm,texDelimiter,texDocType,texInput,texLength,texLigature,texMathDelim,texMathOper,texNewCmd,texNewEnv,texRefZone,texSection,texBeginEnd,texBeginEndName,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,@texMathZones
if !s:tex_no_error
syn cluster texCmdGroup add=texMathError
endif
@@ -169,15 +160,17 @@ syn cluster texBoldGroup contains=texAccent,texBadMath,texComment,texDefCmd,tex
syn cluster texItalGroup contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texInputFile,texLength,texLigature,texMatcher,texMathZoneV,texMathZoneW,texMathZoneX,texMathZoneY,texMathZoneZ,texNewCmd,texNewEnv,texOnlyMath,texOption,texParen,texRefZone,texSection,texBeginEnd,texSectionZone,texSpaceCode,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texZone,@texMathZones,texTitle,texAbstract,texItalStyle,texItalBoldStyle,texNoSpell
if !s:tex_nospell
syn cluster texMatchGroup contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texLength,texLigature,texMatcher,texNewCmd,texNewEnv,texOnlyMath,texParen,texRefZone,texSection,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texZone,texInputFile,texOption,@Spell
+ syn cluster texMatchNMGroup contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texLength,texLigature,texMatcherNM,texNewCmd,texNewEnv,texOnlyMath,texParen,texRefZone,texSection,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texZone,texInputFile,texOption,@Spell
syn cluster texStyleGroup contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texLength,texLigature,texNewCmd,texNewEnv,texOnlyMath,texParen,texRefZone,texSection,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texZone,texInputFile,texOption,texStyleStatement,@Spell,texStyleMatcher
else
syn cluster texMatchGroup contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texLength,texLigature,texMatcher,texNewCmd,texNewEnv,texOnlyMath,texParen,texRefZone,texSection,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texZone,texInputFile,texOption
+ syn cluster texMatchNMGroup contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texLength,texLigature,texMatcherNM,texNewCmd,texNewEnv,texOnlyMath,texParen,texRefZone,texSection,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texZone,texInputFile,texOption
syn cluster texStyleGroup contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texLength,texLigature,texNewCmd,texNewEnv,texOnlyMath,texParen,texRefZone,texSection,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texZone,texInputFile,texOption,texStyleStatement,texStyleMatcher
endif
-syn cluster texPreambleMatchGroup contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texLength,texLigature,texMatcher,texNewCmd,texNewEnv,texOnlyMath,texParen,texRefZone,texSection,texSpecialChar,texStatement,texString,texTitle,texTypeSize,texTypeStyle,texZone,texInputFile,texOption,texMathZoneZ
+syn cluster texPreambleMatchGroup contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texLength,texLigature,texMatcherNM,texNewCmd,texNewEnv,texOnlyMath,texParen,texRefZone,texSection,texSpecialChar,texStatement,texString,texTitle,texTypeSize,texTypeStyle,texZone,texInputFile,texOption,texMathZoneZ
syn cluster texRefGroup contains=texMatcher,texComment,texDelimiter
if !exists("g:tex_no_math")
- syn cluster texPreambleMatchGroup contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texLength,texLigature,texMatcher,texNewCmd,texNewEnv,texOnlyMath,texParen,texRefZone,texSection,texSpecialChar,texStatement,texString,texTitle,texTypeSize,texTypeStyle,texZone,texInputFile,texOption,texMathZoneZ
+ syn cluster texPreambleMatchGroup contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texLength,texLigature,texMatcherNM,texNewCmd,texNewEnv,texOnlyMath,texParen,texRefZone,texSection,texSpecialChar,texStatement,texString,texTitle,texTypeSize,texTypeStyle,texZone,texInputFile,texOption,texMathZoneZ
syn cluster texMathZones contains=texMathZoneV,texMathZoneW,texMathZoneX,texMathZoneY,texMathZoneZ
syn cluster texMatchGroup add=@texMathZones
syn cluster texMathDelimGroup contains=texMathDelimBad,texMathDelimKey,texMathDelimSet1,texMathDelimSet2
@@ -206,16 +199,20 @@ endif
" Try to flag {} and () mismatches: {{{1
if s:tex_fast =~# 'm'
if !s:tex_no_error
- syn region texMatcher matchgroup=Delimiter start="{" skip="\\\\\|\\[{}]" end="}" transparent contains=@texMatchGroup,texError
- syn region texMatcher matchgroup=Delimiter start="\[" end="]" transparent contains=@texMatchGroup,texError,@NoSpell
+ syn region texMatcher matchgroup=Delimiter start="{" skip="\\\\\|\\[{}]" end="}" transparent contains=@texMatchGroup,texError
+ syn region texMatcher matchgroup=Delimiter start="\[" end="]" transparent contains=@texMatchGroup,texError,@NoSpell
+ syn region texMatcherNM matchgroup=Delimiter start="{" skip="\\\\\|\\[{}]" end="}" transparent contains=@texMatchNMGroup,texError
+ syn region texMatcherNM matchgroup=Delimiter start="\[" end="]" transparent contains=@texMatchNMGroup,texError,@NoSpell
else
- syn region texMatcher matchgroup=Delimiter start="{" skip="\\\\\|\\[{}]" end="}" transparent contains=@texMatchGroup
- syn region texMatcher matchgroup=Delimiter start="\[" end="]" transparent contains=@texMatchGroup
+ syn region texMatcher matchgroup=Delimiter start="{" skip="\\\\\|\\[{}]" end="}" transparent contains=@texMatchGroup
+ syn region texMatcher matchgroup=Delimiter start="\[" end="]" transparent contains=@texMatchGroup
+ syn region texMatcherNM matchgroup=Delimiter start="{" skip="\\\\\|\\[{}]" end="}" transparent contains=@texMatchNMGroup
+ syn region texMatcherNM matchgroup=Delimiter start="\[" end="]" transparent contains=@texMatchNMGroup
endif
if !s:tex_nospell
- syn region texParen start="(" end=")" transparent contains=@texMatchGroup,@Spell
+ syn region texParen start="(" end=")" transparent contains=@texMatchGroup,@Spell
else
- syn region texParen start="(" end=")" transparent contains=@texMatchGroup
+ syn region texParen start="(" end=")" transparent contains=@texMatchGroup
endif
endif
if !s:tex_no_error
@@ -262,11 +259,12 @@ syn match texAccent +\\[=^.\~"`']+
syn match texAccent +\\['=t'.c^ud"vb~Hr]{\a}+
syn match texLigature "\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)$"
+
" \begin{}/\end{} section markers: {{{1
syn match texBeginEnd "\\begin\>\|\\end\>" nextgroup=texBeginEndName
if s:tex_fast =~# 'm'
syn region texBeginEndName matchgroup=Delimiter start="{" end="}" contained nextgroup=texBeginEndModifier contains=texComment
- syn region texBeginEndModifier matchgroup=Delimiter start="\[" end="]" contained contains=texComment,@NoSpell
+ syn region texBeginEndModifier matchgroup=Delimiter start="\[" end="]" contained contains=texComment,@texMathZones,@NoSpell
endif
" \documentclass, \documentstyle, \usepackage: {{{1
@@ -398,8 +396,8 @@ endif
" Bad Math (mismatched): {{{1
if !exists("g:tex_no_math") && !s:tex_no_error
- syn match texBadMath "\\end\s*{\s*\(array\|gathered\|bBpvV]matrix\|split\|subequations\|smallmatrix\|xxalignat\)\s*}"
- syn match texBadMath "\\end\s*{\s*\(align\|alignat\|displaymath\|displaymath\|eqnarray\|equation\|flalign\|gather\|math\|multline\|xalignat\)\*\=\s*}"
+ syn match texBadMath "\\end\s*{\s*\(array\|[bBpvV]matrix\|split\|smallmatrix\)\s*}"
+ syn match texBadMath "\\end\s*{\s*\(displaymath\|equation\|eqnarray\|math\)\*\=\s*}"
syn match texBadMath "\\[\])]"
endif
@@ -408,7 +406,7 @@ if !exists("g:tex_no_math")
" TexNewMathZone: function creates a mathzone with the given suffix and mathzone name. {{{2
" Starred forms are created if starform is true. Starred
" forms have syntax group and synchronization groups with a
- " "S" appended. Handles: cluster, syntax, sync, and HiLink.
+ " "S" appended. Handles: cluster, syntax, sync, and highlighting.
fun! TexNewMathZone(sfx,mathzone,starform)
let grpname = "texMathZone".a:sfx
let syncname = "texSyncMathZone".a:sfx
@@ -438,18 +436,10 @@ if !exists("g:tex_no_math")
endfun
" Standard Math Zones: {{{2
- call TexNewMathZone("A","align",1)
- call TexNewMathZone("B","alignat",1)
- call TexNewMathZone("C","displaymath",1)
- call TexNewMathZone("D","eqnarray",1)
- call TexNewMathZone("E","equation",1)
- call TexNewMathZone("F","flalign",1)
- call TexNewMathZone("G","gather",1)
- call TexNewMathZone("H","math",1)
- call TexNewMathZone("I","multline",1)
- call TexNewMathZone("J","subequations",0)
- call TexNewMathZone("K","xalignat",1)
- call TexNewMathZone("L","xxalignat",0)
+ call TexNewMathZone("A","displaymath",1)
+ call TexNewMathZone("B","eqnarray",1)
+ call TexNewMathZone("C","equation",1)
+ call TexNewMathZone("D","math",1)
" Inline Math Zones: {{{2
if s:tex_fast =~# 'M'
@@ -481,8 +471,9 @@ if !exists("g:tex_no_math")
" \left..something.. and \right..something.. support: {{{2
syn match texMathDelimBad contained "\S"
if has("conceal") && &enc == 'utf-8' && s:tex_conceal =~# 'm'
- syn match texMathDelim contained "\\left\\{\>" skipwhite nextgroup=texMathDelimSet1,texMathDelimSet2,texMathDelimBad contains=texMathSymbol cchar={
- syn match texMathDelim contained "\\right\\}\>" skipwhite nextgroup=texMathDelimSet1,texMathDelimSet2,texMathDelimBad contains=texMathSymbol cchar=}
+ syn match texMathDelim contained "\\left\["
+ syn match texMathDelim contained "\\left\\{" skipwhite nextgroup=texMathDelimSet1,texMathDelimSet2,texMathDelimBad contains=texMathSymbol cchar={
+ syn match texMathDelim contained "\\right\\}" skipwhite nextgroup=texMathDelimSet1,texMathDelimSet2,texMathDelimBad contains=texMathSymbol cchar=}
let s:texMathDelimList=[
\ ['<' , '<'] ,
\ ['>' , '>'] ,
@@ -497,13 +488,11 @@ if !exists("g:tex_no_math")
\ ['\\backslash' , '\'] ,
\ ['\\downarrow' , 'โ†“'] ,
\ ['\\Downarrow' , 'โ‡“'] ,
- \ ['\\langle' , '<'] ,
\ ['\\lbrace' , '['] ,
\ ['\\lceil' , 'โŒˆ'] ,
\ ['\\lfloor' , 'โŒŠ'] ,
\ ['\\lgroup' , 'โŒŠ'] ,
\ ['\\lmoustache' , 'โŽ›'] ,
- \ ['\\rangle' , '>'] ,
\ ['\\rbrace' , ']'] ,
\ ['\\rceil' , 'โŒ‰'] ,
\ ['\\rfloor' , 'โŒ‹'] ,
@@ -513,6 +502,15 @@ if !exists("g:tex_no_math")
\ ['\\Uparrow' , 'โ†‘'] ,
\ ['\\updownarrow', 'โ†•'] ,
\ ['\\Updownarrow', 'โ‡•']]
+ if &ambw == "double" || exists("g:tex_usedblwidth")
+ let s:texMathDelimList= s:texMathDelimList + [
+ \ ['\\langle' , 'ใ€ˆ'] ,
+ \ ['\\rangle' , 'ใ€‰']]
+ else
+ let s:texMathDelimList= s:texMathDelimList + [
+ \ ['\\langle' , '<'] ,
+ \ ['\\rangle' , '>']]
+ endif
syn match texMathDelim '\\[bB]igg\=[lr]' contained nextgroup=texMathDelimBad
for texmath in s:texMathDelimList
exe "syn match texMathDelim '\\\\[bB]igg\\=[lr]\\=".texmath[0]."' contained conceal cchar=".texmath[1]
@@ -584,6 +582,13 @@ else
endif
endif
+" %begin-include ... %end-include acts like a texDocZone for \include'd files. Permits spell checking, for example, in such files.
+if !s:tex_nospell
+ TexFold syn region texDocZone matchgroup=texSection start='^\s*%begin-include\>' end='^\s*%end-include\>' contains=@texFoldGroup,@texDocGroup,@Spell
+else
+ TexFold syn region texDocZone matchgroup=texSection start='^\s*%begin-include\>' end='^\s*%end-include\>' contains=@texFoldGroup,@texDocGroup
+endif
+
" Separate lines used for verb` and verb# so that the end conditions {{{1
" will appropriately terminate.
" If g:tex_verbspell exists, then verbatim texZones will permit spellchecking there.
@@ -591,28 +596,17 @@ if s:tex_fast =~# 'v'
if exists("g:tex_verbspell") && g:tex_verbspell
syn region texZone start="\\begin{[vV]erbatim}" end="\\end{[vV]erbatim}\|%stopzone\>" contains=@Spell
" listings package:
- syn region texZone start="\\begin{lstlisting}" end="\\end{lstlisting}\|%stopzone\>" contains=@Spell
- if version < 600
- syn region texZone start="\\verb\*\=`" end="`\|%stopzone\>" contains=@Spell
- syn region texZone start="\\verb\*\=#" end="#\|%stopzone\>" contains=@Spell
+ if b:tex_stylish
+ syn region texZone start="\\verb\*\=\z([^\ta-zA-Z@]\)" end="\z1\|%stopzone\>" contains=@Spell
else
- if b:tex_stylish
- syn region texZone start="\\verb\*\=\z([^\ta-zA-Z@]\)" end="\z1\|%stopzone\>" contains=@Spell
- else
- syn region texZone start="\\verb\*\=\z([^\ta-zA-Z]\)" end="\z1\|%stopzone\>" contains=@Spell
- endif
+ syn region texZone start="\\verb\*\=\z([^\ta-zA-Z]\)" end="\z1\|%stopzone\>" contains=@Spell
endif
else
syn region texZone start="\\begin{[vV]erbatim}" end="\\end{[vV]erbatim}\|%stopzone\>"
- if version < 600
- syn region texZone start="\\verb\*\=`" end="`\|%stopzone\>"
- syn region texZone start="\\verb\*\=#" end="#\|%stopzone\>"
+ if b:tex_stylish
+ syn region texZone start="\\verb\*\=\z([^\ta-zA-Z@]\)" end="\z1\|%stopzone\>"
else
- if b:tex_stylish
- syn region texZone start="\\verb\*\=\z([^\ta-zA-Z@]\)" end="\z1\|%stopzone\>"
- else
- syn region texZone start="\\verb\*\=\z([^\ta-zA-Z]\)" end="\z1\|%stopzone\>"
- endif
+ syn region texZone start="\\verb\*\=\z([^\ta-zA-Z]\)" end="\z1\|%stopzone\>"
endif
endif
endif
@@ -688,12 +682,7 @@ if has("conceal") && &enc == 'utf-8'
\ ['approx' , 'โ‰ˆ'],
\ ['ast' , 'โˆ—'],
\ ['asymp' , 'โ‰'],
- \ ['backepsilon' , 'โˆ'],
- \ ['backsimeq' , 'โ‰ƒ'],
\ ['backslash' , 'โˆ–'],
- \ ['barwedge' , 'โŠผ'],
- \ ['because' , 'โˆต'],
- \ ['between' , 'โ‰ฌ'],
\ ['bigcap' , 'โˆฉ'],
\ ['bigcirc' , 'โ—‹'],
\ ['bigcup' , 'โˆช'],
@@ -705,37 +694,18 @@ if has("conceal") && &enc == 'utf-8'
\ ['bigtriangleup' , 'โˆ†'],
\ ['bigvee' , 'โ‹'],
\ ['bigwedge' , 'โ‹€'],
- \ ['blacksquare' , 'โˆŽ'],
\ ['bot' , 'โŠฅ'],
\ ['bowtie' , 'โ‹ˆ'],
- \ ['boxdot' , 'โŠก'],
- \ ['boxminus' , 'โŠŸ'],
- \ ['boxplus' , 'โŠž'],
- \ ['boxtimes' , 'โŠ '],
\ ['bullet' , 'โ€ข'],
- \ ['bumpeq' , 'โ‰'],
- \ ['Bumpeq' , 'โ‰Ž'],
\ ['cap' , 'โˆฉ'],
- \ ['Cap' , 'โ‹’'],
\ ['cdot' , 'ยท'],
\ ['cdots' , 'โ‹ฏ'],
\ ['circ' , 'โˆ˜'],
- \ ['circeq' , 'โ‰—'],
- \ ['circlearrowleft', 'โ†บ'],
- \ ['circlearrowright', 'โ†ป'],
- \ ['circledast' , 'โŠ›'],
- \ ['circledcirc' , 'โŠš'],
\ ['clubsuit' , 'โ™ฃ'],
- \ ['complement' , 'โˆ'],
\ ['cong' , 'โ‰…'],
\ ['coprod' , 'โˆ'],
\ ['copyright' , 'ยฉ'],
\ ['cup' , 'โˆช'],
- \ ['Cup' , 'โ‹“'],
- \ ['curlyeqprec' , 'โ‹ž'],
- \ ['curlyeqsucc' , 'โ‹Ÿ'],
- \ ['curlyvee' , 'โ‹Ž'],
- \ ['curlywedge' , 'โ‹'],
\ ['dagger' , 'โ€ '],
\ ['dashv' , 'โŠฃ'],
\ ['ddagger' , 'โ€ก'],
@@ -744,113 +714,62 @@ if has("conceal") && &enc == 'utf-8'
\ ['diamondsuit' , 'โ™ข'],
\ ['div' , 'รท'],
\ ['doteq' , 'โ‰'],
- \ ['doteqdot' , 'โ‰‘'],
- \ ['dotplus' , 'โˆ”'],
\ ['dots' , 'โ€ฆ'],
- \ ['dotsb' , 'โ‹ฏ'],
- \ ['dotsc' , 'โ€ฆ'],
- \ ['dotsi' , 'โ‹ฏ'],
- \ ['dotso' , 'โ€ฆ'],
- \ ['doublebarwedge' , 'โฉž'],
\ ['downarrow' , 'โ†“'],
\ ['Downarrow' , 'โ‡“'],
\ ['ell' , 'โ„“'],
\ ['emptyset' , 'โˆ…'],
- \ ['eqcirc' , 'โ‰–'],
- \ ['eqsim' , 'โ‰‚'],
- \ ['eqslantgtr' , 'โช–'],
- \ ['eqslantless' , 'โช•'],
\ ['equiv' , 'โ‰ก'],
\ ['exists' , 'โˆƒ'],
- \ ['fallingdotseq' , 'โ‰’'],
\ ['flat' , 'โ™ญ'],
\ ['forall' , 'โˆ€'],
\ ['frown' , 'โ”'],
\ ['ge' , 'โ‰ฅ'],
\ ['geq' , 'โ‰ฅ'],
- \ ['geqq' , 'โ‰ง'],
\ ['gets' , 'โ†'],
\ ['gg' , 'โŸซ'],
- \ ['gneqq' , 'โ‰ฉ'],
- \ ['gtrdot' , 'โ‹—'],
- \ ['gtreqless' , 'โ‹›'],
- \ ['gtrless' , 'โ‰ท'],
- \ ['gtrsim' , 'โ‰ณ'],
\ ['hbar' , 'โ„'],
\ ['heartsuit' , 'โ™ก'],
\ ['hookleftarrow' , 'โ†ฉ'],
\ ['hookrightarrow' , 'โ†ช'],
- \ ['iiint' , 'โˆญ'],
- \ ['iint' , 'โˆฌ'],
+ \ ['iff' , 'โ‡”'],
\ ['Im' , 'โ„‘'],
\ ['imath' , 'ษฉ'],
\ ['in' , 'โˆˆ'],
\ ['infty' , 'โˆž'],
\ ['int' , 'โˆซ'],
+ \ ['jmath' , '๐šฅ'],
+ \ ['land' , 'โˆง'],
\ ['lceil' , 'โŒˆ'],
\ ['ldots' , 'โ€ฆ'],
\ ['le' , 'โ‰ค'],
- \ ['leadsto' , 'โ†'],
\ ['left(' , '('],
\ ['left\[' , '['],
\ ['left\\{' , '{'],
\ ['leftarrow' , 'โ†'],
\ ['Leftarrow' , 'โ‡'],
- \ ['leftarrowtail' , 'โ†ข'],
\ ['leftharpoondown', 'โ†ฝ'],
\ ['leftharpoonup' , 'โ†ผ'],
\ ['leftrightarrow' , 'โ†”'],
\ ['Leftrightarrow' , 'โ‡”'],
- \ ['leftrightsquigarrow', 'โ†ญ'],
- \ ['leftthreetimes' , 'โ‹‹'],
\ ['leq' , 'โ‰ค'],
\ ['leq' , 'โ‰ค'],
- \ ['leqq' , 'โ‰ฆ'],
- \ ['lessdot' , 'โ‹–'],
- \ ['lesseqgtr' , 'โ‹š'],
- \ ['lesssim' , 'โ‰ฒ'],
\ ['lfloor' , 'โŒŠ'],
\ ['ll' , 'โ‰ช'],
\ ['lmoustache' , 'โ•ญ'],
- \ ['lneqq' , 'โ‰จ'],
- \ ['ltimes' , 'โ‹‰'],
+ \ ['lor' , 'โˆจ'],
\ ['mapsto' , 'โ†ฆ'],
- \ ['measuredangle' , 'โˆก'],
\ ['mid' , 'โˆฃ'],
\ ['models' , 'โ•ž'],
\ ['mp' , 'โˆ“'],
\ ['nabla' , 'โˆ‡'],
\ ['natural' , 'โ™ฎ'],
- \ ['ncong' , 'โ‰‡'],
\ ['ne' , 'โ‰ '],
\ ['nearrow' , 'โ†—'],
\ ['neg' , 'ยฌ'],
\ ['neq' , 'โ‰ '],
- \ ['nexists' , 'โˆ„'],
- \ ['ngeq' , 'โ‰ฑ'],
- \ ['ngeqq' , 'โ‰ฑ'],
- \ ['ngtr' , 'โ‰ฏ'],
\ ['ni' , 'โˆ‹'],
- \ ['nleftarrow' , 'โ†š'],
- \ ['nLeftarrow' , 'โ‡'],
- \ ['nLeftrightarrow', 'โ‡Ž'],
- \ ['nleq' , 'โ‰ฐ'],
- \ ['nleqq' , 'โ‰ฐ'],
- \ ['nless' , 'โ‰ฎ'],
- \ ['nmid' , 'โˆค'],
\ ['notin' , 'โˆ‰'],
- \ ['nprec' , 'โŠ€'],
- \ ['nrightarrow' , 'โ†›'],
- \ ['nRightarrow' , 'โ‡'],
- \ ['nsim' , 'โ‰'],
- \ ['nsucc' , 'โЁ'],
- \ ['ntriangleleft' , 'โ‹ช'],
- \ ['ntrianglelefteq', 'โ‹ฌ'],
- \ ['ntriangleright' , 'โ‹ซ'],
- \ ['ntrianglerighteq', 'โ‹ญ'],
- \ ['nvdash' , 'โŠฌ'],
- \ ['nvDash' , 'โŠญ'],
- \ ['nVdash' , 'โŠฎ'],
\ ['nwarrow' , 'โ†–'],
\ ['odot' , 'โŠ™'],
\ ['oint' , 'โˆฎ'],
@@ -863,15 +782,9 @@ if has("conceal") && &enc == 'utf-8'
\ ['parallel' , 'โ•‘'],
\ ['partial' , 'โˆ‚'],
\ ['perp' , 'โŠฅ'],
- \ ['pitchfork' , 'โ‹”'],
\ ['pm' , 'ยฑ'],
\ ['prec' , 'โ‰บ'],
- \ ['precapprox' , 'โชท'],
- \ ['preccurlyeq' , 'โ‰ผ'],
\ ['preceq' , 'โชฏ'],
- \ ['precnapprox' , 'โชน'],
- \ ['precneqq' , 'โชต'],
- \ ['precsim' , 'โ‰พ'],
\ ['prime' , 'โ€ฒ'],
\ ['prod' , 'โˆ'],
\ ['propto' , 'โˆ'],
@@ -883,13 +796,8 @@ if has("conceal") && &enc == 'utf-8'
\ ['right\\}' , '}'],
\ ['rightarrow' , 'โ†’'],
\ ['Rightarrow' , 'โ‡’'],
- \ ['rightarrowtail' , 'โ†ฃ'],
\ ['rightleftharpoons', 'โ‡Œ'],
- \ ['rightsquigarrow', 'โ†'],
- \ ['rightthreetimes', 'โ‹Œ'],
- \ ['risingdotseq' , 'โ‰“'],
\ ['rmoustache' , 'โ•ฎ'],
- \ ['rtimes' , 'โ‹Š'],
\ ['S' , 'ยง'],
\ ['searrow' , 'โ†˜'],
\ ['setminus' , 'โˆ–'],
@@ -898,7 +806,6 @@ if has("conceal") && &enc == 'utf-8'
\ ['simeq' , 'โ‹'],
\ ['smile' , 'โ€ฟ'],
\ ['spadesuit' , 'โ™ '],
- \ ['sphericalangle' , 'โˆข'],
\ ['sqcap' , 'โŠ“'],
\ ['sqcup' , 'โŠ”'],
\ ['sqsubset' , 'โŠ'],
@@ -907,58 +814,39 @@ if has("conceal") && &enc == 'utf-8'
\ ['sqsupseteq' , 'โŠ’'],
\ ['star' , 'โœซ'],
\ ['subset' , 'โŠ‚'],
- \ ['Subset' , 'โ‹'],
\ ['subseteq' , 'โІ'],
- \ ['subseteqq' , 'โซ…'],
- \ ['subsetneq' , 'โŠŠ'],
- \ ['subsetneqq' , 'โซ‹'],
\ ['succ' , 'โ‰ป'],
- \ ['succapprox' , 'โชธ'],
- \ ['succcurlyeq' , 'โ‰ฝ'],
\ ['succeq' , 'โชฐ'],
- \ ['succnapprox' , 'โชบ'],
- \ ['succneqq' , 'โชถ'],
- \ ['succsim' , 'โ‰ฟ'],
\ ['sum' , 'โˆ‘'],
\ ['supset' , 'โŠƒ'],
- \ ['Supset' , 'โ‹‘'],
\ ['supseteq' , 'โЇ'],
- \ ['supseteqq' , 'โซ†'],
- \ ['supsetneq' , 'โŠ‹'],
- \ ['supsetneqq' , 'โซŒ'],
\ ['surd' , 'โˆš'],
\ ['swarrow' , 'โ†™'],
- \ ['therefore' , 'โˆด'],
\ ['times' , 'ร—'],
\ ['to' , 'โ†’'],
\ ['top' , 'โŠค'],
\ ['triangle' , 'โˆ†'],
\ ['triangleleft' , 'โŠฒ'],
- \ ['trianglelefteq' , 'โŠด'],
- \ ['triangleq' , 'โ‰œ'],
\ ['triangleright' , 'โŠณ'],
- \ ['trianglerighteq', 'โŠต'],
- \ ['twoheadleftarrow', 'โ†ž'],
- \ ['twoheadrightarrow', 'โ† '],
\ ['uparrow' , 'โ†‘'],
\ ['Uparrow' , 'โ‡‘'],
\ ['updownarrow' , 'โ†•'],
\ ['Updownarrow' , 'โ‡•'],
- \ ['varnothing' , 'โˆ…'],
- \ ['vartriangle' , 'โˆ†'],
\ ['vdash' , 'โŠข'],
- \ ['vDash' , 'โŠจ'],
- \ ['Vdash' , 'โŠฉ'],
\ ['vdots' , 'โ‹ฎ'],
\ ['vee' , 'โˆจ'],
- \ ['veebar' , 'โŠป'],
- \ ['Vvdash' , 'โŠช'],
\ ['wedge' , 'โˆง'],
\ ['wp' , 'โ„˜'],
\ ['wr' , 'โ‰€']]
-" \ ['jmath' , 'X']
-" \ ['uminus' , 'X']
-" \ ['uplus' , 'X']
+ if &ambw == "double" || exists("g:tex_usedblwidth")
+ let s:texMathList= s:texMathList + [
+ \ ['right\\rangle' , 'ใ€‰'],
+ \ ['left\\langle' , 'ใ€ˆ']]
+ else
+ let s:texMathList= s:texMathList + [
+ \ ['right\\rangle' , '>'],
+ \ ['left\\langle' , '<']]
+ endif
for texmath in s:texMathList
if texmath[0] =~# '\w$'
exe "syn match texMathSymbol '\\\\".texmath[0]."\\>' contained conceal cchar=".texmath[1]
@@ -996,6 +884,48 @@ if has("conceal") && &enc == 'utf-8'
syn match texMathSymbol '\\hat{y}' contained conceal cchar=ลท
syn match texMathSymbol '\\hat{Y}' contained conceal cchar=ลถ
" syn match texMathSymbol '\\bar{a}' contained conceal cchar=aฬ…
+
+ syn match texMathSymbol '\\dot{B}' contained conceal cchar=แธ‚
+ syn match texMathSymbol '\\dot{b}' contained conceal cchar=แธƒ
+ syn match texMathSymbol '\\dot{D}' contained conceal cchar=แธŠ
+ syn match texMathSymbol '\\dot{d}' contained conceal cchar=แธ‹
+ syn match texMathSymbol '\\dot{F}' contained conceal cchar=แธž
+ syn match texMathSymbol '\\dot{f}' contained conceal cchar=แธŸ
+ syn match texMathSymbol '\\dot{H}' contained conceal cchar=แธข
+ syn match texMathSymbol '\\dot{h}' contained conceal cchar=แธฃ
+ syn match texMathSymbol '\\dot{M}' contained conceal cchar=แน€
+ syn match texMathSymbol '\\dot{m}' contained conceal cchar=แน
+ syn match texMathSymbol '\\dot{N}' contained conceal cchar=แน„
+ syn match texMathSymbol '\\dot{n}' contained conceal cchar=แน…
+ syn match texMathSymbol '\\dot{P}' contained conceal cchar=แน–
+ syn match texMathSymbol '\\dot{p}' contained conceal cchar=แน—
+ syn match texMathSymbol '\\dot{R}' contained conceal cchar=แน˜
+ syn match texMathSymbol '\\dot{r}' contained conceal cchar=แน™
+ syn match texMathSymbol '\\dot{S}' contained conceal cchar=แน 
+ syn match texMathSymbol '\\dot{s}' contained conceal cchar=แนก
+ syn match texMathSymbol '\\dot{T}' contained conceal cchar=แนช
+ syn match texMathSymbol '\\dot{t}' contained conceal cchar=แนซ
+ syn match texMathSymbol '\\dot{W}' contained conceal cchar=แบ†
+ syn match texMathSymbol '\\dot{w}' contained conceal cchar=แบ‡
+ syn match texMathSymbol '\\dot{X}' contained conceal cchar=แบŠ
+ syn match texMathSymbol '\\dot{x}' contained conceal cchar=แบ‹
+ syn match texMathSymbol '\\dot{Y}' contained conceal cchar=แบŽ
+ syn match texMathSymbol '\\dot{y}' contained conceal cchar=แบ
+ syn match texMathSymbol '\\dot{Z}' contained conceal cchar=ลป
+ syn match texMathSymbol '\\dot{z}' contained conceal cchar=ลผ
+
+ syn match texMathSymbol '\\dot{C}' contained conceal cchar=ฤŠ
+ syn match texMathSymbol '\\dot{c}' contained conceal cchar=ฤ‹
+ syn match texMathSymbol '\\dot{E}' contained conceal cchar=ฤ–
+ syn match texMathSymbol '\\dot{e}' contained conceal cchar=ฤ—
+ syn match texMathSymbol '\\dot{G}' contained conceal cchar=ฤ 
+ syn match texMathSymbol '\\dot{g}' contained conceal cchar=ฤก
+ syn match texMathSymbol '\\dot{I}' contained conceal cchar=ฤฐ
+
+ syn match texMathSymbol '\\dot{A}' contained conceal cchar=ศฆ
+ syn match texMathSymbol '\\dot{a}' contained conceal cchar=ศง
+ syn match texMathSymbol '\\dot{O}' contained conceal cchar=ศฎ
+ syn match texMathSymbol '\\dot{o}' contained conceal cchar=ศฏ
endif
" Greek {{{2
@@ -1136,9 +1066,21 @@ if has("conceal") && &enc == 'utf-8'
call s:SuperSub('texSubscript','_','9','โ‚‰')
call s:SuperSub('texSubscript','_','a','โ‚')
call s:SuperSub('texSubscript','_','e','โ‚‘')
+ call s:SuperSub('texSubscript','_','h','โ‚•')
call s:SuperSub('texSubscript','_','i','แตข')
+ call s:SuperSub('texSubscript','_','j','โฑผ')
+ call s:SuperSub('texSubscript','_','k','โ‚–')
+ call s:SuperSub('texSubscript','_','l','โ‚—')
+ call s:SuperSub('texSubscript','_','m','โ‚˜')
+ call s:SuperSub('texSubscript','_','n','โ‚™')
call s:SuperSub('texSubscript','_','o','โ‚’')
+ call s:SuperSub('texSubscript','_','p','โ‚š')
+ call s:SuperSub('texSubscript','_','r','แตฃ')
+ call s:SuperSub('texSubscript','_','s','โ‚›')
+ call s:SuperSub('texSubscript','_','t','โ‚œ')
call s:SuperSub('texSubscript','_','u','แตค')
+ call s:SuperSub('texSubscript','_','v','แตฅ')
+ call s:SuperSub('texSubscript','_','x','โ‚“')
call s:SuperSub('texSubscript','_',',','๏ธ')
call s:SuperSub('texSubscript','_','+','โ‚Š')
call s:SuperSub('texSubscript','_','-','โ‚‹')
@@ -1154,14 +1096,17 @@ if has("conceal") && &enc == 'utf-8'
call s:SuperSub('texSubscript','_','\\phi\>' ,'แตฉ')
call s:SuperSub('texSubscript','_','\\gamma\>','แตง')
call s:SuperSub('texSubscript','_','\\chi\>' ,'แตช')
+
delfun s:SuperSub
endif
- " Accented characters: {{{2
+ " Accented characters and Ligatures: {{{2
if s:tex_conceal =~# 'a'
if b:tex_stylish
syn match texAccent "\\[bcdvuH][^a-zA-Z@]"me=e-1
- syn match texLigature "\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)[^a-zA-Z@]"me=e-1
+ syn match texLigature "\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)[^a-zA-Z@]"me=e-1
+ syn match texLigature '--'
+ syn match texLigature '---'
else
fun! s:Accents(chr,...)
let i= 1
@@ -1222,15 +1167,17 @@ if has("conceal") && &enc == 'utf-8'
call s:Accents('\\i','รฌ','รญ','รฎ','รฏ','ฤฉ','ฤฏ',' ',' ',' ',' ',' ','ฤญ',' ')
" \` \' \^ \" \~ \. \= \c \H \k \r \u \v
delfun s:Accents
- syn match texAccent '\\aa\>' conceal cchar=รฅ
- syn match texAccent '\\AA\>' conceal cchar=ร…
- syn match texAccent '\\o\>' conceal cchar=รธ
- syn match texAccent '\\O\>' conceal cchar=ร˜
+ syn match texAccent '\\aa\>' conceal cchar=รฅ
+ syn match texAccent '\\AA\>' conceal cchar=ร…
+ syn match texAccent '\\o\>' conceal cchar=รธ
+ syn match texAccent '\\O\>' conceal cchar=ร˜
syn match texLigature '\\AE\>' conceal cchar=ร†
syn match texLigature '\\ae\>' conceal cchar=รฆ
syn match texLigature '\\oe\>' conceal cchar=ล“
syn match texLigature '\\OE\>' conceal cchar=ล’
syn match texLigature '\\ss\>' conceal cchar=รŸ
+ syn match texLigature '--' conceal cchar=โ€“
+ syn match texLigature '---' conceal cchar=โ€”
endif
endif
endif
@@ -1260,86 +1207,87 @@ endif
" ---------------------------------------------------------------------
" Highlighting: {{{1
-if did_tex_syntax_inits == 1
- let did_tex_syntax_inits= 2
+
+" Define the default highlighting. {{{1
+if !exists("skip_tex_syntax_inits")
+
" TeX highlighting groups which should share similar highlighting
if !exists("g:tex_no_error")
if !exists("g:tex_no_math")
- HiLink texBadMath texError
- HiLink texMathDelimBad texError
- HiLink texMathError texError
+ hi def link texBadMath texError
+ hi def link texMathDelimBad texError
+ hi def link texMathError texError
if !b:tex_stylish
- HiLink texOnlyMath texError
+ hi def link texOnlyMath texError
endif
endif
- HiLink texError Error
+ hi def link texError Error
endif
hi texBoldStyle gui=bold cterm=bold
hi texItalStyle gui=italic cterm=italic
hi texBoldItalStyle gui=bold,italic cterm=bold,italic
hi texItalBoldStyle gui=bold,italic cterm=bold,italic
- HiLink texCite texRefZone
- HiLink texDefCmd texDef
- HiLink texDefName texDef
- HiLink texDocType texCmdName
- HiLink texDocTypeArgs texCmdArgs
- HiLink texInputFileOpt texCmdArgs
- HiLink texInputCurlies texDelimiter
- HiLink texLigature texSpecialChar
+ hi def link texCite texRefZone
+ hi def link texDefCmd texDef
+ hi def link texDefName texDef
+ hi def link texDocType texCmdName
+ hi def link texDocTypeArgs texCmdArgs
+ hi def link texInputFileOpt texCmdArgs
+ hi def link texInputCurlies texDelimiter
+ hi def link texLigature texSpecialChar
if !exists("g:tex_no_math")
- HiLink texMathDelimSet1 texMathDelim
- HiLink texMathDelimSet2 texMathDelim
- HiLink texMathDelimKey texMathDelim
- HiLink texMathMatcher texMath
- HiLink texAccent texStatement
- HiLink texGreek texStatement
- HiLink texSuperscript texStatement
- HiLink texSubscript texStatement
- HiLink texSuperscripts texSuperscript
- HiLink texSubscripts texSubscript
- HiLink texMathSymbol texStatement
- HiLink texMathZoneV texMath
- HiLink texMathZoneW texMath
- HiLink texMathZoneX texMath
- HiLink texMathZoneY texMath
- HiLink texMathZoneV texMath
- HiLink texMathZoneZ texMath
+ hi def link texMathDelimSet1 texMathDelim
+ hi def link texMathDelimSet2 texMathDelim
+ hi def link texMathDelimKey texMathDelim
+ hi def link texMathMatcher texMath
+ hi def link texAccent texStatement
+ hi def link texGreek texStatement
+ hi def link texSuperscript texStatement
+ hi def link texSubscript texStatement
+ hi def link texSuperscripts texSuperscript
+ hi def link texSubscripts texSubscript
+ hi def link texMathSymbol texStatement
+ hi def link texMathZoneV texMath
+ hi def link texMathZoneW texMath
+ hi def link texMathZoneX texMath
+ hi def link texMathZoneY texMath
+ hi def link texMathZoneV texMath
+ hi def link texMathZoneZ texMath
endif
- HiLink texBeginEnd texCmdName
- HiLink texBeginEndName texSection
- HiLink texSpaceCode texStatement
- HiLink texStyleStatement texStatement
- HiLink texTypeSize texType
- HiLink texTypeStyle texType
+ hi def link texBeginEnd texCmdName
+ hi def link texBeginEndName texSection
+ hi def link texSpaceCode texStatement
+ hi def link texStyleStatement texStatement
+ hi def link texTypeSize texType
+ hi def link texTypeStyle texType
" Basic TeX highlighting groups
- HiLink texCmdArgs Number
- HiLink texCmdName Statement
- HiLink texComment Comment
- HiLink texDef Statement
- HiLink texDefParm Special
- HiLink texDelimiter Delimiter
- HiLink texInput Special
- HiLink texInputFile Special
- HiLink texLength Number
- HiLink texMath Special
- HiLink texMathDelim Statement
- HiLink texMathOper Operator
- HiLink texNewCmd Statement
- HiLink texNewEnv Statement
- HiLink texOption Number
- HiLink texRefZone Special
- HiLink texSection PreCondit
- HiLink texSpaceCodeChar Special
- HiLink texSpecialChar SpecialChar
- HiLink texStatement Statement
- HiLink texString String
- HiLink texTodo Todo
- HiLink texType Type
- HiLink texZone PreCondit
-
- delcommand HiLink
+ hi def link texCmdArgs Number
+ hi def link texCmdName Statement
+ hi def link texComment Comment
+ hi def link texDef Statement
+ hi def link texDefParm Special
+ hi def link texDelimiter Delimiter
+ hi def link texInput Special
+ hi def link texInputFile Special
+ hi def link texLength Number
+ hi def link texMath Special
+ hi def link texMathDelim Statement
+ hi def link texMathOper Operator
+ hi def link texNewCmd Statement
+ hi def link texNewEnv Statement
+ hi def link texOption Number
+ hi def link texRefZone Special
+ hi def link texSection PreCondit
+ hi def link texSpaceCodeChar Special
+ hi def link texSpecialChar SpecialChar
+ hi def link texStatement Statement
+ hi def link texString String
+ hi def link texTodo Todo
+ hi def link texType Type
+ hi def link texZone PreCondit
+
endif
" Cleanup: {{{1
diff --git a/runtime/syntax/texinfo.vim b/runtime/syntax/texinfo.vim
index 134fc6763c..a4b7689707 100644
--- a/runtime/syntax/texinfo.vim
+++ b/runtime/syntax/texinfo.vim
@@ -9,10 +9,8 @@
" since @ can have special meanings, everything is 'match'-ed and 'region'-ed
" (including @ in 'iskeyword' option has unexpected effects)
-" Remove any old syntax stuff hanging around, if needed
-if version < 600
- syn clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -356,48 +354,37 @@ syn cluster texinfoReducedAll contains=texinfoSpecialChar,texinfoBrcPrmAtCmd
"==============================================================================
" highlighting
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_texinfo_syn_inits")
-
- if version < 508
- let did_texinfo_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink texinfoSpecialChar Special
- HiLink texinfoHFSpecialChar Special
-
- HiLink texinfoError Error
- HiLink texinfoIdent Identifier
- HiLink texinfoAssignment Identifier
- HiLink texinfoSinglePar Identifier
- HiLink texinfoIndexPar Identifier
- HiLink texinfoSIPar Identifier
- HiLink texinfoDIEPar Identifier
- HiLink texinfoTexCmd PreProc
-
-
- HiLink texinfoAtCmd Statement "@-command
- HiLink texinfoPrmAtCmd String "@-command in one line with unknown nr. of parameters
- "is String because is found as a region and is 'matchgroup'-ed
- "to texinfoAtCmd
- HiLink texinfoBrcPrmAtCmd String "@-command with parameter(s) in braces ({})
- "is String because is found as a region and is 'matchgroup'-ed to texinfoAtCmd
- HiLink texinfoMltlnAtCmdFLine texinfoAtCmd "repeated embedded First lines in @-commands
- HiLink texinfoMltlnAtCmd String "@-command in multiple lines
- "is String because is found as a region and is 'matchgroup'-ed to texinfoAtCmd
- HiLink texinfoMltln2AtCmd PreProc "@-command in multiple lines (same as texinfoMltlnAtCmd, just with other colors)
- HiLink texinfoMltlnDMAtCmd PreProc "@-command in multiple lines (same as texinfoMltlnAtCmd, just with other colors; used for @detailmenu, which can be included in @menu)
- HiLink texinfoMltlnNAtCmd Normal "@-command in multiple lines (same as texinfoMltlnAtCmd, just with other colors)
- HiLink texinfoThisAtCmd Statement "@-command used in headers and footers (@this... series)
-
- HiLink texinfoComment Comment
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link texinfoSpecialChar Special
+hi def link texinfoHFSpecialChar Special
+
+hi def link texinfoError Error
+hi def link texinfoIdent Identifier
+hi def link texinfoAssignment Identifier
+hi def link texinfoSinglePar Identifier
+hi def link texinfoIndexPar Identifier
+hi def link texinfoSIPar Identifier
+hi def link texinfoDIEPar Identifier
+hi def link texinfoTexCmd PreProc
+
+
+hi def link texinfoAtCmd Statement "@-command
+hi def link texinfoPrmAtCmd String "@-command in one line with unknown nr. of parameters
+ "is String because is found as a region and is 'matchgroup'-ed
+ "to texinfoAtCmd
+hi def link texinfoBrcPrmAtCmd String "@-command with parameter(s) in braces ({})
+ "is String because is found as a region and is 'matchgroup'-ed to texinfoAtCmd
+hi def link texinfoMltlnAtCmdFLine texinfoAtCmd "repeated embedded First lines in @-commands
+hi def link texinfoMltlnAtCmd String "@-command in multiple lines
+ "is String because is found as a region and is 'matchgroup'-ed to texinfoAtCmd
+hi def link texinfoMltln2AtCmd PreProc "@-command in multiple lines (same as texinfoMltlnAtCmd, just with other colors)
+hi def link texinfoMltlnDMAtCmd PreProc "@-command in multiple lines (same as texinfoMltlnAtCmd, just with other colors; used for @detailmenu, which can be included in @menu)
+hi def link texinfoMltlnNAtCmd Normal "@-command in multiple lines (same as texinfoMltlnAtCmd, just with other colors)
+hi def link texinfoThisAtCmd Statement "@-command used in headers and footers (@this... series)
+
+hi def link texinfoComment Comment
+
let b:current_syntax = "texinfo"
diff --git a/runtime/syntax/texmf.vim b/runtime/syntax/texmf.vim
index 7b91168f08..d1268faff7 100644
--- a/runtime/syntax/texmf.vim
+++ b/runtime/syntax/texmf.vim
@@ -6,12 +6,9 @@
" URL: http://physics.muni.cz/~yeti/download/syntax/texmf.vim
" Setup
-if version >= 600
- if exists("b:current_syntax")
- finish
- endif
-else
- syntax clear
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
endif
syn case match
@@ -45,42 +42,33 @@ syn region texmfBrace matchgroup=texmfBraceBrace start="{" end="}" contains=ALLB
syn match texmfBraceError "}"
" Define the default highlighting
-if version >= 508 || !exists("did_texmf_syntax_inits")
- if version < 508
- let did_texmf_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink texmfComment Comment
- HiLink texmfTodo Todo
+hi def link texmfComment Comment
+hi def link texmfTodo Todo
- HiLink texmfPassedParameter texmfVariable
- HiLink texmfVariable Identifier
+hi def link texmfPassedParameter texmfVariable
+hi def link texmfVariable Identifier
- HiLink texmfNumber Number
- HiLink texmfString String
+hi def link texmfNumber Number
+hi def link texmfString String
- HiLink texmfLHSStart texmfLHS
- HiLink texmfLHSVariable texmfLHS
- HiLink texmfLHSDot texmfLHS
- HiLink texmfLHS Type
+hi def link texmfLHSStart texmfLHS
+hi def link texmfLHSVariable texmfLHS
+hi def link texmfLHSDot texmfLHS
+hi def link texmfLHS Type
- HiLink texmfEquals Normal
+hi def link texmfEquals Normal
- HiLink texmfBraceBrace texmfDelimiter
- HiLink texmfComma texmfDelimiter
- HiLink texmfColons texmfDelimiter
- HiLink texmfDelimiter Preproc
+hi def link texmfBraceBrace texmfDelimiter
+hi def link texmfComma texmfDelimiter
+hi def link texmfColons texmfDelimiter
+hi def link texmfDelimiter Preproc
- HiLink texmfDoubleExclam Statement
- HiLink texmfSpecial Special
+hi def link texmfDoubleExclam Statement
+hi def link texmfSpecial Special
- HiLink texmfBraceError texmfError
- HiLink texmfError Error
+hi def link texmfBraceError texmfError
+hi def link texmfError Error
- delcommand HiLink
-endif
let b:current_syntax = "texmf"
diff --git a/runtime/syntax/tf.vim b/runtime/syntax/tf.vim
index 2a9a999883..47775b8637 100644
--- a/runtime/syntax/tf.vim
+++ b/runtime/syntax/tf.vim
@@ -9,11 +9,8 @@
" Remove any old syntax stuff hanging around
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -161,44 +158,34 @@ else
endif
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_tf_syn_inits")
- if version < 508
- let did_tf_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink tfComment Comment
- HiLink tfString String
- HiLink tfNumber Number
- HiLink tfFloat Float
- HiLink tfIdentifier Identifier
- HiLink tfVar Identifier
- HiLink tfWorld Identifier
- HiLink tfReadonly Identifier
- HiLink tfHook Identifier
- HiLink tfFunctions Function
- HiLink tfRepeat Repeat
- HiLink tfConditional Conditional
- HiLink tfLabel Label
- HiLink tfStatement Statement
- HiLink tfType Type
- HiLink tfInclude Include
- HiLink tfDefine Define
- HiLink tfSpecialChar SpecialChar
- HiLink tfSpecialCharEsc SpecialChar
- HiLink tfParentError Error
- HiLink tfTodo Todo
- HiLink tfEndCommand Delimiter
- HiLink tfJoinLines Delimiter
- HiLink tfOperator Operator
- HiLink tfRelation Operator
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link tfComment Comment
+hi def link tfString String
+hi def link tfNumber Number
+hi def link tfFloat Float
+hi def link tfIdentifier Identifier
+hi def link tfVar Identifier
+hi def link tfWorld Identifier
+hi def link tfReadonly Identifier
+hi def link tfHook Identifier
+hi def link tfFunctions Function
+hi def link tfRepeat Repeat
+hi def link tfConditional Conditional
+hi def link tfLabel Label
+hi def link tfStatement Statement
+hi def link tfType Type
+hi def link tfInclude Include
+hi def link tfDefine Define
+hi def link tfSpecialChar SpecialChar
+hi def link tfSpecialCharEsc SpecialChar
+hi def link tfParentError Error
+hi def link tfTodo Todo
+hi def link tfEndCommand Delimiter
+hi def link tfJoinLines Delimiter
+hi def link tfOperator Operator
+hi def link tfRelation Operator
+
let b:current_syntax = "tf"
diff --git a/runtime/syntax/tidy.vim b/runtime/syntax/tidy.vim
index c24796edd1..6371cb5a86 100644
--- a/runtime/syntax/tidy.vim
+++ b/runtime/syntax/tidy.vim
@@ -1,145 +1,135 @@
" Vim syntax file
" Language: HMTL Tidy configuration file (/etc/tidyrc ~/.tidyrc)
" Maintainer: Doug Kearns <dougkearns@gmail.com>
-" Last Change: 2013 June 01
+" Last Change: 2016 Apr 24
if exists("b:current_syntax")
finish
endif
-setlocal iskeyword=@,48-57,-
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn iskeyword @,48-57,-,_
+
+syn case ignore
+syn keyword tidyBoolean contained t[rue] f[alse] y[es] n[o] 1 0
+syn keyword tidyAutoBoolean contained t[rue] f[alse] y[es] n[o] 1 0 auto
+syn case match
+syn keyword tidyDoctype contained html5 omit auto strict loose transitional user
+syn keyword tidyEncoding contained raw ascii latin0 latin1 utf8 iso2022 mac win1252 ibm858 utf16le utf16be utf16 big5 shiftjis
+syn keyword tidyNewline contained LF CRLF CR
+syn match tidyNumber contained "\<\d\+\>"
+syn keyword tidyRepeat contained keep-first keep-last
+syn keyword tidySorter contained alpha none
+syn region tidyString contained start=+"+ skip=+\\\\\|\\"+ end=+"+ oneline
+syn region tidyString contained start=+'+ skip=+\\\\\|\\'+ end=+'+ oneline
+syn match tidyTags contained "\<\w\+\(\s*,\s*\w\+\)*\>"
+
+syn keyword tidyBooleanOption add-xml-decl add-xml-pi add-xml-space
+ \ anchor-as-name ascii-chars assume-xml-procins bare break-before-br
+ \ clean coerce-endtags decorate-inferred-ul drop-empty-paras
+ \ drop-empty-elements drop-font-tags drop-proprietary-attributes
+ \ enclose-block-text enclose-text escape-cdata escape-scripts
+ \ fix-backslash fix-bad-comments fix-uri force-output gdoc gnu-emacs
+ \ hide-comments hide-endtags indent-attributes indent-cdata
+ \ indent-with-tabs input-xml join-classes join-styles keep-time
+ \ language literal-attributes logical-emphasis lower-literals markup
+ \ merge-emphasis ncr numeric-entities omit-optional-tags output-html
+ \ output-xhtml output-xml preserve-entities punctuation-wrap quiet
+ \ quote-ampersand quote-marks quote-nbsp raw replace-color show-info
+ \ show-warnings skip-nested split strict-tags-attributes tidy-mark
+ \ uppercase-attributes uppercase-tags word-2000 wrap-asp
+ \ wrap-attributes wrap-jste wrap-php wrap-script-literals
+ \ wrap-sections write-back
+ \ contained nextgroup=tidyBooleanDelimiter
+
+syn match tidyBooleanDelimiter ":" nextgroup=tidyBoolean contained skipwhite
+
+syn keyword tidyAutoBooleanOption indent merge-divs merge-spans output-bom show-body-only vertical-space contained nextgroup=tidyAutoBooleanDelimiter
+syn match tidyAutoBooleanDelimiter ":" nextgroup=tidyAutoBoolean contained skipwhite
+
+syn keyword tidyCSSSelectorOption css-prefix contained nextgroup=tidyCSSSelectorDelimiter
+syn match tidyCSSSelectorDelimiter ":" nextgroup=tidyCSSSelector contained skipwhite
+
+syn keyword tidyDoctypeOption doctype contained nextgroup=tidyDoctypeDelimiter
+syn match tidyDoctypeDelimiter ":" nextgroup=tidyDoctype contained skipwhite
+
+syn keyword tidyEncodingOption char-encoding input-encoding output-encoding contained nextgroup=tidyEncodingDelimiter
+syn match tidyEncodingDelimiter ":" nextgroup=tidyEncoding contained skipwhite
+
+syn keyword tidyIntegerOption accessibility-check doctype-mode indent-spaces show-errors tab-size wrap contained nextgroup=tidyIntegerDelimiter
+syn match tidyIntegerDelimiter ":" nextgroup=tidyNumber contained skipwhite
+
+syn keyword tidyNameOption slide-style contained nextgroup=tidyNameDelimiter
+syn match tidyNameDelimiter ":" nextgroup=tidyName contained skipwhite
+
+syn keyword tidyNewlineOption newline contained nextgroup=tidyNewlineDelimiter
+syn match tidyNewlineDelimiter ":" nextgroup=tidyNewline contained skipwhite
+
+syn keyword tidyTagsOption new-blocklevel-tags new-empty-tags new-inline-tags new-pre-tags contained nextgroup=tidyTagsDelimiter
+syn match tidyTagsDelimiter ":" nextgroup=tidyTags contained skipwhite
+
+syn keyword tidyRepeatOption repeated-attributes contained nextgroup=tidyRepeatDelimiter
+syn match tidyRepeatDelimiter ":" nextgroup=tidyRepeat contained skipwhite
+
+syn keyword tidySorterOption sort-attributes contained nextgroup=tidySorterDelimiter
+syn match tidySorterDelimiter ":" nextgroup=tidySorter contained skipwhite
+
+syn keyword tidyStringOption alt-text error-file gnu-emacs-file output-file contained nextgroup=tidyStringDelimiter
+syn match tidyStringDelimiter ":" nextgroup=tidyString contained skipwhite
+
+syn cluster tidyOptions contains=tidy.*Option
+
+syn match tidyStart "^" nextgroup=@tidyOptions
syn match tidyComment "^\s*//.*$" contains=tidyTodo
syn match tidyComment "^\s*#.*$" contains=tidyTodo
syn keyword tidyTodo TODO NOTE FIXME XXX contained
-syn match tidyAssignment "^[a-z0-9-]\+:\s*.*$" contains=tidyOption,@tidyValue,tidyDelimiter
-syn match tidyDelimiter ":" contained
+hi def link tidyAutoBooleanOption Identifier
+hi def link tidyBooleanOption Identifier
+hi def link tidyCSSSelectorOption Identifier
+hi def link tidyDoctypeOption Identifier
+hi def link tidyEncodingOption Identifier
+hi def link tidyIntegerOption Identifier
+hi def link tidyNameOption Identifier
+hi def link tidyNewlineOption Identifier
+hi def link tidyTagsOption Identifier
+hi def link tidyRepeatOption Identifier
+hi def link tidySorterOption Identifier
+hi def link tidyStringOption Identifier
-syn match tidyNewTagAssignment "^new-\l\+-tags:\s*.*$" contains=tidyNewTagOption,tidyNewTagDelimiter,tidyNewTagValue,tidyDelimiter
-syn match tidyNewTagDelimiter "," contained
-syn match tidyNewTagValue "\<\w\+\>" contained
+hi def link tidyAutoBooleanDelimiter Special
+hi def link tidyBooleanDelimiter Special
+hi def link tidyCSSSelectorDelimiter Special
+hi def link tidyDoctypeDelimiter Special
+hi def link tidyEncodingDelimiter Special
+hi def link tidyIntegerDelimiter Special
+hi def link tidyNameDelimiter Special
+hi def link tidyNewlineDelimiter Special
+hi def link tidyTagsDelimiter Special
+hi def link tidyRepeatDelimiter Special
+hi def link tidySorterDelimiter Special
+hi def link tidyStringDelimiter Special
-syn case ignore
-syn keyword tidyBoolean t[rue] f[alse] y[es] n[o] contained
-syn case match
-syn match tidyDoctype "\<\%(omit\|auto\|strict\|loose\|transitional\|user\)\>" contained
-" NOTE: use match rather than keyword here so that tidyEncoding 'raw' does not
-" always have precedence over tidyOption 'raw'
-syn match tidyEncoding "\<\%(ascii\|latin0\|latin1\|raw\|utf8\|iso2022\|mac\|utf16le\|utf16be\|utf16\|win1252\|ibm858\|big5\|shiftjis\)\>" contained
-syn match tidyNewline "\<\%(LF\|CRLF\|CR\)\>"
-syn match tidyNumber "\<\d\+\>" contained
-syn match tidyRepeat "\<\%(keep-first\|keep-last\)\>" contained
-syn region tidyString start=+"+ skip=+\\\\\|\\"+ end=+"+ contained oneline
-syn region tidyString start=+'+ skip=+\\\\\|\\'+ end=+'+ contained oneline
-syn cluster tidyValue contains=tidyBoolean,tidyDoctype,tidyEncoding,tidyNewline,tidyNumber,tidyRepeat,tidyString
-
-syn match tidyOption "^accessibility-check" contained
-syn match tidyOption "^add-xml-decl" contained
-syn match tidyOption "^add-xml-pi" contained
-syn match tidyOption "^add-xml-space" contained
-syn match tidyOption "^alt-text" contained
-syn match tidyOption "^anchor-as-name" contained
-syn match tidyOption "^ascii-chars" contained
-syn match tidyOption "^assume-xml-procins" contained
-syn match tidyOption "^bare" contained
-syn match tidyOption "^break-before-br" contained
-syn match tidyOption "^char-encoding" contained
-syn match tidyOption "^clean" contained
-syn match tidyOption "^css-prefix" contained
-syn match tidyOption "^decorate-inferred-ul" contained
-syn match tidyOption "^doctype" contained
-syn match tidyOption "^doctype-mode" contained
-syn match tidyOption "^drop-empty-paras" contained
-syn match tidyOption "^drop-font-tags" contained
-syn match tidyOption "^drop-proprietary-attributes" contained
-syn match tidyOption "^enclose-block-text" contained
-syn match tidyOption "^enclose-text" contained
-syn match tidyOption "^error-file" contained
-syn match tidyOption "^escape-cdata" contained
-syn match tidyOption "^fix-backslash" contained
-syn match tidyOption "^fix-bad-comments" contained
-syn match tidyOption "^fix-uri" contained
-syn match tidyOption "^force-output" contained
-syn match tidyOption "^gnu-emacs" contained
-syn match tidyOption "^gnu-emacs-file" contained
-syn match tidyOption "^hide-comments" contained
-syn match tidyOption "^hide-endtags" contained
-syn match tidyOption "^indent" contained
-syn match tidyOption "^indent-attributes" contained
-syn match tidyOption "^indent-cdata" contained
-syn match tidyOption "^indent-spaces" contained
-syn match tidyOption "^input-encoding" contained
-syn match tidyOption "^input-xml" contained
-syn match tidyOption "^join-classes" contained
-syn match tidyOption "^join-styles" contained
-syn match tidyOption "^keep-time" contained
-syn match tidyOption "^language" contained
-syn match tidyOption "^literal-attributes" contained
-syn match tidyOption "^logical-emphasis" contained
-syn match tidyOption "^lower-literals" contained
-syn match tidyOption "^markup" contained
-syn match tidyOption "^merge-divs" contained
-syn match tidyOption "^merge-spans" contained
-syn match tidyOption "^ncr" contained
-syn match tidyOption "^newline" contained
-syn match tidyOption "^numeric-entities" contained
-syn match tidyOption "^output-bom" contained
-syn match tidyOption "^output-encoding" contained
-syn match tidyOption "^output-file" contained
-syn match tidyOption "^output-html" contained
-syn match tidyOption "^output-xhtml" contained
-syn match tidyOption "^output-xml" contained
-syn match tidyOption "^preserve-entities" contained
-syn match tidyOption "^punctuation-wrap" contained
-syn match tidyOption "^quiet" contained
-syn match tidyOption "^quote-ampersand" contained
-syn match tidyOption "^quote-marks" contained
-syn match tidyOption "^quote-nbsp" contained
-syn match tidyOption "^raw" contained
-syn match tidyOption "^repeated-attributes" contained
-syn match tidyOption "^replace-color" contained
-syn match tidyOption "^show-body-only" contained
-syn match tidyOption "^show-errors" contained
-syn match tidyOption "^show-warnings" contained
-syn match tidyOption "^slide-style" contained
-syn match tidyOption "^sort-attributes" contained
-syn match tidyOption "^split" contained
-syn match tidyOption "^tab-size" contained
-syn match tidyOption "^tidy-mark" contained
-syn match tidyOption "^uppercase-attributes" contained
-syn match tidyOption "^uppercase-tags" contained
-syn match tidyOption "^word-2000" contained
-syn match tidyOption "^wrap" contained
-syn match tidyOption "^wrap-asp" contained
-syn match tidyOption "^wrap-attributes" contained
-syn match tidyOption "^wrap-jste" contained
-syn match tidyOption "^wrap-php" contained
-syn match tidyOption "^wrap-script-literals" contained
-syn match tidyOption "^wrap-sections" contained
-syn match tidyOption "^write-back" contained
-syn match tidyOption "^vertical-space" contained
-
-syn match tidyNewTagOption "^new-blocklevel-tags" contained
-syn match tidyNewTagOption "^new-empty-tags" contained
-syn match tidyNewTagOption "^new-inline-tags" contained
-syn match tidyNewTagOption "^new-pre-tags" contained
-
-hi def link tidyBoolean Boolean
-hi def link tidyComment Comment
-hi def link tidyDelimiter Special
-hi def link tidyDoctype Constant
-hi def link tidyEncoding Constant
-hi def link tidyNewline Constant
-hi def link tidyNewTagDelimiter Special
-hi def link tidyNewTagOption Identifier
-hi def link tidyNewTagValue Constant
-hi def link tidyNumber Number
-hi def link tidyOption Identifier
-hi def link tidyRepeat Constant
-hi def link tidyString String
-hi def link tidyTodo Todo
+hi def link tidyAutoBoolean Boolean
+hi def link tidyBoolean Boolean
+hi def link tidyDoctype Constant
+hi def link tidyEncoding Constant
+hi def link tidyNewline Constant
+hi def link tidyTags Constant
+hi def link tidyNumber Number
+hi def link tidyRepeat Constant
+hi def link tidySorter Constant
+hi def link tidyString String
+
+hi def link tidyComment Comment
+hi def link tidyTodo Todo
let b:current_syntax = "tidy"
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
" vim: ts=8
diff --git a/runtime/syntax/tli.vim b/runtime/syntax/tli.vim
index 5685a6cbf2..b96d4a2119 100644
--- a/runtime/syntax/tli.vim
+++ b/runtime/syntax/tli.vim
@@ -4,11 +4,8 @@
" Last Change: 2001 May 10
" Version: 1.0
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -44,27 +41,17 @@ syn match tliComment "#.*"
syn case match
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_tli_syntax_inits")
- if version < 508
- let did_tli_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink tliNumber Number
- HiLink tliString String
- HiLink tliComment Comment
- HiLink tliSpecial SpecialChar
- HiLink tliIdentifier Identifier
- HiLink tliObject Statement
- HiLink tliField Type
- HiLink tliStyle PreProc
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link tliNumber Number
+hi def link tliString String
+hi def link tliComment Comment
+hi def link tliSpecial SpecialChar
+hi def link tliIdentifier Identifier
+hi def link tliObject Statement
+hi def link tliField Type
+hi def link tliStyle PreProc
+
let b:current_syntax = "tli"
diff --git a/runtime/syntax/tmux.vim b/runtime/syntax/tmux.vim
new file mode 100644
index 0000000000..62c0ce521a
--- /dev/null
+++ b/runtime/syntax/tmux.vim
@@ -0,0 +1,123 @@
+" Language: tmux(1) configuration file
+" Version: 2.7 (git-e4e060f2)
+" URL: https://github.com/ericpruitt/tmux.vim/
+" Maintainer: Eric Pruitt <eric.pruitt@gmail.com>
+" License: 2-Clause BSD (http://opensource.org/licenses/BSD-2-Clause)
+
+if exists("b:current_syntax")
+ finish
+endif
+
+" Explicitly change compatiblity options to Vim's defaults because this file
+" uses line continuations.
+let s:original_cpo = &cpo
+set cpo&vim
+
+let b:current_syntax = "tmux"
+syntax iskeyword @,48-57,_,192-255,-
+syntax case match
+
+syn keyword tmuxAction none any current other
+syn keyword tmuxBoolean off on
+
+syn keyword tmuxTodo FIXME NOTE TODO XXX contained
+
+syn match tmuxColour /\<colour[0-9]\+/ display
+syn match tmuxKey /\(C-\|M-\|\^\)\+\S\+/ display
+syn match tmuxNumber /\<\d\+\>/ display
+syn match tmuxFlags /\s-\a\+/ display
+syn match tmuxVariable /\w\+=/ display
+syn match tmuxVariableExpansion /\${\=\w\+}\=/ display
+
+syn region tmuxComment start=/#/ skip=/\\\@<!\\$/ end=/$/ contains=tmuxTodo
+
+syn region tmuxString start=+"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=tmuxFormatString
+syn region tmuxString start=+'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end='$' contains=tmuxFormatString
+
+" TODO: Figure out how escaping works inside of #(...) and #{...} blocks.
+syn region tmuxFormatString start=/#[#DFhHIPSTW]/ end=// contained keepend
+syn region tmuxFormatString start=/#{/ skip=/#{.\{-}}/ end=/}/ contained keepend
+syn region tmuxFormatString start=/#(/ skip=/#(.\{-})/ end=/)/ contained keepend
+
+hi def link tmuxFormatString Identifier
+hi def link tmuxAction Boolean
+hi def link tmuxBoolean Boolean
+hi def link tmuxCommands Keyword
+hi def link tmuxComment Comment
+hi def link tmuxKey Special
+hi def link tmuxNumber Number
+hi def link tmuxFlags Identifier
+hi def link tmuxOptions Function
+hi def link tmuxString String
+hi def link tmuxTodo Todo
+hi def link tmuxVariable Identifier
+hi def link tmuxVariableExpansion Identifier
+
+" Make the foreground of colourXXX keywords match the color they represent.
+" Darker colors have their background set to white.
+for s:i in range(0, 255)
+ let s:bg = (!s:i || s:i == 16 || (s:i > 231 && s:i < 235)) ? 15 : "none"
+ exec "syn match tmuxColour" . s:i . " /\\<colour" . s:i . "\\>/ display"
+\ " | highlight tmuxColour" . s:i . " ctermfg=" . s:i . " ctermbg=" . s:bg
+endfor
+
+syn keyword tmuxOptions
+\ buffer-limit command-alias default-terminal escape-time exit-empty
+\ activity-action assume-paste-time base-index bell-action default-command
+\ default-shell destroy-unattached detach-on-destroy
+\ display-panes-active-colour display-panes-colour display-panes-time
+\ display-time exit-unattached focus-events history-file history-limit
+\ key-table lock-after-time lock-command message-attr message-bg
+\ message-command-attr message-command-bg message-command-fg
+\ message-command-style message-fg message-limit message-style mouse
+\ aggressive-resize allow-rename alternate-screen automatic-rename
+\ automatic-rename-format clock-mode-colour clock-mode-style force-height
+\ force-width main-pane-height main-pane-width mode-attr mode-bg mode-fg
+\ mode-keys mode-style monitor-activity monitor-bell monitor-silence
+\ other-pane-height other-pane-width pane-active-border-bg
+\ pane-active-border-fg pane-active-border-style pane-base-index
+\ pane-border-bg pane-border-fg pane-border-format pane-border-status
+\ pane-border-style prefix prefix2 remain-on-exit renumber-windows
+\ repeat-time set-clipboard set-titles set-titles-string silence-action
+\ status status-attr status-bg status-fg status-interval status-justify
+\ status-keys status-left status-left-attr status-left-bg status-left-fg
+\ status-left-length status-left-style status-position status-right
+\ status-right-attr status-right-bg status-right-fg status-right-length
+\ status-right-style status-style synchronize-panes terminal-overrides
+\ update-environment user-keys visual-activity visual-bell visual-silence
+\ window-active-style window-status-activity-attr window-status-activity-bg
+\ window-status-activity-fg window-status-activity-style window-status-attr
+\ window-status-bell-attr window-status-bell-bg window-status-bell-fg
+\ window-status-bell-style window-status-bg window-status-current-attr
+\ window-status-current-bg window-status-current-fg
+\ window-status-current-format window-status-current-style window-status-fg
+\ window-status-format window-status-last-attr window-status-last-bg
+\ window-status-last-fg window-status-last-style window-status-separator
+\ window-status-style window-style word-separators wrap-search xterm-keys
+
+syn keyword tmuxCommands
+\ attach attach-session bind bind-key break-pane breakp capture-pane
+\ capturep choose-buffer choose-client choose-tree clear-history clearhist
+\ clock-mode command-prompt confirm confirm-before copy-mode detach
+\ detach-client display display-message display-panes displayp find-window
+\ findw if if-shell join-pane joinp kill-pane kill-server kill-session
+\ kill-window killp has-session has killw link-window linkw list-buffers
+\ list-clients list-commands list-keys list-panes list-sessions list-windows
+\ load-buffer loadb lock lock-client lock-server lock-session last-pane
+\ lastp lockc locks last-window last ls lsb delete-buffer deleteb lsc lscm
+\ lsk lsp lsw move-pane move-window movep movew new new-session new-window
+\ neww next next-layout next-window nextl paste-buffer pasteb pipe-pane
+\ pipep prev previous-layout previous-window prevl refresh refresh-client
+\ rename rename-session rename-window renamew resize-pane resizep
+\ respawn-pane respawn-window respawnp respawnw rotate-window rotatew run
+\ run-shell save-buffer saveb select-layout select-pane select-window
+\ selectl selectp selectw send send-keys send-prefix set set-buffer
+\ set-environment set-hook set-option set-window-option setb setenv setw
+\ show show-buffer show-environment show-hooks show-messages show-options
+\ show-window-options showb showenv showmsgs showw source source-file
+\ split-window splitw start start-server suspend-client suspendc swap-pane
+\ swap-window swapp swapw switch-client switchc unbind unbind-key
+\ unlink-window unlinkw wait wait-for
+
+let &cpo = s:original_cpo
+unlet! s:original_cpo s:bg s:i
diff --git a/runtime/syntax/tpp.vim b/runtime/syntax/tpp.vim
index 050a2ba78d..1244b97f08 100644
--- a/runtime/syntax/tpp.vim
+++ b/runtime/syntax/tpp.vim
@@ -17,11 +17,8 @@
" the latest version of this file.
" SPAM is _NOT_ welcome - be ready to be reported!
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -51,11 +48,7 @@ syn region tppAbstractOption start="^--\%(author\|title\|date\|footer\)" end="$"
if main_syntax != 'sh'
" shell command
- if version < 600
- syn include @tppShExec <sfile>:p:h/sh.vim
- else
- syn include @tppShExec syntax/sh.vim
- endif
+ syn include @tppShExec syntax/sh.vim
unlet b:current_syntax
syn region shExec matchgroup=tppPageLocalOptionKey start='^--exec *' keepend end='$' contains=@tppShExec
@@ -65,35 +58,25 @@ endif
syn match tppComment "^--##.*$"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_tpp_syn_inits")
- if version < 508
- let did_tpp_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink tppAbstractOptionKey Special
- HiLink tppPageLocalOptionKey Keyword
- HiLink tppPageLocalSwitchKey Keyword
- HiLink tppColorOptionKey Keyword
- HiLink tppTimeOptionKey Comment
- HiLink tppNewPageOptionKey PreProc
- HiLink tppString String
- HiLink tppColor String
- HiLink tppTime Number
- HiLink tppComment Comment
- HiLink tppAbstractOption Error
- HiLink tppPageLocalOption Error
- HiLink tppPageLocalSwitch Error
- HiLink tppColorOption Error
- HiLink tppNewPageOption Error
- HiLink tppTimeOption Error
+hi def link tppAbstractOptionKey Special
+hi def link tppPageLocalOptionKey Keyword
+hi def link tppPageLocalSwitchKey Keyword
+hi def link tppColorOptionKey Keyword
+hi def link tppTimeOptionKey Comment
+hi def link tppNewPageOptionKey PreProc
+hi def link tppString String
+hi def link tppColor String
+hi def link tppTime Number
+hi def link tppComment Comment
+hi def link tppAbstractOption Error
+hi def link tppPageLocalOption Error
+hi def link tppPageLocalSwitch Error
+hi def link tppColorOption Error
+hi def link tppNewPageOption Error
+hi def link tppTimeOption Error
- delcommand HiLink
-endif
let b:current_syntax = "tpp"
diff --git a/runtime/syntax/trasys.vim b/runtime/syntax/trasys.vim
index cfecc1c1fd..d52b5eeb47 100644
--- a/runtime/syntax/trasys.vim
+++ b/runtime/syntax/trasys.vim
@@ -8,11 +8,8 @@
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -21,11 +18,7 @@ endif
let fortran_free_source=1
" Load FORTRAN syntax file
-if version < 600
- source <sfile>:p:h/fortran.vim
-else
- runtime! syntax/fortran.vim
-endif
+runtime! syntax/fortran.vim
unlet b:current_syntax
@@ -136,40 +129,30 @@ syn sync match trasysSync grouphere trasysComment "^HEADER DOCUMENTATION DATA"
" Define the default highlighting
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_trasys_syntax_inits")
- if version < 508
- let did_trasys_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink trasysOptions Special
- HiLink trasysSurface Special
- HiLink trasysSurfaceType Constant
- HiLink trasysSurfaceArgs Constant
- HiLink trasysArgs Constant
- HiLink trasysOperations Statement
- HiLink trasysSubRoutine Statement
- HiLink trassyPrcsrSegm PreProc
- HiLink trasysIdentifier Identifier
- HiLink trasysComment Comment
- HiLink trasysHeader Typedef
- HiLink trasysMacro Macro
- HiLink trasysInteger Number
- HiLink trasysFloat Float
- HiLink trasysScientific Float
-
- HiLink trasysBlank SpecialChar
-
- HiLink trasysEndData Macro
-
- HiLink trasysTodo Todo
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link trasysOptions Special
+hi def link trasysSurface Special
+hi def link trasysSurfaceType Constant
+hi def link trasysSurfaceArgs Constant
+hi def link trasysArgs Constant
+hi def link trasysOperations Statement
+hi def link trasysSubRoutine Statement
+hi def link trassyPrcsrSegm PreProc
+hi def link trasysIdentifier Identifier
+hi def link trasysComment Comment
+hi def link trasysHeader Typedef
+hi def link trasysMacro Macro
+hi def link trasysInteger Number
+hi def link trasysFloat Float
+hi def link trasysScientific Float
+
+hi def link trasysBlank SpecialChar
+
+hi def link trasysEndData Macro
+
+hi def link trasysTodo Todo
+
let b:current_syntax = "trasys"
diff --git a/runtime/syntax/treetop.vim b/runtime/syntax/treetop.vim
index 921c5bea1d..60bbf26193 100644
--- a/runtime/syntax/treetop.vim
+++ b/runtime/syntax/treetop.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: Treetop
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2011-03-14
+" Language: Treetop
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2011-03-14
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/trustees.vim b/runtime/syntax/trustees.vim
index 4bc8874772..6c58d3983d 100644
--- a/runtime/syntax/trustees.vim
+++ b/runtime/syntax/trustees.vim
@@ -3,9 +3,8 @@
" Maintainer: Nima Talebi <nima@it.net.au>
" Last Change: 2005-10-12
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/tsalt.vim b/runtime/syntax/tsalt.vim
index 887d6b75e7..8dd2a24df9 100644
--- a/runtime/syntax/tsalt.vim
+++ b/runtime/syntax/tsalt.vim
@@ -4,11 +4,8 @@
" Last Change: 2012 Feb 03 by Thilo Six
" Version Info: @(#)tsalt.vim 1.5 97/12/16 08:11:15
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -171,46 +168,36 @@ syn sync ccomment tsaltComment
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_tsalt_syntax_inits")
- if version < 508
- let did_tsalt_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink tsaltFunction Statement
- HiLink tsaltSysVar Type
- "HiLink tsaltLibFunc UserDefFunc
- "HiLink tsaltConstants Type
- "HiLink tsaltFuncArg Type
- "HiLink tsaltOperator Operator
- "HiLink tsaltLabel Label
- "HiLink tsaltUserLabel Label
- HiLink tsaltConditional Conditional
- HiLink tsaltRepeat Repeat
- HiLink tsaltCharacter SpecialChar
- HiLink tsaltSpecialCharacter SpecialChar
- HiLink tsaltNumber Number
- HiLink tsaltFloat Float
- HiLink tsaltCommentError tsaltError
- HiLink tsaltInclude Include
- HiLink tsaltPreProc PreProc
- HiLink tsaltDefine Macro
- HiLink tsaltIncluded tsaltString
- HiLink tsaltError Error
- HiLink tsaltStatement Statement
- HiLink tsaltPreCondit PreCondit
- HiLink tsaltType Type
- HiLink tsaltString String
- HiLink tsaltComment Comment
- HiLink tsaltSpecial Special
- HiLink tsaltTodo Todo
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link tsaltFunction Statement
+hi def link tsaltSysVar Type
+"hi def link tsaltLibFunc UserDefFunc
+"hi def link tsaltConstants Type
+"hi def link tsaltFuncArg Type
+"hi def link tsaltOperator Operator
+"hi def link tsaltLabel Label
+"hi def link tsaltUserLabel Label
+hi def link tsaltConditional Conditional
+hi def link tsaltRepeat Repeat
+hi def link tsaltCharacter SpecialChar
+hi def link tsaltSpecialCharacter SpecialChar
+hi def link tsaltNumber Number
+hi def link tsaltFloat Float
+hi def link tsaltCommentError tsaltError
+hi def link tsaltInclude Include
+hi def link tsaltPreProc PreProc
+hi def link tsaltDefine Macro
+hi def link tsaltIncluded tsaltString
+hi def link tsaltError Error
+hi def link tsaltStatement Statement
+hi def link tsaltPreCondit PreCondit
+hi def link tsaltType Type
+hi def link tsaltString String
+hi def link tsaltComment Comment
+hi def link tsaltSpecial Special
+hi def link tsaltTodo Todo
+
let b:current_syntax = "tsalt"
diff --git a/runtime/syntax/tsscl.vim b/runtime/syntax/tsscl.vim
index 3fc18c6847..fd2a5e2ba9 100644
--- a/runtime/syntax/tsscl.vim
+++ b/runtime/syntax/tsscl.vim
@@ -8,11 +8,8 @@
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -179,37 +176,27 @@ syn match tssclScientific "-\=\<[0-9]*\.[0-9]*E[-+]\=[0-9]\+\>"
" Define the default highlighting
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_tsscl_syntax_inits")
- if version < 508
- let did_tsscl_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink tssclCommand Statement
- HiLink tssclKeyword Special
- HiLink tssclEnd Macro
- HiLink tssclUnits Special
-
- HiLink tssclComment Comment
- HiLink tssclDirective Statement
- HiLink tssclConditional Conditional
- HiLink tssclContChar Macro
- HiLink tssclQualifier Typedef
- HiLink tssclSymbol Identifier
- HiLink tssclSymbol2 Symbol
- HiLink tssclString String
- HiLink tssclOper Operator
-
- HiLink tssclInteger Number
- HiLink tssclFloat Number
- HiLink tssclScientific Number
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link tssclCommand Statement
+hi def link tssclKeyword Special
+hi def link tssclEnd Macro
+hi def link tssclUnits Special
+
+hi def link tssclComment Comment
+hi def link tssclDirective Statement
+hi def link tssclConditional Conditional
+hi def link tssclContChar Macro
+hi def link tssclQualifier Typedef
+hi def link tssclSymbol Identifier
+hi def link tssclSymbol2 Symbol
+hi def link tssclString String
+hi def link tssclOper Operator
+
+hi def link tssclInteger Number
+hi def link tssclFloat Number
+hi def link tssclScientific Number
+
let b:current_syntax = "tsscl"
diff --git a/runtime/syntax/tssgm.vim b/runtime/syntax/tssgm.vim
index b8182d48ea..8ca7962e81 100644
--- a/runtime/syntax/tssgm.vim
+++ b/runtime/syntax/tssgm.vim
@@ -8,11 +8,8 @@
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -75,35 +72,25 @@ syn match tssgmScientific "-\=\<[0-9]*\.[0-9]*E[-+]\=[0-9]\+\>"
" Define the default highlighting
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_tssgm_syntax_inits")
- if version < 508
- let did_tssgm_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink tssgmParam Statement
- HiLink tssgmSurfType Type
- HiLink tssgmArgs Special
- HiLink tssgmDelim Typedef
- HiLink tssgmEnd Macro
- HiLink tssgmUnits Special
-
- HiLink tssgmDefault SpecialComment
- HiLink tssgmComment Statement
- HiLink tssgmCommentString Comment
- HiLink tssgmSurfIdent Identifier
- HiLink tssgmString Delimiter
-
- HiLink tssgmInteger Number
- HiLink tssgmFloat Float
- HiLink tssgmScientific Float
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link tssgmParam Statement
+hi def link tssgmSurfType Type
+hi def link tssgmArgs Special
+hi def link tssgmDelim Typedef
+hi def link tssgmEnd Macro
+hi def link tssgmUnits Special
+
+hi def link tssgmDefault SpecialComment
+hi def link tssgmComment Statement
+hi def link tssgmCommentString Comment
+hi def link tssgmSurfIdent Identifier
+hi def link tssgmString Delimiter
+
+hi def link tssgmInteger Number
+hi def link tssgmFloat Float
+hi def link tssgmScientific Float
+
let b:current_syntax = "tssgm"
diff --git a/runtime/syntax/tssop.vim b/runtime/syntax/tssop.vim
index d416df054c..6a775b2358 100644
--- a/runtime/syntax/tssop.vim
+++ b/runtime/syntax/tssop.vim
@@ -8,11 +8,8 @@
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -56,30 +53,20 @@ syn match tssopScientific "-\=\<[0-9]*\.[0-9]*E[-+]\=[0-9]\+\>"
" Define the default highlighting
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_tssop_syntax_inits")
- if version < 508
- let did_tssop_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink tssopParam Statement
- HiLink tssopProp Identifier
- HiLink tssopArgs Special
-
- HiLink tssopComment Statement
- HiLink tssopCommentString Comment
- HiLink tssopPropName Typedef
-
- HiLink tssopInteger Number
- HiLink tssopFloat Float
- HiLink tssopScientific Float
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link tssopParam Statement
+hi def link tssopProp Identifier
+hi def link tssopArgs Special
+
+hi def link tssopComment Statement
+hi def link tssopCommentString Comment
+hi def link tssopPropName Typedef
+
+hi def link tssopInteger Number
+hi def link tssopFloat Float
+hi def link tssopScientific Float
+
let b:current_syntax = "tssop"
diff --git a/runtime/syntax/tt2.vim b/runtime/syntax/tt2.vim
index 5321e277da..6432b85a05 100644
--- a/runtime/syntax/tt2.vim
+++ b/runtime/syntax/tt2.vim
@@ -3,10 +3,10 @@
" Author: Moriki, Atsushi <4woods+vim@gmail.com>
" Homepage: http://github.com/vim-perl/vim-perl
" Bugs/requests: http://github.com/vim-perl/vim-perl/issues
-" Last Change: 2013-07-21
+" Last Change: 2015-04-25
"
-" Instration:
-" put tt2.vim and tt2html.vim in to your syntax diretory.
+" Installation:
+" put tt2.vim and tt2html.vim in to your syntax directory.
"
" add below in your filetype.vim.
" au BufNewFile,BufRead *.tt2 setf tt2
diff --git a/runtime/syntax/tutor.vim b/runtime/syntax/tutor.vim
index bce9189660..cb101ee9a7 100644
--- a/runtime/syntax/tutor.vim
+++ b/runtime/syntax/tutor.vim
@@ -15,7 +15,7 @@ syn match tutorURL /\(https\?\|file\):\/\/[[:graph:]]\+\>\/\?/
syn match tutorEmail /\<[[:graph:]]\+@[[:graph:]]\+\>/
syn match tutorInternalAnchor /\*[[:alnum:]-]\+\*/ contained conceal containedin=tutorSection
-syn match tutorSection /^#\{1,6}\s.\+$/ fold
+syn match tutorSection /^#\{1,6}\s.\+$/ fold contains=tutorInlineNormal
syn match tutorSectionBullet /#/ contained containedin=tutorSection
syn match tutorTOC /\ctable of contents:/
@@ -31,24 +31,18 @@ syn keyword tutorMarks TODO NOTE IMPORTANT TIP ATTENTION EXERCISE
syn keyword tutorMarks todo note tip attention exercise
syn keyword tutorMarks Todo Note Tip Excersise
-syn match tutorTextMark /\\\@<!--->/ conceal cchar=โ†’
-syn region tutorSampleText start=/^\(--->\)\@=/ end=/$/ keepend contains=@SPELL
-syn match tutorSampleTextMark /^--->/ contained containedin=tutorSampleText conceal cchar=โ†’
-syn match tutorSampleTextExpect /\}\@<! {expect:.\+}\s*$/ contained containedin=tutorSampleText conceal
-syn match tutorSampleTextExpect /|\@<! |expect:.\+|\s*$/ contained containedin=tutorSampleText conceal
-
syn region tutorCodeblock matchgroup=Delimiter start=/^\~\{3}.*$/ end=/^\~\{3}/
-syn region tutorShell matchgroup=Delimiter start=/^\~\{3} sh\s*$/ end=/^\~\{3}/ keepend contains=@TUTORSHELL concealends
+syn region tutorShell matchgroup=Delimiter start=/^\~\{3} sh\s*$/ end=/^\~\{3}/ keepend contains=@TUTORSHELL
syn match tutorShellPrompt /\(^\s*\)\@<=[$#]/ contained containedin=tutorShell
-syn region tutorInlineCode matchgroup=Delimiter start=/\\\@<!`/ end=/\\\@<!\(`{\@!\|`\s\)/ concealends
+syn region tutorInlineCode matchgroup=Delimiter start=/\\\@<!`/ end=/\\\@<!\(`{\@!\|`\s\)/
-syn region tutorCommand matchgroup=Delimiter start=/^\~\{3} cmd\( :\)\?\s*$/ end=/^\~\{3}/ keepend contains=@VIM concealends
-syn region tutorInlineCommand matchgroup=Delimiter start=/\\\@<!`\(.*{vim}\)\@=/ end=/\\\@<!`\({vim}\)\@=/ nextgroup=tutorInlineType contains=@VIM concealends
+syn region tutorCommand matchgroup=Delimiter start=/^\~\{3} cmd\( :\)\?\s*$/ end=/^\~\{3}/ keepend contains=@VIM
+syn region tutorInlineCommand matchgroup=Delimiter start=/\\\@<!`\(.*{vim}\)\@=/ end=/\\\@<!`\({vim}\)\@=/ nextgroup=tutorInlineType contains=@VIM
-syn region tutorNormal matchgroup=Delimiter start=/^\~\{3} norm\(al\?\)\?\s*$/ end=/^\~\{3}/ contains=@VIMNORMAL concealends
-syn region tutorInlineNormal matchgroup=Delimiter start=/\\\@<!`\(\S*{normal}\)\@=/ end=/\\\@<!`\({normal}\)\@=/ nextgroup=tutorInlineType contains=@VIMNORMAL concealends
+syn region tutorNormal matchgroup=Delimiter start=/^\~\{3} norm\(al\?\)\?\s*$/ end=/^\~\{3}/ contains=@VIMNORMAL
+syn region tutorInlineNormal matchgroup=Delimiter start=/\\\@<!`\(\S*{normal}\)\@=/ end=/\\\@<!`\({normal}\)\@=/ nextgroup=tutorInlineType contains=@VIMNORMAL
syn match tutorInlineType /{\(normal\|vim\)}/ contained conceal
@@ -72,7 +66,7 @@ hi! tutorMarks cterm=bold gui=bold
hi! tutorEmphasis gui=italic cterm=italic
hi! tutorBold gui=bold cterm=bold
-hi! link tutorSampleText Special
+hi! link tutorExpect Special
hi! tutorOK ctermfg=green guifg=#00ff88 cterm=bold gui=bold
hi! tutorX ctermfg=red guifg=#ff2000 cterm=bold gui=bold
hi! link tutorInlineOK tutorOK
diff --git a/runtime/syntax/uc.vim b/runtime/syntax/uc.vim
index 7eab1d48ae..90d33396c5 100644
--- a/runtime/syntax/uc.vim
+++ b/runtime/syntax/uc.vim
@@ -7,11 +7,8 @@
" Please check :help uc.vim for comments on some of the options available.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -110,64 +107,54 @@ endif
exec "syn sync ccomment ucComment minlines=" . uc_minlines
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_uc_syntax_inits")
- if version < 508
- let did_uc_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink ucFuncDef Conditional
- HiLink ucEventDef Conditional
- HiLink ucBraces Function
- HiLink ucBranch Conditional
- HiLink ucLabel Label
- HiLink ucUserLabel Label
- HiLink ucConditional Conditional
- HiLink ucRepeat Repeat
- HiLink ucStorageClass StorageClass
- HiLink ucMethodDecl ucStorageClass
- HiLink ucClassDecl ucStorageClass
- HiLink ucScopeDecl ucStorageClass
- HiLink ucBoolean Boolean
- HiLink ucSpecial Special
- HiLink ucSpecialError Error
- HiLink ucSpecialCharError Error
- HiLink ucString String
- HiLink ucCharacter Character
- HiLink ucSpecialChar SpecialChar
- HiLink ucNumber Number
- HiLink ucError Error
- HiLink ucStringError Error
- HiLink ucStatement Statement
- HiLink ucOperator Operator
- HiLink ucOverLoaded Operator
- HiLink ucComment Comment
- HiLink ucDocComment Comment
- HiLink ucLineComment Comment
- HiLink ucConstant ucBoolean
- HiLink ucTypedef Typedef
- HiLink ucTodo Todo
-
- HiLink ucCommentTitle SpecialComment
- HiLink ucDocTags Special
- HiLink ucDocParam Function
- HiLink ucCommentStar ucComment
-
- HiLink ucType Type
- HiLink ucExternal Include
-
- HiLink ucClassKeys Conditional
- HiLink ucClassLabel Conditional
-
- HiLink htmlComment Special
- HiLink htmlCommentPart Special
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link ucFuncDef Conditional
+hi def link ucEventDef Conditional
+hi def link ucBraces Function
+hi def link ucBranch Conditional
+hi def link ucLabel Label
+hi def link ucUserLabel Label
+hi def link ucConditional Conditional
+hi def link ucRepeat Repeat
+hi def link ucStorageClass StorageClass
+hi def link ucMethodDecl ucStorageClass
+hi def link ucClassDecl ucStorageClass
+hi def link ucScopeDecl ucStorageClass
+hi def link ucBoolean Boolean
+hi def link ucSpecial Special
+hi def link ucSpecialError Error
+hi def link ucSpecialCharError Error
+hi def link ucString String
+hi def link ucCharacter Character
+hi def link ucSpecialChar SpecialChar
+hi def link ucNumber Number
+hi def link ucError Error
+hi def link ucStringError Error
+hi def link ucStatement Statement
+hi def link ucOperator Operator
+hi def link ucOverLoaded Operator
+hi def link ucComment Comment
+hi def link ucDocComment Comment
+hi def link ucLineComment Comment
+hi def link ucConstant ucBoolean
+hi def link ucTypedef Typedef
+hi def link ucTodo Todo
+
+hi def link ucCommentTitle SpecialComment
+hi def link ucDocTags Special
+hi def link ucDocParam Function
+hi def link ucCommentStar ucComment
+
+hi def link ucType Type
+hi def link ucExternal Include
+
+hi def link ucClassKeys Conditional
+hi def link ucClassLabel Conditional
+
+hi def link htmlComment Special
+hi def link htmlCommentPart Special
+
let b:current_syntax = "uc"
diff --git a/runtime/syntax/udevconf.vim b/runtime/syntax/udevconf.vim
index a294604906..82fd81daf6 100644
--- a/runtime/syntax/udevconf.vim
+++ b/runtime/syntax/udevconf.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: udev(8) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: udev(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/udevperm.vim b/runtime/syntax/udevperm.vim
index 9d3af09d07..abda0b6663 100644
--- a/runtime/syntax/udevperm.vim
+++ b/runtime/syntax/udevperm.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: udev(8) permissions file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: udev(8) permissions file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/udevrules.vim b/runtime/syntax/udevrules.vim
index b04d728865..ce156ccc13 100644
--- a/runtime/syntax/udevrules.vim
+++ b/runtime/syntax/udevrules.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: udev(8) rules file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-12-18
+" Language: udev(8) rules file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-18
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/uil.vim b/runtime/syntax/uil.vim
index b5421bcfdb..088a0f6c86 100644
--- a/runtime/syntax/uil.vim
+++ b/runtime/syntax/uil.vim
@@ -1,13 +1,13 @@
" Vim syntax file
" Language: Motif UIL (User Interface Language)
" Maintainer: Thomas Koehler <jean-luc@picard.franken.de>
-" Last Change: 2013 May 23
+" Please be aware: I'm often slow to answer email due to a high
+" non-computer related workload (sometimes 4-8 weeks)
+" Last Change: 2016 September 6
" URL: http://gott-gehabt.de/800_wer_wir_sind/thomas/Homepage/Computer/vim/syntax/uil.vim
-" Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -47,37 +47,27 @@ syn region uilDefine start="^#\s*\(define\>\|undef\>\)" end="$" contains=uilLin
syn sync ccomment uilComment
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_uil_syn_inits")
- if version < 508
- let did_uil_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- " The default highlighting.
- HiLink uilCharacter uilString
- HiLink uilSpecialCharacter uilSpecial
- HiLink uilNumber uilString
- HiLink uilCommentError uilError
- HiLink uilInclude uilPreCondit
- HiLink uilDefine uilPreCondit
- HiLink uilIncluded uilString
- HiLink uilSpecialFunction uilRessource
- HiLink uilRessource Identifier
- HiLink uilSpecialStatement Keyword
- HiLink uilError Error
- HiLink uilPreCondit PreCondit
- HiLink uilType Type
- HiLink uilString String
- HiLink uilComment Comment
- HiLink uilSpecial Special
- HiLink uilTodo Todo
+" The default highlighting.
+hi def link uilCharacter uilString
+hi def link uilSpecialCharacter uilSpecial
+hi def link uilNumber uilString
+hi def link uilCommentError uilError
+hi def link uilInclude uilPreCondit
+hi def link uilDefine uilPreCondit
+hi def link uilIncluded uilString
+hi def link uilSpecialFunction uilRessource
+hi def link uilRessource Identifier
+hi def link uilSpecialStatement Keyword
+hi def link uilError Error
+hi def link uilPreCondit PreCondit
+hi def link uilType Type
+hi def link uilString String
+hi def link uilComment Comment
+hi def link uilSpecial Special
+hi def link uilTodo Todo
- delcommand HiLink
-endif
let b:current_syntax = "uil"
diff --git a/runtime/syntax/updatedb.vim b/runtime/syntax/updatedb.vim
index 7c082d62df..224a7dd2c2 100644
--- a/runtime/syntax/updatedb.vim
+++ b/runtime/syntax/updatedb.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: updatedb.conf(5) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2009-05-25
+" Language: updatedb.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2009-05-25
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/upstart.vim b/runtime/syntax/upstart.vim
index b3f2b9e637..140cd174e0 100644
--- a/runtime/syntax/upstart.vim
+++ b/runtime/syntax/upstart.vim
@@ -10,9 +10,8 @@
" It is inspired by the initng syntax file and includes sh.vim to do the
" highlighting of script blocks.
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/vb.vim b/runtime/syntax/vb.vim
index 0c05b35fbd..8ddb1efac3 100644
--- a/runtime/syntax/vb.vim
+++ b/runtime/syntax/vb.vim
@@ -11,11 +11,8 @@
" VIM and VIM-DEV mailing lists. It is by no means complete.
" Send comments, suggestions and requests to the maintainer.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -338,40 +335,30 @@ syn match vbTypeSpecifier "[a-zA-Z0-9][\$%&!#]"ms=s+1
syn match vbTypeSpecifier "#[a-zA-Z0-9]"me=e-1
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_vb_syntax_inits")
- if version < 508
- let did_vb_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink vbBoolean Boolean
- HiLink vbLineNumber Comment
- HiLink vbComment Comment
- HiLink vbConditional Conditional
- HiLink vbConst Constant
- HiLink vbDefine Constant
- HiLink vbError Error
- HiLink vbFunction Identifier
- HiLink vbIdentifier Identifier
- HiLink vbNumber Number
- HiLink vbFloat Float
- HiLink vbMethods PreProc
- HiLink vbOperator Operator
- HiLink vbRepeat Repeat
- HiLink vbString String
- HiLink vbStatement Statement
- HiLink vbKeyword Statement
- HiLink vbEvents Special
- HiLink vbTodo Todo
- HiLink vbTypes Type
- HiLink vbTypeSpecifier Type
+hi def link vbBoolean Boolean
+hi def link vbLineNumber Comment
+hi def link vbComment Comment
+hi def link vbConditional Conditional
+hi def link vbConst Constant
+hi def link vbDefine Constant
+hi def link vbError Error
+hi def link vbFunction Identifier
+hi def link vbIdentifier Identifier
+hi def link vbNumber Number
+hi def link vbFloat Float
+hi def link vbMethods PreProc
+hi def link vbOperator Operator
+hi def link vbRepeat Repeat
+hi def link vbString String
+hi def link vbStatement Statement
+hi def link vbKeyword Statement
+hi def link vbEvents Special
+hi def link vbTodo Todo
+hi def link vbTypes Type
+hi def link vbTypeSpecifier Type
- delcommand HiLink
-endif
let b:current_syntax = "vb"
diff --git a/runtime/syntax/vera.vim b/runtime/syntax/vera.vim
index b8e25cf346..b41c0a6cbf 100644
--- a/runtime/syntax/vera.vim
+++ b/runtime/syntax/vera.vim
@@ -10,11 +10,8 @@
" (change the value for guibg to any color you like)
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -287,74 +284,64 @@ endif
exec "syn sync ccomment veraComment minlines=" . b:vera_minlines
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_vera_syn_inits")
- if version < 508
- let did_vera_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
+
+hi def link veraClass Identifier
+hi def link veraObject Identifier
+hi def link veraUserMethod Function
+hi def link veraTask Keyword
+hi def link veraModifier Tag
+hi def link veraDeprecated veraError
+hi def link veraMethods Statement
+" hi def link veraInterface Label
+hi def link veraInterface Function
+
+hi def link veraFormat veraSpecial
+hi def link veraCppString veraString
+hi def link veraCommentL veraComment
+hi def link veraCommentStart veraComment
+hi def link veraLabel Label
+hi def link veraUserLabel Label
+hi def link veraConditional Conditional
+hi def link veraRepeat Repeat
+hi def link veraCharacter Character
+hi def link veraSpecialCharacter veraSpecial
+hi def link veraNumber Number
+hi def link veraOctal Number
+hi def link veraOctalZero PreProc " link this to Error if you want
+hi def link veraFloat Float
+hi def link veraOctalError veraError
+hi def link veraParenError veraError
+hi def link veraErrInParen veraError
+hi def link veraErrInBracket veraError
+hi def link veraCommentError veraError
+hi def link veraCommentStartError veraError
+hi def link veraSpaceError SpaceError
+hi def link veraSpecialError veraError
+hi def link veraOperator Operator
+hi def link veraStructure Structure
+hi def link veraInclude Include
+hi def link veraPreProc PreProc
+hi def link veraDefine Macro
+hi def link veraIncluded veraString
+hi def link veraError Error
+hi def link veraStatement Statement
+hi def link veraPreCondit PreCondit
+hi def link veraType Type
+" hi def link veraConstant Constant
+hi def link veraConstant Keyword
+hi def link veraUserConstant Constant
+hi def link veraCommentString veraString
+hi def link veraComment2String veraString
+hi def link veraCommentSkip veraComment
+hi def link veraString String
+hi def link veraComment Comment
+hi def link veraSpecial SpecialChar
+hi def link veraTodo Todo
+hi def link veraCppSkip veraCppOut
+hi def link veraCppOut2 veraCppOut
+hi def link veraCppOut Comment
- HiLink veraClass Identifier
- HiLink veraObject Identifier
- HiLink veraUserMethod Function
- HiLink veraTask Keyword
- HiLink veraModifier Tag
- HiLink veraDeprecated veraError
- HiLink veraMethods Statement
- " HiLink veraInterface Label
- HiLink veraInterface Function
-
- HiLink veraFormat veraSpecial
- HiLink veraCppString veraString
- HiLink veraCommentL veraComment
- HiLink veraCommentStart veraComment
- HiLink veraLabel Label
- HiLink veraUserLabel Label
- HiLink veraConditional Conditional
- HiLink veraRepeat Repeat
- HiLink veraCharacter Character
- HiLink veraSpecialCharacter veraSpecial
- HiLink veraNumber Number
- HiLink veraOctal Number
- HiLink veraOctalZero PreProc " link this to Error if you want
- HiLink veraFloat Float
- HiLink veraOctalError veraError
- HiLink veraParenError veraError
- HiLink veraErrInParen veraError
- HiLink veraErrInBracket veraError
- HiLink veraCommentError veraError
- HiLink veraCommentStartError veraError
- HiLink veraSpaceError SpaceError
- HiLink veraSpecialError veraError
- HiLink veraOperator Operator
- HiLink veraStructure Structure
- HiLink veraInclude Include
- HiLink veraPreProc PreProc
- HiLink veraDefine Macro
- HiLink veraIncluded veraString
- HiLink veraError Error
- HiLink veraStatement Statement
- HiLink veraPreCondit PreCondit
- HiLink veraType Type
- " HiLink veraConstant Constant
- HiLink veraConstant Keyword
- HiLink veraUserConstant Constant
- HiLink veraCommentString veraString
- HiLink veraComment2String veraString
- HiLink veraCommentSkip veraComment
- HiLink veraString String
- HiLink veraComment Comment
- HiLink veraSpecial SpecialChar
- HiLink veraTodo Todo
- HiLink veraCppSkip veraCppOut
- HiLink veraCppOut2 veraCppOut
- HiLink veraCppOut Comment
-
- delcommand HiLink
-endif
let b:current_syntax = "vera"
diff --git a/runtime/syntax/verilog.vim b/runtime/syntax/verilog.vim
index f4d21d0739..bbaca491a7 100644
--- a/runtime/syntax/verilog.vim
+++ b/runtime/syntax/verilog.vim
@@ -3,22 +3,15 @@
" Maintainer: Mun Johl <Mun.Johl@emulex.com>
" Last Update: Wed Jul 20 16:04:19 PDT 2011
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" Set the local value of the 'iskeyword' option.
" NOTE: '?' was added so that verilogNumber would be processed correctly when
" '?' is the last character of the number.
-if version >= 600
- setlocal iskeyword=@,48-57,63,_,192-255
-else
- set iskeyword=@,48-57,63,_,192-255
-endif
+setlocal iskeyword=@,48-57,63,_,192-255
" A bunch of useful Verilog keywords
@@ -102,34 +95,24 @@ syn region verilogDirective start="//\s*\$s dc_script_begin\>" end="//\s*\$s
syn sync minlines=50
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_verilog_syn_inits")
- if version < 508
- let did_verilog_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default highlighting.
- HiLink verilogCharacter Character
- HiLink verilogConditional Conditional
- HiLink verilogRepeat Repeat
- HiLink verilogString String
- HiLink verilogTodo Todo
- HiLink verilogComment Comment
- HiLink verilogConstant Constant
- HiLink verilogLabel Label
- HiLink verilogNumber Number
- HiLink verilogOperator Special
- HiLink verilogStatement Statement
- HiLink verilogGlobal Define
- HiLink verilogDirective SpecialComment
- HiLink verilogEscape Special
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+" The default highlighting.
+hi def link verilogCharacter Character
+hi def link verilogConditional Conditional
+hi def link verilogRepeat Repeat
+hi def link verilogString String
+hi def link verilogTodo Todo
+hi def link verilogComment Comment
+hi def link verilogConstant Constant
+hi def link verilogLabel Label
+hi def link verilogNumber Number
+hi def link verilogOperator Special
+hi def link verilogStatement Statement
+hi def link verilogGlobal Define
+hi def link verilogDirective SpecialComment
+hi def link verilogEscape Special
+
let b:current_syntax = "verilog"
diff --git a/runtime/syntax/verilogams.vim b/runtime/syntax/verilogams.vim
index d16e4bffb4..7551b681a8 100644
--- a/runtime/syntax/verilogams.vim
+++ b/runtime/syntax/verilogams.vim
@@ -9,20 +9,13 @@
" Minor reserved keyword updates.
" Last Update: Thursday September 15 15:36:03 CST 2005
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" Set the local value of the 'iskeyword' option
-if version >= 600
- setlocal iskeyword=@,48-57,_,192-255
-else
- set iskeyword=@,48-57,_,192-255
-endif
+setlocal iskeyword=@,48-57,_,192-255
" Annex B.1 'All keywords'
syn keyword verilogamsStatement above abs absdelay acos acosh ac_stim
@@ -113,36 +106,26 @@ syn match verilogamsEscape "\\\o\o\=\o\=" contained
syn sync lines=50
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_verilogams_syn_inits")
- if version < 508
- let did_verilogams_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- " The default highlighting.
- HiLink verilogamsCharacter Character
- HiLink verilogamsConditional Conditional
- HiLink verilogamsRepeat Repeat
- HiLink verilogamsString String
- HiLink verilogamsTodo Todo
- HiLink verilogamsComment Comment
- HiLink verilogamsConstant Constant
- HiLink verilogamsLabel Label
- HiLink verilogamsNumber Number
- HiLink verilogamsOperator Special
- HiLink verilogamsStatement Statement
- HiLink verilogamsGlobal Define
- HiLink verilogamsDirective SpecialComment
- HiLink verilogamsEscape Special
- HiLink verilogamsType Type
- HiLink verilogamsSystask Function
+" The default highlighting.
+hi def link verilogamsCharacter Character
+hi def link verilogamsConditional Conditional
+hi def link verilogamsRepeat Repeat
+hi def link verilogamsString String
+hi def link verilogamsTodo Todo
+hi def link verilogamsComment Comment
+hi def link verilogamsConstant Constant
+hi def link verilogamsLabel Label
+hi def link verilogamsNumber Number
+hi def link verilogamsOperator Special
+hi def link verilogamsStatement Statement
+hi def link verilogamsGlobal Define
+hi def link verilogamsDirective SpecialComment
+hi def link verilogamsEscape Special
+hi def link verilogamsType Type
+hi def link verilogamsSystask Function
- delcommand HiLink
-endif
let b:current_syntax = "verilogams"
diff --git a/runtime/syntax/vhdl.vim b/runtime/syntax/vhdl.vim
index 32503823ee..efcb840284 100644
--- a/runtime/syntax/vhdl.vim
+++ b/runtime/syntax/vhdl.vim
@@ -3,11 +3,10 @@
" Maintainer: Daniel Kho <daniel.kho@tauhop.com>
" Previous Maintainer: Czo <Olivier.Sirol@lip6.fr>
" Credits: Stephan Hegel <stephan.hegel@snc.siemens.com.cn>
-" Last Changed: 2016 Mar 05 by Daniel Kho
+" Last Changed: 2018 May 06 by Daniel Kho
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -44,6 +43,8 @@ syn keyword vhdlStatement sequence strong
syn keyword vhdlStatement then to transport type
syn keyword vhdlStatement unaffected units until use
syn keyword vhdlStatement variable
+" VHDL-2017 interface
+syn keyword vhdlStatement view
syn keyword vhdlStatement vmode vprop vunit
syn keyword vhdlStatement wait when while with
syn keyword vhdlStatement note warning error failure
@@ -70,9 +71,7 @@ syn match vhdlType "\<time_vector\>\'\="
syn match vhdlType "\<character\>\'\="
syn match vhdlType "\<string\>\'\="
-"syn keyword vhdlType severity_level
-syn keyword vhdlType line
-syn keyword vhdlType text
+syn keyword vhdlType line text side width
" Predefined standard IEEE VHDL types
syn match vhdlType "\<std_ulogic\>\'\="
@@ -125,6 +124,8 @@ syn match vhdlAttribute "\'succ"
syn match vhdlAttribute "\'val"
syn match vhdlAttribute "\'image"
syn match vhdlAttribute "\'value"
+" VHDL-2017 interface attribute
+syn match vhdlAttribute "\'converse"
syn keyword vhdlBoolean true false
@@ -166,6 +167,9 @@ syn match vhdlOperator "=\|\/=\|>\|<\|>="
syn match vhdlOperator "<=\|:="
syn match vhdlOperator "=>"
+" VHDL-2017 concurrent signal association (spaceship) operator
+syn match vhdlOperator "<=>"
+
" VHDL-2008 conversion, matching equality/non-equality operators
syn match vhdlOperator "??\|?=\|?\/=\|?<\|?<=\|?>\|?>="
@@ -184,8 +188,11 @@ syn match vhdlError "\(<\)[&+\-\/\\]\+"
syn match vhdlError "[>=&+\-\/\\]\+\(<\)"
" Covers most operators
" support negative sign after operators. E.g. q<=-b;
-syn match vhdlError "\(&\|+\|\-\|\*\*\|\/=\|??\|?=\|?\/=\|?<=\|?>=\|>=\|<=\|:=\|=>\)[<>=&+\*\\?:]\+"
-syn match vhdlError "[<>=&+\-\*\\:]\+\(&\|+\|\*\*\|\/=\|??\|?=\|?\/=\|?<\|?<=\|?>\|?>=\|>=\|<=\|:=\|=>\)"
+" Supports VHDL-2017 spaceship (concurrent simple signal association).
+syn match vhdlError "\(<=\)[<=&+\*\\?:]\+"
+syn match vhdlError "[>=&+\-\*\\:]\+\(=>\)"
+syn match vhdlError "\(&\|+\|\-\|\*\*\|\/=\|??\|?=\|?\/=\|?<=\|?>=\|>=\|:=\|=>\)[<>=&+\*\\?:]\+"
+syn match vhdlError "[<>=&+\-\*\\:]\+\(&\|+\|\*\*\|\/=\|??\|?=\|?\/=\|?<\|?<=\|?>\|?>=\|>=\|<=\|:=\)"
syn match vhdlError "\(?<\|?>\)[<>&+\*\/\\?:]\+"
syn match vhdlError "\(<<\|>>\)[<>&+\*\/\\?:]\+"
@@ -234,35 +241,25 @@ syn match vhdlPreProc "\(^\|\s\)--\s*synopsys\s\+translate_\(on\|off\)\s*"
syn sync minlines=600
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_vhdl_syntax_inits")
- if version < 508
- let did_vhdl_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink vhdlSpecial Special
- HiLink vhdlStatement Statement
- HiLink vhdlCharacter Character
- HiLink vhdlString String
- HiLink vhdlVector Number
- HiLink vhdlBoolean Number
- HiLink vhdlTodo Todo
- HiLink vhdlFixme Fixme
- HiLink vhdlComment Comment
- HiLink vhdlNumber Number
- HiLink vhdlTime Number
- HiLink vhdlType Type
- HiLink vhdlOperator Operator
- HiLink vhdlError Error
- HiLink vhdlAttribute Special
- HiLink vhdlPreProc PreProc
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link vhdlSpecial Special
+hi def link vhdlStatement Statement
+hi def link vhdlCharacter Character
+hi def link vhdlString String
+hi def link vhdlVector Number
+hi def link vhdlBoolean Number
+hi def link vhdlTodo Todo
+hi def link vhdlFixme Fixme
+hi def link vhdlComment Comment
+hi def link vhdlNumber Number
+hi def link vhdlTime Number
+hi def link vhdlType Type
+hi def link vhdlOperator Operator
+hi def link vhdlError Error
+hi def link vhdlAttribute Special
+hi def link vhdlPreProc PreProc
+
let b:current_syntax = "vhdl"
diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim
index cf51830b68..444b6d8d17 100644
--- a/runtime/syntax/vim.vim
+++ b/runtime/syntax/vim.vim
@@ -1,9 +1,12 @@
" Vim syntax file
-" Language: Vim 7.4 script
-" Maintainer: Charles E. Campbell <NdrOchipS@PcampbellAfamily.Mbiz>
-" Last Change: Apr 02, 2015
-" Version: 7.4-33
-" Automatically generated keyword lists: {{{1
+
+" #############################################################################
+" #############################################################################
+" Note: Be careful when merging the upstream version of this file.
+" Much of this is generated by scripts/genvimvim.lua
+" (installs to $VIMRUNTIME/syntax/vim/generated.vim)
+" #############################################################################
+" #############################################################################
" Quit when a syntax file was already loaded {{{2
if exists("b:current_syntax")
@@ -18,7 +21,7 @@ syn keyword vimTodo contained COMBAK FIXME TODO XXX
syn cluster vimCommentGroup contains=vimTodo,@Spell
" Special and plugin vim commands {{{2
-syn match vimCommand contained "\<z[-+^.=]\="
+syn match vimCommand contained "\<z[-+^.=]\=\>"
syn keyword vimOnlyCommand contained fix[del] op[en] sh[ell] P[rint]
syn keyword vimStdPlugin contained DiffOrig Man N[ext] S TOhtml XMLent XMLns
@@ -31,8 +34,8 @@ syn keyword vimOnlyOption contained nobiosk nobioskey noconsk noconskey nocp noc
" Invertible setting variants
syn keyword vimOnlyOption contained invbiosk invbioskey invconsk invconskey invcp invcompatible invguipty invmacatsui invsn invshortname invta invtextauto invtx invtextmode invtf invttyfast invtbi invttybuiltin invwiv invweirdinvert
" termcap codes (which can also be set) {{{2
-syn keyword vimTermOption contained t_AB t_al t_bc t_ce t_cl t_Co t_Cs t_CS t_CV t_da t_db t_dl t_DL t_EI t_F1 t_F2 t_F3 t_F4 t_F5 t_F6 t_F7 t_F8 t_F9 t_fs t_IE t_IS t_k1 t_K1 t_k2 t_k3 t_K3 t_k4 t_K4 t_k5 t_K5 t_k6 t_K6 t_k7 t_K7 t_k8 t_K8 t_k9 t_K9 t_KA t_kb t_kB t_KB t_KC t_kd t_kD t_KD t_ke t_KE t_KF t_KG t_kh t_KH t_kI t_KI t_KJ t_KK t_kl t_KL t_kN t_kP t_kr t_ks t_ku t_le t_mb t_md t_me t_mr t_ms t_nd t_op t_RI t_RV t_Sb t_se t_Sf t_SI t_so t_sr t_te t_ti t_ts t_u7 t_ue t_us t_ut t_vb t_ve t_vi t_vs t_WP t_WS t_xs t_ZH t_ZR
-syn keyword vimTermOption contained t_AF t_AL t_cd t_Ce t_cm t_cs
+syn keyword vimTermOption contained t_8b t_AB t_al t_bc t_ce t_cl t_Co t_Cs t_CV t_db t_DL t_F1 t_F2 t_F3 t_F4 t_F5 t_F6 t_F7 t_F8 t_F9 t_fs t_IE t_IS t_k1 t_K1 t_k2 t_k3 t_K3 t_k4 t_K4 t_k5 t_K5 t_k6 t_K6 t_k7 t_K7 t_k8 t_K8 t_k9 t_K9 t_KA t_kb t_kB t_KB t_KC t_kd t_kD t_KD t_ke t_KE t_KF t_KG t_kh t_KH t_kI t_KI t_KJ t_KK t_kl t_KL t_kN t_kP t_kr t_ks t_ku t_le t_mb t_md t_me t_mr t_ms t_nd t_op t_RB t_RI t_RV t_Sb t_se t_Sf t_SI t_so t_sr t_SR t_te t_ti t_ts t_u7 t_ue t_us t_ut t_vb t_ve t_vi t_vs t_WP t_WS t_xn t_xs t_ZH t_ZR
+syn keyword vimTermOption contained t_8f t_AF t_AL t_cd t_Ce t_cm t_cs t_CS t_da t_dl t_EI
syn match vimTermOption contained "t_%1"
syn match vimTermOption contained "t_#2"
syn match vimTermOption contained "t_#4"
@@ -50,14 +53,67 @@ syn case ignore
syn keyword vimGroup contained Comment Constant String Character Number Boolean Float Identifier Function Statement Conditional Repeat Label Operator Keyword Exception PreProc Include Define Macro PreCondit Type StorageClass Structure Typedef Special SpecialChar Tag Delimiter SpecialComment Debug Underlined Ignore Error Todo
" Default highlighting groups {{{2
-syn keyword vimHLGroup contained ColorColumn Cursor CursorColumn CursorIM CursorLine CursorLineNr DiffAdd DiffChange DiffDelete DiffText Directory ErrorMsg FoldColumn Folded IncSearch LineNr MatchParen Menu ModeMsg MoreMsg NonText Normal Pmenu PmenuSbar PmenuSel PmenuThumb Question Scrollbar Search SignColumn SpecialKey SpellBad SpellCap SpellLocal SpellRare StatusLine StatusLineNC TabLine TabLineFill TabLineSel Title Tooltip VertSplit Visual WarningMsg WildMenu
+syn keyword vimHLGroup contained ColorColumn Cursor CursorColumn CursorIM CursorLine CursorLineNr DiffAdd DiffChange DiffDelete DiffText Directory EndOfBuffer ErrorMsg FoldColumn Folded IncSearch LineNr MatchParen Menu ModeMsg MoreMsg NonText Normal Pmenu PmenuSbar PmenuSel PmenuThumb Question Scrollbar Search SignColumn SpecialKey SpellBad SpellCap SpellLocal SpellRare StatusLine StatusLineNC TabLine TabLineFill TabLineSel Title Tooltip VertSplit Visual WarningMsg WildMenu
syn match vimHLGroup contained "Conceal"
syn keyword vimOnlyHLGroup contained VisualNOS
-syn keyword nvimHLGroup contained EndOfBuffer TermCursor TermCursorNC
+syn keyword nvimHLGroup contained Substitute TermCursor TermCursorNC QuickFixLine
"}}}2
syn case match
" Special Vim Highlighting (not automatic) {{{1
+" Set up folding commands
+if exists("g:vimsyn_folding") && g:vimsyn_folding =~# '[aflmpPrt]'
+ if g:vimsyn_folding =~# 'a'
+ com! -nargs=* VimFolda <args> fold
+ else
+ com! -nargs=* VimFolda <args>
+ endif
+ if g:vimsyn_folding =~# 'f'
+ com! -nargs=* VimFoldf <args> fold
+ else
+ com! -nargs=* VimFoldf <args>
+ endif
+ if g:vimsyn_folding =~# 'l'
+ com! -nargs=* VimFoldl <args> fold
+ else
+ com! -nargs=* VimFoldl <args>
+ endif
+ if g:vimsyn_folding =~# 'm'
+ com! -nargs=* VimFoldm <args> fold
+ else
+ com! -nargs=* VimFoldm <args>
+ endif
+ if g:vimsyn_folding =~# 'p'
+ com! -nargs=* VimFoldp <args> fold
+ else
+ com! -nargs=* VimFoldp <args>
+ endif
+ if g:vimsyn_folding =~# 'P'
+ com! -nargs=* VimFoldP <args> fold
+ else
+ com! -nargs=* VimFoldP <args>
+ endif
+ if g:vimsyn_folding =~# 'r'
+ com! -nargs=* VimFoldr <args> fold
+ else
+ com! -nargs=* VimFoldr <args>
+ endif
+ if g:vimsyn_folding =~# 't'
+ com! -nargs=* VimFoldt <args> fold
+ else
+ com! -nargs=* VimFoldt <args>
+ endif
+else
+ com! -nargs=* VimFolda <args>
+ com! -nargs=* VimFoldf <args>
+ com! -nargs=* VimFoldl <args>
+ com! -nargs=* VimFoldm <args>
+ com! -nargs=* VimFoldp <args>
+ com! -nargs=* VimFoldP <args>
+ com! -nargs=* VimFoldr <args>
+ com! -nargs=* VimFoldt <args>
+endif
+
" commands not picked up by the generator (due to non-standard format)
syn keyword vimCommand contained py3
@@ -72,26 +128,35 @@ if exists("g:vimsyntax_noerror")
let g:vimsyn_noerror= g:vimsyntax_noerror
endif
+" Variable options {{{2
+if exists("g:vim_maxlines")
+ let s:vimsyn_maxlines= g:vim_maxlines
+else
+ let s:vimsyn_maxlines= 60
+endif
+
" Numbers {{{2
" =======
-syn match vimNumber "\<\d\+\%(\.\d\+\%([eE][+-]\=\d\+\)\=\)\=" skipwhite nextgroup=vimGlobal,vimSubst,vimCommand
-syn match vimNumber "-\d\+\%(\.\d\+\%([eE][+-]\=\d\+\)\=\)\=" skipwhite nextgroup=vimGlobal,vimSubst,vimCommand
-syn match vimNumber "\<0[xX]\x\+"
-syn match vimNumber "\%(^\|[^a-zA-Z]\)\zs#\x\{6}"
+syn match vimNumber "\<\d\+\%(\.\d\+\%([eE][+-]\=\d\+\)\=\)\=" skipwhite nextgroup=vimGlobal,vimSubst,vimCommand,vimComment
+syn match vimNumber "-\d\+\%(\.\d\+\%([eE][+-]\=\d\+\)\=\)\=" skipwhite nextgroup=vimGlobal,vimSubst,vimCommand,vimComment
+syn match vimNumber "\<0[xX]\x\+" skipwhite nextgroup=vimGlobal,vimSubst,vimCommand,vimComment
+syn match vimNumber "\%(^\|\A\)\zs#\x\{6}" skipwhite nextgroup=vimGlobal,vimSubst,vimCommand,vimComment
" All vimCommands are contained by vimIsCommands. {{{2
-syn match vimCmdSep "[:|]\+" skipwhite nextgroup=vimAddress,vimAutoCmd,vimCommand,vimIsCommand,vimExtCmd,vimFilter,vimLet,vimMap,vimMark,vimSet,vimSyntax,vimUserCmd,vimOnlyCommand
-syn match vimIsCommand "\<\h\w*\>" contains=vimCommand,vimOnlyCommand
-syn match vimVar contained "\<\h[a-zA-Z0-9#_]*\>"
-syn match vimVar "\<[bwglsav]:\h[a-zA-Z0-9#_]*\>"
-syn match vimFBVar contained "\<[bwglsav]:\h[a-zA-Z0-9#_]*\>"
+syn match vimCmdSep "[:|]\+" skipwhite nextgroup=vimAddress,vimAutoCmd,vimEcho,vimIsCommand,vimExtCmd,vimFilter,vimLet,vimMap,vimMark,vimSet,vimSyntax,vimUserCmd
+syn match vimIsCommand "\<\h\w*\>" contains=vimCommand
+syn match vimVar contained "\<\h[a-zA-Z0-9#_]*\>"
+syn match vimVar "\<[bwglstav]:\h[a-zA-Z0-9#_]*\>"
+syn match vimVar "\s\zs&\a\+\>"
+syn match vimFBVar contained "\<[bwglstav]:\h[a-zA-Z0-9#_]*\>"
syn keyword vimCommand contained in
" Insertions And Appends: insert append {{{2
" =======================
-syn region vimInsert matchgroup=vimCommand start="^[: \t]*\(\d\+\(,\d\+\)\=\)\=a\%[ppend]$" matchgroup=vimCommand end="^\.$""
-syn region vimInsert matchgroup=vimCommand start="^[: \t]*\(\d\+\(,\d\+\)\=\)\=c\%[hange]$" matchgroup=vimCommand end="^\.$""
-syn region vimInsert matchgroup=vimCommand start="^[: \t]*\(\d\+\(,\d\+\)\=\)\=i\%[nsert]$" matchgroup=vimCommand end="^\.$""
+syn region vimInsert matchgroup=vimCommand start="^[: \t]*\(\d\+\(,\d\+\)\=\)\=a\%[ppend]$" matchgroup=vimCommand end="^\.$""
+syn region vimInsert matchgroup=vimCommand start="^[: \t]*\(\d\+\(,\d\+\)\=\)\=c\%[hange]$" matchgroup=vimCommand end="^\.$""
+syn region vimInsert matchgroup=vimCommand start="^[: \t]*\(\d\+\(,\d\+\)\=\)\=i\%[nsert]$" matchgroup=vimCommand end="^\.$""
+syn region vimInsert matchgroup=vimCommand start="^[: \t]*\(\d\+\(,\d\+\)\=\)\=starti\%[nsert]$" matchgroup=vimCommand end="^\.$""
" Behave! {{{2
" =======
@@ -112,11 +177,11 @@ syn keyword vimFTOption contained detect indent off on plugin
" Augroup : vimAugroupError removed because long augroups caused sync'ing problems. {{{2
" ======= : Trade-off: Increasing synclines with slower editing vs augroup END error checking.
-syn cluster vimAugroupList contains=vimAugroup,vimIsCommand,vimCommand,vimUserCmd,vimExecute,vimNotFunc,vimFuncName,vimFunction,vimFunctionError,vimLineComment,vimMap,vimSpecFile,vimOper,vimNumber,vimOperParen,vimComment,vimString,vimSubst,vimMark,vimRegister,vimAddress,vimFilter,vimCmplxRepeat,vimComment,vimLet,vimSet,vimAutoCmd,vimRegion,vimSynLine,vimNotation,vimCtrlChar,vimFuncVar,vimContinue
-if exists("g:vimsyn_folding") && g:vimsyn_folding =~ 'a'
+syn cluster vimAugroupList contains=vimAugroup,vimIsCommand,vimCommand,vimUserCmd,vimExecute,vimNotFunc,vimFuncName,vimFunction,vimFunctionError,vimLineComment,vimMap,vimSpecFile,vimOper,vimNumber,vimOperParen,vimComment,vimString,vimSubst,vimMark,vimRegister,vimAddress,vimFilter,vimCmplxRepeat,vimComment,vimLet,vimSet,vimAutoCmd,vimRegion,vimSynLine,vimNotation,vimCtrlChar,vimFuncVar,vimContinue,vimSetEqual,vimOption
+if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'a'
syn region vimAugroup fold matchgroup=vimAugroupKey start="\<aug\%[roup]\>\ze\s\+\K\k*" end="\<aug\%[roup]\>\ze\s\+[eE][nN][dD]\>" contains=vimAutoCmd,@vimAugroupList
else
- syn region vimAugroup matchgroup=vimAugroupKey start="\<aug\%[roup]\>\ze\s\+\K\k*" end="\<aug\%[roup]\>\ze\s\+[eE][nN][dD]\>" contains=vimAutoCmd,@vimAugroupList
+ syn region vimAugroup matchgroup=vimAugroupKey start="\<aug\%[roup]\>\ze\s\+\K\k*" end="\<aug\%[roup]\>\ze\s\+[eE][nN][dD]\>" contains=vimAutoCmd,@vimAugroupList
endif
syn match vimAugroup "aug\%[roup]!" contains=vimAugroupKey
if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_noaugrouperror")
@@ -127,10 +192,11 @@ syn keyword vimAugroupKey contained aug[roup]
" Operators: {{{2
" =========
syn cluster vimOperGroup contains=vimEnvvar,vimFunc,vimFuncVar,vimOper,vimOperParen,vimNumber,vimString,vimRegister,vimContinue
-syn match vimOper "\(==\|!=\|>=\|<=\|=\~\|!\~\|>\|<\|=\)[?#]\{0,2}" skipwhite nextgroup=vimString,vimSpecFile
-syn match vimOper "||\|&&\|[-+.]" skipwhite nextgroup=vimString,vimSpecFile
+syn match vimOper "\%#=1\(==\|!=\|>=\|<=\|=\~\|!\~\|>\|<\|=\)[?#]\{0,2}" skipwhite nextgroup=vimString,vimSpecFile
+syn match vimOper "\(\<is\>\|\<isnot\>\)[?#]\{0,2}" skipwhite nextgroup=vimString,vimSpecFile
+syn match vimOper "||\|&&\|[-+.]" skipwhite nextgroup=vimString,vimSpecFile
syn region vimOperParen matchgroup=vimParenSep start="(" end=")" contains=@vimOperGroup
-syn region vimOperParen matchgroup=vimSep start="{" end="}" contains=@vimOperGroup nextgroup=vimVar,vimFuncVar
+syn region vimOperParen matchgroup=vimSep start="{" end="}" contains=@vimOperGroup nextgroup=vimVar,vimFuncVar
if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_noopererror")
syn match vimOperError ")"
endif
@@ -138,10 +204,10 @@ endif
" Functions : Tag is provided for those who wish to highlight tagged functions {{{2
" =========
syn cluster vimFuncList contains=vimCommand,vimFunctionError,vimFuncKey,Tag,vimFuncSID
-syn cluster vimFuncBodyList contains=vimAbb,vimAddress,vimAugroupKey,vimAutoCmd,vimCmplxRepeat,vimComment,vimComment,vimContinue,vimCtrlChar,vimEcho,vimEchoHL,vimExecute,vimIf,vimIsCommand,vimFBVar,vimFunc,vimFunction,vimFuncVar,vimGlobal,vimHighlight,vimIsCommand,vimLet,vimLineComment,vimMap,vimMark,vimNorm,vimNotation,vimNotFunc,vimNumber,vimOper,vimOperParen,vimRegion,vimRegister,vimSet,vimSpecFile,vimString,vimSubst,vimSynLine,vimUnmap,vimUserCommand,nvimUnmap,nvimMap
+syn cluster vimFuncBodyList contains=vimAbb,vimAddress,vimAugroupKey,vimAutoCmd,vimCmplxRepeat,vimComment,vimContinue,vimCtrlChar,vimEcho,vimEchoHL,vimExecute,vimIsCommand,vimFBVar,vimFunc,vimFunction,vimFuncVar,vimGlobal,vimHighlight,vimIsCommand,vimLet,vimLineComment,vimMap,vimMark,vimNorm,vimNotation,vimNotFunc,vimNumber,vimOper,vimOperParen,vimRegion,vimRegister,vimSearch,vimSet,vimSpecFile,vimString,vimSubst,vimSynLine,vimUnmap,vimUserCommand
syn match vimFunction "\<fu\%[nction]!\=\s\+\%(<[sS][iI][dD]>\|[sSgGbBwWtTlL]:\)\=\%(\i\|[#.]\|{.\{-1,}}\)*\ze\s*(" contains=@vimFuncList nextgroup=vimFuncBody
-if exists("g:vimsyn_folding") && g:vimsyn_folding =~ 'f'
+if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'f'
syn region vimFuncBody contained fold start="\ze\s*(" matchgroup=vimCommand end="\<\(endf\>\|endfu\%[nction]\>\)" contains=@vimFuncBodyList
else
syn region vimFuncBody contained start="\ze\s*(" matchgroup=vimCommand end="\<\(endf\>\|endfu\%[nction]\>\)" contains=@vimFuncBodyList
@@ -182,7 +248,7 @@ if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_nousercmderror")
endif
syn case ignore
syn keyword vimUserAttrbKey contained bar ban[g] cou[nt] ra[nge] com[plete] n[args] re[gister]
-syn keyword vimUserAttrbCmplt contained augroup buffer color command compiler cscope dir environment event expression file file_in_path filetype function help highlight locale mapping menu option shellcmd sign syntax tag tag_listfiles var
+syn keyword vimUserAttrbCmplt contained augroup buffer behave color command compiler cscope dir environment event expression file file_in_path filetype function help highlight history locale mapping menu option packadd shellcmd sign syntax syntime tag tag_listfiles user var
syn keyword vimUserAttrbCmplt contained custom customlist nextgroup=vimUserAttrbCmpltFunc,vimUserCmdError
syn match vimUserAttrbCmpltFunc contained ",\%([sS]:\|<[sS][iI][dD]>\)\=\%(\h\w*\%(#\h\w*\)\+\|\h\w*\)"hs=s+1 nextgroup=vimUserCmdError
@@ -211,8 +277,8 @@ syn region vimPatSepZone oneline contained matchgroup=vimPatSepZ start="\\%\
syn region vimPatRegion contained transparent matchgroup=vimPatSepR start="\\[z%]\=(" end="\\)" contains=@vimSubstList oneline
syn match vimNotPatSep contained "\\\\"
syn cluster vimStringGroup contains=vimEscapeBrace,vimPatSep,vimNotPatSep,vimPatSepErr,vimPatSepZone,@Spell
-syn region vimString oneline keepend start=+[^:a-zA-Z>!\\@]"+lc=1 skip=+\\\\\|\\"+ end=+"+ contains=@vimStringGroup
-syn region vimString oneline keepend start=+[^:a-zA-Z>!\\@]'+lc=1 end=+'+
+syn region vimString oneline keepend start=+[^a-zA-Z>!\\@]"+lc=1 skip=+\\\\\|\\"+ matchgroup=vimStringEnd end=+"+ contains=@vimStringGroup
+syn region vimString oneline keepend start=+[^a-zA-Z>!\\@]'+lc=1 end=+'+
syn region vimString oneline start=+=!+lc=1 skip=+\\\\\|\\!+ end=+!+ contains=@vimStringGroup
syn region vimString oneline start="=+"lc=1 skip="\\\\\|\\+" end="+" contains=@vimStringGroup
syn region vimString oneline start="\s/\s*\A"lc=1 skip="\\\\\|\\+" end="/" contains=@vimStringGroup
@@ -224,15 +290,17 @@ syn match vimStringCont contained +\(\\\\\|.\)\{-}[^\\]"+
syn cluster vimSubstList contains=vimPatSep,vimPatRegion,vimPatSepErr,vimSubstTwoBS,vimSubstRange,vimNotation
syn cluster vimSubstRepList contains=vimSubstSubstr,vimSubstTwoBS,vimNotation
syn cluster vimSubstList add=vimCollection
-syn match vimSubst "\(:\+\s*\|^\s*\||\s*\)\<\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)[:[:alpha:]]\@!" nextgroup=vimSubstPat
-syn match vimSubst "s\%[ubstitute][:#[:alpha:]]\@!" nextgroup=vimSubstPat contained
-syn match vimSubst "/\zss\%[ubstitute]\ze/" nextgroup=vimSubstPat
-syn match vimSubst1 contained "s\%[ubstitute]\>" nextgroup=vimSubstPat
+syn match vimSubst "\(:\+\s*\|^\s*\||\s*\)\<\%(\<s\%[ubstitute]\>\|\<sm\%[agic]\>\|\<sno\%[magic]\>\)[:#[:alpha:]]\@!" nextgroup=vimSubstPat
+syn match vimSubst "\%(^\|[^\\]\)\<s\%[ubstitute]\>[:#[:alpha:]]\@!" nextgroup=vimSubstPat contained
+syn match vimSubst "/\zs\<s\%[ubstitute]\>\ze/" nextgroup=vimSubstPat
+syn match vimSubst "\(:\+\s*\|^\s*\)s\ze#.\{-}#.\{-}#" nextgroup=vimSubstPat
+syn match vimSubst1 contained "\<s\%[ubstitute]\>" nextgroup=vimSubstPat
+syn match vimSubst2 contained "s\%[ubstitute]\>" nextgroup=vimSubstPat
syn region vimSubstPat contained matchgroup=vimSubstDelim start="\z([^a-zA-Z( \t[\]&]\)"rs=s+1 skip="\\\\\|\\\z1" end="\z1"re=e-1,me=e-1 contains=@vimSubstList nextgroup=vimSubstRep4 oneline
syn region vimSubstRep4 contained matchgroup=vimSubstDelim start="\z(.\)" skip="\\\\\|\\\z1" end="\z1" matchgroup=vimNotation end="<[cC][rR]>" contains=@vimSubstRepList nextgroup=vimSubstFlagErr oneline
syn region vimCollection contained transparent start="\\\@<!\[" skip="\\\[" end="\]" contains=vimCollClass
syn match vimCollClassErr contained "\[:.\{-\}:\]"
-syn match vimCollClass contained transparent "\[:\(alnum\|alpha\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|xdigit\|return\|tab\|escape\|backspace\):\]"
+syn match vimCollClass contained transparent "\%#=1\[:\(alnum\|alpha\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|xdigit\|return\|tab\|escape\|backspace\):\]"
syn match vimSubstSubstr contained "\\z\=\d"
syn match vimSubstTwoBS contained "\\\\"
syn match vimSubstFlagErr contained "[^< \t\r|]\+" contains=vimSubstFlags
@@ -247,7 +315,7 @@ syn match vimMark "'[<>]\ze[-+,!]" nextgroup=vimOper,vimMarkNumber,vimSubst
syn match vimMark ",\zs'[<>]\ze" nextgroup=vimOper,vimMarkNumber,vimSubst
syn match vimMark "[!,:]\zs'[a-zA-Z0-9]" nextgroup=vimOper,vimMarkNumber,vimSubst
syn match vimMark "\<norm\%[al]\s\zs'[a-zA-Z0-9]" nextgroup=vimOper,vimMarkNumber,vimSubst
-syn match vimMarkNumber "[-+]\d\+" nextgroup=vimSubst contained contains=vimOper
+syn match vimMarkNumber "[-+]\d\+" contained contains=vimOper nextgroup=vimSubst2
syn match vimPlainMark contained "'[a-zA-Z0-9]"
syn match vimRegister '[^,;[{: \t]\zs"[a-zA-Z0-9.%#:_\-/]\ze[^a-zA-Z_":0-9]'
@@ -267,9 +335,9 @@ syn match vimCmplxRepeat '[^a-zA-Z_/\\()]q[0-9a-zA-Z"]\>'lc=1
syn match vimCmplxRepeat '@[0-9a-z".=@:]\ze\($\|[^a-zA-Z]\>\)'
" Set command and associated set-options (vimOptions) with comment {{{2
-syn region vimSet matchgroup=vimCommand start="\<\%(setl\%[ocal]\|setg\%[lobal]\|se\%[t]\)\>" skip="\%(\\\\\)*\\." end="$" matchgroup=vimNotation end="<[cC][rR]>" keepend oneline contains=vimSetEqual,vimOption,vimErrSetting,vimComment,vimSetString,vimSetMod,vimTermOption,vimOnlyOption
-syn region vimSetEqual contained start="[=:]\|[-+^]=" skip="\\\\\|\\\s" end="[| \t]\|$"me=e-1 contains=vimCtrlChar,vimSetSep,vimNotation,vimEnvvar oneline
-syn region vimSetString contained start=+="+hs=s+1 skip=+\\\\\|\\"+ end=+"+ contains=vimCtrlChar
+syn region vimSet matchgroup=vimCommand start="\<\%(setl\%[ocal]\|setg\%[lobal]\|se\%[t]\)\>" skip="\%(\\\\\)*\\." end="$" end="|" matchgroup=vimNotation end="<[cC][rR]>" keepend oneline contains=vimSetEqual,vimOption,vimErrSetting,vimComment,vimSetString,vimSetMod
+syn region vimSetEqual contained start="[=:]\|[-+^]=" skip="\\\\\|\\\s" end="[| \t]\|$"me=e-1 contains=vimCtrlChar,vimSetSep,vimNotation,vimEnvvar oneline
+syn region vimSetString contained start=+="+hs=s+1 skip=+\\\\\|\\"+ end=+"+ contains=vimCtrlChar
syn match vimSetSep contained "[,:]" skipwhite nextgroup=vimCommand
syn match vimSetMod contained "&vim\=\|[!&?<]\|all&"
@@ -307,7 +375,7 @@ syn keyword vimUnmap cu[nmap] iu[nmap] lu[nmap] nun[map] ou[nmap] sunm[ap] unm[
syn keyword nvimUnmap tunm[ap] skipwhite nextgroup=vimMapBang,vimMapMod,vimMapLhs
syn match vimMapLhs contained "\S\+" contains=vimNotation,vimCtrlChar skipwhite nextgroup=vimMapRhs
syn match vimMapBang contained "!" skipwhite nextgroup=vimMapMod,vimMapLhs
-syn match vimMapMod contained "\c<\(buffer\|expr\|\(local\)\=leader\|nowait\|plug\|script\|sid\|unique\|silent\)\+>" contains=vimMapModKey,vimMapModErr skipwhite nextgroup=vimMapMod,vimMapLhs
+syn match vimMapMod contained "\%#=1\c<\(buffer\|expr\|\(local\)\=leader\|nowait\|plug\|script\|sid\|unique\|silent\)\+>" contains=vimMapModKey,vimMapModErr skipwhite nextgroup=vimMapMod,vimMapLhs
syn match vimMapRhs contained ".*" contains=vimNotation,vimCtrlChar skipnl nextgroup=vimMapRhsExtend
syn match vimMapRhsExtend contained "^\s*\\.*$" contains=vimContinue
syn case ignore
@@ -329,27 +397,27 @@ syn match vimMenuBang "!" contained skipwhite nextgroup=@vimMenuList
" Angle-Bracket Notation (tnx to Michael Geddes) {{{2
" ======================
syn case ignore
-syn match vimNotation "\(\\\|<lt>\)\=<\([scamd]-\)\{0,4}x\=\(f\d\{1,2}\|[^ \t:]\|cr\|lf\|linefeed\|return\|k\=del\%[ete]\|bs\|backspace\|tab\|esc\|right\|left\|help\|undo\|insert\|ins\|k\=home\|k\=end\|kplus\|kminus\|kdivide\|kmultiply\|kenter\|kpoint\|space\|k\=\(page\)\=\(\|down\|up\|k\d\>\)\)>" contains=vimBracket
-syn match vimNotation "\(\\\|<lt>\)\=<\([scam2-4]-\)\{0,4}\(right\|left\|middle\)\(mouse\)\=\(drag\|release\)\=>" contains=vimBracket
-syn match vimNotation "\(\\\|<lt>\)\=<\(bslash\|plug\|sid\|space\|bar\|nop\|nul\|lt\)>" contains=vimBracket
-syn match vimNotation '\(\\\|<lt>\)\=<C-R>[0-9a-z"%#:.\-=]'he=e-1 contains=vimBracket
-syn match vimNotation '\(\\\|<lt>\)\=<\%(q-\)\=\(line[12]\|count\|bang\|reg\|args\|f-args\|lt\)>' contains=vimBracket
-syn match vimNotation "\(\\\|<lt>\)\=<\([cas]file\|abuf\|amatch\|cword\|cWORD\|client\)>" contains=vimBracket
+syn match vimNotation "\%#=1\(\\\|<lt>\)\=<\([scamd]-\)\{0,4}x\=\(f\d\{1,2}\|[^ \t:]\|cmd\|cr\|lf\|linefeed\|return\|k\=del\%[ete]\|bs\|backspace\|tab\|esc\|right\|left\|help\|undo\|insert\|ins\|mouse\|k\=home\|k\=end\|kplus\|kminus\|kdivide\|kmultiply\|kenter\|kpoint\|space\|k\=\(page\)\=\(\|down\|up\|k\d\>\)\)>" contains=vimBracket
+syn match vimNotation "\%#=1\(\\\|<lt>\)\=<\([scam2-4]-\)\{0,4}\(right\|left\|middle\)\(mouse\)\=\(drag\|release\)\=>" contains=vimBracket
+syn match vimNotation "\%#=1\(\\\|<lt>\)\=<\(bslash\|plug\|sid\|space\|bar\|nop\|nul\|lt\)>" contains=vimBracket
+syn match vimNotation '\(\\\|<lt>\)\=<C-R>[0-9a-z"%#:.\-=]'he=e-1 contains=vimBracket
+syn match vimNotation '\%#=1\(\\\|<lt>\)\=<\%(q-\)\=\(line[12]\|count\|bang\|reg\|args\|mods\|f-args\|f-mods\|lt\)>' contains=vimBracket
+syn match vimNotation "\%#=1\(\\\|<lt>\)\=<\([cas]file\|abuf\|amatch\|cword\|cWORD\|client\)>" contains=vimBracket
syn match vimBracket contained "[\\<>]"
syn case match
" User Function Highlighting {{{2
" (following Gautam Iyer's suggestion)
" ==========================
-syn match vimFunc "\%(\%([sSgGbBwWtTlL]:\|<[sS][iI][dD]>\)\=\%([a-zA-Z0-9_.]\+\.\)*\I[a-zA-Z0-9_.]*\)\ze\s*(" contains=vimFuncName,vimUserFunc,vimExecute
-syn match vimUserFunc contained "\%(\%([sSgGbBwWtTlL]:\|<[sS][iI][dD]>\)\=\%([a-zA-Z0-9_.]\+\.\)*\I[a-zA-Z0-9_.]*\)\|\<\u[a-zA-Z0-9.]*\>\|\<if\>" contains=vimNotation
+syn match vimFunc "\%(\%([sSgGbBwWtTlL]:\|<[sS][iI][dD]>\)\=\%(\w\+\.\)*\I[a-zA-Z0-9_.]*\)\ze\s*(" contains=vimFuncName,vimUserFunc,vimExecute
+syn match vimUserFunc contained "\%(\%([sSgGbBwWtTlL]:\|<[sS][iI][dD]>\)\=\%(\w\+\.\)*\I[a-zA-Z0-9_.]*\)\|\<\u[a-zA-Z0-9.]*\>\|\<if\>" contains=vimNotation
syn match vimNotFunc "\<if\>\|\<el\%[seif]\>\|\<return\>\|\<while\>"
" Errors And Warnings: {{{2
" ====================
if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimfunctionerror")
syn match vimFunctionError "\s\zs[a-z0-9]\i\{-}\ze\s*(" contained contains=vimFuncKey,vimFuncBlank
-" syn match vimFunctionError "\s\zs\%(<[sS][iI][dD]>\|[sSgGbBwWtTlL]:\)[0-9]\i\{-}\ze\s*(" contained contains=vimFuncKey,vimFuncBlank
+" syn match vimFunctionError "\s\zs\%(<[sS][iI][dD]>\|[sSgGbBwWtTlL]:\)\d\i\{-}\ze\s*(" contained contains=vimFuncKey,vimFuncBlank
syn match vimElseIfErr "\<else\s\+if\>"
syn match vimBufnrWarn /\<bufnr\s*(\s*["']\.['"]\s*)/
endif
@@ -388,11 +456,16 @@ syn keyword vimSynType contained clear skipwhite nextgroup=vimGroupList
" Syntax: cluster {{{2
syn keyword vimSynType contained cluster skipwhite nextgroup=vimClusterName
-syn region vimClusterName contained matchgroup=vimGroupName start="\k\+" skip="\\\\\|\\|" matchgroup=vimSep end="$\||" contains=vimGroupAdd,vimGroupRem,vimSynContains,vimSynError
+syn region vimClusterName contained matchgroup=vimGroupName start="\h\w*" skip="\\\\\|\\|" matchgroup=vimSep end="$\||" contains=vimGroupAdd,vimGroupRem,vimSynContains,vimSynError
syn match vimGroupAdd contained "add=" nextgroup=vimGroupList
syn match vimGroupRem contained "remove=" nextgroup=vimGroupList
syn cluster vimFuncBodyList add=vimSynType,vimGroupAdd,vimGroupRem
+" Syntax: iskeyword {{{2
+syn keyword vimSynType contained iskeyword skipwhite nextgroup=vimIskList
+syn match vimIskList contained '\S\+' contains=vimIskSep
+syn match vimIskSep contained ','
+
" Syntax: include {{{2
syn keyword vimSynType contained include skipwhite nextgroup=vimGroupList
syn cluster vimFuncBodyList add=vimSynType
@@ -400,15 +473,15 @@ syn cluster vimFuncBodyList add=vimSynType
" Syntax: keyword {{{2
syn cluster vimSynKeyGroup contains=vimSynNextgroup,vimSynKeyOpt,vimSynKeyContainedin
syn keyword vimSynType contained keyword skipwhite nextgroup=vimSynKeyRegion
-syn region vimSynKeyRegion contained oneline keepend matchgroup=vimGroupName start="\k\+" skip="\\\\\|\\|" matchgroup=vimSep end="|\|$" contains=@vimSynKeyGroup
-syn match vimSynKeyOpt contained "\<\(conceal\|contained\|transparent\|skipempty\|skipwhite\|skipnl\)\>"
+syn region vimSynKeyRegion contained oneline keepend matchgroup=vimGroupName start="\h\w*" skip="\\\\\|\\|" matchgroup=vimSep end="|\|$" contains=@vimSynKeyGroup
+syn match vimSynKeyOpt contained "\%#=1\<\(conceal\|contained\|transparent\|skipempty\|skipwhite\|skipnl\)\>"
syn cluster vimFuncBodyList add=vimSynType
" Syntax: match {{{2
syn cluster vimSynMtchGroup contains=vimMtchComment,vimSynContains,vimSynError,vimSynMtchOpt,vimSynNextgroup,vimSynRegPat,vimNotation
syn keyword vimSynType contained match skipwhite nextgroup=vimSynMatchRegion
-syn region vimSynMatchRegion contained keepend matchgroup=vimGroupName start="\k\+" matchgroup=vimSep end="|\|$" contains=@vimSynMtchGroup
-syn match vimSynMtchOpt contained "\<\(conceal\|transparent\|contained\|excludenl\|skipempty\|skipwhite\|display\|extend\|skipnl\|fold\)\>"
+syn region vimSynMatchRegion contained keepend matchgroup=vimGroupName start="\h\w*" matchgroup=vimSep end="|\|$" contains=@vimSynMtchGroup
+syn match vimSynMtchOpt contained "\%#=1\<\(conceal\|transparent\|contained\|excludenl\|keepend\|skipempty\|skipwhite\|display\|extend\|skipnl\|fold\)\>"
if has("conceal")
syn match vimSynMtchOpt contained "\<cchar=" nextgroup=vimSynMtchCchar
syn match vimSynMtchCchar contained "\S"
@@ -422,13 +495,13 @@ syn keyword vimSynType contained enable list manual off on reset
syn cluster vimSynRegPatGroup contains=vimPatSep,vimNotPatSep,vimSynPatRange,vimSynNotPatRange,vimSubstSubstr,vimPatRegion,vimPatSepErr,vimNotation
syn cluster vimSynRegGroup contains=vimSynContains,vimSynNextgroup,vimSynRegOpt,vimSynReg,vimSynMtchGrp
syn keyword vimSynType contained region skipwhite nextgroup=vimSynRegion
-syn region vimSynRegion contained keepend matchgroup=vimGroupName start="\k\+" skip="\\\\\|\\|" end="|\|$" contains=@vimSynRegGroup
-syn match vimSynRegOpt contained "\<\(conceal\(ends\)\=\|transparent\|contained\|excludenl\|skipempty\|skipwhite\|display\|keepend\|oneline\|extend\|skipnl\|fold\)\>"
+syn region vimSynRegion contained keepend matchgroup=vimGroupName start="\h\w*" skip="\\\\\|\\|" end="|\|$" contains=@vimSynRegGroup
+syn match vimSynRegOpt contained "\%#=1\<\(conceal\(ends\)\=\|transparent\|contained\|excludenl\|skipempty\|skipwhite\|display\|keepend\|oneline\|extend\|skipnl\|fold\)\>"
syn match vimSynReg contained "\(start\|skip\|end\)="he=e-1 nextgroup=vimSynRegPat
syn match vimSynMtchGrp contained "matchgroup=" nextgroup=vimGroup,vimHLGroup,vimOnlyHLGroup,nvimHLGroup
syn region vimSynRegPat contained extend start="\z([-`~!@#$%^&*_=+;:'",./?]\)" skip="\\\\\|\\\z1" end="\z1" contains=@vimSynRegPatGroup skipwhite nextgroup=vimSynPatMod,vimSynReg
-syn match vimSynPatMod contained "\(hs\|ms\|me\|hs\|he\|rs\|re\)=[se]\([-+]\d\+\)\="
-syn match vimSynPatMod contained "\(hs\|ms\|me\|hs\|he\|rs\|re\)=[se]\([-+]\d\+\)\=," nextgroup=vimSynPatMod
+syn match vimSynPatMod contained "\%#=1\(hs\|ms\|me\|hs\|he\|rs\|re\)=[se]\([-+]\d\+\)\="
+syn match vimSynPatMod contained "\%#=1\(hs\|ms\|me\|hs\|he\|rs\|re\)=[se]\([-+]\d\+\)\=," nextgroup=vimSynPatMod
syn match vimSynPatMod contained "lc=\d\+"
syn match vimSynPatMod contained "lc=\d\+," nextgroup=vimSynPatMod
syn region vimSynPatRange contained start="\[" skip="\\\\\|\\]" end="]"
@@ -448,9 +521,9 @@ syn keyword vimSyncRegion contained region skipwhite nextgroup=vimSynReg
syn match vimSyncLinebreak contained "\<linebreaks=" skipwhite nextgroup=vimNumber
syn keyword vimSyncLinecont contained linecont skipwhite nextgroup=vimSynRegPat
syn match vimSyncLines contained "\(min\|max\)\=lines=" nextgroup=vimNumber
-syn match vimSyncGroupName contained "\k\+" skipwhite nextgroup=vimSyncKey
+syn match vimSyncGroupName contained "\h\w*" skipwhite nextgroup=vimSyncKey
syn match vimSyncKey contained "\<groupthere\|grouphere\>" skipwhite nextgroup=vimSyncGroup
-syn match vimSyncGroup contained "\k\+" skipwhite nextgroup=vimSynRegPat,vimSyncNone
+syn match vimSyncGroup contained "\h\w*" skipwhite nextgroup=vimSynRegPat,vimSyncNone
syn keyword vimSyncNone contained NONE
" Additional IsCommand, here by reasons of precedence {{{2
@@ -461,14 +534,14 @@ syn match vimIsCommand "<Bar>\s*\a\+" transparent contains=vimCommand,vimNotatio
" ============
syn cluster vimHighlightCluster contains=vimHiLink,vimHiClear,vimHiKeyList,vimComment
if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimhictermerror")
- syn match vimHiCtermError contained "[^0-9]\i*"
+ syn match vimHiCtermError contained "\D\i*"
endif
syn match vimHighlight "\<hi\%[ghlight]\>" skipwhite nextgroup=vimHiBang,@vimHighlightCluster
syn match vimHiBang contained "!" skipwhite nextgroup=@vimHighlightCluster
syn match vimHiGroup contained "\i\+"
syn case ignore
-syn keyword vimHiAttrib contained none bold inverse italic reverse standout underline undercurl
+syn keyword vimHiAttrib contained none bold inverse italic nocombine reverse standout strikethrough underline undercurl
syn keyword vimFgBgAttrib contained none bg background fg foreground
syn case match
syn match vimHiAttribList contained "\i\+" contains=vimHiAttrib
@@ -502,7 +575,9 @@ syn match vimHiNmbr contained '\d\+'
syn keyword vimHiClear contained clear nextgroup=vimHiGroup
" Highlight: link {{{2
-syn region vimHiLink contained oneline matchgroup=vimCommand start="\(\<hi\%[ghlight]\s\+\)\@<=\(\(def\%[ault]\s\+\)\=link\>\|\<def\>\)" end="$" contains=vimHiGroup,vimGroup,vimHLGroup,vimNotation,vimOnlyHLGroup,nvimHLGroup
+" see tst24 (hi def vs hi) (Jul 06, 2018)
+"syn region vimHiLink contained oneline matchgroup=vimCommand start="\(\<hi\%[ghlight]\s\+\)\@<=\(\(def\%[ault]\s\+\)\=link\>\|\<def\>\)" end="$" contains=vimHiGroup,vimGroup,vimHLGroup,vimNotation
+syn region vimHiLink contained oneline matchgroup=vimCommand start="\(\<hi\%[ghlight]\s\+\)\@<=\(\(def\%[ault]\s\+\)\=link\>\|\<def\>\)" end="$" contains=@vimHiCluster
syn cluster vimFuncBodyList add=vimHiLink
" Control Characters {{{2
@@ -531,9 +606,14 @@ syn region vimGlobal matchgroup=Statement start='\<v\%[global]!\=/' skip='\\.' e
" Allows users to specify the type of embedded script highlighting
" they want: (perl/python/ruby/tcl support)
" g:vimsyn_embed == 0 : don't embed any scripts
-" g:vimsyn_embed ~= 'P' : embed python (but only if vim supports it)
+" g:vimsyn_embed =~# 'l' : embed lua
+" g:vimsyn_embed =~# 'm' : embed mzscheme
+" g:vimsyn_embed =~# 'p' : embed perl
+" g:vimsyn_embed =~# 'P' : embed python
+" g:vimsyn_embed =~# 'r' : embed ruby
+" g:vimsyn_embed =~# 't' : embed tcl
if !exists("g:vimsyn_embed")
- let g:vimsyn_embed= "P"
+ let g:vimsyn_embed= 0
endif
" [-- lua --] {{{3
@@ -546,9 +626,17 @@ if !filereadable(s:luapath)
endif
endfor
endif
-
-syn region vimEmbedError start=+lua\s*<<\s*\z(.*\)$+ end=+^\z1$+
-syn region vimEmbedError start=+lua\s*<<\s*$+ end=+\.$+
+if g:vimsyn_embed =~# 'l' && filereadable(s:luapath)
+ unlet! b:current_syntax
+ syn cluster vimFuncBodyList add=vimLuaRegion
+ exe "syn include @vimLuaScript ".s:luapath
+ VimFoldl syn region vimLuaRegion matchgroup=vimScriptDelim start=+lua\s*<<\s*\z(.*\)$+ end=+^\z1$+ contains=@vimLuaScript
+ VimFoldl syn region vimLuaRegion matchgroup=vimScriptDelim start=+lua\s*<<\s*$+ end=+\.$+ contains=@vimLuaScript
+ syn cluster vimFuncBodyList add=vimLuaRegion
+else
+ syn region vimEmbedError start=+lua\s*<<\s*\z(.*\)$+ end=+^\z1$+
+ syn region vimEmbedError start=+lua\s*<<\s*$+ end=+\.$+
+endif
unlet s:luapath
" [-- perl --] {{{3
@@ -561,9 +649,19 @@ if !filereadable(s:perlpath)
endif
endfor
endif
-
-syn region vimEmbedError start=+pe\%[rl]\s*<<\s*\z(.*\)$+ end=+^\z1$+
-syn region vimEmbedError start=+pe\%[rl]\s*<<\s*$+ end=+\.$+
+if g:vimsyn_embed =~# 'p' && filereadable(s:perlpath)
+ unlet! b:current_syntax
+ syn cluster vimFuncBodyList add=vimPerlRegion
+ let s:foldmethod = &l:foldmethod
+ exe "syn include @vimPerlScript ".s:perlpath
+ let &l:foldmethod = s:foldmethod
+ VimFoldp syn region vimPerlRegion matchgroup=vimScriptDelim start=+pe\%[rl]\s*<<\s*\z(\S*\)\ze\(\s*["#].*\)\=$+ end=+^\z1\ze\(\s*[#"].*\)\=$+ contains=@vimPerlScript
+ VimFoldp syn region vimPerlRegion matchgroup=vimScriptDelim start=+pe\%[rl]\s*<<\s*$+ end=+\.$+ contains=@vimPerlScript
+ syn cluster vimFuncBodyList add=vimPerlRegion
+else
+ syn region vimEmbedError start=+pe\%[rl]\s*<<\s*\z(.*\)$+ end=+^\z1$+
+ syn region vimEmbedError start=+pe\%[rl]\s*<<\s*$+ end=+\.$+
+endif
unlet s:perlpath
" [-- ruby --] {{{3
@@ -576,9 +674,19 @@ if !filereadable(s:rubypath)
endif
endfor
endif
-
-syn region vimEmbedError start=+rub[y]\s*<<\s*\z(.*\)$+ end=+^\z1$+
-syn region vimEmbedError start=+rub[y]\s*<<\s*$+ end=+\.$+
+if g:vimsyn_embed =~# 'r' && filereadable(s:rubypath)
+ syn cluster vimFuncBodyList add=vimRubyRegion
+ unlet! b:current_syntax
+ let s:foldmethod = &l:foldmethod
+ exe "syn include @vimRubyScript ".s:rubypath
+ let &l:foldmethod = s:foldmethod
+ VimFoldr syn region vimRubyRegion matchgroup=vimScriptDelim start=+rub[y]\s*<<\s*\z(\S*\)\ze\(\s*#.*\)\=$+ end=+^\z1\ze\(\s*".*\)\=$+ contains=@vimRubyScript
+ syn region vimRubyRegion matchgroup=vimScriptDelim start=+rub[y]\s*<<\s*$+ end=+\.$+ contains=@vimRubyScript
+ syn cluster vimFuncBodyList add=vimRubyRegion
+else
+ syn region vimEmbedError start=+rub[y]\s*<<\s*\z(.*\)$+ end=+^\z1$+
+ syn region vimEmbedError start=+rub[y]\s*<<\s*$+ end=+\.$+
+endif
unlet s:rubypath
" [-- python --] {{{3
@@ -591,16 +699,14 @@ if !filereadable(s:pythonpath)
endif
endfor
endif
-if g:vimsyn_embed =~ 'P' && filereadable(s:pythonpath)
+if g:vimsyn_embed =~# 'P' && filereadable(s:pythonpath)
unlet! b:current_syntax
+ syn cluster vimFuncBodyList add=vimPythonRegion
exe "syn include @vimPythonScript ".s:pythonpath
- if exists("g:vimsyn_folding") && g:vimsyn_folding =~ 'P'
- syn region vimPythonRegion fold matchgroup=vimScriptDelim start=+py\%[thon]3\=\s*<<\s*\z(.*\)$+ end=+^\z1$+ contains=@vimPythonScript
- syn region vimPythonRegion fold matchgroup=vimScriptDelim start=+py\%[thon]3\=\s*<<\s*$+ end=+\.$+ contains=@vimPythonScript
- else
- syn region vimPythonRegion matchgroup=vimScriptDelim start=+py\%[thon]3\=\s*<<\s*\z(.*\)$+ end=+^\z1$+ contains=@vimPythonScript
- syn region vimPythonRegion matchgroup=vimScriptDelim start=+py\%[thon]3\=\s*<<\s*$+ end=+\.$+ contains=@vimPythonScript
- endif
+ VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+py\%[thon]3\=\s*<<\s*\z(\S*\)\ze\(\s*#.*\)\=$+ end=+^\z1\ze\(\s*".*\)\=$+ contains=@vimPythonScript
+ VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+py\%[thon]3\=\s*<<\s*$+ end=+\.$+ contains=@vimPythonScript
+ VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+Py\%[thon]2or3\s*<<\s*\z(\S*\)\ze\(\s*#.*\)\=$+ end=+^\z1\ze\(\s*".*\)\=$+ contains=@vimPythonScript
+ VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+Py\%[thon]2or3\=\s*<<\s*$+ end=+\.$+ contains=@vimPythonScript
syn cluster vimFuncBodyList add=vimPythonRegion
else
syn region vimEmbedError start=+py\%[thon]3\=\s*<<\s*\z(.*\)$+ end=+^\z1$+
@@ -625,11 +731,18 @@ if s:trytcl
endif
endfor
endif
-
- syn region vimEmbedError start=+tc[l]\=\s*<<\s*\z(.*\)$+ end=+^\z1$+
- syn region vimEmbedError start=+tc[l]\=\s*<<\s*$+ end=+\.$+
+ if g:vimsyn_embed =~# 't' && filereadable(s:tclpath)
+ unlet! b:current_syntax
+ syn cluster vimFuncBodyList add=vimTclRegion
+ exe "syn include @vimTclScript ".s:tclpath
+ VimFoldt syn region vimTclRegion matchgroup=vimScriptDelim start=+tc[l]\=\s*<<\s*\z(.*\)$+ end=+^\z1$+ contains=@vimTclScript
+ VimFoldt syn region vimTclRegion matchgroup=vimScriptDelim start=+tc[l]\=\s*<<\s*$+ end=+\.$+ contains=@vimTclScript
+ syn cluster vimFuncBodyList add=vimTclScript
+ else
+ syn region vimEmbedError start=+tc[l]\=\s*<<\s*\z(.*\)$+ end=+^\z1$+
+ syn region vimEmbedError start=+tc[l]\=\s*<<\s*$+ end=+\.$+
+ endif
unlet s:tclpath
-
else
syn region vimEmbedError start=+tc[l]\=\s*<<\s*\z(.*\)$+ end=+^\z1$+
syn region vimEmbedError start=+tc[l]\=\s*<<\s*$+ end=+\.$+
@@ -646,9 +759,20 @@ if !filereadable(s:mzschemepath)
endif
endfor
endif
-
-syn region vimEmbedError start=+mz\%[scheme]\s*<<\s*\z(.*\)$+ end=+^\z1$+
-syn region vimEmbedError start=+mz\%[scheme]\s*<<\s*$+ end=+\.$+
+if g:vimsyn_embed =~# 'm' && filereadable(s:mzschemepath)
+ unlet! b:current_syntax
+ let s:iskKeep= &isk
+ syn cluster vimFuncBodyList add=vimMzSchemeRegion
+ exe "syn include @vimMzSchemeScript ".s:mzschemepath
+ let &isk= s:iskKeep
+ unlet s:iskKeep
+ VimFoldm syn region vimMzSchemeRegion matchgroup=vimScriptDelim start=+mz\%[scheme]\s*<<\s*\z(.*\)$+ end=+^\z1$+ contains=@vimMzSchemeScript
+ VimFoldm syn region vimMzSchemeRegion matchgroup=vimScriptDelim start=+mz\%[scheme]\s*<<\s*$+ end=+\.$+ contains=@vimMzSchemeScript
+ syn cluster vimFuncBodyList add=vimMzSchemeRegion
+else
+ syn region vimEmbedError start=+mz\%[scheme]\s*<<\s*\z(.*\)$+ end=+^\z1$+
+ syn region vimEmbedError start=+mz\%[scheme]\s*<<\s*$+ end=+\.$+
+endif
unlet s:mzschemepath
" Synchronize (speed) {{{2
@@ -656,11 +780,7 @@ unlet s:mzschemepath
if exists("g:vimsyn_minlines")
exe "syn sync minlines=".g:vimsyn_minlines
endif
-if exists("g:vimsyn_maxlines")
- exe "syn sync maxlines=".g:vimsyn_maxlines
-else
- syn sync maxlines=60
-endif
+exe "syn sync maxlines=".s:vimsyn_maxlines
syn sync linecont "^\s\+\\"
syn sync match vimAugroupSyncA groupthere NONE "\<aug\%[roup]\>\s\+[eE][nN][dD]"
@@ -668,179 +788,189 @@ syn sync match vimAugroupSyncA groupthere NONE "\<aug\%[roup]\>\s\+[eE][nN][dD]"
" Highlighting Settings {{{2
" ====================
+if !exists("skip_vim_syntax_inits")
+ if !exists("g:vimsyn_noerror")
+ hi def link vimBehaveError vimError
+ hi def link vimCollClassErr vimError
+ hi def link vimErrSetting vimError
+ hi def link vimEmbedError Normal
+ hi def link vimFTError vimError
+ hi def link vimFunctionError vimError
+ hi def link vimFunc vimError
+ hi def link vimHiAttribList vimError
+ hi def link vimHiCtermError vimError
+ hi def link vimHiKeyError vimError
+ hi def link vimKeyCodeError vimError
+ hi def link vimMapModErr vimError
+ hi def link vimSubstFlagErr vimError
+ hi def link vimSynCaseError vimError
+ hi def link vimBufnrWarn vimWarn
+ endif
-if !exists("g:vimsyn_noerror")
- hi def link vimBehaveError vimError
- hi def link vimCollClassErr vimError
- hi def link vimErrSetting vimError
- hi def link vimEmbedError vimError
- hi def link vimFTError vimError
- hi def link vimFunctionError vimError
- hi def link vimFunc vimError
- hi def link vimHiAttribList vimError
- hi def link vimHiCtermError vimError
- hi def link vimHiKeyError vimError
- hi def link vimKeyCodeError vimError
- hi def link vimMapModErr vimError
- hi def link vimSubstFlagErr vimError
- hi def link vimSynCaseError vimError
- hi def link vimBufnrWarn vimWarn
- hi def link vimOnlyCommand vimError
- hi def link vimTermOption vimError
- hi def link vimOnlyOption vimError
- hi def link vimOnlyHLGroup vimError
-endif
-
-hi def link vimAbb vimCommand
-hi def link vimAddress vimMark
-hi def link vimAugroupKey vimCommand
-hi def link vimAuHighlight vimHighlight
-hi def link vimAutoCmdOpt vimOption
-hi def link vimAutoCmd vimCommand
-hi def link vimAutoEvent Type
-hi def link nvimAutoEvent vimAutoEvent
-hi def link vimAutoSet vimCommand
-hi def link vimBehaveModel vimBehave
-hi def link vimBehave vimCommand
-hi def link vimBracket Delimiter
-hi def link vimCmplxRepeat SpecialChar
-hi def link vimCommand Statement
-hi def link vimComment Comment
-hi def link vimCommentString vimString
-hi def link vimCommentTitle PreProc
-hi def link vimCondHL vimCommand
-hi def link vimContinue Special
-hi def link vimCtrlChar SpecialChar
-hi def link vimEchoHLNone vimGroup
-hi def link vimEchoHL vimCommand
-hi def link vimElseIfErr Error
-hi def link vimElseif vimCondHL
-hi def link vimEnvvar PreProc
-hi def link vimError Error
-hi def link vimFBVar vimVar
-hi def link vimFgBgAttrib vimHiAttrib
-hi def link vimFold Folded
-hi def link vimFTCmd vimCommand
-hi def link vimFTOption vimSynType
-hi def link vimFuncKey vimCommand
-hi def link vimFuncName Function
-hi def link vimFuncSID Special
-hi def link vimFuncVar Identifier
-hi def link vimGroupAdd vimSynOption
-hi def link vimGroupName vimGroup
-hi def link vimGroupRem vimSynOption
-hi def link vimGroupSpecial Special
-hi def link vimGroup Type
-hi def link vimHiAttrib PreProc
-hi def link vimHiClear vimHighlight
-hi def link vimHiCtermFgBg vimHiTerm
-hi def link vimHiCTerm vimHiTerm
-hi def link vimHighlight vimCommand
-hi def link vimHiGroup vimGroupName
-hi def link vimHiGuiFgBg vimHiTerm
-hi def link vimHiGuiFont vimHiTerm
-hi def link vimHiGuiRgb vimNumber
-hi def link vimHiGui vimHiTerm
-hi def link vimHiNmbr Number
-hi def link vimHiStartStop vimHiTerm
-hi def link vimHiTerm Type
-hi def link vimHLGroup vimGroup
-hi def link nvimHLGroup vimHLGroup
-hi def link vimHLMod PreProc
-hi def link vimInsert vimString
-hi def link vimKeyCode vimSpecFile
-hi def link vimKeyword Statement
-hi def link vimLet vimCommand
-hi def link vimLineComment vimComment
-hi def link vimMapBang vimCommand
-hi def link vimMapModKey vimFuncSID
-hi def link vimMapMod vimBracket
-hi def link vimMap vimCommand
-hi def link nvimMap vimMap
-hi def link vimMark Number
-hi def link vimMarkNumber vimNumber
-hi def link vimMenuMod vimMapMod
-hi def link vimMenuNameMore vimMenuName
-hi def link vimMenuName PreProc
-hi def link vimMtchComment vimComment
-hi def link vimNorm vimCommand
-hi def link vimNotation Special
-hi def link vimNotFunc vimCommand
-hi def link vimNotPatSep vimString
-hi def link vimNumber Number
-hi def link vimOperError Error
-hi def link vimOper Operator
-hi def link vimOption PreProc
-hi def link vimParenSep Delimiter
-hi def link vimPatSepErr vimPatSep
-hi def link vimPatSepR vimPatSep
-hi def link vimPatSep SpecialChar
-hi def link vimPatSepZone vimString
-hi def link vimPatSepZ vimPatSep
-hi def link vimPattern Type
-hi def link vimPlainMark vimMark
-hi def link vimPlainRegister vimRegister
-hi def link vimRegister SpecialChar
-hi def link vimScriptDelim Comment
-hi def link vimSearchDelim Statement
-hi def link vimSearch vimString
-hi def link vimSep Delimiter
-hi def link vimSetMod vimOption
-hi def link vimSetSep Statement
-hi def link vimSetString vimString
-hi def link vimSpecFile Identifier
-hi def link vimSpecFileMod vimSpecFile
-hi def link vimSpecial Type
-hi def link vimStatement Statement
-hi def link vimStringCont vimString
-hi def link vimString String
-hi def link vimSubst1 vimSubst
-hi def link vimSubstDelim Delimiter
-hi def link vimSubstFlags Special
-hi def link vimSubstSubstr SpecialChar
-hi def link vimSubstTwoBS vimString
-hi def link vimSubst vimCommand
-hi def link vimSynCaseError Error
-hi def link vimSynCase Type
-hi def link vimSyncC Type
-hi def link vimSyncError Error
-hi def link vimSyncGroupName vimGroupName
-hi def link vimSyncGroup vimGroupName
-hi def link vimSyncKey Type
-hi def link vimSyncNone Type
-hi def link vimSynContains vimSynOption
-hi def link vimSynError Error
-hi def link vimSynKeyContainedin vimSynContains
-hi def link vimSynKeyOpt vimSynOption
-hi def link vimSynMtchGrp vimSynOption
-hi def link vimSynMtchOpt vimSynOption
-hi def link vimSynNextgroup vimSynOption
-hi def link vimSynNotPatRange vimSynRegPat
-hi def link vimSynOption Special
-hi def link vimSynPatRange vimString
-hi def link vimSynRegOpt vimSynOption
-hi def link vimSynRegPat vimString
-hi def link vimSynReg Type
-hi def link vimSyntax vimCommand
-hi def link vimSynType vimSpecial
-hi def link vimTodo Todo
-hi def link vimUnmap vimMap
-hi def link nvimUnmap vimMap
-hi def link vimUserAttrbCmpltFunc Special
-hi def link vimUserAttrbCmplt vimSpecial
-hi def link vimUserAttrbKey vimOption
-hi def link vimUserAttrb vimSpecial
-hi def link vimUserCmdError Error
-hi def link vimUserCommand vimCommand
-hi def link vimUserFunc Normal
-hi def link vimVar Identifier
-hi def link vimWarn WarningMsg
+ hi def link vimAbb vimCommand
+ hi def link vimAddress vimMark
+ hi def link vimAugroupError vimError
+ hi def link vimAugroupKey vimCommand
+ hi def link vimAuHighlight vimHighlight
+ hi def link vimAutoCmdOpt vimOption
+ hi def link vimAutoCmd vimCommand
+ hi def link vimAutoEvent Type
+ hi def link vimAutoSet vimCommand
+ hi def link vimBehaveModel vimBehave
+ hi def link vimBehave vimCommand
+ hi def link vimBracket Delimiter
+ hi def link vimCmplxRepeat SpecialChar
+ hi def link vimCommand Statement
+ hi def link vimComment Comment
+ hi def link vimCommentString vimString
+ hi def link vimCommentTitle PreProc
+ hi def link vimCondHL vimCommand
+ hi def link vimContinue Special
+ hi def link vimCtrlChar SpecialChar
+ hi def link vimEchoHLNone vimGroup
+ hi def link vimEchoHL vimCommand
+ hi def link vimElseIfErr Error
+ hi def link vimElseif vimCondHL
+ hi def link vimEnvvar PreProc
+ hi def link vimError Error
+ hi def link vimFBVar vimVar
+ hi def link vimFgBgAttrib vimHiAttrib
+ hi def link vimFold Folded
+ hi def link vimFTCmd vimCommand
+ hi def link vimFTOption vimSynType
+ hi def link vimFuncKey vimCommand
+ hi def link vimFuncName Function
+ hi def link vimFuncSID Special
+ hi def link vimFuncVar Identifier
+ hi def link vimGroupAdd vimSynOption
+ hi def link vimGroupName vimGroup
+ hi def link vimGroupRem vimSynOption
+ hi def link vimGroupSpecial Special
+ hi def link vimGroup Type
+ hi def link vimHiAttrib PreProc
+ hi def link vimHiClear vimHighlight
+ hi def link vimHiCtermFgBg vimHiTerm
+ hi def link vimHiCTerm vimHiTerm
+ hi def link vimHighlight vimCommand
+ hi def link vimHiGroup vimGroupName
+ hi def link vimHiGuiFgBg vimHiTerm
+ hi def link vimHiGuiFont vimHiTerm
+ hi def link vimHiGuiRgb vimNumber
+ hi def link vimHiGui vimHiTerm
+ hi def link vimHiNmbr Number
+ hi def link vimHiStartStop vimHiTerm
+ hi def link vimHiTerm Type
+ hi def link vimHLGroup vimGroup
+ hi def link vimHLMod PreProc
+ hi def link vimInsert vimString
+ hi def link vimIskSep Delimiter
+ hi def link vimKeyCode vimSpecFile
+ hi def link vimKeyword Statement
+ hi def link vimLet vimCommand
+ hi def link vimLineComment vimComment
+ hi def link vimMapBang vimCommand
+ hi def link vimMapModKey vimFuncSID
+ hi def link vimMapMod vimBracket
+ hi def link vimMap vimCommand
+ hi def link vimMark Number
+ hi def link vimMarkNumber vimNumber
+ hi def link vimMenuMod vimMapMod
+ hi def link vimMenuNameMore vimMenuName
+ hi def link vimMenuName PreProc
+ hi def link vimMtchComment vimComment
+ hi def link vimNorm vimCommand
+ hi def link vimNotation Special
+ hi def link vimNotFunc vimCommand
+ hi def link vimNotPatSep vimString
+ hi def link vimNumber Number
+ hi def link vimOperError Error
+ hi def link vimOper Operator
+ hi def link vimOption PreProc
+ hi def link vimParenSep Delimiter
+ hi def link vimPatSepErr vimError
+ hi def link vimPatSepR vimPatSep
+ hi def link vimPatSep SpecialChar
+ hi def link vimPatSepZone vimString
+ hi def link vimPatSepZ vimPatSep
+ hi def link vimPattern Type
+ hi def link vimPlainMark vimMark
+ hi def link vimPlainRegister vimRegister
+ hi def link vimRegister SpecialChar
+ hi def link vimScriptDelim Comment
+ hi def link vimSearchDelim Statement
+ hi def link vimSearch vimString
+ hi def link vimSep Delimiter
+ hi def link vimSetMod vimOption
+ hi def link vimSetSep Statement
+ hi def link vimSetString vimString
+ hi def link vimSpecFile Identifier
+ hi def link vimSpecFileMod vimSpecFile
+ hi def link vimSpecial Type
+ hi def link vimStatement Statement
+ hi def link vimStringCont vimString
+ hi def link vimString String
+ hi def link vimStringEnd vimString
+ hi def link vimSubst1 vimSubst
+ hi def link vimSubstDelim Delimiter
+ hi def link vimSubstFlags Special
+ hi def link vimSubstSubstr SpecialChar
+ hi def link vimSubstTwoBS vimString
+ hi def link vimSubst vimCommand
+ hi def link vimSynCaseError Error
+ hi def link vimSynCase Type
+ hi def link vimSyncC Type
+ hi def link vimSyncError Error
+ hi def link vimSyncGroupName vimGroupName
+ hi def link vimSyncGroup vimGroupName
+ hi def link vimSyncKey Type
+ hi def link vimSyncNone Type
+ hi def link vimSynContains vimSynOption
+ hi def link vimSynError Error
+ hi def link vimSynKeyContainedin vimSynContains
+ hi def link vimSynKeyOpt vimSynOption
+ hi def link vimSynMtchGrp vimSynOption
+ hi def link vimSynMtchOpt vimSynOption
+ hi def link vimSynNextgroup vimSynOption
+ hi def link vimSynNotPatRange vimSynRegPat
+ hi def link vimSynOption Special
+ hi def link vimSynPatRange vimString
+ hi def link vimSynRegOpt vimSynOption
+ hi def link vimSynRegPat vimString
+ hi def link vimSynReg Type
+ hi def link vimSyntax vimCommand
+ hi def link vimSynType vimSpecial
+ hi def link vimTodo Todo
+ hi def link vimUnmap vimMap
+ hi def link vimUserAttrbCmpltFunc Special
+ hi def link vimUserAttrbCmplt vimSpecial
+ hi def link vimUserAttrbKey vimOption
+ hi def link vimUserAttrb vimSpecial
+ hi def link vimUserAttrbError Error
+ hi def link vimUserCmdError Error
+ hi def link vimUserCommand vimCommand
+ hi def link vimUserFunc Normal
+ hi def link vimVar Identifier
+ hi def link vimWarn WarningMsg
+
+ hi def link nvimAutoEvent vimAutoEvent
+ hi def link nvimHLGroup vimHLGroup
+ hi def link nvimMap vimMap
+ hi def link nvimUnmap vimUnmap
+endif
" Current Syntax Variable: {{{2
let b:current_syntax = "vim"
" ---------------------------------------------------------------------
" Cleanup: {{{1
+delc VimFolda
+delc VimFoldf
+delc VimFoldl
+delc VimFoldm
+delc VimFoldp
+delc VimFoldP
+delc VimFoldr
+delc VimFoldt
let &cpo = s:keepcpo
unlet s:keepcpo
" vim:ts=18 fdm=marker
diff --git a/runtime/syntax/viminfo.vim b/runtime/syntax/viminfo.vim
index 7af3b89ae0..667e1bab2a 100644
--- a/runtime/syntax/viminfo.vim
+++ b/runtime/syntax/viminfo.vim
@@ -1,7 +1,7 @@
" Vim syntax file
" Language: Vim .viminfo file
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2012 Feb 03
+" Last Change: 2016 Jun 05
" Quit when a (custom) syntax file was already loaded
if exists("b:current_syntax")
@@ -30,11 +30,15 @@ syn match viminfoOptionName "\*\a*"ms=s+1 contained
" Comments
syn match viminfoComment "^#.*"
+" New style lines. TODO: highlight numbers and strings.
+syn match viminfoNew "^|.*"
+
" Define the default highlighting.
" Only used when an item doesn't have highlighting yet
hi def link viminfoComment Comment
hi def link viminfoError Error
hi def link viminfoStatement Statement
+hi def link viminfoNew String
let b:current_syntax = "viminfo"
diff --git a/runtime/syntax/virata.vim b/runtime/syntax/virata.vim
index e597b8e31c..0ed54fa899 100644
--- a/runtime/syntax/virata.vim
+++ b/runtime/syntax/virata.vim
@@ -13,10 +13,8 @@
" Setup Syntax:
-if version < 600
- " Clear old syntax settings
- syn clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" Virata syntax is case insensitive (mostly)
@@ -156,63 +154,53 @@ syn sync minlines=50 "for multiple region nesting
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later : only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_virata_syntax_inits")
- if version < 508
- let did_virata_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " Sub Links:
- HiLink virataDefSubstError virataPreProcError
- HiLink virataDefSubst virataPreProc
- HiLink virataInAlter virataOperator
- HiLink virataInExec virataOperator
- HiLink virataInExport virataOperator
- HiLink virataInImport virataOperator
- HiLink virataInInstance virataOperator
- HiLink virataInMake virataOperator
- HiLink virataInModule virataOperator
- HiLink virataInProcess virataOperator
- HiLink virataInMacAddr virataHexNumber
-
- " Comment Group:
- HiLink virataComment Comment
- HiLink virataSpclComment SpecialComment
- HiLink virataInCommentTodo Todo
-
- " Constant Group:
- HiLink virataString String
- HiLink virataStringError Error
- HiLink virataCharacter Character
- HiLink virataSpclChar Special
- HiLink virataDecNumber Number
- HiLink virataHexNumber Number
- HiLink virataSizeNumber Number
- HiLink virataNumberError Error
-
- " Identifier Group:
- HiLink virataIdentError Error
-
- " PreProc Group:
- HiLink virataPreProc PreProc
- HiLink virataDefine Define
- HiLink virataInclude Include
- HiLink virataPreCondit PreCondit
- HiLink virataPreProcError Error
- HiLink virataPreProcWarn Todo
-
- " Directive Group:
- HiLink virataStatement Statement
- HiLink virataCfgStatement Statement
- HiLink virataOperator Operator
- HiLink virataDirective Keyword
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+" Sub Links:
+hi def link virataDefSubstError virataPreProcError
+hi def link virataDefSubst virataPreProc
+hi def link virataInAlter virataOperator
+hi def link virataInExec virataOperator
+hi def link virataInExport virataOperator
+hi def link virataInImport virataOperator
+hi def link virataInInstance virataOperator
+hi def link virataInMake virataOperator
+hi def link virataInModule virataOperator
+hi def link virataInProcess virataOperator
+hi def link virataInMacAddr virataHexNumber
+
+" Comment Group:
+hi def link virataComment Comment
+hi def link virataSpclComment SpecialComment
+hi def link virataInCommentTodo Todo
+
+" Constant Group:
+hi def link virataString String
+hi def link virataStringError Error
+hi def link virataCharacter Character
+hi def link virataSpclChar Special
+hi def link virataDecNumber Number
+hi def link virataHexNumber Number
+hi def link virataSizeNumber Number
+hi def link virataNumberError Error
+
+" Identifier Group:
+hi def link virataIdentError Error
+
+" PreProc Group:
+hi def link virataPreProc PreProc
+hi def link virataDefine Define
+hi def link virataInclude Include
+hi def link virataPreCondit PreCondit
+hi def link virataPreProcError Error
+hi def link virataPreProcWarn Todo
+
+" Directive Group:
+hi def link virataStatement Statement
+hi def link virataCfgStatement Statement
+hi def link virataOperator Operator
+hi def link virataDirective Keyword
+
let b:current_syntax = "virata"
diff --git a/runtime/syntax/vmasm.vim b/runtime/syntax/vmasm.vim
index 85d0441258..c5cbb1e3a2 100644
--- a/runtime/syntax/vmasm.vim
+++ b/runtime/syntax/vmasm.vim
@@ -6,11 +6,8 @@
" This is incomplete. Feel free to contribute...
"
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -196,55 +193,45 @@ syn match vmasmDirective "\.\(signed_\)\=word\>"
syn case match
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_macro_syntax_inits")
- if version < 508
- let did_macro_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- " The default methods for highlighting. Can be overridden later
- " Comment Constant Error Identifier PreProc Special Statement Todo Type
- "
- " Constant Boolean Character Number String
- " Identifier Function
- " PreProc Define Include Macro PreCondit
- " Special Debug Delimiter SpecialChar SpecialComment Tag
- " Statement Conditional Exception Keyword Label Operator Repeat
- " Type StorageClass Structure Typedef
-
- HiLink vmasmComment Comment
- HiLink vmasmTodo Todo
-
- HiLink vmasmhexNumber Number " Constant
- HiLink vmasmoctNumber Number " Constant
- HiLink vmasmbinNumber Number " Constant
- HiLink vmasmdecNumber Number " Constant
- HiLink vmasmfloatNumber Number " Constant
-
-" HiLink vmasmString String " Constant
-
- HiLink vmasmReg Identifier
- HiLink vmasmOperator Identifier
-
- HiLink vmasmInclude Include " PreProc
- HiLink vmasmMacro Macro " PreProc
- " HiLink vmasmMacroParam Keyword " Statement
-
- HiLink vmasmDirective Special
- HiLink vmasmPreCond Special
-
-
- HiLink vmasmOpcode Statement
- HiLink vmasmCond Conditional " Statement
- HiLink vmasmRepeat Repeat " Statement
-
- HiLink vmasmLabel Type
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+" The default methods for highlighting. Can be overridden later
+" Comment Constant Error Identifier PreProc Special Statement Todo Type
+"
+" Constant Boolean Character Number String
+" Identifier Function
+" PreProc Define Include Macro PreCondit
+" Special Debug Delimiter SpecialChar SpecialComment Tag
+" Statement Conditional Exception Keyword Label Operator Repeat
+" Type StorageClass Structure Typedef
+
+hi def link vmasmComment Comment
+hi def link vmasmTodo Todo
+
+hi def link vmasmhexNumber Number " Constant
+hi def link vmasmoctNumber Number " Constant
+hi def link vmasmbinNumber Number " Constant
+hi def link vmasmdecNumber Number " Constant
+hi def link vmasmfloatNumber Number " Constant
+
+" hi def link vmasmString String " Constant
+
+hi def link vmasmReg Identifier
+hi def link vmasmOperator Identifier
+
+hi def link vmasmInclude Include " PreProc
+hi def link vmasmMacro Macro " PreProc
+" hi def link vmasmMacroParam Keyword " Statement
+
+hi def link vmasmDirective Special
+hi def link vmasmPreCond Special
+
+
+hi def link vmasmOpcode Statement
+hi def link vmasmCond Conditional " Statement
+hi def link vmasmRepeat Repeat " Statement
+
+hi def link vmasmLabel Type
let b:current_syntax = "vmasm"
diff --git a/runtime/syntax/vrml.vim b/runtime/syntax/vrml.vim
index 44814aad86..2474493c94 100644
--- a/runtime/syntax/vrml.vim
+++ b/runtime/syntax/vrml.vim
@@ -5,11 +5,8 @@
" Former Maintainer: Gregory Seidman <gsslist+vim@anthropohedron.net>
" Last change: 2006 May 03
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -168,11 +165,9 @@ syn keyword VRMLProtos contained EXTERNPROTO PROTO IS
syn keyword VRMLRoutes contained ROUTE TO
-if version >= 502
"containment!
- syn include @jscript $VIMRUNTIME/syntax/javascript.vim
- syn region VRMLjScriptString contained start=+"\(\(javascript\)\|\(vrmlscript\)\|\(ecmascript\)\):+ms=e+1 skip=+\\\\\|\\"+ end=+"+me=e-1 contains=@jscript
-endif
+syn include @jscript $VIMRUNTIME/syntax/javascript.vim
+syn region VRMLjScriptString contained start=+"\(\(javascript\)\|\(vrmlscript\)\|\(ecmascript\)\):+ms=e+1 skip=+\\\\\|\\"+ end=+"+me=e-1 contains=@jscript
" match definitions.
syn match VRMLSpecial contained "\\[0-9][0-9][0-9]\|\\."
@@ -192,47 +187,35 @@ syn region VRMLInstName start="USE\>"hs=e+1 skip="USE\(,\|\s\)*" end="[A-Za-z
syn keyword VRMLInstances contained DEF USE
syn sync minlines=1
-if version >= 600
"FOLDS!
- syn sync fromstart
- "setlocal foldmethod=syntax
- syn region braceFold start="{" end="}" transparent fold contains=TOP
- syn region bracketFold start="\[" end="]" transparent fold contains=TOP
- syn region VRMLString start=+"+ skip=+\\\\\|\\"+ end=+"+ fold contains=VRMLSpecial,VRMLjScriptString
-endif
+syn sync fromstart
+"setlocal foldmethod=syntax
+syn region braceFold start="{" end="}" transparent fold contains=TOP
+syn region bracketFold start="\[" end="]" transparent fold contains=TOP
+syn region VRMLString start=+"+ skip=+\\\\\|\\"+ end=+"+ fold contains=VRMLSpecial,VRMLjScriptString
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_VRML_syntax_inits")
- if version < 508
- let did_VRML_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink VRMLCharacter VRMLString
- HiLink VRMLSpecialCharacter VRMLSpecial
- HiLink VRMLNumber VRMLString
- HiLink VRMLValues VRMLString
- HiLink VRMLString String
- HiLink VRMLSpecial Special
- HiLink VRMLComment Comment
- HiLink VRMLNodes Statement
- HiLink VRMLFields Type
- HiLink VRMLEvents Type
- HiLink VRMLfTypes LineNr
+" Only when an item doesn't have highlighting yet
+
+hi def link VRMLCharacter VRMLString
+hi def link VRMLSpecialCharacter VRMLSpecial
+hi def link VRMLNumber VRMLString
+hi def link VRMLValues VRMLString
+hi def link VRMLString String
+hi def link VRMLSpecial Special
+hi def link VRMLComment Comment
+hi def link VRMLNodes Statement
+hi def link VRMLFields Type
+hi def link VRMLEvents Type
+hi def link VRMLfTypes LineNr
" hi VRMLfTypes ctermfg=6 guifg=Brown
- HiLink VRMLInstances PreCondit
- HiLink VRMLRoutes PreCondit
- HiLink VRMLProtos PreProc
- HiLink VRMLRouteNode Identifier
- HiLink VRMLInstName Identifier
- HiLink VRMLTypes Identifier
-
- delcommand HiLink
-endif
+hi def link VRMLInstances PreCondit
+hi def link VRMLRoutes PreCondit
+hi def link VRMLProtos PreProc
+hi def link VRMLRouteNode Identifier
+hi def link VRMLInstName Identifier
+hi def link VRMLTypes Identifier
+
let b:current_syntax = "vrml"
diff --git a/runtime/syntax/vroom.vim b/runtime/syntax/vroom.vim
index 0cd6ccce1d..0509e30b17 100644
--- a/runtime/syntax/vroom.vim
+++ b/runtime/syntax/vroom.vim
@@ -3,11 +3,8 @@
" Maintainer: David Barnett (https://github.com/google/vim-ft-vroom)
" Last Change: 2014 Jul 23
-" For version 5.x: Clear all syntax items.
-" For version 6.x and later: Quit when a syntax file was already loaded.
-if v:version < 600
- syntax clear
-elseif exists('b:current_syntax')
+" quit when a syntax file was already loaded
+if exists('b:current_syntax')
finish
endif
diff --git a/runtime/syntax/vsejcl.vim b/runtime/syntax/vsejcl.vim
index f4f00c65ea..f329836236 100644
--- a/runtime/syntax/vsejcl.vim
+++ b/runtime/syntax/vsejcl.vim
@@ -4,11 +4,8 @@
" URL:
" Last change: 2001 May 10
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -23,26 +20,16 @@ syn match vsejclString /'.\{-}'/
syn match vsejclParms /(.\{-})/ contained
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_vsejcl_syntax")
- if version < 508
- let did_vsejcl_syntax = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink vsejclComment Comment
- HiLink vsejclField Type
- HiLink vsejclKeyword Statement
- HiLink vsejclObject Constant
- HiLink vsejclString Constant
- HiLink vsejclMisc Special
- HiLink vsejclParms Constant
+hi def link vsejclComment Comment
+hi def link vsejclField Type
+hi def link vsejclKeyword Statement
+hi def link vsejclObject Constant
+hi def link vsejclString Constant
+hi def link vsejclMisc Special
+hi def link vsejclParms Constant
- delcommand HiLink
-endif
let b:current_syntax = "vsejcl"
diff --git a/runtime/syntax/wast.vim b/runtime/syntax/wast.vim
new file mode 100644
index 0000000000..245d5f6f19
--- /dev/null
+++ b/runtime/syntax/wast.vim
@@ -0,0 +1,84 @@
+" Vim syntax file
+" Language: WebAssembly
+" Maintainer: rhysd <lin90162@yahoo.co.jp>
+" Last Change: Jul 29, 2018
+" For bugs, patches and license go to https://github.com/rhysd/vim-wasm
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn cluster wastCluster contains=wastModule,wastInstWithType,wastInstGeneral,wastParamInst,wastControlInst,wastString,wastNamedVar,wastUnnamedVar,wastFloat,wastNumber,wastComment,wastList,wastType
+
+" Instructions
+" https://webassembly.github.io/spec/core/text/instructions.html
+" Note: memarg (align=,offset=) can be added to memory instructions
+syn match wastInstWithType "\%((\s*\)\@<=\<\%(i32\|i64\|f32\|f64\|memory\)\.[[:alnum:]_]\+\%(/\%(i32\|i64\|f32\|f64\)\)\=\>\%(\s\+\%(align\|offset\)=\)\=" contained display
+syn match wastInstGeneral "\%((\s*\)\@<=\<[[:alnum:]_]\+\>" contained display
+" https://webassembly.github.io/spec/core/text/instructions.html#control-instructions
+syn match wastControlInst "\%((\s*\)\@<=\<\%(block\|end\|loop\|if\|else\|unreachable\|nop\|br\|br_if\|br_table\|return\|call\|call_indirect\)\>" contained display
+" https://webassembly.github.io/spec/core/text/instructions.html#parametric-instructions
+syn match wastParamInst "\%((\s*\)\@<=\<\%(drop\|select\)\>" contained display
+
+" Identifiers
+" https://webassembly.github.io/spec/core/text/values.html#text-id
+syn match wastNamedVar "$\+[[:alnum:]!#$%&'โˆ—./:=><?@\\^_`~+-]*" contained display
+syn match wastUnnamedVar "$\+\d\+[[:alnum:]!#$%&'โˆ—./:=><?@\\^_`~+-]\@!" contained display
+
+" String literals
+" https://webassembly.github.io/spec/core/text/values.html#strings
+syn region wastString start=+"+ skip=+\\\\\|\\"+ end=+"+ contained contains=wastStringSpecial
+syn match wastStringSpecial "\\\x\x\|\\[tnr'\\\"]\|\\u\x\+" contained containedin=wastString
+
+" Float literals
+" https://webassembly.github.io/spec/core/text/values.html#floating-point
+syn match wastFloat "\<-\=\d\%(_\=\d\)*\%(\.\d\%(_\=\d\)*\)\=\%([eE][-+]\=\d\%(_\=\d\)*\)\=" display contained
+syn match wastFloat "\<-\=0x\x\%(_\=\d\)*\%(\.\x\%(_\=\x\)*\)\=\%([pP][-+]\=\d\%(_\=\d\)*\)\=" display contained
+syn keyword wastFloat inf nan contained
+
+" Integer literals
+" https://webassembly.github.io/spec/core/text/values.html#integers
+syn match wastNumber "\<-\=\d\%(_\=\d\)*\>" display contained
+syn match wastNumber "\<-\=0x\x\%(_\=\x\)*\>" display contained
+
+" Comments
+" https://webassembly.github.io/spec/core/text/lexical.html#comments
+syn region wastComment start=";;" end="$" display
+syn region wastComment start="(;;\@!" end=";)"
+
+syn region wastList matchgroup=wastListDelimiter start="(;\@!" matchgroup=wastListDelimiter end=";\@<!)" contains=@wastCluster
+
+" Types
+" https://webassembly.github.io/spec/core/text/types.html
+syn keyword wastType i64 i32 f64 f32 param result anyfunc mut contained
+syn match wastType "\%((\_s*\)\@<=func\%(\_s*[()]\)\@=" display contained
+
+" Modules
+" https://webassembly.github.io/spec/core/text/modules.html
+syn keyword wastModule module type export import table memory global data elem contained
+syn match wastModule "\%((\_s*\)\@<=func\%(\_s\+\$\)\@=" display contained
+
+syn sync lines=100
+
+hi def link wastModule PreProc
+hi def link wastListDelimiter Delimiter
+hi def link wastInstWithType Operator
+hi def link wastInstGeneral Operator
+hi def link wastControlInst Statement
+hi def link wastParamInst Conditional
+hi def link wastString String
+hi def link wastStringSpecial Special
+hi def link wastNamedVar Identifier
+hi def link wastUnnamedVar PreProc
+hi def link wastFloat Float
+hi def link wastNumber Number
+hi def link wastComment Comment
+hi def link wastType Type
+
+let b:current_syntax = "wast"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/wdiff.vim b/runtime/syntax/wdiff.vim
index 9cd0611819..d0afadff2f 100644
--- a/runtime/syntax/wdiff.vim
+++ b/runtime/syntax/wdiff.vim
@@ -9,11 +9,8 @@
" SPAM is _NOT_ welcome - be ready to be reported!
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syn clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -23,21 +20,10 @@ syn region wdiffNew start="{+" end="+}"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_wdiff_syn_inits")
- let did_wdiff_syn_inits = 1
- if version < 508
- let did_wdiff_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink wdiffOld Special
- HiLink wdiffNew Identifier
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link wdiffOld Special
+hi def link wdiffNew Identifier
+
let b:current_syntax = "wdiff"
diff --git a/runtime/syntax/web.vim b/runtime/syntax/web.vim
index f7a7fdfdc2..54eebda399 100644
--- a/runtime/syntax/web.vim
+++ b/runtime/syntax/web.vim
@@ -8,11 +8,8 @@
" the standard WEB distribution, available for anonymous ftp at
" ftp://labrea.stanford.edu/pub/tex/web/.
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -20,12 +17,8 @@ endif
" we base this syntax file on the modern superset, CWEB. Note: This shortcut
" may introduce some illegal constructs, e.g., CWEB's "@c" does _not_ start a
" code section in WEB. Anyway, I'm not a WEB programmer.
-if version < 600
- source <sfile>:p:h/cweb.vim
-else
- runtime! syntax/cweb.vim
- unlet b:current_syntax
-endif
+runtime! syntax/cweb.vim
+unlet b:current_syntax
" Replace C/C++ syntax by Pascal syntax.
syntax include @webIncludedC <sfile>:p:h/pascal.vim
diff --git a/runtime/syntax/webmacro.vim b/runtime/syntax/webmacro.vim
index 3b863f7c37..fb1fff6d3d 100644
--- a/runtime/syntax/webmacro.vim
+++ b/runtime/syntax/webmacro.vim
@@ -11,21 +11,16 @@
" For version 5.x: Clear all syntax items
" For version 6.x: Quit when a syntax file was already loaded
if !exists("main_syntax")
- if version < 600
- syntax clear
- elseif exists("b:current_syntax")
+ " quit when a syntax file was already loaded
+ if exists("b:current_syntax")
finish
endif
let main_syntax = 'webmacro'
endif
-if version < 600
- source <sfile>:p:h/html.vim
-else
- runtime! syntax/html.vim
- unlet b:current_syntax
-endif
+runtime! syntax/html.vim
+unlet b:current_syntax
syn cluster htmlPreProc add=webmacroIf,webmacroUse,webmacroBraces,webmacroParse,webmacroInclude,webmacroSet,webmacroForeach,webmacroComment
@@ -49,31 +44,21 @@ syn match webmacroComment "##.*$"
syn match webmacroHash "[#{}\$]" contained
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_webmacro_syn_inits")
- if version < 508
- let did_webmacro_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink webmacroComment CommentTitle
- HiLink webmacroVariable PreProc
- HiLink webmacroIf webmacroStatement
- HiLink webmacroForeach webmacroStatement
- HiLink webmacroSet webmacroStatement
- HiLink webmacroInclude webmacroStatement
- HiLink webmacroParse webmacroStatement
- HiLink webmacroStatement Function
- HiLink webmacroNumber Number
- HiLink webmacroBoolean Boolean
- HiLink webmacroSpecial Special
- HiLink webmacroString String
- HiLink webmacroBracesError Error
- delcommand HiLink
-endif
+hi def link webmacroComment CommentTitle
+hi def link webmacroVariable PreProc
+hi def link webmacroIf webmacroStatement
+hi def link webmacroForeach webmacroStatement
+hi def link webmacroSet webmacroStatement
+hi def link webmacroInclude webmacroStatement
+hi def link webmacroParse webmacroStatement
+hi def link webmacroStatement Function
+hi def link webmacroNumber Number
+hi def link webmacroBoolean Boolean
+hi def link webmacroSpecial Special
+hi def link webmacroString String
+hi def link webmacroBracesError Error
let b:current_syntax = "webmacro"
diff --git a/runtime/syntax/winbatch.vim b/runtime/syntax/winbatch.vim
index aea2cdebcb..15ea0fc77b 100644
--- a/runtime/syntax/winbatch.vim
+++ b/runtime/syntax/winbatch.vim
@@ -4,11 +4,8 @@
" URL: http://www.mggen.com/vim/syntax/winbatch.zip
" Last change: 2001 May 10
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -158,29 +155,19 @@ syn keyword winbatchImplicit xgetchildhwnd xgetelapsed xhex xmemcompact xmessage
syn keyword winbatchImplicit xsendmessage xverifyccard yield
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_winbatch_syntax_inits")
- if version < 508
- let did_winbatch_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+" Only when an item doesn't have highlighting yet
- HiLink winbatchLabel PreProc
- HiLink winbatchCtl Operator
- HiLink winbatchStatement Statement
- HiLink winbatchTodo Todo
- HiLink winbatchString String
- HiLink winbatchVar Type
- HiLink winbatchComment Comment
- HiLink winbatchImplicit Special
- HiLink winbatchNumber Number
- HiLink winbatchConstant StorageClass
+hi def link winbatchLabel PreProc
+hi def link winbatchCtl Operator
+hi def link winbatchStatement Statement
+hi def link winbatchTodo Todo
+hi def link winbatchString String
+hi def link winbatchVar Type
+hi def link winbatchComment Comment
+hi def link winbatchImplicit Special
+hi def link winbatchNumber Number
+hi def link winbatchConstant StorageClass
- delcommand HiLink
-endif
let b:current_syntax = "winbatch"
diff --git a/runtime/syntax/wml.vim b/runtime/syntax/wml.vim
index 5957930c8e..73bf822e40 100644
--- a/runtime/syntax/wml.vim
+++ b/runtime/syntax/wml.vim
@@ -16,21 +16,14 @@
" vim-package around your corner :)
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syn clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
" A lot of the web stuff looks like HTML so we load that first
-if version < 600
- so <sfile>:p:h/html.vim
-else
- runtime! syntax/html.vim
-endif
+runtime! syntax/html.vim
unlet b:current_syntax
if !exists("main_syntax")
@@ -108,11 +101,7 @@ syn region htmlTagName start="\<\(define-tag\|define-region\)" end="\>" cont
" The perl include stuff
if main_syntax != 'perl'
" Perl script
- if version < 600
- syn include @wmlPerlScript <sfile>:p:h/perl.vim
- else
- syn include @wmlPerlScript syntax/perl.vim
- endif
+ syn include @wmlPerlScript syntax/perl.vim
unlet b:current_syntax
syn region perlScript start=+<perl>+ keepend end=+</perl>+ contains=@wmlPerlScript,wmlPerlTag
@@ -140,33 +129,22 @@ if main_syntax == "html"
endif
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_wml_syn_inits")
- let did_wml_syn_inits = 1
- if version < 508
- let did_wml_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink wmlNextLine Special
- HiLink wmlUse Include
- HiLink wmlUsed String
- HiLink wmlBody Special
- HiLink wmlDiverted Label
- HiLink wmlDivert Delimiter
- HiLink wmlDivertEnd Delimiter
- HiLink wmlLocationId Label
- HiLink wmlLocation Delimiter
-" HiLink wmlLocationed Delimiter
- HiLink wmlDefineName String
- HiLink wmlComment Comment
- HiLink wmlInclude Include
- HiLink wmlSharpBang PreProc
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link wmlNextLine Special
+hi def link wmlUse Include
+hi def link wmlUsed String
+hi def link wmlBody Special
+hi def link wmlDiverted Label
+hi def link wmlDivert Delimiter
+hi def link wmlDivertEnd Delimiter
+hi def link wmlLocationId Label
+hi def link wmlLocation Delimiter
+" hi def link wmlLocationed Delimiter
+hi def link wmlDefineName String
+hi def link wmlComment Comment
+hi def link wmlInclude Include
+hi def link wmlSharpBang PreProc
+
let b:current_syntax = "wml"
diff --git a/runtime/syntax/wsml.vim b/runtime/syntax/wsml.vim
index 2a92a0d548..d01294caac 100644
--- a/runtime/syntax/wsml.vim
+++ b/runtime/syntax/wsml.vim
@@ -4,10 +4,8 @@
" URL: none
" Last Change: 2006 Apr 30
-" Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -78,47 +76,37 @@ syn match wsmlSpecial "\\u\d\{4\}"
syn cluster wsmlTop add=wsmlString,wsmlCharacter,wsmlNumber,wsmlSpecial,wsmlStringError
" Define the default highlighting.
-" " For version 5.7 and earlier: only when not done already
-" " For version 5.8 and later: only when an item doesn't have highlighting yet
- if version >= 508 || !exists("did_wsml_syn_inits")
- if version < 508
- let did_wsml_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink wsmlHeader TypeDef
- HiLink wsmlNamespace TypeDef
- HiLink wsmlOntology Statement
- HiLink wsmlAxiom TypeDef
- HiLink wsmlService TypeDef
- HiLink wsmlNFP TypeDef
- HiLink wsmlTopLevel TypeDef
- HiLink wsmlMediation TypeDef
- HiLink wsmlBehavioral TypeDef
- HiLink wsmlChoreographyPri TypeDef
- HiLink wsmlChoreographySec Operator
- HiLink wsmlChoreographyTer Special
- HiLink wsmlString String
- HiLink wsmlIdentifier Normal
- HiLink wsmlSqName Normal
- HiLink wsmlVariable Define
- HiLink wsmlKeywordsInsideLEs Operator
- HiLink wsmlOperator Operator
- HiLink wsmlBrace Operator
- HiLink wsmlCharacter Character
- HiLink wsmlNumber Number
- HiLink wsmlDataTypes Special
- HiLink wsmlComment Comment
- HiLink wsmlDocComment Comment
- HiLink wsmlLineComment Comment
- HiLink wsmlTodo Todo
- HiLink wsmlFixMe Error
- HiLink wsmlCommentTitle SpecialComment
- HiLink wsmlCommentStar wsmlComment
- endif
+" Only when an item doesn't have highlighting yet
+hi def link wsmlHeader TypeDef
+hi def link wsmlNamespace TypeDef
+hi def link wsmlOntology Statement
+hi def link wsmlAxiom TypeDef
+hi def link wsmlService TypeDef
+hi def link wsmlNFP TypeDef
+hi def link wsmlTopLevel TypeDef
+hi def link wsmlMediation TypeDef
+hi def link wsmlBehavioral TypeDef
+hi def link wsmlChoreographyPri TypeDef
+hi def link wsmlChoreographySec Operator
+hi def link wsmlChoreographyTer Special
+hi def link wsmlString String
+hi def link wsmlIdentifier Normal
+hi def link wsmlSqName Normal
+hi def link wsmlVariable Define
+hi def link wsmlKeywordsInsideLEs Operator
+hi def link wsmlOperator Operator
+hi def link wsmlBrace Operator
+hi def link wsmlCharacter Character
+hi def link wsmlNumber Number
+hi def link wsmlDataTypes Special
+hi def link wsmlComment Comment
+hi def link wsmlDocComment Comment
+hi def link wsmlLineComment Comment
+hi def link wsmlTodo Todo
+hi def link wsmlFixMe Error
+hi def link wsmlCommentTitle SpecialComment
+hi def link wsmlCommentStar wsmlComment
-delcommand HiLink
let b:current_syntax = "wsml"
let b:spell_options="contained"
diff --git a/runtime/syntax/xdefaults.vim b/runtime/syntax/xdefaults.vim
index 5e38952a75..7da5969cde 100644
--- a/runtime/syntax/xdefaults.vim
+++ b/runtime/syntax/xdefaults.vim
@@ -10,11 +10,8 @@
" xrdb manual page
" xrdb source: ftp://ftp.x.org/pub/R6.4/xc/programs/xrdb/xrdb.c
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -109,36 +106,26 @@ syn keyword xdefaultsSymbol contained X_RESOLUTION
syn keyword xdefaultsSymbol contained Y_RESOLUTION
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_xdefaults_syntax_inits")
- if version < 508
- let did_xdefaults_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
- HiLink xdefaultsLabel Type
- HiLink xdefaultsValue Constant
- HiLink xdefaultsComment Comment
- HiLink xdefaultsCommentH xdefaultsComment
- HiLink xdefaultsPreProc PreProc
- HiLink xdefaultsInclude xdefaultsPreProc
- HiLink xdefaultsCppSkip xdefaultsCppOut
- HiLink xdefaultsCppOut2 xdefaultsCppOut
- HiLink xdefaultsCppOut Comment
- HiLink xdefaultsIncluded String
- HiLink xdefaultsDefine Macro
- HiLink xdefaultsSymbol Statement
- HiLink xdefaultsSpecial Statement
- HiLink xdefaultsErrorLine Error
- HiLink xdefaultsCommentError Error
- HiLink xdefaultsPunct Normal
- HiLink xdefaultsLineEnd Special
- HiLink xdefaultsTodo Todo
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+hi def link xdefaultsLabel Type
+hi def link xdefaultsValue Constant
+hi def link xdefaultsComment Comment
+hi def link xdefaultsCommentH xdefaultsComment
+hi def link xdefaultsPreProc PreProc
+hi def link xdefaultsInclude xdefaultsPreProc
+hi def link xdefaultsCppSkip xdefaultsCppOut
+hi def link xdefaultsCppOut2 xdefaultsCppOut
+hi def link xdefaultsCppOut Comment
+hi def link xdefaultsIncluded String
+hi def link xdefaultsDefine Macro
+hi def link xdefaultsSymbol Statement
+hi def link xdefaultsSpecial Statement
+hi def link xdefaultsErrorLine Error
+hi def link xdefaultsCommentError Error
+hi def link xdefaultsPunct Normal
+hi def link xdefaultsLineEnd Special
+hi def link xdefaultsTodo Todo
+
let b:current_syntax = "xdefaults"
diff --git a/runtime/syntax/xf86conf.vim b/runtime/syntax/xf86conf.vim
index 62784d2285..545eda7db0 100644
--- a/runtime/syntax/xf86conf.vim
+++ b/runtime/syntax/xf86conf.vim
@@ -10,12 +10,8 @@
" to force XFree86 3.x or 4.x XF86Config syntax
" Setup
-if version >= 600
- if exists("b:current_syntax")
- finish
- endif
-else
- echo "Sorry, but this syntax file relies on Vim 6 features. Either upgrade Vim or usea version of " . expand("<sfile>:t:r") . " syntax file appropriate for Vim " . version/100 . "." . version %100 . "."
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
diff --git a/runtime/syntax/xinetd.vim b/runtime/syntax/xinetd.vim
index 9010a48a1d..fab3a916ea 100644
--- a/runtime/syntax/xinetd.vim
+++ b/runtime/syntax/xinetd.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: xinetd.conf(5) configuration file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: xinetd.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/xkb.vim b/runtime/syntax/xkb.vim
index ff9bfd0dae..59fc497e62 100644
--- a/runtime/syntax/xkb.vim
+++ b/runtime/syntax/xkb.vim
@@ -6,12 +6,9 @@
" URL: http://trific.ath.cx/Ftp/vim/syntax/xkb.vim
" Setup
-if version >= 600
- if exists("b:current_syntax")
- finish
- endif
-else
- syntax clear
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
endif
syn case match
@@ -50,42 +47,33 @@ syn keyword xkbTModif default hidden partial virtual
syn keyword xkbSect alphanumeric_keys alternate_group function_keys keypad_keys modifier_keys xkb_compatibility xkb_geometry xkb_keycodes xkb_keymap xkb_semantics xkb_symbols xkb_types
" Define the default highlighting
-if version >= 508 || !exists("did_xkb_syntax_inits")
- if version < 508
- let did_xkb_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink xkbModif xkbPreproc
- HiLink xkbTModif xkbPreproc
- HiLink xkbPreproc Preproc
-
- HiLink xkbIdentifier Keyword
- HiLink xkbFunction Function
- HiLink xkbSect Type
- HiLink xkbPhysicalKey Identifier
- HiLink xkbKeyword Keyword
-
- HiLink xkbComment Comment
- HiLink xkbTodo Todo
-
- HiLink xkbConstant Constant
- HiLink xkbString String
-
- HiLink xkbSpecialChar xkbSpecial
- HiLink xkbSpecial Special
-
- HiLink xkbParenError xkbBalancingError
- HiLink xkbBraceError xkbBalancingError
- HiLink xkbBraketError xkbBalancingError
- HiLink xkbBalancingError xkbError
- HiLink xkbCommentStartError xkbCommentError
- HiLink xkbCommentError xkbError
- HiLink xkbError Error
-
- delcommand HiLink
-endif
+
+hi def link xkbModif xkbPreproc
+hi def link xkbTModif xkbPreproc
+hi def link xkbPreproc Preproc
+
+hi def link xkbIdentifier Keyword
+hi def link xkbFunction Function
+hi def link xkbSect Type
+hi def link xkbPhysicalKey Identifier
+hi def link xkbKeyword Keyword
+
+hi def link xkbComment Comment
+hi def link xkbTodo Todo
+
+hi def link xkbConstant Constant
+hi def link xkbString String
+
+hi def link xkbSpecialChar xkbSpecial
+hi def link xkbSpecial Special
+
+hi def link xkbParenError xkbBalancingError
+hi def link xkbBraceError xkbBalancingError
+hi def link xkbBraketError xkbBalancingError
+hi def link xkbBalancingError xkbError
+hi def link xkbCommentStartError xkbCommentError
+hi def link xkbCommentError xkbError
+hi def link xkbError Error
+
let b:current_syntax = "xkb"
diff --git a/runtime/syntax/xmath.vim b/runtime/syntax/xmath.vim
index 5434f928c7..22b3e85dae 100644
--- a/runtime/syntax/xmath.vim
+++ b/runtime/syntax/xmath.vim
@@ -1,15 +1,13 @@
" Vim syntax file
" Language: xmath (a simulation tool)
" Maintainer: Charles E. Campbell <NdrOchipS@PcampbellAfamily.Mbiz>
-" Last Change: Sep 11, 2006
-" Version: 7
+" Last Change: Aug 31, 2016
+" Version: 9
" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_XMATH
" For version 5.x: Clear all syntax items
" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+if exists("b:current_syntax")
finish
endif
@@ -194,41 +192,32 @@ syn sync match xmathSyncComment grouphere xmathCommentBlock "#{"
syn sync match xmathSyncComment groupthere NONE "}#"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_xmath_syntax_inits")
- if version < 508
- let did_xmath_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink xmathBraceError xmathError
- HiLink xmathCmd xmathStatement
- HiLink xmathCommentBlock xmathComment
- HiLink xmathCurlyError xmathError
- HiLink xmathFuncCmd xmathStatement
- HiLink xmathParenError xmathError
+if !exists("skip_xmath_syntax_inits")
+
+ hi def link xmathBraceError xmathError
+ hi def link xmathCmd xmathStatement
+ hi def link xmathCommentBlock xmathComment
+ hi def link xmathCurlyError xmathError
+ hi def link xmathFuncCmd xmathStatement
+ hi def link xmathParenError xmathError
" The default methods for highlighting. Can be overridden later
- HiLink xmathCharacter Character
- HiLink xmathComma Delimiter
- HiLink xmathComment Comment
- HiLink xmathCommentBlock Comment
- HiLink xmathConditional Conditional
- HiLink xmathError Error
- HiLink xmathFunc Function
- HiLink xmathLabel PreProc
- HiLink xmathNumber Number
- HiLink xmathRepeat Repeat
- HiLink xmathSpecial Type
- HiLink xmathSpecialChar SpecialChar
- HiLink xmathStatement Statement
- HiLink xmathString String
- HiLink xmathTodo Todo
-
- delcommand HiLink
+ hi def link xmathCharacter Character
+ hi def link xmathComma Delimiter
+ hi def link xmathComment Comment
+ hi def link xmathCommentBlock Comment
+ hi def link xmathConditional Conditional
+ hi def link xmathError Error
+ hi def link xmathFunc Function
+ hi def link xmathLabel PreProc
+ hi def link xmathNumber Number
+ hi def link xmathRepeat Repeat
+ hi def link xmathSpecial Type
+ hi def link xmathSpecialChar SpecialChar
+ hi def link xmathStatement Statement
+ hi def link xmathString String
+ hi def link xmathTodo Todo
+
endif
let b:current_syntax = "xmath"
diff --git a/runtime/syntax/xmodmap.vim b/runtime/syntax/xmodmap.vim
index 69c70c563d..28cae3eb71 100644
--- a/runtime/syntax/xmodmap.vim
+++ b/runtime/syntax/xmodmap.vim
@@ -1,7 +1,7 @@
" Vim syntax file
-" Language: xmodmap(1) definition file
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-19
+" Language: xmodmap(1) definition file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
if exists("b:current_syntax")
finish
diff --git a/runtime/syntax/xpm.vim b/runtime/syntax/xpm.vim
index 3cbc1b54fd..0667ca28ad 100644
--- a/runtime/syntax/xpm.vim
+++ b/runtime/syntax/xpm.vim
@@ -1,14 +1,12 @@
" Vim syntax file
" Language: X Pixmap
" Maintainer: Ronald Schild <rs@scutum.de>
-" Last Change: 2008 May 28
+" Last Change: 2017 Feb 01
" Version: 5.4n.1
+" Jemma Nelson added termguicolors support
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -18,7 +16,7 @@ syn keyword xpmTodo TODO FIXME XXX contained
syn region xpmComment start="/\*" end="\*/" contains=xpmTodo
syn region xpmPixelString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@xpmColors
-if has("gui_running")
+if has("gui_running") || has("termguicolors") && &termguicolors
let color = ""
let chars = ""
@@ -123,27 +121,17 @@ endwhile
unlet color chars colors cpp n i s
-endif " has("gui_running")
+endif " has("gui_running") || has("termguicolors") && &termguicolors
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_xpm_syntax_inits")
- if version < 508
- let did_xpm_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink xpmType Type
- HiLink xpmStorageClass StorageClass
- HiLink xpmTodo Todo
- HiLink xpmComment Comment
- HiLink xpmPixelString String
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link xpmType Type
+hi def link xpmStorageClass StorageClass
+hi def link xpmTodo Todo
+hi def link xpmComment Comment
+hi def link xpmPixelString String
+
let b:current_syntax = "xpm"
diff --git a/runtime/syntax/xpm2.vim b/runtime/syntax/xpm2.vim
index 74b3c66af2..dfa6945a31 100644
--- a/runtime/syntax/xpm2.vim
+++ b/runtime/syntax/xpm2.vim
@@ -1,17 +1,15 @@
" Vim syntax file
" Language: X Pixmap v2
" Maintainer: Steve Wall (hitched97@velnet.com)
-" Last Change: 2012 Jun 01
+" Last Change: 2017 Feb 01
" (Dominique Pelle added @Spell)
" Version: 5.8
+" Jemma Nelson added termguicolors support
"
" Made from xpm.vim by Ronald Schild <rs@scutum.de>
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -23,15 +21,9 @@ syn keyword xpm2Todo TODO FIXME XXX contained
syn match xpm2Comment "\!.*$" contains=@Spell,xpm2Todo
-if version < 508
- command -nargs=+ HiLink hi link <args>
- command -nargs=+ Hi hi <args>
-else
- command -nargs=+ HiLink hi def link <args>
- command -nargs=+ Hi hi def <args>
-endif
+command -nargs=+ Hi hi def <args>
-if has("gui_running")
+if has("gui_running") || has("termguicolors") && &termguicolors
let color = ""
let chars = ""
@@ -63,7 +55,7 @@ if has("gui_running")
if s !~ '/'
exe 'syn match xpm2Values /' . s . '/'
endif
- HiLink xpm2Values Statement
+ hi def link xpm2Values Statement
let n = 1 " n = color index
@@ -112,11 +104,11 @@ if has("gui_running")
" now create syntax items
" highlight the color string as normal string (no pixel string)
exe 'syn match xpm2Col'.n.'Def /'.s.'/ contains=xpm2Col'.n.'inDef'
- exe 'HiLink xpm2Col'.n.'Def Constant'
+ exe 'hi def link xpm2Col'.n.'Def Constant'
" but highlight the first whitespace after chars in its color
exe 'syn match xpm2Col'.n.'inDef /^'.chars.'/hs=s+'.(cpp).' contained'
- exe 'HiLink xpm2Col'.n.'inDef xpm2Color'.n
+ exe 'hi def link xpm2Col'.n.'inDef xpm2Color'.n
" remove the following whitespace from chars
let chars = substitute(chars, '\\s\\+$', '', '')
@@ -141,24 +133,17 @@ if has("gui_running")
unlet color chars colors cpp n i s
-endif " has("gui_running")
+endif " has("gui_running") || has("termguicolors") && &termguicolors
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_xpm2_syntax_inits")
- if version < 508
- let did_xpm2_syntax_inits = 1
- endif
-
- " The default highlighting.
- HiLink xpm2Type Type
- HiLink xpm2StorageClass StorageClass
- HiLink xpm2Todo Todo
- HiLink xpm2Comment Comment
- HiLink xpm2PixelString String
-endif
-delcommand HiLink
+" Only when an item doesn't have highlighting yet
+" The default highlighting.
+hi def link xpm2Type Type
+hi def link xpm2StorageClass StorageClass
+hi def link xpm2Todo Todo
+hi def link xpm2Comment Comment
+hi def link xpm2PixelString String
+
delcommand Hi
let b:current_syntax = "xpm2"
diff --git a/runtime/syntax/xs.vim b/runtime/syntax/xs.vim
index 6fd0a468f9..3e658b4a83 100644
--- a/runtime/syntax/xs.vim
+++ b/runtime/syntax/xs.vim
@@ -3,27 +3,19 @@
" Author: Autogenerated from perl headers, on an original basis of Michael W. Dodge <sarge@pobox.com>
" Maintainer: vim-perl <vim-perl@googlegroups.com>
" Previous: Vincent Pit <perl@profvince.com>
-" Last Change: 2013-05-12
+" Last Change: 2017-09-12
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+if exists("b:current_syntax")
finish
endif
-" Read the C syntax to start with
-if version < 600
- source <sfile>:p:h/c.vim
-else
- runtime! syntax/c.vim
-endif
+runtime! syntax/c.vim
-let xs_superseded = 1 " mark C functions superseded by Perl replacements
-let xs_not_core = 1 " mark private core functions
+" Configuration:
+" let xs_superseded = 0 " mark C functions superseded by Perl replacements (ex. memcpy vs Copy)
+" let xs_not_core = 0 " mark private core functions
-if exists("xs_superseded") && xs_superseded
+if get(g:, 'xs_superseded', 0)
syn keyword xsSuperseded atof atol calloc clearerr exit fclose feof ferror
syn keyword xsSuperseded fflush fgetc fgetpos fgets fopen fprintf fputc fputs
syn keyword xsSuperseded fread free freopen fseek fsetpos fwrite getc getenv
@@ -35,45 +27,78 @@ syn keyword xsSuperseded strcat strcmp strcpy strdup strlen strncat strncmp
syn keyword xsSuperseded strncpy strstr strtod strtol strtoul system tolower
syn keyword xsSuperseded toupper ungetc
endif
-if exists("xs_not_core") && xs_not_core
+if get(g:, 'xs_not_core', 0)
syn keyword xsPrivate F0convert Perl__add_range_to_invlist
-syn keyword xsPrivate Perl__core_swash_init Perl__invlist_contents
+syn keyword xsPrivate Perl__core_swash_init Perl__get_encoding
+syn keyword xsPrivate Perl__get_swash_invlist Perl__invlist_contents
+syn keyword xsPrivate Perl__invlist_dump
syn keyword xsPrivate Perl__invlist_intersection_maybe_complement_2nd
-syn keyword xsPrivate Perl__invlist_invert Perl__invlist_invert_prop
-syn keyword xsPrivate Perl__invlist_populate_swatch
+syn keyword xsPrivate Perl__invlist_invert Perl__invlist_populate_swatch
+syn keyword xsPrivate Perl__invlist_search
syn keyword xsPrivate Perl__invlist_union_maybe_complement_2nd
-syn keyword xsPrivate Perl__is_utf8__perl_idstart Perl__new_invlist
-syn keyword xsPrivate Perl__swash_inversion_hash Perl__swash_to_invlist
-syn keyword xsPrivate Perl__to_fold_latin1 Perl_av_reify Perl_emulate_cop_io
-syn keyword xsPrivate Perl_find_rundefsvoffset Perl_get_re_arg
-syn keyword xsPrivate Perl_is_utf8_X_L Perl_is_utf8_X_LV Perl_is_utf8_X_LVT
-syn keyword xsPrivate Perl_is_utf8_X_LV_LVT_V Perl_is_utf8_X_T
-syn keyword xsPrivate Perl_is_utf8_X_V Perl_is_utf8_X_begin
-syn keyword xsPrivate Perl_is_utf8_X_extend Perl_is_utf8_X_non_hangul
-syn keyword xsPrivate Perl_is_utf8_X_prepend Perl_is_utf8_char
-syn keyword xsPrivate Perl_new_warnings_bitfield Perl_op_clear
-syn keyword xsPrivate Perl_ptr_table_clear Perl_qerror Perl_reg_named_buff
-syn keyword xsPrivate Perl_reg_named_buff_iter Perl_reg_numbered_buff_fetch
+syn keyword xsPrivate Perl__load_PL_utf8_foldclosures Perl__new_invlist
+syn keyword xsPrivate Perl__setup_canned_invlist Perl__swash_inversion_hash
+syn keyword xsPrivate Perl__swash_to_invlist Perl__to_fold_latin1
+syn keyword xsPrivate Perl__warn_problematic_locale Perl_av_reify
+syn keyword xsPrivate Perl_current_re_engine Perl_cv_ckproto_len_flags
+syn keyword xsPrivate Perl_emulate_cop_io Perl_find_rundefsvoffset
+syn keyword xsPrivate Perl_get_re_arg Perl_grok_atoUV Perl_isALNUM_lazy
+syn keyword xsPrivate Perl_isIDFIRST_lazy Perl_is_uni_alnum
+syn keyword xsPrivate Perl_is_uni_alnum_lc Perl_is_uni_alnumc
+syn keyword xsPrivate Perl_is_uni_alnumc_lc Perl_is_uni_alpha
+syn keyword xsPrivate Perl_is_uni_alpha_lc Perl_is_uni_ascii
+syn keyword xsPrivate Perl_is_uni_ascii_lc Perl_is_uni_blank
+syn keyword xsPrivate Perl_is_uni_blank_lc Perl_is_uni_cntrl
+syn keyword xsPrivate Perl_is_uni_cntrl_lc Perl_is_uni_digit
+syn keyword xsPrivate Perl_is_uni_digit_lc Perl_is_uni_graph
+syn keyword xsPrivate Perl_is_uni_graph_lc Perl_is_uni_idfirst
+syn keyword xsPrivate Perl_is_uni_idfirst_lc Perl_is_uni_lower
+syn keyword xsPrivate Perl_is_uni_lower_lc Perl_is_uni_print
+syn keyword xsPrivate Perl_is_uni_print_lc Perl_is_uni_punct
+syn keyword xsPrivate Perl_is_uni_punct_lc Perl_is_uni_space
+syn keyword xsPrivate Perl_is_uni_space_lc Perl_is_uni_upper
+syn keyword xsPrivate Perl_is_uni_upper_lc Perl_is_uni_xdigit
+syn keyword xsPrivate Perl_is_uni_xdigit_lc Perl_is_utf8_alnum
+syn keyword xsPrivate Perl_is_utf8_alnumc Perl_is_utf8_alpha
+syn keyword xsPrivate Perl_is_utf8_ascii Perl_is_utf8_blank Perl_is_utf8_char
+syn keyword xsPrivate Perl_is_utf8_cntrl Perl_is_utf8_digit
+syn keyword xsPrivate Perl_is_utf8_graph Perl_is_utf8_idcont
+syn keyword xsPrivate Perl_is_utf8_idfirst Perl_is_utf8_lower
+syn keyword xsPrivate Perl_is_utf8_mark Perl_is_utf8_perl_space
+syn keyword xsPrivate Perl_is_utf8_perl_word Perl_is_utf8_posix_digit
+syn keyword xsPrivate Perl_is_utf8_print Perl_is_utf8_punct
+syn keyword xsPrivate Perl_is_utf8_space Perl_is_utf8_upper
+syn keyword xsPrivate Perl_is_utf8_xdigit Perl_is_utf8_xidcont
+syn keyword xsPrivate Perl_is_utf8_xidfirst Perl_mg_find_mglob Perl_mg_length
+syn keyword xsPrivate Perl_multideref_stringify Perl_new_warnings_bitfield
+syn keyword xsPrivate Perl_op_clear Perl_ptr_table_clear Perl_qerror
+syn keyword xsPrivate Perl_reg_named_buff Perl_reg_named_buff_iter
+syn keyword xsPrivate Perl_reg_numbered_buff_fetch
syn keyword xsPrivate Perl_reg_numbered_buff_length
syn keyword xsPrivate Perl_reg_numbered_buff_store Perl_reg_qr_package
syn keyword xsPrivate Perl_reg_temp_copy Perl_regprop Perl_report_uninit
-syn keyword xsPrivate Perl_sv_compile_2op Perl_sv_setsv_cow
-syn keyword xsPrivate Perl_try_amagic_bin Perl_try_amagic_un
-syn keyword xsPrivate Perl_utf8_to_uvchr Perl_utf8_to_uvuni
-syn keyword xsPrivate Perl_vivify_defelem Perl_yylex S_F0convert S_Slab_to_rw
-syn keyword xsPrivate S__append_range_to_invlist S__new_invlist_C_array
-syn keyword xsPrivate S_add_alternate S_add_data S_add_utf16_textfilter
-syn keyword xsPrivate S_adjust_stack_on_leave S_amagic_cmp
+syn keyword xsPrivate Perl_sv_magicext_mglob Perl_sv_setsv_cow
+syn keyword xsPrivate Perl_to_uni_lower_lc Perl_to_uni_title_lc
+syn keyword xsPrivate Perl_to_uni_upper_lc Perl_try_amagic_bin
+syn keyword xsPrivate Perl_try_amagic_un Perl_utf8_to_uvchr
+syn keyword xsPrivate Perl_utf8_to_uvuni Perl_utf8_to_uvuni_buf
+syn keyword xsPrivate Perl_valid_utf8_to_uvuni Perl_validate_proto
+syn keyword xsPrivate Perl_vivify_defelem Perl_yylex S_F0convert
+syn keyword xsPrivate S__append_range_to_invlist S__make_exactf_invlist
+syn keyword xsPrivate S_add_above_Latin1_folds S_add_data S_add_multi_match
+syn keyword xsPrivate S_add_utf16_textfilter S_adjust_size_and_find_bucket
+syn keyword xsPrivate S_advance_one_SB S_advance_one_WB S_amagic_cmp
syn keyword xsPrivate S_amagic_cmp_locale S_amagic_i_ncmp S_amagic_ncmp
syn keyword xsPrivate S_anonymise_cv_maybe S_ao S_apply_attrs
syn keyword xsPrivate S_apply_attrs_my S_assert_uft8_cache_coherent
-syn keyword xsPrivate S_bad_type_pv S_bad_type_sv S_bytes_to_uni
+syn keyword xsPrivate S_assignment_type S_backup_one_SB S_backup_one_WB
+syn keyword xsPrivate S_bad_type_gv S_bad_type_pv
syn keyword xsPrivate S_check_locale_boundary_crossing S_check_type_and_open
-syn keyword xsPrivate S_check_uni S_checkcomma S_checkposixcc S_ckwarn_common
-syn keyword xsPrivate S_cl_and S_cl_anything S_cl_init S_cl_is_anything
-syn keyword xsPrivate S_cl_or S_clear_placeholders S_closest_cop S_cop_free
-syn keyword xsPrivate S_core_regclass_swash S_cr_textfilter S_curmad S_curse
-syn keyword xsPrivate S_cv_dump S_deb_curcv S_deb_stack_n S_debprof
+syn keyword xsPrivate S_check_uni S_checkcomma S_ckwarn_common
+syn keyword xsPrivate S_clear_placeholders S_clear_special_blocks
+syn keyword xsPrivate S_cntrl_to_mnemonic S_construct_ahocorasick_from_trie
+syn keyword xsPrivate S_cop_free S_could_it_be_a_POSIX_class S_cr_textfilter
+syn keyword xsPrivate S_curse S_cv_dump S_deb_curcv S_deb_stack_n S_debprof
syn keyword xsPrivate S_debug_start_match S_del_sv
syn keyword xsPrivate S_deprecate_commaless_var_list S_destroy_matcher
syn keyword xsPrivate S_div128 S_do_chomp S_do_delete_local S_do_oddball
@@ -89,103 +114,116 @@ syn keyword xsPrivate S_dump_trie_interim_table S_dumpuntil S_dup_attrlist
syn keyword xsPrivate S_exec_failed S_expect_number S_filter_gets
syn keyword xsPrivate S_finalize_op S_find_and_forget_pmops
syn keyword xsPrivate S_find_array_subscript S_find_beginning S_find_byclass
-syn keyword xsPrivate S_find_hash_subscript S_find_in_my_stash
-syn keyword xsPrivate S_find_uninit_var S_first_symbol S_fold_constants
-syn keyword xsPrivate S_forbid_setid S_force_ident S_force_list S_force_next
-syn keyword xsPrivate S_force_strict_version S_force_version S_force_word
-syn keyword xsPrivate S_forget_pmop S_gen_constant_list S_get_aux_mg
-syn keyword xsPrivate S_get_num S_glob_2number S_glob_assign_glob
-syn keyword xsPrivate S_glob_assign_ref S_grok_bslash_c S_grok_bslash_o
-syn keyword xsPrivate S_group_end S_gv_ename S_gv_get_super_pkg
-syn keyword xsPrivate S_gv_init_svtype S_gv_magicalize_isa
-syn keyword xsPrivate S_gv_magicalize_overload S_hfreeentries S_hsplit
-syn keyword xsPrivate S_hv_auxinit S_hv_delete_common S_hv_free_ent_ret
-syn keyword xsPrivate S_hv_magic_check S_hv_notallowed S_incline S_incpush
-syn keyword xsPrivate S_incpush_if_exists S_incpush_use_sep S_ingroup
-syn keyword xsPrivate S_init_ids S_init_interp S_init_main_stash
-syn keyword xsPrivate S_init_perllib S_init_postdump_symbols
-syn keyword xsPrivate S_init_predump_symbols S_inplace_aassign
-syn keyword xsPrivate S_intuit_method S_intuit_more S_invlist_extend
-syn keyword xsPrivate S_invlist_iternext S_invlist_search
-syn keyword xsPrivate S_invoke_exception_hook S_is_an_int
-syn keyword xsPrivate S_is_handle_constructor S_is_list_assignment
-syn keyword xsPrivate S_is_utf8_char_slow S_is_utf8_common S_isa_lookup
-syn keyword xsPrivate S_join_exact S_listkids S_looks_like_bool
-syn keyword xsPrivate S_magic_methcall1 S_make_matcher S_make_trie
-syn keyword xsPrivate S_make_trie_failtable S_matcher_matches_sv
+syn keyword xsPrivate S_find_default_stash S_find_hash_subscript
+syn keyword xsPrivate S_find_in_my_stash S_find_uninit_var S_first_symbol
+syn keyword xsPrivate S_fixup_errno_string S_fold_constants S_forbid_setid
+syn keyword xsPrivate S_force_ident S_force_ident_maybe_lex S_force_list
+syn keyword xsPrivate S_force_next S_force_strict_version S_force_version
+syn keyword xsPrivate S_force_word S_forget_pmop S_form_short_octal_warning
+syn keyword xsPrivate S_gen_constant_list S_get_ANYOF_cp_list_for_ssc
+syn keyword xsPrivate S_get_aux_mg S_get_num S_glob_2number
+syn keyword xsPrivate S_glob_assign_glob S_grok_bslash_N S_grok_bslash_c
+syn keyword xsPrivate S_grok_bslash_o S_group_end S_gv_init_svtype
+syn keyword xsPrivate S_gv_is_in_main S_gv_magicalize S_gv_magicalize_isa
+syn keyword xsPrivate S_handle_regex_sets S_hfreeentries S_hsplit
+syn keyword xsPrivate S_hv_auxinit S_hv_auxinit_internal S_hv_delete_common
+syn keyword xsPrivate S_hv_free_ent_ret S_hv_magic_check S_hv_notallowed
+syn keyword xsPrivate S_incline S_incpush S_incpush_if_exists
+syn keyword xsPrivate S_incpush_use_sep S_ingroup S_init_ids S_init_interp
+syn keyword xsPrivate S_init_main_stash S_init_perllib
+syn keyword xsPrivate S_init_postdump_symbols S_init_predump_symbols
+syn keyword xsPrivate S_inplace_aassign S_intuit_method S_intuit_more
+syn keyword xsPrivate S_invlist_extend S_invlist_iternext
+syn keyword xsPrivate S_invoke_exception_hook S_isFOO_lc S_isFOO_utf8_lc
+syn keyword xsPrivate S_isGCB S_isSB S_isWB S_is_an_int
+syn keyword xsPrivate S_is_handle_constructor S_is_ssc_worth_it S_isa_lookup
+syn keyword xsPrivate S_join_exact S_leave_common S_listkids
+syn keyword xsPrivate S_looks_like_bool S_magic_methcall1 S_make_matcher
+syn keyword xsPrivate S_make_trie S_matcher_matches_sv S_maybe_multimagic_gv
syn keyword xsPrivate S_mayberelocate S_measure_struct S_mem_log_common
-syn keyword xsPrivate S_mess_alloc S_method_common S_minus_v S_missingterm
-syn keyword xsPrivate S_modkids S_more_sv S_mro_clean_isarev
+syn keyword xsPrivate S_mess_alloc S_minus_v S_missingterm S_modkids
+syn keyword xsPrivate S_more_sv S_move_proto_attr S_mro_clean_isarev
syn keyword xsPrivate S_mro_gather_and_rename S_mro_get_linear_isa_dfs
-syn keyword xsPrivate S_mul128 S_mulexp10 S_my_exit_jump S_my_kid S_need_utf8
-syn keyword xsPrivate S_newDEFSVOP S_newGIVWHENOP S_new_constant S_new_he
-syn keyword xsPrivate S_new_logop S_next_symbol S_nextchar
+syn keyword xsPrivate S_mul128 S_mulexp10 S_my_bytes_to_utf8 S_my_exit_jump
+syn keyword xsPrivate S_my_kid S_need_utf8 S_newGIVWHENOP S_new_constant
+syn keyword xsPrivate S_new_he S_new_logop S_next_symbol S_nextchar
syn keyword xsPrivate S_no_bareword_allowed S_no_fh_allowed S_no_op
-syn keyword xsPrivate S_not_a_number S_nuke_stacks S_num_overflow
-syn keyword xsPrivate S_open_script S_opt_scalarhv S_pack_rec
-syn keyword xsPrivate S_pad_alloc_name S_pad_check_dup S_pad_findlex
-syn keyword xsPrivate S_pad_reset S_parse_body S_path_is_absolute S_pidgone
-syn keyword xsPrivate S_pm_description S_pmtrans S_printbuf
-syn keyword xsPrivate S_process_special_blocks S_ptr_table_find S_put_byte
-syn keyword xsPrivate S_qsortsvu S_re_croak2 S_readpipe_override
-syn keyword xsPrivate S_ref_array_or_hash S_refcounted_he_value S_refkids
-syn keyword xsPrivate S_refto S_reg S_reg_check_named_buff_matched
-syn keyword xsPrivate S_reg_namedseq S_reg_node S_reg_recode S_reg_scan_name
-syn keyword xsPrivate S_reg_skipcomment S_reganode S_regatom S_regbranch
-syn keyword xsPrivate S_regclass S_regcppop S_regcppush S_regdump_extflags
-syn keyword xsPrivate S_reghop3 S_reghop4 S_reghopmaybe3 S_reginclass
-syn keyword xsPrivate S_reginsert S_regmatch S_regpiece S_regpposixcc
-syn keyword xsPrivate S_regrepeat S_regtail S_regtail_study S_regtry S_reguni
-syn keyword xsPrivate S_regwhite S_require_tie_mod S_restore_magic S_run_body
-syn keyword xsPrivate S_run_user_filter S_rxres_free S_rxres_restore
-syn keyword xsPrivate S_save_hek_flags S_save_lines S_save_magic
-syn keyword xsPrivate S_save_pushptri32ptr S_save_scalar_at S_scalar_mod_type
-syn keyword xsPrivate S_scalarboolean S_scalarkids S_scalarseq S_scan_commit
-syn keyword xsPrivate S_scan_const S_scan_formline S_scan_heredoc
-syn keyword xsPrivate S_scan_ident S_scan_inputsymbol S_scan_pat S_scan_str
-syn keyword xsPrivate S_scan_subst S_scan_trans S_scan_word S_search_const
-syn keyword xsPrivate S_sequence_num S_set_regclass_bit_fold
-syn keyword xsPrivate S_share_hek_flags S_simplify_sort S_skipspace
-syn keyword xsPrivate S_skipspace0 S_skipspace1 S_skipspace2 S_sortcv
-syn keyword xsPrivate S_sortcv_stacked S_sortcv_xsub
-syn keyword xsPrivate S_space_join_names_mortal S_start_force S_stdize_locale
-syn keyword xsPrivate S_strip_return S_study_chunk S_sublex_done
-syn keyword xsPrivate S_sublex_push S_sublex_start S_sv_2iuv_common
-syn keyword xsPrivate S_sv_2iuv_non_preserve S_sv_add_arena S_sv_dup_common
+syn keyword xsPrivate S_not_a_number S_not_incrementable S_nuke_stacks
+syn keyword xsPrivate S_num_overflow S_open_script S_openn_cleanup
+syn keyword xsPrivate S_openn_setup S_pack_rec S_pad_alloc_name
+syn keyword xsPrivate S_pad_check_dup S_pad_findlex S_pad_reset S_parse_body
+syn keyword xsPrivate S_parse_gv_stash_name S_parse_ident
+syn keyword xsPrivate S_parse_lparen_question_flags S_pending_ident S_pidgone
+syn keyword xsPrivate S_pm_description S_pmtrans
+syn keyword xsPrivate S_populate_ANYOF_from_invlist S_printbuf
+syn keyword xsPrivate S_process_special_blocks S_ptr_table_find
+syn keyword xsPrivate S_put_charclass_bitmap_innards S_put_code_point
+syn keyword xsPrivate S_put_range S_qsortsvu S_re_croak2 S_ref_array_or_hash
+syn keyword xsPrivate S_refcounted_he_value S_refkids S_refto S_reg
+syn keyword xsPrivate S_reg2Lanode S_reg_check_named_buff_matched S_reg_node
+syn keyword xsPrivate S_reg_recode S_reg_scan_name S_reganode S_regatom
+syn keyword xsPrivate S_regbranch S_regclass S_regcppop S_regcppush
+syn keyword xsPrivate S_regdump_extflags S_regdump_intflags
+syn keyword xsPrivate S_regex_set_precedence S_reghop3 S_reghop4
+syn keyword xsPrivate S_reghopmaybe3 S_reginclass S_reginsert S_regmatch
+syn keyword xsPrivate S_regnode_guts S_regpatws S_regpiece S_regrepeat
+syn keyword xsPrivate S_regtail S_regtail_study S_regtry S_require_tie_mod
+syn keyword xsPrivate S_restore_magic S_run_body S_run_user_filter
+syn keyword xsPrivate S_rxres_free S_rxres_restore S_save_hek_flags
+syn keyword xsPrivate S_save_lines S_save_magic_flags S_save_pushptri32ptr
+syn keyword xsPrivate S_save_scalar_at S_scalar_mod_type S_scalarboolean
+syn keyword xsPrivate S_scalarkids S_scalarseq S_scan_commit S_scan_const
+syn keyword xsPrivate S_scan_formline S_scan_heredoc S_scan_ident
+syn keyword xsPrivate S_scan_inputsymbol S_scan_pat S_scan_str S_scan_subst
+syn keyword xsPrivate S_scan_trans S_scan_word S_search_const S_sequence_num
+syn keyword xsPrivate S_set_ANYOF_arg S_share_hek_flags S_simplify_sort
+syn keyword xsPrivate S_skipspace_flags S_sortcv S_sortcv_stacked
+syn keyword xsPrivate S_sortcv_xsub S_space_join_names_mortal S_ssc_and
+syn keyword xsPrivate S_ssc_anything S_ssc_finalize S_ssc_init
+syn keyword xsPrivate S_ssc_is_anything S_ssc_is_cp_posixl_init S_ssc_or
+syn keyword xsPrivate S_stdize_locale S_strip_return S_study_chunk
+syn keyword xsPrivate S_sublex_done S_sublex_push S_sublex_start
+syn keyword xsPrivate S_sv_2iuv_common S_sv_2iuv_non_preserve S_sv_add_arena
+syn keyword xsPrivate S_sv_buf_to_rw S_sv_display S_sv_dup_common
syn keyword xsPrivate S_sv_dup_inc_multiple S_sv_exp_grow S_sv_i_ncmp
syn keyword xsPrivate S_sv_ncmp S_sv_pos_b2u_midway S_sv_pos_u2b_cached
syn keyword xsPrivate S_sv_pos_u2b_forwards S_sv_pos_u2b_midway
-syn keyword xsPrivate S_sv_release_COW S_swallow_bom S_swatch_get
-syn keyword xsPrivate S_to_byte_substr S_to_lower_latin1 S_to_utf8_substr
-syn keyword xsPrivate S_tokenize_use S_tokeq S_tokereport
-syn keyword xsPrivate S_too_few_arguments_pv S_too_few_arguments_sv
-syn keyword xsPrivate S_too_many_arguments_pv S_too_many_arguments_sv
+syn keyword xsPrivate S_sv_release_COW S_swallow_bom S_swash_scan_list_line
+syn keyword xsPrivate S_swatch_get S_to_byte_substr S_to_lower_latin1
+syn keyword xsPrivate S_to_utf8_substr S_tokenize_use S_tokeq S_tokereport
+syn keyword xsPrivate S_too_few_arguments_pv S_too_many_arguments_pv
syn keyword xsPrivate S_uiv_2buf S_unpack_rec S_unreferenced_to_tmp_stack
syn keyword xsPrivate S_unshare_hek_or_pvn S_unwind_handler_stack
syn keyword xsPrivate S_update_debugger_info S_usage S_utf16_textfilter
syn keyword xsPrivate S_utf8_mg_len_cache_update S_utf8_mg_pos_cache_update
syn keyword xsPrivate S_validate_suid S_visit S_with_queued_errors
-syn keyword xsPrivate S_write_no_mem S_xmldump_attr S_yywarn Slab_to_rw
-syn keyword xsPrivate _add_range_to_invlist _append_range_to_invlist
-syn keyword xsPrivate _core_swash_init _invlist_array_init _invlist_contents
+syn keyword xsPrivate S_xs_version_bootcheck S_yywarn _add_range_to_invlist
+syn keyword xsPrivate _append_range_to_invlist _core_swash_init _get_encoding
+syn keyword xsPrivate _get_swash_invlist _invlist_array_init
+syn keyword xsPrivate _invlist_contains_cp _invlist_contents _invlist_dump
syn keyword xsPrivate _invlist_intersection
syn keyword xsPrivate _invlist_intersection_maybe_complement_2nd
-syn keyword xsPrivate _invlist_invert _invlist_invert_prop
-syn keyword xsPrivate _invlist_populate_swatch _invlist_subtract
-syn keyword xsPrivate _invlist_union _invlist_union_maybe_complement_2nd
-syn keyword xsPrivate _is_utf8__perl_idstart _new_invlist
-syn keyword xsPrivate _new_invlist_C_array _swash_inversion_hash
-syn keyword xsPrivate _swash_to_invlist _to_fold_latin1 add_alternate
-syn keyword xsPrivate add_cp_to_invlist add_data add_utf16_textfilter
-syn keyword xsPrivate adjust_stack_on_leave amagic_cmp amagic_cmp_locale
+syn keyword xsPrivate _invlist_invert _invlist_len _invlist_populate_swatch
+syn keyword xsPrivate _invlist_search _invlist_subtract _invlist_union
+syn keyword xsPrivate _invlist_union_maybe_complement_2nd
+syn keyword xsPrivate _load_PL_utf8_foldclosures _make_exactf_invlist
+syn keyword xsPrivate _new_invlist _setup_canned_invlist
+syn keyword xsPrivate _swash_inversion_hash _swash_to_invlist _to_fold_latin1
+syn keyword xsPrivate _warn_problematic_locale add_above_Latin1_folds
+syn keyword xsPrivate add_cp_to_invlist add_data add_multi_match
+syn keyword xsPrivate add_utf16_textfilter adjust_size_and_find_bucket
+syn keyword xsPrivate advance_one_SB advance_one_WB
+syn keyword xsPrivate alloc_maybe_populate_EXACT amagic_cmp amagic_cmp_locale
syn keyword xsPrivate amagic_i_ncmp amagic_ncmp anonymise_cv_maybe ao
syn keyword xsPrivate apply_attrs apply_attrs_my assert_uft8_cache_coherent
-syn keyword xsPrivate av_reify bad_type_pv bad_type_sv bytes_to_uni
-syn keyword xsPrivate check_locale_boundary_crossing check_type_and_open
-syn keyword xsPrivate check_uni checkcomma checkposixcc ckwarn_common cl_and
-syn keyword xsPrivate cl_anything cl_init cl_is_anything cl_or
-syn keyword xsPrivate clear_placeholders closest_cop cop_free
-syn keyword xsPrivate core_regclass_swash cr_textfilter curmad curse cv_dump
+syn keyword xsPrivate assignment_type av_reify backup_one_SB backup_one_WB
+syn keyword xsPrivate bad_type_gv bad_type_pv check_locale_boundary_crossing
+syn keyword xsPrivate check_type_and_open check_uni checkcomma ckwarn_common
+syn keyword xsPrivate clear_placeholders clear_special_blocks
+syn keyword xsPrivate cntrl_to_mnemonic compute_EXACTish
+syn keyword xsPrivate construct_ahocorasick_from_trie cop_free
+syn keyword xsPrivate could_it_be_a_POSIX_class cr_textfilter
+syn keyword xsPrivate current_re_engine curse cv_ckproto_len_flags cv_dump
syn keyword xsPrivate deb_curcv deb_stack_n debprof debug_start_match del_sv
syn keyword xsPrivate deprecate_commaless_var_list destroy_matcher div128
syn keyword xsPrivate do_aexec do_chomp do_delete_local do_exec do_oddball
@@ -199,274 +237,342 @@ syn keyword xsPrivate dump_trie_interim_list dump_trie_interim_table
syn keyword xsPrivate dumpuntil dup_attrlist exec_failed expect_number
syn keyword xsPrivate filter_gets finalize_op find_and_forget_pmops
syn keyword xsPrivate find_array_subscript find_beginning find_byclass
-syn keyword xsPrivate find_hash_subscript find_in_my_stash
+syn keyword xsPrivate find_default_stash find_hash_subscript find_in_my_stash
syn keyword xsPrivate find_rundefsvoffset find_uninit_var first_symbol
-syn keyword xsPrivate fold_constants forbid_setid force_ident force_list
-syn keyword xsPrivate force_next force_strict_version force_version
-syn keyword xsPrivate force_word gen_constant_list get_aux_mg
-syn keyword xsPrivate get_invlist_iter_addr get_invlist_len_addr
-syn keyword xsPrivate get_invlist_version_id_addr get_invlist_zero_addr
-syn keyword xsPrivate get_num glob_2number glob_assign_glob glob_assign_ref
-syn keyword xsPrivate grok_bslash_c grok_bslash_o group_end gv_ename
-syn keyword xsPrivate gv_get_super_pkg gv_init_svtype gv_magicalize_isa
-syn keyword xsPrivate gv_magicalize_overload hfreeentries hsplit hv_auxinit
-syn keyword xsPrivate hv_delete_common hv_free_ent_ret hv_magic_check
-syn keyword xsPrivate hv_notallowed incline incpush incpush_if_exists
-syn keyword xsPrivate incpush_use_sep ingroup init_ids init_interp
-syn keyword xsPrivate init_main_stash init_perllib init_postdump_symbols
-syn keyword xsPrivate init_predump_symbols inplace_aassign intuit_method
-syn keyword xsPrivate intuit_more invlist_array invlist_clone invlist_extend
-syn keyword xsPrivate invlist_iterinit invlist_iternext invlist_len
-syn keyword xsPrivate invlist_max invlist_search invlist_set_len invlist_trim
-syn keyword xsPrivate invoke_exception_hook is_an_int is_handle_constructor
-syn keyword xsPrivate is_list_assignment is_utf8_X_L is_utf8_X_LV
-syn keyword xsPrivate is_utf8_X_LVT is_utf8_X_LV_LVT_V is_utf8_X_T
-syn keyword xsPrivate is_utf8_X_V is_utf8_X_begin is_utf8_X_extend
-syn keyword xsPrivate is_utf8_X_non_hangul is_utf8_X_prepend is_utf8_char
-syn keyword xsPrivate is_utf8_char_slow is_utf8_common isa_lookup join_exact
-syn keyword xsPrivate listkids looks_like_bool magic_methcall1 make_matcher
-syn keyword xsPrivate make_trie make_trie_failtable matcher_matches_sv
-syn keyword xsPrivate mayberelocate measure_struct mem_log_common mess_alloc
-syn keyword xsPrivate method_common minus_v missingterm modkids more_sv
-syn keyword xsPrivate mro_clean_isarev mro_gather_and_rename
-syn keyword xsPrivate mro_get_linear_isa_dfs mul128 mulexp10 my_exit_jump
-syn keyword xsPrivate my_kid need_utf8 newDEFSVOP newGIVWHENOP new_he
-syn keyword xsPrivate new_logop next_symbol nextchar no_bareword_allowed
-syn keyword xsPrivate no_fh_allowed no_op not_a_number nuke_stacks
-syn keyword xsPrivate num_overflow op_clear open_script opt_scalarhv pack_rec
-syn keyword xsPrivate pad_alloc_name pad_check_dup pad_findlex pad_reset
-syn keyword xsPrivate parse_body path_is_absolute pidgone pm_description
-syn keyword xsPrivate pmtrans printbuf process_special_blocks ptr_table_clear
-syn keyword xsPrivate ptr_table_find put_byte qerror qsortsvu re_croak2
-syn keyword xsPrivate readpipe_override ref_array_or_hash refcounted_he_value
-syn keyword xsPrivate refkids refto reg reg_check_named_buff_matched
-syn keyword xsPrivate reg_named_buff reg_named_buff_iter reg_namedseq
-syn keyword xsPrivate reg_node reg_numbered_buff_fetch
+syn keyword xsPrivate fixup_errno_string fold_constants forbid_setid
+syn keyword xsPrivate force_ident force_ident_maybe_lex force_list force_next
+syn keyword xsPrivate force_strict_version force_version force_word
+syn keyword xsPrivate forget_pmop form_short_octal_warning free_c_backtrace
+syn keyword xsPrivate gen_constant_list get_ANYOF_cp_list_for_ssc get_aux_mg
+syn keyword xsPrivate get_invlist_iter_addr get_invlist_offset_addr
+syn keyword xsPrivate get_invlist_previous_index_addr get_num glob_2number
+syn keyword xsPrivate glob_assign_glob grok_atoUV grok_bslash_N grok_bslash_c
+syn keyword xsPrivate grok_bslash_o grok_bslash_x group_end gv_init_svtype
+syn keyword xsPrivate gv_is_in_main gv_magicalize gv_magicalize_isa
+syn keyword xsPrivate handle_regex_sets hfreeentries hsplit hv_auxinit
+syn keyword xsPrivate hv_auxinit_internal hv_delete_common hv_free_ent_ret
+syn keyword xsPrivate hv_magic_check hv_notallowed incline incpush
+syn keyword xsPrivate incpush_if_exists incpush_use_sep ingroup init_ids
+syn keyword xsPrivate init_interp init_main_stash init_perllib
+syn keyword xsPrivate init_postdump_symbols init_predump_symbols
+syn keyword xsPrivate inplace_aassign intuit_method intuit_more invlist_array
+syn keyword xsPrivate invlist_clone invlist_extend invlist_highest
+syn keyword xsPrivate invlist_is_iterating invlist_iterfinish
+syn keyword xsPrivate invlist_iterinit invlist_iternext invlist_max
+syn keyword xsPrivate invlist_previous_index invlist_set_len
+syn keyword xsPrivate invlist_set_previous_index invlist_trim
+syn keyword xsPrivate invoke_exception_hook isALNUM_lazy isFOO_lc
+syn keyword xsPrivate isFOO_utf8_lc isGCB isIDFIRST_lazy isSB isWB is_an_int
+syn keyword xsPrivate is_handle_constructor is_ssc_worth_it is_uni_alnum
+syn keyword xsPrivate is_uni_alnum_lc is_uni_alnumc is_uni_alnumc_lc
+syn keyword xsPrivate is_uni_alpha is_uni_alpha_lc is_uni_ascii
+syn keyword xsPrivate is_uni_ascii_lc is_uni_blank is_uni_blank_lc
+syn keyword xsPrivate is_uni_cntrl is_uni_cntrl_lc is_uni_digit
+syn keyword xsPrivate is_uni_digit_lc is_uni_graph is_uni_graph_lc
+syn keyword xsPrivate is_uni_idfirst is_uni_idfirst_lc is_uni_lower
+syn keyword xsPrivate is_uni_lower_lc is_uni_print is_uni_print_lc
+syn keyword xsPrivate is_uni_punct is_uni_punct_lc is_uni_space
+syn keyword xsPrivate is_uni_space_lc is_uni_upper is_uni_upper_lc
+syn keyword xsPrivate is_uni_xdigit is_uni_xdigit_lc is_utf8_alnum
+syn keyword xsPrivate is_utf8_alnumc is_utf8_alpha is_utf8_ascii
+syn keyword xsPrivate is_utf8_blank is_utf8_char is_utf8_cntrl is_utf8_digit
+syn keyword xsPrivate is_utf8_graph is_utf8_idcont is_utf8_idfirst
+syn keyword xsPrivate is_utf8_lower is_utf8_mark is_utf8_perl_space
+syn keyword xsPrivate is_utf8_perl_word is_utf8_posix_digit is_utf8_print
+syn keyword xsPrivate is_utf8_punct is_utf8_space is_utf8_upper
+syn keyword xsPrivate is_utf8_xdigit is_utf8_xidcont is_utf8_xidfirst
+syn keyword xsPrivate isa_lookup join_exact leave_common listkids
+syn keyword xsPrivate looks_like_bool magic_methcall1 make_matcher make_trie
+syn keyword xsPrivate matcher_matches_sv maybe_multimagic_gv mayberelocate
+syn keyword xsPrivate measure_struct mem_log_common mess_alloc mg_find_mglob
+syn keyword xsPrivate mg_length minus_v missingterm modkids more_sv
+syn keyword xsPrivate move_proto_attr mro_clean_isarev mro_gather_and_rename
+syn keyword xsPrivate mro_get_linear_isa_dfs mul128 mulexp10
+syn keyword xsPrivate multideref_stringify my_bytes_to_utf8 my_exit_jump
+syn keyword xsPrivate my_kid need_utf8 newGIVWHENOP new_he new_logop
+syn keyword xsPrivate next_symbol nextchar no_bareword_allowed no_fh_allowed
+syn keyword xsPrivate no_op not_a_number not_incrementable nuke_stacks
+syn keyword xsPrivate num_overflow op_clear open_script openn_cleanup
+syn keyword xsPrivate openn_setup pack_rec pad_alloc_name pad_check_dup
+syn keyword xsPrivate pad_findlex pad_reset parse_body parse_gv_stash_name
+syn keyword xsPrivate parse_ident parse_lparen_question_flags pending_ident
+syn keyword xsPrivate pidgone pm_description pmtrans
+syn keyword xsPrivate populate_ANYOF_from_invlist printbuf
+syn keyword xsPrivate process_special_blocks ptr_table_clear ptr_table_find
+syn keyword xsPrivate put_charclass_bitmap_innards put_code_point put_range
+syn keyword xsPrivate qerror qsortsvu re_croak2 ref_array_or_hash
+syn keyword xsPrivate refcounted_he_value refkids refto reg reg2Lanode
+syn keyword xsPrivate reg_check_named_buff_matched reg_named_buff
+syn keyword xsPrivate reg_named_buff_iter reg_node reg_numbered_buff_fetch
syn keyword xsPrivate reg_numbered_buff_length reg_numbered_buff_store
syn keyword xsPrivate reg_qr_package reg_recode reg_scan_name reg_skipcomment
syn keyword xsPrivate reg_temp_copy reganode regatom regbranch regclass
-syn keyword xsPrivate regcppop regcppush regcurly regdump_extflags reghop3
-syn keyword xsPrivate reghop4 reghopmaybe3 reginclass reginsert regmatch
-syn keyword xsPrivate regpiece regpposixcc regprop regrepeat regtail
-syn keyword xsPrivate regtail_study regtry reguni regwhite report_uninit
-syn keyword xsPrivate require_tie_mod restore_magic run_body run_user_filter
-syn keyword xsPrivate rxres_free rxres_restore save_hek_flags save_lines
-syn keyword xsPrivate save_magic save_pushptri32ptr save_scalar_at
+syn keyword xsPrivate regcppop regcppush regcurly regdump_extflags
+syn keyword xsPrivate regdump_intflags regex_set_precedence reghop3 reghop4
+syn keyword xsPrivate reghopmaybe3 reginclass reginsert regmatch regnode_guts
+syn keyword xsPrivate regpatws regpiece regpposixcc regprop regrepeat regtail
+syn keyword xsPrivate regtail_study regtry report_uninit require_tie_mod
+syn keyword xsPrivate restore_magic run_body run_user_filter rxres_free
+syn keyword xsPrivate rxres_restore save_hek_flags save_lines
+syn keyword xsPrivate save_magic_flags save_pushptri32ptr save_scalar_at
syn keyword xsPrivate scalar_mod_type scalarboolean scalarkids scalarseq
syn keyword xsPrivate scan_commit scan_const scan_formline scan_heredoc
syn keyword xsPrivate scan_ident scan_inputsymbol scan_pat scan_str
syn keyword xsPrivate scan_subst scan_trans scan_word search_const
-syn keyword xsPrivate sequence_num set_regclass_bit set_regclass_bit_fold
-syn keyword xsPrivate share_hek_flags simplify_sort skipspace skipspace0
-syn keyword xsPrivate skipspace1 skipspace2 sortcv sortcv_stacked sortcv_xsub
-syn keyword xsPrivate space_join_names_mortal start_force stdize_locale
+syn keyword xsPrivate sequence_num set_ANYOF_arg share_hek_flags
+syn keyword xsPrivate simplify_sort skipspace_flags sortcv sortcv_stacked
+syn keyword xsPrivate sortcv_xsub space_join_names_mortal ssc_add_range
+syn keyword xsPrivate ssc_and ssc_anything ssc_clear_locale ssc_cp_and
+syn keyword xsPrivate ssc_finalize ssc_init ssc_intersection ssc_is_anything
+syn keyword xsPrivate ssc_is_cp_posixl_init ssc_or ssc_union stdize_locale
syn keyword xsPrivate strip_return study_chunk sublex_done sublex_push
syn keyword xsPrivate sublex_start sv_2iuv_common sv_2iuv_non_preserve
-syn keyword xsPrivate sv_add_arena sv_compile_2op sv_dup_common
-syn keyword xsPrivate sv_dup_inc_multiple sv_exp_grow sv_i_ncmp sv_ncmp
-syn keyword xsPrivate sv_pos_b2u_midway sv_pos_u2b_cached sv_pos_u2b_forwards
-syn keyword xsPrivate sv_pos_u2b_midway sv_release_COW sv_setsv_cow
-syn keyword xsPrivate swallow_bom swatch_get to_byte_substr to_lower_latin1
+syn keyword xsPrivate sv_add_arena sv_buf_to_rw sv_copypv sv_display
+syn keyword xsPrivate sv_dup_common sv_dup_inc_multiple sv_exp_grow sv_i_ncmp
+syn keyword xsPrivate sv_magicext_mglob sv_ncmp sv_only_taint_gmagic
+syn keyword xsPrivate sv_or_pv_pos_u2b sv_pos_b2u_midway sv_pos_u2b_cached
+syn keyword xsPrivate sv_pos_u2b_forwards sv_pos_u2b_midway sv_release_COW
+syn keyword xsPrivate sv_setsv_cow swallow_bom swash_scan_list_line
+syn keyword xsPrivate swatch_get to_byte_substr to_lower_latin1
+syn keyword xsPrivate to_uni_lower_lc to_uni_title_lc to_uni_upper_lc
syn keyword xsPrivate to_utf8_substr tokenize_use tokeq tokereport
-syn keyword xsPrivate too_few_arguments_pv too_few_arguments_sv
-syn keyword xsPrivate too_many_arguments_pv too_many_arguments_sv uiv_2buf
+syn keyword xsPrivate too_few_arguments_pv too_many_arguments_pv uiv_2buf
syn keyword xsPrivate unpack_rec unreferenced_to_tmp_stack unshare_hek_or_pvn
syn keyword xsPrivate unwind_handler_stack update_debugger_info usage
syn keyword xsPrivate utf16_textfilter utf8_mg_len_cache_update
syn keyword xsPrivate utf8_mg_pos_cache_update utf8_to_uvchr utf8_to_uvuni
-syn keyword xsPrivate visit vivify_defelem with_queued_errors write_no_mem
-syn keyword xsPrivate xmldump_attr yylex yywarn
+syn keyword xsPrivate utf8_to_uvuni_buf valid_utf8_to_uvuni validate_proto
+syn keyword xsPrivate visit vivify_defelem with_queued_errors yylex yywarn
endif
syn keyword xsType AMT AMTS ANY AV BHK BINOP BLOCK CHECKPOINT CLONE_PARAMS
syn keyword xsType COP COPHH CV DB_Hash_t DB_Prefix_t DEBUG_t Direntry_t
-syn keyword xsType Fpos_t Free_t GP GV Gid_t Groups_t HE HEK HV I16 I32 I64
-syn keyword xsType I8 IO IV Int64 JMPENV LISTOP LOGOP LOOP MADPROP MAGIC MGS
-syn keyword xsType MGVTBL Malloc_t Mmap_t Mode_t NEXTTOKE NV Netdb_hlen_t
-syn keyword xsType Netdb_host_t Netdb_name_t Netdb_net_t OP OPCODE OP_4tree
-syn keyword xsType Off_t Optype PAD PADLIST PADOFFSET PADOP PERL_CONTEXT
-syn keyword xsType PERL_SI PMOP PTR_TBL_ENT_t PTR_TBL_t PVOP PerlIO
-syn keyword xsType PerlIO_funcs PerlIO_list_s PerlIO_list_t PerlIOl
-syn keyword xsType PerlInterpreter Pid_t Quad_t REGEXP Rand_seed_t SSize_t
-syn keyword xsType STRLEN STRUCT_SV SUBLEXINFO SV SVOP Select_fd_set_t
-syn keyword xsType Shmat_t Signal_t Sigsave_t Size_t Sock_size_t Stat_t TM64
-syn keyword xsType TOKEN Time64_T Time_t U16 U32 U64 U8 UNOP UV Uid_t Uquad_t
-syn keyword xsType XOP XPV XPVAV XPVBM XPVCV XPVFM XPVGV XPVHV XPVIO XPVIV
-syn keyword xsType XPVLV XPVMG XPVNV XPVUV Year _PerlIO _PerlIO_funcs
-syn keyword xsType _pMY_CXT _pTHX _reg_ac_data _reg_trie_data _reg_trie_state
-syn keyword xsType _reg_trie_trans _reg_trie_trans_list_elem _sublex_info
-syn keyword xsType _xhvnameu _xivu _xmgu _xnvu am_table am_table_short
-syn keyword xsType block_eval block_format block_givwhen block_hooks
-syn keyword xsType block_loop block_sub bool clone_params custom_op
-syn keyword xsType cv_flags_t expectation gccbug_semun line_t madprop magic
-syn keyword xsType mem_log_type mgvtbl mro_alg mro_meta my_cxt_t opcode p5rx
-syn keyword xsType pMY_CXT pMY_CXT_ pTHX pTHX_ padtidy_type perl_cond
-syn keyword xsType perl_debug_pad perl_key perl_memory_debug_header
-syn keyword xsType perl_mstats perl_mstats_t perl_mutex perl_os_thread
-syn keyword xsType perl_phase perl_vars perl_wait_queue pthread_addr_t
-syn keyword xsType ptr_tbl ptr_tbl_ent re_save_state refcounted_he
-syn keyword xsType reg_ac_data reg_data reg_substr_data reg_substr_datum
-syn keyword xsType reg_trie_data reg_trie_state reg_trie_trans
-syn keyword xsType reg_trie_trans_le regex_charset regnode regnode_1
-syn keyword xsType regnode_2 regnode_2L regnode_charclass
-syn keyword xsType regnode_charclass_class regnode_string semun shared_he
-syn keyword xsType svtype thread_intern ufuncs xpv xpvav xpvcv xpvfm xpvgv
-syn keyword xsType xpvhv xpvhv_aux xpvio xpviv xpvlv xpvmg xpvnv xpvuv
+syn keyword xsType Fpos_t Free_t GCB_enum GP GV Gid_t Groups_t HE HEK HV I16
+syn keyword xsType I32 I64 I8 IO IV Int64 JMPENV LISTOP LOGOP LOOP MAGIC
+syn keyword xsType METHOP MGS MGVTBL Malloc_t Mmap_t Mode_t NV Netdb_hlen_t
+syn keyword xsType Netdb_host_t Netdb_name_t Netdb_net_t OP OPCODE OPSLAB
+syn keyword xsType OPSLOT Off_t Optype PAD PADLIST PADNAME PADNAMELIST
+syn keyword xsType PADOFFSET PADOP PERL_CONTEXT PERL_DRAND48_T PERL_SI PMOP
+syn keyword xsType PTR_TBL_ENT_t PTR_TBL_t PVOP PerlHandShakeInterpreter
+syn keyword xsType PerlIO PerlIO_funcs PerlIO_list_s PerlIO_list_t PerlIOl
+syn keyword xsType PerlInterpreter Pid_t Quad_t REGEXP RExC_state_t
+syn keyword xsType Rand_seed_t SB_enum SSize_t STRLEN STRUCT_SV SUBLEXINFO SV
+syn keyword xsType SVOP Select_fd_set_t Shmat_t Signal_t Sigsave_t Size_t
+syn keyword xsType Sock_size_t Stat_t TM64 Time64_T Time_t U16 U32 U64 U8
+syn keyword xsType UNOP UNOP_AUX UV Uid_t Uquad_t WB_enum XINVLIST XOP XPV
+syn keyword xsType XPVAV XPVBM XPVCV XPVFM XPVGV XPVHV XPVIO XPVIV XPVLV
+syn keyword xsType XPVMG XPVNV XPVUV Year _PerlIO _PerlIO_funcs
+syn keyword xsType _char_class_number _pMY_CXT _pTHX _reg_ac_data
+syn keyword xsType _reg_trie_data _reg_trie_state _reg_trie_trans
+syn keyword xsType _reg_trie_trans_list_elem _sublex_info _xhvnameu _xivu
+syn keyword xsType _xmgu _xnvu am_table am_table_short block_eval
+syn keyword xsType block_format block_givwhen block_hooks block_loop
+syn keyword xsType block_sub bound_type clone_params custom_op cv_flags_t
+syn keyword xsType expectation gccbug_semun line_t magic mem_log_type methop
+syn keyword xsType mgvtbl mro_alg mro_meta my_cxt_t opcode opslab opslot p5rx
+syn keyword xsType pMY_CXT pMY_CXT_ pTHX pTHX_ padlist padname
+syn keyword xsType padname_with_str padnamelist padtidy_type perl_cond
+syn keyword xsType perl_debug_pad perl_drand48_t perl_key
+syn keyword xsType perl_memory_debug_header perl_mstats perl_mstats_t
+syn keyword xsType perl_mutex perl_os_thread perl_phase perl_vars
+syn keyword xsType pthread_addr_t ptr_tbl ptr_tbl_ent refcounted_he
+syn keyword xsType reg_ac_data reg_code_block reg_data reg_substr_data
+syn keyword xsType reg_substr_datum reg_trie_data reg_trie_state
+syn keyword xsType reg_trie_trans reg_trie_trans_le regex_charset regnode
+syn keyword xsType regnode_1 regnode_2 regnode_2L regnode_charclass
+syn keyword xsType regnode_charclass_class regnode_charclass_posixl
+syn keyword xsType regnode_ssc regnode_string semun shared_he svtype ufuncs
+syn keyword xsType unop_aux xop_flags_enum xpv xpvav xpvcv xpvfm xpvgv xpvhv
+syn keyword xsType xpvhv_aux xpvinvlist xpvio xpviv xpvlv xpvmg xpvnv xpvuv
syn keyword xsType yytokentype
syn keyword xsString IVdf NVef NVff NVgf SVf SVf256 SVf32 SVf_ UVof UVuf UVxf
syn keyword xsConstant CXt_BLOCK CXt_EVAL CXt_FORMAT CXt_GIVEN CXt_LOOP_FOR
syn keyword xsConstant CXt_LOOP_LAZYIV CXt_LOOP_LAZYSV CXt_LOOP_PLAIN
-syn keyword xsConstant CXt_NULL CXt_SUB CXt_SUBST CXt_WHEN FALSE G_ARRAY
-syn keyword xsConstant G_DISCARD G_EVAL G_FAKINGEVAL G_KEEPERR G_METHOD
-syn keyword xsConstant G_NOARGS G_NODEBUG G_SCALAR G_UNDEF_FILL G_VOID G_WANT
-syn keyword xsConstant G_WARN_ALL_MASK G_WARN_ALL_OFF G_WARN_ALL_ON
-syn keyword xsConstant G_WARN_OFF G_WARN_ON G_WARN_ONCE G_WRITING_TO_STDERR
-syn keyword xsConstant OA_AVREF OA_BASEOP OA_BASEOP_OR_UNOP OA_BINOP
-syn keyword xsConstant OA_CLASS_MASK OA_COP OA_CVREF OA_DANGEROUS OA_DEFGV
-syn keyword xsConstant OA_FILEREF OA_FILESTATOP OA_FOLDCONST OA_HVREF OA_LIST
-syn keyword xsConstant OA_LISTOP OA_LOGOP OA_LOOP OA_LOOPEXOP OA_MARK
+syn keyword xsConstant CXt_NULL CXt_SUB CXt_SUBST CXt_WHEN GCB_BOUND GCB_CR
+syn keyword xsConstant GCB_Control GCB_EDGE GCB_Extend GCB_L GCB_LF GCB_LV
+syn keyword xsConstant GCB_LVT GCB_Other GCB_Prepend GCB_Regional_Indicator
+syn keyword xsConstant GCB_SpacingMark GCB_T GCB_V G_ARRAY G_DISCARD G_EVAL
+syn keyword xsConstant G_FAKINGEVAL G_KEEPERR G_METHOD G_METHOD_NAMED
+syn keyword xsConstant G_NOARGS G_NODEBUG G_RE_REPARSING G_SCALAR
+syn keyword xsConstant G_UNDEF_FILL G_VOID G_WANT G_WARN_ALL_MASK
+syn keyword xsConstant G_WARN_ALL_OFF G_WARN_ALL_ON G_WARN_OFF G_WARN_ON
+syn keyword xsConstant G_WARN_ONCE G_WRITING_TO_STDERR OA_AVREF OA_BASEOP
+syn keyword xsConstant OA_BASEOP_OR_UNOP OA_BINOP OA_CLASS_MASK OA_COP
+syn keyword xsConstant OA_CVREF OA_DANGEROUS OA_DEFGV OA_FILEREF
+syn keyword xsConstant OA_FILESTATOP OA_FOLDCONST OA_HVREF OA_LIST OA_LISTOP
+syn keyword xsConstant OA_LOGOP OA_LOOP OA_LOOPEXOP OA_MARK OA_METHOP
syn keyword xsConstant OA_OPTIONAL OA_OTHERINT OA_PADOP OA_PMOP
syn keyword xsConstant OA_PVOP_OR_SVOP OA_RETSCALAR OA_SCALAR OA_SCALARREF
-syn keyword xsConstant OA_SVOP OA_TARGET OA_TARGLEX OA_UNOP OP_AASSIGN OP_ABS
-syn keyword xsConstant OP_ACCEPT OP_ADD OP_AEACH OP_AELEM OP_AELEMFAST
-syn keyword xsConstant OP_AELEMFAST_LEX OP_AKEYS OP_ALARM OP_AND OP_ANDASSIGN
-syn keyword xsConstant OP_ANONCODE OP_ANONHASH OP_ANONLIST OP_ASLICE OP_ATAN2
-syn keyword xsConstant OP_AV2ARYLEN OP_AVALUES OP_BACKTICK OP_BIND OP_BINMODE
-syn keyword xsConstant OP_BIT_AND OP_BIT_OR OP_BIT_XOR OP_BLESS OP_BOOLKEYS
-syn keyword xsConstant OP_BREAK OP_CALLER OP_CHDIR OP_CHMOD OP_CHOMP OP_CHOP
-syn keyword xsConstant OP_CHOWN OP_CHR OP_CHROOT OP_CLOSE OP_CLOSEDIR
-syn keyword xsConstant OP_COMPLEMENT OP_CONCAT OP_COND_EXPR OP_CONNECT
-syn keyword xsConstant OP_CONST OP_CONTINUE OP_COREARGS OP_COS OP_CRYPT
-syn keyword xsConstant OP_CUSTOM OP_DBMCLOSE OP_DBMOPEN OP_DBSTATE OP_DEFINED
-syn keyword xsConstant OP_DELETE OP_DIE OP_DIVIDE OP_DOFILE OP_DOR
-syn keyword xsConstant OP_DORASSIGN OP_DUMP OP_EACH OP_EGRENT OP_EHOSTENT
-syn keyword xsConstant OP_ENETENT OP_ENTER OP_ENTEREVAL OP_ENTERGIVEN
-syn keyword xsConstant OP_ENTERITER OP_ENTERLOOP OP_ENTERSUB OP_ENTERTRY
-syn keyword xsConstant OP_ENTERWHEN OP_ENTERWRITE OP_EOF OP_EPROTOENT
-syn keyword xsConstant OP_EPWENT OP_EQ OP_ESERVENT OP_EXEC OP_EXISTS OP_EXIT
-syn keyword xsConstant OP_EXP OP_FC OP_FCNTL OP_FILENO OP_FLIP OP_FLOCK
-syn keyword xsConstant OP_FLOP OP_FORK OP_FORMLINE OP_FTATIME OP_FTBINARY
-syn keyword xsConstant OP_FTBLK OP_FTCHR OP_FTCTIME OP_FTDIR OP_FTEEXEC
-syn keyword xsConstant OP_FTEOWNED OP_FTEREAD OP_FTEWRITE OP_FTFILE OP_FTIS
-syn keyword xsConstant OP_FTLINK OP_FTMTIME OP_FTPIPE OP_FTREXEC OP_FTROWNED
-syn keyword xsConstant OP_FTRREAD OP_FTRWRITE OP_FTSGID OP_FTSIZE OP_FTSOCK
-syn keyword xsConstant OP_FTSUID OP_FTSVTX OP_FTTEXT OP_FTTTY OP_FTZERO OP_GE
-syn keyword xsConstant OP_GELEM OP_GETC OP_GETLOGIN OP_GETPEERNAME OP_GETPGRP
-syn keyword xsConstant OP_GETPPID OP_GETPRIORITY OP_GETSOCKNAME OP_GGRENT
-syn keyword xsConstant OP_GGRGID OP_GGRNAM OP_GHBYADDR OP_GHBYNAME
-syn keyword xsConstant OP_GHOSTENT OP_GLOB OP_GMTIME OP_GNBYADDR OP_GNBYNAME
-syn keyword xsConstant OP_GNETENT OP_GOTO OP_GPBYNAME OP_GPBYNUMBER
-syn keyword xsConstant OP_GPROTOENT OP_GPWENT OP_GPWNAM OP_GPWUID
-syn keyword xsConstant OP_GREPSTART OP_GREPWHILE OP_GSBYNAME OP_GSBYPORT
-syn keyword xsConstant OP_GSERVENT OP_GSOCKOPT OP_GT OP_GV OP_GVSV OP_HELEM
-syn keyword xsConstant OP_HEX OP_HINTSEVAL OP_HSLICE OP_INDEX OP_INT OP_IOCTL
-syn keyword xsConstant OP_ITER OP_I_ADD OP_I_DIVIDE OP_I_EQ OP_I_GE OP_I_GT
-syn keyword xsConstant OP_I_LE OP_I_LT OP_I_MODULO OP_I_MULTIPLY OP_I_NCMP
-syn keyword xsConstant OP_I_NE OP_I_NEGATE OP_I_POSTDEC OP_I_POSTINC
-syn keyword xsConstant OP_I_PREDEC OP_I_PREINC OP_I_SUBTRACT OP_JOIN OP_KEYS
-syn keyword xsConstant OP_KILL OP_LAST OP_LC OP_LCFIRST OP_LE OP_LEAVE
-syn keyword xsConstant OP_LEAVEEVAL OP_LEAVEGIVEN OP_LEAVELOOP OP_LEAVESUB
-syn keyword xsConstant OP_LEAVESUBLV OP_LEAVETRY OP_LEAVEWHEN OP_LEAVEWRITE
-syn keyword xsConstant OP_LEFT_SHIFT OP_LENGTH OP_LINESEQ OP_LINK OP_LIST
-syn keyword xsConstant OP_LISTEN OP_LOCALTIME OP_LOCK OP_LOG OP_LSLICE
-syn keyword xsConstant OP_LSTAT OP_LT OP_MAPSTART OP_MAPWHILE OP_MATCH
-syn keyword xsConstant OP_METHOD OP_METHOD_NAMED OP_MKDIR OP_MODULO OP_MSGCTL
-syn keyword xsConstant OP_MSGGET OP_MSGRCV OP_MSGSND OP_MULTIPLY OP_NCMP
-syn keyword xsConstant OP_NE OP_NEGATE OP_NEXT OP_NEXTSTATE OP_NOT OP_NULL
-syn keyword xsConstant OP_OCT OP_ONCE OP_OPEN OP_OPEN_DIR OP_OR OP_ORASSIGN
-syn keyword xsConstant OP_ORD OP_PACK OP_PADANY OP_PADAV OP_PADHV OP_PADSV
-syn keyword xsConstant OP_PIPE_OP OP_POP OP_POS OP_POSTDEC OP_POSTINC OP_POW
-syn keyword xsConstant OP_PREDEC OP_PREINC OP_PRINT OP_PROTOTYPE OP_PRTF
-syn keyword xsConstant OP_PUSH OP_PUSHMARK OP_PUSHRE OP_QR OP_QUOTEMETA
-syn keyword xsConstant OP_RAND OP_RANGE OP_RCATLINE OP_REACH OP_READ
-syn keyword xsConstant OP_READDIR OP_READLINE OP_READLINK OP_RECV OP_REDO
-syn keyword xsConstant OP_REF OP_REFGEN OP_REGCMAYBE OP_REGCOMP OP_REGCRESET
-syn keyword xsConstant OP_RENAME OP_REPEAT OP_REQUIRE OP_RESET OP_RETURN
-syn keyword xsConstant OP_REVERSE OP_REWINDDIR OP_RIGHT_SHIFT OP_RINDEX
-syn keyword xsConstant OP_RKEYS OP_RMDIR OP_RUNCV OP_RV2AV OP_RV2CV OP_RV2GV
-syn keyword xsConstant OP_RV2HV OP_RV2SV OP_RVALUES OP_SASSIGN OP_SAY
-syn keyword xsConstant OP_SCALAR OP_SCHOMP OP_SCHOP OP_SCMP OP_SCOPE OP_SEEK
-syn keyword xsConstant OP_SEEKDIR OP_SELECT OP_SEMCTL OP_SEMGET OP_SEMOP
-syn keyword xsConstant OP_SEND OP_SEQ OP_SETPGRP OP_SETPRIORITY OP_SGE
-syn keyword xsConstant OP_SGRENT OP_SGT OP_SHIFT OP_SHMCTL OP_SHMGET
-syn keyword xsConstant OP_SHMREAD OP_SHMWRITE OP_SHOSTENT OP_SHUTDOWN OP_SIN
-syn keyword xsConstant OP_SLE OP_SLEEP OP_SLT OP_SMARTMATCH OP_SNE OP_SNETENT
-syn keyword xsConstant OP_SOCKET OP_SOCKPAIR OP_SORT OP_SPLICE OP_SPLIT
-syn keyword xsConstant OP_SPRINTF OP_SPROTOENT OP_SPWENT OP_SQRT OP_SRAND
-syn keyword xsConstant OP_SREFGEN OP_SSELECT OP_SSERVENT OP_SSOCKOPT OP_STAT
-syn keyword xsConstant OP_STRINGIFY OP_STUB OP_STUDY OP_SUBST OP_SUBSTCONT
-syn keyword xsConstant OP_SUBSTR OP_SUBTRACT OP_SYMLINK OP_SYSCALL OP_SYSOPEN
-syn keyword xsConstant OP_SYSREAD OP_SYSSEEK OP_SYSTEM OP_SYSWRITE OP_TELL
-syn keyword xsConstant OP_TELLDIR OP_TIE OP_TIED OP_TIME OP_TMS OP_TRANS
-syn keyword xsConstant OP_TRANSR OP_TRUNCATE OP_UC OP_UCFIRST OP_UMASK
-syn keyword xsConstant OP_UNDEF OP_UNLINK OP_UNPACK OP_UNSHIFT OP_UNSTACK
-syn keyword xsConstant OP_UNTIE OP_UTIME OP_VALUES OP_VEC OP_WAIT OP_WAITPID
-syn keyword xsConstant OP_WANTARRAY OP_WARN OP_XOR OP_max OPf_KIDS OPf_KNOW
-syn keyword xsConstant OPf_LIST OPf_MOD OPf_PARENS OPf_REF OPf_SPECIAL
-syn keyword xsConstant OPf_STACKED OPf_WANT OPf_WANT_LIST OPf_WANT_SCALAR
-syn keyword xsConstant OPf_WANT_VOID OPpALLOW_FAKE OPpASSIGN_BACKWARDS
-syn keyword xsConstant OPpASSIGN_COMMON OPpASSIGN_CV_TO_GV OPpCONST_BARE
-syn keyword xsConstant OPpCONST_ENTERED OPpCONST_NOVER OPpCONST_SHORTCIRCUIT
-syn keyword xsConstant OPpCONST_STRICT OPpCONST_WARNING OPpCOREARGS_DEREF1
-syn keyword xsConstant OPpCOREARGS_DEREF2 OPpCOREARGS_PUSHMARK
-syn keyword xsConstant OPpCOREARGS_SCALARMOD OPpDEREF OPpDEREF_AV OPpDEREF_HV
-syn keyword xsConstant OPpDEREF_SV OPpDONT_INIT_GV OPpEARLY_CV
-syn keyword xsConstant OPpENTERSUB_AMPER OPpENTERSUB_DB OPpENTERSUB_HASTARG
-syn keyword xsConstant OPpENTERSUB_INARGS OPpENTERSUB_LVAL_MASK
-syn keyword xsConstant OPpENTERSUB_NOPAREN OPpEVAL_BYTES OPpEVAL_COPHH
-syn keyword xsConstant OPpEVAL_HAS_HH OPpEVAL_UNICODE OPpEXISTS_SUB
-syn keyword xsConstant OPpEXIT_VMSISH OPpFLIP_LINENUM OPpFT_ACCESS
-syn keyword xsConstant OPpFT_AFTER_t OPpFT_STACKED OPpFT_STACKING OPpGREP_LEX
-syn keyword xsConstant OPpHUSH_VMSISH OPpITER_DEF OPpITER_REVERSED
-syn keyword xsConstant OPpLIST_GUESSED OPpLVAL_DEFER OPpLVAL_INTRO
-syn keyword xsConstant OPpMAYBE_LVSUB OPpMAY_RETURN_CONSTANT OPpOFFBYONE
-syn keyword xsConstant OPpOPEN_IN_CRLF OPpOPEN_IN_RAW OPpOPEN_OUT_CRLF
-syn keyword xsConstant OPpOPEN_OUT_RAW OPpOUR_INTRO OPpPAD_STATE
-syn keyword xsConstant OPpPV_IS_UTF8 OPpREFCOUNTED OPpREPEAT_DOLIST
-syn keyword xsConstant OPpREVERSE_INPLACE OPpRUNTIME OPpSLICE OPpSORT_DESCEND
+syn keyword xsConstant OA_SVOP OA_TARGET OA_TARGLEX OA_UNOP OA_UNOP_AUX
+syn keyword xsConstant OP_AASSIGN OP_ABS OP_ACCEPT OP_ADD OP_AEACH OP_AELEM
+syn keyword xsConstant OP_AELEMFAST OP_AELEMFAST_LEX OP_AKEYS OP_ALARM OP_AND
+syn keyword xsConstant OP_ANDASSIGN OP_ANONCODE OP_ANONCONST OP_ANONHASH
+syn keyword xsConstant OP_ANONLIST OP_ASLICE OP_ATAN2 OP_AV2ARYLEN OP_AVALUES
+syn keyword xsConstant OP_BACKTICK OP_BIND OP_BINMODE OP_BIT_AND OP_BIT_OR
+syn keyword xsConstant OP_BIT_XOR OP_BLESS OP_BREAK OP_CALLER OP_CHDIR
+syn keyword xsConstant OP_CHMOD OP_CHOMP OP_CHOP OP_CHOWN OP_CHR OP_CHROOT
+syn keyword xsConstant OP_CLONECV OP_CLOSE OP_CLOSEDIR OP_COMPLEMENT
+syn keyword xsConstant OP_CONCAT OP_COND_EXPR OP_CONNECT OP_CONST OP_CONTINUE
+syn keyword xsConstant OP_COREARGS OP_COS OP_CRYPT OP_CUSTOM OP_DBMCLOSE
+syn keyword xsConstant OP_DBMOPEN OP_DBSTATE OP_DEFINED OP_DELETE OP_DIE
+syn keyword xsConstant OP_DIVIDE OP_DOFILE OP_DOR OP_DORASSIGN OP_DUMP
+syn keyword xsConstant OP_EACH OP_EGRENT OP_EHOSTENT OP_ENETENT OP_ENTER
+syn keyword xsConstant OP_ENTEREVAL OP_ENTERGIVEN OP_ENTERITER OP_ENTERLOOP
+syn keyword xsConstant OP_ENTERSUB OP_ENTERTRY OP_ENTERWHEN OP_ENTERWRITE
+syn keyword xsConstant OP_EOF OP_EPROTOENT OP_EPWENT OP_EQ OP_ESERVENT
+syn keyword xsConstant OP_EXEC OP_EXISTS OP_EXIT OP_EXP OP_FC OP_FCNTL
+syn keyword xsConstant OP_FILENO OP_FLIP OP_FLOCK OP_FLOP OP_FORK OP_FORMLINE
+syn keyword xsConstant OP_FTATIME OP_FTBINARY OP_FTBLK OP_FTCHR OP_FTCTIME
+syn keyword xsConstant OP_FTDIR OP_FTEEXEC OP_FTEOWNED OP_FTEREAD OP_FTEWRITE
+syn keyword xsConstant OP_FTFILE OP_FTIS OP_FTLINK OP_FTMTIME OP_FTPIPE
+syn keyword xsConstant OP_FTREXEC OP_FTROWNED OP_FTRREAD OP_FTRWRITE
+syn keyword xsConstant OP_FTSGID OP_FTSIZE OP_FTSOCK OP_FTSUID OP_FTSVTX
+syn keyword xsConstant OP_FTTEXT OP_FTTTY OP_FTZERO OP_GE OP_GELEM OP_GETC
+syn keyword xsConstant OP_GETLOGIN OP_GETPEERNAME OP_GETPGRP OP_GETPPID
+syn keyword xsConstant OP_GETPRIORITY OP_GETSOCKNAME OP_GGRENT OP_GGRGID
+syn keyword xsConstant OP_GGRNAM OP_GHBYADDR OP_GHBYNAME OP_GHOSTENT OP_GLOB
+syn keyword xsConstant OP_GMTIME OP_GNBYADDR OP_GNBYNAME OP_GNETENT OP_GOTO
+syn keyword xsConstant OP_GPBYNAME OP_GPBYNUMBER OP_GPROTOENT OP_GPWENT
+syn keyword xsConstant OP_GPWNAM OP_GPWUID OP_GREPSTART OP_GREPWHILE
+syn keyword xsConstant OP_GSBYNAME OP_GSBYPORT OP_GSERVENT OP_GSOCKOPT OP_GT
+syn keyword xsConstant OP_GV OP_GVSV OP_HELEM OP_HEX OP_HINTSEVAL OP_HSLICE
+syn keyword xsConstant OP_INDEX OP_INT OP_INTROCV OP_IOCTL OP_ITER OP_I_ADD
+syn keyword xsConstant OP_I_DIVIDE OP_I_EQ OP_I_GE OP_I_GT OP_I_LE OP_I_LT
+syn keyword xsConstant OP_I_MODULO OP_I_MULTIPLY OP_I_NCMP OP_I_NE
+syn keyword xsConstant OP_I_NEGATE OP_I_POSTDEC OP_I_POSTINC OP_I_PREDEC
+syn keyword xsConstant OP_I_PREINC OP_I_SUBTRACT OP_JOIN OP_KEYS OP_KILL
+syn keyword xsConstant OP_KVASLICE OP_KVHSLICE OP_LAST OP_LC OP_LCFIRST OP_LE
+syn keyword xsConstant OP_LEAVE OP_LEAVEEVAL OP_LEAVEGIVEN OP_LEAVELOOP
+syn keyword xsConstant OP_LEAVESUB OP_LEAVESUBLV OP_LEAVETRY OP_LEAVEWHEN
+syn keyword xsConstant OP_LEAVEWRITE OP_LEFT_SHIFT OP_LENGTH OP_LINESEQ
+syn keyword xsConstant OP_LINK OP_LIST OP_LISTEN OP_LOCALTIME OP_LOCK OP_LOG
+syn keyword xsConstant OP_LSLICE OP_LSTAT OP_LT OP_LVAVREF OP_LVREF
+syn keyword xsConstant OP_LVREFSLICE OP_MAPSTART OP_MAPWHILE OP_MATCH
+syn keyword xsConstant OP_METHOD OP_METHOD_NAMED OP_METHOD_REDIR
+syn keyword xsConstant OP_METHOD_REDIR_SUPER OP_METHOD_SUPER OP_MKDIR
+syn keyword xsConstant OP_MODULO OP_MSGCTL OP_MSGGET OP_MSGRCV OP_MSGSND
+syn keyword xsConstant OP_MULTIDEREF OP_MULTIPLY OP_NBIT_AND OP_NBIT_OR
+syn keyword xsConstant OP_NBIT_XOR OP_NCMP OP_NCOMPLEMENT OP_NE OP_NEGATE
+syn keyword xsConstant OP_NEXT OP_NEXTSTATE OP_NOT OP_NULL OP_OCT OP_ONCE
+syn keyword xsConstant OP_OPEN OP_OPEN_DIR OP_OR OP_ORASSIGN OP_ORD OP_PACK
+syn keyword xsConstant OP_PADANY OP_PADAV OP_PADCV OP_PADHV OP_PADRANGE
+syn keyword xsConstant OP_PADSV OP_PIPE_OP OP_POP OP_POS OP_POSTDEC
+syn keyword xsConstant OP_POSTINC OP_POW OP_PREDEC OP_PREINC OP_PRINT
+syn keyword xsConstant OP_PROTOTYPE OP_PRTF OP_PUSH OP_PUSHMARK OP_PUSHRE
+syn keyword xsConstant OP_QR OP_QUOTEMETA OP_RAND OP_RANGE OP_RCATLINE
+syn keyword xsConstant OP_REACH OP_READ OP_READDIR OP_READLINE OP_READLINK
+syn keyword xsConstant OP_RECV OP_REDO OP_REF OP_REFASSIGN OP_REFGEN
+syn keyword xsConstant OP_REGCMAYBE OP_REGCOMP OP_REGCRESET OP_RENAME
+syn keyword xsConstant OP_REPEAT OP_REQUIRE OP_RESET OP_RETURN OP_REVERSE
+syn keyword xsConstant OP_REWINDDIR OP_RIGHT_SHIFT OP_RINDEX OP_RKEYS
+syn keyword xsConstant OP_RMDIR OP_RUNCV OP_RV2AV OP_RV2CV OP_RV2GV OP_RV2HV
+syn keyword xsConstant OP_RV2SV OP_RVALUES OP_SASSIGN OP_SAY OP_SBIT_AND
+syn keyword xsConstant OP_SBIT_OR OP_SBIT_XOR OP_SCALAR OP_SCHOMP OP_SCHOP
+syn keyword xsConstant OP_SCMP OP_SCOMPLEMENT OP_SCOPE OP_SEEK OP_SEEKDIR
+syn keyword xsConstant OP_SELECT OP_SEMCTL OP_SEMGET OP_SEMOP OP_SEND OP_SEQ
+syn keyword xsConstant OP_SETPGRP OP_SETPRIORITY OP_SGE OP_SGRENT OP_SGT
+syn keyword xsConstant OP_SHIFT OP_SHMCTL OP_SHMGET OP_SHMREAD OP_SHMWRITE
+syn keyword xsConstant OP_SHOSTENT OP_SHUTDOWN OP_SIN OP_SLE OP_SLEEP OP_SLT
+syn keyword xsConstant OP_SMARTMATCH OP_SNE OP_SNETENT OP_SOCKET OP_SOCKPAIR
+syn keyword xsConstant OP_SORT OP_SPLICE OP_SPLIT OP_SPRINTF OP_SPROTOENT
+syn keyword xsConstant OP_SPWENT OP_SQRT OP_SRAND OP_SREFGEN OP_SSELECT
+syn keyword xsConstant OP_SSERVENT OP_SSOCKOPT OP_STAT OP_STRINGIFY OP_STUB
+syn keyword xsConstant OP_STUDY OP_SUBST OP_SUBSTCONT OP_SUBSTR OP_SUBTRACT
+syn keyword xsConstant OP_SYMLINK OP_SYSCALL OP_SYSOPEN OP_SYSREAD OP_SYSSEEK
+syn keyword xsConstant OP_SYSTEM OP_SYSWRITE OP_TELL OP_TELLDIR OP_TIE
+syn keyword xsConstant OP_TIED OP_TIME OP_TMS OP_TRANS OP_TRANSR OP_TRUNCATE
+syn keyword xsConstant OP_UC OP_UCFIRST OP_UMASK OP_UNDEF OP_UNLINK OP_UNPACK
+syn keyword xsConstant OP_UNSHIFT OP_UNSTACK OP_UNTIE OP_UTIME OP_VALUES
+syn keyword xsConstant OP_VEC OP_WAIT OP_WAITPID OP_WANTARRAY OP_WARN OP_XOR
+syn keyword xsConstant OP_max OPf_FOLDED OPf_KIDS OPf_KNOW OPf_LIST OPf_MOD
+syn keyword xsConstant OPf_PARENS OPf_REF OPf_SPECIAL OPf_STACKED OPf_WANT
+syn keyword xsConstant OPf_WANT_LIST OPf_WANT_SCALAR OPf_WANT_VOID
+syn keyword xsConstant OPpALLOW_FAKE OPpARG1_MASK OPpARG2_MASK OPpARG3_MASK
+syn keyword xsConstant OPpARG4_MASK OPpASSIGN_BACKWARDS OPpASSIGN_COMMON
+syn keyword xsConstant OPpASSIGN_CV_TO_GV OPpCONST_BARE OPpCONST_ENTERED
+syn keyword xsConstant OPpCONST_NOVER OPpCONST_SHORTCIRCUIT OPpCONST_STRICT
+syn keyword xsConstant OPpCOREARGS_DEREF1 OPpCOREARGS_DEREF2
+syn keyword xsConstant OPpCOREARGS_PUSHMARK OPpCOREARGS_SCALARMOD OPpDEREF
+syn keyword xsConstant OPpDEREF_AV OPpDEREF_HV OPpDEREF_SV OPpDONT_INIT_GV
+syn keyword xsConstant OPpEARLY_CV OPpENTERSUB_AMPER OPpENTERSUB_DB
+syn keyword xsConstant OPpENTERSUB_HASTARG OPpENTERSUB_INARGS
+syn keyword xsConstant OPpENTERSUB_LVAL_MASK OPpENTERSUB_NOPAREN
+syn keyword xsConstant OPpEVAL_BYTES OPpEVAL_COPHH OPpEVAL_HAS_HH
+syn keyword xsConstant OPpEVAL_RE_REPARSING OPpEVAL_UNICODE OPpEXISTS_SUB
+syn keyword xsConstant OPpFLIP_LINENUM OPpFT_ACCESS OPpFT_AFTER_t
+syn keyword xsConstant OPpFT_STACKED OPpFT_STACKING OPpGREP_LEX
+syn keyword xsConstant OPpHINT_STRICT_REFS OPpHUSH_VMSISH OPpITER_DEF
+syn keyword xsConstant OPpITER_REVERSED OPpLIST_GUESSED OPpLVALUE
+syn keyword xsConstant OPpLVAL_DEFER OPpLVAL_INTRO OPpLVREF_AV OPpLVREF_CV
+syn keyword xsConstant OPpLVREF_ELEM OPpLVREF_HV OPpLVREF_ITER OPpLVREF_SV
+syn keyword xsConstant OPpLVREF_TYPE OPpMAYBE_LVSUB OPpMAYBE_TRUEBOOL
+syn keyword xsConstant OPpMAY_RETURN_CONSTANT OPpMULTIDEREF_DELETE
+syn keyword xsConstant OPpMULTIDEREF_EXISTS OPpOFFBYONE OPpOPEN_IN_CRLF
+syn keyword xsConstant OPpOPEN_IN_RAW OPpOPEN_OUT_CRLF OPpOPEN_OUT_RAW
+syn keyword xsConstant OPpOUR_INTRO OPpPADRANGE_COUNTMASK
+syn keyword xsConstant OPpPADRANGE_COUNTSHIFT OPpPAD_STATE OPpPV_IS_UTF8
+syn keyword xsConstant OPpREFCOUNTED OPpREPEAT_DOLIST OPpREVERSE_INPLACE
+syn keyword xsConstant OPpRUNTIME OPpSLICE OPpSLICEWARNING OPpSORT_DESCEND
syn keyword xsConstant OPpSORT_INPLACE OPpSORT_INTEGER OPpSORT_NUMERIC
syn keyword xsConstant OPpSORT_QSORT OPpSORT_REVERSE OPpSORT_STABLE
-syn keyword xsConstant OPpSUBSTR_REPL_FIRST OPpTARGET_MY OPpTRANS_ALL
-syn keyword xsConstant OPpTRANS_COMPLEMENT OPpTRANS_DELETE OPpTRANS_FROM_UTF
-syn keyword xsConstant OPpTRANS_GROWS OPpTRANS_IDENTICAL OPpTRANS_SQUASH
-syn keyword xsConstant OPpTRANS_TO_UTF PERL_MAGIC_READONLY_ACCEPTABLE
+syn keyword xsConstant OPpSPLIT_IMPLIM OPpSUBSTR_REPL_FIRST OPpTARGET_MY
+syn keyword xsConstant OPpTRANS_ALL OPpTRANS_COMPLEMENT OPpTRANS_DELETE
+syn keyword xsConstant OPpTRANS_FROM_UTF OPpTRANS_GROWS OPpTRANS_IDENTICAL
+syn keyword xsConstant OPpTRANS_SQUASH OPpTRANS_TO_UTF OPpTRUEBOOL
+syn keyword xsConstant PERL_MAGIC_READONLY_ACCEPTABLE
syn keyword xsConstant PERL_MAGIC_TYPE_IS_VALUE_MAGIC
syn keyword xsConstant PERL_MAGIC_TYPE_READONLY_ACCEPTABLE
syn keyword xsConstant PERL_MAGIC_UTF8_CACHESIZE PERL_MAGIC_VALUE_MAGIC
syn keyword xsConstant PERL_MAGIC_VTABLE_MASK PERL_MAGIC_arylen
syn keyword xsConstant PERL_MAGIC_arylen_p PERL_MAGIC_backref PERL_MAGIC_bm
syn keyword xsConstant PERL_MAGIC_checkcall PERL_MAGIC_collxfrm
-syn keyword xsConstant PERL_MAGIC_dbfile PERL_MAGIC_dbline PERL_MAGIC_defelem
-syn keyword xsConstant PERL_MAGIC_env PERL_MAGIC_envelem PERL_MAGIC_ext
-syn keyword xsConstant PERL_MAGIC_fm PERL_MAGIC_hints PERL_MAGIC_hintselem
-syn keyword xsConstant PERL_MAGIC_isa PERL_MAGIC_isaelem PERL_MAGIC_nkeys
-syn keyword xsConstant PERL_MAGIC_overload PERL_MAGIC_overload_elem
+syn keyword xsConstant PERL_MAGIC_dbfile PERL_MAGIC_dbline
+syn keyword xsConstant PERL_MAGIC_debugvar PERL_MAGIC_defelem PERL_MAGIC_env
+syn keyword xsConstant PERL_MAGIC_envelem PERL_MAGIC_ext PERL_MAGIC_fm
+syn keyword xsConstant PERL_MAGIC_hints PERL_MAGIC_hintselem PERL_MAGIC_isa
+syn keyword xsConstant PERL_MAGIC_isaelem PERL_MAGIC_lvref PERL_MAGIC_nkeys
syn keyword xsConstant PERL_MAGIC_overload_table PERL_MAGIC_pos PERL_MAGIC_qr
syn keyword xsConstant PERL_MAGIC_regdata PERL_MAGIC_regdatum
syn keyword xsConstant PERL_MAGIC_regex_global PERL_MAGIC_rhash
syn keyword xsConstant PERL_MAGIC_shared PERL_MAGIC_shared_scalar
-syn keyword xsConstant PERL_MAGIC_sig PERL_MAGIC_sigelem PERL_MAGIC_study
-syn keyword xsConstant PERL_MAGIC_substr PERL_MAGIC_sv PERL_MAGIC_symtab
-syn keyword xsConstant PERL_MAGIC_taint PERL_MAGIC_tied PERL_MAGIC_tiedelem
+syn keyword xsConstant PERL_MAGIC_sig PERL_MAGIC_sigelem PERL_MAGIC_substr
+syn keyword xsConstant PERL_MAGIC_sv PERL_MAGIC_symtab PERL_MAGIC_taint
+syn keyword xsConstant PERL_MAGIC_tied PERL_MAGIC_tiedelem
syn keyword xsConstant PERL_MAGIC_tiedscalar PERL_MAGIC_utf8 PERL_MAGIC_uvar
syn keyword xsConstant PERL_MAGIC_uvar_elem PERL_MAGIC_vec PERL_MAGIC_vstring
syn keyword xsConstant REGEX_ASCII_MORE_RESTRICTED_CHARSET
syn keyword xsConstant REGEX_ASCII_RESTRICTED_CHARSET REGEX_DEPENDS_CHARSET
-syn keyword xsConstant REGEX_LOCALE_CHARSET REGEX_UNICODE_CHARSET SVfARG
+syn keyword xsConstant REGEX_LOCALE_CHARSET REGEX_UNICODE_CHARSET SB_ATerm
+syn keyword xsConstant SB_BOUND SB_CR SB_Close SB_EDGE SB_Extend SB_Format
+syn keyword xsConstant SB_LF SB_Lower SB_Numeric SB_OLetter SB_Other
+syn keyword xsConstant SB_SContinue SB_STerm SB_Sep SB_Sp SB_Upper SVfARG
syn keyword xsConstant SVf_AMAGIC SVf_BREAK SVf_FAKE SVf_IOK SVf_IVisUV
-syn keyword xsConstant SVf_NOK SVf_OK SVf_OOK SVf_POK SVf_READONLY SVf_ROK
-syn keyword xsConstant SVf_THINKFIRST SVf_UTF8 SVp_IOK SVp_NOK SVp_POK
-syn keyword xsConstant SVp_SCREAM SVpad_NAME SVpad_OUR SVpad_STATE
+syn keyword xsConstant SVf_IsCOW SVf_NOK SVf_OK SVf_OOK SVf_POK SVf_PROTECT
+syn keyword xsConstant SVf_READONLY SVf_ROK SVf_THINKFIRST SVf_UTF8 SVp_IOK
+syn keyword xsConstant SVp_NOK SVp_POK SVp_SCREAM SVpad_OUR SVpad_STATE
syn keyword xsConstant SVpad_TYPED SVpav_REAL SVpav_REIFY SVpbm_TAIL
syn keyword xsConstant SVpbm_VALID SVpgv_GP SVphv_CLONEABLE SVphv_HASKFLAGS
-syn keyword xsConstant SVphv_LAZYDEL SVphv_REHASH SVphv_SHAREKEYS
-syn keyword xsConstant SVprv_PCS_IMPORTED SVprv_WEAKREF SVs_GMG SVs_OBJECT
-syn keyword xsConstant SVs_PADMY SVs_PADSTALE SVs_PADTMP SVs_RMG SVs_SMG
-syn keyword xsConstant SVs_TEMP SVt_BIND SVt_IV SVt_LAST SVt_NULL SVt_NV
-syn keyword xsConstant SVt_PV SVt_PVAV SVt_PVBM SVt_PVCV SVt_PVFM SVt_PVGV
-syn keyword xsConstant SVt_PVHV SVt_PVIO SVt_PVIV SVt_PVLV SVt_PVMG SVt_PVNV
-syn keyword xsConstant SVt_REGEXP SVt_RV TRUE XATTRBLOCK XATTRTERM XBLOCK
-syn keyword xsConstant XOPERATOR XREF XSTATE XTERM XTERMBLOCK XTERMORDORDOR
-syn keyword xsConstant padtidy_FORMAT padtidy_SUB padtidy_SUBCLONE
+syn keyword xsConstant SVphv_LAZYDEL SVphv_SHAREKEYS SVprv_PCS_IMPORTED
+syn keyword xsConstant SVprv_WEAKREF SVs_GMG SVs_OBJECT SVs_PADMY
+syn keyword xsConstant SVs_PADSTALE SVs_PADTMP SVs_RMG SVs_SMG SVs_TEMP
+syn keyword xsConstant SVt_INVLIST SVt_IV SVt_LAST SVt_NULL SVt_NV SVt_PV
+syn keyword xsConstant SVt_PVAV SVt_PVBM SVt_PVCV SVt_PVFM SVt_PVGV SVt_PVHV
+syn keyword xsConstant SVt_PVIO SVt_PVIV SVt_PVLV SVt_PVMG SVt_PVNV
+syn keyword xsConstant SVt_REGEXP SVt_RV TRADITIONAL_BOUND WB_ALetter
+syn keyword xsConstant WB_BOUND WB_CR WB_Double_Quote WB_EDGE WB_Extend
+syn keyword xsConstant WB_ExtendNumLet WB_Format WB_Hebrew_Letter WB_Katakana
+syn keyword xsConstant WB_LF WB_MidLetter WB_MidNum WB_MidNumLet WB_Newline
+syn keyword xsConstant WB_Numeric WB_Other WB_Regional_Indicator
+syn keyword xsConstant WB_Single_Quote WB_UNKNOWN XATTRBLOCK XATTRTERM XBLOCK
+syn keyword xsConstant XBLOCKTERM XOPERATOR XOPe_xop_class XOPe_xop_desc
+syn keyword xsConstant XOPe_xop_name XOPe_xop_peep XOPe_xop_ptr XPOSTDEREF
+syn keyword xsConstant XREF XSTATE XTERM XTERMBLOCK XTERMORDORDOR
+syn keyword xsConstant _CC_ENUM_ALPHA _CC_ENUM_ALPHANUMERIC _CC_ENUM_ASCII
+syn keyword xsConstant _CC_ENUM_BLANK _CC_ENUM_CASED _CC_ENUM_CNTRL
+syn keyword xsConstant _CC_ENUM_DIGIT _CC_ENUM_GRAPH _CC_ENUM_LOWER
+syn keyword xsConstant _CC_ENUM_PRINT _CC_ENUM_PUNCT _CC_ENUM_SPACE
+syn keyword xsConstant _CC_ENUM_UPPER _CC_ENUM_VERTSPACE _CC_ENUM_WORDCHAR
+syn keyword xsConstant _CC_ENUM_XDIGIT padtidy_FORMAT padtidy_SUB
+syn keyword xsConstant padtidy_SUBCLONE
syn keyword xsException XCPT_CATCH XCPT_RETHROW XCPT_TRY_END XCPT_TRY_START
syn keyword xsException dXCPT
syn keyword xsKeyword ALIAS: BOOT: CASE: CLEANUP: CODE: C_ARGS: DISABLE
@@ -492,11 +598,19 @@ syn keyword xsFunction Perl_PerlIO_read Perl_PerlIO_seek Perl_PerlIO_set_cnt
syn keyword xsFunction Perl_PerlIO_set_ptrcnt Perl_PerlIO_setlinebuf
syn keyword xsFunction Perl_PerlIO_stderr Perl_PerlIO_stdin
syn keyword xsFunction Perl_PerlIO_stdout Perl_PerlIO_tell Perl_PerlIO_unread
-syn keyword xsFunction Perl_PerlIO_write Perl_Slab_Alloc Perl_Slab_Free
-syn keyword xsFunction Perl__is_utf8_quotemeta Perl__to_uni_fold_flags
+syn keyword xsFunction Perl_PerlIO_write Perl__get_regclass_nonbitmap_data
+syn keyword xsFunction Perl__is_cur_LC_category_utf8
+syn keyword xsFunction Perl__is_in_locale_category Perl__is_uni_FOO
+syn keyword xsFunction Perl__is_uni_perl_idcont Perl__is_uni_perl_idstart
+syn keyword xsFunction Perl__is_utf8_FOO Perl__is_utf8_idcont
+syn keyword xsFunction Perl__is_utf8_idstart Perl__is_utf8_mark
+syn keyword xsFunction Perl__is_utf8_perl_idcont Perl__is_utf8_perl_idstart
+syn keyword xsFunction Perl__is_utf8_xidcont Perl__is_utf8_xidstart
+syn keyword xsFunction Perl__new_invlist_C_array Perl__to_uni_fold_flags
syn keyword xsFunction Perl__to_utf8_fold_flags Perl__to_utf8_lower_flags
syn keyword xsFunction Perl__to_utf8_title_flags Perl__to_utf8_upper_flags
-syn keyword xsFunction Perl_amagic_call Perl_amagic_deref_call Perl_any_dup
+syn keyword xsFunction Perl_alloccopstash Perl_amagic_call
+syn keyword xsFunction Perl_amagic_deref_call Perl_any_dup
syn keyword xsFunction Perl_apply_attrs_string Perl_atfork_lock
syn keyword xsFunction Perl_atfork_unlock Perl_av_arylen_p Perl_av_clear
syn keyword xsFunction Perl_av_create_and_push Perl_av_create_and_unshift_one
@@ -504,13 +618,14 @@ syn keyword xsFunction Perl_av_delete Perl_av_exists Perl_av_extend
syn keyword xsFunction Perl_av_fetch Perl_av_fill Perl_av_iter_p Perl_av_len
syn keyword xsFunction Perl_av_make Perl_av_pop Perl_av_push Perl_av_shift
syn keyword xsFunction Perl_av_store Perl_av_undef Perl_av_unshift
-syn keyword xsFunction Perl_block_gimme Perl_blockhook_register
-syn keyword xsFunction Perl_bytes_cmp_utf8 Perl_bytes_from_utf8
-syn keyword xsFunction Perl_bytes_to_utf8 Perl_call_argv Perl_call_atexit
-syn keyword xsFunction Perl_call_list Perl_call_method Perl_call_pv
-syn keyword xsFunction Perl_call_sv Perl_caller_cx Perl_calloc Perl_cast_i32
-syn keyword xsFunction Perl_cast_iv Perl_cast_ulong Perl_cast_uv
-syn keyword xsFunction Perl_ck_entersub_args_list Perl_ck_entersub_args_proto
+syn keyword xsFunction Perl_block_end Perl_block_gimme Perl_block_start
+syn keyword xsFunction Perl_blockhook_register Perl_bytes_cmp_utf8
+syn keyword xsFunction Perl_bytes_from_utf8 Perl_bytes_to_utf8 Perl_call_argv
+syn keyword xsFunction Perl_call_atexit Perl_call_list Perl_call_method
+syn keyword xsFunction Perl_call_pv Perl_call_sv Perl_caller_cx Perl_calloc
+syn keyword xsFunction Perl_cast_i32 Perl_cast_iv Perl_cast_ulong
+syn keyword xsFunction Perl_cast_uv Perl_ck_entersub_args_list
+syn keyword xsFunction Perl_ck_entersub_args_proto
syn keyword xsFunction Perl_ck_entersub_args_proto_or_list Perl_ck_warner
syn keyword xsFunction Perl_ck_warner_d Perl_ckwarn Perl_ckwarn_d
syn keyword xsFunction Perl_clone_params_del Perl_clone_params_new
@@ -518,38 +633,39 @@ syn keyword xsFunction Perl_cop_fetch_label Perl_cop_store_label Perl_croak
syn keyword xsFunction Perl_croak_no_modify Perl_croak_nocontext
syn keyword xsFunction Perl_croak_sv Perl_croak_xs_usage Perl_csighandler
syn keyword xsFunction Perl_custom_op_desc Perl_custom_op_name
-syn keyword xsFunction Perl_custom_op_register Perl_custom_op_xop
-syn keyword xsFunction Perl_cv_clone Perl_cv_const_sv
-syn keyword xsFunction Perl_cv_get_call_checker Perl_cv_set_call_checker
-syn keyword xsFunction Perl_cv_undef Perl_cx_dump Perl_cx_dup Perl_cxinc
-syn keyword xsFunction Perl_deb Perl_deb_nocontext Perl_debop
-syn keyword xsFunction Perl_debprofdump Perl_debstack Perl_debstackptrs
-syn keyword xsFunction Perl_delimcpy Perl_despatch_signals Perl_die
-syn keyword xsFunction Perl_die_nocontext Perl_die_sv Perl_dirp_dup
-syn keyword xsFunction Perl_do_aspawn Perl_do_binmode Perl_do_close
-syn keyword xsFunction Perl_do_gv_dump Perl_do_gvgv_dump Perl_do_hv_dump
-syn keyword xsFunction Perl_do_join Perl_do_magic_dump Perl_do_op_dump
-syn keyword xsFunction Perl_do_open9 Perl_do_openn Perl_do_pmop_dump
-syn keyword xsFunction Perl_do_spawn Perl_do_spawn_nowait Perl_do_sprintf
-syn keyword xsFunction Perl_do_sv_dump Perl_doing_taint Perl_doref
-syn keyword xsFunction Perl_dounwind Perl_dowantarray Perl_dump_all
-syn keyword xsFunction Perl_dump_eval Perl_dump_fds Perl_dump_form
-syn keyword xsFunction Perl_dump_indent Perl_dump_mstats Perl_dump_packsubs
-syn keyword xsFunction Perl_dump_sub Perl_dump_vindent Perl_eval_pv
-syn keyword xsFunction Perl_eval_sv Perl_fbm_compile Perl_fbm_instr
-syn keyword xsFunction Perl_filter_add Perl_filter_del Perl_filter_read
-syn keyword xsFunction Perl_find_runcv Perl_find_rundefsv Perl_foldEQ
-syn keyword xsFunction Perl_foldEQ_latin1 Perl_foldEQ_locale
-syn keyword xsFunction Perl_foldEQ_utf8_flags Perl_form Perl_form_nocontext
-syn keyword xsFunction Perl_fp_dup Perl_fprintf_nocontext
+syn keyword xsFunction Perl_custom_op_register Perl_cv_clone Perl_cv_const_sv
+syn keyword xsFunction Perl_cv_get_call_checker Perl_cv_name
+syn keyword xsFunction Perl_cv_set_call_checker
+syn keyword xsFunction Perl_cv_set_call_checker_flags Perl_cv_undef
+syn keyword xsFunction Perl_cx_dump Perl_cx_dup Perl_cxinc Perl_deb
+syn keyword xsFunction Perl_deb_nocontext Perl_debop Perl_debprofdump
+syn keyword xsFunction Perl_debstack Perl_debstackptrs Perl_delimcpy
+syn keyword xsFunction Perl_despatch_signals Perl_die Perl_die_nocontext
+syn keyword xsFunction Perl_die_sv Perl_dirp_dup Perl_do_aspawn
+syn keyword xsFunction Perl_do_binmode Perl_do_close Perl_do_gv_dump
+syn keyword xsFunction Perl_do_gvgv_dump Perl_do_hv_dump Perl_do_join
+syn keyword xsFunction Perl_do_magic_dump Perl_do_op_dump Perl_do_open9
+syn keyword xsFunction Perl_do_openn Perl_do_pmop_dump Perl_do_spawn
+syn keyword xsFunction Perl_do_spawn_nowait Perl_do_sprintf Perl_do_sv_dump
+syn keyword xsFunction Perl_doing_taint Perl_doref Perl_dounwind
+syn keyword xsFunction Perl_dowantarray Perl_dump_all Perl_dump_c_backtrace
+syn keyword xsFunction Perl_dump_eval Perl_dump_form Perl_dump_indent
+syn keyword xsFunction Perl_dump_mstats Perl_dump_packsubs Perl_dump_sub
+syn keyword xsFunction Perl_dump_vindent Perl_eval_pv Perl_eval_sv
+syn keyword xsFunction Perl_fbm_compile Perl_fbm_instr Perl_filter_add
+syn keyword xsFunction Perl_filter_del Perl_filter_read Perl_find_runcv
+syn keyword xsFunction Perl_find_rundefsv Perl_foldEQ Perl_foldEQ_latin1
+syn keyword xsFunction Perl_foldEQ_locale Perl_foldEQ_utf8_flags Perl_form
+syn keyword xsFunction Perl_form_nocontext Perl_fp_dup Perl_fprintf_nocontext
syn keyword xsFunction Perl_free_global_struct Perl_free_tmps Perl_get_av
-syn keyword xsFunction Perl_get_context Perl_get_cv Perl_get_cvn_flags
-syn keyword xsFunction Perl_get_hv Perl_get_mstats Perl_get_op_descs
-syn keyword xsFunction Perl_get_op_names Perl_get_ppaddr Perl_get_sv
-syn keyword xsFunction Perl_get_vtbl Perl_getcwd_sv Perl_gp_dup Perl_gp_free
-syn keyword xsFunction Perl_gp_ref Perl_grok_bin Perl_grok_hex
-syn keyword xsFunction Perl_grok_number Perl_grok_numeric_radix Perl_grok_oct
-syn keyword xsFunction Perl_gv_add_by_type Perl_gv_autoload_pv
+syn keyword xsFunction Perl_get_c_backtrace_dump Perl_get_context Perl_get_cv
+syn keyword xsFunction Perl_get_cvn_flags Perl_get_hv Perl_get_mstats
+syn keyword xsFunction Perl_get_op_descs Perl_get_op_names Perl_get_ppaddr
+syn keyword xsFunction Perl_get_sv Perl_get_vtbl Perl_getcwd_sv Perl_gp_dup
+syn keyword xsFunction Perl_gp_free Perl_gp_ref Perl_grok_bin Perl_grok_hex
+syn keyword xsFunction Perl_grok_infnan Perl_grok_number
+syn keyword xsFunction Perl_grok_number_flags Perl_grok_numeric_radix
+syn keyword xsFunction Perl_grok_oct Perl_gv_add_by_type Perl_gv_autoload_pv
syn keyword xsFunction Perl_gv_autoload_pvn Perl_gv_autoload_sv Perl_gv_check
syn keyword xsFunction Perl_gv_const_sv Perl_gv_dump Perl_gv_efullname
syn keyword xsFunction Perl_gv_efullname4 Perl_gv_fetchfile
@@ -574,72 +690,50 @@ syn keyword xsFunction Perl_hv_eiter_set Perl_hv_fill Perl_hv_free_ent
syn keyword xsFunction Perl_hv_iterinit Perl_hv_iterkey Perl_hv_iterkeysv
syn keyword xsFunction Perl_hv_iternext_flags Perl_hv_iternextsv
syn keyword xsFunction Perl_hv_iterval Perl_hv_ksplit Perl_hv_name_set
-syn keyword xsFunction Perl_hv_placeholders_get Perl_hv_placeholders_p
-syn keyword xsFunction Perl_hv_placeholders_set Perl_hv_riter_p
-syn keyword xsFunction Perl_hv_riter_set Perl_hv_scalar
-syn keyword xsFunction Perl_init_global_struct Perl_init_i18nl10n
-syn keyword xsFunction Perl_init_i18nl14n Perl_init_stacks Perl_init_tm
-syn keyword xsFunction Perl_instr Perl_is_ascii_string Perl_is_lvalue_sub
-syn keyword xsFunction Perl_is_uni_alnum Perl_is_uni_alnum_lc
-syn keyword xsFunction Perl_is_uni_alpha Perl_is_uni_alpha_lc
-syn keyword xsFunction Perl_is_uni_ascii Perl_is_uni_ascii_lc
-syn keyword xsFunction Perl_is_uni_cntrl Perl_is_uni_cntrl_lc
-syn keyword xsFunction Perl_is_uni_digit Perl_is_uni_digit_lc
-syn keyword xsFunction Perl_is_uni_graph Perl_is_uni_graph_lc
-syn keyword xsFunction Perl_is_uni_idfirst Perl_is_uni_idfirst_lc
-syn keyword xsFunction Perl_is_uni_lower Perl_is_uni_lower_lc
-syn keyword xsFunction Perl_is_uni_print Perl_is_uni_print_lc
-syn keyword xsFunction Perl_is_uni_punct Perl_is_uni_punct_lc
-syn keyword xsFunction Perl_is_uni_space Perl_is_uni_space_lc
-syn keyword xsFunction Perl_is_uni_upper Perl_is_uni_upper_lc
-syn keyword xsFunction Perl_is_uni_xdigit Perl_is_uni_xdigit_lc
-syn keyword xsFunction Perl_is_utf8_alnum Perl_is_utf8_alpha
-syn keyword xsFunction Perl_is_utf8_ascii Perl_is_utf8_char_buf
-syn keyword xsFunction Perl_is_utf8_cntrl Perl_is_utf8_digit
-syn keyword xsFunction Perl_is_utf8_graph Perl_is_utf8_idcont
-syn keyword xsFunction Perl_is_utf8_idfirst Perl_is_utf8_lower
-syn keyword xsFunction Perl_is_utf8_mark Perl_is_utf8_perl_space
-syn keyword xsFunction Perl_is_utf8_perl_word Perl_is_utf8_posix_digit
-syn keyword xsFunction Perl_is_utf8_print Perl_is_utf8_punct
-syn keyword xsFunction Perl_is_utf8_space Perl_is_utf8_string
-syn keyword xsFunction Perl_is_utf8_string_loclen Perl_is_utf8_upper
-syn keyword xsFunction Perl_is_utf8_xdigit Perl_is_utf8_xidcont
-syn keyword xsFunction Perl_is_utf8_xidfirst Perl_leave_scope
-syn keyword xsFunction Perl_lex_bufutf8 Perl_lex_discard_to
-syn keyword xsFunction Perl_lex_grow_linestr Perl_lex_next_chunk
-syn keyword xsFunction Perl_lex_peek_unichar Perl_lex_read_space
-syn keyword xsFunction Perl_lex_read_to Perl_lex_read_unichar Perl_lex_start
-syn keyword xsFunction Perl_lex_stuff_pv Perl_lex_stuff_pvn Perl_lex_stuff_sv
-syn keyword xsFunction Perl_lex_unstuff Perl_load_module
-syn keyword xsFunction Perl_load_module_nocontext Perl_looks_like_number
-syn keyword xsFunction Perl_magic_dump Perl_malloc Perl_markstack_grow
-syn keyword xsFunction Perl_mess Perl_mess_nocontext Perl_mess_sv Perl_mfree
-syn keyword xsFunction Perl_mg_clear Perl_mg_copy Perl_mg_dup Perl_mg_find
-syn keyword xsFunction Perl_mg_findext Perl_mg_free Perl_mg_free_type
-syn keyword xsFunction Perl_mg_get Perl_mg_length Perl_mg_magical Perl_mg_set
-syn keyword xsFunction Perl_mg_size Perl_mini_mktime Perl_moreswitches
-syn keyword xsFunction Perl_mro_get_from_name Perl_mro_get_linear_isa
-syn keyword xsFunction Perl_mro_get_private_data Perl_mro_method_changed_in
-syn keyword xsFunction Perl_mro_register Perl_mro_set_mro
-syn keyword xsFunction Perl_mro_set_private_data Perl_my_atof Perl_my_atof2
-syn keyword xsFunction Perl_my_bcopy Perl_my_bzero Perl_my_chsize
-syn keyword xsFunction Perl_my_cxt_index Perl_my_cxt_init Perl_my_dirfd
-syn keyword xsFunction Perl_my_exit Perl_my_failure_exit Perl_my_fflush_all
-syn keyword xsFunction Perl_my_fork Perl_my_htonl Perl_my_memcmp
-syn keyword xsFunction Perl_my_memset Perl_my_ntohl Perl_my_pclose
-syn keyword xsFunction Perl_my_popen Perl_my_popen_list Perl_my_setenv
+syn keyword xsFunction Perl_hv_placeholders_get Perl_hv_placeholders_set
+syn keyword xsFunction Perl_hv_rand_set Perl_hv_riter_p Perl_hv_riter_set
+syn keyword xsFunction Perl_hv_scalar Perl_init_global_struct
+syn keyword xsFunction Perl_init_i18nl10n Perl_init_i18nl14n Perl_init_stacks
+syn keyword xsFunction Perl_init_tm Perl_instr Perl_intro_my
+syn keyword xsFunction Perl_is_invariant_string Perl_is_lvalue_sub
+syn keyword xsFunction Perl_is_utf8_string Perl_is_utf8_string_loclen
+syn keyword xsFunction Perl_isinfnan Perl_leave_scope Perl_lex_bufutf8
+syn keyword xsFunction Perl_lex_discard_to Perl_lex_grow_linestr
+syn keyword xsFunction Perl_lex_next_chunk Perl_lex_peek_unichar
+syn keyword xsFunction Perl_lex_read_space Perl_lex_read_to
+syn keyword xsFunction Perl_lex_read_unichar Perl_lex_start Perl_lex_stuff_pv
+syn keyword xsFunction Perl_lex_stuff_pvn Perl_lex_stuff_sv Perl_lex_unstuff
+syn keyword xsFunction Perl_load_module Perl_load_module_nocontext
+syn keyword xsFunction Perl_looks_like_number Perl_magic_dump Perl_malloc
+syn keyword xsFunction Perl_markstack_grow Perl_mess Perl_mess_nocontext
+syn keyword xsFunction Perl_mess_sv Perl_mfree Perl_mg_clear Perl_mg_copy
+syn keyword xsFunction Perl_mg_dup Perl_mg_find Perl_mg_findext Perl_mg_free
+syn keyword xsFunction Perl_mg_free_type Perl_mg_get Perl_mg_magical
+syn keyword xsFunction Perl_mg_set Perl_mg_size Perl_mini_mktime
+syn keyword xsFunction Perl_moreswitches Perl_mro_get_from_name
+syn keyword xsFunction Perl_mro_get_linear_isa Perl_mro_get_private_data
+syn keyword xsFunction Perl_mro_method_changed_in Perl_mro_register
+syn keyword xsFunction Perl_mro_set_mro Perl_mro_set_private_data
+syn keyword xsFunction Perl_my_atof Perl_my_atof2 Perl_my_bcopy Perl_my_bzero
+syn keyword xsFunction Perl_my_chsize Perl_my_cxt_index Perl_my_cxt_init
+syn keyword xsFunction Perl_my_dirfd Perl_my_exit Perl_my_failure_exit
+syn keyword xsFunction Perl_my_fflush_all Perl_my_fork Perl_my_memcmp
+syn keyword xsFunction Perl_my_memset Perl_my_pclose Perl_my_popen
+syn keyword xsFunction Perl_my_popen_list Perl_my_setenv Perl_my_setlocale
syn keyword xsFunction Perl_my_snprintf Perl_my_socketpair Perl_my_sprintf
-syn keyword xsFunction Perl_my_strftime Perl_my_strlcat Perl_my_strlcpy
-syn keyword xsFunction Perl_my_swap Perl_my_vsnprintf Perl_newANONATTRSUB
+syn keyword xsFunction Perl_my_strerror Perl_my_strftime Perl_my_strlcat
+syn keyword xsFunction Perl_my_strlcpy Perl_my_vsnprintf Perl_newANONATTRSUB
syn keyword xsFunction Perl_newANONHASH Perl_newANONLIST Perl_newANONSUB
-syn keyword xsFunction Perl_newASSIGNOP Perl_newATTRSUB Perl_newAVREF
-syn keyword xsFunction Perl_newBINOP Perl_newCONDOP Perl_newCONSTSUB
-syn keyword xsFunction Perl_newCONSTSUB_flags Perl_newCVREF Perl_newFORM
+syn keyword xsFunction Perl_newASSIGNOP Perl_newAVREF Perl_newBINOP
+syn keyword xsFunction Perl_newCONDOP Perl_newCONSTSUB Perl_newCONSTSUB_flags
+syn keyword xsFunction Perl_newCVREF Perl_newDEFSVOP Perl_newFORM
syn keyword xsFunction Perl_newFOROP Perl_newGIVENOP Perl_newGVOP
syn keyword xsFunction Perl_newGVREF Perl_newGVgen_flags Perl_newHVREF
syn keyword xsFunction Perl_newHVhv Perl_newLISTOP Perl_newLOGOP
-syn keyword xsFunction Perl_newLOOPEX Perl_newLOOPOP Perl_newMYSUB
-syn keyword xsFunction Perl_newNULLLIST Perl_newOP Perl_newPADOP Perl_newPMOP
+syn keyword xsFunction Perl_newLOOPEX Perl_newLOOPOP Perl_newMETHOP
+syn keyword xsFunction Perl_newMETHOP_named Perl_newMYSUB Perl_newNULLLIST
+syn keyword xsFunction Perl_newOP Perl_newPADNAMELIST Perl_newPADNAMEouter
+syn keyword xsFunction Perl_newPADNAMEpvn Perl_newPADOP Perl_newPMOP
syn keyword xsFunction Perl_newPROG Perl_newPVOP Perl_newRANGE Perl_newRV
syn keyword xsFunction Perl_newRV_noinc Perl_newSLICEOP Perl_newSTATEOP
syn keyword xsFunction Perl_newSV Perl_newSVOP Perl_newSVREF Perl_newSV_type
@@ -647,21 +741,24 @@ syn keyword xsFunction Perl_newSVhek Perl_newSViv Perl_newSVnv Perl_newSVpv
syn keyword xsFunction Perl_newSVpv_share Perl_newSVpvf
syn keyword xsFunction Perl_newSVpvf_nocontext Perl_newSVpvn
syn keyword xsFunction Perl_newSVpvn_flags Perl_newSVpvn_share Perl_newSVrv
-syn keyword xsFunction Perl_newSVsv Perl_newSVuv Perl_newUNOP Perl_newWHENOP
-syn keyword xsFunction Perl_newWHILEOP Perl_newXS Perl_newXS_flags
-syn keyword xsFunction Perl_new_collate Perl_new_ctype Perl_new_numeric
-syn keyword xsFunction Perl_new_stackinfo Perl_new_version Perl_ninstr
-syn keyword xsFunction Perl_nothreadhook Perl_op_append_elem
-syn keyword xsFunction Perl_op_append_list Perl_op_contextualize Perl_op_dump
-syn keyword xsFunction Perl_op_free Perl_op_linklist Perl_op_null
-syn keyword xsFunction Perl_op_prepend_elem Perl_op_refcnt_lock
-syn keyword xsFunction Perl_op_refcnt_unlock Perl_op_scope Perl_pack_cat
+syn keyword xsFunction Perl_newSVsv Perl_newSVuv Perl_newUNOP
+syn keyword xsFunction Perl_newUNOP_AUX Perl_newWHENOP Perl_newWHILEOP
+syn keyword xsFunction Perl_newXS Perl_newXS_flags Perl_new_collate
+syn keyword xsFunction Perl_new_ctype Perl_new_numeric Perl_new_stackinfo
+syn keyword xsFunction Perl_new_version Perl_ninstr Perl_nothreadhook
+syn keyword xsFunction Perl_op_append_elem Perl_op_append_list
+syn keyword xsFunction Perl_op_contextualize Perl_op_convert_list
+syn keyword xsFunction Perl_op_dump Perl_op_free Perl_op_linklist
+syn keyword xsFunction Perl_op_null Perl_op_parent Perl_op_prepend_elem
+syn keyword xsFunction Perl_op_refcnt_lock Perl_op_refcnt_unlock
+syn keyword xsFunction Perl_op_scope Perl_op_sibling_splice Perl_pack_cat
syn keyword xsFunction Perl_packlist Perl_pad_add_anon Perl_pad_add_name_pv
syn keyword xsFunction Perl_pad_add_name_pvn Perl_pad_add_name_sv
syn keyword xsFunction Perl_pad_alloc Perl_pad_compname_type
syn keyword xsFunction Perl_pad_findmy_pv Perl_pad_findmy_pvn
syn keyword xsFunction Perl_pad_findmy_sv Perl_pad_new Perl_pad_setsv
-syn keyword xsFunction Perl_pad_sv Perl_pad_tidy Perl_parse_arithexpr
+syn keyword xsFunction Perl_pad_sv Perl_pad_tidy Perl_padnamelist_fetch
+syn keyword xsFunction Perl_padnamelist_store Perl_parse_arithexpr
syn keyword xsFunction Perl_parse_barestmt Perl_parse_block
syn keyword xsFunction Perl_parse_fullexpr Perl_parse_fullstmt
syn keyword xsFunction Perl_parse_label Perl_parse_listexpr
@@ -673,7 +770,9 @@ syn keyword xsFunction Perl_ptr_table_fetch Perl_ptr_table_free
syn keyword xsFunction Perl_ptr_table_new Perl_ptr_table_split
syn keyword xsFunction Perl_ptr_table_store Perl_push_scope Perl_pv_display
syn keyword xsFunction Perl_pv_escape Perl_pv_pretty Perl_pv_uni_display
-syn keyword xsFunction Perl_re_compile Perl_re_dup_guts Perl_re_intuit_start
+syn keyword xsFunction Perl_quadmath_format_needed
+syn keyword xsFunction Perl_quadmath_format_single Perl_re_compile
+syn keyword xsFunction Perl_re_dup_guts Perl_re_intuit_start
syn keyword xsFunction Perl_re_intuit_string Perl_realloc Perl_reentrant_free
syn keyword xsFunction Perl_reentrant_init Perl_reentrant_retry
syn keyword xsFunction Perl_reentrant_size Perl_reg_named_buff_all
@@ -707,37 +806,38 @@ syn keyword xsFunction Perl_savesharedpv Perl_savesharedpvn
syn keyword xsFunction Perl_savesharedsvpv Perl_savestack_grow
syn keyword xsFunction Perl_savestack_grow_cnt Perl_savesvpv Perl_scan_bin
syn keyword xsFunction Perl_scan_hex Perl_scan_num Perl_scan_oct
-syn keyword xsFunction Perl_scan_version Perl_scan_vstring Perl_screaminstr
-syn keyword xsFunction Perl_seed Perl_set_context Perl_set_numeric_local
+syn keyword xsFunction Perl_scan_version Perl_scan_vstring Perl_seed
+syn keyword xsFunction Perl_set_context Perl_set_numeric_local
syn keyword xsFunction Perl_set_numeric_radix Perl_set_numeric_standard
syn keyword xsFunction Perl_setdefout Perl_share_hek Perl_si_dup Perl_sortsv
syn keyword xsFunction Perl_sortsv_flags Perl_ss_dup Perl_stack_grow
-syn keyword xsFunction Perl_start_subparse Perl_stashpv_hvname_match
-syn keyword xsFunction Perl_str_to_version Perl_sv_2bool_flags Perl_sv_2cv
-syn keyword xsFunction Perl_sv_2io Perl_sv_2iv_flags Perl_sv_2mortal
-syn keyword xsFunction Perl_sv_2nv_flags Perl_sv_2pv_flags Perl_sv_2pvbyte
-syn keyword xsFunction Perl_sv_2pvutf8 Perl_sv_2uv_flags Perl_sv_backoff
-syn keyword xsFunction Perl_sv_bless Perl_sv_cat_decode Perl_sv_catpv
-syn keyword xsFunction Perl_sv_catpv_flags Perl_sv_catpv_mg Perl_sv_catpvf
-syn keyword xsFunction Perl_sv_catpvf_mg Perl_sv_catpvf_mg_nocontext
-syn keyword xsFunction Perl_sv_catpvf_nocontext Perl_sv_catpvn_flags
-syn keyword xsFunction Perl_sv_catsv_flags Perl_sv_chop Perl_sv_clear
-syn keyword xsFunction Perl_sv_cmp Perl_sv_cmp_flags Perl_sv_cmp_locale
-syn keyword xsFunction Perl_sv_cmp_locale_flags Perl_sv_collxfrm_flags
-syn keyword xsFunction Perl_sv_copypv Perl_sv_dec Perl_sv_dec_nomg
-syn keyword xsFunction Perl_sv_derived_from Perl_sv_derived_from_pv
-syn keyword xsFunction Perl_sv_derived_from_pvn Perl_sv_derived_from_sv
-syn keyword xsFunction Perl_sv_destroyable Perl_sv_does Perl_sv_does_pv
-syn keyword xsFunction Perl_sv_does_pvn Perl_sv_does_sv Perl_sv_dump
-syn keyword xsFunction Perl_sv_dup Perl_sv_dup_inc Perl_sv_eq_flags
-syn keyword xsFunction Perl_sv_force_normal_flags Perl_sv_free Perl_sv_gets
-syn keyword xsFunction Perl_sv_grow Perl_sv_inc Perl_sv_inc_nomg
-syn keyword xsFunction Perl_sv_insert_flags Perl_sv_isa Perl_sv_isobject
-syn keyword xsFunction Perl_sv_iv Perl_sv_len Perl_sv_len_utf8 Perl_sv_magic
-syn keyword xsFunction Perl_sv_magicext Perl_sv_mortalcopy Perl_sv_newmortal
-syn keyword xsFunction Perl_sv_newref Perl_sv_nosharing Perl_sv_nounlocking
-syn keyword xsFunction Perl_sv_nv Perl_sv_peek Perl_sv_pos_b2u
-syn keyword xsFunction Perl_sv_pos_u2b Perl_sv_pos_u2b_flags Perl_sv_pvbyten
+syn keyword xsFunction Perl_start_subparse Perl_str_to_version
+syn keyword xsFunction Perl_sv_2bool_flags Perl_sv_2cv Perl_sv_2io
+syn keyword xsFunction Perl_sv_2iv_flags Perl_sv_2mortal Perl_sv_2nv_flags
+syn keyword xsFunction Perl_sv_2pv_flags Perl_sv_2pvbyte Perl_sv_2pvutf8
+syn keyword xsFunction Perl_sv_2uv_flags Perl_sv_backoff Perl_sv_bless
+syn keyword xsFunction Perl_sv_cat_decode Perl_sv_catpv Perl_sv_catpv_flags
+syn keyword xsFunction Perl_sv_catpv_mg Perl_sv_catpvf Perl_sv_catpvf_mg
+syn keyword xsFunction Perl_sv_catpvf_mg_nocontext Perl_sv_catpvf_nocontext
+syn keyword xsFunction Perl_sv_catpvn_flags Perl_sv_catsv_flags Perl_sv_chop
+syn keyword xsFunction Perl_sv_clear Perl_sv_cmp Perl_sv_cmp_flags
+syn keyword xsFunction Perl_sv_cmp_locale Perl_sv_cmp_locale_flags
+syn keyword xsFunction Perl_sv_collxfrm_flags Perl_sv_copypv_flags
+syn keyword xsFunction Perl_sv_dec Perl_sv_dec_nomg Perl_sv_derived_from
+syn keyword xsFunction Perl_sv_derived_from_pv Perl_sv_derived_from_pvn
+syn keyword xsFunction Perl_sv_derived_from_sv Perl_sv_destroyable
+syn keyword xsFunction Perl_sv_does Perl_sv_does_pv Perl_sv_does_pvn
+syn keyword xsFunction Perl_sv_does_sv Perl_sv_dump Perl_sv_dup
+syn keyword xsFunction Perl_sv_dup_inc Perl_sv_eq_flags
+syn keyword xsFunction Perl_sv_force_normal_flags Perl_sv_free
+syn keyword xsFunction Perl_sv_get_backrefs Perl_sv_gets Perl_sv_grow
+syn keyword xsFunction Perl_sv_inc Perl_sv_inc_nomg Perl_sv_insert_flags
+syn keyword xsFunction Perl_sv_isa Perl_sv_isobject Perl_sv_iv Perl_sv_len
+syn keyword xsFunction Perl_sv_len_utf8 Perl_sv_magic Perl_sv_magicext
+syn keyword xsFunction Perl_sv_newmortal Perl_sv_newref Perl_sv_nosharing
+syn keyword xsFunction Perl_sv_nounlocking Perl_sv_nv Perl_sv_peek
+syn keyword xsFunction Perl_sv_pos_b2u Perl_sv_pos_b2u_flags Perl_sv_pos_u2b
+syn keyword xsFunction Perl_sv_pos_u2b_flags Perl_sv_pvbyten
syn keyword xsFunction Perl_sv_pvbyten_force Perl_sv_pvn
syn keyword xsFunction Perl_sv_pvn_force_flags Perl_sv_pvn_nomg
syn keyword xsFunction Perl_sv_pvutf8n Perl_sv_pvutf8n_force
@@ -758,67 +858,74 @@ syn keyword xsFunction Perl_sv_usepvn_flags Perl_sv_utf8_decode
syn keyword xsFunction Perl_sv_utf8_downgrade Perl_sv_utf8_encode
syn keyword xsFunction Perl_sv_utf8_upgrade_flags_grow Perl_sv_uv
syn keyword xsFunction Perl_sv_vcatpvf Perl_sv_vcatpvf_mg Perl_sv_vcatpvfn
-syn keyword xsFunction Perl_sv_vsetpvf Perl_sv_vsetpvf_mg Perl_sv_vsetpvfn
-syn keyword xsFunction Perl_swash_fetch Perl_swash_init Perl_sys_init
+syn keyword xsFunction Perl_sv_vcatpvfn_flags Perl_sv_vsetpvf
+syn keyword xsFunction Perl_sv_vsetpvf_mg Perl_sv_vsetpvfn Perl_swash_fetch
+syn keyword xsFunction Perl_swash_init Perl_sync_locale Perl_sys_init
syn keyword xsFunction Perl_sys_init3 Perl_sys_intern_clear
syn keyword xsFunction Perl_sys_intern_dup Perl_sys_intern_init Perl_sys_term
-syn keyword xsFunction Perl_taint_env Perl_taint_proper Perl_tmps_grow
-syn keyword xsFunction Perl_to_uni_lower Perl_to_uni_lower_lc
-syn keyword xsFunction Perl_to_uni_title Perl_to_uni_title_lc
-syn keyword xsFunction Perl_to_uni_upper Perl_to_uni_upper_lc
-syn keyword xsFunction Perl_to_utf8_case Perl_unlnk Perl_unpack_str
-syn keyword xsFunction Perl_unpackstring Perl_unsharepvn Perl_upg_version
-syn keyword xsFunction Perl_utf16_to_utf8 Perl_utf16_to_utf8_reversed
-syn keyword xsFunction Perl_utf8_distance Perl_utf8_hop Perl_utf8_length
-syn keyword xsFunction Perl_utf8_to_bytes Perl_utf8_to_uvchr_buf
-syn keyword xsFunction Perl_utf8_to_uvuni_buf Perl_utf8n_to_uvchr
-syn keyword xsFunction Perl_utf8n_to_uvuni Perl_uvchr_to_utf8
-syn keyword xsFunction Perl_uvchr_to_utf8_flags Perl_uvuni_to_utf8_flags
-syn keyword xsFunction Perl_valid_utf8_to_uvchr Perl_valid_utf8_to_uvuni
+syn keyword xsFunction Perl_taint_env Perl_taint_proper Perl_to_uni_lower
+syn keyword xsFunction Perl_to_uni_title Perl_to_uni_upper Perl_to_utf8_case
+syn keyword xsFunction Perl_unlnk Perl_unpack_str Perl_unpackstring
+syn keyword xsFunction Perl_unsharepvn Perl_upg_version Perl_utf16_to_utf8
+syn keyword xsFunction Perl_utf16_to_utf8_reversed Perl_utf8_distance
+syn keyword xsFunction Perl_utf8_hop Perl_utf8_length Perl_utf8_to_bytes
+syn keyword xsFunction Perl_utf8n_to_uvchr Perl_utf8n_to_uvuni
+syn keyword xsFunction Perl_uvoffuni_to_utf8_flags Perl_uvuni_to_utf8
+syn keyword xsFunction Perl_uvuni_to_utf8_flags Perl_valid_utf8_to_uvchr
syn keyword xsFunction Perl_vcmp Perl_vcroak Perl_vdeb Perl_vform
syn keyword xsFunction Perl_vload_module Perl_vmess Perl_vnewSVpvf
syn keyword xsFunction Perl_vnormal Perl_vnumify Perl_vstringify Perl_vverify
syn keyword xsFunction Perl_vwarn Perl_vwarner Perl_warn Perl_warn_nocontext
syn keyword xsFunction Perl_warn_sv Perl_warner Perl_warner_nocontext
syn keyword xsFunction Perl_whichsig_pv Perl_whichsig_pvn Perl_whichsig_sv
-syn keyword xsFunction Perl_wrap_op_checker Slab_Alloc Slab_Free
-syn keyword xsFunction _is_utf8_quotemeta _to_uni_fold_flags
-syn keyword xsFunction _to_utf8_fold_flags _to_utf8_lower_flags
-syn keyword xsFunction _to_utf8_title_flags _to_utf8_upper_flags amagic_call
-syn keyword xsFunction amagic_deref_call any_dup apply_attrs_string
-syn keyword xsFunction atfork_lock atfork_unlock av_clear av_delete av_exists
-syn keyword xsFunction av_extend av_fetch av_fill av_len av_make av_pop
-syn keyword xsFunction av_push av_shift av_store av_undef av_unshift
-syn keyword xsFunction block_gimme bytes_cmp_utf8 bytes_from_utf8
-syn keyword xsFunction bytes_to_utf8 call_argv call_atexit call_list
-syn keyword xsFunction call_method call_pv call_sv caller_cx cast_i32 cast_iv
-syn keyword xsFunction cast_ulong cast_uv ck_entersub_args_list
-syn keyword xsFunction ck_entersub_args_proto ck_entersub_args_proto_or_list
-syn keyword xsFunction ck_warner ck_warner_d croak croak_no_modify
+syn keyword xsFunction Perl_wrap_op_checker _get_regclass_nonbitmap_data
+syn keyword xsFunction _is_cur_LC_category_utf8 _is_in_locale_category
+syn keyword xsFunction _is_uni_FOO _is_uni_perl_idcont _is_uni_perl_idstart
+syn keyword xsFunction _is_utf8_FOO _is_utf8_char_slow _is_utf8_idcont
+syn keyword xsFunction _is_utf8_idstart _is_utf8_mark _is_utf8_perl_idcont
+syn keyword xsFunction _is_utf8_perl_idstart _is_utf8_xidcont
+syn keyword xsFunction _is_utf8_xidstart _new_invlist_C_array
+syn keyword xsFunction _to_uni_fold_flags _to_utf8_fold_flags
+syn keyword xsFunction _to_utf8_lower_flags _to_utf8_title_flags
+syn keyword xsFunction _to_utf8_upper_flags alloccopstash amagic_call
+syn keyword xsFunction amagic_deref_call any_dup append_utf8_from_native_byte
+syn keyword xsFunction apply_attrs_string atfork_lock atfork_unlock av_clear
+syn keyword xsFunction av_delete av_exists av_extend av_fetch av_fill av_len
+syn keyword xsFunction av_make av_pop av_push av_shift av_store av_top_index
+syn keyword xsFunction av_undef av_unshift block_end block_gimme block_start
+syn keyword xsFunction bytes_cmp_utf8 bytes_from_utf8 bytes_to_utf8 call_argv
+syn keyword xsFunction call_atexit call_list call_method call_pv call_sv
+syn keyword xsFunction caller_cx cast_i32 cast_iv cast_ulong cast_uv
+syn keyword xsFunction ck_entersub_args_list ck_entersub_args_proto
+syn keyword xsFunction ck_entersub_args_proto_or_list ck_warner ck_warner_d
+syn keyword xsFunction croak croak_memory_wrap croak_no_modify
syn keyword xsFunction croak_nocontext croak_sv croak_xs_usage csighandler
syn keyword xsFunction custom_op_desc custom_op_name cv_clone cv_const_sv
-syn keyword xsFunction cv_get_call_checker cv_set_call_checker cv_undef
-syn keyword xsFunction cx_dump cx_dup cxinc deb deb_nocontext debop
-syn keyword xsFunction debprofdump debstack debstackptrs delimcpy
-syn keyword xsFunction despatch_signals die die_nocontext die_sv dirp_dup
-syn keyword xsFunction do_aspawn do_binmode do_close do_gv_dump do_gvgv_dump
-syn keyword xsFunction do_hv_dump do_join do_magic_dump do_op_dump do_open9
-syn keyword xsFunction do_openn do_pmop_dump do_spawn do_spawn_nowait
-syn keyword xsFunction do_sprintf do_sv_dump doing_taint doref dounwind
-syn keyword xsFunction dowantarray dump_all dump_eval dump_fds dump_form
+syn keyword xsFunction cv_get_call_checker cv_name cv_set_call_checker
+syn keyword xsFunction cv_set_call_checker_flags cv_undef cx_dump cx_dup
+syn keyword xsFunction cxinc deb deb_nocontext debop debprofdump debstack
+syn keyword xsFunction debstackptrs delimcpy despatch_signals die
+syn keyword xsFunction die_nocontext die_sv dirp_dup do_aspawn do_binmode
+syn keyword xsFunction do_close do_gv_dump do_gvgv_dump do_hv_dump do_join
+syn keyword xsFunction do_magic_dump do_op_dump do_open9 do_openn
+syn keyword xsFunction do_pmop_dump do_spawn do_spawn_nowait do_sprintf
+syn keyword xsFunction do_sv_dump doing_taint doref dounwind dowantarray
+syn keyword xsFunction dump_all dump_c_backtrace dump_eval dump_form
syn keyword xsFunction dump_indent dump_mstats dump_packsubs dump_sub
syn keyword xsFunction dump_vindent eval_pv eval_sv fbm_compile fbm_instr
syn keyword xsFunction filter_add filter_del filter_read find_runcv
syn keyword xsFunction find_rundefsv foldEQ foldEQ_latin1 foldEQ_locale
syn keyword xsFunction foldEQ_utf8_flags form form_nocontext fp_dup
syn keyword xsFunction fprintf_nocontext free_global_struct free_tmps get_av
-syn keyword xsFunction get_context get_cv get_cvn_flags get_hv get_mstats
-syn keyword xsFunction get_op_descs get_op_names get_ppaddr get_sv get_vtbl
-syn keyword xsFunction getcwd_sv gp_dup gp_free gp_ref grok_bin grok_hex
-syn keyword xsFunction grok_number grok_numeric_radix grok_oct gv_add_by_type
-syn keyword xsFunction gv_autoload_pv gv_autoload_pvn gv_autoload_sv gv_check
-syn keyword xsFunction gv_const_sv gv_dump gv_efullname gv_efullname4
-syn keyword xsFunction gv_fetchfile gv_fetchfile_flags gv_fetchmeth_pv
+syn keyword xsFunction get_c_backtrace_dump get_context get_cv get_cvn_flags
+syn keyword xsFunction get_hv get_mstats get_op_descs get_op_names get_ppaddr
+syn keyword xsFunction get_sv get_vtbl getcwd_sv gp_dup gp_free gp_ref
+syn keyword xsFunction grok_bin grok_hex grok_infnan grok_number
+syn keyword xsFunction grok_number_flags grok_numeric_radix grok_oct
+syn keyword xsFunction gv_add_by_type gv_autoload_pv gv_autoload_pvn
+syn keyword xsFunction gv_autoload_sv gv_check gv_const_sv gv_dump
+syn keyword xsFunction gv_efullname gv_efullname4 gv_fetchfile
+syn keyword xsFunction gv_fetchfile_flags gv_fetchmeth_pv
syn keyword xsFunction gv_fetchmeth_pv_autoload gv_fetchmeth_pvn
syn keyword xsFunction gv_fetchmeth_pvn_autoload gv_fetchmeth_sv
syn keyword xsFunction gv_fetchmeth_sv_autoload gv_fetchmethod_autoload
@@ -831,118 +938,106 @@ syn keyword xsFunction hv_clear hv_clear_placeholders hv_common
syn keyword xsFunction hv_common_key_len hv_copy_hints_hv hv_delayfree_ent
syn keyword xsFunction hv_free_ent hv_iterinit hv_iterkey hv_iterkeysv
syn keyword xsFunction hv_iternext_flags hv_iternextsv hv_iterval hv_ksplit
-syn keyword xsFunction hv_name_set hv_scalar init_global_struct init_i18nl10n
-syn keyword xsFunction init_i18nl14n init_stacks init_tm instr
-syn keyword xsFunction is_ascii_string is_lvalue_sub is_uni_alnum
-syn keyword xsFunction is_uni_alnum_lc is_uni_alpha is_uni_alpha_lc
-syn keyword xsFunction is_uni_ascii is_uni_ascii_lc is_uni_cntrl
-syn keyword xsFunction is_uni_cntrl_lc is_uni_digit is_uni_digit_lc
-syn keyword xsFunction is_uni_graph is_uni_graph_lc is_uni_idfirst
-syn keyword xsFunction is_uni_idfirst_lc is_uni_lower is_uni_lower_lc
-syn keyword xsFunction is_uni_print is_uni_print_lc is_uni_punct
-syn keyword xsFunction is_uni_punct_lc is_uni_space is_uni_space_lc
-syn keyword xsFunction is_uni_upper is_uni_upper_lc is_uni_xdigit
-syn keyword xsFunction is_uni_xdigit_lc is_utf8_alnum is_utf8_alpha
-syn keyword xsFunction is_utf8_ascii is_utf8_char_buf is_utf8_cntrl
-syn keyword xsFunction is_utf8_digit is_utf8_graph is_utf8_idcont
-syn keyword xsFunction is_utf8_idfirst is_utf8_lower is_utf8_mark
-syn keyword xsFunction is_utf8_perl_space is_utf8_perl_word
-syn keyword xsFunction is_utf8_posix_digit is_utf8_print is_utf8_punct
-syn keyword xsFunction is_utf8_space is_utf8_string is_utf8_string_loclen
-syn keyword xsFunction is_utf8_upper is_utf8_xdigit is_utf8_xidcont
-syn keyword xsFunction is_utf8_xidfirst leave_scope lex_bufutf8
-syn keyword xsFunction lex_discard_to lex_grow_linestr lex_next_chunk
-syn keyword xsFunction lex_peek_unichar lex_read_space lex_read_to
-syn keyword xsFunction lex_read_unichar lex_start lex_stuff_pv lex_stuff_pvn
-syn keyword xsFunction lex_stuff_sv lex_unstuff load_module
-syn keyword xsFunction load_module_nocontext looks_like_number magic_dump
-syn keyword xsFunction markstack_grow mess mess_nocontext mess_sv mg_clear
-syn keyword xsFunction mg_copy mg_dup mg_find mg_findext mg_free mg_free_type
-syn keyword xsFunction mg_get mg_length mg_magical mg_set mg_size mini_mktime
-syn keyword xsFunction moreswitches mro_get_linear_isa mro_method_changed_in
-syn keyword xsFunction my_atof my_atof2 my_bcopy my_bzero my_chsize my_dirfd
-syn keyword xsFunction my_exit my_failure_exit my_fflush_all my_fork my_htonl
-syn keyword xsFunction my_memcmp my_memset my_ntohl my_pclose my_popen
-syn keyword xsFunction my_popen_list my_setenv my_socketpair my_strftime
-syn keyword xsFunction my_swap newANONATTRSUB newANONHASH newANONLIST
-syn keyword xsFunction newANONSUB newASSIGNOP newATTRSUB newAVREF newBINOP
-syn keyword xsFunction newCONDOP newCONSTSUB newCONSTSUB_flags newCVREF
-syn keyword xsFunction newFORM newFOROP newGIVENOP newGVOP newGVREF
-syn keyword xsFunction newGVgen_flags newHVREF newHVhv newLISTOP newLOGOP
-syn keyword xsFunction newLOOPEX newLOOPOP newMYSUB newNULLLIST newOP
-syn keyword xsFunction newPADOP newPMOP newPROG newPVOP newRANGE newRV
-syn keyword xsFunction newRV_noinc newSLICEOP newSTATEOP newSV newSVOP
-syn keyword xsFunction newSVREF newSV_type newSVhek newSViv newSVnv newSVpv
+syn keyword xsFunction hv_name_set hv_rand_set hv_scalar init_global_struct
+syn keyword xsFunction init_i18nl10n init_i18nl14n init_stacks init_tm instr
+syn keyword xsFunction intro_my is_invariant_string is_lvalue_sub
+syn keyword xsFunction is_safe_syscall is_utf8_string is_utf8_string_loclen
+syn keyword xsFunction isinfnan leave_scope lex_bufutf8 lex_discard_to
+syn keyword xsFunction lex_grow_linestr lex_next_chunk lex_peek_unichar
+syn keyword xsFunction lex_read_space lex_read_to lex_read_unichar lex_start
+syn keyword xsFunction lex_stuff_pv lex_stuff_pvn lex_stuff_sv lex_unstuff
+syn keyword xsFunction load_module load_module_nocontext looks_like_number
+syn keyword xsFunction magic_dump markstack_grow mess mess_nocontext mess_sv
+syn keyword xsFunction mg_clear mg_copy mg_dup mg_find mg_findext mg_free
+syn keyword xsFunction mg_free_type mg_get mg_magical mg_set mg_size
+syn keyword xsFunction mini_mktime moreswitches mro_get_linear_isa
+syn keyword xsFunction mro_method_changed_in my_atof my_atof2 my_bcopy
+syn keyword xsFunction my_bzero my_chsize my_dirfd my_exit my_failure_exit
+syn keyword xsFunction my_fflush_all my_fork my_memcmp my_memset my_pclose
+syn keyword xsFunction my_popen my_popen_list my_setenv my_setlocale
+syn keyword xsFunction my_socketpair my_strerror my_strftime newANONATTRSUB
+syn keyword xsFunction newANONHASH newANONLIST newANONSUB newASSIGNOP
+syn keyword xsFunction newAVREF newBINOP newCONDOP newCONSTSUB
+syn keyword xsFunction newCONSTSUB_flags newCVREF newDEFSVOP newFORM newFOROP
+syn keyword xsFunction newGIVENOP newGVOP newGVREF newGVgen_flags newHVREF
+syn keyword xsFunction newHVhv newLISTOP newLOGOP newLOOPEX newLOOPOP
+syn keyword xsFunction newMETHOP newMETHOP_named newMYSUB newNULLLIST newOP
+syn keyword xsFunction newPADNAMELIST newPADNAMEouter newPADNAMEpvn newPADOP
+syn keyword xsFunction newPMOP newPROG newPVOP newRANGE newRV newRV_noinc
+syn keyword xsFunction newSLICEOP newSTATEOP newSV newSVOP newSVREF
+syn keyword xsFunction newSV_type newSVhek newSViv newSVnv newSVpv
syn keyword xsFunction newSVpv_share newSVpvf newSVpvf_nocontext newSVpvn
syn keyword xsFunction newSVpvn_flags newSVpvn_share newSVrv newSVsv newSVuv
-syn keyword xsFunction newUNOP newWHENOP newWHILEOP newXS newXS_flags
-syn keyword xsFunction new_collate new_ctype new_numeric new_stackinfo
-syn keyword xsFunction new_version ninstr nothreadhook op_append_elem
-syn keyword xsFunction op_append_list op_contextualize op_dump op_free
-syn keyword xsFunction op_linklist op_null op_prepend_elem op_refcnt_lock
-syn keyword xsFunction op_refcnt_unlock op_scope pack_cat packlist
-syn keyword xsFunction pad_add_anon pad_add_name_pv pad_add_name_pvn
+syn keyword xsFunction newUNOP newUNOP_AUX newWHENOP newWHILEOP newXS
+syn keyword xsFunction newXS_flags new_collate new_ctype new_numeric
+syn keyword xsFunction new_stackinfo new_version ninstr nothreadhook
+syn keyword xsFunction op_append_elem op_append_list op_contextualize
+syn keyword xsFunction op_convert_list op_dump op_free op_linklist op_null
+syn keyword xsFunction op_parent op_prepend_elem op_refcnt_lock
+syn keyword xsFunction op_refcnt_unlock op_scope op_sibling_splice pack_cat
+syn keyword xsFunction packlist pad_add_anon pad_add_name_pv pad_add_name_pvn
syn keyword xsFunction pad_add_name_sv pad_alloc pad_compname_type
syn keyword xsFunction pad_findmy_pv pad_findmy_pvn pad_findmy_sv pad_new
-syn keyword xsFunction pad_setsv pad_sv pad_tidy parse_arithexpr
-syn keyword xsFunction parse_barestmt parse_block parse_fullexpr
-syn keyword xsFunction parse_fullstmt parse_label parse_listexpr
-syn keyword xsFunction parse_stmtseq parse_termexpr parser_dup pmop_dump
-syn keyword xsFunction pop_scope pregcomp pregexec pregfree pregfree2
-syn keyword xsFunction prescan_version printf_nocontext ptr_table_fetch
-syn keyword xsFunction ptr_table_free ptr_table_new ptr_table_split
-syn keyword xsFunction ptr_table_store push_scope pv_display pv_escape
-syn keyword xsFunction pv_pretty pv_uni_display re_compile re_dup_guts
-syn keyword xsFunction re_intuit_start re_intuit_string reentrant_free
-syn keyword xsFunction reentrant_init reentrant_retry reentrant_size
-syn keyword xsFunction reg_named_buff_all reg_named_buff_exists
-syn keyword xsFunction reg_named_buff_fetch reg_named_buff_firstkey
-syn keyword xsFunction reg_named_buff_nextkey reg_named_buff_scalar
-syn keyword xsFunction regclass_swash regdump regdupe_internal regexec_flags
-syn keyword xsFunction regfree_internal reginitcolors regnext repeatcpy
-syn keyword xsFunction require_pv rninstr rsignal rsignal_state runops_debug
-syn keyword xsFunction runops_standard rv2cv_op_cv rvpv_dup safesyscalloc
-syn keyword xsFunction safesysfree safesysmalloc safesysrealloc save_I16
-syn keyword xsFunction save_I32 save_I8 save_adelete save_aelem_flags
-syn keyword xsFunction save_alloc save_aptr save_ary save_bool save_clearsv
-syn keyword xsFunction save_delete save_destructor save_destructor_x
-syn keyword xsFunction save_generic_pvref save_generic_svref save_gp
-syn keyword xsFunction save_hash save_hdelete save_helem_flags save_hints
-syn keyword xsFunction save_hptr save_int save_item save_iv save_list
-syn keyword xsFunction save_long save_nogv save_padsv_and_mortalize save_pptr
-syn keyword xsFunction save_pushi32ptr save_pushptr save_pushptrptr
-syn keyword xsFunction save_re_context save_scalar save_set_svflags
-syn keyword xsFunction save_shared_pvref save_sptr save_svref save_vptr
-syn keyword xsFunction savepv savepvn savesharedpv savesharedpvn
-syn keyword xsFunction savesharedsvpv savestack_grow savestack_grow_cnt
-syn keyword xsFunction savesvpv scan_bin scan_hex scan_num scan_oct
-syn keyword xsFunction scan_version scan_vstring screaminstr seed set_context
-syn keyword xsFunction set_numeric_local set_numeric_radix
+syn keyword xsFunction pad_setsv pad_sv pad_tidy padnamelist_fetch
+syn keyword xsFunction padnamelist_store parse_arithexpr parse_barestmt
+syn keyword xsFunction parse_block parse_fullexpr parse_fullstmt parse_label
+syn keyword xsFunction parse_listexpr parse_stmtseq parse_termexpr parser_dup
+syn keyword xsFunction pmop_dump pop_scope pregcomp pregexec pregfree
+syn keyword xsFunction pregfree2 prescan_version printf_nocontext
+syn keyword xsFunction ptr_table_fetch ptr_table_free ptr_table_new
+syn keyword xsFunction ptr_table_split ptr_table_store push_scope pv_display
+syn keyword xsFunction pv_escape pv_pretty pv_uni_display
+syn keyword xsFunction quadmath_format_needed quadmath_format_single
+syn keyword xsFunction re_compile re_dup_guts re_intuit_start
+syn keyword xsFunction re_intuit_string reentrant_free reentrant_init
+syn keyword xsFunction reentrant_retry reentrant_size reg_named_buff_all
+syn keyword xsFunction reg_named_buff_exists reg_named_buff_fetch
+syn keyword xsFunction reg_named_buff_firstkey reg_named_buff_nextkey
+syn keyword xsFunction reg_named_buff_scalar regclass_swash regdump
+syn keyword xsFunction regdupe_internal regexec_flags regfree_internal
+syn keyword xsFunction reginitcolors regnext repeatcpy require_pv rninstr
+syn keyword xsFunction rsignal rsignal_state runops_debug runops_standard
+syn keyword xsFunction rv2cv_op_cv rvpv_dup safesyscalloc safesysfree
+syn keyword xsFunction safesysmalloc safesysrealloc save_I16 save_I32 save_I8
+syn keyword xsFunction save_adelete save_aelem_flags save_alloc save_aptr
+syn keyword xsFunction save_ary save_bool save_clearsv save_delete
+syn keyword xsFunction save_destructor save_destructor_x save_generic_pvref
+syn keyword xsFunction save_generic_svref save_gp save_hash save_hdelete
+syn keyword xsFunction save_helem_flags save_hints save_hptr save_int
+syn keyword xsFunction save_item save_iv save_list save_long save_nogv
+syn keyword xsFunction save_padsv_and_mortalize save_pptr save_pushi32ptr
+syn keyword xsFunction save_pushptr save_pushptrptr save_re_context
+syn keyword xsFunction save_scalar save_set_svflags save_shared_pvref
+syn keyword xsFunction save_sptr save_svref save_vptr savepv savepvn
+syn keyword xsFunction savesharedpv savesharedpvn savesharedsvpv
+syn keyword xsFunction savestack_grow savestack_grow_cnt savesvpv scan_bin
+syn keyword xsFunction scan_hex scan_num scan_oct scan_version scan_vstring
+syn keyword xsFunction seed set_context set_numeric_local set_numeric_radix
syn keyword xsFunction set_numeric_standard setdefout share_hek si_dup sortsv
syn keyword xsFunction sortsv_flags ss_dup stack_grow start_subparse
-syn keyword xsFunction stashpv_hvname_match str_to_version sv_2bool_flags
-syn keyword xsFunction sv_2cv sv_2io sv_2iv_flags sv_2mortal sv_2nv_flags
-syn keyword xsFunction sv_2pv_flags sv_2pvbyte sv_2pvutf8 sv_2uv_flags
-syn keyword xsFunction sv_backoff sv_bless sv_cat_decode sv_catpv
-syn keyword xsFunction sv_catpv_flags sv_catpv_mg sv_catpvf sv_catpvf_mg
-syn keyword xsFunction sv_catpvf_mg_nocontext sv_catpvf_nocontext
-syn keyword xsFunction sv_catpvn_flags sv_catsv_flags sv_chop sv_clear
-syn keyword xsFunction sv_cmp_flags sv_cmp_locale_flags sv_collxfrm_flags
-syn keyword xsFunction sv_copypv sv_dec sv_dec_nomg sv_derived_from
-syn keyword xsFunction sv_derived_from_pv sv_derived_from_pvn
+syn keyword xsFunction str_to_version sv_2bool_flags sv_2cv sv_2io
+syn keyword xsFunction sv_2iv_flags sv_2mortal sv_2nv_flags sv_2pv_flags
+syn keyword xsFunction sv_2pvbyte sv_2pvutf8 sv_2uv_flags sv_backoff sv_bless
+syn keyword xsFunction sv_cat_decode sv_catpv sv_catpv_flags sv_catpv_mg
+syn keyword xsFunction sv_catpvf sv_catpvf_mg sv_catpvf_mg_nocontext
+syn keyword xsFunction sv_catpvf_nocontext sv_catpvn_flags sv_catsv_flags
+syn keyword xsFunction sv_chop sv_clear sv_cmp_flags sv_cmp_locale_flags
+syn keyword xsFunction sv_collxfrm_flags sv_copypv_flags sv_dec sv_dec_nomg
+syn keyword xsFunction sv_derived_from sv_derived_from_pv sv_derived_from_pvn
syn keyword xsFunction sv_derived_from_sv sv_destroyable sv_does sv_does_pv
syn keyword xsFunction sv_does_pvn sv_does_sv sv_dump sv_dup sv_dup_inc
-syn keyword xsFunction sv_eq_flags sv_force_normal_flags sv_free sv_gets
-syn keyword xsFunction sv_grow sv_inc sv_inc_nomg sv_insert_flags sv_isa
-syn keyword xsFunction sv_isobject sv_iv sv_len sv_len_utf8 sv_magic
-syn keyword xsFunction sv_magicext sv_mortalcopy sv_newmortal sv_newref
-syn keyword xsFunction sv_nosharing sv_nounlocking sv_nv sv_peek sv_pos_b2u
-syn keyword xsFunction sv_pos_u2b sv_pos_u2b_flags sv_pvbyten
-syn keyword xsFunction sv_pvbyten_force sv_pvn sv_pvn_force_flags sv_pvn_nomg
-syn keyword xsFunction sv_pvutf8n sv_pvutf8n_force sv_recode_to_utf8
-syn keyword xsFunction sv_reftype sv_replace sv_report_used sv_reset
-syn keyword xsFunction sv_rvweaken sv_setiv sv_setiv_mg sv_setnv sv_setnv_mg
-syn keyword xsFunction sv_setpv sv_setpv_mg sv_setpvf sv_setpvf_mg
+syn keyword xsFunction sv_eq_flags sv_force_normal_flags sv_free
+syn keyword xsFunction sv_get_backrefs sv_gets sv_grow sv_inc sv_inc_nomg
+syn keyword xsFunction sv_insert_flags sv_isa sv_isobject sv_iv sv_len
+syn keyword xsFunction sv_len_utf8 sv_magic sv_magicext sv_newmortal
+syn keyword xsFunction sv_newref sv_nosharing sv_nounlocking sv_nv sv_peek
+syn keyword xsFunction sv_pos_b2u sv_pos_b2u_flags sv_pos_u2b
+syn keyword xsFunction sv_pos_u2b_flags sv_pvbyten sv_pvbyten_force sv_pvn
+syn keyword xsFunction sv_pvn_force_flags sv_pvn_nomg sv_pvutf8n
+syn keyword xsFunction sv_pvutf8n_force sv_recode_to_utf8 sv_reftype
+syn keyword xsFunction sv_replace sv_report_used sv_reset sv_rvweaken
+syn keyword xsFunction sv_setiv sv_setiv_mg sv_setnv sv_setnv_mg sv_setpv
+syn keyword xsFunction sv_setpv_mg sv_setpvf sv_setpvf_mg
syn keyword xsFunction sv_setpvf_mg_nocontext sv_setpvf_nocontext sv_setpviv
syn keyword xsFunction sv_setpviv_mg sv_setpvn sv_setpvn_mg sv_setref_iv
syn keyword xsFunction sv_setref_nv sv_setref_pv sv_setref_pvn sv_setref_uv
@@ -951,18 +1046,16 @@ syn keyword xsFunction sv_tainted sv_true sv_uni_display sv_unmagic
syn keyword xsFunction sv_unmagicext sv_unref_flags sv_untaint sv_upgrade
syn keyword xsFunction sv_usepvn_flags sv_utf8_decode sv_utf8_downgrade
syn keyword xsFunction sv_utf8_encode sv_utf8_upgrade_flags_grow sv_uv
-syn keyword xsFunction sv_vcatpvf sv_vcatpvf_mg sv_vcatpvfn sv_vsetpvf
-syn keyword xsFunction sv_vsetpvf_mg sv_vsetpvfn swash_fetch swash_init
-syn keyword xsFunction sys_intern_clear sys_intern_dup sys_intern_init
-syn keyword xsFunction taint_env taint_proper tmps_grow to_uni_lower
-syn keyword xsFunction to_uni_lower_lc to_uni_title to_uni_title_lc
-syn keyword xsFunction to_uni_upper to_uni_upper_lc to_utf8_case unlnk
+syn keyword xsFunction sv_vcatpvf sv_vcatpvf_mg sv_vcatpvfn sv_vcatpvfn_flags
+syn keyword xsFunction sv_vsetpvf sv_vsetpvf_mg sv_vsetpvfn swash_fetch
+syn keyword xsFunction swash_init sync_locale sys_intern_clear sys_intern_dup
+syn keyword xsFunction sys_intern_init taint_env taint_proper to_uni_lower
+syn keyword xsFunction to_uni_title to_uni_upper to_utf8_case unlnk
syn keyword xsFunction unpack_str unpackstring unsharepvn upg_version
syn keyword xsFunction utf16_to_utf8 utf16_to_utf8_reversed utf8_distance
-syn keyword xsFunction utf8_hop utf8_length utf8_to_bytes utf8_to_uvchr_buf
-syn keyword xsFunction utf8_to_uvuni_buf utf8n_to_uvchr utf8n_to_uvuni
-syn keyword xsFunction uvchr_to_utf8 uvchr_to_utf8_flags uvuni_to_utf8_flags
-syn keyword xsFunction valid_utf8_to_uvchr valid_utf8_to_uvuni vcmp vcroak
+syn keyword xsFunction utf8_hop utf8_length utf8_to_bytes utf8n_to_uvchr
+syn keyword xsFunction utf8n_to_uvuni uvoffuni_to_utf8_flags uvuni_to_utf8
+syn keyword xsFunction uvuni_to_utf8_flags valid_utf8_to_uvchr vcmp vcroak
syn keyword xsFunction vdeb vform vload_module vmess vnewSVpvf vnormal
syn keyword xsFunction vnumify vstringify vverify vwarn vwarner warn
syn keyword xsFunction warn_nocontext warn_sv warner warner_nocontext
@@ -971,149 +1064,165 @@ syn keyword xsVariable MARK MY_CXT ORIGMARK PL_I PL_No PL_Vars PL_VarsPtr
syn keyword xsVariable PL_Yes PL_a2e PL_bincompat_options PL_bitcount
syn keyword xsVariable PL_block_type PL_bufend PL_bufptr PL_charclass
syn keyword xsVariable PL_check PL_copline PL_core_reg_engine PL_cshname
-syn keyword xsVariable PL_curforce PL_e2a PL_e2utf PL_endwhite PL_error_count
-syn keyword xsVariable PL_expect PL_faketokens PL_fold PL_fold_latin1
-syn keyword xsVariable PL_fold_locale PL_force_link_funcs PL_freq
-syn keyword xsVariable PL_global_struct_size PL_hexdigit PL_in_my
-syn keyword xsVariable PL_in_my_stash PL_interp_size PL_interp_size_5_16_0
-syn keyword xsVariable PL_last_lop PL_last_lop_op PL_last_uni PL_lasttoke
-syn keyword xsVariable PL_latin1_lc PL_lex_allbrackets PL_lex_brackets
-syn keyword xsVariable PL_lex_brackstack PL_lex_casemods PL_lex_casestack
-syn keyword xsVariable PL_lex_defer PL_lex_dojoin PL_lex_expect
-syn keyword xsVariable PL_lex_fakeeof PL_lex_formbrack PL_lex_inpat
-syn keyword xsVariable PL_lex_inwhat PL_lex_op PL_lex_repl PL_lex_starts
-syn keyword xsVariable PL_lex_state PL_lex_stuff PL_linestart PL_linestr
-syn keyword xsVariable PL_magic_data PL_magic_vtable_names PL_memory_wrap
-syn keyword xsVariable PL_mod_latin1_uc PL_multi_close PL_multi_end
-syn keyword xsVariable PL_multi_open PL_multi_start PL_nexttoke PL_nexttype
-syn keyword xsVariable PL_nextval PL_nextwhite PL_no_aelem PL_no_dir_func
+syn keyword xsVariable PL_e2a PL_e2utf PL_error_count PL_expect PL_fold
+syn keyword xsVariable PL_fold_latin1 PL_fold_locale PL_force_link_funcs
+syn keyword xsVariable PL_freq PL_global_struct_size PL_hexdigit PL_in_my
+syn keyword xsVariable PL_in_my_stash PL_interp_size PL_interp_size_5_18_0
+syn keyword xsVariable PL_last_lop PL_last_lop_op PL_last_uni PL_latin1_lc
+syn keyword xsVariable PL_lex_allbrackets PL_lex_brackets PL_lex_brackstack
+syn keyword xsVariable PL_lex_casemods PL_lex_casestack PL_lex_defer
+syn keyword xsVariable PL_lex_dojoin PL_lex_fakeeof PL_lex_formbrack
+syn keyword xsVariable PL_lex_inpat PL_lex_inwhat PL_lex_op PL_lex_repl
+syn keyword xsVariable PL_lex_starts PL_lex_state PL_lex_stuff PL_linestart
+syn keyword xsVariable PL_linestr PL_magic_data PL_magic_vtable_names
+syn keyword xsVariable PL_memory_wrap PL_mod_latin1_uc PL_multi_close
+syn keyword xsVariable PL_multi_end PL_multi_open PL_multi_start PL_nexttoke
+syn keyword xsVariable PL_nexttype PL_nextval PL_no_aelem PL_no_dir_func
syn keyword xsVariable PL_no_func PL_no_helem_sv PL_no_localize_ref PL_no_mem
syn keyword xsVariable PL_no_modify PL_no_myglob PL_no_security
syn keyword xsVariable PL_no_sock_func PL_no_symref PL_no_symref_sv
syn keyword xsVariable PL_no_usym PL_no_wrongref PL_oldbufptr PL_oldoldbufptr
-syn keyword xsVariable PL_op_desc PL_op_name PL_opargs PL_pending_ident
+syn keyword xsVariable PL_op_desc PL_op_name PL_op_private_bitdef_ix
+syn keyword xsVariable PL_op_private_bitdefs PL_op_private_bitfields
+syn keyword xsVariable PL_op_private_labels PL_op_private_valid PL_opargs
syn keyword xsVariable PL_phase_names PL_ppaddr PL_preambled
-syn keyword xsVariable PL_realtokenstart PL_reg_extflags_name PL_reg_name
+syn keyword xsVariable PL_reg_extflags_name PL_reg_intflags_name PL_reg_name
syn keyword xsVariable PL_regkind PL_revision PL_rsfp PL_rsfp_filters
syn keyword xsVariable PL_runops_dbg PL_runops_std PL_sh_path PL_sig_name
-syn keyword xsVariable PL_sig_num PL_simple PL_simple_bitmask PL_skipwhite
-syn keyword xsVariable PL_sublex_info PL_subversion PL_thisclose PL_thismad
-syn keyword xsVariable PL_thisopen PL_thisstuff PL_thistoken PL_thiswhite
-syn keyword xsVariable PL_tokenbuf PL_utf2e PL_utf8skip PL_uudmap PL_uuemap
-syn keyword xsVariable PL_valid_types_IVX PL_valid_types_IV_set
-syn keyword xsVariable PL_valid_types_NVX PL_valid_types_NV_set
-syn keyword xsVariable PL_valid_types_PVX PL_valid_types_RV PL_varies
-syn keyword xsVariable PL_varies_bitmask PL_version PL_warn_nl PL_warn_nosemi
-syn keyword xsVariable PL_warn_reserved PL_warn_uninit PL_warn_uninit_sv
-syn keyword xsVariable RETVAL SP TARG _aMY_CXT _aTHX aMY_CXT aMY_CXT_ aTHX
-syn keyword xsVariable aTHX_ items
+syn keyword xsVariable PL_sig_num PL_simple PL_simple_bitmask PL_sublex_info
+syn keyword xsVariable PL_subversion PL_tokenbuf PL_utf2e PL_utf8skip
+syn keyword xsVariable PL_uudmap PL_uuemap PL_valid_types_IVX
+syn keyword xsVariable PL_valid_types_IV_set PL_valid_types_NVX
+syn keyword xsVariable PL_valid_types_NV_set PL_valid_types_PVX
+syn keyword xsVariable PL_valid_types_RV PL_varies PL_varies_bitmask
+syn keyword xsVariable PL_version PL_warn_nl PL_warn_nosemi PL_warn_reserved
+syn keyword xsVariable PL_warn_uninit PL_warn_uninit_sv RETVAL SP TARG
+syn keyword xsVariable _aMY_CXT _aTHX aMY_CXT aMY_CXT_ aTHX aTHX_ items
syn keyword xsMacro ABORT ACCEPT ADDOP AHOCORASICK AHOCORASICKC
-syn keyword xsMacro ALLOC_THREAD_KEY ALNUM ALNUMA ALNUML ALNUMU AMG_CALLun
-syn keyword xsMacro AMG_CALLunary AMGf_assign AMGf_noleft AMGf_noright
-syn keyword xsMacro AMGf_numeric AMGf_set AMGf_unary AMGfallNEVER AMGfallNO
+syn keyword xsMacro ALLOC_THREAD_KEY AMG_CALLun AMG_CALLunary AMGf_assign
+syn keyword xsMacro AMGf_noleft AMGf_noright AMGf_numarg AMGf_numeric
+syn keyword xsMacro AMGf_set AMGf_unary AMGf_want_list AMGfallNEVER AMGfallNO
syn keyword xsMacro AMGfallYES AMT_AMAGIC AMT_AMAGIC_off AMT_AMAGIC_on
-syn keyword xsMacro AMT_OVERLOADED AMT_OVERLOADED_off AMT_OVERLOADED_on
-syn keyword xsMacro AMTf_AMAGIC AMTf_OVERLOADED ANDAND ANDOP ANONSUB ANYOF
-syn keyword xsMacro ANYOFV ANYOF_ALNUM ANYOF_ALNUMC ANYOF_ALNUML ANYOF_ALPHA
-syn keyword xsMacro ANYOF_ASCII ANYOF_BIT ANYOF_BITMAP ANYOF_BITMAP_BYTE
-syn keyword xsMacro ANYOF_BITMAP_CLEAR ANYOF_BITMAP_CLEARALL ANYOF_BITMAP_SET
+syn keyword xsMacro AMTf_AMAGIC ANDAND ANDOP ANGSTROM_SIGN ANONSUB ANYOF
+syn keyword xsMacro ANYOFL ANYOF_ALNUM ANYOF_ALNUML ANYOF_ALPHA
+syn keyword xsMacro ANYOF_ALPHANUMERIC ANYOF_ASCII ANYOF_BIT ANYOF_BITMAP
+syn keyword xsMacro ANYOF_BITMAP_BYTE ANYOF_BITMAP_CLEAR
+syn keyword xsMacro ANYOF_BITMAP_CLEARALL ANYOF_BITMAP_SET
syn keyword xsMacro ANYOF_BITMAP_SETALL ANYOF_BITMAP_SIZE ANYOF_BITMAP_TEST
-syn keyword xsMacro ANYOF_BITMAP_TESTALLSET ANYOF_BITMAP_ZERO ANYOF_BLANK
-syn keyword xsMacro ANYOF_CLASS ANYOF_CLASSBITMAP_SIZE ANYOF_CLASS_BYTE
-syn keyword xsMacro ANYOF_CLASS_CLEAR ANYOF_CLASS_SET ANYOF_CLASS_SETALL
-syn keyword xsMacro ANYOF_CLASS_SIZE ANYOF_CLASS_SKIP ANYOF_CLASS_TEST
+syn keyword xsMacro ANYOF_BITMAP_ZERO ANYOF_BLANK ANYOF_CASED
+syn keyword xsMacro ANYOF_CLASS_CLEAR ANYOF_CLASS_OR ANYOF_CLASS_SET
+syn keyword xsMacro ANYOF_CLASS_SETALL ANYOF_CLASS_TEST
syn keyword xsMacro ANYOF_CLASS_TEST_ANY_SET ANYOF_CLASS_ZERO ANYOF_CNTRL
-syn keyword xsMacro ANYOF_DIGIT ANYOF_EOS ANYOF_FLAGS ANYOF_FLAGS_ALL
-syn keyword xsMacro ANYOF_FOLD_SHARP_S ANYOF_GRAPH ANYOF_HORIZWS ANYOF_INVERT
-syn keyword xsMacro ANYOF_IS_SYNTHETIC ANYOF_LARGE ANYOF_LOCALE
-syn keyword xsMacro ANYOF_LOC_NONBITMAP_FOLD ANYOF_LOWER ANYOF_MAX
-syn keyword xsMacro ANYOF_NALNUM ANYOF_NALNUMC ANYOF_NALNUML ANYOF_NALPHA
-syn keyword xsMacro ANYOF_NASCII ANYOF_NBLANK ANYOF_NCNTRL ANYOF_NDIGIT
-syn keyword xsMacro ANYOF_NGRAPH ANYOF_NHORIZWS ANYOF_NLOWER ANYOF_NONBITMAP
-syn keyword xsMacro ANYOF_NONBITMAP_EMPTY ANYOF_NONBITMAP_NON_UTF8
-syn keyword xsMacro ANYOF_NON_UTF8_LATIN1_ALL ANYOF_NPRINT ANYOF_NPSXSPC
-syn keyword xsMacro ANYOF_NPUNCT ANYOF_NSPACE ANYOF_NSPACEL ANYOF_NUPPER
-syn keyword xsMacro ANYOF_NVERTWS ANYOF_NXDIGIT ANYOF_PRINT ANYOF_PSXSPC
-syn keyword xsMacro ANYOF_PUNCT ANYOF_SIZE ANYOF_SKIP ANYOF_SPACE
-syn keyword xsMacro ANYOF_SPACEL ANYOF_UNICODE_ALL ANYOF_UPPER ANYOF_VERTWS
-syn keyword xsMacro ANYOF_XDIGIT ARCHLIB ARCHLIB_EXP ARCHNAME ARG ARG1
-syn keyword xsMacro ARG1_LOC ARG1_SET ARG2 ARG2L ARG2L_LOC ARG2L_SET ARG2_LOC
-syn keyword xsMacro ARG2_SET ARGTARG ARG_LOC ARG_SET ARG_VALUE ARG__SET ARROW
+syn keyword xsMacro ANYOF_COMMON_FLAGS ANYOF_DIGIT ANYOF_FLAGS
+syn keyword xsMacro ANYOF_FLAGS_ALL ANYOF_FOLD_SHARP_S ANYOF_GRAPH
+syn keyword xsMacro ANYOF_HAS_NONBITMAP_NON_UTF8_MATCHES
+syn keyword xsMacro ANYOF_HAS_UTF8_NONBITMAP_MATCHES ANYOF_HORIZWS
+syn keyword xsMacro ANYOF_INVERT ANYOF_LOCALE_FLAGS ANYOF_LOC_FOLD
+syn keyword xsMacro ANYOF_LOWER ANYOF_MATCHES_ALL_ABOVE_BITMAP
+syn keyword xsMacro ANYOF_MATCHES_ALL_NON_UTF8_NON_ASCII ANYOF_MATCHES_POSIXL
+syn keyword xsMacro ANYOF_MAX ANYOF_NALNUM ANYOF_NALNUML ANYOF_NALPHA
+syn keyword xsMacro ANYOF_NALPHANUMERIC ANYOF_NASCII ANYOF_NBLANK
+syn keyword xsMacro ANYOF_NCASED ANYOF_NCNTRL ANYOF_NDIGIT ANYOF_NGRAPH
+syn keyword xsMacro ANYOF_NHORIZWS ANYOF_NLOWER ANYOF_NPRINT ANYOF_NPUNCT
+syn keyword xsMacro ANYOF_NSPACE ANYOF_NSPACEL ANYOF_NUPPER ANYOF_NVERTWS
+syn keyword xsMacro ANYOF_NWORDCHAR ANYOF_NXDIGIT ANYOF_ONLY_HAS_BITMAP
+syn keyword xsMacro ANYOF_POSIXL_AND ANYOF_POSIXL_CLEAR ANYOF_POSIXL_MAX
+syn keyword xsMacro ANYOF_POSIXL_OR ANYOF_POSIXL_SET ANYOF_POSIXL_SETALL
+syn keyword xsMacro ANYOF_POSIXL_SKIP ANYOF_POSIXL_SSC_TEST_ALL_SET
+syn keyword xsMacro ANYOF_POSIXL_SSC_TEST_ANY_SET ANYOF_POSIXL_TEST
+syn keyword xsMacro ANYOF_POSIXL_TEST_ALL_SET ANYOF_POSIXL_TEST_ANY_SET
+syn keyword xsMacro ANYOF_POSIXL_ZERO ANYOF_PRINT ANYOF_PUNCT ANYOF_SKIP
+syn keyword xsMacro ANYOF_SPACE ANYOF_SPACEL ANYOF_UNIPROP ANYOF_UPPER
+syn keyword xsMacro ANYOF_VERTWS ANYOF_WARN_SUPER ANYOF_WORDCHAR ANYOF_XDIGIT
+syn keyword xsMacro ARCHLIB ARCHLIB_EXP ARCHNAME ARG ARG1 ARG1_LOC ARG1_SET
+syn keyword xsMacro ARG2 ARG2L ARG2L_LOC ARG2L_SET ARG2_LOC ARG2_SET ARGTARG
+syn keyword xsMacro ARG_LOC ARG_SET ARG_VALUE ARG__SET ARROW
syn keyword xsMacro ASCII_MORE_RESTRICT_PAT_MODS ASCII_RESTRICT_PAT_MOD
-syn keyword xsMacro ASCII_RESTRICT_PAT_MODS ASCII_TO_NATIVE ASCII_TO_NEED
-syn keyword xsMacro ASCTIME_R_PROTO ASSERT_CURPAD_ACTIVE ASSERT_CURPAD_LEGAL
-syn keyword xsMacro ASSIGNOP Atof Atol Atoul AvALLOC AvARRAY AvARYLEN AvFILL
-syn keyword xsMacro AvFILLp AvMAX AvREAL AvREALISH AvREAL_off AvREAL_on
-syn keyword xsMacro AvREAL_only AvREIFY AvREIFY_off AvREIFY_on AvREIFY_only
-syn keyword xsMacro BACK BADVERSION BASEOP BHKf_bhk_eval BHKf_bhk_post_end
-syn keyword xsMacro BHKf_bhk_pre_end BHKf_bhk_start BIN BIN_EXP BITANDOP
-syn keyword xsMacro BITMAP_BYTE BITMAP_TEST BITOROP BIT_BUCKET BIT_DIGITS BOL
-syn keyword xsMacro BOUND BOUNDA BOUNDL BOUNDU BRANCH BRANCHJ BRANCH_next
-syn keyword xsMacro BRANCH_next_fail BSD_GETPGRP BSD_SETPGRP BSDish BUFSIZ
-syn keyword xsMacro BYTEORDER BhkDISABLE BhkENABLE BhkENTRY BhkENTRY_set
-syn keyword xsMacro BhkFLAGS Bit BmFLAGS BmPREVIOUS BmRARE BmUSEFUL
-syn keyword xsMacro CALLREGCOMP CALLREGCOMP_ENG CALLREGDUPE CALLREGDUPE_PVT
-syn keyword xsMacro CALLREGEXEC CALLREGFREE CALLREGFREE_PVT
-syn keyword xsMacro CALLREG_INTUIT_START CALLREG_INTUIT_STRING
-syn keyword xsMacro CALLREG_NAMED_BUFF_ALL CALLREG_NAMED_BUFF_CLEAR
-syn keyword xsMacro CALLREG_NAMED_BUFF_COUNT CALLREG_NAMED_BUFF_DELETE
-syn keyword xsMacro CALLREG_NAMED_BUFF_EXISTS CALLREG_NAMED_BUFF_FETCH
-syn keyword xsMacro CALLREG_NAMED_BUFF_FIRSTKEY CALLREG_NAMED_BUFF_NEXTKEY
-syn keyword xsMacro CALLREG_NAMED_BUFF_SCALAR CALLREG_NAMED_BUFF_STORE
-syn keyword xsMacro CALLREG_NUMBUF_FETCH CALLREG_NUMBUF_LENGTH
-syn keyword xsMacro CALLREG_NUMBUF_STORE CALLREG_PACKAGE CALLRUNOPS
-syn keyword xsMacro CALL_BLOCK_HOOKS CALL_FPTR CANY CAN_COW_FLAGS
+syn keyword xsMacro ASCII_RESTRICT_PAT_MODS ASCII_TO_NATIVE ASCTIME_R_PROTO
+syn keyword xsMacro ASSERT_CURPAD_ACTIVE ASSERT_CURPAD_LEGAL ASSIGNOP ASSUME
+syn keyword xsMacro Atof Atol Atoul AvALLOC AvARRAY AvARYLEN AvFILL AvFILLp
+syn keyword xsMacro AvMAX AvREAL AvREALISH AvREAL_off AvREAL_on AvREAL_only
+syn keyword xsMacro AvREIFY AvREIFY_off AvREIFY_on AvREIFY_only BADVERSION
+syn keyword xsMacro BASEOP BHKf_bhk_eval BHKf_bhk_post_end BHKf_bhk_pre_end
+syn keyword xsMacro BHKf_bhk_start BIN BIN_EXP BITANDOP BITMAP_BYTE
+syn keyword xsMacro BITMAP_TEST BITOROP BIT_BUCKET BIT_DIGITS BOL
+syn keyword xsMacro BOM_UTF8_FIRST_BYTE BOM_UTF8_TAIL BOUND BOUNDA BOUNDL
+syn keyword xsMacro BOUNDU BRANCH BRANCHJ BRANCH_next BRANCH_next_fail
+syn keyword xsMacro BSD_GETPGRP BSD_SETPGRP BSDish BUFSIZ BYTEORDER
+syn keyword xsMacro BhkDISABLE BhkENABLE BhkENTRY BhkENTRY_set BhkFLAGS Bit
+syn keyword xsMacro BmFLAGS BmPREVIOUS BmRARE BmUSEFUL CALLREGCOMP
+syn keyword xsMacro CALLREGCOMP_ENG CALLREGDUPE CALLREGDUPE_PVT CALLREGEXEC
+syn keyword xsMacro CALLREGFREE CALLREGFREE_PVT CALLREG_INTUIT_START
+syn keyword xsMacro CALLREG_INTUIT_STRING CALLREG_NAMED_BUFF_ALL
+syn keyword xsMacro CALLREG_NAMED_BUFF_CLEAR CALLREG_NAMED_BUFF_COUNT
+syn keyword xsMacro CALLREG_NAMED_BUFF_DELETE CALLREG_NAMED_BUFF_EXISTS
+syn keyword xsMacro CALLREG_NAMED_BUFF_FETCH CALLREG_NAMED_BUFF_FIRSTKEY
+syn keyword xsMacro CALLREG_NAMED_BUFF_NEXTKEY CALLREG_NAMED_BUFF_SCALAR
+syn keyword xsMacro CALLREG_NAMED_BUFF_STORE CALLREG_NUMBUF_FETCH
+syn keyword xsMacro CALLREG_NUMBUF_LENGTH CALLREG_NUMBUF_STORE
+syn keyword xsMacro CALLREG_PACKAGE CALLRUNOPS CALL_BLOCK_HOOKS
+syn keyword xsMacro CALL_CHECKER_REQUIRE_GV CALL_FPTR CANY CAN_COW_FLAGS
syn keyword xsMacro CAN_COW_MASK CAN_PROTOTYPE CAN_VAPROTO
syn keyword xsMacro CASE_STD_PMMOD_FLAGS_PARSE_SET CASTFLAGS CASTNEGFLOAT
-syn keyword xsMacro CAT2 CATCH_GET CATCH_SET CHARBITS CHARSET_PAT_MODS
-syn keyword xsMacro CHECK_MALLOC_TAINT CHECK_MALLOC_TOO_LATE_FOR
-syn keyword xsMacro CHECK_MALLOC_TOO_LATE_FOR_ CLEAR_ARGARRAY CLEAR_ERRSV
-syn keyword xsMacro CLONEf_CLONE_HOST CLONEf_COPY_STACKS CLONEf_JOIN_IN
-syn keyword xsMacro CLONEf_KEEP_PTR_TABLE CLOSE CLUMP CLUMP_2IV CLUMP_2UV
-syn keyword xsMacro COLONATTR COMMIT COMMIT_next COMMIT_next_fail
-syn keyword xsMacro COND_BROADCAST COND_DESTROY COND_INIT COND_SIGNAL
-syn keyword xsMacro COND_WAIT CONTINUE CONTINUE_PAT_MOD COPHH_KEY_UTF8
-syn keyword xsMacro COP_SEQ_RANGE_HIGH COP_SEQ_RANGE_LOW CPERLarg CPERLarg_
-syn keyword xsMacro CPERLscope CPPLAST CPPMINUS CPPRUN CPPSTDIN CRYPT_R_PROTO
-syn keyword xsMacro CSH CTERMID_R_PROTO CTIME_R_PROTO CTYPE256 CURLY CURLYM
+syn keyword xsMacro CAT2 CATCH_GET CATCH_SET CHANGE_MULTICALL_FLAGS CHARBITS
+syn keyword xsMacro CHARSET_PAT_MODS CHECK_MALLOC_TAINT
+syn keyword xsMacro CHECK_MALLOC_TOO_LATE_FOR CHECK_MALLOC_TOO_LATE_FOR_
+syn keyword xsMacro CLEAR_ARGARRAY CLEAR_ERRSV CLONEf_CLONE_HOST
+syn keyword xsMacro CLONEf_COPY_STACKS CLONEf_JOIN_IN CLONEf_KEEP_PTR_TABLE
+syn keyword xsMacro CLOSE CLUMP CLUMP_2IV CLUMP_2UV COLONATTR
+syn keyword xsMacro COMBINING_GRAVE_ACCENT_UTF8 COMMIT COMMIT_next
+syn keyword xsMacro COMMIT_next_fail COND_BROADCAST COND_DESTROY COND_INIT
+syn keyword xsMacro COND_SIGNAL COND_WAIT CONTINUE CONTINUE_PAT_MOD
+syn keyword xsMacro COPHH_KEY_UTF8 COP_SEQMAX_INC COP_SEQ_RANGE_HIGH
+syn keyword xsMacro COP_SEQ_RANGE_LOW CPERLarg CPERLarg_ CPERLscope CPPLAST
+syn keyword xsMacro CPPMINUS CPPRUN CPPSTDIN CRYPT_R_PROTO CR_NATIVE CSH
+syn keyword xsMacro CTERMID_R_PROTO CTIME_R_PROTO CTYPE256 CURLY CURLYM
syn keyword xsMacro CURLYM_A CURLYM_A_fail CURLYM_B CURLYM_B_fail CURLYN
syn keyword xsMacro CURLYX CURLYX_end CURLYX_end_fail CURLY_B_max
syn keyword xsMacro CURLY_B_max_fail CURLY_B_min CURLY_B_min_fail
syn keyword xsMacro CURLY_B_min_known CURLY_B_min_known_fail
syn keyword xsMacro CURRENT_FEATURE_BUNDLE CURRENT_HINTS CUTGROUP
-syn keyword xsMacro CUTGROUP_next CUTGROUP_next_fail CVf_ANON CVf_AUTOLOAD
+syn keyword xsMacro CUTGROUP_next CUTGROUP_next_fail CV_NAME_NOTQUAL
+syn keyword xsMacro CV_UNDEF_KEEP_NAME CVf_ANON CVf_ANONCONST CVf_AUTOLOAD
syn keyword xsMacro CVf_BUILTIN_ATTRS CVf_CLONE CVf_CLONED CVf_CONST
-syn keyword xsMacro CVf_CVGV_RC CVf_DYNFILE CVf_ISXSUB CVf_LVALUE CVf_METHOD
-syn keyword xsMacro CVf_NODEBUG CVf_UNIQUE CVf_WEAKOUTSIDE CXINC CXTYPEMASK
-syn keyword xsMacro CX_CURPAD_SAVE CX_CURPAD_SV CXp_FOR_DEF CXp_HASARGS
-syn keyword xsMacro CXp_MULTICALL CXp_ONCE CXp_REAL CXp_TRYBLOCK C_ARRAY_END
-syn keyword xsMacro C_ARRAY_LENGTH C_FAC_POSIX CopFILE CopFILEAV CopFILEAVx
-syn keyword xsMacro CopFILEGV CopFILEGV_set CopFILESV CopFILE_free
-syn keyword xsMacro CopFILE_set CopFILE_setn CopHINTHASH_get CopHINTHASH_set
-syn keyword xsMacro CopHINTS_get CopHINTS_set CopLABEL CopLABEL_alloc
-syn keyword xsMacro CopLABEL_len CopLABEL_len_flags CopLINE CopLINE_dec
-syn keyword xsMacro CopLINE_inc CopLINE_set CopSTASH CopSTASHPV
-syn keyword xsMacro CopSTASHPV_set CopSTASH_eq CopSTASH_free CopSTASH_len
-syn keyword xsMacro CopSTASH_len_set CopSTASH_ne CopSTASH_set Copy CopyD Ctl
-syn keyword xsMacro CvANON CvANON_off CvANON_on CvAUTOLOAD CvAUTOLOAD_off
+syn keyword xsMacro CVf_CVGV_RC CVf_DYNFILE CVf_HASEVAL CVf_ISXSUB
+syn keyword xsMacro CVf_LEXICAL CVf_LVALUE CVf_METHOD CVf_NAMED CVf_NODEBUG
+syn keyword xsMacro CVf_SLABBED CVf_UNIQUE CVf_WEAKOUTSIDE CXINC CXTYPEMASK
+syn keyword xsMacro CX_CURPAD_SAVE CX_CURPAD_SV CXp_FOR_DEF CXp_FOR_LVREF
+syn keyword xsMacro CXp_HASARGS CXp_MULTICALL CXp_ONCE CXp_REAL CXp_SUB_RE
+syn keyword xsMacro CXp_SUB_RE_FAKE CXp_TRYBLOCK C_ARRAY_END C_ARRAY_LENGTH
+syn keyword xsMacro C_FAC_POSIX CopFILE CopFILEAV CopFILEAVx CopFILEGV
+syn keyword xsMacro CopFILEGV_set CopFILESV CopFILE_free CopFILE_set
+syn keyword xsMacro CopFILE_setn CopHINTHASH_get CopHINTHASH_set CopHINTS_get
+syn keyword xsMacro CopHINTS_set CopLABEL CopLABEL_alloc CopLABEL_len
+syn keyword xsMacro CopLABEL_len_flags CopLINE CopLINE_dec CopLINE_inc
+syn keyword xsMacro CopLINE_set CopSTASH CopSTASHPV CopSTASHPV_set
+syn keyword xsMacro CopSTASH_eq CopSTASH_ne CopSTASH_set Copy CopyD CowREFCNT
+syn keyword xsMacro Ctl CvANON CvANONCONST CvANONCONST_off CvANONCONST_on
+syn keyword xsMacro CvANON_off CvANON_on CvAUTOLOAD CvAUTOLOAD_off
syn keyword xsMacro CvAUTOLOAD_on CvCLONE CvCLONED CvCLONED_off CvCLONED_on
syn keyword xsMacro CvCLONE_off CvCLONE_on CvCONST CvCONST_off CvCONST_on
-syn keyword xsMacro CvCVGV_RC CvCVGV_RC_off CvCVGV_RC_on CvDEPTH CvDYNFILE
-syn keyword xsMacro CvDYNFILE_off CvDYNFILE_on CvEVAL CvEVAL_off CvEVAL_on
-syn keyword xsMacro CvFILE CvFILEGV CvFILE_set_from_cop CvFLAGS CvGV CvGV_set
-syn keyword xsMacro CvISXSUB CvISXSUB_off CvISXSUB_on CvLVALUE CvLVALUE_off
-syn keyword xsMacro CvLVALUE_on CvMETHOD CvMETHOD_off CvMETHOD_on CvNODEBUG
-syn keyword xsMacro CvNODEBUG_off CvNODEBUG_on CvOUTSIDE CvOUTSIDE_SEQ
-syn keyword xsMacro CvPADLIST CvPROTO CvPROTOLEN CvROOT CvSPECIAL
+syn keyword xsMacro CvCVGV_RC CvCVGV_RC_off CvCVGV_RC_on CvDEPTH
+syn keyword xsMacro CvDEPTHunsafe CvDYNFILE CvDYNFILE_off CvDYNFILE_on CvEVAL
+syn keyword xsMacro CvEVAL_off CvEVAL_on CvFILE CvFILEGV CvFILE_set_from_cop
+syn keyword xsMacro CvFLAGS CvGV CvGV_set CvHASEVAL CvHASEVAL_off
+syn keyword xsMacro CvHASEVAL_on CvHASGV CvHSCXT CvISXSUB CvISXSUB_off
+syn keyword xsMacro CvISXSUB_on CvLEXICAL CvLEXICAL_off CvLEXICAL_on CvLVALUE
+syn keyword xsMacro CvLVALUE_off CvLVALUE_on CvMETHOD CvMETHOD_off
+syn keyword xsMacro CvMETHOD_on CvNAMED CvNAMED_off CvNAMED_on CvNAME_HEK_set
+syn keyword xsMacro CvNODEBUG CvNODEBUG_off CvNODEBUG_on CvOUTSIDE
+syn keyword xsMacro CvOUTSIDE_SEQ CvPADLIST CvPADLIST_set CvPROTO CvPROTOLEN
+syn keyword xsMacro CvROOT CvSLABBED CvSLABBED_off CvSLABBED_on CvSPECIAL
syn keyword xsMacro CvSPECIAL_off CvSPECIAL_on CvSTART CvSTASH CvSTASH_set
syn keyword xsMacro CvUNIQUE CvUNIQUE_off CvUNIQUE_on CvWEAKOUTSIDE
syn keyword xsMacro CvWEAKOUTSIDE_off CvWEAKOUTSIDE_on CvXSUB CvXSUBANY
syn keyword xsMacro CxFOREACH CxFOREACHDEF CxHASARGS CxITERVAR
syn keyword xsMacro CxITERVAR_PADSV CxLABEL CxLABEL_len CxLABEL_len_flags
syn keyword xsMacro CxLVAL CxMULTICALL CxOLD_IN_EVAL CxOLD_OP_TYPE CxONCE
-syn keyword xsMacro CxPADLOOP CxREALEVAL CxTRYBLOCK CxTYPE CxTYPE_is_LOOP
-syn keyword xsMacro DBL_DIG DBL_MAX DBL_MIN DBM_ckFilter DBM_setFilter
-syn keyword xsMacro DB_VERSION_MAJOR_CFG DB_VERSION_MINOR_CFG
+syn keyword xsMacro CxPADLOOP CxPOPSUB_DONE CxREALEVAL CxTRYBLOCK CxTYPE
+syn keyword xsMacro CxTYPE_is_LOOP DBL_DIG DBL_MAX DBL_MIN DBM_ckFilter
+syn keyword xsMacro DBM_setFilter DBVARMG_COUNT DBVARMG_SIGNAL DBVARMG_SINGLE
+syn keyword xsMacro DBVARMG_TRACE DB_VERSION_MAJOR_CFG DB_VERSION_MINOR_CFG
syn keyword xsMacro DB_VERSION_PATCH_CFG DEBUG_A DEBUG_A_FLAG DEBUG_A_TEST
syn keyword xsMacro DEBUG_A_TEST_ DEBUG_B DEBUG_BUFFERS_r DEBUG_B_FLAG
syn keyword xsMacro DEBUG_B_TEST DEBUG_B_TEST_ DEBUG_C DEBUG_COMPILE_r
@@ -1122,13 +1231,15 @@ syn keyword xsMacro DEBUG_DB_RECURSE_FLAG DEBUG_DUMP_r DEBUG_D_FLAG
syn keyword xsMacro DEBUG_D_TEST DEBUG_D_TEST_ DEBUG_EXECUTE_r DEBUG_EXTRA_r
syn keyword xsMacro DEBUG_FLAGS_r DEBUG_GPOS_r DEBUG_H DEBUG_H_FLAG
syn keyword xsMacro DEBUG_H_TEST DEBUG_H_TEST_ DEBUG_INTUIT_r DEBUG_J_FLAG
-syn keyword xsMacro DEBUG_J_TEST DEBUG_J_TEST_ DEBUG_M DEBUG_MASK
+syn keyword xsMacro DEBUG_J_TEST DEBUG_J_TEST_ DEBUG_L DEBUG_L_FLAG
+syn keyword xsMacro DEBUG_L_TEST DEBUG_L_TEST_ DEBUG_M DEBUG_MASK
syn keyword xsMacro DEBUG_MATCH_r DEBUG_M_FLAG DEBUG_M_TEST DEBUG_M_TEST_
syn keyword xsMacro DEBUG_OFFSETS_r DEBUG_OPTIMISE_MORE_r DEBUG_OPTIMISE_r
syn keyword xsMacro DEBUG_P DEBUG_PARSE_r DEBUG_P_FLAG DEBUG_P_TEST
syn keyword xsMacro DEBUG_P_TEST_ DEBUG_Pv DEBUG_Pv_TEST DEBUG_Pv_TEST_
-syn keyword xsMacro DEBUG_R DEBUG_R_FLAG DEBUG_R_TEST DEBUG_R_TEST_
-syn keyword xsMacro DEBUG_SCOPE DEBUG_STACK_r DEBUG_STATE_r DEBUG_T
+syn keyword xsMacro DEBUG_R DEBUG_R_FLAG DEBUG_R_TEST DEBUG_R_TEST_ DEBUG_S
+syn keyword xsMacro DEBUG_SCOPE DEBUG_STACK_r DEBUG_STATE_r DEBUG_S_FLAG
+syn keyword xsMacro DEBUG_S_TEST DEBUG_S_TEST_ DEBUG_T DEBUG_TEST_r
syn keyword xsMacro DEBUG_TOP_FLAG DEBUG_TRIE_COMPILE_MORE_r
syn keyword xsMacro DEBUG_TRIE_COMPILE_r DEBUG_TRIE_EXECUTE_MORE_r
syn keyword xsMacro DEBUG_TRIE_EXECUTE_r DEBUG_TRIE_r DEBUG_T_FLAG
@@ -1148,47 +1259,71 @@ syn keyword xsMacro DEBUG_s_FLAG DEBUG_s_TEST DEBUG_s_TEST_ DEBUG_t_FLAG
syn keyword xsMacro DEBUG_t_TEST DEBUG_t_TEST_ DEBUG_u DEBUG_u_FLAG
syn keyword xsMacro DEBUG_u_TEST DEBUG_u_TEST_ DEBUG_v DEBUG_v_FLAG
syn keyword xsMacro DEBUG_v_TEST DEBUG_v_TEST_ DEBUG_x DEBUG_x_FLAG
-syn keyword xsMacro DEBUG_x_TEST DEBUG_x_TEST_ DEFAULT DEFAULT_PAT_MOD
-syn keyword xsMacro DEFINEP DEFSV DEFSV_set DEPENDS_PAT_MOD DEPENDS_PAT_MODS
-syn keyword xsMacro DETACH DIE DIGIT DIGITA DIGITL DIR DM_ARRAY_ISA DM_DELAY
-syn keyword xsMacro DM_EGID DM_EUID DM_GID DM_RGID DM_RUID DM_UID DO DOINIT
-syn keyword xsMacro DOLSHARP DONT_DECLARE_STD DORDOR DOROP DOSISH DOTDOT
-syn keyword xsMacro DOUBLESIZE DO_UTF8 DPTR2FPTR DRAND48_R_PROTO DUP_WARNINGS
-syn keyword xsMacro Drand01 ELSE ELSIF EMBEDMYMALLOC END ENDGRENT_R_PROTO
-syn keyword xsMacro ENDHOSTENT_R_PROTO ENDLIKE ENDNETENT_R_PROTO
-syn keyword xsMacro ENDPROTOENT_R_PROTO ENDPWENT_R_PROTO ENDSERVENT_R_PROTO
-syn keyword xsMacro END_EXTERN_C ENTER ENTER_with_name ENTRY_PROBE ENUM_BOOL
-syn keyword xsMacro EOF EOL EOS EQOP ERRHV ERRSV EVAL EVAL_AB EVAL_AB_fail
-syn keyword xsMacro EVAL_INEVAL EVAL_INREQUIRE EVAL_KEEPERR EVAL_NULL
-syn keyword xsMacro EVAL_WARNONLY EXACT EXACTF EXACTFA EXACTFL EXACTFU
-syn keyword xsMacro EXACTFU_SS EXACTFU_TRICKYFOLD EXEC_ARGV_CAST EXEC_PAT_MOD
+syn keyword xsMacro DEBUG_x_TEST DEBUG_x_TEST_
+syn keyword xsMacro DECLARATION_FOR_LC_NUMERIC_MANIPULATION
+syn keyword xsMacro DECLARATION_FOR_STORE_LC_NUMERIC_SET_TO_NEEDED
+syn keyword xsMacro DECLARE_STORE_LC_NUMERIC_SET_TO_NEEDED DEFAULT
+syn keyword xsMacro DEFAULT_PAT_MOD DEFINEP DEFSV DEFSV_set DEL_NATIVE
+syn keyword xsMacro DEPENDS_PAT_MOD DEPENDS_PAT_MODS DETACH DIE DM_ARRAY_ISA
+syn keyword xsMacro DM_DELAY DM_EGID DM_EUID DM_GID DM_RGID DM_RUID DM_UID DO
+syn keyword xsMacro DOINIT DOLSHARP DONT_DECLARE_STD DORDOR DOROP DOSISH
+syn keyword xsMacro DOTDOT DOUBLEKIND DOUBLESIZE DOUBLE_BIG_ENDIAN
+syn keyword xsMacro DOUBLE_IS_IEEE_754_128_BIT_BIG_ENDIAN
+syn keyword xsMacro DOUBLE_IS_IEEE_754_128_BIT_LITTLE_ENDIAN
+syn keyword xsMacro DOUBLE_IS_IEEE_754_32_BIT_BIG_ENDIAN
+syn keyword xsMacro DOUBLE_IS_IEEE_754_32_BIT_LITTLE_ENDIAN
+syn keyword xsMacro DOUBLE_IS_IEEE_754_64_BIT_BIG_ENDIAN
+syn keyword xsMacro DOUBLE_IS_IEEE_754_64_BIT_LITTLE_ENDIAN
+syn keyword xsMacro DOUBLE_IS_IEEE_754_64_BIT_MIXED_ENDIAN_BE_LE
+syn keyword xsMacro DOUBLE_IS_IEEE_754_64_BIT_MIXED_ENDIAN_LE_BE
+syn keyword xsMacro DOUBLE_IS_UNKNOWN_FORMAT DOUBLE_LITTLE_ENDIAN
+syn keyword xsMacro DOUBLE_MIX_ENDIAN DO_UTF8 DPTR2FPTR DRAND48_R_PROTO
+syn keyword xsMacro DUP_WARNINGS Drand01 ELSE ELSIF EMBEDMYMALLOC END
+syn keyword xsMacro ENDGRENT_R_PROTO ENDHOSTENT_R_PROTO ENDLIKE
+syn keyword xsMacro ENDNETENT_R_PROTO ENDPROTOENT_R_PROTO ENDPWENT_R_PROTO
+syn keyword xsMacro ENDSERVENT_R_PROTO END_EXTERN_C ENTER ENTER_with_name
+syn keyword xsMacro ENTRY_PROBE EOF EOL EOS EQOP ERRSV ESC_NATIVE EVAL
+syn keyword xsMacro EVAL_AB EVAL_AB_fail EVAL_INEVAL EVAL_INREQUIRE
+syn keyword xsMacro EVAL_KEEPERR EVAL_NULL EVAL_RE_REPARSING EVAL_WARNONLY
+syn keyword xsMacro EXACT EXACTF EXACTFA EXACTFA_NO_TRIE EXACTFL EXACTFLU8
+syn keyword xsMacro EXACTFU EXACTFU_SS EXACTL EXEC_ARGV_CAST EXEC_PAT_MOD
syn keyword xsMacro EXEC_PAT_MODS EXPECT EXT EXTCONST EXTEND EXTEND_MORTAL
syn keyword xsMacro EXTERN_C EXTPERLIO EXTRA_SIZE EXTRA_STEP_2ARGS EXT_MGVTBL
syn keyword xsMacro EXT_PAT_MODS FAKE_BIT_BUCKET FAKE_DEFAULT_SIGNAL_HANDLERS
-syn keyword xsMacro FAKE_PERSISTENT_SIGNAL_HANDLERS FBMcf_TAIL
+syn keyword xsMacro FAKE_PERSISTENT_SIGNAL_HANDLERS FALSE FBMcf_TAIL
syn keyword xsMacro FBMcf_TAIL_DOLLAR FBMcf_TAIL_DOLLARM FBMcf_TAIL_Z
syn keyword xsMacro FBMcf_TAIL_z FBMrf_MULTILINE FCNTL_CAN_LOCK FD_CLR
syn keyword xsMacro FD_ISSET FD_SET FD_ZERO FEATURE_ARYBASE_IS_ENABLED
-syn keyword xsMacro FEATURE_BUNDLE_510 FEATURE_BUNDLE_511 FEATURE_BUNDLE_515
+syn keyword xsMacro FEATURE_BITWISE_IS_ENABLED FEATURE_BUNDLE_510
+syn keyword xsMacro FEATURE_BUNDLE_511 FEATURE_BUNDLE_515
syn keyword xsMacro FEATURE_BUNDLE_CUSTOM FEATURE_BUNDLE_DEFAULT
syn keyword xsMacro FEATURE_EVALBYTES_IS_ENABLED FEATURE_FC_IS_ENABLED
-syn keyword xsMacro FEATURE_IS_ENABLED FEATURE_SAY_IS_ENABLED
-syn keyword xsMacro FEATURE_STATE_IS_ENABLED FEATURE_SWITCH_IS_ENABLED
-syn keyword xsMacro FEATURE_UNICODE_IS_ENABLED FEATURE_UNIEVAL_IS_ENABLED
-syn keyword xsMacro FEATURE___SUB___IS_ENABLED FFLUSH_NULL FF_0DECIMAL
-syn keyword xsMacro FF_BLANK FF_CHECKCHOP FF_CHECKNL FF_CHOP FF_DECIMAL
-syn keyword xsMacro FF_END FF_FETCH FF_HALFSPACE FF_ITEM FF_LINEGLOB
-syn keyword xsMacro FF_LINEMARK FF_LINESNGL FF_LITERAL FF_MORE FF_NEWLINE
-syn keyword xsMacro FF_SKIP FF_SPACE FILE FILE_base FILE_bufsiz FILE_cnt
-syn keyword xsMacro FILE_ptr FILL_ADVANCE_NODE FILL_ADVANCE_NODE_ARG
-syn keyword xsMacro FILTER_DATA FILTER_ISREADER FILTER_READ FITS_IN_8_BITS
-syn keyword xsMacro FLAGS FLEXFILENAMES FOLDEQ_S1_ALREADY_FOLDED
-syn keyword xsMacro FOLDEQ_S2_ALREADY_FOLDED FOLDEQ_UTF8_LOCALE
-syn keyword xsMacro FOLDEQ_UTF8_NOMIX_ASCII FOLD_FLAGS_FULL FOLD_FLAGS_LOCALE
-syn keyword xsMacro FOR FORMAT FPTR2DPTR FREETMPS FREE_THREAD_KEY FSEEKSIZE
-syn keyword xsMacro FUNC FUNC0 FUNC0OP FUNC0SUB FUNC1 FUNCMETH FUNCTION__
-syn keyword xsMacro F_atan2_amg F_cos_amg F_exp_amg F_log_amg F_pow_amg
-syn keyword xsMacro F_sin_amg F_sqrt_amg Fflush FmLINES FreeOp Fstat
+syn keyword xsMacro FEATURE_IS_ENABLED FEATURE_LEXSUBS_IS_ENABLED
+syn keyword xsMacro FEATURE_POSTDEREF_IS_ENABLED
+syn keyword xsMacro FEATURE_POSTDEREF_QQ_IS_ENABLED
+syn keyword xsMacro FEATURE_REFALIASING_IS_ENABLED FEATURE_SAY_IS_ENABLED
+syn keyword xsMacro FEATURE_SIGNATURES_IS_ENABLED FEATURE_STATE_IS_ENABLED
+syn keyword xsMacro FEATURE_SWITCH_IS_ENABLED FEATURE_UNICODE_IS_ENABLED
+syn keyword xsMacro FEATURE_UNIEVAL_IS_ENABLED FEATURE___SUB___IS_ENABLED
+syn keyword xsMacro FFLUSH_NULL FF_0DECIMAL FF_BLANK FF_CHECKCHOP FF_CHECKNL
+syn keyword xsMacro FF_CHOP FF_DECIMAL FF_END FF_FETCH FF_HALFSPACE FF_ITEM
+syn keyword xsMacro FF_LINEGLOB FF_LINEMARK FF_LINESNGL FF_LITERAL FF_MORE
+syn keyword xsMacro FF_NEWLINE FF_SKIP FF_SPACE FILE FILE_base FILE_bufsiz
+syn keyword xsMacro FILE_cnt FILE_ptr FILL_ADVANCE_NODE
+syn keyword xsMacro FILL_ADVANCE_NODE_2L_ARG FILL_ADVANCE_NODE_ARG
+syn keyword xsMacro FILTER_DATA FILTER_ISREADER FILTER_READ
+syn keyword xsMacro FIND_RUNCV_level_eq FIND_RUNCV_padid_eq
+syn keyword xsMacro FIRST_SURROGATE_UTF8_FIRST_BYTE FITS_IN_8_BITS FLAGS
+syn keyword xsMacro FLEXFILENAMES FOLDEQ_LOCALE FOLDEQ_S1_ALREADY_FOLDED
+syn keyword xsMacro FOLDEQ_S1_FOLDS_SANE FOLDEQ_S2_ALREADY_FOLDED
+syn keyword xsMacro FOLDEQ_S2_FOLDS_SANE FOLDEQ_UTF8_NOMIX_ASCII
+syn keyword xsMacro FOLD_FLAGS_FULL FOLD_FLAGS_LOCALE FOLD_FLAGS_NOMIX_ASCII
+syn keyword xsMacro FOR FORMAT FORMLBRACK FORMRBRACK FPTR2DPTR FP_PINF
+syn keyword xsMacro FP_QNAN FREETMPS FREE_THREAD_KEY FSEEKSIZE FUNC FUNC0
+syn keyword xsMacro FUNC0OP FUNC0SUB FUNC1 FUNCMETH FUNCTION__ F_atan2_amg
+syn keyword xsMacro F_cos_amg F_exp_amg F_log_amg F_pow_amg F_sin_amg
+syn keyword xsMacro F_sqrt_amg Fflush FmLINES FreeOp Fstat GCB_ENUM_COUNT
+syn keyword xsMacro GCC_DIAG_IGNORE GCC_DIAG_PRAGMA GCC_DIAG_RESTORE
syn keyword xsMacro GDBMNDBM_H_USES_PROTOTYPES GETATARGET GETGRENT_R_PROTO
syn keyword xsMacro GETGRGID_R_PROTO GETGRNAM_R_PROTO GETHOSTBYADDR_R_PROTO
syn keyword xsMacro GETHOSTBYNAME_R_PROTO GETHOSTENT_R_PROTO GETLOGIN_R_PROTO
@@ -1201,164 +1336,185 @@ syn keyword xsMacro GETSERVENT_R_PROTO GETSPNAM_R_PROTO GETTARGET
syn keyword xsMacro GETTARGETSTACKED GET_RE_DEBUG_FLAGS
syn keyword xsMacro GET_RE_DEBUG_FLAGS_DECL GIMME GIMME_V GIVEN
syn keyword xsMacro GLOBAL_PAT_MOD GMTIME_MAX GMTIME_MIN GMTIME_R
-syn keyword xsMacro GMTIME_R_PROTO GOSTART GOSUB GPOS GRAMBARESTMT GRAMBLOCK
-syn keyword xsMacro GRAMEXPR GRAMFULLSTMT GRAMPROG GRAMSTMTSEQ
+syn keyword xsMacro GMTIME_R_PROTO GOSTART GOSUB GPOS GPf_ALIASED_SV
+syn keyword xsMacro GRAMBARESTMT GRAMBLOCK GRAMEXPR GRAMFULLSTMT GRAMPROG
+syn keyword xsMacro GRAMSTMTSEQ GREEK_CAPITAL_LETTER_IOTA_UTF8
syn keyword xsMacro GREEK_CAPITAL_LETTER_MU GREEK_SMALL_LETTER_MU
-syn keyword xsMacro GROK_NUMERIC_RADIX GROUPP GRPASSWD GV_ADD GV_ADDINEVAL
-syn keyword xsMacro GV_ADDMG GV_ADDMULTI GV_ADDWARN GV_AUTOLOAD
-syn keyword xsMacro GV_AUTOLOAD_ISMETHOD GV_CROAK GV_NOADD_MASK
-syn keyword xsMacro GV_NOADD_NOINIT GV_NOEXPAND GV_NOINIT GV_NOTQUAL
-syn keyword xsMacro GV_NO_SVGMAGIC GVf_ASSUMECV GVf_IMPORTED GVf_IMPORTED_AV
-syn keyword xsMacro GVf_IMPORTED_CV GVf_IMPORTED_HV GVf_IMPORTED_SV GVf_INTRO
-syn keyword xsMacro GVf_IN_PAD GVf_MULTI Gconvert Gid_t_f Gid_t_sign
-syn keyword xsMacro Gid_t_size GvASSIGN_GENERATION GvASSIGN_GENERATION_set
-syn keyword xsMacro GvASSUMECV GvASSUMECV_off GvASSUMECV_on GvAV GvAVn GvCV
-syn keyword xsMacro GvCVGEN GvCV_set GvCVu GvEGV GvEGVx GvENAME GvENAMELEN
-syn keyword xsMacro GvENAMEUTF8 GvENAME_HEK GvESTASH GvFILE GvFILEGV
-syn keyword xsMacro GvFILE_HEK GvFLAGS GvFORM GvGP GvGP_set GvHV GvHVn
-syn keyword xsMacro GvIMPORTED GvIMPORTED_AV GvIMPORTED_AV_off
-syn keyword xsMacro GvIMPORTED_AV_on GvIMPORTED_CV GvIMPORTED_CV_off
-syn keyword xsMacro GvIMPORTED_CV_on GvIMPORTED_HV GvIMPORTED_HV_off
-syn keyword xsMacro GvIMPORTED_HV_on GvIMPORTED_SV GvIMPORTED_SV_off
-syn keyword xsMacro GvIMPORTED_SV_on GvIMPORTED_off GvIMPORTED_on GvINTRO
-syn keyword xsMacro GvINTRO_off GvINTRO_on GvIN_PAD GvIN_PAD_off GvIN_PAD_on
-syn keyword xsMacro GvIO GvIOn GvIOp GvLINE GvMULTI GvMULTI_off GvMULTI_on
-syn keyword xsMacro GvNAME GvNAMELEN GvNAMELEN_get GvNAMEUTF8 GvNAME_HEK
-syn keyword xsMacro GvNAME_get GvREFCNT GvSTASH GvSV GvSVn GvXPVGV Gv_AMG
+syn keyword xsMacro GREEK_SMALL_LETTER_MU_UTF8 GROK_NUMERIC_RADIX GROUPP
+syn keyword xsMacro GRPASSWD GV_ADD GV_ADDMG GV_ADDMULTI GV_ADDWARN
+syn keyword xsMacro GV_AUTOLOAD GV_AUTOLOAD_ISMETHOD GV_CACHE_ONLY GV_CROAK
+syn keyword xsMacro GV_NOADD_MASK GV_NOADD_NOINIT GV_NOEXPAND GV_NOINIT
+syn keyword xsMacro GV_NOTQUAL GV_NO_SVGMAGIC GV_SUPER GVf_ASSUMECV
+syn keyword xsMacro GVf_IMPORTED GVf_IMPORTED_AV GVf_IMPORTED_CV
+syn keyword xsMacro GVf_IMPORTED_HV GVf_IMPORTED_SV GVf_INTRO GVf_MULTI
+syn keyword xsMacro Gconvert Gid_t_f Gid_t_sign Gid_t_size GvALIASED_SV
+syn keyword xsMacro GvALIASED_SV_off GvALIASED_SV_on GvASSIGN_GENERATION
+syn keyword xsMacro GvASSIGN_GENERATION_set GvASSUMECV GvASSUMECV_off
+syn keyword xsMacro GvASSUMECV_on GvAV GvAVn GvCV GvCVGEN GvCV_set GvCVu
+syn keyword xsMacro GvEGV GvEGVx GvENAME GvENAMELEN GvENAMEUTF8 GvENAME_HEK
+syn keyword xsMacro GvESTASH GvFILE GvFILEGV GvFILE_HEK GvFILEx GvFLAGS
+syn keyword xsMacro GvFORM GvGP GvGPFLAGS GvGP_set GvHV GvHVn GvIMPORTED
+syn keyword xsMacro GvIMPORTED_AV GvIMPORTED_AV_off GvIMPORTED_AV_on
+syn keyword xsMacro GvIMPORTED_CV GvIMPORTED_CV_off GvIMPORTED_CV_on
+syn keyword xsMacro GvIMPORTED_HV GvIMPORTED_HV_off GvIMPORTED_HV_on
+syn keyword xsMacro GvIMPORTED_SV GvIMPORTED_SV_off GvIMPORTED_SV_on
+syn keyword xsMacro GvIMPORTED_off GvIMPORTED_on GvINTRO GvINTRO_off
+syn keyword xsMacro GvINTRO_on GvIN_PAD GvIN_PAD_off GvIN_PAD_on GvIO GvIOn
+syn keyword xsMacro GvIOp GvLINE GvMULTI GvMULTI_off GvMULTI_on GvNAME
+syn keyword xsMacro GvNAMELEN GvNAMELEN_get GvNAMEUTF8 GvNAME_HEK GvNAME_get
+syn keyword xsMacro GvREFCNT GvSTASH GvSV GvSVn GvXPVGV Gv_AMG HANDY_H
syn keyword xsMacro HASATTRIBUTE_DEPRECATED HASATTRIBUTE_FORMAT
syn keyword xsMacro HASATTRIBUTE_MALLOC HASATTRIBUTE_NONNULL
syn keyword xsMacro HASATTRIBUTE_NORETURN HASATTRIBUTE_PURE
syn keyword xsMacro HASATTRIBUTE_UNUSED HASATTRIBUTE_WARN_UNUSED_RESULT
-syn keyword xsMacro HASCONST HASHBRACK HASVOLATILE HAS_64K_LIMIT HAS_ACCESS
-syn keyword xsMacro HAS_ALARM HAS_ATOLL HAS_BCMP HAS_BCOPY HAS_BOOL
-syn keyword xsMacro HAS_BUILTIN_CHOOSE_EXPR HAS_BUILTIN_EXPECT HAS_BZERO
-syn keyword xsMacro HAS_C99_VARIADIC_MACROS HAS_CHOWN HAS_CHROOT HAS_CLEARENV
-syn keyword xsMacro HAS_COPYSIGNL HAS_CRYPT HAS_CTERMID HAS_CUSERID
-syn keyword xsMacro HAS_DBL_DIG HAS_DBMINIT_PROTO HAS_DIFFTIME HAS_DIRFD
-syn keyword xsMacro HAS_DLERROR HAS_DRAND48_PROTO HAS_DUP2 HAS_EACCESS
-syn keyword xsMacro HAS_ENDGRENT HAS_ENDHOSTENT HAS_ENDNETENT HAS_ENDPROTOENT
-syn keyword xsMacro HAS_ENDPWENT HAS_ENDSERVENT HAS_FAST_STDIO HAS_FCHDIR
-syn keyword xsMacro HAS_FCHMOD HAS_FCHOWN HAS_FCNTL HAS_FD_SET HAS_FGETPOS
-syn keyword xsMacro HAS_FINITE HAS_FINITEL HAS_FLOCK HAS_FLOCK_PROTO HAS_FORK
-syn keyword xsMacro HAS_FPATHCONF HAS_FREXPL HAS_FSEEKO HAS_FSETPOS
-syn keyword xsMacro HAS_FSTATFS HAS_FSTATVFS HAS_FSYNC HAS_FTELLO HAS_FUTIMES
-syn keyword xsMacro HAS_GETADDRINFO HAS_GETCWD HAS_GETGRENT HAS_GETGROUPS
-syn keyword xsMacro HAS_GETHOSTBYADDR HAS_GETHOSTBYNAME HAS_GETHOSTENT
-syn keyword xsMacro HAS_GETHOSTNAME HAS_GETHOST_PROTOS HAS_GETITIMER
-syn keyword xsMacro HAS_GETLOGIN HAS_GETMNTENT HAS_GETNAMEINFO
-syn keyword xsMacro HAS_GETNETBYADDR HAS_GETNETBYNAME HAS_GETNETENT
-syn keyword xsMacro HAS_GETNET_PROTOS HAS_GETPAGESIZE HAS_GETPGID HAS_GETPGRP
-syn keyword xsMacro HAS_GETPPID HAS_GETPRIORITY HAS_GETPROTOBYNAME
-syn keyword xsMacro HAS_GETPROTOBYNUMBER HAS_GETPROTOENT HAS_GETPROTO_PROTOS
-syn keyword xsMacro HAS_GETPWENT HAS_GETSERVBYNAME HAS_GETSERVBYPORT
-syn keyword xsMacro HAS_GETSERVENT HAS_GETSERV_PROTOS HAS_GETSPNAM
-syn keyword xsMacro HAS_GETTIMEOFDAY HAS_GNULIBC HAS_GROUP HAS_HASMNTOPT
-syn keyword xsMacro HAS_HTOVL HAS_HTOVS HAS_ILOGBL HAS_INETNTOP HAS_INETPTON
+syn keyword xsMacro HASCONST HASHBRACK HASVOLATILE HAS_ACCESS HAS_ACOSH
+syn keyword xsMacro HAS_ALARM HAS_ASINH HAS_ATANH HAS_ATOLL HAS_BACKTRACE
+syn keyword xsMacro HAS_BCMP HAS_BCOPY HAS_BOOL HAS_BUILTIN_CHOOSE_EXPR
+syn keyword xsMacro HAS_BUILTIN_EXPECT HAS_BZERO HAS_C99
+syn keyword xsMacro HAS_C99_VARIADIC_MACROS HAS_CBRT HAS_CHOWN HAS_CHROOT
+syn keyword xsMacro HAS_CLEARENV HAS_COPYSIGN HAS_COPYSIGNL HAS_CRYPT
+syn keyword xsMacro HAS_CTERMID HAS_CUSERID HAS_DBL_DIG HAS_DBMINIT_PROTO
+syn keyword xsMacro HAS_DIFFTIME HAS_DIRFD HAS_DLADDR HAS_DLERROR
+syn keyword xsMacro HAS_DRAND48_PROTO HAS_DUP2 HAS_EACCESS HAS_ENDGRENT
+syn keyword xsMacro HAS_ENDHOSTENT HAS_ENDNETENT HAS_ENDPROTOENT HAS_ENDPWENT
+syn keyword xsMacro HAS_ENDSERVENT HAS_ERF HAS_ERFC HAS_EXP2 HAS_EXPM1
+syn keyword xsMacro HAS_FCHDIR HAS_FCHMOD HAS_FCHOWN HAS_FCNTL HAS_FDIM
+syn keyword xsMacro HAS_FD_SET HAS_FEGETROUND HAS_FGETPOS HAS_FINITE
+syn keyword xsMacro HAS_FINITEL HAS_FLOCK HAS_FLOCK_PROTO HAS_FMA HAS_FMAX
+syn keyword xsMacro HAS_FMIN HAS_FORK HAS_FPATHCONF HAS_FPCLASSIFY HAS_FREXPL
+syn keyword xsMacro HAS_FSEEKO HAS_FSETPOS HAS_FSTATFS HAS_FSTATVFS HAS_FSYNC
+syn keyword xsMacro HAS_FTELLO HAS_FUTIMES HAS_GETADDRINFO HAS_GETCWD
+syn keyword xsMacro HAS_GETGRENT HAS_GETGROUPS HAS_GETHOSTBYADDR
+syn keyword xsMacro HAS_GETHOSTBYNAME HAS_GETHOSTENT HAS_GETHOSTNAME
+syn keyword xsMacro HAS_GETHOST_PROTOS HAS_GETITIMER HAS_GETLOGIN
+syn keyword xsMacro HAS_GETMNTENT HAS_GETNAMEINFO HAS_GETNETBYADDR
+syn keyword xsMacro HAS_GETNETBYNAME HAS_GETNETENT HAS_GETNET_PROTOS
+syn keyword xsMacro HAS_GETPAGESIZE HAS_GETPGID HAS_GETPGRP HAS_GETPPID
+syn keyword xsMacro HAS_GETPRIORITY HAS_GETPROTOBYNAME HAS_GETPROTOBYNUMBER
+syn keyword xsMacro HAS_GETPROTOENT HAS_GETPROTO_PROTOS HAS_GETPWENT
+syn keyword xsMacro HAS_GETSERVBYNAME HAS_GETSERVBYPORT HAS_GETSERVENT
+syn keyword xsMacro HAS_GETSERV_PROTOS HAS_GETSPNAM HAS_GETTIMEOFDAY
+syn keyword xsMacro HAS_GNULIBC HAS_GROUP HAS_HASMNTOPT HAS_HTONL HAS_HTONS
+syn keyword xsMacro HAS_HYPOT HAS_ILOGB HAS_ILOGBL HAS_INETNTOP HAS_INETPTON
syn keyword xsMacro HAS_INET_ATON HAS_INT64_T HAS_IOCTL HAS_IPV6_MREQ
-syn keyword xsMacro HAS_ISASCII HAS_ISBLANK HAS_ISINF HAS_ISNAN HAS_ISNANL
-syn keyword xsMacro HAS_KILL HAS_KILLPG HAS_LCHOWN HAS_LDBL_DIG HAS_LINK
-syn keyword xsMacro HAS_LOCALECONV HAS_LOCKF HAS_LONG_DOUBLE HAS_LONG_LONG
+syn keyword xsMacro HAS_IP_MREQ HAS_IP_MREQ_SOURCE HAS_ISASCII HAS_ISBLANK
+syn keyword xsMacro HAS_ISFINITE HAS_ISINF HAS_ISINFL HAS_ISNAN HAS_ISNANL
+syn keyword xsMacro HAS_ISNORMAL HAS_J0 HAS_J0L HAS_KILL HAS_KILLPG
+syn keyword xsMacro HAS_LCHOWN HAS_LC_MONETARY_2008 HAS_LDBL_DIG HAS_LDEXPL
+syn keyword xsMacro HAS_LGAMMA HAS_LGAMMA_R HAS_LINK HAS_LLRINT HAS_LLRINTL
+syn keyword xsMacro HAS_LLROUND HAS_LLROUNDL HAS_LOCALECONV HAS_LOCKF
+syn keyword xsMacro HAS_LOG1P HAS_LOG2 HAS_LOGB HAS_LONG_DOUBLE HAS_LONG_LONG
+syn keyword xsMacro HAS_LRINT HAS_LRINTL HAS_LROUND HAS_LROUNDL
syn keyword xsMacro HAS_LSEEK_PROTO HAS_LSTAT HAS_MADVISE HAS_MBLEN
syn keyword xsMacro HAS_MBSTOWCS HAS_MBTOWC HAS_MEMCHR HAS_MEMCMP HAS_MEMCPY
syn keyword xsMacro HAS_MEMMOVE HAS_MEMSET HAS_MKDIR HAS_MKDTEMP HAS_MKFIFO
syn keyword xsMacro HAS_MKSTEMP HAS_MKSTEMPS HAS_MKTIME HAS_MMAP HAS_MODFL
syn keyword xsMacro HAS_MODFL_PROTO HAS_MPROTECT HAS_MSG HAS_MSG_CTRUNC
syn keyword xsMacro HAS_MSG_DONTROUTE HAS_MSG_OOB HAS_MSG_PEEK HAS_MSG_PROXY
-syn keyword xsMacro HAS_MSYNC HAS_MUNMAP HAS_NICE HAS_NL_LANGINFO HAS_OPEN3
-syn keyword xsMacro HAS_PASSWD HAS_PATHCONF HAS_PAUSE HAS_PIPE HAS_POLL
-syn keyword xsMacro HAS_PRCTL HAS_PRCTL_SET_NAME HAS_PROCSELFEXE
+syn keyword xsMacro HAS_MSYNC HAS_MUNMAP HAS_NAN HAS_NEARBYINT HAS_NEXTAFTER
+syn keyword xsMacro HAS_NEXTTOWARD HAS_NICE HAS_NL_LANGINFO HAS_NTOHL
+syn keyword xsMacro HAS_NTOHS HAS_OPEN3 HAS_PASSWD HAS_PATHCONF HAS_PAUSE
+syn keyword xsMacro HAS_PIPE HAS_POLL HAS_PRCTL HAS_PRCTL_SET_NAME
+syn keyword xsMacro HAS_PROCSELFEXE HAS_PTHREAD_ATFORK
syn keyword xsMacro HAS_PTHREAD_ATTR_SETSCOPE
-syn keyword xsMacro HAS_PTHREAD_UNCHECKED_GETSPECIFIC_NP HAS_READDIR
-syn keyword xsMacro HAS_READLINK HAS_READV HAS_RECVMSG HAS_RENAME
-syn keyword xsMacro HAS_REWINDDIR HAS_RMDIR HAS_SANE_MEMCMP HAS_SBRK_PROTO
-syn keyword xsMacro HAS_SCALBNL HAS_SCHED_YIELD HAS_SCM_RIGHTS HAS_SEEKDIR
-syn keyword xsMacro HAS_SELECT HAS_SEM HAS_SENDMSG HAS_SETEGID HAS_SETEUID
-syn keyword xsMacro HAS_SETGRENT HAS_SETGROUPS HAS_SETHOSTENT HAS_SETITIMER
-syn keyword xsMacro HAS_SETLINEBUF HAS_SETLOCALE HAS_SETNETENT HAS_SETPGID
-syn keyword xsMacro HAS_SETPGRP HAS_SETPRIORITY HAS_SETPROTOENT HAS_SETPWENT
-syn keyword xsMacro HAS_SETREGID HAS_SETRESGID HAS_SETRESUID HAS_SETREUID
-syn keyword xsMacro HAS_SETSERVENT HAS_SETSID HAS_SETVBUF HAS_SHM
-syn keyword xsMacro HAS_SHMAT_PROTOTYPE HAS_SIGACTION HAS_SIGNBIT
-syn keyword xsMacro HAS_SIGPROCMASK HAS_SIGSETJMP HAS_SIN6_SCOPE_ID
-syn keyword xsMacro HAS_SNPRINTF HAS_SOCKADDR_IN6 HAS_SOCKATMARK
-syn keyword xsMacro HAS_SOCKATMARK_PROTO HAS_SOCKET HAS_SQRTL
-syn keyword xsMacro HAS_STATIC_INLINE HAS_STRCHR HAS_STRCOLL HAS_STRFTIME
-syn keyword xsMacro HAS_STRTOD HAS_STRTOL HAS_STRTOLD HAS_STRTOLL HAS_STRTOQ
-syn keyword xsMacro HAS_STRTOUL HAS_STRTOULL HAS_STRTOUQ HAS_STRUCT_CMSGHDR
+syn keyword xsMacro HAS_PTHREAD_UNCHECKED_GETSPECIFIC_NP HAS_PTHREAD_YIELD
+syn keyword xsMacro HAS_PTRDIFF_T HAS_READDIR HAS_READLINK HAS_READV
+syn keyword xsMacro HAS_RECVMSG HAS_REGCOMP HAS_REMAINDER HAS_REMQUO
+syn keyword xsMacro HAS_RENAME HAS_REWINDDIR HAS_RINT HAS_RMDIR HAS_ROUND
+syn keyword xsMacro HAS_SANE_MEMCMP HAS_SBRK_PROTO HAS_SCALBN HAS_SCALBNL
+syn keyword xsMacro HAS_SCHED_YIELD HAS_SCM_RIGHTS HAS_SEEKDIR HAS_SELECT
+syn keyword xsMacro HAS_SEM HAS_SENDMSG HAS_SETEGID HAS_SETEUID HAS_SETGRENT
+syn keyword xsMacro HAS_SETGROUPS HAS_SETHOSTENT HAS_SETITIMER HAS_SETLINEBUF
+syn keyword xsMacro HAS_SETLOCALE HAS_SETNETENT HAS_SETPGID HAS_SETPGRP
+syn keyword xsMacro HAS_SETPRIORITY HAS_SETPROTOENT HAS_SETPWENT HAS_SETREGID
+syn keyword xsMacro HAS_SETRESGID HAS_SETRESUID HAS_SETREUID HAS_SETSERVENT
+syn keyword xsMacro HAS_SETSID HAS_SETVBUF HAS_SHM HAS_SHMAT_PROTOTYPE
+syn keyword xsMacro HAS_SIGACTION HAS_SIGNBIT HAS_SIGPROCMASK HAS_SIGSETJMP
+syn keyword xsMacro HAS_SIN6_SCOPE_ID HAS_SKIP_LOCALE_INIT HAS_SNPRINTF
+syn keyword xsMacro HAS_SOCKADDR_IN6 HAS_SOCKATMARK HAS_SOCKATMARK_PROTO
+syn keyword xsMacro HAS_SOCKET HAS_SQRTL HAS_STAT HAS_STATIC_INLINE
+syn keyword xsMacro HAS_STRCHR HAS_STRCOLL HAS_STRFTIME HAS_STRTOD HAS_STRTOL
+syn keyword xsMacro HAS_STRTOLD HAS_STRTOLL HAS_STRTOQ HAS_STRTOUL
+syn keyword xsMacro HAS_STRTOULL HAS_STRTOUQ HAS_STRUCT_CMSGHDR
syn keyword xsMacro HAS_STRUCT_MSGHDR HAS_STRUCT_STATFS
syn keyword xsMacro HAS_STRUCT_STATFS_F_FLAGS HAS_STRXFRM HAS_SYMLINK
syn keyword xsMacro HAS_SYSCALL HAS_SYSCALL_PROTO HAS_SYSCONF HAS_SYSTEM
syn keyword xsMacro HAS_SYS_ERRLIST HAS_TCGETPGRP HAS_TCSETPGRP HAS_TELLDIR
-syn keyword xsMacro HAS_TELLDIR_PROTO HAS_TIME HAS_TIMEGM HAS_TIMES
-syn keyword xsMacro HAS_TM_TM_GMTOFF HAS_TM_TM_ZONE HAS_TRUNCATE HAS_TZNAME
-syn keyword xsMacro HAS_UALARM HAS_UMASK HAS_UNAME HAS_UNSETENV HAS_USLEEP
-syn keyword xsMacro HAS_USLEEP_PROTO HAS_USTAT HAS_UTIME HAS_VPRINTF
-syn keyword xsMacro HAS_VSNPRINTF HAS_VTOHL HAS_VTOHS HAS_WAIT HAS_WAIT4
-syn keyword xsMacro HAS_WAITPID HAS_WCSTOMBS HAS_WCTOMB HAS_WRITEV
-syn keyword xsMacro HAVE_THREAD_INTERN HEK_BASESIZE HEK_FLAGS HEK_HASH
-syn keyword xsMacro HEK_KEY HEK_LEN HEK_REHASH HEK_REHASH_on HEK_UTF8
-syn keyword xsMacro HEK_UTF8_off HEK_UTF8_on HEK_WASUTF8 HEK_WASUTF8_off
-syn keyword xsMacro HEK_WASUTF8_on HEKf HEKf256 HEKfARG HE_SVSLOT HEf_SVKEY
-syn keyword xsMacro HINTS_REFCNT_INIT HINTS_REFCNT_LOCK HINTS_REFCNT_TERM
-syn keyword xsMacro HINTS_REFCNT_UNLOCK HINT_BLOCK_SCOPE HINT_BYTES
-syn keyword xsMacro HINT_EXPLICIT_STRICT_REFS HINT_EXPLICIT_STRICT_SUBS
-syn keyword xsMacro HINT_EXPLICIT_STRICT_VARS HINT_FEATURE_MASK
-syn keyword xsMacro HINT_FEATURE_SHIFT HINT_FILETEST_ACCESS HINT_INTEGER
-syn keyword xsMacro HINT_LEXICAL_IO_IN HINT_LEXICAL_IO_OUT HINT_LOCALE
-syn keyword xsMacro HINT_LOCALE_NOT_CHARS HINT_LOCALIZE_HH HINT_NEW_BINARY
-syn keyword xsMacro HINT_NEW_FLOAT HINT_NEW_INTEGER HINT_NEW_RE
-syn keyword xsMacro HINT_NEW_STRING HINT_NO_AMAGIC HINT_RE_EVAL HINT_RE_FLAGS
-syn keyword xsMacro HINT_RE_TAINT HINT_SORT_MERGESORT HINT_SORT_QUICKSORT
-syn keyword xsMacro HINT_SORT_SORT_BITS HINT_SORT_STABLE HINT_STRICT_REFS
-syn keyword xsMacro HINT_STRICT_SUBS HINT_STRICT_VARS HINT_UNI_8_BIT
-syn keyword xsMacro HINT_UTF8 HORIZWS HV_DELETE HV_DISABLE_UVAR_XKEY
+syn keyword xsMacro HAS_TELLDIR_PROTO HAS_TGAMMA HAS_TIME HAS_TIMEGM
+syn keyword xsMacro HAS_TIMES HAS_TM_TM_GMTOFF HAS_TM_TM_ZONE HAS_TRUNC
+syn keyword xsMacro HAS_TRUNCATE HAS_TRUNCL HAS_TZNAME HAS_UALARM HAS_UMASK
+syn keyword xsMacro HAS_UNAME HAS_UNSETENV HAS_USLEEP HAS_USLEEP_PROTO
+syn keyword xsMacro HAS_USTAT HAS_UTIME HAS_VPRINTF HAS_VSNPRINTF HAS_WAIT
+syn keyword xsMacro HAS_WAIT4 HAS_WAITPID HAS_WCSCMP HAS_WCSTOMBS HAS_WCSXFRM
+syn keyword xsMacro HAS_WCTOMB HAS_WRITEV HEK_BASESIZE HEK_FLAGS HEK_HASH
+syn keyword xsMacro HEK_KEY HEK_LEN HEK_UTF8 HEK_UTF8_off HEK_UTF8_on
+syn keyword xsMacro HEK_WASUTF8 HEK_WASUTF8_off HEK_WASUTF8_on HEKf HEKf256
+syn keyword xsMacro HEKfARG HE_SVSLOT HEf_SVKEY HINTS_REFCNT_INIT
+syn keyword xsMacro HINTS_REFCNT_LOCK HINTS_REFCNT_TERM HINTS_REFCNT_UNLOCK
+syn keyword xsMacro HINT_BLOCK_SCOPE HINT_BYTES HINT_EXPLICIT_STRICT_REFS
+syn keyword xsMacro HINT_EXPLICIT_STRICT_SUBS HINT_EXPLICIT_STRICT_VARS
+syn keyword xsMacro HINT_FEATURE_MASK HINT_FEATURE_SHIFT HINT_FILETEST_ACCESS
+syn keyword xsMacro HINT_INTEGER HINT_LEXICAL_IO_IN HINT_LEXICAL_IO_OUT
+syn keyword xsMacro HINT_LOCALE HINT_LOCALE_PARTIAL HINT_LOCALIZE_HH
+syn keyword xsMacro HINT_NEW_BINARY HINT_NEW_FLOAT HINT_NEW_INTEGER
+syn keyword xsMacro HINT_NEW_RE HINT_NEW_STRING HINT_NO_AMAGIC HINT_RE_EVAL
+syn keyword xsMacro HINT_RE_FLAGS HINT_RE_TAINT HINT_SORT_MERGESORT
+syn keyword xsMacro HINT_SORT_QUICKSORT HINT_SORT_SORT_BITS HINT_SORT_STABLE
+syn keyword xsMacro HINT_STRICT_REFS HINT_STRICT_SUBS HINT_STRICT_VARS
+syn keyword xsMacro HINT_UNI_8_BIT HINT_UTF8 HS_APIVERLEN_MAX HS_CXT
+syn keyword xsMacro HS_GETAPIVERLEN HS_GETINTERPSIZE HS_GETXSVERLEN HS_KEY
+syn keyword xsMacro HS_KEYp HS_XSVERLEN_MAX HSf_IMP_CXT HSf_NOCHK HSf_POPMARK
+syn keyword xsMacro HSf_SETXSUBFN HSm_APIVERLEN HSm_INTRPSIZE HSm_KEY_MATCH
+syn keyword xsMacro HSm_XSVERLEN HV_DELETE HV_DISABLE_UVAR_XKEY
syn keyword xsMacro HV_FETCH_EMPTY_HE HV_FETCH_ISEXISTS HV_FETCH_ISSTORE
syn keyword xsMacro HV_FETCH_JUST_SV HV_FETCH_LVALUE
syn keyword xsMacro HV_ITERNEXT_WANTPLACEHOLDERS HV_NAME_SETALL
syn keyword xsMacro HVhek_ENABLEHVKFLAGS HVhek_FREEKEY HVhek_KEYCANONICAL
-syn keyword xsMacro HVhek_MASK HVhek_PLACEHOLD HVhek_REHASH HVhek_UNSHARED
-syn keyword xsMacro HVhek_UTF8 HVhek_WASUTF8 HVrhek_IV HVrhek_PV
-syn keyword xsMacro HVrhek_PV_UTF8 HVrhek_UV HVrhek_delete HVrhek_typemask
-syn keyword xsMacro HVrhek_undef H_PERL HeHASH HeKEY HeKEY_hek HeKEY_sv
-syn keyword xsMacro HeKFLAGS HeKLEN HeKLEN_UTF8 HeKREHASH HeKUTF8 HeKWASUTF8
+syn keyword xsMacro HVhek_MASK HVhek_PLACEHOLD HVhek_UNSHARED HVhek_UTF8
+syn keyword xsMacro HVhek_WASUTF8 HVrhek_IV HVrhek_PV HVrhek_PV_UTF8
+syn keyword xsMacro HVrhek_UV HVrhek_delete HVrhek_typemask HVrhek_undef
+syn keyword xsMacro HYPHEN_UTF8 H_EBCDIC_TABLES H_PERL H_REGCHARCLASS
+syn keyword xsMacro H_UNICODE_CONSTANTS H_UTF8 HeHASH HeKEY HeKEY_hek
+syn keyword xsMacro HeKEY_sv HeKFLAGS HeKLEN HeKLEN_UTF8 HeKUTF8 HeKWASUTF8
syn keyword xsMacro HeNEXT HePV HeSVKEY HeSVKEY_force HeSVKEY_set HeUTF8
-syn keyword xsMacro HeVAL HvARRAY HvAUX HvEITER HvEITER_get HvEITER_set
-syn keyword xsMacro HvENAME HvENAMELEN HvENAMELEN_get HvENAMEUTF8 HvENAME_HEK
-syn keyword xsMacro HvENAME_HEK_NN HvENAME_get HvFILL HvHASKFLAGS
-syn keyword xsMacro HvHASKFLAGS_off HvHASKFLAGS_on HvKEYS HvLAZYDEL
-syn keyword xsMacro HvLAZYDEL_off HvLAZYDEL_on HvMAX HvMROMETA HvNAME
-syn keyword xsMacro HvNAMELEN HvNAMELEN_get HvNAMEUTF8 HvNAME_HEK
+syn keyword xsMacro HeVAL HvAMAGIC HvAMAGIC_off HvAMAGIC_on HvARRAY HvAUX
+syn keyword xsMacro HvAUXf_NO_DEREF HvAUXf_SCAN_STASH HvEITER HvEITER_get
+syn keyword xsMacro HvEITER_set HvENAME HvENAMELEN HvENAMELEN_get HvENAMEUTF8
+syn keyword xsMacro HvENAME_HEK HvENAME_HEK_NN HvENAME_get HvFILL HvHASKFLAGS
+syn keyword xsMacro HvHASKFLAGS_off HvHASKFLAGS_on HvKEYS HvLASTRAND_get
+syn keyword xsMacro HvLAZYDEL HvLAZYDEL_off HvLAZYDEL_on HvMAX HvMROMETA
+syn keyword xsMacro HvNAME HvNAMELEN HvNAMELEN_get HvNAMEUTF8 HvNAME_HEK
syn keyword xsMacro HvNAME_HEK_NN HvNAME_get HvPLACEHOLDERS
-syn keyword xsMacro HvPLACEHOLDERS_get HvPLACEHOLDERS_set HvREHASH
-syn keyword xsMacro HvREHASH_off HvREHASH_on HvRITER HvRITER_get HvRITER_set
-syn keyword xsMacro HvSHAREKEYS HvSHAREKEYS_off HvSHAREKEYS_on HvTOTALKEYS
-syn keyword xsMacro HvUSEDKEYS I16SIZE I16TYPE I16_MAX I16_MIN I286 I32SIZE
-syn keyword xsMacro I32TYPE I32_MAX I32_MAX_P1 I32_MIN I64SIZE I64TYPE I8SIZE
-syn keyword xsMacro I8TYPE I8_TO_NATIVE IF IFMATCH IFMATCH_A IFMATCH_A_fail
-syn keyword xsMacro IFTHEN IGNORE_PAT_MOD INIT INIT_THREADS
+syn keyword xsMacro HvPLACEHOLDERS_get HvPLACEHOLDERS_set HvRAND_get HvRITER
+syn keyword xsMacro HvRITER_get HvRITER_set HvSHAREKEYS HvSHAREKEYS_off
+syn keyword xsMacro HvSHAREKEYS_on HvTOTALKEYS HvUSEDKEYS I16SIZE I16TYPE
+syn keyword xsMacro I16_MAX I16_MIN I32SIZE I32TYPE I32_MAX I32_MAX_P1
+syn keyword xsMacro I32_MIN I64SIZE I64TYPE I8SIZE I8TYPE I8_TO_NATIVE
+syn keyword xsMacro I8_TO_NATIVE_UTF8 IF IFMATCH IFMATCH_A IFMATCH_A_fail
+syn keyword xsMacro IFTHEN IGNORE_PAT_MOD ILLEGAL_UTF8_BYTE INIT INIT_THREADS
syn keyword xsMacro INIT_TRACK_MEMPOOL INSUBP INT2PTR INT32_MIN INT64_C
-syn keyword xsMacro INT64_MIN INTSIZE INT_64_T INT_PAT_MODS
-syn keyword xsMacro INVERSION_UNAFFECTED_FLAGS IN_BYTES IN_LOCALE
+syn keyword xsMacro INT64_MIN INTSIZE INT_64_T INT_PAT_MODS IN_BYTES
+syn keyword xsMacro IN_ENCODING IN_LC IN_LC_ALL_COMPILETIME IN_LC_ALL_RUNTIME
+syn keyword xsMacro IN_LC_COMPILETIME IN_LC_PARTIAL_COMPILETIME
+syn keyword xsMacro IN_LC_PARTIAL_RUNTIME IN_LC_RUNTIME IN_LOCALE
syn keyword xsMacro IN_LOCALE_COMPILETIME IN_LOCALE_RUNTIME
syn keyword xsMacro IN_PERL_COMPILETIME IN_PERL_RUNTIME IN_SOME_LOCALE_FORM
syn keyword xsMacro IN_SOME_LOCALE_FORM_COMPILETIME
-syn keyword xsMacro IN_SOME_LOCALE_FORM_RUNTIME IN_UNI_8_BIT IOCPARM_LEN
-syn keyword xsMacro IOf_ARGV IOf_DIDTOP IOf_FAKE_DIRP IOf_FLUSH IOf_NOLINE
-syn keyword xsMacro IOf_START IOf_UNTAINT ISHISH IS_ANYOF_TRIE
+syn keyword xsMacro IN_SOME_LOCALE_FORM_RUNTIME IN_UNI_8_BIT
+syn keyword xsMacro IN_UTF8_CTYPE_LOCALE IOCPARM_LEN IOf_ARGV IOf_DIDTOP
+syn keyword xsMacro IOf_FAKE_DIRP IOf_FLUSH IOf_NOLINE IOf_START IOf_UNTAINT
+syn keyword xsMacro ISA_VERSION_OBJ IS_ANYOF_TRIE
syn keyword xsMacro IS_NUMBER_GREATER_THAN_UV_MAX IS_NUMBER_INFINITY
syn keyword xsMacro IS_NUMBER_IN_UV IS_NUMBER_NAN IS_NUMBER_NEG
-syn keyword xsMacro IS_NUMBER_NOT_INT IS_NUMERIC_RADIX IS_PADCONST IS_PADGV
-syn keyword xsMacro IS_TRIE_AC IS_UTF8_CHAR IS_UTF8_CHAR_1 IS_UTF8_CHAR_2
-syn keyword xsMacro IS_UTF8_CHAR_3 IS_UTF8_CHAR_3a IS_UTF8_CHAR_3b
-syn keyword xsMacro IS_UTF8_CHAR_3c IS_UTF8_CHAR_3d IS_UTF8_CHAR_4
-syn keyword xsMacro IS_UTF8_CHAR_4a IS_UTF8_CHAR_4b IS_UTF8_CHAR_4c
-syn keyword xsMacro IS_UTF8_CHAR_5 IS_UTF8_CHAR_5a IS_UTF8_CHAR_5b
-syn keyword xsMacro IS_UTF8_CHAR_FAST IVSIZE IVTYPE IV_DIG IV_MAX IV_MAX_P1
-syn keyword xsMacro IV_MIN I_32 I_ARPA_INET I_ASSERT I_CRYPT I_DBM I_DIRENT
-syn keyword xsMacro I_DLFCN I_FLOAT I_GDBM I_GDBMNDBM I_GRP I_INTTYPES
-syn keyword xsMacro I_LANGINFO I_LIMITS I_LOCALE I_MATH I_MNTENT I_NETDB
-syn keyword xsMacro I_NETINET_IN I_NETINET_TCP I_POLL I_PTHREAD I_PWD
-syn keyword xsMacro I_SHADOW I_STDARG I_STDBOOL I_STDDEF I_STDLIB I_STRING
+syn keyword xsMacro IS_NUMBER_NOT_INT IS_NUMBER_TRAILING IS_NUMERIC_RADIX
+syn keyword xsMacro IS_PADCONST IS_PADGV IS_SAFE_PATHNAME IS_SAFE_SYSCALL
+syn keyword xsMacro IS_TRIE_AC IS_UTF8_CHAR IS_UTF8_CHAR_FAST IVSIZE IVTYPE
+syn keyword xsMacro IV_DIG IV_MAX IV_MAX_P1 IV_MIN I_32 I_ARPA_INET I_ASSERT
+syn keyword xsMacro I_BFD I_CRYPT I_DBM I_DIRENT I_DLFCN I_EXECINFO I_FENV
+syn keyword xsMacro I_FLOAT I_GDBM I_GDBMNDBM I_GRP I_INTTYPES I_LANGINFO
+syn keyword xsMacro I_LIMITS I_LOCALE I_MATH I_MNTENT I_NETDB I_NETINET_IN
+syn keyword xsMacro I_NETINET_TCP I_POLL I_PTHREAD I_PWD I_QUADMATH I_SHADOW
+syn keyword xsMacro I_STDARG I_STDBOOL I_STDDEF I_STDINT I_STDLIB I_STRING
syn keyword xsMacro I_SYSLOG I_SYSUIO I_SYSUTSNAME I_SYS_DIR I_SYS_FILE
syn keyword xsMacro I_SYS_IOCTL I_SYS_MOUNT I_SYS_PARAM I_SYS_POLL
syn keyword xsMacro I_SYS_RESOURCE I_SYS_SELECT I_SYS_STAT I_SYS_STATFS
@@ -1372,12 +1528,12 @@ syn keyword xsMacro IoTYPE_NUMERIC IoTYPE_PIPE IoTYPE_RDONLY IoTYPE_RDWR
syn keyword xsMacro IoTYPE_SOCKET IoTYPE_STD IoTYPE_WRONLY IsSet
syn keyword xsMacro JMPENV_BOOTSTRAP JMPENV_JUMP JMPENV_POP JMPENV_PUSH JOIN
syn keyword xsMacro KEEPCOPY_PAT_MOD KEEPCOPY_PAT_MODS KEEPS KEEPS_next
-syn keyword xsMacro KEEPS_next_fail KEYWORD_PLUGIN_DECLINE
+syn keyword xsMacro KEEPS_next_fail KELVIN_SIGN KEYWORD_PLUGIN_DECLINE
syn keyword xsMacro KEYWORD_PLUGIN_EXPR KEYWORD_PLUGIN_STMT KEY_AUTOLOAD
-syn keyword xsMacro KEY_BEGIN KEY_CHECK KEY_CORE KEY_DESTROY KEY_END KEY_INIT
-syn keyword xsMacro KEY_NULL KEY_UNITCHECK KEY___DATA__ KEY___END__
-syn keyword xsMacro KEY___FILE__ KEY___LINE__ KEY___PACKAGE__ KEY___SUB__
-syn keyword xsMacro KEY_abs KEY_accept KEY_alarm KEY_and KEY_atan2 KEY_bind
+syn keyword xsMacro KEY_BEGIN KEY_CHECK KEY_DESTROY KEY_END KEY_INIT KEY_NULL
+syn keyword xsMacro KEY_UNITCHECK KEY___DATA__ KEY___END__ KEY___FILE__
+syn keyword xsMacro KEY___LINE__ KEY___PACKAGE__ KEY___SUB__ KEY_abs
+syn keyword xsMacro KEY_accept KEY_alarm KEY_and KEY_atan2 KEY_bind
syn keyword xsMacro KEY_binmode KEY_bless KEY_break KEY_caller KEY_chdir
syn keyword xsMacro KEY_chmod KEY_chomp KEY_chop KEY_chown KEY_chr KEY_chroot
syn keyword xsMacro KEY_close KEY_closedir KEY_cmp KEY_connect KEY_continue
@@ -1425,125 +1581,177 @@ syn keyword xsMacro KEY_uc KEY_ucfirst KEY_umask KEY_undef KEY_unless
syn keyword xsMacro KEY_unlink KEY_unpack KEY_unshift KEY_untie KEY_until
syn keyword xsMacro KEY_use KEY_utime KEY_values KEY_vec KEY_wait KEY_waitpid
syn keyword xsMacro KEY_wantarray KEY_warn KEY_when KEY_while KEY_write KEY_x
-syn keyword xsMacro KEY_xor KEY_y LABEL
+syn keyword xsMacro KEY_xor KEY_y LABEL LATIN1_TO_NATIVE
syn keyword xsMacro LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE
+syn keyword xsMacro LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE_NATIVE
syn keyword xsMacro LATIN_CAPITAL_LETTER_SHARP_S
+syn keyword xsMacro LATIN_CAPITAL_LETTER_SHARP_S_UTF8
syn keyword xsMacro LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS
syn keyword xsMacro LATIN_SMALL_LETTER_A_WITH_RING_ABOVE
+syn keyword xsMacro LATIN_SMALL_LETTER_A_WITH_RING_ABOVE_NATIVE
+syn keyword xsMacro LATIN_SMALL_LETTER_LONG_S LATIN_SMALL_LETTER_LONG_S_UTF8
syn keyword xsMacro LATIN_SMALL_LETTER_SHARP_S
-syn keyword xsMacro LATIN_SMALL_LETTER_Y_WITH_DIAERESIS LDBL_DIG LEAVE
-syn keyword xsMacro LEAVESUB LEAVE_SCOPE LEAVE_with_name LEX_DONT_CLOSE_RSFP
-syn keyword xsMacro LEX_EVALBYTES LEX_IGNORE_UTF8_HINTS LEX_KEEP_PREVIOUS
-syn keyword xsMacro LEX_NOTPARSING LEX_START_COPIED LEX_START_FLAGS
-syn keyword xsMacro LEX_START_SAME_FILTER LEX_STUFF_UTF8 LIBERAL
-syn keyword xsMacro LIBM_LIB_VERSION LIB_INVARG LIKELY LINKLIST LNBREAK LOCAL
-syn keyword xsMacro LOCALE_PAT_MOD LOCALE_PAT_MODS LOCALTIME_MAX
+syn keyword xsMacro LATIN_SMALL_LETTER_SHARP_S_NATIVE
+syn keyword xsMacro LATIN_SMALL_LETTER_Y_WITH_DIAERESIS
+syn keyword xsMacro LATIN_SMALL_LETTER_Y_WITH_DIAERESIS_NATIVE
+syn keyword xsMacro LATIN_SMALL_LIGATURE_LONG_S_T
+syn keyword xsMacro LATIN_SMALL_LIGATURE_LONG_S_T_UTF8
+syn keyword xsMacro LATIN_SMALL_LIGATURE_ST LATIN_SMALL_LIGATURE_ST_UTF8
+syn keyword xsMacro LDBL_DIG LEAVE LEAVESUB LEAVE_SCOPE LEAVE_with_name
+syn keyword xsMacro LEX_DONT_CLOSE_RSFP LEX_EVALBYTES LEX_IGNORE_UTF8_HINTS
+syn keyword xsMacro LEX_KEEP_PREVIOUS LEX_NOTPARSING LEX_START_COPIED
+syn keyword xsMacro LEX_START_FLAGS LEX_START_SAME_FILTER LEX_STUFF_UTF8
+syn keyword xsMacro LF_NATIVE LIBERAL LIBM_LIB_VERSION LIB_INVARG LIKELY
+syn keyword xsMacro LINKLIST LNBREAK LOADED_FILE_PROBE LOADING_FILE_PROBE
+syn keyword xsMacro LOCAL LOCALE_PAT_MOD LOCALE_PAT_MODS LOCALTIME_MAX
syn keyword xsMacro LOCALTIME_MIN LOCALTIME_R LOCALTIME_R_PROTO
-syn keyword xsMacro LOCAL_PATCH_COUNT LOCK_DOLLARZERO_MUTEX LOC_SED LOGICAL
-syn keyword xsMacro LONGJMP LONGLONGSIZE LONGSIZE LONG_DOUBLESIZE
-syn keyword xsMacro LONG_DOUBLE_EQUALS_DOUBLE LOOPEX LOOP_PAT_MODS LSEEKSIZE
-syn keyword xsMacro LSTOP LSTOPSUB LVRET L_R_TZSET LvFLAGS LvTARG LvTARGLEN
-syn keyword xsMacro LvTARGOFF LvTYPE MADPROP_IN_BASEOP MAD_NULL MAD_OP MAD_PV
-syn keyword xsMacro MAD_SV MALLOC_CHECK_TAINT MALLOC_CHECK_TAINT2
-syn keyword xsMacro MALLOC_CTL_H MALLOC_INIT MALLOC_OVERHEAD MALLOC_TERM
+syn keyword xsMacro LOCAL_PATCH_COUNT LOCK_DOLLARZERO_MUTEX
+syn keyword xsMacro LOCK_LC_NUMERIC_STANDARD LOCK_NUMERIC_STANDARD LOC_SED
+syn keyword xsMacro LOGICAL LONGDOUBLE_BIG_ENDIAN LONGDOUBLE_DOUBLEDOUBLE
+syn keyword xsMacro LONGDOUBLE_LITTLE_ENDIAN LONGDOUBLE_X86_80_BIT LONGJMP
+syn keyword xsMacro LONGLONGSIZE LONGSIZE LONG_DOUBLEKIND LONG_DOUBLESIZE
+syn keyword xsMacro LONG_DOUBLE_EQUALS_DOUBLE LONG_DOUBLE_IS_DOUBLE
+syn keyword xsMacro LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BIG_ENDIAN
+syn keyword xsMacro LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LITTLE_ENDIAN
+syn keyword xsMacro LONG_DOUBLE_IS_IEEE_754_128_BIT_BIG_ENDIAN
+syn keyword xsMacro LONG_DOUBLE_IS_IEEE_754_128_BIT_LITTLE_ENDIAN
+syn keyword xsMacro LONG_DOUBLE_IS_UNKNOWN_FORMAT
+syn keyword xsMacro LONG_DOUBLE_IS_X86_80_BIT_BIG_ENDIAN
+syn keyword xsMacro LONG_DOUBLE_IS_X86_80_BIT_LITTLE_ENDIAN LOOPEX
+syn keyword xsMacro LOOP_PAT_MODS LSEEKSIZE LSTOP LSTOPSUB LVRET L_R_TZSET
+syn keyword xsMacro LvFLAGS LvSTARGOFF LvTARG LvTARGLEN LvTARGOFF LvTYPE
+syn keyword xsMacro MALLOC_CHECK_TAINT MALLOC_CHECK_TAINT2 MALLOC_CTL_H
+syn keyword xsMacro MALLOC_INIT MALLOC_OVERHEAD MALLOC_TERM
syn keyword xsMacro MALLOC_TOO_LATE_FOR MARKPOINT MARKPOINT_next
syn keyword xsMacro MARKPOINT_next_fail MASK MATCHOP MAXARG MAXO MAXPATHLEN
syn keyword xsMacro MAXSYSFD MAX_CHARSET_NAME_LENGTH MAX_FEATURE_LEN
syn keyword xsMacro MAX_PORTABLE_UTF8_TWO_BYTE
-syn keyword xsMacro MAX_RECURSE_EVAL_NOCHANGE_DEPTH MAYBE_DEREF_GV
-syn keyword xsMacro MAYBE_DEREF_GV_flags MAYBE_DEREF_GV_nomg MBOL
-syn keyword xsMacro MEMBER_TO_FPTR MEM_ALIGNBYTES MEM_LOG_ALLOC MEM_LOG_FREE
-syn keyword xsMacro MEM_LOG_REALLOC MEM_SIZE MEM_SIZE_MAX MEM_WRAP_CHECK
-syn keyword xsMacro MEM_WRAP_CHECK_ MEM_WRAP_CHECK_1 MEM_WRAP_CHECK_2 MEOL
-syn keyword xsMacro METHOD MEXTEND MGf_COPY MGf_DUP MGf_GSKIP MGf_LOCAL
-syn keyword xsMacro MGf_MINMATCH MGf_REFCOUNTED MGf_TAINTEDDIR MICRO_SIGN
-syn keyword xsMacro MINMOD MJD_OFFSET_DEBUG MRO_GET_PRIVATE_DATA MSPAGAIN
-syn keyword xsMacro MULOP MULTICALL MULTILINE_PAT_MOD MULTIPLICITY MUTABLE_AV
-syn keyword xsMacro MUTABLE_CV MUTABLE_GV MUTABLE_HV MUTABLE_IO MUTABLE_PTR
-syn keyword xsMacro MUTABLE_SV MUTEX_DESTROY MUTEX_INIT
-syn keyword xsMacro MUTEX_INIT_CALLS_MALLOC MUTEX_INIT_NEEDS_MUTEX_ZEROED
-syn keyword xsMacro MUTEX_LOCK MUTEX_UNLOCK MY MYSUB MYSWAP MY_CXT_CLONE
-syn keyword xsMacro MY_CXT_INDEX MY_CXT_INIT MY_CXT_INIT_ARG
-syn keyword xsMacro MY_CXT_INIT_INTERP M_PAT_MODS M_VOID MgPV MgPV_const
-syn keyword xsMacro MgPV_nolen_const MgTAINTEDDIR MgTAINTEDDIR_off
-syn keyword xsMacro MgTAINTEDDIR_on Mkdir Move MoveD NALNUM NALNUMA NALNUML
-syn keyword xsMacro NALNUMU NATIVE8_TO_UNI NATIVE_IS_INVARIANT
-syn keyword xsMacro NATIVE_TO_ASCII NATIVE_TO_I8 NATIVE_TO_NEED NATIVE_TO_UNI
-syn keyword xsMacro NATIVE_TO_UTF NBOUND NBOUNDA NBOUNDL NBOUNDU
-syn keyword xsMacro NDBM_H_USES_PROTOTYPES NDIGIT NDIGITA NDIGITL
+syn keyword xsMacro MAX_PRINT_A_FOR_USE_ONLY_BY_REGCOMP_DOT_C
+syn keyword xsMacro MAX_RECURSE_EVAL_NOCHANGE_DEPTH MAX_UTF8_TWO_BYTE
+syn keyword xsMacro MAYBE_DEREF_GV MAYBE_DEREF_GV_flags MAYBE_DEREF_GV_nomg
+syn keyword xsMacro MBOL MB_CUR_MAX MDEREF_ACTION_MASK MDEREF_AV_gvav_aelem
+syn keyword xsMacro MDEREF_AV_gvsv_vivify_rv2av_aelem MDEREF_AV_padav_aelem
+syn keyword xsMacro MDEREF_AV_padsv_vivify_rv2av_aelem
+syn keyword xsMacro MDEREF_AV_pop_rv2av_aelem MDEREF_AV_vivify_rv2av_aelem
+syn keyword xsMacro MDEREF_FLAG_last MDEREF_HV_gvhv_helem
+syn keyword xsMacro MDEREF_HV_gvsv_vivify_rv2hv_helem MDEREF_HV_padhv_helem
+syn keyword xsMacro MDEREF_HV_padsv_vivify_rv2hv_helem
+syn keyword xsMacro MDEREF_HV_pop_rv2hv_helem MDEREF_HV_vivify_rv2hv_helem
+syn keyword xsMacro MDEREF_INDEX_MASK MDEREF_INDEX_const MDEREF_INDEX_gvsv
+syn keyword xsMacro MDEREF_INDEX_none MDEREF_INDEX_padsv MDEREF_MASK
+syn keyword xsMacro MDEREF_SHIFT MDEREF_reload MEMBER_TO_FPTR MEM_ALIGNBYTES
+syn keyword xsMacro MEM_LOG_ALLOC MEM_LOG_FREE MEM_LOG_REALLOC MEM_SIZE
+syn keyword xsMacro MEM_SIZE_MAX MEM_WRAP_CHECK MEM_WRAP_CHECK_
+syn keyword xsMacro MEM_WRAP_CHECK_1 MEM_WRAP_CHECK_2 MEOL METHOD MEXTEND
+syn keyword xsMacro MGf_BYTES MGf_COPY MGf_DUP MGf_GSKIP MGf_LOCAL
+syn keyword xsMacro MGf_MINMATCH MGf_PERSIST MGf_REFCOUNTED MGf_REQUIRE_GV
+syn keyword xsMacro MGf_TAINTEDDIR MICRO_SIGN MICRO_SIGN_NATIVE MINMOD
+syn keyword xsMacro MJD_OFFSET_DEBUG MRO_GET_PRIVATE_DATA MSPAGAIN MULOP
+syn keyword xsMacro MULTICALL MULTILINE_PAT_MOD MULTIPLICITY MURMUR_C1
+syn keyword xsMacro MURMUR_C2 MURMUR_C3 MURMUR_C4 MURMUR_C5 MURMUR_DOBLOCK
+syn keyword xsMacro MURMUR_DOBYTES MUTABLE_AV MUTABLE_CV MUTABLE_GV
+syn keyword xsMacro MUTABLE_HV MUTABLE_IO MUTABLE_PTR MUTABLE_SV
+syn keyword xsMacro MUTEX_DESTROY MUTEX_INIT MUTEX_INIT_NEEDS_MUTEX_ZEROED
+syn keyword xsMacro MUTEX_LOCK MUTEX_UNLOCK MY MY_CXT_CLONE MY_CXT_INDEX
+syn keyword xsMacro MY_CXT_INIT MY_CXT_INIT_ARG MY_CXT_INIT_INTERP M_PAT_MODS
+syn keyword xsMacro MgBYTEPOS MgBYTEPOS_set MgPV MgPV_const MgPV_nolen_const
+syn keyword xsMacro MgTAINTEDDIR MgTAINTEDDIR_off MgTAINTEDDIR_on Mkdir Move
+syn keyword xsMacro MoveD NAN_COMPARE_BROKEN NATIVE8_TO_UNI
+syn keyword xsMacro NATIVE_BYTE_IS_INVARIANT NATIVE_SKIP NATIVE_TO_ASCII
+syn keyword xsMacro NATIVE_TO_I8 NATIVE_TO_LATIN1 NATIVE_TO_UNI NATIVE_TO_UTF
+syn keyword xsMacro NATIVE_UTF8_TO_I8 NBOUND NBOUNDA NBOUNDL NBOUNDU
+syn keyword xsMacro NBSP_NATIVE NBSP_UTF8 NDBM_H_USES_PROTOTYPES NDEBUG
syn keyword xsMacro NEED_PTHREAD_INIT NEED_VA_COPY NEGATIVE_INDICES_VAR
-syn keyword xsMacro NETDB_R_OBSOLETE NEWSV NEXTOPER NEXT_LINE_CHAR NEXT_OFF
-syn keyword xsMacro NGROUPP NHORIZWS NOAMP NODE_ALIGN NODE_ALIGN_FILL
-syn keyword xsMacro NODE_STEP_B NODE_STEP_REGNODE NODE_SZ_STR NOLINE
-syn keyword xsMacro NONDESTRUCT_PAT_MOD NONDESTRUCT_PAT_MODS NOOP
+syn keyword xsMacro NETDB_R_OBSOLETE NEWSV NEW_VERSION NEXTOPER
+syn keyword xsMacro NEXT_LINE_CHAR NEXT_OFF NGROUPP NOAMP NOCAPTURE_PAT_MOD
+syn keyword xsMacro NOCAPTURE_PAT_MODS NODE_ALIGN NODE_ALIGN_FILL NODE_STEP_B
+syn keyword xsMacro NODE_STEP_REGNODE NODE_SZ_STR NOLINE NONDESTRUCT_PAT_MOD
+syn keyword xsMacro NONDESTRUCT_PAT_MODS
+syn keyword xsMacro NON_OTHER_COUNT_FOR_USE_ONLY_BY_REGCOMP_DOT_C NOOP
syn keyword xsMacro NORETURN_FUNCTION_END NORMAL NOTHING NOTOP NOT_IN_PAD
-syn keyword xsMacro NO_ENV_ARRAY_IN_MAIN NO_LOCALE
-syn keyword xsMacro NO_LOCALECONV_MON_THOUSANDS_SEP NREF NREFF NREFFA NREFFL
-syn keyword xsMacro NREFFU NSIG NSPACE NSPACEA NSPACEL NSPACEU NUM2PTR
-syn keyword xsMacro NVERTWS NVSIZE NVTYPE NV_DIG NV_EPSILON NV_INF
-syn keyword xsMacro NV_MANT_DIG NV_MAX NV_MAX_10_EXP NV_MIN NV_MIN_10_EXP
-syn keyword xsMacro NV_NAN NV_OVERFLOWS_INTEGERS_AT NV_PRESERVES_UV_BITS
+syn keyword xsMacro NOT_REACHED NO_ENV_ARRAY_IN_MAIN NO_LOCALE
+syn keyword xsMacro NO_LOCALECONV_MON_THOUSANDS_SEP NO_TAINT_SUPPORT NPOSIXA
+syn keyword xsMacro NPOSIXD NPOSIXL NPOSIXU NREF NREFF NREFFA NREFFL NREFFU
+syn keyword xsMacro NSIG NUM2PTR NUM_ANYOF_CODE_POINTS NVSIZE NVTYPE
+syn keyword xsMacro NV_BIG_ENDIAN NV_DIG NV_EPSILON NV_INF NV_LITTLE_ENDIAN
+syn keyword xsMacro NV_MANT_DIG NV_MAX NV_MAX_10_EXP NV_MAX_EXP NV_MIN
+syn keyword xsMacro NV_MIN_10_EXP NV_MIN_EXP NV_MIX_ENDIAN NV_NAN
+syn keyword xsMacro NV_OVERFLOWS_INTEGERS_AT NV_PRESERVES_UV_BITS
syn keyword xsMacro NV_WITHIN_IV NV_WITHIN_UV New NewOp NewOpSz Newc Newx
syn keyword xsMacro Newxc Newxz Newz NofAMmeth Null Nullav Nullch Nullcv
syn keyword xsMacro Nullfp Nullgv Nullhe Nullhek Nullhv Nullop Nullsv OASHIFT
-syn keyword xsMacro OCSHIFT ONCE_PAT_MOD ONCE_PAT_MODS OPEN OPERAND OPFAIL
+syn keyword xsMacro OCSHIFT OCTAL_VALUE OFFUNISKIP ONCE_PAT_MOD ONCE_PAT_MODS
+syn keyword xsMacro OPEN OPERAND OPFAIL OPSLOT_HEADER OPSLOT_HEADER_P
syn keyword xsMacro OPTIMIZED OP_BINARY OP_CHECK_MUTEX_INIT
syn keyword xsMacro OP_CHECK_MUTEX_LOCK OP_CHECK_MUTEX_TERM
-syn keyword xsMacro OP_CHECK_MUTEX_UNLOCK OP_CLASS OP_DESC OP_GIMME
-syn keyword xsMacro OP_GIMME_REVERSE OP_IS_DIRHOP OP_IS_FILETEST
-syn keyword xsMacro OP_IS_FILETEST_ACCESS OP_IS_NUMCOMPARE OP_IS_SOCKET
-syn keyword xsMacro OP_LVALUE_NO_CROAK OP_MEM_TO_REG OP_NAME OP_REFCNT_INIT
-syn keyword xsMacro OP_REFCNT_LOCK OP_REFCNT_TERM OP_REFCNT_UNLOCK
-syn keyword xsMacro OP_REG_TO_MEM OROP OROR OSNAME OSVERS O_CREAT O_RDONLY
-syn keyword xsMacro O_RDWR O_TEXT O_WRONLY Off Off_t_size OpREFCNT_dec
-syn keyword xsMacro OpREFCNT_inc OpREFCNT_set OutCopFILE PAD_BASE_SV
-syn keyword xsMacro PAD_CLONE_VARS PAD_COMPNAME_FLAGS
+syn keyword xsMacro OP_CHECK_MUTEX_UNLOCK OP_CLASS OP_DESC OP_ENTRY_PROBE
+syn keyword xsMacro OP_FREED OP_GIMME OP_GIMME_REVERSE OP_IS_DIRHOP
+syn keyword xsMacro OP_IS_FILETEST OP_IS_FILETEST_ACCESS OP_IS_INFIX_BIT
+syn keyword xsMacro OP_IS_NUMCOMPARE OP_IS_SOCKET OP_LVALUE_NO_CROAK OP_NAME
+syn keyword xsMacro OP_REFCNT_INIT OP_REFCNT_LOCK OP_REFCNT_TERM
+syn keyword xsMacro OP_REFCNT_UNLOCK OP_SIBLING OP_TYPE_IS OP_TYPE_ISNT
+syn keyword xsMacro OP_TYPE_ISNT_AND_WASNT OP_TYPE_ISNT_AND_WASNT_NN
+syn keyword xsMacro OP_TYPE_ISNT_NN OP_TYPE_IS_NN OP_TYPE_IS_OR_WAS
+syn keyword xsMacro OP_TYPE_IS_OR_WAS_NN OROP OROR OSNAME OSVERS O_CREAT
+syn keyword xsMacro O_RDONLY O_RDWR O_TEXT O_WRONLY Off Off_t_size
+syn keyword xsMacro OpHAS_SIBLING OpLASTSIB_set OpMAYBESIB_set OpMORESIB_set
+syn keyword xsMacro OpREFCNT_dec OpREFCNT_inc OpREFCNT_set OpSIBLING OpSLAB
+syn keyword xsMacro OpSLOT OpslabREFCNT_dec OpslabREFCNT_dec_padok OutCopFILE
+syn keyword xsMacro PADNAME_FROM_PV PADNAMEt_LVALUE PADNAMEt_OUR
+syn keyword xsMacro PADNAMEt_OUTER PADNAMEt_STATE PADNAMEt_TYPED PAD_BASE_SV
+syn keyword xsMacro PAD_CLONE_VARS PAD_COMPNAME PAD_COMPNAME_FLAGS
syn keyword xsMacro PAD_COMPNAME_FLAGS_isOUR PAD_COMPNAME_GEN
syn keyword xsMacro PAD_COMPNAME_GEN_set PAD_COMPNAME_OURSTASH
syn keyword xsMacro PAD_COMPNAME_PV PAD_COMPNAME_SV PAD_COMPNAME_TYPE
syn keyword xsMacro PAD_FAKELEX_ANON PAD_FAKELEX_MULTI PAD_RESTORE_LOCAL
syn keyword xsMacro PAD_SAVE_LOCAL PAD_SAVE_SETNULLPAD PAD_SETSV PAD_SET_CUR
syn keyword xsMacro PAD_SET_CUR_NOSAVE PAD_SV PAD_SVl PARENT_FAKELEX_FLAGS
-syn keyword xsMacro PARENT_PAD_INDEX PARSE_OPTIONAL PATCHLEVEL PEG PERLDB_ALL
-syn keyword xsMacro PERLDB_GOTO PERLDB_INTER PERLDB_LINE PERLDB_NAMEANON
-syn keyword xsMacro PERLDB_NAMEEVAL PERLDB_NOOPT PERLDB_SAVESRC
-syn keyword xsMacro PERLDB_SAVESRC_INVALID PERLDB_SAVESRC_NOSUBS
-syn keyword xsMacro PERLDB_SINGLE PERLDB_SUB PERLDB_SUBLINE PERLDB_SUB_NN
-syn keyword xsMacro PERLDBf_GOTO PERLDBf_INTER PERLDBf_LINE PERLDBf_NAMEANON
-syn keyword xsMacro PERLDBf_NAMEEVAL PERLDBf_NONAME PERLDBf_NOOPT
-syn keyword xsMacro PERLDBf_SAVESRC PERLDBf_SAVESRC_INVALID
-syn keyword xsMacro PERLDBf_SAVESRC_NOSUBS PERLDBf_SINGLE PERLDBf_SUB
-syn keyword xsMacro PERLDBf_SUBLINE PERLIOBUF_DEFAULT_BUFSIZ PERLIO_DUP_CLONE
-syn keyword xsMacro PERLIO_DUP_FD PERLIO_FUNCS_CAST PERLIO_FUNCS_CONST
-syn keyword xsMacro PERLIO_FUNCS_DECL PERLIO_F_APPEND PERLIO_F_CANREAD
-syn keyword xsMacro PERLIO_F_CANWRITE PERLIO_F_CLEARED PERLIO_F_CRLF
-syn keyword xsMacro PERLIO_F_EOF PERLIO_F_ERROR PERLIO_F_FASTGETS
-syn keyword xsMacro PERLIO_F_LINEBUF PERLIO_F_NOTREG PERLIO_F_OPEN
-syn keyword xsMacro PERLIO_F_RDBUF PERLIO_F_TEMP PERLIO_F_TRUNCATE
-syn keyword xsMacro PERLIO_F_TTY PERLIO_F_UNBUF PERLIO_F_UTF8 PERLIO_F_WRBUF
-syn keyword xsMacro PERLIO_INIT PERLIO_IS_STDIO PERLIO_K_BUFFERED
-syn keyword xsMacro PERLIO_K_CANCRLF PERLIO_K_DESTRUCT PERLIO_K_DUMMY
-syn keyword xsMacro PERLIO_K_FASTGETS PERLIO_K_MULTIARG PERLIO_K_RAW
-syn keyword xsMacro PERLIO_K_UTF8 PERLIO_LAYERS PERLIO_NOT_STDIO
-syn keyword xsMacro PERLIO_STDTEXT PERLIO_TERM PERLIO_USING_CRLF
-syn keyword xsMacro PERLSI_DESTROY PERLSI_DIEHOOK PERLSI_MAGIC PERLSI_MAIN
-syn keyword xsMacro PERLSI_OVERLOAD PERLSI_REQUIRE PERLSI_SIGNAL PERLSI_SORT
-syn keyword xsMacro PERLSI_UNDEF PERLSI_UNKNOWN PERLSI_WARNHOOK PERL_ABS
-syn keyword xsMacro PERL_ALLOC_CHECK PERL_API_REVISION PERL_API_SUBVERSION
-syn keyword xsMacro PERL_API_VERSION PERL_API_VERSION_STRING
-syn keyword xsMacro PERL_ARENA_ROOTS_SIZE PERL_ARENA_SIZE
-syn keyword xsMacro PERL_ARGS_ASSERT_ADD_ALTERNATE PERL_ARGS_ASSERT_ADD_DATA
+syn keyword xsMacro PARENT_PAD_INDEX PARSE_OPTIONAL PASS1 PASS2 PATCHLEVEL
+syn keyword xsMacro PERLDB_ALL PERLDB_GOTO PERLDB_INTER PERLDB_LINE
+syn keyword xsMacro PERLDB_NAMEANON PERLDB_NAMEEVAL PERLDB_NOOPT
+syn keyword xsMacro PERLDB_SAVESRC PERLDB_SAVESRC_INVALID
+syn keyword xsMacro PERLDB_SAVESRC_NOSUBS PERLDB_SINGLE PERLDB_SUB
+syn keyword xsMacro PERLDB_SUBLINE PERLDB_SUB_NN PERLDBf_GOTO PERLDBf_INTER
+syn keyword xsMacro PERLDBf_LINE PERLDBf_NAMEANON PERLDBf_NAMEEVAL
+syn keyword xsMacro PERLDBf_NONAME PERLDBf_NOOPT PERLDBf_SAVESRC
+syn keyword xsMacro PERLDBf_SAVESRC_INVALID PERLDBf_SAVESRC_NOSUBS
+syn keyword xsMacro PERLDBf_SINGLE PERLDBf_SUB PERLDBf_SUBLINE
+syn keyword xsMacro PERLIOBUF_DEFAULT_BUFSIZ PERLIO_DUP_CLONE PERLIO_DUP_FD
+syn keyword xsMacro PERLIO_FUNCS_CAST PERLIO_FUNCS_CONST PERLIO_FUNCS_DECL
+syn keyword xsMacro PERLIO_F_APPEND PERLIO_F_CANREAD PERLIO_F_CANWRITE
+syn keyword xsMacro PERLIO_F_CLEARED PERLIO_F_CRLF PERLIO_F_EOF
+syn keyword xsMacro PERLIO_F_ERROR PERLIO_F_FASTGETS PERLIO_F_LINEBUF
+syn keyword xsMacro PERLIO_F_NOTREG PERLIO_F_OPEN PERLIO_F_RDBUF
+syn keyword xsMacro PERLIO_F_TEMP PERLIO_F_TRUNCATE PERLIO_F_TTY
+syn keyword xsMacro PERLIO_F_UNBUF PERLIO_F_UTF8 PERLIO_F_WRBUF PERLIO_INIT
+syn keyword xsMacro PERLIO_IS_STDIO PERLIO_K_BUFFERED PERLIO_K_CANCRLF
+syn keyword xsMacro PERLIO_K_DESTRUCT PERLIO_K_DUMMY PERLIO_K_FASTGETS
+syn keyword xsMacro PERLIO_K_MULTIARG PERLIO_K_RAW PERLIO_K_UTF8
+syn keyword xsMacro PERLIO_LAYERS PERLIO_NOT_STDIO PERLIO_STDTEXT PERLIO_TERM
+syn keyword xsMacro PERLIO_USING_CRLF PERLSI_DESTROY PERLSI_DIEHOOK
+syn keyword xsMacro PERLSI_MAGIC PERLSI_MAIN PERLSI_OVERLOAD PERLSI_REQUIRE
+syn keyword xsMacro PERLSI_SIGNAL PERLSI_SORT PERLSI_UNDEF PERLSI_UNKNOWN
+syn keyword xsMacro PERLSI_WARNHOOK PERL_ABS PERL_ALLOC_CHECK PERL_ANY_COW
+syn keyword xsMacro PERL_API_REVISION PERL_API_SUBVERSION PERL_API_VERSION
+syn keyword xsMacro PERL_API_VERSION_STRING PERL_ARENA_ROOTS_SIZE
+syn keyword xsMacro PERL_ARENA_SIZE PERL_ARGS_ASSERT_ADD_ABOVE_LATIN1_FOLDS
+syn keyword xsMacro PERL_ARGS_ASSERT_ADD_DATA
+syn keyword xsMacro PERL_ARGS_ASSERT_ADD_MULTI_MATCH
syn keyword xsMacro PERL_ARGS_ASSERT_ADD_UTF16_TEXTFILTER
-syn keyword xsMacro PERL_ARGS_ASSERT_ADJUST_STACK_ON_LEAVE
-syn keyword xsMacro PERL_ARGS_ASSERT_ALLOCMY PERL_ARGS_ASSERT_AMAGIC_CALL
-syn keyword xsMacro PERL_ARGS_ASSERT_AMAGIC_CMP
+syn keyword xsMacro PERL_ARGS_ASSERT_ADJUST_SIZE_AND_FIND_BUCKET
+syn keyword xsMacro PERL_ARGS_ASSERT_ADVANCE_ONE_SB
+syn keyword xsMacro PERL_ARGS_ASSERT_ADVANCE_ONE_WB
+syn keyword xsMacro PERL_ARGS_ASSERT_ALLOCCOPSTASH PERL_ARGS_ASSERT_ALLOCMY
+syn keyword xsMacro PERL_ARGS_ASSERT_ALLOC_MAYBE_POPULATE_EXACT
+syn keyword xsMacro PERL_ARGS_ASSERT_AMAGIC_CALL PERL_ARGS_ASSERT_AMAGIC_CMP
syn keyword xsMacro PERL_ARGS_ASSERT_AMAGIC_CMP_LOCALE
syn keyword xsMacro PERL_ARGS_ASSERT_AMAGIC_DEREF_CALL
syn keyword xsMacro PERL_ARGS_ASSERT_AMAGIC_I_NCMP
syn keyword xsMacro PERL_ARGS_ASSERT_AMAGIC_NCMP
syn keyword xsMacro PERL_ARGS_ASSERT_ANONYMISE_CV_MAYBE
-syn keyword xsMacro PERL_ARGS_ASSERT_ANY_DUP PERL_ARGS_ASSERT_APPLY
-syn keyword xsMacro PERL_ARGS_ASSERT_APPLY_ATTRS
+syn keyword xsMacro PERL_ARGS_ASSERT_ANY_DUP
+syn keyword xsMacro PERL_ARGS_ASSERT_APPEND_UTF8_FROM_NATIVE_BYTE
+syn keyword xsMacro PERL_ARGS_ASSERT_APPLY PERL_ARGS_ASSERT_APPLY_ATTRS
syn keyword xsMacro PERL_ARGS_ASSERT_APPLY_ATTRS_MY
syn keyword xsMacro PERL_ARGS_ASSERT_APPLY_ATTRS_STRING
syn keyword xsMacro PERL_ARGS_ASSERT_ASSERT_UFT8_CACHE_COHERENT
@@ -1551,82 +1759,92 @@ syn keyword xsMacro PERL_ARGS_ASSERT_AV_ARYLEN_P PERL_ARGS_ASSERT_AV_CLEAR
syn keyword xsMacro PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH
syn keyword xsMacro PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE
syn keyword xsMacro PERL_ARGS_ASSERT_AV_DELETE PERL_ARGS_ASSERT_AV_EXISTS
-syn keyword xsMacro PERL_ARGS_ASSERT_AV_EXTEND PERL_ARGS_ASSERT_AV_FETCH
+syn keyword xsMacro PERL_ARGS_ASSERT_AV_EXTEND
+syn keyword xsMacro PERL_ARGS_ASSERT_AV_EXTEND_GUTS PERL_ARGS_ASSERT_AV_FETCH
syn keyword xsMacro PERL_ARGS_ASSERT_AV_FILL PERL_ARGS_ASSERT_AV_ITER_P
syn keyword xsMacro PERL_ARGS_ASSERT_AV_LEN PERL_ARGS_ASSERT_AV_MAKE
syn keyword xsMacro PERL_ARGS_ASSERT_AV_POP PERL_ARGS_ASSERT_AV_PUSH
syn keyword xsMacro PERL_ARGS_ASSERT_AV_REIFY PERL_ARGS_ASSERT_AV_SHIFT
-syn keyword xsMacro PERL_ARGS_ASSERT_AV_STORE PERL_ARGS_ASSERT_AV_UNDEF
-syn keyword xsMacro PERL_ARGS_ASSERT_AV_UNSHIFT PERL_ARGS_ASSERT_BAD_TYPE_PV
-syn keyword xsMacro PERL_ARGS_ASSERT_BAD_TYPE_SV PERL_ARGS_ASSERT_BIND_MATCH
+syn keyword xsMacro PERL_ARGS_ASSERT_AV_STORE PERL_ARGS_ASSERT_AV_TOP_INDEX
+syn keyword xsMacro PERL_ARGS_ASSERT_AV_UNDEF PERL_ARGS_ASSERT_AV_UNSHIFT
+syn keyword xsMacro PERL_ARGS_ASSERT_BACKUP_ONE_SB
+syn keyword xsMacro PERL_ARGS_ASSERT_BACKUP_ONE_WB
+syn keyword xsMacro PERL_ARGS_ASSERT_BAD_TYPE_GV PERL_ARGS_ASSERT_BAD_TYPE_PV
+syn keyword xsMacro PERL_ARGS_ASSERT_BIND_MATCH
syn keyword xsMacro PERL_ARGS_ASSERT_BLOCKHOOK_REGISTER
syn keyword xsMacro PERL_ARGS_ASSERT_BYTES_CMP_UTF8
syn keyword xsMacro PERL_ARGS_ASSERT_BYTES_FROM_UTF8
-syn keyword xsMacro PERL_ARGS_ASSERT_BYTES_TO_UNI
syn keyword xsMacro PERL_ARGS_ASSERT_BYTES_TO_UTF8 PERL_ARGS_ASSERT_CALL_ARGV
syn keyword xsMacro PERL_ARGS_ASSERT_CALL_LIST PERL_ARGS_ASSERT_CALL_METHOD
syn keyword xsMacro PERL_ARGS_ASSERT_CALL_PV PERL_ARGS_ASSERT_CALL_SV
syn keyword xsMacro PERL_ARGS_ASSERT_CANDO PERL_ARGS_ASSERT_CHECKCOMMA
-syn keyword xsMacro PERL_ARGS_ASSERT_CHECKPOSIXCC
syn keyword xsMacro PERL_ARGS_ASSERT_CHECK_LOCALE_BOUNDARY_CROSSING
syn keyword xsMacro PERL_ARGS_ASSERT_CHECK_TYPE_AND_OPEN
syn keyword xsMacro PERL_ARGS_ASSERT_CHECK_UTF8_PRINT
-syn keyword xsMacro PERL_ARGS_ASSERT_CK_ANONCODE PERL_ARGS_ASSERT_CK_BITOP
-syn keyword xsMacro PERL_ARGS_ASSERT_CK_CHDIR PERL_ARGS_ASSERT_CK_CMP
+syn keyword xsMacro PERL_ARGS_ASSERT_CK_ANONCODE PERL_ARGS_ASSERT_CK_BACKTICK
+syn keyword xsMacro PERL_ARGS_ASSERT_CK_BITOP PERL_ARGS_ASSERT_CK_CMP
syn keyword xsMacro PERL_ARGS_ASSERT_CK_CONCAT PERL_ARGS_ASSERT_CK_DEFINED
-syn keyword xsMacro PERL_ARGS_ASSERT_CK_DELETE PERL_ARGS_ASSERT_CK_DIE
-syn keyword xsMacro PERL_ARGS_ASSERT_CK_EACH
+syn keyword xsMacro PERL_ARGS_ASSERT_CK_DELETE PERL_ARGS_ASSERT_CK_EACH
syn keyword xsMacro PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_CORE
syn keyword xsMacro PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_LIST
syn keyword xsMacro PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_PROTO
syn keyword xsMacro PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_PROTO_OR_LIST
syn keyword xsMacro PERL_ARGS_ASSERT_CK_EOF PERL_ARGS_ASSERT_CK_EVAL
syn keyword xsMacro PERL_ARGS_ASSERT_CK_EXEC PERL_ARGS_ASSERT_CK_EXISTS
-syn keyword xsMacro PERL_ARGS_ASSERT_CK_EXIT PERL_ARGS_ASSERT_CK_FTST
-syn keyword xsMacro PERL_ARGS_ASSERT_CK_FUN PERL_ARGS_ASSERT_CK_GLOB
-syn keyword xsMacro PERL_ARGS_ASSERT_CK_GREP PERL_ARGS_ASSERT_CK_INDEX
-syn keyword xsMacro PERL_ARGS_ASSERT_CK_JOIN PERL_ARGS_ASSERT_CK_LENGTH
-syn keyword xsMacro PERL_ARGS_ASSERT_CK_LFUN PERL_ARGS_ASSERT_CK_LISTIOB
-syn keyword xsMacro PERL_ARGS_ASSERT_CK_MATCH PERL_ARGS_ASSERT_CK_METHOD
-syn keyword xsMacro PERL_ARGS_ASSERT_CK_NULL PERL_ARGS_ASSERT_CK_OPEN
-syn keyword xsMacro PERL_ARGS_ASSERT_CK_READLINE PERL_ARGS_ASSERT_CK_REPEAT
+syn keyword xsMacro PERL_ARGS_ASSERT_CK_FTST PERL_ARGS_ASSERT_CK_FUN
+syn keyword xsMacro PERL_ARGS_ASSERT_CK_GLOB PERL_ARGS_ASSERT_CK_GREP
+syn keyword xsMacro PERL_ARGS_ASSERT_CK_INDEX PERL_ARGS_ASSERT_CK_JOIN
+syn keyword xsMacro PERL_ARGS_ASSERT_CK_LENGTH PERL_ARGS_ASSERT_CK_LFUN
+syn keyword xsMacro PERL_ARGS_ASSERT_CK_LISTIOB PERL_ARGS_ASSERT_CK_MATCH
+syn keyword xsMacro PERL_ARGS_ASSERT_CK_METHOD PERL_ARGS_ASSERT_CK_NULL
+syn keyword xsMacro PERL_ARGS_ASSERT_CK_OPEN PERL_ARGS_ASSERT_CK_PROTOTYPE
+syn keyword xsMacro PERL_ARGS_ASSERT_CK_READLINE
+syn keyword xsMacro PERL_ARGS_ASSERT_CK_REFASSIGN PERL_ARGS_ASSERT_CK_REPEAT
syn keyword xsMacro PERL_ARGS_ASSERT_CK_REQUIRE PERL_ARGS_ASSERT_CK_RETURN
syn keyword xsMacro PERL_ARGS_ASSERT_CK_RFUN PERL_ARGS_ASSERT_CK_RVCONST
syn keyword xsMacro PERL_ARGS_ASSERT_CK_SASSIGN PERL_ARGS_ASSERT_CK_SELECT
syn keyword xsMacro PERL_ARGS_ASSERT_CK_SHIFT PERL_ARGS_ASSERT_CK_SMARTMATCH
syn keyword xsMacro PERL_ARGS_ASSERT_CK_SORT PERL_ARGS_ASSERT_CK_SPAIR
-syn keyword xsMacro PERL_ARGS_ASSERT_CK_SPLIT PERL_ARGS_ASSERT_CK_SUBR
-syn keyword xsMacro PERL_ARGS_ASSERT_CK_SUBSTR PERL_ARGS_ASSERT_CK_SVCONST
-syn keyword xsMacro PERL_ARGS_ASSERT_CK_TELL PERL_ARGS_ASSERT_CK_TRUNC
-syn keyword xsMacro PERL_ARGS_ASSERT_CK_WARNER PERL_ARGS_ASSERT_CK_WARNER_D
+syn keyword xsMacro PERL_ARGS_ASSERT_CK_SPLIT PERL_ARGS_ASSERT_CK_STRINGIFY
+syn keyword xsMacro PERL_ARGS_ASSERT_CK_SUBR PERL_ARGS_ASSERT_CK_SUBSTR
+syn keyword xsMacro PERL_ARGS_ASSERT_CK_SVCONST PERL_ARGS_ASSERT_CK_TELL
+syn keyword xsMacro PERL_ARGS_ASSERT_CK_TRUNC PERL_ARGS_ASSERT_CK_WARNER
+syn keyword xsMacro PERL_ARGS_ASSERT_CK_WARNER_D
syn keyword xsMacro PERL_ARGS_ASSERT_CLEAR_PLACEHOLDERS
+syn keyword xsMacro PERL_ARGS_ASSERT_CLEAR_SPECIAL_BLOCKS
syn keyword xsMacro PERL_ARGS_ASSERT_CLONE_PARAMS_DEL
syn keyword xsMacro PERL_ARGS_ASSERT_CLONE_PARAMS_NEW
-syn keyword xsMacro PERL_ARGS_ASSERT_CLOSEST_COP PERL_ARGS_ASSERT_CL_AND
-syn keyword xsMacro PERL_ARGS_ASSERT_CL_ANYTHING PERL_ARGS_ASSERT_CL_INIT
-syn keyword xsMacro PERL_ARGS_ASSERT_CL_IS_ANYTHING PERL_ARGS_ASSERT_CL_OR
+syn keyword xsMacro PERL_ARGS_ASSERT_CLOSEST_COP
+syn keyword xsMacro PERL_ARGS_ASSERT_COMPUTE_EXACTISH
+syn keyword xsMacro PERL_ARGS_ASSERT_CONSTRUCT_AHOCORASICK_FROM_TRIE
syn keyword xsMacro PERL_ARGS_ASSERT_COP_FETCH_LABEL
syn keyword xsMacro PERL_ARGS_ASSERT_COP_FREE
syn keyword xsMacro PERL_ARGS_ASSERT_COP_STORE_LABEL
syn keyword xsMacro PERL_ARGS_ASSERT_CORESUB_OP
syn keyword xsMacro PERL_ARGS_ASSERT_CORE_PROTOTYPE
-syn keyword xsMacro PERL_ARGS_ASSERT_CORE_REGCLASS_SWASH
+syn keyword xsMacro PERL_ARGS_ASSERT_COULD_IT_BE_A_POSIX_CLASS
syn keyword xsMacro PERL_ARGS_ASSERT_CROAK_SV PERL_ARGS_ASSERT_CROAK_XS_USAGE
syn keyword xsMacro PERL_ARGS_ASSERT_CURSE PERL_ARGS_ASSERT_CUSTOM_OP_DESC
+syn keyword xsMacro PERL_ARGS_ASSERT_CUSTOM_OP_GET_FIELD
syn keyword xsMacro PERL_ARGS_ASSERT_CUSTOM_OP_NAME
syn keyword xsMacro PERL_ARGS_ASSERT_CUSTOM_OP_REGISTER
-syn keyword xsMacro PERL_ARGS_ASSERT_CUSTOM_OP_XOP PERL_ARGS_ASSERT_CVGV_SET
+syn keyword xsMacro PERL_ARGS_ASSERT_CVGV_FROM_HEK PERL_ARGS_ASSERT_CVGV_SET
syn keyword xsMacro PERL_ARGS_ASSERT_CVSTASH_SET
syn keyword xsMacro PERL_ARGS_ASSERT_CV_CKPROTO_LEN_FLAGS
-syn keyword xsMacro PERL_ARGS_ASSERT_CV_CLONE PERL_ARGS_ASSERT_CV_DUMP
+syn keyword xsMacro PERL_ARGS_ASSERT_CV_CLONE PERL_ARGS_ASSERT_CV_CLONE_INTO
+syn keyword xsMacro PERL_ARGS_ASSERT_CV_DUMP
syn keyword xsMacro PERL_ARGS_ASSERT_CV_GET_CALL_CHECKER
+syn keyword xsMacro PERL_ARGS_ASSERT_CV_NAME
syn keyword xsMacro PERL_ARGS_ASSERT_CV_SET_CALL_CHECKER
-syn keyword xsMacro PERL_ARGS_ASSERT_CV_UNDEF PERL_ARGS_ASSERT_CX_DUMP
-syn keyword xsMacro PERL_ARGS_ASSERT_CX_DUP PERL_ARGS_ASSERT_DEB
-syn keyword xsMacro PERL_ARGS_ASSERT_DEBOP PERL_ARGS_ASSERT_DEBPROF
+syn keyword xsMacro PERL_ARGS_ASSERT_CV_SET_CALL_CHECKER_FLAGS
+syn keyword xsMacro PERL_ARGS_ASSERT_CV_UNDEF PERL_ARGS_ASSERT_CV_UNDEF_FLAGS
+syn keyword xsMacro PERL_ARGS_ASSERT_CX_DUMP PERL_ARGS_ASSERT_CX_DUP
+syn keyword xsMacro PERL_ARGS_ASSERT_DEB PERL_ARGS_ASSERT_DEBOP
+syn keyword xsMacro PERL_ARGS_ASSERT_DEBPROF
syn keyword xsMacro PERL_ARGS_ASSERT_DEBUG_START_MATCH
syn keyword xsMacro PERL_ARGS_ASSERT_DEB_NOCONTEXT
-syn keyword xsMacro PERL_ARGS_ASSERT_DEB_STACK_N PERL_ARGS_ASSERT_DELIMCPY
+syn keyword xsMacro PERL_ARGS_ASSERT_DEB_STACK_N
+syn keyword xsMacro PERL_ARGS_ASSERT_DEFELEM_TARGET PERL_ARGS_ASSERT_DELIMCPY
syn keyword xsMacro PERL_ARGS_ASSERT_DEL_SV PERL_ARGS_ASSERT_DESTROY_MATCHER
syn keyword xsMacro PERL_ARGS_ASSERT_DIE_SV PERL_ARGS_ASSERT_DIE_UNWIND
syn keyword xsMacro PERL_ARGS_ASSERT_DIRP_DUP PERL_ARGS_ASSERT_DIV128
@@ -1645,13 +1863,12 @@ syn keyword xsMacro PERL_ARGS_ASSERT_DO_IPCCTL PERL_ARGS_ASSERT_DO_IPCGET
syn keyword xsMacro PERL_ARGS_ASSERT_DO_JOIN PERL_ARGS_ASSERT_DO_MAGIC_DUMP
syn keyword xsMacro PERL_ARGS_ASSERT_DO_MSGRCV PERL_ARGS_ASSERT_DO_MSGSND
syn keyword xsMacro PERL_ARGS_ASSERT_DO_NCMP PERL_ARGS_ASSERT_DO_ODDBALL
-syn keyword xsMacro PERL_ARGS_ASSERT_DO_OPEN PERL_ARGS_ASSERT_DO_OPEN9
-syn keyword xsMacro PERL_ARGS_ASSERT_DO_OPENN PERL_ARGS_ASSERT_DO_OP_DUMP
-syn keyword xsMacro PERL_ARGS_ASSERT_DO_OP_XMLDUMP
-syn keyword xsMacro PERL_ARGS_ASSERT_DO_PMOP_DUMP
-syn keyword xsMacro PERL_ARGS_ASSERT_DO_PMOP_XMLDUMP
-syn keyword xsMacro PERL_ARGS_ASSERT_DO_PRINT PERL_ARGS_ASSERT_DO_SEMOP
-syn keyword xsMacro PERL_ARGS_ASSERT_DO_SHMIO PERL_ARGS_ASSERT_DO_SPAWN
+syn keyword xsMacro PERL_ARGS_ASSERT_DO_OPEN PERL_ARGS_ASSERT_DO_OPEN6
+syn keyword xsMacro PERL_ARGS_ASSERT_DO_OPEN9 PERL_ARGS_ASSERT_DO_OPENN
+syn keyword xsMacro PERL_ARGS_ASSERT_DO_OPEN_RAW PERL_ARGS_ASSERT_DO_OP_DUMP
+syn keyword xsMacro PERL_ARGS_ASSERT_DO_PMOP_DUMP PERL_ARGS_ASSERT_DO_PRINT
+syn keyword xsMacro PERL_ARGS_ASSERT_DO_SEMOP PERL_ARGS_ASSERT_DO_SHMIO
+syn keyword xsMacro PERL_ARGS_ASSERT_DO_SPAWN
syn keyword xsMacro PERL_ARGS_ASSERT_DO_SPAWN_NOWAIT
syn keyword xsMacro PERL_ARGS_ASSERT_DO_SPRINTF PERL_ARGS_ASSERT_DO_SV_DUMP
syn keyword xsMacro PERL_ARGS_ASSERT_DO_SYSSEEK PERL_ARGS_ASSERT_DO_TELL
@@ -1663,10 +1880,11 @@ syn keyword xsMacro PERL_ARGS_ASSERT_DO_TRANS_COUNT_UTF8
syn keyword xsMacro PERL_ARGS_ASSERT_DO_TRANS_SIMPLE
syn keyword xsMacro PERL_ARGS_ASSERT_DO_TRANS_SIMPLE_UTF8
syn keyword xsMacro PERL_ARGS_ASSERT_DO_VECGET PERL_ARGS_ASSERT_DO_VECSET
-syn keyword xsMacro PERL_ARGS_ASSERT_DO_VOP PERL_ARGS_ASSERT_DUMPUNTIL
-syn keyword xsMacro PERL_ARGS_ASSERT_DUMP_EXEC_POS PERL_ARGS_ASSERT_DUMP_FDS
-syn keyword xsMacro PERL_ARGS_ASSERT_DUMP_FORM PERL_ARGS_ASSERT_DUMP_INDENT
-syn keyword xsMacro PERL_ARGS_ASSERT_DUMP_MSTATS
+syn keyword xsMacro PERL_ARGS_ASSERT_DO_VOP PERL_ARGS_ASSERT_DRAND48_INIT_R
+syn keyword xsMacro PERL_ARGS_ASSERT_DRAND48_R PERL_ARGS_ASSERT_DUMPUNTIL
+syn keyword xsMacro PERL_ARGS_ASSERT_DUMP_C_BACKTRACE
+syn keyword xsMacro PERL_ARGS_ASSERT_DUMP_EXEC_POS PERL_ARGS_ASSERT_DUMP_FORM
+syn keyword xsMacro PERL_ARGS_ASSERT_DUMP_INDENT PERL_ARGS_ASSERT_DUMP_MSTATS
syn keyword xsMacro PERL_ARGS_ASSERT_DUMP_PACKSUBS
syn keyword xsMacro PERL_ARGS_ASSERT_DUMP_PACKSUBS_PERL
syn keyword xsMacro PERL_ARGS_ASSERT_DUMP_SUB PERL_ARGS_ASSERT_DUMP_SUB_PERL
@@ -1687,12 +1905,15 @@ syn keyword xsMacro PERL_ARGS_ASSERT_FIND_AND_FORGET_PMOPS
syn keyword xsMacro PERL_ARGS_ASSERT_FIND_ARRAY_SUBSCRIPT
syn keyword xsMacro PERL_ARGS_ASSERT_FIND_BEGINNING
syn keyword xsMacro PERL_ARGS_ASSERT_FIND_BYCLASS
+syn keyword xsMacro PERL_ARGS_ASSERT_FIND_DEFAULT_STASH
syn keyword xsMacro PERL_ARGS_ASSERT_FIND_HASH_SUBSCRIPT
syn keyword xsMacro PERL_ARGS_ASSERT_FIND_IN_MY_STASH
syn keyword xsMacro PERL_ARGS_ASSERT_FIND_RUNDEFSV2
syn keyword xsMacro PERL_ARGS_ASSERT_FIND_SCRIPT
-syn keyword xsMacro PERL_ARGS_ASSERT_FIRST_SYMBOL PERL_ARGS_ASSERT_FOLDEQ
-syn keyword xsMacro PERL_ARGS_ASSERT_FOLDEQ_LATIN1
+syn keyword xsMacro PERL_ARGS_ASSERT_FIND_UNINIT_VAR
+syn keyword xsMacro PERL_ARGS_ASSERT_FIRST_SYMBOL
+syn keyword xsMacro PERL_ARGS_ASSERT_FIXUP_ERRNO_STRING
+syn keyword xsMacro PERL_ARGS_ASSERT_FOLDEQ PERL_ARGS_ASSERT_FOLDEQ_LATIN1
syn keyword xsMacro PERL_ARGS_ASSERT_FOLDEQ_LOCALE
syn keyword xsMacro PERL_ARGS_ASSERT_FOLDEQ_UTF8_FLAGS
syn keyword xsMacro PERL_ARGS_ASSERT_FOLD_CONSTANTS
@@ -1701,34 +1922,40 @@ syn keyword xsMacro PERL_ARGS_ASSERT_FORCE_STRICT_VERSION
syn keyword xsMacro PERL_ARGS_ASSERT_FORCE_VERSION
syn keyword xsMacro PERL_ARGS_ASSERT_FORCE_WORD PERL_ARGS_ASSERT_FORGET_PMOP
syn keyword xsMacro PERL_ARGS_ASSERT_FORM PERL_ARGS_ASSERT_FORM_NOCONTEXT
+syn keyword xsMacro PERL_ARGS_ASSERT_FORM_SHORT_OCTAL_WARNING
syn keyword xsMacro PERL_ARGS_ASSERT_FPRINTF_NOCONTEXT
syn keyword xsMacro PERL_ARGS_ASSERT_FP_DUP
syn keyword xsMacro PERL_ARGS_ASSERT_FREE_GLOBAL_STRUCT
syn keyword xsMacro PERL_ARGS_ASSERT_GETCWD_SV PERL_ARGS_ASSERT_GETENV_LEN
+syn keyword xsMacro PERL_ARGS_ASSERT_GET_AND_CHECK_BACKSLASH_N_NAME
+syn keyword xsMacro PERL_ARGS_ASSERT_GET_ANYOF_CP_LIST_FOR_SSC
syn keyword xsMacro PERL_ARGS_ASSERT_GET_AUX_MG PERL_ARGS_ASSERT_GET_AV
syn keyword xsMacro PERL_ARGS_ASSERT_GET_CV PERL_ARGS_ASSERT_GET_CVN_FLAGS
syn keyword xsMacro PERL_ARGS_ASSERT_GET_DB_SUB
-syn keyword xsMacro PERL_ARGS_ASSERT_GET_DEBUG_OPTS PERL_ARGS_ASSERT_GET_HV
+syn keyword xsMacro PERL_ARGS_ASSERT_GET_DEBUG_OPTS
+syn keyword xsMacro PERL_ARGS_ASSERT_GET_HASH_SEED PERL_ARGS_ASSERT_GET_HV
syn keyword xsMacro PERL_ARGS_ASSERT_GET_INVLIST_ITER_ADDR
-syn keyword xsMacro PERL_ARGS_ASSERT_GET_INVLIST_LEN_ADDR
-syn keyword xsMacro PERL_ARGS_ASSERT_GET_INVLIST_VERSION_ID_ADDR
-syn keyword xsMacro PERL_ARGS_ASSERT_GET_INVLIST_ZERO_ADDR
+syn keyword xsMacro PERL_ARGS_ASSERT_GET_INVLIST_OFFSET_ADDR
+syn keyword xsMacro PERL_ARGS_ASSERT_GET_INVLIST_PREVIOUS_INDEX_ADDR
syn keyword xsMacro PERL_ARGS_ASSERT_GET_MSTATS PERL_ARGS_ASSERT_GET_NUM
syn keyword xsMacro PERL_ARGS_ASSERT_GET_SV PERL_ARGS_ASSERT_GLOB_2NUMBER
-syn keyword xsMacro PERL_ARGS_ASSERT_GLOB_ASSIGN_GLOB
-syn keyword xsMacro PERL_ARGS_ASSERT_GLOB_ASSIGN_REF PERL_ARGS_ASSERT_GP_DUP
-syn keyword xsMacro PERL_ARGS_ASSERT_GROK_BIN PERL_ARGS_ASSERT_GROK_BSLASH_O
-syn keyword xsMacro PERL_ARGS_ASSERT_GROK_HEX PERL_ARGS_ASSERT_GROK_NUMBER
+syn keyword xsMacro PERL_ARGS_ASSERT_GLOB_ASSIGN_GLOB PERL_ARGS_ASSERT_GP_DUP
+syn keyword xsMacro PERL_ARGS_ASSERT_GROK_ATOUV PERL_ARGS_ASSERT_GROK_BIN
+syn keyword xsMacro PERL_ARGS_ASSERT_GROK_BSLASH_N
+syn keyword xsMacro PERL_ARGS_ASSERT_GROK_BSLASH_O
+syn keyword xsMacro PERL_ARGS_ASSERT_GROK_BSLASH_X PERL_ARGS_ASSERT_GROK_HEX
+syn keyword xsMacro PERL_ARGS_ASSERT_GROK_INFNAN PERL_ARGS_ASSERT_GROK_NUMBER
+syn keyword xsMacro PERL_ARGS_ASSERT_GROK_NUMBER_FLAGS
syn keyword xsMacro PERL_ARGS_ASSERT_GROK_NUMERIC_RADIX
syn keyword xsMacro PERL_ARGS_ASSERT_GROK_OCT PERL_ARGS_ASSERT_GROUP_END
syn keyword xsMacro PERL_ARGS_ASSERT_GV_AMUPDATE
syn keyword xsMacro PERL_ARGS_ASSERT_GV_AUTOLOAD_PV
syn keyword xsMacro PERL_ARGS_ASSERT_GV_AUTOLOAD_PVN
syn keyword xsMacro PERL_ARGS_ASSERT_GV_AUTOLOAD_SV PERL_ARGS_ASSERT_GV_CHECK
-syn keyword xsMacro PERL_ARGS_ASSERT_GV_CONST_SV PERL_ARGS_ASSERT_GV_DUMP
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_CONST_SV
syn keyword xsMacro PERL_ARGS_ASSERT_GV_EFULLNAME
syn keyword xsMacro PERL_ARGS_ASSERT_GV_EFULLNAME3
-syn keyword xsMacro PERL_ARGS_ASSERT_GV_EFULLNAME4 PERL_ARGS_ASSERT_GV_ENAME
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_EFULLNAME4
syn keyword xsMacro PERL_ARGS_ASSERT_GV_FETCHFILE
syn keyword xsMacro PERL_ARGS_ASSERT_GV_FETCHFILE_FLAGS
syn keyword xsMacro PERL_ARGS_ASSERT_GV_FETCHMETHOD
@@ -1746,20 +1973,24 @@ syn keyword xsMacro PERL_ARGS_ASSERT_GV_FETCHPV
syn keyword xsMacro PERL_ARGS_ASSERT_GV_FETCHPVN_FLAGS
syn keyword xsMacro PERL_ARGS_ASSERT_GV_FETCHSV PERL_ARGS_ASSERT_GV_FULLNAME
syn keyword xsMacro PERL_ARGS_ASSERT_GV_FULLNAME3
-syn keyword xsMacro PERL_ARGS_ASSERT_GV_FULLNAME4
-syn keyword xsMacro PERL_ARGS_ASSERT_GV_GET_SUPER_PKG
-syn keyword xsMacro PERL_ARGS_ASSERT_GV_INIT_PV PERL_ARGS_ASSERT_GV_INIT_PVN
-syn keyword xsMacro PERL_ARGS_ASSERT_GV_INIT_SV
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_FULLNAME4 PERL_ARGS_ASSERT_GV_INIT_PV
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_INIT_PVN PERL_ARGS_ASSERT_GV_INIT_SV
syn keyword xsMacro PERL_ARGS_ASSERT_GV_INIT_SVTYPE
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_IS_IN_MAIN
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_MAGICALIZE
syn keyword xsMacro PERL_ARGS_ASSERT_GV_MAGICALIZE_ISA
-syn keyword xsMacro PERL_ARGS_ASSERT_GV_MAGICALIZE_OVERLOAD
-syn keyword xsMacro PERL_ARGS_ASSERT_GV_NAME_SET PERL_ARGS_ASSERT_GV_STASHPV
-syn keyword xsMacro PERL_ARGS_ASSERT_GV_STASHPVN PERL_ARGS_ASSERT_GV_STASHSV
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_NAME_SET PERL_ARGS_ASSERT_GV_OVERRIDE
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_SETREF PERL_ARGS_ASSERT_GV_STASHPV
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_STASHPVN
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_STASHPVN_INTERNAL
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_STASHSV
syn keyword xsMacro PERL_ARGS_ASSERT_GV_TRY_DOWNGRADE
+syn keyword xsMacro PERL_ARGS_ASSERT_HANDLE_REGEX_SETS
syn keyword xsMacro PERL_ARGS_ASSERT_HEK_DUP PERL_ARGS_ASSERT_HE_DUP
syn keyword xsMacro PERL_ARGS_ASSERT_HFREEENTRIES
syn keyword xsMacro PERL_ARGS_ASSERT_HFREE_NEXT_ENTRY PERL_ARGS_ASSERT_HSPLIT
syn keyword xsMacro PERL_ARGS_ASSERT_HV_ASSERT PERL_ARGS_ASSERT_HV_AUXINIT
+syn keyword xsMacro PERL_ARGS_ASSERT_HV_AUXINIT_INTERNAL
syn keyword xsMacro PERL_ARGS_ASSERT_HV_BACKREFERENCES_P
syn keyword xsMacro PERL_ARGS_ASSERT_HV_CLEAR_PLACEHOLDERS
syn keyword xsMacro PERL_ARGS_ASSERT_HV_COMMON_KEY_LEN
@@ -1786,9 +2017,9 @@ syn keyword xsMacro PERL_ARGS_ASSERT_HV_NOTALLOWED
syn keyword xsMacro PERL_ARGS_ASSERT_HV_PLACEHOLDERS_GET
syn keyword xsMacro PERL_ARGS_ASSERT_HV_PLACEHOLDERS_P
syn keyword xsMacro PERL_ARGS_ASSERT_HV_PLACEHOLDERS_SET
-syn keyword xsMacro PERL_ARGS_ASSERT_HV_RITER_P PERL_ARGS_ASSERT_HV_RITER_SET
-syn keyword xsMacro PERL_ARGS_ASSERT_HV_SCALAR PERL_ARGS_ASSERT_INCLINE
-syn keyword xsMacro PERL_ARGS_ASSERT_INCPUSH
+syn keyword xsMacro PERL_ARGS_ASSERT_HV_RAND_SET PERL_ARGS_ASSERT_HV_RITER_P
+syn keyword xsMacro PERL_ARGS_ASSERT_HV_RITER_SET PERL_ARGS_ASSERT_HV_SCALAR
+syn keyword xsMacro PERL_ARGS_ASSERT_INCLINE PERL_ARGS_ASSERT_INCPUSH
syn keyword xsMacro PERL_ARGS_ASSERT_INCPUSH_IF_EXISTS
syn keyword xsMacro PERL_ARGS_ASSERT_INCPUSH_USE_SEP
syn keyword xsMacro PERL_ARGS_ASSERT_INIT_ARGV_SYMBOLS
@@ -1799,21 +2030,32 @@ syn keyword xsMacro PERL_ARGS_ASSERT_INTUIT_MORE
syn keyword xsMacro PERL_ARGS_ASSERT_INVLIST_ARRAY
syn keyword xsMacro PERL_ARGS_ASSERT_INVLIST_CLONE
syn keyword xsMacro PERL_ARGS_ASSERT_INVLIST_EXTEND
+syn keyword xsMacro PERL_ARGS_ASSERT_INVLIST_HIGHEST
+syn keyword xsMacro PERL_ARGS_ASSERT_INVLIST_IS_ITERATING
+syn keyword xsMacro PERL_ARGS_ASSERT_INVLIST_ITERFINISH
syn keyword xsMacro PERL_ARGS_ASSERT_INVLIST_ITERINIT
syn keyword xsMacro PERL_ARGS_ASSERT_INVLIST_ITERNEXT
-syn keyword xsMacro PERL_ARGS_ASSERT_INVLIST_LEN PERL_ARGS_ASSERT_INVLIST_MAX
-syn keyword xsMacro PERL_ARGS_ASSERT_INVLIST_SEARCH
+syn keyword xsMacro PERL_ARGS_ASSERT_INVLIST_MAX
+syn keyword xsMacro PERL_ARGS_ASSERT_INVLIST_PREVIOUS_INDEX
syn keyword xsMacro PERL_ARGS_ASSERT_INVLIST_SET_LEN
+syn keyword xsMacro PERL_ARGS_ASSERT_INVLIST_SET_PREVIOUS_INDEX
syn keyword xsMacro PERL_ARGS_ASSERT_INVLIST_TRIM PERL_ARGS_ASSERT_IO_CLOSE
-syn keyword xsMacro PERL_ARGS_ASSERT_ISA_LOOKUP PERL_ARGS_ASSERT_IS_AN_INT
-syn keyword xsMacro PERL_ARGS_ASSERT_IS_ASCII_STRING
+syn keyword xsMacro PERL_ARGS_ASSERT_ISALNUM_LAZY PERL_ARGS_ASSERT_ISA_LOOKUP
+syn keyword xsMacro PERL_ARGS_ASSERT_ISFOO_UTF8_LC
+syn keyword xsMacro PERL_ARGS_ASSERT_ISIDFIRST_LAZY
+syn keyword xsMacro PERL_ARGS_ASSERT_ISINFNANSV PERL_ARGS_ASSERT_ISSB
+syn keyword xsMacro PERL_ARGS_ASSERT_ISWB PERL_ARGS_ASSERT_IS_AN_INT
syn keyword xsMacro PERL_ARGS_ASSERT_IS_HANDLE_CONSTRUCTOR
+syn keyword xsMacro PERL_ARGS_ASSERT_IS_INVARIANT_STRING
+syn keyword xsMacro PERL_ARGS_ASSERT_IS_SAFE_SYSCALL
+syn keyword xsMacro PERL_ARGS_ASSERT_IS_SSC_WORTH_IT
syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_ALNUM
+syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_ALNUMC
syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_ALPHA
syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_ASCII
+syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_BLANK
syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_CHAR
syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_CHAR_BUF
-syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_CHAR_SLOW
syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_CNTRL
syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_COMMON
syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_DIGIT
@@ -1834,19 +2076,10 @@ syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_STRING_LOCLEN
syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_UPPER
syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_XDIGIT
syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_XIDCONT
-syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_XIDFIRST
-syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_X_BEGIN
-syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_X_EXTEND
-syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_X_L
-syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_X_LV
-syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_X_LVT
-syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_X_LV_LVT_V
-syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_X_NON_HANGUL
-syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_X_PREPEND
-syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_X_T PERL_ARGS_ASSERT_IS_UTF8_X_V
-syn keyword xsMacro PERL_ARGS_ASSERT_JMAYBE PERL_ARGS_ASSERT_JOIN_EXACT
-syn keyword xsMacro PERL_ARGS_ASSERT_KEYWORD
+syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_XIDFIRST PERL_ARGS_ASSERT_JMAYBE
+syn keyword xsMacro PERL_ARGS_ASSERT_JOIN_EXACT PERL_ARGS_ASSERT_KEYWORD
syn keyword xsMacro PERL_ARGS_ASSERT_KEYWORD_PLUGIN_STANDARD
+syn keyword xsMacro PERL_ARGS_ASSERT_LEAVE_COMMON
syn keyword xsMacro PERL_ARGS_ASSERT_LEX_DISCARD_TO
syn keyword xsMacro PERL_ARGS_ASSERT_LEX_READ_TO
syn keyword xsMacro PERL_ARGS_ASSERT_LEX_STUFF_PV
@@ -1857,6 +2090,7 @@ syn keyword xsMacro PERL_ARGS_ASSERT_LOAD_MODULE_NOCONTEXT
syn keyword xsMacro PERL_ARGS_ASSERT_LOCALIZE
syn keyword xsMacro PERL_ARGS_ASSERT_LOOKS_LIKE_BOOL
syn keyword xsMacro PERL_ARGS_ASSERT_LOOKS_LIKE_NUMBER PERL_ARGS_ASSERT_LOP
+syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_CLEARARYLEN_P
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_CLEARENV
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_CLEARHINT
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_CLEARHINTS
@@ -1864,11 +2098,13 @@ syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_CLEARISA
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_CLEARPACK
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_CLEARSIG
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_CLEAR_ALL_ENV
+syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_COPYCALLCHECKER
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_EXISTSPACK
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_FREEARYLEN_P
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_FREEOVRLD
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_GET
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_GETARYLEN
+syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_GETDEBUGVAR
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_GETDEFELEM
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_GETNKEYS
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_GETPACK
@@ -1879,7 +2115,6 @@ syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_GETTAINT
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_GETUVAR
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_GETVEC
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_KILLBACKREFS
-syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_LEN
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_METHCALL
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_METHCALL1
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_METHPACK
@@ -1889,14 +2124,15 @@ syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_REGDATUM_GET
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_REGDATUM_SET
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SCALARPACK
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SET
-syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SETAMAGIC
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SETARYLEN
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SETCOLLXFRM
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SETDBLINE
+syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SETDEBUGVAR
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SETDEFELEM
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SETENV
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SETHINT
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SETISA
+syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SETLVREF
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SETMGLOB
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SETNKEYS
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SETPACK
@@ -1908,27 +2144,27 @@ syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SETTAINT
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SETUTF8
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SETUVAR
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SETVEC
-syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SETVSTRING
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SET_ALL_ENV
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SIZEPACK
syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_WIPEPACK
syn keyword xsMacro PERL_ARGS_ASSERT_MAKE_MATCHER PERL_ARGS_ASSERT_MAKE_TRIE
-syn keyword xsMacro PERL_ARGS_ASSERT_MAKE_TRIE_FAILTABLE
syn keyword xsMacro PERL_ARGS_ASSERT_MALLOCED_SIZE
syn keyword xsMacro PERL_ARGS_ASSERT_MATCHER_MATCHES_SV
syn keyword xsMacro PERL_ARGS_ASSERT_MAYBERELOCATE
+syn keyword xsMacro PERL_ARGS_ASSERT_MAYBE_MULTIMAGIC_GV
syn keyword xsMacro PERL_ARGS_ASSERT_MEASURE_STRUCT
syn keyword xsMacro PERL_ARGS_ASSERT_MEM_COLLXFRM
syn keyword xsMacro PERL_ARGS_ASSERT_MEM_LOG_COMMON PERL_ARGS_ASSERT_MESS
syn keyword xsMacro PERL_ARGS_ASSERT_MESS_NOCONTEXT PERL_ARGS_ASSERT_MESS_SV
-syn keyword xsMacro PERL_ARGS_ASSERT_METHOD_COMMON PERL_ARGS_ASSERT_MG_CLEAR
-syn keyword xsMacro PERL_ARGS_ASSERT_MG_COPY PERL_ARGS_ASSERT_MG_DUP
+syn keyword xsMacro PERL_ARGS_ASSERT_MG_CLEAR PERL_ARGS_ASSERT_MG_COPY
+syn keyword xsMacro PERL_ARGS_ASSERT_MG_DUP PERL_ARGS_ASSERT_MG_FIND_MGLOB
syn keyword xsMacro PERL_ARGS_ASSERT_MG_FREE PERL_ARGS_ASSERT_MG_FREE_TYPE
syn keyword xsMacro PERL_ARGS_ASSERT_MG_GET PERL_ARGS_ASSERT_MG_LENGTH
syn keyword xsMacro PERL_ARGS_ASSERT_MG_LOCALIZE PERL_ARGS_ASSERT_MG_MAGICAL
syn keyword xsMacro PERL_ARGS_ASSERT_MG_SET PERL_ARGS_ASSERT_MG_SIZE
syn keyword xsMacro PERL_ARGS_ASSERT_MINI_MKTIME
syn keyword xsMacro PERL_ARGS_ASSERT_MORESWITCHES
+syn keyword xsMacro PERL_ARGS_ASSERT_MOVE_PROTO_ATTR
syn keyword xsMacro PERL_ARGS_ASSERT_MRO_CLEAN_ISAREV
syn keyword xsMacro PERL_ARGS_ASSERT_MRO_GATHER_AND_RENAME
syn keyword xsMacro PERL_ARGS_ASSERT_MRO_GET_FROM_NAME
@@ -1944,29 +2180,35 @@ syn keyword xsMacro PERL_ARGS_ASSERT_MRO_REGISTER
syn keyword xsMacro PERL_ARGS_ASSERT_MRO_SET_MRO
syn keyword xsMacro PERL_ARGS_ASSERT_MRO_SET_PRIVATE_DATA
syn keyword xsMacro PERL_ARGS_ASSERT_MUL128
-syn keyword xsMacro PERL_ARGS_ASSERT_MUNGE_QWLIST_TO_PAREN_LIST
+syn keyword xsMacro PERL_ARGS_ASSERT_MULTIDEREF_STRINGIFY
syn keyword xsMacro PERL_ARGS_ASSERT_MY_ATOF PERL_ARGS_ASSERT_MY_ATOF2
syn keyword xsMacro PERL_ARGS_ASSERT_MY_ATTRS PERL_ARGS_ASSERT_MY_BCOPY
+syn keyword xsMacro PERL_ARGS_ASSERT_MY_BYTES_TO_UTF8
syn keyword xsMacro PERL_ARGS_ASSERT_MY_BZERO PERL_ARGS_ASSERT_MY_CXT_INDEX
syn keyword xsMacro PERL_ARGS_ASSERT_MY_CXT_INIT PERL_ARGS_ASSERT_MY_KID
syn keyword xsMacro PERL_ARGS_ASSERT_MY_MEMCMP PERL_ARGS_ASSERT_MY_MEMSET
syn keyword xsMacro PERL_ARGS_ASSERT_MY_POPEN PERL_ARGS_ASSERT_MY_POPEN_LIST
syn keyword xsMacro PERL_ARGS_ASSERT_MY_SNPRINTF PERL_ARGS_ASSERT_MY_SPRINTF
-syn keyword xsMacro PERL_ARGS_ASSERT_MY_STRFTIME PERL_ARGS_ASSERT_MY_SWABN
+syn keyword xsMacro PERL_ARGS_ASSERT_MY_STRFTIME
syn keyword xsMacro PERL_ARGS_ASSERT_MY_VSNPRINTF PERL_ARGS_ASSERT_NEED_UTF8
syn keyword xsMacro PERL_ARGS_ASSERT_NEWAVREF PERL_ARGS_ASSERT_NEWCONDOP
syn keyword xsMacro PERL_ARGS_ASSERT_NEWFOROP PERL_ARGS_ASSERT_NEWGIVENOP
syn keyword xsMacro PERL_ARGS_ASSERT_NEWGIVWHENOP PERL_ARGS_ASSERT_NEWGP
syn keyword xsMacro PERL_ARGS_ASSERT_NEWGVGEN_FLAGS PERL_ARGS_ASSERT_NEWGVOP
syn keyword xsMacro PERL_ARGS_ASSERT_NEWHVREF PERL_ARGS_ASSERT_NEWLOGOP
-syn keyword xsMacro PERL_ARGS_ASSERT_NEWLOOPEX PERL_ARGS_ASSERT_NEWMADSV
-syn keyword xsMacro PERL_ARGS_ASSERT_NEWPADOP PERL_ARGS_ASSERT_NEWPROG
-syn keyword xsMacro PERL_ARGS_ASSERT_NEWRANGE PERL_ARGS_ASSERT_NEWRV
-syn keyword xsMacro PERL_ARGS_ASSERT_NEWRV_NOINC PERL_ARGS_ASSERT_NEWSVOP
-syn keyword xsMacro PERL_ARGS_ASSERT_NEWSVPVF
+syn keyword xsMacro PERL_ARGS_ASSERT_NEWLOOPEX PERL_ARGS_ASSERT_NEWMETHOP
+syn keyword xsMacro PERL_ARGS_ASSERT_NEWMETHOP_NAMED
+syn keyword xsMacro PERL_ARGS_ASSERT_NEWMYSUB
+syn keyword xsMacro PERL_ARGS_ASSERT_NEWPADNAMEOUTER
+syn keyword xsMacro PERL_ARGS_ASSERT_NEWPADNAMEPVN PERL_ARGS_ASSERT_NEWPADOP
+syn keyword xsMacro PERL_ARGS_ASSERT_NEWPROG PERL_ARGS_ASSERT_NEWRANGE
+syn keyword xsMacro PERL_ARGS_ASSERT_NEWRV PERL_ARGS_ASSERT_NEWRV_NOINC
+syn keyword xsMacro PERL_ARGS_ASSERT_NEWSTUB PERL_ARGS_ASSERT_NEWSVAVDEFELEM
+syn keyword xsMacro PERL_ARGS_ASSERT_NEWSVOP PERL_ARGS_ASSERT_NEWSVPVF
syn keyword xsMacro PERL_ARGS_ASSERT_NEWSVPVF_NOCONTEXT
syn keyword xsMacro PERL_ARGS_ASSERT_NEWSVREF PERL_ARGS_ASSERT_NEWSVRV
syn keyword xsMacro PERL_ARGS_ASSERT_NEWWHENOP PERL_ARGS_ASSERT_NEWXS
+syn keyword xsMacro PERL_ARGS_ASSERT_NEWXS_DEFFILE
syn keyword xsMacro PERL_ARGS_ASSERT_NEWXS_FLAGS
syn keyword xsMacro PERL_ARGS_ASSERT_NEWXS_LEN_FLAGS
syn keyword xsMacro PERL_ARGS_ASSERT_NEW_CONSTANT PERL_ARGS_ASSERT_NEW_CTYPE
@@ -1974,24 +2216,39 @@ syn keyword xsMacro PERL_ARGS_ASSERT_NEW_LOGOP PERL_ARGS_ASSERT_NEW_VERSION
syn keyword xsMacro PERL_ARGS_ASSERT_NEW_WARNINGS_BITFIELD
syn keyword xsMacro PERL_ARGS_ASSERT_NEXTARGV PERL_ARGS_ASSERT_NEXTCHAR
syn keyword xsMacro PERL_ARGS_ASSERT_NEXT_SYMBOL PERL_ARGS_ASSERT_NINSTR
-syn keyword xsMacro PERL_ARGS_ASSERT_NOT_A_NUMBER
+syn keyword xsMacro PERL_ARGS_ASSERT_NOPERL_DIE PERL_ARGS_ASSERT_NOT_A_NUMBER
+syn keyword xsMacro PERL_ARGS_ASSERT_NOT_INCREMENTABLE
syn keyword xsMacro PERL_ARGS_ASSERT_NO_BAREWORD_ALLOWED
syn keyword xsMacro PERL_ARGS_ASSERT_NO_FH_ALLOWED PERL_ARGS_ASSERT_NO_OP
syn keyword xsMacro PERL_ARGS_ASSERT_OOPSAV PERL_ARGS_ASSERT_OOPSHV
-syn keyword xsMacro PERL_ARGS_ASSERT_OPEN_SCRIPT
-syn keyword xsMacro PERL_ARGS_ASSERT_OPT_SCALARHV PERL_ARGS_ASSERT_OP_CLEAR
+syn keyword xsMacro PERL_ARGS_ASSERT_OPENN_CLEANUP
+syn keyword xsMacro PERL_ARGS_ASSERT_OPENN_SETUP PERL_ARGS_ASSERT_OPEN_SCRIPT
+syn keyword xsMacro PERL_ARGS_ASSERT_OPMETHOD_STASH
+syn keyword xsMacro PERL_ARGS_ASSERT_OPSLAB_FORCE_FREE
+syn keyword xsMacro PERL_ARGS_ASSERT_OPSLAB_FREE
+syn keyword xsMacro PERL_ARGS_ASSERT_OPSLAB_FREE_NOPAD
+syn keyword xsMacro PERL_ARGS_ASSERT_OP_CLEAR
syn keyword xsMacro PERL_ARGS_ASSERT_OP_CONTEXTUALIZE
syn keyword xsMacro PERL_ARGS_ASSERT_OP_DUMP PERL_ARGS_ASSERT_OP_INTEGERIZE
syn keyword xsMacro PERL_ARGS_ASSERT_OP_LINKLIST PERL_ARGS_ASSERT_OP_NULL
-syn keyword xsMacro PERL_ARGS_ASSERT_OP_REFCNT_DEC
-syn keyword xsMacro PERL_ARGS_ASSERT_OP_STD_INIT PERL_ARGS_ASSERT_OP_XMLDUMP
-syn keyword xsMacro PERL_ARGS_ASSERT_PACKAGE PERL_ARGS_ASSERT_PACKAGE_VERSION
+syn keyword xsMacro PERL_ARGS_ASSERT_OP_PARENT PERL_ARGS_ASSERT_OP_REFCNT_DEC
+syn keyword xsMacro PERL_ARGS_ASSERT_OP_RELOCATE_SV
+syn keyword xsMacro PERL_ARGS_ASSERT_OP_STD_INIT PERL_ARGS_ASSERT_PACKAGE
+syn keyword xsMacro PERL_ARGS_ASSERT_PACKAGE_VERSION
syn keyword xsMacro PERL_ARGS_ASSERT_PACKLIST PERL_ARGS_ASSERT_PACK_CAT
syn keyword xsMacro PERL_ARGS_ASSERT_PACK_REC PERL_ARGS_ASSERT_PADLIST_DUP
+syn keyword xsMacro PERL_ARGS_ASSERT_PADLIST_STORE
+syn keyword xsMacro PERL_ARGS_ASSERT_PADNAMELIST_DUP
+syn keyword xsMacro PERL_ARGS_ASSERT_PADNAMELIST_FETCH
+syn keyword xsMacro PERL_ARGS_ASSERT_PADNAMELIST_FREE
+syn keyword xsMacro PERL_ARGS_ASSERT_PADNAMELIST_STORE
+syn keyword xsMacro PERL_ARGS_ASSERT_PADNAME_DUP
+syn keyword xsMacro PERL_ARGS_ASSERT_PADNAME_FREE
syn keyword xsMacro PERL_ARGS_ASSERT_PAD_ADD_ANON
syn keyword xsMacro PERL_ARGS_ASSERT_PAD_ADD_NAME_PV
syn keyword xsMacro PERL_ARGS_ASSERT_PAD_ADD_NAME_PVN
syn keyword xsMacro PERL_ARGS_ASSERT_PAD_ADD_NAME_SV
+syn keyword xsMacro PERL_ARGS_ASSERT_PAD_ADD_WEAKREF
syn keyword xsMacro PERL_ARGS_ASSERT_PAD_ALLOC_NAME
syn keyword xsMacro PERL_ARGS_ASSERT_PAD_CHECK_DUP
syn keyword xsMacro PERL_ARGS_ASSERT_PAD_FINDLEX
@@ -1999,11 +2256,14 @@ syn keyword xsMacro PERL_ARGS_ASSERT_PAD_FINDMY_PV
syn keyword xsMacro PERL_ARGS_ASSERT_PAD_FINDMY_PVN
syn keyword xsMacro PERL_ARGS_ASSERT_PAD_FINDMY_SV
syn keyword xsMacro PERL_ARGS_ASSERT_PAD_FIXUP_INNER_ANONS
-syn keyword xsMacro PERL_ARGS_ASSERT_PAD_PEG PERL_ARGS_ASSERT_PAD_PUSH
-syn keyword xsMacro PERL_ARGS_ASSERT_PAD_SETSV PERL_ARGS_ASSERT_PARSER_DUP
-syn keyword xsMacro PERL_ARGS_ASSERT_PARSER_FREE
+syn keyword xsMacro PERL_ARGS_ASSERT_PAD_PUSH PERL_ARGS_ASSERT_PAD_SETSV
+syn keyword xsMacro PERL_ARGS_ASSERT_PARSER_DUP PERL_ARGS_ASSERT_PARSER_FREE
+syn keyword xsMacro PERL_ARGS_ASSERT_PARSER_FREE_NEXTTOKE_OPS
+syn keyword xsMacro PERL_ARGS_ASSERT_PARSE_GV_STASH_NAME
+syn keyword xsMacro PERL_ARGS_ASSERT_PARSE_IDENT
+syn keyword xsMacro PERL_ARGS_ASSERT_PARSE_LPAREN_QUESTION_FLAGS
syn keyword xsMacro PERL_ARGS_ASSERT_PARSE_UNICODE_OPTS
-syn keyword xsMacro PERL_ARGS_ASSERT_PATH_IS_ABSOLUTE
+syn keyword xsMacro PERL_ARGS_ASSERT_PATH_IS_SEARCHABLE
syn keyword xsMacro PERL_ARGS_ASSERT_PERLIO_READ
syn keyword xsMacro PERL_ARGS_ASSERT_PERLIO_UNREAD
syn keyword xsMacro PERL_ARGS_ASSERT_PERLIO_WRITE
@@ -2015,6 +2275,7 @@ syn keyword xsMacro PERL_ARGS_ASSERT_PERL_DESTRUCT PERL_ARGS_ASSERT_PERL_FREE
syn keyword xsMacro PERL_ARGS_ASSERT_PERL_PARSE PERL_ARGS_ASSERT_PERL_RUN
syn keyword xsMacro PERL_ARGS_ASSERT_PMRUNTIME PERL_ARGS_ASSERT_PMTRANS
syn keyword xsMacro PERL_ARGS_ASSERT_PM_DESCRIPTION
+syn keyword xsMacro PERL_ARGS_ASSERT_POPULATE_ANYOF_FROM_INVLIST
syn keyword xsMacro PERL_ARGS_ASSERT_POPULATE_ISA PERL_ARGS_ASSERT_PREGCOMP
syn keyword xsMacro PERL_ARGS_ASSERT_PREGEXEC PERL_ARGS_ASSERT_PREGFREE2
syn keyword xsMacro PERL_ARGS_ASSERT_PRESCAN_VERSION
@@ -2025,10 +2286,14 @@ syn keyword xsMacro PERL_ARGS_ASSERT_PTR_TABLE_FETCH
syn keyword xsMacro PERL_ARGS_ASSERT_PTR_TABLE_FIND
syn keyword xsMacro PERL_ARGS_ASSERT_PTR_TABLE_SPLIT
syn keyword xsMacro PERL_ARGS_ASSERT_PTR_TABLE_STORE
-syn keyword xsMacro PERL_ARGS_ASSERT_PUT_BYTE PERL_ARGS_ASSERT_PV_DISPLAY
+syn keyword xsMacro PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS
+syn keyword xsMacro PERL_ARGS_ASSERT_PUT_CODE_POINT
+syn keyword xsMacro PERL_ARGS_ASSERT_PUT_RANGE PERL_ARGS_ASSERT_PV_DISPLAY
syn keyword xsMacro PERL_ARGS_ASSERT_PV_ESCAPE PERL_ARGS_ASSERT_PV_PRETTY
syn keyword xsMacro PERL_ARGS_ASSERT_PV_UNI_DISPLAY PERL_ARGS_ASSERT_QERROR
syn keyword xsMacro PERL_ARGS_ASSERT_QSORTSVU
+syn keyword xsMacro PERL_ARGS_ASSERT_QUADMATH_FORMAT_NEEDED
+syn keyword xsMacro PERL_ARGS_ASSERT_QUADMATH_FORMAT_SINGLE
syn keyword xsMacro PERL_ARGS_ASSERT_REENTRANT_RETRY
syn keyword xsMacro PERL_ARGS_ASSERT_REFCOUNTED_HE_FETCH_PV
syn keyword xsMacro PERL_ARGS_ASSERT_REFCOUNTED_HE_FETCH_PVN
@@ -2038,9 +2303,10 @@ syn keyword xsMacro PERL_ARGS_ASSERT_REFCOUNTED_HE_NEW_PVN
syn keyword xsMacro PERL_ARGS_ASSERT_REFCOUNTED_HE_NEW_SV
syn keyword xsMacro PERL_ARGS_ASSERT_REFCOUNTED_HE_VALUE
syn keyword xsMacro PERL_ARGS_ASSERT_REFTO PERL_ARGS_ASSERT_REG
-syn keyword xsMacro PERL_ARGS_ASSERT_REGANODE PERL_ARGS_ASSERT_REGATOM
-syn keyword xsMacro PERL_ARGS_ASSERT_REGBRANCH PERL_ARGS_ASSERT_REGCLASS
-syn keyword xsMacro PERL_ARGS_ASSERT_REGCLASS_SWASH PERL_ARGS_ASSERT_REGCPPOP
+syn keyword xsMacro PERL_ARGS_ASSERT_REG2LANODE PERL_ARGS_ASSERT_REGANODE
+syn keyword xsMacro PERL_ARGS_ASSERT_REGATOM PERL_ARGS_ASSERT_REGBRANCH
+syn keyword xsMacro PERL_ARGS_ASSERT_REGCLASS PERL_ARGS_ASSERT_REGCLASS_SWASH
+syn keyword xsMacro PERL_ARGS_ASSERT_REGCPPOP PERL_ARGS_ASSERT_REGCPPUSH
syn keyword xsMacro PERL_ARGS_ASSERT_REGCURLY PERL_ARGS_ASSERT_REGDUMP
syn keyword xsMacro PERL_ARGS_ASSERT_REGDUPE_INTERNAL
syn keyword xsMacro PERL_ARGS_ASSERT_REGEXEC_FLAGS
@@ -2048,13 +2314,12 @@ syn keyword xsMacro PERL_ARGS_ASSERT_REGFREE_INTERNAL
syn keyword xsMacro PERL_ARGS_ASSERT_REGHOP3 PERL_ARGS_ASSERT_REGHOP4
syn keyword xsMacro PERL_ARGS_ASSERT_REGHOPMAYBE3 PERL_ARGS_ASSERT_REGINCLASS
syn keyword xsMacro PERL_ARGS_ASSERT_REGINSERT PERL_ARGS_ASSERT_REGMATCH
+syn keyword xsMacro PERL_ARGS_ASSERT_REGNODE_GUTS PERL_ARGS_ASSERT_REGPATWS
syn keyword xsMacro PERL_ARGS_ASSERT_REGPIECE PERL_ARGS_ASSERT_REGPPOSIXCC
syn keyword xsMacro PERL_ARGS_ASSERT_REGPROP PERL_ARGS_ASSERT_REGREPEAT
syn keyword xsMacro PERL_ARGS_ASSERT_REGTAIL PERL_ARGS_ASSERT_REGTAIL_STUDY
-syn keyword xsMacro PERL_ARGS_ASSERT_REGTRY PERL_ARGS_ASSERT_REGUNI
-syn keyword xsMacro PERL_ARGS_ASSERT_REGWHITE
+syn keyword xsMacro PERL_ARGS_ASSERT_REGTRY
syn keyword xsMacro PERL_ARGS_ASSERT_REG_CHECK_NAMED_BUFF_MATCHED
-syn keyword xsMacro PERL_ARGS_ASSERT_REG_NAMEDSEQ
syn keyword xsMacro PERL_ARGS_ASSERT_REG_NAMED_BUFF
syn keyword xsMacro PERL_ARGS_ASSERT_REG_NAMED_BUFF_ALL
syn keyword xsMacro PERL_ARGS_ASSERT_REG_NAMED_BUFF_EXISTS
@@ -2079,7 +2344,8 @@ syn keyword xsMacro PERL_ARGS_ASSERT_RE_COMPILE PERL_ARGS_ASSERT_RE_CROAK2
syn keyword xsMacro PERL_ARGS_ASSERT_RE_DUP_GUTS
syn keyword xsMacro PERL_ARGS_ASSERT_RE_INTUIT_START
syn keyword xsMacro PERL_ARGS_ASSERT_RE_INTUIT_STRING
-syn keyword xsMacro PERL_ARGS_ASSERT_RNINSTR PERL_ARGS_ASSERT_RSIGNAL_SAVE
+syn keyword xsMacro PERL_ARGS_ASSERT_RE_OP_COMPILE PERL_ARGS_ASSERT_RNINSTR
+syn keyword xsMacro PERL_ARGS_ASSERT_RSIGNAL_SAVE
syn keyword xsMacro PERL_ARGS_ASSERT_RUN_USER_FILTER
syn keyword xsMacro PERL_ARGS_ASSERT_RV2CV_OP_CV PERL_ARGS_ASSERT_RVPV_DUP
syn keyword xsMacro PERL_ARGS_ASSERT_RXRES_FREE
@@ -2088,6 +2354,7 @@ syn keyword xsMacro PERL_ARGS_ASSERT_RXRES_SAVE PERL_ARGS_ASSERT_SAME_DIRENT
syn keyword xsMacro PERL_ARGS_ASSERT_SAVESHAREDSVPV PERL_ARGS_ASSERT_SAVESVPV
syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_ADELETE
syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_AELEM_FLAGS
+syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_ALIASED_SV
syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_APTR PERL_ARGS_ASSERT_SAVE_ARY
syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_BOOL PERL_ARGS_ASSERT_SAVE_CLEARSV
syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_DELETE
@@ -2103,15 +2370,16 @@ syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_I32 PERL_ARGS_ASSERT_SAVE_I8
syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_INT PERL_ARGS_ASSERT_SAVE_ITEM
syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_IV PERL_ARGS_ASSERT_SAVE_LINES
syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_LIST PERL_ARGS_ASSERT_SAVE_LONG
-syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_MAGIC
+syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_MAGIC_FLAGS
syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_MORTALIZESV
syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_NOGV PERL_ARGS_ASSERT_SAVE_PPTR
syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_SCALAR
syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_SCALAR_AT
syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_SET_SVFLAGS
syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_SHARED_PVREF
-syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_SPTR PERL_ARGS_ASSERT_SAVE_SVREF
-syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_VPTR PERL_ARGS_ASSERT_SCALARBOOLEAN
+syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_SPTR PERL_ARGS_ASSERT_SAVE_STRLEN
+syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_SVREF PERL_ARGS_ASSERT_SAVE_VPTR
+syn keyword xsMacro PERL_ARGS_ASSERT_SCALARBOOLEAN
syn keyword xsMacro PERL_ARGS_ASSERT_SCALARVOID PERL_ARGS_ASSERT_SCAN_BIN
syn keyword xsMacro PERL_ARGS_ASSERT_SCAN_COMMIT PERL_ARGS_ASSERT_SCAN_CONST
syn keyword xsMacro PERL_ARGS_ASSERT_SCAN_FORMLINE
@@ -2123,25 +2391,31 @@ syn keyword xsMacro PERL_ARGS_ASSERT_SCAN_PAT PERL_ARGS_ASSERT_SCAN_STR
syn keyword xsMacro PERL_ARGS_ASSERT_SCAN_SUBST PERL_ARGS_ASSERT_SCAN_TRANS
syn keyword xsMacro PERL_ARGS_ASSERT_SCAN_VERSION
syn keyword xsMacro PERL_ARGS_ASSERT_SCAN_VSTRING PERL_ARGS_ASSERT_SCAN_WORD
-syn keyword xsMacro PERL_ARGS_ASSERT_SCREAMINSTR
-syn keyword xsMacro PERL_ARGS_ASSERT_SEARCH_CONST
-syn keyword xsMacro PERL_ARGS_ASSERT_SET_CONTEXT
-syn keyword xsMacro PERL_ARGS_ASSERT_SET_REGCLASS_BIT
-syn keyword xsMacro PERL_ARGS_ASSERT_SET_REGCLASS_BIT_FOLD
+syn keyword xsMacro PERL_ARGS_ASSERT_SEARCH_CONST PERL_ARGS_ASSERT_SETDEFOUT
+syn keyword xsMacro PERL_ARGS_ASSERT_SET_ANYOF_ARG
+syn keyword xsMacro PERL_ARGS_ASSERT_SET_CONTEXT PERL_ARGS_ASSERT_SET_PADLIST
syn keyword xsMacro PERL_ARGS_ASSERT_SHARE_HEK
syn keyword xsMacro PERL_ARGS_ASSERT_SHARE_HEK_FLAGS
+syn keyword xsMacro PERL_ARGS_ASSERT_SHOULD_WARN_NL
syn keyword xsMacro PERL_ARGS_ASSERT_SIMPLIFY_SORT PERL_ARGS_ASSERT_SI_DUP
-syn keyword xsMacro PERL_ARGS_ASSERT_SKIPSPACE PERL_ARGS_ASSERT_SKIPSPACE0
-syn keyword xsMacro PERL_ARGS_ASSERT_SKIPSPACE1 PERL_ARGS_ASSERT_SKIPSPACE2
-syn keyword xsMacro PERL_ARGS_ASSERT_SLAB_FREE PERL_ARGS_ASSERT_SLAB_TO_RW
-syn keyword xsMacro PERL_ARGS_ASSERT_SOFTREF2XV PERL_ARGS_ASSERT_SORTCV
-syn keyword xsMacro PERL_ARGS_ASSERT_SORTCV_STACKED
+syn keyword xsMacro PERL_ARGS_ASSERT_SKIPSPACE_FLAGS
+syn keyword xsMacro PERL_ARGS_ASSERT_SLAB_FREE PERL_ARGS_ASSERT_SLAB_TO_RO
+syn keyword xsMacro PERL_ARGS_ASSERT_SLAB_TO_RW PERL_ARGS_ASSERT_SOFTREF2XV
+syn keyword xsMacro PERL_ARGS_ASSERT_SORTCV PERL_ARGS_ASSERT_SORTCV_STACKED
syn keyword xsMacro PERL_ARGS_ASSERT_SORTCV_XSUB PERL_ARGS_ASSERT_SORTSV
syn keyword xsMacro PERL_ARGS_ASSERT_SORTSV_FLAGS
syn keyword xsMacro PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL
+syn keyword xsMacro PERL_ARGS_ASSERT_SSC_ADD_RANGE PERL_ARGS_ASSERT_SSC_AND
+syn keyword xsMacro PERL_ARGS_ASSERT_SSC_ANYTHING
+syn keyword xsMacro PERL_ARGS_ASSERT_SSC_CLEAR_LOCALE
+syn keyword xsMacro PERL_ARGS_ASSERT_SSC_CP_AND PERL_ARGS_ASSERT_SSC_FINALIZE
+syn keyword xsMacro PERL_ARGS_ASSERT_SSC_INIT
+syn keyword xsMacro PERL_ARGS_ASSERT_SSC_INTERSECTION
+syn keyword xsMacro PERL_ARGS_ASSERT_SSC_IS_ANYTHING
+syn keyword xsMacro PERL_ARGS_ASSERT_SSC_IS_CP_POSIXL_INIT
+syn keyword xsMacro PERL_ARGS_ASSERT_SSC_OR PERL_ARGS_ASSERT_SSC_UNION
syn keyword xsMacro PERL_ARGS_ASSERT_SS_DUP PERL_ARGS_ASSERT_STACK_GROW
syn keyword xsMacro PERL_ARGS_ASSERT_START_GLOB
-syn keyword xsMacro PERL_ARGS_ASSERT_STASHPV_HVNAME_MATCH
syn keyword xsMacro PERL_ARGS_ASSERT_STDIZE_LOCALE
syn keyword xsMacro PERL_ARGS_ASSERT_STRIP_RETURN
syn keyword xsMacro PERL_ARGS_ASSERT_STR_TO_VERSION
@@ -2150,16 +2424,21 @@ syn keyword xsMacro PERL_ARGS_ASSERT_SUB_CRUSH_DEPTH
syn keyword xsMacro PERL_ARGS_ASSERT_SV_2BOOL_FLAGS PERL_ARGS_ASSERT_SV_2CV
syn keyword xsMacro PERL_ARGS_ASSERT_SV_2IO PERL_ARGS_ASSERT_SV_2IUV_COMMON
syn keyword xsMacro PERL_ARGS_ASSERT_SV_2IUV_NON_PRESERVE
-syn keyword xsMacro PERL_ARGS_ASSERT_SV_2NUM PERL_ARGS_ASSERT_SV_2PVBYTE
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_2IV PERL_ARGS_ASSERT_SV_2IV_FLAGS
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_2NUM PERL_ARGS_ASSERT_SV_2NV_FLAGS
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_2PV PERL_ARGS_ASSERT_SV_2PVBYTE
syn keyword xsMacro PERL_ARGS_ASSERT_SV_2PVBYTE_NOLEN
syn keyword xsMacro PERL_ARGS_ASSERT_SV_2PVUTF8
syn keyword xsMacro PERL_ARGS_ASSERT_SV_2PVUTF8_NOLEN
-syn keyword xsMacro PERL_ARGS_ASSERT_SV_2PV_NOLEN
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_2PV_FLAGS
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_2PV_NOLEN PERL_ARGS_ASSERT_SV_2UV
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_2UV_FLAGS
syn keyword xsMacro PERL_ARGS_ASSERT_SV_ADD_ARENA
syn keyword xsMacro PERL_ARGS_ASSERT_SV_ADD_BACKREF
syn keyword xsMacro PERL_ARGS_ASSERT_SV_BACKOFF PERL_ARGS_ASSERT_SV_BLESS
-syn keyword xsMacro PERL_ARGS_ASSERT_SV_CATPV PERL_ARGS_ASSERT_SV_CATPVF
-syn keyword xsMacro PERL_ARGS_ASSERT_SV_CATPVF_MG
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_BUF_TO_RO
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_BUF_TO_RW PERL_ARGS_ASSERT_SV_CATPV
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_CATPVF PERL_ARGS_ASSERT_SV_CATPVF_MG
syn keyword xsMacro PERL_ARGS_ASSERT_SV_CATPVF_MG_NOCONTEXT
syn keyword xsMacro PERL_ARGS_ASSERT_SV_CATPVF_NOCONTEXT
syn keyword xsMacro PERL_ARGS_ASSERT_SV_CATPVN
@@ -2168,37 +2447,40 @@ syn keyword xsMacro PERL_ARGS_ASSERT_SV_CATPVN_MG
syn keyword xsMacro PERL_ARGS_ASSERT_SV_CATPV_FLAGS
syn keyword xsMacro PERL_ARGS_ASSERT_SV_CATPV_MG PERL_ARGS_ASSERT_SV_CATSV
syn keyword xsMacro PERL_ARGS_ASSERT_SV_CATSV_FLAGS
-syn keyword xsMacro PERL_ARGS_ASSERT_SV_CATSV_MG PERL_ARGS_ASSERT_SV_CATXMLPV
-syn keyword xsMacro PERL_ARGS_ASSERT_SV_CATXMLPVN
-syn keyword xsMacro PERL_ARGS_ASSERT_SV_CATXMLSV
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_CATSV_MG
syn keyword xsMacro PERL_ARGS_ASSERT_SV_CAT_DECODE PERL_ARGS_ASSERT_SV_CHOP
syn keyword xsMacro PERL_ARGS_ASSERT_SV_CLEAR
syn keyword xsMacro PERL_ARGS_ASSERT_SV_COLLXFRM_FLAGS
-syn keyword xsMacro PERL_ARGS_ASSERT_SV_COMPILE_2OP
-syn keyword xsMacro PERL_ARGS_ASSERT_SV_COMPILE_2OP_IS_BROKEN
syn keyword xsMacro PERL_ARGS_ASSERT_SV_COPYPV
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_COPYPV_FLAGS
syn keyword xsMacro PERL_ARGS_ASSERT_SV_DEL_BACKREF
syn keyword xsMacro PERL_ARGS_ASSERT_SV_DERIVED_FROM
syn keyword xsMacro PERL_ARGS_ASSERT_SV_DERIVED_FROM_PV
syn keyword xsMacro PERL_ARGS_ASSERT_SV_DERIVED_FROM_PVN
syn keyword xsMacro PERL_ARGS_ASSERT_SV_DERIVED_FROM_SV
-syn keyword xsMacro PERL_ARGS_ASSERT_SV_DOES PERL_ARGS_ASSERT_SV_DOES_PV
-syn keyword xsMacro PERL_ARGS_ASSERT_SV_DOES_PVN PERL_ARGS_ASSERT_SV_DOES_SV
-syn keyword xsMacro PERL_ARGS_ASSERT_SV_DUMP PERL_ARGS_ASSERT_SV_DUP
-syn keyword xsMacro PERL_ARGS_ASSERT_SV_DUP_COMMON
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_DISPLAY PERL_ARGS_ASSERT_SV_DOES
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_DOES_PV PERL_ARGS_ASSERT_SV_DOES_PVN
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_DOES_SV PERL_ARGS_ASSERT_SV_DUMP
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_DUP PERL_ARGS_ASSERT_SV_DUP_COMMON
syn keyword xsMacro PERL_ARGS_ASSERT_SV_DUP_INC
syn keyword xsMacro PERL_ARGS_ASSERT_SV_DUP_INC_MULTIPLE
syn keyword xsMacro PERL_ARGS_ASSERT_SV_EXP_GROW
syn keyword xsMacro PERL_ARGS_ASSERT_SV_FORCE_NORMAL
syn keyword xsMacro PERL_ARGS_ASSERT_SV_FORCE_NORMAL_FLAGS
syn keyword xsMacro PERL_ARGS_ASSERT_SV_FREE2 PERL_ARGS_ASSERT_SV_GETS
-syn keyword xsMacro PERL_ARGS_ASSERT_SV_GROW PERL_ARGS_ASSERT_SV_INSERT
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_GET_BACKREFS PERL_ARGS_ASSERT_SV_GROW
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_INSERT
syn keyword xsMacro PERL_ARGS_ASSERT_SV_INSERT_FLAGS PERL_ARGS_ASSERT_SV_ISA
syn keyword xsMacro PERL_ARGS_ASSERT_SV_IV PERL_ARGS_ASSERT_SV_I_NCMP
syn keyword xsMacro PERL_ARGS_ASSERT_SV_KILL_BACKREFS
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_LEN_UTF8_NOMG
syn keyword xsMacro PERL_ARGS_ASSERT_SV_MAGIC PERL_ARGS_ASSERT_SV_MAGICEXT
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_MAGICEXT_MGLOB
syn keyword xsMacro PERL_ARGS_ASSERT_SV_NCMP PERL_ARGS_ASSERT_SV_NV
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_ONLY_TAINT_GMAGIC
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_OR_PV_POS_U2B
syn keyword xsMacro PERL_ARGS_ASSERT_SV_POS_B2U
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_POS_B2U_FLAGS
syn keyword xsMacro PERL_ARGS_ASSERT_SV_POS_B2U_MIDWAY
syn keyword xsMacro PERL_ARGS_ASSERT_SV_POS_U2B
syn keyword xsMacro PERL_ARGS_ASSERT_SV_POS_U2B_CACHED
@@ -2252,23 +2534,22 @@ syn keyword xsMacro PERL_ARGS_ASSERT_SV_UTF8_UPGRADE
syn keyword xsMacro PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_FLAGS_GROW
syn keyword xsMacro PERL_ARGS_ASSERT_SV_UV PERL_ARGS_ASSERT_SV_VCATPVF
syn keyword xsMacro PERL_ARGS_ASSERT_SV_VCATPVFN
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_VCATPVFN_FLAGS
syn keyword xsMacro PERL_ARGS_ASSERT_SV_VCATPVF_MG
syn keyword xsMacro PERL_ARGS_ASSERT_SV_VSETPVF PERL_ARGS_ASSERT_SV_VSETPVFN
syn keyword xsMacro PERL_ARGS_ASSERT_SV_VSETPVF_MG
-syn keyword xsMacro PERL_ARGS_ASSERT_SV_XMLPEEK PERL_ARGS_ASSERT_SWALLOW_BOM
-syn keyword xsMacro PERL_ARGS_ASSERT_SWASH_FETCH PERL_ARGS_ASSERT_SWASH_INIT
+syn keyword xsMacro PERL_ARGS_ASSERT_SWALLOW_BOM PERL_ARGS_ASSERT_SWASH_FETCH
+syn keyword xsMacro PERL_ARGS_ASSERT_SWASH_INIT
+syn keyword xsMacro PERL_ARGS_ASSERT_SWASH_SCAN_LIST_LINE
syn keyword xsMacro PERL_ARGS_ASSERT_SWATCH_GET PERL_ARGS_ASSERT_SYS_INIT
syn keyword xsMacro PERL_ARGS_ASSERT_SYS_INIT3
syn keyword xsMacro PERL_ARGS_ASSERT_SYS_INTERN_DUP
syn keyword xsMacro PERL_ARGS_ASSERT_TAINT_PROPER
syn keyword xsMacro PERL_ARGS_ASSERT_TIED_METHOD
-syn keyword xsMacro PERL_ARGS_ASSERT_TOKENIZE_USE PERL_ARGS_ASSERT_TOKEN_FREE
-syn keyword xsMacro PERL_ARGS_ASSERT_TOKEN_GETMAD PERL_ARGS_ASSERT_TOKEQ
+syn keyword xsMacro PERL_ARGS_ASSERT_TOKENIZE_USE PERL_ARGS_ASSERT_TOKEQ
syn keyword xsMacro PERL_ARGS_ASSERT_TOKEREPORT
syn keyword xsMacro PERL_ARGS_ASSERT_TOO_FEW_ARGUMENTS_PV
-syn keyword xsMacro PERL_ARGS_ASSERT_TOO_FEW_ARGUMENTS_SV
syn keyword xsMacro PERL_ARGS_ASSERT_TOO_MANY_ARGUMENTS_PV
-syn keyword xsMacro PERL_ARGS_ASSERT_TOO_MANY_ARGUMENTS_SV
syn keyword xsMacro PERL_ARGS_ASSERT_TO_BYTE_SUBSTR
syn keyword xsMacro PERL_ARGS_ASSERT_TO_UNI_LOWER
syn keyword xsMacro PERL_ARGS_ASSERT_TO_UNI_TITLE
@@ -2296,13 +2577,13 @@ syn keyword xsMacro PERL_ARGS_ASSERT_UTF8_MG_LEN_CACHE_UPDATE
syn keyword xsMacro PERL_ARGS_ASSERT_UTF8_MG_POS_CACHE_UPDATE
syn keyword xsMacro PERL_ARGS_ASSERT_UTF8_TO_BYTES
syn keyword xsMacro PERL_ARGS_ASSERT_UTF8_TO_UVCHR
-syn keyword xsMacro PERL_ARGS_ASSERT_UTF8_TO_UVCHR_BUF
syn keyword xsMacro PERL_ARGS_ASSERT_UTF8_TO_UVUNI
syn keyword xsMacro PERL_ARGS_ASSERT_UTF8_TO_UVUNI_BUF
-syn keyword xsMacro PERL_ARGS_ASSERT_UTILIZE PERL_ARGS_ASSERT_UVCHR_TO_UTF8
-syn keyword xsMacro PERL_ARGS_ASSERT_UVCHR_TO_UTF8_FLAGS
+syn keyword xsMacro PERL_ARGS_ASSERT_UTILIZE
+syn keyword xsMacro PERL_ARGS_ASSERT_UVOFFUNI_TO_UTF8_FLAGS
syn keyword xsMacro PERL_ARGS_ASSERT_UVUNI_TO_UTF8
syn keyword xsMacro PERL_ARGS_ASSERT_UVUNI_TO_UTF8_FLAGS
+syn keyword xsMacro PERL_ARGS_ASSERT_VALIDATE_PROTO
syn keyword xsMacro PERL_ARGS_ASSERT_VALIDATE_SUID
syn keyword xsMacro PERL_ARGS_ASSERT_VALID_UTF8_TO_UVCHR
syn keyword xsMacro PERL_ARGS_ASSERT_VALID_UTF8_TO_UVUNI
@@ -2320,33 +2601,40 @@ syn keyword xsMacro PERL_ARGS_ASSERT_WARN_NOCONTEXT PERL_ARGS_ASSERT_WARN_SV
syn keyword xsMacro PERL_ARGS_ASSERT_WATCH PERL_ARGS_ASSERT_WHICHSIG_PV
syn keyword xsMacro PERL_ARGS_ASSERT_WHICHSIG_PVN
syn keyword xsMacro PERL_ARGS_ASSERT_WHICHSIG_SV
+syn keyword xsMacro PERL_ARGS_ASSERT_WIN32_CROAK_NOT_IMPLEMENTED
syn keyword xsMacro PERL_ARGS_ASSERT_WITH_QUEUED_ERRORS
syn keyword xsMacro PERL_ARGS_ASSERT_WRAP_OP_CHECKER
syn keyword xsMacro PERL_ARGS_ASSERT_WRITE_TO_STDERR
-syn keyword xsMacro PERL_ARGS_ASSERT_XMLDUMP_ATTR
-syn keyword xsMacro PERL_ARGS_ASSERT_XMLDUMP_FORM
-syn keyword xsMacro PERL_ARGS_ASSERT_XMLDUMP_INDENT
-syn keyword xsMacro PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS
-syn keyword xsMacro PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS_PERL
-syn keyword xsMacro PERL_ARGS_ASSERT_XMLDUMP_SUB
-syn keyword xsMacro PERL_ARGS_ASSERT_XMLDUMP_SUB_PERL
-syn keyword xsMacro PERL_ARGS_ASSERT_XMLDUMP_VINDENT
-syn keyword xsMacro PERL_ARGS_ASSERT_XS_APIVERSION_BOOTCHECK
+syn keyword xsMacro PERL_ARGS_ASSERT_XS_HANDSHAKE
syn keyword xsMacro PERL_ARGS_ASSERT_XS_VERSION_BOOTCHECK
syn keyword xsMacro PERL_ARGS_ASSERT_YYERROR PERL_ARGS_ASSERT_YYERROR_PV
syn keyword xsMacro PERL_ARGS_ASSERT_YYERROR_PVN PERL_ARGS_ASSERT_YYWARN
syn keyword xsMacro PERL_ARGS_ASSERT__APPEND_RANGE_TO_INVLIST
syn keyword xsMacro PERL_ARGS_ASSERT__CORE_SWASH_INIT
+syn keyword xsMacro PERL_ARGS_ASSERT__GET_REGCLASS_NONBITMAP_DATA
+syn keyword xsMacro PERL_ARGS_ASSERT__GET_SWASH_INVLIST
syn keyword xsMacro PERL_ARGS_ASSERT__INVLIST_ARRAY_INIT
+syn keyword xsMacro PERL_ARGS_ASSERT__INVLIST_CONTAINS_CP
syn keyword xsMacro PERL_ARGS_ASSERT__INVLIST_CONTENTS
+syn keyword xsMacro PERL_ARGS_ASSERT__INVLIST_DUMP
syn keyword xsMacro PERL_ARGS_ASSERT__INVLIST_INTERSECTION_MAYBE_COMPLEMENT_2ND
syn keyword xsMacro PERL_ARGS_ASSERT__INVLIST_INVERT
-syn keyword xsMacro PERL_ARGS_ASSERT__INVLIST_INVERT_PROP
+syn keyword xsMacro PERL_ARGS_ASSERT__INVLIST_LEN
syn keyword xsMacro PERL_ARGS_ASSERT__INVLIST_POPULATE_SWATCH
+syn keyword xsMacro PERL_ARGS_ASSERT__INVLIST_SEARCH
syn keyword xsMacro PERL_ARGS_ASSERT__INVLIST_UNION_MAYBE_COMPLEMENT_2ND
-syn keyword xsMacro PERL_ARGS_ASSERT__IS_UTF8_QUOTEMETA
-syn keyword xsMacro PERL_ARGS_ASSERT__IS_UTF8__PERL_IDSTART
+syn keyword xsMacro PERL_ARGS_ASSERT__IS_UTF8_CHAR_SLOW
+syn keyword xsMacro PERL_ARGS_ASSERT__IS_UTF8_FOO
+syn keyword xsMacro PERL_ARGS_ASSERT__IS_UTF8_IDCONT
+syn keyword xsMacro PERL_ARGS_ASSERT__IS_UTF8_IDSTART
+syn keyword xsMacro PERL_ARGS_ASSERT__IS_UTF8_MARK
+syn keyword xsMacro PERL_ARGS_ASSERT__IS_UTF8_PERL_IDCONT
+syn keyword xsMacro PERL_ARGS_ASSERT__IS_UTF8_PERL_IDSTART
+syn keyword xsMacro PERL_ARGS_ASSERT__IS_UTF8_XIDCONT
+syn keyword xsMacro PERL_ARGS_ASSERT__IS_UTF8_XIDSTART
+syn keyword xsMacro PERL_ARGS_ASSERT__MAKE_EXACTF_INVLIST
syn keyword xsMacro PERL_ARGS_ASSERT__NEW_INVLIST_C_ARRAY
+syn keyword xsMacro PERL_ARGS_ASSERT__SETUP_CANNED_INVLIST
syn keyword xsMacro PERL_ARGS_ASSERT__SWASH_INVERSION_HASH
syn keyword xsMacro PERL_ARGS_ASSERT__SWASH_TO_INVLIST
syn keyword xsMacro PERL_ARGS_ASSERT__TO_FOLD_LATIN1
@@ -2357,59 +2645,62 @@ syn keyword xsMacro PERL_ARGS_ASSERT__TO_UTF8_LOWER_FLAGS
syn keyword xsMacro PERL_ARGS_ASSERT__TO_UTF8_TITLE_FLAGS
syn keyword xsMacro PERL_ARGS_ASSERT__TO_UTF8_UPPER_FLAGS PERL_ASYNC_CHECK
syn keyword xsMacro PERL_BITFIELD16 PERL_BITFIELD32 PERL_BITFIELD8
-syn keyword xsMacro PERL_CALLCONV PERL_CHECK_INITED PERL_CKDEF PERL_DEB
-syn keyword xsMacro PERL_DEBUG PERL_DEBUG_PAD PERL_DEBUG_PAD_ZERO
+syn keyword xsMacro PERL_CALLCONV PERL_CALLCONV_NO_RET PERL_CHECK_INITED
+syn keyword xsMacro PERL_CKDEF PERL_DEB PERL_DEB2 PERL_DEBUG PERL_DEBUG_PAD
+syn keyword xsMacro PERL_DEBUG_PAD_ZERO PERL_DECIMAL_VERSION
syn keyword xsMacro PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION
-syn keyword xsMacro PERL_DONT_CREATE_GVSV
+syn keyword xsMacro PERL_DONT_CREATE_GVSV PERL_DRAND48_QUAD
syn keyword xsMacro PERL_ENABLE_EXPERIMENTAL_REGEX_OPTIMISATIONS
syn keyword xsMacro PERL_ENABLE_EXTENDED_TRIE_OPTIMISATION
syn keyword xsMacro PERL_ENABLE_POSITIVE_ASSERTION_STUDY
-syn keyword xsMacro PERL_ENABLE_TRIE_OPTIMISATION PERL_EXIT_DESTRUCT_END
-syn keyword xsMacro PERL_EXIT_EXPECTED PERL_EXPORT_C PERL_FILE_IS_ABSOLUTE
-syn keyword xsMacro PERL_FILTER_EXISTS PERL_FLUSHALL_FOR_CHILD PERL_FPU_INIT
-syn keyword xsMacro PERL_FPU_POST_EXEC PERL_FPU_PRE_EXEC PERL_FS_VERSION
-syn keyword xsMacro PERL_FS_VER_FMT PERL_GCC_BRACE_GROUPS_FORBIDDEN
-syn keyword xsMacro PERL_GET_CONTEXT PERL_GET_INTERP PERL_GET_THX
-syn keyword xsMacro PERL_GET_VARS PERL_GIT_UNPUSHED_COMMITS
-syn keyword xsMacro PERL_GLOBAL_STRUCT PERL_GPROF_MONCONTROL PERL_HASH
-syn keyword xsMacro PERL_HASH_INTERNAL PERL_HASH_INTERNAL_ PERL_HASH_SEED
-syn keyword xsMacro PERL_HV_ARRAY_ALLOC_BYTES PERL_IMPLICIT_CONTEXT
-syn keyword xsMacro PERL_INTERPRETER_SIZE_UPTO_MEMBER PERL_INT_MAX
-syn keyword xsMacro PERL_INT_MIN PERL_LOADMOD_DENY PERL_LOADMOD_IMPORT_OPS
-syn keyword xsMacro PERL_LOADMOD_NOIMPORT PERL_LONG_MAX PERL_LONG_MIN
-syn keyword xsMacro PERL_MALLOC_WRAP PERL_MG_UFUNC PERL_MY_SNPRINTF_GUARDED
-syn keyword xsMacro PERL_MY_VSNPRINTF_GUARDED PERL_NEED_MY_BETOH16
-syn keyword xsMacro PERL_NEED_MY_BETOH32 PERL_NEED_MY_BETOHI
-syn keyword xsMacro PERL_NEED_MY_BETOHL PERL_NEED_MY_BETOHS
-syn keyword xsMacro PERL_NEED_MY_HTOBE16 PERL_NEED_MY_HTOBE32
-syn keyword xsMacro PERL_NEED_MY_HTOBEI PERL_NEED_MY_HTOBEL
-syn keyword xsMacro PERL_NEED_MY_HTOBES PERL_NEED_MY_HTOLE16
-syn keyword xsMacro PERL_NEED_MY_HTOLE32 PERL_NEED_MY_HTOLEI
-syn keyword xsMacro PERL_NEED_MY_HTOLEL PERL_NEED_MY_HTOLES
-syn keyword xsMacro PERL_NEED_MY_LETOH16 PERL_NEED_MY_LETOH32
-syn keyword xsMacro PERL_NEED_MY_LETOHI PERL_NEED_MY_LETOHL
-syn keyword xsMacro PERL_NEED_MY_LETOHS PERL_NO_DEV_RANDOM PERL_OBJECT_THIS
-syn keyword xsMacro PERL_OBJECT_THIS_ PERL_PADSEQ_INTRO PERL_PATCHNUM
+syn keyword xsMacro PERL_ENABLE_TRIE_OPTIMISATION PERL_EXIT_ABORT
+syn keyword xsMacro PERL_EXIT_DESTRUCT_END PERL_EXIT_EXPECTED PERL_EXIT_WARN
+syn keyword xsMacro PERL_EXPORT_C PERL_FILE_IS_ABSOLUTE PERL_FILTER_EXISTS
+syn keyword xsMacro PERL_FLUSHALL_FOR_CHILD PERL_FPU_INIT PERL_FPU_POST_EXEC
+syn keyword xsMacro PERL_FPU_PRE_EXEC PERL_FS_VERSION PERL_FS_VER_FMT
+syn keyword xsMacro PERL_GCC_BRACE_GROUPS_FORBIDDEN PERL_GET_CONTEXT
+syn keyword xsMacro PERL_GET_INTERP PERL_GET_THX PERL_GET_VARS
+syn keyword xsMacro PERL_GIT_UNPUSHED_COMMITS PERL_GLOBAL_STRUCT
+syn keyword xsMacro PERL_GPROF_MONCONTROL PERL_HASH PERL_HASH_DEFAULT_HvMAX
+syn keyword xsMacro PERL_HASH_FUNC PERL_HASH_FUNC_ONE_AT_A_TIME_HARD
+syn keyword xsMacro PERL_HASH_INTERNAL PERL_HASH_ITER_BUCKET
+syn keyword xsMacro PERL_HASH_RANDOMIZE_KEYS PERL_HASH_SEED
+syn keyword xsMacro PERL_HASH_SEED_BYTES PERL_HASH_WITH_SEED
+syn keyword xsMacro PERL_HV_ALLOC_AUX_SIZE PERL_HV_ARRAY_ALLOC_BYTES
+syn keyword xsMacro PERL_IMPLICIT_CONTEXT PERL_INTERPRETER_SIZE_UPTO_MEMBER
+syn keyword xsMacro PERL_INT_MAX PERL_INT_MIN PERL_LOADMOD_DENY
+syn keyword xsMacro PERL_LOADMOD_IMPORT_OPS PERL_LOADMOD_NOIMPORT
+syn keyword xsMacro PERL_LONG_MAX PERL_LONG_MIN PERL_MALLOC_WRAP
+syn keyword xsMacro PERL_MEMORY_DEBUG_HEADER_SIZE PERL_MG_UFUNC
+syn keyword xsMacro PERL_MY_SNPRINTF_GUARDED PERL_MY_SNPRINTF_POST_GUARD
+syn keyword xsMacro PERL_MY_VSNPRINTF_GUARDED PERL_MY_VSNPRINTF_POST_GUARD
+syn keyword xsMacro PERL_NEW_COPY_ON_WRITE PERL_NO_DEV_RANDOM
+syn keyword xsMacro PERL_OBJECT_THIS PERL_OBJECT_THIS_ PERL_PADNAME_MINIMAL
+syn keyword xsMacro PERL_PADSEQ_INTRO PERL_PATCHNUM PERL_POISON_EXPR
syn keyword xsMacro PERL_PPADDR_INITED PERL_PPDEF PERL_PRESERVE_IVUV
syn keyword xsMacro PERL_PRIeldbl PERL_PRIfldbl PERL_PRIgldbl
-syn keyword xsMacro PERL_PV_ESCAPE_ALL PERL_PV_ESCAPE_FIRSTCHAR
-syn keyword xsMacro PERL_PV_ESCAPE_NOBACKSLASH PERL_PV_ESCAPE_NOCLEAR
-syn keyword xsMacro PERL_PV_ESCAPE_NONASCII PERL_PV_ESCAPE_QUOTE
-syn keyword xsMacro PERL_PV_ESCAPE_RE PERL_PV_ESCAPE_UNI
+syn keyword xsMacro PERL_PV_ESCAPE_ALL PERL_PV_ESCAPE_DWIM
+syn keyword xsMacro PERL_PV_ESCAPE_FIRSTCHAR PERL_PV_ESCAPE_NOBACKSLASH
+syn keyword xsMacro PERL_PV_ESCAPE_NOCLEAR PERL_PV_ESCAPE_NONASCII
+syn keyword xsMacro PERL_PV_ESCAPE_QUOTE PERL_PV_ESCAPE_RE PERL_PV_ESCAPE_UNI
syn keyword xsMacro PERL_PV_ESCAPE_UNI_DETECT PERL_PV_PRETTY_DUMP
-syn keyword xsMacro PERL_PV_PRETTY_ELLIPSES PERL_PV_PRETTY_LTGT
-syn keyword xsMacro PERL_PV_PRETTY_NOCLEAR PERL_PV_PRETTY_QUOTE
-syn keyword xsMacro PERL_PV_PRETTY_REGPROP PERL_QUAD_MAX PERL_QUAD_MIN
-syn keyword xsMacro PERL_REENTR_API PERL_REGMATCH_SLAB_SLOTS PERL_REVISION
+syn keyword xsMacro PERL_PV_PRETTY_ELLIPSES PERL_PV_PRETTY_EXACTSIZE
+syn keyword xsMacro PERL_PV_PRETTY_LTGT PERL_PV_PRETTY_NOCLEAR
+syn keyword xsMacro PERL_PV_PRETTY_QUOTE PERL_PV_PRETTY_REGPROP PERL_QUAD_MAX
+syn keyword xsMacro PERL_QUAD_MIN PERL_REENTR_API PERL_REGMATCH_SLAB_SLOTS
+syn keyword xsMacro PERL_RELOCATABLE_INC PERL_REVISION PERL_SAWAMPERSAND
syn keyword xsMacro PERL_SCAN_ALLOW_UNDERSCORES PERL_SCAN_DISALLOW_PREFIX
syn keyword xsMacro PERL_SCAN_GREATER_THAN_UV_MAX PERL_SCAN_SILENT_ILLDIGIT
-syn keyword xsMacro PERL_SCAN_SILENT_NON_PORTABLE PERL_SCNfldbl
-syn keyword xsMacro PERL_SCRIPT_MODE PERL_SET_CONTEXT PERL_SET_INTERP
-syn keyword xsMacro PERL_SET_PHASE PERL_SET_THX PERL_SHORT_MAX PERL_SHORT_MIN
-syn keyword xsMacro PERL_SIGNALS_UNSAFE_FLAG PERL_STACK_OVERFLOW_CHECK
-syn keyword xsMacro PERL_STATIC_INLINE PERL_STRLEN_EXPAND_SHIFT
-syn keyword xsMacro PERL_STRLEN_ROUNDUP PERL_STRLEN_ROUNDUP_QUANTUM
-syn keyword xsMacro PERL_SUBVERSION PERL_SUB_DEPTH_WARN PERL_SYS_INIT
+syn keyword xsMacro PERL_SCAN_SILENT_NON_PORTABLE PERL_SCAN_TRAILING
+syn keyword xsMacro PERL_SCNfldbl PERL_SCRIPT_MODE PERL_SEEN_HV_FUNC_H
+syn keyword xsMacro PERL_SET_CONTEXT PERL_SET_INTERP PERL_SET_PHASE
+syn keyword xsMacro PERL_SET_THX PERL_SHORT_MAX PERL_SHORT_MIN
+syn keyword xsMacro PERL_SIGNALS_UNSAFE_FLAG PERL_SNPRINTF_CHECK
+syn keyword xsMacro PERL_STACK_OVERFLOW_CHECK PERL_STATIC_INLINE
+syn keyword xsMacro PERL_STATIC_INLINE_NO_RET PERL_STATIC_NO_RET
+syn keyword xsMacro PERL_STRLEN_EXPAND_SHIFT PERL_STRLEN_ROUNDUP
+syn keyword xsMacro PERL_STRLEN_ROUNDUP_QUANTUM PERL_SUBVERSION
+syn keyword xsMacro PERL_SUB_DEPTH_WARN PERL_SYS_FPU_INIT PERL_SYS_INIT
syn keyword xsMacro PERL_SYS_INIT3 PERL_SYS_INIT3_BODY PERL_SYS_INIT_BODY
syn keyword xsMacro PERL_SYS_TERM PERL_SYS_TERM_BODY PERL_TARGETARCH
syn keyword xsMacro PERL_UCHAR_MAX PERL_UCHAR_MIN PERL_UINT_MAX PERL_UINT_MIN
@@ -2427,49 +2718,47 @@ syn keyword xsMacro PERL_UNICODE_STD_FLAG PERL_UNICODE_UTF8CACHEASSERT
syn keyword xsMacro PERL_UNICODE_UTF8CACHEASSERT_FLAG
syn keyword xsMacro PERL_UNICODE_WIDESYSCALLS PERL_UNICODE_WIDESYSCALLS_FLAG
syn keyword xsMacro PERL_UNUSED_ARG PERL_UNUSED_CONTEXT PERL_UNUSED_DECL
-syn keyword xsMacro PERL_UNUSED_VAR PERL_UQUAD_MAX PERL_UQUAD_MIN
-syn keyword xsMacro PERL_USES_PL_PIDSTATUS PERL_USE_GCC_BRACE_GROUPS
-syn keyword xsMacro PERL_USHORT_MAX PERL_USHORT_MIN PERL_VERSION
-syn keyword xsMacro PERL_VERSION_STRING PERL_WAIT_FOR_CHILDREN
-syn keyword xsMacro PERL_WARNHOOK_FATAL PERL_WRITE_MSG_TO_CONSOLE
-syn keyword xsMacro PERL_XS_EXPORT_C PHASE_CHANGE_PROBE PHOSTNAME
-syn keyword xsMacro PIPESOCK_MODE PIPE_OPEN_MODE PLUGEXPR PLUGSTMT PLUS
-syn keyword xsMacro PL_ASCII PL_AboveLatin1 PL_Argv PL_Cmd PL_DBcv PL_DBgv
-syn keyword xsMacro PL_DBline PL_DBsignal PL_DBsingle PL_DBsub PL_DBtrace
-syn keyword xsMacro PL_Dir PL_Env PL_Gappctx PL_Gcheck PL_Gcheck_mutex
-syn keyword xsMacro PL_Gcsighandlerp PL_Gcurinterp PL_Gdo_undump
-syn keyword xsMacro PL_Gdollarzero_mutex PL_Gfold_locale PL_Ghints_mutex
-syn keyword xsMacro PL_Gkeyword_plugin PL_Gmalloc_mutex PL_Gmmap_page_size
-syn keyword xsMacro PL_Gmy_ctx_mutex PL_Gmy_cxt_index PL_Gop_mutex PL_Gop_seq
-syn keyword xsMacro PL_Gop_sequence PL_Gperlio_debug_fd PL_Gperlio_fd_refcnt
+syn keyword xsMacro PERL_UNUSED_RESULT PERL_UNUSED_VAR PERL_UQUAD_MAX
+syn keyword xsMacro PERL_UQUAD_MIN PERL_USES_PL_PIDSTATUS
+syn keyword xsMacro PERL_USE_GCC_BRACE_GROUPS PERL_USHORT_MAX PERL_USHORT_MIN
+syn keyword xsMacro PERL_VERSION PERL_VERSION_DECIMAL PERL_VERSION_GE
+syn keyword xsMacro PERL_VERSION_LT PERL_VERSION_STRING
+syn keyword xsMacro PERL_WAIT_FOR_CHILDREN PERL_WARNHOOK_FATAL
+syn keyword xsMacro PERL_WRITE_MSG_TO_CONSOLE PERL_XS_EXPORT_C
+syn keyword xsMacro PHASE_CHANGE_PROBE PHOSTNAME PIPESOCK_MODE PIPE_OPEN_MODE
+syn keyword xsMacro PLUGEXPR PLUGSTMT PLUS PL_AboveLatin1 PL_Argv PL_Cmd
+syn keyword xsMacro PL_DBcontrol PL_DBcv PL_DBgv PL_DBline PL_DBsignal
+syn keyword xsMacro PL_DBsignal_iv PL_DBsingle PL_DBsingle_iv PL_DBsub
+syn keyword xsMacro PL_DBtrace PL_DBtrace_iv PL_Dir PL_Env PL_GCB_invlist
+syn keyword xsMacro PL_Gappctx PL_Gcheck PL_Gcheck_mutex PL_Gcsighandlerp
+syn keyword xsMacro PL_Gcurinterp PL_Gdo_undump PL_Gdollarzero_mutex
+syn keyword xsMacro PL_Gfold_locale PL_Ghash_seed PL_Ghash_seed_set
+syn keyword xsMacro PL_Ghints_mutex PL_Gkeyword_plugin PL_Gmalloc_mutex
+syn keyword xsMacro PL_Gmmap_page_size PL_Gmy_ctx_mutex PL_Gmy_cxt_index
+syn keyword xsMacro PL_Gop_mutex PL_Gop_seq PL_Gop_sequence
+syn keyword xsMacro PL_Gperlio_debug_fd PL_Gperlio_fd_refcnt
syn keyword xsMacro PL_Gperlio_fd_refcnt_size PL_Gperlio_mutex PL_Gppaddr
syn keyword xsMacro PL_Gsh_path PL_Gsig_defaulting PL_Gsig_handlers_initted
syn keyword xsMacro PL_Gsig_ignoring PL_Gsig_trapped PL_Gsigfpe_saved
syn keyword xsMacro PL_Gsv_placeholder PL_Gthr_key PL_Gtimesbase
syn keyword xsMacro PL_Guse_safe_putenv PL_Gveto_cleanup PL_Gwatch_pvx
-syn keyword xsMacro PL_L1Cased PL_L1PosixAlnum PL_L1PosixAlpha
-syn keyword xsMacro PL_L1PosixGraph PL_L1PosixLower PL_L1PosixPrint
-syn keyword xsMacro PL_L1PosixPunct PL_L1PosixUpper PL_L1PosixWord PL_LIO
-syn keyword xsMacro PL_Latin1 PL_Mem PL_MemParse PL_MemShared
-syn keyword xsMacro PL_OP_SLAB_ALLOC PL_OpPtr PL_OpSlab PL_OpSpace
-syn keyword xsMacro PL_PerlSpace PL_PosixAlnum PL_PosixAlpha PL_PosixBlank
-syn keyword xsMacro PL_PosixCntrl PL_PosixDigit PL_PosixGraph PL_PosixLower
-syn keyword xsMacro PL_PosixPrint PL_PosixPunct PL_PosixSpace PL_PosixUpper
-syn keyword xsMacro PL_PosixWord PL_PosixXDigit PL_Proc PL_Sock PL_StdIO
-syn keyword xsMacro PL_Sv PL_VertSpace PL_XPerlSpace PL_XPosixBlank
-syn keyword xsMacro PL_XPosixCntrl PL_XPosixSpace PL_XPosixXDigit PL_Xpv
-syn keyword xsMacro PL_amagic_generation PL_an PL_apiversion PL_appctx
-syn keyword xsMacro PL_argvgv PL_argvout_stack PL_argvoutgv PL_basetime
-syn keyword xsMacro PL_beginav PL_beginav_save PL_blockhooks PL_body_arenas
-syn keyword xsMacro PL_body_roots PL_bodytarget PL_bostr PL_breakable_sub_gen
+syn keyword xsMacro PL_HASH_RAND_BITS_ENABLED PL_HasMultiCharFold PL_InBitmap
+syn keyword xsMacro PL_LIO PL_Latin1 PL_Mem PL_MemParse PL_MemShared
+syn keyword xsMacro PL_NonL1NonFinalFold PL_Posix_ptrs PL_Proc
+syn keyword xsMacro PL_RANDOM_STATE_TYPE PL_SB_invlist PL_Sock PL_StdIO PL_Sv
+syn keyword xsMacro PL_UpperLatin1 PL_WB_invlist PL_XPosix_ptrs PL_Xpv
+syn keyword xsMacro PL_amagic_generation PL_an PL_appctx PL_argvgv
+syn keyword xsMacro PL_argvout_stack PL_argvoutgv PL_basetime PL_beginav
+syn keyword xsMacro PL_beginav_save PL_blockhooks PL_body_arenas
+syn keyword xsMacro PL_body_roots PL_bodytarget PL_breakable_sub_gen
syn keyword xsMacro PL_check_mutex PL_checkav PL_checkav_save PL_chopset
syn keyword xsMacro PL_clocktick PL_collation_ix PL_collation_name
syn keyword xsMacro PL_collation_standard PL_collxfrm_base PL_collxfrm_mult
syn keyword xsMacro PL_colors PL_colorset PL_compcv PL_compiling PL_comppad
syn keyword xsMacro PL_comppad_name PL_comppad_name_fill
-syn keyword xsMacro PL_comppad_name_floor PL_cop_seqmax PL_cryptseen
-syn keyword xsMacro PL_cshlen PL_csighandlerp PL_curcop PL_curcopdb
-syn keyword xsMacro PL_curinterp PL_curpad PL_curpm PL_curstack
+syn keyword xsMacro PL_comppad_name_floor PL_constpadix PL_cop_seqmax
+syn keyword xsMacro PL_cryptseen PL_cshlen PL_csighandlerp PL_curcop
+syn keyword xsMacro PL_curcopdb PL_curinterp PL_curpad PL_curpm PL_curstack
syn keyword xsMacro PL_curstackinfo PL_curstash PL_curstname
syn keyword xsMacro PL_custom_op_descs PL_custom_op_names PL_custom_ops
syn keyword xsMacro PL_cv_has_eval PL_dbargs PL_debstash PL_debug
@@ -2482,133 +2771,139 @@ syn keyword xsMacro PL_dumpindent PL_e_script PL_efloatbuf PL_efloatsize
syn keyword xsMacro PL_encoding PL_endav PL_envgv PL_errgv PL_errors
syn keyword xsMacro PL_eval_root PL_eval_start PL_evalseq PL_exit_flags
syn keyword xsMacro PL_exitlist PL_exitlistlen PL_fdpid PL_filemode
-syn keyword xsMacro PL_firstgv PL_forkprocess PL_formfeed PL_formtarget
-syn keyword xsMacro PL_generation PL_gensym PL_glob_index PL_globalstash
-syn keyword xsMacro PL_globhook PL_hash_seed PL_hintgv PL_hints
-syn keyword xsMacro PL_hints_mutex PL_hv_fetch_ent_mh PL_in_clean_all
-syn keyword xsMacro PL_in_clean_objs PL_in_eval PL_in_load_module PL_incgv
+syn keyword xsMacro PL_firstgv PL_forkprocess PL_formtarget PL_generation
+syn keyword xsMacro PL_gensym PL_globalstash PL_globhook PL_hash_rand_bits
+syn keyword xsMacro PL_hash_rand_bits_enabled PL_hash_seed PL_hash_seed_set
+syn keyword xsMacro PL_hintgv PL_hints PL_hints_mutex PL_hv_fetch_ent_mh
+syn keyword xsMacro PL_in_clean_all PL_in_clean_objs PL_in_eval
+syn keyword xsMacro PL_in_load_module PL_in_utf8_CTYPE_locale PL_incgv
syn keyword xsMacro PL_initav PL_inplace PL_isarev PL_keyword_plugin
syn keyword xsMacro PL_known_layers PL_last_in_gv PL_last_swash_hv
syn keyword xsMacro PL_last_swash_key PL_last_swash_klen PL_last_swash_slen
syn keyword xsMacro PL_last_swash_tmps PL_lastfd PL_lastgotoprobe
-syn keyword xsMacro PL_laststatval PL_laststype PL_localizing PL_localpatches
-syn keyword xsMacro PL_lockhook PL_madskills PL_main_cv PL_main_root
+syn keyword xsMacro PL_laststatval PL_laststype PL_lex_encoding PL_localizing
+syn keyword xsMacro PL_localpatches PL_lockhook PL_main_cv PL_main_root
syn keyword xsMacro PL_main_start PL_mainstack PL_malloc_mutex PL_markstack
syn keyword xsMacro PL_markstack_max PL_markstack_ptr PL_max_intro_pending
syn keyword xsMacro PL_maxo PL_maxsysfd PL_memory_debug_header PL_mess_sv
syn keyword xsMacro PL_min_intro_pending PL_minus_E PL_minus_F PL_minus_a
syn keyword xsMacro PL_minus_c PL_minus_l PL_minus_n PL_minus_p
syn keyword xsMacro PL_mmap_page_size PL_modcount PL_modglobal
-syn keyword xsMacro PL_my_ctx_mutex PL_my_cxt_index PL_my_cxt_keys
-syn keyword xsMacro PL_my_cxt_list PL_my_cxt_size PL_nomemok PL_nrs
+syn keyword xsMacro PL_multideref_pc PL_my_ctx_mutex PL_my_cxt_index
+syn keyword xsMacro PL_my_cxt_keys PL_my_cxt_list PL_my_cxt_size PL_nomemok
syn keyword xsMacro PL_numeric_local PL_numeric_name PL_numeric_radix_sv
-syn keyword xsMacro PL_numeric_standard PL_ofsgv PL_oldname PL_op PL_op_mask
-syn keyword xsMacro PL_op_mutex PL_op_seq PL_op_sequence PL_opfreehook
-syn keyword xsMacro PL_opsave PL_origalen PL_origargc PL_origargv
-syn keyword xsMacro PL_origenviron PL_origfilename PL_ors_sv PL_osname
-syn keyword xsMacro PL_pad_reset_pending PL_padix PL_padix_floor PL_parser
-syn keyword xsMacro PL_patchlevel PL_peepp PL_perl_destruct_level PL_perldb
-syn keyword xsMacro PL_perlio PL_perlio_debug_fd PL_perlio_fd_refcnt
-syn keyword xsMacro PL_perlio_fd_refcnt_size PL_perlio_mutex PL_phase
-syn keyword xsMacro PL_pidstatus PL_preambleav PL_profiledata PL_psig_name
-syn keyword xsMacro PL_psig_pend PL_psig_ptr PL_ptr_table PL_reentrant_buffer
-syn keyword xsMacro PL_reentrant_retint PL_reg_curpm PL_reg_eval_set
-syn keyword xsMacro PL_reg_flags PL_reg_leftiter PL_reg_magic
-syn keyword xsMacro PL_reg_match_utf8 PL_reg_maxiter PL_reg_oldcurpm
-syn keyword xsMacro PL_reg_oldpos PL_reg_oldsaved PL_reg_oldsavedlen
-syn keyword xsMacro PL_reg_poscache PL_reg_poscache_size PL_reg_start_tmp
-syn keyword xsMacro PL_reg_start_tmpl PL_reg_starttry PL_reg_state
-syn keyword xsMacro PL_regdummy PL_regeol PL_regex_pad PL_regex_padav
-syn keyword xsMacro PL_reginput PL_reginterp_cnt PL_registered_mros
-syn keyword xsMacro PL_reglastcloseparen PL_reglastparen PL_regmatch_slab
-syn keyword xsMacro PL_regmatch_state PL_regoffs PL_regsize PL_rehash_seed
-syn keyword xsMacro PL_rehash_seed_set PL_replgv PL_restartjmpenv
-syn keyword xsMacro PL_restartop PL_rpeepp PL_rs PL_runops PL_savebegin
-syn keyword xsMacro PL_savestack PL_savestack_ix PL_savestack_max
+syn keyword xsMacro PL_numeric_standard PL_ofsgv PL_oldname PL_op
+syn keyword xsMacro PL_op_exec_cnt PL_op_mask PL_op_mutex PL_op_seq
+syn keyword xsMacro PL_op_sequence PL_opfreehook PL_origalen PL_origargc
+syn keyword xsMacro PL_origargv PL_origenviron PL_origfilename PL_ors_sv
+syn keyword xsMacro PL_osname PL_pad_reset_pending PL_padix PL_padix_floor
+syn keyword xsMacro PL_padlist_generation PL_padname_const PL_padname_undef
+syn keyword xsMacro PL_parser PL_patchlevel PL_peepp PL_perl_destruct_level
+syn keyword xsMacro PL_perldb PL_perlio PL_perlio_debug_fd
+syn keyword xsMacro PL_perlio_fd_refcnt PL_perlio_fd_refcnt_size
+syn keyword xsMacro PL_perlio_mutex PL_phase PL_pidstatus PL_preambleav
+syn keyword xsMacro PL_profiledata PL_psig_name PL_psig_pend PL_psig_ptr
+syn keyword xsMacro PL_ptr_table PL_random_state PL_reentrant_buffer
+syn keyword xsMacro PL_reentrant_retint PL_reg_curpm PL_regex_pad
+syn keyword xsMacro PL_regex_padav PL_registered_mros PL_regmatch_slab
+syn keyword xsMacro PL_regmatch_state PL_replgv PL_restartjmpenv PL_restartop
+syn keyword xsMacro PL_rpeepp PL_rs PL_runops PL_savebegin PL_savestack
+syn keyword xsMacro PL_savestack_ix PL_savestack_max PL_sawalias
syn keyword xsMacro PL_sawampersand PL_scopestack PL_scopestack_ix
syn keyword xsMacro PL_scopestack_max PL_scopestack_name PL_secondgv
syn keyword xsMacro PL_sharehook PL_sig_defaulting PL_sig_handlers_initted
syn keyword xsMacro PL_sig_ignoring PL_sig_pending PL_sig_trapped
syn keyword xsMacro PL_sigfpe_saved PL_sighandlerp PL_signalhook PL_signals
-syn keyword xsMacro PL_slab_count PL_slabs PL_sort_RealCmp PL_sortcop
-syn keyword xsMacro PL_sortstash PL_splitstr PL_srand_called PL_stack_base
-syn keyword xsMacro PL_stack_max PL_stack_sp PL_start_env PL_stashcache
-syn keyword xsMacro PL_statbuf PL_statcache PL_statgv PL_statname
-syn keyword xsMacro PL_statusvalue PL_statusvalue_posix PL_statusvalue_vms
-syn keyword xsMacro PL_stderrgv PL_stdingv PL_strtab PL_sub_generation
-syn keyword xsMacro PL_subline PL_subname PL_sv_arenaroot PL_sv_count
-syn keyword xsMacro PL_sv_no PL_sv_objcount PL_sv_placeholder PL_sv_root
-syn keyword xsMacro PL_sv_serial PL_sv_undef PL_sv_yes PL_sys_intern
-syn keyword xsMacro PL_taint_warn PL_tainted PL_tainting PL_thr_key
-syn keyword xsMacro PL_threadhook PL_timesbase PL_timesbuf PL_tmps_floor
-syn keyword xsMacro PL_tmps_ix PL_tmps_max PL_tmps_stack PL_top_env
-syn keyword xsMacro PL_toptarget PL_unicode PL_unitcheckav
+syn keyword xsMacro PL_sort_RealCmp PL_sortcop PL_sortstash PL_splitstr
+syn keyword xsMacro PL_srand_called PL_stack_base PL_stack_max PL_stack_sp
+syn keyword xsMacro PL_start_env PL_stashcache PL_stashpad PL_stashpadix
+syn keyword xsMacro PL_stashpadmax PL_statbuf PL_statcache PL_statgv
+syn keyword xsMacro PL_statname PL_statusvalue PL_statusvalue_posix
+syn keyword xsMacro PL_statusvalue_vms PL_stderrgv PL_stdingv PL_strtab
+syn keyword xsMacro PL_sub_generation PL_subline PL_subname PL_sv_arenaroot
+syn keyword xsMacro PL_sv_consts PL_sv_count PL_sv_no PL_sv_placeholder
+syn keyword xsMacro PL_sv_root PL_sv_serial PL_sv_undef PL_sv_yes
+syn keyword xsMacro PL_sys_intern PL_taint_warn PL_tainted PL_tainting
+syn keyword xsMacro PL_thr_key PL_threadhook PL_timesbase PL_timesbuf
+syn keyword xsMacro PL_tmps_floor PL_tmps_ix PL_tmps_max PL_tmps_stack
+syn keyword xsMacro PL_top_env PL_toptarget PL_unicode PL_unitcheckav
syn keyword xsMacro PL_unitcheckav_save PL_unlockhook PL_unsafe
-syn keyword xsMacro PL_use_safe_putenv PL_utf8_X_L PL_utf8_X_LV PL_utf8_X_LVT
-syn keyword xsMacro PL_utf8_X_LV_LVT_V PL_utf8_X_T PL_utf8_X_V
-syn keyword xsMacro PL_utf8_X_begin PL_utf8_X_extend PL_utf8_X_non_hangul
-syn keyword xsMacro PL_utf8_X_prepend PL_utf8_alnum PL_utf8_alpha
-syn keyword xsMacro PL_utf8_digit PL_utf8_foldable PL_utf8_foldclosures
-syn keyword xsMacro PL_utf8_graph PL_utf8_idcont PL_utf8_idstart
-syn keyword xsMacro PL_utf8_lower PL_utf8_mark PL_utf8_perl_idstart
-syn keyword xsMacro PL_utf8_print PL_utf8_punct PL_utf8_quotemeta
-syn keyword xsMacro PL_utf8_space PL_utf8_tofold PL_utf8_tolower
-syn keyword xsMacro PL_utf8_totitle PL_utf8_toupper PL_utf8_upper
-syn keyword xsMacro PL_utf8_xdigit PL_utf8_xidcont PL_utf8_xidstart
-syn keyword xsMacro PL_utf8cache PL_utf8locale PL_veto_cleanup PL_vtbl_amagic
-syn keyword xsMacro PL_vtbl_amagicelem PL_vtbl_arylen PL_vtbl_arylen_p
-syn keyword xsMacro PL_vtbl_backref PL_vtbl_bm PL_vtbl_collxfrm
-syn keyword xsMacro PL_vtbl_dbline PL_vtbl_defelem PL_vtbl_env
-syn keyword xsMacro PL_vtbl_envelem PL_vtbl_fm PL_vtbl_hints
-syn keyword xsMacro PL_vtbl_hintselem PL_vtbl_isa PL_vtbl_isaelem
-syn keyword xsMacro PL_vtbl_mglob PL_vtbl_nkeys PL_vtbl_ovrld PL_vtbl_pack
-syn keyword xsMacro PL_vtbl_packelem PL_vtbl_pos PL_vtbl_regdata
-syn keyword xsMacro PL_vtbl_regdatum PL_vtbl_regexp PL_vtbl_sigelem
-syn keyword xsMacro PL_vtbl_substr PL_vtbl_sv PL_vtbl_taint PL_vtbl_utf8
-syn keyword xsMacro PL_vtbl_uvar PL_vtbl_vec PL_vtbl_vstring PL_warnhook
-syn keyword xsMacro PL_watch_pvx PL_watchaddr PL_watchok PL_xmlfp PMFUNC
-syn keyword xsMacro PM_GETRE PM_SETRE PMf_BASE_SHIFT PMf_COMPILETIME
-syn keyword xsMacro PMf_CONST PMf_CONTINUE PMf_EVAL PMf_EXTENDED PMf_FOLD
-syn keyword xsMacro PMf_GLOBAL PMf_KEEP PMf_KEEPCOPY PMf_MAYBE_CONST
-syn keyword xsMacro PMf_MULTILINE PMf_NONDESTRUCT PMf_ONCE PMf_RETAINT
-syn keyword xsMacro PMf_SINGLELINE PMf_USED POPBLOCK POPEVAL POPFORMAT
+syn keyword xsMacro PL_use_safe_putenv PL_utf8_charname_begin
+syn keyword xsMacro PL_utf8_charname_continue PL_utf8_foldable
+syn keyword xsMacro PL_utf8_foldclosures PL_utf8_idcont PL_utf8_idstart
+syn keyword xsMacro PL_utf8_mark PL_utf8_perl_idcont PL_utf8_perl_idstart
+syn keyword xsMacro PL_utf8_swash_ptrs PL_utf8_tofold PL_utf8_tolower
+syn keyword xsMacro PL_utf8_totitle PL_utf8_toupper PL_utf8_xidcont
+syn keyword xsMacro PL_utf8_xidstart PL_utf8cache PL_utf8locale
+syn keyword xsMacro PL_veto_cleanup PL_vtbl_arylen PL_vtbl_arylen_p
+syn keyword xsMacro PL_vtbl_backref PL_vtbl_bm PL_vtbl_checkcall
+syn keyword xsMacro PL_vtbl_collxfrm PL_vtbl_dbline PL_vtbl_debugvar
+syn keyword xsMacro PL_vtbl_defelem PL_vtbl_env PL_vtbl_envelem PL_vtbl_fm
+syn keyword xsMacro PL_vtbl_hints PL_vtbl_hintselem PL_vtbl_isa
+syn keyword xsMacro PL_vtbl_isaelem PL_vtbl_lvref PL_vtbl_mglob PL_vtbl_nkeys
+syn keyword xsMacro PL_vtbl_ovrld PL_vtbl_pack PL_vtbl_packelem PL_vtbl_pos
+syn keyword xsMacro PL_vtbl_regdata PL_vtbl_regdatum PL_vtbl_regexp
+syn keyword xsMacro PL_vtbl_sigelem PL_vtbl_substr PL_vtbl_sv PL_vtbl_taint
+syn keyword xsMacro PL_vtbl_utf8 PL_vtbl_uvar PL_vtbl_vec PL_warn_locale
+syn keyword xsMacro PL_warnhook PL_watch_pvx PL_watchaddr PL_watchok
+syn keyword xsMacro PL_xsubfilename PMFUNC PM_GETRE PM_SETRE PMf_BASE_SHIFT
+syn keyword xsMacro PMf_CHARSET PMf_CODELIST_PRIVATE PMf_CONST PMf_CONTINUE
+syn keyword xsMacro PMf_EVAL PMf_EXTENDED PMf_EXTENDED_MORE PMf_FOLD
+syn keyword xsMacro PMf_GLOBAL PMf_HAS_CV PMf_IS_QR PMf_KEEP PMf_KEEPCOPY
+syn keyword xsMacro PMf_MULTILINE PMf_NOCAPTURE PMf_NONDESTRUCT PMf_ONCE
+syn keyword xsMacro PMf_RETAINT PMf_SINGLELINE PMf_SPLIT PMf_STRICT PMf_USED
+syn keyword xsMacro PMf_USE_RE_EVAL PNf PNfARG POPBLOCK POPEVAL POPFORMAT
syn keyword xsMacro POPLOOP POPMARK POPSTACK POPSTACK_TO POPSUB POPSUBST
syn keyword xsMacro POP_MULTICALL POP_SAVEARRAY POPi POPl POPn POPp POPpbytex
-syn keyword xsMacro POPpconstx POPpx POPq POPs POPu POPul POPuq POSTDEC
-syn keyword xsMacro POSTINC POWOP PP PREC_LOW PREDEC PREGf_CUTGROUP_SEEN
-syn keyword xsMacro PREGf_IMPLICIT PREGf_NAUGHTY PREGf_SKIP
-syn keyword xsMacro PREGf_VERBARG_SEEN PREINC PREVOPER PRINTF_FORMAT_NULL_OK
-syn keyword xsMacro PRIVATEREF PRIVLIB PRIVLIB_EXP PRIVSHIFT PROCSELFEXE_PATH
-syn keyword xsMacro PRUNE PSEUDO PTHREAD_ATFORK PTHREAD_ATTR_SETDETACHSTATE
+syn keyword xsMacro POPpconstx POPpx POPs POPu POPul POSIXA POSIXD POSIXL
+syn keyword xsMacro POSIXU POSIX_CC_COUNT POSIX_SWASH_COUNT POSTDEC POSTINC
+syn keyword xsMacro POSTJOIN POWOP PP PREC_LOW PREDEC PREGf_ANCH
+syn keyword xsMacro PREGf_ANCH_GPOS PREGf_ANCH_MBOL PREGf_ANCH_SBOL
+syn keyword xsMacro PREGf_CANY_SEEN PREGf_CUTGROUP_SEEN PREGf_GPOS_FLOAT
+syn keyword xsMacro PREGf_GPOS_SEEN PREGf_IMPLICIT PREGf_NAUGHTY PREGf_NOSCAN
+syn keyword xsMacro PREGf_SKIP PREGf_USE_RE_EVAL PREGf_VERBARG_SEEN PREINC
+syn keyword xsMacro PRESCAN_VERSION PREVOPER PRINTF_FORMAT_NULL_OK PRIVATEREF
+syn keyword xsMacro PRIVLIB PRIVLIB_EXP PRIVSHIFT PROCSELFEXE_PATH PRUNE
+syn keyword xsMacro PSEUDO PTHREAD_ATFORK PTHREAD_ATTR_SETDETACHSTATE
syn keyword xsMacro PTHREAD_CREATE PTHREAD_CREATE_JOINABLE
syn keyword xsMacro PTHREAD_GETSPECIFIC PTHREAD_GETSPECIFIC_INT PTR2IV PTR2NV
syn keyword xsMacro PTR2UV PTR2nat PTR2ul PTRSIZE PTRV PUSHBLOCK PUSHEVAL
syn keyword xsMacro PUSHFORMAT PUSHGIVEN PUSHLOOP_FOR PUSHLOOP_PLAIN PUSHMARK
syn keyword xsMacro PUSHSTACK PUSHSTACKi PUSHSUB PUSHSUBST PUSHSUB_BASE
-syn keyword xsMacro PUSHSUB_DB PUSHTARG PUSHWHEN PUSH_MULTICALL PUSHi
-syn keyword xsMacro PUSHmortal PUSHn PUSHp PUSHs PUSHu PUTBACK PWGECOS
-syn keyword xsMacro PWPASSWD Pause PeRl_CaTiFy PeRl_StGiFy PerlDir_chdir
-syn keyword xsMacro PerlDir_close PerlDir_mapA PerlDir_mapW PerlDir_mkdir
-syn keyword xsMacro PerlDir_open PerlDir_read PerlDir_rewind PerlDir_rmdir
-syn keyword xsMacro PerlDir_seek PerlDir_tell PerlEnv_ENVgetenv
-syn keyword xsMacro PerlEnv_ENVgetenv_len PerlEnv_clearenv
-syn keyword xsMacro PerlEnv_free_childdir PerlEnv_free_childenv
-syn keyword xsMacro PerlEnv_get_child_IO PerlEnv_get_childdir
-syn keyword xsMacro PerlEnv_get_childenv PerlEnv_getenv PerlEnv_getenv_len
-syn keyword xsMacro PerlEnv_lib_path PerlEnv_os_id PerlEnv_putenv
-syn keyword xsMacro PerlEnv_sitelib_path PerlEnv_uname PerlEnv_vendorlib_path
-syn keyword xsMacro PerlIOArg PerlIOBase PerlIONext PerlIOSelf PerlIOValid
-syn keyword xsMacro PerlIO_canset_cnt PerlIO_exportFILE PerlIO_fast_gets
-syn keyword xsMacro PerlIO_fdopen PerlIO_findFILE PerlIO_getc PerlIO_getname
+syn keyword xsMacro PUSHSUB_DB PUSHSUB_GET_LVALUE_MASK PUSHTARG PUSHWHEN
+syn keyword xsMacro PUSH_MULTICALL PUSH_MULTICALL_FLAGS PUSHi PUSHmortal
+syn keyword xsMacro PUSHn PUSHp PUSHs PUSHu PUTBACK PWGECOS PWPASSWD PadARRAY
+syn keyword xsMacro PadMAX PadlistARRAY PadlistMAX PadlistNAMES
+syn keyword xsMacro PadlistNAMESARRAY PadlistNAMESMAX PadlistREFCNT
+syn keyword xsMacro PadnameFLAGS PadnameIsOUR PadnameIsSTATE
+syn keyword xsMacro PadnameIsSTATE_on PadnameLEN PadnameLVALUE
+syn keyword xsMacro PadnameLVALUE_on PadnameOURSTASH PadnameOURSTASH_set
+syn keyword xsMacro PadnameOUTER PadnamePROTOCV PadnamePV PadnameREFCNT
+syn keyword xsMacro PadnameREFCNT_dec PadnameSV PadnameTYPE PadnameTYPE_set
+syn keyword xsMacro PadnameUTF8 PadnamelistARRAY PadnamelistMAX
+syn keyword xsMacro PadnamelistMAXNAMED PadnamelistREFCNT
+syn keyword xsMacro PadnamelistREFCNT_dec Pause PeRl_CaTiFy PeRl_INT64_C
+syn keyword xsMacro PeRl_StGiFy PeRl_UINT64_C PerlDir_chdir PerlDir_close
+syn keyword xsMacro PerlDir_mapA PerlDir_mapW PerlDir_mkdir PerlDir_open
+syn keyword xsMacro PerlDir_read PerlDir_rewind PerlDir_rmdir PerlDir_seek
+syn keyword xsMacro PerlDir_tell PerlEnv_ENVgetenv PerlEnv_ENVgetenv_len
+syn keyword xsMacro PerlEnv_clearenv PerlEnv_free_childdir
+syn keyword xsMacro PerlEnv_free_childenv PerlEnv_get_child_IO
+syn keyword xsMacro PerlEnv_get_childdir PerlEnv_get_childenv PerlEnv_getenv
+syn keyword xsMacro PerlEnv_getenv_len PerlEnv_lib_path PerlEnv_os_id
+syn keyword xsMacro PerlEnv_putenv PerlEnv_sitelib_path PerlEnv_uname
+syn keyword xsMacro PerlEnv_vendorlib_path PerlIOArg PerlIOBase PerlIONext
+syn keyword xsMacro PerlIOSelf PerlIOValid PerlIO_canset_cnt
+syn keyword xsMacro PerlIO_exportFILE PerlIO_fast_gets PerlIO_fdopen
+syn keyword xsMacro PerlIO_findFILE PerlIO_getc PerlIO_getname
syn keyword xsMacro PerlIO_has_base PerlIO_has_cntptr PerlIO_importFILE
syn keyword xsMacro PerlIO_isutf8 PerlIO_open PerlIO_printf PerlIO_putc
syn keyword xsMacro PerlIO_puts PerlIO_releaseFILE PerlIO_reopen
-syn keyword xsMacro PerlIO_rewind PerlIO_sprintf PerlIO_stdoutf
-syn keyword xsMacro PerlIO_tmpfile PerlIO_ungetc PerlIO_vprintf
-syn keyword xsMacro PerlLIO_access PerlLIO_chmod PerlLIO_chown PerlLIO_chsize
-syn keyword xsMacro PerlLIO_close PerlLIO_dup PerlLIO_dup2 PerlLIO_flock
-syn keyword xsMacro PerlLIO_fstat PerlLIO_ioctl PerlLIO_isatty PerlLIO_link
-syn keyword xsMacro PerlLIO_lseek PerlLIO_lstat PerlLIO_mkstemp
+syn keyword xsMacro PerlIO_rewind PerlIO_stdoutf PerlIO_tmpfile PerlIO_ungetc
+syn keyword xsMacro PerlIO_vprintf PerlLIO_access PerlLIO_chmod PerlLIO_chown
+syn keyword xsMacro PerlLIO_chsize PerlLIO_close PerlLIO_dup PerlLIO_dup2
+syn keyword xsMacro PerlLIO_flock PerlLIO_fstat PerlLIO_ioctl PerlLIO_isatty
+syn keyword xsMacro PerlLIO_link PerlLIO_lseek PerlLIO_lstat PerlLIO_mkstemp
syn keyword xsMacro PerlLIO_mktemp PerlLIO_open PerlLIO_open3 PerlLIO_read
syn keyword xsMacro PerlLIO_rename PerlLIO_setmode PerlLIO_stat
syn keyword xsMacro PerlLIO_tmpnam PerlLIO_umask PerlLIO_unlink PerlLIO_utime
@@ -2664,18 +2959,21 @@ syn keyword xsMacro PerlSock_recv PerlSock_recvfrom PerlSock_select
syn keyword xsMacro PerlSock_send PerlSock_sendto PerlSock_sethostent
syn keyword xsMacro PerlSock_setnetent PerlSock_setprotoent
syn keyword xsMacro PerlSock_setservent PerlSock_setsockopt PerlSock_shutdown
-syn keyword xsMacro PerlSock_socket PerlSock_socketpair Perl_assert
-syn keyword xsMacro Perl_atan2 Perl_atof Perl_atof2 Perl_ceil Perl_cos
-syn keyword xsMacro Perl_debug_log Perl_error_log Perl_exp Perl_floor
-syn keyword xsMacro Perl_fmod Perl_fp_class Perl_fp_class_denorm
-syn keyword xsMacro Perl_fp_class_inf Perl_fp_class_nan Perl_fp_class_ndenorm
-syn keyword xsMacro Perl_fp_class_ninf Perl_fp_class_nnorm Perl_fp_class_norm
+syn keyword xsMacro PerlSock_socket PerlSock_socketpair Perl_acos Perl_asin
+syn keyword xsMacro Perl_assert Perl_atan Perl_atan2 Perl_atof Perl_atof2
+syn keyword xsMacro Perl_ceil Perl_cos Perl_cosh Perl_custom_op_xop
+syn keyword xsMacro Perl_debug_log Perl_drand48 Perl_drand48_init
+syn keyword xsMacro Perl_error_log Perl_exp Perl_floor Perl_fmod
+syn keyword xsMacro Perl_fp_class_denorm Perl_fp_class_inf Perl_fp_class_nan
+syn keyword xsMacro Perl_fp_class_ndenorm Perl_fp_class_ninf
+syn keyword xsMacro Perl_fp_class_nnorm Perl_fp_class_norm
syn keyword xsMacro Perl_fp_class_nzero Perl_fp_class_pdenorm
syn keyword xsMacro Perl_fp_class_pinf Perl_fp_class_pnorm
syn keyword xsMacro Perl_fp_class_pzero Perl_fp_class_qnan Perl_fp_class_snan
-syn keyword xsMacro Perl_fp_class_zero Perl_frexp Perl_isfinite Perl_isinf
-syn keyword xsMacro Perl_isnan Perl_log Perl_malloc_good_size Perl_modf
-syn keyword xsMacro Perl_pow Perl_pp_accept Perl_pp_aelemfast_lex
+syn keyword xsMacro Perl_fp_class_zero Perl_free_c_backtrace Perl_frexp
+syn keyword xsMacro Perl_isfinite Perl_isfinitel Perl_isinf Perl_isnan
+syn keyword xsMacro Perl_ldexp Perl_log Perl_log10 Perl_malloc_good_size
+syn keyword xsMacro Perl_modf Perl_pow Perl_pp_accept Perl_pp_aelemfast_lex
syn keyword xsMacro Perl_pp_andassign Perl_pp_avalues Perl_pp_bind
syn keyword xsMacro Perl_pp_bit_xor Perl_pp_chmod Perl_pp_chomp
syn keyword xsMacro Perl_pp_connect Perl_pp_cos Perl_pp_custom
@@ -2701,53 +2999,52 @@ syn keyword xsMacro Perl_pp_kill Perl_pp_lcfirst Perl_pp_lineseq
syn keyword xsMacro Perl_pp_listen Perl_pp_localtime Perl_pp_log
syn keyword xsMacro Perl_pp_lstat Perl_pp_mapstart Perl_pp_msgctl
syn keyword xsMacro Perl_pp_msgget Perl_pp_msgrcv Perl_pp_msgsnd
-syn keyword xsMacro Perl_pp_orassign Perl_pp_padany Perl_pp_pop
-syn keyword xsMacro Perl_pp_postdec Perl_pp_predec Perl_pp_reach Perl_pp_read
-syn keyword xsMacro Perl_pp_recv Perl_pp_regcmaybe Perl_pp_rindex
-syn keyword xsMacro Perl_pp_rv2hv Perl_pp_rvalues Perl_pp_say Perl_pp_scalar
-syn keyword xsMacro Perl_pp_schomp Perl_pp_scope Perl_pp_seek Perl_pp_semop
-syn keyword xsMacro Perl_pp_send Perl_pp_sge Perl_pp_sgrent Perl_pp_sgt
-syn keyword xsMacro Perl_pp_shmctl Perl_pp_shmget Perl_pp_shmread
-syn keyword xsMacro Perl_pp_shutdown Perl_pp_slt Perl_pp_snetent
-syn keyword xsMacro Perl_pp_socket Perl_pp_sprotoent Perl_pp_spwent
-syn keyword xsMacro Perl_pp_sqrt Perl_pp_sservent Perl_pp_ssockopt
-syn keyword xsMacro Perl_pp_symlink Perl_pp_transr Perl_pp_unlink
-syn keyword xsMacro Perl_pp_utime Perl_pp_values Perl_safesysmalloc_size
-syn keyword xsMacro Perl_sharepvn Perl_signbit Perl_sin Perl_sqrt
-syn keyword xsMacro Perl_va_copy PmopSTASH PmopSTASHPV PmopSTASHPV_set
-syn keyword xsMacro PmopSTASH_flags PmopSTASH_flags_set PmopSTASH_free
-syn keyword xsMacro PmopSTASH_set Poison PoisonFree PoisonNew PoisonWith
-syn keyword xsMacro QR_PAT_MODS QUADKIND QUAD_IS_INT QUAD_IS_INT64_T
-syn keyword xsMacro QUAD_IS_LONG QUAD_IS_LONG_LONG QUAD_IS___INT64 QWLIST
-syn keyword xsMacro RANDBITS RANDOM_R_PROTO RD_NODATA READDIR64_R_PROTO
-syn keyword xsMacro READDIR_R_PROTO REENTRANT_PROTO_B_B REENTRANT_PROTO_B_BI
-syn keyword xsMacro REENTRANT_PROTO_B_BW REENTRANT_PROTO_B_CCD
-syn keyword xsMacro REENTRANT_PROTO_B_CCS REENTRANT_PROTO_B_IBI
-syn keyword xsMacro REENTRANT_PROTO_B_IBW REENTRANT_PROTO_B_SB
-syn keyword xsMacro REENTRANT_PROTO_B_SBI REENTRANT_PROTO_I_BI
-syn keyword xsMacro REENTRANT_PROTO_I_BW REENTRANT_PROTO_I_CCSBWR
-syn keyword xsMacro REENTRANT_PROTO_I_CCSD REENTRANT_PROTO_I_CII
-syn keyword xsMacro REENTRANT_PROTO_I_CIISD REENTRANT_PROTO_I_CSBI
-syn keyword xsMacro REENTRANT_PROTO_I_CSBIR REENTRANT_PROTO_I_CSBWR
-syn keyword xsMacro REENTRANT_PROTO_I_CSBWRE REENTRANT_PROTO_I_CSD
-syn keyword xsMacro REENTRANT_PROTO_I_CWISBWRE REENTRANT_PROTO_I_CWISD
-syn keyword xsMacro REENTRANT_PROTO_I_D REENTRANT_PROTO_I_H
-syn keyword xsMacro REENTRANT_PROTO_I_IBI REENTRANT_PROTO_I_IBW
-syn keyword xsMacro REENTRANT_PROTO_I_ICBI REENTRANT_PROTO_I_ICSBWR
-syn keyword xsMacro REENTRANT_PROTO_I_ICSD REENTRANT_PROTO_I_ID
-syn keyword xsMacro REENTRANT_PROTO_I_IISD REENTRANT_PROTO_I_ISBWR
-syn keyword xsMacro REENTRANT_PROTO_I_ISD REENTRANT_PROTO_I_LISBI
-syn keyword xsMacro REENTRANT_PROTO_I_LISD REENTRANT_PROTO_I_LS
+syn keyword xsMacro Perl_pp_nbit_xor Perl_pp_orassign Perl_pp_padany
+syn keyword xsMacro Perl_pp_pop Perl_pp_postdec Perl_pp_predec Perl_pp_reach
+syn keyword xsMacro Perl_pp_read Perl_pp_recv Perl_pp_regcmaybe
+syn keyword xsMacro Perl_pp_rindex Perl_pp_rv2hv Perl_pp_rvalues Perl_pp_say
+syn keyword xsMacro Perl_pp_sbit_xor Perl_pp_scalar Perl_pp_schomp
+syn keyword xsMacro Perl_pp_scope Perl_pp_seek Perl_pp_semop Perl_pp_send
+syn keyword xsMacro Perl_pp_sge Perl_pp_sgrent Perl_pp_sgt Perl_pp_shmctl
+syn keyword xsMacro Perl_pp_shmget Perl_pp_shmread Perl_pp_shutdown
+syn keyword xsMacro Perl_pp_slt Perl_pp_snetent Perl_pp_socket
+syn keyword xsMacro Perl_pp_sprotoent Perl_pp_spwent Perl_pp_sqrt
+syn keyword xsMacro Perl_pp_sservent Perl_pp_ssockopt Perl_pp_symlink
+syn keyword xsMacro Perl_pp_transr Perl_pp_unlink Perl_pp_utime
+syn keyword xsMacro Perl_pp_values Perl_safesysmalloc_size Perl_sharepvn
+syn keyword xsMacro Perl_signbit Perl_sin Perl_sinh Perl_sqrt Perl_strtod
+syn keyword xsMacro Perl_tan Perl_tanh Perl_va_copy PmopSTASH PmopSTASHPV
+syn keyword xsMacro PmopSTASHPV_set PmopSTASH_set Poison PoisonFree PoisonNew
+syn keyword xsMacro PoisonPADLIST PoisonWith QR_PAT_MODS QUADKIND QUAD_IS_INT
+syn keyword xsMacro QUAD_IS_INT64_T QUAD_IS_LONG QUAD_IS_LONG_LONG
+syn keyword xsMacro QUAD_IS___INT64 QUESTION_MARK_CTRL QWLIST RANDBITS
+syn keyword xsMacro RANDOM_R_PROTO RD_NODATA READDIR64_R_PROTO
+syn keyword xsMacro READDIR_R_PROTO READ_XDIGIT REENTRANT_PROTO_B_B
+syn keyword xsMacro REENTRANT_PROTO_B_BI REENTRANT_PROTO_B_BW
+syn keyword xsMacro REENTRANT_PROTO_B_CCD REENTRANT_PROTO_B_CCS
+syn keyword xsMacro REENTRANT_PROTO_B_IBI REENTRANT_PROTO_B_IBW
+syn keyword xsMacro REENTRANT_PROTO_B_SB REENTRANT_PROTO_B_SBI
+syn keyword xsMacro REENTRANT_PROTO_I_BI REENTRANT_PROTO_I_BW
+syn keyword xsMacro REENTRANT_PROTO_I_CCSBWR REENTRANT_PROTO_I_CCSD
+syn keyword xsMacro REENTRANT_PROTO_I_CII REENTRANT_PROTO_I_CIISD
+syn keyword xsMacro REENTRANT_PROTO_I_CSBI REENTRANT_PROTO_I_CSBIR
+syn keyword xsMacro REENTRANT_PROTO_I_CSBWR REENTRANT_PROTO_I_CSBWRE
+syn keyword xsMacro REENTRANT_PROTO_I_CSD REENTRANT_PROTO_I_CWISBWRE
+syn keyword xsMacro REENTRANT_PROTO_I_CWISD REENTRANT_PROTO_I_D
+syn keyword xsMacro REENTRANT_PROTO_I_H REENTRANT_PROTO_I_IBI
+syn keyword xsMacro REENTRANT_PROTO_I_IBW REENTRANT_PROTO_I_ICBI
+syn keyword xsMacro REENTRANT_PROTO_I_ICSBWR REENTRANT_PROTO_I_ICSD
+syn keyword xsMacro REENTRANT_PROTO_I_ID REENTRANT_PROTO_I_IISD
+syn keyword xsMacro REENTRANT_PROTO_I_ISBWR REENTRANT_PROTO_I_ISD
+syn keyword xsMacro REENTRANT_PROTO_I_LISBI REENTRANT_PROTO_I_LISD
syn keyword xsMacro REENTRANT_PROTO_I_SB REENTRANT_PROTO_I_SBI
syn keyword xsMacro REENTRANT_PROTO_I_SBIE REENTRANT_PROTO_I_SBIH
syn keyword xsMacro REENTRANT_PROTO_I_SBIR REENTRANT_PROTO_I_SBWR
syn keyword xsMacro REENTRANT_PROTO_I_SBWRE REENTRANT_PROTO_I_SD
-syn keyword xsMacro REENTRANT_PROTO_I_ST REENTRANT_PROTO_I_St
syn keyword xsMacro REENTRANT_PROTO_I_TISD REENTRANT_PROTO_I_TS
syn keyword xsMacro REENTRANT_PROTO_I_TSBI REENTRANT_PROTO_I_TSBIR
syn keyword xsMacro REENTRANT_PROTO_I_TSBWR REENTRANT_PROTO_I_TSR
syn keyword xsMacro REENTRANT_PROTO_I_TsISBWRE REENTRANT_PROTO_I_UISBWRE
-syn keyword xsMacro REENTRANT_PROTO_I_iS REENTRANT_PROTO_I_lS
syn keyword xsMacro REENTRANT_PROTO_I_uISBWRE REENTRANT_PROTO_S_CBI
syn keyword xsMacro REENTRANT_PROTO_S_CCSBI REENTRANT_PROTO_S_CIISBIE
syn keyword xsMacro REENTRANT_PROTO_S_CSBI REENTRANT_PROTO_S_CSBIE
@@ -2762,160 +3059,201 @@ syn keyword xsMacro REENTRANT_PROTO_V_ID REENTR_H REENTR_MEMZERO REF
syn keyword xsMacro REFCOUNTED_HE_EXISTS REFCOUNTED_HE_KEY_UTF8 REFF REFFA
syn keyword xsMacro REFFL REFFU REFGEN REF_HE_KEY REGMATCH_STATE_MAX
syn keyword xsMacro REGNODE_MAX REGNODE_SIMPLE REGNODE_VARIES REG_ANY
-syn keyword xsMacro REG_INFTY REG_MAGIC REG_SEEN_CANY REG_SEEN_CUTGROUP
-syn keyword xsMacro REG_SEEN_EVAL REG_SEEN_EXACTF_SHARP_S REG_SEEN_GPOS
-syn keyword xsMacro REG_SEEN_LOOKBEHIND REG_SEEN_RECURSE
-syn keyword xsMacro REG_SEEN_RUN_ON_COMMENT REG_SEEN_SANY REG_SEEN_VERBARG
-syn keyword xsMacro REG_SEEN_ZERO_LEN REG_TOP_LEVEL_BRANCHES RELOP RENUM
-syn keyword xsMacro REQUIRE RESTORE_ERRNO RESTORE_NUMERIC_LOCAL
+syn keyword xsMacro REG_CANY_SEEN REG_CUTGROUP_SEEN REG_EXTFLAGS_NAME_SIZE
+syn keyword xsMacro REG_GOSTART_SEEN REG_GPOS_SEEN REG_INFTY
+syn keyword xsMacro REG_INTFLAGS_NAME_SIZE REG_LOOKBEHIND_SEEN REG_MAGIC
+syn keyword xsMacro REG_RECURSE_SEEN REG_RUN_ON_COMMENT_SEEN
+syn keyword xsMacro REG_TOP_LEVEL_BRANCHES_SEEN REG_UNBOUNDED_QUANTIFIER_SEEN
+syn keyword xsMacro REG_UNFOLDED_MULTI_SEEN REG_VERBARG_SEEN
+syn keyword xsMacro REG_ZERO_LEN_SEEN RELOP RENUM REQUIRE RESTORE_ERRNO
+syn keyword xsMacro RESTORE_LC_NUMERIC RESTORE_LC_NUMERIC_STANDARD
+syn keyword xsMacro RESTORE_LC_NUMERIC_UNDERLYING RESTORE_NUMERIC_LOCAL
syn keyword xsMacro RESTORE_NUMERIC_STANDARD RETPUSHNO RETPUSHUNDEF
-syn keyword xsMacro RETPUSHYES RETSETNO RETSETUNDEF RETSETYES RETURN RETURNOP
-syn keyword xsMacro RETURNX RETURN_PROBE REXEC_CHECKED REXEC_COPY_STR
-syn keyword xsMacro REXEC_IGNOREPOS REXEC_NOT_FIRST REXEC_SCREAM
-syn keyword xsMacro RE_DEBUG_COMPILE_DUMP RE_DEBUG_COMPILE_FLAGS
+syn keyword xsMacro RETPUSHYES RETSETNO RETSETTARG RETSETUNDEF RETSETYES
+syn keyword xsMacro RETURN RETURNOP RETURNX RETURN_PROBE REXEC_CHECKED
+syn keyword xsMacro REXEC_COPY_SKIP_POST REXEC_COPY_SKIP_PRE REXEC_COPY_STR
+syn keyword xsMacro REXEC_FAIL_ON_UNDERFLOW REXEC_IGNOREPOS REXEC_NOT_FIRST
+syn keyword xsMacro REXEC_SCREAM RE_DEBUG_COMPILE_DUMP RE_DEBUG_COMPILE_FLAGS
syn keyword xsMacro RE_DEBUG_COMPILE_MASK RE_DEBUG_COMPILE_OPTIMISE
-syn keyword xsMacro RE_DEBUG_COMPILE_PARSE RE_DEBUG_COMPILE_TRIE
-syn keyword xsMacro RE_DEBUG_EXECUTE_INTUIT RE_DEBUG_EXECUTE_MASK
-syn keyword xsMacro RE_DEBUG_EXECUTE_MATCH RE_DEBUG_EXECUTE_TRIE
-syn keyword xsMacro RE_DEBUG_EXTRA_BUFFERS RE_DEBUG_EXTRA_GPOS
-syn keyword xsMacro RE_DEBUG_EXTRA_MASK RE_DEBUG_EXTRA_OFFDEBUG
-syn keyword xsMacro RE_DEBUG_EXTRA_OFFSETS RE_DEBUG_EXTRA_OPTIMISE
-syn keyword xsMacro RE_DEBUG_EXTRA_STACK RE_DEBUG_EXTRA_STATE
-syn keyword xsMacro RE_DEBUG_EXTRA_TRIE RE_DEBUG_FLAG RE_DEBUG_FLAGS
-syn keyword xsMacro RE_PV_COLOR_DECL RE_PV_QUOTED_DECL RE_SV_DUMPLEN
-syn keyword xsMacro RE_SV_ESCAPE RE_SV_TAIL RE_TRACK_PATTERN_OFFSETS
-syn keyword xsMacro RE_TRIE_MAXBUF_INIT RE_TRIE_MAXBUF_NAME RMS_DIR RMS_FAC
-syn keyword xsMacro RMS_FEX RMS_FNF RMS_IFI RMS_ISI RMS_PRV RUNOPS_DEFAULT
-syn keyword xsMacro RV2CVOPCV_MARK_EARLY RV2CVOPCV_RETURN_NAME_GV
-syn keyword xsMacro RX_ANCHORED_SUBSTR RX_ANCHORED_UTF8 RX_BUFF_IDX_FULLMATCH
+syn keyword xsMacro RE_DEBUG_COMPILE_PARSE RE_DEBUG_COMPILE_TEST
+syn keyword xsMacro RE_DEBUG_COMPILE_TRIE RE_DEBUG_EXECUTE_INTUIT
+syn keyword xsMacro RE_DEBUG_EXECUTE_MASK RE_DEBUG_EXECUTE_MATCH
+syn keyword xsMacro RE_DEBUG_EXECUTE_TRIE RE_DEBUG_EXTRA_BUFFERS
+syn keyword xsMacro RE_DEBUG_EXTRA_GPOS RE_DEBUG_EXTRA_MASK
+syn keyword xsMacro RE_DEBUG_EXTRA_OFFDEBUG RE_DEBUG_EXTRA_OFFSETS
+syn keyword xsMacro RE_DEBUG_EXTRA_OPTIMISE RE_DEBUG_EXTRA_STACK
+syn keyword xsMacro RE_DEBUG_EXTRA_STATE RE_DEBUG_EXTRA_TRIE RE_DEBUG_FLAG
+syn keyword xsMacro RE_DEBUG_FLAGS RE_PV_COLOR_DECL RE_PV_QUOTED_DECL
+syn keyword xsMacro RE_SV_DUMPLEN RE_SV_ESCAPE RE_SV_TAIL
+syn keyword xsMacro RE_TRACK_PATTERN_OFFSETS RE_TRIE_MAXBUF_INIT
+syn keyword xsMacro RE_TRIE_MAXBUF_NAME RMS_DIR RMS_FAC RMS_FEX RMS_FNF
+syn keyword xsMacro RMS_IFI RMS_ISI RMS_PRV ROTL32 ROTL64 ROTL_UV
+syn keyword xsMacro RUNOPS_DEFAULT RV2CVOPCV_FLAG_MASK RV2CVOPCV_MARK_EARLY
+syn keyword xsMacro RV2CVOPCV_MAYBE_NAME_GV RV2CVOPCV_RETURN_NAME_GV
+syn keyword xsMacro RV2CVOPCV_RETURN_STUB RX_ANCHORED_SUBSTR RX_ANCHORED_UTF8
+syn keyword xsMacro RX_BUFF_IDX_CARET_FULLMATCH RX_BUFF_IDX_CARET_POSTMATCH
+syn keyword xsMacro RX_BUFF_IDX_CARET_PREMATCH RX_BUFF_IDX_FULLMATCH
syn keyword xsMacro RX_BUFF_IDX_POSTMATCH RX_BUFF_IDX_PREMATCH
-syn keyword xsMacro RX_CHECK_SUBSTR RX_ENGINE RX_EXTFLAGS RX_FLOAT_SUBSTR
-syn keyword xsMacro RX_FLOAT_UTF8 RX_GOFS RX_HAS_CUTGROUP RX_LASTCLOSEPAREN
-syn keyword xsMacro RX_LASTPAREN RX_MATCH_COPIED RX_MATCH_COPIED_off
-syn keyword xsMacro RX_MATCH_COPIED_on RX_MATCH_COPIED_set RX_MATCH_COPY_FREE
-syn keyword xsMacro RX_MATCH_TAINTED RX_MATCH_TAINTED_off RX_MATCH_TAINTED_on
+syn keyword xsMacro RX_CHECK_SUBSTR RX_COMPFLAGS RX_ENGINE RX_EXTFLAGS
+syn keyword xsMacro RX_FLOAT_SUBSTR RX_FLOAT_UTF8 RX_GOFS RX_HAS_CUTGROUP
+syn keyword xsMacro RX_INTFLAGS RX_ISTAINTED RX_LASTCLOSEPAREN RX_LASTPAREN
+syn keyword xsMacro RX_MATCH_COPIED RX_MATCH_COPIED_off RX_MATCH_COPIED_on
+syn keyword xsMacro RX_MATCH_COPIED_set RX_MATCH_COPY_FREE RX_MATCH_TAINTED
+syn keyword xsMacro RX_MATCH_TAINTED_off RX_MATCH_TAINTED_on
syn keyword xsMacro RX_MATCH_TAINTED_set RX_MATCH_UTF8 RX_MATCH_UTF8_off
syn keyword xsMacro RX_MATCH_UTF8_on RX_MATCH_UTF8_set RX_MINLEN RX_MINLENRET
syn keyword xsMacro RX_NPARENS RX_OFFS RX_PRECOMP RX_PRECOMP_const RX_PRELEN
-syn keyword xsMacro RX_REFCNT RX_SAVED_COPY RX_SEEN_EVALS RX_SUBBEG RX_SUBLEN
-syn keyword xsMacro RX_UTF8 RX_WRAPLEN RX_WRAPPED RX_WRAPPED_const RXapif_ALL
-syn keyword xsMacro RXapif_CLEAR RXapif_DELETE RXapif_EXISTS RXapif_FETCH
-syn keyword xsMacro RXapif_FIRSTKEY RXapif_NEXTKEY RXapif_ONE RXapif_REGNAME
-syn keyword xsMacro RXapif_REGNAMES RXapif_REGNAMES_COUNT RXapif_SCALAR
-syn keyword xsMacro RXapif_STORE RXf_ANCH RXf_ANCH_BOL RXf_ANCH_GPOS
-syn keyword xsMacro RXf_ANCH_MBOL RXf_ANCH_SBOL RXf_ANCH_SINGLE
-syn keyword xsMacro RXf_BASE_SHIFT RXf_CANY_SEEN RXf_CHECK_ALL RXf_COPY_DONE
-syn keyword xsMacro RXf_EVAL_SEEN RXf_GPOS_CHECK RXf_GPOS_FLOAT RXf_GPOS_SEEN
-syn keyword xsMacro RXf_INTUIT_TAIL RXf_LOOKBEHIND_SEEN RXf_MATCH_UTF8
-syn keyword xsMacro RXf_NOSCAN RXf_NULL RXf_PMf_CHARSET RXf_PMf_COMPILETIME
-syn keyword xsMacro RXf_PMf_EXTENDED RXf_PMf_FOLD RXf_PMf_KEEPCOPY
-syn keyword xsMacro RXf_PMf_MULTILINE RXf_PMf_SINGLELINE RXf_PMf_STD_PMMOD
-syn keyword xsMacro RXf_PMf_STD_PMMOD_SHIFT RXf_SKIPWHITE RXf_SPLIT
-syn keyword xsMacro RXf_START_ONLY RXf_TAINTED RXf_TAINTED_SEEN
-syn keyword xsMacro RXf_USE_INTUIT RXf_USE_INTUIT_ML RXf_USE_INTUIT_NOML
-syn keyword xsMacro RXf_WHITE RXi_GET RXi_GET_DECL RXi_SET RXp_EXTFLAGS
-syn keyword xsMacro RXp_MATCH_COPIED RXp_MATCH_COPIED_off RXp_MATCH_COPIED_on
-syn keyword xsMacro RXp_MATCH_TAINTED RXp_MATCH_UTF8 RXp_PAREN_NAMES
+syn keyword xsMacro RX_REFCNT RX_SAVED_COPY RX_SUBBEG RX_SUBCOFFSET RX_SUBLEN
+syn keyword xsMacro RX_SUBOFFSET RX_TAINT_on RX_UTF8 RX_WRAPLEN RX_WRAPPED
+syn keyword xsMacro RX_WRAPPED_const RX_ZERO_LEN RXapif_ALL RXapif_CLEAR
+syn keyword xsMacro RXapif_DELETE RXapif_EXISTS RXapif_FETCH RXapif_FIRSTKEY
+syn keyword xsMacro RXapif_NEXTKEY RXapif_ONE RXapif_REGNAME RXapif_REGNAMES
+syn keyword xsMacro RXapif_REGNAMES_COUNT RXapif_SCALAR RXapif_STORE
+syn keyword xsMacro RXf_BASE_SHIFT RXf_CHECK_ALL RXf_COPY_DONE RXf_EVAL_SEEN
+syn keyword xsMacro RXf_INTUIT_TAIL RXf_IS_ANCHORED RXf_MATCH_UTF8
+syn keyword xsMacro RXf_NO_INPLACE_SUBST RXf_NULL RXf_PMf_CHARSET
+syn keyword xsMacro RXf_PMf_COMPILETIME RXf_PMf_EXTENDED
+syn keyword xsMacro RXf_PMf_EXTENDED_MORE RXf_PMf_FLAGCOPYMASK RXf_PMf_FOLD
+syn keyword xsMacro RXf_PMf_KEEPCOPY RXf_PMf_MULTILINE RXf_PMf_NOCAPTURE
+syn keyword xsMacro RXf_PMf_SINGLELINE RXf_PMf_SPLIT RXf_PMf_STD_PMMOD
+syn keyword xsMacro RXf_PMf_STD_PMMOD_SHIFT RXf_PMf_STRICT RXf_SKIPWHITE
+syn keyword xsMacro RXf_SPLIT RXf_START_ONLY RXf_TAINTED RXf_TAINTED_SEEN
+syn keyword xsMacro RXf_UNBOUNDED_QUANTIFIER_SEEN RXf_USE_INTUIT
+syn keyword xsMacro RXf_USE_INTUIT_ML RXf_USE_INTUIT_NOML RXf_WHITE RXi_GET
+syn keyword xsMacro RXi_GET_DECL RXi_SET RXp_COMPFLAGS RXp_EXTFLAGS
+syn keyword xsMacro RXp_INTFLAGS RXp_MATCH_COPIED RXp_MATCH_COPIED_off
+syn keyword xsMacro RXp_MATCH_COPIED_on RXp_MATCH_TAINTED
+syn keyword xsMacro RXp_MATCH_TAINTED_on RXp_MATCH_UTF8 RXp_PAREN_NAMES ReANY
syn keyword xsMacro ReREFCNT_dec ReREFCNT_inc Renew Renewc RsPARA RsRECORD
syn keyword xsMacro RsSIMPLE RsSNARF SAFE_TRIE_NODENUM SANY SAVEADELETE
syn keyword xsMacro SAVEBOOL SAVECLEARSV SAVECOMPILEWARNINGS SAVECOMPPAD
-syn keyword xsMacro SAVECOPFILE SAVECOPFILE_FREE SAVECOPLINE SAVECOPSTASH
+syn keyword xsMacro SAVECOPFILE SAVECOPFILE_FREE SAVECOPLINE
syn keyword xsMacro SAVECOPSTASH_FREE SAVEDELETE SAVEDESTRUCTOR
-syn keyword xsMacro SAVEDESTRUCTOR_X SAVEFREECOPHH SAVEFREEOP SAVEFREEPV
-syn keyword xsMacro SAVEFREESV SAVEGENERICPV SAVEGENERICSV SAVEHDELETE
-syn keyword xsMacro SAVEHINTS SAVEI16 SAVEI32 SAVEI8 SAVEINT SAVEIV SAVELONG
-syn keyword xsMacro SAVEMORTALIZESV SAVEOP SAVEPADSVANDMORTALIZE SAVEPARSER
-syn keyword xsMacro SAVEPPTR SAVESETSVFLAGS SAVESHAREDPV SAVESPTR
-syn keyword xsMacro SAVESTACK_ALLOC_FOR_RE_SAVE_STATE SAVESTACK_CXPOS
-syn keyword xsMacro SAVESTACK_POS SAVESWITCHSTACK SAVETMPS SAVEVPTR
-syn keyword xsMacro SAVE_DEFSV SAVE_ERRNO SAVE_MASK SAVE_TIGHT_SHIFT
-syn keyword xsMacro SAVEf_KEEPOLDELEM SAVEf_SETMAGIC SAVEt_ADELETE
-syn keyword xsMacro SAVEt_AELEM SAVEt_ALLOC SAVEt_APTR SAVEt_AV SAVEt_BOOL
-syn keyword xsMacro SAVEt_CLEARSV SAVEt_COMPILE_WARNINGS SAVEt_COMPPAD
-syn keyword xsMacro SAVEt_DELETE SAVEt_DESTRUCTOR SAVEt_DESTRUCTOR_X
-syn keyword xsMacro SAVEt_FREECOPHH SAVEt_FREEOP SAVEt_FREEPV SAVEt_FREESV
+syn keyword xsMacro SAVEDESTRUCTOR_X SAVEFREECOPHH SAVEFREEOP SAVEFREEPADNAME
+syn keyword xsMacro SAVEFREEPV SAVEFREESV SAVEGENERICPV SAVEGENERICSV
+syn keyword xsMacro SAVEHDELETE SAVEHINTS SAVEI16 SAVEI32 SAVEI8 SAVEINT
+syn keyword xsMacro SAVEIV SAVELONG SAVEMORTALIZESV SAVEOP
+syn keyword xsMacro SAVEPADSVANDMORTALIZE SAVEPARSER SAVEPPTR SAVESETSVFLAGS
+syn keyword xsMacro SAVESHAREDPV SAVESPTR SAVESTACK_POS SAVESWITCHSTACK
+syn keyword xsMacro SAVETMPS SAVEVPTR SAVE_DEFSV SAVE_ERRNO SAVE_MASK
+syn keyword xsMacro SAVE_TIGHT_SHIFT SAVEf_KEEPOLDELEM SAVEf_SETMAGIC
+syn keyword xsMacro SAVEt_ADELETE SAVEt_AELEM SAVEt_ALLOC SAVEt_APTR
+syn keyword xsMacro SAVEt_ARG0_MAX SAVEt_ARG1_MAX SAVEt_ARG2_MAX SAVEt_AV
+syn keyword xsMacro SAVEt_BOOL SAVEt_CLEARPADRANGE SAVEt_CLEARSV
+syn keyword xsMacro SAVEt_COMPILE_WARNINGS SAVEt_COMPPAD SAVEt_DELETE
+syn keyword xsMacro SAVEt_DESTRUCTOR SAVEt_DESTRUCTOR_X SAVEt_FREECOPHH
+syn keyword xsMacro SAVEt_FREEOP SAVEt_FREEPADNAME SAVEt_FREEPV SAVEt_FREESV
syn keyword xsMacro SAVEt_GENERIC_PVREF SAVEt_GENERIC_SVREF SAVEt_GP
-syn keyword xsMacro SAVEt_GVSV SAVEt_HELEM SAVEt_HINTS SAVEt_HPTR SAVEt_HV
-syn keyword xsMacro SAVEt_I16 SAVEt_I32 SAVEt_I32_SMALL SAVEt_I8 SAVEt_INT
-syn keyword xsMacro SAVEt_INT_SMALL SAVEt_ITEM SAVEt_IV SAVEt_LONG
-syn keyword xsMacro SAVEt_MORTALIZESV SAVEt_NSTAB SAVEt_OP
-syn keyword xsMacro SAVEt_PADSV_AND_MORTALIZE SAVEt_PARSER SAVEt_PPTR
-syn keyword xsMacro SAVEt_REGCONTEXT SAVEt_RE_STATE SAVEt_SAVESWITCHSTACK
-syn keyword xsMacro SAVEt_SET_SVFLAGS SAVEt_SHARED_PVREF SAVEt_SPTR
-syn keyword xsMacro SAVEt_STACK_CXPOS SAVEt_STACK_POS SAVEt_SV SAVEt_SVREF
-syn keyword xsMacro SAVEt_VPTR SBOL SCAN_DEF SCAN_REPL SCAN_TR SCHEDULE
-syn keyword xsMacro SCHED_YIELD SCOPE_SAVES_SIGNAL_MASK SEEK_CUR SEEK_END
-syn keyword xsMacro SEEK_SET SELECT_MIN_BITS SEOL SETERRNO SETGRENT_R_PROTO
-syn keyword xsMacro SETHOSTENT_R_PROTO SETLOCALE_R_PROTO SETNETENT_R_PROTO
-syn keyword xsMacro SETPROTOENT_R_PROTO SETPWENT_R_PROTO SETSERVENT_R_PROTO
-syn keyword xsMacro SETTARG SET_MARK_OFFSET SET_NUMERIC_LOCAL
-syn keyword xsMacro SET_NUMERIC_STANDARD SET_THR SET_THREAD_SELF SETi SETn
-syn keyword xsMacro SETp SETs SETsv SETsvUN SETu SHARP_S_SKIP SHIFTOP
-syn keyword xsMacro SHORTSIZE SH_PATH SIGABRT SIGILL SIG_NAME SIG_NUM
-syn keyword xsMacro SIG_SIZE SINGLE_PAT_MOD SITEARCH SITEARCH_EXP SITELIB
-syn keyword xsMacro SITELIB_EXP SITELIB_STEM SIZE_ALIGN SIZE_ONLY SKIP
-syn keyword xsMacro SKIP_next SKIP_next_fail SLOPPYDIVIDE SOCKET_OPEN_MODE
-syn keyword xsMacro SPACE SPACEA SPACEL SPACEU SPAGAIN SPRINTF_RETURNS_STRLEN
-syn keyword xsMacro SRAND48_R_PROTO SRANDOM_R_PROTO SSCHECK SSGROW SSNEW
-syn keyword xsMacro SSNEWa SSNEWat SSNEWt SSPOPBOOL SSPOPDPTR SSPOPDXPTR
-syn keyword xsMacro SSPOPINT SSPOPIV SSPOPLONG SSPOPPTR SSPOPUV SSPTR SSPTRt
+syn keyword xsMacro SAVEt_GP_ALIASED_SV SAVEt_GVSLOT SAVEt_GVSV SAVEt_HELEM
+syn keyword xsMacro SAVEt_HINTS SAVEt_HPTR SAVEt_HV SAVEt_I16 SAVEt_I32
+syn keyword xsMacro SAVEt_I32_SMALL SAVEt_I8 SAVEt_INT SAVEt_INT_SMALL
+syn keyword xsMacro SAVEt_ITEM SAVEt_IV SAVEt_LONG SAVEt_MORTALIZESV
+syn keyword xsMacro SAVEt_NSTAB SAVEt_OP SAVEt_PADSV_AND_MORTALIZE
+syn keyword xsMacro SAVEt_PARSER SAVEt_PPTR SAVEt_READONLY_OFF
+syn keyword xsMacro SAVEt_REGCONTEXT SAVEt_SAVESWITCHSTACK SAVEt_SET_SVFLAGS
+syn keyword xsMacro SAVEt_SHARED_PVREF SAVEt_SPTR SAVEt_STACK_POS
+syn keyword xsMacro SAVEt_STRLEN SAVEt_SV SAVEt_SVREF SAVEt_VPTR
+syn keyword xsMacro SAWAMPERSAND_LEFT SAWAMPERSAND_MIDDLE SAWAMPERSAND_RIGHT
+syn keyword xsMacro SBOL SB_ENUM_COUNT SCAN_DEF SCAN_REPL SCAN_TR
+syn keyword xsMacro SCAN_VERSION SCHED_YIELD SCOPE_SAVES_SIGNAL_MASK SEEK_CUR
+syn keyword xsMacro SEEK_END SEEK_SET SELECT_MIN_BITS SEOL SETERRNO
+syn keyword xsMacro SETGRENT_R_PROTO SETHOSTENT_R_PROTO SETLOCALE_R_PROTO
+syn keyword xsMacro SETNETENT_R_PROTO SETPROTOENT_R_PROTO SETPWENT_R_PROTO
+syn keyword xsMacro SETSERVENT_R_PROTO SETTARG SET_MARK_OFFSET
+syn keyword xsMacro SET_NUMERIC_LOCAL SET_NUMERIC_STANDARD
+syn keyword xsMacro SET_NUMERIC_UNDERLYING SET_THR SET_THREAD_SELF SETi SETn
+syn keyword xsMacro SETp SETs SETu SHARP_S_SKIP SHIFTOP SHORTSIZE SH_PATH
+syn keyword xsMacro SIGABRT SIGILL SIG_NAME SIG_NUM SIG_SIZE SINGLE_PAT_MOD
+syn keyword xsMacro SIPROUND SITEARCH SITEARCH_EXP SITELIB SITELIB_EXP
+syn keyword xsMacro SITELIB_STEM SIZE_ALIGN SIZE_ONLY SKIP SKIP_next
+syn keyword xsMacro SKIP_next_fail SLOPPYDIVIDE SOCKET_OPEN_MODE SPAGAIN
+syn keyword xsMacro SPRINTF_RETURNS_STRLEN SRAND48_R_PROTO SRANDOM_R_PROTO
+syn keyword xsMacro SSCHECK SSC_MATCHES_EMPTY_STRING SSGROW SSNEW SSNEWa
+syn keyword xsMacro SSNEWat SSNEWt SSPOPBOOL SSPOPDPTR SSPOPDXPTR SSPOPINT
+syn keyword xsMacro SSPOPIV SSPOPLONG SSPOPPTR SSPOPUV SSPTR SSPTRt
syn keyword xsMacro SSPUSHBOOL SSPUSHDPTR SSPUSHDXPTR SSPUSHINT SSPUSHIV
-syn keyword xsMacro SSPUSHLONG SSPUSHPTR SSPUSHUV SS_ACCVIO SS_DEVOFFLINE
-syn keyword xsMacro SS_IVCHAN SS_NORMAL ST STANDARD_C STAR STARTPERL
-syn keyword xsMacro START_EXTERN_C START_MY_CXT STATIC STATUS_ALL_FAILURE
-syn keyword xsMacro STATUS_ALL_SUCCESS STATUS_CURRENT STATUS_EXIT
-syn keyword xsMacro STATUS_EXIT_SET STATUS_NATIVE STATUS_NATIVE_CHILD_SET
-syn keyword xsMacro STATUS_UNIX STATUS_UNIX_EXIT_SET STATUS_UNIX_SET STDCHAR
-syn keyword xsMacro STDIO_PTR_LVALUE STDIO_PTR_LVAL_SETS_CNT
-syn keyword xsMacro STDIO_STREAM_ARRAY STD_PAT_MODS STD_PMMOD_FLAGS_CLEAR
-syn keyword xsMacro STMT_END STMT_START STORE_NUMERIC_LOCAL_SET_STANDARD
+syn keyword xsMacro SSPUSHLONG SSPUSHPTR SSPUSHUV SS_ACCVIO SS_ADD_BOOL
+syn keyword xsMacro SS_ADD_DPTR SS_ADD_DXPTR SS_ADD_END SS_ADD_INT SS_ADD_IV
+syn keyword xsMacro SS_ADD_LONG SS_ADD_PTR SS_ADD_UV SS_BUFFEROVF
+syn keyword xsMacro SS_DEVOFFLINE SS_IVCHAN SS_MAXPUSH SS_NOPRIV SS_NORMAL
+syn keyword xsMacro SSize_t_MAX ST STANDARD_C STAR STARTPERL START_EXTERN_C
+syn keyword xsMacro START_MY_CXT STATIC STATIC_ASSERT_1 STATIC_ASSERT_2
+syn keyword xsMacro STATIC_ASSERT_GLOBAL STATIC_ASSERT_STMT
+syn keyword xsMacro STATUS_ALL_FAILURE STATUS_ALL_SUCCESS STATUS_CURRENT
+syn keyword xsMacro STATUS_EXIT STATUS_EXIT_SET STATUS_NATIVE
+syn keyword xsMacro STATUS_NATIVE_CHILD_SET STATUS_UNIX STATUS_UNIX_EXIT_SET
+syn keyword xsMacro STATUS_UNIX_SET STDCHAR STDIO_STREAM_ARRAY STD_PAT_MODS
+syn keyword xsMacro STD_PMMOD_FLAGS_CLEAR STD_PMMOD_FLAGS_PARSE_X_WARN
+syn keyword xsMacro STMT_END STMT_START STORE_LC_NUMERIC_FORCE_TO_UNDERLYING
+syn keyword xsMacro STORE_LC_NUMERIC_SET_TO_NEEDED
+syn keyword xsMacro STORE_LC_NUMERIC_STANDARD_SET_UNDERLYING
+syn keyword xsMacro STORE_LC_NUMERIC_UNDERLYING_SET_STANDARD
+syn keyword xsMacro STORE_NUMERIC_LOCAL_SET_STANDARD
+syn keyword xsMacro STORE_NUMERIC_STANDARD_FORCE_LOCAL
syn keyword xsMacro STORE_NUMERIC_STANDARD_SET_LOCAL STRERROR_R_PROTO STRING
syn keyword xsMacro STRINGIFY STRUCT_OFFSET STRUCT_SV STR_LEN STR_SZ
syn keyword xsMacro STR_WITH_LEN ST_INO_SIGN ST_INO_SIZE SUB
syn keyword xsMacro SUBST_TAINT_BOOLRET SUBST_TAINT_PAT SUBST_TAINT_REPL
syn keyword xsMacro SUBST_TAINT_RETAINT SUBST_TAINT_STR SUBVERSION SUCCEED
syn keyword xsMacro SUSPEND SVTYPEMASK SV_CATBYTES SV_CATUTF8
-syn keyword xsMacro SV_CHECK_THINKFIRST SV_CHECK_THINKFIRST_COW_DROP
-syn keyword xsMacro SV_CONST_RETURN SV_COW_DROP_PV SV_COW_OTHER_PVS
+syn keyword xsMacro SV_CHECK_THINKFIRST SV_CHECK_THINKFIRST_COW_DROP SV_CONST
+syn keyword xsMacro SV_CONSTS_COUNT SV_CONST_BINMODE SV_CONST_CLEAR
+syn keyword xsMacro SV_CONST_CLOSE SV_CONST_DELETE SV_CONST_DESTROY
+syn keyword xsMacro SV_CONST_EOF SV_CONST_EXISTS SV_CONST_EXTEND
+syn keyword xsMacro SV_CONST_FETCH SV_CONST_FETCHSIZE SV_CONST_FILENO
+syn keyword xsMacro SV_CONST_FIRSTKEY SV_CONST_GETC SV_CONST_NEXTKEY
+syn keyword xsMacro SV_CONST_OPEN SV_CONST_POP SV_CONST_PRINT SV_CONST_PRINTF
+syn keyword xsMacro SV_CONST_PUSH SV_CONST_READ SV_CONST_READLINE
+syn keyword xsMacro SV_CONST_RETURN SV_CONST_SCALAR SV_CONST_SEEK
+syn keyword xsMacro SV_CONST_SHIFT SV_CONST_SPLICE SV_CONST_STORE
+syn keyword xsMacro SV_CONST_STORESIZE SV_CONST_TELL SV_CONST_TIEARRAY
+syn keyword xsMacro SV_CONST_TIEHANDLE SV_CONST_TIEHASH SV_CONST_TIESCALAR
+syn keyword xsMacro SV_CONST_UNSHIFT SV_CONST_UNTIE SV_CONST_WRITE
+syn keyword xsMacro SV_COW_DROP_PV SV_COW_OTHER_PVS SV_COW_REFCNT_MAX
syn keyword xsMacro SV_COW_SHARED_HASH_KEYS SV_DO_COW_SVSETSV
syn keyword xsMacro SV_FORCE_UTF8_UPGRADE SV_GMAGIC SV_HAS_TRAILING_NUL
syn keyword xsMacro SV_IMMEDIATE_UNREF SV_MUTABLE_RETURN SV_NOSTEAL
syn keyword xsMacro SV_SAVED_COPY SV_SKIP_OVERLOAD SV_SMAGIC
syn keyword xsMacro SV_UNDEF_RETURNS_NULL SV_UTF8_NO_ENCODING SVrepl_EVAL
-syn keyword xsMacro SVt_MASK SWITCHSTACK SYMBIAN SYSTEM_GMTIME_MAX
+syn keyword xsMacro SVt_FIRST SVt_MASK SWITCHSTACK SYMBIAN SYSTEM_GMTIME_MAX
syn keyword xsMacro SYSTEM_GMTIME_MIN SYSTEM_LOCALTIME_MAX
syn keyword xsMacro SYSTEM_LOCALTIME_MIN S_IEXEC S_IFIFO S_IFMT S_IREAD
syn keyword xsMacro S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU S_ISBLK
syn keyword xsMacro S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISLNK S_ISREG S_ISSOCK
syn keyword xsMacro S_ISUID S_IWGRP S_IWOTH S_IWRITE S_IWUSR S_IXGRP S_IXOTH
syn keyword xsMacro S_IXUSR S_PAT_MODS Safefree Semctl Sigjmp_buf Siglongjmp
-syn keyword xsMacro Sigsetjmp Size_t_size StGiFy StashHANDLER Stat Strerror
-syn keyword xsMacro Strtol Strtoul StructCopy SvAMAGIC SvAMAGIC_off
-syn keyword xsMacro SvAMAGIC_on SvANY SvCANEXISTDELETE SvCOMPILED
-syn keyword xsMacro SvCOMPILED_off SvCOMPILED_on SvCUR SvCUR_set
-syn keyword xsMacro SvDESTROYABLE SvEND SvEND_set SvENDx SvEVALED
-syn keyword xsMacro SvEVALED_off SvEVALED_on SvFAKE SvFAKE_off SvFAKE_on
-syn keyword xsMacro SvFLAGS SvGAMAGIC SvGETMAGIC SvGMAGICAL SvGMAGICAL_off
-syn keyword xsMacro SvGMAGICAL_on SvGROW SvGROW_mutable SvIMMORTAL SvIOK
-syn keyword xsMacro SvIOK_UV SvIOK_notUV SvIOK_off SvIOK_on SvIOK_only
+syn keyword xsMacro Sigsetjmp Size_t_MAX Size_t_size StGiFy StashHANDLER Stat
+syn keyword xsMacro Strerror Strtol Strtoul StructCopy SvAMAGIC SvANY
+syn keyword xsMacro SvCANCOW SvCANEXISTDELETE SvCOMPILED SvCOMPILED_off
+syn keyword xsMacro SvCOMPILED_on SvCUR SvCUR_set SvDESTROYABLE SvEND
+syn keyword xsMacro SvEND_set SvENDx SvEVALED SvEVALED_off SvEVALED_on SvFAKE
+syn keyword xsMacro SvFAKE_off SvFAKE_on SvFLAGS SvGAMAGIC SvGETMAGIC SvGID
+syn keyword xsMacro SvGMAGICAL SvGMAGICAL_off SvGMAGICAL_on SvGROW
+syn keyword xsMacro SvGROW_mutable SvIMMORTAL SvIOK SvIOK_UV SvIOK_nog
+syn keyword xsMacro SvIOK_nogthink SvIOK_notUV SvIOK_off SvIOK_on SvIOK_only
syn keyword xsMacro SvIOK_only_UV SvIOKp SvIOKp_on SvIS_FREED SvIV SvIVX
syn keyword xsMacro SvIVXx SvIV_nomg SvIV_please SvIV_please_nomg SvIV_set
-syn keyword xsMacro SvIVx SvIsCOW SvIsCOW_normal SvIsCOW_shared_hash SvIsUV
-syn keyword xsMacro SvIsUV_off SvIsUV_on SvLEN SvLEN_set SvLENx SvLOCK
-syn keyword xsMacro SvMAGIC SvMAGICAL SvMAGICAL_off SvMAGICAL_on SvMAGIC_set
-syn keyword xsMacro SvNIOK SvNIOK_off SvNIOKp SvNOK SvNOK_off SvNOK_on
-syn keyword xsMacro SvNOK_only SvNOKp SvNOKp_on SvNV SvNVX SvNVXx SvNV_nomg
-syn keyword xsMacro SvNV_set SvNVx SvOBJECT SvOBJECT_off SvOBJECT_on SvOK
-syn keyword xsMacro SvOK_off SvOK_off_exc_UV SvOKp SvOOK SvOOK_off
-syn keyword xsMacro SvOOK_offset SvOOK_on SvOURSTASH SvOURSTASH_set SvPADMY
-syn keyword xsMacro SvPADMY_on SvPADSTALE SvPADSTALE_off SvPADSTALE_on
-syn keyword xsMacro SvPADTMP SvPADTMP_off SvPADTMP_on SvPAD_OUR SvPAD_OUR_on
+syn keyword xsMacro SvIVx SvIsCOW SvIsCOW_normal SvIsCOW_off SvIsCOW_on
+syn keyword xsMacro SvIsCOW_shared_hash SvIsUV SvIsUV_off SvIsUV_on SvLEN
+syn keyword xsMacro SvLEN_set SvLENx SvLOCK SvMAGIC SvMAGICAL SvMAGICAL_off
+syn keyword xsMacro SvMAGICAL_on SvMAGIC_set SvNIOK SvNIOK_nog
+syn keyword xsMacro SvNIOK_nogthink SvNIOK_off SvNIOKp SvNOK SvNOK_nog
+syn keyword xsMacro SvNOK_nogthink SvNOK_off SvNOK_on SvNOK_only SvNOKp
+syn keyword xsMacro SvNOKp_on SvNV SvNVX SvNVXx SvNV_nomg SvNV_set SvNVx
+syn keyword xsMacro SvOBJECT SvOBJECT_off SvOBJECT_on SvOK SvOK_off
+syn keyword xsMacro SvOK_off_exc_UV SvOKp SvOOK SvOOK_off SvOOK_offset
+syn keyword xsMacro SvOOK_on SvOURSTASH SvOURSTASH_set SvPADMY SvPADMY_on
+syn keyword xsMacro SvPADSTALE SvPADSTALE_off SvPADSTALE_on SvPADTMP
+syn keyword xsMacro SvPADTMP_off SvPADTMP_on SvPAD_OUR SvPAD_OUR_on
syn keyword xsMacro SvPAD_STATE SvPAD_STATE_on SvPAD_TYPED SvPAD_TYPED_on
syn keyword xsMacro SvPCS_IMPORTED SvPCS_IMPORTED_off SvPCS_IMPORTED_on
-syn keyword xsMacro SvPEEK SvPOK SvPOK_off SvPOK_on SvPOK_only
-syn keyword xsMacro SvPOK_only_UTF8 SvPOKp SvPOKp_on SvPV SvPVX SvPVX_const
-syn keyword xsMacro SvPVX_mutable SvPVXx SvPV_const SvPV_flags
-syn keyword xsMacro SvPV_flags_const SvPV_flags_const_nolen
+syn keyword xsMacro SvPEEK SvPOK SvPOK_byte_nog SvPOK_byte_nogthink
+syn keyword xsMacro SvPOK_byte_pure_nogthink SvPOK_nog SvPOK_nogthink
+syn keyword xsMacro SvPOK_off SvPOK_on SvPOK_only SvPOK_only_UTF8
+syn keyword xsMacro SvPOK_pure_nogthink SvPOK_utf8_nog SvPOK_utf8_nogthink
+syn keyword xsMacro SvPOK_utf8_pure_nogthink SvPOKp SvPOKp_on SvPV SvPVX
+syn keyword xsMacro SvPVX_const SvPVX_mutable SvPVXtrue SvPVXx SvPV_const
+syn keyword xsMacro SvPV_flags SvPV_flags_const SvPV_flags_const_nolen
syn keyword xsMacro SvPV_flags_mutable SvPV_force SvPV_force_flags
syn keyword xsMacro SvPV_force_flags_mutable SvPV_force_flags_nolen
syn keyword xsMacro SvPV_force_mutable SvPV_force_nolen SvPV_force_nomg
@@ -2927,44 +3265,49 @@ syn keyword xsMacro SvPVbytex SvPVbytex_force SvPVbytex_nolen SvPVutf8
syn keyword xsMacro SvPVutf8_force SvPVutf8_nolen SvPVutf8x SvPVutf8x_force
syn keyword xsMacro SvPVx SvPVx_const SvPVx_force SvPVx_nolen
syn keyword xsMacro SvPVx_nolen_const SvREADONLY SvREADONLY_off SvREADONLY_on
-syn keyword xsMacro SvREFCNT SvREFCNT_dec SvREFCNT_inc SvREFCNT_inc_NN
-syn keyword xsMacro SvREFCNT_inc_simple SvREFCNT_inc_simple_NN
-syn keyword xsMacro SvREFCNT_inc_simple_void SvREFCNT_inc_simple_void_NN
-syn keyword xsMacro SvREFCNT_inc_void SvREFCNT_inc_void_NN SvRELEASE_IVX
-syn keyword xsMacro SvRELEASE_IVX_ SvRMAGICAL SvRMAGICAL_off SvRMAGICAL_on
-syn keyword xsMacro SvROK SvROK_off SvROK_on SvRV SvRV_const SvRV_set SvRVx
-syn keyword xsMacro SvRX SvRXOK SvSCREAM SvSCREAM_off SvSCREAM_on SvSETMAGIC
-syn keyword xsMacro SvSHARE SvSHARED_HASH SvSHARED_HEK_FROM_PV SvSMAGICAL
+syn keyword xsMacro SvREFCNT SvREFCNT_IMMORTAL SvREFCNT_dec SvREFCNT_dec_NN
+syn keyword xsMacro SvREFCNT_inc SvREFCNT_inc_NN SvREFCNT_inc_simple
+syn keyword xsMacro SvREFCNT_inc_simple_NN SvREFCNT_inc_simple_void
+syn keyword xsMacro SvREFCNT_inc_simple_void_NN SvREFCNT_inc_void
+syn keyword xsMacro SvREFCNT_inc_void_NN SvRELEASE_IVX SvRELEASE_IVX_
+syn keyword xsMacro SvRMAGICAL SvRMAGICAL_off SvRMAGICAL_on SvROK SvROK_off
+syn keyword xsMacro SvROK_on SvRV SvRV_const SvRV_set SvRVx SvRX SvRXOK
+syn keyword xsMacro SvSCREAM SvSCREAM_off SvSCREAM_on SvSETMAGIC SvSHARE
+syn keyword xsMacro SvSHARED_HASH SvSHARED_HEK_FROM_PV SvSMAGICAL
syn keyword xsMacro SvSMAGICAL_off SvSMAGICAL_on SvSTASH SvSTASH_set
syn keyword xsMacro SvSetMagicSV SvSetMagicSV_nosteal SvSetSV SvSetSV_and
syn keyword xsMacro SvSetSV_nosteal SvSetSV_nosteal_and SvTAIL SvTAIL_off
syn keyword xsMacro SvTAIL_on SvTAINT SvTAINTED SvTAINTED_off SvTAINTED_on
syn keyword xsMacro SvTEMP SvTEMP_off SvTEMP_on SvTHINKFIRST SvTIED_mg
-syn keyword xsMacro SvTIED_obj SvTRUE SvTRUE_nomg SvTRUEx SvTYPE SvUNLOCK
-syn keyword xsMacro SvUOK SvUPGRADE SvUTF8 SvUTF8_off SvUTF8_on SvUV SvUVX
-syn keyword xsMacro SvUVXx SvUV_nomg SvUV_set SvUVx SvVALID SvVALID_off
-syn keyword xsMacro SvVALID_on SvVOK SvVSTRING_mg SvWEAKREF SvWEAKREF_off
-syn keyword xsMacro SvWEAKREF_on Sv_Grow TAIL TAINT TAINT_ENV TAINT_IF
-syn keyword xsMacro TAINT_NOT TAINT_PROPER THING THR THREAD_CREATE
+syn keyword xsMacro SvTIED_obj SvTRUE SvTRUE_NN SvTRUE_common SvTRUE_nomg
+syn keyword xsMacro SvTRUE_nomg_NN SvTRUEx SvTRUEx_nomg SvTYPE SvUID SvUNLOCK
+syn keyword xsMacro SvUOK SvUOK_nog SvUOK_nogthink SvUPGRADE SvUTF8
+syn keyword xsMacro SvUTF8_off SvUTF8_on SvUV SvUVX SvUVXx SvUV_nomg SvUV_set
+syn keyword xsMacro SvUVx SvVALID SvVALID_off SvVALID_on SvVOK SvVSTRING_mg
+syn keyword xsMacro SvWEAKREF SvWEAKREF_off SvWEAKREF_on Sv_Grow TAIL TAINT
+syn keyword xsMacro TAINTING_get TAINTING_set TAINT_ENV TAINT_IF TAINT_NOT
+syn keyword xsMacro TAINT_PROPER TAINT_WARN_get TAINT_WARN_set TAINT_get
+syn keyword xsMacro TAINT_set THING THR THREAD_CREATE
syn keyword xsMacro THREAD_CREATE_NEEDS_STACK THREAD_POST_CREATE
syn keyword xsMacro THREAD_RET_CAST THREAD_RET_TYPE
syn keyword xsMacro TIED_METHOD_ARGUMENTS_ON_STACK
syn keyword xsMacro TIED_METHOD_MORTALIZE_NOT_NEEDED TIED_METHOD_SAY
syn keyword xsMacro TIME64_CONFIG_H TIME64_H TM TMPNAM_R_PROTO TOO_LATE_FOR
syn keyword xsMacro TOO_LATE_FOR_ TOPBLOCK TOPMARK TOPi TOPl TOPm1s TOPn TOPp
-syn keyword xsMacro TOPp1s TOPpx TOPq TOPs TOPu TOPul TOPuq TRIE TRIEC
-syn keyword xsMacro TRIE_BITMAP TRIE_BITMAP_BYTE TRIE_BITMAP_CLEAR
-syn keyword xsMacro TRIE_BITMAP_SET TRIE_BITMAP_TEST TRIE_CHARCOUNT
-syn keyword xsMacro TRIE_NODEIDX TRIE_NODENUM TRIE_WORDS_OFFSET TRIE_next
-syn keyword xsMacro TRIE_next_fail TTYNAME_R_PROTO TWO_BYTE_UTF8_TO_UNI
-syn keyword xsMacro TYPE_CHARS TYPE_DIGITS Timeval U16SIZE U16TYPE U16_CONST
-syn keyword xsMacro U16_MAX U16_MIN U32SIZE U32TYPE U32_ALIGNMENT_REQUIRED
-syn keyword xsMacro U32_CONST U32_MAX U32_MAX_P1 U32_MAX_P1_HALF U32_MIN
-syn keyword xsMacro U64SIZE U64TYPE U64_CONST U8SIZE U8TYPE U8_MAX U8_MIN
-syn keyword xsMacro UCHARAT UINT32_MIN UINT64_C UINT64_MIN UMINUS UNDERBAR
-syn keyword xsMacro UNICODE_ALLOW_ANY UNICODE_ALLOW_SUPER
-syn keyword xsMacro UNICODE_ALLOW_SURROGATE UNICODE_BYTE_ORDER_MARK
-syn keyword xsMacro UNICODE_DISALLOW_FE_FF
+syn keyword xsMacro TOPp1s TOPpx TOPs TOPu TOPul TRIE TRIEC TRIE_BITMAP
+syn keyword xsMacro TRIE_BITMAP_BYTE TRIE_BITMAP_CLEAR TRIE_BITMAP_SET
+syn keyword xsMacro TRIE_BITMAP_TEST TRIE_CHARCOUNT TRIE_NODEIDX TRIE_NODENUM
+syn keyword xsMacro TRIE_WORDS_OFFSET TRIE_next TRIE_next_fail TRUE
+syn keyword xsMacro TTYNAME_R_PROTO TWO_BYTE_UTF8_TO_NATIVE
+syn keyword xsMacro TWO_BYTE_UTF8_TO_UNI TYPE_CHARS TYPE_DIGITS Timeval
+syn keyword xsMacro U16SIZE U16TYPE U16_CONST U16_MAX U16_MIN U32SIZE U32TYPE
+syn keyword xsMacro U32_ALIGNMENT_REQUIRED U32_CONST U32_MAX U32_MAX_P1
+syn keyword xsMacro U32_MAX_P1_HALF U32_MIN U64SIZE U64TYPE U64_CONST U8SIZE
+syn keyword xsMacro U8TO16_LE U8TO32_LE U8TO64_LE U8TYPE U8_MAX U8_MIN
+syn keyword xsMacro UCHARAT UINT32_MIN UINT64_C UINT64_MIN UMINUS
+syn keyword xsMacro UNALIGNED_SAFE UNDERBAR UNICODE_ALLOW_ANY
+syn keyword xsMacro UNICODE_ALLOW_SUPER UNICODE_ALLOW_SURROGATE
+syn keyword xsMacro UNICODE_BYTE_ORDER_MARK UNICODE_DISALLOW_FE_FF
syn keyword xsMacro UNICODE_DISALLOW_ILLEGAL_INTERCHANGE
syn keyword xsMacro UNICODE_DISALLOW_NONCHAR UNICODE_DISALLOW_SUPER
syn keyword xsMacro UNICODE_DISALLOW_SURROGATE
@@ -2983,295 +3326,351 @@ syn keyword xsMacro UNICODE_WARN_ILLEGAL_INTERCHANGE UNICODE_WARN_NONCHAR
syn keyword xsMacro UNICODE_WARN_SUPER UNICODE_WARN_SURROGATE UNIOP UNIOPSUB
syn keyword xsMacro UNISKIP UNI_DISPLAY_BACKSLASH UNI_DISPLAY_ISPRINT
syn keyword xsMacro UNI_DISPLAY_QQ UNI_DISPLAY_REGEX UNI_IS_INVARIANT
-syn keyword xsMacro UNI_TO_NATIVE UNLESS UNLESSM UNLIKELY UNLINK
-syn keyword xsMacro UNLOCK_DOLLARZERO_MUTEX UNTIL USE USE_64_BIT_ALL
-syn keyword xsMacro USE_64_BIT_INT USE_64_BIT_RAWIO USE_64_BIT_STDIO
-syn keyword xsMacro USE_BSDPGRP USE_DYNAMIC_LOADING USE_ENVIRON_ARRAY
-syn keyword xsMacro USE_HASH_SEED USE_HEAP_INSTEAD_OF_STACK USE_LARGE_FILES
-syn keyword xsMacro USE_LEFT USE_LOCALE USE_LOCALE_COLLATE USE_LOCALE_CTYPE
-syn keyword xsMacro USE_LOCALE_NUMERIC USE_PERLIO USE_REENTRANT_API
+syn keyword xsMacro UNI_TO_NATIVE UNKNOWN_ERRNO_MSG UNLESS UNLESSM UNLIKELY
+syn keyword xsMacro UNLINK UNLOCK_DOLLARZERO_MUTEX UNLOCK_LC_NUMERIC_STANDARD
+syn keyword xsMacro UNLOCK_NUMERIC_STANDARD UNOP_AUX_item_sv UNTIL
+syn keyword xsMacro UPG_VERSION USE USE_64_BIT_ALL USE_64_BIT_INT
+syn keyword xsMacro USE_64_BIT_RAWIO USE_64_BIT_STDIO USE_BSDPGRP
+syn keyword xsMacro USE_DYNAMIC_LOADING USE_ENVIRON_ARRAY USE_HASH_SEED
+syn keyword xsMacro USE_HEAP_INSTEAD_OF_STACK USE_LARGE_FILES USE_LEFT
+syn keyword xsMacro USE_LOCALE USE_LOCALE_COLLATE USE_LOCALE_CTYPE
+syn keyword xsMacro USE_LOCALE_MESSAGES USE_LOCALE_MONETARY
+syn keyword xsMacro USE_LOCALE_NUMERIC USE_LOCALE_TIME USE_PERLIO
+syn keyword xsMacro USE_PERL_PERTURB_KEYS USE_REENTRANT_API
syn keyword xsMacro USE_SEMCTL_SEMID_DS USE_SEMCTL_SEMUN USE_STAT_BLOCKS
-syn keyword xsMacro USE_STAT_RDEV USE_STDIO USE_STDIO_BASE USE_STDIO_PTR
-syn keyword xsMacro USE_STRUCT_COPY USE_SYSTEM_GMTIME USE_SYSTEM_LOCALTIME
-syn keyword xsMacro USE_THREADS USE_TM64 USE_UTF8_IN_NAMES UTF8SKIP
-syn keyword xsMacro UTF8_ACCUMULATE UTF8_ALLOW_ANY UTF8_ALLOW_ANYUV
-syn keyword xsMacro UTF8_ALLOW_CONTINUATION UTF8_ALLOW_DEFAULT
-syn keyword xsMacro UTF8_ALLOW_EMPTY UTF8_ALLOW_FFFF UTF8_ALLOW_LONG
-syn keyword xsMacro UTF8_ALLOW_NON_CONTINUATION UTF8_ALLOW_SHORT
-syn keyword xsMacro UTF8_ALLOW_SURROGATE UTF8_CHECK_ONLY UTF8_DISALLOW_FE_FF
-syn keyword xsMacro UTF8_DISALLOW_ILLEGAL_INTERCHANGE UTF8_DISALLOW_NONCHAR
-syn keyword xsMacro UTF8_DISALLOW_SUPER UTF8_DISALLOW_SURROGATE
-syn keyword xsMacro UTF8_EIGHT_BIT_HI UTF8_EIGHT_BIT_LO
+syn keyword xsMacro USE_STAT_RDEV USE_STDIO USE_STRUCT_COPY USE_SYSTEM_GMTIME
+syn keyword xsMacro USE_SYSTEM_LOCALTIME USE_THREADS USE_TM64
+syn keyword xsMacro USE_UTF8_IN_NAMES USING_MSVC6 UTF8SKIP UTF8_ACCUMULATE
+syn keyword xsMacro UTF8_ALLOW_ANY UTF8_ALLOW_ANYUV UTF8_ALLOW_CONTINUATION
+syn keyword xsMacro UTF8_ALLOW_DEFAULT UTF8_ALLOW_EMPTY UTF8_ALLOW_FFFF
+syn keyword xsMacro UTF8_ALLOW_LONG UTF8_ALLOW_NON_CONTINUATION
+syn keyword xsMacro UTF8_ALLOW_SHORT UTF8_ALLOW_SURROGATE UTF8_CHECK_ONLY
+syn keyword xsMacro UTF8_DISALLOW_FE_FF UTF8_DISALLOW_ILLEGAL_INTERCHANGE
+syn keyword xsMacro UTF8_DISALLOW_NONCHAR UTF8_DISALLOW_SUPER
+syn keyword xsMacro UTF8_DISALLOW_SURROGATE UTF8_EIGHT_BIT_HI
+syn keyword xsMacro UTF8_EIGHT_BIT_LO
syn keyword xsMacro UTF8_FIRST_PROBLEMATIC_CODE_POINT_FIRST_BYTE
-syn keyword xsMacro UTF8_IS_CONTINUATION UTF8_IS_CONTINUED
-syn keyword xsMacro UTF8_IS_DOWNGRADEABLE_START UTF8_IS_INVARIANT
+syn keyword xsMacro UTF8_IS_ABOVE_LATIN1 UTF8_IS_CONTINUATION
+syn keyword xsMacro UTF8_IS_CONTINUED UTF8_IS_DOWNGRADEABLE_START
+syn keyword xsMacro UTF8_IS_INVARIANT UTF8_IS_NEXT_CHAR_DOWNGRADEABLE
syn keyword xsMacro UTF8_IS_NONCHAR_
syn keyword xsMacro UTF8_IS_NONCHAR_GIVEN_THAT_NON_SUPER_AND_GE_PROBLEMATIC
-syn keyword xsMacro UTF8_IS_START UTF8_IS_SUPER UTF8_IS_SURROGATE
-syn keyword xsMacro UTF8_MAXBYTES UTF8_MAXBYTES_CASE UTF8_MAXLEN
-syn keyword xsMacro UTF8_MAX_FOLD_CHAR_EXPAND UTF8_QUAD_MAX UTF8_TWO_BYTE_HI
-syn keyword xsMacro UTF8_TWO_BYTE_HI_nocast UTF8_TWO_BYTE_LO
+syn keyword xsMacro UTF8_IS_REPLACEMENT UTF8_IS_START UTF8_IS_SUPER
+syn keyword xsMacro UTF8_IS_SURROGATE UTF8_MAXBYTES UTF8_MAXBYTES_CASE
+syn keyword xsMacro UTF8_MAXLEN UTF8_MAX_FOLD_CHAR_EXPAND UTF8_QUAD_MAX
+syn keyword xsMacro UTF8_TWO_BYTE_HI UTF8_TWO_BYTE_HI_nocast UTF8_TWO_BYTE_LO
syn keyword xsMacro UTF8_TWO_BYTE_LO_nocast UTF8_WARN_FE_FF
syn keyword xsMacro UTF8_WARN_ILLEGAL_INTERCHANGE UTF8_WARN_NONCHAR
-syn keyword xsMacro UTF8_WARN_SUPER UTF8_WARN_SURROGATE
+syn keyword xsMacro UTF8_WARN_SUPER UTF8_WARN_SURROGATE UTF8f UTF8fARG
syn keyword xsMacro UTF_ACCUMULATION_OVERFLOW_MASK UTF_ACCUMULATION_SHIFT
syn keyword xsMacro UTF_CONTINUATION_MARK UTF_CONTINUATION_MASK
-syn keyword xsMacro UTF_START_MARK UTF_START_MASK UTF_TO_NATIVE UVSIZE UVTYPE
-syn keyword xsMacro UVXf UV_DIG UV_MAX UV_MAX_P1 UV_MAX_P1_HALF UV_MIN UVf
-syn keyword xsMacro U_32 U_I U_L U_S U_V Uid_t_f Uid_t_sign Uid_t_size
-syn keyword xsMacro VAL_EAGAIN VAL_O_NONBLOCK VDf VERB VERTWS VOIDFLAGS
-syn keyword xsMacro VOIDUSED VOL VTBL_amagic VTBL_amagicelem VTBL_arylen
-syn keyword xsMacro VTBL_bm VTBL_collxfrm VTBL_dbline VTBL_defelem VTBL_env
+syn keyword xsMacro UTF_START_MARK UTF_START_MASK UTF_TO_NATIVE
+syn keyword xsMacro UVCHR_IS_INVARIANT UVCHR_SKIP UVSIZE UVTYPE UVXf UV_DIG
+syn keyword xsMacro UV_MAX UV_MAX_P1 UV_MAX_P1_HALF UV_MIN UVf U_32 U_I U_L
+syn keyword xsMacro U_S U_V Uid_t_f Uid_t_sign Uid_t_size VAL_EAGAIN
+syn keyword xsMacro VAL_O_NONBLOCK VCMP VERB VNORMAL VNUMIFY VOL VSTRINGIFY
+syn keyword xsMacro VTBL_amagic VTBL_amagicelem VTBL_arylen VTBL_bm
+syn keyword xsMacro VTBL_collxfrm VTBL_dbline VTBL_defelem VTBL_env
syn keyword xsMacro VTBL_envelem VTBL_fm VTBL_glob VTBL_isa VTBL_isaelem
syn keyword xsMacro VTBL_mglob VTBL_nkeys VTBL_pack VTBL_packelem VTBL_pos
syn keyword xsMacro VTBL_regdata VTBL_regdatum VTBL_regexp VTBL_sigelem
syn keyword xsMacro VTBL_substr VTBL_sv VTBL_taint VTBL_uvar VTBL_vec
-syn keyword xsMacro WARN_ALL WARN_ALLstring WARN_AMBIGUOUS WARN_BAREWORD
-syn keyword xsMacro WARN_CLOSED WARN_CLOSURE WARN_DEBUGGING WARN_DEPRECATED
-syn keyword xsMacro WARN_DIGIT WARN_EXEC WARN_EXITING WARN_GLOB
+syn keyword xsMacro VT_NATIVE VUTIL_REPLACE_CORE VVERIFY WARN_ALL
+syn keyword xsMacro WARN_ALLstring WARN_AMBIGUOUS WARN_BAREWORD WARN_CLOSED
+syn keyword xsMacro WARN_CLOSURE WARN_DEBUGGING WARN_DEPRECATED WARN_DIGIT
+syn keyword xsMacro WARN_EXEC WARN_EXITING WARN_EXPERIMENTAL
+syn keyword xsMacro WARN_EXPERIMENTAL__AUTODEREF WARN_EXPERIMENTAL__BITWISE
+syn keyword xsMacro WARN_EXPERIMENTAL__CONST_ATTR
+syn keyword xsMacro WARN_EXPERIMENTAL__LEXICAL_SUBS
+syn keyword xsMacro WARN_EXPERIMENTAL__LEXICAL_TOPIC
+syn keyword xsMacro WARN_EXPERIMENTAL__POSTDEREF
+syn keyword xsMacro WARN_EXPERIMENTAL__REFALIASING
+syn keyword xsMacro WARN_EXPERIMENTAL__REGEX_SETS
+syn keyword xsMacro WARN_EXPERIMENTAL__RE_STRICT
+syn keyword xsMacro WARN_EXPERIMENTAL__SIGNATURES
+syn keyword xsMacro WARN_EXPERIMENTAL__SMARTMATCH
+syn keyword xsMacro WARN_EXPERIMENTAL__WIN32_PERLIO WARN_GLOB
syn keyword xsMacro WARN_ILLEGALPROTO WARN_IMPRECISION WARN_INPLACE
-syn keyword xsMacro WARN_INTERNAL WARN_IO WARN_LAYER WARN_MALLOC WARN_MISC
-syn keyword xsMacro WARN_NEWLINE WARN_NONCHAR WARN_NONEstring
-syn keyword xsMacro WARN_NON_UNICODE WARN_NUMERIC WARN_ONCE WARN_OVERFLOW
-syn keyword xsMacro WARN_PACK WARN_PARENTHESIS WARN_PIPE WARN_PORTABLE
-syn keyword xsMacro WARN_PRECEDENCE WARN_PRINTF WARN_PROTOTYPE WARN_QW
-syn keyword xsMacro WARN_RECURSION WARN_REDEFINE WARN_REGEXP WARN_RESERVED
-syn keyword xsMacro WARN_SEMICOLON WARN_SEVERE WARN_SIGNAL WARN_SUBSTR
-syn keyword xsMacro WARN_SURROGATE WARN_SYNTAX WARN_TAINT WARN_THREADS
-syn keyword xsMacro WARN_UNINITIALIZED WARN_UNOPENED WARN_UNPACK WARN_UNTIE
-syn keyword xsMacro WARN_UTF8 WARN_VOID WARNshift WARNsize WEXITSTATUS WHEN
-syn keyword xsMacro WHILE WHILEM WHILEM_A_max WHILEM_A_max_fail WHILEM_A_min
+syn keyword xsMacro WARN_INTERNAL WARN_IO WARN_LAYER WARN_LOCALE WARN_MALLOC
+syn keyword xsMacro WARN_MISC WARN_MISSING WARN_NEWLINE WARN_NONCHAR
+syn keyword xsMacro WARN_NONEstring WARN_NON_UNICODE WARN_NUMERIC WARN_ONCE
+syn keyword xsMacro WARN_OVERFLOW WARN_PACK WARN_PARENTHESIS WARN_PIPE
+syn keyword xsMacro WARN_PORTABLE WARN_PRECEDENCE WARN_PRINTF WARN_PROTOTYPE
+syn keyword xsMacro WARN_QW WARN_RECURSION WARN_REDEFINE WARN_REDUNDANT
+syn keyword xsMacro WARN_REGEXP WARN_RESERVED WARN_SEMICOLON WARN_SEVERE
+syn keyword xsMacro WARN_SIGNAL WARN_SUBSTR WARN_SURROGATE WARN_SYNTAX
+syn keyword xsMacro WARN_SYSCALLS WARN_TAINT WARN_THREADS WARN_UNINITIALIZED
+syn keyword xsMacro WARN_UNOPENED WARN_UNPACK WARN_UNTIE WARN_UTF8 WARN_VOID
+syn keyword xsMacro WARNshift WARNsize WB_ENUM_COUNT WEXITSTATUS WHEN WHILE
+syn keyword xsMacro WHILEM WHILEM_A_max WHILEM_A_max_fail WHILEM_A_min
syn keyword xsMacro WHILEM_A_min_fail WHILEM_A_pre WHILEM_A_pre_fail
syn keyword xsMacro WHILEM_B_max WHILEM_B_max_fail WHILEM_B_min
syn keyword xsMacro WHILEM_B_min_fail WIDEST_UTYPE WIFEXITED WIFSIGNALED
syn keyword xsMacro WIFSTOPPED WIN32SCK_IS_STDSCK WNOHANG WORD WSTOPSIG
-syn keyword xsMacro WTERMSIG WUNTRACED XHvTOTALKEYS XOPd_xop_class
-syn keyword xsMacro XOPd_xop_desc XOPd_xop_name XOPd_xop_peep XOPf_xop_class
-syn keyword xsMacro XOPf_xop_desc XOPf_xop_name XOPf_xop_peep XPUSHTARG
-syn keyword xsMacro XPUSHi XPUSHmortal XPUSHn XPUSHp XPUSHs XPUSHu XPUSHundef
-syn keyword xsMacro XS XSANY XSINTERFACE_CVT XSINTERFACE_CVT_ANON
+syn keyword xsMacro WTERMSIG WUNTRACED XDIGIT_VALUE XHvTOTALKEYS
+syn keyword xsMacro XOPd_xop_class XOPd_xop_desc XOPd_xop_name XOPd_xop_peep
+syn keyword xsMacro XOPf_xop_class XOPf_xop_desc XOPf_xop_name XOPf_xop_peep
+syn keyword xsMacro XPUSHTARG XPUSHi XPUSHmortal XPUSHn XPUSHp XPUSHs XPUSHu
+syn keyword xsMacro XPUSHundef XS XSANY XSINTERFACE_CVT XSINTERFACE_CVT_ANON
syn keyword xsMacro XSINTERFACE_FUNC XSINTERFACE_FUNC_SET XSPROTO XSRETURN
syn keyword xsMacro XSRETURN_EMPTY XSRETURN_IV XSRETURN_NO XSRETURN_NV
syn keyword xsMacro XSRETURN_PV XSRETURN_PVN XSRETURN_UNDEF XSRETURN_UV
syn keyword xsMacro XSRETURN_YES XST_mIV XST_mNO XST_mNV XST_mPV XST_mPVN
syn keyword xsMacro XST_mUNDEF XST_mUV XST_mYES XS_APIVERSION_BOOTCHECK
+syn keyword xsMacro XS_APIVERSION_POPMARK_BOOTCHECK
+syn keyword xsMacro XS_APIVERSION_SETXSUBFN_POPMARK_BOOTCHECK
+syn keyword xsMacro XS_BOTHVERSION_BOOTCHECK XS_BOTHVERSION_POPMARK_BOOTCHECK
+syn keyword xsMacro XS_BOTHVERSION_SETXSUBFN_POPMARK_BOOTCHECK
syn keyword xsMacro XS_DYNAMIC_FILENAME XS_EXTERNAL XS_INTERNAL
-syn keyword xsMacro XS_VERSION_BOOTCHECK XSprePUSH XTENDED_PAT_MOD XopDISABLE
-syn keyword xsMacro XopENABLE XopENTRY XopENTRY_set XopFLAGS YADAYADA YIELD
+syn keyword xsMacro XS_SETXSUBFN_POPMARK XS_VERSION_BOOTCHECK XSprePUSH
+syn keyword xsMacro XTENDED_PAT_MOD XopDISABLE XopENABLE XopENTRY
+syn keyword xsMacro XopENTRYCUSTOM XopENTRY_set XopFLAGS YADAYADA YIELD
syn keyword xsMacro YYEMPTY YYSTYPE_IS_DECLARED YYSTYPE_IS_TRIVIAL
-syn keyword xsMacro YYTOKENTYPE Zero ZeroD _ _CANNOT _CC_ALNUMC_A
-syn keyword xsMacro _CC_ALNUMC_L1 _CC_ALPHA_A _CC_ALPHA_L1 _CC_BLANK_A
-syn keyword xsMacro _CC_BLANK_L1 _CC_CHARNAME_CONT _CC_CNTRL_A _CC_CNTRL_L1
-syn keyword xsMacro _CC_DIGIT_A _CC_GRAPH_A _CC_GRAPH_L1 _CC_IDFIRST_A
-syn keyword xsMacro _CC_IDFIRST_L1 _CC_LOWER_A _CC_LOWER_L1
-syn keyword xsMacro _CC_NONLATIN1_FOLD _CC_OCTAL_A _CC_PRINT_A _CC_PRINT_L1
-syn keyword xsMacro _CC_PSXSPC_A _CC_PSXSPC_L1 _CC_PUNCT_A _CC_PUNCT_L1
-syn keyword xsMacro _CC_QUOTEMETA _CC_SPACE_A _CC_SPACE_L1 _CC_UPPER_A
-syn keyword xsMacro _CC_UPPER_L1 _CC_WORDCHAR_A _CC_WORDCHAR_L1 _CC_XDIGIT_A
-syn keyword xsMacro _CPERLarg _GNU_SOURCE
+syn keyword xsMacro YYTOKENTYPE Zero ZeroD _ _CANNOT _CC_ALPHA
+syn keyword xsMacro _CC_ALPHANUMERIC _CC_ASCII _CC_BLANK _CC_CASED
+syn keyword xsMacro _CC_CHARNAME_CONT _CC_CNTRL _CC_DIGIT _CC_GRAPH
+syn keyword xsMacro _CC_IDFIRST _CC_IS_IN_SOME_FOLD _CC_LOWER
+syn keyword xsMacro _CC_MNEMONIC_CNTRL _CC_NONLATIN1_FOLD
+syn keyword xsMacro _CC_NONLATIN1_SIMPLE_FOLD _CC_NON_FINAL_FOLD _CC_PRINT
+syn keyword xsMacro _CC_PUNCT _CC_QUOTEMETA _CC_SPACE _CC_UPPER _CC_VERTSPACE
+syn keyword xsMacro _CC_WORDCHAR _CC_XDIGIT _CC_mask _CC_mask_A
+syn keyword xsMacro _CHECK_AND_OUTPUT_WIDE_LOCALE_CP_MSG
+syn keyword xsMacro _CHECK_AND_OUTPUT_WIDE_LOCALE_UTF8_MSG
+syn keyword xsMacro _CHECK_AND_WARN_PROBLEMATIC_LOCALE
+syn keyword xsMacro _CORE_SWASH_INIT_ACCEPT_INVLIST
+syn keyword xsMacro _CORE_SWASH_INIT_RETURN_IF_UNDEF
+syn keyword xsMacro _CORE_SWASH_INIT_USER_DEFINED_PROPERTY _CPERLarg
+syn keyword xsMacro _FIRST_NON_SWASH_CC _GNU_SOURCE
syn keyword xsMacro _HAS_NONLATIN1_FOLD_CLOSURE_ONLY_FOR_USE_BY_REGCOMP_DOT_C_AND_REGEXEC_DOT_C
-syn keyword xsMacro _INC_PERL_XSUB_H _PERLIOL_H _PERLIO_H _PERL_OBJECT_THIS
-syn keyword xsMacro _REGEXP_COMMON _RXf_PMf_CHARSET_SHIFT _RXf_PMf_SHIFT_NEXT
-syn keyword xsMacro _SOCKADDR_LEN _STDIO_H _STDIO_INCLUDED _V _XPVCV_COMMON
-syn keyword xsMacro _XPV_HEAD __Inc__IPerl___ __PATCHLEVEL_H_INCLUDED__
-syn keyword xsMacro __STDIO_LOADED __attribute__deprecated__
-syn keyword xsMacro __attribute__format__ __attribute__format__null_ok__
-syn keyword xsMacro __attribute__malloc__ __attribute__nonnull__
-syn keyword xsMacro __attribute__noreturn__ __attribute__pure__
-syn keyword xsMacro __attribute__unused__ __attribute__warn_unused_result__
-syn keyword xsMacro __filbuf __flsbuf __perlapi_h__ _config_h_ _exit _filbuf
-syn keyword xsMacro _flsbuf _isQUOTEMETA _stdopen _swab_16_ _swab_32_
-syn keyword xsMacro _swab_64_ aTHXo aTHXo_ aTHXx aTHXx_ abort accept access
+syn keyword xsMacro _HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE_ONLY_FOR_USE_BY_REGCOMP_DOT_C_AND_REGEXEC_DOT_C
+syn keyword xsMacro _HIGHEST_REGCOMP_DOT_H_SYNC _INC_PERL_XSUB_H
+syn keyword xsMacro _IS_IN_SOME_FOLD_ONLY_FOR_USE_BY_REGCOMP_DOT_C
+syn keyword xsMacro _IS_MNEMONIC_CNTRL_ONLY_FOR_USE_BY_REGCOMP_DOT_C
+syn keyword xsMacro _IS_NON_FINAL_FOLD_ONLY_FOR_USE_BY_REGCOMP_DOT_C _LC_CAST
+syn keyword xsMacro _MEM_WRAP_NEEDS_RUNTIME_CHECK _MEM_WRAP_WILL_WRAP
+syn keyword xsMacro _NOT_IN_NUMERIC_STANDARD _NOT_IN_NUMERIC_UNDERLYING
+syn keyword xsMacro _NV_BODYLESS_UNION _OP_SIBPARENT_FIELDNAME _PERLIOL_H
+syn keyword xsMacro _PERLIO_H _PERL_OBJECT_THIS _REGEXP_COMMON
+syn keyword xsMacro _RXf_PMf_CHARSET_SHIFT _RXf_PMf_SHIFT_COMPILETIME
+syn keyword xsMacro _RXf_PMf_SHIFT_NEXT _STDIO_H _STDIO_INCLUDED _V
+syn keyword xsMacro _XPVCV_COMMON _XPV_HEAD __ASSERT_ __BASE_TWO_BYTE_HI
+syn keyword xsMacro __BASE_TWO_BYTE_LO __Inc__IPerl___
+syn keyword xsMacro __PATCHLEVEL_H_INCLUDED__ __PL_inf_float_int32
+syn keyword xsMacro __PL_nan_float_int32 __STDIO_LOADED
+syn keyword xsMacro __attribute__deprecated__ __attribute__format__
+syn keyword xsMacro __attribute__format__null_ok__ __attribute__malloc__
+syn keyword xsMacro __attribute__nonnull__ __attribute__noreturn__
+syn keyword xsMacro __attribute__pure__ __attribute__unused__
+syn keyword xsMacro __attribute__warn_unused_result__ __filbuf __flsbuf
+syn keyword xsMacro __has_builtin __perlapi_h__ _config_h_ _exit _filbuf
+syn keyword xsMacro _flsbuf _generic_LC _generic_LC_base
+syn keyword xsMacro _generic_LC_func_utf8 _generic_LC_swash_utf8
+syn keyword xsMacro _generic_LC_swash_uvchr _generic_LC_underscore
+syn keyword xsMacro _generic_LC_utf8 _generic_LC_uvchr _generic_func_utf8
+syn keyword xsMacro _generic_isCC _generic_isCC_A _generic_swash_uni
+syn keyword xsMacro _generic_swash_utf8 _generic_toFOLD_LC
+syn keyword xsMacro _generic_toLOWER_LC _generic_toUPPER_LC _generic_uni
+syn keyword xsMacro _generic_utf8 _generic_utf8_no_upper_latin1 _isQMC
+syn keyword xsMacro _isQUOTEMETA _swab_16_ _swab_32_ _swab_64_ aTHXa aTHXo
+syn keyword xsMacro aTHXo_ aTHXx aTHXx_ abort accept access
syn keyword xsMacro anchored_end_shift anchored_offset anchored_substr
-syn keyword xsMacro anchored_utf8 asctime assert assert_not_ROK
-syn keyword xsMacro assert_not_glob atoll bcmp bind blk_eval blk_format
-syn keyword xsMacro blk_gimme blk_givwhen blk_loop blk_oldcop blk_oldmarksp
-syn keyword xsMacro blk_oldpm blk_oldscopesp blk_oldsp blk_sub blk_u16 boolSV
-syn keyword xsMacro cBINOP cBINOPo cBINOPx cBOOL cCOP cCOPo cCOPx cGVOP_gv
-syn keyword xsMacro cGVOPo_gv cGVOPx_gv cLISTOP cLISTOPo cLISTOPx cLOGOP
-syn keyword xsMacro cLOGOPo cLOGOPx cLOOP cLOOPo cLOOPx cPADOP cPADOPo
+syn keyword xsMacro anchored_utf8 asctime assert assert_ assert_not_ROK
+syn keyword xsMacro assert_not_glob atoll av_tindex bcmp bind blk_eval
+syn keyword xsMacro blk_format blk_gimme blk_givwhen blk_loop blk_oldcop
+syn keyword xsMacro blk_oldmarksp blk_oldpm blk_oldscopesp blk_oldsp blk_sub
+syn keyword xsMacro blk_u16 bool boolSV cBINOP cBINOPo cBINOPx cBOOL cCOP
+syn keyword xsMacro cCOPo cCOPx cGVOP_gv cGVOPo_gv cGVOPx_gv cLISTOP cLISTOPo
+syn keyword xsMacro cLISTOPx cLOGOP cLOGOPo cLOGOPx cLOOP cLOOPo cLOOPx
+syn keyword xsMacro cMETHOPx cMETHOPx_meth cMETHOPx_rclass cPADOP cPADOPo
syn keyword xsMacro cPADOPx cPMOP cPMOPo cPMOPx cPVOP cPVOPo cPVOPx cSVOP
syn keyword xsMacro cSVOP_sv cSVOPo cSVOPo_sv cSVOPx cSVOPx_sv cSVOPx_svp
-syn keyword xsMacro cUNOP cUNOPo cUNOPx chdir check_end_shift
-syn keyword xsMacro check_offset_max check_offset_min check_substr check_utf8
-syn keyword xsMacro child_offset_bits chmod chsize ckDEAD ckWARN ckWARN2
-syn keyword xsMacro ckWARN2_d ckWARN3 ckWARN3_d ckWARN4 ckWARN4_d ckWARN_d
-syn keyword xsMacro close closedir connect cop_hints_2hv cop_hints_fetch_pv
-syn keyword xsMacro cop_hints_fetch_pvn cop_hints_fetch_pvs
-syn keyword xsMacro cop_hints_fetch_sv cophh_2hv cophh_copy cophh_delete_pv
-syn keyword xsMacro cophh_delete_pvn cophh_delete_pvs cophh_delete_sv
-syn keyword xsMacro cophh_fetch_pv cophh_fetch_pvn cophh_fetch_pvs
-syn keyword xsMacro cophh_fetch_sv cophh_free cophh_new_empty cophh_store_pv
-syn keyword xsMacro cophh_store_pvn cophh_store_pvs cophh_store_sv crypt
-syn keyword xsMacro ctermid ctime cv_ckproto cx_type cxstack cxstack_ix
-syn keyword xsMacro cxstack_max dATARGET dAX dAXMARK dEXT dEXTCONST dITEMS
-syn keyword xsMacro dJMPENV dMARK dMULTICALL dMY_CXT dMY_CXT_INTERP
-syn keyword xsMacro dMY_CXT_SV dNOOP dORIGMARK dPOPPOPiirl dPOPPOPnnrl
-syn keyword xsMacro dPOPPOPssrl dPOPTOPiirl dPOPTOPiirl_nomg
-syn keyword xsMacro dPOPTOPiirl_ul_nomg dPOPTOPnnrl dPOPTOPnnrl_nomg
-syn keyword xsMacro dPOPTOPssrl dPOPXiirl dPOPXiirl_ul_nomg dPOPXnnrl
-syn keyword xsMacro dPOPXssrl dPOPiv dPOPnv dPOPnv_nomg dPOPqv dPOPss dPOPuqv
-syn keyword xsMacro dPOPuv dSAVEDERRNO dSAVE_ERRNO dSP dTARG dTARGET
+syn keyword xsMacro cUNOP cUNOP_AUX cUNOP_AUXo cUNOP_AUXx cUNOPo cUNOPx chdir
+syn keyword xsMacro check_end_shift check_offset_max check_offset_min
+syn keyword xsMacro check_substr check_utf8 child_offset_bits chmod chsize
+syn keyword xsMacro ckDEAD ckWARN ckWARN2 ckWARN2_d ckWARN3 ckWARN3_d ckWARN4
+syn keyword xsMacro ckWARN4_d ckWARN_d close closedir connect cop_hints_2hv
+syn keyword xsMacro cop_hints_fetch_pv cop_hints_fetch_pvn
+syn keyword xsMacro cop_hints_fetch_pvs cop_hints_fetch_sv cophh_2hv
+syn keyword xsMacro cophh_copy cophh_delete_pv cophh_delete_pvn
+syn keyword xsMacro cophh_delete_pvs cophh_delete_sv cophh_fetch_pv
+syn keyword xsMacro cophh_fetch_pvn cophh_fetch_pvs cophh_fetch_sv cophh_free
+syn keyword xsMacro cophh_new_empty cophh_store_pv cophh_store_pvn
+syn keyword xsMacro cophh_store_pvs cophh_store_sv crypt ctermid ctime
+syn keyword xsMacro cv_ckproto cx_type cxstack cxstack_ix cxstack_max
+syn keyword xsMacro dATARGET dAX dAXMARK dEXT dEXTCONST dITEMS dJMPENV dMARK
+syn keyword xsMacro dMULTICALL dMY_CXT dMY_CXT_INTERP dMY_CXT_SV dNOOP
+syn keyword xsMacro dORIGMARK dPOPPOPiirl dPOPPOPnnrl dPOPPOPssrl dPOPTOPiirl
+syn keyword xsMacro dPOPTOPiirl_nomg dPOPTOPiirl_ul_nomg dPOPTOPnnrl
+syn keyword xsMacro dPOPTOPnnrl_nomg dPOPTOPssrl dPOPXiirl dPOPXiirl_ul_nomg
+syn keyword xsMacro dPOPXnnrl dPOPXssrl dPOPiv dPOPnv dPOPnv_nomg dPOPss
+syn keyword xsMacro dPOPuv dSAVEDERRNO dSAVE_ERRNO dSP dSS_ADD dTARG dTARGET
syn keyword xsMacro dTARGETSTACKED dTHR dTHX dTHXa dTHXo dTHXoa dTHXs dTHXx
-syn keyword xsMacro dTOPiv dTOPnv dTOPqv dTOPss dTOPuqv dTOPuv dUNDERBAR dVAR
-syn keyword xsMacro dXSARGS dXSFUNCTION dXSI32 dXSTARG dXSUB_SYS deprecate
-syn keyword xsMacro djSP do_open drand48 dup dup2 endgrent endhostent
-syn keyword xsMacro endnetent endprotoent endpwent endservent environ execl
-syn keyword xsMacro execv execvp fcntl fd_set fdopen fileno float_end_shift
-syn keyword xsMacro float_max_offset float_min_offset float_substr float_utf8
-syn keyword xsMacro flock flockfile foldEQ_utf8 frewind fscanf fstat ftell
-syn keyword xsMacro ftruncate ftrylockfile funlockfile fwrite1 generic_uni
-syn keyword xsMacro generic_utf8 get_cvs getc_unlocked getegid geteuid getgid
-syn keyword xsMacro getgrent getgrgid getgrnam gethostbyaddr gethostbyname
-syn keyword xsMacro gethostent gethostname getlogin getnetbyaddr getnetbyname
-syn keyword xsMacro getnetent getpeername getpid getprotobyname
-syn keyword xsMacro getprotobynumber getprotoent getpwent getpwnam getpwuid
-syn keyword xsMacro getservbyname getservbyport getservent getsockname
-syn keyword xsMacro getsockopt getspnam gettimeofday getuid getw gv_AVadd
-syn keyword xsMacro gv_HVadd gv_IOadd gv_SVadd gv_autoload4 gv_efullname3
-syn keyword xsMacro gv_fetchmeth gv_fetchmeth_autoload gv_fetchmethod
-syn keyword xsMacro gv_fetchmethod_flags gv_fetchpvn gv_fetchpvs
-syn keyword xsMacro gv_fetchsv_nomg gv_fullname3 gv_init gv_stashpvs htoni
-syn keyword xsMacro htonl htons htovl htovs hv_delete hv_delete_ent hv_exists
-syn keyword xsMacro hv_exists_ent hv_fetch hv_fetch_ent hv_fetchs hv_iternext
-syn keyword xsMacro hv_magic hv_store hv_store_ent hv_store_flags hv_stores
-syn keyword xsMacro hv_undef ibcmp ibcmp_locale ibcmp_utf8 inet_addr
-syn keyword xsMacro inet_ntoa init_os_extras init_thread_intern ioctl isALNUM
-syn keyword xsMacro isALNUMC isALNUMC_A isALNUMC_L1 isALNUMC_LC
-syn keyword xsMacro isALNUMC_LC_utf8 isALNUMU isALNUM_LC isALNUM_LC_utf8
-syn keyword xsMacro isALNUM_LC_uvchr isALNUM_lazy isALNUM_lazy_if isALNUM_uni
-syn keyword xsMacro isALNUM_utf8 isALPHA isALPHAU isALPHA_A isALPHA_L1
-syn keyword xsMacro isALPHA_LC isALPHA_LC_utf8 isALPHA_LC_uvchr isALPHA_uni
-syn keyword xsMacro isALPHA_utf8 isASCII isASCII_A isASCII_L1 isASCII_LC
-syn keyword xsMacro isASCII_uni isASCII_utf8 isBLANK isBLANK_A isBLANK_L1
-syn keyword xsMacro isBLANK_LC isBLANK_LC_uni isBLANK_LC_utf8 isBLANK_uni
-syn keyword xsMacro isBLANK_utf8 isCHARNAME_CONT isCNTRL isCNTRL_A isCNTRL_L1
-syn keyword xsMacro isCNTRL_LC isCNTRL_LC_utf8 isCNTRL_LC_uvchr isCNTRL_uni
-syn keyword xsMacro isCNTRL_utf8 isDIGIT isDIGIT_A isDIGIT_L1 isDIGIT_LC
-syn keyword xsMacro isDIGIT_LC_utf8 isDIGIT_LC_uvchr isDIGIT_uni isDIGIT_utf8
-syn keyword xsMacro isGRAPH isGRAPH_A isGRAPH_L1 isGRAPH_LC isGRAPH_LC_utf8
+syn keyword xsMacro dTOPiv dTOPnv dTOPss dTOPuv dUNDERBAR dVAR dXSARGS
+syn keyword xsMacro dXSBOOTARGSAPIVERCHK dXSBOOTARGSNOVERCHK
+syn keyword xsMacro dXSBOOTARGSXSAPIVERCHK dXSFUNCTION dXSI32 dXSTARG
+syn keyword xsMacro dXSUB_SYS deprecate djSP do_open dup dup2 endgrent
+syn keyword xsMacro endhostent endnetent endprotoent endpwent endservent
+syn keyword xsMacro environ execl execv execvp fcntl fd_set fdopen fileno
+syn keyword xsMacro float_end_shift float_max_offset float_min_offset
+syn keyword xsMacro float_substr float_utf8 flock flockfile foldEQ_utf8
+syn keyword xsMacro frewind fscanf fstat ftell ftruncate ftrylockfile
+syn keyword xsMacro funlockfile fwrite1 get_cvs getc_unlocked getegid geteuid
+syn keyword xsMacro getgid getgrent getgrgid getgrnam gethostbyaddr
+syn keyword xsMacro gethostbyname gethostent gethostname getlogin
+syn keyword xsMacro getnetbyaddr getnetbyname getnetent getpeername getpid
+syn keyword xsMacro getprotobyname getprotobynumber getprotoent getpwent
+syn keyword xsMacro getpwnam getpwuid getservbyname getservbyport getservent
+syn keyword xsMacro getsockname getsockopt getspnam gettimeofday getuid getw
+syn keyword xsMacro gv_AVadd gv_HVadd gv_IOadd gv_SVadd gv_autoload4
+syn keyword xsMacro gv_efullname3 gv_fetchmeth gv_fetchmeth_autoload
+syn keyword xsMacro gv_fetchmethod gv_fetchmethod_flags gv_fetchpvn
+syn keyword xsMacro gv_fetchpvs gv_fetchsv_nomg gv_fullname3 gv_init
+syn keyword xsMacro gv_method_changed gv_stashpvs htoni htonl htons htovl
+syn keyword xsMacro htovs hv_delete hv_delete_ent hv_deletehek hv_exists
+syn keyword xsMacro hv_exists_ent hv_fetch hv_fetch_ent hv_fetchhek hv_fetchs
+syn keyword xsMacro hv_iternext hv_magic hv_store hv_store_ent hv_store_flags
+syn keyword xsMacro hv_storehek hv_stores hv_undef ibcmp ibcmp_locale
+syn keyword xsMacro ibcmp_utf8 inet_addr inet_ntoa init_os_extras ioctl
+syn keyword xsMacro isALNUM isALNUMC isALNUMC_A isALNUMC_L1 isALNUMC_LC
+syn keyword xsMacro isALNUMC_LC_utf8 isALNUMC_LC_uvchr isALNUMC_uni
+syn keyword xsMacro isALNUMC_utf8 isALNUMU isALNUM_LC isALNUM_LC_utf8
+syn keyword xsMacro isALNUM_LC_uvchr isALNUM_lazy_if isALNUM_uni isALNUM_utf8
+syn keyword xsMacro isALPHA isALPHANUMERIC isALPHANUMERIC_A isALPHANUMERIC_L1
+syn keyword xsMacro isALPHANUMERIC_LC isALPHANUMERIC_LC_utf8
+syn keyword xsMacro isALPHANUMERIC_LC_uvchr isALPHANUMERIC_uni
+syn keyword xsMacro isALPHANUMERIC_utf8 isALPHAU isALPHA_A isALPHA_FOLD_EQ
+syn keyword xsMacro isALPHA_FOLD_NE isALPHA_L1 isALPHA_LC isALPHA_LC_utf8
+syn keyword xsMacro isALPHA_LC_uvchr isALPHA_uni isALPHA_utf8 isASCII
+syn keyword xsMacro isASCII_A isASCII_L1 isASCII_LC isASCII_LC_utf8
+syn keyword xsMacro isASCII_LC_uvchr isASCII_uni isASCII_utf8 isBLANK
+syn keyword xsMacro isBLANK_A isBLANK_L1 isBLANK_LC isBLANK_LC_uni
+syn keyword xsMacro isBLANK_LC_utf8 isBLANK_LC_uvchr isBLANK_uni isBLANK_utf8
+syn keyword xsMacro isCHARNAME_CONT isCNTRL isCNTRL_A isCNTRL_L1 isCNTRL_LC
+syn keyword xsMacro isCNTRL_LC_utf8 isCNTRL_LC_uvchr isCNTRL_uni isCNTRL_utf8
+syn keyword xsMacro isDIGIT isDIGIT_A isDIGIT_L1 isDIGIT_LC isDIGIT_LC_utf8
+syn keyword xsMacro isDIGIT_LC_uvchr isDIGIT_uni isDIGIT_utf8 isGRAPH
+syn keyword xsMacro isGRAPH_A isGRAPH_L1 isGRAPH_LC isGRAPH_LC_utf8
syn keyword xsMacro isGRAPH_LC_uvchr isGRAPH_uni isGRAPH_utf8 isGV
-syn keyword xsMacro isGV_with_GP isGV_with_GP_off isGV_with_GP_on
-syn keyword xsMacro isIDCONT_utf8 isIDFIRST isIDFIRST_A isIDFIRST_L1
-syn keyword xsMacro isIDFIRST_LC isIDFIRST_LC_utf8 isIDFIRST_LC_uvchr
-syn keyword xsMacro isIDFIRST_lazy isIDFIRST_lazy_if isIDFIRST_uni
+syn keyword xsMacro isGV_with_GP isGV_with_GP_off isGV_with_GP_on isIDCONT
+syn keyword xsMacro isIDCONT_A isIDCONT_L1 isIDCONT_LC isIDCONT_LC_utf8
+syn keyword xsMacro isIDCONT_LC_uvchr isIDCONT_uni isIDCONT_utf8 isIDFIRST
+syn keyword xsMacro isIDFIRST_A isIDFIRST_L1 isIDFIRST_LC isIDFIRST_LC_utf8
+syn keyword xsMacro isIDFIRST_LC_uvchr isIDFIRST_lazy_if isIDFIRST_uni
syn keyword xsMacro isIDFIRST_utf8 isLEXWARN_off isLEXWARN_on isLOWER
syn keyword xsMacro isLOWER_A isLOWER_L1 isLOWER_LC isLOWER_LC_utf8
syn keyword xsMacro isLOWER_LC_uvchr isLOWER_uni isLOWER_utf8 isOCTAL
syn keyword xsMacro isOCTAL_A isOCTAL_L1 isPRINT isPRINT_A isPRINT_L1
syn keyword xsMacro isPRINT_LC isPRINT_LC_utf8 isPRINT_LC_uvchr isPRINT_uni
syn keyword xsMacro isPRINT_utf8 isPSXSPC isPSXSPC_A isPSXSPC_L1 isPSXSPC_LC
-syn keyword xsMacro isPSXSPC_LC_uni isPSXSPC_LC_utf8 isPSXSPC_uni
+syn keyword xsMacro isPSXSPC_LC_utf8 isPSXSPC_LC_uvchr isPSXSPC_uni
syn keyword xsMacro isPSXSPC_utf8 isPUNCT isPUNCT_A isPUNCT_L1 isPUNCT_LC
syn keyword xsMacro isPUNCT_LC_utf8 isPUNCT_LC_uvchr isPUNCT_uni isPUNCT_utf8
-syn keyword xsMacro isSPACE isSPACE_A isSPACE_L1 isSPACE_LC isSPACE_LC_utf8
-syn keyword xsMacro isSPACE_LC_uvchr isSPACE_uni isSPACE_utf8 isUPPER
-syn keyword xsMacro isUPPER_A isUPPER_L1 isUPPER_LC isUPPER_LC_utf8
-syn keyword xsMacro isUPPER_LC_uvchr isUPPER_uni isUPPER_utf8 isWARN_ONCE
-syn keyword xsMacro isWARN_on isWARNf_on isWORDCHAR isWORDCHAR_A
-syn keyword xsMacro isWORDCHAR_L1 isXDIGIT isXDIGIT_A isXDIGIT_L1
-syn keyword xsMacro isXDIGIT_uni isXDIGIT_utf8 is_HORIZWS is_HORIZWS_cp
-syn keyword xsMacro is_HORIZWS_latin1 is_HORIZWS_latin1_safe is_HORIZWS_safe
-syn keyword xsMacro is_HORIZWS_utf8 is_HORIZWS_utf8_safe is_LAX_VERSION
-syn keyword xsMacro is_LNBREAK is_LNBREAK_latin1 is_LNBREAK_latin1_safe
-syn keyword xsMacro is_LNBREAK_safe is_LNBREAK_utf8 is_LNBREAK_utf8_safe
-syn keyword xsMacro is_STRICT_VERSION is_TRICKYFOLD is_TRICKYFOLD_cp
-syn keyword xsMacro is_TRICKYFOLD_safe is_VERTWS is_VERTWS_cp
-syn keyword xsMacro is_VERTWS_latin1 is_VERTWS_latin1_safe is_VERTWS_safe
-syn keyword xsMacro is_VERTWS_utf8 is_VERTWS_utf8_safe is_utf8_string_loc
-syn keyword xsMacro isatty kBINOP kCOP kGVOP_gv kLISTOP kLOGOP kLOOP kPADOP
-syn keyword xsMacro kPMOP kPVOP kSVOP kSVOP_sv kUNOP kill killpg
-syn keyword xsMacro lex_stuff_pvs link listen lockf longjmp lseek lstat
-syn keyword xsMacro mPUSHi mPUSHn mPUSHp mPUSHs mPUSHu mXPUSHi mXPUSHn
+syn keyword xsMacro isREGEXP isSPACE isSPACE_A isSPACE_L1 isSPACE_LC
+syn keyword xsMacro isSPACE_LC_utf8 isSPACE_LC_uvchr isSPACE_uni isSPACE_utf8
+syn keyword xsMacro isUPPER isUPPER_A isUPPER_L1 isUPPER_LC isUPPER_LC_utf8
+syn keyword xsMacro isUPPER_LC_uvchr isUPPER_uni isUPPER_utf8 isUTF8_CHAR
+syn keyword xsMacro isVERTWS_uni isVERTWS_utf8 isWARN_ONCE isWARN_on
+syn keyword xsMacro isWARNf_on isWORDCHAR isWORDCHAR_A isWORDCHAR_L1
+syn keyword xsMacro isWORDCHAR_LC isWORDCHAR_LC_utf8 isWORDCHAR_LC_uvchr
+syn keyword xsMacro isWORDCHAR_lazy_if isWORDCHAR_uni isWORDCHAR_utf8
+syn keyword xsMacro isXDIGIT isXDIGIT_A isXDIGIT_L1 isXDIGIT_LC
+syn keyword xsMacro isXDIGIT_LC_utf8 isXDIGIT_LC_uvchr isXDIGIT_uni
+syn keyword xsMacro isXDIGIT_utf8 is_ANYOF_SYNTHETIC is_FOLDS_TO_MULTI_utf8
+syn keyword xsMacro is_HORIZWS_cp_high is_HORIZWS_high is_LAX_VERSION
+syn keyword xsMacro is_LNBREAK_latin1_safe is_LNBREAK_safe
+syn keyword xsMacro is_LNBREAK_utf8_safe is_MULTI_CHAR_FOLD_latin1_safe
+syn keyword xsMacro is_MULTI_CHAR_FOLD_utf8_safe
+syn keyword xsMacro is_MULTI_CHAR_FOLD_utf8_safe_part0
+syn keyword xsMacro is_MULTI_CHAR_FOLD_utf8_safe_part1 is_NONCHAR_utf8
+syn keyword xsMacro is_PATWS_cp is_PATWS_safe
+syn keyword xsMacro is_PROBLEMATIC_LOCALE_FOLDEDS_START_cp
+syn keyword xsMacro is_PROBLEMATIC_LOCALE_FOLDEDS_START_utf8
+syn keyword xsMacro is_PROBLEMATIC_LOCALE_FOLD_cp
+syn keyword xsMacro is_PROBLEMATIC_LOCALE_FOLD_utf8 is_QUOTEMETA_high
+syn keyword xsMacro is_QUOTEMETA_high_part0 is_QUOTEMETA_high_part1
+syn keyword xsMacro is_REPLACEMENT_utf8_safe is_STRICT_VERSION
+syn keyword xsMacro is_SURROGATE_utf8 is_UTF8_CHAR_utf8_no_length_checks
+syn keyword xsMacro is_VERTWS_cp_high is_VERTWS_high is_XDIGIT_cp_high
+syn keyword xsMacro is_XDIGIT_high is_XPERLSPACE_cp_high is_XPERLSPACE_high
+syn keyword xsMacro is_ascii_string is_utf8_char_buf is_utf8_string_loc
+syn keyword xsMacro isatty isnormal kBINOP kCOP kGVOP_gv kLISTOP kLOGOP kLOOP
+syn keyword xsMacro kPADOP kPMOP kPVOP kSVOP kSVOP_sv kUNOP kUNOP_AUX kill
+syn keyword xsMacro killpg lex_stuff_pvs link listen lockf longjmp lseek
+syn keyword xsMacro lstat mPUSHi mPUSHn mPUSHp mPUSHs mPUSHu mXPUSHi mXPUSHn
syn keyword xsMacro mXPUSHp mXPUSHs mXPUSHu memEQ memEQs memNE memNEs memchr
-syn keyword xsMacro memcmp memzero mkdir mktemp my my_betoh16 my_betoh32
-syn keyword xsMacro my_betoh64 my_betohi my_betohl my_betohn my_betohs
-syn keyword xsMacro my_binmode my_htobe16 my_htobe32 my_htobe64 my_htobei
-syn keyword xsMacro my_htobel my_htoben my_htobes my_htole16 my_htole32
-syn keyword xsMacro my_htole64 my_htolei my_htolel my_htolen my_htoles
-syn keyword xsMacro my_letoh16 my_letoh32 my_letoh64 my_letohi my_letohl
-syn keyword xsMacro my_letohn my_letohs my_lstat my_snprintf my_sprintf
-syn keyword xsMacro my_stat my_strlcat my_strlcpy my_vsnprintf newAV newGVgen
-syn keyword xsMacro newHV newIO newRV_inc newSUB newSVpvn_utf8 newSVpvs
-syn keyword xsMacro newSVpvs_flags newSVpvs_share newXSproto ntohi ntohl
-syn keyword xsMacro ntohs opASSIGN op_getmad op_lvalue open opendir pTHX_1
-syn keyword xsMacro pTHX_2 pTHX_3 pTHX_4 pTHX_5 pTHX_6 pTHX_7 pTHX_8 pTHX_9
-syn keyword xsMacro pTHX_FORMAT pTHX_VALUE pTHX_VALUE_ pTHX__FORMAT
+syn keyword xsMacro memcmp memzero mkdir mktemp my my_binmode my_lstat
+syn keyword xsMacro my_setlocale my_snprintf my_sprintf my_stat my_strlcat
+syn keyword xsMacro my_strlcpy my_vsnprintf newATTRSUB newAV newGVgen newHV
+syn keyword xsMacro newIO newRV_inc newSUB newSVpadname newSVpvn_utf8
+syn keyword xsMacro newSVpvs newSVpvs_flags newSVpvs_share newXSproto ntohi
+syn keyword xsMacro ntohl ntohs opASSIGN op_lvalue open opendir pTHX_1
+syn keyword xsMacro pTHX_12 pTHX_2 pTHX_3 pTHX_4 pTHX_5 pTHX_6 pTHX_7 pTHX_8
+syn keyword xsMacro pTHX_9 pTHX_FORMAT pTHX_VALUE pTHX_VALUE_ pTHX__FORMAT
syn keyword xsMacro pTHX__VALUE pTHX__VALUE_ pTHXo pTHXo_ pTHXx pTHXx_ pVAR
syn keyword xsMacro pWARN_ALL pWARN_NONE pWARN_STD packWARN packWARN2
syn keyword xsMacro packWARN3 packWARN4 pad_add_name_pvs pad_findmy_pvs
-syn keyword xsMacro pad_peg padadd_NO_DUP_CHECK padadd_OUR padadd_STATE
-syn keyword xsMacro padadd_UTF8_NAME padnew_CLONE padnew_SAVE padnew_SAVESUB
+syn keyword xsMacro pad_peg padadd_NO_DUP_CHECK padadd_OUR padadd_STALEOK
+syn keyword xsMacro padadd_STATE padnew_CLONE padnew_SAVE padnew_SAVESUB
syn keyword xsMacro panic_write2 pause pclose pipe popen prepare_SV_for_RV
syn keyword xsMacro pthread_attr_init pthread_condattr_default pthread_create
syn keyword xsMacro pthread_key_create pthread_keycreate
syn keyword xsMacro pthread_mutexattr_default pthread_mutexattr_init
-syn keyword xsMacro pthread_mutexattr_settype putc_unlocked putenv putw
-syn keyword xsMacro random read readdir readdir64 recv recvfrom ref
+syn keyword xsMacro pthread_mutexattr_settype putc_unlocked putenv putw read
+syn keyword xsMacro readdir readdir64 recv recvfrom ref
syn keyword xsMacro refcounted_he_fetch_pvs refcounted_he_new_pvs rename
-syn keyword xsMacro rewinddir rmdir sTHX safecalloc safefree safemalloc
+syn keyword xsMacro rewinddir rmdir safecalloc safefree safemalloc
syn keyword xsMacro saferealloc save_aelem save_freeop save_freepv
syn keyword xsMacro save_freesv save_helem save_mortalizesv save_op savepvs
syn keyword xsMacro savesharedpvs sb_dstr sb_iters sb_m sb_maxiters
syn keyword xsMacro sb_oldsave sb_orig sb_rflags sb_rx sb_rxres sb_rxtainted
syn keyword xsMacro sb_s sb_strend sb_targ seedDrand01 seekdir select send
-syn keyword xsMacro sendto setbuf setgid setgrent sethostent setjmp
-syn keyword xsMacro setlinebuf setlocale setmode setnetent setprotoent
-syn keyword xsMacro setpwent setregid setreuid setservent setsockopt setuid
-syn keyword xsMacro setvbuf share_hek_hek sharepvn shutdown signal sleep
-syn keyword xsMacro socket socketpair specialWARN srand48 srandom stat
-syn keyword xsMacro stdoutf strEQ strGE strGT strLE strLT strNE strchr
-syn keyword xsMacro strerror stringify stringify_immed strnEQ strnNE strrchr
-syn keyword xsMacro strtoll strtoull sv_2bool sv_2iv sv_2nv sv_2pv
-syn keyword xsMacro sv_2pv_nolen sv_2pv_nomg sv_2pvbyte_nolen
-syn keyword xsMacro sv_2pvutf8_nolen sv_2uv sv_catpv_nomg sv_catpvn
-syn keyword xsMacro sv_catpvn_mg sv_catpvn_nomg sv_catpvn_utf8_upgrade
-syn keyword xsMacro sv_catpvs sv_catpvs_flags sv_catpvs_mg sv_catpvs_nomg
-syn keyword xsMacro sv_catsv sv_catsv_mg sv_catsv_nomg sv_catxmlpvs sv_cmp
-syn keyword xsMacro sv_cmp_locale sv_collxfrm sv_eq sv_force_normal sv_insert
-syn keyword xsMacro sv_nolocking sv_nounlocking sv_pv sv_pvbyte sv_pvn_force
-syn keyword xsMacro sv_pvn_force_nomg sv_pvutf8 sv_setpvs sv_setpvs_mg
-syn keyword xsMacro sv_setref_pvs sv_setsv sv_setsv_nomg sv_taint sv_unref
-syn keyword xsMacro sv_usepvn sv_usepvn_mg sv_utf8_upgrade
-syn keyword xsMacro sv_utf8_upgrade_flags sv_utf8_upgrade_nomg tTHX telldir
-syn keyword xsMacro times tmpfile tmpnam toCTRL toFOLD_uni toLOWER
-syn keyword xsMacro toLOWER_LATIN1 toLOWER_LC toLOWER_uni toLOWER_utf8
-syn keyword xsMacro toTITLE_uni toTITLE_utf8 toUPPER toUPPER_LATIN1_MOD
+syn keyword xsMacro sendto set_ANYOF_SYNTHETIC setbuf setgid setgrent
+syn keyword xsMacro sethostent setjmp setlinebuf setlocale setmode setnetent
+syn keyword xsMacro setprotoent setpwent setregid setreuid setservent
+syn keyword xsMacro setsockopt setuid setvbuf share_hek_hek sharepvn shutdown
+syn keyword xsMacro signal sleep socket socketpair specialWARN stat stdoutf
+syn keyword xsMacro strEQ strGE strGT strLE strLT strNE strchr strerror
+syn keyword xsMacro strnEQ strnNE strrchr strtoll strtoull sv_2bool
+syn keyword xsMacro sv_2bool_nomg sv_2iv sv_2nv sv_2pv sv_2pv_nolen
+syn keyword xsMacro sv_2pv_nomg sv_2pvbyte_nolen sv_2pvutf8_nolen sv_2uv
+syn keyword xsMacro sv_cathek sv_catpv_nomg sv_catpvn sv_catpvn_mg
+syn keyword xsMacro sv_catpvn_nomg sv_catpvn_nomg_maybeutf8
+syn keyword xsMacro sv_catpvn_nomg_utf8_upgrade sv_catpvs sv_catpvs_flags
+syn keyword xsMacro sv_catpvs_mg sv_catpvs_nomg sv_catsv sv_catsv_mg
+syn keyword xsMacro sv_catsv_nomg sv_catxmlpvs sv_cmp sv_cmp_locale
+syn keyword xsMacro sv_collxfrm sv_copypv_nomg sv_eq sv_force_normal
+syn keyword xsMacro sv_insert sv_mortalcopy sv_nolocking sv_nounlocking
+syn keyword xsMacro sv_or_pv_len_utf8 sv_pv sv_pvbyte sv_pvn_force
+syn keyword xsMacro sv_pvn_force_nomg sv_pvutf8 sv_setgid sv_setpvs
+syn keyword xsMacro sv_setpvs_mg sv_setref_pvs sv_setsv sv_setsv_nomg
+syn keyword xsMacro sv_setuid sv_taint sv_unref sv_usepvn sv_usepvn_mg
+syn keyword xsMacro sv_utf8_upgrade sv_utf8_upgrade_flags
+syn keyword xsMacro sv_utf8_upgrade_nomg tTHX telldir times tmpfile tmpnam
+syn keyword xsMacro toCTRL toFOLD toFOLD_A toFOLD_LC toFOLD_uni toFOLD_utf8
+syn keyword xsMacro toLOWER toLOWER_A toLOWER_L1 toLOWER_LATIN1 toLOWER_LC
+syn keyword xsMacro toLOWER_uni toLOWER_utf8 toTITLE toTITLE_A toTITLE_uni
+syn keyword xsMacro toTITLE_utf8 toUPPER toUPPER_A toUPPER_LATIN1_MOD
syn keyword xsMacro toUPPER_LC toUPPER_uni toUPPER_utf8 to_uni_fold
syn keyword xsMacro to_utf8_fold to_utf8_lower to_utf8_title to_utf8_upper
syn keyword xsMacro truncate tryAMAGICbin_MG tryAMAGICunDEREF
-syn keyword xsMacro tryAMAGICunTARGET tryAMAGICun_MG ttyname umask uname
+syn keyword xsMacro tryAMAGICunTARGETlist tryAMAGICun_MG ttyname umask uname
syn keyword xsMacro unlink unpackWARN1 unpackWARN2 unpackWARN3 unpackWARN4
-syn keyword xsMacro utf8n_to_uvchr utime uvchr_to_utf8 uvuni_to_utf8 vTHX
-syn keyword xsMacro vfprintf vtohl vtohs wait want_vtbl_bm want_vtbl_fm
-syn keyword xsMacro what_TRICKYFOLD what_TRICKYFOLD_safe what_len_TRICKYFOLD
-syn keyword xsMacro what_len_TRICKYFOLD_safe whichsig write xio_any xio_dirp
-syn keyword xsMacro xiv_iv xuv_uv yystype
+syn keyword xsMacro utf8_to_uvchr_buf utime uvchr_to_utf8 uvchr_to_utf8_flags
+syn keyword xsMacro vTHX vfprintf vtohl vtohs wait want_vtbl_bm want_vtbl_fm
+syn keyword xsMacro whichsig write xio_any xio_dirp xiv_iv xlv_targoff
+syn keyword xsMacro xpv_len xuv_uv yystype
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_xs_syntax_inits")
- if version < 508
- let did_xs_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink xsPrivate Error
- HiLink xsSuperseded Error
- HiLink xsType Type
- HiLink xsString String
- HiLink xsConstant Constant
- HiLink xsException Exception
- HiLink xsKeyword Keyword
- HiLink xsFunction Function
- HiLink xsVariable Identifier
- HiLink xsMacro Macro
-
- delcommand HiLink
-endif
+hi def link xsPrivate Error
+hi def link xsSuperseded Error
+hi def link xsType Type
+hi def link xsString String
+hi def link xsConstant Constant
+hi def link xsException Exception
+hi def link xsKeyword Keyword
+hi def link xsFunction Function
+hi def link xsVariable Identifier
+hi def link xsMacro Macro
let b:current_syntax = "xs"
diff --git a/runtime/syntax/xxd.vim b/runtime/syntax/xxd.vim
index b2b1e44603..f3c43e816c 100644
--- a/runtime/syntax/xxd.vim
+++ b/runtime/syntax/xxd.vim
@@ -1,16 +1,13 @@
" Vim syntax file
" Language: bin using xxd
" Maintainer: Charles E. Campbell <NdrOchipS@PcampbellAfamily.Mbiz>
-" Last Change: Oct 23, 2014
-" Version: 8
+" Last Change: Aug 31, 2016
+" Version: 10
" Notes: use :help xxd to see how to invoke it
" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_XXD
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -20,21 +17,12 @@ syn match xxdAscii " .\{,16\}\r\=$"hs=s+2 contains=xxdDot
syn match xxdDot contained "[.\r]"
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_xxd_syntax_inits")
- if version < 508
- let did_xxd_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
+if !exists("skip_xxd_syntax_inits")
- HiLink xxdAddress Constant
- HiLink xxdSep Identifier
- HiLink xxdAscii Statement
+ hi def link xxdAddress Constant
+ hi def link xxdSep Identifier
+ hi def link xxdAscii Statement
- delcommand HiLink
endif
let b:current_syntax = "xxd"
diff --git a/runtime/syntax/yacc.vim b/runtime/syntax/yacc.vim
index 977ffa75e4..8d5eb13071 100644
--- a/runtime/syntax/yacc.vim
+++ b/runtime/syntax/yacc.vim
@@ -1,18 +1,15 @@
" Vim syntax file
" Language: Yacc
" Maintainer: Charles E. Campbell <NdrOchipS@PcampbellAfamily.Mbiz>
-" Last Change: Apr 02, 2015
-" Version: 13
-" URL: http://mysite.verizon.net/astronaut/vim/index.html#vimlinks_syntax
+" Last Change: Aug 31, 2016
+" Version: 15
+" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_YACC
"
" Options: {{{1
" g:yacc_uses_cpp : if this variable exists, then C++ is loaded rather than C
" ---------------------------------------------------------------------
" this version of syntax/yacc.vim requires 6.0 or later
-if version < 600
- finish
-endif
if exists("b:current_syntax")
syntax clear
endif
@@ -90,7 +87,7 @@ syn sync fromstart
" ---------------------------------------------------------------------
" Define the default highlighting. {{{1
-if !exists("did_yacc_syn_inits")
+if !exists("skip_yacc_syn_inits")
hi def link yaccBrkt yaccStmt
hi def link yaccComment Comment
hi def link yaccCurly Delimiter
diff --git a/runtime/syntax/z8a.vim b/runtime/syntax/z8a.vim
index a3a8a2bbdf..6809eb98cd 100644
--- a/runtime/syntax/z8a.vim
+++ b/runtime/syntax/z8a.vim
@@ -3,11 +3,8 @@
" Maintainer: Milan Pikula <www@fornax.elf.stuba.sk>
" Last Change: 2003 May 11
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
finish
endif
@@ -85,30 +82,20 @@ syn match z8aComment ";.*"
syn case match
" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_z8a_syntax_inits")
- if version < 508
- let did_z8a_syntax_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink z8aSection Special
- HiLink z8aLabel Label
- HiLink z8aSpecialLabel Label
- HiLink z8aComment Comment
- HiLink z8aInstruction Statement
- HiLink z8aSpecInst Statement
- HiLink z8aInclude Include
- HiLink z8aPreCondit PreCondit
- HiLink z8aPreProc PreProc
- HiLink z8aNumber Number
- HiLink z8aString String
-
- delcommand HiLink
-endif
+" Only when an item doesn't have highlighting yet
+
+hi def link z8aSection Special
+hi def link z8aLabel Label
+hi def link z8aSpecialLabel Label
+hi def link z8aComment Comment
+hi def link z8aInstruction Statement
+hi def link z8aSpecInst Statement
+hi def link z8aInclude Include
+hi def link z8aPreCondit PreCondit
+hi def link z8aPreProc PreProc
+hi def link z8aNumber Number
+hi def link z8aString String
+
let b:current_syntax = "z8a"
" vim: ts=8
diff --git a/runtime/syntax/zsh.vim b/runtime/syntax/zsh.vim
index 0d385a35d0..3eba438aa7 100644
--- a/runtime/syntax/zsh.vim
+++ b/runtime/syntax/zsh.vim
@@ -2,9 +2,9 @@
" Language: Zsh shell script
" Maintainer: Christian Brabandt <cb@256bit.org>
" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2016-02-15
+" Latest Revision: 2018-05-12
" License: Vim (see :h license)
-" Repository: https://github.com/chrisbra/vim-zsh
+" Repository: https://github.com/chrisbra/vim-zsh
if exists("b:current_syntax")
finish
@@ -24,7 +24,7 @@ endif
syn keyword zshTodo contained TODO FIXME XXX NOTE
-syn region zshComment oneline start='\%(^\|\s*\)#' end='$'
+syn region zshComment oneline start='\%(^\|\s\+\)#' end='$'
\ contains=zshTodo,@Spell fold
syn region zshComment start='^\s*#' end='^\%(\s*#\)\@!'
@@ -67,15 +67,15 @@ syn match zshRedir '|&\='
syn region zshHereDoc matchgroup=zshRedir
\ start='<\@<!<<\s*\z([^<]\S*\)'
\ end='^\z1\>'
- \ contains=@zshSubst
+ \ contains=@zshSubst,@zshDerefs,zshQuoted,zshPOSIXString
syn region zshHereDoc matchgroup=zshRedir
\ start='<\@<!<<\s*\\\z(\S\+\)'
\ end='^\z1\>'
- \ contains=@zshSubst
+ \ contains=@zshSubst,@zshDerefs,zshQuoted,zshPOSIXString
syn region zshHereDoc matchgroup=zshRedir
\ start='<\@<!<<-\s*\\\=\z(\S\+\)'
\ end='^\s*\z1\>'
- \ contains=@zshSubst
+ \ contains=@zshSubst,@zshDerefs,zshQuoted,zshPOSIXString
syn region zshHereDoc matchgroup=zshRedir
\ start=+<\@<!<<\s*\(["']\)\z(\S\+\)\1+
\ end='^\z1\>'
@@ -88,33 +88,20 @@ syn match zshVariable '\<\h\w*' contained
syn match zshVariableDef '\<\h\w*\ze+\=='
" XXX: how safe is this?
syn region zshVariableDef oneline
- \ start='\$\@<!\<\h\w*\[' end='\]\ze+\=='
+ \ start='\$\@<!\<\h\w*\[' end='\]\ze+\?=\?'
\ contains=@zshSubst
-syn cluster zshDerefs contains=zshShortDeref,zshLongDeref,zshDeref
+syn cluster zshDerefs contains=zshShortDeref,zshLongDeref,zshDeref,zshDollarVar
-if !exists("g:zsh_syntax_variables")
- let s:zsh_syntax_variables = 'all'
-else
- let s:zsh_syntax_variables = g:zsh_syntax_variables
-endif
+syn match zshShortDeref '\$[!#$*@?_-]\w\@!'
+syn match zshShortDeref '\$[=^~]*[#+]*\d\+\>'
-if s:zsh_syntax_variables =~ 'short\|all'
- syn match zshShortDeref '\$[!#$*@?_-]\w\@!'
- syn match zshShortDeref '\$[=^~]*[#+]*\d\+\>'
-endif
+syn match zshLongDeref '\$\%(ARGC\|argv\|status\|pipestatus\|CPUTYPE\|EGID\|EUID\|ERRNO\|GID\|HOST\|LINENO\|LOGNAME\)'
+syn match zshLongDeref '\$\%(MACHTYPE\|OLDPWD OPTARG\|OPTIND\|OSTYPE\|PPID\|PWD\|RANDOM\|SECONDS\|SHLVL\|signals\)'
+syn match zshLongDeref '\$\%(TRY_BLOCK_ERROR\|TTY\|TTYIDLE\|UID\|USERNAME\|VENDOR\|ZSH_NAME\|ZSH_VERSION\|REPLY\|reply\|TERM\)'
-if s:zsh_syntax_variables =~ 'long\|all'
- syn match zshLongDeref '\$\%(ARGC\|argv\|status\|pipestatus\|CPUTYPE\|EGID\|EUID\|ERRNO\|GID\|HOST\|LINENO\|LOGNAME\)'
- syn match zshLongDeref '\$\%(MACHTYPE\|OLDPWD OPTARG\|OPTIND\|OSTYPE\|PPID\|PWD\|RANDOM\|SECONDS\|SHLVL\|signals\)'
- syn match zshLongDeref '\$\%(TRY_BLOCK_ERROR\|TTY\|TTYIDLE\|UID\|USERNAME\|VENDOR\|ZSH_NAME\|ZSH_VERSION\|REPLY\|reply\|TERM\)'
-endif
-
-if s:zsh_syntax_variables =~ 'all'
- syn match zshDeref '\$[=^~]*[#+]*\h\w*\>'
-else
- syn match zshDeref transparent contains=NONE '\$[=^~]*[#+]*\h\w*\>'
-endif
+syn match zshDollarVar '\$\h\w*'
+syn match zshDeref '\$[=^~]*[#+]*\h\w*\>'
syn match zshCommands '\%(^\|\s\)[.:]\ze\s'
syn keyword zshCommands alias autoload bg bindkey break bye cap cd
@@ -126,13 +113,13 @@ syn keyword zshCommands alias autoload bg bindkey break bye cap cd
\ functions getcap getln getopts hash history
\ jobs kill let limit log logout popd print
\ printf pushd pushln pwd r read readonly
- \ rehash return sched set setcap setopt shift
+ \ rehash return sched set setcap shift
\ source stat suspend test times trap true
\ ttyctl type ulimit umask unalias unfunction
- \ unhash unlimit unset unsetopt vared wait
+ \ unhash unlimit unset vared wait
\ whence where which zcompile zformat zftp zle
- \ zmodload zparseopts zprof zpty zregexparse
- \ zsocket zstyle ztcp
+ \ zmodload zparseopts zprof zpty zrecompile
+ \ zregexparse zsocket zstyle ztcp
" Options, generated by: echo ${(j:\n:)options[(I)*]} | sort
" Create a list of option names from zsh source dir:
@@ -145,165 +132,201 @@ syn keyword zshCommands alias autoload bg bindkey break bye cap cd
" done
syn case ignore
-syn keyword zshOptions aliases allexport all_export alwayslastprompt
- \ always_last_prompt always_lastprompt alwaystoend always_to_end appendcreate
- \ append_create appendhistory append_history autocd auto_cd autocontinue
- \ auto_continue autolist auto_list
- \ automenu auto_menu autonamedirs auto_name_dirs
- \ autoparamkeys auto_param_keys autoparamslash
- \ auto_param_slash autopushd auto_pushd autoremoveslash
- \ auto_remove_slash autoresume auto_resume badpattern bad_pattern
- \ banghist bang_hist bareglobqual bare_glob_qual
- \ bashautolist bash_auto_list bashrematch bash_rematch
- \ beep bgnice bg_nice braceccl brace_ccl braceexpand brace_expand
- \ bsdecho bsd_echo caseglob case_glob casematch case_match
- \ cbases c_bases cdablevars cdable_vars cd_able_vars chasedots chase_dots
- \ chaselinks chase_links checkjobs check_jobs
- \ clobber combiningchars combining_chars completealiases
- \ complete_aliases completeinword complete_in_word
- \ continueonerror continue_on_error correct
- \ correctall correct_all cprecedences c_precedences
- \ cshjunkiehistory csh_junkie_history cshjunkieloops
- \ csh_junkie_loops cshjunkiequotes csh_junkie_quotes
- \ csh_nullcmd csh_null_cmd cshnullcmd csh_null_cmd cshnullglob csh_null_glob
- \ debugbeforecmd debug_before_cmd dotglob dot_glob dvorak
- \ emacs equals errexit err_exit errreturn err_return evallineno
- \ eval_lineno exec extendedglob extended_glob extendedhistory
- \ extended_history flowcontrol flow_control forcefloat
- \ force_float functionargzero function_argzero function_arg_zero glob globalexport
- \ global_export globalrcs global_rcs globassign glob_assign
- \ globcomplete glob_complete globdots glob_dots glob_subst
- \ globsubst globstarshort glob_star_short hashall hash_all hashcmds
- \ hash_cmds hashdirs hash_dirs hashexecutablesonly hash_executables_only
- \ hashlistall hash_list_all histallowclobber hist_allow_clobber histappend
- \ hist_append histbeep hist_beep hist_expand hist_expire_dups_first
- \ histexpand histexpiredupsfirst histfcntllock hist_fcntl_lock
- \ histfindnodups hist_find_no_dups histignorealldups
- \ hist_ignore_all_dups histignoredups hist_ignore_dups
- \ histignorespace hist_ignore_space histlexwords hist_lex_words
- \ histnofunctions hist_no_functions histnostore hist_no_store
- \ histreduceblanks hist_reduce_blanks histsavebycopy
- \ hist_save_by_copy histsavenodups hist_save_no_dups
- \ histsubstpattern hist_subst_pattern histverify hist_verify
- \ hup ignorebraces ignore_braces ignoreclosebraces ignore_close_braces
- \ ignoreeof ignore_eof incappendhistory inc_append_history
- \ incappendhistorytime inc_append_history_time interactive
- \ interactivecomments interactive_comments ksharrays ksh_arrays
- \ kshautoload ksh_autoload kshglob ksh_glob kshoptionprint
- \ ksh_option_print kshtypeset ksh_typeset kshzerosubscript
- \ ksh_zero_subscript listambiguous list_ambiguous listbeep
- \ list_beep listpacked list_packed listrowsfirst list_rows_first
- \ listtypes list_types localloops local_loops localoptions
- \ local_options localpatterns local_patterns localtraps
- \ local_traps log login longlistjobs long_list_jobs magicequalsubst
- \ magic_equal_subst mailwarn mail_warn mail_warning mark_dirs
- \ mailwarning markdirs menucomplete menu_complete monitor
- \ multibyte multi_byte multifuncdef multi_func_def multios
- \ multi_os nomatch no_match notify nullglob null_glob numericglobsort
- \ numeric_glob_sort octalzeroes octal_zeroes onecmd one_cmd
- \ overstrike over_strike pathdirs path_dirs pathscript
- \ path_script physical pipefail pipe_fail posixaliases
- \ posix_aliases posixargzero posix_arg_zero posix_argzero posixbuiltins
- \ posix_builtins posixcd posix_cd posixidentifiers posix_identifiers
- \ posixjobs posix_jobs posixstrings posix_strings posixtraps
- \ posix_traps printeightbit print_eight_bit printexitvalue
- \ print_exit_value privileged promptbang prompt_bang promptcr
- \ prompt_cr promptpercent prompt_percent promptsp prompt_sp
- \ promptsubst prompt_subst promptvars prompt_vars pushdignoredups
- \ pushd_ignore_dups pushdminus pushd_minus pushdsilent pushd_silent
- \ pushdtohome pushd_to_home rcexpandparam rc_expandparam rc_expand_param rcquotes
- \ rc_quotes rcs recexact rec_exact rematchpcre re_match_pcre rematch_pcre
- \ restricted rmstarsilent rm_star_silent rmstarwait rm_star_wait
- \ sharehistory share_history shfileexpansion sh_file_expansion
- \ shglob sh_glob shinstdin shin_stdin shnullcmd sh_nullcmd
- \ shoptionletters sh_option_letters shortloops short_loops shwordsplit
- \ sh_word_split singlecommand single_command singlelinezle single_line_zle
- \ sourcetrace source_trace stdin sunkeyboardhack sun_keyboard_hack
- \ trackall track_all transientrprompt transient_rprompt
- \ trapsasync traps_async typesetsilent type_set_silent typeset_silent unset verbose vi
- \ warncreateglobal warn_create_global xtrace zle
-
-syn keyword zshOptions noaliases no_aliases noallexport no_allexport noall_export no_all_export noalwayslastprompt no_alwayslastprompt
- \ noalways_lastprompt no_always_lastprompt no_always_last_prompt noalwaystoend no_alwaystoend noalways_to_end no_always_to_end
- \ noappendcreate no_appendcreate no_append_create noappendhistory no_appendhistory noappend_history no_append_history noautocd
- \ no_autocd no_auto_cd noautocontinue no_autocontinue noauto_continue no_auto_continue noautolist no_autolist noauto_list
- \ no_auto_list noautomenu no_automenu noauto_menu no_auto_menu noautonamedirs no_autonamedirs noauto_name_dirs
- \ no_auto_name_dirs noautoparamkeys no_autoparamkeys noauto_param_keys no_auto_param_keys noautoparamslash no_autoparamslash
- \ noauto_param_slash no_auto_param_slash noautopushd no_autopushd noauto_pushd no_auto_pushd noautoremoveslash no_autoremoveslash
- \ noauto_remove_slash no_auto_remove_slash noautoresume no_autoresume noauto_resume no_auto_resume nobadpattern no_badpattern no_bad_pattern
- \ nobanghist no_banghist nobang_hist no_bang_hist nobareglobqual no_bareglobqual nobare_glob_qual no_bare_glob_qual
- \ nobashautolist no_bashautolist nobash_auto_list no_bash_auto_list nobashrematch no_bashrematch nobash_rematch no_bash_rematch
- \ nobeep no_beep nobgnice no_bgnice no_bg_nice nobraceccl no_braceccl nobrace_ccl no_brace_ccl nobraceexpand no_braceexpand nobrace_expand no_brace_expand
- \ nobsdecho no_bsdecho nobsd_echo no_bsd_echo nocaseglob no_caseglob nocase_glob no_case_glob nocasematch no_casematch nocase_match no_case_match
- \ nocbases no_cbases no_c_bases nocdablevars no_cdablevars no_cdable_vars nocd_able_vars no_cd_able_vars nochasedots no_chasedots nochase_dots no_chase_dots
- \ nochaselinks no_chaselinks nochase_links no_chase_links nocheckjobs no_checkjobs nocheck_jobs no_check_jobs
- \ noclobber no_clobber nocombiningchars no_combiningchars nocombining_chars no_combining_chars nocompletealiases no_completealiases
- \ nocomplete_aliases no_complete_aliases nocompleteinword no_completeinword nocomplete_in_word no_complete_in_word
- \ nocontinueonerror no_continueonerror nocontinue_on_error no_continue_on_error nocorrect no_correct
- \ nocorrectall no_correctall nocorrect_all no_correct_all nocprecedences no_cprecedences noc_precedences no_c_precedences
- \ nocshjunkiehistory no_cshjunkiehistory nocsh_junkie_history no_csh_junkie_history nocshjunkieloops no_cshjunkieloops
- \ nocsh_junkie_loops no_csh_junkie_loops nocshjunkiequotes no_cshjunkiequotes nocsh_junkie_quotes no_csh_junkie_quotes
- \ nocshnullcmd no_cshnullcmd no_csh_nullcmd nocsh_null_cmd no_csh_null_cmd nocshnullglob no_cshnullglob nocsh_null_glob no_csh_null_glob
- \ nodebugbeforecmd no_debugbeforecmd nodebug_before_cmd no_debug_before_cmd nodotglob no_dotglob nodot_glob no_dot_glob nodvorak no_dvorak
- \ noemacs no_emacs noequals no_equals noerrexit no_errexit noerr_exit no_err_exit noerrreturn no_errreturn noerr_return no_err_return noevallineno no_evallineno
- \ noeval_lineno no_eval_lineno noexec no_exec noextendedglob no_extendedglob noextended_glob no_extended_glob noextendedhistory no_extendedhistory
- \ noextended_history no_extended_history noflowcontrol no_flowcontrol noflow_control no_flow_control noforcefloat no_forcefloat
- \ noforce_float no_force_float nofunctionargzero no_functionargzero nofunction_arg_zero no_function_argzero no_function_arg_zero noglob no_glob noglobalexport no_globalexport
- \ noglobal_export no_global_export noglobalrcs no_globalrcs noglobal_rcs no_global_rcs noglobassign no_globassign noglob_assign no_glob_assign
- \ noglobcomplete no_globcomplete noglob_complete no_glob_complete noglobdots no_globdots noglob_dots no_glob_dots
- \ noglobstarshort no_glob_star_short noglob_subst no_glob_subst
- \ noglobsubst no_globsubst nohashall no_hashall nohash_all no_hash_all nohashcmds no_hashcmds nohash_cmds no_hash_cmds nohashdirs no_hashdirs
- \ nohash_dirs no_hash_dirs nohashexecutablesonly no_hashexecutablesonly nohash_executables_only no_hash_executables_only nohashlistall no_hashlistall
- \ nohash_list_all no_hash_list_all nohistallowclobber no_histallowclobber nohist_allow_clobber no_hist_allow_clobber nohistappend no_histappend
- \ nohist_append no_hist_append nohistbeep no_histbeep nohist_beep no_hist_beep nohist_expand no_hist_expand nohist_expire_dups_first no_hist_expire_dups_first
- \ nohistexpand no_histexpand nohistexpiredupsfirst no_histexpiredupsfirst nohistfcntllock no_histfcntllock nohist_fcntl_lock no_hist_fcntl_lock
- \ nohistfindnodups no_histfindnodups nohist_find_no_dups no_hist_find_no_dups nohistignorealldups no_histignorealldups
- \ nohist_ignore_all_dups no_hist_ignore_all_dups nohistignoredups no_histignoredups nohist_ignore_dups no_hist_ignore_dups
- \ nohistignorespace no_histignorespace nohist_ignore_space no_hist_ignore_space nohistlexwords no_histlexwords nohist_lex_words no_hist_lex_words
- \ nohistnofunctions no_histnofunctions nohist_no_functions no_hist_no_functions nohistnostore no_histnostore nohist_no_store no_hist_no_store
- \ nohistreduceblanks no_histreduceblanks nohist_reduce_blanks no_hist_reduce_blanks nohistsavebycopy no_histsavebycopy
- \ nohist_save_by_copy no_hist_save_by_copy nohistsavenodups no_histsavenodups nohist_save_no_dups no_hist_save_no_dups
- \ nohistsubstpattern no_histsubstpattern nohist_subst_pattern no_hist_subst_pattern nohistverify no_histverify nohist_verify no_hist_verify
- \ nohup no_hup noignorebraces no_ignorebraces noignore_braces no_ignore_braces noignoreclosebraces no_ignoreclosebraces noignore_close_braces no_ignore_close_braces
- \ noignoreeof no_ignoreeof noignore_eof no_ignore_eof noincappendhistory no_incappendhistory noinc_append_history no_inc_append_history
- \ noincappendhistorytime no_incappendhistorytime noinc_append_history_time no_inc_append_history_time nointeractive no_interactive
- \ nointeractivecomments no_interactivecomments nointeractive_comments no_interactive_comments noksharrays no_ksharrays noksh_arrays no_ksh_arrays
- \ nokshautoload no_kshautoload noksh_autoload no_ksh_autoload nokshglob no_kshglob noksh_glob no_ksh_glob nokshoptionprint no_kshoptionprint
- \ noksh_option_print no_ksh_option_print nokshtypeset no_kshtypeset noksh_typeset no_ksh_typeset nokshzerosubscript no_kshzerosubscript
- \ noksh_zero_subscript no_ksh_zero_subscript nolistambiguous no_listambiguous nolist_ambiguous no_list_ambiguous nolistbeep no_listbeep
- \ nolist_beep no_list_beep nolistpacked no_listpacked nolist_packed no_list_packed nolistrowsfirst no_listrowsfirst nolist_rows_first no_list_rows_first
- \ nolisttypes no_listtypes nolist_types no_list_types nolocalloops no_localloops nolocal_loops no_local_loops nolocaloptions no_localoptions
- \ nolocal_options no_local_options nolocalpatterns no_localpatterns nolocal_patterns no_local_patterns nolocaltraps no_localtraps
- \ nolocal_traps no_local_traps nolog no_log nologin no_login nolonglistjobs no_longlistjobs nolong_list_jobs no_long_list_jobs nomagicequalsubst no_magicequalsubst
- \ nomagic_equal_subst no_magic_equal_subst nomailwarn no_mailwarn nomail_warn no_mail_warn nomail_warning no_mail_warning nomark_dirs no_mark_dirs
- \ nomailwarning no_mailwarning nomarkdirs no_markdirs nomenucomplete no_menucomplete nomenu_complete no_menu_complete nomonitor no_monitor
- \ nomultibyte no_multibyte nomulti_byte no_multi_byte nomultifuncdef no_multifuncdef nomulti_func_def no_multi_func_def nomultios no_multios
- \ nomulti_os no_multi_os nonomatch no_nomatch nono_match no_no_match nonotify no_notify nonullglob no_nullglob nonull_glob no_null_glob nonumericglobsort no_numericglobsort
- \ nonumeric_glob_sort no_numeric_glob_sort nooctalzeroes no_octalzeroes nooctal_zeroes no_octal_zeroes noonecmd no_onecmd noone_cmd no_one_cmd
- \ nooverstrike no_overstrike noover_strike no_over_strike nopathdirs no_pathdirs nopath_dirs no_path_dirs nopathscript no_pathscript
- \ nopath_script no_path_script nophysical no_physical nopipefail no_pipefail nopipe_fail no_pipe_fail noposixaliases no_posixaliases
- \ noposix_aliases no_posix_aliases noposixargzero no_posixargzero no_posix_argzero noposix_arg_zero no_posix_arg_zero noposixbuiltins no_posixbuiltins
- \ noposix_builtins no_posix_builtins noposixcd no_posixcd noposix_cd no_posix_cd noposixidentifiers no_posixidentifiers noposix_identifiers no_posix_identifiers
- \ noposixjobs no_posixjobs noposix_jobs no_posix_jobs noposixstrings no_posixstrings noposix_strings no_posix_strings noposixtraps no_posixtraps
- \ noposix_traps no_posix_traps noprinteightbit no_printeightbit noprint_eight_bit no_print_eight_bit noprintexitvalue no_printexitvalue
- \ noprint_exit_value no_print_exit_value noprivileged no_privileged nopromptbang no_promptbang noprompt_bang no_prompt_bang nopromptcr no_promptcr
- \ noprompt_cr no_prompt_cr nopromptpercent no_promptpercent noprompt_percent no_prompt_percent nopromptsp no_promptsp noprompt_sp no_prompt_sp
- \ nopromptsubst no_promptsubst noprompt_subst no_prompt_subst nopromptvars no_promptvars noprompt_vars no_prompt_vars nopushdignoredups no_pushdignoredups
- \ nopushd_ignore_dups no_pushd_ignore_dups nopushdminus no_pushdminus nopushd_minus no_pushd_minus nopushdsilent no_pushdsilent nopushd_silent no_pushd_silent
- \ nopushdtohome no_pushdtohome nopushd_to_home no_pushd_to_home norcexpandparam no_rcexpandparam norc_expandparam no_rc_expandparam no_rc_expand_param norcquotes no_rcquotes
- \ norc_quotes no_rc_quotes norcs no_rcs norecexact no_recexact norec_exact no_rec_exact norematchpcre no_rematchpcre nore_match_pcre no_re_match_pcre no_rematch_pcre
- \ norestricted no_restricted normstarsilent no_rmstarsilent norm_star_silent no_rm_star_silent normstarwait no_rmstarwait norm_star_wait no_rm_star_wait
- \ nosharehistory no_sharehistory noshare_history no_share_history noshfileexpansion no_shfileexpansion nosh_file_expansion no_sh_file_expansion
- \ noshglob no_shglob nosh_glob no_sh_glob noshinstdin no_shinstdin noshin_stdin no_shin_stdin noshnullcmd no_shnullcmd nosh_nullcmd no_sh_nullcmd
- \ noshoptionletters no_shoptionletters nosh_option_letters no_sh_option_letters noshortloops no_shortloops noshort_loops no_short_loops noshwordsplit no_shwordsplit
- \ nosh_word_split no_sh_word_split nosinglecommand no_singlecommand nosingle_command no_single_command nosinglelinezle no_singlelinezle nosingle_line_zle no_single_line_zle
- \ nosourcetrace no_sourcetrace nosource_trace no_source_trace nostdin no_stdin nosunkeyboardhack no_sunkeyboardhack nosun_keyboard_hack no_sun_keyboard_hack
- \ notrackall no_trackall notrack_all no_track_all notransientrprompt no_transientrprompt notransient_rprompt no_transient_rprompt
- \ notrapsasync no_trapsasync notrapasync no_trapasync no_traps_async notypesetsilent no_typesetsilent notype_set_silent no_type_set_silent no_typeset_silent \nounset no_unset
- \ noverbose no_verbose novi no_vi nowarncreateglobal no_warncreateglobal nowarn_create_global no_warn_create_global noxtrace no_xtrace nozle no_zle
-syn case match
-
-syn keyword zshTypes float integer local typeset declare private
+
+syn match zshOptStart /^\s*\%(\%(\%(un\)\?setopt\)\|set\s+[-+]o\)/ nextgroup=zshOption skipwhite
+syn match zshOption /
+ \ \%(\%(\<no_\?\)\?aliases\>\)\|
+ \ \%(\%(\<no_\?\)\?allexport\>\)\|\%(\%(no_\?\)\?all_export\>\)\|
+ \ \%(\%(\<no_\?\)\?alwayslastprompt\>\)\|\%(\%(no_\?\)\?always_last_prompt\>\)\|\%(\%(no_\?\)\?always_lastprompt\>\)\|
+ \ \%(\%(\<no_\?\)\?alwaystoend\>\)\|\%(\%(no_\?\)\?always_to_end\>\)\|
+ \ \%(\%(\<no_\?\)\?appendcreate\>\)\|\%(\%(no_\?\)\?append_create\>\)\|
+ \ \%(\%(\<no_\?\)\?appendhistory\>\)\|\%(\%(no_\?\)\?append_history\>\)\|
+ \ \%(\%(\<no_\?\)\?autocd\>\)\|\%(\%(no_\?\)\?auto_cd\>\)\|
+ \ \%(\%(\<no_\?\)\?autocontinue\>\)\|\%(\%(no_\?\)\?auto_continue\>\)\|
+ \ \%(\%(\<no_\?\)\?autolist\>\)\|\%(\%(no_\?\)\?auto_list\>\)\|
+ \ \%(\%(\<no_\?\)\?automenu\>\)\|\%(\%(no_\?\)\?auto_menu\>\)\|
+ \ \%(\%(\<no_\?\)\?autonamedirs\>\)\|\%(\%(no_\?\)\?auto_name_dirs\>\)\|
+ \ \%(\%(\<no_\?\)\?autoparamkeys\>\)\|\%(\%(no_\?\)\?auto_param_keys\>\)\|
+ \ \%(\%(\<no_\?\)\?autoparamslash\>\)\|\%(\%(no_\?\)\?auto_param_slash\>\)\|
+ \ \%(\%(\<no_\?\)\?autopushd\>\)\|\%(\%(no_\?\)\?auto_pushd\>\)\|
+ \ \%(\%(\<no_\?\)\?autoremoveslash\>\)\|\%(\%(no_\?\)\?auto_remove_slash\>\)\|
+ \ \%(\%(\<no_\?\)\?autoresume\>\)\|\%(\%(no_\?\)\?auto_resume\>\)\|
+ \ \%(\%(\<no_\?\)\?badpattern\>\)\|\%(\%(no_\?\)\?bad_pattern\>\)\|
+ \ \%(\%(\<no_\?\)\?banghist\>\)\|\%(\%(no_\?\)\?bang_hist\>\)\|
+ \ \%(\%(\<no_\?\)\?bareglobqual\>\)\|\%(\%(no_\?\)\?bare_glob_qual\>\)\|
+ \ \%(\%(\<no_\?\)\?bashautolist\>\)\|\%(\%(no_\?\)\?bash_auto_list\>\)\|
+ \ \%(\%(\<no_\?\)\?bashrematch\>\)\|\%(\%(no_\?\)\?bash_rematch\>\)\|
+ \ \%(\%(\<no_\?\)\?beep\>\)\|
+ \ \%(\%(\<no_\?\)\?bgnice\>\)\|\%(\%(no_\?\)\?bg_nice\>\)\|
+ \ \%(\%(\<no_\?\)\?braceccl\>\)\|\%(\%(no_\?\)\?brace_ccl\>\)\|
+ \ \%(\%(\<no_\?\)\?braceexpand\>\)\|\%(\%(no_\?\)\?brace_expand\>\)\|
+ \ \%(\%(\<no_\?\)\?bsdecho\>\)\|\%(\%(no_\?\)\?bsd_echo\>\)\|
+ \ \%(\%(\<no_\?\)\?caseglob\>\)\|\%(\%(no_\?\)\?case_glob\>\)\|
+ \ \%(\%(\<no_\?\)\?casematch\>\)\|\%(\%(no_\?\)\?case_match\>\)\|
+ \ \%(\%(\<no_\?\)\?cbases\>\)\|\%(\%(no_\?\)\?c_bases\>\)\|
+ \ \%(\%(\<no_\?\)\?cdablevars\>\)\|\%(\%(no_\?\)\?cdable_vars\>\)\|\%(\%(no_\?\)\?cd_able_vars\>\)\|
+ \ \%(\%(\<no_\?\)\?chasedots\>\)\|\%(\%(no_\?\)\?chase_dots\>\)\|
+ \ \%(\%(\<no_\?\)\?chaselinks\>\)\|\%(\%(no_\?\)\?chase_links\>\)\|
+ \ \%(\%(\<no_\?\)\?checkjobs\>\)\|\%(\%(no_\?\)\?check_jobs\>\)\|
+ \ \%(\%(\<no_\?\)\?clobber\>\)\|
+ \ \%(\%(\<no_\?\)\?combiningchars\>\)\|\%(\%(no_\?\)\?combining_chars\>\)\|
+ \ \%(\%(\<no_\?\)\?completealiases\>\)\|\%(\%(no_\?\)\?complete_aliases\>\)\|
+ \ \%(\%(\<no_\?\)\?completeinword\>\)\|\%(\%(no_\?\)\?complete_in_word\>\)\|
+ \ \%(\%(\<no_\?\)\?continueonerror\>\)\|\%(\%(no_\?\)\?continue_on_error\>\)\|
+ \ \%(\%(\<no_\?\)\?correct\>\)\|
+ \ \%(\%(\<no_\?\)\?correctall\>\)\|\%(\%(no_\?\)\?correct_all\>\)\|
+ \ \%(\%(\<no_\?\)\?cprecedences\>\)\|\%(\%(no_\?\)\?c_precedences\>\)\|
+ \ \%(\%(\<no_\?\)\?cshjunkiehistory\>\)\|\%(\%(no_\?\)\?csh_junkie_history\>\)\|
+ \ \%(\%(\<no_\?\)\?cshjunkieloops\>\)\|\%(\%(no_\?\)\?csh_junkie_loops\>\)\|
+ \ \%(\%(\<no_\?\)\?cshjunkiequotes\>\)\|\%(\%(no_\?\)\?csh_junkie_quotes\>\)\|
+ \ \%(\%(\<no_\?\)\?csh_nullcmd\>\)\|\%(\%(no_\?\)\?csh_null_cmd\>\)\|\%(\%(no_\?\)\?cshnullcmd\>\)\|\%(\%(no_\?\)\?csh_null_cmd\>\)\|
+ \ \%(\%(\<no_\?\)\?cshnullglob\>\)\|\%(\%(no_\?\)\?csh_null_glob\>\)\|
+ \ \%(\%(\<no_\?\)\?debugbeforecmd\>\)\|\%(\%(no_\?\)\?debug_before_cmd\>\)\|
+ \ \%(\%(\<no_\?\)\?dotglob\>\)\|\%(\%(no_\?\)\?dot_glob\>\)\|
+ \ \%(\%(\<no_\?\)\?dvorak\>\)\|
+ \ \%(\%(\<no_\?\)\?emacs\>\)\|
+ \ \%(\%(\<no_\?\)\?equals\>\)\|
+ \ \%(\%(\<no_\?\)\?errexit\>\)\|\%(\%(no_\?\)\?err_exit\>\)\|
+ \ \%(\%(\<no_\?\)\?errreturn\>\)\|\%(\%(no_\?\)\?err_return\>\)\|
+ \ \%(\%(\<no_\?\)\?evallineno_\?\)\|\%(\%(no_\?\)\?eval_lineno_\?\)\|
+ \ \%(\%(\<no_\?\)\?exec\>\)\|
+ \ \%(\%(\<no_\?\)\?extendedglob\>\)\|\%(\%(no_\?\)\?extended_glob\>\)\|
+ \ \%(\%(\<no_\?\)\?extendedhistory\>\)\|\%(\%(no_\?\)\?extended_history\>\)\|
+ \ \%(\%(\<no_\?\)\?flowcontrol\>\)\|\%(\%(no_\?\)\?flow_control\>\)\|
+ \ \%(\%(\<no_\?\)\?forcefloat\>\)\|\%(\%(no_\?\)\?force_float\>\)\|
+ \ \%(\%(\<no_\?\)\?functionargzero\>\)\|\%(\%(no_\?\)\?function_argzero\>\)\|\%(\%(no_\?\)\?function_arg_zero\>\)\|
+ \ \%(\%(\<no_\?\)\?glob\>\)\|
+ \ \%(\%(\<no_\?\)\?globalexport\>\)\|\%(\%(no_\?\)\?global_export\>\)\|
+ \ \%(\%(\<no_\?\)\?globalrcs\>\)\|\%(\%(no_\?\)\?global_rcs\>\)\|
+ \ \%(\%(\<no_\?\)\?globassign\>\)\|\%(\%(no_\?\)\?glob_assign\>\)\|
+ \ \%(\%(\<no_\?\)\?globcomplete\>\)\|\%(\%(no_\?\)\?glob_complete\>\)\|
+ \ \%(\%(\<no_\?\)\?globdots\>\)\|\%(\%(no_\?\)\?glob_dots\>\)\|
+ \ \%(\%(\<no_\?\)\?glob_subst\>\)\|\%(\%(no_\?\)\?globsubst\>\)\|
+ \ \%(\%(\<no_\?\)\?globstarshort\>\)\|\%(\%(no_\?\)\?glob_star_short\>\)\|
+ \ \%(\%(\<no_\?\)\?hashall\>\)\|\%(\%(no_\?\)\?hash_all\>\)\|
+ \ \%(\%(\<no_\?\)\?hashcmds\>\)\|\%(\%(no_\?\)\?hash_cmds\>\)\|
+ \ \%(\%(\<no_\?\)\?hashdirs\>\)\|\%(\%(no_\?\)\?hash_dirs\>\)\|
+ \ \%(\%(\<no_\?\)\?hashexecutablesonly\>\)\|\%(\%(no_\?\)\?hash_executables_only\>\)\|
+ \ \%(\%(\<no_\?\)\?hashlistall\>\)\|\%(\%(no_\?\)\?hash_list_all\>\)\|
+ \ \%(\%(\<no_\?\)\?histallowclobber\>\)\|\%(\%(no_\?\)\?hist_allow_clobber\>\)\|
+ \ \%(\%(\<no_\?\)\?histappend\>\)\|\%(\%(no_\?\)\?hist_append\>\)\|
+ \ \%(\%(\<no_\?\)\?histbeep\>\)\|\%(\%(no_\?\)\?hist_beep\>\)\|
+ \ \%(\%(\<no_\?\)\?hist_expand\>\)\|\%(\%(no_\?\)\?histexpand\>\)\|
+ \ \%(\%(\<no_\?\)\?hist_expire_dups_first\>\)\|\%(\%(no_\?\)\?histexpiredupsfirst\>\)\|
+ \ \%(\%(\<no_\?\)\?histfcntllock\>\)\|\%(\%(no_\?\)\?hist_fcntl_lock\>\)\|
+ \ \%(\%(\<no_\?\)\?histfindnodups\>\)\|\%(\%(no_\?\)\?hist_find_no_dups\>\)\|
+ \ \%(\%(\<no_\?\)\?histignorealldups\>\)\|\%(\%(no_\?\)\?hist_ignore_all_dups\>\)\|
+ \ \%(\%(\<no_\?\)\?histignoredups\>\)\|\%(\%(no_\?\)\?hist_ignore_dups\>\)\|
+ \ \%(\%(\<no_\?\)\?histignorespace\>\)\|\%(\%(no_\?\)\?hist_ignore_space\>\)\|
+ \ \%(\%(\<no_\?\)\?histlexwords\>\)\|\%(\%(no_\?\)\?hist_lex_words\>\)\|
+ \ \%(\%(\<no_\?\)\?histnofunctions\>\)\|\%(\%(no_\?\)\?hist_no_functions\>\)\|
+ \ \%(\%(\<no_\?\)\?histnostore\>\)\|\%(\%(no_\?\)\?hist_no_store\>\)\|
+ \ \%(\%(\<no_\?\)\?histreduceblanks\>\)\|\%(\%(no_\?\)\?hist_reduce_blanks\>\)\|
+ \ \%(\%(\<no_\?\)\?histsavebycopy\>\)\|\%(\%(no_\?\)\?hist_save_by_copy\>\)\|
+ \ \%(\%(\<no_\?\)\?histsavenodups\>\)\|\%(\%(no_\?\)\?hist_save_no_dups\>\)\|
+ \ \%(\%(\<no_\?\)\?histsubstpattern\>\)\|\%(\%(no_\?\)\?hist_subst_pattern\>\)\|
+ \ \%(\%(\<no_\?\)\?histverify\>\)\|\%(\%(no_\?\)\?hist_verify\>\)\|
+ \ \%(\%(\<no_\?\)\?hup\>\)\|
+ \ \%(\%(\<no_\?\)\?ignorebraces\>\)\|\%(\%(no_\?\)\?ignore_braces\>\)\|
+ \ \%(\%(\<no_\?\)\?ignoreclosebraces\>\)\|\%(\%(no_\?\)\?ignore_close_braces\>\)\|
+ \ \%(\%(\<no_\?\)\?ignoreeof\>\)\|\%(\%(no_\?\)\?ignore_eof\>\)\|
+ \ \%(\%(\<no_\?\)\?incappendhistory\>\)\|\%(\%(no_\?\)\?inc_append_history\>\)\|
+ \ \%(\%(\<no_\?\)\?incappendhistorytime\>\)\|\%(\%(no_\?\)\?inc_append_history_time\>\)\|
+ \ \%(\%(\<no_\?\)\?interactive\>\)\|
+ \ \%(\%(\<no_\?\)\?interactivecomments\>\)\|\%(\%(no_\?\)\?interactive_comments\>\)\|
+ \ \%(\%(\<no_\?\)\?ksharrays\>\)\|\%(\%(no_\?\)\?ksh_arrays\>\)\|
+ \ \%(\%(\<no_\?\)\?kshautoload\>\)\|\%(\%(no_\?\)\?ksh_autoload\>\)\|
+ \ \%(\%(\<no_\?\)\?kshglob\>\)\|\%(\%(no_\?\)\?ksh_glob\>\)\|
+ \ \%(\%(\<no_\?\)\?kshoptionprint\>\)\|\%(\%(no_\?\)\?ksh_option_print\>\)\|
+ \ \%(\%(\<no_\?\)\?kshtypeset\>\)\|\%(\%(no_\?\)\?ksh_typeset\>\)\|
+ \ \%(\%(\<no_\?\)\?kshzerosubscript\>\)\|\%(\%(no_\?\)\?ksh_zero_subscript\>\)\|
+ \ \%(\%(\<no_\?\)\?listambiguous\>\)\|\%(\%(no_\?\)\?list_ambiguous\>\)\|
+ \ \%(\%(\<no_\?\)\?listbeep\>\)\|\%(\%(no_\?\)\?list_beep\>\)\|
+ \ \%(\%(\<no_\?\)\?listpacked\>\)\|\%(\%(no_\?\)\?list_packed\>\)\|
+ \ \%(\%(\<no_\?\)\?listrowsfirst\>\)\|\%(\%(no_\?\)\?list_rows_first\>\)\|
+ \ \%(\%(\<no_\?\)\?listtypes\>\)\|\%(\%(no_\?\)\?list_types\>\)\|
+ \ \%(\%(\<no_\?\)\?localloops\>\)\|\%(\%(no_\?\)\?local_loops\>\)\|
+ \ \%(\%(\<no_\?\)\?localoptions\>\)\|\%(\%(no_\?\)\?local_options\>\)\|
+ \ \%(\%(\<no_\?\)\?localpatterns\>\)\|\%(\%(no_\?\)\?local_patterns\>\)\|
+ \ \%(\%(\<no_\?\)\?localtraps\>\)\|\%(\%(no_\?\)\?local_traps\>\)\|
+ \ \%(\%(\<no_\?\)\?log\>\)\|
+ \ \%(\%(\<no_\?\)\?login\>\)\|
+ \ \%(\%(\<no_\?\)\?longlistjobs\>\)\|\%(\%(no_\?\)\?long_list_jobs\>\)\|
+ \ \%(\%(\<no_\?\)\?magicequalsubst\>\)\|\%(\%(no_\?\)\?magic_equal_subst\>\)\|
+ \ \%(\%(\<no_\?\)\?mark_dirs\>\)\|
+ \ \%(\%(\<no_\?\)\?mailwarn\>\)\|\%(\%(no_\?\)\?mail_warn\>\)\|
+ \ \%(\%(\<no_\?\)\?mailwarning\>\)\|\%(\%(no_\?\)\?mail_warning\>\)\|
+ \ \%(\%(\<no_\?\)\?markdirs\>\)\|
+ \ \%(\%(\<no_\?\)\?menucomplete\>\)\|\%(\%(no_\?\)\?menu_complete\>\)\|
+ \ \%(\%(\<no_\?\)\?monitor\>\)\|
+ \ \%(\%(\<no_\?\)\?multibyte\>\)\|\%(\%(no_\?\)\?multi_byte\>\)\|
+ \ \%(\%(\<no_\?\)\?multifuncdef\>\)\|\%(\%(no_\?\)\?multi_func_def\>\)\|
+ \ \%(\%(\<no_\?\)\?multios\>\)\|\%(\%(no_\?\)\?multi_os\>\)\|
+ \ \%(\%(\<no_\?\)\?nomatch\>\)\|\%(\%(no_\?\)\?no_match\>\)\|
+ \ \%(\%(\<no_\?\)\?notify\>\)\|
+ \ \%(\%(\<no_\?\)\?nullglob\>\)\|\%(\%(no_\?\)\?null_glob\>\)\|
+ \ \%(\%(\<no_\?\)\?numericglobsort\>\)\|\%(\%(no_\?\)\?numeric_glob_sort\>\)\|
+ \ \%(\%(\<no_\?\)\?octalzeroes\>\)\|\%(\%(no_\?\)\?octal_zeroes\>\)\|
+ \ \%(\%(\<no_\?\)\?onecmd\>\)\|\%(\%(no_\?\)\?one_cmd\>\)\|
+ \ \%(\%(\<no_\?\)\?overstrike\>\)\|\%(\%(no_\?\)\?over_strike\>\)\|
+ \ \%(\%(\<no_\?\)\?pathdirs\>\)\|\%(\%(no_\?\)\?path_dirs\>\)\|
+ \ \%(\%(\<no_\?\)\?pathscript\>\)\|\%(\%(no_\?\)\?path_script\>\)\|
+ \ \%(\%(\<no_\?\)\?physical\>\)\|
+ \ \%(\%(\<no_\?\)\?pipefail\>\)\|\%(\%(no_\?\)\?pipe_fail\>\)\|
+ \ \%(\%(\<no_\?\)\?posixaliases\>\)\|\%(\%(no_\?\)\?posix_aliases\>\)\|
+ \ \%(\%(\<no_\?\)\?posixargzero\>\)\|\%(\%(no_\?\)\?posix_arg_zero\>\)\|\%(\%(no_\?\)\?posix_argzero\>\)\|
+ \ \%(\%(\<no_\?\)\?posixbuiltins\>\)\|\%(\%(no_\?\)\?posix_builtins\>\)\|
+ \ \%(\%(\<no_\?\)\?posixcd\>\)\|\%(\%(no_\?\)\?posix_cd\>\)\|
+ \ \%(\%(\<no_\?\)\?posixidentifiers\>\)\|\%(\%(no_\?\)\?posix_identifiers\>\)\|
+ \ \%(\%(\<no_\?\)\?posixjobs\>\)\|\%(\%(no_\?\)\?posix_jobs\>\)\|
+ \ \%(\%(\<no_\?\)\?posixstrings\>\)\|\%(\%(no_\?\)\?posix_strings\>\)\|
+ \ \%(\%(\<no_\?\)\?posixtraps\>\)\|\%(\%(no_\?\)\?posix_traps\>\)\|
+ \ \%(\%(\<no_\?\)\?printeightbit\>\)\|\%(\%(no_\?\)\?print_eight_bit\>\)\|
+ \ \%(\%(\<no_\?\)\?printexitvalue\>\)\|\%(\%(no_\?\)\?print_exit_value\>\)\|
+ \ \%(\%(\<no_\?\)\?privileged\>\)\|
+ \ \%(\%(\<no_\?\)\?promptbang\>\)\|\%(\%(no_\?\)\?prompt_bang\>\)\|
+ \ \%(\%(\<no_\?\)\?promptcr\>\)\|\%(\%(no_\?\)\?prompt_cr\>\)\|
+ \ \%(\%(\<no_\?\)\?promptpercent\>\)\|\%(\%(no_\?\)\?prompt_percent\>\)\|
+ \ \%(\%(\<no_\?\)\?promptsp\>\)\|\%(\%(no_\?\)\?prompt_sp\>\)\|
+ \ \%(\%(\<no_\?\)\?promptsubst\>\)\|\%(\%(no_\?\)\?prompt_subst\>\)\|
+ \ \%(\%(\<no_\?\)\?promptvars\>\)\|\%(\%(no_\?\)\?prompt_vars\>\)\|
+ \ \%(\%(\<no_\?\)\?pushdignoredups\>\)\|\%(\%(no_\?\)\?pushd_ignore_dups\>\)\|
+ \ \%(\%(\<no_\?\)\?pushdminus\>\)\|\%(\%(no_\?\)\?pushd_minus\>\)\|
+ \ \%(\%(\<no_\?\)\?pushdsilent\>\)\|\%(\%(no_\?\)\?pushd_silent\>\)\|
+ \ \%(\%(\<no_\?\)\?pushdtohome\>\)\|\%(\%(no_\?\)\?pushd_to_home\>\)\|
+ \ \%(\%(\<no_\?\)\?rcexpandparam\>\)\|\%(\%(no_\?\)\?rc_expandparam\>\)\|\%(\%(no_\?\)\?rc_expand_param\>\)\|
+ \ \%(\%(\<no_\?\)\?rcquotes\>\)\|\%(\%(no_\?\)\?rc_quotes\>\)\|
+ \ \%(\%(\<no_\?\)\?rcs\>\)\|
+ \ \%(\%(\<no_\?\)\?recexact\>\)\|\%(\%(no_\?\)\?rec_exact\>\)\|
+ \ \%(\%(\<no_\?\)\?rematchpcre\>\)\|\%(\%(no_\?\)\?re_match_pcre\>\)\|\%(\%(no_\?\)\?rematch_pcre\>\)\|
+ \ \%(\%(\<no_\?\)\?restricted\>\)\|
+ \ \%(\%(\<no_\?\)\?rmstarsilent\>\)\|\%(\%(no_\?\)\?rm_star_silent\>\)\|
+ \ \%(\%(\<no_\?\)\?rmstarwait\>\)\|\%(\%(no_\?\)\?rm_star_wait\>\)\|
+ \ \%(\%(\<no_\?\)\?sharehistory\>\)\|\%(\%(no_\?\)\?share_history\>\)\|
+ \ \%(\%(\<no_\?\)\?shfileexpansion\>\)\|\%(\%(no_\?\)\?sh_file_expansion\>\)\|
+ \ \%(\%(\<no_\?\)\?shglob\>\)\|\%(\%(no_\?\)\?sh_glob\>\)\|
+ \ \%(\%(\<no_\?\)\?shinstdin\>\)\|\%(\%(no_\?\)\?shin_stdin\>\)\|
+ \ \%(\%(\<no_\?\)\?shnullcmd\>\)\|\%(\%(no_\?\)\?sh_nullcmd\>\)\|
+ \ \%(\%(\<no_\?\)\?shoptionletters\>\)\|\%(\%(no_\?\)\?sh_option_letters\>\)\|
+ \ \%(\%(\<no_\?\)\?shortloops\>\)\|\%(\%(no_\?\)\?short_loops\>\)\|
+ \ \%(\%(\<no_\?\)\?shwordsplit\>\)\|\%(\%(no_\?\)\?sh_word_split\>\)\|
+ \ \%(\%(\<no_\?\)\?singlecommand\>\)\|\%(\%(no_\?\)\?single_command\>\)\|
+ \ \%(\%(\<no_\?\)\?singlelinezle\>\)\|\%(\%(no_\?\)\?single_line_zle\>\)\|
+ \ \%(\%(\<no_\?\)\?sourcetrace\>\)\|\%(\%(no_\?\)\?source_trace\>\)\|
+ \ \%(\%(\<no_\?\)\?stdin\>\)\|
+ \ \%(\%(\<no_\?\)\?sunkeyboardhack\>\)\|\%(\%(no_\?\)\?sun_keyboard_hack\>\)\|
+ \ \%(\%(\<no_\?\)\?trackall\>\)\|\%(\%(no_\?\)\?track_all\>\)\|
+ \ \%(\%(\<no_\?\)\?transientrprompt\>\)\|\%(\%(no_\?\)\?transient_rprompt\>\)\|
+ \ \%(\%(\<no_\?\)\?trapsasync\>\)\|\%(\%(no_\?\)\?traps_async\>\)\|
+ \ \%(\%(\<no_\?\)\?typesetsilent\>\)\|\%(\%(no_\?\)\?type_set_silent\>\)\|\%(\%(no_\?\)\?typeset_silent\>\)\|
+ \ \%(\%(\<no_\?\)\?unset\>\)\|
+ \ \%(\%(\<no_\?\)\?verbose\>\)\|
+ \ \%(\%(\<no_\?\)\?vi\>\)\|
+ \ \%(\%(\<no_\?\)\?warncreateglobal\>\)\|\%(\%(no_\?\)\?warn_create_global\>\)\|
+ \ \%(\%(\<no_\?\)\?xtrace\>\)\|
+ \ \%(\%(\<no_\?\)\?zle\>\)/ nextgroup=zshOption,zshComment skipwhite contained
+
+syn keyword zshTypes float integer local typeset declare private readonly
" XXX: this may be too much
" syn match zshSwitches '\s\zs--\=[a-zA-Z0-9-]\+'
@@ -319,9 +342,9 @@ syn cluster zshSubst contains=zshSubst,zshOldSubst,zshMathSubst
syn region zshSubst matchgroup=zshSubstDelim transparent
\ start='\$(' skip='\\)' end=')' contains=TOP fold
syn region zshParentheses transparent start='(' skip='\\)' end=')' fold
+syn region zshGlob start='(#' end=')'
syn region zshMathSubst matchgroup=zshSubstDelim transparent
- \ start='\$((' skip='\\)'
- \ matchgroup=zshSubstDelim end='))'
+ \ start='\$((' skip='\\)' end='))'
\ contains=zshParentheses,@zshSubst,zshNumber,
\ @zshDerefs,zshString keepend fold
syn region zshBrackets contained transparent start='{' skip='\\}'
@@ -359,23 +382,13 @@ hi def link zshRedir Operator
hi def link zshVariable None
hi def link zshVariableDef zshVariable
hi def link zshDereferencing PreProc
-if s:zsh_syntax_variables =~ 'short\|all'
- hi def link zshShortDeref zshDereferencing
-else
- hi def link zshShortDeref None
-endif
-if s:zsh_syntax_variables =~ 'long\|all'
- hi def link zshLongDeref zshDereferencing
-else
- hi def link zshLongDeref None
-endif
-if s:zsh_syntax_variables =~ 'all'
- hi def link zshDeref zshDereferencing
-else
- hi def link zshDeref None
-endif
+hi def link zshShortDeref zshDereferencing
+hi def link zshLongDeref zshDereferencing
+hi def link zshDeref zshDereferencing
+hi def link zshDollarVar zshDereferencing
hi def link zshCommands Keyword
-hi def link zshOptions Constant
+hi def link zshOptStart Keyword
+hi def link zshOption Constant
hi def link zshTypes Type
hi def link zshSwitches Special
hi def link zshNumber Number
@@ -383,6 +396,7 @@ hi def link zshSubst PreProc
hi def link zshMathSubst zshSubst
hi def link zshOldSubst zshSubst
hi def link zshSubstDelim zshSubst
+hi def link zshGlob zshSubst
let b:current_syntax = "zsh"
diff --git a/runtime/tools/check_colors.vim b/runtime/tools/check_colors.vim
new file mode 100644
index 0000000000..b1aefa1126
--- /dev/null
+++ b/runtime/tools/check_colors.vim
@@ -0,0 +1,136 @@
+" This script tests a color scheme for some errors. Load the scheme and source
+" this script. e.g. :e colors/desert.vim | :so check_colors.vim
+" Will output possible errors.
+
+let s:save_cpo= &cpo
+set cpo&vim
+
+func! Test_check_colors()
+ call cursor(1,1)
+ let err={}
+
+ " 1) Check g:colors_name is existing
+ if !search('\<\%(g:\)\?colors_name\>', 'cnW')
+ let err['colors_name'] = 'g:colors_name not set'
+ else
+ let err['colors_name'] = 'OK'
+ endif
+
+ " 2) Check for some well-defined highlighting groups
+ " Some items, check several groups, e.g. Diff, Spell
+ let hi_groups = ['ColorColumn', 'Diff', 'ErrorMsg', 'Folded',
+ \ 'FoldColumn', 'IncSearch', 'LineNr', 'ModeMsg', 'MoreMsg', 'NonText',
+ \ 'Normal', 'Pmenu', 'Todo', 'Search', 'Spell', 'StatusLine', 'TabLine',
+ \ 'Title', 'Visual', 'WarningMsg', 'WildMenu']
+ let groups={}
+ for group in hi_groups
+ if search('\c@suppress\s\+'.group, 'cnW')
+ " skip check, if the script contains a line like
+ " @suppress Visual:
+ let groups[group] = 'Ignoring '.group
+ continue
+ endif
+ if !search('hi\%[ghlight] \+'.group, 'cnW')
+ let groups[group] = 'No highlight definition for '.group
+ continue
+ endif
+ if !search('hi\%[ghlight] \+'.group. '.*fg=', 'cnW')
+ let groups[group] = 'Missing foreground color for '.group
+ continue
+ endif
+ if search('hi\%[ghlight] \+'.group. '.*guibg=', 'cnW') &&
+ \ !search('hi\%[ghlight] \+'.group. '.*ctermbg=', 'cnW')
+ let groups[group] = 'Missing bg terminal color for '.group
+ continue
+ endif
+ call search('hi\%[ghlight] \+'.group, 'cW')
+ " only check in the current line
+ if !search('guifg', 'cnW', line('.')) || !search('ctermfg', 'cnW', line('.'))
+ " do not check for background colors, they could be intentionally left out
+ let groups[group] = 'Missing fg definition for '.group
+ endif
+ call cursor(1,1)
+ endfor
+ let err['highlight'] = groups
+
+ " 3) Check, that it does not set background highlighting
+ " Doesn't ':hi Normal ctermfg=253 ctermfg=233' also set the background sometimes?
+ let bg_set='\(set\?\|setl\(ocal\)\?\) .*\(background\|bg\)=\(dark\|light\)'
+ let bg_let='let \%([&]\%([lg]:\)\?\)\%(background\|bg\)\s*=\s*\([''"]\?\)\w\+\1'
+ let bg_pat='\%('.bg_set. '\|'.bg_let.'\)'
+ let line=search(bg_pat, 'cnW')
+ if search(bg_pat, 'cnW')
+ exe line
+ if search('hi \U\w\+\s\+\S', 'cbnW')
+ let err['background'] = 'Should not set background option after :hi statement'
+ endif
+ else
+ let err['background'] = 'OK'
+ endif
+ call cursor(1,1)
+
+ " 4) Check, that t_Co is checked
+ let pat = '[&]t_Co\s*[<>=]=\?\s*\d\+'
+ if !search(pat, 'ncW')
+ let err['t_Co'] = 'Does not check terminal for capable colors'
+ endif
+
+ " 5) Initializes correctly, e.g. should have a section like
+ " hi clear
+ " if exists("syntax_on")
+ " syntax reset
+ " endif
+ let pat='hi\%[ghlight]\s*clear\n\s*if\s*exists(\([''"]\)syntax_on\1)\n\s*syn\%[tax]\s*reset\n\s*endif'
+ if !search(pat, 'cnW')
+ let err['init'] = 'No initialization'
+ endif
+
+ " 6) Does not use :syn on
+ if search('syn\%[tax]\s\+on', 'cnW')
+ let err['background'] = 'Should not issue :syn on'
+ endif
+
+ " 7) Does not define filetype specific groups like vimCommand, htmlTag,
+ let hi_groups = ['vim', 'html', 'python', 'sh', 'ruby']
+ for group in hi_groups
+ let pat='\Chi\%[ghlight]\s*\zs'.group.'\w\+\>'
+ if search(pat, 'cnW')
+ let line = search(pat, 'cW')
+ let err['filetype'] = get(err, 'filetype', 'Should not define: ') . matchstr(getline('.'), pat). ' '
+ endif
+ call cursor(1,1)
+ endfor
+ let g:err = err
+
+ " print Result
+ call Result(err)
+endfu
+
+fu! Result(err)
+ let do_roups = 0
+ echohl Title|echomsg "---------------"|echohl Normal
+ for key in sort(keys(a:err))
+ if key is# 'highlight'
+ let do_groups = 1
+ continue
+ else
+ if a:err[key] !~ 'OK'
+ echohl Title
+ endif
+ echomsg printf("%15s: %s", key, a:err[key])
+ echohl Normal
+ endif
+ endfor
+ echohl Title|echomsg "---------------"|echohl Normal
+ if do_groups
+ echohl Title | echomsg "Groups" | echohl Normal
+ for v1 in sort(keys(a:err['highlight']))
+ echomsg printf("%25s: %s", v1, a:err['highlight'][v1])
+ endfor
+ endif
+endfu
+
+call Test_check_colors()
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/tutor/en/vim-01-beginner.tutor b/runtime/tutor/en/vim-01-beginner.tutor
index 47d4ed06a1..2b30ccb5f8 100644
--- a/runtime/tutor/en/vim-01-beginner.tutor
+++ b/runtime/tutor/en/vim-01-beginner.tutor
@@ -1,29 +1,29 @@
# Welcome to the VIM Tutor
-Vim is a very powerful editor that has many commands, too many to explain in a
-tutor such as this. This tutor is designed to describe enough of the commands
-that you will be able to easily use Vim as an all-purpose editor. It is
-IMPORTANT to remember that this tutor is set up to teach by use. That means
-that you need to do the exercises to learn them properly. If you only read
-the text, you will soon forget what is most important!
+Vim is a very powerful editor that has many commands, too many to explain in
+a tutor such as this. This tutor is designed to describe enough of the
+commands that you will be able to easily use Vim as an all-purpose editor.
+It is IMPORTANT to remember that this tutor is set up to teach by use. That
+means that you need to do the exercises to learn them properly. If you only
+read the text, you will soon forget what is most important!
-For now, make sure that your Shift-Lock key is NOT depressed and press the `j`{normal}
-key enough times to move the cursor so that Lesson 0 completely fills the
-screen.
+For now, make sure that your Shift-Lock key is NOT depressed and press the
+`j`{normal} key enough times to move the cursor so that Lesson 0 completely
+fills the screen.
# Lesson 0
-NOTE: The commands in the lessons will modify the text, but those changes won't
-be saved. Don't worry about messing things up; just remember that pressing
-[<Esc>](<Esc>) and then [u](u) will undo the latest change.
+NOTE: The commands in the lessons will modify the text, but those changes
+won't be saved. Don't worry about messing things up; just remember that
+pressing [<Esc>](<Esc>) and then [u](u) will undo the latest change.
This tutorial is interactive, and there are a few things you should know.
-Pressing [<Enter>](<Enter>) over text highlighted [like this](holy-grail) will take you to some relevant
-help (hopefully), and pressing K over any word will try to do so too. Sometimes
-you will be required to modify text like
----> this here {expect:this here}
+- Type [<Enter>](<Enter>) on links [like this](holy-grail ) to open the linked help section.
+- Or simply type [K](K) on any word to find its documentation!
+- Sometimes you will be required to modify text like
+this here
Once you have done the changes correctly, the โœ— sign at the left will change
-to โœ“. I imagine you can already see how neat Vim can be ;)
+to โœ“. I imagine you can already see how neat Vim can be. ;)
Other times, you'll be prompted to run a command (I'll explain this later):
~~~ cmd
:help <Enter>
@@ -33,117 +33,120 @@ or press a sequence of keys
<Esc>0f<Space>d3wP$P
~~~
-Text within <'s and >'s (like `<Enter>`{normal}) describes a key to press instead of text
-to type.
+Text within <'s and >'s (like `<Enter>`{normal}) describes a key to press
+instead of text to type.
-Now, move to the next lesson (remember, use j).
+Now, move to the next lesson (use the `j`{normal} key to scroll down).
## Lesson 1.1: MOVING THE CURSOR
** To move the cursor, press the `h`, `j`, `k`, `l` keys as indicated. **
โ†‘
- k Hint: The h key is at the left and moves left.
- โ† h l โ†’ The l key is at the right and moves right.
- j The j key looks like a down arrow.
+ k Hint: The `h`{normal} key is at the left and moves left.
+ โ† h l โ†’ The `l`{normal} key is at the right and moves right.
+ j The `j`{normal} key looks like a down arrow.
โ†“
1. Move the cursor around the screen until you are comfortable.
- 2. Hold down the down key (j) until it repeats.
+ 2. Hold down the down key (`j`{normal}) until it repeats.
Now you know how to move to the next lesson.
3. Using the down key, move to Lesson 1.2.
NOTE: If you are ever unsure about something you typed, press <Esc> to place
- you in Normal mode. Then retype the command you wanted.
+ you in Normal mode. Then retype the command you wanted.
-NOTE: The cursor keys should also work. But using hjkl you will be able to
- move around much faster, once you get used to it. Really!
+NOTE: The cursor keys should also work. But using hjkl you will be able to
+ move around much faster, once you get used to it. Really!
# Lesson 1.2: EXITING VIM
-!! NOTE: Before executing any of the steps below, read this entire lesson !!
+!! NOTE: Before executing any of the steps below,
+read this entire lesson !!
- 1. Press the <Esc> key (to make sure you are in [Normal mode]().
+ 1. Press the <Esc> key (to make sure you are in Normal mode).
- 2. Type:
+ 2. Type:
`:q!`{vim} `<Enter>`{normal}.
This exits the editor, DISCARDING any changes you have made.
- 3. Open vim and get back here by executing the command that got you into this
- tutor. That might be:
+ 3. Open vim and get back here by executing the command that got you into
+ this tutor. That might be:
:Tutor <Enter>
- 4. If you have these steps memorized and are confident, execute steps
+ 4. If you have these steps memorized and are confident, execute steps
1 through 3 to exit and re-enter the editor.
-NOTE: [:q!](:q) <Enter> discards any changes you made. In a few lessons you
+NOTE: [:q!](:q) <Enter> discards any changes you made. In a few lessons you
will learn how to save the changes to a file.
- 5. Move the cursor down to Lesson 1.3.
+ 5. Move the cursor down to Lesson 1.3.
## Lesson 1.3: TEXT EDITING - DELETION
** Press `x`{normal} to delete the character under the cursor. **
-1. Move the cursor to the line below marked --->.
+ 1. Move the cursor to the line below marked --->.
-2. To fix the errors, move the cursor until it is on top of the
- character to be deleted.
+ 2. To fix the errors, move the cursor until it is on top of the
+ character to be deleted.
-3. Press [the x key](x) to delete the unwanted character.
+ 3. Press [the x key](x) to delete the unwanted character.
-4. Repeat steps 2 through 4 until the sentence is correct.
+ 4. Repeat steps 2 through 4 until the sentence is correct.
----> The ccow jumpedd ovverr thhe mooon. {expect:The cow jumped over the moon.}
+The ccow jumpedd ovverr thhe mooon.
-5. Now that the line is correct, go on to Lesson 1.4.
+ 5. Now that the line is correct, go on to Lesson 1.4.
-NOTE: As you go through this tutor, do not try to memorize, learn by usage.
+NOTE: As you go through this tutor, do not try to memorize, learn by
+ usage.
# Lesson 1.4: TEXT EDITING: INSERTION
** Press `i`{normal} to insert text. **
- 1. Move the cursor to the first line below marked --->.
+ 1. Move the cursor to the first line below marked --->.
- 2. To make the first line the same as the second, move the cursor on top
+ 2. To make the first line the same as the second, move the cursor on top
of the first character AFTER where the text is to be inserted.
- 3. Press i and type in the necessary additions.
+ 3. Press `i`{normal} and type in the necessary additions.
- 4. As each error is fixed press <Esc> to return to Normal mode.
+ 4. As each error is fixed press `<Esc>`{normal} to return to Normal mode.
Repeat steps 2 through 4 to correct the sentence.
----> There is text misng this . {expect:There is some text missing from this line.}
----> There is some text missing from this line. {expect:There is some text missing from this line.}
+There is text misng this .
+There is some text missing from this line.
- 5. When you are comfortable inserting text move to lesson 1.5.
+ 5. When you are comfortable inserting text move to Lesson 1.5.
# Lesson 1.5: TEXT EDITING: APPENDING
** Press `A`{normal} to append text. **
- 1. Move the cursor to the first line below marked --->.
- It does not matter on what character the cursor is in that line.
+ 1. Move the cursor to the first line below marked --->.
+ It does not matter on what character the cursor is in that line.
- 2. Press [A](A) and type in the necessary additions.
+ 2. Press [A](A) and type in the necessary additions.
- 3. As the text has been appended press <Esc> to return to Normal mode.
+ 3. As the text has been appended press `<Esc>`{normal} to return to Normal
+ mode.
- 4. Move the cursor to the second line marked ---> and repeat
- steps 2 and 3 to correct this sentence.
+ 4. Move the cursor to the second line marked ---> and repeat
+ steps 2 and 3 to correct this sentence.
----> There is some text missing from th {expect:There is some text missing from this line.}
----> There is some text missing from this line. {expect:There is some text missing from this line.}
----> There is also some text miss {expect:There is also some text missing here.}
----> There is also some text missing here. {expect:There is also some text missing here.}
+There is some text missing from th
+There is some text missing from this line.
+There is also some text miss
+There is also some text missing here.
- 5. When you are comfortable appending text move to lesson 1.6.
+ 5. When you are comfortable appending text move to Lesson 1.6.
# Lesson 1.6: EDITING A FILE
@@ -151,49 +154,51 @@ NOTE: As you go through this tutor, do not try to memorize, learn by usage.
!! NOTE: Before executing any of the steps below, read this entire lesson !!
- 1. Exit this tutor as you did in lesson 1.2: :q!
- Or, if you have access to another terminal, do the following there.
+ 1. Exit this tutor as you did in Lesson 1.2: `:q!`{vim}
+ Or, if you have access to another terminal, do the following there.
- 2. At the shell prompt type this command:
+ 2. At the shell prompt type this command:
~~~ sh
$ vim tutor
~~~
- 'vim' is the command to start the Vim editor, 'tutor' is the name of the
- file you wish to edit. Use a file that may be changed.
+ 'vim' is the command to start the Vim editor, 'tutor' is the name of
+ the file you wish to edit. Use a file that may be changed.
- 3. Insert and delete text as you learned in the previous lessons.
+ 3. Insert and delete text as you learned in the previous lessons.
- 4. Save the file with changes and exit Vim with:
+ 4. Save the file with changes and exit Vim with:
~~~ cmd
:wq
~~~
- Note you'll need to press `<Enter>` to execute the command.
+ Note you'll need to press `<Enter>` to execute the command.
- 5. If you have quit vimtutor in step 1 restart the vimtutor and move down to
- the following summary.
+ 5. If you have quit vimtutor in step 1 restart the vimtutor and move down
+ to the following summary.
- 6. After reading the above steps and understanding them: do it.
+ 6. After reading the above steps and understanding them: do it.
# Lesson 1 SUMMARY
- 1. The cursor is moved using either the arrow keys or the hjkl keys.
+ 1. The cursor is moved using either the arrow keys or the hjkl keys.
h (left) j (down) k (up) l (right)
- 2. To start Vim from the shell prompt type:
+ 2. To start Vim from the shell prompt type:
~~~ sh
$ vim FILENAME
~~~
- 3. To exit Vim type: <Esc> :q! <Enter> to trash all changes.
- OR type: <Esc> :wq <Enter> to save the changes.
+ 3. To exit Vim type: `<Esc>`{normal} `:q!`{vim} `<Enter>`{normal} to trash
+ all changes.
+ OR type: `<Esc>`{normal} `:wq`{vim} `<Enter>`{normal} to save
+ the changes.
- 4. To delete the character at the cursor type: `x`{normal}
+ 4. To delete the character at the cursor type: `x`{normal}
- 5. To insert or append text type:
- `i`{normal} type inserted text `<Esc>`{normal} insert before the cursor
- `A`{normal} type appended text `<Esc>`{normal} append after the line
+ 5. To insert or append text type:
+ `i`{normal} insert text `<Esc>`{normal} insert before the cursor.
+ `A`{normal} append text `<Esc>`{normal} append after the line.
NOTE: Pressing `<Esc>`{normal} will place you in Normal mode or will cancel
an unwanted and partially completed command.
@@ -204,39 +209,39 @@ Now continue with Lesson 2.
** Type `dw`{normal} to delete a word. **
- 1. Press `<Esc>`{normal} to make sure you are in Normal mode.
+ 1. Press `<Esc>`{normal} to make sure you are in Normal mode.
- 2. Move the cursor to the line below marked --->.
+ 2. Move the cursor to the line below marked --->.
- 3. Move the cursor to the beginning of a word that needs to be deleted.
+ 3. Move the cursor to the beginning of a word that needs to be deleted.
- 4. Type [d](d)[w](w) to make the word disappear.
+ 4. Type [d](d)[w](w) to make the word disappear.
----> There are a some words fun that don't belong paper in this sentence. {expect:There are some words that don't belong in this sentence.}
+There are a some words fun that don't belong paper in this sentence.
- 5. Repeat steps 3 and 4 until the sentence is correct and go to Lesson 2.2.
+ 5. Repeat steps 3 and 4 until the sentence is correct and go to Lesson 2.2.
# Lesson 2.2: MORE DELETION COMMANDS
-** Type `d$`{normal} to delete to the end of the line. **
+** Type `d$`{normal} to delete to the end of the line. **
- 1. Press <Esc> to make sure you are in Normal mode.
+ 1. Press `<Esc>`{normal} to make sure you are in Normal mode.
- 2. Move the cursor to the line below marked --->.
+ 2. Move the cursor to the line below marked --->.
- 3. Move the cursor to the end of the correct line (AFTER the first . ).
+ 3. Move the cursor to the end of the correct line (AFTER the first . ).
- 4. Type `d$`{normal} to delete to the end of the line.
+ 4. Type `d$`{normal} to delete to the end of the line.
----> Somebody typed the end of this line twice. end of this line twice. {expect:ANYTHING}
+Somebody typed the end of this line twice. end of this line twice.
- 5. Move on to Lesson 2.3 to understand what is happening.
+ 5. Move on to Lesson 2.3 to understand what is happening.
# Lesson 2.3: ON OPERATORS AND MOTIONS
-
-Many commands that change text are made from an [operator](operator) and a [motion](navigation).
-The format for a delete command with the [d](d) delete operator is as follows:
+Many commands that change text are made from an [operator](operator) and
+a [motion](navigation).
+The format for a delete command with the [d](d) delete operator is as follows:
d motion
@@ -249,28 +254,28 @@ The format for a delete command with the [d](d) delete operator is as follows:
[e](e) - to the end of the current word, INCLUDING the last character.
[$]($) - to the end of the line, INCLUDING the last character.
- Thus typing `de`{normal} will delete from the cursor to the end of the word.
+ Thus typing `de`{normal} will delete from the cursor to the end of the word.
-NOTE: Pressing just the motion while in Normal mode without an operator will
- move the cursor as specified.
+NOTE: Pressing just the motion while in Normal mode without an operator
+ will move the cursor as specified.
# Lesson 2.4: USING A COUNT FOR A MOTION
** Typing a number before a motion repeats it that many times. **
- 1. Move the cursor to the start of the line marked ---> below.
+ 1. Move the cursor to the start of the line marked ---> below.
- 2. Type `2w`{normal} to move the cursor two words forward.
+ 2. Type `2w`{normal} to move the cursor two words forward.
- 3. Type `3e`{normal} to move the cursor to the end of the third word forward.
+ 3. Type `3e`{normal} to move the cursor to the end of the third word forward.
- 4. Type `0`{normal} ([zero](0)) to move to the start of the line.
+ 4. Type `0`{normal} ([zero](0)) to move to the start of the line.
- 5. Repeat steps 2 and 3 with different numbers.
+ 5. Repeat steps 2 and 3 with different numbers.
----> This is just a line with words you can move around in. {expect:ANYTHING}
+This is just a line with words you can move around in.
- 6. Move on to Lesson 2.5.
+ 6. Move on to Lesson 2.5.
# Lesson 2.5: USING A COUNT TO DELETE MORE
@@ -280,166 +285,169 @@ In the combination of the delete operator and a motion mentioned above you
insert a count before the motion to delete more:
d number motion
- 1. Move the cursor to the first UPPER CASE word in the line marked --->.
+ 1. Move the cursor to the first UPPER CASE word in the line marked --->.
- 2. Type `d2w`{normal} to delete the two UPPER CASE words
+ 2. Type `d2w`{normal} to delete the two UPPER CASE words
- 3. Repeat steps 1 and 2 with a different count to delete the consecutive
- UPPER CASE words with one command
+ 3. Repeat steps 1 and 2 with a different count to delete the consecutive
+ UPPER CASE words with one command
----> this ABC DE line FGHI JK LMN OP of words is Q RS TUV cleaned up. {expect:this line of words is cleaned up.}
+This ABC DE line FGHI JK LMN OP of words is Q RS TUV cleaned up.
# Lesson 2.6: OPERATING ON LINES
-** Type dd to delete a whole line. **
+** Type `dd`{normal} to delete a whole line. **
- Due to the frequency of whole line deletion, the designers of Vi decided
- it would be easier to simply type two d's to delete a line.
+Due to the frequency of whole line deletion, the designers of Vi decided
+it would be easier to simply type two d's to delete a line.
- 1. Move the cursor to the second line in the phrase below.
- 2. Type [dd](dd) to delete the line.
- 3. Now move to the fourth line.
- 4. Type `2dd`{normal} to delete two lines.
+ 1. Move the cursor to the second line in the phrase below.
+ 2. Type [dd](dd) to delete the line.
+ 3. Now move to the fourth line.
+ 4. Type `2dd`{normal} to delete two lines.
----> 1) Roses are red, {expect:ANYTHING}
----> 2) Mud is fun, {expect:ANYTHING}
----> 3) Violets are blue, {expect:ANYTHING}
----> 4) I have a car, {expect:ANYTHING}
----> 5) Clocks tell time, {expect:ANYTHING}
----> 6) Sugar is sweet {expect:ANYTHING}
----> 7) And so are you. {expect:ANYTHING}
+1) Roses are red,
+2) Mud is fun,
+3) Violets are blue,
+4) I have a car,
+5) Clocks tell time,
+6) Sugar is sweet
+7) And so are you.
# Lesson 2.7: THE UNDO COMMAND
-** Press u to undo the last commands, U to fix a whole line. **
+** Press `u`{normal} to undo the last commands, `U`{normal} to fix a whole line. **
- 1. Move the cursor to the line below marked ---> and place it on the
- first error.
- 2. Type `x`{normal} to delete the first unwanted character.
- 3. Now type `u`{normal} to undo the last command executed.
- 4. This time fix all the errors on the line using the `x`{normal} command.
- 5. Now type a capital `U`{normal} to return the line to its original state.
- 6. Now type `u`{normal} a few times to undo the U and preceding commands.
- 7. Now type `<Ctrl-r>`{normal} a few times to redo the commands (undo the undo's).
+ 1. Move the cursor to the line below marked ---> and place it on the
+ first error.
+ 2. Type `x`{normal} to delete the first unwanted character.
+ 3. Now type `u`{normal} to undo the last command executed.
+ 4. This time fix all the errors on the line using the `x`{normal} command.
+ 5. Now type a capital `U`{normal} to return the line to its original state.
+ 6. Now type `u`{normal} a few times to undo the `U`{normal} and preceding
+ commands.
+ 7. Now type `<C-r>`{normal} (Control + R) a few times to redo the commands
+ (undo the undos).
----> Fiix the errors oon thhis line and reeplace them witth undo. {expect:Fix the errors on this line and replace them with undo.}
+Fiix the errors oon thhis line and reeplace them witth undo.
- 8. These are very useful commands. Now move on to the Lesson 2 Summary.
+ 8. These are very useful commands. Now move on to the Lesson 2 Summary.
# Lesson 2 SUMMARY
- 1. To delete from the cursor up to the next word type: `dw`{normal}
- 2. To delete from the cursor to the end of a line type: `d$`{normal}
- 3. To delete a whole line type: `dd`{normal}
- 4. To repeat a motion prepend it with a number: `2w`{normal}
+ 1. To delete from the cursor up to the next word type: `dw`{normal}
+ 2. To delete from the cursor to the end of a line type: `d$`{normal}
+ 3. To delete a whole line type: `dd`{normal}
+ 4. To repeat a motion prepend it with a number: `2w`{normal}
- 5. The format for a change command is:
+ 5. The format for a change command is:
operator [number] motion
- where:
- operator - is what to do, such as [d](d) for delete
+ where:
+ operator - is what to do, such as [d](d) for delete
[number] - is an optional count to repeat the motion
motion - moves over the text to operate on, such as:
[w](w) (word),
[$]($) (to the end of line), etc.
- 6. To move to the start of the line use a zero: [0](0)
+ 6. To move to the start of the line use a zero: [0](0)
- 7. To undo previous actions, type: `u`{normal} (lowercase u)
- To undo all the changes on a line, type: `U`{normal} (capital U)
- To undo the undo's, type: `<Ctrl-r>`{normal}
+ 7. To undo previous actions, type: `u`{normal} (lowercase u)
+ To undo all the changes on a line, type: `U`{normal} (capital U)
+ To undo the undo's, type: `<C-r>`{normal}
# Lesson 3.1: THE PUT COMMAND
-** Type p to put previously deleted text after the cursor. **
+** Type `p`{normal} to put previously deleted text after the cursor. **
- 1. Move the cursor to the first ---> line below.
+ 1. Move the cursor to the first ---> line below.
- 2. Type `dd`{normal} to delete the line and store it in a Vim register.
+ 2. Type `dd`{normal} to delete the line and store it in a Vim register.
- 3. Move the cursor to the c) line, ABOVE where the deleted line should go.
+ 3. Move the cursor to the c) line, ABOVE where the deleted line should go.
- 4. Type `p`{normal} to put the line below the cursor.
+ 4. Type `p`{normal} to put the line below the cursor.
- 5. Repeat steps 2 through 4 to put all the lines in correct order.
+ 5. Repeat steps 2 through 4 to put all the lines in correct order.
----> d) Can you learn too? {expect:ANYTHING}
----> b) Violets are blue, {expect:ANYTHING}
----> c) Intelligence is learned, {expect:ANYTHING}
----> a) Roses are red, {expect:ANYTHING}
+d) Can you learn too?
+b) Violets are blue,
+c) Intelligence is learned,
+a) Roses are red,
# Lesson 3.2: THE REPLACE COMMAND
** Type `rx`{normal} to replace the character at the cursor with x. **
- 1. Move the cursor to the first line below marked --->.
+ 1. Move the cursor to the first line below marked --->.
- 2. Move the cursor so that it is on top of the first error.
+ 2. Move the cursor so that it is on top of the first error.
- 3. Type `r`{normal} and then the character which should be there.
+ 3. Type `r`{normal} and then the character which should be there.
- 4. Repeat steps 2 and 3 until the first line is equal to the second one.
+ 4. Repeat steps 2 and 3 until the first line is equal to the second one.
----> Whan this lime was tuoed in, someone presswd some wrojg keys! {expect:When this line was typed in, someone pressed some wrong keys!}
----> When this line was typed in, someone pressed some wrong keys! {expect:When this line was typed in, someone pressed some wrong keys!}
+Whan this lime was tuoed in, someone presswd some wrojg keys!
+When this line was typed in, someone pressed some wrong keys!
- 5. Now move on to Lesson 3.3.
+ 5. Now move on to Lesson 3.3.
NOTE: Remember that you should be learning by doing, not memorization.
# Lesson 3.3: THE CHANGE OPERATOR
-** To change until the end of a word, type `ce`{normal} **
+** To change until the end of a word, type `ce`{normal}. **
- 1. Move the cursor to the first line below marked --->.
+ 1. Move the cursor to the first line below marked --->.
- 2. Place the cursor on the "u" in "lubw".
+ 2. Place the cursor on the "u" in "lubw".
- 3. Type `ce`{normal} and the correct word (in this case, type "ine" ).
+ 3. Type `ce`{normal} and the correct word (in this case, type "ine" ).
- 4. Press `<Esc>`{normal} and move to the next character that needs to be changed.
+ 4. Press `<Esc>`{normal} and move to the next character that needs to be
+ changed.
- 5. Repeat steps 3 and 4 until the first sentence is the same as the second.
+ 5. Repeat steps 3 and 4 until the first sentence is the same as the second.
----> This lubw has a few wptfd that mrrf changing usf the change operator. {expect:This line has a few words that need changing using the change operator.}
----> This line has a few words that need changing using the change operator. {expect:This line has a few words that need changing using the change operator.}
+This lubw has a few wptfd that mrrf changing usf the change operator.
+This line has a few words that need changing using the change operator.
Notice that [c](c)e deletes the word and places you in Insert mode.
-# Lesson 3.4: MORE CHANGES USING c
+# Lesson 3.4: MORE CHANGES USING `c`{normal}
** The change operator is used with the same motions as delete. **
- 1. The change operator works in the same way as delete. The format is:
+ 1. The change operator works in the same way as delete. The format is:
c [number] motion
- 2. The motions are the same, such as `w`{normal} (word) and `$`{normal} (end of line).
+ 2. The motions are the same, such as `w`{normal} (word) and `$`{normal} (end of line).
- 3. Move to the first line below marked --->.
+ 3. Move to the first line below marked --->.
- 4. Move the cursor to the first error.
+ 4. Move the cursor to the first error.
- 5. Type `c$`{normal} and type the rest of the line like the second and press `<Esc>`{normal}.
+ 5. Type `c$`{normal} and type the rest of the line like the second and press `<Esc>`{normal}.
----> The end of this line needs some help to make it like the second. {expect:The end of this line needs to be corrected using the c$ command.}
----> The end of this line needs to be corrected using the c$ command. {expect:The end of this line needs to be corrected using the c$ command.}
+The end of this line needs some help to make it like the second.
+The end of this line needs to be corrected using the `c$`{normal} command.
-NOTE: You can use the Backspace key to correct mistakes while typing.
+NOTE: You can use the Backspace key to correct mistakes while typing.
# Lesson 3 SUMMARY
- 1. To put back text that has just been deleted, type [p](p). This puts the
- deleted text AFTER the cursor (if a line was deleted it will go on the
- line below the cursor).
+ 1. To put back text that has just been deleted, type [p](p). This puts the
+ deleted text AFTER the cursor (if a line was deleted it will go on the
+ line below the cursor).
- 2. To replace the character under the cursor, type [r](r) and then the
- character you want to have there.
+ 2. To replace the character under the cursor, type [r](r) and then the
+ character you want to have there.
- 3. The [change operator](c) allows you to change from the cursor to where the
- motion takes you. eg. Type `ce`{normal} to change from the cursor to the end of
- the word, `c$`{normal} to change to the end of a line.
+ 3. The [change operator](c) allows you to change from the cursor to where
+ the motion takes you. Type `ce`{normal} to change from the cursor to the
+ end of the word, `c$`{normal} to change to the end of a line.
- 4. The format for change is:
+ 4. The format for change is:
c [number] motion
@@ -447,44 +455,46 @@ Now go on to the next lesson.
# Lesson 4.1: CURSOR LOCATION AND FILE STATUS
-** Type `<Ctrl-g>`{normal} to show your location in the file and the file status.
- Type `G`{normal} to move to a line in the file. **
+** Type `<C-g>`{normal} to show your location in a file and the file status.
+ Type `G`{normal} to move to a line in the file. **
NOTE: Read this entire lesson before executing any of the steps!!
- 1. Hold down the `<Ctrl>`{normal} key and press `g`{normal}. We call this `<Ctrl-g>`{normal}.
- A message will appear at the bottom of the page with the filename and the
- position in the file. Remember the line number for Step 3.
-
-NOTE: You may see the cursor position in the lower right corner of the screen
- This happens when the ['ruler']('ruler') option is set (see :help 'ruler' )
+ 1. Hold down the `<Ctrl>`{normal} key and press `g`{normal}. We call this
+ `<C-g>`{normal}. A message will appear at the bottom of the page with the
+ filename and the position in the file. Remember the line number for
+ Step 3.
- 2. Press [G](G) to move you to the bottom of the file.
- Type [gg](gg) to move you to the start of the file.
+NOTE: You may see the cursor position in the lower right corner of the
+ screen. This happens when the ['ruler']('ruler') option is set.
+ 2. Press [G](G) to move you to the bottom of the file.
+ Type [gg](gg) to move you to the start of the file.
- 3. Type the number of the line you were on and then `G`{normal} . This will
- return you to the line you were on when you first pressed `<Ctrl-g>`{normal}.
+ 3. Type the number of the line you were on and then `G`{normal}. This will
+ return you to the line you were on when you first pressed `<C-g>`{normal}.
- 4. If you feel confident to do this, execute steps 1 through 3.
+ 4. If you feel confident to do this, execute steps 1 through 3.
# Lesson 4.2: THE SEARCH COMMAND
** Type `/`{normal} followed by a phrase to search for the phrase. **
- 1. In Normal mode type the `/`{normal} character. Notice that it and the cursor
- appear at the bottom of the screen as with the : command.
+ 1. In Normal mode type the `/`{normal} character. Notice that it and the
+ cursor appear at the bottom of the screen as with the `:`{normal} command.
- 2. Now type 'errroor' `<Enter>`{normal}. This is the word you want to search for.
+ 2. Now type 'errroor' `<Enter>`{normal}. This is the word you want to search
+ for.
- 3. To search for the same phrase again, simply type [n](n) .
- To search for the same phrase in the opposite direction, type [N](N) .
+ 3. To search for the same phrase again, simply type [n](n).
+ To search for the same phrase in the opposite direction, type [N](N).
- 4. To search for a phrase in the backward direction, use [?](?) instead of / .
+ 4. To search for a phrase in the backward direction, use [?](?) instead
+ of `/`{normal}.
- 5. To go back to where you came from press `<Ctrl-o>`{normal} (Keep Ctrl down while
- pressing the letter o). Repeat to go back further. `<Ctrl-i>`{normal} goes forward.
+ 5. To go back to where you came from press `<C-o>`{normal} (keep `<Ctrl>`{normal} pressed down while pressing the letter `o`{normal}). Repeat to go back
+ further. `<C-i>`{normal} goes forward.
----> "errroor" is not the way to spell error; errroor is an error. {expect:ANYTHING}
+"errroor" is not the way to spell error; errroor is an error.
NOTE: When the search reaches the end of the file it will continue at the
start, unless the ['wrapscan']('wrapscan') option has been reset.
@@ -493,17 +503,17 @@ NOTE: When the search reaches the end of the file it will continue at the
** Type `%`{normal} to find a matching ),], or }. **
- 1. Place the cursor on any (, [, or { in the line below marked --->.
+ 1. Place the cursor on any (, [, or { in the line below marked --->.
- 2. Now type the [%](%) character.
+ 2. Now type the [%](%) character.
- 3. The cursor will move to the matching parenthesis or bracket.
+ 3. The cursor will move to the matching parenthesis or bracket.
- 4. Type `%`{normal} to move the cursor to the other matching bracket.
+ 4. Type `%`{normal} to move the cursor to the other matching bracket.
- 5. Move the cursor to another (,),[,],{ or } and see what `%`{normal} does.
+ 5. Move the cursor to another (,),[,],{ or } and see what `%`{normal} does.
----> This ( is a test line with ('s, ['s ] and {'s } in it. )) {expect:ANYTHING}
+This ( is a test line with ('s, ['s ] and {'s } in it. ))
NOTE: This is very useful in debugging a program with unmatched parentheses!
@@ -511,75 +521,79 @@ NOTE: This is very useful in debugging a program with unmatched parentheses!
** Type `:s/old/new/g` to substitute "new" for "old". **
- 1. Move the cursor to the line below marked --->.
+ 1. Move the cursor to the line below marked --->.
- 2. Type
+ 2. Type
~~~ cmd
:s/thee/the/
~~~
NOTE that the [:s](:s) command only changed the first occurrence of "thee" in the line.
- 3. Now type
+ 3. Now type
~~~ cmd
:s/thee/the/g
~~~
- Adding the g [flag](:s_flags) means to substitute globally in the line, change
- all occurrences of "thee" in the line.
+ Adding the g [flag](:s_flags) means to substitute globally in the line,
+ change all occurrences of "thee" in the line.
----> thee best time to see thee flowers is in thee spring. {expect:the best time to see the flowers is in the spring.}
+Usually thee best time to see thee flowers is in thee spring.
- 4. To change every occurrence of a character string between two lines, type
+ 4. To change every occurrence of a character string between two lines, type
~~~ cmd
:#,#s/old/new/g
~~~
- where #,# are the line numbers of the range of lines where the substitution is to be done.
+ where #,# are the line numbers of the range of lines where the
+ substitution is to be done.
- Type
+ Type
~~~ cmd
- :%s/old/new/g
+ :%s/old/new/g
~~~
- to change every occurrence in the whole file.
+ to change every occurrence in the whole file.
- Type
+ Type
~~~ cmd
- :%s/old/new/gc
+ :%s/old/new/gc
~~~
- to find every occurrence in the whole file, with a prompt whether to substitute or not.
+ to find every occurrence in the whole file, with a prompt whether to
+ substitute or not.
# Lesson 4 SUMMARY
- 1. `<Ctrl-g>`{normal} displays your location in the file and the file status.
- `G`{normal} moves to the end of the file.
- number `G`{normal} moves to that line number.
- `gg`{normal} moves to the first line.
+ 1. `<C-g>`{normal} displays your location and the file status.
+ `G`{normal} moves to the end of the file.
+ number `G`{normal} moves to that line number.
+ `gg`{normal} moves to the first line.
- 2. Typing `/`{normal} followed by a phrase searches FORWARD for the phrase.
- Typing `?`{normal} followed by a phrase searches BACKWARD for the phrase.
- After a search type `n`{normal} to find the next occurrence in the same direction
- or `N`{normal} to search in the opposite direction.
- `<Ctrl-o>`{normal} takes you back to older positions, `<Ctrl-i>`{normal} to newer positions.
+ 2. Typing `/`{normal} followed by a phrase searches FORWARD for the phrase.
+ Typing `?`{normal} followed by a phrase searches BACKWARD for the phrase.
+ After a search type `n`{normal} to find the next occurrence in the same
+ direction or `N`{normal} to search in the opposite direction.
+ `<C-o>`{normal} takes you back to older positions, `<C-i>`{normal} to
+ newer positions.
- 3. Typing `%`{normal} while the cursor is on a (,),[,],{, or } goes to its match.
+ 3. Typing `%`{normal} while the cursor is on a (,),[,],{, or } goes to its
+ match.
- 4. To substitute new for the first old in a line type
+ 4. To substitute new for the first old in a line type
~~~ cmd
:s/old/new
~~~
- To substitute new for all 'old's on a line type
+ To substitute new for all 'old's on a line type
~~~ cmd
:s/old/new/g
~~~
- To substitute phrases between two line #'s type
+ To substitute phrases between two line #'s type
~~~ cmd
:#,#s/old/new/g
~~~
- To substitute all occurrences in the file type
+ To substitute all occurrences in the file type
~~~ cmd
:%s/old/new/g
~~~
- To ask for confirmation each time add 'c'
+ To ask for confirmation each time add 'c'
~~~ cmd
:%s/old/new/gc
~~~
@@ -588,258 +602,264 @@ NOTE: This is very useful in debugging a program with unmatched parentheses!
** Type `:!`{vim} followed by an external command to execute that command. **
- 1. Type the familiar command `:`{normal} to set the cursor at the bottom of the
- screen. This allows you to enter a command-line command.
+ 1. Type the familiar command `:`{normal} to set the cursor at the bottom of
+ the screen. This allows you to enter a command-line command.
- 2. Now type the [!](!cmd) (exclamation point) character. This allows you to
- execute any external shell command.
+ 2. Now type the [!](!cmd) (exclamation point) character. This allows you to
+ execute any external shell command.
- 3. As an example type "ls" following the "!" and then hit `<Enter>`{normal}. This
- will show you a listing of your directory, just as if you were at the
- shell prompt.
+ 3. As an example type "ls" following the "!" and then hit `<Enter>`{normal}.
+ This will show you a listing of your directory, just as if you were
+ at the shell prompt.
-NOTE: It is possible to execute any external command this way, also with
- arguments.
+NOTE: It is possible to execute any external command this way, also with
+ arguments.
-NOTE: All : commands must be finished by hitting <Enter>
- From here on we will not always mention it.
+NOTE: All `:`{vim} commands must be finished by hitting `<Enter>`{normal}.
+ From here on we will not always mention it.
# Lesson 5.2: MORE ON WRITING FILES
** To save the changes made to the text, type `:w`{vim} FILENAME. **
- 1. Type `:!ls`{vim} to get a listing of your directory.
- You already know you must hit `<Enter>`{normal} after this.
+ 1. Type `:!ls`{vim} to get a listing of your directory.
+ You already know you must hit `<Enter>`{normal} after this.
- 2. Choose a filename that does not exist yet, such as TEST.
+ 2. Choose a filename that does not exist yet, such as TEST.
- 3. Now type:
+ 3. Now type:
~~~ cmd
:w TEST
~~~
- (where TEST is the filename you chose.)
+ (where TEST is the filename you chose.)
- 4. This saves the whole file (the Vim Tutor) under the name TEST.
- To verify this, type `:!ls`{vim} again to see your directory.
+ 4. This saves the whole file (the Vim Tutor) under the name TEST.
+ To verify this, type `:!ls`{vim} again to see your directory.
-NOTE: If you were to exit Vim and start it again with vim TEST , the file
+NOTE: If you were to exit Vim and start it again with `nvim TEST`, the file
would be an exact copy of the tutor when you saved it.
- 5. Now remove the file by typing:
+ 5. Now remove the file by typing:
~~~ cmd
:!rm TEST
~~~
# Lesson 5.3: SELECTING TEXT TO WRITE
-** To save part of the file, type `v`{normal} motion `:w FILENAME`{vim} **
+** To save part of the file, type `v`{normal} motion `:w FILENAME`{vim}. **
- 1. Move the cursor to this line.
+ 1. Move the cursor to this line.
- 2. Press [v](v) and move the cursor to the fifth item below. Notice that the
- text is highlighted.
+ 2. Press [v](v) and move the cursor to the fifth item below. Notice that the
+ text is highlighted.
- 3. Press the `:`{normal} character. At the bottom of the screen
+ 3. Press the `:`{normal} character. At the bottom of the screen
:'<,'>
will appear.
- 4. Type
+ 4. Type
`:w TEST`{vim}
- where TEST is a filename that does not exist yet. Verify that you see
+ where TEST is a filename that does not exist yet. Verify that you see
`:'<,'>w TEST`{vim}
- before you press `<Enter>`{normal}.
+ before you press `<Enter>`{normal}.
- 5. Vim will write the selected lines to the file TEST. Use `:!ls`{vim} to see it.
- Do not remove it yet! We will use it in the next lesson.
+ 5. Vim will write the selected lines to the file TEST. Use `:!ls`{vim} to see it. Do not remove it yet! We will use it in the next lesson.
-NOTE: Pressing [v](v) starts [Visual selection](visual-mode). You can move
- the cursor around to make the selection bigger or smaller. Then you can
- use an operator to do something with the text. For example, `d`{normal} deletes
- the text.
+NOTE: Pressing [v](v) starts [Visual selection](visual-mode). You can move
+ the cursor around to make the selection bigger or smaller. Then you can
+ use an operator to do something with the text. For example, `d`{normal}
+ deletes the text.
# Lesson 5.4: RETRIEVING AND MERGING FILES
-** To insert the contents of a file, type `:r FILENAME`{vim} **
+** To insert the contents of a file, type `:r FILENAME`{vim}. **
- 1. Place the cursor just above this line.
+ 1. Place the cursor just above this line.
-NOTE: After executing Step 2 you will see text from Lesson 5.3. Then move
+NOTE: After executing Step 2 you will see text from Lesson 5.3. Then move
DOWN to see this lesson again.
- 2. Now retrieve your TEST file using the command
+ 2. Now retrieve your TEST file using the command
`:r TEST`{vim}
where TEST is the name of the file you used.
The file you retrieve is placed below the cursor line.
- 3. To verify that a file was retrieved, cursor back and notice that there
- are now two copies of Lesson 5.3, the original and the file version.
+ 3. To verify that a file was retrieved, cursor back and notice that there
+ are now two copies of Lesson 5.3, the original and the file version.
-NOTE: You can also read the output of an external command. For example,
+NOTE: You can also read the output of an external command. For example,
- `:r !ls`{vim}
+ `:r !ls`{vim}
- reads the output of the `ls` command and puts it below the cursor.
+ reads the output of the `ls` command and puts it below the cursor.
# Lesson 5 SUMMARY
- 1. [:!command](:!cmd) executes an external command.
+ 1. [:!command](:!cmd) executes an external command.
- Some useful examples are:
- `:!ls`{vim} - shows a directory listing
- `:!rm FILENAME`{vim} - removes file FILENAME
+ Some useful examples are:
+ `:!ls`{vim} - shows a directory listing
+ `:!rm FILENAME`{vim} - removes file FILENAME
- 2. [:w](:w) FILENAME writes the current Vim file to disk with
- name FILENAME.
+ 2. [:w](:w) FILENAME writes the current Vim file to disk with
+ name FILENAME.
- 3. [v](v) motion :w FILENAME saves the Visually selected lines in file
- FILENAME.
+ 3. [v](v) motion :w FILENAME saves the Visually selected lines in file
+ FILENAME.
- 4. [:r](:r) FILENAME retrieves disk file FILENAME and puts it
- below the cursor position.
+ 4. [:r](:r) FILENAME retrieves disk file FILENAME and puts it
+ below the cursor position.
- 5. [:r !dir](:r!) reads the output of the dir command and
- puts it below the cursor position.
+ 5. [:r !dir](:r!) reads the output of the dir command and
+ puts it below the cursor position.
# Lesson 6.1: THE OPEN COMMAND
** Type `o`{normal} to open a line below the cursor and place you in Insert mode. **
- 1. Move the cursor to the line below marked --->.
+ 1. Move the cursor to the line below marked --->.
- 2. Type the lowercase letter `o`{normal} to [open](o) up a line BELOW the cursor and place
- you in Insert mode.
+ 2. Type the lowercase letter `o`{normal} to [open](o) up a line BELOW the
+ cursor and place you in Insert mode.
- 3. Now type some text and press `<Esc>`{normal} to exit Insert mode.
+ 3. Now type some text and press `<Esc>`{normal} to exit Insert mode.
----> After typing o the cursor is placed on the open line in Insert mode. {expect:ANYTHING}
+After typing `o`{normal} the cursor is placed on the open line in Insert mode.
- 4. To open up a line ABOVE the cursor, simply type a [capital O](O), rather
- than a lowercase `o`{normal}. Try this on the line below.
+ 4. To open up a line ABOVE the cursor, simply type a [capital O](O), rather
+ than a lowercase `o`{normal}. Try this on the line below.
----> Open up a line above this by typing O while the cursor is on this line. {expect:ANYTHING}
+Open up a line above this by typing O while the cursor is on this line.
# Lesson 6.2: THE APPEND COMMAND
** Type `a`{normal} to insert text AFTER the cursor. **
- 1. Move the cursor to the start of the line below marked --->.
+ 1. Move the cursor to the start of the line below marked --->.
- 2. Press `e`{normal} until the cursor is on the end of "li".
+ 2. Press `e`{normal} until the cursor is on the end of "li".
- 3. Type an `a`{normal} (lowercase) to [append](a) text AFTER the cursor.
+ 3. Type the lowercase letter `a`{normal} to [append](a) text AFTER the
+ cursor.
- 4. Complete the word like the line below it. Press `<Esc>`{normal} to exit Insert
- mode.
+ 4. Complete the word like the line below it. Press `<Esc>`{normal} to exit
+ Insert mode.
- 5. Use `e`{normal} to move to the next incomplete word and repeat steps 3 and 4.
+ 5. Use `e`{normal} to move to the next incomplete word and repeat steps 3
+ and 4.
----> This li will allow you to pract appendi text to a line. {expect:This line will allow you to practice appending text to a line.}
----> This line will allow you to practice appending text to a line. {expect:This line will allow you to practice appending text to a line.}
+This li will allow you to pract appendi text to a line.
+This line will allow you to practice appending text to a line.
-NOTE: [a](a), [i](i) and [A](A) all go to the same Insert mode, the only difference is where
- the characters are inserted.
+NOTE: [a](a), [i](i) and [A](A) all go to the same Insert mode, the only
+ difference is where the characters are inserted.
# Lesson 6.3: ANOTHER WAY TO REPLACE
** Type a capital `R`{normal} to replace more than one character. **
- 1. Move the cursor to the first line below marked --->. Move the cursor to
+ 1. Move the cursor to the first line below marked --->. Move the cursor to
the beginning of the first "xxx".
- 2. Now press `R`{normal} ([capital R](R)) and type the number below it in the second line, so that it
- replaces the "xxx".
+ 2. Now press `R`{normal} ([capital R](R)) and type the number below it in the
+ second line, so that it replaces the "xxx".
- 3. Press `<Esc>`{normal} to leave [Replace mode](mode-replace). Notice that the rest of the line
- remains unmodified.
+ 3. Press `<Esc>`{normal} to leave [Replace mode](mode-replace). Notice that
+ the rest of the line remains unmodified.
- 4. Repeat the steps to replace the remaining "xxx".
+ 4. Repeat the steps to replace the remaining "xxx".
----> Adding 123 to xxx gives you xxx. {expect:Adding 123 to 456 gives you 579.}
----> Adding 123 to 456 gives you 579. {expect:Adding 123 to 456 gives you 579.}
+Adding 123 to xxx gives you xxx.
+Adding 123 to 456 gives you 579.
-NOTE: Replace mode is like Insert mode, but every typed character deletes an
- existing character.
+NOTE: Replace mode is like Insert mode, but every typed character deletes an
+ existing character.
# Lesson 6.4: COPY AND PASTE TEXT
-** Use the `y`{normal} operator to copy text and `p`{normal} to paste it **
+** Use the `y`{normal} operator to copy text and `p`{normal} to paste it. **
+
+ 1. Go to the line marked with ---> below and place the cursor after "a)".
- 1. Go to the line marked with ---> below and place the cursor after "a)".
+ 2. Start Visual mode with `v`{normal} and move the cursor to just before
+ "first".
- 2. Start Visual mode with `v`{normal} and move the cursor to just before "first".
+ 3. Type `y`{normal} to [yank](yank) (copy) the highlighted text.
- 3. Type `y`{normal} to [yank](yank) (copy) the highlighted text.
+ 4. Move the cursor to the end of the next line: `j$`{normal}
- 4. Move the cursor to the end of the next line: `j$`{normal}
+ 5. Type `p`{normal} to [put](put) (paste) the text.
- 5. Type `p`{normal} to [put](put) (paste) the text. Then type: "a second"`<Esc>`{normal}.
+ 6. Press `a`{normal} and then type "second". Press `<Esc>`{normal} to leave
+ Insert mode.
- 6. Use Visual mode to select " item.", yank it with `y`{normal}, move to the end of
- the next line with `j$`{normal} and put the text there with `p`{normal}.
+ 7. Use Visual mode to select "item.", yank it with `y`{normal}, move to the
+ end of the next line with `j$`{normal} and put the text there with `p`{normal}
----> a) this is the first item.
----> b) {expect: b) this is the second item}
+a) This is the first item.
+ b)
- NOTE: you can also use `y`{normal} as an operator; `yw`{normal} yanks one word.
+NOTE: you can use `y`{normal} as an operator: `yw`{normal} yanks one word.
# Lesson 6.5: SET OPTION
-** Set an option so a search or substitute ignores case **
+** Set an option so a search or substitute ignores case. **
- 1. Search for 'ignore' by entering: `/ignore`
- Repeat several times by pressing `n`{normal}.
+ 1. Search for 'ignore' by entering: `/ignore`
+ Repeat several times by pressing `n`{normal}.
- 2. Set the 'ic' (Ignore case) option by entering:
+ 2. Set the 'ic' (Ignore case) option by entering:
~~~ cmd
:set ic
~~~
- 3. Now search for 'ignore' again by pressing n
- Notice that Ignore and IGNORE are now also found.
+ 3. Now search for 'ignore' again by pressing `n`{normal}.
+ Notice that Ignore and IGNORE are now also found.
- 4. Set the 'hlsearch' and 'incsearch' options:
+ 4. Set the 'hlsearch' and 'incsearch' options:
~~~ cmd
:set hls is
~~~
- 5. Now type the search command again and see what happens: /ignore <Enter>
+ 5. Now type the search command again and see what happens: /ignore <Enter>
- 6. To disable ignoring case enter:
+ 6. To disable ignoring case enter:
~~~ cmd
:set noic
~~~
- 7. To toggle the value of a setting, prepend it with "inv":
+ 7. To toggle the value of a setting, prepend it with "inv":
~~~ cmd
:set invic
~~~
-NOTE: To remove the highlighting of matches enter:
+NOTE: To remove the highlighting of matches enter:
~~~ cmd
:nohlsearch
~~~
-NOTE: If you want to ignore case for just one search command, use [\c](/\c)
- in the phrase: /ignore\c <Enter>
+NOTE: If you want to ignore case for just one search command, use [\c](/\c)
+ in the phrase: /ignore\c <Enter>
# Lesson 6 SUMMARY
- 1. Type `o`{normal} to open a line BELOW the cursor and start Insert mode.
- Type `O`{normal} to open a line ABOVE the cursor.
+ 1. Type `o`{normal} to open a line BELOW the cursor and start Insert mode.
+ Type `O`{normal} to open a line ABOVE the cursor.
- 2. Type `a`{normal} to insert text AFTER the cursor.
- Type `A`{normal} to insert text after the end of the line.
+ 2. Type `a`{normal} to insert text AFTER the cursor.
+ Type `A`{normal} to insert text after the end of the line.
- 3. The `e`{normal} command moves to the end of a word.
+ 3. The `e`{normal} command moves to the end of a word.
- 4. The `y`{normal} operator yanks (copies) text, `p`{normal} puts (pastes) it.
+ 4. The `y`{normal} operator copies text, `p`{normal} pastes it.
- 5. Typing a capital `R`{normal} enters Replace mode until `<Esc>`{normal} is pressed.
+ 5. Typing a capital `R`{normal} enters Replace mode until `<Esc>`{normal} is
+ pressed.
- 6. Typing "[:set](:set) xxx" sets the option "xxx". Some options are:
+ 6. Typing "[:set](:set) xxx" sets the option "xxx". Some options are:
'ic' 'ignorecase' ignore upper/lower case when searching
'is' 'incsearch' show partial matches for a search phrase
@@ -847,20 +867,20 @@ NOTE: If you want to ignore case for just one search command, use [\c](/\c)
You can either use the long or the short option name.
- 7. Prepend "no" to switch an option off:
+ 7. Prepend "no" to switch an option off:
~~~ cmd
:set noic
~~~
- 8. Prepend "inv" to toggle an option:
+ 8. Prepend "inv" to toggle an option:
~~~ cmd
:set invic
~~~
# Lesson 7.1: GETTING HELP
-** Use the on-line help system **
+** Use the on-line help system. **
-Vim has a comprehensive on-line help system. To get started, try one of
+Vim has a comprehensive on-line help system. To get started, try one of
these three:
- press the `<HELP>`{normal} key (if you have one)
- press the `<F1>`{normal} key (if you have one)
@@ -868,11 +888,11 @@ these three:
`:help`{vim}
Read the text in the help window to find out how the help works.
-Type `<Ctrl-w><Ctrl-w>`{normal} to jump from one window to another.
+Type `<C-w><C-w>`{normal} to jump from one window to another.
Type `:q`{vim} to close the help window.
You can find help on just about any subject, by giving an argument to the
-":help" command. Try these (don't forget pressing <Enter>):
+":help" command. Try these (don't forget pressing <Enter>):
~~~ cmd
:help w
:help c_CTRL-D
@@ -881,78 +901,80 @@ You can find help on just about any subject, by giving an argument to the
~~~
# Lesson 7.2: CREATE A STARTUP SCRIPT
-** Enable Vim features **
+** Enable Vim features. **
Vim has many more features than Vi, but most of them are disabled by
-default. To start using more features you have to create a "vimrc" file.
-
- 1. Start editing the "vimrc" file. This depends on your system:
- `:e ~/.config/nvim/init.vim`{vim} for Unix-like systems
+default. To start using more features you have to create a "vimrc" file.
- 2. Now read the example "vimrc" file contents:
- `:r $VIMRUNTIME/vimrc_example.vim`{vim}
+ 1. Start editing the "vimrc" file.
+ `:call mkdir(stdpath('config'),'p')`{vim}
+ `:exe 'edit' stdpath('config').'/init.vim'`{vim}
- 3. Write the file with:
+ 2. Write the file with:
`:w`{vim}
- The next time you start Vim it will use syntax highlighting.
You can add all your preferred settings to this "vimrc" file.
- For more information type :help vimrc-intro
+ For more information type `:help vimrc-intro`{vim}.
# Lesson 7.3: COMPLETION
-** Command line completion with `<Ctrl-d>`{normal} and `<Tab>`{normal} **
+** Command line completion with `<C-d>`{normal} and `<Tab>`{normal}. **
- 1. Look what files exist in the directory: `:!ls`{vim}
+ 1. Look what files exist in the directory: `:!ls`{vim}
- 2. Type the start of a command: `:e`{vim}
+ 2. Type the start of a command: `:e`{vim}
- 3. Press `<Ctrl-d>`{normal} and Vim will show a list of commands that start with "e".
+ 3. Press `<C-d>`{normal} and Vim will show a list of commands that start
+ with "e".
- 4. Press `<Tab>`{normal} and Vim will complete the command name to ":edit".
+ 4. Press `<Tab>`{normal} and Vim will complete the command name to ":edit".
- 5. Now add a space and the start of an existing file name: `:edit FIL`{vim}
+ 5. Now add a space and the start of an existing file name: `:edit FIL`{vim}
- 6. Press `<Tab>`{normal}. Vim will complete the name (if it is unique).
+ 6. Press `<Tab>`{normal}. Vim will complete the name (if it is unique).
-NOTE: Completion works for many commands. It is especially useful for `:help`{vim}.
+NOTE: Completion works for many commands. It is especially useful for
+ `:help`{vim}.
# Lesson 7 SUMMARY
- 1. Type `:help`{vim}
- or press `<F1>`{normal} or `<Help>`{normal} to open a help window.
+ 1. Type `:help`{vim}
+ or press `<F1>`{normal} or `<Help>`{normal} to open a help window.
- 2. Type `:help TOPIC`{vim} to find help on TOPIC.
+ 2. Type `:help TOPIC`{vim} to find help on TOPIC.
- 3. Type `<Ctrl-w><Ctrl-w>`{normal} to jump to another window
+ 3. Type `<C-w><C-w>`{normal} to jump to another window
- 4. Type `:q`{vim} to close the help window
+ 4. Type `:q`{vim} to close the help window
- 5. Create a vimrc startup script to keep your preferred settings.
+ 5. Create a vimrc startup script to keep your preferred settings.
- 6. While in command mode, press `<Ctrl-d>`{normal} to see possible completions.
+ 6. While in command mode, press `<C-d>`{normal} to see possible completions.
Press `<Tab>`{normal} to use one completion.
# CONCLUSION
This was intended to give a brief overview of the Vim editor, just enough to
allow you to use the editor fairly easily. It is far from complete as Vim has
-many many more commands. Consult the help often.
+many many more commands. Consult the help often.
-There are many resources online to learn more about vim. Here's a bunch of them:
+There are many resources online to learn more about vim. Here's a bunch of
+them:
- *Learn Vim Progressively*: http://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively/
- *Learning Vim in 2014*: http://benmccormick.org/learning-vim-in-2014/
-- Vimcasts: http://vimcasts.org/
-- Vim Video-Tutorials by Derek Wyatt: http://derekwyatt.org/vim/tutorials/
+- *Vimcasts*: http://vimcasts.org/
+- *Vim Video-Tutorials by Derek Wyatt*: http://derekwyatt.org/vim/tutorials/
- *Learn Vimscript the Hard Way*: http://learnvimscriptthehardway.stevelosh.com/
- *7 Habits of Effective Text Editing*: http://www.moolenaar.net/habits.html
+- *vim-galore*: https://github.com/mhinz/vim-galore
-If you prefer a book, *Practival Vim* by Drew Neil is recommended often.
+If you prefer a book, *Practical Vim* by Drew Neil is recommended often
+(the sequel, *Modern Vim*, includes material specific to nvim).
This tutorial was written by Michael C. Pierce and Robert K. Ware, Colorado
School of Mines using ideas supplied by Charles Smith, Colorado State
-University. E-mail: bware@mines.colorado.edu.
+University. E-mail: bware@mines.colorado.edu.
Modified for Vim by Bram Moolenaar.
Modified for vim-tutor-mode by Felipe Morales.
diff --git a/runtime/tutor/en/vim-01-beginner.tutor.json b/runtime/tutor/en/vim-01-beginner.tutor.json
new file mode 100644
index 0000000000..2f87d7543f
--- /dev/null
+++ b/runtime/tutor/en/vim-01-beginner.tutor.json
@@ -0,0 +1,43 @@
+{
+ "expect": {
+ "24": -1,
+ "103": "The cow jumped over the moon.",
+ "124": "There is some text missing from this line.",
+ "125": "There is some text missing from this line.",
+ "144": "There is some text missing from this line.",
+ "145": "There is some text missing from this line.",
+ "146": "There is also some text missing here.",
+ "147": "There is also some text missing here.",
+ "220": "There are some words that don't belong in this sentence.",
+ "236": "Somebody typed the end of this line twice.",
+ "276": -1,
+ "295": "This line of words is cleaned up.",
+ "309": -1,
+ "310": -1,
+ "311": -1,
+ "312": -1,
+ "313": -1,
+ "314": -1,
+ "315": -1,
+ "332": "Fix the errors on this line and replace them with undo.",
+ "372": -1,
+ "373": -1,
+ "374": -1,
+ "375": -1,
+ "389": "When this line was typed in, someone pressed some wrong keys!",
+ "390": "When this line was typed in, someone pressed some wrong keys!",
+ "411": "This line has a few words that need changing using the change operator.",
+ "412": "This line has a few words that need changing using the change operator.",
+ "432": "The end of this line needs to be corrected using the c$ command.",
+ "433": "The end of this line needs to be corrected using the c$ command.",
+ "497": -1,
+ "516": -1,
+ "541": "Usually the best time to see the flowers is in the spring.",
+ "759": "This line will allow you to practice appending text to a line.",
+ "760": "This line will allow you to practice appending text to a line.",
+ "780": "Adding 123 to 456 gives you 579.",
+ "781": "Adding 123 to 456 gives you 579.",
+ "807": "a) This is the first item.",
+ "808": " b) This is the second item."
+ }
+}
diff --git a/runtime/tutor/tutor.tutor b/runtime/tutor/tutor.tutor
index 1ad64a18ff..c937bd686a 100644
--- a/runtime/tutor/tutor.tutor
+++ b/runtime/tutor/tutor.tutor
@@ -60,27 +60,27 @@ is displayed like
1. Format the line below so it becomes a lesson description:
----> This is text with important information {expect:This is text with **important information**}
----> This is text with **important information** {expect:This is text with **important information**}
+This is text with important information
+This is text with **important information**
Note: Some words (e.g., NOTE, IMPORTANT, tip, ATTENTION, etc.) will also be
highlighted. You don't need to mark them specially.
2. Turn the line below into a TODO item:
----> Document '&variable' {expect:TODO: Document '&variable'}
----> TODO: Document '&variable' {expect:TODO: Document '&variable'}
+Document '&variable'
+TODO: Document '&variable'
### Headers *headers*
3. Practice fixing the lines below:
----> This is a level 1 header {expect:# This is a level 1 header}
----> # This is a level 1 header {expect:# This is a level 1 header}
----> This is a level 3 header {expect:### This is a level 3 header}
----> ### This is a level 3 header {expect:### This is a level 3 header}
----> This is a header with a label {expect:# This is a header with a label {*label*}}
----> # This is a header with a label {*label*} {expect:# This is a header with a label {*label*}}
+This is a level 1 header
+# This is a level 1 header
+This is a level 3 header
+### This is a level 3 header
+This is a header with a label
+# This is a header with a label {*label*}
4. Now, create a 4th level section here, and add a label like in the previous
exercise:
@@ -105,8 +105,8 @@ If the target of a link matches a help topic, opening it will open it.
5. Fix the following line:
----> A link to help for the 'breakindent' option {expect:A link to help for the ['breakindent']('breakindent') option}
----> A link to help for the ['breakindent']('breakindent') option {expect:A link to help for the ['breakindent']('breakindent') option}
+A link to help for the 'breakindent' option
+A link to help for the ['breakindent']('breakindent') option
#### Anchor links
@@ -120,8 +120,8 @@ and are hidden by default. Links to them look like
6. Add the appropiate link:
----> A link to the Links section {expect:A link to the [Links](*links*) section}
----> A link to the [Links](*links*) section {expect:A link to the [Links](*links*) section}
+A link to the Links section
+A link to the [Links](*links*) section
7. Now, create a link to the section you created on exercise 4
above.
@@ -136,8 +136,8 @@ You can also have links to other tutorials. For this, you'll write the anchor in
7. Create a link to this tutorial:
----> A link to the vim-tutor-mode tutorial {expect:A link to [the vim-tutor-mode tutorial](@tutor:tutor)}
----> A link to [the vim-tutor-mode tutorial](@tutor:tutor) {expect:A link to [the vim-tutor-mode tutorial](@tutor:tutor)}
+A link to the vim-tutor-mode tutorial
+A link to [the vim-tutor-mode tutorial](@tutor:tutor)
### Codeblocks *codeblocks*
@@ -154,13 +154,13 @@ echom "hello"
8. Copy the viml section below
----> {expect:~~~ viml}
----> {expect:echom "the value of &number is".string(&number)}
----> {expect:~~~}
----> ~~~ viml {expect:~~~ viml}
----> echom "the value of &number is".string(&number) {expect:echom "the value of &number is".string(&number)}
----> ~~~ {expect:~~~}
+
+
+
+~~~ viml
+echom 'the value of &number is'.string(&number)
+~~~
You can inline viml code using "\`" and "\`{vim}":
@@ -185,13 +185,13 @@ Note: you can also write `norm` or `normal`.
9. Copy the normal section below
----> {expect:~~~ normal}
----> {expect:d2w}
----> {expect:~~~}
----> ~~~ normal {expect:~~~ normal}
----> d2w {expect:d2w}
----> ~~~ {expect:~~~}
+
+
+
+~~~ normal
+d2w
+~~~
You can also inline normal commands by using "\`" and "\`{normal}":
@@ -203,10 +203,11 @@ is displayed:
10. Complete the line as shown
----> d {expect:ยซd2wยป}
----> ยซd2wยป {expect:ยซd2wยป}
+d
+`d2w`{normal}
-Commands to run in the system shell can be highlighted by indenting a line starting with "$".
+Commands to run in the system shell can be highlighted by indenting a line
+starting with "$".
~~~ sh
$ vim --version
@@ -215,45 +216,32 @@ Commands to run in the system shell can be highlighted by indenting a line start
## INTERACTIVE ELEMENTS *interactive*
As visible in this very document, vim-tutor-mode includes some interactive
-elements, to provide feedback to the user about his progress. These elements
-all have the syntax
-
- \---> TEXT {CLAUSE}
-
-where \---> must start at the beginning of the line. If TEXT satisfies CLAUSE,
-a โœ“ sign will appear to the left. A โœ— sign is displayed otherwise. The CLAUSE
-itself is hidden unless debug mode is set or ['conceallevel']('conceallevel')
-is 2.
+elements to provide feedback to the user about his progress. If the text in
+these elements satisfies some set condition, a โœ“ sign will appear in the gutter
+to the left. Otherwise, a โœ— sign is displayed.
### expect *expect*
-The basic clause is "expect", which is satisfied if TEXT is the same as the
-content of the clause. For example
-
- \---> TEXT {expect:TEXT}
-
-is satisfied, but
-
- \---> OTHER TEXT {expect:TEXT}
-
-is not.
+"expect" lines check that the contents of the line are identical to some preset text
+(like in the exercises above).
-13. Make both lines the same:
+These elements are specified in separate JSON files like this
----> this is not right {expect:---> this is right} |expect:---> this is right {expect:---> this is right}|
----> ---> this is right {expect:---> this is right} |expect:---> this is right {expect:---> this is right}|
-
-
-If the content of a expect clause is ANYTHING, no checks will be performed. This is
-useful to create a line that is highlighted you want the user to play with.
-
- \---> TEXT {expect:ANYTHING}
-
-is displayed
+~~~ json
+{
+ "expect": {
+ "1": "This is how this line should look.",
+ "2": "This is how this line should look.",
+ "3": -1
+ }
+}
+~~~
----> this is free text {expect:ANYTHING}
+These files contain an "expect" dictionary, for which the keys are line numbers and
+the values are the expected text. A value of -1 means that the condition for the line
+will always be satisfied, no matter what (this is useful for letting the user play a bit).
-14. Turn the line below into free text:
+This is an "expect" line that is always satisfied. Try changing it.
----> this is some text |expect:---> this is some text {expect:ANYTHING}|
----> ---> this is some text {expect:ANYTHING} |expect:---> this is some text {expect:ANYTHING}|
+These files conventionally have the same name as the tutorial document with the `.json`
+extension appended (for a full example, see the file that corresponds to this tutorial).
diff --git a/runtime/tutor/tutor.tutor.json b/runtime/tutor/tutor.tutor.json
new file mode 100644
index 0000000000..bf3eae8586
--- /dev/null
+++ b/runtime/tutor/tutor.tutor.json
@@ -0,0 +1,35 @@
+{
+ "expect": {
+ "63": "This is text with **important information**",
+ "64": "This is text with **important information**",
+ "71": "Document '&variable'",
+ "72": "Document '&variable'",
+ "78": "# This is a level 1 header",
+ "79": "# This is a level 1 header",
+ "80": "### This is a level 3 header",
+ "81": "### This is a level 3 header",
+ "82": "# This is a header with a label {*label*}",
+ "83": "# This is a header with a label {*label*}",
+ "108": "A link to help for the ['breakindent']('breakindent') option",
+ "109": "A link to help for the ['breakindent']('breakindent') option",
+ "123": "A link to the [Links](*links*) section",
+ "124": "A link to the [Links](*links*) section",
+ "139": "A link to [the vim-tutor-mode tutorial](@tutor:tutor)",
+ "140": "A link to [the vim-tutor-mode tutorial](@tutor:tutor)",
+ "157": "~~~ viml",
+ "158": "echom 'the value of &number is'.string(&number)",
+ "159": "~~~",
+ "161": "~~~ viml",
+ "162": "echom 'the value of &number is'.string(&number)",
+ "163": "~~~",
+ "188": "~~~ normal",
+ "189": "d2w",
+ "190": "~~~",
+ "192": "~~~ normal",
+ "193": "d2w",
+ "194": "~~~",
+ "206": "`d2w`{normal}",
+ "207": "`d2w`{normal}",
+ "244": -1
+ }
+}
diff --git a/runtime/vimrc_example.vim b/runtime/vimrc_example.vim
deleted file mode 100644
index c53dde8ceb..0000000000
--- a/runtime/vimrc_example.vim
+++ /dev/null
@@ -1,50 +0,0 @@
-" An example for a vimrc file.
-"
-" To use it, copy it to
-" for Unix: $HOME/.config/nvim/init.vim
-" for Windows: %LOCALAPPDATA%\nvim\init.vim
-
-set backup " keep a backup file (restore to previous version)
-set undofile " keep an undo file (undo changes after closing)
-set ruler " show the cursor position all the time
-set showcmd " display incomplete commands
-
-" Don't use Ex mode, use Q for formatting
-noremap Q gq
-
-" CTRL-U in insert mode deletes a lot. Use CTRL-G u to first break undo,
-" so that you can undo CTRL-U after inserting a line break.
-inoremap <C-U> <C-G>u<C-U>
-
-" Switch syntax highlighting on
-syntax on
-
-" Enable file type detection.
-" Use the default filetype settings, so that mail gets 'textwidth' set to 72,
-" 'cindent' is on in C files, etc.
-" Also load indent files, to automatically do language-dependent indenting.
-filetype plugin indent on
-
-" Put these in an autocmd group, so that we can delete them easily.
-augroup vimrcEx
- autocmd!
-
- " For all text files set 'textwidth' to 78 characters.
- autocmd FileType text setlocal textwidth=78
-
- " When editing a file, always jump to the last known cursor position.
- " Don't do it when the position is invalid or when inside an event handler
- autocmd BufReadPost *
- \ if line("'\"") >= 1 && line("'\"") <= line("$") |
- \ execute "normal! g`\"" |
- \ endif
-
-augroup END
-
-" Convenient command to see the difference between the current buffer and the
-" file it was loaded from, thus the changes you made.
-" Only define it when not defined already.
-if !exists(":DiffOrig")
- command DiffOrig vert new | set buftype=nofile | read ++edit # | 0d_ | diffthis
- \ | wincmd p | diffthis
-endif
diff --git a/scripts/check-includes.py b/scripts/check-includes.py
new file mode 100755
index 0000000000..21308a21aa
--- /dev/null
+++ b/scripts/check-includes.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+
+import sys
+import re
+import os
+
+from subprocess import Popen, PIPE
+from argparse import ArgumentParser
+
+
+GENERATED_INCLUDE_RE = re.compile(
+ r'^\s*#\s*include\s*"([/a-z_0-9.]+\.generated\.h)"(\s+//.*)?$')
+
+
+def main(argv):
+ argparser = ArgumentParser()
+ argparser.add_argument('--generated-includes-dir', action='append',
+ help='Directory where generated includes are located.')
+ argparser.add_argument('--file', type=open, help='File to check.')
+ argparser.add_argument('iwyu_args', nargs='*',
+ help='IWYU arguments, must go after --.')
+ args = argparser.parse_args(argv)
+
+ with args.file:
+ include_dirs = []
+
+ iwyu = Popen(['include-what-you-use', '-xc'] + args.iwyu_args + ['/dev/stdin'],
+ stdin=PIPE, stdout=PIPE, stderr=PIPE)
+
+ for line in args.file:
+ match = GENERATED_INCLUDE_RE.match(line)
+ if match:
+ for d in args.generated_includes_dir:
+ try:
+ f = open(os.path.join(d, match.group(1)))
+ except IOError:
+ continue
+ else:
+ with f:
+ for generated_line in f:
+ iwyu.stdin.write(generated_line)
+ break
+ else:
+ raise IOError('Failed to find {0}'.format(match.group(1)))
+ else:
+ iwyu.stdin.write(line)
+
+ iwyu.stdin.close()
+
+ out = iwyu.stdout.read()
+ err = iwyu.stderr.read()
+
+ ret = iwyu.wait()
+
+ if ret != 2:
+ print('IWYU failed with exit code {0}:'.format(ret))
+ print('{0} stdout {0}'.format('=' * ((80 - len(' stdout ')) // 2)))
+ print(out)
+ print('{0} stderr {0}'.format('=' * ((80 - len(' stderr ')) // 2)))
+ print(err)
+ return 1
+ return 0
+
+
+if __name__ == '__main__':
+ raise SystemExit(main(sys.argv[1:]))
diff --git a/scripts/check_urls.vim b/scripts/check_urls.vim
new file mode 100644
index 0000000000..3580b79475
--- /dev/null
+++ b/scripts/check_urls.vim
@@ -0,0 +1,68 @@
+" Test for URLs in help documents.
+"
+" Opens a new window with all found URLS followed by return code from curl
+" (anything other than 0 means unreachable)
+"
+" Written by Christian Brabandt.
+
+func Test_check_URLs()
+ if has("win32")
+ echoerr "Doesn't work on MS-Windows"
+ return
+ endif
+ if executable('curl')
+ " Note: does not follow redirects!
+ let s:command = 'curl --silent --fail --output /dev/null --head '
+ elseif executable('wget')
+ " Note: only allow a couple of redirects
+ let s:command = 'wget --quiet -S --spider --max-redirect=2 --timeout=5 --tries=2 -O /dev/null '
+ else
+ echoerr 'Only works when "curl" or "wget" is available'
+ return
+ endif
+
+ let pat='\(https\?\|ftp\)://[^\t* ]\+'
+ exe 'helpgrep' pat
+ helpclose
+
+ let urls = map(getqflist(), 'v:val.text')
+ " do not use submatch(1)!
+ let urls = map(urls, {key, val -> matchstr(val, pat)})
+ " remove examples like user@host (invalid urls)
+ let urls = filter(urls, 'v:val !~ "@"')
+ " Remove example URLs which are invalid
+ let urls = filter(urls, {key, val -> val !~ '\<\(\(my\|some\)\?host\|machine\|hostname\|file\)\>'})
+ new
+ put =urls
+ " remove some more invalid items
+ " empty lines
+ v/./d
+ " remove # anchors
+ %s/#.*$//e
+ " remove trailing stuff (parenthesis, dot, comma, quotes), but only for HTTP
+ " links
+ g/^h/s#[.,)'"/>][:.]\?$##
+ g#^[hf]t\?tp:/\(/\?\.*\)$#d
+ silent! g/ftp://,$/d
+ silent! g/=$/d
+ let a = getline(1,'$')
+ let a = uniq(sort(a))
+ %d
+ call setline(1, a)
+
+ " Do the testing.
+ set nomore
+ %s/.*/\=TestURL(submatch(0))/
+
+ " highlight the failures
+ /.* \([0-9]*[1-9]\|[0-9]\{2,}\)$
+endfunc
+
+func TestURL(url)
+ " Relies on the return code to determine whether a page is valid
+ echom printf("Testing URL: %d/%d %s", line('.'), line('$'), a:url)
+ call system(s:command . shellescape(a:url))
+ return printf("%s %d", a:url, v:shell_error)
+endfunc
+
+call Test_check_URLs()
diff --git a/scripts/download-unicode-files.sh b/scripts/download-unicode-files.sh
index cb15270cf8..5f38d0589a 100755
--- a/scripts/download-unicode-files.sh
+++ b/scripts/download-unicode-files.sh
@@ -1,11 +1,11 @@
#!/bin/sh
set -e
-
-files="UnicodeData.txt CaseFolding.txt EastAsianWidth.txt"
+data_files="UnicodeData.txt CaseFolding.txt EastAsianWidth.txt"
+emoji_files="emoji-data.txt"
UNIDIR_DEFAULT=unicode
-DOWNLOAD_URL_BASE_DEFAULT='http://unicode.org/Public/UNIDATA'
+DOWNLOAD_URL_BASE_DEFAULT='http://unicode.org/Public'
if test x$1 = 'x--help' ; then
echo 'Usage:'
@@ -21,8 +21,16 @@ fi
UNIDIR=${1:-$UNIDIR_DEFAULT}
DOWNLOAD_URL_BASE=${2:-$DOWNLOAD_URL_BASE_DEFAULT}
-for filename in $files ; do
- curl -o "$UNIDIR/$filename" "$DOWNLOAD_URL_BASE/$filename"
+for filename in $data_files ; do
+ curl -L -o "$UNIDIR/$filename" "$DOWNLOAD_URL_BASE/UNIDATA/$filename"
+ (
+ cd "$UNIDIR"
+ git add $filename
+ )
+done
+
+for filename in $emoji_files ; do
+ curl -L -o "$UNIDIR/$filename" "$DOWNLOAD_URL_BASE/emoji/latest/$filename"
(
cd "$UNIDIR"
git add $filename
diff --git a/scripts/gen_api_vimdoc.py b/scripts/gen_api_vimdoc.py
new file mode 100755
index 0000000000..4e86f15b37
--- /dev/null
+++ b/scripts/gen_api_vimdoc.py
@@ -0,0 +1,560 @@
+#!/usr/bin/env python3
+"""Parses Doxygen XML output to generate Neovim's API documentation.
+
+This would be easier using lxml and XSLT, but:
+
+ 1. This should avoid needing Python dependencies, especially ones that are
+ C modules that have library dependencies (lxml requires libxml and
+ libxslt).
+ 2. I wouldn't know how to deal with nested indentation in <para> tags using
+ XSLT.
+
+Each function documentation is formatted with the following rules:
+
+ - Maximum width of 78 characters (`text_width`).
+ - Spaces for indentation.
+ - Function signature and helptag are on the same line.
+ - Helptag is right aligned.
+ - Signature and helptag must have a minimum of 8 spaces between them.
+ - If the signature is too long, it is placed on the line after the
+ helptag. The signature wraps at `text_width - 8` characters with
+ subsequent lines indented to the open parenthesis.
+ - Documentation body will be indented by 16 spaces.
+ - Subsection bodies are indented an additional 4 spaces.
+ - Documentation body consists of the function description, parameter details,
+ return description, and C declaration.
+ - Parameters are omitted for the `void` and `Error *` types, or if the
+ parameter is marked as [out].
+ - Each function documentation is separated by a single line.
+
+The C declaration is added to the end to show actual argument types.
+"""
+import os
+import re
+import sys
+import shutil
+import textwrap
+import subprocess
+
+from xml.dom import minidom
+
+if sys.version_info[0] < 3:
+ print("use Python 3")
+ sys.exit(1)
+
+doc_filename = 'api.txt'
+# String used to find the start of the generated part of the doc.
+section_start_token = '*api-global*'
+# Required prefix for API function names.
+api_func_name_prefix = 'nvim_'
+
+# Section name overrides.
+section_name = {
+ 'vim.c': 'Global',
+}
+
+# Section ordering.
+section_order = (
+ 'vim.c',
+ 'buffer.c',
+ 'window.c',
+ 'tabpage.c',
+ 'ui.c',
+)
+
+param_exclude = (
+ 'channel_id',
+)
+
+# Annotations are displayed as line items after API function descriptions.
+annotation_map = {
+ 'FUNC_API_ASYNC': '{async}',
+}
+
+text_width = 78
+script_path = os.path.abspath(__file__)
+base_dir = os.path.dirname(os.path.dirname(script_path))
+src_dir = os.path.join(base_dir, 'src/nvim/api')
+out_dir = os.path.join(base_dir, 'tmp-api-doc')
+filter_cmd = '%s %s' % (sys.executable, script_path)
+seen_funcs = set()
+
+# Tracks `xrefsect` titles. As of this writing, used only for separating
+# deprecated functions.
+xrefs = set()
+
+
+# XML Parsing Utilities {{{
+def find_first(parent, name):
+ """Finds the first matching node within parent."""
+ sub = parent.getElementsByTagName(name)
+ if not sub:
+ return None
+ return sub[0]
+
+
+def get_children(parent, name):
+ """Yield matching child nodes within parent."""
+ for child in parent.childNodes:
+ if child.nodeType == child.ELEMENT_NODE and child.nodeName == name:
+ yield child
+
+
+def get_child(parent, name):
+ """Get the first matching child node."""
+ for child in get_children(parent, name):
+ return child
+ return None
+
+
+def clean_text(text):
+ """Cleans text.
+
+ Only cleans superfluous whitespace at the moment.
+ """
+ return ' '.join(text.split()).strip()
+
+
+def clean_lines(text):
+ """Removes superfluous lines.
+
+ The beginning and end of the string is trimmed. Empty lines are collapsed.
+ """
+ return re.sub(r'\A\n\s*\n*|\n\s*\n*\Z', '', re.sub(r'(\n\s*\n+)+', '\n\n', text))
+
+
+def get_text(parent):
+ """Combine all text in a node."""
+ if parent.nodeType == parent.TEXT_NODE:
+ return parent.data
+
+ out = ''
+ for node in parent.childNodes:
+ if node.nodeType == node.TEXT_NODE:
+ out += clean_text(node.data)
+ elif node.nodeType == node.ELEMENT_NODE:
+ out += ' ' + get_text(node)
+ return out
+
+
+def doc_wrap(text, prefix='', width=70, func=False):
+ """Wraps text to `width`.
+
+ The first line is prefixed with `prefix`, and subsequent lines are aligned.
+ If `func` is True, only wrap at commas.
+ """
+ if not width:
+ return text
+
+ indent_space = ' ' * len(prefix)
+
+ if func:
+ lines = [prefix]
+ for part in text.split(', '):
+ if part[-1] not in ');':
+ part += ', '
+ if len(lines[-1]) + len(part) > width:
+ lines.append(indent_space)
+ lines[-1] += part
+ return '\n'.join(x.rstrip() for x in lines).rstrip()
+
+ return '\n'.join(textwrap.wrap(text.strip(), width=width,
+ initial_indent=prefix,
+ subsequent_indent=indent_space))
+
+
+def parse_params(parent, width=62):
+ """Parse Doxygen `parameterlist`."""
+ name_length = 0
+ items = []
+ for child in parent.childNodes:
+ if child.nodeType == child.TEXT_NODE:
+ continue
+
+ name_node = find_first(child, 'parametername')
+ if name_node.getAttribute('direction') == 'out':
+ continue
+
+ name = get_text(name_node)
+ if name in param_exclude:
+ continue
+
+ name = '{%s}' % name
+ name_length = max(name_length, len(name) + 2)
+
+ desc = ''
+ desc_node = get_child(child, 'parameterdescription')
+ if desc_node:
+ desc = parse_parblock(desc_node, width=None)
+ items.append((name.strip(), desc.strip()))
+
+ out = 'Parameters: ~\n'
+ for name, desc in items:
+ name = ' %s' % name.ljust(name_length)
+ out += doc_wrap(desc, prefix=name, width=width) + '\n'
+ return out.strip()
+
+
+def parse_para(parent, width=62):
+ """Parse doxygen `para` tag.
+
+ I assume <para> is a paragraph block or "a block of text". It can contain
+ text nodes, or other tags.
+ """
+ line = ''
+ lines = []
+ for child in parent.childNodes:
+ if child.nodeType == child.TEXT_NODE:
+ line += child.data
+ elif child.nodeName == 'computeroutput':
+ line += '`%s`' % get_text(child)
+ else:
+ if line:
+ lines.append(doc_wrap(line, width=width))
+ line = ''
+
+ if child.nodeName == 'parameterlist':
+ lines.append(parse_params(child, width=width))
+ elif child.nodeName == 'xrefsect':
+ title = get_text(get_child(child, 'xreftitle'))
+ xrefs.add(title)
+ xrefdesc = parse_para(get_child(child, 'xrefdescription'))
+ lines.append(doc_wrap(xrefdesc, prefix='%s: ' % title,
+ width=width) + '\n')
+ elif child.nodeName == 'simplesect':
+ kind = child.getAttribute('kind')
+ if kind == 'note':
+ lines.append('Note:')
+ lines.append(doc_wrap(parse_para(child),
+ prefix=' ',
+ width=width))
+ elif kind == 'return':
+ lines.append('%s: ~' % kind.title())
+ lines.append(doc_wrap(parse_para(child),
+ prefix=' ',
+ width=width))
+ else:
+ lines.append(get_text(child))
+
+ if line:
+ lines.append(doc_wrap(line, width=width))
+ return clean_lines('\n'.join(lines).strip())
+
+
+def parse_parblock(parent, width=62):
+ """Parses a nested block of `para` tags.
+
+ Named after the \parblock command, but not directly related.
+ """
+ paragraphs = []
+ for child in parent.childNodes:
+ if child.nodeType == child.TEXT_NODE:
+ paragraphs.append(doc_wrap(child.data, width=width))
+ elif child.nodeName == 'para':
+ paragraphs.append(parse_para(child, width=width))
+ else:
+ paragraphs.append(doc_wrap(get_text(child), width=width))
+ paragraphs.append('')
+ return clean_lines('\n'.join(paragraphs).strip())
+# }}}
+
+
+def parse_source_xml(filename):
+ """Collects API functions.
+
+ Returns two strings:
+ 1. API functions
+ 2. Deprecated API functions
+
+ Caller decides what to do with the deprecated documentation.
+ """
+ global xrefs
+ xrefs = set()
+ functions = []
+ deprecated_functions = []
+
+ dom = minidom.parse(filename)
+ for member in dom.getElementsByTagName('memberdef'):
+ if member.getAttribute('static') == 'yes' or \
+ member.getAttribute('kind') != 'function':
+ continue
+
+ loc = find_first(member, 'location')
+ if 'private' in loc.getAttribute('file'):
+ continue
+
+ return_type = get_text(get_child(member, 'type'))
+ if return_type == '':
+ continue
+
+ if return_type.startswith(('ArrayOf', 'DictionaryOf')):
+ parts = return_type.strip('_').split('_')
+ return_type = '%s(%s)' % (parts[0], ', '.join(parts[1:]))
+
+ name = get_text(get_child(member, 'name'))
+
+ annotations = get_text(get_child(member, 'argsstring'))
+ if annotations and ')' in annotations:
+ annotations = annotations.rsplit(')', 1)[-1].strip()
+ # XXX: (doxygen 1.8.11) 'argsstring' only includes attributes of
+ # non-void functions. Special-case void functions here.
+ if name == 'nvim_get_mode' and len(annotations) == 0:
+ annotations += 'FUNC_API_ASYNC'
+ annotations = filter(None, map(lambda x: annotation_map.get(x),
+ annotations.split()))
+
+ vimtag = '*%s()*' % name
+ args = []
+ type_length = 0
+
+ for param in get_children(member, 'param'):
+ arg_type = get_text(get_child(param, 'type')).strip()
+ arg_name = ''
+ declname = get_child(param, 'declname')
+ if declname:
+ arg_name = get_text(declname).strip()
+
+ if arg_name in param_exclude:
+ continue
+
+ if arg_type.endswith('*'):
+ arg_type = arg_type.strip('* ')
+ arg_name = '*' + arg_name
+ type_length = max(type_length, len(arg_type))
+ args.append((arg_type, arg_name))
+
+ c_args = []
+ for arg_type, arg_name in args:
+ c_args.append(' ' + (
+ '%s %s' % (arg_type.ljust(type_length), arg_name)).strip())
+
+ c_decl = textwrap.indent('%s %s(\n%s\n);' % (return_type, name,
+ ',\n'.join(c_args)),
+ ' ')
+
+ prefix = '%s(' % name
+ suffix = '%s)' % ', '.join('{%s}' % a[1] for a in args
+ if a[0] not in ('void', 'Error'))
+
+ # Minimum 8 chars between signature and vimtag
+ lhs = (text_width - 8) - len(prefix)
+
+ if len(prefix) + len(suffix) > lhs:
+ signature = vimtag.rjust(text_width) + '\n'
+ signature += doc_wrap(suffix, width=text_width-8, prefix=prefix,
+ func=True)
+ else:
+ signature = prefix + suffix
+ signature += vimtag.rjust(text_width - len(signature))
+
+ doc = ''
+ desc = find_first(member, 'detaileddescription')
+ if desc:
+ doc = parse_parblock(desc)
+ if 'DEBUG' in os.environ:
+ print(textwrap.indent(
+ re.sub(r'\n\s*\n+', '\n',
+ desc.toprettyxml(indent=' ', newl='\n')), ' ' * 16))
+
+ if not doc:
+ doc = 'TODO: Documentation'
+
+ annotations = '\n'.join(annotations)
+ if annotations:
+ annotations = ('\n\nAttributes: ~\n' +
+ textwrap.indent(annotations, ' '))
+ i = doc.rfind('Parameters: ~')
+ if i == -1:
+ doc += annotations
+ else:
+ doc = doc[:i] + annotations + '\n\n' + doc[i:]
+
+ if 'INCLUDE_C_DECL' in os.environ:
+ doc += '\n\nC Declaration: ~\n>\n'
+ doc += c_decl
+ doc += '\n<'
+
+ func_doc = signature + '\n'
+ func_doc += textwrap.indent(clean_lines(doc), ' ' * 16)
+ func_doc = re.sub(r'^\s+([<>])$', r'\1', func_doc, flags=re.M)
+
+ if 'Deprecated' in xrefs:
+ deprecated_functions.append(func_doc)
+ elif name.startswith(api_func_name_prefix):
+ functions.append(func_doc)
+
+ xrefs.clear()
+
+ return '\n\n'.join(functions), '\n\n'.join(deprecated_functions)
+
+
+def delete_lines_below(filename, tokenstr):
+ """Deletes all lines below the line containing `tokenstr`, the line itself,
+ and one line above it.
+ """
+ lines = open(filename).readlines()
+ i = 0
+ for i, line in enumerate(lines, 1):
+ if tokenstr in line:
+ break
+ i = max(0, i - 2)
+ with open(filename, 'wt') as fp:
+ fp.writelines(lines[0:i])
+
+def gen_docs(config):
+ """Generate documentation.
+
+ Doxygen is called and configured through stdin.
+ """
+ p = subprocess.Popen(['doxygen', '-'], stdin=subprocess.PIPE)
+ p.communicate(config.format(input=src_dir, output=out_dir,
+ filter=filter_cmd).encode('utf8'))
+ if p.returncode:
+ sys.exit(p.returncode)
+
+ sections = {}
+ intros = {}
+ sep = '=' * text_width
+
+ base = os.path.join(out_dir, 'xml')
+ dom = minidom.parse(os.path.join(base, 'index.xml'))
+
+ # generate docs for section intros
+ for compound in dom.getElementsByTagName('compound'):
+ if compound.getAttribute('kind') != 'group':
+ continue
+
+ groupname = get_text(find_first(compound, 'name'))
+ groupxml = os.path.join(base, '%s.xml' % compound.getAttribute('refid'))
+
+ desc = find_first(minidom.parse(groupxml), 'detaileddescription')
+ if desc:
+ doc = parse_parblock(desc)
+ if doc:
+ intros[groupname] = doc
+
+ for compound in dom.getElementsByTagName('compound'):
+ if compound.getAttribute('kind') != 'file':
+ continue
+
+ filename = get_text(find_first(compound, 'name'))
+ if filename.endswith('.c'):
+ functions, deprecated = parse_source_xml(
+ os.path.join(base, '%s.xml' % compound.getAttribute('refid')))
+
+ if not functions and not deprecated:
+ continue
+
+ if functions or deprecated:
+ name = os.path.splitext(os.path.basename(filename))[0]
+ if name == 'ui':
+ name = name.upper()
+ else:
+ name = name.title()
+
+ doc = ''
+
+ intro = intros.get('api-%s' % name.lower())
+ if intro:
+ doc += '\n\n' + intro
+
+ if functions:
+ doc += '\n\n' + functions
+
+ if 'INCLUDE_DEPRECATED' in os.environ and deprecated:
+ doc += '\n\n\nDeprecated %s Functions: ~\n\n' % name
+ doc += deprecated
+
+ if doc:
+ filename = os.path.basename(filename)
+ name = section_name.get(filename, name)
+ title = '%s Functions' % name
+ helptag = '*api-%s*' % name.lower()
+ sections[filename] = (title, helptag, doc)
+
+ if not sections:
+ return
+
+ docs = ''
+
+ i = 0
+ for filename in section_order:
+ if filename not in sections:
+ continue
+ title, helptag, section_doc = sections.pop(filename)
+
+ i += 1
+ docs += sep
+ docs += '\n%s%s' % (title, helptag.rjust(text_width - len(title)))
+ docs += section_doc
+ docs += '\n\n\n'
+
+ if sections:
+ # In case new API sources are added without updating the order dict.
+ for title, helptag, section_doc in sections.values():
+ i += 1
+ docs += sep
+ docs += '\n%s%s' % (title, helptag.rjust(text_width - len(title)))
+ docs += section_doc
+ docs += '\n\n\n'
+
+ docs = docs.rstrip() + '\n\n'
+ docs += ' vim:tw=78:ts=8:ft=help:norl:\n'
+
+ doc_file = os.path.join(base_dir, 'runtime/doc', doc_filename)
+ delete_lines_below(doc_file, section_start_token)
+ with open(doc_file, 'ab') as fp:
+ fp.write(docs.encode('utf8'))
+ shutil.rmtree(out_dir)
+
+
+def filter_source(filename):
+ """Filters the source to fix macros that confuse Doxygen."""
+ with open(filename, 'rt') as fp:
+ print(re.sub(r'^(ArrayOf|DictionaryOf)(\(.*?\))',
+ lambda m: m.group(1)+'_'.join(
+ re.split(r'[^\w]+', m.group(2))),
+ fp.read(), flags=re.M))
+
+
+# Doxygen Config {{{
+Doxyfile = '''
+OUTPUT_DIRECTORY = {output}
+INPUT = {input}
+INPUT_ENCODING = UTF-8
+FILE_PATTERNS = *.h *.c
+RECURSIVE = YES
+INPUT_FILTER = "{filter}"
+EXCLUDE =
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS = */private/*
+EXCLUDE_SYMBOLS =
+
+GENERATE_HTML = NO
+GENERATE_DOCSET = NO
+GENERATE_HTMLHELP = NO
+GENERATE_QHP = NO
+GENERATE_TREEVIEW = NO
+GENERATE_LATEX = NO
+GENERATE_RTF = NO
+GENERATE_MAN = NO
+GENERATE_DOCBOOK = NO
+GENERATE_AUTOGEN_DEF = NO
+
+GENERATE_XML = YES
+XML_OUTPUT = xml
+XML_PROGRAMLISTING = NO
+
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = YES
+EXPAND_ONLY_PREDEF = NO
+'''
+# }}}
+
+if __name__ == "__main__":
+ if len(sys.argv) > 1:
+ filter_source(sys.argv[1])
+ else:
+ gen_docs(Doxyfile)
+
+# vim: set ft=python ts=4 sw=4 tw=79 et fdm=marker :
diff --git a/scripts/gen_help_html.py b/scripts/gen_help_html.py
new file mode 100644
index 0000000000..6cca81d250
--- /dev/null
+++ b/scripts/gen_help_html.py
@@ -0,0 +1,355 @@
+# Converts Vim/Nvim documentation to HTML.
+#
+# Adapted from https://github.com/c4rlo/vimhelp/
+# License: MIT
+#
+# Copyright (c) 2016 Carlo Teubner
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+import re, urllib.parse
+from itertools import chain
+
+HEAD = """\
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-type" content="text/html; charset={encoding}"/>
+<title>Nvim: {filename}</title>
+"""
+
+HEAD_END = '</head>\n<body>\n'
+
+INTRO = """
+<h1>Nvim help files</h1>
+<p>HTML export of the <a href="https://neovim.io/">Nvim</a> help pages{vers-note}.
+Updated <a href="https://github.com/neovim/bot-ci" class="d">automatically</a> from the <a
+href="https://github.com/vim/vim/tree/master/runtime/doc" class="d">Nvim source repository</a>.
+Also includes the <a href="vim_faq.txt.html">Vim FAQ</a>, pulled from its
+<a href="https://github.com/chrisbra/vim_faq" class="d">source repository</a>.</p>
+"""
+
+VERSION_NOTE = ", current as of Vim {version}"
+
+SITENAVI_LINKS = """
+Quick links:
+<a href="/">help overview</a> &middot;
+<a href="quickref.txt.html">quick reference</a> &middot;
+<a href="usr_toc.txt.html">user manual toc</a> &middot;
+<a href="{helptxt}#reference_toc">reference manual toc</a> &middot;
+<a href="vim_faq.txt.html">faq</a>
+"""
+
+SITENAVI_LINKS_PLAIN = SITENAVI_LINKS.format(helptxt='help.txt.html')
+SITENAVI_LINKS_WEB = SITENAVI_LINKS.format(helptxt='/')
+
+SITENAVI_PLAIN = '<p>' + SITENAVI_LINKS_PLAIN + '</p>'
+SITENAVI_WEB = '<p>' + SITENAVI_LINKS_WEB + '</p>'
+
+SITENAVI_SEARCH = '<table width="100%"><tbody><tr><td>' + SITENAVI_LINKS_WEB + \
+'</td><td style="text-align: right; max-width: 25vw"><div class="gcse-searchbox">' \
+'</div></td></tr></tbody></table><div class="gcse-searchresults"></div>'
+
+TEXTSTART = """
+<div id="d1">
+<pre id="sp"> </pre>
+<div id="d2">
+<pre>
+"""
+
+FOOTER = '</pre>'
+
+FOOTER2 = """
+<p id="footer">This site is maintained by Carlo Teubner (<i>(my first name) dot (my last name) at gmail dot com</i>).</p>
+</div>
+</div>
+</body>
+</html>
+"""
+
+VIM_FAQ_LINE = '<a href="vim_faq.txt.html#vim_faq.txt" class="l">' \
+ 'vim_faq.txt</a> Frequently Asked Questions\n'
+
+RE_TAGLINE = re.compile(r'(\S+)\s+(\S+)')
+
+PAT_WORDCHAR = '[!#-)+-{}~\xC0-\xFF]'
+
+PAT_HEADER = r'(^.*~$)'
+PAT_GRAPHIC = r'(^.* `$)'
+PAT_PIPEWORD = r'(?<!\\)\|([#-)!+-~]+)\|'
+PAT_STARWORD = r'\*([#-)!+-~]+)\*(?:(?=\s)|$)'
+PAT_COMMAND = r'`([^` ]+)`'
+PAT_OPTWORD = r"('(?:[a-z]{2,}|t_..)')"
+PAT_CTRL = r'(CTRL-(?:W_)?(?:\{char\}|<[A-Za-z]+?>|.)?)'
+PAT_SPECIAL = r'(<.+?>|\{.+?}|' \
+ r'\[(?:range|line|count|offset|\+?cmd|[-+]?num|\+\+opt|' \
+ r'arg|arguments|ident|addr|group)]|' \
+ r'(?<=\s)\[[-a-z^A-Z0-9_]{2,}])'
+PAT_TITLE = r'(Vim version [0-9.a-z]+|VIM REFERENCE.*)'
+PAT_NOTE = r'((?<!' + PAT_WORDCHAR + r')(?:note|NOTE|Notes?):?' \
+ r'(?!' + PAT_WORDCHAR + r'))'
+PAT_URL = r'((?:https?|ftp)://[^\'"<> \t]+[a-zA-Z0-9/])'
+PAT_WORD = r'((?<!' + PAT_WORDCHAR + r')' + PAT_WORDCHAR + r'+' \
+ r'(?!' + PAT_WORDCHAR + r'))'
+
+RE_LINKWORD = re.compile(
+ PAT_OPTWORD + '|' +
+ PAT_CTRL + '|' +
+ PAT_SPECIAL)
+RE_TAGWORD = re.compile(
+ PAT_HEADER + '|' +
+ PAT_GRAPHIC + '|' +
+ PAT_PIPEWORD + '|' +
+ PAT_STARWORD + '|' +
+ PAT_COMMAND + '|' +
+ PAT_OPTWORD + '|' +
+ PAT_CTRL + '|' +
+ PAT_SPECIAL + '|' +
+ PAT_TITLE + '|' +
+ PAT_NOTE + '|' +
+ PAT_URL + '|' +
+ PAT_WORD)
+RE_NEWLINE = re.compile(r'[\r\n]')
+RE_HRULE = re.compile(r'[-=]{3,}.*[-=]{3,3}$')
+RE_EG_START = re.compile(r'(?:.* )?>$')
+RE_EG_END = re.compile(r'\S')
+RE_SECTION = re.compile(r'[-A-Z .][-A-Z0-9 .()]*(?=\s+\*)')
+RE_STARTAG = re.compile(r'\s\*([^ \t|]+)\*(?:\s|$)')
+RE_LOCAL_ADD = re.compile(r'LOCAL ADDITIONS:\s+\*local-additions\*$')
+
+class Link(object):
+ __slots__ = 'link_plain_same', 'link_pipe_same', \
+ 'link_plain_foreign', 'link_pipe_foreign', \
+ 'filename'
+
+ def __init__(self, link_plain_same, link_plain_foreign,
+ link_pipe_same, link_pipe_foreign, filename):
+ self.link_plain_same = link_plain_same
+ self.link_plain_foreign = link_plain_foreign
+ self.link_pipe_same = link_pipe_same
+ self.link_pipe_foreign = link_pipe_foreign
+ self.filename = filename
+
+class VimH2H(object):
+ def __init__(self, tags, version=None, is_web_version=True):
+ self._urls = { }
+ self._version = version
+ self._is_web_version = is_web_version
+ for line in RE_NEWLINE.split(tags):
+ m = RE_TAGLINE.match(line)
+ if m:
+ tag, filename = m.group(1, 2)
+ self.do_add_tag(filename, tag)
+
+ def add_tags(self, filename, contents):
+ for match in RE_STARTAG.finditer(contents):
+ tag = match.group(1).replace('\\', '\\\\').replace('/', '\\/')
+ self.do_add_tag(str(filename), tag)
+
+ def do_add_tag(self, filename, tag):
+ tag_quoted = urllib.parse.quote_plus(tag)
+ def mkpart1(doc):
+ return '<a href="' + doc + '#' + tag_quoted + '" class="'
+ part1_same = mkpart1('')
+ if self._is_web_version and filename == 'help.txt':
+ doc = '/'
+ else:
+ doc = filename + '.html'
+ part1_foreign = mkpart1(doc)
+ part2 = '">' + html_escape[tag] + '</a>'
+ def mklinks(cssclass):
+ return (part1_same + cssclass + part2,
+ part1_foreign + cssclass + part2)
+ cssclass_plain = 'd'
+ m = RE_LINKWORD.match(tag)
+ if m:
+ opt, ctrl, special = m.groups()
+ if opt is not None: cssclass_plain = 'o'
+ elif ctrl is not None: cssclass_plain = 'k'
+ elif special is not None: cssclass_plain = 's'
+ links_plain = mklinks(cssclass_plain)
+ links_pipe = mklinks('l')
+ self._urls[tag] = Link(
+ links_plain[0], links_plain[1],
+ links_pipe[0], links_pipe[1],
+ filename)
+
+ def maplink(self, tag, curr_filename, css_class=None):
+ links = self._urls.get(tag)
+ if links is not None:
+ if links.filename == curr_filename:
+ if css_class == 'l': return links.link_pipe_same
+ else: return links.link_plain_same
+ else:
+ if css_class == 'l': return links.link_pipe_foreign
+ else: return links.link_plain_foreign
+ elif css_class is not None:
+ return '<span class="' + css_class + '">' + html_escape[tag] + \
+ '</span>'
+ else: return html_escape[tag]
+
+ def to_html(self, filename, contents, encoding):
+ out = [ ]
+
+ inexample = 0
+ filename = str(filename)
+ is_help_txt = (filename == 'help.txt')
+ faq_line = False
+ for line in RE_NEWLINE.split(contents):
+ line = line.rstrip('\r\n')
+ line_tabs = line
+ line = line.expandtabs()
+ if RE_HRULE.match(line):
+ out.extend(('<span class="h">', line, '</span>\n'))
+ continue
+ if inexample == 2:
+ if RE_EG_END.match(line):
+ inexample = 0
+ if line[0] == '<': line = line[1:]
+ else:
+ out.extend(('<span class="e">', html_escape[line],
+ '</span>\n'))
+ continue
+ if RE_EG_START.match(line_tabs):
+ inexample = 1
+ line = line[0:-1]
+ if RE_SECTION.match(line_tabs):
+ m = RE_SECTION.match(line)
+ out.extend((r'<span class="c">', m.group(0), r'</span>'))
+ line = line[m.end():]
+ if is_help_txt and RE_LOCAL_ADD.match(line_tabs):
+ faq_line = True
+ lastpos = 0
+ for match in RE_TAGWORD.finditer(line):
+ pos = match.start()
+ if pos > lastpos:
+ out.append(html_escape[line[lastpos:pos]])
+ lastpos = match.end()
+ header, graphic, pipeword, starword, command, opt, ctrl, \
+ special, title, note, url, word = match.groups()
+ if pipeword is not None:
+ out.append(self.maplink(pipeword, filename, 'l'))
+ elif starword is not None:
+ out.extend(('<a name="', urllib.parse.quote_plus(starword),
+ '" class="t">', html_escape[starword], '</a>'))
+ elif command is not None:
+ out.extend(('<span class="e">', html_escape[command],
+ '</span>'))
+ elif opt is not None:
+ out.append(self.maplink(opt, filename, 'o'))
+ elif ctrl is not None:
+ out.append(self.maplink(ctrl, filename, 'k'))
+ elif special is not None:
+ out.append(self.maplink(special, filename, 's'))
+ elif title is not None:
+ out.extend(('<span class="i">', html_escape[title],
+ '</span>'))
+ elif note is not None:
+ out.extend(('<span class="n">', html_escape[note],
+ '</span>'))
+ elif header is not None:
+ out.extend(('<span class="h">', html_escape[header[:-1]],
+ '</span>'))
+ elif graphic is not None:
+ out.append(html_escape[graphic[:-2]])
+ elif url is not None:
+ out.extend(('<a class="u" href="', url, '">' +
+ html_escape[url], '</a>'))
+ elif word is not None:
+ out.append(self.maplink(word, filename))
+ if lastpos < len(line):
+ out.append(html_escape[line[lastpos:]])
+ out.append('\n')
+ if inexample == 1: inexample = 2
+ if faq_line:
+ out.append(VIM_FAQ_LINE)
+ faq_line = False
+
+ header = []
+ header.append(HEAD.format(encoding=encoding, filename=filename))
+ header.append(HEAD_END)
+ if self._is_web_version and is_help_txt:
+ vers_note = VERSION_NOTE.replace('{version}', self._version) \
+ if self._version else ''
+ header.append(INTRO.replace('{vers-note}', vers_note))
+ if self._is_web_version:
+ header.append(SITENAVI_SEARCH)
+ sitenavi_footer = SITENAVI_WEB
+ else:
+ header.append(SITENAVI_PLAIN)
+ sitenavi_footer = SITENAVI_PLAIN
+ header.append(TEXTSTART)
+ return ''.join(chain(header, out, (FOOTER, sitenavi_footer, FOOTER2)))
+
+class HtmlEscCache(dict):
+ def __missing__(self, key):
+ r = key.replace('&', '&amp;') \
+ .replace('<', '&lt;') \
+ .replace('>', '&gt;')
+ self[key] = r
+ return r
+
+html_escape = HtmlEscCache()
+
+
+
+import sys, os, os.path
+#import cProfile
+sys.path.append('.')
+
+def slurp(filename):
+ try:
+ with open(filename, encoding='UTF-8') as f:
+ return f.read(), 'UTF-8'
+ except UnicodeError:
+ # 'ISO-8859-1' ?
+ with open(filename, encoding='latin-1') as f:
+ return f.read(), 'latin-1'
+
+def usage():
+ return "usage: " + sys.argv[0] + " IN_DIR OUT_DIR [BASENAMES...]"
+
+def main():
+ if len(sys.argv) < 3: sys.exit(usage())
+
+ in_dir = sys.argv[1]
+ out_dir = sys.argv[2]
+ basenames = sys.argv[3:]
+
+ print( "Processing tags...")
+ h2h = VimH2H(slurp(os.path.join(in_dir, 'tags'))[0], is_web_version=False)
+
+ if len(basenames) == 0:
+ basenames = os.listdir(in_dir)
+
+ for basename in basenames:
+ if os.path.splitext(basename)[1] != '.txt' and basename != 'tags':
+ print( "Ignoring " + basename)
+ continue
+ print( "Processing " + basename + "...")
+ path = os.path.join(in_dir, basename)
+ text, encoding = slurp(path)
+ outpath = os.path.join(out_dir, basename + '.html')
+ of = open(outpath, 'w')
+ of.write(h2h.to_html(basename, text, encoding))
+ of.close()
+
+main()
+#cProfile.run('main()')
diff --git a/scripts/genappimage.sh b/scripts/genappimage.sh
new file mode 100755
index 0000000000..c0ef2a8591
--- /dev/null
+++ b/scripts/genappimage.sh
@@ -0,0 +1,98 @@
+#!/bin/bash
+
+########################################################################
+# Package the binaries built as an AppImage
+# By Simon Peter 2016
+# For more information, see http://appimage.org/
+########################################################################
+
+# App arch, used by generate_appimage.
+if [ -z "$ARCH" ]; then
+ export ARCH="$(arch)"
+fi
+
+TAG=$1
+
+# App name, used by generate_appimage.
+APP=nvim
+
+ROOT_DIR="$(git rev-parse --show-toplevel)"
+APP_BUILD_DIR="$ROOT_DIR/build"
+APP_DIR="$APP.AppDir"
+
+########################################################################
+# Compile nvim and install it into AppDir
+########################################################################
+
+# Build and install nvim into the AppImage
+make CMAKE_BUILD_TYPE=RelWithDebInfo CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX=${APP_DIR}/usr -DCMAKE_INSTALL_MANDIR=man"
+make install
+
+########################################################################
+# Get helper functions and move to AppDir
+########################################################################
+
+# App version, used by generate_appimage.
+VERSION=$("$ROOT_DIR"/build/bin/nvim --version | head -n 1 | grep -o 'v.*')
+
+cd "$APP_BUILD_DIR"
+
+curl -Lo "$APP_BUILD_DIR"/appimage_functions.sh https://github.com/AppImage/AppImages/raw/master/functions.sh
+. ./appimage_functions.sh
+
+# Copy desktop and icon file to AppDir for AppRun to pick them up.
+# get_apprun
+# get_desktop
+cp "$ROOT_DIR/runtime/nvim.desktop" "$APP_DIR/"
+cp "$ROOT_DIR/runtime/nvim.png" "$APP_DIR/"
+mkdir "$APP_DIR/usr/share/metainfo/"
+cp "$ROOT_DIR/runtime/nvim.appdata.xml" "$APP_DIR/usr/share/metainfo/"
+
+cd "$APP_DIR"
+
+# copy dependencies
+copy_deps
+# Move the libraries to usr/bin
+move_lib
+
+# Delete stuff that should not go into the AppImage.
+# Delete dangerous libraries; see
+# https://github.com/AppImage/AppImages/blob/master/excludelist
+delete_blacklisted
+
+########################################################################
+# AppDir complete. Now package it as an AppImage.
+########################################################################
+
+# Appimage set the ARGV0 environment variable. This causes problems in zsh.
+# To prevent this, we use wrapper script to unset ARGV0 as AppRun.
+# See https://github.com/AppImage/AppImageKit/issues/852
+#
+cat << 'EOF' > AppRun
+#!/bin/bash
+
+unset ARGV0
+exec "$(dirname "$(readlink -f "${0}")")/usr/bin/nvim" ${@+"$@"}
+EOF
+chmod 755 AppRun
+
+cd "$APP_BUILD_DIR" # Get out of AppImage directory.
+
+# Generate AppImage.
+# - Expects: $ARCH, $APP, $VERSION env vars
+# - Expects: ./$APP.AppDir/ directory
+# - Produces: ../out/$APP-$VERSION.glibc$GLIBC_NEEDED-$ARCH.AppImage
+if [ -n "$TAG" ]; then
+ generate_type2_appimage -u "gh-releases-zsync|neovim|neovim|$TAG|nvim.appimage.zsync"
+else
+ generate_type2_appimage
+fi
+
+# Moving the final executable to a different folder so it isn't in the
+# way for a subsequent build.
+
+mv "$ROOT_DIR"/out/*.AppImage* "$ROOT_DIR"/build/bin
+# Remove the (now empty) folder the AppImage was built in
+rmdir "$ROOT_DIR"/out
+
+echo 'genappimage.sh: finished'
diff --git a/scripts/genvimvim.lua b/scripts/genvimvim.lua
index 9135c8e3ab..806533f2ff 100644
--- a/scripts/genvimvim.lua
+++ b/scripts/genvimvim.lua
@@ -1,17 +1,20 @@
+mpack = require('mpack')
+
if arg[1] == '--help' then
- print('Usage: genoptions.lua src/nvim runtime/syntax/vim/generated.vim')
+ print('Usage: lua genvimvim.lua src/nvim runtime/syntax/vim/generated.vim')
os.exit(0)
end
local nvimsrcdir = arg[1]
local syntax_file = arg[2]
+local funcs_file = arg[3]
package.path = nvimsrcdir .. '/?.lua;' .. package.path
local lld = {}
local syn_fd = io.open(syntax_file, 'w')
lld.line_length = 0
-local w = function(s)
+local function w(s)
syn_fd:write(s)
if s:find('\n') then
lld.line_length = #(s:gsub('.*\n', ''))
@@ -24,7 +27,7 @@ local options = require('options')
local auevents = require('auevents')
local ex_cmds = require('ex_cmds')
-local cmd_kw = function(prev_cmd, cmd)
+local function cmd_kw(prev_cmd, cmd)
if not prev_cmd then
return cmd:sub(1, 1) .. '[' .. cmd:sub(2) .. ']'
else
@@ -40,6 +43,15 @@ local cmd_kw = function(prev_cmd, cmd)
end
end
+-- Exclude these from the vimCommand keyword list, they are handled specially
+-- in syntax/vim.vim (vimAugroupKey, vimAutoCmd). #9327
+local function is_autocmd_cmd(cmd)
+ return (cmd == 'augroup'
+ or cmd == 'autocmd'
+ or cmd == 'doautocmd'
+ or cmd == 'doautoall')
+end
+
vimcmd_start = 'syn keyword vimCommand contained '
w(vimcmd_start)
local prev_cmd = nil
@@ -48,7 +60,7 @@ for _, cmd_desc in ipairs(ex_cmds) do
w('\n' .. vimcmd_start)
end
local cmd = cmd_desc.command
- if cmd:match('%w') and cmd ~= 'z' then
+ if cmd:match('%w') and cmd ~= 'z' and not is_autocmd_cmd(cmd) then
w(' ' .. cmd_kw(prev_cmd, cmd))
end
prev_cmd = cmd
@@ -82,7 +94,7 @@ local vimau_start = 'syn keyword vimAutoEvent contained '
w('\n\n' .. vimau_start)
for _, au in ipairs(auevents.events) do
- if not auevents.neovim_specific[au] then
+ if not auevents.nvim_specific[au] then
if lld.line_length > 850 then
w('\n' .. vimau_start)
end
@@ -90,7 +102,7 @@ for _, au in ipairs(auevents.events) do
end
end
for au, _ in pairs(auevents.aliases) do
- if not auevents.neovim_specific[au] then
+ if not auevents.nvim_specific[au] then
if lld.line_length > 850 then
w('\n' .. vimau_start)
end
@@ -101,7 +113,7 @@ end
local nvimau_start = 'syn keyword nvimAutoEvent contained '
w('\n\n' .. nvimau_start)
-for au, _ in pairs(auevents.neovim_specific) do
+for au, _ in pairs(auevents.nvim_specific) do
if lld.line_length > 850 then
w('\n' .. nvimau_start)
end
@@ -111,28 +123,16 @@ end
w('\n\nsyn case match')
local vimfun_start = 'syn keyword vimFuncName contained '
w('\n\n' .. vimfun_start)
-eval_fd = io.open(nvimsrcdir .. '/eval.c', 'r')
+funcs = mpack.unpack(io.open(funcs_file):read("*all"))
local started = 0
-for line in eval_fd:lines() do
- if line == '} functions[] =' then
- started = 1
- elseif started == 1 then
- assert (line == '{')
- started = 2
- elseif started == 2 then
- if line == '};' then
- break
- end
- local func_name = line:match('^ {"(%w+)",')
- if func_name then
- if lld.line_length > 850 then
- w('\n' .. vimfun_start)
- end
- w(' ' .. func_name)
+for name, def in pairs(funcs) do
+ if name then
+ if lld.line_length > 850 then
+ w('\n' .. vimfun_start)
end
+ w(' ' .. name)
end
end
-eval_fd:close()
w('\n')
syn_fd:close()
diff --git a/scripts/git-log-pretty-since.sh b/scripts/git-log-pretty-since.sh
index d8e3282fb3..a0aa4354b6 100755
--- a/scripts/git-log-pretty-since.sh
+++ b/scripts/git-log-pretty-since.sh
@@ -1,6 +1,8 @@
#!/usr/bin/env bash
-# Shows a log with changes grouped next to their merge-commit.
+# Prints a nicely-formatted commit history.
+# - Commits are grouped below their merge-commit.
+# - Issue numbers are moved next to the commit-id.
#
# Parameters:
# $1 "since" commit
@@ -19,14 +21,32 @@ is_merge_commit() {
git log $1^2 >/dev/null 2>&1 && return 0 || return 1
}
-for commit in $(git log --format='%H' --first-parent --since $__SINCE); do
+# Removes parens from issue/ticket/PR numbers.
+#
+# Example:
+# in: 3340e08becbf foo (#9423)
+# out: 3340e08becbf foo #9423
+_deparen() {
+ sed 's/(\(\#[0-9]\{3,\}\))/\1/g'
+}
+
+# Cleans up issue/ticket/PR numbers in the commit descriptions.
+#
+# Example:
+# in: 3340e08becbf foo (#9423)
+# out: 3340e08becbf #9423 foo
+_format_ticketnums() {
+ nvim -Es +'g/\v(#[0-9]{3,})/norm! ngEldE0ep' +'%p' | _deparen
+}
+
+for commit in $(git log --format='%H' --first-parent "$__SINCE"..HEAD); do
if is_merge_commit ${commit} ; then
if [ -z "$__INVMATCH" ] || ! git log --oneline ${commit}^1..${commit}^2 \
- | grep -E "$__INVMATCH" >/dev/null 2>&1 ; then
+ | >/dev/null 2>&1 grep -E "$__INVMATCH" ; then
git log -1 --oneline ${commit}
git log --format=' %h %s' ${commit}^1..${commit}^2
fi
else
git log -1 --oneline ${commit}
fi
-done
+done | _format_ticketnums
diff --git a/scripts/msgpack-gen.lua b/scripts/msgpack-gen.lua
deleted file mode 100644
index 2da3c174f9..0000000000
--- a/scripts/msgpack-gen.lua
+++ /dev/null
@@ -1,313 +0,0 @@
-lpeg = require('lpeg')
-mpack = require('mpack')
-
--- lpeg grammar for building api metadata from a set of header files. It
--- ignores comments and preprocessor commands and parses a very small subset
--- of C prototypes with a limited set of types
-P, R, S = lpeg.P, lpeg.R, lpeg.S
-C, Ct, Cc, Cg = lpeg.C, lpeg.Ct, lpeg.Cc, lpeg.Cg
-
-any = P(1) -- (consume one character)
-letter = R('az', 'AZ') + S('_$')
-alpha = letter + R('09')
-nl = P('\r\n') + P('\n')
-not_nl = any - nl
-ws = S(' \t') + nl
-fill = ws ^ 0
-c_comment = P('//') * (not_nl ^ 0)
-c_preproc = P('#') * (not_nl ^ 0)
-typed_container =
- (P('ArrayOf(') + P('DictionaryOf(')) * ((any - P(')')) ^ 1) * P(')')
-c_id = (
- typed_container +
- (letter * (alpha ^ 0))
-)
-c_void = P('void')
-c_param_type = (
- ((P('Error') * fill * P('*') * fill) * Cc('error')) +
- (C(c_id) * (ws ^ 1))
- )
-c_type = (C(c_void) * (ws ^ 1)) + c_param_type
-c_param = Ct(c_param_type * C(c_id))
-c_param_list = c_param * (fill * (P(',') * fill * c_param) ^ 0)
-c_params = Ct(c_void + c_param_list)
-c_proto = Ct(
- Cg(c_type, 'return_type') * Cg(c_id, 'name') *
- fill * P('(') * fill * Cg(c_params, 'parameters') * fill * P(')') *
- Cg(Cc(false), 'async') *
- (fill * Cg((P('FUNC_API_ASYNC') * Cc(true)), 'async') ^ -1) *
- (fill * Cg((P('FUNC_API_NOEXPORT') * Cc(true)), 'noexport') ^ -1) *
- fill * P(';')
- )
-grammar = Ct((c_proto + c_comment + c_preproc + ws) ^ 1)
-
--- we need at least 2 arguments since the last one is the output file
-assert(#arg >= 1)
-functions = {}
-
--- names of all headers relative to the source root (for inclusion in the
--- generated file)
-headers = {}
--- output file(dispatch function + metadata serialized with msgpack)
-outputf = arg[#arg]
-
--- read each input file, parse and append to the api metadata
-for i = 1, #arg - 1 do
- local full_path = arg[i]
- local parts = {}
- for part in string.gmatch(full_path, '[^/]+') do
- parts[#parts + 1] = part
- end
- headers[#headers + 1] = parts[#parts - 1]..'/'..parts[#parts]
-
- local input = io.open(full_path, 'rb')
- local tmp = grammar:match(input:read('*all'))
- for i = 1, #tmp do
- local fn = tmp[i]
- if not fn.noexport then
- functions[#functions + 1] = tmp[i]
- if #fn.parameters ~= 0 and fn.parameters[1][2] == 'channel_id' then
- -- this function should receive the channel id
- fn.receives_channel_id = true
- -- remove the parameter since it won't be passed by the api client
- table.remove(fn.parameters, 1)
- end
- if #fn.parameters ~= 0 and fn.parameters[#fn.parameters][1] == 'error' then
- -- function can fail if the last parameter type is 'Error'
- fn.can_fail = true
- -- remove the error parameter, msgpack has it's own special field
- -- for specifying errors
- fn.parameters[#fn.parameters] = nil
- end
- end
- end
- input:close()
-end
-
-
--- start building the output
-output = io.open(outputf, 'wb')
-
-output:write([[
-#include <inttypes.h>
-#include <stdbool.h>
-#include <stdint.h>
-#include <assert.h>
-#include <msgpack.h>
-
-#include "nvim/map.h"
-#include "nvim/log.h"
-#include "nvim/vim.h"
-#include "nvim/msgpack_rpc/helpers.h"
-#include "nvim/msgpack_rpc/defs.h"
-#include "nvim/api/private/helpers.h"
-#include "nvim/api/private/defs.h"
-]])
-
-for i = 1, #headers do
- if headers[i]:sub(-12) ~= '.generated.h' then
- output:write('\n#include "nvim/'..headers[i]..'"')
- end
-end
-
-output:write([[
-
-
-static const uint8_t msgpack_metadata[] = {
-
-]])
--- serialize the API metadata using msgpack and embed into the resulting
--- binary for easy querying by clients
-packed = mpack.pack(functions)
-for i = 1, #packed do
- output:write(string.byte(packed, i)..', ')
- if i % 10 == 0 then
- output:write('\n ')
- end
-end
-output:write([[
-};
-
-void msgpack_rpc_init_function_metadata(Dictionary *metadata)
-{
- msgpack_unpacked unpacked;
- msgpack_unpacked_init(&unpacked);
- if (msgpack_unpack_next(&unpacked,
- (const char *)msgpack_metadata,
- sizeof(msgpack_metadata),
- NULL) != MSGPACK_UNPACK_SUCCESS) {
- abort();
- }
- Object functions;
- msgpack_rpc_to_object(&unpacked.data, &functions);
- msgpack_unpacked_destroy(&unpacked);
- PUT(*metadata, "functions", functions);
-}
-
-]])
-
-local function real_type(type)
- local rv = type
- if typed_container:match(rv) then
- if rv:match('Array') then
- rv = 'Array'
- else
- rv = 'Dictionary'
- end
- end
- return rv
-end
-
--- start the handler functions. Visit each function metadata to build the
--- handler function with code generated for validating arguments and calling to
--- the real API.
-for i = 1, #functions do
- local fn = functions[i]
- local args = {}
-
- output:write('static Object handle_'..fn.name..'(uint64_t channel_id, uint64_t request_id, Array args, Error *error)')
- output:write('\n{')
- output:write('\n Object ret = NIL;')
- -- Declare/initialize variables that will hold converted arguments
- for j = 1, #fn.parameters do
- local param = fn.parameters[j]
- local converted = 'arg_'..j
- output:write('\n '..param[1]..' '..converted..' api_init_'..string.lower(real_type(param[1]))..';')
- end
- output:write('\n')
- output:write('\n if (args.size != '..#fn.parameters..') {')
- output:write('\n snprintf(error->msg, sizeof(error->msg), "Wrong number of arguments: expecting '..#fn.parameters..' but got %zu", args.size);')
- output:write('\n error->set = true;')
- output:write('\n goto cleanup;')
- output:write('\n }\n')
-
- -- Validation/conversion for each argument
- for j = 1, #fn.parameters do
- local converted, convert_arg, param, arg
- param = fn.parameters[j]
- converted = 'arg_'..j
- local rt = real_type(param[1])
- if rt ~= 'Object' then
- output:write('\n if (args.items['..(j - 1)..'].type == kObjectType'..rt..') {')
- output:write('\n '..converted..' = args.items['..(j - 1)..'].data.'..rt:lower()..';')
- if rt:match('^Buffer$') or rt:match('^Window$') or rt:match('^Tabpage$') or rt:match('^Boolean$') then
- -- accept positive integers for Buffers, Windows and Tabpages
- output:write('\n } else if (args.items['..(j - 1)..'].type == kObjectTypeInteger && args.items['..(j - 1)..'].data.integer > 0) {')
- output:write('\n '..converted..' = (unsigned)args.items['..(j - 1)..'].data.integer;')
- end
- output:write('\n } else {')
- output:write('\n snprintf(error->msg, sizeof(error->msg), "Wrong type for argument '..j..', expecting '..param[1]..'");')
- output:write('\n error->set = true;')
- output:write('\n goto cleanup;')
- output:write('\n }\n')
- else
- output:write('\n '..converted..' = args.items['..(j - 1)..'];\n')
- end
-
- args[#args + 1] = converted
- end
-
- -- function call
- local call_args = table.concat(args, ', ')
- output:write('\n ')
- if fn.return_type ~= 'void' then
- -- has a return value, prefix the call with a declaration
- output:write(fn.return_type..' rv = ')
- end
-
- -- write the function name and the opening parenthesis
- output:write(fn.name..'(')
-
- if fn.receives_channel_id then
- -- if the function receives the channel id, pass it as first argument
- if #args > 0 or fn.can_fail then
- output:write('channel_id, '..call_args)
- else
- output:write('channel_id')
- end
- else
- output:write(call_args)
- end
-
- if fn.can_fail then
- -- if the function can fail, also pass a pointer to the local error object
- if #args > 0 then
- output:write(', error);\n')
- else
- output:write('error);\n')
- end
- -- and check for the error
- output:write('\n if (error->set) {')
- output:write('\n goto cleanup;')
- output:write('\n }\n')
- else
- output:write(');\n')
- end
-
- if fn.return_type ~= 'void' then
- output:write('\n ret = '..string.upper(real_type(fn.return_type))..'_OBJ(rv);')
- end
- -- Now generate the cleanup label for freeing memory allocated for the
- -- arguments
- output:write('\n\ncleanup:');
-
- for j = 1, #fn.parameters do
- local param = fn.parameters[j]
- output:write('\n api_free_'..string.lower(real_type(param[1]))..'(arg_'..j..');')
- end
- output:write('\n return ret;\n}\n\n');
-end
-
--- Generate a function that initializes method names with handler functions
-output:write([[
-static Map(String, MsgpackRpcRequestHandler) *methods = NULL;
-
-void msgpack_rpc_add_method_handler(String method, MsgpackRpcRequestHandler handler)
-{
- map_put(String, MsgpackRpcRequestHandler)(methods, method, handler);
-}
-
-void msgpack_rpc_init_method_table(void)
-{
- methods = map_new(String, MsgpackRpcRequestHandler)();
-
-]])
-
--- Keep track of the maximum method name length in order to avoid walking
--- strings longer than that when searching for a method handler
-local max_fname_len = 0
-for i = 1, #functions do
- local fn = functions[i]
- output:write(' msgpack_rpc_add_method_handler('..
- '(String) {.data = "'..fn.name..'", '..
- '.size = sizeof("'..fn.name..'") - 1}, '..
- '(MsgpackRpcRequestHandler) {.fn = handle_'.. fn.name..
- ', .async = '..tostring(fn.async)..'});\n')
-
- if #fn.name > max_fname_len then
- max_fname_len = #fn.name
- end
-end
-
-output:write('\n}\n\n')
-
-output:write([[
-MsgpackRpcRequestHandler msgpack_rpc_get_handler_for(const char *name,
- size_t name_len)
-{
- String m = {
- .data=(char *)name,
- .size=MIN(name_len, ]]..max_fname_len..[[)
- };
- MsgpackRpcRequestHandler rv =
- map_get(String, MsgpackRpcRequestHandler)(methods, m);
-
- if (!rv.fn) {
- rv.fn = msgpack_rpc_handle_missing_method;
- }
-
- return rv;
-}
-]])
-
-output:close()
diff --git a/scripts/pvscheck.sh b/scripts/pvscheck.sh
new file mode 100755
index 0000000000..371af7c7e5
--- /dev/null
+++ b/scripts/pvscheck.sh
@@ -0,0 +1,491 @@
+#!/bin/sh
+
+# Assume that "local" is available.
+# shellcheck disable=SC2039
+
+set -e
+# Note: -u causes problems with posh, it barks at โ€œundefinedโ€ $@ when no
+# arguments provided.
+test -z "$POSH_VERSION" && set -u
+
+log_info() {
+ >&2 printf "pvscheck.sh: %s\n" "$@"
+}
+
+get_jobs_num() {
+ if [ -n "${TRAVIS:-}" ] ; then
+ # HACK: /proc/cpuinfo on Travis CI is misleading, so hardcode 1.
+ echo 1
+ else
+ echo $(( $(grep -c "^processor" /proc/cpuinfo) + 1 ))
+ fi
+}
+
+help() {
+ echo 'Usage:'
+ echo ' pvscheck.sh [--pvs URL] [--deps] [--environment-cc]'
+ echo ' [target-directory [branch]]'
+ echo ' pvscheck.sh [--pvs URL] [--recheck] [--environment-cc] [--update]'
+ echo ' [target-directory]'
+ echo ' pvscheck.sh [--pvs URL] --only-analyse [target-directory]'
+ echo ' pvscheck.sh [--pvs URL] --pvs-install {target-directory}'
+ echo ' pvscheck.sh --patch [--only-build]'
+ echo
+ echo ' --pvs: Fetch pvs-studio from URL.'
+ echo
+ echo ' --pvs detect: Auto-detect latest version (by scraping viva64.com).'
+ echo
+ echo ' --deps: (for regular run) Use top-level Makefile and build deps.'
+ echo ' Without this it assumes all dependencies are already'
+ echo ' installed.'
+ echo
+ echo ' --environment-cc: (for regular run and --recheck) Do not export'
+ echo ' CC=clang. Build is still run with CFLAGS=-O0.'
+ echo
+ echo ' --only-build: (for --patch) Only patch files in ./build directory.'
+ echo
+ echo ' --pvs-install: Only install PVS-studio to the specified location.'
+ echo
+ echo ' --patch: patch sources in the current directory.'
+ echo ' Does not patch already patched files.'
+ echo ' Does not run analysis.'
+ echo
+ echo ' --recheck: run analysis on a prepared target directory.'
+ echo
+ echo ' --update: when rechecking first do a pull.'
+ echo
+ echo ' --only-analyse: run analysis on a prepared target directory '
+ echo ' without building Neovim.'
+ echo
+ echo ' target-directory: Directory where build should occur.'
+ echo ' Default: ../neovim-pvs'
+ echo
+ echo ' branch: Branch to check.'
+ echo ' Default: master.'
+}
+
+getopts_error() {
+ local msg="$1" ; shift
+ local do_help=
+ if test "$msg" = "--help" ; then
+ msg="$1" ; shift
+ do_help=1
+ fi
+ printf '%s\n' "$msg" >&2
+ if test -n "$do_help" ; then
+ printf '\n' >&2
+ help >&2
+ fi
+ echo 'return 1'
+ return 1
+}
+
+# Usage `eval "$(getopts_long long_defs -- positionals_defs -- "$@")"`
+#
+# long_defs: list of pairs of arguments like `longopt action`.
+# positionals_defs: list of arguments like `action`.
+#
+# `action` is a space-separated commands:
+#
+# store_const [const] [varname] [default]
+# Store constant [const] (default 1) (note: evalโ€™ed) if argument is present
+# (long options only). Assumes long option accepts no arguments.
+# store [varname] [default]
+# Store value. Assumes long option needs an argument.
+# run {func} [varname] [default]
+# Run function {func} and store its output to the [varname]. Assumes no
+# arguments accepted (long options only).
+# modify {func} [varname] [default]
+# Like run, but assumes a single argument, passed to function {func} as $1.
+#
+# All actions stores empty value if neither [varname] nor [default] are
+# present. [default] is evaled by top-level `eval`, so be careful. Also note
+# that no arguments may contain spaces, including [default] and [const].
+getopts_long() {
+ local positional=
+ local opt_bases=""
+ while test $# -gt 0 ; do
+ local arg="$1" ; shift
+ local opt_base=
+ local act=
+ local opt_name=
+ if test -z "$positional" ; then
+ if test "$arg" = "--" ; then
+ positional=0
+ continue
+ fi
+ act="$1" ; shift
+ opt_name="$(echo "$arg" | tr '-' '_')"
+ opt_base="longopt_$opt_name"
+ else
+ if test "$arg" = "--" ; then
+ break
+ fi
+ : $(( positional+=1 ))
+ act="$arg"
+ opt_name="arg_$positional"
+ opt_base="positional_$positional"
+ fi
+ opt_bases="$opt_bases $opt_base"
+ eval "local varname_$opt_base=$opt_name"
+ local i=0
+ for act_subarg in $act ; do
+ eval "local act_$(( i+=1 ))_$opt_base=\"\$act_subarg\""
+ done
+ done
+ # Process options
+ local positional=0
+ local force_positional=
+ while test $# -gt 0 ; do
+ local argument="$1" ; shift
+ local opt_base=
+ local has_equal=
+ local equal_arg=
+ local is_positional=
+ if test "$argument" = "--" ; then
+ force_positional=1
+ continue
+ elif test -z "$force_positional" && test "${argument#--}" != "$argument"
+ then
+ local opt_name="${argument#--}"
+ local opt_name_striparg="${opt_name%%=*}"
+ if test "$opt_name" = "$opt_name_striparg" ; then
+ has_equal=0
+ else
+ has_equal=1
+ equal_arg="${argument#*=}"
+ opt_name="$opt_name_striparg"
+ fi
+ # Use trailing x to prevent stripping newlines
+ opt_name="$(printf '%sx' "$opt_name" | tr '-' '_')"
+ opt_name="${opt_name%x}"
+ if test -n "$(printf '%sx' "$opt_name" | tr -d 'a-z_')" ; then
+ getopts_error "Option contains invalid characters: $opt_name"
+ fi
+ opt_base="longopt_$opt_name"
+ else
+ : $(( positional+=1 ))
+ opt_base="positional_$positional"
+ is_positional=1
+ fi
+ if test -n "$opt_base" ; then
+ eval "local occurred_$opt_base=1"
+
+ eval "local act_1=\"\${act_1_$opt_base:-}\""
+ eval "local varname=\"\${varname_$opt_base:-}\""
+ local need_val=
+ local func=
+ case "$act_1" in
+ (store_const)
+ eval "local const=\"\${act_2_${opt_base}:-1}\""
+ eval "local varname=\"\${act_3_${opt_base}:-$varname}\""
+ printf 'local %s=%s\n' "$varname" "$const"
+ ;;
+ (store)
+ eval "varname=\"\${act_2_${opt_base}:-$varname}\""
+ need_val=1
+ ;;
+ (run)
+ eval "func=\"\${act_2_${opt_base}}\""
+ eval "varname=\"\${act_3_${opt_base}:-$varname}\""
+ printf 'local %s="$(%s)"\n' "$varname" "$func"
+ ;;
+ (modify)
+ eval "func=\"\${act_2_${opt_base}}\""
+ eval "varname=\"\${act_3_${opt_base}:-$varname}\""
+ need_val=1
+ ;;
+ ("")
+ getopts_error --help "Wrong argument: $argument"
+ ;;
+ esac
+ if test -n "$need_val" ; then
+ local val=
+ if test -z "$is_positional" ; then
+ if test $has_equal = 1 ; then
+ val="$equal_arg"
+ else
+ if test $# -eq 0 ; then
+ getopts_error "Missing argument for $opt_name"
+ fi
+ val="$1" ; shift
+ fi
+ else
+ val="$argument"
+ fi
+ local escaped_val="'$(printf "%s" "$val" | sed "s/'/'\\\\''/g")'"
+ case "$act_1" in
+ (store)
+ printf 'local %s=%s\n' "$varname" "$escaped_val"
+ ;;
+ (modify)
+ printf 'local %s="$(%s %s)"\n' "$varname" "$func" "$escaped_val"
+ ;;
+ esac
+ fi
+ fi
+ done
+ # Print default values when no values were provided
+ local opt_base=
+ for opt_base in $opt_bases ; do
+ eval "local occurred=\"\${occurred_$opt_base:-}\""
+ if test -n "$occurred" ; then
+ continue
+ fi
+ eval "local act_1=\"\$act_1_$opt_base\""
+ eval "local varname=\"\$varname_$opt_base\""
+ case "$act_1" in
+ (store)
+ eval "local varname=\"\${act_2_${opt_base}:-$varname}\""
+ eval "local default=\"\${act_3_${opt_base}:-}\""
+ printf 'local %s=%s\n' "$varname" "$default"
+ ;;
+ (store_const|run|modify)
+ eval "local varname=\"\${act_3_${opt_base}:-$varname}\""
+ eval "local default=\"\${act_4_${opt_base}:-}\""
+ printf 'local %s=%s\n' "$varname" "$default"
+ ;;
+ esac
+ done
+}
+
+get_pvs_comment() {
+ local tgt="$1" ; shift
+
+ cat > "$tgt/pvs-comment" << EOF
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+EOF
+}
+
+install_pvs() {(
+ local tgt="$1" ; shift
+ local pvs_url="$1" ; shift
+
+ cd "$tgt"
+
+ if test -d pvs-studio ; then
+ log_info 'install_pvs: "pvs-studio" directory already exists, skipping install'
+ return 0
+ fi
+
+ mkdir pvs-studio
+ cd pvs-studio
+
+ curl -L -o pvs-studio.tar.gz "$pvs_url"
+ tar xzf pvs-studio.tar.gz
+ rm pvs-studio.tar.gz
+ local pvsdir="$(find . -maxdepth 1 -mindepth 1)"
+ find "$pvsdir" -maxdepth 1 -mindepth 1 -exec mv '{}' . \;
+ rmdir "$pvsdir"
+)}
+
+create_compile_commands() {(
+ local tgt="$1" ; shift
+ local deps="$1" ; shift
+ local environment_cc="$1" ; shift
+
+ if test -z "$environment_cc" ; then
+ export CC=clang
+ fi
+ export CFLAGS=' -O0 '
+
+ if test -z "$deps" ; then
+ mkdir -p "$tgt/build"
+ (
+ cd "$tgt/build"
+
+ cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX="$PWD/root"
+ make -j"$(get_jobs_num)"
+ )
+ else
+ (
+ cd "$tgt"
+
+ make -j"$(get_jobs_num)" CMAKE_EXTRA_FLAGS=" -DCMAKE_INSTALL_PREFIX=$PWD/root -DCMAKE_BUILD_TYPE=Debug "
+ )
+ fi
+ find "$tgt/build/src/nvim/auto" -name '*.test-include.c' -delete
+)}
+
+# Warning: realdir below only cares about directories unlike realpath.
+#
+# realpath is not available in Ubuntu trusty yet.
+realdir() {(
+ local dir="$1"
+ local add=""
+ while ! cd "$dir" 2>/dev/null ; do
+ add="${dir##*/}/$add"
+ local new_dir="${dir%/*}"
+ if test "$new_dir" = "$dir" ; then
+ return 1
+ fi
+ dir="$new_dir"
+ done
+ printf '%s\n' "$PWD/$add"
+)}
+
+patch_sources() {(
+ local tgt="$1" ; shift
+ local only_bulid="${1}" ; shift
+
+ get_pvs_comment "$tgt"
+
+ local sh_script='
+ pvs_comment="$(cat pvs-comment ; echo -n EOS)"
+ filehead="$(head -c $(( ${#pvs_comment} - 3 )) "$1" ; echo -n EOS)"
+ if test "x$filehead" != "x$pvs_comment" ; then
+ cat pvs-comment "$1" > "$1.tmp"
+ mv "$1.tmp" "$1"
+ fi
+ '
+
+ cd "$tgt"
+
+ if test "$only_build" != "--only-build" ; then
+ find \
+ src/nvim test/functional/fixtures test/unit/fixtures \
+ -name '*.c' \
+ -exec /bin/sh -c "$sh_script" - '{}' \;
+ fi
+
+ find \
+ build/src/nvim/auto build/config \
+ -name '*.c' -not -name '*.test-include.c' \
+ -exec /bin/sh -c "$sh_script" - '{}' \;
+
+ rm pvs-comment
+)}
+
+run_analysis() {(
+ local tgt="$1" ; shift
+
+ cd "$tgt"
+
+ # pvs-studio-analyzer exits with a non-zero exit code when there are detected
+ # errors, so ignore its return
+ pvs-studio-analyzer \
+ analyze \
+ --threads "$(get_jobs_num)" \
+ --output-file PVS-studio.log \
+ --verbose \
+ --file build/compile_commands.json \
+ --sourcetree-root . || true
+
+ rm -rf PVS-studio.{xml,err,tsk,html.d}
+ local plog_args="PVS-studio.log --srcRoot . --excludedCodes V011"
+ plog-converter $plog_args --renderTypes xml --output PVS-studio.xml
+ plog-converter $plog_args --renderTypes errorfile --output PVS-studio.err
+ plog-converter $plog_args --renderTypes tasklist --output PVS-studio.tsk
+ plog-converter $plog_args --renderTypes fullhtml --output PVS-studio.html.d
+)}
+
+detect_url() {
+ local url="${1:-detect}"
+ if test "$url" = detect ; then
+ curl --silent -L 'https://www.viva64.com/en/pvs-studio-download/' \
+ | grep -o 'https\{0,1\}://[^"<>]\{1,\}/pvs-studio[^/"<>]*-x86_64\.tgz' \
+ || echo FAILED
+ else
+ printf '%s' "$url"
+ fi
+}
+
+do_check() {
+ local tgt="$1" ; shift
+ local branch="$1" ; shift
+ local pvs_url="$1" ; shift
+ local deps="$1" ; shift
+ local environment_cc="$1" ; shift
+
+ if test -z "$pvs_url" || test "$pvs_url" = FAILED ; then
+ pvs_url="$(detect_url detect)"
+ if test -z "$pvs_url" || test "$pvs_url" = FAILED ; then
+ echo "failed to auto-detect PVS URL"
+ exit 1
+ fi
+ echo "Auto-detected PVS URL: ${pvs_url}"
+ fi
+
+ git clone --branch="$branch" . "$tgt"
+
+ install_pvs "$tgt" "$pvs_url"
+
+ do_recheck "$tgt" "$deps" "$environment_cc" ""
+}
+
+do_recheck() {
+ local tgt="$1" ; shift
+ local deps="$1" ; shift
+ local environment_cc="$1" ; shift
+ local update="$1" ; shift
+
+ if test -n "$update" ; then
+ (
+ cd "$tgt"
+ local branch="$(git rev-parse --abbrev-ref HEAD)"
+ git checkout --detach
+ git fetch -f origin "${branch}:${branch}"
+ git checkout -f "$branch"
+ )
+ fi
+
+ create_compile_commands "$tgt" "$deps" "$environment_cc"
+
+ do_analysis "$tgt"
+}
+
+do_analysis() {
+ local tgt="$1" ; shift
+
+ if test -d "$tgt/pvs-studio" ; then
+ local saved_pwd="$PWD"
+ cd "$tgt/pvs-studio"
+ export PATH="$PWD/bin${PATH+:}${PATH}"
+ cd "$saved_pwd"
+ fi
+
+ run_analysis "$tgt"
+}
+
+main() {
+ eval "$(
+ getopts_long \
+ help store_const \
+ pvs 'modify detect_url pvs_url' \
+ patch store_const \
+ only-build 'store_const --only-build' \
+ recheck store_const \
+ only-analyse store_const \
+ pvs-install store_const \
+ deps store_const \
+ environment-cc store_const \
+ update store_const \
+ -- \
+ 'modify realdir tgt "$PWD/../neovim-pvs"' \
+ 'store branch master' \
+ -- "$@"
+ )"
+
+ if test -n "$help" ; then
+ help
+ return 0
+ fi
+
+ # set -x
+
+ if test -n "$patch" ; then
+ patch_sources "$tgt" "$only_build"
+ elif test -n "$pvs_install" ; then
+ install_pvs "$tgt" "$pvs_url"
+ elif test -n "$recheck" ; then
+ do_recheck "$tgt" "$deps" "$environment_cc" "$update"
+ elif test -n "$only_analyse" ; then
+ do_analysis "$tgt"
+ else
+ do_check "$tgt" "$branch" "$pvs_url" "$deps" "$environment_cc"
+ fi
+}
+
+main "$@"
diff --git a/scripts/release.sh b/scripts/release.sh
index 67738ccc96..fb266ad154 100755
--- a/scripts/release.sh
+++ b/scripts/release.sh
@@ -1,63 +1,99 @@
-#!/bin/sh
+#!/usr/bin/env bash
+# Usage:
+# ./scripts/release.sh
+# ./scripts/release.sh --use-current-commit
+# ./scripts/release.sh --only-bump
+#
# Performs steps to tag a release.
#
# Steps:
# Create the "release" commit:
# - CMakeLists.txt: Unset NVIM_VERSION_PRERELEASE
+# - CMakeLists.txt: Unset NVIM_API_PRERELEASE
+# - Create test/functional/fixtures/api_level_N.mpack
# - Tag the commit.
# Create the "version bump" commit:
# - CMakeLists.txt: Set NVIM_VERSION_PRERELEASE to "-dev"
-#
-# Manual steps:
-# - CMakeLists.txt: Bump NVIM_VERSION_* as appropriate.
-# - git push --follow-tags
set -e
set -u
set -o pipefail
+ARG1=${1:-no}
+
+__sed=$( [ "$(uname)" = Darwin ] && echo 'sed -E' || echo 'sed -r' )
+
cd "$(git rev-parse --show-toplevel)"
__LAST_TAG=$(git describe --abbrev=0)
[ -z "$__LAST_TAG" ] && { echo 'ERROR: no tag found'; exit 1; }
__VERSION_MAJOR=$(grep 'set(NVIM_VERSION_MAJOR' CMakeLists.txt\
- |sed -r 's/.*NVIM_VERSION_MAJOR ([[:digit:]]).*/\1/')
+ |$__sed 's/.*NVIM_VERSION_MAJOR ([[:digit:]]).*/\1/')
__VERSION_MINOR=$(grep 'set(NVIM_VERSION_MINOR' CMakeLists.txt\
- |sed -r 's/.*NVIM_VERSION_MINOR ([[:digit:]]).*/\1/')
+ |$__sed 's/.*NVIM_VERSION_MINOR ([[:digit:]]).*/\1/')
__VERSION_PATCH=$(grep 'set(NVIM_VERSION_PATCH' CMakeLists.txt\
- |sed -r 's/.*NVIM_VERSION_PATCH ([[:digit:]]).*/\1/')
+ |$__sed 's/.*NVIM_VERSION_PATCH ([[:digit:]]).*/\1/')
__VERSION="${__VERSION_MAJOR}.${__VERSION_MINOR}.${__VERSION_PATCH}"
+__API_LEVEL=$(grep 'set(NVIM_API_LEVEL ' CMakeLists.txt\
+ |$__sed 's/.*NVIM_API_LEVEL ([[:digit:]]).*/\1/')
{ [ -z "$__VERSION_MAJOR" ] || [ -z "$__VERSION_MINOR" ] || [ -z "$__VERSION_PATCH" ]; } \
&& { echo "ERROR: version parse failed: '${__VERSION}'"; exit 1; }
__RELEASE_MSG="NVIM v${__VERSION}
-Features:
+FEATURES:
-Fixes:
+FIXES:
-Changes:
+CHANGES:
"
__BUMP_MSG="version bump"
echo "Most recent tag: ${__LAST_TAG}"
echo "Release version: ${__VERSION}"
-sed -i -r 's/(NVIM_VERSION_PRERELEASE) "-dev"/\1 ""/' CMakeLists.txt
-echo "Building changelog since ${__LAST_TAG}..."
-__CHANGELOG="$(./scripts/git-log-pretty-since.sh "$__LAST_TAG" 'vim-patch:\S')"
-git add CMakeLists.txt
-git commit --edit -m "${__RELEASE_MSG} ${__CHANGELOG}"
-git tag -a v"${__VERSION}" -m "NVIM v${__VERSION}"
+_do_release_commit() {
+ $__sed -i.bk 's/(NVIM_VERSION_PRERELEASE) "-dev"/\1 ""/' CMakeLists.txt
+ if grep '(NVIM_API_PRERELEASE true)' CMakeLists.txt > /dev/null; then
+ $__sed -i.bk 's/(NVIM_API_PRERELEASE) true/\1 false/' CMakeLists.txt
+ build/bin/nvim --api-info > test/functional/fixtures/api_level_$__API_LEVEL.mpack
+ git add test/functional/fixtures/api_level_$__API_LEVEL.mpack
+ fi
+
+ if ! test "$ARG1" = '--use-current-commit' ; then
+ echo "Building changelog since ${__LAST_TAG}..."
+ __CHANGELOG="$(./scripts/git-log-pretty-since.sh "$__LAST_TAG" 'vim-patch:[^[:space:]]')"
+
+ git add CMakeLists.txt
+ git commit --edit -m "${__RELEASE_MSG} ${__CHANGELOG}"
+ fi
+
+ git tag --sign -a v"${__VERSION}" -m "NVIM v${__VERSION}"
+}
+
+_do_bump_commit() {
+ $__sed -i.bk 's/(NVIM_VERSION_PRERELEASE) ""/\1 "-dev"/' CMakeLists.txt
+ $__sed -i.bk 's/set\((NVIM_VERSION_PATCH) [[:digit:]]/set(\1 ?/' CMakeLists.txt
+ nvim +'/NVIM_VERSION' +10new +'exe "norm! iUpdate version numbers!!!\<CR>"' \
+ +'norm! 10.' CMakeLists.txt
+
+ git add CMakeLists.txt
+ git commit -m "$__BUMP_MSG"
-sed -i -r 's/(NVIM_VERSION_PRERELEASE) ""/\1 "-dev"/' CMakeLists.txt
-nvim -c '/NVIM_VERSION' -c 'echo "Update version numbers"' CMakeLists.txt
-git add CMakeLists.txt
-git commit -m "$__BUMP_MSG"
+ rm CMakeLists.txt.bk || true
+}
+if ! test "$ARG1" = '--only-bump' ; then
+ _do_release_commit
+fi
+_do_bump_commit
echo "
Next steps:
- Double-check NVIM_VERSION_* in CMakeLists.txt
- - git push --follow-tags
- - update website: index.html"
+ - Push the tag:
+ git push --follow-tags
+ - Empty-merge (if this is a maintenance release):
+ git checkout upstream/master
+ git merge -s ours upstream/release-x.y
+ - Update website: index.html"
diff --git a/scripts/run-api-tests.exp b/scripts/run-api-tests.exp
deleted file mode 100755
index 27c9c963e5..0000000000
--- a/scripts/run-api-tests.exp
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/env expect
-
-if {$argc < 2} {
- puts "Need commands for running the tests and for starting nvim"
- exit 1
-}
-
-set timeout 60
-set run_tests [split [lindex $argv 0] " "]
-set run_nvim [split [lindex $argv 1] " "]
-
-# don't echo to stdout
-log_user 0
-# set NVIM_LISTEN_ADDRESS, so nvim will listen on a known socket
-set env(NVIM_LISTEN_ADDRESS) "/tmp/nvim-[exec date +%s%N].sock"
-# start nvim
-spawn {*}$run_nvim
-# save the job descriptor
-set nvim_id $spawn_id
-# Reset function that can be invoked by test runners to put nvim in a cleaner
-# state
-send {
-:echo "read"."y"
-}
-# wait until nvim is ready
-expect "ready"
-# run tests
-spawn {*}$run_tests
-set tests_id $spawn_id
-set status 1
-# listen for test output in the background
-expect_background {
- * {
- # show test output to the user
- send_user -- $expect_out(buffer)
- }
- eof {
- # collect the exit status code
- set spawn_id $tests_id
- catch wait result
- set status [lindex $result 3]
- set spawn_id $nvim_id
- # quit nvim
- send ":qa!\r"
- }
-}
-# switch back nvim and wait until it exits
-set spawn_id $nvim_id
-expect eof
-exit $status
diff --git a/scripts/shadacat.py b/scripts/shadacat.py
index 2f2cf19f9d..522379aad4 100755
--- a/scripts/shadacat.py
+++ b/scripts/shadacat.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python3.4
+#!/usr/bin/env python3
import os
import sys
diff --git a/scripts/update_terminfo.sh b/scripts/update_terminfo.sh
new file mode 100755
index 0000000000..0cfc230ca6
--- /dev/null
+++ b/scripts/update_terminfo.sh
@@ -0,0 +1,94 @@
+#!/usr/bin/env bash
+#
+# usage: ./scripts/update_terminfo.sh
+#
+# This script does:
+#
+# 1. Download Dickey's terminfo.src
+# 2. Compile temporary terminfo database from terminfo.src
+# 3. Use database to generate src/nvim/tui/terminfo_defs.h
+#
+
+set -e
+
+url='https://invisible-island.net/datafiles/current/terminfo.src.gz'
+target='src/nvim/tui/terminfo_defs.h'
+
+readonly -A entries=(
+ [ansi]=ansi_terminfo
+ [interix]=interix_8colour_terminfo
+ [iterm2]=iterm_256colour_terminfo
+ [linux]=linux_16colour_terminfo
+ [putty-256color]=putty_256colour_terminfo
+ [rxvt-256color]=rxvt_256colour_terminfo
+ [screen-256color]=screen_256colour_terminfo
+ [st-256color]=st_256colour_terminfo
+ [tmux-256color]=tmux_256colour_terminfo
+ [vte-256color]=vte_256colour_terminfo
+ [xterm-256color]=xterm_256colour_terminfo
+ [cygwin]=cygwin_terminfo
+ [win32con]=win32con_terminfo
+ [conemu]=conemu_terminfo
+ [vtpcon]=vtpcon_terminfo
+)
+
+db="$(mktemp -du)"
+
+print_bold() {
+ printf "\\e[1m$*\\e[0m"
+}
+
+cd "$(git rev-parse --show-toplevel)"
+
+#
+# Get terminfo.src
+#
+print_bold '[*] Get terminfo.src\n'
+curl -O "$url"
+gunzip -f terminfo.src.gz
+
+#
+# Build terminfo database
+#
+print_bold '[*] Build terminfo database\n'
+cat terminfo.src scripts/windows.ti | tic -x -o "$db" -
+rm -f terminfo.src
+
+#
+# Write src/nvim/tui/terminfo_defs.h
+#
+print_bold "[*] Writing $target... "
+sorted_terms="$(echo "${!entries[@]}" | tr ' ' '\n' | sort | xargs)"
+
+cat > "$target" <<EOF
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+//
+// Generated by scripts/update_terminfo.sh and $(tic -V)
+//
+
+#ifndef NVIM_TUI_TERMINFO_DEFS_H
+#define NVIM_TUI_TERMINFO_DEFS_H
+
+#include <stdint.h>
+EOF
+
+for term in $sorted_terms; do
+ path="$(find "$db" -name "$term")"
+ if [ -z "$path" ]; then
+ >&2 echo "Not found: $term. Skipping."
+ continue
+ fi
+ printf '\n'
+ infocmp -L -1 -A "$db" "$term" | sed -e '1d' -e 's#^#// #' | tr '\t' ' '
+ printf 'static const int8_t %s[] = {\n' "${entries[$term]}"
+ printf ' '
+ od -v -t d1 < "$path" | cut -c9- | xargs | tr ' ' ',' | tr -d '\n'
+ printf ' // NOLINT\n};\n'
+done >> "$target"
+
+cat >> "$target" <<EOF
+#endif // NVIM_TUI_TERMINFO_DEFS_H
+EOF
+print_bold 'done\n'
diff --git a/scripts/vim-patch.sh b/scripts/vim-patch.sh
index a40090d4c3..11305421e5 100755
--- a/scripts/vim-patch.sh
+++ b/scripts/vim-patch.sh
@@ -2,10 +2,11 @@
set -e
set -u
-set -o pipefail
+# Use privileged mode, which e.g. skips using CDPATH.
+set -p
-readonly NEOVIM_SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
-readonly VIM_SOURCE_DIR_DEFAULT="${NEOVIM_SOURCE_DIR}/.vim-src"
+readonly NVIM_SOURCE_DIR="${NVIM_SOURCE_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}"
+readonly VIM_SOURCE_DIR_DEFAULT="${NVIM_SOURCE_DIR}/.vim-src"
readonly VIM_SOURCE_DIR="${VIM_SOURCE_DIR:-${VIM_SOURCE_DIR_DEFAULT}}"
readonly BASENAME="$(basename "${0}")"
readonly BRANCH_PREFIX="vim-"
@@ -13,22 +14,34 @@ readonly BRANCH_PREFIX="vim-"
CREATED_FILES=()
usage() {
- echo "Helper script for porting Vim patches. For more information, see"
+ echo "Port Vim patches to Neovim"
echo "https://github.com/neovim/neovim/wiki/Merging-patches-from-upstream-vim"
echo
echo "Usage: ${BASENAME} [-h | -l | -p vim-revision | -r pr-number]"
echo
echo "Options:"
echo " -h Show this message and exit."
- echo " -l Show list of Vim patches missing from Neovim."
- echo " -p {vim-revision} Download and apply the Vim patch vim-revision."
- echo " vim-revision can be a version number of the "
- echo " format '7.4.xxx' or a Git commit hash."
- echo " -s Submit a vim-patch pull request to Neovim."
- echo " -r {pr-number} Review a vim-patch pull request to Neovim."
+ echo " -l List missing Vim patches."
+ echo " -L List missing Vim patches (for scripts)."
+ echo " -M List all merged patch-numbers (at current v:version)."
+ echo " -p {vim-revision} Download and generate a Vim patch. vim-revision"
+ echo " can be a Vim version (8.0.xxx) or a Git hash."
+ echo " -P {vim-revision} Download, generate and apply a Vim patch."
+ echo " -g {vim-revision} Download a Vim patch."
+ echo " -s Create a vim-patch pull request."
+ echo " -r {pr-number} Review a vim-patch pull request."
+ echo ' -V Clone the Vim source code to $VIM_SOURCE_DIR.'
echo
- echo "Set VIM_SOURCE_DIR to change where Vim's sources are stored."
- echo "The default is '${VIM_SOURCE_DIR_DEFAULT}'."
+ echo ' $VIM_SOURCE_DIR controls where Vim sources are found'
+ echo " (default: '${VIM_SOURCE_DIR_DEFAULT}')"
+}
+
+msg_ok() {
+ printf '\e[32mโœ”\e[0m %s\n' "$@"
+}
+
+msg_err() {
+ printf '\e[31mโœ˜\e[0m %s\n' "$@"
}
# Checks if a program is in the user's PATH, and is executable.
@@ -57,10 +70,10 @@ clean_files() {
read -p "Delete these files (Y/n)? " -n 1 -r reply
echo
- if [[ "${reply}" =~ ^[Yy]$ ]]; then
- rm -- "${CREATED_FILES[@]}"
- else
+ if [[ "${reply}" == n ]]; then
echo "You can use 'git clean' to remove these files when you're done."
+ else
+ rm -- "${CREATED_FILES[@]}"
fi
}
@@ -68,26 +81,30 @@ get_vim_sources() {
require_executable git
if [[ ! -d ${VIM_SOURCE_DIR} ]]; then
- echo "Cloning Vim sources into '${VIM_SOURCE_DIR}'."
+ echo "Cloning Vim into: ${VIM_SOURCE_DIR}"
git clone https://github.com/vim/vim.git "${VIM_SOURCE_DIR}"
cd "${VIM_SOURCE_DIR}"
else
- if [[ ! -d "${VIM_SOURCE_DIR}/.git" ]]; then
- echo "โœ˜ ${VIM_SOURCE_DIR} does not appear to be a git repository."
+ cd "${VIM_SOURCE_DIR}"
+ if ! [ -d ".git" ] \
+ && ! [ "$(git rev-parse --show-toplevel)" = "${VIM_SOURCE_DIR}" ]; then
+ msg_err "${VIM_SOURCE_DIR} does not appear to be a git repository."
echo " Please remove it and try again."
exit 1
fi
- cd "${VIM_SOURCE_DIR}"
- echo "Updating Vim sources in '${VIM_SOURCE_DIR}'."
- git pull &&
- echo "โœ” Updated Vim sources." ||
- echo "โœ˜ Could not update Vim sources; ignoring error."
+ echo "Updating Vim sources: ${VIM_SOURCE_DIR}"
+ git pull --ff &&
+ msg_ok "Updated Vim sources." ||
+ msg_err "Could not update Vim sources; ignoring error."
fi
}
commit_message() {
- printf 'vim-patch:%s\n\n%s\n\n%s' "${vim_version}" \
- "${vim_message}" "${vim_commit_url}"
+ if [[ -n "$vim_tag" ]]; then
+ printf '%s\n%s' "${vim_message}" "${vim_commit_url}"
+ else
+ printf 'vim-patch:%s\n\n%s\n%s' "$vim_version" "$vim_message" "$vim_commit_url"
+ fi
}
find_git_remote() {
@@ -102,100 +119,162 @@ assign_commit_details() {
vim_tag="v${1}"
vim_commit=$(cd "${VIM_SOURCE_DIR}" \
&& git log -1 --format="%H" "${vim_tag}")
- local strip_commit_line=true
+ local munge_commit_line=true
else
# Interpret parameter as commit hash.
- vim_version="${1:0:7}"
+ vim_version="${1:0:12}"
+ vim_tag=
vim_commit=$(cd "${VIM_SOURCE_DIR}" \
&& git log -1 --format="%H" "${vim_version}")
- local strip_commit_line=false
+ local munge_commit_line=false
fi
vim_commit_url="https://github.com/vim/vim/commit/${vim_commit}"
vim_message="$(cd "${VIM_SOURCE_DIR}" \
&& git log -1 --pretty='format:%B' "${vim_commit}" \
- | sed -e 's/\(#[0-9]*\)/vim\/vim\1/g')"
- if [[ ${strip_commit_line} == "true" ]]; then
+ | sed -e 's/\(#[0-9]\{1,\}\)/vim\/vim\1/g')"
+ if [[ ${munge_commit_line} == "true" ]]; then
# Remove first line of commit message.
- vim_message="$(echo "${vim_message}" | sed -e '1d')"
+ vim_message="$(echo "${vim_message}" | sed -e '1s/^patch /vim-patch:/')"
fi
patch_file="vim-${vim_version}.patch"
}
-get_vim_patch() {
+# Patch surgery
+preprocess_patch() {
+ local file="$1"
+ local nvim="nvim -u NORC -i NONE --headless"
+
+ # Remove *.proto, Make*, gui_*, some if_*
+ local na_src='proto\|Make*\|gui_*\|if_lua\|if_mzsch\|if_olepp\|if_ole\|if_perl\|if_py\|if_ruby\|if_tcl\|if_xcmdsrv'
+ 2>/dev/null $nvim --cmd 'set dir=/tmp' +'g@^diff --git a/src/\S*\<\%(testdir/\)\@<!\%('${na_src}'\)@norm! d/\v(^diff)|%$ ' +w +q "$file"
+
+ # Remove unwanted Vim doc files.
+ local na_doc='channel\.txt\|netbeans\.txt\|os_\w\+\.txt\|term\.txt\|todo\.txt\|version\d\.txt\|sponsor\.txt\|intro\.txt\|tags'
+ 2>/dev/null $nvim --cmd 'set dir=/tmp' +'g@^diff --git a/runtime/doc/\<\%('${na_doc}'\)\>@norm! d/\v(^diff)|%$ ' +w +q "$file"
+
+ # Remove "Last change ..." changes in doc files.
+ 2>/dev/null $nvim --cmd 'set dir=/tmp' +'%s/^@@.*\n.*For Vim version.*Last change.*\n.*For Vim version.*Last change.*//' +w +q "$file"
+
+ # Remove screen dumps, testdir/Make_*.mak files
+ local na_src_testdir='Make_amiga.mak\|Make_dos.mak\|Make_ming.mak\|Make_vms.mms\|dumps/.*.dump'
+ 2>/dev/null $nvim --cmd 'set dir=/tmp' +'g@^diff --git a/src/testdir/\<\%('${na_src_testdir}'\)\>@norm! d/\v(^diff)|%$ ' +w +q "$file"
+
+ # Remove version.c #7555
+ local na_po='version.c'
+ 2>/dev/null $nvim --cmd 'set dir=/tmp' +'g@^diff --git a/src/\<\%('${na_po}'\)\>@norm! d/\v(^diff)|%$ ' +w +q "$file"
+
+ # Remove some *.po files. #5622
+ local na_po='sjiscorr.c\|ja.sjis.po\|ko.po\|pl.cp1250.po\|pl.po\|ru.cp1251.po\|uk.cp1251.po\|zh_CN.cp936.po\|zh_CN.po\|zh_TW.po'
+ 2>/dev/null $nvim --cmd 'set dir=/tmp' +'g@^diff --git a/src/po/\<\%('${na_po}'\)\>@norm! d/\v(^diff)|%$ ' +w +q "$file"
+
+ # Remove vimrc_example.vim
+ local na_vimrcexample='vimrc_example\.vim'
+ 2>/dev/null $nvim --cmd 'set dir=/tmp' +'g@^diff --git a/runtime/\<\%('${na_vimrcexample}'\)\>@norm! d/\v(^diff)|%$ ' +w +q "$file"
+
+ # Rename src/ paths to src/nvim/
+ LC_ALL=C sed -e 's/\( [ab]\/src\)/\1\/nvim/g' \
+ "$file" > "$file".tmp && mv "$file".tmp "$file"
+
+ # Rename path to matchit plugin.
+ LC_ALL=C sed -e 's@\( [ab]/runtime\)/pack/dist/opt/matchit/\(plugin/matchit.vim\)@\1/\2@g' \
+ "$file" > "$file".tmp && mv "$file".tmp "$file"
+ LC_ALL=C sed -e 's@\( [ab]/runtime\)/pack/dist/opt/matchit/doc/\(matchit.txt\)@\1/doc/pi_\2@g' \
+ "$file" > "$file".tmp && mv "$file".tmp "$file"
+
+ # Rename test_urls.vim to check_urls.vim
+ LC_ALL=C sed -e 's@\( [ab]\)/runtime/doc/test\(_urls.vim\)@\1/scripts/check\2@g' \
+ "$file" > "$file".tmp && mv "$file".tmp "$file"
+
+ # Rename path to check_colors.vim
+ LC_ALL=C sed -e 's@\( [ab]/runtime\)/colors/\(tools/check_colors.vim\)@\1/\2@g' \
+ "$file" > "$file".tmp && mv "$file".tmp "$file"
+}
+
+get_vimpatch() {
get_vim_sources
assign_commit_details "${1}"
git log -1 "${vim_commit}" -- >/dev/null 2>&1 || {
- >&2 echo "โœ˜ Couldn't find Vim revision '${vim_commit}'."
+ >&2 msg_err "Couldn't find Vim revision '${vim_commit}'."
exit 3
}
- echo
- echo "โœ” Found Vim revision '${vim_commit}'."
+ msg_ok "Found Vim revision '${vim_commit}'."
+
+ local patch_content
+ patch_content="$(git --no-pager show --color=never -1 --pretty=medium "${vim_commit}")"
+
+ cd "${NVIM_SOURCE_DIR}"
+
+ printf "Creating patch...\n"
+ echo "$patch_content" > "${NVIM_SOURCE_DIR}/${patch_file}"
- # Patch surgery: preprocess the patch.
- # - transform src/ paths to src/nvim/
- local vim_full
- vim_full="$(git show -1 --pretty=medium "${vim_commit}" \
- | LC_ALL=C sed -e 's/\( [ab]\/src\)/\1\/nvim/g')"
- local neovim_branch="${BRANCH_PREFIX}${vim_version}"
+ printf "Pre-processing patch...\n"
+ preprocess_patch "${NVIM_SOURCE_DIR}/${patch_file}"
+
+ msg_ok "Saved patch to '${NVIM_SOURCE_DIR}/${patch_file}'."
+}
+
+stage_patch() {
+ get_vimpatch "$1"
+ local try_apply="${2:-}"
- cd "${NEOVIM_SOURCE_DIR}"
local git_remote
git_remote="$(find_git_remote)"
local checked_out_branch
checked_out_branch="$(git rev-parse --abbrev-ref HEAD)"
if [[ "${checked_out_branch}" == ${BRANCH_PREFIX}* ]]; then
- echo "โœ” Current branch '${checked_out_branch}' seems to be a vim-patch"
+ msg_ok "Current branch '${checked_out_branch}' seems to be a vim-patch"
echo " branch; not creating a new branch."
else
- echo
- echo "Fetching '${git_remote}/master'."
+ printf '\nFetching "%s/master".\n' "${git_remote}"
output="$(git fetch "${git_remote}" master 2>&1)" &&
- echo "โœ” ${output}" ||
- (echo "โœ˜ ${output}"; false)
+ msg_ok "${output}" ||
+ (msg_err "${output}"; false)
+ local nvim_branch="${BRANCH_PREFIX}${vim_version}"
echo
- echo "Creating new branch '${neovim_branch}' based on '${git_remote}/master'."
- cd "${NEOVIM_SOURCE_DIR}"
- output="$(git checkout -b "${neovim_branch}" "${git_remote}/master" 2>&1)" &&
- echo "โœ” ${output}" ||
- (echo "โœ˜ ${output}"; false)
+ echo "Creating new branch '${nvim_branch}' based on '${git_remote}/master'."
+ cd "${NVIM_SOURCE_DIR}"
+ output="$(git checkout -b "${nvim_branch}" "${git_remote}/master" 2>&1)" &&
+ msg_ok "${output}" ||
+ (msg_err "${output}"; false)
fi
- echo
- echo "Creating empty commit with correct commit message."
+ printf "\nCreating empty commit with correct commit message.\n"
output="$(commit_message | git commit --allow-empty --file 2>&1 -)" &&
- echo "โœ” ${output}" ||
- (echo "โœ˜ ${output}"; false)
+ msg_ok "${output}" ||
+ (msg_err "${output}"; false)
- echo
- echo "Creating files."
- echo "${vim_full}" > "${NEOVIM_SOURCE_DIR}/${patch_file}"
- echo "โœ” Saved full commit details to '${NEOVIM_SOURCE_DIR}/${patch_file}'."
+ if test -n "$try_apply" ; then
+ if ! check_executable patch; then
+ printf "\n"
+ msg_err "'patch' command not found\n"
+ else
+ printf "\nApplying patch...\n"
+ patch -p1 < "${patch_file}" || true
+ find . -name '*.orig' -type f -delete
+ fi
+ printf "\nInstructions:\n Proceed to port the patch.\n"
+ else
+ printf '\nInstructions:\n Proceed to port the patch.\n Try the "patch" command (or use "%s -P ..." next time):\n patch -p1 < %s\n' "${BASENAME}" "${patch_file}"
+ fi
- echo
- echo "Instructions:"
- echo
- echo " Proceed to port the patch."
- echo " You might want to try 'patch -p1 < ${patch_file}' first."
- echo
- echo " If the patch contains a new test, consider porting it to Lua."
- echo " You might want to try 'scripts/legacy2luatest.pl'."
- echo
- echo " Stage your changes ('git add ...') and use 'git commit --amend' to commit."
- echo
- echo " To port additional patches related to ${vim_version} and add them to the current"
- echo " branch, call '${BASENAME} -p' again. Please use this only if it wouldn't make"
- echo " sense to send in each patch individually, as it will increase the size of the"
- echo " pull request and make it harder to review."
- echo
- echo " When you are finished, use '${BASENAME} -s' to submit a pull request."
- echo
- echo " See https://github.com/neovim/neovim/wiki/Merging-patches-from-upstream-vim"
- echo " for more information."
+ printf '
+ Stage your changes ("git add ..."), then use "git commit --amend" to commit.
+
+ To port more patches (if any) related to %s,
+ run "%s" again.
+ * Do this only for _related_ patches (otherwise it increases the
+ size of the pull request, making it harder to review)
+
+ When you are done, try "%s -s" to create the pull request.
+
+ See the wiki for more information:
+ * https://github.com/neovim/neovim/wiki/Merging-patches-from-upstream-vim
+' "${vim_version}" "${BASENAME}" "${BASENAME}"
}
hub_pr() {
@@ -221,20 +300,21 @@ submit_pr() {
exit 1
fi
- cd "${NEOVIM_SOURCE_DIR}"
+ cd "${NVIM_SOURCE_DIR}"
local checked_out_branch
checked_out_branch="$(git rev-parse --abbrev-ref HEAD)"
if [[ "${checked_out_branch}" != ${BRANCH_PREFIX}* ]]; then
- echo "โœ˜ Current branch '${checked_out_branch}' doesn't seem to be a vim-patch branch."
+ msg_err "Current branch '${checked_out_branch}' doesn't seem to be a vim-patch branch."
exit 1
fi
local git_remote
git_remote="$(find_git_remote)"
local pr_body
- pr_body="$(git log --reverse --format='#### %s%n%n%b%n' "${git_remote}"/master..HEAD)"
+ pr_body="$(git log --grep=vim-patch --reverse --format='#### %s%n%n%b%n' "${git_remote}"/master..HEAD)"
local patches
- patches=("$(git log --reverse --format='%s' "${git_remote}"/master..HEAD)")
+ # Extract just the "vim-patch:X.Y.ZZZZ" or "vim-patch:sha" portion of each log
+ patches=("$(git log --grep=vim-patch --reverse --format='%s' "${git_remote}"/master..HEAD | sed 's/: .*//')")
patches=(${patches[@]//vim-patch:}) # Remove 'vim-patch:' prefix for each item in array.
local pr_title="${patches[*]}" # Create space-separated string from array.
pr_title="${pr_title// /,}" # Replace spaces with commas.
@@ -245,133 +325,173 @@ submit_pr() {
if [[ $push_first -ne 0 ]]; then
echo "Pushing to 'origin/${checked_out_branch}'."
output="$(git push origin "${checked_out_branch}" 2>&1)" &&
- echo "โœ” ${output}" ||
- (echo "โœ˜ ${output}"; git reset --soft HEAD^1; false)
+ msg_ok "${output}" ||
+ (msg_err "${output}"; false)
echo
fi
echo "Creating pull request."
output="$(${submit_fn} "${pr_message}" 2>&1)" &&
- echo "โœ” ${output}" ||
- (echo "โœ˜ ${output}"; false)
+ msg_ok "${output}" ||
+ (msg_err "${output}"; false)
echo
echo "Cleaning up files."
local patch_file
for patch_file in "${patches[@]}"; do
patch_file="vim-${patch_file}.patch"
- if [[ ! -f "${NEOVIM_SOURCE_DIR}/${patch_file}" ]]; then
+ if [[ ! -f "${NVIM_SOURCE_DIR}/${patch_file}" ]]; then
continue
fi
- rm -- "${NEOVIM_SOURCE_DIR}/${patch_file}"
- echo "โœ” Removed '${NEOVIM_SOURCE_DIR}/${patch_file}'."
+ rm -- "${NVIM_SOURCE_DIR}/${patch_file}"
+ msg_ok "Removed '${NVIM_SOURCE_DIR}/${patch_file}'."
done
}
-list_vim_patches() {
- get_vim_sources
+# Gets all Vim commits since the "start" commit.
+list_vim_commits() { (
+ cd "${VIM_SOURCE_DIR}" && git log --reverse --format='%H' v8.0.0000..HEAD
+) }
+
+# Prints all (sorted) "vim-patch:xxx" tokens found in the Nvim git log.
+list_vimpatch_tokens() {
+ local tokens
+ # Find all "vim-patch:xxx" tokens in the Nvim git log.
+ tokens="$(cd "${NVIM_SOURCE_DIR}" && git log -E --grep='vim-patch:[^ ]+' | grep 'vim-patch')"
+ echo "$tokens" | grep -E 'vim-patch:[^ ,{]{7,}' \
+ | sed 's/.*\(vim-patch:[.0-9a-z]\+\).*/\1/' \
+ | sort \
+ | uniq
+}
- printf "\nVim patches missing from Neovim:\n"
+# Prints all patch-numbers (for the current v:version) for which there is
+# a "vim-patch:xxx" token in the Nvim git log.
+list_vimpatch_numbers() {
+ # Transform "vim-patch:X.Y.ZZZZ" to "ZZZZ".
+ list_vimpatch_tokens | while read vimpatch_token; do
+ echo "$vimpatch_token" | grep '8\.0\.' | sed 's/.*vim-patch:8\.0\.\([0-9a-z]\+\).*/\1/'
+ done
+}
- # Get commits since 7.4.602.
- local vim_commits
- vim_commits="$(cd "${VIM_SOURCE_DIR}" && git log --reverse --format='%H' v7.4.602..HEAD)"
+# Prints a newline-delimited list of Vim commits, for use by scripts.
+list_missing_vimpatches() {
+ local tokens vim_commit vim_commits is_missing vim_tag patch_number
- local vim_commit
+ # Find all "vim-patch:xxx" tokens in the Nvim git log.
+ tokens="$(list_vimpatch_tokens)"
+
+ # Get missing Vim commits
+ vim_commits="$(list_vim_commits)"
for vim_commit in ${vim_commits}; do
- local is_missing
- local vim_tag
- # This fails for untagged commits (e.g., runtime file updates) so mask the return status
- vim_tag="$(cd "${VIM_SOURCE_DIR}" && git describe --tags --exact-match "${vim_commit}" 2>/dev/null)" || true
- if [[ -n "${vim_tag}" ]]; then
- local patch_number="${vim_tag:5}" # Remove prefix like "v7.4."
- # Tagged Vim patch, check version.c:
- is_missing="$(sed -n '/static int included_patches/,/}/p' "${NEOVIM_SOURCE_DIR}/src/nvim/version.c" |
- grep -x -e "[[:space:]]*//[[:space:]]${patch_number} NA.*" -e "[[:space:]]*${patch_number}," >/dev/null && echo "false" || echo "true")"
+ # Check for vim-patch:<commit_hash> (usually runtime updates).
+ is_missing="$(echo "$tokens" | >/dev/null 2>&1 grep "vim\-patch:${vim_commit:0:7}" && echo false || echo true)"
+
+ if ! [ "$is_missing" = "false" ] \
+ && vim_tag="$(cd "${VIM_SOURCE_DIR}" && git describe --tags --exact-match "${vim_commit}" 2>/dev/null)"
+ then
+ # Vim version number (not commit hash).
+ # Check for vim-patch:<tag> (not commit hash).
+ patch_number="${vim_tag:1}" # "v7.4.0001" => "7.4.0001"
+ is_missing="$(echo "$tokens" | >/dev/null 2>&1 grep "vim\-patch:${patch_number}" && echo false || echo true)"
vim_commit="${vim_tag#v}"
- if (cd "${VIM_SOURCE_DIR}" && git show --name-only "v${vim_commit}" 2>/dev/null) | grep -q ^runtime; then
- vim_commit="${vim_commit} (+runtime)"
- fi
- else
- # Untagged Vim patch (e.g. runtime updates), check the Neovim git log:
- is_missing="$(cd "${NEOVIM_SOURCE_DIR}" &&
- git log -1 --no-merges --grep="vim\-patch:${vim_commit:0:7}" --pretty=format:false)"
fi
- if [[ ${is_missing} != "false" ]]; then
- echo " โ€ข ${vim_commit}"
+ if ! [ "$is_missing" = "false" ]; then
+ echo "${vim_commit}"
fi
done
+}
- echo
- echo "Instructions:"
- echo
- echo " To port one of the above patches to Neovim, execute"
- echo " this script with the patch revision as argument and"
- echo " follow the instructions."
- echo
- echo " Examples: '${BASENAME} -p 7.4.487'"
- echo " '${BASENAME} -p 1e8ebf870720e7b671f98f22d653009826304c4f'"
- echo
- echo " NOTE: Please port the _oldest_ patch if you possibly can."
- echo " Out-of-order patches increase the possibility of bugs."
+# Prints a human-formatted list of Vim commits, with instructional messages.
+show_vimpatches() {
+ get_vim_sources
+ printf "\nVim patches missing from Neovim:\n"
+
+ list_missing_vimpatches | while read vim_commit; do
+ if (cd "${VIM_SOURCE_DIR}" && git --no-pager show --color=never --name-only "v${vim_commit}" 2>/dev/null) | grep -q ^runtime; then
+ printf ' โ€ข %s (+runtime)\n' "${vim_commit}"
+ else
+ printf ' โ€ข %s\n' "${vim_commit}"
+ fi
+ done
+
+ printf "Instructions:
+
+ To port one of the above patches to Neovim, execute
+ this script with the patch revision as argument and
+ follow the instructions.
+
+ Examples: '%s -p 7.4.487'
+ '%s -p 1e8ebf870720e7b671f98f22d653009826304c4f'
+
+ NOTE: Please port the _oldest_ patch if you possibly can.
+ Out-of-order patches increase the possibility of bugs.
+" "${BASENAME}" "${BASENAME}"
}
review_commit() {
- local neovim_commit_url="${1}"
- local neovim_patch_url="${neovim_commit_url}.patch"
+ local nvim_commit_url="${1}"
+ local nvim_patch_url="${nvim_commit_url}.patch"
local git_patch_prefix='Subject: \[PATCH\] '
- local neovim_patch
- neovim_patch="$(curl -Ssf "${neovim_patch_url}")"
+ local nvim_patch
+ nvim_patch="$(curl -Ssf "${nvim_patch_url}")"
local vim_version
- vim_version="$(head -n 4 <<< "${neovim_patch}" | sed -n "s/${git_patch_prefix}vim-patch:\([a-z0-9.]*\)$/\1/p")"
+ vim_version="$(head -n 4 <<< "${nvim_patch}" | sed -n 's/'"${git_patch_prefix}"'vim-patch:\([a-z0-9.]*\)\(:.*\)\{0,1\}$/\1/p')"
echo
if [[ -n "${vim_version}" ]]; then
- echo "โœ” Detected Vim patch '${vim_version}'."
+ msg_ok "Detected Vim patch '${vim_version}'."
else
- echo "โœ˜ Could not detect the Vim patch number."
+ msg_err "Could not detect the Vim patch number."
echo " This script assumes that the PR contains only commits"
echo " with 'vim-patch:XXX' in their title."
+ echo
+ printf -- '%s\n\n' "$(head -n 4 <<< "${nvim_patch}")"
+ local reply
+ read -p "Continue reviewing (y/N)? " -n 1 -r reply
+ if [[ "${reply}" == y ]]; then
+ echo
+ return
+ fi
exit 1
fi
assign_commit_details "${vim_version}"
- local vim_patch_url="${vim_commit_url}.patch"
+ echo
+ echo "Creating files."
+ echo "${nvim_patch}" > "${NVIM_SOURCE_DIR}/n${patch_file}"
+ msg_ok "Saved pull request diff to '${NVIM_SOURCE_DIR}/n${patch_file}'."
+ CREATED_FILES+=("${NVIM_SOURCE_DIR}/n${patch_file}")
+
+ local nvim="nvim -u NORC -n -i NONE --headless"
+ 2>/dev/null $nvim --cmd 'set dir=/tmp' +'1,/^$/g/^ /-1join' +w +q "${NVIM_SOURCE_DIR}/n${patch_file}"
local expected_commit_message
expected_commit_message="$(commit_message)"
local message_length
message_length="$(wc -l <<< "${expected_commit_message}")"
local commit_message
- commit_message="$(tail -n +4 <<< "${neovim_patch}" | head -n "${message_length}")"
+ commit_message="$(tail -n +4 "${NVIM_SOURCE_DIR}/n${patch_file}" | head -n "${message_length}")"
if [[ "${commit_message#${git_patch_prefix}}" == "${expected_commit_message}" ]]; then
- echo "โœ” Found expected commit message."
+ msg_ok "Found expected commit message."
else
- echo "โœ˜ Wrong commit message."
+ msg_err "Wrong commit message."
echo " Expected:"
echo "${expected_commit_message}"
echo " Actual:"
echo "${commit_message#${git_patch_prefix}}"
fi
- echo
- echo "Creating files."
- echo "${neovim_patch}" > "${NEOVIM_SOURCE_DIR}/n${patch_file}"
- echo "โœ” Saved pull request diff to '${NEOVIM_SOURCE_DIR}/n${patch_file}'."
- CREATED_FILES+=("${NEOVIM_SOURCE_DIR}/n${patch_file}")
-
- curl -Ssfo "${NEOVIM_SOURCE_DIR}/${patch_file}" "${vim_patch_url}"
- echo "โœ” Saved Vim diff to '${NEOVIM_SOURCE_DIR}/${patch_file}'."
- CREATED_FILES+=("${NEOVIM_SOURCE_DIR}/${patch_file}")
+ get_vimpatch "${vim_version}"
+ CREATED_FILES+=("${NVIM_SOURCE_DIR}/${patch_file}")
echo
echo "Launching nvim."
- nvim -c "cd ${NEOVIM_SOURCE_DIR}" \
- -O "${NEOVIM_SOURCE_DIR}/${patch_file}" "${NEOVIM_SOURCE_DIR}/n${patch_file}"
+ nvim -c "cd ${NVIM_SOURCE_DIR}" \
+ -O "${NVIM_SOURCE_DIR}/${patch_file}" "${NVIM_SOURCE_DIR}/n${patch_file}"
}
review_pr() {
@@ -397,7 +517,7 @@ review_pr() {
if [[ "${pr_commit_url}" != "${pr_commit_urls[-1]}" ]]; then
read -p "Continue with next commit (Y/n)? " -n 1 -r reply
echo
- if [[ ! "${reply}" =~ ^[Yy]$ ]]; then
+ if [[ "${reply}" == n ]]; then
break
fi
fi
@@ -406,18 +526,34 @@ review_pr() {
clean_files
}
-while getopts "hlp:r:s" opt; do
+while getopts "hlLMVp:P:g:r:s" opt; do
case ${opt} in
h)
usage
exit 0
;;
l)
- list_vim_patches
+ show_vimpatches
+ exit 0
+ ;;
+ L)
+ list_missing_vimpatches
+ exit 0
+ ;;
+ M)
+ list_vimpatch_numbers
exit 0
;;
p)
- get_vim_patch "${OPTARG}"
+ stage_patch "${OPTARG}"
+ exit 0
+ ;;
+ P)
+ stage_patch "${OPTARG}" TRY_APPLY
+ exit 0
+ ;;
+ g)
+ get_vimpatch "${OPTARG}"
exit 0
;;
r)
@@ -428,6 +564,10 @@ while getopts "hlp:r:s" opt; do
submit_pr
exit 0
;;
+ V)
+ get_vim_sources
+ exit 0
+ ;;
*)
exit 1
;;
diff --git a/scripts/vimpatch.lua b/scripts/vimpatch.lua
new file mode 100755
index 0000000000..0924f3d718
--- /dev/null
+++ b/scripts/vimpatch.lua
@@ -0,0 +1,67 @@
+-- Updates version.c list of applied Vim patches.
+--
+-- Usage:
+-- VIM_SOURCE_DIR=~/neovim/.vim-src/ nvim -i NONE -u NONE --headless +'luafile ./scripts/vimpatch.lua' +q
+
+local nvim = vim.api
+
+local function pprint(o)
+ print(nvim.nvim_call_function('string', { o }))
+end
+
+local function systemlist(...)
+ local rv = nvim.nvim_call_function('systemlist', ...)
+ local err = nvim.nvim_get_vvar('shell_error')
+ local args_str = nvim.nvim_call_function('string', ...)
+ if 0 ~= err then
+ error('command failed: '..args_str)
+ end
+ return rv
+end
+
+local function vimpatch_sh_list_numbers()
+ return systemlist( { { 'bash', '-c', 'scripts/vim-patch.sh -M', } } )
+end
+
+-- Generates the lines to be inserted into the src/version.c
+-- `included_patches[]` definition.
+local function gen_version_c_lines()
+ -- Set of merged Vim 8.0.zzzz patch numbers.
+ local merged_patch_numbers = {}
+ local highest = 0
+ for _, n in ipairs(vimpatch_sh_list_numbers()) do
+ if n then
+ merged_patch_numbers[tonumber(n)] = true
+ highest = math.max(highest, n)
+ end
+ end
+
+ local lines = {}
+ for i = highest, 0, -1 do
+ local is_merged = (nil ~= merged_patch_numbers[i])
+ if is_merged then
+ table.insert(lines, string.format(' %s,', i))
+ else
+ table.insert(lines, string.format(' // %s,', i))
+ end
+ end
+
+ return lines
+end
+
+local function patch_version_c()
+ local lines = gen_version_c_lines()
+
+ nvim.nvim_command('silent noswapfile noautocmd edit src/nvim/version.c')
+ nvim.nvim_command('/static const int included_patches')
+ -- Delete the existing lines.
+ nvim.nvim_command('silent normal! j0d/};\rk')
+ -- Insert the lines.
+ nvim.nvim_call_function('append', {
+ nvim.nvim_eval('line(".")'),
+ lines,
+ })
+ nvim.nvim_command('silent write')
+end
+
+patch_version_c()
diff --git a/scripts/windows.ti b/scripts/windows.ti
new file mode 100644
index 0000000000..4f4832b786
--- /dev/null
+++ b/scripts/windows.ti
@@ -0,0 +1,71 @@
+libuv+basekey|vt100 base function key for libuv,
+ kb2=\E[G, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+ kdch1=\E[3~, kend=\E[4~, kf1=\E[[A, kf10=\E[21~,
+ kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~,
+ kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~,
+ kf19=\E[33~, kf2=\E[[B, kf20=\E[34~, kf3=\E[[C, kf4=\E[[D,
+ kf5=\E[[E, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
+ khome=\E[1~, kich1=\E[2~, knp=\E[6~, kpp=\E[5~,
+
+libuv+exkey|vt100 extend function key for libuv,
+ kf21=\E[23$, kf22=\E[24$, kf23=\E[11\^, kf24=\E[12\^,
+ kf25=\E[13\^, kf26=\E[14\^, kf27=\E[15\^, kf28=\E[17\^,
+ kf29=\E[18\^, kf30=\E[19\^, kf31=\E[20\^, kf32=\E[21\^,
+ kf33=\E[23\^, kf34=\E[24\^, kf35=\E[25\^, kf36=\E[26\^,
+ kf41=\E[32\^, kf42=\E[33\^, kf43=\E[34\^, kf44=\E[23@,
+ kf37=\E[28\^, kf38=\E[29\^, kf39=\E[31\^, kf45=\E[24@,
+ kDC=\E[3;2~, kEND=\E[4;2~, kHOM=\E[1;2~, kIC=\E[2;2~,
+ kLFT=\E[1;2D, kNXT=\E[6;2~, kPRV=\E[5;2~, kRIT=\E[1;2C,
+
+win32con|ANSI emulation for libuv on legacy console,
+ hs@, fsl@, tsl@, xon@, acsc@, rmacs@, smacs@, dch@, dch1@, dl@, dl1@,
+ ich@, ich1@, il@, il1@, ind@, invis@, ri@, rmir@, rs1@, rmul@, smir@,
+ smul@, smpch@, u6@, u7@, u8@, u9@,
+ sgr=\E[0%?%p1%t;7%;%?%p3%t;7%;%?%p6%t;1%;m, sgr0=\E[0m,
+ Se=\E[0 q, Ss=\E[%p1%d q,
+ use=cygwin, use=libuv+exkey,
+
+conemu|ANIS X3.64 and Xterm 256 colors for ConEmu with libuv,
+ ccc@, mc5i@, xenl@, acsc@, rmacs@, smacs@, blink@, cbt@,
+ cvvis@, cnorm=\E[?25h, cud1=\E[B, dim@, flash@, hts@, initc@, invis@, is2@,
+ kf46@, kf47@, kf48@, kf49@, kf50@, kf51@, kf52@, kf53@, kf54@,
+ kf55@, kf56@, kf57@, kf58@, kf59@, kf60@, kf61@, kf62@, kf63@, kmous@,
+ mc0@, mc4@, mc5@, meml@, memu@, oc@, rmam@, rmcup=\E[?1049l,
+ smcup=\E[?1049h, rmir@, rmkx@, rmm@, rs1@, rs2@,
+ setab=\E[48;5;%p1%dm, setaf=\E[38;5;%p1%dm,
+ sgr=\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p6%t;1%;m,
+ sgr0=\E[0m, smam@, smir@, smkx@, smm@, tbc@, u6@, u7@, u8@, u9@,
+ Cr@, Cs@, Ms@, XM@, kDC3@, kDC4@, kDC5@, kDC6@, kDC7@,
+ kDN@, kDN3@, kDN4@, kDN5@, kDN6@, kDN7@,
+ kEND3@, kEND4@, kEND5@, kEND6@, kEND7@,
+ kHOM3@, kHOM4@, kHOM5@, kHOM6@, kHOM7@,
+ kIC3@, kIC4@, kIC5@, kIC6@, kIC7@,
+ kLFT3@, kLFT4@, kLFT5@, kLFT6@, kLFT7@,
+ kNXT3@, kNXT4@, kNXT5@, kNXT6@, kNXT7@,
+ kPRV3@, kPRV4@, kPRV5@, kPRV6@, kPRV7@,
+ kRIT3@, kRIT4@, kRIT5@, kRIT6@, kRIT7@,
+ kUP3@, kUP4@, kUP5@, kUP6@, kUP7@, rmxx@, smxx@, xm@,
+ use=libuv+basekey, use=libuv+exkey, use=xterm+256color, use=xterm-new,
+
+vtpcon|ANIS emulation for console virtual terminal sequence with libuv,
+ ccc@, mc5i@, xenl@, blink@, acsc=jjkkllmmnnqqttuuvvwwxx,
+ cvvis@, cud1=\E[B, dim@, flash@,
+ initc=\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E,
+ invis@, is2=\E[!p\E[?3l,
+ kf46@, kf47@, kf48@, kf49@, kf50@, kf51@, kf52@, kf53@, kf54@,
+ kf55@, kf56@, kf57@, kf58@, kf59@, kf60@, kf61@, kf62@, kf63@, kmous@,
+ mc0@, mc4@, mc5@, meml@, memu@, oc@, rmam@, rmcup=\E[?1049l,
+ smcup=\E[?1049h, rmir@, rmkx@, rmm@, rs1@, rs2@,
+ sgr=\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p6%t;1%;m,
+ sgr0=\E[0m, smam@, smir@, smkx@, smm@, tbc@, u6@, u7@, u8@, u9@,
+ Cr@, Cs@, Ms@, XM@, kDC3@, kDC4@, kDC5@, kDC6@, kDC7@,
+ kDN@, kDN3@, kDN4@, kDN5@, kDN6@, kDN7@,
+ kEND3@, kEND4@, kEND5@, kEND6@, kEND7@,
+ kHOM3@, kHOM4@, kHOM5@, kHOM6@, kHOM7@,
+ kIC3@, kIC4@, kIC5@, kIC6@, kIC7@,
+ kLFT3@, kLFT4@, kLFT5@, kLFT6@, kLFT7@,
+ kNXT3@, kNXT4@, kNXT5@, kNXT6@, kNXT7@,
+ kPRV3@, kPRV4@, kPRV5@, kPRV6@, kPRV7@,
+ kRIT3@, kRIT4@, kRIT5@, kRIT6@, kRIT7@,
+ kUP3@, kUP4@, kUP5@, kUP6@, kUP7@, rmxx@, smxx@, xm@,
+ use=libuv+basekey, use=libuv+exkey, use=xterm+256color, use=xterm-new,
diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml
new file mode 100644
index 0000000000..81ffb9adf3
--- /dev/null
+++ b/snap/snapcraft.yaml
@@ -0,0 +1,41 @@
+name: neovim
+version: git
+summary: Vim-fork focused on extensibility and agility.
+description: |
+ Neovim is a project that seeks to aggressively refactor Vim in order to:
+
+ Simplify maintenance and encourage contributions
+ Split the work between multiple developers
+ Enable the implementation of new/modern user interfaces without any modifications to the core source
+ Improve extensibility with a new plugin architecture
+ For lots more details, see the wiki!
+confinement: classic
+
+apps:
+ neovim:
+ command: usr/local/bin/nvim
+ plugs: [network, network-bind, x11]
+ environment:
+ HOME: /home/$USER
+ VIM: $SNAP/usr/local/share/nvim/runtime
+
+parts:
+ neovim:
+ source: .
+ plugin: make
+ make-parameters:
+ - CMAKE_BUILD_TYPE=Release
+ build-packages:
+ - ninja-build
+ - libtool
+ - libtool-bin
+ - autoconf
+ - automake
+ - cmake
+ - g++
+ - pkg-config
+ - unzip
+ snap:
+ - usr/local/bin
+ - usr/local/share/nvim
+ - -usr/local/share/man
diff --git a/src/.asan-blacklist b/src/.asan-blacklist
index 63558170b3..928d81bd5a 100644
--- a/src/.asan-blacklist
+++ b/src/.asan-blacklist
@@ -1,3 +1,3 @@
-# libuv queue.h pointer arithmetic is not accepted by asan
-fun:queue_node_data
-fun:dictwatcher_node_data
+# multiqueue.h pointer arithmetic is not accepted by asan
+fun:multiqueue_node_data
+fun:tv_dict_watcher_node_data
diff --git a/src/.valgrind.supp b/src/.valgrind.supp
index 8b630fcaaf..cce22bd632 100644
--- a/src/.valgrind.supp
+++ b/src/.valgrind.supp
@@ -10,7 +10,7 @@
Memcheck:Leak
fun:malloc
fun:uv_spawn
- fun:pipe_process_spawn
+ fun:libuv_process_spawn
fun:process_spawn
fun:job_start
}
diff --git a/src/clint.py b/src/clint.py
index efc5f18378..34af5d15fd 100755
--- a/src/clint.py
+++ b/src/clint.py
@@ -49,6 +49,7 @@ from __future__ import unicode_literals
import codecs
import copy
+import fileinput
import getopt
import math # for log
import os
@@ -65,7 +66,7 @@ _USAGE = """
Syntax: clint.py [--verbose=#] [--output=vs7] [--filter=-x,+y,...]
[--counting=total|toplevel|detailed] [--root=subdir]
[--linelength=digits] [--record-errors=file]
- [--suppress-errors=file]
+ [--suppress-errors=file] [--stdin-filename=filename]
<file> [file] ...
The style guidelines this tries to follow are those in
@@ -167,6 +168,9 @@ Syntax: clint.py [--verbose=#] [--output=vs7] [--filter=-x,+y,...]
suppress-errors=file
Errors listed in the given file will not be reported.
+
+ stdin-filename=filename
+ Use specified filename when reading from stdin (file "-").
"""
# We categorize each error message we print. Here are the categories.
@@ -182,6 +186,7 @@ _ERROR_CATEGORIES = [
'build/include_order',
'build/printf_format',
'build/storage_class',
+ 'build/useless_fattr',
'readability/alt_tokens',
'readability/bool',
'readability/braces',
@@ -200,6 +205,7 @@ _ERROR_CATEGORIES = [
'runtime/printf',
'runtime/printf_format',
'runtime/threadsafe_fn',
+ 'runtime/deprecated',
'syntax/parenthesis',
'whitespace/alignment',
'whitespace/blank_line',
@@ -569,9 +575,10 @@ class _CppLintState(object):
def PrintErrorCounts(self):
"""Print a summary of errors by category, and the total."""
for category, count in self.errors_by_category.items():
- sys.stderr.write('Category \'%s\' errors found: %d\n' %
+ sys.stdout.write('Category \'%s\' errors found: %d\n' %
(category, count))
- sys.stderr.write('Total errors found: %d\n' % self.error_count)
+ if self.error_count:
+ sys.stdout.write('Total errors found: %d\n' % self.error_count)
def SuppressErrorsFrom(self, fname):
"""Open file and read a list of suppressed errors from it"""
@@ -818,13 +825,13 @@ def Error(filename, linenum, category, confidence, message):
if _ShouldPrintError(category, confidence, linenum):
_cpplint_state.IncrementErrorCount(category)
if _cpplint_state.output_format == 'vs7':
- sys.stderr.write('%s(%s): %s [%s] [%d]\n' % (
+ sys.stdout.write('%s(%s): %s [%s] [%d]\n' % (
filename, linenum, message, category, confidence))
elif _cpplint_state.output_format == 'eclipse':
- sys.stderr.write('%s:%s: warning: %s [%s] [%d]\n' % (
+ sys.stdout.write('%s:%s: warning: %s [%s] [%d]\n' % (
filename, linenum, message, category, confidence))
else:
- sys.stderr.write('%s:%s: %s [%s] [%d]\n' % (
+ sys.stdout.write('%s:%s: %s [%s] [%d]\n' % (
filename, linenum, message, category, confidence))
@@ -1224,6 +1231,10 @@ def CheckForHeaderGuard(filename, lines, error):
lines: An array of strings, each representing a line of the file.
error: The function to call with any errors found.
"""
+ if filename.endswith('.c.h') or FileInfo(filename).RelativePath() in set((
+ 'func_attr.h',
+ )):
+ return
cppvar = GetHeaderGuardCPPVariable(filename)
@@ -2117,8 +2128,10 @@ def CheckExpressionAlignment(filename, clean_lines, linenum, error, startpos=0):
+ (level_starts[depth][2] == '{')):
if depth not in ignore_error_levels:
error(filename, linenum, 'whitespace/alignment', 2,
- 'Inner expression should be aligned '
- 'as opening brace + 1 (+ 2 in case of {)')
+ ('Inner expression should be aligned '
+ 'as opening brace + 1 (+ 2 in case of {{). '
+ 'Relevant opening is on line {0!r}').format(
+ level_starts[depth][3]))
prev_line_start = pos
elif brace == 'e':
pass
@@ -2135,7 +2148,8 @@ def CheckExpressionAlignment(filename, clean_lines, linenum, error, startpos=0):
ignore_error_levels.add(depth)
line_ended_with_opening = (
pos == len(line) - 2 * (line.endswith(' \\')) - 1)
- level_starts[depth] = (pos, line_ended_with_opening, brace)
+ level_starts[depth] = (pos, line_ended_with_opening, brace,
+ linenum)
if line_ended_with_opening:
depth_line_starts[depth] = (prev_line_start, brace)
else:
@@ -2268,11 +2282,14 @@ def CheckSpacing(filename, clean_lines, linenum, nesting_state, error):
# //!< Header comment
# or they begin with multiple slashes followed by a space:
# //////// Header comment
+ # or they are Vim {{{ fold markers
match = (Search(r'[=/-]{4,}\s*$', line[commentend:]) or
Search(r'^/$', line[commentend:]) or
Search(r'^!< ', line[commentend:]) or
Search(r'^/< ', line[commentend:]) or
- Search(r'^/+ ', line[commentend:]))
+ Search(r'^/+ ', line[commentend:]) or
+ Search(r'^(?:\{{3}|\}{3})\d*(?: |$)',
+ line[commentend:]))
if not match:
error(filename, linenum, 'whitespace/comments', 4,
'Should have a space between // and comment')
@@ -2516,6 +2533,13 @@ def CheckSpacing(filename, clean_lines, linenum, nesting_state, error):
cast_line = re.sub(r'^# *define +\w+\([^)]*\)', '', line)
match = Search(r'(?<!\bkvec_t)'
+ r'(?<!\bkvec_withinit_t)'
+ r'(?<!\bklist_t)'
+ r'(?<!\bkliter_t)'
+ r'(?<!\bkhash_t)'
+ r'(?<!\bkbtree_t)'
+ r'(?<!\bkbitr_t)'
+ r'(?<!\bPMap)'
r'\((?:const )?(?:struct )?[a-zA-Z_]\w*(?: *\*(?:const)?)*\)'
r' +'
r'-?(?:\*+|&)?(?:\w+|\+\+|--|\()', cast_line)
@@ -2560,22 +2584,51 @@ def CheckBraces(filename, clean_lines, linenum, error):
line = clean_lines.elided[linenum] # get rid of comments and strings
- if not (filename.endswith('.c') or filename.endswith('.h')):
- if Match(r'\s*{\s*$', line):
- # We allow an open brace to start a line in the case where someone
- # is using braces in a block to explicitly create a new scope, which
- # is commonly used to control the lifetime of stack-allocated
- # variables. Braces are also used for brace initializers inside
- # function calls. We don't detect this perfectly: we just don't
- # complain if the last non-whitespace character on the previous
- # non-blank line is ',', ';', ':', '(', '{', or '}', or if the
- # previous line starts a preprocessor block.
- prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0]
- if (not Search(r'[,;:}{(]\s*$', prevline) and
- not Match(r'\s*#', prevline)):
- error(filename, linenum, 'whitespace/braces', 4,
- '{ should almost always be at the end'
- ' of the previous line')
+ if Match(r'\s+{\s*$', line):
+ # We allow an open brace to start a line in the case where someone
+ # is using braces in a block to explicitly create a new scope, which
+ # is commonly used to control the lifetime of stack-allocated
+ # variables. Braces are also used for brace initializers inside
+ # function calls. We don't detect this perfectly: we just don't
+ # complain if the last non-whitespace character on the previous
+ # non-blank line is ',', ';', ':', '(', '{', or '}', or if the
+ # previous line starts a preprocessor block.
+ prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0]
+ if (not Search(r'[,;:}{(]\s*$', prevline) and
+ not Match(r'\s*#', prevline)):
+ error(filename, linenum, 'whitespace/braces', 4,
+ '{ should almost always be at the end'
+ ' of the previous line')
+
+ # Brace must appear after function signature, but on the *next* line
+ if Match(r'^(?:\w+(?: ?\*+)? )+\w+\(', line):
+ pos = line.find('(')
+ (endline, end_linenum, endpos) = CloseExpression(
+ clean_lines, linenum, pos)
+ if endline.endswith('{'):
+ error(filename, end_linenum, 'readability/braces', 5,
+ 'Brace starting function body must be placed on its own line')
+ else:
+ func_start_linenum = end_linenum + 1
+ while not clean_lines.lines[func_start_linenum] == '{':
+ attrline = Match(r'^((?!# *define).*?)(?:FUNC_ATTR|FUNC_API|REAL_FATTR)_\w+(?:\(\d+(, \d+)*\))?',
+ clean_lines.lines[func_start_linenum])
+ if attrline:
+ if len(attrline.group(1)) != 2:
+ error(filename, func_start_linenum,
+ 'whitespace/indent', 5,
+ 'Function attribute line should have 2-space '
+ 'indent')
+
+ func_start_linenum += 1
+ else:
+ func_start = clean_lines.lines[func_start_linenum]
+ if not func_start.startswith('enum ') and func_start.endswith('{'):
+ error(filename, func_start_linenum,
+ 'readability/braces', 5,
+ 'Brace starting function body must be placed '
+ 'after the function signature')
+ break
# An else clause should be on the same line as the preceding closing brace.
# If there is no preceding closing brace, there should be one.
@@ -3001,9 +3054,10 @@ def CheckIncludeLine(filename, clean_lines, linenum, include_state, error):
include = match.group(2)
is_system = (match.group(1) == '<')
if include in include_state:
- error(filename, linenum, 'build/include', 4,
- '"%s" already included at %s:%s' %
- (include, filename, include_state[include]))
+ if is_system or not include.endswith('.c.h'):
+ error(filename, linenum, 'build/include', 4,
+ '"%s" already included at %s:%s' %
+ (include, filename, include_state[include]))
else:
include_state[include] = linenum
@@ -3140,11 +3194,28 @@ def CheckLanguage(filename, clean_lines, linenum, file_extension,
# Check if some verboten C functions are being used.
if Search(r'\bsprintf\b', line):
error(filename, linenum, 'runtime/printf', 5,
- 'Never use sprintf. Use snprintf instead.')
- match = Search(r'\b(strcpy|strcat)\b', line)
+ 'Use snprintf instead of sprintf.')
+ match = Search(r'\b(strncpy|STRNCPY)\b', line)
+ if match:
+ error(filename, linenum, 'runtime/printf', 4,
+ 'Use xstrlcpy or snprintf instead of %s (unless this is from Vim)'
+ % match.group(1))
+ match = Search(r'\b(strcpy)\b', line)
+ if match:
+ error(filename, linenum, 'runtime/printf', 4,
+ 'Use xstrlcpy or snprintf instead of %s' % match.group(1))
+ match = Search(r'\b(STRNCAT|strncat|strcat|vim_strcat)\b', line)
if match:
error(filename, linenum, 'runtime/printf', 4,
- 'Almost always, snprintf is better than %s' % match.group(1))
+ 'Use xstrlcat or snprintf instead of %s' % match.group(1))
+ if not Search(r'eval/typval\.[ch]$', filename):
+ match = Search(r'(?:\.|->)'
+ r'(?:lv_(?:first|last|refcount|len|watch|idx(?:_item)?'
+ r'|copylist|lock)'
+ r'|li_(?:next|prev|tv))\b', line)
+ if match:
+ error(filename, linenum, 'runtime/deprecated', 4,
+ 'Accessing list_T internals directly is prohibited')
# Check for suspicious usage of "if" like
# } if (a == b) {
@@ -3232,6 +3303,13 @@ def CheckLanguage(filename, clean_lines, linenum, file_extension,
error(filename, linenum, 'readability/bool', 4,
'Use %s instead of %s.' % (token.lower(), token))
+ # Detect MAYBE
+ match = Search(r'\b(MAYBE)\b', line)
+ if match:
+ token = match.group(1)
+ error(filename, linenum, 'readability/bool', 4,
+ 'Use kNONE from TriState instead of %s.' % token)
+
# Detect preincrement/predecrement
match = Match(r'^\s*(?:\+\+|--)', line)
if match:
@@ -3382,10 +3460,12 @@ def ProcessFile(filename, vlevel, extra_check_functions=[]):
# is processed.
if filename == '-':
- lines = codecs.StreamReaderWriter(sys.stdin,
- codecs.getreader('utf8'),
- codecs.getwriter('utf8'),
- 'replace').read().split('\n')
+ stdin = sys.stdin.read()
+ if sys.version_info < (3, 0):
+ stdin = stdin.decode('utf8')
+ lines = stdin.split('\n')
+ if _cpplint_state.stdin_filename is not None:
+ filename = _cpplint_state.stdin_filename
else:
lines = codecs.open(
filename, 'r', 'utf8', 'replace').read().split('\n')
@@ -3408,8 +3488,9 @@ def ProcessFile(filename, vlevel, extra_check_functions=[]):
# When reading from stdin, the extension is unknown, so no cpplint tests
# should rely on the extension.
if filename != '-' and file_extension not in _valid_extensions:
- sys.stderr.write('Ignoring %s; not a valid file name '
- '(%s)\n' % (filename, ', '.join(_valid_extensions)))
+ sys.stderr.write('Ignoring {}; only linting {} files\n'.format(
+ filename,
+ ', '.join('.{}'.format(ext) for ext in _valid_extensions)))
else:
ProcessFileData(filename, file_extension, lines, Error,
extra_check_functions)
@@ -3465,7 +3546,9 @@ def ParseArguments(args):
'linelength=',
'extensions=',
'record-errors=',
- 'suppress-errors='])
+ 'suppress-errors=',
+ 'stdin-filename=',
+ ])
except getopt.GetoptError:
PrintUsage('Invalid arguments.')
@@ -3475,6 +3558,7 @@ def ParseArguments(args):
counting_style = ''
record_errors_file = None
suppress_errors_file = None
+ stdin_filename = None
for (opt, val) in opts:
if opt == '--help':
@@ -3511,6 +3595,8 @@ def ParseArguments(args):
record_errors_file = val
elif opt == '--suppress-errors':
suppress_errors_file = val
+ elif opt == '--stdin-filename':
+ stdin_filename = val
if not filenames:
PrintUsage('No files were specified.')
@@ -3521,6 +3607,7 @@ def ParseArguments(args):
_SetCountingStyle(counting_style)
_SuppressErrorsFrom(suppress_errors_file)
_RecordErrorsTo(record_errors_file)
+ _cpplint_state.stdin_filename = stdin_filename
return filenames
@@ -3539,7 +3626,7 @@ def main():
if __name__ == '__main__':
main()
-# vim: ts=4 sts=4 sw=4
+# vim: ts=4 sts=4 sw=4 foldmarker=โ–ถ,โ–ฒ
# Ignore "too complex" warnings when using pymode.
# pylama:ignore=C901
diff --git a/src/coverity-model.c b/src/coverity-model.c
new file mode 100644
index 0000000000..3c38e4ae4d
--- /dev/null
+++ b/src/coverity-model.c
@@ -0,0 +1,70 @@
+// Coverity Scan model
+//
+// This is a modeling file for Coverity Scan. Modeling helps to avoid false
+// positives.
+//
+// - A model file can't import any header files.
+// - Therefore only some built-in primitives like int, char and void are
+// available but not wchar_t, NULL etc.
+// - Modeling doesn't need full structs and typedefs. Rudimentary structs
+// and similar types are sufficient.
+// - An uninitialized local pointer is not an error. It signifies that the
+// variable could be either NULL or have some data.
+//
+// Coverity Scan doesn't pick up modifications automatically. The model file
+// must be uploaded by an admin in the analysis settings of
+// http://scan.coverity.com/projects/neovim-neovim
+//
+
+// Issue 105985
+//
+// Teach coverity that uv_pipe_open saves fd on success (0 return value)
+// and doesn't save it on failure (return value != 0).
+
+struct uv_pipe_s {
+ int something;
+};
+
+int uv_pipe_open(struct uv_pipe_s *handle, int fd)
+{
+ int result;
+ if (result == 0) {
+ __coverity_escape__(fd);
+ }
+ return result;
+}
+
+// Issue 2422
+//
+// Teach coverity about jemalloc functions, so that it understands
+// they are equivalent to malloc ones.
+
+void *je_malloc(size_t size)
+{
+ return __coverity_alloc__(size);
+}
+
+void je_free(void *ptr)
+{
+ __coverity_free__(ptr);
+}
+
+void *je_calloc(size_t count, size_t size)
+{
+ return je_malloc(count * size);
+}
+
+void *je_realloc(void *ptr, size_t size)
+{
+ je_free(ptr);
+ return je_malloc(size);
+}
+
+// Hint Coverity that adding item to d avoids losing track
+// of the memory allocated for item.
+typedef struct {} dictitem_T;
+typedef struct {} dict_T;
+int tv_dict_add(dict_T *const d, dictitem_T *const item)
+{
+ __coverity_escape__(item);
+}
diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt
index d80add2835..a2c4e677d4 100644
--- a/src/nvim/CMakeLists.txt
+++ b/src/nvim/CMakeLists.txt
@@ -10,38 +10,77 @@ if(USE_GCOV)
endif()
endif()
+if(WIN32)
+ # tell MinGW compiler to enable wmain
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -municode")
+elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -framework CoreFoundation")
+ set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -framework CoreFoundation")
+endif()
+
+set(TOUCHES_DIR ${PROJECT_BINARY_DIR}/touches)
+set(GENERATOR_DIR ${CMAKE_CURRENT_LIST_DIR}/generators)
set(GENERATED_DIR ${PROJECT_BINARY_DIR}/src/nvim/auto)
-set(DISPATCH_GENERATOR ${PROJECT_SOURCE_DIR}/scripts/msgpack-gen.lua)
-file(GLOB API_HEADERS api/*.h)
-file(GLOB MSGPACK_RPC_HEADERS msgpack_rpc/*.h)
-set(MSGPACK_DISPATCH ${GENERATED_DIR}/msgpack_dispatch.c)
-set(HEADER_GENERATOR ${PROJECT_SOURCE_DIR}/scripts/gendeclarations.lua)
+set(API_DISPATCH_GENERATOR ${GENERATOR_DIR}/gen_api_dispatch.lua)
+set(API_UI_EVENTS_GENERATOR ${GENERATOR_DIR}/gen_api_ui_events.lua)
+set(API_METADATA ${PROJECT_BINARY_DIR}/api_metadata.mpack)
+set(FUNCS_DATA ${PROJECT_BINARY_DIR}/funcs_data.mpack)
+set(MSGPACK_LUA_C_BINDINGS ${GENERATED_DIR}/msgpack_lua_c_bindings.generated.c)
+set(HEADER_GENERATOR ${GENERATOR_DIR}/gen_declarations.lua)
set(GENERATED_INCLUDES_DIR ${PROJECT_BINARY_DIR}/include)
+set(GENERATED_API_DISPATCH ${GENERATED_DIR}/api/private/dispatch_wrappers.generated.h)
+set(GENERATED_FUNCS_METADATA ${GENERATED_DIR}/api/private/funcs_metadata.generated.h)
+set(GENERATED_UI_EVENTS ${GENERATED_DIR}/ui_events.generated.h)
+set(GENERATED_UI_EVENTS_CALL ${GENERATED_DIR}/ui_events_call.generated.h)
+set(GENERATED_UI_EVENTS_REMOTE ${GENERATED_DIR}/ui_events_remote.generated.h)
+set(GENERATED_UI_EVENTS_BRIDGE ${GENERATED_DIR}/ui_events_bridge.generated.h)
+set(GENERATED_UI_EVENTS_METADATA ${GENERATED_DIR}/api/private/ui_events_metadata.generated.h)
set(GENERATED_EX_CMDS_ENUM ${GENERATED_INCLUDES_DIR}/ex_cmds_enum.generated.h)
set(GENERATED_EX_CMDS_DEFS ${GENERATED_DIR}/ex_cmds_defs.generated.h)
+set(GENERATED_FUNCS ${GENERATED_DIR}/funcs.generated.h)
set(GENERATED_EVENTS_ENUM ${GENERATED_INCLUDES_DIR}/auevents_enum.generated.h)
set(GENERATED_EVENTS_NAMES_MAP ${GENERATED_DIR}/auevents_name_map.generated.h)
set(GENERATED_OPTIONS ${GENERATED_DIR}/options.generated.h)
-set(EX_CMDS_GENERATOR ${PROJECT_SOURCE_DIR}/scripts/genex_cmds.lua)
-set(EVENTS_GENERATOR ${PROJECT_SOURCE_DIR}/scripts/gen_events.lua)
-set(OPTIONS_GENERATOR ${PROJECT_SOURCE_DIR}/scripts/genoptions.lua)
-set(EVENTS_LIST_FILE ${PROJECT_SOURCE_DIR}/src/nvim/auevents.lua)
-set(EX_CMDS_DEFS_FILE ${PROJECT_SOURCE_DIR}/src/nvim/ex_cmds.lua)
-set(OPTIONS_LIST_FILE ${PROJECT_SOURCE_DIR}/src/nvim/options.lua)
-set(UNICODE_TABLES_GENERATOR ${PROJECT_SOURCE_DIR}/scripts/genunicodetables.lua)
+set(EX_CMDS_GENERATOR ${GENERATOR_DIR}/gen_ex_cmds.lua)
+set(FUNCS_GENERATOR ${GENERATOR_DIR}/gen_eval.lua)
+set(EVENTS_GENERATOR ${GENERATOR_DIR}/gen_events.lua)
+set(OPTIONS_GENERATOR ${GENERATOR_DIR}/gen_options.lua)
+set(UNICODE_TABLES_GENERATOR ${GENERATOR_DIR}/gen_unicode_tables.lua)
set(UNICODE_DIR ${PROJECT_SOURCE_DIR}/unicode)
-set(UNICODEDATA_FILE ${UNICODE_DIR}/UnicodeData.txt)
-set(CASEFOLDING_FILE ${UNICODE_DIR}/CaseFolding.txt)
-set(EASTASIANWIDTH_FILE ${UNICODE_DIR}/EastAsianWidth.txt)
set(GENERATED_UNICODE_TABLES ${GENERATED_DIR}/unicode_tables.generated.h)
+set(VIM_MODULE_FILE ${GENERATED_DIR}/lua/vim_module.generated.h)
+set(VIM_MODULE_SOURCE ${PROJECT_SOURCE_DIR}/src/nvim/lua/vim.lua)
+set(CHAR_BLOB_GENERATOR ${GENERATOR_DIR}/gen_char_blob.lua)
+set(LINT_SUPPRESS_FILE ${PROJECT_BINARY_DIR}/errors.json)
+set(LINT_SUPPRESS_URL_BASE "https://raw.githubusercontent.com/neovim/doc/gh-pages/reports/clint")
+set(LINT_SUPPRESS_URL "${LINT_SUPPRESS_URL_BASE}/errors.json")
+set(LINT_PRG ${PROJECT_SOURCE_DIR}/src/clint.py)
+set(DOWNLOAD_SCRIPT ${PROJECT_SOURCE_DIR}/cmake/Download.cmake)
+set(LINT_SUPPRESSES_ROOT ${PROJECT_BINARY_DIR}/errors)
+set(LINT_SUPPRESSES_URL "${LINT_SUPPRESS_URL_BASE}/errors.tar.gz")
+set(LINT_SUPPRESSES_ARCHIVE ${LINT_SUPPRESSES_ROOT}/errors.tar.gz)
+set(LINT_SUPPRESSES_TOUCH_FILE "${TOUCHES_DIR}/unpacked-clint-errors-archive")
+set(LINT_SUPPRESSES_INSTALL_SCRIPT "${PROJECT_SOURCE_DIR}/cmake/InstallClintErrors.cmake")
+
+file(GLOB UNICODE_FILES ${UNICODE_DIR}/*.txt)
+file(GLOB API_HEADERS api/*.h)
+list(REMOVE_ITEM API_HEADERS ${CMAKE_CURRENT_LIST_DIR}/api/ui_events.in.h)
+file(GLOB MSGPACK_RPC_HEADERS msgpack_rpc/*.h)
include_directories(${GENERATED_DIR})
+include_directories(${CACHED_GENERATED_DIR})
include_directories(${GENERATED_INCLUDES_DIR})
+file(MAKE_DIRECTORY ${TOUCHES_DIR})
file(MAKE_DIRECTORY ${GENERATED_DIR})
file(MAKE_DIRECTORY ${GENERATED_INCLUDES_DIR})
+file(MAKE_DIRECTORY ${LINT_SUPPRESSES_ROOT})
+file(MAKE_DIRECTORY ${LINT_SUPPRESSES_ROOT}/src)
-file(GLOB NEOVIM_SOURCES *.c)
+file(GLOB NVIM_SOURCES *.c)
+file(GLOB NVIM_HEADERS *.h)
+file(GLOB XDIFF_SOURCES xdiff/*.c)
+file(GLOB XDIFF_HEADERS xdiff/*.h)
foreach(subdir
os
@@ -51,6 +90,9 @@ foreach(subdir
tui
event
eval
+ lua
+ viml
+ viml/parser
)
if(${subdir} MATCHES "tui" AND NOT FEAT_TUI)
continue()
@@ -59,18 +101,21 @@ foreach(subdir
file(MAKE_DIRECTORY ${GENERATED_DIR}/${subdir})
file(MAKE_DIRECTORY ${GENERATED_INCLUDES_DIR}/${subdir})
file(GLOB sources ${subdir}/*.c)
- list(APPEND NEOVIM_SOURCES ${sources})
+ file(GLOB headers ${subdir}/*.h)
+ list(APPEND NVIM_SOURCES ${sources})
+ list(APPEND NVIM_HEADERS ${headers})
endforeach()
-file(GLOB_RECURSE NEOVIM_HEADERS *.h)
file(GLOB UNIT_TEST_FIXTURES ${PROJECT_SOURCE_DIR}/test/unit/fixtures/*.c)
# Sort file lists to ensure generated files are created in the same order from
# build to build.
-list(SORT NEOVIM_SOURCES)
-list(SORT NEOVIM_HEADERS)
+list(SORT NVIM_SOURCES)
+list(SORT NVIM_HEADERS)
-foreach(sfile ${NEOVIM_SOURCES})
+list(APPEND LINT_NVIM_SOURCES ${NVIM_SOURCES} ${NVIM_HEADERS})
+
+foreach(sfile ${NVIM_SOURCES})
get_filename_component(f ${sfile} NAME)
if(${f} MATCHES "^(regexp_nfa.c)$")
list(APPEND to_remove ${sfile})
@@ -78,13 +123,15 @@ foreach(sfile ${NEOVIM_SOURCES})
if(WIN32 AND ${f} MATCHES "^(pty_process_unix.c)$")
list(APPEND to_remove ${sfile})
endif()
+ if(NOT WIN32 AND ${f} MATCHES "^(pty_process_win.c)$")
+ list(APPEND to_remove ${sfile})
+ endif()
endforeach()
-list(REMOVE_ITEM NEOVIM_SOURCES ${to_remove})
+list(REMOVE_ITEM NVIM_SOURCES ${to_remove})
-# Handle legacy files that don't yet pass -Wconversion.
+# Legacy files that do not yet pass -Wconversion.
set(CONV_SOURCES
- buffer.c
diff.c
edit.c
eval.c
@@ -99,28 +146,39 @@ set(CONV_SOURCES
screen.c
search.c
spell.c
+ spellfile.c
syntax.c
tag.c
window.c)
-
foreach(sfile ${CONV_SOURCES})
- if(NOT EXISTS "${PROJECT_SOURCE_DIR}/src/nvim/${sfile}")
+ if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/${sfile}")
message(FATAL_ERROR "${sfile} doesn't exist (it was added to CONV_SOURCES)")
endif()
endforeach()
+# xdiff: inlined external project, we don't maintain it. #9306
+list(APPEND CONV_SOURCES ${XDIFF_SOURCES})
if(NOT MSVC)
set_source_files_properties(
${CONV_SOURCES} PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -Wno-conversion")
+ # gperf generates ANSI-C with incorrect linkage, ignore it.
+ check_c_compiler_flag(-Wno-static-in-inline HAS_WNO_STATIC_IN_INLINE_FLAG)
+ if(HAS_WNO_STATIC_IN_INLINE_FLAG)
+ set_source_files_properties(
+ eval.c PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -Wno-static-in-inline -Wno-conversion")
+ else()
+ set_source_files_properties(
+ eval.c PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -Wno-conversion")
+ endif()
endif()
-if(DEFINED MIN_LOG_LEVEL)
+if(NOT "${MIN_LOG_LEVEL}" MATCHES "^$")
add_definitions(-DMIN_LOG_LEVEL=${MIN_LOG_LEVEL})
endif()
get_directory_property(gen_cdefs COMPILE_DEFINITIONS)
foreach(gen_cdef ${gen_cdefs} DO_NOT_DEFINE_EMPTY_ATTRIBUTES)
- if(NOT "${gen_cdef}" MATCHES "INCLUDE_GENERATED_DECLARATIONS")
+ if(NOT ${gen_cdef} MATCHES "INCLUDE_GENERATED_DECLARATIONS")
list(APPEND gen_cflags "-D${gen_cdef}")
endif()
endforeach()
@@ -129,99 +187,185 @@ if(CLANG_ASAN_UBSAN OR CLANG_MSAN OR CLANG_TSAN)
endif()
get_directory_property(gen_includes INCLUDE_DIRECTORIES)
-foreach(gen_include ${gen_includes})
+foreach(gen_include ${gen_includes} ${LUA_PREFERRED_INCLUDE_DIRS})
list(APPEND gen_cflags "-I${gen_include}")
endforeach()
+if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_OSX_SYSROOT)
+ list(APPEND gen_cflags "-isysroot")
+ list(APPEND gen_cflags "${CMAKE_OSX_SYSROOT}")
+endif()
string(TOUPPER "${CMAKE_BUILD_TYPE}" build_type)
separate_arguments(C_FLAGS_ARRAY UNIX_COMMAND ${CMAKE_C_FLAGS})
separate_arguments(C_FLAGS_${build_type}_ARRAY UNIX_COMMAND ${CMAKE_C_FLAGS_${build_type}})
set(gen_cflags ${gen_cflags} ${C_FLAGS_${build_type}_ARRAY} ${C_FLAGS_ARRAY})
-foreach(sfile ${NEOVIM_SOURCES}
- "${PROJECT_SOURCE_DIR}/src/nvim/regexp_nfa.c")
+function(get_preproc_output varname iname)
+ if(MSVC)
+ set(${varname} /P /Fi${iname} PARENT_SCOPE)
+ else()
+ set(${varname} -E -o ${iname} PARENT_SCOPE)
+ endif()
+endfunction()
+
+# NVIM_GENERATED_FOR_HEADERS: generated headers to be included in headers
+# NVIM_GENERATED_FOR_SOURCES: generated headers to be included in sources
+# NVIM_GENERATED_SOURCES: generated source files
+# These lists must be mutually exclusive.
+foreach(sfile ${NVIM_SOURCES}
+ "${CMAKE_CURRENT_LIST_DIR}/regexp_nfa.c"
+ ${GENERATED_API_DISPATCH}
+ "${GENERATED_UI_EVENTS_CALL}"
+ "${GENERATED_UI_EVENTS_REMOTE}"
+ "${GENERATED_UI_EVENTS_BRIDGE}"
+ )
get_filename_component(full_d ${sfile} PATH)
- file(RELATIVE_PATH d "${PROJECT_SOURCE_DIR}/src/nvim" "${full_d}")
+ file(RELATIVE_PATH d "${CMAKE_CURRENT_LIST_DIR}" "${full_d}")
+ if(${d} MATCHES "^[.][.]|auto/")
+ file(RELATIVE_PATH d "${GENERATED_DIR}" "${full_d}")
+ endif()
get_filename_component(f ${sfile} NAME)
get_filename_component(r ${sfile} NAME_WE)
if(NOT ${d} EQUAL ".")
set(f "${d}/${f}")
set(r "${d}/${r}")
endif()
- set(gf1 "${GENERATED_DIR}/${r}.c.generated.h")
- set(gf2 "${GENERATED_INCLUDES_DIR}/${r}.h.generated.h")
- set(gf3 "${GENERATED_DIR}/${r}.i")
+ set(gf_c_h "${GENERATED_DIR}/${r}.c.generated.h")
+ set(gf_h_h "${GENERATED_INCLUDES_DIR}/${r}.h.generated.h")
+ set(gf_i "${GENERATED_DIR}/${r}.i")
- if(MSVC)
- set(PREPROC_OUTPUT /P /Fi${gf3})
- else()
- set(PREPROC_OUTPUT -E -o ${gf3})
- endif()
+ get_preproc_output(PREPROC_OUTPUT ${gf_i})
add_custom_command(
- OUTPUT "${gf1}" "${gf2}"
+ OUTPUT "${gf_c_h}" "${gf_h_h}"
COMMAND ${CMAKE_C_COMPILER} ${sfile} ${PREPROC_OUTPUT} ${gen_cflags} ${C_FLAGS_ARRAY}
- COMMAND "${LUA_PRG}" "${HEADER_GENERATOR}" "${sfile}" "${gf1}" "${gf2}" "${gf3}"
+ COMMAND "${LUA_PRG}" "${HEADER_GENERATOR}" "${sfile}" "${gf_c_h}" "${gf_h_h}" "${gf_i}"
DEPENDS "${HEADER_GENERATOR}" "${sfile}"
)
- list(APPEND NEOVIM_GENERATED_SOURCES "${gf1}")
- list(APPEND NEOVIM_GENERATED_SOURCES "${gf2}")
+ list(APPEND NVIM_GENERATED_FOR_SOURCES "${gf_c_h}")
+ list(APPEND NVIM_GENERATED_FOR_HEADERS "${gf_h_h}")
if(${d} MATCHES "^api$" AND NOT ${f} MATCHES "^api/helpers.c$")
- list(APPEND API_HEADERS ${gf2})
+ list(APPEND API_HEADERS ${gf_h_h})
endif()
endforeach()
add_custom_command(OUTPUT ${GENERATED_UNICODE_TABLES}
COMMAND ${LUA_PRG} ${UNICODE_TABLES_GENERATOR}
- ${UNICODEDATA_FILE}
- ${CASEFOLDING_FILE}
- ${EASTASIANWIDTH_FILE}
+ ${UNICODE_DIR}
${GENERATED_UNICODE_TABLES}
DEPENDS
${UNICODE_TABLES_GENERATOR}
- ${UNICODEDATA_FILE}
- ${CASEFOLDING_FILE}
- ${EASTASIANWIDTH_FILE}
+ ${UNICODE_FILES}
)
-add_custom_command(OUTPUT ${MSGPACK_DISPATCH}
- COMMAND ${LUA_PRG} ${DISPATCH_GENERATOR} ${API_HEADERS} ${MSGPACK_DISPATCH}
+add_custom_command(
+ OUTPUT ${GENERATED_API_DISPATCH} ${GENERATED_FUNCS_METADATA}
+ ${API_METADATA} ${MSGPACK_LUA_C_BINDINGS}
+ COMMAND ${LUA_PRG} ${API_DISPATCH_GENERATOR} ${CMAKE_CURRENT_LIST_DIR}
+ ${GENERATED_API_DISPATCH}
+ ${GENERATED_FUNCS_METADATA} ${API_METADATA}
+ ${MSGPACK_LUA_C_BINDINGS}
+ ${API_HEADERS}
DEPENDS
${API_HEADERS}
${MSGPACK_RPC_HEADERS}
- ${DISPATCH_GENERATOR}
+ ${API_DISPATCH_GENERATOR}
+ ${CMAKE_CURRENT_LIST_DIR}/api/dispatch_deprecated.lua
)
-list(APPEND NEOVIM_GENERATED_SOURCES
- "${PROJECT_BINARY_DIR}/config/auto/pathdef.c"
- "${MSGPACK_DISPATCH}"
+add_custom_command(
+ OUTPUT ${VIM_MODULE_FILE}
+ COMMAND ${LUA_PRG} ${CHAR_BLOB_GENERATOR} ${VIM_MODULE_SOURCE}
+ ${VIM_MODULE_FILE} vim_module
+ DEPENDS
+ ${CHAR_BLOB_GENERATOR}
+ ${VIM_MODULE_SOURCE}
+)
+
+list(APPEND NVIM_GENERATED_SOURCES
+ "${MSGPACK_LUA_C_BINDINGS}"
+)
+
+add_custom_command(
+ OUTPUT ${GENERATED_UI_EVENTS}
+ ${GENERATED_UI_EVENTS_CALL}
+ ${GENERATED_UI_EVENTS_REMOTE}
+ ${GENERATED_UI_EVENTS_BRIDGE}
+ ${GENERATED_UI_EVENTS_METADATA}
+ COMMAND ${LUA_PRG} ${API_UI_EVENTS_GENERATOR} ${CMAKE_CURRENT_LIST_DIR}
+ ${CMAKE_CURRENT_LIST_DIR}/api/ui_events.in.h
+ ${GENERATED_UI_EVENTS}
+ ${GENERATED_UI_EVENTS_CALL}
+ ${GENERATED_UI_EVENTS_REMOTE}
+ ${GENERATED_UI_EVENTS_BRIDGE}
+ ${GENERATED_UI_EVENTS_METADATA}
+ DEPENDS
+ ${API_UI_EVENTS_GENERATOR}
+ ${CMAKE_CURRENT_LIST_DIR}/api/ui_events.in.h
+)
+
+list(APPEND NVIM_GENERATED_FOR_HEADERS
"${GENERATED_EX_CMDS_ENUM}"
- "${GENERATED_EX_CMDS_DEFS}"
"${GENERATED_EVENTS_ENUM}"
+)
+
+list(APPEND NVIM_GENERATED_FOR_SOURCES
+ "${GENERATED_API_DISPATCH}"
+ "${GENERATED_EX_CMDS_DEFS}"
"${GENERATED_EVENTS_NAMES_MAP}"
"${GENERATED_OPTIONS}"
"${GENERATED_UNICODE_TABLES}"
+ "${VIM_MODULE_FILE}"
+)
+
+list(APPEND NVIM_GENERATED_SOURCES
+ "${PROJECT_BINARY_DIR}/config/auto/pathdef.c"
)
add_custom_command(OUTPUT ${GENERATED_EX_CMDS_ENUM} ${GENERATED_EX_CMDS_DEFS}
COMMAND ${LUA_PRG} ${EX_CMDS_GENERATOR}
- ${PROJECT_SOURCE_DIR}/src/nvim ${GENERATED_INCLUDES_DIR} ${GENERATED_DIR}
- DEPENDS ${EX_CMDS_GENERATOR} ${EX_CMDS_DEFS_FILE}
+ ${CMAKE_CURRENT_LIST_DIR} ${GENERATED_INCLUDES_DIR} ${GENERATED_DIR}
+ DEPENDS ${EX_CMDS_GENERATOR} ${CMAKE_CURRENT_LIST_DIR}/ex_cmds.lua
+)
+
+if(NOT GPERF_PRG)
+ message(FATAL_ERROR "gperf was not found.")
+endif()
+add_custom_command(OUTPUT ${GENERATED_FUNCS} ${FUNCS_DATA}
+ COMMAND ${LUA_PRG} ${FUNCS_GENERATOR}
+ ${CMAKE_CURRENT_LIST_DIR} ${GENERATED_DIR} ${API_METADATA} ${FUNCS_DATA}
+ COMMAND ${GPERF_PRG}
+ ${GENERATED_DIR}/funcs.generated.h.gperf --output-file=${GENERATED_FUNCS}
+ DEPENDS ${FUNCS_GENERATOR} ${CMAKE_CURRENT_LIST_DIR}/eval.lua ${API_METADATA}
)
+list(APPEND NVIM_GENERATED_FOR_SOURCES
+ "${GENERATED_FUNCS}")
add_custom_command(OUTPUT ${GENERATED_EVENTS_ENUM} ${GENERATED_EVENTS_NAMES_MAP}
COMMAND ${LUA_PRG} ${EVENTS_GENERATOR}
- ${PROJECT_SOURCE_DIR}/src/nvim ${GENERATED_EVENTS_ENUM} ${GENERATED_EVENTS_NAMES_MAP}
- DEPENDS ${EVENTS_GENERATOR} ${EVENTS_LIST_FILE}
+ ${CMAKE_CURRENT_LIST_DIR} ${GENERATED_EVENTS_ENUM} ${GENERATED_EVENTS_NAMES_MAP}
+ DEPENDS ${EVENTS_GENERATOR} ${CMAKE_CURRENT_LIST_DIR}/auevents.lua
)
add_custom_command(OUTPUT ${GENERATED_OPTIONS}
COMMAND ${LUA_PRG} ${OPTIONS_GENERATOR}
- ${PROJECT_SOURCE_DIR}/src/nvim ${GENERATED_OPTIONS}
- DEPENDS ${OPTIONS_GENERATOR} ${OPTIONS_LIST_FILE}
+ ${CMAKE_CURRENT_LIST_DIR} ${GENERATED_OPTIONS}
+ DEPENDS ${OPTIONS_GENERATOR} ${CMAKE_CURRENT_LIST_DIR}/options.lua
)
+# NVIM_GENERATED_FOR_SOURCES and NVIM_GENERATED_FOR_HEADERS must be mutually exclusive.
+foreach(hfile ${NVIM_GENERATED_FOR_HEADERS})
+ list(FIND NVIM_GENERATED_FOR_SOURCES ${hfile} hfile_idx)
+ if(NOT ${hfile_idx} EQUAL -1)
+ message(FATAL_ERROR "File included in both NVIM_GENERATED_FOR_HEADERS and NVIM_GENERATED_FOR_SOURCES")
+ endif()
+endforeach()
+
# Our dependencies come first.
+if (CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
+ list(APPEND NVIM_LINK_LIBRARIES pthread c++abi)
+endif()
+
if (LibIntl_FOUND)
list(APPEND NVIM_LINK_LIBRARIES ${LibIntl_LIBRARY})
endif()
@@ -230,6 +374,10 @@ if(Iconv_LIBRARIES)
list(APPEND NVIM_LINK_LIBRARIES ${Iconv_LIBRARIES})
endif()
+if(WIN32)
+ list(APPEND NVIM_LINK_LIBRARIES ${WINPTY_LIBRARIES})
+endif()
+
# Put these last on the link line, since multiple things may depend on them.
list(APPEND NVIM_LINK_LIBRARIES
${LIBUV_LIBRARIES}
@@ -247,18 +395,150 @@ if(UNIX)
)
endif()
-set(NVIM_EXEC_LINK_LIBRARIES ${NVIM_LINK_LIBRARIES})
+set(NVIM_EXEC_LINK_LIBRARIES ${NVIM_LINK_LIBRARIES} ${LUA_PREFERRED_LIBRARIES})
# Don't use jemalloc in the unit test library.
if(JEMALLOC_FOUND)
list(APPEND NVIM_EXEC_LINK_LIBRARIES ${JEMALLOC_LIBRARIES})
endif()
-add_executable(nvim ${NEOVIM_GENERATED_SOURCES} ${NEOVIM_SOURCES}
- ${NEOVIM_HEADERS})
+if(POLICY CMP0069)
+ cmake_policy(SET CMP0069 NEW)
+endif()
+
+add_executable(nvim ${NVIM_GENERATED_FOR_SOURCES} ${NVIM_GENERATED_FOR_HEADERS}
+ ${NVIM_GENERATED_SOURCES} ${NVIM_SOURCES} ${NVIM_HEADERS}
+ ${XDIFF_SOURCES} ${XDIFF_HEADERS})
target_link_libraries(nvim ${NVIM_EXEC_LINK_LIBRARIES})
install_helper(TARGETS nvim)
+set_property(TARGET nvim APPEND PROPERTY
+ INCLUDE_DIRECTORIES ${LUA_PREFERRED_INCLUDE_DIRS})
+
+if(ENABLE_LTO AND (POLICY CMP0069))
+ include(CheckIPOSupported)
+ check_ipo_supported(RESULT IPO_SUPPORTED)
+ if(IPO_SUPPORTED AND (NOT CMAKE_BUILD_TYPE MATCHES Debug))
+ set_property(TARGET nvim PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
+ endif()
+endif()
+
+if(WIN32)
+ # Copy DLLs and third-party tools to bin/ and install them along with nvim
+ add_custom_target(nvim_runtime_deps ALL
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_BINARY_DIR}/windows_runtime_deps/
+ ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
+ install(DIRECTORY ${PROJECT_BINARY_DIR}/windows_runtime_deps/
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
+
+ add_custom_target(nvim_dll_deps DEPENDS nvim
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/windows_runtime_deps
+ COMMAND ${CMAKE_COMMAND}
+ "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}"
+ -DBINARY="${PROJECT_BINARY_DIR}/bin/nvim${CMAKE_EXECUTABLE_SUFFIX}"
+ -DDST=${PROJECT_BINARY_DIR}/windows_runtime_deps
+ -P ${PROJECT_SOURCE_DIR}/cmake/WindowsDllCopy.cmake)
+ add_dependencies(nvim_runtime_deps nvim_dll_deps)
+
+ # A CMake script is used for copying the files to avoid the
+ # "command line is too long" error that occurs when Ninja tries running
+ # a command that exceeds the length limit (8191 characters) on Windows.
+ # See https://developercommunity.visualstudio.com/content/problem/212207/file-open-cmake-the-command-line-is-too-long.html
+ set(EXTERNAL_BLOBS_SCRIPT
+ "file(MAKE_DIRECTORY \"${PROJECT_BINARY_DIR}/windows_runtime_deps/platforms\")")
+ foreach(DEP_FILE IN ITEMS
+ ca-bundle.crt
+ cat.exe
+ curl.exe
+ diff.exe
+ tee.exe
+ tidy.exe
+ win32yank.exe
+ winpty-agent.exe
+ xxd.exe
+
+ D3Dcompiler_47.dll
+ libEGL.dll
+ libgcc_s_dw2-1.dll
+ libGLESV2.dll
+ libstdc++-6.dll
+ libwinpthread-1.dll
+ nvim-qt.exe
+ Qt5Core.dll
+ Qt5Gui.dll
+ Qt5Network.dll
+ Qt5Svg.dll
+ Qt5Widgets.dll
+ winpty.dll
+
+ platforms/qwindows.dll
+ )
+ get_filename_component(DEP_FILE_DIR ${DEP_FILE} DIRECTORY)
+ set(EXTERNAL_BLOBS_SCRIPT "${EXTERNAL_BLOBS_SCRIPT}\n"
+ "file(COPY \"${DEPS_PREFIX}/bin/${DEP_FILE}\"
+ DESTINATION \"${PROJECT_BINARY_DIR}/windows_runtime_deps/${DEP_FILE_DIR}\")")
+ endforeach()
+ file(WRITE ${PROJECT_BINARY_DIR}/external_blobs.cmake ${EXTERNAL_BLOBS_SCRIPT})
+ add_custom_target(external_blobs
+ COMMAND ${CMAKE_COMMAND} -P ${PROJECT_BINARY_DIR}/external_blobs.cmake)
+ set_target_properties(external_blobs PROPERTIES FOLDER deps)
+ add_dependencies(nvim_runtime_deps external_blobs)
+else()
+ add_custom_target(nvim_runtime_deps) # Stub target to avoid CMP0046.
+endif()
+set_target_properties(nvim_runtime_deps PROPERTIES FOLDER deps)
+
+add_library(
+ libnvim
+ STATIC
+ EXCLUDE_FROM_ALL
+ ${NVIM_SOURCES} ${NVIM_GENERATED_SOURCES}
+ ${NVIM_HEADERS} ${NVIM_GENERATED_FOR_SOURCES} ${NVIM_GENERATED_FOR_HEADERS}
+ ${XDIFF_SOURCES} ${XDIFF_HEADERS}
+)
+set_property(TARGET libnvim APPEND PROPERTY
+ INCLUDE_DIRECTORIES ${LUA_PREFERRED_INCLUDE_DIRS})
+set_target_properties(
+ libnvim
+ PROPERTIES
+ POSITION_INDEPENDENT_CODE ON
+ OUTPUT_NAME nvim
+)
+set_property(
+ TARGET libnvim
+ APPEND_STRING PROPERTY COMPILE_FLAGS " -DMAKE_LIB "
+)
+
+if(NOT LUAJIT_FOUND)
+ message(STATUS "luajit not found, skipping nvim-test (unit tests) target")
+else()
+ set(NVIM_TEST_LINK_LIBRARIES ${NVIM_LINK_LIBRARIES} ${LUAJIT_LIBRARIES})
+ add_library(
+ nvim-test
+ MODULE
+ EXCLUDE_FROM_ALL
+ ${NVIM_SOURCES} ${NVIM_GENERATED_SOURCES}
+ ${NVIM_HEADERS} ${NVIM_GENERATED_FOR_SOURCES} ${NVIM_GENERATED_FOR_HEADERS}
+ ${XDIFF_SOURCES} ${XDIFF_HEADERS}
+ ${UNIT_TEST_FIXTURES}
+ )
+ target_link_libraries(nvim-test ${NVIM_TEST_LINK_LIBRARIES})
+ target_link_libraries(libnvim ${NVIM_TEST_LINK_LIBRARIES})
+ set_property(
+ TARGET nvim-test
+ APPEND PROPERTY INCLUDE_DIRECTORIES ${LUAJIT_INCLUDE_DIRS}
+ )
+ set_target_properties(
+ nvim-test
+ PROPERTIES
+ POSITION_INDEPENDENT_CODE ON
+ )
+ set_property(
+ TARGET nvim-test
+ APPEND_STRING PROPERTY COMPILE_FLAGS " -DUNIT_TESTING "
+ )
+endif()
+
if(CLANG_ASAN_UBSAN)
message(STATUS "Enabling Clang address sanitizer and undefined behavior sanitizer for nvim.")
check_c_compiler_flag(-fno-sanitize-recover=all SANITIZE_RECOVER_ALL)
@@ -279,20 +559,117 @@ elseif(CLANG_TSAN)
message(STATUS "Enabling Clang thread sanitizer for nvim.")
set_property(TARGET nvim APPEND_STRING PROPERTY COMPILE_FLAGS "-DEXITFREE ")
set_property(TARGET nvim APPEND_STRING PROPERTY COMPILE_FLAGS "-fsanitize=thread ")
+ set_property(TARGET nvim APPEND_STRING PROPERTY COMPILE_FLAGS "-fPIE ")
set_property(TARGET nvim APPEND_STRING PROPERTY LINK_FLAGS "-fsanitize=thread ")
endif()
-add_library(libnvim STATIC EXCLUDE_FROM_ALL ${NEOVIM_GENERATED_SOURCES}
- ${NEOVIM_SOURCES} ${NEOVIM_HEADERS})
-target_link_libraries(libnvim ${NVIM_LINK_LIBRARIES})
-set_target_properties(libnvim PROPERTIES
- POSITION_INDEPENDENT_CODE ON
- OUTPUT_NAME nvim)
-set_property(TARGET libnvim APPEND_STRING PROPERTY COMPILE_FLAGS " -DMAKE_LIB ")
-
-add_library(nvim-test MODULE EXCLUDE_FROM_ALL ${NEOVIM_GENERATED_SOURCES}
- ${NEOVIM_SOURCES} ${UNIT_TEST_FIXTURES} ${NEOVIM_HEADERS})
-target_link_libraries(nvim-test ${NVIM_LINK_LIBRARIES})
-set_property(TARGET nvim-test APPEND_STRING PROPERTY COMPILE_FLAGS -DUNIT_TESTING)
+function(get_test_target prefix sfile relative_path_var target_var)
+ get_filename_component(full_d "${sfile}" PATH)
+ file(RELATIVE_PATH d "${PROJECT_SOURCE_DIR}/src/nvim" "${full_d}")
+ if(d MATCHES "^[.][.]")
+ file(RELATIVE_PATH d "${GENERATED_DIR}" "${full_d}")
+ endif()
+ get_filename_component(r "${sfile}" NAME)
+ if(NOT d MATCHES "^[.]?$")
+ set(r "${d}/${r}")
+ endif()
+ string(REGEX REPLACE "[/.]" "-" suffix "${r}")
+ set(${relative_path_var} ${r} PARENT_SCOPE)
+ if(prefix STREQUAL "")
+ set(${target_var} "${suffix}" PARENT_SCOPE)
+ else()
+ set(${target_var} "${prefix}-${suffix}" PARENT_SCOPE)
+ endif()
+endfunction()
+
+set(NO_SINGLE_CHECK_HEADERS
+ os/win_defs.h
+ os/pty_process_win.h
+)
+foreach(hfile ${NVIM_HEADERS})
+ get_test_target(test-includes "${hfile}" relative_path texe)
+
+ if(NOT ${hfile} MATCHES "[.](c|in)[.]h$")
+ set(tsource "${GENERATED_DIR}/${relative_path}.test-include.c")
+ write_file("${tsource}" "#include \"${hfile}\"\nint main(int argc, char **argv) { return 0; }")
+ add_executable(
+ ${texe}
+ EXCLUDE_FROM_ALL
+ ${tsource} ${NVIM_HEADERS} ${NVIM_GENERATED_FOR_HEADERS})
+ set_property(
+ TARGET ${texe}
+ APPEND PROPERTY INCLUDE_DIRECTORIES ${LUA_PREFERRED_INCLUDE_DIRS}
+ )
+ set_target_properties(${texe} PROPERTIES FOLDER test)
+
+ list(FIND NO_SINGLE_CHECK_HEADERS "${relative_path}" hfile_exclude_idx)
+ if(${hfile_exclude_idx} EQUAL -1)
+ list(APPEND HEADER_CHECK_TARGETS ${texe})
+ endif()
+ endif()
+endforeach()
+add_custom_target(check-single-includes DEPENDS ${HEADER_CHECK_TARGETS})
+
+function(add_download output url allow_failure)
+ add_custom_command(
+ OUTPUT "${output}"
+ COMMAND
+ ${CMAKE_COMMAND}
+ -DURL=${url} -DFILE=${output}
+ -DALLOW_FAILURE=${allow_failure}
+ -P ${DOWNLOAD_SCRIPT}
+ DEPENDS ${DOWNLOAD_SCRIPT}
+ )
+endfunction()
+
+add_download(${LINT_SUPPRESSES_ARCHIVE} ${LINT_SUPPRESSES_URL} off)
+
+add_custom_command(
+ OUTPUT ${LINT_SUPPRESSES_TOUCH_FILE}
+ WORKING_DIRECTORY ${LINT_SUPPRESSES_ROOT}/src
+ COMMAND ${CMAKE_COMMAND} -E tar xfz ${LINT_SUPPRESSES_ARCHIVE}
+ COMMAND
+ ${CMAKE_COMMAND}
+ -DTARGET=${LINT_SUPPRESSES_ROOT}
+ -P ${LINT_SUPPRESSES_INSTALL_SCRIPT}
+ COMMAND ${CMAKE_COMMAND} -E touch ${LINT_SUPPRESSES_TOUCH_FILE}
+ DEPENDS
+ ${LINT_SUPPRESSES_ARCHIVE} ${LINT_SUPPRESSES_INSTALL_SCRIPT}
+)
+
+add_download(${LINT_SUPPRESS_FILE} ${LINT_SUPPRESS_URL} off)
+
+set(LINT_NVIM_REL_SOURCES)
+foreach(sfile ${LINT_NVIM_SOURCES})
+ get_test_target("" "${sfile}" r suffix)
+ set(suppress_file ${LINT_SUPPRESSES_ROOT}/${suffix}.json)
+ set(suppress_url "${LINT_SUPPRESS_URL_BASE}/${suffix}.json")
+ set(rsfile src/nvim/${r})
+ set(touch_file "${TOUCHES_DIR}/ran-clint-${suffix}")
+ add_custom_command(
+ OUTPUT ${touch_file}
+ COMMAND ${LINT_PRG} --suppress-errors=${suppress_file} ${rsfile}
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+ COMMAND ${CMAKE_COMMAND} -E touch ${touch_file}
+ DEPENDS ${LINT_PRG} ${sfile} ${LINT_SUPPRESSES_TOUCH_FILE}
+ )
+ list(APPEND LINT_TARGETS ${touch_file})
+ list(APPEND LINT_NVIM_REL_SOURCES ${rsfile})
+endforeach()
+add_custom_target(clint DEPENDS ${LINT_TARGETS})
+
+add_custom_target(
+ clint-full
+ COMMAND
+ ${LINT_PRG} --suppress-errors=${LINT_SUPPRESS_FILE} ${LINT_NVIM_REL_SOURCES}
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+ DEPENDS ${LINT_PRG} ${LINT_NVIM_SOURCES} ${LINT_SUPPRESS_FILE}
+)
+
+add_custom_target(generated-sources DEPENDS
+ ${NVIM_GENERATED_FOR_SOURCES}
+ ${NVIM_GENERATED_FOR_HEADERS}
+ ${NVIM_GENERATED_SOURCES}
+)
add_subdirectory(po)
diff --git a/src/nvim/README.md b/src/nvim/README.md
index f16c6de12f..02464c2500 100644
--- a/src/nvim/README.md
+++ b/src/nvim/README.md
@@ -1,25 +1,119 @@
-## Source code overview
+Nvim core
+=========
-Since Neovim has inherited most code from Vim, some information in [its
-README](https://raw.githubusercontent.com/vim/vim/master/src/README.txt) still
-applies.
+Module-specific details are documented at the top of each module (`terminal.c`,
+`screen.c`, โ€ฆ).
-This document aims to give a high level overview of how Neovim works internally,
-focusing on parts that are different from Vim. Currently this is still a work in
-progress, especially because I have avoided adding too many details about parts
-that are constantly changing. As the code becomes more organized and stable,
-this document will be updated to reflect the changes.
+See `:help dev` for guidelines.
-If you are looking for module-specific details, it is best to read the source
-code. Some files are extensively commented at the top (e.g. terminal.c,
-screen.c).
+Filename conventions
+--------------------
-### Top-level program loops
+The source files use extensions to hint about their purpose.
-First let's understand what a Vim-like program does by analyzing the workflow of
-a typical editing session:
+- `*.c`, `*.generated.c` - full C files, with all includes, etc.
+- `*.c.h` - parametrized C files, contain all necessary includes, but require
+ defining macros before actually using. Example: `typval_encode.c.h`
+- `*.h` - full headers, with all includes. Does *not* apply to `*.generated.h`.
+- `*.h.generated.h` - exported functionsโ€™ declarations.
+- `*.c.generated.h` - static functionsโ€™ declarations.
-01. Vim dispays the welcome screen
+Logs
+----
+
+Low-level log messages sink to `$NVIM_LOG_FILE`.
+
+Use `LOG_CALLSTACK()` (Linux only) to log the current stacktrace. To log to an
+alternate file (e.g. stderr) use `LOG_CALLSTACK_TO_FILE(FILE*)`.
+
+UI events are logged at DEBUG level (`DEBUG_LOG_LEVEL`).
+
+ rm -rf build/
+ make CMAKE_EXTRA_FLAGS="-DMIN_LOG_LEVEL=0"
+
+Many log messages have a shared prefix, such as "UI" or "RPC". Use the shell to
+filter the log, e.g. at DEBUG level you might want to exclude UI messages:
+
+ tail -F ~/.local/share/nvim/log | cat -v | stdbuf -o0 grep -v UI | stdbuf -o0 tee -a log
+
+Build with ASAN
+---------------
+
+Building Nvim with Clang sanitizers (Address Sanitizer: ASan, Undefined
+Behavior Sanitizer: UBSan, Memory Sanitizer: MSan, Thread Sanitizer: TSan) is
+a good way to catch undefined behavior, leaks and other errors as soon as they
+happen. It's significantly faster than Valgrind.
+
+Requires clang 3.4 or later:
+
+ clang --version
+
+Build Nvim with sanitizer instrumentation:
+
+ CC=clang make CMAKE_EXTRA_FLAGS="-DCLANG_ASAN_UBSAN=ON"
+
+Create a directory to store logs:
+
+ mkdir -p "$HOME/logs"
+
+Enable the sanitizer(s) via these environment variables:
+
+ # Change to detect_leaks=1 to detect memory leaks (slower).
+ export ASAN_OPTIONS="detect_leaks=0:log_path=$HOME/logs/asan"
+ export ASAN_SYMBOLIZER_PATH=/usr/lib/llvm-5.0/bin/llvm-symbolizer
+
+ export MSAN_SYMBOLIZER_PATH=/usr/lib/llvm-5.0/bin/llvm-symbolizer
+ export TSAN_OPTIONS="external_symbolizer_path=/usr/lib/llvm-5.0/bin/llvm-symbolizer log_path=${HOME}/logs/tsan"
+
+Logs will be written to `${HOME}/logs/*san.PID`.
+
+TUI debugging
+-------------
+
+### TUI troubleshoot
+
+Nvim logs its internal terminfo state at 'verbose' level 3. This makes it
+possible to see exactly what terminfo values Nvim is using on any system.
+
+ nvim -V3log
+
+### TUI trace
+
+The ancient `script` command is still the "state of the art" for tracing
+terminal behavior. The libvterm `vterm-dump` utility formats the result for
+human-readability.
+
+Record a Nvim terminal session and format it with `vterm-dump`:
+
+ script foo
+ ./build/bin/nvim -u NONE
+ # Exit the script session with CTRL-d
+
+ # Use `vterm-dump` utility to format the result.
+ ./.deps/usr/bin/vterm-dump foo > bar
+
+Then you can compare `bar` with another session, to debug TUI behavior.
+
+### TUI redraw
+
+Set the 'writedelay' option to see where and when the UI is painted.
+
+ :set writedelay=1
+
+### Terminal reference
+
+- `man terminfo`
+- http://bazaar.launchpad.net/~libvterm/libvterm/trunk/view/head:/doc/seqs.txt
+- http://invisible-island.net/xterm/ctlseqs/ctlseqs.html
+
+Nvim lifecycle
+--------------
+
+Following describes how Nvim processes input.
+
+Consider a typical Vim-like editing session:
+
+01. Vim displays the welcome screen
02. User types: `:`
03. Vim enters command-line mode
04. User types: `edit README.txt<CR>`
@@ -41,16 +135,14 @@ a typical editing session:
21. User types: `word<ESC>`
22. Vim inserts "word" at the beginning and returns to normal mode
-Note that we have split user actions into sequences of inputs that change the
-state of the editor. While there's no documentation about a "g command
-mode" (step 16), internally it is implemented similarly to "operator-pending
-mode".
+Note that we split user actions into sequences of inputs that change the state
+of the editor. While there's no documentation about a "g command mode" (step
+16), internally it is implemented similarly to "operator-pending mode".
-From this we can see that Vim has the behavior of a input-driven state
-machine (more specifically, a pushdown automaton since it requires a stack for
+From this we can see that Vim has the behavior of an input-driven state machine
+(more specifically, a pushdown automaton since it requires a stack for
transitioning back from states). Assuming each state has a callback responsible
-for handling keys, this pseudocode (a python-like language) shows a good
-representation of the main program loop:
+for handling keys, this pseudocode represents the main program loop:
```py
def state_enter(state_callback, data):
@@ -126,12 +218,11 @@ def insert_state(data, key):
return true
```
-While the actual code is much more complicated, the above gives an idea of how
-Neovim is organized internally. Some states like the `g_command_state` or
-`get_operator_count_state` do not have a dedicated `state_enter` callback, but
-are implicitly embedded into other states (this will change later as we continue
-the refactoring effort). To start reading the actual code, here's the
-recommended order:
+The above gives an idea of how Nvim is organized internally. Some states like
+the `g_command_state` or `get_operator_count_state` do not have a dedicated
+`state_enter` callback, but are implicitly embedded into other states (this
+will change later as we continue the refactoring effort). To start reading the
+actual code, here's the recommended order:
1. `state_enter()` function (state.c). This is the actual program loop,
note that a `VimState` structure is used, which contains function pointers
@@ -152,16 +243,17 @@ modes managed by the `state_enter` loop:
- insert mode: `insert_{enter,check,execute}()`(`edit.c`)
- terminal mode: `terminal_{enter,execute}()`(`terminal.c`)
-### Async event support
+Async event support
+-------------------
-One of the features Neovim added is the support for handling arbitrary
+One of the features Nvim added is the support for handling arbitrary
asynchronous events, which can include:
-- msgpack-rpc requests
+- RPC requests
- job control callbacks
-- timers (not implemented yet but the support code is already there)
+- timers
-Neovim implements this functionality by entering another event loop while
+Nvim implements this functionality by entering another event loop while
waiting for characters, so instead of:
```py
@@ -171,7 +263,7 @@ def state_enter(state_callback, data):
while state_callback(data, key) # invoke the callback for the current state
```
-Neovim program loop is more like:
+Nvim program loop is more like:
```py
def state_enter(state_callback, data):
@@ -182,9 +274,31 @@ def state_enter(state_callback, data):
where `event` is something the operating system delivers to us, including (but
not limited to) user input. The `read_next_event()` part is internally
-implemented by libuv, the platform layer used by Neovim.
+implemented by libuv, the platform layer used by Nvim.
-Since Neovim inherited its code from Vim, the states are not prepared to receive
+Since Nvim inherited its code from Vim, the states are not prepared to receive
"arbitrary events", so we use a special key to represent those (When a state
receives an "arbitrary event", it normally doesn't do anything other update the
screen).
+
+Main loop
+---------
+
+The `Loop` structure (which describes `main_loop`) abstracts multiple queues
+into one loop:
+
+ uv_loop_t uv;
+ MultiQueue *events;
+ MultiQueue *thread_events;
+ MultiQueue *fast_events;
+
+`loop_poll_events` checks `Loop.uv` and `Loop.fast_events` whenever Nvim is
+idle, and also at `os_breakcheck` intervals.
+
+MultiQueue is cool because you can attach throw-away "child queues" trivially.
+For example `do_os_system()` does this (for every spawned process!) to
+automatically route events onto the `main_loop`:
+
+ Process *proc = &uvproc.process;
+ MultiQueue *events = multiqueue_new_child(main_loop.events);
+ proc->events = events;
diff --git a/src/nvim/api/buffer.c b/src/nvim/api/buffer.c
index 55b535c78c..5df0f0bb47 100644
--- a/src/nvim/api/buffer.c
+++ b/src/nvim/api/buffer.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
// Much of this code was adapted from 'if_py_both.h' from the original
// vim source
#include <stdbool.h>
@@ -10,11 +13,11 @@
#include "nvim/api/private/defs.h"
#include "nvim/vim.h"
#include "nvim/buffer.h"
+#include "nvim/charset.h"
#include "nvim/cursor.h"
#include "nvim/memline.h"
#include "nvim/memory.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/ex_cmds.h"
#include "nvim/mark.h"
#include "nvim/fileio.h"
@@ -22,17 +25,35 @@
#include "nvim/syntax.h"
#include "nvim/window.h"
#include "nvim/undo.h"
+#include "nvim/ex_docmd.h"
+#include "nvim/buffer_updates.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "api/buffer.c.generated.h"
#endif
+
+/// \defgroup api-buffer
+///
+/// Unloaded Buffers:~
+///
+/// Buffers may be unloaded by the |:bunload| command or the buffer's
+/// |'bufhidden'| option. When a buffer is unloaded its file contents are freed
+/// from memory and vim cannot operate on the buffer lines until it is reloaded
+/// (usually by opening the buffer again in a new window). API methods such as
+/// |nvim_buf_get_lines()| and |nvim_buf_line_count()| will be affected.
+///
+/// You can use |nvim_buf_is_loaded()| or |nvim_buf_line_count()| to check
+/// whether a buffer is loaded.
+
+
/// Gets the buffer line count
///
-/// @param buffer The buffer handle
-/// @param[out] err Details of an error that may have occurred
-/// @return The line count
-Integer buffer_line_count(Buffer buffer, Error *err)
+/// @param buffer Buffer handle
+/// @param[out] err Error details, if any
+/// @return Line count, or 0 for unloaded buffer. |api-buffer|
+Integer nvim_buf_line_count(Buffer buffer, Error *err)
+ FUNC_API_SINCE(1)
{
buf_T *buf = find_buffer_by_handle(buffer, err);
@@ -40,29 +61,34 @@ Integer buffer_line_count(Buffer buffer, Error *err)
return 0;
}
+ // return sentinel value if the buffer isn't loaded
+ if (buf->b_ml.ml_mfp == NULL) {
+ return 0;
+ }
+
return buf->b_ml.ml_line_count;
}
/// Gets a buffer line
///
-/// @deprecated use buffer_get_lines instead.
+/// @deprecated use nvim_buf_get_lines instead.
/// for positive indices (including 0) use
-/// "buffer_get_lines(buffer, index, index+1, true)"
+/// "nvim_buf_get_lines(buffer, index, index+1, true)"
/// for negative indices use
-/// "buffer_get_lines(buffer, index-1, index, true)"
+/// "nvim_buf_get_lines(buffer, index-1, index, true)"
///
-/// @param buffer The buffer handle
-/// @param index The line index
-/// @param[out] err Details of an error that may have occurred
-/// @return The line string
+/// @param buffer Buffer handle
+/// @param index Line index
+/// @param[out] err Error details, if any
+/// @return Line string
String buffer_get_line(Buffer buffer, Integer index, Error *err)
{
String rv = { .size = 0 };
index = convert_index(index);
- Array slice = buffer_get_lines(buffer, index, index+1, true, err);
+ Array slice = nvim_buf_get_lines(0, buffer, index, index+1, true, err);
- if (!err->set && slice.size) {
+ if (!ERROR_SET(err) && slice.size) {
rv = slice.items[0].data.string;
}
@@ -71,89 +97,143 @@ String buffer_get_line(Buffer buffer, Integer index, Error *err)
return rv;
}
+/// Activate updates from this buffer to the current channel.
+///
+/// @param buffer The buffer handle
+/// @param send_buffer Set to true if the initial notification should contain
+/// the whole buffer. If so, the first notification will be a
+/// `nvim_buf_lines_event`. Otherwise, the first notification will be
+/// a `nvim_buf_changedtick_event`
+/// @param opts Optional parameters. Currently not used.
+/// @param[out] err Details of an error that may have occurred
+/// @return False when updates couldn't be enabled because the buffer isn't
+/// loaded or `opts` contained an invalid key; otherwise True.
+Boolean nvim_buf_attach(uint64_t channel_id,
+ Buffer buffer,
+ Boolean send_buffer,
+ Dictionary opts,
+ Error *err)
+ FUNC_API_SINCE(4) FUNC_API_REMOTE_ONLY
+{
+ if (opts.size > 0) {
+ api_set_error(err, kErrorTypeValidation, "dict isn't empty");
+ return false;
+ }
+
+ buf_T *buf = find_buffer_by_handle(buffer, err);
+
+ if (!buf) {
+ return false;
+ }
+
+ return buf_updates_register(buf, channel_id, send_buffer);
+}
+//
+/// Deactivate updates from this buffer to the current channel.
+///
+/// @param buffer The buffer handle
+/// @param[out] err Details of an error that may have occurred
+/// @return False when updates couldn't be disabled because the buffer
+/// isn't loaded; otherwise True.
+Boolean nvim_buf_detach(uint64_t channel_id,
+ Buffer buffer,
+ Error *err)
+ FUNC_API_SINCE(4) FUNC_API_REMOTE_ONLY
+{
+ buf_T *buf = find_buffer_by_handle(buffer, err);
+
+ if (!buf) {
+ return false;
+ }
+
+ buf_updates_unregister(buf, channel_id);
+ return true;
+}
+
/// Sets a buffer line
///
-/// @deprecated use buffer_set_lines instead.
+/// @deprecated use nvim_buf_set_lines instead.
/// for positive indices use
-/// "buffer_set_lines(buffer, index, index+1, true, [line])"
+/// "nvim_buf_set_lines(buffer, index, index+1, true, [line])"
/// for negative indices use
-/// "buffer_set_lines(buffer, index-1, index, true, [line])"
+/// "nvim_buf_set_lines(buffer, index-1, index, true, [line])"
///
-/// @param buffer The buffer handle
-/// @param index The line index
-/// @param line The new line.
-/// @param[out] err Details of an error that may have occurred
+/// @param buffer Buffer handle
+/// @param index Line index
+/// @param line Contents of the new line
+/// @param[out] err Error details, if any
void buffer_set_line(Buffer buffer, Integer index, String line, Error *err)
{
Object l = STRING_OBJ(line);
Array array = { .items = &l, .size = 1 };
index = convert_index(index);
- buffer_set_lines(buffer, index, index+1, true, array, err);
+ nvim_buf_set_lines(0, buffer, index, index+1, true, array, err);
}
/// Deletes a buffer line
///
-/// @deprecated use buffer_set_lines instead.
+/// @deprecated use nvim_buf_set_lines instead.
/// for positive indices use
-/// "buffer_set_lines(buffer, index, index+1, true, [])"
+/// "nvim_buf_set_lines(buffer, index, index+1, true, [])"
/// for negative indices use
-/// "buffer_set_lines(buffer, index-1, index, true, [])"
-/// @param buffer The buffer handle
-/// @param index The line index
-/// @param[out] err Details of an error that may have occurred
+/// "nvim_buf_set_lines(buffer, index-1, index, true, [])"
+/// @param buffer buffer handle
+/// @param index line index
+/// @param[out] err Error details, if any
void buffer_del_line(Buffer buffer, Integer index, Error *err)
{
Array array = ARRAY_DICT_INIT;
index = convert_index(index);
- buffer_set_lines(buffer, index, index+1, true, array, err);
+ nvim_buf_set_lines(0, buffer, index, index+1, true, array, err);
}
/// Retrieves a line range from the buffer
///
-/// @deprecated use buffer_get_lines(buffer, newstart, newend, false)
+/// @deprecated use nvim_buf_get_lines(buffer, newstart, newend, false)
/// where newstart = start + int(not include_start) - int(start < 0)
/// newend = end + int(include_end) - int(end < 0)
/// int(bool) = 1 if bool is true else 0
-/// @param buffer The buffer handle
-/// @param start The first line index
-/// @param end The last line index
-/// @param include_start True if the slice includes the `start` parameter
-/// @param include_end True if the slice includes the `end` parameter
-/// @param[out] err Details of an error that may have occurred
-/// @return An array of lines
+/// @param buffer Buffer handle
+/// @param start First line index
+/// @param end Last line index
+/// @param include_start True if the slice includes the `start` parameter
+/// @param include_end True if the slice includes the `end` parameter
+/// @param[out] err Error details, if any
+/// @return Array of lines
ArrayOf(String) buffer_get_line_slice(Buffer buffer,
- Integer start,
- Integer end,
- Boolean include_start,
- Boolean include_end,
- Error *err)
+ Integer start,
+ Integer end,
+ Boolean include_start,
+ Boolean include_end,
+ Error *err)
{
start = convert_index(start) + !include_start;
end = convert_index(end) + include_end;
- return buffer_get_lines(buffer, start , end, false, err);
+ return nvim_buf_get_lines(0, buffer, start , end, false, err);
}
-
-/// Retrieves a line range from the buffer
+/// Gets a line-range from the buffer.
///
/// Indexing is zero-based, end-exclusive. Negative indices are interpreted
-/// as length+1+index, i e -1 refers to the index past the end. So to get the
-/// last element set start=-2 and end=-1.
+/// as length+1+index: -1 refers to the index past the end. So to get the
+/// last element use start=-2 and end=-1.
///
/// Out-of-bounds indices are clamped to the nearest valid value, unless
/// `strict_indexing` is set.
///
-/// @param buffer The buffer handle
-/// @param start The first line index
-/// @param end The last line index (exclusive)
-/// @param strict_indexing whether out-of-bounds should be an error.
-/// @param[out] err Details of an error that may have occurred
-/// @return An array of lines
-ArrayOf(String) buffer_get_lines(Buffer buffer,
- Integer start,
- Integer end,
- Boolean strict_indexing,
- Error *err)
+/// @param buffer Buffer handle
+/// @param start First line index
+/// @param end Last line index (exclusive)
+/// @param strict_indexing Whether out-of-bounds should be an error.
+/// @param[out] err Error details, if any
+/// @return Array of lines, or empty array for unloaded buffer.
+ArrayOf(String) nvim_buf_get_lines(uint64_t channel_id,
+ Buffer buffer,
+ Integer start,
+ Integer end,
+ Boolean strict_indexing,
+ Error *err)
+ FUNC_API_SINCE(1)
{
Array rv = ARRAY_DICT_INIT;
buf_T *buf = find_buffer_by_handle(buffer, err);
@@ -162,12 +242,17 @@ ArrayOf(String) buffer_get_lines(Buffer buffer,
return rv;
}
+ // return sentinel value if the buffer isn't loaded
+ if (buf->b_ml.ml_mfp == NULL) {
+ return rv;
+ }
+
bool oob = false;
start = normalize_index(buf, start, &oob);
end = normalize_index(buf, end, &oob);
if (strict_indexing && oob) {
- api_set_error(err, Validation, _("Index out of bounds"));
+ api_set_error(err, kErrorTypeValidation, "Index out of bounds");
return rv;
}
@@ -179,25 +264,13 @@ ArrayOf(String) buffer_get_lines(Buffer buffer,
rv.size = (size_t)(end - start);
rv.items = xcalloc(sizeof(Object), rv.size);
- for (size_t i = 0; i < rv.size; i++) {
- int64_t lnum = start + (int64_t)i;
-
- if (lnum > LONG_MAX) {
- api_set_error(err, Validation, _("Line index is too high"));
- goto end;
- }
-
- const char *bufstr = (char *) ml_get_buf(buf, (linenr_T) lnum, false);
- Object str = STRING_OBJ(cstr_to_string(bufstr));
-
- // Vim represents NULs as NLs, but this may confuse clients.
- strchrsub(str.data.string.data, '\n', '\0');
-
- rv.items[i] = str;
+ if (!buf_collect_lines(buf, rv.size, start,
+ (channel_id != VIML_INTERNAL_CALL), &rv, err)) {
+ goto end;
}
end:
- if (err->set) {
+ if (ERROR_SET(err)) {
for (size_t i = 0; i < rv.size; i++) {
xfree(rv.items[i].data.string.data);
}
@@ -212,57 +285,59 @@ end:
/// Replaces a line range on the buffer
///
-/// @deprecated use buffer_set_lines(buffer, newstart, newend, false, lines)
+/// @deprecated use nvim_buf_set_lines(buffer, newstart, newend, false, lines)
/// where newstart = start + int(not include_start) + int(start < 0)
/// newend = end + int(include_end) + int(end < 0)
/// int(bool) = 1 if bool is true else 0
///
-/// @param buffer The buffer handle
-/// @param start The first line index
-/// @param end The last line index
-/// @param include_start True if the slice includes the `start` parameter
-/// @param include_end True if the slice includes the `end` parameter
-/// @param replacement An array of lines to use as replacement(A 0-length
-// array will simply delete the line range)
-/// @param[out] err Details of an error that may have occurred
+/// @param buffer Buffer handle
+/// @param start First line index
+/// @param end Last line index
+/// @param include_start True if the slice includes the `start` parameter
+/// @param include_end True if the slice includes the `end` parameter
+/// @param replacement Array of lines to use as replacement (0-length
+// array will delete the line range)
+/// @param[out] err Error details, if any
void buffer_set_line_slice(Buffer buffer,
- Integer start,
- Integer end,
- Boolean include_start,
- Boolean include_end,
- ArrayOf(String) replacement,
- Error *err)
+ Integer start,
+ Integer end,
+ Boolean include_start,
+ Boolean include_end,
+ ArrayOf(String) replacement, // NOLINT
+ Error *err)
{
start = convert_index(start) + !include_start;
end = convert_index(end) + include_end;
- buffer_set_lines(buffer, start, end, false, replacement, err);
+ nvim_buf_set_lines(0, buffer, start, end, false, replacement, err);
}
-/// Replaces line range on the buffer
+/// Sets (replaces) a line-range in the buffer.
///
/// Indexing is zero-based, end-exclusive. Negative indices are interpreted
-/// as length+1+index, i e -1 refers to the index past the end. So to change
-/// or delete the last element set start=-2 and end=-1.
+/// as length+1+index: -1 refers to the index past the end. So to change
+/// or delete the last element use start=-2 and end=-1.
///
-/// To insert lines at a given index, set both start and end to the same index.
-/// To delete a range of lines, set replacement to an empty array.
+/// To insert lines at a given index, set `start` and `end` to the same index.
+/// To delete a range of lines, set `replacement` to an empty array.
///
/// Out-of-bounds indices are clamped to the nearest valid value, unless
/// `strict_indexing` is set.
///
-/// @param buffer The buffer handle
-/// @param start The first line index
-/// @param end The last line index (exclusive)
-/// @param strict_indexing whether out-of-bounds should be an error.
-/// @param replacement An array of lines to use as replacement
-/// @param[out] err Details of an error that may have occurred
-void buffer_set_lines(Buffer buffer,
- Integer start,
- Integer end,
- Boolean strict_indexing,
- ArrayOf(String) replacement,
- Error *err)
+/// @param buffer Buffer handle
+/// @param start First line index
+/// @param end Last line index (exclusive)
+/// @param strict_indexing Whether out-of-bounds should be an error.
+/// @param replacement Array of lines to use as replacement
+/// @param[out] err Error details, if any
+void nvim_buf_set_lines(uint64_t channel_id,
+ Buffer buffer,
+ Integer start,
+ Integer end,
+ Boolean strict_indexing,
+ ArrayOf(String) replacement, // NOLINT
+ Error *err)
+ FUNC_API_SINCE(1)
{
buf_T *buf = find_buffer_by_handle(buffer, err);
@@ -275,54 +350,58 @@ void buffer_set_lines(Buffer buffer,
end = normalize_index(buf, end, &oob);
if (strict_indexing && oob) {
- api_set_error(err, Validation, _("Index out of bounds"));
+ api_set_error(err, kErrorTypeValidation, "Index out of bounds");
return;
}
if (start > end) {
api_set_error(err,
- Validation,
- _("Argument \"start\" is higher than \"end\""));
+ kErrorTypeValidation,
+ "Argument \"start\" is higher than \"end\"");
return;
}
- buf_T *save_curbuf = NULL;
+ for (size_t i = 0; i < replacement.size; i++) {
+ if (replacement.items[i].type != kObjectTypeString) {
+ api_set_error(err,
+ kErrorTypeValidation,
+ "All items in the replacement array must be strings");
+ return;
+ }
+ // Disallow newlines in the middle of the line.
+ if (channel_id != VIML_INTERNAL_CALL) {
+ const String l = replacement.items[i].data.string;
+ if (memchr(l.data, NL, l.size)) {
+ api_set_error(err, kErrorTypeValidation,
+ "String cannot contain newlines");
+ return;
+ }
+ }
+ }
+
win_T *save_curwin = NULL;
tabpage_T *save_curtab = NULL;
size_t new_len = replacement.size;
size_t old_len = (size_t)(end - start);
- ssize_t extra = 0; // lines added to text, can be negative
+ ptrdiff_t extra = 0; // lines added to text, can be negative
char **lines = (new_len != 0) ? xcalloc(new_len, sizeof(char *)) : NULL;
for (size_t i = 0; i < new_len; i++) {
- if (replacement.items[i].type != kObjectTypeString) {
- api_set_error(err,
- Validation,
- _("All items in the replacement array must be strings"));
- goto end;
- }
+ const String l = replacement.items[i].data.string;
- String l = replacement.items[i].data.string;
-
- // Fill lines[i] with l's contents. Disallow newlines in the middle of a
- // line and convert NULs to newlines to avoid truncation.
- lines[i] = xmallocz(l.size);
- for (size_t j = 0; j < l.size; j++) {
- if (l.data[j] == '\n') {
- api_set_error(err, Exception, _("string cannot contain newlines"));
- new_len = i + 1;
- goto end;
- }
- lines[i][j] = (char) (l.data[j] == '\0' ? '\n' : l.data[j]);
- }
+ // Fill lines[i] with l's contents. Convert NULs to newlines as required by
+ // NL-used-for-NUL.
+ lines[i] = xmemdupz(l.data, l.size);
+ memchrsub(lines[i], NUL, NL, l.size);
}
try_start();
+ bufref_T save_curbuf = { NULL, 0, 0 };
switch_to_win_for_buf(buf, &save_curwin, &save_curtab, &save_curbuf);
if (u_save((linenr_T)(start - 1), (linenr_T)end) == FAIL) {
- api_set_error(err, Exception, _("Failed to save undo information"));
+ api_set_error(err, kErrorTypeException, "Failed to save undo information");
goto end;
}
@@ -332,13 +411,13 @@ void buffer_set_lines(Buffer buffer,
size_t to_delete = (new_len < old_len) ? (size_t)(old_len - new_len) : 0;
for (size_t i = 0; i < to_delete; i++) {
if (ml_delete((linenr_T)start, false) == FAIL) {
- api_set_error(err, Exception, _("Failed to delete line"));
+ api_set_error(err, kErrorTypeException, "Failed to delete line");
goto end;
}
}
- if ((ssize_t)to_delete > 0) {
- extra -= (ssize_t)to_delete;
+ if (to_delete > 0) {
+ extra -= (ptrdiff_t)to_delete;
}
// For as long as possible, replace the existing old_len with the
@@ -348,13 +427,13 @@ void buffer_set_lines(Buffer buffer,
for (size_t i = 0; i < to_replace; i++) {
int64_t lnum = start + (int64_t)i;
- if (lnum > LONG_MAX) {
- api_set_error(err, Validation, _("Index value is too high"));
+ if (lnum >= MAXLNUM) {
+ api_set_error(err, kErrorTypeValidation, "Index value is too high");
goto end;
}
if (ml_replace((linenr_T)lnum, (char_u *)lines[i], false) == FAIL) {
- api_set_error(err, Exception, _("Failed to replace line"));
+ api_set_error(err, kErrorTypeException, "Failed to replace line");
goto end;
}
// Mark lines that haven't been passed to the buffer as they need
@@ -366,13 +445,13 @@ void buffer_set_lines(Buffer buffer,
for (size_t i = to_replace; i < new_len; i++) {
int64_t lnum = start + (int64_t)i - 1;
- if (lnum > LONG_MAX) {
- api_set_error(err, Validation, _("Index value is too high"));
+ if (lnum >= MAXLNUM) {
+ api_set_error(err, kErrorTypeValidation, "Index value is too high");
goto end;
}
if (ml_append((linenr_T)lnum, (char_u *)lines[i], 0, false) == FAIL) {
- api_set_error(err, Exception, _("Failed to insert line"));
+ api_set_error(err, kErrorTypeException, "Failed to insert line");
goto end;
}
@@ -386,14 +465,18 @@ void buffer_set_lines(Buffer buffer,
// changed range, and move any in the remainder of the buffer.
// Only adjust marks if we managed to switch to a window that holds
// the buffer, otherwise line numbers will be invalid.
- if (save_curbuf == NULL) {
- mark_adjust((linenr_T)start, (linenr_T)(end - 1), MAXLNUM, extra);
+ if (save_curbuf.br_buf == NULL) {
+ mark_adjust((linenr_T)start,
+ (linenr_T)(end - 1),
+ MAXLNUM,
+ (long)extra,
+ false);
}
- changed_lines((linenr_T)start, 0, (linenr_T)end, extra);
+ changed_lines((linenr_T)start, 0, (linenr_T)end, (long)extra, true);
- if (buf == curbuf) {
- fix_cursor((linenr_T)start, (linenr_T)end, extra);
+ if (save_curbuf.br_buf == NULL) {
+ fix_cursor((linenr_T)start, (linenr_T)end, (linenr_T)extra);
}
end:
@@ -402,17 +485,53 @@ end:
}
xfree(lines);
- restore_win_for_buf(save_curwin, save_curtab, save_curbuf);
+ restore_win_for_buf(save_curwin, save_curtab, &save_curbuf);
try_end(err);
}
+/// Returns the byte offset for a line.
+///
+/// Line 1 (index=0) has offset 0. UTF-8 bytes are counted. EOL is one byte.
+/// 'fileformat' and 'fileencoding' are ignored. The line index just after the
+/// last line gives the total byte-count of the buffer. A final EOL byte is
+/// counted if it would be written, see 'eol'.
+///
+/// Unlike |line2byte()|, throws error for out-of-bounds indexing.
+/// Returns -1 for unloaded buffer.
+///
+/// @param buffer Buffer handle
+/// @param index Line index
+/// @param[out] err Error details, if any
+/// @return Integer byte offset, or -1 for unloaded buffer.
+Integer nvim_buf_get_offset(Buffer buffer, Integer index, Error *err)
+ FUNC_API_SINCE(5)
+{
+ buf_T *buf = find_buffer_by_handle(buffer, err);
+ if (!buf) {
+ return 0;
+ }
+
+ // return sentinel value if the buffer isn't loaded
+ if (buf->b_ml.ml_mfp == NULL) {
+ return -1;
+ }
+
+ if (index < 0 || index > buf->b_ml.ml_line_count) {
+ api_set_error(err, kErrorTypeValidation, "Index out of bounds");
+ return 0;
+ }
+
+ return ml_find_line_or_offset(buf, (int)index+1, NULL, true);
+}
+
/// Gets a buffer-scoped (b:) variable.
///
-/// @param buffer The buffer handle
-/// @param name The variable name
-/// @param[out] err Details of an error that may have occurred
-/// @return The variable value
-Object buffer_get_var(Buffer buffer, String name, Error *err)
+/// @param buffer Buffer handle
+/// @param name Variable name
+/// @param[out] err Error details, if any
+/// @return Variable value
+Object nvim_buf_get_var(Buffer buffer, String name, Error *err)
+ FUNC_API_SINCE(1)
{
buf_T *buf = find_buffer_by_handle(buffer, err);
@@ -423,13 +542,127 @@ Object buffer_get_var(Buffer buffer, String name, Error *err)
return dict_get_value(buf->b_vars, name, err);
}
+/// Gets a changed tick of a buffer
+///
+/// @param[in] buffer Buffer handle.
+/// @param[out] err Error details, if any
+///
+/// @return `b:changedtick` value.
+Integer nvim_buf_get_changedtick(Buffer buffer, Error *err)
+ FUNC_API_SINCE(2)
+{
+ const buf_T *const buf = find_buffer_by_handle(buffer, err);
+
+ if (!buf) {
+ return -1;
+ }
+
+ return buf_get_changedtick(buf);
+}
+
+/// Gets a list of buffer-local |mapping| definitions.
+///
+/// @param mode Mode short-name ("n", "i", "v", ...)
+/// @param buffer Buffer handle
+/// @param[out] err Error details, if any
+/// @returns Array of maparg()-like dictionaries describing mappings.
+/// The "buffer" key holds the associated buffer handle.
+ArrayOf(Dictionary) nvim_buf_get_keymap(Buffer buffer, String mode, Error *err)
+ FUNC_API_SINCE(3)
+{
+ buf_T *buf = find_buffer_by_handle(buffer, err);
+
+ if (!buf) {
+ return (Array)ARRAY_DICT_INIT;
+ }
+
+ return keymap_array(mode, buf);
+}
+
+/// Gets a map of buffer-local |user-commands|.
+///
+/// @param buffer Buffer handle.
+/// @param opts Optional parameters. Currently not used.
+/// @param[out] err Error details, if any.
+///
+/// @returns Map of maps describing commands.
+Dictionary nvim_buf_get_commands(Buffer buffer, Dictionary opts, Error *err)
+ FUNC_API_SINCE(4)
+{
+ bool global = (buffer == -1);
+ bool builtin = false;
+
+ for (size_t i = 0; i < opts.size; i++) {
+ String k = opts.items[i].key;
+ Object v = opts.items[i].value;
+ if (!strequal("builtin", k.data)) {
+ api_set_error(err, kErrorTypeValidation, "unexpected key: %s", k.data);
+ return (Dictionary)ARRAY_DICT_INIT;
+ }
+ if (strequal("builtin", k.data)) {
+ builtin = v.data.boolean;
+ }
+ }
+
+ if (global) {
+ if (builtin) {
+ api_set_error(err, kErrorTypeValidation, "builtin=true not implemented");
+ return (Dictionary)ARRAY_DICT_INIT;
+ }
+ return commands_array(NULL);
+ }
+
+ buf_T *buf = find_buffer_by_handle(buffer, err);
+ if (builtin || !buf) {
+ return (Dictionary)ARRAY_DICT_INIT;
+ }
+ return commands_array(buf);
+}
+
/// Sets a buffer-scoped (b:) variable
///
-/// @param buffer The buffer handle
-/// @param name The variable name
-/// @param value The variable value
-/// @param[out] err Details of an error that may have occurred
-/// @return The old value or nil if there was no previous value.
+/// @param buffer Buffer handle
+/// @param name Variable name
+/// @param value Variable value
+/// @param[out] err Error details, if any
+void nvim_buf_set_var(Buffer buffer, String name, Object value, Error *err)
+ FUNC_API_SINCE(1)
+{
+ buf_T *buf = find_buffer_by_handle(buffer, err);
+
+ if (!buf) {
+ return;
+ }
+
+ dict_set_var(buf->b_vars, name, value, false, false, err);
+}
+
+/// Removes a buffer-scoped (b:) variable
+///
+/// @param buffer Buffer handle
+/// @param name Variable name
+/// @param[out] err Error details, if any
+void nvim_buf_del_var(Buffer buffer, String name, Error *err)
+ FUNC_API_SINCE(1)
+{
+ buf_T *buf = find_buffer_by_handle(buffer, err);
+
+ if (!buf) {
+ return;
+ }
+
+ dict_set_var(buf->b_vars, name, NIL, true, false, err);
+}
+
+/// Sets a buffer-scoped (b:) variable
+///
+/// @deprecated
+///
+/// @param buffer Buffer handle
+/// @param name Variable name
+/// @param value Variable value
+/// @param[out] err Error details, if any
+/// @return Old value or nil if there was no previous value.
///
/// @warning It may return nil if there was no previous value
/// or if previous value was `v:null`.
@@ -441,18 +674,17 @@ Object buffer_set_var(Buffer buffer, String name, Object value, Error *err)
return (Object) OBJECT_INIT;
}
- return dict_set_value(buf->b_vars, name, value, false, err);
+ return dict_set_var(buf->b_vars, name, value, false, true, err);
}
/// Removes a buffer-scoped (b:) variable
///
-/// @param buffer The buffer handle
-/// @param name The variable name
-/// @param[out] err Details of an error that may have occurred
-/// @return The old value or nil if there was no previous value.
+/// @deprecated
///
-/// @warning It may return nil if there was no previous value
-/// or if previous value was `v:null`.
+/// @param buffer Buffer handle
+/// @param name Variable name
+/// @param[out] err Error details, if any
+/// @return Old value
Object buffer_del_var(Buffer buffer, String name, Error *err)
{
buf_T *buf = find_buffer_by_handle(buffer, err);
@@ -461,16 +693,18 @@ Object buffer_del_var(Buffer buffer, String name, Error *err)
return (Object) OBJECT_INIT;
}
- return dict_set_value(buf->b_vars, name, NIL, true, err);
+ return dict_set_var(buf->b_vars, name, NIL, true, true, err);
}
+
/// Gets a buffer option value
///
-/// @param buffer The buffer handle
-/// @param name The option name
-/// @param[out] err Details of an error that may have occurred
-/// @return The option value
-Object buffer_get_option(Buffer buffer, String name, Error *err)
+/// @param buffer Buffer handle
+/// @param name Option name
+/// @param[out] err Error details, if any
+/// @return Option value
+Object nvim_buf_get_option(Buffer buffer, String name, Error *err)
+ FUNC_API_SINCE(1)
{
buf_T *buf = find_buffer_by_handle(buffer, err);
@@ -481,14 +715,16 @@ Object buffer_get_option(Buffer buffer, String name, Error *err)
return get_option_from(buf, SREQ_BUF, name, err);
}
-/// Sets a buffer option value. Passing 'nil' as value deletes the option(only
+/// Sets a buffer option value. Passing 'nil' as value deletes the option (only
/// works if there's a global fallback)
///
-/// @param buffer The buffer handle
-/// @param name The option name
-/// @param value The option value
-/// @param[out] err Details of an error that may have occurred
-void buffer_set_option(Buffer buffer, String name, Object value, Error *err)
+/// @param buffer Buffer handle
+/// @param name Option name
+/// @param value Option value
+/// @param[out] err Error details, if any
+void nvim_buf_set_option(uint64_t channel_id, Buffer buffer,
+ String name, Object value, Error *err)
+ FUNC_API_SINCE(1)
{
buf_T *buf = find_buffer_by_handle(buffer, err);
@@ -496,15 +732,20 @@ void buffer_set_option(Buffer buffer, String name, Object value, Error *err)
return;
}
- set_option_to(buf, SREQ_BUF, name, value, err);
+ set_option_to(channel_id, buf, SREQ_BUF, name, value, err);
}
/// Gets the buffer number
///
-/// @param buffer The buffer handle
-/// @param[out] err Details of an error that may have occurred
-/// @return The buffer number
-Integer buffer_get_number(Buffer buffer, Error *err)
+/// @deprecated The buffer number now is equal to the object id,
+/// so there is no need to use this function.
+///
+/// @param buffer Buffer handle
+/// @param[out] err Error details, if any
+/// @return Buffer number
+Integer nvim_buf_get_number(Buffer buffer, Error *err)
+ FUNC_API_SINCE(1)
+ FUNC_API_DEPRECATED_SINCE(2)
{
Integer rv = 0;
buf_T *buf = find_buffer_by_handle(buffer, err);
@@ -518,10 +759,11 @@ Integer buffer_get_number(Buffer buffer, Error *err)
/// Gets the full file name for the buffer
///
-/// @param buffer The buffer handle
-/// @param[out] err Details of an error that may have occurred
-/// @return The buffer name
-String buffer_get_name(Buffer buffer, Error *err)
+/// @param buffer Buffer handle
+/// @param[out] err Error details, if any
+/// @return Buffer name
+String nvim_buf_get_name(Buffer buffer, Error *err)
+ FUNC_API_SINCE(1)
{
String rv = STRING_INIT;
buf_T *buf = find_buffer_by_handle(buffer, err);
@@ -535,10 +777,11 @@ String buffer_get_name(Buffer buffer, Error *err)
/// Sets the full file name for a buffer
///
-/// @param buffer The buffer handle
-/// @param name The buffer name
-/// @param[out] err Details of an error that may have occurred
-void buffer_set_name(Buffer buffer, String name, Error *err)
+/// @param buffer Buffer handle
+/// @param name Buffer name
+/// @param[out] err Error details, if any
+void nvim_buf_set_name(Buffer buffer, String name, Error *err)
+ FUNC_API_SINCE(1)
{
buf_T *buf = find_buffer_by_handle(buffer, err);
@@ -559,29 +802,49 @@ void buffer_set_name(Buffer buffer, String name, Error *err)
}
if (ren_ret == FAIL) {
- api_set_error(err, Exception, _("Failed to rename buffer"));
+ api_set_error(err, kErrorTypeException, "Failed to rename buffer");
}
}
-/// Checks if a buffer is valid
+/// Checks if a buffer is valid and loaded. See |api-buffer| for more info
+/// about unloaded buffers.
///
-/// @param buffer The buffer handle
-/// @return true if the buffer is valid, false otherwise
-Boolean buffer_is_valid(Buffer buffer)
+/// @param buffer Buffer handle
+/// @return true if the buffer is valid and loaded, false otherwise.
+Boolean nvim_buf_is_loaded(Buffer buffer)
+ FUNC_API_SINCE(5)
+{
+ Error stub = ERROR_INIT;
+ buf_T *buf = find_buffer_by_handle(buffer, &stub);
+ api_clear_error(&stub);
+ return buf && buf->b_ml.ml_mfp != NULL;
+}
+
+/// Checks if a buffer is valid.
+///
+/// @note Even if a buffer is valid it may have been unloaded. See |api-buffer|
+/// for more info about unloaded buffers.
+///
+/// @param buffer Buffer handle
+/// @return true if the buffer is valid, false otherwise.
+Boolean nvim_buf_is_valid(Buffer buffer)
+ FUNC_API_SINCE(1)
{
Error stub = ERROR_INIT;
- return find_buffer_by_handle(buffer, &stub) != NULL;
+ Boolean ret = find_buffer_by_handle(buffer, &stub) != NULL;
+ api_clear_error(&stub);
+ return ret;
}
/// Inserts a sequence of lines to a buffer at a certain index
///
-/// @deprecated use buffer_set_lines(buffer, lnum, lnum, true, lines)
+/// @deprecated use nvim_buf_set_lines(buffer, lnum, lnum, true, lines)
///
-/// @param buffer The buffer handle
-/// @param lnum Insert the lines after `lnum`. If negative, it will append
-/// to the end of the buffer.
-/// @param lines An array of lines
-/// @param[out] err Details of an error that may have occurred
+/// @param buffer Buffer handle
+/// @param lnum Insert the lines after `lnum`. If negative, appends to
+/// the end of the buffer.
+/// @param lines Array of lines
+/// @param[out] err Error details, if any
void buffer_insert(Buffer buffer,
Integer lnum,
ArrayOf(String) lines,
@@ -589,16 +852,17 @@ void buffer_insert(Buffer buffer,
{
// "lnum" will be the index of the line after inserting,
// no matter if it is negative or not
- buffer_set_lines(buffer, lnum, lnum, true, lines, err);
+ nvim_buf_set_lines(0, buffer, lnum, lnum, true, lines, err);
}
/// Return a tuple (row,col) representing the position of the named mark
///
-/// @param buffer The buffer handle
-/// @param name The mark's name
-/// @param[out] err Details of an error that may have occurred
-/// @return The (row, col) tuple
-ArrayOf(Integer, 2) buffer_get_mark(Buffer buffer, String name, Error *err)
+/// @param buffer Buffer handle
+/// @param name Mark name
+/// @param[out] err Error details, if any
+/// @return (row, col) tuple
+ArrayOf(Integer, 2) nvim_buf_get_mark(Buffer buffer, String name, Error *err)
+ FUNC_API_SINCE(1)
{
Array rv = ARRAY_DICT_INIT;
buf_T *buf = find_buffer_by_handle(buffer, err);
@@ -608,25 +872,26 @@ ArrayOf(Integer, 2) buffer_get_mark(Buffer buffer, String name, Error *err)
}
if (name.size != 1) {
- api_set_error(err, Validation, _("Mark name must be a single character"));
+ api_set_error(err, kErrorTypeValidation,
+ "Mark name must be a single character");
return rv;
}
pos_T *posp;
- buf_T *savebuf;
char mark = *name.data;
try_start();
- switch_buffer(&savebuf, buf);
+ bufref_T save_buf;
+ switch_buffer(&save_buf, buf);
posp = getmark(mark, false);
- restore_buffer(savebuf);
+ restore_buffer(&save_buf);
if (try_end(err)) {
return rv;
}
if (posp == NULL) {
- api_set_error(err, Validation, _("Invalid mark name"));
+ api_set_error(err, kErrorTypeValidation, "Invalid mark name");
return rv;
}
@@ -638,41 +903,42 @@ ArrayOf(Integer, 2) buffer_get_mark(Buffer buffer, String name, Error *err)
/// Adds a highlight to buffer.
///
-/// This can be used for plugins which dynamically generate highlights to a
-/// buffer (like a semantic highlighter or linter). The function adds a single
-/// highlight to a buffer. Unlike matchaddpos() highlights follow changes to
+/// Useful for plugins that dynamically generate highlights to a buffer
+/// (like a semantic highlighter or linter). The function adds a single
+/// highlight to a buffer. Unlike |matchaddpos()| highlights follow changes to
/// line numbering (as lines are inserted/removed above the highlighted line),
/// like signs and marks do.
///
-/// "src_id" is useful for batch deletion/updating of a set of highlights. When
-/// called with src_id = 0, an unique source id is generated and returned.
-/// Succesive calls can pass in it as "src_id" to add new highlights to the same
-/// source group. All highlights in the same group can then be cleared with
-/// buffer_clear_highlight. If the highlight never will be manually deleted
-/// pass in -1 for "src_id".
+/// Namespaces are used for batch deletion/updating of a set of highlights. To
+/// create a namespace, use |nvim_create_namespace| which returns a namespace
+/// id. Pass it in to this function as `ns_id` to add highlights to the
+/// namespace. All highlights in the same namespace can then be cleared with
+/// single call to |nvim_buf_clear_namespace|. If the highlight never will be
+/// deleted by an API call, pass `ns_id = -1`.
///
-/// If "hl_group" is the empty string no highlight is added, but a new src_id
-/// is still returned. This is useful for an external plugin to synchrounously
-/// request an unique src_id at initialization, and later asynchronously add and
-/// clear highlights in response to buffer changes.
+/// As a shorthand, `ns_id = 0` can be used to create a new namespace for the
+/// highlight, the allocated id is then returned. If `hl_group` is the empty
+/// string no highlight is added, but a new `ns_id` is still returned. This is
+/// supported for backwards compatibility, new code should use
+/// |nvim_create_namespace| to create a new empty namespace.
///
-/// @param buffer The buffer handle
-/// @param src_id Source group to use or 0 to use a new group,
-/// or -1 for ungrouped highlight
-/// @param hl_group Name of the highlight group to use
-/// @param line The line to highlight
-/// @param col_start Start of range of columns to highlight
-/// @param col_end End of range of columns to highlight,
-/// or -1 to highlight to end of line
-/// @param[out] err Details of an error that may have occurred
-/// @return The src_id that was used
-Integer buffer_add_highlight(Buffer buffer,
- Integer src_id,
- String hl_group,
- Integer line,
- Integer col_start,
- Integer col_end,
- Error *err)
+/// @param buffer Buffer handle
+/// @param ns_id namespace to use or -1 for ungrouped highlight
+/// @param hl_group Name of the highlight group to use
+/// @param line Line to highlight (zero-indexed)
+/// @param col_start Start of (byte-indexed) column range to highlight
+/// @param col_end End of (byte-indexed) column range to highlight,
+/// or -1 to highlight to end of line
+/// @param[out] err Error details, if any
+/// @return The ns_id that was used
+Integer nvim_buf_add_highlight(Buffer buffer,
+ Integer ns_id,
+ String hl_group,
+ Integer line,
+ Integer col_start,
+ Integer col_end,
+ Error *err)
+ FUNC_API_SINCE(1)
{
buf_T *buf = find_buffer_by_handle(buffer, err);
if (!buf) {
@@ -680,39 +946,44 @@ Integer buffer_add_highlight(Buffer buffer,
}
if (line < 0 || line >= MAXLNUM) {
- api_set_error(err, Validation, _("Line number outside range"));
+ api_set_error(err, kErrorTypeValidation, "Line number outside range");
return 0;
}
if (col_start < 0 || col_start > MAXCOL) {
- api_set_error(err, Validation, _("Column value outside range"));
+ api_set_error(err, kErrorTypeValidation, "Column value outside range");
return 0;
}
if (col_end < 0 || col_end > MAXCOL) {
col_end = MAXCOL;
}
- int hlg_id = syn_name2id((char_u*)hl_group.data);
- src_id = bufhl_add_hl(buf, (int)src_id, hlg_id, (linenr_T)line+1,
- (colnr_T)col_start+1, (colnr_T)col_end);
- return src_id;
+ int hlg_id = 0;
+ if (hl_group.size > 0) {
+ hlg_id = syn_check_group((char_u *)hl_group.data, (int)hl_group.size);
+ }
+
+ ns_id = bufhl_add_hl(buf, (int)ns_id, hlg_id, (linenr_T)line+1,
+ (colnr_T)col_start+1, (colnr_T)col_end);
+ return ns_id;
}
-/// Clears highlights from a given source group and a range of lines
+/// Clears namespaced objects, highlights and virtual text, from a line range
///
-/// To clear a source group in the entire buffer, pass in 1 and -1 to
+/// To clear the namespace in the entire buffer, pass in 0 and -1 to
/// line_start and line_end respectively.
///
-/// @param buffer The buffer handle
-/// @param src_id Highlight source group to clear, or -1 to clear all groups.
+/// @param buffer Buffer handle
+/// @param ns_id Namespace to clear, or -1 to clear all namespaces.
/// @param line_start Start of range of lines to clear
-/// @param line_end End of range of lines to clear (exclusive)
-/// or -1 to clear to end of file.
-/// @param[out] err Details of an error that may have occurred
-void buffer_clear_highlight(Buffer buffer,
- Integer src_id,
- Integer line_start,
- Integer line_end,
- Error *err)
+/// @param line_end End of range of lines to clear (exclusive) or -1 to clear
+/// to end of buffer.
+/// @param[out] err Error details, if any
+void nvim_buf_clear_namespace(Buffer buffer,
+ Integer ns_id,
+ Integer line_start,
+ Integer line_end,
+ Error *err)
+ FUNC_API_SINCE(5)
{
buf_T *buf = find_buffer_by_handle(buffer, err);
if (!buf) {
@@ -720,14 +991,122 @@ void buffer_clear_highlight(Buffer buffer,
}
if (line_start < 0 || line_start >= MAXLNUM) {
- api_set_error(err, Validation, _("Line number outside range"));
+ api_set_error(err, kErrorTypeValidation, "Line number outside range");
return;
}
if (line_end < 0 || line_end > MAXLNUM) {
line_end = MAXLNUM;
}
- bufhl_clear_line_range(buf, (int)src_id, (int)line_start+1, (int)line_end);
+ bufhl_clear_line_range(buf, (int)ns_id, (int)line_start+1, (int)line_end);
+}
+
+/// Clears highlights and virtual text from namespace and range of lines
+///
+/// @deprecated use |nvim_buf_clear_namespace|.
+///
+/// @param buffer Buffer handle
+/// @param ns_id Namespace to clear, or -1 to clear all.
+/// @param line_start Start of range of lines to clear
+/// @param line_end End of range of lines to clear (exclusive) or -1 to clear
+/// to end of file.
+/// @param[out] err Error details, if any
+void nvim_buf_clear_highlight(Buffer buffer,
+ Integer ns_id,
+ Integer line_start,
+ Integer line_end,
+ Error *err)
+ FUNC_API_SINCE(1)
+{
+ nvim_buf_clear_namespace(buffer, ns_id, line_start, line_end, err);
+}
+
+
+/// Set the virtual text (annotation) for a buffer line.
+///
+/// By default (and currently the only option) the text will be placed after
+/// the buffer text. Virtual text will never cause reflow, rather virtual
+/// text will be truncated at the end of the screen line. The virtual text will
+/// begin one cell (|lcs-eol| or space) after the ordinary text.
+///
+/// Namespaces are used to support batch deletion/updating of virtual text.
+/// To create a namespace, use |nvim_create_namespace|. Virtual text is
+/// cleared using |nvim_buf_clear_namespace|. The same `ns_id` can be used for
+/// both virtual text and highlights added by |nvim_buf_add_highlight|, both
+/// can then be cleared with a single call to |nvim_buf_clear_namespace|. If the
+/// virtual text never will be cleared by an API call, pass `ns_id = -1`.
+///
+/// As a shorthand, `ns_id = 0` can be used to create a new namespace for the
+/// virtual text, the allocated id is then returned.
+///
+/// @param buffer Buffer handle
+/// @param ns_id Namespace to use or 0 to create a namespace,
+/// or -1 for a ungrouped annotation
+/// @param line Line to annotate with virtual text (zero-indexed)
+/// @param chunks A list of [text, hl_group] arrays, each representing a
+/// text chunk with specified highlight. `hl_group` element
+/// can be omitted for no highlight.
+/// @param opts Optional parameters. Currently not used.
+/// @param[out] err Error details, if any
+/// @return The ns_id that was used
+Integer nvim_buf_set_virtual_text(Buffer buffer,
+ Integer ns_id,
+ Integer line,
+ Array chunks,
+ Dictionary opts,
+ Error *err)
+ FUNC_API_SINCE(5)
+{
+ buf_T *buf = find_buffer_by_handle(buffer, err);
+ if (!buf) {
+ return 0;
+ }
+
+ if (line < 0 || line >= MAXLNUM) {
+ api_set_error(err, kErrorTypeValidation, "Line number outside range");
+ return 0;
+ }
+
+ if (opts.size > 0) {
+ api_set_error(err, kErrorTypeValidation, "opts dict isn't empty");
+ return 0;
+ }
+
+ 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 }));
+ }
+
+ ns_id = bufhl_add_virt_text(buf, (int)ns_id, (linenr_T)line+1,
+ virt_text);
+ return ns_id;
+
+free_exit:
+ kv_destroy(virt_text);
+ return 0;
}
// Check if deleting lines made the cursor position invalid.
diff --git a/src/nvim/api/dispatch_deprecated.lua b/src/nvim/api/dispatch_deprecated.lua
new file mode 100644
index 0000000000..5650a77ac0
--- /dev/null
+++ b/src/nvim/api/dispatch_deprecated.lua
@@ -0,0 +1,69 @@
+local deprecated_aliases = {
+ nvim_buf_add_highlight="buffer_add_highlight",
+ nvim_buf_clear_highlight="buffer_clear_highlight",
+ nvim_buf_get_lines="buffer_get_lines",
+ nvim_buf_get_mark="buffer_get_mark",
+ nvim_buf_get_name="buffer_get_name",
+ nvim_buf_get_number="buffer_get_number",
+ nvim_buf_get_option="buffer_get_option",
+ nvim_buf_get_var="buffer_get_var",
+ nvim_buf_is_valid="buffer_is_valid",
+ nvim_buf_line_count="buffer_line_count",
+ nvim_buf_set_lines="buffer_set_lines",
+ nvim_buf_set_name="buffer_set_name",
+ nvim_buf_set_option="buffer_set_option",
+ nvim_call_function="vim_call_function",
+ nvim_command="vim_command",
+ nvim_command_output="vim_command_output",
+ nvim_del_current_line="vim_del_current_line",
+ nvim_err_write="vim_err_write",
+ nvim_err_writeln="vim_report_error",
+ nvim_eval="vim_eval",
+ nvim_feedkeys="vim_feedkeys",
+ nvim_get_api_info="vim_get_api_info",
+ nvim_get_color_by_name="vim_name_to_color",
+ nvim_get_color_map="vim_get_color_map",
+ nvim_get_current_buf="vim_get_current_buffer",
+ nvim_get_current_line="vim_get_current_line",
+ nvim_get_current_tabpage="vim_get_current_tabpage",
+ nvim_get_current_win="vim_get_current_window",
+ nvim_get_option="vim_get_option",
+ nvim_get_var="vim_get_var",
+ nvim_get_vvar="vim_get_vvar",
+ nvim_input="vim_input",
+ nvim_list_bufs="vim_get_buffers",
+ nvim_list_runtime_paths="vim_list_runtime_paths",
+ nvim_list_tabpages="vim_get_tabpages",
+ nvim_list_wins="vim_get_windows",
+ nvim_out_write="vim_out_write",
+ nvim_replace_termcodes="vim_replace_termcodes",
+ nvim_set_current_buf="vim_set_current_buffer",
+ nvim_set_current_dir="vim_change_directory",
+ nvim_set_current_line="vim_set_current_line",
+ nvim_set_current_tabpage="vim_set_current_tabpage",
+ nvim_set_current_win="vim_set_current_window",
+ nvim_set_option="vim_set_option",
+ nvim_strwidth="vim_strwidth",
+ nvim_subscribe="vim_subscribe",
+ nvim_tabpage_get_var="tabpage_get_var",
+ nvim_tabpage_get_win="tabpage_get_window",
+ nvim_tabpage_is_valid="tabpage_is_valid",
+ nvim_tabpage_list_wins="tabpage_get_windows",
+ nvim_ui_detach="ui_detach",
+ nvim_ui_try_resize="ui_try_resize",
+ nvim_unsubscribe="vim_unsubscribe",
+ nvim_win_get_buf="window_get_buffer",
+ nvim_win_get_cursor="window_get_cursor",
+ nvim_win_get_height="window_get_height",
+ nvim_win_get_option="window_get_option",
+ nvim_win_get_position="window_get_position",
+ nvim_win_get_tabpage="window_get_tabpage",
+ nvim_win_get_var="window_get_var",
+ nvim_win_get_width="window_get_width",
+ nvim_win_is_valid="window_is_valid",
+ nvim_win_set_cursor="window_set_cursor",
+ nvim_win_set_height="window_set_height",
+ nvim_win_set_option="window_set_option",
+ nvim_win_set_width="window_set_width",
+}
+return deprecated_aliases
diff --git a/src/nvim/api/private/defs.h b/src/nvim/api/private/defs.h
index 5fb95a163f..feca140547 100644
--- a/src/nvim/api/private/defs.h
+++ b/src/nvim/api/private/defs.h
@@ -5,11 +5,16 @@
#include <stdbool.h>
#include <string.h>
+#include "nvim/func_attr.h"
+#include "nvim/types.h"
+
#define ARRAY_DICT_INIT {.size = 0, .capacity = 0, .items = NULL}
#define STRING_INIT {.data = NULL, .size = 0}
#define OBJECT_INIT { .type = kObjectTypeNil }
-#define ERROR_INIT { .set = false }
-#define REMOTE_TYPE(type) typedef uint64_t type
+#define ERROR_INIT { .type = kErrorTypeNone, .msg = NULL }
+#define REMOTE_TYPE(type) typedef handle_T type
+
+#define ERROR_SET(e) ((e)->type != kErrorTypeNone)
#ifdef INCLUDE_GENERATED_DECLARATIONS
# define ArrayOf(...) Array
@@ -18,6 +23,7 @@
// Basic types
typedef enum {
+ kErrorTypeNone = -1,
kErrorTypeException,
kErrorTypeValidation
} ErrorType;
@@ -31,10 +37,31 @@ typedef enum {
/// Used as the message ID of notifications.
#define NO_RESPONSE UINT64_MAX
+/// Mask for all internal calls
+#define INTERNAL_CALL_MASK (((uint64_t)1) << (sizeof(uint64_t) * 8 - 1))
+
+/// Internal call from VimL code
+#define VIML_INTERNAL_CALL INTERNAL_CALL_MASK
+
+/// Internal call from lua code
+#define LUA_INTERNAL_CALL (VIML_INTERNAL_CALL + 1)
+
+static inline bool is_internal_call(const uint64_t channel_id)
+ REAL_FATTR_ALWAYS_INLINE REAL_FATTR_CONST;
+
+/// Check whether call is internal
+///
+/// @param[in] channel_id Channel id.
+///
+/// @return true if channel_id refers to internal channel.
+static inline bool is_internal_call(const uint64_t channel_id)
+{
+ return !!(channel_id & INTERNAL_CALL_MASK);
+}
+
typedef struct {
ErrorType type;
- char msg[1024];
- bool set;
+ char *msg;
} Error;
typedef bool Boolean;
@@ -71,24 +98,22 @@ typedef struct {
} Dictionary;
typedef enum {
- kObjectTypeBuffer,
- kObjectTypeWindow,
- kObjectTypeTabpage,
- kObjectTypeNil,
+ kObjectTypeNil = 0,
kObjectTypeBoolean,
kObjectTypeInteger,
kObjectTypeFloat,
kObjectTypeString,
kObjectTypeArray,
kObjectTypeDictionary,
+ // EXT types, cannot be split or reordered, see #EXT_OBJECT_TYPE_SHIFT
+ kObjectTypeBuffer,
+ kObjectTypeWindow,
+ kObjectTypeTabpage,
} ObjectType;
struct object {
ObjectType type;
union {
- Buffer buffer;
- Window window;
- Tabpage tabpage;
Boolean boolean;
Integer integer;
Float floating;
diff --git a/src/nvim/api/private/dispatch.c b/src/nvim/api/private/dispatch.c
new file mode 100644
index 0000000000..8492225a69
--- /dev/null
+++ b/src/nvim/api/private/dispatch.c
@@ -0,0 +1,52 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+#include <inttypes.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <assert.h>
+#include <msgpack.h>
+
+#include "nvim/map.h"
+#include "nvim/log.h"
+#include "nvim/vim.h"
+#include "nvim/msgpack_rpc/helpers.h"
+#include "nvim/api/private/dispatch.h"
+#include "nvim/api/private/helpers.h"
+#include "nvim/api/private/defs.h"
+
+#include "nvim/api/buffer.h"
+#include "nvim/api/tabpage.h"
+#include "nvim/api/ui.h"
+#include "nvim/api/vim.h"
+#include "nvim/api/window.h"
+
+static Map(String, MsgpackRpcRequestHandler) *methods = NULL;
+
+static void msgpack_rpc_add_method_handler(String method,
+ MsgpackRpcRequestHandler handler)
+{
+ map_put(String, MsgpackRpcRequestHandler)(methods, method, handler);
+}
+
+/// @param name API method name
+/// @param name_len name size (includes terminating NUL)
+MsgpackRpcRequestHandler msgpack_rpc_get_handler_for(const char *name,
+ size_t name_len,
+ Error *error)
+{
+ String m = { .data = (char *)name, .size = name_len };
+ MsgpackRpcRequestHandler rv =
+ map_get(String, MsgpackRpcRequestHandler)(methods, m);
+
+ if (!rv.fn) {
+ api_set_error(error, kErrorTypeException, "Invalid method: %.*s",
+ m.size > 0 ? (int)m.size : (int)sizeof("<empty>"),
+ m.size > 0 ? m.data : "<empty>");
+ }
+ return rv;
+}
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+#include "api/private/dispatch_wrappers.generated.h"
+#endif
diff --git a/src/nvim/api/private/dispatch.h b/src/nvim/api/private/dispatch.h
new file mode 100644
index 0000000000..39aabd708a
--- /dev/null
+++ b/src/nvim/api/private/dispatch.h
@@ -0,0 +1,23 @@
+#ifndef NVIM_API_PRIVATE_DISPATCH_H
+#define NVIM_API_PRIVATE_DISPATCH_H
+
+#include "nvim/api/private/defs.h"
+
+typedef Object (*ApiDispatchWrapper)(uint64_t channel_id,
+ Array args,
+ Error *error);
+
+/// The rpc_method_handlers table, used in msgpack_rpc_dispatch(), stores
+/// functions of this type.
+typedef struct {
+ ApiDispatchWrapper fn;
+ bool async; // function is always safe to run immediately instead of being
+ // put in a request queue for handling when nvim waits for input.
+} MsgpackRpcRequestHandler;
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "api/private/dispatch.h.generated.h"
+# include "api/private/dispatch_wrappers.h.generated.h"
+#endif
+
+#endif // NVIM_API_PRIVATE_DISPATCH_H
diff --git a/src/nvim/api/private/handle.c b/src/nvim/api/private/handle.c
index 69df7294ad..eb96192af2 100644
--- a/src/nvim/api/private/handle.c
+++ b/src/nvim/api/private/handle.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <stdint.h>
@@ -5,30 +8,26 @@
#include "nvim/map.h"
#include "nvim/api/private/handle.h"
-#define HANDLE_INIT(name) name##_handles = pmap_new(uint64_t)()
+#define HANDLE_INIT(name) name##_handles = pmap_new(handle_T)()
#define HANDLE_IMPL(type, name) \
- static PMap(uint64_t) *name##_handles = NULL; \
+ static PMap(handle_T) *name##_handles = NULL; /* NOLINT */ \
\
- type *handle_get_##name(uint64_t handle) \
+ type *handle_get_##name(handle_T handle) \
{ \
- return pmap_get(uint64_t)(name##_handles, handle); \
+ return pmap_get(handle_T)(name##_handles, handle); \
} \
\
void handle_register_##name(type *name) \
{ \
- assert(!name->handle); \
- name->handle = next_handle++; \
- pmap_put(uint64_t)(name##_handles, name->handle, name); \
+ pmap_put(handle_T)(name##_handles, name->handle, name); \
} \
\
void handle_unregister_##name(type *name) \
{ \
- pmap_del(uint64_t)(name##_handles, name->handle); \
+ pmap_del(handle_T)(name##_handles, name->handle); \
}
-static uint64_t next_handle = 1;
-
HANDLE_IMPL(buf_T, buffer)
HANDLE_IMPL(win_T, window)
HANDLE_IMPL(tabpage_T, tabpage)
diff --git a/src/nvim/api/private/handle.h b/src/nvim/api/private/handle.h
index 804e266dc3..26e9dc3314 100644
--- a/src/nvim/api/private/handle.h
+++ b/src/nvim/api/private/handle.h
@@ -3,14 +3,18 @@
#include "nvim/vim.h"
#include "nvim/buffer_defs.h"
+#include "nvim/api/private/defs.h"
#define HANDLE_DECLS(type, name) \
- type *handle_get_##name(uint64_t handle); \
+ type *handle_get_##name(handle_T handle); \
void handle_register_##name(type *name); \
void handle_unregister_##name(type *name);
+// handle_get_buffer handle_register_buffer, handle_unregister_buffer
HANDLE_DECLS(buf_T, buffer)
+// handle_get_window handle_register_window, handle_unregister_window
HANDLE_DECLS(win_T, window)
+// handle_get_tabpage handle_register_tabpage, handle_unregister_tabpage
HANDLE_DECLS(tabpage_T, tabpage)
void handle_init(void);
diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c
index c88bf2127a..82c9a1da67 100644
--- a/src/nvim/api/private/helpers.c
+++ b/src/nvim/api/private/helpers.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <inttypes.h>
#include <stdbool.h>
@@ -7,18 +10,24 @@
#include "nvim/api/private/helpers.h"
#include "nvim/api/private/defs.h"
#include "nvim/api/private/handle.h"
+#include "nvim/msgpack_rpc/helpers.h"
#include "nvim/ascii.h"
+#include "nvim/assert.h"
#include "nvim/vim.h"
#include "nvim/buffer.h"
#include "nvim/window.h"
+#include "nvim/memline.h"
#include "nvim/memory.h"
#include "nvim/eval.h"
+#include "nvim/eval/typval.h"
#include "nvim/map_defs.h"
#include "nvim/map.h"
#include "nvim/option.h"
#include "nvim/option_defs.h"
-#include "nvim/eval/typval_encode.h"
+#include "nvim/version.h"
#include "nvim/lib/kvec.h"
+#include "nvim/getchar.h"
+#include "nvim/ui.h"
/// Helper structure for vim_to_object
typedef struct {
@@ -27,9 +36,75 @@ typedef struct {
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "api/private/helpers.c.generated.h"
+# include "api/private/funcs_metadata.generated.h"
+# include "api/private/ui_events_metadata.generated.h"
#endif
+/// Start block that may cause VimL exceptions while evaluating another code
+///
+/// Used when caller is supposed to be operating when other VimL code is being
+/// processed and that โ€œother VimL codeโ€ must not be affected.
+///
+/// @param[out] tstate Location where try state should be saved.
+void try_enter(TryState *const tstate)
+{
+ // TODO(ZyX-I): Check whether try_enter()/try_leave() may use
+ // enter_cleanup()/leave_cleanup(). Or
+ // save_dbg_stuff()/restore_dbg_stuff().
+ *tstate = (TryState) {
+ .current_exception = current_exception,
+ .msg_list = (const struct msglist *const *)msg_list,
+ .private_msg_list = NULL,
+ .trylevel = trylevel,
+ .got_int = got_int,
+ .need_rethrow = need_rethrow,
+ .did_emsg = did_emsg,
+ };
+ msg_list = &tstate->private_msg_list;
+ current_exception = NULL;
+ trylevel = 1;
+ got_int = false;
+ need_rethrow = false;
+ did_emsg = false;
+}
+
+/// End try block, set the error message if any and restore previous state
+///
+/// @warning Return is consistent with most functions (false on error), not with
+/// try_end (true on error).
+///
+/// @param[in] tstate Previous state to restore.
+/// @param[out] err Location where error should be saved.
+///
+/// @return false if error occurred, true otherwise.
+bool try_leave(const TryState *const tstate, Error *const err)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ const bool ret = !try_end(err);
+ assert(trylevel == 0);
+ assert(!need_rethrow);
+ assert(!got_int);
+ assert(!did_emsg);
+ assert(msg_list == &tstate->private_msg_list);
+ assert(*msg_list == NULL);
+ assert(current_exception == NULL);
+ msg_list = (struct msglist **)tstate->msg_list;
+ current_exception = tstate->current_exception;
+ trylevel = tstate->trylevel;
+ got_int = tstate->got_int;
+ need_rethrow = tstate->need_rethrow;
+ did_emsg = tstate->did_emsg;
+ return ret;
+}
+
/// Start block that may cause vimscript exceptions
+///
+/// Each try_start() call should be mirrored by try_end() call.
+///
+/// To be used as a replacement of `:try โ€ฆ catch โ€ฆ endtry` in C code, in cases
+/// when error flag could not already be set. If there may be pending error
+/// state at the time try_start() is executed which needs to be preserved,
+/// try_enter()/try_leave() pair should be used instead.
void try_start(void)
{
++trylevel;
@@ -42,20 +117,20 @@ void try_start(void)
/// @return true if an error occurred
bool try_end(Error *err)
{
- --trylevel;
+ // Note: all globals manipulated here should be saved/restored in
+ // try_enter/try_leave.
+ trylevel--;
- // Without this it stops processing all subsequent VimL commands and
- // generates strange error messages if I e.g. try calling Test() in a
- // cycle
+ // Set by emsg(), affects aborting(). See also enter_cleanup().
did_emsg = false;
if (got_int) {
- if (did_throw) {
+ if (current_exception) {
// If we got an interrupt, discard the current exception
discard_current_exception();
}
- api_set_error(err, Exception, _("Keyboard interrupt"));
+ api_set_error(err, kErrorTypeException, "Keyboard interrupt");
got_int = false;
} else if (msg_list != NULL && *msg_list != NULL) {
int should_free;
@@ -63,19 +138,18 @@ bool try_end(Error *err)
ET_ERROR,
NULL,
&should_free);
- xstrlcpy(err->msg, msg, sizeof(err->msg));
- err->set = true;
+ api_set_error(err, kErrorTypeException, "%s", msg);
free_global_msglist();
if (should_free) {
xfree(msg);
}
- } else if (did_throw) {
- api_set_error(err, Exception, "%s", current_exception->value);
+ } else if (current_exception) {
+ api_set_error(err, kErrorTypeException, "%s", current_exception->value);
discard_current_exception();
}
- return err->set;
+ return ERROR_SET(err);
}
/// Recursively expands a vimscript value in a dict
@@ -85,18 +159,17 @@ bool try_end(Error *err)
/// @param[out] err Details of an error that may have occurred
Object dict_get_value(dict_T *dict, String key, Error *err)
{
- hashitem_T *hi = hash_find(&dict->dv_hashtab, (uint8_t *) key.data);
+ dictitem_T *const di = tv_dict_find(dict, key.data, (ptrdiff_t)key.size);
- if (HASHITEM_EMPTY(hi)) {
- api_set_error(err, Validation, _("Key not found"));
- return (Object) OBJECT_INIT;
+ if (di == NULL) {
+ api_set_error(err, kErrorTypeValidation, "Key not found: %s", key.data);
+ return (Object)OBJECT_INIT;
}
- dictitem_T *di = dict_lookup(hi);
return vim_to_object(&di->di_tv);
}
-/// Set a value in a dict. Objects are recursively expanded into their
+/// Set a value in a scope dict. Objects are recursively expanded into their
/// vimscript equivalents.
///
/// @param dict The vimscript dict
@@ -104,42 +177,50 @@ Object dict_get_value(dict_T *dict, String key, Error *err)
/// @param value The new value
/// @param del Delete key in place of setting it. Argument `value` is ignored in
/// this case.
+/// @param retval If true the old value will be converted and returned.
/// @param[out] err Details of an error that may have occurred
-/// @return the old value, if any
-Object dict_set_value(dict_T *dict, String key, Object value, bool del,
- Error *err)
+/// @return The old value if `retval` is true and the key was present, else NIL
+Object dict_set_var(dict_T *dict, String key, Object value, bool del,
+ bool retval, Error *err)
{
Object rv = OBJECT_INIT;
+ dictitem_T *di = tv_dict_find(dict, key.data, (ptrdiff_t)key.size);
- if (dict->dv_lock) {
- api_set_error(err, Exception, _("Dictionary is locked"));
+ if (di != NULL) {
+ if (di->di_flags & DI_FLAGS_RO) {
+ api_set_error(err, kErrorTypeException, "Key is read-only: %s", key.data);
+ return rv;
+ } else if (di->di_flags & DI_FLAGS_LOCK) {
+ api_set_error(err, kErrorTypeException, "Key is locked: %s", key.data);
+ return rv;
+ } else if (del && (di->di_flags & DI_FLAGS_FIX)) {
+ api_set_error(err, kErrorTypeException, "Key is fixed: %s", key.data);
+ return rv;
+ }
+ } else if (dict->dv_lock) {
+ api_set_error(err, kErrorTypeException, "Dictionary is locked");
return rv;
- }
-
- if (key.size == 0) {
- api_set_error(err, Validation, _("Empty dictionary keys aren't allowed"));
+ } else if (key.size == 0) {
+ api_set_error(err, kErrorTypeValidation, "Key name is empty");
return rv;
- }
-
- if (key.size > INT_MAX) {
- api_set_error(err, Validation, _("Key length is too high"));
+ } else if (key.size > INT_MAX) {
+ api_set_error(err, kErrorTypeValidation, "Key name is too long");
return rv;
}
- dictitem_T *di = dict_find(dict, (uint8_t *)key.data, (int)key.size);
-
if (del) {
// Delete the key
if (di == NULL) {
// Doesn't exist, fail
- api_set_error(err, Validation, _("Key \"%s\" doesn't exist"), key.data);
+ api_set_error(err, kErrorTypeValidation, "Key not found: %s",
+ key.data);
} else {
// Return the old value
- rv = vim_to_object(&di->di_tv);
+ if (retval) {
+ rv = vim_to_object(&di->di_tv);
+ }
// Delete the entry
- hashitem_T *hi = hash_find(&dict->dv_hashtab, di->di_key);
- hash_remove(&dict->dv_hashtab, hi);
- dictitem_free(di);
+ tv_dict_item_remove(dict, di);
}
} else {
// Update the key
@@ -152,18 +233,20 @@ Object dict_set_value(dict_T *dict, String key, Object value, bool del,
if (di == NULL) {
// Need to create an entry
- di = dictitem_alloc((uint8_t *) key.data);
- dict_add(dict, di);
+ di = tv_dict_item_alloc_len(key.data, key.size);
+ tv_dict_add(dict, di);
} else {
// Return the old value
- rv = vim_to_object(&di->di_tv);
- clear_tv(&di->di_tv);
+ if (retval) {
+ rv = vim_to_object(&di->di_tv);
+ }
+ tv_clear(&di->di_tv);
}
// Update the value
- copy_tv(&tv, &di->di_tv);
+ tv_copy(&tv, &di->di_tv);
// Clear the temporary variable
- clear_tv(&tv);
+ tv_clear(&tv);
}
return rv;
@@ -182,7 +265,7 @@ Object get_option_from(void *from, int type, String name, Error *err)
Object rv = OBJECT_INIT;
if (name.size == 0) {
- api_set_error(err, Validation, _("Empty option name"));
+ api_set_error(err, kErrorTypeValidation, "Empty option name");
return rv;
}
@@ -193,9 +276,7 @@ Object get_option_from(void *from, int type, String name, Error *err)
type, from);
if (!flags) {
- api_set_error(err,
- Validation,
- _("Invalid option name \"%s\""),
+ api_set_error(err, kErrorTypeValidation, "Invalid option name: '%s'",
name.data);
return rv;
}
@@ -212,15 +293,14 @@ Object get_option_from(void *from, int type, String name, Error *err)
rv.data.string.data = stringval;
rv.data.string.size = strlen(stringval);
} else {
- api_set_error(err,
- Exception,
- _("Unable to get value for option \"%s\""),
+ api_set_error(err, kErrorTypeException,
+ "Failed to get value for option '%s'",
name.data);
}
} else {
api_set_error(err,
- Exception,
- _("Unknown type for option \"%s\""),
+ kErrorTypeException,
+ "Unknown type for option '%s'",
name.data);
}
@@ -234,35 +314,32 @@ Object get_option_from(void *from, int type, String name, Error *err)
/// @param type One of `SREQ_GLOBAL`, `SREQ_WIN` or `SREQ_BUF`
/// @param name The option name
/// @param[out] err Details of an error that may have occurred
-void set_option_to(void *to, int type, String name, Object value, Error *err)
+void set_option_to(uint64_t channel_id, void *to, int type,
+ String name, Object value, Error *err)
{
if (name.size == 0) {
- api_set_error(err, Validation, _("Empty option name"));
+ api_set_error(err, kErrorTypeValidation, "Empty option name");
return;
}
int flags = get_option_value_strict(name.data, NULL, NULL, type, to);
if (flags == 0) {
- api_set_error(err,
- Validation,
- _("Invalid option name \"%s\""),
+ api_set_error(err, kErrorTypeValidation, "Invalid option name '%s'",
name.data);
return;
}
if (value.type == kObjectTypeNil) {
if (type == SREQ_GLOBAL) {
- api_set_error(err,
- Exception,
- _("Unable to unset option \"%s\""),
+ api_set_error(err, kErrorTypeException, "Cannot unset option '%s'",
name.data);
return;
} else if (!(flags & SOPT_GLOBAL)) {
api_set_error(err,
- Exception,
- _("Cannot unset option \"%s\" "
- "because it doesn't have a global value"),
+ kErrorTypeException,
+ "Cannot unset option '%s' "
+ "because it doesn't have a global value",
name.data);
return;
} else {
@@ -271,69 +348,74 @@ void set_option_to(void *to, int type, String name, Object value, Error *err)
}
}
- int opt_flags = (type ? OPT_LOCAL : OPT_GLOBAL);
+ int numval = 0;
+ char *stringval = NULL;
if (flags & SOPT_BOOL) {
if (value.type != kObjectTypeBoolean) {
api_set_error(err,
- Validation,
- _("Option \"%s\" requires a boolean value"),
+ kErrorTypeValidation,
+ "Option '%s' requires a Boolean value",
name.data);
return;
}
- bool val = value.data.boolean;
- set_option_value_for(name.data, val, NULL, opt_flags, type, to, err);
+ numval = value.data.boolean;
} else if (flags & SOPT_NUM) {
if (value.type != kObjectTypeInteger) {
- api_set_error(err,
- Validation,
- _("Option \"%s\" requires an integer value"),
+ api_set_error(err, kErrorTypeValidation,
+ "Option '%s' requires an integer value",
name.data);
return;
}
if (value.data.integer > INT_MAX || value.data.integer < INT_MIN) {
- api_set_error(err,
- Validation,
- _("Value for option \"%s\" is outside range"),
+ api_set_error(err, kErrorTypeValidation,
+ "Value for option '%s' is out of range",
name.data);
return;
}
- int val = (int) value.data.integer;
- set_option_value_for(name.data, val, NULL, opt_flags, type, to, err);
+ numval = (int)value.data.integer;
} else {
if (value.type != kObjectTypeString) {
- api_set_error(err,
- Validation,
- _("Option \"%s\" requires a string value"),
+ api_set_error(err, kErrorTypeValidation,
+ "Option '%s' requires a string value",
name.data);
return;
}
- set_option_value_for(name.data, 0, value.data.string.data,
- opt_flags, type, to, err);
+ stringval = (char *)value.data.string.data;
}
+
+ const scid_T save_current_SID = current_SID;
+ current_SID = channel_id == LUA_INTERNAL_CALL ? SID_LUA : SID_API_CLIENT;
+ current_channel_id = channel_id;
+
+ const int opt_flags = (type == SREQ_GLOBAL) ? OPT_GLOBAL : OPT_LOCAL;
+ set_option_value_for(name.data, numval, stringval,
+ opt_flags, type, to, err);
+
+ current_SID = save_current_SID;
}
#define TYPVAL_ENCODE_ALLOW_SPECIALS false
-#define TYPVAL_ENCODE_CONV_NIL() \
+#define TYPVAL_ENCODE_CONV_NIL(tv) \
kv_push(edata->stack, NIL)
-#define TYPVAL_ENCODE_CONV_BOOL(num) \
+#define TYPVAL_ENCODE_CONV_BOOL(tv, num) \
kv_push(edata->stack, BOOLEAN_OBJ((Boolean)(num)))
-#define TYPVAL_ENCODE_CONV_NUMBER(num) \
+#define TYPVAL_ENCODE_CONV_NUMBER(tv, num) \
kv_push(edata->stack, INTEGER_OBJ((Integer)(num)))
#define TYPVAL_ENCODE_CONV_UNSIGNED_NUMBER TYPVAL_ENCODE_CONV_NUMBER
-#define TYPVAL_ENCODE_CONV_FLOAT(flt) \
- kv_push(edata->stack, FLOATING_OBJ((Float)(flt)))
+#define TYPVAL_ENCODE_CONV_FLOAT(tv, flt) \
+ kv_push(edata->stack, FLOAT_OBJ((Float)(flt)))
-#define TYPVAL_ENCODE_CONV_STRING(str, len) \
+#define TYPVAL_ENCODE_CONV_STRING(tv, str, len) \
do { \
const size_t len_ = (size_t)(len); \
const char *const str_ = (const char *)(str); \
@@ -346,16 +428,23 @@ void set_option_to(void *to, int type, String name, Object value, Error *err)
#define TYPVAL_ENCODE_CONV_STR_STRING TYPVAL_ENCODE_CONV_STRING
-#define TYPVAL_ENCODE_CONV_EXT_STRING(str, len, type) \
- TYPVAL_ENCODE_CONV_NIL()
+#define TYPVAL_ENCODE_CONV_EXT_STRING(tv, str, len, type) \
+ TYPVAL_ENCODE_CONV_NIL(tv)
+
+#define TYPVAL_ENCODE_CONV_FUNC_START(tv, fun) \
+ do { \
+ TYPVAL_ENCODE_CONV_NIL(tv); \
+ goto typval_encode_stop_converting_one_item; \
+ } while (0)
-#define TYPVAL_ENCODE_CONV_FUNC(fun) \
- TYPVAL_ENCODE_CONV_NIL()
+#define TYPVAL_ENCODE_CONV_FUNC_BEFORE_ARGS(tv, len)
+#define TYPVAL_ENCODE_CONV_FUNC_BEFORE_SELF(tv, len)
+#define TYPVAL_ENCODE_CONV_FUNC_END(tv)
-#define TYPVAL_ENCODE_CONV_EMPTY_LIST() \
+#define TYPVAL_ENCODE_CONV_EMPTY_LIST(tv) \
kv_push(edata->stack, ARRAY_OBJ(((Array) { .capacity = 0, .size = 0 })))
-#define TYPVAL_ENCODE_CONV_EMPTY_DICT() \
+#define TYPVAL_ENCODE_CONV_EMPTY_DICT(tv, dict) \
kv_push(edata->stack, \
DICTIONARY_OBJ(((Dictionary) { .capacity = 0, .size = 0 })))
@@ -363,17 +452,18 @@ static inline void typval_encode_list_start(EncodedData *const edata,
const size_t len)
FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_NONNULL_ALL
{
- const Object obj = OBJECT_INIT;
kv_push(edata->stack, ARRAY_OBJ(((Array) {
.capacity = len,
.size = 0,
- .items = xmalloc(len * sizeof(*obj.data.array.items)),
+ .items = xmalloc(len * sizeof(*((Object)OBJECT_INIT).data.array.items)),
})));
}
-#define TYPVAL_ENCODE_CONV_LIST_START(len) \
+#define TYPVAL_ENCODE_CONV_LIST_START(tv, len) \
typval_encode_list_start(edata, (size_t)(len))
+#define TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START(tv, mpsv)
+
static inline void typval_encode_between_list_items(EncodedData *const edata)
FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_NONNULL_ALL
{
@@ -384,7 +474,7 @@ static inline void typval_encode_between_list_items(EncodedData *const edata)
list->data.array.items[list->data.array.size++] = item;
}
-#define TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS() \
+#define TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS(tv) \
typval_encode_between_list_items(edata)
static inline void typval_encode_list_end(EncodedData *const edata)
@@ -397,25 +487,27 @@ static inline void typval_encode_list_end(EncodedData *const edata)
#endif
}
-#define TYPVAL_ENCODE_CONV_LIST_END() \
+#define TYPVAL_ENCODE_CONV_LIST_END(tv) \
typval_encode_list_end(edata)
static inline void typval_encode_dict_start(EncodedData *const edata,
const size_t len)
FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_NONNULL_ALL
{
- const Object obj = OBJECT_INIT;
kv_push(edata->stack, DICTIONARY_OBJ(((Dictionary) {
.capacity = len,
.size = 0,
- .items = xmalloc(len * sizeof(*obj.data.dictionary.items)),
+ .items = xmalloc(len * sizeof(
+ *((Object)OBJECT_INIT).data.dictionary.items)),
})));
}
-#define TYPVAL_ENCODE_CONV_DICT_START(len) \
+#define TYPVAL_ENCODE_CONV_DICT_START(tv, dict, len) \
typval_encode_dict_start(edata, (size_t)(len))
-#define TYPVAL_ENCODE_CONV_SPECIAL_DICT_KEY_CHECK(label, kv_pair)
+#define TYPVAL_ENCODE_CONV_REAL_DICT_AFTER_START(tv, dict, mpsv)
+
+#define TYPVAL_ENCODE_SPECIAL_DICT_KEY_CHECK(label, kv_pair)
static inline void typval_encode_after_key(EncodedData *const edata)
FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_NONNULL_ALL
@@ -434,7 +526,7 @@ static inline void typval_encode_after_key(EncodedData *const edata)
}
}
-#define TYPVAL_ENCODE_CONV_DICT_AFTER_KEY() \
+#define TYPVAL_ENCODE_CONV_DICT_AFTER_KEY(tv, dict) \
typval_encode_after_key(edata)
static inline void typval_encode_between_dict_items(EncodedData *const edata)
@@ -447,7 +539,7 @@ static inline void typval_encode_between_dict_items(EncodedData *const edata)
dict->data.dictionary.items[dict->data.dictionary.size++].value = val;
}
-#define TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS() \
+#define TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS(tv, dict) \
typval_encode_between_dict_items(edata)
static inline void typval_encode_dict_end(EncodedData *const edata)
@@ -460,31 +552,44 @@ static inline void typval_encode_dict_end(EncodedData *const edata)
#endif
}
-#define TYPVAL_ENCODE_CONV_DICT_END() \
+#define TYPVAL_ENCODE_CONV_DICT_END(tv, dict) \
typval_encode_dict_end(edata)
#define TYPVAL_ENCODE_CONV_RECURSE(val, conv_type) \
- TYPVAL_ENCODE_CONV_NIL()
-
-TYPVAL_ENCODE_DEFINE_CONV_FUNCTIONS(static, object, EncodedData *const, edata)
+ TYPVAL_ENCODE_CONV_NIL(val)
+
+#define TYPVAL_ENCODE_SCOPE static
+#define TYPVAL_ENCODE_NAME object
+#define TYPVAL_ENCODE_FIRST_ARG_TYPE EncodedData *const
+#define TYPVAL_ENCODE_FIRST_ARG_NAME edata
+#include "nvim/eval/typval_encode.c.h"
+#undef TYPVAL_ENCODE_SCOPE
+#undef TYPVAL_ENCODE_NAME
+#undef TYPVAL_ENCODE_FIRST_ARG_TYPE
+#undef TYPVAL_ENCODE_FIRST_ARG_NAME
#undef TYPVAL_ENCODE_CONV_STRING
#undef TYPVAL_ENCODE_CONV_STR_STRING
#undef TYPVAL_ENCODE_CONV_EXT_STRING
#undef TYPVAL_ENCODE_CONV_NUMBER
#undef TYPVAL_ENCODE_CONV_FLOAT
-#undef TYPVAL_ENCODE_CONV_FUNC
+#undef TYPVAL_ENCODE_CONV_FUNC_START
+#undef TYPVAL_ENCODE_CONV_FUNC_BEFORE_ARGS
+#undef TYPVAL_ENCODE_CONV_FUNC_BEFORE_SELF
+#undef TYPVAL_ENCODE_CONV_FUNC_END
#undef TYPVAL_ENCODE_CONV_EMPTY_LIST
#undef TYPVAL_ENCODE_CONV_LIST_START
+#undef TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START
#undef TYPVAL_ENCODE_CONV_EMPTY_DICT
#undef TYPVAL_ENCODE_CONV_NIL
#undef TYPVAL_ENCODE_CONV_BOOL
#undef TYPVAL_ENCODE_CONV_UNSIGNED_NUMBER
#undef TYPVAL_ENCODE_CONV_DICT_START
+#undef TYPVAL_ENCODE_CONV_REAL_DICT_AFTER_START
#undef TYPVAL_ENCODE_CONV_DICT_END
#undef TYPVAL_ENCODE_CONV_DICT_AFTER_KEY
#undef TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS
-#undef TYPVAL_ENCODE_CONV_SPECIAL_DICT_KEY_CHECK
+#undef TYPVAL_ENCODE_SPECIAL_DICT_KEY_CHECK
#undef TYPVAL_ENCODE_CONV_LIST_END
#undef TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS
#undef TYPVAL_ENCODE_CONV_RECURSE
@@ -498,7 +603,10 @@ TYPVAL_ENCODE_DEFINE_CONV_FUNCTIONS(static, object, EncodedData *const, edata)
Object vim_to_object(typval_T *obj)
{
EncodedData edata = { .stack = KV_INITIAL_VALUE };
- encode_vim_to_object(&edata, obj, "vim_to_object argument");
+ const int evo_ret = encode_vim_to_object(&edata, obj,
+ "vim_to_object argument");
+ (void)evo_ret;
+ assert(evo_ret == OK);
Object ret = kv_A(edata.stack, 0);
assert(kv_size(edata.stack) == 1);
kv_destroy(edata.stack);
@@ -507,37 +615,65 @@ Object vim_to_object(typval_T *obj)
buf_T *find_buffer_by_handle(Buffer buffer, Error *err)
{
+ if (buffer == 0) {
+ return curbuf;
+ }
+
buf_T *rv = handle_get_buffer(buffer);
if (!rv) {
- api_set_error(err, Validation, _("Invalid buffer id"));
+ api_set_error(err, kErrorTypeValidation, "Invalid buffer id");
}
return rv;
}
-win_T * find_window_by_handle(Window window, Error *err)
+win_T *find_window_by_handle(Window window, Error *err)
{
+ if (window == 0) {
+ return curwin;
+ }
+
win_T *rv = handle_get_window(window);
if (!rv) {
- api_set_error(err, Validation, _("Invalid window id"));
+ api_set_error(err, kErrorTypeValidation, "Invalid window id");
}
return rv;
}
-tabpage_T * find_tab_by_handle(Tabpage tabpage, Error *err)
+tabpage_T *find_tab_by_handle(Tabpage tabpage, Error *err)
{
+ if (tabpage == 0) {
+ return curtab;
+ }
+
tabpage_T *rv = handle_get_tabpage(tabpage);
if (!rv) {
- api_set_error(err, Validation, _("Invalid tabpage id"));
+ api_set_error(err, kErrorTypeValidation, "Invalid tabpage id");
}
return rv;
}
+/// Allocates a String consisting of a single char. Does not support multibyte
+/// characters. The resulting string is also NUL-terminated, to facilitate
+/// interoperating with code using C strings.
+///
+/// @param char the char to convert
+/// @return the resulting String, if the input char was NUL, an
+/// empty String is returned
+String cchar_to_string(char c)
+{
+ char buf[] = { c, NUL };
+ return (String){
+ .data = xmemdupz(buf, 1),
+ .size = (c != NUL) ? 1 : 0
+ };
+}
+
/// Copies a C string into a String (binary safe string, characters + length).
/// The resulting string is also NUL-terminated, to facilitate interoperating
/// with code using C strings.
@@ -548,16 +684,33 @@ tabpage_T * find_tab_by_handle(Tabpage tabpage, Error *err)
String cstr_to_string(const char *str)
{
if (str == NULL) {
- return (String) STRING_INIT;
+ return (String)STRING_INIT;
}
size_t len = strlen(str);
- return (String) {
- .data = xmemdupz(str, len),
- .size = len
+ return (String){
+ .data = xmemdupz(str, len),
+ .size = len,
};
}
+/// Copies buffer to an allocated String.
+/// The resulting string is also NUL-terminated, to facilitate interoperating
+/// with code using C strings.
+///
+/// @param buf the buffer to copy
+/// @param size length of the buffer
+/// @return the resulting String, if the input string was NULL, an
+/// empty String is returned
+String cbuf_to_string(const char *buf, size_t size)
+ FUNC_ATTR_NONNULL_ALL
+{
+ return (String){
+ .data = xmemdupz(buf, size),
+ .size = size
+ };
+}
+
/// Creates a String using the given C string. Unlike
/// cstr_to_string this function DOES NOT copy the C string.
///
@@ -567,15 +720,58 @@ String cstr_to_string(const char *str)
String cstr_as_string(char *str) FUNC_ATTR_PURE
{
if (str == NULL) {
- return (String) STRING_INIT;
+ return (String)STRING_INIT;
}
- return (String) {.data = str, .size = strlen(str)};
+ return (String){ .data = str, .size = strlen(str) };
}
+/// Collects `n` buffer lines into array `l`, optionally replacing newlines
+/// with NUL.
+///
+/// @param buf Buffer to get lines from
+/// @param n Number of lines to collect
+/// @param replace_nl Replace newlines ("\n") with NUL
+/// @param start Line number to start from
+/// @param[out] l Lines are copied here
+/// @param err[out] Error, if any
+/// @return true unless `err` was set
+bool buf_collect_lines(buf_T *buf, size_t n, int64_t start, bool replace_nl,
+ Array *l, Error *err)
+{
+ for (size_t i = 0; i < n; i++) {
+ int64_t lnum = start + (int64_t)i;
+
+ if (lnum >= MAXLNUM) {
+ if (err != NULL) {
+ api_set_error(err, kErrorTypeValidation, "Line index is too high");
+ }
+ return false;
+ }
+
+ const char *bufstr = (char *)ml_get_buf(buf, (linenr_T)lnum, false);
+ Object str = STRING_OBJ(cstr_to_string(bufstr));
+
+ if (replace_nl) {
+ // Vim represents NULs as NLs, but this may confuse clients.
+ strchrsub(str.data.string.data, '\n', '\0');
+ }
+
+ l->items[i] = str;
+ }
+
+ return true;
+}
+
+/// Converts from type Object to a VimL value.
+///
+/// @param obj Object to convert from.
+/// @param tv Conversion result is placed here. On failure member v_type is
+/// set to VAR_UNKNOWN (no allocation was made for this variable).
+/// returns true if conversion is successful, otherwise false.
bool object_to_vim(Object obj, typval_T *tv, Error *err)
{
tv->v_type = VAR_UNKNOWN;
- tv->v_lock = 0;
+ tv->v_lock = VAR_UNLOCKED;
switch (obj.type) {
case kObjectTypeNil:
@@ -592,13 +788,10 @@ bool object_to_vim(Object obj, typval_T *tv, Error *err)
case kObjectTypeWindow:
case kObjectTypeTabpage:
case kObjectTypeInteger:
- if (obj.data.integer > INT_MAX || obj.data.integer < INT_MIN) {
- api_set_error(err, Validation, _("Integer value outside range"));
- return false;
- }
-
+ STATIC_ASSERT(sizeof(obj.data.integer) <= sizeof(varnumber_T),
+ "Integer size must be <= VimL number size");
tv->v_type = VAR_NUMBER;
- tv->vval.v_number = (int)obj.data.integer;
+ tv->vval.v_number = (varnumber_T)obj.data.integer;
break;
case kObjectTypeFloat:
@@ -616,56 +809,59 @@ bool object_to_vim(Object obj, typval_T *tv, Error *err)
}
break;
- case kObjectTypeArray:
- tv->v_type = VAR_LIST;
- tv->vval.v_list = list_alloc();
+ case kObjectTypeArray: {
+ list_T *const list = tv_list_alloc((ptrdiff_t)obj.data.array.size);
for (uint32_t i = 0; i < obj.data.array.size; i++) {
Object item = obj.data.array.items[i];
- listitem_T *li = listitem_alloc();
+ typval_T li_tv;
- if (!object_to_vim(item, &li->li_tv, err)) {
- // cleanup
- listitem_free(li);
- list_free(tv->vval.v_list, true);
+ if (!object_to_vim(item, &li_tv, err)) {
+ tv_list_free(list);
return false;
}
- list_append(tv->vval.v_list, li);
+ tv_list_append_owned_tv(list, li_tv);
}
- tv->vval.v_list->lv_refcount++;
+ tv_list_ref(list);
+
+ tv->v_type = VAR_LIST;
+ tv->vval.v_list = list;
break;
+ }
- case kObjectTypeDictionary:
- tv->v_type = VAR_DICT;
- tv->vval.v_dict = dict_alloc();
+ case kObjectTypeDictionary: {
+ dict_T *const dict = tv_dict_alloc();
for (uint32_t i = 0; i < obj.data.dictionary.size; i++) {
KeyValuePair item = obj.data.dictionary.items[i];
String key = item.key;
if (key.size == 0) {
- api_set_error(err,
- Validation,
- _("Empty dictionary keys aren't allowed"));
+ api_set_error(err, kErrorTypeValidation,
+ "Empty dictionary keys aren't allowed");
// cleanup
- dict_free(tv->vval.v_dict, true);
+ tv_dict_free(dict);
return false;
}
- dictitem_T *di = dictitem_alloc((uint8_t *) key.data);
+ dictitem_T *const di = tv_dict_item_alloc(key.data);
if (!object_to_vim(item.value, &di->di_tv, err)) {
// cleanup
- dictitem_free(di);
- dict_free(tv->vval.v_dict, true);
+ tv_dict_item_free(di);
+ tv_dict_free(dict);
return false;
}
- dict_add(tv->vval.v_dict, di);
+ tv_dict_add(dict, di);
}
- tv->vval.v_dict->dv_refcount++;
+ dict->dv_refcount++;
+
+ tv->v_type = VAR_DICT;
+ tv->vval.v_dict = dict;
break;
+ }
default:
abort();
}
@@ -730,12 +926,25 @@ void api_free_dictionary(Dictionary value)
xfree(value.items);
}
+void api_clear_error(Error *value)
+ FUNC_ATTR_NONNULL_ALL
+{
+ if (!ERROR_SET(value)) {
+ return;
+ }
+ xfree(value->msg);
+ value->msg = NULL;
+ value->type = kErrorTypeNone;
+}
+
Dictionary api_metadata(void)
{
static Dictionary metadata = ARRAY_DICT_INIT;
if (!metadata.size) {
- msgpack_rpc_init_function_metadata(&metadata);
+ PUT(metadata, "version", DICTIONARY_OBJ(version_dict()));
+ init_function_metadata(&metadata);
+ init_ui_event_metadata(&metadata);
init_error_type_metadata(&metadata);
init_type_metadata(&metadata);
}
@@ -743,6 +952,44 @@ Dictionary api_metadata(void)
return copy_object(DICTIONARY_OBJ(metadata)).data.dictionary;
}
+static void init_function_metadata(Dictionary *metadata)
+{
+ msgpack_unpacked unpacked;
+ msgpack_unpacked_init(&unpacked);
+ if (msgpack_unpack_next(&unpacked,
+ (const char *)funcs_metadata,
+ sizeof(funcs_metadata),
+ NULL) != MSGPACK_UNPACK_SUCCESS) {
+ abort();
+ }
+ Object functions;
+ msgpack_rpc_to_object(&unpacked.data, &functions);
+ msgpack_unpacked_destroy(&unpacked);
+ PUT(*metadata, "functions", functions);
+}
+
+static void init_ui_event_metadata(Dictionary *metadata)
+{
+ msgpack_unpacked unpacked;
+ msgpack_unpacked_init(&unpacked);
+ if (msgpack_unpack_next(&unpacked,
+ (const char *)ui_events_metadata,
+ sizeof(ui_events_metadata),
+ NULL) != MSGPACK_UNPACK_SUCCESS) {
+ abort();
+ }
+ Object ui_events;
+ msgpack_rpc_to_object(&unpacked.data, &ui_events);
+ msgpack_unpacked_destroy(&unpacked);
+ PUT(*metadata, "ui_events", ui_events);
+ Array ui_options = ARRAY_DICT_INIT;
+ ADD(ui_options, STRING_OBJ(cstr_to_string("rgb")));
+ for (UIExtension i = 0; i < kUIExtCount; i++) {
+ ADD(ui_options, STRING_OBJ(cstr_to_string(ui_ext_names[i])));
+ }
+ PUT(*metadata, "ui_options", ARRAY_OBJ(ui_options));
+}
+
static void init_error_type_metadata(Dictionary *metadata)
{
Dictionary types = ARRAY_DICT_INIT;
@@ -758,18 +1005,25 @@ static void init_error_type_metadata(Dictionary *metadata)
PUT(*metadata, "error_types", DICTIONARY_OBJ(types));
}
+
static void init_type_metadata(Dictionary *metadata)
{
Dictionary types = ARRAY_DICT_INIT;
Dictionary buffer_metadata = ARRAY_DICT_INIT;
- PUT(buffer_metadata, "id", INTEGER_OBJ(kObjectTypeBuffer));
+ PUT(buffer_metadata, "id",
+ INTEGER_OBJ(kObjectTypeBuffer - EXT_OBJECT_TYPE_SHIFT));
+ PUT(buffer_metadata, "prefix", STRING_OBJ(cstr_to_string("nvim_buf_")));
Dictionary window_metadata = ARRAY_DICT_INIT;
- PUT(window_metadata, "id", INTEGER_OBJ(kObjectTypeWindow));
+ PUT(window_metadata, "id",
+ INTEGER_OBJ(kObjectTypeWindow - EXT_OBJECT_TYPE_SHIFT));
+ PUT(window_metadata, "prefix", STRING_OBJ(cstr_to_string("nvim_win_")));
Dictionary tabpage_metadata = ARRAY_DICT_INIT;
- PUT(tabpage_metadata, "id", INTEGER_OBJ(kObjectTypeTabpage));
+ PUT(tabpage_metadata, "id",
+ INTEGER_OBJ(kObjectTypeTabpage - EXT_OBJECT_TYPE_SHIFT));
+ PUT(tabpage_metadata, "prefix", STRING_OBJ(cstr_to_string("nvim_tabpage_")));
PUT(types, "Buffer", DICTIONARY_OBJ(buffer_metadata));
PUT(types, "Window", DICTIONARY_OBJ(window_metadata));
@@ -778,6 +1032,34 @@ static void init_type_metadata(Dictionary *metadata)
PUT(*metadata, "types", DICTIONARY_OBJ(types));
}
+String copy_string(String str)
+{
+ if (str.data != NULL) {
+ return (String){ .data = xmemdupz(str.data, str.size), .size = str.size };
+ } else {
+ return (String)STRING_INIT;
+ }
+}
+
+Array copy_array(Array array)
+{
+ Array rv = ARRAY_DICT_INIT;
+ for (size_t i = 0; i < array.size; i++) {
+ ADD(rv, copy_object(array.items[i]));
+ }
+ return rv;
+}
+
+Dictionary copy_dictionary(Dictionary dict)
+{
+ Dictionary rv = ARRAY_DICT_INIT;
+ for (size_t i = 0; i < dict.size; i++) {
+ KeyValuePair item = dict.items[i];
+ PUT(rv, item.key.data, copy_object(item.value));
+ }
+ return rv;
+}
+
/// Creates a deep clone of an object
Object copy_object(Object obj)
{
@@ -789,23 +1071,13 @@ Object copy_object(Object obj)
return obj;
case kObjectTypeString:
- return STRING_OBJ(cstr_to_string(obj.data.string.data));
+ return STRING_OBJ(copy_string(obj.data.string));
- case kObjectTypeArray: {
- Array rv = ARRAY_DICT_INIT;
- for (size_t i = 0; i < obj.data.array.size; i++) {
- ADD(rv, copy_object(obj.data.array.items[i]));
- }
- return ARRAY_OBJ(rv);
- }
+ case kObjectTypeArray:
+ return ARRAY_OBJ(copy_array(obj.data.array));
case kObjectTypeDictionary: {
- Dictionary rv = ARRAY_DICT_INIT;
- for (size_t i = 0; i < obj.data.dictionary.size; i++) {
- KeyValuePair item = obj.data.dictionary.items[i];
- PUT(rv, item.key.data, copy_object(item.value));
- }
- return DICTIONARY_OBJ(rv);
+ return DICTIONARY_OBJ(copy_dictionary(obj.data.dictionary));
}
default:
abort();
@@ -822,7 +1094,7 @@ static void set_option_value_for(char *key,
{
win_T *save_curwin = NULL;
tabpage_T *save_curtab = NULL;
- buf_T *save_curbuf = NULL;
+ bufref_T save_curbuf = { NULL, 0, 0 };
try_start();
switch (opt_type)
@@ -835,8 +1107,8 @@ static void set_option_value_for(char *key,
return;
}
api_set_error(err,
- Exception,
- _("Problem while switching windows"));
+ kErrorTypeException,
+ "Problem while switching windows");
return;
}
set_option_value_err(key, numval, stringval, opt_flags, err);
@@ -845,14 +1117,14 @@ static void set_option_value_for(char *key,
case SREQ_BUF:
switch_buffer(&save_curbuf, (buf_T *)from);
set_option_value_err(key, numval, stringval, opt_flags, err);
- restore_buffer(save_curbuf);
+ restore_buffer(&save_curbuf);
break;
case SREQ_GLOBAL:
set_option_value_err(key, numval, stringval, opt_flags, err);
break;
}
- if (err->set) {
+ if (ERROR_SET(err)) {
return;
}
@@ -868,15 +1140,69 @@ static void set_option_value_err(char *key,
{
char *errmsg;
- if ((errmsg = (char *)set_option_value((uint8_t *)key,
- numval,
- (uint8_t *)stringval,
- opt_flags)))
- {
+ if ((errmsg = set_option_value(key, numval, stringval, opt_flags))) {
if (try_end(err)) {
return;
}
- api_set_error(err, Exception, "%s", errmsg);
+ api_set_error(err, kErrorTypeException, "%s", errmsg);
}
}
+
+void api_set_error(Error *err, ErrorType errType, const char *format, ...)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PRINTF(3, 4)
+{
+ assert(kErrorTypeNone != errType);
+ va_list args1;
+ va_list args2;
+ va_start(args1, format);
+ va_copy(args2, args1);
+ int len = vsnprintf(NULL, 0, format, args1);
+ va_end(args1);
+ assert(len >= 0);
+ // Limit error message to 1 MB.
+ size_t bufsize = MIN((size_t)len + 1, 1024 * 1024);
+ err->msg = xmalloc(bufsize);
+ vsnprintf(err->msg, bufsize, format, args2);
+ va_end(args2);
+
+ err->type = errType;
+}
+
+/// Get an array containing dictionaries describing mappings
+/// based on mode and buffer id
+///
+/// @param mode The abbreviation for the mode
+/// @param buf The buffer to get the mapping array. NULL for global
+/// @returns Array of maparg()-like dictionaries describing mappings
+ArrayOf(Dictionary) keymap_array(String mode, buf_T *buf)
+{
+ Array mappings = ARRAY_DICT_INIT;
+ dict_T *const dict = tv_dict_alloc();
+
+ // Convert the string mode to the integer mode
+ // that is stored within each mapblock
+ char_u *p = (char_u *)mode.data;
+ int int_mode = get_map_mode(&p, 0);
+
+ // Determine the desired buffer value
+ long buffer_value = (buf == NULL) ? 0 : buf->handle;
+
+ for (int i = 0; i < MAX_MAPHASH; i++) {
+ for (const mapblock_T *current_maphash = get_maphash(i, buf);
+ current_maphash;
+ current_maphash = current_maphash->m_next) {
+ // Check for correct mode
+ if (int_mode & current_maphash->m_mode) {
+ mapblock_fill_dict(dict, current_maphash, buffer_value, false);
+ ADD(mappings, vim_to_object(
+ (typval_T[]) { { .v_type = VAR_DICT, .vval.v_dict = dict } }));
+
+ tv_dict_clear(dict);
+ }
+ }
+ }
+ tv_dict_free(dict);
+
+ return mappings;
+}
diff --git a/src/nvim/api/private/helpers.h b/src/nvim/api/private/helpers.h
index a946e35149..0634764f13 100644
--- a/src/nvim/api/private/helpers.h
+++ b/src/nvim/api/private/helpers.h
@@ -6,17 +6,9 @@
#include "nvim/api/private/defs.h"
#include "nvim/vim.h"
#include "nvim/memory.h"
+#include "nvim/ex_eval.h"
#include "nvim/lib/kvec.h"
-#define api_set_error(err, errtype, ...) \
- do { \
- snprintf((err)->msg, \
- sizeof((err)->msg), \
- __VA_ARGS__); \
- (err)->set = true; \
- (err)->type = kErrorType##errtype; \
- } while (0)
-
#define OBJECT_OBJ(o) o
#define BOOLEAN_OBJ(b) ((Object) { \
@@ -27,7 +19,7 @@
.type = kObjectTypeInteger, \
.data.integer = i })
-#define FLOATING_OBJ(f) ((Object) { \
+#define FLOAT_OBJ(f) ((Object) { \
.type = kObjectTypeFloat, \
.data.floating = f })
@@ -37,15 +29,15 @@
#define BUFFER_OBJ(s) ((Object) { \
.type = kObjectTypeBuffer, \
- .data.buffer = s })
+ .data.integer = s })
#define WINDOW_OBJ(s) ((Object) { \
.type = kObjectTypeWindow, \
- .data.window = s })
+ .data.integer = s })
#define TABPAGE_OBJ(s) ((Object) { \
.type = kObjectTypeTabpage, \
- .data.tabpage = s })
+ .data.integer = s })
#define ARRAY_OBJ(a) ((Object) { \
.type = kObjectTypeArray, \
@@ -91,6 +83,20 @@
#define api_free_window(value)
#define api_free_tabpage(value)
+/// Structure used for saving state for :try
+///
+/// Used when caller is supposed to be operating when other VimL code is being
+/// processed and that โ€œother VimL codeโ€ must not be affected.
+typedef struct {
+ except_T *current_exception;
+ struct msglist *private_msg_list;
+ const struct msglist *const *msg_list;
+ int trylevel;
+ int got_int;
+ int need_rethrow;
+ int did_emsg;
+} TryState;
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "api/private/helpers.h.generated.h"
#endif
diff --git a/src/nvim/api/tabpage.c b/src/nvim/api/tabpage.c
index c8311b0aa0..b6830d9fcf 100644
--- a/src/nvim/api/tabpage.c
+++ b/src/nvim/api/tabpage.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
@@ -11,10 +14,11 @@
/// Gets the windows in a tabpage
///
-/// @param tabpage The tabpage
-/// @param[out] err Details of an error that may have occurred
-/// @return The windows in `tabpage`
-ArrayOf(Window) tabpage_get_windows(Tabpage tabpage, Error *err)
+/// @param tabpage Tabpage
+/// @param[out] err Error details, if any
+/// @return List of windows in `tabpage`
+ArrayOf(Window) nvim_tabpage_list_wins(Tabpage tabpage, Error *err)
+ FUNC_API_SINCE(1)
{
Array rv = ARRAY_DICT_INIT;
tabpage_T *tab = find_tab_by_handle(tabpage, err);
@@ -39,11 +43,12 @@ ArrayOf(Window) tabpage_get_windows(Tabpage tabpage, Error *err)
/// Gets a tab-scoped (t:) variable
///
-/// @param tabpage The tab page handle
-/// @param name The variable name
-/// @param[out] err Details of an error that may have occurred
-/// @return The variable value
-Object tabpage_get_var(Tabpage tabpage, String name, Error *err)
+/// @param tabpage Tabpage handle
+/// @param name Variable name
+/// @param[out] err Error details, if any
+/// @return Variable value
+Object nvim_tabpage_get_var(Tabpage tabpage, String name, Error *err)
+ FUNC_API_SINCE(1)
{
tabpage_T *tab = find_tab_by_handle(tabpage, err);
@@ -56,11 +61,51 @@ Object tabpage_get_var(Tabpage tabpage, String name, Error *err)
/// Sets a tab-scoped (t:) variable
///
-/// @param tabpage handle
-/// @param name The variable name
-/// @param value The variable value
-/// @param[out] err Details of an error that may have occurred
-/// @return The old value or nil if there was no previous value.
+/// @param tabpage Tabpage handle
+/// @param name Variable name
+/// @param value Variable value
+/// @param[out] err Error details, if any
+void nvim_tabpage_set_var(Tabpage tabpage,
+ String name,
+ Object value,
+ Error *err)
+ FUNC_API_SINCE(1)
+{
+ tabpage_T *tab = find_tab_by_handle(tabpage, err);
+
+ if (!tab) {
+ return;
+ }
+
+ dict_set_var(tab->tp_vars, name, value, false, false, err);
+}
+
+/// Removes a tab-scoped (t:) variable
+///
+/// @param tabpage Tabpage handle
+/// @param name Variable name
+/// @param[out] err Error details, if any
+void nvim_tabpage_del_var(Tabpage tabpage, String name, Error *err)
+ FUNC_API_SINCE(1)
+{
+ tabpage_T *tab = find_tab_by_handle(tabpage, err);
+
+ if (!tab) {
+ return;
+ }
+
+ dict_set_var(tab->tp_vars, name, NIL, true, false, err);
+}
+
+/// Sets a tab-scoped (t:) variable
+///
+/// @deprecated
+///
+/// @param tabpage Tabpage handle
+/// @param name Variable name
+/// @param value Variable value
+/// @param[out] err Error details, if any
+/// @return Old value or nil if there was no previous value.
///
/// @warning It may return nil if there was no previous value
/// or if previous value was `v:null`.
@@ -72,18 +117,17 @@ Object tabpage_set_var(Tabpage tabpage, String name, Object value, Error *err)
return (Object) OBJECT_INIT;
}
- return dict_set_value(tab->tp_vars, name, value, false, err);
+ return dict_set_var(tab->tp_vars, name, value, false, true, err);
}
/// Removes a tab-scoped (t:) variable
///
-/// @param tabpage handle
-/// @param name The variable name
-/// @param[out] err Details of an error that may have occurred
-/// @return The old value or nil if there was no previous value.
+/// @deprecated
///
-/// @warning It may return nil if there was no previous value
-/// or if previous value was `v:null`.
+/// @param tabpage Tabpage handle
+/// @param name Variable name
+/// @param[out] err Error details, if any
+/// @return Old value
Object tabpage_del_var(Tabpage tabpage, String name, Error *err)
{
tabpage_T *tab = find_tab_by_handle(tabpage, err);
@@ -92,15 +136,16 @@ Object tabpage_del_var(Tabpage tabpage, String name, Error *err)
return (Object) OBJECT_INIT;
}
- return dict_set_value(tab->tp_vars, name, NIL, true, err);
+ return dict_set_var(tab->tp_vars, name, NIL, true, true, err);
}
-/// Gets the current window in a tab page
+/// Gets the current window in a tabpage
///
-/// @param tabpage The tab page handle
-/// @param[out] err Details of an error that may have occurred
-/// @return The Window handle
-Window tabpage_get_window(Tabpage tabpage, Error *err)
+/// @param tabpage Tabpage handle
+/// @param[out] err Error details, if any
+/// @return Window handle
+Window nvim_tabpage_get_win(Tabpage tabpage, Error *err)
+ FUNC_API_SINCE(1)
{
Window rv = 0;
tabpage_T *tab = find_tab_by_handle(tabpage, err);
@@ -110,7 +155,7 @@ Window tabpage_get_window(Tabpage tabpage, Error *err)
}
if (tab == curtab) {
- return vim_get_current_window();
+ return nvim_get_current_win();
} else {
FOR_ALL_WINDOWS_IN_TAB(wp, tab) {
if (wp == tab->tp_curwin) {
@@ -122,13 +167,34 @@ Window tabpage_get_window(Tabpage tabpage, Error *err)
}
}
-/// Checks if a tab page is valid
+/// Gets the tabpage number
+///
+/// @param tabpage Tabpage handle
+/// @param[out] err Error details, if any
+/// @return Tabpage number
+Integer nvim_tabpage_get_number(Tabpage tabpage, Error *err)
+ FUNC_API_SINCE(1)
+{
+ Integer rv = 0;
+ tabpage_T *tab = find_tab_by_handle(tabpage, err);
+
+ if (!tab) {
+ return rv;
+ }
+
+ return tabpage_index(tab);
+}
+
+/// Checks if a tabpage is valid
///
-/// @param tabpage The tab page handle
-/// @return true if the tab page is valid, false otherwise
-Boolean tabpage_is_valid(Tabpage tabpage)
+/// @param tabpage Tabpage handle
+/// @return true if the tabpage is valid, false otherwise
+Boolean nvim_tabpage_is_valid(Tabpage tabpage)
+ FUNC_API_SINCE(1)
{
Error stub = ERROR_INIT;
- return find_tab_by_handle(tabpage, &stub) != NULL;
+ Boolean ret = find_tab_by_handle(tabpage, &stub) != NULL;
+ api_clear_error(&stub);
+ return ret;
}
diff --git a/src/nvim/api/ui.c b/src/nvim/api/ui.c
index 1703d49296..7ba5251c60 100644
--- a/src/nvim/api/ui.c
+++ b/src/nvim/api/ui.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <stddef.h>
#include <stdint.h>
@@ -8,120 +11,264 @@
#include "nvim/memory.h"
#include "nvim/map.h"
#include "nvim/msgpack_rpc/channel.h"
+#include "nvim/api/ui.h"
#include "nvim/api/private/defs.h"
#include "nvim/api/private/helpers.h"
+#include "nvim/popupmnu.h"
+#include "nvim/cursor_shape.h"
+#include "nvim/highlight.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "api/ui.c.generated.h"
+# include "ui_events_remote.generated.h"
#endif
typedef struct {
uint64_t channel_id;
Array buffer;
+
+ int hl_id; // current higlight for legacy put event
+ Integer cursor_row, cursor_col; // Intended visibule cursor position
+
+ // Position of legacy cursor, used both for drawing and visible user cursor.
+ Integer client_row, client_col;
} UIData;
static PMap(uint64_t) *connected_uis = NULL;
void remote_ui_init(void)
- FUNC_API_NOEXPORT
+ FUNC_API_NOEXPORT
{
connected_uis = pmap_new(uint64_t)();
}
void remote_ui_disconnect(uint64_t channel_id)
- FUNC_API_NOEXPORT
+ FUNC_API_NOEXPORT
{
UI *ui = pmap_get(uint64_t)(connected_uis, channel_id);
if (!ui) {
return;
}
UIData *data = ui->data;
- // destroy pending screen updates
- api_free_array(data->buffer);
+ api_free_array(data->buffer); // Destroy pending screen updates.
pmap_del(uint64_t)(connected_uis, channel_id);
xfree(ui->data);
+ ui->data = NULL; // Flag UI as "stopped".
ui_detach_impl(ui);
xfree(ui);
}
-void ui_attach(uint64_t channel_id, Integer width, Integer height,
- Boolean enable_rgb, Error *err)
+/// Wait until ui has connected on stdio channel.
+void remote_ui_wait_for_attach(void)
+ FUNC_API_NOEXPORT
+{
+ Channel *channel = find_channel(CHAN_STDIO);
+ if (!channel) {
+ // this function should only be called in --embed mode, stdio channel
+ // can be assumed.
+ abort();
+ }
+
+ LOOP_PROCESS_EVENTS_UNTIL(&main_loop, channel->events, -1,
+ pmap_has(uint64_t)(connected_uis, CHAN_STDIO));
+}
+
+void nvim_ui_attach(uint64_t channel_id, Integer width, Integer height,
+ Dictionary options, Error *err)
+ FUNC_API_SINCE(1) FUNC_API_REMOTE_ONLY
{
if (pmap_has(uint64_t)(connected_uis, channel_id)) {
- api_set_error(err, Exception, _("UI already attached for channel"));
+ api_set_error(err, kErrorTypeException,
+ "UI already attached to channel: %" PRId64, channel_id);
return;
}
if (width <= 0 || height <= 0) {
- api_set_error(err, Validation,
- _("Expected width > 0 and height > 0"));
+ api_set_error(err, kErrorTypeValidation,
+ "Expected width > 0 and height > 0");
return;
}
- UIData *data = xmalloc(sizeof(UIData));
- data->channel_id = channel_id;
- data->buffer = (Array)ARRAY_DICT_INIT;
UI *ui = xcalloc(1, sizeof(UI));
ui->width = (int)width;
ui->height = (int)height;
- ui->rgb = enable_rgb;
- ui->data = data;
- ui->resize = remote_ui_resize;
- ui->clear = remote_ui_clear;
- ui->eol_clear = remote_ui_eol_clear;
- ui->cursor_goto = remote_ui_cursor_goto;
+ ui->rgb = true;
+ ui->grid_resize = remote_ui_grid_resize;
+ ui->grid_clear = remote_ui_grid_clear;
+ ui->grid_cursor_goto = remote_ui_grid_cursor_goto;
+ ui->mode_info_set = remote_ui_mode_info_set;
ui->update_menu = remote_ui_update_menu;
ui->busy_start = remote_ui_busy_start;
ui->busy_stop = remote_ui_busy_stop;
ui->mouse_on = remote_ui_mouse_on;
ui->mouse_off = remote_ui_mouse_off;
ui->mode_change = remote_ui_mode_change;
- ui->set_scroll_region = remote_ui_set_scroll_region;
- ui->scroll = remote_ui_scroll;
- ui->highlight_set = remote_ui_highlight_set;
- ui->put = remote_ui_put;
+ ui->grid_scroll = remote_ui_grid_scroll;
+ ui->hl_attr_define = remote_ui_hl_attr_define;
+ ui->raw_line = remote_ui_raw_line;
ui->bell = remote_ui_bell;
ui->visual_bell = remote_ui_visual_bell;
- ui->update_fg = remote_ui_update_fg;
- ui->update_bg = remote_ui_update_bg;
- ui->update_sp = remote_ui_update_sp;
+ ui->default_colors_set = remote_ui_default_colors_set;
ui->flush = remote_ui_flush;
ui->suspend = remote_ui_suspend;
ui->set_title = remote_ui_set_title;
ui->set_icon = remote_ui_set_icon;
+ ui->option_set = remote_ui_option_set;
+ ui->event = remote_ui_event;
+ ui->inspect = remote_ui_inspect;
+
+ memset(ui->ui_ext, 0, sizeof(ui->ui_ext));
+
+ for (size_t i = 0; i < options.size; i++) {
+ ui_set_option(ui, true, options.items[i].key, options.items[i].value, err);
+ if (ERROR_SET(err)) {
+ xfree(ui);
+ return;
+ }
+ }
+
+ if (ui->ui_ext[kUIHlState] || ui->ui_ext[kUIMultigrid]) {
+ ui->ui_ext[kUILinegrid] = true;
+ }
+
+ UIData *data = xmalloc(sizeof(UIData));
+ data->channel_id = channel_id;
+ data->buffer = (Array)ARRAY_DICT_INIT;
+ data->hl_id = 0;
+ data->client_col = -1;
+ ui->data = data;
+
pmap_put(uint64_t)(connected_uis, channel_id, ui);
ui_attach_impl(ui);
- return;
}
-void ui_detach(uint64_t channel_id, Error *err)
+/// @deprecated
+void ui_attach(uint64_t channel_id, Integer width, Integer height,
+ Boolean enable_rgb, Error *err)
+{
+ Dictionary opts = ARRAY_DICT_INIT;
+ PUT(opts, "rgb", BOOLEAN_OBJ(enable_rgb));
+ nvim_ui_attach(channel_id, width, height, opts, err);
+ api_free_dictionary(opts);
+}
+
+void nvim_ui_detach(uint64_t channel_id, Error *err)
+ FUNC_API_SINCE(1) FUNC_API_REMOTE_ONLY
{
if (!pmap_has(uint64_t)(connected_uis, channel_id)) {
- api_set_error(err, Exception, _("UI is not attached for channel"));
+ api_set_error(err, kErrorTypeException,
+ "UI not attached to channel: %" PRId64, channel_id);
+ return;
}
remote_ui_disconnect(channel_id);
}
-Object ui_try_resize(uint64_t channel_id, Integer width,
- Integer height, Error *err)
+
+void nvim_ui_try_resize(uint64_t channel_id, Integer width,
+ Integer height, Error *err)
+ FUNC_API_SINCE(1) FUNC_API_REMOTE_ONLY
{
if (!pmap_has(uint64_t)(connected_uis, channel_id)) {
- api_set_error(err, Exception, _("UI is not attached for channel"));
+ api_set_error(err, kErrorTypeException,
+ "UI not attached to channel: %" PRId64, channel_id);
+ return;
}
if (width <= 0 || height <= 0) {
- api_set_error(err, Validation,
- _("Expected width > 0 and height > 0"));
- return NIL;
+ api_set_error(err, kErrorTypeValidation,
+ "Expected width > 0 and height > 0");
+ return;
}
UI *ui = pmap_get(uint64_t)(connected_uis, channel_id);
ui->width = (int)width;
ui->height = (int)height;
ui_refresh();
- return NIL;
}
-static void push_call(UI *ui, char *name, Array args)
+void nvim_ui_set_option(uint64_t channel_id, String name,
+ Object value, Error *error)
+ FUNC_API_SINCE(1) FUNC_API_REMOTE_ONLY
+{
+ if (!pmap_has(uint64_t)(connected_uis, channel_id)) {
+ api_set_error(error, kErrorTypeException,
+ "UI not attached to channel: %" PRId64, channel_id);
+ return;
+ }
+ UI *ui = pmap_get(uint64_t)(connected_uis, channel_id);
+
+ ui_set_option(ui, false, name, value, error);
+}
+
+static void ui_set_option(UI *ui, bool init, String name, Object value,
+ Error *error)
+{
+ if (strequal(name.data, "rgb")) {
+ if (value.type != kObjectTypeBoolean) {
+ api_set_error(error, kErrorTypeValidation, "rgb must be a Boolean");
+ return;
+ }
+ ui->rgb = value.data.boolean;
+ // A little drastic, but only legacy uis need to use this option
+ if (!init) {
+ ui_refresh();
+ }
+ return;
+ }
+
+ // LEGACY: Deprecated option, use `ext_cmdline` instead.
+ bool is_popupmenu = strequal(name.data, "popupmenu_external");
+
+ for (UIExtension i = 0; i < kUIExtCount; i++) {
+ if (strequal(name.data, ui_ext_names[i])
+ || (i == kUIPopupmenu && is_popupmenu)) {
+ if (value.type != kObjectTypeBoolean) {
+ api_set_error(error, kErrorTypeValidation, "%s must be a Boolean",
+ name.data);
+ return;
+ }
+ bool boolval = value.data.boolean;
+ if (!init && i == kUILinegrid && boolval != ui->ui_ext[i]) {
+ // There shouldn't be a reason for an UI to do this ever
+ // so explicitly don't support this.
+ api_set_error(error, kErrorTypeValidation,
+ "ext_linegrid option cannot be changed");
+ }
+ ui->ui_ext[i] = boolval;
+ if (!init) {
+ ui_set_ext_option(ui, i, boolval);
+ }
+ return;
+ }
+ }
+
+ api_set_error(error, kErrorTypeValidation, "No such UI option: %s",
+ name.data);
+}
+
+/// Tell nvim to resize a grid. Nvim sends grid_resize event with the
+/// requested grid size is within size limits and with maximum allowed size
+/// otherwise.
+///
+/// On invalid grid handle, fails with error.
+///
+/// @param grid The handle of the grid to be changed.
+/// @param width The new requested width.
+/// @param height The new requested height.
+void nvim_ui_try_resize_grid(uint64_t channel_id, Integer grid, Integer width,
+ Integer height, Error *error)
+ FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY
+{
+ if (!pmap_has(uint64_t)(connected_uis, channel_id)) {
+ api_set_error(error, kErrorTypeException,
+ "UI not attached to channel: %" PRId64, channel_id);
+ return;
+ }
+
+ ui_grid_resize((handle_T)grid, (int)width, (int)height, error);
+}
+
+/// Pushes data into UI.UIData, to be consumed later by remote_ui_flush().
+static void push_call(UI *ui, const char *name, Array args)
{
Array call = ARRAY_DICT_INIT;
UIData *data = ui->data;
@@ -143,201 +290,329 @@ static void push_call(UI *ui, char *name, Array args)
kv_A(data->buffer, kv_size(data->buffer) - 1).data.array = call;
}
-static void remote_ui_resize(UI *ui, int width, int height)
+static void remote_ui_grid_clear(UI *ui, Integer grid)
{
Array args = ARRAY_DICT_INIT;
- ADD(args, INTEGER_OBJ(width));
- ADD(args, INTEGER_OBJ(height));
- push_call(ui, "resize", args);
-}
-
-static void remote_ui_clear(UI *ui)
-{
- Array args = ARRAY_DICT_INIT;
- push_call(ui, "clear", args);
-}
-
-static void remote_ui_eol_clear(UI *ui)
-{
- Array args = ARRAY_DICT_INIT;
- push_call(ui, "eol_clear", args);
-}
-
-static void remote_ui_cursor_goto(UI *ui, int row, int col)
-{
- Array args = ARRAY_DICT_INIT;
- ADD(args, INTEGER_OBJ(row));
- ADD(args, INTEGER_OBJ(col));
- push_call(ui, "cursor_goto", args);
+ if (ui->ui_ext[kUILinegrid]) {
+ ADD(args, INTEGER_OBJ(grid));
+ }
+ const char *name = ui->ui_ext[kUILinegrid] ? "grid_clear" : "clear";
+ push_call(ui, name, args);
}
-static void remote_ui_update_menu(UI *ui)
+static void remote_ui_grid_resize(UI *ui, Integer grid,
+ Integer width, Integer height)
{
Array args = ARRAY_DICT_INIT;
- push_call(ui, "update_menu", args);
+ if (ui->ui_ext[kUILinegrid]) {
+ ADD(args, INTEGER_OBJ(grid));
+ }
+ ADD(args, INTEGER_OBJ(width));
+ ADD(args, INTEGER_OBJ(height));
+ const char *name = ui->ui_ext[kUILinegrid] ? "grid_resize" : "resize";
+ push_call(ui, name, args);
}
-static void remote_ui_busy_start(UI *ui)
+static void remote_ui_grid_scroll(UI *ui, Integer grid, Integer top,
+ Integer bot, Integer left, Integer right,
+ Integer rows, Integer cols)
{
- Array args = ARRAY_DICT_INIT;
- push_call(ui, "busy_start", args);
+ if (ui->ui_ext[kUILinegrid]) {
+ Array args = ARRAY_DICT_INIT;
+ ADD(args, INTEGER_OBJ(grid));
+ ADD(args, INTEGER_OBJ(top));
+ ADD(args, INTEGER_OBJ(bot));
+ ADD(args, INTEGER_OBJ(left));
+ ADD(args, INTEGER_OBJ(right));
+ ADD(args, INTEGER_OBJ(rows));
+ ADD(args, INTEGER_OBJ(cols));
+ push_call(ui, "grid_scroll", args);
+ } else {
+ Array args = ARRAY_DICT_INIT;
+ ADD(args, INTEGER_OBJ(top));
+ ADD(args, INTEGER_OBJ(bot-1));
+ ADD(args, INTEGER_OBJ(left));
+ ADD(args, INTEGER_OBJ(right-1));
+ push_call(ui, "set_scroll_region", args);
+
+ args = (Array)ARRAY_DICT_INIT;
+ ADD(args, INTEGER_OBJ(rows));
+ push_call(ui, "scroll", args);
+
+ // some clients have "clear" being affected by scroll region,
+ // so reset it.
+ args = (Array)ARRAY_DICT_INIT;
+ ADD(args, INTEGER_OBJ(0));
+ ADD(args, INTEGER_OBJ(ui->height-1));
+ ADD(args, INTEGER_OBJ(0));
+ ADD(args, INTEGER_OBJ(ui->width-1));
+ push_call(ui, "set_scroll_region", args);
+ }
}
-static void remote_ui_busy_stop(UI *ui)
+static void remote_ui_default_colors_set(UI *ui, Integer rgb_fg,
+ Integer rgb_bg, Integer rgb_sp,
+ Integer cterm_fg, Integer cterm_bg)
{
Array args = ARRAY_DICT_INIT;
- push_call(ui, "busy_stop", args);
+ ADD(args, INTEGER_OBJ(rgb_fg));
+ ADD(args, INTEGER_OBJ(rgb_bg));
+ ADD(args, INTEGER_OBJ(rgb_sp));
+ ADD(args, INTEGER_OBJ(cterm_fg));
+ ADD(args, INTEGER_OBJ(cterm_bg));
+ push_call(ui, "default_colors_set", args);
+
+ // Deprecated
+ if (!ui->ui_ext[kUILinegrid]) {
+ args = (Array)ARRAY_DICT_INIT;
+ ADD(args, INTEGER_OBJ(ui->rgb ? rgb_fg : cterm_fg - 1));
+ push_call(ui, "update_fg", args);
+
+ args = (Array)ARRAY_DICT_INIT;
+ ADD(args, INTEGER_OBJ(ui->rgb ? rgb_bg : cterm_bg - 1));
+ push_call(ui, "update_bg", args);
+
+ args = (Array)ARRAY_DICT_INIT;
+ ADD(args, INTEGER_OBJ(ui->rgb ? rgb_sp : -1));
+ push_call(ui, "update_sp", args);
+ }
}
-static void remote_ui_mouse_on(UI *ui)
+static void remote_ui_hl_attr_define(UI *ui, Integer id, HlAttrs rgb_attrs,
+ HlAttrs cterm_attrs, Array info)
{
+ if (!ui->ui_ext[kUILinegrid]) {
+ return;
+ }
Array args = ARRAY_DICT_INIT;
- push_call(ui, "mouse_on", args);
-}
-static void remote_ui_mouse_off(UI *ui)
-{
- Array args = ARRAY_DICT_INIT;
- push_call(ui, "mouse_off", args);
-}
+ ADD(args, INTEGER_OBJ(id));
+ ADD(args, DICTIONARY_OBJ(hlattrs2dict(rgb_attrs, true)));
+ ADD(args, DICTIONARY_OBJ(hlattrs2dict(cterm_attrs, false)));
-static void remote_ui_mode_change(UI *ui, int mode)
-{
- Array args = ARRAY_DICT_INIT;
- if (mode == INSERT) {
- ADD(args, STRING_OBJ(cstr_to_string("insert")));
- } else if (mode == REPLACE) {
- ADD(args, STRING_OBJ(cstr_to_string("replace")));
+ if (ui->ui_ext[kUIHlState]) {
+ ADD(args, ARRAY_OBJ(copy_array(info)));
} else {
- assert(mode == NORMAL);
- ADD(args, STRING_OBJ(cstr_to_string("normal")));
+ ADD(args, ARRAY_OBJ((Array)ARRAY_DICT_INIT));
}
- push_call(ui, "mode_change", args);
-}
-static void remote_ui_set_scroll_region(UI *ui, int top, int bot, int left,
- int right)
-{
- Array args = ARRAY_DICT_INIT;
- ADD(args, INTEGER_OBJ(top));
- ADD(args, INTEGER_OBJ(bot));
- ADD(args, INTEGER_OBJ(left));
- ADD(args, INTEGER_OBJ(right));
- push_call(ui, "set_scroll_region", args);
+ push_call(ui, "hl_attr_define", args);
}
-static void remote_ui_scroll(UI *ui, int count)
+static void remote_ui_highlight_set(UI *ui, int id)
{
Array args = ARRAY_DICT_INIT;
- ADD(args, INTEGER_OBJ(count));
- push_call(ui, "scroll", args);
-}
-
-static void remote_ui_highlight_set(UI *ui, HlAttrs attrs)
-{
- Array args = ARRAY_DICT_INIT;
- Dictionary hl = ARRAY_DICT_INIT;
-
- if (attrs.bold) {
- PUT(hl, "bold", BOOLEAN_OBJ(true));
- }
-
- if (attrs.underline) {
- PUT(hl, "underline", BOOLEAN_OBJ(true));
- }
-
- if (attrs.undercurl) {
- PUT(hl, "undercurl", BOOLEAN_OBJ(true));
- }
-
- if (attrs.italic) {
- PUT(hl, "italic", BOOLEAN_OBJ(true));
- }
-
- if (attrs.reverse) {
- PUT(hl, "reverse", BOOLEAN_OBJ(true));
- }
-
- if (attrs.foreground != -1) {
- PUT(hl, "foreground", INTEGER_OBJ(attrs.foreground));
- }
+ UIData *data = ui->data;
- if (attrs.background != -1) {
- PUT(hl, "background", INTEGER_OBJ(attrs.background));
- }
- if (attrs.special != -1) {
- PUT(hl, "special", INTEGER_OBJ(attrs.special));
+ if (data->hl_id == id) {
+ return;
}
+ data->hl_id = id;
+ Dictionary hl = hlattrs2dict(syn_attr2entry(id), ui->rgb);
ADD(args, DICTIONARY_OBJ(hl));
push_call(ui, "highlight_set", args);
}
-static void remote_ui_put(UI *ui, uint8_t *data, size_t size)
+/// "true" cursor used only for input focus
+static void remote_ui_grid_cursor_goto(UI *ui, Integer grid, Integer row,
+ Integer col)
{
- Array args = ARRAY_DICT_INIT;
- String str = { .data = xmemdupz(data, size), .size = size };
- ADD(args, STRING_OBJ(str));
- push_call(ui, "put", args);
+ if (ui->ui_ext[kUILinegrid]) {
+ Array args = ARRAY_DICT_INIT;
+ ADD(args, INTEGER_OBJ(grid));
+ ADD(args, INTEGER_OBJ(row));
+ ADD(args, INTEGER_OBJ(col));
+ push_call(ui, "grid_cursor_goto", args);
+ } else {
+ UIData *data = ui->data;
+ data->cursor_row = row;
+ data->cursor_col = col;
+ remote_ui_cursor_goto(ui, row, col);
+ }
}
-static void remote_ui_bell(UI *ui)
+/// emulated cursor used both for drawing and for input focus
+static void remote_ui_cursor_goto(UI *ui, Integer row, Integer col)
{
+ UIData *data = ui->data;
+ if (data->client_row == row && data->client_col == col) {
+ return;
+ }
+ data->client_row = row;
+ data->client_col = col;
Array args = ARRAY_DICT_INIT;
- push_call(ui, "bell", args);
+ ADD(args, INTEGER_OBJ(row));
+ ADD(args, INTEGER_OBJ(col));
+ push_call(ui, "cursor_goto", args);
}
-static void remote_ui_visual_bell(UI *ui)
+static void remote_ui_put(UI *ui, const char *cell)
{
+ UIData *data = ui->data;
+ data->client_col++;
Array args = ARRAY_DICT_INIT;
- push_call(ui, "visual_bell", args);
+ ADD(args, STRING_OBJ(cstr_to_string(cell)));
+ push_call(ui, "put", args);
}
-static void remote_ui_update_fg(UI *ui, int fg)
+static void remote_ui_raw_line(UI *ui, Integer grid, Integer row,
+ Integer startcol, Integer endcol,
+ Integer clearcol, Integer clearattr,
+ Boolean wrap, const schar_T *chunk,
+ const sattr_T *attrs)
{
- Array args = ARRAY_DICT_INIT;
- ADD(args, INTEGER_OBJ(fg));
- push_call(ui, "update_fg", args);
+ UIData *data = ui->data;
+ if (ui->ui_ext[kUILinegrid]) {
+ Array args = ARRAY_DICT_INIT;
+ ADD(args, INTEGER_OBJ(grid));
+ ADD(args, INTEGER_OBJ(row));
+ ADD(args, INTEGER_OBJ(startcol));
+ Array cells = ARRAY_DICT_INIT;
+ int repeat = 0;
+ size_t ncells = (size_t)(endcol-startcol);
+ int last_hl = -1;
+ for (size_t i = 0; i < ncells; i++) {
+ repeat++;
+ if (i == ncells-1 || attrs[i] != attrs[i+1]
+ || STRCMP(chunk[i], chunk[i+1])) {
+ Array cell = ARRAY_DICT_INIT;
+ ADD(cell, STRING_OBJ(cstr_to_string((const char *)chunk[i])));
+ if (attrs[i] != last_hl || repeat > 1) {
+ ADD(cell, INTEGER_OBJ(attrs[i]));
+ last_hl = attrs[i];
+ }
+ if (repeat > 1) {
+ ADD(cell, INTEGER_OBJ(repeat));
+ }
+ ADD(cells, ARRAY_OBJ(cell));
+ repeat = 0;
+ }
+ }
+ if (endcol < clearcol) {
+ Array cell = ARRAY_DICT_INIT;
+ ADD(cell, STRING_OBJ(cstr_to_string(" ")));
+ ADD(cell, INTEGER_OBJ(clearattr));
+ ADD(cell, INTEGER_OBJ(clearcol-endcol));
+ ADD(cells, ARRAY_OBJ(cell));
+ }
+ ADD(args, ARRAY_OBJ(cells));
+
+ push_call(ui, "grid_line", args);
+ } else {
+ for (int i = 0; i < endcol-startcol; i++) {
+ remote_ui_cursor_goto(ui, row, startcol+i);
+ remote_ui_highlight_set(ui, attrs[i]);
+ remote_ui_put(ui, (const char *)chunk[i]);
+ if (utf_ambiguous_width(utf_ptr2char(chunk[i]))) {
+ data->client_col = -1; // force cursor update
+ }
+ }
+ if (endcol < clearcol) {
+ remote_ui_cursor_goto(ui, row, endcol);
+ remote_ui_highlight_set(ui, (int)clearattr);
+ // legacy eol_clear was only ever used with cleared attributes
+ // so be on the safe side
+ if (clearattr == 0 && clearcol == Columns) {
+ Array args = ARRAY_DICT_INIT;
+ push_call(ui, "eol_clear", args);
+ } else {
+ for (Integer c = endcol; c < clearcol; c++) {
+ remote_ui_put(ui, " ");
+ }
+ }
+ }
+ }
}
-static void remote_ui_update_bg(UI *ui, int bg)
+static void remote_ui_flush(UI *ui)
{
- Array args = ARRAY_DICT_INIT;
- ADD(args, INTEGER_OBJ(bg));
- push_call(ui, "update_bg", args);
+ UIData *data = ui->data;
+ if (data->buffer.size > 0) {
+ if (!ui->ui_ext[kUILinegrid]) {
+ remote_ui_cursor_goto(ui, data->cursor_row, data->cursor_col);
+ }
+ push_call(ui, "flush", (Array)ARRAY_DICT_INIT);
+ rpc_send_event(data->channel_id, "redraw", data->buffer);
+ data->buffer = (Array)ARRAY_DICT_INIT;
+ }
}
-static void remote_ui_update_sp(UI *ui, int sp)
+static Array translate_contents(UI *ui, Array contents)
{
- Array args = ARRAY_DICT_INIT;
- ADD(args, INTEGER_OBJ(sp));
- push_call(ui, "update_sp", args);
+ Array new_contents = ARRAY_DICT_INIT;
+ for (size_t i = 0; i < contents.size; i++) {
+ Array item = contents.items[i].data.array;
+ Array new_item = ARRAY_DICT_INIT;
+ int attr = (int)item.items[0].data.integer;
+ if (attr) {
+ Dictionary rgb_attrs = hlattrs2dict(syn_attr2entry(attr), ui->rgb);
+ ADD(new_item, DICTIONARY_OBJ(rgb_attrs));
+ } else {
+ ADD(new_item, DICTIONARY_OBJ((Dictionary)ARRAY_DICT_INIT));
+ }
+ ADD(new_item, copy_object(item.items[1]));
+ ADD(new_contents, ARRAY_OBJ(new_item));
+ }
+ return new_contents;
}
-static void remote_ui_flush(UI *ui)
+static Array translate_firstarg(UI *ui, Array args)
{
- UIData *data = ui->data;
- channel_send_event(data->channel_id, "redraw", data->buffer);
- data->buffer = (Array)ARRAY_DICT_INIT;
-}
+ Array new_args = ARRAY_DICT_INIT;
+ Array contents = args.items[0].data.array;
-static void remote_ui_suspend(UI *ui)
-{
- Array args = ARRAY_DICT_INIT;
- push_call(ui, "suspend", args);
+ ADD(new_args, ARRAY_OBJ(translate_contents(ui, contents)));
+ for (size_t i = 1; i < args.size; i++) {
+ ADD(new_args, copy_object(args.items[i]));
+ }
+ return new_args;
}
-static void remote_ui_set_title(UI *ui, char *title)
+static void remote_ui_event(UI *ui, char *name, Array args, bool *args_consumed)
{
- Array args = ARRAY_DICT_INIT;
- ADD(args, STRING_OBJ(cstr_to_string(title)));
- push_call(ui, "set_title", args);
+ if (!ui->ui_ext[kUILinegrid]) {
+ // the representation of highlights in cmdline changed, translate back
+ // never consumes args
+ if (strequal(name, "cmdline_show")) {
+ Array new_args = translate_firstarg(ui, args);
+ push_call(ui, name, new_args);
+ return;
+ } else if (strequal(name, "cmdline_block_show")) {
+ Array new_args = ARRAY_DICT_INIT;
+ Array block = args.items[0].data.array;
+ Array new_block = ARRAY_DICT_INIT;
+ for (size_t i = 0; i < block.size; i++) {
+ ADD(new_block,
+ ARRAY_OBJ(translate_contents(ui, block.items[i].data.array)));
+ }
+ ADD(new_args, ARRAY_OBJ(new_block));
+ push_call(ui, name, new_args);
+ return;
+ } else if (strequal(name, "cmdline_block_append")) {
+ Array new_args = translate_firstarg(ui, args);
+ push_call(ui, name, new_args);
+ return;
+ }
+ }
+
+ Array my_args = ARRAY_DICT_INIT;
+ // Objects are currently single-reference
+ // make a copy, but only if necessary
+ if (*args_consumed) {
+ for (size_t i = 0; i < args.size; i++) {
+ ADD(my_args, copy_object(args.items[i]));
+ }
+ } else {
+ my_args = args;
+ *args_consumed = true;
+ }
+ push_call(ui, name, my_args);
}
-static void remote_ui_set_icon(UI *ui, char *icon)
+static void remote_ui_inspect(UI *ui, Dictionary *info)
{
- Array args = ARRAY_DICT_INIT;
- ADD(args, STRING_OBJ(cstr_to_string(icon)));
- push_call(ui, "set_icon", args);
+ UIData *data = ui->data;
+ PUT(*info, "chan", INTEGER_OBJ((Integer)data->channel_id));
}
diff --git a/src/nvim/api/ui_events.in.h b/src/nvim/api/ui_events.in.h
new file mode 100644
index 0000000000..59a7780651
--- /dev/null
+++ b/src/nvim/api/ui_events.in.h
@@ -0,0 +1,130 @@
+#ifndef NVIM_API_UI_EVENTS_IN_H
+#define NVIM_API_UI_EVENTS_IN_H
+
+// This file is not compiled, just parsed for definitons
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# error "don't include this file, include nvim/ui.h"
+#endif
+
+#include "nvim/api/private/defs.h"
+#include "nvim/func_attr.h"
+#include "nvim/ui.h"
+
+void mode_info_set(Boolean enabled, Array cursor_styles)
+ FUNC_API_SINCE(3);
+void update_menu(void)
+ FUNC_API_SINCE(3);
+void busy_start(void)
+ FUNC_API_SINCE(3);
+void busy_stop(void)
+ FUNC_API_SINCE(3);
+void mouse_on(void)
+ FUNC_API_SINCE(3);
+void mouse_off(void)
+ FUNC_API_SINCE(3);
+void mode_change(String mode, Integer mode_idx)
+ FUNC_API_SINCE(3);
+void bell(void)
+ FUNC_API_SINCE(3);
+void visual_bell(void)
+ FUNC_API_SINCE(3);
+void flush(void)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_IMPL;
+void suspend(void)
+ FUNC_API_SINCE(3) FUNC_API_BRIDGE_IMPL;
+void set_title(String title)
+ FUNC_API_SINCE(3);
+void set_icon(String icon)
+ FUNC_API_SINCE(3);
+void option_set(String name, Object value)
+ FUNC_API_SINCE(4) FUNC_API_BRIDGE_IMPL;
+
+// First revison of the grid protocol, used by default
+void update_fg(Integer fg)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+void update_bg(Integer bg)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+void update_sp(Integer sp)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+void resize(Integer width, Integer height)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+void clear(void)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+void eol_clear(void)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+void cursor_goto(Integer row, Integer col)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+void highlight_set(HlAttrs attrs)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY FUNC_API_REMOTE_IMPL;
+void put(String str)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+void set_scroll_region(Integer top, Integer bot, Integer left, Integer right)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+void scroll(Integer count)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+
+// Second revison of the grid protocol, used with ext_linegrid ui option
+void default_colors_set(Integer rgb_fg, Integer rgb_bg, Integer rgb_sp,
+ Integer cterm_fg, Integer cterm_bg)
+ FUNC_API_SINCE(4) FUNC_API_REMOTE_IMPL;
+void hl_attr_define(Integer id, HlAttrs rgb_attrs, HlAttrs cterm_attrs,
+ Array info)
+ FUNC_API_SINCE(5) FUNC_API_REMOTE_IMPL FUNC_API_BRIDGE_IMPL;
+void grid_resize(Integer grid, Integer width, Integer height)
+ FUNC_API_SINCE(5) FUNC_API_REMOTE_IMPL;
+void grid_clear(Integer grid)
+ FUNC_API_SINCE(5) FUNC_API_REMOTE_IMPL;
+void grid_cursor_goto(Integer grid, Integer row, Integer col)
+ FUNC_API_SINCE(5) FUNC_API_REMOTE_IMPL;
+void grid_line(Integer grid, Integer row, Integer col_start, Array data)
+ FUNC_API_SINCE(5) FUNC_API_REMOTE_ONLY;
+void grid_scroll(Integer grid, Integer top, Integer bot,
+ Integer left, Integer right, Integer rows, Integer cols)
+ FUNC_API_SINCE(5) FUNC_API_REMOTE_IMPL;
+void grid_destroy(Integer grid)
+ FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY;
+
+void win_pos(Integer grid, Integer win, Integer startrow,
+ Integer startcol, Integer width, Integer height)
+ FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY;
+void win_hide(Integer grid)
+ FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY;
+void win_scroll_over_start(void)
+ FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY;
+void win_scroll_over_reset(void)
+ FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY;
+
+void popupmenu_show(Array items, Integer selected,
+ Integer row, Integer col, Integer grid)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+void popupmenu_hide(void)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+void popupmenu_select(Integer selected)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+
+void tabline_update(Tabpage current, Array tabs)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+
+void cmdline_show(Array content, Integer pos, String firstc, String prompt,
+ Integer indent, Integer level)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+void cmdline_pos(Integer pos, Integer level)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+void cmdline_special_char(String c, Boolean shift, Integer level)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+void cmdline_hide(Integer level)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+void cmdline_block_show(Array lines)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+void cmdline_block_append(Array lines)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+void cmdline_block_hide(void)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+
+void wildmenu_show(Array items)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+void wildmenu_select(Integer selected)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+void wildmenu_hide(void)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
+#endif // NVIM_API_UI_EVENTS_IN_H
diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c
index ac7cc65ee4..ce7ef681ef 100644
--- a/src/nvim/api/vim.c
+++ b/src/nvim/api/vim.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <stdint.h>
#include <inttypes.h>
@@ -10,21 +13,33 @@
#include "nvim/ascii.h"
#include "nvim/api/private/helpers.h"
#include "nvim/api/private/defs.h"
+#include "nvim/api/private/dispatch.h"
#include "nvim/api/buffer.h"
#include "nvim/msgpack_rpc/channel.h"
+#include "nvim/msgpack_rpc/helpers.h"
+#include "nvim/lua/executor.h"
#include "nvim/vim.h"
#include "nvim/buffer.h"
+#include "nvim/file_search.h"
+#include "nvim/highlight.h"
#include "nvim/window.h"
#include "nvim/types.h"
#include "nvim/ex_docmd.h"
#include "nvim/screen.h"
#include "nvim/memory.h"
#include "nvim/message.h"
+#include "nvim/edit.h"
#include "nvim/eval.h"
-#include "nvim/misc2.h"
+#include "nvim/eval/typval.h"
+#include "nvim/option.h"
+#include "nvim/state.h"
#include "nvim/syntax.h"
#include "nvim/getchar.h"
#include "nvim/os/input.h"
+#include "nvim/os/process.h"
+#include "nvim/viml/parser/expressions.h"
+#include "nvim/viml/parser/parser.h"
+#include "nvim/ui.h"
#define LINE_BUFFER_SIZE 4096
@@ -32,36 +47,98 @@
# include "api/vim.c.generated.h"
#endif
-/// Executes an ex-mode command str
+void api_vim_init(void)
+ FUNC_API_NOEXPORT
+{
+ namespace_ids = map_new(String, handle_T)();
+}
+
+void api_vim_free_all_mem(void)
+ FUNC_API_NOEXPORT
+{
+ String name;
+ handle_T id;
+ map_foreach(namespace_ids, name, id, {
+ (void)id;
+ xfree(name.data);
+ })
+ map_free(String, handle_T)(namespace_ids);
+}
+
+/// Executes an ex-command.
///
-/// @param str The command str
-/// @param[out] err Details of an error that may have occurred
-void vim_command(String str, Error *err)
+/// On execution error: fails with VimL error, does not update v:errmsg.
+///
+/// @param command Ex-command string
+/// @param[out] err Error details (Vim error), if any
+void nvim_command(String command, Error *err)
+ FUNC_API_SINCE(1)
{
- // Run the command
try_start();
- do_cmdline_cmd(str.data);
- update_screen(VALID);
+ do_cmdline_cmd(command.data);
try_end(err);
}
-/// Passes input keys to Neovim
+/// Gets a highlight definition by name.
///
-/// @param keys to be typed
-/// @param mode specifies the mapping options
-/// @param escape_csi the string needs escaping for K_SPECIAL/CSI bytes
+/// @param name Highlight group name
+/// @param rgb Export RGB colors
+/// @param[out] err Error details, if any
+/// @return Highlight definition map
+/// @see nvim_get_hl_by_id
+Dictionary nvim_get_hl_by_name(String name, Boolean rgb, Error *err)
+ FUNC_API_SINCE(3)
+{
+ Dictionary result = ARRAY_DICT_INIT;
+ int id = syn_name2id((const char_u *)name.data);
+
+ if (id == 0) {
+ api_set_error(err, kErrorTypeException, "Invalid highlight name: %s",
+ name.data);
+ return result;
+ }
+ result = nvim_get_hl_by_id(id, rgb, err);
+ return result;
+}
+
+/// Gets a highlight definition by id. |hlID()|
+///
+/// @param hl_id Highlight id as returned by |hlID()|
+/// @param rgb Export RGB colors
+/// @param[out] err Error details, if any
+/// @return Highlight definition map
+/// @see nvim_get_hl_by_name
+Dictionary nvim_get_hl_by_id(Integer hl_id, Boolean rgb, Error *err)
+ FUNC_API_SINCE(3)
+{
+ Dictionary dic = ARRAY_DICT_INIT;
+ if (syn_get_final_id((int)hl_id) == 0) {
+ api_set_error(err, kErrorTypeException,
+ "Invalid highlight id: %" PRId64, hl_id);
+ return dic;
+ }
+ int attrcode = syn_id2attr((int)hl_id);
+ return hl_get_attr_by_id(attrcode, rgb, err);
+}
+
+/// Sends input-keys to Nvim, subject to various quirks controlled by `mode`
+/// flags. This is a blocking call, unlike |nvim_input()|.
+///
+/// On execution error: does not fail, but updates v:errmsg.
+///
+/// @param keys to be typed
+/// @param mode behavior flags, see |feedkeys()|
+/// @param escape_csi If true, escape K_SPECIAL/CSI bytes in `keys`
/// @see feedkeys()
/// @see vim_strsave_escape_csi
-void vim_feedkeys(String keys, String mode, Boolean escape_csi)
+void nvim_feedkeys(String keys, String mode, Boolean escape_csi)
+ FUNC_API_SINCE(1)
{
bool remap = true;
bool insert = false;
bool typed = false;
bool execute = false;
-
- if (keys.size == 0) {
- return;
- }
+ bool dangerous = false;
for (size_t i = 0; i < mode.size; ++i) {
switch (mode.data[i]) {
@@ -70,9 +147,14 @@ void vim_feedkeys(String keys, String mode, Boolean escape_csi)
case 't': typed = true; break;
case 'i': insert = true; break;
case 'x': execute = true; break;
+ case '!': dangerous = true; break;
}
}
+ if (keys.size == 0 && !execute) {
+ return;
+ }
+
char *keys_esc;
if (escape_csi) {
// Need to escape K_SPECIAL and CSI before putting the string in the
@@ -92,100 +174,193 @@ void vim_feedkeys(String keys, String mode, Boolean escape_csi)
typebuf_was_filled = true;
}
if (execute) {
+ int save_msg_scroll = msg_scroll;
+
+ /* Avoid a 1 second delay when the keys start Insert mode. */
+ msg_scroll = false;
+ if (!dangerous) {
+ ex_normal_busy++;
+ }
exec_normal(true);
+ if (!dangerous) {
+ ex_normal_busy--;
+ }
+ msg_scroll |= save_msg_scroll;
}
}
-/// Passes input keys to Neovim. Unlike `vim_feedkeys`, this will use a
-/// lower-level input buffer and the call is not deferred.
-/// This is the most reliable way to emulate real user input.
+/// Queues raw user-input. Unlike |nvim_feedkeys()|, this uses a low-level
+/// input buffer and the call is non-blocking (input is processed
+/// asynchronously by the eventloop).
+///
+/// On execution error: does not fail, but updates v:errmsg.
+///
+/// @note |keycodes| like <CR> are translated, so "<" is special.
+/// To input a literal "<", send <LT>.
///
/// @param keys to be typed
-/// @return The number of bytes actually written, which can be lower than
-/// requested if the buffer becomes full.
-Integer vim_input(String keys)
- FUNC_API_ASYNC
+/// @return Number of bytes actually written (can be fewer than
+/// requested if the buffer becomes full).
+Integer nvim_input(String keys)
+ FUNC_API_SINCE(1) FUNC_API_ASYNC
{
return (Integer)input_enqueue(keys);
}
-/// Replaces any terminal codes with the internal representation
+/// Replaces terminal codes and |keycodes| (<CR>, <Esc>, ...) in a string with
+/// the internal representation.
///
+/// @param str String to be converted.
+/// @param from_part Legacy Vim parameter. Usually true.
+/// @param do_lt Also translate <lt>. Ignored if `special` is false.
+/// @param special Replace |keycodes|, e.g. <CR> becomes a "\n" char.
/// @see replace_termcodes
/// @see cpoptions
-String vim_replace_termcodes(String str, Boolean from_part, Boolean do_lt,
+String nvim_replace_termcodes(String str, Boolean from_part, Boolean do_lt,
Boolean special)
+ FUNC_API_SINCE(1)
{
if (str.size == 0) {
// Empty string
- return str;
+ return (String) { .data = NULL, .size = 0 };
}
char *ptr = NULL;
- // Set 'cpoptions' the way we want it.
- // FLAG_CPO_BSLASH set - backslashes are *not* treated specially
- // FLAG_CPO_KEYCODE set - keycodes are *not* reverse-engineered
- // FLAG_CPO_SPECI unset - <Key> sequences *are* interpreted
- // The third from end parameter of replace_termcodes() is true so that the
- // <lt> sequence is recognised - needed for a real backslash.
replace_termcodes((char_u *)str.data, str.size, (char_u **)&ptr,
from_part, do_lt, special, CPO_TO_CPO_FLAGS);
return cstr_as_string(ptr);
}
-String vim_command_output(String str, Error *err)
+/// Executes an ex-command and returns its (non-error) output.
+/// Shell |:!| output is not captured.
+///
+/// On execution error: fails with VimL error, does not update v:errmsg.
+///
+/// @param command Ex-command string
+/// @param[out] err Error details (Vim error), if any
+String nvim_command_output(String command, Error *err)
+ FUNC_API_SINCE(1)
{
- do_cmdline_cmd("redir => v:command_output");
- vim_command(str, err);
- do_cmdline_cmd("redir END");
+ const int save_msg_silent = msg_silent;
+ garray_T *const save_capture_ga = capture_ga;
+ garray_T capture_local;
+ ga_init(&capture_local, 1, 80);
+
+ try_start();
+ msg_silent++;
+ capture_ga = &capture_local;
+ do_cmdline_cmd(command.data);
+ capture_ga = save_capture_ga;
+ msg_silent = save_msg_silent;
+ try_end(err);
- if (err->set) {
- return (String) STRING_INIT;
+ if (ERROR_SET(err)) {
+ goto theend;
+ }
+
+ if (capture_local.ga_len > 1) {
+ String s = (String){
+ .data = capture_local.ga_data,
+ .size = (size_t)capture_local.ga_len,
+ };
+ // redir usually (except :echon) prepends a newline.
+ if (s.data[0] == '\n') {
+ memmove(s.data, s.data + 1, s.size);
+ s.data[s.size - 1] = '\0';
+ s.size = s.size - 1;
+ }
+ return s; // Caller will free the memory.
}
- return cstr_to_string((char *)get_vim_var_str(VV_COMMAND_OUTPUT));
+theend:
+ ga_clear(&capture_local);
+ return (String)STRING_INIT;
}
-/// Evaluates the expression str using the Vim internal expression
-/// evaluator (see |expression|).
-/// Dictionaries and lists are recursively expanded.
+/// Evaluates a VimL expression (:help expression).
+/// Dictionaries and Lists are recursively expanded.
///
-/// @param str The expression str
-/// @param[out] err Details of an error that may have occurred
-/// @return The expanded object
-Object vim_eval(String str, Error *err)
+/// On execution error: fails with VimL error, does not update v:errmsg.
+///
+/// @param expr VimL expression string
+/// @param[out] err Error details, if any
+/// @return Evaluation result or expanded object
+Object nvim_eval(String expr, Error *err)
+ FUNC_API_SINCE(1)
{
+ static int recursive = 0; // recursion depth
Object rv = OBJECT_INIT;
- // Evaluate the expression
- try_start();
- typval_T *expr_result = eval_expr((char_u *) str.data, NULL);
- if (!expr_result) {
- api_set_error(err, Exception, _("Failed to evaluate expression"));
+ // `msg_list` controls the collection of abort-causing non-exception errors,
+ // which would otherwise be ignored. This pattern is from do_cmdline().
+ struct msglist **saved_msg_list = msg_list;
+ struct msglist *private_msg_list;
+ msg_list = &private_msg_list;
+ private_msg_list = NULL;
+
+ // Initialize `force_abort` and `suppress_errthrow` at the top level.
+ if (!recursive) {
+ force_abort = false;
+ suppress_errthrow = false;
+ current_exception = NULL;
+ // `did_emsg` is set by emsg(), which cancels execution.
+ did_emsg = false;
}
+ recursive++;
+ try_start();
+
+ typval_T rettv;
+ int ok = eval0((char_u *)expr.data, &rettv, NULL, true);
if (!try_end(err)) {
- // No errors, convert the result
- rv = vim_to_object(expr_result);
+ if (ok == FAIL) {
+ // Should never happen, try_end() should get the error. #8371
+ api_set_error(err, kErrorTypeException, "Failed to evaluate expression");
+ } else {
+ rv = vim_to_object(&rettv);
+ }
}
- // Free the vim object
- free_tv(expr_result);
+ tv_clear(&rettv);
+ msg_list = saved_msg_list; // Restore the exception context.
+ recursive--;
+
return rv;
}
-/// Call the given function with the given arguments stored in an array.
+/// Execute lua code. Parameters (if any) are available as `...` inside the
+/// chunk. The chunk can return a value.
+///
+/// Only statements are executed. To evaluate an expression, prefix it
+/// with `return`: return my_function(...)
///
-/// @param fname Function to call
-/// @param args Functions arguments packed in an Array
-/// @param[out] err Details of an error that may have occurred
+/// @param code lua code to execute
+/// @param args Arguments to the code
+/// @param[out] err Details of an error encountered while parsing
+/// or executing the lua code.
+///
+/// @return Return value of lua code if present or NIL.
+Object nvim_execute_lua(String code, Array args, Error *err)
+ FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY
+{
+ return executor_exec_lua_api(code, args, err);
+}
+
+/// Calls a VimL function.
+///
+/// @param fn Function name
+/// @param args Function arguments
+/// @param self `self` dict, or NULL for non-dict functions
+/// @param[out] err Error details, if any
/// @return Result of the function call
-Object vim_call_function(String fname, Array args, Error *err)
+static Object _call_function(String fn, Array args, dict_T *self, Error *err)
{
+ static int recursive = 0; // recursion depth
Object rv = OBJECT_INIT;
+
if (args.size > MAX_FUNC_ARGS) {
- api_set_error(err, Validation,
- _("Function called with too many arguments."));
+ api_set_error(err, kErrorTypeValidation,
+ "Function called with too many arguments");
return rv;
}
@@ -198,54 +373,168 @@ Object vim_call_function(String fname, Array args, Error *err)
}
}
+ // `msg_list` controls the collection of abort-causing non-exception errors,
+ // which would otherwise be ignored. This pattern is from do_cmdline().
+ struct msglist **saved_msg_list = msg_list;
+ struct msglist *private_msg_list;
+ msg_list = &private_msg_list;
+ private_msg_list = NULL;
+
+ // Initialize `force_abort` and `suppress_errthrow` at the top level.
+ if (!recursive) {
+ force_abort = false;
+ suppress_errthrow = false;
+ current_exception = NULL;
+ // `did_emsg` is set by emsg(), which cancels execution.
+ did_emsg = false;
+ }
+ recursive++;
try_start();
- // Call the function
typval_T rettv;
int dummy;
- int r = call_func((char_u *) fname.data, (int) fname.size,
- &rettv, (int) args.size, vim_args,
- curwin->w_cursor.lnum, curwin->w_cursor.lnum, &dummy,
- true,
- NULL);
- if (r == FAIL) {
- api_set_error(err, Exception, _("Error calling function."));
- }
+ // call_func() retval is deceptive, ignore it. Instead we set `msg_list`
+ // (see above) to capture abort-causing non-exception errors.
+ (void)call_func((char_u *)fn.data, (int)fn.size, &rettv, (int)args.size,
+ vim_args, NULL, curwin->w_cursor.lnum, curwin->w_cursor.lnum,
+ &dummy, true, NULL, self);
if (!try_end(err)) {
rv = vim_to_object(&rettv);
}
- clear_tv(&rettv);
+ tv_clear(&rettv);
+ msg_list = saved_msg_list; // Restore the exception context.
+ recursive--;
free_vim_args:
while (i > 0) {
- clear_tv(&vim_args[--i]);
+ tv_clear(&vim_args[--i]);
+ }
+
+ return rv;
+}
+
+/// Calls a VimL function with the given arguments.
+///
+/// On execution error: fails with VimL error, does not update v:errmsg.
+///
+/// @param fn Function to call
+/// @param args Function arguments packed in an Array
+/// @param[out] err Error details, if any
+/// @return Result of the function call
+Object nvim_call_function(String fn, Array args, Error *err)
+ FUNC_API_SINCE(1)
+{
+ return _call_function(fn, args, NULL, err);
+}
+
+/// Calls a VimL |Dictionary-function| with the given arguments.
+///
+/// On execution error: fails with VimL error, does not update v:errmsg.
+///
+/// @param dict Dictionary, or String evaluating to a VimL |self| dict
+/// @param fn Name of the function defined on the VimL dict
+/// @param args Function arguments packed in an Array
+/// @param[out] err Error details, if any
+/// @return Result of the function call
+Object nvim_call_dict_function(Object dict, String fn, Array args, Error *err)
+ FUNC_API_SINCE(4)
+{
+ Object rv = OBJECT_INIT;
+
+ typval_T rettv;
+ bool mustfree = false;
+ switch (dict.type) {
+ case kObjectTypeString: {
+ try_start();
+ if (eval0((char_u *)dict.data.string.data, &rettv, NULL, true) == FAIL) {
+ api_set_error(err, kErrorTypeException,
+ "Failed to evaluate dict expression");
+ }
+ if (try_end(err)) {
+ return rv;
+ }
+ // Evaluation of the string arg created a new dict or increased the
+ // refcount of a dict. Not necessary for a RPC dict.
+ mustfree = true;
+ break;
+ }
+ case kObjectTypeDictionary: {
+ if (!object_to_vim(dict, &rettv, err)) {
+ goto end;
+ }
+ break;
+ }
+ default: {
+ api_set_error(err, kErrorTypeValidation,
+ "dict argument type must be String or Dictionary");
+ return rv;
+ }
+ }
+ dict_T *self_dict = rettv.vval.v_dict;
+ if (rettv.v_type != VAR_DICT || !self_dict) {
+ api_set_error(err, kErrorTypeValidation, "dict not found");
+ goto end;
+ }
+
+ if (fn.data && fn.size > 0 && dict.type != kObjectTypeDictionary) {
+ dictitem_T *const di = tv_dict_find(self_dict, fn.data, (ptrdiff_t)fn.size);
+ if (di == NULL) {
+ api_set_error(err, kErrorTypeValidation, "Not found: %s", fn.data);
+ goto end;
+ }
+ if (di->di_tv.v_type == VAR_PARTIAL) {
+ api_set_error(err, kErrorTypeValidation,
+ "partial function not supported");
+ goto end;
+ }
+ if (di->di_tv.v_type != VAR_FUNC) {
+ api_set_error(err, kErrorTypeValidation, "Not a function: %s", fn.data);
+ goto end;
+ }
+ fn = (String) {
+ .data = (char *)di->di_tv.vval.v_string,
+ .size = strlen((char *)di->di_tv.vval.v_string),
+ };
+ }
+
+ if (!fn.data || fn.size < 1) {
+ api_set_error(err, kErrorTypeValidation, "Invalid (empty) function name");
+ goto end;
+ }
+
+ rv = _call_function(fn, args, self_dict, err);
+end:
+ if (mustfree) {
+ tv_clear(&rettv);
}
return rv;
}
-/// Calculates the number of display cells `str` occupies, tab is counted as
-/// one cell.
+/// Calculates the number of display cells occupied by `text`.
+/// <Tab> counts as one cell.
///
-/// @param str Some text
-/// @param[out] err Details of an error that may have occurred
-/// @return The number of cells
-Integer vim_strwidth(String str, Error *err)
+/// @param text Some text
+/// @param[out] err Error details, if any
+/// @return Number of cells
+Integer nvim_strwidth(String text, Error *err)
+ FUNC_API_SINCE(1)
{
- if (str.size > INT_MAX) {
- api_set_error(err, Validation, _("String length is too high"));
+ if (text.size > INT_MAX) {
+ api_set_error(err, kErrorTypeValidation, "String is too long");
return 0;
}
- return (Integer) mb_string2cells((char_u *) str.data);
+ return (Integer)mb_string2cells((char_u *)text.data);
}
-/// Gets a list of paths contained in 'runtimepath'
+/// Gets the paths contained in 'runtimepath'.
///
-/// @return The list of paths
-ArrayOf(String) vim_list_runtime_paths(void)
+/// @return List of paths
+ArrayOf(String) nvim_list_runtime_paths(void)
+ FUNC_API_SINCE(1)
{
Array rv = ARRAY_DICT_INIT;
- uint8_t *rtp = p_rtp;
+ char_u *rtp = p_rtp;
if (*rtp == NUL) {
// No paths
@@ -259,13 +548,14 @@ ArrayOf(String) vim_list_runtime_paths(void)
}
rtp++;
}
+ rv.size++;
// Allocate memory for the copies
- rv.items = xmalloc(sizeof(Object) * rv.size);
+ rv.items = xmalloc(sizeof(*rv.items) * rv.size);
// Reset the position
rtp = p_rtp;
// Start copying
- for (size_t i = 0; i < rv.size && *rtp != NUL; i++) {
+ for (size_t i = 0; i < rv.size; i++) {
rv.items[i].type = kObjectTypeString;
rv.items[i].data.string.data = xmalloc(MAXPATHL);
// Copy the path from 'runtimepath' to rv.items[i]
@@ -279,26 +569,27 @@ ArrayOf(String) vim_list_runtime_paths(void)
return rv;
}
-/// Changes Vim working directory
+/// Changes the global working directory.
///
-/// @param dir The new working directory
-/// @param[out] err Details of an error that may have occurred
-void vim_change_directory(String dir, Error *err)
+/// @param dir Directory path
+/// @param[out] err Error details, if any
+void nvim_set_current_dir(String dir, Error *err)
+ FUNC_API_SINCE(1)
{
if (dir.size >= MAXPATHL) {
- api_set_error(err, Validation, _("Directory string is too long"));
+ api_set_error(err, kErrorTypeValidation, "Directory name is too long");
return;
}
char string[MAXPATHL];
- strncpy(string, dir.data, dir.size);
+ memcpy(string, dir.data, dir.size);
string[dir.size] = NUL;
try_start();
- if (vim_chdir((char_u *)string)) {
+ if (vim_chdir((char_u *)string, kCdScopeGlobal)) {
if (!try_end(err)) {
- api_set_error(err, Exception, _("Failed to change directory"));
+ api_set_error(err, kErrorTypeException, "Failed to change directory");
}
return;
}
@@ -309,127 +600,166 @@ void vim_change_directory(String dir, Error *err)
/// Gets the current line
///
-/// @param[out] err Details of an error that may have occurred
-/// @return The current line string
-String vim_get_current_line(Error *err)
+/// @param[out] err Error details, if any
+/// @return Current line string
+String nvim_get_current_line(Error *err)
+ FUNC_API_SINCE(1)
{
return buffer_get_line(curbuf->handle, curwin->w_cursor.lnum - 1, err);
}
/// Sets the current line
///
-/// @param line The line contents
-/// @param[out] err Details of an error that may have occurred
-void vim_set_current_line(String line, Error *err)
+/// @param line Line contents
+/// @param[out] err Error details, if any
+void nvim_set_current_line(String line, Error *err)
+ FUNC_API_SINCE(1)
{
buffer_set_line(curbuf->handle, curwin->w_cursor.lnum - 1, line, err);
}
/// Deletes the current line
///
-/// @param[out] err Details of an error that may have occurred
-void vim_del_current_line(Error *err)
+/// @param[out] err Error details, if any
+void nvim_del_current_line(Error *err)
+ FUNC_API_SINCE(1)
{
buffer_del_line(curbuf->handle, curwin->w_cursor.lnum - 1, err);
}
-/// Gets a global variable
+/// Gets a global (g:) variable
///
-/// @param name The variable name
-/// @param[out] err Details of an error that may have occurred
-/// @return The variable value
-Object vim_get_var(String name, Error *err)
+/// @param name Variable name
+/// @param[out] err Error details, if any
+/// @return Variable value
+Object nvim_get_var(String name, Error *err)
+ FUNC_API_SINCE(1)
{
return dict_get_value(&globvardict, name, err);
}
-/// Sets a global variable
+/// Sets a global (g:) variable
///
-/// @param name The variable name
-/// @param value The variable value
-/// @param[out] err Details of an error that may have occurred
-/// @return The old value or nil if there was no previous value.
+/// @param name Variable name
+/// @param value Variable value
+/// @param[out] err Error details, if any
+void nvim_set_var(String name, Object value, Error *err)
+ FUNC_API_SINCE(1)
+{
+ dict_set_var(&globvardict, name, value, false, false, err);
+}
+
+/// Removes a global (g:) variable
///
-/// @warning It may return nil if there was no previous value
-/// or if previous value was `v:null`.
+/// @param name Variable name
+/// @param[out] err Error details, if any
+void nvim_del_var(String name, Error *err)
+ FUNC_API_SINCE(1)
+{
+ dict_set_var(&globvardict, name, NIL, true, false, err);
+}
+
+/// @deprecated
+/// @see nvim_set_var
+/// @return Old value or nil if there was no previous value.
+/// @warning May return nil if there was no previous value
+/// OR if previous value was `v:null`.
Object vim_set_var(String name, Object value, Error *err)
{
- return dict_set_value(&globvardict, name, value, false, err);
+ return dict_set_var(&globvardict, name, value, false, true, err);
}
-/// Removes a global variable
-///
-/// @param name The variable name
-/// @param[out] err Details of an error that may have occurred
-/// @return The old value or nil if there was no previous value.
-///
-/// @warning It may return nil if there was no previous value
-/// or if previous value was `v:null`.
+/// @deprecated
+/// @see nvim_del_var
Object vim_del_var(String name, Error *err)
{
- return dict_set_value(&globvardict, name, NIL, true, err);
+ return dict_set_var(&globvardict, name, NIL, true, true, err);
}
-/// Gets a vim variable
+/// Gets a v: variable
///
-/// @param name The variable name
-/// @param[out] err Details of an error that may have occurred
-/// @return The variable value
-Object vim_get_vvar(String name, Error *err)
+/// @param name Variable name
+/// @param[out] err Error details, if any
+/// @return Variable value
+Object nvim_get_vvar(String name, Error *err)
+ FUNC_API_SINCE(1)
{
return dict_get_value(&vimvardict, name, err);
}
+/// Sets a v: variable, if it is not readonly
+///
+/// @param name Variable name
+/// @param value Variable value
+/// @param[out] err Error details, if any
+void nvim_set_vvar(String name, Object value, Error *err)
+ FUNC_API_SINCE(6)
+{
+ dict_set_var(&vimvardict, name, value, false, false, err);
+}
+
/// Gets an option value string
///
-/// @param name The option name
-/// @param[out] err Details of an error that may have occurred
-/// @return The option value
-Object vim_get_option(String name, Error *err)
+/// @param name Option name
+/// @param[out] err Error details, if any
+/// @return Option value (global)
+Object nvim_get_option(String name, Error *err)
+ FUNC_API_SINCE(1)
{
return get_option_from(NULL, SREQ_GLOBAL, name, err);
}
/// Sets an option value
///
-/// @param name The option name
-/// @param value The new option value
-/// @param[out] err Details of an error that may have occurred
-void vim_set_option(String name, Object value, Error *err)
+/// @param name Option name
+/// @param value New option value
+/// @param[out] err Error details, if any
+void nvim_set_option(uint64_t channel_id, String name, Object value, Error *err)
+ FUNC_API_SINCE(1)
{
- set_option_to(NULL, SREQ_GLOBAL, name, value, err);
+ set_option_to(channel_id, NULL, SREQ_GLOBAL, name, value, err);
}
-/// Writes a message to vim output buffer
+/// Writes a message to the Vim output buffer. Does not append "\n", the
+/// message is buffered (won't display) until a linefeed is written.
///
-/// @param str The message
-void vim_out_write(String str)
+/// @param str Message
+void nvim_out_write(String str)
+ FUNC_API_SINCE(1)
{
write_msg(str, false);
}
-/// Writes a message to vim error buffer
+/// Writes a message to the Vim error buffer. Does not append "\n", the
+/// message is buffered (won't display) until a linefeed is written.
///
-/// @param str The message
-void vim_err_write(String str)
+/// @param str Message
+void nvim_err_write(String str)
+ FUNC_API_SINCE(1)
{
write_msg(str, true);
}
-/// Higher level error reporting function that ensures all str contents
-/// are written by sending a trailing linefeed to `vim_err_write`
+/// Writes a message to the Vim error buffer. Appends "\n", so the buffer is
+/// flushed (and displayed).
///
-/// @param str The message
-void vim_report_error(String str)
+/// @param str Message
+/// @see nvim_err_write()
+void nvim_err_writeln(String str)
+ FUNC_API_SINCE(1)
{
- vim_err_write(str);
- vim_err_write((String) {.data = "\n", .size = 1});
+ nvim_err_write(str);
+ nvim_err_write((String) { .data = "\n", .size = 1 });
}
/// Gets the current list of buffer handles
///
-/// @return The number of buffers
-ArrayOf(Buffer) vim_get_buffers(void)
+/// Includes unlisted (unloaded/deleted) buffers, like `:ls!`.
+/// Use |nvim_buf_is_loaded()| to check if a buffer is loaded.
+///
+/// @return List of buffer handles
+ArrayOf(Buffer) nvim_list_bufs(void)
+ FUNC_API_SINCE(1)
{
Array rv = ARRAY_DICT_INIT;
@@ -449,17 +779,19 @@ ArrayOf(Buffer) vim_get_buffers(void)
/// Gets the current buffer
///
-/// @reqturn The buffer handle
-Buffer vim_get_current_buffer(void)
+/// @return Buffer handle
+Buffer nvim_get_current_buf(void)
+ FUNC_API_SINCE(1)
{
return curbuf->handle;
}
/// Sets the current buffer
///
-/// @param id The buffer handle
-/// @param[out] err Details of an error that may have occurred
-void vim_set_current_buffer(Buffer buffer, Error *err)
+/// @param buffer Buffer handle
+/// @param[out] err Error details, if any
+void nvim_set_current_buf(Buffer buffer, Error *err)
+ FUNC_API_SINCE(1)
{
buf_T *buf = find_buffer_by_handle(buffer, err);
@@ -471,16 +803,17 @@ void vim_set_current_buffer(Buffer buffer, Error *err)
int result = do_buffer(DOBUF_GOTO, DOBUF_FIRST, FORWARD, buf->b_fnum, 0);
if (!try_end(err) && result == FAIL) {
api_set_error(err,
- Exception,
- _("Failed to switch to buffer %" PRIu64),
+ kErrorTypeException,
+ "Failed to switch to buffer %d",
buffer);
}
}
/// Gets the current list of window handles
///
-/// @return The number of windows
-ArrayOf(Window) vim_get_windows(void)
+/// @return List of window handles
+ArrayOf(Window) nvim_list_wins(void)
+ FUNC_API_SINCE(1)
{
Array rv = ARRAY_DICT_INIT;
@@ -500,16 +833,18 @@ ArrayOf(Window) vim_get_windows(void)
/// Gets the current window
///
-/// @return The window handle
-Window vim_get_current_window(void)
+/// @return Window handle
+Window nvim_get_current_win(void)
+ FUNC_API_SINCE(1)
{
return curwin->handle;
}
/// Sets the current window
///
-/// @param handle The window handle
-void vim_set_current_window(Window window, Error *err)
+/// @param window Window handle
+void nvim_set_current_win(Window window, Error *err)
+ FUNC_API_SINCE(1)
{
win_T *win = find_window_by_handle(window, err);
@@ -521,16 +856,17 @@ void vim_set_current_window(Window window, Error *err)
goto_tabpage_win(win_find_tabpage(win), win);
if (!try_end(err) && win != curwin) {
api_set_error(err,
- Exception,
- _("Failed to switch to window %" PRIu64),
+ kErrorTypeException,
+ "Failed to switch to window %d",
window);
}
}
/// Gets the current list of tabpage handles
///
-/// @return The number of tab pages
-ArrayOf(Tabpage) vim_get_tabpages(void)
+/// @return List of tabpage handles
+ArrayOf(Tabpage) nvim_list_tabpages(void)
+ FUNC_API_SINCE(1)
{
Array rv = ARRAY_DICT_INIT;
@@ -548,19 +884,21 @@ ArrayOf(Tabpage) vim_get_tabpages(void)
return rv;
}
-/// Gets the current tab page
+/// Gets the current tabpage
///
-/// @return The tab page handle
-Tabpage vim_get_current_tabpage(void)
+/// @return Tabpage handle
+Tabpage nvim_get_current_tabpage(void)
+ FUNC_API_SINCE(1)
{
return curtab->handle;
}
-/// Sets the current tab page
+/// Sets the current tabpage
///
-/// @param handle The tab page handle
-/// @param[out] err Details of an error that may have occurred
-void vim_set_current_tabpage(Tabpage tabpage, Error *err)
+/// @param tabpage Tabpage handle
+/// @param[out] err Error details, if any
+void nvim_set_current_tabpage(Tabpage tabpage, Error *err)
+ FUNC_API_SINCE(1)
{
tabpage_T *tp = find_tab_by_handle(tabpage, err);
@@ -572,30 +910,75 @@ void vim_set_current_tabpage(Tabpage tabpage, Error *err)
goto_tabpage_tp(tp, true, true);
if (!try_end(err) && tp != curtab) {
api_set_error(err,
- Exception,
- _("Failed to switch to tabpage %" PRIu64),
+ kErrorTypeException,
+ "Failed to switch to tabpage %d",
tabpage);
}
}
+/// Creates a new namespace, or gets an existing one
+///
+/// Namespaces are used for buffer highlights and virtual text, see
+/// |nvim_buf_add_highlight()| and |nvim_buf_set_virtual_text()|.
+///
+/// Namespaces can be named or anonymous. If `name` matches an existing
+/// namespace, the associated id is returned. If `name` is an empty string
+/// a new, anonymous namespace is created.
+///
+/// @param name Namespace name or empty string
+/// @return Namespace id
+Integer nvim_create_namespace(String name)
+ FUNC_API_SINCE(5)
+{
+ handle_T id = map_get(String, handle_T)(namespace_ids, name);
+ if (id > 0) {
+ return id;
+ }
+ id = next_namespace_id++;
+ if (name.size > 0) {
+ String name_alloc = copy_string(name);
+ map_put(String, handle_T)(namespace_ids, name_alloc, id);
+ }
+ return (Integer)id;
+}
+
+/// Gets existing, non-anonymous namespaces
+///
+/// @return dict that maps from names to namespace ids.
+Dictionary nvim_get_namespaces(void)
+ FUNC_API_SINCE(5)
+{
+ Dictionary retval = ARRAY_DICT_INIT;
+ String name;
+ handle_T id;
+
+ map_foreach(namespace_ids, name, id, {
+ PUT(retval, name.data, INTEGER_OBJ(id));
+ })
+
+ return retval;
+}
+
/// Subscribes to event broadcasts
///
-/// @param channel_id The channel id (passed automatically by the dispatcher)
-/// @param event The event type string
-void vim_subscribe(uint64_t channel_id, String event)
+/// @param channel_id Channel id (passed automatically by the dispatcher)
+/// @param event Event type string
+void nvim_subscribe(uint64_t channel_id, String event)
+ FUNC_API_SINCE(1) FUNC_API_REMOTE_ONLY
{
size_t length = (event.size < METHOD_MAXLEN ? event.size : METHOD_MAXLEN);
char e[METHOD_MAXLEN + 1];
memcpy(e, event.data, length);
e[length] = NUL;
- channel_subscribe(channel_id, e);
+ rpc_subscribe(channel_id, e);
}
/// Unsubscribes to event broadcasts
///
-/// @param channel_id The channel id (passed automatically by the dispatcher)
-/// @param event The event type string
-void vim_unsubscribe(uint64_t channel_id, String event)
+/// @param channel_id Channel id (passed automatically by the dispatcher)
+/// @param event Event type string
+void nvim_unsubscribe(uint64_t channel_id, String event)
+ FUNC_API_SINCE(1) FUNC_API_REMOTE_ONLY
{
size_t length = (event.size < METHOD_MAXLEN ?
event.size :
@@ -603,15 +986,17 @@ void vim_unsubscribe(uint64_t channel_id, String event)
char e[METHOD_MAXLEN + 1];
memcpy(e, event.data, length);
e[length] = NUL;
- channel_unsubscribe(channel_id, e);
+ rpc_unsubscribe(channel_id, e);
}
-Integer vim_name_to_color(String name)
+Integer nvim_get_color_by_name(String name)
+ FUNC_API_SINCE(1)
{
- return name_to_color((uint8_t *)name.data);
+ return name_to_color((char_u *)name.data);
}
-Dictionary vim_get_color_map(void)
+Dictionary nvim_get_color_map(void)
+ FUNC_API_SINCE(1)
{
Dictionary colors = ARRAY_DICT_INIT;
@@ -623,8 +1008,55 @@ Dictionary vim_get_color_map(void)
}
-Array vim_get_api_info(uint64_t channel_id)
- FUNC_API_ASYNC
+/// Gets the current mode. |mode()|
+/// "blocking" is true if Nvim is waiting for input.
+///
+/// @returns Dictionary { "mode": String, "blocking": Boolean }
+Dictionary nvim_get_mode(void)
+ FUNC_API_SINCE(2) FUNC_API_ASYNC
+{
+ Dictionary rv = ARRAY_DICT_INIT;
+ char *modestr = get_mode();
+ bool blocked = input_blocking();
+
+ PUT(rv, "mode", STRING_OBJ(cstr_as_string(modestr)));
+ PUT(rv, "blocking", BOOLEAN_OBJ(blocked));
+
+ return rv;
+}
+
+/// Gets a list of global (non-buffer-local) |mapping| definitions.
+///
+/// @param mode Mode short-name ("n", "i", "v", ...)
+/// @returns Array of maparg()-like dictionaries describing mappings.
+/// The "buffer" key is always zero.
+ArrayOf(Dictionary) nvim_get_keymap(String mode)
+ FUNC_API_SINCE(3)
+{
+ return keymap_array(mode, NULL);
+}
+
+/// Gets a map of global (non-buffer-local) Ex commands.
+///
+/// Currently only |user-commands| are supported, not builtin Ex commands.
+///
+/// @param opts Optional parameters. Currently only supports
+/// {"builtin":false}
+/// @param[out] err Error details, if any.
+///
+/// @returns Map of maps describing commands.
+Dictionary nvim_get_commands(Dictionary opts, Error *err)
+ FUNC_API_SINCE(4)
+{
+ return nvim_buf_get_commands(-1, opts, err);
+}
+
+/// Returns a 2-tuple (Array), where item 0 is the current channel id and item
+/// 1 is the |api-metadata| map (Dictionary).
+///
+/// @returns 2-tuple [{channel-id}, {api-metadata}]
+Array nvim_get_api_info(uint64_t channel_id)
+ FUNC_API_SINCE(1) FUNC_API_ASYNC FUNC_API_REMOTE_ONLY
{
Array rv = ARRAY_DICT_INIT;
@@ -635,13 +1067,674 @@ Array vim_get_api_info(uint64_t channel_id)
return rv;
}
+/// Identify the client for nvim. Can be called more than once, but subsequent
+/// calls will remove earlier info, which should be resent if it is still
+/// valid. (This could happen if a library first identifies the channel, and a
+/// plugin using that library later overrides that info)
+///
+/// @param name short name for the connected client
+/// @param version Dictionary describing the version, with the following
+/// possible keys (all optional)
+/// - "major" major version (defaults to 0 if not set, for no release yet)
+/// - "minor" minor version
+/// - "patch" patch number
+/// - "prerelease" string describing a prerelease, like "dev" or "beta1"
+/// - "commit" hash or similar identifier of commit
+/// @param type Must be one of the following values. A client library should
+/// use "remote" if the library user hasn't specified other value.
+/// - "remote" remote client that connected to nvim.
+/// - "ui" gui frontend
+/// - "embedder" application using nvim as a component, for instance
+/// IDE/editor implementing a vim mode.
+/// - "host" plugin host, typically started by nvim
+/// - "plugin" single plugin, started by nvim
+/// @param methods Builtin methods in the client. For a host, this does not
+/// include plugin methods which will be discovered later.
+/// The key should be the method name, the values are dicts with
+/// the following (optional) keys:
+/// - "async" if true, send as a notification. If false or unspecified,
+/// use a blocking request
+/// - "nargs" Number of arguments. Could be a single integer or an array
+/// two integers, minimum and maximum inclusive.
+/// Further keys might be added in later versions of nvim and unknown keys
+/// are thus ignored. Clients must only use keys defined in this or later
+/// versions of nvim!
+///
+/// @param attributes Informal attributes describing the client. Clients might
+/// define their own keys, but the following are suggested:
+/// - "website" Website of client (for instance github repository)
+/// - "license" Informal description of the license, such as "Apache 2",
+/// "GPLv3" or "MIT"
+/// - "logo" URI or path to image, preferably small logo or icon.
+/// .png or .svg format is preferred.
+///
+void nvim_set_client_info(uint64_t channel_id, String name,
+ Dictionary version, String type,
+ Dictionary methods, Dictionary attributes,
+ Error *err)
+ FUNC_API_SINCE(4) FUNC_API_REMOTE_ONLY
+{
+ Dictionary info = ARRAY_DICT_INIT;
+ PUT(info, "name", copy_object(STRING_OBJ(name)));
+
+ version = copy_dictionary(version);
+ bool has_major = false;
+ for (size_t i = 0; i < version.size; i++) {
+ if (strequal(version.items[i].key.data, "major")) {
+ has_major = true;
+ break;
+ }
+ }
+ if (!has_major) {
+ PUT(version, "major", INTEGER_OBJ(0));
+ }
+ PUT(info, "version", DICTIONARY_OBJ(version));
+
+ PUT(info, "type", copy_object(STRING_OBJ(type)));
+ PUT(info, "methods", DICTIONARY_OBJ(copy_dictionary(methods)));
+ PUT(info, "attributes", DICTIONARY_OBJ(copy_dictionary(attributes)));
+
+ rpc_set_client_info(channel_id, info);
+}
+
+/// Get information about a channel.
+///
+/// @returns a Dictionary, describing a channel with the
+/// following keys:
+/// - "stream" the stream underlying the channel
+/// - "stdio" stdin and stdout of this Nvim instance
+/// - "stderr" stderr of this Nvim instance
+/// - "socket" TCP/IP socket or named pipe
+/// - "job" job with communication over its stdio
+/// - "mode" how data received on the channel is interpreted
+/// - "bytes" send and recieve raw bytes
+/// - "terminal" a |terminal| instance interprets ASCII sequences
+/// - "rpc" |RPC| communication on the channel is active
+/// - "pty" Name of pseudoterminal, if one is used (optional).
+/// On a POSIX system, this will be a device path like
+/// /dev/pts/1. Even if the name is unknown, the key will
+/// still be present to indicate a pty is used. This is
+/// currently the case when using winpty on windows.
+/// - "buffer" buffer with connected |terminal| instance (optional)
+/// - "client" information about the client on the other end of the
+/// RPC channel, if it has added it using
+/// |nvim_set_client_info()|. (optional)
+///
+Dictionary nvim_get_chan_info(Integer chan, Error *err)
+ FUNC_API_SINCE(4)
+{
+ if (chan < 0) {
+ return (Dictionary)ARRAY_DICT_INIT;
+ }
+ return channel_info((uint64_t)chan);
+}
+
+/// Get information about all open channels.
+///
+/// @returns Array of Dictionaries, each describing a channel with
+/// the format specified at |nvim_get_chan_info()|.
+Array nvim_list_chans(void)
+ FUNC_API_SINCE(4)
+{
+ return channel_all_info();
+}
+
+/// Calls many API methods atomically.
+///
+/// This has two main usages:
+/// 1. To perform several requests from an async context atomically, i.e.
+/// without interleaving redraws, RPC requests from other clients, or user
+/// interactions (however API methods may trigger autocommands or event
+/// processing which have such side-effects, e.g. |:sleep| may wake timers).
+/// 2. To minimize RPC overhead (roundtrips) of a sequence of many requests.
+///
+/// @param calls an array of calls, where each call is described by an array
+/// with two elements: the request name, and an array of arguments.
+/// @param[out] err Details of a validation error of the nvim_multi_request call
+/// itself, i.e. malformed `calls` parameter. Errors from called methods will
+/// be indicated in the return value, see below.
+///
+/// @return an array with two elements. The first is an array of return
+/// values. The second is NIL if all calls succeeded. If a call resulted in
+/// an error, it is a three-element array with the zero-based index of the call
+/// which resulted in an error, the error type and the error message. If an
+/// error occurred, the values from all preceding calls will still be returned.
+Array nvim_call_atomic(uint64_t channel_id, Array calls, Error *err)
+ FUNC_API_SINCE(1) FUNC_API_REMOTE_ONLY
+{
+ Array rv = ARRAY_DICT_INIT;
+ Array results = ARRAY_DICT_INIT;
+ Error nested_error = ERROR_INIT;
+
+ size_t i; // also used for freeing the variables
+ for (i = 0; i < calls.size; i++) {
+ if (calls.items[i].type != kObjectTypeArray) {
+ api_set_error(err,
+ kErrorTypeValidation,
+ "Items in calls array must be arrays");
+ goto validation_error;
+ }
+ Array call = calls.items[i].data.array;
+ if (call.size != 2) {
+ api_set_error(err,
+ kErrorTypeValidation,
+ "Items in calls array must be arrays of size 2");
+ goto validation_error;
+ }
+
+ if (call.items[0].type != kObjectTypeString) {
+ api_set_error(err,
+ kErrorTypeValidation,
+ "Name must be String");
+ goto validation_error;
+ }
+ String name = call.items[0].data.string;
+
+ if (call.items[1].type != kObjectTypeArray) {
+ api_set_error(err,
+ kErrorTypeValidation,
+ "Args must be Array");
+ goto validation_error;
+ }
+ Array args = call.items[1].data.array;
+
+ MsgpackRpcRequestHandler handler =
+ msgpack_rpc_get_handler_for(name.data,
+ name.size,
+ &nested_error);
+
+ if (ERROR_SET(&nested_error)) {
+ break;
+ }
+ Object result = handler.fn(channel_id, args, &nested_error);
+ if (ERROR_SET(&nested_error)) {
+ // error handled after loop
+ break;
+ }
+
+ ADD(results, result);
+ }
+
+ ADD(rv, ARRAY_OBJ(results));
+ if (ERROR_SET(&nested_error)) {
+ Array errval = ARRAY_DICT_INIT;
+ ADD(errval, INTEGER_OBJ((Integer)i));
+ ADD(errval, INTEGER_OBJ(nested_error.type));
+ ADD(errval, STRING_OBJ(cstr_to_string(nested_error.msg)));
+ ADD(rv, ARRAY_OBJ(errval));
+ } else {
+ ADD(rv, NIL);
+ }
+ goto theend;
+
+validation_error:
+ api_free_array(results);
+theend:
+ api_clear_error(&nested_error);
+ return rv;
+}
+
+typedef struct {
+ ExprASTNode **node_p;
+ Object *ret_node_p;
+} ExprASTConvStackItem;
+
+/// @cond DOXYGEN_NOT_A_FUNCTION
+typedef kvec_withinit_t(ExprASTConvStackItem, 16) ExprASTConvStack;
+/// @endcond
+
+/// Parse a VimL expression
+///
+/// @param[in] expr Expression to parse. Is always treated as a single line.
+/// @param[in] flags Flags:
+///
+/// - "m" if multiple expressions in a row are allowed (only
+/// the first one will be parsed),
+/// - "E" if EOC tokens are not allowed (determines whether
+/// they will stop parsing process or be recognized as an
+/// operator/space, though also yielding an error).
+/// - "l" when needing to start parsing with lvalues for
+/// ":let" or ":for".
+///
+/// Common flag sets:
+/// - "m" to parse like for ":echo".
+/// - "E" to parse like for "<C-r>=".
+/// - empty string for ":call".
+/// - "lm" to parse for ":let".
+/// @param[in] highlight If true, return value will also include "highlight"
+/// key containing array of 4-tuples (arrays) (Integer,
+/// Integer, Integer, String), where first three numbers
+/// define the highlighted region and represent line,
+/// starting column and ending column (latter exclusive:
+/// one should highlight region [start_col, end_col)).
+///
+/// @return AST: top-level dictionary with these keys:
+///
+/// "error": Dictionary with error, present only if parser saw some
+/// error. Contains the following keys:
+///
+/// "message": String, error message in printf format, translated.
+/// Must contain exactly one "%.*s".
+/// "arg": String, error message argument.
+///
+/// "len": Amount of bytes successfully parsed. With flags equal to ""
+/// that should be equal to the length of expr string.
+///
+/// @note: โ€œSucessfully parsedโ€ here means โ€œparticipated in AST
+/// creationโ€, not โ€œtill the first errorโ€.
+///
+/// "ast": AST, either nil or a dictionary with these keys:
+///
+/// "type": node type, one of the value names from ExprASTNodeType
+/// stringified without "kExprNode" prefix.
+/// "start": a pair [line, column] describing where node is โ€œstartedโ€
+/// where "line" is always 0 (will not be 0 if you will be
+/// using nvim_parse_viml() on e.g. ":let", but that is not
+/// present yet). Both elements are Integers.
+/// "len": โ€œlengthโ€ of the node. This and "start" are there for
+/// debugging purposes primary (debugging parser and providing
+/// debug information).
+/// "children": a list of nodes described in top/"ast". There always
+/// is zero, one or two children, key will not be present
+/// if node has no children. Maximum number of children
+/// may be found in node_maxchildren array.
+///
+/// Local values (present only for certain nodes):
+///
+/// "scope": a single Integer, specifies scope for "Option" and
+/// "PlainIdentifier" nodes. For "Option" it is one of
+/// ExprOptScope values, for "PlainIdentifier" it is one of
+/// ExprVarScope values.
+/// "ident": identifier (without scope, if any), present for "Option",
+/// "PlainIdentifier", "PlainKey" and "Environment" nodes.
+/// "name": Integer, register name (one character) or -1. Only present
+/// for "Register" nodes.
+/// "cmp_type": String, comparison type, one of the value names from
+/// ExprComparisonType, stringified without "kExprCmp"
+/// prefix. Only present for "Comparison" nodes.
+/// "ccs_strategy": String, case comparison strategy, one of the
+/// value names from ExprCaseCompareStrategy,
+/// stringified without "kCCStrategy" prefix. Only
+/// present for "Comparison" nodes.
+/// "augmentation": String, augmentation type for "Assignment" nodes.
+/// Is either an empty string, "Add", "Subtract" or
+/// "Concat" for "=", "+=", "-=" or ".=" respectively.
+/// "invert": Boolean, true if result of comparison needs to be
+/// inverted. Only present for "Comparison" nodes.
+/// "ivalue": Integer, integer value for "Integer" nodes.
+/// "fvalue": Float, floating-point value for "Float" nodes.
+/// "svalue": String, value for "SingleQuotedString" and
+/// "DoubleQuotedString" nodes.
+Dictionary nvim_parse_expression(String expr, String flags, Boolean highlight,
+ Error *err)
+ FUNC_API_SINCE(4) FUNC_API_ASYNC
+{
+ int pflags = 0;
+ for (size_t i = 0 ; i < flags.size ; i++) {
+ switch (flags.data[i]) {
+ case 'm': { pflags |= kExprFlagsMulti; break; }
+ case 'E': { pflags |= kExprFlagsDisallowEOC; break; }
+ case 'l': { pflags |= kExprFlagsParseLet; break; }
+ case NUL: {
+ api_set_error(err, kErrorTypeValidation, "Invalid flag: '\\0' (%u)",
+ (unsigned)flags.data[i]);
+ return (Dictionary)ARRAY_DICT_INIT;
+ }
+ default: {
+ api_set_error(err, kErrorTypeValidation, "Invalid flag: '%c' (%u)",
+ flags.data[i], (unsigned)flags.data[i]);
+ return (Dictionary)ARRAY_DICT_INIT;
+ }
+ }
+ }
+ ParserLine plines[] = {
+ {
+ .data = expr.data,
+ .size = expr.size,
+ .allocated = false,
+ },
+ { NULL, 0, false },
+ };
+ ParserLine *plines_p = plines;
+ ParserHighlight colors;
+ kvi_init(colors);
+ ParserHighlight *const colors_p = (highlight ? &colors : NULL);
+ ParserState pstate;
+ viml_parser_init(
+ &pstate, parser_simple_get_line, &plines_p, colors_p);
+ ExprAST east = viml_pexpr_parse(&pstate, pflags);
+
+ const size_t ret_size = (
+ 2 // "ast", "len"
+ + (size_t)(east.err.msg != NULL) // "error"
+ + (size_t)highlight // "highlight"
+ + 0);
+ Dictionary ret = {
+ .items = xmalloc(ret_size * sizeof(ret.items[0])),
+ .size = 0,
+ .capacity = ret_size,
+ };
+ ret.items[ret.size++] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("ast"),
+ .value = NIL,
+ };
+ ret.items[ret.size++] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("len"),
+ .value = INTEGER_OBJ((Integer)(pstate.pos.line == 1
+ ? plines[0].size
+ : pstate.pos.col)),
+ };
+ if (east.err.msg != NULL) {
+ Dictionary err_dict = {
+ .items = xmalloc(2 * sizeof(err_dict.items[0])),
+ .size = 2,
+ .capacity = 2,
+ };
+ err_dict.items[0] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("message"),
+ .value = STRING_OBJ(cstr_to_string(east.err.msg)),
+ };
+ if (east.err.arg == NULL) {
+ err_dict.items[1] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("arg"),
+ .value = STRING_OBJ(STRING_INIT),
+ };
+ } else {
+ err_dict.items[1] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("arg"),
+ .value = STRING_OBJ(((String) {
+ .data = xmemdupz(east.err.arg, (size_t)east.err.arg_len),
+ .size = (size_t)east.err.arg_len,
+ })),
+ };
+ }
+ ret.items[ret.size++] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("error"),
+ .value = DICTIONARY_OBJ(err_dict),
+ };
+ }
+ if (highlight) {
+ Array hl = (Array) {
+ .items = xmalloc(kv_size(colors) * sizeof(hl.items[0])),
+ .capacity = kv_size(colors),
+ .size = kv_size(colors),
+ };
+ for (size_t i = 0 ; i < kv_size(colors) ; i++) {
+ const ParserHighlightChunk chunk = kv_A(colors, i);
+ Array chunk_arr = (Array) {
+ .items = xmalloc(4 * sizeof(chunk_arr.items[0])),
+ .capacity = 4,
+ .size = 4,
+ };
+ chunk_arr.items[0] = INTEGER_OBJ((Integer)chunk.start.line);
+ chunk_arr.items[1] = INTEGER_OBJ((Integer)chunk.start.col);
+ chunk_arr.items[2] = INTEGER_OBJ((Integer)chunk.end_col);
+ chunk_arr.items[3] = STRING_OBJ(cstr_to_string(chunk.group));
+ hl.items[i] = ARRAY_OBJ(chunk_arr);
+ }
+ ret.items[ret.size++] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("highlight"),
+ .value = ARRAY_OBJ(hl),
+ };
+ }
+ kvi_destroy(colors);
+
+ // Walk over the AST, freeing nodes in process.
+ ExprASTConvStack ast_conv_stack;
+ kvi_init(ast_conv_stack);
+ kvi_push(ast_conv_stack, ((ExprASTConvStackItem) {
+ .node_p = &east.root,
+ .ret_node_p = &ret.items[0].value,
+ }));
+ while (kv_size(ast_conv_stack)) {
+ ExprASTConvStackItem cur_item = kv_last(ast_conv_stack);
+ ExprASTNode *const node = *cur_item.node_p;
+ if (node == NULL) {
+ assert(kv_size(ast_conv_stack) == 1);
+ kv_drop(ast_conv_stack, 1);
+ } else {
+ if (cur_item.ret_node_p->type == kObjectTypeNil) {
+ const size_t ret_node_items_size = (size_t)(
+ 3 // "type", "start" and "len"
+ + (node->children != NULL) // "children"
+ + (node->type == kExprNodeOption
+ || node->type == kExprNodePlainIdentifier) // "scope"
+ + (node->type == kExprNodeOption
+ || node->type == kExprNodePlainIdentifier
+ || node->type == kExprNodePlainKey
+ || node->type == kExprNodeEnvironment) // "ident"
+ + (node->type == kExprNodeRegister) // "name"
+ + (3 // "cmp_type", "ccs_strategy", "invert"
+ * (node->type == kExprNodeComparison))
+ + (node->type == kExprNodeInteger) // "ivalue"
+ + (node->type == kExprNodeFloat) // "fvalue"
+ + (node->type == kExprNodeDoubleQuotedString
+ || node->type == kExprNodeSingleQuotedString) // "svalue"
+ + (node->type == kExprNodeAssignment) // "augmentation"
+ + 0);
+ Dictionary ret_node = {
+ .items = xmalloc(ret_node_items_size * sizeof(ret_node.items[0])),
+ .capacity = ret_node_items_size,
+ .size = 0,
+ };
+ *cur_item.ret_node_p = DICTIONARY_OBJ(ret_node);
+ }
+ Dictionary *ret_node = &cur_item.ret_node_p->data.dictionary;
+ if (node->children != NULL) {
+ const size_t num_children = 1 + (node->children->next != NULL);
+ Array children_array = {
+ .items = xmalloc(num_children * sizeof(children_array.items[0])),
+ .capacity = num_children,
+ .size = num_children,
+ };
+ for (size_t i = 0; i < num_children; i++) {
+ children_array.items[i] = NIL;
+ }
+ ret_node->items[ret_node->size++] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("children"),
+ .value = ARRAY_OBJ(children_array),
+ };
+ kvi_push(ast_conv_stack, ((ExprASTConvStackItem) {
+ .node_p = &node->children,
+ .ret_node_p = &children_array.items[0],
+ }));
+ } else if (node->next != NULL) {
+ kvi_push(ast_conv_stack, ((ExprASTConvStackItem) {
+ .node_p = &node->next,
+ .ret_node_p = cur_item.ret_node_p + 1,
+ }));
+ } else {
+ kv_drop(ast_conv_stack, 1);
+ ret_node->items[ret_node->size++] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("type"),
+ .value = STRING_OBJ(cstr_to_string(east_node_type_tab[node->type])),
+ };
+ Array start_array = {
+ .items = xmalloc(2 * sizeof(start_array.items[0])),
+ .capacity = 2,
+ .size = 2,
+ };
+ start_array.items[0] = INTEGER_OBJ((Integer)node->start.line);
+ start_array.items[1] = INTEGER_OBJ((Integer)node->start.col);
+ ret_node->items[ret_node->size++] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("start"),
+ .value = ARRAY_OBJ(start_array),
+ };
+ ret_node->items[ret_node->size++] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("len"),
+ .value = INTEGER_OBJ((Integer)node->len),
+ };
+ switch (node->type) {
+ case kExprNodeDoubleQuotedString:
+ case kExprNodeSingleQuotedString: {
+ ret_node->items[ret_node->size++] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("svalue"),
+ .value = STRING_OBJ(((String) {
+ .data = node->data.str.value,
+ .size = node->data.str.size,
+ })),
+ };
+ break;
+ }
+ case kExprNodeOption: {
+ ret_node->items[ret_node->size++] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("scope"),
+ .value = INTEGER_OBJ(node->data.opt.scope),
+ };
+ ret_node->items[ret_node->size++] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("ident"),
+ .value = STRING_OBJ(((String) {
+ .data = xmemdupz(node->data.opt.ident,
+ node->data.opt.ident_len),
+ .size = node->data.opt.ident_len,
+ })),
+ };
+ break;
+ }
+ case kExprNodePlainIdentifier: {
+ ret_node->items[ret_node->size++] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("scope"),
+ .value = INTEGER_OBJ(node->data.var.scope),
+ };
+ ret_node->items[ret_node->size++] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("ident"),
+ .value = STRING_OBJ(((String) {
+ .data = xmemdupz(node->data.var.ident,
+ node->data.var.ident_len),
+ .size = node->data.var.ident_len,
+ })),
+ };
+ break;
+ }
+ case kExprNodePlainKey: {
+ ret_node->items[ret_node->size++] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("ident"),
+ .value = STRING_OBJ(((String) {
+ .data = xmemdupz(node->data.var.ident,
+ node->data.var.ident_len),
+ .size = node->data.var.ident_len,
+ })),
+ };
+ break;
+ }
+ case kExprNodeEnvironment: {
+ ret_node->items[ret_node->size++] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("ident"),
+ .value = STRING_OBJ(((String) {
+ .data = xmemdupz(node->data.env.ident,
+ node->data.env.ident_len),
+ .size = node->data.env.ident_len,
+ })),
+ };
+ break;
+ }
+ case kExprNodeRegister: {
+ ret_node->items[ret_node->size++] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("name"),
+ .value = INTEGER_OBJ(node->data.reg.name),
+ };
+ break;
+ }
+ case kExprNodeComparison: {
+ ret_node->items[ret_node->size++] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("cmp_type"),
+ .value = STRING_OBJ(cstr_to_string(
+ eltkn_cmp_type_tab[node->data.cmp.type])),
+ };
+ ret_node->items[ret_node->size++] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("ccs_strategy"),
+ .value = STRING_OBJ(cstr_to_string(
+ ccs_tab[node->data.cmp.ccs])),
+ };
+ ret_node->items[ret_node->size++] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("invert"),
+ .value = BOOLEAN_OBJ(node->data.cmp.inv),
+ };
+ break;
+ }
+ case kExprNodeFloat: {
+ ret_node->items[ret_node->size++] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("fvalue"),
+ .value = FLOAT_OBJ(node->data.flt.value),
+ };
+ break;
+ }
+ case kExprNodeInteger: {
+ ret_node->items[ret_node->size++] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("ivalue"),
+ .value = INTEGER_OBJ((Integer)(
+ node->data.num.value > API_INTEGER_MAX
+ ? API_INTEGER_MAX
+ : (Integer)node->data.num.value)),
+ };
+ break;
+ }
+ case kExprNodeAssignment: {
+ const ExprAssignmentType asgn_type = node->data.ass.type;
+ ret_node->items[ret_node->size++] = (KeyValuePair) {
+ .key = STATIC_CSTR_TO_STRING("augmentation"),
+ .value = STRING_OBJ(
+ asgn_type == kExprAsgnPlain
+ ? (String)STRING_INIT
+ : cstr_to_string(expr_asgn_type_tab[asgn_type])),
+ };
+ break;
+ }
+ case kExprNodeMissing:
+ case kExprNodeOpMissing:
+ case kExprNodeTernary:
+ case kExprNodeTernaryValue:
+ case kExprNodeSubscript:
+ case kExprNodeListLiteral:
+ case kExprNodeUnaryPlus:
+ case kExprNodeBinaryPlus:
+ case kExprNodeNested:
+ case kExprNodeCall:
+ case kExprNodeComplexIdentifier:
+ case kExprNodeUnknownFigure:
+ case kExprNodeLambda:
+ case kExprNodeDictLiteral:
+ case kExprNodeCurlyBracesIdentifier:
+ case kExprNodeComma:
+ case kExprNodeColon:
+ case kExprNodeArrow:
+ case kExprNodeConcat:
+ case kExprNodeConcatOrSubscript:
+ case kExprNodeOr:
+ case kExprNodeAnd:
+ case kExprNodeUnaryMinus:
+ case kExprNodeBinaryMinus:
+ case kExprNodeNot:
+ case kExprNodeMultiplication:
+ case kExprNodeDivision:
+ case kExprNodeMod: {
+ break;
+ }
+ }
+ assert(cur_item.ret_node_p->data.dictionary.size
+ == cur_item.ret_node_p->data.dictionary.capacity);
+ xfree(*cur_item.node_p);
+ *cur_item.node_p = NULL;
+ }
+ }
+ }
+ kvi_destroy(ast_conv_stack);
+
+ assert(ret.size == ret.capacity);
+ // Should be a no-op actually, leaving it in case non-nodes will need to be
+ // freed later.
+ viml_pexpr_free_ast(east);
+ viml_parser_destroy(&pstate);
+ return ret;
+}
+
+
/// Writes a message to vim output or error buffer. The string is split
/// and flushed after each newline. Incomplete lines are kept for writing
/// later.
///
-/// @param message The message to write
-/// @param to_err true if it should be treated as an error message (use
-/// `emsg` instead of `msg` to print each line)
+/// @param message Message to write
+/// @param to_err true: message is an error (uses `emsg` instead of `msg`)
static void write_msg(String message, bool to_err)
{
static size_t out_pos = 0, err_pos = 0;
@@ -650,7 +1743,7 @@ static void write_msg(String message, bool to_err)
#define PUSH_CHAR(i, pos, line_buf, msg) \
if (message.data[i] == NL || pos == LINE_BUFFER_SIZE - 1) { \
line_buf[pos] = NUL; \
- msg((uint8_t *)line_buf); \
+ msg((char_u *)line_buf); \
pos = 0; \
continue; \
} \
@@ -668,3 +1761,216 @@ static void write_msg(String message, bool to_err)
--no_wait_return;
msg_end();
}
+
+// Functions used for testing purposes
+
+/// Returns object given as argument
+///
+/// This API function is used for testing. One should not rely on its presence
+/// in plugins.
+///
+/// @param[in] obj Object to return.
+///
+/// @return its argument.
+Object nvim__id(Object obj)
+{
+ return copy_object(obj);
+}
+
+/// Returns array given as argument
+///
+/// This API function is used for testing. One should not rely on its presence
+/// in plugins.
+///
+/// @param[in] arr Array to return.
+///
+/// @return its argument.
+Array nvim__id_array(Array arr)
+{
+ return copy_object(ARRAY_OBJ(arr)).data.array;
+}
+
+/// Returns dictionary given as argument
+///
+/// This API function is used for testing. One should not rely on its presence
+/// in plugins.
+///
+/// @param[in] dct Dictionary to return.
+///
+/// @return its argument.
+Dictionary nvim__id_dictionary(Dictionary dct)
+{
+ return copy_object(DICTIONARY_OBJ(dct)).data.dictionary;
+}
+
+/// Returns floating-point value given as argument
+///
+/// This API function is used for testing. One should not rely on its presence
+/// in plugins.
+///
+/// @param[in] flt Value to return.
+///
+/// @return its argument.
+Float nvim__id_float(Float flt)
+{
+ return flt;
+}
+
+/// Gets internal stats.
+///
+/// @return Map of various internal stats.
+Dictionary nvim__stats(void)
+{
+ Dictionary rv = ARRAY_DICT_INIT;
+ PUT(rv, "fsync", INTEGER_OBJ(g_stats.fsync));
+ PUT(rv, "redraw", INTEGER_OBJ(g_stats.redraw));
+ return rv;
+}
+
+/// Gets a list of dictionaries representing attached UIs.
+///
+/// @return Array of UI dictionaries
+///
+/// Each dictionary has the following keys:
+/// - "height" requested height of the UI
+/// - "width" requested width of the UI
+/// - "rgb" whether the UI uses rgb colors (false implies cterm colors)
+/// - "ext_..." Requested UI extensions, see |ui-options|
+/// - "chan" Channel id of remote UI (not present for TUI)
+///
+Array nvim_list_uis(void)
+ FUNC_API_SINCE(4)
+{
+ return ui_array();
+}
+
+/// Gets the immediate children of process `pid`.
+///
+/// @return Array of child process ids, empty if process not found.
+Array nvim_get_proc_children(Integer pid, Error *err)
+ FUNC_API_SINCE(4)
+{
+ Array rvobj = ARRAY_DICT_INIT;
+ int *proc_list = NULL;
+
+ if (pid <= 0 || pid > INT_MAX) {
+ api_set_error(err, kErrorTypeException, "Invalid pid: %" PRId64, pid);
+ goto end;
+ }
+
+ size_t proc_count;
+ int rv = os_proc_children((int)pid, &proc_list, &proc_count);
+ if (rv != 0) {
+ // syscall failed (possibly because of kernel options), try shelling out.
+ DLOG("fallback to vim._os_proc_children()");
+ Array a = ARRAY_DICT_INIT;
+ ADD(a, INTEGER_OBJ(pid));
+ String s = cstr_to_string("return vim._os_proc_children(select(1, ...))");
+ Object o = nvim_execute_lua(s, a, err);
+ api_free_string(s);
+ api_free_array(a);
+ if (o.type == kObjectTypeArray) {
+ rvobj = o.data.array;
+ } else if (!ERROR_SET(err)) {
+ api_set_error(err, kErrorTypeException,
+ "Failed to get process children. pid=%" PRId64 " error=%d",
+ pid, rv);
+ }
+ goto end;
+ }
+
+ for (size_t i = 0; i < proc_count; i++) {
+ ADD(rvobj, INTEGER_OBJ(proc_list[i]));
+ }
+
+end:
+ xfree(proc_list);
+ return rvobj;
+}
+
+/// Gets info describing process `pid`.
+///
+/// @return Map of process properties, or NIL if process not found.
+Object nvim_get_proc(Integer pid, Error *err)
+ FUNC_API_SINCE(4)
+{
+ Object rvobj = OBJECT_INIT;
+ rvobj.data.dictionary = (Dictionary)ARRAY_DICT_INIT;
+ rvobj.type = kObjectTypeDictionary;
+
+ if (pid <= 0 || pid > INT_MAX) {
+ api_set_error(err, kErrorTypeException, "Invalid pid: %" PRId64, pid);
+ return NIL;
+ }
+#ifdef WIN32
+ rvobj.data.dictionary = os_proc_info((int)pid);
+ if (rvobj.data.dictionary.size == 0) { // Process not found.
+ return NIL;
+ }
+#else
+ // Cross-platform process info APIs are miserable, so use `ps` instead.
+ Array a = ARRAY_DICT_INIT;
+ ADD(a, INTEGER_OBJ(pid));
+ String s = cstr_to_string("return vim._os_proc_info(select(1, ...))");
+ Object o = nvim_execute_lua(s, a, err);
+ api_free_string(s);
+ api_free_array(a);
+ if (o.type == kObjectTypeArray && o.data.array.size == 0) {
+ return NIL; // Process not found.
+ } else if (o.type == kObjectTypeDictionary) {
+ rvobj.data.dictionary = o.data.dictionary;
+ } else if (!ERROR_SET(err)) {
+ api_set_error(err, kErrorTypeException,
+ "Failed to get process info. pid=%" PRId64, pid);
+ }
+#endif
+ return rvobj;
+}
+
+/// Selects an item in the completion popupmenu
+///
+/// When insert completion is not active, this API call is silently ignored.
+/// It is mostly useful for an external UI using |ui-popupmenu| for instance
+/// to control the popupmenu with the mouse. But it can also be used in an
+/// insert mode mapping, use <cmd> mapping |:map-cmd| to ensure the mapping
+/// doesn't end completion mode.
+///
+/// @param item Index of the item to select, starting with zero. Pass in "-1"
+/// to select no item (restore original text).
+/// @param insert Whether the selection should be inserted in the buffer.
+/// @param finish If true, completion will be finished with this item, and the
+/// popupmenu dissmissed. Implies `insert`.
+void nvim_select_popupmenu_item(Integer item, Boolean insert, Boolean finish,
+ Dictionary opts, Error *err)
+ FUNC_API_SINCE(6)
+{
+ if (opts.size > 0) {
+ api_set_error(err, kErrorTypeValidation, "opts dict isn't empty");
+ return;
+ }
+
+ if (finish) {
+ insert = true;
+ }
+
+ pum_ext_select_item((int)item, insert, finish);
+}
+
+/// NB: if your UI doesn't use hlstate, this will not return hlstate first time
+Array nvim__inspect_cell(Integer row, Integer col, Error *err)
+{
+ Array ret = ARRAY_DICT_INIT;
+ if (row < 0 || row >= default_grid.Rows
+ || col < 0 || col >= default_grid.Columns) {
+ return ret;
+ }
+ size_t off = default_grid.line_offset[(size_t)row] + (size_t)col;
+ ADD(ret, STRING_OBJ(cstr_to_string((char *)default_grid.chars[off])));
+ int attr = default_grid.attrs[off];
+ ADD(ret, DICTIONARY_OBJ(hl_get_attr_by_id(attr, true, err)));
+ // will not work first time
+ if (!highlight_use_hlstate()) {
+ ADD(ret, ARRAY_OBJ(hl_inspect(attr)));
+ }
+ return ret;
+}
diff --git a/src/nvim/api/vim.h b/src/nvim/api/vim.h
index 5e0b35b562..d6873da6d2 100644
--- a/src/nvim/api/vim.h
+++ b/src/nvim/api/vim.h
@@ -4,6 +4,10 @@
#include <stdint.h>
#include "nvim/api/private/defs.h"
+#include "nvim/map.h"
+
+EXTERN Map(String, handle_T) *namespace_ids INIT(= NULL);
+EXTERN handle_T next_namespace_id INIT(= 1);
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "api/vim.h.generated.h"
diff --git a/src/nvim/api/window.c b/src/nvim/api/window.c
index f644453358..33857f95b7 100644
--- a/src/nvim/api/window.c
+++ b/src/nvim/api/window.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
@@ -7,19 +10,20 @@
#include "nvim/api/private/defs.h"
#include "nvim/api/private/helpers.h"
#include "nvim/vim.h"
+#include "nvim/buffer.h"
#include "nvim/cursor.h"
#include "nvim/window.h"
#include "nvim/screen.h"
#include "nvim/move.h"
-#include "nvim/misc2.h"
/// Gets the current buffer in a window
///
-/// @param window The window handle
-/// @param[out] err Details of an error that may have occurred
-/// @return The buffer handle
-Buffer window_get_buffer(Window window, Error *err)
+/// @param window Window handle
+/// @param[out] err Error details, if any
+/// @return Buffer handle
+Buffer nvim_win_get_buf(Window window, Error *err)
+ FUNC_API_SINCE(1)
{
win_T *win = find_window_by_handle(window, err);
@@ -30,12 +34,48 @@ Buffer window_get_buffer(Window window, Error *err)
return win->w_buffer->handle;
}
+/// Sets the current buffer in a window, without side-effects
+///
+/// @param window Window handle
+/// @param buffer Buffer handle
+/// @param[out] err Error details, if any
+void nvim_win_set_buf(Window window, Buffer buffer, Error *err)
+ FUNC_API_SINCE(5)
+{
+ win_T *win = find_window_by_handle(window, err), *save_curwin = curwin;
+ buf_T *buf = find_buffer_by_handle(buffer, err);
+ tabpage_T *tab = win_find_tabpage(win), *save_curtab = curtab;
+
+ if (!win || !buf) {
+ return;
+ }
+
+ if (switch_win(&save_curwin, &save_curtab, win, tab, false) == FAIL) {
+ api_set_error(err,
+ kErrorTypeException,
+ "Failed to switch to window %d",
+ window);
+ }
+
+ try_start();
+ int result = do_buffer(DOBUF_GOTO, DOBUF_FIRST, FORWARD, buf->b_fnum, 0);
+ if (!try_end(err) && result == FAIL) {
+ api_set_error(err,
+ kErrorTypeException,
+ "Failed to set buffer %d",
+ buffer);
+ }
+
+ restore_win(save_curwin, save_curtab, false);
+}
+
/// Gets the cursor position in the window
///
-/// @param window The window handle
-/// @param[out] err Details of an error that may have occurred
-/// @return the (row, col) tuple
-ArrayOf(Integer, 2) window_get_cursor(Window window, Error *err)
+/// @param window Window handle
+/// @param[out] err Error details, if any
+/// @return (row, col) tuple
+ArrayOf(Integer, 2) nvim_win_get_cursor(Window window, Error *err)
+ FUNC_API_SINCE(1)
{
Array rv = ARRAY_DICT_INIT;
win_T *win = find_window_by_handle(window, err);
@@ -50,22 +90,23 @@ ArrayOf(Integer, 2) window_get_cursor(Window window, Error *err)
/// Sets the cursor position in the window
///
-/// @param window The window handle
-/// @param pos the (row, col) tuple representing the new position
-/// @param[out] err Details of an error that may have occurred
-void window_set_cursor(Window window, ArrayOf(Integer, 2) pos, Error *err)
+/// @param window Window handle
+/// @param pos (row, col) tuple representing the new position
+/// @param[out] err Error details, if any
+void nvim_win_set_cursor(Window window, ArrayOf(Integer, 2) pos, Error *err)
+ FUNC_API_SINCE(1)
{
win_T *win = find_window_by_handle(window, err);
- if (pos.size != 2 || pos.items[0].type != kObjectTypeInteger
- || pos.items[1].type != kObjectTypeInteger) {
- api_set_error(err,
- Validation,
- _("Argument \"pos\" must be a [row, col] array"));
+ if (!win) {
return;
}
- if (!win) {
+ if (pos.size != 2 || pos.items[0].type != kObjectTypeInteger
+ || pos.items[1].type != kObjectTypeInteger) {
+ api_set_error(err,
+ kErrorTypeValidation,
+ "Argument \"pos\" must be a [row, col] array");
return;
}
@@ -73,12 +114,12 @@ void window_set_cursor(Window window, ArrayOf(Integer, 2) pos, Error *err)
int64_t col = pos.items[1].data.integer;
if (row <= 0 || row > win->w_buffer->b_ml.ml_line_count) {
- api_set_error(err, Validation, _("Cursor position outside buffer"));
+ api_set_error(err, kErrorTypeValidation, "Cursor position outside buffer");
return;
}
if (col > MAXCOL || col < 0) {
- api_set_error(err, Validation, _("Column value outside range"));
+ api_set_error(err, kErrorTypeValidation, "Column value outside range");
return;
}
@@ -88,18 +129,22 @@ void window_set_cursor(Window window, ArrayOf(Integer, 2) pos, Error *err)
// When column is out of range silently correct it.
check_cursor_col_win(win);
+ // Make sure we stick in this column.
+ win->w_set_curswant = true;
+
// make sure cursor is in visible range even if win != curwin
update_topline_win(win);
- update_screen(VALID);
+ redraw_win_later(win, VALID);
}
/// Gets the window height
///
-/// @param window The window handle
-/// @param[out] err Details of an error that may have occurred
-/// @return the height in rows
-Integer window_get_height(Window window, Error *err)
+/// @param window Window handle
+/// @param[out] err Error details, if any
+/// @return Height as a count of rows
+Integer nvim_win_get_height(Window window, Error *err)
+ FUNC_API_SINCE(1)
{
win_T *win = find_window_by_handle(window, err);
@@ -113,10 +158,11 @@ Integer window_get_height(Window window, Error *err)
/// Sets the window height. This will only succeed if the screen is split
/// horizontally.
///
-/// @param window The window handle
-/// @param height the new height in rows
-/// @param[out] err Details of an error that may have occurred
-void window_set_height(Window window, Integer height, Error *err)
+/// @param window Window handle
+/// @param height Height as a count of rows
+/// @param[out] err Error details, if any
+void nvim_win_set_height(Window window, Integer height, Error *err)
+ FUNC_API_SINCE(1)
{
win_T *win = find_window_by_handle(window, err);
@@ -125,7 +171,7 @@ void window_set_height(Window window, Integer height, Error *err)
}
if (height > INT_MAX || height < INT_MIN) {
- api_set_error(err, Validation, _("Height value outside range"));
+ api_set_error(err, kErrorTypeValidation, "Height value outside range");
return;
}
@@ -139,10 +185,11 @@ void window_set_height(Window window, Integer height, Error *err)
/// Gets the window width
///
-/// @param window The window handle
-/// @param[out] err Details of an error that may have occurred
-/// @return the width in columns
-Integer window_get_width(Window window, Error *err)
+/// @param window Window handle
+/// @param[out] err Error details, if any
+/// @return Width as a count of columns
+Integer nvim_win_get_width(Window window, Error *err)
+ FUNC_API_SINCE(1)
{
win_T *win = find_window_by_handle(window, err);
@@ -156,10 +203,11 @@ Integer window_get_width(Window window, Error *err)
/// Sets the window width. This will only succeed if the screen is split
/// vertically.
///
-/// @param window The window handle
-/// @param width the new width in columns
-/// @param[out] err Details of an error that may have occurred
-void window_set_width(Window window, Integer width, Error *err)
+/// @param window Window handle
+/// @param width Width as a count of columns
+/// @param[out] err Error details, if any
+void nvim_win_set_width(Window window, Integer width, Error *err)
+ FUNC_API_SINCE(1)
{
win_T *win = find_window_by_handle(window, err);
@@ -168,7 +216,7 @@ void window_set_width(Window window, Integer width, Error *err)
}
if (width > INT_MAX || width < INT_MIN) {
- api_set_error(err, Validation, _("Width value outside range"));
+ api_set_error(err, kErrorTypeValidation, "Width value outside range");
return;
}
@@ -182,11 +230,12 @@ void window_set_width(Window window, Integer width, Error *err)
/// Gets a window-scoped (w:) variable
///
-/// @param window The window handle
-/// @param name The variable name
-/// @param[out] err Details of an error that may have occurred
-/// @return The variable value
-Object window_get_var(Window window, String name, Error *err)
+/// @param window Window handle
+/// @param name Variable name
+/// @param[out] err Error details, if any
+/// @return Variable value
+Object nvim_win_get_var(Window window, String name, Error *err)
+ FUNC_API_SINCE(1)
{
win_T *win = find_window_by_handle(window, err);
@@ -199,11 +248,48 @@ Object window_get_var(Window window, String name, Error *err)
/// Sets a window-scoped (w:) variable
///
-/// @param window The window handle
-/// @param name The variable name
-/// @param value The variable value
-/// @param[out] err Details of an error that may have occurred
-/// @return The old value or nil if there was no previous value.
+/// @param window Window handle
+/// @param name Variable name
+/// @param value Variable value
+/// @param[out] err Error details, if any
+void nvim_win_set_var(Window window, String name, Object value, Error *err)
+ FUNC_API_SINCE(1)
+{
+ win_T *win = find_window_by_handle(window, err);
+
+ if (!win) {
+ return;
+ }
+
+ dict_set_var(win->w_vars, name, value, false, false, err);
+}
+
+/// Removes a window-scoped (w:) variable
+///
+/// @param window Window handle
+/// @param name Variable name
+/// @param[out] err Error details, if any
+void nvim_win_del_var(Window window, String name, Error *err)
+ FUNC_API_SINCE(1)
+{
+ win_T *win = find_window_by_handle(window, err);
+
+ if (!win) {
+ return;
+ }
+
+ dict_set_var(win->w_vars, name, NIL, true, false, err);
+}
+
+/// Sets a window-scoped (w:) variable
+///
+/// @deprecated
+///
+/// @param window Window handle
+/// @param name Variable name
+/// @param value Variable value
+/// @param[out] err Error details, if any
+/// @return Old value or nil if there was no previous value.
///
/// @warning It may return nil if there was no previous value
/// or if previous value was `v:null`.
@@ -215,18 +301,17 @@ Object window_set_var(Window window, String name, Object value, Error *err)
return (Object) OBJECT_INIT;
}
- return dict_set_value(win->w_vars, name, value, false, err);
+ return dict_set_var(win->w_vars, name, value, false, true, err);
}
/// Removes a window-scoped (w:) variable
///
-/// @param window The window handle
-/// @param name The variable name
-/// @param[out] err Details of an error that may have occurred
-/// @return The old value or nil if there was no previous value.
+/// @deprecated
///
-/// @warning It may return nil if there was no previous value
-/// or if previous value was `v:null`.
+/// @param window Window handle
+/// @param name variable name
+/// @param[out] err Error details, if any
+/// @return Old value
Object window_del_var(Window window, String name, Error *err)
{
win_T *win = find_window_by_handle(window, err);
@@ -235,16 +320,17 @@ Object window_del_var(Window window, String name, Error *err)
return (Object) OBJECT_INIT;
}
- return dict_set_value(win->w_vars, name, NIL, true, err);
+ return dict_set_var(win->w_vars, name, NIL, true, true, err);
}
/// Gets a window option value
///
-/// @param window The window handle
-/// @param name The option name
-/// @param[out] err Details of an error that may have occurred
-/// @return The option value
-Object window_get_option(Window window, String name, Error *err)
+/// @param window Window handle
+/// @param name Option name
+/// @param[out] err Error details, if any
+/// @return Option value
+Object nvim_win_get_option(Window window, String name, Error *err)
+ FUNC_API_SINCE(1)
{
win_T *win = find_window_by_handle(window, err);
@@ -258,11 +344,13 @@ Object window_get_option(Window window, String name, Error *err)
/// Sets a window option value. Passing 'nil' as value deletes the option(only
/// works if there's a global fallback)
///
-/// @param window The window handle
-/// @param name The option name
-/// @param value The option value
-/// @param[out] err Details of an error that may have occurred
-void window_set_option(Window window, String name, Object value, Error *err)
+/// @param window Window handle
+/// @param name Option name
+/// @param value Option value
+/// @param[out] err Error details, if any
+void nvim_win_set_option(uint64_t channel_id, Window window,
+ String name, Object value, Error *err)
+ FUNC_API_SINCE(1)
{
win_T *win = find_window_by_handle(window, err);
@@ -270,15 +358,16 @@ void window_set_option(Window window, String name, Object value, Error *err)
return;
}
- set_option_to(win, SREQ_WIN, name, value, err);
+ set_option_to(channel_id, win, SREQ_WIN, name, value, err);
}
/// Gets the window position in display cells. First position is zero.
///
-/// @param window The window handle
-/// @param[out] err Details of an error that may have occurred
-/// @return The (row, col) tuple with the window position
-ArrayOf(Integer, 2) window_get_position(Window window, Error *err)
+/// @param window Window handle
+/// @param[out] err Error details, if any
+/// @return (row, col) tuple with the window position
+ArrayOf(Integer, 2) nvim_win_get_position(Window window, Error *err)
+ FUNC_API_SINCE(1)
{
Array rv = ARRAY_DICT_INIT;
win_T *win = find_window_by_handle(window, err);
@@ -291,12 +380,13 @@ ArrayOf(Integer, 2) window_get_position(Window window, Error *err)
return rv;
}
-/// Gets the window tab page
+/// Gets the window tabpage
///
-/// @param window The window handle
-/// @param[out] err Details of an error that may have occurred
-/// @return The tab page that contains the window
-Tabpage window_get_tabpage(Window window, Error *err)
+/// @param window Window handle
+/// @param[out] err Error details, if any
+/// @return Tabpage that contains the window
+Tabpage nvim_win_get_tabpage(Window window, Error *err)
+ FUNC_API_SINCE(1)
{
Tabpage rv = 0;
win_T *win = find_window_by_handle(window, err);
@@ -308,13 +398,37 @@ Tabpage window_get_tabpage(Window window, Error *err)
return rv;
}
+/// Gets the window number
+///
+/// @param window Window handle
+/// @param[out] err Error details, if any
+/// @return Window number
+Integer nvim_win_get_number(Window window, Error *err)
+ FUNC_API_SINCE(1)
+{
+ int rv = 0;
+ win_T *win = find_window_by_handle(window, err);
+
+ if (!win) {
+ return rv;
+ }
+
+ int tabnr;
+ win_get_tabwin(window, &tabnr, &rv);
+
+ return rv;
+}
+
/// Checks if a window is valid
///
-/// @param window The window handle
+/// @param window Window handle
/// @return true if the window is valid, false otherwise
-Boolean window_is_valid(Window window)
+Boolean nvim_win_is_valid(Window window)
+ FUNC_API_SINCE(1)
{
Error stub = ERROR_INIT;
- return find_window_by_handle(window, &stub) != NULL;
+ Boolean ret = find_window_by_handle(window, &stub) != NULL;
+ api_clear_error(&stub);
+ return ret;
}
diff --git a/src/nvim/arabic.c b/src/nvim/arabic.c
index db97bd9dc4..7f12c0c798 100644
--- a/src/nvim/arabic.c
+++ b/src/nvim/arabic.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/// @file arabic.c
///
/// Functions for Arabic language.
@@ -390,491 +393,141 @@ static bool A_is_f(int cur_c)
// Change shape - from ISO-8859-6/Isolated to Form-B Isolated
static int chg_c_a2s(int cur_c)
{
- int tempc;
-
switch (cur_c) {
- case a_HAMZA:
- tempc = a_s_HAMZA;
- break;
-
- case a_ALEF_MADDA:
- tempc = a_s_ALEF_MADDA;
- break;
-
- case a_ALEF_HAMZA_ABOVE:
- tempc = a_s_ALEF_HAMZA_ABOVE;
- break;
-
- case a_WAW_HAMZA:
- tempc = a_s_WAW_HAMZA;
- break;
-
- case a_ALEF_HAMZA_BELOW:
- tempc = a_s_ALEF_HAMZA_BELOW;
- break;
-
- case a_YEH_HAMZA:
- tempc = a_s_YEH_HAMZA;
- break;
-
- case a_ALEF:
- tempc = a_s_ALEF;
- break;
-
- case a_TEH_MARBUTA:
- tempc = a_s_TEH_MARBUTA;
- break;
-
- case a_DAL:
- tempc = a_s_DAL;
- break;
-
- case a_THAL:
- tempc = a_s_THAL;
- break;
-
- case a_REH:
- tempc = a_s_REH;
- break;
-
- case a_ZAIN:
- tempc = a_s_ZAIN;
- break;
-
- case a_TATWEEL: // exceptions
- tempc = cur_c;
- break;
-
- case a_WAW:
- tempc = a_s_WAW;
- break;
-
- case a_ALEF_MAKSURA:
- tempc = a_s_ALEF_MAKSURA;
- break;
-
- case a_BEH:
- tempc = a_s_BEH;
- break;
-
- case a_TEH:
- tempc = a_s_TEH;
- break;
-
- case a_THEH:
- tempc = a_s_THEH;
- break;
-
- case a_JEEM:
- tempc = a_s_JEEM;
- break;
-
- case a_HAH:
- tempc = a_s_HAH;
- break;
-
- case a_KHAH:
- tempc = a_s_KHAH;
- break;
-
- case a_SEEN:
- tempc = a_s_SEEN;
- break;
-
- case a_SHEEN:
- tempc = a_s_SHEEN;
- break;
-
- case a_SAD:
- tempc = a_s_SAD;
- break;
-
- case a_DAD:
- tempc = a_s_DAD;
- break;
-
- case a_TAH:
- tempc = a_s_TAH;
- break;
-
- case a_ZAH:
- tempc = a_s_ZAH;
- break;
-
- case a_AIN:
- tempc = a_s_AIN;
- break;
-
- case a_GHAIN:
- tempc = a_s_GHAIN;
- break;
-
- case a_FEH:
- tempc = a_s_FEH;
- break;
-
- case a_QAF:
- tempc = a_s_QAF;
- break;
-
- case a_KAF:
- tempc = a_s_KAF;
- break;
-
- case a_LAM:
- tempc = a_s_LAM;
- break;
-
- case a_MEEM:
- tempc = a_s_MEEM;
- break;
-
- case a_NOON:
- tempc = a_s_NOON;
- break;
-
- case a_HEH:
- tempc = a_s_HEH;
- break;
-
- case a_YEH:
- tempc = a_s_YEH;
- break;
-
- default:
- tempc = 0;
+ case a_HAMZA: return a_s_HAMZA;
+ case a_ALEF_MADDA: return a_s_ALEF_MADDA;
+ case a_ALEF_HAMZA_ABOVE: return a_s_ALEF_HAMZA_ABOVE;
+ case a_WAW_HAMZA: return a_s_WAW_HAMZA;
+ case a_ALEF_HAMZA_BELOW: return a_s_ALEF_HAMZA_BELOW;
+ case a_YEH_HAMZA: return a_s_YEH_HAMZA;
+ case a_ALEF: return a_s_ALEF;
+ case a_TEH_MARBUTA: return a_s_TEH_MARBUTA;
+ case a_DAL: return a_s_DAL;
+ case a_THAL: return a_s_THAL;
+ case a_REH: return a_s_REH;
+ case a_ZAIN: return a_s_ZAIN;
+ case a_TATWEEL: return cur_c; // exceptions
+ case a_WAW: return a_s_WAW;
+ case a_ALEF_MAKSURA: return a_s_ALEF_MAKSURA;
+ case a_BEH: return a_s_BEH;
+ case a_TEH: return a_s_TEH;
+ case a_THEH: return a_s_THEH;
+ case a_JEEM: return a_s_JEEM;
+ case a_HAH: return a_s_HAH;
+ case a_KHAH: return a_s_KHAH;
+ case a_SEEN: return a_s_SEEN;
+ case a_SHEEN: return a_s_SHEEN;
+ case a_SAD: return a_s_SAD;
+ case a_DAD: return a_s_DAD;
+ case a_TAH: return a_s_TAH;
+ case a_ZAH: return a_s_ZAH;
+ case a_AIN: return a_s_AIN;
+ case a_GHAIN: return a_s_GHAIN;
+ case a_FEH: return a_s_FEH;
+ case a_QAF: return a_s_QAF;
+ case a_KAF: return a_s_KAF;
+ case a_LAM: return a_s_LAM;
+ case a_MEEM: return a_s_MEEM;
+ case a_NOON: return a_s_NOON;
+ case a_HEH: return a_s_HEH;
+ case a_YEH: return a_s_YEH;
}
-
- return tempc;
+ return 0;
}
// Change shape - from ISO-8859-6/Isolated to Initial
static int chg_c_a2i(int cur_c)
{
- int tempc;
-
switch (cur_c) {
- case a_YEH_HAMZA:
- tempc = a_i_YEH_HAMZA;
- break;
-
- case a_HAMZA: // exceptions
- tempc = a_s_HAMZA;
- break;
-
- case a_ALEF_MADDA: // exceptions
- tempc = a_s_ALEF_MADDA;
- break;
-
- case a_ALEF_HAMZA_ABOVE: // exceptions
- tempc = a_s_ALEF_HAMZA_ABOVE;
- break;
-
- case a_WAW_HAMZA: // exceptions
- tempc = a_s_WAW_HAMZA;
- break;
-
- case a_ALEF_HAMZA_BELOW: // exceptions
- tempc = a_s_ALEF_HAMZA_BELOW;
- break;
-
- case a_ALEF: // exceptions
- tempc = a_s_ALEF;
- break;
-
- case a_TEH_MARBUTA: // exceptions
- tempc = a_s_TEH_MARBUTA;
- break;
-
- case a_DAL: // exceptions
- tempc = a_s_DAL;
- break;
-
- case a_THAL: // exceptions
- tempc = a_s_THAL;
- break;
-
- case a_REH: // exceptions
- tempc = a_s_REH;
- break;
-
- case a_ZAIN: // exceptions
- tempc = a_s_ZAIN;
- break;
-
- case a_TATWEEL: // exceptions
- tempc = cur_c;
- break;
-
- case a_WAW: // exceptions
- tempc = a_s_WAW;
- break;
-
- case a_ALEF_MAKSURA: // exceptions
- tempc = a_s_ALEF_MAKSURA;
- break;
-
- case a_BEH:
- tempc = a_i_BEH;
- break;
-
- case a_TEH:
- tempc = a_i_TEH;
- break;
-
- case a_THEH:
- tempc = a_i_THEH;
- break;
-
- case a_JEEM:
- tempc = a_i_JEEM;
- break;
-
- case a_HAH:
- tempc = a_i_HAH;
- break;
-
- case a_KHAH:
- tempc = a_i_KHAH;
- break;
-
- case a_SEEN:
- tempc = a_i_SEEN;
- break;
-
- case a_SHEEN:
- tempc = a_i_SHEEN;
- break;
-
- case a_SAD:
- tempc = a_i_SAD;
- break;
-
- case a_DAD:
- tempc = a_i_DAD;
- break;
-
- case a_TAH:
- tempc = a_i_TAH;
- break;
-
- case a_ZAH:
- tempc = a_i_ZAH;
- break;
-
- case a_AIN:
- tempc = a_i_AIN;
- break;
-
- case a_GHAIN:
- tempc = a_i_GHAIN;
- break;
-
- case a_FEH:
- tempc = a_i_FEH;
- break;
-
- case a_QAF:
- tempc = a_i_QAF;
- break;
-
- case a_KAF:
- tempc = a_i_KAF;
- break;
-
- case a_LAM:
- tempc = a_i_LAM;
- break;
-
- case a_MEEM:
- tempc = a_i_MEEM;
- break;
-
- case a_NOON:
- tempc = a_i_NOON;
- break;
-
- case a_HEH:
- tempc = a_i_HEH;
- break;
-
- case a_YEH:
- tempc = a_i_YEH;
- break;
-
- default:
- tempc = 0;
+ case a_YEH_HAMZA: return a_i_YEH_HAMZA;
+ case a_HAMZA: return a_s_HAMZA; // exceptions
+ case a_ALEF_MADDA: return a_s_ALEF_MADDA; // exceptions
+ case a_ALEF_HAMZA_ABOVE: return a_s_ALEF_HAMZA_ABOVE; // exceptions
+ case a_WAW_HAMZA: return a_s_WAW_HAMZA; // exceptions
+ case a_ALEF_HAMZA_BELOW: return a_s_ALEF_HAMZA_BELOW; // exceptions
+ case a_ALEF: return a_s_ALEF; // exceptions
+ case a_TEH_MARBUTA: return a_s_TEH_MARBUTA; // exceptions
+ case a_DAL: return a_s_DAL; // exceptions
+ case a_THAL: return a_s_THAL; // exceptions
+ case a_REH: return a_s_REH; // exceptions
+ case a_ZAIN: return a_s_ZAIN; // exceptions
+ case a_TATWEEL: return cur_c; // exceptions
+ case a_WAW: return a_s_WAW; // exceptions
+ case a_ALEF_MAKSURA: return a_s_ALEF_MAKSURA; // exceptions
+ case a_BEH: return a_i_BEH;
+ case a_TEH: return a_i_TEH;
+ case a_THEH: return a_i_THEH;
+ case a_JEEM: return a_i_JEEM;
+ case a_HAH: return a_i_HAH;
+ case a_KHAH: return a_i_KHAH;
+ case a_SEEN: return a_i_SEEN;
+ case a_SHEEN: return a_i_SHEEN;
+ case a_SAD: return a_i_SAD;
+ case a_DAD: return a_i_DAD;
+ case a_TAH: return a_i_TAH;
+ case a_ZAH: return a_i_ZAH;
+ case a_AIN: return a_i_AIN;
+ case a_GHAIN: return a_i_GHAIN;
+ case a_FEH: return a_i_FEH;
+ case a_QAF: return a_i_QAF;
+ case a_KAF: return a_i_KAF;
+ case a_LAM: return a_i_LAM;
+ case a_MEEM: return a_i_MEEM;
+ case a_NOON: return a_i_NOON;
+ case a_HEH: return a_i_HEH;
+ case a_YEH: return a_i_YEH;
}
-
- return tempc;
+ return 0;
}
// Change shape - from ISO-8859-6/Isolated to Medial
static int chg_c_a2m(int cur_c)
{
- int tempc;
-
switch (cur_c) {
- case a_HAMZA: // exception
- tempc = a_s_HAMZA;
- break;
-
- case a_ALEF_MADDA: // exception
- tempc = a_f_ALEF_MADDA;
- break;
-
- case a_ALEF_HAMZA_ABOVE: // exception
- tempc = a_f_ALEF_HAMZA_ABOVE;
- break;
-
- case a_WAW_HAMZA: // exception
- tempc = a_f_WAW_HAMZA;
- break;
-
- case a_ALEF_HAMZA_BELOW: // exception
- tempc = a_f_ALEF_HAMZA_BELOW;
- break;
-
- case a_YEH_HAMZA:
- tempc = a_m_YEH_HAMZA;
- break;
-
- case a_ALEF: // exception
- tempc = a_f_ALEF;
- break;
-
- case a_BEH:
- tempc = a_m_BEH;
- break;
-
- case a_TEH_MARBUTA: // exception
- tempc = a_f_TEH_MARBUTA;
- break;
-
- case a_TEH:
- tempc = a_m_TEH;
- break;
-
- case a_THEH:
- tempc = a_m_THEH;
- break;
-
- case a_JEEM:
- tempc = a_m_JEEM;
- break;
-
- case a_HAH:
- tempc = a_m_HAH;
- break;
-
- case a_KHAH:
- tempc = a_m_KHAH;
- break;
-
- case a_DAL: // exception
- tempc = a_f_DAL;
- break;
-
- case a_THAL: // exception
- tempc = a_f_THAL;
- break;
-
- case a_REH: // exception
- tempc = a_f_REH;
- break;
-
- case a_ZAIN: // exception
- tempc = a_f_ZAIN;
- break;
-
- case a_SEEN:
- tempc = a_m_SEEN;
- break;
-
- case a_SHEEN:
- tempc = a_m_SHEEN;
- break;
-
- case a_SAD:
- tempc = a_m_SAD;
- break;
-
- case a_DAD:
- tempc = a_m_DAD;
- break;
-
- case a_TAH:
- tempc = a_m_TAH;
- break;
-
- case a_ZAH:
- tempc = a_m_ZAH;
- break;
-
- case a_AIN:
- tempc = a_m_AIN;
- break;
-
- case a_GHAIN:
- tempc = a_m_GHAIN;
- break;
-
- case a_TATWEEL: // exception
- tempc = cur_c;
- break;
-
- case a_FEH:
- tempc = a_m_FEH;
- break;
-
- case a_QAF:
- tempc = a_m_QAF;
- break;
-
- case a_KAF:
- tempc = a_m_KAF;
- break;
-
- case a_LAM:
- tempc = a_m_LAM;
- break;
-
- case a_MEEM:
- tempc = a_m_MEEM;
- break;
-
- case a_NOON:
- tempc = a_m_NOON;
- break;
-
- case a_HEH:
- tempc = a_m_HEH;
- break;
-
- case a_WAW: // exception
- tempc = a_f_WAW;
- break;
-
- case a_ALEF_MAKSURA: // exception
- tempc = a_f_ALEF_MAKSURA;
- break;
-
- case a_YEH:
- tempc = a_m_YEH;
- break;
-
- default:
- tempc = 0;
+ case a_HAMZA: return a_s_HAMZA; // exception
+ case a_ALEF_MADDA: return a_f_ALEF_MADDA; // exception
+ case a_ALEF_HAMZA_ABOVE: return a_f_ALEF_HAMZA_ABOVE; // exception
+ case a_WAW_HAMZA: return a_f_WAW_HAMZA; // exception
+ case a_ALEF_HAMZA_BELOW: return a_f_ALEF_HAMZA_BELOW; // exception
+ case a_YEH_HAMZA: return a_m_YEH_HAMZA;
+ case a_ALEF: return a_f_ALEF; // exception
+ case a_BEH: return a_m_BEH;
+ case a_TEH_MARBUTA: return a_f_TEH_MARBUTA; // exception
+ case a_TEH: return a_m_TEH;
+ case a_THEH: return a_m_THEH;
+ case a_JEEM: return a_m_JEEM;
+ case a_HAH: return a_m_HAH;
+ case a_KHAH: return a_m_KHAH;
+ case a_DAL: return a_f_DAL; // exception
+ case a_THAL: return a_f_THAL; // exception
+ case a_REH: return a_f_REH; // exception
+ case a_ZAIN: return a_f_ZAIN; // exception
+ case a_SEEN: return a_m_SEEN;
+ case a_SHEEN: return a_m_SHEEN;
+ case a_SAD: return a_m_SAD;
+ case a_DAD: return a_m_DAD;
+ case a_TAH: return a_m_TAH;
+ case a_ZAH: return a_m_ZAH;
+ case a_AIN: return a_m_AIN;
+ case a_GHAIN: return a_m_GHAIN;
+ case a_TATWEEL: return cur_c; // exception
+ case a_FEH: return a_m_FEH;
+ case a_QAF: return a_m_QAF;
+ case a_KAF: return a_m_KAF;
+ case a_LAM: return a_m_LAM;
+ case a_MEEM: return a_m_MEEM;
+ case a_NOON: return a_m_NOON;
+ case a_HEH: return a_m_HEH;
+ case a_WAW: return a_f_WAW; // exception
+ case a_ALEF_MAKSURA: return a_f_ALEF_MAKSURA; // exception
+ case a_YEH: return a_m_YEH;
}
-
- return tempc;
+ return 0;
}
// Change shape - from ISO-8859-6/Isolated to final
static int chg_c_a2f(int cur_c)
{
- int tempc;
-
// NOTE: these encodings need to be accounted for
//
// a_f_ALEF_MADDA;
@@ -885,280 +538,91 @@ static int chg_c_a2f(int cur_c)
// a_f_LAM_ALEF_HAMZA_BELOW;
switch (cur_c) {
- case a_HAMZA: // exception
- tempc = a_s_HAMZA;
- break;
-
- case a_ALEF_MADDA:
- tempc = a_f_ALEF_MADDA;
- break;
-
- case a_ALEF_HAMZA_ABOVE:
- tempc = a_f_ALEF_HAMZA_ABOVE;
- break;
-
- case a_WAW_HAMZA:
- tempc = a_f_WAW_HAMZA;
- break;
-
- case a_ALEF_HAMZA_BELOW:
- tempc = a_f_ALEF_HAMZA_BELOW;
- break;
-
- case a_YEH_HAMZA:
- tempc = a_f_YEH_HAMZA;
- break;
-
- case a_ALEF:
- tempc = a_f_ALEF;
- break;
-
- case a_BEH:
- tempc = a_f_BEH;
- break;
-
- case a_TEH_MARBUTA:
- tempc = a_f_TEH_MARBUTA;
- break;
-
- case a_TEH:
- tempc = a_f_TEH;
- break;
-
- case a_THEH:
- tempc = a_f_THEH;
- break;
-
- case a_JEEM:
- tempc = a_f_JEEM;
- break;
-
- case a_HAH:
- tempc = a_f_HAH;
- break;
-
- case a_KHAH:
- tempc = a_f_KHAH;
- break;
-
- case a_DAL:
- tempc = a_f_DAL;
- break;
-
- case a_THAL:
- tempc = a_f_THAL;
- break;
-
- case a_REH:
- tempc = a_f_REH;
- break;
-
- case a_ZAIN:
- tempc = a_f_ZAIN;
- break;
-
- case a_SEEN:
- tempc = a_f_SEEN;
- break;
-
- case a_SHEEN:
- tempc = a_f_SHEEN;
- break;
-
- case a_SAD:
- tempc = a_f_SAD;
- break;
-
- case a_DAD:
- tempc = a_f_DAD;
- break;
-
- case a_TAH:
- tempc = a_f_TAH;
- break;
-
- case a_ZAH:
- tempc = a_f_ZAH;
- break;
-
- case a_AIN:
- tempc = a_f_AIN;
- break;
-
- case a_GHAIN:
- tempc = a_f_GHAIN;
- break;
-
- case a_TATWEEL: // exception
- tempc = cur_c;
- break;
-
- case a_FEH:
- tempc = a_f_FEH;
- break;
-
- case a_QAF:
- tempc = a_f_QAF;
- break;
-
- case a_KAF:
- tempc = a_f_KAF;
- break;
-
- case a_LAM:
- tempc = a_f_LAM;
- break;
-
- case a_MEEM:
- tempc = a_f_MEEM;
- break;
-
- case a_NOON:
- tempc = a_f_NOON;
- break;
-
- case a_HEH:
- tempc = a_f_HEH;
- break;
-
- case a_WAW:
- tempc = a_f_WAW;
- break;
-
- case a_ALEF_MAKSURA:
- tempc = a_f_ALEF_MAKSURA;
- break;
-
- case a_YEH:
- tempc = a_f_YEH;
- break;
-
- default:
- tempc = 0;
+ case a_HAMZA: return a_s_HAMZA; // exception
+ case a_ALEF_MADDA: return a_f_ALEF_MADDA;
+ case a_ALEF_HAMZA_ABOVE: return a_f_ALEF_HAMZA_ABOVE;
+ case a_WAW_HAMZA: return a_f_WAW_HAMZA;
+ case a_ALEF_HAMZA_BELOW: return a_f_ALEF_HAMZA_BELOW;
+ case a_YEH_HAMZA: return a_f_YEH_HAMZA;
+ case a_ALEF: return a_f_ALEF;
+ case a_BEH: return a_f_BEH;
+ case a_TEH_MARBUTA: return a_f_TEH_MARBUTA;
+ case a_TEH: return a_f_TEH;
+ case a_THEH: return a_f_THEH;
+ case a_JEEM: return a_f_JEEM;
+ case a_HAH: return a_f_HAH;
+ case a_KHAH: return a_f_KHAH;
+ case a_DAL: return a_f_DAL;
+ case a_THAL: return a_f_THAL;
+ case a_REH: return a_f_REH;
+ case a_ZAIN: return a_f_ZAIN;
+ case a_SEEN: return a_f_SEEN;
+ case a_SHEEN: return a_f_SHEEN;
+ case a_SAD: return a_f_SAD;
+ case a_DAD: return a_f_DAD;
+ case a_TAH: return a_f_TAH;
+ case a_ZAH: return a_f_ZAH;
+ case a_AIN: return a_f_AIN;
+ case a_GHAIN: return a_f_GHAIN;
+ case a_TATWEEL: return cur_c; // exception
+ case a_FEH: return a_f_FEH;
+ case a_QAF: return a_f_QAF;
+ case a_KAF: return a_f_KAF;
+ case a_LAM: return a_f_LAM;
+ case a_MEEM: return a_f_MEEM;
+ case a_NOON: return a_f_NOON;
+ case a_HEH: return a_f_HEH;
+ case a_WAW: return a_f_WAW;
+ case a_ALEF_MAKSURA: return a_f_ALEF_MAKSURA;
+ case a_YEH: return a_f_YEH;
}
-
- return tempc;
+ return 0;
}
// Change shape - from Initial to Medial
+// This code is unreachable, because for the relevant characters ARABIC_CHAR()
+// is FALSE;
+#if 0
static int chg_c_i2m(int cur_c)
{
- int tempc;
-
switch (cur_c) {
- case a_i_YEH_HAMZA:
- tempc = a_m_YEH_HAMZA;
- break;
-
- case a_i_BEH:
- tempc = a_m_BEH;
- break;
-
- case a_i_TEH:
- tempc = a_m_TEH;
- break;
-
- case a_i_THEH:
- tempc = a_m_THEH;
- break;
-
- case a_i_JEEM:
- tempc = a_m_JEEM;
- break;
-
- case a_i_HAH:
- tempc = a_m_HAH;
- break;
-
- case a_i_KHAH:
- tempc = a_m_KHAH;
- break;
-
- case a_i_SEEN:
- tempc = a_m_SEEN;
- break;
-
- case a_i_SHEEN:
- tempc = a_m_SHEEN;
- break;
-
- case a_i_SAD:
- tempc = a_m_SAD;
- break;
-
- case a_i_DAD:
- tempc = a_m_DAD;
- break;
-
- case a_i_TAH:
- tempc = a_m_TAH;
- break;
-
- case a_i_ZAH:
- tempc = a_m_ZAH;
- break;
-
- case a_i_AIN:
- tempc = a_m_AIN;
- break;
-
- case a_i_GHAIN:
- tempc = a_m_GHAIN;
- break;
-
- case a_i_FEH:
- tempc = a_m_FEH;
- break;
-
- case a_i_QAF:
- tempc = a_m_QAF;
- break;
-
- case a_i_KAF:
- tempc = a_m_KAF;
- break;
-
- case a_i_LAM:
- tempc = a_m_LAM;
- break;
-
- case a_i_MEEM:
- tempc = a_m_MEEM;
- break;
-
- case a_i_NOON:
- tempc = a_m_NOON;
- break;
-
- case a_i_HEH:
- tempc = a_m_HEH;
- break;
-
- case a_i_YEH:
- tempc = a_m_YEH;
- break;
-
- default:
- tempc = 0;
+ case a_i_YEH_HAMZA: return a_m_YEH_HAMZA;
+ case a_i_BEH: return a_m_BEH;
+ case a_i_TEH: return a_m_TEH;
+ case a_i_THEH: return a_m_THEH;
+ case a_i_JEEM: return a_m_JEEM;
+ case a_i_HAH: return a_m_HAH;
+ case a_i_KHAH: return a_m_KHAH;
+ case a_i_SEEN: return a_m_SEEN;
+ case a_i_SHEEN: return a_m_SHEEN;
+ case a_i_SAD: return a_m_SAD;
+ case a_i_DAD: return a_m_DAD;
+ case a_i_TAH: return a_m_TAH;
+ case a_i_ZAH: return a_m_ZAH;
+ case a_i_AIN: return a_m_AIN;
+ case a_i_GHAIN: return a_m_GHAIN;
+ case a_i_FEH: return a_m_FEH;
+ case a_i_QAF: return a_m_QAF;
+ case a_i_KAF: return a_m_KAF;
+ case a_i_LAM: return a_m_LAM;
+ case a_i_MEEM: return a_m_MEEM;
+ case a_i_NOON: return a_m_NOON;
+ case a_i_HEH: return a_m_HEH;
+ case a_i_YEH: return a_m_YEH;
}
-
- return tempc;
+ return 0;
}
+#endif
// Change shape - from Final to Medial
static int chg_c_f2m(int cur_c)
{
- int tempc;
-
switch (cur_c) {
// NOTE: these encodings are multi-positional, no ?
// case a_f_ALEF_MADDA:
// case a_f_ALEF_HAMZA_ABOVE:
// case a_f_ALEF_HAMZA_BELOW:
- case a_f_YEH_HAMZA:
- tempc = a_m_YEH_HAMZA;
- break;
-
+ case a_f_YEH_HAMZA: return a_m_YEH_HAMZA;
case a_f_WAW_HAMZA: // exceptions
case a_f_ALEF:
case a_f_TEH_MARBUTA:
@@ -1168,165 +632,60 @@ static int chg_c_f2m(int cur_c)
case a_f_ZAIN:
case a_f_WAW:
case a_f_ALEF_MAKSURA:
- tempc = cur_c;
- break;
-
- case a_f_BEH:
- tempc = a_m_BEH;
- break;
-
- case a_f_TEH:
- tempc = a_m_TEH;
- break;
-
- case a_f_THEH:
- tempc = a_m_THEH;
- break;
-
- case a_f_JEEM:
- tempc = a_m_JEEM;
- break;
-
- case a_f_HAH:
- tempc = a_m_HAH;
- break;
-
- case a_f_KHAH:
- tempc = a_m_KHAH;
- break;
-
- case a_f_SEEN:
- tempc = a_m_SEEN;
- break;
-
- case a_f_SHEEN:
- tempc = a_m_SHEEN;
- break;
-
- case a_f_SAD:
- tempc = a_m_SAD;
- break;
-
- case a_f_DAD:
- tempc = a_m_DAD;
- break;
-
- case a_f_TAH:
- tempc = a_m_TAH;
- break;
-
- case a_f_ZAH:
- tempc = a_m_ZAH;
- break;
-
- case a_f_AIN:
- tempc = a_m_AIN;
- break;
-
- case a_f_GHAIN:
- tempc = a_m_GHAIN;
- break;
-
- case a_f_FEH:
- tempc = a_m_FEH;
- break;
-
- case a_f_QAF:
- tempc = a_m_QAF;
- break;
-
- case a_f_KAF:
- tempc = a_m_KAF;
- break;
-
- case a_f_LAM:
- tempc = a_m_LAM;
- break;
-
- case a_f_MEEM:
- tempc = a_m_MEEM;
- break;
-
- case a_f_NOON:
- tempc = a_m_NOON;
- break;
-
- case a_f_HEH:
- tempc = a_m_HEH;
- break;
-
- case a_f_YEH:
- tempc = a_m_YEH;
- break;
-
+ return cur_c;
+ case a_f_BEH: return a_m_BEH;
+ case a_f_TEH: return a_m_TEH;
+ case a_f_THEH: return a_m_THEH;
+ case a_f_JEEM: return a_m_JEEM;
+ case a_f_HAH: return a_m_HAH;
+ case a_f_KHAH: return a_m_KHAH;
+ case a_f_SEEN: return a_m_SEEN;
+ case a_f_SHEEN: return a_m_SHEEN;
+ case a_f_SAD: return a_m_SAD;
+ case a_f_DAD: return a_m_DAD;
+ case a_f_TAH: return a_m_TAH;
+ case a_f_ZAH: return a_m_ZAH;
+ case a_f_AIN: return a_m_AIN;
+ case a_f_GHAIN: return a_m_GHAIN;
+ case a_f_FEH: return a_m_FEH;
+ case a_f_QAF: return a_m_QAF;
+ case a_f_KAF: return a_m_KAF;
+ case a_f_LAM: return a_m_LAM;
+ case a_f_MEEM: return a_m_MEEM;
+ case a_f_NOON: return a_m_NOON;
+ case a_f_HEH: return a_m_HEH;
+ case a_f_YEH: return a_m_YEH;
// NOTE: these encodings are multi-positional, no ?
// case a_f_LAM_ALEF_MADDA_ABOVE:
// case a_f_LAM_ALEF_HAMZA_ABOVE:
// case a_f_LAM_ALEF_HAMZA_BELOW:
// case a_f_LAM_ALEF:
- default:
- tempc = 0;
}
-
- return tempc;
+ return 0;
}
// Change shape - from Combination (2 char) to an Isolated.
static int chg_c_laa2i(int hid_c)
{
- int tempc;
-
switch (hid_c) {
- case a_ALEF_MADDA:
- tempc = a_s_LAM_ALEF_MADDA_ABOVE;
- break;
-
- case a_ALEF_HAMZA_ABOVE:
- tempc = a_s_LAM_ALEF_HAMZA_ABOVE;
- break;
-
- case a_ALEF_HAMZA_BELOW:
- tempc = a_s_LAM_ALEF_HAMZA_BELOW;
- break;
-
- case a_ALEF:
- tempc = a_s_LAM_ALEF;
- break;
-
- default:
- tempc = 0;
+ case a_ALEF_MADDA: return a_s_LAM_ALEF_MADDA_ABOVE;
+ case a_ALEF_HAMZA_ABOVE: return a_s_LAM_ALEF_HAMZA_ABOVE;
+ case a_ALEF_HAMZA_BELOW: return a_s_LAM_ALEF_HAMZA_BELOW;
+ case a_ALEF: return a_s_LAM_ALEF;
}
-
- return tempc;
+ return 0;
}
// Change shape - from Combination-Isolated to Final.
static int chg_c_laa2f(int hid_c)
{
- int tempc;
-
switch (hid_c) {
- case a_ALEF_MADDA:
- tempc = a_f_LAM_ALEF_MADDA_ABOVE;
- break;
-
- case a_ALEF_HAMZA_ABOVE:
- tempc = a_f_LAM_ALEF_HAMZA_ABOVE;
- break;
-
- case a_ALEF_HAMZA_BELOW:
- tempc = a_f_LAM_ALEF_HAMZA_BELOW;
- break;
-
- case a_ALEF:
- tempc = a_f_LAM_ALEF;
- break;
-
- default:
- tempc = 0;
+ case a_ALEF_MADDA: return a_f_LAM_ALEF_MADDA_ABOVE;
+ case a_ALEF_HAMZA_ABOVE: return a_f_LAM_ALEF_HAMZA_ABOVE;
+ case a_ALEF_HAMZA_BELOW: return a_f_LAM_ALEF_HAMZA_BELOW;
+ case a_ALEF: return a_f_LAM_ALEF;
}
-
- return tempc;
+ return 0;
}
// Do "half-shaping" on character "c". Return zero if no shaping.
@@ -1381,7 +740,11 @@ int arabic_shape(int c, int *ccp, int *c1p, int prev_c, int prev_c1,
} else if (!shape_c || A_is_f(shape_c) || A_is_s(shape_c) || prev_laa) {
curr_c = A_is_valid(next_c) ? chg_c_a2i(c) : chg_c_a2s(c);
} else if (A_is_valid(next_c)) {
+#if 0
curr_c = A_is_iso(c) ? chg_c_a2m(c) : chg_c_i2m(c);
+#else
+ curr_c = A_is_iso(c) ? chg_c_a2m(c) : 0;
+#endif
} else if (A_is_valid(prev_c)) {
curr_c = chg_c_a2f(c);
} else {
@@ -1398,7 +761,7 @@ int arabic_shape(int c, int *ccp, int *c1p, int prev_c, int prev_c1,
char_u buf[MB_MAXBYTES + 1];
// Update the first byte of the character
- (*mb_char2bytes)(curr_c, buf);
+ utf_char2bytes(curr_c, buf);
*ccp = buf[0];
}
diff --git a/src/nvim/ascii.h b/src/nvim/ascii.h
index 44ff540b40..ff6840d690 100644
--- a/src/nvim/ascii.h
+++ b/src/nvim/ascii.h
@@ -3,14 +3,17 @@
#include <stdbool.h>
+#include "nvim/macros.h"
#include "nvim/func_attr.h"
#include "nvim/os/os_defs.h"
// Definitions of various common control characters.
-#define CharOrd(x) ((x) < 'a' ? (x) - 'A' : (x) - 'a')
-#define CharOrdLow(x) ((x) - 'a')
-#define CharOrdUp(x) ((x) - 'A')
+#define CharOrd(x) ((uint8_t)(x) < 'a' \
+ ? (uint8_t)(x) - 'A'\
+ : (uint8_t)(x) - 'a')
+#define CharOrdLow(x) ((uint8_t)(x) - 'a')
+#define CharOrdUp(x) ((uint8_t)(x) - 'A')
#define ROT13(c, a) (((((c) - (a)) + 13) % 26) + (a))
#define NUL '\000'
@@ -18,15 +21,14 @@
#define BS '\010'
#define TAB '\011'
#define NL '\012'
-#define NL_STR (char_u *)"\012"
+#define NL_STR "\012"
#define FF '\014'
#define CAR '\015' /* CR is used by Mac OS X */
#define ESC '\033'
-#define ESC_STR (char_u *)"\033"
-#define ESC_STR_nc "\033"
+#define ESC_STR "\033"
#define DEL 0x7f
-#define DEL_STR (char_u *)"\177"
-#define CSI 0x9b /* Control Sequence Introducer */
+#define DEL_STR "\177"
+#define CSI 0x9b // Control Sequence Introducer
#define CSI_STR "\233"
#define DCS 0x90 /* Device Control String */
#define STERM 0x9c /* String Terminator */
@@ -97,6 +99,10 @@ static inline bool ascii_isxdigit(int)
REAL_FATTR_CONST
REAL_FATTR_ALWAYS_INLINE;
+static inline bool ascii_isident(int)
+ REAL_FATTR_CONST
+ REAL_FATTR_ALWAYS_INLINE;
+
static inline bool ascii_isbdigit(int)
REAL_FATTR_CONST
REAL_FATTR_ALWAYS_INLINE;
@@ -137,6 +143,14 @@ static inline bool ascii_isxdigit(int c)
|| (c >= 'A' && c <= 'F');
}
+/// Checks if `c` is an โ€œidentifierโ€ character
+///
+/// That is, whether it is alphanumeric character or underscore.
+static inline bool ascii_isident(int c)
+{
+ return ASCII_ISALNUM(c) || c == '_';
+}
+
/// Checks if `c` is a binary digit, that is, 0-1.
///
/// @see {ascii_isdigit}
diff --git a/src/nvim/assert.h b/src/nvim/assert.h
index 761636305e..29195a49dc 100644
--- a/src/nvim/assert.h
+++ b/src/nvim/assert.h
@@ -121,4 +121,34 @@
((enum { ASSERT_CONCAT(assert_line_, __LINE__) = 1/(!!(e)) }) 0)
#endif
+/// @def STRICT_ADD
+/// @brief Adds (a + b) and stores result in `c`. Aborts on overflow.
+///
+/// Requires GCC 5+ and Clang 3.8+
+/// https://clang.llvm.org/docs/LanguageExtensions.html
+/// https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html
+///
+/// Alternative for compilers without __builtin_xx_overflow ?
+/// https://stackoverflow.com/a/44830670/152142
+///
+/// @param MAX Maximum value of the narrowest type of operand.
+/// Not used if compiler supports __builtin_add_overflow.
+#if HAVE_BUILTIN_ADD_OVERFLOW
+# define STRICT_ADD(a, b, c, t) \
+ do { if (__builtin_add_overflow(a, b, c)) { abort(); } } while (0)
+#else
+# define STRICT_ADD(a, b, c, t) \
+ do { *(c) = (t)(a + b); } while (0)
+#endif
+
+/// @def STRICT_SUB
+/// @brief Subtracts (a - b) and stores result in `c`. Aborts on overflow.
+#if HAVE_BUILTIN_ADD_OVERFLOW
+# define STRICT_SUB(a, b, c, t) \
+ do { if (__builtin_sub_overflow(a, b, c)) { abort(); } } while (0)
+#else
+# define STRICT_SUB(a, b, c, t) \
+ do { *(c) = (t)(a - b); } while (0)
+#endif
+
#endif // NVIM_ASSERT_H
diff --git a/src/nvim/aucmd.c b/src/nvim/aucmd.c
new file mode 100644
index 0000000000..9ad3414b79
--- /dev/null
+++ b/src/nvim/aucmd.c
@@ -0,0 +1,40 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+#include "nvim/os/os.h"
+#include "nvim/fileio.h"
+#include "nvim/vim.h"
+#include "nvim/main.h"
+#include "nvim/ui.h"
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "aucmd.c.generated.h"
+#endif
+
+static void focusgained_event(void **argv)
+{
+ bool *gainedp = argv[0];
+ do_autocmd_focusgained(*gainedp);
+ xfree(gainedp);
+}
+void aucmd_schedule_focusgained(bool gained)
+{
+ bool *gainedp = xmalloc(sizeof(*gainedp));
+ *gainedp = gained;
+ loop_schedule_deferred(&main_loop,
+ event_create(focusgained_event, 1, gainedp));
+}
+
+static void do_autocmd_focusgained(bool gained)
+{
+ static bool recursive = false;
+
+ if (recursive) {
+ return; // disallow recursion
+ }
+ recursive = true;
+ apply_autocmds((gained ? EVENT_FOCUSGAINED : EVENT_FOCUSLOST),
+ NULL, NULL, false, curbuf);
+ recursive = false;
+}
+
diff --git a/src/nvim/aucmd.h b/src/nvim/aucmd.h
new file mode 100644
index 0000000000..6570ba7a92
--- /dev/null
+++ b/src/nvim/aucmd.h
@@ -0,0 +1,9 @@
+#ifndef NVIM_AUCMD_H
+#define NVIM_AUCMD_H
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "aucmd.h.generated.h"
+#endif
+
+#endif // NVIM_AUCMD_H
+
diff --git a/src/nvim/auevents.lua b/src/nvim/auevents.lua
index 8d891effae..3cffd66dee 100644
--- a/src/nvim/auevents.lua
+++ b/src/nvim/auevents.lua
@@ -19,16 +19,25 @@ return {
'BufWriteCmd', -- write buffer using command
'BufWritePost', -- after writing a buffer
'BufWritePre', -- before writing a buffer
+ 'ChanInfo', -- info was received about channel
+ 'ChanOpen', -- channel was opened
+ 'CmdLineChanged', -- command line was modified
+ 'CmdLineEnter', -- after entering cmdline mode
+ 'CmdLineLeave', -- before leaving cmdline mode
'CmdUndefined', -- command undefined
'CmdWinEnter', -- after entering the cmdline window
'CmdWinLeave', -- before leaving the cmdline window
'ColorScheme', -- after loading a colorscheme
+ 'ColorSchemePre', -- before loading a colorscheme
'CompleteDone', -- after finishing insert complete
'CursorHold', -- cursor in same position for a while
'CursorHoldI', -- idem, in Insert mode
'CursorMoved', -- cursor was moved
'CursorMovedI', -- cursor was moved in Insert mode
+ 'DiffUpdated', -- diffs have been updated
+ 'DirChanged', -- directory changed
'EncodingChanged', -- after changing the 'encoding' option
+ 'ExitPre', -- before exiting
'FileAppendCmd', -- append to a file using command
'FileAppendPost', -- after appending to a file
'FileAppendPre', -- before appending to a file
@@ -82,15 +91,19 @@ return {
'TermOpen', -- after opening a terminal buffer
'TermResponse', -- after setting "v:termresponse"
'TextChanged', -- text was modified
- 'TextChangedI', -- text was modified in Insert mode
+ 'TextChangedI', -- text was modified in Insert mode(no popup)
+ 'TextChangedP', -- text was modified in Insert mode(popup)
'TextYankPost', -- after a yank or delete was done (y, d, c)
'User', -- user defined autocommand
'VimEnter', -- after starting Vim
'VimLeave', -- before exiting Vim
'VimLeavePre', -- before exiting Vim and writing ShaDa file
'VimResized', -- after Vim window was resized
+ 'VimResume', -- after Nvim is resumed
+ 'VimSuspend', -- before Nvim is suspended
'WinEnter', -- after entering a window
'WinLeave', -- before leaving a window
+ 'WinNew', -- when entering a new window
},
aliases = {
BufCreate = 'BufAdd',
@@ -98,9 +111,10 @@ return {
BufWrite = 'BufWritePre',
FileEncoding = 'EncodingChanged',
},
- -- List of neovim-specific events or aliases for the purpose of generating
+ -- List of nvim-specific events or aliases for the purpose of generating
-- syntax file
- neovim_specific = {
+ nvim_specific = {
+ DirChanged=true,
TabClosed=true,
TabNew=true,
TabNewEntered=true,
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c
index 438a85dd5d..c15a6f1330 100644
--- a/src/nvim/buffer.c
+++ b/src/nvim/buffer.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* buffer.c: functions for dealing with the buffer structure
*/
@@ -19,8 +22,11 @@
#include <stdbool.h>
#include <string.h>
#include <inttypes.h>
+#include <assert.h>
#include "nvim/api/private/handle.h"
+#include "nvim/api/private/helpers.h"
+#include "nvim/api/vim.h"
#include "nvim/ascii.h"
#include "nvim/assert.h"
#include "nvim/vim.h"
@@ -36,9 +42,11 @@
#include "nvim/ex_eval.h"
#include "nvim/ex_getln.h"
#include "nvim/fileio.h"
+#include "nvim/file_search.h"
#include "nvim/fold.h"
#include "nvim/getchar.h"
#include "nvim/hashtab.h"
+#include "nvim/highlight.h"
#include "nvim/indent.h"
#include "nvim/indent_c.h"
#include "nvim/main.h"
@@ -48,7 +56,6 @@
#include "nvim/memory.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/garray.h"
#include "nvim/move.h"
#include "nvim/option.h"
@@ -60,7 +67,6 @@
#include "nvim/spell.h"
#include "nvim/strings.h"
#include "nvim/syntax.h"
-#include "nvim/terminal.h"
#include "nvim/ui.h"
#include "nvim/undo.h"
#include "nvim/version.h"
@@ -69,6 +75,13 @@
#include "nvim/os/os.h"
#include "nvim/os/time.h"
#include "nvim/os/input.h"
+#include "nvim/buffer_updates.h"
+
+typedef enum {
+ kBLSUnchanged = 0,
+ kBLSChanged = 1,
+ kBLSDeleted = 2,
+} BufhlLineStatus;
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "buffer.c.generated.h"
@@ -78,6 +91,60 @@ static char *msg_loclist = N_("[Location List]");
static char *msg_qflist = N_("[Quickfix List]");
static char *e_auabort = N_("E855: Autocommands caused command to abort");
+// Number of times free_buffer() was called.
+static int buf_free_count = 0;
+
+// Read data from buffer for retrying.
+static int
+read_buffer(
+ int read_stdin, // read file from stdin, otherwise fifo
+ exarg_T *eap, // for forced 'ff' and 'fenc' or NULL
+ int flags) // extra flags for readfile()
+{
+ int retval = OK;
+ linenr_T line_count;
+
+ //
+ // Read from the buffer which the text is already filled in and append at
+ // the end. This makes it possible to retry when 'fileformat' or
+ // 'fileencoding' was guessed wrong.
+ //
+ line_count = curbuf->b_ml.ml_line_count;
+ retval = readfile(
+ read_stdin ? NULL : curbuf->b_ffname,
+ read_stdin ? NULL : curbuf->b_fname,
+ (linenr_T)line_count, (linenr_T)0, (linenr_T)MAXLNUM, eap,
+ flags | READ_BUFFER);
+ if (retval == OK) {
+ // Delete the binary lines.
+ while (--line_count >= 0) {
+ ml_delete((linenr_T)1, false);
+ }
+ } else {
+ // Delete the converted lines.
+ while (curbuf->b_ml.ml_line_count > line_count) {
+ ml_delete(line_count, false);
+ }
+ }
+ // Put the cursor on the first line.
+ curwin->w_cursor.lnum = 1;
+ curwin->w_cursor.col = 0;
+
+ if (read_stdin) {
+ // Set or reset 'modified' before executing autocommands, so that
+ // it can be changed there.
+ if (!readonlymode && !BUFEMPTY()) {
+ changed();
+ } else if (retval != FAIL) {
+ unchanged(curbuf, false);
+ }
+
+ apply_autocmds_retval(EVENT_STDINREADPOST, NULL, NULL, false,
+ curbuf, &retval);
+ }
+ return retval;
+}
+
/*
* Open current buffer, that is: open the memfile and read the file into
* memory.
@@ -91,8 +158,9 @@ open_buffer (
)
{
int retval = OK;
- buf_T *old_curbuf;
+ bufref_T old_curbuf;
long old_tw = curbuf->b_p_tw;
+ int read_fifo = false;
/*
* The 'readonly' flag is only set when BF_NEVERLOADED is being reset.
@@ -133,32 +201,63 @@ open_buffer (
return FAIL;
}
- /* The autocommands in readfile() may change the buffer, but only AFTER
- * reading the file. */
- old_curbuf = curbuf;
- modified_was_set = FALSE;
+ // The autocommands in readfile() may change the buffer, but only AFTER
+ // reading the file.
+ set_bufref(&old_curbuf, curbuf);
+ modified_was_set = false;
/* mark cursor position as being invalid */
curwin->w_valid = 0;
if (curbuf->b_ffname != NULL) {
int old_msg_silent = msg_silent;
+#ifdef UNIX
+ int save_bin = curbuf->b_p_bin;
+ int perm;
+
+ perm = os_getperm((const char *)curbuf->b_ffname);
+ if (perm >= 0 && (0
+# ifdef S_ISFIFO
+ || S_ISFIFO(perm)
+# endif
+# ifdef S_ISSOCK
+ || S_ISSOCK(perm)
+# endif
+# ifdef OPEN_CHR_FILES
+ || (S_ISCHR(perm)
+ && is_dev_fd_file(curbuf->b_ffname))
+# endif
+ )
+ ) {
+ read_fifo = true;
+ }
+ if (read_fifo) {
+ curbuf->b_p_bin = true;
+ }
+#endif
if (shortmess(SHM_FILEINFO)) {
msg_silent = 1;
}
retval = readfile(curbuf->b_ffname, curbuf->b_fname,
(linenr_T)0, (linenr_T)0, (linenr_T)MAXLNUM, eap,
- flags | READ_NEW);
+ flags | READ_NEW | (read_fifo ? READ_FIFO : 0));
+#ifdef UNIX
+ if (read_fifo) {
+ curbuf->b_p_bin = save_bin;
+ if (retval == OK) {
+ retval = read_buffer(false, eap, flags);
+ }
+ }
+#endif
msg_silent = old_msg_silent;
// Help buffer is filtered.
- if (curbuf->b_help) {
+ if (bt_help(curbuf)) {
fix_help_buffer();
}
} else if (read_stdin) {
int save_bin = curbuf->b_p_bin;
- linenr_T line_count;
/*
* First read the text in binary mode into the buffer.
@@ -172,56 +271,36 @@ open_buffer (
flags | (READ_NEW + READ_STDIN));
curbuf->b_p_bin = save_bin;
if (retval == OK) {
- line_count = curbuf->b_ml.ml_line_count;
- retval = readfile(NULL, NULL, (linenr_T)line_count,
- (linenr_T)0, (linenr_T)MAXLNUM, eap,
- flags | READ_BUFFER);
- if (retval == OK) {
- /* Delete the binary lines. */
- while (--line_count >= 0)
- ml_delete((linenr_T)1, FALSE);
- } else {
- /* Delete the converted lines. */
- while (curbuf->b_ml.ml_line_count > line_count)
- ml_delete(line_count, FALSE);
- }
- /* Put the cursor on the first line. */
- curwin->w_cursor.lnum = 1;
- curwin->w_cursor.col = 0;
-
- /* Set or reset 'modified' before executing autocommands, so that
- * it can be changed there. */
- if (!readonlymode && !bufempty())
- changed();
- else if (retval != FAIL)
- unchanged(curbuf, FALSE);
- apply_autocmds_retval(EVENT_STDINREADPOST, NULL, NULL, FALSE,
- curbuf, &retval);
+ retval = read_buffer(true, eap, flags);
}
}
/* if first time loading this buffer, init b_chartab[] */
if (curbuf->b_flags & BF_NEVERLOADED) {
- (void)buf_init_chartab(curbuf, FALSE);
+ (void)buf_init_chartab(curbuf, false);
parse_cino(curbuf);
}
- /*
- * Set/reset the Changed flag first, autocmds may change the buffer.
- * Apply the automatic commands, before processing the modelines.
- * So the modelines have priority over auto commands.
- */
- /* When reading stdin, the buffer contents always needs writing, so set
- * the changed flag. Unless in readonly mode: "ls | nvim -R -".
- * When interrupted and 'cpoptions' contains 'i' set changed flag. */
+ // Set/reset the Changed flag first, autocmds may change the buffer.
+ // Apply the automatic commands, before processing the modelines.
+ // So the modelines have priority over auto commands.
+
+ // When reading stdin, the buffer contents always needs writing, so set
+ // the changed flag. Unless in readonly mode: "ls | nvim -R -".
+ // When interrupted and 'cpoptions' contains 'i' set changed flag.
if ((got_int && vim_strchr(p_cpo, CPO_INTMOD) != NULL)
- || modified_was_set /* ":set modified" used in autocmd */
- || (aborting() && vim_strchr(p_cpo, CPO_INTMOD) != NULL)
- )
+ || modified_was_set // ":set modified" used in autocmd
+ || (aborting() && vim_strchr(p_cpo, CPO_INTMOD) != NULL)) {
changed();
- else if (retval != FAIL && !read_stdin)
- unchanged(curbuf, FALSE);
- save_file_ff(curbuf); /* keep this fileformat */
+ } else if (retval != FAIL && !read_stdin && !read_fifo) {
+ unchanged(curbuf, false);
+ }
+ save_file_ff(curbuf); // keep this fileformat
+
+ // Set last_changedtick to avoid triggering a TextChanged autocommand right
+ // after it was added.
+ curbuf->b_last_changedtick = buf_get_changedtick(curbuf);
+ curbuf->b_last_changedtick_pum = buf_get_changedtick(curbuf);
/* require "!" to overwrite the file, because it wasn't read completely */
if (aborting())
@@ -246,11 +325,11 @@ open_buffer (
* The autocommands may have changed the current buffer. Apply the
* modelines to the correct buffer, if it still exists and is loaded.
*/
- if (buf_valid(old_curbuf) && old_curbuf->b_ml.ml_mfp != NULL) {
+ if (bufref_valid(&old_curbuf) && old_curbuf.br_buf->b_ml.ml_mfp != NULL) {
aco_save_T aco;
- /* Go to the buffer that was opened. */
- aucmd_prepbuf(&aco, old_curbuf);
+ // Go to the buffer that was opened.
+ aucmd_prepbuf(&aco, old_curbuf.br_buf);
do_modelines(0);
curbuf->b_flags &= ~(BF_CHECK_RO | BF_NEVERLOADED);
@@ -264,11 +343,45 @@ open_buffer (
return retval;
}
-/// Check that "buf" points to a valid buffer (in the buffer list).
+/// Store "buf" in "bufref" and set the free count.
+///
+/// @param bufref Reference to be used for the buffer.
+/// @param buf The buffer to reference.
+void set_bufref(bufref_T *bufref, buf_T *buf)
+{
+ bufref->br_buf = buf;
+ bufref->br_fnum = buf == NULL ? 0 : buf->b_fnum;
+ bufref->br_buf_free_count = buf_free_count;
+}
+
+/// Return true if "bufref->br_buf" points to the same buffer as when
+/// set_bufref() was called and it is a valid buffer.
+/// Only goes through the buffer list if buf_free_count changed.
+/// Also checks if b_fnum is still the same, a :bwipe followed by :new might get
+/// the same allocated memory, but it's a different buffer.
+///
+/// @param bufref Buffer reference to check for.
+bool bufref_valid(bufref_T *bufref)
+{
+ return bufref->br_buf_free_count == buf_free_count
+ ? true
+ : buf_valid(bufref->br_buf) && bufref->br_fnum == bufref->br_buf->b_fnum;
+}
+
+/// Check that "buf" points to a valid buffer in the buffer list.
+///
+/// Can be slow if there are many buffers, prefer using bufref_valid().
+///
+/// @param buf The buffer to check for.
bool buf_valid(buf_T *buf)
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
- FOR_ALL_BUFFERS(bp) {
+ if (buf == NULL) {
+ return false;
+ }
+ // Assume that we more often have a recent buffer,
+ // start with the last one.
+ for (buf_T *bp = lastbuf; bp != NULL; bp = bp->b_prev) {
if (bp == buf) {
return true;
}
@@ -276,35 +389,34 @@ bool buf_valid(buf_T *buf)
return false;
}
-/*
- * Close the link to a buffer.
- * "action" is used when there is no longer a window for the buffer.
- * It can be:
- * 0 buffer becomes hidden
- * DOBUF_UNLOAD buffer is unloaded
- * DOBUF_DELETE buffer is unloaded and removed from buffer list
- * DOBUF_WIPE buffer is unloaded and really deleted
- * When doing all but the first one on the current buffer, the caller should
- * get a new buffer very soon!
- *
- * The 'bufhidden' option can force freeing and deleting.
- *
- * When "abort_if_last" is TRUE then do not close the buffer if autocommands
- * cause there to be only one window with this buffer. e.g. when ":quit" is
- * supposed to close the window but autocommands close all other windows.
- */
-void
-close_buffer (
- win_T *win, /* if not NULL, set b_last_cursor */
- buf_T *buf,
- int action,
- int abort_if_last
-)
+/// Close the link to a buffer.
+///
+/// @param win If not NULL, set b_last_cursor.
+/// @param buf
+/// @param action Used when there is no longer a window for the buffer.
+/// Possible values:
+/// 0 buffer becomes hidden
+/// DOBUF_UNLOAD buffer is unloaded
+/// DOBUF_DELETE buffer is unloaded and removed from buffer list
+/// DOBUF_WIPE buffer is unloaded and really deleted
+/// When doing all but the first one on the current buffer, the
+/// caller should get a new buffer very soon!
+/// The 'bufhidden' option can force freeing and deleting.
+/// @param abort_if_last
+/// If TRUE, do not close the buffer if autocommands cause
+/// there to be only one window with this buffer. e.g. when
+/// ":quit" is supposed to close the window but autocommands
+/// close all other windows.
+void close_buffer(win_T *win, buf_T *buf, int action, int abort_if_last)
{
bool unload_buf = (action != 0);
bool del_buf = (action == DOBUF_DEL || action == DOBUF_WIPE);
bool wipe_buf = (action == DOBUF_WIPE);
+ bool is_curwin = (curwin != NULL && curwin->w_buffer == buf);
+ win_T *the_curwin = curwin;
+ tabpage_T *the_curtab = curtab;
+
// Force unloading or deleting when 'bufhidden' says so, but not for terminal
// buffers.
// The caller must take care of NOT deleting/freeing when 'bufhidden' is
@@ -328,47 +440,57 @@ close_buffer (
wipe_buf = true;
}
- if (win_valid(win)) {
- /* Set b_last_cursor when closing the last window for the buffer.
- * Remember the last cursor position and window options of the buffer.
- * This used to be only for the current window, but then options like
- * 'foldmethod' may be lost with a ":only" command. */
- if (buf->b_nwindows == 1)
+ // Disallow deleting the buffer when it is locked (already being closed or
+ // halfway a command that relies on it). Unloading is allowed.
+ if (buf->b_locked > 0 && (del_buf || wipe_buf)) {
+ EMSG(_("E937: Attempt to delete a buffer that is in use"));
+ return;
+ }
+
+ if (win != NULL // Avoid bogus clang warning.
+ && win_valid_any_tab(win)) {
+ // Set b_last_cursor when closing the last window for the buffer.
+ // Remember the last cursor position and window options of the buffer.
+ // This used to be only for the current window, but then options like
+ // 'foldmethod' may be lost with a ":only" command.
+ if (buf->b_nwindows == 1) {
set_last_cursor(win);
+ }
buflist_setfpos(buf, win,
win->w_cursor.lnum == 1 ? 0 : win->w_cursor.lnum,
win->w_cursor.col, TRUE);
}
+ bufref_T bufref;
+ set_bufref(&bufref, buf);
+
/* When the buffer is no longer in a window, trigger BufWinLeave */
if (buf->b_nwindows == 1) {
- buf->b_closing = true;
- apply_autocmds(EVENT_BUFWINLEAVE, buf->b_fname, buf->b_fname,
- FALSE, buf);
- if (!buf_valid(buf)) {
- /* Autocommands deleted the buffer. */
+ buf->b_locked++;
+ if (apply_autocmds(EVENT_BUFWINLEAVE, buf->b_fname, buf->b_fname, false,
+ buf) && !bufref_valid(&bufref)) {
+ // Autocommands deleted the buffer.
EMSG(_(e_auabort));
return;
}
- buf->b_closing = false;
+ buf->b_locked--;
if (abort_if_last && one_window()) {
/* Autocommands made this the only window. */
EMSG(_(e_auabort));
return;
}
- /* When the buffer becomes hidden, but is not unloaded, trigger
- * BufHidden */
+ // When the buffer becomes hidden, but is not unloaded, trigger
+ // BufHidden
if (!unload_buf) {
- buf->b_closing = true;
- apply_autocmds(EVENT_BUFHIDDEN, buf->b_fname, buf->b_fname,
- FALSE, buf);
- if (!buf_valid(buf)) {
- /* Autocommands deleted the buffer. */
+ buf->b_locked++;
+ if (apply_autocmds(EVENT_BUFHIDDEN, buf->b_fname, buf->b_fname, false,
+ buf) && !bufref_valid(&bufref)) {
+ // Autocommands deleted the buffer.
EMSG(_(e_auabort));
return;
}
- buf->b_closing = false;
+ buf->b_locked--;
if (abort_if_last && one_window()) {
/* Autocommands made this the only window. */
EMSG(_(e_auabort));
@@ -378,20 +500,36 @@ close_buffer (
if (aborting()) /* autocmds may abort script processing */
return;
}
+
+ // If the buffer was in curwin and the window has changed, go back to that
+ // window, if it still exists. This avoids that ":edit x" triggering a
+ // "tabnext" BufUnload autocmd leaves a window behind without a buffer.
+ if (is_curwin && curwin != the_curwin && win_valid_any_tab(the_curwin)) {
+ block_autocmds();
+ goto_tabpage_win(the_curtab, the_curwin);
+ unblock_autocmds();
+ }
+
int nwindows = buf->b_nwindows;
- /* decrease the link count from windows (unless not in any window) */
- if (buf->b_nwindows > 0)
- --buf->b_nwindows;
+ // decrease the link count from windows (unless not in any window)
+ if (buf->b_nwindows > 0) {
+ buf->b_nwindows--;
+ }
+
+ if (diffopt_hiddenoff() && !unload_buf && buf->b_nwindows == 0) {
+ diff_buf_delete(buf); // Clear 'diff' for hidden buffer.
+ }
/* Return when a window is displaying the buffer or when it's not
* unloaded. */
- if (buf->b_nwindows > 0 || !unload_buf)
+ if (buf->b_nwindows > 0 || !unload_buf) {
return;
+ }
if (buf->terminal) {
terminal_close(buf->terminal, NULL);
- }
+ }
/* Always remove the buffer when there is no file name. */
if (buf->b_ffname == NULL)
@@ -404,23 +542,29 @@ close_buffer (
/* Remember if we are closing the current buffer. Restore the number of
* windows, so that autocommands in buf_freeall() don't get confused. */
bool is_curbuf = (buf == curbuf);
+
+ // When closing the current buffer stop Visual mode before freeing
+ // anything.
+ if (is_curbuf && VIsual_active
+#if defined(EXITFREE)
+ && !entered_free_all_mem
+#endif
+ ) {
+ end_visual_mode();
+ }
+
buf->b_nwindows = nwindows;
buf_freeall(buf, (del_buf ? BFA_DEL : 0) + (wipe_buf ? BFA_WIPE : 0));
- if (win_valid(win) && win->w_buffer == buf) {
- win->w_buffer = NULL; // make sure we don't use the buffer now
- }
- /* Autocommands may have deleted the buffer. */
- if (!buf_valid(buf))
+ if (!bufref_valid(&bufref)) {
+ // Autocommands may have deleted the buffer.
return;
- if (aborting()) /* autocmds may abort script processing */
+ }
+ if (aborting()) {
+ // Autocmds may abort script processing.
return;
-
- /* Autocommands may have opened or closed windows for this buffer.
- * Decrement the count for the close we do here. */
- if (buf->b_nwindows > 0)
- --buf->b_nwindows;
+ }
/*
* It's possible that autocommands change curbuf to the one being deleted.
@@ -432,9 +576,24 @@ close_buffer (
if (buf == curbuf && !is_curbuf)
return;
+ if (win != NULL // Avoid bogus clang warning.
+ && win_valid_any_tab(win)
+ && win->w_buffer == buf) {
+ win->w_buffer = NULL; // make sure we don't use the buffer now
+ }
+
+ // Autocommands may have opened or closed windows for this buffer.
+ // Decrement the count for the close we do here.
+ if (buf->b_nwindows > 0) {
+ buf->b_nwindows--;
+ }
+
/* Change directories when the 'acd' option is set. */
do_autochdir();
+ // disable buffer updates for the current buffer
+ buf_updates_unregister_all(buf);
+
/*
* Remove the buffer from the list.
*/
@@ -483,35 +642,70 @@ void buf_clear_file(buf_T *buf)
buf->b_ml.ml_flags = ML_EMPTY; /* empty buffer */
}
-/*
- * buf_freeall() - free all things allocated for a buffer that are related to
- * the file. flags:
- * BFA_DEL buffer is going to be deleted
- * BFA_WIPE buffer is going to be wiped out
- * BFA_KEEP_UNDO do not free undo information
- */
+/// Clears the current buffer contents.
+void buf_clear(void)
+{
+ linenr_T line_count = curbuf->b_ml.ml_line_count;
+ while (!(curbuf->b_ml.ml_flags & ML_EMPTY)) {
+ ml_delete((linenr_T)1, false);
+ }
+ deleted_lines_mark(1, line_count); // prepare for display
+ ml_close(curbuf, true); // free memline_T
+ buf_clear_file(curbuf);
+}
+
+/// buf_freeall() - free all things allocated for a buffer that are related to
+/// the file. Careful: get here with "curwin" NULL when exiting.
+///
+/// @param flags BFA_DEL buffer is going to be deleted
+/// BFA_WIPE buffer is going to be wiped out
+/// BFA_KEEP_UNDO do not free undo information
void buf_freeall(buf_T *buf, int flags)
{
bool is_curbuf = (buf == curbuf);
+ int is_curwin = (curwin != NULL && curwin->w_buffer == buf);
+ win_T *the_curwin = curwin;
+ tabpage_T *the_curtab = curtab;
- buf->b_closing = true;
- apply_autocmds(EVENT_BUFUNLOAD, buf->b_fname, buf->b_fname, FALSE, buf);
- if (!buf_valid(buf)) /* autocommands may delete the buffer */
+ // Make sure the buffer isn't closed by autocommands.
+ buf->b_locked++;
+
+ bufref_T bufref;
+ set_bufref(&bufref, buf);
+
+ if ((buf->b_ml.ml_mfp != NULL)
+ && apply_autocmds(EVENT_BUFUNLOAD, buf->b_fname, buf->b_fname, false, buf)
+ && !bufref_valid(&bufref)) {
+ // Autocommands deleted the buffer.
return;
- if ((flags & BFA_DEL) && buf->b_p_bl) {
- apply_autocmds(EVENT_BUFDELETE, buf->b_fname, buf->b_fname, FALSE, buf);
- if (!buf_valid(buf)) /* autocommands may delete the buffer */
- return;
}
- if (flags & BFA_WIPE) {
- apply_autocmds(EVENT_BUFWIPEOUT, buf->b_fname, buf->b_fname,
- FALSE, buf);
- if (!buf_valid(buf)) /* autocommands may delete the buffer */
- return;
+ if ((flags & BFA_DEL)
+ && buf->b_p_bl
+ && apply_autocmds(EVENT_BUFDELETE, buf->b_fname, buf->b_fname, false, buf)
+ && !bufref_valid(&bufref)) {
+ // Autocommands may delete the buffer.
+ return;
}
- buf->b_closing = false;
- if (aborting()) /* autocmds may abort script processing */
+ if ((flags & BFA_WIPE)
+ && apply_autocmds(EVENT_BUFWIPEOUT, buf->b_fname, buf->b_fname, false,
+ buf)
+ && !bufref_valid(&bufref)) {
+ // Autocommands may delete the buffer.
return;
+ }
+ buf->b_locked--;
+
+ // If the buffer was in curwin and the window has changed, go back to that
+ // window, if it still exists. This avoids that ":edit x" triggering a
+ // "tabnext" BufUnload autocmd leaves a window behind without a buffer.
+ if (is_curwin && curwin != the_curwin && win_valid_any_tab(the_curwin)) {
+ block_autocmds();
+ goto_tabpage_win(the_curtab, the_curwin);
+ unblock_autocmds();
+ }
+ if (aborting()) { // autocmds may abort script processing
+ return;
+ }
/*
* It's possible that autocommands change curbuf to the one being deleted.
@@ -521,10 +715,11 @@ void buf_freeall(buf_T *buf, int flags)
*/
if (buf == curbuf && !is_curbuf)
return;
- diff_buf_delete(buf); /* Can't use 'diff' for unloaded buffer. */
- /* Remove any ownsyntax, unless exiting. */
- if (firstwin != NULL && curwin->w_buffer == buf)
+ diff_buf_delete(buf); // Can't use 'diff' for unloaded buffer.
+ // Remove any ownsyntax, unless exiting.
+ if (curwin != NULL && curwin->w_buffer == buf) {
reset_synblock(curwin);
+ }
/* No folds in an empty buffer. */
FOR_ALL_TAB_WINDOWS(tp, win) {
@@ -550,10 +745,11 @@ void buf_freeall(buf_T *buf, int flags)
static void free_buffer(buf_T *buf)
{
handle_unregister_buffer(buf);
- free_buffer_stuff(buf, TRUE);
+ buf_free_count++;
+ free_buffer_stuff(buf, true);
unref_var_dict(buf->b_vars);
aubuflocal_remove(buf);
- dict_unref(buf->additional_data);
+ tv_dict_unref(buf->additional_data);
clear_fmark(&buf->b_last_cursor);
clear_fmark(&buf->b_last_insert);
clear_fmark(&buf->b_last_change);
@@ -589,8 +785,18 @@ free_buffer_stuff (
free_buf_options(buf, true);
ga_clear(&buf->b_s.b_langp);
}
+ {
+ // Avoid loosing b:changedtick when deleting buffer: clearing variables
+ // implies using clear_tv() on b:changedtick and that sets changedtick to
+ // zero.
+ hashitem_T *const changedtick_hi = hash_find(
+ &buf->b_vars->dv_hashtab, (const char_u *)"changedtick");
+ assert(changedtick_hi != NULL);
+ hash_remove(&buf->b_vars->dv_hashtab, changedtick_hi);
+ }
vars_clear(&buf->b_vars->dv_hashtab); // free all internal variables
hash_init(&buf->b_vars->dv_hashtab);
+ buf_init_changedtick(buf);
uc_clear(&buf->b_ucmds); // clear local user commands
buf_delete_signs(buf); // delete any signs
bufhl_clear_all(buf); // delete any highligts
@@ -598,6 +804,8 @@ free_buffer_stuff (
map_clear_int(buf, MAP_ALL_MODES, true, true); // clear local abbrevs
xfree(buf->b_start_fenc);
buf->b_start_fenc = NULL;
+
+ buf_updates_unregister_all(buf);
}
/*
@@ -623,11 +831,13 @@ static void clear_wininfo(buf_T *buf)
*/
void goto_buffer(exarg_T *eap, int start, int dir, int count)
{
- (void)do_buffer(*eap->cmd == 's' ? DOBUF_SPLIT : DOBUF_GOTO,
- start, dir, count, eap->forceit);
- buf_T *old_curbuf = curbuf;
+ bufref_T old_curbuf;
+ set_bufref(&old_curbuf, curbuf);
swap_exists_action = SEA_DIALOG;
+ (void)do_buffer(*eap->cmd == 's' ? DOBUF_SPLIT : DOBUF_GOTO,
+ start, dir, count, eap->forceit);
+
if (swap_exists_action == SEA_QUIT && *eap->cmd == 's') {
cleanup_T cs;
@@ -635,8 +845,8 @@ void goto_buffer(exarg_T *eap, int start, int dir, int count)
* aborting() returns FALSE when closing a window. */
enter_cleanup(&cs);
- /* Quitting means closing the split window, nothing else. */
- win_close(curwin, TRUE);
+ // Quitting means closing the split window, nothing else.
+ win_close(curwin, true);
swap_exists_action = SEA_NONE;
swap_exists_did_quit = TRUE;
@@ -644,36 +854,52 @@ void goto_buffer(exarg_T *eap, int start, int dir, int count)
* new aborting error, interrupt, or uncaught exception. */
leave_cleanup(&cs);
} else {
- handle_swap_exists(old_curbuf);
+ handle_swap_exists(&old_curbuf);
}
}
-/*
- * Handle the situation of swap_exists_action being set.
- * It is allowed for "old_curbuf" to be NULL or invalid.
- */
-void handle_swap_exists(buf_T *old_curbuf)
+/// Handle the situation of swap_exists_action being set.
+///
+/// It is allowed for "old_curbuf" to be NULL or invalid.
+///
+/// @param old_curbuf The buffer to check for.
+void handle_swap_exists(bufref_T *old_curbuf)
{
cleanup_T cs;
long old_tw = curbuf->b_p_tw;
+ buf_T *buf;
if (swap_exists_action == SEA_QUIT) {
/* Reset the error/interrupt/exception state here so that
* aborting() returns FALSE when closing a buffer. */
enter_cleanup(&cs);
- /* User selected Quit at ATTENTION prompt. Go back to previous
- * buffer. If that buffer is gone or the same as the current one,
- * open a new, empty buffer. */
- swap_exists_action = SEA_NONE; /* don't want it again */
- swap_exists_did_quit = TRUE;
- close_buffer(curwin, curbuf, DOBUF_UNLOAD, FALSE);
- if (!buf_valid(old_curbuf) || old_curbuf == curbuf)
- old_curbuf = buflist_new(NULL, NULL, 1L, BLN_CURBUF | BLN_LISTED);
- if (old_curbuf != NULL) {
- enter_buffer(old_curbuf);
- if (old_tw != curbuf->b_p_tw)
+ // User selected Quit at ATTENTION prompt. Go back to previous
+ // buffer. If that buffer is gone or the same as the current one,
+ // open a new, empty buffer.
+ swap_exists_action = SEA_NONE; // don't want it again
+ swap_exists_did_quit = true;
+ close_buffer(curwin, curbuf, DOBUF_UNLOAD, false);
+ if (old_curbuf == NULL
+ || !bufref_valid(old_curbuf)
+ || old_curbuf->br_buf == curbuf) {
+ buf = buflist_new(NULL, NULL, 1L, BLN_CURBUF | BLN_LISTED);
+ } else {
+ buf = old_curbuf->br_buf;
+ }
+ if (buf != NULL) {
+ int old_msg_silent = msg_silent;
+
+ if (shortmess(SHM_FILEINFO)) {
+ msg_silent = 1; // prevent fileinfo message
+ }
+ enter_buffer(buf);
+ // restore msg_silent, so that the command line will be shown
+ msg_silent = old_msg_silent;
+
+ if (old_tw != curbuf->b_p_tw) {
check_colorcolumn(curwin);
+ }
}
/* If "old_curbuf" is NULL we are in big trouble here... */
@@ -696,7 +922,7 @@ void handle_swap_exists(buf_T *old_curbuf)
* new aborting error, interrupt, or uncaught exception. */
leave_cleanup(&cs);
}
- swap_exists_action = SEA_NONE;
+ swap_exists_action = SEA_NONE; // -V519
}
/*
@@ -824,6 +1050,9 @@ static int empty_curbuf(int close_others, int forceit, int action)
return FAIL;
}
+ bufref_T bufref;
+ set_bufref(&bufref, buf);
+
if (close_others) {
/* Close any other windows on this buffer, then make it empty. */
close_windows(buf, TRUE);
@@ -833,15 +1062,17 @@ static int empty_curbuf(int close_others, int forceit, int action)
retval = do_ecmd(0, NULL, NULL, NULL, ECMD_ONE,
forceit ? ECMD_FORCEIT : 0, curwin);
- /*
- * do_ecmd() may create a new buffer, then we have to delete
- * the old one. But do_ecmd() may have done that already, check
- * if the buffer still exists.
- */
- if (buf != curbuf && buf_valid(buf) && buf->b_nwindows == 0)
- close_buffer(NULL, buf, action, FALSE);
- if (!close_others)
- need_fileinfo = FALSE;
+ // do_ecmd() may create a new buffer, then we have to delete
+ // the old one. But do_ecmd() may have done that already, check
+ // if the buffer still exists.
+ if (buf != curbuf && bufref_valid(&bufref) && buf->b_nwindows == 0) {
+ close_buffer(NULL, buf, action, false);
+ }
+
+ if (!close_others) {
+ need_fileinfo = false;
+ }
+
return retval;
}
/*
@@ -943,6 +1174,8 @@ do_buffer (
*/
if (unload) {
int forward;
+ bufref_T bufref;
+ set_bufref(&bufref, buf);
/* When unloading or deleting a buffer that's already unloaded and
* unlisted: fail silently. */
@@ -951,28 +1184,41 @@ do_buffer (
if (!forceit && (buf->terminal || bufIsChanged(buf))) {
if ((p_confirm || cmdmod.confirm) && p_write && !buf->terminal) {
- dialog_changed(buf, FALSE);
- if (!buf_valid(buf))
- /* Autocommand deleted buffer, oops! It's not changed
- * now. */
+ dialog_changed(buf, false);
+ if (!bufref_valid(&bufref)) {
+ // Autocommand deleted buffer, oops! It's not changed now.
return FAIL;
- /* If it's still changed fail silently, the dialog already
- * mentioned why it fails. */
- if (bufIsChanged(buf))
+ }
+ // If it's still changed fail silently, the dialog already
+ // mentioned why it fails.
+ if (bufIsChanged(buf)) {
return FAIL;
+ }
} else {
if (buf->terminal) {
- EMSG2(_("E89: %s will be killed(add ! to override)"),
- (char *)buf->b_fname);
+ if (p_confirm || cmdmod.confirm) {
+ if (!dialog_close_terminal(buf)) {
+ return FAIL;
+ }
+ } else {
+ EMSG2(_("E89: %s will be killed(add ! to override)"),
+ (char *)buf->b_fname);
+ return FAIL;
+ }
} else {
EMSGN(_("E89: No write since last change for buffer %" PRId64
" (add ! to override)"),
buf->b_fnum);
+ return FAIL;
}
- return FAIL;
}
}
+ // When closing the current buffer stop Visual mode.
+ if (buf == curbuf && VIsual_active) {
+ end_visual_mode();
+ }
+
/*
* If deleting the last (listed) buffer, make it empty.
* The last (listed) buffer cannot be unloaded.
@@ -993,9 +1239,9 @@ do_buffer (
* a window with this buffer.
*/
while (buf == curbuf
- && !(curwin->w_closing || curwin->w_buffer->b_closing)
- && (firstwin != lastwin || first_tabpage->tp_next != NULL)) {
- if (win_close(curwin, FALSE) == FAIL)
+ && !(curwin->w_closing || curwin->w_buffer->b_locked > 0)
+ && (!ONE_WINDOW || first_tabpage->tp_next != NULL)) {
+ if (win_close(curwin, false) == FAIL)
break;
}
@@ -1003,27 +1249,26 @@ do_buffer (
* If the buffer to be deleted is not the current one, delete it here.
*/
if (buf != curbuf) {
- close_windows(buf, FALSE);
- if (buf != curbuf && buf_valid(buf) && buf->b_nwindows <= 0)
- close_buffer(NULL, buf, action, FALSE);
+ close_windows(buf, false);
+ if (buf != curbuf && bufref_valid(&bufref) && buf->b_nwindows <= 0) {
+ close_buffer(NULL, buf, action, false);
+ }
return OK;
}
- /*
- * Deleting the current buffer: Need to find another buffer to go to.
- * There should be another, otherwise it would have been handled
- * above. However, autocommands may have deleted all buffers.
- * First use au_new_curbuf, if it is valid.
- * Then prefer the buffer we most recently visited.
- * Else try to find one that is loaded, after the current buffer,
- * then before the current buffer.
- * Finally use any buffer.
- */
- buf = NULL; /* selected buffer */
- bp = NULL; /* used when no loaded buffer found */
- if (au_new_curbuf != NULL && buf_valid(au_new_curbuf))
- buf = au_new_curbuf;
- else if (curwin->w_jumplistlen > 0) {
+ // Deleting the current buffer: Need to find another buffer to go to.
+ // There should be another, otherwise it would have been handled
+ // above. However, autocommands may have deleted all buffers.
+ // First use au_new_curbuf.br_buf, if it is valid.
+ // Then prefer the buffer we most recently visited.
+ // Else try to find one that is loaded, after the current buffer,
+ // then before the current buffer.
+ // Finally use any buffer.
+ buf = NULL; // Selected buffer.
+ bp = NULL; // Used when no loaded buffer found.
+ if (au_new_curbuf.br_buf != NULL && bufref_valid(&au_new_curbuf)) {
+ buf = au_new_curbuf.br_buf;
+ } else if (curwin->w_jumplistlen > 0) {
int jumpidx;
jumpidx = curwin->w_jumplistidx - 1;
@@ -1128,10 +1373,13 @@ do_buffer (
*/
if (action == DOBUF_GOTO && !can_abandon(curbuf, forceit)) {
if ((p_confirm || cmdmod.confirm) && p_write) {
- dialog_changed(curbuf, FALSE);
- if (!buf_valid(buf))
- /* Autocommand deleted buffer, oops! */
+ bufref_T bufref;
+ set_bufref(&bufref, buf);
+ dialog_changed(curbuf, false);
+ if (!bufref_valid(&bufref)) {
+ // Autocommand deleted buffer, oops!
return FAIL;
+ }
}
if (bufIsChanged(curbuf)) {
EMSG(_(e_nowrtmsg));
@@ -1177,27 +1425,40 @@ void set_curbuf(buf_T *buf, int action)
/* Don't restart Select mode after switching to another buffer. */
VIsual_reselect = FALSE;
- /* close_windows() or apply_autocmds() may change curbuf */
+ // close_windows() or apply_autocmds() may change curbuf and wipe out "buf"
prevbuf = curbuf;
-
- apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf);
- if (buf_valid(prevbuf) && !aborting()) {
- if (prevbuf == curwin->w_buffer)
+ bufref_T newbufref;
+ bufref_T prevbufref;
+ set_bufref(&prevbufref, prevbuf);
+ set_bufref(&newbufref, buf);
+
+ // Autocommands may delete the curren buffer and/or the buffer we wan to go
+ // to. In those cases don't close the buffer.
+ if (!apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, false, curbuf)
+ || (bufref_valid(&prevbufref) && bufref_valid(&newbufref)
+ && !aborting())) {
+ if (prevbuf == curwin->w_buffer) {
reset_synblock(curwin);
- if (unload)
- close_windows(prevbuf, FALSE);
- if (buf_valid(prevbuf) && !aborting()) {
+ }
+ if (unload) {
+ close_windows(prevbuf, false);
+ }
+ if (bufref_valid(&prevbufref) && !aborting()) {
win_T *previouswin = curwin;
- if (prevbuf == curbuf)
- u_sync(FALSE);
- close_buffer(prevbuf == curwin->w_buffer ? curwin : NULL, prevbuf,
- unload ? action : (action == DOBUF_GOTO
- && !P_HID(prevbuf)
- && !bufIsChanged(
- prevbuf)) ? DOBUF_UNLOAD : 0, FALSE);
- if (curwin != previouswin && win_valid(previouswin))
- /* autocommands changed curwin, Grr! */
+ if (prevbuf == curbuf) {
+ u_sync(false);
+ }
+ close_buffer(prevbuf == curwin->w_buffer ? curwin : NULL,
+ prevbuf,
+ unload
+ ? action
+ : (action == DOBUF_GOTO && !buf_hide(prevbuf)
+ && !bufIsChanged(prevbuf)) ? DOBUF_UNLOAD : 0,
+ false);
+ if (curwin != previouswin && win_valid(previouswin)) {
+ // autocommands changed curwin, Grr!
curwin = previouswin;
+ }
}
}
/* An autocommand may have deleted "buf", already entered it (e.g., when
@@ -1249,10 +1510,6 @@ void enter_buffer(buf_T *buf)
/* mark cursor position as being invalid */
curwin->w_valid = 0;
- if (buf->terminal) {
- terminal_resize(buf->terminal, curwin->w_width, curwin->w_height);
- }
-
/* Make sure the buffer is loaded. */
if (curbuf->b_ml.ml_mfp == NULL) { /* need to load the file */
/* If there is no filetype, allow for detecting one. Esp. useful for
@@ -1310,32 +1567,55 @@ void do_autochdir(void)
}
}
-/*
- * functions for dealing with the buffer list
- */
+//
+// functions for dealing with the buffer list
+//
-/*
- * Add a file name to the buffer list. Return a pointer to the buffer.
- * If the same file name already exists return a pointer to that buffer.
- * If it does not exist, or if fname == NULL, a new entry is created.
- * If (flags & BLN_CURBUF) is TRUE, may use current buffer.
- * If (flags & BLN_LISTED) is TRUE, add new buffer to buffer list.
- * If (flags & BLN_DUMMY) is TRUE, don't count it as a real buffer.
- * This is the ONLY way to create a new buffer.
- */
-static int top_file_num = 1; /* highest file number */
-
-buf_T *
-buflist_new (
- char_u *ffname, /* full path of fname or relative */
- char_u *sfname, /* short fname or NULL */
- linenr_T lnum, /* preferred cursor line */
- int flags /* BLN_ defines */
-)
+static int top_file_num = 1; ///< highest file number
+
+/// Initialize b:changedtick and changedtick_val attribute
+///
+/// @param[out] buf Buffer to intialize for.
+static inline void buf_init_changedtick(buf_T *const buf)
+ FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_NONNULL_ALL
+{
+ STATIC_ASSERT(sizeof("changedtick") <= sizeof(buf->changedtick_di.di_key),
+ "buf->changedtick_di cannot hold large enough keys");
+ buf->changedtick_di = (ChangedtickDictItem) {
+ .di_flags = DI_FLAGS_RO|DI_FLAGS_FIX, // Must not include DI_FLAGS_ALLOC.
+ .di_tv = (typval_T) {
+ .v_type = VAR_NUMBER,
+ .v_lock = VAR_FIXED,
+ .vval.v_number = buf_get_changedtick(buf),
+ },
+ .di_key = "changedtick",
+ };
+ tv_dict_add(buf->b_vars, (dictitem_T *)&buf->changedtick_di);
+}
+
+/// Add a file name to the buffer list.
+/// If the same file name already exists return a pointer to that buffer.
+/// If it does not exist, or if fname == NULL, a new entry is created.
+/// If (flags & BLN_CURBUF) is TRUE, may use current buffer.
+/// If (flags & BLN_LISTED) is TRUE, add new buffer to buffer list.
+/// If (flags & BLN_DUMMY) is TRUE, don't count it as a real buffer.
+/// If (flags & BLN_NEW) is TRUE, don't use an existing buffer.
+/// If (flags & BLN_NOOPT) is TRUE, don't copy options from the current buffer
+/// if the buffer already exists.
+/// This is the ONLY way to create a new buffer.
+///
+/// @param ffname full path of fname or relative
+/// @param sfname short fname or NULL
+/// @param lnum preferred cursor line
+/// @param flags BLN_ defines
+/// @param bufnr
+///
+/// @return pointer to the buffer
+buf_T * buflist_new(char_u *ffname, char_u *sfname, linenr_T lnum, int flags)
{
buf_T *buf;
- fname_expand(curbuf, &ffname, &sfname); /* will allocate ffname */
+ fname_expand(curbuf, &ffname, &sfname); // will allocate ffname
/*
* If file name already exists in the list, update the entry.
@@ -1349,16 +1629,20 @@ buflist_new (
&& (buf = buflist_findname_file_id(ffname, &file_id,
file_id_valid)) != NULL) {
xfree(ffname);
- if (lnum != 0)
- buflist_setfpos(buf, curwin, lnum, (colnr_T)0, FALSE);
- /* copy the options now, if 'cpo' doesn't have 's' and not done
- * already */
- buf_copy_options(buf, 0);
+ if (lnum != 0) {
+ buflist_setfpos(buf, curwin, lnum, (colnr_T)0, false);
+ }
+ if ((flags & BLN_NOOPT) == 0) {
+ // Copy the options now, if 'cpo' doesn't have 's' and not done already.
+ buf_copy_options(buf, 0);
+ }
if ((flags & BLN_LISTED) && !buf->b_p_bl) {
- buf->b_p_bl = TRUE;
+ buf->b_p_bl = true;
+ bufref_T bufref;
+ set_bufref(&bufref, buf);
if (!(flags & BLN_DUMMY)) {
- apply_autocmds(EVENT_BUFADD, NULL, NULL, FALSE, buf);
- if (!buf_valid(buf)) {
+ if (apply_autocmds(EVENT_BUFADD, NULL, NULL, false, buf)
+ && !bufref_valid(&bufref)) {
return NULL;
}
}
@@ -1379,7 +1663,7 @@ buflist_new (
&& curbuf != NULL
&& curbuf->b_ffname == NULL
&& curbuf->b_nwindows <= 1
- && (curbuf->b_ml.ml_mfp == NULL || bufempty())) {
+ && (curbuf->b_ml.ml_mfp == NULL || BUFEMPTY())) {
buf = curbuf;
/* It's like this buffer is deleted. Watch out for autocommands that
* change curbuf! If that happens, allocate a new buffer anyway. */
@@ -1397,10 +1681,10 @@ buflist_new (
}
if (buf != curbuf || curbuf == NULL) {
buf = xcalloc(1, sizeof(buf_T));
- handle_register_buffer(buf);
- /* init b: variables */
- buf->b_vars = dict_alloc();
+ // init b: variables
+ buf->b_vars = tv_dict_alloc();
init_var_dict(buf->b_vars, &buf->b_bufvar, VAR_SCOPE);
+ buf_init_changedtick(buf);
}
if (ffname != NULL) {
@@ -1451,11 +1735,12 @@ buflist_new (
lastbuf = buf;
buf->b_fnum = top_file_num++;
- if (top_file_num < 0) { /* wrap around (may cause duplicates) */
+ handle_register_buffer(buf);
+ if (top_file_num < 0) { // wrap around (may cause duplicates)
EMSG(_("W14: Warning: List of file names overflow"));
if (emsg_silent == 0) {
ui_flush();
- os_delay(3000L, true); /* make sure it is noticed */
+ os_delay(3000L, true); // make sure it is noticed
}
top_file_num = 1;
}
@@ -1484,25 +1769,30 @@ buflist_new (
if (flags & BLN_DUMMY)
buf->b_flags |= BF_DUMMY;
buf_clear_file(buf);
- clrallmarks(buf); /* clear marks */
- fmarks_check_names(buf); /* check file marks for this file */
- buf->b_p_bl = (flags & BLN_LISTED) ? TRUE : FALSE; /* init 'buflisted' */
+ clrallmarks(buf); // clear marks
+ fmarks_check_names(buf); // check file marks for this file
+ buf->b_p_bl = (flags & BLN_LISTED) ? true : false; // init 'buflisted'
+ kv_destroy(buf->update_channels);
+ kv_init(buf->update_channels);
if (!(flags & BLN_DUMMY)) {
// Tricky: these autocommands may change the buffer list. They could also
// split the window with re-using the one empty buffer. This may result in
// unexpectedly losing the empty buffer.
- apply_autocmds(EVENT_BUFNEW, NULL, NULL, FALSE, buf);
- if (!buf_valid(buf)) {
+ bufref_T bufref;
+ set_bufref(&bufref, buf);
+ if (apply_autocmds(EVENT_BUFNEW, NULL, NULL, false, buf)
+ && !bufref_valid(&bufref)) {
return NULL;
}
- if (flags & BLN_LISTED) {
- apply_autocmds(EVENT_BUFADD, NULL, NULL, FALSE, buf);
- if (!buf_valid(buf)) {
- return NULL;
- }
+ if ((flags & BLN_LISTED)
+ && apply_autocmds(EVENT_BUFADD, NULL, NULL, false, buf)
+ && !bufref_valid(&bufref)) {
+ return NULL;
}
- if (aborting()) /* autocmds may abort script processing */
+ if (aborting()) {
+ // Autocmds may abort script processing.
return NULL;
+ }
}
return buf;
@@ -1526,6 +1816,7 @@ void free_buf_options(buf_T *buf, int free_p_ff)
clear_string_option(&buf->b_p_inex);
clear_string_option(&buf->b_p_inde);
clear_string_option(&buf->b_p_indk);
+ clear_string_option(&buf->b_p_fp);
clear_string_option(&buf->b_p_fex);
clear_string_option(&buf->b_p_kp);
clear_string_option(&buf->b_p_mps);
@@ -1533,6 +1824,7 @@ void free_buf_options(buf_T *buf, int free_p_ff)
clear_string_option(&buf->b_p_flp);
clear_string_option(&buf->b_p_isk);
clear_string_option(&buf->b_p_keymap);
+ keymap_ga_clear(&buf->b_kmap_ga);
ga_clear(&buf->b_kmap_ga);
clear_string_option(&buf->b_p_com);
clear_string_option(&buf->b_p_cms);
@@ -1566,18 +1858,18 @@ void free_buf_options(buf_T *buf, int free_p_ff)
buf->b_p_ul = NO_LOCAL_UNDOLEVEL;
clear_string_option(&buf->b_p_lw);
clear_string_option(&buf->b_p_bkc);
+ clear_string_option(&buf->b_p_menc);
}
-/*
- * get alternate file n
- * set linenr to lnum or altfpos.lnum if lnum == 0
- * also set cursor column to altfpos.col if 'startofline' is not set.
- * if (options & GETF_SETMARK) call setpcmark()
- * if (options & GETF_ALT) we are jumping to an alternate file.
- * if (options & GETF_SWITCH) respect 'switchbuf' settings when jumping
- *
- * return FAIL for failure, OK for success
- */
+
+/// Get alternate file "n".
+/// Set linenr to "lnum" or altfpos.lnum if "lnum" == 0.
+/// Also set cursor column to altfpos.col if 'startofline' is not set.
+/// if (options & GETF_SETMARK) call setpcmark()
+/// if (options & GETF_ALT) we are jumping to an alternate file.
+/// if (options & GETF_SWITCH) respect 'switchbuf' settings when jumping
+///
+/// Return FAIL for failure, OK for success.
int buflist_getfile(int n, linenr_T lnum, int options, int forceit)
{
buf_T *buf;
@@ -1629,7 +1921,7 @@ int buflist_getfile(int n, linenr_T lnum, int options, int forceit)
// If 'switchbuf' contains "split", "vsplit" or "newtab" and the
// current buffer isn't empty: open new tab or window
if (wp == NULL && (swb_flags & (SWB_VSPLIT | SWB_SPLIT | SWB_NEWTAB))
- && !bufempty()) {
+ && !BUFEMPTY()) {
if (swb_flags & SWB_NEWTAB) {
tabpage_new();
} else if (win_split(0, (swb_flags & SWB_VSPLIT) ? WSP_VERT : 0)
@@ -1640,10 +1932,10 @@ int buflist_getfile(int n, linenr_T lnum, int options, int forceit)
}
}
- ++RedrawingDisabled;
- if (getfile(buf->b_fnum, NULL, NULL, (options & GETF_SETMARK),
- lnum, forceit) <= 0) {
- --RedrawingDisabled;
+ RedrawingDisabled++;
+ if (GETFILE_SUCCESS(getfile(buf->b_fnum, NULL, NULL,
+ (options & GETF_SETMARK), lnum, forceit))) {
+ RedrawingDisabled--;
/* cursor is at to BOL and w_cursor.lnum is checked due to getfile() */
if (!p_sol && col != 0) {
@@ -1654,13 +1946,11 @@ int buflist_getfile(int n, linenr_T lnum, int options, int forceit)
}
return OK;
}
- --RedrawingDisabled;
+ RedrawingDisabled--;
return FAIL;
}
-/*
- * go to the last know line number for the current buffer
- */
+// Go to the last known line number for the current buffer.
void buflist_getfpos(void)
{
pos_T *fpos;
@@ -1725,7 +2015,8 @@ buf_T *buflist_findname(char_u *ffname)
static buf_T *buflist_findname_file_id(char_u *ffname, FileID *file_id,
bool file_id_valid)
{
- FOR_ALL_BUFFERS(buf) {
+ // Start at the last buffer, expect to find a match sooner.
+ FOR_ALL_BUFFERS_BACKWARDS(buf) {
if ((buf->b_flags & BF_DUMMY) == 0
&& !otherfile_buf(buf, ffname, file_id, file_id_valid)) {
return buf;
@@ -1799,7 +2090,7 @@ int buflist_findpat(
return -1;
}
- FOR_ALL_BUFFERS(buf) {
+ FOR_ALL_BUFFERS_BACKWARDS(buf) {
if (buf->b_p_bl == find_listed
&& (!diffmode || diff_mode_buf(buf))
&& buflist_match(&regmatch, buf, false) != NULL) {
@@ -1913,7 +2204,7 @@ int ExpandBufnames(char_u *pat, int *num_file, char_u ***file, int options)
if (count == 0) /* no match found, break here */
break;
if (round == 1) {
- *file = xmalloc(count * sizeof(**file));
+ *file = xmalloc((size_t)count * sizeof(**file));
}
}
vim_regfree(regmatch.regprog);
@@ -1968,21 +2259,14 @@ static char_u *fname_match(regmatch_T *rmp, char_u *name, bool ignore_case)
return match;
}
-/*
- * find file in buffer list by number
- */
+/// Find a file in the buffer list by buffer number.
buf_T *buflist_findnr(int nr)
{
if (nr == 0) {
nr = curwin->w_alt_fnum;
}
- FOR_ALL_BUFFERS(buf) {
- if (buf->b_fnum == nr) {
- return buf;
- }
- }
- return NULL;
+ return handle_get_buffer((handle_T)nr);
}
/*
@@ -2128,8 +2412,15 @@ void get_winopts(buf_T *buf)
clear_winopt(&curwin->w_onebuf_opt);
clearFolding(curwin);
- wip = find_wininfo(buf, TRUE);
- if (wip != NULL && wip->wi_optset) {
+ wip = find_wininfo(buf, true);
+ if (wip != NULL && wip->wi_win != curwin && wip->wi_win != NULL
+ && wip->wi_win->w_buffer == buf) {
+ win_T *wp = wip->wi_win;
+ copy_winopt(&wp->w_onebuf_opt, &curwin->w_onebuf_opt);
+ curwin->w_fold_manual = wp->w_fold_manual;
+ curwin->w_foldinvalid = true;
+ cloneFoldGrowArray(&wp->w_folds, &curwin->w_folds);
+ } else if (wip != NULL && wip->wi_optset) {
copy_winopt(&wip->wi_opt, &curwin->w_onebuf_opt);
curwin->w_fold_manual = wip->wi_fold_manual;
curwin->w_foldinvalid = true;
@@ -2140,7 +2431,7 @@ void get_winopts(buf_T *buf)
/* Set 'foldlevel' to 'foldlevelstart' if it's not negative. */
if (p_fdls >= 0)
curwin->w_p_fdl = p_fdls;
- check_colorcolumn(curwin);
+ didset_window_options(curwin);
}
/*
@@ -2164,9 +2455,7 @@ linenr_T buflist_findlnum(buf_T *buf)
return buflist_findfpos(buf)->lnum;
}
-/*
- * List all know file names (for :files and :buffers command).
- */
+// List all known file names (for :files and :buffers command).
void buflist_list(exarg_T *eap)
{
buf_T *buf;
@@ -2191,12 +2480,17 @@ void buflist_list(exarg_T *eap)
&& (buf == curbuf || curwin->w_alt_fnum != buf->b_fnum))) {
continue;
}
- msg_putchar('\n');
- if (buf_spname(buf) != NULL)
+ if (buf_spname(buf) != NULL) {
STRLCPY(NameBuff, buf_spname(buf), MAXPATHL);
- else
- home_replace(buf, buf->b_fname, NameBuff, MAXPATHL, TRUE);
+ } else {
+ home_replace(buf, buf->b_fname, NameBuff, MAXPATHL, true);
+ }
+ if (message_filtered(NameBuff)) {
+ continue;
+ }
+
+ msg_putchar('\n');
len = vim_snprintf((char *)IObuff, IOSIZE - 20, "%3d%c%c%c%c%c \"%s\"",
buf->b_fnum,
buf->b_p_bl ? ' ' : 'u',
@@ -2365,10 +2659,11 @@ buf_T *setaltfname(char_u *ffname, char_u *sfname, linenr_T lnum)
{
buf_T *buf;
- /* Create a buffer. 'buflisted' is not set if it's a new buffer */
+ // Create a buffer. 'buflisted' is not set if it's a new buffer
buf = buflist_new(ffname, sfname, lnum, 0);
- if (buf != NULL && !cmdmod.keepalt)
+ if (buf != NULL && !cmdmod.keepalt) {
curwin->w_alt_fnum = buf->b_fnum;
+ }
return buf;
}
@@ -2376,9 +2671,8 @@ buf_T *setaltfname(char_u *ffname, char_u *sfname, linenr_T lnum)
* Get alternate file name for current window.
* Return NULL if there isn't any, and give error message if requested.
*/
-char_u *
-getaltfname (
- int errmsg /* give error message */
+char_u * getaltfname(
+ bool errmsg // give error message
)
{
char_u *fname;
@@ -2403,8 +2697,9 @@ int buflist_add(char_u *fname, int flags)
buf_T *buf;
buf = buflist_new(fname, NULL, (linenr_T)0, flags);
- if (buf != NULL)
+ if (buf != NULL) {
return buf->b_fnum;
+ }
return 0;
}
@@ -2434,7 +2729,7 @@ void buflist_altfpos(win_T *win)
}
/// Check that "ffname" is not the same file as current file.
-/// Fname must have a full path (expanded by path_get_absolute_path()).
+/// Fname must have a full path (expanded by path_to_absolute()).
///
/// @param ffname full path name to check
bool otherfile(char_u *ffname)
@@ -2444,7 +2739,7 @@ bool otherfile(char_u *ffname)
}
/// Check that "ffname" is not the same file as the file loaded in "buf".
-/// Fname must have a full path (expanded by path_get_absolute_path()).
+/// Fname must have a full path (expanded by path_to_absolute()).
///
/// @param buf buffer to check
/// @param ffname full path name to check
@@ -2548,7 +2843,7 @@ fileinfo (
else
name = curbuf->b_ffname;
home_replace(shorthelp ? curbuf : NULL, name, p,
- (int)(IOSIZE - (p - buffer)), TRUE);
+ (size_t)(IOSIZE - (p - buffer)), true);
}
vim_snprintf_add((char *)buffer, IOSIZE, "\"%s%s%s%s%s%s",
@@ -2636,15 +2931,13 @@ static char_u *lasticon = NULL;
void maketitle(void)
{
- char_u *p;
char_u *t_str = NULL;
char_u *i_name;
char_u *i_str = NULL;
int maxlen = 0;
int len;
int mustset;
- char_u buf[IOSIZE];
- int off;
+ char buf[IOSIZE];
if (!redrawing()) {
/* Postpone updating the title when 'lazyredraw' is set. */
@@ -2658,102 +2951,123 @@ void maketitle(void)
if (p_title) {
if (p_titlelen > 0) {
- maxlen = p_titlelen * Columns / 100;
- if (maxlen < 10)
+ maxlen = (int)(p_titlelen * Columns / 100);
+ if (maxlen < 10) {
maxlen = 10;
+ }
}
- t_str = buf;
if (*p_titlestring != NUL) {
if (stl_syntax & STL_IN_TITLE) {
int use_sandbox = FALSE;
int save_called_emsg = called_emsg;
use_sandbox = was_set_insecurely((char_u *)"titlestring", 0);
- called_emsg = FALSE;
- build_stl_str_hl(curwin, t_str, sizeof(buf),
- p_titlestring, use_sandbox,
- 0, maxlen, NULL, NULL);
- if (called_emsg)
- set_string_option_direct((char_u *)"titlestring", -1,
- (char_u *)"", OPT_FREE, SID_ERROR);
+ called_emsg = false;
+ build_stl_str_hl(curwin, (char_u *)buf, sizeof(buf),
+ p_titlestring, use_sandbox,
+ 0, maxlen, NULL, NULL);
+ t_str = (char_u *)buf;
+ if (called_emsg) {
+ set_string_option_direct((char_u *)"titlestring", -1, (char_u *)"",
+ OPT_FREE, SID_ERROR);
+ }
called_emsg |= save_called_emsg;
- } else
+ } else {
t_str = p_titlestring;
+ }
} else {
- /* format: "fname + (path) (1 of 2) - VIM" */
-
-#define SPACE_FOR_FNAME (IOSIZE - 100)
-#define SPACE_FOR_DIR (IOSIZE - 20)
-#define SPACE_FOR_ARGNR (IOSIZE - 10) /* at least room for " - VIM" */
- if (curbuf->b_fname == NULL)
- STRLCPY(buf, _("[No Name]"), SPACE_FOR_FNAME + 1);
- else {
- p = transstr(path_tail(curbuf->b_fname));
- STRLCPY(buf, p, SPACE_FOR_FNAME + 1);
- xfree(p);
+ // Format: "fname + (path) (1 of 2) - VIM".
+
+#define SPACE_FOR_FNAME (sizeof(buf) - 100)
+#define SPACE_FOR_DIR (sizeof(buf) - 20)
+#define SPACE_FOR_ARGNR (sizeof(buf) - 10) // At least room for " - NVIM".
+ char *buf_p = buf;
+ if (curbuf->b_fname == NULL) {
+ const size_t size = xstrlcpy(buf_p, _("[No Name]"),
+ SPACE_FOR_FNAME + 1);
+ buf_p += MIN(size, SPACE_FOR_FNAME);
+ } else {
+ buf_p += transstr_buf((const char *)path_tail(curbuf->b_fname),
+ buf_p, SPACE_FOR_FNAME + 1);
}
switch (bufIsChanged(curbuf)
- + (curbuf->b_p_ro * 2)
- + (!MODIFIABLE(curbuf) * 4)) {
- case 1: STRCAT(buf, " +"); break;
- case 2: STRCAT(buf, " ="); break;
- case 3: STRCAT(buf, " =+"); break;
- case 4:
- case 6: STRCAT(buf, " -"); break;
- case 5:
- case 7: STRCAT(buf, " -+"); break;
+ | (curbuf->b_p_ro << 1)
+ | (!MODIFIABLE(curbuf) << 2)) {
+ case 0: break;
+ case 1: buf_p = strappend(buf_p, " +"); break;
+ case 2: buf_p = strappend(buf_p, " ="); break;
+ case 3: buf_p = strappend(buf_p, " =+"); break;
+ case 4:
+ case 6: buf_p = strappend(buf_p, " -"); break;
+ case 5:
+ case 7: buf_p = strappend(buf_p, " -+"); break;
+ default: assert(false);
}
if (curbuf->b_fname != NULL) {
- /* Get path of file, replace home dir with ~ */
- off = (int)STRLEN(buf);
- buf[off++] = ' ';
- buf[off++] = '(';
- home_replace(curbuf, curbuf->b_ffname,
- buf + off, SPACE_FOR_DIR - off, TRUE);
+ // Get path of file, replace home dir with ~.
+ *buf_p++ = ' ';
+ *buf_p++ = '(';
+ home_replace(curbuf, curbuf->b_ffname, (char_u *)buf_p,
+ (SPACE_FOR_DIR - (size_t)(buf_p - buf)), true);
#ifdef BACKSLASH_IN_FILENAME
- /* avoid "c:/name" to be reduced to "c" */
- if (isalpha(buf[off]) && buf[off + 1] == ':')
- off += 2;
+ // Avoid "c:/name" to be reduced to "c".
+ if (isalpha((uint8_t)buf_p) && *(buf_p + 1) == ':') {
+ buf_p += 2;
+ }
#endif
- /* remove the file name */
- p = path_tail_with_sep(buf + off);
- if (p == buf + off)
- /* must be a help buffer */
- STRLCPY(buf + off, _("help"), SPACE_FOR_DIR - off);
- else
+ // Remove the file name.
+ char *p = (char *)path_tail_with_sep((char_u *)buf_p);
+ if (p == buf_p) {
+ // Must be a help buffer.
+ xstrlcpy(buf_p, _("help"), SPACE_FOR_DIR - (size_t)(buf_p - buf));
+ } else {
*p = NUL;
+ }
- /* Translate unprintable chars and concatenate. Keep some
- * room for the server name. When there is no room (very long
- * file name) use (...). */
- if (off < SPACE_FOR_DIR) {
- p = transstr(buf + off);
- STRLCPY(buf + off, p, SPACE_FOR_DIR - off + 1);
- xfree(p);
+ // Translate unprintable chars and concatenate. Keep some
+ // room for the server name. When there is no room (very long
+ // file name) use (...).
+ if ((size_t)(buf_p - buf) < SPACE_FOR_DIR) {
+ char *const tbuf = transstr(buf_p);
+ const size_t free_space = SPACE_FOR_DIR - (size_t)(buf_p - buf) + 1;
+ const size_t dir_len = xstrlcpy(buf_p, tbuf, free_space);
+ buf_p += MIN(dir_len, free_space - 1);
+ xfree(tbuf);
} else {
- STRLCPY(buf + off, "...", SPACE_FOR_ARGNR - off + 1);
+ const size_t free_space = SPACE_FOR_ARGNR - (size_t)(buf_p - buf) + 1;
+ const size_t dots_len = xstrlcpy(buf_p, "...", free_space);
+ buf_p += MIN(dots_len, free_space - 1);
}
- STRCAT(buf, ")");
+ *buf_p++ = ')';
+ *buf_p = NUL;
+ } else {
+ *buf_p = NUL;
}
- append_arg_number(curwin, buf, SPACE_FOR_ARGNR, FALSE);
+ append_arg_number(curwin, (char_u *)buf_p,
+ (int)(SPACE_FOR_ARGNR - (size_t)(buf_p - buf)), false);
- STRCAT(buf, " - NVIM");
+ xstrlcat(buf_p, " - NVIM", (sizeof(buf) - (size_t)(buf_p - buf)));
if (maxlen > 0) {
- /* make it shorter by removing a bit in the middle */
- if (vim_strsize(buf) > maxlen)
- trunc_string(buf, buf, maxlen, IOSIZE);
+ // Make it shorter by removing a bit in the middle.
+ if (vim_strsize((char_u *)buf) > maxlen) {
+ trunc_string((char_u *)buf, (char_u *)buf, maxlen, sizeof(buf));
+ }
}
+ t_str = (char_u *)buf;
+#undef SPACE_FOR_FNAME
+#undef SPACE_FOR_DIR
+#undef SPACE_FOR_ARGNR
}
}
mustset = ti_change(t_str, &lasttitle);
if (p_icon) {
- i_str = buf;
+ i_str = (char_u *)buf;
if (*p_iconstring != NUL) {
if (stl_syntax & STL_IN_ICON) {
int use_sandbox = FALSE;
@@ -2819,13 +3133,13 @@ static bool ti_change(char_u *str, char_u **last)
return false;
}
-/*
- * Put current window title back (used after calling a shell)
- */
+
+/// Set current window title
void resettitle(void)
{
- ui_set_title((char *)lasttitle);
- ui_set_icon((char *)lasticon);
+ ui_call_set_icon(cstr_as_string((char *)lasticon));
+ ui_call_set_title(cstr_as_string((char *)lasttitle));
+ ui_flush();
}
# if defined(EXITFREE)
@@ -2841,7 +3155,6 @@ void free_titles(void)
/// be used when printing numbers in the status line.
typedef enum {
kNumBaseDecimal = 10,
- kNumBaseOctal = 8,
kNumBaseHexadecimal = 16
} NumberBase;
@@ -2877,13 +3190,13 @@ int build_stl_str_hl(
size_t outlen,
char_u *fmt,
int use_sandbox,
- int fillchar,
+ char_u fillchar,
int maxwidth,
struct stl_hlrec *hltab,
StlClickRecord *tabtab
)
{
- int groupitem[STL_MAX_ITEM];
+ int groupitems[STL_MAX_ITEM];
struct stl_item {
// Where the item starts in the status line output buffer
char_u *start;
@@ -2903,7 +3216,7 @@ int build_stl_str_hl(
ClickFunc,
Trunc
} type;
- } item[STL_MAX_ITEM];
+ } items[STL_MAX_ITEM];
#define TMPLEN 70
char_u tmp[TMPLEN];
char_u *usefmt = fmt;
@@ -2929,10 +3242,11 @@ int build_stl_str_hl(
// Get the byte value now, in case we need it below. This is more
// efficient than making a copy of the line.
int byteval;
- if (wp->w_cursor.col > (colnr_T)STRLEN(line_ptr))
+ if (wp->w_cursor.col > (colnr_T)STRLEN(line_ptr)) {
byteval = 0;
- else
- byteval = (*mb_ptr2char)(line_ptr + wp->w_cursor.col);
+ } else {
+ byteval = utf_ptr2char(line_ptr + wp->w_cursor.col);
+ }
int groupdepth = 0;
@@ -2990,9 +3304,6 @@ int build_stl_str_hl(
// Two `%` in a row is the escape sequence to print a
// single `%` in the output buffer.
if (*fmt_p == '%') {
- // Ignore the character if we're out of room in the output buffer.
- if (out_p >= out_end_p)
- break;
*out_p++ = *fmt_p++;
prevchar_isflag = prevchar_isitem = false;
continue;
@@ -3005,16 +3316,16 @@ int build_stl_str_hl(
if (groupdepth > 0) {
continue;
}
- item[curitem].type = Separate;
- item[curitem++].start = out_p;
+ items[curitem].type = Separate;
+ items[curitem++].start = out_p;
continue;
}
// STL_TRUNCMARK: Where to begin truncating if the statusline is too long.
if (*fmt_p == STL_TRUNCMARK) {
fmt_p++;
- item[curitem].type = Trunc;
- item[curitem++].start = out_p;
+ items[curitem].type = Trunc;
+ items[curitem++].start = out_p;
continue;
}
@@ -3030,7 +3341,7 @@ int build_stl_str_hl(
// Determine how long the group is.
// Note: We set the current output position to null
// so `vim_strsize` will work.
- char_u *t = item[groupitem[groupdepth]].start;
+ char_u *t = items[groupitems[groupdepth]].start;
*out_p = NUL;
long group_len = vim_strsize(t);
@@ -3040,11 +3351,11 @@ int build_stl_str_hl(
// move the output pointer back to where the group started.
// Note: This erases any non-item characters that were in the group.
// Otherwise there would be no reason to do this step.
- if (curitem > groupitem[groupdepth] + 1
- && item[groupitem[groupdepth]].minwid == 0) {
+ if (curitem > groupitems[groupdepth] + 1
+ && items[groupitems[groupdepth]].minwid == 0) {
bool has_normal_items = false;
- for (long n = groupitem[groupdepth] + 1; n < curitem; n++) {
- if (item[n].type == Normal || item[n].type == Highlight) {
+ for (long n = groupitems[groupdepth] + 1; n < curitem; n++) {
+ if (items[n].type == Normal || items[n].type == Highlight) {
has_normal_items = true;
break;
}
@@ -3058,18 +3369,18 @@ int build_stl_str_hl(
// If the group is longer than it is allowed to be
// truncate by removing bytes from the start of the group text.
- if (group_len > item[groupitem[groupdepth]].maxwid) {
+ if (group_len > items[groupitems[groupdepth]].maxwid) {
// { Determine the number of bytes to remove
long n;
if (has_mbyte) {
/* Find the first character that should be included. */
n = 0;
- while (group_len >= item[groupitem[groupdepth]].maxwid) {
+ while (group_len >= items[groupitems[groupdepth]].maxwid) {
group_len -= ptr2cells(t + n);
n += (*mb_ptr2len)(t + n);
}
} else {
- n = (long)(out_p - t) - item[groupitem[groupdepth]].maxwid + 1;
+ n = (long)(out_p - t) - items[groupitems[groupdepth]].maxwid + 1;
}
// }
@@ -3079,25 +3390,26 @@ int build_stl_str_hl(
// { Move the truncated output
memmove(t + 1, t + n, (size_t)(out_p - (t + n)));
out_p = out_p - n + 1;
- /* Fill up space left over by half a double-wide char. */
- while (++group_len < item[groupitem[groupdepth]].minwid)
+ // Fill up space left over by half a double-wide char.
+ while (++group_len < items[groupitems[groupdepth]].minwid) {
*out_p++ = fillchar;
+ }
// }
- /* correct the start of the items for the truncation */
- for (int idx = groupitem[groupdepth] + 1; idx < curitem; idx++) {
+ // correct the start of the items for the truncation
+ for (int idx = groupitems[groupdepth] + 1; idx < curitem; idx++) {
// Shift everything back by the number of removed bytes
- item[idx].start -= n;
+ items[idx].start -= n;
// If the item was partially or completely truncated, set its
// start to the start of the group
- if (item[idx].start < t) {
- item[idx].start = t;
+ if (items[idx].start < t) {
+ items[idx].start = t;
}
}
// If the group is shorter than the minimum width, add padding characters.
- } else if (abs(item[groupitem[groupdepth]].minwid) > group_len) {
- long min_group_width = item[groupitem[groupdepth]].minwid;
+ } else if (abs(items[groupitems[groupdepth]].minwid) > group_len) {
+ long min_group_width = items[groupitems[groupdepth]].minwid;
// If the group is left-aligned, add characters to the right.
if (min_group_width < 0) {
min_group_width = 0 - min_group_width;
@@ -3116,8 +3428,8 @@ int build_stl_str_hl(
// }
// Adjust item start positions
- for (int n = groupitem[groupdepth] + 1; n < curitem; n++) {
- item[n].start += group_len;
+ for (int n = groupitems[groupdepth] + 1; n < curitem; n++) {
+ items[n].start += group_len;
}
// Prepend the fill characters
@@ -3155,9 +3467,9 @@ int build_stl_str_hl(
// User highlight groups override the min width field
// to denote the styling to use.
if (*fmt_p == STL_USER_HL) {
- item[curitem].type = Highlight;
- item[curitem].start = out_p;
- item[curitem].minwid = minwid > 9 ? 1 : minwid;
+ items[curitem].type = Highlight;
+ items[curitem].start = out_p;
+ items[curitem].minwid = minwid > 9 ? 1 : minwid;
fmt_p++;
curitem++;
continue;
@@ -3189,20 +3501,21 @@ int build_stl_str_hl(
if (*fmt_p == STL_TABPAGENR || *fmt_p == STL_TABCLOSENR) {
if (*fmt_p == STL_TABCLOSENR) {
if (minwid == 0) {
- /* %X ends the close label, go back to the previously
- * define tab label nr. */
- for (long n = curitem - 1; n >= 0; --n)
- if (item[n].type == TabPage && item[n].minwid >= 0) {
- minwid = item[n].minwid;
+ // %X ends the close label, go back to the previous tab label nr.
+ for (long n = curitem - 1; n >= 0; n--) {
+ if (items[n].type == TabPage && items[n].minwid >= 0) {
+ minwid = items[n].minwid;
break;
}
- } else
- /* close nrs are stored as negative values */
+ }
+ } else {
+ // close nrs are stored as negative values
minwid = -minwid;
+ }
}
- item[curitem].type = TabPage;
- item[curitem].start = out_p;
- item[curitem].minwid = minwid;
+ items[curitem].type = TabPage;
+ items[curitem].start = out_p;
+ items[curitem].minwid = minwid;
fmt_p++;
curitem++;
continue;
@@ -3217,10 +3530,10 @@ int build_stl_str_hl(
if (*fmt_p != STL_CLICK_FUNC) {
break;
}
- item[curitem].type = ClickFunc;
- item[curitem].start = out_p;
- item[curitem].cmd = xmemdupz(t, (size_t) (((char *) fmt_p - t)));
- item[curitem].minwid = minwid;
+ items[curitem].type = ClickFunc;
+ items[curitem].start = out_p;
+ items[curitem].cmd = xmemdupz(t, (size_t)(((char *)fmt_p - t)));
+ items[curitem].minwid = minwid;
fmt_p++;
curitem++;
continue;
@@ -3243,11 +3556,11 @@ int build_stl_str_hl(
// Denotes the start of a new group
if (*fmt_p == '(') {
- groupitem[groupdepth++] = curitem;
- item[curitem].type = Group;
- item[curitem].start = out_p;
- item[curitem].minwid = minwid;
- item[curitem].maxwid = maxwid;
+ groupitems[groupdepth++] = curitem;
+ items[curitem].type = Group;
+ items[curitem].start = out_p;
+ items[curitem].minwid = minwid;
+ items[curitem].maxwid = maxwid;
fmt_p++;
curitem++;
continue;
@@ -3274,7 +3587,7 @@ int build_stl_str_hl(
case STL_FULLPATH:
case STL_FILENAME:
{
- // Set fillable to false to that ' ' in the filename will not
+ // Set fillable to false so that ' ' in the filename will not
// get replaced with the fillchar
fillable = false;
if (buf_spname(wp->w_buffer) != NULL) {
@@ -3313,7 +3626,7 @@ int build_stl_str_hl(
// Store the current buffer number as a string variable
vim_snprintf((char *)tmp, sizeof(tmp), "%d", curbuf->b_fnum);
- set_internal_string_var((char_u *)"actual_curbuf", tmp);
+ set_internal_string_var((char_u *)"g:actual_curbuf", tmp);
buf_T *o_curbuf = curbuf;
win_T *o_curwin = curwin;
@@ -3327,7 +3640,7 @@ int build_stl_str_hl(
curbuf = o_curbuf;
// Remove the variable we just stored
- do_unlet((char_u *)"g:actual_curbuf", true);
+ do_unlet(S_LEN("g:actual_curbuf"), true);
// }
@@ -3409,7 +3722,7 @@ int build_stl_str_hl(
case STL_KEYMAP:
fillable = false;
- if (get_keymap_str(wp, tmp, TMPLEN))
+ if (get_keymap_str(wp, (char_u *)"<%s>", tmp, TMPLEN))
str = tmp;
break;
case STL_PAGENUM:
@@ -3422,9 +3735,11 @@ int build_stl_str_hl(
case STL_OFFSET_X:
base = kNumBaseHexadecimal;
+ FALLTHROUGH;
case STL_OFFSET:
{
- long l = ml_find_line_or_offset(wp->w_buffer, wp->w_cursor.lnum, NULL);
+ long l = ml_find_line_or_offset(wp->w_buffer, wp->w_cursor.lnum, NULL,
+ false);
num = (wp->w_buffer->b_ml.ml_flags & ML_EMPTY) || l < 0 ?
0L : l + 1 + (!(State & INSERT) && empty_line ?
0 : (int)wp->w_cursor.col);
@@ -3432,6 +3747,7 @@ int build_stl_str_hl(
}
case STL_BYTEVAL_X:
base = kNumBaseHexadecimal;
+ FALLTHROUGH;
case STL_BYTEVAL:
num = byteval;
if (num == NL)
@@ -3479,7 +3795,7 @@ int build_stl_str_hl(
wp->w_buffer->b_p_ft);
// Uppercase the file extension
for (char_u *t = tmp; *t != 0; t++) {
- *t = TOUPPER_LOC(*t);
+ *t = (char_u)TOUPPER_LOC(*t);
}
str = tmp;
}
@@ -3526,9 +3842,9 @@ int build_stl_str_hl(
// Create a highlight item based on the name
if (*fmt_p == '#') {
- item[curitem].type = Highlight;
- item[curitem].start = out_p;
- item[curitem].minwid = -syn_namen2id(t, (int)(fmt_p - t));
+ items[curitem].type = Highlight;
+ items[curitem].start = out_p;
+ items[curitem].minwid = -syn_namen2id(t, (int)(fmt_p - t));
curitem++;
fmt_p++;
}
@@ -3539,8 +3855,8 @@ int build_stl_str_hl(
// If we made it this far, the item is normal and starts at
// our current position in the output buffer.
// Non-normal items would have `continued`.
- item[curitem].start = out_p;
- item[curitem].type = Normal;
+ items[curitem].start = out_p;
+ items[curitem].type = Normal;
// Copy the item string into the output buffer
if (str != NULL && *str) {
@@ -3635,9 +3951,7 @@ int build_stl_str_hl(
// Note: The `*` means we take the width as one of the arguments
*t++ = '*';
- *t++ = (char_u) (base == kNumBaseHexadecimal ? 'X'
- : (base == kNumBaseOctal ? 'o'
- : 'd'));
+ *t++ = (char_u)(base == kNumBaseHexadecimal ? 'X' : 'd');
*t = 0;
// }
@@ -3656,7 +3970,8 @@ int build_stl_str_hl(
}
// }
- size_t remaining_buf_len = (out_end_p - out_p) + 1;
+ assert(out_end_p >= out_p);
+ size_t remaining_buf_len = (size_t)(out_end_p - out_p) + 1;
// If the number is going to take up too much room
// Figure out the approximate number in "scientific" type notation.
@@ -3671,7 +3986,7 @@ int build_stl_str_hl(
// { Reduce the number by base^n
while (num_chars-- > maxwid) {
- num /= base;
+ num /= (long)base;
}
// }
@@ -3696,7 +4011,7 @@ int build_stl_str_hl(
// Otherwise, there was nothing to print so mark the item as empty
} else {
- item[curitem].type = Empty;
+ items[curitem].type = Empty;
}
// Only free the string buffer if we allocated it.
@@ -3721,8 +4036,7 @@ int build_stl_str_hl(
}
// We have now processed the entire statusline format string.
- // What follows is post-processing to handle alignment and
- // highlighting factors.
+ // What follows is post-processing to handle alignment and highlighting.
int width = vim_strsize(out);
if (maxwidth > 0 && width > maxwidth) {
@@ -3737,16 +4051,17 @@ int build_stl_str_hl(
// Otherwise, look for the truncation item
} else {
// Default to truncating at the first item
- trunc_p = item[0].start;
+ trunc_p = items[0].start;
item_idx = 0;
- for (int i = 0; i < itemcnt; i++)
- if (item[i].type == Trunc) {
- // Truncate at %< item.
- trunc_p = item[i].start;
+ for (int i = 0; i < itemcnt; i++) {
+ if (items[i].type == Trunc) {
+ // Truncate at %< items.
+ trunc_p = items[i].start;
item_idx = i;
break;
}
+ }
}
// If the truncation point we found is beyond the maximum
@@ -3776,7 +4091,7 @@ int build_stl_str_hl(
// Ignore any items in the statusline that occur after
// the truncation point
for (int i = 0; i < itemcnt; i++) {
- if (item[i].start > trunc_p) {
+ if (items[i].start > trunc_p) {
itemcnt = i;
break;
}
@@ -3831,12 +4146,12 @@ int build_stl_str_hl(
for (int i = item_idx; i < itemcnt; i++) {
// Items starting at or after the end of the truncated section need
// to be moved backwards.
- if (item[i].start >= trunc_end_p) {
- item[i].start -= item_offset;
+ if (items[i].start >= trunc_end_p) {
+ items[i].start -= item_offset;
// Anything inside the truncated area is set to start
// at the `<` truncation character.
} else {
- item[i].start = trunc_p;
+ items[i].start = trunc_p;
}
}
// }
@@ -3847,12 +4162,12 @@ int build_stl_str_hl(
// add characters at the separate marker (if there is one) to
// fill up the available space.
} else if (width < maxwidth
- && STRLEN(out) + maxwidth - width + 1 < outlen) {
+ && STRLEN(out) + (size_t)(maxwidth - width) + 1 < outlen) {
// Find how many separators there are, which we will use when
// figuring out how many groups there are.
int num_separators = 0;
for (int i = 0; i < itemcnt; i++) {
- if (item[i].type == Separate) {
+ if (items[i].type == Separate) {
num_separators++;
}
}
@@ -3864,7 +4179,7 @@ int build_stl_str_hl(
int separator_locations[STL_MAX_ITEM];
int index = 0;
for (int i = 0; i < itemcnt; i++) {
- if (item[i].type == Separate) {
+ if (items[i].type == Separate) {
separator_locations[index] = i;
index++;
}
@@ -3875,18 +4190,18 @@ int build_stl_str_hl(
standard_spaces * (num_separators - 1);
for (int i = 0; i < num_separators; i++) {
- int dislocation = (i == (num_separators - 1)) ?
- final_spaces : standard_spaces;
- char_u *sep_loc = item[separator_locations[i]].start + dislocation;
- STRMOVE(sep_loc, item[separator_locations[i]].start);
- for (char_u *s = item[separator_locations[i]].start; s < sep_loc; s++) {
+ int dislocation = (i == (num_separators - 1))
+ ? final_spaces : standard_spaces;
+ char_u *seploc = items[separator_locations[i]].start + dislocation;
+ STRMOVE(seploc, items[separator_locations[i]].start);
+ for (char_u *s = items[separator_locations[i]].start; s < seploc; s++) {
*s = fillchar;
}
for (int item_idx = separator_locations[i] + 1;
item_idx < itemcnt;
item_idx++) {
- item[item_idx].start += dislocation;
+ items[item_idx].start += dislocation;
}
}
@@ -3898,9 +4213,9 @@ int build_stl_str_hl(
if (hltab != NULL) {
struct stl_hlrec *sp = hltab;
for (long l = 0; l < itemcnt; l++) {
- if (item[l].type == Highlight) {
- sp->start = item[l].start;
- sp->userhl = item[l].minwid;
+ if (items[l].type == Highlight) {
+ sp->start = items[l].start;
+ sp->userhl = items[l].minwid;
sp++;
}
}
@@ -3912,14 +4227,14 @@ int build_stl_str_hl(
if (tabtab != NULL) {
StlClickRecord *cur_tab_rec = tabtab;
for (long l = 0; l < itemcnt; l++) {
- if (item[l].type == TabPage) {
- cur_tab_rec->start = (char *) item[l].start;
- if (item[l].minwid == 0) {
+ if (items[l].type == TabPage) {
+ cur_tab_rec->start = (char *)items[l].start;
+ if (items[l].minwid == 0) {
cur_tab_rec->def.type = kStlClickDisabled;
cur_tab_rec->def.tabnr = 0;
} else {
- int tabnr = item[l].minwid;
- if (item[l].minwid > 0) {
+ int tabnr = items[l].minwid;
+ if (items[l].minwid > 0) {
cur_tab_rec->def.type = kStlClickTabSwitch;
} else {
cur_tab_rec->def.type = kStlClickTabClose;
@@ -3929,11 +4244,11 @@ int build_stl_str_hl(
}
cur_tab_rec->def.func = NULL;
cur_tab_rec++;
- } else if (item[l].type == ClickFunc) {
- cur_tab_rec->start = (char *) item[l].start;
+ } else if (items[l].type == ClickFunc) {
+ cur_tab_rec->start = (char *)items[l].start;
cur_tab_rec->def.type = kStlClickFuncRun;
- cur_tab_rec->def.tabnr = item[l].minwid;
- cur_tab_rec->def.func = item[l].cmd;
+ cur_tab_rec->def.tabnr = items[l].minwid;
+ cur_tab_rec->def.func = items[l].cmd;
cur_tab_rec++;
}
}
@@ -4028,14 +4343,12 @@ void fname_expand(buf_T *buf, char_u **ffname, char_u **sfname)
#ifdef WIN32
if (!buf->b_p_bin) {
- char_u *rfname;
-
- /* If the file name is a shortcut file, use the file it links to. */
- rfname = mch_resolve_shortcut(*ffname);
+ // If the file name is a shortcut file, use the file it links to.
+ char *rfname = os_resolve_shortcut((const char *)(*ffname));
if (rfname != NULL) {
xfree(*ffname);
- *ffname = rfname;
- *sfname = rfname;
+ *ffname = (char_u *)rfname;
+ *sfname = (char_u *)rfname;
}
}
#endif
@@ -4085,6 +4398,8 @@ do_arg_all (
win_T *new_curwin = NULL;
tabpage_T *new_curtab = NULL;
+ assert(firstwin != NULL); // satisfy coverity
+
if (ARGCOUNT <= 0) {
/* Don't give an error message. We don't want it when the ":all"
* command is in the .vimrc. */
@@ -4093,7 +4408,7 @@ do_arg_all (
setpcmark();
opened_len = ARGCOUNT;
- opened = xcalloc(opened_len, 1);
+ opened = xcalloc((size_t)opened_len, 1);
/* Autocommands may do anything to the argument list. Make sure it's not
* freed while we are working here by "locking" it. We still have to
@@ -4121,17 +4436,15 @@ do_arg_all (
wpnext = wp->w_next;
buf = wp->w_buffer;
if (buf->b_ffname == NULL
- || (!keep_tabs && buf->b_nwindows > 1)
- || wp->w_width != Columns
- )
+ || (!keep_tabs && (buf->b_nwindows > 1 || wp->w_width != Columns))) {
i = opened_len;
- else {
- /* check if the buffer in this window is in the arglist */
+ } else {
+ // check if the buffer in this window is in the arglist
for (i = 0; i < opened_len; ++i) {
if (i < alist->al_ga.ga_len
&& (AARGLIST(alist)[i].ae_fnum == buf->b_fnum
|| path_full_compare(alist_name(&AARGLIST(alist)[i]),
- buf->b_ffname, TRUE) & kEqualFiles)) {
+ buf->b_ffname, true) & kEqualFiles)) {
int weight = 1;
if (old_curtab == curtab) {
@@ -4164,29 +4477,32 @@ do_arg_all (
}
wp->w_arg_idx = i;
- if (i == opened_len && !keep_tabs) { /* close this window */
- if (P_HID(buf) || forceit || buf->b_nwindows > 1
+ if (i == opened_len && !keep_tabs) { // close this window
+ if (buf_hide(buf) || forceit || buf->b_nwindows > 1
|| !bufIsChanged(buf)) {
/* If the buffer was changed, and we would like to hide it,
* try autowriting. */
- if (!P_HID(buf) && buf->b_nwindows <= 1
- && bufIsChanged(buf)) {
- (void)autowrite(buf, FALSE);
- /* check if autocommands removed the window */
- if (!win_valid(wp) || !buf_valid(buf)) {
- wpnext = firstwin; /* start all over... */
+ if (!buf_hide(buf) && buf->b_nwindows <= 1 && bufIsChanged(buf)) {
+ bufref_T bufref;
+ set_bufref(&bufref, buf);
+ (void)autowrite(buf, false);
+ // Check if autocommands removed the window.
+ if (!win_valid(wp) || !bufref_valid(&bufref)) {
+ wpnext = firstwin; // Start all over...
continue;
}
}
- /* don't close last window */
- if (firstwin == lastwin
- && (first_tabpage->tp_next == NULL || !had_tab))
- use_firstwin = TRUE;
- else {
- win_close(wp, !P_HID(buf) && !bufIsChanged(buf));
- /* check if autocommands removed the next window */
- if (!win_valid(wpnext))
- wpnext = firstwin; /* start all over... */
+ // don't close last window
+ if (ONE_WINDOW
+ && (first_tabpage->tp_next == NULL || !had_tab)) {
+ use_firstwin = true;
+ } else {
+ win_close(wp, !buf_hide(buf) && !bufIsChanged(buf));
+ // check if autocommands removed the next window
+ if (!win_valid(wpnext)) {
+ // start all over...
+ wpnext = firstwin;
+ }
}
}
}
@@ -4215,15 +4531,17 @@ do_arg_all (
last_curwin = curwin;
last_curtab = curtab;
win_enter(lastwin, false);
- /* ":drop all" should re-use an empty window to avoid "--remote-tab"
- * leaving an empty tab page when executed locally. */
- if (keep_tabs && bufempty() && curbuf->b_nwindows == 1
- && curbuf->b_ffname == NULL && !curbuf->b_changed)
- use_firstwin = TRUE;
-
- for (i = 0; i < count && i < opened_len && !got_int; ++i) {
- if (alist == &global_alist && i == global_alist.al_ga.ga_len - 1)
- arg_had_last = TRUE;
+ // ":drop all" should re-use an empty window to avoid "--remote-tab"
+ // leaving an empty tab page when executed locally.
+ if (keep_tabs && BUFEMPTY() && curbuf->b_nwindows == 1
+ && curbuf->b_ffname == NULL && !curbuf->b_changed) {
+ use_firstwin = true;
+ }
+
+ for (i = 0; i < count && i < opened_len && !got_int; i++) {
+ if (alist == &global_alist && i == global_alist.al_ga.ga_len - 1) {
+ arg_had_last = true;
+ }
if (opened[i] > 0) {
/* Move the already present window to below the current window */
if (curwin->w_arg_idx != i) {
@@ -4258,14 +4576,15 @@ do_arg_all (
new_curwin = curwin;
new_curtab = curtab;
}
- (void)do_ecmd(0, alist_name(&AARGLIST(alist)[i]), NULL, NULL,
- ECMD_ONE,
- ((P_HID(curwin->w_buffer)
- || bufIsChanged(curwin->w_buffer)) ? ECMD_HIDE : 0)
- + ECMD_OLDBUF, curwin);
- if (use_firstwin)
- ++autocmd_no_leave;
- use_firstwin = FALSE;
+ (void)do_ecmd(0, alist_name(&AARGLIST(alist)[i]), NULL, NULL, ECMD_ONE,
+ ((buf_hide(curwin->w_buffer)
+ || bufIsChanged(curwin->w_buffer))
+ ? ECMD_HIDE : 0) + ECMD_OLDBUF,
+ curwin);
+ if (use_firstwin) {
+ autocmd_no_leave++;
+ }
+ use_firstwin = false;
}
os_breakcheck();
@@ -4277,19 +4596,23 @@ do_arg_all (
/* Remove the "lock" on the argument list. */
alist_unlink(alist);
- --autocmd_no_enter;
- /* restore last referenced tabpage's curwin */
+ autocmd_no_enter--;
+ // restore last referenced tabpage's curwin
if (last_curtab != new_curtab) {
- if (valid_tabpage(last_curtab))
- goto_tabpage_tp(last_curtab, TRUE, TRUE);
- if (win_valid(last_curwin))
+ if (valid_tabpage(last_curtab)) {
+ goto_tabpage_tp(last_curtab, true, true);
+ }
+ if (win_valid(last_curwin)) {
win_enter(last_curwin, false);
+ }
+ }
+ // to window with first arg
+ if (valid_tabpage(new_curtab)) {
+ goto_tabpage_tp(new_curtab, true, true);
}
- /* to window with first arg */
- if (valid_tabpage(new_curtab))
- goto_tabpage_tp(new_curtab, TRUE, TRUE);
- if (win_valid(new_curwin))
+ if (win_valid(new_curwin)) {
win_enter(new_curwin, false);
+ }
--autocmd_no_leave;
xfree(opened);
@@ -4306,8 +4629,8 @@ void ex_buffer_all(exarg_T *eap)
bool p_ea_save;
int open_wins = 0;
int r;
- int count; /* Maximum number of windows to open. */
- int all; /* When TRUE also load inactive buffers. */
+ long count; // Maximum number of windows to open.
+ int all; // When TRUE also load inactive buffers.
int had_tab = cmdmod.tab;
tabpage_T *tpnext;
@@ -4338,14 +4661,14 @@ void ex_buffer_all(exarg_T *eap)
? wp->w_height + wp->w_status_height < Rows - p_ch
- tabline_height()
: wp->w_width != Columns)
- || (had_tab > 0 && wp != firstwin)
- ) && firstwin != lastwin
- && !(wp->w_closing || wp->w_buffer->b_closing)
+ || (had_tab > 0 && wp != firstwin))
+ && !ONE_WINDOW
+ && !(wp->w_closing || wp->w_buffer->b_locked > 0)
) {
- win_close(wp, FALSE);
- wpnext = firstwin; /* just in case an autocommand does
- something strange with windows */
- tpnext = first_tabpage; /* start all over...*/
+ win_close(wp, false);
+ wpnext = firstwin; // just in case an autocommand does
+ // something strange with windows
+ tpnext = first_tabpage; // start all over...
open_wins = 0;
} else
++open_wins;
@@ -4388,7 +4711,9 @@ void ex_buffer_all(exarg_T *eap)
}
if (wp == NULL && split_ret == OK) {
- /* Split the window and put the buffer in it */
+ bufref_T bufref;
+ set_bufref(&bufref, buf);
+ // Split the window and put the buffer in it.
p_ea_save = p_ea;
p_ea = true; /* use space from all windows */
split_ret = win_split(0, WSP_ROOM | WSP_BELOW);
@@ -4400,7 +4725,8 @@ void ex_buffer_all(exarg_T *eap)
/* Open the buffer in this window. */
swap_exists_action = SEA_DIALOG;
set_curbuf(buf, DOBUF_GOTO);
- if (!buf_valid(buf)) { /* autocommands deleted the buffer!!! */
+ if (!bufref_valid(&bufref)) {
+ // Autocommands deleted the buffer.
swap_exists_action = SEA_NONE;
break;
}
@@ -4411,9 +4737,9 @@ void ex_buffer_all(exarg_T *eap)
* aborting() returns FALSE when closing a window. */
enter_cleanup(&cs);
- /* User selected Quit at ATTENTION prompt; close this window. */
- win_close(curwin, TRUE);
- --open_wins;
+ // User selected Quit at ATTENTION prompt; close this window.
+ win_close(curwin, true);
+ open_wins--;
swap_exists_action = SEA_NONE;
swap_exists_did_quit = TRUE;
@@ -4445,14 +4771,14 @@ void ex_buffer_all(exarg_T *eap)
* Close superfluous windows.
*/
for (wp = lastwin; open_wins > count; ) {
- r = (P_HID(wp->w_buffer) || !bufIsChanged(wp->w_buffer)
- || autowrite(wp->w_buffer, FALSE) == OK);
+ r = (buf_hide(wp->w_buffer) || !bufIsChanged(wp->w_buffer)
+ || autowrite(wp->w_buffer, false) == OK);
if (!win_valid(wp)) {
/* BufWrite Autocommands made the window invalid, start over */
wp = lastwin;
} else if (r) {
- win_close(wp, !P_HID(wp->w_buffer));
- --open_wins;
+ win_close(wp, !buf_hide(wp->w_buffer));
+ open_wins--;
wp = lastwin;
} else {
wp = wp->w_prev;
@@ -4514,7 +4840,7 @@ chk_modeline (
char_u *e;
char_u *linecopy; /* local copy of any modeline found */
int prev;
- int vers;
+ intmax_t vers;
int end;
int retval = OK;
char_u *save_sourcing_name;
@@ -4533,7 +4859,10 @@ chk_modeline (
e = s + 4;
else
e = s + 3;
- vers = getdigits_int(&e);
+ if (getdigits_safe(&e, &vers) != OK) {
+ continue;
+ }
+
if (*e == ':'
&& (s[0] != 'V'
|| STRNCMP(skipwhite(e + 1), "set", 3) == 0)
@@ -4541,8 +4870,9 @@ chk_modeline (
|| (VIM_VERSION_100 >= vers && isdigit(s[3]))
|| (VIM_VERSION_100 < vers && s[3] == '<')
|| (VIM_VERSION_100 > vers && s[3] == '>')
- || (VIM_VERSION_100 == vers && s[3] == '=')))
+ || (VIM_VERSION_100 == vers && s[3] == '='))) {
break;
+ }
}
}
prev = *s;
@@ -4614,6 +4944,12 @@ chk_modeline (
return retval;
}
+// Return true if "buf" is a help buffer.
+bool bt_help(const buf_T *const buf)
+{
+ return buf != NULL && buf->b_help;
+}
+
/*
* Return special buffer name.
* Returns NULL when the buffer has a normal file name.
@@ -4753,13 +5089,16 @@ linenr_T buf_change_sign_type(
return (linenr_T)0;
}
-int buf_getsigntype(
- buf_T *buf,
- linenr_T lnum,
- int type /* SIGN_ICON, SIGN_TEXT, SIGN_ANY, SIGN_LINEHL */
- )
+/// Gets a sign from a given line.
+/// In case of multiple signs, returns the most recently placed one.
+///
+/// @param buf Buffer in which to search
+/// @param lnum Line in which to search
+/// @param type Type of sign to look for
+/// @return Identifier of the first matching sign, or 0
+int buf_getsigntype(buf_T *buf, linenr_T lnum, SignType type)
{
- signlist_T *sign; /* a sign in a b_signlist */
+ signlist_T *sign; // a sign in a b_signlist
for (sign = buf->b_signlist; sign != NULL; sign = sign->next) {
if (sign->lnum == lnum
@@ -4767,7 +5106,9 @@ int buf_getsigntype(
|| (type == SIGN_TEXT
&& sign_get_text(sign->typenr) != NULL)
|| (type == SIGN_LINEHL
- && sign_get_attr(sign->typenr, TRUE) != 0))) {
+ && sign_get_attr(sign->typenr, SIGN_LINEHL) != 0)
+ || (type == SIGN_NUMHL
+ && sign_get_attr(sign->typenr, SIGN_NUMHL) != 0))) {
return sign->typenr;
}
}
@@ -4824,7 +5165,7 @@ int buf_findsign(
for (sign = buf->b_signlist; sign != NULL; sign = sign->next) {
if (sign->id == id) {
- return sign->lnum;
+ return (int)sign->lnum;
}
}
@@ -4900,7 +5241,7 @@ void sign_list_placed(buf_T *rbuf)
while (buf != NULL && !got_int) {
if (buf->b_signlist != NULL) {
vim_snprintf(lbuf, BUFSIZ, _("Signs for %s:"), buf->b_fname);
- MSG_PUTS_ATTR(lbuf, hl_attr(HLF_D));
+ MSG_PUTS_ATTR(lbuf, HL_ATTR(HLF_D));
msg_putchar('\n');
}
for (p = buf->b_signlist; p != NULL && !got_int; p = p->next) {
@@ -4938,6 +5279,30 @@ void sign_mark_adjust(linenr_T line1, linenr_T line2, long amount, long amount_a
// bufhl: plugin highlights associated with a buffer
+/// Get reference to line in kbtree_t
+///
+/// @param b the three
+/// @param line the linenumber to lookup
+/// @param put if true, put a new line when not found
+/// if false, return NULL when not found
+BufhlLine *bufhl_tree_ref(BufhlInfo *b, linenr_T line, bool put)
+{
+ BufhlLine t = BUFHLLINE_INIT(line);
+
+ // kp_put() only works if key is absent, try get first
+ BufhlLine **pp = kb_get(bufhl, b, &t);
+ if (pp) {
+ return *pp;
+ } else if (!put) {
+ return NULL;
+ }
+
+ BufhlLine *p = xmalloc(sizeof(*p));
+ *p = (BufhlLine)BUFHLLINE_INIT(line);
+ kb_put(bufhl, b, p);
+ return p;
+}
+
/// Adds a highlight to buffer.
///
/// Unlike matchaddpos() highlights follow changes to line numbering (as lines
@@ -4966,34 +5331,105 @@ int bufhl_add_hl(buf_T *buf,
int hl_id,
linenr_T lnum,
colnr_T col_start,
- colnr_T col_end) {
- static int next_src_id = 1;
+ colnr_T col_end)
+{
if (src_id == 0) {
- src_id = next_src_id++;
+ src_id = (int)nvim_create_namespace((String)STRING_INIT);
}
if (hl_id <= 0) {
// no highlight group or invalid line, just return src_id
return src_id;
}
- if (!buf->b_bufhl_info) {
- buf->b_bufhl_info = map_new(linenr_T, bufhl_vec_T)();
- }
- bufhl_vec_T* lineinfo = map_ref(linenr_T, bufhl_vec_T)(buf->b_bufhl_info,
- lnum, true);
- bufhl_hl_item_T *hlentry = kv_pushp(*lineinfo);
+ BufhlLine *lineinfo = bufhl_tree_ref(&buf->b_bufhl_info, lnum, true);
+
+ BufhlItem *hlentry = kv_pushp(lineinfo->items);
hlentry->src_id = src_id;
hlentry->hl_id = hl_id;
hlentry->start = col_start;
hlentry->stop = col_end;
if (0 < lnum && lnum <= buf->b_ml.ml_line_count) {
- changed_lines_buf(buf, lnum, lnum+1, 0);
- redraw_buf_later(buf, VALID);
+ redraw_buf_line_later(buf, lnum);
+ }
+ return src_id;
+}
+
+/// Add highlighting to a buffer, bounded by two cursor positions,
+/// with an offset.
+///
+/// @param buf Buffer to add highlights to
+/// @param src_id src_id to use or 0 to use a new src_id group,
+/// or -1 for ungrouped highlight.
+/// @param hl_id Highlight group id
+/// @param pos_start Cursor position to start the hightlighting at
+/// @param pos_end Cursor position to end the highlighting at
+/// @param offset Move the whole highlighting this many columns to the right
+void bufhl_add_hl_pos_offset(buf_T *buf,
+ int src_id,
+ int hl_id,
+ lpos_T pos_start,
+ lpos_T pos_end,
+ colnr_T offset)
+{
+ colnr_T hl_start = 0;
+ colnr_T hl_end = 0;
+
+ for (linenr_T lnum = pos_start.lnum; lnum <= pos_end.lnum; lnum ++) {
+ if (pos_start.lnum < lnum && lnum < pos_end.lnum) {
+ hl_start = offset;
+ hl_end = MAXCOL;
+ } else if (lnum == pos_start.lnum && lnum < pos_end.lnum) {
+ hl_start = pos_start.col + offset + 1;
+ hl_end = MAXCOL;
+ } else if (pos_start.lnum < lnum && lnum == pos_end.lnum) {
+ hl_start = offset;
+ hl_end = pos_end.col + offset;
+ } else if (pos_start.lnum == lnum && pos_end.lnum == lnum) {
+ hl_start = pos_start.col + offset + 1;
+ hl_end = pos_end.col + offset;
+ }
+ (void)bufhl_add_hl(buf, src_id, hl_id, lnum, hl_start, hl_end);
+ }
+}
+
+int bufhl_add_virt_text(buf_T *buf,
+ int src_id,
+ linenr_T lnum,
+ VirtText virt_text)
+{
+ if (src_id == 0) {
+ src_id = (int)nvim_create_namespace((String)STRING_INIT);
+ }
+
+ BufhlLine *lineinfo = bufhl_tree_ref(&buf->b_bufhl_info, lnum, true);
+
+ bufhl_clear_virttext(&lineinfo->virt_text);
+ if (kv_size(virt_text) > 0) {
+ lineinfo->virt_text_src = src_id;
+ lineinfo->virt_text = virt_text;
+ } else {
+ lineinfo->virt_text_src = 0;
+ // currently not needed, but allow a future caller with
+ // 0 size and non-zero capacity
+ kv_destroy(virt_text);
+ }
+
+ if (0 < lnum && lnum <= buf->b_ml.ml_line_count) {
+ redraw_buf_line_later(buf, lnum);
}
return src_id;
}
+static void bufhl_clear_virttext(VirtText *text)
+{
+ for (size_t i = 0; i < kv_size(*text); i++) {
+ xfree(kv_A(*text, i).text);
+ }
+ kv_destroy(*text);
+ *text = (VirtText)KV_INITIAL_VALUE;
+}
+
/// Clear bufhl highlights from a given source group and range of lines.
///
/// @param buf The buffer to remove highlights from
@@ -5003,33 +5439,29 @@ int bufhl_add_hl(buf_T *buf,
void bufhl_clear_line_range(buf_T *buf,
int src_id,
linenr_T line_start,
- linenr_T line_end) {
- if (!buf->b_bufhl_info) {
- return;
- }
- linenr_T line;
- linenr_T first_changed = MAXLNUM, last_changed = -1;
- // In the case line_start - line_end << bufhl_info->size
- // it might be better to reverse this, i e loop over the lines
- // to clear on.
- bufhl_vec_T unused;
- map_foreach(buf->b_bufhl_info, line, unused, {
- (void)unused;
- if (line_start <= line && line <= line_end) {
- if (bufhl_clear_line(buf->b_bufhl_info, src_id, line)) {
- if (line > last_changed) {
- last_changed = line;
- }
- if (line < first_changed) {
- first_changed = line;
- }
+ linenr_T line_end)
+{
+ kbitr_t(bufhl) itr;
+ BufhlLine *l, t = BUFHLLINE_INIT(line_start);
+ if (!kb_itr_get(bufhl, &buf->b_bufhl_info, &t, &itr)) {
+ kb_itr_next(bufhl, &buf->b_bufhl_info, &itr);
+ }
+ for (; kb_itr_valid(&itr); kb_itr_next(bufhl, &buf->b_bufhl_info, &itr)) {
+ l = kb_itr_key(&itr);
+ linenr_T line = l->line;
+ if (line > line_end) {
+ break;
+ }
+ if (line_start <= line) {
+ BufhlLineStatus status = bufhl_clear_line(l, src_id, line);
+ if (status != kBLSUnchanged) {
+ redraw_buf_line_later(buf, line);
+ }
+ if (status == kBLSDeleted) {
+ kb_del_itr(bufhl, &buf->b_bufhl_info, &itr);
+ xfree(l);
}
}
- })
-
- if (last_changed != -1) {
- changed_lines_buf(buf, first_changed, last_changed+1, 0);
- redraw_buf_later(buf, VALID);
}
}
@@ -5038,40 +5470,52 @@ void bufhl_clear_line_range(buf_T *buf,
/// @param bufhl_info The highlight info for the buffer
/// @param src_id Highlight source group to clear, or -1 to clear all groups.
/// @param lnum Linenr where the highlight should be cleared
-static bool bufhl_clear_line(bufhl_info_T *bufhl_info, int src_id, int lnum) {
- bufhl_vec_T* lineinfo = map_ref(linenr_T, bufhl_vec_T)(bufhl_info,
- lnum, false);
- size_t oldsize = kv_size(*lineinfo);
+static BufhlLineStatus bufhl_clear_line(BufhlLine *lineinfo, int src_id,
+ linenr_T lnum)
+{
+ BufhlLineStatus changed = kBLSUnchanged;
+ size_t oldsize = kv_size(lineinfo->items);
if (src_id < 0) {
- kv_size(*lineinfo) = 0;
+ kv_size(lineinfo->items) = 0;
} else {
- size_t newind = 0;
- for (size_t i = 0; i < kv_size(*lineinfo); i++) {
- if (kv_A(*lineinfo, i).src_id != src_id) {
- if (i != newind) {
- kv_A(*lineinfo, newind) = kv_A(*lineinfo, i);
+ size_t newidx = 0;
+ for (size_t i = 0; i < kv_size(lineinfo->items); i++) {
+ if (kv_A(lineinfo->items, i).src_id != src_id) {
+ if (i != newidx) {
+ kv_A(lineinfo->items, newidx) = kv_A(lineinfo->items, i);
}
- newind++;
+ newidx++;
}
}
- kv_size(*lineinfo) = newind;
+ kv_size(lineinfo->items) = newidx;
+ }
+ if (kv_size(lineinfo->items) != oldsize) {
+ changed = kBLSChanged;
+ }
+
+ if (kv_size(lineinfo->virt_text) != 0
+ && (src_id < 0 || src_id == lineinfo->virt_text_src)) {
+ bufhl_clear_virttext(&lineinfo->virt_text);
+ lineinfo->virt_text_src = 0;
+ changed = kBLSChanged;
}
- if (kv_size(*lineinfo) == 0) {
- kv_destroy(*lineinfo);
- map_del(linenr_T, bufhl_vec_T)(bufhl_info, lnum);
+ if (kv_size(lineinfo->items) == 0 && kv_size(lineinfo->virt_text) == 0) {
+ kv_destroy(lineinfo->items);
+ return kBLSDeleted;
}
- return kv_size(*lineinfo) != oldsize;
+ return changed;
}
+
/// Remove all highlights and free the highlight data
-void bufhl_clear_all(buf_T* buf) {
- if (!buf->b_bufhl_info) {
- return;
- }
+void bufhl_clear_all(buf_T *buf)
+{
bufhl_clear_line_range(buf, -1, 1, MAXLNUM);
- map_free(linenr_T, bufhl_vec_T)(buf->b_bufhl_info);
- buf->b_bufhl_info = NULL;
+ kb_destroy(bufhl, (&buf->b_bufhl_info));
+ kb_init(&buf->b_bufhl_info);
+ kv_destroy(buf->b_bufhl_move_space);
+ kv_init(buf->b_bufhl_move_space);
}
/// Adjust a placed highlight for inserted/deleted lines.
@@ -5079,29 +5523,49 @@ void bufhl_mark_adjust(buf_T* buf,
linenr_T line1,
linenr_T line2,
long amount,
- long amount_after) {
- if (!buf->b_bufhl_info) {
+ long amount_after,
+ bool end_temp)
+{
+ kbitr_t(bufhl) itr;
+ BufhlLine *l, t = BUFHLLINE_INIT(line1);
+ if (end_temp && amount < 0) {
+ // Move all items from b_bufhl_move_space to the btree.
+ for (size_t i = 0; i < kv_size(buf->b_bufhl_move_space); i++) {
+ l = kv_A(buf->b_bufhl_move_space, i);
+ l->line += amount;
+ kb_put(bufhl, &buf->b_bufhl_info, l);
+ }
+ kv_size(buf->b_bufhl_move_space) = 0;
return;
}
- bufhl_info_T *newmap = map_new(linenr_T, bufhl_vec_T)();
- linenr_T line;
- bufhl_vec_T lineinfo;
- map_foreach(buf->b_bufhl_info, line, lineinfo, {
- if (line >= line1 && line <= line2) {
+ if (!kb_itr_get(bufhl, &buf->b_bufhl_info, &t, &itr)) {
+ kb_itr_next(bufhl, &buf->b_bufhl_info, &itr);
+ }
+ for (; kb_itr_valid(&itr); kb_itr_next(bufhl, &buf->b_bufhl_info, &itr)) {
+ l = kb_itr_key(&itr);
+ if (l->line >= line1 && l->line <= line2) {
+ if (end_temp && amount > 0) {
+ kb_del_itr(bufhl, &buf->b_bufhl_info, &itr);
+ kv_push(buf->b_bufhl_move_space, l);
+ }
if (amount == MAXLNUM) {
- bufhl_clear_line(buf->b_bufhl_info, -1, line);
- continue;
+ if (bufhl_clear_line(l, -1, l->line) == kBLSDeleted) {
+ kb_del_itr(bufhl, &buf->b_bufhl_info, &itr);
+ xfree(l);
+ } else {
+ assert(false);
+ }
} else {
- line += amount;
+ l->line += amount;
}
- } else if (line > line2) {
- line += amount_after;
+ } else if (l->line > line2) {
+ if (amount_after == 0) {
+ break;
+ }
+ l->line += amount_after;
}
- map_put(linenr_T, bufhl_vec_T)(newmap, line, lineinfo);
- });
- map_free(linenr_T, bufhl_vec_T)(buf->b_bufhl_info);
- buf->b_bufhl_info = newmap;
+ }
}
@@ -5111,14 +5575,15 @@ void bufhl_mark_adjust(buf_T* buf,
/// @param lnum The line number
/// @param[out] info The highligts for the line
/// @return true if there was highlights to display
-bool bufhl_start_line(buf_T *buf, linenr_T lnum, bufhl_lineinfo_T *info) {
- if (!buf->b_bufhl_info) {
+bool bufhl_start_line(buf_T *buf, linenr_T lnum, BufhlLineInfo *info)
+{
+ BufhlLine *lineinfo = bufhl_tree_ref(&buf->b_bufhl_info, lnum, false);
+ if (!lineinfo) {
return false;
}
-
info->valid_to = -1;
- info->entries = map_get(linenr_T, bufhl_vec_T)(buf->b_bufhl_info, lnum);
- return kv_size(info->entries) > 0;
+ info->line = lineinfo;
+ return true;
}
/// get highlighting at column col
@@ -5131,14 +5596,15 @@ bool bufhl_start_line(buf_T *buf, linenr_T lnum, bufhl_lineinfo_T *info) {
/// @param info The info returned by bufhl_start_line
/// @param col The column to get the attr for
/// @return The highilight attr to display at the column
-int bufhl_get_attr(bufhl_lineinfo_T *info, colnr_T col) {
+int bufhl_get_attr(BufhlLineInfo *info, colnr_T col)
+{
if (col <= info->valid_to) {
return info->current;
}
int attr = 0;
info->valid_to = MAXCOL;
- for (size_t i = 0; i < kv_size(info->entries); i++) {
- bufhl_hl_item_T entry = kv_A(info->entries, i);
+ for (size_t i = 0; i < kv_size(info->line->items); i++) {
+ BufhlItem entry = kv_A(info->line->items, i);
if (entry.start <= col && col <= entry.stop) {
int entry_attr = syn_id2attr(entry.hl_id);
attr = hl_combine_attr(attr, entry_attr);
@@ -5231,12 +5697,30 @@ wipe_buffer (
int aucmd /* When TRUE trigger autocommands. */
)
{
- if (buf->b_fnum == top_file_num - 1)
- --top_file_num;
-
- if (!aucmd) /* Don't trigger BufDelete autocommands here. */
+ if (!aucmd) {
+ // Don't trigger BufDelete autocommands here.
block_autocmds();
- close_buffer(NULL, buf, DOBUF_WIPE, FALSE);
- if (!aucmd)
+ }
+ close_buffer(NULL, buf, DOBUF_WIPE, false);
+ if (!aucmd) {
unblock_autocmds();
+ }
+}
+
+/// Creates or switches to a scratch buffer. :h special-buffers
+/// Scratch buffer is:
+/// - buftype=nofile bufhidden=hide noswapfile
+/// - Always considered 'nomodified'
+///
+/// @param bufnr Buffer to switch to, or 0 to create a new buffer.
+///
+/// @see curbufIsChanged()
+void buf_open_scratch(handle_T bufnr, char *bufname)
+{
+ (void)do_ecmd((int)bufnr, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, NULL);
+ (void)setfname(curbuf, (char_u *)bufname, NULL, true);
+ set_option_value("bh", 0L, "hide", OPT_LOCAL);
+ set_option_value("bt", 0L, "nofile", OPT_LOCAL);
+ set_option_value("swf", 0L, NULL, OPT_LOCAL);
+ RESET_BINDING(curwin);
}
diff --git a/src/nvim/buffer.h b/src/nvim/buffer.h
index 36cbec7e60..e61c312fb1 100644
--- a/src/nvim/buffer.h
+++ b/src/nvim/buffer.h
@@ -1,10 +1,14 @@
#ifndef NVIM_BUFFER_H
#define NVIM_BUFFER_H
+#include "nvim/vim.h"
#include "nvim/window.h"
#include "nvim/pos.h" // for linenr_T
#include "nvim/ex_cmds_defs.h" // for exarg_T
#include "nvim/screen.h" // for StlClickRecord
+#include "nvim/func_attr.h"
+#include "nvim/eval.h"
+#include "nvim/macros.h"
// Values for buflist_getfile()
enum getf_values {
@@ -13,11 +17,22 @@ enum getf_values {
GETF_SWITCH = 0x04, // respect 'switchbuf' settings when jumping
};
+// Return values of getfile()
+enum getf_retvalues {
+ GETFILE_ERROR = 1, // normal error
+ GETFILE_NOT_WRITTEN = 2, // "not written" error
+ GETFILE_SAME_FILE = 0, // success, same file
+ GETFILE_OPEN_OTHER = -1, // success, opened another file
+ GETFILE_UNUSED = 8
+};
+
// Values for buflist_new() flags
enum bln_values {
- BLN_CURBUF = 1, // May re-use curbuf for new buffer
- BLN_LISTED = 2, // Put new buffer in buffer list
- BLN_DUMMY = 4, // Allocating dummy buffer
+ BLN_CURBUF = 1, // May re-use curbuf for new buffer
+ BLN_LISTED = 2, // Put new buffer in buffer list
+ BLN_DUMMY = 4, // Allocating dummy buffer
+ // TODO(mhinz): merge patch that introduces BLN_NEW
+ BLN_NOOPT = 16, // Don't copy options to existing buffer
};
// Values for action argument for do_buffer()
@@ -55,35 +70,89 @@ enum bfa_values {
static inline void switch_to_win_for_buf(buf_T *buf,
win_T **save_curwinp,
tabpage_T **save_curtabp,
- buf_T **save_curbufp)
+ bufref_T *save_curbuf)
{
win_T *wp;
tabpage_T *tp;
if (!find_win_for_buf(buf, &wp, &tp)
- || switch_win(save_curwinp, save_curtabp, wp, tp, true) == FAIL)
- switch_buffer(save_curbufp, buf);
+ || switch_win(save_curwinp, save_curtabp, wp, tp, true) == FAIL) {
+ switch_buffer(save_curbuf, buf);
+ }
}
static inline void restore_win_for_buf(win_T *save_curwin,
tabpage_T *save_curtab,
- buf_T *save_curbuf)
+ bufref_T *save_curbuf)
{
- if (save_curbuf == NULL) {
+ if (save_curbuf->br_buf == NULL) {
restore_win(save_curwin, save_curtab, true);
} else {
restore_buffer(save_curbuf);
}
}
+static inline void buf_set_changedtick(buf_T *const buf,
+ const varnumber_T changedtick)
+ REAL_FATTR_NONNULL_ALL REAL_FATTR_ALWAYS_INLINE;
+
+/// Set b:changedtick, also checking b: for consistency in debug build
+///
+/// @param[out] buf Buffer to set changedtick in.
+/// @param[in] changedtick New value.
+static inline void buf_set_changedtick(buf_T *const buf,
+ const varnumber_T changedtick)
+{
+#ifndef NDEBUG
+ dictitem_T *const changedtick_di = tv_dict_find(
+ buf->b_vars, S_LEN("changedtick"));
+ assert(changedtick_di != NULL);
+ assert(changedtick_di->di_tv.v_type == VAR_NUMBER);
+ assert(changedtick_di->di_tv.v_lock == VAR_FIXED);
+ // For some reason formatc does not like the below.
+# ifndef UNIT_TESTING_LUA_PREPROCESSING
+ assert(changedtick_di->di_flags == (DI_FLAGS_RO|DI_FLAGS_FIX));
+# endif
+ assert(changedtick_di == (dictitem_T *)&buf->changedtick_di);
+#endif
+ buf->changedtick_di.di_tv.vval.v_number = changedtick;
+}
+
+static inline varnumber_T buf_get_changedtick(const buf_T *const buf)
+ REAL_FATTR_NONNULL_ALL REAL_FATTR_ALWAYS_INLINE REAL_FATTR_PURE
+ REAL_FATTR_WARN_UNUSED_RESULT;
+
+/// Get b:changedtick value
+///
+/// Faster then querying b:.
+///
+/// @param[in] buf Buffer to get b:changedtick from.
+static inline varnumber_T buf_get_changedtick(const buf_T *const buf)
+{
+ return buf->changedtick_di.di_tv.vval.v_number;
+}
+
+static inline void buf_inc_changedtick(buf_T *const buf)
+ REAL_FATTR_NONNULL_ALL REAL_FATTR_ALWAYS_INLINE;
+
+/// Increment b:changedtick value
+///
+/// Also checks b: for consistency in case of debug build.
+///
+/// @param[in,out] buf Buffer to increment value in.
+static inline void buf_inc_changedtick(buf_T *const buf)
+{
+ buf_set_changedtick(buf, buf_get_changedtick(buf) + 1);
+}
+
#define WITH_BUFFER(b, code) \
do { \
- buf_T *save_curbuf = NULL; \
win_T *save_curwin = NULL; \
tabpage_T *save_curtab = NULL; \
+ bufref_T save_curbuf = { NULL, 0, 0 }; \
switch_to_win_for_buf(b, &save_curwin, &save_curtab, &save_curbuf); \
code; \
- restore_win_for_buf(save_curwin, save_curtab, save_curbuf); \
+ restore_win_for_buf(save_curwin, save_curtab, &save_curbuf); \
} while (0)
diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h
index b515c4e1e4..05688790c2 100644
--- a/src/nvim/buffer_defs.h
+++ b/src/nvim/buffer_defs.h
@@ -8,14 +8,24 @@
typedef struct file_buffer buf_T; // Forward declaration
+// Reference to a buffer that stores the value of buf_free_count.
+// bufref_valid() only needs to check "buf" when the count differs.
+typedef struct {
+ buf_T *br_buf;
+ int br_fnum;
+ int br_buf_free_count;
+} bufref_T;
+
// for garray_T
#include "nvim/garray.h"
+// for ScreenGrid
+#include "nvim/grid_defs.h"
+// for HLF_COUNT
+#include "nvim/highlight_defs.h"
// for pos_T, lpos_T and linenr_T
#include "nvim/pos.h"
// for the number window-local and buffer-local options
#include "nvim/option_defs.h"
-// for optional iconv support
-#include "nvim/iconv.h"
// for jump list and tag stack sizes in a buffer and mark types
#include "nvim/mark_defs.h"
// for u_header_T; needs buf_T.
@@ -23,15 +33,18 @@ typedef struct file_buffer buf_T; // Forward declaration
// for hashtab_T
#include "nvim/hashtab.h"
// for dict_T
-#include "nvim/eval_defs.h"
+#include "nvim/eval/typval.h"
// for proftime_T
#include "nvim/profile.h"
// for String
#include "nvim/api/private/defs.h"
// for Map(K, V)
#include "nvim/map.h"
+// for kvec
+#include "nvim/lib/kvec.h"
-#define MODIFIABLE(buf) (!buf->terminal && buf->b_p_ma)
+#define GETFILE_SUCCESS(x) ((x) <= 0)
+#define MODIFIABLE(buf) (buf->b_p_ma)
/*
* Flags for w_valid.
@@ -47,10 +60,10 @@ typedef struct file_buffer buf_T; // Forward declaration
* functions that set or reset the flags.
*
* VALID_BOTLINE VALID_BOTLINE_AP
- * on on w_botline valid
- * off on w_botline approximated
- * off off w_botline not valid
- * on off not possible
+ * on on w_botline valid
+ * off on w_botline approximated
+ * off off w_botline not valid
+ * on off not possible
*/
#define VALID_WROW 0x01 /* w_wrow (window row) is valid */
#define VALID_WCOL 0x02 /* w_wcol (window col) is valid */
@@ -83,36 +96,24 @@ typedef struct file_buffer buf_T; // Forward declaration
typedef struct window_S win_T;
typedef struct wininfo_S wininfo_T;
typedef struct frame_S frame_T;
-typedef int scid_T; /* script ID */
+typedef uint16_t disptick_T; // display tick type
// for struct memline (it needs memfile_T)
#include "nvim/memline_defs.h"
-
// for struct memfile, bhdr_T, blocknr_T... (it needs buf_T)
#include "nvim/memfile_defs.h"
-/*
- * This is here because regexp_defs.h needs win_T and buf_T. regprog_T is
- * used below.
- */
+// for regprog_T. Needs win_T and buf_T.
#include "nvim/regexp_defs.h"
-
-// for synstate_T (needs reg_extmatch_T, win_T and buf_T)
+// for synstate_T (needs reg_extmatch_T, win_T, buf_T)
#include "nvim/syntax_defs.h"
-
// for signlist_T
#include "nvim/sign_defs.h"
-
// for bufhl_*_T
#include "nvim/bufhl_defs.h"
-typedef Map(linenr_T, bufhl_vec_T) bufhl_info_T;
-
-// for FileID
-#include "nvim/os/fs_defs.h"
-
-// for Terminal
-#include "nvim/terminal.h"
+#include "nvim/os/fs_defs.h" // for FileID
+#include "nvim/terminal.h" // for Terminal
/*
* The taggy struct is used to store the information about a :tag command.
@@ -145,6 +146,12 @@ struct buffheader {
size_t bh_space; // space in bh_curr for appending
};
+typedef struct
+{
+ buffheader_T sr_redobuff;
+ buffheader_T sr_old_redobuff;
+} save_redo_T;
+
/*
* Structure that contains all options that are local to a window.
* Used twice in a window: for the current buffer and for all buffers.
@@ -154,7 +161,7 @@ typedef struct {
int wo_arab;
# define w_p_arab w_onebuf_opt.wo_arab /* 'arabic' */
int wo_bri;
-# define w_p_bri w_onebuf_opt.wo_bri /* 'breakindent' */
+# define w_p_bri w_onebuf_opt.wo_bri // 'breakindent'
char_u *wo_briopt;
# define w_p_briopt w_onebuf_opt.wo_briopt /* 'breakindentopt' */
int wo_diff;
@@ -237,8 +244,12 @@ typedef struct {
# define w_p_crb w_onebuf_opt.wo_crb /* 'cursorbind' */
int wo_crb_save; /* 'cursorbind' state saved for diff mode*/
# define w_p_crb_save w_onebuf_opt.wo_crb_save
+ char_u *wo_scl;
+# define w_p_scl w_onebuf_opt.wo_scl // 'signcolumn'
+ char_u *wo_winhl;
+# define w_p_winhl w_onebuf_opt.wo_winhl // 'winhighlight'
- int wo_scriptID[WV_COUNT]; /* SIDs for window-local options */
+ LastSet wo_scriptID[WV_COUNT]; // SIDs for window-local options
# define w_p_scriptID w_onebuf_opt.wo_scriptID
} winopt_T;
@@ -323,25 +334,6 @@ typedef struct {
} tasave_T;
/*
- * Used for conversion of terminal I/O and script files.
- */
-typedef struct {
- int vc_type; /* zero or one of the CONV_ values */
- int vc_factor; /* max. expansion factor */
-# ifdef USE_ICONV
- iconv_t vc_fd; /* for CONV_ICONV */
-# endif
- bool vc_fail; /* fail for invalid char, don't use '?' */
-} vimconv_T;
-
-#define CONV_NONE 0
-#define CONV_TO_UTF8 1
-#define CONV_9_TO_UTF8 2
-#define CONV_TO_LATIN1 3
-#define CONV_TO_LATIN9 4
-#define CONV_ICONV 5
-
-/*
* Structure used for mappings and abbreviations.
*/
typedef struct mapblock mapblock_T;
@@ -422,13 +414,13 @@ typedef struct {
* syntax state too often.
* b_sst_array[] is allocated to hold the state for all displayed lines,
* and states for 1 out of about 20 other lines.
- * b_sst_array pointer to an array of synstate_T
- * b_sst_len number of entries in b_sst_array[]
- * b_sst_first pointer to first used entry in b_sst_array[] or NULL
- * b_sst_firstfree pointer to first free entry in b_sst_array[] or NULL
- * b_sst_freecount number of free entries in b_sst_array[]
- * b_sst_check_lnum entries after this lnum need to be checked for
- * validity (MAXLNUM means no check needed)
+ * b_sst_array pointer to an array of synstate_T
+ * b_sst_len number of entries in b_sst_array[]
+ * b_sst_first pointer to first used entry in b_sst_array[] or NULL
+ * b_sst_firstfree pointer to first free entry in b_sst_array[] or NULL
+ * b_sst_freecount number of free entries in b_sst_array[]
+ * b_sst_check_lnum entries after this lnum need to be checked for
+ * validity (MAXLNUM means no check needed)
*/
synstate_T *b_sst_array;
int b_sst_len;
@@ -436,7 +428,7 @@ typedef struct {
synstate_T *b_sst_firstfree;
int b_sst_freecount;
linenr_T b_sst_check_lnum;
- uint16_t b_sst_lasttick; /* last display tick */
+ disptick_T b_sst_lasttick; // last display tick
// for spell checking
garray_T b_langp; // list of pointers to slang_T, see spell.c
@@ -451,6 +443,16 @@ typedef struct {
char_u *b_syn_isk; // iskeyword option
} synblock_T;
+/// Type used for changedtick_di member in buf_T
+///
+/// Primary exists so that literals of relevant type can be made.
+typedef TV_DICTITEM_STRUCT(sizeof("changedtick")) ChangedtickDictItem;
+
+#define BUF_HAS_QF_ENTRY 1
+#define BUF_HAS_LL_ENTRY 2
+
+// Maximum number of maphash blocks we will have
+#define MAX_MAPHASH 256
/*
* buffer: structure that holds information about one file
@@ -461,37 +463,45 @@ typedef struct {
*/
struct file_buffer {
- uint64_t handle; // unique identifier for the buffer
- memline_T b_ml; /* associated memline (also contains line
- count) */
+ handle_T handle; // unique id for the buffer (buffer number)
+#define b_fnum handle
+
+ memline_T b_ml; // associated memline (also contains line count
buf_T *b_next; /* links in list of buffers */
buf_T *b_prev;
int b_nwindows; /* nr of windows open on this buffer */
- int b_flags; /* various BF_ flags */
- bool b_closing; /* buffer is being closed, don't let
- autocommands close it too. */
+ int b_flags; // various BF_ flags
+ int b_locked; // Buffer is being closed or referenced, don't
+ // let autocommands wipe it out.
- /*
- * b_ffname has the full path of the file (NULL for no name).
- * b_sfname is the name as the user typed it (or NULL).
- * b_fname is the same as b_sfname, unless ":cd" has been done,
- * then it is the same as b_ffname (NULL for no name).
- */
- char_u *b_ffname; /* full path file name */
- char_u *b_sfname; /* short file name */
- char_u *b_fname; /* current file name */
+ //
+ // b_ffname has the full path of the file (NULL for no name).
+ // b_sfname is the name as the user typed it (or NULL).
+ // b_fname is the same as b_sfname, unless ":cd" has been done,
+ // then it is the same as b_ffname (NULL for no name).
+ //
+ char_u *b_ffname; // full path file name
+ char_u *b_sfname; // short file name
+ char_u *b_fname; // current file name
bool file_id_valid;
FileID file_id;
- int b_fnum; /* buffer number for this file. */
+ int b_changed; // 'modified': Set to true if something in the
+ // file has been changed and not written out.
- bool b_changed; /* 'modified': Set to true if something in the
- file has been changed and not written out. */
- int b_changedtick; /* incremented for each change, also for undo */
+ /// Change identifier incremented for each change, including undo
+ ///
+ /// This is a dictionary item used to store in b:changedtick.
+ ChangedtickDictItem changedtick_di;
+
+ varnumber_T b_last_changedtick; // b:changedtick when TextChanged or
+ // TextChangedI was last triggered.
+ varnumber_T b_last_changedtick_pum; // b:changedtick when TextChangedP was
+ // last triggered.
bool b_saving; /* Set to true if we are in the middle of
saving the buffer. */
@@ -539,8 +549,8 @@ struct file_buffer {
*/
uint64_t b_chartab[4];
- /* Table used for mappings local to a buffer. */
- mapblock_T *(b_maphash[256]);
+ // Table used for mappings local to a buffer.
+ mapblock_T *(b_maphash[MAX_MAPHASH]);
/* First abbreviation local to a buffer. */
mapblock_T *b_first_abbr;
@@ -579,12 +589,12 @@ struct file_buffer {
bool b_scanned; /* ^N/^P have scanned this buffer */
- /* flags for use of ":lmap" and IM control */
- long b_p_iminsert; /* input mode for insert */
- long b_p_imsearch; /* input mode for search */
-#define B_IMODE_USE_INSERT -1 /* Use b_p_iminsert value for search */
-#define B_IMODE_NONE 0 /* Input via none */
-#define B_IMODE_LMAP 1 /* Input via langmap */
+ // flags for use of ":lmap" and IM control
+ long b_p_iminsert; // input mode for insert
+ long b_p_imsearch; // input mode for search
+#define B_IMODE_USE_INSERT -1 // Use b_p_iminsert value for search
+#define B_IMODE_NONE 0 // Input via none
+#define B_IMODE_LMAP 1 // Input via langmap
# define B_IMODE_LAST 1
short b_kmap_state; /* using "lmap" mappings */
@@ -599,7 +609,7 @@ struct file_buffer {
*/
bool b_p_initialized; /* set when options initialized */
- int b_p_scriptID[BV_COUNT]; /* SIDs for buffer-local options */
+ LastSet b_p_scriptID[BV_COUNT]; // SIDs for buffer-local options
int b_p_ai; ///< 'autoindent'
int b_p_ai_nopaste; ///< b_p_ai saved for paste mode
@@ -610,7 +620,9 @@ struct file_buffer {
int b_p_bomb; ///< 'bomb'
char_u *b_p_bh; ///< 'bufhidden'
char_u *b_p_bt; ///< 'buftype'
+ int b_has_qf_entry; ///< quickfix exists for buffer
int b_p_bl; ///< 'buflisted'
+ long b_p_channel; ///< 'channel'
int b_p_cin; ///< 'cindent'
char_u *b_p_cino; ///< 'cinoptions'
char_u *b_p_cink; ///< 'cinkeys'
@@ -639,10 +651,12 @@ struct file_buffer {
char_u *b_p_inde; ///< 'indentexpr'
uint32_t b_p_inde_flags; ///< flags for 'indentexpr'
char_u *b_p_indk; ///< 'indentkeys'
+ char_u *b_p_fp; ///< 'formatprg'
char_u *b_p_fex; ///< 'formatexpr'
uint32_t b_p_fex_flags; ///< flags for 'formatexpr'
char_u *b_p_kp; ///< 'keywordprg'
int b_p_lisp; ///< 'lisp'
+ char_u *b_p_menc; ///< 'makeencoding'
char_u *b_p_mps; ///< 'matchpairs'
int b_p_ml; ///< 'modeline'
int b_p_ml_nobin; ///< b_p_ml saved for binary mode
@@ -652,11 +666,12 @@ struct file_buffer {
char_u *b_p_qe; ///< 'quoteescape'
int b_p_ro; ///< 'readonly'
long b_p_sw; ///< 'shiftwidth'
+ long b_p_scbk; ///< 'scrollback'
int b_p_si; ///< 'smartindent'
long b_p_sts; ///< 'softtabstop'
long b_p_sts_nopaste; ///< b_p_sts saved for paste mode
char_u *b_p_sua; ///< 'suffixesadd'
- bool b_p_swf; ///< 'swapfile'
+ int b_p_swf; ///< 'swapfile'
long b_p_smc; ///< 'synmaxcol'
char_u *b_p_syn; ///< 'syntax'
long b_p_ts; ///< 'tabstop'
@@ -722,6 +737,7 @@ struct file_buffer {
int b_ind_hash_comment;
int b_ind_cpp_namespace;
int b_ind_if_for_while;
+ int b_ind_cpp_extern_c;
linenr_T b_no_eol_lnum; /* non-zero lnum when last line of next binary
* write should not have an end-of-line */
@@ -732,8 +748,8 @@ struct file_buffer {
int b_bad_char; /* "++bad=" argument when edit started or 0 */
int b_start_bomb; /* 'bomb' when it was read */
- dictitem_T b_bufvar; /* variable for "b:" Dictionary */
- dict_T *b_vars; /* internal variables, local to buffer */
+ ScopeDictDictItem b_bufvar; ///< Variable for "b:" Dictionary.
+ dict_T *b_vars; ///< b: scope dictionary.
/* When a buffer is created, it starts without a swap file. b_may_swap is
* then set to indicate that a swap file may be opened later. It is reset
@@ -746,7 +762,7 @@ struct file_buffer {
/* Two special kinds of buffers:
* help buffer - used for help files, won't use a swap file.
* spell buffer - used for spell info, never displayed and doesn't have a
- * file name.
+ * file name.
*/
bool b_help; /* TRUE for help file buffer (when set b_p_bt
is "help") */
@@ -766,13 +782,21 @@ struct file_buffer {
int b_mapped_ctrl_c; // modes where CTRL-C is mapped
- bufhl_info_T *b_bufhl_info; // buffer stored highlights
+ BufhlInfo b_bufhl_info; // buffer stored highlights
+
+ kvec_t(BufhlLine *) b_bufhl_move_space; // temporary space for highlights
+
+ // array of channelids which have asked to receive updates for this
+ // buffer.
+ kvec_t(uint64_t) update_channels;
+
+ int b_diff_failed; // internal diff failed for this buffer
};
/*
* Stuff for diff mode.
*/
-# define DB_COUNT 4 /* up to four buffers can be diff'ed */
+# define DB_COUNT 8 // up to four buffers can be diff'ed
/*
* Each diffblock defines where a block of lines starts in each of the buffers
@@ -799,33 +823,32 @@ struct diffblock_S {
# define SNAP_AUCMD_IDX 1
# define SNAP_COUNT 2
-/*
- * Tab pages point to the top frame of each tab page.
- * Note: Most values are NOT valid for the current tab page! Use "curwin",
- * "firstwin", etc. for that. "tp_topframe" is always valid and can be
- * compared against "topframe" to find the current tab page.
- */
+/// Tab pages point to the top frame of each tab page.
+/// Note: Most values are NOT valid for the current tab page! Use "curwin",
+/// "firstwin", etc. for that. "tp_topframe" is always valid and can be
+/// compared against "topframe" to find the current tab page.
typedef struct tabpage_S tabpage_T;
struct tabpage_S {
- uint64_t handle;
- tabpage_T *tp_next; /* next tabpage or NULL */
- frame_T *tp_topframe; /* topframe for the windows */
- win_T *tp_curwin; /* current window in this Tab page */
- win_T *tp_prevwin; /* previous window in this Tab page */
- win_T *tp_firstwin; /* first window in this Tab page */
- win_T *tp_lastwin; /* last window in this Tab page */
- long tp_old_Rows; /* Rows when Tab page was left */
- long tp_old_Columns; /* Columns when Tab page was left */
- long tp_ch_used; /* value of 'cmdheight' when frame size
- was set */
+ handle_T handle;
+ tabpage_T *tp_next; ///< next tabpage or NULL
+ frame_T *tp_topframe; ///< topframe for the windows
+ win_T *tp_curwin; ///< current window in this Tab page
+ win_T *tp_prevwin; ///< previous window in this Tab page
+ win_T *tp_firstwin; ///< first window in this Tab page
+ win_T *tp_lastwin; ///< last window in this Tab page
+ long tp_old_Rows; ///< Rows when Tab page was left
+ long tp_old_Columns; ///< Columns when Tab page was left
+ long tp_ch_used; ///< value of 'cmdheight' when frame size
+ ///< was set
+
diff_T *tp_first_diff;
buf_T *(tp_diffbuf[DB_COUNT]);
- int tp_diff_invalid; ///< list of diffs is outdated */
+ int tp_diff_invalid; ///< list of diffs is outdated
+ int tp_diff_update; ///< update diffs before redrawing
frame_T *(tp_snapshot[SNAP_COUNT]); ///< window layout snapshots
- dictitem_T tp_winvar; ///< variable for "t:" Dictionary
- dict_T *tp_vars; ///< internal variables, local to tab page
- char_u *localdir; ///< Absolute path of local directory or
- ///< NULL
+ ScopeDictDictItem tp_winvar; ///< Variable for "t:" Dictionary.
+ dict_T *tp_vars; ///< Internal variables, local to tab page.
+ char_u *tp_localdir; ///< Absolute path of local cwd or NULL.
};
/*
@@ -879,16 +902,17 @@ struct frame_S {
* match functions there is a different pattern for each window.
*/
typedef struct {
- regmmatch_T rm; /* points to the regexp program; contains last found
- match (may continue in next line) */
- buf_T *buf; /* the buffer to search for a match */
- linenr_T lnum; /* the line to search for a match */
- int attr; /* attributes to be used for a match */
- int attr_cur; /* attributes currently active in win_line() */
- linenr_T first_lnum; /* first lnum to search for multi-line pat */
- colnr_T startcol; /* in win_line() points to char where HL starts */
- colnr_T endcol; /* in win_line() points to char where HL ends */
- proftime_T tm; /* for a time limit */
+ regmmatch_T rm; // points to the regexp program; contains last found
+ // match (may continue in next line)
+ buf_T *buf; // the buffer to search for a match
+ linenr_T lnum; // the line to search for a match
+ int attr; // attributes to be used for a match
+ int attr_cur; // attributes currently active in win_line()
+ linenr_T first_lnum; // first lnum to search for multi-line pat
+ colnr_T startcol; // in win_line() points to char where HL starts
+ colnr_T endcol; // in win_line() points to char where HL ends
+ bool is_addpos; // position specified directly by matchaddpos()
+ proftime_T tm; // for a time limit
} match_T;
/// number of positions supported by matchaddpos()
@@ -897,9 +921,9 @@ typedef struct {
/// Same as lpos_T, but with additional field len.
typedef struct
{
- linenr_T lnum; ///< line number
- colnr_T col; ///< column number
- int len; ///< length: 0 - to the end of line
+ linenr_T lnum; ///< line number
+ colnr_T col; ///< column number
+ int len; ///< length: 0 - to the end of line
} llpos_T;
/// posmatch_T provides an array for storing match items for matchaddpos()
@@ -907,10 +931,10 @@ typedef struct
typedef struct posmatch posmatch_T;
struct posmatch
{
- llpos_T pos[MAXPOSMATCH]; ///< array of positions
- int cur; ///< internal position counter
- linenr_T toplnum; ///< top buffer line
- linenr_T botlnum; ///< bottom buffer line
+ llpos_T pos[MAXPOSMATCH]; ///< array of positions
+ int cur; ///< internal position counter
+ linenr_T toplnum; ///< top buffer line
+ linenr_T botlnum; ///< bottom buffer line
};
/*
@@ -936,12 +960,21 @@ struct matchitem {
* All row numbers are relative to the start of the window, except w_winrow.
*/
struct window_S {
- uint64_t handle;
- buf_T *w_buffer; /* buffer we are a window into (used
- often, keep it the first item!) */
+ handle_T handle; ///< unique identifier for the window
+
+ buf_T *w_buffer; ///< buffer we are a window into (used
+ ///< often, keep it the first item!)
synblock_T *w_s; /* for :ownsyntax */
+ int w_hl_id_normal; ///< 'winhighlight' normal id
+ int w_hl_attr_normal; ///< 'winhighlight' normal final attrs
+
+ int w_hl_ids[HLF_COUNT]; ///< 'winhighlight' id
+ int w_hl_attrs[HLF_COUNT]; ///< 'winhighlight' final attrs
+
+ int w_hl_needs_update; ///< attrs need to be recalculated
+
win_T *w_prev; /* link to previous window */
win_T *w_next; /* link to next window */
bool w_closing; /* window is being closed, don't let
@@ -955,9 +988,11 @@ struct window_S {
used to try to stay in the same column
for up/down cursor motions. */
- int w_set_curswant; /* If set, then update w_curswant the next
- time through cursupdate() to the
- current virtual column */
+ int w_set_curswant; // If set, then update w_curswant the next
+ // time through cursupdate() to the
+ // current virtual column
+
+ linenr_T w_last_cursorline; ///< where last 'cursorline' was drawn
// the next seven are used to update the visual part
char w_old_visual_mode; ///< last known VIsual_mode
@@ -1006,7 +1041,7 @@ struct window_S {
* Recomputing is minimized by storing the result of computations.
* Use functions in screen.c to check if they are valid and to update.
* w_valid is a bitfield of flags, which indicate if specific values are
- * valid or need to be recomputed.
+ * valid or need to be recomputed.
*/
int w_valid;
pos_T w_valid_cursor; /* last known position of w_cursor, used
@@ -1036,11 +1071,11 @@ struct window_S {
*/
int w_wrow, w_wcol; /* cursor position in window */
- linenr_T w_botline; /* number of the line below the bottom of
- the screen */
- int w_empty_rows; /* number of ~ rows in window */
- int w_filler_rows; /* number of filler rows at the end of the
- window */
+ linenr_T w_botline; // number of the line below the bottom of
+ // the window
+ int w_empty_rows; // number of ~ rows in window
+ int w_filler_rows; // number of filler rows at the end of the
+ // window
/*
* Info about the lines currently in the window is remembered to avoid
@@ -1115,8 +1150,8 @@ struct window_S {
long w_scbind_pos;
- dictitem_T w_winvar; /* variable for "w:" Dictionary */
- dict_T *w_vars; /* internal variables, local to window */
+ ScopeDictDictItem w_winvar; ///< Variable for "w:" dictionary.
+ dict_T *w_vars; ///< Dictionary with w: variables.
int w_farsi; /* for the window dependent Farsi functions */
@@ -1150,6 +1185,9 @@ struct window_S {
int w_tagstackidx; /* idx just below active entry */
int w_tagstacklen; /* number of tags on stack */
+ ScreenGrid w_grid; // the grid specific to the window
+ bool w_pos_changed; // true if window position changed
+
/*
* w_fraction is the fractional row of the cursor within the window, from
* 0 at the top row to FRACTION_MULT at the last row.
@@ -1171,4 +1209,13 @@ struct window_S {
qf_info_T *w_llist_ref;
};
+static inline int win_hl_attr(win_T *wp, int hlf)
+{
+ return wp->w_hl_attrs[hlf];
+}
+
+/// Macros defined in Vim, but not in Neovim
+#define CHANGEDTICK(buf) \
+ (=== Include buffer.h & use buf_(get|set|inc)_changedtick ===)
+
#endif // NVIM_BUFFER_DEFS_H
diff --git a/src/nvim/buffer_updates.c b/src/nvim/buffer_updates.c
new file mode 100644
index 0000000000..9d9c998a68
--- /dev/null
+++ b/src/nvim/buffer_updates.c
@@ -0,0 +1,211 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+#include "nvim/buffer_updates.h"
+#include "nvim/memline.h"
+#include "nvim/api/private/helpers.h"
+#include "nvim/msgpack_rpc/channel.h"
+#include "nvim/assert.h"
+#include "nvim/buffer.h"
+
+// Register a channel. Return True if the channel was added, or already added.
+// Return False if the channel couldn't be added because the buffer is
+// unloaded.
+bool buf_updates_register(buf_T *buf, uint64_t channel_id, bool send_buffer)
+{
+ // must fail if the buffer isn't loaded
+ if (buf->b_ml.ml_mfp == NULL) {
+ return false;
+ }
+
+ // count how many channels are currently watching the buffer
+ size_t size = kv_size(buf->update_channels);
+ if (size) {
+ for (size_t i = 0; i < size; i++) {
+ if (kv_A(buf->update_channels, i) == channel_id) {
+ // buffer is already registered ... nothing to do
+ return true;
+ }
+ }
+ }
+
+ // append the channelid to the list
+ kv_push(buf->update_channels, channel_id);
+
+ if (send_buffer) {
+ Array args = ARRAY_DICT_INIT;
+ args.size = 6;
+ args.items = xcalloc(sizeof(Object), args.size);
+
+ // the first argument is always the buffer handle
+ args.items[0] = BUFFER_OBJ(buf->handle);
+ args.items[1] = INTEGER_OBJ(buf_get_changedtick(buf));
+ // the first line that changed (zero-indexed)
+ args.items[2] = INTEGER_OBJ(0);
+ // the last line that was changed
+ args.items[3] = INTEGER_OBJ(-1);
+ Array linedata = ARRAY_DICT_INIT;
+
+ // collect buffer contents
+
+ STATIC_ASSERT(SIZE_MAX >= MAXLNUM, "size_t smaller than MAXLNUM");
+ size_t line_count = (size_t)buf->b_ml.ml_line_count;
+
+ if (line_count >= 1) {
+ linedata.size = line_count;
+ linedata.items = xcalloc(sizeof(Object), line_count);
+
+ buf_collect_lines(buf, line_count, 1, true, &linedata, NULL);
+ }
+
+ args.items[4] = ARRAY_OBJ(linedata);
+ args.items[5] = BOOLEAN_OBJ(false);
+
+ rpc_send_event(channel_id, "nvim_buf_lines_event", args);
+ } else {
+ buf_updates_changedtick_single(buf, channel_id);
+ }
+
+ return true;
+}
+
+void buf_updates_send_end(buf_T *buf, uint64_t channelid)
+{
+ Array args = ARRAY_DICT_INIT;
+ args.size = 1;
+ args.items = xcalloc(sizeof(Object), args.size);
+ args.items[0] = BUFFER_OBJ(buf->handle);
+ rpc_send_event(channelid, "nvim_buf_detach_event", args);
+}
+
+void buf_updates_unregister(buf_T *buf, uint64_t channelid)
+{
+ size_t size = kv_size(buf->update_channels);
+ if (!size) {
+ return;
+ }
+
+ // go through list backwards and remove the channel id each time it appears
+ // (it should never appear more than once)
+ size_t j = 0;
+ size_t found = 0;
+ for (size_t i = 0; i < size; i++) {
+ if (kv_A(buf->update_channels, i) == channelid) {
+ found++;
+ } else {
+ // copy item backwards into prior slot if needed
+ if (i != j) {
+ kv_A(buf->update_channels, j) = kv_A(buf->update_channels, i);
+ }
+ j++;
+ }
+ }
+
+ if (found) {
+ // remove X items from the end of the array
+ buf->update_channels.size -= found;
+
+ // make a new copy of the active array without the channelid in it
+ buf_updates_send_end(buf, channelid);
+
+ if (found == size) {
+ kv_destroy(buf->update_channels);
+ kv_init(buf->update_channels);
+ }
+ }
+}
+
+void buf_updates_unregister_all(buf_T *buf)
+{
+ size_t size = kv_size(buf->update_channels);
+ if (size) {
+ for (size_t i = 0; i < size; i++) {
+ buf_updates_send_end(buf, kv_A(buf->update_channels, i));
+ }
+ kv_destroy(buf->update_channels);
+ kv_init(buf->update_channels);
+ }
+}
+
+void buf_updates_send_changes(buf_T *buf,
+ linenr_T firstline,
+ int64_t num_added,
+ int64_t num_removed,
+ bool send_tick)
+{
+ // if one the channels doesn't work, put its ID here so we can remove it later
+ uint64_t badchannelid = 0;
+
+ // notify each of the active channels
+ for (size_t i = 0; i < kv_size(buf->update_channels); i++) {
+ uint64_t channelid = kv_A(buf->update_channels, i);
+
+ // send through the changes now channel contents now
+ Array args = ARRAY_DICT_INIT;
+ args.size = 6;
+ args.items = xcalloc(sizeof(Object), args.size);
+
+ // the first argument is always the buffer handle
+ args.items[0] = BUFFER_OBJ(buf->handle);
+
+ // next argument is b:changedtick
+ args.items[1] = send_tick ? INTEGER_OBJ(buf_get_changedtick(buf)) : NIL;
+
+ // the first line that changed (zero-indexed)
+ args.items[2] = INTEGER_OBJ(firstline - 1);
+
+ // the last line that was changed
+ args.items[3] = INTEGER_OBJ(firstline - 1 + num_removed);
+
+ // linedata of lines being swapped in
+ Array linedata = ARRAY_DICT_INIT;
+ if (num_added > 0) {
+ STATIC_ASSERT(SIZE_MAX >= MAXLNUM, "size_t smaller than MAXLNUM");
+ linedata.size = (size_t)num_added;
+ linedata.items = xcalloc(sizeof(Object), (size_t)num_added);
+ buf_collect_lines(buf, (size_t)num_added, firstline, true, &linedata,
+ NULL);
+ }
+ args.items[4] = ARRAY_OBJ(linedata);
+ args.items[5] = BOOLEAN_OBJ(false);
+ if (!rpc_send_event(channelid, "nvim_buf_lines_event", args)) {
+ // We can't unregister the channel while we're iterating over the
+ // update_channels array, so we remember its ID to unregister it at
+ // the end.
+ badchannelid = channelid;
+ }
+ }
+
+ // We can only ever remove one dead channel at a time. This is OK because the
+ // change notifications are so frequent that many dead channels will be
+ // cleared up quickly.
+ if (badchannelid != 0) {
+ ELOG("Disabling buffer updates for dead channel %"PRIu64, badchannelid);
+ buf_updates_unregister(buf, badchannelid);
+ }
+}
+
+void buf_updates_changedtick(buf_T *buf)
+{
+ // notify each of the active channels
+ for (size_t i = 0; i < kv_size(buf->update_channels); i++) {
+ uint64_t channel_id = kv_A(buf->update_channels, i);
+ buf_updates_changedtick_single(buf, channel_id);
+ }
+}
+
+void buf_updates_changedtick_single(buf_T *buf, uint64_t channel_id)
+{
+ Array args = ARRAY_DICT_INIT;
+ args.size = 2;
+ args.items = xcalloc(sizeof(Object), args.size);
+
+ // the first argument is always the buffer handle
+ args.items[0] = BUFFER_OBJ(buf->handle);
+
+ // next argument is b:changedtick
+ args.items[1] = INTEGER_OBJ(buf_get_changedtick(buf));
+
+ // don't try and clean up dead channels here
+ rpc_send_event(channel_id, "nvim_buf_changedtick_event", args);
+}
diff --git a/src/nvim/buffer_updates.h b/src/nvim/buffer_updates.h
new file mode 100644
index 0000000000..b2d0a62270
--- /dev/null
+++ b/src/nvim/buffer_updates.h
@@ -0,0 +1,10 @@
+#ifndef NVIM_BUFFER_UPDATES_H
+#define NVIM_BUFFER_UPDATES_H
+
+#include "nvim/buffer_defs.h"
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "buffer_updates.h.generated.h"
+#endif
+
+#endif // NVIM_BUFFER_UPDATES_H
diff --git a/src/nvim/bufhl_defs.h b/src/nvim/bufhl_defs.h
index e47bb2a238..d0fb40ab88 100644
--- a/src/nvim/bufhl_defs.h
+++ b/src/nvim/bufhl_defs.h
@@ -3,23 +3,39 @@
#include "nvim/pos.h"
#include "nvim/lib/kvec.h"
+#include "nvim/lib/kbtree.h"
+
// bufhl: buffer specific highlighting
-struct bufhl_hl_item
-{
+typedef struct {
int src_id;
int hl_id; // highlight group
colnr_T start; // first column to highlight
colnr_T stop; // last column to highlight
-};
-typedef struct bufhl_hl_item bufhl_hl_item_T;
+} BufhlItem;
+
+typedef struct {
+ char *text;
+ int hl_id;
+} VirtTextChunk;
+
+typedef kvec_t(VirtTextChunk) VirtText;
-typedef kvec_t(struct bufhl_hl_item) bufhl_vec_T;
+typedef struct {
+ linenr_T line;
+ kvec_t(BufhlItem) items;
+ int virt_text_src;
+ VirtText virt_text;
+} BufhlLine;
+#define BUFHLLINE_INIT(l) { l, KV_INITIAL_VALUE, 0, KV_INITIAL_VALUE }
typedef struct {
- bufhl_vec_T entries;
+ BufhlLine *line;
int current;
colnr_T valid_to;
-} bufhl_lineinfo_T;
+} BufhlLineInfo;
+#define BUFHL_CMP(a, b) ((int)(((a)->line - (b)->line)))
+KBTREE_INIT(bufhl, BufhlLine *, BUFHL_CMP, 10) // -V512
+typedef kbtree_t(bufhl) BufhlInfo;
#endif // NVIM_BUFHL_DEFS_H
diff --git a/src/nvim/channel.c b/src/nvim/channel.c
new file mode 100644
index 0000000000..8b8d27affd
--- /dev/null
+++ b/src/nvim/channel.c
@@ -0,0 +1,831 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+#include "nvim/api/private/helpers.h"
+#include "nvim/api/ui.h"
+#include "nvim/channel.h"
+#include "nvim/eval.h"
+#include "nvim/eval/encode.h"
+#include "nvim/event/socket.h"
+#include "nvim/fileio.h"
+#include "nvim/msgpack_rpc/channel.h"
+#include "nvim/msgpack_rpc/server.h"
+#include "nvim/os/shell.h"
+#include "nvim/path.h"
+#include "nvim/ascii.h"
+
+static bool did_stdio = false;
+PMap(uint64_t) *channels = NULL;
+
+/// next free id for a job or rpc channel
+/// 1 is reserved for stdio channel
+/// 2 is reserved for stderr channel
+static uint64_t next_chan_id = CHAN_STDERR+1;
+
+
+typedef struct {
+ Channel *chan;
+ Callback *callback;
+ const char *type;
+ // if reader is set, status is ignored.
+ CallbackReader *reader;
+ int status;
+} ChannelEvent;
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "channel.c.generated.h"
+#endif
+/// Teardown the module
+void channel_teardown(void)
+{
+ if (!channels) {
+ return;
+ }
+
+ Channel *channel;
+
+ map_foreach_value(channels, channel, {
+ channel_close(channel->id, kChannelPartAll, NULL);
+ });
+}
+
+/// Closes a channel
+///
+/// @param id The channel id
+/// @return true if successful, false otherwise
+bool channel_close(uint64_t id, ChannelPart part, const char **error)
+{
+ Channel *chan;
+ Process *proc;
+
+ const char *dummy;
+ if (!error) {
+ error = &dummy;
+ }
+
+ if (!(chan = find_channel(id))) {
+ if (id < next_chan_id) {
+ // allow double close, even though we can't say what parts was valid.
+ return true;
+ }
+ *error = (const char *)e_invchan;
+ return false;
+ }
+
+ bool close_main = false;
+ if (part == kChannelPartRpc || part == kChannelPartAll) {
+ close_main = true;
+ if (chan->is_rpc) {
+ rpc_close(chan);
+ } else if (part == kChannelPartRpc) {
+ *error = (const char *)e_invstream;
+ return false;
+ }
+ } else if ((part == kChannelPartStdin || part == kChannelPartStdout)
+ && chan->is_rpc) {
+ *error = (const char *)e_invstreamrpc;
+ return false;
+ }
+
+ switch (chan->streamtype) {
+ case kChannelStreamSocket:
+ if (!close_main) {
+ *error = (const char *)e_invstream;
+ return false;
+ }
+ stream_may_close(&chan->stream.socket);
+ break;
+
+ case kChannelStreamProc:
+ proc = (Process *)&chan->stream.proc;
+ if (part == kChannelPartStdin || close_main) {
+ stream_may_close(&proc->in);
+ }
+ if (part == kChannelPartStdout || close_main) {
+ stream_may_close(&proc->out);
+ }
+ if (part == kChannelPartStderr || part == kChannelPartAll) {
+ stream_may_close(&proc->err);
+ }
+ if (proc->type == kProcessTypePty && part == kChannelPartAll) {
+ pty_process_close_master(&chan->stream.pty);
+ }
+
+ break;
+
+ case kChannelStreamStdio:
+ if (part == kChannelPartStdin || close_main) {
+ stream_may_close(&chan->stream.stdio.in);
+ }
+ if (part == kChannelPartStdout || close_main) {
+ stream_may_close(&chan->stream.stdio.out);
+ }
+ if (part == kChannelPartStderr) {
+ *error = (const char *)e_invstream;
+ return false;
+ }
+ break;
+
+ case kChannelStreamStderr:
+ if (part != kChannelPartAll && part != kChannelPartStderr) {
+ *error = (const char *)e_invstream;
+ return false;
+ }
+ if (!chan->stream.err.closed) {
+ chan->stream.err.closed = true;
+ // Don't close on exit, in case late error messages
+ if (!exiting) {
+ fclose(stderr);
+ }
+ channel_decref(chan);
+ }
+ break;
+
+ case kChannelStreamInternal:
+ if (!close_main) {
+ *error = (const char *)e_invstream;
+ return false;
+ }
+ break;
+
+ default:
+ abort();
+ }
+
+ return true;
+}
+
+/// Initializes the module
+void channel_init(void)
+{
+ channels = pmap_new(uint64_t)();
+ channel_alloc(kChannelStreamStderr);
+ rpc_init();
+}
+
+/// Allocates a channel.
+///
+/// Channel is allocated with refcount 1, which should be decreased
+/// when the underlying stream closes.
+static Channel *channel_alloc(ChannelStreamType type)
+{
+ Channel *chan = xcalloc(1, sizeof(*chan));
+ if (type == kChannelStreamStdio) {
+ chan->id = CHAN_STDIO;
+ } else if (type == kChannelStreamStderr) {
+ chan->id = CHAN_STDERR;
+ } else {
+ chan->id = next_chan_id++;
+ }
+ chan->events = multiqueue_new_child(main_loop.events);
+ chan->refcount = 1;
+ chan->streamtype = type;
+ pmap_put(uint64_t)(channels, chan->id, chan);
+ return chan;
+}
+
+void channel_create_event(Channel *chan, const char *ext_source)
+{
+#if MIN_LOG_LEVEL <= INFO_LOG_LEVEL
+ const char *source;
+
+ if (ext_source) {
+ // TODO(bfredl): in a future improved traceback solution,
+ // external events should be included.
+ source = ext_source;
+ } else {
+ eval_fmt_source_name_line((char *)IObuff, sizeof(IObuff));
+ source = (const char *)IObuff;
+ }
+
+ Dictionary info = channel_info(chan->id);
+ typval_T tv = TV_INITIAL_VALUE;
+ // TODO(bfredl): do the conversion in one step. Also would be nice
+ // to pretty print top level dict in defined order
+ (void)object_to_vim(DICTIONARY_OBJ(info), &tv, NULL);
+ char *str = encode_tv2json(&tv, NULL);
+ ILOG("new channel %" PRIu64 " (%s) : %s", chan->id, source, str);
+ xfree(str);
+ api_free_dictionary(info);
+
+#else
+ (void)ext_source;
+#endif
+
+ channel_info_changed(chan, true);
+}
+
+void channel_incref(Channel *chan)
+{
+ chan->refcount++;
+}
+
+void channel_decref(Channel *chan)
+{
+ if (!(--chan->refcount)) {
+ // delay free, so that libuv is done with the handles
+ multiqueue_put(main_loop.events, free_channel_event, 1, chan);
+ }
+}
+
+void callback_reader_free(CallbackReader *reader)
+{
+ callback_free(&reader->cb);
+ ga_clear(&reader->buffer);
+}
+
+void callback_reader_start(CallbackReader *reader)
+{
+ ga_init(&reader->buffer, sizeof(char *), 32);
+}
+
+static void free_channel_event(void **argv)
+{
+ Channel *chan = argv[0];
+ if (chan->is_rpc) {
+ rpc_free(chan);
+ }
+
+ callback_reader_free(&chan->on_stdout);
+ callback_reader_free(&chan->on_stderr);
+ callback_free(&chan->on_exit);
+
+ pmap_del(uint64_t)(channels, chan->id);
+ multiqueue_free(chan->events);
+ xfree(chan);
+}
+
+static void channel_destroy_early(Channel *chan)
+{
+ if ((chan->id != --next_chan_id)) {
+ abort();
+ }
+ pmap_del(uint64_t)(channels, chan->id);
+ chan->id = 0;
+
+ if ((--chan->refcount != 0)) {
+ abort();
+ }
+
+ // uv will keep a reference to handles until next loop tick, so delay free
+ multiqueue_put(main_loop.events, free_channel_event, 1, chan);
+}
+
+
+static void close_cb(Stream *stream, void *data)
+{
+ channel_decref(data);
+}
+
+Channel *channel_job_start(char **argv, CallbackReader on_stdout,
+ CallbackReader on_stderr, Callback on_exit,
+ bool pty, bool rpc, bool detach, const char *cwd,
+ uint16_t pty_width, uint16_t pty_height,
+ char *term_name, varnumber_T *status_out)
+{
+ assert(cwd == NULL || os_isdir_executable(cwd));
+
+ Channel *chan = channel_alloc(kChannelStreamProc);
+ chan->on_stdout = on_stdout;
+ chan->on_stderr = on_stderr;
+ chan->on_exit = on_exit;
+
+ if (pty) {
+ if (detach) {
+ EMSG2(_(e_invarg2), "terminal/pty job cannot be detached");
+ shell_free_argv(argv);
+ xfree(term_name);
+ channel_destroy_early(chan);
+ *status_out = 0;
+ return NULL;
+ }
+ chan->stream.pty = pty_process_init(&main_loop, chan);
+ if (pty_width > 0) {
+ chan->stream.pty.width = pty_width;
+ }
+ if (pty_height > 0) {
+ chan->stream.pty.height = pty_height;
+ }
+ if (term_name) {
+ chan->stream.pty.term_name = term_name;
+ }
+ } else {
+ chan->stream.uv = libuv_process_init(&main_loop, chan);
+ }
+
+ Process *proc = (Process *)&chan->stream.proc;
+ proc->argv = argv;
+ proc->cb = channel_process_exit_cb;
+ proc->events = chan->events;
+ proc->detach = detach;
+ proc->cwd = cwd;
+
+ char *cmd = xstrdup(proc->argv[0]);
+ bool has_out, has_err;
+ if (proc->type == kProcessTypePty) {
+ has_out = true;
+ has_err = false;
+ } else {
+ has_out = rpc || callback_reader_set(chan->on_stdout);
+ has_err = callback_reader_set(chan->on_stderr);
+ }
+ int status = process_spawn(proc, true, has_out, has_err);
+ if (status) {
+ EMSG3(_(e_jobspawn), os_strerror(status), cmd);
+ xfree(cmd);
+ if (proc->type == kProcessTypePty) {
+ xfree(chan->stream.pty.term_name);
+ }
+ channel_destroy_early(chan);
+ *status_out = proc->status;
+ return NULL;
+ }
+ xfree(cmd);
+
+ wstream_init(&proc->in, 0);
+ if (has_out) {
+ rstream_init(&proc->out, 0);
+ }
+
+ if (rpc) {
+ // the rpc takes over the in and out streams
+ rpc_start(chan);
+ } else {
+ if (has_out) {
+ callback_reader_start(&chan->on_stdout);
+ rstream_start(&proc->out, on_job_stdout, chan);
+ }
+ }
+
+ if (has_err) {
+ callback_reader_start(&chan->on_stderr);
+ rstream_init(&proc->err, 0);
+ rstream_start(&proc->err, on_job_stderr, chan);
+ }
+
+ *status_out = (varnumber_T)chan->id;
+ return chan;
+}
+
+
+uint64_t channel_connect(bool tcp, const char *address,
+ bool rpc, CallbackReader on_output,
+ int timeout, const char **error)
+{
+ Channel *channel;
+
+ if (!tcp && rpc) {
+ char *path = fix_fname(address);
+ bool loopback = server_owns_pipe_address(path);
+ xfree(path);
+ if (loopback) {
+ // Create a loopback channel. This avoids deadlock if nvim connects to
+ // its own named pipe.
+ channel = channel_alloc(kChannelStreamInternal);
+ rpc_start(channel);
+ goto end;
+ }
+ }
+
+ channel = channel_alloc(kChannelStreamSocket);
+ if (!socket_connect(&main_loop, &channel->stream.socket,
+ tcp, address, timeout, error)) {
+ channel_destroy_early(channel);
+ return 0;
+ }
+
+ channel->stream.socket.internal_close_cb = close_cb;
+ channel->stream.socket.internal_data = channel;
+ wstream_init(&channel->stream.socket, 0);
+ rstream_init(&channel->stream.socket, 0);
+
+ if (rpc) {
+ rpc_start(channel);
+ } else {
+ channel->on_stdout = on_output;
+ callback_reader_start(&channel->on_stdout);
+ rstream_start(&channel->stream.socket, on_socket_output, channel);
+ }
+
+end:
+ channel_create_event(channel, address);
+ return channel->id;
+}
+
+/// Creates an RPC channel from a tcp/pipe socket connection
+///
+/// @param watcher The SocketWatcher ready to accept the connection
+void channel_from_connection(SocketWatcher *watcher)
+{
+ Channel *channel = channel_alloc(kChannelStreamSocket);
+ socket_watcher_accept(watcher, &channel->stream.socket);
+ channel->stream.socket.internal_close_cb = close_cb;
+ channel->stream.socket.internal_data = channel;
+ wstream_init(&channel->stream.socket, 0);
+ rstream_init(&channel->stream.socket, 0);
+ rpc_start(channel);
+ channel_create_event(channel, watcher->addr);
+}
+
+/// Creates an API channel from stdin/stdout. This is used when embedding
+/// Neovim
+uint64_t channel_from_stdio(bool rpc, CallbackReader on_output,
+ const char **error)
+ FUNC_ATTR_NONNULL_ALL
+{
+ if (!headless_mode && !embedded_mode) {
+ *error = _("can only be opened in headless mode");
+ return 0;
+ }
+
+ if (did_stdio) {
+ *error = _("channel was already open");
+ return 0;
+ }
+ did_stdio = true;
+
+ Channel *channel = channel_alloc(kChannelStreamStdio);
+
+ rstream_init_fd(&main_loop, &channel->stream.stdio.in, 0, 0);
+ wstream_init_fd(&main_loop, &channel->stream.stdio.out, 1, 0);
+
+ if (rpc) {
+ rpc_start(channel);
+ } else {
+ channel->on_stdout = on_output;
+ callback_reader_start(&channel->on_stdout);
+ rstream_start(&channel->stream.stdio.in, on_stdio_input, channel);
+ }
+
+ return channel->id;
+}
+
+/// @param data will be consumed
+size_t channel_send(uint64_t id, char *data, size_t len, const char **error)
+{
+ Channel *chan = find_channel(id);
+ if (!chan) {
+ EMSG(_(e_invchan));
+ goto err;
+ }
+
+ if (chan->streamtype == kChannelStreamStderr) {
+ if (chan->stream.err.closed) {
+ *error = _("Can't send data to closed stream");
+ goto err;
+ }
+ // unbuffered write
+ size_t written = fwrite(data, len, 1, stderr);
+ xfree(data);
+ return len * written;
+ }
+
+
+ Stream *in = channel_instream(chan);
+ if (in->closed) {
+ *error = _("Can't send data to closed stream");
+ goto err;
+ }
+
+ if (chan->is_rpc) {
+ *error = _("Can't send raw data to rpc channel");
+ goto err;
+ }
+
+ WBuffer *buf = wstream_new_buffer(data, len, 1, xfree);
+ return wstream_write(in, buf) ? len : 0;
+
+err:
+ xfree(data);
+ return 0;
+}
+
+/// Convert binary byte array to a readfile()-style list
+///
+/// @param[in] buf Array to convert.
+/// @param[in] len Array length.
+///
+/// @return [allocated] Converted list.
+static inline list_T *buffer_to_tv_list(const char *const buf, const size_t len)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_ALWAYS_INLINE
+{
+ list_T *const l = tv_list_alloc(kListLenMayKnow);
+ // Empty buffer should be represented by [''], encode_list_write() thinks
+ // empty list is fine for the case.
+ tv_list_append_string(l, "", 0);
+ if (len > 0) {
+ encode_list_write(l, buf, len);
+ }
+ return l;
+}
+
+// vimscript job callbacks must be executed on Nvim main loop
+static inline void process_channel_event(Channel *chan, Callback *callback,
+ const char *type,
+ CallbackReader *reader, int status)
+{
+ assert(callback);
+ ChannelEvent *event_data = xmalloc(sizeof(*event_data));
+ event_data->reader = reader;
+ event_data->status = status;
+ channel_incref(chan); // Hold on ref to callback
+ event_data->chan = chan;
+ event_data->callback = callback;
+ event_data->type = type;
+
+ multiqueue_put(chan->events, on_channel_event, 1, event_data);
+}
+
+void on_job_stdout(Stream *stream, RBuffer *buf, size_t count,
+ void *data, bool eof)
+{
+ Channel *chan = data;
+ on_channel_output(stream, chan, buf, count, eof, &chan->on_stdout, "stdout");
+}
+
+void on_job_stderr(Stream *stream, RBuffer *buf, size_t count,
+ void *data, bool eof)
+{
+ Channel *chan = data;
+ on_channel_output(stream, chan, buf, count, eof, &chan->on_stderr, "stderr");
+}
+
+static void on_socket_output(Stream *stream, RBuffer *buf, size_t count,
+ void *data, bool eof)
+{
+ Channel *chan = data;
+ on_channel_output(stream, chan, buf, count, eof, &chan->on_stdout, "data");
+}
+
+static void on_stdio_input(Stream *stream, RBuffer *buf, size_t count,
+ void *data, bool eof)
+{
+ Channel *chan = data;
+ on_channel_output(stream, chan, buf, count, eof, &chan->on_stdout, "stdin");
+}
+
+/// @param type must have static lifetime
+static void on_channel_output(Stream *stream, Channel *chan, RBuffer *buf,
+ size_t count, bool eof, CallbackReader *reader,
+ const char *type)
+{
+ // stub variable, to keep reading consistent with the order of events, only
+ // consider the count parameter.
+ size_t r;
+ char *ptr = rbuffer_read_ptr(buf, &r);
+
+ if (eof) {
+ if (reader->buffered) {
+ if (reader->cb.type != kCallbackNone) {
+ process_channel_event(chan, &reader->cb, type, reader, 0);
+ } else if (reader->self) {
+ if (tv_dict_find(reader->self, type, -1) == NULL) {
+ list_T *data = buffer_to_tv_list(reader->buffer.ga_data,
+ (size_t)reader->buffer.ga_len);
+ tv_dict_add_list(reader->self, type, strlen(type), data);
+ } else {
+ // can't display error message now, defer it.
+ channel_incref(chan);
+ multiqueue_put(chan->events, on_buffered_error, 2, chan, type);
+ }
+ ga_clear(&reader->buffer);
+ } else {
+ abort();
+ }
+ } else if (reader->cb.type != kCallbackNone) {
+ process_channel_event(chan, &reader->cb, type, reader, 0);
+ }
+ return;
+ }
+
+ // The order here matters, the terminal must receive the data first because
+ // process_channel_event will modify the read buffer(convert NULs into NLs)
+ if (chan->term) {
+ terminal_receive(chan->term, ptr, count);
+ terminal_flush_output(chan->term);
+ }
+
+ rbuffer_consumed(buf, count);
+
+ if (callback_reader_set(*reader) || reader->buffered) {
+ // if buffer wasn't consumed, a pending callback is stalled. Aggregate the
+ // received data and avoid a "burst" of multiple callbacks.
+ bool buffer_set = reader->buffer.ga_len > 0;
+ ga_concat_len(&reader->buffer, ptr, count);
+ if (callback_reader_set(*reader) && !reader->buffered && !buffer_set) {
+ process_channel_event(chan, &reader->cb, type, reader, 0);
+ }
+ }
+}
+
+static void on_buffered_error(void **args)
+{
+ Channel *chan = (Channel *)args[0];
+ const char *stream = (const char *)args[1];
+ EMSG3(_(e_streamkey), stream, chan->id);
+ channel_decref(chan);
+}
+
+static void channel_process_exit_cb(Process *proc, int status, void *data)
+{
+ Channel *chan = data;
+ if (chan->term) {
+ char msg[sizeof("\r\n[Process exited ]") + NUMBUFLEN];
+ snprintf(msg, sizeof msg, "\r\n[Process exited %d]", proc->status);
+ terminal_close(chan->term, msg);
+ }
+
+ // If process did not exit, we only closed the handle of a detached process.
+ bool exited = (status >= 0);
+ if (exited) {
+ process_channel_event(chan, &chan->on_exit, "exit", NULL, status);
+ }
+
+ channel_decref(chan);
+}
+
+static void on_channel_event(void **args)
+{
+ ChannelEvent *ev = (ChannelEvent *)args[0];
+
+ typval_T argv[4];
+
+ argv[0].v_type = VAR_NUMBER;
+ argv[0].v_lock = VAR_UNLOCKED;
+ argv[0].vval.v_number = (varnumber_T)ev->chan->id;
+
+ if (ev->reader) {
+ argv[1].v_type = VAR_LIST;
+ argv[1].v_lock = VAR_UNLOCKED;
+ argv[1].vval.v_list = buffer_to_tv_list(ev->reader->buffer.ga_data,
+ (size_t)ev->reader->buffer.ga_len);
+ tv_list_ref(argv[1].vval.v_list);
+ ga_clear(&ev->reader->buffer);
+ } else {
+ argv[1].v_type = VAR_NUMBER;
+ argv[1].v_lock = VAR_UNLOCKED;
+ argv[1].vval.v_number = ev->status;
+ }
+
+ argv[2].v_type = VAR_STRING;
+ argv[2].v_lock = VAR_UNLOCKED;
+ argv[2].vval.v_string = (uint8_t *)ev->type;
+
+ typval_T rettv = TV_INITIAL_VALUE;
+ callback_call(ev->callback, 3, argv, &rettv);
+ tv_clear(&rettv);
+ channel_decref(ev->chan);
+ xfree(ev);
+}
+
+
+/// Open terminal for channel
+///
+/// Channel `chan` is assumed to be an open pty channel,
+/// and curbuf is assumed to be a new, unmodified buffer.
+void channel_terminal_open(Channel *chan)
+{
+ TerminalOptions topts;
+ topts.data = chan;
+ topts.width = chan->stream.pty.width;
+ topts.height = chan->stream.pty.height;
+ topts.write_cb = term_write;
+ topts.resize_cb = term_resize;
+ topts.close_cb = term_close;
+ curbuf->b_p_channel = (long)chan->id; // 'channel' option
+ Terminal *term = terminal_open(topts);
+ chan->term = term;
+ channel_incref(chan);
+}
+
+static void term_write(char *buf, size_t size, void *data)
+{
+ Channel *chan = data;
+ if (chan->stream.proc.in.closed) {
+ // If the backing stream was closed abruptly, there may be write events
+ // ahead of the terminal close event. Just ignore the writes.
+ ILOG("write failed: stream is closed");
+ return;
+ }
+ WBuffer *wbuf = wstream_new_buffer(xmemdup(buf, size), size, 1, xfree);
+ wstream_write(&chan->stream.proc.in, wbuf);
+}
+
+static void term_resize(uint16_t width, uint16_t height, void *data)
+{
+ Channel *chan = data;
+ pty_process_resize(&chan->stream.pty, width, height);
+}
+
+static inline void term_delayed_free(void **argv)
+{
+ Channel *chan = argv[0];
+ if (chan->stream.proc.in.pending_reqs || chan->stream.proc.out.pending_reqs) {
+ multiqueue_put(chan->events, term_delayed_free, 1, chan);
+ return;
+ }
+
+ terminal_destroy(chan->term);
+ chan->term = NULL;
+ channel_decref(chan);
+}
+
+static void term_close(void *data)
+{
+ Channel *chan = data;
+ process_stop(&chan->stream.proc);
+ multiqueue_put(chan->events, term_delayed_free, 1, data);
+}
+
+void channel_info_changed(Channel *chan, bool new)
+{
+ event_T event = new ? EVENT_CHANOPEN : EVENT_CHANINFO;
+ if (has_event(event)) {
+ channel_incref(chan);
+ multiqueue_put(main_loop.events, set_info_event,
+ 2, chan, event);
+ }
+}
+
+static void set_info_event(void **argv)
+{
+ Channel *chan = argv[0];
+ event_T event = (event_T)(ptrdiff_t)argv[1];
+
+ dict_T *dict = get_vim_var_dict(VV_EVENT);
+ Dictionary info = channel_info(chan->id);
+ typval_T retval;
+ (void)object_to_vim(DICTIONARY_OBJ(info), &retval, NULL);
+ tv_dict_add_dict(dict, S_LEN("info"), retval.vval.v_dict);
+
+ apply_autocmds(event, NULL, NULL, false, curbuf);
+
+ tv_dict_clear(dict);
+ api_free_dictionary(info);
+ channel_decref(chan);
+}
+
+Dictionary channel_info(uint64_t id)
+{
+ Channel *chan = find_channel(id);
+ if (!chan) {
+ return (Dictionary)ARRAY_DICT_INIT;
+ }
+
+ Dictionary info = ARRAY_DICT_INIT;
+ PUT(info, "id", INTEGER_OBJ((Integer)chan->id));
+
+ const char *stream_desc, *mode_desc;
+ switch (chan->streamtype) {
+ case kChannelStreamProc:
+ stream_desc = "job";
+ if (chan->stream.proc.type == kProcessTypePty) {
+ const char *name = pty_process_tty_name(&chan->stream.pty);
+ PUT(info, "pty", STRING_OBJ(cstr_to_string(name)));
+ }
+ break;
+
+ case kChannelStreamStdio:
+ stream_desc = "stdio";
+ break;
+
+ case kChannelStreamStderr:
+ stream_desc = "stderr";
+ break;
+
+ case kChannelStreamInternal:
+ PUT(info, "internal", BOOLEAN_OBJ(true));
+ FALLTHROUGH;
+
+ case kChannelStreamSocket:
+ stream_desc = "socket";
+ break;
+
+ default:
+ abort();
+ }
+ PUT(info, "stream", STRING_OBJ(cstr_to_string(stream_desc)));
+
+ if (chan->is_rpc) {
+ mode_desc = "rpc";
+ PUT(info, "client", DICTIONARY_OBJ(rpc_client_info(chan)));
+ } else if (chan->term) {
+ mode_desc = "terminal";
+ PUT(info, "buffer", BUFFER_OBJ(terminal_buf(chan->term)));
+ } else {
+ mode_desc = "bytes";
+ }
+ PUT(info, "mode", STRING_OBJ(cstr_to_string(mode_desc)));
+
+ return info;
+}
+
+Array channel_all_info(void)
+{
+ Channel *channel;
+ Array ret = ARRAY_DICT_INIT;
+ map_foreach_value(channels, channel, {
+ ADD(ret, DICTIONARY_OBJ(channel_info(channel->id)));
+ });
+ return ret;
+}
diff --git a/src/nvim/channel.h b/src/nvim/channel.h
new file mode 100644
index 0000000000..b856d197f1
--- /dev/null
+++ b/src/nvim/channel.h
@@ -0,0 +1,134 @@
+#ifndef NVIM_CHANNEL_H
+#define NVIM_CHANNEL_H
+
+#include "nvim/main.h"
+#include "nvim/event/socket.h"
+#include "nvim/event/process.h"
+#include "nvim/os/pty_process.h"
+#include "nvim/event/libuv_process.h"
+#include "nvim/eval/typval.h"
+#include "nvim/msgpack_rpc/channel_defs.h"
+
+#define CHAN_STDIO 1
+#define CHAN_STDERR 2
+
+typedef enum {
+ kChannelStreamProc,
+ kChannelStreamSocket,
+ kChannelStreamStdio,
+ kChannelStreamStderr,
+ kChannelStreamInternal
+} ChannelStreamType;
+
+typedef enum {
+ kChannelPartStdin,
+ kChannelPartStdout,
+ kChannelPartStderr,
+ kChannelPartRpc,
+ kChannelPartAll
+} ChannelPart;
+
+
+typedef struct {
+ Stream in;
+ Stream out;
+} StdioPair;
+
+typedef struct {
+ bool closed;
+} StderrState;
+
+typedef struct {
+ Callback cb;
+ dict_T *self;
+ garray_T buffer;
+ bool buffered;
+} CallbackReader;
+
+#define CALLBACK_READER_INIT ((CallbackReader){ .cb = CALLBACK_NONE, \
+ .self = NULL, \
+ .buffer = GA_EMPTY_INIT_VALUE, \
+ .buffered = false })
+static inline bool callback_reader_set(CallbackReader reader)
+{
+ return reader.cb.type != kCallbackNone || reader.self;
+}
+
+struct Channel {
+ uint64_t id;
+ size_t refcount;
+ MultiQueue *events;
+
+ ChannelStreamType streamtype;
+ union {
+ Process proc;
+ LibuvProcess uv;
+ PtyProcess pty;
+ Stream socket;
+ StdioPair stdio;
+ StderrState err;
+ } stream;
+
+ bool is_rpc;
+ RpcState rpc;
+ Terminal *term;
+
+ CallbackReader on_stdout;
+ CallbackReader on_stderr;
+ Callback on_exit;
+};
+
+EXTERN PMap(uint64_t) *channels;
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "channel.h.generated.h"
+#endif
+
+/// @returns Channel with the id or NULL if not found
+static inline Channel *find_channel(uint64_t id)
+{
+ return pmap_get(uint64_t)(channels, id);
+}
+
+static inline Stream *channel_instream(Channel *chan)
+ FUNC_ATTR_NONNULL_ALL
+{
+ switch (chan->streamtype) {
+ case kChannelStreamProc:
+ return &chan->stream.proc.in;
+
+ case kChannelStreamSocket:
+ return &chan->stream.socket;
+
+ case kChannelStreamStdio:
+ return &chan->stream.stdio.out;
+
+ case kChannelStreamInternal:
+ case kChannelStreamStderr:
+ abort();
+ }
+ abort();
+}
+
+static inline Stream *channel_outstream(Channel *chan)
+ FUNC_ATTR_NONNULL_ALL
+{
+ switch (chan->streamtype) {
+ case kChannelStreamProc:
+ return &chan->stream.proc.out;
+
+ case kChannelStreamSocket:
+ return &chan->stream.socket;
+
+ case kChannelStreamStdio:
+ return &chan->stream.stdio.in;
+
+ case kChannelStreamInternal:
+ case kChannelStreamStderr:
+ abort();
+ }
+ abort();
+}
+
+
+#endif // NVIM_CHANNEL_H
diff --git a/src/nvim/charset.c b/src/nvim/charset.c
index 5ae4416052..c220c4e347 100644
--- a/src/nvim/charset.c
+++ b/src/nvim/charset.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/// @file charset.c
///
/// Code related to character sets.
@@ -15,17 +18,19 @@
#include "nvim/func_attr.h"
#include "nvim/indent.h"
#include "nvim/main.h"
+#include "nvim/mark.h"
#include "nvim/mbyte.h"
#include "nvim/memline.h"
#include "nvim/memory.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/garray.h"
#include "nvim/move.h"
+#include "nvim/option.h"
#include "nvim/os_unix.h"
+#include "nvim/state.h"
#include "nvim/strings.h"
#include "nvim/path.h"
-
+#include "nvim/cursor.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "charset.c.generated.h"
@@ -40,23 +45,30 @@ static bool chartab_initialized = false;
(buf)->b_chartab[(unsigned)(c) >> 6] |= (1ull << ((c) & 0x3f))
#define RESET_CHARTAB(buf, c) \
(buf)->b_chartab[(unsigned)(c) >> 6] &= ~(1ull << ((c) & 0x3f))
+#define GET_CHARTAB_TAB(chartab, c) \
+ ((chartab)[(unsigned)(c) >> 6] & (1ull << ((c) & 0x3f)))
#define GET_CHARTAB(buf, c) \
- ((buf)->b_chartab[(unsigned)(c) >> 6] & (1ull << ((c) & 0x3f)))
+ GET_CHARTAB_TAB((buf)->b_chartab, c)
+
+// Table used below, see init_chartab() for an explanation
+static char_u g_chartab[256];
+
+// Flags for g_chartab[].
+#define CT_CELL_MASK 0x07 ///< mask: nr of display cells (1, 2 or 4)
+#define CT_PRINT_CHAR 0x10 ///< flag: set for printable chars
+#define CT_ID_CHAR 0x20 ///< flag: set for ID chars
+#define CT_FNAME_CHAR 0x40 ///< flag: set for file name chars
-/// Fill chartab[]. Also fills curbuf->b_chartab[] with flags for keyword
+/// Fill g_chartab[]. Also fills curbuf->b_chartab[] with flags for keyword
/// characters for current buffer.
///
/// Depends on the option settings 'iskeyword', 'isident', 'isfname',
/// 'isprint' and 'encoding'.
///
-/// The index in chartab[] depends on 'encoding':
-/// - For non-multi-byte index with the byte (same as the character).
-/// - For DBCS index with the first byte.
-/// - For UTF-8 index with the character (when first byte is up to 0x80 it is
-/// the same as the character, if the first byte is 0x80 and above it depends
-/// on further bytes).
+/// The index in g_chartab[] is the character when first byte is up to 0x80,
+/// if the first byte is 0x80 and above it depends on further bytes.
///
-/// The contents of chartab[]:
+/// The contents of g_chartab[]:
/// - The lower two bits, masked by CT_CELL_MASK, give the number of display
/// cells the character occupies (1 or 2). Not valid for UTF-8 above 0x80.
/// - CT_PRINT_CHAR bit is set when the character is printable (no need to
@@ -82,7 +94,6 @@ int buf_init_chartab(buf_T *buf, int global)
{
int c;
int c2;
- char_u *p;
int i;
bool tilde;
bool do_isalpha;
@@ -94,41 +105,33 @@ int buf_init_chartab(buf_T *buf, int global)
c = 0;
while (c < ' ') {
- chartab[c++] = (dy_flags & DY_UHEX) ? 4 : 2;
+ g_chartab[c++] = (dy_flags & DY_UHEX) ? 4 : 2;
}
while (c <= '~') {
- chartab[c++] = 1 + CT_PRINT_CHAR;
+ g_chartab[c++] = 1 + CT_PRINT_CHAR;
}
if (p_altkeymap) {
while (c < YE) {
- chartab[c++] = 1 + CT_PRINT_CHAR;
+ g_chartab[c++] = 1 + CT_PRINT_CHAR;
}
}
while (c < 256) {
- if (enc_utf8 && (c >= 0xa0)) {
+ if (c >= 0xa0) {
// UTF-8: bytes 0xa0 - 0xff are printable (latin1)
- chartab[c++] = CT_PRINT_CHAR + 1;
- } else if ((enc_dbcs == DBCS_JPNU) && (c == 0x8e)) {
- // euc-jp characters starting with 0x8e are single width
- chartab[c++] = CT_PRINT_CHAR + 1;
- } else if ((enc_dbcs != 0) && (MB_BYTE2LEN(c) == 2)) {
- // other double-byte chars can be printable AND double-width
- chartab[c++] = CT_PRINT_CHAR + 2;
+ g_chartab[c++] = CT_PRINT_CHAR + 1;
} else {
// the rest is unprintable by default
- chartab[c++] = (dy_flags & DY_UHEX) ? 4 : 2;
+ g_chartab[c++] = (dy_flags & DY_UHEX) ? 4 : 2;
}
}
// Assume that every multi-byte char is a filename character.
- for (c = 1; c < 256; ++c) {
- if (((enc_dbcs != 0) && (MB_BYTE2LEN(c) > 1))
- || ((enc_dbcs == DBCS_JPNU) && (c == 0x8e))
- || (enc_utf8 && (c >= 0xa0))) {
- chartab[c] |= CT_FNAME_CHAR;
+ for (c = 1; c < 256; c++) {
+ if (c >= 0xa0) {
+ g_chartab[c] |= CT_FNAME_CHAR;
}
}
}
@@ -136,15 +139,6 @@ int buf_init_chartab(buf_T *buf, int global)
// Init word char flags all to false
memset(buf->b_chartab, 0, (size_t)32);
- if (enc_dbcs != 0) {
- for (c = 0; c < 256; ++c) {
- // double-byte characters are probably word characters
- if (MB_BYTE2LEN(c) == 2) {
- SET_CHARTAB(buf, c);
- }
- }
- }
-
// In lisp mode the '-' character is included in keywords.
if (buf->b_p_lisp) {
SET_CHARTAB(buf, '-');
@@ -153,7 +147,8 @@ int buf_init_chartab(buf_T *buf, int global)
// Walk through the 'isident', 'iskeyword', 'isfname' and 'isprint'
// options Each option is a list of characters, character numbers or
// ranges, separated by commas, e.g.: "200-210,x,#-178,-"
- for (i = global ? 0 : 3; i <= 3; ++i) {
+ for (i = global ? 0 : 3; i <= 3; i++) {
+ const char_u *p;
if (i == 0) {
// first round: 'isident'
p = p_isi;
@@ -178,11 +173,9 @@ int buf_init_chartab(buf_T *buf, int global)
}
if (ascii_isdigit(*p)) {
- c = getdigits_int(&p);
- } else if (has_mbyte) {
- c = mb_ptr2char_adv(&p);
+ c = getdigits_int((char_u **)&p);
} else {
- c = *p++;
+ c = mb_ptr2char_adv(&p);
}
c2 = -1;
@@ -190,11 +183,9 @@ int buf_init_chartab(buf_T *buf, int global)
++p;
if (ascii_isdigit(*p)) {
- c2 = getdigits_int(&p);
- } else if (has_mbyte) {
- c2 = mb_ptr2char_adv(&p);
+ c2 = getdigits_int((char_u **)&p);
} else {
- c2 = *p++;
+ c2 = mb_ptr2char_adv(&p);
}
}
@@ -225,15 +216,15 @@ int buf_init_chartab(buf_T *buf, int global)
// work properly when 'encoding' is "latin1" and the locale is
// "C".
if (!do_isalpha
- || vim_islower(c)
- || vim_isupper(c)
+ || mb_islower(c)
+ || mb_isupper(c)
|| (p_altkeymap && (F_isalpha(c) || F_isdigit(c)))) {
if (i == 0) {
// (re)set ID flag
if (tilde) {
- chartab[c] &= (uint8_t)~CT_ID_CHAR;
+ g_chartab[c] &= (uint8_t)~CT_ID_CHAR;
} else {
- chartab[c] |= CT_ID_CHAR;
+ g_chartab[c] |= CT_ID_CHAR;
}
} else if (i == 1) {
// (re)set printable
@@ -241,23 +232,22 @@ int buf_init_chartab(buf_T *buf, int global)
// that we can detect it from the first byte.
if (((c < ' ')
|| (c > '~')
- || (p_altkeymap && (F_isalpha(c) || F_isdigit(c))))
- && !(enc_dbcs && (MB_BYTE2LEN(c) == 2))) {
+ || (p_altkeymap && (F_isalpha(c) || F_isdigit(c))))) {
if (tilde) {
- chartab[c] = (uint8_t)((chartab[c] & ~CT_CELL_MASK)
- + ((dy_flags & DY_UHEX) ? 4 : 2));
- chartab[c] &= (uint8_t)~CT_PRINT_CHAR;
+ g_chartab[c] = (uint8_t)((g_chartab[c] & ~CT_CELL_MASK)
+ + ((dy_flags & DY_UHEX) ? 4 : 2));
+ g_chartab[c] &= (uint8_t)~CT_PRINT_CHAR;
} else {
- chartab[c] = (uint8_t)((chartab[c] & ~CT_CELL_MASK) + 1);
- chartab[c] |= CT_PRINT_CHAR;
+ g_chartab[c] = (uint8_t)((g_chartab[c] & ~CT_CELL_MASK) + 1);
+ g_chartab[c] |= CT_PRINT_CHAR;
}
}
} else if (i == 2) {
// (re)set fname flag
if (tilde) {
- chartab[c] &= (uint8_t)~CT_FNAME_CHAR;
+ g_chartab[c] &= (uint8_t)~CT_FNAME_CHAR;
} else {
- chartab[c] |= CT_FNAME_CHAR;
+ g_chartab[c] |= CT_FNAME_CHAR;
}
} else { // i == 3
// (re)set keyword flag
@@ -303,7 +293,7 @@ void trans_characters(char_u *buf, int bufsize)
while (*buf != 0) {
// Assume a multi-byte character doesn't need translation.
- if (has_mbyte && ((trs_len = (*mb_ptr2len)(buf)) > 1)) {
+ if ((trs_len = (*mb_ptr2len)(buf)) > 1) {
len -= trs_len;
} else {
trs = transchar_byte(*buf);
@@ -323,73 +313,115 @@ void trans_characters(char_u *buf, int bufsize)
}
}
-/// Translate a string into allocated memory, replacing special chars with
-/// printable chars.
+/// Find length of a string capable of holding s with all specials replaced
///
-/// @param s
+/// Assumes replacing special characters with printable ones just like
+/// strtrans() does.
+///
+/// @param[in] s String to check.
///
-/// @return translated string
-char_u *transstr(char_u *s) FUNC_ATTR_NONNULL_RET
+/// @return number of bytes needed to hold a translation of `s`, NUL byte not
+/// included.
+size_t transstr_len(const char *const s)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_PURE
{
- char_u *res;
- char_u *p;
- int c;
- size_t l;
- char_u hexbuf[11];
-
- if (has_mbyte) {
- // Compute the length of the result, taking account of unprintable
- // multi-byte characters.
- size_t len = 0;
- p = s;
-
- while (*p != NUL) {
- if ((l = (size_t)(*mb_ptr2len)(p)) > 1) {
- c = (*mb_ptr2char)(p);
- p += l;
-
- if (vim_isprintc(c)) {
- len += l;
- } else {
- transchar_hex(hexbuf, c);
- len += STRLEN(hexbuf);
- }
- } else {
- l = (size_t)byte2cells(*p++);
+ const char *p = s;
+ size_t len = 0;
- if (l > 0) {
- len += l;
- } else {
- // illegal byte sequence
- len += 4;
+ while (*p) {
+ const size_t l = (size_t)utfc_ptr2len((const char_u *)p);
+ if (l > 1) {
+ int pcc[MAX_MCO + 1];
+ pcc[0] = utfc_ptr2char((const char_u *)p, &pcc[1]);
+
+ if (vim_isprintc(pcc[0])) {
+ len += l;
+ } else {
+ for (size_t i = 0; i < ARRAY_SIZE(pcc) && pcc[i]; i++) {
+ char hexbuf[9];
+ len += transchar_hex(hexbuf, pcc[i]);
}
}
+ p += l;
+ } else {
+ const int b2c_l = byte2cells((uint8_t)(*p++));
+ // Illegal byte sequence may occupy up to 4 characters.
+ len += (size_t)(b2c_l > 0 ? b2c_l : 4);
}
- res = xmallocz(len);
- } else {
- res = xmallocz((size_t)vim_strsize(s));
}
+ return len;
+}
- *res = NUL;
- p = s;
-
- while (*p != NUL) {
- if (has_mbyte && ((l = (size_t)(*mb_ptr2len)(p)) > 1)) {
- c = (*mb_ptr2char)(p);
+/// Replace special characters with printable ones
+///
+/// @param[in] s String to replace characters from.
+/// @param[out] buf Buffer to which result should be saved.
+/// @param[in] len Buffer length. Resulting string may not occupy more then
+/// len - 1 bytes (one for trailing NUL byte).
+///
+/// @return length of the resulting string, without the NUL byte.
+size_t transstr_buf(const char *const s, char *const buf, const size_t len)
+ FUNC_ATTR_NONNULL_ALL
+{
+ const char *p = s;
+ char *buf_p = buf;
+ char *const buf_e = buf_p + len - 1;
+
+ while (*p != NUL && buf_p < buf_e) {
+ const size_t l = (size_t)utfc_ptr2len((const char_u *)p);
+ if (l > 1) {
+ if (buf_p + l > buf_e) {
+ break; // Exceeded `buf` size.
+ }
+ int pcc[MAX_MCO + 1];
+ pcc[0] = utfc_ptr2char((const char_u *)p, &pcc[1]);
- if (vim_isprintc(c)) {
- // append printable multi-byte char
- STRNCAT(res, p, l);
+ if (vim_isprintc(pcc[0])) {
+ memmove(buf_p, p, l);
+ buf_p += l;
} else {
- transchar_hex(res + STRLEN(res), c);
+ for (size_t i = 0; i < ARRAY_SIZE(pcc) && pcc[i]; i++) {
+ char hexbuf[9]; // <up to 6 bytes>NUL
+ const size_t hexlen = transchar_hex(hexbuf, pcc[i]);
+ if (buf_p + hexlen > buf_e) {
+ break;
+ }
+ memmove(buf_p, hexbuf, hexlen);
+ buf_p += hexlen;
+ }
}
p += l;
} else {
- STRCAT(res, transchar_byte(*p++));
+ const char *const tb = (const char *)transchar_byte((uint8_t)(*p++));
+ const size_t tb_len = strlen(tb);
+ if (buf_p + tb_len > buf_e) {
+ break; // Exceeded `buf` size.
+ }
+ memmove(buf_p, tb, tb_len);
+ buf_p += tb_len;
}
}
+ *buf_p = NUL;
+ assert(buf_p <= buf_e);
+ return (size_t)(buf_p - buf);
+}
- return res;
+/// Copy string and replace special characters with printable characters
+///
+/// Works like `strtrans()` does, used for that and in some other places.
+///
+/// @param[in] s String to replace characters from.
+///
+/// @return [allocated] translated string
+char *transstr(const char *const s)
+ FUNC_ATTR_NONNULL_RET
+{
+ // Compute the length of the result, taking account of unprintable
+ // multi-byte characters.
+ const size_t len = transstr_len((const char *)s) + 1;
+ char *const buf = xmalloc(len);
+ transstr_buf(s, buf, len);
+ return buf;
}
/// Convert the string "str[orglen]" to do ignore-case comparing.
@@ -433,79 +465,71 @@ char_u* str_foldcase(char_u *str, int orglen, char_u *buf, int buflen)
// Make each character lower case.
i = 0;
while (STR_CHAR(i) != NUL) {
- if (enc_utf8 || (has_mbyte && (MB_BYTE2LEN(STR_CHAR(i)) > 1))) {
- if (enc_utf8) {
- int c = utf_ptr2char(STR_PTR(i));
- int olen = utf_ptr2len(STR_PTR(i));
- int lc = utf_tolower(c);
-
- // Only replace the character when it is not an invalid
- // sequence (ASCII character or more than one byte) and
- // utf_tolower() doesn't return the original character.
- if (((c < 0x80) || (olen > 1)) && (c != lc)) {
- int nlen = utf_char2len(lc);
-
- // If the byte length changes need to shift the following
- // characters forward or backward.
- if (olen != nlen) {
- if (nlen > olen) {
- if (buf == NULL) {
- ga_grow(&ga, nlen - olen + 1);
- } else {
- if (len + nlen - olen >= buflen) {
- // out of memory, keep old char
- lc = c;
- nlen = olen;
- }
- }
- }
-
- if (olen != nlen) {
- if (buf == NULL) {
- STRMOVE(GA_PTR(i) + nlen, GA_PTR(i) + olen);
- ga.ga_len += nlen - olen;
- } else {
- STRMOVE(buf + i + nlen, buf + i + olen);
- len += nlen - olen;
- }
+ int c = utf_ptr2char(STR_PTR(i));
+ int olen = utf_ptr2len(STR_PTR(i));
+ int lc = mb_tolower(c);
+
+ // Only replace the character when it is not an invalid
+ // sequence (ASCII character or more than one byte) and
+ // mb_tolower() doesn't return the original character.
+ if (((c < 0x80) || (olen > 1)) && (c != lc)) {
+ int nlen = utf_char2len(lc);
+
+ // If the byte length changes need to shift the following
+ // characters forward or backward.
+ if (olen != nlen) {
+ if (nlen > olen) {
+ if (buf == NULL) {
+ ga_grow(&ga, nlen - olen + 1);
+ } else {
+ if (len + nlen - olen >= buflen) {
+ // out of memory, keep old char
+ lc = c;
+ nlen = olen;
}
}
- (void)utf_char2bytes(lc, STR_PTR(i));
}
- }
- // skip to next multi-byte char
- i += (*mb_ptr2len)(STR_PTR(i));
- } else {
- if (buf == NULL) {
- GA_CHAR(i) = (char_u)TOLOWER_LOC(GA_CHAR(i));
- } else {
- buf[i] = (char_u)TOLOWER_LOC(buf[i]);
+ if (olen != nlen) {
+ if (buf == NULL) {
+ STRMOVE(GA_PTR(i) + nlen, GA_PTR(i) + olen);
+ ga.ga_len += nlen - olen;
+ } else {
+ STRMOVE(buf + i + nlen, buf + i + olen);
+ len += nlen - olen;
+ }
+ }
}
- ++i;
+ (void)utf_char2bytes(lc, STR_PTR(i));
}
+
+ // skip to next multi-byte char
+ i += (*mb_ptr2len)(STR_PTR(i));
}
+
if (buf == NULL) {
return (char_u *)ga.ga_data;
}
return buf;
}
-// Catch 22: chartab[] can't be initialized before the options are
+// Catch 22: g_chartab[] can't be initialized before the options are
// initialized, and initializing options may cause transchar() to be called!
-// When chartab_initialized == false don't use chartab[].
+// When chartab_initialized == false don't use g_chartab[].
// Does NOT work for multi-byte characters, c must be <= 255.
// Also doesn't work for the first byte of a multi-byte, "c" must be a
// character!
-static char_u transchar_buf[7];
+static char_u transchar_buf[11];
-/// Translates a character
+/// Translate a character into a printable one, leaving printable ASCII intact
///
-/// @param c
+/// All unicode characters are considered non-printable in this function.
///
-/// @return translated character.
-char_u* transchar(int c)
+/// @param[in] c Character to translate.
+///
+/// @return translated character into a static buffer.
+char_u *transchar(int c)
{
int i = 0;
if (IS_SPECIAL(c)) {
@@ -516,38 +540,45 @@ char_u* transchar(int c)
c = K_SECOND(c);
}
- if ((!chartab_initialized && (((c >= ' ') && (c <= '~')) || F_ischar(c)))
- || ((c < 256) && vim_isprintc_strict(c))) {
+ if ((!chartab_initialized && (((c >= ' ') && (c <= '~'))
+ || (p_altkeymap && F_ischar(c))))
+ || ((c <= 0xFF) && vim_isprintc_strict(c))) {
// printable character
transchar_buf[i] = (char_u)c;
transchar_buf[i + 1] = NUL;
- } else {
+ } else if (c <= 0xFF) {
transchar_nonprint(transchar_buf + i, c);
+ } else {
+ transchar_hex((char *)transchar_buf + i, c);
}
return transchar_buf;
}
-/// Like transchar(), but called with a byte instead of a character. Checks
-/// for an illegal UTF-8 byte.
+/// Like transchar(), but called with a byte instead of a character
///
-/// @param c
+/// Checks for an illegal UTF-8 byte.
+///
+/// @param[in] c Byte to translate.
///
/// @return pointer to translated character in transchar_buf.
-char_u* transchar_byte(int c)
+char_u *transchar_byte(const int c)
+ FUNC_ATTR_WARN_UNUSED_RESULT
{
- if (enc_utf8 && (c >= 0x80)) {
+ if (c >= 0x80) {
transchar_nonprint(transchar_buf, c);
return transchar_buf;
}
return transchar(c);
}
-/// Convert non-printable character to two or more printable characters in
-/// "buf[]". "buf" needs to be able to hold five bytes.
-/// Does NOT work for multi-byte characters, c must be <= 255.
+/// Convert non-printable characters to 2..4 printable ones
///
-/// @param buf
-/// @param c
+/// @warning Does not work for multi-byte characters, c must be <= 255.
+///
+/// @param[out] buf Buffer to store result in, must be able to hold at least
+/// 5 bytes (conversion result + NUL).
+/// @param[in] c Character to convert. NUL is assumed to be NL according to
+/// `:h NL-used-for-NUL`.
void transchar_nonprint(char_u *buf, int c)
{
if (c == NL) {
@@ -557,64 +588,63 @@ void transchar_nonprint(char_u *buf, int c)
// we use CR in place of NL in this case
c = NL;
}
+ assert(c <= 0xff);
- if (dy_flags & DY_UHEX) {
+ if (dy_flags & DY_UHEX || c > 0x7f) {
// 'display' has "uhex"
- transchar_hex(buf, c);
- } else if (c <= 0x7f) {
+ transchar_hex((char *)buf, c);
+ } else {
// 0x00 - 0x1f and 0x7f
buf[0] = '^';
// DEL displayed as ^?
buf[1] = (char_u)(c ^ 0x40);
buf[2] = NUL;
- } else if (enc_utf8 && (c >= 0x80)) {
- transchar_hex(buf, c);
- } else if ((c >= ' ' + 0x80) && (c <= '~' + 0x80)) {
- // 0xa0 - 0xfe
- buf[0] = '|';
- buf[1] = (char_u)(c - 0x80);
- buf[2] = NUL;
- } else {
- // 0x80 - 0x9f and 0xff
- buf[0] = '~';
- buf[1] = (char_u)((c - 0x80) ^ 0x40);
- buf[2] = NUL;
}
}
-/// Convert a non-printable character to hex.
+/// Convert a non-printable character to hex C string like "<FFFF>"
///
-/// @param buf
-/// @param c
-void transchar_hex(char_u *buf, int c)
+/// @param[out] buf Buffer to store result in.
+/// @param[in] c Character to convert.
+///
+/// @return Number of bytes stored in buffer, excluding trailing NUL byte.
+size_t transchar_hex(char *const buf, const int c)
+ FUNC_ATTR_NONNULL_ALL
{
- int i = 0;
+ size_t i = 0;
- buf[0] = '<';
+ buf[i++] = '<';
if (c > 255) {
- buf[++i] = (char_u)nr2hex((unsigned)c >> 12);
- buf[++i] = (char_u)nr2hex((unsigned)c >> 8);
- }
- buf[++i] = (char_u)(nr2hex((unsigned)c >> 4));
- buf[++i] = (char_u)(nr2hex((unsigned)c));
- buf[++i] = '>';
- buf[++i] = NUL;
+ if (c > 255 * 256) {
+ buf[i++] = (char)nr2hex((unsigned)c >> 20);
+ buf[i++] = (char)nr2hex((unsigned)c >> 16);
+ }
+ buf[i++] = (char)nr2hex((unsigned)c >> 12);
+ buf[i++] = (char)nr2hex((unsigned)c >> 8);
+ }
+ buf[i++] = (char)(nr2hex((unsigned)c >> 4));
+ buf[i++] = (char)(nr2hex((unsigned)c));
+ buf[i++] = '>';
+ buf[i] = NUL;
+ return i;
}
-/// Convert the lower 4 bits of byte "c" to its hex character.
+/// Convert the lower 4 bits of byte "c" to its hex character
+///
/// Lower case letters are used to avoid the confusion of <F1> being 0xf1 or
/// function key 1.
///
-/// @param c
+/// @param[in] n Number to convert.
///
/// @return the hex character.
-static unsigned nr2hex(unsigned c)
+static inline unsigned nr2hex(unsigned n)
+ FUNC_ATTR_CONST FUNC_ATTR_WARN_UNUSED_RESULT
{
- if ((c & 0xf) <= 9) {
- return (c & 0xf) + '0';
+ if ((n & 0xf) <= 9) {
+ return (n & 0xf) + '0';
}
- return (c & 0xf) - 10 + 'a';
+ return (n & 0xf) - 10 + 'a';
}
/// Return number of display cells occupied by byte "b".
@@ -622,18 +652,18 @@ static unsigned nr2hex(unsigned c)
/// Caller must make sure 0 <= b <= 255.
/// For multi-byte mode "b" must be the first byte of a character.
/// A TAB is counted as two cells: "^I".
-/// For UTF-8 mode this will return 0 for bytes >= 0x80, because the number of
-/// cells depends on further bytes.
+/// This will return 0 for bytes >= 0x80, because the number of
+/// cells depends on further bytes in UTF-8.
///
/// @param b
///
/// @reeturn Number of display cells.
int byte2cells(int b)
{
- if (enc_utf8 && (b >= 0x80)) {
+ if (b >= 0x80) {
return 0;
}
- return chartab[b] & CT_CELL_MASK;
+ return g_chartab[b] & CT_CELL_MASK;
}
/// Return number of display cells occupied by character "c".
@@ -652,20 +682,9 @@ int char2cells(int c)
if (c >= 0x80) {
// UTF-8: above 0x80 need to check the value
- if (enc_utf8) {
- return utf_char2cells(c);
- }
-
- // DBCS: double-byte means double-width, except for euc-jp with first
- // byte 0x8e
- if ((enc_dbcs != 0) && (c >= 0x100)) {
- if ((enc_dbcs == DBCS_JPNU) && (((unsigned)c >> 8) == 0x8e)) {
- return 1;
- }
- return 2;
- }
+ return utf_char2cells(c);
}
- return chartab[c & 0xff] & CT_CELL_MASK;
+ return g_chartab[c & 0xff] & CT_CELL_MASK;
}
/// Return number of display cells occupied by character at "*p".
@@ -674,15 +693,15 @@ int char2cells(int c)
/// @param p
///
/// @return number of display cells.
-int ptr2cells(char_u *p)
+int ptr2cells(const char_u *p)
{
// For UTF-8 we need to look at more bytes if the first byte is >= 0x80.
- if (enc_utf8 && (*p >= 0x80)) {
+ if (*p >= 0x80) {
return utf_ptr2cells(p);
}
// For DBCS we can tell the cell count from the first byte.
- return chartab[*p] & CT_CELL_MASK;
+ return g_chartab[*p] & CT_CELL_MASK;
}
/// Return the number of character cells string "s" will take on the screen,
@@ -712,14 +731,10 @@ int vim_strnsize(char_u *s, int len)
assert(s != NULL);
int size = 0;
while (*s != NUL && --len >= 0) {
- if (has_mbyte) {
- int l = (*mb_ptr2len)(s);
- size += ptr2cells(s);
- s += l;
- len -= l - 1;
- } else {
- size += byte2cells(*s++);
- }
+ int l = (*mb_ptr2len)(s);
+ size += ptr2cells(s);
+ s += l;
+ len -= l - 1;
}
return size;
}
@@ -792,7 +807,7 @@ unsigned int win_linetabsize(win_T *wp, char_u *line, colnr_T len)
for (char_u *s = line;
*s != NUL && (len == MAXCOL || s < line + len);
- mb_ptr_adv(s)) {
+ MB_PTR_ADV(s)) {
col += win_lbr_chartabsize(wp, line, s, col, NULL);
}
@@ -806,39 +821,44 @@ unsigned int win_linetabsize(win_T *wp, char_u *line, colnr_T len)
bool vim_isIDc(int c)
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
- return c > 0 && c < 0x100 && (chartab[c] & CT_ID_CHAR);
+ return c > 0 && c < 0x100 && (g_chartab[c] & CT_ID_CHAR);
}
/// Check that "c" is a keyword character:
-/// Letters and characters from 'iskeyword' option for current buffer.
+/// Letters and characters from 'iskeyword' option for the current buffer.
/// For multi-byte characters mb_get_class() is used (builtin rules).
///
/// @param c character to check
-bool vim_iswordc(int c)
+bool vim_iswordc(const int c)
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
return vim_iswordc_buf(c, curbuf);
}
+/// Check that "c" is a keyword character
+/// Letters and characters from 'iskeyword' option for given buffer.
+/// For multi-byte characters mb_get_class() is used (builtin rules).
+///
+/// @param[in] c Character to check.
+/// @param[in] chartab Buffer chartab.
+bool vim_iswordc_tab(const int c, const uint64_t *const chartab)
+ FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
+{
+ return (c >= 0x100
+ ? (utf_class_tab(c, chartab) >= 2)
+ : (c > 0 && GET_CHARTAB_TAB(chartab, c) != 0));
+}
+
/// Check that "c" is a keyword character:
/// Letters and characters from 'iskeyword' option for given buffer.
/// For multi-byte characters mb_get_class() is used (builtin rules).
///
/// @param c character to check
/// @param buf buffer whose keywords to use
-bool vim_iswordc_buf(int c, buf_T *buf)
+bool vim_iswordc_buf(const int c, buf_T *const buf)
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ARG(2)
{
- if (c >= 0x100) {
- if (enc_dbcs != 0) {
- return dbcs_class((unsigned)c >> 8, (unsigned)(c & 0xff)) >= 2;
- }
-
- if (enc_utf8) {
- return utf_class(c) >= 2;
- }
- }
- return c > 0 && c < 0x100 && GET_CHARTAB(buf, c) != 0;
+ return vim_iswordc_tab(c, buf->b_chartab);
}
/// Just like vim_iswordc() but uses a pointer to the (multi-byte) character.
@@ -846,13 +866,10 @@ bool vim_iswordc_buf(int c, buf_T *buf)
/// @param p pointer to the multi-byte character
///
/// @return true if "p" points to a keyword character.
-bool vim_iswordp(char_u *p)
+bool vim_iswordp(const char_u *const p)
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
{
- if (has_mbyte && (MB_BYTE2LEN(*p) > 1)) {
- return mb_get_class(p) >= 2;
- }
- return GET_CHARTAB(curbuf, *p) != 0;
+ return vim_iswordp_buf(p, curbuf);
}
/// Just like vim_iswordc_buf() but uses a pointer to the (multi-byte)
@@ -862,13 +879,15 @@ bool vim_iswordp(char_u *p)
/// @param buf buffer whose keywords to use
///
/// @return true if "p" points to a keyword character.
-bool vim_iswordp_buf(char_u *p, buf_T *buf)
+bool vim_iswordp_buf(const char_u *const p, buf_T *const buf)
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
{
- if (has_mbyte && (MB_BYTE2LEN(*p) > 1)) {
- return mb_get_class(p) >= 2;
+ int c = *p;
+
+ if (MB_BYTE2LEN(c) > 1) {
+ c = utf_ptr2char(p);
}
- return GET_CHARTAB(buf, *p) != 0;
+ return vim_iswordc_buf(c, buf);
}
/// Check that "c" is a valid file-name character.
@@ -878,7 +897,7 @@ bool vim_iswordp_buf(char_u *p, buf_T *buf)
bool vim_isfilec(int c)
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
- return c >= 0x100 || (c > 0 && (chartab[c] & CT_FNAME_CHAR));
+ return c >= 0x100 || (c > 0 && (g_chartab[c] & CT_FNAME_CHAR));
}
/// Check that "c" is a valid file-name character or a wildcard character
@@ -903,10 +922,10 @@ bool vim_isfilec_or_wc(int c)
bool vim_isprintc(int c)
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
- if (enc_utf8 && (c >= 0x100)) {
+ if (c >= 0x100) {
return utf_printable(c);
}
- return c >= 0x100 || (c > 0 && (chartab[c] & CT_PRINT_CHAR));
+ return c > 0 && (g_chartab[c] & CT_PRINT_CHAR);
}
/// Strict version of vim_isprintc(c), don't return true if "c" is the head
@@ -918,14 +937,10 @@ bool vim_isprintc(int c)
bool vim_isprintc_strict(int c)
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
- if ((enc_dbcs != 0) && (c < 0x100) && (MB_BYTE2LEN(c) > 1)) {
- return false;
- }
-
- if (enc_utf8 && (c >= 0x100)) {
+ if (c >= 0x100) {
return utf_printable(c);
}
- return c >= 0x100 || (c > 0 && (chartab[c] & CT_PRINT_CHAR));
+ return c > 0 && (g_chartab[c] & CT_PRINT_CHAR);
}
/// like chartabsize(), but also check for line breaks on the screen
@@ -958,7 +973,7 @@ int lbr_chartabsize_adv(char_u *line, char_u **s, colnr_T col)
int retval;
retval = lbr_chartabsize(line, *s, col);
- mb_ptr_adv(*s);
+ MB_PTR_ADV(*s);
return retval;
}
@@ -1005,14 +1020,14 @@ int win_lbr_chartabsize(win_T *wp, char_u *line, char_u *s, colnr_T col, int *he
// needs a break here
if (wp->w_p_lbr
&& vim_isbreak(c)
- && !vim_isbreak(s[1])
+ && !vim_isbreak((int)s[1])
&& wp->w_p_wrap
- && (wp->w_width != 0)) {
+ && (wp->w_grid.Columns != 0)) {
// Count all characters from first non-blank after a blank up to next
// non-blank after a blank.
numberextra = win_col_off(wp);
col2 = col;
- colmax = (colnr_T)(wp->w_width - numberextra - col_adj);
+ colmax = (colnr_T)(wp->w_grid.Columns - numberextra - col_adj);
if (col >= colmax) {
colmax += col_adj;
@@ -1025,13 +1040,11 @@ int win_lbr_chartabsize(win_T *wp, char_u *line, char_u *s, colnr_T col, int *he
for (;;) {
ps = s;
- mb_ptr_adv(s);
+ MB_PTR_ADV(s);
c = *s;
- if (!((c != NUL)
- && (vim_isbreak(c)
- || (!vim_isbreak(c)
- && ((col2 == col) || !vim_isbreak(*ps)))))) {
+ if (!(c != NUL
+ && (vim_isbreak(c) || col2 == col || !vim_isbreak((int)(*ps))))) {
break;
}
@@ -1042,8 +1055,7 @@ int win_lbr_chartabsize(win_T *wp, char_u *line, char_u *s, colnr_T col, int *he
break;
}
}
- } else if (has_mbyte
- && (size == 2)
+ } else if ((size == 2)
&& (MB_BYTE2LEN(*s) > 1)
&& wp->w_p_wrap
&& in_win_border(wp, col)) {
@@ -1064,9 +1076,9 @@ int win_lbr_chartabsize(win_T *wp, char_u *line, char_u *s, colnr_T col, int *he
numberextra = numberwidth;
col += numberextra + mb_added;
- if (col >= (colnr_T)wp->w_width) {
- col -= wp->w_width;
- numberextra = wp->w_width - (numberextra - win_col_off2(wp));
+ if (col >= (colnr_T)wp->w_grid.Columns) {
+ col -= wp->w_grid.Columns;
+ numberextra = wp->w_grid.Columns - (numberextra - win_col_off2(wp));
if (col >= numberextra && numberextra > 0) {
col %= numberextra;
}
@@ -1085,16 +1097,17 @@ int win_lbr_chartabsize(win_T *wp, char_u *line, char_u *s, colnr_T col, int *he
numberwidth -= win_col_off2(wp);
}
- if (col == 0 || (col + size + sbrlen > (colnr_T)wp->w_width)) {
+ if (col == 0 || (col + size + sbrlen > (colnr_T)wp->w_grid.Columns)) {
added = 0;
if (*p_sbr != NUL) {
- if (size + sbrlen + numberwidth > (colnr_T)wp->w_width) {
+ if (size + sbrlen + numberwidth > (colnr_T)wp->w_grid.Columns) {
// Calculate effective window width.
- int width = (colnr_T)wp->w_width - sbrlen - numberwidth;
- int prev_width = col ? ((colnr_T)wp->w_width - (sbrlen + col)) : 0;
+ int width = (colnr_T)wp->w_grid.Columns - sbrlen - numberwidth;
+ int prev_width = col ? ((colnr_T)wp->w_grid.Columns - (sbrlen + col))
+ : 0;
if (width == 0) {
- width = (colnr_T)wp->w_width;
+ width = (colnr_T)wp->w_grid.Columns;
}
added += ((size - prev_width) / width) * vim_strsize(p_sbr);
if ((size - prev_width) % width) {
@@ -1163,11 +1176,11 @@ bool in_win_border(win_T *wp, colnr_T vcol)
int width1; // width of first line (after line number)
int width2; // width of further lines
- if (wp->w_width == 0) {
+ if (wp->w_grid.Columns == 0) {
// there is no border
return false;
}
- width1 = wp->w_width - win_col_off(wp);
+ width1 = wp->w_grid.Columns - win_col_off(wp);
if ((int)vcol < width1 - 1) {
return false;
@@ -1215,7 +1228,13 @@ void getvcol(win_T *wp, pos_T *pos, colnr_T *start, colnr_T *cursor,
// continue until the NUL
posptr = NULL;
} else {
+ // Special check for an empty line, which can happen on exit, when
+ // ml_get_buf() always returns an empty string.
+ if (*ptr == NUL) {
+ pos->col = 0;
+ }
posptr = ptr + pos->col;
+ posptr -= utf_head_off(line, posptr);
}
// This function is used very often, do some speed optimizations.
@@ -1241,27 +1260,23 @@ void getvcol(win_T *wp, pos_T *pos, colnr_T *start, colnr_T *cursor,
if (c == TAB) {
incr = ts - (vcol % ts);
} else {
- if (has_mbyte) {
- // For utf-8, if the byte is >= 0x80, need to look at
- // further bytes to find the cell width.
- if (enc_utf8 && (c >= 0x80)) {
- incr = utf_ptr2cells(ptr);
- } else {
- incr = CHARSIZE(c);
- }
-
- // If a double-cell char doesn't fit at the end of a line
- // it wraps to the next line, it's like this char is three
- // cells wide.
- if ((incr == 2)
- && wp->w_p_wrap
- && (MB_BYTE2LEN(*ptr) > 1)
- && in_win_border(wp, vcol)) {
- ++incr;
- head = 1;
- }
+ // For utf-8, if the byte is >= 0x80, need to look at
+ // further bytes to find the cell width.
+ if (c >= 0x80) {
+ incr = utf_ptr2cells(ptr);
} else {
- incr = CHARSIZE(c);
+ incr = g_chartab[c] & CT_CELL_MASK;
+ }
+
+ // If a double-cell char doesn't fit at the end of a line
+ // it wraps to the next line, it's like this char is three
+ // cells wide.
+ if ((incr == 2)
+ && wp->w_p_wrap
+ && (MB_BYTE2LEN(*ptr) > 1)
+ && in_win_border(wp, vcol)) {
+ incr++;
+ head = 1;
}
}
@@ -1271,7 +1286,7 @@ void getvcol(win_T *wp, pos_T *pos, colnr_T *start, colnr_T *cursor,
}
vcol += incr;
- mb_ptr_adv(ptr);
+ MB_PTR_ADV(ptr);
}
} else {
for (;;) {
@@ -1292,7 +1307,7 @@ void getvcol(win_T *wp, pos_T *pos, colnr_T *start, colnr_T *cursor,
}
vcol += incr;
- mb_ptr_adv(ptr);
+ MB_PTR_ADV(ptr);
}
}
@@ -1330,7 +1345,11 @@ colnr_T getvcol_nolist(pos_T *posp)
colnr_T vcol;
curwin->w_p_list = false;
- getvcol(curwin, posp, NULL, &vcol, NULL);
+ if (posp->coladd) {
+ getvvcol(curwin, posp, NULL, &vcol, NULL);
+ } else {
+ getvcol(curwin, posp, NULL, &vcol, NULL);
+ }
curwin->w_p_list = list_save;
return vcol;
}
@@ -1361,7 +1380,7 @@ void getvvcol(win_T *wp, pos_T *pos, colnr_T *start, colnr_T *cursor,
ptr = ml_get_buf(wp->w_buffer, pos->lnum, false);
if (pos->col < (colnr_T)STRLEN(ptr)) {
- int c = (*mb_ptr2char)(ptr + pos->col);
+ int c = utf_ptr2char(ptr + pos->col);
if ((c != TAB) && vim_isprintc(c)) {
endadd = (colnr_T)(char2cells(c) - 1);
if (coladd > endadd) {
@@ -1406,7 +1425,7 @@ void getvcols(win_T *wp, pos_T *pos1, pos_T *pos2, colnr_T *left,
colnr_T to1;
colnr_T to2;
- if (ltp(pos1, pos2)) {
+ if (lt(*pos1, *pos2)) {
getvvcol(wp, pos1, &from1, NULL, &to1);
getvvcol(wp, pos2, &from2, NULL, &to2);
} else {
@@ -1433,32 +1452,47 @@ void getvcols(win_T *wp, pos_T *pos1, pos_T *pos2, colnr_T *left,
/// skipwhite: skip over ' ' and '\t'.
///
-/// @param q
+/// @param[in] q String to skip in.
///
/// @return Pointer to character after the skipped whitespace.
-char_u* skipwhite(char_u *q)
+char_u *skipwhite(const char_u *q)
+ FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
+ FUNC_ATTR_NONNULL_RET
{
- char_u *p = q;
+ const char_u *p = q;
while (ascii_iswhite(*p)) {
- // skip to next non-white
p++;
}
- return p;
+ return (char_u *)p;
+}
+
+// getwhitecols: return the number of whitespace
+// columns (bytes) at the start of a given line
+intptr_t getwhitecols_curline(void)
+{
+ return getwhitecols(get_cursor_line_ptr());
+}
+
+intptr_t getwhitecols(const char_u *p)
+{
+ return skipwhite(p) - p;
}
-/// skip over digits
+/// Skip over digits
///
-/// @param q
+/// @param[in] q String to skip digits in.
///
/// @return Pointer to the character after the skipped digits.
-char_u* skipdigits(char_u *q)
+char_u *skipdigits(const char_u *q)
+ FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
+ FUNC_ATTR_NONNULL_RET
{
- char_u *p = q;
+ const char_u *p = q;
while (ascii_isdigit(*p)) {
// skip to next non-digit
p++;
}
- return p;
+ return (char_u *)p;
}
/// skip over binary digits
@@ -1543,168 +1577,17 @@ char_u* skiptohex(char_u *q)
return p;
}
-// Vim's own character class functions. These exist because many library
-// islower()/toupper() etc. do not work properly: they crash when used with
-// invalid values or can't handle latin1 when the locale is C.
-// Speed is most important here.
-#define LATIN1LOWER 'l'
-#define LATIN1UPPER 'U'
-
-static char_u latin1flags[257] =
- " "
- " UUUUUUUUUUUUUUUUUUUUUUUUUU llllllllllllllllllllllllll "
- " "
- "UUUUUUUUUUUUUUUUUUUUUUU UUUUUUUllllllllllllllllllllllll llllllll";
-static char_u latin1upper[257] =
- " !\"#$%&'()*+,-./0123456789:;<=>"
- "?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~"
- "\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e"
- "\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e"
- "\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae"
- "\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe"
- "\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce"
- "\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde"
- "\xdf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce"
- "\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xf7\xd8\xd9\xda\xdb\xdc\xdd\xde\xff";
-static char_u latin1lower[257] =
- " !\"#$%&'()*+,-./0123456789:;<=>"
- "?@abcdefghijklmnopqrstuvwxyz[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
- "\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e"
- "\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e"
- "\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae"
- "\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe"
- "\xbf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee"
- "\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xd7\xf8\xf9\xfa\xfb\xfc\xfd\xfe"
- "\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee"
- "\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff";
-
-/// Check that the character is lower-case
-///
-/// @param c character to check
-bool vim_islower(int c)
- FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
-{
- if (c <= '@') {
- return false;
- }
-
- if (c >= 0x80) {
- if (enc_utf8) {
- return utf_islower(c);
- }
-
- if (c >= 0x100) {
- if (has_mbyte) {
- return iswlower((wint_t)c);
- }
-
- // islower() can't handle these chars and may crash
- return false;
- }
-
- if (enc_latin1like) {
- return (latin1flags[c] & LATIN1LOWER) == LATIN1LOWER;
- }
- }
- return islower(c);
-}
-
-/// Check that the character is upper-case
-///
-/// @param c character to check
-bool vim_isupper(int c)
- FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
-{
- if (c <= '@') {
- return false;
- }
-
- if (c >= 0x80) {
- if (enc_utf8) {
- return utf_isupper(c);
- }
-
- if (c >= 0x100) {
- if (has_mbyte) {
- return iswupper((wint_t)c);
- }
-
- // isupper() can't handle these chars and may crash
- return false;
- }
-
- if (enc_latin1like) {
- return (latin1flags[c] & LATIN1UPPER) == LATIN1UPPER;
- }
- }
- return isupper(c);
-}
-
-int vim_toupper(int c)
-{
- if (c <= '@') {
- return c;
- }
-
- if (c >= 0x80) {
- if (enc_utf8) {
- return utf_toupper(c);
- }
-
- if (c >= 0x100) {
- if (has_mbyte) {
- return (int)towupper((wint_t)c);
- }
-
- // toupper() can't handle these chars and may crash
- return c;
- }
-
- if (enc_latin1like) {
- return latin1upper[c];
- }
- }
- return TOUPPER_LOC(c);
-}
-
-int vim_tolower(int c)
-{
- if (c <= '@') {
- return c;
- }
-
- if (c >= 0x80) {
- if (enc_utf8) {
- return utf_tolower(c);
- }
-
- if (c >= 0x100) {
- if (has_mbyte) {
- return (int)towlower((wint_t)c);
- }
-
- // tolower() can't handle these chars and may crash
- return c;
- }
-
- if (enc_latin1like) {
- return latin1lower[c];
- }
- }
- return TOLOWER_LOC(c);
-}
-
-/// skiptowhite: skip over text until ' ' or '\t' or NUL.
+/// Skip over text until ' ' or '\t' or NUL
///
-/// @param p
+/// @param[in] p Text to skip over.
///
/// @return Pointer to the next whitespace or NUL character.
-char_u* skiptowhite(char_u *p)
+char_u *skiptowhite(const char_u *p)
{
while (*p != ' ' && *p != '\t' && *p != NUL) {
p++;
}
- return p;
+ return (char_u *)p;
}
/// skiptowhite_esc: Like skiptowhite(), but also skip escaped chars
@@ -1722,6 +1605,26 @@ char_u* skiptowhite_esc(char_u *p) {
return p;
}
+/// Get a number from a string and skip over it, signalling overflows
+///
+/// @param[out] pp A pointer to a pointer to char_u.
+/// It will be advanced past the read number.
+/// @param[out] nr Number read from the string.
+///
+/// @return OK on success, FAIL on error/overflow
+int getdigits_safe(char_u **pp, intmax_t *nr)
+{
+ errno = 0;
+ *nr = strtoimax((char *)(*pp), (char **)pp, 10);
+
+ if ((*nr == INTMAX_MIN || *nr == INTMAX_MAX)
+ && errno == ERANGE) {
+ return FAIL;
+ }
+
+ return OK;
+}
+
/// Get a number from a string and skip over it.
///
/// @param[out] pp A pointer to a pointer to char_u.
@@ -1730,14 +1633,16 @@ char_u* skiptowhite_esc(char_u *p) {
/// @return Number read from the string.
intmax_t getdigits(char_u **pp)
{
- intmax_t number = strtoimax((char *)*pp, (char **)pp, 10);
- assert(errno != ERANGE);
+ intmax_t number;
+ int ret = getdigits_safe(pp, &number);
+
+ (void)ret; // Avoid "unused variable" warning in Release build
+ assert(ret == OK);
+
return number;
}
-/// Get an int number from a string.
-///
-/// A getdigits wrapper restricted to int values.
+/// Get an int number from a string. Like getdigits(), but restricted to `int`.
int getdigits_int(char_u **pp)
{
intmax_t number = getdigits(pp);
@@ -1747,9 +1652,7 @@ int getdigits_int(char_u **pp)
return (int)number;
}
-/// Get a long number from a string.
-///
-/// A getdigits wrapper restricted to long values.
+/// Get a long number from a string. Like getdigits(), but restricted to `long`.
long getdigits_long(char_u **pp)
{
intmax_t number = getdigits(pp);
@@ -1787,135 +1690,156 @@ bool vim_isblankline(char_u *lbuf)
/// If maxlen > 0, check at a maximum maxlen chars.
///
/// @param start
-/// @param prep Returns type of number 0 = decimal, 'x' or 'X' is hex,
-/// '0' = octal, 'b' or 'B' is bin
+/// @param prep Returns guessed type of number 0 = decimal, 'x' or 'X' is
+/// hexadecimal, '0' = octal, 'b' or 'B' is binary. When using
+/// STR2NR_FORCE is always zero.
/// @param len Returns the detected length of number.
-/// @param what Recognizes what number passed.
+/// @param what Recognizes what number passed, @see ChStr2NrFlags.
/// @param nptr Returns the signed result.
/// @param unptr Returns the unsigned result.
/// @param maxlen Max length of string to check.
void vim_str2nr(const char_u *const start, int *const prep, int *const len,
- const int what, long *const nptr, unsigned long *const unptr,
- const int maxlen)
+ const int what, varnumber_T *const nptr,
+ uvarnumber_T *const unptr, const int maxlen)
+ FUNC_ATTR_NONNULL_ARG(1)
{
- const char_u *ptr = start;
+ const char *ptr = (const char *)start;
+#define STRING_ENDED(ptr) \
+ (!(maxlen == 0 || (int)((ptr) - (const char *)start) < maxlen))
int pre = 0; // default is decimal
- bool negative = false;
- unsigned long un = 0;
+ const bool negative = (ptr[0] == '-');
+ uvarnumber_T un = 0;
- if (ptr[0] == '-') {
- negative = true;
+ if (negative) {
ptr++;
}
- // Recognize hex, octal and bin.
- if ((ptr[0] == '0') && (ptr[1] != '8') && (ptr[1] != '9')
- && (maxlen == 0 || maxlen > 1)) {
- pre = ptr[1];
-
- if ((what & STR2NR_HEX)
- && ((pre == 'X') || (pre == 'x'))
- && ascii_isxdigit(ptr[2])
- && (maxlen == 0 || maxlen > 2)) {
- // hexadecimal
- ptr += 2;
- } else if ((what & STR2NR_BIN)
- && ((pre == 'B') || (pre == 'b'))
- && ascii_isbdigit(ptr[2])
- && (maxlen == 0 || maxlen > 2)) {
- // binary
- ptr += 2;
- } else {
- // decimal or octal, default is decimal
- pre = 0;
-
- if (what & STR2NR_OCT) {
- // Don't interpret "0", "08" or "0129" as octal.
- for (int n = 1; ascii_isdigit(ptr[n]); ++n) {
- if (ptr[n] > '7') {
- // can't be octal
- pre = 0;
- break;
- }
- if (ptr[n] >= '0') {
- // assume octal
- pre = '0';
- }
- if (n == maxlen) {
- break;
- }
+ if (what & STR2NR_FORCE) {
+ // When forcing main consideration is skipping the prefix. Octal and decimal
+ // numbers have no prefixes to skip. pre is not set.
+ switch ((unsigned)what & (~(unsigned)STR2NR_FORCE)) {
+ case STR2NR_HEX: {
+ if (!STRING_ENDED(ptr + 2)
+ && ptr[0] == '0'
+ && (ptr[1] == 'x' || ptr[1] == 'X')
+ && ascii_isxdigit(ptr[2])) {
+ ptr += 2;
}
+ goto vim_str2nr_hex;
}
- }
- }
-
- // Do the string-to-numeric conversion "manually" to avoid sscanf quirks.
- int n = 1;
- if ((pre == 'B') || (pre == 'b') || what == STR2NR_BIN + STR2NR_FORCE) {
- // bin
- if (pre != 0) {
- n += 2; // skip over "0b"
- }
- while ('0' <= *ptr && *ptr <= '1') {
- un = 2 * un + (unsigned long)(*ptr - '0');
- ptr++;
- if (n++ == maxlen) {
- break;
+ case STR2NR_BIN: {
+ if (!STRING_ENDED(ptr + 2)
+ && ptr[0] == '0'
+ && (ptr[1] == 'b' || ptr[1] == 'B')
+ && ascii_isbdigit(ptr[2])) {
+ ptr += 2;
+ }
+ goto vim_str2nr_bin;
}
- }
- } else if ((pre == '0') || what == STR2NR_OCT + STR2NR_FORCE) {
- // octal
- while ('0' <= *ptr && *ptr <= '7') {
- un = 8 * un + (unsigned long)(*ptr - '0');
- ptr++;
- if (n++ == maxlen) {
- break;
+ case STR2NR_OCT: {
+ goto vim_str2nr_oct;
+ }
+ case 0: {
+ goto vim_str2nr_dec;
+ }
+ default: {
+ assert(false);
}
}
- } else if ((pre == 'X') || (pre == 'x')
- || what == STR2NR_HEX + STR2NR_FORCE) {
- // hex
- if (pre != 0) {
- n += 2; // skip over "0x"
+ } else if ((what & (STR2NR_HEX|STR2NR_OCT|STR2NR_BIN))
+ && !STRING_ENDED(ptr + 1)
+ && ptr[0] == '0' && ptr[1] != '8' && ptr[1] != '9') {
+ pre = ptr[1];
+ // Detect hexadecimal: 0x or 0X followed by hex digit.
+ if ((what & STR2NR_HEX)
+ && !STRING_ENDED(ptr + 2)
+ && (pre == 'X' || pre == 'x')
+ && ascii_isxdigit(ptr[2])) {
+ ptr += 2;
+ goto vim_str2nr_hex;
}
- while (ascii_isxdigit(*ptr)) {
- un = 16 * un + (unsigned long)hex2nr(*ptr);
- ptr++;
- if (n++ == maxlen) {
- break;
- }
+ // Detect binary: 0b or 0B followed by 0 or 1.
+ if ((what & STR2NR_BIN)
+ && !STRING_ENDED(ptr + 2)
+ && (pre == 'B' || pre == 'b')
+ && ascii_isbdigit(ptr[2])) {
+ ptr += 2;
+ goto vim_str2nr_bin;
}
- } else {
- // decimal
- while (ascii_isdigit(*ptr)) {
- un = 10 * un + (unsigned long)(*ptr - '0');
- ptr++;
- if (n++ == maxlen) {
- break;
+ // Detect octal number: zero followed by octal digits without '8' or '9'.
+ pre = 0;
+ if (!(what & STR2NR_OCT)
+ || !('0' <= ptr[1] && ptr[1] <= '7')) {
+ goto vim_str2nr_dec;
+ }
+ for (int i = 2; !STRING_ENDED(ptr + i) && ascii_isdigit(ptr[i]); i++) {
+ if (ptr[i] > '7') {
+ goto vim_str2nr_dec;
}
}
+ pre = '0';
+ goto vim_str2nr_oct;
+ } else {
+ goto vim_str2nr_dec;
}
+ // Do the string-to-numeric conversion "manually" to avoid sscanf quirks.
+ assert(false); // Shouldโ€™ve used goto earlier.
+#define PARSE_NUMBER(base, cond, conv) \
+ do { \
+ while (!STRING_ENDED(ptr) && (cond)) { \
+ /* avoid ubsan error for overflow */ \
+ if (un < UVARNUMBER_MAX / base) { \
+ un = base * un + (uvarnumber_T)(conv); \
+ } else { \
+ un = UVARNUMBER_MAX; \
+ } \
+ ptr++; \
+ } \
+ } while (0)
+vim_str2nr_bin:
+ PARSE_NUMBER(2, (*ptr == '0' || *ptr == '1'), (*ptr - '0'));
+ goto vim_str2nr_proceed;
+vim_str2nr_oct:
+ PARSE_NUMBER(8, ('0' <= *ptr && *ptr <= '7'), (*ptr - '0'));
+ goto vim_str2nr_proceed;
+vim_str2nr_dec:
+ PARSE_NUMBER(10, (ascii_isdigit(*ptr)), (*ptr - '0'));
+ goto vim_str2nr_proceed;
+vim_str2nr_hex:
+ PARSE_NUMBER(16, (ascii_isxdigit(*ptr)), (hex2nr(*ptr)));
+ goto vim_str2nr_proceed;
+#undef PARSE_NUMBER
+
+vim_str2nr_proceed:
if (prep != NULL) {
*prep = pre;
}
if (len != NULL) {
- *len = (int)(ptr - start);
+ *len = (int)(ptr - (const char *)start);
}
if (nptr != NULL) {
- if (negative) {
- // account for leading '-' for decimal numbers
- *nptr = -(long)un;
+ if (negative) { // account for leading '-' for decimal numbers
+ // avoid ubsan error for overflow
+ if (un > VARNUMBER_MAX) {
+ *nptr = VARNUMBER_MIN;
+ } else {
+ *nptr = -(varnumber_T)un;
+ }
} else {
- *nptr = (long)un;
+ if (un > VARNUMBER_MAX) {
+ un = VARNUMBER_MAX;
+ }
+ *nptr = (varnumber_T)un;
}
}
if (unptr != NULL) {
*unptr = un;
}
+#undef STRING_ENDED
}
/// Return the value of a single hex character.
diff --git a/src/nvim/charset.h b/src/nvim/charset.h
index 995ad123ae..e657ce19b6 100644
--- a/src/nvim/charset.h
+++ b/src/nvim/charset.h
@@ -1,15 +1,49 @@
#ifndef NVIM_CHARSET_H
#define NVIM_CHARSET_H
-/*
- * Flags for chartab[].
- */
-#define CT_CELL_MASK 0x07 /* mask: nr of display cells (1, 2 or 4) */
-#define CT_PRINT_CHAR 0x10 /* flag: set for printable chars */
-#define CT_ID_CHAR 0x20 /* flag: set for ID chars */
-#define CT_FNAME_CHAR 0x40 /* flag: set for file name chars */
+#include "nvim/types.h"
+#include "nvim/pos.h"
+#include "nvim/buffer_defs.h"
+#include "nvim/eval/typval.h"
+#include "nvim/option_defs.h"
+
+/// Return the folded-case equivalent of the given character
+///
+/// @param[in] c Character to transform.
+///
+/// @return Folded variant.
+#define CH_FOLD(c) \
+ utf_fold((sizeof(c) == sizeof(char)) \
+ ?((int)(uint8_t)(c)) \
+ :((int)(c)))
+
+/// Flags for vim_str2nr()
+typedef enum {
+ STR2NR_DEC = 0,
+ STR2NR_BIN = (1 << 0), ///< Allow binary numbers.
+ STR2NR_OCT = (1 << 1), ///< Allow octal numbers.
+ STR2NR_HEX = (1 << 2), ///< Allow hexadecimal numbers.
+ /// Force one of the above variants.
+ ///
+ /// STR2NR_FORCE|STR2NR_DEC is actually not different from supplying zero
+ /// as flags, but still present for completeness.
+ STR2NR_FORCE = (1 << 3),
+ /// Recognize all formats vim_str2nr() can recognize.
+ STR2NR_ALL = STR2NR_BIN | STR2NR_OCT | STR2NR_HEX,
+} ChStr2NrFlags;
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "charset.h.generated.h"
#endif
+
+static inline bool vim_isbreak(int c)
+ REAL_FATTR_CONST
+ REAL_FATTR_ALWAYS_INLINE;
+
+/// Check if `c` is one of the characters in 'breakat'.
+/// Used very often if 'linebreak' is set
+static inline bool vim_isbreak(int c)
+{
+ return breakat_flags[(char_u)c];
+}
#endif // NVIM_CHARSET_H
diff --git a/src/nvim/cursor.c b/src/nvim/cursor.c
index afaa6022c9..6c1bd01ff5 100644
--- a/src/nvim/cursor.c
+++ b/src/nvim/cursor.c
@@ -1,6 +1,10 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <stdbool.h>
#include <inttypes.h>
+#include "nvim/assert.h"
#include "nvim/cursor.h"
#include "nvim/charset.h"
#include "nvim/fold.h"
@@ -9,8 +13,10 @@
#include "nvim/misc1.h"
#include "nvim/move.h"
#include "nvim/screen.h"
+#include "nvim/state.h"
#include "nvim/vim.h"
#include "nvim/ascii.h"
+#include "nvim/mark.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "cursor.c.generated.h"
@@ -115,11 +121,11 @@ static int coladvance2(
--curwin->w_curswant;
}
} else {
- int width = curwin->w_width - win_col_off(curwin);
+ int width = curwin->w_grid.Columns - win_col_off(curwin);
if (finetune
&& curwin->w_p_wrap
- && curwin->w_width != 0
+ && curwin->w_grid.Columns != 0
&& wcol >= (colnr_T)width) {
csize = linetabsize(line);
if (csize > 0)
@@ -139,7 +145,7 @@ static int coladvance2(
while (col <= wcol && *ptr != NUL) {
/* Count a tab for what it's worth (if list mode not on) */
csize = win_lbr_chartabsize(curwin, line, ptr, col, &head);
- mb_ptr_adv(ptr);
+ MB_PTR_ADV(ptr);
col += csize;
}
idx = (int)(ptr - line);
@@ -165,7 +171,9 @@ static int coladvance2(
if (line[idx] == NUL) {
/* Append spaces */
int correct = wcol - col;
- char_u *newline = xmallocz((size_t)(idx + correct));
+ size_t newline_size;
+ STRICT_ADD(idx, correct, &newline_size, size_t);
+ char_u *newline = xmallocz(newline_size);
memcpy(newline, line, (size_t)idx);
memset(newline + idx, ' ', (size_t)correct);
@@ -182,14 +190,17 @@ static int coladvance2(
if (-correct > csize)
return FAIL;
- newline = xmallocz((size_t)(linelen - 1 + csize));
+ size_t n;
+ STRICT_ADD(linelen - 1, csize, &n, size_t);
+ newline = xmallocz(n);
// Copy first idx chars
memcpy(newline, line, (size_t)idx);
// Replace idx'th char with csize spaces
memset(newline + idx, ' ', (size_t)csize);
// Copy the rest of the line
- memcpy(newline + idx + csize, line + idx + 1,
- (size_t)(linelen - idx - 1));
+ STRICT_SUB(linelen, idx, &n, size_t);
+ STRICT_SUB(n, 1, &n, size_t);
+ memcpy(newline + idx + csize, line + idx + 1, n);
ml_replace(pos->lnum, newline, false);
changed_bytes(pos->lnum, idx);
@@ -218,17 +229,19 @@ static int coladvance2(
} else {
int b = (int)wcol - (int)col;
- /* The difference between wcol and col is used to set coladd. */
- if (b > 0 && b < (MAXCOL - 2 * curwin->w_width))
+ // The difference between wcol and col is used to set coladd.
+ if (b > 0 && b < (MAXCOL - 2 * curwin->w_grid.Columns)) {
pos->coladd = b;
+ }
col += b;
}
}
- /* prevent from moving onto a trail byte */
- if (has_mbyte)
- mb_adjustpos(curbuf, pos);
+ // Prevent from moving onto a trail byte.
+ if (has_mbyte) {
+ mark_mb_adjustpos(curbuf, pos);
+ }
if (col < wcol)
return FAIL;
@@ -293,6 +306,26 @@ linenr_T get_cursor_rel_lnum(win_T *wp, linenr_T lnum)
return (lnum < cursor) ? -retval : retval;
}
+// Make sure "pos.lnum" and "pos.col" are valid in "buf".
+// This allows for the col to be on the NUL byte.
+void check_pos(buf_T *buf, pos_T *pos)
+{
+ char_u *line;
+ colnr_T len;
+
+ if (pos->lnum > buf->b_ml.ml_line_count) {
+ pos->lnum = buf->b_ml.ml_line_count;
+ }
+
+ if (pos->col > 0) {
+ line = ml_get_buf(buf, pos->lnum, false);
+ len = (colnr_T)STRLEN(line);
+ if (pos->col > len) {
+ pos->col = len;
+ }
+ }
+}
+
/*
* Make sure curwin->w_cursor.lnum is valid.
*/
@@ -317,9 +350,8 @@ void check_cursor_col(void)
check_cursor_col_win(curwin);
}
-/*
- * Make sure win->w_cursor.col is valid.
- */
+/// Make sure win->w_cursor.col is valid. Special handling of insert-mode.
+/// @see mb_check_adjust_col
void check_cursor_col_win(win_T *win)
{
colnr_T len;
@@ -341,25 +373,40 @@ void check_cursor_col_win(win_T *win)
win->w_cursor.col = len;
} else {
win->w_cursor.col = len - 1;
- /* Move the cursor to the head byte. */
- if (has_mbyte)
- mb_adjustpos(win->w_buffer, &win->w_cursor);
+ // Move the cursor to the head byte.
+ if (has_mbyte) {
+ mark_mb_adjustpos(win->w_buffer, &win->w_cursor);
+ }
}
} else if (win->w_cursor.col < 0) {
win->w_cursor.col = 0;
}
- /* If virtual editing is on, we can leave the cursor on the old position,
- * only we must set it to virtual. But don't do it when at the end of the
- * line. */
- if (oldcol == MAXCOL)
+ // If virtual editing is on, we can leave the cursor on the old position,
+ // only we must set it to virtual. But don't do it when at the end of the
+ // line.
+ if (oldcol == MAXCOL) {
win->w_cursor.coladd = 0;
- else if (ve_flags == VE_ALL) {
- if (oldcoladd > win->w_cursor.col)
+ } else if (ve_flags == VE_ALL) {
+ if (oldcoladd > win->w_cursor.col) {
win->w_cursor.coladd = oldcoladd - win->w_cursor.col;
- else
- /* avoid weird number when there is a miscalculation or overflow */
+
+ // Make sure that coladd is not more than the char width.
+ // Not for the last character, coladd is then used when the cursor
+ // is actually after the last character.
+ if (win->w_cursor.col + 1 < len) {
+ assert(win->w_cursor.coladd > 0);
+ int cs, ce;
+
+ getvcol(win, &win->w_cursor, &cs, NULL, &ce);
+ if (win->w_cursor.coladd > ce - cs) {
+ win->w_cursor.coladd = ce - cs;
+ }
+ }
+ } else {
+ // avoid weird number when there is a miscalculation or overflow
win->w_cursor.coladd = 0;
+ }
}
}
@@ -397,7 +444,7 @@ bool leftcol_changed(void)
bool retval = false;
changed_cline_bef_curs();
- lastcol = curwin->w_leftcol + curwin->w_width - curwin_col_off() - 1;
+ lastcol = curwin->w_leftcol + curwin->w_grid.Columns - curwin_col_off() - 1;
validate_virtcol();
/*
@@ -437,9 +484,7 @@ bool leftcol_changed(void)
int gchar_cursor(void)
{
- if (has_mbyte)
- return (*mb_ptr2char)(get_cursor_pos_ptr());
- return (int)*get_cursor_pos_ptr();
+ return utf_ptr2char(get_cursor_pos_ptr());
}
/*
@@ -468,4 +513,3 @@ char_u *get_cursor_pos_ptr(void)
return ml_get_buf(curbuf, curwin->w_cursor.lnum, false) +
curwin->w_cursor.col;
}
-
diff --git a/src/nvim/cursor.h b/src/nvim/cursor.h
index 09cc5a813c..1cbe8a609e 100644
--- a/src/nvim/cursor.h
+++ b/src/nvim/cursor.h
@@ -4,7 +4,6 @@
#include <stdbool.h>
#include "nvim/vim.h"
-#include "nvim/misc2.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "cursor.h.generated.h"
diff --git a/src/nvim/cursor_shape.c b/src/nvim/cursor_shape.c
index 87425ca567..0377cb97e5 100644
--- a/src/nvim/cursor_shape.c
+++ b/src/nvim/cursor_shape.c
@@ -1,90 +1,132 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <stdint.h>
#include "nvim/vim.h"
#include "nvim/ascii.h"
#include "nvim/cursor_shape.h"
-#include "nvim/misc2.h"
#include "nvim/ex_getln.h"
#include "nvim/charset.h"
#include "nvim/strings.h"
#include "nvim/syntax.h"
+#include "nvim/api/private/helpers.h"
+#include "nvim/ui.h"
-/*
- * Handling of cursor and mouse pointer shapes in various modes.
- */
-
-static cursorentry_T shape_table[SHAPE_IDX_COUNT] =
+/// Handling of cursor and mouse pointer shapes in various modes.
+cursorentry_T shape_table[SHAPE_IDX_COUNT] =
{
- /* The values will be filled in from the 'guicursor' and 'mouseshape'
- * defaults when Vim starts.
- * Adjust the SHAPE_IDX_ defines when making changes! */
- {0, 0, 0, 700L, 400L, 250L, 0, 0, "n", SHAPE_CURSOR+SHAPE_MOUSE},
- {0, 0, 0, 700L, 400L, 250L, 0, 0, "v", SHAPE_CURSOR+SHAPE_MOUSE},
- {0, 0, 0, 700L, 400L, 250L, 0, 0, "i", SHAPE_CURSOR+SHAPE_MOUSE},
- {0, 0, 0, 700L, 400L, 250L, 0, 0, "r", SHAPE_CURSOR+SHAPE_MOUSE},
- {0, 0, 0, 700L, 400L, 250L, 0, 0, "c", SHAPE_CURSOR+SHAPE_MOUSE},
- {0, 0, 0, 700L, 400L, 250L, 0, 0, "ci", SHAPE_CURSOR+SHAPE_MOUSE},
- {0, 0, 0, 700L, 400L, 250L, 0, 0, "cr", SHAPE_CURSOR+SHAPE_MOUSE},
- {0, 0, 0, 700L, 400L, 250L, 0, 0, "o", SHAPE_CURSOR+SHAPE_MOUSE},
- {0, 0, 0, 700L, 400L, 250L, 0, 0, "ve", SHAPE_CURSOR+SHAPE_MOUSE},
- {0, 0, 0, 0L, 0L, 0L, 0, 0, "e", SHAPE_MOUSE},
- {0, 0, 0, 0L, 0L, 0L, 0, 0, "s", SHAPE_MOUSE},
- {0, 0, 0, 0L, 0L, 0L, 0, 0, "sd", SHAPE_MOUSE},
- {0, 0, 0, 0L, 0L, 0L, 0, 0, "vs", SHAPE_MOUSE},
- {0, 0, 0, 0L, 0L, 0L, 0, 0, "vd", SHAPE_MOUSE},
- {0, 0, 0, 0L, 0L, 0L, 0, 0, "m", SHAPE_MOUSE},
- {0, 0, 0, 0L, 0L, 0L, 0, 0, "ml", SHAPE_MOUSE},
- {0, 0, 0, 100L, 100L, 100L, 0, 0, "sm", SHAPE_CURSOR},
+ // Values are set by 'guicursor' and 'mouseshape'.
+ // Adjust the SHAPE_IDX_ defines when changing this!
+ { "normal", 0, 0, 0, 700L, 400L, 250L, 0, 0, "n", SHAPE_CURSOR+SHAPE_MOUSE },
+ { "visual", 0, 0, 0, 700L, 400L, 250L, 0, 0, "v", SHAPE_CURSOR+SHAPE_MOUSE },
+ { "insert", 0, 0, 0, 700L, 400L, 250L, 0, 0, "i", SHAPE_CURSOR+SHAPE_MOUSE },
+ { "replace", 0, 0, 0, 700L, 400L, 250L, 0, 0, "r", SHAPE_CURSOR+SHAPE_MOUSE },
+ { "cmdline_normal", 0, 0, 0, 700L, 400L, 250L, 0, 0, "c", SHAPE_CURSOR+SHAPE_MOUSE },
+ { "cmdline_insert", 0, 0, 0, 700L, 400L, 250L, 0, 0, "ci", SHAPE_CURSOR+SHAPE_MOUSE },
+ { "cmdline_replace", 0, 0, 0, 700L, 400L, 250L, 0, 0, "cr", SHAPE_CURSOR+SHAPE_MOUSE },
+ { "operator", 0, 0, 0, 700L, 400L, 250L, 0, 0, "o", SHAPE_CURSOR+SHAPE_MOUSE },
+ { "visual_select", 0, 0, 0, 700L, 400L, 250L, 0, 0, "ve", SHAPE_CURSOR+SHAPE_MOUSE },
+ { "cmdline_hover", 0, 0, 0, 0L, 0L, 0L, 0, 0, "e", SHAPE_MOUSE },
+ { "statusline_hover", 0, 0, 0, 0L, 0L, 0L, 0, 0, "s", SHAPE_MOUSE },
+ { "statusline_drag", 0, 0, 0, 0L, 0L, 0L, 0, 0, "sd", SHAPE_MOUSE },
+ { "vsep_hover", 0, 0, 0, 0L, 0L, 0L, 0, 0, "vs", SHAPE_MOUSE },
+ { "vsep_drag", 0, 0, 0, 0L, 0L, 0L, 0, 0, "vd", SHAPE_MOUSE },
+ { "more", 0, 0, 0, 0L, 0L, 0L, 0, 0, "m", SHAPE_MOUSE },
+ { "more_lastline", 0, 0, 0, 0L, 0L, 0L, 0, 0, "ml", SHAPE_MOUSE },
+ { "showmatch", 0, 0, 0, 100L, 100L, 100L, 0, 0, "sm", SHAPE_CURSOR },
};
-/*
- * Parse the 'guicursor' option ("what" is SHAPE_CURSOR) or 'mouseshape'
- * ("what" is SHAPE_MOUSE).
- * Returns error message for an illegal option, NULL otherwise.
- */
+/// Converts cursor_shapes into an Array of Dictionaries
+/// @return Array of the form {[ "cursor_shape": ... ], ...}
+Array mode_style_array(void)
+{
+ Array all = ARRAY_DICT_INIT;
+
+ for (int i = 0; i < SHAPE_IDX_COUNT; i++) {
+ Dictionary dic = ARRAY_DICT_INIT;
+ cursorentry_T *cur = &shape_table[i];
+ if (cur->used_for & SHAPE_MOUSE) {
+ PUT(dic, "mouse_shape", INTEGER_OBJ(cur->mshape));
+ }
+ if (cur->used_for & SHAPE_CURSOR) {
+ String shape_str;
+ switch (cur->shape) {
+ case SHAPE_BLOCK: shape_str = cstr_to_string("block"); break;
+ case SHAPE_VER: shape_str = cstr_to_string("vertical"); break;
+ case SHAPE_HOR: shape_str = cstr_to_string("horizontal"); break;
+ default: shape_str = cstr_to_string("unknown");
+ }
+ PUT(dic, "cursor_shape", STRING_OBJ(shape_str));
+ PUT(dic, "cell_percentage", INTEGER_OBJ(cur->percentage));
+ PUT(dic, "blinkwait", INTEGER_OBJ(cur->blinkwait));
+ PUT(dic, "blinkon", INTEGER_OBJ(cur->blinkon));
+ PUT(dic, "blinkoff", INTEGER_OBJ(cur->blinkoff));
+ PUT(dic, "hl_id", INTEGER_OBJ(cur->id));
+ PUT(dic, "id_lm", INTEGER_OBJ(cur->id_lm));
+ PUT(dic, "attr_id", INTEGER_OBJ(cur->id ? syn_id2attr(cur->id) : 0));
+ PUT(dic, "attr_id_lm", INTEGER_OBJ(cur->id_lm ? syn_id2attr(cur->id_lm)
+ : 0));
+ }
+ PUT(dic, "name", STRING_OBJ(cstr_to_string(cur->full_name)));
+ PUT(dic, "short_name", STRING_OBJ(cstr_to_string(cur->name)));
+
+ ADD(all, DICTIONARY_OBJ(dic));
+ }
+
+ return all;
+}
+
+/// Parse the 'guicursor' option
+///
+/// @param what SHAPE_CURSOR or SHAPE_MOUSE ('mouseshape')
+///
+/// @returns error message for an illegal option, NULL otherwise.
char_u *parse_shape_opt(int what)
{
char_u *modep;
char_u *colonp;
char_u *commap;
char_u *slashp;
- char_u *p, *endp;
- int idx = 0; /* init for GCC */
+ char_u *p = NULL;
+ char_u *endp;
+ int idx = 0; // init for GCC
int all_idx;
int len;
int i;
- int found_ve = false; /* found "ve" flag */
+ int found_ve = false; // found "ve" flag
int round;
- /*
- * First round: check for errors; second round: do it for real.
- */
- for (round = 1; round <= 2; ++round) {
- /*
- * Repeat for all comma separated parts.
- */
+ // First round: check for errors; second round: do it for real.
+ for (round = 1; round <= 2; round++) {
+ // Repeat for all comma separated parts.
modep = p_guicursor;
+ if (*p_guicursor == NUL) {
+ modep = (char_u *)"a:block-blinkon0";
+ }
while (*modep != NUL) {
colonp = vim_strchr(modep, ':');
- if (colonp == NULL)
+ commap = vim_strchr(modep, ',');
+
+ if (colonp == NULL || (commap != NULL && commap < colonp)) {
return (char_u *)N_("E545: Missing colon");
- if (colonp == modep)
+ }
+ if (colonp == modep) {
return (char_u *)N_("E546: Illegal mode");
- commap = vim_strchr(modep, ',');
+ }
- /*
- * Repeat for all mode's before the colon.
- * For the 'a' mode, we loop to handle all the modes.
- */
+ // Repeat for all modes before the colon.
+ // For the 'a' mode, we loop to handle all the modes.
all_idx = -1;
assert(modep < colonp);
while (modep < colonp || all_idx >= 0) {
if (all_idx < 0) {
- /* Find the mode. */
- if (modep[1] == '-' || modep[1] == ':')
+ // Find the mode
+ if (modep[1] == '-' || modep[1] == ':') {
len = 1;
- else
+ } else {
len = 2;
+ }
if (len == 1 && TOLOWER_ASC(modep[0]) == 'a') {
all_idx = SHAPE_IDX_COUNT - 1;
@@ -101,15 +143,15 @@ char_u *parse_shape_opt(int what)
modep += len + 1;
}
- if (all_idx >= 0)
+ if (all_idx >= 0) {
idx = all_idx--;
- else if (round == 2) {
+ } else if (round == 2) {
{
- /* Set the defaults, for the missing parts */
+ // Set the defaults, for the missing parts
shape_table[idx].shape = SHAPE_BLOCK;
- shape_table[idx].blinkwait = 700L;
- shape_table[idx].blinkon = 400L;
- shape_table[idx].blinkoff = 250L;
+ shape_table[idx].blinkwait = 0L;
+ shape_table[idx].blinkon = 0L;
+ shape_table[idx].blinkoff = 0L;
}
}
@@ -209,6 +251,80 @@ char_u *parse_shape_opt(int what)
shape_table[SHAPE_IDX_VE].id_lm = shape_table[SHAPE_IDX_V].id_lm;
}
}
-
+ ui_mode_info_set();
return NULL;
}
+
+/// Returns true if the cursor is non-blinking "block" shape during
+/// visual selection.
+///
+/// @param exclusive If 'selection' option is "exclusive".
+bool cursor_is_block_during_visual(bool exclusive)
+{
+ int mode_idx = exclusive ? SHAPE_IDX_VE : SHAPE_IDX_V;
+ return (SHAPE_BLOCK == shape_table[mode_idx].shape
+ && 0 == shape_table[mode_idx].blinkon);
+}
+
+/// Map cursor mode from string to integer
+///
+/// @param mode Fullname of the mode whose id we are looking for
+/// @return -1 in case of failure, else the matching SHAPE_ID* integer
+int cursor_mode_str2int(const char *mode)
+{
+ for (int mode_idx = 0; mode_idx < SHAPE_IDX_COUNT; mode_idx++) {
+ if (strcmp(shape_table[mode_idx].full_name, mode) == 0) {
+ return mode_idx;
+ }
+ }
+ WLOG("Unknown mode %s", mode);
+ return -1;
+}
+
+/// Check if a syntax id is used as a cursor style.
+bool cursor_mode_uses_syn_id(int syn_id)
+{
+ if (*p_guicursor == NUL) {
+ return false;
+ }
+ for (int mode_idx = 0; mode_idx < SHAPE_IDX_COUNT; mode_idx++) {
+ if (shape_table[mode_idx].id == syn_id
+ || shape_table[mode_idx].id_lm == syn_id) {
+ return true;
+ }
+ }
+ return false;
+}
+
+
+/// Return the index into shape_table[] for the current mode.
+int cursor_get_mode_idx(void)
+{
+ if (State == SHOWMATCH) {
+ return SHAPE_IDX_SM;
+ } else if (State & VREPLACE_FLAG) {
+ return SHAPE_IDX_R;
+ } else if (State & REPLACE_FLAG) {
+ return SHAPE_IDX_R;
+ } else if (State & INSERT) {
+ return SHAPE_IDX_I;
+ } else if (State & CMDLINE) {
+ if (cmdline_at_end()) {
+ return SHAPE_IDX_C;
+ } else if (cmdline_overstrike()) {
+ return SHAPE_IDX_CR;
+ } else {
+ return SHAPE_IDX_CI;
+ }
+ } else if (finish_op) {
+ return SHAPE_IDX_O;
+ } else if (VIsual_active) {
+ if (*p_sel == 'e') {
+ return SHAPE_IDX_VE;
+ } else {
+ return SHAPE_IDX_V;
+ }
+ } else {
+ return SHAPE_IDX_N;
+ }
+}
diff --git a/src/nvim/cursor_shape.h b/src/nvim/cursor_shape.h
index 9ce1b6e0a0..2c466603f0 100644
--- a/src/nvim/cursor_shape.h
+++ b/src/nvim/cursor_shape.h
@@ -1,32 +1,37 @@
#ifndef NVIM_CURSOR_SHAPE_H
#define NVIM_CURSOR_SHAPE_H
-/*
- * struct to store values from 'guicursor' and 'mouseshape'
- */
-/* Indexes in shape_table[] */
-#define SHAPE_IDX_N 0 /* Normal mode */
-#define SHAPE_IDX_V 1 /* Visual mode */
-#define SHAPE_IDX_I 2 /* Insert mode */
-#define SHAPE_IDX_R 3 /* Replace mode */
-#define SHAPE_IDX_C 4 /* Command line Normal mode */
-#define SHAPE_IDX_CI 5 /* Command line Insert mode */
-#define SHAPE_IDX_CR 6 /* Command line Replace mode */
-#define SHAPE_IDX_O 7 /* Operator-pending mode */
-#define SHAPE_IDX_VE 8 /* Visual mode with 'selection' exclusive */
-#define SHAPE_IDX_CLINE 9 /* On command line */
-#define SHAPE_IDX_STATUS 10 /* A status line */
-#define SHAPE_IDX_SDRAG 11 /* dragging a status line */
-#define SHAPE_IDX_VSEP 12 /* A vertical separator line */
-#define SHAPE_IDX_VDRAG 13 /* dragging a vertical separator line */
-#define SHAPE_IDX_MORE 14 /* Hit-return or More */
-#define SHAPE_IDX_MOREL 15 /* Hit-return or More in last line */
-#define SHAPE_IDX_SM 16 /* showing matching paren */
-#define SHAPE_IDX_COUNT 17
-
-#define SHAPE_BLOCK 0 /* block cursor */
-#define SHAPE_HOR 1 /* horizontal bar cursor */
-#define SHAPE_VER 2 /* vertical bar cursor */
+#include "nvim/types.h"
+#include "nvim/api/private/defs.h"
+
+/// struct to store values from 'guicursor' and 'mouseshape'
+/// Indexes in shape_table[]
+typedef enum {
+SHAPE_IDX_N = 0, ///< Normal mode
+SHAPE_IDX_V = 1, ///< Visual mode
+SHAPE_IDX_I = 2, ///< Insert mode
+SHAPE_IDX_R = 3, ///< Replace mode
+SHAPE_IDX_C = 4, ///< Command line Normal mode
+SHAPE_IDX_CI = 5, ///< Command line Insert mode
+SHAPE_IDX_CR = 6, ///< Command line Replace mode
+SHAPE_IDX_O = 7, ///< Operator-pending mode
+SHAPE_IDX_VE = 8, ///< Visual mode with 'selection' exclusive
+SHAPE_IDX_CLINE = 9, ///< On command line
+SHAPE_IDX_STATUS = 10, ///< On status line
+SHAPE_IDX_SDRAG = 11, ///< dragging a status line
+SHAPE_IDX_VSEP = 12, ///< On vertical separator line
+SHAPE_IDX_VDRAG = 13, ///< dragging a vertical separator line
+SHAPE_IDX_MORE = 14, ///< Hit-return or More
+SHAPE_IDX_MOREL = 15, ///< Hit-return or More in last line
+SHAPE_IDX_SM = 16, ///< showing matching paren
+SHAPE_IDX_COUNT = 17
+} ModeShape;
+
+typedef enum {
+SHAPE_BLOCK = 0, ///< block cursor
+SHAPE_HOR = 1, ///< horizontal bar cursor
+SHAPE_VER = 2 ///< vertical bar cursor
+} CursorShape;
#define MSHAPE_NUMBERED 1000 /* offset for shapes identified by number */
#define MSHAPE_HIDE 1 /* hide mouse pointer */
@@ -35,18 +40,20 @@
#define SHAPE_CURSOR 2 /* used for text cursor shape */
typedef struct cursor_entry {
- int shape; /* one of the SHAPE_ defines */
- int mshape; /* one of the MSHAPE defines */
- int percentage; /* percentage of cell for bar */
- long blinkwait; /* blinking, wait time before blinking starts */
- long blinkon; /* blinking, on time */
- long blinkoff; /* blinking, off time */
- int id; /* highlight group ID */
- int id_lm; /* highlight group ID for :lmap mode */
- char *name; /* mode name (fixed) */
- char used_for; /* SHAPE_MOUSE and/or SHAPE_CURSOR */
+ char *full_name; ///< mode description
+ CursorShape shape; ///< cursor shape: one of the SHAPE_ defines
+ int mshape; ///< mouse shape: one of the MSHAPE defines
+ int percentage; ///< percentage of cell for bar
+ long blinkwait; ///< blinking, wait time before blinking starts
+ long blinkon; ///< blinking, on time
+ long blinkoff; ///< blinking, off time
+ int id; ///< highlight group ID
+ int id_lm; ///< highlight group ID for :lmap mode
+ char *name; ///< mode short name
+ char used_for; ///< SHAPE_MOUSE and/or SHAPE_CURSOR
} cursorentry_T;
+extern cursorentry_T shape_table[SHAPE_IDX_COUNT];
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "cursor_shape.h.generated.h"
diff --git a/src/nvim/diff.c b/src/nvim/diff.c
index 4826e70727..866161e5cf 100644
--- a/src/nvim/diff.c
+++ b/src/nvim/diff.c
@@ -1,11 +1,20 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/// @file diff.c
///
/// Code for diff'ing two, three or four buffers.
+///
+/// There are three ways to diff:
+/// - Shell out to an external diff program, using files.
+/// - Use the compiled-in xdiff library.
+/// - Let 'diffexpr' do the work, using files.
#include <inttypes.h>
#include <stdbool.h>
#include "nvim/vim.h"
+#include "xdiff/xdiff.h"
#include "nvim/ascii.h"
#include "nvim/diff.h"
#include "nvim/buffer.h"
@@ -21,7 +30,6 @@
#include "nvim/memline.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/memory.h"
#include "nvim/move.h"
#include "nvim/normal.h"
@@ -34,22 +42,50 @@
#include "nvim/os/os.h"
#include "nvim/os/shell.h"
-static int diff_busy = FALSE; // ex_diffgetput() is busy
+static int diff_busy = false; // using diff structs, don't change them
+static int diff_need_update = false; // ex_diffupdate needs to be called
// Flags obtained from the 'diffopt' option
-#define DIFF_FILLER 1 // display filler lines
-#define DIFF_ICASE 2 // ignore case
-#define DIFF_IWHITE 4 // ignore change in white space
-#define DIFF_HORIZONTAL 8 // horizontal splits
-#define DIFF_VERTICAL 16 // vertical splits
-static int diff_flags = DIFF_FILLER;
+#define DIFF_FILLER 0x001 // display filler lines
+#define DIFF_IBLANK 0x002 // ignore empty lines
+#define DIFF_ICASE 0x004 // ignore case
+#define DIFF_IWHITE 0x008 // ignore change in white space
+#define DIFF_IWHITEALL 0x010 // ignore all white space changes
+#define DIFF_IWHITEEOL 0x020 // ignore change in white space at EOL
+#define DIFF_HORIZONTAL 0x040 // horizontal splits
+#define DIFF_VERTICAL 0x080 // vertical splits
+#define DIFF_HIDDEN_OFF 0x100 // diffoff when hidden
+#define DIFF_INTERNAL 0x200 // use internal xdiff algorithm
+#define ALL_WHITE_DIFF (DIFF_IWHITE | DIFF_IWHITEALL | DIFF_IWHITEEOL)
+static int diff_flags = DIFF_INTERNAL | DIFF_FILLER;
+
+static long diff_algorithm = 0;
#define LBUFLEN 50 // length of line in diff file
-// TRUE when "diff -a" works, FALSE when it doesn't work, MAYBE when not
-// checked yet
-static int diff_a_works = MAYBE;
-
+// kTrue when "diff -a" works, kFalse when it doesn't work,
+// kNone when not checked yet
+static TriState diff_a_works = kNone;
+
+// used for diff input
+typedef struct {
+ char_u *din_fname; // used for external diff
+ mmfile_t din_mmfile; // used for internal diff
+} diffin_T;
+
+// used for diff result
+typedef struct {
+ char_u *dout_fname; // used for external diff
+ garray_T dout_ga; // used for internal diff
+} diffout_T;
+
+// two diff inputs and one result
+typedef struct {
+ diffin_T dio_orig; // original file input
+ diffin_T dio_new; // new file input
+ diffout_T dio_diff; // diff result
+ int dio_internal; // using internal diff
+} diffio_T;
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "diff.c.generated.h"
@@ -65,10 +101,10 @@ void diff_buf_delete(buf_T *buf)
if (i != DB_COUNT) {
tp->tp_diffbuf[i] = NULL;
- tp->tp_diff_invalid = TRUE;
+ tp->tp_diff_invalid = true;
if (tp == curtab) {
- diff_redraw(TRUE);
+ diff_redraw(true);
}
}
}
@@ -95,8 +131,8 @@ void diff_buf_adjust(win_T *win)
int i = diff_buf_idx(win->w_buffer);
if (i != DB_COUNT) {
curtab->tp_diffbuf[i] = NULL;
- curtab->tp_diff_invalid = TRUE;
- diff_redraw(TRUE);
+ curtab->tp_diff_invalid = true;
+ diff_redraw(true);
}
}
} else {
@@ -124,13 +160,27 @@ void diff_buf_add(buf_T *buf)
for (i = 0; i < DB_COUNT; ++i) {
if (curtab->tp_diffbuf[i] == NULL) {
curtab->tp_diffbuf[i] = buf;
- curtab->tp_diff_invalid = TRUE;
- diff_redraw(TRUE);
+ curtab->tp_diff_invalid = true;
+ diff_redraw(true);
return;
}
}
- EMSGN(_("E96: Can not diff more than %" PRId64 " buffers"), DB_COUNT);
+ EMSGN(_("E96: Cannot diff more than %" PRId64 " buffers"), DB_COUNT);
+}
+
+///
+/// Remove all buffers to make diffs for.
+///
+static void diff_buf_clear(void)
+{
+ for (int i = 0; i < DB_COUNT; i++) {
+ if (curtab->tp_diffbuf[i] != NULL) {
+ curtab->tp_diffbuf[i] = NULL;
+ curtab->tp_diff_invalid = true;
+ diff_redraw(true);
+ }
+ }
}
/// Find buffer "buf" in the list of diff buffers for the current tab page.
@@ -175,9 +225,9 @@ void diff_invalidate(buf_T *buf)
FOR_ALL_TABS(tp) {
int i = diff_buf_idx_tp(buf, tp);
if (i != DB_COUNT) {
- tp->tp_diff_invalid = TRUE;
+ tp->tp_diff_invalid = true;
if (tp == curtab) {
- diff_redraw(TRUE);
+ diff_redraw(true);
}
}
}
@@ -217,6 +267,15 @@ void diff_mark_adjust(linenr_T line1, linenr_T line2, long amount,
static void diff_mark_adjust_tp(tabpage_T *tp, int idx, linenr_T line1,
linenr_T line2, long amount, long amount_after)
{
+ if (diff_internal()) {
+ // Will update diffs before redrawing. Set _invalid to update the
+ // diffs themselves, set _update to also update folds properly just
+ // before redrawing.
+ // Do update marks here, it is needed for :%diffput.
+ tp->tp_diff_invalid = true;
+ tp->tp_diff_update = true;
+ }
+
int inserted;
int deleted;
if (line2 == MAXLNUM) {
@@ -276,14 +335,14 @@ static void diff_mark_adjust_tp(tabpage_T *tp, int idx, linenr_T line1,
//
// Check for these situations:
- // 1 2 3
- // 1 2 3
- // line1 2 3 4 5
- // 2 3 4 5
- // 2 3 4 5
- // line2 2 3 4 5
- // 3 5 6
- // 3 5 6
+ // 1 2 3
+ // 1 2 3
+ // line1 2 3 4 5
+ // 2 3 4 5
+ // 2 3 4 5
+ // line2 2 3 4 5
+ // 3 5 6
+ // 3 5 6
// compute last line of this change
last = dp->df_lnum[idx] + dp->df_count[idx] - 1;
@@ -299,7 +358,7 @@ static void diff_mark_adjust_tp(tabpage_T *tp, int idx, linenr_T line1,
}
dp->df_lnum[idx] += amount_after;
} else {
- int check_unchanged = FALSE;
+ int check_unchanged = false;
// 2. 3. 4. 5.: inserted/deleted lines touching this diff.
if (deleted > 0) {
@@ -324,7 +383,7 @@ static void diff_mark_adjust_tp(tabpage_T *tp, int idx, linenr_T line1,
// 5. delete lines at or just before top of diff
n = off;
dp->df_count[idx] -= line2 - dp->df_lnum[idx] + 1;
- check_unchanged = TRUE;
+ check_unchanged = true;
}
dp->df_lnum[idx] = line1;
} else {
@@ -344,7 +403,7 @@ static void diff_mark_adjust_tp(tabpage_T *tp, int idx, linenr_T line1,
} else {
n = line2 - last;
}
- check_unchanged = TRUE;
+ check_unchanged = true;
} else {
// 3. delete lines inside the diff
n = 0;
@@ -363,7 +422,7 @@ static void diff_mark_adjust_tp(tabpage_T *tp, int idx, linenr_T line1,
if (dp->df_lnum[idx] <= line1) {
// inserted lines somewhere in this diff
dp->df_count[idx] += inserted;
- check_unchanged = TRUE;
+ check_unchanged = true;
} else {
// inserted lines somewhere above this diff
dp->df_lnum[idx] += inserted;
@@ -430,12 +489,12 @@ static void diff_mark_adjust_tp(tabpage_T *tp, int idx, linenr_T line1,
}
if (tp == curtab) {
- diff_redraw(TRUE);
+ diff_redraw(true);
// Need to recompute the scroll binding, may remove or add filler
// lines (e.g., when adding lines above w_topline). But it's slow when
// making many changes, postpone until redrawing.
- diff_need_scrollbind = TRUE;
+ diff_need_scrollbind = true;
}
}
@@ -502,7 +561,7 @@ static void diff_check_unchanged(tabpage_T *tp, diff_T *dp)
}
char_u *line_org = vim_strsave(ml_get_buf(tp->tp_diffbuf[i_org],
dp->df_lnum[i_org] + off_org,
- FALSE));
+ false));
int i_new;
for (i_new = i_org + 1; i_new < DB_COUNT; ++i_new) {
@@ -521,7 +580,7 @@ static void diff_check_unchanged(tabpage_T *tp, diff_T *dp)
if (diff_cmp(line_org, ml_get_buf(tp->tp_diffbuf[i_new],
dp->df_lnum[i_new] + off_new,
- FALSE)) != 0) {
+ false)) != 0) {
break;
}
}
@@ -595,42 +654,243 @@ static void diff_redraw(int dofold)
} else if ((n > 0) && (n > wp->w_topfill)) {
wp->w_topfill = n;
}
- check_topfill(wp, FALSE);
+ check_topfill(wp, false);
+ }
+ }
+}
+
+static void clear_diffin(diffin_T *din)
+{
+ if (din->din_fname == NULL) {
+ xfree(din->din_mmfile.ptr);
+ din->din_mmfile.ptr = NULL;
+ } else {
+ os_remove((char *)din->din_fname);
+ }
+}
+
+static void clear_diffout(diffout_T *dout)
+{
+ if (dout->dout_fname == NULL) {
+ ga_clear_strings(&dout->dout_ga);
+ } else {
+ os_remove((char *)dout->dout_fname);
+ }
+}
+
+/// Write buffer "buf" to a memory buffer.
+///
+/// @param buf
+/// @param din
+///
+/// @return FAIL for failure.
+static int diff_write_buffer(buf_T *buf, diffin_T *din)
+{
+ linenr_T lnum;
+ char_u *s;
+ long len = 0;
+ char_u *ptr;
+
+ // xdiff requires one big block of memory with all the text.
+ for (lnum = 1; lnum <= buf->b_ml.ml_line_count; lnum++) {
+ len += (long)STRLEN(ml_get_buf(buf, lnum, false)) + 1;
+ }
+ ptr = try_malloc(len);
+ if (ptr == NULL) {
+ // Allocating memory failed. This can happen, because we try to read
+ // the whole buffer text into memory. Set the failed flag, the diff
+ // will be retried with external diff. The flag is never reset.
+ buf->b_diff_failed = true;
+ if (p_verbose > 0) {
+ verbose_enter();
+ smsg(_("Not enough memory to use internal diff for buffer \"%s\""),
+ buf->b_fname);
+ verbose_leave();
+ }
+ return FAIL;
+ }
+ din->din_mmfile.ptr = (char *)ptr;
+ din->din_mmfile.size = len;
+
+ len = 0;
+ for (lnum = 1; lnum <= buf->b_ml.ml_line_count; lnum++) {
+ for (s = ml_get_buf(buf, lnum, false); *s != NUL; ) {
+ if (diff_flags & DIFF_ICASE) {
+ int c;
+
+ // xdiff doesn't support ignoring case, fold-case the text.
+ int orig_len;
+ char_u cbuf[MB_MAXBYTES + 1];
+
+ c = PTR2CHAR(s);
+ c = enc_utf8 ? utf_fold(c) : TOLOWER_LOC(c);
+ orig_len = MB_PTR2LEN(s);
+ if (utf_char2bytes(c, cbuf) != orig_len) {
+ // TODO(Bram): handle byte length difference
+ memmove(ptr + len, s, orig_len);
+ } else {
+ memmove(ptr + len, cbuf, orig_len);
+ }
+
+ s += orig_len;
+ len += orig_len;
+ } else {
+ ptr[len++] = *s++;
+ }
}
+ ptr[len++] = NL;
}
+ return OK;
}
-/// Write buffer "buf" to file "name".
+/// Write buffer "buf" to file or memory buffer.
///
/// Always use 'fileformat' set to "unix".
///
/// @param buf
-/// @param fname
+/// @param din
///
/// @return FAIL for failure
-static int diff_write(buf_T *buf, char_u *fname)
+static int diff_write(buf_T *buf, diffin_T *din)
{
+ if (din->din_fname == NULL) {
+ return diff_write_buffer(buf, din);
+ }
+
+ // Always use 'fileformat' set to "unix".
char_u *save_ff = buf->b_p_ff;
buf->b_p_ff = vim_strsave((char_u *)FF_UNIX);
- int r = buf_write(buf, fname, NULL, (linenr_T)1, buf->b_ml.ml_line_count,
- NULL, FALSE, FALSE, FALSE, TRUE);
+ int r = buf_write(buf, din->din_fname, NULL,
+ (linenr_T)1, buf->b_ml.ml_line_count,
+ NULL, false, false, false, true);
free_string_option(buf->b_p_ff);
buf->b_p_ff = save_ff;
return r;
}
+///
+/// Update the diffs for all buffers involved.
+///
+/// @param dio
+/// @param idx_orig
+/// @param eap can be NULL
+static void diff_try_update(diffio_T *dio,
+ int idx_orig,
+ exarg_T *eap)
+{
+ buf_T *buf;
+ int idx_new;
+
+ if (dio->dio_internal) {
+ ga_init(&dio->dio_diff.dout_ga, sizeof(char *), 1000);
+ } else {
+ // We need three temp file names.
+ dio->dio_orig.din_fname = vim_tempname();
+ dio->dio_new.din_fname = vim_tempname();
+ dio->dio_diff.dout_fname = vim_tempname();
+ if (dio->dio_orig.din_fname == NULL
+ || dio->dio_new.din_fname == NULL
+ || dio->dio_diff.dout_fname == NULL) {
+ goto theend;
+ }
+ }
+
+ // Check external diff is actually working.
+ if (!dio->dio_internal && check_external_diff(dio) == FAIL) {
+ goto theend;
+ }
+
+ // :diffupdate!
+ if (eap != NULL && eap->forceit) {
+ for (idx_new = idx_orig; idx_new < DB_COUNT; idx_new++) {
+ buf = curtab->tp_diffbuf[idx_new];
+ if (buf_valid(buf)) {
+ buf_check_timestamp(buf, false);
+ }
+ }
+ }
+
+ // Write the first buffer to a tempfile or mmfile_t.
+ buf = curtab->tp_diffbuf[idx_orig];
+ if (diff_write(buf, &dio->dio_orig) == FAIL) {
+ goto theend;
+ }
+
+ // Make a difference between the first buffer and every other.
+ for (idx_new = idx_orig + 1; idx_new < DB_COUNT; idx_new++) {
+ buf = curtab->tp_diffbuf[idx_new];
+ if (buf == NULL || buf->b_ml.ml_mfp == NULL) {
+ continue; // skip buffer that isn't loaded
+ }
+
+ // Write the other buffer and diff with the first one.
+ if (diff_write(buf, &dio->dio_new) == FAIL) {
+ continue;
+ }
+ if (diff_file(dio) == FAIL) {
+ continue;
+ }
+
+ // Read the diff output and add each entry to the diff list.
+ diff_read(idx_orig, idx_new, &dio->dio_diff);
+
+ clear_diffin(&dio->dio_new);
+ clear_diffout(&dio->dio_diff);
+ }
+ clear_diffin(&dio->dio_orig);
+
+theend:
+ xfree(dio->dio_orig.din_fname);
+ xfree(dio->dio_new.din_fname);
+ xfree(dio->dio_diff.dout_fname);
+}
+
+///
+/// Return true if the options are set to use the internal diff library.
+/// Note that if the internal diff failed for one of the buffers, the external
+/// diff will be used anyway.
+///
+int diff_internal(void)
+{
+ return (diff_flags & DIFF_INTERNAL) != 0 && *p_dex == NUL;
+}
+
+///
+/// Return true if the internal diff failed for one of the diff buffers.
+///
+static int diff_internal_failed(void)
+{
+ int idx;
+
+ // Only need to do something when there is another buffer.
+ for (idx = 0; idx < DB_COUNT; idx++) {
+ if (curtab->tp_diffbuf[idx] != NULL
+ && curtab->tp_diffbuf[idx]->b_diff_failed) {
+ return true;
+ }
+ }
+ return false;
+}
+
/// Completely update the diffs for the buffers involved.
///
-/// This uses the ordinary "diff" command.
-/// The buffers are written to a file, also for unmodified buffers (the file
-/// could have been produced by autocommands, e.g. the netrw plugin).
+/// When using the external "diff" command the buffers are written to a file,
+/// also for unmodified buffers (the file could have been produced by
+/// autocommands, e.g. the netrw plugin).
///
/// @param eap can be NULL
void ex_diffupdate(exarg_T *eap)
{
+ if (diff_busy) {
+ diff_need_update = true;
+ return;
+ }
+
+ int had_diffs = curtab->tp_first_diff != NULL;
+
// Delete all diffblocks.
diff_clear(curtab);
- curtab->tp_diff_invalid = FALSE;
+ curtab->tp_diff_invalid = false;
// Use the first buffer as the original text.
int idx_orig;
@@ -641,7 +901,7 @@ void ex_diffupdate(exarg_T *eap)
}
if (idx_orig == DB_COUNT) {
- return;
+ goto theend;
}
// Only need to do something when there is another buffer.
@@ -653,49 +913,70 @@ void ex_diffupdate(exarg_T *eap)
}
if (idx_new == DB_COUNT) {
- return;
+ goto theend;
}
- // We need three temp file names.
- char *tmp_orig = (char *) vim_tempname();
- char *tmp_new = (char *) vim_tempname();
- char *tmp_diff = (char *) vim_tempname();
+ // Only use the internal method if it did not fail for one of the buffers.
+ diffio_T diffio;
+ memset(&diffio, 0, sizeof(diffio));
+ diffio.dio_internal = diff_internal() && !diff_internal_failed();
- if ((tmp_orig == NULL) || (tmp_new == NULL) || (tmp_diff == NULL)) {
- goto theend;
+ diff_try_update(&diffio, idx_orig, eap);
+ if (diffio.dio_internal && diff_internal_failed()) {
+ // Internal diff failed, use external diff instead.
+ memset(&diffio, 0, sizeof(diffio));
+ diff_try_update(&diffio, idx_orig, eap);
+ }
+
+ // force updating cursor position on screen
+ curwin->w_valid_cursor.lnum = 0;
+
+theend:
+ // A redraw is needed if there were diffs and they were cleared, or there
+ // are diffs now, which means they got updated.
+ if (had_diffs || curtab->tp_first_diff != NULL) {
+ diff_redraw(true);
+ apply_autocmds(EVENT_DIFFUPDATED, NULL, NULL, false, curbuf);
}
+}
- // Do a quick test if "diff" really works. Otherwise it looks like there
- // are no differences. Can't use the return value, it's non-zero when
- // there are differences.
+///
+/// Do a quick test if "diff" really works. Otherwise it looks like there
+/// are no differences. Can't use the return value, it's non-zero when
+/// there are differences.
+///
+static int check_external_diff(diffio_T *diffio)
+{
// May try twice, first with "-a" and then without.
int io_error = false;
- bool ok = false;
+ TriState ok = kFalse;
for (;;) {
- ok = false;
- FILE *fd = mch_fopen(tmp_orig, "w");
+ ok = kFalse;
+ FILE *fd = mch_fopen((char *)diffio->dio_orig.din_fname, "w");
if (fd == NULL) {
- io_error = TRUE;
+ io_error = true;
} else {
if (fwrite("line1\n", (size_t)6, (size_t)1, fd) != 1) {
- io_error = TRUE;
+ io_error = true;
}
fclose(fd);
- fd = mch_fopen(tmp_new, "w");
+ fd = mch_fopen((char *)diffio->dio_new.din_fname, "w");
if (fd == NULL) {
- io_error = TRUE;
+ io_error = true;
} else {
if (fwrite("line2\n", (size_t)6, (size_t)1, fd) != 1) {
- io_error = TRUE;
+ io_error = true;
}
fclose(fd);
- diff_file(tmp_orig, tmp_new, tmp_diff);
- fd = mch_fopen(tmp_diff, "r");
+ fd = NULL;
+ if (diff_file(diffio) == OK) {
+ fd = mch_fopen((char *)diffio->dio_diff.dout_fname, "r");
+ }
if (fd == NULL) {
- io_error = TRUE;
+ io_error = true;
} else {
char_u linebuf[LBUFLEN];
@@ -706,15 +987,15 @@ void ex_diffupdate(exarg_T *eap)
}
if (STRNCMP(linebuf, "1c1", 3) == 0) {
- ok = TRUE;
+ ok = kTrue;
}
}
fclose(fd);
}
- os_remove(tmp_diff);
- os_remove(tmp_new);
+ os_remove((char *)diffio->dio_diff.dout_fname);
+ os_remove((char *)diffio->dio_new.din_fname);
}
- os_remove(tmp_orig);
+ os_remove((char *)diffio->dio_orig.din_fname);
}
// When using 'diffexpr' break here.
@@ -723,7 +1004,7 @@ void ex_diffupdate(exarg_T *eap)
}
// If we checked if "-a" works already, break here.
- if (diff_a_works != MAYBE) {
+ if (diff_a_works != kNone) {
break;
}
diff_a_works = ok;
@@ -739,84 +1020,90 @@ void ex_diffupdate(exarg_T *eap)
EMSG(_("E810: Cannot read or write temp files"));
}
EMSG(_("E97: Cannot create diffs"));
- diff_a_works = MAYBE;
- goto theend;
- }
-
- // :diffupdate!
- if ((eap != NULL) && eap->forceit) {
- for (idx_new = idx_orig; idx_new < DB_COUNT; ++idx_new) {
- buf_T *buf = curtab->tp_diffbuf[idx_new];
- if (buf_valid(buf)) {
- buf_check_timestamp(buf, FALSE);
- }
- }
+ diff_a_works = kNone;
+ return FAIL;
}
+ return OK;
+}
- // Write the first buffer to a tempfile.
- buf_T *buf = curtab->tp_diffbuf[idx_orig];
- if (diff_write(buf, (char_u *) tmp_orig) == FAIL) {
- goto theend;
- }
+///
+/// Invoke the xdiff function.
+///
+static int diff_file_internal(diffio_T *diffio)
+{
+ xpparam_t param;
+ xdemitconf_t emit_cfg;
+ xdemitcb_t emit_cb;
- // Make a difference between the first buffer and every other.
- for (idx_new = idx_orig + 1; idx_new < DB_COUNT; ++idx_new) {
- buf_T *buf = curtab->tp_diffbuf[idx_new];
- if (buf == NULL || buf->b_ml.ml_mfp == NULL) {
- continue; // skip buffer that isn't loaded
- }
+ memset(&param, 0, sizeof(param));
+ memset(&emit_cfg, 0, sizeof(emit_cfg));
+ memset(&emit_cb, 0, sizeof(emit_cb));
- if (diff_write(buf, (char_u *) tmp_new) == FAIL) {
- continue;
- }
- diff_file(tmp_orig, tmp_new, tmp_diff);
+ param.flags = diff_algorithm;
- // Read the diff output and add each entry to the diff list.
- diff_read(idx_orig, idx_new, (char_u *) tmp_diff);
- os_remove(tmp_diff);
- os_remove(tmp_new);
+ if (diff_flags & DIFF_IWHITE) {
+ param.flags |= XDF_IGNORE_WHITESPACE_CHANGE;
+ }
+ if (diff_flags & DIFF_IWHITEALL) {
+ param.flags |= XDF_IGNORE_WHITESPACE;
+ }
+ if (diff_flags & DIFF_IWHITEEOL) {
+ param.flags |= XDF_IGNORE_WHITESPACE_AT_EOL;
+ }
+ if (diff_flags & DIFF_IBLANK) {
+ param.flags |= XDF_IGNORE_BLANK_LINES;
}
- os_remove(tmp_orig);
-
- // force updating cursor position on screen
- curwin->w_valid_cursor.lnum = 0;
-
- diff_redraw(TRUE);
-theend:
- xfree(tmp_orig);
- xfree(tmp_new);
- xfree(tmp_diff);
+ emit_cfg.ctxlen = 0; // don't need any diff_context here
+ emit_cb.priv = &diffio->dio_diff;
+ emit_cb.outf = xdiff_out;
+ if (xdl_diff(&diffio->dio_orig.din_mmfile,
+ &diffio->dio_new.din_mmfile,
+ &param, &emit_cfg, &emit_cb) < 0) {
+ EMSG(_("E960: Problem creating the internal diff"));
+ return FAIL;
+ }
+ return OK;
}
/// Make a diff between files "tmp_orig" and "tmp_new", results in "tmp_diff".
///
-/// @param tmp_orig
-/// @param tmp_new
-/// @param tmp_diff
-static void diff_file(const char *const tmp_orig, const char *const tmp_new,
- const char *const tmp_diff)
+/// @param dio
+///
+/// @return OK or FAIL
+static int diff_file(diffio_T *dio)
{
+ char *tmp_orig = (char *)dio->dio_orig.din_fname;
+ char *tmp_new = (char *)dio->dio_new.din_fname;
+ char *tmp_diff = (char *)dio->dio_diff.dout_fname;
if (*p_dex != NUL) {
// Use 'diffexpr' to generate the diff file.
eval_diff(tmp_orig, tmp_new, tmp_diff);
+ return OK;
+ }
+ // Use xdiff for generating the diff.
+ if (dio->dio_internal) {
+ return diff_file_internal(dio);
} else {
const size_t len = (strlen(tmp_orig) + strlen(tmp_new) + strlen(tmp_diff)
+ STRLEN(p_srr) + 27);
char *const cmd = xmalloc(len);
- /* We don't want $DIFF_OPTIONS to get in the way. */
+ // We don't want $DIFF_OPTIONS to get in the way.
if (os_getenv("DIFF_OPTIONS")) {
os_unsetenv("DIFF_OPTIONS");
}
- /* Build the diff command and execute it. Always use -a, binary
- * differences are of no use. Ignore errors, diff returns
- * non-zero when differences have been found. */
- vim_snprintf(cmd, len, "diff %s%s%s%s%s %s",
- diff_a_works ? "-a " : "",
+ // Build the diff command and execute it. Always use -a, binary
+ // differences are of no use. Ignore errors, diff returns
+ // non-zero when differences have been found.
+ vim_snprintf((char *)cmd, len, "diff %s%s%s%s%s%s%s%s %s",
+ diff_a_works == kFalse ? "" : "-a ",
"",
(diff_flags & DIFF_IWHITE) ? "-b " : "",
+ (diff_flags & DIFF_IWHITEALL) ? "-w " : "",
+ (diff_flags & DIFF_IWHITEEOL) ? "-Z " : "",
+ (diff_flags & DIFF_IBLANK) ? "-B " : "",
(diff_flags & DIFF_ICASE) ? "-i " : "",
tmp_orig, tmp_new);
append_redir(cmd, len, (char *) p_srr, tmp_diff);
@@ -826,6 +1113,7 @@ static void diff_file(const char *const tmp_orig, const char *const tmp_new,
NULL);
unblock_autocmds();
xfree(cmd);
+ return OK;
}
}
@@ -839,12 +1127,13 @@ void ex_diffpatch(exarg_T *eap)
{
char_u *buf = NULL;
win_T *old_curwin = curwin;
- char_u *newname = NULL; // name of patched file buffer
+ char_u *newname = NULL; // name of patched file buffer
+ char_u *esc_name = NULL;
#ifdef UNIX
- char_u dirbuf[MAXPATHL];
- char_u *fullname = NULL;
-#endif // ifdef UNIX
+ char *fullname = NULL;
+#endif
+
// We need two temp file names.
// Name of original temp file.
char_u *tmp_orig = vim_tempname();
@@ -858,27 +1147,23 @@ void ex_diffpatch(exarg_T *eap)
// Write the current buffer to "tmp_orig".
if (buf_write(curbuf, tmp_orig, NULL,
(linenr_T)1, curbuf->b_ml.ml_line_count,
- NULL, FALSE, FALSE, FALSE, TRUE) == FAIL) {
+ NULL, false, false, false, true) == FAIL) {
goto theend;
}
#ifdef UNIX
// Get the absolute path of the patchfile, changing directory below.
- fullname = (char_u *)FullName_save((char *)eap->arg, FALSE);
-#endif // ifdef UNIX
-
-#ifdef UNIX
- size_t buflen = STRLEN(tmp_orig)
- + (fullname != NULL ? STRLEN(fullname) : STRLEN(eap->arg))
- + STRLEN(tmp_new) + 16;
+ fullname = FullName_save((char *)eap->arg, false);
+ esc_name = vim_strsave_shellescape(
+ (fullname != NULL ? (char_u *)fullname : eap->arg), true, true);
#else
- size_t buflen = STRLEN(tmp_orig) + (STRLEN(eap->arg)) + STRLEN(tmp_new) + 16;
-#endif // ifdef UNIX
-
+ esc_name = vim_strsave_shellescape(eap->arg, true, true);
+#endif
+ size_t buflen = STRLEN(tmp_orig) + STRLEN(esc_name) + STRLEN(tmp_new) + 16;
buf = xmalloc(buflen);
#ifdef UNIX
-
+ char_u dirbuf[MAXPATHL];
// Temporarily chdir to /tmp, to avoid patching files in the current
// directory when the patch file contains more than one patch. When we
// have our own temp dir use that instead, it will be cleaned up when we
@@ -893,31 +1178,24 @@ void ex_diffpatch(exarg_T *eap)
tempdir = "/tmp";
}
os_chdir(tempdir);
- shorten_fnames(TRUE);
+ shorten_fnames(true);
}
-#endif // ifdef UNIX
+#endif
if (*p_pex != NUL) {
// Use 'patchexpr' to generate the new file.
#ifdef UNIX
- eval_patch((char *) tmp_orig,
- (char *) (fullname != NULL ? fullname : eap->arg),
- (char *) tmp_new);
+ eval_patch((char *)tmp_orig,
+ (fullname != NULL ? fullname : (char *)eap->arg),
+ (char *)tmp_new);
#else
- eval_patch((char *) tmp_orig, (char *) eap->arg, (char *) tmp_new);
-#endif // ifdef UNIX
+ eval_patch((char *)tmp_orig, (char *)eap->arg, (char *)tmp_new);
+#endif
} else {
- // Build the patch command and execute it. Ignore errors. Switch to
- // cooked mode to allow the user to respond to prompts.
-#ifdef UNIX
- vim_snprintf((char *)buf, buflen, "patch -o %s %s < \"%s\"",
- tmp_new, tmp_orig, fullname != NULL ? fullname : eap->arg);
-#else
- vim_snprintf((char *)buf, buflen, "patch -o %s %s < \"%s\"",
- tmp_new, tmp_orig, eap->arg);
-#endif // ifdef UNIX
- // Avoid ShellCmdPost stuff
- block_autocmds();
+ // Build the patch command and execute it. Ignore errors.
+ vim_snprintf((char *)buf, buflen, "patch -o %s %s < %s",
+ tmp_new, tmp_orig, esc_name);
+ block_autocmds(); // Avoid ShellCmdPost stuff
(void)call_shell(buf, kShellOptFilter, NULL);
unblock_autocmds();
}
@@ -927,12 +1205,9 @@ void ex_diffpatch(exarg_T *eap)
if (os_chdir((char *)dirbuf) != 0) {
EMSG(_(e_prev_dir));
}
- shorten_fnames(TRUE);
+ shorten_fnames(true);
}
-#endif // ifdef UNIX
-
- // patch probably has written over the screen
- redraw_later(CLEAR);
+#endif
// Delete any .orig or .rej file created.
STRCPY(buf, tmp_new);
@@ -967,8 +1242,8 @@ void ex_diffpatch(exarg_T *eap)
// check that split worked and editing tmp_new
if ((curwin != old_curwin) && win_valid(old_curwin)) {
// Set 'diff', 'scrollbind' on and 'wrap' off.
- diff_win_options(curwin, TRUE);
- diff_win_options(old_curwin, TRUE);
+ diff_win_options(curwin, true);
+ diff_win_options(old_curwin, true);
if (newname != NULL) {
// do a ":file filename.new" on the patched buffer
@@ -998,7 +1273,8 @@ theend:
xfree(buf);
#ifdef UNIX
xfree(fullname);
-#endif // ifdef UNIX
+#endif
+ xfree(esc_name);
}
/// Split the window and edit another file, setting options to show the diffs.
@@ -1007,7 +1283,12 @@ theend:
void ex_diffsplit(exarg_T *eap)
{
win_T *old_curwin = curwin;
- buf_T *old_curbuf = curbuf;
+ bufref_T old_curbuf;
+ set_bufref(&old_curbuf, curbuf);
+
+ // Need to compute w_fraction when no redraw happened yet.
+ validate_cursor();
+ set_fraction(curwin);
// don't use a new tab page, each tab page has its own diffs
cmdmod.tab = 0;
@@ -1015,7 +1296,7 @@ void ex_diffsplit(exarg_T *eap)
if (win_split(0, (diff_flags & DIFF_VERTICAL) ? WSP_VERT : 0) != FAIL) {
// Pretend it was a ":split fname" command
eap->cmdidx = CMD_split;
- curwin->w_p_diff = TRUE;
+ curwin->w_p_diff = true;
do_exedit(eap, old_curwin);
// split must have worked
@@ -1025,15 +1306,15 @@ void ex_diffsplit(exarg_T *eap)
if (win_valid(old_curwin)) {
diff_win_options(old_curwin, true);
- if (buf_valid(old_curbuf)) {
+ if (bufref_valid(&old_curbuf)) {
// Move the cursor position to that of the old window.
curwin->w_cursor.lnum = diff_get_corresponding_line(
- old_curbuf,
- old_curwin->w_cursor.lnum,
- curbuf,
- curwin->w_cursor.lnum);
+ old_curbuf.br_buf, old_curwin->w_cursor.lnum);
}
}
+ // Now that lines are folded scroll to show the cursor at the same
+ // relative position.
+ scroll_to_fraction(curwin, curwin->w_height);
}
}
}
@@ -1042,9 +1323,23 @@ void ex_diffsplit(exarg_T *eap)
void ex_diffthis(exarg_T *eap)
{
// Set 'diff', 'scrollbind' on and 'wrap' off.
- diff_win_options(curwin, TRUE);
+ diff_win_options(curwin, true);
}
+static void set_diff_option(win_T *wp, int value)
+{
+ win_T *old_curwin = curwin;
+
+ curwin = wp;
+ curbuf = curwin->w_buffer;
+ curbuf_lock++;
+ set_option_value("diff", (long)value, NULL, OPT_LOCAL);
+ curbuf_lock--;
+ curwin = old_curwin;
+ curbuf = curwin->w_buffer;
+}
+
+
/// Set options in window "wp" for diff mode.
///
/// @param addbuf Add buffer to diff.
@@ -1061,18 +1356,18 @@ void diff_win_options(win_T *wp, int addbuf)
if (!wp->w_p_diff) {
wp->w_p_scb_save = wp->w_p_scb;
}
- wp->w_p_scb = TRUE;
+ wp->w_p_scb = true;
if (!wp->w_p_diff) {
wp->w_p_crb_save = wp->w_p_crb;
}
- wp->w_p_crb = TRUE;
+ wp->w_p_crb = true;
if (!wp->w_p_diff) {
wp->w_p_wrap_save = wp->w_p_wrap;
}
- wp->w_p_wrap = FALSE;
- curwin = wp;
+ wp->w_p_wrap = false;
+ curwin = wp; // -V519
curbuf = curwin->w_buffer;
if (!wp->w_p_diff) {
@@ -1092,7 +1387,7 @@ void diff_win_options(win_T *wp, int addbuf)
wp->w_p_fdl_save = wp->w_p_fdl;
}
wp->w_p_fdc = diff_foldcolumn;
- wp->w_p_fen = TRUE;
+ wp->w_p_fen = true;
wp->w_p_fdl = 0;
foldUpdateAll(wp);
@@ -1102,10 +1397,10 @@ void diff_win_options(win_T *wp, int addbuf)
do_cmdline_cmd("set sbo+=hor");
}
- // Saved the current values, to be restored in ex_diffoff().
- wp->w_p_diff_saved = TRUE;
+ // Save the current values, to be restored in ex_diffoff().
+ wp->w_p_diff_saved = true;
- wp->w_p_diff = true;
+ set_diff_option(wp, true);
if (addbuf) {
diff_buf_add(wp->w_buffer);
@@ -1126,7 +1421,7 @@ void ex_diffoff(exarg_T *eap)
// Set 'diff' off. If option values were saved in
// diff_win_options(), restore the ones whose settings seem to have
// been left over from diff mode.
- wp->w_p_diff = false;
+ set_diff_option(wp, false);
if (wp->w_p_diff_saved) {
if (wp->w_p_scb) {
@@ -1142,7 +1437,9 @@ void ex_diffoff(exarg_T *eap)
}
free_string_option(wp->w_p_fdm);
- wp->w_p_fdm = vim_strsave(wp->w_p_fdm_save);
+ wp->w_p_fdm = vim_strsave(*wp->w_p_fdm_save
+ ? wp->w_p_fdm_save
+ : (char_u *)"manual");
if (wp->w_p_fdc == diff_foldcolumn) {
wp->w_p_fdc = wp->w_p_fdc_save;
}
@@ -1156,10 +1453,13 @@ void ex_diffoff(exarg_T *eap)
}
foldUpdateAll(wp);
-
- // make sure topline is not halfway through a fold
- changed_window_setting_win(wp);
}
+ // remove filler lines
+ wp->w_topfill = 0;
+
+ // make sure topline is not halfway a fold and cursor is
+ // invalidated
+ changed_window_setting_win(wp);
// Note: 'sbo' is not restored, it's a global option.
diff_buf_adjust(wp);
@@ -1167,6 +1467,11 @@ void ex_diffoff(exarg_T *eap)
diffwin |= wp->w_p_diff;
}
+ // Also remove hidden buffers from the list.
+ if (eap->forceit) {
+ diff_buf_clear();
+ }
+
// Remove "hor" from from 'scrollopt' if there are no diff windows left.
if (!diffwin && (vim_strchr(p_sbo, 'h') != NULL)) {
do_cmdline_cmd("set sbo-=hor");
@@ -1177,88 +1482,95 @@ void ex_diffoff(exarg_T *eap)
///
/// @param idx_orig idx of original file
/// @param idx_new idx of new file
-/// @param fname name of diff output file
-static void diff_read(int idx_orig, int idx_new, char_u *fname)
+/// @dout diff output
+static void diff_read(int idx_orig, int idx_new, diffout_T *dout)
{
- FILE *fd;
+ FILE *fd = NULL;
+ int line_idx = 0;
diff_T *dprev = NULL;
diff_T *dp = curtab->tp_first_diff;
diff_T *dn, *dpl;
- long f1, l1, f2, l2;
- char_u linebuf[LBUFLEN]; // only need to hold the diff line
- int difftype;
- char_u *p;
+ char_u linebuf[LBUFLEN]; // only need to hold the diff line
+ char_u *line;
long off;
int i;
linenr_T lnum_orig, lnum_new;
long count_orig, count_new;
- int notset = TRUE; // block "*dp" not set yet
-
- fd = mch_fopen((char *)fname, "r");
-
- if (fd == NULL) {
- EMSG(_("E98: Cannot read diff output"));
- return;
+ int notset = true; // block "*dp" not set yet
+ enum {
+ DIFF_ED,
+ DIFF_UNIFIED,
+ DIFF_NONE
+ } diffstyle = DIFF_NONE;
+
+ if (dout->dout_fname == NULL) {
+ diffstyle = DIFF_UNIFIED;
+ } else {
+ fd = mch_fopen((char *)dout->dout_fname, "r");
+ if (fd == NULL) {
+ EMSG(_("E98: Cannot read diff output"));
+ return;
+ }
}
for (;;) {
- if (vim_fgets(linebuf, LBUFLEN, fd)) {
- // end of file
- break;
- }
-
- if (!isdigit(*linebuf)) {
- // not the start of a diff block
- continue;
- }
-
- // This line must be one of three formats:
- // {first}[,{last}]c{first}[,{last}]
- // {first}a{first}[,{last}]
- // {first}[,{last}]d{first}
- p = linebuf;
- f1 = getdigits_long(&p);
-
- if (*p == ',') {
- ++p;
- l1 = getdigits_long(&p);
- } else {
- l1 = f1;
- }
-
- if ((*p != 'a') && (*p != 'c') && (*p != 'd')) {
- // invalid diff format
- continue;
- }
- difftype = *p++;
- f2 = getdigits_long(&p);
-
- if (*p == ',') {
- ++p;
- l2 = getdigits_long(&p);
- } else {
- l2 = f2;
- }
-
- if ((l1 < f1) || (l2 < f2)) {
- // invalid line range
- continue;
- }
-
- if (difftype == 'a') {
- lnum_orig = f1 + 1;
- count_orig = 0;
+ if (fd == NULL) {
+ if (line_idx >= dout->dout_ga.ga_len) {
+ break; // did last line
+ }
+ line = ((char_u **)dout->dout_ga.ga_data)[line_idx++];
} else {
- lnum_orig = f1;
- count_orig = l1 - f1 + 1;
+ if (vim_fgets(linebuf, LBUFLEN, fd)) {
+ break; // end of file
+ }
+ line = linebuf;
+ }
+
+ if (diffstyle == DIFF_NONE) {
+ // Determine diff style.
+ // ed like diff looks like this:
+ // {first}[,{last}]c{first}[,{last}]
+ // {first}a{first}[,{last}]
+ // {first}[,{last}]d{first}
+ //
+ // unified diff looks like this:
+ // --- file1 2018-03-20 13:23:35.783153140 +0100
+ // +++ file2 2018-03-20 13:23:41.183156066 +0100
+ // @@ -1,3 +1,5 @@
+ if (isdigit(*line)) {
+ diffstyle = DIFF_ED;
+ } else if ((STRNCMP(line, "@@ ", 3) == 0)) {
+ diffstyle = DIFF_UNIFIED;
+ } else if ((STRNCMP(line, "--- ", 4) == 0)
+ && (vim_fgets(linebuf, LBUFLEN, fd) == 0) // -V501
+ && (STRNCMP(line, "+++ ", 4) == 0)
+ && (vim_fgets(linebuf, LBUFLEN, fd) == 0) // -V501
+ && (STRNCMP(line, "@@ ", 3) == 0)) {
+ diffstyle = DIFF_UNIFIED;
+ } else {
+ // Format not recognized yet, skip over this line. Cygwin diff
+ // may put a warning at the start of the file.
+ continue;
+ }
}
- if (difftype == 'd') {
- lnum_new = f2 + 1;
- count_new = 0;
+ if (diffstyle == DIFF_ED) {
+ if (!isdigit(*line)) {
+ continue; // not the start of a diff block
+ }
+ if (parse_diff_ed(line, &lnum_orig, &count_orig,
+ &lnum_new, &count_new) == FAIL) {
+ continue;
+ }
} else {
- lnum_new = f2;
- count_new = l2 - f2 + 1;
+ assert(diffstyle == DIFF_UNIFIED);
+ if (STRNCMP(line, "@@ ", 3) != 0) {
+ continue; // not the start of a diff block
+ }
+ if (parse_diff_unified(line, &lnum_orig, &count_orig,
+ &lnum_new, &count_new) == FAIL) {
+ continue;
+ }
}
// Go over blocks before the change, for which orig and new are equal.
@@ -1270,7 +1582,7 @@ static void diff_read(int idx_orig, int idx_new, char_u *fname)
}
dprev = dp;
dp = dp->df_next;
- notset = TRUE;
+ notset = true;
}
if ((dp != NULL)
@@ -1357,7 +1669,7 @@ static void diff_read(int idx_orig, int idx_new, char_u *fname)
}
}
}
- notset = FALSE; // "*dp" has been set
+ notset = false; // "*dp" has been set
}
// for remaining diff blocks orig and new are equal
@@ -1367,10 +1679,12 @@ static void diff_read(int idx_orig, int idx_new, char_u *fname)
}
dprev = dp;
dp = dp->df_next;
- notset = TRUE;
+ notset = true;
}
- fclose(fd);
+ if (fd != NULL) {
+ fclose(fd);
+ }
}
/// Copy an entry at "dp" from "idx_orig" to "idx_new".
@@ -1453,7 +1767,7 @@ int diff_check(win_T *wp, linenr_T lnum)
}
// A closed fold never has filler lines.
- if (hasFoldingWin(wp, lnum, NULL, NULL, TRUE, NULL)) {
+ if (hasFoldingWin(wp, lnum, NULL, NULL, true, NULL)) {
return 0;
}
@@ -1469,23 +1783,23 @@ int diff_check(win_T *wp, linenr_T lnum)
}
if (lnum < dp->df_lnum[idx] + dp->df_count[idx]) {
- int zero = FALSE;
+ int zero = false;
// Changed or inserted line. If the other buffers have a count of
// zero, the lines were inserted. If the other buffers have the same
// count, check if the lines are identical.
- cmp = FALSE;
+ cmp = false;
for (i = 0; i < DB_COUNT; ++i) {
if ((i != idx) && (curtab->tp_diffbuf[i] != NULL)) {
if (dp->df_count[i] == 0) {
- zero = TRUE;
+ zero = true;
} else {
if (dp->df_count[i] != dp->df_count[idx]) {
// nr of lines changed.
return -1;
}
- cmp = TRUE;
+ cmp = true;
}
}
}
@@ -1509,7 +1823,7 @@ int diff_check(win_T *wp, linenr_T lnum)
// the difference. Can't remove the entry here, we might be halfway
// through updating the window. Just report the text as unchanged.
// Other windows might still show the change though.
- if (zero == FALSE) {
+ if (zero == false) {
return 0;
}
return -2;
@@ -1564,6 +1878,34 @@ static bool diff_equal_entry(diff_T *dp, int idx1, int idx2)
return true;
}
+// Compare the characters at "p1" and "p2". If they are equal (possibly
+// ignoring case) return true and set "len" to the number of bytes.
+static bool diff_equal_char(const char_u *const p1, const char_u *const p2,
+ int *const len)
+{
+ const int l = utfc_ptr2len(p1);
+
+ if (l != utfc_ptr2len(p2)) {
+ return false;
+ }
+ if (l > 1) {
+ if (STRNCMP(p1, p2, l) != 0
+ && (!(diff_flags & DIFF_ICASE)
+ || utf_fold(utf_ptr2char(p1)) != utf_fold(utf_ptr2char(p2)))) {
+ return false;
+ }
+ *len = l;
+ } else {
+ if ((*p1 != *p2)
+ && (!(diff_flags & DIFF_ICASE)
+ || TOLOWER_LOC(*p1) != TOLOWER_LOC(*p2))) {
+ return false;
+ }
+ *len = 1;
+ }
+ return true;
+}
+
/// Compare strings "s1" and "s2" according to 'diffopt'.
/// Return non-zero when they are different.
///
@@ -1573,47 +1915,37 @@ static bool diff_equal_entry(diff_T *dp, int idx1, int idx2)
/// @return on-zero if the two strings are different.
static int diff_cmp(char_u *s1, char_u *s2)
{
- if ((diff_flags & (DIFF_ICASE | DIFF_IWHITE)) == 0) {
+ if ((diff_flags & DIFF_IBLANK)
+ && (*skipwhite(s1) == NUL || *skipwhite(s2) == NUL)) {
+ return 0;
+ }
+
+ if ((diff_flags & (DIFF_ICASE | ALL_WHITE_DIFF)) == 0) {
return STRCMP(s1, s2);
}
- if ((diff_flags & DIFF_ICASE) && !(diff_flags & DIFF_IWHITE)) {
- return mb_stricmp(s1, s2);
+ if ((diff_flags & DIFF_ICASE) && !(diff_flags & ALL_WHITE_DIFF)) {
+ return mb_stricmp((const char *)s1, (const char *)s2);
}
- // Ignore white space changes and possibly ignore case.
char_u *p1 = s1;
char_u *p2 = s2;
+ // Ignore white space changes and possibly ignore case.
while (*p1 != NUL && *p2 != NUL) {
- if (ascii_iswhite(*p1) && ascii_iswhite(*p2)) {
+ if (((diff_flags & DIFF_IWHITE)
+ && ascii_iswhite(*p1) && ascii_iswhite(*p2))
+ || ((diff_flags & DIFF_IWHITEALL)
+ && (ascii_iswhite(*p1) || ascii_iswhite(*p2)))) {
p1 = skipwhite(p1);
p2 = skipwhite(p2);
} else {
- int l = (*mb_ptr2len)(p1);
- if (l != (*mb_ptr2len)(p2)) {
+ int l;
+ if (!diff_equal_char(p1, p2, &l)) {
break;
}
-
- if (l > 1) {
- if ((STRNCMP(p1, p2, l) != 0)
- && (!enc_utf8
- || !(diff_flags & DIFF_ICASE)
- || (utf_fold(utf_ptr2char(p1))
- != utf_fold(utf_ptr2char(p2))))) {
- break;
- }
- p1 += l;
- p2 += l;
- } else {
- if ((*p1 != *p2)
- && (!(diff_flags & DIFF_ICASE)
- || (TOLOWER_LOC(*p1) != TOLOWER_LOC(*p2)))) {
- break;
- }
- ++p1;
- ++p2;
- }
+ p1 += l;
+ p2 += l;
}
}
@@ -1760,7 +2092,7 @@ void diff_set_topline(win_T *fromwin, win_T *towin)
check_topfill(towin, false);
(void)hasFoldingWin(towin, towin->w_topline, &towin->w_topline,
- NULL, TRUE, NULL);
+ NULL, true, NULL);
}
/// This is called when 'diffopt' is changed.
@@ -1771,6 +2103,8 @@ int diffopt_changed(void)
int diff_context_new = 6;
int diff_flags_new = 0;
int diff_foldcolumn_new = 2;
+ long diff_algorithm_new = 0;
+ long diff_indent_heuristic = 0;
char_u *p = p_dip;
while (*p != NUL) {
@@ -1780,9 +2114,18 @@ int diffopt_changed(void)
} else if ((STRNCMP(p, "context:", 8) == 0) && ascii_isdigit(p[8])) {
p += 8;
diff_context_new = getdigits_int(&p);
+ } else if (STRNCMP(p, "iblank", 6) == 0) {
+ p += 6;
+ diff_flags_new |= DIFF_IBLANK;
} else if (STRNCMP(p, "icase", 5) == 0) {
p += 5;
diff_flags_new |= DIFF_ICASE;
+ } else if (STRNCMP(p, "iwhiteall", 9) == 0) {
+ p += 9;
+ diff_flags_new |= DIFF_IWHITEALL;
+ } else if (STRNCMP(p, "iwhiteeol", 9) == 0) {
+ p += 9;
+ diff_flags_new |= DIFF_IWHITEEOL;
} else if (STRNCMP(p, "iwhite", 6) == 0) {
p += 6;
diff_flags_new |= DIFF_IWHITE;
@@ -1795,6 +2138,32 @@ int diffopt_changed(void)
} else if ((STRNCMP(p, "foldcolumn:", 11) == 0) && ascii_isdigit(p[11])) {
p += 11;
diff_foldcolumn_new = getdigits_int(&p);
+ } else if (STRNCMP(p, "hiddenoff", 9) == 0) {
+ p += 9;
+ diff_flags_new |= DIFF_HIDDEN_OFF;
+ } else if (STRNCMP(p, "indent-heuristic", 16) == 0) {
+ p += 16;
+ diff_indent_heuristic = XDF_INDENT_HEURISTIC;
+ } else if (STRNCMP(p, "internal", 8) == 0) {
+ p += 8;
+ diff_flags_new |= DIFF_INTERNAL;
+ } else if (STRNCMP(p, "algorithm:", 10) == 0) {
+ p += 10;
+ if (STRNCMP(p, "myers", 5) == 0) {
+ p += 5;
+ diff_algorithm_new = 0;
+ } else if (STRNCMP(p, "minimal", 7) == 0) {
+ p += 7;
+ diff_algorithm_new = XDF_NEED_MINIMAL;
+ } else if (STRNCMP(p, "patience", 8) == 0) {
+ p += 8;
+ diff_algorithm_new = XDF_PATIENCE_DIFF;
+ } else if (STRNCMP(p, "histogram", 9) == 0) {
+ p += 9;
+ diff_algorithm_new = XDF_HISTOGRAM_DIFF;
+ } else {
+ return FAIL;
+ }
}
if ((*p != ',') && (*p != NUL)) {
@@ -1806,23 +2175,27 @@ int diffopt_changed(void)
}
}
+ diff_algorithm_new |= diff_indent_heuristic;
+
// Can't have both "horizontal" and "vertical".
if ((diff_flags_new & DIFF_HORIZONTAL) && (diff_flags_new & DIFF_VERTICAL)) {
return FAIL;
}
- // If "icase" or "iwhite" was added or removed, need to update the diff.
- if (diff_flags != diff_flags_new) {
+ // If flags were added or removed, or the algorithm was changed, need to
+ // update the diff.
+ if (diff_flags != diff_flags_new || diff_algorithm != diff_algorithm_new) {
FOR_ALL_TABS(tp) {
- tp->tp_diff_invalid = TRUE;
+ tp->tp_diff_invalid = true;
}
}
diff_flags = diff_flags_new;
diff_context = diff_context_new;
diff_foldcolumn = diff_foldcolumn_new;
+ diff_algorithm = diff_algorithm_new;
- diff_redraw(TRUE);
+ diff_redraw(true);
// recompute the scroll binding with the new option value, may
// remove or add filler lines
@@ -1837,6 +2210,12 @@ bool diffopt_horizontal(void)
return (diff_flags & DIFF_HORIZONTAL) != 0;
}
+// Return true if 'diffopt' contains "hiddenoff".
+bool diffopt_hiddenoff(void)
+{
+ return (diff_flags & DIFF_HIDDEN_OFF) != 0;
+}
+
/// Find the difference within a changed line.
///
/// @param wp window whose current buffer to check
@@ -1854,9 +2233,10 @@ bool diff_find_change(win_T *wp, linenr_T lnum, int *startp, int *endp)
int ei_org;
int ei_new;
bool added = true;
+ int l;
// Make a copy of the line, the next ml_get() will invalidate it.
- char_u *line_org = vim_strsave(ml_get_buf(wp->w_buffer, lnum, FALSE));
+ char_u *line_org = vim_strsave(ml_get_buf(wp->w_buffer, lnum, false));
int idx = diff_buf_idx(wp->w_buffer);
if (idx == DB_COUNT) {
@@ -1888,32 +2268,33 @@ bool diff_find_change(win_T *wp, linenr_T lnum, int *startp, int *endp)
}
added = false;
line_new = ml_get_buf(curtab->tp_diffbuf[i],
- dp->df_lnum[i] + off, FALSE);
+ dp->df_lnum[i] + off, false);
// Search for start of difference
si_org = si_new = 0;
while (line_org[si_org] != NUL) {
- if ((diff_flags & DIFF_IWHITE)
- && ascii_iswhite(line_org[si_org])
- && ascii_iswhite(line_new[si_new])) {
+ if (((diff_flags & DIFF_IWHITE)
+ && ascii_iswhite(line_org[si_org])
+ && ascii_iswhite(line_new[si_new]))
+ || ((diff_flags & DIFF_IWHITEALL)
+ && (ascii_iswhite(line_org[si_org])
+ || ascii_iswhite(line_new[si_new])))) {
si_org = (int)(skipwhite(line_org + si_org) - line_org);
si_new = (int)(skipwhite(line_new + si_new) - line_new);
} else {
- if (line_org[si_org] != line_new[si_new]) {
+ if (!diff_equal_char(line_org + si_org, line_new + si_new, &l)) {
break;
}
- ++si_org;
- ++si_new;
+ si_org += l;
+ si_new += l;
}
}
- if (has_mbyte) {
- // Move back to first byte of character in both lines (may
- // have "nn^" in line_org and "n^ in line_new).
- si_org -= (*mb_head_off)(line_org, line_org + si_org);
- si_new -= (*mb_head_off)(line_new, line_new + si_new);
- }
+ // Move back to first byte of character in both lines (may
+ // have "nn^" in line_org and "n^ in line_new).
+ si_org -= utf_head_off(line_org, line_org + si_org);
+ si_new -= utf_head_off(line_new, line_new + si_new);
if (*startp > si_org) {
*startp = si_org;
@@ -1928,9 +2309,12 @@ bool diff_find_change(win_T *wp, linenr_T lnum, int *startp, int *endp)
&& ei_new >= si_new
&& ei_org >= 0
&& ei_new >= 0) {
- if ((diff_flags & DIFF_IWHITE)
- && ascii_iswhite(line_org[ei_org])
- && ascii_iswhite(line_new[ei_new])) {
+ if (((diff_flags & DIFF_IWHITE)
+ && ascii_iswhite(line_org[ei_org])
+ && ascii_iswhite(line_new[ei_new]))
+ || ((diff_flags & DIFF_IWHITEALL)
+ && (ascii_iswhite(line_org[ei_org])
+ || ascii_iswhite(line_new[ei_new])))) {
while (ei_org >= *startp && ascii_iswhite(line_org[ei_org])) {
ei_org--;
}
@@ -1939,11 +2323,17 @@ bool diff_find_change(win_T *wp, linenr_T lnum, int *startp, int *endp)
ei_new--;
}
} else {
- if (line_org[ei_org] != line_new[ei_new]) {
+ const char_u *p1 = line_org + ei_org;
+ const char_u *p2 = line_new + ei_new;
+
+ p1 -= utf_head_off(line_org, p1);
+ p2 -= utf_head_off(line_new, p2);
+
+ if (!diff_equal_char(p1, p2, &l)) {
break;
}
- ei_org--;
- ei_new--;
+ ei_org -= l;
+ ei_new -= l;
}
}
@@ -2059,7 +2449,7 @@ void ex_diffgetput(exarg_T *eap)
int start_skip, end_skip;
int new_count;
int buf_empty;
- int found_not_ma = FALSE;
+ int found_not_ma = false;
int idx_other;
int idx_from;
int idx_to;
@@ -2080,7 +2470,7 @@ void ex_diffgetput(exarg_T *eap)
|| MODIFIABLE(curtab->tp_diffbuf[idx_other])) {
break;
}
- found_not_ma = TRUE;
+ found_not_ma = true;
}
}
@@ -2118,7 +2508,7 @@ void ex_diffgetput(exarg_T *eap)
// digits only
i = atol((char *)eap->arg);
} else {
- i = buflist_findpat(eap->arg, p, FALSE, TRUE, FALSE);
+ i = buflist_findpat(eap->arg, p, false, true, false);
if (i < 0) {
// error message already given
@@ -2144,7 +2534,7 @@ void ex_diffgetput(exarg_T *eap)
}
}
- diff_busy = TRUE;
+ diff_busy = true;
// When no range given include the line above or below the cursor.
if (eap->addr_count == 0) {
@@ -2181,7 +2571,7 @@ void ex_diffgetput(exarg_T *eap)
change_warning(0);
if (diff_buf_idx(curbuf) != idx_to) {
EMSG(_("E787: Buffer changed unexpectedly"));
- return;
+ goto theend;
}
}
@@ -2244,13 +2634,13 @@ void ex_diffgetput(exarg_T *eap)
}
}
- buf_empty = bufempty();
+ buf_empty = BUFEMPTY();
added = 0;
for (i = 0; i < count; ++i) {
// remember deleting the last line of the buffer
buf_empty = curbuf->b_ml.ml_line_count == 1;
- ml_delete(lnum, FALSE);
+ ml_delete(lnum, false);
added--;
}
@@ -2259,15 +2649,15 @@ void ex_diffgetput(exarg_T *eap)
if (nr > curtab->tp_diffbuf[idx_from]->b_ml.ml_line_count) {
break;
}
- p = vim_strsave(ml_get_buf(curtab->tp_diffbuf[idx_from], nr, FALSE));
- ml_append(lnum + i - 1, p, 0, FALSE);
+ p = vim_strsave(ml_get_buf(curtab->tp_diffbuf[idx_from], nr, false));
+ ml_append(lnum + i - 1, p, 0, false);
xfree(p);
added++;
if (buf_empty && (curbuf->b_ml.ml_line_count == 2)) {
// Added the first line into an empty buffer, need to
// delete the dummy empty line.
- buf_empty = FALSE;
- ml_delete((linenr_T)2, FALSE);
+ buf_empty = false;
+ ml_delete((linenr_T)2, false);
}
}
new_count = dp->df_count[idx_to] + added;
@@ -2300,7 +2690,7 @@ void ex_diffgetput(exarg_T *eap)
// Adjust marks. This will change the following entries!
if (added != 0) {
- mark_adjust(lnum, lnum + count - 1, (long)MAXLNUM, (long)added);
+ mark_adjust(lnum, lnum + count - 1, (long)MAXLNUM, (long)added, false);
if (curwin->w_cursor.lnum >= lnum) {
// Adjust the cursor position if it's in/after the changed
// lines.
@@ -2311,7 +2701,7 @@ void ex_diffgetput(exarg_T *eap)
}
}
}
- changed_lines(lnum, 0, lnum + count, (long)added);
+ changed_lines(lnum, 0, lnum + count, (long)added, true);
if (dfree != NULL) {
// Diff is deleted, update folds in other windows.
@@ -2341,20 +2731,31 @@ void ex_diffgetput(exarg_T *eap)
// another buffer. Sync undo if the command was typed. This isn't
// 100% right when ":diffput" is used in a function or mapping.
if (KeyTyped) {
- u_sync(FALSE);
+ u_sync(false);
}
aucmd_restbuf(&aco);
}
- diff_busy = FALSE;
+theend:
+ diff_busy = false;
+ if (diff_need_update) {
+ ex_diffupdate(NULL);
+ }
- // Check that the cursor is on a valid character and update it's position.
- // When there were filler lines the topline has become invalid.
+ // Check that the cursor is on a valid character and update its
+ // position. When there were filler lines the topline has become
+ // invalid.
check_cursor();
changed_line_abv_curs();
- // Also need to redraw the other buffers.
- diff_redraw(FALSE);
+ if (diff_need_update) {
+ // redraw already done by ex_diffupdate()
+ diff_need_update = false;
+ } else {
+ // Also need to redraw the other buffers.
+ diff_redraw(false);
+ apply_autocmds(EVENT_DIFFUPDATED, NULL, NULL, false, curbuf);
+ }
}
/// Update folds for all diff buffers for entry "dp".
@@ -2452,25 +2853,17 @@ int diff_move_to(int dir, long count)
return OK;
}
-/// Finds the corresponding line in a diff.
-///
-/// @param buf1
-/// @param lnum1
-/// @param buf2
-/// @param lnum3
-///
-/// @return The corresponding line.
-linenr_T diff_get_corresponding_line(buf_T *buf1, linenr_T lnum1, buf_T *buf2,
- linenr_T lnum3)
+/// Return the line number in the current window that is closest to "lnum1" in
+/// "buf1" in diff mode.
+static linenr_T diff_get_corresponding_line_int(buf_T *buf1, linenr_T lnum1)
{
int idx1;
int idx2;
diff_T *dp;
int baseline = 0;
- linenr_T lnum2;
idx1 = diff_buf_idx(buf1);
- idx2 = diff_buf_idx(buf2);
+ idx2 = diff_buf_idx(curbuf);
if ((idx1 == DB_COUNT)
|| (idx2 == DB_COUNT)
@@ -2490,15 +2883,9 @@ linenr_T diff_get_corresponding_line(buf_T *buf1, linenr_T lnum1, buf_T *buf2,
for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next) {
if (dp->df_lnum[idx1] > lnum1) {
- lnum2 = lnum1 - baseline;
-
- // don't end up past the end of the file
- if (lnum2 > buf2->b_ml.ml_line_count) {
- lnum2 = buf2->b_ml.ml_line_count;
- }
-
- return lnum2;
- } else if ((dp->df_lnum[idx1] + dp->df_count[idx1]) > lnum1) {
+ return lnum1 - baseline;
+ }
+ if ((dp->df_lnum[idx1] + dp->df_count[idx1]) > lnum1) {
// Inside the diffblock
baseline = lnum1 - dp->df_lnum[idx1];
@@ -2507,30 +2894,42 @@ linenr_T diff_get_corresponding_line(buf_T *buf1, linenr_T lnum1, buf_T *buf2,
}
return dp->df_lnum[idx2] + baseline;
- } else if ((dp->df_lnum[idx1] == lnum1)
- && (dp->df_count[idx1] == 0)
- && (dp->df_lnum[idx2] <= lnum3)
- && ((dp->df_lnum[idx2] + dp->df_count[idx2]) > lnum3)) {
+ }
+ if ((dp->df_lnum[idx1] == lnum1)
+ && (dp->df_count[idx1] == 0)
+ && (dp->df_lnum[idx2] <= curwin->w_cursor.lnum)
+ && ((dp->df_lnum[idx2] + dp->df_count[idx2])
+ > curwin->w_cursor.lnum)) {
// Special case: if the cursor is just after a zero-count
// block (i.e. all filler) and the target cursor is already
// inside the corresponding block, leave the target cursor
// unmoved. This makes repeated CTRL-W W operations work
// as expected.
- return lnum3;
+ return curwin->w_cursor.lnum;
}
baseline = (dp->df_lnum[idx1] + dp->df_count[idx1])
- - (dp->df_lnum[idx2] + dp->df_count[idx2]);
+ - (dp->df_lnum[idx2] + dp->df_count[idx2]);
}
// If we get here then the cursor is after the last diff
- lnum2 = lnum1 - baseline;
+ return lnum1 - baseline;
+}
+
+/// Finds the corresponding line in a diff.
+///
+/// @param buf1
+/// @param lnum1
+///
+/// @return The corresponding line.
+linenr_T diff_get_corresponding_line(buf_T *buf1, linenr_T lnum1)
+{
+ linenr_T lnum = diff_get_corresponding_line_int(buf1, lnum1);
// don't end up past the end of the file
- if (lnum2 > buf2->b_ml.ml_line_count) {
- lnum2 = buf2->b_ml.ml_line_count;
+ if (lnum > curbuf->b_ml.ml_line_count) {
+ return curbuf->b_ml.ml_line_count;
}
-
- return lnum2;
+ return lnum;
}
/// For line "lnum" in the current window find the equivalent lnum in window
@@ -2581,3 +2980,145 @@ linenr_T diff_lnum_win(linenr_T lnum, win_T *wp)
}
return n;
}
+
+///
+/// Handle an ED style diff line.
+/// Return FAIL if the line does not contain diff info.
+///
+static int parse_diff_ed(char_u *line,
+ linenr_T *lnum_orig,
+ long *count_orig,
+ linenr_T *lnum_new,
+ long *count_new)
+{
+ char_u *p;
+ long f1, l1, f2, l2;
+ int difftype;
+
+ // The line must be one of three formats:
+ // change: {first}[,{last}]c{first}[,{last}]
+ // append: {first}a{first}[,{last}]
+ // delete: {first}[,{last}]d{first}
+ p = line;
+ f1 = getdigits(&p);
+ if (*p == ',') {
+ p++;
+ l1 = getdigits(&p);
+ } else {
+ l1 = f1;
+ }
+ if (*p != 'a' && *p != 'c' && *p != 'd') {
+ return FAIL; // invalid diff format
+ }
+ difftype = *p++;
+ f2 = getdigits(&p);
+ if (*p == ',') {
+ p++;
+ l2 = getdigits(&p);
+ } else {
+ l2 = f2;
+ }
+ if (l1 < f1 || l2 < f2) {
+ return FAIL;
+ }
+
+ if (difftype == 'a') {
+ *lnum_orig = f1 + 1;
+ *count_orig = 0;
+ } else {
+ *lnum_orig = f1;
+ *count_orig = l1 - f1 + 1;
+ }
+ if (difftype == 'd') {
+ *lnum_new = f2 + 1;
+ *count_new = 0;
+ } else {
+ *lnum_new = f2;
+ *count_new = l2 - f2 + 1;
+ }
+ return OK;
+}
+
+///
+/// Parses unified diff with zero(!) context lines.
+/// Return FAIL if there is no diff information in "line".
+///
+static int parse_diff_unified(char_u *line,
+ linenr_T *lnum_orig,
+ long *count_orig,
+ linenr_T *lnum_new,
+ long *count_new)
+{
+ char_u *p;
+ long oldline, oldcount, newline, newcount;
+
+ // Parse unified diff hunk header:
+ // @@ -oldline,oldcount +newline,newcount @@
+ p = line;
+ if (*p++ == '@' && *p++ == '@' && *p++ == ' ' && *p++ == '-') {
+ oldline = getdigits(&p);
+ if (*p == ',') {
+ p++;
+ oldcount = getdigits(&p);
+ } else {
+ oldcount = 1;
+ }
+ if (*p++ == ' ' && *p++ == '+') {
+ newline = getdigits(&p);
+ if (*p == ',') {
+ p++;
+ newcount = getdigits(&p);
+ } else {
+ newcount = 1;
+ }
+ } else {
+ return FAIL; // invalid diff format
+ }
+
+ if (oldcount == 0) {
+ oldline += 1;
+ }
+ if (newcount == 0) {
+ newline += 1;
+ }
+ if (newline == 0) {
+ newline = 1;
+ }
+
+ *lnum_orig = oldline;
+ *count_orig = oldcount;
+ *lnum_new = newline;
+ *count_new = newcount;
+
+ return OK;
+ }
+
+ return FAIL;
+}
+
+///
+/// Callback function for the xdl_diff() function.
+/// Stores the diff output in a grow array.
+///
+static int xdiff_out(void *priv, mmbuffer_t *mb, int nbuf)
+{
+ diffout_T *dout = (diffout_T *)priv;
+ char_u *p;
+
+ // The header line always comes by itself, text lines in at least two
+ // parts. We drop the text part.
+ if (nbuf > 1) {
+ return 0;
+ }
+
+ // sanity check
+ if (STRNCMP(mb[0].ptr, "@@ ", 3) != 0) {
+ return 0;
+ }
+
+ ga_grow(&dout->dout_ga, 1);
+
+ p = vim_strnsave((char_u *)mb[0].ptr, mb[0].size);
+ ((char_u **)dout->dout_ga.ga_data)[dout->dout_ga.ga_len++] = p;
+ return 0;
+}
diff --git a/src/nvim/diff.h b/src/nvim/diff.h
index f6cef1cafd..3624ce29bb 100644
--- a/src/nvim/diff.h
+++ b/src/nvim/diff.h
@@ -1,6 +1,9 @@
#ifndef NVIM_DIFF_H
#define NVIM_DIFF_H
+#include "nvim/pos.h"
+#include "nvim/ex_cmds_defs.h"
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "diff.h.generated.h"
#endif
diff --git a/src/nvim/digraph.c b/src/nvim/digraph.c
index aad145b3e5..3329290634 100644
--- a/src/nvim/digraph.c
+++ b/src/nvim/digraph.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/// @file digraph.c
///
/// code for digraphs
@@ -17,7 +20,6 @@
#include "nvim/getchar.h"
#include "nvim/mbyte.h"
#include "nvim/message.h"
-#include "nvim/misc2.h"
#include "nvim/memory.h"
#include "nvim/garray.h"
#include "nvim/normal.h"
@@ -791,6 +793,7 @@ static digr_T digraphdefault[] =
{ '/', '-', 0x2020 },
{ '/', '=', 0x2021 },
{ '.', '.', 0x2025 },
+ { ',', '.', 0x2026 },
{ '%', '0', 0x2030 },
{ '1', '\'', 0x2032 },
{ '2', '\'', 0x2033 },
@@ -1356,6 +1359,12 @@ static digr_T digraphdefault[] =
{ 'f', 't', 0xfb05 },
{ 's', 't', 0xfb06 },
+ // extra alternatives, easier to remember
+ { 'W', '`', 0x1e80 },
+ { 'w', '`', 0x1e81 },
+ { 'Y', '`', 0x1ef2 },
+ { 'y', '`', 0x1ef3 },
+
// Vim 5.x compatible digraphs that don't conflict with the above
{ '~', '!', 161 }, // ก
{ 'c', '|', 162 }, // ข
@@ -1388,7 +1397,7 @@ static digr_T digraphdefault[] =
{ 'O', '`', 210 }, // า
{ 'O', '^', 212 }, // ิ
{ 'O', '~', 213 }, // ี
- { '/', '\\', 215 }, // ื - multiplication symbol in ISO 8859-1
+ { '/', '\\', 215 }, // ื - multiplication symbol in ISO 8859-1
{ 'U', '`', 217 }, // ู
{ 'U', '^', 219 }, //
{ 'I', 'p', 222 }, //
@@ -1439,6 +1448,33 @@ int do_digraph(int c)
return c;
}
+/// Find a digraph for "val". If found return the string to display it.
+/// If not found return NULL.
+char_u *get_digraph_for_char(int val)
+{
+ digr_T *dp;
+ static char_u r[3];
+
+ for (int use_defaults = 0; use_defaults <= 1; use_defaults++) {
+ if (use_defaults == 0) {
+ dp = (digr_T *)user_digraphs.ga_data;
+ } else {
+ dp = digraphdefault;
+ }
+ for (int i = 0;
+ use_defaults ? dp->char1 != NUL : i < user_digraphs.ga_len; i++) {
+ if (dp->result == val) {
+ r[0] = dp->char1;
+ r[1] = dp->char2;
+ r[2] = NUL;
+ return r;
+ }
+ dp++;
+ }
+ }
+ return NULL;
+}
+
/// Get a digraph. Used after typing CTRL-K on the command line or in normal
/// mode.
///
@@ -1449,10 +1485,8 @@ int get_digraph(int cmdline)
{
int cc;
no_mapping++;
- allow_keys++;
int c = plain_vgetc();
no_mapping--;
- allow_keys--;
if (c != ESC) {
// ESC cancels CTRL-K
@@ -1469,10 +1503,8 @@ int get_digraph(int cmdline)
add_to_showcmd(c);
}
no_mapping++;
- allow_keys++;
cc = plain_vgetc();
no_mapping--;
- allow_keys--;
if (cc != ESC) {
// ESC cancels CTRL-K
@@ -1521,34 +1553,6 @@ static int getexactdigraph(int char1, int char2, int meta_char)
}
}
- if ((retval != 0) && !enc_utf8) {
- char_u buf[6], *to;
- vimconv_T vc;
-
- // Convert the Unicode digraph to 'encoding'.
- int i = utf_char2bytes(retval, buf);
- retval = 0;
- vc.vc_type = CONV_NONE;
-
- if (convert_setup(&vc, (char_u *)"utf-8", p_enc) == OK) {
- vc.vc_fail = true;
- assert(i >= 0);
- size_t len = (size_t)i;
- to = string_convert(&vc, buf, &len);
-
- if (to != NULL) {
- retval = (*mb_ptr2char)(to);
- xfree(to);
- }
- (void)convert_setup(&vc, NULL, NULL);
- }
- }
-
- // Ignore multi-byte characters when not in multi-byte mode.
- if (!has_mbyte && (retval > 0xff)) {
- retval = 0;
- }
-
if (retval == 0) {
// digraph deleted or not found
if ((char1 == ' ') && meta_char) {
@@ -1574,7 +1578,8 @@ int getdigraph(int char1, int char2, int meta_char)
if (((retval = getexactdigraph(char1, char2, meta_char)) == char2)
&& (char1 != char2)
- && ((retval = getexactdigraph(char2, char1, meta_char)) == char1)) {
+ && ((retval = getexactdigraph(char2, char1, meta_char)) // -V764
+ == char1)) {
return char2;
}
return retval;
@@ -1654,8 +1659,7 @@ void listdigraphs(void)
tmp.result = getexactdigraph(tmp.char1, tmp.char2, FALSE);
if ((tmp.result != 0)
- && (tmp.result != tmp.char2)
- && (has_mbyte || (tmp.result <= 255))) {
+ && (tmp.result != tmp.char2)) {
printdigraph(&tmp);
}
dp++;
@@ -1668,9 +1672,6 @@ void listdigraphs(void)
os_breakcheck();
dp++;
}
- // clear screen, because some digraphs may be wrong, in which case we messed
- // up ScreenLines
- must_redraw = CLEAR;
}
static void printdigraph(digr_T *dp)
@@ -1680,38 +1681,39 @@ static void printdigraph(digr_T *dp)
int list_width;
- if ((dy_flags & DY_UHEX) || has_mbyte) {
- list_width = 13;
- } else {
- list_width = 11;
- }
+ list_width = 13;
if (dp->result != 0) {
if (msg_col > Columns - list_width) {
msg_putchar('\n');
}
- if (msg_col) {
- while (msg_col % list_width != 0) {
+
+ // Make msg_col a multiple of list_width by using spaces.
+ if (msg_col % list_width != 0) {
+ int spaces = (msg_col / list_width + 1) * list_width - msg_col;
+ while (spaces--) {
msg_putchar(' ');
}
}
- p = buf;
+ p = &buf[0];
*p++ = dp->char1;
*p++ = dp->char2;
*p++ = ' ';
+ *p = NUL;
+ msg_outtrans(buf);
+ p = buf;
- if (has_mbyte) {
- // add a space to draw a composing char on
- if (enc_utf8 && utf_iscomposing(dp->result)) {
- *p++ = ' ';
- }
- p += (*mb_char2bytes)(dp->result, p);
- } else {
- *p++ = (char_u)dp->result;
+ // add a space to draw a composing char on
+ if (utf_iscomposing(dp->result)) {
+ *p++ = ' ';
}
+ p += utf_char2bytes(dp->result, p);
+ *p = NUL;
+ msg_outtrans_attr(buf, HL_ATTR(HLF_8));
+ p = buf;
if (char2cells(dp->result) == 1) {
*p++ = ' ';
}
@@ -1832,12 +1834,12 @@ void ex_loadkeymap(exarg_T *eap)
xfree(line);
}
- // setup ":lnoremap" to map the keys
- for (int i = 0; i < curbuf->b_kmap_ga.ga_len; ++i) {
+ // setup ":lmap" to map the keys
+ for (int i = 0; i < curbuf->b_kmap_ga.ga_len; i++) {
vim_snprintf((char *)buf, sizeof(buf), "<buffer> %s %s",
((kmap_T *)curbuf->b_kmap_ga.ga_data)[i].from,
((kmap_T *)curbuf->b_kmap_ga.ga_data)[i].to);
- (void)do_map(2, buf, LANGMAP, FALSE);
+ (void)do_map(0, buf, LANGMAP, false);
}
p_cpo = save_cpo;
@@ -1846,6 +1848,16 @@ void ex_loadkeymap(exarg_T *eap)
status_redraw_curbuf();
}
+/// Frees the buf_T.b_kmap_ga field of a buffer.
+void keymap_ga_clear(garray_T *kmap_ga)
+{
+ kmap_T *kp = (kmap_T *)kmap_ga->ga_data;
+ for (int i = 0; i < kmap_ga->ga_len; i++) {
+ xfree(kp[i].from);
+ xfree(kp[i].to);
+ }
+}
+
/// Stop using 'keymap'.
static void keymap_unload(void)
{
@@ -1863,12 +1875,11 @@ static void keymap_unload(void)
// clear the ":lmap"s
kp = (kmap_T *)curbuf->b_kmap_ga.ga_data;
- for (int i = 0; i < curbuf->b_kmap_ga.ga_len; ++i) {
+ for (int i = 0; i < curbuf->b_kmap_ga.ga_len; i++) {
vim_snprintf((char *)buf, sizeof(buf), "<buffer> %s", kp[i].from);
- (void)do_map(1, buf, LANGMAP, FALSE);
- xfree(kp[i].from);
- xfree(kp[i].to);
+ (void)do_map(1, buf, LANGMAP, false);
}
+ keymap_ga_clear(&curbuf->b_kmap_ga);
p_cpo = save_cpo;
diff --git a/src/nvim/digraph.h b/src/nvim/digraph.h
index b623969e08..1b73ccaf3f 100644
--- a/src/nvim/digraph.h
+++ b/src/nvim/digraph.h
@@ -1,6 +1,9 @@
#ifndef NVIM_DIGRAPH_H
#define NVIM_DIGRAPH_H
+#include "nvim/types.h"
+#include "nvim/ex_cmds_defs.h"
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "digraph.h.generated.h"
#endif
diff --git a/src/nvim/edit.c b/src/nvim/edit.c
index 03ef41f849..bb3c0ec196 100644
--- a/src/nvim/edit.c
+++ b/src/nvim/edit.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* edit.c: functions for Insert mode
*/
@@ -15,6 +18,7 @@
#include "nvim/cursor.h"
#include "nvim/digraph.h"
#include "nvim/eval.h"
+#include "nvim/eval/typval.h"
#include "nvim/ex_docmd.h"
#include "nvim/ex_getln.h"
#include "nvim/farsi.h"
@@ -29,7 +33,6 @@
#include "nvim/memory.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/keymap.h"
#include "nvim/move.h"
#include "nvim/normal.h"
@@ -135,6 +138,7 @@ struct compl_S {
static compl_T *compl_first_match = NULL;
static compl_T *compl_curr_match = NULL;
static compl_T *compl_shown_match = NULL;
+static compl_T *compl_old_match = NULL;
/* After using a cursor key <Enter> selects a match in the popup menu,
* otherwise it inserts a line break. */
@@ -180,6 +184,16 @@ static expand_T compl_xp;
static int compl_opt_refresh_always = FALSE;
+static int pum_selected_item = -1;
+
+/// state for pum_ext_select_item.
+struct {
+ bool active;
+ int item;
+ bool insert;
+ bool finish;
+} pum_want;
+
typedef struct insert_state {
VimState state;
cmdarg_T *ca;
@@ -223,7 +237,7 @@ static int last_insert_skip; /* nr of chars in front of previous insert */
static int new_insert_skip; /* nr of chars in front of current insert */
static int did_restart_edit; /* "restart_edit" when calling edit() */
-static int can_cindent; /* may do cindenting on this line */
+static bool can_cindent; // may do cindenting on this line
static int old_indent = 0; /* for ^^D command in insert mode */
@@ -236,10 +250,10 @@ static int ins_need_undo; /* call u_save() before inserting a
char. Set when edit() is called.
after that arrow_used is used. */
-static int did_add_space = FALSE; /* auto_format() added an extra space
- under the cursor */
-static int dont_sync_undo = false; // CTRL-G U prevents syncing undo
- // for the next left/right cursor
+static bool did_add_space = false; // auto_format() added an extra space
+ // under the cursor
+static TriState dont_sync_undo = kFalse; // CTRL-G U prevents syncing undo
+ // for the next left/right cursor
static linenr_T o_lnum = 0;
@@ -272,7 +286,7 @@ static void insert_enter(InsertState *s)
set_vim_var_string(VV_INSERTMODE, (char *) s->ptr, 1);
set_vim_var_string(VV_CHAR, NULL, -1);
- apply_autocmds(EVENT_INSERTENTER, NULL, NULL, false, curbuf);
+ ins_apply_autocmds(EVENT_INSERTENTER);
// Make sure the cursor didn't move. Do call check_cursor_col() in
// case the text was modified. Since Insert mode was not started yet
@@ -292,10 +306,6 @@ static void insert_enter(InsertState *s)
}
}
- // Check if the cursor line needs redrawing before changing State. If
- // 'concealcursor' is "n" it needs to be redrawn without concealing.
- conceal_check_cursur_line();
-
// When doing a paste with the middle mouse button, Insstart is set to
// where the paste started.
if (where_paste_started.lnum != 0) {
@@ -459,12 +469,16 @@ static void insert_enter(InsertState *s)
// Always update o_lnum, so that a "CTRL-O ." that adds a line
// still puts the cursor back after the inserted text.
- if (ins_at_eol && gchar_cursor() == NUL) {
+ if (ins_at_eol) {
o_lnum = curwin->w_cursor.lnum;
}
- if (s->cmdchar != 'r' && s->cmdchar != 'v') {
- apply_autocmds(EVENT_INSERTLEAVE, NULL, NULL, false, curbuf);
+ foldUpdateAfterInsert();
+ // When CTRL-C was typed got_int will be set, with the result
+ // that the autocommands won't be executed. When mapped got_int
+ // is not set, but let's keep the behavior the same.
+ if (s->cmdchar != 'r' && s->cmdchar != 'v' && s->c != Ctrl_C) {
+ ins_apply_autocmds(EVENT_INSERTLEAVE);
}
did_cursorhold = false;
}
@@ -474,7 +488,9 @@ static int insert_check(VimState *state)
InsertState *s = (InsertState *)state;
// If typed something may trigger CursorHoldI again.
- if (s->c != K_EVENT) {
+ if (s->c != K_EVENT
+ // but not in CTRL-X mode, a script can't restore the state
+ && ctrl_x_mode == 0) {
did_cursorhold = false;
}
@@ -501,7 +517,7 @@ static int insert_check(VimState *state)
Insstart_orig = Insstart;
}
- if (stop_insert_mode) {
+ if (stop_insert_mode && !pum_visible()) {
// ":stopinsert" used or 'insertmode' reset
s->count = 0;
return 0; // exit insert mode
@@ -550,7 +566,7 @@ static int insert_check(VimState *state)
if (curwin->w_wcol < s->mincol - curbuf->b_p_ts
&& curwin->w_wrow == curwin->w_winrow
- + curwin->w_height - 1 - p_so
+ + curwin->w_grid.Rows - 1 - p_so
&& (curwin->w_cursor.lnum != curwin->w_topline
|| curwin->w_topfill > 0)) {
if (curwin->w_topfill > 0) {
@@ -588,10 +604,10 @@ static int insert_check(VimState *state)
s->lastc = s->c; // remember previous char for CTRL-D
// After using CTRL-G U the next cursor key will not break undo.
- if (dont_sync_undo == MAYBE) {
- dont_sync_undo = true;
+ if (dont_sync_undo == kNone) {
+ dont_sync_undo = kTrue;
} else {
- dont_sync_undo = false;
+ dont_sync_undo = kFalse;
}
return 1;
@@ -652,7 +668,7 @@ static int insert_execute(VimState *state, int key)
char_u *p;
if (str != NULL) {
- for (p = str; *p != NUL; mb_ptr_adv(p)) {
+ for (p = str; *p != NUL; MB_PTR_ADV(p)) {
ins_compl_addleader(PTR2CHAR(p));
}
xfree(str);
@@ -664,11 +680,12 @@ static int insert_execute(VimState *state, int key)
// Pressing CTRL-Y selects the current match. When
// compl_enter_selects is set the Enter key does the same.
- if (s->c == Ctrl_Y
- || (compl_enter_selects
- && (s->c == CAR || s->c == K_KENTER || s->c == NL))) {
+ if ((s->c == Ctrl_Y
+ || (compl_enter_selects
+ && (s->c == CAR || s->c == K_KENTER || s->c == NL)))
+ && stop_arrow() == OK) {
ins_compl_delete();
- ins_compl_insert();
+ ins_compl_insert(false);
}
}
}
@@ -686,11 +703,9 @@ static int insert_execute(VimState *state, int key)
if (s->c == Ctrl_BSL) {
// may need to redraw when no more chars available now
ins_redraw(false);
- ++no_mapping;
- ++allow_keys;
+ no_mapping++;
s->c = plain_vgetc();
- --no_mapping;
- --allow_keys;
+ no_mapping--;
if (s->c != Ctrl_N && s->c != Ctrl_G && s->c != Ctrl_O) {
// it's something else
vungetc(s->c);
@@ -769,7 +784,7 @@ static int insert_handle_key(InsertState *s)
if (echeck_abbr(ESC + ABBR_OFF)) {
break;
}
- // FALLTHROUGH
+ FALLTHROUGH;
case Ctrl_C: // End input mode
if (s->c == Ctrl_C && cmdwin_type != 0) {
@@ -797,9 +812,9 @@ static int insert_handle_key(InsertState *s)
if (!p_im) {
goto normalchar; // insert CTRL-Z as normal char
}
- stuffReadbuff((char_u *)":st\r");
- s->c = Ctrl_O;
- // FALLTHROUGH
+ do_cmdline_cmd("stop");
+ ui_cursor_shape(); // may need to update cursor shape
+ break;
case Ctrl_O: // execute one command
if (ctrl_x_mode == CTRL_X_OMNI) {
@@ -841,6 +856,11 @@ static int insert_handle_key(InsertState *s)
return 0; // exit insert mode
+ case ' ':
+ if (mod_mask != MOD_MASK_CTRL) {
+ goto normalchar;
+ }
+ FALLTHROUGH;
case K_ZERO: // Insert the previously inserted text.
case NUL:
case Ctrl_A:
@@ -879,7 +899,7 @@ static int insert_handle_key(InsertState *s)
insert_do_complete(s);
break;
}
- // FALLTHROUGH
+ FALLTHROUGH;
case Ctrl_T: // Make indent one shiftwidth greater.
if (s->c == Ctrl_T && ctrl_x_mode == CTRL_X_THESAURUS) {
@@ -961,15 +981,26 @@ static int insert_handle_key(InsertState *s)
break;
case K_EVENT: // some event
- queue_process_events(main_loop.events);
- break;
-
- case K_FOCUSGAINED: // Neovim has been given focus
- apply_autocmds(EVENT_FOCUSGAINED, NULL, NULL, false, curbuf);
- break;
-
- case K_FOCUSLOST: // Neovim has lost focus
- apply_autocmds(EVENT_FOCUSLOST, NULL, NULL, false, curbuf);
+ multiqueue_process_events(main_loop.events);
+ goto check_pum;
+
+ case K_COMMAND: // some command
+ do_cmdline(NULL, getcmdkeycmd, NULL, 0);
+
+check_pum:
+ // TODO(bfredl): Not entirely sure this indirection is necessary
+ // but doing like this ensures using nvim_select_popupmenu_item is
+ // equivalent to selecting the item with a typed key.
+ if (pum_want.active) {
+ if (pum_visible()) {
+ insert_do_complete(s);
+ if (pum_want.finish) {
+ // accept the item and stop completion
+ ins_compl_prep(Ctrl_Y);
+ }
+ }
+ pum_want.active = false;
+ }
break;
case K_HOME: // <Home>
@@ -990,7 +1021,7 @@ static int insert_handle_key(InsertState *s)
if (mod_mask & (MOD_MASK_SHIFT|MOD_MASK_CTRL)) {
ins_s_left();
} else {
- ins_left(dont_sync_undo == false);
+ ins_left(dont_sync_undo == kFalse);
}
break;
@@ -1003,7 +1034,7 @@ static int insert_handle_key(InsertState *s)
if (mod_mask & (MOD_MASK_SHIFT|MOD_MASK_CTRL)) {
ins_s_right();
} else {
- ins_right(dont_sync_undo == false);
+ ins_right(dont_sync_undo == kFalse);
}
break;
@@ -1055,7 +1086,7 @@ static int insert_handle_key(InsertState *s)
case K_S_TAB: // When not mapped, use like a normal TAB
s->c = TAB;
- // FALLTHROUGH
+ FALLTHROUGH;
case TAB: // TAB or Complete patterns along path
if (ctrl_x_mode == CTRL_X_PATH_PATTERNS) {
@@ -1071,7 +1102,7 @@ static int insert_handle_key(InsertState *s)
case K_KENTER: // <Enter>
s->c = CAR;
- // FALLTHROUGH
+ FALLTHROUGH;
case CAR:
case NL:
// In a quickfix window a <CR> jumps to the error under the
@@ -1089,7 +1120,7 @@ static int insert_handle_key(InsertState *s)
cmdwin_result = CAR;
return 0;
}
- if (ins_eol(s->c) && !p_im) {
+ if (!ins_eol(s->c) && !p_im) {
return 0; // out of memory
}
auto_format(false, false);
@@ -1150,7 +1181,7 @@ static int insert_handle_key(InsertState *s)
}
goto normalchar;
}
- // FALLTHROUGH
+ FALLTHROUGH;
case Ctrl_P: // Do previous/next pattern completion
case Ctrl_N:
@@ -1174,6 +1205,14 @@ static int insert_handle_key(InsertState *s)
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);
+ break;
+ }
+
if (!p_paste) {
// Trigger InsertCharPre.
char_u *str = do_insert_char_pre(s->c);
@@ -1182,7 +1221,7 @@ normalchar:
if (str != NULL) {
if (*str != NUL && stop_arrow() != FAIL) {
// Insert the new value of v:char literally.
- for (p = str; *p != NUL; mb_ptr_adv(p)) {
+ for (p = str; *p != NUL; MB_PTR_ADV(p)) {
s->c = PTR2CHAR(p);
if (s->c == CAR || s->c == K_KENTER || s->c == NL) {
ins_eol(s->c);
@@ -1285,10 +1324,9 @@ bool edit(int cmdchar, bool startln, long count)
{
if (curbuf->terminal) {
if (ex_normal_busy) {
- // don't enter terminal mode from `ex_normal`, which can result in all
- // kinds of havoc(such as terminal mode recursiveness). Instead, set a
- // flag that allow us to force-set the value of `restart_edit` before
- // `ex_normal` returns
+ // Do not enter terminal mode from ex_normal(), which would cause havoc
+ // (such as terminal-mode recursiveness). Instead set a flag to force-set
+ // the value of `restart_edit` before `ex_normal` returns.
restart_edit = 'i';
force_restart_edit = true;
} else {
@@ -1339,9 +1377,7 @@ ins_redraw (
int ready /* not busy with something */
)
{
- linenr_T conceal_old_cursor_line = 0;
- linenr_T conceal_new_cursor_line = 0;
- int conceal_update_lines = FALSE;
+ bool conceal_cursor_moved = false;
if (char_avail())
return;
@@ -1362,42 +1398,61 @@ ins_redraw (
// Make sure curswant is correct, an autocommand may call
// getcurpos()
update_curswant();
- apply_autocmds(EVENT_CURSORMOVEDI, NULL, NULL, false, curbuf);
- }
- if (curwin->w_p_cole > 0) {
- conceal_old_cursor_line = last_cursormoved.lnum;
- conceal_new_cursor_line = curwin->w_cursor.lnum;
- conceal_update_lines = TRUE;
+ ins_apply_autocmds(EVENT_CURSORMOVEDI);
}
+ conceal_cursor_moved = true;
last_cursormoved = curwin->w_cursor;
}
- // Trigger TextChangedI if b_changedtick differs.
+ // Trigger TextChangedI if changedtick differs.
if (ready && has_event(EVENT_TEXTCHANGEDI)
- && last_changedtick != curbuf->b_changedtick
+ && curbuf->b_last_changedtick != buf_get_changedtick(curbuf)
&& !pum_visible()) {
- if (last_changedtick_buf == curbuf) {
- apply_autocmds(EVENT_TEXTCHANGEDI, NULL, NULL, false, curbuf);
+ aco_save_T aco;
+ varnumber_T tick = buf_get_changedtick(curbuf);
+
+ // save and restore curwin and curbuf, in case the autocmd changes them
+ aucmd_prepbuf(&aco, curbuf);
+ apply_autocmds(EVENT_TEXTCHANGEDI, NULL, NULL, false, curbuf);
+ aucmd_restbuf(&aco);
+ curbuf->b_last_changedtick = buf_get_changedtick(curbuf);
+ if (tick != buf_get_changedtick(curbuf)) { // see ins_apply_autocmds()
+ u_save(curwin->w_cursor.lnum,
+ (linenr_T)(curwin->w_cursor.lnum + 1));
+ }
+ }
+
+ // Trigger TextChangedP if changedtick differs. When the popupmenu closes
+ // TextChangedI will need to trigger for backwards compatibility, thus use
+ // different b_last_changedtick* variables.
+ if (ready && has_event(EVENT_TEXTCHANGEDP)
+ && curbuf->b_last_changedtick_pum != buf_get_changedtick(curbuf)
+ && pum_visible()) {
+ aco_save_T aco;
+ varnumber_T tick = buf_get_changedtick(curbuf);
+
+ // save and restore curwin and curbuf, in case the autocmd changes them
+ aucmd_prepbuf(&aco, curbuf);
+ apply_autocmds(EVENT_TEXTCHANGEDP, NULL, NULL, false, curbuf);
+ aucmd_restbuf(&aco);
+ curbuf->b_last_changedtick_pum = buf_get_changedtick(curbuf);
+ if (tick != buf_get_changedtick(curbuf)) { // see ins_apply_autocmds()
+ u_save(curwin->w_cursor.lnum,
+ (linenr_T)(curwin->w_cursor.lnum + 1));
}
- last_changedtick_buf = curbuf;
- last_changedtick = curbuf->b_changedtick;
}
- if (must_redraw)
+ if (curwin->w_p_cole > 0 && conceal_cursor_line(curwin)
+ && conceal_cursor_moved) {
+ redrawWinline(curwin, curwin->w_cursor.lnum);
+ }
+
+ if (must_redraw) {
update_screen(0);
- else if (clear_cmdline || redraw_cmdline)
- showmode(); /* clear cmdline and show mode */
- if ((conceal_update_lines
- && (conceal_old_cursor_line != conceal_new_cursor_line
- || conceal_cursor_line(curwin)))
- || need_cursor_line_redraw) {
- if (conceal_old_cursor_line != conceal_new_cursor_line)
- update_single_line(curwin, conceal_old_cursor_line);
- update_single_line(curwin, conceal_new_cursor_line == 0
- ? curwin->w_cursor.lnum : conceal_new_cursor_line);
- curwin->w_valid &= ~VALID_CROW;
- }
- showruler(FALSE);
+ } else if (clear_cmdline || redraw_cmdline) {
+ showmode(); // clear cmdline and show mode
+ }
+ showruler(false);
setcursor();
emsg_on_display = FALSE; /* may remove error message now */
}
@@ -1417,7 +1472,7 @@ static void ins_ctrl_v(void)
edit_putchar('^', TRUE);
did_putchar = TRUE;
}
- AppendToRedobuff((char_u *)CTRL_V_STR); /* CTRL-V */
+ AppendToRedobuff(CTRL_V_STR);
add_to_showcmd_c(Ctrl_V);
@@ -1427,7 +1482,7 @@ static void ins_ctrl_v(void)
* line and will not removed by the redraw */
edit_unputchar();
clear_showcmd();
- insert_special(c, FALSE, TRUE);
+ insert_special(c, true, true);
revins_chars++;
revins_legal++;
}
@@ -1450,39 +1505,41 @@ void edit_putchar(int c, int highlight)
{
int attr;
- if (ScreenLines != NULL) {
- update_topline(); /* just in case w_topline isn't valid */
+ if (curwin->w_grid.chars != NULL || default_grid.chars != NULL) {
+ update_topline(); // just in case w_topline isn't valid
validate_cursor();
- if (highlight)
- attr = hl_attr(HLF_8);
- else
+ if (highlight) {
+ attr = HL_ATTR(HLF_8);
+ } else {
attr = 0;
- pc_row = curwin->w_winrow + curwin->w_wrow;
- pc_col = curwin->w_wincol;
+ }
+ pc_row = curwin->w_wrow;
+ pc_col = 0;
pc_status = PC_STATUS_UNSET;
if (curwin->w_p_rl) {
- pc_col += curwin->w_width - 1 - curwin->w_wcol;
+ pc_col += curwin->w_grid.Columns - 1 - curwin->w_wcol;
if (has_mbyte) {
- int fix_col = mb_fix_col(pc_col, pc_row);
+ int fix_col = grid_fix_col(&curwin->w_grid, pc_col, pc_row);
if (fix_col != pc_col) {
- screen_putchar(' ', pc_row, fix_col, attr);
- --curwin->w_wcol;
+ grid_putchar(&curwin->w_grid, ' ', pc_row, fix_col, attr);
+ curwin->w_wcol--;
pc_status = PC_STATUS_RIGHT;
}
}
} else {
pc_col += curwin->w_wcol;
- if (mb_lefthalve(pc_row, pc_col))
+ if (grid_lefthalve(&curwin->w_grid, pc_row, pc_col)) {
pc_status = PC_STATUS_LEFT;
+ }
}
/* save the character to be able to put it back */
if (pc_status == PC_STATUS_UNSET) {
- screen_getbytes(pc_row, pc_col, pc_bytes, &pc_attr);
+ grid_getbytes(&curwin->w_grid, pc_row, pc_col, pc_bytes, &pc_attr);
pc_status = PC_STATUS_SET;
}
- screen_putchar(c, pc_row, pc_col, attr);
+ grid_putchar(&curwin->w_grid, c, pc_row, pc_col, attr);
}
}
@@ -1492,12 +1549,15 @@ void edit_putchar(int c, int highlight)
void edit_unputchar(void)
{
if (pc_status != PC_STATUS_UNSET && pc_row >= msg_scrolled) {
- if (pc_status == PC_STATUS_RIGHT)
- ++curwin->w_wcol;
- if (pc_status == PC_STATUS_RIGHT || pc_status == PC_STATUS_LEFT)
- redrawWinline(curwin->w_cursor.lnum, FALSE);
- else
- screen_puts(pc_bytes, pc_row - msg_scrolled, pc_col, pc_attr);
+ if (pc_status == PC_STATUS_RIGHT) {
+ curwin->w_wcol++;
+ }
+ if (pc_status == PC_STATUS_RIGHT || pc_status == PC_STATUS_LEFT) {
+ redrawWinline(curwin, curwin->w_cursor.lnum);
+ } else {
+ grid_puts(&curwin->w_grid, pc_bytes, pc_row - msg_scrolled, pc_col,
+ pc_attr);
+ }
}
}
@@ -1514,16 +1574,13 @@ void display_dollar(colnr_T col)
save_col = curwin->w_cursor.col;
curwin->w_cursor.col = col;
- if (has_mbyte) {
- char_u *p;
- /* If on the last byte of a multi-byte move to the first byte. */
- p = get_cursor_line_ptr();
- curwin->w_cursor.col -= (*mb_head_off)(p, p + col);
- }
- curs_columns(FALSE); /* recompute w_wrow and w_wcol */
- if (curwin->w_wcol < curwin->w_width) {
- edit_putchar('$', FALSE);
+ // If on the last byte of a multi-byte move to the first byte.
+ char_u *p = get_cursor_line_ptr();
+ curwin->w_cursor.col -= utf_head_off(p, p + col);
+ curs_columns(false); // Recompute w_wrow and w_wcol
+ if (curwin->w_wcol < curwin->w_grid.Columns) {
+ edit_putchar('$', false);
dollar_vcol = curwin->w_virtcol;
}
curwin->w_cursor.col = save_col;
@@ -1537,7 +1594,7 @@ static void undisplay_dollar(void)
{
if (dollar_vcol >= 0) {
dollar_vcol = -1;
- redrawWinline(curwin->w_cursor.lnum, FALSE);
+ redrawWinline(curwin, curwin->w_cursor.lnum);
}
}
@@ -1744,8 +1801,8 @@ change_indent (
/* We only put back the new line up to the cursor */
new_line[curwin->w_cursor.col] = NUL;
- /* Put back original line */
- ml_replace(curwin->w_cursor.lnum, orig_line, FALSE);
+ // Put back original line
+ ml_replace(curwin->w_cursor.lnum, orig_line, false);
curwin->w_cursor.col = orig_col;
/* Backspace from cursor to start of line */
@@ -1857,8 +1914,9 @@ static bool check_compl_option(bool dict_opt)
: (*curbuf->b_p_tsr == NUL && *p_tsr == NUL)) {
ctrl_x_mode = 0;
edit_submode = NULL;
- msg_attr(dict_opt ? (char_u *)_("'dictionary' option is empty")
- : (char_u *)_("'thesaurus' option is empty"), hl_attr(HLF_E));
+ msg_attr((dict_opt
+ ? _("'dictionary' option is empty")
+ : _("'thesaurus' option is empty")), HL_ATTR(HLF_E));
if (emsg_silent == 0) {
vim_beep(BO_COMPL);
setcursor();
@@ -1925,7 +1983,7 @@ bool vim_is_ctrl_x_key(int c)
case CTRL_X_EVAL:
return (c == Ctrl_P || c == Ctrl_N);
}
- EMSG(_(e_internal));
+ internal_error("vim_is_ctrl_x_key()");
return false;
}
@@ -1970,7 +2028,6 @@ static bool ins_compl_accept_char(int c)
*/
int ins_compl_add_infercase(char_u *str, int len, int icase, char_u *fname, int dir, int flags)
{
- char_u *p;
int i, c;
int actual_len; /* Take multi-byte characters */
int actual_compl_length; /* into account. */
@@ -1980,26 +2037,26 @@ int ins_compl_add_infercase(char_u *str, int len, int icase, char_u *fname, int
int was_letter = FALSE;
if (p_ic && curbuf->b_p_inf && len > 0) {
- /* Infer case of completed part. */
+ // Infer case of completed part.
- /* Find actual length of completion. */
+ // Find actual length of completion.
if (has_mbyte) {
- p = str;
+ const char_u *p = str;
actual_len = 0;
while (*p != NUL) {
- mb_ptr_adv(p);
- ++actual_len;
+ MB_PTR_ADV(p);
+ actual_len++;
}
} else
actual_len = len;
/* Find actual length of original text. */
if (has_mbyte) {
- p = compl_orig_text;
+ const char_u *p = compl_orig_text;
actual_compl_length = 0;
while (*p != NUL) {
- mb_ptr_adv(p);
- ++actual_compl_length;
+ MB_PTR_ADV(p);
+ actual_compl_length++;
}
} else
actual_compl_length = compl_length;
@@ -2011,27 +2068,35 @@ int ins_compl_add_infercase(char_u *str, int len, int icase, char_u *fname, int
/* Allocate wide character array for the completion and fill it. */
wca = xmalloc(actual_len * sizeof(*wca));
- p = str;
- for (i = 0; i < actual_len; ++i)
- if (has_mbyte)
- wca[i] = mb_ptr2char_adv(&p);
- else
- wca[i] = *(p++);
+ {
+ const char_u *p = str;
+ for (i = 0; i < actual_len; i++) {
+ if (has_mbyte) {
+ wca[i] = mb_ptr2char_adv(&p);
+ } else {
+ wca[i] = *(p++);
+ }
+ }
+ }
- /* Rule 1: Were any chars converted to lower? */
- p = compl_orig_text;
- for (i = 0; i < min_len; ++i) {
- if (has_mbyte)
- c = mb_ptr2char_adv(&p);
- else
- c = *(p++);
- if (vim_islower(c)) {
- has_lower = TRUE;
- if (vim_isupper(wca[i])) {
- /* Rule 1 is satisfied. */
- for (i = actual_compl_length; i < actual_len; ++i)
- wca[i] = vim_tolower(wca[i]);
- break;
+ // Rule 1: Were any chars converted to lower?
+ {
+ const char_u *p = compl_orig_text;
+ for (i = 0; i < min_len; i++) {
+ if (has_mbyte) {
+ c = mb_ptr2char_adv(&p);
+ } else {
+ c = *(p++);
+ }
+ if (mb_islower(c)) {
+ has_lower = true;
+ if (mb_isupper(wca[i])) {
+ // Rule 1 is satisfied.
+ for (i = actual_compl_length; i < actual_len; i++) {
+ wca[i] = mb_tolower(wca[i]);
+ }
+ break;
+ }
}
}
}
@@ -2041,84 +2106,106 @@ int ins_compl_add_infercase(char_u *str, int len, int icase, char_u *fname, int
* upper case.
*/
if (!has_lower) {
- p = compl_orig_text;
- for (i = 0; i < min_len; ++i) {
- if (has_mbyte)
+ const char_u *p = compl_orig_text;
+ for (i = 0; i < min_len; i++) {
+ if (has_mbyte) {
c = mb_ptr2char_adv(&p);
- else
+ } else {
c = *(p++);
- if (was_letter && vim_isupper(c) && vim_islower(wca[i])) {
- /* Rule 2 is satisfied. */
- for (i = actual_compl_length; i < actual_len; ++i)
- wca[i] = vim_toupper(wca[i]);
+ }
+ if (was_letter && mb_isupper(c) && mb_islower(wca[i])) {
+ // Rule 2 is satisfied.
+ for (i = actual_compl_length; i < actual_len; i++) {
+ wca[i] = mb_toupper(wca[i]);
+ }
break;
}
- was_letter = vim_islower(c) || vim_isupper(c);
+ was_letter = mb_islower(c) || mb_isupper(c);
}
}
- /* Copy the original case of the part we typed. */
- p = compl_orig_text;
- for (i = 0; i < min_len; ++i) {
- if (has_mbyte)
- c = mb_ptr2char_adv(&p);
- else
- c = *(p++);
- if (vim_islower(c))
- wca[i] = vim_tolower(wca[i]);
- else if (vim_isupper(c))
- wca[i] = vim_toupper(wca[i]);
+ // Copy the original case of the part we typed.
+ {
+ const char_u *p = compl_orig_text;
+ for (i = 0; i < min_len; i++) {
+ if (has_mbyte) {
+ c = mb_ptr2char_adv(&p);
+ } else {
+ c = *(p++);
+ }
+ if (mb_islower(c)) {
+ wca[i] = mb_tolower(wca[i]);
+ } else if (mb_isupper(c)) {
+ wca[i] = mb_toupper(wca[i]);
+ }
+ }
}
- /*
- * Generate encoding specific output from wide character array.
- * Multi-byte characters can occupy up to five bytes more than
- * ASCII characters, and we also need one byte for NUL, so stay
- * six bytes away from the edge of IObuff.
- */
- p = IObuff;
- i = 0;
- while (i < actual_len && (p - IObuff + 6) < IOSIZE)
- if (has_mbyte)
- p += (*mb_char2bytes)(wca[i++], p);
- else
- *(p++) = wca[i++];
- *p = NUL;
+ // Generate encoding specific output from wide character array.
+ // Multi-byte characters can occupy up to five bytes more than
+ // ASCII characters, and we also need one byte for NUL, so stay
+ // six bytes away from the edge of IObuff.
+ {
+ char_u *p = IObuff;
+ i = 0;
+ while (i < actual_len && (p - IObuff + 6) < IOSIZE) {
+ p += utf_char2bytes(wca[i++], p);
+ }
+ *p = NUL;
+ }
xfree(wca);
- return ins_compl_add(IObuff, len, icase, fname, NULL, dir,
- flags, FALSE);
+ return ins_compl_add(IObuff, len, icase, fname, NULL, false, dir, flags,
+ false);
}
- return ins_compl_add(str, len, icase, fname, NULL, dir, flags, FALSE);
+ return ins_compl_add(str, len, icase, fname, NULL, false, dir, flags, false);
}
-/*
- * Add a match to the list of matches.
- * If the given string is already in the list of completions, then return
- * NOTDONE, otherwise add it to the list and return OK. If there is an error
- * then FAIL is returned.
- */
-static int
-ins_compl_add (
- char_u *str,
- int len,
- int icase,
- char_u *fname,
- char_u **cptext, /* extra text for popup menu or NULL */
- int cdir,
- int flags,
- int adup /* accept duplicate match */
-)
+/// Add a match to the list of matches
+///
+/// @param[in] str Match to add.
+/// @param[in] len Match length, -1 to use #STRLEN.
+/// @param[in] icase Whether case is to be ignored.
+/// @param[in] fname File name match comes from. May be NULL.
+/// @param[in] cptext Extra text for popup menu. May be NULL. If not NULL,
+/// must have exactly #CPT_COUNT items.
+/// @param[in] cptext_allocated If true, will not copy cptext strings.
+///
+/// @note Will free strings in case of error.
+/// cptext itself will not be freed.
+/// @param[in] cdir Completion direction.
+/// @param[in] adup True if duplicate matches are to be accepted.
+///
+/// @return NOTDONE if the given string is already in the list of completions,
+/// otherwise it is added to the list and OK is returned. FAIL will be
+/// returned in case of error.
+static int ins_compl_add(char_u *const str, int len,
+ const bool icase, char_u *const fname,
+ char_u *const *const cptext,
+ const bool cptext_allocated,
+ const Direction cdir, int flags, const bool adup)
+ FUNC_ATTR_NONNULL_ARG(1)
{
compl_T *match;
- int dir = (cdir == 0 ? compl_direction : cdir);
+ int dir = (cdir == kDirectionNotSet ? compl_direction : cdir);
os_breakcheck();
- if (got_int)
+#define FREE_CPTEXT(cptext, cptext_allocated) \
+ do { \
+ if (cptext != NULL && cptext_allocated) { \
+ for (size_t i = 0; i < CPT_COUNT; i++) { \
+ xfree(cptext[i]); \
+ } \
+ } \
+ } while (0)
+ if (got_int) {
+ FREE_CPTEXT(cptext, cptext_allocated);
return FAIL;
- if (len < 0)
+ }
+ if (len < 0) {
len = (int)STRLEN(str);
+ }
/*
* If the same match is already present, don't add it.
@@ -2126,10 +2213,12 @@ ins_compl_add (
if (compl_first_match != NULL && !adup) {
match = compl_first_match;
do {
- if ( !(match->cp_flags & ORIGINAL_TEXT)
- && STRNCMP(match->cp_str, str, len) == 0
- && match->cp_str[len] == NUL)
+ if (!(match->cp_flags & ORIGINAL_TEXT)
+ && STRNCMP(match->cp_str, str, len) == 0
+ && match->cp_str[len] == NUL) {
+ FREE_CPTEXT(cptext, cptext_allocated);
return NOTDONE;
+ }
match = match->cp_next;
} while (match != NULL && match != compl_first_match);
}
@@ -2160,16 +2249,26 @@ ins_compl_add (
else if (fname != NULL) {
match->cp_fname = vim_strsave(fname);
flags |= FREE_FNAME;
- } else
+ } else {
match->cp_fname = NULL;
+ }
match->cp_flags = flags;
if (cptext != NULL) {
int i;
- for (i = 0; i < CPT_COUNT; ++i)
- if (cptext[i] != NULL && *cptext[i] != NUL)
- match->cp_text[i] = vim_strsave(cptext[i]);
+ for (i = 0; i < CPT_COUNT; i++) {
+ if (cptext[i] == NULL) {
+ continue;
+ }
+ if (*cptext[i] != NUL) {
+ match->cp_text[i] = (cptext_allocated
+ ? cptext[i]
+ : (char_u *)xstrdup((char *)cptext[i]));
+ } else if (cptext_allocated) {
+ xfree(cptext[i]);
+ }
+ }
}
/*
@@ -2243,23 +2342,14 @@ static void ins_compl_longest_match(compl_T *match)
p = compl_leader;
s = match->cp_str;
while (*p != NUL) {
- if (has_mbyte) {
- c1 = mb_ptr2char(p);
- c2 = mb_ptr2char(s);
- } else {
- c1 = *p;
- c2 = *s;
- }
- if (match->cp_icase ? (vim_tolower(c1) != vim_tolower(c2))
- : (c1 != c2))
+ c1 = utf_ptr2char(p);
+ c2 = utf_ptr2char(s);
+
+ if (match->cp_icase ? (mb_tolower(c1) != mb_tolower(c2)) : (c1 != c2)) {
break;
- if (has_mbyte) {
- mb_ptr_adv(p);
- mb_ptr_adv(s);
- } else {
- ++p;
- ++s;
}
+ MB_PTR_ADV(p);
+ MB_PTR_ADV(s);
}
if (*p != NUL) {
@@ -2292,9 +2382,10 @@ static void ins_compl_add_matches(int num_matches, char_u **matches, int icase)
for (i = 0; i < num_matches && add_r != FAIL; i++)
if ((add_r = ins_compl_add(matches[i], -1, icase,
- NULL, NULL, dir, 0, FALSE)) == OK)
- /* if dir was BACKWARD then honor it just once */
+ NULL, NULL, false, dir, 0, false)) == OK) {
+ // If dir was BACKWARD then honor it just once.
dir = FORWARD;
+ }
FreeWild(num_matches, matches);
}
@@ -2322,7 +2413,6 @@ static int ins_compl_make_cyclic(void)
return count;
}
-
// Set variables that store noselect and noinsert behavior from the
// 'completeopt' value.
void completeopt_was_set(void)
@@ -2350,9 +2440,7 @@ void set_completion(colnr_T startcol, list_T *list)
ins_compl_prep(' ');
}
ins_compl_clear();
-
- if (stop_arrow() == FAIL)
- return;
+ ins_compl_free();
compl_direction = FORWARD;
if (startcol > curwin->w_cursor.col)
@@ -2362,8 +2450,8 @@ void set_completion(colnr_T startcol, list_T *list)
/* compl_pattern doesn't need to be set */
compl_orig_text = vim_strnsave(get_cursor_line_ptr() + compl_col,
compl_length);
- if (ins_compl_add(compl_orig_text, -1, p_ic, NULL, NULL, 0,
- ORIGINAL_TEXT, FALSE) != OK) {
+ if (ins_compl_add(compl_orig_text, -1, p_ic, NULL, NULL, false, 0,
+ ORIGINAL_TEXT, false) != OK) {
return;
}
@@ -2375,6 +2463,7 @@ void set_completion(colnr_T startcol, list_T *list)
compl_used_match = TRUE;
compl_cont_status = 0;
int save_w_wrow = curwin->w_wrow;
+ int save_w_leftcol = curwin->w_leftcol;
compl_curr_match = compl_first_match;
if (compl_no_insert || compl_no_select) {
@@ -2385,10 +2474,11 @@ void set_completion(colnr_T startcol, list_T *list)
} else {
ins_complete(Ctrl_N, false);
}
+ compl_enter_selects = compl_no_insert;
// Lazily show the popup menu, unless we got interrupted.
if (!compl_interrupted) {
- show_pum(save_w_wrow);
+ show_pum(save_w_wrow, save_w_leftcol);
}
ui_flush();
@@ -2471,6 +2561,7 @@ void ins_compl_show_pum(void)
int cur = -1;
colnr_T col;
int lead_len = 0;
+ bool array_changed = false;
if (!pum_wanted() || !pum_enough_matches())
return;
@@ -2482,7 +2573,8 @@ void ins_compl_show_pum(void)
update_screen(0);
if (compl_match_array == NULL) {
- /* Need to build the popup menu list. */
+ array_changed = true;
+ // Need to build the popup menu list.
compl_match_arraysize = 0;
compl = compl_first_match;
/*
@@ -2585,7 +2677,8 @@ void ins_compl_show_pum(void)
// Use the cursor to get all wrapping and other settings right.
col = curwin->w_cursor.col;
curwin->w_cursor.col = compl_col;
- pum_display(compl_match_array, compl_match_arraysize, cur);
+ pum_selected_item = cur;
+ pum_display(compl_match_array, compl_match_arraysize, cur, array_changed);
curwin->w_cursor.col = col;
}
@@ -2703,8 +2796,8 @@ static void ins_compl_files(int count, char_u **files, int thesaurus, int flags,
fp = mch_fopen((char *)files[i], "r"); /* open dictionary file */
if (flags != DICT_EXACT) {
vim_snprintf((char *)IObuff, IOSIZE,
- _("Scanning dictionary: %s"), (char *)files[i]);
- (void)msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R));
+ _("Scanning dictionary: %s"), (char *)files[i]);
+ (void)msg_trunc_attr(IObuff, true, HL_ATTR(HLF_R));
}
if (fp == NULL) {
@@ -2775,7 +2868,7 @@ static void ins_compl_files(int count, char_u **files, int thesaurus, int flags,
break;
}
line_breakcheck();
- ins_compl_check_keys(50);
+ ins_compl_check_keys(50, false);
}
fclose(fp);
}
@@ -2865,6 +2958,7 @@ static void ins_compl_free(void)
} while (compl_curr_match != NULL && compl_curr_match != compl_first_match);
compl_first_match = compl_curr_match = NULL;
compl_shown_match = NULL;
+ compl_old_match = NULL;
}
static void ins_compl_clear(void)
@@ -2881,7 +2975,7 @@ static void ins_compl_clear(void)
compl_orig_text = NULL;
compl_enter_selects = FALSE;
// clear v:completed_item
- set_vim_var_dict(VV_COMPLETED_ITEM, dict_alloc());
+ set_vim_var_dict(VV_COMPLETED_ITEM, tv_dict_alloc());
}
/// Check that Insert completion is active.
@@ -2904,13 +2998,16 @@ static int ins_compl_bs(void)
line = get_cursor_line_ptr();
p = line + curwin->w_cursor.col;
- mb_ptr_back(line, p);
+ MB_PTR_BACK(line, p);
- /* Stop completion when the whole word was deleted. For Omni completion
- * allow the word to be deleted, we won't match everything. */
+ // Stop completion when the whole word was deleted. For Omni completion
+ // allow the word to be deleted, we won't match everything.
+ // Respect the 'backspace' option.
if ((int)(p - line) - (int)compl_col < 0
|| ((int)(p - line) - (int)compl_col == 0
- && ctrl_x_mode != CTRL_X_OMNI) || ctrl_x_mode == CTRL_X_EVAL) {
+ && ctrl_x_mode != CTRL_X_OMNI) || ctrl_x_mode == CTRL_X_EVAL
+ || (!can_bs(BS_START) && (int)(p - line) - (int)compl_col
+ - compl_length < 0)) {
return K_BS;
}
@@ -2999,10 +3096,13 @@ static void ins_compl_addleader(int c)
{
int cc;
- if (has_mbyte && (cc = (*mb_char2len)(c)) > 1) {
+ if (stop_arrow() == FAIL) {
+ return;
+ }
+ if ((cc = utf_char2len(c)) > 1) {
char_u buf[MB_MAXBYTES + 1];
- (*mb_char2bytes)(c, buf);
+ utf_char2bytes(c, buf);
buf[cc] = NUL;
ins_char_bytes(buf, cc);
} else {
@@ -3041,10 +3141,16 @@ static void ins_compl_restart(void)
*/
static void ins_compl_set_original_text(char_u *str)
{
- /* Replace the original text entry. */
- if (compl_first_match->cp_flags & ORIGINAL_TEXT) { /* safety check */
+ // Replace the original text entry.
+ // The ORIGINAL_TEXT flag is either at the first item or might possibly be
+ // at the last item for backward completion
+ if (compl_first_match->cp_flags & ORIGINAL_TEXT) { // safety check
xfree(compl_first_match->cp_str);
compl_first_match->cp_str = vim_strsave(str);
+ } else if (compl_first_match->cp_prev != NULL
+ && (compl_first_match->cp_prev->cp_flags & ORIGINAL_TEXT)) {
+ xfree(compl_first_match->cp_prev->cp_str);
+ compl_first_match->cp_prev->cp_str = vim_strsave(str);
}
}
@@ -3104,7 +3210,7 @@ static bool ins_compl_prep(int c)
/* Ignore end of Select mode mapping and mouse scroll buttons. */
if (c == K_SELECT || c == K_MOUSEDOWN || c == K_MOUSEUP
|| c == K_MOUSELEFT || c == K_MOUSERIGHT || c == K_EVENT
- || c == K_FOCUSGAINED || c == K_FOCUSLOST) {
+ || c == K_COMMAND) {
return retval;
}
@@ -3187,7 +3293,7 @@ static bool ins_compl_prep(int c)
compl_cont_status |= CONT_LOCAL;
else if (compl_cont_mode != 0)
compl_cont_status &= ~CONT_LOCAL;
- /* FALLTHROUGH */
+ FALLTHROUGH;
default:
/* If we have typed at least 2 ^X's... for modes != 0, we set
* compl_cont_status = 0 (eg, as if we had just started ^X
@@ -3261,14 +3367,19 @@ static bool ins_compl_prep(int c)
} else {
int prev_col = curwin->w_cursor.col;
- /* put the cursor on the last char, for 'tw' formatting */
- if (prev_col > 0)
+ // put the cursor on the last char, for 'tw' formatting
+ if (prev_col > 0) {
dec_cursor();
- if (stop_arrow() == OK)
+ }
+
+ if (!arrow_used && !ins_need_undo && c != Ctrl_E) {
insertchar(NUL, 0, -1);
+ }
+
if (prev_col > 0
- && get_cursor_line_ptr()[curwin->w_cursor.col] != NUL)
+ && get_cursor_line_ptr()[curwin->w_cursor.col] != NUL) {
inc_cursor();
+ }
}
// If the popup menu is displayed pressing CTRL-Y means accepting
@@ -3280,7 +3391,8 @@ static bool ins_compl_prep(int c)
retval = true;
}
- /* CTRL-E means completion is Ended, go back to the typed text. */
+ // CTRL-E means completion is Ended, go back to the typed text.
+ // but only do this, if the Popup is still visible
if (c == Ctrl_E) {
ins_compl_delete();
if (compl_leader != NULL) {
@@ -3319,12 +3431,12 @@ static bool ins_compl_prep(int c)
do_c_expr_indent();
/* Trigger the CompleteDone event to give scripts a chance to act
* upon the completion. */
- apply_autocmds(EVENT_COMPLETEDONE, NULL, NULL, FALSE, curbuf);
+ ins_apply_autocmds(EVENT_COMPLETEDONE);
}
} else if (ctrl_x_mode == CTRL_X_LOCAL_MSG)
/* Trigger the CompleteDone event to give scripts a chance to act
* upon the (possibly failed) completion. */
- apply_autocmds(EVENT_COMPLETEDONE, NULL, NULL, FALSE, curbuf);
+ ins_apply_autocmds(EVENT_COMPLETEDONE);
/* reset continue_* if we left expansion-mode, if we stay they'll be
* (re)set properly in ins_complete() */
@@ -3355,16 +3467,17 @@ static void ins_compl_fixRedoBufForLeader(char_u *ptr_arg)
}
if (compl_orig_text != NULL) {
p = compl_orig_text;
- for (len = 0; p[len] != NUL && p[len] == ptr[len]; ++len)
- ;
- if (len > 0)
- len -= (*mb_head_off)(p, p + len);
- for (p += len; *p != NUL; mb_ptr_adv(p))
+ for (len = 0; p[len] != NUL && p[len] == ptr[len]; len++) {}
+ if (len > 0) {
+ len -= utf_head_off(p, p + len);
+ }
+ for (p += len; *p != NUL; MB_PTR_ADV(p)) {
AppendCharToRedobuff(K_BS);
- } else
+ }
+ } else {
len = 0;
- if (ptr != NULL)
- AppendToRedobuffLit(ptr + len, -1);
+ }
+ AppendToRedobuffLit(ptr + len, -1);
}
/*
@@ -3414,20 +3527,19 @@ expand_by_function (
{
list_T *matchlist = NULL;
dict_T *matchdict = NULL;
- char_u *args[2];
char_u *funcname;
pos_T pos;
win_T *curwin_save;
buf_T *curbuf_save;
typval_T rettv;
+ const int save_State = State;
funcname = (type == CTRL_X_FUNCTION) ? curbuf->b_p_cfu : curbuf->b_p_ofu;
if (*funcname == NUL)
return;
- /* Call 'completefunc' to obtain the list of matches. */
- args[0] = (char_u *)"0";
- args[1] = base;
+ // Call 'completefunc' to obtain the list of matches.
+ const char_u *const args[2] = { (char_u *)"0", base };
pos = curwin->w_cursor;
curwin_save = curwin;
@@ -3443,8 +3555,8 @@ expand_by_function (
matchdict = rettv.vval.v_dict;
break;
default:
- /* TODO: Give error message? */
- clear_tv(&rettv);
+ // TODO(brammool): Give error message?
+ tv_clear(&rettv);
break;
}
}
@@ -3466,28 +3578,33 @@ expand_by_function (
ins_compl_add_dict(matchdict);
theend:
- if (matchdict != NULL)
- dict_unref(matchdict);
- if (matchlist != NULL)
- list_unref(matchlist);
+ // Restore State, it might have been changed.
+ State = save_State;
+
+ if (matchdict != NULL) {
+ tv_dict_unref(matchdict);
+ }
+ if (matchlist != NULL) {
+ tv_list_unref(matchlist);
+ }
}
/*
* Add completions from a list.
*/
-static void ins_compl_add_list(list_T *list)
+static void ins_compl_add_list(list_T *const list)
{
- listitem_T *li;
int dir = compl_direction;
- /* Go through the List with matches and add each of them. */
- for (li = list->lv_first; li != NULL; li = li->li_next) {
- if (ins_compl_add_tv(&li->li_tv, dir) == OK)
- /* if dir was BACKWARD then honor it just once */
+ // Go through the List with matches and add each of them.
+ TV_LIST_ITER(list, li, {
+ if (ins_compl_add_tv(TV_LIST_ITEM_TV(li), dir) == OK) {
+ // If dir was BACKWARD then honor it just once.
dir = FORWARD;
- else if (did_emsg)
+ } else if (did_emsg) {
break;
- }
+ }
+ });
}
/*
@@ -3498,59 +3615,65 @@ static void ins_compl_add_dict(dict_T *dict)
dictitem_T *di_refresh;
dictitem_T *di_words;
- /* Check for optional "refresh" item. */
- compl_opt_refresh_always = FALSE;
- di_refresh = dict_find(dict, (char_u *)"refresh", 7);
+ // Check for optional "refresh" item.
+ compl_opt_refresh_always = false;
+ di_refresh = tv_dict_find(dict, S_LEN("refresh"));
if (di_refresh != NULL && di_refresh->di_tv.v_type == VAR_STRING) {
- char_u *v = di_refresh->di_tv.vval.v_string;
+ const char *v = (const char *)di_refresh->di_tv.vval.v_string;
- if (v != NULL && STRCMP(v, (char_u *)"always") == 0)
- compl_opt_refresh_always = TRUE;
+ if (v != NULL && strcmp(v, "always") == 0) {
+ compl_opt_refresh_always = true;
+ }
}
- /* Add completions from a "words" list. */
- di_words = dict_find(dict, (char_u *)"words", 5);
- if (di_words != NULL && di_words->di_tv.v_type == VAR_LIST)
+ // Add completions from a "words" list.
+ di_words = tv_dict_find(dict, S_LEN("words"));
+ if (di_words != NULL && di_words->di_tv.v_type == VAR_LIST) {
ins_compl_add_list(di_words->di_tv.vval.v_list);
+ }
}
-/*
- * Add a match to the list of matches from a typeval_T.
- * If the given string is already in the list of completions, then return
- * NOTDONE, otherwise add it to the list and return OK. If there is an error
- * then FAIL is returned.
- */
-int ins_compl_add_tv(typval_T *tv, int dir)
-{
- char_u *word;
- int icase = FALSE;
- int adup = FALSE;
- int aempty = FALSE;
- char_u *(cptext[CPT_COUNT]);
+/// Add a match to the list of matches from VimL object
+///
+/// @param[in] tv Object to get matches from.
+/// @param[in] dir Completion direction.
+///
+/// @return NOTDONE if the given string is already in the list of completions,
+/// otherwise it is added to the list and OK is returned. FAIL will be
+/// returned in case of error.
+int ins_compl_add_tv(typval_T *const tv, const Direction dir)
+ FUNC_ATTR_NONNULL_ALL
+{
+ const char *word;
+ bool icase = false;
+ bool adup = false;
+ bool aempty = false;
+ char *(cptext[CPT_COUNT]);
if (tv->v_type == VAR_DICT && tv->vval.v_dict != NULL) {
- word = get_dict_string(tv->vval.v_dict, (char_u *)"word", FALSE);
- cptext[CPT_ABBR] = get_dict_string(tv->vval.v_dict,
- (char_u *)"abbr", FALSE);
- cptext[CPT_MENU] = get_dict_string(tv->vval.v_dict,
- (char_u *)"menu", FALSE);
- cptext[CPT_KIND] = get_dict_string(tv->vval.v_dict,
- (char_u *)"kind", FALSE);
- cptext[CPT_INFO] = get_dict_string(tv->vval.v_dict,
- (char_u *)"info", FALSE);
- if (get_dict_string(tv->vval.v_dict, (char_u *)"icase", FALSE) != NULL)
- icase = get_dict_number(tv->vval.v_dict, (char_u *)"icase");
- if (get_dict_string(tv->vval.v_dict, (char_u *)"dup", FALSE) != NULL)
- adup = get_dict_number(tv->vval.v_dict, (char_u *)"dup");
- if (get_dict_string(tv->vval.v_dict, (char_u *)"empty", FALSE) != NULL)
- aempty = get_dict_number(tv->vval.v_dict, (char_u *)"empty");
+ word = tv_dict_get_string(tv->vval.v_dict, "word", false);
+ cptext[CPT_ABBR] = tv_dict_get_string(tv->vval.v_dict, "abbr", true);
+ cptext[CPT_MENU] = tv_dict_get_string(tv->vval.v_dict, "menu", true);
+ cptext[CPT_KIND] = tv_dict_get_string(tv->vval.v_dict, "kind", true);
+ cptext[CPT_INFO] = tv_dict_get_string(tv->vval.v_dict, "info", true);
+ cptext[CPT_USER_DATA] = tv_dict_get_string(tv->vval.v_dict,
+ "user_data", true);
+
+ icase = (bool)tv_dict_get_number(tv->vval.v_dict, "icase");
+ adup = (bool)tv_dict_get_number(tv->vval.v_dict, "dup");
+ aempty = (bool)tv_dict_get_number(tv->vval.v_dict, "empty");
} else {
- word = get_tv_string_chk(tv);
+ word = (const char *)tv_get_string_chk(tv);
memset(cptext, 0, sizeof(cptext));
}
- if (word == NULL || (!aempty && *word == NUL))
+ if (word == NULL || (!aempty && *word == NUL)) {
+ for (size_t i = 0; i < CPT_COUNT; i++) {
+ xfree(cptext[i]);
+ }
return FAIL;
- return ins_compl_add(word, -1, icase, NULL, cptext, dir, 0, adup);
+ }
+ return ins_compl_add((char_u *)word, -1, icase, NULL,
+ (char_u **)cptext, true, dir, 0, adup);
}
/*
@@ -3584,7 +3707,6 @@ static int ins_compl_get_exp(pos_T *ini)
char_u *ptr;
char_u *dict = NULL;
int dict_f = 0;
- compl_T *old_match;
int set_match_pos;
int l_ctrl_x_mode = ctrl_x_mode;
@@ -3599,7 +3721,7 @@ static int ins_compl_get_exp(pos_T *ini)
last_match_pos = first_match_pos = *ini;
}
- old_match = compl_curr_match; /* remember the last current match */
+ compl_old_match = compl_curr_match; // remember the last current match
pos = (compl_direction == FORWARD) ? &last_match_pos : &first_match_pos;
/* For ^N/^P loop over all the flags/windows/buffers in 'complete' */
for (;; ) {
@@ -3619,9 +3741,15 @@ static int ins_compl_get_exp(pos_T *ini)
if (*e_cpt == '.' && !curbuf->b_scanned) {
ins_buf = curbuf;
first_match_pos = *ini;
- /* So that ^N can match word immediately after cursor */
- if (l_ctrl_x_mode == 0)
- dec(&first_match_pos);
+ // Move the cursor back one character so that ^N can match the
+ // word immediately after the cursor.
+ if (ctrl_x_mode == 0 && dec(&first_match_pos) < 0) {
+ // Move the cursor to after the last character in the
+ // buffer, so that word at start of buffer is found
+ // correctly.
+ first_match_pos.lnum = ins_buf->b_ml.ml_line_count;
+ first_match_pos.col = (colnr_T)STRLEN(ml_get(first_match_pos.lnum));
+ }
last_match_pos = first_match_pos;
type = 0;
@@ -3647,15 +3775,15 @@ static int ins_compl_get_exp(pos_T *ini)
dict_f = DICT_EXACT;
}
vim_snprintf((char *)IObuff, IOSIZE, _("Scanning: %s"),
- ins_buf->b_fname == NULL
- ? buf_spname(ins_buf)
- : ins_buf->b_sfname == NULL
- ? ins_buf->b_fname
- : ins_buf->b_sfname);
- (void)msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R));
- } else if (*e_cpt == NUL)
+ ins_buf->b_fname == NULL
+ ? buf_spname(ins_buf)
+ : ins_buf->b_sfname == NULL
+ ? ins_buf->b_fname
+ : ins_buf->b_sfname);
+ (void)msg_trunc_attr(IObuff, true, HL_ATTR(HLF_R));
+ } else if (*e_cpt == NUL) {
break;
- else {
+ } else {
if (CTRL_X_MODE_LINE_OR_EVAL(l_ctrl_x_mode)) {
type = -1;
} else if (*e_cpt == 'k' || *e_cpt == 's') {
@@ -3674,9 +3802,10 @@ static int ins_compl_get_exp(pos_T *ini)
else if (*e_cpt == ']' || *e_cpt == 't') {
type = CTRL_X_TAGS;
vim_snprintf((char *)IObuff, IOSIZE, _("Scanning tags."));
- (void)msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R));
- } else
+ (void)msg_trunc_attr(IObuff, true, HL_ATTR(HLF_R));
+ } else {
type = -1;
+ }
/* in any case e_cpt is advanced to the next entry */
(void)copy_option_part(&e_cpt, IObuff, IOSIZE, ",");
@@ -3687,6 +3816,12 @@ static int ins_compl_get_exp(pos_T *ini)
}
}
+ // If complete() was called then compl_pattern has been reset.
+ // The following won't work then, bail out.
+ if (compl_pattern == NULL) {
+ break;
+ }
+
switch (type) {
case -1:
break;
@@ -3846,13 +3981,11 @@ static int ins_compl_get_exp(pos_T *ini)
if ((compl_cont_status & CONT_ADDING)
&& len == compl_length) {
if (pos->lnum < ins_buf->b_ml.ml_line_count) {
- /* Try next line, if any. the new word will be
- * "join" as if the normal command "J" was used.
- * IOSIZE is always greater than
- * compl_length, so the next STRNCPY always
- * works -- Acevedo */
+ // Try next line, if any. the new word will be "join" as if the
+ // normal command "J" was used. IOSIZE is always greater than
+ // compl_length, so the next STRNCPY always works -- Acevedo
STRNCPY(IObuff, ptr, len);
- ptr = ml_get_buf(ins_buf, pos->lnum + 1, FALSE);
+ ptr = ml_get_buf(ins_buf, pos->lnum + 1, false);
tmp_ptr = ptr = skipwhite(ptr);
/* Find start of next word. */
tmp_ptr = find_word_start(tmp_ptr);
@@ -3895,10 +4028,11 @@ static int ins_compl_get_exp(pos_T *ini)
p_ws = save_p_ws;
}
- /* check if compl_curr_match has changed, (e.g. other type of
- * expansion added something) */
- if (type != 0 && compl_curr_match != old_match)
+ // check if compl_curr_match has changed, (e.g. other type of
+ // expansion added something)
+ if (type != 0 && compl_curr_match != compl_old_match) {
found_new_match = OK;
+ }
/* break the loop for specialized modes (use 'complete' just for the
* generic l_ctrl_x_mode == 0) or when we've found a new match */
@@ -3908,7 +4042,7 @@ static int ins_compl_get_exp(pos_T *ini)
break;
/* Fill the popup menu as soon as possible. */
if (type != -1)
- ins_compl_check_keys(0);
+ ins_compl_check_keys(0, false);
if ((l_ctrl_x_mode != 0 && !CTRL_X_MODE_LINE_OR_EVAL(l_ctrl_x_mode))
|| compl_interrupted) {
@@ -3938,36 +4072,45 @@ static int ins_compl_get_exp(pos_T *ini)
i = ins_compl_make_cyclic();
}
- /* If several matches were added (FORWARD) or the search failed and has
- * just been made cyclic then we have to move compl_curr_match to the next
- * or previous entry (if any) -- Acevedo */
- compl_curr_match = compl_direction == FORWARD ? old_match->cp_next
- : old_match->cp_prev;
- if (compl_curr_match == NULL)
- compl_curr_match = old_match;
+ if (compl_old_match != NULL) {
+ // If several matches were added (FORWARD) or the search failed and has
+ // just been made cyclic then we have to move compl_curr_match to the
+ // next or previous entry (if any) -- Acevedo
+ compl_curr_match = compl_direction == FORWARD
+ ? compl_old_match->cp_next
+ : compl_old_match->cp_prev;
+ if (compl_curr_match == NULL) {
+ compl_curr_match = compl_old_match;
+ }
+ }
return i;
}
/* Delete the old text being completed. */
static void ins_compl_delete(void)
{
- int i;
+ int col;
- /*
- * In insert mode: Delete the typed part.
- * In replace mode: Put the old characters back, if any.
- */
- i = compl_col + (compl_cont_status & CONT_ADDING ? compl_length : 0);
- backspace_until_column(i);
- // TODO: is this sufficient for redrawing? Redrawing everything causes
- // flicker, thus we can't do that.
+ // In insert mode: Delete the typed part.
+ // In replace mode: Put the old characters back, if any.
+ col = compl_col + (compl_cont_status & CONT_ADDING ? compl_length : 0);
+ if ((int)curwin->w_cursor.col > col) {
+ if (stop_arrow() == FAIL) {
+ return;
+ }
+ backspace_until_column(col);
+ }
+
+ // TODO(vim): is this sufficient for redrawing? Redrawing everything
+ // causes flicker, thus we can't do that.
changed_cline_bef_curs();
// clear v:completed_item
- set_vim_var_dict(VV_COMPLETED_ITEM, dict_alloc());
+ set_vim_var_dict(VV_COMPLETED_ITEM, tv_dict_alloc());
}
-/* Insert the new text being completed. */
-static void ins_compl_insert(void)
+// Insert the new text being completed.
+// "in_compl_func" is TRUE when called from complete_check().
+static void ins_compl_insert(int in_compl_func)
{
ins_bytes(compl_shown_match->cp_str + ins_compl_len());
if (compl_shown_match->cp_flags & ORIGINAL_TEXT)
@@ -3977,18 +4120,29 @@ static void ins_compl_insert(void)
// Set completed item.
// { word, abbr, menu, kind, info }
- dict_T *dict = dict_alloc();
- dict_add_nr_str(dict, "word", 0L,
- EMPTY_IF_NULL(compl_shown_match->cp_str));
- dict_add_nr_str(dict, "abbr", 0L,
- EMPTY_IF_NULL(compl_shown_match->cp_text[CPT_ABBR]));
- dict_add_nr_str(dict, "menu", 0L,
- EMPTY_IF_NULL(compl_shown_match->cp_text[CPT_MENU]));
- dict_add_nr_str(dict, "kind", 0L,
- EMPTY_IF_NULL(compl_shown_match->cp_text[CPT_KIND]));
- dict_add_nr_str(dict, "info", 0L,
- EMPTY_IF_NULL(compl_shown_match->cp_text[CPT_INFO]));
+ dict_T *dict = tv_dict_alloc();
+ tv_dict_add_str(
+ dict, S_LEN("word"),
+ (const char *)EMPTY_IF_NULL(compl_shown_match->cp_str));
+ tv_dict_add_str(
+ dict, S_LEN("abbr"),
+ (const char *)EMPTY_IF_NULL(compl_shown_match->cp_text[CPT_ABBR]));
+ tv_dict_add_str(
+ dict, S_LEN("menu"),
+ (const char *)EMPTY_IF_NULL(compl_shown_match->cp_text[CPT_MENU]));
+ tv_dict_add_str(
+ dict, S_LEN("kind"),
+ (const char *)EMPTY_IF_NULL(compl_shown_match->cp_text[CPT_KIND]));
+ tv_dict_add_str(
+ dict, S_LEN("info"),
+ (const char *)EMPTY_IF_NULL(compl_shown_match->cp_text[CPT_INFO]));
+ tv_dict_add_str(
+ dict, S_LEN("user_data"),
+ (const char *)EMPTY_IF_NULL(compl_shown_match->cp_text[CPT_USER_DATA]));
set_vim_var_dict(VV_COMPLETED_ITEM, dict);
+ if (!in_compl_func) {
+ compl_curr_match = compl_shown_match;
+ }
}
/*
@@ -4010,13 +4164,13 @@ static void ins_compl_insert(void)
static int
ins_compl_next (
int allow_get_expansion,
- int count, /* repeat completion this many times; should
- be at least 1 */
- int insert_match /* Insert the newly selected match */
+ int count, // Repeat completion this many times; should
+ // be at least 1
+ int insert_match, // Insert the newly selected match
+ int in_compl_func // Called from complete_check()
)
{
int num_matches = -1;
- int i;
int todo = count;
compl_T *found_compl = NULL;
int found_end = FALSE;
@@ -4142,7 +4296,7 @@ ins_compl_next (
compl_used_match = FALSE;
} else if (insert_match) {
if (!compl_get_longest || compl_used_match) {
- ins_compl_insert();
+ ins_compl_insert(in_compl_func);
} else {
ins_bytes(compl_leader + ins_compl_len());
}
@@ -4178,28 +4332,51 @@ ins_compl_next (
* Truncate the file name to avoid a wait for return.
*/
if (compl_shown_match->cp_fname != NULL) {
- STRCPY(IObuff, "match in file ");
- i = (vim_strsize(compl_shown_match->cp_fname) + 16) - sc_col;
- if (i <= 0)
- i = 0;
- else
- STRCAT(IObuff, "<");
- STRCAT(IObuff, compl_shown_match->cp_fname + i);
- msg(IObuff);
- redraw_cmdline = FALSE; /* don't overwrite! */
+ char *lead = _("match in file");
+ int space = sc_col - vim_strsize((char_u *)lead) - 2;
+ char_u *s;
+ char_u *e;
+
+ if (space > 0) {
+ // We need the tail that fits. With double-byte encoding going
+ // back from the end is very slow, thus go from the start and keep
+ // the text that fits in "space" between "s" and "e".
+ for (s = e = compl_shown_match->cp_fname; *e != NUL; MB_PTR_ADV(e)) {
+ space -= ptr2cells(e);
+ while (space < 0) {
+ space += ptr2cells(s);
+ MB_PTR_ADV(s);
+ }
+ }
+ vim_snprintf((char *)IObuff, IOSIZE, "%s %s%s", lead,
+ s > compl_shown_match->cp_fname ? "<" : "", s);
+ msg(IObuff);
+ redraw_cmdline = false; // don't overwrite!
+ }
}
return num_matches;
}
-/*
- * Call this while finding completions, to check whether the user has hit a key
- * that should change the currently displayed completion, or exit completion
- * mode. Also, when compl_pending is not zero, show a completion as soon as
- * possible. -- webb
- * "frequency" specifies out of how many calls we actually check.
- */
-void ins_compl_check_keys(int frequency)
+void pum_ext_select_item(int item, bool insert, bool finish)
+{
+ if (!pum_visible() || item < -1 || item >= compl_match_arraysize) {
+ return;
+ }
+ pum_want.active = true;
+ pum_want.item = item;
+ pum_want.insert = insert;
+ pum_want.finish = finish;
+}
+
+// Call this while finding completions, to check whether the user has hit a key
+// that should change the currently displayed completion, or exit completion
+// mode. Also, when compl_pending is not zero, show a completion as soon as
+// possible. -- webb
+// "frequency" specifies out of how many calls we actually check.
+// "in_compl_func" is TRUE when called from complete_check(), don't set
+// compl_curr_match.
+void ins_compl_check_keys(int frequency, int in_compl_func)
{
static int count = 0;
@@ -4222,8 +4399,8 @@ void ins_compl_check_keys(int frequency)
if (vim_is_ctrl_x_key(c) && c != Ctrl_X && c != Ctrl_R) {
c = safe_vgetc(); /* Eat the character */
compl_shows_dir = ins_compl_key2dir(c);
- (void)ins_compl_next(FALSE, ins_compl_key2count(c),
- c != K_UP && c != K_DOWN);
+ (void)ins_compl_next(false, ins_compl_key2count(c),
+ c != K_UP && c != K_DOWN, in_compl_func);
} else {
/* Need to get the character to have KeyTyped set. We'll put it
* back with vungetc() below. But skip K_IGNORE. */
@@ -4242,7 +4419,7 @@ void ins_compl_check_keys(int frequency)
int todo = compl_pending > 0 ? compl_pending : -compl_pending;
compl_pending = 0;
- (void)ins_compl_next(FALSE, todo, TRUE);
+ (void)ins_compl_next(false, todo, true, in_compl_func);
}
}
@@ -4252,6 +4429,9 @@ void ins_compl_check_keys(int frequency)
*/
static int ins_compl_key2dir(int c)
{
+ if (c == K_EVENT || c == K_COMMAND) {
+ return pum_want.item < pum_selected_item ? BACKWARD : FORWARD;
+ }
if (c == Ctrl_P || c == Ctrl_L
|| c == K_PAGEUP || c == K_KPAGEUP
|| c == K_S_UP || c == K_UP) {
@@ -4279,6 +4459,11 @@ static int ins_compl_key2count(int c)
{
int h;
+ if (c == K_EVENT || c == K_COMMAND) {
+ int offset = pum_want.item - pum_selected_item;
+ return abs(offset);
+ }
+
if (ins_compl_pum_key(c) && c != K_UP && c != K_DOWN) {
h = pum_get_height();
if (h > 3)
@@ -4305,6 +4490,9 @@ static bool ins_compl_use_match(int c)
case K_KPAGEUP:
case K_S_UP:
return false;
+ case K_EVENT:
+ case K_COMMAND:
+ return pum_want.active && pum_want.insert;
}
return true;
}
@@ -4321,17 +4509,23 @@ static int ins_complete(int c, bool enable_pum)
colnr_T curs_col; /* cursor column */
int n;
int save_w_wrow;
+ int save_w_leftcol;
+ int insert_match;
+ const bool save_did_ai = did_ai;
compl_direction = ins_compl_key2dir(c);
+ insert_match = ins_compl_use_match(c);
+
if (!compl_started) {
/* First time we hit ^N or ^P (in a row, I mean) */
- did_ai = FALSE;
- did_si = FALSE;
- can_si = FALSE;
- can_si_back = FALSE;
- if (stop_arrow() == FAIL)
+ did_ai = false;
+ did_si = false;
+ can_si = false;
+ can_si_back = false;
+ if (stop_arrow() == FAIL) {
return FAIL;
+ }
line = ml_get(curwin->w_cursor.lnum);
curs_col = curwin->w_cursor.col;
@@ -4357,7 +4551,7 @@ static int ins_complete(int c, bool enable_pum)
* first non_blank in the line, if it is not a wordchar
* include it to get a better pattern, but then we don't
* want the "\\<" prefix, check it bellow */
- compl_col = (colnr_T)(skipwhite(line) - line);
+ compl_col = (colnr_T)getwhitecols(line);
compl_startpos.col = compl_col;
compl_startpos.lnum = curwin->w_cursor.lnum;
compl_cont_status &= ~CONT_SOL; /* clear SOL if present */
@@ -4438,24 +4632,17 @@ static int ins_complete(int c, bool enable_pum)
compl_col += curs_col;
compl_length = 0;
} else {
- /* Search the point of change class of multibyte character
- * or not a word single byte character backward. */
- if (has_mbyte) {
- int base_class;
- int head_off;
-
- startcol -= (*mb_head_off)(line, line + startcol);
- base_class = mb_get_class(line + startcol);
- while (--startcol >= 0) {
- head_off = (*mb_head_off)(line, line + startcol);
- if (base_class != mb_get_class(line + startcol
- - head_off))
- break;
- startcol -= head_off;
+ // Search the point of change class of multibyte character
+ // or not a word single byte character backward.
+ startcol -= utf_head_off(line, line + startcol);
+ int base_class = mb_get_class(line + startcol);
+ while (--startcol >= 0) {
+ int head_off = utf_head_off(line, line + startcol);
+ if (base_class != mb_get_class(line + startcol - head_off)) {
+ break;
}
- } else
- while (--startcol >= 0 && vim_iswordc(line[startcol]))
- ;
+ startcol -= head_off;
+ }
compl_col += ++startcol;
compl_length = (int)curs_col - startcol;
if (compl_length == 1) {
@@ -4476,7 +4663,7 @@ static int ins_complete(int c, bool enable_pum)
}
}
} else if (CTRL_X_MODE_LINE_OR_EVAL(ctrl_x_mode)) {
- compl_col = (colnr_T)(skipwhite(line) - line);
+ compl_col = (colnr_T)getwhitecols(line);
compl_length = (int)curs_col - (int)compl_col;
if (compl_length < 0) /* cursor in indent: empty pattern */
compl_length = 0;
@@ -4489,13 +4676,15 @@ static int ins_complete(int c, bool enable_pum)
if (startcol > 0) {
char_u *p = line + startcol;
- mb_ptr_back(line, p);
- while (p > line && vim_isfilec(PTR2CHAR(p)))
- mb_ptr_back(line, p);
- if (p == line && vim_isfilec(PTR2CHAR(p)))
+ MB_PTR_BACK(line, p);
+ while (p > line && vim_isfilec(PTR2CHAR(p))) {
+ MB_PTR_BACK(line, p);
+ }
+ if (p == line && vim_isfilec(PTR2CHAR(p))) {
startcol = 0;
- else
+ } else {
startcol = (int)(p - line) + 1;
+ }
}
compl_col += startcol;
@@ -4504,14 +4693,15 @@ static int ins_complete(int c, bool enable_pum)
} else if (ctrl_x_mode == CTRL_X_CMDLINE) {
compl_pattern = vim_strnsave(line, curs_col);
set_cmd_context(&compl_xp, compl_pattern,
- (int)STRLEN(compl_pattern), curs_col);
+ (int)STRLEN(compl_pattern), curs_col, false);
if (compl_xp.xp_context == EXPAND_UNSUCCESSFUL
- || compl_xp.xp_context == EXPAND_NOTHING)
- /* No completion possible, use an empty pattern to get a
- * "pattern not found" message. */
+ || compl_xp.xp_context == EXPAND_NOTHING) {
+ // No completion possible, use an empty pattern to get a
+ // "pattern not found" message.
compl_col = curs_col;
- else
+ } else {
compl_col = (int)(compl_xp.xp_pattern - compl_pattern);
+ }
compl_length = curs_col - compl_col;
} else if (ctrl_x_mode == CTRL_X_FUNCTION || ctrl_x_mode ==
CTRL_X_OMNI) {
@@ -4519,12 +4709,12 @@ static int ins_complete(int c, bool enable_pum)
* Call user defined function 'completefunc' with "a:findstart"
* set to 1 to obtain the length of text to use for completion.
*/
- char_u *args[2];
int col;
char_u *funcname;
pos_T pos;
win_T *curwin_save;
buf_T *curbuf_save;
+ const int save_State = State;
/* Call 'completefunc' or 'omnifunc' and get pattern length as a
* string */
@@ -4533,15 +4723,18 @@ static int ins_complete(int c, bool enable_pum)
if (*funcname == NUL) {
EMSG2(_(e_notset), ctrl_x_mode == CTRL_X_FUNCTION
? "completefunc" : "omnifunc");
+ // restore did_ai, so that adding comment leader works
+ did_ai = save_did_ai;
return FAIL;
}
- args[0] = (char_u *)"1";
- args[1] = NULL;
+ const char_u *const args[2] = { (char_u *)"1", NULL };
pos = curwin->w_cursor;
curwin_save = curwin;
curbuf_save = curbuf;
- col = call_func_retnr(funcname, 2, args, FALSE);
+ col = call_func_retnr(funcname, 2, args, false);
+
+ State = save_State;
if (curwin_save != curwin || curbuf_save != curbuf) {
EMSG(_(e_complwin));
return FAIL;
@@ -4602,7 +4795,7 @@ static int ins_complete(int c, bool enable_pum)
line = ml_get(curwin->w_cursor.lnum);
compl_pattern = vim_strnsave(line + compl_col, compl_length);
} else {
- EMSG2(_(e_intern2), "ins_complete()");
+ internal_error("ins_complete()");
return FAIL;
}
@@ -4637,8 +4830,8 @@ static int ins_complete(int c, bool enable_pum)
/* Always add completion for the original text. */
xfree(compl_orig_text);
compl_orig_text = vim_strnsave(line + compl_col, compl_length);
- if (ins_compl_add(compl_orig_text, -1, p_ic, NULL, NULL, 0,
- ORIGINAL_TEXT, FALSE) != OK) {
+ if (ins_compl_add(compl_orig_text, -1, p_ic, NULL, NULL, false, 0,
+ ORIGINAL_TEXT, false) != OK) {
xfree(compl_pattern);
compl_pattern = NULL;
xfree(compl_orig_text);
@@ -4655,6 +4848,8 @@ static int ins_complete(int c, bool enable_pum)
showmode();
edit_submode_extra = NULL;
ui_flush();
+ } else if (insert_match && stop_arrow() == FAIL) {
+ return FAIL;
}
compl_shown_match = compl_curr_match;
@@ -4664,7 +4859,8 @@ static int ins_complete(int c, bool enable_pum)
* Find next match (and following matches).
*/
save_w_wrow = curwin->w_wrow;
- n = ins_compl_next(TRUE, ins_compl_key2count(c), ins_compl_use_match(c));
+ save_w_leftcol = curwin->w_leftcol;
+ n = ins_compl_next(true, ins_compl_key2count(c), insert_match, false);
/* may undisplay the popup menu */
ins_compl_upd_pum();
@@ -4787,9 +4983,9 @@ static int ins_complete(int c, bool enable_pum)
if (!shortmess(SHM_COMPLETIONMENU)) {
if (edit_submode_extra != NULL) {
if (!p_smd) {
- msg_attr(edit_submode_extra,
- edit_submode_highl < HLF_COUNT
- ? hl_attr(edit_submode_highl) : 0);
+ msg_attr((const char *)edit_submode_extra,
+ (edit_submode_highl < HLF_COUNT
+ ? HL_ATTR(edit_submode_highl) : 0));
}
} else {
msg_clr_cmdline(); // necessary for "noshowmode"
@@ -4798,7 +4994,7 @@ static int ins_complete(int c, bool enable_pum)
// Show the popup menu, unless we got interrupted.
if (enable_pum && !compl_interrupted) {
- show_pum(save_w_wrow);
+ show_pum(save_w_wrow, save_w_leftcol);
}
compl_was_interrupted = compl_interrupted;
compl_interrupted = FALSE;
@@ -4824,14 +5020,17 @@ static unsigned quote_meta(char_u *dest, char_u *src, int len)
if (ctrl_x_mode == CTRL_X_DICTIONARY
|| ctrl_x_mode == CTRL_X_THESAURUS)
break;
+ FALLTHROUGH;
case '~':
if (!p_magic) /* quote these only if magic is set */
break;
+ FALLTHROUGH;
case '\\':
if (ctrl_x_mode == CTRL_X_DICTIONARY
|| ctrl_x_mode == CTRL_X_THESAURUS)
break;
- case '^': /* currently it's not needed. */
+ FALLTHROUGH;
+ case '^': // currently it's not needed.
case '$':
m++;
if (dest != NULL)
@@ -4959,13 +5158,11 @@ static void insert_special(int c, int allow_modmask, int ctrlv)
char_u *p;
int len;
- /*
- * Special function key, translate into "<Key>". Up to the last '>' is
- * inserted with ins_str(), so as not to replace characters in replace
- * mode.
- * Only use mod_mask for special keys, to avoid things like <S-Space>,
- * unless 'allow_modmask' is TRUE.
- */
+ // Special function key, translate into "<Key>". Up to the last '>' is
+ // inserted with ins_str(), so as not to replace characters in replace
+ // mode.
+ // Only use mod_mask for special keys, to avoid things like <S-Space>,
+ // unless 'allow_modmask' is TRUE.
if (mod_mask & MOD_MASK_CMD) { // Command-key never produces a normal key.
allow_modmask = true;
}
@@ -5124,10 +5321,10 @@ insertchar (
}
end_comment_pending = NUL;
- did_ai = FALSE;
- did_si = FALSE;
- can_si = FALSE;
- can_si_back = FALSE;
+ did_ai = false;
+ did_si = false;
+ can_si = false;
+ can_si_back = false;
// If there's any pending input, grab up to INPUT_BUFLEN at once.
// This speeds up normal text input considerably.
@@ -5150,28 +5347,27 @@ insertchar (
buf[0] = c;
i = 1;
- if (textwidth > 0)
+ if (textwidth > 0) {
virtcol = get_nolist_virtcol();
- /*
- * Stop the string when:
- * - no more chars available
- * - finding a special character (command key)
- * - buffer is full
- * - running into the 'textwidth' boundary
- * - need to check for abbreviation: A non-word char after a word-char
- */
- while ( (c = vpeekc()) != NUL
- && !ISSPECIAL(c)
- && (!has_mbyte || MB_BYTE2LEN_CHECK(c) == 1)
- && i < INPUT_BUFLEN
- && (textwidth == 0
- || (virtcol += byte2cells(buf[i - 1])) < (colnr_T)textwidth)
- && !(!no_abbr && !vim_iswordc(c) && vim_iswordc(buf[i - 1]))) {
+ }
+ // Stop the string when:
+ // - no more chars available
+ // - finding a special character (command key)
+ // - buffer is full
+ // - running into the 'textwidth' boundary
+ // - need to check for abbreviation: A non-word char after a word-char
+ while ((c = vpeekc()) != NUL
+ && !ISSPECIAL(c)
+ && MB_BYTE2LEN(c) == 1
+ && i < INPUT_BUFLEN
+ && !(p_fkmap && KeyTyped) // Farsi mode mapping moves cursor
+ && (textwidth == 0
+ || (virtcol += byte2cells(buf[i - 1])) < (colnr_T)textwidth)
+ && !(!no_abbr && !vim_iswordc(c) && vim_iswordc(buf[i - 1]))) {
c = vgetc();
- if (p_hkmap && KeyTyped)
- c = hkmap(c); /* Hebrew mode mapping */
- if (p_fkmap && KeyTyped)
- c = fkmap(c); /* Farsi mode mapping */
+ if (p_hkmap && KeyTyped) {
+ c = hkmap(c); // Hebrew mode mapping
+ }
buf[i++] = c;
}
@@ -5189,10 +5385,10 @@ insertchar (
} else {
int cc;
- if (has_mbyte && (cc = (*mb_char2len)(c)) > 1) {
+ if ((cc = utf_char2len(c)) > 1) {
char_u buf[MB_MAXBYTES + 1];
- (*mb_char2bytes)(c, buf);
+ utf_char2bytes(c, buf);
buf[cc] = NUL;
ins_char_bytes(buf, cc);
AppendCharToRedobuff(c);
@@ -5223,7 +5419,7 @@ internal_format (
{
int cc;
int save_char = NUL;
- int haveto_redraw = FALSE;
+ bool haveto_redraw = false;
int fo_ins_blank = has_format_option(FO_INS_BLANK);
int fo_multibyte = has_format_option(FO_MBYTE_BREAK);
int fo_white_par = has_format_option(FO_WHITE_PAR);
@@ -5511,13 +5707,13 @@ internal_format (
curwin->w_cursor.col = len;
}
- haveto_redraw = TRUE;
- can_cindent = TRUE;
- /* moved the cursor, don't autoindent or cindent now */
- did_ai = FALSE;
- did_si = FALSE;
- can_si = FALSE;
- can_si_back = FALSE;
+ haveto_redraw = true;
+ can_cindent = true;
+ // moved the cursor, don't autoindent or cindent now
+ did_ai = false;
+ did_si = false;
+ can_si = false;
+ can_si_back = false;
line_breakcheck();
}
@@ -5558,8 +5754,8 @@ auto_format (
pos = curwin->w_cursor;
old = get_cursor_line_ptr();
- /* may remove added space */
- check_auto_format(FALSE);
+ // may remove added space
+ check_auto_format(false);
/* Don't format in Insert mode when the cursor is on a trailing blank, the
* user might insert normal text next. Also skip formatting when "1" is
@@ -5625,12 +5821,13 @@ auto_format (
pnew = vim_strnsave(new, len + 2);
pnew[len] = ' ';
pnew[len + 1] = NUL;
- ml_replace(curwin->w_cursor.lnum, pnew, FALSE);
- /* remove the space later */
- did_add_space = TRUE;
- } else
- /* may remove added space */
- check_auto_format(FALSE);
+ ml_replace(curwin->w_cursor.lnum, pnew, false);
+ // remove the space later
+ did_add_space = true;
+ } else {
+ // may remove added space
+ check_auto_format(false);
+ }
}
check_cursor();
@@ -5641,9 +5838,8 @@ auto_format (
* delete it now. The space must be under the cursor, just after the insert
* position.
*/
-static void
-check_auto_format (
- int end_insert /* TRUE when ending Insert mode */
+static void check_auto_format(
+ bool end_insert // true when ending Insert mode
)
{
int c = ' ';
@@ -5651,19 +5847,19 @@ check_auto_format (
if (did_add_space) {
cc = gchar_cursor();
- if (!WHITECHAR(cc))
- /* Somehow the space was removed already. */
- did_add_space = FALSE;
- else {
+ if (!WHITECHAR(cc)) {
+ // Somehow the space was removed already.
+ did_add_space = false;
+ } else {
if (!end_insert) {
inc_cursor();
c = gchar_cursor();
dec_cursor();
}
if (c != NUL) {
- /* The space is no longer at the end of the line, delete it. */
- del_char(FALSE);
- did_add_space = FALSE;
+ // The space is no longer at the end of the line, delete it.
+ del_char(false);
+ did_add_space = false;
}
}
}
@@ -5672,7 +5868,7 @@ check_auto_format (
/*
* Find out textwidth to be used for formatting:
* if 'textwidth' option is set, use it
- * else if 'wrapmargin' option is set, use curwin->w_width - 'wrapmargin'
+ * else if 'wrapmargin' option is set, use curwin->w_grid.Columns-'wrapmargin'
* if invalid value, use 0.
* Set default to window width (maximum 79) for "gq" operator.
*/
@@ -5687,12 +5883,13 @@ comp_textwidth (
if (textwidth == 0 && curbuf->b_p_wm) {
/* The width is the window width minus 'wrapmargin' minus all the
* things that add to the margin. */
- textwidth = curwin->w_width - curbuf->b_p_wm;
- if (cmdwin_type != 0)
+ textwidth = curwin->w_grid.Columns - curbuf->b_p_wm;
+ if (cmdwin_type != 0) {
textwidth -= 1;
+ }
textwidth -= curwin->w_p_fdc;
- if (curwin->w_buffer->b_signlist != NULL) {
+ if (signcolumn_on(curwin)) {
textwidth -= 1;
}
@@ -5702,9 +5899,10 @@ comp_textwidth (
if (textwidth < 0)
textwidth = 0;
if (ff && textwidth == 0) {
- textwidth = curwin->w_width - 1;
- if (textwidth > 79)
+ textwidth = curwin->w_grid.Columns - 1;
+ if (textwidth > 79) {
textwidth = 79;
+ }
}
return textwidth;
}
@@ -5714,15 +5912,16 @@ comp_textwidth (
*/
static void redo_literal(int c)
{
- char_u buf[10];
+ char buf[10];
- /* Only digits need special treatment. Translate them into a string of
- * three digits. */
+ // Only digits need special treatment. Translate them into a string of
+ // three digits.
if (ascii_isdigit(c)) {
- vim_snprintf((char *)buf, sizeof(buf), "%03d", c);
+ vim_snprintf(buf, sizeof(buf), "%03d", c);
AppendToRedobuff(buf);
- } else
+ } else {
AppendCharToRedobuff(c);
+ }
}
// start_arrow() is called when an arrow key is used in insert mode.
@@ -5751,8 +5950,8 @@ static void start_arrow_common(pos_T *end_insert_pos, bool end_change)
{
if (!arrow_used && end_change) { // something has been inserted
AppendToRedobuff(ESC_STR);
- stop_insert(end_insert_pos, FALSE, FALSE);
- arrow_used = TRUE; /* this means we stopped the current insert */
+ stop_insert(end_insert_pos, false, false);
+ arrow_used = true; // This means we stopped the current insert.
}
check_spell_redraw();
}
@@ -5767,7 +5966,7 @@ static void check_spell_redraw(void)
linenr_T lnum = spell_redraw_lnum;
spell_redraw_lnum = 0;
- redrawWinline(lnum, FALSE);
+ redrawWinline(curwin, lnum);
}
}
@@ -5809,7 +6008,7 @@ int stop_arrow(void)
vr_lines_changed = 1;
}
ResetRedobuff();
- AppendToRedobuff((char_u *)"1i"); /* pretend we start an insertion */
+ AppendToRedobuff("1i"); // Pretend we start an insertion.
new_insert_skip = 2;
} else if (ins_need_undo) {
if (u_save_cursor() == OK)
@@ -5887,8 +6086,8 @@ stop_insert (
}
}
- /* If a space was inserted for auto-formatting, remove it now. */
- check_auto_format(TRUE);
+ // If a space was inserted for auto-formatting, remove it now.
+ check_auto_format(true);
/* If we just did an auto-indent, remove the white space from the end
* of the line, and put the cursor back.
@@ -5907,10 +6106,12 @@ stop_insert (
if (gchar_cursor() == NUL && curwin->w_cursor.col > 0)
--curwin->w_cursor.col;
cc = gchar_cursor();
- if (!ascii_iswhite(cc))
+ if (!ascii_iswhite(cc)) {
break;
- if (del_char(TRUE) == FAIL)
- break; /* should not happen */
+ }
+ if (del_char(true) == FAIL) {
+ break; // should not happen
+ }
}
if (curwin->w_cursor.lnum != tpos.lnum)
curwin->w_cursor = tpos;
@@ -5935,10 +6136,10 @@ stop_insert (
}
}
}
- did_ai = FALSE;
- did_si = FALSE;
- can_si = FALSE;
- can_si_back = FALSE;
+ did_ai = false;
+ did_si = false;
+ can_si = false;
+ can_si_back = false;
/* Set '[ and '] to the inserted text. When end_insert_pos is NULL we are
* now in a different buffer. */
@@ -5980,27 +6181,30 @@ void free_last_insert(void)
#endif
-/*
- * Add character "c" to buffer "s". Escape the special meaning of K_SPECIAL
- * and CSI. Handle multi-byte characters.
- * Returns a pointer to after the added bytes.
- */
+/// Add character "c" to buffer "s"
+///
+/// Escapes the special meaning of K_SPECIAL and CSI, handles multi-byte
+/// characters.
+///
+/// @param[in] c Character to add.
+/// @param[out] s Buffer to add to. Must have at least MB_MAXBYTES + 1 bytes.
+///
+/// @return Pointer to after the added bytes.
char_u *add_char2buf(int c, char_u *s)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
{
char_u temp[MB_MAXBYTES + 1];
- int i;
- int len;
-
- len = (*mb_char2bytes)(c, temp);
- for (i = 0; i < len; ++i) {
+ const int len = utf_char2bytes(c, temp);
+ for (int i = 0; i < len; i++) {
c = temp[i];
- /* Need to escape K_SPECIAL and CSI like in the typeahead buffer. */
+ // Need to escape K_SPECIAL and CSI like in the typeahead buffer.
if (c == K_SPECIAL) {
*s++ = K_SPECIAL;
*s++ = KS_SPECIAL;
*s++ = KE_FILLER;
- } else
+ } else {
*s++ = c;
+ }
}
return s;
}
@@ -6049,12 +6253,10 @@ int oneright(void)
/* Adjust for multi-wide char (excluding TAB) */
ptr = get_cursor_pos_ptr();
- coladvance(getviscol() + ((*ptr != TAB && vim_isprintc(
- (*mb_ptr2char)(ptr)
- ))
- ? ptr2cells(ptr) : 1));
- curwin->w_set_curswant = TRUE;
- /* Return OK if the cursor moved, FAIL otherwise (at window edge). */
+ coladvance(getviscol() + ((*ptr != TAB && vim_isprintc(utf_ptr2char(ptr))) ?
+ ptr2cells(ptr) : 1));
+ curwin->w_set_curswant = true;
+ // Return OK if the cursor moved, FAIL otherwise (at window edge).
return (prevpos.col != curwin->w_cursor.col
|| prevpos.coladd != curwin->w_cursor.coladd) ? OK : FAIL;
}
@@ -6109,10 +6311,10 @@ int oneleft(void)
/* Adjust for multi-wide char (not a TAB) */
ptr = get_cursor_pos_ptr();
- if (*ptr != TAB && vim_isprintc(
- (*mb_ptr2char)(ptr)
- ) && ptr2cells(ptr) > 1)
+ if (*ptr != TAB && vim_isprintc(utf_ptr2char(ptr))
+ && ptr2cells(ptr) > 1) {
curwin->w_cursor.coladd = 0;
+ }
}
curwin->w_set_curswant = TRUE;
@@ -6259,8 +6461,10 @@ stuff_inserted (
/* may want to stuff the command character, to start Insert mode */
if (c != NUL)
stuffcharReadbuff(c);
- if ((esc_ptr = (char_u *)vim_strrchr(ptr, ESC)) != NULL)
- *esc_ptr = NUL; /* remove the ESC */
+ if ((esc_ptr = STRRCHR(ptr, ESC)) != NULL) {
+ // remove the ESC.
+ *esc_ptr = NUL;
+ }
/* when the last char is either "0" or "^" it will be quoted if no ESC
* comes after it OR if it will inserted more than once and "ptr"
@@ -6274,12 +6478,13 @@ stuff_inserted (
}
do {
- stuffReadbuff(ptr);
- /* a trailing "0" is inserted as "<C-V>048", "^" as "<C-V>^" */
- if (last)
- stuffReadbuff((char_u *)(last == '0'
- ? "\026\060\064\070"
- : "\026^"));
+ stuffReadbuff((const char *)ptr);
+ // A trailing "0" is inserted as "<C-V>048", "^" as "<C-V>^".
+ if (last) {
+ stuffReadbuff((last == '0'
+ ? "\026\060\064\070"
+ : "\026^"));
+ }
} while (--count > 0);
if (last)
@@ -6560,8 +6765,8 @@ static void replace_do_bs(int limit_col)
* text aligned. */
curwin->w_cursor.col += ins_len;
while (vcol > orig_vcols && gchar_cursor() == ' ') {
- del_char(FALSE);
- ++orig_vcols;
+ del_char(false);
+ orig_vcols++;
}
curwin->w_cursor.col -= ins_len;
}
@@ -6757,7 +6962,7 @@ bool in_cinkeys(int keytyped, int when, bool line_is_empty)
p = look + STRLEN(look);
if ((try_match || try_match_word)
&& curwin->w_cursor.col >= (colnr_T)(p - look)) {
- int match = FALSE;
+ bool match = false;
if (keytyped == KEY_COMPLETE) {
char_u *s;
@@ -6782,29 +6987,30 @@ bool in_cinkeys(int keytyped, int when, bool line_is_empty)
&& (icase
? mb_strnicmp(s, look, (size_t)(p - look))
: STRNCMP(s, look, p - look)) == 0)
- match = TRUE;
- } else
- /* TODO: multi-byte */
- if (keytyped == (int)p[-1] || (icase && keytyped < 256
- && TOLOWER_LOC(keytyped) ==
- TOLOWER_LOC((int)p[-1]))) {
- line = get_cursor_pos_ptr();
- assert(p >= look && (uintmax_t)(p - look) <= SIZE_MAX);
- if ((curwin->w_cursor.col == (colnr_T)(p - look)
- || !vim_iswordc(line[-(p - look) - 1]))
- && (icase
- ? mb_strnicmp(line - (p - look), look, (size_t)(p - look))
- : STRNCMP(line - (p - look), look, p - look))
- == 0)
- match = TRUE;
+ match = true;
+ } else {
+ // TODO(@brammool): multi-byte
+ if (keytyped == (int)p[-1]
+ || (icase && keytyped < 256
+ && TOLOWER_LOC(keytyped) == TOLOWER_LOC((int)p[-1]))) {
+ line = get_cursor_pos_ptr();
+ assert(p >= look && (uintmax_t)(p - look) <= SIZE_MAX);
+ if ((curwin->w_cursor.col == (colnr_T)(p - look)
+ || !vim_iswordc(line[-(p - look) - 1]))
+ && (icase
+ ? mb_strnicmp(line - (p - look), look, (size_t)(p - look))
+ : STRNCMP(line - (p - look), look, p - look)) == 0) {
+ match = true;
+ }
+ }
}
if (match && try_match_word && !try_match) {
/* "0=word": Check if there are only blanks before the
* word. */
- line = get_cursor_line_ptr();
- if ((int)(skipwhite(line) - line) !=
- (int)(curwin->w_cursor.col - (p - look)))
- match = FALSE;
+ if (getwhitecols_curline() !=
+ (int)(curwin->w_cursor.col - (p - look))) {
+ match = false;
+ }
}
if (match) {
return true;
@@ -6817,7 +7023,9 @@ bool in_cinkeys(int keytyped, int when, bool line_is_empty)
if (try_match && *look == keytyped) {
return true;
}
- look++;
+ if (*look != NUL) {
+ look++;
+ }
}
/*
@@ -7023,7 +7231,7 @@ static void ins_ctrl_g(void)
case 'U':
// Allow one left/right cursor movement with the next char,
// without breaking undo.
- dont_sync_undo = MAYBE;
+ dont_sync_undo = kNone;
break;
/* Unknown CTRL-G command, reserved for future expansion. */
@@ -7036,8 +7244,8 @@ static void ins_ctrl_g(void)
*/
static void ins_ctrl_hat(void)
{
- if (map_to_exists_mode((char_u *)"", LANGMAP, FALSE)) {
- /* ":lmap" mappings exists, Toggle use of ":lmap" mappings. */
+ if (map_to_exists_mode("", LANGMAP, false)) {
+ // ":lmap" mappings exists, Toggle use of ":lmap" mappings.
if (State & LANGMAP) {
curbuf->b_p_iminsert = B_IMODE_NONE;
State &= ~LANGMAP;
@@ -7072,13 +7280,12 @@ static bool ins_esc(long *count, int cmdchar, bool nomove)
disabled_redraw = false;
}
if (!arrow_used) {
- /*
- * Don't append the ESC for "r<CR>" and "grx".
- * When 'insertmode' is set only CTRL-L stops Insert mode. Needed for
- * when "count" is non-zero.
- */
- if (cmdchar != 'r' && cmdchar != 'v')
- AppendToRedobuff(p_im ? (char_u *)"\014" : ESC_STR);
+ // Don't append the ESC for "r<CR>" and "grx".
+ // When 'insertmode' is set only CTRL-L stops Insert mode. Needed for
+ // when "count" is non-zero.
+ if (cmdchar != 'r' && cmdchar != 'v') {
+ AppendToRedobuff(p_im ? "\014" : ESC_STR);
+ }
/*
* Repeating insert may take a long time. Check for
@@ -7218,7 +7425,7 @@ static bool ins_start_select(int c)
case K_KPAGEDOWN:
if (!(mod_mask & MOD_MASK_SHIFT))
break;
- // FALLTHROUGH
+ FALLTHROUGH;
case K_S_LEFT:
case K_S_RIGHT:
case K_S_UP:
@@ -7232,7 +7439,8 @@ static bool ins_start_select(int c)
// Execute the key in (insert) Select mode.
stuffcharReadbuff(Ctrl_O);
if (mod_mask) {
- char_u buf[4] = { K_SPECIAL, KS_MODIFIER, mod_mask, NUL };
+ const char buf[] = { (char)K_SPECIAL, (char)KS_MODIFIER,
+ (char)(uint8_t)mod_mask, NUL };
stuffReadbuff(buf);
}
stuffcharReadbuff(c);
@@ -7255,7 +7463,7 @@ static void ins_insert(int replaceState)
set_vim_var_string(VV_INSERTMODE, ((State & REPLACE_FLAG) ? "i" :
replaceState == VREPLACE ? "v" :
"r"), 1);
- apply_autocmds(EVENT_INSERTCHANGE, NULL, NULL, false, curbuf);
+ ins_apply_autocmds(EVENT_INSERTCHANGE);
if (State & REPLACE_FLAG) {
State = INSERT | (State & LANGMAP);
} else {
@@ -7301,46 +7509,55 @@ static void ins_shift(int c, int lastc)
*/
if (c == Ctrl_D && (lastc == '0' || lastc == '^')
&& curwin->w_cursor.col > 0) {
- --curwin->w_cursor.col;
- (void)del_char(FALSE); /* delete the '^' or '0' */
- /* In Replace mode, restore the characters that '^' or '0' replaced. */
- if (State & REPLACE_FLAG)
+ curwin->w_cursor.col--;
+ (void)del_char(false); // delete the '^' or '0'
+ // In Replace mode, restore the characters that '^' or '0' replaced.
+ if (State & REPLACE_FLAG) {
replace_pop_ins();
- if (lastc == '^')
- old_indent = get_indent(); /* remember curr. indent */
+ }
+ if (lastc == '^') {
+ old_indent = get_indent(); // remember curr. indent
+ }
change_indent(INDENT_SET, 0, TRUE, 0, TRUE);
} else
change_indent(c == Ctrl_D ? INDENT_DEC : INDENT_INC, 0, TRUE, 0, TRUE);
- if (did_ai && *skipwhite(get_cursor_line_ptr()) != NUL)
- did_ai = FALSE;
- did_si = FALSE;
- can_si = FALSE;
- can_si_back = FALSE;
- can_cindent = FALSE; /* no cindenting after ^D or ^T */
+ if (did_ai && *skipwhite(get_cursor_line_ptr()) != NUL) {
+ did_ai = false;
+ }
+ did_si = false;
+ can_si = false;
+ can_si_back = false;
+ can_cindent = false; // no cindenting after ^D or ^T
}
static void ins_del(void)
{
- int temp;
-
- if (stop_arrow() == FAIL)
+ if (stop_arrow() == FAIL) {
return;
- if (gchar_cursor() == NUL) { /* delete newline */
- temp = curwin->w_cursor.col;
+ }
+ if (gchar_cursor() == NUL) { // delete newline
+ const int temp = curwin->w_cursor.col;
if (!can_bs(BS_EOL) // only if "eol" included
|| do_join(2, false, true, false, false) == FAIL) {
vim_beep(BO_BS);
} else {
curwin->w_cursor.col = temp;
+ // Adjust orig_line_count in case more lines have been deleted than
+ // have been added. That makes sure, that open_line() later
+ // can access all buffer lines correctly
+ if (State & VREPLACE_FLAG
+ && orig_line_count > curbuf->b_ml.ml_line_count) {
+ orig_line_count = curbuf->b_ml.ml_line_count;
+ }
}
} else if (del_char(false) == FAIL) { // delete char under cursor
vim_beep(BO_BS);
}
- did_ai = FALSE;
- did_si = FALSE;
- can_si = FALSE;
- can_si_back = FALSE;
+ did_ai = false;
+ did_si = false;
+ can_si = false;
+ can_si_back = false;
AppendCharToRedobuff(K_DEL);
}
@@ -7358,8 +7575,9 @@ static void ins_bs_one(colnr_T *vcolp)
if (curwin->w_cursor.lnum != Insstart.lnum
|| curwin->w_cursor.col >= Insstart.col)
replace_do_bs(-1);
- } else
- (void)del_char(FALSE);
+ } else {
+ (void)del_char(false);
+ }
}
/// Handle Backspace, delete-word and delete-line in Insert mode.
@@ -7383,13 +7601,11 @@ static bool ins_bs(int c, int mode, int *inserted_space_p)
int oldState;
int cpc[MAX_MCO]; /* composing characters */
- /*
- * can't delete anything in an empty file
- * can't backup past first character in buffer
- * can't backup past starting point unless 'backspace' > 1
- * can backup to a previous line if 'backspace' == 0
- */
- if (bufempty()
+ // can't delete anything in an empty file
+ // can't backup past first character in buffer
+ // can't backup past starting point unless 'backspace' > 1
+ // can backup to a previous line if 'backspace' == 0
+ if (BUFEMPTY()
|| (!revins_on
&& ((curwin->w_cursor.lnum == 1 && curwin->w_cursor.col == 0)
|| (!can_bs(BS_START)
@@ -7430,9 +7646,7 @@ static bool ins_bs(int c, int mode, int *inserted_space_p)
curwin->w_cursor.coladd = 0;
}
- /*
- * delete newline!
- */
+ // Delete newline!
if (curwin->w_cursor.col == 0) {
lnum = Insstart.lnum;
if (curwin->w_cursor.lnum == lnum || revins_on) {
@@ -7441,7 +7655,7 @@ static bool ins_bs(int c, int mode, int *inserted_space_p)
return false;
}
Insstart.lnum--;
- Insstart.col = MAXCOL;
+ Insstart.col = (colnr_T)STRLEN(ml_get(Insstart.lnum));
}
/*
* In replace mode:
@@ -7511,7 +7725,7 @@ static bool ins_bs(int c, int mode, int *inserted_space_p)
State = oldState;
}
}
- did_ai = FALSE;
+ did_ai = false;
} else {
/*
* Delete character(s) before the cursor.
@@ -7627,16 +7841,16 @@ static bool ins_bs(int c, int mode, int *inserted_space_p)
else {
const bool l_enc_utf8 = enc_utf8;
const int l_p_deco = p_deco;
- if (l_enc_utf8 && l_p_deco)
+ if (l_enc_utf8 && l_p_deco) {
(void)utfc_ptr2char(get_cursor_pos_ptr(), cpc);
- (void)del_char(FALSE);
- /*
- * If there are combining characters and 'delcombine' is set
- * move the cursor back. Don't back up before the base
- * character.
- */
- if (l_enc_utf8 && l_p_deco && cpc[0] != NUL)
+ }
+ (void)del_char(false);
+ // If there are combining characters and 'delcombine' is set
+ // move the cursor back. Don't back up before the base
+ // character.
+ if (l_enc_utf8 && l_p_deco && cpc[0] != NUL) {
inc_cursor();
+ }
if (revins_chars) {
revins_chars--;
revins_legal++;
@@ -7715,7 +7929,7 @@ static void ins_mouse(int c)
curwin = new_curwin;
curbuf = curwin->w_buffer;
}
- can_cindent = TRUE;
+ can_cindent = true;
}
/* redraw status lines (in case another window became active) */
@@ -7724,20 +7938,20 @@ static void ins_mouse(int c)
static void ins_mousescroll(int dir)
{
- pos_T tpos;
- win_T *old_curwin = curwin;
- int did_scroll = FALSE;
-
- tpos = curwin->w_cursor;
+ win_T *const old_curwin = curwin;
+ bool did_scroll = false;
+ pos_T tpos = curwin->w_cursor;
if (mouse_row >= 0 && mouse_col >= 0) {
- int row, col;
+ int row = mouse_row;
+ int col = mouse_col;
- row = mouse_row;
- col = mouse_col;
-
- /* find the window at the pointer coordinates */
- curwin = mouse_find_win(&row, &col);
+ // find the window at the pointer coordinates
+ win_T *const wp = mouse_find_win(&row, &col);
+ if (wp == NULL) {
+ return;
+ }
+ curwin = wp;
curbuf = curwin->w_buffer;
}
if (curwin == old_curwin)
@@ -7756,7 +7970,7 @@ static void ins_mousescroll(int dir)
} else {
mouse_scroll_horiz(dir);
}
- did_scroll = TRUE;
+ did_scroll = true;
}
curwin->w_redr_status = TRUE;
@@ -7774,7 +7988,7 @@ static void ins_mousescroll(int dir)
if (!equalpos(curwin->w_cursor, tpos)) {
start_arrow(&tpos);
- can_cindent = TRUE;
+ can_cindent = true;
}
}
@@ -7807,7 +8021,7 @@ static void ins_left(bool end_change)
} else {
vim_beep(BO_CRSR);
}
- dont_sync_undo = false;
+ dont_sync_undo = kFalse;
}
static void ins_home(int c)
@@ -7892,7 +8106,7 @@ static void ins_right(bool end_change)
} else {
vim_beep(BO_CRSR);
}
- dont_sync_undo = false;
+ dont_sync_undo = kFalse;
}
static void ins_s_right(void)
@@ -8040,11 +8254,11 @@ static bool ins_tab(void)
return true;
}
- did_ai = FALSE;
- did_si = FALSE;
- can_si = FALSE;
- can_si_back = FALSE;
- AppendToRedobuff((char_u *)"\t");
+ did_ai = false;
+ did_si = false;
+ can_si = false;
+ can_si_back = false;
+ AppendToRedobuff("\t");
if (p_sta && ind) { // insert tab in indent, use "shiftwidth"
temp = get_sw_value(curbuf);
@@ -8197,14 +8411,14 @@ static bool ins_tab(void)
/// Handle CR or NL in insert mode.
///
-/// @return true when it can't undo.
+/// @return false when it can't undo.
static bool ins_eol(int c)
{
if (echeck_abbr(c + ABBR_OFF)) {
- return false;
+ return true;
}
if (stop_arrow() == FAIL) {
- return true;
+ return false;
}
undisplay_dollar();
@@ -8242,11 +8456,11 @@ static bool ins_eol(int c)
has_format_option(FO_RET_COMS) ? OPENLINE_DO_COM : 0,
old_indent);
old_indent = 0;
- can_cindent = TRUE;
- /* When inserting a line the cursor line must never be in a closed fold. */
+ can_cindent = true;
+ // When inserting a line the cursor line must never be in a closed fold.
foldOpenCursor();
- return !i;
+ return i;
}
/*
@@ -8271,17 +8485,16 @@ static int ins_digraph(void)
}
- /* don't map the digraph chars. This also prevents the
- * mode message to be deleted when ESC is hit */
- ++no_mapping;
- ++allow_keys;
+ // don't map the digraph chars. This also prevents the
+ // mode message to be deleted when ESC is hit
+ no_mapping++;
c = plain_vgetc();
- --no_mapping;
- --allow_keys;
- if (did_putchar)
- /* when the line fits in 'columns' the '?' is at the start of the next
- * line and will not be removed by the redraw */
+ no_mapping--;
+ if (did_putchar) {
+ // when the line fits in 'columns' the '?' is at the start of the next
+ // line and will not be removed by the redraw
edit_unputchar();
+ }
if (IS_SPECIAL(c) || mod_mask) { /* special key */
clear_showcmd();
@@ -8301,18 +8514,17 @@ static int ins_digraph(void)
}
add_to_showcmd_c(c);
}
- ++no_mapping;
- ++allow_keys;
+ no_mapping++;
cc = plain_vgetc();
- --no_mapping;
- --allow_keys;
- if (did_putchar)
- /* when the line fits in 'columns' the '?' is at the start of the
- * next line and will not be removed by a redraw */
+ no_mapping--;
+ if (did_putchar) {
+ // when the line fits in 'columns' the '?' is at the start of the
+ // next line and will not be removed by a redraw
edit_unputchar();
+ }
if (cc != ESC) {
- AppendToRedobuff((char_u *)CTRL_V_STR);
- c = getdigraph(c, cc, TRUE);
+ AppendToRedobuff(CTRL_V_STR);
+ c = getdigraph(c, cc, true);
clear_showcmd();
return c;
}
@@ -8349,7 +8561,7 @@ int ins_copychar(linenr_T lnum)
if ((colnr_T)temp > curwin->w_virtcol)
ptr = prev_ptr;
- c = (*mb_ptr2char)(ptr);
+ c = utf_ptr2char(ptr);
if (c == NUL) {
vim_beep(BO_COPY);
}
@@ -8374,12 +8586,13 @@ static int ins_ctrl_ey(int tc)
if (c != NUL) {
long tw_save;
- /* The character must be taken literally, insert like it
- * was typed after a CTRL-V, and pretend 'textwidth'
- * wasn't set. Digits, 'o' and 'x' are special after a
- * CTRL-V, don't use it for these. */
- if (c < 256 && !isalnum(c))
- AppendToRedobuff((char_u *)CTRL_V_STR); /* CTRL-V */
+ // The character must be taken literally, insert like it
+ // was typed after a CTRL-V, and pretend 'textwidth'
+ // wasn't set. Digits, 'o' and 'x' are special after a
+ // CTRL-V, don't use it for these.
+ if (c < 256 && !isalnum(c)) {
+ AppendToRedobuff(CTRL_V_STR);
+ }
tw_save = curbuf->b_p_tw;
curbuf->b_p_tw = -1;
insert_special(c, TRUE, FALSE);
@@ -8495,46 +8708,64 @@ static colnr_T get_nolist_virtcol(void)
static char_u *do_insert_char_pre(int c)
{
char buf[MB_MAXBYTES + 1];
+ const int save_State = State;
// Return quickly when there is nothing to do.
if (!has_event(EVENT_INSERTCHARPRE)) {
return NULL;
}
- if (has_mbyte) {
- buf[(*mb_char2bytes)(c, (char_u *) buf)] = NUL;
- } else {
- buf[0] = c;
- buf[1] = NUL;
- }
+ buf[utf_char2bytes(c, (char_u *)buf)] = NUL;
// Lock the text to avoid weird things from happening.
textlock++;
set_vim_var_string(VV_CHAR, buf, -1);
char_u *res = NULL;
- if (apply_autocmds(EVENT_INSERTCHARPRE, NULL, NULL, FALSE, curbuf)) {
- /* Get the value of v:char. It may be empty or more than one
- * character. Only use it when changed, otherwise continue with the
- * original character to avoid breaking autoindent. */
- if (STRCMP(buf, get_vim_var_str(VV_CHAR)) != 0)
+ if (ins_apply_autocmds(EVENT_INSERTCHARPRE)) {
+ // Get the value of v:char. It may be empty or more than one
+ // character. Only use it when changed, otherwise continue with the
+ // original character to avoid breaking autoindent.
+ if (STRCMP(buf, get_vim_var_str(VV_CHAR)) != 0) {
res = vim_strsave(get_vim_var_str(VV_CHAR));
+ }
}
set_vim_var_string(VV_CHAR, NULL, -1);
textlock--;
+ // Restore the State, it may have been changed.
+ State = save_State;
+
return res;
}
-static void show_pum(int save_w_wrow)
+/// Trigger "event" and take care of fixing undo.
+static int ins_apply_autocmds(event_T event)
+{
+ varnumber_T tick = buf_get_changedtick(curbuf);
+ int r;
+
+ r = apply_autocmds(event, NULL, NULL, false, curbuf);
+
+ // If u_savesub() was called then we are not prepared to start
+ // a new line. Call u_save() with no contents to fix that.
+ if (tick != buf_get_changedtick(curbuf)) {
+ u_save(curwin->w_cursor.lnum, (linenr_T)(curwin->w_cursor.lnum + 1));
+ }
+
+ return r;
+}
+
+static void show_pum(int prev_w_wrow, int prev_w_leftcol)
{
// RedrawingDisabled may be set when invoked through complete().
int n = RedrawingDisabled;
RedrawingDisabled = 0;
- // If the cursor moved we need to remove the pum first.
+ // If the cursor moved or the display scrolled we need to remove the pum
+ // first.
setcursor();
- if (save_w_wrow != curwin->w_wrow) {
+ if (prev_w_wrow != curwin->w_wrow || prev_w_leftcol != curwin->w_leftcol) {
ins_compl_del_pum();
}
diff --git a/src/nvim/edit.h b/src/nvim/edit.h
index 0d61f26bcc..433a941295 100644
--- a/src/nvim/edit.h
+++ b/src/nvim/edit.h
@@ -6,11 +6,12 @@
/*
* Array indexes used for cptext argument of ins_compl_add().
*/
-#define CPT_ABBR 0 /* "abbr" */
-#define CPT_MENU 1 /* "menu" */
-#define CPT_KIND 2 /* "kind" */
-#define CPT_INFO 3 /* "info" */
-#define CPT_COUNT 4 /* Number of entries */
+#define CPT_ABBR 0 // "abbr"
+#define CPT_MENU 1 // "menu"
+#define CPT_KIND 2 // "kind"
+#define CPT_INFO 3 // "info"
+#define CPT_USER_DATA 4 // "user data"
+#define CPT_COUNT 5 // Number of entries
typedef int (*IndentGetter)(void);
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 591ed50cfd..4cf8a01ddb 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -1,8 +1,12 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* eval.c: Expression evaluation.
*/
#include <assert.h>
+#include <float.h>
#include <inttypes.h>
#include <stdarg.h>
#include <string.h>
@@ -20,6 +24,7 @@
#endif
#include "nvim/eval.h"
#include "nvim/buffer.h"
+#include "nvim/channel.h"
#include "nvim/charset.h"
#include "nvim/cursor.h"
#include "nvim/diff.h"
@@ -30,6 +35,7 @@
#include "nvim/ex_eval.h"
#include "nvim/ex_getln.h"
#include "nvim/fileio.h"
+#include "nvim/os/fileio.h"
#include "nvim/func_attr.h"
#include "nvim/fold.h"
#include "nvim/getchar.h"
@@ -42,9 +48,9 @@
#include "nvim/mbyte.h"
#include "nvim/memline.h"
#include "nvim/memory.h"
+#include "nvim/menu.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/keymap.h"
#include "nvim/map.h"
#include "nvim/file_search.h"
@@ -63,6 +69,7 @@
#include "nvim/search.h"
#include "nvim/sha256.h"
#include "nvim/spell.h"
+#include "nvim/state.h"
#include "nvim/strings.h"
#include "nvim/syntax.h"
#include "nvim/tag.h"
@@ -90,16 +97,21 @@
#include "nvim/os/dl.h"
#include "nvim/os/input.h"
#include "nvim/event/loop.h"
+#include "nvim/lib/kvec.h"
+#include "nvim/lib/khash.h"
#include "nvim/lib/queue.h"
-#include "nvim/eval/typval_encode.h"
+#include "nvim/lua/executor.h"
+#include "nvim/eval/typval.h"
+#include "nvim/eval/executor.h"
+#include "nvim/eval/gc.h"
+#include "nvim/macros.h"
-#define DICT_MAXNEST 100 /* maximum nesting of lists and dicts */
+// TODO(ZyX-I): Remove DICT_MAXNEST, make users be non-recursive instead
-#define DO_NOT_FREE_CNT 99999 /* refcount for dict or list that should not
- be freed. */
+#define DICT_MAXNEST 100 /* maximum nesting of lists and dicts */
-#define AUTOLOAD_CHAR '#' /* Character used as separator in autoload
- function/variable names. */
+// Character used as separator in autoload function/variable names.
+#define AUTOLOAD_CHAR '#'
/*
* Structure returned by get_lval() and used by set_var_lval().
@@ -129,34 +141,31 @@
* "newkey" is the key for the new item.
*/
typedef struct lval_S {
- char_u *ll_name; /* start of variable name (can be NULL) */
- char_u *ll_exp_name; /* NULL or expanded name in allocated memory. */
- typval_T *ll_tv; /* Typeval of item being used. If "newkey"
- isn't NULL it's the Dict to which to add
- the item. */
- listitem_T *ll_li; /* The list item or NULL. */
- list_T *ll_list; /* The list or NULL. */
- int ll_range; /* TRUE when a [i:j] range was used */
- long ll_n1; /* First index for list */
- long ll_n2; /* Second index for list range */
- int ll_empty2; /* Second index is empty: [i:] */
- dict_T *ll_dict; /* The Dictionary or NULL */
- dictitem_T *ll_di; /* The dictitem or NULL */
- char_u *ll_newkey; /* New key for Dict in alloc. mem or NULL. */
+ const char *ll_name; ///< Start of variable name (can be NULL).
+ size_t ll_name_len; ///< Length of the .ll_name.
+ char *ll_exp_name; ///< NULL or expanded name in allocated memory.
+ typval_T *ll_tv; ///< Typeval of item being used. If "newkey"
+ ///< isn't NULL it's the Dict to which to add the item.
+ listitem_T *ll_li; ///< The list item or NULL.
+ list_T *ll_list; ///< The list or NULL.
+ int ll_range; ///< TRUE when a [i:j] range was used.
+ long ll_n1; ///< First index for list.
+ long ll_n2; ///< Second index for list range.
+ int ll_empty2; ///< Second index is empty: [i:].
+ dict_T *ll_dict; ///< The Dictionary or NULL.
+ dictitem_T *ll_di; ///< The dictitem or NULL.
+ char_u *ll_newkey; ///< New key for Dict in allocated memory or NULL.
} lval_T;
static char *e_letunexp = N_("E18: Unexpected characters in :let");
-static char *e_listidx = N_("E684: list index out of range: %" PRId64);
-static char *e_undefvar = N_("E121: Undefined variable: %s");
static char *e_missbrac = N_("E111: Missing ']'");
static char *e_listarg = N_("E686: Argument of %s must be a List");
static char *e_listdictarg = N_(
"E712: Argument of %s must be a List or Dictionary");
-static char *e_emptykey = N_("E713: Cannot use empty key for Dictionary");
static char *e_listreq = N_("E714: List required");
static char *e_dictreq = N_("E715: Dictionary required");
-static char *e_strreq = N_("E114: String required");
+static char *e_stringreq = N_("E928: String required");
static char *e_toomanyarg = N_("E118: Too many arguments for function: %s");
static char *e_dictkey = N_("E716: Key not present in Dictionary: %s");
static char *e_funcexts = N_(
@@ -164,15 +173,20 @@ static char *e_funcexts = N_(
static char *e_funcdict = N_("E717: Dictionary entry already exists");
static char *e_funcref = N_("E718: Funcref required");
static char *e_dictrange = N_("E719: Cannot use [:] with a Dictionary");
-static char *e_letwrong = N_("E734: Wrong variable type for %s=");
static char *e_nofunc = N_("E130: Unknown function: %s");
static char *e_illvar = N_("E461: Illegal variable name: %s");
-static char *e_float_as_string = N_("E806: using Float as a String");
+static const char *e_readonlyvar = N_(
+ "E46: Cannot change read-only variable \"%.*s\"");
+
+// TODO(ZyX-I): move to eval/executor
+static char *e_letwrong = N_("E734: Wrong variable type for %s=");
-static char_u * const empty_string = (char_u *)"";
static char_u * const namespace_char = (char_u *)"abglstvw";
-static dictitem_T globvars_var; /* variable used for g: */
+/// Variable used for g:
+static ScopeDictDictItem globvars_var;
+
+/// g: value
#define globvarht globvardict.dv_hashtab
/*
@@ -183,12 +197,15 @@ static hashtab_T compat_hashtab;
hashtab_T func_hashtab;
+// Used for checking if local variables or arguments used in a lambda.
+static int *eval_lavars_used = NULL;
+
/*
* Array to hold the hashtab with variables local to each sourced script.
* Each item holds a variable (nameless) that points to the dict_T.
*/
typedef struct {
- dictitem_T sv_var;
+ ScopeDictDictItem sv_var;
dict_T sv_dict;
} scriptvar_T;
@@ -198,59 +215,81 @@ static garray_T ga_scripts = {0, 0, sizeof(scriptvar_T *), 4, NULL};
static int echo_attr = 0; /* attributes used for ":echo" */
-/* Values for trans_function_name() argument: */
-#define TFN_INT 1 /* internal function name OK */
-#define TFN_QUIET 2 /* no error messages */
-#define TFN_NO_AUTOLOAD 4 /* do not use script autoloading */
-
-/* Values for get_lval() flags argument: */
-#define GLV_QUIET TFN_QUIET /* no error messages */
-#define GLV_NO_AUTOLOAD TFN_NO_AUTOLOAD /* do not use script autoloading */
-
-/* function flags */
-#define FC_ABORT 1 /* abort function on error */
-#define FC_RANGE 2 /* function accepts range */
-#define FC_DICT 4 /* Dict function, uses "self" */
-
-/* The names of packages that once were loaded are remembered. */
-static garray_T ga_loaded = {0, 0, sizeof(char_u *), 4, NULL};
-
-/* list heads for garbage collection */
-static dict_T *first_dict = NULL; /* list of all dicts */
-static list_T *first_list = NULL; /* list of all lists */
+/// Describe data to return from find_some_match()
+typedef enum {
+ kSomeMatch, ///< Data for match().
+ kSomeMatchEnd, ///< Data for matchend().
+ kSomeMatchList, ///< Data for matchlist().
+ kSomeMatchStr, ///< Data for matchstr().
+ kSomeMatchStrPos, ///< Data for matchstrpos().
+} SomeMatchType;
+
+/// trans_function_name() flags
+typedef enum {
+ TFN_INT = 1, ///< May use internal function name
+ TFN_QUIET = 2, ///< Do not emit error messages.
+ TFN_NO_AUTOLOAD = 4, ///< Do not use script autoloading.
+ TFN_NO_DEREF = 8, ///< Do not dereference a Funcref.
+ TFN_READ_ONLY = 16, ///< Will not change the variable.
+} TransFunctionNameFlags;
+
+/// get_lval() flags
+typedef enum {
+ GLV_QUIET = TFN_QUIET, ///< Do not emit error messages.
+ GLV_NO_AUTOLOAD = TFN_NO_AUTOLOAD, ///< Do not use script autoloading.
+ GLV_READ_ONLY = TFN_READ_ONLY, ///< Indicates that caller will not change
+ ///< the value (prevents error message).
+} GetLvalFlags;
+
+// function flags
+#define FC_ABORT 0x01 // abort function on error
+#define FC_RANGE 0x02 // function accepts range
+#define FC_DICT 0x04 // Dict function, uses "self"
+#define FC_CLOSURE 0x08 // closure, uses outer scope variables
+#define FC_DELETED 0x10 // :delfunction used while uf_refcount > 0
+#define FC_REMOVED 0x20 // function redefined while uf_refcount > 0
+
+// The names of packages that once were loaded are remembered.
+static garray_T ga_loaded = { 0, 0, sizeof(char_u *), 4, NULL };
#define FUNCARG(fp, j) ((char_u **)(fp->uf_args.ga_data))[j]
#define FUNCLINE(fp, j) ((char_u **)(fp->uf_lines.ga_data))[j]
-#define VAR_SHORT_LEN 20 /* short variable name length */
-#define FIXVAR_CNT 12 /* number of fixed variables */
-
-/* structure to hold info for a function that is currently being executed. */
-typedef struct funccall_S funccall_T;
+/// Short variable name length
+#define VAR_SHORT_LEN 20
+/// Number of fixed variables used for arguments
+#define FIXVAR_CNT 12
struct funccall_S {
- ufunc_T *func; /* function being called */
- int linenr; /* next line to be executed */
- int returned; /* ":return" used */
- struct /* fixed variables for arguments */
- {
- dictitem_T var; /* variable (without room for name) */
- char_u room[VAR_SHORT_LEN]; /* room for the name */
- } fixvar[FIXVAR_CNT];
- dict_T l_vars; /* l: local function variables */
- dictitem_T l_vars_var; /* variable for l: scope */
- dict_T l_avars; /* a: argument variables */
- dictitem_T l_avars_var; /* variable for a: scope */
- list_T l_varlist; /* list for a:000 */
- listitem_T l_listitems[MAX_FUNC_ARGS]; /* listitems for a:000 */
- typval_T *rettv; /* return value */
- linenr_T breakpoint; /* next line with breakpoint or zero */
- int dbg_tick; /* debug_tick when breakpoint was set */
- int level; /* top nesting level of executed function */
- proftime_T prof_child; /* time spent in a child */
- funccall_T *caller; /* calling function or NULL */
+ ufunc_T *func; ///< Function being called.
+ int linenr; ///< Next line to be executed.
+ int returned; ///< ":return" used.
+ /// Fixed variables for arguments.
+ TV_DICTITEM_STRUCT(VAR_SHORT_LEN + 1) fixvar[FIXVAR_CNT];
+ dict_T l_vars; ///< l: local function variables.
+ ScopeDictDictItem l_vars_var; ///< Variable for l: scope.
+ dict_T l_avars; ///< a: argument variables.
+ ScopeDictDictItem l_avars_var; ///< Variable for a: scope.
+ list_T l_varlist; ///< List for a:000.
+ listitem_T l_listitems[MAX_FUNC_ARGS]; ///< List items for a:000.
+ typval_T *rettv; ///< Return value.
+ linenr_T breakpoint; ///< Next line with breakpoint or zero.
+ int dbg_tick; ///< Debug_tick when breakpoint was set.
+ int level; ///< Top nesting level of executed function.
+ proftime_T prof_child; ///< Time spent in a child.
+ funccall_T *caller; ///< Calling function or NULL.
+ int fc_refcount; ///< Number of user functions that reference this funccall.
+ int fc_copyID; ///< CopyID used for garbage collection.
+ garray_T fc_funcs; ///< List of ufunc_T* which keep a reference to "func".
};
+///< Structure used by trans_function_name()
+typedef struct {
+ dict_T *fd_dict; ///< Dictionary used.
+ char_u *fd_newkey; ///< New key in "dict" in allocated memory.
+ dictitem_T *fd_di; ///< Dictionary item used.
+} funcdict_T;
+
/*
* Info used by a ":for" loop.
*/
@@ -262,15 +301,6 @@ typedef struct {
} forinfo_T;
/*
- * Struct used by trans_function_name()
- */
-typedef struct {
- dict_T *fd_dict; /* Dictionary used */
- char_u *fd_newkey; /* new key in "dict" in allocated memory */
- dictitem_T *fd_di; /* Dictionary item used */
-} funcdict_T;
-
-/*
* enum used by var_flavour()
*/
typedef enum {
@@ -290,8 +320,8 @@ typedef enum {
.vv_di = { \
.di_tv = { .v_type = type }, \
.di_flags = 0, \
+ .di_key = { 0 }, \
}, \
- .vv_filler = { 0 }, \
.vv_flags = flags, \
}
@@ -301,9 +331,8 @@ typedef enum {
// variables with the VV_ defines.
static struct vimvar {
char *vv_name; ///< Name of the variable, without v:.
- dictitem_T vv_di; ///< Value of the variable, with name.
- char vv_filler[16]; ///< Space for longest name from below.
- char vv_flags; ///< Flags: #VV_COMPAT, #VV_RO, #VV_RO_SBX.
+ TV_DICTITEM_STRUCT(17) vv_di; ///< Value and name for key (max 16 chars).
+ char vv_flags; ///< Flags: #VV_COMPAT, #VV_RO, #VV_RO_SBX.
} vimvars[] =
{
// VV_ tails differing from upcased string literals:
@@ -312,14 +341,14 @@ static struct vimvar {
// VV_SEND_SERVER "servername"
// VV_REG "register"
// VV_OP "operator"
- VV(VV_COUNT, "count", VAR_NUMBER, VV_COMPAT+VV_RO),
+ VV(VV_COUNT, "count", VAR_NUMBER, VV_RO),
VV(VV_COUNT1, "count1", VAR_NUMBER, VV_RO),
VV(VV_PREVCOUNT, "prevcount", VAR_NUMBER, VV_RO),
- VV(VV_ERRMSG, "errmsg", VAR_STRING, VV_COMPAT),
+ VV(VV_ERRMSG, "errmsg", VAR_STRING, 0),
VV(VV_WARNINGMSG, "warningmsg", VAR_STRING, 0),
VV(VV_STATUSMSG, "statusmsg", VAR_STRING, 0),
- VV(VV_SHELL_ERROR, "shell_error", VAR_NUMBER, VV_COMPAT+VV_RO),
- VV(VV_THIS_SESSION, "this_session", VAR_STRING, VV_COMPAT),
+ VV(VV_SHELL_ERROR, "shell_error", VAR_NUMBER, VV_RO),
+ VV(VV_THIS_SESSION, "this_session", VAR_STRING, 0),
VV(VV_VERSION, "version", VAR_NUMBER, VV_COMPAT+VV_RO),
VV(VV_LNUM, "lnum", VAR_NUMBER, VV_RO_SBX),
VV(VV_TERMRESPONSE, "termresponse", VAR_STRING, VV_RO),
@@ -343,6 +372,7 @@ static struct vimvar {
VV(VV_DYING, "dying", VAR_NUMBER, VV_RO),
VV(VV_EXCEPTION, "exception", VAR_STRING, VV_RO),
VV(VV_THROWPOINT, "throwpoint", VAR_STRING, VV_RO),
+ VV(VV_STDERR, "stderr", VAR_NUMBER, VV_RO),
VV(VV_REG, "register", VAR_STRING, VV_RO),
VV(VV_CMDBANG, "cmdbang", VAR_NUMBER, VV_RO),
VV(VV_INSERTMODE, "insertmode", VAR_STRING, VV_RO),
@@ -353,6 +383,7 @@ static struct vimvar {
VV(VV_FCS_CHOICE, "fcs_choice", VAR_STRING, 0),
VV(VV_BEVAL_BUFNR, "beval_bufnr", VAR_NUMBER, VV_RO),
VV(VV_BEVAL_WINNR, "beval_winnr", VAR_NUMBER, VV_RO),
+ VV(VV_BEVAL_WINID, "beval_winid", VAR_NUMBER, VV_RO),
VV(VV_BEVAL_LNUM, "beval_lnum", VAR_NUMBER, VV_RO),
VV(VV_BEVAL_COL, "beval_col", VAR_NUMBER, VV_RO),
VV(VV_BEVAL_TEXT, "beval_text", VAR_STRING, VV_RO),
@@ -362,6 +393,7 @@ static struct vimvar {
VV(VV_SWAPCOMMAND, "swapcommand", VAR_STRING, VV_RO),
VV(VV_CHAR, "char", VAR_STRING, 0),
VV(VV_MOUSE_WIN, "mouse_win", VAR_NUMBER, 0),
+ VV(VV_MOUSE_WINID, "mouse_winid", VAR_NUMBER, 0),
VV(VV_MOUSE_LNUM, "mouse_lnum", VAR_NUMBER, 0),
VV(VV_MOUSE_COL, "mouse_col", VAR_NUMBER, 0),
VV(VV_OP, "operator", VAR_STRING, VV_RO),
@@ -370,7 +402,6 @@ static struct vimvar {
VV(VV_OLDFILES, "oldfiles", VAR_LIST, 0),
VV(VV_WINDOWID, "windowid", VAR_NUMBER, VV_RO_SBX),
VV(VV_PROGPATH, "progpath", VAR_STRING, VV_RO),
- VV(VV_COMMAND_OUTPUT, "command_output", VAR_STRING, 0),
VV(VV_COMPLETED_ITEM, "completed_item", VAR_DICT, VV_RO),
VV(VV_OPTION_NEW, "option_new", VAR_STRING, VV_RO),
VV(VV_OPTION_OLD, "option_old", VAR_STRING, VV_RO),
@@ -383,6 +414,16 @@ static struct vimvar {
VV(VV_NULL, "null", VAR_SPECIAL, VV_RO),
VV(VV__NULL_LIST, "_null_list", VAR_LIST, VV_RO),
VV(VV__NULL_DICT, "_null_dict", VAR_DICT, VV_RO),
+ VV(VV_VIM_DID_ENTER, "vim_did_enter", VAR_NUMBER, VV_RO),
+ VV(VV_TESTING, "testing", VAR_NUMBER, 0),
+ VV(VV_TYPE_NUMBER, "t_number", VAR_NUMBER, VV_RO),
+ VV(VV_TYPE_STRING, "t_string", VAR_NUMBER, VV_RO),
+ VV(VV_TYPE_FUNC, "t_func", VAR_NUMBER, VV_RO),
+ VV(VV_TYPE_LIST, "t_list", VAR_NUMBER, VV_RO),
+ VV(VV_TYPE_DICT, "t_dict", VAR_NUMBER, VV_RO),
+ VV(VV_TYPE_FLOAT, "t_float", VAR_NUMBER, VV_RO),
+ VV(VV_TYPE_BOOL, "t_bool", VAR_NUMBER, VV_RO),
+ VV(VV_EXITING, "exiting", VAR_NUMBER, VV_RO),
};
#undef VV
@@ -396,50 +437,57 @@ static struct vimvar {
#define vv_dict vv_di.di_tv.vval.v_dict
#define vv_tv vv_di.di_tv
-static dictitem_T vimvars_var; /* variable used for v: */
-#define vimvarht vimvardict.dv_hashtab
-
-typedef struct {
- union {
- LibuvProcess uv;
- PtyProcess pty;
- } proc;
- Stream in, out, err;
- Terminal *term;
- bool stopped;
- bool exited;
- int refcount;
- ufunc_T *on_stdout, *on_stderr, *on_exit;
- dict_T *self;
- int *status_ptr;
- uint64_t id;
- Queue *events;
-} TerminalJobData;
-
-typedef struct dict_watcher {
- ufunc_T *callback;
- char *key_pattern;
- QUEUE node;
- bool busy; // prevent recursion if the dict is changed in the callback
-} DictWatcher;
+/// Variable used for v:
+static ScopeDictDictItem vimvars_var;
-typedef struct {
- TerminalJobData *data;
- ufunc_T *callback;
- const char *type;
- list_T *received;
- int status;
-} JobEvent;
+/// v: hashtab
+#define vimvarht vimvardict.dv_hashtab
typedef struct {
TimeWatcher tw;
int timer_id;
int repeat_count;
+ int refcount;
long timeout;
bool stopped;
- ufunc_T *callback;
+ bool paused;
+ Callback callback;
} timer_T;
+typedef void (*FunPtr)(void);
+
+/// Prototype of C function that implements VimL function
+typedef void (*VimLFunc)(typval_T *args, typval_T *rvar, FunPtr data);
+
+/// Structure holding VimL function definition
+typedef struct fst {
+ char *name; ///< Name of the function.
+ uint8_t min_argc; ///< Minimal number of arguments.
+ uint8_t max_argc; ///< Maximal number of arguments.
+ VimLFunc func; ///< Function implementation.
+ FunPtr data; ///< Userdata for function implementation.
+} VimLFuncDef;
+
+KHASH_MAP_INIT_STR(functions, VimLFuncDef)
+
+/// Type of assert_* check being performed
+typedef enum
+{
+ ASSERT_EQUAL,
+ ASSERT_NOTEQUAL,
+ ASSERT_MATCH,
+ ASSERT_NOTMATCH,
+ ASSERT_INRANGE,
+ ASSERT_OTHER,
+} assert_type_T;
+
+/// Type for dict_list function
+typedef enum {
+ kDictListKeys, ///< List dictionary keys.
+ kDictListValues, ///< List dictionary values.
+ kDictListItems, ///< List dictionary contents: [keys, values].
+} DictListType;
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "eval.c.generated.h"
#endif
@@ -447,12 +495,18 @@ typedef struct {
#define FNE_INCL_BR 1 /* find_name_end(): include [] in name */
#define FNE_CHECK_START 2 /* find_name_end(): check name starts with
valid character */
-static uint64_t current_job_id = 1;
-static PMap(uint64_t) *jobs = NULL;
-static uint64_t last_timer_id = 0;
+static uint64_t last_timer_id = 1;
static PMap(uint64_t) *timers = NULL;
+/// Dummy va_list for passing to vim_snprintf
+///
+/// Used because:
+/// - passing a NULL pointer doesn't work when va_list isn't a pointer
+/// - locally in the function results in a "used before set" warning
+/// - using va_start() to initialize it gives "function with fixed args" error
+static va_list dummy_ap;
+
static const char *const msgpack_type_names[] = {
[kMPNil] = "nil",
[kMPBoolean] = "boolean",
@@ -483,7 +537,6 @@ void eval_init(void)
{
vimvars[VV_VERSION].vv_nr = VIM_VERSION_100;
- jobs = pmap_new(uint64_t)();
timers = pmap_new(uint64_t)();
struct vimvar *p;
@@ -495,6 +548,7 @@ void eval_init(void)
for (size_t i = 0; i < ARRAY_SIZE(vimvars); i++) {
p = &vimvars[i];
+ assert(STRLEN(p->vv_name) <= 16);
STRCPY(p->vv_di.di_key, p->vv_name);
if (p->vv_flags & VV_RO)
p->vv_di.di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
@@ -512,19 +566,19 @@ void eval_init(void)
}
vimvars[VV_VERSION].vv_nr = VIM_VERSION_100;
- dict_T *const msgpack_types_dict = dict_alloc();
+ dict_T *const msgpack_types_dict = tv_dict_alloc();
for (size_t i = 0; i < ARRAY_SIZE(msgpack_type_names); i++) {
- list_T *const type_list = list_alloc();
- type_list->lv_lock = VAR_FIXED;
- type_list->lv_refcount = 1;
- dictitem_T *const di = dictitem_alloc((char_u *) msgpack_type_names[i]);
- di->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
+ list_T *const type_list = tv_list_alloc(0);
+ tv_list_set_lock(type_list, VAR_FIXED);
+ tv_list_ref(type_list);
+ dictitem_T *const di = tv_dict_item_alloc(msgpack_type_names[i]);
+ di->di_flags |= DI_FLAGS_RO|DI_FLAGS_FIX;
di->di_tv = (typval_T) {
.v_type = VAR_LIST,
.vval = { .v_list = type_list, },
};
eval_msgpack_type_lists[i] = type_list;
- if (dict_add(msgpack_types_dict, di) == FAIL) {
+ if (tv_dict_add(msgpack_types_dict, di) == FAIL) {
// There must not be duplicate items in this dictionary by definition.
assert(false);
}
@@ -532,18 +586,28 @@ void eval_init(void)
msgpack_types_dict->dv_lock = VAR_FIXED;
set_vim_var_dict(VV_MSGPACK_TYPES, msgpack_types_dict);
- set_vim_var_dict(VV_COMPLETED_ITEM, dict_alloc());
+ set_vim_var_dict(VV_COMPLETED_ITEM, tv_dict_alloc());
- dict_T *v_event = dict_alloc();
+ dict_T *v_event = tv_dict_alloc();
v_event->dv_lock = VAR_FIXED;
set_vim_var_dict(VV_EVENT, v_event);
- set_vim_var_list(VV_ERRORS, list_alloc());
+ set_vim_var_list(VV_ERRORS, tv_list_alloc(kListLenUnknown));
+ set_vim_var_nr(VV_STDERR, CHAN_STDERR);
set_vim_var_nr(VV_SEARCHFORWARD, 1L);
set_vim_var_nr(VV_HLSEARCH, 1L);
+ set_vim_var_nr(VV_COUNT1, 1);
+ set_vim_var_nr(VV_TYPE_NUMBER, VAR_TYPE_NUMBER);
+ set_vim_var_nr(VV_TYPE_STRING, VAR_TYPE_STRING);
+ set_vim_var_nr(VV_TYPE_FUNC, VAR_TYPE_FUNC);
+ set_vim_var_nr(VV_TYPE_LIST, VAR_TYPE_LIST);
+ set_vim_var_nr(VV_TYPE_DICT, VAR_TYPE_DICT);
+ set_vim_var_nr(VV_TYPE_FLOAT, VAR_TYPE_FLOAT);
+ set_vim_var_nr(VV_TYPE_BOOL, VAR_TYPE_BOOL);
set_vim_var_special(VV_FALSE, kSpecialVarFalse);
set_vim_var_special(VV_TRUE, kSpecialVarTrue);
set_vim_var_special(VV_NULL, kSpecialVarNull);
+ set_vim_var_special(VV_EXITING, kSpecialVarNull);
set_reg_var(0); // default for v:register is not 0 but '"'
}
@@ -559,7 +623,7 @@ void eval_clear(void)
xfree(p->vv_str);
p->vv_str = NULL;
} else if (p->vv_di.di_tv.v_type == VAR_LIST) {
- list_unref(p->vv_list);
+ tv_list_unref(p->vv_list);
p->vv_list = NULL;
}
}
@@ -585,12 +649,11 @@ void eval_clear(void)
xfree(SCRIPT_SV(i));
ga_clear(&ga_scripts);
- /* unreferenced lists and dicts */
- (void)garbage_collect();
+ // unreferenced lists and dicts
+ (void)garbage_collect(false);
- /* functions */
+ // functions
free_all_functions();
- hash_clear(&func_hashtab);
}
#endif
@@ -630,8 +693,8 @@ int func_level(void *cookie)
/* pointer to funccal for currently active function */
funccall_T *current_funccal = NULL;
-/* pointer to list of previously used funccal, still around because some
- * item in it is still being used. */
+// Pointer to list of previously used funccal, still around because some
+// item in it is still being used.
funccall_T *previous_funccal = NULL;
/*
@@ -648,26 +711,25 @@ int current_func_returned(void)
*/
void set_internal_string_var(char_u *name, char_u *value)
{
- char_u *val = vim_strsave(value);
- typval_T *tvp = xcalloc(1, sizeof(typval_T));
+ const typval_T tv = {
+ .v_type = VAR_STRING,
+ .vval.v_string = value,
+ };
- tvp->v_type = VAR_STRING;
- tvp->vval.v_string = val;
- set_var(name, tvp, FALSE);
- free_tv(tvp);
+ set_var((const char *)name, STRLEN(name), (typval_T *)&tv, true);
}
static lval_T *redir_lval = NULL;
-static garray_T redir_ga; /* only valid when redir_lval is not NULL */
-static char_u *redir_endp = NULL;
+static garray_T redir_ga; // Only valid when redir_lval is not NULL.
+static char_u *redir_endp = NULL;
static char_u *redir_varname = NULL;
/*
* Start recording command output to a variable
* Returns OK if successfully completed the setup. FAIL otherwise.
*/
-int
-var_redir_start (
+int
+var_redir_start(
char_u *name,
int append /* append to an existing variable */
)
@@ -690,11 +752,11 @@ var_redir_start (
/* The output is stored in growarray "redir_ga" until redirection ends. */
ga_init(&redir_ga, (int)sizeof(char), 500);
- /* Parse the variable name (can be a dict or list entry). */
- redir_endp = get_lval(redir_varname, NULL, redir_lval, FALSE, FALSE, 0,
- FNE_CHECK_START);
- if (redir_endp == NULL || redir_lval->ll_name == NULL || *redir_endp !=
- NUL) {
+ // Parse the variable name (can be a dict or list entry).
+ redir_endp = (char_u *)get_lval(redir_varname, NULL, redir_lval, false, false,
+ 0, FNE_CHECK_START);
+ if (redir_endp == NULL || redir_lval->ll_name == NULL
+ || *redir_endp != NUL) {
clear_lval(redir_lval);
if (redir_endp != NULL && *redir_endp != NUL)
/* Trailing characters are present after the variable name */
@@ -768,12 +830,13 @@ void var_redir_stop(void)
ga_append(&redir_ga, NUL); /* Append the trailing NUL. */
tv.v_type = VAR_STRING;
tv.vval.v_string = redir_ga.ga_data;
- /* Call get_lval() again, if it's inside a Dict or List it may
- * have changed. */
- redir_endp = get_lval(redir_varname, NULL, redir_lval,
- FALSE, FALSE, 0, FNE_CHECK_START);
- if (redir_endp != NULL && redir_lval->ll_name != NULL)
- set_var_lval(redir_lval, redir_endp, &tv, FALSE, (char_u *)".");
+ // Call get_lval() again, if it's inside a Dict or List it may
+ // have changed.
+ redir_endp = (char_u *)get_lval(redir_varname, NULL, redir_lval,
+ false, false, 0, FNE_CHECK_START);
+ if (redir_endp != NULL && redir_lval->ll_name != NULL) {
+ set_var_lval(redir_lval, redir_endp, &tv, false, (char_u *)".");
+ }
clear_lval(redir_lval);
}
@@ -791,7 +854,7 @@ void var_redir_stop(void)
int eval_charconvert(const char *const enc_from, const char *const enc_to,
const char *const fname_from, const char *const fname_to)
{
- int err = false;
+ bool err = false;
set_vim_var_string(VV_CC_FROM, enc_from, -1);
set_vim_var_string(VV_CC_TO, enc_to, -1);
@@ -813,7 +876,7 @@ int eval_charconvert(const char *const enc_from, const char *const enc_to,
int eval_printexpr(const char *const fname, const char *const args)
{
- int err = false;
+ bool err = false;
set_vim_var_string(VV_FNAME_IN, fname, -1);
set_vim_var_string(VV_CMDARG, args, -1);
@@ -833,7 +896,7 @@ int eval_printexpr(const char *const fname, const char *const args)
void eval_diff(const char *const origfile, const char *const newfile,
const char *const outfile)
{
- int err = FALSE;
+ bool err = false;
set_vim_var_string(VV_FNAME_IN, origfile, -1);
set_vim_var_string(VV_FNAME_NEW, newfile, -1);
@@ -847,7 +910,7 @@ void eval_diff(const char *const origfile, const char *const newfile,
void eval_patch(const char *const origfile, const char *const difffile,
const char *const outfile)
{
- int err;
+ bool err = false;
set_vim_var_string(VV_FNAME_IN, origfile, -1);
set_vim_var_string(VV_FNAME_DIFF, difffile, -1);
@@ -863,59 +926,64 @@ void eval_patch(const char *const origfile, const char *const difffile,
* Sets "error" to TRUE if there was an error.
* Return TRUE or FALSE.
*/
-int
-eval_to_bool (
+int
+eval_to_bool(
char_u *arg,
- int *error,
+ bool *error,
char_u **nextcmd,
int skip /* only parse, don't execute */
)
{
typval_T tv;
- int retval = FALSE;
+ bool retval = false;
- if (skip)
- ++emsg_skip;
- if (eval0(arg, &tv, nextcmd, !skip) == FAIL)
- *error = TRUE;
- else {
- *error = FALSE;
+ if (skip) {
+ emsg_skip++;
+ }
+ if (eval0(arg, &tv, nextcmd, !skip) == FAIL) {
+ *error = true;
+ } else {
+ *error = false;
if (!skip) {
- retval = (get_tv_number_chk(&tv, error) != 0);
- clear_tv(&tv);
+ retval = (tv_get_number_chk(&tv, error) != 0);
+ tv_clear(&tv);
}
}
- if (skip)
- --emsg_skip;
+ if (skip) {
+ emsg_skip--;
+ }
return retval;
}
-/*
- * Top level evaluation function, returning a string. If "skip" is TRUE,
- * only parsing to "nextcmd" is done, without reporting errors. Return
- * pointer to allocated memory, or NULL for failure or when "skip" is TRUE.
- */
-char_u *
-eval_to_string_skip (
- char_u *arg,
- char_u **nextcmd,
- int skip /* only parse, don't execute */
-)
+/// Top level evaluation function, returning a string
+///
+/// @param[in] arg String to evaluate.
+/// @param nextcmd Pointer to the start of the next Ex command.
+/// @param[in] skip If true, only do parsing to nextcmd without reporting
+/// errors or actually evaluating anything.
+///
+/// @return [allocated] string result of evaluation or NULL in case of error or
+/// when skipping.
+char *eval_to_string_skip(const char *arg, const char **nextcmd,
+ const bool skip)
+ FUNC_ATTR_MALLOC FUNC_ATTR_NONNULL_ARG(1) FUNC_ATTR_WARN_UNUSED_RESULT
{
typval_T tv;
- char_u *retval;
+ char *retval;
- if (skip)
- ++emsg_skip;
- if (eval0(arg, &tv, nextcmd, !skip) == FAIL || skip)
+ if (skip) {
+ emsg_skip++;
+ }
+ if (eval0((char_u *)arg, &tv, (char_u **)nextcmd, !skip) == FAIL || skip) {
retval = NULL;
- else {
- retval = vim_strsave(get_tv_string(&tv));
- clear_tv(&tv);
+ } else {
+ retval = xstrdup(tv_get_string(&tv));
+ tv_clear(&tv);
+ }
+ if (skip) {
+ emsg_skip--;
}
- if (skip)
- --emsg_skip;
return retval;
}
@@ -941,31 +1009,33 @@ int skip_expr(char_u **pp)
char_u *eval_to_string(char_u *arg, char_u **nextcmd, int convert)
{
typval_T tv;
- char_u *retval;
+ char *retval;
garray_T ga;
- char_u numbuf[NUMBUFLEN];
- if (eval0(arg, &tv, nextcmd, TRUE) == FAIL)
+ if (eval0(arg, &tv, nextcmd, true) == FAIL) {
retval = NULL;
- else {
+ } else {
if (convert && tv.v_type == VAR_LIST) {
ga_init(&ga, (int)sizeof(char), 80);
if (tv.vval.v_list != NULL) {
- list_join(&ga, tv.vval.v_list, "\n");
- if (tv.vval.v_list->lv_len > 0)
+ tv_list_join(&ga, tv.vval.v_list, "\n");
+ if (tv_list_len(tv.vval.v_list) > 0) {
ga_append(&ga, NL);
+ }
}
ga_append(&ga, NUL);
- retval = (char_u *)ga.ga_data;
+ retval = (char *)ga.ga_data;
} else if (convert && tv.v_type == VAR_FLOAT) {
- vim_snprintf((char *)numbuf, NUMBUFLEN, "%g", tv.vval.v_float);
- retval = vim_strsave(numbuf);
- } else
- retval = vim_strsave(get_tv_string(&tv));
- clear_tv(&tv);
+ char numbuf[NUMBUFLEN];
+ vim_snprintf(numbuf, NUMBUFLEN, "%g", tv.vval.v_float);
+ retval = xstrdup(numbuf);
+ } else {
+ retval = xstrdup(tv_get_string(&tv));
+ }
+ tv_clear(&tv);
}
- return retval;
+ return (char_u *)retval;
}
/*
@@ -994,19 +1064,19 @@ char_u *eval_to_string_safe(char_u *arg, char_u **nextcmd, int use_sandbox)
* Evaluates "expr" silently.
* Returns -1 for an error.
*/
-int eval_to_number(char_u *expr)
+varnumber_T eval_to_number(char_u *expr)
{
typval_T rettv;
- int retval;
+ varnumber_T retval;
char_u *p = skipwhite(expr);
++emsg_off;
- if (eval1(&p, &rettv, TRUE) == FAIL)
+ if (eval1(&p, &rettv, true) == FAIL) {
retval = -1;
- else {
- retval = get_tv_number_chk(&rettv, NULL);
- clear_tv(&rettv);
+ } else {
+ retval = tv_get_number_chk(&rettv, NULL);
+ tv_clear(&rettv);
}
--emsg_off;
@@ -1037,10 +1107,11 @@ static void restore_vimvar(int idx, typval_T *save_tv)
vimvars[idx].vv_tv = *save_tv;
if (vimvars[idx].vv_type == VAR_UNKNOWN) {
hi = hash_find(&vimvarht, vimvars[idx].vv_di.di_key);
- if (HASHITEM_EMPTY(hi))
- EMSG2(_(e_intern2), "restore_vimvar()");
- else
+ if (HASHITEM_EMPTY(hi)) {
+ internal_error("restore_vimvar()");
+ } else {
hash_remove(&vimvarht, hi);
+ }
}
}
@@ -1063,11 +1134,12 @@ list_T *eval_spell_expr(char_u *badword, char_u *expr)
if (p_verbose == 0)
++emsg_off;
- if (eval1(&p, &rettv, TRUE) == OK) {
- if (rettv.v_type != VAR_LIST)
- clear_tv(&rettv);
- else
+ if (eval1(&p, &rettv, true) == OK) {
+ if (rettv.v_type != VAR_LIST) {
+ tv_clear(&rettv);
+ } else {
list = rettv.vval.v_list;
+ }
}
if (p_verbose == 0)
@@ -1077,60 +1149,49 @@ list_T *eval_spell_expr(char_u *badword, char_u *expr)
return list;
}
-/*
- * "list" is supposed to contain two items: a word and a number. Return the
- * word in "pp" and the number as the return value.
- * Return -1 if anything isn't right.
- * Used to get the good word and score from the eval_spell_expr() result.
- */
-int get_spellword(list_T *list, char_u **pp)
+/// Get spell word from an entry from spellsuggest=expr:
+///
+/// Entry in question is supposed to be a list (to be checked by the caller)
+/// with two items: a word and a score represented as an unsigned number
+/// (whether it actually is unsigned is not checked).
+///
+/// Used to get the good word and score from the eval_spell_expr() result.
+///
+/// @param[in] list List to get values from.
+/// @param[out] ret_word Suggested word. Not initialized if return value is
+/// -1.
+///
+/// @return -1 in case of error, score otherwise.
+int get_spellword(list_T *const list, const char **ret_word)
{
- listitem_T *li;
-
- li = list->lv_first;
- if (li == NULL)
+ if (tv_list_len(list) != 2) {
+ EMSG(_("E5700: Expression from 'spellsuggest' must yield lists with "
+ "exactly two values"));
return -1;
- *pp = get_tv_string(&li->li_tv);
-
- li = li->li_next;
- if (li == NULL)
+ }
+ *ret_word = tv_list_find_str(list, 0);
+ if (*ret_word == NULL) {
return -1;
- return get_tv_number(&li->li_tv);
-}
-
-/*
- * Top level evaluation function.
- * Returns an allocated typval_T with the result.
- * Returns NULL when there is an error.
- */
-typval_T *eval_expr(char_u *arg, char_u **nextcmd)
-{
- typval_T *tv = xmalloc(sizeof(typval_T));
-
- if (eval0(arg, tv, nextcmd, TRUE) == FAIL) {
- xfree(tv);
- return NULL;
}
-
- return tv;
+ return tv_list_find_nr(list, -1, NULL);
}
-// Call some vimL function and return the result in "*rettv".
+// Call some vim script function and return the result in "*rettv".
// Uses argv[argc] for the function arguments. Only Number and String
// arguments are currently supported.
//
// Return OK or FAIL.
int call_vim_function(
- char_u *func,
+ const char_u *func,
int argc,
- char_u **argv,
- int safe, // use the sandbox
+ const char_u *const *const argv,
+ bool safe, // use the sandbox
int str_arg_only, // all arguments are strings
typval_T *rettv
)
{
- long n;
+ varnumber_T n;
int len;
int doesrange;
void *save_funccalp = NULL;
@@ -1149,15 +1210,19 @@ int call_vim_function(
if (str_arg_only) {
len = 0;
} else {
- // Recognize a number argument, the others must be strings.
+ // Recognize a number argument, the others must be strings. A dash
+ // is a string too.
vim_str2nr(argv[i], NULL, &len, STR2NR_ALL, &n, NULL, 0);
+ if (len == 1 && *argv[i] == '-') {
+ len = 0;
+ }
}
if (len != 0 && len == (int)STRLEN(argv[i])) {
argvars[i].v_type = VAR_NUMBER;
argvars[i].vval.v_number = n;
} else {
argvars[i].v_type = VAR_STRING;
- argvars[i].vval.v_string = argv[i];
+ argvars[i].vval.v_string = (char_u *)argv[i];
}
}
@@ -1166,10 +1231,10 @@ int call_vim_function(
++sandbox;
}
- rettv->v_type = VAR_UNKNOWN; /* clear_tv() uses this */
- ret = call_func(func, (int)STRLEN(func), rettv, argc, argvars,
+ rettv->v_type = VAR_UNKNOWN; // tv_clear() uses this.
+ ret = call_func(func, (int)STRLEN(func), rettv, argc, argvars, NULL,
curwin->w_cursor.lnum, curwin->w_cursor.lnum,
- &doesrange, true, NULL);
+ &doesrange, true, NULL, NULL);
if (safe) {
--sandbox;
restore_funccal(save_funccalp);
@@ -1177,74 +1242,72 @@ int call_vim_function(
xfree(argvars);
if (ret == FAIL) {
- clear_tv(rettv);
+ tv_clear(rettv);
}
return ret;
}
-/*
- * Call vimL function "func" and return the result as a number.
- * Returns -1 when calling the function fails.
- * Uses argv[argc] for the function arguments.
- */
-long
-call_func_retnr (
- char_u *func,
- int argc,
- char_u **argv,
- int safe /* use the sandbox */
-)
+/// Call Vim script function and return the result as a number
+///
+/// @param[in] func Function name.
+/// @param[in] argc Number of arguments.
+/// @param[in] argv Array with string arguments.
+/// @param[in] safe Use with sandbox.
+///
+/// @return -1 when calling function fails, result of function otherwise.
+varnumber_T call_func_retnr(char_u *func, int argc,
+ const char_u *const *const argv, int safe)
{
typval_T rettv;
- long retval;
+ varnumber_T retval;
/* All arguments are passed as strings, no conversion to number. */
if (call_vim_function(func, argc, argv, safe, TRUE, &rettv) == FAIL)
return -1;
- retval = get_tv_number_chk(&rettv, NULL);
- clear_tv(&rettv);
+ retval = tv_get_number_chk(&rettv, NULL);
+ tv_clear(&rettv);
return retval;
}
-/*
- * Call vimL function "func" and return the result as a string.
- * Returns NULL when calling the function fails.
- * Uses argv[argc] for the function arguments.
- */
-void *
-call_func_retstr (
- char_u *func,
- int argc,
- char_u **argv,
- int safe /* use the sandbox */
-)
+/// Call Vim script function and return the result as a string
+///
+/// @param[in] func Function name.
+/// @param[in] argc Number of arguments.
+/// @param[in] argv Array with string arguments.
+/// @param[in] safe Use the sandbox.
+///
+/// @return [allocated] NULL when calling function fails, allocated string
+/// otherwise.
+char *call_func_retstr(const char *const func, int argc,
+ const char_u *const *argv,
+ bool safe)
+ FUNC_ATTR_NONNULL_ARG(1) FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_MALLOC
{
typval_T rettv;
- char_u *retval;
-
- /* All arguments are passed as strings, no conversion to number. */
- if (call_vim_function(func, argc, argv, safe, TRUE, &rettv) == FAIL)
+ // All arguments are passed as strings, no conversion to number.
+ if (call_vim_function((const char_u *)func, argc, argv, safe, true, &rettv)
+ == FAIL) {
return NULL;
+ }
- retval = vim_strsave(get_tv_string(&rettv));
- clear_tv(&rettv);
+ char *const retval = xstrdup(tv_get_string(&rettv));
+ tv_clear(&rettv);
return retval;
}
-/*
- * Call vimL function "func" and return the result as a List.
- * Uses argv[argc] for the function arguments.
- * Returns NULL when there is something wrong.
- */
-void *
-call_func_retlist (
- char_u *func,
- int argc,
- char_u **argv,
- int safe /* use the sandbox */
-)
+/// Call Vim script function and return the result as a List
+///
+/// @param[in] func Function name.
+/// @param[in] argc Number of arguments.
+/// @param[in] argv Array with string arguments.
+/// @param[in] safe Use the sandbox.
+///
+/// @return [allocated] NULL when calling function fails or return tv is not a
+/// List, allocated List otherwise.
+void *call_func_retlist(char_u *func, int argc, const char_u *const *argv,
+ bool safe)
{
typval_T rettv;
@@ -1253,7 +1316,7 @@ call_func_retlist (
return NULL;
if (rettv.v_type != VAR_LIST) {
- clear_tv(&rettv);
+ tv_clear(&rettv);
return NULL;
}
@@ -1325,7 +1388,7 @@ void prof_child_exit(proftime_T *tm /* where waittime was stored */
int eval_foldexpr(char_u *arg, int *cp)
{
typval_T tv;
- int retval;
+ varnumber_T retval;
char_u *s;
int use_sandbox = was_set_insecurely((char_u *)"foldexpr",
OPT_LOCAL);
@@ -1351,14 +1414,14 @@ int eval_foldexpr(char_u *arg, int *cp)
*cp = *s++;
retval = atol((char *)s);
}
- clear_tv(&tv);
+ tv_clear(&tv);
}
--emsg_off;
if (use_sandbox)
--sandbox;
--textlock;
- return retval;
+ return (int)retval;
}
/*
@@ -1382,22 +1445,24 @@ void ex_let(exarg_T *eap)
char_u *argend;
int first = TRUE;
- argend = skip_var_list(arg, &var_count, &semicolon);
- if (argend == NULL)
+ argend = (char_u *)skip_var_list(arg, &var_count, &semicolon);
+ if (argend == NULL) {
return;
- if (argend > arg && argend[-1] == '.') /* for var.='str' */
- --argend;
+ }
+ if (argend > arg && argend[-1] == '.') { // For var.='str'.
+ argend--;
+ }
expr = skipwhite(argend);
if (*expr != '=' && !(vim_strchr((char_u *)"+-.", *expr) != NULL
&& expr[1] == '=')) {
// ":let" without "=": list variables
- if (*arg == '[')
+ if (*arg == '[') {
EMSG(_(e_invarg));
- else if (!ends_excmd(*arg))
- /* ":let var1 var2" */
- arg = list_arg_vars(eap, arg, &first);
- else if (!eap->skip) {
- /* ":let" */
+ } else if (!ends_excmd(*arg)) {
+ // ":let var1 var2"
+ arg = (char_u *)list_arg_vars(eap, (const char *)arg, &first);
+ } else if (!eap->skip) {
+ // ":let"
list_glob_vars(&first);
list_buf_vars(&first);
list_win_vars(&first);
@@ -1423,13 +1488,13 @@ void ex_let(exarg_T *eap)
++emsg_skip;
i = eval0(expr, &rettv, &eap->nextcmd, !eap->skip);
if (eap->skip) {
- if (i != FAIL)
- clear_tv(&rettv);
- --emsg_skip;
+ if (i != FAIL) {
+ tv_clear(&rettv);
+ }
+ emsg_skip--;
} else if (i != FAIL) {
- (void)ex_let_vars(eap->arg, &rettv, FALSE, semicolon, var_count,
- op);
- clear_tv(&rettv);
+ (void)ex_let_vars(eap->arg, &rettv, false, semicolon, var_count, op);
+ tv_clear(&rettv);
}
}
}
@@ -1442,8 +1507,8 @@ void ex_let(exarg_T *eap)
* or concatenate.
* Returns OK or FAIL;
*/
-static int
-ex_let_vars (
+static int
+ex_let_vars(
char_u *arg_start,
typval_T *tv,
int copy, /* copy values from "tv", don't move */
@@ -1452,10 +1517,7 @@ ex_let_vars (
char_u *nextchars
)
{
- char_u *arg = arg_start;
- list_T *l;
- int i;
- listitem_T *item;
+ char_u *arg = arg_start;
typval_T ltv;
if (*arg != '[') {
@@ -1467,55 +1529,62 @@ ex_let_vars (
return OK;
}
- /*
- * ":let [v1, v2] = list" or ":for [v1, v2] in listlist"
- */
- if (tv->v_type != VAR_LIST || (l = tv->vval.v_list) == NULL) {
+ // ":let [v1, v2] = list" or ":for [v1, v2] in listlist"
+ if (tv->v_type != VAR_LIST) {
EMSG(_(e_listreq));
return FAIL;
}
+ list_T *const l = tv->vval.v_list;
- i = list_len(l);
- if (semicolon == 0 && var_count < i) {
+ const int len = tv_list_len(l);
+ if (semicolon == 0 && var_count < len) {
EMSG(_("E687: Less targets than List items"));
return FAIL;
}
- if (var_count - semicolon > i) {
+ if (var_count - semicolon > len) {
EMSG(_("E688: More targets than List items"));
return FAIL;
}
+ // List l may actually be NULL, but it should fail with E688 or even earlier
+ // if you try to do ":let [] = v:_null_list".
+ assert(l != NULL);
- item = l->lv_first;
+ listitem_T *item = tv_list_first(l);
+ size_t rest_len = tv_list_len(l);
while (*arg != ']') {
arg = skipwhite(arg + 1);
- arg = ex_let_one(arg, &item->li_tv, TRUE, (char_u *)",;]", nextchars);
- item = item->li_next;
- if (arg == NULL)
+ arg = ex_let_one(arg, TV_LIST_ITEM_TV(item), true, (const char_u *)",;]",
+ nextchars);
+ if (arg == NULL) {
return FAIL;
+ }
+ rest_len--;
+ item = TV_LIST_ITEM_NEXT(l, item);
arg = skipwhite(arg);
if (*arg == ';') {
/* Put the rest of the list (may be empty) in the var after ';'.
* Create a new list for this. */
- l = list_alloc();
+ list_T *const rest_list = tv_list_alloc(rest_len);
while (item != NULL) {
- list_append_tv(l, &item->li_tv);
- item = item->li_next;
+ tv_list_append_tv(rest_list, TV_LIST_ITEM_TV(item));
+ item = TV_LIST_ITEM_NEXT(l, item);
}
ltv.v_type = VAR_LIST;
- ltv.v_lock = 0;
- ltv.vval.v_list = l;
- l->lv_refcount = 1;
-
- arg = ex_let_one(skipwhite(arg + 1), &ltv, FALSE,
- (char_u *)"]", nextchars);
- clear_tv(&ltv);
- if (arg == NULL)
+ ltv.v_lock = VAR_UNLOCKED;
+ ltv.vval.v_list = rest_list;
+ tv_list_ref(rest_list);
+
+ arg = ex_let_one(skipwhite(arg + 1), &ltv, false,
+ (char_u *)"]", nextchars);
+ tv_clear(&ltv);
+ if (arg == NULL) {
return FAIL;
+ }
break;
} else if (*arg != ',' && *arg != ']') {
- EMSG2(_(e_intern2), "ex_let_vars()");
+ internal_error("ex_let_vars()");
return FAIL;
}
}
@@ -1530,9 +1599,11 @@ ex_let_vars (
* for "[var, var; var]" set "semicolon".
* Return NULL for an error.
*/
-static char_u *skip_var_list(char_u *arg, int *var_count, int *semicolon)
+static const char_u *skip_var_list(const char_u *arg, int *var_count,
+ int *semicolon)
{
- char_u *p, *s;
+ const char_u *p;
+ const char_u *s;
if (*arg == '[') {
/* "[var, var]": find the matching ']'. */
@@ -1569,7 +1640,7 @@ static char_u *skip_var_list(char_u *arg, int *var_count, int *semicolon)
* Skip one (assignable) variable name, including @r, $VAR, &option, d.key,
* l[idx].
*/
-static char_u *skip_var_one(char_u *arg)
+static const char_u *skip_var_one(const char_u *arg)
{
if (*arg == '@' && arg[1] != NUL)
return arg + 2;
@@ -1581,7 +1652,8 @@ static char_u *skip_var_one(char_u *arg)
* List variables for hashtab "ht" with prefix "prefix".
* If "empty" is TRUE also list NULL strings as empty strings.
*/
-static void list_hashtable_vars(hashtab_T *ht, char_u *prefix, int empty, int *first)
+static void list_hashtable_vars(hashtab_T *ht, const char *prefix, int empty,
+ int *first)
{
hashitem_T *hi;
dictitem_T *di;
@@ -1590,11 +1662,12 @@ static void list_hashtable_vars(hashtab_T *ht, char_u *prefix, int empty, int *f
todo = (int)ht->ht_used;
for (hi = ht->ht_array; todo > 0 && !got_int; ++hi) {
if (!HASHITEM_EMPTY(hi)) {
- --todo;
- di = HI2DI(hi);
+ todo--;
+ di = TV_DICT_HI2DI(hi);
if (empty || di->di_tv.v_type != VAR_STRING
- || di->di_tv.vval.v_string != NULL)
+ || di->di_tv.vval.v_string != NULL) {
list_one_var(di, prefix, first);
+ }
}
}
}
@@ -1604,7 +1677,7 @@ static void list_hashtable_vars(hashtab_T *ht, char_u *prefix, int empty, int *f
*/
static void list_glob_vars(int *first)
{
- list_hashtable_vars(&globvarht, (char_u *)"", TRUE, first);
+ list_hashtable_vars(&globvarht, "", true, first);
}
/*
@@ -1612,14 +1685,7 @@ static void list_glob_vars(int *first)
*/
static void list_buf_vars(int *first)
{
- char_u numbuf[NUMBUFLEN];
-
- list_hashtable_vars(&curbuf->b_vars->dv_hashtab, (char_u *)"b:",
- TRUE, first);
-
- sprintf((char *)numbuf, "%" PRId64, (int64_t)curbuf->b_changedtick);
- list_one_var_a((char_u *)"b:", (char_u *)"changedtick", VAR_NUMBER,
- numbuf, first);
+ list_hashtable_vars(&curbuf->b_vars->dv_hashtab, "b:", true, first);
}
/*
@@ -1627,8 +1693,7 @@ static void list_buf_vars(int *first)
*/
static void list_win_vars(int *first)
{
- list_hashtable_vars(&curwin->w_vars->dv_hashtab,
- (char_u *)"w:", TRUE, first);
+ list_hashtable_vars(&curwin->w_vars->dv_hashtab, "w:", true, first);
}
/*
@@ -1636,8 +1701,7 @@ static void list_win_vars(int *first)
*/
static void list_tab_vars(int *first)
{
- list_hashtable_vars(&curtab->tp_vars->dv_hashtab,
- (char_u *)"t:", TRUE, first);
+ list_hashtable_vars(&curtab->tp_vars->dv_hashtab, "t:", true, first);
}
/*
@@ -1645,7 +1709,7 @@ static void list_tab_vars(int *first)
*/
static void list_vim_vars(int *first)
{
- list_hashtable_vars(&vimvarht, (char_u *)"v:", FALSE, first);
+ list_hashtable_vars(&vimvarht, "v:", false, first);
}
/*
@@ -1653,9 +1717,9 @@ static void list_vim_vars(int *first)
*/
static void list_script_vars(int *first)
{
- if (current_SID > 0 && current_SID <= ga_scripts.ga_len)
- list_hashtable_vars(&SCRIPT_VARS(current_SID),
- (char_u *)"s:", FALSE, first);
+ if (current_SID > 0 && current_SID <= ga_scripts.ga_len) {
+ list_hashtable_vars(&SCRIPT_VARS(current_SID), "s:", false, first);
+ }
}
/*
@@ -1663,36 +1727,37 @@ static void list_script_vars(int *first)
*/
static void list_func_vars(int *first)
{
- if (current_funccal != NULL)
- list_hashtable_vars(&current_funccal->l_vars.dv_hashtab,
- (char_u *)"l:", FALSE, first);
+ if (current_funccal != NULL) {
+ list_hashtable_vars(&current_funccal->l_vars.dv_hashtab, "l:", false,
+ first);
+ }
}
/*
* List variables in "arg".
*/
-static char_u *list_arg_vars(exarg_T *eap, char_u *arg, int *first)
+static const char *list_arg_vars(exarg_T *eap, const char *arg, int *first)
{
int error = FALSE;
int len;
- char_u *name;
- char_u *name_start;
- char_u *arg_subsc;
- char_u *tofree;
+ const char *name;
+ const char *name_start;
typval_T tv;
while (!ends_excmd(*arg) && !got_int) {
if (error || eap->skip) {
- arg = find_name_end(arg, NULL, NULL, FNE_INCL_BR | FNE_CHECK_START);
+ arg = (const char *)find_name_end((char_u *)arg, NULL, NULL,
+ FNE_INCL_BR | FNE_CHECK_START);
if (!ascii_iswhite(*arg) && !ends_excmd(*arg)) {
emsg_severe = TRUE;
EMSG(_(e_trailing));
break;
}
} else {
- /* get_name_len() takes care of expanding curly braces */
+ // get_name_len() takes care of expanding curly braces
name_start = name = arg;
- len = get_name_len(&arg, &tofree, TRUE, TRUE);
+ char *tofree;
+ len = get_name_len(&arg, &tofree, true, true);
if (len <= 0) {
/* This is mainly to keep test 49 working: when expanding
* curly braces fails overrule the exception error message. */
@@ -1706,14 +1771,15 @@ static char_u *list_arg_vars(exarg_T *eap, char_u *arg, int *first)
if (tofree != NULL) {
name = tofree;
}
- if (get_var_tv(name, len, &tv, NULL, true, false) == FAIL) {
+ if (get_var_tv((const char *)name, len, &tv, NULL, true, false)
+ == FAIL) {
error = true;
} else {
// handle d.key, l[idx], f(expr)
- arg_subsc = arg;
- if (handle_subscript(&arg, &tv, TRUE, TRUE) == FAIL)
- error = TRUE;
- else {
+ const char *const arg_subsc = arg;
+ if (handle_subscript(&arg, &tv, true, true) == FAIL) {
+ error = true;
+ } else {
if (arg == arg_subsc && len == 2 && name[1] == ':') {
switch (*name) {
case 'g': list_glob_vars(first); break;
@@ -1727,20 +1793,18 @@ static char_u *list_arg_vars(exarg_T *eap, char_u *arg, int *first)
EMSG2(_("E738: Can't list variables for %s"), name);
}
} else {
- int c;
-
- char_u *s = (char_u *) encode_tv2echo(&tv, NULL);
- c = *arg;
- *arg = NUL;
- list_one_var_a((char_u *)"",
- arg == arg_subsc ? name : name_start,
- tv.v_type,
- s == NULL ? (char_u *)"" : s,
- first);
- *arg = c;
+ char *const s = encode_tv2echo(&tv, NULL);
+ const char *const used_name = (arg == arg_subsc
+ ? name
+ : name_start);
+ const ptrdiff_t name_size = (used_name == tofree
+ ? (ptrdiff_t)strlen(used_name)
+ : (arg - used_name));
+ list_one_var_a("", used_name, name_size,
+ tv.v_type, s == NULL ? "" : s, first);
xfree(s);
}
- clear_tv(&tv);
+ tv_clear(&tv);
}
}
}
@@ -1748,152 +1812,154 @@ static char_u *list_arg_vars(exarg_T *eap, char_u *arg, int *first)
xfree(tofree);
}
- arg = skipwhite(arg);
+ arg = (const char *)skipwhite((const char_u *)arg);
}
return arg;
}
-/*
- * Set one item of ":let var = expr" or ":let [v1, v2] = list" to its value.
- * Returns a pointer to the char just after the var name.
- * Returns NULL if there is an error.
- */
-static char_u *
-ex_let_one (
- char_u *arg, /* points to variable name */
- typval_T *tv, /* value to assign to variable */
- int copy, /* copy value from "tv" */
- char_u *endchars, /* valid chars after variable name or NULL */
- char_u *op /* "+", "-", "." or NULL*/
-)
-{
- int c1;
- char_u *name;
- char_u *p;
- char_u *arg_end = NULL;
+// TODO(ZyX-I): move to eval/ex_cmds
+
+/// Set one item of `:let var = expr` or `:let [v1, v2] = list` to its value
+///
+/// @param[in] arg Start of the variable name.
+/// @param[in] tv Value to assign to the variable.
+/// @param[in] copy If true, copy value from `tv`.
+/// @param[in] endchars Valid characters after variable name or NULL.
+/// @param[in] op Operation performed: *op is `+`, `-`, `.` for `+=`, etc.
+/// NULL for `=`.
+///
+/// @return a pointer to the char just after the var name or NULL in case of
+/// error.
+static char_u *ex_let_one(char_u *arg, typval_T *const tv,
+ const bool copy, const char_u *const endchars,
+ const char_u *const op)
+ FUNC_ATTR_NONNULL_ARG(1, 2) FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ char_u *arg_end = NULL;
int len;
int opt_flags;
- char_u *tofree = NULL;
+ char_u *tofree = NULL;
/*
* ":let $VAR = expr": Set environment variable.
*/
if (*arg == '$') {
- /* Find the end of the name. */
- ++arg;
- name = arg;
- len = get_env_len(&arg);
- if (len == 0)
+ // Find the end of the name.
+ arg++;
+ char *name = (char *)arg;
+ len = get_env_len((const char_u **)&arg);
+ if (len == 0) {
EMSG2(_(e_invarg2), name - 1);
- else {
- if (op != NULL && (*op == '+' || *op == '-'))
+ } else {
+ if (op != NULL && (*op == '+' || *op == '-')) {
EMSG2(_(e_letwrong), op);
- else if (endchars != NULL
- && vim_strchr(endchars, *skipwhite(arg)) == NULL)
+ } else if (endchars != NULL
+ && vim_strchr(endchars, *skipwhite(arg)) == NULL) {
EMSG(_(e_letunexp));
- else if (!check_secure()) {
- c1 = name[len];
+ } else if (!check_secure()) {
+ const char c1 = name[len];
name[len] = NUL;
- p = get_tv_string_chk(tv);
+ const char *p = tv_get_string_chk(tv);
if (p != NULL && op != NULL && *op == '.') {
- char *s = vim_getenv((char *)name);
+ char *s = vim_getenv(name);
if (s != NULL) {
- p = tofree = concat_str((char_u *)s, p);
+ tofree = concat_str((const char_u *)s, (const char_u *)p);
+ p = (const char *)tofree;
xfree(s);
}
}
if (p != NULL) {
- vim_setenv((char *)name, (char *)p);
- if (STRICMP(name, "HOME") == 0)
+ vim_setenv(name, p);
+ if (STRICMP(name, "HOME") == 0) {
init_homedir();
- else if (didset_vim && STRICMP(name, "VIM") == 0)
- didset_vim = FALSE;
- else if (didset_vimruntime
- && STRICMP(name, "VIMRUNTIME") == 0)
- didset_vimruntime = FALSE;
+ } else if (didset_vim && STRICMP(name, "VIM") == 0) {
+ didset_vim = false;
+ } else if (didset_vimruntime
+ && STRICMP(name, "VIMRUNTIME") == 0) {
+ didset_vimruntime = false;
+ }
arg_end = arg;
}
name[len] = c1;
xfree(tofree);
}
}
- }
- /*
- * ":let &option = expr": Set option value.
- * ":let &l:option = expr": Set local option value.
- * ":let &g:option = expr": Set global option value.
- */
- else if (*arg == '&') {
- /* Find the end of the name. */
- p = find_option_end(&arg, &opt_flags);
- if (p == NULL || (endchars != NULL
- && vim_strchr(endchars, *skipwhite(p)) == NULL))
+ // ":let &option = expr": Set option value.
+ // ":let &l:option = expr": Set local option value.
+ // ":let &g:option = expr": Set global option value.
+ } else if (*arg == '&') {
+ // Find the end of the name.
+ char *const p = (char *)find_option_end((const char **)&arg, &opt_flags);
+ if (p == NULL
+ || (endchars != NULL
+ && vim_strchr(endchars, *skipwhite((const char_u *)p)) == NULL)) {
EMSG(_(e_letunexp));
- else {
- long n;
+ } else {
int opt_type;
long numval;
- char_u *stringval = NULL;
- char_u *s;
+ char *stringval = NULL;
- c1 = *p;
+ const char c1 = *p;
*p = NUL;
- n = get_tv_number(tv);
- s = get_tv_string_chk(tv); /* != NULL if number or string */
+ varnumber_T n = tv_get_number(tv);
+ const char *s = tv_get_string_chk(tv); // != NULL if number or string.
if (s != NULL && op != NULL && *op != '=') {
- opt_type = get_option_value(arg, &numval,
- &stringval, opt_flags);
+ opt_type = get_option_value(arg, &numval, (char_u **)&stringval,
+ opt_flags);
if ((opt_type == 1 && *op == '.')
- || (opt_type == 0 && *op != '.'))
+ || (opt_type == 0 && *op != '.')) {
EMSG2(_(e_letwrong), op);
- else {
- if (opt_type == 1) { /* number */
- if (*op == '+')
+ s = NULL; // don't set the value
+ } else {
+ if (opt_type == 1) { // number
+ if (*op == '+') {
n = numval + n;
- else
+ } else {
n = numval - n;
- } else if (opt_type == 0 && stringval != NULL) { /* string */
- s = concat_str(stringval, s);
- xfree(stringval);
- stringval = s;
+ }
+ } else if (opt_type == 0 && stringval != NULL) { // string
+ char *const oldstringval = stringval;
+ stringval = (char *)concat_str((const char_u *)stringval,
+ (const char_u *)s);
+ xfree(oldstringval);
+ s = stringval;
}
}
}
if (s != NULL) {
- set_option_value(arg, n, s, opt_flags);
- arg_end = p;
+ set_option_value((const char *)arg, n, s, opt_flags);
+ arg_end = (char_u *)p;
}
*p = c1;
xfree(stringval);
}
- }
- /*
- * ":let @r = expr": Set register contents.
- */
- else if (*arg == '@') {
- ++arg;
- if (op != NULL && (*op == '+' || *op == '-'))
- EMSG2(_(e_letwrong), op);
- else if (endchars != NULL
- && vim_strchr(endchars, *skipwhite(arg + 1)) == NULL)
+ // ":let @r = expr": Set register contents.
+ } else if (*arg == '@') {
+ arg++;
+ if (op != NULL && (*op == '+' || *op == '-')) {
+ emsgf(_(e_letwrong), op);
+ } else if (endchars != NULL
+ && vim_strchr(endchars, *skipwhite(arg + 1)) == NULL) {
EMSG(_(e_letunexp));
- else {
- char_u *ptofree = NULL;
+ } else {
char_u *s;
- p = get_tv_string_chk(tv);
+ char_u *ptofree = NULL;
+ const char *p = tv_get_string_chk(tv);
if (p != NULL && op != NULL && *op == '.') {
s = get_reg_contents(*arg == '@' ? '"' : *arg, kGRegExprSrc);
if (s != NULL) {
- p = ptofree = concat_str(s, p);
+ ptofree = concat_str(s, (const char_u *)p);
+ p = (const char *)ptofree;
xfree(s);
}
}
if (p != NULL) {
- write_reg_contents(*arg == '@' ? '"' : *arg, p, STRLEN(p), false);
+ write_reg_contents(*arg == '@' ? '"' : *arg,
+ (const char_u *)p, STRLEN(p), false);
arg_end = arg + 1;
}
xfree(ptofree);
@@ -1906,11 +1972,11 @@ ex_let_one (
else if (eval_isnamec1(*arg) || *arg == '{') {
lval_T lv;
- p = get_lval(arg, tv, &lv, FALSE, FALSE, 0, FNE_CHECK_START);
+ char_u *const p = get_lval(arg, tv, &lv, false, false, 0, FNE_CHECK_START);
if (p != NULL && lv.ll_name != NULL) {
- if (endchars != NULL && vim_strchr(endchars, *skipwhite(p)) == NULL)
+ if (endchars != NULL && vim_strchr(endchars, *skipwhite(p)) == NULL) {
EMSG(_(e_letunexp));
- else {
+ } else {
set_var_lval(&lv, p, tv, copy, op);
arg_end = p;
}
@@ -1922,57 +1988,41 @@ ex_let_one (
return arg_end;
}
-/*
- * If "arg" is equal to "b:changedtick" give an error and return TRUE.
- */
-static int check_changedtick(char_u *arg)
-{
- if (STRNCMP(arg, "b:changedtick", 13) == 0 && !eval_isnamec(arg[13])) {
- EMSG2(_(e_readonlyvar), arg);
- return TRUE;
- }
- return FALSE;
-}
+// TODO(ZyX-I): move to eval/executor
-/*
- * Get an lval: variable, Dict item or List item that can be assigned a value
- * to: "name", "na{me}", "name[expr]", "name[expr:expr]", "name[expr][expr]",
- * "name.key", "name.key[expr]" etc.
- * Indexing only works if "name" is an existing List or Dictionary.
- * "name" points to the start of the name.
- * If "rettv" is not NULL it points to the value to be assigned.
- * "unlet" is TRUE for ":unlet": slightly different behavior when something is
- * wrong; must end in space or cmd separator.
- *
- * flags:
- * GLV_QUIET: do not give error messages
- * GLV_NO_AUTOLOAD: do not use script autoloading
- *
- * Returns a pointer to just after the name, including indexes.
- * When an evaluation error occurs "lp->ll_name" is NULL;
- * Returns NULL for a parsing error. Still need to free items in "lp"!
- */
-static char_u *
-get_lval (
- char_u *name,
- typval_T *rettv,
- lval_T *lp,
- int unlet,
- int skip,
- int flags, /* GLV_ values */
- int fne_flags /* flags for find_name_end() */
-)
+/// Get an lvalue
+///
+/// Lvalue may be
+/// - variable: "name", "na{me}"
+/// - dictionary item: "dict.key", "dict['key']"
+/// - list item: "list[expr]"
+/// - list slice: "list[expr:expr]"
+///
+/// Indexing only works if trying to use it with an existing List or Dictionary.
+///
+/// @param[in] name Name to parse.
+/// @param rettv Pointer to the value to be assigned or NULL.
+/// @param[out] lp Lvalue definition. When evaluation errors occur `->ll_name`
+/// is NULL.
+/// @param[in] unlet True if using `:unlet`. This results in slightly
+/// different behaviour when something is wrong; must end in
+/// space or cmd separator.
+/// @param[in] skip True when skipping.
+/// @param[in] flags @see GetLvalFlags.
+/// @param[in] fne_flags Flags for find_name_end().
+///
+/// @return A pointer to just after the name, including indexes. Returns NULL
+/// for a parsing error, but it is still needed to free items in lp.
+static char_u *get_lval(char_u *const name, typval_T *const rettv,
+ lval_T *const lp, const bool unlet, const bool skip,
+ const int flags, const int fne_flags)
+ FUNC_ATTR_NONNULL_ARG(1, 3)
{
- char_u *p;
- char_u *expr_start, *expr_end;
- int cc;
dictitem_T *v;
typval_T var1;
typval_T var2;
int empty1 = FALSE;
listitem_T *ni;
- char_u *key = NULL;
- int len;
hashtab_T *ht;
int quiet = flags & GLV_QUIET;
@@ -1980,13 +2030,19 @@ get_lval (
memset(lp, 0, sizeof(lval_T));
if (skip) {
- /* When skipping just find the end of the name. */
- lp->ll_name = name;
- return find_name_end(name, NULL, NULL, FNE_INCL_BR | fne_flags);
+ // When skipping just find the end of the name.
+ lp->ll_name = (const char *)name;
+ return (char_u *)find_name_end((const char_u *)name, NULL, NULL,
+ FNE_INCL_BR | fne_flags);
}
- /* Find the end of the name. */
- p = find_name_end(name, &expr_start, &expr_end, fne_flags);
+ // Find the end of the name.
+ char_u *expr_start;
+ char_u *expr_end;
+ char_u *p = (char_u *)find_name_end(name,
+ (const char_u **)&expr_start,
+ (const char_u **)&expr_end,
+ fne_flags);
if (expr_start != NULL) {
/* Don't expand the name when we already know there is an error. */
if (unlet && !ascii_iswhite(*p) && !ends_excmd(*p)
@@ -1995,7 +2051,9 @@ get_lval (
return NULL;
}
- lp->ll_exp_name = make_expanded_name(name, expr_start, expr_end, p);
+ lp->ll_exp_name = (char *)make_expanded_name(name, expr_start, expr_end,
+ (char_u *)p);
+ lp->ll_name = lp->ll_exp_name;
if (lp->ll_exp_name == NULL) {
/* Report an invalid expression in braces, unless the
* expression evaluation has been cancelled due to an
@@ -2005,28 +2063,39 @@ get_lval (
EMSG2(_(e_invarg2), name);
return NULL;
}
+ lp->ll_name_len = 0;
+ } else {
+ lp->ll_name_len = strlen(lp->ll_name);
}
- lp->ll_name = lp->ll_exp_name;
- } else
- lp->ll_name = name;
+ } else {
+ lp->ll_name = (const char *)name;
+ lp->ll_name_len = (size_t)((const char *)p - lp->ll_name);
+ }
- /* Without [idx] or .key we are done. */
- if ((*p != '[' && *p != '.') || lp->ll_name == NULL)
+ // Without [idx] or .key we are done.
+ if ((*p != '[' && *p != '.') || lp->ll_name == NULL) {
return p;
+ }
- cc = *p;
- *p = NUL;
- v = find_var(lp->ll_name, &ht, flags & GLV_NO_AUTOLOAD);
- if (v == NULL && !quiet)
- EMSG2(_(e_undefvar), lp->ll_name);
- *p = cc;
- if (v == NULL)
+ // Only pass &ht when we would write to the variable, it prevents autoload
+ // as well.
+ v = find_var(lp->ll_name, lp->ll_name_len,
+ (flags & GLV_READ_ONLY) ? NULL : &ht,
+ flags & GLV_NO_AUTOLOAD);
+ if (v == NULL && !quiet) {
+ emsgf(_("E121: Undefined variable: %.*s"),
+ (int)lp->ll_name_len, lp->ll_name);
+ }
+ if (v == NULL) {
return NULL;
+ }
/*
* Loop until no more [idx] or .key is following.
*/
lp->ll_tv = &v->di_tv;
+ var1.v_type = VAR_UNKNOWN;
+ var2.v_type = VAR_UNKNOWN;
while (*p == '[' || (*p == '.' && lp->ll_tv->v_type == VAR_DICT)) {
if (!(lp->ll_tv->v_type == VAR_LIST && lp->ll_tv->vval.v_list != NULL)
&& !(lp->ll_tv->v_type == VAR_DICT
@@ -2041,29 +2110,32 @@ get_lval (
return NULL;
}
- len = -1;
+ int len = -1;
+ char_u *key = NULL;
if (*p == '.') {
key = p + 1;
- for (len = 0; ASCII_ISALNUM(key[len]) || key[len] == '_'; ++len)
- ;
+ for (len = 0; ASCII_ISALNUM(key[len]) || key[len] == '_'; len++) {
+ }
if (len == 0) {
- if (!quiet)
- EMSG(_(e_emptykey));
+ if (!quiet) {
+ EMSG(_("E713: Cannot use empty key after ."));
+ }
return NULL;
}
p = key + len;
} else {
/* Get the index [expr] or the first index [expr: ]. */
p = skipwhite(p + 1);
- if (*p == ':')
- empty1 = TRUE;
- else {
- empty1 = FALSE;
- if (eval1(&p, &var1, TRUE) == FAIL) /* recursive! */
+ if (*p == ':') {
+ empty1 = true;
+ } else {
+ empty1 = false;
+ if (eval1(&p, &var1, true) == FAIL) { // Recursive!
return NULL;
- if (get_tv_string_chk(&var1) == NULL) {
- /* not a number or string */
- clear_tv(&var1);
+ }
+ if (!tv_check_str(&var1)) {
+ // Not a number or string.
+ tv_clear(&var1);
return NULL;
}
}
@@ -2071,35 +2143,33 @@ get_lval (
/* Optionally get the second index [ :expr]. */
if (*p == ':') {
if (lp->ll_tv->v_type == VAR_DICT) {
- if (!quiet)
+ if (!quiet) {
EMSG(_(e_dictrange));
- if (!empty1)
- clear_tv(&var1);
+ }
+ tv_clear(&var1);
return NULL;
}
if (rettv != NULL && (rettv->v_type != VAR_LIST
|| rettv->vval.v_list == NULL)) {
- if (!quiet)
+ if (!quiet) {
EMSG(_("E709: [:] requires a List value"));
- if (!empty1)
- clear_tv(&var1);
+ }
+ tv_clear(&var1);
return NULL;
}
p = skipwhite(p + 1);
- if (*p == ']')
- lp->ll_empty2 = TRUE;
- else {
- lp->ll_empty2 = FALSE;
- if (eval1(&p, &var2, TRUE) == FAIL) { /* recursive! */
- if (!empty1)
- clear_tv(&var1);
+ if (*p == ']') {
+ lp->ll_empty2 = true;
+ } else {
+ lp->ll_empty2 = false;
+ if (eval1(&p, &var2, true) == FAIL) { // Recursive!
+ tv_clear(&var1);
return NULL;
}
- if (get_tv_string_chk(&var2) == NULL) {
- /* not a number or string */
- if (!empty1)
- clear_tv(&var1);
- clear_tv(&var2);
+ if (!tv_check_str(&var2)) {
+ // Not a number or string.
+ tv_clear(&var1);
+ tv_clear(&var2);
return NULL;
}
}
@@ -2108,12 +2178,11 @@ get_lval (
lp->ll_range = FALSE;
if (*p != ']') {
- if (!quiet)
+ if (!quiet) {
EMSG(_(e_missbrac));
- if (!empty1)
- clear_tv(&var1);
- if (lp->ll_range && !lp->ll_empty2)
- clear_tv(&var2);
+ }
+ tv_clear(&var1);
+ tv_clear(&var2);
return NULL;
}
@@ -2123,18 +2192,12 @@ get_lval (
if (lp->ll_tv->v_type == VAR_DICT) {
if (len == -1) {
- /* "[key]": get key from "var1" */
- key = get_tv_string(&var1); /* is number or string */
- if (*key == NUL) {
- if (!quiet)
- EMSG(_(e_emptykey));
- clear_tv(&var1);
- return NULL;
- }
+ // "[key]": get key from "var1"
+ key = (char_u *)tv_get_string(&var1); // is number or string
}
lp->ll_list = NULL;
lp->ll_dict = lp->ll_tv->vval.v_dict;
- lp->ll_di = dict_find(lp->ll_dict, key, len);
+ lp->ll_di = tv_dict_find(lp->ll_dict, (const char *)key, len);
/* When assigning to a scope dictionary check that a function and
* variable name is valid (only variable name unless it is l: or
@@ -2146,16 +2209,19 @@ get_lval (
if (len != -1) {
prevval = key[len];
key[len] = NUL;
- } else
- prevval = 0; /* avoid compiler warning */
- wrong = (lp->ll_dict->dv_scope == VAR_DEF_SCOPE
- && rettv->v_type == VAR_FUNC
- && var_check_func_name(key, lp->ll_di == NULL))
- || !valid_varname(key);
- if (len != -1)
+ } else {
+ prevval = 0; // Avoid compiler warning.
+ }
+ wrong = ((lp->ll_dict->dv_scope == VAR_DEF_SCOPE
+ && tv_is_func(*rettv)
+ && !var_check_func_name((const char *)key, lp->ll_di == NULL))
+ || !valid_varname((const char *)key));
+ if (len != -1) {
key[len] = prevval;
- if (wrong)
+ }
+ if (wrong) {
return NULL;
+ }
}
if (lp->ll_di == NULL) {
@@ -2167,51 +2233,53 @@ get_lval (
/* Key does not exist in dict: may need to add it. */
if (*p == '[' || *p == '.' || unlet) {
- if (!quiet)
- EMSG2(_(e_dictkey), key);
- if (len == -1)
- clear_tv(&var1);
+ if (!quiet) {
+ emsgf(_(e_dictkey), key);
+ }
+ tv_clear(&var1);
return NULL;
}
- if (len == -1)
+ if (len == -1) {
lp->ll_newkey = vim_strsave(key);
- else
+ } else {
lp->ll_newkey = vim_strnsave(key, len);
- if (len == -1)
- clear_tv(&var1);
+ }
+ tv_clear(&var1);
break;
- } else if (var_check_ro(lp->ll_di->di_flags, name, false)) {
- // existing variable, need to check if it can be changed
+ // existing variable, need to check if it can be changed
+ } else if (!(flags & GLV_READ_ONLY) && var_check_ro(lp->ll_di->di_flags,
+ (const char *)name,
+ (size_t)(p - name))) {
+ tv_clear(&var1);
return NULL;
}
- if (len == -1)
- clear_tv(&var1);
+ tv_clear(&var1);
lp->ll_tv = &lp->ll_di->di_tv;
} else {
- /*
- * Get the number and item for the only or first index of the List.
- */
- if (empty1)
+ // Get the number and item for the only or first index of the List.
+ if (empty1) {
lp->ll_n1 = 0;
- else {
- lp->ll_n1 = get_tv_number(&var1); /* is number or string */
- clear_tv(&var1);
+ } else {
+ // Is number or string.
+ lp->ll_n1 = (long)tv_get_number(&var1);
}
+ tv_clear(&var1);
+
lp->ll_dict = NULL;
lp->ll_list = lp->ll_tv->vval.v_list;
- lp->ll_li = list_find(lp->ll_list, lp->ll_n1);
+ lp->ll_li = tv_list_find(lp->ll_list, lp->ll_n1);
if (lp->ll_li == NULL) {
if (lp->ll_n1 < 0) {
lp->ll_n1 = 0;
- lp->ll_li = list_find(lp->ll_list, lp->ll_n1);
+ lp->ll_li = tv_list_find(lp->ll_list, lp->ll_n1);
}
}
if (lp->ll_li == NULL) {
- if (lp->ll_range && !lp->ll_empty2)
- clear_tv(&var2);
- if (!quiet)
+ tv_clear(&var2);
+ if (!quiet) {
EMSGN(_(e_listidx), lp->ll_n1);
+ }
return NULL;
}
@@ -2222,35 +2290,40 @@ get_lval (
* Otherwise "lp->ll_n2" is set to the second index.
*/
if (lp->ll_range && !lp->ll_empty2) {
- lp->ll_n2 = get_tv_number(&var2); /* is number or string */
- clear_tv(&var2);
+ lp->ll_n2 = (long)tv_get_number(&var2); // Is number or string.
+ tv_clear(&var2);
if (lp->ll_n2 < 0) {
- ni = list_find(lp->ll_list, lp->ll_n2);
+ ni = tv_list_find(lp->ll_list, lp->ll_n2);
if (ni == NULL) {
if (!quiet)
EMSGN(_(e_listidx), lp->ll_n2);
return NULL;
}
- lp->ll_n2 = list_idx_of_item(lp->ll_list, ni);
+ lp->ll_n2 = tv_list_idx_of_item(lp->ll_list, ni);
}
- /* Check that lp->ll_n2 isn't before lp->ll_n1. */
- if (lp->ll_n1 < 0)
- lp->ll_n1 = list_idx_of_item(lp->ll_list, lp->ll_li);
+ // Check that lp->ll_n2 isn't before lp->ll_n1.
+ if (lp->ll_n1 < 0) {
+ lp->ll_n1 = tv_list_idx_of_item(lp->ll_list, lp->ll_li);
+ }
if (lp->ll_n2 < lp->ll_n1) {
- if (!quiet)
+ if (!quiet) {
EMSGN(_(e_listidx), lp->ll_n2);
+ }
return NULL;
}
}
- lp->ll_tv = &lp->ll_li->li_tv;
+ lp->ll_tv = TV_LIST_ITEM_TV(lp->ll_li);
}
}
+ tv_clear(&var1);
return p;
}
+// TODO(ZyX-I): move to eval/executor
+
/*
* Clear lval "lp" that was filled by get_lval().
*/
@@ -2260,281 +2333,159 @@ static void clear_lval(lval_T *lp)
xfree(lp->ll_newkey);
}
+// TODO(ZyX-I): move to eval/executor
+
/*
* Set a variable that was parsed by get_lval() to "rettv".
* "endp" points to just after the parsed name.
* "op" is NULL, "+" for "+=", "-" for "-=", "." for ".=" or "=" for "=".
*/
-static void set_var_lval(lval_T *lp, char_u *endp, typval_T *rettv, int copy, char_u *op)
+static void set_var_lval(lval_T *lp, char_u *endp, typval_T *rettv,
+ int copy, const char_u *op)
{
int cc;
listitem_T *ri;
dictitem_T *di;
if (lp->ll_tv == NULL) {
- if (!check_changedtick(lp->ll_name)) {
- cc = *endp;
- *endp = NUL;
- if (op != NULL && *op != '=') {
- typval_T tv;
-
- // handle +=, -= and .=
- di = NULL;
- if (get_var_tv(lp->ll_name, (int)STRLEN(lp->ll_name),
- &tv, &di, true, false) == OK) {
- if ((di == NULL
- || (!var_check_ro(di->di_flags, lp->ll_name, false)
- && !tv_check_lock(di->di_tv.v_lock, lp->ll_name, false)))
- && tv_op(&tv, rettv, op) == OK) {
- set_var(lp->ll_name, &tv, false);
- }
- clear_tv(&tv);
+ cc = *endp;
+ *endp = NUL;
+ if (op != NULL && *op != '=') {
+ typval_T tv;
+
+ // handle +=, -= and .=
+ di = NULL;
+ if (get_var_tv((const char *)lp->ll_name, (int)STRLEN(lp->ll_name),
+ &tv, &di, true, false) == OK) {
+ if ((di == NULL
+ || (!var_check_ro(di->di_flags, (const char *)lp->ll_name,
+ TV_CSTRING)
+ && !tv_check_lock(di->di_tv.v_lock, (const char *)lp->ll_name,
+ TV_CSTRING)))
+ && eexe_mod_op(&tv, rettv, (const char *)op) == OK) {
+ set_var(lp->ll_name, lp->ll_name_len, &tv, false);
}
- } else
- set_var(lp->ll_name, rettv, copy);
- *endp = cc;
+ tv_clear(&tv);
+ }
+ } else {
+ set_var(lp->ll_name, lp->ll_name_len, rettv, copy);
}
+ *endp = cc;
} else if (tv_check_lock(lp->ll_newkey == NULL
? lp->ll_tv->v_lock
: lp->ll_tv->vval.v_dict->dv_lock,
- lp->ll_name, false)) {
+ (const char *)lp->ll_name, TV_CSTRING)) {
} else if (lp->ll_range) {
listitem_T *ll_li = lp->ll_li;
int ll_n1 = lp->ll_n1;
// Check whether any of the list items is locked
- for (listitem_T *ri = rettv->vval.v_list->lv_first;
+ for (ri = tv_list_first(rettv->vval.v_list);
ri != NULL && ll_li != NULL; ) {
- if (tv_check_lock(ll_li->li_tv.v_lock, lp->ll_name, false)) {
+ if (tv_check_lock(TV_LIST_ITEM_TV(ll_li)->v_lock,
+ (const char *)lp->ll_name,
+ TV_CSTRING)) {
return;
}
- ri = ri->li_next;
+ ri = TV_LIST_ITEM_NEXT(rettv->vval.v_list, ri);
if (ri == NULL || (!lp->ll_empty2 && lp->ll_n2 == ll_n1)) {
break;
}
- ll_li = ll_li->li_next;
+ ll_li = TV_LIST_ITEM_NEXT(lp->ll_list, ll_li);
ll_n1++;
}
/*
* Assign the List values to the list items.
*/
- for (ri = rettv->vval.v_list->lv_first; ri != NULL; ) {
- if (op != NULL && *op != '=')
- tv_op(&lp->ll_li->li_tv, &ri->li_tv, op);
- else {
- clear_tv(&lp->ll_li->li_tv);
- copy_tv(&ri->li_tv, &lp->ll_li->li_tv);
+ for (ri = tv_list_first(rettv->vval.v_list); ri != NULL; ) {
+ if (op != NULL && *op != '=') {
+ eexe_mod_op(TV_LIST_ITEM_TV(lp->ll_li), TV_LIST_ITEM_TV(ri),
+ (const char *)op);
+ } else {
+ tv_clear(TV_LIST_ITEM_TV(lp->ll_li));
+ tv_copy(TV_LIST_ITEM_TV(ri), TV_LIST_ITEM_TV(lp->ll_li));
}
- ri = ri->li_next;
- if (ri == NULL || (!lp->ll_empty2 && lp->ll_n2 == lp->ll_n1))
+ ri = TV_LIST_ITEM_NEXT(rettv->vval.v_list, ri);
+ if (ri == NULL || (!lp->ll_empty2 && lp->ll_n2 == lp->ll_n1)) {
break;
- if (lp->ll_li->li_next == NULL) {
- /* Need to add an empty item. */
- list_append_number(lp->ll_list, 0);
- assert(lp->ll_li->li_next);
}
- lp->ll_li = lp->ll_li->li_next;
- ++lp->ll_n1;
+ assert(lp->ll_li != NULL);
+ if (TV_LIST_ITEM_NEXT(lp->ll_list, lp->ll_li) == NULL) {
+ // Need to add an empty item.
+ tv_list_append_number(lp->ll_list, 0);
+ // ll_li may have become invalid after append, donโ€™t use it.
+ lp->ll_li = tv_list_last(lp->ll_list); // Valid again.
+ } else {
+ lp->ll_li = TV_LIST_ITEM_NEXT(lp->ll_list, lp->ll_li);
+ }
+ lp->ll_n1++;
}
- if (ri != NULL)
+ if (ri != NULL) {
EMSG(_("E710: List value has more items than target"));
- else if (lp->ll_empty2
- ? (lp->ll_li != NULL && lp->ll_li->li_next != NULL)
- : lp->ll_n1 != lp->ll_n2)
+ } else if (lp->ll_empty2
+ ? (lp->ll_li != NULL
+ && TV_LIST_ITEM_NEXT(lp->ll_list, lp->ll_li) != NULL)
+ : lp->ll_n1 != lp->ll_n2) {
EMSG(_("E711: List value has not enough items"));
+ }
} else {
- typval_T oldtv;
+ typval_T oldtv = TV_INITIAL_VALUE;
dict_T *dict = lp->ll_dict;
- bool watched = is_watched(dict);
+ bool watched = tv_dict_is_watched(dict);
- if (watched) {
- init_tv(&oldtv);
- }
-
- /*
- * Assign to a List or Dictionary item.
- */
+ // Assign to a List or Dictionary item.
if (lp->ll_newkey != NULL) {
if (op != NULL && *op != '=') {
EMSG2(_(e_letwrong), op);
return;
}
- /* Need to add an item to the Dictionary. */
- di = dictitem_alloc(lp->ll_newkey);
- if (dict_add(lp->ll_tv->vval.v_dict, di) == FAIL) {
+ // Need to add an item to the Dictionary.
+ di = tv_dict_item_alloc((const char *)lp->ll_newkey);
+ if (tv_dict_add(lp->ll_tv->vval.v_dict, di) == FAIL) {
xfree(di);
return;
}
lp->ll_tv = &di->di_tv;
} else {
if (watched) {
- copy_tv(lp->ll_tv, &oldtv);
+ tv_copy(lp->ll_tv, &oldtv);
}
if (op != NULL && *op != '=') {
- tv_op(lp->ll_tv, rettv, op);
+ eexe_mod_op(lp->ll_tv, rettv, (const char *)op);
goto notify;
} else {
- clear_tv(lp->ll_tv);
+ tv_clear(lp->ll_tv);
}
}
// Assign the value to the variable or list item.
if (copy) {
- copy_tv(rettv, lp->ll_tv);
+ tv_copy(rettv, lp->ll_tv);
} else {
*lp->ll_tv = *rettv;
lp->ll_tv->v_lock = 0;
- init_tv(rettv);
+ tv_init(rettv);
}
notify:
if (watched) {
if (oldtv.v_type == VAR_UNKNOWN) {
- dictwatcher_notify(dict, (char *)lp->ll_newkey, lp->ll_tv, NULL);
+ assert(lp->ll_newkey != NULL);
+ tv_dict_watcher_notify(dict, (char *)lp->ll_newkey, lp->ll_tv, NULL);
} else {
- dictitem_T *di = lp->ll_di;
- dictwatcher_notify(dict, (char *)di->di_key, lp->ll_tv, &oldtv);
- clear_tv(&oldtv);
+ dictitem_T *di_ = lp->ll_di;
+ assert(di_->di_key != NULL);
+ tv_dict_watcher_notify(dict, (char *)di_->di_key, lp->ll_tv, &oldtv);
+ tv_clear(&oldtv);
}
}
}
}
-/*
- * Handle "tv1 += tv2", "tv1 -= tv2" and "tv1 .= tv2"
- * Returns OK or FAIL.
- */
-static int tv_op(typval_T *tv1, typval_T *tv2, char_u *op)
-{
- long n;
- char_u numbuf[NUMBUFLEN];
- char_u *s;
-
- // Can't do anything with a Funcref, a Dict or special value on the right.
- if (tv2->v_type != VAR_FUNC && tv2->v_type != VAR_DICT) {
- switch (tv1->v_type) {
- case VAR_DICT:
- case VAR_FUNC:
- case VAR_SPECIAL:
- break;
-
- case VAR_LIST:
- if (*op != '+' || tv2->v_type != VAR_LIST)
- break;
- /* List += List */
- if (tv1->vval.v_list != NULL && tv2->vval.v_list != NULL)
- list_extend(tv1->vval.v_list, tv2->vval.v_list, NULL);
- return OK;
-
- case VAR_NUMBER:
- case VAR_STRING:
- if (tv2->v_type == VAR_LIST)
- break;
- if (*op == '+' || *op == '-') {
- /* nr += nr or nr -= nr*/
- n = get_tv_number(tv1);
- if (tv2->v_type == VAR_FLOAT) {
- float_T f = n;
-
- if (*op == '+')
- f += tv2->vval.v_float;
- else
- f -= tv2->vval.v_float;
- clear_tv(tv1);
- tv1->v_type = VAR_FLOAT;
- tv1->vval.v_float = f;
- } else {
- if (*op == '+')
- n += get_tv_number(tv2);
- else
- n -= get_tv_number(tv2);
- clear_tv(tv1);
- tv1->v_type = VAR_NUMBER;
- tv1->vval.v_number = n;
- }
- } else {
- if (tv2->v_type == VAR_FLOAT)
- break;
-
- /* str .= str */
- s = get_tv_string(tv1);
- s = concat_str(s, get_tv_string_buf(tv2, numbuf));
- clear_tv(tv1);
- tv1->v_type = VAR_STRING;
- tv1->vval.v_string = s;
- }
- return OK;
-
- case VAR_FLOAT:
- {
- float_T f;
-
- if (*op == '.' || (tv2->v_type != VAR_FLOAT
- && tv2->v_type != VAR_NUMBER
- && tv2->v_type != VAR_STRING))
- break;
- if (tv2->v_type == VAR_FLOAT)
- f = tv2->vval.v_float;
- else
- f = get_tv_number(tv2);
- if (*op == '+')
- tv1->vval.v_float += f;
- else
- tv1->vval.v_float -= f;
- }
- return OK;
-
- case VAR_UNKNOWN:
- assert(false);
- }
- }
-
- EMSG2(_(e_letwrong), op);
- return FAIL;
-}
-
-/*
- * Add a watcher to a list.
- */
-void list_add_watch(list_T *l, listwatch_T *lw)
-{
- lw->lw_next = l->lv_watch;
- l->lv_watch = lw;
-}
-
-/*
- * Remove a watcher from a list.
- * No warning when it isn't found...
- */
-void list_rem_watch(list_T *l, listwatch_T *lwrem)
-{
- listwatch_T *lw, **lwp;
-
- lwp = &l->lv_watch;
- for (lw = l->lv_watch; lw != NULL; lw = lw->lw_next) {
- if (lw == lwrem) {
- *lwp = lw->lw_next;
- break;
- }
- lwp = &lw->lw_next;
- }
-}
-
-/*
- * Just before removing an item from a list: advance watchers to the next
- * item.
- */
-static void list_fix_watch(list_T *l, listitem_T *item)
-{
- listwatch_T *lw;
-
- for (lw = l->lv_watch; lw != NULL; lw = lw->lw_next)
- if (lw->lw_item == item)
- lw->lw_item = item->li_next;
-}
+// TODO(ZyX-I): move to eval/ex_cmds
/*
* Evaluate the expression used in a ":for var in expr" command.
@@ -2542,14 +2493,14 @@ static void list_fix_watch(list_T *l, listitem_T *item)
* Set "*errp" to TRUE for an error, FALSE otherwise;
* Return a pointer that holds the info. Null when there is an error.
*/
-void *eval_for_line(char_u *arg, int *errp, char_u **nextcmdp, int skip)
+void *eval_for_line(const char_u *arg, bool *errp, char_u **nextcmdp, int skip)
{
forinfo_T *fi = xcalloc(1, sizeof(forinfo_T));
- char_u *expr;
+ const char_u *expr;
typval_T tv;
list_T *l;
- *errp = TRUE; /* default: there is an error */
+ *errp = true; // Default: there is an error.
expr = skip_var_list(arg, &fi->fi_varcount, &fi->fi_semicolon);
if (expr == NULL)
@@ -2564,18 +2515,21 @@ void *eval_for_line(char_u *arg, int *errp, char_u **nextcmdp, int skip)
if (skip)
++emsg_skip;
if (eval0(skipwhite(expr + 2), &tv, nextcmdp, !skip) == OK) {
- *errp = FALSE;
+ *errp = false;
if (!skip) {
l = tv.vval.v_list;
- if (tv.v_type != VAR_LIST || l == NULL) {
+ if (tv.v_type != VAR_LIST) {
EMSG(_(e_listreq));
- clear_tv(&tv);
+ tv_clear(&tv);
+ } else if (l == NULL) {
+ // a null list is like an empty list: do nothing
+ tv_clear(&tv);
} else {
/* No need to increment the refcount, it's already set for the
* list being used in "tv". */
fi->fi_list = l;
- list_add_watch(l, &fi->fi_lw);
- fi->fi_lw.lw_item = l->lv_first;
+ tv_list_watch_add(l, &fi->fi_lw);
+ fi->fi_lw.lw_item = tv_list_first(l);
}
}
}
@@ -2585,29 +2539,30 @@ void *eval_for_line(char_u *arg, int *errp, char_u **nextcmdp, int skip)
return fi;
}
+// TODO(ZyX-I): move to eval/ex_cmds
+
/*
* Use the first item in a ":for" list. Advance to the next.
* Assign the values to the variable (list). "arg" points to the first one.
* Return TRUE when a valid item was found, FALSE when at end of list or
* something wrong.
*/
-int next_for_item(void *fi_void, char_u *arg)
+bool next_for_item(void *fi_void, char_u *arg)
{
- forinfo_T *fi = (forinfo_T *)fi_void;
- int result;
- listitem_T *item;
+ forinfo_T *fi = (forinfo_T *)fi_void;
- item = fi->fi_lw.lw_item;
- if (item == NULL)
- result = FALSE;
- else {
- fi->fi_lw.lw_item = item->li_next;
- result = (ex_let_vars(arg, &item->li_tv, TRUE,
- fi->fi_semicolon, fi->fi_varcount, NULL) == OK);
+ listitem_T *item = fi->fi_lw.lw_item;
+ if (item == NULL) {
+ return false;
+ } else {
+ fi->fi_lw.lw_item = TV_LIST_ITEM_NEXT(fi->fi_list, item);
+ return (ex_let_vars(arg, TV_LIST_ITEM_TV(item), true,
+ fi->fi_semicolon, fi->fi_varcount, NULL) == OK);
}
- return result;
}
+// TODO(ZyX-I): move to eval/ex_cmds
+
/*
* Free the structure used to store info used by ":for".
*/
@@ -2616,8 +2571,8 @@ void free_for_info(void *fi_void)
forinfo_T *fi = (forinfo_T *)fi_void;
if (fi != NULL && fi->fi_list != NULL) {
- list_rem_watch(fi->fi_list, &fi->fi_lw);
- list_unref(fi->fi_list);
+ tv_list_watch_remove(fi->fi_list, &fi->fi_lw);
+ tv_list_unref(fi->fi_list);
}
xfree(fi);
}
@@ -2635,9 +2590,10 @@ void set_context_for_expression(expand_T *xp, char_u *arg, cmdidx_T cmdidx)
/* ":let var1 var2 ...": find last space. */
for (p = arg + STRLEN(arg); p >= arg; ) {
xp->xp_pattern = p;
- mb_ptr_back(arg, p);
- if (ascii_iswhite(*p))
+ MB_PTR_BACK(arg, p);
+ if (ascii_iswhite(*p)) {
break;
+ }
}
return;
}
@@ -2665,6 +2621,10 @@ void set_context_for_expression(expand_T *xp, char_u *arg, cmdidx_T cmdidx)
} else if (c == '=') {
got_eq = TRUE;
xp->xp_context = EXPAND_EXPRESSION;
+ } else if (c == '#'
+ && xp->xp_context == EXPAND_EXPRESSION) {
+ // Autoload function/variable contains '#'
+ break;
} else if ((c == '<' || c == '#')
&& xp->xp_context == EXPAND_FUNCTIONS
&& vim_strchr(xp->xp_pattern, '(') == NULL) {
@@ -2701,6 +2661,7 @@ void set_context_for_expression(expand_T *xp, char_u *arg, cmdidx_T cmdidx)
xp->xp_pattern = arg;
}
+// TODO(ZyX-I): move to eval/ex_cmds
/*
* ":1,25call func(arg1, arg2)" function call.
@@ -2715,107 +2676,114 @@ void ex_call(exarg_T *eap)
typval_T rettv;
linenr_T lnum;
int doesrange;
- int failed = FALSE;
+ bool failed = false;
funcdict_T fudi;
+ partial_T *partial = NULL;
if (eap->skip) {
- /* trans_function_name() doesn't work well when skipping, use eval0()
- * instead to skip to any following command, e.g. for:
- * :if 0 | call dict.foo().bar() | endif */
- ++emsg_skip;
- if (eval0(eap->arg, &rettv, &eap->nextcmd, FALSE) != FAIL)
- clear_tv(&rettv);
- --emsg_skip;
+ // trans_function_name() doesn't work well when skipping, use eval0()
+ // instead to skip to any following command, e.g. for:
+ // :if 0 | call dict.foo().bar() | endif.
+ emsg_skip++;
+ if (eval0(eap->arg, &rettv, &eap->nextcmd, false) != FAIL) {
+ tv_clear(&rettv);
+ }
+ emsg_skip--;
return;
}
- tofree = trans_function_name(&arg, eap->skip, TFN_INT, &fudi);
+ tofree = trans_function_name(&arg, false, TFN_INT, &fudi, &partial);
if (fudi.fd_newkey != NULL) {
- /* Still need to give an error message for missing key. */
+ // Still need to give an error message for missing key.
EMSG2(_(e_dictkey), fudi.fd_newkey);
xfree(fudi.fd_newkey);
}
- if (tofree == NULL)
+ if (tofree == NULL) {
return;
+ }
- /* Increase refcount on dictionary, it could get deleted when evaluating
- * the arguments. */
- if (fudi.fd_dict != NULL)
- ++fudi.fd_dict->dv_refcount;
+ // Increase refcount on dictionary, it could get deleted when evaluating
+ // the arguments.
+ if (fudi.fd_dict != NULL) {
+ fudi.fd_dict->dv_refcount++;
+ }
- /* If it is the name of a variable of type VAR_FUNC use its contents. */
+ // If it is the name of a variable of type VAR_FUNC or VAR_PARTIAL use its
+ // contents. For VAR_PARTIAL get its partial, unless we already have one
+ // from trans_function_name().
len = (int)STRLEN(tofree);
- name = deref_func_name(tofree, &len, FALSE);
+ name = deref_func_name((const char *)tofree, &len,
+ partial != NULL ? NULL : &partial, false);
- /* Skip white space to allow ":call func ()". Not good, but required for
- * backward compatibility. */
+ // Skip white space to allow ":call func ()". Not good, but required for
+ // backward compatibility.
startarg = skipwhite(arg);
- rettv.v_type = VAR_UNKNOWN; /* clear_tv() uses this */
+ rettv.v_type = VAR_UNKNOWN; // tv_clear() uses this.
if (*startarg != '(') {
EMSG2(_("E107: Missing parentheses: %s"), eap->arg);
goto end;
}
- /*
- * When skipping, evaluate the function once, to find the end of the
- * arguments.
- * When the function takes a range, this is discovered after the first
- * call, and the loop is broken.
- */
- if (eap->skip) {
- ++emsg_skip;
- lnum = eap->line2; /* do it once, also with an invalid range */
- } else
- lnum = eap->line1;
- for (; lnum <= eap->line2; ++lnum) {
- if (!eap->skip && eap->addr_count > 0) {
+ lnum = eap->line1;
+ for (; lnum <= eap->line2; lnum++) {
+ if (eap->addr_count > 0) { // -V560
+ if (lnum > curbuf->b_ml.ml_line_count) {
+ // If the function deleted lines or switched to another buffer
+ // the line number may become invalid.
+ EMSG(_(e_invrange));
+ break;
+ }
curwin->w_cursor.lnum = lnum;
curwin->w_cursor.col = 0;
curwin->w_cursor.coladd = 0;
}
arg = startarg;
if (get_func_tv(name, (int)STRLEN(name), &rettv, &arg,
- eap->line1, eap->line2, &doesrange,
- !eap->skip, fudi.fd_dict) == FAIL) {
- failed = TRUE;
+ eap->line1, eap->line2, &doesrange,
+ true, partial, fudi.fd_dict) == FAIL) {
+ failed = true;
break;
}
- /* Handle a function returning a Funcref, Dictionary or List. */
- if (handle_subscript(&arg, &rettv, !eap->skip, TRUE) == FAIL) {
- failed = TRUE;
+ // Handle a function returning a Funcref, Dictionary or List.
+ if (handle_subscript((const char **)&arg, &rettv, true, true)
+ == FAIL) {
+ failed = true;
break;
}
- clear_tv(&rettv);
- if (doesrange || eap->skip)
+ tv_clear(&rettv);
+ if (doesrange) {
break;
+ }
- /* Stop when immediately aborting on error, or when an interrupt
- * occurred or an exception was thrown but not caught.
- * get_func_tv() returned OK, so that the check for trailing
- * characters below is executed. */
- if (aborting())
+ // Stop when immediately aborting on error, or when an interrupt
+ // occurred or an exception was thrown but not caught.
+ // get_func_tv() returned OK, so that the check for trailing
+ // characters below is executed.
+ if (aborting()) {
break;
+ }
}
- if (eap->skip)
- --emsg_skip;
if (!failed) {
- /* Check for trailing illegal characters and a following command. */
+ // Check for trailing illegal characters and a following command.
if (!ends_excmd(*arg)) {
emsg_severe = TRUE;
EMSG(_(e_trailing));
- } else
+ } else {
eap->nextcmd = check_nextcmd(arg);
+ }
}
end:
- dict_unref(fudi.fd_dict);
+ tv_dict_unref(fudi.fd_dict);
xfree(tofree);
}
+// TODO(ZyX-I): move to eval/ex_cmds
+
/*
* ":unlet[!] var1 ... " command.
*/
@@ -2824,6 +2792,8 @@ void ex_unlet(exarg_T *eap)
ex_unletlock(eap, eap->arg, 0);
}
+// TODO(ZyX-I): move to eval/ex_cmds
+
/*
* ":lockvar" and ":unlockvar" commands
*/
@@ -2842,22 +2812,37 @@ void ex_lockvar(exarg_T *eap)
ex_unletlock(eap, arg, deep);
}
+// TODO(ZyX-I): move to eval/ex_cmds
+
/*
* ":unlet", ":lockvar" and ":unlockvar" are quite similar.
*/
static void ex_unletlock(exarg_T *eap, char_u *argstart, int deep)
{
char_u *arg = argstart;
- char_u *name_end;
- int error = FALSE;
+ bool error = false;
lval_T lv;
do {
- /* Parse the name and find the end. */
- name_end = get_lval(arg, NULL, &lv, TRUE, eap->skip || error, 0,
- FNE_CHECK_START);
- if (lv.ll_name == NULL)
- error = TRUE; /* error but continue parsing */
+ if (*arg == '$') {
+ const char *name = (char *)++arg;
+
+ if (get_env_len((const char_u **)&arg) == 0) {
+ EMSG2(_(e_invarg2), name - 1);
+ return;
+ }
+ os_unsetenv(name);
+ arg = skipwhite(arg);
+ continue;
+ }
+
+ // Parse the name and find the end.
+ char_u *const name_end = (char_u *)get_lval(arg, NULL, &lv, true,
+ eap->skip || error,
+ 0, FNE_CHECK_START);
+ if (lv.ll_name == NULL) {
+ error = true; // error, but continue parsing.
+ }
if (name_end == NULL || (!ascii_iswhite(*name_end)
&& !ends_excmd(*name_end))) {
if (name_end != NULL) {
@@ -2875,8 +2860,9 @@ static void ex_unletlock(exarg_T *eap, char_u *argstart, int deep)
error = TRUE;
} else {
if (do_lock_var(&lv, name_end, deep,
- eap->cmdidx == CMD_lockvar) == FAIL)
- error = TRUE;
+ eap->cmdidx == CMD_lockvar) == FAIL) {
+ error = true;
+ }
}
}
@@ -2889,7 +2875,9 @@ static void ex_unletlock(exarg_T *eap, char_u *argstart, int deep)
eap->nextcmd = check_nextcmd(arg);
}
-static int do_unlet_var(lval_T *lp, char_u *name_end, int forceit)
+// TODO(ZyX-I): move to eval/ex_cmds
+
+static int do_unlet_var(lval_T *const lp, char_u *const name_end, int forceit)
{
int ret = OK;
int cc;
@@ -2898,61 +2886,67 @@ static int do_unlet_var(lval_T *lp, char_u *name_end, int forceit)
cc = *name_end;
*name_end = NUL;
- /* Normal name or expanded name. */
- if (check_changedtick(lp->ll_name))
- ret = FAIL;
- else if (do_unlet(lp->ll_name, forceit) == FAIL)
+ // Normal name or expanded name.
+ if (do_unlet(lp->ll_name, lp->ll_name_len, forceit) == FAIL) {
ret = FAIL;
+ }
*name_end = cc;
} else if ((lp->ll_list != NULL
- && tv_check_lock(lp->ll_list->lv_lock, lp->ll_name, false))
+ // ll_list is not NULL when lvalue is not in a list, NULL lists
+ // yield E689.
+ && tv_check_lock(tv_list_locked(lp->ll_list),
+ (const char *)lp->ll_name,
+ lp->ll_name_len))
|| (lp->ll_dict != NULL
- && tv_check_lock(lp->ll_dict->dv_lock, lp->ll_name, false))) {
+ && tv_check_lock(lp->ll_dict->dv_lock,
+ (const char *)lp->ll_name,
+ lp->ll_name_len))) {
return FAIL;
} else if (lp->ll_range) {
- listitem_T *li;
- listitem_T *ll_li = lp->ll_li;
- int ll_n1 = lp->ll_n1;
-
- while (ll_li != NULL && (lp->ll_empty2 || lp->ll_n2 >= ll_n1)) {
- li = ll_li->li_next;
- if (tv_check_lock(ll_li->li_tv.v_lock, lp->ll_name, false)) {
+ assert(lp->ll_list != NULL);
+ // Delete a range of List items.
+ listitem_T *const first_li = lp->ll_li;
+ listitem_T *last_li = first_li;
+ for (;;) {
+ listitem_T *const li = TV_LIST_ITEM_NEXT(lp->ll_list, lp->ll_li);
+ if (tv_check_lock(TV_LIST_ITEM_TV(lp->ll_li)->v_lock,
+ (const char *)lp->ll_name,
+ lp->ll_name_len)) {
return false;
}
- ll_li = li;
- ll_n1++;
- }
-
- /* Delete a range of List items. */
- while (lp->ll_li != NULL && (lp->ll_empty2 || lp->ll_n2 >= lp->ll_n1)) {
- li = lp->ll_li->li_next;
- listitem_remove(lp->ll_list, lp->ll_li);
lp->ll_li = li;
- ++lp->ll_n1;
+ lp->ll_n1++;
+ if (lp->ll_li == NULL || (!lp->ll_empty2 && lp->ll_n2 < lp->ll_n1)) {
+ break;
+ } else {
+ last_li = lp->ll_li;
+ }
}
+ tv_list_remove_items(lp->ll_list, first_li, last_li);
} else {
if (lp->ll_list != NULL) {
// unlet a List item.
- listitem_remove(lp->ll_list, lp->ll_li);
+ tv_list_item_remove(lp->ll_list, lp->ll_li);
} else {
// unlet a Dictionary item.
dict_T *d = lp->ll_dict;
+ assert(d != NULL);
dictitem_T *di = lp->ll_di;
- bool watched = is_watched(d);
+ bool watched = tv_dict_is_watched(d);
char *key = NULL;
typval_T oldtv;
if (watched) {
- copy_tv(&di->di_tv, &oldtv);
+ tv_copy(&di->di_tv, &oldtv);
// need to save key because dictitem_remove will free it
key = xstrdup((char *)di->di_key);
}
- dictitem_remove(d, di);
+ tv_dict_item_remove(d, di);
if (watched) {
- dictwatcher_notify(d, key, NULL, &oldtv);
- clear_tv(&oldtv);
+ tv_dict_watcher_notify(d, key, NULL, &oldtv);
+ tv_clear(&oldtv);
xfree(key);
}
}
@@ -2961,21 +2955,24 @@ static int do_unlet_var(lval_T *lp, char_u *name_end, int forceit)
return ret;
}
-/*
- * "unlet" a variable. Return OK if it existed, FAIL if not.
- * When "forceit" is TRUE don't complain if the variable doesn't exist.
- */
-int do_unlet(char_u *name, int forceit)
+// TODO(ZyX-I): move to eval/ex_cmds
+
+/// unlet a variable
+///
+/// @param[in] name Variable name to unlet.
+/// @param[in] name_len Variable name length.
+/// @param[in] fonceit If true, do not complain if variable doesnโ€™t exist.
+///
+/// @return OK if it existed, FAIL otherwise.
+int do_unlet(const char *const name, const size_t name_len, const int forceit)
+ FUNC_ATTR_NONNULL_ALL
{
- hashtab_T *ht;
- hashitem_T *hi;
- char_u *varname;
- dict_T *d;
- dictitem_T *di;
+ const char *varname;
dict_T *dict;
- ht = find_var_ht_dict(name, &varname, &dict);
+ hashtab_T *ht = find_var_ht_dict(name, name_len, &varname, &dict);
if (ht != NULL && *varname != NUL) {
+ dict_T *d;
if (ht == &globvarht) {
d = &globvardict;
} else if (current_funccal != NULL
@@ -2984,38 +2981,41 @@ int do_unlet(char_u *name, int forceit)
} else if (ht == &compat_hashtab) {
d = &vimvardict;
} else {
- di = find_var_in_ht(ht, *name, (char_u *)"", false);
+ dictitem_T *const di = find_var_in_ht(ht, *name, "", 0, false);
d = di->di_tv.vval.v_dict;
}
if (d == NULL) {
- EMSG2(_(e_intern2), "do_unlet()");
+ internal_error("do_unlet()");
return FAIL;
}
- hi = hash_find(ht, varname);
- if (!HASHITEM_EMPTY(hi)) {
- di = HI2DI(hi);
- if (var_check_fixed(di->di_flags, name, false)
- || var_check_ro(di->di_flags, name, false)
- || tv_check_lock(d->dv_lock, name, false)) {
+ hashitem_T *hi = hash_find(ht, (const char_u *)varname);
+ if (HASHITEM_EMPTY(hi)) {
+ hi = find_hi_in_scoped_ht((const char *)name, &ht);
+ }
+ if (hi != NULL && !HASHITEM_EMPTY(hi)) {
+ dictitem_T *const di = TV_DICT_HI2DI(hi);
+ if (var_check_fixed(di->di_flags, (const char *)name, TV_CSTRING)
+ || var_check_ro(di->di_flags, (const char *)name, TV_CSTRING)
+ || tv_check_lock(d->dv_lock, (const char *)name, TV_CSTRING)) {
return FAIL;
}
- if (d == NULL || tv_check_lock(d->dv_lock, name, false)) {
+ if (tv_check_lock(d->dv_lock, (const char *)name, TV_CSTRING)) {
return FAIL;
}
typval_T oldtv;
- bool watched = is_watched(dict);
+ bool watched = tv_dict_is_watched(dict);
if (watched) {
- copy_tv(&di->di_tv, &oldtv);
+ tv_copy(&di->di_tv, &oldtv);
}
delete_var(ht, hi);
if (watched) {
- dictwatcher_notify(dict, (char *)varname, NULL, &oldtv);
- clear_tv(&oldtv);
+ tv_dict_watcher_notify(dict, varname, NULL, &oldtv);
+ tv_clear(&oldtv);
}
return OK;
}
@@ -3026,161 +3026,74 @@ int do_unlet(char_u *name, int forceit)
return FAIL;
}
+// TODO(ZyX-I): move to eval/ex_cmds
+
/*
* Lock or unlock variable indicated by "lp".
* "deep" is the levels to go (-1 for unlimited);
* "lock" is TRUE for ":lockvar", FALSE for ":unlockvar".
*/
-static int do_lock_var(lval_T *lp, char_u *name_end, int deep, int lock)
+static int do_lock_var(lval_T *lp, char_u *const name_end, const int deep,
+ const bool lock)
{
int ret = OK;
- int cc;
- dictitem_T *di;
- if (deep == 0) /* nothing to do */
+ if (deep == 0) { // Nothing to do.
return OK;
+ }
if (lp->ll_tv == NULL) {
- cc = *name_end;
- *name_end = NUL;
-
- /* Normal name or expanded name. */
- if (check_changedtick(lp->ll_name))
+ // Normal name or expanded name.
+ dictitem_T *const di = find_var(
+ (const char *)lp->ll_name, lp->ll_name_len, NULL,
+ true);
+ if (di == NULL) {
ret = FAIL;
- else {
- di = find_var(lp->ll_name, NULL, TRUE);
- if (di == NULL)
- ret = FAIL;
- else {
- if (lock)
- di->di_flags |= DI_FLAGS_LOCK;
- else
- di->di_flags &= ~DI_FLAGS_LOCK;
- item_lock(&di->di_tv, deep, lock);
+ } else if ((di->di_flags & DI_FLAGS_FIX)
+ && di->di_tv.v_type != VAR_DICT
+ && di->di_tv.v_type != VAR_LIST) {
+ // For historical reasons this error is not given for Lists and
+ // Dictionaries. E.g. b: dictionary may be locked/unlocked.
+ emsgf(_("E940: Cannot lock or unlock variable %s"), lp->ll_name);
+ } else {
+ if (lock) {
+ di->di_flags |= DI_FLAGS_LOCK;
+ } else {
+ di->di_flags &= ~DI_FLAGS_LOCK;
}
+ tv_item_lock(&di->di_tv, deep, lock);
}
- *name_end = cc;
} else if (lp->ll_range) {
listitem_T *li = lp->ll_li;
/* (un)lock a range of List items. */
while (li != NULL && (lp->ll_empty2 || lp->ll_n2 >= lp->ll_n1)) {
- item_lock(&li->li_tv, deep, lock);
- li = li->li_next;
- ++lp->ll_n1;
+ tv_item_lock(TV_LIST_ITEM_TV(li), deep, lock);
+ li = TV_LIST_ITEM_NEXT(lp->ll_list, li);
+ lp->ll_n1++;
}
} else if (lp->ll_list != NULL) {
// (un)lock a List item.
- item_lock(&lp->ll_li->li_tv, deep, lock);
+ tv_item_lock(TV_LIST_ITEM_TV(lp->ll_li), deep, lock);
} else {
// (un)lock a Dictionary item.
- item_lock(&lp->ll_di->di_tv, deep, lock);
+ tv_item_lock(&lp->ll_di->di_tv, deep, lock);
}
return ret;
}
/*
- * Lock or unlock an item. "deep" is nr of levels to go.
- */
-static void item_lock(typval_T *tv, int deep, int lock)
-{
- static int recurse = 0;
- list_T *l;
- listitem_T *li;
- dict_T *d;
- hashitem_T *hi;
- int todo;
-
- if (recurse >= DICT_MAXNEST) {
- EMSG(_("E743: variable nested too deep for (un)lock"));
- return;
- }
- if (deep == 0)
- return;
- ++recurse;
-
- /* lock/unlock the item itself */
- if (lock)
- tv->v_lock |= VAR_LOCKED;
- else
- tv->v_lock &= ~VAR_LOCKED;
-
- switch (tv->v_type) {
- case VAR_LIST:
- if ((l = tv->vval.v_list) != NULL) {
- if (lock)
- l->lv_lock |= VAR_LOCKED;
- else
- l->lv_lock &= ~VAR_LOCKED;
- if (deep < 0 || deep > 1)
- /* recursive: lock/unlock the items the List contains */
- for (li = l->lv_first; li != NULL; li = li->li_next)
- item_lock(&li->li_tv, deep - 1, lock);
- }
- break;
- case VAR_DICT:
- if ((d = tv->vval.v_dict) != NULL) {
- if (lock)
- d->dv_lock |= VAR_LOCKED;
- else
- d->dv_lock &= ~VAR_LOCKED;
- if (deep < 0 || deep > 1) {
- /* recursive: lock/unlock the items the List contains */
- todo = (int)d->dv_hashtab.ht_used;
- for (hi = d->dv_hashtab.ht_array; todo > 0; ++hi) {
- if (!HASHITEM_EMPTY(hi)) {
- --todo;
- item_lock(&HI2DI(hi)->di_tv, deep - 1, lock);
- }
- }
- }
- }
- break;
- case VAR_NUMBER:
- case VAR_FLOAT:
- case VAR_STRING:
- case VAR_FUNC:
- case VAR_SPECIAL:
- break;
- case VAR_UNKNOWN:
- assert(false);
- }
- --recurse;
-}
-
-/*
- * Return TRUE if typeval "tv" is locked: Either that value is locked itself
- * or it refers to a List or Dictionary that is locked.
- */
-static int tv_islocked(typval_T *tv)
-{
- return (tv->v_lock & VAR_LOCKED)
- || (tv->v_type == VAR_LIST
- && tv->vval.v_list != NULL
- && (tv->vval.v_list->lv_lock & VAR_LOCKED))
- || (tv->v_type == VAR_DICT
- && tv->vval.v_dict != NULL
- && (tv->vval.v_dict->dv_lock & VAR_LOCKED));
-}
-
-/*
* Delete all "menutrans_" variables.
*/
void del_menutrans_vars(void)
{
- hashitem_T *hi;
- int todo;
-
hash_lock(&globvarht);
- todo = (int)globvarht.ht_used;
- for (hi = globvarht.ht_array; todo > 0 && !got_int; ++hi) {
- if (!HASHITEM_EMPTY(hi)) {
- --todo;
- if (STRNCMP(HI2DI(hi)->di_key, "menutrans_", 10) == 0)
- delete_var(&globvarht, hi);
+ HASHTAB_ITER(&globvarht, hi, {
+ if (STRNCMP(hi->hi_key, "menutrans_", 10) == 0) {
+ delete_var(&globvarht, hi);
}
- }
+ });
hash_unlock(&globvarht);
}
@@ -3256,10 +3169,6 @@ char_u *get_user_var_name(expand_T *xp, int idx)
++hi;
return cat_prefix_varname('b', hi->hi_key);
}
- if (bdone == ht->ht_used) {
- ++bdone;
- return (char_u *)"b:changedtick";
- }
/* w: variables */
ht = &curwin->w_vars->dv_hashtab;
@@ -3296,6 +3205,27 @@ char_u *get_user_var_name(expand_T *xp, int idx)
return NULL;
}
+// TODO(ZyX-I): move to eval/expressions
+
+/// Return TRUE if "pat" matches "text".
+/// Does not use 'cpo' and always uses 'magic'.
+static int pattern_match(char_u *pat, char_u *text, int ic)
+{
+ int matches = 0;
+ regmatch_T regmatch;
+
+ // avoid 'l' flag in 'cpoptions'
+ char_u *save_cpo = p_cpo;
+ p_cpo = (char_u *)"";
+ regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING);
+ if (regmatch.regprog != NULL) {
+ regmatch.rm_ic = ic;
+ matches = vim_regexec_nl(&regmatch, text, (colnr_T)0);
+ vim_regfree(regmatch.regprog);
+ }
+ p_cpo = save_cpo;
+ return matches;
+}
/*
* types for expressions.
@@ -3312,6 +3242,8 @@ typedef enum {
, TYPE_NOMATCH /* !~ */
} exptype_T;
+// TODO(ZyX-I): move to eval/expressions
+
/*
* The "evaluate" argument: When FALSE, the argument is only parsed but not
* executed. The function may return OK, but the rettv will be of type
@@ -3325,7 +3257,7 @@ typedef enum {
* Note: "rettv.v_lock" is not set.
* Return OK or FAIL.
*/
-static int eval0(char_u *arg, typval_T *rettv, char_u **nextcmd, int evaluate)
+int eval0(char_u *arg, typval_T *rettv, char_u **nextcmd, int evaluate)
{
int ret;
char_u *p;
@@ -3333,15 +3265,15 @@ static int eval0(char_u *arg, typval_T *rettv, char_u **nextcmd, int evaluate)
p = skipwhite(arg);
ret = eval1(&p, rettv, evaluate);
if (ret == FAIL || !ends_excmd(*p)) {
- if (ret != FAIL)
- clear_tv(rettv);
- /*
- * Report the invalid expression unless the expression evaluation has
- * been cancelled due to an aborting error, an interrupt, or an
- * exception.
- */
- if (!aborting())
- EMSG2(_(e_invexpr2), arg);
+ if (ret != FAIL) {
+ tv_clear(rettv);
+ }
+ // Report the invalid expression unless the expression evaluation has
+ // been cancelled due to an aborting error, an interrupt, or an
+ // exception.
+ if (!aborting()) {
+ emsgf(_(e_invexpr2), arg);
+ }
ret = FAIL;
}
if (nextcmd != NULL)
@@ -3350,6 +3282,8 @@ static int eval0(char_u *arg, typval_T *rettv, char_u **nextcmd, int evaluate)
return ret;
}
+// TODO(ZyX-I): move to eval/expressions
+
/*
* Handle top level expression:
* expr2 ? expr1 : expr1
@@ -3375,13 +3309,15 @@ static int eval1(char_u **arg, typval_T *rettv, int evaluate)
if ((*arg)[0] == '?') {
result = FALSE;
if (evaluate) {
- int error = FALSE;
+ bool error = false;
- if (get_tv_number_chk(rettv, &error) != 0)
- result = TRUE;
- clear_tv(rettv);
- if (error)
+ if (tv_get_number_chk(rettv, &error) != 0) {
+ result = true;
+ }
+ tv_clear(rettv);
+ if (error) {
return FAIL;
+ }
}
/*
@@ -3396,8 +3332,9 @@ static int eval1(char_u **arg, typval_T *rettv, int evaluate)
*/
if ((*arg)[0] != ':') {
EMSG(_("E109: Missing ':' after '?'"));
- if (evaluate && result)
- clear_tv(rettv);
+ if (evaluate && result) {
+ tv_clear(rettv);
+ }
return FAIL;
}
@@ -3405,9 +3342,10 @@ static int eval1(char_u **arg, typval_T *rettv, int evaluate)
* Get the third variable.
*/
*arg = skipwhite(*arg + 1);
- if (eval1(arg, &var2, evaluate && !result) == FAIL) { /* recursive! */
- if (evaluate && result)
- clear_tv(rettv);
+ if (eval1(arg, &var2, evaluate && !result) == FAIL) { // Recursive!
+ if (evaluate && result) {
+ tv_clear(rettv);
+ }
return FAIL;
}
if (evaluate && !result)
@@ -3417,6 +3355,8 @@ static int eval1(char_u **arg, typval_T *rettv, int evaluate)
return OK;
}
+// TODO(ZyX-I): move to eval/expressions
+
/*
* Handle first level expression:
* expr2 || expr2 || expr2 logical OR
@@ -3431,7 +3371,7 @@ static int eval2(char_u **arg, typval_T *rettv, int evaluate)
typval_T var2;
long result;
int first;
- int error = FALSE;
+ bool error = false;
/*
* Get the first variable.
@@ -3446,12 +3386,14 @@ static int eval2(char_u **arg, typval_T *rettv, int evaluate)
result = FALSE;
while ((*arg)[0] == '|' && (*arg)[1] == '|') {
if (evaluate && first) {
- if (get_tv_number_chk(rettv, &error) != 0)
- result = TRUE;
- clear_tv(rettv);
- if (error)
+ if (tv_get_number_chk(rettv, &error) != 0) {
+ result = true;
+ }
+ tv_clear(rettv);
+ if (error) {
return FAIL;
- first = FALSE;
+ }
+ first = false;
}
/*
@@ -3465,11 +3407,13 @@ static int eval2(char_u **arg, typval_T *rettv, int evaluate)
* Compute the result.
*/
if (evaluate && !result) {
- if (get_tv_number_chk(&var2, &error) != 0)
- result = TRUE;
- clear_tv(&var2);
- if (error)
+ if (tv_get_number_chk(&var2, &error) != 0) {
+ result = true;
+ }
+ tv_clear(&var2);
+ if (error) {
return FAIL;
+ }
}
if (evaluate) {
rettv->v_type = VAR_NUMBER;
@@ -3480,6 +3424,8 @@ static int eval2(char_u **arg, typval_T *rettv, int evaluate)
return OK;
}
+// TODO(ZyX-I): move to eval/expressions
+
/*
* Handle second level expression:
* expr3 && expr3 && expr3 logical AND
@@ -3494,7 +3440,7 @@ static int eval3(char_u **arg, typval_T *rettv, int evaluate)
typval_T var2;
long result;
int first;
- int error = FALSE;
+ bool error = false;
/*
* Get the first variable.
@@ -3509,12 +3455,14 @@ static int eval3(char_u **arg, typval_T *rettv, int evaluate)
result = TRUE;
while ((*arg)[0] == '&' && (*arg)[1] == '&') {
if (evaluate && first) {
- if (get_tv_number_chk(rettv, &error) == 0)
- result = FALSE;
- clear_tv(rettv);
- if (error)
+ if (tv_get_number_chk(rettv, &error) == 0) {
+ result = false;
+ }
+ tv_clear(rettv);
+ if (error) {
return FAIL;
- first = FALSE;
+ }
+ first = false;
}
/*
@@ -3528,11 +3476,13 @@ static int eval3(char_u **arg, typval_T *rettv, int evaluate)
* Compute the result.
*/
if (evaluate && result) {
- if (get_tv_number_chk(&var2, &error) == 0)
- result = FALSE;
- clear_tv(&var2);
- if (error)
+ if (tv_get_number_chk(&var2, &error) == 0) {
+ result = false;
+ }
+ tv_clear(&var2);
+ if (error) {
return FAIL;
+ }
}
if (evaluate) {
rettv->v_type = VAR_NUMBER;
@@ -3543,6 +3493,8 @@ static int eval3(char_u **arg, typval_T *rettv, int evaluate)
return OK;
}
+// TODO(ZyX-I): move to eval/expressions
+
/*
* Handle third level expression:
* var1 == var2
@@ -3569,12 +3521,8 @@ static int eval4(char_u **arg, typval_T *rettv, int evaluate)
exptype_T type = TYPE_UNKNOWN;
int type_is = FALSE; /* TRUE for "is" and "isnot" */
int len = 2;
- long n1, n2;
- char_u *s1, *s2;
- char_u buf1[NUMBUFLEN], buf2[NUMBUFLEN];
- regmatch_T regmatch;
+ varnumber_T n1, n2;
int ic;
- char_u *save_cpo;
/*
* Get the first variable.
@@ -3641,7 +3589,7 @@ static int eval4(char_u **arg, typval_T *rettv, int evaluate)
*/
*arg = skipwhite(p + len);
if (eval5(arg, &var2, evaluate) == FAIL) {
- clear_tv(rettv);
+ tv_clear(rettv);
return FAIL;
}
@@ -3663,15 +3611,15 @@ static int eval4(char_u **arg, typval_T *rettv, int evaluate)
} else {
EMSG(_("E692: Invalid operation for List"));
}
- clear_tv(rettv);
- clear_tv(&var2);
+ tv_clear(rettv);
+ tv_clear(&var2);
return FAIL;
} else {
- /* Compare two Lists for being equal or unequal. */
- n1 = list_equal(rettv->vval.v_list, var2.vval.v_list,
- ic, FALSE);
- if (type == TYPE_NEQUAL)
+ // Compare two Lists for being equal or unequal.
+ n1 = tv_list_equal(rettv->vval.v_list, var2.vval.v_list, ic, false);
+ if (type == TYPE_NEQUAL) {
n1 = !n1;
+ }
}
} else if (rettv->v_type == VAR_DICT || var2.v_type == VAR_DICT) {
if (type_is) {
@@ -3685,36 +3633,46 @@ static int eval4(char_u **arg, typval_T *rettv, int evaluate)
EMSG(_("E735: Can only compare Dictionary with Dictionary"));
else
EMSG(_("E736: Invalid operation for Dictionary"));
- clear_tv(rettv);
- clear_tv(&var2);
+ tv_clear(rettv);
+ tv_clear(&var2);
return FAIL;
} else {
- /* Compare two Dictionaries for being equal or unequal. */
- n1 = dict_equal(rettv->vval.v_dict, var2.vval.v_dict,
- ic, FALSE);
- if (type == TYPE_NEQUAL)
+ // Compare two Dictionaries for being equal or unequal.
+ n1 = tv_dict_equal(rettv->vval.v_dict, var2.vval.v_dict,
+ ic, false);
+ if (type == TYPE_NEQUAL) {
n1 = !n1;
+ }
}
- } else if (rettv->v_type == VAR_FUNC || var2.v_type == VAR_FUNC) {
- if (rettv->v_type != var2.v_type
- || (type != TYPE_EQUAL && type != TYPE_NEQUAL)) {
- if (rettv->v_type != var2.v_type)
- EMSG(_("E693: Can only compare Funcref with Funcref"));
- else
- EMSG(_("E694: Invalid operation for Funcrefs"));
- clear_tv(rettv);
- clear_tv(&var2);
+ } else if (tv_is_func(*rettv) || tv_is_func(var2)) {
+ if (type != TYPE_EQUAL && type != TYPE_NEQUAL) {
+ EMSG(_("E694: Invalid operation for Funcrefs"));
+ tv_clear(rettv);
+ tv_clear(&var2);
return FAIL;
+ }
+ if ((rettv->v_type == VAR_PARTIAL
+ && rettv->vval.v_partial == NULL)
+ || (var2.v_type == VAR_PARTIAL
+ && var2.vval.v_partial == NULL)) {
+ // when a partial is NULL assume not equal
+ n1 = false;
+ } else if (type_is) {
+ if (rettv->v_type == VAR_FUNC && var2.v_type == VAR_FUNC) {
+ // strings are considered the same if their value is
+ // the same
+ n1 = tv_equal(rettv, &var2, ic, false);
+ } else if (rettv->v_type == VAR_PARTIAL
+ && var2.v_type == VAR_PARTIAL) {
+ n1 = (rettv->vval.v_partial == var2.vval.v_partial);
+ } else {
+ n1 = false;
+ }
} else {
- /* Compare two Funcrefs for being equal or unequal. */
- if (rettv->vval.v_string == NULL
- || var2.vval.v_string == NULL)
- n1 = FALSE;
- else
- n1 = STRCMP(rettv->vval.v_string,
- var2.vval.v_string) == 0;
- if (type == TYPE_NEQUAL)
- n1 = !n1;
+ n1 = tv_equal(rettv, &var2, ic, false);
+ }
+ if (type == TYPE_NEQUAL) {
+ n1 = !n1;
}
}
/*
@@ -3725,25 +3683,27 @@ static int eval4(char_u **arg, typval_T *rettv, int evaluate)
&& type != TYPE_MATCH && type != TYPE_NOMATCH) {
float_T f1, f2;
- if (rettv->v_type == VAR_FLOAT)
+ if (rettv->v_type == VAR_FLOAT) {
f1 = rettv->vval.v_float;
- else
- f1 = get_tv_number(rettv);
- if (var2.v_type == VAR_FLOAT)
+ } else {
+ f1 = tv_get_number(rettv);
+ }
+ if (var2.v_type == VAR_FLOAT) {
f2 = var2.vval.v_float;
- else
- f2 = get_tv_number(&var2);
- n1 = FALSE;
+ } else {
+ f2 = tv_get_number(&var2);
+ }
+ n1 = false;
switch (type) {
- case TYPE_EQUAL: n1 = (f1 == f2); break;
- case TYPE_NEQUAL: n1 = (f1 != f2); break;
- case TYPE_GREATER: n1 = (f1 > f2); break;
- case TYPE_GEQUAL: n1 = (f1 >= f2); break;
- case TYPE_SMALLER: n1 = (f1 < f2); break;
- case TYPE_SEQUAL: n1 = (f1 <= f2); break;
- case TYPE_UNKNOWN:
- case TYPE_MATCH:
- case TYPE_NOMATCH: break; /* avoid gcc warning */
+ case TYPE_EQUAL: n1 = (f1 == f2); break;
+ case TYPE_NEQUAL: n1 = (f1 != f2); break;
+ case TYPE_GREATER: n1 = (f1 > f2); break;
+ case TYPE_GEQUAL: n1 = (f1 >= f2); break;
+ case TYPE_SMALLER: n1 = (f1 < f2); break;
+ case TYPE_SEQUAL: n1 = (f1 <= f2); break;
+ case TYPE_UNKNOWN:
+ case TYPE_MATCH:
+ case TYPE_NOMATCH: break;
}
}
/*
@@ -3752,57 +3712,51 @@ static int eval4(char_u **arg, typval_T *rettv, int evaluate)
*/
else if ((rettv->v_type == VAR_NUMBER || var2.v_type == VAR_NUMBER)
&& type != TYPE_MATCH && type != TYPE_NOMATCH) {
- n1 = get_tv_number(rettv);
- n2 = get_tv_number(&var2);
+ n1 = tv_get_number(rettv);
+ n2 = tv_get_number(&var2);
switch (type) {
- case TYPE_EQUAL: n1 = (n1 == n2); break;
- case TYPE_NEQUAL: n1 = (n1 != n2); break;
- case TYPE_GREATER: n1 = (n1 > n2); break;
- case TYPE_GEQUAL: n1 = (n1 >= n2); break;
- case TYPE_SMALLER: n1 = (n1 < n2); break;
- case TYPE_SEQUAL: n1 = (n1 <= n2); break;
- case TYPE_UNKNOWN:
- case TYPE_MATCH:
- case TYPE_NOMATCH: break; /* avoid gcc warning */
+ case TYPE_EQUAL: n1 = (n1 == n2); break;
+ case TYPE_NEQUAL: n1 = (n1 != n2); break;
+ case TYPE_GREATER: n1 = (n1 > n2); break;
+ case TYPE_GEQUAL: n1 = (n1 >= n2); break;
+ case TYPE_SMALLER: n1 = (n1 < n2); break;
+ case TYPE_SEQUAL: n1 = (n1 <= n2); break;
+ case TYPE_UNKNOWN:
+ case TYPE_MATCH:
+ case TYPE_NOMATCH: break;
}
} else {
- s1 = get_tv_string_buf(rettv, buf1);
- s2 = get_tv_string_buf(&var2, buf2);
- if (type != TYPE_MATCH && type != TYPE_NOMATCH)
- i = ic ? mb_stricmp(s1, s2) : STRCMP(s1, s2);
- else
+ char buf1[NUMBUFLEN];
+ char buf2[NUMBUFLEN];
+ const char *const s1 = tv_get_string_buf(rettv, buf1);
+ const char *const s2 = tv_get_string_buf(&var2, buf2);
+ if (type != TYPE_MATCH && type != TYPE_NOMATCH) {
+ i = mb_strcmp_ic((bool)ic, s1, s2);
+ } else {
i = 0;
- n1 = FALSE;
+ }
+ n1 = false;
switch (type) {
- case TYPE_EQUAL: n1 = (i == 0); break;
- case TYPE_NEQUAL: n1 = (i != 0); break;
- case TYPE_GREATER: n1 = (i > 0); break;
- case TYPE_GEQUAL: n1 = (i >= 0); break;
- case TYPE_SMALLER: n1 = (i < 0); break;
- case TYPE_SEQUAL: n1 = (i <= 0); break;
-
- case TYPE_MATCH:
- case TYPE_NOMATCH:
- /* avoid 'l' flag in 'cpoptions' */
- save_cpo = p_cpo;
- p_cpo = (char_u *)"";
- regmatch.regprog = vim_regcomp(s2,
- RE_MAGIC + RE_STRING);
- regmatch.rm_ic = ic;
- if (regmatch.regprog != NULL) {
- n1 = vim_regexec_nl(&regmatch, s1, (colnr_T)0);
- vim_regfree(regmatch.regprog);
- if (type == TYPE_NOMATCH)
+ case TYPE_EQUAL: n1 = (i == 0); break;
+ case TYPE_NEQUAL: n1 = (i != 0); break;
+ case TYPE_GREATER: n1 = (i > 0); break;
+ case TYPE_GEQUAL: n1 = (i >= 0); break;
+ case TYPE_SMALLER: n1 = (i < 0); break;
+ case TYPE_SEQUAL: n1 = (i <= 0); break;
+
+ case TYPE_MATCH:
+ case TYPE_NOMATCH: {
+ n1 = pattern_match((char_u *)s2, (char_u *)s1, ic);
+ if (type == TYPE_NOMATCH) {
n1 = !n1;
+ }
+ break;
}
- p_cpo = save_cpo;
- break;
-
- case TYPE_UNKNOWN: break; /* avoid gcc warning */
+ case TYPE_UNKNOWN: break; // Avoid gcc warning.
}
}
- clear_tv(rettv);
- clear_tv(&var2);
+ tv_clear(rettv);
+ tv_clear(&var2);
rettv->v_type = VAR_NUMBER;
rettv->vval.v_number = n1;
}
@@ -3811,6 +3765,8 @@ static int eval4(char_u **arg, typval_T *rettv, int evaluate)
return OK;
}
+// TODO(ZyX-I): move to eval/expressions
+
/*
* Handle fourth level expression:
* + number addition
@@ -3827,10 +3783,8 @@ static int eval5(char_u **arg, typval_T *rettv, int evaluate)
typval_T var2;
typval_T var3;
int op;
- long n1, n2;
+ varnumber_T n1, n2;
float_T f1 = 0, f2 = 0;
- char_u *s1, *s2;
- char_u buf1[NUMBUFLEN], buf2[NUMBUFLEN];
char_u *p;
/*
@@ -3848,17 +3802,16 @@ static int eval5(char_u **arg, typval_T *rettv, int evaluate)
break;
if ((op != '+' || rettv->v_type != VAR_LIST)
- && (op == '.' || rettv->v_type != VAR_FLOAT)
- ) {
- /* For "list + ...", an illegal use of the first operand as
- * a number cannot be determined before evaluating the 2nd
- * operand: if this is also a list, all is ok.
- * For "something . ...", "something - ..." or "non-list + ...",
- * we know that the first operand needs to be a string or number
- * without evaluating the 2nd operand. So check before to avoid
- * side effects after an error. */
- if (evaluate && get_tv_string_chk(rettv) == NULL) {
- clear_tv(rettv);
+ && (op == '.' || rettv->v_type != VAR_FLOAT)) {
+ // For "list + ...", an illegal use of the first operand as
+ // a number cannot be determined before evaluating the 2nd
+ // operand: if this is also a list, all is ok.
+ // For "something . ...", "something - ..." or "non-list + ...",
+ // we know that the first operand needs to be a string or number
+ // without evaluating the 2nd operand. So check before to avoid
+ // side effects after an error.
+ if (evaluate && !tv_check_str(rettv)) {
+ tv_clear(rettv);
return FAIL;
}
}
@@ -3868,7 +3821,7 @@ static int eval5(char_u **arg, typval_T *rettv, int evaluate)
*/
*arg = skipwhite(*arg + 1);
if (eval6(arg, &var2, evaluate, op == '.') == FAIL) {
- clear_tv(rettv);
+ tv_clear(rettv);
return FAIL;
}
@@ -3877,41 +3830,44 @@ static int eval5(char_u **arg, typval_T *rettv, int evaluate)
* Compute the result.
*/
if (op == '.') {
- s1 = get_tv_string_buf(rettv, buf1); /* already checked */
- s2 = get_tv_string_buf_chk(&var2, buf2);
- if (s2 == NULL) { /* type error ? */
- clear_tv(rettv);
- clear_tv(&var2);
+ char buf1[NUMBUFLEN];
+ char buf2[NUMBUFLEN];
+ // s1 already checked
+ const char *const s1 = tv_get_string_buf(rettv, buf1);
+ const char *const s2 = tv_get_string_buf_chk(&var2, buf2);
+ if (s2 == NULL) { // Type error?
+ tv_clear(rettv);
+ tv_clear(&var2);
return FAIL;
}
- p = concat_str(s1, s2);
- clear_tv(rettv);
+ p = concat_str((const char_u *)s1, (const char_u *)s2);
+ tv_clear(rettv);
rettv->v_type = VAR_STRING;
rettv->vval.v_string = p;
} else if (op == '+' && rettv->v_type == VAR_LIST
&& var2.v_type == VAR_LIST) {
- /* concatenate Lists */
- if (list_concat(rettv->vval.v_list, var2.vval.v_list,
- &var3) == FAIL) {
- clear_tv(rettv);
- clear_tv(&var2);
+ // Concatenate Lists.
+ if (tv_list_concat(rettv->vval.v_list, var2.vval.v_list, &var3)
+ == FAIL) {
+ tv_clear(rettv);
+ tv_clear(&var2);
return FAIL;
}
- clear_tv(rettv);
+ tv_clear(rettv);
*rettv = var3;
} else {
- int error = FALSE;
+ bool error = false;
if (rettv->v_type == VAR_FLOAT) {
f1 = rettv->vval.v_float;
n1 = 0;
} else {
- n1 = get_tv_number_chk(rettv, &error);
+ n1 = tv_get_number_chk(rettv, &error);
if (error) {
/* This can only happen for "list + non-list". For
* "non-list + ..." or "something - ...", we returned
* before evaluating the 2nd operand. */
- clear_tv(rettv);
+ tv_clear(rettv);
return FAIL;
}
if (var2.v_type == VAR_FLOAT)
@@ -3921,16 +3877,16 @@ static int eval5(char_u **arg, typval_T *rettv, int evaluate)
f2 = var2.vval.v_float;
n2 = 0;
} else {
- n2 = get_tv_number_chk(&var2, &error);
+ n2 = tv_get_number_chk(&var2, &error);
if (error) {
- clear_tv(rettv);
- clear_tv(&var2);
+ tv_clear(rettv);
+ tv_clear(&var2);
return FAIL;
}
if (rettv->v_type == VAR_FLOAT)
f2 = n2;
}
- clear_tv(rettv);
+ tv_clear(rettv);
/* If there is a float on either side the result is a float. */
if (rettv->v_type == VAR_FLOAT || var2.v_type == VAR_FLOAT) {
@@ -3949,37 +3905,36 @@ static int eval5(char_u **arg, typval_T *rettv, int evaluate)
rettv->vval.v_number = n1;
}
}
- clear_tv(&var2);
+ tv_clear(&var2);
}
}
return OK;
}
-/*
- * Handle fifth level expression:
- * * number multiplication
- * / number division
- * % number modulo
- *
- * "arg" must point to the first non-white of the expression.
- * "arg" is advanced to the next non-white after the recognized expression.
- *
- * Return OK or FAIL.
- */
-static int
-eval6 (
- char_u **arg,
- typval_T *rettv,
- int evaluate,
- int want_string /* after "." operator */
-)
+// TODO(ZyX-I): move to eval/expressions
+
+/// Handle fifth level expression:
+/// - * number multiplication
+/// - / number division
+/// - % number modulo
+///
+/// @param[in,out] arg Points to the first non-whitespace character of the
+/// expression. Is advanced to the next non-whitespace
+/// character after the recognized expression.
+/// @param[out] rettv Location where result is saved.
+/// @param[in] evaluate If not true, rettv is not populated.
+/// @param[in] want_string True if "." is string_concatenation, otherwise
+/// float
+/// @return OK or FAIL.
+static int eval6(char_u **arg, typval_T *rettv, int evaluate, int want_string)
+ FUNC_ATTR_NO_SANITIZE_UNDEFINED
{
typval_T var2;
int op;
- long n1, n2;
- int use_float = FALSE;
+ varnumber_T n1, n2;
+ bool use_float = false;
float_T f1 = 0, f2;
- int error = FALSE;
+ bool error = false;
/*
* Get the first variable.
@@ -3998,15 +3953,18 @@ eval6 (
if (evaluate) {
if (rettv->v_type == VAR_FLOAT) {
f1 = rettv->vval.v_float;
- use_float = TRUE;
+ use_float = true;
n1 = 0;
- } else
- n1 = get_tv_number_chk(rettv, &error);
- clear_tv(rettv);
- if (error)
+ } else {
+ n1 = tv_get_number_chk(rettv, &error);
+ }
+ tv_clear(rettv);
+ if (error) {
return FAIL;
- } else
+ }
+ } else {
n1 = 0;
+ }
/*
* Get the second variable.
@@ -4019,17 +3977,19 @@ eval6 (
if (var2.v_type == VAR_FLOAT) {
if (!use_float) {
f1 = n1;
- use_float = TRUE;
+ use_float = true;
}
f2 = var2.vval.v_float;
n2 = 0;
} else {
- n2 = get_tv_number_chk(&var2, &error);
- clear_tv(&var2);
- if (error)
+ n2 = tv_get_number_chk(&var2, &error);
+ tv_clear(&var2);
+ if (error) {
return FAIL;
- if (use_float)
+ }
+ if (use_float) {
f2 = n2;
+ }
}
/*
@@ -4060,18 +4020,20 @@ eval6 (
rettv->v_type = VAR_FLOAT;
rettv->vval.v_float = f1;
} else {
- if (op == '*')
+ if (op == '*') {
n1 = n1 * n2;
- else if (op == '/') {
- if (n2 == 0) { /* give an error message? */
- if (n1 == 0)
- n1 = -0x7fffffffL - 1L; /* similar to NaN */
- else if (n1 < 0)
- n1 = -0x7fffffffL;
- else
- n1 = 0x7fffffffL;
- } else
+ } else if (op == '/') {
+ if (n2 == 0) { // give an error message?
+ if (n1 == 0) {
+ n1 = VARNUMBER_MIN; // similar to NaN
+ } else if (n1 < 0) {
+ n1 = -VARNUMBER_MAX;
+ } else {
+ n1 = VARNUMBER_MAX;
+ }
+ } else {
n1 = n1 / n2;
+ }
} else {
if (n2 == 0) /* give an error message? */
n1 = 0;
@@ -4087,6 +4049,8 @@ eval6 (
return OK;
}
+// TODO(ZyX-I): move to eval/expressions
+
// Handle sixth level expression:
// number number constant
// "string" string constant
@@ -4118,18 +4082,18 @@ static int eval7(
int want_string // after "." operator
)
{
- long n;
+ varnumber_T n;
int len;
char_u *s;
char_u *start_leader, *end_leader;
int ret = OK;
char_u *alias;
- // Initialise variable so that clear_tv() can't mistake this for a
+ // Initialise variable so that tv_clear() can't mistake this for a
// string and free a string that isn't there.
rettv->v_type = VAR_UNKNOWN;
- // Skip '!' and '-' characters. They are handled later.
+ // Skip '!', '-' and '+' characters. They are handled later.
start_leader = *arg;
while (**arg == '!' || **arg == '-' || **arg == '+') {
*arg = skipwhite(*arg + 1);
@@ -4206,14 +4170,19 @@ static int eval7(
case '[': ret = get_list_tv(arg, rettv, evaluate);
break;
+ // Lambda: {arg, arg -> expr}
// Dictionary: {key: val, key: val}
- case '{': ret = get_dict_tv(arg, rettv, evaluate);
+ case '{': ret = get_lambda_tv(arg, rettv, evaluate);
+ if (ret == NOTDONE) {
+ ret = get_dict_tv(arg, rettv, evaluate);
+ }
break;
// Option value: &name
- case '&': ret = get_option_tv(arg, rettv, evaluate);
+ case '&': {
+ ret = get_option_tv((const char **)arg, rettv, evaluate);
break;
-
+ }
// Environment variable: $VAR.
case '$': ret = get_env_tv(arg, rettv, evaluate);
break;
@@ -4236,7 +4205,7 @@ static int eval7(
++*arg;
} else if (ret == OK) {
EMSG(_("E110: Missing ')'"));
- clear_tv(rettv);
+ tv_clear(rettv);
ret = FAIL;
}
break;
@@ -4249,7 +4218,7 @@ static int eval7(
// Must be a variable or function name.
// Can also be a curly-braces kind of name: {expr}.
s = *arg;
- len = get_name_len(arg, &alias, evaluate, true);
+ len = get_name_len((const char **)arg, (char **)&alias, evaluate, true);
if (alias != NULL) {
s = alias;
}
@@ -4258,20 +4227,32 @@ static int eval7(
ret = FAIL;
} else {
if (**arg == '(') { // recursive!
+ partial_T *partial;
+
+ if (!evaluate) {
+ check_vars((const char *)s, len);
+ }
+
// If "s" is the name of a variable of type VAR_FUNC
// use its contents.
- s = deref_func_name(s, &len, !evaluate);
+ s = deref_func_name((const char *)s, &len, &partial, !evaluate);
+
+ // Need to make a copy, in case evaluating the arguments makes
+ // the name invalid.
+ s = xmemdupz(s, len);
// Invoke the function.
ret = get_func_tv(s, len, rettv, arg,
- curwin->w_cursor.lnum, curwin->w_cursor.lnum,
- &len, evaluate, NULL);
+ curwin->w_cursor.lnum, curwin->w_cursor.lnum,
+ &len, evaluate, partial, NULL);
+
+ xfree(s);
// If evaluate is false rettv->v_type was not set in
// get_func_tv, but it's needed in handle_subscript() to parse
// what follows. So set it here.
if (rettv->v_type == VAR_UNKNOWN && !evaluate && **arg == '(') {
- rettv->vval.v_string = empty_string;
+ rettv->vval.v_string = (char_u *)tv_empty_string;
rettv->v_type = VAR_FUNC;
}
@@ -4280,13 +4261,14 @@ static int eval7(
// an exception was thrown but not caught.
if (aborting()) {
if (ret == OK) {
- clear_tv(rettv);
+ tv_clear(rettv);
}
ret = FAIL;
}
} else if (evaluate) {
- ret = get_var_tv(s, len, rettv, NULL, true, false);
+ ret = get_var_tv((const char *)s, len, rettv, NULL, true, false);
} else {
+ check_vars((const char *)s, len);
ret = OK;
}
}
@@ -4298,22 +4280,22 @@ static int eval7(
// Handle following '[', '(' and '.' for expr[expr], expr.name,
// expr(expr).
if (ret == OK) {
- ret = handle_subscript(arg, rettv, evaluate, true);
+ ret = handle_subscript((const char **)arg, rettv, evaluate, true);
}
// Apply logical NOT and unary '-', from right to left, ignore '+'.
if (ret == OK && evaluate && end_leader > start_leader) {
- int error = false;
- int val = 0;
+ bool error = false;
+ varnumber_T val = 0;
float_T f = 0.0;
if (rettv->v_type == VAR_FLOAT) {
f = rettv->vval.v_float;
} else {
- val = get_tv_number_chk(rettv, &error);
+ val = tv_get_number_chk(rettv, &error);
}
if (error) {
- clear_tv(rettv);
+ tv_clear(rettv);
ret = FAIL;
} else {
while (end_leader > start_leader) {
@@ -4333,10 +4315,10 @@ static int eval7(
}
}
if (rettv->v_type == VAR_FLOAT) {
- clear_tv(rettv);
+ tv_clear(rettv);
rettv->vval.v_float = f;
} else {
- clear_tv(rettv);
+ tv_clear(rettv);
rettv->v_type = VAR_NUMBER;
rettv->vval.v_number = val;
}
@@ -4346,29 +4328,31 @@ static int eval7(
return ret;
}
+// TODO(ZyX-I): move to eval/expressions
+
/*
* Evaluate an "[expr]" or "[expr:expr]" index. Also "dict.key".
* "*arg" points to the '[' or '.'.
* Returns FAIL or OK. "*arg" is advanced to after the ']'.
*/
-static int
-eval_index (
+static int
+eval_index(
char_u **arg,
typval_T *rettv,
int evaluate,
int verbose /* give error messages */
)
{
- int empty1 = FALSE, empty2 = FALSE;
- typval_T var1, var2;
+ bool empty1 = false;
+ bool empty2 = false;
long n1, n2 = 0;
- long len = -1;
- int range = FALSE;
- char_u *s;
+ ptrdiff_t len = -1;
+ int range = false;
char_u *key = NULL;
switch (rettv->v_type) {
- case VAR_FUNC: {
+ case VAR_FUNC:
+ case VAR_PARTIAL: {
if (verbose) {
EMSG(_("E695: Cannot index a Funcref"));
}
@@ -4390,7 +4374,7 @@ eval_index (
if (evaluate) {
return FAIL;
}
- // fallthrough
+ FALLTHROUGH;
}
case VAR_STRING:
case VAR_NUMBER:
@@ -4400,8 +4384,8 @@ eval_index (
}
}
- init_tv(&var1);
- init_tv(&var2);
+ typval_T var1 = TV_INITIAL_VALUE;
+ typval_T var2 = TV_INITIAL_VALUE;
if (**arg == '.') {
/*
* dict.name
@@ -4419,13 +4403,13 @@ eval_index (
* Get the (first) variable from inside the [].
*/
*arg = skipwhite(*arg + 1);
- if (**arg == ':')
- empty1 = TRUE;
- else if (eval1(arg, &var1, evaluate) == FAIL) /* recursive! */
+ if (**arg == ':') {
+ empty1 = true;
+ } else if (eval1(arg, &var1, evaluate) == FAIL) { // Recursive!
return FAIL;
- else if (evaluate && get_tv_string_chk(&var1) == NULL) {
- /* not a number or string */
- clear_tv(&var1);
+ } else if (evaluate && !tv_check_str(&var1)) {
+ // Not a number or string.
+ tv_clear(&var1);
return FAIL;
}
@@ -4435,28 +4419,32 @@ eval_index (
if (**arg == ':') {
range = TRUE;
*arg = skipwhite(*arg + 1);
- if (**arg == ']')
- empty2 = TRUE;
- else if (eval1(arg, &var2, evaluate) == FAIL) { /* recursive! */
- if (!empty1)
- clear_tv(&var1);
+ if (**arg == ']') {
+ empty2 = true;
+ } else if (eval1(arg, &var2, evaluate) == FAIL) { // Recursive!
+ if (!empty1) {
+ tv_clear(&var1);
+ }
return FAIL;
- } else if (evaluate && get_tv_string_chk(&var2) == NULL) {
- /* not a number or string */
- if (!empty1)
- clear_tv(&var1);
- clear_tv(&var2);
+ } else if (evaluate && !tv_check_str(&var2)) {
+ // Not a number or string.
+ if (!empty1) {
+ tv_clear(&var1);
+ }
+ tv_clear(&var2);
return FAIL;
}
}
/* Check for the ']'. */
if (**arg != ']') {
- if (verbose)
+ if (verbose) {
EMSG(_(e_missbrac));
- clear_tv(&var1);
- if (range)
- clear_tv(&var2);
+ }
+ tv_clear(&var1);
+ if (range) {
+ tv_clear(&var2);
+ }
return FAIL;
}
*arg = skipwhite(*arg + 1); /* skip the ']' */
@@ -4465,169 +4453,179 @@ eval_index (
if (evaluate) {
n1 = 0;
if (!empty1 && rettv->v_type != VAR_DICT) {
- n1 = get_tv_number(&var1);
- clear_tv(&var1);
+ n1 = tv_get_number(&var1);
+ tv_clear(&var1);
}
if (range) {
- if (empty2)
+ if (empty2) {
n2 = -1;
- else {
- n2 = get_tv_number(&var2);
- clear_tv(&var2);
+ } else {
+ n2 = tv_get_number(&var2);
+ tv_clear(&var2);
}
}
switch (rettv->v_type) {
- case VAR_NUMBER:
- case VAR_STRING:
- s = get_tv_string(rettv);
- len = (long)STRLEN(s);
- if (range) {
- /* The resulting variable is a substring. If the indexes
- * are out of range the result is empty. */
+ case VAR_NUMBER:
+ case VAR_STRING: {
+ const char *const s = tv_get_string(rettv);
+ char *v;
+ len = (ptrdiff_t)strlen(s);
+ if (range) {
+ // The resulting variable is a substring. If the indexes
+ // are out of range the result is empty.
+ if (n1 < 0) {
+ n1 = len + n1;
+ if (n1 < 0) {
+ n1 = 0;
+ }
+ }
+ if (n2 < 0) {
+ n2 = len + n2;
+ } else if (n2 >= len) {
+ n2 = len;
+ }
+ if (n1 >= len || n2 < 0 || n1 > n2) {
+ v = NULL;
+ } else {
+ v = xmemdupz(s + n1, (size_t)(n2 - n1 + 1));
+ }
+ } else {
+ // The resulting variable is a string of a single
+ // character. If the index is too big or negative the
+ // result is empty.
+ if (n1 >= len || n1 < 0) {
+ v = NULL;
+ } else {
+ v = xmemdupz(s + n1, 1);
+ }
+ }
+ tv_clear(rettv);
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = (char_u *)v;
+ break;
+ }
+ case VAR_LIST: {
+ len = tv_list_len(rettv->vval.v_list);
if (n1 < 0) {
n1 = len + n1;
- if (n1 < 0)
- n1 = 0;
}
- if (n2 < 0)
- n2 = len + n2;
- else if (n2 >= len)
- n2 = len;
- if (n1 >= len || n2 < 0 || n1 > n2)
- s = NULL;
- else
- s = vim_strnsave(s + n1, (int)(n2 - n1 + 1));
- } else {
- /* The resulting variable is a string of a single
- * character. If the index is too big or negative the
- * result is empty. */
- if (n1 >= len || n1 < 0)
- s = NULL;
- else
- s = vim_strnsave(s + n1, 1);
- }
- clear_tv(rettv);
- rettv->v_type = VAR_STRING;
- rettv->vval.v_string = s;
- break;
-
- case VAR_LIST:
- len = list_len(rettv->vval.v_list);
- if (n1 < 0)
- n1 = len + n1;
- if (!empty1 && (n1 < 0 || n1 >= len)) {
- /* For a range we allow invalid values and return an empty
- * list. A list index out of range is an error. */
- if (!range) {
- if (verbose)
- EMSGN(_(e_listidx), n1);
- return FAIL;
+ if (!empty1 && (n1 < 0 || n1 >= len)) {
+ // For a range we allow invalid values and return an empty
+ // list. A list index out of range is an error.
+ if (!range) {
+ if (verbose) {
+ EMSGN(_(e_listidx), n1);
+ }
+ return FAIL;
+ }
+ n1 = len;
}
- n1 = len;
- }
- if (range) {
- list_T *l;
- listitem_T *item;
-
- if (n2 < 0)
- n2 = len + n2;
- else if (n2 >= len)
- n2 = len - 1;
- if (!empty2 && (n2 < 0 || n2 + 1 < n1))
- n2 = -1;
- l = list_alloc();
- item = list_find(rettv->vval.v_list, n1);
- while (n1++ <= n2) {
- list_append_tv(l, &item->li_tv);
- item = item->li_next;
+ if (range) {
+ list_T *l;
+ listitem_T *item;
+
+ if (n2 < 0) {
+ n2 = len + n2;
+ } else if (n2 >= len) {
+ n2 = len - 1;
+ }
+ if (!empty2 && (n2 < 0 || n2 + 1 < n1)) {
+ n2 = -1;
+ }
+ l = tv_list_alloc(n2 - n1 + 1);
+ item = tv_list_find(rettv->vval.v_list, n1);
+ while (n1++ <= n2) {
+ tv_list_append_tv(l, TV_LIST_ITEM_TV(item));
+ item = TV_LIST_ITEM_NEXT(rettv->vval.v_list, item);
+ }
+ tv_clear(rettv);
+ tv_list_set_ret(rettv, l);
+ } else {
+ tv_copy(TV_LIST_ITEM_TV(tv_list_find(rettv->vval.v_list, n1)), &var1);
+ tv_clear(rettv);
+ *rettv = var1;
}
- clear_tv(rettv);
- rettv->v_type = VAR_LIST;
- rettv->vval.v_list = l;
- ++l->lv_refcount;
- } else {
- copy_tv(&list_find(rettv->vval.v_list, n1)->li_tv, &var1);
- clear_tv(rettv);
- *rettv = var1;
- }
- break;
-
- case VAR_DICT:
- if (range) {
- if (verbose)
- EMSG(_(e_dictrange));
- if (len == -1)
- clear_tv(&var1);
- return FAIL;
+ break;
}
- {
- dictitem_T *item;
+ case VAR_DICT: {
+ if (range) {
+ if (verbose) {
+ EMSG(_(e_dictrange));
+ }
+ if (len == -1) {
+ tv_clear(&var1);
+ }
+ return FAIL;
+ }
if (len == -1) {
- key = get_tv_string(&var1);
- if (*key == NUL) {
- if (verbose)
- EMSG(_(e_emptykey));
- clear_tv(&var1);
+ key = (char_u *)tv_get_string_chk(&var1);
+ if (key == NULL) {
+ tv_clear(&var1);
return FAIL;
}
}
- item = dict_find(rettv->vval.v_dict, key, (int)len);
+ dictitem_T *const item = tv_dict_find(rettv->vval.v_dict,
+ (const char *)key, len);
- if (item == NULL && verbose)
- EMSG2(_(e_dictkey), key);
- if (len == -1)
- clear_tv(&var1);
- if (item == NULL)
+ if (item == NULL && verbose) {
+ emsgf(_(e_dictkey), key);
+ }
+ if (len == -1) {
+ tv_clear(&var1);
+ }
+ if (item == NULL) {
return FAIL;
+ }
- copy_tv(&item->di_tv, &var1);
- clear_tv(rettv);
+ tv_copy(&item->di_tv, &var1);
+ tv_clear(rettv);
*rettv = var1;
+ break;
+ }
+ case VAR_SPECIAL:
+ case VAR_FUNC:
+ case VAR_FLOAT:
+ case VAR_PARTIAL:
+ case VAR_UNKNOWN: {
+ break; // Not evaluating, skipping over subscript
}
- break;
- case VAR_SPECIAL:
- case VAR_FUNC:
- case VAR_FLOAT:
- case VAR_UNKNOWN:
- break; // Not evaluating, skipping over subscript
}
}
return OK;
}
-/*
- * Get an option value.
- * "arg" points to the '&' or '+' before the option name.
- * "arg" is advanced to character after the option name.
- * Return OK or FAIL.
- */
-static int
-get_option_tv (
- char_u **arg,
- typval_T *rettv, /* when NULL, only check if option exists */
- int evaluate
-)
+// TODO(ZyX-I): move to eval/executor
+
+/// Get an option value
+///
+/// @param[in,out] arg Points to the '&' or '+' before the option name. Is
+/// advanced to the character after the option name.
+/// @param[out] rettv Location where result is saved.
+/// @param[in] evaluate If not true, rettv is not populated.
+///
+/// @return OK or FAIL.
+static int get_option_tv(const char **const arg, typval_T *const rettv,
+ const bool evaluate)
+ FUNC_ATTR_NONNULL_ARG(1)
{
- char_u *option_end;
long numval;
char_u *stringval;
int opt_type;
int c;
- int working = (**arg == '+'); /* has("+option") */
+ bool working = (**arg == '+'); // has("+option")
int ret = OK;
int opt_flags;
- /*
- * Isolate the option name and find its value.
- */
- option_end = find_option_end(arg, &opt_flags);
+ // Isolate the option name and find its value.
+ char *option_end = (char *)find_option_end(arg, &opt_flags);
if (option_end == NULL) {
- if (rettv != NULL)
+ if (rettv != NULL) {
EMSG2(_("E112: Option name missing: %s"), *arg);
+ }
return FAIL;
}
@@ -4638,8 +4636,8 @@ get_option_tv (
c = *option_end;
*option_end = NUL;
- opt_type = get_option_value(*arg, &numval,
- rettv == NULL ? NULL : &stringval, opt_flags);
+ opt_type = get_option_value((char_u *)(*arg), &numval,
+ rettv == NULL ? NULL : &stringval, opt_flags);
if (opt_type == -3) { /* invalid name */
if (rettv != NULL)
@@ -4681,7 +4679,7 @@ static int get_string_tv(char_u **arg, typval_T *rettv, int evaluate)
/*
* Find the end of the string, skipping backslashed characters.
*/
- for (p = *arg + 1; *p != NUL && *p != '"'; mb_ptr_adv(p)) {
+ 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
@@ -4743,10 +4741,11 @@ static int get_string_tv(char_u **arg, typval_T *rettv, int evaluate)
++p;
/* For "\u" store the number according to
* 'encoding'. */
- if (c != 'X')
- name += (*mb_char2bytes)(nr, name);
- else
+ if (c != 'X') {
+ name += utf_char2bytes(nr, name);
+ } else {
*name++ = nr;
+ }
}
break;
@@ -4769,12 +4768,12 @@ static int get_string_tv(char_u **arg, typval_T *rettv, int evaluate)
// Special key, e.g.: "\<C-W>"
case '<':
- extra = trans_special((const char_u **) &p, STRLEN(p), name, true);
+ extra = trans_special((const char_u **)&p, STRLEN(p), name, true, true);
if (extra != 0) {
name += extra;
break;
}
- // FALLTHROUGH
+ FALLTHROUGH;
default: MB_COPY_CHAR(p, name);
break;
@@ -4784,7 +4783,10 @@ static int get_string_tv(char_u **arg, typval_T *rettv, int evaluate)
}
*name = NUL;
- *arg = p + 1;
+ if (*p != NUL) { // just in case
+ p++;
+ }
+ *arg = p;
return OK;
}
@@ -4802,7 +4804,7 @@ static int get_lit_string_tv(char_u **arg, typval_T *rettv, int evaluate)
/*
* Find the end of the string, skipping ''.
*/
- for (p = *arg + 1; *p != NUL; mb_ptr_adv(p)) {
+ for (p = *arg + 1; *p != NUL; MB_PTR_ADV(p)) {
if (*p == '\'') {
if (p[1] != '\'')
break;
@@ -4843,773 +4845,144 @@ static int get_lit_string_tv(char_u **arg, typval_T *rettv, int evaluate)
return OK;
}
-/*
- * Allocate a variable for a List and fill it from "*arg".
- * Return OK or FAIL.
- */
+/// @return the function name of the partial.
+char_u *partial_name(partial_T *pt)
+{
+ if (pt->pt_name != NULL) {
+ return pt->pt_name;
+ }
+ return pt->pt_func->uf_name;
+}
+
+// TODO(ZyX-I): Move to eval/typval.h
+
+static void partial_free(partial_T *pt)
+{
+ for (int i = 0; i < pt->pt_argc; i++) {
+ tv_clear(&pt->pt_argv[i]);
+ }
+ xfree(pt->pt_argv);
+ tv_dict_unref(pt->pt_dict);
+ if (pt->pt_name != NULL) {
+ func_unref(pt->pt_name);
+ xfree(pt->pt_name);
+ } else {
+ func_ptr_unref(pt->pt_func);
+ }
+ xfree(pt);
+}
+
+// TODO(ZyX-I): Move to eval/typval.h
+
+/// Unreference a closure: decrement the reference count and free it when it
+/// becomes zero.
+void partial_unref(partial_T *pt)
+{
+ if (pt != NULL && --pt->pt_refcount <= 0) {
+ partial_free(pt);
+ }
+}
+
+/// Allocate a variable for a List and fill it from "*arg".
+/// Return OK or FAIL.
static int get_list_tv(char_u **arg, typval_T *rettv, int evaluate)
{
list_T *l = NULL;
- typval_T tv;
- listitem_T *item;
if (evaluate) {
- l = list_alloc();
+ l = tv_list_alloc(kListLenShouldKnow);
}
*arg = skipwhite(*arg + 1);
while (**arg != ']' && **arg != NUL) {
- if (eval1(arg, &tv, evaluate) == FAIL) /* recursive! */
+ typval_T tv;
+ if (eval1(arg, &tv, evaluate) == FAIL) { // Recursive!
goto failret;
+ }
if (evaluate) {
- item = listitem_alloc();
- item->li_tv = tv;
- item->li_tv.v_lock = 0;
- list_append(l, item);
+ tv.v_lock = VAR_UNLOCKED;
+ tv_list_append_owned_tv(l, tv);
}
- if (**arg == ']')
+ if (**arg == ']') {
break;
+ }
if (**arg != ',') {
- EMSG2(_("E696: Missing comma in List: %s"), *arg);
+ emsgf(_("E696: Missing comma in List: %s"), *arg);
goto failret;
}
*arg = skipwhite(*arg + 1);
}
if (**arg != ']') {
- EMSG2(_("E697: Missing end of List ']': %s"), *arg);
+ emsgf(_("E697: Missing end of List ']': %s"), *arg);
failret:
- if (evaluate)
- list_free(l, TRUE);
+ if (evaluate) {
+ tv_list_free(l);
+ }
return FAIL;
}
*arg = skipwhite(*arg + 1);
if (evaluate) {
- rettv->v_type = VAR_LIST;
- rettv->vval.v_list = l;
- ++l->lv_refcount;
+ tv_list_set_ret(rettv, l);
}
return OK;
}
-/*
- * Allocate an empty header for a list.
- * Caller should take care of the reference count.
- */
-list_T *list_alloc(void) FUNC_ATTR_NONNULL_RET
-{
- list_T *list = xcalloc(1, sizeof(list_T));
-
- /* Prepend the list to the list of lists for garbage collection. */
- if (first_list != NULL)
- first_list->lv_used_prev = list;
- list->lv_used_prev = NULL;
- list->lv_used_next = first_list;
- first_list = list;
- return list;
-}
-
-/*
- * Allocate an empty list for a return value.
- */
-static list_T *rettv_list_alloc(typval_T *rettv)
-{
- list_T *l = list_alloc();
- rettv->vval.v_list = l;
- rettv->v_type = VAR_LIST;
- ++l->lv_refcount;
- return l;
-}
-
-/*
- * Unreference a list: decrement the reference count and free it when it
- * becomes zero.
- */
-void list_unref(list_T *l)
-{
- if (l != NULL && --l->lv_refcount <= 0)
- list_free(l, TRUE);
-}
-
-/*
- * Free a list, including all items it points to.
- * Ignores the reference count.
- */
-void
-list_free (
- list_T *l,
- int recurse /* Free Lists and Dictionaries recursively. */
-)
-{
- listitem_T *item;
-
- /* Remove the list from the list of lists for garbage collection. */
- if (l->lv_used_prev == NULL)
- first_list = l->lv_used_next;
- else
- l->lv_used_prev->lv_used_next = l->lv_used_next;
- if (l->lv_used_next != NULL)
- l->lv_used_next->lv_used_prev = l->lv_used_prev;
-
- for (item = l->lv_first; item != NULL; item = l->lv_first) {
- /* Remove the item before deleting it. */
- l->lv_first = item->li_next;
- if (recurse || (item->li_tv.v_type != VAR_LIST
- && item->li_tv.v_type != VAR_DICT))
- clear_tv(&item->li_tv);
- xfree(item);
- }
- xfree(l);
-}
-
-/*
- * Allocate a list item.
- * It is not initialized, don't forget to set v_lock.
- */
-listitem_T *listitem_alloc(void) FUNC_ATTR_NONNULL_RET
-{
- return xmalloc(sizeof(listitem_T));
-}
-
-/*
- * Free a list item. Also clears the value. Does not notify watchers.
- */
-void listitem_free(listitem_T *item)
-{
- clear_tv(&item->li_tv);
- xfree(item);
-}
-
-/*
- * Remove a list item from a List and free it. Also clears the value.
- */
-void listitem_remove(list_T *l, listitem_T *item)
-{
- vim_list_remove(l, item, item);
- listitem_free(item);
-}
-
-/*
- * Get the number of items in a list.
- */
-static long list_len(list_T *l)
-{
- if (l == NULL)
- return 0L;
- return l->lv_len;
-}
-
-/*
- * Return TRUE when two lists have exactly the same values.
- */
-static int
-list_equal (
- list_T *l1,
- list_T *l2,
- int ic, /* ignore case for strings */
- int recursive /* TRUE when used recursively */
-)
-{
- listitem_T *item1, *item2;
-
- if (l1 == NULL || l2 == NULL)
- return FALSE;
- if (l1 == l2)
- return TRUE;
- if (list_len(l1) != list_len(l2))
- return FALSE;
-
- for (item1 = l1->lv_first, item2 = l2->lv_first;
- item1 != NULL && item2 != NULL;
- item1 = item1->li_next, item2 = item2->li_next)
- if (!tv_equal(&item1->li_tv, &item2->li_tv, ic, recursive))
- return FALSE;
- return item1 == NULL && item2 == NULL;
-}
-
-/*
- * Return the dictitem that an entry in a hashtable points to.
- */
-dictitem_T *dict_lookup(hashitem_T *hi)
-{
- return HI2DI(hi);
-}
-
-/*
- * Return TRUE when two dictionaries have exactly the same key/values.
- */
-static int
-dict_equal (
- dict_T *d1,
- dict_T *d2,
- int ic, /* ignore case for strings */
- int recursive /* TRUE when used recursively */
-)
-{
- hashitem_T *hi;
- dictitem_T *item2;
- int todo;
-
- if (d1 == NULL || d2 == NULL)
- return FALSE;
- if (d1 == d2)
- return TRUE;
- if (dict_len(d1) != dict_len(d2))
- return FALSE;
-
- todo = (int)d1->dv_hashtab.ht_used;
- for (hi = d1->dv_hashtab.ht_array; todo > 0; ++hi) {
- if (!HASHITEM_EMPTY(hi)) {
- item2 = dict_find(d2, hi->hi_key, -1);
- if (item2 == NULL)
- return FALSE;
- if (!tv_equal(&HI2DI(hi)->di_tv, &item2->di_tv, ic, recursive))
- return FALSE;
- --todo;
- }
- }
- return TRUE;
-}
-
-static int tv_equal_recurse_limit;
-
-/*
- * Return TRUE if "tv1" and "tv2" have the same value.
- * Compares the items just like "==" would compare them, but strings and
- * numbers are different. Floats and numbers are also different.
- */
-static int
-tv_equal (
+bool func_equal(
typval_T *tv1,
typval_T *tv2,
- int ic, /* ignore case */
- int recursive /* TRUE when used recursively */
-)
-{
- char_u buf1[NUMBUFLEN], buf2[NUMBUFLEN];
- char_u *s1, *s2;
- static int recursive_cnt = 0; /* catch recursive loops */
- int r;
-
- if (tv1->v_type != tv2->v_type)
- return FALSE;
-
- /* Catch lists and dicts that have an endless loop by limiting
- * recursiveness to a limit. We guess they are equal then.
- * A fixed limit has the problem of still taking an awful long time.
- * Reduce the limit every time running into it. That should work fine for
- * deeply linked structures that are not recursively linked and catch
- * recursiveness quickly. */
- if (!recursive)
- tv_equal_recurse_limit = 1000;
- if (recursive_cnt >= tv_equal_recurse_limit) {
- --tv_equal_recurse_limit;
- return TRUE;
- }
-
- switch (tv1->v_type) {
- case VAR_LIST:
- ++recursive_cnt;
- r = list_equal(tv1->vval.v_list, tv2->vval.v_list, ic, TRUE);
- --recursive_cnt;
- return r;
-
- case VAR_DICT:
- ++recursive_cnt;
- r = dict_equal(tv1->vval.v_dict, tv2->vval.v_dict, ic, TRUE);
- --recursive_cnt;
- return r;
-
- case VAR_FUNC:
- return tv1->vval.v_string != NULL
- && tv2->vval.v_string != NULL
- && STRCMP(tv1->vval.v_string, tv2->vval.v_string) == 0;
-
- case VAR_NUMBER:
- return tv1->vval.v_number == tv2->vval.v_number;
-
- case VAR_FLOAT:
- return tv1->vval.v_float == tv2->vval.v_float;
-
- case VAR_STRING:
- s1 = get_tv_string_buf(tv1, buf1);
- s2 = get_tv_string_buf(tv2, buf2);
- return (ic ? mb_stricmp(s1, s2) : STRCMP(s1, s2)) == 0;
-
- case VAR_SPECIAL:
- return tv1->vval.v_special == tv2->vval.v_special;
-
- case VAR_UNKNOWN:
- // VAR_UNKNOWN can be the result of an invalid expression, letโ€™s say it does
- // not equal anything, not even self.
+ bool ic // ignore case
+) {
+ char_u *s1, *s2;
+ dict_T *d1, *d2;
+ int a1, a2;
+
+ // empty and NULL function name considered the same
+ s1 = tv1->v_type == VAR_FUNC ? tv1->vval.v_string
+ : partial_name(tv1->vval.v_partial);
+ if (s1 != NULL && *s1 == NUL) {
+ s1 = NULL;
+ }
+ s2 = tv2->v_type == VAR_FUNC ? tv2->vval.v_string
+ : partial_name(tv2->vval.v_partial);
+ if (s2 != NULL && *s2 == NUL) {
+ s2 = NULL;
+ }
+ if (s1 == NULL || s2 == NULL) {
+ if (s1 != s2) {
+ return false;
+ }
+ } else if (STRCMP(s1, s2) != 0) {
return false;
}
- assert(false);
- return false;
-}
-
-/*
- * Locate item with index "n" in list "l" and return it.
- * A negative index is counted from the end; -1 is the last item.
- * Returns NULL when "n" is out of range.
- */
-listitem_T *list_find(list_T *l, long n)
-{
- listitem_T *item;
- long idx;
-
- if (l == NULL)
- return NULL;
-
- /* Negative index is relative to the end. */
- if (n < 0)
- n = l->lv_len + n;
-
- /* Check for index out of range. */
- if (n < 0 || n >= l->lv_len)
- return NULL;
-
- /* When there is a cached index may start search from there. */
- if (l->lv_idx_item != NULL) {
- if (n < l->lv_idx / 2) {
- /* closest to the start of the list */
- item = l->lv_first;
- idx = 0;
- } else if (n > (l->lv_idx + l->lv_len) / 2) {
- /* closest to the end of the list */
- item = l->lv_last;
- idx = l->lv_len - 1;
- } else {
- /* closest to the cached index */
- item = l->lv_idx_item;
- idx = l->lv_idx;
- }
- } else {
- if (n < l->lv_len / 2) {
- /* closest to the start of the list */
- item = l->lv_first;
- idx = 0;
- } else {
- /* closest to the end of the list */
- item = l->lv_last;
- idx = l->lv_len - 1;
- }
- }
-
- while (n > idx) {
- /* search forward */
- item = item->li_next;
- ++idx;
- }
- while (n < idx) {
- /* search backward */
- item = item->li_prev;
- --idx;
- }
-
- /* cache the used index */
- l->lv_idx = idx;
- l->lv_idx_item = item;
-
- return item;
-}
-
-/*
- * Get list item "l[idx]" as a number.
- */
-static long
-list_find_nr (
- list_T *l,
- long idx,
- int *errorp /* set to TRUE when something wrong */
-)
-{
- listitem_T *li;
-
- li = list_find(l, idx);
- if (li == NULL) {
- if (errorp != NULL)
- *errorp = TRUE;
- return -1L;
- }
- return get_tv_number_chk(&li->li_tv, errorp);
-}
-
-/*
- * Get list item "l[idx - 1]" as a string. Returns NULL for failure.
- */
-char_u *list_find_str(list_T *l, long idx)
-{
- listitem_T *li;
-
- li = list_find(l, idx - 1);
- if (li == NULL) {
- EMSGN(_(e_listidx), idx);
- return NULL;
- }
- return get_tv_string(&li->li_tv);
-}
-
-/*
- * Locate "item" list "l" and return its index.
- * Returns -1 when "item" is not in the list.
- */
-static long list_idx_of_item(list_T *l, listitem_T *item)
-{
- long idx = 0;
- listitem_T *li;
-
- if (l == NULL)
- return -1;
- idx = 0;
- for (li = l->lv_first; li != NULL && li != item; li = li->li_next)
- ++idx;
- if (li == NULL)
- return -1;
- return idx;
-}
-
-/*
- * Append item "item" to the end of list "l".
- */
-void list_append(list_T *l, listitem_T *item)
-{
- if (l->lv_last == NULL) {
- /* empty list */
- l->lv_first = item;
- l->lv_last = item;
- item->li_prev = NULL;
- } else {
- l->lv_last->li_next = item;
- item->li_prev = l->lv_last;
- l->lv_last = item;
- }
- ++l->lv_len;
- item->li_next = NULL;
-}
-
-/*
- * Append typval_T "tv" to the end of list "l".
- */
-void list_append_tv(list_T *l, typval_T *tv)
-{
- listitem_T *li = listitem_alloc();
- copy_tv(tv, &li->li_tv);
- list_append(l, li);
-}
-
-/*
- * Add a list to a list.
- */
-void list_append_list(list_T *list, list_T *itemlist)
-{
- listitem_T *li = listitem_alloc();
-
- li->li_tv.v_type = VAR_LIST;
- li->li_tv.v_lock = 0;
- li->li_tv.vval.v_list = itemlist;
- list_append(list, li);
- ++itemlist->lv_refcount;
-}
-
-/*
- * Add a dictionary to a list. Used by getqflist().
- */
-void list_append_dict(list_T *list, dict_T *dict)
-{
- listitem_T *li = listitem_alloc();
-
- li->li_tv.v_type = VAR_DICT;
- li->li_tv.v_lock = 0;
- li->li_tv.vval.v_dict = dict;
- list_append(list, li);
- ++dict->dv_refcount;
-}
-
-/// Make a copy of "str" and append it as an item to list "l"
-///
-/// @param[out] l List to append to.
-/// @param[in] str String to append.
-/// @param[in] len Length of the appended string. May be negative, in this
-/// case string is considered to be usual zero-terminated
-/// string.
-void list_append_string(list_T *l, const char_u *str, int len)
- FUNC_ATTR_NONNULL_ARG(1)
-{
- if (str == NULL) {
- list_append_allocated_string(l, NULL);
- } else {
- list_append_allocated_string(l, (len >= 0
- ? xmemdupz((char *) str, len)
- : xstrdup((char *) str)));
- }
-}
-
-/// Append given string to the list
-///
-/// Unlike list_append_string this function does not copy the string.
-///
-/// @param[out] l List to append to.
-/// @param[in] str String to append.
-void list_append_allocated_string(list_T *l, char *const str)
- FUNC_ATTR_NONNULL_ARG(1)
-{
- listitem_T *li = listitem_alloc();
-
- list_append(l, li);
- li->li_tv.v_type = VAR_STRING;
- li->li_tv.v_lock = 0;
- li->li_tv.vval.v_string = (char_u *) str;
-}
-
-/*
- * Append "n" to list "l".
- */
-void list_append_number(list_T *l, varnumber_T n)
-{
- listitem_T *li = listitem_alloc();
- li->li_tv.v_type = VAR_NUMBER;
- li->li_tv.v_lock = 0;
- li->li_tv.vval.v_number = n;
- list_append(l, li);
-}
-
-/*
- * Insert typval_T "tv" in list "l" before "item".
- * If "item" is NULL append at the end.
- */
-void list_insert_tv(list_T *l, typval_T *tv, listitem_T *item)
-{
- listitem_T *ni = listitem_alloc();
-
- copy_tv(tv, &ni->li_tv);
- list_insert(l, ni, item);
-}
-
-void list_insert(list_T *l, listitem_T *ni, listitem_T *item)
-{
- if (item == NULL)
- /* Append new item at end of list. */
- list_append(l, ni);
- else {
- /* Insert new item before existing item. */
- ni->li_prev = item->li_prev;
- ni->li_next = item;
- if (item->li_prev == NULL) {
- l->lv_first = ni;
- ++l->lv_idx;
- } else {
- item->li_prev->li_next = ni;
- l->lv_idx_item = NULL;
+ // empty dict and NULL dict is different
+ d1 = tv1->v_type == VAR_FUNC ? NULL : tv1->vval.v_partial->pt_dict;
+ d2 = tv2->v_type == VAR_FUNC ? NULL : tv2->vval.v_partial->pt_dict;
+ if (d1 == NULL || d2 == NULL) {
+ if (d1 != d2) {
+ return false;
}
- item->li_prev = ni;
- ++l->lv_len;
- }
-}
-
-/*
- * Extend "l1" with "l2".
- * If "bef" is NULL append at the end, otherwise insert before this item.
- */
-static void list_extend(list_T *l1, list_T *l2, listitem_T *bef)
-{
- listitem_T *item;
- int todo = l2->lv_len;
-
- /* We also quit the loop when we have inserted the original item count of
- * the list, avoid a hang when we extend a list with itself. */
- for (item = l2->lv_first; item != NULL && --todo >= 0; item = item->li_next) {
- list_insert_tv(l1, &item->li_tv, bef);
- }
-}
-
-/*
- * Concatenate lists "l1" and "l2" into a new list, stored in "tv".
- * Return FAIL on failure to copy.
- */
-static int list_concat(list_T *l1, list_T *l2, typval_T *tv)
-{
- list_T *l;
-
- if (l1 == NULL || l2 == NULL)
- return FAIL;
-
- /* make a copy of the first list. */
- l = list_copy(NULL, l1, false, 0);
- if (l == NULL)
- return FAIL;
- tv->v_type = VAR_LIST;
- tv->vval.v_list = l;
-
- /* append all items from the second list */
- list_extend(l, l2, NULL);
- return OK;
-}
-
-/// Make a copy of list
-///
-/// @param[in] conv If non-NULL, then all internal strings will be converted.
-/// @param[in] orig Original list to copy.
-/// @param[in] deep If false, then shallow copy will be done.
-/// @param[in] copyID See var_item_copy().
-///
-/// @return Copied list. May be NULL in case original list is NULL or some
-/// failure happens. The refcount of the new list is set to 1.
-static list_T *list_copy(const vimconv_T *const conv,
- list_T *const orig,
- const bool deep,
- const int copyID)
- FUNC_ATTR_WARN_UNUSED_RESULT
-{
- listitem_T *item;
- listitem_T *ni;
-
- if (orig == NULL)
- return NULL;
-
- list_T *copy = list_alloc();
- if (copyID != 0) {
- /* Do this before adding the items, because one of the items may
- * refer back to this list. */
- orig->lv_copyID = copyID;
- orig->lv_copylist = copy;
- }
- for (item = orig->lv_first; item != NULL && !got_int;
- item = item->li_next) {
- ni = listitem_alloc();
- if (deep) {
- if (var_item_copy(conv, &item->li_tv, &ni->li_tv, deep, copyID) == FAIL) {
- xfree(ni);
- break;
- }
- } else
- copy_tv(&item->li_tv, &ni->li_tv);
- list_append(copy, ni);
- }
- ++copy->lv_refcount;
- if (item != NULL) {
- list_unref(copy);
- copy = NULL;
- }
-
- return copy;
-}
-
-/// Remove items "item" to "item2" from list "l".
-/// @warning Does not free the listitem or the value!
-void vim_list_remove(list_T *l, listitem_T *item, listitem_T *item2)
-{
- // notify watchers
- for (listitem_T *ip = item; ip != NULL; ip = ip->li_next) {
- --l->lv_len;
- list_fix_watch(l, ip);
- if (ip == item2) {
- break;
- }
- }
-
- if (item2->li_next == NULL) {
- l->lv_last = item->li_prev;
- } else {
- item2->li_next->li_prev = item->li_prev;
- }
- if (item->li_prev == NULL) {
- l->lv_first = item2->li_next;
- } else {
- item->li_prev->li_next = item2->li_next;
+ } else if (!tv_dict_equal(d1, d2, ic, true)) {
+ return false;
}
- l->lv_idx_item = NULL;
-}
-
-typedef struct join_S {
- char_u *s;
- char_u *tofree;
-} join_T;
-
-/// Join list into a string, helper function
-///
-/// @param[out] gap Garray where result will be saved.
-/// @param[in] l List to join.
-/// @param[in] sep Used separator.
-/// @param[in] join_gap Garray to keep each list item string.
-///
-/// @return OK in case of success, FAIL otherwise.
-static int list_join_inner(garray_T *const gap, list_T *const l,
- const char *const sep, garray_T *const join_gap)
- FUNC_ATTR_NONNULL_ALL
-{
- int sumlen = 0;
- bool first = true;
- listitem_T *item;
-
- /* Stringify each item in the list. */
- for (item = l->lv_first; item != NULL && !got_int; item = item->li_next) {
- char *s;
- size_t len;
- s = encode_tv2echo(&item->li_tv, &len);
- if (s == NULL) {
- return FAIL;
- }
-
- sumlen += (int) len;
- join_T *const p = GA_APPEND_VIA_PTR(join_T, join_gap);
- p->tofree = p->s = (char_u *) s;
-
- line_breakcheck();
+ // empty list and no list considered the same
+ a1 = tv1->v_type == VAR_FUNC ? 0 : tv1->vval.v_partial->pt_argc;
+ a2 = tv2->v_type == VAR_FUNC ? 0 : tv2->vval.v_partial->pt_argc;
+ if (a1 != a2) {
+ return false;
}
-
- /* Allocate result buffer with its total size, avoid re-allocation and
- * multiple copy operations. Add 2 for a tailing ']' and NUL. */
- if (join_gap->ga_len >= 2)
- sumlen += (int)STRLEN(sep) * (join_gap->ga_len - 1);
- ga_grow(gap, sumlen + 2);
-
- for (int i = 0; i < join_gap->ga_len && !got_int; ++i) {
- if (first) {
- first = false;
- } else {
- ga_concat(gap, (const char_u *) sep);
+ for (int i = 0; i < a1; i++) {
+ if (!tv_equal(tv1->vval.v_partial->pt_argv + i,
+ tv2->vval.v_partial->pt_argv + i, ic, true)) {
+ return false;
}
- const join_T *const p = ((const join_T *)join_gap->ga_data) + i;
-
- if (p->s != NULL)
- ga_concat(gap, p->s);
- line_breakcheck();
- }
-
- return OK;
-}
-
-/// Join list into a string using given separator
-///
-/// @param[out] gap Garray where result will be saved.
-/// @param[in] l Joined list.
-/// @param[in] sep Separator.
-///
-/// @return OK in case of success, FAIL otherwise.
-static int list_join(garray_T *const gap, list_T *const l,
- const char *const sep)
- FUNC_ATTR_NONNULL_ALL
-{
- if (l->lv_len < 1) {
- return OK;
}
-
- garray_T join_ga;
- int retval;
-
- ga_init(&join_ga, (int)sizeof(join_T), l->lv_len);
- retval = list_join_inner(gap, l, sep, &join_ga);
-
-# define FREE_JOIN_TOFREE(join) xfree((join)->tofree)
- GA_DEEP_CLEAR(&join_ga, join_T, FREE_JOIN_TOFREE);
-
- return retval;
+ return true;
}
/// Get next (unique) copy ID
@@ -5628,6 +5001,9 @@ int get_copyID(void)
return current_copyID;
}
+// Used by get_func_tv()
+static garray_T funcargs = GA_EMPTY_INIT_VALUE;
+
/*
* Garbage collection for lists and dictionaries.
*
@@ -5650,19 +5026,22 @@ int get_copyID(void)
/// Do garbage collection for lists and dicts.
///
+/// @param testing true if called from test_garbagecollect_now().
/// @returns true if some memory was freed.
-bool garbage_collect(void)
+bool garbage_collect(bool testing)
{
bool abort = false;
#define ABORTING(func) abort = abort || func
- // Only do this once.
- want_garbage_collect = false;
- may_garbage_collect = false;
- garbage_collect_at_exit = false;
+ if (!testing) {
+ // Only do this once.
+ want_garbage_collect = false;
+ may_garbage_collect = false;
+ garbage_collect_at_exit = false;
+ }
- // We advance by two because we add one for items referenced through
- // previous_funccal.
+ // We advance by two (COPYID_INC) because we add one for items referenced
+ // through previous_funccal.
const int copyID = get_copyID();
// 1. Go through all accessible variables and mark all lists and dicts
@@ -5672,6 +5051,7 @@ bool garbage_collect(void)
// referenced through previous_funccal. This must be first, because if
// the item is referenced elsewhere the funccal must not be freed.
for (funccall_T *fc = previous_funccal; fc != NULL; fc = fc->caller) {
+ fc->fc_copyID = copyID + 1;
ABORTING(set_ref_in_ht)(&fc->l_vars.dv_hashtab, copyID + 1, NULL);
ABORTING(set_ref_in_ht)(&fc->l_avars.dv_hashtab, copyID + 1, NULL);
}
@@ -5717,7 +5097,8 @@ bool garbage_collect(void)
do {
yankreg_T reg;
char name = NUL;
- reg_iter = op_register_iter(reg_iter, &name, &reg);
+ bool is_unnamed = false;
+ reg_iter = op_register_iter(reg_iter, &name, &reg, &is_unnamed);
if (name != NUL) {
ABORTING(set_ref_dict)(reg.additional_data, copyID);
}
@@ -5747,18 +5128,38 @@ bool garbage_collect(void)
// function-local variables
for (funccall_T *fc = current_funccal; fc != NULL; fc = fc->caller) {
+ fc->fc_copyID = copyID;
ABORTING(set_ref_in_ht)(&fc->l_vars.dv_hashtab, copyID, NULL);
ABORTING(set_ref_in_ht)(&fc->l_avars.dv_hashtab, copyID, NULL);
}
- // Jobs
+ // named functions (matters for closures)
+ ABORTING(set_ref_in_functions(copyID));
+
+ // Channels
+ {
+ Channel *data;
+ map_foreach_value(channels, data, {
+ set_ref_in_callback_reader(&data->on_stdout, copyID, NULL, NULL);
+ set_ref_in_callback_reader(&data->on_stderr, copyID, NULL, NULL);
+ set_ref_in_callback(&data->on_exit, copyID, NULL, NULL);
+ })
+ }
+
+ // Timers
{
- TerminalJobData *data;
- map_foreach_value(jobs, data, {
- ABORTING(set_ref_dict)(data->self, copyID);
+ timer_T *timer;
+ map_foreach_value(timers, timer, {
+ set_ref_in_callback(&timer->callback, copyID, NULL, NULL);
})
}
+ // function call arguments, if v:testing is set.
+ for (int i = 0; i < funcargs.ga_len; i++) {
+ ABORTING(set_ref_in_item)(((typval_T **)funcargs.ga_data)[i],
+ copyID, NULL, NULL);
+ }
+
// v: vars
ABORTING(set_ref_in_ht)(&vimvarht, copyID, NULL);
@@ -5792,6 +5193,8 @@ bool garbage_collect(void)
ABORTING(set_ref_list)(sub.additional_elements, copyID);
}
+ ABORTING(set_ref_in_quickfix)(copyID);
+
bool did_free = false;
if (!abort) {
// 2. Free lists and dictionaries that are not referenced.
@@ -5813,7 +5216,7 @@ bool garbage_collect(void)
if (did_free_funccal) {
// When a funccal was freed some more items might be garbage
// collected, so run again.
- (void)garbage_collect();
+ (void)garbage_collect(testing);
}
} else if (p_verbose > 0) {
verb_msg((char_u *)_(
@@ -5825,7 +5228,7 @@ bool garbage_collect(void)
/// Free lists and dictionaries that are no longer referenced.
///
-/// Note: This function may only be called from garbage_collect().
+/// @note This function may only be called from garbage_collect().
///
/// @param copyID Free lists/dictionaries that don't have this ID.
/// @return true, if something was freed.
@@ -5833,40 +5236,61 @@ static int free_unref_items(int copyID)
{
bool did_free = false;
+ // Let all "free" functions know that we are here. This means no
+ // dictionaries, lists, or jobs are to be freed, because we will
+ // do that here.
+ tv_in_free_unref_items = true;
+
+ // PASS 1: free the contents of the items. We don't free the items
+ // themselves yet, so that it is possible to decrement refcount counters.
+
// Go through the list of dicts and free items without the copyID.
// Don't free dicts that are referenced internally.
- for (dict_T *dd = first_dict; dd != NULL; ) {
+ for (dict_T *dd = gc_first_dict; dd != NULL; dd = dd->dv_used_next) {
if ((dd->dv_copyID & COPYID_MASK) != (copyID & COPYID_MASK)) {
// Free the Dictionary and ordinary items it contains, but don't
// recurse into Lists and Dictionaries, they will be in the list
- // of dicts or list of lists. */
- dict_T *dd_next = dd->dv_used_next;
- dict_free(dd, FALSE);
+ // of dicts or list of lists.
+ tv_dict_free_contents(dd);
did_free = true;
- dd = dd_next;
- } else {
- dd = dd->dv_used_next;
}
}
// Go through the list of lists and free items without the copyID.
// But don't free a list that has a watcher (used in a for loop), these
// are not referenced anywhere.
- for (list_T *ll = first_list; ll != NULL;) {
- if ((ll->lv_copyID & COPYID_MASK) != (copyID & COPYID_MASK)
- && ll->lv_watch == NULL) {
+ for (list_T *ll = gc_first_list; ll != NULL; ll = ll->lv_used_next) {
+ if ((tv_list_copyid(ll) & COPYID_MASK) != (copyID & COPYID_MASK)
+ && !tv_list_has_watchers(ll)) {
// Free the List and ordinary items it contains, but don't recurse
// into Lists and Dictionaries, they will be in the list of dicts
// or list of lists.
- list_T* ll_next = ll->lv_used_next;
- list_free(ll, FALSE);
+ tv_list_free_contents(ll);
did_free = true;
- ll = ll_next;
- } else {
- ll = ll->lv_used_next;
}
}
+ // PASS 2: free the items themselves.
+ dict_T *dd_next;
+ for (dict_T *dd = gc_first_dict; dd != NULL; dd = dd_next) {
+ dd_next = dd->dv_used_next;
+ if ((dd->dv_copyID & COPYID_MASK) != (copyID & COPYID_MASK)) {
+ tv_dict_free_dict(dd);
+ }
+ }
+
+ list_T *ll_next;
+ for (list_T *ll = gc_first_list; ll != NULL; ll = ll_next) {
+ ll_next = ll->lv_used_next;
+ if ((ll->lv_copyID & COPYID_MASK) != (copyID & COPYID_MASK)
+ && !tv_list_has_watchers(ll)) {
+ // Free the List and ordinary items it contains, but don't recurse
+ // into Lists and Dictionaries, they will be in the list of dicts
+ // or list of lists.
+ tv_list_free_list(ll);
+ }
+ }
+ tv_in_free_unref_items = false;
return did_free;
}
@@ -5889,14 +5313,10 @@ bool set_ref_in_ht(hashtab_T *ht, int copyID, list_stack_T **list_stack)
// Mark each item in the hashtab. If the item contains a hashtab
// it is added to ht_stack, if it contains a list it is added to
// list_stack.
- int todo = (int)cur_ht->ht_used;
- for (hashitem_T *hi = cur_ht->ht_array; todo > 0; ++hi) {
- if (!HASHITEM_EMPTY(hi)) {
- --todo;
- abort = abort || set_ref_in_item(&HI2DI(hi)->di_tv, copyID, &ht_stack,
- list_stack);
- }
- }
+ HASHTAB_ITER(cur_ht, hi, {
+ abort = abort || set_ref_in_item(
+ &TV_DICT_HI2DI(hi)->di_tv, copyID, &ht_stack, list_stack);
+ });
}
if (ht_stack == NULL) {
@@ -5928,15 +5348,16 @@ bool set_ref_in_list(list_T *l, int copyID, ht_stack_T **ht_stack)
list_T *cur_l = l;
for (;;) {
- if (!abort) {
- // Mark each item in the list. If the item contains a hashtab
- // it is added to ht_stack, if it contains a list it is added to
- // list_stack.
- for (listitem_T *li = cur_l->lv_first; !abort && li != NULL;
- li = li->li_next) {
- abort = set_ref_in_item(&li->li_tv, copyID, ht_stack, &list_stack);
+ // Mark each item in the list. If the item contains a hashtab
+ // it is added to ht_stack, if it contains a list it is added to
+ // list_stack.
+ TV_LIST_ITER(cur_l, li, {
+ if (abort) {
+ break;
}
- }
+ abort = set_ref_in_item(TV_LIST_ITEM_TV(li), copyID, ht_stack,
+ &list_stack);
+ });
if (list_stack == NULL) {
break;
@@ -5984,6 +5405,13 @@ bool set_ref_in_item(typval_T *tv, int copyID, ht_stack_T **ht_stack,
*ht_stack = newitem;
}
}
+
+ QUEUE *w = NULL;
+ DictWatcher *watcher = NULL;
+ QUEUE_FOREACH(w, &dd->watchers) {
+ watcher = tv_dict_watcher_node_data(w);
+ set_ref_in_callback(&watcher->callback, copyID, ht_stack, list_stack);
+ }
}
break;
}
@@ -6009,7 +5437,30 @@ bool set_ref_in_item(typval_T *tv, int copyID, ht_stack_T **ht_stack,
break;
}
+ case VAR_PARTIAL: {
+ partial_T *pt = tv->vval.v_partial;
+
+ // A partial does not have a copyID, because it cannot contain itself.
+ if (pt != NULL) {
+ abort = set_ref_in_func(pt->pt_name, pt->pt_func, copyID);
+ if (pt->pt_dict != NULL) {
+ typval_T dtv;
+
+ dtv.v_type = VAR_DICT;
+ dtv.vval.v_dict = pt->pt_dict;
+ abort = abort || set_ref_in_item(&dtv, copyID, ht_stack, list_stack);
+ }
+
+ for (int i = 0; i < pt->pt_argc; i++) {
+ abort = abort || set_ref_in_item(&pt->pt_argv[i], copyID,
+ ht_stack, list_stack);
+ }
+ }
+ break;
+ }
case VAR_FUNC:
+ abort = set_ref_in_func(tv->vval.v_string, NULL, copyID);
+ break;
case VAR_UNKNOWN:
case VAR_SPECIAL:
case VAR_FLOAT:
@@ -6021,6 +5472,29 @@ bool set_ref_in_item(typval_T *tv, int copyID, ht_stack_T **ht_stack,
return abort;
}
+/// Set "copyID" in all functions available by name.
+bool set_ref_in_functions(int copyID)
+{
+ int todo;
+ hashitem_T *hi = NULL;
+ bool abort = false;
+ ufunc_T *fp;
+
+ todo = (int)func_hashtab.ht_used;
+ for (hi = func_hashtab.ht_array; todo > 0 && !got_int; hi++) {
+ if (!HASHITEM_EMPTY(hi)) {
+ todo--;
+ fp = HI2UF(hi);
+ if (!func_name_refcount(fp->uf_name)) {
+ abort = abort || set_ref_in_func(NULL, fp, copyID);
+ }
+ }
+ }
+ return abort;
+}
+
+
+
/// Mark all lists and dicts referenced in given mark
///
/// @returns true if setting references failed somehow.
@@ -6067,441 +5541,17 @@ static inline bool set_ref_dict(dict_T *dict, int copyID)
return false;
}
-/*
- * Allocate an empty header for a dictionary.
- */
-dict_T *dict_alloc(void) FUNC_ATTR_NONNULL_RET
-{
- dict_T *d = xmalloc(sizeof(dict_T));
-
- /* Add the dict to the list of dicts for garbage collection. */
- if (first_dict != NULL)
- first_dict->dv_used_prev = d;
- d->dv_used_next = first_dict;
- d->dv_used_prev = NULL;
- first_dict = d;
-
- hash_init(&d->dv_hashtab);
- d->dv_lock = 0;
- d->dv_scope = 0;
- d->dv_refcount = 0;
- d->dv_copyID = 0;
- QUEUE_INIT(&d->watchers);
-
- return d;
-}
-
-/*
- * Allocate an empty dict for a return value.
- */
-static void rettv_dict_alloc(typval_T *rettv)
-{
- dict_T *d = dict_alloc();
-
- rettv->vval.v_dict = d;
- rettv->v_type = VAR_DICT;
- ++d->dv_refcount;
-}
-
-/// Clear all the keys of a Dictionary. "d" remains a valid empty Dictionary.
-///
-/// @param d The Dictionary to clear
-void dict_clear(dict_T *d)
- FUNC_ATTR_NONNULL_ALL
-{
- hash_lock(&d->dv_hashtab);
- assert(d->dv_hashtab.ht_locked > 0);
-
- size_t todo = d->dv_hashtab.ht_used;
- for (hashitem_T *hi = d->dv_hashtab.ht_array; todo > 0; hi++) {
- if (!HASHITEM_EMPTY(hi)) {
- dictitem_free(HI2DI(hi));
- hash_remove(&d->dv_hashtab, hi);
- todo--;
- }
- }
-
- hash_unlock(&d->dv_hashtab);
-}
-
-
-/*
- * Unreference a Dictionary: decrement the reference count and free it when it
- * becomes zero.
- */
-void dict_unref(dict_T *d)
+static bool set_ref_in_funccal(funccall_T *fc, int copyID)
{
- if (d != NULL && --d->dv_refcount <= 0)
- dict_free(d, TRUE);
-}
-
-/*
- * Free a Dictionary, including all items it contains.
- * Ignores the reference count.
- */
-void
-dict_free (
- dict_T *d,
- int recurse /* Free Lists and Dictionaries recursively. */
-)
-{
- int todo;
- hashitem_T *hi;
- dictitem_T *di;
-
- /* Remove the dict from the list of dicts for garbage collection. */
- if (d->dv_used_prev == NULL)
- first_dict = d->dv_used_next;
- else
- d->dv_used_prev->dv_used_next = d->dv_used_next;
- if (d->dv_used_next != NULL)
- d->dv_used_next->dv_used_prev = d->dv_used_prev;
-
- /* Lock the hashtab, we don't want it to resize while freeing items. */
- hash_lock(&d->dv_hashtab);
- assert(d->dv_hashtab.ht_locked > 0);
- todo = (int)d->dv_hashtab.ht_used;
- for (hi = d->dv_hashtab.ht_array; todo > 0; ++hi) {
- if (!HASHITEM_EMPTY(hi)) {
- /* Remove the item before deleting it, just in case there is
- * something recursive causing trouble. */
- di = HI2DI(hi);
- hash_remove(&d->dv_hashtab, hi);
- if (recurse || (di->di_tv.v_type != VAR_LIST
- && di->di_tv.v_type != VAR_DICT))
- clear_tv(&di->di_tv);
- xfree(di);
- --todo;
- }
- }
-
- while (!QUEUE_EMPTY(&d->watchers)) {
- QUEUE *w = QUEUE_HEAD(&d->watchers);
- DictWatcher *watcher = dictwatcher_node_data(w);
- dictwatcher_free(watcher);
- QUEUE_REMOVE(w);
- }
-
- hash_clear(&d->dv_hashtab);
- xfree(d);
-}
-
-/*
- * Allocate a Dictionary item.
- * The "key" is copied to the new item.
- * Note that the value of the item "di_tv" still needs to be initialized!
- */
-dictitem_T *dictitem_alloc(char_u *key) FUNC_ATTR_NONNULL_RET
-{
- dictitem_T *di = xmalloc(sizeof(dictitem_T) + STRLEN(key));
-#ifndef __clang_analyzer__
- STRCPY(di->di_key, key);
-#endif
- di->di_flags = DI_FLAGS_ALLOC;
- return di;
-}
-
-/*
- * Make a copy of a Dictionary item.
- */
-static dictitem_T *dictitem_copy(dictitem_T *org) FUNC_ATTR_NONNULL_RET
-{
- dictitem_T *di = xmalloc(sizeof(dictitem_T) + STRLEN(org->di_key));
-
- STRCPY(di->di_key, org->di_key);
- di->di_flags = DI_FLAGS_ALLOC;
- copy_tv(&org->di_tv, &di->di_tv);
-
- return di;
-}
-
-/*
- * Remove item "item" from Dictionary "dict" and free it.
- */
-static void dictitem_remove(dict_T *dict, dictitem_T *item)
-{
- hashitem_T *hi;
-
- hi = hash_find(&dict->dv_hashtab, item->di_key);
- if (HASHITEM_EMPTY(hi)) {
- EMSG2(_(e_intern2), "dictitem_remove()");
- } else {
- hash_remove(&dict->dv_hashtab, hi);
- }
- dictitem_free(item);
-}
-
-/*
- * Free a dict item. Also clears the value.
- */
-void dictitem_free(dictitem_T *item)
-{
- clear_tv(&item->di_tv);
- if (item->di_flags & DI_FLAGS_ALLOC) {
- xfree(item);
- }
-}
-
-/// Make a copy of dictionary
-///
-/// @param[in] conv If non-NULL, then all internal strings will be converted.
-/// @param[in] orig Original dictionary to copy.
-/// @param[in] deep If false, then shallow copy will be done.
-/// @param[in] copyID See var_item_copy().
-///
-/// @return Copied dictionary. May be NULL in case original dictionary is NULL
-/// or some failure happens. The refcount of the new dictionary is set
-/// to 1.
-static dict_T *dict_copy(const vimconv_T *const conv,
- dict_T *const orig,
- const bool deep,
- const int copyID)
-{
- dictitem_T *di;
- int todo;
- hashitem_T *hi;
-
- if (orig == NULL)
- return NULL;
-
- dict_T *copy = dict_alloc();
- {
- if (copyID != 0) {
- orig->dv_copyID = copyID;
- orig->dv_copydict = copy;
- }
- todo = (int)orig->dv_hashtab.ht_used;
- for (hi = orig->dv_hashtab.ht_array; todo > 0 && !got_int; ++hi) {
- if (!HASHITEM_EMPTY(hi)) {
- --todo;
-
- if (conv == NULL || conv->vc_type == CONV_NONE) {
- di = dictitem_alloc(hi->hi_key);
- } else {
- char *const key = (char *) string_convert((vimconv_T *) conv,
- hi->hi_key, NULL);
- if (key == NULL) {
- di = dictitem_alloc(hi->hi_key);
- } else {
- di = dictitem_alloc((char_u *) key);
- xfree(key);
- }
- }
- if (deep) {
- if (var_item_copy(conv, &HI2DI(hi)->di_tv, &di->di_tv, deep,
- copyID) == FAIL) {
- xfree(di);
- break;
- }
- } else
- copy_tv(&HI2DI(hi)->di_tv, &di->di_tv);
- if (dict_add(copy, di) == FAIL) {
- dictitem_free(di);
- break;
- }
- }
- }
-
- ++copy->dv_refcount;
- if (todo > 0) {
- dict_unref(copy);
- copy = NULL;
- }
- }
-
- return copy;
-}
-
-/*
- * Add item "item" to Dictionary "d".
- * Returns FAIL when key already exists.
- */
-int dict_add(dict_T *d, dictitem_T *item)
-{
- return hash_add(&d->dv_hashtab, item->di_key);
-}
-
-/*
- * Add a number or string entry to dictionary "d".
- * When "str" is NULL use number "nr", otherwise use "str".
- * Returns FAIL when key already exists.
- */
-int dict_add_nr_str(dict_T *d, char *key, long nr, char_u *str)
-{
- dictitem_T *item;
-
- item = dictitem_alloc((char_u *)key);
- item->di_tv.v_lock = 0;
- if (str == NULL) {
- item->di_tv.v_type = VAR_NUMBER;
- item->di_tv.vval.v_number = nr;
- } else {
- item->di_tv.v_type = VAR_STRING;
- item->di_tv.vval.v_string = vim_strsave(str);
- }
- if (dict_add(d, item) == FAIL) {
- dictitem_free(item);
- return FAIL;
- }
- return OK;
-}
-
-/*
- * Add a list entry to dictionary "d".
- * Returns FAIL when key already exists.
- */
-int dict_add_list(dict_T *d, char *key, list_T *list)
-{
- dictitem_T *item = dictitem_alloc((char_u *)key);
-
- item->di_tv.v_lock = 0;
- item->di_tv.v_type = VAR_LIST;
- item->di_tv.vval.v_list = list;
- if (dict_add(d, item) == FAIL) {
- dictitem_free(item);
- return FAIL;
- }
- ++list->lv_refcount;
- return OK;
-}
-
-/// Set all existing keys in "dict" as read-only.
-///
-/// This does not protect against adding new keys to the Dictionary.
-///
-/// @param dict The dict whose keys should be frozen
-void dict_set_keys_readonly(dict_T *dict)
- FUNC_ATTR_NONNULL_ALL
-{
- size_t todo = dict->dv_hashtab.ht_used;
- for (hashitem_T *hi = dict->dv_hashtab.ht_array; todo > 0 ; hi++) {
- if (HASHITEM_EMPTY(hi)) {
- continue;
- }
- todo--;
- HI2DI(hi)->di_flags |= DI_FLAGS_RO | DI_FLAGS_FIX;
- }
-}
-
-/*
- * Get the number of items in a Dictionary.
- */
-static long dict_len(dict_T *d)
-{
- if (d == NULL)
- return 0L;
- return (long)d->dv_hashtab.ht_used;
-}
-
-/*
- * Find item "key[len]" in Dictionary "d".
- * If "len" is negative use strlen(key).
- * Returns NULL when not found.
- */
-dictitem_T *dict_find(dict_T *d, char_u *key, int len)
-{
-#define AKEYLEN 200
- char_u buf[AKEYLEN];
- char_u *akey;
- char_u *tofree = NULL;
- hashitem_T *hi;
-
- if (len < 0)
- akey = key;
- else if (len >= AKEYLEN) {
- tofree = akey = vim_strnsave(key, len);
- } else {
- /* Avoid a malloc/free by using buf[]. */
- STRLCPY(buf, key, len + 1);
- akey = buf;
- }
-
- hi = hash_find(&d->dv_hashtab, akey);
- xfree(tofree);
- if (HASHITEM_EMPTY(hi))
- return NULL;
- return HI2DI(hi);
-}
-
-/// Get a function from a dictionary
-/// @param[out] result The address where a pointer to the wanted callback
-/// will be left.
-/// @return true/false on success/failure.
-static bool get_dict_callback(dict_T *d, char *key, ufunc_T **result)
-{
- dictitem_T *di = dict_find(d, (uint8_t *)key, -1);
-
- if (di == NULL) {
- *result = NULL;
- return true;
- }
-
- if (di->di_tv.v_type != VAR_FUNC && di->di_tv.v_type != VAR_STRING) {
- EMSG(_("Argument is not a function or function name"));
- *result = NULL;
- return false;
- }
-
- if ((*result = find_ufunc(di->di_tv.vval.v_string)) == NULL) {
- return false;
- }
-
- (*result)->uf_refcount++;
- return true;
-}
-
-static ufunc_T *find_ufunc(uint8_t *name)
-{
- uint8_t *n = name;
- ufunc_T *rv = NULL;
- if (*n > '9' || *n < '0') {
- if ((n = trans_function_name(&n, false, TFN_INT|TFN_QUIET, NULL))) {
- rv = find_func(n);
- xfree(n);
- }
- } else {
- // dict function, name is already translated
- rv = find_func(n);
- }
-
- if (!rv) {
- EMSG2(_("Function %s doesn't exist"), name);
- return NULL;
- }
-
- return rv;
-}
-
-/*
- * Get a string item from a dictionary.
- * When "save" is TRUE allocate memory for it.
- * Returns NULL if the entry doesn't exist.
- */
-char_u *get_dict_string(dict_T *d, char_u *key, int save)
-{
- dictitem_T *di;
- char_u *s;
+ bool abort = false;
- di = dict_find(d, key, -1);
- if (di == NULL)
- return NULL;
- s = get_tv_string(&di->di_tv);
- if (save) {
- s = vim_strsave(s);
+ 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);
}
- return s;
-}
-
-/*
- * Get a number item from a dictionary.
- * Returns 0 if the entry doesn't exist.
- */
-long get_dict_number(dict_T *d, char_u *key)
-{
- dictitem_T *di = dict_find(d, key, -1);
- if (di == NULL)
- return 0;
- return get_tv_number(&di->di_tv);
+ return abort;
}
/*
@@ -6516,7 +5566,7 @@ static int get_dict_tv(char_u **arg, typval_T *rettv, int evaluate)
char_u *key = NULL;
dictitem_T *item;
char_u *start = skipwhite(*arg + 1);
- char_u buf[NUMBUFLEN];
+ char buf[NUMBUFLEN];
/*
* First check if it's not a curly-braces thing: {expr}.
@@ -6533,7 +5583,7 @@ static int get_dict_tv(char_u **arg, typval_T *rettv, int evaluate)
}
if (evaluate) {
- d = dict_alloc();
+ d = tv_dict_alloc();
}
tvkey.v_type = VAR_UNKNOWN;
tv.v_type = VAR_UNKNOWN;
@@ -6544,40 +5594,39 @@ static int get_dict_tv(char_u **arg, typval_T *rettv, int evaluate)
goto failret;
if (**arg != ':') {
EMSG2(_("E720: Missing colon in Dictionary: %s"), *arg);
- clear_tv(&tvkey);
+ tv_clear(&tvkey);
goto failret;
}
if (evaluate) {
- key = get_tv_string_buf_chk(&tvkey, buf);
- if (key == NULL || *key == NUL) {
- /* "key" is NULL when get_tv_string_buf_chk() gave an errmsg */
- if (key != NULL)
- EMSG(_(e_emptykey));
- clear_tv(&tvkey);
+ key = (char_u *)tv_get_string_buf_chk(&tvkey, buf);
+ if (key == NULL) {
+ // "key" is NULL when tv_get_string_buf_chk() gave an errmsg
+ tv_clear(&tvkey);
goto failret;
}
}
*arg = skipwhite(*arg + 1);
- if (eval1(arg, &tv, evaluate) == FAIL) { /* recursive! */
- if (evaluate)
- clear_tv(&tvkey);
+ if (eval1(arg, &tv, evaluate) == FAIL) { // Recursive!
+ if (evaluate) {
+ tv_clear(&tvkey);
+ }
goto failret;
}
if (evaluate) {
- item = dict_find(d, key, -1);
+ item = tv_dict_find(d, (const char *)key, -1);
if (item != NULL) {
EMSG2(_("E721: Duplicate key in Dictionary: \"%s\""), key);
- clear_tv(&tvkey);
- clear_tv(&tv);
+ tv_clear(&tvkey);
+ tv_clear(&tv);
goto failret;
}
- item = dictitem_alloc(key);
- clear_tv(&tvkey);
+ item = tv_dict_item_alloc((const char *)key);
+ tv_clear(&tvkey);
item->di_tv = tv;
item->di_tv.v_lock = 0;
- if (dict_add(d, item) == FAIL) {
- dictitem_free(item);
+ if (tv_dict_add(d, item) == FAIL) {
+ tv_dict_item_free(item);
}
}
@@ -6593,21 +5642,238 @@ static int get_dict_tv(char_u **arg, typval_T *rettv, int evaluate)
if (**arg != '}') {
EMSG2(_("E723: Missing end of Dictionary '}': %s"), *arg);
failret:
- if (evaluate)
- dict_free(d, TRUE);
+ if (evaluate) {
+ tv_dict_free(d);
+ }
return FAIL;
}
*arg = skipwhite(*arg + 1);
if (evaluate) {
- rettv->v_type = VAR_DICT;
- rettv->vval.v_dict = d;
- ++d->dv_refcount;
+ tv_dict_set_ret(rettv, d);
}
return OK;
}
+/// Get function arguments.
+static int get_function_args(char_u **argp, char_u endchar, garray_T *newargs,
+ int *varargs, bool skip)
+{
+ bool mustend = false;
+ char_u *arg = *argp;
+ char_u *p = arg;
+ int c;
+ int i;
+
+ if (newargs != NULL) {
+ ga_init(newargs, (int)sizeof(char_u *), 3);
+ }
+
+ if (varargs != NULL) {
+ *varargs = false;
+ }
+
+ // Isolate the arguments: "arg1, arg2, ...)"
+ while (*p != endchar) {
+ if (p[0] == '.' && p[1] == '.' && p[2] == '.') {
+ if (varargs != NULL) {
+ *varargs = true;
+ }
+ p += 3;
+ mustend = true;
+ } else {
+ arg = p;
+ while (ASCII_ISALNUM(*p) || *p == '_') {
+ p++;
+ }
+ if (arg == p || isdigit(*arg)
+ || (p - arg == 9 && STRNCMP(arg, "firstline", 9) == 0)
+ || (p - arg == 8 && STRNCMP(arg, "lastline", 8) == 0)) {
+ if (!skip) {
+ EMSG2(_("E125: Illegal argument: %s"), arg);
+ }
+ break;
+ }
+ if (newargs != NULL) {
+ ga_grow(newargs, 1);
+ c = *p;
+ *p = NUL;
+ arg = vim_strsave(arg);
+
+ // Check for duplicate argument name.
+ for (i = 0; i < newargs->ga_len; i++) {
+ if (STRCMP(((char_u **)(newargs->ga_data))[i], arg) == 0) {
+ EMSG2(_("E853: Duplicate argument name: %s"), arg);
+ xfree(arg);
+ goto err_ret;
+ }
+ }
+ ((char_u **)(newargs->ga_data))[newargs->ga_len] = arg;
+ newargs->ga_len++;
+
+ *p = c;
+ }
+ if (*p == ',') {
+ p++;
+ } else {
+ mustend = true;
+ }
+ }
+ p = skipwhite(p);
+ if (mustend && *p != endchar) {
+ if (!skip) {
+ EMSG2(_(e_invarg2), *argp);
+ }
+ break;
+ }
+ }
+ if (*p != endchar) {
+ goto err_ret;
+ }
+ p++; // skip "endchar"
+
+ *argp = p;
+ return OK;
+
+err_ret:
+ if (newargs != NULL) {
+ ga_clear_strings(newargs);
+ }
+ return FAIL;
+}
+
+/// Register function "fp" as using "current_funccal" as its scope.
+static void register_closure(ufunc_T *fp)
+{
+ if (fp->uf_scoped == current_funccal) {
+ // no change
+ return;
+ }
+ funccal_unref(fp->uf_scoped, fp, false);
+ fp->uf_scoped = current_funccal;
+ current_funccal->fc_refcount++;
+ ga_grow(&current_funccal->fc_funcs, 1);
+ ((ufunc_T **)current_funccal->fc_funcs.ga_data)
+ [current_funccal->fc_funcs.ga_len++] = fp;
+}
+
+/// Parse a lambda expression and get a Funcref from "*arg".
+///
+/// @return OK or FAIL. Returns NOTDONE for dict or {expr}.
+static int get_lambda_tv(char_u **arg, typval_T *rettv, bool evaluate)
+{
+ garray_T newargs = GA_EMPTY_INIT_VALUE;
+ garray_T *pnewargs;
+ ufunc_T *fp = NULL;
+ int varargs;
+ int ret;
+ char_u *start = skipwhite(*arg + 1);
+ char_u *s, *e;
+ static int lambda_no = 0;
+ int *old_eval_lavars = eval_lavars_used;
+ int eval_lavars = false;
+
+ // First, check if this is a lambda expression. "->" must exists.
+ ret = get_function_args(&start, '-', NULL, NULL, true);
+ if (ret == FAIL || *start != '>') {
+ return NOTDONE;
+ }
+
+ // Parse the arguments again.
+ if (evaluate) {
+ pnewargs = &newargs;
+ } else {
+ pnewargs = NULL;
+ }
+ *arg = skipwhite(*arg + 1);
+ ret = get_function_args(arg, '-', pnewargs, &varargs, false);
+ if (ret == FAIL || **arg != '>') {
+ goto errret;
+ }
+
+ // Set up a flag for checking local variables and arguments.
+ if (evaluate) {
+ eval_lavars_used = &eval_lavars;
+ }
+
+ // Get the start and the end of the expression.
+ *arg = skipwhite(*arg + 1);
+ s = *arg;
+ ret = skip_expr(arg);
+ if (ret == FAIL) {
+ goto errret;
+ }
+ e = *arg;
+ *arg = skipwhite(*arg);
+ if (**arg != '}') {
+ goto errret;
+ }
+ (*arg)++;
+
+ if (evaluate) {
+ int len, flags = 0;
+ char_u *p;
+ char_u name[20];
+ partial_T *pt;
+ garray_T newlines;
+
+ lambda_no++;
+ snprintf((char *)name, sizeof(name), "<lambda>%d", lambda_no);
+
+ fp = xcalloc(1, offsetof(ufunc_T, uf_name) + STRLEN(name) + 1);
+ pt = xcalloc(1, sizeof(partial_T));
+
+ ga_init(&newlines, (int)sizeof(char_u *), 1);
+ ga_grow(&newlines, 1);
+
+ // Add "return " before the expression.
+ len = 7 + e - s + 1;
+ p = (char_u *)xmalloc(len);
+ ((char_u **)(newlines.ga_data))[newlines.ga_len++] = p;
+ STRCPY(p, "return ");
+ STRLCPY(p + 7, s, e - s + 1);
+
+ fp->uf_refcount = 1;
+ STRCPY(fp->uf_name, name);
+ hash_add(&func_hashtab, UF2HIKEY(fp));
+ fp->uf_args = newargs;
+ fp->uf_lines = newlines;
+ if (current_funccal != NULL && eval_lavars) {
+ flags |= FC_CLOSURE;
+ register_closure(fp);
+ } else {
+ fp->uf_scoped = NULL;
+ }
+
+ fp->uf_tml_count = NULL;
+ fp->uf_tml_total = NULL;
+ fp->uf_tml_self = NULL;
+ fp->uf_profiling = false;
+ if (prof_def_func()) {
+ func_do_profile(fp);
+ }
+ fp->uf_varargs = true;
+ fp->uf_flags = flags;
+ fp->uf_calls = 0;
+ fp->uf_script_ID = current_SID;
+
+ pt->pt_func = fp;
+ pt->pt_refcount = 1;
+ rettv->vval.v_partial = pt;
+ rettv->v_type = VAR_PARTIAL;
+ }
+
+ eval_lavars_used = old_eval_lavars;
+ return OK;
+
+errret:
+ ga_clear_strings(&newargs);
+ xfree(fp);
+ eval_lavars_used = old_eval_lavars;
+ return FAIL;
+}
+
/// Convert the string to a floating point number
///
/// This uses strtod(). setlocale(LC_NUMERIC, "C") has been used earlier to
@@ -6622,6 +5888,19 @@ size_t string2float(const char *const text, float_T *const ret_value)
{
char *s = NULL;
+ // MS-Windows does not deal with "inf" and "nan" properly
+ if (STRNICMP(text, "inf", 3) == 0) {
+ *ret_value = INFINITY;
+ return 3;
+ }
+ if (STRNICMP(text, "-inf", 3) == 0) {
+ *ret_value = -INFINITY;
+ return 4;
+ }
+ if (STRNICMP(text, "nan", 3) == 0) {
+ *ret_value = NAN;
+ return 3;
+ }
*ret_value = strtod(text, &s);
return (size_t) (s - text);
}
@@ -6642,7 +5921,7 @@ static int get_env_tv(char_u **arg, typval_T *rettv, int evaluate)
++*arg;
name = *arg;
- len = get_env_len(arg);
+ len = get_env_len((const char_u **)arg);
if (evaluate) {
if (len == 0) {
@@ -6670,324 +5949,17 @@ static int get_env_tv(char_u **arg, typval_T *rettv, int evaluate)
return OK;
}
-/*
- * Array with names and number of arguments of all internal functions
- * MUST BE KEPT SORTED IN strcmp() ORDER FOR BINARY SEARCH!
- */
-static struct fst {
- char *f_name; /* function name */
- char f_min_argc; /* minimal number of arguments */
- char f_max_argc; /* maximal number of arguments */
- void (*f_func)(typval_T *args, typval_T *rvar);
- /* implementation of function */
-} functions[] =
-{
- { "abs", 1, 1, f_abs },
- { "acos", 1, 1, f_acos }, // WJMc
- { "add", 2, 2, f_add },
- { "and", 2, 2, f_and },
- { "api_info", 0, 0, f_api_info },
- { "append", 2, 2, f_append },
- { "argc", 0, 0, f_argc },
- { "argidx", 0, 0, f_argidx },
- { "arglistid", 0, 2, f_arglistid },
- { "argv", 0, 1, f_argv },
- { "asin", 1, 1, f_asin }, // WJMc
- { "assert_equal", 2, 3, f_assert_equal },
- { "assert_exception", 1, 2, f_assert_exception },
- { "assert_fails", 1, 2, f_assert_fails },
- { "assert_false", 1, 2, f_assert_false },
- { "assert_true", 1, 2, f_assert_true },
- { "atan", 1, 1, f_atan },
- { "atan2", 2, 2, f_atan2 },
- { "browse", 4, 4, f_browse },
- { "browsedir", 2, 2, f_browsedir },
- { "bufexists", 1, 1, f_bufexists },
- { "buffer_exists", 1, 1, f_bufexists }, // obsolete
- { "buffer_name", 1, 1, f_bufname }, // obsolete
- { "buffer_number", 1, 1, f_bufnr }, // obsolete
- { "buflisted", 1, 1, f_buflisted },
- { "bufloaded", 1, 1, f_bufloaded },
- { "bufname", 1, 1, f_bufname },
- { "bufnr", 1, 2, f_bufnr },
- { "bufwinnr", 1, 1, f_bufwinnr },
- { "byte2line", 1, 1, f_byte2line },
- { "byteidx", 2, 2, f_byteidx },
- { "byteidxcomp", 2, 2, f_byteidxcomp },
- { "call", 2, 3, f_call },
- { "capture", 1, 1, f_capture },
- { "ceil", 1, 1, f_ceil },
- { "changenr", 0, 0, f_changenr },
- { "char2nr", 1, 2, f_char2nr },
- { "cindent", 1, 1, f_cindent },
- { "clearmatches", 0, 0, f_clearmatches },
- { "col", 1, 1, f_col },
- { "complete", 2, 2, f_complete },
- { "complete_add", 1, 1, f_complete_add },
- { "complete_check", 0, 0, f_complete_check },
- { "confirm", 1, 4, f_confirm },
- { "copy", 1, 1, f_copy },
- { "cos", 1, 1, f_cos },
- { "cosh", 1, 1, f_cosh },
- { "count", 2, 4, f_count },
- { "cscope_connection", 0, 3, f_cscope_connection },
- { "cursor", 1, 3, f_cursor },
- { "deepcopy", 1, 2, f_deepcopy },
- { "delete", 1, 2, f_delete },
- { "dictwatcheradd", 3, 3, f_dictwatcheradd },
- { "dictwatcherdel", 3, 3, f_dictwatcherdel },
- { "did_filetype", 0, 0, f_did_filetype },
- { "diff_filler", 1, 1, f_diff_filler },
- { "diff_hlID", 2, 2, f_diff_hlID },
- { "empty", 1, 1, f_empty },
- { "escape", 2, 2, f_escape },
- { "eval", 1, 1, f_eval },
- { "eventhandler", 0, 0, f_eventhandler },
- { "executable", 1, 1, f_executable },
- { "exepath", 1, 1, f_exepath },
- { "exists", 1, 1, f_exists },
- { "exp", 1, 1, f_exp },
- { "expand", 1, 3, f_expand },
- { "extend", 2, 3, f_extend },
- { "feedkeys", 1, 2, f_feedkeys },
- { "file_readable", 1, 1, f_filereadable }, // obsolete
- { "filereadable", 1, 1, f_filereadable },
- { "filewritable", 1, 1, f_filewritable },
- { "filter", 2, 2, f_filter },
- { "finddir", 1, 3, f_finddir },
- { "findfile", 1, 3, f_findfile },
- { "float2nr", 1, 1, f_float2nr },
- { "floor", 1, 1, f_floor },
- { "fmod", 2, 2, f_fmod },
- { "fnameescape", 1, 1, f_fnameescape },
- { "fnamemodify", 2, 2, f_fnamemodify },
- { "foldclosed", 1, 1, f_foldclosed },
- { "foldclosedend", 1, 1, f_foldclosedend },
- { "foldlevel", 1, 1, f_foldlevel },
- { "foldtext", 0, 0, f_foldtext },
- { "foldtextresult", 1, 1, f_foldtextresult },
- { "foreground", 0, 0, f_foreground },
- { "function", 1, 1, f_function },
- { "garbagecollect", 0, 1, f_garbagecollect },
- { "get", 2, 3, f_get },
- { "getbufline", 2, 3, f_getbufline },
- { "getbufvar", 2, 3, f_getbufvar },
- { "getchar", 0, 1, f_getchar },
- { "getcharmod", 0, 0, f_getcharmod },
- { "getcharsearch", 0, 0, f_getcharsearch },
- { "getcmdline", 0, 0, f_getcmdline },
- { "getcmdpos", 0, 0, f_getcmdpos },
- { "getcmdtype", 0, 0, f_getcmdtype },
- { "getcmdwintype", 0, 0, f_getcmdwintype },
- { "getcurpos", 0, 0, f_getcurpos },
- { "getcwd", 0, 2, f_getcwd },
- { "getfontname", 0, 1, f_getfontname },
- { "getfperm", 1, 1, f_getfperm },
- { "getfsize", 1, 1, f_getfsize },
- { "getftime", 1, 1, f_getftime },
- { "getftype", 1, 1, f_getftype },
- { "getline", 1, 2, f_getline },
- { "getloclist", 1, 1, f_getqflist },
- { "getmatches", 0, 0, f_getmatches },
- { "getpid", 0, 0, f_getpid },
- { "getpos", 1, 1, f_getpos },
- { "getqflist", 0, 0, f_getqflist },
- { "getreg", 0, 3, f_getreg },
- { "getregtype", 0, 1, f_getregtype },
- { "gettabvar", 2, 3, f_gettabvar },
- { "gettabwinvar", 3, 4, f_gettabwinvar },
- { "getwinposx", 0, 0, f_getwinposx },
- { "getwinposy", 0, 0, f_getwinposy },
- { "getwinvar", 2, 3, f_getwinvar },
- { "glob", 1, 4, f_glob },
- { "glob2regpat", 1, 1, f_glob2regpat },
- { "globpath", 2, 5, f_globpath },
- { "has", 1, 1, f_has },
- { "has_key", 2, 2, f_has_key },
- { "haslocaldir", 0, 2, f_haslocaldir },
- { "hasmapto", 1, 3, f_hasmapto },
- { "highlightID", 1, 1, f_hlID }, // obsolete
- { "highlight_exists", 1, 1, f_hlexists }, // obsolete
- { "histadd", 2, 2, f_histadd },
- { "histdel", 1, 2, f_histdel },
- { "histget", 1, 2, f_histget },
- { "histnr", 1, 1, f_histnr },
- { "hlID", 1, 1, f_hlID },
- { "hlexists", 1, 1, f_hlexists },
- { "hostname", 0, 0, f_hostname },
- { "iconv", 3, 3, f_iconv },
- { "indent", 1, 1, f_indent },
- { "index", 2, 4, f_index },
- { "input", 1, 3, f_input },
- { "inputdialog", 1, 3, f_inputdialog },
- { "inputlist", 1, 1, f_inputlist },
- { "inputrestore", 0, 0, f_inputrestore },
- { "inputsave", 0, 0, f_inputsave },
- { "inputsecret", 1, 2, f_inputsecret },
- { "insert", 2, 3, f_insert },
- { "invert", 1, 1, f_invert },
- { "isdirectory", 1, 1, f_isdirectory },
- { "islocked", 1, 1, f_islocked },
- { "items", 1, 1, f_items },
- { "jobclose", 1, 2, f_jobclose },
- { "jobpid", 1, 1, f_jobpid },
- { "jobresize", 3, 3, f_jobresize },
- { "jobsend", 2, 2, f_jobsend },
- { "jobstart", 1, 2, f_jobstart },
- { "jobstop", 1, 1, f_jobstop },
- { "jobwait", 1, 2, f_jobwait },
- { "join", 1, 2, f_join },
- { "json_decode", 1, 1, f_json_decode },
- { "json_encode", 1, 1, f_json_encode },
- { "keys", 1, 1, f_keys },
- { "last_buffer_nr", 0, 0, f_last_buffer_nr }, // obsolete
- { "len", 1, 1, f_len },
- { "libcall", 3, 3, f_libcall },
- { "libcallnr", 3, 3, f_libcallnr },
- { "line", 1, 1, f_line },
- { "line2byte", 1, 1, f_line2byte },
- { "lispindent", 1, 1, f_lispindent },
- { "localtime", 0, 0, f_localtime },
- { "log", 1, 1, f_log },
- { "log10", 1, 1, f_log10 },
- { "map", 2, 2, f_map },
- { "maparg", 1, 4, f_maparg },
- { "mapcheck", 1, 3, f_mapcheck },
- { "match", 2, 4, f_match },
- { "matchadd", 2, 5, f_matchadd },
- { "matchaddpos", 2, 5, f_matchaddpos },
- { "matcharg", 1, 1, f_matcharg },
- { "matchdelete", 1, 1, f_matchdelete },
- { "matchend", 2, 4, f_matchend },
- { "matchlist", 2, 4, f_matchlist },
- { "matchstr", 2, 4, f_matchstr },
- { "max", 1, 1, f_max },
- { "min", 1, 1, f_min },
- { "mkdir", 1, 3, f_mkdir },
- { "mode", 0, 1, f_mode },
- { "msgpackdump", 1, 1, f_msgpackdump },
- { "msgpackparse", 1, 1, f_msgpackparse },
- { "nextnonblank", 1, 1, f_nextnonblank },
- { "nr2char", 1, 2, f_nr2char },
- { "or", 2, 2, f_or },
- { "pathshorten", 1, 1, f_pathshorten },
- { "pow", 2, 2, f_pow },
- { "prevnonblank", 1, 1, f_prevnonblank },
- { "printf", 2, MAX_FUNC_ARGS, f_printf },
- { "pumvisible", 0, 0, f_pumvisible },
- { "py3eval", 1, 1, f_py3eval },
- { "pyeval", 1, 1, f_pyeval },
- { "range", 1, 3, f_range },
- { "readfile", 1, 3, f_readfile },
- { "reltime", 0, 2, f_reltime },
- { "reltimefloat", 1, 1, f_reltimefloat },
- { "reltimestr", 1, 1, f_reltimestr },
- { "remove", 2, 3, f_remove },
- { "rename", 2, 2, f_rename },
- { "repeat", 2, 2, f_repeat },
- { "resolve", 1, 1, f_resolve },
- { "reverse", 1, 1, f_reverse },
- { "round", 1, 1, f_round },
- { "rpcnotify", 2, MAX_FUNC_ARGS, f_rpcnotify },
- { "rpcrequest", 2, MAX_FUNC_ARGS, f_rpcrequest },
- { "rpcstart", 1, 2, f_rpcstart },
- { "rpcstop", 1, 1, f_rpcstop },
- { "screenattr", 2, 2, f_screenattr },
- { "screenchar", 2, 2, f_screenchar },
- { "screencol", 0, 0, f_screencol },
- { "screenrow", 0, 0, f_screenrow },
- { "search", 1, 4, f_search },
- { "searchdecl", 1, 3, f_searchdecl },
- { "searchpair", 3, 7, f_searchpair },
- { "searchpairpos", 3, 7, f_searchpairpos },
- { "searchpos", 1, 4, f_searchpos },
- { "serverlist", 0, 0, f_serverlist },
- { "serverstart", 0, 1, f_serverstart },
- { "serverstop", 1, 1, f_serverstop },
- { "setbufvar", 3, 3, f_setbufvar },
- { "setcharsearch", 1, 1, f_setcharsearch },
- { "setcmdpos", 1, 1, f_setcmdpos },
- { "setfperm", 2, 2, f_setfperm },
- { "setline", 2, 2, f_setline },
- { "setloclist", 2, 4, f_setloclist },
- { "setmatches", 1, 1, f_setmatches },
- { "setpos", 2, 2, f_setpos },
- { "setqflist", 1, 3, f_setqflist },
- { "setreg", 2, 3, f_setreg },
- { "settabvar", 3, 3, f_settabvar },
- { "settabwinvar", 4, 4, f_settabwinvar },
- { "setwinvar", 3, 3, f_setwinvar },
- { "sha256", 1, 1, f_sha256 },
- { "shellescape", 1, 2, f_shellescape },
- { "shiftwidth", 0, 0, f_shiftwidth },
- { "simplify", 1, 1, f_simplify },
- { "sin", 1, 1, f_sin },
- { "sinh", 1, 1, f_sinh },
- { "sort", 1, 3, f_sort },
- { "soundfold", 1, 1, f_soundfold },
- { "spellbadword", 0, 1, f_spellbadword },
- { "spellsuggest", 1, 3, f_spellsuggest },
- { "split", 1, 3, f_split },
- { "sqrt", 1, 1, f_sqrt },
- { "str2float", 1, 1, f_str2float },
- { "str2nr", 1, 2, f_str2nr },
- { "strchars", 1, 2, f_strchars },
- { "strdisplaywidth", 1, 2, f_strdisplaywidth },
- { "strftime", 1, 2, f_strftime },
- { "stridx", 2, 3, f_stridx },
- { "string", 1, 1, f_string },
- { "strlen", 1, 1, f_strlen },
- { "strpart", 2, 3, f_strpart },
- { "strridx", 2, 3, f_strridx },
- { "strtrans", 1, 1, f_strtrans },
- { "strwidth", 1, 1, f_strwidth },
- { "submatch", 1, 2, f_submatch },
- { "substitute", 4, 4, f_substitute },
- { "synID", 3, 3, f_synID },
- { "synIDattr", 2, 3, f_synIDattr },
- { "synIDtrans", 1, 1, f_synIDtrans },
- { "synconcealed", 2, 2, f_synconcealed },
- { "synstack", 2, 2, f_synstack },
- { "system", 1, 2, f_system },
- { "systemlist", 1, 3, f_systemlist },
- { "tabpagebuflist", 0, 1, f_tabpagebuflist },
- { "tabpagenr", 0, 1, f_tabpagenr },
- { "tabpagewinnr", 1, 2, f_tabpagewinnr },
- { "tagfiles", 0, 0, f_tagfiles },
- { "taglist", 1, 1, f_taglist },
- { "tan", 1, 1, f_tan },
- { "tanh", 1, 1, f_tanh },
- { "tempname", 0, 0, f_tempname },
- { "termopen", 1, 2, f_termopen },
- { "test", 1, 1, f_test },
- { "timer_start", 2, 3, f_timer_start },
- { "timer_stop", 1, 1, f_timer_stop },
- { "tolower", 1, 1, f_tolower },
- { "toupper", 1, 1, f_toupper },
- { "tr", 3, 3, f_tr },
- { "trunc", 1, 1, f_trunc },
- { "type", 1, 1, f_type },
- { "undofile", 1, 1, f_undofile },
- { "undotree", 0, 0, f_undotree },
- { "uniq", 1, 3, f_uniq },
- { "values", 1, 1, f_values },
- { "virtcol", 1, 1, f_virtcol },
- { "visualmode", 0, 1, f_visualmode },
- { "wildmenumode", 0, 0, f_wildmenumode },
- { "winbufnr", 1, 1, f_winbufnr },
- { "wincol", 0, 0, f_wincol },
- { "winheight", 1, 1, f_winheight },
- { "winline", 0, 0, f_winline },
- { "winnr", 0, 1, f_winnr },
- { "winrestcmd", 0, 0, f_winrestcmd },
- { "winrestview", 1, 1, f_winrestview },
- { "winsaveview", 0, 0, f_winsaveview },
- { "winwidth", 1, 1, f_winwidth },
- { "wordcount", 0, 0, f_wordcount },
- { "writefile", 2, 3, f_writefile },
- { "xor", 2, 2, f_xor },
-};
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+
+#ifdef _MSC_VER
+// This prevents MSVC from replacing the functions with intrinsics,
+// and causing errors when trying to get their addresses in funcs.generated.h
+#pragma function (ceil)
+#pragma function (floor)
+#endif
+# include "funcs.generated.h"
+#endif
/*
* Function given to ExpandGeneric() to obtain the list of internal
@@ -7005,15 +5977,25 @@ char_u *get_function_name(expand_T *xp, int idx)
if (name != NULL)
return name;
}
- if (++intidx < (int)ARRAY_SIZE(functions)) {
- STRCPY(IObuff, functions[intidx].f_name);
- STRCAT(IObuff, "(");
- if (functions[intidx].f_max_argc == 0)
- STRCAT(IObuff, ")");
- return IObuff;
+ while ( (size_t)++intidx < ARRAY_SIZE(functions)
+ && functions[intidx].name[0] == '\0') {
}
- return NULL;
+ if ((size_t)intidx >= ARRAY_SIZE(functions)) {
+ return NULL;
+ }
+
+ const char *const key = functions[intidx].name;
+ const size_t key_len = strlen(key);
+ memcpy(IObuff, key, key_len);
+ IObuff[key_len] = '(';
+ if (functions[intidx].max_argc == 0) {
+ IObuff[key_len + 1] = ')';
+ IObuff[key_len + 2] = NUL;
+ } else {
+ IObuff[key_len + 1] = NUL;
+ }
+ return IObuff;
}
/*
@@ -7035,77 +6017,85 @@ char_u *get_expr_name(expand_T *xp, int idx)
return get_user_var_name(xp, ++intidx);
}
-
-
-
-/*
- * Find internal function in table above.
- * Return index, or -1 if not found
- */
-static int
-find_internal_func (
- char_u *name /* name of the function */
-)
+/// Find internal function in hash functions
+///
+/// @param[in] name Name of the function.
+///
+/// Returns pointer to the function definition or NULL if not found.
+static const VimLFuncDef *find_internal_func(const char *const name)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_PURE FUNC_ATTR_NONNULL_ALL
{
- int first = 0;
- int last = (int)ARRAY_SIZE(functions) - 1;
-
- /*
- * Find the function name in the table. Binary search.
- */
- while (first <= last) {
- int x = first + ((unsigned)(last - first)) / 2;
- int cmp = STRCMP(name, functions[x].f_name);
- if (cmp < 0)
- last = x - 1;
- else if (cmp > 0)
- first = x + 1;
- else
- return x;
- }
- return -1;
+ size_t len = strlen(name);
+ return find_internal_func_gperf(name, len);
}
-/*
- * Check if "name" is a variable of type VAR_FUNC. If so, return the function
- * name it contains, otherwise return "name".
- */
-static char_u *deref_func_name(char_u *name, int *lenp, int no_autoload)
+/// Return name of the function corresponding to `name`
+///
+/// If `name` points to variable that is either a function or partial then
+/// corresponding function name is returned. Otherwise it returns `name` itself.
+///
+/// @param[in] name Function name to check.
+/// @param[in,out] lenp Location where length of the returned name is stored.
+/// Must be set to the length of the `name` argument.
+/// @param[out] partialp Location where partial will be stored if found
+/// function appears to be a partial. May be NULL if this
+/// is not needed.
+/// @param[in] no_autoload If true, do not source autoload scripts if function
+/// was not found.
+///
+/// @return name of the function.
+static char_u *deref_func_name(const char *name, int *lenp,
+ partial_T **const partialp, bool no_autoload)
+ FUNC_ATTR_NONNULL_ARG(1, 2)
{
- dictitem_T *v;
- int cc;
+ if (partialp != NULL) {
+ *partialp = NULL;
+ }
- cc = name[*lenp];
- name[*lenp] = NUL;
- v = find_var(name, NULL, no_autoload);
- name[*lenp] = cc;
+ dictitem_T *const v = find_var(name, (size_t)(*lenp), NULL, no_autoload);
if (v != NULL && v->di_tv.v_type == VAR_FUNC) {
- if (v->di_tv.vval.v_string == NULL) {
+ if (v->di_tv.vval.v_string == NULL) { // just in case
*lenp = 0;
- return (char_u *)""; /* just in case */
+ return (char_u *)"";
}
*lenp = (int)STRLEN(v->di_tv.vval.v_string);
return v->di_tv.vval.v_string;
}
- return name;
+ if (v != NULL && v->di_tv.v_type == VAR_PARTIAL) {
+ partial_T *const pt = v->di_tv.vval.v_partial;
+
+ if (pt == NULL) { // just in case
+ *lenp = 0;
+ return (char_u *)"";
+ }
+ if (partialp != NULL) {
+ *partialp = pt;
+ }
+ char_u *s = partial_name(pt);
+ *lenp = (int)STRLEN(s);
+ return s;
+ }
+
+ return (char_u *)name;
}
/*
* Allocate a variable for the result of a function.
* Return OK or FAIL.
*/
-static int
-get_func_tv (
- char_u *name, /* name of the function */
- int len, /* length of "name" */
+static int
+get_func_tv(
+ char_u *name, // name of the function
+ int len, // length of "name"
typval_T *rettv,
- char_u **arg, /* argument, pointing to the '(' */
- linenr_T firstline, /* first line of range */
- linenr_T lastline, /* last line of range */
- int *doesrange, /* return: function handled range */
+ char_u **arg, // argument, pointing to the '('
+ linenr_T firstline, // first line of range
+ linenr_T lastline, // last line of range
+ int *doesrange, // return: function handled range
int evaluate,
- dict_T *selfdict /* Dictionary for "self" */
+ partial_T *partial, // for extra arguments
+ dict_T *selfdict // Dictionary for "self"
)
{
char_u *argp;
@@ -7117,10 +6107,11 @@ get_func_tv (
* Get the arguments.
*/
argp = *arg;
- while (argcount < MAX_FUNC_ARGS) {
- argp = skipwhite(argp + 1); /* skip the '(' or ',' */
- if (*argp == ')' || *argp == ',' || *argp == NUL)
+ while (argcount < MAX_FUNC_ARGS - (partial == NULL ? 0 : partial->pt_argc)) {
+ argp = skipwhite(argp + 1); // skip the '(' or ','
+ if (*argp == ')' || *argp == ',' || *argp == NUL) {
break;
+ }
if (eval1(&argp, &argvars[argcount], evaluate) == FAIL) {
ret = FAIL;
break;
@@ -7134,81 +6125,89 @@ get_func_tv (
else
ret = FAIL;
- if (ret == OK)
- ret = call_func(name, len, rettv, argcount, argvars,
- firstline, lastline, doesrange, evaluate, selfdict);
- else if (!aborting()) {
- if (argcount == MAX_FUNC_ARGS)
+ if (ret == OK) {
+ int i = 0;
+
+ if (get_vim_var_nr(VV_TESTING)) {
+ // Prepare for calling garbagecollect_for_testing(), need to know
+ // what variables are used on the call stack.
+ if (funcargs.ga_itemsize == 0) {
+ ga_init(&funcargs, (int)sizeof(typval_T *), 50);
+ }
+ for (i = 0; i < argcount; i++) {
+ ga_grow(&funcargs, 1);
+ ((typval_T **)funcargs.ga_data)[funcargs.ga_len++] = &argvars[i];
+ }
+ }
+ ret = call_func(name, len, rettv, argcount, argvars, NULL,
+ firstline, lastline, doesrange, evaluate,
+ partial, selfdict);
+
+ funcargs.ga_len -= i;
+ } else if (!aborting()) {
+ if (argcount == MAX_FUNC_ARGS) {
emsg_funcname(N_("E740: Too many arguments for function %s"), name);
- else
+ } else {
emsg_funcname(N_("E116: Invalid arguments for function %s"), name);
+ }
}
- while (--argcount >= 0)
- clear_tv(&argvars[argcount]);
+ while (--argcount >= 0) {
+ tv_clear(&argvars[argcount]);
+ }
*arg = skipwhite(argp);
return ret;
}
+typedef enum {
+ ERROR_UNKNOWN = 0,
+ ERROR_TOOMANY,
+ ERROR_TOOFEW,
+ ERROR_SCRIPT,
+ ERROR_DICT,
+ ERROR_NONE,
+ ERROR_OTHER,
+ ERROR_BOTH,
+ ERROR_DELETED,
+} FnameTransError;
-/*
- * Call a function with its resolved parameters
- * Return FAIL when the function can't be called, OK otherwise.
- * Also returns OK when an error was encountered while executing the function.
- */
-int
-call_func (
- char_u *funcname, /* name of the function */
- int len, /* length of "name" */
- typval_T *rettv, /* return value goes here */
- int argcount, /* number of "argvars" */
- typval_T *argvars, /* vars for arguments, must have "argcount"
- PLUS ONE elements! */
- linenr_T firstline, /* first line of range */
- linenr_T lastline, /* last line of range */
- int *doesrange, /* return: function handled range */
- int evaluate,
- dict_T *selfdict /* Dictionary for "self" */
-)
-{
- int ret = FAIL;
-#define ERROR_UNKNOWN 0
-#define ERROR_TOOMANY 1
-#define ERROR_TOOFEW 2
-#define ERROR_SCRIPT 3
-#define ERROR_DICT 4
-#define ERROR_NONE 5
-#define ERROR_OTHER 6
- int error = ERROR_NONE;
- int i;
- int llen;
- ufunc_T *fp;
#define FLEN_FIXED 40
- char_u fname_buf[FLEN_FIXED + 1];
- char_u *fname;
- char_u *name;
-
- /* 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);
- /*
- * In a script change <SID>name() and s:name() to K_SNR 123_name().
- * Change <SNR>123_name() to K_SNR 123_name().
- * Use fname_buf[] when it fits, otherwise allocate memory (slow).
- */
- llen = eval_fname_script(name);
+/// In a script transform script-local names into actually used names
+///
+/// Transforms "<SID>" and "s:" prefixes to `K_SNR {N}` (e.g. K_SNR "123") and
+/// "<SNR>" prefix to `K_SNR`. Uses `fname_buf` buffer that is supposed to have
+/// #FLEN_FIXED + 1 length when it fits, otherwise it allocates memory.
+///
+/// @param[in] name Name to transform.
+/// @param fname_buf Buffer to save resulting function name to, if it fits.
+/// Must have at least #FLEN_FIXED + 1 length.
+/// @param[out] tofree Location where pointer to an allocated memory is saved
+/// in case result does not fit into fname_buf.
+/// @param[out] error Location where error type is saved, @see
+/// FnameTransError.
+///
+/// @return transformed name: either `fname_buf` or a pointer to an allocated
+/// memory.
+static char_u *fname_trans_sid(const char_u *const name,
+ char_u *const fname_buf,
+ char_u **const tofree, int *const error)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ char_u *fname;
+ const int llen = eval_fname_script((const char *)name);
if (llen > 0) {
fname_buf[0] = K_SPECIAL;
fname_buf[1] = KS_EXTRA;
fname_buf[2] = (int)KE_SNR;
- i = 3;
- if (eval_fname_sid(name)) { /* "<SID>" or "s:" */
- if (current_SID <= 0)
- error = ERROR_SCRIPT;
- else {
- sprintf((char *)fname_buf + 3, "%" PRId64 "_", (int64_t)current_SID);
+ int i = 3;
+ if (eval_fname_sid((const char *)name)) { // "<SID>" or "s:"
+ if (current_SID <= 0) {
+ *error = ERROR_SCRIPT;
+ } else {
+ snprintf((char *)fname_buf + 3, FLEN_FIXED + 1, "%" PRId64 "_",
+ (int64_t)current_SID);
i = (int)STRLEN(fname_buf);
}
}
@@ -7217,13 +6216,114 @@ call_func (
fname = fname_buf;
} else {
fname = xmalloc(i + STRLEN(name + llen) + 1);
+ *tofree = fname;
memmove(fname, fname_buf, (size_t)i);
STRCPY(fname + i, name + llen);
}
- } else
- fname = name;
+ } else {
+ fname = (char_u *)name;
+ }
+
+ return fname;
+}
+
+/// Mark all lists and dicts referenced through function "name" with "copyID".
+/// "list_stack" is used to add lists to be marked. Can be NULL.
+/// "ht_stack" is used to add hashtabs to be marked. Can be NULL.
+///
+/// @return true if setting references failed somehow.
+bool set_ref_in_func(char_u *name, ufunc_T *fp_in, int copyID)
+{
+ ufunc_T *fp = fp_in;
+ funccall_T *fc;
+ int error = ERROR_NONE;
+ char_u fname_buf[FLEN_FIXED + 1];
+ char_u *tofree = NULL;
+ char_u *fname;
+ bool abort = false;
+ if (name == NULL && fp_in == NULL) {
+ return false;
+ }
+
+ if (fp_in == NULL) {
+ fname = fname_trans_sid(name, fname_buf, &tofree, &error);
+ fp = find_func(fname);
+ }
+ if (fp != NULL) {
+ for (fc = fp->uf_scoped; fc != NULL; fc = fc->func->uf_scoped) {
+ abort = abort || set_ref_in_funccal(fc, copyID);
+ }
+ }
+ xfree(tofree);
+ return abort;
+}
- *doesrange = FALSE;
+/// Call a function with its resolved parameters
+///
+/// "argv_func", when not NULL, can be used to fill in arguments only when the
+/// invoked function uses them. It is called like this:
+/// new_argcount = argv_func(current_argcount, argv, called_func_argcount)
+///
+/// @return FAIL if function cannot be called, else OK (even if an error
+/// occurred while executing the function! Set `msg_list` to capture
+/// the error, see do_cmdline()).
+int
+call_func(
+ const char_u *funcname, // name of the function
+ int len, // length of "name"
+ typval_T *rettv, // [out] value goes here
+ int argcount_in, // number of "argvars"
+ typval_T *argvars_in, // vars for arguments, must have "argcount"
+ // PLUS ONE elements!
+ ArgvFunc argv_func, // function to fill in argvars
+ linenr_T firstline, // first line of range
+ linenr_T lastline, // last line of range
+ int *doesrange, // [out] function handled range
+ bool evaluate,
+ partial_T *partial, // optional, can be NULL
+ dict_T *selfdict_in // Dictionary for "self"
+)
+{
+ int ret = FAIL;
+ int error = ERROR_NONE;
+ ufunc_T *fp;
+ char_u fname_buf[FLEN_FIXED + 1];
+ char_u *tofree = NULL;
+ char_u *fname;
+ char_u *name;
+ int argcount = argcount_in;
+ typval_T *argvars = argvars_in;
+ dict_T *selfdict = selfdict_in;
+ typval_T argv[MAX_FUNC_ARGS + 1]; // used when "partial" is not NULL
+ int argv_clear = 0;
+
+ // 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;
+
+ if (partial != NULL) {
+ // When the function has a partial with a dict and there is a dict
+ // argument, use the dict argument. That is backwards compatible.
+ // When the dict was bound explicitly use the one from the partial.
+ if (partial->pt_dict != NULL
+ && (selfdict_in == NULL || !partial->pt_auto)) {
+ selfdict = partial->pt_dict;
+ }
+ if (error == ERROR_NONE && partial->pt_argc > 0) {
+ for (argv_clear = 0; argv_clear < partial->pt_argc; argv_clear++) {
+ tv_copy(&partial->pt_argv[argv_clear], &argv[argv_clear]);
+ }
+ for (int i = 0; i < argcount_in; i++) {
+ argv[i + argv_clear] = argvars_in[i];
+ }
+ argvars = argv;
+ argcount = partial->pt_argc + argcount_in;
+ }
+ }
/* execute the function if no errors detected and executing */
@@ -7239,54 +6339,61 @@ call_func (
rettv->vval.v_number = 0;
error = ERROR_UNKNOWN;
- if (!builtin_function(rfname, -1)) {
- /*
- * User defined function.
- */
- fp = find_func(rfname);
+ if (!builtin_function((const char *)rfname, -1)) {
+ // User defined function.
+ if (partial != NULL && partial->pt_func != NULL) {
+ fp = partial->pt_func;
+ } else {
+ fp = find_func(rfname);
+ }
- /* Trigger FuncUndefined event, may load the function. */
+ // Trigger FuncUndefined event, may load the function.
if (fp == NULL
&& apply_autocmds(EVENT_FUNCUNDEFINED, rfname, rfname, TRUE, NULL)
&& !aborting()) {
/* executed an autocommand, search for the function again */
fp = find_func(rfname);
}
- /* Try loading a package. */
- if (fp == NULL && script_autoload(rfname, TRUE) && !aborting()) {
- /* loaded a package, search for the function again */
+ // Try loading a package.
+ if (fp == NULL && script_autoload((const char *)rfname, STRLEN(rfname),
+ true) && !aborting()) {
+ // Loaded a package, search for the function again.
fp = find_func(rfname);
}
- if (fp != NULL) {
- if (fp->uf_flags & FC_RANGE)
- *doesrange = TRUE;
- if (argcount < fp->uf_args.ga_len)
+ if (fp != NULL && (fp->uf_flags & FC_DELETED)) {
+ error = ERROR_DELETED;
+ } else if (fp != NULL) {
+ if (argv_func != NULL) {
+ argcount = argv_func(argcount, argvars, fp->uf_args.ga_len);
+ }
+ if (fp->uf_flags & FC_RANGE) {
+ *doesrange = true;
+ }
+ if (argcount < fp->uf_args.ga_len) {
error = ERROR_TOOFEW;
- else if (!fp->uf_varargs && argcount > fp->uf_args.ga_len)
+ } else if (!fp->uf_varargs && argcount > fp->uf_args.ga_len) {
error = ERROR_TOOMANY;
- else if ((fp->uf_flags & FC_DICT) && selfdict == NULL)
+ } else if ((fp->uf_flags & FC_DICT) && selfdict == NULL) {
error = ERROR_DICT;
- else {
+ } else {
// Call the user function.
call_user_func(fp, argcount, argvars, rettv, firstline, lastline,
- (fp->uf_flags & FC_DICT) ? selfdict : NULL);
+ (fp->uf_flags & FC_DICT) ? selfdict : NULL);
error = ERROR_NONE;
}
}
} else {
- /*
- * Find the function name in the table, call its implementation.
- */
- i = find_internal_func(fname);
- if (i >= 0) {
- if (argcount < functions[i].f_min_argc)
+ // Find the function name in the table, call its implementation.
+ const VimLFuncDef *const fdef = find_internal_func((const char *)fname);
+ if (fdef != NULL) {
+ if (argcount < fdef->min_argc) {
error = ERROR_TOOFEW;
- else if (argcount > functions[i].f_max_argc)
+ } else if (argcount > fdef->max_argc) {
error = ERROR_TOOMANY;
- else {
+ } else {
argvars[argcount].v_type = VAR_UNKNOWN;
- functions[i].f_func(argvars, rettv);
+ fdef->func(argvars, rettv, fdef->data);
error = ERROR_NONE;
}
}
@@ -7315,6 +6422,9 @@ call_func (
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;
@@ -7333,28 +6443,34 @@ call_func (
}
}
- if (fname != name && fname != fname_buf)
- xfree(fname);
+ while (argv_clear > 0) {
+ tv_clear(&argv[--argv_clear]);
+ }
+ xfree(tofree);
xfree(name);
return ret;
}
-/*
- * Give an error message with a function name. Handle <SNR> things.
- * "ermsg" is to be passed without translation, use N_() instead of _().
- */
+/// Give an error message with a function name. Handle <SNR> things.
+///
+/// @param ermsg must be passed without translation (use N_() instead of _()).
+/// @param name function name
static void emsg_funcname(char *ermsg, char_u *name)
{
- char_u *p;
+ char_u *p;
- if (*name == K_SPECIAL)
+ if (*name == K_SPECIAL) {
p = concat_str((char_u *)"<SNR>", name + 3);
- else
+ } else {
p = name;
+ }
+
EMSG2(_(ermsg), p);
- if (p != name)
+
+ if (p != name) {
xfree(p);
+ }
}
/*
@@ -7362,11 +6478,13 @@ static void emsg_funcname(char *ermsg, char_u *name)
*/
static int non_zero_arg(typval_T *argvars)
{
- return (argvars[0].v_type == VAR_NUMBER
- && argvars[0].vval.v_number != 0)
- || (argvars[0].v_type == VAR_STRING
- && argvars[0].vval.v_string != NULL
- && *argvars[0].vval.v_string != NUL);
+ return ((argvars[0].v_type == VAR_NUMBER
+ && argvars[0].vval.v_number != 0)
+ || (argvars[0].v_type == VAR_SPECIAL
+ && argvars[0].vval.v_special == kSpecialVarTrue)
+ || (argvars[0].v_type == VAR_STRING
+ && argvars[0].vval.v_string != NULL
+ && *argvars[0].vval.v_string != NUL));
}
/*********************************************
@@ -7374,105 +6492,103 @@ static int non_zero_arg(typval_T *argvars)
*/
-/*
- * Get the float value of "argvars[0]" into "f".
- * Returns FAIL when the argument is not a Number or Float.
- */
-static inline int get_float_arg(typval_T *argvars, float_T *f)
-{
- if (argvars[0].v_type == VAR_FLOAT) {
- *f = argvars[0].vval.v_float;
- return OK;
- }
- if (argvars[0].v_type == VAR_NUMBER) {
- *f = (float_T)argvars[0].vval.v_number;
- return OK;
- }
- EMSG(_("E808: Number or Float required"));
- return FAIL;
-}
-
// Apply a floating point C function on a typval with one float_T.
//
// Some versions of glibc on i386 have an optimization that makes it harder to
// call math functions indirectly from inside an inlined function, causing
// compile-time errors. Avoid `inline` in that case. #3072
-#ifndef ARCH_32
-inline
-#endif
-static void float_op_wrapper(typval_T *argvars, typval_T *rettv,
- float_T (*function)(float_T))
+static void float_op_wrapper(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
float_T f;
+ float_T (*function)(float_T) = (float_T (*)(float_T))fptr;
rettv->v_type = VAR_FLOAT;
- if (get_float_arg(argvars, &f) == OK) {
+ if (tv_get_float_chk(argvars, &f)) {
rettv->vval.v_float = function(f);
} else {
rettv->vval.v_float = 0.0;
}
}
+static void api_wrapper(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ ApiDispatchWrapper fn = (ApiDispatchWrapper)fptr;
+
+ Array args = ARRAY_DICT_INIT;
+
+ for (typval_T *tv = argvars; tv->v_type != VAR_UNKNOWN; tv++) {
+ ADD(args, vim_to_object(tv));
+ }
+
+ Error err = ERROR_INIT;
+ Object result = fn(VIML_INTERNAL_CALL, args, &err);
+
+ if (ERROR_SET(&err)) {
+ nvim_err_writeln(cstr_as_string(err.msg));
+ goto end;
+ }
+
+ if (!object_to_vim(result, rettv, &err)) {
+ EMSG2(_("Error converting the call result: %s"), err.msg);
+ }
+
+end:
+ api_free_array(args);
+ api_free_object(result);
+ api_clear_error(&err);
+}
+
/*
* "abs(expr)" function
*/
-static void f_abs(typval_T *argvars, typval_T *rettv)
+static void f_abs(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
if (argvars[0].v_type == VAR_FLOAT) {
- float_op_wrapper(argvars, rettv, &fabs);
+ float_op_wrapper(argvars, rettv, (FunPtr)&fabs);
} else {
varnumber_T n;
- int error = FALSE;
+ bool error = false;
- n = get_tv_number_chk(&argvars[0], &error);
- if (error)
+ n = tv_get_number_chk(&argvars[0], &error);
+ if (error) {
rettv->vval.v_number = -1;
- else if (n > 0)
+ } else if (n > 0) {
rettv->vval.v_number = n;
- else
+ } else {
rettv->vval.v_number = -n;
+ }
}
}
/*
- * "acos()" function
- */
-static void f_acos(typval_T *argvars, typval_T *rettv)
-{
- float_op_wrapper(argvars, rettv, &acos);
-}
-
-/*
* "add(list, item)" function
*/
-static void f_add(typval_T *argvars, typval_T *rettv)
+static void f_add(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- list_T *l;
-
- rettv->vval.v_number = 1; /* Default: Failed */
+ rettv->vval.v_number = 1; // Default: failed.
if (argvars[0].v_type == VAR_LIST) {
- if ((l = argvars[0].vval.v_list) != NULL
- && !tv_check_lock(l->lv_lock,
- (char_u *)N_("add() argument"), true)) {
- list_append_tv(l, &argvars[1]);
- copy_tv(&argvars[0], rettv);
+ list_T *const l = argvars[0].vval.v_list;
+ if (!tv_check_lock(tv_list_locked(l), N_("add() argument"), TV_TRANSLATE)) {
+ tv_list_append_tv(l, &argvars[1]);
+ tv_copy(&argvars[0], rettv);
}
- } else
+ } else {
EMSG(_(e_listreq));
+ }
}
/*
* "and(expr, expr)" function
*/
-static void f_and(typval_T *argvars, typval_T *rettv)
+static void f_and(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- rettv->vval.v_number = get_tv_number_chk(&argvars[0], NULL)
- & get_tv_number_chk(&argvars[1], NULL);
+ rettv->vval.v_number = tv_get_number_chk(&argvars[0], NULL)
+ & tv_get_number_chk(&argvars[1], NULL);
}
/// "api_info()" function
-static void f_api_info(typval_T *argvars, typval_T *rettv)
+static void f_api_info(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
Dictionary metadata = api_metadata();
(void)object_to_vim(DICTIONARY_OBJ(metadata), rettv, NULL);
@@ -7482,10 +6598,9 @@ static void f_api_info(typval_T *argvars, typval_T *rettv)
/*
* "append(lnum, string/list)" function
*/
-static void f_append(typval_T *argvars, typval_T *rettv)
+static void f_append(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
long lnum;
- char_u *line;
list_T *l = NULL;
listitem_T *li = NULL;
typval_T *tv;
@@ -7498,33 +6613,36 @@ static void f_append(typval_T *argvars, typval_T *rettv)
u_sync(TRUE);
}
- lnum = get_tv_lnum(argvars);
+ lnum = tv_get_lnum(argvars);
if (lnum >= 0
&& lnum <= curbuf->b_ml.ml_line_count
&& u_save(lnum, lnum + 1) == OK) {
if (argvars[1].v_type == VAR_LIST) {
l = argvars[1].vval.v_list;
- if (l == NULL)
+ if (l == NULL) {
return;
- li = l->lv_first;
+ }
+ li = tv_list_first(l);
}
for (;; ) {
- if (l == NULL)
- tv = &argvars[1]; /* append a string */
- else if (li == NULL)
- break; /* end of list */
- else
- tv = &li->li_tv; /* append item from list */
- line = get_tv_string_chk(tv);
- if (line == NULL) { /* type error */
- rettv->vval.v_number = 1; /* Failed */
+ if (l == NULL) {
+ tv = &argvars[1]; // Append a string.
+ } else if (li == NULL) {
+ break; // End of list.
+ } else {
+ tv = TV_LIST_ITEM_TV(li); // Append item from list.
+ }
+ const char *const line = tv_get_string_chk(tv);
+ if (line == NULL) { // Type error.
+ rettv->vval.v_number = 1; // Failed.
break;
}
- ml_append(lnum + added, line, (colnr_T)0, FALSE);
- ++added;
- if (l == NULL)
+ ml_append(lnum + added, (char_u *)line, (colnr_T)0, false);
+ added++;
+ if (l == NULL) {
break;
- li = li->li_next;
+ }
+ li = TV_LIST_ITEM_NEXT(l, li);
}
appended_lines_mark(lnum, added);
@@ -7537,7 +6655,7 @@ static void f_append(typval_T *argvars, typval_T *rettv)
/*
* "argc()" function
*/
-static void f_argc(typval_T *argvars, typval_T *rettv)
+static void f_argc(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->vval.v_number = ARGCOUNT;
}
@@ -7545,13 +6663,13 @@ static void f_argc(typval_T *argvars, typval_T *rettv)
/*
* "argidx()" function
*/
-static void f_argidx(typval_T *argvars, typval_T *rettv)
+static void f_argidx(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->vval.v_number = curwin->w_arg_idx;
}
/// "arglistid" function
-static void f_arglistid(typval_T *argvars, typval_T *rettv)
+static void f_arglistid(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->vval.v_number = -1;
win_T *wp = find_tabwin(&argvars[0], &argvars[1]);
@@ -7563,21 +6681,24 @@ static void f_arglistid(typval_T *argvars, typval_T *rettv)
/*
* "argv(nr)" function
*/
-static void f_argv(typval_T *argvars, typval_T *rettv)
+static void f_argv(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
int idx;
if (argvars[0].v_type != VAR_UNKNOWN) {
- idx = get_tv_number_chk(&argvars[0], NULL);
- if (idx >= 0 && idx < ARGCOUNT)
- rettv->vval.v_string = vim_strsave(alist_name(&ARGLIST[idx]));
- else
+ idx = (int)tv_get_number_chk(&argvars[0], NULL);
+ if (idx >= 0 && idx < ARGCOUNT) {
+ rettv->vval.v_string = (char_u *)xstrdup(
+ (const char *)alist_name(&ARGLIST[idx]));
+ } else {
rettv->vval.v_string = NULL;
+ }
rettv->v_type = VAR_STRING;
} else {
- rettv_list_alloc(rettv);
- for (idx = 0; idx < ARGCOUNT; ++idx) {
- list_append_string(rettv->vval.v_list, alist_name(&ARGLIST[idx]), -1);
+ tv_list_alloc_ret(rettv, ARGCOUNT);
+ for (idx = 0; idx < ARGCOUNT; idx++) {
+ tv_list_append_string(rettv->vval.v_list,
+ (const char *)alist_name(&ARGLIST[idx]), -1);
}
}
}
@@ -7603,29 +6724,79 @@ static void prepare_assert_error(garray_T *gap)
}
}
+// Append "str" to "gap", escaping unprintable characters.
+// Changes NL to \n, CR to \r, etc.
+static void ga_concat_esc(garray_T *gap, char_u *str)
+{
+ char_u *p;
+ char_u buf[NUMBUFLEN];
+
+ if (str == NULL) {
+ ga_concat(gap, (char_u *)"NULL");
+ return;
+ }
+
+ for (p = str; *p != NUL; p++) {
+ switch (*p) {
+ case BS: ga_concat(gap, (char_u *)"\\b"); break;
+ case ESC: ga_concat(gap, (char_u *)"\\e"); break;
+ case FF: ga_concat(gap, (char_u *)"\\f"); break;
+ case NL: ga_concat(gap, (char_u *)"\\n"); break;
+ case TAB: ga_concat(gap, (char_u *)"\\t"); break;
+ case CAR: ga_concat(gap, (char_u *)"\\r"); break;
+ case '\\': ga_concat(gap, (char_u *)"\\\\"); break;
+ default:
+ if (*p < ' ') {
+ vim_snprintf((char *)buf, NUMBUFLEN, "\\x%02x", *p);
+ ga_concat(gap, buf);
+ } else {
+ ga_append(gap, *p);
+ }
+ break;
+ }
+ }
+}
+
// Fill "gap" with information about an assert error.
static void fill_assert_error(garray_T *gap, typval_T *opt_msg_tv,
char_u *exp_str, typval_T *exp_tv,
- typval_T *got_tv)
+ typval_T *got_tv, assert_type_T atype)
{
char_u *tofree;
if (opt_msg_tv->v_type != VAR_UNKNOWN) {
- tofree = (char_u *) encode_tv2string(opt_msg_tv, NULL);
+ tofree = (char_u *)encode_tv2echo(opt_msg_tv, NULL);
ga_concat(gap, tofree);
xfree(tofree);
+ ga_concat(gap, (char_u *)": ");
+ }
+
+ if (atype == ASSERT_MATCH || atype == ASSERT_NOTMATCH) {
+ ga_concat(gap, (char_u *)"Pattern ");
+ } else if (atype == ASSERT_NOTEQUAL) {
+ ga_concat(gap, (char_u *)"Expected not equal to ");
} else {
ga_concat(gap, (char_u *)"Expected ");
- if (exp_str == NULL) {
- tofree = (char_u *) encode_tv2string(exp_tv, NULL);
- ga_concat(gap, tofree);
- xfree(tofree);
+ }
+
+ if (exp_str == NULL) {
+ tofree = (char_u *)encode_tv2string(exp_tv, NULL);
+ ga_concat_esc(gap, tofree);
+ xfree(tofree);
+ } else {
+ ga_concat_esc(gap, exp_str);
+ }
+
+ if (atype != ASSERT_NOTEQUAL) {
+ if (atype == ASSERT_MATCH) {
+ ga_concat(gap, (char_u *)" does not match ");
+ } else if (atype == ASSERT_NOTMATCH) {
+ ga_concat(gap, (char_u *)" does match ");
} else {
- ga_concat(gap, exp_str);
+ ga_concat(gap, (char_u *)" but got ");
}
- tofree = (char_u *) encode_tv2string(got_tv, NULL);
- ga_concat(gap, (char_u *)" but got ");
- ga_concat(gap, tofree);
+ tofree = (char_u *)encode_tv2string(got_tv, NULL);
+ ga_concat_esc(gap, tofree);
xfree(tofree);
}
}
@@ -7637,32 +6808,55 @@ static void assert_error(garray_T *gap)
if (vp->vv_type != VAR_LIST || vimvars[VV_ERRORS].vv_list == NULL) {
// Make sure v:errors is a list.
- set_vim_var_list(VV_ERRORS, list_alloc());
+ set_vim_var_list(VV_ERRORS, tv_list_alloc(1));
}
- list_append_string(vimvars[VV_ERRORS].vv_list,
- gap->ga_data, gap->ga_len);
+ tv_list_append_string(vimvars[VV_ERRORS].vv_list,
+ (const char *)gap->ga_data, (ptrdiff_t)gap->ga_len);
}
-// "assert_equal(expected, actual[, msg])" function
-static void f_assert_equal(typval_T *argvars, typval_T *rettv)
+static void assert_equal_common(typval_T *argvars, assert_type_T atype)
{
garray_T ga;
- if (!tv_equal(&argvars[0], &argvars[1], false, false)) {
+ if (tv_equal(&argvars[0], &argvars[1], false, false)
+ != (atype == ASSERT_EQUAL)) {
prepare_assert_error(&ga);
fill_assert_error(&ga, &argvars[2], NULL,
- &argvars[0], &argvars[1]);
+ &argvars[0], &argvars[1], atype);
assert_error(&ga);
ga_clear(&ga);
}
}
+// "assert_equal(expected, actual[, msg])" function
+static void f_assert_equal(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ assert_equal_common(argvars, ASSERT_EQUAL);
+}
+
+// "assert_notequal(expected, actual[, msg])" function
+static void f_assert_notequal(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ assert_equal_common(argvars, ASSERT_NOTEQUAL);
+}
+
+/// "assert_report(msg)
+static void f_assert_report(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ garray_T ga;
+
+ prepare_assert_error(&ga);
+ ga_concat(&ga, (const char_u *)tv_get_string(&argvars[0]));
+ assert_error(&ga);
+ ga_clear(&ga);
+}
+
/// "assert_exception(string[, msg])" function
-static void f_assert_exception(typval_T *argvars, typval_T *rettv)
+static void f_assert_exception(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
garray_T ga;
- char *error = (char *)get_tv_string_chk(&argvars[0]);
+ const char *const error = tv_get_string_chk(&argvars[0]);
if (vimvars[VV_EXCEPTION].vv_str == NULL) {
prepare_assert_error(&ga);
ga_concat(&ga, (char_u *)"v:exception is not set");
@@ -7672,37 +6866,37 @@ static void f_assert_exception(typval_T *argvars, typval_T *rettv)
&& strstr((char *)vimvars[VV_EXCEPTION].vv_str, error) == NULL) {
prepare_assert_error(&ga);
fill_assert_error(&ga, &argvars[1], NULL, &argvars[0],
- &vimvars[VV_EXCEPTION].vv_tv);
+ &vimvars[VV_EXCEPTION].vv_tv, ASSERT_OTHER);
assert_error(&ga);
ga_clear(&ga);
}
}
/// "assert_fails(cmd [, error])" function
-static void f_assert_fails(typval_T *argvars, typval_T *rettv)
+static void f_assert_fails(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *cmd = get_tv_string_chk(&argvars[0]);
+ const char *const cmd = tv_get_string_chk(&argvars[0]);
garray_T ga;
called_emsg = false;
suppress_errthrow = true;
emsg_silent = true;
- do_cmdline_cmd((char *)cmd);
+ do_cmdline_cmd(cmd);
if (!called_emsg) {
prepare_assert_error(&ga);
- ga_concat(&ga, (char_u *)"command did not fail: ");
- ga_concat(&ga, cmd);
+ ga_concat(&ga, (const char_u *)"command did not fail: ");
+ ga_concat(&ga, (const char_u *)cmd);
assert_error(&ga);
ga_clear(&ga);
} else if (argvars[1].v_type != VAR_UNKNOWN) {
- char_u buf[NUMBUFLEN];
- char *error = (char *)get_tv_string_buf_chk(&argvars[1], buf);
+ char buf[NUMBUFLEN];
+ const char *const error = tv_get_string_buf_chk(&argvars[1], buf);
if (error == NULL
|| strstr((char *)vimvars[VV_ERRMSG].vv_str, error) == NULL) {
prepare_assert_error(&ga);
fill_assert_error(&ga, &argvars[2], NULL, &argvars[1],
- &vimvars[VV_ERRMSG].vv_tv);
+ &vimvars[VV_ERRMSG].vv_tv, ASSERT_OTHER);
assert_error(&ga);
ga_clear(&ga);
}
@@ -7715,14 +6909,39 @@ static void f_assert_fails(typval_T *argvars, typval_T *rettv)
set_vim_var_string(VV_ERRMSG, NULL, 0);
}
+void assert_inrange(typval_T *argvars)
+{
+ bool error = false;
+ const varnumber_T lower = tv_get_number_chk(&argvars[0], &error);
+ const varnumber_T upper = tv_get_number_chk(&argvars[1], &error);
+ const varnumber_T actual = tv_get_number_chk(&argvars[2], &error);
+
+ if (error) {
+ return;
+ }
+ if (actual < lower || actual > upper) {
+ garray_T ga;
+ prepare_assert_error(&ga);
+
+ char msg[55];
+ vim_snprintf(msg, sizeof(msg),
+ "range %" PRIdVARNUMBER " - %" PRIdVARNUMBER ",",
+ lower, upper);
+ fill_assert_error(&ga, &argvars[3], (char_u *)msg, NULL, &argvars[2],
+ ASSERT_INRANGE);
+ assert_error(&ga);
+ ga_clear(&ga);
+ }
+}
+
// Common for assert_true() and assert_false().
static void assert_bool(typval_T *argvars, bool is_true)
{
- int error = (int)false;
+ bool error = false;
garray_T ga;
if ((argvars[0].v_type != VAR_NUMBER
- || (get_tv_number_chk(&argvars[0], &error) == 0) == is_true
+ || (tv_get_number_chk(&argvars[0], &error) == 0) == is_true
|| error)
&& (argvars[0].v_type != VAR_SPECIAL
|| (argvars[0].vval.v_special
@@ -7732,59 +6951,81 @@ static void assert_bool(typval_T *argvars, bool is_true)
prepare_assert_error(&ga);
fill_assert_error(&ga, &argvars[1],
(char_u *)(is_true ? "True" : "False"),
- NULL, &argvars[0]);
+ NULL, &argvars[0], ASSERT_OTHER);
assert_error(&ga);
ga_clear(&ga);
}
}
// "assert_false(actual[, msg])" function
-static void f_assert_false(typval_T *argvars, typval_T *rettv)
+static void f_assert_false(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
assert_bool(argvars, false);
}
-// "assert_true(actual[, msg])" function
-static void f_assert_true(typval_T *argvars, typval_T *rettv)
+static void assert_match_common(typval_T *argvars, assert_type_T atype)
{
- assert_bool(argvars, true);
+ char buf1[NUMBUFLEN];
+ char buf2[NUMBUFLEN];
+ const char *const pat = tv_get_string_buf_chk(&argvars[0], buf1);
+ const char *const text = tv_get_string_buf_chk(&argvars[1], buf2);
+
+ if (pat == NULL || text == NULL) {
+ EMSG(_(e_invarg));
+ } else if (pattern_match((char_u *)pat, (char_u *)text, false)
+ != (atype == ASSERT_MATCH)) {
+ garray_T ga;
+ prepare_assert_error(&ga);
+ fill_assert_error(&ga, &argvars[2], NULL, &argvars[0], &argvars[1], atype);
+ assert_error(&ga);
+ ga_clear(&ga);
+ }
}
-/*
- * "asin()" function
- */
-static void f_asin(typval_T *argvars, typval_T *rettv)
+/// "assert_inrange(lower, upper[, msg])" function
+static void f_assert_inrange(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- float_op_wrapper(argvars, rettv, &asin);
+ assert_inrange(argvars);
}
-/*
- * "atan()" function
- */
-static void f_atan(typval_T *argvars, typval_T *rettv)
+/// "assert_match(pattern, actual[, msg])" function
+static void f_assert_match(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ assert_match_common(argvars, ASSERT_MATCH);
+}
+
+/// "assert_notmatch(pattern, actual[, msg])" function
+static void f_assert_notmatch(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- float_op_wrapper(argvars, rettv, &atan);
+ assert_match_common(argvars, ASSERT_NOTMATCH);
+}
+
+// "assert_true(actual[, msg])" function
+static void f_assert_true(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ assert_bool(argvars, true);
}
/*
* "atan2()" function
*/
-static void f_atan2(typval_T *argvars, typval_T *rettv)
+static void f_atan2(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- float_T fx, fy;
+ float_T fx;
+ float_T fy;
rettv->v_type = VAR_FLOAT;
- if (get_float_arg(argvars, &fx) == OK
- && get_float_arg(&argvars[1], &fy) == OK)
+ if (tv_get_float_chk(argvars, &fx) && tv_get_float_chk(&argvars[1], &fy)) {
rettv->vval.v_float = atan2(fx, fy);
- else
+ } else {
rettv->vval.v_float = 0.0;
+ }
}
/*
* "browse(save, title, initdir, default)" function
*/
-static void f_browse(typval_T *argvars, typval_T *rettv)
+static void f_browse(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->vval.v_string = NULL;
rettv->v_type = VAR_STRING;
@@ -7793,9 +7034,9 @@ static void f_browse(typval_T *argvars, typval_T *rettv)
/*
* "browsedir(title, initdir)" function
*/
-static void f_browsedir(typval_T *argvars, typval_T *rettv)
+static void f_browsedir(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- f_browse(argvars, rettv);
+ f_browse(argvars, rettv, NULL);
}
@@ -7831,7 +7072,7 @@ static buf_T *find_buffer(typval_T *avar)
/*
* "bufexists(expr)" function
*/
-static void f_bufexists(typval_T *argvars, typval_T *rettv)
+static void f_bufexists(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->vval.v_number = (find_buffer(&argvars[0]) != NULL);
}
@@ -7839,7 +7080,7 @@ static void f_bufexists(typval_T *argvars, typval_T *rettv)
/*
* "buflisted(expr)" function
*/
-static void f_buflisted(typval_T *argvars, typval_T *rettv)
+static void f_buflisted(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
buf_T *buf;
@@ -7850,7 +7091,7 @@ static void f_buflisted(typval_T *argvars, typval_T *rettv)
/*
* "bufloaded(expr)" function
*/
-static void f_bufloaded(typval_T *argvars, typval_T *rettv)
+static void f_bufloaded(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
buf_T *buf;
@@ -7862,7 +7103,7 @@ static void f_bufloaded(typval_T *argvars, typval_T *rettv)
/*
* Get buffer by number or pattern.
*/
-static buf_T *get_buf_tv(typval_T *tv, int curtab_only)
+static buf_T *tv_get_buf(typval_T *tv, int curtab_only)
{
char_u *name = tv->vval.v_string;
int save_magic;
@@ -7900,108 +7141,126 @@ static buf_T *get_buf_tv(typval_T *tv, int curtab_only)
/*
* "bufname(expr)" function
*/
-static void f_bufname(typval_T *argvars, typval_T *rettv)
+static void f_bufname(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- buf_T *buf;
-
- (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
- ++emsg_off;
- buf = get_buf_tv(&argvars[0], FALSE);
rettv->v_type = VAR_STRING;
- if (buf != NULL && buf->b_fname != NULL)
- rettv->vval.v_string = vim_strsave(buf->b_fname);
- else
- rettv->vval.v_string = NULL;
- --emsg_off;
+ rettv->vval.v_string = NULL;
+ if (!tv_check_str_or_nr(&argvars[0])) {
+ return;
+ }
+ emsg_off++;
+ const buf_T *const buf = tv_get_buf(&argvars[0], false);
+ emsg_off--;
+ if (buf != NULL && buf->b_fname != NULL) {
+ rettv->vval.v_string = (char_u *)xstrdup((char *)buf->b_fname);
+ }
}
/*
* "bufnr(expr)" function
*/
-static void f_bufnr(typval_T *argvars, typval_T *rettv)
+static void f_bufnr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- buf_T *buf;
- int error = FALSE;
- char_u *name;
+ bool error = false;
- (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
- ++emsg_off;
- buf = get_buf_tv(&argvars[0], FALSE);
- --emsg_off;
+ rettv->vval.v_number = -1;
+ if (!tv_check_str_or_nr(&argvars[0])) {
+ return;
+ }
+ emsg_off++;
+ const buf_T *buf = tv_get_buf(&argvars[0], false);
+ emsg_off--;
- /* If the buffer isn't found and the second argument is not zero create a
- * new buffer. */
+ // If the buffer isn't found and the second argument is not zero create a
+ // new buffer.
+ const char *name;
if (buf == NULL
&& argvars[1].v_type != VAR_UNKNOWN
- && get_tv_number_chk(&argvars[1], &error) != 0
+ && tv_get_number_chk(&argvars[1], &error) != 0
&& !error
- && (name = get_tv_string_chk(&argvars[0])) != NULL
- && !error)
- buf = buflist_new(name, NULL, (linenr_T)1, 0);
+ && (name = tv_get_string_chk(&argvars[0])) != NULL) {
+ buf = buflist_new((char_u *)name, NULL, 1, 0);
+ }
- if (buf != NULL)
+ if (buf != NULL) {
rettv->vval.v_number = buf->b_fnum;
- else
- rettv->vval.v_number = -1;
+ }
}
-/*
- * "bufwinnr(nr)" function
- */
-static void f_bufwinnr(typval_T *argvars, typval_T *rettv)
+static void buf_win_common(typval_T *argvars, typval_T *rettv, bool get_nr)
{
- (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
- ++emsg_off;
+ if (!tv_check_str_or_nr(&argvars[0])) {
+ rettv->vval.v_number = -1;
+ return;
+ }
+
+ emsg_off++;
+ buf_T *buf = tv_get_buf(&argvars[0], true);
+ if (buf == NULL) { // no need to search if buffer was not found
+ rettv->vval.v_number = -1;
+ goto end;
+ }
- buf_T *buf = get_buf_tv(&argvars[0], TRUE);
int winnr = 0;
+ int winid;
bool found_buf = false;
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
- ++winnr;
+ winnr++;
if (wp->w_buffer == buf) {
found_buf = true;
+ winid = wp->handle;
break;
}
}
- rettv->vval.v_number = (found_buf ? winnr : -1);
- --emsg_off;
+ rettv->vval.v_number = (found_buf ? (get_nr ? winnr : winid) : -1);
+end:
+ emsg_off--;
+}
+
+/// "bufwinid(nr)" function
+static void f_bufwinid(typval_T *argvars, typval_T *rettv, FunPtr fptr) {
+ buf_win_common(argvars, rettv, false);
+}
+
+/// "bufwinnr(nr)" function
+static void f_bufwinnr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ buf_win_common(argvars, rettv, true);
}
/*
* "byte2line(byte)" function
*/
-static void f_byte2line(typval_T *argvars, typval_T *rettv)
+static void f_byte2line(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- long boff = 0;
-
- boff = get_tv_number(&argvars[0]) - 1; /* boff gets -1 on type error */
- if (boff < 0)
+ long boff = tv_get_number(&argvars[0]) - 1;
+ if (boff < 0) {
rettv->vval.v_number = -1;
- else
- rettv->vval.v_number = ml_find_line_or_offset(curbuf,
- (linenr_T)0, &boff);
+ } else {
+ rettv->vval.v_number = (varnumber_T)ml_find_line_or_offset(curbuf, 0,
+ &boff, false);
+ }
}
static void byteidx(typval_T *argvars, typval_T *rettv, int comp)
{
- char_u *t;
- char_u *str;
- long idx;
-
- str = get_tv_string_chk(&argvars[0]);
- idx = get_tv_number_chk(&argvars[1], NULL);
+ const char *const str = tv_get_string_chk(&argvars[0]);
+ varnumber_T idx = tv_get_number_chk(&argvars[1], NULL);
rettv->vval.v_number = -1;
- if (str == NULL || idx < 0)
+ if (str == NULL || idx < 0) {
return;
+ }
- t = str;
+ const char *t = str;
for (; idx > 0; idx--) {
- if (*t == NUL) /* EOL reached */
+ if (*t == NUL) { // EOL reached.
return;
- if (enc_utf8 && comp)
- t += utf_ptr2len(t);
- else
- t += (*mb_ptr2len)(t);
+ }
+ if (enc_utf8 && comp) {
+ t += utf_ptr2len((const char_u *)t);
+ } else {
+ t += (*mb_ptr2len)((const char_u *)t);
+ }
}
rettv->vval.v_number = (varnumber_T)(t - str);
}
@@ -8009,7 +7268,7 @@ static void byteidx(typval_T *argvars, typval_T *rettv, int comp)
/*
* "byteidx()" function
*/
-static void f_byteidx(typval_T *argvars, typval_T *rettv)
+static void f_byteidx(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
byteidx(argvars, rettv, FALSE);
}
@@ -8017,64 +7276,67 @@ static void f_byteidx(typval_T *argvars, typval_T *rettv)
/*
* "byteidxcomp()" function
*/
-static void f_byteidxcomp(typval_T *argvars, typval_T *rettv)
+static void f_byteidxcomp(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
byteidx(argvars, rettv, TRUE);
}
-int func_call(char_u *name, typval_T *args, dict_T *selfdict, typval_T *rettv)
+int func_call(char_u *name, typval_T *args, partial_T *partial,
+ dict_T *selfdict, typval_T *rettv)
{
- listitem_T *item;
typval_T argv[MAX_FUNC_ARGS + 1];
int argc = 0;
int dummy;
int r = 0;
- for (item = args->vval.v_list->lv_first; item != NULL;
- item = item->li_next) {
- if (argc == MAX_FUNC_ARGS) {
+ TV_LIST_ITER(args->vval.v_list, item, {
+ if (argc == MAX_FUNC_ARGS - (partial == NULL ? 0 : partial->pt_argc)) {
EMSG(_("E699: Too many arguments"));
- break;
+ goto func_call_skip_call;
}
- /* Make a copy of each argument. This is needed to be able to set
- * v_lock to VAR_FIXED in the copy without changing the original list.
- */
- copy_tv(&item->li_tv, &argv[argc++]);
- }
+ // Make a copy of each argument. This is needed to be able to set
+ // v_lock to VAR_FIXED in the copy without changing the original list.
+ tv_copy(TV_LIST_ITEM_TV(item), &argv[argc++]);
+ });
- if (item == NULL)
- r = call_func(name, (int)STRLEN(name), rettv, argc, argv,
- curwin->w_cursor.lnum, curwin->w_cursor.lnum,
- &dummy, TRUE, selfdict);
+ r = call_func(name, (int)STRLEN(name), rettv, argc, argv, NULL,
+ curwin->w_cursor.lnum, curwin->w_cursor.lnum,
+ &dummy, true, partial, selfdict);
- /* Free the arguments. */
- while (argc > 0)
- clear_tv(&argv[--argc]);
+func_call_skip_call:
+ // Free the arguments.
+ while (argc > 0) {
+ tv_clear(&argv[--argc]);
+ }
return r;
}
-/*
- * "call(func, arglist)" function
- */
-static void f_call(typval_T *argvars, typval_T *rettv)
+/// "call(func, arglist [, dict])" function
+static void f_call(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *func;
- dict_T *selfdict = NULL;
-
if (argvars[1].v_type != VAR_LIST) {
EMSG(_(e_listreq));
return;
}
- if (argvars[1].vval.v_list == NULL)
+ if (argvars[1].vval.v_list == NULL) {
return;
+ }
- if (argvars[0].v_type == VAR_FUNC)
+ char_u *func;
+ partial_T *partial = NULL;
+ dict_T *selfdict = NULL;
+ if (argvars[0].v_type == VAR_FUNC) {
func = argvars[0].vval.v_string;
- else
- func = get_tv_string(&argvars[0]);
- if (*func == NUL)
- return; /* type error or empty name */
+ } else if (argvars[0].v_type == VAR_PARTIAL) {
+ partial = argvars[0].vval.v_partial;
+ func = partial_name(partial);
+ } else {
+ func = (char_u *)tv_get_string(&argvars[0]);
+ }
+ if (*func == NUL) {
+ return; // type error or empty name
+ }
if (argvars[2].v_type != VAR_UNKNOWN) {
if (argvars[2].v_type != VAR_DICT) {
@@ -8084,86 +7346,112 @@ static void f_call(typval_T *argvars, typval_T *rettv)
selfdict = argvars[2].vval.v_dict;
}
- (void)func_call(func, &argvars[1], selfdict, rettv);
+ func_call(func, &argvars[1], partial, selfdict, rettv);
}
-// "capture(command)" function
-static void f_capture(typval_T *argvars, typval_T *rettv)
+/*
+ * "changenr()" function
+ */
+static void f_changenr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- int save_msg_silent = msg_silent;
- garray_T *save_capture_ga = capture_ga;
-
- if (check_secure()) {
- return;
- }
+ rettv->vval.v_number = curbuf->b_u_seq_cur;
+}
- garray_T capture_local;
- capture_ga = &capture_local;
- ga_init(capture_ga, (int)sizeof(char), 80);
+// "chanclose(id[, stream])" function
+static void f_chanclose(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ rettv->v_type = VAR_NUMBER;
+ rettv->vval.v_number = 0;
- msg_silent++;
- if (argvars[0].v_type != VAR_LIST) {
- do_cmdline_cmd((char *)get_tv_string(&argvars[0]));
- } else if (argvars[0].vval.v_list != NULL) {
- for (listitem_T *li = argvars[0].vval.v_list->lv_first;
- li != NULL; li = li->li_next) {
- do_cmdline_cmd((char *)get_tv_string(&li->li_tv));
- }
- }
- msg_silent = save_msg_silent;
+ if (check_restricted() || check_secure()) {
+ return;
+ }
- ga_append(capture_ga, NUL);
- rettv->v_type = VAR_STRING;
- rettv->vval.v_string = capture_ga->ga_data;
+ if (argvars[0].v_type != VAR_NUMBER || (argvars[1].v_type != VAR_STRING
+ && argvars[1].v_type != VAR_UNKNOWN)) {
+ EMSG(_(e_invarg));
+ return;
+ }
- capture_ga = save_capture_ga;
+ ChannelPart part = kChannelPartAll;
+ if (argvars[1].v_type == VAR_STRING) {
+ char *stream = (char *)argvars[1].vval.v_string;
+ if (!strcmp(stream, "stdin")) {
+ part = kChannelPartStdin;
+ } else if (!strcmp(stream, "stdout")) {
+ part = kChannelPartStdout;
+ } else if (!strcmp(stream, "stderr")) {
+ part = kChannelPartStderr;
+ } else if (!strcmp(stream, "rpc")) {
+ part = kChannelPartRpc;
+ } else {
+ EMSG2(_("Invalid channel stream \"%s\""), stream);
+ return;
+ }
+ }
+ const char *error;
+ rettv->vval.v_number = channel_close(argvars[0].vval.v_number, part, &error);
+ if (!rettv->vval.v_number) {
+ EMSG(error);
+ }
}
-/*
- * "ceil({float})" function
- */
-static void f_ceil(typval_T *argvars, typval_T *rettv)
+// "chansend(id, data)" function
+static void f_chansend(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- float_op_wrapper(argvars, rettv, &ceil);
-}
+ rettv->v_type = VAR_NUMBER;
+ rettv->vval.v_number = 0;
-/*
- * "changenr()" function
- */
-static void f_changenr(typval_T *argvars, typval_T *rettv)
-{
- rettv->vval.v_number = curbuf->b_u_seq_cur;
+ if (check_restricted() || check_secure()) {
+ return;
+ }
+
+ if (argvars[0].v_type != VAR_NUMBER || argvars[1].v_type == VAR_UNKNOWN) {
+ // First argument is the channel id and second is the data to write
+ EMSG(_(e_invarg));
+ return;
+ }
+
+ ptrdiff_t input_len = 0;
+ char *input = save_tv_as_string(&argvars[1], &input_len, false);
+ if (!input) {
+ // Either the error has been handled by save_tv_as_string(),
+ // or there is no input to send.
+ return;
+ }
+ uint64_t id = argvars[0].vval.v_number;
+ const char *error = NULL;
+ rettv->vval.v_number = channel_send(id, input, input_len, &error);
+ if (error) {
+ EMSG(error);
+ }
}
/*
* "char2nr(string)" function
*/
-static void f_char2nr(typval_T *argvars, typval_T *rettv)
+static void f_char2nr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- if (has_mbyte) {
- int utf8 = 0;
-
- if (argvars[1].v_type != VAR_UNKNOWN)
- utf8 = get_tv_number_chk(&argvars[1], NULL);
+ if (argvars[1].v_type != VAR_UNKNOWN) {
+ if (!tv_check_num(&argvars[1])) {
+ return;
+ }
+ }
- if (utf8)
- rettv->vval.v_number = (*utf_ptr2char)(get_tv_string(&argvars[0]));
- else
- rettv->vval.v_number = (*mb_ptr2char)(get_tv_string(&argvars[0]));
- } else
- rettv->vval.v_number = get_tv_string(&argvars[0])[0];
+ rettv->vval.v_number = utf_ptr2char(
+ (const char_u *)tv_get_string(&argvars[0]));
}
/*
* "cindent(lnum)" function
*/
-static void f_cindent(typval_T *argvars, typval_T *rettv)
+static void f_cindent(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
pos_T pos;
linenr_T lnum;
pos = curwin->w_cursor;
- lnum = get_tv_lnum(argvars);
+ lnum = tv_get_lnum(argvars);
if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) {
curwin->w_cursor.lnum = lnum;
rettv->vval.v_number = get_c_indent();
@@ -8175,7 +7463,7 @@ static void f_cindent(typval_T *argvars, typval_T *rettv)
/*
* "clearmatches()" function
*/
-static void f_clearmatches(typval_T *argvars, typval_T *rettv)
+static void f_clearmatches(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
clear_matches(curwin);
}
@@ -8183,7 +7471,7 @@ static void f_clearmatches(typval_T *argvars, typval_T *rettv)
/*
* "col(string)" function
*/
-static void f_col(typval_T *argvars, typval_T *rettv)
+static void f_col(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
colnr_T col = 0;
pos_T *fp;
@@ -8220,10 +7508,8 @@ static void f_col(typval_T *argvars, typval_T *rettv)
/*
* "complete()" function
*/
-static void f_complete(typval_T *argvars, typval_T *rettv)
+static void f_complete(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- int startcol;
-
if ((State & INSERT) == 0) {
EMSG(_("E785: complete() can only be used in Insert mode"));
return;
@@ -8234,14 +7520,15 @@ static void f_complete(typval_T *argvars, typval_T *rettv)
if (!undo_allowed())
return;
- if (argvars[1].v_type != VAR_LIST || argvars[1].vval.v_list == NULL) {
+ if (argvars[1].v_type != VAR_LIST) {
EMSG(_(e_invarg));
return;
}
- startcol = get_tv_number_chk(&argvars[0], NULL);
- if (startcol <= 0)
+ const colnr_T startcol = tv_get_number_chk(&argvars[0], NULL);
+ if (startcol <= 0) {
return;
+ }
set_completion(startcol - 1, argvars[1].vval.v_list);
}
@@ -8249,7 +7536,7 @@ static void f_complete(typval_T *argvars, typval_T *rettv)
/*
* "complete_add()" function
*/
-static void f_complete_add(typval_T *argvars, typval_T *rettv)
+static void f_complete_add(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->vval.v_number = ins_compl_add_tv(&argvars[0], 0);
}
@@ -8257,12 +7544,12 @@ static void f_complete_add(typval_T *argvars, typval_T *rettv)
/*
* "complete_check()" function
*/
-static void f_complete_check(typval_T *argvars, typval_T *rettv)
+static void f_complete_check(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
int saved = RedrawingDisabled;
RedrawingDisabled = 0;
- ins_compl_check_keys(0);
+ ins_compl_check_keys(0, true);
rettv->vval.v_number = compl_interrupted;
RedrawingDisabled = saved;
}
@@ -8270,109 +7557,126 @@ static void f_complete_check(typval_T *argvars, typval_T *rettv)
/*
* "confirm(message, buttons[, default [, type]])" function
*/
-static void f_confirm(typval_T *argvars, typval_T *rettv)
+static void f_confirm(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *message;
- char_u *buttons = NULL;
- char_u buf[NUMBUFLEN];
- char_u buf2[NUMBUFLEN];
+ char buf[NUMBUFLEN];
+ char buf2[NUMBUFLEN];
+ const char *message;
+ const char *buttons = NULL;
int def = 1;
int type = VIM_GENERIC;
- char_u *typestr;
- int error = FALSE;
+ const char *typestr;
+ bool error = false;
- message = get_tv_string_chk(&argvars[0]);
- if (message == NULL)
- error = TRUE;
+ message = tv_get_string_chk(&argvars[0]);
+ if (message == NULL) {
+ error = true;
+ }
if (argvars[1].v_type != VAR_UNKNOWN) {
- buttons = get_tv_string_buf_chk(&argvars[1], buf);
- if (buttons == NULL)
- error = TRUE;
+ buttons = tv_get_string_buf_chk(&argvars[1], buf);
+ if (buttons == NULL) {
+ error = true;
+ }
if (argvars[2].v_type != VAR_UNKNOWN) {
- def = get_tv_number_chk(&argvars[2], &error);
+ def = tv_get_number_chk(&argvars[2], &error);
if (argvars[3].v_type != VAR_UNKNOWN) {
- typestr = get_tv_string_buf_chk(&argvars[3], buf2);
- if (typestr == NULL)
- error = TRUE;
- else {
+ typestr = tv_get_string_buf_chk(&argvars[3], buf2);
+ if (typestr == NULL) {
+ error = true;
+ } else {
switch (TOUPPER_ASC(*typestr)) {
- case 'E': type = VIM_ERROR; break;
- case 'Q': type = VIM_QUESTION; break;
- case 'I': type = VIM_INFO; break;
- case 'W': type = VIM_WARNING; break;
- case 'G': type = VIM_GENERIC; break;
+ case 'E': type = VIM_ERROR; break;
+ case 'Q': type = VIM_QUESTION; break;
+ case 'I': type = VIM_INFO; break;
+ case 'W': type = VIM_WARNING; break;
+ case 'G': type = VIM_GENERIC; break;
}
}
}
}
}
- if (buttons == NULL || *buttons == NUL)
- buttons = (char_u *)_("&Ok");
+ if (buttons == NULL || *buttons == NUL) {
+ buttons = _("&Ok");
+ }
- if (!error)
- rettv->vval.v_number = do_dialog(type, NULL, message, buttons,
- def, NULL, FALSE);
+ if (!error) {
+ rettv->vval.v_number = do_dialog(
+ type, NULL, (char_u *)message, (char_u *)buttons, def, NULL, false);
+ }
}
/*
* "copy()" function
*/
-static void f_copy(typval_T *argvars, typval_T *rettv)
+static void f_copy(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
var_item_copy(NULL, &argvars[0], rettv, false, 0);
}
/*
- * "cos()" function
- */
-static void f_cos(typval_T *argvars, typval_T *rettv)
-{
- float_op_wrapper(argvars, rettv, &cos);
-}
-
-/*
- * "cosh()" function
- */
-static void f_cosh(typval_T *argvars, typval_T *rettv)
-{
- float_op_wrapper(argvars, rettv, &cosh);
-}
-
-/*
* "count()" function
*/
-static void f_count(typval_T *argvars, typval_T *rettv)
+static void f_count(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
long n = 0;
- int ic = FALSE;
+ int ic = 0;
+ bool error = false;
- if (argvars[0].v_type == VAR_LIST) {
+ if (argvars[2].v_type != VAR_UNKNOWN) {
+ ic = tv_get_number_chk(&argvars[2], &error);
+ }
+
+ if (argvars[0].v_type == VAR_STRING) {
+ const char_u *expr = (char_u *)tv_get_string_chk(&argvars[1]);
+ const char_u *p = argvars[0].vval.v_string;
+
+ if (!error && expr != NULL && *expr != NUL && p != NULL) {
+ if (ic) {
+ const size_t len = STRLEN(expr);
+
+ while (*p != NUL) {
+ if (mb_strnicmp(p, expr, len) == 0) {
+ n++;
+ p += len;
+ } else {
+ MB_PTR_ADV(p);
+ }
+ }
+ } else {
+ char_u *next;
+ while ((next = (char_u *)strstr((char *)p, (char *)expr)) != NULL) {
+ n++;
+ p = next + STRLEN(expr);
+ }
+ }
+ }
+ } else if (argvars[0].v_type == VAR_LIST) {
listitem_T *li;
list_T *l;
long idx;
if ((l = argvars[0].vval.v_list) != NULL) {
- li = l->lv_first;
+ li = tv_list_first(l);
if (argvars[2].v_type != VAR_UNKNOWN) {
- int error = FALSE;
-
- ic = get_tv_number_chk(&argvars[2], &error);
if (argvars[3].v_type != VAR_UNKNOWN) {
- idx = get_tv_number_chk(&argvars[3], &error);
+ idx = tv_get_number_chk(&argvars[3], &error);
if (!error) {
- li = list_find(l, idx);
- if (li == NULL)
+ li = tv_list_find(l, idx);
+ if (li == NULL) {
EMSGN(_(e_listidx), idx);
+ }
}
}
if (error)
li = NULL;
}
- for (; li != NULL; li = li->li_next)
- if (tv_equal(&li->li_tv, &argvars[1], ic, FALSE))
- ++n;
+ for (; li != NULL; li = TV_LIST_ITEM_NEXT(l, li)) {
+ if (tv_equal(TV_LIST_ITEM_TV(li), &argvars[1], ic, false)) {
+ n++;
+ }
+ }
}
} else if (argvars[0].v_type == VAR_DICT) {
int todo;
@@ -8380,25 +7684,25 @@ static void f_count(typval_T *argvars, typval_T *rettv)
hashitem_T *hi;
if ((d = argvars[0].vval.v_dict) != NULL) {
- int error = FALSE;
-
if (argvars[2].v_type != VAR_UNKNOWN) {
- ic = get_tv_number_chk(&argvars[2], &error);
- if (argvars[3].v_type != VAR_UNKNOWN)
+ if (argvars[3].v_type != VAR_UNKNOWN) {
EMSG(_(e_invarg));
+ }
}
todo = error ? 0 : (int)d->dv_hashtab.ht_used;
for (hi = d->dv_hashtab.ht_array; todo > 0; ++hi) {
if (!HASHITEM_EMPTY(hi)) {
- --todo;
- if (tv_equal(&HI2DI(hi)->di_tv, &argvars[1], ic, FALSE))
- ++n;
+ todo--;
+ if (tv_equal(&TV_DICT_HI2DI(hi)->di_tv, &argvars[1], ic, false)) {
+ n++;
+ }
}
}
}
- } else
+ } else {
EMSG2(_(e_listdictarg), "count()");
+ }
rettv->vval.v_number = n;
}
@@ -8407,22 +7711,24 @@ static void f_count(typval_T *argvars, typval_T *rettv)
*
* Checks the existence of a cscope connection.
*/
-static void f_cscope_connection(typval_T *argvars, typval_T *rettv)
+static void f_cscope_connection(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
int num = 0;
- char_u *dbpath = NULL;
- char_u *prepend = NULL;
- char_u buf[NUMBUFLEN];
+ const char *dbpath = NULL;
+ const char *prepend = NULL;
+ char buf[NUMBUFLEN];
if (argvars[0].v_type != VAR_UNKNOWN
&& argvars[1].v_type != VAR_UNKNOWN) {
- num = (int)get_tv_number(&argvars[0]);
- dbpath = get_tv_string(&argvars[1]);
- if (argvars[2].v_type != VAR_UNKNOWN)
- prepend = get_tv_string_buf(&argvars[2], buf);
+ num = (int)tv_get_number(&argvars[0]);
+ dbpath = tv_get_string(&argvars[1]);
+ if (argvars[2].v_type != VAR_UNKNOWN) {
+ prepend = tv_get_string_buf(&argvars[2], buf);
+ }
}
- rettv->vval.v_number = cs_connection(num, dbpath, prepend);
+ rettv->vval.v_number = cs_connection(num, (char_u *)dbpath,
+ (char_u *)prepend);
}
/// "cursor(lnum, col)" function, or
@@ -8431,7 +7737,7 @@ static void f_cscope_connection(typval_T *argvars, typval_T *rettv)
/// Moves the cursor to the specified line and column.
///
/// @returns 0 when the position could be set, -1 otherwise.
-static void f_cursor(typval_T *argvars, typval_T *rettv)
+static void f_cursor(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
long line, col;
long coladd = 0;
@@ -8455,10 +7761,10 @@ static void f_cursor(typval_T *argvars, typval_T *rettv)
set_curswant = false;
}
} else {
- line = get_tv_lnum(argvars);
- col = get_tv_number_chk(&argvars[1], NULL);
+ line = tv_get_lnum(argvars);
+ col = (long)tv_get_number_chk(&argvars[1], NULL);
if (argvars[2].v_type != VAR_UNKNOWN) {
- coladd = get_tv_number_chk(&argvars[2], NULL);
+ coladd = (long)tv_get_number_chk(&argvars[2], NULL);
}
}
if (line < 0 || col < 0
@@ -8487,12 +7793,13 @@ static void f_cursor(typval_T *argvars, typval_T *rettv)
/*
* "deepcopy()" function
*/
-static void f_deepcopy(typval_T *argvars, typval_T *rettv)
+static void f_deepcopy(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
int noref = 0;
- if (argvars[1].v_type != VAR_UNKNOWN)
- noref = get_tv_number_chk(&argvars[1], NULL);
+ if (argvars[1].v_type != VAR_UNKNOWN) {
+ noref = tv_get_number_chk(&argvars[1], NULL);
+ }
if (noref < 0 || noref > 1) {
EMSG(_(e_invarg));
} else {
@@ -8503,151 +7810,118 @@ static void f_deepcopy(typval_T *argvars, typval_T *rettv)
}
// "delete()" function
-static void f_delete(typval_T *argvars, typval_T *rettv)
+static void f_delete(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u nbuf[NUMBUFLEN];
- char_u *name;
- char_u *flags;
-
rettv->vval.v_number = -1;
if (check_restricted() || check_secure()) {
return;
}
- name = get_tv_string(&argvars[0]);
- if (name == NULL || *name == NUL) {
+ const char *const name = tv_get_string(&argvars[0]);
+ if (*name == NUL) {
EMSG(_(e_invarg));
return;
}
+ char nbuf[NUMBUFLEN];
+ const char *flags;
if (argvars[1].v_type != VAR_UNKNOWN) {
- flags = get_tv_string_buf(&argvars[1], nbuf);
+ flags = tv_get_string_buf(&argvars[1], nbuf);
} else {
- flags = (char_u *)"";
+ flags = "";
}
if (*flags == NUL) {
// delete a file
- rettv->vval.v_number = os_remove((char *)name) == 0 ? 0 : -1;
- } else if (STRCMP(flags, "d") == 0) {
+ rettv->vval.v_number = os_remove(name) == 0 ? 0 : -1;
+ } else if (strcmp(flags, "d") == 0) {
// delete an empty directory
- rettv->vval.v_number = os_rmdir((char *)name) == 0 ? 0 : -1;
- } else if (STRCMP(flags, "rf") == 0) {
+ rettv->vval.v_number = os_rmdir(name) == 0 ? 0 : -1;
+ } else if (strcmp(flags, "rf") == 0) {
// delete a directory recursively
rettv->vval.v_number = delete_recursive(name);
} else {
- EMSG2(_(e_invexpr2), flags);
+ emsgf(_(e_invexpr2), flags);
}
}
// dictwatcheradd(dict, key, funcref) function
-static void f_dictwatcheradd(typval_T *argvars, typval_T *rettv)
+static void f_dictwatcheradd(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
if (check_restricted() || check_secure()) {
return;
}
if (argvars[0].v_type != VAR_DICT) {
- EMSG2(e_invarg2, "dict");
+ emsgf(_(e_invarg2), "dict");
return;
- }
-
- if (argvars[1].v_type != VAR_STRING && argvars[1].v_type != VAR_NUMBER) {
- EMSG2(e_invarg2, "key");
+ } else if (argvars[0].vval.v_dict == NULL) {
+ const char *const arg_errmsg = _("dictwatcheradd() argument");
+ const size_t arg_errmsg_len = strlen(arg_errmsg);
+ emsgf(_(e_readonlyvar), (int)arg_errmsg_len, arg_errmsg);
return;
}
- if (argvars[2].v_type != VAR_FUNC && argvars[2].v_type != VAR_STRING) {
- EMSG2(e_invarg2, "funcref");
+ if (argvars[1].v_type != VAR_STRING && argvars[1].v_type != VAR_NUMBER) {
+ emsgf(_(e_invarg2), "key");
return;
}
- char *key_pattern = (char *)get_tv_string_chk(argvars + 1);
- assert(key_pattern);
- const size_t key_len = STRLEN(argvars[1].vval.v_string);
-
- if (key_len == 0) {
- EMSG(_(e_emptykey));
+ const char *const key_pattern = tv_get_string_chk(argvars + 1);
+ if (key_pattern == NULL) {
return;
}
+ const size_t key_pattern_len = strlen(key_pattern);
- ufunc_T *func = find_ufunc(argvars[2].vval.v_string);
- if (!func) {
- // Invalid function name. Error already reported by `find_ufunc`.
+ Callback callback;
+ if (!callback_from_typval(&callback, &argvars[2])) {
+ emsgf(_(e_invarg2), "funcref");
return;
}
- func->uf_refcount++;
- DictWatcher *watcher = xmalloc(sizeof(DictWatcher));
- watcher->key_pattern = xmemdupz(key_pattern, key_len);
- watcher->callback = func;
- watcher->busy = false;
- QUEUE_INSERT_TAIL(&argvars[0].vval.v_dict->watchers, &watcher->node);
+ tv_dict_watcher_add(argvars[0].vval.v_dict, key_pattern, key_pattern_len,
+ callback);
}
// dictwatcherdel(dict, key, funcref) function
-static void f_dictwatcherdel(typval_T *argvars, typval_T *rettv)
+static void f_dictwatcherdel(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
if (check_restricted() || check_secure()) {
return;
}
if (argvars[0].v_type != VAR_DICT) {
- EMSG2(e_invarg2, "dict");
- return;
- }
-
- if (argvars[1].v_type != VAR_STRING && argvars[1].v_type != VAR_NUMBER) {
- EMSG2(e_invarg2, "key");
+ emsgf(_(e_invarg2), "dict");
return;
}
if (argvars[2].v_type != VAR_FUNC && argvars[2].v_type != VAR_STRING) {
- EMSG2(e_invarg2, "funcref");
+ emsgf(_(e_invarg2), "funcref");
return;
}
- char *key_pattern = (char *)get_tv_string_chk(argvars + 1);
- assert(key_pattern);
- const size_t key_len = STRLEN(argvars[1].vval.v_string);
-
- if (key_len == 0) {
- EMSG(_(e_emptykey));
+ const char *const key_pattern = tv_get_string_chk(argvars + 1);
+ if (key_pattern == NULL) {
return;
}
- ufunc_T *func = find_ufunc(argvars[2].vval.v_string);
- if (!func) {
- // Invalid function name. Error already reported by `find_ufunc`.
+ Callback callback;
+ if (!callback_from_typval(&callback, &argvars[2])) {
return;
}
- dict_T *dict = argvars[0].vval.v_dict;
- QUEUE *w = NULL;
- DictWatcher *watcher = NULL;
- bool matched = false;
- QUEUE_FOREACH(w, &dict->watchers) {
- watcher = dictwatcher_node_data(w);
- if (func == watcher->callback
- && !strcmp(watcher->key_pattern, key_pattern)) {
- matched = true;
- break;
- }
- }
-
- if (!matched) {
+ if (!tv_dict_watcher_remove(argvars[0].vval.v_dict, key_pattern,
+ strlen(key_pattern), callback)) {
EMSG("Couldn't find a watcher matching key and callback");
- return;
}
- QUEUE_REMOVE(w);
- dictwatcher_free(watcher);
+ callback_free(&callback);
}
/*
* "did_filetype()" function
*/
-static void f_did_filetype(typval_T *argvars, typval_T *rettv)
+static void f_did_filetype(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->vval.v_number = did_filetype;
}
@@ -8655,17 +7929,17 @@ static void f_did_filetype(typval_T *argvars, typval_T *rettv)
/*
* "diff_filler()" function
*/
-static void f_diff_filler(typval_T *argvars, typval_T *rettv)
+static void f_diff_filler(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- rettv->vval.v_number = diff_check_fill(curwin, get_tv_lnum(argvars));
+ rettv->vval.v_number = diff_check_fill(curwin, tv_get_lnum(argvars));
}
/*
* "diff_hlID()" function
*/
-static void f_diff_hlID(typval_T *argvars, typval_T *rettv)
+static void f_diff_hlID(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- linenr_T lnum = get_tv_lnum(argvars);
+ linenr_T lnum = tv_get_lnum(argvars);
static linenr_T prev_lnum = 0;
static int changedtick = 0;
static int fnum = 0;
@@ -8678,7 +7952,7 @@ static void f_diff_hlID(typval_T *argvars, typval_T *rettv)
if (lnum < 0) /* ignore type error in {lnum} arg */
lnum = 0;
if (lnum != prev_lnum
- || changedtick != curbuf->b_changedtick
+ || changedtick != buf_get_changedtick(curbuf)
|| fnum != curbuf->b_fnum) {
/* New line, buffer, change: need to get the values. */
filler_lines = diff_check(curwin, lnum);
@@ -8695,16 +7969,17 @@ static void f_diff_hlID(typval_T *argvars, typval_T *rettv)
} else
hlID = (hlf_T)0;
prev_lnum = lnum;
- changedtick = curbuf->b_changedtick;
+ changedtick = buf_get_changedtick(curbuf);
fnum = curbuf->b_fnum;
}
if (hlID == HLF_CHD || hlID == HLF_TXD) {
- col = get_tv_number(&argvars[1]) - 1; /* ignore type error in {col} */
- if (col >= change_start && col <= change_end)
- hlID = HLF_TXD; /* changed text */
- else
- hlID = HLF_CHD; /* changed line */
+ col = tv_get_number(&argvars[1]) - 1; // Ignore type error in {col}.
+ if (col >= change_start && col <= change_end) {
+ hlID = HLF_TXD; // Changed text.
+ } else {
+ hlID = HLF_CHD; // Changed line.
+ }
}
rettv->vval.v_number = hlID == (hlf_T)0 ? 0 : (int)hlID;
}
@@ -8712,36 +7987,56 @@ static void f_diff_hlID(typval_T *argvars, typval_T *rettv)
/*
* "empty({expr})" function
*/
-static void f_empty(typval_T *argvars, typval_T *rettv)
+static void f_empty(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
bool n = true;
switch (argvars[0].v_type) {
- case VAR_STRING:
- case VAR_FUNC:
- n = argvars[0].vval.v_string == NULL
- || *argvars[0].vval.v_string == NUL;
- break;
- case VAR_NUMBER:
- n = argvars[0].vval.v_number == 0;
- break;
- case VAR_FLOAT:
- n = argvars[0].vval.v_float == 0.0;
- break;
- case VAR_LIST:
- n = argvars[0].vval.v_list == NULL
- || argvars[0].vval.v_list->lv_first == NULL;
- break;
- case VAR_DICT:
- n = argvars[0].vval.v_dict == NULL
- || argvars[0].vval.v_dict->dv_hashtab.ht_used == 0;
- break;
- case VAR_SPECIAL:
- n = argvars[0].vval.v_special != kSpecialVarTrue;
- break;
- case VAR_UNKNOWN:
- EMSG2(_(e_intern2), "f_empty(UNKNOWN)");
- break;
+ case VAR_STRING:
+ case VAR_FUNC: {
+ n = argvars[0].vval.v_string == NULL
+ || *argvars[0].vval.v_string == NUL;
+ break;
+ }
+ case VAR_PARTIAL: {
+ n = false;
+ break;
+ }
+ case VAR_NUMBER: {
+ n = argvars[0].vval.v_number == 0;
+ break;
+ }
+ case VAR_FLOAT: {
+ n = argvars[0].vval.v_float == 0.0;
+ break;
+ }
+ case VAR_LIST: {
+ n = (tv_list_len(argvars[0].vval.v_list) == 0);
+ break;
+ }
+ case VAR_DICT: {
+ n = (tv_dict_len(argvars[0].vval.v_dict) == 0);
+ break;
+ }
+ case VAR_SPECIAL: {
+ // Using switch to get warning if SpecialVarValue receives more values.
+ switch (argvars[0].vval.v_special) {
+ case kSpecialVarTrue: {
+ n = false;
+ break;
+ }
+ case kSpecialVarFalse:
+ case kSpecialVarNull: {
+ n = true;
+ break;
+ }
+ }
+ break;
+ }
+ case VAR_UNKNOWN: {
+ internal_error("f_empty(UNKNOWN)");
+ break;
+ }
}
rettv->vval.v_number = n;
@@ -8750,30 +8045,30 @@ static void f_empty(typval_T *argvars, typval_T *rettv)
/*
* "escape({string}, {chars})" function
*/
-static void f_escape(typval_T *argvars, typval_T *rettv)
+static void f_escape(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u buf[NUMBUFLEN];
+ char buf[NUMBUFLEN];
- rettv->vval.v_string = vim_strsave_escaped(get_tv_string(&argvars[0]),
- get_tv_string_buf(&argvars[1], buf));
+ rettv->vval.v_string = vim_strsave_escaped(
+ (const char_u *)tv_get_string(&argvars[0]),
+ (const char_u *)tv_get_string_buf(&argvars[1], buf));
rettv->v_type = VAR_STRING;
}
/*
* "eval()" function
*/
-static void f_eval(typval_T *argvars, typval_T *rettv)
+static void f_eval(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *s;
-
- s = get_tv_string_chk(&argvars[0]);
- if (s != NULL)
- s = skipwhite(s);
+ const char *s = tv_get_string_chk(&argvars[0]);
+ if (s != NULL) {
+ s = (const char *)skipwhite((const char_u *)s);
+ }
- char_u *p = s;
- if (s == NULL || eval1(&s, rettv, TRUE) == FAIL) {
- if (p != NULL && !aborting()) {
- EMSG2(_(e_invexpr2), p);
+ const char *const expr_start = s;
+ if (s == NULL || eval1((char_u **)&s, rettv, true) == FAIL) {
+ if (expr_start != NULL && !aborting()) {
+ EMSG2(_(e_invexpr2), expr_start);
}
need_clr_eos = FALSE;
rettv->v_type = VAR_NUMBER;
@@ -8786,7 +8081,7 @@ static void f_eval(typval_T *argvars, typval_T *rettv)
/*
* "eventhandler()" function
*/
-static void f_eventhandler(typval_T *argvars, typval_T *rettv)
+static void f_eventhandler(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->vval.v_number = vgetc_busy;
}
@@ -8794,22 +8089,104 @@ static void f_eventhandler(typval_T *argvars, typval_T *rettv)
/*
* "executable()" function
*/
-static void f_executable(typval_T *argvars, typval_T *rettv)
+static void f_executable(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *name = get_tv_string(&argvars[0]);
+ const char *name = tv_get_string(&argvars[0]);
// Check in $PATH and also check directly if there is a directory name
- rettv->vval.v_number = os_can_exe(name, NULL, true)
- || (gettail_dir(name) != name && os_can_exe(name, NULL, false));
+ rettv->vval.v_number = (
+ os_can_exe((const char_u *)name, NULL, true)
+ || (gettail_dir(name) != name
+ && os_can_exe((const char_u *)name, NULL, false)));
+}
+
+typedef struct {
+ const list_T *const l;
+ const listitem_T *li;
+} GetListLineCookie;
+
+static char_u *get_list_line(int c, void *cookie, int indent)
+{
+ GetListLineCookie *const p = (GetListLineCookie *)cookie;
+
+ const listitem_T *const item = p->li;
+ if (item == NULL) {
+ return NULL;
+ }
+ char buf[NUMBUFLEN];
+ const char *const s = tv_get_string_buf_chk(TV_LIST_ITEM_TV(item), buf);
+ p->li = TV_LIST_ITEM_NEXT(p->l, item);
+ return (char_u *)(s == NULL ? NULL : xstrdup(s));
+}
+
+// "execute(command)" function
+static void f_execute(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ const int save_msg_silent = msg_silent;
+ const int save_emsg_silent = emsg_silent;
+ const bool save_emsg_noredir = emsg_noredir;
+ const bool save_redir_off = redir_off;
+ garray_T *const save_capture_ga = capture_ga;
+
+ if (check_secure()) {
+ return;
+ }
+
+ if (argvars[1].v_type != VAR_UNKNOWN) {
+ char buf[NUMBUFLEN];
+ const char *const s = tv_get_string_buf_chk(&argvars[1], buf);
+
+ if (s == NULL) {
+ return;
+ }
+ if (strncmp(s, "silent", 6) == 0) {
+ msg_silent++;
+ }
+ if (strcmp(s, "silent!") == 0) {
+ emsg_silent = true;
+ emsg_noredir = true;
+ }
+ } else {
+ msg_silent++;
+ }
+
+ garray_T capture_local;
+ ga_init(&capture_local, (int)sizeof(char), 80);
+ capture_ga = &capture_local;
+ redir_off = false;
+
+ if (argvars[0].v_type != VAR_LIST) {
+ do_cmdline_cmd(tv_get_string(&argvars[0]));
+ } else if (argvars[0].vval.v_list != NULL) {
+ list_T *const list = argvars[0].vval.v_list;
+ tv_list_ref(list);
+ GetListLineCookie cookie = {
+ .l = list,
+ .li = tv_list_first(list),
+ };
+ do_cmdline(NULL, get_list_line, (void *)&cookie,
+ DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT|DOCMD_KEYTYPED);
+ tv_list_unref(list);
+ }
+ msg_silent = save_msg_silent;
+ emsg_silent = save_emsg_silent;
+ emsg_noredir = save_emsg_noredir;
+ redir_off = save_redir_off;
+
+ ga_append(capture_ga, NUL);
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = capture_ga->ga_data;
+
+ capture_ga = save_capture_ga;
}
/// "exepath()" function
-static void f_exepath(typval_T *argvars, typval_T *rettv)
+static void f_exepath(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *arg = get_tv_string(&argvars[0]);
+ const char *arg = tv_get_string(&argvars[0]);
char_u *path = NULL;
- (void)os_can_exe(arg, &path, true);
+ (void)os_can_exe((const char_u *)arg, &path, true);
rettv->v_type = VAR_STRING;
rettv->vval.v_string = path;
@@ -8818,55 +8195,57 @@ static void f_exepath(typval_T *argvars, typval_T *rettv)
/*
* "exists()" function
*/
-static void f_exists(typval_T *argvars, typval_T *rettv)
+static void f_exists(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *p;
- char_u *name;
- int n = FALSE;
+ int n = false;
int len = 0;
- p = get_tv_string(&argvars[0]);
- if (*p == '$') { /* environment variable */
- /* first try "normal" environment variables (fast) */
- if (os_getenv((char *)(p + 1)) != NULL)
- n = TRUE;
- else {
- /* try expanding things like $VIM and ${HOME} */
- p = expand_env_save(p);
- if (p != NULL && *p != '$')
- n = TRUE;
- xfree(p);
+ const char *p = tv_get_string(&argvars[0]);
+ if (*p == '$') { // Environment variable.
+ // First try "normal" environment variables (fast).
+ if (os_getenv(p + 1) != NULL) {
+ n = true;
+ } else {
+ // Try expanding things like $VIM and ${HOME}.
+ char_u *const exp = expand_env_save((char_u *)p);
+ if (exp != NULL && *exp != '$') {
+ n = true;
+ }
+ xfree(exp);
}
- } else if (*p == '&' || *p == '+') { /* option */
- n = (get_option_tv(&p, NULL, TRUE) == OK);
- if (*skipwhite(p) != NUL)
- n = FALSE; /* trailing garbage */
- } else if (*p == '*') { /* internal or user defined function */
- n = function_exists(p + 1);
+ } else if (*p == '&' || *p == '+') { // Option.
+ n = (get_option_tv(&p, NULL, true) == OK);
+ if (*skipwhite((const char_u *)p) != NUL) {
+ n = false; // Trailing garbage.
+ }
+ } else if (*p == '*') { // Internal or user defined function.
+ n = function_exists(p + 1, false);
} else if (*p == ':') {
n = cmd_exists(p + 1);
} else if (*p == '#') {
- if (p[1] == '#')
+ if (p[1] == '#') {
n = autocmd_supported(p + 2);
- else
+ } else {
n = au_exists(p + 1);
- } else { /* internal variable */
- char_u *tofree;
+ }
+ } else { // Internal variable.
typval_T tv;
- /* get_name_len() takes care of expanding curly braces */
- name = p;
- len = get_name_len(&p, &tofree, TRUE, FALSE);
+ // get_name_len() takes care of expanding curly braces
+ const char *name = p;
+ char *tofree;
+ len = get_name_len((const char **)&p, &tofree, true, false);
if (len > 0) {
if (tofree != NULL) {
name = tofree;
}
n = (get_var_tv(name, len, &tv, NULL, false, true) == OK);
if (n) {
- /* handle d.key, l[idx], f(expr) */
- n = (handle_subscript(&p, &tv, TRUE, FALSE) == OK);
- if (n)
- clear_tv(&tv);
+ // Handle d.key, l[idx], f(expr).
+ n = (handle_subscript(&p, &tv, true, false) == OK);
+ if (n) {
+ tv_clear(&tv);
+ }
}
}
if (*p != NUL)
@@ -8879,44 +8258,34 @@ static void f_exists(typval_T *argvars, typval_T *rettv)
}
/*
- * "exp()" function
- */
-static void f_exp(typval_T *argvars, typval_T *rettv)
-{
- float_op_wrapper(argvars, rettv, &exp);
-}
-
-/*
* "expand()" function
*/
-static void f_expand(typval_T *argvars, typval_T *rettv)
+static void f_expand(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *s;
size_t len;
char_u *errormsg;
int options = WILD_SILENT|WILD_USE_NL|WILD_LIST_NOTFOUND;
expand_T xpc;
- int error = FALSE;
- char_u *result;
+ bool error = false;
+ char_u *result;
rettv->v_type = VAR_STRING;
if (argvars[1].v_type != VAR_UNKNOWN
&& argvars[2].v_type != VAR_UNKNOWN
- && get_tv_number_chk(&argvars[2], &error)
+ && tv_get_number_chk(&argvars[2], &error)
&& !error) {
- rettv->v_type = VAR_LIST;
- rettv->vval.v_list = NULL;
+ tv_list_set_ret(rettv, NULL);
}
- s = get_tv_string(&argvars[0]);
+ const char *s = tv_get_string(&argvars[0]);
if (*s == '%' || *s == '#' || *s == '<') {
- ++emsg_off;
- result = eval_vars(s, s, &len, NULL, &errormsg, NULL);
- --emsg_off;
+ emsg_off++;
+ result = eval_vars((char_u *)s, (char_u *)s, &len, NULL, &errormsg, NULL);
+ emsg_off--;
if (rettv->v_type == VAR_LIST) {
- rettv_list_alloc(rettv);
+ tv_list_alloc_ret(rettv, (result != NULL));
if (result != NULL) {
- list_append_string(rettv->vval.v_list, result, -1);
+ tv_list_append_string(rettv->vval.v_list, (const char *)result, -1);
}
} else
rettv->vval.v_string = result;
@@ -8924,262 +8293,217 @@ static void f_expand(typval_T *argvars, typval_T *rettv)
/* When the optional second argument is non-zero, don't remove matches
* for 'wildignore' and don't put matches for 'suffixes' at the end. */
if (argvars[1].v_type != VAR_UNKNOWN
- && get_tv_number_chk(&argvars[1], &error))
+ && tv_get_number_chk(&argvars[1], &error)) {
options |= WILD_KEEP_ALL;
+ }
if (!error) {
ExpandInit(&xpc);
xpc.xp_context = EXPAND_FILES;
- if (p_wic)
+ if (p_wic) {
options += WILD_ICASE;
- if (rettv->v_type == VAR_STRING)
- rettv->vval.v_string = ExpandOne(&xpc, s, NULL,
- options, WILD_ALL);
- else {
- rettv_list_alloc(rettv);
- ExpandOne(&xpc, s, NULL, options, WILD_ALL_KEEP);
+ }
+ if (rettv->v_type == VAR_STRING) {
+ rettv->vval.v_string = ExpandOne(&xpc, (char_u *)s, NULL, options,
+ WILD_ALL);
+ } else {
+ ExpandOne(&xpc, (char_u *)s, NULL, options, WILD_ALL_KEEP);
+ tv_list_alloc_ret(rettv, xpc.xp_numfiles);
for (int i = 0; i < xpc.xp_numfiles; i++) {
- list_append_string(rettv->vval.v_list, xpc.xp_files[i], -1);
+ tv_list_append_string(rettv->vval.v_list,
+ (const char *)xpc.xp_files[i], -1);
}
ExpandCleanup(&xpc);
}
- } else
+ } else {
rettv->vval.v_string = NULL;
+ }
}
}
-/*
- * Go over all entries in "d2" and add them to "d1".
- * When "action" is "error" then a duplicate key is an error.
- * When "action" is "force" then a duplicate key is overwritten.
- * Otherwise duplicate keys are ignored ("action" is "keep").
- */
-void dict_extend(dict_T *d1, dict_T *d2, char_u *action)
-{
- dictitem_T *di1;
- hashitem_T *hi2;
- int todo;
- bool watched = is_watched(d1);
- char_u *arg_errmsg = (char_u *)N_("extend() argument");
-
- todo = (int)d2->dv_hashtab.ht_used;
- for (hi2 = d2->dv_hashtab.ht_array; todo > 0; ++hi2) {
- if (!HASHITEM_EMPTY(hi2)) {
- --todo;
- di1 = dict_find(d1, hi2->hi_key, -1);
- if (d1->dv_scope != 0) {
- /* Disallow replacing a builtin function in l: and g:.
- * Check the key to be valid when adding to any
- * scope. */
- if (d1->dv_scope == VAR_DEF_SCOPE
- && HI2DI(hi2)->di_tv.v_type == VAR_FUNC
- && var_check_func_name(hi2->hi_key,
- di1 == NULL))
- break;
- if (!valid_varname(hi2->hi_key))
- break;
- }
- if (di1 == NULL) {
- di1 = dictitem_copy(HI2DI(hi2));
- if (dict_add(d1, di1) == FAIL) {
- dictitem_free(di1);
- }
-
- if (watched) {
- dictwatcher_notify(d1, (char *)di1->di_key, &di1->di_tv, NULL);
- }
- } else if (*action == 'e') {
- EMSG2(_("E737: Key already exists: %s"), hi2->hi_key);
- break;
- } else if (*action == 'f' && HI2DI(hi2) != di1) {
- typval_T oldtv;
-
- if (tv_check_lock(di1->di_tv.v_lock, arg_errmsg, true)
- || var_check_ro(di1->di_flags, arg_errmsg, true)) {
- break;
- }
- if (watched) {
- copy_tv(&di1->di_tv, &oldtv);
- }
-
- clear_tv(&di1->di_tv);
- copy_tv(&HI2DI(hi2)->di_tv, &di1->di_tv);
-
- if (watched) {
- dictwatcher_notify(d1, (char *)di1->di_key, &di1->di_tv, &oldtv);
- clear_tv(&oldtv);
- }
- }
- }
+/// "menu_get(path [, modes])" function
+static void f_menu_get(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ tv_list_alloc_ret(rettv, kListLenMayKnow);
+ int modes = MENU_ALL_MODES;
+ if (argvars[1].v_type == VAR_STRING) {
+ const char_u *const strmodes = (char_u *)tv_get_string(&argvars[1]);
+ modes = get_menu_cmd_modes(strmodes, false, NULL, NULL);
}
+ menu_get((char_u *)tv_get_string(&argvars[0]), modes, rettv->vval.v_list);
}
/*
* "extend(list, list [, idx])" function
* "extend(dict, dict [, action])" function
*/
-static void f_extend(typval_T *argvars, typval_T *rettv)
+static void f_extend(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *arg_errmsg = (char_u *)N_("extend() argument");
+ const char *const arg_errmsg = N_("extend() argument");
if (argvars[0].v_type == VAR_LIST && argvars[1].v_type == VAR_LIST) {
- list_T *l1, *l2;
- listitem_T *item;
long before;
- int error = FALSE;
+ bool error = false;
- l1 = argvars[0].vval.v_list;
- l2 = argvars[1].vval.v_list;
- if (l1 != NULL && !tv_check_lock(l1->lv_lock, arg_errmsg, true)
- && l2 != NULL) {
+ list_T *const l1 = argvars[0].vval.v_list;
+ list_T *const l2 = argvars[1].vval.v_list;
+ if (!tv_check_lock(tv_list_locked(l1), arg_errmsg, TV_TRANSLATE)) {
+ listitem_T *item;
if (argvars[2].v_type != VAR_UNKNOWN) {
- before = get_tv_number_chk(&argvars[2], &error);
- if (error)
- return; /* type error; errmsg already given */
+ before = (long)tv_get_number_chk(&argvars[2], &error);
+ if (error) {
+ return; // Type error; errmsg already given.
+ }
- if (before == l1->lv_len)
+ if (before == tv_list_len(l1)) {
item = NULL;
- else {
- item = list_find(l1, before);
+ } else {
+ item = tv_list_find(l1, before);
if (item == NULL) {
EMSGN(_(e_listidx), before);
return;
}
}
- } else
+ } else {
item = NULL;
- list_extend(l1, l2, item);
+ }
+ tv_list_extend(l1, l2, item);
- copy_tv(&argvars[0], rettv);
+ tv_copy(&argvars[0], rettv);
}
} else if (argvars[0].v_type == VAR_DICT && argvars[1].v_type ==
VAR_DICT) {
- dict_T *d1, *d2;
- char_u *action;
- int i;
-
- d1 = argvars[0].vval.v_dict;
- d2 = argvars[1].vval.v_dict;
- if (d1 != NULL && !tv_check_lock(d1->dv_lock, arg_errmsg, true)
- && d2 != NULL) {
- /* Check the third argument. */
+ dict_T *const d1 = argvars[0].vval.v_dict;
+ dict_T *const d2 = argvars[1].vval.v_dict;
+ if (d1 == NULL) {
+ const bool locked = tv_check_lock(VAR_FIXED, arg_errmsg, TV_TRANSLATE);
+ (void)locked;
+ assert(locked == true);
+ } else if (d2 == NULL) {
+ // Do nothing
+ tv_copy(&argvars[0], rettv);
+ } else if (!tv_check_lock(d1->dv_lock, arg_errmsg, TV_TRANSLATE)) {
+ const char *action = "force";
+ // Check the third argument.
if (argvars[2].v_type != VAR_UNKNOWN) {
- static char *(av[]) = {"keep", "force", "error"};
+ const char *const av[] = { "keep", "force", "error" };
- action = get_tv_string_chk(&argvars[2]);
- if (action == NULL)
- return; /* type error; errmsg already given */
- for (i = 0; i < 3; ++i)
- if (STRCMP(action, av[i]) == 0)
+ action = tv_get_string_chk(&argvars[2]);
+ if (action == NULL) {
+ return; // Type error; error message already given.
+ }
+ size_t i;
+ for (i = 0; i < ARRAY_SIZE(av); i++) {
+ if (strcmp(action, av[i]) == 0) {
break;
+ }
+ }
if (i == 3) {
EMSG2(_(e_invarg2), action);
return;
}
- } else
- action = (char_u *)"force";
+ }
- dict_extend(d1, d2, action);
+ tv_dict_extend(d1, d2, action);
- copy_tv(&argvars[0], rettv);
+ tv_copy(&argvars[0], rettv);
}
- } else
+ } else {
EMSG2(_(e_listdictarg), "extend()");
+ }
}
/*
* "feedkeys()" function
*/
-static void f_feedkeys(typval_T *argvars, typval_T *rettv)
+static void f_feedkeys(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *keys, *flags = NULL;
- char_u nbuf[NUMBUFLEN];
-
- /* This is not allowed in the sandbox. If the commands would still be
- * executed in the sandbox it would be OK, but it probably happens later,
- * when "sandbox" is no longer set. */
- if (check_secure())
+ // This is not allowed in the sandbox. If the commands would still be
+ // executed in the sandbox it would be OK, but it probably happens later,
+ // when "sandbox" is no longer set.
+ if (check_secure()) {
return;
+ }
- keys = get_tv_string(&argvars[0]);
- if (*keys != NUL) {
- if (argvars[1].v_type != VAR_UNKNOWN) {
- flags = get_tv_string_buf(&argvars[1], nbuf);
- }
-
- vim_feedkeys(cstr_as_string((char *)keys),
- cstr_as_string((char *)flags), true);
+ const char *const keys = tv_get_string(&argvars[0]);
+ char nbuf[NUMBUFLEN];
+ const char *flags = NULL;
+ if (argvars[1].v_type != VAR_UNKNOWN) {
+ flags = tv_get_string_buf(&argvars[1], nbuf);
}
+
+ nvim_feedkeys(cstr_as_string((char *)keys),
+ cstr_as_string((char *)flags), true);
}
/// "filereadable()" function
-static void f_filereadable(typval_T *argvars, typval_T *rettv)
+static void f_filereadable(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *p = get_tv_string(&argvars[0]);
+ const char *const p = tv_get_string(&argvars[0]);
rettv->vval.v_number =
- (*p && !os_isdir(p) && os_file_is_readable((char*)p));
+ (*p && !os_isdir((const char_u *)p) && os_file_is_readable(p));
}
/*
* Return 0 for not writable, 1 for writable file, 2 for a dir which we have
* rights to write into.
*/
-static void f_filewritable(typval_T *argvars, typval_T *rettv)
+static void f_filewritable(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char *filename = (char *)get_tv_string(&argvars[0]);
+ const char *filename = tv_get_string(&argvars[0]);
rettv->vval.v_number = os_file_is_writable(filename);
}
static void findfilendir(typval_T *argvars, typval_T *rettv, int find_what)
{
- char_u *fname;
- char_u *fresult = NULL;
- char_u *path = *curbuf->b_p_path == NUL ? p_path : curbuf->b_p_path;
- char_u *p;
- char_u pathbuf[NUMBUFLEN];
+ char_u *fresult = NULL;
+ char_u *path = *curbuf->b_p_path == NUL ? p_path : curbuf->b_p_path;
int count = 1;
- int first = TRUE;
- int error = FALSE;
+ bool first = true;
+ bool error = false;
rettv->vval.v_string = NULL;
rettv->v_type = VAR_STRING;
- fname = get_tv_string(&argvars[0]);
+ const char *fname = tv_get_string(&argvars[0]);
+ char pathbuf[NUMBUFLEN];
if (argvars[1].v_type != VAR_UNKNOWN) {
- p = get_tv_string_buf_chk(&argvars[1], pathbuf);
- if (p == NULL)
- error = TRUE;
- else {
- if (*p != NUL)
- path = p;
+ const char *p = tv_get_string_buf_chk(&argvars[1], pathbuf);
+ if (p == NULL) {
+ error = true;
+ } else {
+ if (*p != NUL) {
+ path = (char_u *)p;
+ }
- if (argvars[2].v_type != VAR_UNKNOWN)
- count = get_tv_number_chk(&argvars[2], &error);
+ if (argvars[2].v_type != VAR_UNKNOWN) {
+ count = tv_get_number_chk(&argvars[2], &error);
+ }
}
}
if (count < 0) {
- rettv_list_alloc(rettv);
+ tv_list_alloc_ret(rettv, kListLenUnknown);
}
if (*fname != NUL && !error) {
do {
if (rettv->v_type == VAR_STRING || rettv->v_type == VAR_LIST)
xfree(fresult);
- fresult = find_file_in_path_option(first ? fname : NULL,
- first ? STRLEN(fname) : 0,
+ fresult = find_file_in_path_option(first ? (char_u *)fname : NULL,
+ first ? strlen(fname) : 0,
0, first, path,
find_what, curbuf->b_ffname,
(find_what == FINDFILE_DIR
? (char_u *)""
: curbuf->b_p_sua));
- first = FALSE;
-
- if (fresult != NULL && rettv->v_type == VAR_LIST)
- list_append_string(rettv->vval.v_list, fresult, -1);
+ first = false;
+ if (fresult != NULL && rettv->v_type == VAR_LIST) {
+ tv_list_append_string(rettv->vval.v_list, (const char *)fresult, -1);
+ }
} while ((rettv->v_type == VAR_LIST || --count > 0) && fresult != NULL);
}
@@ -9193,9 +8517,7 @@ static void findfilendir(typval_T *argvars, typval_T *rettv, int find_what)
*/
static void filter_map(typval_T *argvars, typval_T *rettv, int map)
{
- char_u buf[NUMBUFLEN];
- char_u *expr;
- listitem_T *li, *nli;
+ typval_T *expr;
list_T *l = NULL;
dictitem_T *di;
hashtab_T *ht;
@@ -9203,22 +8525,26 @@ static void filter_map(typval_T *argvars, typval_T *rettv, int map)
dict_T *d = NULL;
typval_T save_val;
typval_T save_key;
- int rem;
+ int rem = false;
int todo;
- char_u *ermsg = (char_u *)(map ? "map()" : "filter()");
- char_u *arg_errmsg = (char_u *)(map ? N_("map() argument")
- : N_("filter() argument"));
+ char_u *ermsg = (char_u *)(map ? "map()" : "filter()");
+ const char *const arg_errmsg = (map
+ ? N_("map() argument")
+ : N_("filter() argument"));
int save_did_emsg;
int idx = 0;
if (argvars[0].v_type == VAR_LIST) {
+ tv_copy(&argvars[0], rettv);
if ((l = argvars[0].vval.v_list) == NULL
- || (!map && tv_check_lock(l->lv_lock, arg_errmsg, true))) {
+ || (!map && tv_check_lock(tv_list_locked(l), arg_errmsg,
+ TV_TRANSLATE))) {
return;
}
} else if (argvars[0].v_type == VAR_DICT) {
+ tv_copy(&argvars[0], rettv);
if ((d = argvars[0].vval.v_dict) == NULL
- || (!map && tv_check_lock(d->dv_lock, arg_errmsg, true))) {
+ || (!map && tv_check_lock(d->dv_lock, arg_errmsg, TV_TRANSLATE))) {
return;
}
} else {
@@ -9226,16 +8552,15 @@ static void filter_map(typval_T *argvars, typval_T *rettv, int map)
return;
}
- expr = get_tv_string_buf_chk(&argvars[1], buf);
- /* On type errors, the preceding call has already displayed an error
- * message. Avoid a misleading error message for an empty string that
- * was not passed as argument. */
- if (expr != NULL) {
+ expr = &argvars[1];
+ // On type errors, the preceding call has already displayed an error
+ // message. Avoid a misleading error message for an empty string that
+ // was not passed as argument.
+ if (expr->v_type != VAR_UNKNOWN) {
prepare_vimvar(VV_VAL, &save_val);
- expr = skipwhite(expr);
- /* We reset "did_emsg" to be able to detect whether an error
- * occurred during evaluation of the expression. */
+ // We reset "did_emsg" to be able to detect whether an error
+ // occurred during evaluation of the expression.
save_did_emsg = did_emsg;
did_emsg = FALSE;
@@ -9250,24 +8575,25 @@ static void filter_map(typval_T *argvars, typval_T *rettv, int map)
if (!HASHITEM_EMPTY(hi)) {
--todo;
- di = HI2DI(hi);
+ di = TV_DICT_HI2DI(hi);
if (map
- && (tv_check_lock(di->di_tv.v_lock, arg_errmsg, true)
- || var_check_ro(di->di_flags, arg_errmsg, true))) {
+ && (tv_check_lock(di->di_tv.v_lock, arg_errmsg, TV_TRANSLATE)
+ || var_check_ro(di->di_flags, arg_errmsg, TV_TRANSLATE))) {
break;
}
vimvars[VV_KEY].vv_str = vim_strsave(di->di_key);
int r = filter_map_one(&di->di_tv, expr, map, &rem);
- clear_tv(&vimvars[VV_KEY].vv_tv);
- if (r == FAIL || did_emsg)
+ tv_clear(&vimvars[VV_KEY].vv_tv);
+ if (r == FAIL || did_emsg) {
break;
+ }
if (!map && rem) {
- if (var_check_fixed(di->di_flags, arg_errmsg, true)
- || var_check_ro(di->di_flags, arg_errmsg, true)) {
+ if (var_check_fixed(di->di_flags, arg_errmsg, TV_TRANSLATE)
+ || var_check_ro(di->di_flags, arg_errmsg, TV_TRANSLATE)) {
break;
}
- dictitem_remove(d, di);
+ tv_dict_item_remove(d, di);
}
}
}
@@ -9275,18 +8601,23 @@ static void filter_map(typval_T *argvars, typval_T *rettv, int map)
} else {
vimvars[VV_KEY].vv_type = VAR_NUMBER;
- for (li = l->lv_first; li != NULL; li = nli) {
- if (map && tv_check_lock(li->li_tv.v_lock, arg_errmsg, true)) {
+ for (listitem_T *li = tv_list_first(l); li != NULL;) {
+ if (map
+ && tv_check_lock(TV_LIST_ITEM_TV(li)->v_lock, arg_errmsg,
+ TV_TRANSLATE)) {
break;
}
- nli = li->li_next;
vimvars[VV_KEY].vv_nr = idx;
- if (filter_map_one(&li->li_tv, expr, map, &rem) == FAIL
- || did_emsg)
+ if (filter_map_one(TV_LIST_ITEM_TV(li), expr, map, &rem) == FAIL
+ || did_emsg) {
break;
- if (!map && rem)
- listitem_remove(l, li);
- ++idx;
+ }
+ if (!map && rem) {
+ li = tv_list_item_remove(l, li);
+ } else {
+ li = TV_LIST_ITEM_NEXT(l, li);
+ }
+ idx++;
}
}
@@ -9295,51 +8626,75 @@ static void filter_map(typval_T *argvars, typval_T *rettv, int map)
did_emsg |= save_did_emsg;
}
-
- copy_tv(&argvars[0], rettv);
}
-static int filter_map_one(typval_T *tv, char_u *expr, int map, int *remp)
+static int filter_map_one(typval_T *tv, typval_T *expr, int map, int *remp)
{
typval_T rettv;
- char_u *s;
+ typval_T argv[3];
int retval = FAIL;
+ int dummy;
- copy_tv(tv, &vimvars[VV_VAL].vv_tv);
- s = expr;
- if (eval1(&s, &rettv, TRUE) == FAIL)
- goto theend;
- if (*s != NUL) { /* check for trailing chars after expr */
- EMSG2(_(e_invexpr2), s);
- clear_tv(&rettv);
- goto theend;
+ tv_copy(tv, &vimvars[VV_VAL].vv_tv);
+ argv[0] = vimvars[VV_KEY].vv_tv;
+ argv[1] = vimvars[VV_VAL].vv_tv;
+ if (expr->v_type == VAR_FUNC) {
+ const char_u *const s = expr->vval.v_string;
+ if (call_func(s, (int)STRLEN(s), &rettv, 2, argv, NULL,
+ 0L, 0L, &dummy, true, NULL, NULL) == FAIL) {
+ goto theend;
+ }
+ } else if (expr->v_type == VAR_PARTIAL) {
+ partial_T *partial = expr->vval.v_partial;
+
+ const char_u *const s = partial_name(partial);
+ if (call_func(s, (int)STRLEN(s), &rettv, 2, argv, NULL,
+ 0L, 0L, &dummy, true, partial, NULL) == FAIL) {
+ goto theend;
+ }
+ } else {
+ char buf[NUMBUFLEN];
+ const char *s = tv_get_string_buf_chk(expr, buf);
+ if (s == NULL) {
+ goto theend;
+ }
+ s = (const char *)skipwhite((const char_u *)s);
+ if (eval1((char_u **)&s, &rettv, true) == FAIL) {
+ goto theend;
+ }
+
+ if (*s != NUL) { // check for trailing chars after expr
+ emsgf(_(e_invexpr2), s);
+ goto theend;
+ }
}
if (map) {
- /* map(): replace the list item value */
- clear_tv(tv);
+ // map(): replace the list item value.
+ tv_clear(tv);
rettv.v_lock = 0;
*tv = rettv;
} else {
- int error = FALSE;
-
- /* filter(): when expr is zero remove the item */
- *remp = (get_tv_number_chk(&rettv, &error) == 0);
- clear_tv(&rettv);
- /* On type error, nothing has been removed; return FAIL to stop the
- * loop. The error message was given by get_tv_number_chk(). */
- if (error)
+ bool error = false;
+
+ // filter(): when expr is zero remove the item
+ *remp = (tv_get_number_chk(&rettv, &error) == 0);
+ tv_clear(&rettv);
+ // On type error, nothing has been removed; return FAIL to stop the
+ // loop. The error message was given by tv_get_number_chk().
+ if (error) {
goto theend;
+ }
}
retval = OK;
theend:
- clear_tv(&vimvars[VV_VAL].vv_tv);
+ tv_clear(&vimvars[VV_VAL].vv_tv);
return retval;
}
/*
* "filter()" function
*/
-static void f_filter(typval_T *argvars, typval_T *rettv)
+static void f_filter(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
filter_map(argvars, rettv, FALSE);
}
@@ -9347,7 +8702,7 @@ static void f_filter(typval_T *argvars, typval_T *rettv)
/*
* "finddir({fname}[, {path}[, {count}]])" function
*/
-static void f_finddir(typval_T *argvars, typval_T *rettv)
+static void f_finddir(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
findfilendir(argvars, rettv, FINDFILE_DIR);
}
@@ -9355,7 +8710,7 @@ static void f_finddir(typval_T *argvars, typval_T *rettv)
/*
* "findfile({fname}[, {path}[, {count}]])" function
*/
-static void f_findfile(typval_T *argvars, typval_T *rettv)
+static void f_findfile(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
findfilendir(argvars, rettv, FINDFILE_FILE);
}
@@ -9363,79 +8718,72 @@ static void f_findfile(typval_T *argvars, typval_T *rettv)
/*
* "float2nr({float})" function
*/
-static void f_float2nr(typval_T *argvars, typval_T *rettv)
+static void f_float2nr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
float_T f;
- if (get_float_arg(argvars, &f) == OK) {
- if (f < -0x7fffffff)
- rettv->vval.v_number = -0x7fffffff;
- else if (f > 0x7fffffff)
- rettv->vval.v_number = 0x7fffffff;
- else
+ if (tv_get_float_chk(argvars, &f)) {
+ if (f <= -VARNUMBER_MAX + DBL_EPSILON) {
+ rettv->vval.v_number = -VARNUMBER_MAX;
+ } else if (f >= VARNUMBER_MAX - DBL_EPSILON) {
+ rettv->vval.v_number = VARNUMBER_MAX;
+ } else {
rettv->vval.v_number = (varnumber_T)f;
+ }
}
}
/*
- * "floor({float})" function
- */
-static void f_floor(typval_T *argvars, typval_T *rettv)
-{
- float_op_wrapper(argvars, rettv, &floor);
-}
-
-/*
* "fmod()" function
*/
-static void f_fmod(typval_T *argvars, typval_T *rettv)
+static void f_fmod(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- float_T fx, fy;
+ float_T fx;
+ float_T fy;
rettv->v_type = VAR_FLOAT;
- if (get_float_arg(argvars, &fx) == OK
- && get_float_arg(&argvars[1], &fy) == OK)
+ if (tv_get_float_chk(argvars, &fx) && tv_get_float_chk(&argvars[1], &fy)) {
rettv->vval.v_float = fmod(fx, fy);
- else
+ } else {
rettv->vval.v_float = 0.0;
+ }
}
/*
* "fnameescape({string})" function
*/
-static void f_fnameescape(typval_T *argvars, typval_T *rettv)
+static void f_fnameescape(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- rettv->vval.v_string = vim_strsave_fnameescape(
- get_tv_string(&argvars[0]), FALSE);
+ rettv->vval.v_string = (char_u *)vim_strsave_fnameescape(
+ tv_get_string(&argvars[0]), false);
rettv->v_type = VAR_STRING;
}
/*
* "fnamemodify({fname}, {mods})" function
*/
-static void f_fnamemodify(typval_T *argvars, typval_T *rettv)
+static void f_fnamemodify(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *fname;
- char_u *mods;
- size_t usedlen = 0;
+ char_u *fbuf = NULL;
size_t len;
- char_u *fbuf = NULL;
- char_u buf[NUMBUFLEN];
-
- fname = get_tv_string_chk(&argvars[0]);
- mods = get_tv_string_buf_chk(&argvars[1], buf);
- if (fname == NULL || mods == NULL)
+ char buf[NUMBUFLEN];
+ const char *fname = tv_get_string_chk(&argvars[0]);
+ const char *const mods = tv_get_string_buf_chk(&argvars[1], buf);
+ if (fname == NULL || mods == NULL) {
fname = NULL;
- else {
- len = STRLEN(fname);
- (void)modify_fname(mods, &usedlen, &fname, &fbuf, &len);
+ } else {
+ len = strlen(fname);
+ size_t usedlen = 0;
+ (void)modify_fname((char_u *)mods, &usedlen, (char_u **)&fname, &fbuf,
+ &len);
}
rettv->v_type = VAR_STRING;
- if (fname == NULL)
+ if (fname == NULL) {
rettv->vval.v_string = NULL;
- else
- rettv->vval.v_string = vim_strnsave(fname, len);
+ } else {
+ rettv->vval.v_string = (char_u *)xmemdupz(fname, len);
+ }
xfree(fbuf);
}
@@ -9445,16 +8793,16 @@ static void f_fnamemodify(typval_T *argvars, typval_T *rettv)
*/
static void foldclosed_both(typval_T *argvars, typval_T *rettv, int end)
{
- linenr_T lnum;
- linenr_T first, last;
-
- lnum = get_tv_lnum(argvars);
+ const linenr_T lnum = tv_get_lnum(argvars);
if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) {
- if (hasFoldingWin(curwin, lnum, &first, &last, FALSE, NULL)) {
- if (end)
+ linenr_T first;
+ linenr_T last;
+ if (hasFoldingWin(curwin, lnum, &first, &last, false, NULL)) {
+ if (end) {
rettv->vval.v_number = (varnumber_T)last;
- else
+ } else {
rettv->vval.v_number = (varnumber_T)first;
+ }
return;
}
}
@@ -9464,7 +8812,7 @@ static void foldclosed_both(typval_T *argvars, typval_T *rettv, int end)
/*
* "foldclosed()" function
*/
-static void f_foldclosed(typval_T *argvars, typval_T *rettv)
+static void f_foldclosed(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
foldclosed_both(argvars, rettv, FALSE);
}
@@ -9472,7 +8820,7 @@ static void f_foldclosed(typval_T *argvars, typval_T *rettv)
/*
* "foldclosedend()" function
*/
-static void f_foldclosedend(typval_T *argvars, typval_T *rettv)
+static void f_foldclosedend(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
foldclosed_both(argvars, rettv, TRUE);
}
@@ -9480,38 +8828,40 @@ static void f_foldclosedend(typval_T *argvars, typval_T *rettv)
/*
* "foldlevel()" function
*/
-static void f_foldlevel(typval_T *argvars, typval_T *rettv)
+static void f_foldlevel(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- linenr_T lnum;
-
- lnum = get_tv_lnum(argvars);
- if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
+ const linenr_T lnum = tv_get_lnum(argvars);
+ if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) {
rettv->vval.v_number = foldLevel(lnum);
+ }
}
/*
* "foldtext()" function
*/
-static void f_foldtext(typval_T *argvars, typval_T *rettv)
+static void f_foldtext(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- linenr_T lnum;
+ linenr_T foldstart;
+ linenr_T foldend;
+ char_u *dashes;
+ linenr_T lnum;
char_u *s;
char_u *r;
- int len;
+ int len;
char *txt;
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
- if ((linenr_T)vimvars[VV_FOLDSTART].vv_nr > 0
- && (linenr_T)vimvars[VV_FOLDEND].vv_nr
- <= curbuf->b_ml.ml_line_count
- && vimvars[VV_FOLDDASHES].vv_str != NULL) {
- /* Find first non-empty line in the fold. */
- lnum = (linenr_T)vimvars[VV_FOLDSTART].vv_nr;
- while (lnum < (linenr_T)vimvars[VV_FOLDEND].vv_nr) {
- if (!linewhite(lnum))
+
+ foldstart = (linenr_T)get_vim_var_nr(VV_FOLDSTART);
+ foldend = (linenr_T)get_vim_var_nr(VV_FOLDEND);
+ dashes = get_vim_var_str(VV_FOLDDASHES);
+ if (foldstart > 0 && foldend <= curbuf->b_ml.ml_line_count) {
+ // Find first non-empty line in the fold.
+ for (lnum = foldstart; lnum < foldend; lnum++) {
+ if (!linewhite(lnum)) {
break;
- ++lnum;
+ }
}
/* Find interesting text in this line. */
@@ -9519,21 +8869,19 @@ static void f_foldtext(typval_T *argvars, typval_T *rettv)
/* skip C comment-start */
if (s[0] == '/' && (s[1] == '*' || s[1] == '/')) {
s = skipwhite(s + 2);
- if (*skipwhite(s) == NUL
- && lnum + 1 < (linenr_T)vimvars[VV_FOLDEND].vv_nr) {
+ if (*skipwhite(s) == NUL && lnum + 1 < foldend) {
s = skipwhite(ml_get(lnum + 1));
if (*s == '*')
s = skipwhite(s + 1);
}
}
- txt = _("+-%s%3ld lines: ");
+ unsigned long count = (unsigned long)(foldend - foldstart + 1);
+ txt = NGETTEXT("+-%s%3ld line: ", "+-%s%3ld lines: ", count);
r = xmalloc(STRLEN(txt)
- + STRLEN(vimvars[VV_FOLDDASHES].vv_str) // for %s
- + 20 // for %3ld
- + STRLEN(s)); // concatenated
- sprintf((char *)r, txt, vimvars[VV_FOLDDASHES].vv_str,
- (long)((linenr_T)vimvars[VV_FOLDEND].vv_nr
- - (linenr_T)vimvars[VV_FOLDSTART].vv_nr + 1));
+ + STRLEN(dashes) // for %s
+ + 20 // for %3ld
+ + STRLEN(s)); // concatenated
+ sprintf((char *)r, txt, dashes, count);
len = (int)STRLEN(r);
STRCAT(r, s);
/* remove 'foldmarker' and 'commentstring' */
@@ -9545,86 +8893,232 @@ static void f_foldtext(typval_T *argvars, typval_T *rettv)
/*
* "foldtextresult(lnum)" function
*/
-static void f_foldtextresult(typval_T *argvars, typval_T *rettv)
+static void f_foldtextresult(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- linenr_T lnum;
char_u *text;
- char_u buf[51];
+ char_u buf[FOLD_TEXT_LEN];
foldinfo_T foldinfo;
int fold_count;
+ static bool entered = false;
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
- lnum = get_tv_lnum(argvars);
- /* treat illegal types and illegal string values for {lnum} the same */
- if (lnum < 0)
+ if (entered) {
+ return; // reject recursive use
+ }
+ entered = true;
+ linenr_T lnum = tv_get_lnum(argvars);
+ // Treat illegal types and illegal string values for {lnum} the same.
+ 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);
- if (text == buf)
+ text = get_foldtext(curwin, lnum, lnum + fold_count - 1, &foldinfo, buf);
+ if (text == buf) {
text = vim_strsave(text);
+ }
rettv->vval.v_string = text;
}
+
+ entered = false;
}
/*
* "foreground()" function
*/
-static void f_foreground(typval_T *argvars, typval_T *rettv)
+static void f_foreground(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
}
-/*
- * "function()" function
- */
-static void f_function(typval_T *argvars, typval_T *rettv)
+static void common_function(typval_T *argvars, typval_T *rettv,
+ bool is_funcref, FunPtr fptr)
{
char_u *s;
-
- s = get_tv_string(&argvars[0]);
- if (s == NULL || *s == NUL || ascii_isdigit(*s))
- EMSG2(_(e_invarg2), s);
- /* Don't check an autoload name for existence here. */
- else if (vim_strchr(s, AUTOLOAD_CHAR) == NULL && !function_exists(s))
- EMSG2(_("E700: Unknown function: %s"), s);
- else {
+ char_u *name;
+ bool use_string = false;
+ partial_T *arg_pt = NULL;
+ char_u *trans_name = NULL;
+
+ if (argvars[0].v_type == VAR_FUNC) {
+ // function(MyFunc, [arg], dict)
+ s = argvars[0].vval.v_string;
+ } else if (argvars[0].v_type == VAR_PARTIAL
+ && argvars[0].vval.v_partial != NULL) {
+ // function(dict.MyFunc, [arg])
+ arg_pt = argvars[0].vval.v_partial;
+ s = partial_name(arg_pt);
+ } else {
+ // function('MyFunc', [arg], dict)
+ s = (char_u *)tv_get_string(&argvars[0]);
+ use_string = true;
+ }
+
+ if ((use_string && vim_strchr(s, AUTOLOAD_CHAR) == NULL) || is_funcref) {
+ name = s;
+ trans_name = trans_function_name(&name, false,
+ TFN_INT | TFN_QUIET | TFN_NO_AUTOLOAD
+ | TFN_NO_DEREF, NULL, NULL);
+ if (*name != NUL) {
+ s = NULL;
+ }
+ }
+ if (s == NULL || *s == NUL || (use_string && ascii_isdigit(*s))
+ || (is_funcref && trans_name == NULL)) {
+ emsgf(_(e_invarg2), (use_string
+ ? tv_get_string(&argvars[0])
+ : (const char *)s));
+ // Don't check an autoload name for existence here.
+ } else if (trans_name != NULL
+ && (is_funcref ? find_func(trans_name) == NULL
+ : !translated_function_exists((const char *)trans_name))) {
+ emsgf(_("E700: Unknown function: %s"), s);
+ } else {
+ int dict_idx = 0;
+ int arg_idx = 0;
+ list_T *list = NULL;
if (STRNCMP(s, "s:", 2) == 0 || STRNCMP(s, "<SID>", 5) == 0) {
char sid_buf[25];
int off = *s == 's' ? 2 : 5;
- /* Expand s: and <SID> into <SNR>nr_, so that the function can
- * also be called from another script. Using trans_function_name()
- * would also work, but some plugins depend on the name being
- * printable text. */
- sprintf(sid_buf, "<SNR>%" PRId64 "_", (int64_t)current_SID);
- rettv->vval.v_string = xmalloc(STRLEN(sid_buf) + STRLEN(s + off) + 1);
- STRCPY(rettv->vval.v_string, sid_buf);
- STRCAT(rettv->vval.v_string, s + off);
- } else
- rettv->vval.v_string = vim_strsave(s);
- rettv->v_type = VAR_FUNC;
+ // Expand s: and <SID> into <SNR>nr_, so that the function can
+ // also be called from another script. Using trans_function_name()
+ // would also work, but some plugins depend on the name being
+ // printable text.
+ snprintf(sid_buf, sizeof(sid_buf), "<SNR>%" PRId64 "_",
+ (int64_t)current_SID);
+ name = xmalloc(STRLEN(sid_buf) + STRLEN(s + off) + 1);
+ STRCPY(name, sid_buf);
+ STRCAT(name, s + off);
+ } else {
+ name = vim_strsave(s);
+ }
+
+ if (argvars[1].v_type != VAR_UNKNOWN) {
+ if (argvars[2].v_type != VAR_UNKNOWN) {
+ // function(name, [args], dict)
+ arg_idx = 1;
+ dict_idx = 2;
+ } else if (argvars[1].v_type == VAR_DICT) {
+ // function(name, dict)
+ dict_idx = 1;
+ } else {
+ // function(name, [args])
+ arg_idx = 1;
+ }
+ if (dict_idx > 0) {
+ if (argvars[dict_idx].v_type != VAR_DICT) {
+ EMSG(_("E922: expected a dict"));
+ xfree(name);
+ goto theend;
+ }
+ if (argvars[dict_idx].vval.v_dict == NULL) {
+ dict_idx = 0;
+ }
+ }
+ if (arg_idx > 0) {
+ if (argvars[arg_idx].v_type != VAR_LIST) {
+ EMSG(_("E923: Second argument of function() must be "
+ "a list or a dict"));
+ xfree(name);
+ goto theend;
+ }
+ list = argvars[arg_idx].vval.v_list;
+ if (tv_list_len(list) == 0) {
+ arg_idx = 0;
+ }
+ }
+ }
+ if (dict_idx > 0 || arg_idx > 0 || arg_pt != NULL || is_funcref) {
+ partial_T *const pt = xcalloc(1, sizeof(*pt));
+
+ // result is a VAR_PARTIAL
+ if (arg_idx > 0 || (arg_pt != NULL && arg_pt->pt_argc > 0)) {
+ const int arg_len = (arg_pt == NULL ? 0 : arg_pt->pt_argc);
+ const int lv_len = tv_list_len(list);
+
+ pt->pt_argc = arg_len + lv_len;
+ pt->pt_argv = xmalloc(sizeof(pt->pt_argv[0]) * pt->pt_argc);
+ int i = 0;
+ for (; i < arg_len; i++) {
+ tv_copy(&arg_pt->pt_argv[i], &pt->pt_argv[i]);
+ }
+ if (lv_len > 0) {
+ TV_LIST_ITER(list, li, {
+ tv_copy(TV_LIST_ITEM_TV(li), &pt->pt_argv[i++]);
+ });
+ }
+ }
+
+ // For "function(dict.func, [], dict)" and "func" is a partial
+ // use "dict". That is backwards compatible.
+ if (dict_idx > 0) {
+ // The dict is bound explicitly, pt_auto is false
+ pt->pt_dict = argvars[dict_idx].vval.v_dict;
+ (pt->pt_dict->dv_refcount)++;
+ } else if (arg_pt != NULL) {
+ // If the dict was bound automatically the result is also
+ // bound automatically.
+ pt->pt_dict = arg_pt->pt_dict;
+ pt->pt_auto = arg_pt->pt_auto;
+ if (pt->pt_dict != NULL) {
+ (pt->pt_dict->dv_refcount)++;
+ }
+ }
+
+ pt->pt_refcount = 1;
+ if (arg_pt != NULL && arg_pt->pt_func != NULL) {
+ pt->pt_func = arg_pt->pt_func;
+ func_ptr_ref(pt->pt_func);
+ xfree(name);
+ } else if (is_funcref) {
+ pt->pt_func = find_func(trans_name);
+ func_ptr_ref(pt->pt_func);
+ xfree(name);
+ } else {
+ pt->pt_name = name;
+ func_ref(name);
+ }
+
+ rettv->v_type = VAR_PARTIAL;
+ rettv->vval.v_partial = pt;
+ } else {
+ // result is a VAR_FUNC
+ rettv->v_type = VAR_FUNC;
+ rettv->vval.v_string = name;
+ func_ref(name);
+ }
}
+theend:
+ xfree(trans_name);
}
-/*
- * "garbagecollect()" function
- */
-static void f_garbagecollect(typval_T *argvars, typval_T *rettv)
+static void f_funcref(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- /* This is postponed until we are back at the toplevel, because we may be
- * using Lists and Dicts internally. E.g.: ":echo [garbagecollect()]". */
- want_garbage_collect = TRUE;
+ common_function(argvars, rettv, true, fptr);
+}
- if (argvars[0].v_type != VAR_UNKNOWN && get_tv_number(&argvars[0]) == 1)
- garbage_collect_at_exit = TRUE;
+static void f_function(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ common_function(argvars, rettv, false, fptr);
+}
+
+/// "garbagecollect()" function
+static void f_garbagecollect(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ // This is postponed until we are back at the toplevel, because we may be
+ // using Lists and Dicts internally. E.g.: ":echo [garbagecollect()]".
+ want_garbage_collect = true;
+
+ if (argvars[0].v_type != VAR_UNKNOWN && tv_get_number(&argvars[0]) == 1) {
+ garbage_collect_at_exit = true;
+ }
}
/*
* "get()" function
*/
-static void f_get(typval_T *argvars, typval_T *rettv)
+static void f_get(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
listitem_T *li;
list_T *l;
@@ -9634,28 +9128,183 @@ static void f_get(typval_T *argvars, typval_T *rettv)
if (argvars[0].v_type == VAR_LIST) {
if ((l = argvars[0].vval.v_list) != NULL) {
- int error = FALSE;
+ bool error = false;
- li = list_find(l, get_tv_number_chk(&argvars[1], &error));
- if (!error && li != NULL)
- tv = &li->li_tv;
+ li = tv_list_find(l, tv_get_number_chk(&argvars[1], &error));
+ if (!error && li != NULL) {
+ tv = TV_LIST_ITEM_TV(li);
+ }
}
} else if (argvars[0].v_type == VAR_DICT) {
if ((d = argvars[0].vval.v_dict) != NULL) {
- di = dict_find(d, get_tv_string(&argvars[1]), -1);
- if (di != NULL)
+ di = tv_dict_find(d, tv_get_string(&argvars[1]), -1);
+ if (di != NULL) {
tv = &di->di_tv;
+ }
}
- } else
+ } else if (tv_is_func(argvars[0])) {
+ partial_T *pt;
+ partial_T fref_pt;
+
+ if (argvars[0].v_type == VAR_PARTIAL) {
+ pt = argvars[0].vval.v_partial;
+ } else {
+ memset(&fref_pt, 0, sizeof(fref_pt));
+ fref_pt.pt_name = argvars[0].vval.v_string;
+ pt = &fref_pt;
+ }
+
+ if (pt != NULL) {
+ const char *const what = tv_get_string(&argvars[1]);
+
+ if (strcmp(what, "func") == 0 || strcmp(what, "name") == 0) {
+ rettv->v_type = (*what == 'f' ? VAR_FUNC : VAR_STRING);
+ const char *const n = (const char *)partial_name(pt);
+ assert(n != NULL);
+ rettv->vval.v_string = (char_u *)xstrdup(n);
+ if (rettv->v_type == VAR_FUNC) {
+ func_ref(rettv->vval.v_string);
+ }
+ } else if (strcmp(what, "dict") == 0) {
+ tv_dict_set_ret(rettv, pt->pt_dict);
+ } else if (strcmp(what, "args") == 0) {
+ rettv->v_type = VAR_LIST;
+ if (tv_list_alloc_ret(rettv, pt->pt_argc) != NULL) {
+ for (int i = 0; i < pt->pt_argc; i++) {
+ tv_list_append_tv(rettv->vval.v_list, &pt->pt_argv[i]);
+ }
+ }
+ } else {
+ EMSG2(_(e_invarg2), what);
+ }
+ return;
+ }
+ } else {
EMSG2(_(e_listdictarg), "get()");
+ }
if (tv == NULL) {
- if (argvars[2].v_type != VAR_UNKNOWN)
- copy_tv(&argvars[2], rettv);
- } else
- copy_tv(tv, rettv);
+ if (argvars[2].v_type != VAR_UNKNOWN) {
+ tv_copy(&argvars[2], rettv);
+ }
+ } else {
+ tv_copy(tv, rettv);
+ }
+}
+
+/// Returns information about signs placed in a buffer as list of dicts.
+static list_T *get_buffer_signs(buf_T *buf)
+ FUNC_ATTR_NONNULL_RET FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ list_T *const l = tv_list_alloc(kListLenMayKnow);
+ for (signlist_T *sign = buf->b_signlist; sign; sign = sign->next) {
+ dict_T *const d = tv_dict_alloc();
+
+ tv_dict_add_nr(d, S_LEN("id"), sign->id);
+ tv_dict_add_nr(d, S_LEN("lnum"), sign->lnum);
+ tv_dict_add_str(d, S_LEN("name"),
+ (const char *)sign_typenr2name(sign->typenr));
+
+ tv_list_append_dict(l, d);
+ }
+ return l;
+}
+
+/// Returns buffer options, variables and other attributes in a dictionary.
+static dict_T *get_buffer_info(buf_T *buf)
+{
+ dict_T *const dict = tv_dict_alloc();
+
+ tv_dict_add_nr(dict, S_LEN("bufnr"), buf->b_fnum);
+ tv_dict_add_str(dict, S_LEN("name"),
+ buf->b_ffname != NULL ? (const char *)buf->b_ffname : "");
+ tv_dict_add_nr(dict, S_LEN("lnum"),
+ buf == curbuf ? curwin->w_cursor.lnum : buflist_findlnum(buf));
+ tv_dict_add_nr(dict, S_LEN("loaded"), buf->b_ml.ml_mfp != NULL);
+ tv_dict_add_nr(dict, S_LEN("listed"), buf->b_p_bl);
+ tv_dict_add_nr(dict, S_LEN("changed"), bufIsChanged(buf));
+ tv_dict_add_nr(dict, S_LEN("changedtick"), buf_get_changedtick(buf));
+ tv_dict_add_nr(dict, S_LEN("hidden"),
+ buf->b_ml.ml_mfp != NULL && buf->b_nwindows == 0);
+
+ // Get a reference to buffer variables
+ tv_dict_add_dict(dict, S_LEN("variables"), buf->b_vars);
+
+ // List of windows displaying this buffer
+ list_T *const windows = tv_list_alloc(kListLenMayKnow);
+ FOR_ALL_TAB_WINDOWS(tp, wp) {
+ if (wp->w_buffer == buf) {
+ tv_list_append_number(windows, (varnumber_T)wp->handle);
+ }
+ }
+ tv_dict_add_list(dict, S_LEN("windows"), windows);
+
+ if (buf->b_signlist != NULL) {
+ // List of signs placed in this buffer
+ tv_dict_add_list(dict, S_LEN("signs"), get_buffer_signs(buf));
+ }
+
+ return dict;
}
+/// "getbufinfo()" function
+static void f_getbufinfo(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ buf_T *argbuf = NULL;
+ bool filtered = false;
+ bool sel_buflisted = false;
+ bool sel_bufloaded = false;
+
+ tv_list_alloc_ret(rettv, kListLenMayKnow);
+
+ // List of all the buffers or selected buffers
+ if (argvars[0].v_type == VAR_DICT) {
+ dict_T *sel_d = argvars[0].vval.v_dict;
+
+ if (sel_d != NULL) {
+ dictitem_T *di;
+
+ filtered = true;
+
+ di = tv_dict_find(sel_d, S_LEN("buflisted"));
+ if (di != NULL && tv_get_number(&di->di_tv)) {
+ sel_buflisted = true;
+ }
+
+ di = tv_dict_find(sel_d, S_LEN("bufloaded"));
+ if (di != NULL && tv_get_number(&di->di_tv)) {
+ sel_bufloaded = true;
+ }
+ }
+ } else if (argvars[0].v_type != VAR_UNKNOWN) {
+ // Information about one buffer. Argument specifies the buffer
+ if (tv_check_num(&argvars[0])) { // issue errmsg if type error
+ emsg_off++;
+ argbuf = tv_get_buf(&argvars[0], false);
+ emsg_off--;
+ if (argbuf == NULL) {
+ return;
+ }
+ }
+ }
+
+ // Return information about all the buffers or a specified buffer
+ FOR_ALL_BUFFERS(buf) {
+ if (argbuf != NULL && argbuf != buf) {
+ continue;
+ }
+ if (filtered && ((sel_bufloaded && buf->b_ml.ml_mfp == NULL)
+ || (sel_buflisted && !buf->b_p_bl))) {
+ continue;
+ }
+
+ dict_T *const d = get_buffer_info(buf);
+ tv_list_append_dict(rettv->vval.v_list, d);
+ if (argbuf != NULL) {
+ return;
+ }
+ }
+}
/*
* Get line or list of lines from buffer "buf" into "rettv".
@@ -9665,149 +9314,185 @@ static void f_get(typval_T *argvars, typval_T *rettv)
*/
static void get_buffer_lines(buf_T *buf, linenr_T start, linenr_T end, int retlist, typval_T *rettv)
{
- char_u *p;
-
- rettv->v_type = VAR_STRING;
+ rettv->v_type = (retlist ? VAR_LIST : VAR_STRING);
rettv->vval.v_string = NULL;
- if (retlist) {
- rettv_list_alloc(rettv);
- }
- if (buf == NULL || buf->b_ml.ml_mfp == NULL || start < 0)
+ if (buf == NULL || buf->b_ml.ml_mfp == NULL || start < 0 || end < start) {
+ if (retlist) {
+ tv_list_alloc_ret(rettv, 0);
+ }
return;
+ }
- if (!retlist) {
- if (start >= 1 && start <= buf->b_ml.ml_line_count)
- p = ml_get_buf(buf, start, FALSE);
- else
- p = (char_u *)"";
- rettv->vval.v_string = vim_strsave(p);
- } else {
- if (end < start)
- return;
-
- if (start < 1)
+ if (retlist) {
+ if (start < 1) {
start = 1;
- if (end > buf->b_ml.ml_line_count)
+ }
+ if (end > buf->b_ml.ml_line_count) {
end = buf->b_ml.ml_line_count;
+ }
+ tv_list_alloc_ret(rettv, end - start + 1);
while (start <= end) {
- list_append_string(
- rettv->vval.v_list, ml_get_buf(buf, start++, FALSE), -1);
+ tv_list_append_string(rettv->vval.v_list,
+ (const char *)ml_get_buf(buf, start++, false), -1);
}
+ } else {
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = ((start >= 1 && start <= buf->b_ml.ml_line_count)
+ ? vim_strsave(ml_get_buf(buf, start, false))
+ : NULL);
}
}
+/// Get the line number from VimL object
+///
+/// @note Unlike tv_get_lnum(), this one supports only "$" special string.
+///
+/// @param[in] tv Object to get value from. Is expected to be a number or
+/// a special string "$".
+/// @param[in] buf Buffer to take last line number from in case tv is "$". May
+/// be NULL, in this case "$" results in zero return.
+///
+/// @return Line number or 0 in case of error.
+static linenr_T tv_get_lnum_buf(const typval_T *const tv,
+ const buf_T *const buf)
+ FUNC_ATTR_NONNULL_ARG(1) FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ if (tv->v_type == VAR_STRING
+ && tv->vval.v_string != NULL
+ && tv->vval.v_string[0] == '$'
+ && buf != NULL) {
+ return buf->b_ml.ml_line_count;
+ }
+ return tv_get_number_chk(tv, NULL);
+}
+
/*
* "getbufline()" function
*/
-static void f_getbufline(typval_T *argvars, typval_T *rettv)
+static void f_getbufline(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- linenr_T lnum;
- linenr_T end;
- buf_T *buf;
+ buf_T *buf = NULL;
- (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
- ++emsg_off;
- buf = get_buf_tv(&argvars[0], FALSE);
- --emsg_off;
+ if (tv_check_str_or_nr(&argvars[0])) {
+ emsg_off++;
+ buf = tv_get_buf(&argvars[0], false);
+ emsg_off--;
+ }
- lnum = get_tv_lnum_buf(&argvars[1], buf);
- if (argvars[2].v_type == VAR_UNKNOWN)
- end = lnum;
- else
- end = get_tv_lnum_buf(&argvars[2], buf);
+ const linenr_T lnum = tv_get_lnum_buf(&argvars[1], buf);
+ const linenr_T end = (argvars[2].v_type == VAR_UNKNOWN
+ ? lnum
+ : tv_get_lnum_buf(&argvars[2], buf));
- get_buffer_lines(buf, lnum, end, TRUE, rettv);
+ get_buffer_lines(buf, lnum, end, true, rettv);
}
/*
* "getbufvar()" function
*/
-static void f_getbufvar(typval_T *argvars, typval_T *rettv)
+static void f_getbufvar(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- buf_T *buf;
- buf_T *save_curbuf;
- char_u *varname;
- dictitem_T *v;
- int done = FALSE;
-
- (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
- varname = get_tv_string_chk(&argvars[1]);
- ++emsg_off;
- buf = get_buf_tv(&argvars[0], FALSE);
+ bool done = false;
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
+ if (!tv_check_str_or_nr(&argvars[0])) {
+ goto f_getbufvar_end;
+ }
+
+ const char *varname = tv_get_string_chk(&argvars[1]);
+ emsg_off++;
+ buf_T *const buf = tv_get_buf(&argvars[0], false);
+
if (buf != NULL && varname != NULL) {
- /* set curbuf to be our buf, temporarily */
- save_curbuf = curbuf;
+ // set curbuf to be our buf, temporarily
+ buf_T *const save_curbuf = curbuf;
curbuf = buf;
- if (*varname == '&') { /* buffer-local-option */
- if (get_option_tv(&varname, rettv, TRUE) == OK)
- done = TRUE;
- } else if (STRCMP(varname, "changedtick") == 0) {
- rettv->v_type = VAR_NUMBER;
- rettv->vval.v_number = curbuf->b_changedtick;
- done = TRUE;
+ if (*varname == '&') { // buffer-local-option
+ if (varname[1] == NUL) {
+ // get all buffer-local options in a dict
+ dict_T *opts = get_winbuf_options(true);
+
+ if (opts != NULL) {
+ tv_dict_set_ret(rettv, opts);
+ done = true;
+ }
+ } else if (get_option_tv(&varname, rettv, true) == OK) {
+ // buffer-local-option
+ done = true;
+ }
} else {
- /* Look up the variable. */
- /* Let getbufvar({nr}, "") return the "b:" dictionary. */
- v = find_var_in_ht(&curbuf->b_vars->dv_hashtab,
- 'b', varname, FALSE);
+ // Look up the variable.
+ // Let getbufvar({nr}, "") return the "b:" dictionary.
+ dictitem_T *const v = find_var_in_ht(&curbuf->b_vars->dv_hashtab, 'b',
+ varname, strlen(varname), false);
if (v != NULL) {
- copy_tv(&v->di_tv, rettv);
- done = TRUE;
+ tv_copy(&v->di_tv, rettv);
+ done = true;
}
}
- /* restore previous notion of curbuf */
+ // restore previous notion of curbuf
curbuf = save_curbuf;
}
+ emsg_off--;
- if (!done && argvars[2].v_type != VAR_UNKNOWN)
- /* use the default value */
- copy_tv(&argvars[2], rettv);
-
- --emsg_off;
+f_getbufvar_end:
+ if (!done && argvars[2].v_type != VAR_UNKNOWN) {
+ // use the default value
+ tv_copy(&argvars[2], rettv);
+ }
}
/*
* "getchar()" function
*/
-static void f_getchar(typval_T *argvars, typval_T *rettv)
+static void f_getchar(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
varnumber_T n;
- int error = FALSE;
-
- /* Position the cursor. Needed after a message that ends in a space. */
- ui_cursor_goto(msg_row, msg_col);
+ bool error = false;
- ++no_mapping;
- ++allow_keys;
+ no_mapping++;
for (;; ) {
- if (argvars[0].v_type == VAR_UNKNOWN)
- /* getchar(): blocking wait. */
+ // Position the cursor. Needed after a message that ends in a space,
+ // or if event processing caused a redraw.
+ ui_cursor_goto(msg_row, msg_col);
+
+ if (argvars[0].v_type == VAR_UNKNOWN) {
+ // getchar(): blocking wait.
+ if (!(char_avail() || using_script() || input_available())) {
+ input_enable_events();
+ (void)os_inchar(NULL, 0, -1, 0);
+ input_disable_events();
+ if (!multiqueue_empty(main_loop.events)) {
+ multiqueue_process_events(main_loop.events);
+ continue;
+ }
+ }
n = safe_vgetc();
- else if (get_tv_number_chk(&argvars[0], &error) == 1)
- /* getchar(1): only check if char avail */
+ } else if (tv_get_number_chk(&argvars[0], &error) == 1) {
+ // getchar(1): only check if char avail
n = vpeekc_any();
- else if (error || vpeekc_any() == NUL)
- /* illegal argument or getchar(0) and no char avail: return zero */
+ } else if (error || vpeekc_any() == NUL) {
+ // illegal argument or getchar(0) and no char avail: return zero
n = 0;
- else
- /* getchar(0) and char avail: return char */
+ } else {
+ // getchar(0) and char avail: return char
n = safe_vgetc();
+ }
- if (n == K_IGNORE)
+ if (n == K_IGNORE) {
continue;
+ }
break;
}
- --no_mapping;
- --allow_keys;
+ no_mapping--;
vimvars[VV_MOUSE_WIN].vv_nr = 0;
+ vimvars[VV_MOUSE_WINID].vv_nr = 0;
vimvars[VV_MOUSE_LNUM].vv_nr = 0;
vimvars[VV_MOUSE_COL].vv_nr = 0;
@@ -9826,10 +9511,9 @@ static void f_getchar(typval_T *argvars, typval_T *rettv)
temp[i++] = K_SPECIAL;
temp[i++] = K_SECOND(n);
temp[i++] = K_THIRD(n);
- } else if (has_mbyte)
- i += (*mb_char2bytes)(n, temp + i);
- else
- temp[i++] = n;
+ } else {
+ i += utf_char2bytes(n, temp + i);
+ }
temp[i++] = NUL;
rettv->v_type = VAR_STRING;
rettv->vval.v_string = vim_strsave(temp);
@@ -9846,10 +9530,14 @@ static void f_getchar(typval_T *argvars, typval_T *rettv)
/* Find the window at the mouse coordinates and compute the
* text position. */
win = mouse_find_win(&row, &col);
+ if (win == NULL) {
+ return;
+ }
(void)mouse_comp_pos(win, &row, &col, &lnum);
for (wp = firstwin; wp != win; wp = wp->w_next)
++winnr;
vimvars[VV_MOUSE_WIN].vv_nr = winnr;
+ vimvars[VV_MOUSE_WINID].vv_nr = wp->handle;
vimvars[VV_MOUSE_LNUM].vv_nr = lnum;
vimvars[VV_MOUSE_COL].vv_nr = col + 1;
}
@@ -9860,7 +9548,7 @@ static void f_getchar(typval_T *argvars, typval_T *rettv)
/*
* "getcharmod()" function
*/
-static void f_getcharmod(typval_T *argvars, typval_T *rettv)
+static void f_getcharmod(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->vval.v_number = mod_mask;
}
@@ -9868,21 +9556,21 @@ static void f_getcharmod(typval_T *argvars, typval_T *rettv)
/*
* "getcharsearch()" function
*/
-static void f_getcharsearch(typval_T *argvars, typval_T *rettv)
+static void f_getcharsearch(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- rettv_dict_alloc(rettv);
+ tv_dict_alloc_ret(rettv);
dict_T *dict = rettv->vval.v_dict;
- dict_add_nr_str(dict, "char", 0L, last_csearch());
- dict_add_nr_str(dict, "forward", last_csearch_forward(), NULL);
- dict_add_nr_str(dict, "until", last_csearch_until(), NULL);
+ tv_dict_add_str(dict, S_LEN("char"), last_csearch());
+ tv_dict_add_nr(dict, S_LEN("forward"), last_csearch_forward());
+ tv_dict_add_nr(dict, S_LEN("until"), last_csearch_until());
}
/*
* "getcmdline()" function
*/
-static void f_getcmdline(typval_T *argvars, typval_T *rettv)
+static void f_getcmdline(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_STRING;
rettv->vval.v_string = get_cmdline_str();
@@ -9891,7 +9579,7 @@ static void f_getcmdline(typval_T *argvars, typval_T *rettv)
/*
* "getcmdpos()" function
*/
-static void f_getcmdpos(typval_T *argvars, typval_T *rettv)
+static void f_getcmdpos(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->vval.v_number = get_cmdline_pos() + 1;
}
@@ -9899,7 +9587,7 @@ static void f_getcmdpos(typval_T *argvars, typval_T *rettv)
/*
* "getcmdtype()" function
*/
-static void f_getcmdtype(typval_T *argvars, typval_T *rettv)
+static void f_getcmdtype(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_STRING;
rettv->vval.v_string = xmallocz(1);
@@ -9909,7 +9597,7 @@ static void f_getcmdtype(typval_T *argvars, typval_T *rettv)
/*
* "getcmdwintype()" function
*/
-static void f_getcmdwintype(typval_T *argvars, typval_T *rettv)
+static void f_getcmdwintype(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
@@ -9917,6 +9605,77 @@ static void f_getcmdwintype(typval_T *argvars, typval_T *rettv)
rettv->vval.v_string[0] = cmdwin_type;
}
+// "getcompletion()" function
+static void f_getcompletion(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ char_u *pat;
+ expand_T xpc;
+ bool filtered = false;
+ int options = WILD_SILENT | WILD_USE_NL | WILD_ADD_SLASH
+ | WILD_NO_BEEP;
+
+ if (argvars[2].v_type != VAR_UNKNOWN) {
+ filtered = (bool)tv_get_number_chk(&argvars[2], NULL);
+ }
+
+ if (p_wic) {
+ options |= WILD_ICASE;
+ }
+
+ // For filtered results, 'wildignore' is used
+ if (!filtered) {
+ options |= WILD_KEEP_ALL;
+ }
+
+ if (argvars[0].v_type != VAR_STRING || argvars[1].v_type != VAR_STRING) {
+ EMSG(_(e_invarg));
+ return;
+ }
+
+ if (strcmp(tv_get_string(&argvars[1]), "cmdline") == 0) {
+ set_one_cmd_context(&xpc, tv_get_string(&argvars[0]));
+ xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern);
+ goto theend;
+ }
+
+ ExpandInit(&xpc);
+ xpc.xp_pattern = (char_u *)tv_get_string(&argvars[0]);
+ xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern);
+ xpc.xp_context = cmdcomplete_str_to_type(
+ (char_u *)tv_get_string(&argvars[1]));
+ if (xpc.xp_context == EXPAND_NOTHING) {
+ EMSG2(_(e_invarg2), argvars[1].vval.v_string);
+ return;
+ }
+
+ if (xpc.xp_context == EXPAND_MENUS) {
+ set_context_in_menu_cmd(&xpc, (char_u *)"menu", xpc.xp_pattern, false);
+ xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern);
+ }
+
+ if (xpc.xp_context == EXPAND_CSCOPE) {
+ set_context_in_cscope_cmd(&xpc, (const char *)xpc.xp_pattern, CMD_cscope);
+ xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern);
+ }
+
+ if (xpc.xp_context == EXPAND_SIGN) {
+ set_context_in_sign_cmd(&xpc, xpc.xp_pattern);
+ xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern);
+ }
+
+theend:
+ pat = addstar(xpc.xp_pattern, xpc.xp_pattern_len, xpc.xp_context);
+ ExpandOne(&xpc, pat, NULL, options, WILD_ALL_KEEP);
+ tv_list_alloc_ret(rettv, xpc.xp_numfiles);
+
+ for (int i = 0; i < xpc.xp_numfiles; i++) {
+ tv_list_append_string(rettv->vval.v_list, (const char *)xpc.xp_files[i],
+ -1);
+ }
+ xfree(pat);
+ ExpandCleanup(&xpc);
+}
+
/// `getcwd([{win}[, {tab}]])` function
///
/// Every scope not specified implies the currently selected scope object.
@@ -9926,7 +9685,7 @@ static void f_getcmdwintype(typval_T *argvars, typval_T *rettv)
/// @pre An argument may not be -1 if preceding arguments are not all -1.
///
/// @post The return value will be a string.
-static void f_getcwd(typval_T *argvars, typval_T *rettv)
+static void f_getcwd(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
// Possible scope of working directory to return.
CdScope scope = kCdScopeInvalid;
@@ -10011,26 +9770,22 @@ static void f_getcwd(typval_T *argvars, typval_T *rettv)
if (from) {
break;
}
- case kCdScopeTab: // FALLTHROUGH
+ FALLTHROUGH;
+ case kCdScopeTab:
assert(tp);
- from = tp->localdir;
+ from = tp->tp_localdir;
if (from) {
break;
}
- case kCdScopeGlobal: // FALLTHROUGH
- // The `globaldir` variable is not always set.
- if (globaldir) {
+ FALLTHROUGH;
+ case kCdScopeGlobal:
+ if (globaldir) { // `globaldir` is not always set.
from = globaldir;
- } else {
- // We have to copy the OS path directly into output string.
- if (os_dirname(cwd, MAXPATHL) == FAIL) {
- EMSG(_("E41: Could not display path."));
- goto end;
- }
+ } else if (os_dirname(cwd, MAXPATHL) == FAIL) { // Get the OS CWD.
+ from = (char_u *)""; // Return empty string on failure.
}
break;
- case kCdScopeInvalid:
- // We should never get here
+ case kCdScopeInvalid: // We should never get here
assert(false);
}
@@ -10042,14 +9797,14 @@ static void f_getcwd(typval_T *argvars, typval_T *rettv)
#ifdef BACKSLASH_IN_FILENAME
slash_adjust(rettv->vval.v_string);
#endif
-end:
+
xfree(cwd);
}
/*
* "getfontname()" function
*/
-static void f_getfontname(typval_T *argvars, typval_T *rettv)
+static void f_getfontname(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
@@ -10058,39 +9813,40 @@ static void f_getfontname(typval_T *argvars, typval_T *rettv)
/*
* "getfperm({fname})" function
*/
-static void f_getfperm(typval_T *argvars, typval_T *rettv)
+static void f_getfperm(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *perm = NULL;
+ char *perm = NULL;
char_u flags[] = "rwx";
- char_u *filename = get_tv_string(&argvars[0]);
+ const char *filename = tv_get_string(&argvars[0]);
int32_t file_perm = os_getperm(filename);
if (file_perm >= 0) {
- perm = vim_strsave((char_u *)"---------");
+ perm = xstrdup("---------");
for (int i = 0; i < 9; i++) {
- if (file_perm & (1 << (8 - i)))
+ if (file_perm & (1 << (8 - i))) {
perm[i] = flags[i % 3];
+ }
}
}
rettv->v_type = VAR_STRING;
- rettv->vval.v_string = perm;
+ rettv->vval.v_string = (char_u *)perm;
}
/*
* "getfsize({fname})" function
*/
-static void f_getfsize(typval_T *argvars, typval_T *rettv)
+static void f_getfsize(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char *fname = (char *)get_tv_string(&argvars[0]);
+ const char *fname = tv_get_string(&argvars[0]);
rettv->v_type = VAR_NUMBER;
FileInfo file_info;
if (os_fileinfo(fname, &file_info)) {
uint64_t filesize = os_fileinfo_size(&file_info);
- if (os_isdir((char_u *)fname))
+ if (os_isdir((const char_u *)fname)) {
rettv->vval.v_number = 0;
- else {
+ } else {
rettv->vval.v_number = (varnumber_T)filesize;
/* non-perfect check for overflow */
@@ -10106,9 +9862,9 @@ static void f_getfsize(typval_T *argvars, typval_T *rettv)
/*
* "getftime({fname})" function
*/
-static void f_getftime(typval_T *argvars, typval_T *rettv)
+static void f_getftime(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char *fname = (char *)get_tv_string(&argvars[0]);
+ const char *fname = tv_get_string(&argvars[0]);
FileInfo file_info;
if (os_fileinfo(fname, &file_info)) {
@@ -10121,17 +9877,16 @@ static void f_getftime(typval_T *argvars, typval_T *rettv)
/*
* "getftype({fname})" function
*/
-static void f_getftype(typval_T *argvars, typval_T *rettv)
+static void f_getftype(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *fname;
char_u *type = NULL;
char *t;
- fname = get_tv_string(&argvars[0]);
+ const char *fname = tv_get_string(&argvars[0]);
rettv->v_type = VAR_STRING;
FileInfo file_info;
- if (os_fileinfo_link((char *)fname, &file_info)) {
+ if (os_fileinfo_link(fname, &file_info)) {
uint64_t mode = file_info.stat.st_mode;
#ifdef S_ISREG
if (S_ISREG(mode))
@@ -10156,7 +9911,7 @@ static void f_getftype(typval_T *argvars, typval_T *rettv)
# endif
# ifdef S_ISSOCK
else if (S_ISSOCK(mode))
- t = "fifo";
+ t = "socket";
# endif
else
t = "other";
@@ -10183,10 +9938,11 @@ static void f_getftype(typval_T *argvars, typval_T *rettv)
default: t = "other";
}
# else
- if (os_isdir(fname))
+ if (os_isdir((const char_u *)fname)) {
t = "dir";
- else
+ } else {
t = "file";
+ }
# endif
#endif
type = vim_strsave((char_u *)t);
@@ -10197,69 +9953,101 @@ static void f_getftype(typval_T *argvars, typval_T *rettv)
/*
* "getline(lnum, [end])" function
*/
-static void f_getline(typval_T *argvars, typval_T *rettv)
+static void f_getline(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- linenr_T lnum;
linenr_T end;
- int retlist;
+ bool retlist;
- lnum = get_tv_lnum(argvars);
+ const linenr_T lnum = tv_get_lnum(argvars);
if (argvars[1].v_type == VAR_UNKNOWN) {
- end = 0;
- retlist = FALSE;
+ end = lnum;
+ retlist = false;
} else {
- end = get_tv_lnum(&argvars[1]);
- retlist = TRUE;
+ end = tv_get_lnum(&argvars[1]);
+ retlist = true;
}
get_buffer_lines(curbuf, lnum, end, retlist, rettv);
}
+static void get_qf_loc_list(int is_qf, win_T *wp, typval_T *what_arg,
+ typval_T *rettv)
+{
+ if (what_arg->v_type == VAR_UNKNOWN) {
+ tv_list_alloc_ret(rettv, kListLenMayKnow);
+ if (is_qf || wp != NULL) {
+ (void)get_errorlist(NULL, wp, -1, rettv->vval.v_list);
+ }
+ } else {
+ tv_dict_alloc_ret(rettv);
+ if (is_qf || wp != NULL) {
+ if (what_arg->v_type == VAR_DICT) {
+ dict_T *d = what_arg->vval.v_dict;
+
+ if (d != NULL) {
+ get_errorlist_properties(wp, d, rettv->vval.v_dict);
+ }
+ } else {
+ EMSG(_(e_dictreq));
+ }
+ }
+ }
+}
+
+/// "getloclist()" function
+static void f_getloclist(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ win_T *wp = find_win_by_nr(&argvars[0], NULL);
+ get_qf_loc_list(false, wp, &argvars[1], rettv);
+}
+
/*
* "getmatches()" function
*/
-static void f_getmatches(typval_T *argvars, typval_T *rettv)
+static void f_getmatches(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
matchitem_T *cur = curwin->w_match_head;
int i;
- rettv_list_alloc(rettv);
+ tv_list_alloc_ret(rettv, kListLenMayKnow);
while (cur != NULL) {
- dict_T *dict = dict_alloc();
+ dict_T *dict = tv_dict_alloc();
if (cur->match.regprog == NULL) {
- // match added with matchaddpos()
- for (i = 0; i < MAXPOSMATCH; ++i) {
+ // match added with matchaddpos()
+ for (i = 0; i < MAXPOSMATCH; i++) {
llpos_T *llpos;
- char buf[6];
+ char buf[6];
llpos = &cur->pos.pos[i];
if (llpos->lnum == 0) {
break;
}
- list_T *l = list_alloc();
- list_append_number(l, (varnumber_T)llpos->lnum);
+ list_T *const l = tv_list_alloc(1 + (llpos->col > 0 ? 2 : 0));
+ tv_list_append_number(l, (varnumber_T)llpos->lnum);
if (llpos->col > 0) {
- list_append_number(l, (varnumber_T)llpos->col);
- list_append_number(l, (varnumber_T)llpos->len);
+ tv_list_append_number(l, (varnumber_T)llpos->col);
+ tv_list_append_number(l, (varnumber_T)llpos->len);
}
- sprintf(buf, "pos%d", i + 1);
- dict_add_list(dict, buf, l);
+ int len = snprintf(buf, sizeof(buf), "pos%d", i + 1);
+ assert((size_t)len < sizeof(buf));
+ tv_dict_add_list(dict, buf, (size_t)len, l);
}
} else {
- dict_add_nr_str(dict, "pattern", 0L, cur->pattern);
+ tv_dict_add_str(dict, S_LEN("pattern"), (const char *)cur->pattern);
}
- dict_add_nr_str(dict, "group", 0L, syn_id2name(cur->hlg_id));
- dict_add_nr_str(dict, "priority", (long)cur->priority, NULL);
- dict_add_nr_str(dict, "id", (long)cur->id, NULL);
+ tv_dict_add_str(dict, S_LEN("group"),
+ (const char *)syn_id2name(cur->hlg_id));
+ tv_dict_add_nr(dict, S_LEN("priority"), (varnumber_T)cur->priority);
+ tv_dict_add_nr(dict, S_LEN("id"), (varnumber_T)cur->id);
if (cur->conceal_char) {
- char_u buf[MB_MAXBYTES + 1];
+ char buf[MB_MAXBYTES + 1];
- buf[(*mb_char2bytes)((int)cur->conceal_char, buf)] = NUL;
- dict_add_nr_str(dict, "conceal", 0L, (char_u *)&buf);
+ buf[utf_char2bytes((int)cur->conceal_char, (char_u *)buf)] = NUL;
+ tv_dict_add_str(dict, S_LEN("conceal"), buf);
}
- list_append_dict(rettv->vval.v_list, dict);
+ tv_list_append_dict(rettv->vval.v_list, dict);
cur = cur->next;
}
}
@@ -10267,7 +10055,7 @@ static void f_getmatches(typval_T *argvars, typval_T *rettv)
/*
* "getpid()" function
*/
-static void f_getpid(typval_T *argvars, typval_T *rettv)
+static void f_getpid(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->vval.v_number = os_get_pid();
}
@@ -10283,27 +10071,29 @@ static void getpos_both(typval_T *argvars, typval_T *rettv, bool getcurpos)
fp = var2fpos(&argvars[0], true, &fnum);
}
- list_T *l = rettv_list_alloc(rettv);
- list_append_number(l, (fnum != -1) ? (varnumber_T)fnum : (varnumber_T)0);
- list_append_number(l, (fp != NULL) ? (varnumber_T)fp->lnum : (varnumber_T)0);
- list_append_number(l,
- (fp != NULL)
- ? (varnumber_T)(fp->col == MAXCOL ? MAXCOL : fp->col + 1)
- : (varnumber_T)0);
- list_append_number(l,
- (fp != NULL) ? (varnumber_T)fp->coladd : (varnumber_T)0);
+ list_T *const l = tv_list_alloc_ret(rettv, 4 + (!!getcurpos));
+ tv_list_append_number(l, (fnum != -1) ? (varnumber_T)fnum : (varnumber_T)0);
+ tv_list_append_number(l, ((fp != NULL)
+ ? (varnumber_T)fp->lnum
+ : (varnumber_T)0));
+ tv_list_append_number(
+ l, ((fp != NULL)
+ ? (varnumber_T)(fp->col == MAXCOL ? MAXCOL : fp->col + 1)
+ : (varnumber_T)0));
+ tv_list_append_number(
+ l, (fp != NULL) ? (varnumber_T)fp->coladd : (varnumber_T)0);
if (getcurpos) {
update_curswant();
- list_append_number(l, curwin->w_curswant == MAXCOL
+ tv_list_append_number(l, (curwin->w_curswant == MAXCOL
? (varnumber_T)MAXCOL
- : (varnumber_T)curwin->w_curswant + 1);
+ : (varnumber_T)curwin->w_curswant + 1));
}
}
/*
* "getcurpos(string)" function
*/
-static void f_getcurpos(typval_T *argvars, typval_T *rettv)
+static void f_getcurpos(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
getpos_both(argvars, rettv, true);
}
@@ -10311,65 +10101,55 @@ static void f_getcurpos(typval_T *argvars, typval_T *rettv)
/*
* "getpos(string)" function
*/
-static void f_getpos(typval_T *argvars, typval_T *rettv)
+static void f_getpos(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
getpos_both(argvars, rettv, false);
}
-/*
- * "getqflist()" and "getloclist()" functions
- */
-static void f_getqflist(typval_T *argvars, typval_T *rettv)
+/// "getqflist()" functions
+static void f_getqflist(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- rettv_list_alloc(rettv);
- win_T *wp = NULL;
- if (argvars[0].v_type != VAR_UNKNOWN) { /* getloclist() */
- wp = find_win_by_nr(&argvars[0], NULL);
- if (wp == NULL) {
- return;
- }
- }
- (void)get_errorlist(wp, rettv->vval.v_list);
+ get_qf_loc_list(true, NULL, &argvars[0], rettv);
}
/// "getreg()" function
-static void f_getreg(typval_T *argvars, typval_T *rettv)
+static void f_getreg(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *strregname;
- int regname;
+ const char *strregname;
int arg2 = false;
bool return_list = false;
- int error = false;
+ bool error = false;
if (argvars[0].v_type != VAR_UNKNOWN) {
- strregname = get_tv_string_chk(&argvars[0]);
+ strregname = tv_get_string_chk(&argvars[0]);
error = strregname == NULL;
if (argvars[1].v_type != VAR_UNKNOWN) {
- arg2 = get_tv_number_chk(&argvars[1], &error);
+ arg2 = tv_get_number_chk(&argvars[1], &error);
if (!error && argvars[2].v_type != VAR_UNKNOWN) {
- return_list = get_tv_number_chk(&argvars[2], &error);
+ return_list = tv_get_number_chk(&argvars[2], &error);
}
}
} else {
- strregname = vimvars[VV_REG].vv_str;
+ strregname = (const char *)vimvars[VV_REG].vv_str;
}
if (error) {
return;
}
- regname = (strregname == NULL ? '"' : *strregname);
- if (regname == 0)
+ int regname = (uint8_t)(strregname == NULL ? '"' : *strregname);
+ if (regname == 0) {
regname = '"';
+ }
if (return_list) {
rettv->v_type = VAR_LIST;
- rettv->vval.v_list =
+ rettv->vval.v_list =
get_reg_contents(regname, (arg2 ? kGRegExprSrc : 0) | kGRegList);
if (rettv->vval.v_list == NULL) {
- rettv->vval.v_list = list_alloc();
+ rettv->vval.v_list = tv_list_alloc(0);
}
- rettv->vval.v_list->lv_refcount++;
+ tv_list_ref(rettv->vval.v_list);
} else {
rettv->v_type = VAR_STRING;
rettv->vval.v_string = get_reg_contents(regname, arg2 ? kGRegExprSrc : 0);
@@ -10379,25 +10159,26 @@ static void f_getreg(typval_T *argvars, typval_T *rettv)
/*
* "getregtype()" function
*/
-static void f_getregtype(typval_T *argvars, typval_T *rettv)
+static void f_getregtype(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *strregname;
- int regname;
+ const char *strregname;
if (argvars[0].v_type != VAR_UNKNOWN) {
- strregname = get_tv_string_chk(&argvars[0]);
- if (strregname == NULL) { /* type error; errmsg already given */
+ strregname = tv_get_string_chk(&argvars[0]);
+ if (strregname == NULL) { // Type error; errmsg already given.
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
return;
}
- } else
- /* Default to v:register */
- strregname = vimvars[VV_REG].vv_str;
+ } else {
+ // Default to v:register.
+ strregname = (const char *)vimvars[VV_REG].vv_str;
+ }
- regname = (strregname == NULL ? '"' : *strregname);
- if (regname == 0)
+ int regname = (uint8_t)(strregname == NULL ? '"' : *strregname);
+ if (regname == 0) {
regname = '"';
+ }
colnr_T reglen = 0;
char buf[NUMBUFLEN + 2];
@@ -10408,57 +10189,179 @@ static void f_getregtype(typval_T *argvars, typval_T *rettv)
rettv->vval.v_string = (char_u *)xstrdup(buf);
}
+/// Returns information (variables, options, etc.) about a tab page
+/// as a dictionary.
+static dict_T *get_tabpage_info(tabpage_T *tp, int tp_idx)
+{
+ dict_T *const dict = tv_dict_alloc();
+
+ tv_dict_add_nr(dict, S_LEN("tabnr"), tp_idx);
+
+ list_T *const l = tv_list_alloc(kListLenMayKnow);
+ FOR_ALL_WINDOWS_IN_TAB(wp, tp) {
+ tv_list_append_number(l, (varnumber_T)wp->handle);
+ }
+ tv_dict_add_list(dict, S_LEN("windows"), l);
+
+ // Make a reference to tabpage variables
+ tv_dict_add_dict(dict, S_LEN("variables"), tp->tp_vars);
+
+ return dict;
+}
+
+/// "gettabinfo()" function
+static void f_gettabinfo(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ tabpage_T *tparg = NULL;
+
+ tv_list_alloc_ret(rettv, (argvars[0].v_type == VAR_UNKNOWN
+ ? 1
+ : kListLenMayKnow));
+
+ if (argvars[0].v_type != VAR_UNKNOWN) {
+ // Information about one tab page
+ tparg = find_tabpage((int)tv_get_number_chk(&argvars[0], NULL));
+ if (tparg == NULL) {
+ return;
+ }
+ }
+
+ // Get information about a specific tab page or all tab pages
+ int tpnr = 0;
+ FOR_ALL_TABS(tp) {
+ tpnr++;
+ if (tparg != NULL && tp != tparg) {
+ continue;
+ }
+ dict_T *const d = get_tabpage_info(tp, tpnr);
+ tv_list_append_dict(rettv->vval.v_list, d);
+ if (tparg != NULL) {
+ return;
+ }
+ }
+}
+
/*
* "gettabvar()" function
*/
-static void f_gettabvar(typval_T *argvars, typval_T *rettv)
+static void f_gettabvar(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
win_T *oldcurwin;
- tabpage_T *tp, *oldtabpage;
- dictitem_T *v;
- char_u *varname;
+ tabpage_T *oldtabpage;
bool done = false;
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
- varname = get_tv_string_chk(&argvars[1]);
- tp = find_tabpage((int)get_tv_number_chk(&argvars[0], NULL));
+ const char *const varname = tv_get_string_chk(&argvars[1]);
+ tabpage_T *const tp = find_tabpage((int)tv_get_number_chk(&argvars[0], NULL));
if (tp != NULL && varname != NULL) {
// Set tp to be our tabpage, temporarily. Also set the window to the
// first window in the tabpage, otherwise the window is not valid.
- win_T *window = tp->tp_firstwin == NULL ? firstwin : tp->tp_firstwin;
+ win_T *const window = tp == curtab || tp->tp_firstwin == NULL
+ ? firstwin
+ : tp->tp_firstwin;
if (switch_win(&oldcurwin, &oldtabpage, window, tp, true) == OK) {
// look up the variable
// Let gettabvar({nr}, "") return the "t:" dictionary.
- v = find_var_in_ht(&tp->tp_vars->dv_hashtab, 't', varname, FALSE);
+ const dictitem_T *const v = find_var_in_ht(&tp->tp_vars->dv_hashtab, 't',
+ varname, strlen(varname),
+ false);
if (v != NULL) {
- copy_tv(&v->di_tv, rettv);
+ tv_copy(&v->di_tv, rettv);
done = true;
}
}
- /* restore previous notion of curwin */
- restore_win(oldcurwin, oldtabpage, TRUE);
+ // restore previous notion of curwin
+ restore_win(oldcurwin, oldtabpage, true);
}
if (!done && argvars[2].v_type != VAR_UNKNOWN) {
- copy_tv(&argvars[2], rettv);
+ tv_copy(&argvars[2], rettv);
}
}
/*
* "gettabwinvar()" function
*/
-static void f_gettabwinvar(typval_T *argvars, typval_T *rettv)
+static void f_gettabwinvar(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
getwinvar(argvars, rettv, 1);
}
+/// Returns information about a window as a dictionary.
+static dict_T *get_win_info(win_T *wp, int16_t tpnr, int16_t winnr)
+{
+ dict_T *const dict = tv_dict_alloc();
+
+ tv_dict_add_nr(dict, S_LEN("tabnr"), tpnr);
+ tv_dict_add_nr(dict, S_LEN("winnr"), winnr);
+ tv_dict_add_nr(dict, S_LEN("winid"), wp->handle);
+ tv_dict_add_nr(dict, S_LEN("height"), wp->w_height);
+ tv_dict_add_nr(dict, S_LEN("winrow"), wp->w_winrow);
+ tv_dict_add_nr(dict, S_LEN("width"), wp->w_width);
+ tv_dict_add_nr(dict, S_LEN("bufnr"), wp->w_buffer->b_fnum);
+ tv_dict_add_nr(dict, S_LEN("wincol"), wp->w_wincol);
+
+ tv_dict_add_nr(dict, S_LEN("quickfix"), bt_quickfix(wp->w_buffer));
+ tv_dict_add_nr(dict, S_LEN("loclist"),
+ (bt_quickfix(wp->w_buffer) && wp->w_llist_ref != NULL));
+
+ // Add a reference to window variables
+ tv_dict_add_dict(dict, S_LEN("variables"), wp->w_vars);
+
+ return dict;
+}
+
+/// "getwininfo()" function
+static void f_getwininfo(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ win_T *wparg = NULL;
+
+ tv_list_alloc_ret(rettv, kListLenMayKnow);
+
+ if (argvars[0].v_type != VAR_UNKNOWN) {
+ wparg = win_id2wp(argvars);
+ if (wparg == NULL) {
+ return;
+ }
+ }
+
+ // Collect information about either all the windows across all the tab
+ // pages or one particular window.
+ int16_t tabnr = 0;
+ FOR_ALL_TABS(tp) {
+ tabnr++;
+ int16_t winnr = 0;
+ FOR_ALL_WINDOWS_IN_TAB(wp, tp) {
+ winnr++;
+ if (wparg != NULL && wp != wparg) {
+ continue;
+ }
+ dict_T *const d = get_win_info(wp, tabnr, winnr);
+ tv_list_append_dict(rettv->vval.v_list, d);
+ if (wparg != NULL) {
+ // found information about a specific window
+ return;
+ }
+ }
+ }
+}
+
+// "win_screenpos()" function
+static void f_win_screenpos(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ tv_list_alloc_ret(rettv, 2);
+ const win_T *const wp = find_win_by_nr(&argvars[0], NULL);
+ tv_list_append_number(rettv->vval.v_list, wp == NULL ? 0 : wp->w_winrow + 1);
+ tv_list_append_number(rettv->vval.v_list, wp == NULL ? 0 : wp->w_wincol + 1);
+}
+
/*
* "getwinposx()" function
*/
-static void f_getwinposx(typval_T *argvars, typval_T *rettv)
+static void f_getwinposx(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->vval.v_number = -1;
}
@@ -10466,7 +10369,7 @@ static void f_getwinposx(typval_T *argvars, typval_T *rettv)
/*
* "getwinposy()" function
*/
-static void f_getwinposy(typval_T *argvars, typval_T *rettv)
+static void f_getwinposy(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->vval.v_number = -1;
}
@@ -10480,7 +10383,7 @@ find_win_by_nr (
tabpage_T *tp /* NULL for current tab page */
)
{
- int nr = get_tv_number_chk(vp, NULL);
+ int nr = (int)tv_get_number_chk(vp, NULL);
if (nr < 0) {
return NULL;
@@ -10496,7 +10399,11 @@ find_win_by_nr (
}
FOR_ALL_WINDOWS_IN_TAB(wp, tp) {
- if (--nr <= 0) {
+ if (nr >= LOWEST_WIN_ID) {
+ if (wp->handle == nr) {
+ return wp;
+ }
+ } else if (--nr <= 0) {
return wp;
}
}
@@ -10511,7 +10418,7 @@ static win_T *find_tabwin(typval_T *wvp, typval_T *tvp)
if (wvp->v_type != VAR_UNKNOWN) {
if (tvp->v_type != VAR_UNKNOWN) {
- long n = get_tv_number(tvp);
+ long n = tv_get_number(tvp);
if (n >= 0) {
tp = find_tabpage(n);
}
@@ -10530,7 +10437,7 @@ static win_T *find_tabwin(typval_T *wvp, typval_T *tvp)
}
/// "getwinvar()" function
-static void f_getwinvar(typval_T *argvars, typval_T *rettv)
+static void f_getwinvar(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
getwinvar(argvars, rettv, 0);
}
@@ -10538,31 +10445,31 @@ static void f_getwinvar(typval_T *argvars, typval_T *rettv)
/*
* getwinvar() and gettabwinvar()
*/
-static void
-getwinvar (
+static void
+getwinvar(
typval_T *argvars,
typval_T *rettv,
int off /* 1 for gettabwinvar() */
)
{
win_T *win, *oldcurwin;
- char_u *varname;
dictitem_T *v;
tabpage_T *tp = NULL;
tabpage_T *oldtabpage = NULL;
bool done = false;
- if (off == 1)
- tp = find_tabpage((int)get_tv_number_chk(&argvars[0], NULL));
- else
+ if (off == 1) {
+ tp = find_tabpage((int)tv_get_number_chk(&argvars[0], NULL));
+ } else {
tp = curtab;
+ }
win = find_win_by_nr(&argvars[off], tp);
- varname = get_tv_string_chk(&argvars[off + 1]);
- ++emsg_off;
+ const char *varname = tv_get_string_chk(&argvars[off + 1]);
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
+ emsg_off++;
if (win != NULL && varname != NULL) {
// Set curwin to be our win, temporarily. Also set the tabpage,
// otherwise the window is not valid. Only do this when needed,
@@ -10570,16 +10477,26 @@ getwinvar (
bool need_switch_win = tp != curtab || win != curwin;
if (!need_switch_win
|| switch_win(&oldcurwin, &oldtabpage, win, tp, true) == OK) {
- if (*varname == '&') { // window-local-option
- if (get_option_tv(&varname, rettv, 1) == OK) {
+ if (*varname == '&') {
+ if (varname[1] == NUL) {
+ // get all window-local options in a dict
+ dict_T *opts = get_winbuf_options(false);
+
+ if (opts != NULL) {
+ tv_dict_set_ret(rettv, opts);
+ done = true;
+ }
+ } else if (get_option_tv(&varname, rettv, 1) == OK) {
+ // window-local-option
done = true;
}
} else {
// Look up the variable.
// Let getwinvar({nr}, "") return the "w:" dictionary.
- v = find_var_in_ht(&win->w_vars->dv_hashtab, 'w', varname, FALSE);
+ v = find_var_in_ht(&win->w_vars->dv_hashtab, 'w', varname,
+ strlen(varname), false);
if (v != NULL) {
- copy_tv(&v->di_tv, rettv);
+ tv_copy(&v->di_tv, rettv);
done = true;
}
}
@@ -10590,36 +10507,36 @@ getwinvar (
restore_win(oldcurwin, oldtabpage, true);
}
}
+ emsg_off--;
- if (!done && argvars[off + 2].v_type != VAR_UNKNOWN)
- /* use the default return value */
- copy_tv(&argvars[off + 2], rettv);
-
- --emsg_off;
+ if (!done && argvars[off + 2].v_type != VAR_UNKNOWN) {
+ // use the default return value
+ tv_copy(&argvars[off + 2], rettv);
+ }
}
/*
* "glob()" function
*/
-static void f_glob(typval_T *argvars, typval_T *rettv)
+static void f_glob(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
int options = WILD_SILENT|WILD_USE_NL;
expand_T xpc;
- int error = FALSE;
+ bool error = false;
/* When the optional second argument is non-zero, don't remove matches
* for 'wildignore' and don't put matches for 'suffixes' at the end. */
rettv->v_type = VAR_STRING;
if (argvars[1].v_type != VAR_UNKNOWN) {
- if (get_tv_number_chk(&argvars[1], &error))
+ if (tv_get_number_chk(&argvars[1], &error)) {
options |= WILD_KEEP_ALL;
+ }
if (argvars[2].v_type != VAR_UNKNOWN) {
- if (get_tv_number_chk(&argvars[2], &error)) {
- rettv->v_type = VAR_LIST;
- rettv->vval.v_list = NULL;
+ if (tv_get_number_chk(&argvars[2], &error)) {
+ tv_list_set_ret(rettv, NULL);
}
if (argvars[3].v_type != VAR_UNKNOWN
- && get_tv_number_chk(&argvars[3], &error)) {
+ && tv_get_number_chk(&argvars[3], &error)) {
options |= WILD_ALLLINKS;
}
}
@@ -10629,14 +10546,16 @@ static void f_glob(typval_T *argvars, typval_T *rettv)
xpc.xp_context = EXPAND_FILES;
if (p_wic)
options += WILD_ICASE;
- if (rettv->v_type == VAR_STRING)
- rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]),
- NULL, options, WILD_ALL);
- else {
- rettv_list_alloc(rettv);
- ExpandOne(&xpc, get_tv_string(&argvars[0]), NULL, options, WILD_ALL_KEEP);
+ if (rettv->v_type == VAR_STRING) {
+ rettv->vval.v_string = ExpandOne(
+ &xpc, (char_u *)tv_get_string(&argvars[0]), NULL, options, WILD_ALL);
+ } else {
+ ExpandOne(&xpc, (char_u *)tv_get_string(&argvars[0]), NULL, options,
+ WILD_ALL_KEEP);
+ tv_list_alloc_ret(rettv, xpc.xp_numfiles);
for (int i = 0; i < xpc.xp_numfiles; i++) {
- list_append_string(rettv->vval.v_list, xpc.xp_files[i], -1);
+ tv_list_append_string(rettv->vval.v_list, (const char *)xpc.xp_files[i],
+ -1);
}
ExpandCleanup(&xpc);
}
@@ -10645,10 +10564,10 @@ static void f_glob(typval_T *argvars, typval_T *rettv)
}
/// "globpath()" function
-static void f_globpath(typval_T *argvars, typval_T *rettv)
+static void f_globpath(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
int flags = 0; // Flags for globpath.
- int error = false;
+ bool error = false;
// Return a string, or a list if the optional third argument is non-zero.
rettv->v_type = VAR_STRING;
@@ -10656,36 +10575,35 @@ static void f_globpath(typval_T *argvars, typval_T *rettv)
if (argvars[2].v_type != VAR_UNKNOWN) {
// When the optional second argument is non-zero, don't remove matches
// for 'wildignore' and don't put matches for 'suffixes' at the end.
- if (get_tv_number_chk(&argvars[2], &error)) {
+ if (tv_get_number_chk(&argvars[2], &error)) {
flags |= WILD_KEEP_ALL;
}
if (argvars[3].v_type != VAR_UNKNOWN) {
- if (get_tv_number_chk(&argvars[3], &error)) {
- rettv->v_type = VAR_LIST;
- rettv->vval.v_list = NULL;
+ if (tv_get_number_chk(&argvars[3], &error)) {
+ tv_list_set_ret(rettv, NULL);
}
if (argvars[4].v_type != VAR_UNKNOWN
- && get_tv_number_chk(&argvars[4], &error)) {
+ && tv_get_number_chk(&argvars[4], &error)) {
flags |= WILD_ALLLINKS;
}
}
}
- char_u buf1[NUMBUFLEN];
- char_u *file = get_tv_string_buf_chk(&argvars[1], buf1);
+ char buf1[NUMBUFLEN];
+ const char *const file = tv_get_string_buf_chk(&argvars[1], buf1);
if (file != NULL && !error) {
garray_T ga;
ga_init(&ga, (int)sizeof(char_u *), 10);
- globpath(get_tv_string(&argvars[0]), file, &ga, flags);
+ globpath((char_u *)tv_get_string(&argvars[0]), (char_u *)file, &ga, flags);
if (rettv->v_type == VAR_STRING) {
rettv->vval.v_string = ga_concat_strings_sep(&ga, "\n");
} else {
- rettv_list_alloc(rettv);
+ tv_list_alloc_ret(rettv, ga.ga_len);
for (int i = 0; i < ga.ga_len; i++) {
- list_append_string(rettv->vval.v_list,
- ((char_u **)(ga.ga_data))[i], -1);
+ tv_list_append_string(rettv->vval.v_list,
+ ((const char **)(ga.ga_data))[i], -1);
}
}
@@ -10696,26 +10614,21 @@ static void f_globpath(typval_T *argvars, typval_T *rettv)
}
// "glob2regpat()" function
-static void f_glob2regpat(typval_T *argvars, typval_T *rettv)
+static void f_glob2regpat(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *pat = get_tv_string_chk(&argvars[0]); // NULL on type error
+ const char *const pat = tv_get_string_chk(&argvars[0]); // NULL on type error
rettv->v_type = VAR_STRING;
- rettv->vval.v_string = (pat == NULL)
- ? NULL
- : file_pat_to_reg_pat(pat, NULL, NULL, false);
+ rettv->vval.v_string = ((pat == NULL)
+ ? NULL
+ : file_pat_to_reg_pat((char_u *)pat, NULL, NULL,
+ false));
}
-/*
- * "has()" function
- */
-static void f_has(typval_T *argvars, typval_T *rettv)
+/// "has()" function
+static void f_has(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- int i;
- char_u *name;
- int n = FALSE;
- static char *(has_list[]) =
- {
+ static const char *const has_list[] = {
#ifdef UNIX
"unix",
#endif
@@ -10729,6 +10642,7 @@ static void f_has(typval_T *argvars, typval_T *rettv)
#ifdef HAVE_ACL
"acl",
#endif
+ "autochdir",
"arabic",
"autocmd",
"browsefilter",
@@ -10766,6 +10680,7 @@ static void f_has(typval_T *argvars, typval_T *rettv)
"insert_expand",
"jumplist",
"keymap",
+ "lambda",
"langmap",
"libcall",
"linebreak",
@@ -10782,12 +10697,14 @@ static void f_has(typval_T *argvars, typval_T *rettv)
"mouse",
"multi_byte",
"multi_lang",
+ "num64",
"packages",
"path_extra",
"persistent_undo",
"postscript",
"printer",
"profile",
+ "pythonx",
"reltime",
"quickfix",
"rightleft",
@@ -10824,51 +10741,66 @@ static void f_has(typval_T *argvars, typval_T *rettv)
"windows",
"winaltkeys",
"writebackup",
+#if defined(HAVE_WSL)
+ "wsl",
+#endif
"nvim",
- NULL
};
- name = get_tv_string(&argvars[0]);
- for (i = 0; has_list[i] != NULL; ++i)
+ bool n = false;
+ const char *const name = tv_get_string(&argvars[0]);
+ for (size_t i = 0; i < ARRAY_SIZE(has_list); i++) {
if (STRICMP(name, has_list[i]) == 0) {
- n = TRUE;
+ n = true;
break;
}
+ }
- if (n == FALSE) {
+ if (!n) {
if (STRNICMP(name, "patch", 5) == 0) {
if (name[5] == '-'
- && STRLEN(name) > 11
+ && strlen(name) >= 11
&& ascii_isdigit(name[6])
&& ascii_isdigit(name[8])
&& ascii_isdigit(name[10])) {
- int major = atoi((char *)name + 6);
- int minor = atoi((char *)name + 8);
+ int major = atoi(name + 6);
+ int minor = atoi(name + 8);
// Expect "patch-9.9.01234".
n = (major < VIM_VERSION_MAJOR
|| (major == VIM_VERSION_MAJOR
&& (minor < VIM_VERSION_MINOR
|| (minor == VIM_VERSION_MINOR
- && has_patch(atoi((char *)name + 10))))));
+ && has_vim_patch(atoi(name + 10))))));
} else {
- n = has_patch(atoi((char *)name + 5));
+ n = has_vim_patch(atoi(name + 5));
}
+ } else if (STRNICMP(name, "nvim-", 5) == 0) {
+ // Expect "nvim-x.y.z"
+ n = has_nvim_version(name + 5);
} else if (STRICMP(name, "vim_starting") == 0) {
n = (starting != 0);
+ } else if (STRICMP(name, "ttyin") == 0) {
+ n = stdin_isatty;
+ } else if (STRICMP(name, "ttyout") == 0) {
+ n = stdout_isatty;
} else if (STRICMP(name, "multi_byte_encoding") == 0) {
- n = has_mbyte;
+ n = has_mbyte != 0;
#if defined(USE_ICONV) && defined(DYNAMIC_ICONV)
} else if (STRICMP(name, "iconv") == 0) {
n = iconv_enabled(false);
#endif
} else if (STRICMP(name, "syntax_items") == 0) {
n = syntax_present(curwin);
+#ifdef UNIX
+ } else if (STRICMP(name, "unnamedplus") == 0) {
+ n = eval_has_provider("clipboard");
+#endif
}
}
- if (n == FALSE && eval_has_provider((char *)name)) {
- n = TRUE;
+ if (!n && eval_has_provider(name)) {
+ n = true;
}
rettv->vval.v_number = n;
@@ -10877,7 +10809,7 @@ static void f_has(typval_T *argvars, typval_T *rettv)
/*
* "has_key()" function
*/
-static void f_has_key(typval_T *argvars, typval_T *rettv)
+static void f_has_key(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
if (argvars[0].v_type != VAR_DICT) {
EMSG(_(e_dictreq));
@@ -10886,8 +10818,9 @@ static void f_has_key(typval_T *argvars, typval_T *rettv)
if (argvars[0].vval.v_dict == NULL)
return;
- rettv->vval.v_number = dict_find(argvars[0].vval.v_dict,
- get_tv_string(&argvars[1]), -1) != NULL;
+ rettv->vval.v_number = tv_dict_find(argvars[0].vval.v_dict,
+ tv_get_string(&argvars[1]),
+ -1) != NULL;
}
/// `haslocaldir([{win}[, {tab}]])` function
@@ -10901,7 +10834,7 @@ static void f_has_key(typval_T *argvars, typval_T *rettv)
/// @pre An argument may not be -1 if preceding arguments are not all -1.
///
/// @post The return value will be either the number `1` or `0`.
-static void f_haslocaldir(typval_T *argvars, typval_T *rettv)
+static void f_haslocaldir(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
// Possible scope of working directory to return.
CdScope scope = kCdScopeInvalid;
@@ -10951,7 +10884,7 @@ static void f_haslocaldir(typval_T *argvars, typval_T *rettv)
if (scope_number[kCdScopeTab] > 0) {
tp = find_tabpage(scope_number[kCdScopeTab]);
if (!tp) {
- EMSG(_("5000: Cannot find tab number."));
+ EMSG(_("E5000: Cannot find tab number."));
return;
}
}
@@ -10979,7 +10912,7 @@ static void f_haslocaldir(typval_T *argvars, typval_T *rettv)
break;
case kCdScopeTab:
assert(tp);
- rettv->vval.v_number = tp->localdir ? 1 : 0;
+ rettv->vval.v_number = tp->tp_localdir ? 1 : 0;
break;
case kCdScopeGlobal:
// The global scope never has a local directory
@@ -10994,48 +10927,47 @@ static void f_haslocaldir(typval_T *argvars, typval_T *rettv)
/*
* "hasmapto()" function
*/
-static void f_hasmapto(typval_T *argvars, typval_T *rettv)
+static void f_hasmapto(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *name;
- char_u *mode;
- char_u buf[NUMBUFLEN];
- int abbr = FALSE;
-
- name = get_tv_string(&argvars[0]);
- if (argvars[1].v_type == VAR_UNKNOWN)
- mode = (char_u *)"nvo";
- else {
- mode = get_tv_string_buf(&argvars[1], buf);
- if (argvars[2].v_type != VAR_UNKNOWN)
- abbr = get_tv_number(&argvars[2]);
+ const char *mode;
+ const char *const name = tv_get_string(&argvars[0]);
+ bool abbr = false;
+ char buf[NUMBUFLEN];
+ if (argvars[1].v_type == VAR_UNKNOWN) {
+ mode = "nvo";
+ } else {
+ mode = tv_get_string_buf(&argvars[1], buf);
+ if (argvars[2].v_type != VAR_UNKNOWN) {
+ abbr = tv_get_number(&argvars[2]);
+ }
}
- if (map_to_exists(name, mode, abbr))
- rettv->vval.v_number = TRUE;
- else
- rettv->vval.v_number = FALSE;
+ if (map_to_exists(name, mode, abbr)) {
+ rettv->vval.v_number = true;
+ } else {
+ rettv->vval.v_number = false;
+ }
}
/*
* "histadd()" function
*/
-static void f_histadd(typval_T *argvars, typval_T *rettv)
+static void f_histadd(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
HistoryType histype;
- char_u *str;
- char_u buf[NUMBUFLEN];
rettv->vval.v_number = false;
if (check_restricted() || check_secure()) {
return;
}
- str = get_tv_string_chk(&argvars[0]); // NULL on type error
- histype = str != NULL ? get_histtype(str, STRLEN(str), false) : HIST_INVALID;
+ const char *str = tv_get_string_chk(&argvars[0]); // NULL on type error
+ histype = str != NULL ? get_histtype(str, strlen(str), false) : HIST_INVALID;
if (histype != HIST_INVALID) {
- str = get_tv_string_buf(&argvars[1], buf);
+ char buf[NUMBUFLEN];
+ str = tv_get_string_buf(&argvars[1], buf);
if (*str != NUL) {
init_history();
- add_to_history(histype, str, false, NUL);
+ add_to_history(histype, (char_u *)str, false, NUL);
rettv->vval.v_number = true;
return;
}
@@ -11045,26 +10977,24 @@ static void f_histadd(typval_T *argvars, typval_T *rettv)
/*
* "histdel()" function
*/
-static void f_histdel(typval_T *argvars, typval_T *rettv)
+static void f_histdel(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
int n;
- char_u buf[NUMBUFLEN];
- char_u *str;
-
- str = get_tv_string_chk(&argvars[0]); // NULL on type error
+ const char *const str = tv_get_string_chk(&argvars[0]); // NULL on type error
if (str == NULL) {
n = 0;
} else if (argvars[1].v_type == VAR_UNKNOWN) {
// only one argument: clear entire history
- n = clr_history(get_histtype(str, STRLEN(str), false));
+ n = clr_history(get_histtype(str, strlen(str), false));
} else if (argvars[1].v_type == VAR_NUMBER) {
// index given: remove that entry
- n = del_history_idx(get_histtype(str, STRLEN(str), false),
- (int) get_tv_number(&argvars[1]));
+ n = del_history_idx(get_histtype(str, strlen(str), false),
+ (int)tv_get_number(&argvars[1]));
} else {
// string given: remove all matching entries
- n = del_history_entry(get_histtype(str, STRLEN(str), false),
- get_tv_string_buf(&argvars[1], buf));
+ char buf[NUMBUFLEN];
+ n = del_history_entry(get_histtype(str, strlen(str), false),
+ (char_u *)tv_get_string_buf(&argvars[1], buf));
}
rettv->vval.v_number = n;
}
@@ -11072,21 +11002,20 @@ static void f_histdel(typval_T *argvars, typval_T *rettv)
/*
* "histget()" function
*/
-static void f_histget(typval_T *argvars, typval_T *rettv)
+static void f_histget(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
HistoryType type;
int idx;
- char_u *str;
- str = get_tv_string_chk(&argvars[0]); // NULL on type error
+ const char *const str = tv_get_string_chk(&argvars[0]); // NULL on type error
if (str == NULL) {
rettv->vval.v_string = NULL;
} else {
- type = get_histtype(str, STRLEN(str), false);
+ type = get_histtype(str, strlen(str), false);
if (argvars[1].v_type == VAR_UNKNOWN) {
idx = get_history_idx(type);
} else {
- idx = (int)get_tv_number_chk(&argvars[1], NULL);
+ idx = (int)tv_get_number_chk(&argvars[1], NULL);
}
// -1 on type error
rettv->vval.v_string = vim_strsave(get_history_entry(type, idx));
@@ -11097,13 +11026,13 @@ static void f_histget(typval_T *argvars, typval_T *rettv)
/*
* "histnr()" function
*/
-static void f_histnr(typval_T *argvars, typval_T *rettv)
+static void f_histnr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
int i;
- char_u *history = get_tv_string_chk(&argvars[0]);
+ const char *const history = tv_get_string_chk(&argvars[0]);
- i = history == NULL ? HIST_CMD - 1 : get_histtype(history, STRLEN(history),
+ i = history == NULL ? HIST_CMD - 1 : get_histtype(history, strlen(history),
false);
if (i != HIST_INVALID) {
i = get_history_idx(i);
@@ -11116,23 +11045,25 @@ static void f_histnr(typval_T *argvars, typval_T *rettv)
/*
* "highlightID(name)" function
*/
-static void f_hlID(typval_T *argvars, typval_T *rettv)
+static void f_hlID(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- rettv->vval.v_number = syn_name2id(get_tv_string(&argvars[0]));
+ rettv->vval.v_number = syn_name2id(
+ (const char_u *)tv_get_string(&argvars[0]));
}
/*
* "highlight_exists()" function
*/
-static void f_hlexists(typval_T *argvars, typval_T *rettv)
+static void f_hlexists(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- rettv->vval.v_number = highlight_exists(get_tv_string(&argvars[0]));
+ rettv->vval.v_number = highlight_exists(
+ (const char_u *)tv_get_string(&argvars[0]));
}
/*
* "hostname()" function
*/
-static void f_hostname(typval_T *argvars, typval_T *rettv)
+static void f_hostname(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
char hostname[256];
@@ -11144,27 +11075,29 @@ static void f_hostname(typval_T *argvars, typval_T *rettv)
/*
* iconv() function
*/
-static void f_iconv(typval_T *argvars, typval_T *rettv)
+static void f_iconv(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u buf1[NUMBUFLEN];
- char_u buf2[NUMBUFLEN];
- char_u *from, *to, *str;
vimconv_T vimconv;
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
- str = get_tv_string(&argvars[0]);
- from = enc_canonize(enc_skip(get_tv_string_buf(&argvars[1], buf1)));
- to = enc_canonize(enc_skip(get_tv_string_buf(&argvars[2], buf2)));
+ const char *const str = tv_get_string(&argvars[0]);
+ char buf1[NUMBUFLEN];
+ char_u *const from = enc_canonize(enc_skip(
+ (char_u *)tv_get_string_buf(&argvars[1], buf1)));
+ char buf2[NUMBUFLEN];
+ char_u *const to = enc_canonize(enc_skip(
+ (char_u *)tv_get_string_buf(&argvars[2], buf2)));
vimconv.vc_type = CONV_NONE;
convert_setup(&vimconv, from, to);
- /* If the encodings are equal, no conversion needed. */
- if (vimconv.vc_type == CONV_NONE)
- rettv->vval.v_string = vim_strsave(str);
- else
- rettv->vval.v_string = string_convert(&vimconv, str, NULL);
+ // If the encodings are equal, no conversion needed.
+ if (vimconv.vc_type == CONV_NONE) {
+ rettv->vval.v_string = (char_u *)xstrdup(str);
+ } else {
+ rettv->vval.v_string = string_convert(&vimconv, (char_u *)str, NULL);
+ }
convert_setup(&vimconv, NULL, NULL);
xfree(from);
@@ -11174,53 +11107,57 @@ static void f_iconv(typval_T *argvars, typval_T *rettv)
/*
* "indent()" function
*/
-static void f_indent(typval_T *argvars, typval_T *rettv)
+static void f_indent(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- linenr_T lnum;
-
- lnum = get_tv_lnum(argvars);
- if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
+ const linenr_T lnum = tv_get_lnum(argvars);
+ if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) {
rettv->vval.v_number = get_indent_lnum(lnum);
- else
+ } else {
rettv->vval.v_number = -1;
+ }
}
/*
* "index()" function
*/
-static void f_index(typval_T *argvars, typval_T *rettv)
+static void f_index(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- list_T *l;
- listitem_T *item;
long idx = 0;
- int ic = FALSE;
+ bool ic = false;
rettv->vval.v_number = -1;
if (argvars[0].v_type != VAR_LIST) {
EMSG(_(e_listreq));
return;
}
- l = argvars[0].vval.v_list;
+ list_T *const l = argvars[0].vval.v_list;
if (l != NULL) {
- item = l->lv_first;
+ listitem_T *item = tv_list_first(l);
if (argvars[2].v_type != VAR_UNKNOWN) {
- int error = FALSE;
+ bool error = false;
- /* Start at specified item. Use the cached index that list_find()
- * sets, so that a negative number also works. */
- item = list_find(l, get_tv_number_chk(&argvars[2], &error));
- idx = l->lv_idx;
- if (argvars[3].v_type != VAR_UNKNOWN)
- ic = get_tv_number_chk(&argvars[3], &error);
- if (error)
+ // Start at specified item.
+ idx = tv_list_uidx(l, tv_get_number_chk(&argvars[2], &error));
+ if (error || idx == -1) {
item = NULL;
+ } else {
+ item = tv_list_find(l, idx);
+ assert(item != NULL);
+ }
+ if (argvars[3].v_type != VAR_UNKNOWN) {
+ ic = !!tv_get_number_chk(&argvars[3], &error);
+ if (error) {
+ item = NULL;
+ }
+ }
}
- for (; item != NULL; item = item->li_next, ++idx)
- if (tv_equal(&item->li_tv, &argvars[1], ic, FALSE)) {
+ for (; item != NULL; item = TV_LIST_ITEM_NEXT(l, item), idx++) {
+ if (tv_equal(TV_LIST_ITEM_TV(item), &argvars[1], ic, false)) {
rettv->vval.v_number = idx;
break;
}
+ }
}
}
@@ -11233,85 +11170,132 @@ static int inputsecret_flag = 0;
* prompt. The third argument to f_inputdialog() specifies the value to return
* when the user cancels the prompt.
*/
-static void get_user_input(typval_T *argvars, typval_T *rettv, int inputdialog)
+void get_user_input(const typval_T *const argvars,
+ typval_T *const rettv, const bool inputdialog)
+ FUNC_ATTR_NONNULL_ALL
{
- char_u *prompt = get_tv_string_chk(&argvars[0]);
- char_u *p = NULL;
- int c;
- char_u buf[NUMBUFLEN];
- int cmd_silent_save = cmd_silent;
- char_u *defstr = (char_u *)"";
- int xp_type = EXPAND_NOTHING;
- char_u *xp_arg = NULL;
-
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
- cmd_silent = FALSE; /* Want to see the prompt. */
- if (prompt != NULL) {
- /* Only the part of the message after the last NL is considered as
- * prompt for the command line */
- p = vim_strrchr(prompt, '\n');
- if (p == NULL)
- p = prompt;
- else {
- ++p;
- c = *p;
- *p = NUL;
- msg_start();
- msg_clr_eos();
- msg_puts_attr(prompt, echo_attr);
- msg_didout = FALSE;
- msg_starthere();
- *p = c;
+ const char *prompt = "";
+ const char *defstr = "";
+ const char *cancelreturn = NULL;
+ const char *xp_name = NULL;
+ Callback input_callback = { .type = kCallbackNone };
+ char prompt_buf[NUMBUFLEN];
+ char defstr_buf[NUMBUFLEN];
+ char cancelreturn_buf[NUMBUFLEN];
+ char xp_name_buf[NUMBUFLEN];
+ char def[1] = { 0 };
+ if (argvars[0].v_type == VAR_DICT) {
+ if (argvars[1].v_type != VAR_UNKNOWN) {
+ EMSG(_("E5050: {opts} must be the only argument"));
+ return;
+ }
+ dict_T *const dict = argvars[0].vval.v_dict;
+ prompt = tv_dict_get_string_buf_chk(dict, S_LEN("prompt"), prompt_buf, "");
+ if (prompt == NULL) {
+ return;
+ }
+ defstr = tv_dict_get_string_buf_chk(dict, S_LEN("default"), defstr_buf, "");
+ if (defstr == NULL) {
+ return;
+ }
+ cancelreturn = tv_dict_get_string_buf_chk(dict, S_LEN("cancelreturn"),
+ cancelreturn_buf, def);
+ if (cancelreturn == NULL) { // error
+ return;
+ }
+ if (*cancelreturn == NUL) {
+ cancelreturn = NULL;
+ }
+ xp_name = tv_dict_get_string_buf_chk(dict, S_LEN("completion"),
+ xp_name_buf, def);
+ if (xp_name == NULL) { // error
+ return;
+ }
+ if (xp_name == def) { // default to NULL
+ xp_name = NULL;
+ }
+ if (!tv_dict_get_callback(dict, S_LEN("highlight"), &input_callback)) {
+ return;
+ }
+ } else {
+ prompt = tv_get_string_buf_chk(&argvars[0], prompt_buf);
+ if (prompt == NULL) {
+ return;
}
- cmdline_row = msg_row;
-
if (argvars[1].v_type != VAR_UNKNOWN) {
- defstr = get_tv_string_buf_chk(&argvars[1], buf);
- if (defstr != NULL)
- stuffReadbuffSpec(defstr);
-
- if (!inputdialog && argvars[2].v_type != VAR_UNKNOWN) {
- char_u *xp_name;
- int xp_namelen;
- uint32_t argt;
-
- /* input() with a third argument: completion */
- rettv->vval.v_string = NULL;
-
- xp_name = get_tv_string_buf_chk(&argvars[2], buf);
- if (xp_name == NULL)
- return;
-
- xp_namelen = (int)STRLEN(xp_name);
-
- if (parse_compl_arg(xp_name, xp_namelen, &xp_type, &argt,
- &xp_arg) == FAIL)
+ defstr = tv_get_string_buf_chk(&argvars[1], defstr_buf);
+ if (defstr == NULL) {
+ return;
+ }
+ if (argvars[2].v_type != VAR_UNKNOWN) {
+ const char *const arg2 = tv_get_string_buf_chk(&argvars[2],
+ cancelreturn_buf);
+ if (arg2 == NULL) {
return;
+ }
+ if (inputdialog) {
+ cancelreturn = arg2;
+ } else {
+ xp_name = arg2;
+ }
}
}
+ }
- if (defstr != NULL) {
- int save_ex_normal_busy = ex_normal_busy;
- ex_normal_busy = 0;
- rettv->vval.v_string =
- getcmdline_prompt(inputsecret_flag ? NUL : '@', p, echo_attr,
- xp_type, xp_arg);
- ex_normal_busy = save_ex_normal_busy;
+ int xp_type = EXPAND_NOTHING;
+ char *xp_arg = NULL;
+ if (xp_name != NULL) {
+ // input() with a third argument: completion
+ const int xp_namelen = (int)strlen(xp_name);
+
+ uint32_t argt;
+ if (parse_compl_arg((char_u *)xp_name, xp_namelen, &xp_type,
+ &argt, (char_u **)&xp_arg) == FAIL) {
+ return;
}
- if (inputdialog && rettv->vval.v_string == NULL
- && argvars[1].v_type != VAR_UNKNOWN
- && argvars[2].v_type != VAR_UNKNOWN)
- rettv->vval.v_string = vim_strsave(get_tv_string_buf(
- &argvars[2], buf));
+ }
- xfree(xp_arg);
+ const bool cmd_silent_save = cmd_silent;
- /* since the user typed this, no need to wait for return */
- need_wait_return = FALSE;
- msg_didout = FALSE;
+ cmd_silent = false; // Want to see the prompt.
+ // Only the part of the message after the last NL is considered as
+ // prompt for the command line, unlsess cmdline is externalized
+ const char *p = prompt;
+ if (!ui_is_external(kUICmdline)) {
+ const char *lastnl = strrchr(prompt, '\n');
+ if (lastnl != NULL) {
+ p = lastnl+1;
+ msg_start();
+ msg_clr_eos();
+ msg_puts_attr_len(prompt, p - prompt, echo_attr);
+ msg_didout = false;
+ msg_starthere();
+ }
+ }
+ cmdline_row = msg_row;
+
+ stuffReadbuffSpec(defstr);
+
+ const int save_ex_normal_busy = ex_normal_busy;
+ ex_normal_busy = 0;
+ rettv->vval.v_string =
+ (char_u *)getcmdline_prompt(inputsecret_flag ? NUL : '@', p, echo_attr,
+ xp_type, xp_arg, input_callback);
+ ex_normal_busy = save_ex_normal_busy;
+ callback_free(&input_callback);
+
+ if (rettv->vval.v_string == NULL && cancelreturn != NULL) {
+ rettv->vval.v_string = (char_u *)xstrdup(cancelreturn);
}
+
+ xfree(xp_arg);
+
+ // Since the user typed this, no need to wait for return.
+ need_wait_return = false;
+ msg_didout = false;
cmd_silent = cmd_silent_save;
}
@@ -11319,7 +11303,7 @@ static void get_user_input(typval_T *argvars, typval_T *rettv, int inputdialog)
* "input()" function
* Also handles inputsecret() when inputsecret is set.
*/
-static void f_input(typval_T *argvars, typval_T *rettv)
+static void f_input(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
get_user_input(argvars, rettv, FALSE);
}
@@ -11327,7 +11311,7 @@ static void f_input(typval_T *argvars, typval_T *rettv)
/*
* "inputdialog()" function
*/
-static void f_inputdialog(typval_T *argvars, typval_T *rettv)
+static void f_inputdialog(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
get_user_input(argvars, rettv, TRUE);
}
@@ -11335,13 +11319,12 @@ static void f_inputdialog(typval_T *argvars, typval_T *rettv)
/*
* "inputlist()" function
*/
-static void f_inputlist(typval_T *argvars, typval_T *rettv)
+static void f_inputlist(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- listitem_T *li;
int selected;
int mouse_used;
- if (argvars[0].v_type != VAR_LIST || argvars[0].vval.v_list == NULL) {
+ if (argvars[0].v_type != VAR_LIST) {
EMSG2(_(e_listarg), "inputlist()");
return;
}
@@ -11352,15 +11335,16 @@ static void f_inputlist(typval_T *argvars, typval_T *rettv)
msg_scroll = TRUE;
msg_clr_eos();
- for (li = argvars[0].vval.v_list->lv_first; li != NULL; li = li->li_next) {
- msg_puts(get_tv_string(&li->li_tv));
+ TV_LIST_ITER_CONST(argvars[0].vval.v_list, li, {
+ msg_puts(tv_get_string(TV_LIST_ITEM_TV(li)));
msg_putchar('\n');
- }
+ });
- /* Ask for choice. */
+ // Ask for choice.
selected = prompt_for_number(&mouse_used);
- if (mouse_used)
+ if (mouse_used) {
selected -= lines_left;
+ }
rettv->vval.v_number = selected;
}
@@ -11371,7 +11355,7 @@ static garray_T ga_userinput = {0, 0, sizeof(tasave_T), 4, NULL};
/*
* "inputrestore()" function
*/
-static void f_inputrestore(typval_T *argvars, typval_T *rettv)
+static void f_inputrestore(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
if (!GA_EMPTY(&ga_userinput)) {
--ga_userinput.ga_len;
@@ -11387,7 +11371,7 @@ static void f_inputrestore(typval_T *argvars, typval_T *rettv)
/*
* "inputsave()" function
*/
-static void f_inputsave(typval_T *argvars, typval_T *rettv)
+static void f_inputsave(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
// Add an entry to the stack of typeahead storage.
tasave_T *p = GA_APPEND_VIA_PTR(tasave_T, &ga_userinput);
@@ -11397,50 +11381,47 @@ static void f_inputsave(typval_T *argvars, typval_T *rettv)
/*
* "inputsecret()" function
*/
-static void f_inputsecret(typval_T *argvars, typval_T *rettv)
+static void f_inputsecret(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- ++cmdline_star;
- ++inputsecret_flag;
- f_input(argvars, rettv);
- --cmdline_star;
- --inputsecret_flag;
+ cmdline_star++;
+ inputsecret_flag++;
+ f_input(argvars, rettv, NULL);
+ cmdline_star--;
+ inputsecret_flag--;
}
/*
* "insert()" function
*/
-static void f_insert(typval_T *argvars, typval_T *rettv)
+static void f_insert(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- long before = 0;
- listitem_T *item;
- list_T *l;
- int error = FALSE;
+ list_T *l;
+ bool error = false;
if (argvars[0].v_type != VAR_LIST) {
EMSG2(_(e_listarg), "insert()");
- } else if ((l = argvars[0].vval.v_list) != NULL
- && !tv_check_lock(l->lv_lock,
- (char_u *)N_("insert() argument"), true)) {
+ } else if (!tv_check_lock(tv_list_locked((l = argvars[0].vval.v_list)),
+ N_("insert() argument"), TV_TRANSLATE)) {
+ long before = 0;
if (argvars[2].v_type != VAR_UNKNOWN) {
- before = get_tv_number_chk(&argvars[2], &error);
+ before = tv_get_number_chk(&argvars[2], &error);
}
if (error) {
// type error; errmsg already given
return;
}
- if (before == l->lv_len)
- item = NULL;
- else {
- item = list_find(l, before);
+ listitem_T *item = NULL;
+ if (before != tv_list_len(l)) {
+ item = tv_list_find(l, before);
if (item == NULL) {
EMSGN(_(e_listidx), before);
l = NULL;
}
}
if (l != NULL) {
- list_insert_tv(l, &argvars[1], item);
- copy_tv(&argvars[0], rettv);
+ tv_list_insert_tv(l, &argvars[1], item);
+ tv_copy(&argvars[0], rettv);
}
}
}
@@ -11448,60 +11429,58 @@ static void f_insert(typval_T *argvars, typval_T *rettv)
/*
* "invert(expr)" function
*/
-static void f_invert(typval_T *argvars, typval_T *rettv)
+static void f_invert(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- rettv->vval.v_number = ~get_tv_number_chk(&argvars[0], NULL);
+ rettv->vval.v_number = ~tv_get_number_chk(&argvars[0], NULL);
}
/*
* "isdirectory()" function
*/
-static void f_isdirectory(typval_T *argvars, typval_T *rettv)
+static void f_isdirectory(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- rettv->vval.v_number = os_isdir(get_tv_string(&argvars[0]));
+ rettv->vval.v_number = os_isdir((const char_u *)tv_get_string(&argvars[0]));
}
/*
* "islocked()" function
*/
-static void f_islocked(typval_T *argvars, typval_T *rettv)
+static void f_islocked(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
lval_T lv;
- char_u *end;
dictitem_T *di;
rettv->vval.v_number = -1;
- end = get_lval(get_tv_string(&argvars[0]), NULL, &lv, FALSE, FALSE,
- GLV_NO_AUTOLOAD, FNE_CHECK_START);
+ const char_u *const end = get_lval((char_u *)tv_get_string(&argvars[0]),
+ NULL,
+ &lv, false, false,
+ GLV_NO_AUTOLOAD|GLV_READ_ONLY,
+ FNE_CHECK_START);
if (end != NULL && lv.ll_name != NULL) {
- if (*end != NUL)
+ if (*end != NUL) {
EMSG(_(e_trailing));
- else {
+ } else {
if (lv.ll_tv == NULL) {
- if (check_changedtick(lv.ll_name))
- rettv->vval.v_number = 1; /* always locked */
- else {
- di = find_var(lv.ll_name, NULL, TRUE);
- if (di != NULL) {
- /* Consider a variable locked when:
- * 1. the variable itself is locked
- * 2. the value of the variable is locked.
- * 3. the List or Dict value is locked.
- */
- rettv->vval.v_number = ((di->di_flags & DI_FLAGS_LOCK)
- || tv_islocked(&di->di_tv));
- }
+ di = find_var((const char *)lv.ll_name, lv.ll_name_len, NULL, true);
+ if (di != NULL) {
+ // Consider a variable locked when:
+ // 1. the variable itself is locked
+ // 2. the value of the variable is locked.
+ // 3. the List or Dict value is locked.
+ rettv->vval.v_number = ((di->di_flags & DI_FLAGS_LOCK)
+ || tv_islocked(&di->di_tv));
}
- } else if (lv.ll_range)
+ } else if (lv.ll_range) {
EMSG(_("E786: Range not allowed"));
- else if (lv.ll_newkey != NULL)
+ } else if (lv.ll_newkey != NULL) {
EMSG2(_(e_dictkey), lv.ll_newkey);
- else if (lv.ll_list != NULL)
- /* List item. */
- rettv->vval.v_number = tv_islocked(&lv.ll_li->li_tv);
- else
- /* Dictionary item. */
+ } else if (lv.ll_list != NULL) {
+ // List item.
+ rettv->vval.v_number = tv_islocked(TV_LIST_ITEM_TV(lv.ll_li));
+ } else {
+ // Dictionary item.
rettv->vval.v_number = tv_islocked(&lv.ll_di->di_tv);
+ }
}
}
@@ -11509,120 +11488,81 @@ static void f_islocked(typval_T *argvars, typval_T *rettv)
}
-/*
- * Turn a dict into a list:
- * "what" == 0: list of keys
- * "what" == 1: list of values
- * "what" == 2: list of items
- */
-static void dict_list(typval_T *argvars, typval_T *rettv, int what)
-{
- list_T *l2;
- dictitem_T *di;
- hashitem_T *hi;
- listitem_T *li;
- listitem_T *li2;
- dict_T *d;
- int todo;
-
- if (argvars[0].v_type != VAR_DICT) {
+/// Turn a dictionary into a list
+///
+/// @param[in] tv Dictionary to convert. Is checked for actually being
+/// a dictionary, will give an error if not.
+/// @param[out] rettv Location where result will be saved.
+/// @param[in] what What to save in rettv.
+static void dict_list(typval_T *const tv, typval_T *const rettv,
+ const DictListType what)
+{
+ if (tv->v_type != VAR_DICT) {
EMSG(_(e_dictreq));
return;
}
- if ((d = argvars[0].vval.v_dict) == NULL)
+ if (tv->vval.v_dict == NULL) {
return;
+ }
- rettv_list_alloc(rettv);
+ tv_list_alloc_ret(rettv, tv_dict_len(tv->vval.v_dict));
- todo = (int)d->dv_hashtab.ht_used;
- for (hi = d->dv_hashtab.ht_array; todo > 0; ++hi) {
- if (!HASHITEM_EMPTY(hi)) {
- --todo;
- di = HI2DI(hi);
-
- li = listitem_alloc();
- list_append(rettv->vval.v_list, li);
-
- if (what == 0) {
- /* keys() */
- li->li_tv.v_type = VAR_STRING;
- li->li_tv.v_lock = 0;
- li->li_tv.vval.v_string = vim_strsave(di->di_key);
- } else if (what == 1) {
- /* values() */
- copy_tv(&di->di_tv, &li->li_tv);
- } else {
- /* items() */
- l2 = list_alloc();
- li->li_tv.v_type = VAR_LIST;
- li->li_tv.v_lock = 0;
- li->li_tv.vval.v_list = l2;
- ++l2->lv_refcount;
+ TV_DICT_ITER(tv->vval.v_dict, di, {
+ typval_T tv_item = { .v_lock = VAR_UNLOCKED };
- li2 = listitem_alloc();
- list_append(l2, li2);
- li2->li_tv.v_type = VAR_STRING;
- li2->li_tv.v_lock = 0;
- li2->li_tv.vval.v_string = vim_strsave(di->di_key);
+ switch (what) {
+ case kDictListKeys: {
+ tv_item.v_type = VAR_STRING;
+ tv_item.vval.v_string = vim_strsave(di->di_key);
+ break;
+ }
+ case kDictListValues: {
+ tv_copy(&di->di_tv, &tv_item);
+ break;
+ }
+ case kDictListItems: {
+ // items()
+ list_T *const sub_l = tv_list_alloc(2);
+ tv_item.v_type = VAR_LIST;
+ tv_item.vval.v_list = sub_l;
+ tv_list_ref(sub_l);
+
+ tv_list_append_owned_tv(sub_l, (typval_T) {
+ .v_type = VAR_STRING,
+ .v_lock = VAR_UNLOCKED,
+ .vval.v_string = (char_u *)xstrdup((const char *)di->di_key),
+ });
- li2 = listitem_alloc();
- list_append(l2, li2);
- copy_tv(&di->di_tv, &li2->li_tv);
+ tv_list_append_tv(sub_l, &di->di_tv);
+
+ break;
}
}
- }
+
+ tv_list_append_owned_tv(rettv->vval.v_list, tv_item);
+ });
+}
+
+/// "id()" function
+static void f_id(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+ FUNC_ATTR_NONNULL_ALL
+{
+ const int len = vim_vsnprintf(NULL, 0, "%p", dummy_ap, argvars);
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = xmalloc(len + 1);
+ vim_vsnprintf((char *)rettv->vval.v_string, len + 1, "%p", dummy_ap, argvars);
}
/*
* "items(dict)" function
*/
-static void f_items(typval_T *argvars, typval_T *rettv)
+static void f_items(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
dict_list(argvars, rettv, 2);
}
-// "jobclose(id[, stream])" function
-static void f_jobclose(typval_T *argvars, typval_T *rettv)
-{
- rettv->v_type = VAR_NUMBER;
- rettv->vval.v_number = 0;
-
- if (check_restricted() || check_secure()) {
- return;
- }
-
- if (argvars[0].v_type != VAR_NUMBER || (argvars[1].v_type != VAR_STRING
- && argvars[1].v_type != VAR_UNKNOWN)) {
- EMSG(_(e_invarg));
- return;
- }
-
- TerminalJobData *data = find_job(argvars[0].vval.v_number);
- if (!data) {
- EMSG(_(e_invjob));
- return;
- }
-
- Process *proc = (Process *)&data->proc;
-
- if (argvars[1].v_type == VAR_STRING) {
- char *stream = (char *)argvars[1].vval.v_string;
- if (!strcmp(stream, "stdin")) {
- process_close_in(proc);
- } else if (!strcmp(stream, "stdout")) {
- process_close_out(proc);
- } else if (!strcmp(stream, "stderr")) {
- process_close_err(proc);
- } else {
- EMSG2(_("Invalid job stream \"%s\""), stream);
- }
- } else {
- process_close_streams(proc);
- }
-}
-
// "jobpid(id)" function
-static void f_jobpid(typval_T *argvars, typval_T *rettv)
+static void f_jobpid(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_NUMBER;
rettv->vval.v_number = 0;
@@ -11636,58 +11576,17 @@ static void f_jobpid(typval_T *argvars, typval_T *rettv)
return;
}
- TerminalJobData *data = find_job(argvars[0].vval.v_number);
+ Channel *data = find_job(argvars[0].vval.v_number, true);
if (!data) {
- EMSG(_(e_invjob));
return;
}
- Process *proc = (Process *)&data->proc;
+ Process *proc = (Process *)&data->stream.proc;
rettv->vval.v_number = proc->pid;
}
-// "jobsend()" function
-static void f_jobsend(typval_T *argvars, typval_T *rettv)
-{
- rettv->v_type = VAR_NUMBER;
- rettv->vval.v_number = 0;
-
- if (check_restricted() || check_secure()) {
- return;
- }
-
- if (argvars[0].v_type != VAR_NUMBER || argvars[1].v_type == VAR_UNKNOWN) {
- // First argument is the job id and second is the string or list to write
- // to the job's stdin
- EMSG(_(e_invarg));
- return;
- }
-
- TerminalJobData *data = find_job(argvars[0].vval.v_number);
- if (!data) {
- EMSG(_(e_invjob));
- return;
- }
-
- if (((Process *)&data->proc)->in->closed) {
- EMSG(_("Can't send data to the job: stdin is closed"));
- return;
- }
-
- ssize_t input_len;
- char *input = (char *) save_tv_as_string(&argvars[1], &input_len, false);
- if (!input) {
- // Either the error has been handled by save_tv_as_string(), or there is no
- // input to send.
- return;
- }
-
- WBuffer *buf = wstream_new_buffer(input, input_len, 1, xfree);
- rettv->vval.v_number = wstream_write(data->proc.uv.process.in, buf);
-}
-
// "jobresize(job, width, height)" function
-static void f_jobresize(typval_T *argvars, typval_T *rettv)
+static void f_jobresize(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_NUMBER;
rettv->vval.v_number = 0;
@@ -11704,26 +11603,25 @@ static void f_jobresize(typval_T *argvars, typval_T *rettv)
}
- TerminalJobData *data = find_job(argvars[0].vval.v_number);
+ Channel *data = find_job(argvars[0].vval.v_number, true);
if (!data) {
- EMSG(_(e_invjob));
return;
}
- if (data->proc.uv.process.type != kProcessTypePty) {
- EMSG(_(e_jobnotpty));
+ if (data->stream.proc.type != kProcessTypePty) {
+ EMSG(_(e_channotpty));
return;
}
- pty_process_resize(&data->proc.pty, argvars[1].vval.v_number,
- argvars[2].vval.v_number);
+ pty_process_resize(&data->stream.pty, argvars[1].vval.v_number,
+ argvars[2].vval.v_number);
rettv->vval.v_number = 1;
}
-static char **tv_to_argv(typval_T *cmd_tv, char **cmd)
+static char **tv_to_argv(typval_T *cmd_tv, const char **cmd, bool *executable)
{
if (cmd_tv->v_type == VAR_STRING) {
- char *cmd_str = (char *)get_tv_string(cmd_tv);
+ const char *cmd_str = tv_get_string(cmd_tv);
if (cmd) {
*cmd = cmd_str;
}
@@ -11736,45 +11634,42 @@ static char **tv_to_argv(typval_T *cmd_tv, char **cmd)
}
list_T *argl = cmd_tv->vval.v_list;
- int argc = argl->lv_len;
+ int argc = tv_list_len(argl);
if (!argc) {
- EMSG(_("Argument vector must have at least one item"));
+ EMSG(_(e_invarg)); // List must have at least one item.
return NULL;
}
- assert(argl->lv_first);
-
- const char_u *exe = get_tv_string_chk(&argl->lv_first->li_tv);
- if (!exe || !os_can_exe(exe, NULL, true)) {
- // String is not executable
- if (exe) {
- EMSG2(e_jobexe, exe);
+ const char *exe = tv_get_string_chk(TV_LIST_ITEM_TV(tv_list_first(argl)));
+ if (!exe || !os_can_exe((const char_u *)exe, NULL, true)) {
+ if (exe && executable) {
+ *executable = false;
}
return NULL;
}
if (cmd) {
- *cmd = (char *)exe;
+ *cmd = exe;
}
-
+
// Build the argument vector
int i = 0;
char **argv = xcalloc(argc + 1, sizeof(char *));
- for (listitem_T *arg = argl->lv_first; arg != NULL; arg = arg->li_next) {
- char *a = (char *)get_tv_string_chk(&arg->li_tv);
+ TV_LIST_ITER_CONST(argl, arg, {
+ const char *a = tv_get_string_chk(TV_LIST_ITEM_TV(arg));
if (!a) {
- // Did emsg in get_tv_string; just deallocate argv.
+ // Did emsg in tv_get_string_chk; just deallocate argv.
shell_free_argv(argv);
return NULL;
}
argv[i++] = xstrdup(a);
- }
+ });
return argv;
}
// "jobstart()" function
-static void f_jobstart(typval_T *argvars, typval_T *rettv)
+static void f_jobstart(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_NUMBER;
rettv->vval.v_number = 0;
@@ -11783,8 +11678,10 @@ static void f_jobstart(typval_T *argvars, typval_T *rettv)
return;
}
- char **argv = tv_to_argv(&argvars[0], NULL);
+ bool executable = true;
+ char **argv = tv_to_argv(&argvars[0], NULL, &executable);
if (!argv) {
+ rettv->vval.v_number = executable ? 0 : -1;
return; // Did error message in tv_to_argv.
}
@@ -11795,17 +11692,32 @@ static void f_jobstart(typval_T *argvars, typval_T *rettv)
return;
}
+
dict_T *job_opts = NULL;
- ufunc_T *on_stdout = NULL, *on_stderr = NULL, *on_exit = NULL;
+ bool detach = false;
+ bool rpc = false;
+ bool pty = false;
+ CallbackReader on_stdout = CALLBACK_READER_INIT,
+ on_stderr = CALLBACK_READER_INIT;
+ Callback on_exit = CALLBACK_NONE;
char *cwd = NULL;
if (argvars[1].v_type == VAR_DICT) {
job_opts = argvars[1].vval.v_dict;
- char *new_cwd = (char *)get_dict_string(job_opts, (char_u *)"cwd", false);
+ detach = tv_dict_get_number(job_opts, "detach") != 0;
+ rpc = tv_dict_get_number(job_opts, "rpc") != 0;
+ pty = tv_dict_get_number(job_opts, "pty") != 0;
+ if (pty && rpc) {
+ EMSG2(_(e_invarg2), "job cannot have both 'pty' and 'rpc' options set");
+ shell_free_argv(argv);
+ return;
+ }
+
+ char *new_cwd = tv_dict_get_string(job_opts, "cwd", false);
if (new_cwd && strlen(new_cwd) > 0) {
cwd = new_cwd;
// The new cwd must be a directory.
- if (!os_isdir((char_u *)cwd)) {
+ if (!os_isdir_executable((const char *)cwd)) {
EMSG2(_(e_invarg2), "expected valid directory");
shell_free_argv(argv);
return;
@@ -11818,38 +11730,25 @@ static void f_jobstart(typval_T *argvars, typval_T *rettv)
}
}
- bool pty = job_opts && get_dict_number(job_opts, (uint8_t *)"pty") != 0;
- bool detach = job_opts && get_dict_number(job_opts, (uint8_t *)"detach") != 0;
- TerminalJobData *data = common_job_init(argv, on_stdout, on_stderr, on_exit,
- job_opts, pty, detach, cwd);
- Process *proc = (Process *)&data->proc;
+ uint16_t width = 0, height = 0;
+ char *term_name = NULL;
if (pty) {
- uint16_t width = get_dict_number(job_opts, (uint8_t *)"width");
- if (width > 0) {
- data->proc.pty.width = width;
- }
- uint16_t height = get_dict_number(job_opts, (uint8_t *)"height");
- if (height > 0) {
- data->proc.pty.height = height;
- }
- char *term = (char *)get_dict_string(job_opts, (uint8_t *)"TERM", true);
- if (term) {
- data->proc.pty.term_name = term;
- }
+ width = (uint16_t)tv_dict_get_number(job_opts, "width");
+ height = (uint16_t)tv_dict_get_number(job_opts, "height");
+ term_name = tv_dict_get_string(job_opts, "TERM", true);
}
- if (!on_stdout) {
- proc->out = NULL;
+ Channel *chan = channel_job_start(argv, on_stdout, on_stderr, on_exit, pty,
+ rpc, detach, cwd, width, height, term_name,
+ &rettv->vval.v_number);
+ if (chan) {
+ channel_create_event(chan, NULL);
}
- if (!on_stderr) {
- proc->err = NULL;
- }
- common_job_start(data, rettv);
}
// "jobstop()" function
-static void f_jobstop(typval_T *argvars, typval_T *rettv)
+static void f_jobstop(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_NUMBER;
rettv->vval.v_number = 0;
@@ -11865,19 +11764,17 @@ static void f_jobstop(typval_T *argvars, typval_T *rettv)
}
- TerminalJobData *data = find_job(argvars[0].vval.v_number);
+ Channel *data = find_job(argvars[0].vval.v_number, true);
if (!data) {
- EMSG(_(e_invjob));
return;
}
- process_stop((Process *)&data->proc);
- data->stopped = true;
+ process_stop((Process *)&data->stream.proc);
rettv->vval.v_number = 1;
}
// "jobwait(ids[, timeout])" function
-static void f_jobwait(typval_T *argvars, typval_T *rettv)
+static void f_jobwait(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_NUMBER;
rettv->vval.v_number = 0;
@@ -11892,30 +11789,34 @@ static void f_jobwait(typval_T *argvars, typval_T *rettv)
return;
}
+
list_T *args = argvars[0].vval.v_list;
- list_T *rv = list_alloc();
+ Channel **jobs = xcalloc(tv_list_len(args), sizeof(*jobs));
ui_busy_start();
- Queue *waiting_jobs = queue_new_parent(loop_on_put, &main_loop);
+ MultiQueue *waiting_jobs = multiqueue_new_parent(loop_on_put, &main_loop);
// For each item in the input list append an integer to the output list. -3
// is used to represent an invalid job id, -2 is for a interrupted job and
// -1 for jobs that were skipped or timed out.
- for (listitem_T *arg = args->lv_first; arg != NULL; arg = arg->li_next) {
- TerminalJobData *data = NULL;
- if (arg->li_tv.v_type != VAR_NUMBER
- || !(data = find_job(arg->li_tv.vval.v_number))) {
- list_append_number(rv, -3);
+
+ int i = 0;
+ TV_LIST_ITER_CONST(args, arg, {
+ Channel *chan = NULL;
+ if (TV_LIST_ITEM_TV(arg)->v_type != VAR_NUMBER
+ || !(chan = find_job(TV_LIST_ITEM_TV(arg)->vval.v_number, false))) {
+ jobs[i] = NULL;
} else {
- // append the list item and set the status pointer so we'll collect the
- // status code when the job exits
- list_append_number(rv, -1);
- data->status_ptr = &rv->lv_last->li_tv.vval.v_number;
- // Process any pending events for the job because we'll temporarily
- // replace the parent queue
- queue_process_events(data->events);
- queue_replace_parent(data->events, waiting_jobs);
+ jobs[i] = chan;
+ channel_incref(chan);
+ if (chan->stream.proc.status < 0) {
+ // Process any pending events for the job because we'll temporarily
+ // replace the parent queue
+ multiqueue_process_events(chan->events);
+ multiqueue_replace_parent(chan->events, waiting_jobs);
+ }
}
- }
+ i++;
+ });
int remaining = -1;
uint64_t before = 0;
@@ -11924,24 +11825,21 @@ static void f_jobwait(typval_T *argvars, typval_T *rettv)
before = os_hrtime();
}
- for (listitem_T *arg = args->lv_first; arg != NULL; arg = arg->li_next) {
- TerminalJobData *data = NULL;
+ for (i = 0; i < tv_list_len(args); i++) {
if (remaining == 0) {
// timed out
break;
}
- if (arg->li_tv.v_type != VAR_NUMBER
- || !(data = find_job(arg->li_tv.vval.v_number))) {
+
+ // if the job already exited, but wasn't freed yet
+ if (jobs[i] == NULL || jobs[i]->stream.proc.status >= 0) {
continue;
}
- int status = process_wait((Process *)&data->proc, remaining, waiting_jobs);
+
+ int status = process_wait(&jobs[i]->stream.proc, remaining,
+ waiting_jobs);
if (status < 0) {
// interrupted or timed out, skip remaining jobs.
- if (status == -2) {
- // set the status so the user can distinguish between interrupted and
- // skipped/timeout jobs.
- *data->status_ptr = -2;
- }
break;
}
if (remaining > 0) {
@@ -11954,32 +11852,26 @@ static void f_jobwait(typval_T *argvars, typval_T *rettv)
}
}
- for (listitem_T *arg = args->lv_first; arg != NULL; arg = arg->li_next) {
- TerminalJobData *data = NULL;
- if (arg->li_tv.v_type != VAR_NUMBER
- || !(data = find_job(arg->li_tv.vval.v_number))) {
- continue;
- }
- // remove the status pointer because the list may be freed before the
- // job exits
- data->status_ptr = NULL;
- }
+ list_T *const rv = tv_list_alloc(tv_list_len(args));
// restore the parent queue for any jobs still alive
- for (listitem_T *arg = args->lv_first; arg != NULL; arg = arg->li_next) {
- TerminalJobData *data = NULL;
- if (arg->li_tv.v_type != VAR_NUMBER
- || !(data = pmap_get(uint64_t)(jobs, arg->li_tv.vval.v_number))) {
+ for (i = 0; i < tv_list_len(args); i++) {
+ if (jobs[i] == NULL) {
+ tv_list_append_number(rv, -3);
continue;
}
// restore the parent queue for the job
- queue_process_events(data->events);
- queue_replace_parent(data->events, main_loop.events);
+ multiqueue_process_events(jobs[i]->events);
+ multiqueue_replace_parent(jobs[i]->events, main_loop.events);
+
+ tv_list_append_number(rv, jobs[i]->stream.proc.status);
+ channel_decref(jobs[i]);
}
- queue_free(waiting_jobs);
+ multiqueue_free(waiting_jobs);
+ xfree(jobs);
ui_busy_stop();
- rv->lv_refcount++;
+ tv_list_ref(rv);
rettv->v_type = VAR_LIST;
rettv->vval.v_list = rv;
}
@@ -11987,52 +11879,48 @@ static void f_jobwait(typval_T *argvars, typval_T *rettv)
/*
* "join()" function
*/
-static void f_join(typval_T *argvars, typval_T *rettv)
+static void f_join(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- garray_T ga;
- char_u *sep;
-
if (argvars[0].v_type != VAR_LIST) {
EMSG(_(e_listreq));
return;
}
- if (argvars[0].vval.v_list == NULL)
- return;
- if (argvars[1].v_type == VAR_UNKNOWN)
- sep = (char_u *)" ";
- else
- sep = get_tv_string_chk(&argvars[1]);
+ const char *const sep = (argvars[1].v_type == VAR_UNKNOWN
+ ? " "
+ : tv_get_string_chk(&argvars[1]));
rettv->v_type = VAR_STRING;
if (sep != NULL) {
+ garray_T ga;
ga_init(&ga, (int)sizeof(char), 80);
- list_join(&ga, argvars[0].vval.v_list, (char *) sep);
+ tv_list_join(&ga, argvars[0].vval.v_list, sep);
ga_append(&ga, NUL);
rettv->vval.v_string = (char_u *)ga.ga_data;
- } else
+ } else {
rettv->vval.v_string = NULL;
+ }
}
/// json_decode() function
-static void f_json_decode(typval_T *argvars, typval_T *rettv)
+static void f_json_decode(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
char numbuf[NUMBUFLEN];
- char *s = NULL;
+ const char *s = NULL;
char *tofree = NULL;
size_t len;
if (argvars[0].v_type == VAR_LIST) {
- if (!encode_vim_list_to_buf(argvars[0].vval.v_list, &len, &s)) {
+ if (!encode_vim_list_to_buf(argvars[0].vval.v_list, &len, &tofree)) {
EMSG(_("E474: Failed to convert list to string"));
return;
}
- tofree = s;
+ s = tofree;
if (s == NULL) {
assert(len == 0);
s = "";
}
} else {
- s = (char *) get_tv_string_buf_chk(&argvars[0], (char_u *) numbuf);
+ s = tv_get_string_buf_chk(&argvars[0], numbuf);
if (s) {
len = strlen(s);
} else {
@@ -12040,7 +11928,7 @@ static void f_json_decode(typval_T *argvars, typval_T *rettv)
}
}
if (json_decode_string(s, len, rettv) == FAIL) {
- emsgf(_("E474: Failed to parse %.*s"), (int) len, s);
+ emsgf(_("E474: Failed to parse %.*s"), (int)len, s);
rettv->v_type = VAR_NUMBER;
rettv->vval.v_number = 0;
}
@@ -12049,7 +11937,7 @@ static void f_json_decode(typval_T *argvars, typval_T *rettv)
}
/// json_encode() function
-static void f_json_encode(typval_T *argvars, typval_T *rettv)
+static void f_json_encode(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_STRING;
rettv->vval.v_string = (char_u *) encode_tv2json(&argvars[0], NULL);
@@ -12058,7 +11946,7 @@ static void f_json_encode(typval_T *argvars, typval_T *rettv)
/*
* "keys()" function
*/
-static void f_keys(typval_T *argvars, typval_T *rettv)
+static void f_keys(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
dict_list(argvars, rettv, 0);
}
@@ -12066,7 +11954,7 @@ static void f_keys(typval_T *argvars, typval_T *rettv)
/*
* "last_buffer_nr()" function.
*/
-static void f_last_buffer_nr(typval_T *argvars, typval_T *rettv)
+static void f_last_buffer_nr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
int n = 0;
@@ -12082,26 +11970,31 @@ static void f_last_buffer_nr(typval_T *argvars, typval_T *rettv)
/*
* "len()" function
*/
-static void f_len(typval_T *argvars, typval_T *rettv)
+static void f_len(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
switch (argvars[0].v_type) {
- case VAR_STRING:
- case VAR_NUMBER:
- rettv->vval.v_number = (varnumber_T)STRLEN(
- get_tv_string(&argvars[0]));
- break;
- case VAR_LIST:
- rettv->vval.v_number = list_len(argvars[0].vval.v_list);
- break;
- case VAR_DICT:
- rettv->vval.v_number = dict_len(argvars[0].vval.v_dict);
- break;
- case VAR_UNKNOWN:
- case VAR_SPECIAL:
- case VAR_FLOAT:
- case VAR_FUNC:
- EMSG(_("E701: Invalid type for len()"));
- break;
+ case VAR_STRING:
+ case VAR_NUMBER: {
+ rettv->vval.v_number = (varnumber_T)strlen(
+ tv_get_string(&argvars[0]));
+ break;
+ }
+ case VAR_LIST: {
+ rettv->vval.v_number = tv_list_len(argvars[0].vval.v_list);
+ break;
+ }
+ case VAR_DICT: {
+ rettv->vval.v_number = tv_dict_len(argvars[0].vval.v_dict);
+ break;
+ }
+ case VAR_UNKNOWN:
+ case VAR_SPECIAL:
+ case VAR_FLOAT:
+ case VAR_PARTIAL:
+ case VAR_FUNC: {
+ EMSG(_("E701: Invalid type for len()"));
+ break;
+ }
}
}
@@ -12153,7 +12046,7 @@ static void libcall_common(typval_T *argvars, typval_T *rettv, int out_type)
/*
* "libcall()" function
*/
-static void f_libcall(typval_T *argvars, typval_T *rettv)
+static void f_libcall(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
libcall_common(argvars, rettv, VAR_STRING);
}
@@ -12161,7 +12054,7 @@ static void f_libcall(typval_T *argvars, typval_T *rettv)
/*
* "libcallnr()" function
*/
-static void f_libcallnr(typval_T *argvars, typval_T *rettv)
+static void f_libcallnr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
libcall_common(argvars, rettv, VAR_NUMBER);
}
@@ -12169,7 +12062,7 @@ static void f_libcallnr(typval_T *argvars, typval_T *rettv)
/*
* "line(string)" function
*/
-static void f_line(typval_T *argvars, typval_T *rettv)
+static void f_line(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
linenr_T lnum = 0;
pos_T *fp;
@@ -12184,41 +12077,39 @@ static void f_line(typval_T *argvars, typval_T *rettv)
/*
* "line2byte(lnum)" function
*/
-static void f_line2byte(typval_T *argvars, typval_T *rettv)
+static void f_line2byte(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- linenr_T lnum;
-
- lnum = get_tv_lnum(argvars);
- if (lnum < 1 || lnum > curbuf->b_ml.ml_line_count + 1)
+ const linenr_T lnum = tv_get_lnum(argvars);
+ if (lnum < 1 || lnum > curbuf->b_ml.ml_line_count + 1) {
rettv->vval.v_number = -1;
- else
- rettv->vval.v_number = ml_find_line_or_offset(curbuf, lnum, NULL);
- if (rettv->vval.v_number >= 0)
- ++rettv->vval.v_number;
+ } else {
+ rettv->vval.v_number = ml_find_line_or_offset(curbuf, lnum, NULL, false);
+ }
+ if (rettv->vval.v_number >= 0) {
+ rettv->vval.v_number++;
+ }
}
/*
* "lispindent(lnum)" function
*/
-static void f_lispindent(typval_T *argvars, typval_T *rettv)
+static void f_lispindent(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- pos_T pos;
- linenr_T lnum;
-
- pos = curwin->w_cursor;
- lnum = get_tv_lnum(argvars);
+ const pos_T pos = curwin->w_cursor;
+ const linenr_T lnum = tv_get_lnum(argvars);
if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) {
curwin->w_cursor.lnum = lnum;
rettv->vval.v_number = get_lisp_indent();
curwin->w_cursor = pos;
- } else
+ } else {
rettv->vval.v_number = -1;
+ }
}
/*
* "localtime()" function
*/
-static void f_localtime(typval_T *argvars, typval_T *rettv)
+static void f_localtime(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->vval.v_number = (varnumber_T)time(NULL);
}
@@ -12226,94 +12117,127 @@ static void f_localtime(typval_T *argvars, typval_T *rettv)
static void get_maparg(typval_T *argvars, typval_T *rettv, int exact)
{
- char_u *keys;
- char_u *which;
- char_u buf[NUMBUFLEN];
- char_u *keys_buf = NULL;
- char_u *rhs;
+ char_u *keys_buf = NULL;
+ char_u *rhs;
int mode;
int abbr = FALSE;
int get_dict = FALSE;
mapblock_T *mp;
int buffer_local;
- /* return empty string for failure */
+ // Return empty string for failure.
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
- keys = get_tv_string(&argvars[0]);
- if (*keys == NUL)
+ char_u *keys = (char_u *)tv_get_string(&argvars[0]);
+ if (*keys == NUL) {
return;
+ }
+ char buf[NUMBUFLEN];
+ const char *which;
if (argvars[1].v_type != VAR_UNKNOWN) {
- which = get_tv_string_buf_chk(&argvars[1], buf);
+ which = tv_get_string_buf_chk(&argvars[1], buf);
if (argvars[2].v_type != VAR_UNKNOWN) {
- abbr = get_tv_number(&argvars[2]);
- if (argvars[3].v_type != VAR_UNKNOWN)
- get_dict = get_tv_number(&argvars[3]);
+ abbr = tv_get_number(&argvars[2]);
+ if (argvars[3].v_type != VAR_UNKNOWN) {
+ get_dict = tv_get_number(&argvars[3]);
+ }
}
- } else
- which = (char_u *)"";
- if (which == NULL)
+ } else {
+ which = "";
+ }
+ if (which == NULL) {
return;
+ }
- mode = get_map_mode(&which, 0);
+ mode = get_map_mode((char_u **)&which, 0);
- keys = replace_termcodes(keys, STRLEN(keys), &keys_buf, true, true, false,
+ keys = replace_termcodes(keys, STRLEN(keys), &keys_buf, true, true, true,
CPO_TO_CPO_FLAGS);
rhs = check_map(keys, mode, exact, false, abbr, &mp, &buffer_local);
xfree(keys_buf);
if (!get_dict) {
- /* Return a string. */
- if (rhs != NULL)
- rettv->vval.v_string = str2special_save(rhs, FALSE);
+ // Return a string.
+ if (rhs != NULL) {
+ if (*rhs == NUL) {
+ rettv->vval.v_string = vim_strsave((char_u *)"<Nop>");
+ } else {
+ rettv->vval.v_string = (char_u *)str2special_save(
+ (char *)rhs, false, false);
+ }
+ }
} else {
- rettv_dict_alloc(rettv);
+ tv_dict_alloc_ret(rettv);
if (rhs != NULL) {
// Return a dictionary.
- char_u *lhs = str2special_save(mp->m_keys, TRUE);
- char_u *mapmode = map_mode_to_chars(mp->m_mode);
- dict_T *dict = rettv->vval.v_dict;
-
- dict_add_nr_str(dict, "lhs", 0L, lhs);
- dict_add_nr_str(dict, "rhs", 0L, mp->m_orig_str);
- dict_add_nr_str(dict, "noremap", mp->m_noremap ? 1L : 0L, NULL);
- dict_add_nr_str(dict, "expr", mp->m_expr ? 1L : 0L, NULL);
- dict_add_nr_str(dict, "silent", mp->m_silent ? 1L : 0L, NULL);
- dict_add_nr_str(dict, "sid", (long)mp->m_script_ID, NULL);
- dict_add_nr_str(dict, "buffer", (long)buffer_local, NULL);
- dict_add_nr_str(dict, "nowait", mp->m_nowait ? 1L : 0L, NULL);
- dict_add_nr_str(dict, "mode", 0L, mapmode);
-
- xfree(lhs);
- xfree(mapmode);
+ mapblock_fill_dict(rettv->vval.v_dict, mp, buffer_local, true);
}
}
}
-/*
- * "log()" function
- */
-static void f_log(typval_T *argvars, typval_T *rettv)
+/// luaeval() function implementation
+static void f_luaeval(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+ FUNC_ATTR_NONNULL_ALL
{
- float_op_wrapper(argvars, rettv, &log);
+ const char *const str = (const char *)tv_get_string_chk(&argvars[0]);
+ if (str == NULL) {
+ return;
+ }
+
+ executor_eval_lua(cstr_as_string((char *)str), &argvars[1], rettv);
}
-/*
- * "log10()" function
- */
-static void f_log10(typval_T *argvars, typval_T *rettv)
+/// Fill a dictionary with all applicable maparg() like dictionaries
+///
+/// @param dict The dictionary to be filled
+/// @param mp The maphash that contains the mapping information
+/// @param buffer_value The "buffer" value
+/// @param compatible True for compatible with old maparg() dict
+void mapblock_fill_dict(dict_T *const dict,
+ const mapblock_T *const mp,
+ long buffer_value,
+ bool compatible)
+ FUNC_ATTR_NONNULL_ALL
{
- float_op_wrapper(argvars, rettv, &log10);
-}
+ char *const lhs = str2special_save((const char *)mp->m_keys,
+ compatible, !compatible);
+ char *const mapmode = map_mode_to_chars(mp->m_mode);
+ varnumber_T noremap_value;
+ if (compatible) {
+ // Keep old compatible behavior
+ // This is unable to determine whether a mapping is a <script> mapping
+ noremap_value = !!mp->m_noremap;
+ } else {
+ // Distinguish between <script> mapping
+ // If it's not a <script> mapping, check if it's a noremap
+ noremap_value = mp->m_noremap == REMAP_SCRIPT ? 2 : !!mp->m_noremap;
+ }
+
+ if (compatible) {
+ tv_dict_add_str(dict, S_LEN("rhs"), (const char *)mp->m_orig_str);
+ } else {
+ tv_dict_add_allocated_str(dict, S_LEN("rhs"),
+ str2special_save((const char *)mp->m_str, false,
+ true));
+ }
+ tv_dict_add_allocated_str(dict, S_LEN("lhs"), lhs);
+ tv_dict_add_nr(dict, S_LEN("noremap"), noremap_value);
+ tv_dict_add_nr(dict, S_LEN("expr"), mp->m_expr ? 1 : 0);
+ tv_dict_add_nr(dict, S_LEN("silent"), mp->m_silent ? 1 : 0);
+ tv_dict_add_nr(dict, S_LEN("sid"), (varnumber_T)mp->m_script_ID);
+ tv_dict_add_nr(dict, S_LEN("buffer"), (varnumber_T)buffer_value);
+ tv_dict_add_nr(dict, S_LEN("nowait"), mp->m_nowait ? 1 : 0);
+ tv_dict_add_allocated_str(dict, S_LEN("mode"), mapmode);
+}
/*
* "map()" function
*/
-static void f_map(typval_T *argvars, typval_T *rettv)
+static void f_map(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
filter_map(argvars, rettv, TRUE);
}
@@ -12321,7 +12245,7 @@ static void f_map(typval_T *argvars, typval_T *rettv)
/*
* "maparg()" function
*/
-static void f_maparg(typval_T *argvars, typval_T *rettv)
+static void f_maparg(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
get_maparg(argvars, rettv, TRUE);
}
@@ -12329,25 +12253,24 @@ static void f_maparg(typval_T *argvars, typval_T *rettv)
/*
* "mapcheck()" function
*/
-static void f_mapcheck(typval_T *argvars, typval_T *rettv)
+static void f_mapcheck(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
get_maparg(argvars, rettv, FALSE);
}
-static void find_some_match(typval_T *argvars, typval_T *rettv, int type)
+static void find_some_match(typval_T *const argvars, typval_T *const rettv,
+ const SomeMatchType type)
{
char_u *str = NULL;
long len = 0;
char_u *expr = NULL;
- char_u *pat;
regmatch_T regmatch;
- char_u patbuf[NUMBUFLEN];
char_u *save_cpo;
long start = 0;
long nth = 1;
colnr_T startcol = 0;
- int match = 0;
+ bool match = false;
list_T *l = NULL;
listitem_T *li = NULL;
long idx = 0;
@@ -12358,38 +12281,62 @@ static void find_some_match(typval_T *argvars, typval_T *rettv, int type)
p_cpo = (char_u *)"";
rettv->vval.v_number = -1;
- if (type == 3) {
- /* return empty list when there are no matches */
- rettv_list_alloc(rettv);
- } else if (type == 2) {
- rettv->v_type = VAR_STRING;
- rettv->vval.v_string = NULL;
+ switch (type) {
+ // matchlist(): return empty list when there are no matches.
+ case kSomeMatchList: {
+ tv_list_alloc_ret(rettv, kListLenMayKnow);
+ break;
+ }
+ // matchstrpos(): return ["", -1, -1, -1]
+ case kSomeMatchStrPos: {
+ tv_list_alloc_ret(rettv, 4);
+ tv_list_append_string(rettv->vval.v_list, "", 0);
+ tv_list_append_number(rettv->vval.v_list, -1);
+ tv_list_append_number(rettv->vval.v_list, -1);
+ tv_list_append_number(rettv->vval.v_list, -1);
+ break;
+ }
+ case kSomeMatchStr: {
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = NULL;
+ break;
+ }
+ case kSomeMatch:
+ case kSomeMatchEnd: {
+ // Do nothing: zero is default.
+ break;
+ }
}
if (argvars[0].v_type == VAR_LIST) {
- if ((l = argvars[0].vval.v_list) == NULL)
+ if ((l = argvars[0].vval.v_list) == NULL) {
goto theend;
- li = l->lv_first;
+ }
+ li = tv_list_first(l);
} else {
- expr = str = get_tv_string(&argvars[0]);
+ expr = str = (char_u *)tv_get_string(&argvars[0]);
len = (long)STRLEN(str);
}
- pat = get_tv_string_buf_chk(&argvars[1], patbuf);
- if (pat == NULL)
+ char patbuf[NUMBUFLEN];
+ const char *const pat = tv_get_string_buf_chk(&argvars[1], patbuf);
+ if (pat == NULL) {
goto theend;
+ }
if (argvars[2].v_type != VAR_UNKNOWN) {
- int error = FALSE;
+ bool error = false;
- start = get_tv_number_chk(&argvars[2], &error);
- if (error)
+ start = tv_get_number_chk(&argvars[2], &error);
+ if (error) {
goto theend;
+ }
if (l != NULL) {
- li = list_find(l, start);
- if (li == NULL)
+ idx = tv_list_uidx(l, start);
+ if (idx == -1) {
goto theend;
- idx = l->lv_idx; /* use the cached index */
+ }
+ li = tv_list_find(l, idx);
} else {
if (start < 0)
start = 0;
@@ -12406,24 +12353,27 @@ static void find_some_match(typval_T *argvars, typval_T *rettv, int type)
}
}
- if (argvars[3].v_type != VAR_UNKNOWN)
- nth = get_tv_number_chk(&argvars[3], &error);
- if (error)
+ if (argvars[3].v_type != VAR_UNKNOWN) {
+ nth = tv_get_number_chk(&argvars[3], &error);
+ }
+ if (error) {
goto theend;
+ }
}
- regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING);
+ regmatch.regprog = vim_regcomp((char_u *)pat, RE_MAGIC + RE_STRING);
if (regmatch.regprog != NULL) {
regmatch.rm_ic = p_ic;
for (;; ) {
if (l != NULL) {
if (li == NULL) {
- match = FALSE;
+ match = false;
break;
}
xfree(tofree);
- tofree = str = (char_u *) encode_tv2echo(&li->li_tv, NULL);
+ tofree = expr = str = (char_u *)encode_tv2echo(TV_LIST_ITEM_TV(li),
+ NULL);
if (str == NULL) {
break;
}
@@ -12438,55 +12388,92 @@ static void find_some_match(typval_T *argvars, typval_T *rettv, int type)
/* Advance to just after the match. */
if (l != NULL) {
- li = li->li_next;
- ++idx;
+ li = TV_LIST_ITEM_NEXT(l, li);
+ idx++;
} else {
startcol = (colnr_T)(regmatch.startp[0]
+ (*mb_ptr2len)(regmatch.startp[0]) - str);
if (startcol > (colnr_T)len || str + startcol <= regmatch.startp[0]) {
- match = FALSE;
+ match = false;
break;
}
}
}
if (match) {
- if (type == 3) {
- int i;
-
- /* return list with matched string and submatches */
- for (i = 0; i < NSUBEXP; ++i) {
- if (regmatch.endp[i] == NULL) {
- list_append_string(rettv->vval.v_list, (char_u *)"", 0);
+ switch (type) {
+ case kSomeMatchStrPos: {
+ list_T *const ret_l = rettv->vval.v_list;
+ listitem_T *li1 = tv_list_first(ret_l);
+ listitem_T *li2 = TV_LIST_ITEM_NEXT(ret_l, li1);
+ listitem_T *li3 = TV_LIST_ITEM_NEXT(ret_l, li2);
+ listitem_T *li4 = TV_LIST_ITEM_NEXT(ret_l, li3);
+ xfree(TV_LIST_ITEM_TV(li1)->vval.v_string);
+
+ const size_t rd = (size_t)(regmatch.endp[0] - regmatch.startp[0]);
+ TV_LIST_ITEM_TV(li1)->vval.v_string = xmemdupz(
+ (const char *)regmatch.startp[0], rd);
+ TV_LIST_ITEM_TV(li3)->vval.v_number = (varnumber_T)(
+ regmatch.startp[0] - expr);
+ TV_LIST_ITEM_TV(li4)->vval.v_number = (varnumber_T)(
+ regmatch.endp[0] - expr);
+ if (l != NULL) {
+ TV_LIST_ITEM_TV(li2)->vval.v_number = (varnumber_T)idx;
+ }
+ break;
+ }
+ case kSomeMatchList: {
+ // Return list with matched string and submatches.
+ for (int i = 0; i < NSUBEXP; i++) {
+ if (regmatch.endp[i] == NULL) {
+ tv_list_append_string(rettv->vval.v_list, NULL, 0);
+ } else {
+ tv_list_append_string(rettv->vval.v_list,
+ (const char *)regmatch.startp[i],
+ (regmatch.endp[i] - regmatch.startp[i]));
+ }
+ }
+ break;
+ }
+ case kSomeMatchStr: {
+ // Return matched string.
+ if (l != NULL) {
+ tv_copy(TV_LIST_ITEM_TV(li), rettv);
} else {
- list_append_string(rettv->vval.v_list,
- regmatch.startp[i],
- (int)(regmatch.endp[i] - regmatch.startp[i]));
+ rettv->vval.v_string = (char_u *)xmemdupz(
+ (const char *)regmatch.startp[0],
+ (size_t)(regmatch.endp[0] - regmatch.startp[0]));
}
+ break;
+ }
+ case kSomeMatch:
+ case kSomeMatchEnd: {
+ if (l != NULL) {
+ rettv->vval.v_number = idx;
+ } else {
+ if (type == kSomeMatch) {
+ rettv->vval.v_number =
+ (varnumber_T)(regmatch.startp[0] - str);
+ } else {
+ rettv->vval.v_number =
+ (varnumber_T)(regmatch.endp[0] - str);
+ }
+ rettv->vval.v_number += (varnumber_T)(str - expr);
+ }
+ break;
}
- } else if (type == 2) {
- /* return matched string */
- if (l != NULL)
- copy_tv(&li->li_tv, rettv);
- else
- rettv->vval.v_string = vim_strnsave(regmatch.startp[0],
- (int)(regmatch.endp[0] - regmatch.startp[0]));
- } else if (l != NULL)
- rettv->vval.v_number = idx;
- else {
- if (type != 0)
- rettv->vval.v_number =
- (varnumber_T)(regmatch.startp[0] - str);
- else
- rettv->vval.v_number =
- (varnumber_T)(regmatch.endp[0] - str);
- rettv->vval.v_number += (varnumber_T)(str - expr);
}
}
vim_regfree(regmatch.regprog);
}
theend:
+ if (type == kSomeMatchStrPos && l == NULL && rettv->vval.v_list != NULL) {
+ // matchstrpos() without a list: drop the second item
+ list_T *const ret_l = rettv->vval.v_list;
+ tv_list_item_remove(ret_l, TV_LIST_ITEM_NEXT(ret_l, tv_list_first(ret_l)));
+ }
+
xfree(tofree);
p_cpo = save_cpo;
}
@@ -12494,50 +12481,52 @@ theend:
/*
* "match()" function
*/
-static void f_match(typval_T *argvars, typval_T *rettv)
+static void f_match(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- find_some_match(argvars, rettv, 1);
+ find_some_match(argvars, rettv, kSomeMatch);
}
/*
* "matchadd()" function
*/
-static void f_matchadd(typval_T *argvars, typval_T *rettv)
+static void f_matchadd(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u buf[NUMBUFLEN];
- char_u *grp = get_tv_string_buf_chk(&argvars[0], buf); /* group */
- char_u *pat = get_tv_string_buf_chk(&argvars[1], buf); /* pattern */
- int prio = 10; /* default priority */
+ char grpbuf[NUMBUFLEN];
+ char patbuf[NUMBUFLEN];
+ const char *const grp = tv_get_string_buf_chk(&argvars[0], grpbuf);
+ const char *const pat = tv_get_string_buf_chk(&argvars[1], patbuf);
+ int prio = 10;
int id = -1;
- int error = false;
- char_u *conceal_char = NULL;
+ bool error = false;
+ const char *conceal_char = NULL;
rettv->vval.v_number = -1;
- if (grp == NULL || pat == NULL)
+ if (grp == NULL || pat == NULL) {
return;
+ }
if (argvars[2].v_type != VAR_UNKNOWN) {
- prio = get_tv_number_chk(&argvars[2], &error);
+ prio = tv_get_number_chk(&argvars[2], &error);
if (argvars[3].v_type != VAR_UNKNOWN) {
- id = get_tv_number_chk(&argvars[3], &error);
+ id = tv_get_number_chk(&argvars[3], &error);
if (argvars[4].v_type != VAR_UNKNOWN) {
if (argvars[4].v_type != VAR_DICT) {
EMSG(_(e_dictreq));
return;
}
- if (dict_find(argvars[4].vval.v_dict,
- (char_u *)"conceal", -1) != NULL) {
- conceal_char = get_dict_string(argvars[4].vval.v_dict,
- (char_u *)"conceal", false);
+ dictitem_T *di;
+ if ((di = tv_dict_find(argvars[4].vval.v_dict, S_LEN("conceal")))
+ != NULL) {
+ conceal_char = tv_get_string(&di->di_tv);
}
}
}
}
- if (error == true) {
+ if (error) {
return;
}
if (id >= 1 && id <= 3) {
- EMSGN("E798: ID is reserved for \":match\": %" PRId64, id);
+ EMSGN(_("E798: ID is reserved for \":match\": %" PRId64), id);
return;
}
@@ -12545,59 +12534,58 @@ static void f_matchadd(typval_T *argvars, typval_T *rettv)
conceal_char);
}
-static void f_matchaddpos(typval_T *argvars, typval_T *rettv) FUNC_ATTR_NONNULL_ALL
+static void f_matchaddpos(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- rettv->vval.v_number = -1;
-
- char_u buf[NUMBUFLEN];
- char_u *group;
- group = get_tv_string_buf_chk(&argvars[0], buf);
- if (group == NULL) {
- return;
- }
+ rettv->vval.v_number = -1;
- if (argvars[1].v_type != VAR_LIST) {
- EMSG2(_(e_listarg), "matchaddpos()");
- return;
- }
+ char buf[NUMBUFLEN];
+ const char *const group = tv_get_string_buf_chk(&argvars[0], buf);
+ if (group == NULL) {
+ return;
+ }
- list_T *l;
- l = argvars[1].vval.v_list;
- if (l == NULL) {
- return;
- }
+ if (argvars[1].v_type != VAR_LIST) {
+ EMSG2(_(e_listarg), "matchaddpos()");
+ return;
+ }
- int error = false;
- int prio = 10;
- int id = -1;
- char_u *conceal_char = NULL;
+ list_T *l;
+ l = argvars[1].vval.v_list;
+ if (l == NULL) {
+ return;
+ }
- if (argvars[2].v_type != VAR_UNKNOWN) {
- prio = get_tv_number_chk(&argvars[2], &error);
- if (argvars[3].v_type != VAR_UNKNOWN) {
- id = get_tv_number_chk(&argvars[3], &error);
- if (argvars[4].v_type != VAR_UNKNOWN) {
- if (argvars[4].v_type != VAR_DICT) {
- EMSG(_(e_dictreq));
- return;
- }
- if (dict_find(argvars[4].vval.v_dict,
- (char_u *)"conceal", -1) != NULL) {
- conceal_char = get_dict_string(argvars[4].vval.v_dict,
- (char_u *)"conceal", false);
- }
+ bool error = false;
+ int prio = 10;
+ int id = -1;
+ const char *conceal_char = NULL;
+
+ if (argvars[2].v_type != VAR_UNKNOWN) {
+ prio = tv_get_number_chk(&argvars[2], &error);
+ if (argvars[3].v_type != VAR_UNKNOWN) {
+ id = tv_get_number_chk(&argvars[3], &error);
+ if (argvars[4].v_type != VAR_UNKNOWN) {
+ if (argvars[4].v_type != VAR_DICT) {
+ EMSG(_(e_dictreq));
+ return;
+ }
+ dictitem_T *di;
+ if ((di = tv_dict_find(argvars[4].vval.v_dict, S_LEN("conceal")))
+ != NULL) {
+ conceal_char = tv_get_string(&di->di_tv);
}
}
}
- if (error == true) {
- return;
- }
+ }
+ if (error == true) {
+ return;
+ }
- // id == 3 is ok because matchaddpos() is supposed to substitute :3match
- if (id == 1 || id == 2) {
- EMSGN("E798: ID is reserved for \"match\": %" PRId64, id);
- return;
- }
+ // id == 3 is ok because matchaddpos() is supposed to substitute :3match
+ if (id == 1 || id == 2) {
+ EMSGN(_("E798: ID is reserved for \"match\": %" PRId64), id);
+ return;
+ }
rettv->vval.v_number = match_add(curwin, group, NULL, prio, id, l,
conceal_char);
@@ -12606,21 +12594,24 @@ static void f_matchaddpos(typval_T *argvars, typval_T *rettv) FUNC_ATTR_NONNULL_
/*
* "matcharg()" function
*/
-static void f_matcharg(typval_T *argvars, typval_T *rettv)
+static void f_matcharg(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- rettv_list_alloc(rettv);
+ const int id = tv_get_number(&argvars[0]);
- int id = get_tv_number(&argvars[0]);
+ tv_list_alloc_ret(rettv, (id >= 1 && id <= 3
+ ? 2
+ : 0));
if (id >= 1 && id <= 3) {
- matchitem_T *m;
+ matchitem_T *const m = (matchitem_T *)get_match(curwin, id);
- if ((m = (matchitem_T *)get_match(curwin, id)) != NULL) {
- list_append_string(rettv->vval.v_list, syn_id2name(m->hlg_id), -1);
- list_append_string(rettv->vval.v_list, m->pattern, -1);
+ if (m != NULL) {
+ tv_list_append_string(rettv->vval.v_list,
+ (const char *)syn_id2name(m->hlg_id), -1);
+ tv_list_append_string(rettv->vval.v_list, (const char *)m->pattern, -1);
} else {
- list_append_string(rettv->vval.v_list, NULL, -1);
- list_append_string(rettv->vval.v_list, NULL, -1);
+ tv_list_append_string(rettv->vval.v_list, NULL, 0);
+ tv_list_append_string(rettv->vval.v_list, NULL, 0);
}
}
}
@@ -12628,92 +12619,96 @@ static void f_matcharg(typval_T *argvars, typval_T *rettv)
/*
* "matchdelete()" function
*/
-static void f_matchdelete(typval_T *argvars, typval_T *rettv)
+static void f_matchdelete(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->vval.v_number = match_delete(curwin,
- (int)get_tv_number(&argvars[0]), TRUE);
+ (int)tv_get_number(&argvars[0]), true);
}
/*
* "matchend()" function
*/
-static void f_matchend(typval_T *argvars, typval_T *rettv)
+static void f_matchend(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- find_some_match(argvars, rettv, 0);
+ find_some_match(argvars, rettv, kSomeMatchEnd);
}
/*
* "matchlist()" function
*/
-static void f_matchlist(typval_T *argvars, typval_T *rettv)
+static void f_matchlist(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- find_some_match(argvars, rettv, 3);
+ find_some_match(argvars, rettv, kSomeMatchList);
}
/*
* "matchstr()" function
*/
-static void f_matchstr(typval_T *argvars, typval_T *rettv)
+static void f_matchstr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- find_some_match(argvars, rettv, 2);
+ find_some_match(argvars, rettv, kSomeMatchStr);
}
-
-static void max_min(typval_T *argvars, typval_T *rettv, int domax)
+/// "matchstrpos()" function
+static void f_matchstrpos(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- long n = 0;
- long i;
- int error = FALSE;
+ find_some_match(argvars, rettv, kSomeMatchStrPos);
+}
- if (argvars[0].v_type == VAR_LIST) {
- list_T *l;
- listitem_T *li;
+/// Get maximal/minimal number value in a list or dictionary
+///
+/// @param[in] tv List or dictionary to work with. If it contains something
+/// that is not an integer number (or cannot be coerced to
+/// it) error is given.
+/// @param[out] rettv Location where result will be saved. Only assigns
+/// vval.v_number, type is not touched. Returns zero for
+/// empty lists/dictionaries.
+/// @param[in] domax Determines whether maximal or minimal value is desired.
+static void max_min(const typval_T *const tv, typval_T *const rettv,
+ const bool domax)
+ FUNC_ATTR_NONNULL_ALL
+{
+ bool error = false;
- l = argvars[0].vval.v_list;
- if (l != NULL) {
- li = l->lv_first;
- if (li != NULL) {
- n = get_tv_number_chk(&li->li_tv, &error);
- for (;; ) {
- li = li->li_next;
- if (li == NULL)
- break;
- i = get_tv_number_chk(&li->li_tv, &error);
- if (domax ? i > n : i < n)
- n = i;
- }
- }
+ rettv->vval.v_number = 0;
+ varnumber_T n = (domax ? VARNUMBER_MIN : VARNUMBER_MAX);
+ if (tv->v_type == VAR_LIST) {
+ if (tv_list_len(tv->vval.v_list) == 0) {
+ return;
}
- } else if (argvars[0].v_type == VAR_DICT) {
- dict_T *d;
- int first = TRUE;
- hashitem_T *hi;
- int todo;
-
- d = argvars[0].vval.v_dict;
- if (d != NULL) {
- todo = (int)d->dv_hashtab.ht_used;
- for (hi = d->dv_hashtab.ht_array; todo > 0; ++hi) {
- if (!HASHITEM_EMPTY(hi)) {
- --todo;
- i = get_tv_number_chk(&HI2DI(hi)->di_tv, &error);
- if (first) {
- n = i;
- first = FALSE;
- } else if (domax ? i > n : i < n)
- n = i;
- }
+ TV_LIST_ITER_CONST(tv->vval.v_list, li, {
+ const varnumber_T i = tv_get_number_chk(TV_LIST_ITEM_TV(li), &error);
+ if (error) {
+ return;
+ }
+ if (domax ? i > n : i < n) {
+ n = i;
}
+ });
+ } else if (tv->v_type == VAR_DICT) {
+ if (tv_dict_len(tv->vval.v_dict) == 0) {
+ return;
}
- } else
- EMSG(_(e_listdictarg));
- rettv->vval.v_number = error ? 0 : n;
+ TV_DICT_ITER(tv->vval.v_dict, di, {
+ const varnumber_T i = tv_get_number_chk(&di->di_tv, &error);
+ if (error) {
+ return;
+ }
+ if (domax ? i > n : i < n) {
+ n = i;
+ }
+ });
+ } else {
+ EMSG2(_(e_listdictarg), domax ? "max()" : "min()");
+ return;
+ }
+ rettv->vval.v_number = n;
}
/*
* "max()" function
*/
-static void f_max(typval_T *argvars, typval_T *rettv)
+static void f_max(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
max_min(argvars, rettv, TRUE);
}
@@ -12721,7 +12716,7 @@ static void f_max(typval_T *argvars, typval_T *rettv)
/*
* "min()" function
*/
-static void f_min(typval_T *argvars, typval_T *rettv)
+static void f_min(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
max_min(argvars, rettv, FALSE);
}
@@ -12729,30 +12724,31 @@ static void f_min(typval_T *argvars, typval_T *rettv)
/*
* "mkdir()" function
*/
-static void f_mkdir(typval_T *argvars, typval_T *rettv)
+static void f_mkdir(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *dir;
- char_u buf[NUMBUFLEN];
- int prot = 0755;
+ int prot = 0755; // -V536
rettv->vval.v_number = FAIL;
if (check_restricted() || check_secure())
return;
- dir = get_tv_string_buf(&argvars[0], buf);
- if (*dir == NUL)
+ char buf[NUMBUFLEN];
+ const char *const dir = tv_get_string_buf(&argvars[0], buf);
+ if (*dir == NUL) {
rettv->vval.v_number = FAIL;
- else {
- if (*path_tail(dir) == NUL)
- /* remove trailing slashes */
- *path_tail_with_sep(dir) = NUL;
+ } else {
+ if (*path_tail((char_u *)dir) == NUL) {
+ // Remove trailing slashes.
+ *path_tail_with_sep((char_u *)dir) = NUL;
+ }
if (argvars[1].v_type != VAR_UNKNOWN) {
- if (argvars[2].v_type != VAR_UNKNOWN)
- prot = get_tv_number_chk(&argvars[2], NULL);
- if (prot != -1 && STRCMP(get_tv_string(&argvars[1]), "p") == 0) {
+ if (argvars[2].v_type != VAR_UNKNOWN) {
+ prot = tv_get_number_chk(&argvars[2], NULL);
+ }
+ if (prot != -1 && strcmp(tv_get_string(&argvars[1]), "p") == 0) {
char *failed_dir;
- int ret = os_mkdir_recurse((char *) dir, prot, &failed_dir);
+ int ret = os_mkdir_recurse(dir, prot, &failed_dir);
if (ret != 0) {
EMSG3(_(e_mkdir), failed_dir, os_strerror(ret));
xfree(failed_dir);
@@ -12768,104 +12764,60 @@ static void f_mkdir(typval_T *argvars, typval_T *rettv)
}
}
-/*
- * "mode()" function
- */
-static void f_mode(typval_T *argvars, typval_T *rettv)
+/// "mode()" function
+static void f_mode(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u buf[3];
-
- buf[1] = NUL;
- buf[2] = NUL;
+ char *mode = get_mode();
- if (VIsual_active) {
- if (VIsual_select)
- buf[0] = VIsual_mode + 's' - 'v';
- else
- buf[0] = VIsual_mode;
- } else if (State == HITRETURN || State == ASKMORE || State == SETWSIZE
- || State == CONFIRM) {
- buf[0] = 'r';
- if (State == ASKMORE)
- buf[1] = 'm';
- else if (State == CONFIRM)
- buf[1] = '?';
- } else if (State == EXTERNCMD)
- buf[0] = '!';
- else if (State & INSERT) {
- if (State & VREPLACE_FLAG) {
- buf[0] = 'R';
- buf[1] = 'v';
- } else if (State & REPLACE_FLAG)
- buf[0] = 'R';
- else
- buf[0] = 'i';
- } else if (State & CMDLINE) {
- buf[0] = 'c';
- if (exmode_active)
- buf[1] = 'v';
- } else if (exmode_active) {
- buf[0] = 'c';
- buf[1] = 'e';
- } else if (State & TERM_FOCUS) {
- buf[0] = 't';
- } else {
- buf[0] = 'n';
- if (finish_op)
- buf[1] = 'o';
+ // Clear out the minor mode when the argument is not a non-zero number or
+ // non-empty string.
+ if (!non_zero_arg(&argvars[0])) {
+ mode[1] = NUL;
}
- /* Clear out the minor mode when the argument is not a non-zero number or
- * non-empty string. */
- if (!non_zero_arg(&argvars[0]))
- buf[1] = NUL;
-
- rettv->vval.v_string = vim_strsave(buf);
+ rettv->vval.v_string = (char_u *)mode;
rettv->v_type = VAR_STRING;
}
/// "msgpackdump()" function
-static void f_msgpackdump(typval_T *argvars, typval_T *rettv)
+static void f_msgpackdump(typval_T *argvars, typval_T *rettv, FunPtr fptr)
FUNC_ATTR_NONNULL_ALL
{
if (argvars[0].v_type != VAR_LIST) {
EMSG2(_(e_listarg), "msgpackdump()");
return;
}
- list_T *ret_list = rettv_list_alloc(rettv);
- const list_T *list = argvars[0].vval.v_list;
- if (list == NULL) {
- return;
- }
+ list_T *const ret_list = tv_list_alloc_ret(rettv, kListLenMayKnow);
+ list_T *const list = argvars[0].vval.v_list;
msgpack_packer *lpacker = msgpack_packer_new(ret_list, &encode_list_write);
const char *const msg = _("msgpackdump() argument, index %i");
// Assume that translation will not take more then 4 times more space
char msgbuf[sizeof("msgpackdump() argument, index ") * 4 + NUMBUFLEN];
int idx = 0;
- for (listitem_T *li = list->lv_first; li != NULL; li = li->li_next) {
- vim_snprintf(msgbuf, sizeof(msgbuf), (char *) msg, idx);
+ TV_LIST_ITER(list, li, {
+ vim_snprintf(msgbuf, sizeof(msgbuf), (char *)msg, idx);
idx++;
- if (encode_vim_to_msgpack(lpacker, &li->li_tv, msgbuf) == FAIL) {
+ if (encode_vim_to_msgpack(lpacker, TV_LIST_ITEM_TV(li), msgbuf) == FAIL) {
break;
}
- }
+ });
msgpack_packer_free(lpacker);
}
/// "msgpackparse" function
-static void f_msgpackparse(typval_T *argvars, typval_T *rettv)
+static void f_msgpackparse(typval_T *argvars, typval_T *rettv, FunPtr fptr)
FUNC_ATTR_NONNULL_ALL
{
if (argvars[0].v_type != VAR_LIST) {
EMSG2(_(e_listarg), "msgpackparse()");
return;
}
- list_T *ret_list = rettv_list_alloc(rettv);
- const list_T *list = argvars[0].vval.v_list;
- if (list == NULL || list->lv_first == NULL) {
+ list_T *const ret_list = tv_list_alloc_ret(rettv, kListLenMayKnow);
+ const list_T *const list = argvars[0].vval.v_list;
+ if (tv_list_len(list) == 0) {
return;
}
- if (list->lv_first->li_tv.v_type != VAR_STRING) {
+ if (TV_LIST_ITEM_TV(tv_list_first(list))->v_type != VAR_STRING) {
EMSG2(_(e_invarg2), "List item is not a string");
return;
}
@@ -12905,13 +12857,12 @@ static void f_msgpackparse(typval_T *argvars, typval_T *rettv)
goto f_msgpackparse_exit;
}
if (result == MSGPACK_UNPACK_SUCCESS) {
- listitem_T *li = listitem_alloc();
- li->li_tv.v_type = VAR_UNKNOWN;
- list_append(ret_list, li);
- if (msgpack_to_vim(unpacked.data, &li->li_tv) == FAIL) {
+ typval_T tv = { .v_type = VAR_UNKNOWN };
+ if (msgpack_to_vim(unpacked.data, &tv) == FAIL) {
EMSG2(_(e_invarg2), "Failed to convert msgpack string");
goto f_msgpackparse_exit;
}
+ tv_list_append_owned_tv(ret_list, tv);
}
if (result == MSGPACK_UNPACK_CONTINUE) {
if (rlret == OK) {
@@ -12934,17 +12885,18 @@ f_msgpackparse_exit:
/*
* "nextnonblank()" function
*/
-static void f_nextnonblank(typval_T *argvars, typval_T *rettv)
+static void f_nextnonblank(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
linenr_T lnum;
- for (lnum = get_tv_lnum(argvars);; ++lnum) {
+ for (lnum = tv_get_lnum(argvars);; lnum++) {
if (lnum < 0 || lnum > curbuf->b_ml.ml_line_count) {
lnum = 0;
break;
}
- if (*skipwhite(ml_get(lnum)) != NUL)
+ if (*skipwhite(ml_get(lnum)) != NUL) {
break;
+ }
}
rettv->vval.v_number = lnum;
}
@@ -12952,107 +12904,110 @@ static void f_nextnonblank(typval_T *argvars, typval_T *rettv)
/*
* "nr2char()" function
*/
-static void f_nr2char(typval_T *argvars, typval_T *rettv)
+static void f_nr2char(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u buf[NUMBUFLEN];
-
- if (has_mbyte) {
- int utf8 = 0;
+ if (argvars[1].v_type != VAR_UNKNOWN) {
+ if (!tv_check_num(&argvars[1])) {
+ return;
+ }
+ }
- if (argvars[1].v_type != VAR_UNKNOWN)
- utf8 = get_tv_number_chk(&argvars[1], NULL);
- if (utf8)
- buf[(*utf_char2bytes)((int)get_tv_number(&argvars[0]), buf)] = NUL;
- else
- buf[(*mb_char2bytes)((int)get_tv_number(&argvars[0]), buf)] = NUL;
- } else {
- buf[0] = (char_u)get_tv_number(&argvars[0]);
- buf[1] = NUL;
+ bool error = false;
+ const varnumber_T num = tv_get_number_chk(&argvars[0], &error);
+ if (error) {
+ return;
+ }
+ if (num < 0) {
+ EMSG(_("E5070: Character number must not be less than zero"));
+ return;
}
+ if (num > INT_MAX) {
+ emsgf(_("E5071: Character number must not be greater than INT_MAX (%i)"),
+ INT_MAX);
+ return;
+ }
+
+ char buf[MB_MAXBYTES];
+ const int len = utf_char2bytes((int)num, (char_u *)buf);
+
rettv->v_type = VAR_STRING;
- rettv->vval.v_string = vim_strsave(buf);
+ rettv->vval.v_string = xmemdupz(buf, (size_t)len);
}
/*
* "or(expr, expr)" function
*/
-static void f_or(typval_T *argvars, typval_T *rettv)
+static void f_or(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- rettv->vval.v_number = get_tv_number_chk(&argvars[0], NULL)
- | get_tv_number_chk(&argvars[1], NULL);
+ rettv->vval.v_number = tv_get_number_chk(&argvars[0], NULL)
+ | tv_get_number_chk(&argvars[1], NULL);
}
/*
* "pathshorten()" function
*/
-static void f_pathshorten(typval_T *argvars, typval_T *rettv)
+static void f_pathshorten(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_STRING;
- rettv->vval.v_string = get_tv_string_chk(&argvars[0]);
- if (!rettv->vval.v_string) {
+ const char *const s = tv_get_string_chk(&argvars[0]);
+ if (!s) {
return;
}
- rettv->vval.v_string = shorten_dir(vim_strsave(rettv->vval.v_string));
+ rettv->vval.v_string = shorten_dir((char_u *)xstrdup(s));
}
/*
* "pow()" function
*/
-static void f_pow(typval_T *argvars, typval_T *rettv)
+static void f_pow(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- float_T fx, fy;
+ float_T fx;
+ float_T fy;
rettv->v_type = VAR_FLOAT;
- if (get_float_arg(argvars, &fx) == OK
- && get_float_arg(&argvars[1], &fy) == OK)
+ if (tv_get_float_chk(argvars, &fx) && tv_get_float_chk(&argvars[1], &fy)) {
rettv->vval.v_float = pow(fx, fy);
- else
+ } else {
rettv->vval.v_float = 0.0;
+ }
}
/*
* "prevnonblank()" function
*/
-static void f_prevnonblank(typval_T *argvars, typval_T *rettv)
+static void f_prevnonblank(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- linenr_T lnum;
-
- lnum = get_tv_lnum(argvars);
- if (lnum < 1 || lnum > curbuf->b_ml.ml_line_count)
+ linenr_T lnum = tv_get_lnum(argvars);
+ if (lnum < 1 || lnum > curbuf->b_ml.ml_line_count) {
lnum = 0;
- else
- while (lnum >= 1 && *skipwhite(ml_get(lnum)) == NUL)
- --lnum;
+ } else {
+ while (lnum >= 1 && *skipwhite(ml_get(lnum)) == NUL) {
+ lnum--;
+ }
+ }
rettv->vval.v_number = lnum;
}
-/* This dummy va_list is here because:
- * - passing a NULL pointer doesn't work when va_list isn't a pointer
- * - locally in the function results in a "used before set" warning
- * - using va_start() to initialize it gives "function with fixed args" error */
-static va_list ap;
-
/*
* "printf()" function
*/
-static void f_printf(typval_T *argvars, typval_T *rettv)
+static void f_printf(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
{
- char_u buf[NUMBUFLEN];
int len;
int saved_did_emsg = did_emsg;
- char *fmt;
- /* Get the required length, allocate the buffer and do it for real. */
- did_emsg = FALSE;
- fmt = (char *)get_tv_string_buf(&argvars[0], buf);
- len = vim_vsnprintf(NULL, 0, fmt, ap, argvars + 1);
+ // Get the required length, allocate the buffer and do it for real.
+ did_emsg = false;
+ char buf[NUMBUFLEN];
+ const char *fmt = tv_get_string_buf(&argvars[0], buf);
+ len = vim_vsnprintf(NULL, 0, fmt, dummy_ap, argvars + 1);
if (!did_emsg) {
char *s = xmalloc(len + 1);
rettv->vval.v_string = (char_u *)s;
- (void)vim_vsnprintf(s, len + 1, fmt, ap, argvars + 1);
+ (void)vim_vsnprintf(s, len + 1, fmt, dummy_ap, argvars + 1);
}
did_emsg |= saved_did_emsg;
}
@@ -13061,7 +13016,7 @@ static void f_printf(typval_T *argvars, typval_T *rettv)
/*
* "pumvisible()" function
*/
-static void f_pumvisible(typval_T *argvars, typval_T *rettv)
+static void f_pumvisible(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
if (pum_visible())
rettv->vval.v_number = 1;
@@ -13070,50 +13025,71 @@ static void f_pumvisible(typval_T *argvars, typval_T *rettv)
/*
* "pyeval()" function
*/
-static void f_pyeval(typval_T *argvars, typval_T *rettv)
+static void f_pyeval(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
+ if (p_pyx == 0) {
+ p_pyx = 2;
+ }
+
script_host_eval("python", argvars, rettv);
}
/*
* "py3eval()" function
*/
-static void f_py3eval(typval_T *argvars, typval_T *rettv)
+static void f_py3eval(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
+ if (p_pyx == 0) {
+ p_pyx = 3;
+ }
+
script_host_eval("python3", argvars, rettv);
}
+// "pyxeval()" function
+static void f_pyxeval(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ init_pyxversion();
+ if (p_pyx == 2) {
+ f_pyeval(argvars, rettv, NULL);
+ } else {
+ f_py3eval(argvars, rettv, NULL);
+ }
+}
+
/*
* "range()" function
*/
-static void f_range(typval_T *argvars, typval_T *rettv)
+static void f_range(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- long start;
- long end;
- long stride = 1;
- long i;
- int error = FALSE;
+ varnumber_T start;
+ varnumber_T end;
+ varnumber_T stride = 1;
+ varnumber_T i;
+ bool error = false;
- start = get_tv_number_chk(&argvars[0], &error);
+ start = tv_get_number_chk(&argvars[0], &error);
if (argvars[1].v_type == VAR_UNKNOWN) {
end = start - 1;
start = 0;
} else {
- end = get_tv_number_chk(&argvars[1], &error);
- if (argvars[2].v_type != VAR_UNKNOWN)
- stride = get_tv_number_chk(&argvars[2], &error);
+ end = tv_get_number_chk(&argvars[1], &error);
+ if (argvars[2].v_type != VAR_UNKNOWN) {
+ stride = tv_get_number_chk(&argvars[2], &error);
+ }
}
- if (error)
- return; /* type error; errmsg already given */
- if (stride == 0)
+ if (error) {
+ return; // Type error; errmsg already given.
+ }
+ if (stride == 0) {
EMSG(_("E726: Stride is zero"));
- else if (stride > 0 ? end + 1 < start : end - 1 > start)
+ } else if (stride > 0 ? end + 1 < start : end - 1 > start) {
EMSG(_("E727: Start past end"));
- else {
- rettv_list_alloc(rettv);
+ } else {
+ tv_list_alloc_ret(rettv, (end - start) / stride);
for (i = start; stride > 0 ? i <= end : i >= end; i += stride) {
- list_append_number(rettv->vval.v_list, (varnumber_T)i);
+ tv_list_append_number(rettv->vval.v_list, (varnumber_T)i);
}
}
}
@@ -13121,10 +13097,9 @@ static void f_range(typval_T *argvars, typval_T *rettv)
/*
* "readfile()" function
*/
-static void f_readfile(typval_T *argvars, typval_T *rettv)
+static void f_readfile(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- int binary = FALSE;
- char_u *fname;
+ bool binary = false;
FILE *fd;
char_u buf[(IOSIZE/256)*256]; /* rounded to avoid odd + 1 */
int io_size = sizeof(buf);
@@ -13133,40 +13108,40 @@ static void f_readfile(typval_T *argvars, typval_T *rettv)
long prevlen = 0; /* length of data in prev */
long prevsize = 0; /* size of prev buffer */
long maxline = MAXLNUM;
- long cnt = 0;
- char_u *p; /* position in buf */
- char_u *start; /* start of current line */
if (argvars[1].v_type != VAR_UNKNOWN) {
- if (STRCMP(get_tv_string(&argvars[1]), "b") == 0)
- binary = TRUE;
- if (argvars[2].v_type != VAR_UNKNOWN)
- maxline = get_tv_number(&argvars[2]);
+ if (strcmp(tv_get_string(&argvars[1]), "b") == 0) {
+ binary = true;
+ }
+ if (argvars[2].v_type != VAR_UNKNOWN) {
+ maxline = tv_get_number(&argvars[2]);
+ }
}
- rettv_list_alloc(rettv);
+ list_T *const l = tv_list_alloc_ret(rettv, kListLenUnknown);
- /* Always open the file in binary mode, library functions have a mind of
- * their own about CR-LF conversion. */
- fname = get_tv_string(&argvars[0]);
- if (*fname == NUL || (fd = mch_fopen((char *)fname, READBIN)) == NULL) {
- EMSG2(_(e_notopen), *fname == NUL ? (char_u *)_("<empty>") : fname);
+ // Always open the file in binary mode, library functions have a mind of
+ // their own about CR-LF conversion.
+ const char *const fname = tv_get_string(&argvars[0]);
+ if (*fname == NUL || (fd = mch_fopen(fname, READBIN)) == NULL) {
+ EMSG2(_(e_notopen), *fname == NUL ? _("<empty>") : fname);
return;
}
- while (cnt < maxline || maxline < 0) {
+ while (maxline < 0 || tv_list_len(l) < maxline) {
readlen = (int)fread(buf, 1, io_size, fd);
- /* This for loop processes what was read, but is also entered at end
- * of file so that either:
- * - an incomplete line gets written
- * - a "binary" file gets an empty line at the end if it ends in a
- * newline. */
+ // This for loop processes what was read, but is also entered at end
+ // of file so that either:
+ // - an incomplete line gets written
+ // - a "binary" file gets an empty line at the end if it ends in a
+ // newline.
+ char_u *p; // Position in buf.
+ char_u *start; // Start of current line.
for (p = buf, start = buf;
p < buf + readlen || (readlen <= 0 && (prevlen > 0 || binary));
- ++p) {
+ p++) {
if (*p == '\n' || readlen <= 0) {
- listitem_T *li;
char_u *s = NULL;
size_t len = p - start;
@@ -13193,22 +13168,32 @@ static void f_readfile(typval_T *argvars, typval_T *rettv)
prevlen = prevsize = 0;
}
- li = listitem_alloc();
- li->li_tv.v_type = VAR_STRING;
- li->li_tv.v_lock = 0;
- li->li_tv.vval.v_string = s;
- list_append(rettv->vval.v_list, li);
-
- start = p + 1; /* step over newline */
- if ((++cnt >= maxline && maxline >= 0) || readlen <= 0)
+ tv_list_append_owned_tv(l, (typval_T) {
+ .v_type = VAR_STRING,
+ .v_lock = VAR_UNLOCKED,
+ .vval.v_string = s,
+ });
+
+ start = p + 1; // Step over newline.
+ if (maxline < 0) {
+ if (tv_list_len(l) > -maxline) {
+ assert(tv_list_len(l) == 1 + (-maxline));
+ tv_list_item_remove(l, tv_list_first(l));
+ }
+ } else if (tv_list_len(l) >= maxline) {
+ assert(tv_list_len(l) == maxline);
+ break;
+ }
+ if (readlen <= 0) {
break;
- } else if (*p == NUL)
+ }
+ } else if (*p == NUL) {
*p = '\n';
- /* Check for utf8 "bom"; U+FEFF is encoded as EF BB BF. Do this
- * when finding the BF and check the previous two bytes. */
- else if (*p == 0xbf && enc_utf8 && !binary) {
- /* Find the two bytes before the 0xbf. If p is at buf, or buf
- * + 1, these may be in the "prev" string. */
+ // Check for utf8 "bom"; U+FEFF is encoded as EF BB BF. Do this
+ // when finding the BF and check the previous two bytes.
+ } else if (*p == 0xbf && !binary) {
+ // Find the two bytes before the 0xbf. If p is at buf, or buf + 1,
+ // these may be in the "prev" string.
char_u back1 = p >= buf + 1 ? p[-1]
: prevlen >= 1 ? prev[prevlen - 1] : NUL;
char_u back2 = p >= buf + 2 ? p[-2]
@@ -13227,8 +13212,9 @@ static void f_readfile(typval_T *argvars, typval_T *rettv)
/* have to shuffle buf to close gap */
int adjust_prevlen = 0;
- if (dest < buf) {
- adjust_prevlen = (int)(buf - dest); /* must be 1 or 2 */
+ if (dest < buf) { // -V782
+ adjust_prevlen = (int)(buf - dest); // -V782
+ // adjust_prevlen must be 1 or 2.
dest = buf;
}
if (readlen > p - buf + 1)
@@ -13241,8 +13227,9 @@ static void f_readfile(typval_T *argvars, typval_T *rettv)
}
} /* for */
- if ((cnt >= maxline && maxline >= 0) || readlen <= 0)
+ if ((maxline >= 0 && tv_list_len(l) >= maxline) || readlen <= 0) {
break;
+ }
if (start < p) {
/* There's part of a line in buf, store it in "prev". */
if (p - start + prevlen >= prevsize) {
@@ -13266,16 +13253,6 @@ static void f_readfile(typval_T *argvars, typval_T *rettv)
}
} /* while */
- /*
- * For a negative line count use only the lines at the end of the file,
- * free the rest.
- */
- if (maxline < 0)
- while (cnt > -maxline) {
- listitem_remove(rettv->vval.v_list, rettv->vval.v_list->lv_first);
- --cnt;
- }
-
xfree(prev);
fclose(fd);
}
@@ -13289,15 +13266,13 @@ static void f_readfile(typval_T *argvars, typval_T *rettv)
/// @return OK In case of success, FAIL in case of error
static int list2proftime(typval_T *arg, proftime_T *tm) FUNC_ATTR_NONNULL_ALL
{
- if (arg->v_type != VAR_LIST
- || arg->vval.v_list == NULL
- || arg->vval.v_list->lv_len != 2) {
+ if (arg->v_type != VAR_LIST || tv_list_len(arg->vval.v_list) != 2) {
return FAIL;
}
- int error = false;
- varnumber_T n1 = list_find_nr(arg->vval.v_list, 0L, &error);
- varnumber_T n2 = list_find_nr(arg->vval.v_list, 1L, &error);
+ bool error = false;
+ varnumber_T n1 = tv_list_find_nr(arg->vval.v_list, 0L, &error);
+ varnumber_T n2 = tv_list_find_nr(arg->vval.v_list, 1L, &error);
if (error) {
return FAIL;
}
@@ -13305,7 +13280,7 @@ static int list2proftime(typval_T *arg, proftime_T *tm) FUNC_ATTR_NONNULL_ALL
// in f_reltime() we split up the 64-bit proftime_T into two 32-bit
// values, now we combine them again.
union {
- struct { varnumber_T low, high; } split;
+ struct { int32_t low, high; } split;
proftime_T prof;
} u = { .split.high = n1, .split.low = n2 };
@@ -13320,7 +13295,7 @@ static int list2proftime(typval_T *arg, proftime_T *tm) FUNC_ATTR_NONNULL_ALL
/// one argument it returns the time passed since the argument.
/// With two arguments it returns the time passed between
/// the two arguments.
-static void f_reltime(typval_T *argvars, typval_T *rettv) FUNC_ATTR_NONNULL_ALL
+static void f_reltime(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
proftime_T res;
proftime_T start;
@@ -13346,7 +13321,7 @@ static void f_reltime(typval_T *argvars, typval_T *rettv) FUNC_ATTR_NONNULL_ALL
// (varnumber_T is defined as int). For all our supported platforms, int's
// are at least 32-bits wide. So we'll use two 32-bit values to store it.
union {
- struct { varnumber_T low, high; } split;
+ struct { int32_t low, high; } split;
proftime_T prof;
} u = { .prof = res };
@@ -13356,9 +13331,9 @@ static void f_reltime(typval_T *argvars, typval_T *rettv) FUNC_ATTR_NONNULL_ALL
STATIC_ASSERT(sizeof(u.prof) == sizeof(u) && sizeof(u.split) == sizeof(u),
"type punning will produce incorrect results on this platform");
- rettv_list_alloc(rettv);
- list_append_number(rettv->vval.v_list, u.split.high);
- list_append_number(rettv->vval.v_list, u.split.low);
+ tv_list_alloc_ret(rettv, 2);
+ tv_list_append_number(rettv->vval.v_list, u.split.high);
+ tv_list_append_number(rettv->vval.v_list, u.split.low);
}
/// f_reltimestr - return a string that represents the value of {time}
@@ -13366,7 +13341,7 @@ static void f_reltime(typval_T *argvars, typval_T *rettv) FUNC_ATTR_NONNULL_ALL
/// @return The string representation of the argument, the format is the
/// number of seconds followed by a dot, followed by the number
/// of microseconds.
-static void f_reltimestr(typval_T *argvars, typval_T *rettv)
+static void f_reltimestr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
FUNC_ATTR_NONNULL_ALL
{
proftime_T tm;
@@ -13381,81 +13356,76 @@ static void f_reltimestr(typval_T *argvars, typval_T *rettv)
/*
* "remove()" function
*/
-static void f_remove(typval_T *argvars, typval_T *rettv)
+static void f_remove(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
list_T *l;
listitem_T *item, *item2;
listitem_T *li;
long idx;
long end;
- char_u *key;
dict_T *d;
dictitem_T *di;
- char_u *arg_errmsg = (char_u *)N_("remove() argument");
+ const char *const arg_errmsg = N_("remove() argument");
if (argvars[0].v_type == VAR_DICT) {
if (argvars[2].v_type != VAR_UNKNOWN) {
EMSG2(_(e_toomanyarg), "remove()");
} else if ((d = argvars[0].vval.v_dict) != NULL
- && !tv_check_lock(d->dv_lock, arg_errmsg, true)) {
- key = get_tv_string_chk(&argvars[1]);
+ && !tv_check_lock(d->dv_lock, arg_errmsg, TV_TRANSLATE)) {
+ const char *key = tv_get_string_chk(&argvars[1]);
if (key != NULL) {
- di = dict_find(d, key, -1);
+ di = tv_dict_find(d, key, -1);
if (di == NULL) {
EMSG2(_(e_dictkey), key);
- } else if (!var_check_fixed(di->di_flags, arg_errmsg, true)
- && !var_check_ro(di->di_flags, arg_errmsg, true)) {
+ } else if (!var_check_fixed(di->di_flags, arg_errmsg, TV_TRANSLATE)
+ && !var_check_ro(di->di_flags, arg_errmsg, TV_TRANSLATE)) {
*rettv = di->di_tv;
- init_tv(&di->di_tv);
- dictitem_remove(d, di);
- if (is_watched(d)) {
- dictwatcher_notify(d, (char *)key, NULL, rettv);
+ di->di_tv = TV_INITIAL_VALUE;
+ tv_dict_item_remove(d, di);
+ if (tv_dict_is_watched(d)) {
+ tv_dict_watcher_notify(d, key, NULL, rettv);
}
}
}
}
} else if (argvars[0].v_type != VAR_LIST) {
EMSG2(_(e_listdictarg), "remove()");
- } else if ((l = argvars[0].vval.v_list) != NULL
- && !tv_check_lock(l->lv_lock, arg_errmsg, true)) {
- int error = (int)false;
-
- idx = get_tv_number_chk(&argvars[1], &error);
- if (error)
- ; /* type error: do nothing, errmsg already given */
- else if ((item = list_find(l, idx)) == NULL)
+ } else if (!tv_check_lock(tv_list_locked((l = argvars[0].vval.v_list)),
+ arg_errmsg, TV_TRANSLATE)) {
+ bool error = false;
+
+ idx = tv_get_number_chk(&argvars[1], &error);
+ if (error) {
+ // Type error: do nothing, errmsg already given.
+ } else if ((item = tv_list_find(l, idx)) == NULL) {
EMSGN(_(e_listidx), idx);
- else {
+ } else {
if (argvars[2].v_type == VAR_UNKNOWN) {
// Remove one item, return its value.
- vim_list_remove(l, item, item);
- *rettv = item->li_tv;
+ tv_list_drop_items(l, item, item);
+ *rettv = *TV_LIST_ITEM_TV(item);
xfree(item);
} else {
- /* Remove range of items, return list with values. */
- end = get_tv_number_chk(&argvars[2], &error);
- if (error)
- ; /* type error: do nothing */
- else if ((item2 = list_find(l, end)) == NULL)
+ // Remove range of items, return list with values.
+ end = tv_get_number_chk(&argvars[2], &error);
+ if (error) {
+ // Type error: do nothing.
+ } else if ((item2 = tv_list_find(l, end)) == NULL) {
EMSGN(_(e_listidx), end);
- else {
+ } else {
int cnt = 0;
- for (li = item; li != NULL; li = li->li_next) {
- ++cnt;
- if (li == item2)
+ for (li = item; li != NULL; li = TV_LIST_ITEM_NEXT(l, li)) {
+ cnt++;
+ if (li == item2) {
break;
+ }
}
- if (li == NULL) /* didn't find "item2" after "item" */
+ if (li == NULL) { // Didn't find "item2" after "item".
EMSG(_(e_invrange));
- else {
- vim_list_remove(l, item, item2);
- l = rettv_list_alloc(rettv);
- l->lv_first = item;
- l->lv_last = item2;
- item->li_prev = NULL;
- item2->li_next = NULL;
- l->lv_len = cnt;
+ } else {
+ tv_list_move_items(l, item, item2, tv_list_alloc_ret(rettv, cnt),
+ cnt);
}
}
}
@@ -13466,110 +13436,105 @@ static void f_remove(typval_T *argvars, typval_T *rettv)
/*
* "rename({from}, {to})" function
*/
-static void f_rename(typval_T *argvars, typval_T *rettv)
+static void f_rename(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u buf[NUMBUFLEN];
-
- if (check_restricted() || check_secure())
+ if (check_restricted() || check_secure()) {
rettv->vval.v_number = -1;
- else
- rettv->vval.v_number = vim_rename(get_tv_string(&argvars[0]),
- get_tv_string_buf(&argvars[1], buf));
+ } else {
+ char buf[NUMBUFLEN];
+ rettv->vval.v_number = vim_rename(
+ (const char_u *)tv_get_string(&argvars[0]),
+ (const char_u *)tv_get_string_buf(&argvars[1], buf));
+ }
}
/*
* "repeat()" function
*/
-static void f_repeat(typval_T *argvars, typval_T *rettv)
+static void f_repeat(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *p;
- int n;
-
- n = get_tv_number(&argvars[1]);
+ varnumber_T n = tv_get_number(&argvars[1]);
if (argvars[0].v_type == VAR_LIST) {
- rettv_list_alloc(rettv);
- if (argvars[0].vval.v_list != NULL) {
- while (n-- > 0) {
- list_extend(rettv->vval.v_list, argvars[0].vval.v_list, NULL);
- }
+ tv_list_alloc_ret(rettv, (n > 0) * n * tv_list_len(argvars[0].vval.v_list));
+ while (n-- > 0) {
+ tv_list_extend(rettv->vval.v_list, argvars[0].vval.v_list, NULL);
}
} else {
- p = get_tv_string(&argvars[0]);
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
+ if (n <= 0) {
+ return;
+ }
+
+ const char *const p = tv_get_string(&argvars[0]);
- int slen = (int)STRLEN(p);
- int len = slen * n;
- if (len <= 0)
+ const size_t slen = strlen(p);
+ if (slen == 0) {
+ return;
+ }
+ const size_t len = slen * n;
+ // Detect overflow.
+ if (len / n != slen) {
return;
+ }
- char_u *r = xmallocz(len);
- for (int i = 0; i < n; i++)
- memmove(r + i * slen, p, (size_t)slen);
+ char *const r = xmallocz(len);
+ for (varnumber_T i = 0; i < n; i++) {
+ memmove(r + i * slen, p, slen);
+ }
- rettv->vval.v_string = r;
+ rettv->vval.v_string = (char_u *)r;
}
}
/*
* "resolve()" function
*/
-static void f_resolve(typval_T *argvars, typval_T *rettv)
+static void f_resolve(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *p;
-#ifdef HAVE_READLINK
- char_u *buf = NULL;
-#endif
-
- p = get_tv_string(&argvars[0]);
+ rettv->v_type = VAR_STRING;
+ const char *fname = tv_get_string(&argvars[0]);
#ifdef WIN32
- {
- char_u *v = NULL;
-
- v = mch_resolve_shortcut(p);
- if (v != NULL)
- rettv->vval.v_string = v;
- else
- rettv->vval.v_string = vim_strsave(p);
- }
+ char *const v = os_resolve_shortcut(fname);
+ rettv->vval.v_string = (char_u *)(v == NULL ? xstrdup(fname) : v);
#else
# ifdef HAVE_READLINK
{
- char_u *cpy;
- int len;
- char_u *remain = NULL;
- char_u *q;
- int is_relative_to_current = FALSE;
- int has_trailing_pathsep = FALSE;
+ bool is_relative_to_current = false;
+ bool has_trailing_pathsep = false;
int limit = 100;
- p = vim_strsave(p);
+ char *p = xstrdup(fname);
if (p[0] == '.' && (vim_ispathsep(p[1])
- || (p[1] == '.' && (vim_ispathsep(p[2])))))
- is_relative_to_current = TRUE;
+ || (p[1] == '.' && (vim_ispathsep(p[2]))))) {
+ is_relative_to_current = true;
+ }
- len = STRLEN(p);
- if (len > 0 && after_pathsep((char *)p, (char *)p + len)) {
- has_trailing_pathsep = TRUE;
- p[len - 1] = NUL; /* the trailing slash breaks readlink() */
+ ptrdiff_t len = (ptrdiff_t)strlen(p);
+ if (len > 0 && after_pathsep(p, p + len)) {
+ has_trailing_pathsep = true;
+ p[len - 1] = NUL; // The trailing slash breaks readlink().
}
- q = path_next_component(p);
+ char *q = (char *)path_next_component(p);
+ char *remain = NULL;
if (*q != NUL) {
- /* Separate the first path component in "p", and keep the
- * remainder (beginning with the path separator). */
- remain = vim_strsave(q - 1);
+ // Separate the first path component in "p", and keep the
+ // remainder (beginning with the path separator).
+ remain = xstrdup(q - 1);
q[-1] = NUL;
}
- buf = xmallocz(MAXPATHL);
+ char *const buf = xmallocz(MAXPATHL);
+ char *cpy;
for (;; ) {
for (;; ) {
- len = readlink((char *)p, (char *)buf, MAXPATHL);
- if (len <= 0)
+ len = readlink(p, buf, MAXPATHL);
+ if (len <= 0) {
break;
+ }
buf[len] = NUL;
if (limit-- == 0) {
@@ -13577,66 +13542,72 @@ static void f_resolve(typval_T *argvars, typval_T *rettv)
xfree(remain);
EMSG(_("E655: Too many symbolic links (cycle?)"));
rettv->vval.v_string = NULL;
- goto fail;
+ xfree(buf);
+ return;
}
- /* Ensure that the result will have a trailing path separator
- * if the argument has one. */
- if (remain == NULL && has_trailing_pathsep)
- add_pathsep((char *)buf);
+ // Ensure that the result will have a trailing path separator
+ // if the argument has one. */
+ if (remain == NULL && has_trailing_pathsep) {
+ add_pathsep(buf);
+ }
- /* Separate the first path component in the link value and
- * concatenate the remainders. */
- q = path_next_component(vim_ispathsep(*buf) ? buf + 1 : buf);
+ // Separate the first path component in the link value and
+ // concatenate the remainders. */
+ q = (char *)path_next_component(vim_ispathsep(*buf) ? buf + 1 : buf);
if (*q != NUL) {
cpy = remain;
- remain = remain ?
- concat_str(q - 1, remain) : (char_u *) xstrdup((char *)q - 1);
+ remain = (remain
+ ? (char *)concat_str((char_u *)q - 1, (char_u *)remain)
+ : xstrdup(q - 1));
xfree(cpy);
q[-1] = NUL;
}
- q = path_tail(p);
+ q = (char *)path_tail((char_u *)p);
if (q > p && *q == NUL) {
- /* Ignore trailing path separator. */
+ // Ignore trailing path separator.
q[-1] = NUL;
- q = path_tail(p);
+ q = (char *)path_tail((char_u *)p);
}
- if (q > p && !path_is_absolute_path(buf)) {
- /* symlink is relative to directory of argument */
- cpy = xmalloc(STRLEN(p) + STRLEN(buf) + 1);
- STRCPY(cpy, p);
- STRCPY(path_tail(cpy), buf);
- xfree(p);
- p = cpy;
+ if (q > p && !path_is_absolute((const char_u *)buf)) {
+ // Symlink is relative to directory of argument. Replace the
+ // symlink with the resolved name in the same directory.
+ const size_t p_len = strlen(p);
+ const size_t buf_len = strlen(buf);
+ p = xrealloc(p, p_len + buf_len + 1);
+ memcpy(path_tail((char_u *)p), buf, buf_len + 1);
} else {
xfree(p);
- p = vim_strsave(buf);
+ p = xstrdup(buf);
}
}
- if (remain == NULL)
+ if (remain == NULL) {
break;
+ }
- /* Append the first path component of "remain" to "p". */
- q = path_next_component(remain + 1);
+ // Append the first path component of "remain" to "p".
+ q = (char *)path_next_component(remain + 1);
len = q - remain - (*q != NUL);
- cpy = vim_strnsave(p, STRLEN(p) + len);
- STRNCAT(cpy, remain, len);
+ const size_t p_len = strlen(p);
+ cpy = xmallocz(p_len + len);
+ memcpy(cpy, p, p_len + 1);
+ xstrlcat(cpy + p_len, remain, len + 1);
xfree(p);
p = cpy;
- /* Shorten "remain". */
- if (*q != NUL)
+ // Shorten "remain".
+ if (*q != NUL) {
STRMOVE(remain, q - 1);
- else {
+ } else {
xfree(remain);
remain = NULL;
}
}
- /* If the result is a relative path name, make it explicitly relative to
- * the current directory if and only if the argument had this form. */
+ // If the result is a relative path name, make it explicitly relative to
+ // the current directory if and only if the argument had this form.
if (!vim_ispathsep(*p)) {
if (is_relative_to_current
&& *p != NUL
@@ -13646,69 +13617,54 @@ static void f_resolve(typval_T *argvars, typval_T *rettv)
|| (p[1] == '.'
&& (p[2] == NUL
|| vim_ispathsep(p[2])))))) {
- /* Prepend "./". */
- cpy = concat_str((char_u *)"./", p);
+ // Prepend "./".
+ cpy = (char *)concat_str((const char_u *)"./", (const char_u *)p);
xfree(p);
p = cpy;
} else if (!is_relative_to_current) {
- /* Strip leading "./". */
+ // Strip leading "./".
q = p;
- while (q[0] == '.' && vim_ispathsep(q[1]))
+ while (q[0] == '.' && vim_ispathsep(q[1])) {
q += 2;
- if (q > p)
+ }
+ if (q > p) {
STRMOVE(p, p + 2);
+ }
}
}
- /* Ensure that the result will have no trailing path separator
- * if the argument had none. But keep "/" or "//". */
+ // Ensure that the result will have no trailing path separator
+ // if the argument had none. But keep "/" or "//".
if (!has_trailing_pathsep) {
- q = p + STRLEN(p);
- if (after_pathsep((char *)p, (char *)q))
- *path_tail_with_sep(p) = NUL;
+ q = p + strlen(p);
+ if (after_pathsep(p, q)) {
+ *path_tail_with_sep((char_u *)p) = NUL;
+ }
}
- rettv->vval.v_string = p;
+ rettv->vval.v_string = (char_u *)p;
+ xfree(buf);
}
# else
- rettv->vval.v_string = vim_strsave(p);
+ rettv->vval.v_string = (char_u *)xstrdup(p);
# endif
#endif
simplify_filename(rettv->vval.v_string);
-
-#ifdef HAVE_READLINK
-fail:
- xfree(buf);
-#endif
- rettv->v_type = VAR_STRING;
}
/*
* "reverse({list})" function
*/
-static void f_reverse(typval_T *argvars, typval_T *rettv)
+static void f_reverse(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- list_T *l;
- listitem_T *li, *ni;
-
+ list_T *l;
if (argvars[0].v_type != VAR_LIST) {
EMSG2(_(e_listarg), "reverse()");
- } else if ((l = argvars[0].vval.v_list) != NULL
- && !tv_check_lock(l->lv_lock,
- (char_u *)N_("reverse() argument"), true)) {
- li = l->lv_last;
- l->lv_first = l->lv_last = NULL;
- l->lv_len = 0;
- while (li != NULL) {
- ni = li->li_prev;
- list_append(l, li);
- li = ni;
- }
- rettv->vval.v_list = l;
- rettv->v_type = VAR_LIST;
- ++l->lv_refcount;
- l->lv_idx = l->lv_len - l->lv_idx - 1;
+ } else if (!tv_check_lock(tv_list_locked((l = argvars[0].vval.v_list)),
+ N_("reverse() argument"), TV_TRANSLATE)) {
+ tv_list_reverse(l);
+ tv_list_set_ret(rettv, l);
}
}
@@ -13729,40 +13685,45 @@ static void f_reverse(typval_T *argvars, typval_T *rettv)
static int get_search_arg(typval_T *varp, int *flagsp)
{
int dir = FORWARD;
- char_u *flags;
- char_u nbuf[NUMBUFLEN];
int mask;
if (varp->v_type != VAR_UNKNOWN) {
- flags = get_tv_string_buf_chk(varp, nbuf);
- if (flags == NULL)
- return 0; /* type error; errmsg already given */
+ char nbuf[NUMBUFLEN];
+ const char *flags = tv_get_string_buf_chk(varp, nbuf);
+ if (flags == NULL) {
+ return 0; // Type error; errmsg already given.
+ }
while (*flags != NUL) {
switch (*flags) {
- case 'b': dir = BACKWARD; break;
- case 'w': p_ws = true; break;
- case 'W': p_ws = false; break;
- default: mask = 0;
- if (flagsp != NULL)
- switch (*flags) {
- case 'c': mask = SP_START; break;
- case 'e': mask = SP_END; break;
- case 'm': mask = SP_RETCOUNT; break;
- case 'n': mask = SP_NOMOVE; break;
- case 'p': mask = SP_SUBPAT; break;
- case 'r': mask = SP_REPEAT; break;
- case 's': mask = SP_SETPCMARK; break;
- case 'z': mask = SP_COLUMN; break;
+ case 'b': dir = BACKWARD; break;
+ case 'w': p_ws = true; break;
+ case 'W': p_ws = false; break;
+ default: {
+ mask = 0;
+ if (flagsp != NULL) {
+ switch (*flags) {
+ case 'c': mask = SP_START; break;
+ case 'e': mask = SP_END; break;
+ case 'm': mask = SP_RETCOUNT; break;
+ case 'n': mask = SP_NOMOVE; break;
+ case 'p': mask = SP_SUBPAT; break;
+ case 'r': mask = SP_REPEAT; break;
+ case 's': mask = SP_SETPCMARK; break;
+ case 'z': mask = SP_COLUMN; break;
+ }
}
- if (mask == 0) {
- EMSG2(_(e_invarg2), flags);
- dir = 0;
- } else
- *flagsp |= mask;
+ if (mask == 0) {
+ emsgf(_(e_invarg2), flags);
+ dir = 0;
+ } else {
+ *flagsp |= mask;
+ }
+ }
}
- if (dir == 0)
+ if (dir == 0) {
break;
- ++flags;
+ }
+ flags++;
}
}
return dir;
@@ -13772,7 +13733,6 @@ static int get_search_arg(typval_T *varp, int *flagsp)
static int search_cmn(typval_T *argvars, pos_T *match_pos, int *flagsp)
{
int flags;
- char_u *pat;
pos_T pos;
pos_T save_cursor;
bool save_p_ws = p_ws;
@@ -13784,10 +13744,11 @@ static int search_cmn(typval_T *argvars, pos_T *match_pos, int *flagsp)
int options = SEARCH_KEEP;
int subpatnum;
- pat = get_tv_string(&argvars[0]);
- dir = get_search_arg(&argvars[1], flagsp); /* may set p_ws */
- if (dir == 0)
+ const char *const pat = tv_get_string(&argvars[0]);
+ dir = get_search_arg(&argvars[1], flagsp); // May set p_ws.
+ if (dir == 0) {
goto theend;
+ }
flags = *flagsp;
if (flags & SP_START) {
options |= SEARCH_START;
@@ -13801,13 +13762,15 @@ static int search_cmn(typval_T *argvars, pos_T *match_pos, int *flagsp)
/* Optional arguments: line number to stop searching and timeout. */
if (argvars[1].v_type != VAR_UNKNOWN && argvars[2].v_type != VAR_UNKNOWN) {
- lnum_stop = get_tv_number_chk(&argvars[2], NULL);
- if (lnum_stop < 0)
+ lnum_stop = tv_get_number_chk(&argvars[2], NULL);
+ if (lnum_stop < 0) {
goto theend;
+ }
if (argvars[3].v_type != VAR_UNKNOWN) {
- time_limit = get_tv_number_chk(&argvars[3], NULL);
- if (time_limit < 0)
+ time_limit = tv_get_number_chk(&argvars[3], NULL);
+ if (time_limit < 0) {
goto theend;
+ }
}
}
@@ -13822,13 +13785,13 @@ static int search_cmn(typval_T *argvars, pos_T *match_pos, int *flagsp)
*/
if (((flags & (SP_REPEAT | SP_RETCOUNT)) != 0)
|| ((flags & SP_NOMOVE) && (flags & SP_SETPCMARK))) {
- EMSG2(_(e_invarg2), get_tv_string(&argvars[1]));
+ EMSG2(_(e_invarg2), tv_get_string(&argvars[1]));
goto theend;
}
pos = save_cursor = curwin->w_cursor;
- subpatnum = searchit(curwin, curbuf, &pos, dir, pat, 1L,
- options, RE_SEARCH, (linenr_T)lnum_stop, &tm);
+ subpatnum = searchit(curwin, curbuf, &pos, dir, (char_u *)pat, 1,
+ options, RE_SEARCH, (linenr_T)lnum_stop, &tm);
if (subpatnum != FAIL) {
if (flags & SP_SUBPAT)
retval = subpatnum;
@@ -13858,16 +13821,8 @@ theend:
return retval;
}
-/*
- * "round({float})" function
- */
-static void f_round(typval_T *argvars, typval_T *rettv)
-{
- float_op_wrapper(argvars, rettv, &round);
-}
-
// "rpcnotify()" function
-static void f_rpcnotify(typval_T *argvars, typval_T *rettv)
+static void f_rpcnotify(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_NUMBER;
rettv->vval.v_number = 0;
@@ -13892,9 +13847,8 @@ static void f_rpcnotify(typval_T *argvars, typval_T *rettv)
ADD(args, vim_to_object(tv));
}
- if (!channel_send_event((uint64_t)argvars[0].vval.v_number,
- (char *)get_tv_string(&argvars[1]),
- args)) {
+ if (!rpc_send_event((uint64_t)argvars[0].vval.v_number,
+ tv_get_string(&argvars[1]), args)) {
EMSG2(_(e_invarg2), "Channel doesn't exist");
return;
}
@@ -13903,7 +13857,7 @@ static void f_rpcnotify(typval_T *argvars, typval_T *rettv)
}
// "rpcrequest()" function
-static void f_rpcrequest(typval_T *argvars, typval_T *rettv)
+static void f_rpcrequest(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_NUMBER;
rettv->vval.v_number = 0;
@@ -13932,7 +13886,7 @@ static void f_rpcrequest(typval_T *argvars, typval_T *rettv)
scid_T save_current_SID;
uint8_t *save_sourcing_name, *save_autocmd_fname, *save_autocmd_match;
linenr_T save_sourcing_lnum;
- int save_autocmd_fname_full, save_autocmd_bufnr;
+ int save_autocmd_bufnr;
void *save_funccalp;
if (l_provider_call_nesting) {
@@ -13943,26 +13897,22 @@ static void f_rpcrequest(typval_T *argvars, typval_T *rettv)
save_sourcing_lnum = sourcing_lnum;
save_autocmd_fname = autocmd_fname;
save_autocmd_match = autocmd_match;
- save_autocmd_fname_full = autocmd_fname_full;
save_autocmd_bufnr = autocmd_bufnr;
save_funccalp = save_funccal();
- //
+
current_SID = provider_caller_scope.SID;
sourcing_name = provider_caller_scope.sourcing_name;
sourcing_lnum = provider_caller_scope.sourcing_lnum;
autocmd_fname = provider_caller_scope.autocmd_fname;
autocmd_match = provider_caller_scope.autocmd_match;
- autocmd_fname_full = provider_caller_scope.autocmd_fname_full;
autocmd_bufnr = provider_caller_scope.autocmd_bufnr;
restore_funccal(provider_caller_scope.funccalp);
}
Error err = ERROR_INIT;
- Object result = channel_send_call((uint64_t)argvars[0].vval.v_number,
- (char *)get_tv_string(&argvars[1]),
- args,
- &err);
+ Object result = rpc_send_call((uint64_t)argvars[0].vval.v_number,
+ tv_get_string(&argvars[1]), args, &err);
if (l_provider_call_nesting) {
current_SID = save_current_SID;
@@ -13970,13 +13920,12 @@ static void f_rpcrequest(typval_T *argvars, typval_T *rettv)
sourcing_lnum = save_sourcing_lnum;
autocmd_fname = save_autocmd_fname;
autocmd_match = save_autocmd_match;
- autocmd_fname_full = save_autocmd_fname_full;
autocmd_bufnr = save_autocmd_bufnr;
restore_funccal(save_funccalp);
}
- if (err.set) {
- vim_report_error(cstr_as_string(err.msg));
+ if (ERROR_SET(&err)) {
+ nvim_err_writeln(cstr_as_string(err.msg));
goto end;
}
@@ -13986,10 +13935,11 @@ static void f_rpcrequest(typval_T *argvars, typval_T *rettv)
end:
api_free_object(result);
+ api_clear_error(&err);
}
-// "rpcstart()" function
-static void f_rpcstart(typval_T *argvars, typval_T *rettv)
+// "rpcstart()" function (DEPRECATED)
+static void f_rpcstart(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_NUMBER;
rettv->vval.v_number = 0;
@@ -14009,14 +13959,17 @@ static void f_rpcstart(typval_T *argvars, typval_T *rettv)
int argsl = 0;
if (argvars[1].v_type == VAR_LIST) {
args = argvars[1].vval.v_list;
- argsl = args->lv_len;
+ argsl = tv_list_len(args);
// Assert that all list items are strings
- for (listitem_T *arg = args->lv_first; arg != NULL; arg = arg->li_next) {
- if (arg->li_tv.v_type != VAR_STRING) {
- EMSG(_(e_invarg));
+ int i = 0;
+ TV_LIST_ITER_CONST(args, arg, {
+ if (TV_LIST_ITEM_TV(arg)->v_type != VAR_STRING) {
+ emsgf(_("E5010: List item %d of the second argument is not a string"),
+ i);
return;
}
- }
+ i++;
+ });
}
if (argvars[0].vval.v_string == NULL || argvars[0].vval.v_string[0] == NUL) {
@@ -14034,24 +13987,25 @@ static void f_rpcstart(typval_T *argvars, typval_T *rettv)
int i = 1;
// Copy arguments to the vector
if (argsl > 0) {
- for (listitem_T *arg = args->lv_first; arg != NULL; arg = arg->li_next) {
- argv[i++] = xstrdup((char *) get_tv_string(&arg->li_tv));
- }
+ TV_LIST_ITER_CONST(args, arg, {
+ argv[i++] = xstrdup(tv_get_string(TV_LIST_ITEM_TV(arg)));
+ });
}
// The last item of argv must be NULL
argv[i] = NULL;
- uint64_t channel_id = channel_from_process(argv);
- if (!channel_id) {
- EMSG(_(e_api_spawn_failed));
+ Channel *chan = channel_job_start(argv, CALLBACK_READER_INIT,
+ CALLBACK_READER_INIT, CALLBACK_NONE,
+ false, true, false, NULL, 0, 0, NULL,
+ &rettv->vval.v_number);
+ if (chan) {
+ channel_create_event(chan, NULL);
}
-
- rettv->vval.v_number = (varnumber_T)channel_id;
}
// "rpcstop()" function
-static void f_rpcstop(typval_T *argvars, typval_T *rettv)
+static void f_rpcstop(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_NUMBER;
rettv->vval.v_number = 0;
@@ -14066,49 +14020,54 @@ static void f_rpcstop(typval_T *argvars, typval_T *rettv)
return;
}
- rettv->vval.v_number = channel_close(argvars[0].vval.v_number);
+ // if called with a job, stop it, else closes the channel
+ uint64_t id = argvars[0].vval.v_number;
+ if (find_job(id, false)) {
+ f_jobstop(argvars, rettv, NULL);
+ } else {
+ const char *error;
+ rettv->vval.v_number = channel_close(argvars[0].vval.v_number,
+ kChannelPartRpc, &error);
+ if (!rettv->vval.v_number) {
+ EMSG(error);
+ }
+ }
}
/*
* "screenattr()" function
*/
-static void f_screenattr(typval_T *argvars, typval_T *rettv)
+static void f_screenattr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- int row;
- int col;
int c;
- row = get_tv_number_chk(&argvars[0], NULL) - 1;
- col = get_tv_number_chk(&argvars[1], NULL) - 1;
- if (row < 0 || row >= screen_Rows
- || col < 0 || col >= screen_Columns)
+ const int row = (int)tv_get_number_chk(&argvars[0], NULL) - 1;
+ const int col = (int)tv_get_number_chk(&argvars[1], NULL) - 1;
+ if (row < 0 || row >= default_grid.Rows
+ || col < 0 || col >= default_grid.Columns) {
c = -1;
- else
- c = ScreenAttrs[LineOffset[row] + col];
+ } else {
+ c = default_grid.attrs[default_grid.line_offset[row] + col];
+ }
rettv->vval.v_number = c;
}
/*
* "screenchar()" function
*/
-static void f_screenchar(typval_T *argvars, typval_T *rettv)
+static void f_screenchar(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- int row;
- int col;
int off;
int c;
- row = get_tv_number_chk(&argvars[0], NULL) - 1;
- col = get_tv_number_chk(&argvars[1], NULL) - 1;
- if (row < 0 || row >= screen_Rows
- || col < 0 || col >= screen_Columns)
+ const int row = tv_get_number_chk(&argvars[0], NULL) - 1;
+ const int col = tv_get_number_chk(&argvars[1], NULL) - 1;
+ if (row < 0 || row >= default_grid.Rows
+ || col < 0 || col >= default_grid.Columns) {
c = -1;
- else {
- off = LineOffset[row] + col;
- if (enc_utf8 && ScreenLinesUC[off] != 0)
- c = ScreenLinesUC[off];
- else
- c = ScreenLines[off];
+ } else {
+ off = default_grid.line_offset[row] + col;
+ c = utf_ptr2char(default_grid.chars[off]);
}
rettv->vval.v_number = c;
}
@@ -14118,7 +14077,7 @@ static void f_screenchar(typval_T *argvars, typval_T *rettv)
*
* First column is 1 to be consistent with virtcol().
*/
-static void f_screencol(typval_T *argvars, typval_T *rettv)
+static void f_screencol(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->vval.v_number = ui_current_col() + 1;
}
@@ -14126,7 +14085,7 @@ static void f_screencol(typval_T *argvars, typval_T *rettv)
/*
* "screenrow()" function
*/
-static void f_screenrow(typval_T *argvars, typval_T *rettv)
+static void f_screenrow(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->vval.v_number = ui_current_row() + 1;
}
@@ -14134,7 +14093,7 @@ static void f_screenrow(typval_T *argvars, typval_T *rettv)
/*
* "search()" function
*/
-static void f_search(typval_T *argvars, typval_T *rettv)
+static void f_search(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
int flags = 0;
@@ -14144,23 +14103,25 @@ static void f_search(typval_T *argvars, typval_T *rettv)
/*
* "searchdecl()" function
*/
-static void f_searchdecl(typval_T *argvars, typval_T *rettv)
+static void f_searchdecl(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
int locally = 1;
int thisblock = 0;
- int error = FALSE;
+ bool error = false;
rettv->vval.v_number = 1; /* default: FAIL */
- char_u *name = get_tv_string_chk(&argvars[0]);
+ const char *const name = tv_get_string_chk(&argvars[0]);
if (argvars[1].v_type != VAR_UNKNOWN) {
- locally = get_tv_number_chk(&argvars[1], &error) == 0;
- if (!error && argvars[2].v_type != VAR_UNKNOWN)
- thisblock = get_tv_number_chk(&argvars[2], &error) != 0;
+ locally = tv_get_number_chk(&argvars[1], &error) == 0;
+ if (!error && argvars[2].v_type != VAR_UNKNOWN) {
+ thisblock = tv_get_number_chk(&argvars[2], &error) != 0;
+ }
}
- if (!error && name != NULL)
- rettv->vval.v_number = find_decl(name, STRLEN(name), locally,
+ if (!error && name != NULL) {
+ rettv->vval.v_number = find_decl((char_u *)name, strlen(name), locally,
thisblock, SEARCH_KEEP) == FAIL;
+ }
}
/*
@@ -14168,65 +14129,70 @@ static void f_searchdecl(typval_T *argvars, typval_T *rettv)
*/
static int searchpair_cmn(typval_T *argvars, pos_T *match_pos)
{
- char_u *spat, *mpat, *epat;
- char_u *skip;
bool save_p_ws = p_ws;
int dir;
int flags = 0;
- char_u nbuf1[NUMBUFLEN];
- char_u nbuf2[NUMBUFLEN];
- char_u nbuf3[NUMBUFLEN];
- int retval = 0; /* default: FAIL */
+ int retval = 0; // default: FAIL
long lnum_stop = 0;
long time_limit = 0;
- /* Get the three pattern arguments: start, middle, end. */
- spat = get_tv_string_chk(&argvars[0]);
- mpat = get_tv_string_buf_chk(&argvars[1], nbuf1);
- epat = get_tv_string_buf_chk(&argvars[2], nbuf2);
- if (spat == NULL || mpat == NULL || epat == NULL)
- goto theend; /* type error */
+ // Get the three pattern arguments: start, middle, end.
+ char nbuf1[NUMBUFLEN];
+ char nbuf2[NUMBUFLEN];
+ char nbuf3[NUMBUFLEN];
+ const char *spat = tv_get_string_chk(&argvars[0]);
+ const char *mpat = tv_get_string_buf_chk(&argvars[1], nbuf1);
+ const char *epat = tv_get_string_buf_chk(&argvars[2], nbuf2);
+ if (spat == NULL || mpat == NULL || epat == NULL) {
+ goto theend; // Type error.
+ }
- /* Handle the optional fourth argument: flags */
- dir = get_search_arg(&argvars[3], &flags); /* may set p_ws */
- if (dir == 0)
+ // Handle the optional fourth argument: flags.
+ dir = get_search_arg(&argvars[3], &flags); // may set p_ws.
+ if (dir == 0) {
goto theend;
+ }
- /* Don't accept SP_END or SP_SUBPAT.
- * Only one of the SP_NOMOVE or SP_SETPCMARK flags can be set.
- */
+ // Don't accept SP_END or SP_SUBPAT.
+ // Only one of the SP_NOMOVE or SP_SETPCMARK flags can be set.
if ((flags & (SP_END | SP_SUBPAT)) != 0
|| ((flags & SP_NOMOVE) && (flags & SP_SETPCMARK))) {
- EMSG2(_(e_invarg2), get_tv_string(&argvars[3]));
+ EMSG2(_(e_invarg2), tv_get_string(&argvars[3]));
goto theend;
}
- /* Using 'r' implies 'W', otherwise it doesn't work. */
- if (flags & SP_REPEAT)
+ // Using 'r' implies 'W', otherwise it doesn't work.
+ if (flags & SP_REPEAT) {
p_ws = false;
+ }
- /* Optional fifth argument: skip expression */
+ // Optional fifth argument: skip expression.
+ const char *skip;
if (argvars[3].v_type == VAR_UNKNOWN
- || argvars[4].v_type == VAR_UNKNOWN)
- skip = (char_u *)"";
- else {
- skip = get_tv_string_buf_chk(&argvars[4], nbuf3);
+ || argvars[4].v_type == VAR_UNKNOWN) {
+ skip = "";
+ } else {
+ skip = tv_get_string_buf_chk(&argvars[4], nbuf3);
+ if (skip == NULL) {
+ goto theend; // Type error.
+ }
if (argvars[5].v_type != VAR_UNKNOWN) {
- lnum_stop = get_tv_number_chk(&argvars[5], NULL);
- if (lnum_stop < 0)
+ lnum_stop = tv_get_number_chk(&argvars[5], NULL);
+ if (lnum_stop < 0) {
goto theend;
+ }
if (argvars[6].v_type != VAR_UNKNOWN) {
- time_limit = get_tv_number_chk(&argvars[6], NULL);
- if (time_limit < 0)
+ time_limit = tv_get_number_chk(&argvars[6], NULL);
+ if (time_limit < 0) {
goto theend;
+ }
}
}
}
- if (skip == NULL)
- goto theend; /* type error */
- retval = do_searchpair(spat, mpat, epat, dir, skip, flags,
- match_pos, lnum_stop, time_limit);
+ retval = do_searchpair(
+ (char_u *)spat, (char_u *)mpat, (char_u *)epat, dir, (char_u *)skip,
+ flags, match_pos, lnum_stop, time_limit);
theend:
p_ws = save_p_ws;
@@ -14237,7 +14203,7 @@ theend:
/*
* "searchpair()" function
*/
-static void f_searchpair(typval_T *argvars, typval_T *rettv)
+static void f_searchpair(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->vval.v_number = searchpair_cmn(argvars, NULL);
}
@@ -14245,21 +14211,21 @@ static void f_searchpair(typval_T *argvars, typval_T *rettv)
/*
* "searchpairpos()" function
*/
-static void f_searchpairpos(typval_T *argvars, typval_T *rettv)
+static void f_searchpairpos(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
pos_T match_pos;
int lnum = 0;
int col = 0;
- rettv_list_alloc(rettv);
+ tv_list_alloc_ret(rettv, 2);
if (searchpair_cmn(argvars, &match_pos) > 0) {
lnum = match_pos.lnum;
col = match_pos.col;
}
- list_append_number(rettv->vval.v_list, (varnumber_T)lnum);
- list_append_number(rettv->vval.v_list, (varnumber_T)col);
+ tv_list_append_number(rettv->vval.v_list, (varnumber_T)lnum);
+ tv_list_append_number(rettv->vval.v_list, (varnumber_T)col);
}
/*
@@ -14267,17 +14233,17 @@ static void f_searchpairpos(typval_T *argvars, typval_T *rettv)
* Used by searchpair(), see its documentation for the details.
* Returns 0 or -1 for no match,
*/
-long
-do_searchpair (
- char_u *spat, /* start pattern */
- char_u *mpat, /* middle pattern */
- char_u *epat, /* end pattern */
- int dir, /* BACKWARD or FORWARD */
- char_u *skip, /* skip expression */
- int flags, /* SP_SETPCMARK and other SP_ values */
+long
+do_searchpair(
+ char_u *spat, // start pattern
+ char_u *mpat, // middle pattern
+ char_u *epat, // end pattern
+ int dir, // BACKWARD or FORWARD
+ char_u *skip, // skip expression
+ int flags, // SP_SETPCMARK and other SP_ values
pos_T *match_pos,
- linenr_T lnum_stop, /* stop at this line if not zero */
- long time_limit /* stop after this many msec */
+ linenr_T lnum_stop, // stop at this line if not zero
+ long time_limit // stop after this many msec
)
{
char_u *save_cpo;
@@ -14291,9 +14257,10 @@ do_searchpair (
int n;
int r;
int nest = 1;
- int err;
int options = SEARCH_KEEP;
proftime_T tm;
+ size_t pat2_len;
+ size_t pat3_len;
/* Make 'cpoptions' empty, the 'l' flag should not be used here. */
save_cpo = p_cpo;
@@ -14302,18 +14269,22 @@ do_searchpair (
/* Set the time limit, if there is one. */
tm = profile_setlimit(time_limit);
- /* Make two search patterns: start/end (pat2, for in nested pairs) and
- * start/middle/end (pat3, for the top pair). */
- pat2 = xmalloc(STRLEN(spat) + STRLEN(epat) + 15);
- pat3 = xmalloc(STRLEN(spat) + STRLEN(mpat) + STRLEN(epat) + 23);
- sprintf((char *)pat2, "\\(%s\\m\\)\\|\\(%s\\m\\)", spat, epat);
- if (*mpat == NUL)
+ // Make two search patterns: start/end (pat2, for in nested pairs) and
+ // start/middle/end (pat3, for the top pair).
+ pat2_len = STRLEN(spat) + STRLEN(epat) + 17;
+ pat2 = xmalloc(pat2_len);
+ pat3_len = STRLEN(spat) + STRLEN(mpat) + STRLEN(epat) + 25;
+ pat3 = xmalloc(pat3_len);
+ snprintf((char *)pat2, pat2_len, "\\m\\(%s\\m\\)\\|\\(%s\\m\\)", spat, epat);
+ if (*mpat == NUL) {
STRCPY(pat3, pat2);
- else
- sprintf((char *)pat3, "\\(%s\\m\\)\\|\\(%s\\m\\)\\|\\(%s\\m\\)",
- spat, epat, mpat);
- if (flags & SP_START)
+ } else {
+ snprintf((char *)pat3, pat3_len,
+ "\\m\\(%s\\m\\)\\|\\(%s\\m\\)\\|\\(%s\\m\\)", spat, epat, mpat);
+ }
+ if (flags & SP_START) {
options |= SEARCH_START;
+ }
save_cursor = curwin->w_cursor;
pos = curwin->w_cursor;
@@ -14347,7 +14318,8 @@ do_searchpair (
if (*skip != NUL) {
save_pos = curwin->w_cursor;
curwin->w_cursor = pos;
- r = eval_to_bool(skip, &err, NULL, FALSE);
+ bool err;
+ r = eval_to_bool(skip, &err, NULL, false);
curwin->w_cursor = save_pos;
if (err) {
/* Evaluating {skip} caused an error, break here. */
@@ -14410,48 +14382,41 @@ do_searchpair (
/*
* "searchpos()" function
*/
-static void f_searchpos(typval_T *argvars, typval_T *rettv)
+static void f_searchpos(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
pos_T match_pos;
- int lnum = 0;
- int col = 0;
- int n;
int flags = 0;
- rettv_list_alloc(rettv);
+ const int n = search_cmn(argvars, &match_pos, &flags);
- n = search_cmn(argvars, &match_pos, &flags);
- if (n > 0) {
- lnum = match_pos.lnum;
- col = match_pos.col;
- }
+ tv_list_alloc_ret(rettv, 2 + (!!(flags & SP_SUBPAT)));
+
+ const int lnum = (n > 0 ? match_pos.lnum : 0);
+ const int col = (n > 0 ? match_pos.col : 0);
- list_append_number(rettv->vval.v_list, (varnumber_T)lnum);
- list_append_number(rettv->vval.v_list, (varnumber_T)col);
- if (flags & SP_SUBPAT)
- list_append_number(rettv->vval.v_list, (varnumber_T)n);
+ tv_list_append_number(rettv->vval.v_list, (varnumber_T)lnum);
+ tv_list_append_number(rettv->vval.v_list, (varnumber_T)col);
+ if (flags & SP_SUBPAT) {
+ tv_list_append_number(rettv->vval.v_list, (varnumber_T)n);
+ }
}
/// "serverlist()" function
-static void f_serverlist(typval_T *argvars, typval_T *rettv)
+static void f_serverlist(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
size_t n;
char **addrs = server_address_list(&n);
// Copy addrs into a linked list.
- list_T *l = rettv_list_alloc(rettv);
+ list_T *const l = tv_list_alloc_ret(rettv, n);
for (size_t i = 0; i < n; i++) {
- listitem_T *li = listitem_alloc();
- li->li_tv.v_type = VAR_STRING;
- li->li_tv.v_lock = 0;
- li->li_tv.vval.v_string = (char_u *) addrs[i];
- list_append(l, li);
+ tv_list_append_allocated_string(l, addrs[i]);
}
xfree(addrs);
}
/// "serverstart()" function
-static void f_serverstart(typval_T *argvars, typval_T *rettv)
+static void f_serverstart(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL; // Address of the new server
@@ -14460,91 +14425,113 @@ static void f_serverstart(typval_T *argvars, typval_T *rettv)
return;
}
+ char *address;
// If the user supplied an address, use it, otherwise use a temp.
if (argvars[0].v_type != VAR_UNKNOWN) {
if (argvars[0].v_type != VAR_STRING) {
EMSG(_(e_invarg));
return;
} else {
- rettv->vval.v_string = vim_strsave(get_tv_string(argvars));
+ address = xstrdup(tv_get_string(argvars));
}
} else {
- rettv->vval.v_string = (char_u *)server_address_new();
+ address = server_address_new();
}
- int result = server_start((char *) rettv->vval.v_string);
+ int result = server_start(address);
+ xfree(address);
+
if (result != 0) {
- EMSG2("Failed to start server: %s", uv_strerror(result));
+ EMSG2("Failed to start server: %s",
+ result > 0 ? "Unknown system error" : uv_strerror(result));
+ return;
}
+
+ // Since it's possible server_start adjusted the given {address} (e.g.,
+ // "localhost:" will now have a port), return the final value to the user.
+ size_t n;
+ char **addrs = server_address_list(&n);
+ rettv->vval.v_string = (char_u *)addrs[n - 1];
+
+ n--;
+ for (size_t i = 0; i < n; i++) {
+ xfree(addrs[i]);
+ }
+ xfree(addrs);
}
/// "serverstop()" function
-static void f_serverstop(typval_T *argvars, typval_T *rettv)
+static void f_serverstop(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
if (check_restricted() || check_secure()) {
return;
}
- if (argvars[0].v_type == VAR_UNKNOWN || argvars[0].v_type != VAR_STRING) {
+ if (argvars[0].v_type != VAR_STRING) {
EMSG(_(e_invarg));
return;
}
+ rettv->v_type = VAR_NUMBER;
+ rettv->vval.v_number = 0;
if (argvars[0].vval.v_string) {
- server_stop((char *) argvars[0].vval.v_string);
+ bool rv = server_stop((char *)argvars[0].vval.v_string);
+ rettv->vval.v_number = (rv ? 1 : 0);
}
}
/*
* "setbufvar()" function
*/
-static void f_setbufvar(typval_T *argvars, typval_T *rettv)
+static void f_setbufvar(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- buf_T *buf;
- aco_save_T aco;
- char_u *varname, *bufvarname;
- typval_T *varp;
- char_u nbuf[NUMBUFLEN];
-
- if (check_restricted() || check_secure())
+ if (check_restricted()
+ || check_secure()
+ || !tv_check_str_or_nr(&argvars[0])) {
return;
- (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
- varname = get_tv_string_chk(&argvars[1]);
- buf = get_buf_tv(&argvars[0], FALSE);
- varp = &argvars[2];
-
- if (buf != NULL && varname != NULL && varp != NULL) {
- /* set curbuf to be our buf, temporarily */
- aucmd_prepbuf(&aco, buf);
+ }
+ const char *varname = tv_get_string_chk(&argvars[1]);
+ buf_T *const buf = tv_get_buf(&argvars[0], false);
+ typval_T *varp = &argvars[2];
+ if (buf != NULL && varname != NULL) {
if (*varname == '&') {
long numval;
- char_u *strval;
- int error = FALSE;
+ bool error = false;
+ aco_save_T aco;
- ++varname;
- numval = get_tv_number_chk(varp, &error);
- strval = get_tv_string_buf_chk(varp, nbuf);
- if (!error && strval != NULL)
+ // set curbuf to be our buf, temporarily
+ aucmd_prepbuf(&aco, buf);
+
+ varname++;
+ numval = tv_get_number_chk(varp, &error);
+ char nbuf[NUMBUFLEN];
+ const char *const strval = tv_get_string_buf_chk(varp, nbuf);
+ if (!error && strval != NULL) {
set_option_value(varname, numval, strval, OPT_LOCAL);
+ }
+
+ // reset notion of buffer
+ aucmd_restbuf(&aco);
} else {
- bufvarname = xmalloc(STRLEN(varname) + 3);
- STRCPY(bufvarname, "b:");
- STRCPY(bufvarname + 2, varname);
- set_var(bufvarname, varp, TRUE);
+ buf_T *save_curbuf = curbuf;
+
+ const size_t varname_len = STRLEN(varname);
+ char *const bufvarname = xmalloc(varname_len + 3);
+ curbuf = buf;
+ memcpy(bufvarname, "b:", 2);
+ memcpy(bufvarname + 2, varname, varname_len + 1);
+ set_var(bufvarname, varname_len + 2, varp, true);
xfree(bufvarname);
+ curbuf = save_curbuf;
}
-
- /* reset notion of buffer */
- aucmd_restbuf(&aco);
}
}
-static void f_setcharsearch(typval_T *argvars, typval_T *rettv)
+static void f_setcharsearch(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
dict_T *d;
dictitem_T *di;
- char_u *csearch;
if (argvars[0].v_type != VAR_DICT) {
EMSG(_(e_dictreq));
@@ -14552,7 +14539,7 @@ static void f_setcharsearch(typval_T *argvars, typval_T *rettv)
}
if ((d = argvars[0].vval.v_dict) != NULL) {
- csearch = get_dict_string(d, (char_u *)"char", FALSE);
+ char_u *const csearch = (char_u *)tv_dict_get_string(d, "char", false);
if (csearch != NULL) {
if (enc_utf8) {
int pcc[MAX_MCO];
@@ -14564,44 +14551,47 @@ static void f_setcharsearch(typval_T *argvars, typval_T *rettv)
csearch, MB_PTR2LEN(csearch));
}
- di = dict_find(d, (char_u *)"forward", -1);
- if (di != NULL)
- set_csearch_direction(get_tv_number(&di->di_tv) ? FORWARD : BACKWARD);
+ di = tv_dict_find(d, S_LEN("forward"));
+ if (di != NULL) {
+ set_csearch_direction(tv_get_number(&di->di_tv) ? FORWARD : BACKWARD);
+ }
- di = dict_find(d, (char_u *)"until", -1);
- if (di != NULL)
- set_csearch_until(!!get_tv_number(&di->di_tv));
+ di = tv_dict_find(d, S_LEN("until"));
+ if (di != NULL) {
+ set_csearch_until(!!tv_get_number(&di->di_tv));
+ }
}
}
/*
* "setcmdpos()" function
*/
-static void f_setcmdpos(typval_T *argvars, typval_T *rettv)
+static void f_setcmdpos(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- int pos = (int)get_tv_number(&argvars[0]) - 1;
+ const int pos = (int)tv_get_number(&argvars[0]) - 1;
- if (pos >= 0)
+ if (pos >= 0) {
rettv->vval.v_number = set_cmdline_pos(pos);
+ }
}
/// "setfperm({fname}, {mode})" function
-static void f_setfperm(typval_T *argvars, typval_T *rettv)
+static void f_setfperm(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->vval.v_number = 0;
- char_u *fname = get_tv_string_chk(&argvars[0]);
+ const char *const fname = tv_get_string_chk(&argvars[0]);
if (fname == NULL) {
return;
}
- char_u modebuf[NUMBUFLEN];
- char_u *mode_str = get_tv_string_buf_chk(&argvars[1], modebuf);
+ char modebuf[NUMBUFLEN];
+ const char *const mode_str = tv_get_string_buf_chk(&argvars[1], modebuf);
if (mode_str == NULL) {
return;
}
- if (STRLEN(mode_str) != 9) {
+ if (strlen(mode_str) != 9) {
EMSG2(_(e_invarg2), mode_str);
return;
}
@@ -14620,35 +14610,37 @@ static void f_setfperm(typval_T *argvars, typval_T *rettv)
/*
* "setline()" function
*/
-static void f_setline(typval_T *argvars, typval_T *rettv)
+static void f_setline(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- linenr_T lnum;
- char_u *line = NULL;
list_T *l = NULL;
listitem_T *li = NULL;
long added = 0;
linenr_T lcount = curbuf->b_ml.ml_line_count;
- lnum = get_tv_lnum(&argvars[0]);
+ linenr_T lnum = tv_get_lnum(&argvars[0]);
+ const char *line = NULL;
if (argvars[1].v_type == VAR_LIST) {
l = argvars[1].vval.v_list;
- li = l->lv_first;
- } else
- line = get_tv_string_chk(&argvars[1]);
+ li = tv_list_first(l);
+ } else {
+ line = tv_get_string_chk(&argvars[1]);
+ }
- /* default result is zero == OK */
+ // Default result is zero == OK.
for (;; ) {
- if (l != NULL) {
- /* list argument, get next string */
- if (li == NULL)
+ if (argvars[1].v_type == VAR_LIST) {
+ // List argument, get next string.
+ if (li == NULL) {
break;
- line = get_tv_string_chk(&li->li_tv);
- li = li->li_next;
+ }
+ line = tv_get_string_chk(TV_LIST_ITEM_TV(li));
+ li = TV_LIST_ITEM_NEXT(l, li);
}
- rettv->vval.v_number = 1; /* FAIL */
- if (line == NULL || lnum < 1 || lnum > curbuf->b_ml.ml_line_count + 1)
+ rettv->vval.v_number = 1; // FAIL
+ if (line == NULL || lnum < 1 || lnum > curbuf->b_ml.ml_line_count + 1) {
break;
+ }
/* When coming here from Insert mode, sync undo, so that this can be
* undone separately from what was previously inserted. */
@@ -14658,18 +14650,20 @@ static void f_setline(typval_T *argvars, typval_T *rettv)
}
if (lnum <= curbuf->b_ml.ml_line_count) {
- /* existing line, replace it */
- if (u_savesub(lnum) == OK && ml_replace(lnum, line, TRUE) == OK) {
+ // Existing line, replace it.
+ if (u_savesub(lnum) == OK
+ && ml_replace(lnum, (char_u *)line, true) == OK) {
changed_bytes(lnum, 0);
if (lnum == curwin->w_cursor.lnum)
check_cursor_col();
rettv->vval.v_number = 0; /* OK */
}
} else if (added > 0 || u_save(lnum - 1, lnum) == OK) {
- /* lnum is one past the last line, append the line */
- ++added;
- if (ml_append(lnum - 1, line, (colnr_T)0, FALSE) == OK)
- rettv->vval.v_number = 0; /* OK */
+ // lnum is one past the last line, append the line.
+ added++;
+ if (ml_append(lnum - 1, (char_u *)line, 0, false) == OK) {
+ rettv->vval.v_number = 0; // OK
+ }
}
if (l == NULL) /* only one string argument */
@@ -14684,7 +14678,7 @@ static void f_setline(typval_T *argvars, typval_T *rettv)
/// Create quickfix/location list from VimL values
///
/// Used by `setqflist()` and `setloclist()` functions. Accepts invalid
-/// list_arg, action_arg and title_arg arguments in which case errors out,
+/// list_arg, action_arg and what_arg arguments in which case errors out,
/// including VAR_UNKNOWN parameters.
///
/// @param[in,out] wp Window to create location list for. May be NULL in
@@ -14697,14 +14691,20 @@ static void f_setline(typval_T *argvars, typval_T *rettv)
static void set_qf_ll_list(win_T *wp, typval_T *args, typval_T *rettv)
FUNC_ATTR_NONNULL_ARG(2, 3)
{
- char_u *title = NULL;
+ static char *e_invact = N_("E927: Invalid action: '%s'");
+ const char *title = NULL;
int action = ' ';
+ static int recursive = 0;
rettv->vval.v_number = -1;
+ dict_T *d = NULL;
typval_T *list_arg = &args[0];
if (list_arg->v_type != VAR_LIST) {
EMSG(_(e_listreq));
return;
+ } else if (recursive != 0) {
+ EMSG(_(e_au_recursive));
+ return;
}
typval_T *action_arg = &args[1];
@@ -14712,40 +14712,52 @@ static void set_qf_ll_list(win_T *wp, typval_T *args, typval_T *rettv)
// Option argument was not given.
goto skip_args;
} else if (action_arg->v_type != VAR_STRING) {
- EMSG(_(e_strreq));
+ EMSG(_(e_stringreq));
return;
}
- char_u *act = get_tv_string_chk(action_arg);
- if (*act == 'a' || *act == 'r') {
+ const char *const act = tv_get_string_chk(action_arg);
+ if ((*act == 'a' || *act == 'r' || *act == ' ' || *act == 'f')
+ && act[1] == NUL) {
action = *act;
+ } else {
+ EMSG2(_(e_invact), act);
+ return;
}
typval_T *title_arg = &args[2];
if (title_arg->v_type == VAR_UNKNOWN) {
// Option argument was not given.
goto skip_args;
- }
- title = get_tv_string_chk(title_arg);
- if (!title) {
- // Type error. Error already printed by get_tv_string_chk().
+ } else if (title_arg->v_type == VAR_STRING) {
+ title = tv_get_string_chk(title_arg);
+ if (!title) {
+ // Type error. Error already printed by tv_get_string_chk().
+ return;
+ }
+ } else if (title_arg->v_type == VAR_DICT) {
+ d = title_arg->vval.v_dict;
+ } else {
+ EMSG(_(e_dictreq));
return;
}
skip_args:
if (!title) {
- title = (char_u*)(wp ? "setloclist()" : "setqflist()");
+ title = (wp ? "setloclist()" : "setqflist()");
}
- list_T *l = list_arg->vval.v_list;
- if (l && set_errorlist(wp, l, action, title) == OK) {
+ recursive++;
+ list_T *const l = list_arg->vval.v_list;
+ if (set_errorlist(wp, l, action, (char_u *)title, d) == OK) {
rettv->vval.v_number = 0;
}
+ recursive--;
}
/*
* "setloclist()" function
*/
-static void f_setloclist(typval_T *argvars, typval_T *rettv)
+static void f_setloclist(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
win_T *win;
@@ -14760,10 +14772,8 @@ static void f_setloclist(typval_T *argvars, typval_T *rettv)
/*
* "setmatches()" function
*/
-static void f_setmatches(typval_T *argvars, typval_T *rettv)
+static void f_setmatches(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- list_T *l;
- listitem_T *li;
dict_T *d;
list_T *s = NULL;
@@ -14772,78 +14782,89 @@ static void f_setmatches(typval_T *argvars, typval_T *rettv)
EMSG(_(e_listreq));
return;
}
- if ((l = argvars[0].vval.v_list) != NULL) {
-
- /* To some extent make sure that we are dealing with a list from
- * "getmatches()". */
- li = l->lv_first;
- while (li != NULL) {
- if (li->li_tv.v_type != VAR_DICT
- || (d = li->li_tv.vval.v_dict) == NULL) {
- EMSG(_(e_invarg));
- return;
- }
- if (!(dict_find(d, (char_u *)"group", -1) != NULL
- && (dict_find(d, (char_u *)"pattern", -1) != NULL
- || dict_find(d, (char_u *)"pos1", -1) != NULL)
- && dict_find(d, (char_u *)"priority", -1) != NULL
- && dict_find(d, (char_u *)"id", -1) != NULL)) {
- EMSG(_(e_invarg));
- return;
- }
- li = li->li_next;
+ list_T *const l = argvars[0].vval.v_list;
+ // To some extent make sure that we are dealing with a list from
+ // "getmatches()".
+ int li_idx = 0;
+ TV_LIST_ITER_CONST(l, li, {
+ if (TV_LIST_ITEM_TV(li)->v_type != VAR_DICT
+ || (d = TV_LIST_ITEM_TV(li)->vval.v_dict) == NULL) {
+ emsgf(_("E474: List item %d is either not a dictionary "
+ "or an empty one"), li_idx);
+ return;
+ }
+ if (!(tv_dict_find(d, S_LEN("group")) != NULL
+ && (tv_dict_find(d, S_LEN("pattern")) != NULL
+ || tv_dict_find(d, S_LEN("pos1")) != NULL)
+ && tv_dict_find(d, S_LEN("priority")) != NULL
+ && tv_dict_find(d, S_LEN("id")) != NULL)) {
+ emsgf(_("E474: List item %d is missing one of the required keys"),
+ li_idx);
+ return;
}
+ li_idx++;
+ });
- clear_matches(curwin);
- li = l->lv_first;
- while (li != NULL) {
- int i = 0;
- char_u buf[5];
- dictitem_T *di;
+ clear_matches(curwin);
+ bool match_add_failed = false;
+ TV_LIST_ITER_CONST(l, li, {
+ int i = 0;
+
+ d = TV_LIST_ITEM_TV(li)->vval.v_dict;
+ dictitem_T *const di = tv_dict_find(d, S_LEN("pattern"));
+ if (di == NULL) {
+ if (s == NULL) {
+ s = tv_list_alloc(9);
+ }
- d = li->li_tv.vval.v_dict;
- if (dict_find(d, (char_u *)"pattern", -1) == NULL) {
- if (s == NULL) {
- s = list_alloc();
- if (s == NULL) {
+ // match from matchaddpos()
+ for (i = 1; i < 9; i++) {
+ char buf[5];
+ snprintf(buf, sizeof(buf), "pos%d", i);
+ dictitem_T *const pos_di = tv_dict_find(d, buf, -1);
+ if (pos_di != NULL) {
+ if (pos_di->di_tv.v_type != VAR_LIST) {
return;
}
- }
-
- // match from matchaddpos()
- for (i = 1; i < 9; ++i) {
- snprintf((char *)buf, sizeof(buf), (char *)"pos%d", i);
- if ((di = dict_find(d, (char_u *)buf, -1)) != NULL) {
- if (di->di_tv.v_type != VAR_LIST) {
- return;
- }
- list_append_tv(s, &di->di_tv);
- s->lv_refcount++;
- } else {
- break;
- }
+ tv_list_append_tv(s, &pos_di->di_tv);
+ tv_list_ref(s);
+ } else {
+ break;
}
}
+ }
- char_u *group = get_dict_string(d, (char_u *)"group", false);
- int priority = get_dict_number(d, (char_u *)"priority");
- int id = get_dict_number(d, (char_u *)"id");
- char_u *conceal = dict_find(d, (char_u *)"conceal", -1) != NULL
- ? get_dict_string(d, (char_u *)"conceal",
- false)
- : NULL;
- if (i == 0) {
- match_add(curwin, group,
- get_dict_string(d, (char_u *)"pattern", false),
- priority, id, NULL, conceal);
- } else {
- match_add(curwin, group, NULL, priority, id, s, conceal);
- list_unref(s);
- s = NULL;
+ // Note: there are three number buffers involved:
+ // - group_buf below.
+ // - numbuf in tv_dict_get_string().
+ // - mybuf in tv_get_string().
+ //
+ // If you change this code make sure that buffers will not get
+ // accidentally reused.
+ char group_buf[NUMBUFLEN];
+ const char *const group = tv_dict_get_string_buf(d, "group", group_buf);
+ const int priority = (int)tv_dict_get_number(d, "priority");
+ const int id = (int)tv_dict_get_number(d, "id");
+ dictitem_T *const conceal_di = tv_dict_find(d, S_LEN("conceal"));
+ const char *const conceal = (conceal_di != NULL
+ ? tv_get_string(&conceal_di->di_tv)
+ : NULL);
+ if (i == 0) {
+ if (match_add(curwin, group,
+ tv_dict_get_string(d, "pattern", false),
+ priority, id, NULL, conceal) != id) {
+ match_add_failed = true;
+ }
+ } else {
+ if (match_add(curwin, group, NULL, priority, id, s, conceal) != id) {
+ match_add_failed = true;
}
- li = li->li_next;
+ tv_list_unref(s);
+ s = NULL;
}
+ });
+ if (!match_add_failed) {
rettv->vval.v_number = 0;
}
}
@@ -14851,36 +14872,31 @@ static void f_setmatches(typval_T *argvars, typval_T *rettv)
/*
* "setpos()" function
*/
-static void f_setpos(typval_T *argvars, typval_T *rettv)
+static void f_setpos(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
pos_T pos;
int fnum;
- char_u *name;
colnr_T curswant = -1;
rettv->vval.v_number = -1;
- name = get_tv_string_chk(argvars);
+ const char *const name = tv_get_string_chk(argvars);
if (name != NULL) {
if (list2fpos(&argvars[1], &pos, &fnum, &curswant) == OK) {
if (--pos.col < 0) {
pos.col = 0;
}
if (name[0] == '.' && name[1] == NUL) {
- // set cursor
- if (fnum == curbuf->b_fnum) {
- curwin->w_cursor = pos;
- if (curswant >= 0) {
- curwin->w_curswant = curswant - 1;
- curwin->w_set_curswant = false;
- }
- check_cursor();
- rettv->vval.v_number = 0;
- } else {
- EMSG(_(e_invarg));
+ // set cursor; "fnum" is ignored
+ curwin->w_cursor = pos;
+ if (curswant >= 0) {
+ curwin->w_curswant = curswant - 1;
+ curwin->w_set_curswant = false;
}
+ check_cursor();
+ rettv->vval.v_number = 0;
} else if (name[0] == '\'' && name[1] != NUL && name[2] == NUL) {
// set mark
- if (setmark_pos(name[1], &pos, fnum) == OK) {
+ if (setmark_pos((uint8_t)name[1], &pos, fnum) == OK) {
rettv->vval.v_number = 0;
}
} else {
@@ -14893,7 +14909,7 @@ static void f_setpos(typval_T *argvars, typval_T *rettv)
/*
* "setqflist()" function
*/
-static void f_setqflist(typval_T *argvars, typval_T *rettv)
+static void f_setqflist(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
set_qf_ll_list(NULL, argvars, rettv);
}
@@ -14901,11 +14917,9 @@ static void f_setqflist(typval_T *argvars, typval_T *rettv)
/*
* "setreg()" function
*/
-static void f_setreg(typval_T *argvars, typval_T *rettv)
+static void f_setreg(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
int regname;
- char_u *strregname;
- char_u *stropt;
bool append = false;
MotionType yank_type;
long block_len;
@@ -14913,127 +14927,144 @@ static void f_setreg(typval_T *argvars, typval_T *rettv)
block_len = -1;
yank_type = kMTUnknown;
- strregname = get_tv_string_chk(argvars);
- rettv->vval.v_number = 1; /* FAIL is default */
+ rettv->vval.v_number = 1; // FAIL is default.
- if (strregname == NULL)
- return; /* type error; errmsg already given */
- regname = *strregname;
- if (regname == 0 || regname == '@')
+ const char *const strregname = tv_get_string_chk(argvars);
+ if (strregname == NULL) {
+ return; // Type error; errmsg already given.
+ }
+ regname = (uint8_t)(*strregname);
+ if (regname == 0 || regname == '@') {
regname = '"';
+ }
+ bool set_unnamed = false;
if (argvars[2].v_type != VAR_UNKNOWN) {
- stropt = get_tv_string_chk(&argvars[2]);
- if (stropt == NULL)
- return; /* type error */
- for (; *stropt != NUL; ++stropt)
+ const char *stropt = tv_get_string_chk(&argvars[2]);
+ if (stropt == NULL) {
+ return; // Type error.
+ }
+ for (; *stropt != NUL; stropt++) {
switch (*stropt) {
- case 'a': case 'A': // append
- append = true;
- break;
- case 'v': case 'c': // character-wise selection
- yank_type = kMTCharWise;
- break;
- case 'V': case 'l': // line-wise selection
- yank_type = kMTLineWise;
- break;
- case 'b': case Ctrl_V: // block-wise selection
- yank_type = kMTBlockWise;
- if (ascii_isdigit(stropt[1])) {
- ++stropt;
- block_len = getdigits_long(&stropt) - 1;
- --stropt;
+ case 'a': case 'A': { // append
+ append = true;
+ break;
+ }
+ case 'v': case 'c': { // character-wise selection
+ yank_type = kMTCharWise;
+ break;
+ }
+ case 'V': case 'l': { // line-wise selection
+ yank_type = kMTLineWise;
+ break;
+ }
+ case 'b': case Ctrl_V: { // block-wise selection
+ yank_type = kMTBlockWise;
+ if (ascii_isdigit(stropt[1])) {
+ stropt++;
+ block_len = getdigits_long((char_u **)&stropt) - 1;
+ stropt--;
+ }
+ break;
+ }
+ case 'u': case '"': { // unnamed register
+ set_unnamed = true;
+ break;
}
- break;
}
+ }
}
if (argvars[1].v_type == VAR_LIST) {
- int len = argvars[1].vval.v_list->lv_len;
+ list_T *ll = argvars[1].vval.v_list;
+ // If the list is NULL handle like an empty list.
+ const int len = tv_list_len(ll);
+
// First half: use for pointers to result lines; second half: use for
// pointers to allocated copies.
- char_u **lstval = xmalloc(sizeof(char_u *) * ((len + 1) * 2));
- char_u **curval = lstval;
- char_u **allocval = lstval + len + 2;
- char_u **curallocval = allocval;
-
- char_u buf[NUMBUFLEN];
- for (listitem_T *li = argvars[1].vval.v_list->lv_first;
- li != NULL;
- li = li->li_next) {
- char_u *strval = get_tv_string_buf_chk(&li->li_tv, buf);
- if (strval == NULL) {
+ char **lstval = xmalloc(sizeof(char *) * ((len + 1) * 2));
+ const char **curval = (const char **)lstval;
+ char **allocval = lstval + len + 2;
+ char **curallocval = allocval;
+
+ TV_LIST_ITER_CONST(ll, li, {
+ char buf[NUMBUFLEN];
+ *curval = tv_get_string_buf_chk(TV_LIST_ITEM_TV(li), buf);
+ if (*curval == NULL) {
goto free_lstval;
}
- if (strval == buf) {
+ if (*curval == buf) {
// Need to make a copy,
- // next get_tv_string_buf_chk() will overwrite the string.
- strval = vim_strsave(buf);
- *curallocval++ = strval;
+ // next tv_get_string_buf_chk() will overwrite the string.
+ *curallocval = xstrdup(*curval);
+ *curval = *curallocval;
+ curallocval++;
}
- *curval++ = strval;
- }
+ curval++;
+ });
*curval++ = NULL;
- write_reg_contents_lst(regname, lstval, STRLEN(lstval),
- append, yank_type, block_len);
+ write_reg_contents_lst(regname, (char_u **)lstval, append, yank_type,
+ block_len);
free_lstval:
- while (curallocval > allocval)
- xfree(*--curallocval);
+ while (curallocval > allocval) {
+ xfree(*--curallocval);
+ }
xfree(lstval);
} else {
- char_u *strval = get_tv_string_chk(&argvars[1]);
+ const char *strval = tv_get_string_chk(&argvars[1]);
if (strval == NULL) {
return;
}
- write_reg_contents_ex(regname, strval, STRLEN(strval),
+ write_reg_contents_ex(regname, (const char_u *)strval, STRLEN(strval),
append, yank_type, block_len);
}
rettv->vval.v_number = 0;
+
+ if (set_unnamed) {
+ // Discard the result. We already handle the error case.
+ if (op_register_set_previous(regname)) { }
+ }
}
/*
* "settabvar()" function
*/
-static void f_settabvar(typval_T *argvars, typval_T *rettv)
+static void f_settabvar(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- tabpage_T *save_curtab;
- tabpage_T *tp;
- char_u *varname, *tabvarname;
- typval_T *varp;
-
rettv->vval.v_number = 0;
- if (check_restricted() || check_secure())
+ if (check_restricted() || check_secure()) {
return;
+ }
- tp = find_tabpage((int)get_tv_number_chk(&argvars[0], NULL));
- varname = get_tv_string_chk(&argvars[1]);
- varp = &argvars[2];
+ tabpage_T *const tp = find_tabpage((int)tv_get_number_chk(&argvars[0], NULL));
+ const char *const varname = tv_get_string_chk(&argvars[1]);
+ typval_T *const varp = &argvars[2];
- if (varname != NULL && varp != NULL
- && tp != NULL
- ) {
- save_curtab = curtab;
- goto_tabpage_tp(tp, FALSE, FALSE);
+ if (varname != NULL && tp != NULL) {
+ tabpage_T *const save_curtab = curtab;
+ goto_tabpage_tp(tp, false, false);
- tabvarname = xmalloc(STRLEN(varname) + 3);
- STRCPY(tabvarname, "t:");
- STRCPY(tabvarname + 2, varname);
- set_var(tabvarname, varp, TRUE);
+ const size_t varname_len = strlen(varname);
+ char *const tabvarname = xmalloc(varname_len + 3);
+ memcpy(tabvarname, "t:", 2);
+ memcpy(tabvarname + 2, varname, varname_len + 1);
+ set_var(tabvarname, varname_len + 2, varp, true);
xfree(tabvarname);
- /* Restore current tabpage */
- if (valid_tabpage(save_curtab))
- goto_tabpage_tp(save_curtab, FALSE, FALSE);
+ // Restore current tabpage.
+ if (valid_tabpage(save_curtab)) {
+ goto_tabpage_tp(save_curtab, false, false);
+ }
}
}
/*
* "settabwinvar()" function
*/
-static void f_settabwinvar(typval_T *argvars, typval_T *rettv)
+static void f_settabwinvar(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
setwinvar(argvars, rettv, 1);
}
@@ -15041,7 +15072,7 @@ static void f_settabwinvar(typval_T *argvars, typval_T *rettv)
/*
* "setwinvar()" function
*/
-static void f_setwinvar(typval_T *argvars, typval_T *rettv)
+static void f_setwinvar(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
setwinvar(argvars, rettv, 0);
}
@@ -15052,45 +15083,43 @@ static void f_setwinvar(typval_T *argvars, typval_T *rettv)
static void setwinvar(typval_T *argvars, typval_T *rettv, int off)
{
- win_T *win;
- win_T *save_curwin;
- tabpage_T *save_curtab;
- char_u *varname, *winvarname;
- typval_T *varp;
- char_u nbuf[NUMBUFLEN];
- tabpage_T *tp = NULL;
-
- if (check_restricted() || check_secure())
+ if (check_restricted() || check_secure()) {
return;
+ }
- if (off == 1)
- tp = find_tabpage((int)get_tv_number_chk(&argvars[0], NULL));
- else
+ tabpage_T *tp = NULL;
+ if (off == 1) {
+ tp = find_tabpage((int)tv_get_number_chk(&argvars[0], NULL));
+ } else {
tp = curtab;
- win = find_win_by_nr(&argvars[off], tp);
- varname = get_tv_string_chk(&argvars[off + 1]);
- varp = &argvars[off + 2];
+ }
+ win_T *const win = find_win_by_nr(&argvars[off], tp);
+ const char *varname = tv_get_string_chk(&argvars[off + 1]);
+ typval_T *varp = &argvars[off + 2];
if (win != NULL && varname != NULL && varp != NULL) {
+ win_T *save_curwin;
+ tabpage_T *save_curtab;
bool need_switch_win = tp != curtab || win != curwin;
if (!need_switch_win
|| switch_win(&save_curwin, &save_curtab, win, tp, true) == OK) {
if (*varname == '&') {
long numval;
- char_u *strval;
- int error = false;
+ bool error = false;
- ++varname;
- numval = get_tv_number_chk(varp, &error);
- strval = get_tv_string_buf_chk(varp, nbuf);
+ varname++;
+ numval = tv_get_number_chk(varp, &error);
+ char nbuf[NUMBUFLEN];
+ const char *const strval = tv_get_string_buf_chk(varp, nbuf);
if (!error && strval != NULL) {
set_option_value(varname, numval, strval, OPT_LOCAL);
}
} else {
- winvarname = xmalloc(STRLEN(varname) + 3);
- STRCPY(winvarname, "w:");
- STRCPY(winvarname + 2, varname);
- set_var(winvarname, varp, true);
+ const size_t varname_len = strlen(varname);
+ char *const winvarname = xmalloc(varname_len + 3);
+ memcpy(winvarname, "w:", 2);
+ memcpy(winvarname + 2, varname, varname_len + 1);
+ set_var(winvarname, varname_len + 2, varp, true);
xfree(winvarname);
}
}
@@ -15101,30 +15130,32 @@ static void setwinvar(typval_T *argvars, typval_T *rettv, int off)
}
/// f_sha256 - sha256({string}) function
-static void f_sha256(typval_T *argvars, typval_T *rettv)
+static void f_sha256(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *p = get_tv_string(&argvars[0]);
- const char_u *hash = sha256_bytes(p, (int) STRLEN(p) , NULL, 0);
+ const char *p = tv_get_string(&argvars[0]);
+ const char *hash = sha256_bytes((const uint8_t *)p, strlen(p) , NULL, 0);
// make a copy of the hash (sha256_bytes returns a static buffer)
- rettv->vval.v_string = (char_u *) xstrdup((char *) hash);
+ rettv->vval.v_string = (char_u *)xstrdup(hash);
rettv->v_type = VAR_STRING;
}
/*
* "shellescape({string})" function
*/
-static void f_shellescape(typval_T *argvars, typval_T *rettv)
+static void f_shellescape(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
+ const bool do_special = non_zero_arg(&argvars[1]);
+
rettv->vval.v_string = vim_strsave_shellescape(
- get_tv_string(&argvars[0]), non_zero_arg(&argvars[1]), true);
+ (const char_u *)tv_get_string(&argvars[0]), do_special, do_special);
rettv->v_type = VAR_STRING;
}
/*
* shiftwidth() function
*/
-static void f_shiftwidth(typval_T *argvars, typval_T *rettv)
+static void f_shiftwidth(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->vval.v_number = get_sw_value(curbuf);
}
@@ -15132,37 +15163,65 @@ static void f_shiftwidth(typval_T *argvars, typval_T *rettv)
/*
* "simplify()" function
*/
-static void f_simplify(typval_T *argvars, typval_T *rettv)
+static void f_simplify(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *p;
-
- p = get_tv_string(&argvars[0]);
- rettv->vval.v_string = vim_strsave(p);
- simplify_filename(rettv->vval.v_string); /* simplify in place */
+ const char *const p = tv_get_string(&argvars[0]);
+ rettv->vval.v_string = (char_u *)xstrdup(p);
+ simplify_filename(rettv->vval.v_string); // Simplify in place.
rettv->v_type = VAR_STRING;
}
-/*
- * "sin()" function
- */
-static void f_sin(typval_T *argvars, typval_T *rettv)
+/// "sockconnect()" function
+static void f_sockconnect(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- float_op_wrapper(argvars, rettv, &sin);
-}
+ if (argvars[0].v_type != VAR_STRING || argvars[1].v_type != VAR_STRING) {
+ EMSG(_(e_invarg));
+ return;
+ }
+ if (argvars[2].v_type != VAR_DICT && argvars[2].v_type != VAR_UNKNOWN) {
+ // Wrong argument types
+ EMSG2(_(e_invarg2), "expected dictionary");
+ return;
+ }
-/*
- * "sinh()" function
- */
-static void f_sinh(typval_T *argvars, typval_T *rettv)
-{
- float_op_wrapper(argvars, rettv, &sinh);
-}
+ const char *mode = tv_get_string(&argvars[0]);
+ const char *address = tv_get_string(&argvars[1]);
-/// struct used in the array that's given to qsort()
-typedef struct {
- listitem_T *item;
- int idx;
-} sortItem_T;
+ bool tcp;
+ if (strcmp(mode, "tcp") == 0) {
+ tcp = true;
+ } else if (strcmp(mode, "pipe") == 0) {
+ tcp = false;
+ } else {
+ EMSG2(_(e_invarg2), "invalid mode");
+ return;
+ }
+
+ bool rpc = false;
+ CallbackReader on_data = CALLBACK_READER_INIT;
+ if (argvars[2].v_type == VAR_DICT) {
+ dict_T *opts = argvars[2].vval.v_dict;
+ rpc = tv_dict_get_number(opts, "rpc") != 0;
+
+ if (!tv_dict_get_callback(opts, S_LEN("on_data"), &on_data.cb)) {
+ return;
+ }
+ on_data.buffered = tv_dict_get_number(opts, "data_buffered");
+ if (on_data.buffered && on_data.cb.type == kCallbackNone) {
+ on_data.self = opts;
+ }
+ }
+
+ const char *error = NULL;
+ uint64_t id = channel_connect(tcp, address, rpc, on_data, 50, &error);
+
+ if (error) {
+ EMSG2(_("connection failed: %s"), error);
+ }
+
+ rettv->vval.v_number = (varnumber_T)id;
+ rettv->v_type = VAR_NUMBER;
+}
/// struct storing information about current sort
typedef struct {
@@ -15170,9 +15229,10 @@ typedef struct {
bool item_compare_numeric;
bool item_compare_numbers;
bool item_compare_float;
- char_u *item_compare_func;
+ const char *item_compare_func;
+ partial_T *item_compare_partial;
dict_T *item_compare_selfdict;
- int item_compare_func_err;
+ bool item_compare_func_err;
} sortinfo_T;
static sortinfo_T *sortinfo = NULL;
@@ -15183,58 +15243,61 @@ static sortinfo_T *sortinfo = NULL;
*/
static int item_compare(const void *s1, const void *s2, bool keep_zero)
{
- sortItem_T *si1, *si2;
- char_u *p1;
- char_u *p2;
- char_u *tofree1 = NULL;
- char_u *tofree2 = NULL;
- int res;
+ ListSortItem *const si1 = (ListSortItem *)s1;
+ ListSortItem *const si2 = (ListSortItem *)s2;
- si1 = (sortItem_T *)s1;
- si2 = (sortItem_T *)s2;
- typval_T *tv1 = &si1->item->li_tv;
- typval_T *tv2 = &si2->item->li_tv;
+ typval_T *const tv1 = TV_LIST_ITEM_TV(si1->item);
+ typval_T *const tv2 = TV_LIST_ITEM_TV(si2->item);
+
+ int res;
if (sortinfo->item_compare_numbers) {
- long v1 = get_tv_number(tv1);
- long v2 = get_tv_number(tv2);
+ const varnumber_T v1 = tv_get_number(tv1);
+ const varnumber_T v2 = tv_get_number(tv2);
- return v1 == v2 ? 0 : v1 > v2 ? 1 : -1;
+ res = v1 == v2 ? 0 : v1 > v2 ? 1 : -1;
+ goto item_compare_end;
}
if (sortinfo->item_compare_float) {
- float_T v1 = get_tv_float(tv1);
- float_T v2 = get_tv_float(tv2);
+ const float_T v1 = tv_get_float(tv1);
+ const float_T v2 = tv_get_float(tv2);
- return v1 == v2 ? 0 : v1 > v2 ? 1 : -1;
+ res = v1 == v2 ? 0 : v1 > v2 ? 1 : -1;
+ goto item_compare_end;
}
+ char *tofree1 = NULL;
+ char *tofree2 = NULL;
+ char *p1;
+ char *p2;
+
// encode_tv2string() puts quotes around a string and allocates memory. Don't
// do that for string variables. Use a single quote when comparing with
// a non-string to do what the docs promise.
if (tv1->v_type == VAR_STRING) {
if (tv2->v_type != VAR_STRING || sortinfo->item_compare_numeric) {
- p1 = (char_u *)"'";
+ p1 = "'";
} else {
- p1 = tv1->vval.v_string;
+ p1 = (char *)tv1->vval.v_string;
}
} else {
- tofree1 = p1 = (char_u *) encode_tv2string(tv1, NULL);
+ tofree1 = p1 = encode_tv2string(tv1, NULL);
}
if (tv2->v_type == VAR_STRING) {
if (tv1->v_type != VAR_STRING || sortinfo->item_compare_numeric) {
- p2 = (char_u *)"'";
+ p2 = "'";
} else {
- p2 = tv2->vval.v_string;
+ p2 = (char *)tv2->vval.v_string;
}
} else {
- tofree2 = p2 = (char_u *) encode_tv2string(tv2, NULL);
+ tofree2 = p2 = encode_tv2string(tv2, NULL);
}
if (p1 == NULL) {
- p1 = (char_u *)"";
+ p1 = "";
}
if (p2 == NULL) {
- p2 = (char_u *)"";
+ p2 = "";
}
if (!sortinfo->item_compare_numeric) {
if (sortinfo->item_compare_ic) {
@@ -15244,19 +15307,22 @@ static int item_compare(const void *s1, const void *s2, bool keep_zero)
}
} else {
double n1, n2;
- n1 = strtod((char *)p1, (char **)&p1);
- n2 = strtod((char *)p2, (char **)&p2);
+ n1 = strtod(p1, &p1);
+ n2 = strtod(p2, &p2);
res = n1 == n2 ? 0 : n1 > n2 ? 1 : -1;
}
+ xfree(tofree1);
+ xfree(tofree2);
+
+item_compare_end:
// When the result would be zero, compare the item indexes. Makes the
// sort stable.
if (res == 0 && !keep_zero) {
+ // WARNING: When using uniq si1 and si2 are actually listitem_T **, no
+ // indexes are there.
res = si1->idx > si2->idx ? 1 : -1;
}
-
- xfree(tofree1);
- xfree(tofree2);
return res;
}
@@ -15272,46 +15338,56 @@ static int item_compare_not_keeping_zero(const void *s1, const void *s2)
static int item_compare2(const void *s1, const void *s2, bool keep_zero)
{
- sortItem_T *si1, *si2;
+ ListSortItem *si1, *si2;
int res;
typval_T rettv;
typval_T argv[3];
int dummy;
+ const char *func_name;
+ partial_T *partial = sortinfo->item_compare_partial;
// shortcut after failure in previous call; compare all items equal
if (sortinfo->item_compare_func_err) {
return 0;
}
- si1 = (sortItem_T *)s1;
- si2 = (sortItem_T *)s2;
+ si1 = (ListSortItem *)s1;
+ si2 = (ListSortItem *)s2;
+
+ if (partial == NULL) {
+ func_name = sortinfo->item_compare_func;
+ } else {
+ func_name = (const char *)partial_name(partial);
+ }
// Copy the values. This is needed to be able to set v_lock to VAR_FIXED
// in the copy without changing the original list items.
- copy_tv(&si1->item->li_tv, &argv[0]);
- copy_tv(&si2->item->li_tv, &argv[1]);
+ tv_copy(TV_LIST_ITEM_TV(si1->item), &argv[0]);
+ tv_copy(TV_LIST_ITEM_TV(si2->item), &argv[1]);
- rettv.v_type = VAR_UNKNOWN; // clear_tv() uses this
- res = call_func(sortinfo->item_compare_func,
- (int)STRLEN(sortinfo->item_compare_func),
- &rettv, 2, argv, 0L, 0L, &dummy, true,
- sortinfo->item_compare_selfdict);
- clear_tv(&argv[0]);
- clear_tv(&argv[1]);
+ rettv.v_type = VAR_UNKNOWN; // tv_clear() uses this
+ res = call_func((const char_u *)func_name,
+ (int)STRLEN(func_name),
+ &rettv, 2, argv, NULL, 0L, 0L, &dummy, true,
+ partial, sortinfo->item_compare_selfdict);
+ tv_clear(&argv[0]);
+ tv_clear(&argv[1]);
if (res == FAIL) {
res = ITEM_COMPARE_FAIL;
} else {
- res = get_tv_number_chk(&rettv, &sortinfo->item_compare_func_err);
+ res = tv_get_number_chk(&rettv, &sortinfo->item_compare_func_err);
}
if (sortinfo->item_compare_func_err) {
res = ITEM_COMPARE_FAIL; // return value has wrong type
}
- clear_tv(&rettv);
+ tv_clear(&rettv);
// When the result would be zero, compare the pointers themselves. Makes
// the sort stable.
if (res == 0 && !keep_zero) {
+ // WARNING: When using uniq si1 and si2 are actually listitem_T **, no
+ // indexes are there.
res = si1->idx > si2->idx ? 1 : -1;
}
@@ -15333,9 +15409,7 @@ static int item_compare2_not_keeping_zero(const void *s1, const void *s2)
*/
static void do_sort_uniq(typval_T *argvars, typval_T *rettv, bool sort)
{
- list_T *l;
- listitem_T *li;
- sortItem_T *ptrs;
+ ListSortItem *ptrs;
long len;
long i;
@@ -15345,23 +15419,20 @@ static void do_sort_uniq(typval_T *argvars, typval_T *rettv, bool sort)
sortinfo_T *old_sortinfo = sortinfo;
sortinfo = &info;
+ const char *const arg_errmsg = (sort
+ ? N_("sort() argument")
+ : N_("uniq() argument"));
+
if (argvars[0].v_type != VAR_LIST) {
EMSG2(_(e_listarg), sort ? "sort()" : "uniq()");
} else {
- l = argvars[0].vval.v_list;
- if (l == NULL
- || tv_check_lock(l->lv_lock,
- (char_u *)(sort
- ? N_("sort() argument")
- : N_("uniq() argument")),
- true)) {
- goto theend;
+ list_T *const l = argvars[0].vval.v_list;
+ if (tv_check_lock(tv_list_locked(l), arg_errmsg, TV_TRANSLATE)) {
+ goto theend;
}
- rettv->vval.v_list = l;
- rettv->v_type = VAR_LIST;
- ++l->lv_refcount;
+ tv_list_set_ret(rettv, l);
- len = list_len(l);
+ len = tv_list_len(l);
if (len <= 1) {
goto theend; // short list sorts pretty quickly
}
@@ -15371,23 +15442,26 @@ static void do_sort_uniq(typval_T *argvars, typval_T *rettv, bool sort)
info.item_compare_numbers = false;
info.item_compare_float = false;
info.item_compare_func = NULL;
+ info.item_compare_partial = NULL;
info.item_compare_selfdict = NULL;
if (argvars[1].v_type != VAR_UNKNOWN) {
/* optional second argument: {func} */
if (argvars[1].v_type == VAR_FUNC) {
- info.item_compare_func = argvars[1].vval.v_string;
+ info.item_compare_func = (const char *)argvars[1].vval.v_string;
+ } else if (argvars[1].v_type == VAR_PARTIAL) {
+ info.item_compare_partial = argvars[1].vval.v_partial;
} else {
- int error = FALSE;
+ bool error = false;
- i = get_tv_number_chk(&argvars[1], &error);
+ i = tv_get_number_chk(&argvars[1], &error);
if (error) {
goto theend; // type error; errmsg already given
}
if (i == 1) {
info.item_compare_ic = true;
} else if (argvars[1].v_type != VAR_NUMBER) {
- info.item_compare_func = get_tv_string(&argvars[1]);
+ info.item_compare_func = tv_get_string(&argvars[1]);
} else if (i != 0) {
EMSG(_(e_invarg));
goto theend;
@@ -15396,16 +15470,16 @@ static void do_sort_uniq(typval_T *argvars, typval_T *rettv, bool sort)
if (*info.item_compare_func == NUL) {
// empty string means default sort
info.item_compare_func = NULL;
- } else if (STRCMP(info.item_compare_func, "n") == 0) {
+ } else if (strcmp(info.item_compare_func, "n") == 0) {
info.item_compare_func = NULL;
info.item_compare_numeric = true;
- } else if (STRCMP(info.item_compare_func, "N") == 0) {
+ } else if (strcmp(info.item_compare_func, "N") == 0) {
info.item_compare_func = NULL;
info.item_compare_numbers = true;
- } else if (STRCMP(info.item_compare_func, "f") == 0) {
+ } else if (strcmp(info.item_compare_func, "f") == 0) {
info.item_compare_func = NULL;
info.item_compare_float = true;
- } else if (STRCMP(info.item_compare_func, "i") == 0) {
+ } else if (strcmp(info.item_compare_func, "i") == 0) {
info.item_compare_func = NULL;
info.item_compare_ic = true;
}
@@ -15422,77 +15496,45 @@ static void do_sort_uniq(typval_T *argvars, typval_T *rettv, bool sort)
}
}
- /* Make an array with each entry pointing to an item in the List. */
- ptrs = xmalloc((size_t)(len * sizeof (sortItem_T)));
+ // Make an array with each entry pointing to an item in the List.
+ ptrs = xmalloc((size_t)(len * sizeof(ListSortItem)));
- i = 0;
if (sort) {
- // sort(): ptrs will be the list to sort.
- for (li = l->lv_first; li != NULL; li = li->li_next) {
- ptrs[i].item = li;
- ptrs[i].idx = i;
- i++;
- }
-
info.item_compare_func_err = false;
- // Test the compare function.
- if (info.item_compare_func != NULL
- && item_compare2_not_keeping_zero(&ptrs[0], &ptrs[1])
- == ITEM_COMPARE_FAIL) {
+ tv_list_item_sort(l, ptrs,
+ ((info.item_compare_func == NULL
+ && info.item_compare_partial == NULL)
+ ? item_compare_not_keeping_zero
+ : item_compare2_not_keeping_zero),
+ &info.item_compare_func_err);
+ if (info.item_compare_func_err) {
EMSG(_("E702: Sort compare function failed"));
- } else {
- // Sort the array with item pointers.
- qsort(ptrs, (size_t)len, sizeof (sortItem_T),
- (info.item_compare_func == NULL ?
- item_compare_not_keeping_zero :
- item_compare2_not_keeping_zero));
-
- if (!info.item_compare_func_err) {
- // Clear the list and append the items in the sorted order.
- l->lv_first = NULL;
- l->lv_last = NULL;
- l->lv_idx_item = NULL;
- l->lv_len = 0;
-
- for (i = 0; i < len; i++) {
- list_append(l, ptrs[i].item);
- }
- }
}
} else {
- int (*item_compare_func_ptr)(const void *, const void *);
+ ListSorter item_compare_func_ptr;
// f_uniq(): ptrs will be a stack of items to remove.
info.item_compare_func_err = false;
- if (info.item_compare_func != NULL) {
- item_compare_func_ptr = item_compare2_keeping_zero;
+ if (info.item_compare_func != NULL
+ || info.item_compare_partial != NULL) {
+ item_compare_func_ptr = item_compare2_keeping_zero;
} else {
- item_compare_func_ptr = item_compare_keeping_zero;
- }
-
- for (li = l->lv_first; li != NULL && li->li_next != NULL; li = li->li_next) {
- if (item_compare_func_ptr(&li, &li->li_next) == 0) {
- ptrs[i++].item = li;
- }
- if (info.item_compare_func_err) {
- EMSG(_("E882: Uniq compare function failed"));
- break;
- }
+ item_compare_func_ptr = item_compare_keeping_zero;
}
- if (!info.item_compare_func_err) {
- while (--i >= 0) {
- assert(ptrs[i].item->li_next);
- li = ptrs[i].item->li_next;
- ptrs[i].item->li_next = li->li_next;
- if (li->li_next != NULL) {
- li->li_next->li_prev = ptrs[i].item;
- } else {
- l->lv_last = ptrs[i].item;
+ int idx = 0;
+ for (listitem_T *li = TV_LIST_ITEM_NEXT(l, tv_list_first(l))
+ ; li != NULL;) {
+ listitem_T *const prev_li = TV_LIST_ITEM_PREV(l, li);
+ if (item_compare_func_ptr(&prev_li, &li) == 0) {
+ if (info.item_compare_func_err) { // -V547
+ EMSG(_("E882: Uniq compare function failed"));
+ break;
}
- list_fix_watch(l, li);
- listitem_free(li);
- l->lv_len--;
+ li = tv_list_item_remove(l, li);
+ } else {
+ idx++;
+ li = TV_LIST_ITEM_NEXT(l, li);
}
}
}
@@ -15505,13 +15547,46 @@ theend:
}
/// "sort"({list})" function
-static void f_sort(typval_T *argvars, typval_T *rettv)
+static void f_sort(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
do_sort_uniq(argvars, rettv, true);
}
+/// "stdioopen()" function
+static void f_stdioopen(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ if (argvars[0].v_type != VAR_DICT) {
+ EMSG(_(e_invarg));
+ return;
+ }
+
+
+ bool rpc = false;
+ CallbackReader on_stdin = CALLBACK_READER_INIT;
+ dict_T *opts = argvars[0].vval.v_dict;
+ rpc = tv_dict_get_number(opts, "rpc") != 0;
+
+ if (!tv_dict_get_callback(opts, S_LEN("on_stdin"), &on_stdin.cb)) {
+ return;
+ }
+ on_stdin.buffered = tv_dict_get_number(opts, "stdin_buffered");
+ if (on_stdin.buffered && on_stdin.cb.type == kCallbackNone) {
+ on_stdin.self = opts;
+ }
+
+ const char *error;
+ uint64_t id = channel_from_stdio(rpc, on_stdin, &error);
+ if (!id) {
+ EMSG2(e_stdiochan2, error);
+ }
+
+
+ rettv->vval.v_number = (varnumber_T)id;
+ rettv->v_type = VAR_NUMBER;
+}
+
/// "uniq({list})" function
-static void f_uniq(typval_T *argvars, typval_T *rettv)
+static void f_uniq(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
do_sort_uniq(argvars, rettv, false);
}
@@ -15519,7 +15594,7 @@ static void f_uniq(typval_T *argvars, typval_T *rettv)
//
// "reltimefloat()" function
//
-static void f_reltimefloat(typval_T *argvars , typval_T *rettv)
+static void f_reltimefloat(typval_T *argvars , typval_T *rettv, FunPtr fptr)
FUNC_ATTR_NONNULL_ALL
{
proftime_T tm;
@@ -15534,39 +15609,37 @@ static void f_reltimefloat(typval_T *argvars , typval_T *rettv)
/*
* "soundfold({word})" function
*/
-static void f_soundfold(typval_T *argvars, typval_T *rettv)
+static void f_soundfold(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *s;
-
rettv->v_type = VAR_STRING;
- s = get_tv_string(&argvars[0]);
- rettv->vval.v_string = eval_soundfold(s);
+ const char *const s = tv_get_string(&argvars[0]);
+ rettv->vval.v_string = (char_u *)eval_soundfold(s);
}
/*
* "spellbadword()" function
*/
-static void f_spellbadword(typval_T *argvars, typval_T *rettv)
+static void f_spellbadword(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *word = (char_u *)"";
+ const char *word = "";
hlf_T attr = HLF_COUNT;
size_t len = 0;
- rettv_list_alloc(rettv);
-
if (argvars[0].v_type == VAR_UNKNOWN) {
- /* Find the start and length of the badly spelled word. */
- len = spell_move_to(curwin, FORWARD, TRUE, TRUE, &attr);
- if (len != 0)
- word = get_cursor_pos_ptr();
+ // Find the start and length of the badly spelled word.
+ len = spell_move_to(curwin, FORWARD, true, true, &attr);
+ if (len != 0) {
+ word = (char *)get_cursor_pos_ptr();
+ curwin->w_set_curswant = true;
+ }
} else if (curwin->w_p_spell && *curbuf->b_s.b_p_spl != NUL) {
- char_u *str = get_tv_string_chk(&argvars[0]);
+ const char *str = tv_get_string_chk(&argvars[0]);
int capcol = -1;
if (str != NULL) {
- /* Check the argument for spelling. */
+ // Check the argument for spelling.
while (*str != NUL) {
- len = spell_check(curwin, str, &attr, &capcol, false);
+ len = spell_check(curwin, (char_u *)str, &attr, &capcol, false);
if (attr != HLF_COUNT) {
word = str;
break;
@@ -15577,119 +15650,125 @@ static void f_spellbadword(typval_T *argvars, typval_T *rettv)
}
assert(len <= INT_MAX);
- list_append_string(rettv->vval.v_list, word, (int)len);
- list_append_string(rettv->vval.v_list,
- (char_u *)(attr == HLF_SPB ? "bad" :
- attr == HLF_SPR ? "rare" :
- attr == HLF_SPL ? "local" :
- attr == HLF_SPC ? "caps" :
- ""),
- -1);
+ tv_list_alloc_ret(rettv, 2);
+ tv_list_append_string(rettv->vval.v_list, word, len);
+ tv_list_append_string(rettv->vval.v_list,
+ (attr == HLF_SPB ? "bad"
+ : attr == HLF_SPR ? "rare"
+ : attr == HLF_SPL ? "local"
+ : attr == HLF_SPC ? "caps"
+ : NULL), -1);
}
/*
* "spellsuggest()" function
*/
-static void f_spellsuggest(typval_T *argvars, typval_T *rettv)
+static void f_spellsuggest(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *str;
- int typeerr = FALSE;
+ bool typeerr = false;
int maxcount;
- garray_T ga;
- listitem_T *li;
+ garray_T ga = GA_EMPTY_INIT_VALUE;
bool need_capital = false;
- rettv_list_alloc(rettv);
-
if (curwin->w_p_spell && *curwin->w_s->b_p_spl != NUL) {
- str = get_tv_string(&argvars[0]);
+ const char *const str = tv_get_string(&argvars[0]);
if (argvars[1].v_type != VAR_UNKNOWN) {
- maxcount = get_tv_number_chk(&argvars[1], &typeerr);
- if (maxcount <= 0)
- return;
+ maxcount = tv_get_number_chk(&argvars[1], &typeerr);
+ if (maxcount <= 0) {
+ goto f_spellsuggest_return;
+ }
if (argvars[2].v_type != VAR_UNKNOWN) {
- need_capital = get_tv_number_chk(&argvars[2], &typeerr);
- if (typeerr)
- return;
+ need_capital = tv_get_number_chk(&argvars[2], &typeerr);
+ if (typeerr) {
+ goto f_spellsuggest_return;
+ }
}
- } else
+ } else {
maxcount = 25;
+ }
- spell_suggest_list(&ga, str, maxcount, need_capital, false);
-
- for (int i = 0; i < ga.ga_len; ++i) {
- str = ((char_u **)ga.ga_data)[i];
+ spell_suggest_list(&ga, (char_u *)str, maxcount, need_capital, false);
+ }
- li = listitem_alloc();
- li->li_tv.v_type = VAR_STRING;
- li->li_tv.v_lock = 0;
- li->li_tv.vval.v_string = str;
- list_append(rettv->vval.v_list, li);
- }
- ga_clear(&ga);
+f_spellsuggest_return:
+ tv_list_alloc_ret(rettv, (ptrdiff_t)ga.ga_len);
+ for (int i = 0; i < ga.ga_len; i++) {
+ char *const p = ((char **)ga.ga_data)[i];
+ tv_list_append_allocated_string(rettv->vval.v_list, p);
}
+ ga_clear(&ga);
}
-static void f_split(typval_T *argvars, typval_T *rettv)
+static void f_split(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *str;
- char_u *end;
- char_u *pat = NULL;
- regmatch_T regmatch;
- char_u patbuf[NUMBUFLEN];
char_u *save_cpo;
int match;
colnr_T col = 0;
- int keepempty = FALSE;
- int typeerr = FALSE;
+ bool keepempty = false;
+ bool typeerr = false;
/* Make 'cpoptions' empty, the 'l' flag should not be used here. */
save_cpo = p_cpo;
p_cpo = (char_u *)"";
- str = get_tv_string(&argvars[0]);
+ const char *str = tv_get_string(&argvars[0]);
+ const char *pat = NULL;
+ char patbuf[NUMBUFLEN];
if (argvars[1].v_type != VAR_UNKNOWN) {
- pat = get_tv_string_buf_chk(&argvars[1], patbuf);
- if (pat == NULL)
- typeerr = TRUE;
- if (argvars[2].v_type != VAR_UNKNOWN)
- keepempty = get_tv_number_chk(&argvars[2], &typeerr);
+ pat = tv_get_string_buf_chk(&argvars[1], patbuf);
+ if (pat == NULL) {
+ typeerr = true;
+ }
+ if (argvars[2].v_type != VAR_UNKNOWN) {
+ keepempty = (bool)tv_get_number_chk(&argvars[2], &typeerr);
+ }
+ }
+ if (pat == NULL || *pat == NUL) {
+ pat = "[\\x01- ]\\+";
}
- if (pat == NULL || *pat == NUL)
- pat = (char_u *)"[\\x01- ]\\+";
- rettv_list_alloc(rettv);
+ tv_list_alloc_ret(rettv, kListLenMayKnow);
- if (typeerr)
+ if (typeerr) {
return;
+ }
- regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING);
+ regmatch_T regmatch = {
+ .regprog = vim_regcomp((char_u *)pat, RE_MAGIC + RE_STRING),
+ .startp = { NULL },
+ .endp = { NULL },
+ .rm_ic = false,
+ };
if (regmatch.regprog != NULL) {
- regmatch.rm_ic = FALSE;
while (*str != NUL || keepempty) {
- if (*str == NUL)
- match = FALSE; /* empty item at the end */
- else
- match = vim_regexec_nl(&regmatch, str, col);
- if (match)
- end = regmatch.startp[0];
- else
- end = str + STRLEN(str);
- if (keepempty || end > str || (rettv->vval.v_list->lv_len > 0
- && *str != NUL && match && end <
- regmatch.endp[0])) {
- list_append_string(rettv->vval.v_list, str, (int)(end - str));
+ if (*str == NUL) {
+ match = false; // Empty item at the end.
+ } else {
+ match = vim_regexec_nl(&regmatch, (char_u *)str, col);
+ }
+ const char *end;
+ if (match) {
+ end = (const char *)regmatch.startp[0];
+ } else {
+ end = str + strlen(str);
}
- if (!match)
+ if (keepempty || end > str || (tv_list_len(rettv->vval.v_list) > 0
+ && *str != NUL
+ && match
+ && end < (const char *)regmatch.endp[0])) {
+ tv_list_append_string(rettv->vval.v_list, str, end - str);
+ }
+ if (!match) {
break;
- /* Advance to just after the match. */
- if (regmatch.endp[0] > str)
+ }
+ // Advance to just after the match.
+ if (regmatch.endp[0] > (char_u *)str) {
col = 0;
- else {
- /* Don't get stuck at the same match. */
+ } else {
+ // Don't get stuck at the same match.
col = (*mb_ptr2len)(regmatch.endp[0]);
}
- str = regmatch.endp[0];
+ str = (const char *)regmatch.endp[0];
}
vim_regfree(regmatch.regprog);
@@ -15698,80 +15777,137 @@ static void f_split(typval_T *argvars, typval_T *rettv)
p_cpo = save_cpo;
}
-/*
- * "sqrt()" function
- */
-static void f_sqrt(typval_T *argvars, typval_T *rettv)
+/// "stdpath()" helper for list results
+static void get_xdg_var_list(const XDGVarType xdg, typval_T *rettv)
+ FUNC_ATTR_NONNULL_ALL
{
- float_op_wrapper(argvars, rettv, &sqrt);
+ const void *iter = NULL;
+ list_T *const list = tv_list_alloc(kListLenShouldKnow);
+ rettv->v_type = VAR_LIST;
+ rettv->vval.v_list = list;
+ tv_list_ref(list);
+ char *const dirs = stdpaths_get_xdg_var(xdg);
+ if (dirs == NULL) {
+ return;
+ }
+ do {
+ size_t dir_len;
+ const char *dir;
+ iter = vim_env_iter(':', dirs, iter, &dir, &dir_len);
+ if (dir != NULL && dir_len > 0) {
+ char *dir_with_nvim = xmemdupz(dir, dir_len);
+ dir_with_nvim = concat_fnames_realloc(dir_with_nvim, "nvim", true);
+ tv_list_append_string(list, dir_with_nvim, strlen(dir_with_nvim));
+ xfree(dir_with_nvim);
+ }
+ } while (iter != NULL);
+ xfree(dirs);
+}
+
+/// "stdpath(type)" function
+static void f_stdpath(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = NULL;
+
+ const char *const p = tv_get_string_chk(&argvars[0]);
+ if (p == NULL) {
+ return; // Type error; errmsg already given.
+ }
+
+ if (strequal(p, "config")) {
+ rettv->vval.v_string = (char_u *)get_xdg_home(kXDGConfigHome);
+ } else if (strequal(p, "data")) {
+ rettv->vval.v_string = (char_u *)get_xdg_home(kXDGDataHome);
+ } else if (strequal(p, "cache")) {
+ rettv->vval.v_string = (char_u *)get_xdg_home(kXDGCacheHome);
+ } else if (strequal(p, "config_dirs")) {
+ get_xdg_var_list(kXDGConfigDirs, rettv);
+ } else if (strequal(p, "data_dirs")) {
+ get_xdg_var_list(kXDGDataDirs, rettv);
+ } else {
+ EMSG2(_("E6100: \"%s\" is not a valid stdpath"), p);
+ }
}
/*
* "str2float()" function
*/
-static void f_str2float(typval_T *argvars, typval_T *rettv)
+static void f_str2float(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *p = skipwhite(get_tv_string(&argvars[0]));
+ char_u *p = skipwhite((const char_u *)tv_get_string(&argvars[0]));
+ bool isneg = (*p == '-');
- if (*p == '+')
+ if (*p == '+' || *p == '-') {
p = skipwhite(p + 1);
- (void) string2float((char *) p, &rettv->vval.v_float);
+ }
+ (void)string2float((char *)p, &rettv->vval.v_float);
+ if (isneg) {
+ rettv->vval.v_float *= -1;
+ }
rettv->v_type = VAR_FLOAT;
}
// "str2nr()" function
-static void f_str2nr(typval_T *argvars, typval_T *rettv)
+static void f_str2nr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
int base = 10;
- char_u *p;
- long n;
+ varnumber_T n;
int what;
if (argvars[1].v_type != VAR_UNKNOWN) {
- base = get_tv_number(&argvars[1]);
+ base = tv_get_number(&argvars[1]);
if (base != 2 && base != 8 && base != 10 && base != 16) {
EMSG(_(e_invarg));
return;
}
}
- p = skipwhite(get_tv_string(&argvars[0]));
- if (*p == '+') {
+ char_u *p = skipwhite((const char_u *)tv_get_string(&argvars[0]));
+ bool isneg = (*p == '-');
+ if (*p == '+' || *p == '-') {
p = skipwhite(p + 1);
}
switch (base) {
- case 2:
- what = STR2NR_BIN + STR2NR_FORCE;
+ case 2: {
+ what = STR2NR_BIN | STR2NR_FORCE;
break;
- case 8:
- what = STR2NR_OCT + STR2NR_FORCE;
+ }
+ case 8: {
+ what = STR2NR_OCT | STR2NR_FORCE;
break;
- case 16:
- what = STR2NR_HEX + STR2NR_FORCE;
+ }
+ case 16: {
+ what = STR2NR_HEX | STR2NR_FORCE;
break;
- default:
+ }
+ default: {
what = 0;
+ }
}
vim_str2nr(p, NULL, NULL, what, &n, NULL, 0);
- rettv->vval.v_number = n;
+ if (isneg) {
+ rettv->vval.v_number = -n;
+ } else {
+ rettv->vval.v_number = n;
+ }
}
/*
* "strftime({format}[, {time}])" function
*/
-static void f_strftime(typval_T *argvars, typval_T *rettv)
+static void f_strftime(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u result_buf[256];
time_t seconds;
- char_u *p;
rettv->v_type = VAR_STRING;
- p = get_tv_string(&argvars[0]);
- if (argvars[1].v_type == VAR_UNKNOWN)
+ char *p = (char *)tv_get_string(&argvars[0]);
+ if (argvars[1].v_type == VAR_UNKNOWN) {
seconds = time(NULL);
- else
- seconds = (time_t)get_tv_number(&argvars[1]);
+ } else {
+ seconds = (time_t)tv_get_number(&argvars[1]);
+ }
struct tm curtime;
struct tm *curtime_ptr = os_localtime_r(&seconds, &curtime);
@@ -15785,65 +15921,98 @@ static void f_strftime(typval_T *argvars, typval_T *rettv)
conv.vc_type = CONV_NONE;
enc = enc_locale();
convert_setup(&conv, p_enc, enc);
- if (conv.vc_type != CONV_NONE)
- p = string_convert(&conv, p, NULL);
- if (p != NULL)
- (void)strftime((char *)result_buf, sizeof(result_buf),
- (char *)p, curtime_ptr);
- else
+ if (conv.vc_type != CONV_NONE) {
+ p = (char *)string_convert(&conv, (char_u *)p, NULL);
+ }
+ char result_buf[256];
+ if (p != NULL) {
+ (void)strftime(result_buf, sizeof(result_buf), p, curtime_ptr);
+ } else {
result_buf[0] = NUL;
+ }
- if (conv.vc_type != CONV_NONE)
+ if (conv.vc_type != CONV_NONE) {
xfree(p);
+ }
convert_setup(&conv, enc, p_enc);
- if (conv.vc_type != CONV_NONE)
- rettv->vval.v_string = string_convert(&conv, result_buf, NULL);
- else
- rettv->vval.v_string = vim_strsave(result_buf);
+ if (conv.vc_type != CONV_NONE) {
+ rettv->vval.v_string = string_convert(&conv, (char_u *)result_buf, NULL);
+ } else {
+ rettv->vval.v_string = (char_u *)xstrdup(result_buf);
+ }
- /* Release conversion descriptors */
+ // Release conversion descriptors.
convert_setup(&conv, NULL, NULL);
xfree(enc);
}
}
+// "strgetchar()" function
+static void f_strgetchar(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ rettv->vval.v_number = -1;
+
+ const char *const str = tv_get_string_chk(&argvars[0]);
+ if (str == NULL) {
+ return;
+ }
+ bool error = false;
+ varnumber_T charidx = tv_get_number_chk(&argvars[1], &error);
+ if (error) {
+ return;
+ }
+
+ const size_t len = STRLEN(str);
+ size_t byteidx = 0;
+
+ while (charidx >= 0 && byteidx < len) {
+ if (charidx == 0) {
+ rettv->vval.v_number = utf_ptr2char((const char_u *)str + byteidx);
+ break;
+ }
+ charidx--;
+ byteidx += MB_CPTR2LEN((const char_u *)str + byteidx);
+ }
+}
+
/*
* "stridx()" function
*/
-static void f_stridx(typval_T *argvars, typval_T *rettv)
+static void f_stridx(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u buf[NUMBUFLEN];
- char_u *needle;
- char_u *haystack;
- char_u *save_haystack;
- char_u *pos;
- int start_idx;
-
- needle = get_tv_string_chk(&argvars[1]);
- save_haystack = haystack = get_tv_string_buf_chk(&argvars[0], buf);
rettv->vval.v_number = -1;
- if (needle == NULL || haystack == NULL)
- return; /* type error; errmsg already given */
+
+ char buf[NUMBUFLEN];
+ const char *const needle = tv_get_string_chk(&argvars[1]);
+ const char *haystack = tv_get_string_buf_chk(&argvars[0], buf);
+ const char *const haystack_start = haystack;
+ if (needle == NULL || haystack == NULL) {
+ return; // Type error; errmsg already given.
+ }
if (argvars[2].v_type != VAR_UNKNOWN) {
- int error = FALSE;
+ bool error = false;
- start_idx = get_tv_number_chk(&argvars[2], &error);
- if (error || start_idx >= (int)STRLEN(haystack))
+ const ptrdiff_t start_idx = (ptrdiff_t)tv_get_number_chk(&argvars[2],
+ &error);
+ if (error || start_idx >= (ptrdiff_t)strlen(haystack)) {
return;
- if (start_idx >= 0)
+ }
+ if (start_idx >= 0) {
haystack += start_idx;
+ }
}
- pos = (char_u *)strstr((char *)haystack, (char *)needle);
- if (pos != NULL)
- rettv->vval.v_number = (varnumber_T)(pos - save_haystack);
+ const char *pos = strstr(haystack, needle);
+ if (pos != NULL) {
+ rettv->vval.v_number = (varnumber_T)(pos - haystack_start);
+ }
}
/*
* "string()" function
*/
-static void f_string(typval_T *argvars, typval_T *rettv)
+static void f_string(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_STRING;
rettv->vval.v_string = (char_u *) encode_tv2string(&argvars[0], NULL);
@@ -15852,32 +16021,31 @@ static void f_string(typval_T *argvars, typval_T *rettv)
/*
* "strlen()" function
*/
-static void f_strlen(typval_T *argvars, typval_T *rettv)
+static void f_strlen(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- rettv->vval.v_number = (varnumber_T)(STRLEN(
- get_tv_string(&argvars[0])));
+ rettv->vval.v_number = (varnumber_T)strlen(tv_get_string(&argvars[0]));
}
/*
* "strchars()" function
*/
-static void f_strchars(typval_T *argvars, typval_T *rettv)
+static void f_strchars(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *s = get_tv_string(&argvars[0]);
+ const char *s = tv_get_string(&argvars[0]);
int skipcc = 0;
varnumber_T len = 0;
- int (*func_mb_ptr2char_adv)(char_u **pp);
+ int (*func_mb_ptr2char_adv)(const char_u **pp);
if (argvars[1].v_type != VAR_UNKNOWN) {
- skipcc = get_tv_number_chk(&argvars[1], NULL);
+ skipcc = tv_get_number_chk(&argvars[1], NULL);
}
if (skipcc < 0 || skipcc > 1) {
EMSG(_(e_invarg));
} else {
func_mb_ptr2char_adv = skipcc ? mb_ptr2char_adv : mb_cptr2char_adv;
while (*s != NUL) {
- func_mb_ptr2char_adv(&s);
- ++len;
+ func_mb_ptr2char_adv((const char_u **)&s);
+ len++;
}
rettv->vval.v_number = len;
}
@@ -15886,139 +16054,197 @@ static void f_strchars(typval_T *argvars, typval_T *rettv)
/*
* "strdisplaywidth()" function
*/
-static void f_strdisplaywidth(typval_T *argvars, typval_T *rettv)
+static void f_strdisplaywidth(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *s = get_tv_string(&argvars[0]);
+ const char *const s = tv_get_string(&argvars[0]);
int col = 0;
- if (argvars[1].v_type != VAR_UNKNOWN)
- col = get_tv_number(&argvars[1]);
+ if (argvars[1].v_type != VAR_UNKNOWN) {
+ col = tv_get_number(&argvars[1]);
+ }
- rettv->vval.v_number = (varnumber_T)(linetabsize_col(col, s) - col);
+ rettv->vval.v_number = (varnumber_T)(linetabsize_col(col, (char_u *)s) - col);
}
/*
* "strwidth()" function
*/
-static void f_strwidth(typval_T *argvars, typval_T *rettv)
+static void f_strwidth(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *s = get_tv_string(&argvars[0]);
+ const char *const s = tv_get_string(&argvars[0]);
- rettv->vval.v_number = (varnumber_T) mb_string2cells(s);
+ rettv->vval.v_number = (varnumber_T)mb_string2cells((const char_u *)s);
+}
+
+// "strcharpart()" function
+static void f_strcharpart(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ const char *const p = tv_get_string(&argvars[0]);
+ const size_t slen = STRLEN(p);
+
+ int nbyte = 0;
+ bool error = false;
+ varnumber_T nchar = tv_get_number_chk(&argvars[1], &error);
+ if (!error) {
+ if (nchar > 0) {
+ while (nchar > 0 && (size_t)nbyte < slen) {
+ nbyte += MB_CPTR2LEN((const char_u *)p + nbyte);
+ nchar--;
+ }
+ } else {
+ nbyte = nchar;
+ }
+ }
+ int len = 0;
+ if (argvars[2].v_type != VAR_UNKNOWN) {
+ int charlen = tv_get_number(&argvars[2]);
+ while (charlen > 0 && nbyte + len < (int)slen) {
+ int off = nbyte + len;
+
+ if (off < 0) {
+ len += 1;
+ } else {
+ len += (size_t)MB_CPTR2LEN((const char_u *)p + off);
+ }
+ charlen--;
+ }
+ } else {
+ len = slen - nbyte; // default: all bytes that are available.
+ }
+
+ // Only return the overlap between the specified part and the actual
+ // string.
+ if (nbyte < 0) {
+ len += nbyte;
+ nbyte = 0;
+ } else if ((size_t)nbyte > slen) {
+ nbyte = slen;
+ }
+ if (len < 0) {
+ len = 0;
+ } else if (nbyte + len > (int)slen) {
+ len = slen - nbyte;
+ }
+
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = (char_u *)xstrndup(p + nbyte, (size_t)len);
}
/*
* "strpart()" function
*/
-static void f_strpart(typval_T *argvars, typval_T *rettv)
+static void f_strpart(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *p;
- int n;
- int len;
- int slen;
- int error = FALSE;
+ bool error = false;
- p = get_tv_string(&argvars[0]);
- slen = (int)STRLEN(p);
+ const char *const p = tv_get_string(&argvars[0]);
+ const size_t slen = strlen(p);
- n = get_tv_number_chk(&argvars[1], &error);
- if (error)
+ varnumber_T n = tv_get_number_chk(&argvars[1], &error);
+ varnumber_T len;
+ if (error) {
len = 0;
- else if (argvars[2].v_type != VAR_UNKNOWN)
- len = get_tv_number(&argvars[2]);
- else
- len = slen - n; /* default len: all bytes that are available. */
+ } else if (argvars[2].v_type != VAR_UNKNOWN) {
+ len = tv_get_number(&argvars[2]);
+ } else {
+ len = slen - n; // Default len: all bytes that are available.
+ }
- /*
- * Only return the overlap between the specified part and the actual
- * string.
- */
+ // Only return the overlap between the specified part and the actual
+ // string.
if (n < 0) {
len += n;
n = 0;
- } else if (n > slen)
+ } else if (n > (varnumber_T)slen) {
n = slen;
- if (len < 0)
+ }
+ if (len < 0) {
len = 0;
- else if (n + len > slen)
+ } else if (n + len > (varnumber_T)slen) {
len = slen - n;
+ }
rettv->v_type = VAR_STRING;
- rettv->vval.v_string = vim_strnsave(p + n, len);
+ rettv->vval.v_string = (char_u *)xmemdupz(p + n, (size_t)len);
}
/*
* "strridx()" function
*/
-static void f_strridx(typval_T *argvars, typval_T *rettv)
+static void f_strridx(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u buf[NUMBUFLEN];
- char_u *needle;
- char_u *haystack;
- char_u *rest;
- char_u *lastmatch = NULL;
- int haystack_len, end_idx;
-
- needle = get_tv_string_chk(&argvars[1]);
- haystack = get_tv_string_buf_chk(&argvars[0], buf);
+ char buf[NUMBUFLEN];
+ const char *const needle = tv_get_string_chk(&argvars[1]);
+ const char *const haystack = tv_get_string_buf_chk(&argvars[0], buf);
rettv->vval.v_number = -1;
- if (needle == NULL || haystack == NULL)
- return; /* type error; errmsg already given */
+ if (needle == NULL || haystack == NULL) {
+ return; // Type error; errmsg already given.
+ }
- haystack_len = (int)STRLEN(haystack);
+ const size_t haystack_len = STRLEN(haystack);
+ ptrdiff_t end_idx;
if (argvars[2].v_type != VAR_UNKNOWN) {
- /* Third argument: upper limit for index */
- end_idx = get_tv_number_chk(&argvars[2], NULL);
- if (end_idx < 0)
- return; /* can never find a match */
- } else
- end_idx = haystack_len;
+ // Third argument: upper limit for index.
+ end_idx = (ptrdiff_t)tv_get_number_chk(&argvars[2], NULL);
+ if (end_idx < 0) {
+ return; // Can never find a match.
+ }
+ } else {
+ end_idx = (ptrdiff_t)haystack_len;
+ }
+ const char *lastmatch = NULL;
if (*needle == NUL) {
- /* Empty string matches past the end. */
+ // Empty string matches past the end.
lastmatch = haystack + end_idx;
} else {
- for (rest = haystack; *rest != NUL; ++rest) {
- rest = (char_u *)strstr((char *)rest, (char *)needle);
- if (rest == NULL || rest > haystack + end_idx)
+ for (const char *rest = haystack; *rest != NUL; rest++) {
+ rest = strstr(rest, needle);
+ if (rest == NULL || rest > haystack + end_idx) {
break;
+ }
lastmatch = rest;
}
}
- if (lastmatch == NULL)
+ if (lastmatch == NULL) {
rettv->vval.v_number = -1;
- else
+ } else {
rettv->vval.v_number = (varnumber_T)(lastmatch - haystack);
+ }
}
/*
* "strtrans()" function
*/
-static void f_strtrans(typval_T *argvars, typval_T *rettv)
+static void f_strtrans(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_STRING;
- rettv->vval.v_string = transstr(get_tv_string(&argvars[0]));
+ rettv->vval.v_string = (char_u *)transstr(tv_get_string(&argvars[0]));
}
/*
* "submatch()" function
*/
-static void f_submatch(typval_T *argvars, typval_T *rettv)
+static void f_submatch(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- int error = FALSE;
- int no = (int)get_tv_number_chk(&argvars[0], &error);
+ bool error = false;
+ int no = (int)tv_get_number_chk(&argvars[0], &error);
if (error) {
return;
}
+ if (no < 0 || no >= NSUBEXP) {
+ emsgf(_("E935: invalid submatch number: %d"), no);
+ return;
+ }
int retList = 0;
if (argvars[1].v_type != VAR_UNKNOWN) {
- retList = get_tv_number_chk(&argvars[1], &error);
+ retList = tv_get_number_chk(&argvars[1], &error);
if (error) {
- return;
+ return;
}
}
@@ -16034,42 +16260,49 @@ static void f_submatch(typval_T *argvars, typval_T *rettv)
/*
* "substitute()" function
*/
-static void f_substitute(typval_T *argvars, typval_T *rettv)
+static void f_substitute(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u patbuf[NUMBUFLEN];
- char_u subbuf[NUMBUFLEN];
- char_u flagsbuf[NUMBUFLEN];
+ char patbuf[NUMBUFLEN];
+ char subbuf[NUMBUFLEN];
+ char flagsbuf[NUMBUFLEN];
+
+ const char *const str = tv_get_string_chk(&argvars[0]);
+ const char *const pat = tv_get_string_buf_chk(&argvars[1], patbuf);
+ const char *sub = NULL;
+ const char *const flg = tv_get_string_buf_chk(&argvars[3], flagsbuf);
- char_u *str = get_tv_string_chk(&argvars[0]);
- char_u *pat = get_tv_string_buf_chk(&argvars[1], patbuf);
- char_u *sub = get_tv_string_buf_chk(&argvars[2], subbuf);
- char_u *flg = get_tv_string_buf_chk(&argvars[3], flagsbuf);
+ typval_T *expr = NULL;
+ if (tv_is_func(argvars[2])) {
+ expr = &argvars[2];
+ } else {
+ sub = tv_get_string_buf_chk(&argvars[2], subbuf);
+ }
rettv->v_type = VAR_STRING;
- if (str == NULL || pat == NULL || sub == NULL || flg == NULL)
+ if (str == NULL || pat == NULL || (sub == NULL && expr == NULL)
+ || flg == NULL) {
rettv->vval.v_string = NULL;
- else
- rettv->vval.v_string = do_string_sub(str, pat, sub, flg);
+ } else {
+ rettv->vval.v_string = do_string_sub((char_u *)str, (char_u *)pat,
+ (char_u *)sub, expr, (char_u *)flg);
+ }
}
-/*
- * "synID(lnum, col, trans)" function
- */
-static void f_synID(typval_T *argvars, typval_T *rettv)
+/// "synID(lnum, col, trans)" function
+static void f_synID(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- int id = 0;
- long lnum;
- long col;
- int trans;
- int transerr = FALSE;
+ // -1 on type error (both)
+ const linenr_T lnum = tv_get_lnum(argvars);
+ const colnr_T col = (colnr_T)tv_get_number(&argvars[1]) - 1;
- lnum = get_tv_lnum(argvars); /* -1 on type error */
- col = get_tv_number(&argvars[1]) - 1; /* -1 on type error */
- trans = get_tv_number_chk(&argvars[2], &transerr);
+ bool transerr = false;
+ const int trans = tv_get_number_chk(&argvars[2], &transerr);
+ int id = 0;
if (!transerr && lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count
- && col >= 0 && col < (long)STRLEN(ml_get(lnum)))
- id = syn_get_id(curwin, lnum, (colnr_T)col, trans, NULL, FALSE);
+ && col >= 0 && (size_t)col < STRLEN(ml_get(lnum))) {
+ id = syn_get_id(curwin, lnum, col, trans, NULL, false);
+ }
rettv->vval.v_number = id;
}
@@ -16077,22 +16310,18 @@ static void f_synID(typval_T *argvars, typval_T *rettv)
/*
* "synIDattr(id, what [, mode])" function
*/
-static void f_synIDattr(typval_T *argvars, typval_T *rettv)
+static void f_synIDattr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *p = NULL;
- int id;
- char_u *what;
- char_u *mode;
- char_u modebuf[NUMBUFLEN];
+ const int id = (int)tv_get_number(&argvars[0]);
+ const char *const what = tv_get_string(&argvars[1]);
int modec;
-
- id = get_tv_number(&argvars[0]);
- what = get_tv_string(&argvars[1]);
if (argvars[2].v_type != VAR_UNKNOWN) {
- mode = get_tv_string_buf(&argvars[2], modebuf);
+ char modebuf[NUMBUFLEN];
+ const char *const mode = tv_get_string_buf(&argvars[2], modebuf);
modec = TOLOWER_ASC(mode[0]);
- if (modec != 'c' && modec != 'g')
- modec = 0; /* replace invalid with current */
+ if (modec != 'c' && modec != 'g') {
+ modec = 0; // Replace invalid with current.
+ }
} else if (ui_rgb_attached()) {
modec = 'g';
} else {
@@ -16100,69 +16329,70 @@ static void f_synIDattr(typval_T *argvars, typval_T *rettv)
}
+ const char *p = NULL;
switch (TOLOWER_ASC(what[0])) {
- case 'b':
- if (TOLOWER_ASC(what[1]) == 'g') /* bg[#] */
+ case 'b': {
+ if (TOLOWER_ASC(what[1]) == 'g') { // bg[#]
+ p = highlight_color(id, what, modec);
+ } else { // bold
+ p = highlight_has_attr(id, HL_BOLD, modec);
+ }
+ break;
+ }
+ case 'f': { // fg[#] or font
p = highlight_color(id, what, modec);
- else /* bold */
- p = highlight_has_attr(id, HL_BOLD, modec);
- break;
-
- case 'f': /* fg[#] or font */
- p = highlight_color(id, what, modec);
- break;
-
- case 'i':
- if (TOLOWER_ASC(what[1]) == 'n') /* inverse */
+ break;
+ }
+ case 'i': {
+ if (TOLOWER_ASC(what[1]) == 'n') { // inverse
+ p = highlight_has_attr(id, HL_INVERSE, modec);
+ } else { // italic
+ p = highlight_has_attr(id, HL_ITALIC, modec);
+ }
+ break;
+ }
+ case 'n': { // name
+ p = get_highlight_name_ext(NULL, id - 1, false);
+ break;
+ }
+ case 'r': { // reverse
p = highlight_has_attr(id, HL_INVERSE, modec);
- else /* italic */
- p = highlight_has_attr(id, HL_ITALIC, modec);
- break;
-
- case 'n': /* name */
- p = get_highlight_name(NULL, id - 1);
- break;
-
- case 'r': /* reverse */
- p = highlight_has_attr(id, HL_INVERSE, modec);
- break;
-
- case 's':
- if (TOLOWER_ASC(what[1]) == 'p') /* sp[#] */
- p = highlight_color(id, what, modec);
- else /* standout */
- p = highlight_has_attr(id, HL_STANDOUT, modec);
- break;
-
- case 'u':
- if (STRLEN(what) <= 5 || TOLOWER_ASC(what[5]) != 'c')
- /* underline */
- p = highlight_has_attr(id, HL_UNDERLINE, modec);
- else
- /* undercurl */
- p = highlight_has_attr(id, HL_UNDERCURL, modec);
- break;
+ break;
+ }
+ case 's': {
+ if (TOLOWER_ASC(what[1]) == 'p') { // sp[#]
+ p = highlight_color(id, what, modec);
+ } else { // standout
+ p = highlight_has_attr(id, HL_STANDOUT, modec);
+ }
+ break;
+ }
+ case 'u': {
+ if (STRLEN(what) <= 5 || TOLOWER_ASC(what[5]) != 'c') { // underline
+ p = highlight_has_attr(id, HL_UNDERLINE, modec);
+ } else { // undercurl
+ p = highlight_has_attr(id, HL_UNDERCURL, modec);
+ }
+ break;
+ }
}
- if (p != NULL)
- p = vim_strsave(p);
rettv->v_type = VAR_STRING;
- rettv->vval.v_string = p;
+ rettv->vval.v_string = (char_u *)(p == NULL ? p : xstrdup(p));
}
/*
* "synIDtrans(id)" function
*/
-static void f_synIDtrans(typval_T *argvars, typval_T *rettv)
+static void f_synIDtrans(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- int id;
-
- id = get_tv_number(&argvars[0]);
+ int id = tv_get_number(&argvars[0]);
- if (id > 0)
+ if (id > 0) {
id = syn_get_final_id(id);
- else
+ } else {
id = 0;
+ }
rettv->vval.v_number = id;
}
@@ -16170,111 +16400,88 @@ static void f_synIDtrans(typval_T *argvars, typval_T *rettv)
/*
* "synconcealed(lnum, col)" function
*/
-static void f_synconcealed(typval_T *argvars, typval_T *rettv)
+static void f_synconcealed(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- long lnum;
- long col;
int syntax_flags = 0;
int cchar;
int matchid = 0;
char_u str[NUMBUFLEN];
- rettv->v_type = VAR_LIST;
- rettv->vval.v_list = NULL;
+ tv_list_set_ret(rettv, NULL);
- lnum = get_tv_lnum(argvars); /* -1 on type error */
- col = get_tv_number(&argvars[1]) - 1; /* -1 on type error */
+ // -1 on type error (both)
+ const linenr_T lnum = tv_get_lnum(argvars);
+ const colnr_T col = (colnr_T)tv_get_number(&argvars[1]) - 1;
memset(str, NUL, sizeof(str));
- rettv_list_alloc(rettv);
if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count && col >= 0
- && col <= (long)STRLEN(ml_get(lnum)) && curwin->w_p_cole > 0) {
- (void)syn_get_id(curwin, lnum, col, FALSE, NULL, FALSE);
+ && (size_t)col <= STRLEN(ml_get(lnum)) && curwin->w_p_cole > 0) {
+ (void)syn_get_id(curwin, lnum, col, false, NULL, false);
syntax_flags = get_syntax_info(&matchid);
// get the conceal character
if ((syntax_flags & HL_CONCEAL) && curwin->w_p_cole < 3) {
cchar = syn_get_sub_char();
- if (cchar == NUL && curwin->w_p_cole == 1 && lcs_conceal != NUL) {
- cchar = lcs_conceal;
+ if (cchar == NUL && curwin->w_p_cole == 1) {
+ cchar = (lcs_conceal == NUL) ? ' ' : lcs_conceal;
}
if (cchar != NUL) {
- if (has_mbyte)
- (*mb_char2bytes)(cchar, str);
- else
- str[0] = cchar;
+ utf_char2bytes(cchar, str);
}
}
}
- list_append_number(rettv->vval.v_list, (syntax_flags & HL_CONCEAL) != 0);
+ tv_list_alloc_ret(rettv, 3);
+ tv_list_append_number(rettv->vval.v_list, (syntax_flags & HL_CONCEAL) != 0);
// -1 to auto-determine strlen
- list_append_string(rettv->vval.v_list, str, -1);
- list_append_number(rettv->vval.v_list, matchid);
+ tv_list_append_string(rettv->vval.v_list, (const char *)str, -1);
+ tv_list_append_number(rettv->vval.v_list, matchid);
}
/*
* "synstack(lnum, col)" function
*/
-static void f_synstack(typval_T *argvars, typval_T *rettv)
+static void f_synstack(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- long lnum;
- long col;
-
- rettv->v_type = VAR_LIST;
- rettv->vval.v_list = NULL;
+ tv_list_set_ret(rettv, NULL);
- lnum = get_tv_lnum(argvars); /* -1 on type error */
- col = get_tv_number(&argvars[1]) - 1; /* -1 on type error */
+ // -1 on type error (both)
+ const linenr_T lnum = tv_get_lnum(argvars);
+ const colnr_T col = (colnr_T)tv_get_number(&argvars[1]) - 1;
if (lnum >= 1
&& lnum <= curbuf->b_ml.ml_line_count
&& col >= 0
- && col <= (long)STRLEN(ml_get(lnum))) {
- rettv_list_alloc(rettv);
- (void)syn_get_id(curwin, lnum, (colnr_T)col, FALSE, NULL, TRUE);
+ && (size_t)col <= STRLEN(ml_get(lnum))) {
+ tv_list_alloc_ret(rettv, kListLenMayKnow);
+ (void)syn_get_id(curwin, lnum, col, false, NULL, true);
int id;
int i = 0;
while ((id = syn_get_stack_item(i++)) >= 0) {
- list_append_number(rettv->vval.v_list, id);
+ tv_list_append_number(rettv->vval.v_list, id);
}
}
}
-static list_T* string_to_list(char_u *str, size_t len, bool keepempty)
+static list_T *string_to_list(const char *str, size_t len, const bool keepempty)
{
- list_T *list = list_alloc();
-
- // Copy each line to a list element using NL as the delimiter.
- for (size_t i = 0; i < len; i++) {
- char_u *start = str + i;
- size_t line_len = (char_u *) xmemscan(start, NL, len - i) - start;
- i += line_len;
-
- // Don't use a str function to copy res as it may contains NULs.
- char_u *s = xmemdupz(start, line_len);
- memchrsub(s, NUL, NL, line_len); // Replace NUL with NL to avoid truncation
-
- listitem_T *li = listitem_alloc();
- li->li_tv.v_type = VAR_STRING;
- li->li_tv.v_lock = 0;
- li->li_tv.vval.v_string = s;
- list_append(list, li);
- }
-
- // Optionally retain final newline, if present
- if (keepempty && str[len-1] == NL) {
- list_append_string(list, (char_u*)"", 0);
+ if (!keepempty && str[len - 1] == NL) {
+ len--;
}
-
+ list_T *const list = tv_list_alloc(kListLenMayKnow);
+ encode_list_write(list, str, len);
return list;
}
-static void get_system_output_as_rettv(typval_T *argvars, typval_T *rettv,
+// os_system wrapper. Handles 'verbose', :profile, and v:shell_error.
+static void get_system_output_as_rettv(typval_T *argvars, typval_T *rettv,
bool retlist)
{
+ proftime_T wait_time;
+ bool profiling = do_profiling == PROF_YES;
+
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
@@ -16283,25 +16490,46 @@ static void get_system_output_as_rettv(typval_T *argvars, typval_T *rettv,
}
// get input to the shell command (if any), and its length
- ssize_t input_len;
- char *input = (char *) save_tv_as_string(&argvars[1], &input_len, false);
+ ptrdiff_t input_len;
+ char *input = save_tv_as_string(&argvars[1], &input_len, false);
if (input_len < 0) {
assert(input == NULL);
return;
}
// get shell command to execute
- char **argv = tv_to_argv(&argvars[0], NULL);
+ bool executable = true;
+ char **argv = tv_to_argv(&argvars[0], NULL, &executable);
if (!argv) {
+ if (!executable) {
+ set_vim_var_nr(VV_SHELL_ERROR, (long)-1);
+ }
xfree(input);
return; // Already did emsg.
}
+ if (p_verbose > 3) {
+ char *cmdstr = shell_argv_to_str(argv);
+ verbose_enter_scroll();
+ smsg(_("Executing command: \"%s\""), cmdstr);
+ msg_puts("\n\n");
+ verbose_leave_scroll();
+ xfree(cmdstr);
+ }
+
+ if (profiling) {
+ prof_child_enter(&wait_time);
+ }
+
// execute the command
size_t nread = 0;
char *res = NULL;
int status = os_system(argv, input, input_len, &res, &nread);
+ if (profiling) {
+ prof_child_exit(&wait_time);
+ }
+
xfree(input);
set_vim_var_nr(VV_SHELL_ERROR, (long) status);
@@ -16309,7 +16537,7 @@ static void get_system_output_as_rettv(typval_T *argvars, typval_T *rettv,
if (res == NULL) {
if (retlist) {
// return an empty list when there's no output
- rettv_list_alloc(rettv);
+ tv_list_alloc_ret(rettv, 0);
} else {
rettv->vval.v_string = (char_u *) xstrdup("");
}
@@ -16319,10 +16547,10 @@ static void get_system_output_as_rettv(typval_T *argvars, typval_T *rettv,
if (retlist) {
int keepempty = 0;
if (argvars[1].v_type != VAR_UNKNOWN && argvars[2].v_type != VAR_UNKNOWN) {
- keepempty = get_tv_number(&argvars[2]);
+ keepempty = tv_get_number(&argvars[2]);
}
- rettv->vval.v_list = string_to_list((char_u *) res, nread, keepempty != 0);
- rettv->vval.v_list->lv_refcount++;
+ rettv->vval.v_list = string_to_list(res, nread, (bool)keepempty);
+ tv_list_ref(rettv->vval.v_list);
rettv->v_type = VAR_LIST;
xfree(res);
@@ -16348,12 +16576,12 @@ static void get_system_output_as_rettv(typval_T *argvars, typval_T *rettv,
}
/// f_system - the VimL system() function
-static void f_system(typval_T *argvars, typval_T *rettv)
+static void f_system(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
get_system_output_as_rettv(argvars, rettv, false);
}
-static void f_systemlist(typval_T *argvars, typval_T *rettv)
+static void f_systemlist(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
get_system_output_as_rettv(argvars, rettv, true);
}
@@ -16362,22 +16590,22 @@ static void f_systemlist(typval_T *argvars, typval_T *rettv)
/*
* "tabpagebuflist()" function
*/
-static void f_tabpagebuflist(typval_T *argvars, typval_T *rettv)
+static void f_tabpagebuflist(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- tabpage_T *tp;
win_T *wp = NULL;
- if (argvars[0].v_type == VAR_UNKNOWN)
+ if (argvars[0].v_type == VAR_UNKNOWN) {
wp = firstwin;
- else {
- tp = find_tabpage((int)get_tv_number(&argvars[0]));
- if (tp != NULL)
+ } else {
+ tabpage_T *const tp = find_tabpage((int)tv_get_number(&argvars[0]));
+ if (tp != NULL) {
wp = (tp == curtab) ? firstwin : tp->tp_firstwin;
+ }
}
if (wp != NULL) {
- rettv_list_alloc(rettv);
+ tv_list_alloc_ret(rettv, kListLenMayKnow);
while (wp != NULL) {
- list_append_number(rettv->vval.v_list, wp->w_buffer->b_fnum);
+ tv_list_append_number(rettv->vval.v_list, wp->w_buffer->b_fnum);
wp = wp->w_next;
}
}
@@ -16387,22 +16615,23 @@ static void f_tabpagebuflist(typval_T *argvars, typval_T *rettv)
/*
* "tabpagenr()" function
*/
-static void f_tabpagenr(typval_T *argvars, typval_T *rettv)
+static void f_tabpagenr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
int nr = 1;
- char_u *arg;
if (argvars[0].v_type != VAR_UNKNOWN) {
- arg = get_tv_string_chk(&argvars[0]);
+ const char *const arg = tv_get_string_chk(&argvars[0]);
nr = 0;
if (arg != NULL) {
- if (STRCMP(arg, "$") == 0)
+ if (strcmp(arg, "$") == 0) {
nr = tabpage_index(NULL) - 1;
- else
+ } else {
EMSG2(_(e_invexpr2), arg);
+ }
}
- } else
+ } else {
nr = tabpage_index(curtab);
+ }
rettv->vval.v_number = nr;
}
@@ -16416,19 +16645,19 @@ static int get_winnr(tabpage_T *tp, typval_T *argvar)
win_T *twin;
int nr = 1;
win_T *wp;
- char_u *arg;
twin = (tp == curtab) ? curwin : tp->tp_curwin;
if (argvar->v_type != VAR_UNKNOWN) {
- arg = get_tv_string_chk(argvar);
- if (arg == NULL)
- nr = 0; /* type error; errmsg already given */
- else if (STRCMP(arg, "$") == 0)
+ const char *const arg = tv_get_string_chk(argvar);
+ if (arg == NULL) {
+ nr = 0; // Type error; errmsg already given.
+ } else if (strcmp(arg, "$") == 0) {
twin = (tp == curtab) ? lastwin : tp->tp_lastwin;
- else if (STRCMP(arg, "#") == 0) {
+ } else if (strcmp(arg, "#") == 0) {
twin = (tp == curtab) ? prevwin : tp->tp_prevwin;
- if (twin == NULL)
+ if (twin == NULL) {
nr = 0;
+ }
} else {
EMSG2(_(e_invexpr2), arg);
nr = 0;
@@ -16451,16 +16680,15 @@ static int get_winnr(tabpage_T *tp, typval_T *argvar)
/*
* "tabpagewinnr()" function
*/
-static void f_tabpagewinnr(typval_T *argvars, typval_T *rettv)
+static void f_tabpagewinnr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
int nr = 1;
- tabpage_T *tp;
-
- tp = find_tabpage((int)get_tv_number(&argvars[0]));
- if (tp == NULL)
+ tabpage_T *const tp = find_tabpage((int)tv_get_number(&argvars[0]));
+ if (tp == NULL) {
nr = 0;
- else
+ } else {
nr = get_winnr(tp, &argvars[1]);
+ }
rettv->vval.v_number = nr;
}
@@ -16468,18 +16696,18 @@ static void f_tabpagewinnr(typval_T *argvars, typval_T *rettv)
/*
* "tagfiles()" function
*/
-static void f_tagfiles(typval_T *argvars, typval_T *rettv)
+static void f_tagfiles(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *fname;
+ char *fname;
tagname_T tn;
- rettv_list_alloc(rettv);
+ tv_list_alloc_ret(rettv, kListLenUnknown);
fname = xmalloc(MAXPATHL);
- int first = TRUE;
- while (get_tagfname(&tn, first, fname) == OK) {
- list_append_string(rettv->vval.v_list, fname, -1);
- first = FALSE;
+ bool first = true;
+ while (get_tagfname(&tn, first, (char_u *)fname) == OK) {
+ tv_list_append_string(rettv->vval.v_list, fname, -1);
+ first = false;
}
tagname_free(&tn);
@@ -16489,30 +16717,34 @@ static void f_tagfiles(typval_T *argvars, typval_T *rettv)
/*
* "taglist()" function
*/
-static void f_taglist(typval_T *argvars, typval_T *rettv)
+static void f_taglist(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *tag_pattern;
+ const char *const tag_pattern = tv_get_string(&argvars[0]);
- tag_pattern = get_tv_string(&argvars[0]);
-
- rettv->vval.v_number = FALSE;
- if (*tag_pattern == NUL)
+ rettv->vval.v_number = false;
+ if (*tag_pattern == NUL) {
return;
+ }
- (void)get_tags(rettv_list_alloc(rettv), tag_pattern);
+ const char *fname = NULL;
+ if (argvars[1].v_type != VAR_UNKNOWN) {
+ fname = tv_get_string(&argvars[1]);
+ }
+ (void)get_tags(tv_list_alloc_ret(rettv, kListLenUnknown),
+ (char_u *)tag_pattern, (char_u *)fname);
}
/*
* "tempname()" function
*/
-static void f_tempname(typval_T *argvars, typval_T *rettv)
+static void f_tempname(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_STRING;
rettv->vval.v_string = vim_tempname();
}
// "termopen(cmd[, cwd])" function
-static void f_termopen(typval_T *argvars, typval_T *rettv)
+static void f_termopen(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
if (check_restricted() || check_secure()) {
return;
@@ -16523,9 +16755,11 @@ static void f_termopen(typval_T *argvars, typval_T *rettv)
return;
}
- char *cmd;
- char **argv = tv_to_argv(&argvars[0], &cmd);
+ const char *cmd;
+ bool executable = true;
+ char **argv = tv_to_argv(&argvars[0], &cmd, &executable);
if (!argv) {
+ rettv->vval.v_number = executable ? 0 : -1;
return; // Did error message in tv_to_argv.
}
@@ -16536,17 +16770,19 @@ static void f_termopen(typval_T *argvars, typval_T *rettv)
return;
}
- ufunc_T *on_stdout = NULL, *on_stderr = NULL, *on_exit = NULL;
+ CallbackReader on_stdout = CALLBACK_READER_INIT,
+ on_stderr = CALLBACK_READER_INIT;
+ Callback on_exit = CALLBACK_NONE;
dict_T *job_opts = NULL;
- char *cwd = ".";
+ const char *cwd = ".";
if (argvars[1].v_type == VAR_DICT) {
job_opts = argvars[1].vval.v_dict;
- char *new_cwd = (char *)get_dict_string(job_opts, (char_u *)"cwd", false);
- if (new_cwd && strlen(new_cwd) > 0) {
+ const char *const new_cwd = tv_dict_get_string(job_opts, "cwd", false);
+ if (new_cwd && *new_cwd != NUL) {
cwd = new_cwd;
// The new cwd must be a directory.
- if (!os_isdir((char_u *)cwd)) {
+ if (!os_isdir_executable((const char *)cwd)) {
EMSG2(_(e_invarg2), "expected valid directory");
shell_free_argv(argv);
return;
@@ -16559,23 +16795,17 @@ static void f_termopen(typval_T *argvars, typval_T *rettv)
}
}
- TerminalJobData *data = common_job_init(argv, on_stdout, on_stderr, on_exit,
- job_opts, true, false, cwd);
- data->proc.pty.width = curwin->w_width;
- data->proc.pty.height = curwin->w_height;
- data->proc.pty.term_name = xstrdup("xterm-256color");
- if (!common_job_start(data, rettv)) {
+ uint16_t term_width = MAX(0, curwin->w_grid.Columns - win_col_off(curwin));
+ Channel *chan = channel_job_start(argv, on_stdout, on_stderr, on_exit,
+ true, false, false, cwd,
+ term_width, curwin->w_grid.Rows,
+ xstrdup("xterm-256color"),
+ &rettv->vval.v_number);
+ if (rettv->vval.v_number <= 0) {
return;
}
- TerminalOptions topts;
- topts.data = data;
- topts.width = curwin->w_width;
- topts.height = curwin->w_height;
- topts.write_cb = term_write;
- topts.resize_cb = term_resize;
- topts.close_cb = term_close;
- int pid = data->proc.pty.process.pid;
+ int pid = chan->stream.pty.process.pid;
char buf[1024];
// format the title with the pid to conform with the term:// URI
@@ -16583,50 +16813,218 @@ static void f_termopen(typval_T *argvars, typval_T *rettv)
// at this point the buffer has no terminal instance associated yet, so unset
// the 'swapfile' option to ensure no swap file will be created
curbuf->b_p_swf = false;
- (void)setfname(curbuf, (uint8_t *)buf, NULL, true);
+ (void)setfname(curbuf, (char_u *)buf, NULL, true);
// Save the job id and pid in b:terminal_job_{id,pid}
- Error err;
- dict_set_value(curbuf->b_vars, cstr_as_string("terminal_job_id"),
- INTEGER_OBJ(rettv->vval.v_number), false, &err);
- dict_set_value(curbuf->b_vars, cstr_as_string("terminal_job_pid"),
- INTEGER_OBJ(pid), false, &err);
+ Error err = ERROR_INIT;
+ // deprecated: use 'channel' buffer option
+ dict_set_var(curbuf->b_vars, cstr_as_string("terminal_job_id"),
+ INTEGER_OBJ(chan->id), false, false, &err);
+ api_clear_error(&err);
+ dict_set_var(curbuf->b_vars, cstr_as_string("terminal_job_pid"),
+ INTEGER_OBJ(pid), false, false, &err);
+ api_clear_error(&err);
- Terminal *term = terminal_open(topts);
- data->term = term;
- data->refcount++;
+ channel_terminal_open(chan);
+ channel_create_event(chan, NULL);
+}
- return;
+// "test_garbagecollect_now()" function
+static void f_test_garbagecollect_now(typval_T *argvars,
+ typval_T *rettv, FunPtr fptr)
+{
+ // This is dangerous, any Lists and Dicts used internally may be freed
+ // while still in use.
+ garbage_collect(true);
}
-/*
- * "test(list)" function: Just checking the walls...
- */
-static void f_test(typval_T *argvars, typval_T *rettv)
+// "test_write_list_log()" function
+static void f_test_write_list_log(typval_T *const argvars,
+ typval_T *const rettv,
+ FunPtr fptr)
{
- /* Used for unit testing. Change the code below to your liking. */
+ const char *const fname = tv_get_string_chk(&argvars[0]);
+ if (fname == NULL) {
+ return;
+ }
+ list_write_log(fname);
}
-/*
- * "tan()" function
- */
-static void f_tan(typval_T *argvars, typval_T *rettv)
+bool callback_from_typval(Callback *const callback, typval_T *const arg)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
{
- float_op_wrapper(argvars, rettv, &tan);
+ if (arg->v_type == VAR_PARTIAL && arg->vval.v_partial != NULL) {
+ callback->data.partial = arg->vval.v_partial;
+ callback->data.partial->pt_refcount++;
+ callback->type = kCallbackPartial;
+ } else if (arg->v_type == VAR_FUNC || arg->v_type == VAR_STRING) {
+ char_u *name = arg->vval.v_string;
+ func_ref(name);
+ callback->data.funcref = vim_strsave(name);
+ callback->type = kCallbackFuncref;
+ } else if (arg->v_type == VAR_NUMBER && arg->vval.v_number == 0) {
+ callback->type = kCallbackNone;
+ } else {
+ EMSG(_("E921: Invalid callback argument"));
+ return false;
+ }
+ return true;
}
-/*
- * "tanh()" function
- */
-static void f_tanh(typval_T *argvars, typval_T *rettv)
+bool callback_call(Callback *const callback, const int argcount_in,
+ typval_T *const argvars_in, typval_T *const rettv)
+ FUNC_ATTR_NONNULL_ALL
{
- float_op_wrapper(argvars, rettv, &tanh);
+ partial_T *partial;
+ char_u *name;
+ switch (callback->type) {
+ case kCallbackFuncref:
+ name = callback->data.funcref;
+ partial = NULL;
+ break;
+
+ case kCallbackPartial:
+ partial = callback->data.partial;
+ name = partial_name(partial);
+ break;
+
+ case kCallbackNone:
+ return false;
+ break;
+
+ default:
+ abort();
+ }
+
+ int dummy;
+ return call_func(name, (int)STRLEN(name), rettv, argcount_in, argvars_in,
+ NULL, curwin->w_cursor.lnum, curwin->w_cursor.lnum, &dummy,
+ true, partial, NULL);
}
+static bool set_ref_in_callback(Callback *callback, int copyID,
+ ht_stack_T **ht_stack,
+ list_stack_T **list_stack)
+{
+ typval_T tv;
+ switch (callback->type) {
+ case kCallbackFuncref:
+ case kCallbackNone:
+ break;
+
+ case kCallbackPartial:
+ tv.v_type = VAR_PARTIAL;
+ tv.vval.v_partial = callback->data.partial;
+ return set_ref_in_item(&tv, copyID, ht_stack, list_stack);
+ break;
+
+
+ default:
+ abort();
+ }
+ return false;
+}
+
+static bool set_ref_in_callback_reader(CallbackReader *reader, int copyID,
+ ht_stack_T **ht_stack,
+ list_stack_T **list_stack)
+{
+ if (set_ref_in_callback(&reader->cb, copyID, ht_stack, list_stack)) {
+ return true;
+ }
+
+ if (reader->self) {
+ typval_T tv;
+ tv.v_type = VAR_DICT;
+ tv.vval.v_dict = reader->self;
+ return set_ref_in_item(&tv, copyID, ht_stack, list_stack);
+ }
+ return false;
+}
+
+static void add_timer_info(typval_T *rettv, timer_T *timer)
+{
+ list_T *list = rettv->vval.v_list;
+ dict_T *dict = tv_dict_alloc();
+
+ tv_list_append_dict(list, dict);
+ tv_dict_add_nr(dict, S_LEN("id"), timer->timer_id);
+ tv_dict_add_nr(dict, S_LEN("time"), timer->timeout);
+ tv_dict_add_nr(dict, S_LEN("paused"), timer->paused);
+
+ tv_dict_add_nr(dict, S_LEN("repeat"),
+ (timer->repeat_count < 0 ? -1 : timer->repeat_count));
+
+ dictitem_T *di = tv_dict_item_alloc("callback");
+ if (tv_dict_add(dict, di) == FAIL) {
+ xfree(di);
+ return;
+ }
+
+ if (timer->callback.type == kCallbackPartial) {
+ di->di_tv.v_type = VAR_PARTIAL;
+ di->di_tv.vval.v_partial = timer->callback.data.partial;
+ timer->callback.data.partial->pt_refcount++;
+ } else if (timer->callback.type == kCallbackFuncref) {
+ di->di_tv.v_type = VAR_FUNC;
+ di->di_tv.vval.v_string = vim_strsave(timer->callback.data.funcref);
+ }
+ di->di_tv.v_lock = 0;
+}
+
+static void add_timer_info_all(typval_T *rettv)
+{
+ timer_T *timer;
+ map_foreach_value(timers, timer, {
+ if (!timer->stopped) {
+ add_timer_info(rettv, timer);
+ }
+ })
+}
+
+/// "timer_info([timer])" function
+static void f_timer_info(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ tv_list_alloc_ret(rettv, (argvars[0].v_type != VAR_UNKNOWN
+ ? 1
+ : timers->table->n_occupied));
+ if (argvars[0].v_type != VAR_UNKNOWN) {
+ if (argvars[0].v_type != VAR_NUMBER) {
+ EMSG(_(e_number_exp));
+ return;
+ }
+ timer_T *timer = pmap_get(uint64_t)(timers, tv_get_number(&argvars[0]));
+ if (timer != NULL && !timer->stopped) {
+ add_timer_info(rettv, timer);
+ }
+ } else {
+ add_timer_info_all(rettv);
+ }
+}
+
+/// "timer_pause(timer, paused)" function
+static void f_timer_pause(typval_T *argvars, typval_T *unused, FunPtr fptr)
+{
+ if (argvars[0].v_type != VAR_NUMBER) {
+ EMSG(_(e_number_exp));
+ return;
+ }
+ int paused = (bool)tv_get_number(&argvars[1]);
+ timer_T *timer = pmap_get(uint64_t)(timers, tv_get_number(&argvars[0]));
+ if (timer != NULL) {
+ if (!timer->paused && paused) {
+ time_watcher_stop(&timer->tw);
+ } else if (timer->paused && !paused) {
+ time_watcher_start(&timer->tw, timer_due_cb, timer->timeout,
+ timer->timeout);
+ }
+ timer->paused = paused;
+ }
+}
/// "timer_start(timeout, callback, opts)" function
-static void f_timer_start(typval_T *argvars, typval_T *rettv)
+static void f_timer_start(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- long timeout = get_tv_number(&argvars[0]);
+ const long timeout = tv_get_number(&argvars[0]);
timer_T *timer;
int repeat = 1;
dict_T *dict;
@@ -16636,41 +17034,37 @@ static void f_timer_start(typval_T *argvars, typval_T *rettv)
if (argvars[2].v_type != VAR_UNKNOWN) {
if (argvars[2].v_type != VAR_DICT
|| (dict = argvars[2].vval.v_dict) == NULL) {
- EMSG2(_(e_invarg2), get_tv_string(&argvars[2]));
+ EMSG2(_(e_invarg2), tv_get_string(&argvars[2]));
return;
}
- if (dict_find(dict, (char_u *)"repeat", -1) != NULL) {
- repeat = get_dict_number(dict, (char_u *)"repeat");
+ dictitem_T *const di = tv_dict_find(dict, S_LEN("repeat"));
+ if (di != NULL) {
+ repeat = tv_get_number(&di->di_tv);
if (repeat == 0) {
repeat = 1;
}
}
}
- if (argvars[1].v_type != VAR_FUNC && argvars[1].v_type != VAR_STRING) {
- EMSG2(e_invarg2, "funcref");
- return;
- }
- ufunc_T *func = find_ufunc(argvars[1].vval.v_string);
- if (!func) {
- // Invalid function name. Error already reported by `find_ufunc`.
+ Callback callback;
+ if (!callback_from_typval(&callback, &argvars[1])) {
return;
}
- func->uf_refcount++;
timer = xmalloc(sizeof *timer);
+ timer->refcount = 1;
timer->stopped = false;
+ timer->paused = false;
timer->repeat_count = repeat;
timer->timeout = timeout;
timer->timer_id = last_timer_id++;
- timer->callback = func;
+ timer->callback = callback;
time_watcher_init(&main_loop, &timer->tw, timer);
- timer->tw.events = queue_new_child(main_loop.events);
+ timer->tw.events = multiqueue_new_child(main_loop.events);
// if main loop is blocked, don't queue up multiple events
timer->tw.blockable = true;
- time_watcher_start(&timer->tw, timer_due_cb, timeout,
- timeout * (repeat != 1));
+ time_watcher_start(&timer->tw, timer_due_cb, timeout, timeout);
pmap_put(uint64_t)(timers, timer->timer_id, timer);
rettv->vval.v_number = timer->timer_id;
@@ -16678,14 +17072,14 @@ static void f_timer_start(typval_T *argvars, typval_T *rettv)
// "timer_stop(timerid)" function
-static void f_timer_stop(typval_T *argvars, typval_T *rettv)
+static void f_timer_stop(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
if (argvars[0].v_type != VAR_NUMBER) {
EMSG(_(e_number_exp));
return;
}
- timer_T *timer = pmap_get(uint64_t)(timers, get_tv_number(&argvars[0]));
+ timer_T *timer = pmap_get(uint64_t)(timers, tv_get_number(&argvars[0]));
if (timer == NULL) {
return;
@@ -16694,28 +17088,32 @@ static void f_timer_stop(typval_T *argvars, typval_T *rettv)
timer_stop(timer);
}
+static void f_timer_stopall(typval_T *argvars, typval_T *unused, FunPtr fptr)
+{
+ timer_stop_all();
+}
+
// invoked on the main loop
static void timer_due_cb(TimeWatcher *tw, void *data)
{
timer_T *timer = (timer_T *)data;
- if (timer->stopped) {
+ if (timer->stopped || timer->paused) {
return;
}
+
+ timer->refcount++;
// if repeat was negative repeat forever
if (timer->repeat_count >= 0 && --timer->repeat_count == 0) {
timer_stop(timer);
}
- typval_T argv[1];
- init_tv(argv);
+ typval_T argv[2] = { TV_INITIAL_VALUE, TV_INITIAL_VALUE };
argv[0].v_type = VAR_NUMBER;
argv[0].vval.v_number = timer->timer_id;
- typval_T rettv;
+ typval_T rettv = TV_INITIAL_VALUE;
- init_tv(&rettv);
- call_user_func(timer->callback, ARRAY_SIZE(argv), argv, &rettv,
- curwin->w_cursor.lnum, curwin->w_cursor.lnum, NULL);
- clear_tv(&rettv);
+ callback_call(&timer->callback, 1, argv, &rettv);
+ tv_clear(&rettv);
if (!timer->stopped && timer->timeout == 0) {
// special case: timeout=0 means the callback will be
@@ -16724,6 +17122,7 @@ static void timer_due_cb(TimeWatcher *tw, void *data)
// when the main loop is blocked.
time_watcher_start(&timer->tw, timer_due_cb, 0, 0);
}
+ timer_decref(timer);
}
static void timer_stop(timer_T *timer)
@@ -16734,20 +17133,28 @@ static void timer_stop(timer_T *timer)
}
timer->stopped = true;
time_watcher_stop(&timer->tw);
- time_watcher_close(&timer->tw, timer_free_cb);
+ time_watcher_close(&timer->tw, timer_close_cb);
}
-// invoked on next event loop tick, so queue is empty
-static void timer_free_cb(TimeWatcher *tw, void *data)
+// This will be run on the main loop after the last timer_due_cb, so at this
+// point it is safe to free the callback.
+static void timer_close_cb(TimeWatcher *tw, void *data)
{
timer_T *timer = (timer_T *)data;
- queue_free(timer->tw.events);
- user_func_unref(timer->callback);
+ multiqueue_free(timer->tw.events);
+ callback_free(&timer->callback);
pmap_del(uint64_t)(timers, timer->timer_id);
- xfree(timer);
+ timer_decref(timer);
}
-void timer_teardown(void)
+static void timer_decref(timer_T *timer)
+{
+ if (--timer->refcount == 0) {
+ xfree(timer);
+ }
+}
+
+static void timer_stop_all(void)
{
timer_T *timer;
map_foreach_value(timers, timer, {
@@ -16755,122 +17162,101 @@ void timer_teardown(void)
})
}
+void timer_teardown(void)
+{
+ timer_stop_all();
+}
+
/*
* "tolower(string)" function
*/
-static void f_tolower(typval_T *argvars, typval_T *rettv)
+static void f_tolower(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *p = vim_strsave(get_tv_string(&argvars[0]));
rettv->v_type = VAR_STRING;
- rettv->vval.v_string = p;
-
- while (*p != NUL) {
- int l;
-
- if (enc_utf8) {
- int c, lc;
-
- c = utf_ptr2char(p);
- lc = utf_tolower(c);
- l = utf_ptr2len(p);
- /* TODO: reallocate string when byte count changes. */
- if (utf_char2len(lc) == l)
- utf_char2bytes(lc, p);
- p += l;
- } else if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
- p += l; /* skip multi-byte character */
- else {
- *p = TOLOWER_LOC(*p); /* note that tolower() can be a macro */
- ++p;
- }
- }
+ rettv->vval.v_string = (char_u *)strcase_save(tv_get_string(&argvars[0]),
+ false);
}
/*
* "toupper(string)" function
*/
-static void f_toupper(typval_T *argvars, typval_T *rettv)
+static void f_toupper(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_STRING;
- rettv->vval.v_string = strup_save(get_tv_string(&argvars[0]));
+ rettv->vval.v_string = (char_u *)strcase_save(tv_get_string(&argvars[0]),
+ true);
}
/*
* "tr(string, fromstr, tostr)" function
*/
-static void f_tr(typval_T *argvars, typval_T *rettv)
+static void f_tr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- char_u *in_str;
- char_u *fromstr;
- char_u *tostr;
- char_u *p;
- int inlen;
- int fromlen;
- int tolen;
- int idx;
- char_u *cpstr;
- int cplen;
- int first = TRUE;
- char_u buf[NUMBUFLEN];
- char_u buf2[NUMBUFLEN];
- garray_T ga;
+ char buf[NUMBUFLEN];
+ char buf2[NUMBUFLEN];
- in_str = get_tv_string(&argvars[0]);
- fromstr = get_tv_string_buf_chk(&argvars[1], buf);
- tostr = get_tv_string_buf_chk(&argvars[2], buf2);
+ const char *in_str = tv_get_string(&argvars[0]);
+ const char *fromstr = tv_get_string_buf_chk(&argvars[1], buf);
+ const char *tostr = tv_get_string_buf_chk(&argvars[2], buf2);
- /* Default return value: empty string. */
+ // Default return value: empty string.
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
- if (fromstr == NULL || tostr == NULL)
- return; /* type error; errmsg already given */
+ if (fromstr == NULL || tostr == NULL) {
+ return; // Type error; errmsg already given.
+ }
+ garray_T ga;
ga_init(&ga, (int)sizeof(char), 80);
- if (!has_mbyte)
- /* not multi-byte: fromstr and tostr must be the same length */
- if (STRLEN(fromstr) != STRLEN(tostr)) {
-error:
- EMSG2(_(e_invarg2), fromstr);
- ga_clear(&ga);
- return;
+ if (!has_mbyte) {
+ // Not multi-byte: fromstr and tostr must be the same length.
+ if (strlen(fromstr) != strlen(tostr)) {
+ goto error;
}
+ }
- /* fromstr and tostr have to contain the same number of chars */
+ // fromstr and tostr have to contain the same number of chars.
+ bool first = true;
while (*in_str != NUL) {
if (has_mbyte) {
- inlen = (*mb_ptr2len)(in_str);
- cpstr = in_str;
- cplen = inlen;
- idx = 0;
- for (p = fromstr; *p != NUL; p += fromlen) {
- fromlen = (*mb_ptr2len)(p);
+ const char *cpstr = in_str;
+ const int inlen = (*mb_ptr2len)((const char_u *)in_str);
+ int cplen = inlen;
+ int idx = 0;
+ int fromlen;
+ for (const char *p = fromstr; *p != NUL; p += fromlen) {
+ fromlen = (*mb_ptr2len)((const char_u *)p);
if (fromlen == inlen && STRNCMP(in_str, p, inlen) == 0) {
+ int tolen;
for (p = tostr; *p != NUL; p += tolen) {
- tolen = (*mb_ptr2len)(p);
+ tolen = (*mb_ptr2len)((const char_u *)p);
if (idx-- == 0) {
cplen = tolen;
- cpstr = p;
+ cpstr = (char *)p;
break;
}
}
- if (*p == NUL) /* tostr is shorter than fromstr */
+ if (*p == NUL) { // tostr is shorter than fromstr.
goto error;
+ }
break;
}
- ++idx;
+ idx++;
}
if (first && cpstr == in_str) {
- /* Check that fromstr and tostr have the same number of
- * (multi-byte) characters. Done only once when a character
- * of in_str doesn't appear in fromstr. */
- first = FALSE;
- for (p = tostr; *p != NUL; p += tolen) {
- tolen = (*mb_ptr2len)(p);
- --idx;
+ // Check that fromstr and tostr have the same number of
+ // (multi-byte) characters. Done only once when a character
+ // of in_str doesn't appear in fromstr.
+ first = false;
+ int tolen;
+ for (const char *p = tostr; *p != NUL; p += tolen) {
+ tolen = (*mb_ptr2len)((const char_u *)p);
+ idx--;
}
- if (idx != 0)
+ if (idx != 0) {
goto error;
+ }
}
ga_grow(&ga, cplen);
@@ -16879,13 +17265,14 @@ error:
in_str += inlen;
} else {
- /* When not using multi-byte chars we can do it faster. */
- p = vim_strchr(fromstr, *in_str);
- if (p != NULL)
+ // When not using multi-byte chars we can do it faster.
+ const char *const p = strchr(fromstr, *in_str);
+ if (p != NULL) {
ga_append(&ga, tostr[p - fromstr]);
- else
+ } else {
ga_append(&ga, *in_str);
- ++in_str;
+ }
+ in_str++;
}
}
@@ -16893,35 +17280,96 @@ error:
ga_append(&ga, NUL);
rettv->vval.v_string = ga.ga_data;
+ return;
+error:
+ EMSG2(_(e_invarg2), fromstr);
+ ga_clear(&ga);
+ return;
}
-/*
- * "trunc({float})" function
- */
-static void f_trunc(typval_T *argvars, typval_T *rettv)
+// "trim({expr})" function
+static void f_trim(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- float_op_wrapper(argvars, rettv, &trunc);
+ char buf1[NUMBUFLEN];
+ char buf2[NUMBUFLEN];
+ const char_u *head = (const char_u *)tv_get_string_buf_chk(&argvars[0], buf1);
+ const char_u *mask = NULL;
+ const char_u *tail;
+ const char_u *prev;
+ const char_u *p;
+ int c1;
+
+ rettv->v_type = VAR_STRING;
+ if (head == NULL) {
+ rettv->vval.v_string = NULL;
+ return;
+ }
+
+ if (argvars[1].v_type == VAR_STRING) {
+ mask = (const char_u *)tv_get_string_buf_chk(&argvars[1], buf2);
+ }
+
+ while (*head != NUL) {
+ c1 = PTR2CHAR(head);
+ if (mask == NULL) {
+ if (c1 > ' ' && c1 != 0xa0) {
+ break;
+ }
+ } else {
+ for (p = mask; *p != NUL; MB_PTR_ADV(p)) {
+ if (c1 == PTR2CHAR(p)) {
+ break;
+ }
+ }
+ if (*p == NUL) {
+ break;
+ }
+ }
+ MB_PTR_ADV(head);
+ }
+
+ for (tail = head + STRLEN(head); tail > head; tail = prev) {
+ prev = tail;
+ MB_PTR_BACK(head, prev);
+ c1 = PTR2CHAR(prev);
+ if (mask == NULL) {
+ if (c1 > ' ' && c1 != 0xa0) {
+ break;
+ }
+ } else {
+ for (p = mask; *p != NUL; MB_PTR_ADV(p)) {
+ if (c1 == PTR2CHAR(p)) {
+ break;
+ }
+ }
+ if (*p == NUL) {
+ break;
+ }
+ }
+ }
+ rettv->vval.v_string = vim_strnsave(head, (int)(tail - head));
}
/*
* "type(expr)" function
*/
-static void f_type(typval_T *argvars, typval_T *rettv)
+static void f_type(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
int n = -1;
switch (argvars[0].v_type) {
- case VAR_NUMBER: n = 0; break;
- case VAR_STRING: n = 1; break;
- case VAR_FUNC: n = 2; break;
- case VAR_LIST: n = 3; break;
- case VAR_DICT: n = 4; break;
- case VAR_FLOAT: n = 5; break;
+ case VAR_NUMBER: n = VAR_TYPE_NUMBER; break;
+ case VAR_STRING: n = VAR_TYPE_STRING; break;
+ case VAR_PARTIAL:
+ case VAR_FUNC: n = VAR_TYPE_FUNC; break;
+ case VAR_LIST: n = VAR_TYPE_LIST; break;
+ case VAR_DICT: n = VAR_TYPE_DICT; break;
+ case VAR_FLOAT: n = VAR_TYPE_FLOAT; break;
case VAR_SPECIAL: {
switch (argvars[0].vval.v_special) {
case kSpecialVarTrue:
case kSpecialVarFalse: {
- n = 6;
+ n = VAR_TYPE_BOOL;
break;
}
case kSpecialVarNull: {
@@ -16932,7 +17380,7 @@ static void f_type(typval_T *argvars, typval_T *rettv)
break;
}
case VAR_UNKNOWN: {
- EMSG2(_(e_intern2), "f_type(UNKNOWN)");
+ internal_error("f_type(UNKNOWN)");
break;
}
}
@@ -16942,53 +17390,48 @@ static void f_type(typval_T *argvars, typval_T *rettv)
/*
* "undofile(name)" function
*/
-static void f_undofile(typval_T *argvars, typval_T *rettv)
+static void f_undofile(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_STRING;
- {
- char_u *fname = get_tv_string(&argvars[0]);
+ const char *const fname = tv_get_string(&argvars[0]);
- if (*fname == NUL) {
- /* If there is no file name there will be no undo file. */
- rettv->vval.v_string = NULL;
- } else {
- char *ffname = FullName_save((char *)fname, false);
+ if (*fname == NUL) {
+ // If there is no file name there will be no undo file.
+ rettv->vval.v_string = NULL;
+ } else {
+ char *ffname = FullName_save(fname, false);
- if (ffname != NULL) {
- rettv->vval.v_string = (char_u *)u_get_undo_file_name(ffname, false);
- }
- xfree(ffname);
+ if (ffname != NULL) {
+ rettv->vval.v_string = (char_u *)u_get_undo_file_name(ffname, false);
}
+ xfree(ffname);
}
}
/*
* "undotree()" function
*/
-static void f_undotree(typval_T *argvars, typval_T *rettv)
+static void f_undotree(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- rettv_dict_alloc(rettv);
+ tv_dict_alloc_ret(rettv);
dict_T *dict = rettv->vval.v_dict;
- list_T *list;
- dict_add_nr_str(dict, "synced", (long)curbuf->b_u_synced, NULL);
- dict_add_nr_str(dict, "seq_last", curbuf->b_u_seq_last, NULL);
- dict_add_nr_str(dict, "save_last",
- (long)curbuf->b_u_save_nr_last, NULL);
- dict_add_nr_str(dict, "seq_cur", curbuf->b_u_seq_cur, NULL);
- dict_add_nr_str(dict, "time_cur", (long)curbuf->b_u_time_cur, NULL);
- dict_add_nr_str(dict, "save_cur", (long)curbuf->b_u_save_nr_cur, NULL);
+ tv_dict_add_nr(dict, S_LEN("synced"), (varnumber_T)curbuf->b_u_synced);
+ tv_dict_add_nr(dict, S_LEN("seq_last"), (varnumber_T)curbuf->b_u_seq_last);
+ tv_dict_add_nr(dict, S_LEN("save_last"),
+ (varnumber_T)curbuf->b_u_save_nr_last);
+ tv_dict_add_nr(dict, S_LEN("seq_cur"), (varnumber_T)curbuf->b_u_seq_cur);
+ tv_dict_add_nr(dict, S_LEN("time_cur"), (varnumber_T)curbuf->b_u_time_cur);
+ tv_dict_add_nr(dict, S_LEN("save_cur"), (varnumber_T)curbuf->b_u_save_nr_cur);
- list = list_alloc();
- u_eval_tree(curbuf->b_u_oldhead, list);
- dict_add_list(dict, "entries", list);
+ tv_dict_add_list(dict, S_LEN("entries"), u_eval_tree(curbuf->b_u_oldhead));
}
/*
* "values(dict)" function
*/
-static void f_values(typval_T *argvars, typval_T *rettv)
+static void f_values(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
dict_list(argvars, rettv, 1);
}
@@ -16996,7 +17439,7 @@ static void f_values(typval_T *argvars, typval_T *rettv)
/*
* "virtcol(string)" function
*/
-static void f_virtcol(typval_T *argvars, typval_T *rettv)
+static void f_virtcol(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
colnr_T vcol = 0;
pos_T *fp;
@@ -17015,7 +17458,7 @@ static void f_virtcol(typval_T *argvars, typval_T *rettv)
/*
* "visualmode()" function
*/
-static void f_visualmode(typval_T *argvars, typval_T *rettv)
+static void f_visualmode(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
char_u str[2];
@@ -17032,16 +17475,47 @@ static void f_visualmode(typval_T *argvars, typval_T *rettv)
/*
* "wildmenumode()" function
*/
-static void f_wildmenumode(typval_T *argvars, typval_T *rettv)
+static void f_wildmenumode(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
if (wild_menu_showing)
rettv->vval.v_number = 1;
}
+/// "win_findbuf()" function
+static void f_win_findbuf(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ tv_list_alloc_ret(rettv, kListLenMayKnow);
+ win_findbuf(argvars, rettv->vval.v_list);
+}
+
+/// "win_getid()" function
+static void f_win_getid(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ rettv->vval.v_number = win_getid(argvars);
+}
+
+/// "win_gotoid()" function
+static void f_win_gotoid(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ rettv->vval.v_number = win_gotoid(argvars);
+}
+
+/// "win_id2tabwin()" function
+static void f_win_id2tabwin(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ win_id2tabwin(argvars, rettv);
+}
+
+/// "win_id2win()" function
+static void f_win_id2win(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ rettv->vval.v_number = win_id2win(argvars);
+}
+
/*
* "winbufnr(nr)" function
*/
-static void f_winbufnr(typval_T *argvars, typval_T *rettv)
+static void f_winbufnr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
win_T *wp;
@@ -17055,7 +17529,7 @@ static void f_winbufnr(typval_T *argvars, typval_T *rettv)
/*
* "wincol()" function
*/
-static void f_wincol(typval_T *argvars, typval_T *rettv)
+static void f_wincol(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
validate_cursor();
rettv->vval.v_number = curwin->w_wcol + 1;
@@ -17064,7 +17538,7 @@ static void f_wincol(typval_T *argvars, typval_T *rettv)
/*
* "winheight(nr)" function
*/
-static void f_winheight(typval_T *argvars, typval_T *rettv)
+static void f_winheight(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
win_T *wp;
@@ -17078,7 +17552,7 @@ static void f_winheight(typval_T *argvars, typval_T *rettv)
/*
* "winline()" function
*/
-static void f_winline(typval_T *argvars, typval_T *rettv)
+static void f_winline(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
validate_cursor();
rettv->vval.v_number = curwin->w_wrow + 1;
@@ -17087,7 +17561,7 @@ static void f_winline(typval_T *argvars, typval_T *rettv)
/*
* "winnr()" function
*/
-static void f_winnr(typval_T *argvars, typval_T *rettv)
+static void f_winnr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
int nr = 1;
@@ -17098,7 +17572,7 @@ static void f_winnr(typval_T *argvars, typval_T *rettv)
/*
* "winrestcmd()" function
*/
-static void f_winrestcmd(typval_T *argvars, typval_T *rettv)
+static void f_winrestcmd(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
int winnr = 1;
garray_T ga;
@@ -17121,38 +17595,39 @@ static void f_winrestcmd(typval_T *argvars, typval_T *rettv)
/*
* "winrestview()" function
*/
-static void f_winrestview(typval_T *argvars, typval_T *rettv)
+static void f_winrestview(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- dict_T *dict;
+ dict_T *dict;
if (argvars[0].v_type != VAR_DICT
- || (dict = argvars[0].vval.v_dict) == NULL)
+ || (dict = argvars[0].vval.v_dict) == NULL) {
EMSG(_(e_invarg));
- else {
- if (dict_find(dict, (char_u *)"lnum", -1) != NULL) {
- curwin->w_cursor.lnum = get_dict_number(dict, (char_u *)"lnum");
+ } else {
+ dictitem_T *di;
+ if ((di = tv_dict_find(dict, S_LEN("lnum"))) != NULL) {
+ curwin->w_cursor.lnum = tv_get_number(&di->di_tv);
}
- if (dict_find(dict, (char_u *)"col", -1) != NULL) {
- curwin->w_cursor.col = get_dict_number(dict, (char_u *)"col");
+ if ((di = tv_dict_find(dict, S_LEN("col"))) != NULL) {
+ curwin->w_cursor.col = tv_get_number(&di->di_tv);
}
- if (dict_find(dict, (char_u *)"coladd", -1) != NULL) {
- curwin->w_cursor.coladd = get_dict_number(dict, (char_u *)"coladd");
+ if ((di = tv_dict_find(dict, S_LEN("coladd"))) != NULL) {
+ curwin->w_cursor.coladd = tv_get_number(&di->di_tv);
}
- if (dict_find(dict, (char_u *)"curswant", -1) != NULL) {
- curwin->w_curswant = get_dict_number(dict, (char_u *)"curswant");
- curwin->w_set_curswant = FALSE;
+ if ((di = tv_dict_find(dict, S_LEN("curswant"))) != NULL) {
+ curwin->w_curswant = tv_get_number(&di->di_tv);
+ curwin->w_set_curswant = false;
}
- if (dict_find(dict, (char_u *)"topline", -1) != NULL) {
- set_topline(curwin, get_dict_number(dict, (char_u *)"topline"));
+ if ((di = tv_dict_find(dict, S_LEN("topline"))) != NULL) {
+ set_topline(curwin, tv_get_number(&di->di_tv));
}
- if (dict_find(dict, (char_u *)"topfill", -1) != NULL) {
- curwin->w_topfill = get_dict_number(dict, (char_u *)"topfill");
+ if ((di = tv_dict_find(dict, S_LEN("topfill"))) != NULL) {
+ curwin->w_topfill = tv_get_number(&di->di_tv);
}
- if (dict_find(dict, (char_u *)"leftcol", -1) != NULL) {
- curwin->w_leftcol = get_dict_number(dict, (char_u *)"leftcol");
+ if ((di = tv_dict_find(dict, S_LEN("leftcol"))) != NULL) {
+ curwin->w_leftcol = tv_get_number(&di->di_tv);
}
- if (dict_find(dict, (char_u *)"skipcol", -1) != NULL) {
- curwin->w_skipcol = get_dict_number(dict, (char_u *)"skipcol");
+ if ((di = tv_dict_find(dict, S_LEN("skipcol"))) != NULL) {
+ curwin->w_skipcol = tv_get_number(&di->di_tv);
}
check_cursor();
@@ -17171,102 +17646,165 @@ static void f_winrestview(typval_T *argvars, typval_T *rettv)
/*
* "winsaveview()" function
*/
-static void f_winsaveview(typval_T *argvars, typval_T *rettv)
+static void f_winsaveview(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
dict_T *dict;
- rettv_dict_alloc(rettv);
+ tv_dict_alloc_ret(rettv);
dict = rettv->vval.v_dict;
- dict_add_nr_str(dict, "lnum", (long)curwin->w_cursor.lnum, NULL);
- dict_add_nr_str(dict, "col", (long)curwin->w_cursor.col, NULL);
- dict_add_nr_str(dict, "coladd", (long)curwin->w_cursor.coladd, NULL);
+ tv_dict_add_nr(dict, S_LEN("lnum"), (varnumber_T)curwin->w_cursor.lnum);
+ tv_dict_add_nr(dict, S_LEN("col"), (varnumber_T)curwin->w_cursor.col);
+ tv_dict_add_nr(dict, S_LEN("coladd"), (varnumber_T)curwin->w_cursor.coladd);
update_curswant();
- dict_add_nr_str(dict, "curswant", (long)curwin->w_curswant, NULL);
+ tv_dict_add_nr(dict, S_LEN("curswant"), (varnumber_T)curwin->w_curswant);
- dict_add_nr_str(dict, "topline", (long)curwin->w_topline, NULL);
- dict_add_nr_str(dict, "topfill", (long)curwin->w_topfill, NULL);
- dict_add_nr_str(dict, "leftcol", (long)curwin->w_leftcol, NULL);
- dict_add_nr_str(dict, "skipcol", (long)curwin->w_skipcol, NULL);
+ tv_dict_add_nr(dict, S_LEN("topline"), (varnumber_T)curwin->w_topline);
+ tv_dict_add_nr(dict, S_LEN("topfill"), (varnumber_T)curwin->w_topfill);
+ tv_dict_add_nr(dict, S_LEN("leftcol"), (varnumber_T)curwin->w_leftcol);
+ tv_dict_add_nr(dict, S_LEN("skipcol"), (varnumber_T)curwin->w_skipcol);
}
-/// Writes list of strings to file
-static bool write_list(FILE *fd, list_T *list, bool binary)
+/// Write "list" of strings to file "fd".
+///
+/// @param fp File to write to.
+/// @param[in] list List to write.
+/// @param[in] binary Whether to write in binary mode.
+///
+/// @return true in case of success, false otherwise.
+static bool write_list(FileDescriptor *const fp, const list_T *const list,
+ const bool binary)
+ FUNC_ATTR_NONNULL_ARG(1)
{
- int ret = true;
-
- for (listitem_T *li = list->lv_first; li != NULL; li = li->li_next) {
- for (char_u *s = get_tv_string(&li->li_tv); *s != NUL; ++s) {
- if (putc(*s == '\n' ? NUL : *s, fd) == EOF) {
- ret = false;
- break;
+ int error = 0;
+ TV_LIST_ITER_CONST(list, li, {
+ const char *const s = tv_get_string_chk(TV_LIST_ITEM_TV(li));
+ if (s == NULL) {
+ return false;
+ }
+ const char *hunk_start = s;
+ for (const char *p = hunk_start;; p++) {
+ if (*p == NUL || *p == NL) {
+ if (p != hunk_start) {
+ const ptrdiff_t written = file_write(fp, hunk_start,
+ (size_t)(p - hunk_start));
+ if (written < 0) {
+ error = (int)written;
+ goto write_list_error;
+ }
+ }
+ if (*p == NUL) {
+ break;
+ } else {
+ hunk_start = p + 1;
+ const ptrdiff_t written = file_write(fp, (char[]){ NUL }, 1);
+ if (written < 0) {
+ error = (int)written;
+ break;
+ }
+ }
}
}
- if (!binary || li->li_next != NULL) {
- if (putc('\n', fd) == EOF) {
- ret = false;
- break;
+ if (!binary || TV_LIST_ITEM_NEXT(list, li) != NULL) {
+ const ptrdiff_t written = file_write(fp, "\n", 1);
+ if (written < 0) {
+ error = (int)written;
+ goto write_list_error;
}
}
- if (ret == false) {
- EMSG(_(e_write));
- break;
- }
+ });
+ if ((error = file_flush(fp)) != 0) {
+ goto write_list_error;
}
- return ret;
+ return true;
+write_list_error:
+ emsgf(_("E80: Error while writing: %s"), os_strerror(error));
+ return false;
}
/// Saves a typval_T as a string.
///
-/// For lists, replaces NLs with NUL and separates items with NLs.
+/// For lists or buffers, replaces NLs with NUL and separates items with NLs.
///
-/// @param[in] tv A value to store as a string.
-/// @param[out] len The length of the resulting string or -1 on error.
+/// @param[in] tv Value to store as a string.
+/// @param[out] len Length of the resulting string or -1 on error.
/// @param[in] endnl If true, the output will end in a newline (if a list).
/// @returns an allocated string if `tv` represents a VimL string, list, or
/// number; NULL otherwise.
-static char_u *save_tv_as_string(typval_T *tv, ssize_t *len, bool endnl)
+static char *save_tv_as_string(typval_T *tv, ptrdiff_t *const len, bool endnl)
FUNC_ATTR_MALLOC FUNC_ATTR_NONNULL_ALL
{
+ *len = 0;
if (tv->v_type == VAR_UNKNOWN) {
- *len = 0;
return NULL;
}
- // For types other than list, let get_tv_string_buf_chk() get the value or
+ // For other types, let tv_get_string_buf_chk() get the value or
// print an error.
- if (tv->v_type != VAR_LIST) {
- char_u *ret = get_tv_string_chk(tv);
- if (ret && (*len = STRLEN(ret))) {
- ret = vim_strsave(ret);
+ if (tv->v_type != VAR_LIST && tv->v_type != VAR_NUMBER) {
+ const char *ret = tv_get_string_chk(tv);
+ if (ret) {
+ *len = strlen(ret);
+ return xmemdupz(ret, (size_t)(*len));
} else {
- ret = NULL;
*len = -1;
+ return NULL;
}
+ }
+
+ if (tv->v_type == VAR_NUMBER) { // Treat number as a buffer-id.
+ buf_T *buf = buflist_findnr(tv->vval.v_number);
+ if (buf) {
+ for (linenr_T lnum = 1; lnum <= buf->b_ml.ml_line_count; lnum++) {
+ for (char_u *p = ml_get_buf(buf, lnum, false); *p != NUL; p++) {
+ *len += 1;
+ }
+ *len += 1;
+ }
+ } else {
+ EMSGN(_(e_nobufnr), tv->vval.v_number);
+ *len = -1;
+ return NULL;
+ }
+
+ if (*len == 0) {
+ return NULL;
+ }
+
+ char *ret = xmalloc(*len + 1);
+ char *end = ret;
+ for (linenr_T lnum = 1; lnum <= buf->b_ml.ml_line_count; lnum++) {
+ for (char_u *p = ml_get_buf(buf, lnum, false); *p != NUL; p++) {
+ *end++ = (*p == '\n') ? NUL : *p;
+ }
+ *end++ = '\n';
+ }
+ *end = NUL;
+ *len = end - ret;
return ret;
}
+ assert(tv->v_type == VAR_LIST);
// Pre-calculate the resulting length.
- *len = 0;
list_T *list = tv->vval.v_list;
- for (listitem_T *li = list->lv_first; li != NULL; li = li->li_next) {
- *len += STRLEN(get_tv_string(&li->li_tv)) + 1;
- }
+ TV_LIST_ITER_CONST(list, li, {
+ *len += strlen(tv_get_string(TV_LIST_ITEM_TV(li))) + 1;
+ });
if (*len == 0) {
return NULL;
}
- char_u *ret = xmalloc(*len + endnl);
- char_u *end = ret;
- for (listitem_T *li = list->lv_first; li != NULL; li = li->li_next) {
- for (char_u *s = get_tv_string(&li->li_tv); *s != NUL; s++) {
+ char *ret = xmalloc(*len + endnl);
+ char *end = ret;
+ TV_LIST_ITER_CONST(list, li, {
+ for (const char *s = tv_get_string(TV_LIST_ITEM_TV(li)); *s != NUL; s++) {
*end++ = (*s == '\n') ? NUL : *s;
}
- if (endnl || li->li_next != NULL) {
+ if (endnl || TV_LIST_ITEM_NEXT(list, li) != NULL) {
*end++ = '\n';
}
- }
+ });
*end = NUL;
*len = end - ret;
return ret;
@@ -17275,7 +17813,7 @@ static char_u *save_tv_as_string(typval_T *tv, ssize_t *len, bool endnl)
/*
* "winwidth(nr)" function
*/
-static void f_winwidth(typval_T *argvars, typval_T *rettv)
+static void f_winwidth(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
win_T *wp;
@@ -17287,16 +17825,16 @@ static void f_winwidth(typval_T *argvars, typval_T *rettv)
}
/// "wordcount()" function
-static void f_wordcount(typval_T *argvars, typval_T *rettv)
+static void f_wordcount(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- rettv_dict_alloc(rettv);
+ tv_dict_alloc_ret(rettv);
cursor_pos_info(rettv->vval.v_dict);
}
/// "writefile()" function
-static void f_writefile(typval_T *argvars, typval_T *rettv)
+static void f_writefile(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- rettv->vval.v_number = 0; // Assuming success.
+ rettv->vval.v_number = -1;
if (check_restricted() || check_secure()) {
return;
@@ -17306,117 +17844,155 @@ static void f_writefile(typval_T *argvars, typval_T *rettv)
EMSG2(_(e_listarg), "writefile()");
return;
}
- if (argvars[0].vval.v_list == NULL) {
- return;
- }
+ const list_T *const list = argvars[0].vval.v_list;
+ TV_LIST_ITER_CONST(list, li, {
+ if (!tv_check_str_or_nr(TV_LIST_ITEM_TV(li))) {
+ return;
+ }
+ });
bool binary = false;
bool append = false;
+ bool do_fsync = !!p_fs;
if (argvars[2].v_type != VAR_UNKNOWN) {
- if (vim_strchr(get_tv_string(&argvars[2]), 'b')) {
- binary = true;
+ const char *const flags = tv_get_string_chk(&argvars[2]);
+ if (flags == NULL) {
+ return;
}
- if (vim_strchr(get_tv_string(&argvars[2]), 'a')) {
- append = true;
+ for (const char *p = flags; *p; p++) {
+ switch (*p) {
+ case 'b': { binary = true; break; }
+ case 'a': { append = true; break; }
+ case 's': { do_fsync = true; break; }
+ case 'S': { do_fsync = false; break; }
+ default: {
+ // Using %s, p and not %c, *p to preserve multibyte characters
+ emsgf(_("E5060: Unknown flag: %s"), p);
+ return;
+ }
+ }
}
}
- // Always open the file in binary mode, library functions have a mind of
- // their own about CR-LF conversion.
- char_u *fname = get_tv_string(&argvars[1]);
- FILE *fd;
- if (*fname == NUL || (fd = mch_fopen((char *)fname,
- append ? APPENDBIN : WRITEBIN)) == NULL) {
- EMSG2(_(e_notcreate), *fname == NUL ? (char_u *)_("<empty>") : fname);
- rettv->vval.v_number = -1;
+ char buf[NUMBUFLEN];
+ const char *const fname = tv_get_string_buf_chk(&argvars[1], buf);
+ if (fname == NULL) {
+ return;
+ }
+ FileDescriptor fp;
+ int error;
+ if (*fname == NUL) {
+ EMSG(_("E482: Can't open file with an empty name"));
+ } else if ((error = file_open(&fp, fname,
+ ((append ? kFileAppend : kFileTruncate)
+ | kFileCreate), 0666)) != 0) {
+ emsgf(_("E482: Can't open file %s for writing: %s"),
+ fname, os_strerror(error));
} else {
- if (write_list(fd, argvars[0].vval.v_list, binary) == false) {
- rettv->vval.v_number = -1;
+ if (write_list(&fp, list, binary)) {
+ rettv->vval.v_number = 0;
+ }
+ if ((error = file_close(&fp, do_fsync)) != 0) {
+ emsgf(_("E80: Error when closing file %s: %s"),
+ fname, os_strerror(error));
}
- fclose(fd);
}
}
/*
* "xor(expr, expr)" function
*/
-static void f_xor(typval_T *argvars, typval_T *rettv)
+static void f_xor(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- rettv->vval.v_number = get_tv_number_chk(&argvars[0], NULL)
- ^ get_tv_number_chk(&argvars[1], NULL);
+ rettv->vval.v_number = tv_get_number_chk(&argvars[0], NULL)
+ ^ tv_get_number_chk(&argvars[1], NULL);
}
-/*
- * Translate a String variable into a position.
- * Returns NULL when there is an error.
- */
-static pos_T *
-var2fpos (
- typval_T *varp,
- int dollar_lnum, /* TRUE when $ is last line */
- int *fnum /* set to fnum for '0, 'A, etc. */
-)
+/// Translate a VimL object into a position
+///
+/// Accepts VAR_LIST and VAR_STRING objects. Does not give an error for invalid
+/// type.
+///
+/// @param[in] tv Object to translate.
+/// @param[in] dollar_lnum True when "$" is last line.
+/// @param[out] ret_fnum Set to fnum for marks.
+///
+/// @return Pointer to position or NULL in case of error (e.g. invalid type).
+pos_T *var2fpos(const typval_T *const tv, const int dollar_lnum,
+ int *const ret_fnum)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
{
- char_u *name;
static pos_T pos;
pos_T *pp;
- /* Argument can be [lnum, col, coladd]. */
- if (varp->v_type == VAR_LIST) {
+ // Argument can be [lnum, col, coladd].
+ if (tv->v_type == VAR_LIST) {
list_T *l;
int len;
- int error = FALSE;
- listitem_T *li;
+ bool error = false;
+ listitem_T *li;
- l = varp->vval.v_list;
- if (l == NULL)
+ l = tv->vval.v_list;
+ if (l == NULL) {
return NULL;
+ }
- /* Get the line number */
- pos.lnum = list_find_nr(l, 0L, &error);
- if (error || pos.lnum <= 0 || pos.lnum > curbuf->b_ml.ml_line_count)
- return NULL; /* invalid line number */
+ // Get the line number.
+ pos.lnum = tv_list_find_nr(l, 0L, &error);
+ if (error || pos.lnum <= 0 || pos.lnum > curbuf->b_ml.ml_line_count) {
+ // Invalid line number.
+ return NULL;
+ }
- /* Get the column number */
- pos.col = list_find_nr(l, 1L, &error);
- if (error)
+ // Get the column number.
+ pos.col = tv_list_find_nr(l, 1L, &error);
+ if (error) {
return NULL;
+ }
len = (long)STRLEN(ml_get(pos.lnum));
- /* We accept "$" for the column number: last column. */
- li = list_find(l, 1L);
- if (li != NULL && li->li_tv.v_type == VAR_STRING
- && li->li_tv.vval.v_string != NULL
- && STRCMP(li->li_tv.vval.v_string, "$") == 0)
+ // We accept "$" for the column number: last column.
+ li = tv_list_find(l, 1L);
+ if (li != NULL && TV_LIST_ITEM_TV(li)->v_type == VAR_STRING
+ && TV_LIST_ITEM_TV(li)->vval.v_string != NULL
+ && STRCMP(TV_LIST_ITEM_TV(li)->vval.v_string, "$") == 0) {
pos.col = len + 1;
+ }
- /* Accept a position up to the NUL after the line. */
- if (pos.col == 0 || (int)pos.col > len + 1)
- return NULL; /* invalid column number */
- --pos.col;
+ // Accept a position up to the NUL after the line.
+ if (pos.col == 0 || (int)pos.col > len + 1) {
+ // Invalid column number.
+ return NULL;
+ }
+ pos.col--;
- /* Get the virtual offset. Defaults to zero. */
- pos.coladd = list_find_nr(l, 2L, &error);
- if (error)
+ // Get the virtual offset. Defaults to zero.
+ pos.coladd = tv_list_find_nr(l, 2L, &error);
+ if (error) {
pos.coladd = 0;
+ }
return &pos;
}
- name = get_tv_string_chk(varp);
- if (name == NULL)
+ const char *const name = tv_get_string_chk(tv);
+ if (name == NULL) {
return NULL;
- if (name[0] == '.') /* cursor */
+ }
+ if (name[0] == '.') { // Cursor.
return &curwin->w_cursor;
- if (name[0] == 'v' && name[1] == NUL) { /* Visual start */
- if (VIsual_active)
+ }
+ if (name[0] == 'v' && name[1] == NUL) { // Visual start.
+ if (VIsual_active) {
return &VIsual;
+ }
return &curwin->w_cursor;
}
- if (name[0] == '\'') { /* mark */
- pp = getmark_buf_fnum(curbuf, name[1], FALSE, fnum);
- if (pp == NULL || pp == (pos_T *)-1 || pp->lnum <= 0)
+ if (name[0] == '\'') { // Mark.
+ pp = getmark_buf_fnum(curbuf, (uint8_t)name[1], false, ret_fnum);
+ if (pp == NULL || pp == (pos_T *)-1 || pp->lnum <= 0) {
return NULL;
+ }
return pp;
}
@@ -17426,11 +18002,14 @@ var2fpos (
pos.col = 0;
if (name[1] == '0') { /* "w0": first visible line */
update_topline();
- pos.lnum = curwin->w_topline;
+ // In silent Ex mode topline is zero, but that's not a valid line
+ // number; use one instead.
+ pos.lnum = curwin->w_topline > 0 ? curwin->w_topline : 1;
return &pos;
} else if (name[1] == '$') { /* "w$": last visible line */
validate_botline();
- pos.lnum = curwin->w_botline - 1;
+ // In silent Ex mode botline is zero, return zero then.
+ pos.lnum = curwin->w_botline > 0 ? curwin->w_botline - 1 : 0;
return &pos;
}
} else if (name[0] == '$') { /* last column or line */
@@ -17456,45 +18035,51 @@ var2fpos (
*/
static int list2fpos(typval_T *arg, pos_T *posp, int *fnump, colnr_T *curswantp)
{
- list_T *l = arg->vval.v_list;
+ list_T *l;
long i = 0;
long n;
- /* List must be: [fnum, lnum, col, coladd, curswant], where "fnum" is only
- * there when "fnump" isn't NULL; "coladd" and "curswant" are optional. */
+ // List must be: [fnum, lnum, col, coladd, curswant], where "fnum" is only
+ // there when "fnump" isn't NULL; "coladd" and "curswant" are optional.
if (arg->v_type != VAR_LIST
- || l == NULL
- || l->lv_len < (fnump == NULL ? 2 : 3)
- || l->lv_len > (fnump == NULL ? 4 : 5))
+ || (l = arg->vval.v_list) == NULL
+ || tv_list_len(l) < (fnump == NULL ? 2 : 3)
+ || tv_list_len(l) > (fnump == NULL ? 4 : 5)) {
return FAIL;
+ }
if (fnump != NULL) {
- n = list_find_nr(l, i++, NULL); /* fnum */
- if (n < 0)
+ n = tv_list_find_nr(l, i++, NULL); // fnum
+ if (n < 0) {
return FAIL;
- if (n == 0)
- n = curbuf->b_fnum; /* current buffer */
+ }
+ if (n == 0) {
+ n = curbuf->b_fnum; // Current buffer.
+ }
*fnump = n;
}
- n = list_find_nr(l, i++, NULL); /* lnum */
- if (n < 0)
+ n = tv_list_find_nr(l, i++, NULL); // lnum
+ if (n < 0) {
return FAIL;
+ }
posp->lnum = n;
- n = list_find_nr(l, i++, NULL); /* col */
- if (n < 0)
+ n = tv_list_find_nr(l, i++, NULL); // col
+ if (n < 0) {
return FAIL;
+ }
posp->col = n;
- n = list_find_nr(l, i, NULL); // off
- if (n < 0)
+ n = tv_list_find_nr(l, i, NULL); // off
+ if (n < 0) {
posp->coladd = 0;
- else
+ } else {
posp->coladd = n;
+ }
if (curswantp != NULL) {
- *curswantp = list_find_nr(l, i + 1, NULL); // curswant
+ *curswantp = tv_list_find_nr(l, i + 1, NULL); // curswant
}
return OK;
@@ -17505,15 +18090,16 @@ static int list2fpos(typval_T *arg, pos_T *posp, int *fnump, colnr_T *curswantp)
* Advance "arg" to the first character after the name.
* Return 0 for error.
*/
-static int get_env_len(char_u **arg)
+static int get_env_len(const char_u **arg)
{
- char_u *p;
int len;
- for (p = *arg; vim_isIDc(*p); ++p)
- ;
- if (p == *arg) /* no name found */
+ const char_u *p;
+ for (p = *arg; vim_isIDc(*p); p++) {
+ }
+ if (p == *arg) { // No name found.
return 0;
+ }
len = (int)(p - *arg);
*arg = p;
@@ -17523,11 +18109,12 @@ static int get_env_len(char_u **arg)
// Get the length of the name of a function or internal variable.
// "arg" is advanced to the first non-white character after the name.
// Return 0 if something is wrong.
-static int get_id_len(char_u **arg) {
- char_u *p;
+static int get_id_len(const char **const arg)
+{
int len;
// Find the end of the name.
+ const char *p;
for (p = *arg; eval_isnamec(*p); p++) {
if (*p == ':') {
// "s:" is start of "s:var", but "n:" is not and can be used in
@@ -17544,7 +18131,7 @@ static int get_id_len(char_u **arg) {
}
len = (int)(p - *arg);
- *arg = skipwhite(p);
+ *arg = (const char *)skipwhite((const char_u *)p);
return len;
}
@@ -17558,18 +18145,18 @@ static int get_id_len(char_u **arg) {
* If the name contains 'magic' {}'s, expand them and return the
* expanded name in an allocated string via 'alias' - caller must free.
*/
-static int get_name_len(char_u **arg, char_u **alias, int evaluate, int verbose)
+static int get_name_len(const char **const arg,
+ char **alias,
+ int evaluate,
+ int verbose)
{
int len;
- char_u *p;
- char_u *expr_start;
- char_u *expr_end;
*alias = NULL; /* default to no alias */
- if ((*arg)[0] == K_SPECIAL && (*arg)[1] == KS_EXTRA
- && (*arg)[2] == (int)KE_SNR) {
- /* hard coded <SNR>, already translated */
+ if ((*arg)[0] == (char)K_SPECIAL && (*arg)[1] == (char)KS_EXTRA
+ && (*arg)[2] == (char)KE_SNR) {
+ // Hard coded <SNR>, already translated.
*arg += 3;
return get_id_len(arg) + 3;
}
@@ -17579,17 +18166,17 @@ static int get_name_len(char_u **arg, char_u **alias, int evaluate, int verbose)
*arg += len;
}
- /*
- * Find the end of the name; check for {} construction.
- */
- p = find_name_end(*arg, &expr_start, &expr_end,
- len > 0 ? 0 : FNE_CHECK_START);
+ // Find the end of the name; check for {} construction.
+ char_u *expr_start;
+ char_u *expr_end;
+ const char *p = (const char *)find_name_end((char_u *)(*arg),
+ (const char_u **)&expr_start,
+ (const char_u **)&expr_end,
+ len > 0 ? 0 : FNE_CHECK_START);
if (expr_start != NULL) {
- char_u *temp_string;
-
if (!evaluate) {
len += (int)(p - *arg);
- *arg = skipwhite(p);
+ *arg = (const char *)skipwhite((const char_u *)p);
return len;
}
@@ -17597,11 +18184,13 @@ static int get_name_len(char_u **arg, char_u **alias, int evaluate, int verbose)
* Include any <SID> etc in the expanded string:
* Thus the -len here.
*/
- temp_string = make_expanded_name(*arg - len, expr_start, expr_end, p);
- if (temp_string == NULL)
+ char_u *temp_string = make_expanded_name((char_u *)(*arg) - len, expr_start,
+ expr_end, (char_u *)p);
+ if (temp_string == NULL) {
return -1;
- *alias = temp_string;
- *arg = skipwhite(p);
+ }
+ *alias = (char *)temp_string;
+ *arg = (const char *)skipwhite((const char_u *)p);
return (int)STRLEN(temp_string);
}
@@ -17618,12 +18207,11 @@ static int get_name_len(char_u **arg, char_u **alias, int evaluate, int verbose)
// "flags" can have FNE_INCL_BR and FNE_CHECK_START.
// Return a pointer to just after the name. Equal to "arg" if there is no
// valid name.
-static char_u *find_name_end(char_u *arg, char_u **expr_start,
- char_u **expr_end, int flags)
+static const char_u *find_name_end(const char_u *arg, const char_u **expr_start,
+ const char_u **expr_end, int flags)
{
int mb_nest = 0;
int br_nest = 0;
- char_u *p;
int len;
if (expr_start != NULL) {
@@ -17636,21 +18224,23 @@ static char_u *find_name_end(char_u *arg, char_u **expr_start,
return arg;
}
+ const char_u *p;
for (p = arg; *p != NUL
&& (eval_isnamec(*p)
|| *p == '{'
|| ((flags & FNE_INCL_BR) && (*p == '[' || *p == '.'))
|| mb_nest != 0
- || br_nest != 0); mb_ptr_adv(p)) {
+ || br_nest != 0); MB_PTR_ADV(p)) {
if (*p == '\'') {
- /* skip over 'string' to avoid counting [ and ] inside it. */
- for (p = p + 1; *p != NUL && *p != '\''; mb_ptr_adv(p))
- ;
- if (*p == NUL)
+ // skip over 'string' to avoid counting [ and ] inside it.
+ for (p = p + 1; *p != NUL && *p != '\''; MB_PTR_ADV(p)) {
+ }
+ if (*p == NUL) {
break;
+ }
} else if (*p == '"') {
// skip over "str\"ing" to avoid counting [ and ] inside it.
- for (p = p + 1; *p != NUL && *p != '"'; mb_ptr_adv(p)) {
+ for (p = p + 1; *p != NUL && *p != '"'; MB_PTR_ADV(p)) {
if (*p == '\\' && p[1] != NUL) {
++p;
}
@@ -17707,7 +18297,8 @@ static char_u *find_name_end(char_u *arg, char_u **expr_start,
* Returns a new allocated string, which the caller must free.
* Returns NULL for failure.
*/
-static char_u *make_expanded_name(char_u *in_start, char_u *expr_start, char_u *expr_end, char_u *in_end)
+static char_u *make_expanded_name(const char_u *in_start, char_u *expr_start,
+ char_u *expr_end, char_u *in_end)
{
char_u c1;
char_u *retval = NULL;
@@ -17736,7 +18327,9 @@ static char_u *make_expanded_name(char_u *in_start, char_u *expr_start, char_u *
*expr_end = '}';
if (retval != NULL) {
- temp_result = find_name_end(retval, &expr_start, &expr_end, 0);
+ temp_result = (char_u *)find_name_end(retval,
+ (const char_u **)&expr_start,
+ (const char_u **)&expr_end, 0);
if (expr_start != NULL) {
/* Further expansion! */
temp_result = make_expanded_name(retval, expr_start,
@@ -17770,17 +18363,17 @@ static int eval_isnamec1(int c)
/*
* Get number v: variable value.
*/
-long get_vim_var_nr(int idx) FUNC_ATTR_PURE
+varnumber_T get_vim_var_nr(int idx) FUNC_ATTR_PURE
{
return vimvars[idx].vv_nr;
}
-/*
- * Get string v: variable value. Uses a static buffer, can only be used once.
- */
+// Get string v: variable value. Uses a static buffer, can only be used once.
+// If the String variable has never been set, return an empty string.
+// Never returns NULL;
char_u *get_vim_var_str(int idx) FUNC_ATTR_PURE FUNC_ATTR_NONNULL_RET
{
- return get_tv_string(&vimvars[idx].vv_tv);
+ return (char_u *)tv_get_string(&vimvars[idx].vv_tv);
}
/*
@@ -17806,12 +18399,7 @@ void set_vim_var_char(int c)
{
char buf[MB_MAXBYTES + 1];
- if (has_mbyte) {
- buf[(*mb_char2bytes)(c, (char_u *) buf)] = NUL;
- } else {
- buf[0] = c;
- buf[1] = NUL;
- }
+ buf[utf_char2bytes(c, (char_u *)buf)] = NUL;
set_vim_var_string(VV_CHAR, buf, -1);
}
@@ -17833,6 +18421,8 @@ void set_vcount(long count, long count1, int set_prevcount)
/// @param[in] val Value to set to.
void set_vim_var_nr(const VimVarIndex idx, const varnumber_T val)
{
+ tv_clear(&vimvars[idx].vv_tv);
+ vimvars[idx].vv_type = VAR_NUMBER;
vimvars[idx].vv_nr = val;
}
@@ -17842,6 +18432,8 @@ void set_vim_var_nr(const VimVarIndex idx, const varnumber_T val)
/// @param[in] val Value to set to.
void set_vim_var_special(const VimVarIndex idx, const SpecialVarValue val)
{
+ tv_clear(&vimvars[idx].vv_tv);
+ vimvars[idx].vv_type = VAR_SPECIAL;
vimvars[idx].vv_special = val;
}
@@ -17854,7 +18446,7 @@ void set_vim_var_special(const VimVarIndex idx, const SpecialVarValue val)
void set_vim_var_string(const VimVarIndex idx, const char *const val,
const ptrdiff_t len)
{
- clear_tv(&vimvars[idx].vv_di.di_tv);
+ tv_clear(&vimvars[idx].vv_di.di_tv);
vimvars[idx].vv_type = VAR_STRING;
if (val == NULL) {
vimvars[idx].vv_str = NULL;
@@ -17871,11 +18463,11 @@ void set_vim_var_string(const VimVarIndex idx, const char *const val,
/// @param[in,out] val Value to set to. Reference count will be incremented.
void set_vim_var_list(const VimVarIndex idx, list_T *const val)
{
- clear_tv(&vimvars[idx].vv_di.di_tv);
+ tv_clear(&vimvars[idx].vv_di.di_tv);
vimvars[idx].vv_type = VAR_LIST;
vimvars[idx].vv_list = val;
if (val != NULL) {
- val->lv_refcount++;
+ tv_list_ref(val);
}
}
@@ -17886,14 +18478,14 @@ void set_vim_var_list(const VimVarIndex idx, list_T *const val)
/// Also keys of the dictionary will be made read-only.
void set_vim_var_dict(const VimVarIndex idx, dict_T *const val)
{
- clear_tv(&vimvars[idx].vv_di.di_tv);
+ tv_clear(&vimvars[idx].vv_di.di_tv);
vimvars[idx].vv_type = VAR_DICT;
vimvars[idx].vv_dict = val;
if (val != NULL) {
val->dv_refcount++;
// Set readonly
- dict_set_keys_readonly(val);
+ tv_dict_set_keys_readonly(val);
}
}
@@ -18011,9 +18603,8 @@ char_u *set_cmdarg(exarg_T *eap, char_u *oldarg)
* Get the value of internal variable "name".
* Return OK or FAIL.
*/
-static int
-get_var_tv (
- char_u *name,
+static int get_var_tv(
+ const char *name,
int len, // length of "name"
typval_T *rettv, // NULL when only checking existence
dictitem_T **dip, // non-NULL when typval's dict item is needed
@@ -18023,55 +18614,52 @@ get_var_tv (
{
int ret = OK;
typval_T *tv = NULL;
- typval_T atv;
dictitem_T *v;
- int cc;
- /* truncate the name, so that we can use strcmp() */
- cc = name[len];
- name[len] = NUL;
-
- /*
- * Check for "b:changedtick".
- */
- if (STRCMP(name, "b:changedtick") == 0) {
- atv.v_type = VAR_NUMBER;
- atv.vval.v_number = curbuf->b_changedtick;
- tv = &atv;
- }
- /*
- * Check for user-defined variables.
- */
- else {
- v = find_var(name, NULL, no_autoload);
- if (v != NULL) {
- tv = &v->di_tv;
- if (dip != NULL) {
- *dip = v;
- }
+ v = find_var(name, (size_t)len, NULL, no_autoload);
+ if (v != NULL) {
+ tv = &v->di_tv;
+ if (dip != NULL) {
+ *dip = v;
}
}
if (tv == NULL) {
- if (rettv != NULL && verbose)
- EMSG2(_(e_undefvar), name);
+ if (rettv != NULL && verbose) {
+ emsgf(_("E121: Undefined variable: %.*s"), len, name);
+ }
ret = FAIL;
- } else if (rettv != NULL)
- copy_tv(tv, rettv);
-
- name[len] = cc;
+ } else if (rettv != NULL) {
+ tv_copy(tv, rettv);
+ }
return ret;
}
-/*
- * Handle expr[expr], expr[expr:expr] subscript and .name lookup.
- * Also handle function call with Funcref variable: func(expr)
- * Can all be combined: dict.func(expr)[idx]['func'](expr)
- */
-static int
-handle_subscript (
- char_u **arg,
+/// Check if variable "name[len]" is a local variable or an argument.
+/// If so, "*eval_lavars_used" is set to TRUE.
+static void check_vars(const char *name, size_t len)
+{
+ if (eval_lavars_used == NULL) {
+ return;
+ }
+
+ const char *varname;
+ hashtab_T *ht = find_var_ht(name, len, &varname);
+
+ if (ht == get_funccal_local_ht() || ht == get_funccal_args_ht()) {
+ if (find_var(name, len, NULL, true) != NULL) {
+ *eval_lavars_used = true;
+ }
+ }
+}
+
+/// Handle expr[expr], expr[expr:expr] subscript and .name lookup.
+/// Also handle function call with Funcref variable: func(expr)
+/// Can all be combined: dict.func(expr)[idx]['func'](expr)
+static int
+handle_subscript(
+ const char **const arg,
typval_T *rettv,
int evaluate, /* do more than finding the end */
int verbose /* give error messages */
@@ -18086,493 +18674,219 @@ handle_subscript (
while (ret == OK
&& (**arg == '['
|| (**arg == '.' && rettv->v_type == VAR_DICT)
- || (**arg == '(' && (!evaluate || rettv->v_type == VAR_FUNC)))
+ || (**arg == '(' && (!evaluate || tv_is_func(*rettv))))
&& !ascii_iswhite(*(*arg - 1))) {
if (**arg == '(') {
- /* need to copy the funcref so that we can clear rettv */
+ partial_T *pt = NULL;
+ // need to copy the funcref so that we can clear rettv
if (evaluate) {
functv = *rettv;
rettv->v_type = VAR_UNKNOWN;
- /* Invoke the function. Recursive! */
- s = functv.vval.v_string;
- } else
+ // Invoke the function. Recursive!
+ if (functv.v_type == VAR_PARTIAL) {
+ pt = functv.vval.v_partial;
+ s = partial_name(pt);
+ } else {
+ s = functv.vval.v_string;
+ }
+ } else {
s = (char_u *)"";
- ret = get_func_tv(s, (int)STRLEN(s), rettv, arg,
- curwin->w_cursor.lnum, curwin->w_cursor.lnum,
- &len, evaluate, selfdict);
+ }
+ ret = get_func_tv(s, (int)STRLEN(s), rettv, (char_u **)arg,
+ curwin->w_cursor.lnum, curwin->w_cursor.lnum,
+ &len, evaluate, pt, selfdict);
- /* Clear the funcref afterwards, so that deleting it while
- * evaluating the arguments is possible (see test55). */
- if (evaluate)
- clear_tv(&functv);
+ // Clear the funcref afterwards, so that deleting it while
+ // evaluating the arguments is possible (see test55).
+ if (evaluate) {
+ tv_clear(&functv);
+ }
/* Stop the expression evaluation when immediately aborting on
* error, or when an interrupt occurred or an exception was thrown
* but not caught. */
if (aborting()) {
- if (ret == OK)
- clear_tv(rettv);
+ if (ret == OK) {
+ tv_clear(rettv);
+ }
ret = FAIL;
}
- dict_unref(selfdict);
+ tv_dict_unref(selfdict);
selfdict = NULL;
- } else { /* **arg == '[' || **arg == '.' */
- dict_unref(selfdict);
+ } else { // **arg == '[' || **arg == '.'
+ tv_dict_unref(selfdict);
if (rettv->v_type == VAR_DICT) {
selfdict = rettv->vval.v_dict;
if (selfdict != NULL)
++selfdict->dv_refcount;
} else
selfdict = NULL;
- if (eval_index(arg, rettv, evaluate, verbose) == FAIL) {
- clear_tv(rettv);
+ if (eval_index((char_u **)arg, rettv, evaluate, verbose) == FAIL) {
+ tv_clear(rettv);
ret = FAIL;
}
}
}
- dict_unref(selfdict);
- return ret;
-}
-/*
- * Free the memory for a variable type-value.
- */
-void free_tv(typval_T *varp)
-{
- if (varp != NULL) {
- switch (varp->v_type) {
- case VAR_FUNC:
- func_unref(varp->vval.v_string);
- // FALLTHROUGH
- case VAR_STRING:
- xfree(varp->vval.v_string);
- break;
- case VAR_LIST:
- list_unref(varp->vval.v_list);
- break;
- case VAR_DICT:
- dict_unref(varp->vval.v_dict);
- break;
- case VAR_SPECIAL:
- case VAR_NUMBER:
- case VAR_FLOAT:
- case VAR_UNKNOWN:
- break;
- }
- xfree(varp);
- }
-}
-
-#define TYPVAL_ENCODE_ALLOW_SPECIALS false
-
-#define TYPVAL_ENCODE_CONV_NIL() \
- do { \
- tv->vval.v_special = kSpecialVarFalse; \
- tv->v_lock = VAR_UNLOCKED; \
- } while (0)
-
-#define TYPVAL_ENCODE_CONV_BOOL(ignored) \
- TYPVAL_ENCODE_CONV_NIL()
-
-#define TYPVAL_ENCODE_CONV_NUMBER(ignored) \
- do { \
- (void)ignored; \
- tv->vval.v_number = 0; \
- tv->v_lock = VAR_UNLOCKED; \
- } while (0)
-
-#define TYPVAL_ENCODE_CONV_UNSIGNED_NUMBER(ignored) \
- assert(false)
-
-#define TYPVAL_ENCODE_CONV_FLOAT(ignored) \
- do { \
- tv->vval.v_float = 0; \
- tv->v_lock = VAR_UNLOCKED; \
- } while (0)
-
-#define TYPVAL_ENCODE_CONV_STRING(str, ignored) \
- do { \
- xfree(str); \
- tv->vval.v_string = NULL; \
- tv->v_lock = VAR_UNLOCKED; \
- } while (0)
-
-#define TYPVAL_ENCODE_CONV_STR_STRING(ignored1, ignored2)
-
-#define TYPVAL_ENCODE_CONV_EXT_STRING(ignored1, ignored2, ignored3)
-
-#define TYPVAL_ENCODE_CONV_FUNC(fun) \
- do { \
- func_unref(fun); \
- if (fun != empty_string) { \
- xfree(fun); \
- } \
- tv->vval.v_string = NULL; \
- tv->v_lock = VAR_UNLOCKED; \
- } while (0)
-
-#define TYPVAL_ENCODE_CONV_EMPTY_LIST() \
- do { \
- list_unref(tv->vval.v_list); \
- tv->vval.v_list = NULL; \
- tv->v_lock = VAR_UNLOCKED; \
- } while (0)
-
-#define TYPVAL_ENCODE_CONV_EMPTY_DICT() \
- do { \
- dict_unref(tv->vval.v_dict); \
- tv->vval.v_dict = NULL; \
- tv->v_lock = VAR_UNLOCKED; \
- } while (0)
-
-#define TYPVAL_ENCODE_CONV_LIST_START(ignored) \
- do { \
- if (tv->vval.v_list->lv_refcount > 1) { \
- tv->vval.v_list->lv_refcount--; \
- tv->vval.v_list = NULL; \
- tv->v_lock = VAR_UNLOCKED; \
- return OK; \
- } \
- } while (0)
-
-#define TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS()
-
-#define TYPVAL_ENCODE_CONV_LIST_END() \
- do { \
- typval_T *const cur_tv = cur_mpsv->tv; \
- assert(cur_tv->v_type == VAR_LIST); \
- list_unref(cur_tv->vval.v_list); \
- cur_tv->vval.v_list = NULL; \
- cur_tv->v_lock = VAR_UNLOCKED; \
- } while (0)
-
-#define TYPVAL_ENCODE_CONV_DICT_START(ignored) \
- do { \
- if (tv->vval.v_dict->dv_refcount > 1) { \
- tv->vval.v_dict->dv_refcount--; \
- tv->vval.v_dict = NULL; \
- tv->v_lock = VAR_UNLOCKED; \
- return OK; \
- } \
- } while (0)
-
-#define TYPVAL_ENCODE_CONV_SPECIAL_DICT_KEY_CHECK(ignored1, ignored2)
-
-#define TYPVAL_ENCODE_CONV_DICT_AFTER_KEY()
-
-#define TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS()
-
-#define TYPVAL_ENCODE_CONV_DICT_END() \
- do { \
- typval_T *const cur_tv = cur_mpsv->tv; \
- assert(cur_tv->v_type == VAR_DICT); \
- dict_unref(cur_tv->vval.v_dict); \
- cur_tv->vval.v_dict = NULL; \
- cur_tv->v_lock = VAR_UNLOCKED; \
- } while (0)
-
-#define TYPVAL_ENCODE_CONV_RECURSE(ignored1, ignored2)
-
-TYPVAL_ENCODE_DEFINE_CONV_FUNCTIONS(static, nothing, void *, ignored)
-
-#undef TYPVAL_ENCODE_ALLOW_SPECIALS
-#undef TYPVAL_ENCODE_CONV_NIL
-#undef TYPVAL_ENCODE_CONV_BOOL
-#undef TYPVAL_ENCODE_CONV_NUMBER
-#undef TYPVAL_ENCODE_CONV_UNSIGNED_NUMBER
-#undef TYPVAL_ENCODE_CONV_FLOAT
-#undef TYPVAL_ENCODE_CONV_STRING
-#undef TYPVAL_ENCODE_CONV_STR_STRING
-#undef TYPVAL_ENCODE_CONV_EXT_STRING
-#undef TYPVAL_ENCODE_CONV_FUNC
-#undef TYPVAL_ENCODE_CONV_EMPTY_LIST
-#undef TYPVAL_ENCODE_CONV_EMPTY_DICT
-#undef TYPVAL_ENCODE_CONV_LIST_START
-#undef TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS
-#undef TYPVAL_ENCODE_CONV_LIST_END
-#undef TYPVAL_ENCODE_CONV_DICT_START
-#undef TYPVAL_ENCODE_CONV_SPECIAL_DICT_KEY_CHECK
-#undef TYPVAL_ENCODE_CONV_DICT_AFTER_KEY
-#undef TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS
-#undef TYPVAL_ENCODE_CONV_DICT_END
-#undef TYPVAL_ENCODE_CONV_RECURSE
-
-/// Free memory for a variable value and set the value to NULL or 0
-///
-/// @param[in,out] varp Value to free.
-void clear_tv(typval_T *varp)
-{
- if (varp != NULL && varp->v_type != VAR_UNKNOWN) {
- encode_vim_to_nothing(varp, varp, "clear_tv argument");
+ // Turn "dict.Func" into a partial for "Func" bound to "dict".
+ if (selfdict != NULL && tv_is_func(*rettv)) {
+ set_selfdict(rettv, selfdict);
}
-}
-/*
- * Set the value of a variable to NULL without freeing items.
- */
-static void init_tv(typval_T *varp)
-{
- if (varp != NULL)
- memset(varp, 0, sizeof(typval_T));
+ tv_dict_unref(selfdict);
+ return ret;
}
-/*
- * Get the number value of a variable.
- * If it is a String variable, uses vim_str2nr().
- * For incompatible types, return 0.
- * get_tv_number_chk() is similar to get_tv_number(), but informs the
- * caller of incompatible types: it sets *denote to TRUE if "denote"
- * is not NULL or returns -1 otherwise.
- */
-static long get_tv_number(typval_T *varp)
+void set_selfdict(typval_T *rettv, dict_T *selfdict)
{
- int error = FALSE;
-
- return get_tv_number_chk(varp, &error); /* return 0L on error */
-}
+ // Don't do this when "dict.Func" is already a partial that was bound
+ // explicitly (pt_auto is false).
+ if (rettv->v_type == VAR_PARTIAL && !rettv->vval.v_partial->pt_auto
+ && rettv->vval.v_partial->pt_dict != NULL) {
+ return;
+ }
+ char_u *fname;
+ char_u *tofree = NULL;
+ ufunc_T *fp;
+ char_u fname_buf[FLEN_FIXED + 1];
+ int error;
-long get_tv_number_chk(typval_T *varp, int *denote)
-{
- long n = 0L;
+ if (rettv->v_type == VAR_PARTIAL && rettv->vval.v_partial->pt_func != NULL) {
+ fp = rettv->vval.v_partial->pt_func;
+ } else {
+ fname = rettv->v_type == VAR_FUNC || rettv->v_type == VAR_STRING
+ ? rettv->vval.v_string
+ : rettv->vval.v_partial->pt_name;
+ // Translate "s:func" to the stored function name.
+ fname = fname_trans_sid(fname, fname_buf, &tofree, &error);
+ fp = find_func(fname);
+ xfree(tofree);
+ }
- switch (varp->v_type) {
- case VAR_NUMBER:
- return (long)(varp->vval.v_number);
- case VAR_FLOAT:
- EMSG(_("E805: Using a Float as a Number"));
- break;
- case VAR_FUNC:
- EMSG(_("E703: Using a Funcref as a Number"));
- break;
- case VAR_STRING:
- if (varp->vval.v_string != NULL) {
- vim_str2nr(varp->vval.v_string, NULL, NULL,
- STR2NR_ALL, &n, NULL, 0);
- }
- return n;
- case VAR_LIST:
- EMSG(_("E745: Using a List as a Number"));
- break;
- case VAR_DICT:
- EMSG(_("E728: Using a Dictionary as a Number"));
- break;
- case VAR_SPECIAL:
- switch (varp->vval.v_special) {
- case kSpecialVarTrue: {
- return 1;
+ // Turn "dict.Func" into a partial for "Func" with "dict".
+ if (fp != NULL && (fp->uf_flags & FC_DICT)) {
+ partial_T *pt = (partial_T *)xcalloc(1, sizeof(partial_T));
+ pt->pt_refcount = 1;
+ pt->pt_dict = selfdict;
+ (selfdict->dv_refcount)++;
+ pt->pt_auto = true;
+ if (rettv->v_type == VAR_FUNC || rettv->v_type == VAR_STRING) {
+ // Just a function: Take over the function name and use selfdict.
+ pt->pt_name = rettv->vval.v_string;
+ } else {
+ partial_T *ret_pt = rettv->vval.v_partial;
+ int i;
+
+ // Partial: copy the function name, use selfdict and copy
+ // args. Can't take over name or args, the partial might
+ // be referenced elsewhere.
+ if (ret_pt->pt_name != NULL) {
+ pt->pt_name = vim_strsave(ret_pt->pt_name);
+ func_ref(pt->pt_name);
+ } else {
+ pt->pt_func = ret_pt->pt_func;
+ func_ptr_ref(pt->pt_func);
}
- case kSpecialVarFalse:
- case kSpecialVarNull: {
- return 0;
+ if (ret_pt->pt_argc > 0) {
+ size_t arg_size = sizeof(typval_T) * ret_pt->pt_argc;
+ pt->pt_argv = (typval_T *)xmalloc(arg_size);
+ pt->pt_argc = ret_pt->pt_argc;
+ for (i = 0; i < pt->pt_argc; i++) {
+ tv_copy(&ret_pt->pt_argv[i], &pt->pt_argv[i]);
+ }
}
+ partial_unref(ret_pt);
}
- break;
- case VAR_UNKNOWN:
- EMSG2(_(e_intern2), "get_tv_number(UNKNOWN)");
- break;
+ rettv->v_type = VAR_PARTIAL;
+ rettv->vval.v_partial = pt;
}
- if (denote == NULL) {
- // useful for values that must be unsigned
- n = -1;
- } else {
- *denote = true;
- }
- return n;
}
-static float_T get_tv_float(typval_T *varp)
+// Find variable "name" in the list of variables.
+// Return a pointer to it if found, NULL if not found.
+// Careful: "a:0" variables don't have a name.
+// When "htp" is not NULL we are writing to the variable, set "htp" to the
+// hashtab_T used.
+static dictitem_T *find_var(const char *const name, const size_t name_len,
+ hashtab_T **htp, int no_autoload)
{
- switch (varp->v_type) {
- case VAR_NUMBER:
- return (float_T)(varp->vval.v_number);
- case VAR_FLOAT:
- return varp->vval.v_float;
- break;
- case VAR_FUNC:
- EMSG(_("E891: Using a Funcref as a Float"));
- break;
- case VAR_STRING:
- EMSG(_("E892: Using a String as a Float"));
- break;
- case VAR_LIST:
- EMSG(_("E893: Using a List as a Float"));
- break;
- case VAR_DICT:
- EMSG(_("E894: Using a Dictionary as a Float"));
- break;
- default:
- EMSG2(_(e_intern2), "get_tv_float()");
- break;
+ const char *varname;
+ hashtab_T *const ht = find_var_ht(name, name_len, &varname);
+ if (htp != NULL) {
+ *htp = ht;
}
- return 0;
-}
-
-/*
- * Get the lnum from the first argument.
- * Also accepts ".", "$", etc., but that only works for the current buffer.
- * Returns -1 on error.
- */
-static linenr_T get_tv_lnum(typval_T *argvars)
-{
- typval_T rettv;
- linenr_T lnum;
-
- lnum = get_tv_number_chk(&argvars[0], NULL);
- if (lnum == 0) { /* no valid number, try using line() */
- rettv.v_type = VAR_NUMBER;
- f_line(argvars, &rettv);
- lnum = rettv.vval.v_number;
- clear_tv(&rettv);
+ if (ht == NULL) {
+ return NULL;
}
- return lnum;
-}
-
-/*
- * Get the lnum from the first argument.
- * Also accepts "$", then "buf" is used.
- * Returns 0 on error.
- */
-static linenr_T get_tv_lnum_buf(typval_T *argvars, buf_T *buf)
-{
- if (argvars[0].v_type == VAR_STRING
- && argvars[0].vval.v_string != NULL
- && argvars[0].vval.v_string[0] == '$'
- && buf != NULL)
- return buf->b_ml.ml_line_count;
- return get_tv_number_chk(&argvars[0], NULL);
-}
-
-/*
- * Get the string value of a variable.
- * If it is a Number variable, the number is converted into a string.
- * get_tv_string() uses a single, static buffer. YOU CAN ONLY USE IT ONCE!
- * get_tv_string_buf() uses a given buffer.
- * If the String variable has never been set, return an empty string.
- * Never returns NULL;
- * get_tv_string_chk() and get_tv_string_buf_chk() are similar, but return
- * NULL on error.
- */
-static char_u *get_tv_string(const typval_T *varp)
- FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_RET
-{
- static char_u mybuf[NUMBUFLEN];
-
- return get_tv_string_buf(varp, mybuf);
-}
-
-static char_u *get_tv_string_buf(const typval_T *varp, char_u *buf)
- FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_RET
-{
- char_u *res = get_tv_string_buf_chk(varp, buf);
-
- return res != NULL ? res : (char_u *)"";
-}
-
-/// Careful: This uses a single, static buffer. YOU CAN ONLY USE IT ONCE!
-char_u *get_tv_string_chk(const typval_T *varp)
- FUNC_ATTR_NONNULL_ALL
-{
- static char_u mybuf[NUMBUFLEN];
-
- return get_tv_string_buf_chk(varp, mybuf);
-}
-
-static char_u *get_tv_string_buf_chk(const typval_T *varp, char_u *buf)
- FUNC_ATTR_NONNULL_ALL
-{
- switch (varp->v_type) {
- case VAR_NUMBER:
- sprintf((char *)buf, "%" PRId64, (int64_t)varp->vval.v_number);
- return buf;
- case VAR_FUNC:
- EMSG(_("E729: using Funcref as a String"));
- break;
- case VAR_LIST:
- EMSG(_("E730: using List as a String"));
- break;
- case VAR_DICT:
- EMSG(_("E731: using Dictionary as a String"));
- break;
- case VAR_FLOAT:
- EMSG(_(e_float_as_string));
- break;
- case VAR_STRING:
- if (varp->vval.v_string != NULL)
- return varp->vval.v_string;
- return (char_u *)"";
- case VAR_SPECIAL:
- STRCPY(buf, encode_special_var_names[varp->vval.v_special]);
- return buf;
- case VAR_UNKNOWN:
- EMSG(_("E908: using an invalid value as a String"));
- break;
+ dictitem_T *const ret = find_var_in_ht(ht, *name,
+ varname,
+ name_len - (size_t)(varname - name),
+ no_autoload || htp != NULL);
+ if (ret != NULL) {
+ return ret;
}
- return NULL;
-}
-/*
- * Find variable "name" in the list of variables.
- * Return a pointer to it if found, NULL if not found.
- * Careful: "a:0" variables don't have a name.
- * When "htp" is not NULL we are writing to the variable, set "htp" to the
- * hashtab_T used.
- */
-static dictitem_T *find_var(char_u *name, hashtab_T **htp, int no_autoload)
-{
- char_u *varname;
- hashtab_T *ht;
-
- ht = find_var_ht(name, &varname);
- if (htp != NULL)
- *htp = ht;
- if (ht == NULL)
- return NULL;
- return find_var_in_ht(ht, *name, varname, no_autoload || htp != NULL);
+ // Search in parent scope for lambda
+ return find_var_in_scoped_ht(name, name_len, no_autoload || htp != NULL);
}
-/*
- * Find variable "varname" in hashtab "ht" with name "htname".
- * Returns NULL if not found.
- */
-static dictitem_T *find_var_in_ht(hashtab_T *ht, int htname, char_u *varname, int no_autoload)
+/// Find variable in hashtab
+///
+/// @param[in] ht Hashtab to find variable in.
+/// @param[in] htname Hashtab name (first character).
+/// @param[in] varname Variable name.
+/// @param[in] varname_len Variable name length.
+/// @param[in] no_autoload If true then autoload scripts will not be sourced
+/// if autoload variable was not found.
+///
+/// @return pointer to the dictionary item with the found variable or NULL if it
+/// was not found.
+static dictitem_T *find_var_in_ht(hashtab_T *const ht,
+ int htname,
+ const char *const varname,
+ const size_t varname_len,
+ int no_autoload)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
{
hashitem_T *hi;
- if (*varname == NUL) {
- /* Must be something like "s:", otherwise "ht" would be NULL. */
+ if (varname_len == 0) {
+ // Must be something like "s:", otherwise "ht" would be NULL.
switch (htname) {
- case 's': return &SCRIPT_SV(current_SID)->sv_var;
- case 'g': return &globvars_var;
- case 'v': return &vimvars_var;
- case 'b': return &curbuf->b_bufvar;
- case 'w': return &curwin->w_winvar;
- case 't': return &curtab->tp_winvar;
- case 'l': return current_funccal == NULL
- ? NULL : &current_funccal->l_vars_var;
- case 'a': return current_funccal == NULL
- ? NULL : &current_funccal->l_avars_var;
+ case 's': return (dictitem_T *)&SCRIPT_SV(current_SID)->sv_var;
+ case 'g': return (dictitem_T *)&globvars_var;
+ case 'v': return (dictitem_T *)&vimvars_var;
+ case 'b': return (dictitem_T *)&curbuf->b_bufvar;
+ case 'w': return (dictitem_T *)&curwin->w_winvar;
+ case 't': return (dictitem_T *)&curtab->tp_winvar;
+ case 'l': return (current_funccal == NULL
+ ? NULL : (dictitem_T *)&current_funccal->l_vars_var);
+ case 'a': return (current_funccal == NULL
+ ? NULL : (dictitem_T *)&get_funccal()->l_avars_var);
}
return NULL;
}
- hi = hash_find(ht, varname);
+ hi = hash_find_len(ht, varname, varname_len);
if (HASHITEM_EMPTY(hi)) {
- /* For global variables we may try auto-loading the script. If it
- * worked find the variable again. Don't auto-load a script if it was
- * loaded already, otherwise it would be loaded every time when
- * checking if a function name is a Funcref variable. */
+ // For global variables we may try auto-loading the script. If it
+ // worked find the variable again. Don't auto-load a script if it was
+ // loaded already, otherwise it would be loaded every time when
+ // checking if a function name is a Funcref variable.
if (ht == &globvarht && !no_autoload) {
- /* Note: script_autoload() may make "hi" invalid. It must either
- * be obtained again or not used. */
- if (!script_autoload(varname, FALSE) || aborting())
+ // Note: script_autoload() may make "hi" invalid. It must either
+ // be obtained again or not used.
+ if (!script_autoload(varname, varname_len, false) || aborting()) {
return NULL;
- hi = hash_find(ht, varname);
+ }
+ hi = hash_find_len(ht, varname, varname_len);
}
- if (HASHITEM_EMPTY(hi))
+ if (HASHITEM_EMPTY(hi)) {
return NULL;
+ }
}
- return HI2DI(hi);
+ return TV_DICT_HI2DI(hi);
}
// Get function call environment based on backtrace debug level
@@ -18594,17 +18908,45 @@ static funccall_T *get_funccal(void)
return funccal;
}
-// Find the dict and hashtable used for a variable name. Set "varname" to the
-// start of name without ':'.
-static hashtab_T *find_var_ht_dict(char_u *name, uint8_t **varname, dict_T **d)
+/// Return the hashtable used for argument in the current funccal.
+/// Return NULL if there is no current funccal.
+static hashtab_T *get_funccal_args_ht(void)
{
- hashitem_T *hi;
+ if (current_funccal == NULL) {
+ return NULL;
+ }
+ return &get_funccal()->l_avars.dv_hashtab;
+}
+
+/// Return the hashtable used for local variables in the current funccal.
+/// Return NULL if there is no current funccal.
+static hashtab_T *get_funccal_local_ht(void)
+{
+ if (current_funccal == NULL) {
+ return NULL;
+ }
+ return &get_funccal()->l_vars.dv_hashtab;
+}
+
+/// Find the dict and hashtable used for a variable
+///
+/// @param[in] name Variable name, possibly with scope prefix.
+/// @param[in] name_len Variable name length.
+/// @param[out] varname Will be set to the start of the name without scope
+/// prefix.
+/// @param[out] d Scope dictionary.
+///
+/// @return Scope hashtab, NULL if name is not valid.
+static hashtab_T *find_var_ht_dict(const char *name, const size_t name_len,
+ const char **varname, dict_T **d)
+{
+ hashitem_T *hi;
*d = NULL;
- if (name[0] == NUL) {
+ if (name_len == 0) {
return NULL;
}
- if (name[1] != ':') {
+ if (name_len == 1 || name[1] != ':') {
// name has implicit scope
if (name[0] == ':' || name[0] == AUTOLOAD_CHAR) {
// The name must not start with a colon or #.
@@ -18613,7 +18955,7 @@ static hashtab_T *find_var_ht_dict(char_u *name, uint8_t **varname, dict_T **d)
*varname = name;
// "version" is "v:version" in all scopes
- hi = hash_find(&compat_hashtab, name);
+ hi = hash_find_len(&compat_hashtab, name, name_len);
if (!HASHITEM_EMPTY(hi)) {
return &compat_hashtab;
}
@@ -18629,26 +18971,27 @@ static hashtab_T *find_var_ht_dict(char_u *name, uint8_t **varname, dict_T **d)
*varname = name + 2;
if (*name == 'g') { // global variable
*d = &globvardict;
- } else if (vim_strchr(name + 2, ':') != NULL
- || vim_strchr(name + 2, AUTOLOAD_CHAR) != NULL) {
+ } else if (name_len > 2
+ && (memchr(name + 2, ':', name_len - 2) != NULL
+ || memchr(name + 2, AUTOLOAD_CHAR, name_len - 2) != NULL)) {
// There must be no ':' or '#' in the rest of the name if g: was not used
return NULL;
}
- if (*name == 'b') { // buffer variable
+ if (*name == 'b') { // buffer variable
*d = curbuf->b_vars;
- } else if (*name == 'w') { // window variable
+ } else if (*name == 'w') { // window variable
*d = curwin->w_vars;
- } else if (*name == 't') { // tab page variable
+ } else if (*name == 't') { // tab page variable
*d = curtab->tp_vars;
- } else if (*name == 'v') { // v: variable
+ } else if (*name == 'v') { // v: variable
*d = &vimvardict;
} else if (*name == 'a' && current_funccal != NULL) { // function argument
*d = &get_funccal()->l_avars;
} else if (*name == 'l' && current_funccal != NULL) { // local variable
*d = &get_funccal()->l_vars;
- } else if (*name == 's' // script variable
- && current_SID > 0 && current_SID <= ga_scripts.ga_len) {
+ } else if (*name == 's' // script variable
+ && current_SID > 0 && current_SID <= ga_scripts.ga_len) {
*d = &SCRIPT_SV(current_SID)->sv_dict;
}
@@ -18656,28 +18999,35 @@ end:
return *d ? &(*d)->dv_hashtab : NULL;
}
-// Find the hashtab used for a variable name.
-// Return NULL if the name is not valid.
-// Set "varname" to the start of name without ':'.
-static hashtab_T *find_var_ht(uint8_t *name, uint8_t **varname)
+/// Find the hashtable used for a variable
+///
+/// @param[in] name Variable name, possibly with scope prefix.
+/// @param[in] name_len Variable name length.
+/// @param[out] varname Will be set to the start of the name without scope
+/// prefix.
+///
+/// @return Scope hashtab, NULL if name is not valid.
+static hashtab_T *find_var_ht(const char *name, const size_t name_len,
+ const char **varname)
{
dict_T *d;
- return find_var_ht_dict(name, varname, &d);
+ return find_var_ht_dict(name, name_len, varname, &d);
}
/*
* Get the string value of a (global/local) variable.
- * Note: see get_tv_string() for how long the pointer remains valid.
+ * Note: see tv_get_string() for how long the pointer remains valid.
* Returns NULL when it doesn't exist.
*/
-char_u *get_var_value(char_u *name)
+char_u *get_var_value(const char *const name)
{
dictitem_T *v;
- v = find_var(name, NULL, FALSE);
- if (v == NULL)
+ v = find_var(name, strlen(name), NULL, false);
+ if (v == NULL) {
return NULL;
- return get_tv_string(&v->di_tv);
+ }
+ return (char_u *)tv_get_string(&v->di_tv);
}
/*
@@ -18714,10 +19064,10 @@ void new_script_vars(scid_T id)
* Initialize dictionary "dict" as a scope and set variable "dict_var" to
* point to it.
*/
-void init_var_dict(dict_T *dict, dictitem_T *dict_var, int scope)
+void init_var_dict(dict_T *dict, ScopeDictDictItem *dict_var, int scope)
{
hash_init(&dict->dv_hashtab);
- dict->dv_lock = 0;
+ dict->dv_lock = VAR_UNLOCKED;
dict->dv_scope = scope;
dict->dv_refcount = DO_NOT_FREE_CNT;
dict->dv_copyID = 0;
@@ -18737,7 +19087,7 @@ void unref_var_dict(dict_T *dict)
/* Now the dict needs to be freed if no one else is using it, go back to
* normal reference counting. */
dict->dv_refcount -= DO_NOT_FREE_CNT - 1;
- dict_unref(dict);
+ tv_dict_unref(dict);
}
/*
@@ -18768,9 +19118,9 @@ static void vars_clear_ext(hashtab_T *ht, int free_val)
// Free the variable. Don't remove it from the hashtab,
// ht_array might change then. hash_clear() takes care of it
// later.
- v = HI2DI(hi);
+ v = TV_DICT_HI2DI(hi);
if (free_val) {
- clear_tv(&v->di_tv);
+ tv_clear(&v->di_tv);
}
if (v->di_flags & DI_FLAGS_ALLOC) {
xfree(v);
@@ -18787,45 +19137,44 @@ static void vars_clear_ext(hashtab_T *ht, int free_val)
*/
static void delete_var(hashtab_T *ht, hashitem_T *hi)
{
- dictitem_T *di = HI2DI(hi);
+ dictitem_T *di = TV_DICT_HI2DI(hi);
hash_remove(ht, hi);
- clear_tv(&di->di_tv);
+ tv_clear(&di->di_tv);
xfree(di);
}
/*
* List the value of one internal variable.
*/
-static void list_one_var(dictitem_T *v, char_u *prefix, int *first)
+static void list_one_var(dictitem_T *v, const char *prefix, int *first)
{
- char_u *s = (char_u *) encode_tv2echo(&v->di_tv, NULL);
- list_one_var_a(prefix, v->di_key, v->di_tv.v_type,
- s == NULL ? (char_u *)"" : s, first);
+ char *const s = encode_tv2echo(&v->di_tv, NULL);
+ list_one_var_a(prefix, (const char *)v->di_key, STRLEN(v->di_key),
+ v->di_tv.v_type, (s == NULL ? "" : s), first);
xfree(s);
}
-static void
-list_one_var_a (
- char_u *prefix,
- char_u *name,
- int type,
- char_u *string,
- int *first /* when TRUE clear rest of screen and set to FALSE */
-)
+/// @param[in] name_len Length of the name. May be -1, in this case strlen()
+/// will be used.
+/// @param[in,out] first When true clear rest of screen and set to false.
+static void list_one_var_a(const char *prefix, const char *name,
+ const ptrdiff_t name_len, const int type,
+ const char *string, int *first)
{
- /* don't use msg() or msg_attr() to avoid overwriting "v:statusmsg" */
+ // don't use msg() or msg_attr() to avoid overwriting "v:statusmsg"
msg_start();
msg_puts(prefix);
- if (name != NULL) /* "a:" vars don't have a name stored */
- msg_puts(name);
+ if (name != NULL) { // "a:" vars don't have a name stored
+ msg_puts_attr_len(name, name_len, 0);
+ }
msg_putchar(' ');
msg_advance(22);
- if (type == VAR_NUMBER)
+ if (type == VAR_NUMBER) {
msg_putchar('#');
- else if (type == VAR_FUNC)
+ } else if (type == VAR_FUNC || type == VAR_PARTIAL) {
msg_putchar('*');
- else if (type == VAR_LIST) {
+ } else if (type == VAR_LIST) {
msg_putchar('[');
if (*string == '[')
++string;
@@ -18836,67 +19185,58 @@ list_one_var_a (
} else
msg_putchar(' ');
- msg_outtrans(string);
+ msg_outtrans((char_u *)string);
- if (type == VAR_FUNC)
- msg_puts((char_u *)"()");
+ if (type == VAR_FUNC || type == VAR_PARTIAL) {
+ msg_puts("()");
+ }
if (*first) {
msg_clr_eos();
*first = FALSE;
}
}
-/*
- * Set variable "name" to value in "tv".
- * If the variable already exists, the value is updated.
- * Otherwise the variable is created.
- */
-static void
-set_var (
- char_u *name,
- typval_T *tv,
- int copy /* make copy of value in "tv" */
-)
+/// Set variable to the given value
+///
+/// If the variable already exists, the value is updated. Otherwise the variable
+/// is created.
+///
+/// @param[in] name Variable name to set.
+/// @param[in] name_len Length of the variable name.
+/// @param tv Variable value.
+/// @param[in] copy True if value in tv is to be copied.
+static void set_var(const char *name, const size_t name_len, typval_T *const tv,
+ const bool copy)
+ FUNC_ATTR_NONNULL_ALL
{
dictitem_T *v;
- char_u *varname;
hashtab_T *ht;
- typval_T oldtv;
dict_T *dict;
- ht = find_var_ht_dict(name, &varname, &dict);
- bool watched = is_watched(dict);
-
- if (watched) {
- init_tv(&oldtv);
- }
+ const char *varname;
+ ht = find_var_ht_dict(name, name_len, &varname, &dict);
+ const bool watched = tv_dict_is_watched(dict);
if (ht == NULL || *varname == NUL) {
EMSG2(_(e_illvar), name);
return;
}
- v = find_var_in_ht(ht, 0, varname, TRUE);
+ v = find_var_in_ht(ht, 0, varname, name_len - (size_t)(varname - name), true);
- if (tv->v_type == VAR_FUNC && var_check_func_name(name, v == NULL))
+ // Search in parent scope which is possible to reference from lambda
+ if (v == NULL) {
+ v = find_var_in_scoped_ht((const char *)name, name_len, true);
+ }
+
+ if (tv_is_func(*tv) && !var_check_func_name(name, v == NULL)) {
return;
+ }
+ typval_T oldtv = TV_INITIAL_VALUE;
if (v != NULL) {
// existing variable, need to clear the value
- if (var_check_ro(v->di_flags, name, false)
- || tv_check_lock(v->di_tv.v_lock, name, false)) {
- return;
- }
- if (v->di_tv.v_type != tv->v_type
- && !((v->di_tv.v_type == VAR_STRING
- || v->di_tv.v_type == VAR_NUMBER)
- && (tv->v_type == VAR_STRING
- || tv->v_type == VAR_NUMBER))
- && !((v->di_tv.v_type == VAR_NUMBER
- || v->di_tv.v_type == VAR_FLOAT)
- && (tv->v_type == VAR_NUMBER
- || tv->v_type == VAR_FLOAT))
- ) {
- EMSG2(_("E706: Variable type mismatch for: %s"), name);
+ if (var_check_ro(v->di_flags, name, name_len)
+ || tv_check_lock(v->di_tv.v_lock, name, name_len)) {
return;
}
@@ -18905,46 +19245,51 @@ set_var (
if (ht == &vimvarht) {
if (v->di_tv.v_type == VAR_STRING) {
xfree(v->di_tv.vval.v_string);
- if (copy || tv->v_type != VAR_STRING)
- v->di_tv.vval.v_string = vim_strsave(get_tv_string(tv));
- else {
- /* Take over the string to avoid an extra alloc/free. */
+ if (copy || tv->v_type != VAR_STRING) {
+ v->di_tv.vval.v_string = (char_u *)xstrdup(tv_get_string(tv));
+ } else {
+ // Take over the string to avoid an extra alloc/free.
v->di_tv.vval.v_string = tv->vval.v_string;
tv->vval.v_string = NULL;
}
return;
} else if (v->di_tv.v_type == VAR_NUMBER) {
- v->di_tv.vval.v_number = get_tv_number(tv);
- if (STRCMP(varname, "searchforward") == 0)
+ v->di_tv.vval.v_number = tv_get_number(tv);
+ if (strcmp(varname, "searchforward") == 0) {
set_search_direction(v->di_tv.vval.v_number ? '/' : '?');
- else if (STRCMP(varname, "hlsearch") == 0) {
+ } else if (strcmp(varname, "hlsearch") == 0) {
no_hlsearch = !v->di_tv.vval.v_number;
redraw_all_later(SOME_VALID);
}
return;
} else if (v->di_tv.v_type != tv->v_type) {
- EMSG2(_(e_intern2), "set_var()");
+ EMSG2(_("E963: setting %s to value with wrong type"), name);
+ return;
}
}
if (watched) {
- copy_tv(&v->di_tv, &oldtv);
+ tv_copy(&v->di_tv, &oldtv);
}
- clear_tv(&v->di_tv);
- } else { /* add a new variable */
- /* Can't add "v:" variable. */
+ tv_clear(&v->di_tv);
+ } else { // Add a new variable.
+ // Can't add "v:" variable.
if (ht == &vimvarht) {
- EMSG2(_(e_illvar), name);
+ emsgf(_(e_illvar), name);
return;
}
- /* Make sure the variable name is valid. */
- if (!valid_varname(varname))
+ // Make sure the variable name is valid.
+ if (!valid_varname(varname)) {
return;
+ }
- v = xmalloc(sizeof(dictitem_T) + STRLEN(varname));
+ // Make sure dict is valid
+ assert(dict != NULL);
+
+ v = xmalloc(sizeof(dictitem_T) + strlen(varname));
STRCPY(v->di_key, varname);
- if (hash_add(ht, DI2HIKEY(v)) == FAIL) {
+ if (tv_dict_add(dict, v) == FAIL) {
xfree(v);
return;
}
@@ -18952,159 +19297,153 @@ set_var (
}
if (copy || tv->v_type == VAR_NUMBER || tv->v_type == VAR_FLOAT) {
- copy_tv(tv, &v->di_tv);
+ tv_copy(tv, &v->di_tv);
} else {
v->di_tv = *tv;
v->di_tv.v_lock = 0;
- init_tv(tv);
+ tv_init(tv);
}
if (watched) {
if (oldtv.v_type == VAR_UNKNOWN) {
- dictwatcher_notify(dict, (char *)v->di_key, &v->di_tv, NULL);
+ tv_dict_watcher_notify(dict, (char *)v->di_key, &v->di_tv, NULL);
} else {
- dictwatcher_notify(dict, (char *)v->di_key, &v->di_tv, &oldtv);
- clear_tv(&oldtv);
+ tv_dict_watcher_notify(dict, (char *)v->di_key, &v->di_tv, &oldtv);
+ tv_clear(&oldtv);
}
}
}
-// Return true if di_flags "flags" indicates variable "name" is read-only.
-// Also give an error message.
-static bool var_check_ro(int flags, char_u *name, bool use_gettext)
+/// Check whether variable is read-only (DI_FLAGS_RO, DI_FLAGS_RO_SBX)
+///
+/// Also gives an error message.
+///
+/// @param[in] flags di_flags attribute value.
+/// @param[in] name Variable name, for use in error message.
+/// @param[in] name_len Variable name length. Use #TV_TRANSLATE to translate
+/// variable name and compute the length. Use #TV_CSTRING
+/// to compute the length with strlen() without
+/// translating.
+///
+/// Both #TV_โ€ฆ values are used for optimization purposes:
+/// variable name with its length is needed only in case
+/// of error, when no error occurs computing them is
+/// a waste of CPU resources. This especially applies to
+/// gettext.
+///
+/// @return True if variable is read-only: either always or in sandbox when
+/// sandbox is enabled, false otherwise.
+bool var_check_ro(const int flags, const char *name,
+ size_t name_len)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
{
+ const char *error_message = NULL;
if (flags & DI_FLAGS_RO) {
- EMSG2(_(e_readonlyvar), use_gettext ? (char_u *)_(name) : name);
- return true;
+ error_message = N_(e_readonlyvar);
+ } else if ((flags & DI_FLAGS_RO_SBX) && sandbox) {
+ error_message = N_("E794: Cannot set variable in the sandbox: \"%.*s\"");
}
- if ((flags & DI_FLAGS_RO_SBX) && sandbox) {
- EMSG2(_(e_readonlysbx), use_gettext ? (char_u *)_(name) : name);
- return true;
+
+ if (error_message == NULL) {
+ return false;
}
- return false;
+ if (name_len == TV_TRANSLATE) {
+ name = _(name);
+ name_len = strlen(name);
+ } else if (name_len == TV_CSTRING) {
+ name_len = strlen(name);
+ }
+
+ emsgf(_(error_message), (int)name_len, name);
+
+ return true;
}
-// Return true if di_flags "flags" indicates variable "name" is fixed.
-// Also give an error message.
-static bool var_check_fixed(int flags, char_u *name, bool use_gettext)
+/// Check whether variable is fixed (DI_FLAGS_FIX)
+///
+/// Also gives an error message.
+///
+/// @param[in] flags di_flags attribute value.
+/// @param[in] name Variable name, for use in error message.
+/// @param[in] name_len Variable name length. Use #TV_TRANSLATE to translate
+/// variable name and compute the length. Use #TV_CSTRING
+/// to compute the length with strlen() without
+/// translating.
+///
+/// Both #TV_โ€ฆ values are used for optimization purposes:
+/// variable name with its length is needed only in case
+/// of error, when no error occurs computing them is
+/// a waste of CPU resources. This especially applies to
+/// gettext.
+///
+/// @return True if variable is fixed, false otherwise.
+static bool var_check_fixed(const int flags, const char *name,
+ size_t name_len)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
{
if (flags & DI_FLAGS_FIX) {
- EMSG2(_("E795: Cannot delete variable %s"),
- use_gettext ? (char_u *)_(name) : name);
+ if (name_len == TV_TRANSLATE) {
+ name = _(name);
+ name_len = strlen(name);
+ } else if (name_len == TV_CSTRING) {
+ name_len = strlen(name);
+ }
+ EMSG3(_("E795: Cannot delete variable %.*s"), (int)name_len, name);
return true;
}
return false;
}
-/*
- * Check if a funcref is assigned to a valid variable name.
- * Return TRUE and give an error if not.
- */
-static int
-var_check_func_name (
- char_u *name, /* points to start of variable name */
- int new_var /* TRUE when creating the variable */
-)
+// TODO(ZyX-I): move to eval/expressions
+
+/// Check if name is a valid name to assign funcref to
+///
+/// @param[in] name Possible function/funcref name.
+/// @param[in] new_var True if it is a name for a variable.
+///
+/// @return false in case of error, true in case of success. Also gives an
+/// error message if appropriate.
+bool var_check_func_name(const char *const name, const bool new_var)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
{
// Allow for w: b: s: and t:.
if (!(vim_strchr((char_u *)"wbst", name[0]) != NULL && name[1] == ':')
&& !ASCII_ISUPPER((name[0] != NUL && name[1] == ':') ? name[2]
: name[0])) {
EMSG2(_("E704: Funcref variable name must start with a capital: %s"), name);
- return TRUE;
+ return false;
}
- /* Don't allow hiding a function. When "v" is not NULL we might be
- * assigning another function to the same var, the type is checked
- * below. */
- if (new_var && function_exists(name)) {
+ // Don't allow hiding a function. When "v" is not NULL we might be
+ // assigning another function to the same var, the type is checked
+ // below.
+ if (new_var && function_exists((const char *)name, false)) {
EMSG2(_("E705: Variable name conflicts with existing function: %s"),
- name);
- return TRUE;
+ name);
+ return false;
}
- return FALSE;
+ return true;
}
-/*
- * Check if a variable name is valid.
- * Return FALSE and give an error if not.
- */
-static int valid_varname(char_u *varname)
-{
- char_u *p;
+// TODO(ZyX-I): move to eval/expressions
- for (p = varname; *p != NUL; ++p)
- if (!eval_isnamec1(*p) && (p == varname || !ascii_isdigit(*p))
+/// Check if a variable name is valid
+///
+/// @param[in] varname Variable name to check.
+///
+/// @return false when variable name is not valid, true when it is. Also gives
+/// an error message if appropriate.
+bool valid_varname(const char *varname)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ for (const char *p = varname; *p != NUL; p++) {
+ if (!eval_isnamec1((int)(uint8_t)(*p))
+ && (p == varname || !ascii_isdigit(*p))
&& *p != AUTOLOAD_CHAR) {
- EMSG2(_(e_illvar), varname);
- return FALSE;
+ emsgf(_(e_illvar), varname);
+ return false;
}
- return TRUE;
-}
-
-// Return true if typeval "tv" is set to be locked (immutable).
-// Also give an error message, using "name" or _("name") when use_gettext is
-// true.
-static bool tv_check_lock(int lock, char_u *name, bool use_gettext)
-{
- if (lock & VAR_LOCKED) {
- EMSG2(_("E741: Value is locked: %s"),
- name == NULL
- ? (char_u *)_("Unknown")
- : use_gettext ? (char_u *)_(name)
- : name);
- return true;
- }
- if (lock & VAR_FIXED) {
- EMSG2(_("E742: Cannot change value of %s"),
- name == NULL
- ? (char_u *)_("Unknown")
- : use_gettext ? (char_u *)_(name)
- : name);
- return true;
- }
- return false;
-}
-
-/*
- * Copy the values from typval_T "from" to typval_T "to".
- * When needed allocates string or increases reference count.
- * Does not make a copy of a list or dict but copies the reference!
- * It is OK for "from" and "to" to point to the same item. This is used to
- * make a copy later.
- */
-void copy_tv(typval_T *from, typval_T *to)
-{
- to->v_type = from->v_type;
- to->v_lock = 0;
- memmove(&to->vval, &from->vval, sizeof(to->vval));
- switch (from->v_type) {
- case VAR_NUMBER:
- case VAR_FLOAT:
- case VAR_SPECIAL:
- break;
- case VAR_STRING:
- case VAR_FUNC:
- if (from->vval.v_string != NULL) {
- to->vval.v_string = vim_strsave(from->vval.v_string);
- if (from->v_type == VAR_FUNC) {
- func_ref(to->vval.v_string);
- }
- }
- break;
- case VAR_LIST:
- if (from->vval.v_list != NULL) {
- to->vval.v_list->lv_refcount++;
- }
- break;
- case VAR_DICT:
- if (from->vval.v_dict != NULL) {
- to->vval.v_dict->dv_refcount++;
- }
- break;
- case VAR_UNKNOWN:
- EMSG2(_(e_intern2), "copy_tv(UNKNOWN)");
- break;
}
+ return true;
}
/// Make a copy of an item
@@ -19122,7 +19461,7 @@ void copy_tv(typval_T *from, typval_T *to)
/// list[1]`) var_item_copy with zero copyID will emit
/// a copy with (`copy[0] isnot copy[1]`), with non-zero it
/// will emit a copy with (`copy[0] is copy[1]`) like in the
-/// original list. Not use when deep is false.
+/// original list. Not used when deep is false.
int var_item_copy(const vimconv_T *const conv,
typval_T *const from,
typval_T *const to,
@@ -19143,12 +19482,14 @@ int var_item_copy(const vimconv_T *const conv,
case VAR_NUMBER:
case VAR_FLOAT:
case VAR_FUNC:
+ case VAR_PARTIAL:
case VAR_SPECIAL:
- copy_tv(from, to);
+ tv_copy(from, to);
break;
case VAR_STRING:
- if (conv == NULL || conv->vc_type == CONV_NONE) {
- copy_tv(from, to);
+ if (conv == NULL || conv->vc_type == CONV_NONE
+ || from->vval.v_string == NULL) {
+ tv_copy(from, to);
} else {
to->v_type = VAR_STRING;
to->v_lock = 0;
@@ -19163,17 +19504,18 @@ int var_item_copy(const vimconv_T *const conv,
case VAR_LIST:
to->v_type = VAR_LIST;
to->v_lock = 0;
- if (from->vval.v_list == NULL)
+ if (from->vval.v_list == NULL) {
to->vval.v_list = NULL;
- else if (copyID != 0 && from->vval.v_list->lv_copyID == copyID) {
- /* use the copy made earlier */
- to->vval.v_list = from->vval.v_list->lv_copylist;
- ++to->vval.v_list->lv_refcount;
+ } else if (copyID != 0 && tv_list_copyid(from->vval.v_list) == copyID) {
+ // Use the copy made earlier.
+ to->vval.v_list = tv_list_latest_copy(from->vval.v_list);
+ tv_list_ref(to->vval.v_list);
} else {
- to->vval.v_list = list_copy(conv, from->vval.v_list, deep, copyID);
+ to->vval.v_list = tv_list_copy(conv, from->vval.v_list, deep, copyID);
}
- if (to->vval.v_list == NULL)
+ if (to->vval.v_list == NULL && from->vval.v_list != NULL) {
ret = FAIL;
+ }
break;
case VAR_DICT:
to->v_type = VAR_DICT;
@@ -19185,13 +19527,14 @@ int var_item_copy(const vimconv_T *const conv,
to->vval.v_dict = from->vval.v_dict->dv_copydict;
++to->vval.v_dict->dv_refcount;
} else {
- to->vval.v_dict = dict_copy(conv, from->vval.v_dict, deep, copyID);
+ to->vval.v_dict = tv_dict_copy(conv, from->vval.v_dict, deep, copyID);
}
- if (to->vval.v_dict == NULL)
+ if (to->vval.v_dict == NULL && from->vval.v_dict != NULL) {
ret = FAIL;
+ }
break;
case VAR_UNKNOWN:
- EMSG2(_(e_intern2), "var_item_copy(UNKNOWN)");
+ internal_error("var_item_copy(UNKNOWN)");
ret = FAIL;
}
--recurse;
@@ -19207,9 +19550,9 @@ void ex_echo(exarg_T *eap)
{
char_u *arg = eap->arg;
typval_T rettv;
- char_u *p;
bool needclr = true;
bool atstart = true;
+ const int did_emsg_before = did_emsg;
if (eap->skip)
++emsg_skip;
@@ -19218,19 +19561,20 @@ void ex_echo(exarg_T *eap)
* still need to be cleared. E.g., "echo 22,44". */
need_clr_eos = needclr;
- p = arg;
- if (eval1(&arg, &rettv, !eap->skip) == FAIL) {
- /*
- * Report the invalid expression unless the expression evaluation
- * has been cancelled due to an aborting error, an interrupt, or an
- * exception.
- */
- if (!aborting())
- EMSG2(_(e_invexpr2), p);
- need_clr_eos = FALSE;
- break;
+ {
+ char_u *p = arg;
+ if (eval1(&arg, &rettv, !eap->skip) == FAIL) {
+ // Report the invalid expression unless the expression evaluation
+ // has been cancelled due to an aborting error, an interrupt, or an
+ // exception.
+ if (!aborting() && did_emsg == did_emsg_before) {
+ EMSG2(_(e_invexpr2), p);
+ }
+ need_clr_eos = false;
+ break;
+ }
+ need_clr_eos = false;
}
- need_clr_eos = FALSE;
if (!eap->skip) {
if (atstart) {
@@ -19244,9 +19588,11 @@ void ex_echo(exarg_T *eap)
msg_sb_eol();
msg_start();
}
- } else if (eap->cmdidx == CMD_echo)
- msg_puts_attr((char_u *)" ", echo_attr);
- char_u *tofree = p = (char_u *) encode_tv2echo(&rettv, NULL);
+ } else if (eap->cmdidx == CMD_echo) {
+ msg_puts_attr(" ", echo_attr);
+ }
+ char *tofree = encode_tv2echo(&rettv, NULL);
+ const char *p = tofree;
if (p != NULL) {
for (; *p != NUL && !got_int; ++p) {
if (*p == '\n' || *p == '\r' || *p == TAB) {
@@ -19255,21 +19601,18 @@ void ex_echo(exarg_T *eap)
msg_clr_eos();
needclr = false;
}
- msg_putchar_attr(*p, echo_attr);
+ msg_putchar_attr((uint8_t)(*p), echo_attr);
} else {
- if (has_mbyte) {
- int i = (*mb_ptr2len)(p);
+ int i = (*mb_ptr2len)((const char_u *)p);
- (void)msg_outtrans_len_attr(p, i, echo_attr);
- p += i - 1;
- } else
- (void)msg_outtrans_len_attr(p, 1, echo_attr);
+ (void)msg_outtrans_len_attr((char_u *)p, i, echo_attr);
+ p += i - 1;
}
}
}
xfree(tofree);
}
- clear_tv(&rettv);
+ tv_clear(&rettv);
arg = skipwhite(arg);
}
eap->nextcmd = check_nextcmd(arg);
@@ -19313,8 +19656,7 @@ void ex_execute(exarg_T *eap)
int ret = OK;
char_u *p;
garray_T ga;
- int len;
- int save_did_emsg;
+ int save_did_emsg = did_emsg;
ga_init(&ga, 1, 80);
@@ -19328,27 +19670,36 @@ void ex_execute(exarg_T *eap)
* has been cancelled due to an aborting error, an interrupt, or an
* exception.
*/
- if (!aborting())
+ if (!aborting() && did_emsg == save_did_emsg) {
EMSG2(_(e_invexpr2), p);
+ }
ret = FAIL;
break;
}
if (!eap->skip) {
- p = get_tv_string(&rettv);
- len = (int)STRLEN(p);
+ const char *const argstr = tv_get_string(&rettv);
+ const size_t len = strlen(argstr);
ga_grow(&ga, len + 2);
- if (!GA_EMPTY(&ga))
+ if (!GA_EMPTY(&ga)) {
((char_u *)(ga.ga_data))[ga.ga_len++] = ' ';
- STRCPY((char_u *)(ga.ga_data) + ga.ga_len, p);
+ }
+ memcpy((char_u *)(ga.ga_data) + ga.ga_len, argstr, len + 1);
ga.ga_len += len;
}
- clear_tv(&rettv);
+ tv_clear(&rettv);
arg = skipwhite(arg);
}
if (ret != FAIL && ga.ga_data != NULL) {
+ if (eap->cmdidx == CMD_echomsg || eap->cmdidx == CMD_echoerr) {
+ // Mark the already saved text as finishing the line, so that what
+ // follows is displayed on a new line when scrolling back at the
+ // more prompt.
+ msg_sb_eol();
+ }
+
if (eap->cmdidx == CMD_echomsg) {
MSG_ATTR(ga.ga_data, echo_attr);
ui_flush();
@@ -19377,9 +19728,9 @@ void ex_execute(exarg_T *eap)
* Returns NULL when no option name found. Otherwise pointer to the char
* after the option name.
*/
-static char_u *find_option_end(char_u **arg, int *opt_flags)
+static const char *find_option_end(const char **const arg, int *const opt_flags)
{
- char_u *p = *arg;
+ const char *p = *arg;
++p;
if (*p == 'g' && p[1] == ':') {
@@ -19388,18 +19739,22 @@ static char_u *find_option_end(char_u **arg, int *opt_flags)
} else if (*p == 'l' && p[1] == ':') {
*opt_flags = OPT_LOCAL;
p += 2;
- } else
+ } else {
*opt_flags = 0;
+ }
- if (!ASCII_ISALPHA(*p))
+ if (!ASCII_ISALPHA(*p)) {
return NULL;
+ }
*arg = p;
- if (p[0] == 't' && p[1] == '_' && p[2] != NUL && p[3] != NUL)
- p += 4; /* termcap option */
- else
- while (ASCII_ISALPHA(*p))
- ++p;
+ if (p[0] == 't' && p[1] == '_' && p[2] != NUL && p[3] != NUL) {
+ p += 4; // t_xx/termcap option
+ } else {
+ while (ASCII_ISALPHA(*p)) {
+ p++;
+ }
+ }
return p;
}
@@ -19409,6 +19764,7 @@ static char_u *find_option_end(char_u **arg, int *opt_flags)
void ex_function(exarg_T *eap)
{
char_u *theline;
+ char_u *line_to_free = NULL;
int c;
int saved_did_emsg;
int saved_wait_return = need_wait_return;
@@ -19418,10 +19774,10 @@ void ex_function(exarg_T *eap)
char_u *line_arg = NULL;
garray_T newargs;
garray_T newlines;
- int varargs = FALSE;
- int mustend = FALSE;
+ int varargs = false;
int flags = 0;
ufunc_T *fp;
+ bool overwrite = false;
int indent;
int nesting;
char_u *skip_until = NULL;
@@ -19433,6 +19789,7 @@ void ex_function(exarg_T *eap)
int todo;
hashitem_T *hi;
int sourcing_lnum_off;
+ bool show_block = false;
/*
* ":function" without argument: list functions.
@@ -19444,8 +19801,9 @@ void ex_function(exarg_T *eap)
if (!HASHITEM_EMPTY(hi)) {
--todo;
fp = HI2UF(hi);
- if (!isdigit(*fp->uf_name))
- list_func_head(fp, FALSE);
+ if (!func_name_refcount(fp->uf_name)) {
+ list_func_head(fp, false);
+ }
}
}
}
@@ -19502,7 +19860,7 @@ void ex_function(exarg_T *eap)
// s:func script-local function name
// g:func global function name, same as "func"
p = eap->arg;
- name = trans_function_name(&p, eap->skip, 0, &fudi);
+ name = trans_function_name(&p, eap->skip, TFN_NO_AUTOLOAD, &fudi, NULL);
paren = (vim_strchr(p, '(') != NULL);
if (name == NULL && (fudi.fd_dict == NULL || !paren) && !eap->skip) {
/*
@@ -19511,8 +19869,9 @@ void ex_function(exarg_T *eap)
* interrupt, or an exception.
*/
if (!aborting()) {
- if (!eap->skip && fudi.fd_newkey != NULL)
+ if (fudi.fd_newkey != NULL) {
EMSG2(_(e_dictkey), fudi.fd_newkey);
+ }
xfree(fudi.fd_newkey);
return;
} else
@@ -19554,7 +19913,7 @@ void ex_function(exarg_T *eap)
}
if (!got_int) {
msg_putchar('\n');
- msg_puts((char_u *)" endfunction");
+ msg_puts(" endfunction");
}
} else
emsg_funcname(N_("E123: Undefined function: %s"), name);
@@ -19587,8 +19946,7 @@ void ex_function(exarg_T *eap)
arg = name;
else
arg = fudi.fd_newkey;
- if (arg != NULL && (fudi.fd_di == NULL
- || fudi.fd_di->di_tv.v_type != VAR_FUNC)) {
+ if (arg != NULL && (fudi.fd_di == NULL || !tv_is_func(fudi.fd_di->di_tv))) {
int j = (*arg == K_SPECIAL) ? 3 : 0;
while (arg[j] != NUL && (j == 0 ? eval_isnamec1(arg[j])
: eval_isnamec(arg[j])))
@@ -19601,59 +19959,16 @@ void ex_function(exarg_T *eap)
EMSG(_("E862: Cannot use g: here"));
}
- /*
- * Isolate the arguments: "arg1, arg2, ...)"
- */
- while (*p != ')') {
- if (p[0] == '.' && p[1] == '.' && p[2] == '.') {
- varargs = TRUE;
- p += 3;
- mustend = TRUE;
- } else {
- arg = p;
- while (ASCII_ISALNUM(*p) || *p == '_')
- ++p;
- if (arg == p || isdigit(*arg)
- || (p - arg == 9 && STRNCMP(arg, "firstline", 9) == 0)
- || (p - arg == 8 && STRNCMP(arg, "lastline", 8) == 0)) {
- if (!eap->skip)
- EMSG2(_("E125: Illegal argument: %s"), arg);
- break;
- }
- ga_grow(&newargs, 1);
- c = *p;
- *p = NUL;
- arg = vim_strsave(arg);
-
- /* Check for duplicate argument name. */
- for (int i = 0; i < newargs.ga_len; ++i)
- if (STRCMP(((char_u **)(newargs.ga_data))[i], arg) == 0) {
- EMSG2(_("E853: Duplicate argument name: %s"), arg);
- xfree(arg);
- goto erret;
- }
-
- ((char_u **)(newargs.ga_data))[newargs.ga_len] = arg;
- *p = c;
- newargs.ga_len++;
- if (*p == ',')
- ++p;
- else
- mustend = TRUE;
- }
- p = skipwhite(p);
- if (mustend && *p != ')') {
- if (!eap->skip)
- EMSG2(_(e_invarg2), eap->arg);
- break;
- }
+ if (get_function_args(&p, ')', &newargs, &varargs, eap->skip) == FAIL) {
+ goto errret_2;
}
- if (*p != ')') {
- goto erret;
+
+ if (KeyTyped && ui_is_external(kUICmdline)) {
+ show_block = true;
+ ui_ext_cmdline_block_append(0, (const char *)eap->cmd);
}
- ++p; // skip the ')'
- /* find extra arguments "range", "dict" and "abort" */
+ // find extra arguments "range", "dict", "abort" and "closure"
for (;; ) {
p = skipwhite(p);
if (STRNCMP(p, "range", 5) == 0) {
@@ -19665,16 +19980,27 @@ void ex_function(exarg_T *eap)
} else if (STRNCMP(p, "abort", 5) == 0) {
flags |= FC_ABORT;
p += 5;
- } else
+ } else if (STRNCMP(p, "closure", 7) == 0) {
+ flags |= FC_CLOSURE;
+ p += 7;
+ if (current_funccal == NULL) {
+ emsg_funcname(N_
+ ("E932: Closure function should not be at top level: %s"),
+ name == NULL ? (char_u *)"" : name);
+ goto erret;
+ }
+ } else {
break;
+ }
}
/* When there is a line break use what follows for the function body.
* Makes 'exe "func Test()\n...\nendfunc"' work. */
- if (*p == '\n')
+ if (*p == '\n') {
line_arg = p + 1;
- else if (*p != NUL && *p != '"' && !eap->skip && !did_emsg)
+ } else if (*p != NUL && *p != '"' && !eap->skip && !did_emsg) {
EMSG(_(e_trailing));
+ }
/*
* Read the body of the function, until ":endfunction" is found.
@@ -19693,7 +20019,9 @@ void ex_function(exarg_T *eap)
if (!eap->skip && did_emsg)
goto erret;
- msg_putchar('\n'); /* don't overwrite the function name */
+ if (!ui_is_external(kUICmdline)) {
+ msg_putchar('\n'); // don't overwrite the function name
+ }
cmdline_row = msg_row;
}
@@ -19717,16 +20045,25 @@ void ex_function(exarg_T *eap)
*p = NUL;
line_arg = p + 1;
}
- } else if (eap->getline == NULL)
- theline = getcmdline(':', 0L, indent);
- else
- theline = eap->getline(':', eap->cookie, indent);
- if (KeyTyped)
+ } else {
+ xfree(line_to_free);
+ if (eap->getline == NULL) {
+ theline = getcmdline(':', 0L, indent);
+ } else {
+ theline = eap->getline(':', eap->cookie, indent);
+ }
+ line_to_free = theline;
+ }
+ if (KeyTyped) {
lines_left = Rows - 1;
+ }
if (theline == NULL) {
EMSG(_("E126: Missing :endfunction"));
goto erret;
}
+ if (show_block) {
+ ui_ext_cmdline_block_append(indent, (const char *)theline);
+ }
/* Detect line continuation: sourcing_lnum increased more than one. */
if (sourcing_lnum > sourcing_lnum_off + 1)
@@ -19748,8 +20085,29 @@ void ex_function(exarg_T *eap)
/* Check for "endfunction". */
if (checkforcmd(&p, "endfunction", 4) && nesting-- == 0) {
- if (line_arg == NULL)
- xfree(theline);
+ if (*p == '!') {
+ p++;
+ }
+ char_u *nextcmd = NULL;
+ if (*p == '|') {
+ nextcmd = p + 1;
+ } else if (line_arg != NULL && *skipwhite(line_arg) != NUL) {
+ nextcmd = line_arg;
+ } else if (*p != NUL && *p != '"' && p_verbose > 0) {
+ give_warning2((char_u *)_("W22: Text found after :endfunction: %s"),
+ p, true);
+ }
+ if (nextcmd != NULL) {
+ // Another command follows. If the line came from "eap" we
+ // can simply point into it, otherwise we need to change
+ // "eap->cmdlinep".
+ eap->nextcmd = nextcmd;
+ if (line_to_free != NULL) {
+ xfree(*eap->cmdlinep);
+ *eap->cmdlinep = line_to_free;
+ line_to_free = NULL;
+ }
+ }
break;
}
@@ -19768,17 +20126,23 @@ void ex_function(exarg_T *eap)
if (*p == '!') {
p = skipwhite(p + 1);
}
- p += eval_fname_script(p);
- xfree(trans_function_name(&p, TRUE, 0, NULL));
+ p += eval_fname_script((const char *)p);
+ xfree(trans_function_name(&p, true, 0, NULL, NULL));
if (*skipwhite(p) == '(') {
nesting++;
indent += 2;
}
}
- /* Check for ":append" or ":insert". */
+ // Check for ":append", ":change", ":insert".
p = skip_range(p, NULL);
if ((p[0] == 'a' && (!ASCII_ISALPHA(p[1]) || p[1] == 'p'))
+ || (p[0] == 'c'
+ && (!ASCII_ISALPHA(p[1])
+ || (p[1] == 'h' && (!ASCII_ISALPHA(p[2])
+ || (p[2] == 'a'
+ && (STRNCMP(&p[3], "nge", 3) != 0
+ || !ASCII_ISALPHA(p[6])))))))
|| (p[0] == 'i'
&& (!ASCII_ISALPHA(p[1]) || (p[1] == 'n'
&& (!ASCII_ISALPHA(p[2])
@@ -19790,7 +20154,9 @@ void ex_function(exarg_T *eap)
arg = skipwhite(skiptowhite(p));
if (arg[0] == '<' && arg[1] =='<'
&& ((p[0] == 'p' && p[1] == 'y'
- && (!ASCII_ISALPHA(p[2]) || p[2] == 't'))
+ && (!ASCII_ISALNUM(p[2]) || p[2] == 't'
+ || ((p[2] == '3' || p[2] == 'x')
+ && !ASCII_ISALPHA(p[3]))))
|| (p[0] == 'p' && p[1] == 'e'
&& (!ASCII_ISALPHA(p[2]) || p[2] == 'r'))
|| (p[0] == 't' && p[1] == 'c'
@@ -19818,11 +20184,7 @@ void ex_function(exarg_T *eap)
* allocates 250 bytes per line, this saves 80% on average. The cost
* is an extra alloc/free. */
p = vim_strsave(theline);
- if (line_arg == NULL)
- xfree(theline);
- theline = p;
-
- ((char_u **)(newlines.ga_data))[newlines.ga_len++] = theline;
+ ((char_u **)(newlines.ga_data))[newlines.ga_len++] = p;
/* Add NULL lines for continuation lines, so that the line count is
* equal to the index in the growarray. */
@@ -19843,7 +20205,7 @@ void ex_function(exarg_T *eap)
* If there are no errors, add the function
*/
if (fudi.fd_dict == NULL) {
- v = find_var(name, &ht, FALSE);
+ v = find_var((const char *)name, STRLEN(name), &ht, false);
if (v != NULL && v->di_tv.v_type == VAR_FUNC) {
emsg_funcname(N_("E707: Function name conflicts with variable: %s"),
name);
@@ -19856,16 +20218,25 @@ void ex_function(exarg_T *eap)
emsg_funcname(e_funcexts, name);
goto erret;
}
- if (fp->uf_refcount > 1 || fp->uf_calls > 0) {
+ if (fp->uf_calls > 0) {
emsg_funcname(N_("E127: Cannot redefine function %s: It is in use"),
name);
goto erret;
}
- /* redefine existing function */
- ga_clear_strings(&(fp->uf_args));
- ga_clear_strings(&(fp->uf_lines));
- xfree(name);
- name = NULL;
+ if (fp->uf_refcount > 1) {
+ // This function is referenced somewhere, don't redefine it but
+ // create a new one.
+ (fp->uf_refcount)--;
+ fp->uf_flags |= FC_REMOVED;
+ fp = NULL;
+ overwrite = true;
+ } else {
+ // redefine existing function
+ ga_clear_strings(&(fp->uf_args));
+ ga_clear_strings(&(fp->uf_lines));
+ xfree(name);
+ name = NULL;
+ }
}
} else {
char numbuf[20];
@@ -19876,11 +20247,13 @@ void ex_function(exarg_T *eap)
goto erret;
}
if (fudi.fd_di == NULL) {
- if (tv_check_lock(fudi.fd_dict->dv_lock, eap->arg, false)) {
+ if (tv_check_lock(fudi.fd_dict->dv_lock, (const char *)eap->arg,
+ TV_CSTRING)) {
// Can't add a function to a locked dictionary
goto erret;
}
- } else if (tv_check_lock(fudi.fd_di->di_tv.v_lock, eap->arg, false)) {
+ } else if (tv_check_lock(fudi.fd_di->di_tv.v_lock, (const char *)eap->arg,
+ TV_CSTRING)) {
// Can't change an existing function if it is locked
goto erret;
}
@@ -19900,7 +20273,7 @@ void ex_function(exarg_T *eap)
/* Check that the autoload name matches the script name. */
int j = FAIL;
if (sourcing_name != NULL) {
- scriptname = autoload_name(name);
+ scriptname = (char_u *)autoload_name((const char *)name, STRLEN(name));
p = vim_strchr(scriptname, '/');
plen = (int)STRLEN(p);
slen = (int)STRLEN(sourcing_name);
@@ -19917,20 +20290,21 @@ void ex_function(exarg_T *eap)
}
}
- fp = xmalloc(sizeof(ufunc_T) + STRLEN(name));
+ fp = xcalloc(1, offsetof(ufunc_T, uf_name) + STRLEN(name) + 1);
if (fudi.fd_dict != NULL) {
if (fudi.fd_di == NULL) {
- /* add new dict entry */
- fudi.fd_di = dictitem_alloc(fudi.fd_newkey);
- if (dict_add(fudi.fd_dict, fudi.fd_di) == FAIL) {
+ // Add new dict entry
+ fudi.fd_di = tv_dict_item_alloc((const char *)fudi.fd_newkey);
+ if (tv_dict_add(fudi.fd_dict, fudi.fd_di) == FAIL) {
xfree(fudi.fd_di);
xfree(fp);
goto erret;
}
- } else
- /* overwrite existing dict entry */
- clear_tv(&fudi.fd_di->di_tv);
+ } else {
+ // Overwrite existing dict entry.
+ tv_clear(&fudi.fd_di->di_tv);
+ }
fudi.fd_di->di_tv.v_type = VAR_FUNC;
fudi.fd_di->di_tv.v_lock = 0;
fudi.fd_di->di_tv.vval.v_string = vim_strsave(name);
@@ -19941,14 +20315,22 @@ void ex_function(exarg_T *eap)
/* insert the new function in the function list */
STRCPY(fp->uf_name, name);
- if (hash_add(&func_hashtab, UF2HIKEY(fp)) == FAIL) {
- xfree(fp);
- goto erret;
+ if (overwrite) {
+ hi = hash_find(&func_hashtab, name);
+ hi->hi_key = UF2HIKEY(fp);
+ } else if (hash_add(&func_hashtab, UF2HIKEY(fp)) == FAIL) {
+ xfree(fp);
+ goto erret;
}
+ fp->uf_refcount = 1;
}
- fp->uf_refcount = 1;
fp->uf_args = newargs;
fp->uf_lines = newlines;
+ if ((flags & FC_CLOSURE) != 0) {
+ register_closure(fp);
+ } else {
+ fp->uf_scoped = NULL;
+ }
fp->uf_tml_count = NULL;
fp->uf_tml_total = NULL;
fp->uf_tml_self = NULL;
@@ -19963,38 +20345,43 @@ void ex_function(exarg_T *eap)
erret:
ga_clear_strings(&newargs);
+errret_2:
ga_clear_strings(&newlines);
ret_free:
xfree(skip_until);
+ xfree(line_to_free);
xfree(fudi.fd_newkey);
xfree(name);
did_emsg |= saved_did_emsg;
need_wait_return |= saved_wait_return;
+ if (show_block) {
+ ui_ext_cmdline_block_leave();
+ }
}
-/*
- * Get a function name, translating "<SID>" and "<SNR>".
- * Also handles a Funcref in a List or Dictionary.
- * Returns the function name in allocated memory, or NULL for failure.
- * flags:
- * TFN_INT: internal function name OK
- * TFN_QUIET: be quiet
- * TFN_NO_AUTOLOAD: do not use script autoloading
- * Advances "pp" to just after the function name (if no error).
- */
+/// Get a function name, translating "<SID>" and "<SNR>".
+/// Also handles a Funcref in a List or Dictionary.
+/// flags:
+/// TFN_INT: internal function name OK
+/// TFN_QUIET: be quiet
+/// TFN_NO_AUTOLOAD: do not use script autoloading
+/// TFN_NO_DEREF: do not dereference a Funcref
+/// Advances "pp" to just after the function name (if no error).
+///
+/// @return the function name in allocated memory, or NULL for failure.
static char_u *
-trans_function_name (
+trans_function_name(
char_u **pp,
- int skip, /* only find the end, don't evaluate */
+ int skip, // only find the end, don't evaluate
int flags,
- funcdict_T *fdp /* return: info about dictionary used */
+ funcdict_T *fdp, // return: info about dictionary used
+ partial_T **partial // return: partial of a FuncRef
)
{
char_u *name = NULL;
- char_u *start;
- char_u *end;
+ const char_u *start;
+ const char_u *end;
int lead;
- char_u sid_buf[20];
int len;
lval_T lv;
@@ -20007,19 +20394,20 @@ trans_function_name (
if ((*pp)[0] == K_SPECIAL && (*pp)[1] == KS_EXTRA
&& (*pp)[2] == (int)KE_SNR) {
*pp += 3;
- len = get_id_len(pp) + 3;
- return vim_strnsave(start, len);
+ len = get_id_len((const char **)pp) + 3;
+ return (char_u *)xmemdupz(start, len);
}
/* A name starting with "<SID>" or "<SNR>" is local to a script. But
* don't skip over "s:", get_lval() needs it for "s:dict.func". */
- lead = eval_fname_script(start);
- if (lead > 2)
+ lead = eval_fname_script((const char *)start);
+ if (lead > 2) {
start += lead;
+ }
- /* Note that TFN_ flags use the same values as GLV_ flags. */
- end = get_lval(start, NULL, &lv, FALSE, skip, flags,
- lead > 2 ? 0 : FNE_CHECK_START);
+ // Note that TFN_ flags use the same values as GLV_ flags.
+ end = get_lval((char_u *)start, NULL, &lv, false, skip, flags | GLV_READ_ONLY,
+ lead > 2 ? 0 : FNE_CHECK_START);
if (end == start) {
if (!skip)
EMSG(_("E129: Function name required"));
@@ -20032,10 +20420,12 @@ trans_function_name (
* interrupt, or an exception.
*/
if (!aborting()) {
- if (end != NULL)
- EMSG2(_(e_invarg2), start);
- } else
- *pp = find_name_end(start, NULL, NULL, FNE_INCL_BR);
+ if (end != NULL) {
+ emsgf(_(e_invarg2), start);
+ }
+ } else {
+ *pp = (char_u *)find_name_end(start, NULL, NULL, FNE_INCL_BR);
+ }
goto theend;
}
@@ -20048,14 +20438,21 @@ trans_function_name (
}
if (lv.ll_tv->v_type == VAR_FUNC && lv.ll_tv->vval.v_string != NULL) {
name = vim_strsave(lv.ll_tv->vval.v_string);
- *pp = end;
+ *pp = (char_u *)end;
+ } else if (lv.ll_tv->v_type == VAR_PARTIAL
+ && lv.ll_tv->vval.v_partial != NULL) {
+ name = vim_strsave(partial_name(lv.ll_tv->vval.v_partial));
+ *pp = (char_u *)end;
+ if (partial != NULL) {
+ *partial = lv.ll_tv->vval.v_partial;
+ }
} else {
if (!skip && !(flags & TFN_QUIET) && (fdp == NULL
|| lv.ll_dict == NULL
|| fdp->fd_newkey == NULL)) {
EMSG(_(e_funcref));
} else {
- *pp = end;
+ *pp = (char_u *)end;
}
name = NULL;
}
@@ -20063,26 +20460,30 @@ trans_function_name (
}
if (lv.ll_name == NULL) {
- /* Error found, but continue after the function name. */
- *pp = end;
+ // Error found, but continue after the function name.
+ *pp = (char_u *)end;
goto theend;
}
/* Check if the name is a Funcref. If so, use the value. */
if (lv.ll_exp_name != NULL) {
- len = (int)STRLEN(lv.ll_exp_name);
- name = deref_func_name(lv.ll_exp_name, &len, flags & TFN_NO_AUTOLOAD);
- if (name == lv.ll_exp_name)
+ len = (int)strlen(lv.ll_exp_name);
+ name = deref_func_name(lv.ll_exp_name, &len, partial,
+ flags & TFN_NO_AUTOLOAD);
+ if ((const char *)name == lv.ll_exp_name) {
name = NULL;
- } else {
+ }
+ } else if (!(flags & TFN_NO_DEREF)) {
len = (int)(end - *pp);
- name = deref_func_name(*pp, &len, flags & TFN_NO_AUTOLOAD);
- if (name == *pp)
+ name = deref_func_name((const char *)(*pp), &len, partial,
+ flags & TFN_NO_AUTOLOAD);
+ if (name == *pp) {
name = NULL;
+ }
}
if (name != NULL) {
name = vim_strsave(name);
- *pp = end;
+ *pp = (char_u *)end;
if (strncmp((char *)name, "<SNR>", 5) == 0) {
// Change "<SNR>" to the byte sequence.
name[0] = K_SPECIAL;
@@ -20094,12 +20495,13 @@ trans_function_name (
}
if (lv.ll_exp_name != NULL) {
- len = (int)STRLEN(lv.ll_exp_name);
+ len = (int)strlen(lv.ll_exp_name);
if (lead <= 2 && lv.ll_name == lv.ll_exp_name
- && STRNCMP(lv.ll_name, "s:", 2) == 0) {
- /* When there was "s:" already or the name expanded to get a
- * leading "s:" then remove it. */
+ && lv.ll_name_len >= 2 && memcmp(lv.ll_name, "s:", 2) == 0) {
+ // When there was "s:" already or the name expanded to get a
+ // leading "s:" then remove it.
lv.ll_name += 2;
+ lv.ll_name_len -= 2;
len -= 2;
lead = 2;
}
@@ -20107,37 +20509,41 @@ trans_function_name (
// Skip over "s:" and "g:".
if (lead == 2 || (lv.ll_name[0] == 'g' && lv.ll_name[1] == ':')) {
lv.ll_name += 2;
+ lv.ll_name_len -= 2;
}
- len = (int)(end - lv.ll_name);
+ len = (int)((const char *)end - lv.ll_name);
}
- /*
- * Copy the function name to allocated memory.
- * Accept <SID>name() inside a script, translate into <SNR>123_name().
- * Accept <SNR>123_name() outside a script.
- */
- if (skip)
- lead = 0; /* do nothing */
- else if (lead > 0) {
+ size_t sid_buf_len = 0;
+ char sid_buf[20];
+
+ // Copy the function name to allocated memory.
+ // Accept <SID>name() inside a script, translate into <SNR>123_name().
+ // Accept <SNR>123_name() outside a script.
+ if (skip) {
+ lead = 0; // do nothing
+ } else if (lead > 0) {
lead = 3;
if ((lv.ll_exp_name != NULL && eval_fname_sid(lv.ll_exp_name))
- || eval_fname_sid(*pp)) {
- /* It's "s:" or "<SID>" */
+ || eval_fname_sid((const char *)(*pp))) {
+ // It's "s:" or "<SID>".
if (current_SID <= 0) {
EMSG(_(e_usingsid));
goto theend;
}
- sprintf((char *)sid_buf, "%" PRId64 "_", (int64_t)current_SID);
- lead += (int)STRLEN(sid_buf);
+ sid_buf_len = snprintf(sid_buf, sizeof(sid_buf),
+ "%" PRIdSCID "_", current_SID);
+ lead += sid_buf_len;
}
- } else if (!(flags & TFN_INT) && builtin_function(lv.ll_name, len)) {
+ } else if (!(flags & TFN_INT)
+ && builtin_function(lv.ll_name, lv.ll_name_len)) {
EMSG2(_("E128: Function name must start with a capital or \"s:\": %s"),
start);
goto theend;
}
- if (!skip && !(flags & TFN_QUIET)) {
- char_u *cp = vim_strchr(lv.ll_name, ':');
+ if (!skip && !(flags & TFN_QUIET) && !(flags & TFN_NO_DEREF)) {
+ char_u *cp = xmemrchr(lv.ll_name, ':', lv.ll_name_len);
if (cp != NULL && cp < end) {
EMSG2(_("E884: Function name cannot contain a colon: %s"), start);
@@ -20150,12 +20556,13 @@ trans_function_name (
name[0] = K_SPECIAL;
name[1] = KS_EXTRA;
name[2] = (int)KE_SNR;
- if (lead > 3) /* If it's "<SID>" */
- STRCPY(name + 3, sid_buf);
+ if (sid_buf_len > 0) { // If it's "<SID>"
+ memcpy(name + 3, sid_buf, sid_buf_len);
+ }
}
- memmove(name + lead, lv.ll_name, (size_t)len);
+ memmove(name + lead, lv.ll_name, len);
name[lead + len] = NUL;
- *pp = end;
+ *pp = (char_u *)end;
theend:
clear_lval(&lv);
@@ -20167,23 +20574,34 @@ theend:
* Return 2 if "p" starts with "s:".
* Return 0 otherwise.
*/
-static int eval_fname_script(char_u *p)
+static int eval_fname_script(const char *const p)
{
- if (p[0] == '<' && (STRNICMP(p + 1, "SID>", 4) == 0
- || STRNICMP(p + 1, "SNR>", 4) == 0))
+ // Use mb_strnicmp() because in Turkish comparing the "I" may not work with
+ // the standard library function.
+ if (p[0] == '<'
+ && (mb_strnicmp((char_u *)p + 1, (char_u *)"SID>", 4) == 0
+ || mb_strnicmp((char_u *)p + 1, (char_u *)"SNR>", 4) == 0)) {
return 5;
- if (p[0] == 's' && p[1] == ':')
+ }
+ if (p[0] == 's' && p[1] == ':') {
return 2;
+ }
return 0;
}
-/*
- * Return TRUE if "p" starts with "<SID>" or "s:".
- * Only works if eval_fname_script() returned non-zero for "p"!
- */
-static int eval_fname_sid(char_u *p)
+/// Check whether function name starts with <SID> or s:
+///
+/// @warning Only works for names previously checked by eval_fname_script(), if
+/// it returned non-zero.
+///
+/// @param[in] name Name to check.
+///
+/// @return true if it starts with <SID> or s:, false otherwise.
+static inline bool eval_fname_sid(const char *const name)
+ FUNC_ATTR_PURE FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_WARN_UNUSED_RESULT
+ FUNC_ATTR_NONNULL_ALL
{
- return *p == 's' || TOUPPER_ASC(p[2]) == 'I';
+ return *name == 's' || TOUPPER_ASC(name[2]) == 'I';
}
/*
@@ -20196,39 +20614,46 @@ static void list_func_head(ufunc_T *fp, int indent)
MSG_PUTS(" ");
MSG_PUTS("function ");
if (fp->uf_name[0] == K_SPECIAL) {
- MSG_PUTS_ATTR("<SNR>", hl_attr(HLF_8));
- msg_puts(fp->uf_name + 3);
- } else
- msg_puts(fp->uf_name);
+ MSG_PUTS_ATTR("<SNR>", HL_ATTR(HLF_8));
+ msg_puts((const char *)fp->uf_name + 3);
+ } else {
+ msg_puts((const char *)fp->uf_name);
+ }
msg_putchar('(');
int j;
- for (j = 0; j < fp->uf_args.ga_len; ++j) {
- if (j)
- MSG_PUTS(", ");
- msg_puts(FUNCARG(fp, j));
+ for (j = 0; j < fp->uf_args.ga_len; j++) {
+ if (j) {
+ msg_puts(", ");
+ }
+ msg_puts((const char *)FUNCARG(fp, j));
}
if (fp->uf_varargs) {
- if (j)
- MSG_PUTS(", ");
- MSG_PUTS("...");
+ if (j) {
+ msg_puts(", ");
+ }
+ msg_puts("...");
}
msg_putchar(')');
- if (fp->uf_flags & FC_ABORT)
- MSG_PUTS(" abort");
- if (fp->uf_flags & FC_RANGE)
- MSG_PUTS(" range");
- if (fp->uf_flags & FC_DICT)
- MSG_PUTS(" dict");
+ if (fp->uf_flags & FC_ABORT) {
+ msg_puts(" abort");
+ }
+ if (fp->uf_flags & FC_RANGE) {
+ msg_puts(" range");
+ }
+ if (fp->uf_flags & FC_DICT) {
+ msg_puts(" dict");
+ }
+ if (fp->uf_flags & FC_CLOSURE) {
+ msg_puts(" closure");
+ }
msg_clr_eos();
if (p_verbose > 0)
last_set_msg(fp->uf_script_ID);
}
-/*
- * Find a function by name, return pointer to it in ufuncs.
- * Return NULL for unknown function.
- */
-static ufunc_T *find_func(char_u *name)
+/// Find a function by name, return pointer to it in ufuncs.
+/// @return NULL for unknown function.
+static ufunc_T *find_func(const char_u *name)
{
hashitem_T *hi;
@@ -20242,61 +20667,124 @@ static ufunc_T *find_func(char_u *name)
void free_all_functions(void)
{
hashitem_T *hi;
+ ufunc_T *fp;
+ uint64_t skipped = 0;
+ uint64_t todo = 1;
+ uint64_t used;
+
+ // Clean up the call stack.
+ while (current_funccal != NULL) {
+ tv_clear(current_funccal->rettv);
+ cleanup_function_call(current_funccal);
+ }
+
+ // First clear what the functions contain. Since this may lower the
+ // reference count of a function, it may also free a function and change
+ // the hash table. Restart if that happens.
+ while (todo > 0) {
+ todo = func_hashtab.ht_used;
+ for (hi = func_hashtab.ht_array; todo > 0; hi++) {
+ if (!HASHITEM_EMPTY(hi)) {
+ // Only free functions that are not refcounted, those are
+ // supposed to be freed when no longer referenced.
+ fp = HI2UF(hi);
+ if (func_name_refcount(fp->uf_name)) {
+ skipped++;
+ } else {
+ used = func_hashtab.ht_used;
+ func_clear(fp, true);
+ if (used != func_hashtab.ht_used) {
+ skipped = 0;
+ break;
+ }
+ }
+ todo--;
+ }
+ }
+ }
- /* Need to start all over every time, because func_free() may change the
- * hash table. */
- while (func_hashtab.ht_used > 0)
- for (hi = func_hashtab.ht_array;; ++hi)
+ // Now actually free the functions. Need to start all over every time,
+ // because func_free() may change the hash table.
+ skipped = 0;
+ while (func_hashtab.ht_used > skipped) {
+ todo = func_hashtab.ht_used;
+ for (hi = func_hashtab.ht_array; todo > 0; hi++) {
if (!HASHITEM_EMPTY(hi)) {
- func_free(HI2UF(hi));
- break;
+ todo--;
+ // Only free functions that are not refcounted, those are
+ // supposed to be freed when no longer referenced.
+ fp = HI2UF(hi);
+ if (func_name_refcount(fp->uf_name)) {
+ skipped++;
+ } else {
+ func_free(fp);
+ skipped = 0;
+ break;
+ }
}
+ }
+ }
+ if (skipped == 0) {
+ hash_clear(&func_hashtab);
+ }
}
#endif
-int translated_function_exists(char_u *name)
+bool translated_function_exists(const char *name)
{
if (builtin_function(name, -1)) {
- return find_internal_func(name) >= 0;
+ return find_internal_func((char *)name) != NULL;
}
- return find_func(name) != NULL;
+ return find_func((const char_u *)name) != NULL;
}
-/*
- * Return TRUE if a function "name" exists.
- */
-static int function_exists(char_u *name)
+/// Check whether function with the given name exists
+///
+/// @param[in] name Function name.
+/// @param[in] no_deref Whether to dereference a Funcref.
+///
+/// @return True if it exists, false otherwise.
+static bool function_exists(const char *const name, bool no_deref)
{
- char_u *nm = name;
- char_u *p;
- int n = FALSE;
+ const char_u *nm = (const char_u *)name;
+ bool n = false;
+ int flag = TFN_INT | TFN_QUIET | TFN_NO_AUTOLOAD;
- p = trans_function_name(&nm, FALSE, TFN_INT|TFN_QUIET|TFN_NO_AUTOLOAD,
- NULL);
+ if (no_deref) {
+ flag |= TFN_NO_DEREF;
+ }
+ char *const p = (char *)trans_function_name((char_u **)&nm, false, flag, NULL,
+ NULL);
nm = skipwhite(nm);
/* Only accept "funcname", "funcname ", "funcname (..." and
* "funcname(...", not "funcname!...". */
- if (p != NULL && (*nm == NUL || *nm == '('))
+ if (p != NULL && (*nm == NUL || *nm == '(')) {
n = translated_function_exists(p);
+ }
xfree(p);
return n;
}
-/// Return TRUE if "name" looks like a builtin function name: starts with a
+/// Checks if a builtin function with the given name exists.
+///
+/// @param[in] name name of the builtin function to check.
+/// @param[in] len length of "name", or -1 for NUL terminated.
+///
+/// @return true if "name" looks like a builtin function name: starts with a
/// lower case letter and doesn't contain AUTOLOAD_CHAR.
-/// "len" is the length of "name", or -1 for NUL terminated.
-static bool builtin_function(char_u *name, int len)
+static bool builtin_function(const char *name, int len)
{
if (!ASCII_ISLOWER(name[0])) {
- return FALSE;
+ return false;
}
- char_u *p = vim_strchr(name, AUTOLOAD_CHAR);
+ const char *p = (len == -1
+ ? strchr(name, AUTOLOAD_CHAR)
+ : memchr(name, AUTOLOAD_CHAR, (size_t)len));
- return p == NULL
- || (len > 0 && p > name + len);
+ return p == NULL;
}
/*
@@ -20390,8 +20878,8 @@ void func_dump_profile(FILE *fd)
xfree(sorttab);
}
-static void
-prof_sort_list (
+static void
+prof_sort_list(
FILE *fd,
ufunc_T **sorttab,
int st_len,
@@ -20462,44 +20950,45 @@ static int prof_self_cmp(const void *s1, const void *s2)
}
-/*
- * If "name" has a package name try autoloading the script for it.
- * Return TRUE if a package was loaded.
- */
-static int
-script_autoload (
- char_u *name,
- int reload /* load script again when already loaded */
-)
+/// If name has a package name try autoloading the script for it
+///
+/// @param[in] name Variable/function name.
+/// @param[in] name_len Name length.
+/// @param[in] reload If true, load script again when already loaded.
+///
+/// @return true if a package was loaded.
+static bool script_autoload(const char *const name, const size_t name_len,
+ const bool reload)
{
- char_u *p;
- char_u *scriptname, *tofree;
- int ret = FALSE;
- int i;
-
- /* If there is no '#' after name[0] there is no package name. */
- p = vim_strchr(name, AUTOLOAD_CHAR);
- if (p == NULL || p == name)
- return FALSE;
+ // If there is no '#' after name[0] there is no package name.
+ const char *p = memchr(name, AUTOLOAD_CHAR, name_len);
+ if (p == NULL || p == name) {
+ return false;
+ }
- tofree = scriptname = autoload_name(name);
+ bool ret = false;
+ char *tofree = autoload_name(name, name_len);
+ char *scriptname = tofree;
- /* Find the name in the list of previously loaded package names. Skip
- * "autoload/", it's always the same. */
- for (i = 0; i < ga_loaded.ga_len; ++i)
- if (STRCMP(((char_u **)ga_loaded.ga_data)[i] + 9, scriptname + 9) == 0)
+ // Find the name in the list of previously loaded package names. Skip
+ // "autoload/", it's always the same.
+ int i = 0;
+ for (; i < ga_loaded.ga_len; i++) {
+ if (STRCMP(((char **)ga_loaded.ga_data)[i] + 9, scriptname + 9) == 0) {
break;
- if (!reload && i < ga_loaded.ga_len)
- ret = FALSE; /* was loaded already */
- else {
- /* Remember the name if it wasn't loaded already. */
+ }
+ }
+ if (!reload && i < ga_loaded.ga_len) {
+ ret = false; // Was loaded already.
+ } else {
+ // Remember the name if it wasn't loaded already.
if (i == ga_loaded.ga_len) {
- GA_APPEND(char_u *, &ga_loaded, scriptname);
+ GA_APPEND(char *, &ga_loaded, scriptname);
tofree = NULL;
}
// Try loading the package from $VIMRUNTIME/autoload/<name>.vim
- if (source_runtime(scriptname, 0) == OK) {
+ if (source_runtime((char_u *)scriptname, 0) == OK) {
ret = true;
}
}
@@ -20508,21 +20997,29 @@ script_autoload (
return ret;
}
-/*
- * Return the autoload script name for a function or variable name.
- */
-static char_u *autoload_name(char_u *name)
+/// Return the autoload script name for a function or variable name
+///
+/// @param[in] name Variable/function name.
+/// @param[in] name_len Name length.
+///
+/// @return [allocated] autoload script name.
+static char *autoload_name(const char *const name, const size_t name_len)
+ FUNC_ATTR_MALLOC FUNC_ATTR_WARN_UNUSED_RESULT
{
- /* Get the script file name: replace '#' with '/', append ".vim". */
- char_u *scriptname = xmalloc(STRLEN(name) + 14);
- STRCPY(scriptname, "autoload/");
- STRCAT(scriptname, name);
- *vim_strrchr(scriptname, AUTOLOAD_CHAR) = NUL;
- STRCAT(scriptname, ".vim");
-
- char_u *p;
- while ((p = vim_strchr(scriptname, AUTOLOAD_CHAR)) != NULL)
- *p = '/';
+ // Get the script file name: replace '#' with '/', append ".vim".
+ char *const scriptname = xmalloc(name_len + sizeof("autoload/.vim"));
+ memcpy(scriptname, "autoload/", sizeof("autoload/") - 1);
+ memcpy(scriptname + sizeof("autoload/") - 1, name, name_len);
+ size_t auchar_idx = 0;
+ for (size_t i = sizeof("autoload/") - 1;
+ i - sizeof("autoload/") + 1 < name_len;
+ i++) {
+ if (scriptname[i] == AUTOLOAD_CHAR) {
+ scriptname[i] = '/';
+ auchar_idx = i;
+ }
+ }
+ memcpy(scriptname + auchar_idx, ".vim", sizeof(".vim"));
return scriptname;
}
@@ -20550,11 +21047,14 @@ char_u *get_user_func_name(expand_T *xp, int idx)
++hi;
fp = HI2UF(hi);
- if (fp->uf_flags & FC_DICT)
- return (char_u *)""; /* don't show dict functions */
+ if ((fp->uf_flags & FC_DICT)
+ || STRNCMP(fp->uf_name, "<lambda>", 8) == 0) {
+ return (char_u *)""; // don't show dict and lambda functions
+ }
- if (STRLEN(fp->uf_name) + 4 >= IOSIZE)
- return fp->uf_name; /* prevents overflow */
+ if (STRLEN(fp->uf_name) + 4 >= IOSIZE) {
+ return fp->uf_name; // Prevent overflow.
+ }
cat_func_name(IObuff, fp);
if (xp->xp_context != EXPAND_USER_FUNC) {
@@ -20582,9 +21082,18 @@ static void cat_func_name(char_u *buf, ufunc_T *fp)
STRCPY(buf, fp->uf_name);
}
-/*
- * ":delfunction {name}"
- */
+/// There are two kinds of function names:
+/// 1. ordinary names, function defined with :function
+/// 2. numbered functions and lambdas
+/// For the first we only count the name stored in func_hashtab as a reference,
+/// using function() does not count as a reference, because the function is
+/// looked up by name.
+static bool func_name_refcount(char_u *name)
+{
+ return isdigit(*name) || *name == '<';
+}
+
+/// ":delfunction {name}"
void ex_delfunction(exarg_T *eap)
{
ufunc_T *fp = NULL;
@@ -20593,7 +21102,7 @@ void ex_delfunction(exarg_T *eap)
funcdict_T fudi;
p = eap->arg;
- name = trans_function_name(&p, eap->skip, 0, &fudi);
+ name = trans_function_name(&p, eap->skip, 0, &fudi, NULL);
xfree(fudi.fd_newkey);
if (name == NULL) {
if (fudi.fd_dict != NULL && !eap->skip)
@@ -20615,7 +21124,9 @@ void ex_delfunction(exarg_T *eap)
if (!eap->skip) {
if (fp == NULL) {
- EMSG2(_(e_nofunc), eap->arg);
+ if (!eap->forceit) {
+ EMSG2(_(e_nofunc), eap->arg);
+ }
return;
}
if (fp->uf_calls > 0) {
@@ -20631,96 +21142,188 @@ void ex_delfunction(exarg_T *eap)
}
if (fudi.fd_dict != NULL) {
- /* Delete the dict item that refers to the function, it will
- * invoke func_unref() and possibly delete the function. */
- dictitem_remove(fudi.fd_dict, fudi.fd_di);
- } else
- func_free(fp);
+ // Delete the dict item that refers to the function, it will
+ // invoke func_unref() and possibly delete the function.
+ tv_dict_item_remove(fudi.fd_dict, fudi.fd_di);
+ } else {
+ // A normal function (not a numbered function or lambda) has a
+ // refcount of 1 for the entry in the hashtable. When deleting
+ // it and the refcount is more than one, it should be kept.
+ // A numbered function or lambda should be kept if the refcount is
+ // one or more.
+ if (fp->uf_refcount > (func_name_refcount(fp->uf_name) ? 0 : 1)) {
+ // Function is still referenced somewhere. Don't free it but
+ // do remove it from the hashtable.
+ if (func_remove(fp)) {
+ fp->uf_refcount--;
+ }
+ fp->uf_flags |= FC_DELETED;
+ } else {
+ func_clear_free(fp, false);
+ }
+ }
}
}
-/*
- * Free a function and remove it from the list of functions.
- */
-static void func_free(ufunc_T *fp)
+/// Remove the function from the function hashtable. If the function was
+/// deleted while it still has references this was already done.
+///
+/// @return true if the entry was deleted, false if it wasn't found.
+static bool func_remove(ufunc_T *fp)
{
- hashitem_T *hi;
+ hashitem_T *hi = hash_find(&func_hashtab, UF2HIKEY(fp));
- /* clear this function */
+ if (!HASHITEM_EMPTY(hi)) {
+ hash_remove(&func_hashtab, hi);
+ return true;
+ }
+
+ return false;
+}
+
+/// Free all things that a function contains. Does not free the function
+/// itself, use func_free() for that.
+///
+/// param[in] force When true, we are exiting.
+static void func_clear(ufunc_T *fp, bool force)
+{
+ if (fp->uf_cleared) {
+ return;
+ }
+ fp->uf_cleared = true;
+
+ // clear this function
ga_clear_strings(&(fp->uf_args));
ga_clear_strings(&(fp->uf_lines));
xfree(fp->uf_tml_count);
xfree(fp->uf_tml_total);
xfree(fp->uf_tml_self);
+ funccal_unref(fp->uf_scoped, fp, force);
+}
- /* remove the function from the function hashtable */
- hi = hash_find(&func_hashtab, UF2HIKEY(fp));
- if (HASHITEM_EMPTY(hi))
- EMSG2(_(e_intern2), "func_free()");
- else
- hash_remove(&func_hashtab, hi);
-
+/// Free a function and remove it from the list of functions. Does not free
+/// what a function contains, call func_clear() first.
+///
+/// param[in] fp The function to free.
+static void func_free(ufunc_T *fp)
+{
+ // only remove it when not done already, otherwise we would remove a newer
+ // version of the function
+ if ((fp->uf_flags & (FC_DELETED | FC_REMOVED)) == 0) {
+ func_remove(fp);
+ }
xfree(fp);
}
+/// Free all things that a function contains and free the function itself.
+///
+/// param[in] force When true, we are exiting.
+static void func_clear_free(ufunc_T *fp, bool force)
+{
+ func_clear(fp, force);
+ func_free(fp);
+}
+
/*
* Unreference a Function: decrement the reference count and free it when it
- * becomes zero. Only for numbered functions.
+ * becomes zero.
*/
void func_unref(char_u *name)
{
- ufunc_T *fp;
+ ufunc_T *fp = NULL;
- if (name != NULL && isdigit(*name)) {
- fp = find_func(name);
- if (fp == NULL) {
- EMSG2(_(e_intern2), "func_unref()");
- } else {
- user_func_unref(fp);
+ if (name == NULL || !func_name_refcount(name)) {
+ return;
+ }
+
+ fp = find_func(name);
+ if (fp == NULL && isdigit(*name)) {
+#ifdef EXITFREE
+ if (!entered_free_all_mem) {
+ internal_error("func_unref()");
+ abort();
}
+#else
+ internal_error("func_unref()");
+ abort();
+#endif
}
+ func_ptr_unref(fp);
}
-static void user_func_unref(ufunc_T *fp)
+/// Unreference a Function: decrement the reference count and free it when it
+/// becomes zero.
+/// Unreference user function, freeing it if needed
+///
+/// Decrements the reference count and frees when it becomes zero.
+///
+/// @param fp Function to unreference.
+void func_ptr_unref(ufunc_T *fp)
{
- if (--fp->uf_refcount <= 0) {
- // Only delete it when it's not being used. Otherwise it's done
+ if (fp != NULL && --fp->uf_refcount <= 0) {
+ // Only delete it when it's not being used. Otherwise it's done
// when "uf_calls" becomes zero.
if (fp->uf_calls == 0) {
- func_free(fp);
+ func_clear_free(fp, false);
}
}
}
-/*
- * Count a reference to a Function.
- */
+/// Count a reference to a Function.
void func_ref(char_u *name)
{
ufunc_T *fp;
- if (name != NULL && isdigit(*name)) {
- fp = find_func(name);
- if (fp == NULL)
- EMSG2(_(e_intern2), "func_ref()");
- else
- ++fp->uf_refcount;
+ if (name == NULL || !func_name_refcount(name)) {
+ return;
+ }
+ fp = find_func(name);
+ if (fp != NULL) {
+ (fp->uf_refcount)++;
+ } else if (isdigit(*name)) {
+ // Only give an error for a numbered function.
+ // Fail silently, when named or lambda function isn't found.
+ internal_error("func_ref()");
}
}
-/*
- * Call a user function.
- */
-static void
-call_user_func (
- ufunc_T *fp, /* pointer to function */
- int argcount, /* nr of args */
- typval_T *argvars, /* arguments */
- typval_T *rettv, /* return value */
- linenr_T firstline, /* first line of range */
- linenr_T lastline, /* last line of range */
- dict_T *selfdict /* Dictionary for "self" */
-)
+/// Count a reference to a Function.
+void func_ptr_ref(ufunc_T *fp)
+{
+ if (fp != NULL) {
+ (fp->uf_refcount)++;
+ }
+}
+
+/// Check whether funccall is still referenced outside
+///
+/// It is supposed to be referenced if either it is referenced itself or if l:,
+/// a: or a:000 are referenced as all these are statically allocated within
+/// funccall structure.
+static inline bool fc_referenced(const funccall_T *const fc)
+ FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
+ FUNC_ATTR_NONNULL_ALL
+{
+ return ((fc->l_varlist.lv_refcount // NOLINT(runtime/deprecated)
+ != DO_NOT_FREE_CNT)
+ || fc->l_vars.dv_refcount != DO_NOT_FREE_CNT
+ || fc->l_avars.dv_refcount != DO_NOT_FREE_CNT
+ || fc->fc_refcount > 0);
+}
+
+/// Call a user function
+///
+/// @param fp Function to call.
+/// @param[in] argcount Number of arguments.
+/// @param argvars Arguments.
+/// @param[out] rettv Return value.
+/// @param[in] firstline First line of range.
+/// @param[in] lastline Last line of range.
+/// @param selfdict Dictionary for "self" for dictionary functions.
+void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars,
+ typval_T *rettv, linenr_T firstline, linenr_T lastline,
+ dict_T *selfdict)
+ FUNC_ATTR_NONNULL_ARG(1, 3, 4)
{
char_u *save_sourcing_name;
linenr_T save_sourcing_lnum;
@@ -20731,11 +21334,13 @@ call_user_func (
dictitem_T *v;
int fixvar_idx = 0; /* index in fixvar[] */
int ai;
+ bool islambda = false;
char_u numbuf[NUMBUFLEN];
char_u *name;
proftime_T wait_start;
proftime_T call_start;
bool did_save_redo = false;
+ save_redo_T save_redo;
/* If depth of calling is getting too high, don't execute the function */
if (depth >= p_mfd) {
@@ -20748,7 +21353,7 @@ call_user_func (
// Save search patterns and redo buffer.
save_search_patterns();
if (!ins_compl_active()) {
- saveRedobuff();
+ saveRedobuff(&save_redo);
did_save_redo = true;
}
++fp->uf_calls;
@@ -20768,25 +21373,32 @@ call_user_func (
fc->breakpoint = dbg_find_breakpoint(FALSE, fp->uf_name, (linenr_T)0);
fc->dbg_tick = debug_tick;
- /*
- * Note about using fc->fixvar[]: This is an array of FIXVAR_CNT variables
- * with names up to VAR_SHORT_LEN long. This avoids having to alloc/free
- * each argument variable and saves a lot of time.
- */
- /*
- * Init l: variables.
- */
+ // 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);
+
+ if (STRNCMP(fp->uf_name, "<lambda>", 8) == 0) {
+ islambda = true;
+ }
+
+ // Note about using fc->fixvar[]: This is an array of FIXVAR_CNT variables
+ // with names up to VAR_SHORT_LEN long. This avoids having to alloc/free
+ // each argument variable and saves a lot of time.
+ //
+ // Init l: variables.
init_var_dict(&fc->l_vars, &fc->l_vars_var, VAR_DEF_SCOPE);
if (selfdict != NULL) {
- /* Set l:self to "selfdict". Use "name" to avoid a warning from
- * some compiler that checks the destination size. */
- v = &fc->fixvar[fixvar_idx++].var;
+ // Set l:self to "selfdict". 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, "self");
#endif
v->di_flags = DI_FLAGS_RO + DI_FLAGS_FIX;
- hash_add(&fc->l_vars.dv_hashtab, DI2HIKEY(v));
+ tv_dict_add(&fc->l_vars, v);
v->di_tv.v_type = VAR_DICT;
v->di_tv.v_lock = 0;
v->di_tv.vval.v_dict = selfdict;
@@ -20799,62 +21411,72 @@ call_user_func (
* 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, &fc->fixvar[fixvar_idx++].var, "0",
- (varnumber_T)(argcount - fp->uf_args.ga_len));
- /* Use "name" to avoid a warning from some compiler that checks the
- * destination size. */
- v = &fc->fixvar[fixvar_idx++].var;
+ add_nr_var(&fc->l_avars, (dictitem_T *)&fc->fixvar[fixvar_idx++], "0",
+ (varnumber_T)(argcount - fp->uf_args.ga_len));
+ // 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");
#endif
v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
- hash_add(&fc->l_avars.dv_hashtab, DI2HIKEY(v));
+ 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;
- memset(&fc->l_varlist, 0, sizeof(list_T));
- fc->l_varlist.lv_refcount = DO_NOT_FREE_CNT;
- fc->l_varlist.lv_lock = VAR_FIXED;
+ 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);
+ for (int i = 0; i < argcount; i++) {
+ bool addlocal = false;
- /*
- * 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, &fc->fixvar[fixvar_idx++].var, "firstline",
- (varnumber_T)firstline);
- add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "lastline",
- (varnumber_T)lastline);
- for (int i = 0; i < argcount; ++i) {
ai = i - fp->uf_args.ga_len;
- if (ai < 0)
- /* named argument a:name */
+ if (ai < 0) {
+ // named argument a:name
name = FUNCARG(fp, i);
- else {
- /* "..." argument a:1, a:2, etc. */
- sprintf((char *)numbuf, "%d", ai + 1);
+ if (islambda) {
+ addlocal = true;
+ }
+ } else {
+ // "..." argument a:1, a:2, etc.
+ snprintf((char *)numbuf, sizeof(numbuf), "%d", ai + 1);
name = numbuf;
}
if (fixvar_idx < FIXVAR_CNT && STRLEN(name) <= VAR_SHORT_LEN) {
- v = &fc->fixvar[fixvar_idx++].var;
+ v = (dictitem_T *)&fc->fixvar[fixvar_idx++];
v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
} else {
v = xmalloc(sizeof(dictitem_T) + STRLEN(name));
v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX | DI_FLAGS_ALLOC;
}
STRCPY(v->di_key, name);
- hash_add(&fc->l_avars.dv_hashtab, DI2HIKEY(v));
- /* Note: the values are copied directly to avoid alloc/free.
- * "argvars" must have VAR_FIXED for v_lock. */
+ // Note: the values are copied directly to avoid alloc/free.
+ // "argvars" must have VAR_FIXED for v_lock.
v->di_tv = argvars[i];
v->di_tv.v_lock = VAR_FIXED;
+ if (addlocal) {
+ // Named arguments can be accessed without the "a:" prefix in lambda
+ // expressions. Add to the l: dict.
+ tv_copy(&v->di_tv, &v->di_tv);
+ tv_dict_add(&fc->l_vars, v);
+ } else {
+ tv_dict_add(&fc->l_avars, v);
+ }
+
if (ai >= 0 && ai < MAX_FUNC_ARGS) {
- list_append(&fc->l_varlist, &fc->l_listitems[ai]);
- fc->l_listitems[ai].li_tv = argvars[i];
- fc->l_listitems[ai].li_tv.v_lock = VAR_FIXED;
+ tv_list_append(&fc->l_varlist, &fc->l_listitems[ai]);
+ *TV_LIST_ITEM_TV(&fc->l_listitems[ai]) = argvars[i];
+ TV_LIST_ITEM_TV(&fc->l_listitems[ai])->v_lock = VAR_FIXED;
}
}
@@ -20890,24 +21512,24 @@ call_user_func (
smsg(_("calling %s"), sourcing_name);
if (p_verbose >= 14) {
- char_u buf[MSG_BUF_LEN];
-
- msg_puts((char_u *)"(");
- for (int i = 0; i < argcount; ++i) {
+ msg_puts("(");
+ for (int i = 0; i < argcount; i++) {
if (i > 0) {
- msg_puts((char_u *)", ");
+ msg_puts(", ");
}
if (argvars[i].v_type == VAR_NUMBER) {
msg_outnum((long)argvars[i].vval.v_number);
} else {
// Do not want errors such as E724 here.
emsg_off++;
- char_u *s = (char_u *) encode_tv2string(&argvars[i], NULL);
- char_u *tofree = s;
+ char *tofree = encode_tv2string(&argvars[i], NULL);
emsg_off--;
- if (s != NULL) {
- if (vim_strsize(s) > MSG_BUF_CLEN) {
- trunc_string(s, buf, MSG_BUF_CLEN, MSG_BUF_LEN);
+ if (tofree != NULL) {
+ char *s = tofree;
+ char buf[MSG_BUF_LEN];
+ if (vim_strsize((char_u *)s) > MSG_BUF_CLEN) {
+ trunc_string((char_u *)s, (char_u *)buf, MSG_BUF_CLEN,
+ sizeof(buf));
s = buf;
}
msg_puts(s);
@@ -20915,24 +21537,26 @@ call_user_func (
}
}
}
- msg_puts((char_u *)")");
+ msg_puts(")");
}
- msg_puts((char_u *)"\n"); /* don't overwrite this either */
+ msg_puts("\n"); // don't overwrite this either
verbose_leave_scroll();
--no_wait_return;
}
}
+ const bool do_profiling_yes = do_profiling == PROF_YES;
+
bool func_not_yet_profiling_but_should =
- do_profiling == PROF_YES
- && !fp->uf_profiling && has_profiling(FALSE, fp->uf_name, NULL);
+ do_profiling_yes
+ && !fp->uf_profiling && has_profiling(false, fp->uf_name, NULL);
if (func_not_yet_profiling_but_should)
func_do_profile(fp);
bool func_or_func_caller_profiling =
- do_profiling == PROF_YES
+ do_profiling_yes
&& (fp->uf_profiling
|| (fc->caller != NULL && fc->caller->func->uf_profiling));
@@ -20942,7 +21566,7 @@ call_user_func (
fp->uf_tm_children = profile_zero();
}
- if (do_profiling == PROF_YES) {
+ if (do_profiling_yes) {
script_prof_save(&wait_start);
}
@@ -20960,14 +21584,14 @@ call_user_func (
// when the function was aborted because of an error, return -1
if ((did_emsg
&& (fp->uf_flags & FC_ABORT)) || rettv->v_type == VAR_UNKNOWN) {
- clear_tv(rettv);
+ tv_clear(rettv);
rettv->v_type = VAR_NUMBER;
rettv->vval.v_number = -1;
}
if (func_or_func_caller_profiling) {
call_start = profile_end(call_start);
- call_start = profile_sub_wait(wait_start, call_start);
+ call_start = profile_sub_wait(wait_start, call_start); // -V614
fp->uf_tm_total = profile_add(fp->uf_tm_total, call_start);
fp->uf_tm_self = profile_self(fp->uf_tm_self, call_start,
fp->uf_tm_children);
@@ -21008,7 +21632,7 @@ call_user_func (
xfree(tofree);
}
}
- msg_puts((char_u *)"\n"); /* don't overwrite this either */
+ msg_puts("\n"); // don't overwrite this either
verbose_leave_scroll();
--no_wait_return;
@@ -21018,104 +21642,146 @@ call_user_func (
sourcing_name = save_sourcing_name;
sourcing_lnum = save_sourcing_lnum;
current_SID = save_current_SID;
- if (do_profiling == PROF_YES)
+ if (do_profiling_yes) {
script_prof_restore(&wait_start);
+ }
if (p_verbose >= 12 && sourcing_name != NULL) {
++no_wait_return;
verbose_enter_scroll();
smsg(_("continuing in %s"), sourcing_name);
- msg_puts((char_u *)"\n"); /* don't overwrite this either */
+ msg_puts("\n"); // don't overwrite this either
verbose_leave_scroll();
--no_wait_return;
}
did_emsg |= save_did_emsg;
- current_funccal = fc->caller;
- --depth;
-
- /* If the a:000 list and the l: and a: dicts are not referenced we can
- * free the funccall_T and what's in it. */
- if (fc->l_varlist.lv_refcount == DO_NOT_FREE_CNT
- && fc->l_vars.dv_refcount == DO_NOT_FREE_CNT
- && fc->l_avars.dv_refcount == DO_NOT_FREE_CNT) {
- free_funccal(fc, FALSE);
- } else {
- hashitem_T *hi;
- listitem_T *li;
- int todo;
+ depth--;
- /* "fc" is still in use. This can happen when returning "a:000" or
- * assigning "l:" to a global variable.
- * Link "fc" in the list for garbage collection later. */
- fc->caller = previous_funccal;
- previous_funccal = fc;
+ cleanup_function_call(fc);
- /* Make a copy of the a: variables, since we didn't do that above. */
- todo = (int)fc->l_avars.dv_hashtab.ht_used;
- for (hi = fc->l_avars.dv_hashtab.ht_array; todo > 0; ++hi) {
- if (!HASHITEM_EMPTY(hi)) {
- --todo;
- v = HI2DI(hi);
- copy_tv(&v->di_tv, &v->di_tv);
- }
- }
-
- /* Make a copy of the a:000 items, since we didn't do that above. */
- for (li = fc->l_varlist.lv_first; li != NULL; li = li->li_next)
- copy_tv(&li->li_tv, &li->li_tv);
- }
-
- if (--fp->uf_calls <= 0 && isdigit(*fp->uf_name) && fp->uf_refcount <= 0) {
+ if (--fp->uf_calls <= 0 && fp->uf_refcount <= 0) {
// Function was unreferenced while being used, free it now.
- func_free(fp);
+ func_clear_free(fp, false);
}
// restore search patterns and redo buffer
if (did_save_redo) {
- restoreRedobuff();
+ restoreRedobuff(&save_redo);
}
restore_search_patterns();
}
-/*
- * Return TRUE if items in "fc" do not have "copyID". That means they are not
- * referenced from anywhere that is in use.
- */
+/// Unreference "fc": decrement the reference count and free it when it
+/// becomes zero. "fp" is detached from "fc".
+///
+/// @param[in] force When true, we are exiting.
+static void funccal_unref(funccall_T *fc, ufunc_T *fp, bool force)
+{
+ funccall_T **pfc;
+ int i;
+
+ if (fc == NULL) {
+ return;
+ }
+
+ fc->fc_refcount--;
+ if (force ? fc->fc_refcount <= 0 : !fc_referenced(fc)) {
+ for (pfc = &previous_funccal; *pfc != NULL; pfc = &(*pfc)->caller) {
+ if (fc == *pfc) {
+ *pfc = fc->caller;
+ free_funccal(fc, true);
+ return;
+ }
+ }
+ }
+ for (i = 0; i < fc->fc_funcs.ga_len; i++) {
+ if (((ufunc_T **)(fc->fc_funcs.ga_data))[i] == fp) {
+ ((ufunc_T **)(fc->fc_funcs.ga_data))[i] = NULL;
+ }
+ }
+}
+
+/// @return true if items in "fc" do not have "copyID". That means they are not
+/// referenced from anywhere that is in use.
static int can_free_funccal(funccall_T *fc, int copyID)
{
return fc->l_varlist.lv_copyID != copyID
&& fc->l_vars.dv_copyID != copyID
- && fc->l_avars.dv_copyID != copyID;
+ && fc->l_avars.dv_copyID != copyID
+ && fc->fc_copyID != copyID;
}
/*
* Free "fc" and what it contains.
*/
-static void
-free_funccal (
+static void
+free_funccal(
funccall_T *fc,
int free_val /* a: vars were allocated */
)
{
- listitem_T *li;
+ for (int i = 0; i < fc->fc_funcs.ga_len; i++) {
+ ufunc_T *fp = ((ufunc_T **)(fc->fc_funcs.ga_data))[i];
+
+ // When garbage collecting a funccall_T may be freed before the
+ // function that references it, clear its uf_scoped field.
+ // The function may have been redefined and point to another
+ // funccal_T, don't clear it then.
+ if (fp != NULL && fp->uf_scoped == fc) {
+ fp->uf_scoped = NULL;
+ }
+ }
+ ga_clear(&fc->fc_funcs);
- /* The a: variables typevals may not have been allocated, only free the
- * allocated variables. */
+ // The a: variables typevals may not have been allocated, only free the
+ // allocated variables.
vars_clear_ext(&fc->l_avars.dv_hashtab, free_val);
- /* free all l: variables */
+ // Free all l: variables.
vars_clear(&fc->l_vars.dv_hashtab);
- /* Free the a:000 variables if they were allocated. */
- if (free_val)
- for (li = fc->l_varlist.lv_first; li != NULL; li = li->li_next)
- clear_tv(&li->li_tv);
+ // Free the a:000 variables if they were allocated.
+ if (free_val) {
+ TV_LIST_ITER(&fc->l_varlist, li, {
+ tv_clear(TV_LIST_ITEM_TV(li));
+ });
+ }
+ func_ptr_unref(fc->func);
xfree(fc);
}
+/// Handle the last part of returning from a function: free the local hashtable.
+/// Unless it is still in use by a closure.
+static void cleanup_function_call(funccall_T *fc)
+{
+ current_funccal = fc->caller;
+
+ // If the a:000 list and the l: and a: dicts are not referenced and there
+ // is no closure using it, we can free the funccall_T and what's in it.
+ if (!fc_referenced(fc)) {
+ free_funccal(fc, false);
+ } else {
+ // "fc" is still in use. This can happen when returning "a:000",
+ // assigning "l:" to a global variable or defining a closure.
+ // Link "fc" in the list for garbage collection later.
+ fc->caller = previous_funccal;
+ previous_funccal = fc;
+
+ // Make a copy of the a: variables, since we didn't do that above.
+ TV_DICT_ITER(&fc->l_avars, di, {
+ tv_copy(&di->di_tv, &di->di_tv);
+ });
+
+ // Make a copy of the a:000 items, since we didn't do that above.
+ TV_LIST_ITER(&fc->l_varlist, li, {
+ tv_copy(TV_LIST_ITEM_TV(li), TV_LIST_ITEM_TV(li));
+ });
+ }
+}
+
/*
* Add a number variable "name" to dict "dp" with value "nr".
*/
@@ -21125,7 +21791,7 @@ static void add_nr_var(dict_T *dp, dictitem_T *v, char *name, varnumber_T nr)
STRCPY(v->di_key, name);
#endif
v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
- hash_add(&dp->dv_hashtab, DI2HIKEY(v));
+ tv_dict_add(dp, v);
v->di_tv.v_type = VAR_NUMBER;
v->di_tv.v_lock = VAR_FIXED;
v->di_tv.vval.v_number = nr;
@@ -21151,19 +21817,20 @@ void ex_return(exarg_T *eap)
eap->nextcmd = NULL;
if ((*arg != NUL && *arg != '|' && *arg != '\n')
&& eval0(arg, &rettv, &eap->nextcmd, !eap->skip) != FAIL) {
- if (!eap->skip)
- returning = do_return(eap, FALSE, TRUE, &rettv);
- else
- clear_tv(&rettv);
- }
- /* It's safer to return also on error. */
- else if (!eap->skip) {
- /*
- * Return unless the expression evaluation has been cancelled due to an
- * aborting error, an interrupt, or an exception.
- */
- if (!aborting())
- returning = do_return(eap, FALSE, TRUE, NULL);
+ if (!eap->skip) {
+ returning = do_return(eap, false, true, &rettv);
+ } else {
+ tv_clear(&rettv);
+ }
+ } else if (!eap->skip) { // It's safer to return also on error.
+ // In return statement, cause_abort should be force_abort.
+ update_force_abort();
+
+ // Return unless the expression evaluation has been cancelled due to an
+ // aborting error, an interrupt, or an exception.
+ if (!aborting()) {
+ returning = do_return(eap, false, true, NULL);
+ }
}
/* When skipping or the return gets pending, advance to the next command
@@ -21241,7 +21908,7 @@ int do_return(exarg_T *eap, int reanimate, int is_cmd, void *rettv)
* a return immediately after reanimation, the value is already
* there. */
if (!reanimate && rettv != NULL) {
- clear_tv(current_funccal->rettv);
+ tv_clear(current_funccal->rettv);
*current_funccal->rettv = *(typval_T *)rettv;
if (!is_cmd)
xfree(rettv);
@@ -21252,14 +21919,6 @@ int do_return(exarg_T *eap, int reanimate, int is_cmd, void *rettv)
}
/*
- * Free the variable with a pending return value.
- */
-void discard_pending_return(void *rettv)
-{
- free_tv((typval_T *)rettv);
-}
-
-/*
* Generate a return command for producing the value of "rettv". The result
* is an allocated string. Used by report_pending() for verbose messages.
*/
@@ -21276,7 +21935,7 @@ char_u *get_return_cmd(void *rettv)
}
STRCPY(IObuff, ":return ");
- STRNCPY(IObuff + 8, s, IOSIZE - 8);
+ STRLCPY(IObuff + 8, s, IOSIZE - 8);
if (STRLEN(s) + 8 >= IOSIZE)
STRCPY(IObuff + IOSIZE - 4, "...");
xfree(tofree);
@@ -21431,6 +22090,72 @@ static var_flavour_T var_flavour(char_u *varname)
}
}
+/// Search hashitem in parent scope.
+hashitem_T *find_hi_in_scoped_ht(const char *name, hashtab_T **pht)
+{
+ if (current_funccal == NULL || current_funccal->func->uf_scoped == NULL) {
+ return NULL;
+ }
+
+ funccall_T *old_current_funccal = current_funccal;
+ hashitem_T *hi = NULL;
+ const size_t namelen = strlen(name);
+ const char *varname;
+
+ // Search in parent scope which is possible to reference from lambda
+ current_funccal = current_funccal->func->uf_scoped;
+ while (current_funccal != NULL) {
+ hashtab_T *ht = find_var_ht(name, namelen, &varname);
+ if (ht != NULL && *varname != NUL) {
+ hi = hash_find_len(ht, varname, namelen - (varname - name));
+ if (!HASHITEM_EMPTY(hi)) {
+ *pht = ht;
+ break;
+ }
+ }
+ if (current_funccal == current_funccal->func->uf_scoped) {
+ break;
+ }
+ current_funccal = current_funccal->func->uf_scoped;
+ }
+ current_funccal = old_current_funccal;
+
+ return hi;
+}
+
+/// Search variable in parent scope.
+dictitem_T *find_var_in_scoped_ht(const char *name, const size_t namelen,
+ int no_autoload)
+{
+ if (current_funccal == NULL || current_funccal->func->uf_scoped == NULL) {
+ return NULL;
+ }
+
+ dictitem_T *v = NULL;
+ funccall_T *old_current_funccal = current_funccal;
+ const char *varname;
+
+ // Search in parent scope which is possible to reference from lambda
+ current_funccal = current_funccal->func->uf_scoped;
+ while (current_funccal) {
+ hashtab_T *ht = find_var_ht(name, namelen, &varname);
+ if (ht != NULL && *varname != NUL) {
+ v = find_var_in_ht(ht, *name, varname,
+ namelen - (size_t)(varname - name), no_autoload);
+ if (v != NULL) {
+ break;
+ }
+ }
+ if (current_funccal == current_funccal->func->uf_scoped) {
+ break;
+ }
+ current_funccal = current_funccal->func->uf_scoped;
+ }
+ current_funccal = old_current_funccal;
+
+ return v;
+}
+
/// Iterate over global variables
///
/// @warning No modifications to global variable dictionary must be performed
@@ -21454,7 +22179,7 @@ const void *var_shada_iter(const void *const iter, const char **const name,
hi = globvarht.ht_array;
while ((size_t) (hi - hifirst) < hinum
&& (HASHITEM_EMPTY(hi)
- || var_flavour(HI2DI(hi)->di_key) != VAR_FLAVOUR_SHADA)) {
+ || var_flavour(hi->hi_key) != VAR_FLAVOUR_SHADA)) {
hi++;
}
if ((size_t) (hi - hifirst) == hinum) {
@@ -21463,11 +22188,10 @@ const void *var_shada_iter(const void *const iter, const char **const name,
} else {
hi = (const hashitem_T *) iter;
}
- *name = (char *) HI2DI(hi)->di_key;
- copy_tv(&(HI2DI(hi)->di_tv), rettv);
- while ((size_t) (++hi - hifirst) < hinum) {
- if (!HASHITEM_EMPTY(hi)
- && var_flavour(HI2DI(hi)->di_key) == VAR_FLAVOUR_SHADA) {
+ *name = (char *)TV_DICT_HI2DI(hi)->di_key;
+ tv_copy(&TV_DICT_HI2DI(hi)->di_tv, rettv);
+ while ((size_t)(++hi - hifirst) < hinum) {
+ if (!HASHITEM_EMPTY(hi) && var_flavour(hi->hi_key) == VAR_FLAVOUR_SHADA) {
return hi;
}
}
@@ -21478,62 +22202,55 @@ void var_set_global(const char *const name, typval_T vartv)
{
funccall_T *const saved_current_funccal = current_funccal;
current_funccal = NULL;
- set_var((char_u *) name, &vartv, false);
+ set_var(name, strlen(name), &vartv, false);
current_funccal = saved_current_funccal;
}
int store_session_globals(FILE *fd)
{
- hashitem_T *hi;
- dictitem_T *this_var;
- int todo;
- char_u *p, *t;
-
- todo = (int)globvarht.ht_used;
- for (hi = globvarht.ht_array; todo > 0; ++hi) {
- if (!HASHITEM_EMPTY(hi)) {
- --todo;
- this_var = HI2DI(hi);
- if ((this_var->di_tv.v_type == VAR_NUMBER
- || this_var->di_tv.v_type == VAR_STRING)
- && var_flavour(this_var->di_key) == VAR_FLAVOUR_SESSION) {
- /* Escape special characters with a backslash. Turn a LF and
- * CR into \n and \r. */
- p = vim_strsave_escaped(get_tv_string(&this_var->di_tv),
- (char_u *)"\\\"\n\r");
- for (t = p; *t != NUL; ++t)
- if (*t == '\n')
- *t = 'n';
- else if (*t == '\r')
- *t = 'r';
- if ((fprintf(fd, "let %s = %c%s%c",
- this_var->di_key,
- (this_var->di_tv.v_type == VAR_STRING) ? '"'
- : ' ',
- p,
- (this_var->di_tv.v_type == VAR_STRING) ? '"'
- : ' ') < 0)
- || put_eol(fd) == FAIL) {
- xfree(p);
- return FAIL;
+ TV_DICT_ITER(&globvardict, this_var, {
+ if ((this_var->di_tv.v_type == VAR_NUMBER
+ || this_var->di_tv.v_type == VAR_STRING)
+ && var_flavour(this_var->di_key) == VAR_FLAVOUR_SESSION) {
+ // Escape special characters with a backslash. Turn a LF and
+ // CR into \n and \r.
+ char_u *const p = vim_strsave_escaped(
+ (const char_u *)tv_get_string(&this_var->di_tv),
+ (const char_u *)"\\\"\n\r");
+ for (char_u *t = p; *t != NUL; t++) {
+ if (*t == '\n') {
+ *t = 'n';
+ } else if (*t == '\r') {
+ *t = 'r';
}
+ }
+ if ((fprintf(fd, "let %s = %c%s%c",
+ this_var->di_key,
+ ((this_var->di_tv.v_type == VAR_STRING) ? '"'
+ : ' '),
+ p,
+ ((this_var->di_tv.v_type == VAR_STRING) ? '"'
+ : ' ')) < 0)
+ || put_eol(fd) == FAIL) {
xfree(p);
- } else if (this_var->di_tv.v_type == VAR_FLOAT
- && var_flavour(this_var->di_key) == VAR_FLAVOUR_SESSION) {
- float_T f = this_var->di_tv.vval.v_float;
- int sign = ' ';
-
- if (f < 0) {
- f = -f;
- sign = '-';
- }
- if ((fprintf(fd, "let %s = %c%f",
- this_var->di_key, sign, f) < 0)
- || put_eol(fd) == FAIL)
- return FAIL;
+ return FAIL;
+ }
+ xfree(p);
+ } else if (this_var->di_tv.v_type == VAR_FLOAT
+ && var_flavour(this_var->di_key) == VAR_FLAVOUR_SESSION) {
+ float_T f = this_var->di_tv.vval.v_float;
+ int sign = ' ';
+
+ if (f < 0) {
+ f = -f;
+ sign = '-';
+ }
+ if ((fprintf(fd, "let %s = %c%f", this_var->di_key, sign, f) < 0)
+ || put_eol(fd) == FAIL) {
+ return FAIL;
}
}
- }
+ });
return OK;
}
@@ -21543,58 +22260,28 @@ int store_session_globals(FILE *fd)
*/
void last_set_msg(scid_T scriptID)
{
- if (scriptID != 0) {
- char_u *p = home_replace_save(NULL, get_scriptname(scriptID));
- verbose_enter();
- MSG_PUTS(_("\n\tLast set from "));
- MSG_PUTS(p);
- xfree(p);
- verbose_leave();
- }
+ const LastSet last_set = (LastSet){
+ .script_id = scriptID,
+ .channel_id = 0,
+ };
+ option_last_set_msg(last_set);
}
-/*
- * List v:oldfiles in a nice way.
- */
-void ex_oldfiles(exarg_T *eap)
+/// Displays where an option was last set.
+///
+/// Should only be invoked when 'verbose' is non-zero.
+void option_last_set_msg(LastSet last_set)
{
- list_T *l = get_vim_var_list(VV_OLDFILES);
- listitem_T *li;
- long nr = 0;
-
- if (l == NULL)
- msg((char_u *)_("No old files"));
- else {
- msg_start();
- msg_scroll = TRUE;
- for (li = l->lv_first; li != NULL && !got_int; li = li->li_next) {
- msg_outnum(++nr);
- MSG_PUTS(": ");
- msg_outtrans(get_tv_string(&li->li_tv));
- msg_putchar('\n');
- ui_flush(); /* output one line at a time */
- os_breakcheck();
- }
- /* Assume "got_int" was set to truncate the listing. */
- got_int = FALSE;
-
- // File selection prompt on ":oldfiles!"
- if (eap->forceit) {
- quit_more = false;
- nr = prompt_for_number(false);
- msg_starthere();
- if (nr > 0 && nr <= l->lv_len) {
- char_u *p = list_find_str(l, nr);
- if (p == NULL) {
- return;
- }
- p = expand_env_save(p);
- eap->arg = p;
- eap->cmdidx = CMD_edit;
- do_exedit(eap, NULL);
- xfree(p);
- }
+ if (last_set.script_id != 0) {
+ bool should_free;
+ char_u *p = get_scriptname(last_set, &should_free);
+ verbose_enter();
+ MSG_PUTS(_("\n\tLast set from "));
+ MSG_PUTS(p);
+ if (should_free) {
+ xfree(p);
}
+ verbose_leave();
}
}
@@ -21613,13 +22300,13 @@ void reset_v_option_vars(void)
* Returns VALID_ flags or -1 for failure.
* When there is an error, *fnamep is set to NULL.
*/
-int
-modify_fname (
- char_u *src, /* string with modifiers */
- size_t *usedlen, /* characters after src that are used */
- char_u **fnamep, /* file name so far */
- char_u **bufp, /* buffer for allocated file name or NULL */
- size_t *fnamelen /* length of fnamep */
+int
+modify_fname(
+ char_u *src, // string with modifiers
+ size_t *usedlen, // characters after src that are used
+ char_u **fnamep, // file name so far
+ char_u **bufp, // buffer for allocated file name or NULL
+ size_t *fnamelen // length of fnamep
)
{
int valid = 0;
@@ -21655,15 +22342,16 @@ repeat:
return -1;
}
- /* When "/." or "/.." is used: force expansion to get rid of it. */
- for (p = *fnamep; *p != NUL; mb_ptr_adv(p)) {
+ // When "/." or "/.." is used: force expansion to get rid of it.
+ for (p = *fnamep; *p != NUL; MB_PTR_ADV(p)) {
if (vim_ispathsep(*p)
&& p[1] == '.'
&& (p[2] == NUL
|| vim_ispathsep(p[2])
|| (p[2] == '.'
- && (p[3] == NUL || vim_ispathsep(p[3])))))
+ && (p[3] == NUL || vim_ispathsep(p[3]))))) {
break;
+ }
}
/* FullName_save() is slow, don't use it when not needed. */
@@ -21743,8 +22431,9 @@ repeat:
valid |= VALID_HEAD;
*usedlen += 2;
s = get_past_head(*fnamep);
- while (tail > s && after_pathsep((char *)s, (char *)tail))
- mb_ptr_back(*fnamep, tail);
+ while (tail > s && after_pathsep((char *)s, (char *)tail)) {
+ MB_PTR_BACK(*fnamep, tail);
+ }
*fnamelen = (size_t)(tail - *fnamep);
if (*fnamelen == 0) {
/* Result is empty. Turn it into "." to make ":cd %:h" work. */
@@ -21752,8 +22441,9 @@ repeat:
*bufp = *fnamep = tail = vim_strsave((char_u *)".");
*fnamelen = 1;
} else {
- while (tail > s && !after_pathsep((char *)s, (char *)tail))
- mb_ptr_back(*fnamep, tail);
+ while (tail > s && !after_pathsep((char *)s, (char *)tail)) {
+ MB_PTR_BACK(*fnamep, tail);
+ }
}
}
@@ -21830,7 +22520,7 @@ repeat:
sub = vim_strnsave(s, (int)(p - s));
str = vim_strnsave(*fnamep, *fnamelen);
*usedlen = (size_t)(p + 1 - src);
- s = do_string_sub(str, pat, sub, flags);
+ s = do_string_sub(str, pat, sub, NULL, flags);
*fnamep = s;
*fnamelen = STRLEN(s);
xfree(*bufp);
@@ -21866,12 +22556,12 @@ repeat:
return valid;
}
-/*
- * Perform a substitution on "str" with pattern "pat" and substitute "sub".
- * "flags" can be "g" to do a global substitute.
- * Returns an allocated string, NULL for error.
- */
-char_u *do_string_sub(char_u *str, char_u *pat, char_u *sub, char_u *flags)
+/// Perform a substitution on "str" with pattern "pat" and substitute "sub".
+/// When "sub" is NULL "expr" is used, must be a VAR_FUNC or VAR_PARTIAL.
+/// "flags" can be "g" to do a global substitute.
+/// Returns an allocated string, NULL for error.
+char_u *do_string_sub(char_u *str, char_u *pat, char_u *sub,
+ typval_T *expr, char_u *flags)
{
int sublen;
regmatch_T regmatch;
@@ -21909,23 +22599,21 @@ char_u *do_string_sub(char_u *str, char_u *pat, char_u *sub, char_u *flags)
zero_width = regmatch.startp[0];
}
- /*
- * Get some space for a temporary buffer to do the substitution
- * into. It will contain:
- * - The text up to where the match is.
- * - The substituted text.
- * - The text after the match.
- */
- sublen = vim_regsub(&regmatch, sub, tail, FALSE, TRUE, FALSE);
+ // Get some space for a temporary buffer to do the substitution
+ // into. It will contain:
+ // - The text up to where the match is.
+ // - The substituted text.
+ // - The text after the match.
+ sublen = vim_regsub(&regmatch, sub, expr, tail, false, true, false);
ga_grow(&ga, (int)((end - tail) + sublen -
(regmatch.endp[0] - regmatch.startp[0])));
/* copy the text up to where the match is */
int i = (int)(regmatch.startp[0] - tail);
memmove((char_u *)ga.ga_data + ga.ga_len, tail, (size_t)i);
- /* add the substituted text */
- (void)vim_regsub(&regmatch, sub, (char_u *)ga.ga_data
- + ga.ga_len + i, TRUE, TRUE, FALSE);
+ // add the substituted text
+ (void)vim_regsub(&regmatch, sub, expr, (char_u *)ga.ga_data
+ + ga.ga_len + i, true, true, false);
ga.ga_len += i + sublen - 1;
tail = regmatch.endp[0];
if (*tail == NUL)
@@ -21942,329 +22630,64 @@ char_u *do_string_sub(char_u *str, char_u *pat, char_u *sub, char_u *flags)
char_u *ret = vim_strsave(ga.ga_data == NULL ? str : (char_u *)ga.ga_data);
ga_clear(&ga);
- if (p_cpo == empty_option)
+ if (p_cpo == empty_option) {
p_cpo = save_cpo;
- else
- /* Darn, evaluating {sub} expression changed the value. */
+ } else {
+ // Darn, evaluating {sub} expression or {expr} changed the value.
free_string_option(save_cpo);
+ }
return ret;
}
-static inline TerminalJobData *common_job_init(char **argv,
- ufunc_T *on_stdout,
- ufunc_T *on_stderr,
- ufunc_T *on_exit,
- dict_T *self,
- bool pty,
- bool detach,
- char *cwd)
-{
- TerminalJobData *data = xcalloc(1, sizeof(TerminalJobData));
- data->stopped = false;
- data->on_stdout = on_stdout;
- data->on_stderr = on_stderr;
- data->on_exit = on_exit;
- data->self = self;
- data->events = queue_new_child(main_loop.events);
- if (pty) {
- data->proc.pty = pty_process_init(&main_loop, data);
- } else {
- data->proc.uv = libuv_process_init(&main_loop, data);
- }
- Process *proc = (Process *)&data->proc;
- proc->argv = argv;
- proc->in = &data->in;
- proc->out = &data->out;
- if (!pty) {
- proc->err = &data->err;
- }
- proc->cb = on_process_exit;
- proc->events = data->events;
- proc->detach = detach;
- proc->cwd = cwd;
- return data;
-}
-
-/// Return true/false on success/failure.
-static inline bool common_job_callbacks(dict_T *vopts, ufunc_T **on_stdout,
- ufunc_T **on_stderr, ufunc_T **on_exit)
-{
- if (get_dict_callback(vopts, "on_stdout", on_stdout)
- && get_dict_callback(vopts, "on_stderr", on_stderr)
- && get_dict_callback(vopts, "on_exit", on_exit)) {
+/// common code for getting job callbacks for jobstart, termopen and rpcstart
+///
+/// @return true/false on success/failure.
+static inline bool common_job_callbacks(dict_T *vopts,
+ CallbackReader *on_stdout,
+ CallbackReader *on_stderr,
+ Callback *on_exit)
+{
+ if (tv_dict_get_callback(vopts, S_LEN("on_stdout"), &on_stdout->cb)
+ &&tv_dict_get_callback(vopts, S_LEN("on_stderr"), &on_stderr->cb)
+ && tv_dict_get_callback(vopts, S_LEN("on_exit"), on_exit)) {
+ on_stdout->buffered = tv_dict_get_number(vopts, "stdout_buffered");
+ on_stderr->buffered = tv_dict_get_number(vopts, "stderr_buffered");
+ if (on_stdout->buffered && on_stdout->cb.type == kCallbackNone) {
+ on_stdout->self = vopts;
+ }
+ if (on_stderr->buffered && on_stderr->cb.type == kCallbackNone) {
+ on_stderr->self = vopts;
+ }
vopts->dv_refcount++;
return true;
}
- if (*on_stdout) {
- user_func_unref(*on_stdout);
- }
- if (*on_stderr) {
- user_func_unref(*on_stderr);
- }
- if (*on_exit) {
- user_func_unref(*on_exit);
- }
- return false;
-}
-
-static inline bool common_job_start(TerminalJobData *data, typval_T *rettv)
-{
- Process *proc = (Process *)&data->proc;
- if (proc->type == kProcessTypePty && proc->detach) {
- EMSG2(_(e_invarg2), "terminal/pty job cannot be detached");
- return false;
- }
- data->refcount++;
- char *cmd = xstrdup(proc->argv[0]);
- if (!process_spawn(proc)) {
- EMSG2(_(e_jobspawn), cmd);
- xfree(cmd);
- if (proc->type == kProcessTypePty) {
- xfree(data->proc.pty.term_name);
- }
- rettv->vval.v_number = proc->status;
- term_job_data_decref(data);
- return false;
- }
- xfree(cmd);
-
- data->id = current_job_id++;
- wstream_init(proc->in, 0);
- if (proc->out) {
- rstream_init(proc->out, 0);
- rstream_start(proc->out, on_job_stdout);
- }
- if (proc->err) {
- rstream_init(proc->err, 0);
- rstream_start(proc->err, on_job_stderr);
- }
- pmap_put(uint64_t)(jobs, data->id, data);
- rettv->vval.v_number = data->id;
- return true;
-}
-
-static inline void free_term_job_data_event(void **argv)
-{
- TerminalJobData *data = argv[0];
- if (data->on_stdout) {
- user_func_unref(data->on_stdout);
- }
- if (data->on_stderr) {
- user_func_unref(data->on_stderr);
- }
- if (data->on_exit) {
- user_func_unref(data->on_exit);
- }
-
- if (data->self) {
- dict_unref(data->self);
- }
- queue_free(data->events);
- xfree(data);
+ callback_reader_free(on_stdout);
+ callback_reader_free(on_stderr);
+ callback_free(on_exit);
+ return false;
}
-static inline void free_term_job_data(TerminalJobData *data)
-{
- // data->queue may still be used after this function returns(process_wait), so
- // only free in the next event loop iteration
- queue_put(main_loop.fast_events, free_term_job_data_event, 1, data);
-}
-// vimscript job callbacks must be executed on Nvim main loop
-static inline void process_job_event(TerminalJobData *data, ufunc_T *callback,
- const char *type, char *buf, size_t count, int status)
+static Channel *find_job(uint64_t id, bool show_error)
{
- JobEvent event_data;
- event_data.received = NULL;
- if (buf) {
- event_data.received = list_alloc();
- char *ptr = buf;
- size_t remaining = count;
- size_t off = 0;
-
- while (off < remaining) {
- // append the line
- if (ptr[off] == NL) {
- list_append_string(event_data.received, (uint8_t *)ptr, off);
- size_t skip = off + 1;
- ptr += skip;
- remaining -= skip;
- off = 0;
- continue;
- }
- if (ptr[off] == NUL) {
- // Translate NUL to NL
- ptr[off] = NL;
+ Channel *data = find_channel(id);
+ if (!data || data->streamtype != kChannelStreamProc
+ || process_is_stopped(&data->stream.proc)) {
+ if (show_error) {
+ if (data && data->streamtype != kChannelStreamProc) {
+ EMSG(_(e_invchanjob));
+ } else {
+ EMSG(_(e_invchan));
}
- off++;
- }
- list_append_string(event_data.received, (uint8_t *)ptr, off);
- } else {
- event_data.status = status;
- }
- event_data.data = data;
- event_data.callback = callback;
- event_data.type = type;
- on_job_event(&event_data);
-}
-
-static void on_job_stdout(Stream *stream, RBuffer *buf, size_t count,
- void *job, bool eof)
-{
- TerminalJobData *data = job;
- on_job_output(stream, job, buf, count, eof, data->on_stdout, "stdout");
-}
-
-static void on_job_stderr(Stream *stream, RBuffer *buf, size_t count,
- void *job, bool eof)
-{
- TerminalJobData *data = job;
- on_job_output(stream, job, buf, count, eof, data->on_stderr, "stderr");
-}
-
-static void on_job_output(Stream *stream, TerminalJobData *data, RBuffer *buf,
- size_t count, bool eof, ufunc_T *callback, const char *type)
-{
- if (eof) {
- return;
- }
-
- // stub variable, to keep reading consistent with the order of events, only
- // consider the count parameter.
- size_t r;
- char *ptr = rbuffer_read_ptr(buf, &r);
-
- // The order here matters, the terminal must receive the data first because
- // process_job_event will modify the read buffer(convert NULs into NLs)
- if (data->term) {
- terminal_receive(data->term, ptr, count);
- }
-
- if (callback) {
- process_job_event(data, callback, type, ptr, count, 0);
- }
-
- rbuffer_consumed(buf, count);
-}
-
-static void on_process_exit(Process *proc, int status, void *d)
-{
- TerminalJobData *data = d;
- if (data->term && !data->exited) {
- data->exited = true;
- char msg[sizeof("\r\n[Process exited ]") + NUMBUFLEN];
- snprintf(msg, sizeof msg, "\r\n[Process exited %d]", proc->status);
- terminal_close(data->term, msg);
- }
-
- if (data->status_ptr) {
- *data->status_ptr = status;
- }
-
- process_job_event(data, data->on_exit, "exit", NULL, 0, status);
-}
-
-static void term_write(char *buf, size_t size, void *d)
-{
- TerminalJobData *data = d;
- WBuffer *wbuf = wstream_new_buffer(xmemdup(buf, size), size, 1, xfree);
- wstream_write(&data->in, wbuf);
-}
-
-static void term_resize(uint16_t width, uint16_t height, void *d)
-{
- TerminalJobData *data = d;
- pty_process_resize(&data->proc.pty, width, height);
-}
-
-static inline void term_delayed_free(void **argv)
-{
- TerminalJobData *j = argv[0];
- if (j->in.pending_reqs || j->out.pending_reqs || j->err.pending_reqs) {
- queue_put(j->events, term_delayed_free, 1, j);
- return;
- }
-
- terminal_destroy(j->term);
- term_job_data_decref(j);
-}
-
-static void term_close(void *d)
-{
- TerminalJobData *data = d;
- if (!data->exited) {
- data->exited = true;
- process_stop((Process *)&data->proc);
- }
- queue_put(data->events, term_delayed_free, 1, data);
-}
-
-static void term_job_data_decref(TerminalJobData *data)
-{
- if (!(--data->refcount)) {
- free_term_job_data(data);
- }
-}
-
-static void on_job_event(JobEvent *ev)
-{
- if (!ev->callback) {
- goto end;
- }
-
- typval_T argv[3];
- int argc = ev->callback->uf_args.ga_len;
-
- if (argc > 0) {
- argv[0].v_type = VAR_NUMBER;
- argv[0].v_lock = 0;
- argv[0].vval.v_number = ev->data->id;
- }
-
- if (argc > 1) {
- if (ev->received) {
- argv[1].v_type = VAR_LIST;
- argv[1].v_lock = 0;
- argv[1].vval.v_list = ev->received;
- argv[1].vval.v_list->lv_refcount++;
- } else {
- argv[1].v_type = VAR_NUMBER;
- argv[1].v_lock = 0;
- argv[1].vval.v_number = ev->status;
}
- }
-
- if (argc > 2) {
- argv[2].v_type = VAR_STRING;
- argv[2].v_lock = 0;
- argv[2].vval.v_string = (uint8_t *)ev->type;
- }
-
- typval_T rettv;
- init_tv(&rettv);
- call_user_func(ev->callback, argc, argv, &rettv, curwin->w_cursor.lnum,
- curwin->w_cursor.lnum, ev->data->self);
- clear_tv(&rettv);
-
-end:
- if (!ev->received) {
- // exit event, safe to free job data now
- pmap_del(uint64_t)(jobs, ev->data->id);
- term_job_data_decref(ev->data);
- }
-}
-
-static TerminalJobData *find_job(uint64_t id)
-{
- TerminalJobData *data = pmap_get(uint64_t)(jobs, id);
- if (!data || data->stopped) {
return NULL;
}
return data;
}
+
static void script_host_eval(char *name, typval_T *argvars, typval_T *rettv)
{
if (check_restricted() || check_secure()) {
@@ -22276,13 +22699,23 @@ static void script_host_eval(char *name, typval_T *argvars, typval_T *rettv)
return;
}
- list_T *args = list_alloc();
- list_append_string(args, argvars[0].vval.v_string, -1);
+ list_T *args = tv_list_alloc(1);
+ tv_list_append_string(args, (const char *)argvars[0].vval.v_string, -1);
*rettv = eval_call_provider(name, "eval", args);
}
typval_T eval_call_provider(char *provider, char *method, list_T *arguments)
{
+ if (!eval_has_provider(provider)) {
+ emsgf("E319: No \"%s\" provider found. Run \":checkhealth provider\"",
+ provider);
+ return (typval_T){
+ .v_type = VAR_NUMBER,
+ .v_lock = VAR_UNLOCKED,
+ .vval.v_number = (varnumber_T)0
+ };
+ }
+
char func[256];
int name_len = snprintf(func, sizeof(func), "provider#%s#Call", provider);
@@ -22294,7 +22727,6 @@ typval_T eval_call_provider(char *provider, char *method, list_T *arguments)
.sourcing_lnum = sourcing_lnum,
.autocmd_fname = autocmd_fname,
.autocmd_match = autocmd_match,
- .autocmd_fname_full = autocmd_fname_full,
.autocmd_bufnr = autocmd_bufnr,
.funccalp = save_funccal()
};
@@ -22305,142 +22737,117 @@ typval_T eval_call_provider(char *provider, char *method, list_T *arguments)
{.v_type = VAR_LIST, .vval.v_list = arguments, .v_lock = 0},
{.v_type = VAR_UNKNOWN}
};
- typval_T rettv = {.v_type = VAR_UNKNOWN, .v_lock = 0};
- arguments->lv_refcount++;
+ typval_T rettv = { .v_type = VAR_UNKNOWN, .v_lock = VAR_UNLOCKED };
+ tv_list_ref(arguments);
int dummy;
- (void)call_func((uint8_t *)func,
+ (void)call_func((const char_u *)func,
name_len,
&rettv,
2,
argvars,
+ NULL,
curwin->w_cursor.lnum,
curwin->w_cursor.lnum,
&dummy,
true,
+ NULL,
NULL);
- list_unref(arguments);
+ tv_list_unref(arguments);
// Restore caller scope information
restore_funccal(provider_caller_scope.funccalp);
provider_caller_scope = saved_provider_caller_scope;
provider_call_nesting--;
-
+ assert(provider_call_nesting >= 0);
+
return rettv;
}
-bool eval_has_provider(char *name)
+bool eval_has_provider(const char *name)
{
-#define check_provider(name) \
+#define CHECK_PROVIDER(name) \
if (has_##name == -1) { \
- has_##name = !!find_func((uint8_t *)"provider#" #name "#Call"); \
+ has_##name = !!find_func((char_u *)"provider#" #name "#Call"); \
if (!has_##name) { \
- script_autoload((uint8_t *)"provider#" #name "#Call", false); \
- has_##name = !!find_func((uint8_t *)"provider#" #name "#Call"); \
+ script_autoload("provider#" #name "#Call", \
+ sizeof("provider#" #name "#Call") - 1, \
+ false); \
+ has_##name = !!find_func((char_u *)"provider#" #name "#Call"); \
} \
}
- static int has_clipboard = -1, has_python = -1, has_python3 = -1;
+ static int has_clipboard = -1;
+ static int has_python = -1;
+ static int has_python3 = -1;
+ static int has_ruby = -1;
- if (!strcmp(name, "clipboard")) {
- check_provider(clipboard);
+ if (strequal(name, "clipboard")) {
+ CHECK_PROVIDER(clipboard);
return has_clipboard;
- } else if (!strcmp(name, "python3")) {
- check_provider(python3);
+ } else if (strequal(name, "python3")) {
+ CHECK_PROVIDER(python3);
return has_python3;
- } else if (!strcmp(name, "python")) {
- check_provider(python);
+ } else if (strequal(name, "python")) {
+ CHECK_PROVIDER(python);
return has_python;
+ } else if (strequal(name, "ruby")) {
+ bool need_check_ruby = (has_ruby == -1);
+ CHECK_PROVIDER(ruby);
+ if (need_check_ruby && has_ruby == 1) {
+ char *rubyhost = call_func_retstr("provider#ruby#Detect", 0, NULL, true);
+ if (rubyhost) {
+ if (*rubyhost == NUL) {
+ // Invalid rubyhost executable. Gem is probably not installed.
+ has_ruby = 0;
+ }
+ xfree(rubyhost);
+ }
+ }
+ return has_ruby;
}
return false;
}
-// Compute the `DictWatcher` address from a QUEUE node. This only exists for
-// .asan-blacklist (ASAN doesn't handle QUEUE_DATA pointer arithmetic).
-static DictWatcher *dictwatcher_node_data(QUEUE *q)
- FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_RET
+/// Writes "<sourcing_name>:<sourcing_lnum>" to `buf[bufsize]`.
+void eval_fmt_source_name_line(char *buf, size_t bufsize)
{
- return QUEUE_DATA(q, DictWatcher, node);
+ if (sourcing_name) {
+ snprintf(buf, bufsize, "%s:%" PRIdLINENR, sourcing_name, sourcing_lnum);
+ } else {
+ snprintf(buf, bufsize, "?");
+ }
}
-// Send a change notification to all `dict` watchers that match `key`.
-static void dictwatcher_notify(dict_T *dict, const char *key, typval_T *newtv,
- typval_T *oldtv)
- FUNC_ATTR_NONNULL_ARG(1) FUNC_ATTR_NONNULL_ARG(2)
+/// ":checkhealth [plugins]"
+void ex_checkhealth(exarg_T *eap)
{
- typval_T argv[3];
- for (size_t i = 0; i < ARRAY_SIZE(argv); i++) {
- init_tv(argv + i);
- }
-
- argv[0].v_type = VAR_DICT;
- argv[0].vval.v_dict = dict;
- argv[1].v_type = VAR_STRING;
- argv[1].vval.v_string = (char_u *)xstrdup(key);
- argv[2].v_type = VAR_DICT;
- argv[2].vval.v_dict = dict_alloc();
- argv[2].vval.v_dict->dv_refcount++;
-
- if (newtv) {
- dictitem_T *v = dictitem_alloc((char_u *)"new");
- copy_tv(newtv, &v->di_tv);
- dict_add(argv[2].vval.v_dict, v);
+ bool found = !!find_func((char_u *)"health#check");
+ if (!found
+ && script_autoload("health#check", sizeof("health#check") - 1, false)) {
+ found = !!find_func((char_u *)"health#check");
}
-
- if (oldtv) {
- dictitem_T *v = dictitem_alloc((char_u *)"old");
- copy_tv(oldtv, &v->di_tv);
- dict_add(argv[2].vval.v_dict, v);
- }
-
- typval_T rettv;
-
- QUEUE *w;
- QUEUE_FOREACH(w, &dict->watchers) {
- DictWatcher *watcher = dictwatcher_node_data(w);
- if (!watcher->busy && dictwatcher_matches(watcher, key)) {
- init_tv(&rettv);
- watcher->busy = true;
- call_user_func(watcher->callback, ARRAY_SIZE(argv), argv, &rettv,
- curwin->w_cursor.lnum, curwin->w_cursor.lnum, NULL);
- watcher->busy = false;
- clear_tv(&rettv);
+ if (!found) {
+ const char *vimruntime_env = os_getenv("VIMRUNTIME");
+ if (vimruntime_env == NULL) {
+ EMSG(_("E5009: $VIMRUNTIME is empty or unset"));
+ } else {
+ bool rtp_ok = NULL != strstr((char *)p_rtp, vimruntime_env);
+ if (rtp_ok) {
+ EMSG2(_("E5009: Invalid $VIMRUNTIME: %s"), vimruntime_env);
+ } else {
+ EMSG(_("E5009: Invalid 'runtimepath'"));
+ }
}
+ return;
}
- for (size_t i = 1; i < ARRAY_SIZE(argv); i++) {
- clear_tv(argv + i);
- }
-}
-
-// Test if `key` matches with with `watcher->key_pattern`
-static bool dictwatcher_matches(DictWatcher *watcher, const char *key)
- FUNC_ATTR_NONNULL_ALL
-{
- // For now only allow very simple globbing in key patterns: a '*' at the end
- // of the string means it should match everything up to the '*' instead of the
- // whole string.
- char *nul = strchr(watcher->key_pattern, NUL);
- size_t len = nul - watcher->key_pattern;
- if (*(nul - 1) == '*') {
- return !strncmp(key, watcher->key_pattern, len - 1);
- } else {
- return !strcmp(key, watcher->key_pattern);
- }
-}
+ size_t bufsize = STRLEN(eap->arg) + sizeof("call health#check('')");
+ char *buf = xmalloc(bufsize);
+ snprintf(buf, bufsize, "call health#check('%s')", eap->arg);
-// Perform all necessary cleanup for a `DictWatcher` instance.
-static void dictwatcher_free(DictWatcher *watcher)
- FUNC_ATTR_NONNULL_ALL
-{
- user_func_unref(watcher->callback);
- xfree(watcher->key_pattern);
- xfree(watcher);
-}
+ do_cmdline_cmd(buf);
-// Check if `d` has at least one watcher.
-static bool is_watched(dict_T *d)
-{
- return d && !QUEUE_EMPTY(&d->watchers);
+ xfree(buf);
}
diff --git a/src/nvim/eval.h b/src/nvim/eval.h
index d6800afd52..149dae688e 100644
--- a/src/nvim/eval.h
+++ b/src/nvim/eval.h
@@ -1,11 +1,16 @@
#ifndef NVIM_EVAL_H
#define NVIM_EVAL_H
-#include "nvim/profile.h"
#include "nvim/hashtab.h" // For hashtab_T
-#include "nvim/garray.h" // For garray_T
-#include "nvim/buffer_defs.h" // For scid_T
+#include "nvim/buffer_defs.h"
#include "nvim/ex_cmds_defs.h" // For exarg_T
+#include "nvim/eval/typval.h"
+#include "nvim/profile.h"
+#include "nvim/garray.h"
+#include "nvim/event/rstream.h"
+#include "nvim/event/wstream.h"
+#include "nvim/channel.h"
+#include "nvim/os/stdpaths_defs.h"
#define COPYID_INC 2
#define COPYID_MASK (~0x1)
@@ -13,42 +18,10 @@
// All user-defined functions are found in this hashtable.
extern hashtab_T func_hashtab;
-// Structure to hold info for a user function.
-typedef struct ufunc ufunc_T;
-
-struct ufunc {
- int uf_varargs; ///< variable nr of arguments
- int uf_flags;
- int uf_calls; ///< nr of active calls
- garray_T uf_args; ///< arguments
- garray_T uf_lines; ///< function lines
- int uf_profiling; ///< true when func is being profiled
- // Profiling the function as a whole.
- int uf_tm_count; ///< nr of calls
- proftime_T uf_tm_total; ///< time spent in function + children
- proftime_T uf_tm_self; ///< time spent in function itself
- proftime_T uf_tm_children; ///< time spent in children this call
- // Profiling the function per line.
- int *uf_tml_count; ///< nr of times line was executed
- proftime_T *uf_tml_total; ///< time spent in a line + children
- proftime_T *uf_tml_self; ///< time spent in a line itself
- proftime_T uf_tml_start; ///< start time for current line
- proftime_T uf_tml_children; ///< time spent in children for this line
- proftime_T uf_tml_wait; ///< start wait time for current line
- int uf_tml_idx; ///< index of line being timed; -1 if none
- int uf_tml_execed; ///< line being timed was executed
- scid_T uf_script_ID; ///< ID of script where function was defined,
- // used for s: variables
- int uf_refcount; ///< for numbered function: reference count
- char_u uf_name[1]; ///< name of function (actually longer); can
- // start with <SNR>123_ (<SNR> is K_SPECIAL
- // KS_EXTRA KE_SNR)
-};
-
// From user function to hashitem and back.
EXTERN ufunc_T dumuf;
#define UF2HIKEY(fp) ((fp)->uf_name)
-#define HIKEY2UF(p) ((ufunc_T *)(p - (dumuf.uf_name - (char_u *)&dumuf)))
+#define HIKEY2UF(p) ((ufunc_T *)(p - offsetof(ufunc_T, uf_name)))
#define HI2UF(hi) HIKEY2UF((hi)->hi_key)
/// Defines for Vim variables
@@ -84,6 +57,7 @@ typedef enum {
VV_DYING,
VV_EXCEPTION,
VV_THROWPOINT,
+ VV_STDERR,
VV_REG,
VV_CMDBANG,
VV_INSERTMODE,
@@ -94,6 +68,7 @@ typedef enum {
VV_FCS_CHOICE,
VV_BEVAL_BUFNR,
VV_BEVAL_WINNR,
+ VV_BEVAL_WINID,
VV_BEVAL_LNUM,
VV_BEVAL_COL,
VV_BEVAL_TEXT,
@@ -103,6 +78,7 @@ typedef enum {
VV_SWAPCOMMAND,
VV_CHAR,
VV_MOUSE_WIN,
+ VV_MOUSE_WINID,
VV_MOUSE_LNUM,
VV_MOUSE_COL,
VV_OP,
@@ -111,7 +87,6 @@ typedef enum {
VV_OLDFILES,
VV_WINDOWID,
VV_PROGPATH,
- VV_COMMAND_OUTPUT,
VV_COMPLETED_ITEM,
VV_OPTION_NEW,
VV_OPTION_OLD,
@@ -124,6 +99,16 @@ typedef enum {
VV_NULL,
VV__NULL_LIST, // List with NULL value. For test purposes only.
VV__NULL_DICT, // Dictionary with NULL value. For test purposes only.
+ VV_VIM_DID_ENTER,
+ VV_TESTING,
+ VV_TYPE_NUMBER,
+ VV_TYPE_STRING,
+ VV_TYPE_FUNC,
+ VV_TYPE_LIST,
+ VV_TYPE_DICT,
+ VV_TYPE_FLOAT,
+ VV_TYPE_BOOL,
+ VV_EXITING,
} VimVarIndex;
/// All recognized msgpack types
@@ -145,8 +130,8 @@ extern const list_T *eval_msgpack_type_lists[LAST_MSGPACK_TYPE + 1];
#undef LAST_MSGPACK_TYPE
-/// Maximum number of function arguments
-#define MAX_FUNC_ARGS 20
+typedef int (*ArgvFunc)(int current_argcount, typval_T *argv,
+ int called_func_argcount);
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "eval.h.generated.h"
diff --git a/src/nvim/eval.lua b/src/nvim/eval.lua
new file mode 100644
index 0000000000..78cac4878d
--- /dev/null
+++ b/src/nvim/eval.lua
@@ -0,0 +1,356 @@
+-- File containing table with all functions.
+--
+-- Keys:
+--
+-- args Number of arguments, list with maximum and minimum number of arguments
+-- or list with a minimum number of arguments only. Defaults to zero
+-- arguments.
+-- func Name of the C function which implements the VimL function. Defaults to
+-- `f_{funcname}`.
+
+local varargs = function(nr)
+ return {nr}
+end
+
+return {
+ funcs={
+ abs={args=1},
+ acos={args=1, func="float_op_wrapper", data="&acos"}, -- WJMc
+ add={args=2},
+ ['and']={args=2},
+ api_info={},
+ append={args=2},
+ argc={},
+ argidx={},
+ arglistid={args={0, 2}},
+ argv={args={0, 1}},
+ asin={args=1, func="float_op_wrapper", data="&asin"}, -- WJMc
+ assert_equal={args={2, 3}},
+ assert_exception={args={1, 2}},
+ assert_fails={args={1, 2}},
+ assert_false={args={1, 2}},
+ assert_inrange={args={3, 4}},
+ assert_match={args={2, 3}},
+ assert_notequal={args={2, 3}},
+ assert_notmatch={args={2, 3}},
+ assert_report={args=1},
+ assert_true={args={1, 2}},
+ atan={args=1, func="float_op_wrapper", data="&atan"},
+ atan2={args=2},
+ browse={args=4},
+ browsedir={args=2},
+ bufexists={args=1},
+ buffer_exists={args=1, func='f_bufexists'}, -- obsolete
+ buffer_name={args=1, func='f_bufname'}, -- obsolete
+ buffer_number={args=1, func='f_bufnr'}, -- obsolete
+ buflisted={args=1},
+ bufloaded={args=1},
+ bufname={args=1},
+ bufnr={args={1, 2}},
+ bufwinid={args=1},
+ bufwinnr={args=1},
+ byte2line={args=1},
+ byteidx={args=2},
+ byteidxcomp={args=2},
+ call={args={2, 3}},
+ ceil={args=1, func="float_op_wrapper", data="&ceil"},
+ changenr={},
+ chanclose={args={1, 2}},
+ chansend={args=2},
+ char2nr={args={1, 2}},
+ cindent={args=1},
+ clearmatches={},
+ col={args=1},
+ complete={args=2},
+ complete_add={args=1},
+ complete_check={},
+ confirm={args={1, 4}},
+ copy={args=1},
+ cos={args=1, func="float_op_wrapper", data="&cos"},
+ cosh={args=1, func="float_op_wrapper", data="&cosh"},
+ count={args={2, 4}},
+ cscope_connection={args={0, 3}},
+ cursor={args={1, 3}},
+ deepcopy={args={1, 2}},
+ delete={args={1,2}},
+ dictwatcheradd={args=3},
+ dictwatcherdel={args=3},
+ did_filetype={},
+ diff_filler={args=1},
+ diff_hlID={args=2},
+ empty={args=1},
+ escape={args=2},
+ eval={args=1},
+ eventhandler={},
+ executable={args=1},
+ execute={args={1, 2}},
+ exepath={args=1},
+ exists={args=1},
+ exp={args=1, func="float_op_wrapper", data="&exp"},
+ expand={args={1, 3}},
+ extend={args={2, 3}},
+ feedkeys={args={1, 2}},
+ file_readable={args=1, func='f_filereadable'}, -- obsolete
+ filereadable={args=1},
+ filewritable={args=1},
+ filter={args=2},
+ finddir={args={1, 3}},
+ findfile={args={1, 3}},
+ float2nr={args=1},
+ floor={args=1, func="float_op_wrapper", data="&floor"},
+ fmod={args=2},
+ fnameescape={args=1},
+ fnamemodify={args=2},
+ foldclosed={args=1},
+ foldclosedend={args=1},
+ foldlevel={args=1},
+ foldtext={},
+ foldtextresult={args=1},
+ foreground={},
+ funcref={args={1, 3}},
+ ['function']={args={1, 3}},
+ garbagecollect={args={0, 1}},
+ get={args={2, 3}},
+ getbufinfo={args={0, 1}},
+ getbufline={args={2, 3}},
+ getbufvar={args={2, 3}},
+ getchar={args={0, 1}},
+ getcharmod={},
+ getcharsearch={},
+ getcmdline={},
+ getcmdpos={},
+ getcmdtype={},
+ getcmdwintype={},
+ getcompletion={args={2, 3}},
+ getcurpos={},
+ getcwd={args={0,2}},
+ getfontname={args={0, 1}},
+ getfperm={args=1},
+ getfsize={args=1},
+ getftime={args=1},
+ getftype={args=1},
+ getline={args={1, 2}},
+ getloclist={args={1, 2}},
+ getmatches={},
+ getpid={},
+ getpos={args=1},
+ getqflist={args={0, 1}},
+ getreg={args={0, 3}},
+ getregtype={args={0, 1}},
+ gettabinfo={args={0, 1}},
+ gettabvar={args={2, 3}},
+ gettabwinvar={args={3, 4}},
+ getwininfo={args={0, 1}},
+ getwinposx={},
+ getwinposy={},
+ getwinvar={args={2, 3}},
+ glob={args={1, 4}},
+ glob2regpat={args=1},
+ globpath={args={2, 5}},
+ has={args=1},
+ has_key={args=2},
+ haslocaldir={args={0,2}},
+ hasmapto={args={1, 3}},
+ highlightID={args=1, func='f_hlID'}, -- obsolete
+ highlight_exists={args=1, func='f_hlexists'}, -- obsolete
+ histadd={args=2},
+ histdel={args={1, 2}},
+ histget={args={1, 2}},
+ histnr={args=1},
+ hlID={args=1},
+ hlexists={args=1},
+ hostname={},
+ iconv={args=3},
+ indent={args=1},
+ index={args={2, 4}},
+ input={args={1, 3}},
+ inputdialog={args={1, 3}},
+ inputlist={args=1},
+ inputrestore={},
+ inputsave={},
+ inputsecret={args={1, 2}},
+ insert={args={2, 3}},
+ invert={args=1},
+ isdirectory={args=1},
+ islocked={args=1},
+ id={args=1},
+ items={args=1},
+ jobclose={args={1, 2}, func="f_chanclose"},
+ jobpid={args=1},
+ jobresize={args=3},
+ jobsend={args=2, func="f_chansend"},
+ jobstart={args={1, 2}},
+ jobstop={args=1},
+ jobwait={args={1, 2}},
+ join={args={1, 2}},
+ json_decode={args=1},
+ json_encode={args=1},
+ keys={args=1},
+ last_buffer_nr={}, -- obsolete
+ len={args=1},
+ libcall={args=3},
+ libcallnr={args=3},
+ line={args=1},
+ line2byte={args=1},
+ lispindent={args=1},
+ localtime={},
+ log={args=1, func="float_op_wrapper", data="&log"},
+ log10={args=1, func="float_op_wrapper", data="&log10"},
+ luaeval={args={1, 2}},
+ map={args=2},
+ maparg={args={1, 4}},
+ mapcheck={args={1, 3}},
+ match={args={2, 4}},
+ matchadd={args={2, 5}},
+ matchaddpos={args={2, 5}},
+ matcharg={args=1},
+ matchdelete={args=1},
+ matchend={args={2, 4}},
+ matchlist={args={2, 4}},
+ matchstr={args={2, 4}},
+ matchstrpos={args={2,4}},
+ max={args=1},
+ menu_get={args={1, 2}},
+ min={args=1},
+ mkdir={args={1, 3}},
+ mode={args={0, 1}},
+ msgpackdump={args=1},
+ msgpackparse={args=1},
+ nextnonblank={args=1},
+ nr2char={args={1, 2}},
+ ['or']={args=2},
+ pathshorten={args=1},
+ pow={args=2},
+ prevnonblank={args=1},
+ printf={args=varargs(1)},
+ pumvisible={},
+ py3eval={args=1},
+ pyeval={args=1},
+ pyxeval={args=1},
+ range={args={1, 3}},
+ readfile={args={1, 3}},
+ reltime={args={0, 2}},
+ reltimefloat={args=1},
+ reltimestr={args=1},
+ remove={args={2, 3}},
+ rename={args=2},
+ ['repeat']={args=2},
+ resolve={args=1},
+ reverse={args=1},
+ round={args=1, func="float_op_wrapper", data="&round"},
+ rpcnotify={args=varargs(2)},
+ rpcrequest={args=varargs(2)},
+ rpcstart={args={1, 2}},
+ rpcstop={args=1},
+ screenattr={args=2},
+ screenchar={args=2},
+ screencol={},
+ screenrow={},
+ search={args={1, 4}},
+ searchdecl={args={1, 3}},
+ searchpair={args={3, 7}},
+ searchpairpos={args={3, 7}},
+ searchpos={args={1, 4}},
+ serverlist={},
+ serverstart={args={0, 1}},
+ serverstop={args=1},
+ setbufvar={args=3},
+ setcharsearch={args=1},
+ setcmdpos={args=1},
+ setfperm={args=2},
+ setline={args=2},
+ setloclist={args={2, 4}},
+ setmatches={args=1},
+ setpos={args=2},
+ setqflist={args={1, 3}},
+ setreg={args={2, 3}},
+ settabvar={args=3},
+ settabwinvar={args=4},
+ setwinvar={args=3},
+ sha256={args=1},
+ shellescape={args={1, 2}},
+ shiftwidth={},
+ simplify={args=1},
+ sin={args=1, func="float_op_wrapper", data="&sin"},
+ sinh={args=1, func="float_op_wrapper", data="&sinh"},
+ sockconnect={args={2,3}},
+ sort={args={1, 3}},
+ soundfold={args=1},
+ stdioopen={args=1},
+ spellbadword={args={0, 1}},
+ spellsuggest={args={1, 3}},
+ split={args={1, 3}},
+ sqrt={args=1, func="float_op_wrapper", data="&sqrt"},
+ stdpath={args=1},
+ str2float={args=1},
+ str2nr={args={1, 2}},
+ strcharpart={args={2, 3}},
+ strchars={args={1,2}},
+ strdisplaywidth={args={1, 2}},
+ strftime={args={1, 2}},
+ strgetchar={args={2, 2}},
+ stridx={args={2, 3}},
+ string={args=1},
+ strlen={args=1},
+ strpart={args={2, 3}},
+ strridx={args={2, 3}},
+ strtrans={args=1},
+ strwidth={args=1},
+ submatch={args={1, 2}},
+ substitute={args=4},
+ synID={args=3},
+ synIDattr={args={2, 3}},
+ synIDtrans={args=1},
+ synconcealed={args=2},
+ synstack={args=2},
+ system={args={1, 2}},
+ systemlist={args={1, 3}},
+ tabpagebuflist={args={0, 1}},
+ tabpagenr={args={0, 1}},
+ tabpagewinnr={args={1, 2}},
+ tagfiles={},
+ taglist={args={1, 2}},
+ tan={args=1, func="float_op_wrapper", data="&tan"},
+ tanh={args=1, func="float_op_wrapper", data="&tanh"},
+ tempname={},
+ termopen={args={1, 2}},
+ test_garbagecollect_now={},
+ test_write_list_log={args=1},
+ timer_info={args={0,1}},
+ timer_pause={args=2},
+ timer_start={args={2,3}},
+ timer_stop={args=1},
+ timer_stopall={args=0},
+ tolower={args=1},
+ toupper={args=1},
+ tr={args=3},
+ trim={args={1,2}},
+ trunc={args=1, func="float_op_wrapper", data="&trunc"},
+ type={args=1},
+ undofile={args=1},
+ undotree={},
+ uniq={args={1, 3}},
+ values={args=1},
+ virtcol={args=1},
+ visualmode={args={0, 1}},
+ wildmenumode={},
+ win_findbuf={args=1},
+ win_getid={args={0,2}},
+ win_gotoid={args=1},
+ win_id2tabwin={args=1},
+ win_id2win={args=1},
+ win_screenpos={args=1},
+ winbufnr={args=1},
+ wincol={},
+ winheight={args=1},
+ winline={},
+ winnr={args={0, 1}},
+ winrestcmd={},
+ winrestview={args=1},
+ winsaveview={},
+ winwidth={args=1},
+ wordcount={},
+ writefile={args={2, 3}},
+ xor={args=2},
+ },
+}
diff --git a/src/nvim/eval/decode.c b/src/nvim/eval/decode.c
index 43e9f76c0f..4d75c7bda1 100644
--- a/src/nvim/eval/decode.c
+++ b/src/nvim/eval/decode.c
@@ -1,12 +1,17 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <stddef.h>
#include <msgpack.h>
-#include "nvim/eval_defs.h"
+#include "nvim/eval/typval.h"
#include "nvim/eval.h"
#include "nvim/eval/encode.h"
#include "nvim/ascii.h"
+#include "nvim/macros.h"
#include "nvim/message.h"
+#include "nvim/globals.h"
#include "nvim/charset.h" // vim_str2nr
#include "nvim/lib/kvec.h"
#include "nvim/vim.h" // OK, FAIL
@@ -51,16 +56,16 @@ static inline void create_special_dict(typval_T *const rettv,
typval_T val)
FUNC_ATTR_NONNULL_ALL
{
- dict_T *const dict = dict_alloc();
- dictitem_T *const type_di = dictitem_alloc((char_u *) "_TYPE");
+ dict_T *const dict = tv_dict_alloc();
+ dictitem_T *const type_di = tv_dict_item_alloc_len(S_LEN("_TYPE"));
type_di->di_tv.v_type = VAR_LIST;
type_di->di_tv.v_lock = VAR_UNLOCKED;
- type_di->di_tv.vval.v_list = (list_T *) eval_msgpack_type_lists[type];
- type_di->di_tv.vval.v_list->lv_refcount++;
- dict_add(dict, type_di);
- dictitem_T *const val_di = dictitem_alloc((char_u *) "_VAL");
+ type_di->di_tv.vval.v_list = (list_T *)eval_msgpack_type_lists[type];
+ tv_list_ref(type_di->di_tv.vval.v_list);
+ tv_dict_add(dict, type_di);
+ dictitem_T *const val_di = tv_dict_item_alloc_len(S_LEN("_VAL"));
val_di->di_tv = val;
- dict_add(dict, val_di);
+ tv_dict_add(dict, val_di);
dict->dv_refcount++;
*rettv = (typval_T) {
.v_type = VAR_DICT,
@@ -115,21 +120,19 @@ static inline int json_decoder_pop(ValuesStackItem obj,
last_container = kv_last(*container_stack);
}
if (last_container.container.v_type == VAR_LIST) {
- if (last_container.container.vval.v_list->lv_len != 0
+ if (tv_list_len(last_container.container.vval.v_list) != 0
&& !obj.didcomma) {
EMSG2(_("E474: Expected comma before list item: %s"), val_location);
- clear_tv(&obj.val);
+ tv_clear(&obj.val);
return FAIL;
}
assert(last_container.special_val == NULL);
- listitem_T *obj_li = listitem_alloc();
- obj_li->li_tv = obj.val;
- list_append(last_container.container.vval.v_list, obj_li);
+ tv_list_append_owned_tv(last_container.container.vval.v_list, obj.val);
} else if (last_container.stack_index == kv_size(*stack) - 2) {
if (!obj.didcolon) {
EMSG2(_("E474: Expected colon before dictionary value: %s"),
val_location);
- clear_tv(&obj.val);
+ tv_clear(&obj.val);
return FAIL;
}
ValuesStackItem key = kv_pop(*stack);
@@ -138,34 +141,31 @@ static inline int json_decoder_pop(ValuesStackItem obj,
assert(!(key.is_special_string
|| key.val.vval.v_string == NULL
|| *key.val.vval.v_string == NUL));
- dictitem_T *obj_di = dictitem_alloc(key.val.vval.v_string);
- clear_tv(&key.val);
- if (dict_add(last_container.container.vval.v_dict, obj_di)
+ dictitem_T *const obj_di = tv_dict_item_alloc(
+ (const char *)key.val.vval.v_string);
+ tv_clear(&key.val);
+ if (tv_dict_add(last_container.container.vval.v_dict, obj_di)
== FAIL) {
assert(false);
}
obj_di->di_tv = obj.val;
} else {
- list_T *const kv_pair = list_alloc();
- list_append_list(last_container.special_val, kv_pair);
- listitem_T *const key_li = listitem_alloc();
- key_li->li_tv = key.val;
- list_append(kv_pair, key_li);
- listitem_T *const val_li = listitem_alloc();
- val_li->li_tv = obj.val;
- list_append(kv_pair, val_li);
+ list_T *const kv_pair = tv_list_alloc(2);
+ tv_list_append_list(last_container.special_val, kv_pair);
+ tv_list_append_owned_tv(kv_pair, key.val);
+ tv_list_append_owned_tv(kv_pair, obj.val);
}
} else {
// Object with key only
if (!obj.is_special_string && obj.val.v_type != VAR_STRING) {
EMSG2(_("E474: Expected string key: %s"), *pp);
- clear_tv(&obj.val);
+ tv_clear(&obj.val);
return FAIL;
} else if (!obj.didcomma
&& (last_container.special_val == NULL
&& (DICT_LEN(last_container.container.vval.v_dict) != 0))) {
EMSG2(_("E474: Expected comma before dictionary key: %s"), val_location);
- clear_tv(&obj.val);
+ tv_clear(&obj.val);
return FAIL;
}
// Handle empty key and key represented as special dictionary
@@ -173,16 +173,16 @@ static inline int json_decoder_pop(ValuesStackItem obj,
&& (obj.is_special_string
|| obj.val.vval.v_string == NULL
|| *obj.val.vval.v_string == NUL
- || dict_find(last_container.container.vval.v_dict,
- obj.val.vval.v_string, -1))) {
- clear_tv(&obj.val);
+ || tv_dict_find(last_container.container.vval.v_dict,
+ (const char *)obj.val.vval.v_string, -1))) {
+ tv_clear(&obj.val);
// Restart
(void) kv_pop(*container_stack);
ValuesStackItem last_container_val =
kv_A(*stack, last_container.stack_index);
while (kv_size(*stack) > last_container.stack_index) {
- clear_tv(&(kv_pop(*stack).val));
+ tv_clear(&(kv_pop(*stack).val));
}
*pp = last_container.s;
*didcomma = last_container_val.didcomma;
@@ -218,10 +218,85 @@ static inline int json_decoder_pop(ValuesStackItem obj,
} \
} while (0)
+/// Create a new special dictionary that ought to represent a MAP
+///
+/// @param[out] ret_tv Address where new special dictionary is saved.
+/// @param[in] len Expected number of items to be populated before list
+/// becomes accessible from VimL. It is still valid to
+/// underpopulate a list, value only controls how many elements
+/// will be allocated in advance. @see ListLenSpecials.
+///
+/// @return [allocated] list which should contain key-value pairs. Return value
+/// may be safely ignored.
+list_T *decode_create_map_special_dict(typval_T *const ret_tv,
+ const ptrdiff_t len)
+ FUNC_ATTR_NONNULL_ALL
+{
+ list_T *const list = tv_list_alloc(len);
+ tv_list_ref(list);
+ create_special_dict(ret_tv, kMPMap, ((typval_T) {
+ .v_type = VAR_LIST,
+ .v_lock = VAR_UNLOCKED,
+ .vval = { .v_list = list },
+ }));
+ return list;
+}
+
+/// Convert char* string to typval_T
+///
+/// Depending on whether string has (no) NUL bytes, it may use a special
+/// dictionary or decode string to VAR_STRING.
+///
+/// @param[in] s String to decode.
+/// @param[in] len String length.
+/// @param[in] hasnul Whether string has NUL byte, not or it was not yet
+/// determined.
+/// @param[in] binary If true, save special string type as kMPBinary,
+/// otherwise kMPString.
+/// @param[in] s_allocated If true, then `s` was allocated and can be saved in
+/// a returned structure. If it is not saved there, it
+/// will be freed.
+///
+/// @return Decoded string.
+typval_T decode_string(const char *const s, const size_t len,
+ const TriState hasnul, const bool binary,
+ const bool s_allocated)
+ FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ assert(s != NULL || len == 0);
+ const bool really_hasnul = (hasnul == kNone
+ ? ((s != NULL) && (memchr(s, NUL, len) != NULL))
+ : (bool)hasnul);
+ if (really_hasnul) {
+ list_T *const list = tv_list_alloc(kListLenMayKnow);
+ tv_list_ref(list);
+ typval_T tv;
+ create_special_dict(&tv, binary ? kMPBinary : kMPString, ((typval_T) {
+ .v_type = VAR_LIST,
+ .v_lock = VAR_UNLOCKED,
+ .vval = { .v_list = list },
+ }));
+ const int elw_ret = encode_list_write((void *)list, s, len);
+ if (s_allocated) {
+ xfree((void *)s);
+ }
+ if (elw_ret == -1) {
+ tv_clear(&tv);
+ return (typval_T) { .v_type = VAR_UNKNOWN, .v_lock = VAR_UNLOCKED };
+ }
+ return tv;
+ } else {
+ return (typval_T) {
+ .v_type = VAR_STRING,
+ .v_lock = VAR_UNLOCKED,
+ .vval = { .v_string = (char_u *)(
+ (s == NULL || s_allocated) ? (char *)s : xmemdupz(s, len)) },
+ };
+ }
+}
+
/// Parse JSON double-quoted string
///
-/// @param[in] conv Defines conversion necessary to convert UTF-8 string to
-/// &encoding.
/// @param[in] buf Buffer being converted.
/// @param[in] buf_len Length of the buffer.
/// @param[in,out] pp Pointer to the start of the string. Must point to '"'.
@@ -238,8 +313,7 @@ static inline int json_decoder_pop(ValuesStackItem obj,
/// value when decoder is restarted, otherwise unused.
///
/// @return OK in case of success, FAIL in case of error.
-static inline int parse_json_string(vimconv_T *const conv,
- const char *const buf, const size_t buf_len,
+static inline int parse_json_string(const char *const buf, const size_t buf_len,
const char **const pp,
ValuesStack *const stack,
ContainerStack *const container_stack,
@@ -360,8 +434,8 @@ static inline int parse_json_string(vimconv_T *const conv,
case 'u': {
const char ubuf[] = { t[1], t[2], t[3], t[4] };
t += 4;
- unsigned long ch;
- vim_str2nr((char_u *) ubuf, NULL, NULL,
+ uvarnumber_T ch;
+ vim_str2nr((char_u *)ubuf, NULL, NULL,
STR2NR_HEX | STR2NR_FORCE, NULL, &ch, 4);
if (ch == 0) {
hasnul = true;
@@ -414,43 +488,13 @@ static inline int parse_json_string(vimconv_T *const conv,
}
PUT_FST_IN_PAIR(fst_in_pair, str_end);
#undef PUT_FST_IN_PAIR
- if (conv->vc_type != CONV_NONE) {
- size_t str_len = (size_t) (str_end - str);
- char *const new_str = (char *) string_convert(conv, (char_u *) str,
- &str_len);
- if (new_str == NULL) {
- emsgf(_("E474: Failed to convert string \"%.*s\" from UTF-8"),
- (int) str_len, str);
- xfree(str);
- goto parse_json_string_fail;
- }
- xfree(str);
- str = new_str;
- str_end = new_str + str_len;
- }
- if (hasnul) {
- typval_T obj;
- list_T *const list = list_alloc();
- list->lv_refcount++;
- create_special_dict(&obj, kMPString, ((typval_T) {
- .v_type = VAR_LIST,
- .v_lock = VAR_UNLOCKED,
- .vval = { .v_list = list },
- }));
- if (encode_list_write((void *) list, str, (size_t) (str_end - str))
- == -1) {
- clear_tv(&obj);
- goto parse_json_string_fail;
- }
- xfree(str);
- POP(obj, true);
- } else {
- *str_end = NUL;
- POP(((typval_T) {
- .v_type = VAR_STRING,
- .vval = { .v_string = (char_u *) str },
- }), false);
+ *str_end = NUL;
+ typval_T obj = decode_string(
+ str, (size_t)(str_end - str), hasnul ? kTrue : kFalse, false, true);
+ if (obj.v_type == VAR_UNKNOWN) {
+ goto parse_json_string_fail;
}
+ POP(obj, obj.v_type != VAR_STRING);
goto parse_json_string_ret;
parse_json_string_fail:
ret = FAIL;
@@ -564,7 +608,7 @@ parse_json_number_check:
tv.v_type = VAR_FLOAT;
} else {
// Convert integer
- long nr;
+ varnumber_T nr;
int num_len;
vim_str2nr((char_u *) s, NULL, &num_len, 0, &nr, NULL, (int) (p - s));
if ((int) exp_num_len != num_len) {
@@ -572,7 +616,7 @@ parse_json_number_check:
"to integer vim_str2nr consumed %i bytes in place of %zu"),
(int) exp_num_len, s, num_len, exp_num_len);
}
- tv.vval.v_number = (varnumber_T) nr;
+ tv.vval.v_number = nr;
}
if (json_decoder_pop(OBJ(tv, false, *didcomma, *didcolon),
stack, container_stack,
@@ -624,9 +668,6 @@ int json_decode_string(const char *const buf, const size_t buf_len,
EMSG(_("E474: Attempt to decode a blank string"));
return FAIL;
}
- vimconv_T conv = { .vc_type = CONV_NONE };
- convert_setup(&conv, (char_u *) "utf-8", p_enc);
- conv.vc_fail = true;
int ret = OK;
ValuesStack stack = KV_INITIAL_VALUE;
ContainerStack container_stack = KV_INITIAL_VALUE;
@@ -696,8 +737,9 @@ json_decode_string_cycle_start:
} else if (last_container.special_val == NULL
? (last_container.container.v_type == VAR_DICT
? (DICT_LEN(last_container.container.vval.v_dict) == 0)
- : (last_container.container.vval.v_list->lv_len == 0))
- : (last_container.special_val->lv_len == 0)) {
+ : (tv_list_len(last_container.container.vval.v_list)
+ == 0))
+ : (tv_list_len(last_container.special_val) == 0)) {
emsgf(_("E474: Leading comma: %.*s"), LENP(p, e));
goto json_decode_string_fail;
}
@@ -772,7 +814,7 @@ json_decode_string_cycle_start:
break;
}
case '"': {
- if (parse_json_string(&conv, buf, buf_len, &p, &stack, &container_stack,
+ if (parse_json_string(buf, buf_len, &p, &stack, &container_stack,
&next_map_special, &didcomma, &didcolon)
== FAIL) {
// Error message was already given
@@ -806,8 +848,8 @@ json_decode_string_cycle_start:
break;
}
case '[': {
- list_T *list = list_alloc();
- list->lv_refcount++;
+ list_T *list = tv_list_alloc(kListLenMayKnow);
+ tv_list_ref(list);
typval_T tv = {
.v_type = VAR_LIST,
.v_lock = VAR_UNLOCKED,
@@ -827,15 +869,9 @@ json_decode_string_cycle_start:
list_T *val_list = NULL;
if (next_map_special) {
next_map_special = false;
- val_list = list_alloc();
- val_list->lv_refcount++;
- create_special_dict(&tv, kMPMap, ((typval_T) {
- .v_type = VAR_LIST,
- .v_lock = VAR_UNLOCKED,
- .vval = { .v_list = val_list },
- }));
+ val_list = decode_create_map_special_dict(&tv, kListLenMayKnow);
} else {
- dict_T *dict = dict_alloc();
+ dict_T *dict = tv_dict_alloc();
dict->dv_refcount++;
tv = (typval_T) {
.v_type = VAR_DICT,
@@ -887,7 +923,7 @@ json_decode_string_after_cycle:
json_decode_string_fail:
ret = FAIL;
while (kv_size(stack)) {
- clear_tv(&(kv_pop(stack).val));
+ tv_clear(&(kv_pop(stack).val));
}
json_decode_string_ret:
kv_destroy(stack);
@@ -933,45 +969,51 @@ int msgpack_to_vim(const msgpack_object mobj, typval_T *const rettv)
.vval = { .v_number = (varnumber_T) mobj.via.u64 },
};
} else {
- list_T *const list = list_alloc();
- list->lv_refcount++;
+ list_T *const list = tv_list_alloc(4);
+ tv_list_ref(list);
create_special_dict(rettv, kMPInteger, ((typval_T) {
.v_type = VAR_LIST,
.v_lock = VAR_UNLOCKED,
.vval = { .v_list = list },
}));
uint64_t n = mobj.via.u64;
- list_append_number(list, 1);
- list_append_number(list, (varnumber_T) ((n >> 62) & 0x3));
- list_append_number(list, (varnumber_T) ((n >> 31) & 0x7FFFFFFF));
- list_append_number(list, (varnumber_T) (n & 0x7FFFFFFF));
+ tv_list_append_number(list, 1);
+ tv_list_append_number(list, (varnumber_T)((n >> 62) & 0x3));
+ tv_list_append_number(list, (varnumber_T)((n >> 31) & 0x7FFFFFFF));
+ tv_list_append_number(list, (varnumber_T)(n & 0x7FFFFFFF));
}
break;
}
case MSGPACK_OBJECT_NEGATIVE_INTEGER: {
- if (mobj.via.i64 >= VARNUMBER_MIN) {
+ if (mobj.via.i64 >= VARNUMBER_MIN) { // -V547
*rettv = (typval_T) {
.v_type = VAR_NUMBER,
.v_lock = VAR_UNLOCKED,
.vval = { .v_number = (varnumber_T) mobj.via.i64 },
};
} else {
- list_T *const list = list_alloc();
- list->lv_refcount++;
+ list_T *const list = tv_list_alloc(4);
+ tv_list_ref(list);
create_special_dict(rettv, kMPInteger, ((typval_T) {
.v_type = VAR_LIST,
.v_lock = VAR_UNLOCKED,
.vval = { .v_list = list },
}));
- uint64_t n = -((uint64_t) mobj.via.i64);
- list_append_number(list, -1);
- list_append_number(list, (varnumber_T) ((n >> 62) & 0x3));
- list_append_number(list, (varnumber_T) ((n >> 31) & 0x7FFFFFFF));
- list_append_number(list, (varnumber_T) (n & 0x7FFFFFFF));
+ uint64_t n = -((uint64_t)mobj.via.i64);
+ tv_list_append_number(list, -1);
+ tv_list_append_number(list, (varnumber_T)((n >> 62) & 0x3));
+ tv_list_append_number(list, (varnumber_T)((n >> 31) & 0x7FFFFFFF));
+ tv_list_append_number(list, (varnumber_T)(n & 0x7FFFFFFF));
}
break;
}
- case MSGPACK_OBJECT_FLOAT: {
+#ifdef NVIM_MSGPACK_HAS_FLOAT32
+ case MSGPACK_OBJECT_FLOAT32:
+ case MSGPACK_OBJECT_FLOAT64:
+#else
+ case MSGPACK_OBJECT_FLOAT:
+#endif
+ {
*rettv = (typval_T) {
.v_type = VAR_FLOAT,
.v_lock = VAR_UNLOCKED,
@@ -980,54 +1022,35 @@ int msgpack_to_vim(const msgpack_object mobj, typval_T *const rettv)
break;
}
case MSGPACK_OBJECT_STR: {
- list_T *const list = list_alloc();
- list->lv_refcount++;
- create_special_dict(rettv, kMPString, ((typval_T) {
- .v_type = VAR_LIST,
- .v_lock = VAR_UNLOCKED,
- .vval = { .v_list = list },
- }));
- if (encode_list_write((void *) list, mobj.via.str.ptr, mobj.via.str.size)
- == -1) {
+ *rettv = decode_string(mobj.via.bin.ptr, mobj.via.bin.size, kTrue, false,
+ false);
+ if (rettv->v_type == VAR_UNKNOWN) {
return FAIL;
}
break;
}
case MSGPACK_OBJECT_BIN: {
- if (memchr(mobj.via.bin.ptr, NUL, mobj.via.bin.size) == NULL) {
- *rettv = (typval_T) {
- .v_type = VAR_STRING,
- .v_lock = VAR_UNLOCKED,
- .vval = { .v_string = xmemdupz(mobj.via.bin.ptr, mobj.via.bin.size) },
- };
- break;
- }
- list_T *const list = list_alloc();
- list->lv_refcount++;
- create_special_dict(rettv, kMPBinary, ((typval_T) {
- .v_type = VAR_LIST,
- .v_lock = VAR_UNLOCKED,
- .vval = { .v_list = list },
- }));
- if (encode_list_write((void *) list, mobj.via.bin.ptr, mobj.via.bin.size)
- == -1) {
+ *rettv = decode_string(mobj.via.bin.ptr, mobj.via.bin.size, kNone, true,
+ false);
+ if (rettv->v_type == VAR_UNKNOWN) {
return FAIL;
}
break;
}
case MSGPACK_OBJECT_ARRAY: {
- list_T *const list = list_alloc();
- list->lv_refcount++;
+ list_T *const list = tv_list_alloc((ptrdiff_t)mobj.via.array.size);
+ tv_list_ref(list);
*rettv = (typval_T) {
.v_type = VAR_LIST,
.v_lock = VAR_UNLOCKED,
.vval = { .v_list = list },
};
for (size_t i = 0; i < mobj.via.array.size; i++) {
- listitem_T *const li = listitem_alloc();
- li->li_tv.v_type = VAR_UNKNOWN;
- list_append(list, li);
- if (msgpack_to_vim(mobj.via.array.ptr[i], &li->li_tv) == FAIL) {
+ // Not populated yet, need to create list item to push.
+ tv_list_append_owned_tv(list, (typval_T) { .v_type = VAR_UNKNOWN });
+ if (msgpack_to_vim(mobj.via.array.ptr[i],
+ TV_LIST_ITEM_TV(tv_list_last(list)))
+ == FAIL) {
return FAIL;
}
}
@@ -1042,7 +1065,7 @@ int msgpack_to_vim(const msgpack_object mobj, typval_T *const rettv)
goto msgpack_to_vim_generic_map;
}
}
- dict_T *const dict = dict_alloc();
+ dict_T *const dict = tv_dict_alloc();
dict->dv_refcount++;
*rettv = (typval_T) {
.v_type = VAR_DICT,
@@ -1055,9 +1078,9 @@ int msgpack_to_vim(const msgpack_object mobj, typval_T *const rettv)
memcpy(&di->di_key[0], mobj.via.map.ptr[i].key.via.str.ptr,
mobj.via.map.ptr[i].key.via.str.size);
di->di_tv.v_type = VAR_UNKNOWN;
- if (dict_add(dict, di) == FAIL) {
+ if (tv_dict_add(dict, di) == FAIL) {
// Duplicate key: fallback to generic map
- clear_tv(rettv);
+ tv_clear(rettv);
xfree(di);
goto msgpack_to_vim_generic_map;
}
@@ -1067,37 +1090,34 @@ int msgpack_to_vim(const msgpack_object mobj, typval_T *const rettv)
}
break;
msgpack_to_vim_generic_map: {}
- list_T *const list = list_alloc();
- list->lv_refcount++;
- create_special_dict(rettv, kMPMap, ((typval_T) {
- .v_type = VAR_LIST,
- .v_lock = VAR_UNLOCKED,
- .vval = { .v_list = list },
- }));
+ list_T *const list = decode_create_map_special_dict(
+ rettv, (ptrdiff_t)mobj.via.map.size);
for (size_t i = 0; i < mobj.via.map.size; i++) {
- list_T *const kv_pair = list_alloc();
- list_append_list(list, kv_pair);
- listitem_T *const key_li = listitem_alloc();
- key_li->li_tv.v_type = VAR_UNKNOWN;
- list_append(kv_pair, key_li);
- listitem_T *const val_li = listitem_alloc();
- val_li->li_tv.v_type = VAR_UNKNOWN;
- list_append(kv_pair, val_li);
- if (msgpack_to_vim(mobj.via.map.ptr[i].key, &key_li->li_tv) == FAIL) {
+ list_T *const kv_pair = tv_list_alloc(2);
+ tv_list_append_list(list, kv_pair);
+
+ typval_T key_tv = { .v_type = VAR_UNKNOWN };
+ if (msgpack_to_vim(mobj.via.map.ptr[i].key, &key_tv) == FAIL) {
+ tv_clear(&key_tv);
return FAIL;
}
- if (msgpack_to_vim(mobj.via.map.ptr[i].val, &val_li->li_tv) == FAIL) {
+ tv_list_append_owned_tv(kv_pair, key_tv);
+
+ typval_T val_tv = { .v_type = VAR_UNKNOWN };
+ if (msgpack_to_vim(mobj.via.map.ptr[i].val, &val_tv) == FAIL) {
+ tv_clear(&val_tv);
return FAIL;
}
+ tv_list_append_owned_tv(kv_pair, val_tv);
}
break;
}
case MSGPACK_OBJECT_EXT: {
- list_T *const list = list_alloc();
- list->lv_refcount++;
- list_append_number(list, mobj.via.ext.type);
- list_T *const ext_val_list = list_alloc();
- list_append_list(list, ext_val_list);
+ list_T *const list = tv_list_alloc(2);
+ tv_list_ref(list);
+ tv_list_append_number(list, mobj.via.ext.type);
+ list_T *const ext_val_list = tv_list_alloc(kListLenMayKnow);
+ tv_list_append_list(list, ext_val_list);
create_special_dict(rettv, kMPExt, ((typval_T) {
.v_type = VAR_LIST,
.v_lock = VAR_UNLOCKED,
diff --git a/src/nvim/eval/decode.h b/src/nvim/eval/decode.h
index 5c25a64f7a..77fc4c78c2 100644
--- a/src/nvim/eval/decode.h
+++ b/src/nvim/eval/decode.h
@@ -5,7 +5,8 @@
#include <msgpack.h>
-#include "nvim/eval_defs.h"
+#include "nvim/eval/typval.h"
+#include "nvim/globals.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "eval/decode.h.generated.h"
diff --git a/src/nvim/eval/encode.c b/src/nvim/eval/encode.c
index 670437ceda..64658b52d9 100644
--- a/src/nvim/eval/encode.c
+++ b/src/nvim/eval/encode.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/// @file encode.c
///
/// File containing functions for encoding and decoding VimL values.
@@ -11,9 +14,9 @@
#include <math.h>
#include "nvim/eval/encode.h"
-#include "nvim/buffer_defs.h" // vimconv_T
+#include "nvim/buffer_defs.h"
#include "nvim/eval.h"
-#include "nvim/eval_defs.h"
+#include "nvim/eval/typval.h"
#include "nvim/garray.h"
#include "nvim/mbyte.h"
#include "nvim/message.h"
@@ -25,14 +28,15 @@
#include "nvim/lib/kvec.h"
#include "nvim/eval/typval_encode.h"
+#ifdef __MINGW32__
+# undef fpclassify
+# define fpclassify __fpclassify
+#endif
+
#define ga_concat(a, b) ga_concat(a, (char_u *)b)
#define utf_ptr2char(b) utf_ptr2char((char_u *)b)
#define utf_ptr2len(b) ((size_t)utf_ptr2len((char_u *)b))
#define utf_char2len(b) ((size_t)utf_char2len(b))
-#define string_convert(a, b, c) \
- ((char *)string_convert((vimconv_T *)a, (char_u *)b, c))
-#define convert_setup(vcp, from, to) \
- (convert_setup(vcp, (char_u *)from, (char_u *)to))
const char *const encode_special_var_names[] = {
[kSpecialVarNull] = "null",
@@ -45,7 +49,8 @@ const char *const encode_special_var_names[] = {
#endif
/// Msgpack callback for writing to readfile()-style list
-int encode_list_write(void *data, const char *buf, size_t len)
+int encode_list_write(void *const data, const char *const buf, const size_t len)
+ FUNC_ATTR_NONNULL_ARG(1)
{
if (len == 0) {
return 0;
@@ -53,17 +58,18 @@ int encode_list_write(void *data, const char *buf, size_t len)
list_T *const list = (list_T *) data;
const char *const end = buf + len;
const char *line_end = buf;
- listitem_T *li = list->lv_last;
+ listitem_T *li = tv_list_last(list);
// Continue the last list element
if (li != NULL) {
line_end = xmemscan(buf, NL, len);
if (line_end != buf) {
const size_t line_length = (size_t)(line_end - buf);
- char *str = (char *)li->li_tv.vval.v_string;
+ char *str = (char *)TV_LIST_ITEM_TV(li)->vval.v_string;
const size_t li_len = (str == NULL ? 0 : strlen(str));
- li->li_tv.vval.v_string = xrealloc(str, li_len + line_length + 1);
- str = (char *)li->li_tv.vval.v_string + li_len;
+ TV_LIST_ITEM_TV(li)->vval.v_string = xrealloc(
+ str, li_len + line_length + 1);
+ str = (char *)TV_LIST_ITEM_TV(li)->vval.v_string + li_len;
memcpy(str, buf, line_length);
str[line_length] = 0;
memchrsub(str, NUL, NL, line_length);
@@ -80,11 +86,11 @@ int encode_list_write(void *data, const char *buf, size_t len)
str = xmemdupz(line_start, line_length);
memchrsub(str, NUL, NL, line_length);
}
- list_append_allocated_string(list, str);
+ tv_list_append_allocated_string(list, str);
line_end++;
}
if (line_end == end) {
- list_append_allocated_string(list, NULL);
+ tv_list_append_allocated_string(list, NULL);
}
return 0;
}
@@ -108,9 +114,12 @@ static int conv_error(const char *const msg, const MPConvStack *const mpstack,
{
garray_T msg_ga;
ga_init(&msg_ga, (int)sizeof(char), 80);
- char *const key_msg = _("key %s");
- char *const key_pair_msg = _("key %s at index %i from special map");
- char *const idx_msg = _("index %i");
+ const char *const key_msg = _("key %s");
+ const char *const key_pair_msg = _("key %s at index %i from special map");
+ const char *const idx_msg = _("index %i");
+ const char *const partial_arg_msg = _("partial");
+ const char *const partial_arg_i_msg = _("argument %i");
+ const char *const partial_self_msg = _("partial self dictionary");
for (size_t i = 0; i < kv_size(*mpstack); i++) {
if (i != 0) {
ga_concat(&msg_ga, ", ");
@@ -132,21 +141,27 @@ static int conv_error(const char *const msg, const MPConvStack *const mpstack,
}
case kMPConvPairs:
case kMPConvList: {
- int idx = 0;
- const listitem_T *li;
- for (li = v.data.l.list->lv_first;
- li != NULL && li->li_next != v.data.l.li;
- li = li->li_next) {
- idx++;
- }
+ const int idx = (v.data.l.li == tv_list_first(v.data.l.list)
+ ? 0
+ : (v.data.l.li == NULL
+ ? tv_list_len(v.data.l.list) - 1
+ : (int)tv_list_idx_of_item(
+ v.data.l.list,
+ TV_LIST_ITEM_PREV(v.data.l.list,
+ v.data.l.li))));
+ const listitem_T *const li = (v.data.l.li == NULL
+ ? tv_list_last(v.data.l.list)
+ : TV_LIST_ITEM_PREV(v.data.l.list,
+ v.data.l.li));
if (v.type == kMPConvList
|| li == NULL
- || (li->li_tv.v_type != VAR_LIST
- && li->li_tv.vval.v_list->lv_len <= 0)) {
- vim_snprintf((char *) IObuff, IOSIZE, idx_msg, idx);
+ || (TV_LIST_ITEM_TV(li)->v_type != VAR_LIST
+ && tv_list_len(TV_LIST_ITEM_TV(li)->vval.v_list) <= 0)) {
+ vim_snprintf((char *)IObuff, IOSIZE, idx_msg, idx);
ga_concat(&msg_ga, IObuff);
} else {
- typval_T key_tv = li->li_tv.vval.v_list->lv_first->li_tv;
+ typval_T key_tv = *TV_LIST_ITEM_TV(
+ tv_list_first(TV_LIST_ITEM_TV(li)->vval.v_list));
char *const key = encode_tv2echo(&key_tv, NULL);
vim_snprintf((char *) IObuff, IOSIZE, key_pair_msg, key, idx);
xfree(key);
@@ -154,11 +169,34 @@ static int conv_error(const char *const msg, const MPConvStack *const mpstack,
}
break;
}
+ case kMPConvPartial: {
+ switch (v.data.p.stage) {
+ case kMPConvPartialArgs: {
+ assert(false);
+ break;
+ }
+ case kMPConvPartialSelf: {
+ ga_concat(&msg_ga, partial_arg_msg);
+ break;
+ }
+ case kMPConvPartialEnd: {
+ ga_concat(&msg_ga, partial_self_msg);
+ break;
+ }
+ }
+ break;
+ }
+ case kMPConvPartialList: {
+ const int idx = (int)(v.data.a.arg - v.data.a.argv) - 1;
+ vim_snprintf((char *)IObuff, IOSIZE, partial_arg_i_msg, idx);
+ ga_concat(&msg_ga, IObuff);
+ break;
+ }
}
}
- EMSG3(msg, objname, (kv_size(*mpstack) == 0
- ? _("itself")
- : (char *) msg_ga.ga_data));
+ emsgf(msg, _(objname), (kv_size(*mpstack) == 0
+ ? _("itself")
+ : (char *)msg_ga.ga_data));
ga_clear(&msg_ga);
return FAIL;
}
@@ -176,21 +214,17 @@ bool encode_vim_list_to_buf(const list_T *const list, size_t *const ret_len,
FUNC_ATTR_NONNULL_ARG(2, 3) FUNC_ATTR_WARN_UNUSED_RESULT
{
size_t len = 0;
- if (list != NULL) {
- for (const listitem_T *li = list->lv_first;
- li != NULL;
- li = li->li_next) {
- if (li->li_tv.v_type != VAR_STRING) {
- return false;
- }
- len++;
- if (li->li_tv.vval.v_string != 0) {
- len += STRLEN(li->li_tv.vval.v_string);
- }
+ TV_LIST_ITER_CONST(list, li, {
+ if (TV_LIST_ITEM_TV(li)->v_type != VAR_STRING) {
+ return false;
}
- if (len) {
- len--;
+ len++;
+ if (TV_LIST_ITEM_TV(li)->vval.v_string != NULL) {
+ len += STRLEN(TV_LIST_ITEM_TV(li)->vval.v_string);
}
+ });
+ if (len) {
+ len--;
}
*ret_len = len;
if (len == 0) {
@@ -227,34 +261,39 @@ int encode_read_from_list(ListReaderState *const state, char *const buf,
char *const buf_end = buf + nbuf;
char *p = buf;
while (p < buf_end) {
+ assert(state->li_length == 0
+ || TV_LIST_ITEM_TV(state->li)->vval.v_string != NULL);
for (size_t i = state->offset; i < state->li_length && p < buf_end; i++) {
- const char ch = (char) state->li->li_tv.vval.v_string[state->offset++];
- *p++ = (char) ((char) ch == (char) NL ? (char) NUL : (char) ch);
+ assert(TV_LIST_ITEM_TV(state->li)->vval.v_string != NULL);
+ const char ch = (char)(
+ TV_LIST_ITEM_TV(state->li)->vval.v_string[state->offset++]);
+ *p++ = (char)((char)ch == (char)NL ? (char)NUL : (char)ch);
}
if (p < buf_end) {
- state->li = state->li->li_next;
+ state->li = TV_LIST_ITEM_NEXT(state->list, state->li);
if (state->li == NULL) {
*read_bytes = (size_t) (p - buf);
return OK;
}
*p++ = NL;
- if (state->li->li_tv.v_type != VAR_STRING) {
- *read_bytes = (size_t) (p - buf);
+ if (TV_LIST_ITEM_TV(state->li)->v_type != VAR_STRING) {
+ *read_bytes = (size_t)(p - buf);
return FAIL;
}
state->offset = 0;
- state->li_length = (state->li->li_tv.vval.v_string == NULL
+ state->li_length = (TV_LIST_ITEM_TV(state->li)->vval.v_string == NULL
? 0
- : STRLEN(state->li->li_tv.vval.v_string));
+ : STRLEN(TV_LIST_ITEM_TV(state->li)->vval.v_string));
}
}
*read_bytes = nbuf;
- return (state->offset < state->li_length || state->li->li_next != NULL
+ return ((state->offset < state->li_length
+ || TV_LIST_ITEM_NEXT(state->list, state->li) != NULL)
? NOTDONE
: OK);
}
-#define TYPVAL_ENCODE_CONV_STRING(buf, len) \
+#define TYPVAL_ENCODE_CONV_STRING(tv, buf, len) \
do { \
const char *const buf_ = (const char *) buf; \
if (buf == NULL) { \
@@ -263,29 +302,29 @@ int encode_read_from_list(ListReaderState *const state, char *const buf,
const size_t len_ = (len); \
ga_grow(gap, (int) (2 + len_ + memcnt(buf_, '\'', len_))); \
ga_append(gap, '\''); \
- for (size_t i = 0; i < len_; i++) { \
- if (buf_[i] == '\'') { \
+ for (size_t i_ = 0; i_ < len_; i_++) { \
+ if (buf_[i_] == '\'') { \
ga_append(gap, '\''); \
} \
- ga_append(gap, buf_[i]); \
+ ga_append(gap, buf_[i_]); \
} \
ga_append(gap, '\''); \
} \
} while (0)
-#define TYPVAL_ENCODE_CONV_STR_STRING(buf, len) \
- TYPVAL_ENCODE_CONV_STRING(buf, len)
+#define TYPVAL_ENCODE_CONV_STR_STRING(tv, buf, len) \
+ TYPVAL_ENCODE_CONV_STRING(tv, buf, len)
-#define TYPVAL_ENCODE_CONV_EXT_STRING(buf, len, type)
+#define TYPVAL_ENCODE_CONV_EXT_STRING(tv, buf, len, type)
-#define TYPVAL_ENCODE_CONV_NUMBER(num) \
+#define TYPVAL_ENCODE_CONV_NUMBER(tv, num) \
do { \
char numbuf[NUMBUFLEN]; \
vim_snprintf(numbuf, ARRAY_SIZE(numbuf), "%" PRId64, (int64_t) (num)); \
ga_concat(gap, numbuf); \
} while (0)
-#define TYPVAL_ENCODE_CONV_FLOAT(flt) \
+#define TYPVAL_ENCODE_CONV_FLOAT(tv, flt) \
do { \
const float_T flt_ = (flt); \
switch (fpclassify(flt_)) { \
@@ -308,49 +347,75 @@ int encode_read_from_list(ListReaderState *const state, char *const buf,
} \
} while (0)
-#define TYPVAL_ENCODE_CONV_FUNC(fun) \
+#define TYPVAL_ENCODE_CONV_FUNC_START(tv, fun) \
+ do { \
+ const char *const fun_ = (const char *)(fun); \
+ if (fun_ == NULL) { \
+ internal_error("string(): NULL function name"); \
+ ga_concat(gap, "function(NULL"); \
+ } else { \
+ ga_concat(gap, "function("); \
+ TYPVAL_ENCODE_CONV_STRING(tv, fun_, strlen(fun_)); \
+ }\
+ } while (0)
+
+#define TYPVAL_ENCODE_CONV_FUNC_BEFORE_ARGS(tv, len) \
+ do { \
+ if (len != 0) { \
+ ga_concat(gap, ", "); \
+ } \
+ } while (0)
+
+#define TYPVAL_ENCODE_CONV_FUNC_BEFORE_SELF(tv, len) \
do { \
- ga_concat(gap, "function("); \
- TYPVAL_ENCODE_CONV_STRING(fun, STRLEN(fun)); \
- ga_append(gap, ')'); \
+ if ((ptrdiff_t)len != -1) { \
+ ga_concat(gap, ", "); \
+ } \
} while (0)
-#define TYPVAL_ENCODE_CONV_EMPTY_LIST() \
+#define TYPVAL_ENCODE_CONV_FUNC_END(tv) \
+ ga_append(gap, ')')
+
+#define TYPVAL_ENCODE_CONV_EMPTY_LIST(tv) \
ga_concat(gap, "[]")
-#define TYPVAL_ENCODE_CONV_LIST_START(len) \
+#define TYPVAL_ENCODE_CONV_LIST_START(tv, len) \
ga_append(gap, '[')
-#define TYPVAL_ENCODE_CONV_EMPTY_DICT() \
+#define TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START(tv, mpsv)
+
+#define TYPVAL_ENCODE_CONV_EMPTY_DICT(tv, dict) \
ga_concat(gap, "{}")
-#define TYPVAL_ENCODE_CONV_NIL() \
+#define TYPVAL_ENCODE_CONV_NIL(tv) \
ga_concat(gap, "v:null")
-#define TYPVAL_ENCODE_CONV_BOOL(num) \
+#define TYPVAL_ENCODE_CONV_BOOL(tv, num) \
ga_concat(gap, ((num)? "v:true": "v:false"))
-#define TYPVAL_ENCODE_CONV_UNSIGNED_NUMBER(num)
+#define TYPVAL_ENCODE_CONV_UNSIGNED_NUMBER(tv, num)
-#define TYPVAL_ENCODE_CONV_DICT_START(len) \
+#define TYPVAL_ENCODE_CONV_DICT_START(tv, dict, len) \
ga_append(gap, '{')
-#define TYPVAL_ENCODE_CONV_DICT_END() \
+#define TYPVAL_ENCODE_CONV_REAL_DICT_AFTER_START(tv, dict, mpsv)
+
+#define TYPVAL_ENCODE_CONV_DICT_END(tv, dict) \
ga_append(gap, '}')
-#define TYPVAL_ENCODE_CONV_DICT_AFTER_KEY() \
+#define TYPVAL_ENCODE_CONV_DICT_AFTER_KEY(tv, dict) \
ga_concat(gap, ": ")
-#define TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS() \
+#define TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS(tv, dict) \
ga_concat(gap, ", ")
-#define TYPVAL_ENCODE_CONV_SPECIAL_DICT_KEY_CHECK(label, key)
+#define TYPVAL_ENCODE_SPECIAL_DICT_KEY_CHECK(label, key)
-#define TYPVAL_ENCODE_CONV_LIST_END() \
+#define TYPVAL_ENCODE_CONV_LIST_END(tv) \
ga_append(gap, ']')
-#define TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS() \
- TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS()
+#define TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS(tv) \
+ TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS(tv, NULL)
#define TYPVAL_ENCODE_CONV_RECURSE(val, conv_type) \
do { \
@@ -383,7 +448,15 @@ int encode_read_from_list(ListReaderState *const state, char *const buf,
#define TYPVAL_ENCODE_ALLOW_SPECIALS false
-TYPVAL_ENCODE_DEFINE_CONV_FUNCTIONS(static, string, garray_T *const, gap)
+#define TYPVAL_ENCODE_SCOPE static
+#define TYPVAL_ENCODE_NAME string
+#define TYPVAL_ENCODE_FIRST_ARG_TYPE garray_T *const
+#define TYPVAL_ENCODE_FIRST_ARG_NAME gap
+#include "nvim/eval/typval_encode.c.h"
+#undef TYPVAL_ENCODE_SCOPE
+#undef TYPVAL_ENCODE_NAME
+#undef TYPVAL_ENCODE_FIRST_ARG_TYPE
+#undef TYPVAL_ENCODE_FIRST_ARG_NAME
#undef TYPVAL_ENCODE_CONV_RECURSE
#define TYPVAL_ENCODE_CONV_RECURSE(val, conv_type) \
@@ -413,7 +486,15 @@ TYPVAL_ENCODE_DEFINE_CONV_FUNCTIONS(static, string, garray_T *const, gap)
return OK; \
} while (0)
-TYPVAL_ENCODE_DEFINE_CONV_FUNCTIONS(, echo, garray_T *const, gap)
+#define TYPVAL_ENCODE_SCOPE
+#define TYPVAL_ENCODE_NAME echo
+#define TYPVAL_ENCODE_FIRST_ARG_TYPE garray_T *const
+#define TYPVAL_ENCODE_FIRST_ARG_NAME gap
+#include "nvim/eval/typval_encode.c.h"
+#undef TYPVAL_ENCODE_SCOPE
+#undef TYPVAL_ENCODE_NAME
+#undef TYPVAL_ENCODE_FIRST_ARG_TYPE
+#undef TYPVAL_ENCODE_FIRST_ARG_NAME
#undef TYPVAL_ENCODE_CONV_RECURSE
#define TYPVAL_ENCODE_CONV_RECURSE(val, conv_type) \
@@ -431,15 +512,15 @@ TYPVAL_ENCODE_DEFINE_CONV_FUNCTIONS(, echo, garray_T *const, gap)
#define TYPVAL_ENCODE_ALLOW_SPECIALS true
#undef TYPVAL_ENCODE_CONV_NIL
-#define TYPVAL_ENCODE_CONV_NIL() \
+#define TYPVAL_ENCODE_CONV_NIL(tv) \
ga_concat(gap, "null")
#undef TYPVAL_ENCODE_CONV_BOOL
-#define TYPVAL_ENCODE_CONV_BOOL(num) \
+#define TYPVAL_ENCODE_CONV_BOOL(tv, num) \
ga_concat(gap, ((num)? "true": "false"))
#undef TYPVAL_ENCODE_CONV_UNSIGNED_NUMBER
-#define TYPVAL_ENCODE_CONV_UNSIGNED_NUMBER(num) \
+#define TYPVAL_ENCODE_CONV_UNSIGNED_NUMBER(tv, num) \
do { \
char numbuf[NUMBUFLEN]; \
vim_snprintf(numbuf, ARRAY_SIZE(numbuf), "%" PRIu64, (num)); \
@@ -447,7 +528,7 @@ TYPVAL_ENCODE_DEFINE_CONV_FUNCTIONS(, echo, garray_T *const, gap)
} while (0)
#undef TYPVAL_ENCODE_CONV_FLOAT
-#define TYPVAL_ENCODE_CONV_FLOAT(flt) \
+#define TYPVAL_ENCODE_CONV_FLOAT(tv, flt) \
do { \
const float_T flt_ = (flt); \
switch (fpclassify(flt_)) { \
@@ -468,17 +549,6 @@ TYPVAL_ENCODE_DEFINE_CONV_FUNCTIONS(, echo, garray_T *const, gap)
} \
} while (0)
-/// Last used p_enc value
-///
-/// Generic pointer: it is not used as a string, only pointer comparisons are
-/// performed. Must not be freed.
-static const void *last_p_enc = NULL;
-
-/// Conversion setup for converting from last_p_enc to UTF-8
-static vimconv_T p_enc_conv = {
- .vc_type = CONV_NONE,
-};
-
/// Escape sequences used in JSON
static const char escapes[][3] = {
[BS] = "\\b",
@@ -510,33 +580,15 @@ static inline int convert_to_json_string(garray_T *const gap,
} else {
size_t utf_len = len;
char *tofree = NULL;
- if (last_p_enc != (const void *) p_enc) {
- p_enc_conv.vc_type = CONV_NONE;
- convert_setup(&p_enc_conv, p_enc, "utf-8");
- p_enc_conv.vc_fail = true;
- last_p_enc = p_enc;
- }
- if (p_enc_conv.vc_type != CONV_NONE) {
- tofree = string_convert(&p_enc_conv, buf, &utf_len);
- if (tofree == NULL) {
- emsgf(_("E474: Failed to convert string \"%.*s\" to UTF-8"),
- utf_len, utf_buf);
- return FAIL;
- }
- utf_buf = tofree;
- }
size_t str_len = 0;
- // Encode character as \u0000 if
- // 1. It is an ASCII control character (0x0 .. 0x1F, 0x7F).
- // 2. &encoding is not UTF-8 and code point is above 0x7F.
- // 3. &encoding is UTF-8 and code point is not printable according to
- // utf_printable().
- // This is done to make it possible to :echo values when &encoding is not
- // UTF-8.
-#define ENCODE_RAW(p_enc_conv, ch) \
- (ch >= 0x20 && (p_enc_conv.vc_type == CONV_NONE \
- ? utf_printable(ch) \
- : ch < 0x7F))
+ // Encode character as \uNNNN if
+ // 1. It is an ASCII control character (0x0 .. 0x1F; 0x7F not
+ // utf_printable and thus not checked specially).
+ // 2. Code point is not printable according to utf_printable().
+ // This is done to make resulting values displayable on screen also not from
+ // Neovim.
+#define ENCODE_RAW(ch) \
+ (ch >= 0x20 && utf_printable(ch))
for (size_t i = 0; i < utf_len;) {
const int ch = utf_ptr2char(utf_buf + i);
const size_t shift = (ch == 0? 1: utf_ptr2len(utf_buf + i));
@@ -557,17 +609,17 @@ static inline int convert_to_json_string(garray_T *const gap,
if (ch > 0x7F && shift == 1) {
emsgf(_("E474: String \"%.*s\" contains byte that does not start "
"any UTF-8 character"),
- utf_len - (i - shift), utf_buf + i - shift);
+ (int)(utf_len - (i - shift)), utf_buf + i - shift);
xfree(tofree);
return FAIL;
} else if ((SURROGATE_HI_START <= ch && ch <= SURROGATE_HI_END)
|| (SURROGATE_LO_START <= ch && ch <= SURROGATE_LO_END)) {
emsgf(_("E474: UTF-8 string contains code point which belongs "
"to a surrogate pair: %.*s"),
- utf_len - (i - shift), utf_buf + i - shift);
+ (int)(utf_len - (i - shift)), utf_buf + i - shift);
xfree(tofree);
return FAIL;
- } else if (ENCODE_RAW(p_enc_conv, ch)) {
+ } else if (ENCODE_RAW(ch)) {
str_len += shift;
} else {
str_len += ((sizeof("\\u1234") - 1)
@@ -597,7 +649,7 @@ static inline int convert_to_json_string(garray_T *const gap,
break;
}
default: {
- if (ENCODE_RAW(p_enc_conv, ch)) {
+ if (ENCODE_RAW(ch)) {
ga_concat_len(gap, utf_buf + i, shift);
} else if (ch < SURROGATE_FIRST_CHAR) {
ga_concat_len(gap, ((const char[]) {
@@ -636,7 +688,7 @@ static inline int convert_to_json_string(garray_T *const gap,
}
#undef TYPVAL_ENCODE_CONV_STRING
-#define TYPVAL_ENCODE_CONV_STRING(buf, len) \
+#define TYPVAL_ENCODE_CONV_STRING(tv, buf, len) \
do { \
if (convert_to_json_string(gap, (const char *) (buf), (len)) != OK) { \
return FAIL; \
@@ -644,15 +696,15 @@ static inline int convert_to_json_string(garray_T *const gap,
} while (0)
#undef TYPVAL_ENCODE_CONV_EXT_STRING
-#define TYPVAL_ENCODE_CONV_EXT_STRING(buf, len, type) \
+#define TYPVAL_ENCODE_CONV_EXT_STRING(tv, buf, len, type) \
do { \
xfree(buf); \
EMSG(_("E474: Unable to convert EXT string to JSON")); \
return FAIL; \
} while (0)
-#undef TYPVAL_ENCODE_CONV_FUNC
-#define TYPVAL_ENCODE_CONV_FUNC(fun) \
+#undef TYPVAL_ENCODE_CONV_FUNC_START
+#define TYPVAL_ENCODE_CONV_FUNC_START(tv, fun) \
return conv_error(_("E474: Error while dumping %s, %s: " \
"attempt to dump function reference"), \
mpstack, objname)
@@ -675,28 +727,27 @@ bool encode_check_json_key(const typval_T *const tv)
}
const dictitem_T *type_di;
const dictitem_T *val_di;
- if ((type_di = dict_find((dict_T *) spdict, (char_u *) "_TYPE", -1)) == NULL
+ if ((type_di = tv_dict_find(spdict, S_LEN("_TYPE"))) == NULL
|| type_di->di_tv.v_type != VAR_LIST
|| (type_di->di_tv.vval.v_list != eval_msgpack_type_lists[kMPString]
&& type_di->di_tv.vval.v_list != eval_msgpack_type_lists[kMPBinary])
- || (val_di = dict_find((dict_T *) spdict, (char_u *) "_VAL", -1)) == NULL
+ || (val_di = tv_dict_find(spdict, S_LEN("_VAL"))) == NULL
|| val_di->di_tv.v_type != VAR_LIST) {
return false;
}
if (val_di->di_tv.vval.v_list == NULL) {
return true;
}
- for (const listitem_T *li = val_di->di_tv.vval.v_list->lv_first;
- li != NULL; li = li->li_next) {
- if (li->li_tv.v_type != VAR_STRING) {
+ TV_LIST_ITER_CONST(val_di->di_tv.vval.v_list, li, {
+ if (TV_LIST_ITEM_TV(li)->v_type != VAR_STRING) {
return false;
}
- }
+ });
return true;
}
-#undef TYPVAL_ENCODE_CONV_SPECIAL_DICT_KEY_CHECK
-#define TYPVAL_ENCODE_CONV_SPECIAL_DICT_KEY_CHECK(label, key) \
+#undef TYPVAL_ENCODE_SPECIAL_DICT_KEY_CHECK
+#define TYPVAL_ENCODE_SPECIAL_DICT_KEY_CHECK(label, key) \
do { \
if (!encode_check_json_key(&key)) { \
EMSG(_("E474: Invalid key in special dictionary")); \
@@ -704,25 +755,38 @@ bool encode_check_json_key(const typval_T *const tv)
} \
} while (0)
-TYPVAL_ENCODE_DEFINE_CONV_FUNCTIONS(static, json, garray_T *const, gap)
+#define TYPVAL_ENCODE_SCOPE static
+#define TYPVAL_ENCODE_NAME json
+#define TYPVAL_ENCODE_FIRST_ARG_TYPE garray_T *const
+#define TYPVAL_ENCODE_FIRST_ARG_NAME gap
+#include "nvim/eval/typval_encode.c.h"
+#undef TYPVAL_ENCODE_SCOPE
+#undef TYPVAL_ENCODE_NAME
+#undef TYPVAL_ENCODE_FIRST_ARG_TYPE
+#undef TYPVAL_ENCODE_FIRST_ARG_NAME
#undef TYPVAL_ENCODE_CONV_STRING
#undef TYPVAL_ENCODE_CONV_STR_STRING
#undef TYPVAL_ENCODE_CONV_EXT_STRING
#undef TYPVAL_ENCODE_CONV_NUMBER
#undef TYPVAL_ENCODE_CONV_FLOAT
-#undef TYPVAL_ENCODE_CONV_FUNC
+#undef TYPVAL_ENCODE_CONV_FUNC_START
+#undef TYPVAL_ENCODE_CONV_FUNC_BEFORE_ARGS
+#undef TYPVAL_ENCODE_CONV_FUNC_BEFORE_SELF
+#undef TYPVAL_ENCODE_CONV_FUNC_END
#undef TYPVAL_ENCODE_CONV_EMPTY_LIST
#undef TYPVAL_ENCODE_CONV_LIST_START
+#undef TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START
#undef TYPVAL_ENCODE_CONV_EMPTY_DICT
#undef TYPVAL_ENCODE_CONV_NIL
#undef TYPVAL_ENCODE_CONV_BOOL
#undef TYPVAL_ENCODE_CONV_UNSIGNED_NUMBER
#undef TYPVAL_ENCODE_CONV_DICT_START
+#undef TYPVAL_ENCODE_CONV_REAL_DICT_AFTER_START
#undef TYPVAL_ENCODE_CONV_DICT_END
#undef TYPVAL_ENCODE_CONV_DICT_AFTER_KEY
#undef TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS
-#undef TYPVAL_ENCODE_CONV_SPECIAL_DICT_KEY_CHECK
+#undef TYPVAL_ENCODE_SPECIAL_DICT_KEY_CHECK
#undef TYPVAL_ENCODE_CONV_LIST_END
#undef TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS
#undef TYPVAL_ENCODE_CONV_RECURSE
@@ -740,7 +804,10 @@ char *encode_tv2string(typval_T *tv, size_t *len)
{
garray_T ga;
ga_init(&ga, (int)sizeof(char), 80);
- encode_vim_to_string(&ga, tv, "encode_tv2string() argument");
+ const int evs_ret = encode_vim_to_string(&ga, tv,
+ N_("encode_tv2string() argument"));
+ (void)evs_ret;
+ assert(evs_ret == OK);
did_echo_string_emsg = false;
if (len != NULL) {
*len = (size_t) ga.ga_len;
@@ -766,7 +833,9 @@ char *encode_tv2echo(typval_T *tv, size_t *len)
ga_concat(&ga, tv->vval.v_string);
}
} else {
- encode_vim_to_echo(&ga, tv, ":echo argument");
+ const int eve_ret = encode_vim_to_echo(&ga, tv, N_(":echo argument"));
+ (void)eve_ret;
+ assert(eve_ret == OK);
}
if (len != NULL) {
*len = (size_t) ga.ga_len;
@@ -787,16 +856,20 @@ char *encode_tv2json(typval_T *tv, size_t *len)
{
garray_T ga;
ga_init(&ga, (int)sizeof(char), 80);
- encode_vim_to_json(&ga, tv, "encode_tv2json() argument");
+ const int evj_ret = encode_vim_to_json(&ga, tv,
+ N_("encode_tv2json() argument"));
+ if (!evj_ret) {
+ ga_clear(&ga);
+ }
did_echo_string_emsg = false;
if (len != NULL) {
- *len = (size_t) ga.ga_len;
+ *len = (size_t)ga.ga_len;
}
ga_append(&ga, '\0');
- return (char *) ga.ga_data;
+ return (char *)ga.ga_data;
}
-#define TYPVAL_ENCODE_CONV_STRING(buf, len) \
+#define TYPVAL_ENCODE_CONV_STRING(tv, buf, len) \
do { \
if (buf == NULL) { \
msgpack_pack_bin(packer, 0); \
@@ -807,7 +880,7 @@ char *encode_tv2json(typval_T *tv, size_t *len)
} \
} while (0)
-#define TYPVAL_ENCODE_CONV_STR_STRING(buf, len) \
+#define TYPVAL_ENCODE_CONV_STR_STRING(tv, buf, len) \
do { \
if (buf == NULL) { \
msgpack_pack_str(packer, 0); \
@@ -818,7 +891,7 @@ char *encode_tv2json(typval_T *tv, size_t *len)
} \
} while (0)
-#define TYPVAL_ENCODE_CONV_EXT_STRING(buf, len, type) \
+#define TYPVAL_ENCODE_CONV_EXT_STRING(tv, buf, len, type) \
do { \
if (buf == NULL) { \
msgpack_pack_ext(packer, 0, (int8_t) type); \
@@ -829,82 +902,103 @@ char *encode_tv2json(typval_T *tv, size_t *len)
} \
} while (0)
-#define TYPVAL_ENCODE_CONV_NUMBER(num) \
- msgpack_pack_int64(packer, (int64_t) (num))
+#define TYPVAL_ENCODE_CONV_NUMBER(tv, num) \
+ msgpack_pack_int64(packer, (int64_t)(num))
-#define TYPVAL_ENCODE_CONV_FLOAT(flt) \
- msgpack_pack_double(packer, (double) (flt))
+#define TYPVAL_ENCODE_CONV_FLOAT(tv, flt) \
+ msgpack_pack_double(packer, (double)(flt))
-#define TYPVAL_ENCODE_CONV_FUNC(fun) \
- return conv_error(_("E951: Error while dumping %s, %s: " \
+#define TYPVAL_ENCODE_CONV_FUNC_START(tv, fun) \
+ return conv_error(_("E5004: Error while dumping %s, %s: " \
"attempt to dump function reference"), \
mpstack, objname)
-#define TYPVAL_ENCODE_CONV_EMPTY_LIST() \
+#define TYPVAL_ENCODE_CONV_FUNC_BEFORE_ARGS(tv, len)
+#define TYPVAL_ENCODE_CONV_FUNC_BEFORE_SELF(tv, len)
+#define TYPVAL_ENCODE_CONV_FUNC_END(tv)
+
+#define TYPVAL_ENCODE_CONV_EMPTY_LIST(tv) \
msgpack_pack_array(packer, 0)
-#define TYPVAL_ENCODE_CONV_LIST_START(len) \
- msgpack_pack_array(packer, (size_t) (len))
+#define TYPVAL_ENCODE_CONV_LIST_START(tv, len) \
+ msgpack_pack_array(packer, (size_t)(len))
-#define TYPVAL_ENCODE_CONV_EMPTY_DICT() \
+#define TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START(tv, mpsv)
+
+#define TYPVAL_ENCODE_CONV_EMPTY_DICT(tv, dict) \
msgpack_pack_map(packer, 0)
-#define TYPVAL_ENCODE_CONV_NIL() \
+#define TYPVAL_ENCODE_CONV_NIL(tv) \
msgpack_pack_nil(packer)
-#define TYPVAL_ENCODE_CONV_BOOL(num) \
+#define TYPVAL_ENCODE_CONV_BOOL(tv, num) \
do { \
- if ((num)) { \
+ if (num) { \
msgpack_pack_true(packer); \
} else { \
msgpack_pack_false(packer); \
} \
} while (0)
-#define TYPVAL_ENCODE_CONV_UNSIGNED_NUMBER(num) \
+#define TYPVAL_ENCODE_CONV_UNSIGNED_NUMBER(tv, num) \
msgpack_pack_uint64(packer, (num))
-#define TYPVAL_ENCODE_CONV_DICT_START(len) \
- msgpack_pack_map(packer, (size_t) (len))
+#define TYPVAL_ENCODE_CONV_DICT_START(tv, dict, len) \
+ msgpack_pack_map(packer, (size_t)(len))
+
+#define TYPVAL_ENCODE_CONV_REAL_DICT_AFTER_START(tv, dict, mpsv)
-#define TYPVAL_ENCODE_CONV_DICT_END()
+#define TYPVAL_ENCODE_CONV_DICT_END(tv, dict)
-#define TYPVAL_ENCODE_CONV_DICT_AFTER_KEY()
+#define TYPVAL_ENCODE_CONV_DICT_AFTER_KEY(tv, dict)
-#define TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS()
+#define TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS(tv, dict)
-#define TYPVAL_ENCODE_CONV_SPECIAL_DICT_KEY_CHECK(label, key)
+#define TYPVAL_ENCODE_SPECIAL_DICT_KEY_CHECK(label, key)
-#define TYPVAL_ENCODE_CONV_LIST_END()
+#define TYPVAL_ENCODE_CONV_LIST_END(tv)
-#define TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS()
+#define TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS(tv)
#define TYPVAL_ENCODE_CONV_RECURSE(val, conv_type) \
- return conv_error(_("E952: Unable to dump %s: " \
+ return conv_error(_("E5005: Unable to dump %s: " \
"container references itself in %s"), \
mpstack, objname)
#define TYPVAL_ENCODE_ALLOW_SPECIALS true
-TYPVAL_ENCODE_DEFINE_CONV_FUNCTIONS(, msgpack, msgpack_packer *const, packer)
+#define TYPVAL_ENCODE_SCOPE
+#define TYPVAL_ENCODE_NAME msgpack
+#define TYPVAL_ENCODE_FIRST_ARG_TYPE msgpack_packer *const
+#define TYPVAL_ENCODE_FIRST_ARG_NAME packer
+#include "nvim/eval/typval_encode.c.h"
+#undef TYPVAL_ENCODE_SCOPE
+#undef TYPVAL_ENCODE_NAME
+#undef TYPVAL_ENCODE_FIRST_ARG_TYPE
+#undef TYPVAL_ENCODE_FIRST_ARG_NAME
#undef TYPVAL_ENCODE_CONV_STRING
#undef TYPVAL_ENCODE_CONV_STR_STRING
#undef TYPVAL_ENCODE_CONV_EXT_STRING
#undef TYPVAL_ENCODE_CONV_NUMBER
#undef TYPVAL_ENCODE_CONV_FLOAT
-#undef TYPVAL_ENCODE_CONV_FUNC
+#undef TYPVAL_ENCODE_CONV_FUNC_START
+#undef TYPVAL_ENCODE_CONV_FUNC_BEFORE_ARGS
+#undef TYPVAL_ENCODE_CONV_FUNC_BEFORE_SELF
+#undef TYPVAL_ENCODE_CONV_FUNC_END
#undef TYPVAL_ENCODE_CONV_EMPTY_LIST
#undef TYPVAL_ENCODE_CONV_LIST_START
+#undef TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START
#undef TYPVAL_ENCODE_CONV_EMPTY_DICT
#undef TYPVAL_ENCODE_CONV_NIL
#undef TYPVAL_ENCODE_CONV_BOOL
#undef TYPVAL_ENCODE_CONV_UNSIGNED_NUMBER
#undef TYPVAL_ENCODE_CONV_DICT_START
+#undef TYPVAL_ENCODE_CONV_REAL_DICT_AFTER_START
#undef TYPVAL_ENCODE_CONV_DICT_END
#undef TYPVAL_ENCODE_CONV_DICT_AFTER_KEY
#undef TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS
-#undef TYPVAL_ENCODE_CONV_SPECIAL_DICT_KEY_CHECK
+#undef TYPVAL_ENCODE_SPECIAL_DICT_KEY_CHECK
#undef TYPVAL_ENCODE_CONV_LIST_END
#undef TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS
#undef TYPVAL_ENCODE_CONV_RECURSE
diff --git a/src/nvim/eval/encode.h b/src/nvim/eval/encode.h
index 9bc665253b..ccea245ab3 100644
--- a/src/nvim/eval/encode.h
+++ b/src/nvim/eval/encode.h
@@ -33,9 +33,10 @@ int encode_vim_to_echo(garray_T *const packer,
/// Structure defining state for read_from_list()
typedef struct {
+ const list_T *const list; ///< List being currently read.
const listitem_T *li; ///< Item currently read.
- size_t offset; ///< Byte offset inside the read item.
- size_t li_length; ///< Length of the string inside the read item.
+ size_t offset; ///< Byte offset inside the read item.
+ size_t li_length; ///< Length of the string inside the read item.
} ListReaderState;
/// Initialize ListReaderState structure
@@ -43,11 +44,13 @@ static inline ListReaderState encode_init_lrstate(const list_T *const list)
FUNC_ATTR_NONNULL_ALL
{
return (ListReaderState) {
- .li = list->lv_first,
+ .list = list,
+ .li = tv_list_first(list),
.offset = 0,
- .li_length = (list->lv_first->li_tv.vval.v_string == NULL
+ .li_length = (TV_LIST_ITEM_TV(tv_list_first(list))->vval.v_string == NULL
? 0
- : STRLEN(list->lv_first->li_tv.vval.v_string)),
+ : STRLEN(TV_LIST_ITEM_TV(
+ tv_list_first(list))->vval.v_string)),
};
}
diff --git a/src/nvim/eval/executor.c b/src/nvim/eval/executor.c
new file mode 100644
index 0000000000..99298cbbcf
--- /dev/null
+++ b/src/nvim/eval/executor.c
@@ -0,0 +1,118 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+#include "nvim/eval/typval.h"
+#include "nvim/eval/executor.h"
+#include "nvim/eval.h"
+#include "nvim/message.h"
+#include "nvim/vim.h"
+#include "nvim/globals.h"
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "eval/executor.c.generated.h"
+#endif
+
+static char *e_letwrong = N_("E734: Wrong variable type for %s=");
+
+char *e_listidx = N_("E684: list index out of range: %" PRId64);
+
+/// Hanle tv1 += tv2, -=, .=
+///
+/// @param[in,out] tv1 First operand, modified typval.
+/// @param[in] tv2 Second operand.
+/// @param[in] op Used operator.
+///
+/// @return OK or FAIL.
+int eexe_mod_op(typval_T *const tv1, const typval_T *const tv2,
+ const char *const op)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NO_SANITIZE_UNDEFINED
+{
+ // Can't do anything with a Funcref, a Dict or special value on the right.
+ if (tv2->v_type != VAR_FUNC && tv2->v_type != VAR_DICT) {
+ switch (tv1->v_type) {
+ case VAR_DICT:
+ case VAR_FUNC:
+ case VAR_PARTIAL:
+ case VAR_SPECIAL: {
+ break;
+ }
+ case VAR_LIST: {
+ if (*op != '+' || tv2->v_type != VAR_LIST) {
+ break;
+ }
+ // List += List
+ if (tv1->vval.v_list != NULL && tv2->vval.v_list != NULL) {
+ tv_list_extend(tv1->vval.v_list, tv2->vval.v_list, NULL);
+ }
+ return OK;
+ }
+ case VAR_NUMBER:
+ case VAR_STRING: {
+ if (tv2->v_type == VAR_LIST) {
+ break;
+ }
+ if (*op == '+' || *op == '-') {
+ // nr += nr or nr -= nr
+ varnumber_T n = tv_get_number(tv1);
+ if (tv2->v_type == VAR_FLOAT) {
+ float_T f = (float_T)n;
+
+ if (*op == '+') {
+ f += tv2->vval.v_float;
+ } else {
+ f -= tv2->vval.v_float;
+ }
+ tv_clear(tv1);
+ tv1->v_type = VAR_FLOAT;
+ tv1->vval.v_float = f;
+ } else {
+ if (*op == '+') {
+ n += tv_get_number(tv2);
+ } else {
+ n -= tv_get_number(tv2);
+ }
+ tv_clear(tv1);
+ tv1->v_type = VAR_NUMBER;
+ tv1->vval.v_number = n;
+ }
+ } else {
+ // str .= str
+ if (tv2->v_type == VAR_FLOAT) {
+ break;
+ }
+ const char *tvs = tv_get_string(tv1);
+ char numbuf[NUMBUFLEN];
+ char *const s = (char *)concat_str(
+ (const char_u *)tvs, (const char_u *)tv_get_string_buf(tv2,
+ numbuf));
+ tv_clear(tv1);
+ tv1->v_type = VAR_STRING;
+ tv1->vval.v_string = (char_u *)s;
+ }
+ return OK;
+ }
+ case VAR_FLOAT: {
+ if (*op == '.' || (tv2->v_type != VAR_FLOAT
+ && tv2->v_type != VAR_NUMBER
+ && tv2->v_type != VAR_STRING)) {
+ break;
+ }
+ const float_T f = (tv2->v_type == VAR_FLOAT
+ ? tv2->vval.v_float
+ : (float_T)tv_get_number(tv2));
+ if (*op == '+') {
+ tv1->vval.v_float += f;
+ } else {
+ tv1->vval.v_float -= f;
+ }
+ return OK;
+ }
+ case VAR_UNKNOWN: {
+ assert(false);
+ }
+ }
+ }
+
+ EMSG2(_(e_letwrong), op);
+ return FAIL;
+}
diff --git a/src/nvim/eval/executor.h b/src/nvim/eval/executor.h
new file mode 100644
index 0000000000..3d789f76a5
--- /dev/null
+++ b/src/nvim/eval/executor.h
@@ -0,0 +1,11 @@
+#ifndef NVIM_EVAL_EXECUTOR_H
+#define NVIM_EVAL_EXECUTOR_H
+
+#include "nvim/eval/typval.h"
+
+extern char *e_listidx;
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "eval/executor.h.generated.h"
+#endif
+#endif // NVIM_EVAL_EXECUTOR_H
diff --git a/src/nvim/eval/gc.c b/src/nvim/eval/gc.c
new file mode 100644
index 0000000000..2bbf78d827
--- /dev/null
+++ b/src/nvim/eval/gc.c
@@ -0,0 +1,14 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+#include "nvim/eval/typval.h"
+#include "nvim/eval/gc.h"
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "eval/gc.c.generated.h"
+#endif
+
+/// Head of list of all dictionaries
+dict_T *gc_first_dict = NULL;
+/// Head of list of all lists
+list_T *gc_first_list = NULL;
diff --git a/src/nvim/eval/gc.h b/src/nvim/eval/gc.h
new file mode 100644
index 0000000000..c2e862e469
--- /dev/null
+++ b/src/nvim/eval/gc.h
@@ -0,0 +1,12 @@
+#ifndef NVIM_EVAL_GC_H
+#define NVIM_EVAL_GC_H
+
+#include "nvim/eval/typval.h"
+
+extern dict_T *gc_first_dict;
+extern list_T *gc_first_list;
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "eval/gc.h.generated.h"
+#endif
+#endif // NVIM_EVAL_GC_H
diff --git a/src/nvim/eval/typval.c b/src/nvim/eval/typval.c
new file mode 100644
index 0000000000..912aecafec
--- /dev/null
+++ b/src/nvim/eval/typval.c
@@ -0,0 +1,2912 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+#include <stdio.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <stdbool.h>
+
+#include "nvim/lib/queue.h"
+#include "nvim/eval/typval.h"
+#include "nvim/eval/gc.h"
+#include "nvim/eval/executor.h"
+#include "nvim/eval/encode.h"
+#include "nvim/eval/typval_encode.h"
+#include "nvim/eval.h"
+#include "nvim/types.h"
+#include "nvim/assert.h"
+#include "nvim/memory.h"
+#include "nvim/globals.h"
+#include "nvim/hashtab.h"
+#include "nvim/vim.h"
+#include "nvim/ascii.h"
+#include "nvim/pos.h"
+#include "nvim/charset.h"
+#include "nvim/garray.h"
+#include "nvim/gettext.h"
+#include "nvim/macros.h"
+#include "nvim/mbyte.h"
+#include "nvim/message.h"
+// TODO(ZyX-I): Move line_breakcheck out of misc1
+#include "nvim/misc1.h" // For line_breakcheck
+#include "nvim/os/fileio.h"
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "eval/typval.c.generated.h"
+#endif
+
+bool tv_in_free_unref_items = false;
+
+// TODO(ZyX-I): Remove DICT_MAXNEST, make users be non-recursive instead
+
+#define DICT_MAXNEST 100
+
+const char *const tv_empty_string = "";
+
+//{{{1 Lists
+//{{{2 List log
+#ifdef LOG_LIST_ACTIONS
+ListLog *list_log_first = NULL;
+ListLog *list_log_last = NULL;
+
+/// Write list log to the given file
+///
+/// @param[in] fname File to write log to. Will be appended to if already
+/// present.
+void list_write_log(const char *const fname)
+ FUNC_ATTR_NONNULL_ALL
+{
+ FileDescriptor fp;
+ const int fo_ret = file_open(&fp, fname, kFileCreate|kFileAppend, 0600);
+ if (fo_ret != 0) {
+ emsgf(_("E5142: Failed to open file %s: %s"), fname, os_strerror(fo_ret));
+ return;
+ }
+ for (ListLog *chunk = list_log_first; chunk != NULL;) {
+ for (size_t i = 0; i < chunk->size; i++) {
+ char buf[10 + 1 + ((16 + 3) * 3) + (8 + 2) + 2];
+ // act : hex " c:" len "[]" "\n\0"
+ const ListLogEntry entry = chunk->entries[i];
+ const size_t snp_len = (size_t)snprintf(
+ buf, sizeof(buf),
+ "%-10.10s: l:%016" PRIxPTR "[%08d] 1:%016" PRIxPTR " 2:%016" PRIxPTR
+ "\n",
+ entry.action, entry.l, entry.len, entry.li1, entry.li2);
+ assert(snp_len + 1 == sizeof(buf));
+ const ptrdiff_t fw_ret = file_write(&fp, buf, snp_len);
+ if (fw_ret != (ptrdiff_t)snp_len) {
+ assert(fw_ret < 0);
+ if (i) {
+ memmove(chunk->entries, chunk->entries + i,
+ sizeof(chunk->entries[0]) * (chunk->size - i));
+ chunk->size -= i;
+ }
+ emsgf(_("E5143: Failed to write to file %s: %s"),
+ fname, os_strerror((int)fw_ret));
+ return;
+ }
+ }
+ list_log_first = chunk->next;
+ xfree(chunk);
+ chunk = list_log_first;
+ }
+ const int fc_ret = file_close(&fp, true);
+ if (fc_ret != 0) {
+ emsgf(_("E5144: Failed to close file %s: %s"), fname, os_strerror(fc_ret));
+ }
+}
+
+#ifdef EXITFREE
+/// Free list log
+void list_free_log(void)
+{
+ for (ListLog *chunk = list_log_first; chunk != NULL;) {
+ list_log_first = chunk->next;
+ xfree(chunk);
+ chunk = list_log_first;
+ }
+}
+#endif
+#endif
+//{{{2 List item
+
+/// Allocate a list item
+///
+/// @warning Allocated item is not initialized, do not forget to initialize it
+/// and specifically set lv_lock.
+///
+/// @return [allocated] new list item.
+static listitem_T *tv_list_item_alloc(void)
+ FUNC_ATTR_NONNULL_RET FUNC_ATTR_MALLOC
+{
+ return xmalloc(sizeof(listitem_T));
+}
+
+/// Remove a list item from a List and free it
+///
+/// Also clears the value.
+///
+/// @param[out] l List to remove item from.
+/// @param[in,out] item Item to remove.
+///
+/// @return Pointer to the list item just after removed one, NULL if removed
+/// item was the last one.
+listitem_T *tv_list_item_remove(list_T *const l, listitem_T *const item)
+ FUNC_ATTR_NONNULL_ALL
+{
+ listitem_T *const next_item = TV_LIST_ITEM_NEXT(l, item);
+ tv_list_drop_items(l, item, item);
+ tv_clear(TV_LIST_ITEM_TV(item));
+ xfree(item);
+ return next_item;
+}
+
+//{{{2 List watchers
+
+/// Add a watcher to a list
+///
+/// @param[out] l List to add watcher to.
+/// @param[in] lw Watcher to add.
+void tv_list_watch_add(list_T *const l, listwatch_T *const lw)
+ FUNC_ATTR_NONNULL_ALL
+{
+ lw->lw_next = l->lv_watch;
+ l->lv_watch = lw;
+}
+
+/// Remove a watcher from a list
+///
+/// Does not give a warning if watcher was not found.
+///
+/// @param[out] l List to remove watcher from.
+/// @param[in] lwrem Watcher to remove.
+void tv_list_watch_remove(list_T *const l, listwatch_T *const lwrem)
+ FUNC_ATTR_NONNULL_ALL
+{
+ listwatch_T **lwp = &l->lv_watch;
+ for (listwatch_T *lw = l->lv_watch; lw != NULL; lw = lw->lw_next) {
+ if (lw == lwrem) {
+ *lwp = lw->lw_next;
+ break;
+ }
+ lwp = &lw->lw_next;
+ }
+}
+
+/// Advance watchers to the next item
+///
+/// Used just before removing an item from a list.
+///
+/// @param[out] l List from which item is removed.
+/// @param[in] item List item being removed.
+void tv_list_watch_fix(list_T *const l, const listitem_T *const item)
+ FUNC_ATTR_NONNULL_ALL
+{
+ for (listwatch_T *lw = l->lv_watch; lw != NULL; lw = lw->lw_next) {
+ if (lw->lw_item == item) {
+ lw->lw_item = item->li_next;
+ }
+ }
+}
+
+//{{{2 Alloc/free
+
+/// Allocate an empty list
+///
+/// Caller should take care of the reference count.
+///
+/// @param[in] len Expected number of items to be populated before list
+/// becomes accessible from VimL. It is still valid to
+/// underpopulate a list, value only controls how many elements
+/// will be allocated in advance. Currently does nothing.
+/// @see ListLenSpecials.
+///
+/// @return [allocated] new list.
+list_T *tv_list_alloc(const ptrdiff_t len)
+ FUNC_ATTR_NONNULL_RET
+{
+ list_T *const list = xcalloc(1, sizeof(list_T));
+
+ // Prepend the list to the list of lists for garbage collection.
+ if (gc_first_list != NULL) {
+ gc_first_list->lv_used_prev = list;
+ }
+ list->lv_used_prev = NULL;
+ list->lv_used_next = gc_first_list;
+ gc_first_list = list;
+ list_log(list, NULL, (void *)(uintptr_t)len, "alloc");
+ return list;
+}
+
+/// Initialize a static list with 10 items
+///
+/// @param[out] sl Static list to initialize.
+void tv_list_init_static10(staticList10_T *const sl)
+ FUNC_ATTR_NONNULL_ALL
+{
+#define SL_SIZE ARRAY_SIZE(sl->sl_items)
+ list_T *const l = &sl->sl_list;
+
+ memset(sl, 0, sizeof(staticList10_T));
+ l->lv_first = &sl->sl_items[0];
+ l->lv_last = &sl->sl_items[SL_SIZE - 1];
+ l->lv_refcount = DO_NOT_FREE_CNT;
+ tv_list_set_lock(l, VAR_FIXED);
+ sl->sl_list.lv_len = 10;
+
+ sl->sl_items[0].li_prev = NULL;
+ sl->sl_items[0].li_next = &sl->sl_items[1];
+ sl->sl_items[SL_SIZE - 1].li_prev = &sl->sl_items[SL_SIZE - 2];
+ sl->sl_items[SL_SIZE - 1].li_next = NULL;
+
+ for (size_t i = 1; i < SL_SIZE - 1; i++) {
+ listitem_T *const li = &sl->sl_items[i];
+ li->li_prev = li - 1;
+ li->li_next = li + 1;
+ }
+ list_log((const list_T *)sl, &sl->sl_items[0], &sl->sl_items[SL_SIZE - 1],
+ "s10init");
+#undef SL_SIZE
+}
+
+/// Initialize static list with undefined number of elements
+///
+/// @param[out] l List to initialize.
+void tv_list_init_static(list_T *const l)
+ FUNC_ATTR_NONNULL_ALL
+{
+ memset(l, 0, sizeof(*l));
+ l->lv_refcount = DO_NOT_FREE_CNT;
+ list_log(l, NULL, NULL, "sinit");
+}
+
+/// Free items contained in a list
+///
+/// @param[in,out] l List to clear.
+void tv_list_free_contents(list_T *const l)
+ FUNC_ATTR_NONNULL_ALL
+{
+ list_log(l, NULL, NULL, "freecont");
+ for (listitem_T *item = l->lv_first; item != NULL; item = l->lv_first) {
+ // Remove the item before deleting it.
+ l->lv_first = item->li_next;
+ tv_clear(&item->li_tv);
+ xfree(item);
+ }
+ l->lv_len = 0;
+ l->lv_idx_item = NULL;
+ l->lv_last = NULL;
+ assert(l->lv_watch == NULL);
+}
+
+/// Free a list itself, ignoring items it contains
+///
+/// Ignores the reference count.
+///
+/// @param[in,out] l List to free.
+void tv_list_free_list(list_T *const l)
+ FUNC_ATTR_NONNULL_ALL
+{
+ // Remove the list from the list of lists for garbage collection.
+ if (l->lv_used_prev == NULL) {
+ gc_first_list = l->lv_used_next;
+ } else {
+ l->lv_used_prev->lv_used_next = l->lv_used_next;
+ }
+ if (l->lv_used_next != NULL) {
+ l->lv_used_next->lv_used_prev = l->lv_used_prev;
+ }
+ list_log(l, NULL, NULL, "freelist");
+
+ xfree(l);
+}
+
+/// Free a list, including all items it points to
+///
+/// Ignores the reference count. Does not do anything if
+/// tv_in_free_unref_items is true.
+///
+/// @param[in,out] l List to free.
+void tv_list_free(list_T *const l)
+ FUNC_ATTR_NONNULL_ALL
+{
+ if (!tv_in_free_unref_items) {
+ tv_list_free_contents(l);
+ tv_list_free_list(l);
+ }
+}
+
+/// Unreference a list
+///
+/// Decrements the reference count and frees when it becomes zero or less.
+///
+/// @param[in,out] l List to unreference.
+void tv_list_unref(list_T *const l)
+{
+ if (l != NULL && --l->lv_refcount <= 0) {
+ tv_list_free(l);
+ }
+}
+
+//{{{2 Add/remove
+
+/// Remove items "item" to "item2" from list "l"
+///
+/// @warning Does not free the listitem or the value!
+///
+/// @param[out] l List to remove from.
+/// @param[in] item First item to remove.
+/// @param[in] item2 Last item to remove.
+void tv_list_drop_items(list_T *const l, listitem_T *const item,
+ listitem_T *const item2)
+ FUNC_ATTR_NONNULL_ALL
+{
+ list_log(l, item, item2, "drop");
+ // Notify watchers.
+ for (listitem_T *ip = item; ip != item2->li_next; ip = ip->li_next) {
+ l->lv_len--;
+ tv_list_watch_fix(l, ip);
+ }
+
+ if (item2->li_next == NULL) {
+ l->lv_last = item->li_prev;
+ } else {
+ item2->li_next->li_prev = item->li_prev;
+ }
+ if (item->li_prev == NULL) {
+ l->lv_first = item2->li_next;
+ } else {
+ item->li_prev->li_next = item2->li_next;
+ }
+ l->lv_idx_item = NULL;
+ list_log(l, l->lv_first, l->lv_last, "afterdrop");
+}
+
+/// Like tv_list_drop_items, but also frees all removed items
+void tv_list_remove_items(list_T *const l, listitem_T *const item,
+ listitem_T *const item2)
+ FUNC_ATTR_NONNULL_ALL
+{
+ list_log(l, item, item2, "remove");
+ tv_list_drop_items(l, item, item2);
+ for (listitem_T *li = item;;) {
+ tv_clear(TV_LIST_ITEM_TV(li));
+ listitem_T *const nli = li->li_next;
+ xfree(li);
+ if (li == item2) {
+ break;
+ }
+ li = nli;
+ }
+}
+
+/// Move items "item" to "item2" from list "l" to the end of the list "tgt_l"
+///
+/// @param[out] l List to move from.
+/// @param[in] item First item to move.
+/// @param[in] item2 Last item to move.
+/// @param[out] tgt_l List to move to.
+/// @param[in] cnt Number of items moved.
+void tv_list_move_items(list_T *const l, listitem_T *const item,
+ listitem_T *const item2, list_T *const tgt_l,
+ const int cnt)
+ FUNC_ATTR_NONNULL_ALL
+{
+ list_log(l, item, item2, "move");
+ tv_list_drop_items(l, item, item2);
+ item->li_prev = tgt_l->lv_last;
+ item2->li_next = NULL;
+ if (tgt_l->lv_last == NULL) {
+ tgt_l->lv_first = item;
+ } else {
+ tgt_l->lv_last->li_next = item;
+ }
+ tgt_l->lv_last = item2;
+ tgt_l->lv_len += cnt;
+ list_log(tgt_l, tgt_l->lv_first, tgt_l->lv_last, "movetgt");
+}
+
+/// Insert list item
+///
+/// @param[out] l List to insert to.
+/// @param[in,out] ni Item to insert.
+/// @param[in] item Item to insert before. If NULL, inserts at the end of the
+/// list.
+void tv_list_insert(list_T *const l, listitem_T *const ni,
+ listitem_T *const item)
+ FUNC_ATTR_NONNULL_ARG(1, 2)
+{
+ if (item == NULL) {
+ // Append new item at end of list.
+ tv_list_append(l, ni);
+ } else {
+ // Insert new item before existing item.
+ ni->li_prev = item->li_prev;
+ ni->li_next = item;
+ if (item->li_prev == NULL) {
+ l->lv_first = ni;
+ l->lv_idx++;
+ } else {
+ item->li_prev->li_next = ni;
+ l->lv_idx_item = NULL;
+ }
+ item->li_prev = ni;
+ l->lv_len++;
+ list_log(l, ni, item, "insert");
+ }
+}
+
+/// Insert VimL value into a list
+///
+/// @param[out] l List to insert to.
+/// @param[in,out] tv Value to insert. Is copied (@see tv_copy()) to an
+/// allocated listitem_T and inserted.
+/// @param[in] item Item to insert before. If NULL, inserts at the end of the
+/// list.
+void tv_list_insert_tv(list_T *const l, typval_T *const tv,
+ listitem_T *const item)
+{
+ listitem_T *const ni = tv_list_item_alloc();
+
+ tv_copy(tv, &ni->li_tv);
+ tv_list_insert(l, ni, item);
+}
+
+/// Append item to the end of list
+///
+/// @param[out] l List to append to.
+/// @param[in,out] item Item to append.
+void tv_list_append(list_T *const l, listitem_T *const item)
+ FUNC_ATTR_NONNULL_ALL
+{
+ list_log(l, item, NULL, "append");
+ if (l->lv_last == NULL) {
+ // empty list
+ l->lv_first = item;
+ l->lv_last = item;
+ item->li_prev = NULL;
+ } else {
+ l->lv_last->li_next = item;
+ item->li_prev = l->lv_last;
+ l->lv_last = item;
+ }
+ l->lv_len++;
+ item->li_next = NULL;
+}
+
+/// Append VimL value to the end of list
+///
+/// @param[out] l List to append to.
+/// @param[in,out] tv Value to append. Is copied (@see tv_copy()) to an
+/// allocated listitem_T.
+void tv_list_append_tv(list_T *const l, typval_T *const tv)
+ FUNC_ATTR_NONNULL_ALL
+{
+ listitem_T *const li = tv_list_item_alloc();
+ tv_copy(tv, TV_LIST_ITEM_TV(li));
+ tv_list_append(l, li);
+}
+
+/// Like tv_list_append_tv(), but tv is moved to a list
+///
+/// This means that it is no longer valid to use contents of the typval_T after
+/// function exits.
+void tv_list_append_owned_tv(list_T *const l, typval_T tv)
+ FUNC_ATTR_NONNULL_ALL
+{
+ listitem_T *const li = tv_list_item_alloc();
+ *TV_LIST_ITEM_TV(li) = tv;
+ tv_list_append(l, li);
+}
+
+/// Append a list to a list as one item
+///
+/// @param[out] l List to append to.
+/// @param[in,out] itemlist List to append. Reference count is increased.
+void tv_list_append_list(list_T *const l, list_T *const itemlist)
+ FUNC_ATTR_NONNULL_ARG(1)
+{
+ tv_list_append_owned_tv(l, (typval_T) {
+ .v_type = VAR_LIST,
+ .v_lock = VAR_UNLOCKED,
+ .vval.v_list = itemlist,
+ });
+ tv_list_ref(itemlist);
+}
+
+/// Append a dictionary to a list
+///
+/// @param[out] l List to append to.
+/// @param[in,out] dict Dictionary to append. Reference count is increased.
+void tv_list_append_dict(list_T *const l, dict_T *const dict)
+ FUNC_ATTR_NONNULL_ARG(1)
+{
+ tv_list_append_owned_tv(l, (typval_T) {
+ .v_type = VAR_DICT,
+ .v_lock = VAR_UNLOCKED,
+ .vval.v_dict = dict,
+ });
+ if (dict != NULL) {
+ dict->dv_refcount++;
+ }
+}
+
+/// Make a copy of "str" and append it as an item to list "l"
+///
+/// @param[out] l List to append to.
+/// @param[in] str String to append.
+/// @param[in] len Length of the appended string. May be -1, in this
+/// case string is considered to be usual zero-terminated
+/// string or NULL โ€œemptyโ€ string.
+void tv_list_append_string(list_T *const l, const char *const str,
+ const ssize_t len)
+ FUNC_ATTR_NONNULL_ARG(1)
+{
+ tv_list_append_owned_tv(l, (typval_T) {
+ .v_type = VAR_STRING,
+ .v_lock = VAR_UNLOCKED,
+ .vval.v_string = (str == NULL
+ ? NULL
+ : (len >= 0
+ ? xmemdupz(str, (size_t)len)
+ : xstrdup(str))),
+ });
+}
+
+/// Append given string to the list
+///
+/// Unlike list_append_string this function does not copy the string.
+///
+/// @param[out] l List to append to.
+/// @param[in] str String to append.
+void tv_list_append_allocated_string(list_T *const l, char *const str)
+ FUNC_ATTR_NONNULL_ARG(1)
+{
+ tv_list_append_owned_tv(l, (typval_T) {
+ .v_type = VAR_STRING,
+ .v_lock = VAR_UNLOCKED,
+ .vval.v_string = (char_u *)str,
+ });
+}
+
+/// Append number to the list
+///
+/// @param[out] l List to append to.
+/// @param[in] n Number to append. Will be recorded in the allocated
+/// listitem_T.
+void tv_list_append_number(list_T *const l, const varnumber_T n)
+{
+ tv_list_append_owned_tv(l, (typval_T) {
+ .v_type = VAR_NUMBER,
+ .v_lock = VAR_UNLOCKED,
+ .vval.v_number = n,
+ });
+}
+
+//{{{2 Operations on the whole list
+
+/// Make a copy of list
+///
+/// @param[in] conv If non-NULL, then all internal strings will be converted.
+/// Only used when `deep` is true.
+/// @param[in] orig Original list to copy.
+/// @param[in] deep If false, then shallow copy will be done.
+/// @param[in] copyID See var_item_copy().
+///
+/// @return Copied list. May be NULL in case original list is NULL or some
+/// failure happens. The refcount of the new list is set to 1.
+list_T *tv_list_copy(const vimconv_T *const conv, list_T *const orig,
+ const bool deep, const int copyID)
+ FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ if (orig == NULL) {
+ return NULL;
+ }
+
+ list_T *copy = tv_list_alloc(tv_list_len(orig));
+ tv_list_ref(copy);
+ if (copyID != 0) {
+ // Do this before adding the items, because one of the items may
+ // refer back to this list.
+ orig->lv_copyID = copyID;
+ orig->lv_copylist = copy;
+ }
+ TV_LIST_ITER(orig, item, {
+ if (got_int) {
+ break;
+ }
+ listitem_T *const ni = tv_list_item_alloc();
+ if (deep) {
+ if (var_item_copy(conv, TV_LIST_ITEM_TV(item), TV_LIST_ITEM_TV(ni),
+ deep, copyID) == FAIL) {
+ xfree(ni);
+ goto tv_list_copy_error;
+ }
+ } else {
+ tv_copy(TV_LIST_ITEM_TV(item), TV_LIST_ITEM_TV(ni));
+ }
+ tv_list_append(copy, ni);
+ });
+
+ return copy;
+
+tv_list_copy_error:
+ tv_list_unref(copy);
+ return NULL;
+}
+
+/// Extend first list with the second
+///
+/// @param[out] l1 List to extend.
+/// @param[in] l2 List to extend with.
+/// @param[in] bef If not NULL, extends before this item.
+void tv_list_extend(list_T *const l1, list_T *const l2,
+ listitem_T *const bef)
+ FUNC_ATTR_NONNULL_ARG(1)
+{
+ int todo = tv_list_len(l2);
+ listitem_T *const befbef = (bef == NULL ? NULL : bef->li_prev);
+ listitem_T *const saved_next = (befbef == NULL ? NULL : befbef->li_next);
+ // We also quit the loop when we have inserted the original item count of
+ // the list, avoid a hang when we extend a list with itself.
+ for (listitem_T *item = tv_list_first(l2)
+ ; item != NULL && todo--
+ ; item = (item == befbef ? saved_next : item->li_next)) {
+ tv_list_insert_tv(l1, TV_LIST_ITEM_TV(item), bef);
+ }
+}
+
+/// Concatenate lists into a new list
+///
+/// @param[in] l1 First list.
+/// @param[in] l2 Second list.
+/// @param[out] ret_tv Location where new list is saved.
+///
+/// @return OK or FAIL.
+int tv_list_concat(list_T *const l1, list_T *const l2, typval_T *const tv)
+ FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ list_T *l;
+
+ tv->v_type = VAR_LIST;
+
+ if (l1 == NULL && l2 == NULL) {
+ l = NULL;
+ } else if (l1 == NULL) {
+ l = tv_list_copy(NULL, l2, false, 0);
+ } else {
+ l = tv_list_copy(NULL, l1, false, 0);
+ if (l != NULL && l2 != NULL) {
+ tv_list_extend(l, l2, NULL);
+ }
+ }
+ if (l == NULL && !(l1 == NULL && l2 == NULL)) {
+ return FAIL;
+ }
+
+ tv->vval.v_list = l;
+ return OK;
+}
+
+typedef struct {
+ char_u *s;
+ char_u *tofree;
+} Join;
+
+/// Join list into a string, helper function
+///
+/// @param[out] gap Garray where result will be saved.
+/// @param[in] l List to join.
+/// @param[in] sep Used separator.
+/// @param[in] join_gap Garray to keep each list item string.
+///
+/// @return OK in case of success, FAIL otherwise.
+static int list_join_inner(garray_T *const gap, list_T *const l,
+ const char *const sep, garray_T *const join_gap)
+ FUNC_ATTR_NONNULL_ALL
+{
+ size_t sumlen = 0;
+ bool first = true;
+
+ // Stringify each item in the list.
+ TV_LIST_ITER(l, item, {
+ if (got_int) {
+ break;
+ }
+ char *s;
+ size_t len;
+ s = encode_tv2echo(TV_LIST_ITEM_TV(item), &len);
+ if (s == NULL) {
+ return FAIL;
+ }
+
+ sumlen += len;
+
+ Join *const p = GA_APPEND_VIA_PTR(Join, join_gap);
+ p->tofree = p->s = (char_u *)s;
+
+ line_breakcheck();
+ });
+
+ // Allocate result buffer with its total size, avoid re-allocation and
+ // multiple copy operations. Add 2 for a tailing ']' and NUL.
+ if (join_gap->ga_len >= 2) {
+ sumlen += strlen(sep) * (size_t)(join_gap->ga_len - 1);
+ }
+ ga_grow(gap, (int)sumlen + 2);
+
+ for (int i = 0; i < join_gap->ga_len && !got_int; i++) {
+ if (first) {
+ first = false;
+ } else {
+ ga_concat(gap, (const char_u *)sep);
+ }
+ const Join *const p = ((const Join *)join_gap->ga_data) + i;
+
+ if (p->s != NULL) {
+ ga_concat(gap, p->s);
+ }
+ line_breakcheck();
+ }
+
+ return OK;
+}
+
+/// Join list into a string using given separator
+///
+/// @param[out] gap Garray where result will be saved.
+/// @param[in] l Joined list.
+/// @param[in] sep Separator.
+///
+/// @return OK in case of success, FAIL otherwise.
+int tv_list_join(garray_T *const gap, list_T *const l, const char *const sep)
+ FUNC_ATTR_NONNULL_ARG(1)
+{
+ if (!tv_list_len(l)) {
+ return OK;
+ }
+
+ garray_T join_ga;
+ int retval;
+
+ ga_init(&join_ga, (int)sizeof(Join), tv_list_len(l));
+ retval = list_join_inner(gap, l, sep, &join_ga);
+
+#define FREE_JOIN_TOFREE(join) xfree((join)->tofree)
+ GA_DEEP_CLEAR(&join_ga, Join, FREE_JOIN_TOFREE);
+#undef FREE_JOIN_TOFREE
+
+ return retval;
+}
+
+/// Chech whether two lists are equal
+///
+/// @param[in] l1 First list to compare.
+/// @param[in] l2 Second list to compare.
+/// @param[in] ic True if case is to be ignored.
+/// @param[in] recursive True when used recursively.
+///
+/// @return True if lists are equal, false otherwise.
+bool tv_list_equal(list_T *const l1, list_T *const l2, const bool ic,
+ const bool recursive)
+ FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ if (l1 == l2) {
+ return true;
+ }
+ if (l1 == NULL || l2 == NULL) {
+ return false;
+ }
+ if (tv_list_len(l1) != tv_list_len(l2)) {
+ return false;
+ }
+
+ listitem_T *item1 = tv_list_first(l1);
+ listitem_T *item2 = tv_list_first(l2);
+ for (; item1 != NULL && item2 != NULL
+ ; (item1 = TV_LIST_ITEM_NEXT(l1, item1),
+ item2 = TV_LIST_ITEM_NEXT(l2, item2))) {
+ if (!tv_equal(TV_LIST_ITEM_TV(item1), TV_LIST_ITEM_TV(item2), ic,
+ recursive)) {
+ return false;
+ }
+ }
+ assert(item1 == NULL && item2 == NULL);
+ return true;
+}
+
+/// Reverse list in-place
+///
+/// @param[in,out] l List to reverse.
+void tv_list_reverse(list_T *const l)
+{
+ if (tv_list_len(l) <= 1) {
+ return;
+ }
+ list_log(l, NULL, NULL, "reverse");
+#define SWAP(a, b) \
+ do { \
+ tmp = a; \
+ a = b; \
+ b = tmp; \
+ } while (0)
+ listitem_T *tmp;
+
+ SWAP(l->lv_first, l->lv_last);
+ for (listitem_T *li = l->lv_first; li != NULL; li = li->li_next) {
+ SWAP(li->li_next, li->li_prev);
+ }
+#undef SWAP
+
+ l->lv_idx = l->lv_len - l->lv_idx - 1;
+}
+
+// FIXME Add unit tests for tv_list_item_sort().
+
+/// Sort list using libc qsort
+///
+/// @param[in,out] l List to sort, will be sorted in-place.
+/// @param ptrs Preallocated array of items to sort, must have at least
+/// tv_list_len(l) entries. Should not be initialized.
+/// @param[in] item_compare_func Function used to compare list items.
+/// @param errp Location where information about whether error occurred is
+/// saved by item_compare_func. If boolean there appears to be
+/// true list will not be modified. Must be initialized to false
+/// by the caller.
+void tv_list_item_sort(list_T *const l, ListSortItem *const ptrs,
+ const ListSorter item_compare_func,
+ bool *errp)
+ FUNC_ATTR_NONNULL_ARG(3, 4)
+{
+ const int len = tv_list_len(l);
+ if (len <= 1) {
+ return;
+ }
+ list_log(l, NULL, NULL, "sort");
+ int i = 0;
+ TV_LIST_ITER(l, li, {
+ ptrs[i].item = li;
+ ptrs[i].idx = i;
+ i++;
+ });
+ // Sort the array with item pointers.
+ qsort(ptrs, (size_t)len, sizeof(ListSortItem), item_compare_func);
+ if (!(*errp)) {
+ // Clear the list and append the items in the sorted order.
+ l->lv_first = NULL;
+ l->lv_last = NULL;
+ l->lv_idx_item = NULL;
+ l->lv_len = 0;
+ for (i = 0; i < len; i++) {
+ tv_list_append(l, ptrs[i].item);
+ }
+ }
+}
+
+//{{{2 Indexing/searching
+
+/// Locate item with a given index in a list and return it
+///
+/// @param[in] l List to index.
+/// @param[in] n Index. Negative index is counted from the end, -1 is the last
+/// item.
+///
+/// @return Item at the given index or NULL if `n` is out of range.
+listitem_T *tv_list_find(list_T *const l, int n)
+ FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ STATIC_ASSERT(sizeof(n) == sizeof(l->lv_idx),
+ "n and lv_idx sizes do not match");
+ if (l == NULL) {
+ return NULL;
+ }
+
+ n = tv_list_uidx(l, n);
+ if (n == -1) {
+ return NULL;
+ }
+
+ int idx;
+ listitem_T *item;
+
+ // When there is a cached index may start search from there.
+ if (l->lv_idx_item != NULL) {
+ if (n < l->lv_idx / 2) {
+ // Closest to the start of the list.
+ item = l->lv_first;
+ idx = 0;
+ } else if (n > (l->lv_idx + l->lv_len) / 2) {
+ // Closest to the end of the list.
+ item = l->lv_last;
+ idx = l->lv_len - 1;
+ } else {
+ // Closest to the cached index.
+ item = l->lv_idx_item;
+ idx = l->lv_idx;
+ }
+ } else {
+ if (n < l->lv_len / 2) {
+ // Closest to the start of the list.
+ item = l->lv_first;
+ idx = 0;
+ } else {
+ // Closest to the end of the list.
+ item = l->lv_last;
+ idx = l->lv_len - 1;
+ }
+ }
+
+ while (n > idx) {
+ // Search forward.
+ item = item->li_next;
+ idx++;
+ }
+ while (n < idx) {
+ // Search backward.
+ item = item->li_prev;
+ idx--;
+ }
+
+ assert(idx == n);
+ // Cache the used index.
+ l->lv_idx = idx;
+ l->lv_idx_item = item;
+ list_log(l, l->lv_idx_item, (void *)(uintptr_t)l->lv_idx, "find");
+
+ return item;
+}
+
+/// Get list item l[n] as a number
+///
+/// @param[in] l List to index.
+/// @param[in] n Index in a list.
+/// @param[out] ret_error Location where 1 will be saved if index was not
+/// found. May be NULL. If everything is OK,
+/// `*ret_error` is not touched.
+///
+/// @return Integer value at the given index or -1.
+varnumber_T tv_list_find_nr(list_T *const l, const int n, bool *const ret_error)
+ FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ const listitem_T *const li = tv_list_find(l, n);
+ if (li == NULL) {
+ if (ret_error != NULL) {
+ *ret_error = true;
+ }
+ return -1;
+ }
+ return tv_get_number_chk(TV_LIST_ITEM_TV(li), ret_error);
+}
+
+/// Get list item l[n] as a string
+///
+/// @param[in] l List to index.
+/// @param[in] n Index in a list.
+///
+/// @return List item string value or NULL in case of error.
+const char *tv_list_find_str(list_T *const l, const int n)
+ FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ const listitem_T *const li = tv_list_find(l, n);
+ if (li == NULL) {
+ EMSG2(_(e_listidx), (int64_t)n);
+ return NULL;
+ }
+ return tv_get_string(TV_LIST_ITEM_TV(li));
+}
+
+/// Locate item in a list and return its index
+///
+/// @param[in] l List to search.
+/// @param[in] item Item to search for.
+///
+/// @return Index of an item or -1 if item is not in the list.
+long tv_list_idx_of_item(const list_T *const l, const listitem_T *const item)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_PURE
+{
+ if (l == NULL) {
+ return -1;
+ }
+ int idx = 0;
+ TV_LIST_ITER_CONST(l, li, {
+ if (li == item) {
+ return idx;
+ }
+ idx++;
+ });
+ return -1;
+}
+
+//{{{1 Dictionaries
+//{{{2 Dictionary watchers
+
+/// Perform all necessary cleanup for a `DictWatcher` instance
+///
+/// @param watcher Watcher to free.
+static void tv_dict_watcher_free(DictWatcher *watcher)
+ FUNC_ATTR_NONNULL_ALL
+{
+ callback_free(&watcher->callback);
+ xfree(watcher->key_pattern);
+ xfree(watcher);
+}
+
+/// Add watcher to a dictionary
+///
+/// @param[in] dict Dictionary to add watcher to.
+/// @param[in] key_pattern Pattern to watch for.
+/// @param[in] key_pattern_len Key pattern length.
+/// @param callback Function to be called on events.
+void tv_dict_watcher_add(dict_T *const dict, const char *const key_pattern,
+ const size_t key_pattern_len, Callback callback)
+ FUNC_ATTR_NONNULL_ARG(2)
+{
+ if (dict == NULL) {
+ return;
+ }
+ DictWatcher *const watcher = xmalloc(sizeof(DictWatcher));
+ watcher->key_pattern = xmemdupz(key_pattern, key_pattern_len);
+ watcher->key_pattern_len = key_pattern_len;
+ watcher->callback = callback;
+ watcher->busy = false;
+ QUEUE_INSERT_TAIL(&dict->watchers, &watcher->node);
+}
+
+/// Check whether two callbacks are equal
+///
+/// @param[in] cb1 First callback to check.
+/// @param[in] cb2 Second callback to check.
+///
+/// @return True if they are equal, false otherwise.
+bool tv_callback_equal(const Callback *cb1, const Callback *cb2)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ if (cb1->type != cb2->type) {
+ return false;
+ }
+ switch (cb1->type) {
+ case kCallbackFuncref: {
+ return STRCMP(cb1->data.funcref, cb2->data.funcref) == 0;
+ }
+ case kCallbackPartial: {
+ // FIXME: this is inconsistent with tv_equal but is needed for precision
+ // maybe change dictwatcheradd to return a watcher id instead?
+ return cb1->data.partial == cb2->data.partial;
+ }
+ case kCallbackNone: {
+ return true;
+ }
+ }
+ abort();
+ return false;
+}
+
+/// Unref/free callback
+void callback_free(Callback *callback)
+ FUNC_ATTR_NONNULL_ALL
+{
+ switch (callback->type) {
+ case kCallbackFuncref: {
+ func_unref(callback->data.funcref);
+ xfree(callback->data.funcref);
+ break;
+ }
+ case kCallbackPartial: {
+ partial_unref(callback->data.partial);
+ break;
+ }
+ case kCallbackNone: {
+ break;
+ }
+ }
+ callback->type = kCallbackNone;
+}
+
+/// Remove watcher from a dictionary
+///
+/// @param dict Dictionary to remove watcher from.
+/// @param[in] key_pattern Pattern to remove watcher for.
+/// @param[in] key_pattern_len Pattern length.
+/// @param callback Callback to remove watcher for.
+///
+/// @return True on success, false if relevant watcher was not found.
+bool tv_dict_watcher_remove(dict_T *const dict, const char *const key_pattern,
+ const size_t key_pattern_len,
+ Callback callback)
+ FUNC_ATTR_NONNULL_ARG(2)
+{
+ if (dict == NULL) {
+ return false;
+ }
+
+ QUEUE *w = NULL;
+ DictWatcher *watcher = NULL;
+ bool matched = false;
+ QUEUE_FOREACH(w, &dict->watchers) {
+ watcher = tv_dict_watcher_node_data(w);
+ if (tv_callback_equal(&watcher->callback, &callback)
+ && watcher->key_pattern_len == key_pattern_len
+ && memcmp(watcher->key_pattern, key_pattern, key_pattern_len) == 0) {
+ matched = true;
+ break;
+ }
+ }
+
+ if (!matched) {
+ return false;
+ }
+
+ QUEUE_REMOVE(w);
+ tv_dict_watcher_free(watcher);
+ return true;
+}
+
+/// Test if `key` matches with with `watcher->key_pattern`
+///
+/// @param[in] watcher Watcher to check key pattern from.
+/// @param[in] key Key to check.
+///
+/// @return true if key matches, false otherwise.
+static bool tv_dict_watcher_matches(DictWatcher *watcher, const char *const key)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_PURE
+{
+ // For now only allow very simple globbing in key patterns: a '*' at the end
+ // of the string means it should match everything up to the '*' instead of the
+ // whole string.
+ const size_t len = watcher->key_pattern_len;
+ if (len && watcher->key_pattern[len - 1] == '*') {
+ return strncmp(key, watcher->key_pattern, len - 1) == 0;
+ } else {
+ return strcmp(key, watcher->key_pattern) == 0;
+ }
+}
+
+/// Send a change notification to all dictionary watchers that match given key
+///
+/// @param[in] dict Dictionary which was modified.
+/// @param[in] key Key which was modified.
+/// @param[in] newtv New key value.
+/// @param[in] oldtv Old key value.
+void tv_dict_watcher_notify(dict_T *const dict, const char *const key,
+ typval_T *const newtv, typval_T *const oldtv)
+ FUNC_ATTR_NONNULL_ARG(1, 2)
+{
+ typval_T argv[3];
+
+ argv[0].v_type = VAR_DICT;
+ argv[0].v_lock = VAR_UNLOCKED;
+ argv[0].vval.v_dict = dict;
+ argv[1].v_type = VAR_STRING;
+ argv[1].v_lock = VAR_UNLOCKED;
+ argv[1].vval.v_string = (char_u *)xstrdup(key);
+ argv[2].v_type = VAR_DICT;
+ argv[2].v_lock = VAR_UNLOCKED;
+ argv[2].vval.v_dict = tv_dict_alloc();
+ argv[2].vval.v_dict->dv_refcount++;
+
+ if (newtv) {
+ dictitem_T *const v = tv_dict_item_alloc_len(S_LEN("new"));
+ tv_copy(newtv, &v->di_tv);
+ tv_dict_add(argv[2].vval.v_dict, v);
+ }
+
+ if (oldtv) {
+ dictitem_T *const v = tv_dict_item_alloc_len(S_LEN("old"));
+ tv_copy(oldtv, &v->di_tv);
+ tv_dict_add(argv[2].vval.v_dict, v);
+ }
+
+ typval_T rettv;
+
+ QUEUE *w;
+ QUEUE_FOREACH(w, &dict->watchers) {
+ DictWatcher *watcher = tv_dict_watcher_node_data(w);
+ if (!watcher->busy && tv_dict_watcher_matches(watcher, key)) {
+ rettv = TV_INITIAL_VALUE;
+ watcher->busy = true;
+ callback_call(&watcher->callback, 3, argv, &rettv);
+ watcher->busy = false;
+ tv_clear(&rettv);
+ }
+ }
+
+ for (size_t i = 1; i < ARRAY_SIZE(argv); i++) {
+ tv_clear(argv + i);
+ }
+}
+
+//{{{2 Dictionary item
+
+/// Allocate a dictionary item
+///
+/// @note that the value of the item (->di_tv) still needs to be initialized.
+///
+/// @param[in] key Key, is copied to the new item.
+/// @param[in] key_len Key length.
+///
+/// @return [allocated] new dictionary item.
+dictitem_T *tv_dict_item_alloc_len(const char *const key, const size_t key_len)
+ FUNC_ATTR_NONNULL_RET FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+ FUNC_ATTR_MALLOC
+{
+ dictitem_T *const di = xmalloc(offsetof(dictitem_T, di_key) + key_len + 1);
+ memcpy(di->di_key, key, key_len);
+ di->di_key[key_len] = NUL;
+ di->di_flags = DI_FLAGS_ALLOC;
+ return di;
+}
+
+/// Allocate a dictionary item
+///
+/// @note that the value of the item (->di_tv) still needs to be initialized.
+///
+/// @param[in] key Key, is copied to the new item.
+///
+/// @return [allocated] new dictionary item.
+dictitem_T *tv_dict_item_alloc(const char *const key)
+ FUNC_ATTR_NONNULL_RET FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+ FUNC_ATTR_MALLOC
+{
+ return tv_dict_item_alloc_len(key, strlen(key));
+}
+
+/// Free a dictionary item, also clearing the value
+///
+/// @param item Item to free.
+void tv_dict_item_free(dictitem_T *const item)
+ FUNC_ATTR_NONNULL_ALL
+{
+ tv_clear(&item->di_tv);
+ if (item->di_flags & DI_FLAGS_ALLOC) {
+ xfree(item);
+ }
+}
+
+/// Make a copy of a dictionary item
+///
+/// @param[in] di Item to copy.
+///
+/// @return [allocated] new dictionary item.
+static dictitem_T *tv_dict_item_copy(dictitem_T *const di)
+ FUNC_ATTR_NONNULL_RET FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ dictitem_T *const new_di = tv_dict_item_alloc((const char *)di->di_key);
+ tv_copy(&di->di_tv, &new_di->di_tv);
+ return new_di;
+}
+
+/// Remove item from dictionary and free it
+///
+/// @param dict Dictionary to remove item from.
+/// @param item Item to remove.
+void tv_dict_item_remove(dict_T *const dict, dictitem_T *const item)
+ FUNC_ATTR_NONNULL_ALL
+{
+ hashitem_T *const hi = hash_find(&dict->dv_hashtab, item->di_key);
+ if (HASHITEM_EMPTY(hi)) {
+ emsgf(_(e_intern2), "tv_dict_item_remove()");
+ } else {
+ hash_remove(&dict->dv_hashtab, hi);
+ }
+ tv_dict_item_free(item);
+}
+
+//{{{2 Alloc/free
+
+/// Allocate an empty dictionary
+///
+/// @return [allocated] new dictionary.
+dict_T *tv_dict_alloc(void)
+ FUNC_ATTR_NONNULL_RET FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ dict_T *const d = xmalloc(sizeof(dict_T));
+
+ // Add the dict to the list of dicts for garbage collection.
+ if (gc_first_dict != NULL) {
+ gc_first_dict->dv_used_prev = d;
+ }
+ d->dv_used_next = gc_first_dict;
+ d->dv_used_prev = NULL;
+ gc_first_dict = d;
+
+ hash_init(&d->dv_hashtab);
+ d->dv_lock = VAR_UNLOCKED;
+ d->dv_scope = VAR_NO_SCOPE;
+ d->dv_refcount = 0;
+ d->dv_copyID = 0;
+ QUEUE_INIT(&d->watchers);
+
+ return d;
+}
+
+/// Free items contained in a dictionary
+///
+/// @param[in,out] d Dictionary to clear.
+void tv_dict_free_contents(dict_T *const d)
+ FUNC_ATTR_NONNULL_ALL
+{
+ // Lock the hashtab, we don't want it to resize while freeing items.
+ hash_lock(&d->dv_hashtab);
+ assert(d->dv_hashtab.ht_locked > 0);
+ HASHTAB_ITER(&d->dv_hashtab, hi, {
+ // Remove the item before deleting it, just in case there is
+ // something recursive causing trouble.
+ dictitem_T *const di = TV_DICT_HI2DI(hi);
+ hash_remove(&d->dv_hashtab, hi);
+ tv_dict_item_free(di);
+ });
+
+ while (!QUEUE_EMPTY(&d->watchers)) {
+ QUEUE *w = QUEUE_HEAD(&d->watchers);
+ QUEUE_REMOVE(w);
+ DictWatcher *watcher = tv_dict_watcher_node_data(w);
+ tv_dict_watcher_free(watcher);
+ }
+
+ hash_clear(&d->dv_hashtab);
+ d->dv_hashtab.ht_locked--;
+ hash_init(&d->dv_hashtab);
+}
+
+/// Free a dictionary itself, ignoring items it contains
+///
+/// Ignores the reference count.
+///
+/// @param[in,out] d Dictionary to free.
+void tv_dict_free_dict(dict_T *const d)
+ FUNC_ATTR_NONNULL_ALL
+{
+ // Remove the dict from the list of dicts for garbage collection.
+ if (d->dv_used_prev == NULL) {
+ gc_first_dict = d->dv_used_next;
+ } else {
+ d->dv_used_prev->dv_used_next = d->dv_used_next;
+ }
+ if (d->dv_used_next != NULL) {
+ d->dv_used_next->dv_used_prev = d->dv_used_prev;
+ }
+
+ xfree(d);
+}
+
+/// Free a dictionary, including all items it contains
+///
+/// Ignores the reference count.
+///
+/// @param d Dictionary to free.
+void tv_dict_free(dict_T *const d)
+ FUNC_ATTR_NONNULL_ALL
+{
+ if (!tv_in_free_unref_items) {
+ tv_dict_free_contents(d);
+ tv_dict_free_dict(d);
+ }
+}
+
+
+/// Unreference a dictionary
+///
+/// Decrements the reference count and frees dictionary when it becomes zero.
+///
+/// @param[in] d Dictionary to operate on.
+void tv_dict_unref(dict_T *const d)
+{
+ if (d != NULL && --d->dv_refcount <= 0) {
+ tv_dict_free(d);
+ }
+}
+
+//{{{2 Indexing/searching
+
+/// Find item in dictionary
+///
+/// @param[in] d Dictionary to check.
+/// @param[in] key Dictionary key.
+/// @param[in] len Key length. If negative, then strlen(key) is used.
+///
+/// @return found item or NULL if nothing was found.
+dictitem_T *tv_dict_find(const dict_T *const d, const char *const key,
+ const ptrdiff_t len)
+ FUNC_ATTR_NONNULL_ARG(2) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ if (d == NULL) {
+ return NULL;
+ }
+ hashitem_T *const hi = (len < 0
+ ? hash_find(&d->dv_hashtab, (const char_u *)key)
+ : hash_find_len(&d->dv_hashtab, key, (size_t)len));
+ if (HASHITEM_EMPTY(hi)) {
+ return NULL;
+ }
+ return TV_DICT_HI2DI(hi);
+}
+
+/// Get a number item from a dictionary
+///
+/// Returns 0 if the entry does not exist.
+///
+/// @param[in] d Dictionary to get item from.
+/// @param[in] key Key to find in dictionary.
+///
+/// @return Dictionary item.
+varnumber_T tv_dict_get_number(const dict_T *const d, const char *const key)
+ FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ dictitem_T *const di = tv_dict_find(d, key, -1);
+ if (di == NULL) {
+ return 0;
+ }
+ return tv_get_number(&di->di_tv);
+}
+
+/// Get a string item from a dictionary
+///
+/// @param[in] d Dictionary to get item from.
+/// @param[in] key Dictionary key.
+/// @param[in] save If true, returned string will be placed in the allocated
+/// memory.
+///
+/// @return NULL if key does not exist, empty string in case of type error,
+/// string item value otherwise. If returned value is not NULL, it may
+/// be allocated depending on `save` argument.
+char *tv_dict_get_string(const dict_T *const d, const char *const key,
+ const bool save)
+ FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ static char numbuf[NUMBUFLEN];
+ const char *const s = tv_dict_get_string_buf(d, key, numbuf);
+ if (save && s != NULL) {
+ return xstrdup(s);
+ }
+ return (char *)s;
+}
+
+/// Get a string item from a dictionary
+///
+/// @param[in] d Dictionary to get item from.
+/// @param[in] key Dictionary key.
+/// @param[in] numbuf Buffer for non-string items converted to strings, at
+/// least of #NUMBUFLEN length.
+///
+/// @return NULL if key does not exist, empty string in case of type error,
+/// string item value otherwise.
+const char *tv_dict_get_string_buf(const dict_T *const d, const char *const key,
+ char *const numbuf)
+ FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ const dictitem_T *const di = tv_dict_find(d, key, -1);
+ if (di == NULL) {
+ return NULL;
+ }
+ return tv_get_string_buf(&di->di_tv, numbuf);
+}
+
+/// Get a string item from a dictionary
+///
+/// @param[in] d Dictionary to get item from.
+/// @param[in] key Dictionary key.
+/// @param[in] key_len Key length.
+/// @param[in] numbuf Buffer for non-string items converted to strings, at
+/// least of #NUMBUFLEN length.
+/// @param[in] def Default return when key does not exist.
+///
+/// @return `def` when key does not exist,
+/// NULL in case of type error,
+/// string item value in case of success.
+const char *tv_dict_get_string_buf_chk(const dict_T *const d,
+ const char *const key,
+ const ptrdiff_t key_len,
+ char *const numbuf,
+ const char *const def)
+ FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ const dictitem_T *const di = tv_dict_find(d, key, key_len);
+ if (di == NULL) {
+ return def;
+ }
+ return tv_get_string_buf_chk(&di->di_tv, numbuf);
+}
+
+/// Get a function from a dictionary
+///
+/// @param[in] d Dictionary to get callback from.
+/// @param[in] key Dictionary key.
+/// @param[in] key_len Key length, may be -1 to use strlen().
+/// @param[out] result The address where a pointer to the wanted callback
+/// will be left.
+///
+/// @return true/false on success/failure.
+bool tv_dict_get_callback(dict_T *const d,
+ const char *const key, const ptrdiff_t key_len,
+ Callback *const result)
+ FUNC_ATTR_NONNULL_ARG(2, 4) FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ result->type = kCallbackNone;
+
+ dictitem_T *const di = tv_dict_find(d, key, key_len);
+
+ if (di == NULL) {
+ return true;
+ }
+
+ if (!tv_is_func(di->di_tv) && di->di_tv.v_type != VAR_STRING) {
+ EMSG(_("E6000: Argument is not a function or function name"));
+ return false;
+ }
+
+ typval_T tv;
+ tv_copy(&di->di_tv, &tv);
+ set_selfdict(&tv, d);
+ const bool res = callback_from_typval(result, &tv);
+ tv_clear(&tv);
+ return res;
+}
+
+//{{{2 dict_add*
+
+/// Add item to dictionary
+///
+/// @param[out] d Dictionary to add to.
+/// @param[in] item Item to add.
+///
+/// @return FAIL if key already exists.
+int tv_dict_add(dict_T *const d, dictitem_T *const item)
+ FUNC_ATTR_NONNULL_ALL
+{
+ return hash_add(&d->dv_hashtab, item->di_key);
+}
+
+/// Add a list entry to dictionary
+///
+/// @param[out] d Dictionary to add entry to.
+/// @param[in] key Key to add.
+/// @param[in] key_len Key length.
+/// @param list List to add. Will have reference count incremented.
+///
+/// @return OK in case of success, FAIL when key already exists.
+int tv_dict_add_list(dict_T *const d, const char *const key,
+ const size_t key_len, list_T *const list)
+ FUNC_ATTR_NONNULL_ALL
+{
+ dictitem_T *const item = tv_dict_item_alloc_len(key, key_len);
+
+ item->di_tv.v_lock = VAR_UNLOCKED;
+ item->di_tv.v_type = VAR_LIST;
+ item->di_tv.vval.v_list = list;
+ tv_list_ref(list);
+ if (tv_dict_add(d, item) == FAIL) {
+ tv_dict_item_free(item);
+ return FAIL;
+ }
+ return OK;
+}
+
+/// Add a dictionary entry to dictionary
+///
+/// @param[out] d Dictionary to add entry to.
+/// @param[in] key Key to add.
+/// @param[in] key_len Key length.
+/// @param dict Dictionary to add. Will have reference count incremented.
+///
+/// @return OK in case of success, FAIL when key already exists.
+int tv_dict_add_dict(dict_T *const d, const char *const key,
+ const size_t key_len, dict_T *const dict)
+ FUNC_ATTR_NONNULL_ALL
+{
+ dictitem_T *const item = tv_dict_item_alloc_len(key, key_len);
+
+ item->di_tv.v_lock = VAR_UNLOCKED;
+ item->di_tv.v_type = VAR_DICT;
+ item->di_tv.vval.v_dict = dict;
+ dict->dv_refcount++;
+ if (tv_dict_add(d, item) == FAIL) {
+ tv_dict_item_free(item);
+ return FAIL;
+ }
+ return OK;
+}
+
+/// Add a number entry to dictionary
+///
+/// @param[out] d Dictionary to add entry to.
+/// @param[in] key Key to add.
+/// @param[in] key_len Key length.
+/// @param[in] nr Number to add.
+///
+/// @return OK in case of success, FAIL when key already exists.
+int tv_dict_add_nr(dict_T *const d, const char *const key,
+ const size_t key_len, const varnumber_T nr)
+{
+ dictitem_T *const item = tv_dict_item_alloc_len(key, key_len);
+
+ item->di_tv.v_lock = VAR_UNLOCKED;
+ item->di_tv.v_type = VAR_NUMBER;
+ item->di_tv.vval.v_number = nr;
+ if (tv_dict_add(d, item) == FAIL) {
+ tv_dict_item_free(item);
+ return FAIL;
+ }
+ return OK;
+}
+
+/// Add a special entry to dictionary
+///
+/// @param[out] d Dictionary to add entry to.
+/// @param[in] key Key to add.
+/// @param[in] key_len Key length.
+/// @param[in] val SpecialVarValue to add.
+///
+/// @return OK in case of success, FAIL when key already exists.
+int tv_dict_add_special(dict_T *const d, const char *const key,
+ const size_t key_len, SpecialVarValue val)
+{
+ dictitem_T *const item = tv_dict_item_alloc_len(key, key_len);
+
+ item->di_tv.v_lock = VAR_UNLOCKED;
+ item->di_tv.v_type = VAR_SPECIAL;
+ item->di_tv.vval.v_special = val;
+ if (tv_dict_add(d, item) == FAIL) {
+ tv_dict_item_free(item);
+ return FAIL;
+ }
+ return OK;
+}
+
+/// Add a string entry to dictionary
+///
+/// @param[out] d Dictionary to add entry to.
+/// @param[in] key Key to add.
+/// @param[in] key_len Key length.
+/// @param[in] val String to add.
+///
+/// @return OK in case of success, FAIL when key already exists.
+int tv_dict_add_str(dict_T *const d,
+ const char *const key, const size_t key_len,
+ const char *const val)
+ FUNC_ATTR_NONNULL_ALL
+{
+ return tv_dict_add_allocated_str(d, key, key_len, xstrdup(val));
+}
+
+/// Add a string entry to dictionary
+///
+/// Unlike tv_dict_add_str() saves val to the new dictionary item in place of
+/// creating a new copy.
+///
+/// @warning String will be freed even in case addition fails.
+///
+/// @param[out] d Dictionary to add entry to.
+/// @param[in] key Key to add.
+/// @param[in] key_len Key length.
+/// @param[in] val String to add.
+///
+/// @return OK in case of success, FAIL when key already exists.
+int tv_dict_add_allocated_str(dict_T *const d,
+ const char *const key, const size_t key_len,
+ char *const val)
+ FUNC_ATTR_NONNULL_ALL
+{
+ dictitem_T *const item = tv_dict_item_alloc_len(key, key_len);
+
+ item->di_tv.v_lock = VAR_UNLOCKED;
+ item->di_tv.v_type = VAR_STRING;
+ item->di_tv.vval.v_string = (char_u *)val;
+ if (tv_dict_add(d, item) == FAIL) {
+ tv_dict_item_free(item);
+ return FAIL;
+ }
+ return OK;
+}
+
+//{{{2 Operations on the whole dict
+
+/// Clear all the keys of a Dictionary. "d" remains a valid empty Dictionary.
+///
+/// @param d The Dictionary to clear
+void tv_dict_clear(dict_T *const d)
+ FUNC_ATTR_NONNULL_ALL
+{
+ hash_lock(&d->dv_hashtab);
+ assert(d->dv_hashtab.ht_locked > 0);
+
+ HASHTAB_ITER(&d->dv_hashtab, hi, {
+ tv_dict_item_free(TV_DICT_HI2DI(hi));
+ hash_remove(&d->dv_hashtab, hi);
+ });
+
+ hash_unlock(&d->dv_hashtab);
+}
+
+/// Extend dictionary with items from another dictionary
+///
+/// @param d1 Dictionary to extend.
+/// @param[in] d2 Dictionary to extend with.
+/// @param[in] action "error", "force", "keep":
+///
+/// e*, including "error": duplicate key gives an error.
+/// f*, including "force": duplicate d2 keys override d1.
+/// other, including "keep": duplicate d2 keys ignored.
+void tv_dict_extend(dict_T *const d1, dict_T *const d2,
+ const char *const action)
+ FUNC_ATTR_NONNULL_ALL
+{
+ const bool watched = tv_dict_is_watched(d1);
+ const char *const arg_errmsg = _("extend() argument");
+ const size_t arg_errmsg_len = strlen(arg_errmsg);
+
+ TV_DICT_ITER(d2, di2, {
+ dictitem_T *const di1 = tv_dict_find(d1, (const char *)di2->di_key, -1);
+ if (d1->dv_scope != VAR_NO_SCOPE) {
+ // Disallow replacing a builtin function in l: and g:.
+ // Check the key to be valid when adding to any scope.
+ if (d1->dv_scope == VAR_DEF_SCOPE
+ && tv_is_func(di2->di_tv)
+ && !var_check_func_name((const char *)di2->di_key, di1 == NULL)) {
+ break;
+ }
+ if (!valid_varname((const char *)di2->di_key)) {
+ break;
+ }
+ }
+ if (di1 == NULL) {
+ dictitem_T *const new_di = tv_dict_item_copy(di2);
+ if (tv_dict_add(d1, new_di) == FAIL) {
+ tv_dict_item_free(new_di);
+ } else if (watched) {
+ tv_dict_watcher_notify(d1, (const char *)new_di->di_key, &new_di->di_tv,
+ NULL);
+ }
+ } else if (*action == 'e') {
+ emsgf(_("E737: Key already exists: %s"), di2->di_key);
+ break;
+ } else if (*action == 'f' && di2 != di1) {
+ typval_T oldtv;
+
+ if (tv_check_lock(di1->di_tv.v_lock, arg_errmsg, arg_errmsg_len)
+ || var_check_ro(di1->di_flags, arg_errmsg, arg_errmsg_len)) {
+ break;
+ }
+
+ if (watched) {
+ tv_copy(&di1->di_tv, &oldtv);
+ }
+
+ tv_clear(&di1->di_tv);
+ tv_copy(&di2->di_tv, &di1->di_tv);
+
+ if (watched) {
+ tv_dict_watcher_notify(d1, (const char *)di1->di_key, &di1->di_tv,
+ &oldtv);
+ tv_clear(&oldtv);
+ }
+ }
+ });
+}
+
+/// Compare two dictionaries
+///
+/// @param[in] d1 First dictionary.
+/// @param[in] d2 Second dictionary.
+/// @param[in] ic True if case is to be ignored.
+/// @param[in] recursive True when used recursively.
+bool tv_dict_equal(dict_T *const d1, dict_T *const d2,
+ const bool ic, const bool recursive)
+ FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ if (d1 == d2) {
+ return true;
+ }
+ if (d1 == NULL || d2 == NULL) {
+ return false;
+ }
+ if (tv_dict_len(d1) != tv_dict_len(d2)) {
+ return false;
+ }
+
+ TV_DICT_ITER(d1, di1, {
+ dictitem_T *const di2 = tv_dict_find(d2, (const char *)di1->di_key, -1);
+ if (di2 == NULL) {
+ return false;
+ }
+ if (!tv_equal(&di1->di_tv, &di2->di_tv, ic, recursive)) {
+ return false;
+ }
+ });
+ return true;
+}
+
+/// Make a copy of dictionary
+///
+/// @param[in] conv If non-NULL, then all internal strings will be converted.
+/// @param[in] orig Original dictionary to copy.
+/// @param[in] deep If false, then shallow copy will be done.
+/// @param[in] copyID See var_item_copy().
+///
+/// @return Copied dictionary. May be NULL in case original dictionary is NULL
+/// or some failure happens. The refcount of the new dictionary is set
+/// to 1.
+dict_T *tv_dict_copy(const vimconv_T *const conv,
+ dict_T *const orig,
+ const bool deep,
+ const int copyID)
+{
+ if (orig == NULL) {
+ return NULL;
+ }
+
+ dict_T *copy = tv_dict_alloc();
+ if (copyID != 0) {
+ orig->dv_copyID = copyID;
+ orig->dv_copydict = copy;
+ }
+ TV_DICT_ITER(orig, di, {
+ if (got_int) {
+ break;
+ }
+ dictitem_T *new_di;
+ if (conv == NULL || conv->vc_type == CONV_NONE) {
+ new_di = tv_dict_item_alloc((const char *)di->di_key);
+ } else {
+ size_t len = STRLEN(di->di_key);
+ char *const key = (char *)string_convert(conv, di->di_key, &len);
+ if (key == NULL) {
+ new_di = tv_dict_item_alloc_len((const char *)di->di_key, len);
+ } else {
+ new_di = tv_dict_item_alloc_len(key, len);
+ xfree(key);
+ }
+ }
+ if (deep) {
+ if (var_item_copy(conv, &di->di_tv, &new_di->di_tv, deep,
+ copyID) == FAIL) {
+ xfree(new_di);
+ break;
+ }
+ } else {
+ tv_copy(&di->di_tv, &new_di->di_tv);
+ }
+ if (tv_dict_add(copy, new_di) == FAIL) {
+ tv_dict_item_free(new_di);
+ break;
+ }
+ });
+
+ copy->dv_refcount++;
+ if (got_int) {
+ tv_dict_unref(copy);
+ copy = NULL;
+ }
+
+ return copy;
+}
+
+/// Set all existing keys in "dict" as read-only.
+///
+/// This does not protect against adding new keys to the Dictionary.
+///
+/// @param dict The dict whose keys should be frozen.
+void tv_dict_set_keys_readonly(dict_T *const dict)
+ FUNC_ATTR_NONNULL_ALL
+{
+ TV_DICT_ITER(dict, di, {
+ di->di_flags |= DI_FLAGS_RO | DI_FLAGS_FIX;
+ });
+}
+
+//{{{1 Generic typval operations
+//{{{2 Init/alloc/clear
+//{{{3 Alloc
+
+/// Allocate an empty list for a return value
+///
+/// Also sets reference count.
+///
+/// @param[out] ret_tv Structure where list is saved.
+/// @param[in] len Expected number of items to be populated before list
+/// becomes accessible from VimL. It is still valid to
+/// underpopulate a list, value only controls how many elements
+/// will be allocated in advance. @see ListLenSpecials.
+///
+/// @return [allocated] pointer to the created list.
+list_T *tv_list_alloc_ret(typval_T *const ret_tv, const ptrdiff_t len)
+ FUNC_ATTR_NONNULL_ALL
+{
+ list_T *const l = tv_list_alloc(len);
+ tv_list_set_ret(ret_tv, l);
+ ret_tv->v_lock = VAR_UNLOCKED;
+ return l;
+}
+
+/// Allocate an empty dictionary for a return value
+///
+/// Also sets reference count.
+///
+/// @param[out] ret_tv Structure where dictionary is saved.
+void tv_dict_alloc_ret(typval_T *const ret_tv)
+ FUNC_ATTR_NONNULL_ALL
+{
+ dict_T *const d = tv_dict_alloc();
+ tv_dict_set_ret(ret_tv, d);
+ ret_tv->v_lock = VAR_UNLOCKED;
+}
+
+//{{{3 Clear
+#define TYPVAL_ENCODE_ALLOW_SPECIALS false
+
+#define TYPVAL_ENCODE_CONV_NIL(tv) \
+ do { \
+ tv->vval.v_special = kSpecialVarFalse; \
+ tv->v_lock = VAR_UNLOCKED; \
+ } while (0)
+
+#define TYPVAL_ENCODE_CONV_BOOL(tv, num) \
+ TYPVAL_ENCODE_CONV_NIL(tv)
+
+#define TYPVAL_ENCODE_CONV_NUMBER(tv, num) \
+ do { \
+ (void)num; \
+ tv->vval.v_number = 0; \
+ tv->v_lock = VAR_UNLOCKED; \
+ } while (0)
+
+#define TYPVAL_ENCODE_CONV_UNSIGNED_NUMBER(tv, num)
+
+#define TYPVAL_ENCODE_CONV_FLOAT(tv, flt) \
+ do { \
+ tv->vval.v_float = 0; \
+ tv->v_lock = VAR_UNLOCKED; \
+ } while (0)
+
+#define TYPVAL_ENCODE_CONV_STRING(tv, buf, len) \
+ do { \
+ xfree(buf); \
+ tv->vval.v_string = NULL; \
+ tv->v_lock = VAR_UNLOCKED; \
+ } while (0)
+
+#define TYPVAL_ENCODE_CONV_STR_STRING(tv, buf, len)
+
+#define TYPVAL_ENCODE_CONV_EXT_STRING(tv, buf, len, type)
+
+static inline int _nothing_conv_func_start(typval_T *const tv,
+ char_u *const fun)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_NONNULL_ARG(1)
+{
+ tv->v_lock = VAR_UNLOCKED;
+ if (tv->v_type == VAR_PARTIAL) {
+ partial_T *const pt_ = tv->vval.v_partial;
+ if (pt_ != NULL && pt_->pt_refcount > 1) {
+ pt_->pt_refcount--;
+ tv->vval.v_partial = NULL;
+ return OK;
+ }
+ } else {
+ func_unref(fun);
+ if ((const char *)fun != tv_empty_string) {
+ xfree(fun);
+ }
+ tv->vval.v_string = NULL;
+ }
+ return NOTDONE;
+}
+#define TYPVAL_ENCODE_CONV_FUNC_START(tv, fun) \
+ do { \
+ if (_nothing_conv_func_start(tv, fun) != NOTDONE) { \
+ return OK; \
+ } \
+ } while (0)
+
+#define TYPVAL_ENCODE_CONV_FUNC_BEFORE_ARGS(tv, len)
+#define TYPVAL_ENCODE_CONV_FUNC_BEFORE_SELF(tv, len)
+
+static inline void _nothing_conv_func_end(typval_T *const tv, const int copyID)
+ FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_NONNULL_ALL
+{
+ if (tv->v_type == VAR_PARTIAL) {
+ partial_T *const pt = tv->vval.v_partial;
+ if (pt == NULL) {
+ return;
+ }
+ // Dictionary should already be freed by the time.
+ // If it was not freed then it is a part of the reference cycle.
+ assert(pt->pt_dict == NULL || pt->pt_dict->dv_copyID == copyID);
+ pt->pt_dict = NULL;
+ // As well as all arguments.
+ pt->pt_argc = 0;
+ assert(pt->pt_refcount <= 1);
+ partial_unref(pt);
+ tv->vval.v_partial = NULL;
+ assert(tv->v_lock == VAR_UNLOCKED);
+ }
+}
+#define TYPVAL_ENCODE_CONV_FUNC_END(tv) _nothing_conv_func_end(tv, copyID)
+
+#define TYPVAL_ENCODE_CONV_EMPTY_LIST(tv) \
+ do { \
+ tv_list_unref(tv->vval.v_list); \
+ tv->vval.v_list = NULL; \
+ tv->v_lock = VAR_UNLOCKED; \
+ } while (0)
+
+static inline void _nothing_conv_empty_dict(typval_T *const tv,
+ dict_T **const dictp)
+ FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_NONNULL_ARG(2)
+{
+ tv_dict_unref(*dictp);
+ *dictp = NULL;
+ if (tv != NULL) {
+ tv->v_lock = VAR_UNLOCKED;
+ }
+}
+#define TYPVAL_ENCODE_CONV_EMPTY_DICT(tv, dict) \
+ do { \
+ assert((void *)&dict != (void *)&TYPVAL_ENCODE_NODICT_VAR); \
+ _nothing_conv_empty_dict(tv, ((dict_T **)&dict)); \
+ } while (0)
+
+static inline int _nothing_conv_real_list_after_start(
+ typval_T *const tv, MPConvStackVal *const mpsv)
+ FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ assert(tv != NULL);
+ tv->v_lock = VAR_UNLOCKED;
+ if (tv->vval.v_list->lv_refcount > 1) {
+ tv->vval.v_list->lv_refcount--;
+ tv->vval.v_list = NULL;
+ mpsv->data.l.li = NULL;
+ return OK;
+ }
+ return NOTDONE;
+}
+#define TYPVAL_ENCODE_CONV_LIST_START(tv, len)
+
+#define TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START(tv, mpsv) \
+ do { \
+ if (_nothing_conv_real_list_after_start(tv, &mpsv) != NOTDONE) { \
+ goto typval_encode_stop_converting_one_item; \
+ } \
+ } while (0)
+
+#define TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS(tv)
+
+static inline void _nothing_conv_list_end(typval_T *const tv)
+ FUNC_ATTR_ALWAYS_INLINE
+{
+ if (tv == NULL) {
+ return;
+ }
+ assert(tv->v_type == VAR_LIST);
+ list_T *const list = tv->vval.v_list;
+ tv_list_unref(list);
+ tv->vval.v_list = NULL;
+}
+#define TYPVAL_ENCODE_CONV_LIST_END(tv) _nothing_conv_list_end(tv)
+
+static inline int _nothing_conv_real_dict_after_start(
+ typval_T *const tv, dict_T **const dictp, const void *const nodictvar,
+ MPConvStackVal *const mpsv)
+ FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ if (tv != NULL) {
+ tv->v_lock = VAR_UNLOCKED;
+ }
+ if ((const void *)dictp != nodictvar && (*dictp)->dv_refcount > 1) {
+ (*dictp)->dv_refcount--;
+ *dictp = NULL;
+ mpsv->data.d.todo = 0;
+ return OK;
+ }
+ return NOTDONE;
+}
+#define TYPVAL_ENCODE_CONV_DICT_START(tv, dict, len)
+
+#define TYPVAL_ENCODE_CONV_REAL_DICT_AFTER_START(tv, dict, mpsv) \
+ do { \
+ if (_nothing_conv_real_dict_after_start( \
+ tv, (dict_T **)&dict, (void *)&TYPVAL_ENCODE_NODICT_VAR, \
+ &mpsv) != NOTDONE) { \
+ goto typval_encode_stop_converting_one_item; \
+ } \
+ } while (0)
+
+#define TYPVAL_ENCODE_SPECIAL_DICT_KEY_CHECK(tv, dict)
+#define TYPVAL_ENCODE_CONV_DICT_AFTER_KEY(tv, dict)
+#define TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS(tv, dict)
+
+static inline void _nothing_conv_dict_end(typval_T *const tv,
+ dict_T **const dictp,
+ const void *const nodictvar)
+ FUNC_ATTR_ALWAYS_INLINE
+{
+ if ((const void *)dictp != nodictvar) {
+ tv_dict_unref(*dictp);
+ *dictp = NULL;
+ }
+}
+#define TYPVAL_ENCODE_CONV_DICT_END(tv, dict) \
+ _nothing_conv_dict_end(tv, (dict_T **)&dict, \
+ (void *)&TYPVAL_ENCODE_NODICT_VAR)
+
+#define TYPVAL_ENCODE_CONV_RECURSE(val, conv_type)
+
+#define TYPVAL_ENCODE_SCOPE static
+#define TYPVAL_ENCODE_NAME nothing
+#define TYPVAL_ENCODE_FIRST_ARG_TYPE const void *const
+#define TYPVAL_ENCODE_FIRST_ARG_NAME ignored
+#define TYPVAL_ENCODE_TRANSLATE_OBJECT_NAME
+#include "nvim/eval/typval_encode.c.h"
+#undef TYPVAL_ENCODE_SCOPE
+#undef TYPVAL_ENCODE_NAME
+#undef TYPVAL_ENCODE_FIRST_ARG_TYPE
+#undef TYPVAL_ENCODE_FIRST_ARG_NAME
+#undef TYPVAL_ENCODE_TRANSLATE_OBJECT_NAME
+
+#undef TYPVAL_ENCODE_ALLOW_SPECIALS
+#undef TYPVAL_ENCODE_CONV_NIL
+#undef TYPVAL_ENCODE_CONV_BOOL
+#undef TYPVAL_ENCODE_CONV_NUMBER
+#undef TYPVAL_ENCODE_CONV_UNSIGNED_NUMBER
+#undef TYPVAL_ENCODE_CONV_FLOAT
+#undef TYPVAL_ENCODE_CONV_STRING
+#undef TYPVAL_ENCODE_CONV_STR_STRING
+#undef TYPVAL_ENCODE_CONV_EXT_STRING
+#undef TYPVAL_ENCODE_CONV_FUNC_START
+#undef TYPVAL_ENCODE_CONV_FUNC_BEFORE_ARGS
+#undef TYPVAL_ENCODE_CONV_FUNC_BEFORE_SELF
+#undef TYPVAL_ENCODE_CONV_FUNC_END
+#undef TYPVAL_ENCODE_CONV_EMPTY_LIST
+#undef TYPVAL_ENCODE_CONV_EMPTY_DICT
+#undef TYPVAL_ENCODE_CONV_LIST_START
+#undef TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START
+#undef TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS
+#undef TYPVAL_ENCODE_CONV_LIST_END
+#undef TYPVAL_ENCODE_CONV_DICT_START
+#undef TYPVAL_ENCODE_CONV_REAL_DICT_AFTER_START
+#undef TYPVAL_ENCODE_SPECIAL_DICT_KEY_CHECK
+#undef TYPVAL_ENCODE_CONV_DICT_AFTER_KEY
+#undef TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS
+#undef TYPVAL_ENCODE_CONV_DICT_END
+#undef TYPVAL_ENCODE_CONV_RECURSE
+
+/// Free memory for a variable value and set the value to NULL or 0
+///
+/// @param[in,out] tv Value to free.
+void tv_clear(typval_T *const tv)
+{
+ if (tv != NULL && tv->v_type != VAR_UNKNOWN) {
+ // WARNING: do not translate the string here, gettext is slow and function
+ // is used *very* often. At the current state encode_vim_to_nothing() does
+ // not error out and does not use the argument anywhere.
+ //
+ // If situation changes and this argument will be used, translate it in the
+ // place where it is used.
+ const int evn_ret = encode_vim_to_nothing(NULL, tv, "tv_clear() argument");
+ (void)evn_ret;
+ assert(evn_ret == OK);
+ }
+}
+
+//{{{3 Free
+
+/// Free allocated VimL object and value stored inside
+///
+/// @param tv Object to free.
+void tv_free(typval_T *tv)
+{
+ if (tv != NULL) {
+ switch (tv->v_type) {
+ case VAR_PARTIAL: {
+ partial_unref(tv->vval.v_partial);
+ break;
+ }
+ case VAR_FUNC: {
+ func_unref(tv->vval.v_string);
+ FALLTHROUGH;
+ }
+ case VAR_STRING: {
+ xfree(tv->vval.v_string);
+ break;
+ }
+ case VAR_LIST: {
+ tv_list_unref(tv->vval.v_list);
+ break;
+ }
+ case VAR_DICT: {
+ tv_dict_unref(tv->vval.v_dict);
+ break;
+ }
+ case VAR_SPECIAL:
+ case VAR_NUMBER:
+ case VAR_FLOAT:
+ case VAR_UNKNOWN: {
+ break;
+ }
+ }
+ xfree(tv);
+ }
+}
+
+//{{{3 Copy
+
+/// Copy typval from one location to another
+///
+/// When needed allocates string or increases reference count. Does not make
+/// a copy of a container, but copies its reference!
+///
+/// It is OK for `from` and `to` to point to the same location; this is used to
+/// make a copy later.
+///
+/// @param[in] from Location to copy from.
+/// @param[out] to Location to copy to.
+void tv_copy(const typval_T *const from, typval_T *const to)
+{
+ to->v_type = from->v_type;
+ to->v_lock = VAR_UNLOCKED;
+ memmove(&to->vval, &from->vval, sizeof(to->vval));
+ switch (from->v_type) {
+ case VAR_NUMBER:
+ case VAR_FLOAT:
+ case VAR_SPECIAL: {
+ break;
+ }
+ case VAR_STRING:
+ case VAR_FUNC: {
+ if (from->vval.v_string != NULL) {
+ to->vval.v_string = vim_strsave(from->vval.v_string);
+ if (from->v_type == VAR_FUNC) {
+ func_ref(to->vval.v_string);
+ }
+ }
+ break;
+ }
+ case VAR_PARTIAL: {
+ if (to->vval.v_partial != NULL) {
+ to->vval.v_partial->pt_refcount++;
+ }
+ break;
+ }
+ case VAR_LIST: {
+ tv_list_ref(to->vval.v_list);
+ break;
+ }
+ case VAR_DICT: {
+ if (from->vval.v_dict != NULL) {
+ to->vval.v_dict->dv_refcount++;
+ }
+ break;
+ }
+ case VAR_UNKNOWN: {
+ emsgf(_(e_intern2), "tv_copy(UNKNOWN)");
+ break;
+ }
+ }
+}
+
+//{{{2 Locks
+
+/// Lock or unlock an item
+///
+/// @param[out] tv Item to (un)lock.
+/// @param[in] deep Levels to (un)lock, -1 to (un)lock everything.
+/// @param[in] lock True if it is needed to lock an item, false to unlock.
+void tv_item_lock(typval_T *const tv, const int deep, const bool lock)
+ FUNC_ATTR_NONNULL_ALL
+{
+ // TODO(ZyX-I): Make this not recursive
+ static int recurse = 0;
+
+ if (recurse >= DICT_MAXNEST) {
+ EMSG(_("E743: variable nested too deep for (un)lock"));
+ return;
+ }
+ if (deep == 0) {
+ return;
+ }
+ recurse++;
+
+ // lock/unlock the item itself
+#define CHANGE_LOCK(lock, var) \
+ do { \
+ var = ((VarLockStatus[]) { \
+ [VAR_UNLOCKED] = (lock ? VAR_LOCKED : VAR_UNLOCKED), \
+ [VAR_LOCKED] = (lock ? VAR_LOCKED : VAR_UNLOCKED), \
+ [VAR_FIXED] = VAR_FIXED, \
+ })[var]; \
+ } while (0)
+ CHANGE_LOCK(lock, tv->v_lock);
+
+ switch (tv->v_type) {
+ case VAR_LIST: {
+ list_T *const l = tv->vval.v_list;
+ if (l != NULL) {
+ CHANGE_LOCK(lock, l->lv_lock);
+ if (deep < 0 || deep > 1) {
+ // Recursive: lock/unlock the items the List contains.
+ TV_LIST_ITER(l, li, {
+ tv_item_lock(TV_LIST_ITEM_TV(li), deep - 1, lock);
+ });
+ }
+ }
+ break;
+ }
+ case VAR_DICT: {
+ dict_T *const d = tv->vval.v_dict;
+ if (d != NULL) {
+ CHANGE_LOCK(lock, d->dv_lock);
+ if (deep < 0 || deep > 1) {
+ // recursive: lock/unlock the items the List contains
+ TV_DICT_ITER(d, di, {
+ tv_item_lock(&di->di_tv, deep - 1, lock);
+ });
+ }
+ }
+ break;
+ }
+ case VAR_NUMBER:
+ case VAR_FLOAT:
+ case VAR_STRING:
+ case VAR_FUNC:
+ case VAR_PARTIAL:
+ case VAR_SPECIAL: {
+ break;
+ }
+ case VAR_UNKNOWN: {
+ assert(false);
+ }
+ }
+#undef CHANGE_LOCK
+ recurse--;
+}
+
+/// Check whether VimL value is locked itself or refers to a locked container
+///
+/// @warning Fixed container is not the same as locked.
+///
+/// @param[in] tv Value to check.
+///
+/// @return True if value is locked, false otherwise.
+bool tv_islocked(const typval_T *const tv)
+ FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
+{
+ return ((tv->v_lock == VAR_LOCKED)
+ || (tv->v_type == VAR_LIST
+ && (tv_list_locked(tv->vval.v_list) == VAR_LOCKED))
+ || (tv->v_type == VAR_DICT
+ && tv->vval.v_dict != NULL
+ && (tv->vval.v_dict->dv_lock == VAR_LOCKED)));
+}
+
+/// Return true if typval is locked
+///
+/// Also gives an error message when typval is locked.
+///
+/// @param[in] lock Lock status.
+/// @param[in] name Variable name, used in the error message.
+/// @param[in] name_len Variable name length. Use #TV_TRANSLATE to translate
+/// variable name and compute the length. Use #TV_CSTRING
+/// to compute the length with strlen() without
+/// translating.
+///
+/// Both #TV_โ€ฆ values are used for optimization purposes:
+/// variable name with its length is needed only in case
+/// of error, when no error occurs computing them is
+/// a waste of CPU resources. This especially applies to
+/// gettext.
+///
+/// @return true if variable is locked, false otherwise.
+bool tv_check_lock(const VarLockStatus lock, const char *name,
+ size_t name_len)
+ FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ const char *error_message = NULL;
+ switch (lock) {
+ case VAR_UNLOCKED: {
+ return false;
+ }
+ case VAR_LOCKED: {
+ error_message = N_("E741: Value is locked: %.*s");
+ break;
+ }
+ case VAR_FIXED: {
+ error_message = N_("E742: Cannot change value of %.*s");
+ break;
+ }
+ }
+ assert(error_message != NULL);
+
+ if (name == NULL) {
+ name = _("Unknown");
+ name_len = strlen(name);
+ } else if (name_len == TV_TRANSLATE) {
+ name = _(name);
+ name_len = strlen(name);
+ } else if (name_len == TV_CSTRING) {
+ name_len = strlen(name);
+ }
+
+ emsgf(_(error_message), (int)name_len, name);
+
+ return true;
+}
+
+//{{{2 Comparison
+
+static int tv_equal_recurse_limit;
+
+/// Compare two VimL values
+///
+/// Like "==", but strings and numbers are different, as well as floats and
+/// numbers.
+///
+/// @warning Too nested structures may be considered equal even if they are not.
+///
+/// @param[in] tv1 First value to compare.
+/// @param[in] tv2 Second value to compare.
+/// @param[in] ic True if case is to be ignored.
+/// @param[in] recursive True when used recursively.
+///
+/// @return true if values are equal.
+bool tv_equal(typval_T *const tv1, typval_T *const tv2, const bool ic,
+ const bool recursive)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
+{
+ // TODO(ZyX-I): Make this not recursive
+ static int recursive_cnt = 0; // Catch recursive loops.
+
+ if (!(tv_is_func(*tv1) && tv_is_func(*tv2)) && tv1->v_type != tv2->v_type) {
+ return false;
+ }
+
+ // Catch lists and dicts that have an endless loop by limiting
+ // recursiveness to a limit. We guess they are equal then.
+ // A fixed limit has the problem of still taking an awful long time.
+ // Reduce the limit every time running into it. That should work fine for
+ // deeply linked structures that are not recursively linked and catch
+ // recursiveness quickly.
+ if (!recursive) {
+ tv_equal_recurse_limit = 1000;
+ }
+ if (recursive_cnt >= tv_equal_recurse_limit) {
+ tv_equal_recurse_limit--;
+ return true;
+ }
+
+ switch (tv1->v_type) {
+ case VAR_LIST: {
+ recursive_cnt++;
+ const bool r = tv_list_equal(tv1->vval.v_list, tv2->vval.v_list, ic,
+ true);
+ recursive_cnt--;
+ return r;
+ }
+ case VAR_DICT: {
+ recursive_cnt++;
+ const bool r = tv_dict_equal(tv1->vval.v_dict, tv2->vval.v_dict, ic,
+ true);
+ recursive_cnt--;
+ return r;
+ }
+ case VAR_PARTIAL:
+ case VAR_FUNC: {
+ if ((tv1->v_type == VAR_PARTIAL && tv1->vval.v_partial == NULL)
+ || (tv2->v_type == VAR_PARTIAL && tv2->vval.v_partial == NULL)) {
+ return false;
+ }
+ recursive_cnt++;
+ const bool r = func_equal(tv1, tv2, ic);
+ recursive_cnt--;
+ return r;
+ }
+ case VAR_NUMBER: {
+ return tv1->vval.v_number == tv2->vval.v_number;
+ }
+ case VAR_FLOAT: {
+ return tv1->vval.v_float == tv2->vval.v_float;
+ }
+ case VAR_STRING: {
+ char buf1[NUMBUFLEN];
+ char buf2[NUMBUFLEN];
+ const char *s1 = tv_get_string_buf(tv1, buf1);
+ const char *s2 = tv_get_string_buf(tv2, buf2);
+ return mb_strcmp_ic((bool)ic, s1, s2) == 0;
+ }
+ case VAR_SPECIAL: {
+ return tv1->vval.v_special == tv2->vval.v_special;
+ }
+ case VAR_UNKNOWN: {
+ // VAR_UNKNOWN can be the result of an invalid expression, letโ€™s say it
+ // does not equal anything, not even self.
+ return false;
+ }
+ }
+
+ assert(false);
+ return false;
+}
+
+//{{{2 Type checks
+
+/// Check that given value is a number or string
+///
+/// Error messages are compatible with tv_get_number() previously used for the
+/// same purpose in buf*() functions. Special values are not accepted (previous
+/// behaviour: silently fail to find buffer).
+///
+/// @param[in] tv Value to check.
+///
+/// @return true if everything is OK, false otherwise.
+bool tv_check_str_or_nr(const typval_T *const tv)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
+{
+ switch (tv->v_type) {
+ case VAR_NUMBER:
+ case VAR_STRING: {
+ return true;
+ }
+ case VAR_FLOAT: {
+ EMSG(_("E805: Expected a Number or a String, Float found"));
+ return false;
+ }
+ case VAR_PARTIAL:
+ case VAR_FUNC: {
+ EMSG(_("E703: Expected a Number or a String, Funcref found"));
+ return false;
+ }
+ case VAR_LIST: {
+ EMSG(_("E745: Expected a Number or a String, List found"));
+ return false;
+ }
+ case VAR_DICT: {
+ EMSG(_("E728: Expected a Number or a String, Dictionary found"));
+ return false;
+ }
+ case VAR_SPECIAL: {
+ EMSG(_("E5300: Expected a Number or a String"));
+ return false;
+ }
+ case VAR_UNKNOWN: {
+ EMSG2(_(e_intern2), "tv_check_str_or_nr(UNKNOWN)");
+ return false;
+ }
+ }
+ assert(false);
+ return false;
+}
+
+#define FUNC_ERROR "E703: Using a Funcref as a Number"
+
+static const char *const num_errors[] = {
+ [VAR_PARTIAL]=N_(FUNC_ERROR),
+ [VAR_FUNC]=N_(FUNC_ERROR),
+ [VAR_LIST]=N_("E745: Using a List as a Number"),
+ [VAR_DICT]=N_("E728: Using a Dictionary as a Number"),
+ [VAR_FLOAT]=N_("E805: Using a Float as a Number"),
+ [VAR_UNKNOWN]=N_("E685: using an invalid value as a Number"),
+};
+
+#undef FUNC_ERROR
+
+/// Check that given value is a number or can be converted to it
+///
+/// Error messages are compatible with tv_get_number_chk() previously used for
+/// the same purpose.
+///
+/// @param[in] tv Value to check.
+///
+/// @return true if everything is OK, false otherwise.
+bool tv_check_num(const typval_T *const tv)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ switch (tv->v_type) {
+ case VAR_NUMBER:
+ case VAR_SPECIAL:
+ case VAR_STRING: {
+ return true;
+ }
+ case VAR_FUNC:
+ case VAR_PARTIAL:
+ case VAR_LIST:
+ case VAR_DICT:
+ case VAR_FLOAT:
+ case VAR_UNKNOWN: {
+ EMSG(_(num_errors[tv->v_type]));
+ return false;
+ }
+ }
+ assert(false);
+ return false;
+}
+
+#define FUNC_ERROR "E729: using Funcref as a String"
+
+static const char *const str_errors[] = {
+ [VAR_PARTIAL]=N_(FUNC_ERROR),
+ [VAR_FUNC]=N_(FUNC_ERROR),
+ [VAR_LIST]=N_("E730: using List as a String"),
+ [VAR_DICT]=N_("E731: using Dictionary as a String"),
+ [VAR_FLOAT]=((const char *)e_float_as_string),
+ [VAR_UNKNOWN]=N_("E908: using an invalid value as a String"),
+};
+
+#undef FUNC_ERROR
+
+/// Check that given value is a VimL String or can be "cast" to it.
+///
+/// Error messages are compatible with tv_get_string_chk() previously used for
+/// the same purpose.
+///
+/// @param[in] tv Value to check.
+///
+/// @return true if everything is OK, false otherwise.
+bool tv_check_str(const typval_T *const tv)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ switch (tv->v_type) {
+ case VAR_NUMBER:
+ case VAR_SPECIAL:
+ case VAR_STRING: {
+ return true;
+ }
+ case VAR_PARTIAL:
+ case VAR_FUNC:
+ case VAR_LIST:
+ case VAR_DICT:
+ case VAR_FLOAT:
+ case VAR_UNKNOWN: {
+ EMSG(_(str_errors[tv->v_type]));
+ return false;
+ }
+ }
+ assert(false);
+ return false;
+}
+
+//{{{2 Get
+
+/// Get the number value of a VimL object
+///
+/// @note Use tv_get_number_chk() if you need to determine whether there was an
+/// error.
+///
+/// @param[in] tv Object to get value from.
+///
+/// @return Number value: vim_str2nr() output for VAR_STRING objects, value
+/// for VAR_NUMBER objects, -1 for other types.
+varnumber_T tv_get_number(const typval_T *const tv)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ bool error = false;
+ return tv_get_number_chk(tv, &error);
+}
+
+/// Get the number value of a VimL object
+///
+/// @param[in] tv Object to get value from.
+/// @param[out] ret_error If type error occurred then `true` will be written
+/// to this location. Otherwise it is not touched.
+///
+/// @note Needs to be initialized to `false` to be
+/// useful.
+///
+/// @return Number value: vim_str2nr() output for VAR_STRING objects, value
+/// for VAR_NUMBER objects, -1 (ret_error == NULL) or 0 (otherwise) for
+/// other types.
+varnumber_T tv_get_number_chk(const typval_T *const tv, bool *const ret_error)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ARG(1)
+{
+ switch (tv->v_type) {
+ case VAR_FUNC:
+ case VAR_PARTIAL:
+ case VAR_LIST:
+ case VAR_DICT:
+ case VAR_FLOAT: {
+ EMSG(_(num_errors[tv->v_type]));
+ break;
+ }
+ case VAR_NUMBER: {
+ return tv->vval.v_number;
+ }
+ case VAR_STRING: {
+ varnumber_T n = 0;
+ if (tv->vval.v_string != NULL) {
+ vim_str2nr(tv->vval.v_string, NULL, NULL, STR2NR_ALL, &n, NULL, 0);
+ }
+ return n;
+ }
+ case VAR_SPECIAL: {
+ switch (tv->vval.v_special) {
+ case kSpecialVarTrue: {
+ return 1;
+ }
+ case kSpecialVarFalse:
+ case kSpecialVarNull: {
+ return 0;
+ }
+ }
+ break;
+ }
+ case VAR_UNKNOWN: {
+ emsgf(_(e_intern2), "tv_get_number(UNKNOWN)");
+ break;
+ }
+ }
+ if (ret_error != NULL) {
+ *ret_error = true;
+ }
+ return (ret_error == NULL ? -1 : 0);
+}
+
+/// Get the line number from VimL object
+///
+/// @param[in] tv Object to get value from. Is expected to be a number or
+/// a special string like ".", "$", โ€ฆ (works with current buffer
+/// only).
+///
+/// @return Line number or -1 or 0.
+linenr_T tv_get_lnum(const typval_T *const tv)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ linenr_T lnum = (linenr_T)tv_get_number_chk(tv, NULL);
+ if (lnum == 0) { // No valid number, try using same function as line() does.
+ int fnum;
+ pos_T *const fp = var2fpos(tv, true, &fnum);
+ if (fp != NULL) {
+ lnum = fp->lnum;
+ }
+ }
+ return lnum;
+}
+
+/// Get the floating-point value of a VimL object
+///
+/// Raises an error if object is not number or floating-point.
+///
+/// @param[in] tv Object to get value of.
+///
+/// @return Floating-point value of the variable or zero.
+float_T tv_get_float(const typval_T *const tv)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ switch (tv->v_type) {
+ case VAR_NUMBER: {
+ return (float_T)(tv->vval.v_number);
+ }
+ case VAR_FLOAT: {
+ return tv->vval.v_float;
+ }
+ case VAR_PARTIAL:
+ case VAR_FUNC: {
+ EMSG(_("E891: Using a Funcref as a Float"));
+ break;
+ }
+ case VAR_STRING: {
+ EMSG(_("E892: Using a String as a Float"));
+ break;
+ }
+ case VAR_LIST: {
+ EMSG(_("E893: Using a List as a Float"));
+ break;
+ }
+ case VAR_DICT: {
+ EMSG(_("E894: Using a Dictionary as a Float"));
+ break;
+ }
+ case VAR_SPECIAL: {
+ EMSG(_("E907: Using a special value as a Float"));
+ break;
+ }
+ case VAR_UNKNOWN: {
+ emsgf(_(e_intern2), "tv_get_float(UNKNOWN)");
+ break;
+ }
+ }
+ return 0;
+}
+
+/// Get the string value of a "stringish" VimL object.
+///
+/// @param[in] tv Object to get value of.
+/// @param buf Buffer used to hold numbers and special variables converted to
+/// string. When function encounters one of these stringified value
+/// will be written to buf and buf will be returned.
+///
+/// Buffer must have NUMBUFLEN size.
+///
+/// @return Object value if it is VAR_STRING object, number converted to
+/// a string for VAR_NUMBER, v: variable name for VAR_SPECIAL or NULL.
+const char *tv_get_string_buf_chk(const typval_T *const tv, char *const buf)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ switch (tv->v_type) {
+ case VAR_NUMBER: {
+ snprintf(buf, NUMBUFLEN, "%" PRIdVARNUMBER, tv->vval.v_number); // -V576
+ return buf;
+ }
+ case VAR_STRING: {
+ if (tv->vval.v_string != NULL) {
+ return (const char *)tv->vval.v_string;
+ }
+ return "";
+ }
+ case VAR_SPECIAL: {
+ STRCPY(buf, encode_special_var_names[tv->vval.v_special]);
+ return buf;
+ }
+ case VAR_PARTIAL:
+ case VAR_FUNC:
+ case VAR_LIST:
+ case VAR_DICT:
+ case VAR_FLOAT:
+ case VAR_UNKNOWN: {
+ EMSG(_(str_errors[tv->v_type]));
+ return false;
+ }
+ }
+ return NULL;
+}
+
+/// Get the string value of a "stringish" VimL object.
+///
+/// @warning For number and special values it uses a single, static buffer. It
+/// may be used only once, next call to tv_get_string may reuse it. Use
+/// tv_get_string_buf() if you need to use tv_get_string() output after
+/// calling it again.
+///
+/// @param[in] tv Object to get value of.
+///
+/// @return Object value if it is VAR_STRING object, number converted to
+/// a string for VAR_NUMBER, v: variable name for VAR_SPECIAL or NULL.
+const char *tv_get_string_chk(const typval_T *const tv)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ static char mybuf[NUMBUFLEN];
+
+ return tv_get_string_buf_chk(tv, mybuf);
+}
+
+/// Get the string value of a "stringish" VimL object.
+///
+/// @warning For number and special values it uses a single, static buffer. It
+/// may be used only once, next call to tv_get_string may reuse it. Use
+/// tv_get_string_buf() if you need to use tv_get_string() output after
+/// calling it again.
+///
+/// @note tv_get_string_chk() and tv_get_string_buf_chk() are similar, but
+/// return NULL on error.
+///
+/// @param[in] tv Object to get value of.
+///
+/// @return Object value if it is VAR_STRING object, number converted to
+/// a string for VAR_NUMBER, v: variable name for VAR_SPECIAL or empty
+/// string.
+const char *tv_get_string(const typval_T *const tv)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_RET FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ static char mybuf[NUMBUFLEN];
+ return tv_get_string_buf((typval_T *)tv, mybuf);
+}
+
+/// Get the string value of a "stringish" VimL object.
+///
+/// @note tv_get_string_chk() and tv_get_string_buf_chk() are similar, but
+/// return NULL on error.
+///
+/// @param[in] tv Object to get value of.
+/// @param buf Buffer used to hold numbers and special variables converted to
+/// string. When function encounters one of these stringified value
+/// will be written to buf and buf will be returned.
+///
+/// Buffer must have NUMBUFLEN size.
+///
+/// @return Object value if it is VAR_STRING object, number converted to
+/// a string for VAR_NUMBER, v: variable name for VAR_SPECIAL or empty
+/// string.
+const char *tv_get_string_buf(const typval_T *const tv, char *const buf)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_RET FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ const char *const res = (const char *)tv_get_string_buf_chk(tv, buf);
+
+ return res != NULL ? res : "";
+}
diff --git a/src/nvim/eval/typval.h b/src/nvim/eval/typval.h
new file mode 100644
index 0000000000..e99289c430
--- /dev/null
+++ b/src/nvim/eval/typval.h
@@ -0,0 +1,842 @@
+#ifndef NVIM_EVAL_TYPVAL_H
+#define NVIM_EVAL_TYPVAL_H
+
+#include <inttypes.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdbool.h>
+#include <assert.h>
+#include <limits.h>
+
+#include "nvim/types.h"
+#include "nvim/hashtab.h"
+#include "nvim/garray.h"
+#include "nvim/mbyte.h"
+#include "nvim/func_attr.h"
+#include "nvim/lib/queue.h"
+#include "nvim/profile.h" // for proftime_T
+#include "nvim/pos.h" // for linenr_T
+#include "nvim/gettext.h"
+#include "nvim/message.h"
+#include "nvim/macros.h"
+#ifdef LOG_LIST_ACTIONS
+# include "nvim/memory.h"
+#endif
+
+/// Type used for VimL VAR_NUMBER values
+typedef int64_t varnumber_T;
+typedef uint64_t uvarnumber_T;
+
+/// Type used for VimL VAR_FLOAT values
+typedef double float_T;
+
+/// Refcount for dict or list that should not be freed
+enum { DO_NOT_FREE_CNT = (INT_MAX / 2) };
+
+/// Additional values for tv_list_alloc() len argument
+enum {
+ /// List length is not known in advance
+ ///
+ /// To be used when there is neither a way to know how many elements will be
+ /// needed nor are any educated guesses.
+ kListLenUnknown = -1,
+ /// List length *should* be known, but is actually not
+ ///
+ /// All occurrences of this value should be eventually removed. This is for
+ /// the case when the only reason why list length is not known is that it
+ /// would be hard to code without refactoring, but refactoring is needed.
+ kListLenShouldKnow = -2,
+ /// List length may be known in advance, but it requires too much effort
+ ///
+ /// To be used when it looks impractical to determine list length.
+ kListLenMayKnow = -3,
+} ListLenSpecials;
+
+/// Maximal possible value of varnumber_T variable
+#define VARNUMBER_MAX INT64_MAX
+#define UVARNUMBER_MAX UINT64_MAX
+
+/// Mimimal possible value of varnumber_T variable
+#define VARNUMBER_MIN INT64_MIN
+
+/// %d printf format specifier for varnumber_T
+#define PRIdVARNUMBER PRId64
+
+typedef struct listvar_S list_T;
+typedef struct dictvar_S dict_T;
+typedef struct partial_S partial_T;
+
+typedef struct ufunc ufunc_T;
+
+typedef enum {
+ kCallbackNone = 0,
+ kCallbackFuncref,
+ kCallbackPartial,
+} CallbackType;
+
+typedef struct {
+ union {
+ char_u *funcref;
+ partial_T *partial;
+ } data;
+ CallbackType type;
+} Callback;
+#define CALLBACK_NONE ((Callback){ .type = kCallbackNone })
+
+/// Structure holding dictionary watcher
+typedef struct dict_watcher {
+ Callback callback;
+ char *key_pattern;
+ size_t key_pattern_len;
+ QUEUE node;
+ bool busy; // prevent recursion if the dict is changed in the callback
+} DictWatcher;
+
+/// Special variable values
+typedef enum {
+ kSpecialVarFalse, ///< v:false
+ kSpecialVarTrue, ///< v:true
+ kSpecialVarNull, ///< v:null
+} SpecialVarValue;
+
+/// Variable lock status for typval_T.v_lock
+typedef enum {
+ VAR_UNLOCKED = 0, ///< Not locked.
+ VAR_LOCKED = 1, ///< User lock, can be unlocked.
+ VAR_FIXED = 2, ///< Locked forever.
+} VarLockStatus;
+
+/// VimL variable types, for use in typval_T.v_type
+typedef enum {
+ VAR_UNKNOWN = 0, ///< Unknown (unspecified) value.
+ VAR_NUMBER, ///< Number, .v_number is used.
+ VAR_STRING, ///< String, .v_string is used.
+ VAR_FUNC, ///< Function reference, .v_string is used as function name.
+ VAR_LIST, ///< List, .v_list is used.
+ VAR_DICT, ///< Dictionary, .v_dict is used.
+ VAR_FLOAT, ///< Floating-point value, .v_float is used.
+ VAR_SPECIAL, ///< Special value (true, false, null), .v_special
+ ///< is used.
+ VAR_PARTIAL, ///< Partial, .v_partial is used.
+} VarType;
+
+/// Structure that holds an internal variable value
+typedef struct {
+ VarType v_type; ///< Variable type.
+ VarLockStatus v_lock; ///< Variable lock status.
+ union typval_vval_union {
+ varnumber_T v_number; ///< Number, for VAR_NUMBER.
+ SpecialVarValue v_special; ///< Special value, for VAR_SPECIAL.
+ float_T v_float; ///< Floating-point number, for VAR_FLOAT.
+ char_u *v_string; ///< String, for VAR_STRING and VAR_FUNC, can be NULL.
+ list_T *v_list; ///< List for VAR_LIST, can be NULL.
+ dict_T *v_dict; ///< Dictionary for VAR_DICT, can be NULL.
+ partial_T *v_partial; ///< Closure: function with args.
+ } vval; ///< Actual value.
+} typval_T;
+
+/// Values for (struct dictvar_S).dv_scope
+typedef enum {
+ VAR_NO_SCOPE = 0, ///< Not a scope dictionary.
+ VAR_SCOPE = 1, ///< Scope dictionary which requires prefix (a:, v:, โ€ฆ).
+ VAR_DEF_SCOPE = 2, ///< Scope dictionary which may be accessed without prefix
+ ///< (l:, g:).
+} ScopeType;
+
+/// Structure to hold an item of a list
+typedef struct listitem_S listitem_T;
+
+struct listitem_S {
+ listitem_T *li_next; ///< Next item in list.
+ listitem_T *li_prev; ///< Previous item in list.
+ typval_T li_tv; ///< Item value.
+};
+
+/// Structure used by those that are using an item in a list
+typedef struct listwatch_S listwatch_T;
+
+struct listwatch_S {
+ listitem_T *lw_item; ///< Item being watched.
+ listwatch_T *lw_next; ///< Next watcher.
+};
+
+/// Structure to hold info about a list
+/// Order of members is optimized to reduce padding.
+struct listvar_S {
+ listitem_T *lv_first; ///< First item, NULL if none.
+ listitem_T *lv_last; ///< Last item, NULL if none.
+ listwatch_T *lv_watch; ///< First watcher, NULL if none.
+ listitem_T *lv_idx_item; ///< When not NULL item at index "lv_idx".
+ list_T *lv_copylist; ///< Copied list used by deepcopy().
+ list_T *lv_used_next; ///< next list in used lists list.
+ list_T *lv_used_prev; ///< Previous list in used lists list.
+ int lv_refcount; ///< Reference count.
+ int lv_len; ///< Number of items.
+ int lv_idx; ///< Index of a cached item, used for optimising repeated l[idx].
+ int lv_copyID; ///< ID used by deepcopy().
+ VarLockStatus lv_lock; ///< Zero, VAR_LOCKED, VAR_FIXED.
+};
+
+// Static list with 10 items. Use tv_list_init_static10() to initialize.
+typedef struct {
+ list_T sl_list; // must be first
+ listitem_T sl_items[10];
+} staticList10_T;
+
+#define TV_LIST_STATIC10_INIT { \
+ .sl_list = { \
+ .lv_first = NULL, \
+ .lv_last = NULL, \
+ .lv_refcount = 0, \
+ .lv_len = 0, \
+ .lv_watch = NULL, \
+ .lv_idx_item = NULL, \
+ .lv_lock = VAR_FIXED, \
+ .lv_used_next = NULL, \
+ .lv_used_prev = NULL, \
+ }, \
+ }
+
+#define TV_DICTITEM_STRUCT(...) \
+ struct { \
+ typval_T di_tv; /* Structure that holds scope dictionary itself. */ \
+ uint8_t di_flags; /* Flags. */ \
+ char_u di_key[__VA_ARGS__]; /* Key value. */ \
+ }
+
+/// Structure to hold a scope dictionary
+///
+/// @warning Must be compatible with dictitem_T.
+///
+/// For use in find_var_in_ht to pretend that it found dictionary item when it
+/// finds scope dictionary.
+typedef TV_DICTITEM_STRUCT(1) ScopeDictDictItem;
+
+/// Structure to hold an item of a Dictionary
+///
+/// @warning Must be compatible with ScopeDictDictItem.
+///
+/// Also used for a variable.
+typedef TV_DICTITEM_STRUCT() dictitem_T;
+
+/// Flags for dictitem_T.di_flags
+typedef enum {
+ DI_FLAGS_RO = 1, ///< Read-only value
+ DI_FLAGS_RO_SBX = 2, ///< Value, read-only in the sandbox
+ DI_FLAGS_FIX = 4, ///< Fixed value: cannot be :unlet or remove()d.
+ DI_FLAGS_LOCK = 8, ///< Locked value.
+ DI_FLAGS_ALLOC = 16, ///< Separately allocated.
+} DictItemFlags;
+
+/// Structure representing a Dictionary
+struct dictvar_S {
+ VarLockStatus dv_lock; ///< Whole dictionary lock status.
+ ScopeType dv_scope; ///< Non-zero (#VAR_SCOPE, #VAR_DEF_SCOPE) if
+ ///< dictionary represents a scope (i.e. g:, l: โ€ฆ).
+ int dv_refcount; ///< Reference count.
+ int dv_copyID; ///< ID used when recursivery traversing a value.
+ hashtab_T dv_hashtab; ///< Hashtab containing all items.
+ dict_T *dv_copydict; ///< Copied dict used by deepcopy().
+ dict_T *dv_used_next; ///< Next dictionary in used dictionaries list.
+ dict_T *dv_used_prev; ///< Previous dictionary in used dictionaries list.
+ QUEUE watchers; ///< Dictionary key watchers set by user code.
+};
+
+/// Type used for script ID
+typedef int scid_T;
+/// Format argument for scid_T
+#define PRIdSCID "d"
+
+// Structure to hold info for a function that is currently being executed.
+typedef struct funccall_S funccall_T;
+
+/// Structure to hold info for a user function.
+struct ufunc {
+ int uf_varargs; ///< variable nr of arguments
+ int uf_flags;
+ int uf_calls; ///< nr of active calls
+ bool uf_cleared; ///< func_clear() was already called
+ garray_T uf_args; ///< arguments
+ garray_T uf_lines; ///< function lines
+ int uf_profiling; ///< true when func is being profiled
+ // Profiling the function as a whole.
+ int uf_tm_count; ///< nr of calls
+ proftime_T uf_tm_total; ///< time spent in function + children
+ proftime_T uf_tm_self; ///< time spent in function itself
+ proftime_T uf_tm_children; ///< time spent in children this call
+ // Profiling the function per line.
+ int *uf_tml_count; ///< nr of times line was executed
+ proftime_T *uf_tml_total; ///< time spent in a line + children
+ proftime_T *uf_tml_self; ///< time spent in a line itself
+ proftime_T uf_tml_start; ///< start time for current line
+ proftime_T uf_tml_children; ///< time spent in children for this line
+ proftime_T uf_tml_wait; ///< start wait time for current line
+ int uf_tml_idx; ///< index of line being timed; -1 if none
+ int uf_tml_execed; ///< line being timed was executed
+ scid_T uf_script_ID; ///< ID of script where function was defined,
+ ///< used for s: variables
+ int uf_refcount; ///< reference count, see func_name_refcount()
+ funccall_T *uf_scoped; ///< l: local variables for closure
+ char_u uf_name[]; ///< Name of function; can start with <SNR>123_
+ ///< (<SNR> is K_SPECIAL KS_EXTRA KE_SNR)
+};
+
+/// Maximum number of function arguments
+#define MAX_FUNC_ARGS 20
+
+struct partial_S {
+ int pt_refcount; ///< Reference count.
+ char_u *pt_name; ///< Function name; when NULL use pt_func->name.
+ ufunc_T *pt_func; ///< Function pointer; when NULL lookup function with
+ ///< pt_name.
+ bool pt_auto; ///< When true the partial was created by using dict.member
+ ///< in handle_subscript().
+ int pt_argc; ///< Number of arguments.
+ typval_T *pt_argv; ///< Arguments in allocated array.
+ dict_T *pt_dict; ///< Dict for "self".
+};
+
+/// Structure used for explicit stack while garbage collecting hash tables
+typedef struct ht_stack_S {
+ hashtab_T *ht;
+ struct ht_stack_S *prev;
+} ht_stack_T;
+
+/// Structure used for explicit stack while garbage collecting lists
+typedef struct list_stack_S {
+ list_T *list;
+ struct list_stack_S *prev;
+} list_stack_T;
+
+/// Structure representing one list item, used for sort array.
+typedef struct {
+ listitem_T *item; ///< Sorted list item.
+ int idx; ///< Sorted list item index.
+} ListSortItem;
+
+typedef int (*ListSorter)(const void *, const void *);
+
+#ifdef LOG_LIST_ACTIONS
+
+/// List actions log entry
+typedef struct {
+ uintptr_t l; ///< List log entry belongs to.
+ uintptr_t li1; ///< First list item log entry belongs to, if applicable.
+ uintptr_t li2; ///< Second list item log entry belongs to, if applicable.
+ int len; ///< List length when log entry was created.
+ const char *action; ///< Logged action.
+} ListLogEntry;
+
+typedef struct list_log ListLog;
+
+/// List actions log
+struct list_log {
+ ListLog *next; ///< Next chunk or NULL.
+ size_t capacity; ///< Number of entries in current chunk.
+ size_t size; ///< Current chunk size.
+ ListLogEntry entries[]; ///< Actual log entries.
+};
+
+extern ListLog *list_log_first; ///< First list log chunk, NULL if missing
+extern ListLog *list_log_last; ///< Last list log chunk
+
+static inline ListLog *list_log_alloc(const size_t size)
+ REAL_FATTR_ALWAYS_INLINE REAL_FATTR_WARN_UNUSED_RESULT;
+
+/// Allocate a new log chunk and update globals
+///
+/// @param[in] size Number of entries in a new chunk.
+///
+/// @return [allocated] Newly allocated chunk.
+static inline ListLog *list_log_new(const size_t size)
+{
+ ListLog *ret = xmalloc(offsetof(ListLog, entries)
+ + size * sizeof(ret->entries[0]));
+ ret->size = 0;
+ ret->capacity = size;
+ ret->next = NULL;
+ if (list_log_first == NULL) {
+ list_log_first = ret;
+ } else {
+ list_log_last->next = ret;
+ }
+ list_log_last = ret;
+ return ret;
+}
+
+static inline void list_log(const list_T *const l,
+ const listitem_T *const li1,
+ const listitem_T *const li2,
+ const char *const action)
+ REAL_FATTR_ALWAYS_INLINE;
+
+/// Add new entry to log
+///
+/// If last chunk was filled it uses twice as much memory to allocate the next
+/// chunk.
+///
+/// @param[in] l List to which entry belongs.
+/// @param[in] li1 List item 1.
+/// @param[in] li2 List item 2, often used for integers and not list items.
+/// @param[in] action Logged action.
+static inline void list_log(const list_T *const l,
+ const listitem_T *const li1,
+ const listitem_T *const li2,
+ const char *const action)
+{
+ ListLog *tgt;
+ if (list_log_first == NULL) {
+ tgt = list_log_new(128);
+ } else if (list_log_last->size == list_log_last->capacity) {
+ tgt = list_log_new(list_log_last->capacity * 2);
+ } else {
+ tgt = list_log_last;
+ }
+ tgt->entries[tgt->size++] = (ListLogEntry) {
+ .l = (uintptr_t)l,
+ .li1 = (uintptr_t)li1,
+ .li2 = (uintptr_t)li2,
+ .len = (l == NULL ? 0 : l->lv_len),
+ .action = action,
+ };
+}
+#else
+# define list_log(...)
+# define list_write_log(...)
+# define list_free_log()
+#endif
+
+// In a hashtab item "hi_key" points to "di_key" in a dictitem.
+// This avoids adding a pointer to the hashtab item.
+
+/// Convert a hashitem pointer to a dictitem pointer
+#define TV_DICT_HI2DI(hi) \
+ ((dictitem_T *)((hi)->hi_key - offsetof(dictitem_T, di_key)))
+
+static inline void tv_list_ref(list_T *const l)
+ REAL_FATTR_ALWAYS_INLINE;
+
+/// Increase reference count for a given list
+///
+/// Does nothing for NULL lists.
+///
+/// @param[in,out] l List to modify.
+static inline void tv_list_ref(list_T *const l)
+{
+ if (l == NULL) {
+ return;
+ }
+ l->lv_refcount++;
+}
+
+static inline void tv_list_set_ret(typval_T *const tv, list_T *const l)
+ REAL_FATTR_ALWAYS_INLINE REAL_FATTR_NONNULL_ARG(1);
+
+/// Set a list as the return value
+///
+/// @param[out] tv Object to receive the list
+/// @param[in,out] l List to pass to the object
+static inline void tv_list_set_ret(typval_T *const tv, list_T *const l)
+{
+ tv->v_type = VAR_LIST;
+ tv->vval.v_list = l;
+ tv_list_ref(l);
+}
+
+static inline VarLockStatus tv_list_locked(const list_T *const l)
+ REAL_FATTR_PURE REAL_FATTR_WARN_UNUSED_RESULT;
+
+/// Get list lock status
+///
+/// Returns VAR_FIXED for NULL lists.
+///
+/// @param[in] l List to check.
+static inline VarLockStatus tv_list_locked(const list_T *const l)
+{
+ if (l == NULL) {
+ return VAR_FIXED;
+ }
+ return l->lv_lock;
+}
+
+/// Set list lock status
+///
+/// May only โ€œsetโ€ VAR_FIXED for NULL lists.
+///
+/// @param[out] l List to modify.
+/// @param[in] lock New lock status.
+static inline void tv_list_set_lock(list_T *const l,
+ const VarLockStatus lock)
+{
+ if (l == NULL) {
+ assert(lock == VAR_FIXED);
+ return;
+ }
+ l->lv_lock = lock;
+}
+
+/// Set list copyID
+///
+/// Does not expect NULL list, be careful.
+///
+/// @param[out] l List to modify.
+/// @param[in] copyid New copyID.
+static inline void tv_list_set_copyid(list_T *const l,
+ const int copyid)
+ FUNC_ATTR_NONNULL_ALL
+{
+ l->lv_copyID = copyid;
+}
+
+static inline int tv_list_len(const list_T *const l)
+ REAL_FATTR_PURE REAL_FATTR_WARN_UNUSED_RESULT;
+
+/// Get the number of items in a list
+///
+/// @param[in] l List to check.
+static inline int tv_list_len(const list_T *const l)
+{
+ list_log(l, NULL, NULL, "len");
+ if (l == NULL) {
+ return 0;
+ }
+ return l->lv_len;
+}
+
+static inline int tv_list_copyid(const list_T *const l)
+ REAL_FATTR_PURE REAL_FATTR_WARN_UNUSED_RESULT REAL_FATTR_NONNULL_ALL;
+
+/// Get list copyID
+///
+/// Does not expect NULL list, be careful.
+///
+/// @param[in] l List to check.
+static inline int tv_list_copyid(const list_T *const l)
+{
+ return l->lv_copyID;
+}
+
+static inline list_T *tv_list_latest_copy(const list_T *const l)
+ REAL_FATTR_PURE REAL_FATTR_WARN_UNUSED_RESULT REAL_FATTR_NONNULL_ALL;
+
+/// Get latest list copy
+///
+/// Gets lv_copylist field assigned by tv_list_copy() earlier.
+///
+/// Does not expect NULL list, be careful.
+///
+/// @param[in] l List to check.
+static inline list_T *tv_list_latest_copy(const list_T *const l)
+{
+ return l->lv_copylist;
+}
+
+static inline int tv_list_uidx(const list_T *const l, int n)
+ REAL_FATTR_PURE REAL_FATTR_WARN_UNUSED_RESULT;
+
+/// Normalize index: that is, return either -1 or non-negative index
+///
+/// @param[in] l List to index. Used to get length.
+/// @param[in] n List index, possibly negative.
+///
+/// @return -1 or list index in range [0, tv_list_len(l)).
+static inline int tv_list_uidx(const list_T *const l, int n)
+{
+ // Negative index is relative to the end.
+ if (n < 0) {
+ n += tv_list_len(l);
+ }
+
+ // Check for index out of range.
+ if (n < 0 || n >= tv_list_len(l)) {
+ return -1;
+ }
+ return n;
+}
+
+static inline bool tv_list_has_watchers(const list_T *const l)
+ REAL_FATTR_PURE REAL_FATTR_WARN_UNUSED_RESULT;
+
+/// Check whether list has watchers
+///
+/// E.g. is referenced by a :for loop.
+///
+/// @param[in] l List to check.
+///
+/// @return true if there are watchers, false otherwise.
+static inline bool tv_list_has_watchers(const list_T *const l)
+{
+ return l && l->lv_watch;
+}
+
+static inline listitem_T *tv_list_first(const list_T *const l)
+ REAL_FATTR_PURE REAL_FATTR_WARN_UNUSED_RESULT;
+
+/// Get first list item
+///
+/// @param[in] l List to get item from.
+///
+/// @return List item or NULL in case of an empty list.
+static inline listitem_T *tv_list_first(const list_T *const l)
+{
+ if (l == NULL) {
+ list_log(l, NULL, NULL, "first");
+ return NULL;
+ }
+ list_log(l, l->lv_first, NULL, "first");
+ return l->lv_first;
+}
+
+static inline listitem_T *tv_list_last(const list_T *const l)
+ REAL_FATTR_PURE REAL_FATTR_WARN_UNUSED_RESULT;
+
+/// Get last list item
+///
+/// @param[in] l List to get item from.
+///
+/// @return List item or NULL in case of an empty list.
+static inline listitem_T *tv_list_last(const list_T *const l)
+{
+ if (l == NULL) {
+ list_log(l, NULL, NULL, "last");
+ return NULL;
+ }
+ list_log(l, l->lv_last, NULL, "last");
+ return l->lv_last;
+}
+
+static inline void tv_dict_set_ret(typval_T *const tv, dict_T *const d)
+ REAL_FATTR_ALWAYS_INLINE REAL_FATTR_NONNULL_ARG(1);
+
+/// Set a dictionary as the return value
+///
+/// @param[out] tv Object to receive the dictionary
+/// @param[in,out] d Dictionary to pass to the object
+static inline void tv_dict_set_ret(typval_T *const tv, dict_T *const d)
+{
+ tv->v_type = VAR_DICT;
+ tv->vval.v_dict = d;
+ if (d != NULL) {
+ d->dv_refcount++;
+ }
+}
+
+static inline long tv_dict_len(const dict_T *const d)
+ REAL_FATTR_PURE REAL_FATTR_WARN_UNUSED_RESULT;
+
+/// Get the number of items in a Dictionary
+///
+/// @param[in] d Dictionary to check.
+static inline long tv_dict_len(const dict_T *const d)
+{
+ if (d == NULL) {
+ return 0L;
+ }
+ return (long)d->dv_hashtab.ht_used;
+}
+
+static inline bool tv_dict_is_watched(const dict_T *const d)
+ REAL_FATTR_PURE REAL_FATTR_WARN_UNUSED_RESULT;
+
+/// Check if dictionary is watched
+///
+/// @param[in] d Dictionary to check.
+///
+/// @return true if there is at least one watcher.
+static inline bool tv_dict_is_watched(const dict_T *const d)
+{
+ return d && !QUEUE_EMPTY(&d->watchers);
+}
+
+/// Initialize VimL object
+///
+/// Initializes to unlocked VAR_UNKNOWN object.
+///
+/// @param[out] tv Object to initialize.
+static inline void tv_init(typval_T *const tv)
+{
+ if (tv != NULL) {
+ memset(tv, 0, sizeof(*tv));
+ }
+}
+
+#define TV_INITIAL_VALUE \
+ ((typval_T) { \
+ .v_type = VAR_UNKNOWN, \
+ .v_lock = VAR_UNLOCKED, \
+ })
+
+/// Empty string
+///
+/// Needed for hack which allows not allocating empty string and still not
+/// crashing when freeing it.
+extern const char *const tv_empty_string;
+
+/// Specifies that free_unref_items() function has (not) been entered
+extern bool tv_in_free_unref_items;
+
+/// Iterate over a list
+///
+/// @param modifier Modifier: expected to be const or nothing, volatile should
+/// also work if you have any uses for the volatile list.
+/// @param[in] l List to iterate over.
+/// @param li Name of the variable with current listitem_T entry.
+/// @param code Cycle body.
+#define _TV_LIST_ITER_MOD(modifier, l, li, code) \
+ do { \
+ modifier list_T *const l_ = (l); \
+ list_log(l_, NULL, NULL, "iter" #modifier); \
+ if (l_ != NULL) { \
+ for (modifier listitem_T *li = l_->lv_first; \
+ li != NULL; li = li->li_next) { \
+ code \
+ } \
+ } \
+ } while (0)
+
+/// Iterate over a list
+///
+/// To be used when you need to modify list or values you iterate over, use
+/// #TV_LIST_ITER_CONST if you donโ€™t.
+///
+/// @param[in] l List to iterate over.
+/// @param li Name of the variable with current listitem_T entry.
+/// @param code Cycle body.
+#define TV_LIST_ITER(l, li, code) \
+ _TV_LIST_ITER_MOD(, l, li, code)
+
+/// Iterate over a list
+///
+/// To be used when you donโ€™t need to modify list or values you iterate over,
+/// use #TV_LIST_ITER if you do.
+///
+/// @param[in] l List to iterate over.
+/// @param li Name of the variable with current listitem_T entry.
+/// @param code Cycle body.
+#define TV_LIST_ITER_CONST(l, li, code) \
+ _TV_LIST_ITER_MOD(const, l, li, code)
+
+// Below macros are macros to avoid duplicating code for functionally identical
+// const and non-const function variants.
+
+/// Get typval_T out of list item
+///
+/// @param[in] li List item to get typval_T from, must not be NULL.
+///
+/// @return Pointer to typval_T.
+#define TV_LIST_ITEM_TV(li) (&(li)->li_tv)
+
+/// Get next list item given the current one
+///
+/// @param[in] l List to get item from.
+/// @param[in] li List item to get typval_T from.
+///
+/// @return Pointer to the next item or NULL.
+#define TV_LIST_ITEM_NEXT(l, li) ((li)->li_next)
+
+/// Get previous list item given the current one
+///
+/// @param[in] l List to get item from.
+/// @param[in] li List item to get typval_T from.
+///
+/// @return Pointer to the previous item or NULL.
+#define TV_LIST_ITEM_PREV(l, li) ((li)->li_prev)
+// List argument is not used currently, but it is a must for lists implemented
+// as a pair (size(in list), array) without terminator - basically for lists on
+// top of kvec.
+
+/// Iterate over a dictionary
+///
+/// @param[in] d Dictionary to iterate over.
+/// @param di Name of the variable with current dictitem_T entry.
+/// @param code Cycle body.
+#define TV_DICT_ITER(d, di, code) \
+ HASHTAB_ITER(&(d)->dv_hashtab, di##hi_, { \
+ { \
+ dictitem_T *const di = TV_DICT_HI2DI(di##hi_); \
+ { \
+ code \
+ } \
+ } \
+ })
+
+static inline bool tv_get_float_chk(const typval_T *const tv,
+ float_T *const ret_f)
+ REAL_FATTR_NONNULL_ALL REAL_FATTR_WARN_UNUSED_RESULT;
+
+// FIXME circular dependency, cannot import message.h.
+bool emsgf(const char *const fmt, ...);
+
+/// Get the float value
+///
+/// Raises an error if object is not number or floating-point.
+///
+/// @param[in] tv VimL object to get value from.
+/// @param[out] ret_f Location where resulting float is stored.
+///
+/// @return true in case of success, false if tv is not a number or float.
+static inline bool tv_get_float_chk(const typval_T *const tv,
+ float_T *const ret_f)
+{
+ if (tv->v_type == VAR_FLOAT) {
+ *ret_f = tv->vval.v_float;
+ return true;
+ }
+ if (tv->v_type == VAR_NUMBER) {
+ *ret_f = (float_T)tv->vval.v_number;
+ return true;
+ }
+ emsgf(_("E808: Number or Float required"));
+ return false;
+}
+
+static inline DictWatcher *tv_dict_watcher_node_data(QUEUE *q)
+ REAL_FATTR_NONNULL_ALL REAL_FATTR_NONNULL_RET REAL_FATTR_PURE
+ REAL_FATTR_WARN_UNUSED_RESULT REAL_FATTR_ALWAYS_INLINE;
+
+/// Compute the `DictWatcher` address from a QUEUE node.
+///
+/// This only exists for .asan-blacklist (ASAN doesn't handle QUEUE_DATA pointer
+/// arithmetic).
+static inline DictWatcher *tv_dict_watcher_node_data(QUEUE *q)
+{
+ return QUEUE_DATA(q, DictWatcher, node);
+}
+
+static inline bool tv_is_func(const typval_T tv)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_CONST;
+
+/// Check whether given typval_T contains a function
+///
+/// That is, whether it contains VAR_FUNC or VAR_PARTIAL.
+///
+/// @param[in] tv Typval to check.
+///
+/// @return True if it is a function or a partial, false otherwise.
+static inline bool tv_is_func(const typval_T tv)
+{
+ return tv.v_type == VAR_FUNC || tv.v_type == VAR_PARTIAL;
+}
+
+/// Specify that argument needs to be translated
+///
+/// Used for size_t length arguments to avoid calling gettext() and strlen()
+/// unless needed.
+#define TV_TRANSLATE (SIZE_MAX)
+
+/// Specify that argument is a NUL-terminated C string
+///
+/// Used for size_t length arguments to avoid calling strlen() unless needed.
+#define TV_CSTRING (SIZE_MAX - 1)
+
+#ifdef UNIT_TESTING
+// Do not use enum constants, see commit message.
+EXTERN const size_t kTVCstring INIT(= TV_CSTRING);
+EXTERN const size_t kTVTranslate INIT(= TV_TRANSLATE);
+#endif
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "eval/typval.h.generated.h"
+#endif
+#endif // NVIM_EVAL_TYPVAL_H
diff --git a/src/nvim/eval/typval_encode.c.h b/src/nvim/eval/typval_encode.c.h
new file mode 100644
index 0000000000..623bdfc93b
--- /dev/null
+++ b/src/nvim/eval/typval_encode.c.h
@@ -0,0 +1,846 @@
+/// @file eval/typval_encode.c.h
+///
+/// Contains set of macros used to convert (possibly recursive) typval_T into
+/// something else. For these macros to work the following macros must be
+/// defined:
+
+/// @def TYPVAL_ENCODE_CONV_NIL
+/// @brief Macros used to convert NIL value
+///
+/// Is called both for special dictionary (unless #TYPVAL_ENCODE_ALLOW_SPECIALS
+/// is false) and `v:null`.
+///
+/// @param tv Pointer to typval where value is stored. May not be NULL. May
+/// point to special dictionary.
+
+/// @def TYPVAL_ENCODE_CONV_BOOL
+/// @brief Macros used to convert boolean value
+///
+/// Is called both for special dictionary (unless #TYPVAL_ENCODE_ALLOW_SPECIALS
+/// is false) and `v:true`/`v:false`.
+///
+/// @param tv Pointer to typval where value is stored. May not be NULL. May
+/// point to a special dictionary.
+/// @param num Boolean value to convert. Value is an expression which
+/// evaluates to some integer.
+
+/// @def TYPVAL_ENCODE_CONV_NUMBER
+/// @brief Macros used to convert integer
+///
+/// @param tv Pointer to typval where value is stored. May not be NULL. May
+/// point to a special dictionary.
+/// @param num Integer to convert, must accept both varnumber_T and int64_t.
+
+/// @def TYPVAL_ENCODE_CONV_UNSIGNED_NUMBER
+/// @brief Macros used to convert unsigned integer
+///
+/// Not used if #TYPVAL_ENCODE_ALLOW_SPECIALS is false, but still must be
+/// defined.
+///
+/// @param tv Pointer to typval where value is stored. May not be NULL. Points
+/// to a special dictionary.
+/// @param num Integer to convert, must accept uint64_t.
+
+/// @def TYPVAL_ENCODE_CONV_FLOAT
+/// @brief Macros used to convert floating-point number
+///
+/// @param tv Pointer to typval where value is stored. May not be NULL. May
+/// point to a special dictionary.
+/// @param flt Number to convert, must accept float_T.
+
+/// @def TYPVAL_ENCODE_CONV_STRING
+/// @brief Macros used to convert plain string
+///
+/// Is used to convert VAR_STRING objects as well as BIN strings represented as
+/// special dictionary.
+///
+/// @param tv Pointer to typval where value is stored. May not be NULL. May
+/// point to a special dictionary.
+/// @param buf String to convert. Is a char[] buffer, not NUL-terminated.
+/// @param len String length.
+
+/// @def TYPVAL_ENCODE_CONV_STR_STRING
+/// @brief Like #TYPVAL_ENCODE_CONV_STRING, but for STR strings
+///
+/// Is used to convert dictionary keys and STR strings represented as special
+/// dictionaries.
+///
+/// @param tv Pointer to typval where value is stored. May be NULL. May
+/// point to a special dictionary.
+/// @param buf String to convert. Is a char[] buffer, not NUL-terminated.
+/// @param len String length.
+
+/// @def TYPVAL_ENCODE_CONV_EXT_STRING
+/// @brief Macros used to convert EXT string
+///
+/// Is used to convert EXT strings represented as special dictionaries. Never
+/// actually used if #TYPVAL_ENCODE_ALLOW_SPECIALS is false, but still must be
+/// defined.
+///
+/// @param tv Pointer to typval where value is stored. May not be NULL. Points
+/// to a special dictionary.
+/// @param buf String to convert. Is a char[] buffer, not NUL-terminated.
+/// @param len String length.
+/// @param type EXT type.
+
+/// @def TYPVAL_ENCODE_CONV_FUNC_START
+/// @brief Macros used when starting to convert a funcref or a partial
+///
+/// @param tv Pointer to typval where value is stored. May not be NULL.
+/// @param fun Function name. May be NULL.
+
+/// @def TYPVAL_ENCODE_CONV_FUNC_BEFORE_ARGS
+/// @brief Macros used before starting to convert partial arguments
+///
+/// @param tv Pointer to typval where value is stored. May not be NULL.
+/// @param len Number of arguments. Zero for absent arguments or when
+/// converting a funcref.
+
+/// @def TYPVAL_ENCODE_CONV_FUNC_BEFORE_SELF
+/// @brief Macros used before starting to convert self dictionary
+///
+/// @param tv Pointer to typval where value is stored. May not be NULL.
+/// @param len Number of arguments. May be zero for empty dictionary or -1 for
+/// missing self dictionary, also when converting function
+/// reference.
+
+/// @def TYPVAL_ENCODE_CONV_FUNC_END
+/// @brief Macros used after converting a funcref or a partial
+///
+/// @param tv Pointer to typval where value is stored. May not be NULL.
+
+/// @def TYPVAL_ENCODE_CONV_EMPTY_LIST
+/// @brief Macros used to convert an empty list
+///
+/// @param tv Pointer to typval where value is stored. May not be NULL.
+
+/// @def TYPVAL_ENCODE_CONV_EMPTY_DICT
+/// @brief Macros used to convert an empty dictionary
+///
+/// @param tv Pointer to typval where value is stored. May be NULL. May
+/// point to a special dictionary.
+/// @param dict Converted dictionary, lvalue or #TYPVAL_ENCODE_NODICT_VAR
+/// (for dictionaries represented as special lists).
+
+/// @def TYPVAL_ENCODE_CONV_LIST_START
+/// @brief Macros used before starting to convert non-empty list
+///
+/// @param tv Pointer to typval where value is stored. May be NULL. May
+/// point to a special dictionary.
+/// @param len List length. Is an expression which evaluates to an integer.
+
+/// @def TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START
+/// @brief Macros used after pushing list onto the stack
+///
+/// Only used for real list_T* lists, not for special dictionaries or partial
+/// arguments.
+///
+/// @param tv Pointer to typval where value is stored. May be NULL. May
+/// point to a special dictionary.
+/// @param mpsv Pushed MPConvStackVal value.
+
+/// @def TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS
+/// @brief Macros used after finishing converting non-last list item
+///
+/// @param tv Pointer to typval where list is stored. May be NULL.
+
+/// @def TYPVAL_ENCODE_CONV_LIST_END
+/// @brief Macros used after converting non-empty list
+///
+/// @param tv Pointer to typval where list is stored. May be NULL.
+
+/// @def TYPVAL_ENCODE_CONV_DICT_START
+/// @brief Macros used before starting to convert non-empty dictionary
+///
+/// Only used for real dict_T* dictionaries, not for special dictionaries. Also
+/// used for partial self dictionary.
+///
+/// @param tv Pointer to typval where dictionary is stored. May be NULL. May
+/// point to a special dictionary.
+/// @param dict Converted dictionary, lvalue or #TYPVAL_ENCODE_NODICT_VAR
+/// (for dictionaries represented as special lists).
+/// @param len Dictionary length. Is an expression which evaluates to an
+/// integer.
+
+/// @def TYPVAL_ENCODE_CONV_REAL_DICT_AFTER_START
+/// @brief Macros used after pushing dictionary onto the stack
+///
+/// @param tv Pointer to typval where dictionary is stored. May be NULL.
+/// May not point to a special dictionary.
+/// @param dict Converted dictionary, lvalue.
+/// @param mpsv Pushed MPConvStackVal value.
+
+/// @def TYPVAL_ENCODE_SPECIAL_DICT_KEY_CHECK
+/// @brief Macros used to check special dictionary key
+///
+/// @param label Label for goto in case check was not successfull.
+/// @param key typval_T key to check.
+
+/// @def TYPVAL_ENCODE_CONV_DICT_AFTER_KEY
+/// @brief Macros used after finishing converting dictionary key
+///
+/// @param tv Pointer to typval where dictionary is stored. May be NULL. May
+/// point to a special dictionary.
+/// @param dict Converted dictionary, lvalue or #TYPVAL_ENCODE_NODICT_VAR
+/// (for dictionaries represented as special lists).
+
+/// @def TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS
+/// @brief Macros used after finishing converting non-last dictionary value
+///
+/// @param tv Pointer to typval where dictionary is stored. May be NULL. May
+/// point to a special dictionary.
+/// @param dict Converted dictionary, lvalue or #TYPVAL_ENCODE_NODICT_VAR
+/// (for dictionaries represented as special lists).
+
+/// @def TYPVAL_ENCODE_CONV_DICT_END
+/// @brief Macros used after converting non-empty dictionary
+///
+/// @param tv Pointer to typval where dictionary is stored. May be NULL. May
+/// point to a special dictionary.
+/// @param dict Converted dictionary, lvalue or #TYPVAL_ENCODE_NODICT_VAR
+/// (for dictionaries represented as special lists).
+
+/// @def TYPVAL_ENCODE_CONV_RECURSE
+/// @brief Macros used when self-containing container is detected
+///
+/// @param val Container for which this situation was detected.
+/// @param conv_type Type of the stack entry, @see MPConvStackValType.
+
+/// @def TYPVAL_ENCODE_ALLOW_SPECIALS
+/// @brief Macros that specifies whether special dictionaries are special
+///
+/// Must be something that evaluates to boolean, most likely `true` or `false`.
+/// If it is false then special dictionaries are not treated specially.
+
+/// @def TYPVAL_ENCODE_SCOPE
+/// @brief Scope of the main function: either nothing or `static`
+
+/// @def TYPVAL_ENCODE_NAME
+/// @brief Name of the target converter
+///
+/// After including this file it will define function
+/// `encode_vim_to_{TYPVAL_ENCODE_NAME}` with scope #TYPVAL_ENCODE_SCOPE and
+/// static functions `_typval_encode_{TYPVAL_ENCODE_NAME}_convert_one_value` and
+/// `_typval_encode_{TYPVAL_ENCODE_NAME}_check_self_reference`.
+
+/// @def TYPVAL_ENCODE_FIRST_ARG_TYPE
+/// @brief Type of the first argument, which will be used to return the results
+///
+/// Is expected to be a pointer type.
+
+/// @def TYPVAL_ENCODE_FIRST_ARG_NAME
+/// @brief Name of the first argument
+///
+/// This name will only be used by one of the above macros which are defined by
+/// the caller. Functions defined here do not use first argument directly.
+#include <stddef.h>
+#include <inttypes.h>
+#include <assert.h>
+
+#include "nvim/lib/kvec.h"
+#include "nvim/eval/typval.h"
+#include "nvim/eval/encode.h"
+#include "nvim/func_attr.h"
+#include "nvim/eval/typval_encode.h"
+
+/// Dummy variable used because some macros need lvalue
+///
+/// Must not be written to, if needed one must check that address of the
+/// macros argument is (not) equal to `&TYPVAL_ENCODE_NODICT_VAR`.
+const dict_T *const TYPVAL_ENCODE_NODICT_VAR = NULL;
+
+static inline int _TYPVAL_ENCODE_CHECK_SELF_REFERENCE(
+ TYPVAL_ENCODE_FIRST_ARG_TYPE TYPVAL_ENCODE_FIRST_ARG_NAME,
+ void *const val, int *const val_copyID,
+ const MPConvStack *const mpstack, const int copyID,
+ const MPConvStackValType conv_type,
+ const char *const objname)
+ REAL_FATTR_NONNULL_ARG(2, 3, 4, 7) REAL_FATTR_WARN_UNUSED_RESULT
+ REAL_FATTR_ALWAYS_INLINE;
+
+/// Function for checking whether container references itself
+///
+/// @param TYPVAL_ENCODE_FIRST_ARG_NAME First argument.
+/// @param[in,out] val Container to check.
+/// @param val_copyID Pointer to the container attribute that holds copyID.
+/// After checking whether value of this attribute is
+/// copyID (variable) it is set to copyID.
+/// @param[in] mpstack Stack with values to convert. Read-only, used for error
+/// reporting.
+/// @param[in] copyID CopyID used by the caller.
+/// @param[in] conv_type Type of the conversion, @see MPConvStackValType.
+/// @param[in] objname Object name, used for error reporting.
+///
+/// @return NOTDONE in case of success, what to return in case of failure.
+static inline int _TYPVAL_ENCODE_CHECK_SELF_REFERENCE(
+ TYPVAL_ENCODE_FIRST_ARG_TYPE TYPVAL_ENCODE_FIRST_ARG_NAME,
+ void *const val, int *const val_copyID,
+ const MPConvStack *const mpstack, const int copyID,
+ const MPConvStackValType conv_type,
+ const char *const objname)
+{
+ if (*val_copyID == copyID) {
+ TYPVAL_ENCODE_CONV_RECURSE(val, conv_type);
+ return OK;
+ }
+ *val_copyID = copyID;
+ return NOTDONE;
+}
+
+static int _TYPVAL_ENCODE_CONVERT_ONE_VALUE(
+ TYPVAL_ENCODE_FIRST_ARG_TYPE TYPVAL_ENCODE_FIRST_ARG_NAME,
+ MPConvStack *const mpstack, MPConvStackVal *const cur_mpsv,
+ typval_T *const tv, const int copyID,
+ const char *const objname)
+ REAL_FATTR_NONNULL_ARG(2, 4, 6) REAL_FATTR_WARN_UNUSED_RESULT;
+
+/// Convert single value
+///
+/// Only scalar values are converted immediately, everything else is pushed onto
+/// the stack.
+///
+/// @param TYPVAL_ENCODE_FIRST_ARG_NAME First argument, defined by the
+/// includer. Only meaningful to macros
+/// defined by the includer.
+/// @param mpstack Stack with values to convert. Values which are not
+/// converted completely by this function (i.e.
+/// non-scalars) are pushed here.
+/// @param cur_mpsv Currently converted value from stack.
+/// @param tv Converted value.
+/// @param[in] copyID CopyID.
+/// @param[in] objname Object name, used for error reporting.
+///
+/// @return OK in case of success, FAIL in case of failure.
+static int _TYPVAL_ENCODE_CONVERT_ONE_VALUE(
+ TYPVAL_ENCODE_FIRST_ARG_TYPE TYPVAL_ENCODE_FIRST_ARG_NAME,
+ MPConvStack *const mpstack, MPConvStackVal *const cur_mpsv,
+ typval_T *const tv, const int copyID,
+ const char *const objname)
+{
+ switch (tv->v_type) {
+ case VAR_STRING: {
+ TYPVAL_ENCODE_CONV_STRING(tv, tv->vval.v_string, tv_strlen(tv));
+ break;
+ }
+ case VAR_NUMBER: {
+ TYPVAL_ENCODE_CONV_NUMBER(tv, tv->vval.v_number);
+ break;
+ }
+ case VAR_FLOAT: {
+ TYPVAL_ENCODE_CONV_FLOAT(tv, tv->vval.v_float);
+ break;
+ }
+ case VAR_FUNC: {
+ TYPVAL_ENCODE_CONV_FUNC_START(tv, tv->vval.v_string);
+ TYPVAL_ENCODE_CONV_FUNC_BEFORE_ARGS(tv, 0);
+ TYPVAL_ENCODE_CONV_FUNC_BEFORE_SELF(tv, -1);
+ TYPVAL_ENCODE_CONV_FUNC_END(tv);
+ break;
+ }
+ case VAR_PARTIAL: {
+ partial_T *const pt = tv->vval.v_partial;
+ (void)pt;
+ TYPVAL_ENCODE_CONV_FUNC_START( // -V547
+ tv, (pt == NULL ? NULL : partial_name(pt)));
+ _mp_push(*mpstack, ((MPConvStackVal) { // -V779
+ .type = kMPConvPartial,
+ .tv = tv,
+ .saved_copyID = copyID - 1,
+ .data = {
+ .p = {
+ .stage = kMPConvPartialArgs,
+ .pt = tv->vval.v_partial,
+ },
+ },
+ }));
+ break;
+ }
+ case VAR_LIST: {
+ if (tv->vval.v_list == NULL || tv_list_len(tv->vval.v_list) == 0) {
+ TYPVAL_ENCODE_CONV_EMPTY_LIST(tv);
+ break;
+ }
+ const int saved_copyID = tv_list_copyid(tv->vval.v_list);
+ _TYPVAL_ENCODE_DO_CHECK_SELF_REFERENCE(tv->vval.v_list, lv_copyID, copyID,
+ kMPConvList);
+ TYPVAL_ENCODE_CONV_LIST_START(tv, tv_list_len(tv->vval.v_list));
+ assert(saved_copyID != copyID && saved_copyID != copyID - 1);
+ _mp_push(*mpstack, ((MPConvStackVal) {
+ .type = kMPConvList,
+ .tv = tv,
+ .saved_copyID = saved_copyID,
+ .data = {
+ .l = {
+ .list = tv->vval.v_list,
+ .li = tv_list_first(tv->vval.v_list),
+ },
+ },
+ }));
+ TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START(tv, _mp_last(*mpstack));
+ break;
+ }
+ case VAR_SPECIAL: {
+ switch (tv->vval.v_special) {
+ case kSpecialVarNull: {
+ TYPVAL_ENCODE_CONV_NIL(tv);
+ break;
+ }
+ case kSpecialVarTrue:
+ case kSpecialVarFalse: {
+ TYPVAL_ENCODE_CONV_BOOL(tv, tv->vval.v_special == kSpecialVarTrue);
+ break;
+ }
+ }
+ break;
+ }
+ case VAR_DICT: {
+ if (tv->vval.v_dict == NULL
+ || tv->vval.v_dict->dv_hashtab.ht_used == 0) {
+ TYPVAL_ENCODE_CONV_EMPTY_DICT(tv, tv->vval.v_dict);
+ break;
+ }
+ const dictitem_T *type_di;
+ const dictitem_T *val_di;
+ if (TYPVAL_ENCODE_ALLOW_SPECIALS
+ && tv->vval.v_dict->dv_hashtab.ht_used == 2
+ && (type_di = tv_dict_find((dict_T *)tv->vval.v_dict,
+ S_LEN("_TYPE"))) != NULL
+ && type_di->di_tv.v_type == VAR_LIST
+ && (val_di = tv_dict_find((dict_T *)tv->vval.v_dict,
+ S_LEN("_VAL"))) != NULL) {
+ size_t i;
+ for (i = 0; i < ARRAY_SIZE(eval_msgpack_type_lists); i++) {
+ if (type_di->di_tv.vval.v_list == eval_msgpack_type_lists[i]) {
+ break;
+ }
+ }
+ if (i == ARRAY_SIZE(eval_msgpack_type_lists)) {
+ goto _convert_one_value_regular_dict;
+ }
+ switch ((MessagePackType)i) {
+ case kMPNil: {
+ TYPVAL_ENCODE_CONV_NIL(tv);
+ break;
+ }
+ case kMPBoolean: {
+ if (val_di->di_tv.v_type != VAR_NUMBER) {
+ goto _convert_one_value_regular_dict;
+ }
+ TYPVAL_ENCODE_CONV_BOOL(tv, val_di->di_tv.vval.v_number);
+ break;
+ }
+ case kMPInteger: {
+ const list_T *val_list;
+ varnumber_T sign;
+ varnumber_T highest_bits;
+ varnumber_T high_bits;
+ varnumber_T low_bits;
+ // List of 4 integers; first is signed (should be 1 or -1, but
+ // this is not checked), second is unsigned and have at most
+ // one (sign is -1) or two (sign is 1) non-zero bits (number of
+ // bits is not checked), other unsigned and have at most 31
+ // non-zero bits (number of bits is not checked).
+ if (val_di->di_tv.v_type != VAR_LIST
+ || tv_list_len(val_list = val_di->di_tv.vval.v_list) != 4) {
+ goto _convert_one_value_regular_dict;
+ }
+
+ const listitem_T *const sign_li = tv_list_first(val_list);
+ if (TV_LIST_ITEM_TV(sign_li)->v_type != VAR_NUMBER
+ || (sign = TV_LIST_ITEM_TV(sign_li)->vval.v_number) == 0) {
+ goto _convert_one_value_regular_dict;
+ }
+
+ const listitem_T *const highest_bits_li = (
+ TV_LIST_ITEM_NEXT(val_list, sign_li));
+ if (TV_LIST_ITEM_TV(highest_bits_li)->v_type != VAR_NUMBER
+ || ((highest_bits
+ = TV_LIST_ITEM_TV(highest_bits_li)->vval.v_number)
+ < 0)) {
+ goto _convert_one_value_regular_dict;
+ }
+
+ const listitem_T *const high_bits_li = (
+ TV_LIST_ITEM_NEXT(val_list, highest_bits_li));
+ if (TV_LIST_ITEM_TV(high_bits_li)->v_type != VAR_NUMBER
+ || ((high_bits = TV_LIST_ITEM_TV(high_bits_li)->vval.v_number)
+ < 0)) {
+ goto _convert_one_value_regular_dict;
+ }
+
+ const listitem_T *const low_bits_li = tv_list_last(val_list);
+ if (TV_LIST_ITEM_TV(low_bits_li)->v_type != VAR_NUMBER
+ || ((low_bits = TV_LIST_ITEM_TV(low_bits_li)->vval.v_number)
+ < 0)) {
+ goto _convert_one_value_regular_dict;
+ }
+
+ const uint64_t number = ((uint64_t)(((uint64_t)highest_bits) << 62)
+ | (uint64_t)(((uint64_t)high_bits) << 31)
+ | (uint64_t)low_bits);
+ if (sign > 0) {
+ TYPVAL_ENCODE_CONV_UNSIGNED_NUMBER(tv, number);
+ } else {
+ TYPVAL_ENCODE_CONV_NUMBER(tv, -number);
+ }
+ break;
+ }
+ case kMPFloat: {
+ if (val_di->di_tv.v_type != VAR_FLOAT) {
+ goto _convert_one_value_regular_dict;
+ }
+ TYPVAL_ENCODE_CONV_FLOAT(tv, val_di->di_tv.vval.v_float);
+ break;
+ }
+ case kMPString:
+ case kMPBinary: {
+ const bool is_string = ((MessagePackType)i == kMPString);
+ if (val_di->di_tv.v_type != VAR_LIST) {
+ goto _convert_one_value_regular_dict;
+ }
+ size_t len;
+ char *buf;
+ if (!encode_vim_list_to_buf(val_di->di_tv.vval.v_list, &len,
+ &buf)) {
+ goto _convert_one_value_regular_dict;
+ }
+ if (is_string) {
+ TYPVAL_ENCODE_CONV_STR_STRING(tv, buf, len);
+ } else { // -V523
+ TYPVAL_ENCODE_CONV_STRING(tv, buf, len);
+ }
+ xfree(buf);
+ break;
+ }
+ case kMPArray: {
+ if (val_di->di_tv.v_type != VAR_LIST) {
+ goto _convert_one_value_regular_dict;
+ }
+ const int saved_copyID = tv_list_copyid(val_di->di_tv.vval.v_list);
+ _TYPVAL_ENCODE_DO_CHECK_SELF_REFERENCE(val_di->di_tv.vval.v_list,
+ lv_copyID, copyID,
+ kMPConvList);
+ TYPVAL_ENCODE_CONV_LIST_START(
+ tv, tv_list_len(val_di->di_tv.vval.v_list));
+ assert(saved_copyID != copyID && saved_copyID != copyID - 1);
+ _mp_push(*mpstack, ((MPConvStackVal) {
+ .tv = tv,
+ .type = kMPConvList,
+ .saved_copyID = saved_copyID,
+ .data = {
+ .l = {
+ .list = val_di->di_tv.vval.v_list,
+ .li = tv_list_first(val_di->di_tv.vval.v_list),
+ },
+ },
+ }));
+ break;
+ }
+ case kMPMap: {
+ if (val_di->di_tv.v_type != VAR_LIST) {
+ goto _convert_one_value_regular_dict;
+ }
+ list_T *const val_list = val_di->di_tv.vval.v_list;
+ if (val_list == NULL || tv_list_len(val_list) == 0) {
+ TYPVAL_ENCODE_CONV_EMPTY_DICT( // -V501
+ tv, TYPVAL_ENCODE_NODICT_VAR);
+ break;
+ }
+ TV_LIST_ITER_CONST(val_list, li, {
+ if (TV_LIST_ITEM_TV(li)->v_type != VAR_LIST
+ || tv_list_len(TV_LIST_ITEM_TV(li)->vval.v_list) != 2) {
+ goto _convert_one_value_regular_dict;
+ }
+ });
+ const int saved_copyID = tv_list_copyid(val_di->di_tv.vval.v_list);
+ _TYPVAL_ENCODE_DO_CHECK_SELF_REFERENCE(val_list, lv_copyID, copyID,
+ kMPConvPairs);
+ TYPVAL_ENCODE_CONV_DICT_START(tv, TYPVAL_ENCODE_NODICT_VAR,
+ tv_list_len(val_list));
+ assert(saved_copyID != copyID && saved_copyID != copyID - 1);
+ _mp_push(*mpstack, ((MPConvStackVal) {
+ .tv = tv,
+ .type = kMPConvPairs,
+ .saved_copyID = saved_copyID,
+ .data = {
+ .l = {
+ .list = val_list,
+ .li = tv_list_first(val_list),
+ },
+ },
+ }));
+ break;
+ }
+ case kMPExt: {
+ const list_T *val_list;
+ varnumber_T type;
+ if (val_di->di_tv.v_type != VAR_LIST
+ || tv_list_len((val_list = val_di->di_tv.vval.v_list)) != 2
+ || (TV_LIST_ITEM_TV(tv_list_first(val_list))->v_type
+ != VAR_NUMBER)
+ || ((type
+ = TV_LIST_ITEM_TV(tv_list_first(val_list))->vval.v_number)
+ > INT8_MAX)
+ || type < INT8_MIN
+ || (TV_LIST_ITEM_TV(tv_list_last(val_list))->v_type
+ != VAR_LIST)) {
+ goto _convert_one_value_regular_dict;
+ }
+ size_t len;
+ char *buf;
+ if (!(
+ encode_vim_list_to_buf(
+ TV_LIST_ITEM_TV(tv_list_last(val_list))->vval.v_list, &len,
+ &buf))) {
+ goto _convert_one_value_regular_dict;
+ }
+ TYPVAL_ENCODE_CONV_EXT_STRING(tv, buf, len, type);
+ xfree(buf);
+ break;
+ }
+ }
+ break;
+ }
+_convert_one_value_regular_dict: {}
+ const int saved_copyID = tv->vval.v_dict->dv_copyID;
+ _TYPVAL_ENCODE_DO_CHECK_SELF_REFERENCE(tv->vval.v_dict, dv_copyID, copyID,
+ kMPConvDict);
+ TYPVAL_ENCODE_CONV_DICT_START(tv, tv->vval.v_dict,
+ tv->vval.v_dict->dv_hashtab.ht_used);
+ assert(saved_copyID != copyID && saved_copyID != copyID - 1);
+ _mp_push(*mpstack, ((MPConvStackVal) {
+ .tv = tv,
+ .type = kMPConvDict,
+ .saved_copyID = saved_copyID,
+ .data = {
+ .d = {
+ .dict = tv->vval.v_dict,
+ .dictp = &tv->vval.v_dict,
+ .hi = tv->vval.v_dict->dv_hashtab.ht_array,
+ .todo = tv->vval.v_dict->dv_hashtab.ht_used,
+ },
+ },
+ }));
+ TYPVAL_ENCODE_CONV_REAL_DICT_AFTER_START(tv, tv->vval.v_dict,
+ _mp_last(*mpstack));
+ break;
+ }
+ case VAR_UNKNOWN: {
+ internal_error(STR(_TYPVAL_ENCODE_CONVERT_ONE_VALUE) "()");
+ return FAIL;
+ }
+ }
+typval_encode_stop_converting_one_item:
+ return OK;
+ // Prevent โ€œunused labelโ€ warnings.
+ goto typval_encode_stop_converting_one_item; // -V779
+}
+
+TYPVAL_ENCODE_SCOPE int _TYPVAL_ENCODE_ENCODE(
+ TYPVAL_ENCODE_FIRST_ARG_TYPE TYPVAL_ENCODE_FIRST_ARG_NAME,
+ typval_T *const tv, const char *const objname)
+ REAL_FATTR_NONNULL_ARG(2, 3) REAL_FATTR_WARN_UNUSED_RESULT;
+
+/// Convert the whole typval
+///
+/// @param TYPVAL_ENCODE_FIRST_ARG_NAME First argument, defined by the
+/// includer. Only meaningful to macros
+/// defined by the includer.
+/// @param top_tv Converted value.
+/// @param[in] objname Object name, used for error reporting.
+///
+/// @return OK in case of success, FAIL in case of failure.
+TYPVAL_ENCODE_SCOPE int _TYPVAL_ENCODE_ENCODE(
+ TYPVAL_ENCODE_FIRST_ARG_TYPE TYPVAL_ENCODE_FIRST_ARG_NAME,
+ typval_T *const top_tv, const char *const objname)
+{
+ const int copyID = get_copyID();
+ MPConvStack mpstack;
+ _mp_init(mpstack);
+ if (_TYPVAL_ENCODE_CONVERT_ONE_VALUE(TYPVAL_ENCODE_FIRST_ARG_NAME, &mpstack,
+ NULL,
+ top_tv, copyID, objname)
+ == FAIL) {
+ goto encode_vim_to__error_ret;
+ }
+/// Label common for this and convert_one_value functions, used for escaping
+/// from macros like TYPVAL_ENCODE_CONV_DICT_START.
+typval_encode_stop_converting_one_item:
+ while (_mp_size(mpstack)) {
+ MPConvStackVal *cur_mpsv = &_mp_last(mpstack);
+ typval_T *tv = NULL;
+ switch (cur_mpsv->type) {
+ case kMPConvDict: {
+ if (!cur_mpsv->data.d.todo) {
+ (void)_mp_pop(mpstack);
+ cur_mpsv->data.d.dict->dv_copyID = cur_mpsv->saved_copyID;
+ TYPVAL_ENCODE_CONV_DICT_END(cur_mpsv->tv, *cur_mpsv->data.d.dictp);
+ continue;
+ } else if (cur_mpsv->data.d.todo
+ != cur_mpsv->data.d.dict->dv_hashtab.ht_used) {
+ TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS(cur_mpsv->tv,
+ *cur_mpsv->data.d.dictp);
+ }
+ while (HASHITEM_EMPTY(cur_mpsv->data.d.hi)) {
+ cur_mpsv->data.d.hi++;
+ }
+ dictitem_T *const di = TV_DICT_HI2DI(cur_mpsv->data.d.hi);
+ cur_mpsv->data.d.todo--;
+ cur_mpsv->data.d.hi++;
+ TYPVAL_ENCODE_CONV_STR_STRING(NULL, &di->di_key[0],
+ strlen((char *)&di->di_key[0]));
+ TYPVAL_ENCODE_CONV_DICT_AFTER_KEY(cur_mpsv->tv,
+ *cur_mpsv->data.d.dictp);
+ tv = &di->di_tv;
+ break;
+ }
+ case kMPConvList: {
+ if (cur_mpsv->data.l.li == NULL) {
+ (void)_mp_pop(mpstack);
+ tv_list_set_copyid(cur_mpsv->data.l.list, cur_mpsv->saved_copyID);
+ TYPVAL_ENCODE_CONV_LIST_END(cur_mpsv->tv);
+ continue;
+ } else if (cur_mpsv->data.l.li
+ != tv_list_first(cur_mpsv->data.l.list)) {
+ TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS(cur_mpsv->tv);
+ }
+ tv = TV_LIST_ITEM_TV(cur_mpsv->data.l.li);
+ cur_mpsv->data.l.li = TV_LIST_ITEM_NEXT(cur_mpsv->data.l.list,
+ cur_mpsv->data.l.li);
+ break;
+ }
+ case kMPConvPairs: {
+ if (cur_mpsv->data.l.li == NULL) {
+ (void)_mp_pop(mpstack);
+ tv_list_set_copyid(cur_mpsv->data.l.list, cur_mpsv->saved_copyID);
+ TYPVAL_ENCODE_CONV_DICT_END(cur_mpsv->tv, TYPVAL_ENCODE_NODICT_VAR);
+ continue;
+ } else if (cur_mpsv->data.l.li
+ != tv_list_first(cur_mpsv->data.l.list)) {
+ TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS(
+ cur_mpsv->tv, TYPVAL_ENCODE_NODICT_VAR);
+ }
+ const list_T *const kv_pair = (
+ TV_LIST_ITEM_TV(cur_mpsv->data.l.li)->vval.v_list);
+ TYPVAL_ENCODE_SPECIAL_DICT_KEY_CHECK(
+ encode_vim_to__error_ret, *TV_LIST_ITEM_TV(tv_list_first(kv_pair)));
+ if (
+ _TYPVAL_ENCODE_CONVERT_ONE_VALUE(
+ TYPVAL_ENCODE_FIRST_ARG_NAME, &mpstack, cur_mpsv,
+ TV_LIST_ITEM_TV(tv_list_first(kv_pair)), copyID, objname)
+ == FAIL) {
+ goto encode_vim_to__error_ret;
+ }
+ TYPVAL_ENCODE_CONV_DICT_AFTER_KEY(cur_mpsv->tv,
+ TYPVAL_ENCODE_NODICT_VAR);
+ tv = TV_LIST_ITEM_TV(tv_list_last(kv_pair));
+ cur_mpsv->data.l.li = TV_LIST_ITEM_NEXT(cur_mpsv->data.l.list,
+ cur_mpsv->data.l.li);
+ break;
+ }
+ case kMPConvPartial: {
+ partial_T *const pt = cur_mpsv->data.p.pt;
+ tv = cur_mpsv->tv;
+ (void)tv;
+ switch (cur_mpsv->data.p.stage) {
+ case kMPConvPartialArgs: {
+ TYPVAL_ENCODE_CONV_FUNC_BEFORE_ARGS(tv,
+ pt == NULL ? 0 : pt->pt_argc);
+ cur_mpsv->data.p.stage = kMPConvPartialSelf;
+ if (pt != NULL && pt->pt_argc > 0) {
+ TYPVAL_ENCODE_CONV_LIST_START(NULL, pt->pt_argc);
+ _mp_push(mpstack, ((MPConvStackVal) {
+ .type = kMPConvPartialList,
+ .tv = NULL,
+ .saved_copyID = copyID - 1,
+ .data = {
+ .a = {
+ .arg = pt->pt_argv,
+ .argv = pt->pt_argv,
+ .todo = (size_t)pt->pt_argc,
+ },
+ },
+ }));
+ }
+ break;
+ }
+ case kMPConvPartialSelf: {
+ cur_mpsv->data.p.stage = kMPConvPartialEnd;
+ dict_T *const dict = pt == NULL ? NULL : pt->pt_dict;
+ if (dict != NULL) {
+ TYPVAL_ENCODE_CONV_FUNC_BEFORE_SELF(tv, dict->dv_hashtab.ht_used);
+ if (dict->dv_hashtab.ht_used == 0) {
+ TYPVAL_ENCODE_CONV_EMPTY_DICT(NULL, pt->pt_dict);
+ continue;
+ }
+ const int saved_copyID = dict->dv_copyID;
+ const int te_csr_ret = _TYPVAL_ENCODE_CHECK_SELF_REFERENCE(
+ TYPVAL_ENCODE_FIRST_ARG_NAME,
+ dict, &dict->dv_copyID, &mpstack, copyID, kMPConvDict,
+ objname);
+ if (te_csr_ret != NOTDONE) {
+ if (te_csr_ret == FAIL) {
+ goto encode_vim_to__error_ret;
+ } else {
+ continue;
+ }
+ }
+ TYPVAL_ENCODE_CONV_DICT_START(NULL, pt->pt_dict,
+ dict->dv_hashtab.ht_used);
+ assert(saved_copyID != copyID && saved_copyID != copyID - 1);
+ _mp_push(mpstack, ((MPConvStackVal) {
+ .type = kMPConvDict,
+ .tv = NULL,
+ .saved_copyID = saved_copyID,
+ .data = {
+ .d = {
+ .dict = dict,
+ .dictp = &pt->pt_dict,
+ .hi = dict->dv_hashtab.ht_array,
+ .todo = dict->dv_hashtab.ht_used,
+ },
+ },
+ }));
+ TYPVAL_ENCODE_CONV_REAL_DICT_AFTER_START(NULL, pt->pt_dict,
+ _mp_last(mpstack));
+ } else {
+ TYPVAL_ENCODE_CONV_FUNC_BEFORE_SELF(tv, -1);
+ }
+ break;
+ }
+ case kMPConvPartialEnd: {
+ TYPVAL_ENCODE_CONV_FUNC_END(tv);
+ (void)_mp_pop(mpstack);
+ break;
+ }
+ }
+ continue;
+ }
+ case kMPConvPartialList: {
+ if (!cur_mpsv->data.a.todo) {
+ (void)_mp_pop(mpstack);
+ TYPVAL_ENCODE_CONV_LIST_END(NULL);
+ continue;
+ } else if (cur_mpsv->data.a.argv != cur_mpsv->data.a.arg) {
+ TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS(NULL);
+ }
+ tv = cur_mpsv->data.a.arg++;
+ cur_mpsv->data.a.todo--;
+ break;
+ }
+ }
+ assert(tv != NULL);
+ if (_TYPVAL_ENCODE_CONVERT_ONE_VALUE(TYPVAL_ENCODE_FIRST_ARG_NAME, &mpstack,
+ cur_mpsv, tv, copyID, objname)
+ == FAIL) {
+ goto encode_vim_to__error_ret;
+ }
+ }
+ _mp_destroy(mpstack);
+ return OK;
+encode_vim_to__error_ret:
+ _mp_destroy(mpstack);
+ return FAIL;
+ // Prevent โ€œunused labelโ€ warnings.
+ goto typval_encode_stop_converting_one_item; // -V779
+}
diff --git a/src/nvim/eval/typval_encode.h b/src/nvim/eval/typval_encode.h
index 98fa7b26c6..3475f6d8b3 100644
--- a/src/nvim/eval/typval_encode.h
+++ b/src/nvim/eval/typval_encode.h
@@ -1,163 +1,46 @@
-/// @file eval/typval_convert.h
+/// @file eval/typval_encode.h
///
-/// Contains set of macros used to convert (possibly recursive) typval_T into
-/// something else. For these macros to work the following macros must be
-/// defined:
-
-/// @def TYPVAL_ENCODE_CONV_NIL
-/// @brief Macros used to convert NIL value
-///
-/// Is called both for special dictionary (unless #TYPVAL_ENCODE_ALLOW_SPECIALS
-/// is false) and `v:null`. Accepts no arguments, but still must be
-/// a function-like macros.
-
-/// @def TYPVAL_ENCODE_CONV_BOOL
-/// @brief Macros used to convert boolean value
-///
-/// Is called both for special dictionary (unless #TYPVAL_ENCODE_ALLOW_SPECIALS
-/// is false) and `v:true`/`v:false`.
-///
-/// @param num Boolean value to convert. Value is an expression which
-/// evaluates to some integer.
-
-/// @def TYPVAL_ENCODE_CONV_NUMBER
-/// @brief Macros used to convert integer
-///
-/// @param num Integer to convert, must accept both varnumber_T and int64_t.
-
-/// @def TYPVAL_ENCODE_CONV_UNSIGNED_NUMBER
-/// @brief Macros used to convert unsigned integer
-///
-/// Not used if #TYPVAL_ENCODE_ALLOW_SPECIALS is false, but still must be
-/// defined.
-///
-/// @param num Integer to convert, must accept uint64_t.
-
-/// @def TYPVAL_ENCODE_CONV_FLOAT
-/// @brief Macros used to convert floating-point number
-///
-/// @param flt Number to convert, must accept float_T.
-
-/// @def TYPVAL_ENCODE_CONV_STRING
-/// @brief Macros used to convert plain string
-///
-/// Is used to convert VAR_STRING objects as well as BIN strings represented as
-/// special dictionary.
-///
-/// @param buf String to convert. Is a char[] buffer, not NUL-terminated.
-/// @param len String length.
-
-/// @def TYPVAL_ENCODE_CONV_STR_STRING
-/// @brief Like #TYPVAL_ENCODE_CONV_STRING, but for STR strings
-///
-/// Is used to convert dictionary keys and STR strings represented as special
-/// dictionaries.
-
-/// @def TYPVAL_ENCODE_CONV_EXT_STRING
-/// @brief Macros used to convert EXT string
-///
-/// Is used to convert EXT strings represented as special dictionaries. Never
-/// actually used if #TYPVAL_ENCODE_ALLOW_SPECIALS is false, but still must be
-/// defined.
-///
-/// @param buf String to convert. Is a char[] buffer, not NUL-terminated.
-/// @param len String length.
-/// @param type EXT type.
-
-/// @def TYPVAL_ENCODE_CONV_FUNC
-/// @brief Macros used to convert a function reference
-///
-/// @param fun Function name.
-
-/// @def TYPVAL_ENCODE_CONV_EMPTY_LIST
-/// @brief Macros used to convert an empty list
-///
-/// Accepts no arguments, but still must be a function-like macros.
-
-/// @def TYPVAL_ENCODE_CONV_EMPTY_DICT
-/// @brief Macros used to convert an empty dictionary
-///
-/// Accepts no arguments, but still must be a function-like macros.
-
-/// @def TYPVAL_ENCODE_CONV_LIST_START
-/// @brief Macros used before starting to convert non-empty list
-///
-/// @param len List length. Is an expression which evaluates to an integer.
-
-/// @def TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS
-/// @brief Macros used after finishing converting non-last list item
-///
-/// Accepts no arguments, but still must be a function-like macros.
-
-/// @def TYPVAL_ENCODE_CONV_LIST_END
-/// @brief Macros used after converting non-empty list
-///
-/// Accepts no arguments, but still must be a function-like macros.
-
-/// @def TYPVAL_ENCODE_CONV_DICT_START
-/// @brief Macros used before starting to convert non-empty dictionary
-///
-/// @param len Dictionary length. Is an expression which evaluates to an
-/// integer.
-
-/// @def TYPVAL_ENCODE_CONV_SPECIAL_DICT_KEY_CHECK
-/// @brief Macros used to check special dictionary key
-///
-/// @param label Label for goto in case check was not successfull.
-/// @param key typval_T key to check.
-
-/// @def TYPVAL_ENCODE_CONV_DICT_AFTER_KEY
-/// @brief Macros used after finishing converting dictionary key
-///
-/// Accepts no arguments, but still must be a function-like macros.
-
-/// @def TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS
-/// @brief Macros used after finishing converting non-last dictionary value
-///
-/// Accepts no arguments, but still must be a function-like macros.
-
-/// @def TYPVAL_ENCODE_CONV_DICT_END
-/// @brief Macros used after converting non-empty dictionary
-///
-/// Accepts no arguments, but still must be a function-like macros.
-
-/// @def TYPVAL_ENCODE_CONV_RECURSE
-/// @brief Macros used when self-containing container is detected
-///
-/// @param val Container for which this situation was detected.
-/// @param conv_type Type of the stack entry, @see MPConvStackValType.
-
-/// @def TYPVAL_ENCODE_ALLOW_SPECIALS
-/// @brief Macros that specifies whether special dictionaries are special
-///
-/// Must be something that evaluates to boolean, most likely `true` or `false`.
-/// If it is false then special dictionaries are not treated specially.
+/// Contains common definitions for eval/typval_encode.c.h. Most of time should
+/// not be included directly.
#ifndef NVIM_EVAL_TYPVAL_ENCODE_H
#define NVIM_EVAL_TYPVAL_ENCODE_H
#include <stddef.h>
#include <inttypes.h>
+#include <string.h>
#include <assert.h>
#include "nvim/lib/kvec.h"
-#include "nvim/eval_defs.h"
-#include "nvim/eval/encode.h"
+#include "nvim/eval/typval.h"
#include "nvim/func_attr.h"
/// Type of the stack entry
typedef enum {
- kMPConvDict, ///< Convert dict_T *dictionary.
- kMPConvList, ///< Convert list_T *list.
+ kMPConvDict, ///< Convert dict_T *dictionary.
+ kMPConvList, ///< Convert list_T *list.
kMPConvPairs, ///< Convert mapping represented as a list_T* of pairs.
+ kMPConvPartial, ///< Convert partial_T* partial.
+ kMPConvPartialList, ///< Convert argc/argv pair coming from a partial.
} MPConvStackValType;
+/// Stage at which partial is being converted
+typedef enum {
+ kMPConvPartialArgs, ///< About to convert arguments.
+ kMPConvPartialSelf, ///< About to convert self dictionary.
+ kMPConvPartialEnd, ///< Already converted everything.
+} MPConvPartialStage;
+
/// Structure representing current VimL to messagepack conversion state
typedef struct {
MPConvStackValType type; ///< Type of the stack entry.
typval_T *tv; ///< Currently converted typval_T.
+ int saved_copyID; ///< copyID item used to have.
union {
struct {
dict_T *dict; ///< Currently converted dictionary.
+ dict_T **dictp; ///< Location where that dictionary is stored.
+ ///< Normally it is &.tv->vval.v_dict, but not when
+ ///< converting partials.
hashitem_T *hi; ///< Currently converted dictionary item.
size_t todo; ///< Amount of items left to process.
} d; ///< State of dictionary conversion.
@@ -165,6 +48,15 @@ typedef struct {
list_T *list; ///< Currently converted list.
listitem_T *li; ///< Currently converted list item.
} l; ///< State of list or generic mapping conversion.
+ struct {
+ MPConvPartialStage stage; ///< Stage at which partial is being converted.
+ partial_T *pt; ///< Currently converted partial.
+ } p; ///< State of partial conversion.
+ struct {
+ typval_T *arg; ///< Currently converted argument.
+ typval_T *argv; ///< Start of the argument list.
+ size_t todo; ///< Number of items left to process.
+ } a; ///< State of list or generic mapping conversion.
} data; ///< Data to convert.
} MPConvStackVal;
@@ -179,21 +71,9 @@ typedef kvec_withinit_t(MPConvStackVal, 8) MPConvStack;
#define _mp_pop kv_pop
#define _mp_last kv_last
-/// Code for checking whether container references itself
-///
-/// @param[in,out] val Container to check.
-/// @param copyID_attr Name of the container attribute that holds copyID.
-/// After checking whether value of this attribute is
-/// copyID (variable) it is set to copyID.
-/// @param conv_type Type of the conversion, @see MPConvStackValType.
-#define _TYPVAL_ENCODE_CHECK_SELF_REFERENCE(val, copyID_attr, conv_type) \
- do { \
- if ((val)->copyID_attr == copyID) { \
- TYPVAL_ENCODE_CONV_RECURSE((val), conv_type); \
- return OK; \
- } \
- (val)->copyID_attr = copyID; \
- } while (0)
+static inline size_t tv_strlen(const typval_T *const tv)
+ REAL_FATTR_ALWAYS_INLINE REAL_FATTR_PURE REAL_FATTR_WARN_UNUSED_RESULT
+ REAL_FATTR_NONNULL_ALL;
/// Length of the string stored in typval_T
///
@@ -203,8 +83,6 @@ typedef kvec_withinit_t(MPConvStackVal, 8) MPConvStack;
/// @return Length of the string stored in typval_T, including 0 for NULL
/// string.
static inline size_t tv_strlen(const typval_T *const tv)
- FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
- FUNC_ATTR_NONNULL_ALL
{
assert(tv->v_type == VAR_STRING);
return (tv->vval.v_string == NULL
@@ -212,359 +90,57 @@ static inline size_t tv_strlen(const typval_T *const tv)
: strlen((char *) tv->vval.v_string));
}
-/// Define functions which convert VimL value to something else
-///
-/// Creates function `vim_to_{name}(firstargtype firstargname, typval_T *const
-/// tv)` which returns OK or FAIL and helper functions.
+/// Code for checking whether container references itself
///
-/// @param scope Scope of the main function: either nothing or `static`.
-/// @param name Name of the target converter.
-/// @param firstargtype Type of the first argument. It will be used to return
-/// the results.
-/// @param firstargname Name of the first argument.
-#define TYPVAL_ENCODE_DEFINE_CONV_FUNCTIONS(scope, name, firstargtype, \
- firstargname) \
-static int name##_convert_one_value(firstargtype firstargname, \
- MPConvStack *const mpstack, \
- typval_T *const tv, \
- const int copyID, \
- const char *const objname) \
- FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT \
-{ \
- switch (tv->v_type) { \
- case VAR_STRING: { \
- TYPVAL_ENCODE_CONV_STRING(tv->vval.v_string, tv_strlen(tv)); \
- break; \
- } \
- case VAR_NUMBER: { \
- TYPVAL_ENCODE_CONV_NUMBER(tv->vval.v_number); \
- break; \
- } \
- case VAR_FLOAT: { \
- TYPVAL_ENCODE_CONV_FLOAT(tv->vval.v_float); \
- break; \
- } \
- case VAR_FUNC: { \
- TYPVAL_ENCODE_CONV_FUNC(tv->vval.v_string); \
- break; \
- } \
- case VAR_LIST: { \
- if (tv->vval.v_list == NULL || tv->vval.v_list->lv_len == 0) { \
- TYPVAL_ENCODE_CONV_EMPTY_LIST(); \
- break; \
- } \
- _TYPVAL_ENCODE_CHECK_SELF_REFERENCE(tv->vval.v_list, lv_copyID, \
- kMPConvList); \
- TYPVAL_ENCODE_CONV_LIST_START(tv->vval.v_list->lv_len); \
- _mp_push(*mpstack, ((MPConvStackVal) { \
- .type = kMPConvList, \
- .tv = tv, \
- .data = { \
- .l = { \
- .list = tv->vval.v_list, \
- .li = tv->vval.v_list->lv_first, \
- }, \
- }, \
- })); \
- break; \
- } \
- case VAR_SPECIAL: { \
- switch (tv->vval.v_special) { \
- case kSpecialVarNull: { \
- TYPVAL_ENCODE_CONV_NIL(); \
- break; \
- } \
- case kSpecialVarTrue: \
- case kSpecialVarFalse: { \
- TYPVAL_ENCODE_CONV_BOOL(tv->vval.v_special == kSpecialVarTrue); \
- break; \
- } \
- } \
- break; \
- } \
- case VAR_DICT: { \
- if (tv->vval.v_dict == NULL \
- || tv->vval.v_dict->dv_hashtab.ht_used == 0) { \
- TYPVAL_ENCODE_CONV_EMPTY_DICT(); \
- break; \
- } \
- const dictitem_T *type_di; \
- const dictitem_T *val_di; \
- if (TYPVAL_ENCODE_ALLOW_SPECIALS \
- && tv->vval.v_dict->dv_hashtab.ht_used == 2 \
- && (type_di = dict_find((dict_T *) tv->vval.v_dict, \
- (char_u *) "_TYPE", -1)) != NULL \
- && type_di->di_tv.v_type == VAR_LIST \
- && (val_di = dict_find((dict_T *) tv->vval.v_dict, \
- (char_u *) "_VAL", -1)) != NULL) { \
- size_t i; \
- for (i = 0; i < ARRAY_SIZE(eval_msgpack_type_lists); i++) { \
- if (type_di->di_tv.vval.v_list == eval_msgpack_type_lists[i]) { \
- break; \
- } \
- } \
- if (i == ARRAY_SIZE(eval_msgpack_type_lists)) { \
- goto name##_convert_one_value_regular_dict; \
- } \
- switch ((MessagePackType) i) { \
- case kMPNil: { \
- TYPVAL_ENCODE_CONV_NIL(); \
- break; \
- } \
- case kMPBoolean: { \
- if (val_di->di_tv.v_type != VAR_NUMBER) { \
- goto name##_convert_one_value_regular_dict; \
- } \
- TYPVAL_ENCODE_CONV_BOOL(val_di->di_tv.vval.v_number); \
- break; \
- } \
- case kMPInteger: { \
- const list_T *val_list; \
- varnumber_T sign; \
- varnumber_T highest_bits; \
- varnumber_T high_bits; \
- varnumber_T low_bits; \
- /* List of 4 integers; first is signed (should be 1 or -1, but */ \
- /* this is not checked), second is unsigned and have at most */ \
- /* one (sign is -1) or two (sign is 1) non-zero bits (number of */ \
- /* bits is not checked), other unsigned and have at most 31 */ \
- /* non-zero bits (number of bits is not checked).*/ \
- if (val_di->di_tv.v_type != VAR_LIST \
- || (val_list = val_di->di_tv.vval.v_list) == NULL \
- || val_list->lv_len != 4 \
- || val_list->lv_first->li_tv.v_type != VAR_NUMBER \
- || (sign = val_list->lv_first->li_tv.vval.v_number) == 0 \
- || val_list->lv_first->li_next->li_tv.v_type != VAR_NUMBER \
- || (highest_bits = \
- val_list->lv_first->li_next->li_tv.vval.v_number) < 0 \
- || val_list->lv_last->li_prev->li_tv.v_type != VAR_NUMBER \
- || (high_bits = \
- val_list->lv_last->li_prev->li_tv.vval.v_number) < 0 \
- || val_list->lv_last->li_tv.v_type != VAR_NUMBER \
- || (low_bits = val_list->lv_last->li_tv.vval.v_number) < 0) { \
- goto name##_convert_one_value_regular_dict; \
- } \
- uint64_t number = ((uint64_t) (((uint64_t) highest_bits) << 62) \
- | (uint64_t) (((uint64_t) high_bits) << 31) \
- | (uint64_t) low_bits); \
- if (sign > 0) { \
- TYPVAL_ENCODE_CONV_UNSIGNED_NUMBER(number); \
- } else { \
- TYPVAL_ENCODE_CONV_NUMBER(-number); \
- } \
- break; \
- } \
- case kMPFloat: { \
- if (val_di->di_tv.v_type != VAR_FLOAT) { \
- goto name##_convert_one_value_regular_dict; \
- } \
- TYPVAL_ENCODE_CONV_FLOAT(val_di->di_tv.vval.v_float); \
- break; \
- } \
- case kMPString: \
- case kMPBinary: { \
- const bool is_string = ((MessagePackType) i == kMPString); \
- if (val_di->di_tv.v_type != VAR_LIST) { \
- goto name##_convert_one_value_regular_dict; \
- } \
- size_t len; \
- char *buf; \
- if (!encode_vim_list_to_buf(val_di->di_tv.vval.v_list, &len, \
- &buf)) { \
- goto name##_convert_one_value_regular_dict; \
- } \
- if (is_string) { \
- TYPVAL_ENCODE_CONV_STR_STRING(buf, len); \
- } else { \
- TYPVAL_ENCODE_CONV_STRING(buf, len); \
- } \
- xfree(buf); \
- break; \
- } \
- case kMPArray: { \
- if (val_di->di_tv.v_type != VAR_LIST) { \
- goto name##_convert_one_value_regular_dict; \
- } \
- _TYPVAL_ENCODE_CHECK_SELF_REFERENCE(val_di->di_tv.vval.v_list, \
- lv_copyID, kMPConvList); \
- TYPVAL_ENCODE_CONV_LIST_START(val_di->di_tv.vval.v_list->lv_len); \
- _mp_push(*mpstack, ((MPConvStackVal) { \
- .tv = tv, \
- .type = kMPConvList, \
- .data = { \
- .l = { \
- .list = val_di->di_tv.vval.v_list, \
- .li = val_di->di_tv.vval.v_list->lv_first, \
- }, \
- }, \
- })); \
- break; \
- } \
- case kMPMap: { \
- if (val_di->di_tv.v_type != VAR_LIST) { \
- goto name##_convert_one_value_regular_dict; \
- } \
- list_T *const val_list = val_di->di_tv.vval.v_list; \
- if (val_list == NULL || val_list->lv_len == 0) { \
- TYPVAL_ENCODE_CONV_EMPTY_DICT(); \
- break; \
- } \
- for (const listitem_T *li = val_list->lv_first; li != NULL; \
- li = li->li_next) { \
- if (li->li_tv.v_type != VAR_LIST \
- || li->li_tv.vval.v_list->lv_len != 2) { \
- goto name##_convert_one_value_regular_dict; \
- } \
- } \
- _TYPVAL_ENCODE_CHECK_SELF_REFERENCE(val_list, lv_copyID, \
- kMPConvPairs); \
- TYPVAL_ENCODE_CONV_DICT_START(val_list->lv_len); \
- _mp_push(*mpstack, ((MPConvStackVal) { \
- .tv = tv, \
- .type = kMPConvPairs, \
- .data = { \
- .l = { \
- .list = val_list, \
- .li = val_list->lv_first, \
- }, \
- }, \
- })); \
- break; \
- } \
- case kMPExt: { \
- const list_T *val_list; \
- varnumber_T type; \
- if (val_di->di_tv.v_type != VAR_LIST \
- || (val_list = val_di->di_tv.vval.v_list) == NULL \
- || val_list->lv_len != 2 \
- || (val_list->lv_first->li_tv.v_type != VAR_NUMBER) \
- || (type = val_list->lv_first->li_tv.vval.v_number) > INT8_MAX \
- || type < INT8_MIN \
- || (val_list->lv_last->li_tv.v_type != VAR_LIST)) { \
- goto name##_convert_one_value_regular_dict; \
- } \
- size_t len; \
- char *buf; \
- if (!encode_vim_list_to_buf(val_list->lv_last->li_tv.vval.v_list, \
- &len, &buf)) { \
- goto name##_convert_one_value_regular_dict; \
- } \
- TYPVAL_ENCODE_CONV_EXT_STRING(buf, len, type); \
- xfree(buf); \
- break; \
- } \
- } \
- break; \
- } \
-name##_convert_one_value_regular_dict: \
- _TYPVAL_ENCODE_CHECK_SELF_REFERENCE(tv->vval.v_dict, dv_copyID, \
- kMPConvDict); \
- TYPVAL_ENCODE_CONV_DICT_START(tv->vval.v_dict->dv_hashtab.ht_used); \
- _mp_push(*mpstack, ((MPConvStackVal) { \
- .tv = tv, \
- .type = kMPConvDict, \
- .data = { \
- .d = { \
- .dict = tv->vval.v_dict, \
- .hi = tv->vval.v_dict->dv_hashtab.ht_array, \
- .todo = tv->vval.v_dict->dv_hashtab.ht_used, \
- }, \
- }, \
- })); \
- break; \
- } \
- case VAR_UNKNOWN: { \
- EMSG2(_(e_intern2), #name "_convert_one_value()"); \
- return FAIL; \
- } \
- } \
- return OK; \
-} \
-\
-scope int encode_vim_to_##name(firstargtype firstargname, typval_T *const tv, \
- const char *const objname) \
- FUNC_ATTR_WARN_UNUSED_RESULT \
-{ \
- const int copyID = get_copyID(); \
- MPConvStack mpstack; \
- _mp_init(mpstack); \
- if (name##_convert_one_value(firstargname, &mpstack, tv, copyID, objname) \
- == FAIL) { \
- goto encode_vim_to_##name##_error_ret; \
- } \
- while (_mp_size(mpstack)) { \
- MPConvStackVal *cur_mpsv = &_mp_last(mpstack); \
- typval_T *cur_tv = NULL; \
- switch (cur_mpsv->type) { \
- case kMPConvDict: { \
- if (!cur_mpsv->data.d.todo) { \
- (void) _mp_pop(mpstack); \
- cur_mpsv->data.d.dict->dv_copyID = copyID - 1; \
- TYPVAL_ENCODE_CONV_DICT_END(); \
- continue; \
- } else if (cur_mpsv->data.d.todo \
- != cur_mpsv->data.d.dict->dv_hashtab.ht_used) { \
- TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS(); \
- } \
- while (HASHITEM_EMPTY(cur_mpsv->data.d.hi)) { \
- cur_mpsv->data.d.hi++; \
- } \
- dictitem_T *const di = HI2DI(cur_mpsv->data.d.hi); \
- cur_mpsv->data.d.todo--; \
- cur_mpsv->data.d.hi++; \
- TYPVAL_ENCODE_CONV_STR_STRING(&di->di_key[0], \
- strlen((char *) &di->di_key[0])); \
- TYPVAL_ENCODE_CONV_DICT_AFTER_KEY(); \
- cur_tv = &di->di_tv; \
- break; \
- } \
- case kMPConvList: { \
- if (cur_mpsv->data.l.li == NULL) { \
- (void) _mp_pop(mpstack); \
- cur_mpsv->data.l.list->lv_copyID = copyID - 1; \
- TYPVAL_ENCODE_CONV_LIST_END(); \
- continue; \
- } else if (cur_mpsv->data.l.li != cur_mpsv->data.l.list->lv_first) { \
- TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS(); \
- } \
- cur_tv = &cur_mpsv->data.l.li->li_tv; \
- cur_mpsv->data.l.li = cur_mpsv->data.l.li->li_next; \
- break; \
- } \
- case kMPConvPairs: { \
- if (cur_mpsv->data.l.li == NULL) { \
- (void) _mp_pop(mpstack); \
- cur_mpsv->data.l.list->lv_copyID = copyID - 1; \
- TYPVAL_ENCODE_CONV_DICT_END(); \
- continue; \
- } else if (cur_mpsv->data.l.li != cur_mpsv->data.l.list->lv_first) { \
- TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS(); \
- } \
- const list_T *const kv_pair = cur_mpsv->data.l.li->li_tv.vval.v_list; \
- TYPVAL_ENCODE_CONV_SPECIAL_DICT_KEY_CHECK( \
- encode_vim_to_##name##_error_ret, kv_pair->lv_first->li_tv); \
- if (name##_convert_one_value(firstargname, &mpstack, \
- &kv_pair->lv_first->li_tv, copyID, \
- objname) == FAIL) { \
- goto encode_vim_to_##name##_error_ret; \
- } \
- TYPVAL_ENCODE_CONV_DICT_AFTER_KEY(); \
- cur_tv = &kv_pair->lv_last->li_tv; \
- cur_mpsv->data.l.li = cur_mpsv->data.l.li->li_next; \
- break; \
+/// @param[in,out] val Container to check.
+/// @param copyID_attr Name of the container attribute that holds copyID.
+/// After checking whether value of this attribute is
+/// copyID (variable) it is set to copyID.
+/// @param[in] copyID CopyID used by the caller.
+/// @param conv_type Type of the conversion, @see MPConvStackValType.
+#define _TYPVAL_ENCODE_DO_CHECK_SELF_REFERENCE(val, copyID_attr, copyID, \
+ conv_type) \
+ do { \
+ const int te_csr_ret = _TYPVAL_ENCODE_CHECK_SELF_REFERENCE( \
+ TYPVAL_ENCODE_FIRST_ARG_NAME, \
+ (val), &(val)->copyID_attr, mpstack, copyID, conv_type, objname); \
+ if (te_csr_ret != NOTDONE) { \
+ return te_csr_ret; \
} \
- } \
- assert(cur_tv != NULL); \
- if (name##_convert_one_value(firstargname, &mpstack, cur_tv, copyID, \
- objname) == FAIL) { \
- goto encode_vim_to_##name##_error_ret; \
- } \
- } \
- _mp_destroy(mpstack); \
- return OK; \
-encode_vim_to_##name##_error_ret: \
- _mp_destroy(mpstack); \
- return FAIL; \
-}
+ } while (0)
+
+#define _TYPVAL_ENCODE_FUNC_NAME_INNER_2(pref, name, suf) \
+ pref##name##suf
+#define _TYPVAL_ENCODE_FUNC_NAME_INNER(pref, name, suf) \
+ _TYPVAL_ENCODE_FUNC_NAME_INNER_2(pref, name, suf)
+
+/// Construct function name, possibly using macros
+///
+/// Is used to expand macros that may appear in arguments.
+///
+/// @note Expands all arguments, even if only one is needed.
+///
+/// @param[in] pref Prefix.
+/// @param[in] suf Suffix.
+///
+/// @return Concat: pref + #TYPVAL_ENCODE_NAME + suf.
+#define _TYPVAL_ENCODE_FUNC_NAME(pref, suf) \
+ _TYPVAL_ENCODE_FUNC_NAME_INNER(pref, TYPVAL_ENCODE_NAME, suf)
+
+/// Self reference checker function name
+#define _TYPVAL_ENCODE_CHECK_SELF_REFERENCE \
+ _TYPVAL_ENCODE_FUNC_NAME(_typval_encode_, _check_self_reference)
+
+/// Entry point function name
+#define _TYPVAL_ENCODE_ENCODE \
+ _TYPVAL_ENCODE_FUNC_NAME(encode_vim_to_, )
+
+/// Name of the โ€ฆconvert_one_value function
+#define _TYPVAL_ENCODE_CONVERT_ONE_VALUE \
+ _TYPVAL_ENCODE_FUNC_NAME(_typval_encode_, _convert_one_value)
+
+/// Name of the dummy const dict_T *const variable
+#define TYPVAL_ENCODE_NODICT_VAR \
+ _TYPVAL_ENCODE_FUNC_NAME(_typval_encode_, _nodict_var)
#endif // NVIM_EVAL_TYPVAL_ENCODE_H
diff --git a/src/nvim/eval_defs.h b/src/nvim/eval_defs.h
deleted file mode 100644
index d5c9b2c1ec..0000000000
--- a/src/nvim/eval_defs.h
+++ /dev/null
@@ -1,165 +0,0 @@
-#ifndef NVIM_EVAL_DEFS_H
-#define NVIM_EVAL_DEFS_H
-
-#include <limits.h>
-#include <stddef.h>
-
-#include "nvim/hashtab.h"
-#include "nvim/lib/queue.h"
-
-typedef int varnumber_T;
-typedef double float_T;
-
-#define VARNUMBER_MAX INT_MAX
-#define VARNUMBER_MIN INT_MIN
-
-typedef struct listvar_S list_T;
-typedef struct dictvar_S dict_T;
-
-/// Special variable values
-typedef enum {
- kSpecialVarFalse, ///< v:false
- kSpecialVarTrue, ///< v:true
- kSpecialVarNull, ///< v:null
-} SpecialVarValue;
-
-/// Variable lock status for typval_T.v_lock
-typedef enum {
- VAR_UNLOCKED = 0, ///< Not locked.
- VAR_LOCKED, ///< User lock, can be unlocked.
- VAR_FIXED, ///< Locked forever.
-} VarLockStatus;
-
-/// VimL variable types, for use in typval_T.v_type
-typedef enum {
- VAR_UNKNOWN = 0, ///< Unknown (unspecified) value.
- VAR_NUMBER, ///< Number, .v_number is used.
- VAR_STRING, ///< String, .v_string is used.
- VAR_FUNC, ///< Function referene, .v_string is used for function name.
- VAR_LIST, ///< List, .v_list is used.
- VAR_DICT, ///< Dictionary, .v_dict is used.
- VAR_FLOAT, ///< Floating-point value, .v_float is used.
- VAR_SPECIAL, ///< Special value (true, false, null), .v_special
- ///< is used.
-} VarType;
-
-/// Structure that holds an internal variable value
-typedef struct {
- VarType v_type; ///< Variable type.
- VarLockStatus v_lock; ///< Variable lock status.
- union {
- varnumber_T v_number; ///< Number, for VAR_NUMBER.
- SpecialVarValue v_special; ///< Special value, for VAR_SPECIAL.
- float_T v_float; ///< Floating-point number, for VAR_FLOAT.
- char_u *v_string; ///< String, for VAR_STRING and VAR_FUNC, can be NULL.
- list_T *v_list; ///< List for VAR_LIST, can be NULL.
- dict_T *v_dict; ///< Dictionary for VAR_DICT, can be NULL.
- } vval; ///< Actual value.
-} typval_T;
-
-/* Values for "dv_scope". */
-#define VAR_SCOPE 1 /* a:, v:, s:, etc. scope dictionaries */
-#define VAR_DEF_SCOPE 2 /* l:, g: scope dictionaries: here funcrefs are not
- allowed to mask existing functions */
-
-/*
- * Structure to hold an item of a list: an internal variable without a name.
- */
-typedef struct listitem_S listitem_T;
-
-struct listitem_S {
- listitem_T *li_next; /* next item in list */
- listitem_T *li_prev; /* previous item in list */
- typval_T li_tv; /* type and value of the variable */
-};
-
-/*
- * Struct used by those that are using an item in a list.
- */
-typedef struct listwatch_S listwatch_T;
-
-struct listwatch_S {
- listitem_T *lw_item; /* item being watched */
- listwatch_T *lw_next; /* next watcher */
-};
-
-/*
- * Structure to hold info about a list.
- */
-struct listvar_S {
- listitem_T *lv_first; /* first item, NULL if none */
- listitem_T *lv_last; /* last item, NULL if none */
- int lv_refcount; /* reference count */
- int lv_len; /* number of items */
- listwatch_T *lv_watch; /* first watcher, NULL if none */
- int lv_idx; /* cached index of an item */
- listitem_T *lv_idx_item; /* when not NULL item at index "lv_idx" */
- int lv_copyID; /* ID used by deepcopy() */
- list_T *lv_copylist; /* copied list used by deepcopy() */
- char lv_lock; /* zero, VAR_LOCKED, VAR_FIXED */
- list_T *lv_used_next; /* next list in used lists list */
- list_T *lv_used_prev; /* previous list in used lists list */
-};
-
-/*
- * Structure to hold an item of a Dictionary.
- * Also used for a variable.
- * The key is copied into "di_key" to avoid an extra alloc/free for it.
- */
-struct dictitem_S {
- typval_T di_tv; /* type and value of the variable */
- char_u di_flags; /* flags (only used for variable) */
- char_u di_key[1]; /* key (actually longer!) */
-};
-
-typedef struct dictitem_S dictitem_T;
-
-#define DI_FLAGS_RO 1 // "di_flags" value: read-only variable
-#define DI_FLAGS_RO_SBX 2 // "di_flags" value: read-only in the sandbox
-#define DI_FLAGS_FIX 4 // "di_flags" value: fixed: no :unlet or remove()
-#define DI_FLAGS_LOCK 8 // "di_flags" value: locked variable
-#define DI_FLAGS_ALLOC 16 // "di_flags" value: separately allocated
-
-/// Structure representing a Dictionary
-struct dictvar_S {
- VarLockStatus dv_lock; ///< Whole dictionary lock status.
- char dv_scope; ///< Non-zero (#VAR_SCOPE, #VAR_DEF_SCOPE) if
- ///< dictionary represents a scope (i.e. g:, l: โ€ฆ).
- int dv_refcount; ///< Reference count.
- int dv_copyID; ///< ID used when recursivery traversing a value.
- hashtab_T dv_hashtab; ///< Hashtab containing all items.
- dict_T *dv_copydict; ///< Copied dict used by deepcopy().
- dict_T *dv_used_next; ///< Next dictionary in used dictionaries list.
- dict_T *dv_used_prev; ///< Previous dictionary in used dictionaries list.
- QUEUE watchers; ///< Dictionary key watchers set by user code.
-};
-
-// structure used for explicit stack while garbage collecting hash tables
-typedef struct ht_stack_S {
- hashtab_T *ht;
- struct ht_stack_S *prev;
-} ht_stack_T;
-
-// structure used for explicit stack while garbage collecting lists
-typedef struct list_stack_S {
- list_T *list;
- struct list_stack_S *prev;
-} list_stack_T;
-
-// In a hashtab item "hi_key" points to "di_key" in a dictitem.
-// This avoids adding a pointer to the hashtab item.
-
-/// Convert a dictitem pointer to a hashitem key pointer
-#define DI2HIKEY(di) ((di)->di_key)
-
-/// Convert a hashitem key pointer to a dictitem pointer
-#define HIKEY2DI(p) ((dictitem_T *)(p - offsetof(dictitem_T, di_key)))
-
-/// Convert a hashitem value pointer to a dictitem pointer
-#define HIVAL2DI(p) \
- ((dictitem_T *)(((char *)p) - offsetof(dictitem_T, di_tv)))
-
-/// Convert a hashitem pointer to a dictitem pointer
-#define HI2DI(hi) HIKEY2DI((hi)->hi_key)
-
-#endif // NVIM_EVAL_DEFS_H
diff --git a/src/nvim/event/defs.h b/src/nvim/event/defs.h
index e5335d9f25..fdd4f17d5c 100644
--- a/src/nvim/event/defs.h
+++ b/src/nvim/event/defs.h
@@ -4,20 +4,18 @@
#include <assert.h>
#include <stdarg.h>
-#define EVENT_HANDLER_MAX_ARGC 6
+#define EVENT_HANDLER_MAX_ARGC 10
typedef void (*argv_callback)(void **argv);
typedef struct message {
- int priority;
argv_callback handler;
void *argv[EVENT_HANDLER_MAX_ARGC];
} Event;
typedef void(*event_scheduler)(Event event, void *data);
-#define VA_EVENT_INIT(event, p, h, a) \
+#define VA_EVENT_INIT(event, h, a) \
do { \
assert(a <= EVENT_HANDLER_MAX_ARGC); \
- (event)->priority = p; \
(event)->handler = h; \
if (a) { \
va_list args; \
@@ -29,11 +27,11 @@ typedef void(*event_scheduler)(Event event, void *data);
} \
} while (0)
-static inline Event event_create(int priority, argv_callback cb, int argc, ...)
+static inline Event event_create(argv_callback cb, int argc, ...)
{
assert(argc <= EVENT_HANDLER_MAX_ARGC);
Event event;
- VA_EVENT_INIT(&event, priority, cb, argc);
+ VA_EVENT_INIT(&event, cb, argc);
return event;
}
diff --git a/src/nvim/event/libuv_process.c b/src/nvim/event/libuv_process.c
index a68badcc8f..ffe2db9b76 100644
--- a/src/nvim/event/libuv_process.c
+++ b/src/nvim/event/libuv_process.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <uv.h>
@@ -8,25 +11,37 @@
#include "nvim/event/process.h"
#include "nvim/event/libuv_process.h"
#include "nvim/log.h"
+#include "nvim/macros.h"
+#include "nvim/os/os.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "event/libuv_process.c.generated.h"
#endif
-bool libuv_process_spawn(LibuvProcess *uvproc)
+/// @returns zero on success, or negative error code
+int libuv_process_spawn(LibuvProcess *uvproc)
FUNC_ATTR_NONNULL_ALL
{
Process *proc = (Process *)uvproc;
uvproc->uvopts.file = proc->argv[0];
uvproc->uvopts.args = proc->argv;
- uvproc->uvopts.flags = UV_PROCESS_WINDOWS_HIDE
- | UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS;
+ uvproc->uvopts.flags = UV_PROCESS_WINDOWS_HIDE;
+#ifdef WIN32
+ // libuv collapses the argv to a CommandLineToArgvW()-style string. cmd.exe
+ // expects a different syntax (must be prepared by the caller before now).
+ if (os_shell_is_cmdexe(proc->argv[0])) {
+ uvproc->uvopts.flags |= UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS;
+ }
if (proc->detach) {
- uvproc->uvopts.flags |= UV_PROCESS_DETACHED;
+ uvproc->uvopts.flags |= UV_PROCESS_DETACHED;
}
+#else
+ // Always setsid() on unix-likes. #8107
+ uvproc->uvopts.flags |= UV_PROCESS_DETACHED;
+#endif
uvproc->uvopts.exit_cb = exit_cb;
uvproc->uvopts.cwd = proc->cwd;
- uvproc->uvopts.env = NULL;
+ uvproc->uvopts.env = NULL; // Inherits the parent (nvim) env.
uvproc->uvopts.stdio = uvproc->uvstdio;
uvproc->uvopts.stdio_count = 3;
uvproc->uvstdio[0].flags = UV_IGNORE;
@@ -34,29 +49,39 @@ bool libuv_process_spawn(LibuvProcess *uvproc)
uvproc->uvstdio[2].flags = UV_IGNORE;
uvproc->uv.data = proc;
- if (proc->in) {
+ if (!proc->in.closed) {
uvproc->uvstdio[0].flags = UV_CREATE_PIPE | UV_READABLE_PIPE;
- uvproc->uvstdio[0].data.stream = (uv_stream_t *)&proc->in->uv.pipe;
+#ifdef WIN32
+ uvproc->uvstdio[0].flags |= UV_OVERLAPPED_PIPE;
+#endif
+ uvproc->uvstdio[0].data.stream = STRUCT_CAST(uv_stream_t,
+ &proc->in.uv.pipe);
}
- if (proc->out) {
+ if (!proc->out.closed) {
uvproc->uvstdio[1].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE;
- uvproc->uvstdio[1].data.stream = (uv_stream_t *)&proc->out->uv.pipe;
+#ifdef WIN32
+ // pipe must be readable for IOCP to work.
+ uvproc->uvstdio[1].flags |= UV_READABLE_PIPE | UV_OVERLAPPED_PIPE;
+#endif
+ uvproc->uvstdio[1].data.stream = STRUCT_CAST(uv_stream_t,
+ &proc->out.uv.pipe);
}
- if (proc->err) {
+ if (!proc->err.closed) {
uvproc->uvstdio[2].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE;
- uvproc->uvstdio[2].data.stream = (uv_stream_t *)&proc->err->uv.pipe;
+ uvproc->uvstdio[2].data.stream = STRUCT_CAST(uv_stream_t,
+ &proc->err.uv.pipe);
}
int status;
if ((status = uv_spawn(&proc->loop->uv, &uvproc->uv, &uvproc->uvopts))) {
ELOG("uv_spawn failed: %s", uv_strerror(status));
- return false;
+ return status;
}
proc->pid = uvproc->uv.pid;
- return true;
+ return status;
}
void libuv_process_close(LibuvProcess *uvproc)
diff --git a/src/nvim/event/libuv_process.h b/src/nvim/event/libuv_process.h
index aaaa896e10..1132ce79ca 100644
--- a/src/nvim/event/libuv_process.h
+++ b/src/nvim/event/libuv_process.h
@@ -14,8 +14,9 @@ typedef struct libuv_process {
static inline LibuvProcess libuv_process_init(Loop *loop, void *data)
{
- LibuvProcess rv;
- rv.process = process_init(loop, kProcessTypeUv, data);
+ LibuvProcess rv = {
+ .process = process_init(loop, kProcessTypeUv, data)
+ };
return rv;
}
diff --git a/src/nvim/event/loop.c b/src/nvim/event/loop.c
index 6f3e6b9253..609c723c57 100644
--- a/src/nvim/event/loop.c
+++ b/src/nvim/event/loop.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <stdarg.h>
#include <stdint.h>
@@ -5,6 +8,7 @@
#include "nvim/event/loop.h"
#include "nvim/event/process.h"
+#include "nvim/log.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "event/loop.c.generated.h"
@@ -17,55 +21,87 @@ void loop_init(Loop *loop, void *data)
loop->recursive = 0;
loop->uv.data = loop;
loop->children = kl_init(WatcherPtr);
- loop->children_stop_requests = 0;
- loop->events = queue_new_parent(loop_on_put, loop);
- loop->fast_events = queue_new_child(loop->events);
- loop->thread_events = queue_new_parent(NULL, NULL);
+ loop->events = multiqueue_new_parent(loop_on_put, loop);
+ loop->fast_events = multiqueue_new_child(loop->events);
+ loop->thread_events = multiqueue_new_parent(NULL, NULL);
uv_mutex_init(&loop->mutex);
uv_async_init(&loop->uv, &loop->async, async_cb);
uv_signal_init(&loop->uv, &loop->children_watcher);
uv_timer_init(&loop->uv, &loop->children_kill_timer);
uv_timer_init(&loop->uv, &loop->poll_timer);
+ loop->poll_timer.data = xmalloc(sizeof(bool)); // "timeout expired" flag
}
-void loop_poll_events(Loop *loop, int ms)
+/// Processes one `Loop.uv` event (at most).
+/// Processes all `Loop.fast_events` events.
+/// Does NOT process `Loop.events`, that is an application-specific decision.
+///
+/// @returns true if `ms` timeout was reached
+bool loop_poll_events(Loop *loop, int ms)
{
if (loop->recursive++) {
abort(); // Should not re-enter uv_run
}
uv_run_mode mode = UV_RUN_ONCE;
+ bool timeout_expired = false;
if (ms > 0) {
- // Use a repeating timeout of ms milliseconds to make sure
- // we do not block indefinitely for I/O.
+ *((bool *)loop->poll_timer.data) = false; // reset "timeout expired" flag
+ // Dummy timer to ensure UV_RUN_ONCE does not block indefinitely for I/O.
uv_timer_start(&loop->poll_timer, timer_cb, (uint64_t)ms, (uint64_t)ms);
} else if (ms == 0) {
- // For ms == 0, we need to do a non-blocking event poll by
- // setting the run mode to UV_RUN_NOWAIT.
+ // For ms == 0, do a non-blocking event poll.
mode = UV_RUN_NOWAIT;
}
uv_run(&loop->uv, mode);
if (ms > 0) {
+ timeout_expired = *((bool *)loop->poll_timer.data);
uv_timer_stop(&loop->poll_timer);
}
loop->recursive--; // Can re-enter uv_run now
- queue_process_events(loop->fast_events);
+ multiqueue_process_events(loop->fast_events);
+ return timeout_expired;
}
-// Schedule an event from another thread
+/// Schedules an event from another thread.
+///
+/// @note Event is queued into `fast_events`, which is processed outside of the
+/// primary `events` queue by loop_poll_events(). For `main_loop`, that
+/// means `fast_events` is NOT processed in an "editor mode"
+/// (VimState.execute), so redraw and other side-effects are likely to be
+/// skipped.
+/// @see loop_schedule_deferred
void loop_schedule(Loop *loop, Event event)
{
uv_mutex_lock(&loop->mutex);
- queue_put_event(loop->thread_events, event);
+ multiqueue_put_event(loop->thread_events, event);
uv_async_send(&loop->async);
uv_mutex_unlock(&loop->mutex);
}
-void loop_on_put(Queue *queue, void *data)
+/// Schedules an event from another thread. Unlike loop_schedule(), the event
+/// is forwarded to `Loop.events`, instead of being processed immediately.
+///
+/// @see loop_schedule
+void loop_schedule_deferred(Loop *loop, Event event)
+{
+ Event *eventp = xmalloc(sizeof(*eventp));
+ *eventp = event;
+ loop_schedule(loop, event_create(loop_deferred_event, 2, loop, eventp));
+}
+static void loop_deferred_event(void **argv)
+{
+ Loop *loop = argv[0];
+ Event *eventp = argv[1];
+ multiqueue_put_event(loop->events, *eventp);
+ xfree(eventp);
+}
+
+void loop_on_put(MultiQueue *queue, void *data)
{
Loop *loop = data;
// Sometimes libuv will run pending callbacks(timer for example) before
@@ -76,34 +112,70 @@ void loop_on_put(Queue *queue, void *data)
uv_stop(&loop->uv);
}
-void loop_close(Loop *loop)
+/// @returns false if the loop could not be closed gracefully
+bool loop_close(Loop *loop, bool wait)
{
+ bool rv = true;
uv_mutex_destroy(&loop->mutex);
uv_close((uv_handle_t *)&loop->children_watcher, NULL);
uv_close((uv_handle_t *)&loop->children_kill_timer, NULL);
- uv_close((uv_handle_t *)&loop->poll_timer, NULL);
+ uv_close((uv_handle_t *)&loop->poll_timer, timer_close_cb);
uv_close((uv_handle_t *)&loop->async, NULL);
- do {
- uv_run(&loop->uv, UV_RUN_DEFAULT);
- } while (uv_loop_close(&loop->uv));
- queue_free(loop->fast_events);
- queue_free(loop->thread_events);
- queue_free(loop->events);
+ uint64_t start = wait ? os_hrtime() : 0;
+ while (true) {
+ uv_run(&loop->uv, wait ? UV_RUN_DEFAULT : UV_RUN_NOWAIT);
+ if (!uv_loop_close(&loop->uv) || !wait) {
+ break;
+ }
+ if (os_hrtime() - start >= 2 * 1000000000) {
+ // Some libuv resource was not correctly deref'd. Log and bail.
+ rv = false;
+ ELOG("uv_loop_close() hang?");
+ log_uv_handles(&loop->uv);
+ break;
+ }
+ }
+ multiqueue_free(loop->fast_events);
+ multiqueue_free(loop->thread_events);
+ multiqueue_free(loop->events);
kl_destroy(WatcherPtr, loop->children);
+ return rv;
+}
+
+void loop_purge(Loop *loop)
+{
+ uv_mutex_lock(&loop->mutex);
+ multiqueue_purge_events(loop->thread_events);
+ multiqueue_purge_events(loop->fast_events);
+ uv_mutex_unlock(&loop->mutex);
+}
+
+size_t loop_size(Loop *loop)
+{
+ uv_mutex_lock(&loop->mutex);
+ size_t rv = multiqueue_size(loop->thread_events);
+ uv_mutex_unlock(&loop->mutex);
+ return rv;
}
static void async_cb(uv_async_t *handle)
{
Loop *l = handle->loop->data;
uv_mutex_lock(&l->mutex);
- while (!queue_empty(l->thread_events)) {
- Event ev = queue_get(l->thread_events);
- queue_put_event(l->fast_events, ev);
+ while (!multiqueue_empty(l->thread_events)) {
+ Event ev = multiqueue_get(l->thread_events);
+ multiqueue_put_event(l->fast_events, ev);
}
uv_mutex_unlock(&l->mutex);
}
static void timer_cb(uv_timer_t *handle)
{
+ bool *timeout_expired = handle->data;
+ *timeout_expired = true;
}
+static void timer_close_cb(uv_handle_t *handle)
+{
+ xfree(handle->data);
+}
diff --git a/src/nvim/event/loop.h b/src/nvim/event/loop.h
index 407aa4245f..f5dd23ac8b 100644
--- a/src/nvim/event/loop.h
+++ b/src/nvim/event/loop.h
@@ -7,7 +7,7 @@
#include "nvim/lib/klist.h"
#include "nvim/os/time.h"
-#include "nvim/event/queue.h"
+#include "nvim/event/multiqueue.h"
typedef void * WatcherPtr;
@@ -16,33 +16,51 @@ KLIST_INIT(WatcherPtr, WatcherPtr, _noop)
typedef struct loop {
uv_loop_t uv;
- Queue *events, *fast_events, *thread_events;
+ MultiQueue *events;
+ MultiQueue *thread_events;
+ // Immediate events:
+ // "Processed after exiting uv_run() (to avoid recursion), but before
+ // returning from loop_poll_events()." 502aee690c98
+ // Practical consequence (for main_loop): these events are processed by
+ // state_enter()..os_inchar()
+ // whereas "regular" events (main_loop.events) are processed by
+ // state_enter()..VimState.execute()
+ // But state_enter()..os_inchar() can be "too early" if you want the event
+ // to trigger UI updates and other user-activity-related side-effects.
+ MultiQueue *fast_events;
+
+ // used by process/job-control subsystem
klist_t(WatcherPtr) *children;
uv_signal_t children_watcher;
- uv_timer_t children_kill_timer, poll_timer;
- size_t children_stop_requests;
+ uv_timer_t children_kill_timer;
+
+ // generic timer, used by loop_poll_events()
+ uv_timer_t poll_timer;
+
uv_async_t async;
uv_mutex_t mutex;
int recursive;
} Loop;
-#define CREATE_EVENT(queue, handler, argc, ...) \
+#define CREATE_EVENT(multiqueue, handler, argc, ...) \
do { \
- if (queue) { \
- queue_put((queue), (handler), argc, __VA_ARGS__); \
+ if (multiqueue) { \
+ multiqueue_put((multiqueue), (handler), argc, __VA_ARGS__); \
} else { \
void *argv[argc] = { __VA_ARGS__ }; \
(handler)(argv); \
} \
} while (0)
+// -V:LOOP_PROCESS_EVENTS_UNTIL:547
+
// Poll for events until a condition or timeout
-#define LOOP_PROCESS_EVENTS_UNTIL(loop, queue, timeout, condition) \
+#define LOOP_PROCESS_EVENTS_UNTIL(loop, multiqueue, timeout, condition) \
do { \
int remaining = timeout; \
uint64_t before = (remaining > 0) ? os_hrtime() : 0; \
while (!(condition)) { \
- LOOP_PROCESS_EVENTS(loop, queue, remaining); \
+ LOOP_PROCESS_EVENTS(loop, multiqueue, remaining); \
if (remaining == 0) { \
break; \
} else if (remaining > 0) { \
@@ -56,10 +74,10 @@ typedef struct loop {
} \
} while (0)
-#define LOOP_PROCESS_EVENTS(loop, queue, timeout) \
+#define LOOP_PROCESS_EVENTS(loop, multiqueue, timeout) \
do { \
- if (queue && !queue_empty(queue)) { \
- queue_process_events(queue); \
+ if (multiqueue && !multiqueue_empty(multiqueue)) { \
+ multiqueue_process_events(multiqueue); \
} else { \
loop_poll_events(loop, timeout); \
} \
diff --git a/src/nvim/event/multiqueue.c b/src/nvim/event/multiqueue.c
new file mode 100644
index 0000000000..ef9f3f1870
--- /dev/null
+++ b/src/nvim/event/multiqueue.c
@@ -0,0 +1,247 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+// Multi-level queue for selective async event processing.
+// Not threadsafe; access must be synchronized externally.
+//
+// Multiqueue supports a parent-child relationship with these properties:
+// - pushing a node to a child queue will push a corresponding link node to the
+// parent queue
+// - removing a link node from a parent queue will remove the next node
+// in the linked child queue
+// - removing a node from a child queue will remove the corresponding link node
+// in the parent queue
+//
+// These properties allow Nvim to organize and process events from different
+// sources with a certain degree of control. How the multiqueue is used:
+//
+// +----------------+
+// | Main loop |
+// +----------------+
+//
+// +----------------+
+// +-------------->| Event loop |<------------+
+// | +--+-------------+ |
+// | ^ ^ |
+// | | | |
+// +-----------+ +-----------+ +---------+ +---------+
+// | Channel 1 | | Channel 2 | | Job 1 | | Job 2 |
+// +-----------+ +-----------+ +---------+ +---------+
+//
+//
+// The lower boxes represent event emitters, each with its own private queue
+// having the event loop queue as the parent.
+//
+// When idle, the main loop spins the event loop which queues events from many
+// sources (channels, jobs, user...). Each event emitter pushes events to its
+// private queue which is propagated to the event loop queue. When the main loop
+// consumes an event, the corresponding event is removed from the emitter's
+// queue.
+//
+// The main reason for this queue hierarchy is to allow focusing on a single
+// event emitter while blocking the main loop. For example, if the `jobwait`
+// VimL function is called on job1, the main loop will temporarily stop polling
+// the event loop queue and poll job1 queue instead. Same with channels, when
+// calling `rpcrequest` we want to temporarily stop processing events from
+// other sources and focus on a specific channel.
+
+#include <assert.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+
+#include <uv.h>
+
+#include "nvim/event/multiqueue.h"
+#include "nvim/memory.h"
+#include "nvim/os/time.h"
+
+typedef struct multiqueue_item MultiQueueItem;
+struct multiqueue_item {
+ union {
+ MultiQueue *queue;
+ struct {
+ Event event;
+ MultiQueueItem *parent_item;
+ } item;
+ } data;
+ bool link; // true: current item is just a link to a node in a child queue
+ QUEUE node;
+};
+
+struct multiqueue {
+ MultiQueue *parent;
+ QUEUE headtail; // circularly-linked
+ put_callback put_cb;
+ void *data;
+ size_t size;
+};
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "event/multiqueue.c.generated.h"
+#endif
+
+static Event NILEVENT = { .handler = NULL, .argv = {NULL} };
+
+MultiQueue *multiqueue_new_parent(put_callback put_cb, void *data)
+{
+ return multiqueue_new(NULL, put_cb, data);
+}
+
+MultiQueue *multiqueue_new_child(MultiQueue *parent)
+ FUNC_ATTR_NONNULL_ALL
+{
+ assert(!parent->parent); // parent cannot have a parent, more like a "root"
+ parent->size++;
+ return multiqueue_new(parent, NULL, NULL);
+}
+
+static MultiQueue *multiqueue_new(MultiQueue *parent, put_callback put_cb,
+ void *data)
+{
+ MultiQueue *rv = xmalloc(sizeof(MultiQueue));
+ QUEUE_INIT(&rv->headtail);
+ rv->size = 0;
+ rv->parent = parent;
+ rv->put_cb = put_cb;
+ rv->data = data;
+ return rv;
+}
+
+void multiqueue_free(MultiQueue *this)
+{
+ assert(this);
+ while (!QUEUE_EMPTY(&this->headtail)) {
+ QUEUE *q = QUEUE_HEAD(&this->headtail);
+ MultiQueueItem *item = multiqueue_node_data(q);
+ if (this->parent) {
+ QUEUE_REMOVE(&item->data.item.parent_item->node);
+ xfree(item->data.item.parent_item);
+ }
+ QUEUE_REMOVE(q);
+ xfree(item);
+ }
+
+ xfree(this);
+}
+
+/// Removes the next item and returns its Event.
+Event multiqueue_get(MultiQueue *this)
+{
+ return multiqueue_empty(this) ? NILEVENT : multiqueue_remove(this);
+}
+
+void multiqueue_put_event(MultiQueue *this, Event event)
+{
+ assert(this);
+ multiqueue_push(this, event);
+ if (this->parent && this->parent->put_cb) {
+ this->parent->put_cb(this->parent, this->parent->data);
+ }
+}
+
+void multiqueue_process_events(MultiQueue *this)
+{
+ assert(this);
+ while (!multiqueue_empty(this)) {
+ Event event = multiqueue_remove(this);
+ if (event.handler) {
+ event.handler(event.argv);
+ }
+ }
+}
+
+/// Removes all events without processing them.
+void multiqueue_purge_events(MultiQueue *this)
+{
+ assert(this);
+ while (!multiqueue_empty(this)) {
+ (void)multiqueue_remove(this);
+ }
+}
+
+bool multiqueue_empty(MultiQueue *this)
+{
+ assert(this);
+ return QUEUE_EMPTY(&this->headtail);
+}
+
+void multiqueue_replace_parent(MultiQueue *this, MultiQueue *new_parent)
+{
+ assert(multiqueue_empty(this));
+ this->parent = new_parent;
+}
+
+/// Gets the count of all events currently in the queue.
+size_t multiqueue_size(MultiQueue *this)
+{
+ return this->size;
+}
+
+/// Gets an Event from an item.
+///
+/// @param remove Remove the node from its queue, and free it.
+static Event multiqueueitem_get_event(MultiQueueItem *item, bool remove)
+{
+ assert(item != NULL);
+ Event ev;
+ if (item->link) {
+ // get the next node in the linked queue
+ MultiQueue *linked = item->data.queue;
+ assert(!multiqueue_empty(linked));
+ MultiQueueItem *child =
+ multiqueue_node_data(QUEUE_HEAD(&linked->headtail));
+ ev = child->data.item.event;
+ // remove the child node
+ if (remove) {
+ QUEUE_REMOVE(&child->node);
+ xfree(child);
+ }
+ } else {
+ // remove the corresponding link node in the parent queue
+ if (remove && item->data.item.parent_item) {
+ QUEUE_REMOVE(&item->data.item.parent_item->node);
+ xfree(item->data.item.parent_item);
+ item->data.item.parent_item = NULL;
+ }
+ ev = item->data.item.event;
+ }
+ return ev;
+}
+
+static Event multiqueue_remove(MultiQueue *this)
+{
+ assert(!multiqueue_empty(this));
+ QUEUE *h = QUEUE_HEAD(&this->headtail);
+ QUEUE_REMOVE(h);
+ MultiQueueItem *item = multiqueue_node_data(h);
+ assert(!item->link || !this->parent); // Only a parent queue has link-nodes
+ Event ev = multiqueueitem_get_event(item, true);
+ this->size--;
+ xfree(item);
+ return ev;
+}
+
+static void multiqueue_push(MultiQueue *this, Event event)
+{
+ MultiQueueItem *item = xmalloc(sizeof(MultiQueueItem));
+ item->link = false;
+ item->data.item.event = event;
+ item->data.item.parent_item = NULL;
+ QUEUE_INSERT_TAIL(&this->headtail, &item->node);
+ if (this->parent) {
+ // push link node to the parent queue
+ item->data.item.parent_item = xmalloc(sizeof(MultiQueueItem));
+ item->data.item.parent_item->link = true;
+ item->data.item.parent_item->data.queue = this;
+ QUEUE_INSERT_TAIL(&this->parent->headtail,
+ &item->data.item.parent_item->node);
+ }
+ this->size++;
+}
+
+static MultiQueueItem *multiqueue_node_data(QUEUE *q)
+{
+ return QUEUE_DATA(q, MultiQueueItem, node);
+}
diff --git a/src/nvim/event/multiqueue.h b/src/nvim/event/multiqueue.h
new file mode 100644
index 0000000000..a688107665
--- /dev/null
+++ b/src/nvim/event/multiqueue.h
@@ -0,0 +1,19 @@
+#ifndef NVIM_EVENT_MULTIQUEUE_H
+#define NVIM_EVENT_MULTIQUEUE_H
+
+#include <uv.h>
+
+#include "nvim/event/defs.h"
+#include "nvim/lib/queue.h"
+
+typedef struct multiqueue MultiQueue;
+typedef void (*put_callback)(MultiQueue *multiq, void *data);
+
+#define multiqueue_put(q, h, ...) \
+ multiqueue_put_event(q, event_create(h, __VA_ARGS__));
+
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "event/multiqueue.h.generated.h"
+#endif
+#endif // NVIM_EVENT_MULTIQUEUE_H
diff --git a/src/nvim/event/process.c b/src/nvim/event/process.c
index 1c4c9737c3..7a8a39dbcf 100644
--- a/src/nvim/event/process.c
+++ b/src/nvim/event/process.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <stdlib.h>
@@ -9,63 +12,65 @@
#include "nvim/event/wstream.h"
#include "nvim/event/process.h"
#include "nvim/event/libuv_process.h"
+#include "nvim/os/process.h"
#include "nvim/os/pty_process.h"
#include "nvim/globals.h"
+#include "nvim/macros.h"
#include "nvim/log.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "event/process.c.generated.h"
#endif
-// {SIGNAL}_TIMEOUT is the time (in nanoseconds) that a process has to cleanly
-// exit before we send SIGNAL to it
-#define TERM_TIMEOUT 1000000000
-#define KILL_TIMEOUT (TERM_TIMEOUT * 2)
-
-#define CLOSE_PROC_STREAM(proc, stream) \
- do { \
- if (proc->stream && !proc->stream->closed) { \
- stream_close(proc->stream, NULL); \
- } \
- } while (0)
+// Time for a process to exit cleanly before we send KILL.
+// For PTY processes SIGTERM is sent first (in case SIGHUP was not enough).
+#define KILL_TIMEOUT_MS 2000
static bool process_is_tearing_down = false;
-bool process_spawn(Process *proc) FUNC_ATTR_NONNULL_ALL
+/// @returns zero on success, or negative error code
+int process_spawn(Process *proc, bool in, bool out, bool err)
+ FUNC_ATTR_NONNULL_ALL
{
- if (proc->in) {
- uv_pipe_init(&proc->loop->uv, &proc->in->uv.pipe, 0);
+ if (in) {
+ uv_pipe_init(&proc->loop->uv, &proc->in.uv.pipe, 0);
+ } else {
+ proc->in.closed = true;
}
- if (proc->out) {
- uv_pipe_init(&proc->loop->uv, &proc->out->uv.pipe, 0);
+ if (out) {
+ uv_pipe_init(&proc->loop->uv, &proc->out.uv.pipe, 0);
+ } else {
+ proc->out.closed = true;
}
- if (proc->err) {
- uv_pipe_init(&proc->loop->uv, &proc->err->uv.pipe, 0);
+ if (err) {
+ uv_pipe_init(&proc->loop->uv, &proc->err.uv.pipe, 0);
+ } else {
+ proc->err.closed = true;
}
- bool success;
+ int status;
switch (proc->type) {
case kProcessTypeUv:
- success = libuv_process_spawn((LibuvProcess *)proc);
+ status = libuv_process_spawn((LibuvProcess *)proc);
break;
case kProcessTypePty:
- success = pty_process_spawn((PtyProcess *)proc);
+ status = pty_process_spawn((PtyProcess *)proc);
break;
default:
abort();
}
- if (!success) {
- if (proc->in) {
- uv_close((uv_handle_t *)&proc->in->uv.pipe, NULL);
+ if (status) {
+ if (in) {
+ uv_close((uv_handle_t *)&proc->in.uv.pipe, NULL);
}
- if (proc->out) {
- uv_close((uv_handle_t *)&proc->out->uv.pipe, NULL);
+ if (out) {
+ uv_close((uv_handle_t *)&proc->out.uv.pipe, NULL);
}
- if (proc->err) {
- uv_close((uv_handle_t *)&proc->err->uv.pipe, NULL);
+ if (err) {
+ uv_close((uv_handle_t *)&proc->err.uv.pipe, NULL);
}
if (proc->type == kProcessTypeUv) {
@@ -75,32 +80,30 @@ bool process_spawn(Process *proc) FUNC_ATTR_NONNULL_ALL
}
shell_free_argv(proc->argv);
proc->status = -1;
- return false;
+ return status;
}
- void *data = proc->data;
-
- if (proc->in) {
- stream_init(NULL, proc->in, -1, (uv_stream_t *)&proc->in->uv.pipe, data);
- proc->in->events = proc->events;
- proc->in->internal_data = proc;
- proc->in->internal_close_cb = on_process_stream_close;
+ if (in) {
+ stream_init(NULL, &proc->in, -1,
+ STRUCT_CAST(uv_stream_t, &proc->in.uv.pipe));
+ proc->in.internal_data = proc;
+ proc->in.internal_close_cb = on_process_stream_close;
proc->refcount++;
}
- if (proc->out) {
- stream_init(NULL, proc->out, -1, (uv_stream_t *)&proc->out->uv.pipe, data);
- proc->out->events = proc->events;
- proc->out->internal_data = proc;
- proc->out->internal_close_cb = on_process_stream_close;
+ if (out) {
+ stream_init(NULL, &proc->out, -1,
+ STRUCT_CAST(uv_stream_t, &proc->out.uv.pipe));
+ proc->out.internal_data = proc;
+ proc->out.internal_close_cb = on_process_stream_close;
proc->refcount++;
}
- if (proc->err) {
- stream_init(NULL, proc->err, -1, (uv_stream_t *)&proc->err->uv.pipe, data);
- proc->err->events = proc->events;
- proc->err->internal_data = proc;
- proc->err->internal_close_cb = on_process_stream_close;
+ if (err) {
+ stream_init(NULL, &proc->err, -1,
+ STRUCT_CAST(uv_stream_t, &proc->err.uv.pipe));
+ proc->err.internal_data = proc;
+ proc->err.internal_close_cb = on_process_stream_close;
proc->refcount++;
}
@@ -108,7 +111,8 @@ bool process_spawn(Process *proc) FUNC_ATTR_NONNULL_ALL
proc->internal_close_cb = decref;
proc->refcount++;
kl_push(WatcherPtr, proc->loop->children, proc);
- return true;
+ DLOG("new: pid=%d argv=[%s]", proc->pid, *proc->argv);
+ return 0;
}
void process_teardown(Loop *loop) FUNC_ATTR_NONNULL_ALL
@@ -116,75 +120,51 @@ void process_teardown(Loop *loop) FUNC_ATTR_NONNULL_ALL
process_is_tearing_down = true;
kl_iter(WatcherPtr, loop->children, current) {
Process *proc = (*current)->data;
- if (proc->detach) {
+ if (proc->detach || proc->type == kProcessTypePty) {
// Close handles to process without killing it.
CREATE_EVENT(loop->events, process_close_handles, 1, proc);
} else {
- if (proc->type == kProcessTypeUv) {
- uv_kill(proc->pid, SIGTERM);
- proc->term_sent = true;
- process_stop(proc);
- } else { // kProcessTypePty
- process_close_streams(proc);
- pty_process_close_master((PtyProcess *)proc);
- }
+ process_stop(proc);
}
}
- // Wait until all children exit
- LOOP_PROCESS_EVENTS_UNTIL(loop, loop->events, -1, kl_empty(loop->children));
+ // Wait until all children exit and all close events are processed.
+ LOOP_PROCESS_EVENTS_UNTIL(
+ loop, loop->events, -1,
+ kl_empty(loop->children) && multiqueue_empty(loop->events));
pty_process_teardown(loop);
}
-// Wrappers around `stream_close` that protect against double-closing.
void process_close_streams(Process *proc) FUNC_ATTR_NONNULL_ALL
{
- process_close_in(proc);
- process_close_out(proc);
- process_close_err(proc);
-}
-
-void process_close_in(Process *proc) FUNC_ATTR_NONNULL_ALL
-{
- CLOSE_PROC_STREAM(proc, in);
-}
-
-void process_close_out(Process *proc) FUNC_ATTR_NONNULL_ALL
-{
- CLOSE_PROC_STREAM(proc, out);
-}
-
-void process_close_err(Process *proc) FUNC_ATTR_NONNULL_ALL
-{
- CLOSE_PROC_STREAM(proc, err);
+ stream_may_close(&proc->in);
+ stream_may_close(&proc->out);
+ stream_may_close(&proc->err);
}
/// Synchronously wait for a process to finish
///
-/// @param process The Process instance
-/// @param ms Number of milliseconds to wait, 0 for not waiting, -1 for
-/// waiting until the process quits.
-/// @return returns the status code of the exited process. -1 if the process is
-/// still running and the `timeout` has expired. Note that this is
-/// indistinguishable from the process returning -1 by itself. Which
-/// is possible on some OS. Returns -2 if an user has interruped the
-/// wait.
-int process_wait(Process *proc, int ms, Queue *events) FUNC_ATTR_NONNULL_ARG(1)
+/// @param process Process instance
+/// @param ms Time in milliseconds to wait for the process.
+/// 0 for no wait. -1 to wait until the process quits.
+/// @return Exit code of the process. proc->status will have the same value.
+/// -1 if the timeout expired while the process is still running.
+/// -2 if the user interruped the wait.
+int process_wait(Process *proc, int ms, MultiQueue *events)
+ FUNC_ATTR_NONNULL_ARG(1)
{
- // The default status is -1, which represents a timeout
- int status = -1;
- bool interrupted = false;
if (!proc->refcount) {
+ int status = proc->status;
LOOP_PROCESS_EVENTS(proc->loop, proc->events, 0);
- return proc->status;
+ return status;
}
if (!events) {
events = proc->events;
}
- // Increase refcount to stop the exit callback from being called(and possibly
- // being freed) before we have a chance to get the status.
+ // Increase refcount to stop the exit callback from being called (and possibly
+ // freed) before we have a chance to get the status.
proc->refcount++;
LOOP_PROCESS_EVENTS_UNTIL(proc->loop, events, ms,
// Until...
@@ -194,7 +174,6 @@ int process_wait(Process *proc, int ms, Queue *events) FUNC_ATTR_NONNULL_ARG(1)
// we'll assume that a user frantically hitting interrupt doesn't like
// the current job. Signal that it has to be killed.
if (got_int) {
- interrupted = true;
got_int = false;
process_stop(proc);
if (ms == -1) {
@@ -205,38 +184,40 @@ int process_wait(Process *proc, int ms, Queue *events) FUNC_ATTR_NONNULL_ARG(1)
} else {
LOOP_PROCESS_EVENTS(proc->loop, events, 0);
}
+
+ proc->status = -2;
}
if (proc->refcount == 1) {
- // Job exited, collect status and manually invoke close_cb to free the job
- // resources
- status = interrupted ? -2 : proc->status;
+ // Job exited, free its resources.
decref(proc);
if (events) {
// the decref call created an exit event, process it now
- queue_process_events(events);
+ multiqueue_process_events(events);
}
} else {
proc->refcount--;
}
- return status;
+ return proc->status;
}
/// Ask a process to terminate and eventually kill if it doesn't respond
void process_stop(Process *proc) FUNC_ATTR_NONNULL_ALL
{
- if (proc->stopped_time) {
+ bool exited = (proc->status >= 0);
+ if (exited || proc->stopped_time) {
return;
}
-
proc->stopped_time = os_hrtime();
+
switch (proc->type) {
case kProcessTypeUv:
// Close the process's stdin. If the process doesn't close its own
// stdout/stderr, they will be closed when it exits(possibly due to being
// terminated after a timeout)
- process_close_in(proc);
+ stream_may_close(&proc->in);
+ os_proc_tree_kill(proc->pid, SIGTERM);
break;
case kProcessTypePty:
// close all streams for pty processes to send SIGHUP to the process
@@ -247,36 +228,32 @@ void process_stop(Process *proc) FUNC_ATTR_NONNULL_ALL
abort();
}
- Loop *loop = proc->loop;
- if (!loop->children_stop_requests++) {
- // When there's at least one stop request pending, start a timer that
- // will periodically check if a signal should be send to a to the job
- DLOG("Starting job kill timer");
- uv_timer_start(&loop->children_kill_timer, children_kill_cb, 100, 100);
- }
+ // (Re)start timer to verify that stopped process(es) died.
+ uv_timer_start(&proc->loop->children_kill_timer, children_kill_cb,
+ KILL_TIMEOUT_MS, 0);
}
-/// Iterates the process list sending SIGTERM to stopped processes and SIGKILL
-/// to those that didn't die from SIGTERM after a while(exit_timeout is 0).
+/// Sends SIGKILL (or SIGTERM..SIGKILL for PTY jobs) to processes that did
+/// not terminate after process_stop().
static void children_kill_cb(uv_timer_t *handle)
{
Loop *loop = handle->loop->data;
- uint64_t now = os_hrtime();
kl_iter(WatcherPtr, loop->children, current) {
Process *proc = (*current)->data;
- if (!proc->stopped_time) {
+ bool exited = (proc->status >= 0);
+ if (exited || !proc->stopped_time) {
continue;
}
- uint64_t elapsed = now - proc->stopped_time;
-
- if (!proc->term_sent && elapsed >= TERM_TIMEOUT) {
- ILOG("Sending SIGTERM to pid %d", proc->pid);
- uv_kill(proc->pid, SIGTERM);
- proc->term_sent = true;
- } else if (elapsed >= KILL_TIMEOUT) {
- ILOG("Sending SIGKILL to pid %d", proc->pid);
- uv_kill(proc->pid, SIGKILL);
+ uint64_t term_sent = UINT64_MAX == proc->stopped_time;
+ if (kProcessTypePty != proc->type || term_sent) {
+ os_proc_tree_kill(proc->pid, SIGKILL);
+ } else {
+ os_proc_tree_kill(proc->pid, SIGTERM);
+ proc->stopped_time = UINT64_MAX; // Flag: SIGTERM was sent.
+ // Restart timer.
+ uv_timer_start(&proc->loop->children_kill_timer, children_kill_cb,
+ KILL_TIMEOUT_MS, 0);
}
}
}
@@ -288,7 +265,7 @@ static void process_close_event(void **argv)
if (proc->type == kProcessTypePty) {
xfree(((PtyProcess *)proc)->term_name);
}
- if (proc->cb) {
+ if (proc->cb) { // "on_exit" for jobstart(). See channel_job_start().
proc->cb(proc, proc->status, proc->data);
}
}
@@ -315,12 +292,21 @@ static void decref(Process *proc)
static void process_close(Process *proc)
FUNC_ATTR_NONNULL_ARG(1)
{
- if (process_is_tearing_down && proc->detach && proc->closed) {
- // If a detached process dies while tearing down it might get closed twice.
+ if (process_is_tearing_down && (proc->detach || proc->type == kProcessTypePty)
+ && proc->closed) {
+ // If a detached/pty process dies while tearing down it might get closed
+ // twice.
return;
}
assert(!proc->closed);
proc->closed = true;
+
+ if (proc->detach) {
+ if (proc->type == kProcessTypeUv) {
+ uv_unref((uv_handle_t *)&(((LibuvProcess *)proc)->uv));
+ }
+ }
+
switch (proc->type) {
case kProcessTypeUv:
libuv_process_close((LibuvProcess *)proc);
@@ -365,16 +351,16 @@ static void flush_stream(Process *proc, Stream *stream)
// Poll for data and process the generated events.
loop_poll_events(proc->loop, 0);
- if (proc->events) {
- queue_process_events(proc->events);
+ if (stream->events) {
+ multiqueue_process_events(stream->events);
}
// Stream can be closed if it is empty.
- if (num_bytes == stream->num_bytes) {
- if (stream->read_cb) {
+ if (num_bytes == stream->num_bytes) { // -V547
+ if (stream->read_cb && !stream->did_eof) {
// Stream callback could miss EOF handling if a child keeps the stream
- // open.
- stream->read_cb(stream, stream->buffer, 0, stream->data, true);
+ // open. But only send EOF if we haven't already.
+ stream->read_cb(stream, stream->buffer, 0, stream->cb_data, true);
}
break;
}
@@ -385,8 +371,8 @@ static void process_close_handles(void **argv)
{
Process *proc = argv[0];
- flush_stream(proc, proc->out);
- flush_stream(proc, proc->err);
+ flush_stream(proc, &proc->out);
+ flush_stream(proc, &proc->err);
process_close_streams(proc);
process_close(proc);
@@ -395,18 +381,14 @@ static void process_close_handles(void **argv)
static void on_process_exit(Process *proc)
{
Loop *loop = proc->loop;
- if (proc->stopped_time && loop->children_stop_requests
- && !--loop->children_stop_requests) {
- // Stop the timer if no more stop requests are pending
- DLOG("Stopping process kill timer");
- uv_timer_stop(&loop->children_kill_timer);
- }
+ ILOG("exited: pid=%d status=%d stoptime=%" PRIu64, proc->pid, proc->status,
+ proc->stopped_time);
// Process has terminated, but there could still be data to be read from the
// OS. We are still in the libuv loop, so we cannot call code that polls for
// more data directly. Instead delay the reading after the libuv loop by
// queueing process_close_handles() as an event.
- Queue *queue = proc->events ? proc->events : loop->events;
+ MultiQueue *queue = proc->events ? proc->events : loop->events;
CREATE_EVENT(queue, process_close_handles, 1, proc);
}
diff --git a/src/nvim/event/process.h b/src/nvim/event/process.h
index a4c6e7eeb2..ba2c2a6a11 100644
--- a/src/nvim/event/process.h
+++ b/src/nvim/event/process.h
@@ -19,17 +19,17 @@ struct process {
Loop *loop;
void *data;
int pid, status, refcount;
- // set to the hrtime of when process_stop was called for the process.
- uint64_t stopped_time;
- char *cwd;
+ uint64_t stopped_time; // process_stop() timestamp
+ const char *cwd;
char **argv;
- Stream *in, *out, *err;
+ Stream in, out, err;
process_exit_cb cb;
internal_process_cb internal_exit_cb, internal_close_cb;
- bool closed, term_sent, detach;
- Queue *events;
+ bool closed, detach;
+ MultiQueue *events;
};
+
static inline Process process_init(Loop *loop, ProcessType type, void *data)
{
return (Process) {
@@ -38,23 +38,27 @@ static inline Process process_init(Loop *loop, ProcessType type, void *data)
.loop = loop,
.events = NULL,
.pid = 0,
- .status = 0,
+ .status = -1,
.refcount = 0,
.stopped_time = 0,
.cwd = NULL,
.argv = NULL,
- .in = NULL,
- .out = NULL,
- .err = NULL,
+ .in = { .closed = false },
+ .out = { .closed = false },
+ .err = { .closed = false },
.cb = NULL,
.closed = false,
- .term_sent = false,
.internal_close_cb = NULL,
.internal_exit_cb = NULL,
.detach = false
};
}
+static inline bool process_is_stopped(Process *proc)
+{
+ return proc->stopped_time != 0;
+}
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "event/process.h.generated.h"
#endif
diff --git a/src/nvim/event/queue.c b/src/nvim/event/queue.c
deleted file mode 100644
index c5ef22d426..0000000000
--- a/src/nvim/event/queue.c
+++ /dev/null
@@ -1,208 +0,0 @@
-// Queue for selective async event processing. Instances of this queue support a
-// parent/child relationship with the following properties:
-//
-// - pushing a node to a child queue will push a corresponding link node to the
-// parent queue
-// - removing a link node from a parent queue will remove the next node
-// in the linked child queue
-// - removing a node from a child queue will remove the corresponding link node
-// in the parent queue
-//
-// These properties allow neovim to organize and process events from different
-// sources with a certain degree of control. Here's how the queue is used:
-//
-// +----------------+
-// | Main loop |
-// +----------------+
-// ^
-// |
-// +----------------+
-// +-------------->| Event loop |<------------+
-// | +--+-------------+ |
-// | ^ ^ |
-// | | | |
-// +-----------+ +-----------+ +---------+ +---------+
-// | Channel 1 | | Channel 2 | | Job 1 | | Job 2 |
-// +-----------+ +-----------+ +---------+ +---------+
-//
-//
-// In the above diagram, the lower boxes represents event emitters, each with
-// it's own private queue that have the event loop queue as the parent.
-//
-// When idle, the main loop spins the event loop which queues events from many
-// sources(channels, jobs, user...). Each event emitter pushes events to its own
-// private queue which is propagated to the event loop queue. When the main loop
-// consumes an event, the corresponding event is removed from the emitter's
-// queue.
-//
-// The main reason for this queue hierarchy is to allow focusing on a single
-// event emitter while blocking the main loop. For example, if the `jobwait`
-// vimscript function is called on job1, the main loop will temporarily stop
-// polling the event loop queue and poll job1 queue instead. Same with channels,
-// when calling `rpcrequest`, we want to temporarily stop processing events from
-// other sources and focus on a specific channel.
-
-#include <assert.h>
-#include <stdarg.h>
-#include <stdbool.h>
-#include <stdint.h>
-
-
-#include <uv.h>
-
-#include "nvim/event/queue.h"
-#include "nvim/memory.h"
-#include "nvim/os/time.h"
-
-typedef struct queue_item QueueItem;
-struct queue_item {
- union {
- Queue *queue;
- struct {
- Event event;
- QueueItem *parent;
- } item;
- } data;
- bool link; // this is just a link to a node in a child queue
- QUEUE node;
-};
-
-struct queue {
- Queue *parent;
- QUEUE headtail;
- put_callback put_cb;
- void *data;
-};
-
-#ifdef INCLUDE_GENERATED_DECLARATIONS
-# include "event/queue.c.generated.h"
-#endif
-
-static Event NILEVENT = {.handler = NULL, .argv = {NULL}};
-
-Queue *queue_new_parent(put_callback put_cb, void *data)
-{
- return queue_new(NULL, put_cb, data);
-}
-
-Queue *queue_new_child(Queue *parent)
- FUNC_ATTR_NONNULL_ALL
-{
- assert(!parent->parent);
- return queue_new(parent, NULL, NULL);
-}
-
-static Queue *queue_new(Queue *parent, put_callback put_cb, void *data)
-{
- Queue *rv = xmalloc(sizeof(Queue));
- QUEUE_INIT(&rv->headtail);
- rv->parent = parent;
- rv->put_cb = put_cb;
- rv->data = data;
- return rv;
-}
-
-void queue_free(Queue *queue)
-{
- assert(queue);
- while (!QUEUE_EMPTY(&queue->headtail)) {
- QUEUE *q = QUEUE_HEAD(&queue->headtail);
- QueueItem *item = queue_node_data(q);
- if (queue->parent) {
- QUEUE_REMOVE(&item->data.item.parent->node);
- xfree(item->data.item.parent);
- }
- QUEUE_REMOVE(q);
- xfree(item);
- }
-
- xfree(queue);
-}
-
-Event queue_get(Queue *queue)
-{
- return queue_empty(queue) ? NILEVENT : queue_remove(queue);
-}
-
-void queue_put_event(Queue *queue, Event event)
-{
- assert(queue);
- queue_push(queue, event);
- if (queue->parent && queue->parent->put_cb) {
- queue->parent->put_cb(queue->parent, queue->parent->data);
- }
-}
-
-void queue_process_events(Queue *queue)
-{
- assert(queue);
- while (!queue_empty(queue)) {
- Event event = queue_get(queue);
- if (event.handler) {
- event.handler(event.argv);
- }
- }
-}
-
-bool queue_empty(Queue *queue)
-{
- assert(queue);
- return QUEUE_EMPTY(&queue->headtail);
-}
-
-void queue_replace_parent(Queue *queue, Queue *new_parent)
-{
- assert(queue_empty(queue));
- queue->parent = new_parent;
-}
-
-static Event queue_remove(Queue *queue)
-{
- assert(!queue_empty(queue));
- QUEUE *h = QUEUE_HEAD(&queue->headtail);
- QUEUE_REMOVE(h);
- QueueItem *item = queue_node_data(h);
- Event rv;
-
- if (item->link) {
- assert(!queue->parent);
- // remove the next node in the linked queue
- Queue *linked = item->data.queue;
- assert(!queue_empty(linked));
- QueueItem *child =
- queue_node_data(QUEUE_HEAD(&linked->headtail));
- QUEUE_REMOVE(&child->node);
- rv = child->data.item.event;
- xfree(child);
- } else {
- if (queue->parent) {
- // remove the corresponding link node in the parent queue
- QUEUE_REMOVE(&item->data.item.parent->node);
- xfree(item->data.item.parent);
- }
- rv = item->data.item.event;
- }
-
- xfree(item);
- return rv;
-}
-
-static void queue_push(Queue *queue, Event event)
-{
- QueueItem *item = xmalloc(sizeof(QueueItem));
- item->link = false;
- item->data.item.event = event;
- QUEUE_INSERT_TAIL(&queue->headtail, &item->node);
- if (queue->parent) {
- // push link node to the parent queue
- item->data.item.parent = xmalloc(sizeof(QueueItem));
- item->data.item.parent->link = true;
- item->data.item.parent->data.queue = queue;
- QUEUE_INSERT_TAIL(&queue->parent->headtail, &item->data.item.parent->node);
- }
-}
-
-static QueueItem *queue_node_data(QUEUE *q)
-{
- return QUEUE_DATA(q, QueueItem, node);
-}
diff --git a/src/nvim/event/queue.h b/src/nvim/event/queue.h
deleted file mode 100644
index 85fc59f8b2..0000000000
--- a/src/nvim/event/queue.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef NVIM_EVENT_QUEUE_H
-#define NVIM_EVENT_QUEUE_H
-
-#include <uv.h>
-
-#include "nvim/event/defs.h"
-#include "nvim/lib/queue.h"
-
-typedef struct queue Queue;
-typedef void (*put_callback)(Queue *queue, void *data);
-
-#define queue_put(q, h, ...) \
- queue_put_event(q, event_create(1, h, __VA_ARGS__));
-
-
-#ifdef INCLUDE_GENERATED_DECLARATIONS
-# include "event/queue.h.generated.h"
-#endif
-#endif // NVIM_EVENT_QUEUE_H
diff --git a/src/nvim/event/rstream.c b/src/nvim/event/rstream.c
index a520143064..6812b342bf 100644
--- a/src/nvim/event/rstream.c
+++ b/src/nvim/event/rstream.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <stdint.h>
#include <stdbool.h>
@@ -17,21 +20,19 @@
# include "event/rstream.c.generated.h"
#endif
-void rstream_init_fd(Loop *loop, Stream *stream, int fd, size_t bufsize,
- void *data)
+void rstream_init_fd(Loop *loop, Stream *stream, int fd, size_t bufsize)
FUNC_ATTR_NONNULL_ARG(1)
FUNC_ATTR_NONNULL_ARG(2)
{
- stream_init(loop, stream, fd, NULL, data);
+ stream_init(loop, stream, fd, NULL);
rstream_init(stream, bufsize);
}
-void rstream_init_stream(Stream *stream, uv_stream_t *uvstream, size_t bufsize,
- void *data)
+void rstream_init_stream(Stream *stream, uv_stream_t *uvstream, size_t bufsize)
FUNC_ATTR_NONNULL_ARG(1)
FUNC_ATTR_NONNULL_ARG(2)
{
- stream_init(NULL, stream, -1, uvstream, data);
+ stream_init(NULL, stream, -1, uvstream);
rstream_init(stream, bufsize);
}
@@ -48,10 +49,11 @@ void rstream_init(Stream *stream, size_t bufsize)
/// Starts watching for events from a `Stream` instance.
///
/// @param stream The `Stream` instance
-void rstream_start(Stream *stream, stream_read_cb cb)
+void rstream_start(Stream *stream, stream_read_cb cb, void *data)
FUNC_ATTR_NONNULL_ARG(1)
{
stream->read_cb = cb;
+ stream->cb_data = data;
if (stream->uvstream) {
uv_read_start(stream->uvstream, alloc_cb, read_cb);
} else {
@@ -81,7 +83,7 @@ static void on_rbuffer_nonfull(RBuffer *buf, void *data)
{
Stream *stream = data;
assert(stream->read_cb);
- rstream_start(stream, stream->read_cb);
+ rstream_start(stream, stream->read_cb, stream->cb_data);
}
// Callbacks used by libuv
@@ -90,7 +92,10 @@ static void on_rbuffer_nonfull(RBuffer *buf, void *data)
static void alloc_cb(uv_handle_t *handle, size_t suggested, uv_buf_t *buf)
{
Stream *stream = handle->data;
- buf->base = rbuffer_write_ptr(stream->buffer, &buf->len);
+ // `uv_buf_t.len` happens to have different size on Windows.
+ size_t write_count;
+ buf->base = rbuffer_write_ptr(stream->buffer, &write_count);
+ buf->len = UV_BUF_LEN(write_count);
}
// Callback invoked by libuv after it copies the data into the buffer provided
@@ -100,21 +105,21 @@ static void read_cb(uv_stream_t *uvstream, ssize_t cnt, const uv_buf_t *buf)
{
Stream *stream = uvstream->data;
- if (cnt > 0) {
- stream->num_bytes += (size_t)cnt;
- }
-
if (cnt <= 0) {
- if (cnt != UV_ENOBUFS
- // cnt == 0 means libuv asked for a buffer and decided it wasn't needed:
- // http://docs.libuv.org/en/latest/stream.html#c.uv_read_start.
- //
- // We don't need to do anything with the RBuffer because the next call
- // to `alloc_cb` will return the same unused pointer(`rbuffer_produced`
- // won't be called)
- && cnt != 0) {
- DLOG("Closing Stream(%p) because of %s(%zd)", stream,
- uv_strerror((int)cnt), cnt);
+ // cnt == 0 means libuv asked for a buffer and decided it wasn't needed:
+ // http://docs.libuv.org/en/latest/stream.html#c.uv_read_start.
+ //
+ // We don't need to do anything with the RBuffer because the next call
+ // to `alloc_cb` will return the same unused pointer(`rbuffer_produced`
+ // won't be called)
+ if (cnt == UV_ENOBUFS || cnt == 0) {
+ return;
+ } else if (cnt == UV_EOF && uvstream->type == UV_TTY) {
+ // The TTY driver might signal EOF without closing the stream
+ invoke_read_cb(stream, 0, true);
+ } else {
+ DLOG("Closing Stream (%p): %s (%s)", stream,
+ uv_err_name((int)cnt), os_strerror((int)cnt));
// Read error or EOF, either way stop the stream and invoke the callback
// with eof == true
uv_read_stop(uvstream);
@@ -125,6 +130,7 @@ static void read_cb(uv_stream_t *uvstream, ssize_t cnt, const uv_buf_t *buf)
// at this point we're sure that cnt is positive, no error occurred
size_t nread = (size_t)cnt;
+ stream->num_bytes += nread;
// Data was already written, so all we need is to update 'wpos' to reflect
// the space actually used in the buffer.
rbuffer_produced(stream->buffer, nread);
@@ -137,7 +143,10 @@ static void fread_idle_cb(uv_idle_t *handle)
uv_fs_t req;
Stream *stream = handle->data;
- stream->uvbuf.base = rbuffer_write_ptr(stream->buffer, &stream->uvbuf.len);
+ // `uv_buf_t.len` happens to have different size on Windows.
+ size_t write_count;
+ stream->uvbuf.base = rbuffer_write_ptr(stream->buffer, &write_count);
+ stream->uvbuf.len = UV_BUF_LEN(write_count);
// the offset argument to uv_fs_read is int64_t, could someone really try
// to read more than 9 quintillion (9e18) bytes?
@@ -179,7 +188,8 @@ static void read_event(void **argv)
if (stream->read_cb) {
size_t count = (uintptr_t)argv[1];
bool eof = (uintptr_t)argv[2];
- stream->read_cb(stream, stream->buffer, count, stream->data, eof);
+ stream->did_eof = eof;
+ stream->read_cb(stream, stream->buffer, count, stream->cb_data, eof);
}
stream->pending_reqs--;
if (stream->closed && !stream->pending_reqs) {
diff --git a/src/nvim/event/signal.c b/src/nvim/event/signal.c
index 11ce15a882..fec46da4ff 100644
--- a/src/nvim/event/signal.c
+++ b/src/nvim/event/signal.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <uv.h>
#include "nvim/event/loop.h"
diff --git a/src/nvim/event/signal.h b/src/nvim/event/signal.h
index e32608acc0..7fe352edef 100644
--- a/src/nvim/event/signal.h
+++ b/src/nvim/event/signal.h
@@ -14,7 +14,7 @@ struct signal_watcher {
void *data;
signal_cb cb;
signal_close_cb close_cb;
- Queue *events;
+ MultiQueue *events;
};
#ifdef INCLUDE_GENERATED_DECLARATIONS
diff --git a/src/nvim/event/socket.c b/src/nvim/event/socket.c
index cdaf40849b..6fcb9f7e7a 100644
--- a/src/nvim/event/socket.c
+++ b/src/nvim/event/socket.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <stdint.h>
@@ -12,99 +15,123 @@
#include "nvim/vim.h"
#include "nvim/strings.h"
#include "nvim/path.h"
+#include "nvim/main.h"
#include "nvim/memory.h"
+#include "nvim/macros.h"
+#include "nvim/charset.h"
+#include "nvim/log.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "event/socket.c.generated.h"
#endif
-#define NVIM_DEFAULT_TCP_PORT 7450
-
-void socket_watcher_init(Loop *loop, SocketWatcher *watcher,
- const char *endpoint, void *data)
- FUNC_ATTR_NONNULL_ARG(1) FUNC_ATTR_NONNULL_ARG(2) FUNC_ATTR_NONNULL_ARG(3)
+int socket_watcher_init(Loop *loop, SocketWatcher *watcher,
+ const char *endpoint)
+ FUNC_ATTR_NONNULL_ALL
{
- // Trim to `ADDRESS_MAX_SIZE`
- if (xstrlcpy(watcher->addr, endpoint, sizeof(watcher->addr))
- >= sizeof(watcher->addr)) {
- // TODO(aktau): since this is not what the user wanted, perhaps we
- // should return an error here
- WLOG("Address was too long, truncated to %s", watcher->addr);
- }
-
- bool tcp = true;
- char ip[16], *ip_end = xstrchrnul(watcher->addr, ':');
+ xstrlcpy(watcher->addr, endpoint, sizeof(watcher->addr));
+ char *addr = watcher->addr;
+ char *host_end = strrchr(addr, ':');
- // (ip_end - addr) is always > 0, so convert to size_t
- size_t addr_len = (size_t)(ip_end - watcher->addr);
+ if (host_end && addr != host_end) {
+ // Split user specified address into two strings, addr(hostname) and port.
+ // The port part in watcher->addr will be updated later.
+ *host_end = '\0';
+ char *port = host_end + 1;
+ intmax_t iport;
- if (addr_len > sizeof(ip) - 1) {
- // Maximum length of an IPv4 address buffer is 15 (eg: 255.255.255.255)
- addr_len = sizeof(ip) - 1;
- }
+ int ret = getdigits_safe(&(char_u *){ (char_u *)port }, &iport);
+ if (ret == FAIL || iport < 0 || iport > UINT16_MAX) {
+ ELOG("Invalid port: %s", port);
+ return UV_EINVAL;
+ }
- // Extract the address part
- xstrlcpy(ip, watcher->addr, addr_len + 1);
- int port = NVIM_DEFAULT_TCP_PORT;
-
- if (*ip_end == ':') {
- // Extract the port
- long lport = strtol(ip_end + 1, NULL, 10); // NOLINT
- if (lport <= 0 || lport > 0xffff) {
- // Invalid port, treat as named pipe or unix socket
- tcp = false;
- } else {
- port = (int) lport;
+ if (*port == NUL) {
+ // When no port is given, (uv_)getaddrinfo expects NULL otherwise the
+ // implementation may attempt to lookup the service by name (and fail)
+ port = NULL;
}
- }
- if (tcp) {
- // Try to parse ip address
- if (uv_ip4_addr(ip, port, &watcher->uv.tcp.addr)) {
- // Invalid address, treat as named pipe or unix socket
- tcp = false;
+ uv_getaddrinfo_t request;
+
+ int retval = uv_getaddrinfo(&loop->uv, &request, NULL, addr, port,
+ &(struct addrinfo){
+ .ai_family = AF_UNSPEC,
+ .ai_socktype = SOCK_STREAM,
+ });
+ if (retval != 0) {
+ ELOG("Host lookup failed: %s", endpoint);
+ return retval;
}
- }
+ watcher->uv.tcp.addrinfo = request.addrinfo;
- if (tcp) {
uv_tcp_init(&loop->uv, &watcher->uv.tcp.handle);
- watcher->stream = (uv_stream_t *)&watcher->uv.tcp.handle;
+ uv_tcp_nodelay(&watcher->uv.tcp.handle, true);
+ watcher->stream = STRUCT_CAST(uv_stream_t, &watcher->uv.tcp.handle);
} else {
uv_pipe_init(&loop->uv, &watcher->uv.pipe.handle, 0);
- watcher->stream = (uv_stream_t *)&watcher->uv.pipe.handle;
+ watcher->stream = STRUCT_CAST(uv_stream_t, &watcher->uv.pipe.handle);
}
watcher->stream->data = watcher;
watcher->cb = NULL;
watcher->close_cb = NULL;
watcher->events = NULL;
+ watcher->data = NULL;
+
+ return 0;
}
int socket_watcher_start(SocketWatcher *watcher, int backlog, socket_cb cb)
FUNC_ATTR_NONNULL_ALL
{
watcher->cb = cb;
- int result;
+ int result = UV_EINVAL;
if (watcher->stream->type == UV_TCP) {
- result = uv_tcp_bind(&watcher->uv.tcp.handle,
- (const struct sockaddr *)&watcher->uv.tcp.addr, 0);
+ struct addrinfo *ai = watcher->uv.tcp.addrinfo;
+
+ for (; ai; ai = ai->ai_next) {
+ result = uv_tcp_bind(&watcher->uv.tcp.handle, ai->ai_addr, 0);
+ if (result != 0) {
+ continue;
+ }
+ result = uv_listen(watcher->stream, backlog, connection_cb);
+ if (result == 0) {
+ struct sockaddr_storage sas;
+
+ // When the endpoint in socket_watcher_init() didn't specify a port
+ // number, a free random port number will be assigned. sin_port will
+ // contain 0 in this case, unless uv_tcp_getsockname() is used first.
+ uv_tcp_getsockname(&watcher->uv.tcp.handle, (struct sockaddr *)&sas,
+ &(int){ sizeof(sas) });
+ uint16_t port = (uint16_t)(
+ (sas.ss_family == AF_INET)
+ ? (STRUCT_CAST(struct sockaddr_in, &sas))->sin_port
+ : (STRUCT_CAST(struct sockaddr_in6, &sas))->sin6_port);
+ // v:servername uses the string from watcher->addr
+ size_t len = strlen(watcher->addr);
+ snprintf(watcher->addr+len, sizeof(watcher->addr)-len, ":%" PRIu16,
+ ntohs(port));
+ break;
+ }
+ }
+ uv_freeaddrinfo(watcher->uv.tcp.addrinfo);
} else {
result = uv_pipe_bind(&watcher->uv.pipe.handle, watcher->addr);
- }
-
- if (result == 0) {
- result = uv_listen(watcher->stream, backlog, connection_cb);
+ if (result == 0) {
+ result = uv_listen(watcher->stream, backlog, connection_cb);
+ }
}
assert(result <= 0); // libuv should return negative error code or zero.
if (result < 0) {
- if (result == -EACCES) {
+ if (result == UV_EACCES) {
// Libuv converts ENOENT to EACCES for Windows compatibility, but if
// the parent directory does not exist, ENOENT would be more accurate.
*path_tail((char_u *)watcher->addr) = NUL;
if (!os_path_exists((char_u *)watcher->addr)) {
- result = -ENOENT;
+ result = UV_ENOENT;
}
}
return result;
@@ -113,16 +140,17 @@ int socket_watcher_start(SocketWatcher *watcher, int backlog, socket_cb cb)
return 0;
}
-int socket_watcher_accept(SocketWatcher *watcher, Stream *stream, void *data)
+int socket_watcher_accept(SocketWatcher *watcher, Stream *stream)
FUNC_ATTR_NONNULL_ARG(1) FUNC_ATTR_NONNULL_ARG(2)
{
uv_stream_t *client;
if (watcher->stream->type == UV_TCP) {
- client = (uv_stream_t *)&stream->uv.tcp;
+ client = STRUCT_CAST(uv_stream_t, &stream->uv.tcp);
uv_tcp_init(watcher->uv.tcp.handle.loop, (uv_tcp_t *)client);
+ uv_tcp_nodelay((uv_tcp_t *)client, true);
} else {
- client = (uv_stream_t *)&stream->uv.pipe;
+ client = STRUCT_CAST(uv_stream_t, &stream->uv.pipe);
uv_pipe_init(watcher->uv.pipe.handle.loop, (uv_pipe_t *)client, 0);
}
@@ -133,7 +161,7 @@ int socket_watcher_accept(SocketWatcher *watcher, Stream *stream, void *data)
return result;
}
- stream_init(NULL, stream, -1, client, data);
+ stream_init(NULL, stream, -1, client);
return 0;
}
@@ -165,3 +193,77 @@ static void close_cb(uv_handle_t *handle)
watcher->close_cb(watcher, watcher->data);
}
}
+
+static void connect_cb(uv_connect_t *req, int status)
+{
+ int *ret_status = req->data;
+ *ret_status = status;
+ if (status != 0) {
+ uv_close((uv_handle_t *)req->handle, NULL);
+ }
+}
+
+bool socket_connect(Loop *loop, Stream *stream,
+ bool is_tcp, const char *address,
+ int timeout, const char **error)
+{
+ bool success = false;
+ int status;
+ uv_connect_t req;
+ req.data = &status;
+ uv_stream_t *uv_stream;
+
+ uv_tcp_t *tcp = &stream->uv.tcp;
+ uv_getaddrinfo_t addr_req;
+ addr_req.addrinfo = NULL;
+ const struct addrinfo *addrinfo = NULL;
+ char *addr = NULL;
+ if (is_tcp) {
+ addr = xstrdup(address);
+ char *host_end = strrchr(addr, ':');
+ if (!host_end) {
+ *error = _("tcp address must be host:port");
+ goto cleanup;
+ }
+ *host_end = NUL;
+
+ const struct addrinfo hints = { .ai_family = AF_UNSPEC,
+ .ai_socktype = SOCK_STREAM,
+ .ai_flags = AI_NUMERICSERV };
+ int retval = uv_getaddrinfo(&loop->uv, &addr_req, NULL,
+ addr, host_end+1, &hints);
+ if (retval != 0) {
+ *error = _("failed to lookup host or port");
+ goto cleanup;
+ }
+ addrinfo = addr_req.addrinfo;
+
+tcp_retry:
+ uv_tcp_init(&loop->uv, tcp);
+ uv_tcp_nodelay(tcp, true);
+ uv_tcp_connect(&req, tcp, addrinfo->ai_addr, connect_cb);
+ uv_stream = (uv_stream_t *)tcp;
+
+ } else {
+ uv_pipe_t *pipe = &stream->uv.pipe;
+ uv_pipe_init(&loop->uv, pipe, 0);
+ uv_pipe_connect(&req, pipe, address, connect_cb);
+ uv_stream = STRUCT_CAST(uv_stream_t, pipe);
+ }
+ status = 1;
+ LOOP_PROCESS_EVENTS_UNTIL(&main_loop, NULL, timeout, status != 1);
+ if (status == 0) { // -V547
+ stream_init(NULL, stream, -1, uv_stream);
+ success = true;
+ } else if (is_tcp && addrinfo->ai_next) {
+ addrinfo = addrinfo->ai_next;
+ goto tcp_retry;
+ } else {
+ *error = _("connection refused");
+ }
+
+cleanup:
+ xfree(addr);
+ uv_freeaddrinfo(addr_req.addrinfo);
+ return success;
+}
diff --git a/src/nvim/event/socket.h b/src/nvim/event/socket.h
index ad59fdbe3a..d30ae45502 100644
--- a/src/nvim/event/socket.h
+++ b/src/nvim/event/socket.h
@@ -20,7 +20,7 @@ struct socket_watcher {
union {
struct {
uv_tcp_t handle;
- struct sockaddr_in addr;
+ struct addrinfo *addrinfo;
} tcp;
struct {
uv_pipe_t handle;
@@ -30,7 +30,7 @@ struct socket_watcher {
void *data;
socket_cb cb;
socket_close_cb close_cb;
- Queue *events;
+ MultiQueue *events;
};
#ifdef INCLUDE_GENERATED_DECLARATIONS
diff --git a/src/nvim/event/stream.c b/src/nvim/event/stream.c
index 33404158cf..ba25b76ec7 100644
--- a/src/nvim/event/stream.c
+++ b/src/nvim/event/stream.c
@@ -1,10 +1,15 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <stdio.h>
#include <stdbool.h>
#include <uv.h>
+#include "nvim/log.h"
#include "nvim/rbuffer.h"
+#include "nvim/macros.h"
#include "nvim/event/stream.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
@@ -23,15 +28,15 @@ int stream_set_blocking(int fd, bool blocking)
uv_loop_init(&loop);
uv_pipe_init(&loop, &stream, 0);
uv_pipe_open(&stream, fd);
- int retval = uv_stream_set_blocking((uv_stream_t *)&stream, blocking);
- uv_close((uv_handle_t *)&stream, NULL);
+ int retval = uv_stream_set_blocking(STRUCT_CAST(uv_stream_t, &stream),
+ blocking);
+ uv_close(STRUCT_CAST(uv_handle_t, &stream), NULL);
uv_run(&loop, UV_RUN_NOWAIT); // not necessary, but couldn't hurt.
uv_loop_close(&loop);
return retval;
}
-void stream_init(Loop *loop, Stream *stream, int fd, uv_stream_t *uvstream,
- void *data)
+void stream_init(Loop *loop, Stream *stream, int fd, uv_stream_t *uvstream)
FUNC_ATTR_NONNULL_ARG(2)
{
stream->uvstream = uvstream;
@@ -50,7 +55,7 @@ void stream_init(Loop *loop, Stream *stream, int fd, uv_stream_t *uvstream,
assert(type == UV_NAMED_PIPE || type == UV_TTY);
uv_pipe_init(&loop->uv, &stream->uv.pipe, 0);
uv_pipe_open(&stream->uv.pipe, fd);
- stream->uvstream = (uv_stream_t *)&stream->uv.pipe;
+ stream->uvstream = STRUCT_CAST(uv_stream_t, &stream->uv.pipe);
}
}
@@ -58,7 +63,6 @@ void stream_init(Loop *loop, Stream *stream, int fd, uv_stream_t *uvstream,
stream->uvstream->data = stream;
}
- stream->data = data;
stream->internal_data = NULL;
stream->fpos = 0;
stream->curmem = 0;
@@ -74,18 +78,27 @@ void stream_init(Loop *loop, Stream *stream, int fd, uv_stream_t *uvstream,
stream->num_bytes = 0;
}
-void stream_close(Stream *stream, stream_close_cb on_stream_close)
+void stream_close(Stream *stream, stream_close_cb on_stream_close, void *data)
FUNC_ATTR_NONNULL_ARG(1)
{
assert(!stream->closed);
+ DLOG("closing Stream: %p", stream);
stream->closed = true;
stream->close_cb = on_stream_close;
+ stream->close_cb_data = data;
if (!stream->pending_reqs) {
stream_close_handle(stream);
}
}
+void stream_may_close(Stream *stream)
+{
+ if (!stream->closed) {
+ stream_close(stream, NULL, NULL);
+ }
+}
+
void stream_close_handle(Stream *stream)
FUNC_ATTR_NONNULL_ALL
{
@@ -103,7 +116,7 @@ static void close_cb(uv_handle_t *handle)
rbuffer_free(stream->buffer);
}
if (stream->close_cb) {
- stream->close_cb(stream, stream->data);
+ stream->close_cb(stream, stream->close_cb_data);
}
if (stream->internal_close_cb) {
stream->internal_close_cb(stream, stream->internal_data);
diff --git a/src/nvim/event/stream.h b/src/nvim/event/stream.h
index ad4e24775b..e713323f5c 100644
--- a/src/nvim/event/stream.h
+++ b/src/nvim/event/stream.h
@@ -14,10 +14,7 @@ typedef struct stream Stream;
///
/// @param stream The Stream instance
/// @param rbuffer The associated RBuffer instance
-/// @param count Number of bytes to read. This must be respected if keeping
-/// the order of events is a requirement. This is because events
-/// may be queued and only processed later when more data is copied
-/// into to the buffer, so one read may starve another.
+/// @param count Number of bytes that was read.
/// @param data User-defined data
/// @param eof If the stream reached EOF.
typedef void (*stream_read_cb)(Stream *stream, RBuffer *buf, size_t count,
@@ -33,6 +30,8 @@ typedef void (*stream_write_cb)(Stream *stream, void *data, int status);
typedef void (*stream_close_cb)(Stream *stream, void *data);
struct stream {
+ bool closed;
+ bool did_eof;
union {
uv_pipe_t pipe;
uv_tcp_t tcp;
@@ -44,15 +43,15 @@ struct stream {
uv_file fd;
stream_read_cb read_cb;
stream_write_cb write_cb;
+ void *cb_data;
stream_close_cb close_cb, internal_close_cb;
+ void *close_cb_data, *internal_data;
size_t fpos;
size_t curmem;
size_t maxmem;
size_t pending_reqs;
size_t num_bytes;
- void *data, *internal_data;
- bool closed;
- Queue *events;
+ MultiQueue *events;
};
#ifdef INCLUDE_GENERATED_DECLARATIONS
diff --git a/src/nvim/event/time.c b/src/nvim/event/time.c
index f68a66345f..b7e30e392b 100644
--- a/src/nvim/event/time.c
+++ b/src/nvim/event/time.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <stdint.h>
#include <uv.h>
@@ -51,17 +54,24 @@ static void time_watcher_cb(uv_timer_t *handle)
FUNC_ATTR_NONNULL_ALL
{
TimeWatcher *watcher = handle->data;
- if (watcher->blockable && !queue_empty(watcher->events)) {
+ if (watcher->blockable && !multiqueue_empty(watcher->events)) {
// the timer blocked and there already is an unprocessed event waiting
return;
}
CREATE_EVENT(watcher->events, time_event, 1, watcher);
}
+static void close_event(void **argv)
+{
+ TimeWatcher *watcher = argv[0];
+ watcher->close_cb(watcher, watcher->data);
+}
+
static void close_cb(uv_handle_t *handle)
+ FUNC_ATTR_NONNULL_ALL
{
TimeWatcher *watcher = handle->data;
if (watcher->close_cb) {
- watcher->close_cb(watcher, watcher->data);
+ CREATE_EVENT(watcher->events, close_event, 1, watcher);
}
}
diff --git a/src/nvim/event/time.h b/src/nvim/event/time.h
index 14df176ea3..a6de89ad6e 100644
--- a/src/nvim/event/time.h
+++ b/src/nvim/event/time.h
@@ -12,7 +12,7 @@ struct time_watcher {
uv_timer_t uv;
void *data;
time_cb cb, close_cb;
- Queue *events;
+ MultiQueue *events;
bool blockable;
};
diff --git a/src/nvim/event/wstream.c b/src/nvim/event/wstream.c
index 8028e35e6b..2baa667e7d 100644
--- a/src/nvim/event/wstream.c
+++ b/src/nvim/event/wstream.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <stdint.h>
#include <stdbool.h>
@@ -5,12 +8,13 @@
#include <uv.h>
+#include "nvim/log.h"
#include "nvim/event/loop.h"
#include "nvim/event/wstream.h"
#include "nvim/vim.h"
#include "nvim/memory.h"
-#define DEFAULT_MAXMEM 1024 * 1024 * 10
+#define DEFAULT_MAXMEM 1024 * 1024 * 2000
typedef struct {
Stream *stream;
@@ -22,19 +26,17 @@ typedef struct {
# include "event/wstream.c.generated.h"
#endif
-void wstream_init_fd(Loop *loop, Stream *stream, int fd, size_t maxmem,
- void *data)
+void wstream_init_fd(Loop *loop, Stream *stream, int fd, size_t maxmem)
FUNC_ATTR_NONNULL_ARG(1) FUNC_ATTR_NONNULL_ARG(2)
{
- stream_init(loop, stream, fd, NULL, data);
+ stream_init(loop, stream, fd, NULL);
wstream_init(stream, maxmem);
}
-void wstream_init_stream(Stream *stream, uv_stream_t *uvstream, size_t maxmem,
- void *data)
+void wstream_init_stream(Stream *stream, uv_stream_t *uvstream, size_t maxmem)
FUNC_ATTR_NONNULL_ARG(1) FUNC_ATTR_NONNULL_ARG(2)
{
- stream_init(NULL, stream, -1, uvstream, data);
+ stream_init(NULL, stream, -1, uvstream);
wstream_init(stream, maxmem);
}
@@ -54,10 +56,11 @@ void wstream_init(Stream *stream, size_t maxmem)
///
/// @param stream The `Stream` instance
/// @param cb The callback
-void wstream_set_write_cb(Stream *stream, stream_write_cb cb)
- FUNC_ATTR_NONNULL_ALL
+void wstream_set_write_cb(Stream *stream, stream_write_cb cb, void *data)
+ FUNC_ATTR_NONNULL_ARG(1, 2)
{
stream->write_cb = cb;
+ stream->cb_data = data;
}
/// Queues data for writing to the backing file descriptor of a `Stream`
@@ -87,7 +90,7 @@ bool wstream_write(Stream *stream, WBuffer *buffer)
uv_buf_t uvbuf;
uvbuf.base = buffer->data;
- uvbuf.len = buffer->size;
+ uvbuf.len = UV_BUF_LEN(buffer->size);
if (uv_write(&data->uv_req, stream->uvstream, &uvbuf, 1, write_cb)) {
xfree(data);
@@ -138,7 +141,7 @@ static void write_cb(uv_write_t *req, int status)
wstream_release_wbuffer(data->buffer);
if (data->stream->write_cb) {
- data->stream->write_cb(data->stream, data->stream->data, status);
+ data->stream->write_cb(data->stream, data->stream->cb_data, status);
}
data->stream->pending_reqs--;
diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c
index da64533708..85844c37bd 100644
--- a/src/nvim/ex_cmds.c
+++ b/src/nvim/ex_cmds.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* ex_cmds.c: some functions for command line commands
*/
@@ -8,7 +11,11 @@
#include <string.h>
#include <stdlib.h>
#include <inttypes.h>
+#include <math.h>
+#include "nvim/api/private/defs.h"
+#include "nvim/api/buffer.h"
+#include "nvim/log.h"
#include "nvim/vim.h"
#include "nvim/ascii.h"
#include "nvim/ex_cmds.h"
@@ -27,7 +34,9 @@
#include "nvim/fileio.h"
#include "nvim/fold.h"
#include "nvim/getchar.h"
+#include "nvim/highlight.h"
#include "nvim/indent.h"
+#include "nvim/buffer_updates.h"
#include "nvim/main.h"
#include "nvim/mark.h"
#include "nvim/mbyte.h"
@@ -64,87 +73,151 @@
*/
typedef struct sign sign_T;
+/// Case matching style to use for :substitute
+typedef enum {
+ kSubHonorOptions = 0, ///< Honor the user's 'ignorecase'/'smartcase' options
+ kSubIgnoreCase, ///< Ignore case of the search
+ kSubMatchCase, ///< Match case of the search
+} SubIgnoreType;
+
+/// Flags kept between calls to :substitute.
+typedef struct {
+ bool do_all; ///< do multiple substitutions per line
+ bool do_ask; ///< ask for confirmation
+ bool do_count; ///< count only
+ bool do_error; ///< if false, ignore errors
+ bool do_print; ///< print last line with subs
+ bool do_list; ///< list last line with subs
+ bool do_number; ///< list last line with line nr
+ SubIgnoreType do_ic; ///< ignore case flag
+} subflags_T;
+
+/// Partial result of a substitution during :substitute.
+/// Numbers refer to the buffer _after_ substitution
+typedef struct {
+ lpos_T start; // start of the match
+ lpos_T end; // end of the match
+ linenr_T pre_match; // where to begin showing lines before the match
+} SubResult;
+
+// Collected results of a substitution for showing them in
+// the preview window
+typedef struct {
+ kvec_t(SubResult) subresults;
+ linenr_T lines_needed; // lines neede in the preview window
+} PreviewLines;
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "ex_cmds.c.generated.h"
#endif
-/*
- * ":ascii" and "ga".
- */
-void do_ascii(exarg_T *eap)
+/// ":ascii" and "ga" implementation
+void do_ascii(const exarg_T *const eap)
{
- int c;
- int cval;
- char buf1[20];
- char buf2[20];
- char_u buf3[7];
+ char_u *dig;
int cc[MAX_MCO];
- int ci = 0;
- int len;
- const bool l_enc_utf8 = enc_utf8;
-
- if (l_enc_utf8)
- c = utfc_ptr2char(get_cursor_pos_ptr(), cc);
- else
- c = gchar_cursor();
+ int c = utfc_ptr2char(get_cursor_pos_ptr(), cc);
if (c == NUL) {
MSG("NUL");
return;
}
- IObuff[0] = NUL;
- if (!has_mbyte || (enc_dbcs != 0 && c < 0x100) || c < 0x80) {
- if (c == NL) /* NUL is stored as NL */
+ size_t iobuff_len = 0;
+
+ int ci = 0;
+ if (c < 0x80) {
+ if (c == NL) { // NUL is stored as NL.
c = NUL;
- if (c == CAR && get_fileformat(curbuf) == EOL_MAC)
- cval = NL; /* NL is stored as CR */
- else
- cval = c;
- if (vim_isprintc_strict(c) && (c < ' '
- || c > '~'
- )) {
+ }
+ const int cval = (c == CAR && get_fileformat(curbuf) == EOL_MAC
+ ? NL // NL is stored as CR.
+ : c);
+ char buf1[20];
+ if (vim_isprintc_strict(c) && (c < ' ' || c > '~')) {
+ char_u buf3[7];
transchar_nonprint(buf3, c);
vim_snprintf(buf1, sizeof(buf1), " <%s>", (char *)buf3);
- } else
+ } else {
buf1[0] = NUL;
- if (c >= 0x80)
- vim_snprintf(buf2, sizeof(buf2), " <M-%s>",
- (char *)transchar(c & 0x7f));
- else
- buf2[0] = NUL;
- vim_snprintf((char *)IObuff, IOSIZE,
- _("<%s>%s%s %d, Hex %02x, Octal %03o"),
- transchar(c), buf1, buf2, cval, cval, cval);
- if (l_enc_utf8)
- c = cc[ci++];
- else
- c = 0;
- }
-
- /* Repeat for combining characters. */
- while (has_mbyte && (c >= 0x100 || (l_enc_utf8 && c >= 0x80))) {
- len = (int)STRLEN(IObuff);
- /* This assumes every multi-byte char is printable... */
- if (len > 0)
- IObuff[len++] = ' ';
- IObuff[len++] = '<';
- if (l_enc_utf8 && utf_iscomposing(c)
-# ifdef USE_GUI
- && !gui.in_use
-# endif
- )
- IObuff[len++] = ' '; /* draw composing char on top of a space */
- len += (*mb_char2bytes)(c, IObuff + len);
- vim_snprintf((char *)IObuff + len, IOSIZE - len,
- c < 0x10000 ? _("> %d, Hex %04x, Octal %o")
- : _("> %d, Hex %08x, Octal %o"), c, c, c);
- if (ci == MAX_MCO)
+ }
+ char buf2[20];
+ buf2[0] = NUL;
+
+ dig = get_digraph_for_char(cval);
+ if (dig != NULL) {
+ iobuff_len += (
+ vim_snprintf((char *)IObuff + iobuff_len,
+ sizeof(IObuff) - iobuff_len,
+ _("<%s>%s%s %d, Hex %02x, Oct %03o, Digr %s"),
+ transchar(c), buf1, buf2, cval, cval, cval, dig));
+ } else {
+ iobuff_len += (
+ vim_snprintf((char *)IObuff + iobuff_len,
+ sizeof(IObuff) - iobuff_len,
+ _("<%s>%s%s %d, Hex %02x, Octal %03o"),
+ transchar(c), buf1, buf2, cval, cval, cval));
+ }
+
+ c = cc[ci++];
+ }
+
+#define SPACE_FOR_DESC (1 + 1 + 1 + MB_MAXBYTES + 16 + 4 + 3 + 3 + 1)
+ // Space for description:
+ // - 1 byte for separator (starting from second entry)
+ // - 1 byte for "<"
+ // - 1 byte for space to draw composing character on (optional, but really
+ // mostly required)
+ // - up to MB_MAXBYTES bytes for character itself
+ // - 16 bytes for raw text ("> , Hex , Octal ").
+ // - at least 4 bytes for hexadecimal representation
+ // - at least 3 bytes for decimal representation
+ // - at least 3 bytes for octal representation
+ // - 1 byte for NUL
+ //
+ // Taking into account MAX_MCO and characters which need 8 bytes for
+ // hexadecimal representation, but not taking translation into account:
+ // resulting string will occupy less then 400 bytes (conservative estimate).
+ //
+ // Less then 1000 bytes if translation multiplies number of bytes needed for
+ // raw text by 6, so it should always fit into 1025 bytes reserved for IObuff.
+
+ // Repeat for combining characters, also handle multiby here.
+ while (c >= 0x80 && iobuff_len < sizeof(IObuff) - SPACE_FOR_DESC) {
+ // This assumes every multi-byte char is printable...
+ if (iobuff_len > 0) {
+ IObuff[iobuff_len++] = ' ';
+ }
+ IObuff[iobuff_len++] = '<';
+ if (utf_iscomposing(c)) {
+ IObuff[iobuff_len++] = ' '; // Draw composing char on top of a space.
+ }
+ iobuff_len += utf_char2bytes(c, IObuff + iobuff_len);
+
+ dig = get_digraph_for_char(c);
+ if (dig != NULL) {
+ iobuff_len += (
+ vim_snprintf((char *)IObuff + iobuff_len,
+ sizeof(IObuff) - iobuff_len,
+ (c < 0x10000
+ ? _("> %d, Hex %04x, Oct %o, Digr %s")
+ : _("> %d, Hex %08x, Oct %o, Digr %s")),
+ c, c, c, dig));
+ } else {
+ iobuff_len += (
+ vim_snprintf((char *)IObuff + iobuff_len,
+ sizeof(IObuff) - iobuff_len,
+ (c < 0x10000
+ ? _("> %d, Hex %04x, Octal %o")
+ : _("> %d, Hex %08x, Octal %o")),
+ c, c, c));
+ }
+ if (ci == MAX_MCO) {
break;
- if (l_enc_utf8)
- c = cc[ci++];
- else
- c = 0;
+ }
+ c = cc[ci++];
+ }
+ if (ci != MAX_MCO && c != 0) {
+ xstrlcpy((char *)IObuff + iobuff_len, " ...", sizeof(IObuff) - iobuff_len);
}
msg(IObuff);
@@ -183,10 +256,12 @@ void ex_align(exarg_T *eap)
*/
if (width <= 0)
width = curbuf->b_p_tw;
- if (width == 0 && curbuf->b_p_wm > 0)
- width = curwin->w_width - curbuf->b_p_wm;
- if (width <= 0)
+ if (width == 0 && curbuf->b_p_wm > 0) {
+ width = curwin->w_grid.Columns - curbuf->b_p_wm;
+ }
+ if (width <= 0) {
width = 80;
+ }
}
if (u_save((linenr_T)(eap->line1 - 1), (linenr_T)(eap->line2 + 1)) == FAIL)
@@ -235,7 +310,7 @@ void ex_align(exarg_T *eap)
new_indent = 0;
(void)set_indent(new_indent, 0); /* set indent */
}
- changed_lines(eap->line1, 0, eap->line2 + 1, 0L);
+ changed_lines(eap->line1, 0, eap->line2 + 1, 0L, true);
curwin->w_cursor = save_curpos;
beginline(BL_WHITE | BL_FIX);
}
@@ -261,9 +336,12 @@ static int linelen(int *has_tab)
;
save = *last;
*last = NUL;
- len = linetabsize(line); /* get line length */
- if (has_tab != NULL) /* check for embedded TAB */
- *has_tab = (vim_strrchr(first, TAB) != NULL);
+ // Get line length.
+ len = linetabsize(line);
+ // Check for embedded TAB.
+ if (has_tab != NULL) {
+ *has_tab = STRRCHR(first, TAB) != NULL;
+ }
*last = save;
return len;
@@ -284,14 +362,12 @@ static int sort_abort; ///< flag to indicate if sorting has been interrupted
/// Struct to store info to be sorted.
typedef struct {
linenr_T lnum; ///< line number
- long start_col_nr; ///< starting column number or number
- long end_col_nr; ///< ending column number
union {
struct {
- long start_col_nr; ///< starting column number
- long end_col_nr; ///< ending column number
+ varnumber_T start_col_nr; ///< starting column number
+ varnumber_T end_col_nr; ///< ending column number
} line;
- long value; ///< value if sorting by integer
+ varnumber_T value; ///< value if sorting by integer
float_T value_flt; ///< value if sorting by float
} st_u;
} sorti_T;
@@ -326,12 +402,12 @@ static int sort_compare(const void *s1, const void *s2)
// We need to copy one line into "sortbuf1", because there is no
// guarantee that the first pointer becomes invalid when obtaining the
// second one.
- STRNCPY(sortbuf1, ml_get(l1.lnum) + l1.st_u.line.start_col_nr,
- l1.st_u.line.end_col_nr - l1.st_u.line.start_col_nr + 1);
- sortbuf1[l1.st_u.line.end_col_nr - l1.st_u.line.start_col_nr] = 0;
- STRNCPY(sortbuf2, ml_get(l2.lnum) + l2.st_u.line.start_col_nr,
- l2.st_u.line.end_col_nr - l2.st_u.line.start_col_nr + 1);
- sortbuf2[l2.st_u.line.end_col_nr - l2.st_u.line.start_col_nr] = 0;
+ memcpy(sortbuf1, ml_get(l1.lnum) + l1.st_u.line.start_col_nr,
+ l1.st_u.line.end_col_nr - l1.st_u.line.start_col_nr + 1);
+ sortbuf1[l1.st_u.line.end_col_nr - l1.st_u.line.start_col_nr] = NUL;
+ memcpy(sortbuf2, ml_get(l2.lnum) + l2.st_u.line.start_col_nr,
+ l2.st_u.line.end_col_nr - l2.st_u.line.start_col_nr + 1);
+ sortbuf2[l2.st_u.line.end_col_nr - l2.st_u.line.start_col_nr] = NUL;
result = sort_ic ? STRICMP(sortbuf1, sortbuf2)
: STRCMP(sortbuf1, sortbuf2);
@@ -377,6 +453,7 @@ void ex_sort(exarg_T *eap)
sort_abort = sort_ic = sort_rx = sort_nr = sort_flt = 0;
size_t format_found = 0;
+ bool change_occurred = false; // Buffer contents changed.
for (p = eap->arg; *p != NUL; ++p) {
if (ascii_iswhite(*p)) {
@@ -537,8 +614,16 @@ void ex_sort(exarg_T *eap)
// Insert the lines in the sorted order below the last one.
lnum = eap->line2;
- for (i = 0; i < count; ++i) {
- s = ml_get(nrs[eap->forceit ? count - i - 1 : i].lnum);
+ for (i = 0; i < count; i++) {
+ const linenr_T get_lnum = nrs[eap->forceit ? count - i - 1 : i].lnum;
+
+ // If the original line number of the line being placed is not the same
+ // as "lnum" (accounting for offset), we know that the buffer changed.
+ if (get_lnum + ((linenr_T)count - 1) != lnum) {
+ change_occurred = true;
+ }
+
+ s = ml_get(get_lnum);
if (!unique || i == 0
|| (sort_ic ? STRICMP(s, sortbuf1) : STRCMP(s, sortbuf1)) != 0) {
// Copy the line into a buffer, it may become invalid in
@@ -565,11 +650,15 @@ void ex_sort(exarg_T *eap)
// Adjust marks for deleted (or added) lines and prepare for displaying.
deleted = (long)(count - (lnum - eap->line2));
if (deleted > 0) {
- mark_adjust(eap->line2 - deleted, eap->line2, (long)MAXLNUM, -deleted);
+ mark_adjust(eap->line2 - deleted, eap->line2, (long)MAXLNUM, -deleted,
+ false);
+ msgmore(-deleted);
} else if (deleted < 0) {
- mark_adjust(eap->line2, MAXLNUM, -deleted, 0L);
+ mark_adjust(eap->line2, MAXLNUM, -deleted, 0L, false);
+ }
+ if (change_occurred || deleted != 0) {
+ changed_lines(eap->line1, 0, eap->line2 + 1, -deleted, true);
}
- changed_lines(eap->line1, 0, eap->line2 + 1, -deleted);
curwin->w_cursor.lnum = eap->line1;
beginline(BL_WHITE | BL_FIX);
@@ -671,11 +760,13 @@ void ex_retab(exarg_T *eap)
memmove(new_line + start_col + len,
ptr + col, (size_t)(old_len - col + 1));
ptr = new_line + start_col;
- for (col = 0; col < len; col++)
+ for (col = 0; col < len; col++) {
ptr[col] = (col < num_tabs) ? '\t' : ' ';
- ml_replace(lnum, new_line, FALSE);
- if (first_line == 0)
+ }
+ ml_replace(lnum, new_line, false);
+ if (first_line == 0) {
first_line = lnum;
+ }
last_line = lnum;
ptr = new_line;
col = start_col + len;
@@ -701,8 +792,9 @@ void ex_retab(exarg_T *eap)
if (curbuf->b_p_ts != new_ts)
redraw_curbuf_later(NOT_VALID);
- if (first_line != 0)
- changed_lines(first_line, 0, last_line + 1, 0L);
+ if (first_line != 0) {
+ changed_lines(first_line, 0, last_line + 1, 0L, true);
+ }
curwin->w_p_list = save_list; /* restore 'list' */
@@ -725,19 +817,24 @@ int do_move(linenr_T line1, linenr_T line2, linenr_T dest)
linenr_T num_lines; // Num lines moved
linenr_T last_line; // Last line in file after adding new text
- // Moving lines seems to corrupt the folds, delete folding info now
- // and recreate it when finished. Don't do this for manual folding, it
- // would delete all folds.
- bool isFolded = hasAnyFolding(curwin) && !foldmethodIsManual(curwin);
- if (isFolded) {
- deleteFoldRecurse(&curwin->w_folds);
- }
-
if (dest >= line1 && dest < line2) {
- EMSG(_("E134: Move lines into themselves"));
+ EMSG(_("E134: Cannot move a range of lines into itself"));
return FAIL;
}
+ // Do nothing if we are not actually moving any lines. This will prevent
+ // the 'modified' flag from being set without cause.
+ if (dest == line1 - 1 || dest == line2) {
+ // Move the cursor as if lines were moved (see below) to be backwards
+ // compatible.
+ if (dest >= line1) {
+ curwin->w_cursor.lnum = dest;
+ } else {
+ curwin->w_cursor.lnum = dest + (line2 - line1) + 1;
+ }
+ return OK;
+ }
+
num_lines = line2 - line1 + 1;
/*
@@ -770,21 +867,36 @@ int do_move(linenr_T line1, linenr_T line2, linenr_T dest)
* their final destination at the new text position -- webb
*/
last_line = curbuf->b_ml.ml_line_count;
- mark_adjust(line1, line2, last_line - line2, 0L);
- changed_lines(last_line - num_lines + 1, 0, last_line + 1, num_lines);
+ mark_adjust_nofold(line1, line2, last_line - line2, 0L, true);
+ changed_lines(last_line - num_lines + 1, 0, last_line + 1, num_lines, false);
if (dest >= line2) {
- mark_adjust(line2 + 1, dest, -num_lines, 0L);
+ mark_adjust_nofold(line2 + 1, dest, -num_lines, 0L, false);
+ FOR_ALL_TAB_WINDOWS(tab, win) {
+ if (win->w_buffer == curbuf) {
+ foldMoveRange(&win->w_folds, line1, line2, dest);
+ }
+ }
curbuf->b_op_start.lnum = dest - num_lines + 1;
curbuf->b_op_end.lnum = dest;
} else {
- mark_adjust(dest + 1, line1 - 1, num_lines, 0L);
+ mark_adjust_nofold(dest + 1, line1 - 1, num_lines, 0L, false);
+ FOR_ALL_TAB_WINDOWS(tab, win) {
+ if (win->w_buffer == curbuf) {
+ foldMoveRange(&win->w_folds, dest + 1, line1 - 1, line2);
+ }
+ }
curbuf->b_op_start.lnum = dest + 1;
curbuf->b_op_end.lnum = dest + num_lines;
}
curbuf->b_op_start.col = curbuf->b_op_end.col = 0;
- mark_adjust(last_line - num_lines + 1, last_line,
- -(last_line - dest - extra), 0L);
- changed_lines(last_line - num_lines + 1, 0, last_line + 1, -extra);
+ mark_adjust_nofold(last_line - num_lines + 1, last_line,
+ -(last_line - dest - extra), 0L, true);
+ changed_lines(last_line - num_lines + 1, 0, last_line + 1, -extra, false);
+
+ // send update regarding the new lines that were added
+ if (kv_size(curbuf->update_channels)) {
+ buf_updates_send_changes(curbuf, dest + 1, num_lines, 0, true);
+ }
/*
* Now we delete the original text -- webb
@@ -815,14 +927,14 @@ int do_move(linenr_T line1, linenr_T line2, linenr_T dest)
last_line = curbuf->b_ml.ml_line_count;
if (dest > last_line + 1)
dest = last_line + 1;
- changed_lines(line1, 0, dest, 0L);
+ changed_lines(line1, 0, dest, 0L, false);
} else {
- changed_lines(dest + 1, 0, line1 + num_lines, 0L);
+ changed_lines(dest + 1, 0, line1 + num_lines, 0L, false);
}
- // recreate folds
- if (isFolded) {
- foldUpdateAll(curwin);
+ // send nvim_buf_lines_event regarding lines that were deleted
+ if (kv_size(curbuf->update_channels)) {
+ buf_updates_send_changes(curbuf, line1 + extra, 0, num_lines, true);
}
return OK;
@@ -982,8 +1094,8 @@ void do_bang(int addr_count, exarg_T *eap, int forceit, int do_in, int do_out)
AppendToRedobuffLit(cmd, -1);
xfree(cmd);
- AppendToRedobuff((char_u *)"\n");
- bangredo = FALSE;
+ AppendToRedobuff("\n");
+ bangredo = false;
}
/*
* Add quotes around the command, for shells that need them.
@@ -1100,11 +1212,12 @@ static void do_filter(
*/
++no_wait_return; /* don't call wait_return() while busy */
if (itmp != NULL && buf_write(curbuf, itmp, NULL, line1, line2, eap,
- FALSE, FALSE, FALSE, TRUE) == FAIL) {
- msg_putchar('\n'); /* keep message from buf_write() */
- --no_wait_return;
- if (!aborting())
- (void)EMSG2(_(e_notcreate), itmp); /* will call wait_return */
+ false, false, false, true) == FAIL) {
+ msg_putchar('\n'); // Keep message from buf_write().
+ no_wait_return--;
+ if (!aborting()) {
+ EMSG2(_("E482: Can't create file %s"), itmp); // Will call wait_return.
+ }
goto filterend;
}
if (curbuf != old_curbuf)
@@ -1117,16 +1230,6 @@ static void do_filter(
cmd_buf = make_filter_cmd(cmd, itmp, otmp);
ui_cursor_goto((int)Rows - 1, 0);
- /*
- * When not redirecting the output the command can write anything to the
- * screen. If 'shellredir' is equal to ">", screen may be messed up by
- * stderr output of external command. Clear the screen later.
- * If do_in is FALSE, this could be something like ":r !cat", which may
- * also mess up the screen, clear it later.
- */
- if (!do_out || STRCMP(p_srr, ">") == 0 || !do_in)
- redraw_later_clear();
-
if (do_out) {
if (u_save((linenr_T)(line2), (linenr_T)(line2 + 1)) == FAIL) {
xfree(cmd_buf);
@@ -1136,23 +1239,8 @@ static void do_filter(
}
read_linecount = curbuf->b_ml.ml_line_count;
- /*
- * When call_shell() fails wait_return() is called to give the user a
- * chance to read the error messages. Otherwise errors are ignored, so you
- * can see the error messages from the command that appear on stdout; use
- * 'u' to fix the text
- * Switch to cooked mode when not redirecting stdin, avoids that something
- * like ":r !cat" hangs.
- * Pass on the kShellDoOut flag when the output is being redirected.
- */
- if (call_shell(
- cmd_buf,
- kShellOptFilter | shell_flags,
- NULL
- )) {
- redraw_later_clear();
- wait_return(FALSE);
- }
+ // Pass on the kShellOptDoOut flag when the output is being redirected.
+ call_shell(cmd_buf, kShellOptFilter | shell_flags, NULL);
xfree(cmd_buf);
did_check_timestamps = FALSE;
@@ -1166,8 +1254,8 @@ static void do_filter(
if (do_out) {
if (otmp != NULL) {
- if (readfile(otmp, NULL, line2, (linenr_T)0, (linenr_T)MAXLNUM,
- eap, READ_FILTER) == FAIL) {
+ if (readfile(otmp, NULL, line2, (linenr_T)0, (linenr_T)MAXLNUM, eap,
+ READ_FILTER) != OK) {
if (!aborting()) {
msg_putchar('\n');
EMSG2(_(e_notread), otmp);
@@ -1188,15 +1276,14 @@ static void do_filter(
if (do_in) {
if (cmdmod.keepmarks || vim_strchr(p_cpo, CPO_REMMARK) == NULL) {
- if (read_linecount >= linecount)
- /* move all marks from old lines to new lines */
- mark_adjust(line1, line2, linecount, 0L);
- else {
- /* move marks from old lines to new lines, delete marks
- * that are in deleted lines */
- mark_adjust(line1, line1 + read_linecount - 1,
- linecount, 0L);
- mark_adjust(line1 + read_linecount, line2, MAXLNUM, 0L);
+ if (read_linecount >= linecount) {
+ // move all marks from old lines to new lines
+ mark_adjust(line1, line2, linecount, 0L, false);
+ } else {
+ // move marks from old lines to new lines, delete marks
+ // that are in deleted lines
+ mark_adjust(line1, line1 + read_linecount - 1, linecount, 0L, false);
+ mark_adjust(line1 + read_linecount, line2, MAXLNUM, 0L, false);
}
}
@@ -1254,23 +1341,17 @@ filterend:
xfree(otmp);
}
-/*
- * Call a shell to execute a command.
- * When "cmd" is NULL start an interactive shell.
- */
-void
-do_shell (
+// Call a shell to execute a command.
+// When "cmd" is NULL start an interactive shell.
+void
+do_shell(
char_u *cmd,
- int flags /* may be SHELL_DOOUT when output is redirected */
+ int flags // may be SHELL_DOOUT when output is redirected
)
{
- int save_nwr;
-
- /*
- * Disallow shell commands in restricted mode (-Z)
- * Disallow shell commands from .exrc and .vimrc in current directory for
- * security reasons.
- */
+ // Disallow shell commands in restricted mode (-Z)
+ // Disallow shell commands from .exrc and .vimrc in current directory for
+ // security reasons.
if (check_restricted() || check_secure()) {
msg_end();
return;
@@ -1308,38 +1389,31 @@ do_shell (
msg_row = Rows - 1;
msg_col = 0;
- if (autocmd_busy) {
- if (msg_silent == 0)
- redraw_later_clear();
- } else {
- /*
- * For ":sh" there is no need to call wait_return(), just redraw.
- * Also for the Win32 GUI (the output is in a console window).
- * Otherwise there is probably text on the screen that the user wants
- * to read before redrawing, so call wait_return().
- */
- if (cmd == NULL
- ) {
- if (msg_silent == 0)
- redraw_later_clear();
- need_wait_return = FALSE;
- } else {
- /*
- * If we switch screens when starttermcap() is called, we really
- * want to wait for "hit return to continue".
- */
- save_nwr = no_wait_return;
- wait_return(msg_silent == 0);
- no_wait_return = save_nwr;
- }
- }
-
- /* display any error messages now */
+ // display any error messages now
display_errors();
apply_autocmds(EVENT_SHELLCMDPOST, NULL, NULL, FALSE, curbuf);
}
+#if !defined(UNIX)
+static char *find_pipe(const char *cmd)
+{
+ bool inquote = false;
+
+ for (const char *p = cmd; *p != NUL; p++) {
+ if (!inquote && *p == '|') {
+ return p;
+ }
+ if (*p == '"') {
+ inquote = !inquote;
+ } else if (rem_backslash((const char_u *)p)) {
+ p++;
+ }
+ }
+ return NULL;
+}
+#endif
+
/// Create a shell command from a command string, input redirection file and
/// output redirection file.
///
@@ -1377,36 +1451,34 @@ char_u *make_filter_cmd(char_u *cmd, char_u *itmp, char_u *otmp)
: "(%s)";
vim_snprintf(buf, len, fmt, (char *)cmd);
} else {
- strncpy(buf, (char *) cmd, len);
+ xstrlcpy(buf, (char *)cmd, len);
}
if (itmp != NULL) {
- strncat(buf, " < ", len);
- strncat(buf, (char *) itmp, len);
+ xstrlcat(buf, " < ", len - 1);
+ xstrlcat(buf, (const char *)itmp, len - 1);
}
#else
// For shells that don't understand braces around commands, at least allow
// the use of commands in a pipe.
- strncpy(buf, cmd, len);
+ xstrlcpy(buf, (char *)cmd, len);
if (itmp != NULL) {
- char_u *p;
-
// If there is a pipe, we have to put the '<' in front of it.
// Don't do this when 'shellquote' is not empty, otherwise the
// redirection would be inside the quotes.
if (*p_shq == NUL) {
- p = strchr(buf, '|');
+ char *const p = find_pipe(buf);
if (p != NULL) {
*p = NUL;
}
}
- strncat(buf, " < ", len);
- strncat(buf, (char *) itmp, len);
+ xstrlcat(buf, " < ", len);
+ xstrlcat(buf, (const char *)itmp, len);
if (*p_shq == NUL) {
- p = strchr(cmd, '|');
+ const char *const p = find_pipe((const char *)cmd);
if (p != NULL) {
- strncat(buf, " ", len); // Insert a space before the '|' for DOS
- strncat(buf, p, len);
+ xstrlcat(buf, " ", len - 1); // Insert a space before the '|' for DOS
+ xstrlcat(buf, p, len - 1);
}
}
}
@@ -1449,12 +1521,12 @@ void append_redir(char *const buf, const size_t buflen,
void print_line_no_prefix(linenr_T lnum, int use_number, int list)
{
- char_u numbuf[30];
+ char numbuf[30];
if (curwin->w_p_nu || use_number) {
- vim_snprintf((char *)numbuf, sizeof(numbuf),
- "%*ld ", number_width(curwin), (long)lnum);
- msg_puts_attr(numbuf, hl_attr(HLF_N)); /* Highlight line nrs */
+ vim_snprintf(numbuf, sizeof(numbuf), "%*" PRIdLINENR " ",
+ number_width(curwin), lnum);
+ msg_puts_attr(numbuf, HL_ATTR(HLF_N)); // Highlight line nrs.
}
msg_prt_line(ml_get(lnum), list);
}
@@ -1466,6 +1538,11 @@ void print_line(linenr_T lnum, int use_number, int list)
{
int save_silent = silent_mode;
+ // apply :filter /pat/
+ if (message_filtered(ml_get(lnum))) {
+ return;
+ }
+
msg_start();
silent_mode = FALSE;
info_message = TRUE; /* use mch_msg(), not mch_errmsg() */
@@ -1510,8 +1587,9 @@ int rename_buffer(char_u *new_fname)
curbuf->b_flags |= BF_NOTEDITED;
if (xfname != NULL && *xfname != NUL) {
buf = buflist_new(fname, xfname, curwin->w_cursor.lnum, 0);
- if (buf != NULL && !cmdmod.keepalt)
+ if (buf != NULL && !cmdmod.keepalt) {
curwin->w_alt_fnum = buf->b_fnum;
+ }
}
xfree(fname);
xfree(sfname);
@@ -1537,12 +1615,14 @@ void ex_file(exarg_T *eap)
}
if (*eap->arg != NUL || eap->addr_count == 1) {
- if (rename_buffer(eap->arg) == FAIL)
+ if (rename_buffer(eap->arg) == FAIL) {
return;
+ }
+ redraw_tabline = true;
}
- if (!shortmess(SHM_FILEINFO)) {
- // print full file name if :cd used
+ // print file name if no argument or 'F' is not in 'shortmess'
+ if (*eap->arg == NUL || !shortmess(SHM_FILEINFO)) {
fileinfo(false, false, eap->forceit);
}
}
@@ -1583,6 +1663,7 @@ int do_write(exarg_T *eap)
int retval = FAIL;
char_u *free_fname = NULL;
buf_T *alt_buf = NULL;
+ int name_was_missing;
if (not_writing()) /* check 'write' option */
return FAIL;
@@ -1693,11 +1774,11 @@ int do_write(exarg_T *eap)
goto theend;
}
- /* If 'filetype' was empty try detecting it now. */
+ // If 'filetype' was empty try detecting it now.
if (*curbuf->b_p_ft == NUL) {
- if (au_has_group((char_u *)"filetypedetect"))
- (void)do_doautocmd((char_u *)"filetypedetect BufRead",
- TRUE);
+ if (au_has_group((char_u *)"filetypedetect")) {
+ (void)do_doautocmd((char_u *)"filetypedetect BufRead", true, NULL);
+ }
do_modelines(0);
}
@@ -1706,6 +1787,7 @@ int do_write(exarg_T *eap)
fname = curbuf->b_sfname;
}
+ name_was_missing = curbuf->b_ffname == NULL;
retval = buf_write(curbuf, ffname, fname, eap->line1, eap->line2,
eap, eap->append, eap->forceit, TRUE, FALSE);
@@ -1715,7 +1797,11 @@ int do_write(exarg_T *eap)
curbuf->b_p_ro = FALSE;
redraw_tabline = TRUE;
}
- /* Change directories when the 'acd' option is set. */
+ }
+
+ // Change directories when the 'acd' option is set and the file name
+ // got changed or set.
+ if (eap->cmdidx == CMD_saveas || name_was_missing) {
do_autochdir();
}
}
@@ -1731,14 +1817,14 @@ theend:
* May set eap->forceit if a dialog says it's OK to overwrite.
* Return OK if it's OK, FAIL if it is not.
*/
-int
-check_overwrite (
+int
+check_overwrite(
exarg_T *eap,
buf_T *buf,
- char_u *fname, /* file name to be used (can differ from
- buf->ffname) */
- char_u *ffname, /* full path version of fname */
- int other /* writing under other name */
+ char_u *fname, // file name to be used (can differ from
+ // buf->ffname)
+ char_u *ffname, // full path version of fname
+ int other // writing under other name
)
{
/*
@@ -1872,11 +1958,15 @@ void do_wqall(exarg_T *eap)
FALSE) == FAIL) {
++error;
} else {
- if (buf_write_all(buf, eap->forceit) == FAIL)
- ++error;
- /* an autocommand may have deleted the buffer */
- if (!buf_valid(buf))
+ bufref_T bufref;
+ set_bufref(&bufref, buf);
+ if (buf_write_all(buf, eap->forceit) == FAIL) {
+ error++;
+ }
+ // An autocommand may have deleted the buffer.
+ if (!bufref_valid(&bufref)) {
buf = firstbuf;
+ }
}
eap->forceit = save_forceit; /* check_overwrite() may set it */
}
@@ -1944,11 +2034,14 @@ static int check_readonly(int *forceit, buf_T *buf)
/*
* Try to abandon current file and edit a new or existing file.
- * 'fnum' is the number of the file, if zero use ffname/sfname.
+ * "fnum" is the number of the file, if zero use ffname/sfname.
+ * "lnum" is the line number for the cursor in the new file (if non-zero).
*
- * Return 1 for "normal" error, 2 for "not written" error, 0 for success
- * -1 for successfully opening another file.
- * 'lnum' is the line number for the cursor in the new file (if non-zero).
+ * Return:
+ * GETFILE_ERROR for "normal" error,
+ * GETFILE_NOT_WRITTEN for "not written" error,
+ * GETFILE_SAME_FILE for success
+ * GETFILE_OPEN_OTHER for successfully opening another file.
*/
int getfile(int fnum, char_u *ffname, char_u *sfname, int setpm, linenr_T lnum, int forceit)
{
@@ -1956,10 +2049,12 @@ int getfile(int fnum, char_u *ffname, char_u *sfname, int setpm, linenr_T lnum,
int retval;
char_u *free_me = NULL;
- if (text_locked())
- return 1;
- if (curbuf_locked())
- return 1;
+ if (text_locked()) {
+ return GETFILE_ERROR;
+ }
+ if (curbuf_locked()) {
+ return GETFILE_ERROR;
+ }
if (fnum == 0) {
/* make ffname full path, set sfname */
@@ -1969,17 +2064,18 @@ int getfile(int fnum, char_u *ffname, char_u *sfname, int setpm, linenr_T lnum,
} else
other = (fnum != curbuf->b_fnum);
- if (other)
- ++no_wait_return; /* don't wait for autowrite message */
- if (other && !forceit && curbuf->b_nwindows == 1 && !P_HID(curbuf)
+ if (other) {
+ no_wait_return++; // don't wait for autowrite message
+ }
+ if (other && !forceit && curbuf->b_nwindows == 1 && !buf_hide(curbuf)
&& curbufIsChanged() && autowrite(curbuf, forceit) == FAIL) {
- if (p_confirm && p_write)
- dialog_changed(curbuf, FALSE);
+ if (p_confirm && p_write) {
+ dialog_changed(curbuf, false);
+ }
if (curbufIsChanged()) {
- if (other)
- --no_wait_return;
+ no_wait_return--;
EMSG(_(e_nowrtmsg));
- retval = 2; /* file has been changed */
+ retval = GETFILE_NOT_WRITTEN; // File has been changed.
goto theend;
}
}
@@ -1988,54 +2084,53 @@ int getfile(int fnum, char_u *ffname, char_u *sfname, int setpm, linenr_T lnum,
if (setpm)
setpcmark();
if (!other) {
- if (lnum != 0)
+ if (lnum != 0) {
curwin->w_cursor.lnum = lnum;
+ }
check_cursor_lnum();
beginline(BL_SOL | BL_FIX);
- retval = 0; /* it's in the same file */
+ retval = GETFILE_SAME_FILE; // it's in the same file
} else if (do_ecmd(fnum, ffname, sfname, NULL, lnum,
- (P_HID(curbuf) ? ECMD_HIDE : 0) + (forceit ? ECMD_FORCEIT : 0),
- curwin) == OK)
- retval = -1; /* opened another file */
- else
- retval = 1; /* error encountered */
+ (buf_hide(curbuf) ? ECMD_HIDE : 0)
+ + (forceit ? ECMD_FORCEIT : 0), curwin) == OK) {
+ retval = GETFILE_OPEN_OTHER; // opened another file
+ } else {
+ retval = GETFILE_ERROR; // error encountered
+ }
theend:
xfree(free_me);
return retval;
}
-/*
- * start editing a new file
- *
- * fnum: file number; if zero use ffname/sfname
- * ffname: the file name
- * - full path if sfname used,
- * - any file name if sfname is NULL
- * - empty string to re-edit with the same file name (but may be
- * in a different directory)
- * - NULL to start an empty buffer
- * sfname: the short file name (or NULL)
- * eap: contains the command to be executed after loading the file and
- * forced 'ff' and 'fenc'
- * newlnum: if > 0: put cursor on this line number (if possible)
- * if ECMD_LASTL: use last position in loaded file
- * if ECMD_LAST: use last position in all files
- * if ECMD_ONE: use first line
- * flags:
- * ECMD_HIDE: if TRUE don't free the current buffer
- * ECMD_SET_HELP: set b_help flag of (new) buffer before opening file
- * ECMD_OLDBUF: use existing buffer if it exists
- * ECMD_FORCEIT: ! used for Ex command
- * ECMD_ADDBUF: don't edit, just add to buffer list
- * oldwin: Should be "curwin" when editing a new buffer in the current
- * window, NULL when splitting the window first. When not NULL info
- * of the previous buffer for "oldwin" is stored.
- *
- * return FAIL for failure, OK otherwise
- */
-int
-do_ecmd (
+/// start editing a new file
+///
+/// @param fnum file number; if zero use ffname/sfname
+/// @param ffname the file name
+/// - full path if sfname used,
+/// - any file name if sfname is NULL
+/// - empty string to re-edit with the same file name (but may
+/// be in a different directory)
+/// - NULL to start an empty buffer
+/// @param sfname the short file name (or NULL)
+/// @param eap contains the command to be executed after loading the file
+/// and forced 'ff' and 'fenc'
+/// @param newlnum if > 0: put cursor on this line number (if possible)
+/// ECMD_LASTL: use last position in loaded file
+/// ECMD_LAST: use last position in all files
+/// ECMD_ONE: use first line
+/// @param flags ECMD_HIDE: if TRUE don't free the current buffer
+/// ECMD_SET_HELP: set b_help flag of (new) buffer before
+/// opening file
+/// ECMD_OLDBUF: use existing buffer if it exists
+/// ECMD_FORCEIT: ! used for Ex command
+/// ECMD_ADDBUF: don't edit, just add to buffer list
+/// @param oldwin Should be "curwin" when editing a new buffer in the current
+/// window, NULL when splitting the window first. When not NULL
+/// info of the previous buffer for "oldwin" is stored.
+///
+/// @return FAIL for failure, OK otherwise
+int do_ecmd(
int fnum,
char_u *ffname,
char_u *sfname,
@@ -2052,7 +2147,8 @@ do_ecmd (
char_u *new_name = NULL;
int did_set_swapcommand = FALSE;
buf_T *buf;
- buf_T *old_curbuf = curbuf;
+ bufref_T bufref;
+ bufref_T old_curbuf;
char_u *free_fname = NULL;
int retval = FAIL;
long n;
@@ -2064,10 +2160,13 @@ do_ecmd (
char_u *command = NULL;
int did_get_winopts = FALSE;
int readfile_flags = 0;
+ bool did_inc_redrawing_disabled = false;
if (eap != NULL)
command = eap->do_ecmd_cmd;
+ set_bufref(&old_curbuf, curbuf);
+
if (fnum != 0) {
if (fnum == curbuf->b_fnum) /* file is already being edited */
return OK; /* nothing to do */
@@ -2101,6 +2200,14 @@ do_ecmd (
}
}
+ // Re-editing a terminal buffer: skip most buffer re-initialization.
+ if (!other_file && curbuf->terminal) {
+ check_arg_idx(curwin); // Needed when called from do_argfile().
+ maketitle(); // Title may show the arg index, e.g. "(2 of 5)".
+ retval = OK;
+ goto theend;
+ }
+
/*
* if the file was changed we may not be allowed to abandon it
* - if we are going to re-edit the same file
@@ -2151,9 +2258,9 @@ do_ecmd (
buflist_altfpos(oldwin);
}
- if (fnum)
+ if (fnum) {
buf = buflist_findnr(fnum);
- else {
+ } else {
if (flags & ECMD_ADDBUF) {
linenr_T tlnum = 1L;
@@ -2166,28 +2273,32 @@ do_ecmd (
goto theend;
}
buf = buflist_new(ffname, sfname, 0L,
- BLN_CURBUF | ((flags & ECMD_SET_HELP) ? 0 : BLN_LISTED));
+ BLN_CURBUF | (flags & ECMD_SET_HELP ? 0 : BLN_LISTED));
// Autocmds may change curwin and curbuf.
if (oldwin != NULL) {
oldwin = curwin;
}
- old_curbuf = curbuf;
+ set_bufref(&old_curbuf, curbuf);
}
if (buf == NULL)
goto theend;
- if (buf->b_ml.ml_mfp == NULL) { /* no memfile yet */
- oldbuf = FALSE;
- } else { /* existing memfile */
- oldbuf = TRUE;
- (void)buf_check_timestamp(buf, FALSE);
- /* Check if autocommands made buffer invalid or changed the current
- * buffer. */
- if (!buf_valid(buf)
- || curbuf != old_curbuf
- )
+ if (buf->b_ml.ml_mfp == NULL) {
+ // No memfile yet.
+ oldbuf = false;
+ } else {
+ // Existing memfile.
+ oldbuf = true;
+ set_bufref(&bufref, buf);
+ (void)buf_check_timestamp(buf, false);
+ // Check if autocommands made buffer invalid or changed the current
+ // buffer.
+ if (!bufref_valid(&bufref) || curbuf != old_curbuf.br_buf) {
goto theend;
- if (aborting()) /* autocmds may abort script processing */
+ }
+ if (aborting()) {
+ // Autocmds may abort script processing.
goto theend;
+ }
}
/* May jump to last used line number for a loaded buffer or when asked
@@ -2215,46 +2326,53 @@ do_ecmd (
* - If we ended up in the new buffer already, need to skip a few
* things, set auto_buf.
*/
- if (buf->b_fname != NULL)
+ if (buf->b_fname != NULL) {
new_name = vim_strsave(buf->b_fname);
- au_new_curbuf = buf;
- apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf);
- if (!buf_valid(buf)) { /* new buffer has been deleted */
- delbuf_msg(new_name); /* frees new_name */
+ }
+ set_bufref(&au_new_curbuf, buf);
+ apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, false, curbuf);
+ if (!bufref_valid(&au_new_curbuf)) {
+ // New buffer has been deleted.
+ delbuf_msg(new_name); // Frees new_name.
goto theend;
}
if (aborting()) { /* autocmds may abort script processing */
xfree(new_name);
goto theend;
}
- if (buf == curbuf) /* already in new buffer */
- auto_buf = TRUE;
- else {
- if (curbuf == old_curbuf)
+ if (buf == curbuf) { // already in new buffer
+ auto_buf = true;
+ } else {
+ win_T *the_curwin = curwin;
+
+ // Set w_closing to avoid that autocommands close the window.
+ // Set b_locked for the same reason.
+ the_curwin->w_closing = true;
+ buf->b_locked++;
+
+ if (curbuf == old_curbuf.br_buf) {
buf_copy_options(buf, BCO_ENTER);
+ }
- /* close the link to the current buffer */
- u_sync(FALSE);
+ // Close the link to the current buffer. This will set
+ // oldwin->w_buffer to NULL.
+ u_sync(false);
close_buffer(oldwin, curbuf,
- (flags & ECMD_HIDE) || curbuf->terminal ? 0 : DOBUF_UNLOAD, FALSE);
-
- /* Autocommands may open a new window and leave oldwin open
- * which leads to crashes since the above call sets
- * oldwin->w_buffer to NULL. */
- if (curwin != oldwin && oldwin != aucmd_win && win_valid(oldwin)) {
- assert(oldwin);
- if (oldwin->w_buffer == NULL) {
- win_close(oldwin, FALSE);
- }
- }
+ (flags & ECMD_HIDE) || curbuf->terminal ? 0 : DOBUF_UNLOAD,
+ false);
+
+ the_curwin->w_closing = false;
+ buf->b_locked--;
- if (aborting()) { /* autocmds may abort script processing */
+ // autocmds may abort script processing
+ if (aborting() && curwin->w_buffer != NULL) {
xfree(new_name);
goto theend;
}
- /* Be careful again, like above. */
- if (!buf_valid(buf)) { /* new buffer has been deleted */
- delbuf_msg(new_name); /* frees new_name */
+ // Be careful again, like above.
+ if (!bufref_valid(&au_new_curbuf)) {
+ // New buffer has been deleted.
+ delbuf_msg(new_name); // Frees new_name.
goto theend;
}
if (buf == curbuf) { // already in new buffer
@@ -2262,8 +2380,8 @@ do_ecmd (
} else {
// <VN> We could instead free the synblock
// and re-attach to buffer, perhaps.
- if (curwin->w_buffer != NULL
- && curwin->w_s == &(curwin->w_buffer->b_s)) {
+ if (curwin->w_buffer == NULL
+ || curwin->w_s == &(curwin->w_buffer->b_s)) {
curwin->w_s = &(buf->b_s);
}
@@ -2287,7 +2405,8 @@ do_ecmd (
}
xfree(new_name);
- au_new_curbuf = NULL;
+ au_new_curbuf.br_buf = NULL;
+ au_new_curbuf.br_buf_free_count = 0;
}
curwin->w_pcmark.lnum = 1;
@@ -2300,6 +2419,11 @@ do_ecmd (
oldbuf = (flags & ECMD_OLDBUF);
}
+ // Don't redraw until the cursor is in the right line, otherwise
+ // autocommands may cause ml_get errors.
+ RedrawingDisabled++;
+ did_inc_redrawing_disabled = true;
+
buf = curbuf;
if ((flags & ECMD_SET_HELP) || keep_help_flag) {
prepare_help_buffer();
@@ -2335,28 +2459,34 @@ do_ecmd (
solcol = curwin->w_cursor.col;
}
buf = curbuf;
- if (buf->b_fname != NULL)
+ if (buf->b_fname != NULL) {
new_name = vim_strsave(buf->b_fname);
- else
+ } else {
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.
* 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)
- == FAIL)
+ u_sync(false);
+ if (u_savecommon(0, curbuf->b_ml.ml_line_count + 1, 0, true)
+ == FAIL) {
+ xfree(new_name);
goto theend;
+ }
u_unchanged(curbuf);
+ buf_updates_unregister_all(curbuf);
buf_freeall(curbuf, BFA_KEEP_UNDO);
- /* tell readfile() not to clear or reload undo info */
+ // Tell readfile() not to clear or reload undo info.
readfile_flags = READ_KEEP_UNDO;
- } else
- buf_freeall(curbuf, 0); /* free all things for buffer */
- /* If autocommands deleted the buffer we were going to re-edit, give
- * up and jump to the end. */
- if (!buf_valid(buf)) {
- delbuf_msg(new_name); /* frees new_name */
+ } else {
+ buf_freeall(curbuf, 0); // Free all things for buffer.
+ }
+ // If autocommands deleted the buffer we were going to re-edit, give
+ // up and jump to the end.
+ if (!bufref_valid(&bufref)) {
+ delbuf_msg(new_name); // Frees new_name.
goto theend;
}
xfree(new_name);
@@ -2376,18 +2506,11 @@ do_ecmd (
/*
* If we get here we are sure to start editing
*/
- /* don't redraw until the cursor is in the right line */
- ++RedrawingDisabled;
/* Assume success now */
retval = OK;
/*
- * Reset cursor position, could be used by autocommands.
- */
- check_cursor();
-
- /*
* Check if we are editing the w_arg_idx file in the argument list.
*/
check_arg_idx(curwin);
@@ -2429,7 +2552,7 @@ do_ecmd (
if (swap_exists_action == SEA_QUIT)
retval = FAIL;
- handle_swap_exists(old_curbuf);
+ handle_swap_exists(&old_curbuf);
} else {
/* Read the modelines, but only to set window-local options. Any
* buffer-local options have already been set and may have been
@@ -2443,11 +2566,17 @@ do_ecmd (
}
check_arg_idx(curwin);
- // If autocommands change the cursor position or topline, we should keep
- // it. Also when it moves within a line.
+ // If autocommands change the cursor position or topline, we should
+ // keep it. Also when it moves within a line. But not when it moves
+ // to the first non-blank.
if (!equalpos(curwin->w_cursor, orig_pos)) {
- newlnum = curwin->w_cursor.lnum;
- newcol = curwin->w_cursor.col;
+ const char_u *text = get_cursor_line_ptr();
+
+ if (curwin->w_cursor.lnum != orig_pos.lnum
+ || curwin->w_cursor.col != (int)(skipwhite(text) - text)) {
+ newlnum = curwin->w_cursor.lnum;
+ newcol = curwin->w_cursor.col;
+ }
}
if (curwin->w_topline == topline)
topline = 0;
@@ -2529,7 +2658,8 @@ do_ecmd (
if (curbuf->b_kmap_state & KEYMAP_INIT)
(void)keymap_init();
- --RedrawingDisabled;
+ RedrawingDisabled--;
+ did_inc_redrawing_disabled = false;
if (!skip_redraw) {
n = p_so;
if (topline == 0 && command == NULL)
@@ -2548,8 +2678,12 @@ do_ecmd (
theend:
- if (did_set_swapcommand)
+ if (did_inc_redrawing_disabled) {
+ RedrawingDisabled--;
+ }
+ if (did_set_swapcommand) {
set_vim_var_string(VV_SWAPCOMMAND, NULL, -1);
+ }
xfree(free_fname);
return retval;
}
@@ -2559,7 +2693,8 @@ static void delbuf_msg(char_u *name)
EMSG2(_("E143: Autocommands unexpectedly deleted new buffer %s"),
name == NULL ? (char_u *)"" : name);
xfree(name);
- au_new_curbuf = NULL;
+ au_new_curbuf.br_buf = NULL;
+ au_new_curbuf.br_buf_free_count = 0;
}
static int append_indent = 0; /* autoindent for first line */
@@ -2588,7 +2723,7 @@ void ex_append(exarg_T *eap)
if (eap->cmdidx != CMD_append)
--lnum;
- /* when the buffer is empty append to line 0 and delete the dummy line */
+ // when the buffer is empty need to delete the dummy line
if (empty && lnum == 1)
lnum = 0;
@@ -2660,7 +2795,7 @@ void ex_append(exarg_T *eap)
did_undo = TRUE;
ml_append(lnum, theline, (colnr_T)0, FALSE);
- appended_lines_mark(lnum, 1L);
+ appended_lines_mark(lnum + (empty ? 1 : 0), 1L);
xfree(theline);
++lnum;
@@ -2727,23 +2862,25 @@ void ex_change(exarg_T *eap)
void ex_z(exarg_T *eap)
{
char_u *x;
- int bigness;
+ int64_t bigness;
char_u *kind;
int minus = 0;
linenr_T start, end, curs, i;
int j;
linenr_T lnum = eap->line2;
- /* Vi compatible: ":z!" uses display height, without a count uses
- * 'scroll' */
- if (eap->forceit)
- bigness = curwin->w_height;
- else if (firstwin == lastwin)
+ // Vi compatible: ":z!" uses display height, without a count uses
+ // 'scroll'
+ if (eap->forceit) {
+ bigness = curwin->w_grid.Rows;
+ } else if (ONE_WINDOW) {
bigness = curwin->w_p_scr * 2;
- else
- bigness = curwin->w_height - 3;
- if (bigness < 1)
+ } else {
+ bigness = curwin->w_grid.Rows - 3;
+ }
+ if (bigness < 1) {
bigness = 1;
+ }
x = eap->arg;
kind = x;
@@ -2758,10 +2895,17 @@ void ex_z(exarg_T *eap)
EMSG(_("E144: non-numeric argument to :z"));
return;
}
- bigness = atoi((char *)x);
+ bigness = atol((char *)x);
+
+ // bigness could be < 0 if atol(x) overflows.
+ if (bigness > 2 * curbuf->b_ml.ml_line_count || bigness < 0) {
+ bigness = 2 * curbuf->b_ml.ml_line_count;
+ }
+
p_window = bigness;
- if (*kind == '=')
+ if (*kind == '=') {
bigness += 2;
+ }
}
/* the number of '-' and '+' multiplies the distance */
@@ -2812,8 +2956,11 @@ void ex_z(exarg_T *eap)
if (end > curbuf->b_ml.ml_line_count)
end = curbuf->b_ml.ml_line_count;
- if (curs > curbuf->b_ml.ml_line_count)
+ if (curs > curbuf->b_ml.ml_line_count) {
curs = curbuf->b_ml.ml_line_count;
+ } else if (curs < 1) {
+ curs = 1;
+ }
for (i = start; i <= end; i++) {
if (minus && i == lnum) {
@@ -2833,8 +2980,11 @@ void ex_z(exarg_T *eap)
}
}
- curwin->w_cursor.lnum = curs;
- ex_no_reprint = TRUE;
+ if (curwin->w_cursor.lnum != curs) {
+ curwin->w_cursor.lnum = curs;
+ curwin->w_cursor.col = 0;
+ }
+ ex_no_reprint = true;
}
/*
@@ -2896,57 +3046,214 @@ void sub_set_replacement(SubReplacementString sub)
{
xfree(old_sub.sub);
if (sub.additional_elements != old_sub.additional_elements) {
- list_unref(old_sub.additional_elements);
+ tv_list_unref(old_sub.additional_elements);
}
old_sub = sub;
}
-/* do_sub()
- *
- * Perform a substitution from line eap->line1 to line eap->line2 using the
- * command pointed to by eap->arg which should be of the form:
- *
- * /pattern/substitution/{flags}
- *
- * The usual escapes are supported as described in the regexp docs.
- */
-void do_sub(exarg_T *eap)
+/// Recognize ":%s/\n//" and turn it into a join command, which is much
+/// more efficient.
+///
+/// @param[in] eap Ex arguments
+/// @param[in] pat Search pattern
+/// @param[in] sub Replacement string
+/// @param[in] cmd Command from :s_flags
+/// @param[in] save Save pattern to options, history
+///
+/// @returns true if :substitute can be replaced with a join command
+static bool sub_joining_lines(exarg_T *eap, char_u *pat, char_u *sub,
+ char_u *cmd, bool save)
+ FUNC_ATTR_NONNULL_ARG(1, 3, 4)
+{
+ // TODO(vim): find a generic solution to make line-joining operations more
+ // efficient, avoid allocating a string that grows in size.
+ if (pat != NULL
+ && strcmp((const char *)pat, "\\n") == 0
+ && *sub == NUL
+ && (*cmd == NUL || (cmd[1] == NUL
+ && (*cmd == 'g'
+ || *cmd == 'l'
+ || *cmd == 'p'
+ || *cmd == '#')))) {
+ curwin->w_cursor.lnum = eap->line1;
+ if (*cmd == 'l') {
+ eap->flags = EXFLAG_LIST;
+ } else if (*cmd == '#') {
+ eap->flags = EXFLAG_NR;
+ } else if (*cmd == 'p') {
+ eap->flags = EXFLAG_PRINT;
+ }
+
+ // The number of lines joined is the number of lines in the range
+ linenr_T joined_lines_count = eap->line2 - eap->line1 + 1
+ // plus one extra line if not at the end of file.
+ + (eap->line2 < curbuf->b_ml.ml_line_count ? 1 : 0);
+ if (joined_lines_count > 1) {
+ do_join(joined_lines_count, FALSE, TRUE, FALSE, true);
+ sub_nsubs = joined_lines_count - 1;
+ sub_nlines = 1;
+ do_sub_msg(false);
+ ex_may_print(eap);
+ }
+
+ if (save) {
+ if (!cmdmod.keeppatterns) {
+ save_re_pat(RE_SUBST, pat, p_magic);
+ }
+ add_to_history(HIST_SEARCH, pat, true, NUL);
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+/// Allocate memory to store the replacement text for :substitute.
+///
+/// Slightly more memory that is strictly necessary is allocated to reduce the
+/// frequency of memory (re)allocation.
+///
+/// @param[in,out] new_start pointer to the memory for the replacement text
+/// @param[in] needed_len amount of memory needed
+///
+/// @returns pointer to the end of the allocated memory
+static char_u *sub_grow_buf(char_u **new_start, int needed_len)
+ FUNC_ATTR_NONNULL_ARG(1) FUNC_ATTR_NONNULL_RET
+{
+ int new_start_len = 0;
+ char_u *new_end;
+ if (*new_start == NULL) {
+ // Get some space for a temporary buffer to do the
+ // substitution into (and some extra space to avoid
+ // too many calls to xmalloc()/free()).
+ new_start_len = needed_len + 50;
+ *new_start = xmalloc(new_start_len);
+ **new_start = NUL;
+ new_end = *new_start;
+ } else {
+ // Check if the temporary buffer is long enough to do the
+ // substitution into. If not, make it larger (with a bit
+ // extra to avoid too many calls to xmalloc()/free()).
+ size_t len = STRLEN(*new_start);
+ needed_len += len;
+ if (needed_len > new_start_len) {
+ new_start_len = needed_len + 50;
+ *new_start = xrealloc(*new_start, new_start_len);
+ }
+ new_end = *new_start + len;
+ }
+
+ return new_end;
+}
+
+/// Parse cmd string for :substitute's {flags} and update subflags accordingly
+///
+/// @param[in] cmd command string
+/// @param[in,out] subflags current flags defined for the :substitute command
+/// @param[in,out] which_pat pattern type from which to get default search
+///
+/// @returns pointer to the end of the flags, which may be the end of the string
+static char_u *sub_parse_flags(char_u *cmd, subflags_T *subflags,
+ int *which_pat)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_RET
+{
+ // Find trailing options. When '&' is used, keep old options.
+ if (*cmd == '&') {
+ cmd++;
+ } else {
+ subflags->do_all = p_gd;
+ subflags->do_ask = false;
+ subflags->do_error = true;
+ subflags->do_print = false;
+ subflags->do_count = false;
+ subflags->do_number = false;
+ subflags->do_ic = kSubHonorOptions;
+ }
+ while (*cmd) {
+ // Note that 'g' and 'c' are always inverted.
+ // 'r' is never inverted.
+ if (*cmd == 'g') {
+ subflags->do_all = !subflags->do_all;
+ } else if (*cmd == 'c') {
+ subflags->do_ask = !subflags->do_ask;
+ } else if (*cmd == 'n') {
+ subflags->do_count = true;
+ } else if (*cmd == 'e') {
+ subflags->do_error = !subflags->do_error;
+ } else if (*cmd == 'r') { // use last used regexp
+ *which_pat = RE_LAST;
+ } else if (*cmd == 'p') {
+ subflags->do_print = true;
+ } else if (*cmd == '#') {
+ subflags->do_print = true;
+ subflags->do_number = true;
+ } else if (*cmd == 'l') {
+ subflags->do_print = true;
+ subflags->do_list = true;
+ } else if (*cmd == 'i') { // ignore case
+ subflags->do_ic = kSubIgnoreCase;
+ } else if (*cmd == 'I') { // don't ignore case
+ subflags->do_ic = kSubMatchCase;
+ } else {
+ break;
+ }
+ cmd++;
+ }
+ if (subflags->do_count) {
+ subflags->do_ask = false;
+ }
+
+ return cmd;
+}
+
+/// Perform a substitution from line eap->line1 to line eap->line2 using the
+/// command pointed to by eap->arg which should be of the form:
+///
+/// /pattern/substitution/{flags}
+///
+/// The usual escapes are supported as described in the regexp docs.
+///
+/// @param do_buf_event If `true`, send buffer updates.
+/// @return buffer used for 'inccommand' preview
+static buf_T *do_sub(exarg_T *eap, proftime_T timeout,
+ bool do_buf_event)
{
- linenr_T lnum;
long i = 0;
regmmatch_T regmatch;
- static int do_all = FALSE; /* do multiple substitutions per line */
- static int do_ask = FALSE; /* ask for confirmation */
- static bool do_count = false; /* count only */
- static int do_error = TRUE; /* if false, ignore errors */
- static int do_print = FALSE; /* print last line with subs. */
- static int do_list = FALSE; /* list last line with subs. */
- static int do_number = FALSE; /* list last line with line nr*/
- static int do_ic = 0; /* ignore case flag */
- int save_do_all; // remember user specified 'g' flag
- int save_do_ask; // remember user specified 'c' flag
- char_u *pat = NULL, *sub = NULL; /* init for GCC */
+ static subflags_T subflags = {
+ .do_all = false,
+ .do_ask = false,
+ .do_count = false,
+ .do_error = true,
+ .do_print = false,
+ .do_list = false,
+ .do_number = false,
+ .do_ic = kSubHonorOptions
+ };
+ char_u *pat = NULL, *sub = NULL; // init for GCC
int delimiter;
+ bool has_second_delim = false;
int sublen;
- int got_quit = FALSE;
- int got_match = FALSE;
- int temp;
+ int got_quit = false;
+ int got_match = false;
int which_pat;
- char_u *cmd;
- int save_State;
- linenr_T first_line = 0; /* first changed line */
- linenr_T last_line= 0; /* below last changed line AFTER the
- * change */
+ char_u *cmd = eap->arg;
+ linenr_T first_line = 0; // first changed line
+ linenr_T last_line= 0; // below last changed line AFTER the change
linenr_T old_line_count = curbuf->b_ml.ml_line_count;
- linenr_T line2;
- long nmatch; /* number of lines in match */
- char_u *sub_firstline; /* allocated copy of first sub line */
- int endcolumn = FALSE; /* cursor in last column when done */
+ char_u *sub_firstline; // allocated copy of first sub line
+ bool endcolumn = false; // cursor in last column when done
+ PreviewLines preview_lines = { KV_INITIAL_VALUE, 0 };
+ static int pre_src_id = 0; // Source id for the preview highlight
+ static int pre_hl_id = 0;
+ buf_T *orig_buf = curbuf; // save to reset highlighting
pos_T old_cursor = curwin->w_cursor;
int start_nsubs;
int save_ma = 0;
+ int save_b_changed = curbuf->b_changed;
+ bool preview = (State & CMDPREVIEW);
- cmd = eap->arg;
if (!global_busy) {
sub_nsubs = 0;
sub_nlines = 0;
@@ -2964,7 +3271,7 @@ void do_sub(exarg_T *eap)
/* don't accept alphanumeric for separator */
if (isalpha(*cmd)) {
EMSG(_("E146: Regular expressions can't be delimited by letters"));
- return;
+ return NULL;
}
/*
* undocumented vi feature:
@@ -2975,21 +3282,26 @@ void do_sub(exarg_T *eap)
++cmd;
if (vim_strchr((char_u *)"/?&", *cmd) == NULL) {
EMSG(_(e_backslash));
- return;
+ return NULL;
+ }
+ if (*cmd != '&') {
+ which_pat = RE_SEARCH; // use last '/' pattern
}
- if (*cmd != '&')
- which_pat = RE_SEARCH; /* use last '/' pattern */
- pat = (char_u *)""; /* empty search pattern */
- delimiter = *cmd++; /* remember delimiter character */
- } else { /* find the end of the regexp */
- if (p_altkeymap && curwin->w_p_rl)
+ pat = (char_u *)""; // empty search pattern
+ delimiter = *cmd++; // remember delimiter character
+ has_second_delim = true;
+ } else { // find the end of the regexp
+ if (p_altkeymap && curwin->w_p_rl) {
lrF_sub(cmd);
- which_pat = RE_LAST; /* use last used regexp */
- delimiter = *cmd++; /* remember delimiter character */
- pat = cmd; /* remember start of search pat */
+ }
+ which_pat = RE_LAST; // use last used regexp
+ delimiter = *cmd++; // remember delimiter character
+ pat = cmd; // remember start of search pat
cmd = skip_regexp(cmd, delimiter, p_magic, &eap->arg);
- if (cmd[0] == delimiter) /* end delimiter found */
- *cmd++ = NUL; /* replace it with a NUL */
+ if (cmd[0] == delimiter) { // end delimiter found
+ *cmd++ = NUL; // replace it with a NUL
+ has_second_delim = true;
+ }
}
/*
@@ -3003,12 +3315,13 @@ void do_sub(exarg_T *eap)
*cmd++ = NUL; /* replace it with a NUL */
break;
}
- if (cmd[0] == '\\' && cmd[1] != 0) /* skip escaped characters */
- ++cmd;
- mb_ptr_adv(cmd);
+ if (cmd[0] == '\\' && cmd[1] != 0) { // skip escaped characters
+ cmd++;
+ }
+ MB_PTR_ADV(cmd);
}
- if (!eap->skip) {
+ if (!eap->skip && !preview) {
sub_set_replacement((SubReplacementString) {
.sub = xstrdup((char *) sub),
.timestamp = os_time(),
@@ -3018,7 +3331,7 @@ void do_sub(exarg_T *eap)
} else if (!eap->skip) { /* use previous pattern and substitution */
if (old_sub.sub == NULL) { /* there is no previous command */
EMSG(_(e_nopresub));
- return;
+ return NULL;
}
pat = NULL; /* search_regcomp() will use previous pattern */
sub = (char_u *) old_sub.sub;
@@ -3028,106 +3341,22 @@ void do_sub(exarg_T *eap)
endcolumn = (curwin->w_curswant == MAXCOL);
}
- // Recognize ":%s/\n//" and turn it into a join command, which is much
- // more efficient.
- // TODO: find a generic solution to make line-joining operations more
- // efficient, avoid allocating a string that grows in size.
- if (pat != NULL
- && strcmp((const char *)pat, "\\n") == 0
- && *sub == NUL
- && (*cmd == NUL || (cmd[1] == NUL
- && (*cmd == 'g'
- || *cmd == 'l'
- || *cmd == 'p'
- || *cmd == '#')))) {
- curwin->w_cursor.lnum = eap->line1;
- if (*cmd == 'l') {
- eap->flags = EXFLAG_LIST;
- } else if (*cmd == '#') {
- eap->flags = EXFLAG_NR;
- } else if (*cmd == 'p') {
- eap->flags = EXFLAG_PRINT;
- }
-
- // The number of lines joined is the number of lines in the range
- linenr_T joined_lines_count = eap->line2 - eap->line1 + 1
- // plus one extra line if not at the end of file.
- + (eap->line2 < curbuf->b_ml.ml_line_count ? 1 : 0);
- if (joined_lines_count > 1) {
- do_join(joined_lines_count, FALSE, TRUE, FALSE, true);
- sub_nsubs = joined_lines_count - 1;
- sub_nlines = 1;
- do_sub_msg(false);
- ex_may_print(eap);
- }
-
- if (!cmdmod.keeppatterns) {
- save_re_pat(RE_SUBST, pat, p_magic);
- }
- add_to_history(HIST_SEARCH, pat, TRUE, NUL);
-
- return;
+ if (sub != NULL && sub_joining_lines(eap, pat, sub, cmd, !preview)) {
+ return NULL;
}
- /*
- * Find trailing options. When '&' is used, keep old options.
- */
- if (*cmd == '&') {
- ++cmd;
- } else {
- // default is global on
- do_all = p_gd ? TRUE : FALSE;
-
- do_ask = FALSE;
- do_error = TRUE;
- do_print = FALSE;
- do_count = false;
- do_number = FALSE;
- do_ic = 0;
- }
- while (*cmd) {
- // Note that 'g' and 'c' are always inverted.
- // 'r' is never inverted.
- if (*cmd == 'g')
- do_all = !do_all;
- else if (*cmd == 'c')
- do_ask = !do_ask;
- else if (*cmd == 'n')
- do_count = true;
- else if (*cmd == 'e')
- do_error = !do_error;
- else if (*cmd == 'r') /* use last used regexp */
- which_pat = RE_LAST;
- else if (*cmd == 'p')
- do_print = TRUE;
- else if (*cmd == '#') {
- do_print = TRUE;
- do_number = TRUE;
- } else if (*cmd == 'l') {
- do_print = TRUE;
- do_list = TRUE;
- } else if (*cmd == 'i') /* ignore case */
- do_ic = 'i';
- else if (*cmd == 'I') /* don't ignore case */
- do_ic = 'I';
- else
- break;
- ++cmd;
- }
- if (do_count) {
- do_ask = FALSE;
- }
+ cmd = sub_parse_flags(cmd, &subflags, &which_pat);
- save_do_all = do_all;
- save_do_ask = do_ask;
+ bool save_do_all = subflags.do_all; // remember user specified 'g' flag
+ bool save_do_ask = subflags.do_ask; // remember user specified 'c' flag
// check for a trailing count
cmd = skipwhite(cmd);
if (ascii_isdigit(*cmd)) {
i = getdigits_long(&cmd);
- if (i <= 0 && !eap->skip && do_error) {
+ if (i <= 0 && !eap->skip && subflags.do_error) {
EMSG(_(e_zerocount));
- return;
+ return NULL;
}
eap->line1 = eap->line2;
eap->line2 += i - 1;
@@ -3143,31 +3372,34 @@ void do_sub(exarg_T *eap)
eap->nextcmd = check_nextcmd(cmd);
if (eap->nextcmd == NULL) {
EMSG(_(e_trailing));
- return;
+ return NULL;
}
}
- if (eap->skip) /* not executing commands, only parsing */
- return;
+ if (eap->skip) { // not executing commands, only parsing
+ return NULL;
+ }
- if (!do_count && !MODIFIABLE(curbuf)) {
- /* Substitution is not allowed in non-'modifiable' buffer */
+ if (!subflags.do_count && !MODIFIABLE(curbuf)) {
+ // Substitution is not allowed in non-'modifiable' buffer
EMSG(_(e_modifiable));
- return;
+ return NULL;
}
- if (search_regcomp(pat, RE_SUBST, which_pat, SEARCH_HIS,
- &regmatch) == FAIL) {
- if (do_error)
+ if (search_regcomp(pat, RE_SUBST, which_pat, (preview ? 0 : SEARCH_HIS),
+ &regmatch) == FAIL) {
+ if (subflags.do_error) {
EMSG(_(e_invcmd));
- return;
+ }
+ return NULL;
}
- /* the 'i' or 'I' flag overrules 'ignorecase' and 'smartcase' */
- if (do_ic == 'i')
- regmatch.rmm_ic = TRUE;
- else if (do_ic == 'I')
- regmatch.rmm_ic = FALSE;
+ // the 'i' or 'I' flag overrules 'ignorecase' and 'smartcase'
+ if (subflags.do_ic == kSubIgnoreCase) {
+ regmatch.rmm_ic = true;
+ } else if (subflags.do_ic == kSubMatchCase) {
+ regmatch.rmm_ic = false;
+ }
sub_firstline = NULL;
@@ -3179,29 +3411,28 @@ void do_sub(exarg_T *eap)
if (!(sub[0] == '\\' && sub[1] == '='))
sub = regtilde(sub, p_magic);
- /*
- * Check for a match on each line.
- */
- line2 = eap->line2;
- for (lnum = eap->line1; lnum <= line2 && !(got_quit
- || aborting()
- ); ++lnum) {
- nmatch = vim_regexec_multi(&regmatch, curwin, curbuf, lnum,
- (colnr_T)0, NULL);
+ // Check for a match on each line.
+ // If preview: limit to max('cmdwinheight', viewport).
+ linenr_T line2 = eap->line2;
+ for (linenr_T lnum = eap->line1;
+ lnum <= line2 && !got_quit && !aborting()
+ && (!preview || preview_lines.lines_needed <= (linenr_T)p_cwh
+ || lnum <= curwin->w_botline);
+ lnum++) {
+ long nmatch = vim_regexec_multi(&regmatch, curwin, curbuf, lnum,
+ (colnr_T)0, NULL);
if (nmatch) {
colnr_T copycol;
colnr_T matchcol;
colnr_T prev_matchcol = MAXCOL;
char_u *new_end, *new_start = NULL;
- unsigned new_start_len = 0;
char_u *p1;
int did_sub = FALSE;
int lastone;
- int len, copy_len, needed_len;
- long nmatch_tl = 0; /* nr of lines matched below lnum */
- int do_again; /* do it again after joining lines */
- int skip_match = FALSE;
- linenr_T sub_firstlnum; /* nr of first sub line */
+ long nmatch_tl = 0; // nr of lines matched below lnum
+ int do_again; // do it again after joining lines
+ int skip_match = false;
+ linenr_T sub_firstlnum; // nr of first sub line
/*
* The new text is build up step by step, to avoid too much
@@ -3241,8 +3472,7 @@ void do_sub(exarg_T *eap)
* accordingly.
*
* The new text is built up in new_start[]. It has some extra
- * room to avoid using xmalloc()/free() too often. new_start_len is
- * the length of the allocated memory at new_start.
+ * room to avoid using xmalloc()/free() too often.
*
* Make a copy of the old line, so it won't be taken away when
* updating the screen or handling a multi-line match. The "old_"
@@ -3261,16 +3491,25 @@ void do_sub(exarg_T *eap)
/*
* Loop until nothing more to replace in this line.
* 1. Handle match with empty string.
- * 2. If do_ask is set, ask for confirmation.
+ * 2. If subflags.do_ask is set, ask for confirmation.
* 3. substitute the string.
- * 4. if do_all is set, find next match
+ * 4. if subflags.do_all is set, find next match
* 5. break if there isn't another match in this line
*/
for (;; ) {
- /* Advance "lnum" to the line where the match starts. The
- * match does not start in the first line when there is a line
- * break before \zs. */
+ SubResult current_match = {
+ .start = { 0, 0 },
+ .end = { 0, 0 },
+ .pre_match = 0,
+ };
+ // lnum is where the match start, but maybe not the pattern match,
+ // since we can have \n before \zs in the pattern
+
+ // Advance "lnum" to the line where the match starts. The
+ // match does not start in the first line when there is a line
+ // break before \zs.
if (regmatch.startpos[0].lnum > 0) {
+ current_match.pre_match = lnum;
lnum += regmatch.startpos[0].lnum;
sub_firstlnum += regmatch.startpos[0].lnum;
nmatch -= regmatch.startpos[0].lnum;
@@ -3278,6 +3517,10 @@ void do_sub(exarg_T *eap)
sub_firstline = NULL;
}
+ // Now we're at the line where the pattern match starts
+ // Note: If not first match on a line, column can't be known here
+ current_match.start.lnum = sub_firstlnum;
+
if (sub_firstline == NULL) {
sub_firstline = vim_strsave(ml_get(sub_firstlnum));
}
@@ -3306,6 +3549,10 @@ void do_sub(exarg_T *eap)
else
++matchcol;
}
+ // match will be pushed to preview_lines, bring it into a proper state
+ current_match.start.col = matchcol;
+ current_match.end.lnum = sub_firstlnum;
+ current_match.end.col = matchcol;
goto skip;
}
@@ -3314,15 +3561,13 @@ void do_sub(exarg_T *eap)
matchcol = regmatch.endpos[0].col;
prev_matchcol = matchcol;
- /*
- * 2. If do_count is set only increase the counter.
- * If do_ask is set, ask for confirmation.
- */
- if (do_count) {
- /* For a multi-line match, put matchcol at the NUL at
- * the end of the line and set nmatch to one, so that
- * we continue looking for a match on the next line.
- * Avoids that ":s/\nB\@=//gc" get stuck. */
+ // 2. If subflags.do_count is set only increase the counter.
+ // If do_ask is set, ask for confirmation.
+ if (subflags.do_count) {
+ // For a multi-line match, put matchcol at the NUL at
+ // the end of the line and set nmatch to one, so that
+ // we continue looking for a match on the next line.
+ // Avoids that ":s/\nB\@=//gc" get stuck.
if (nmatch > 1) {
matchcol = (colnr_T)STRLEN(sub_firstline);
nmatch = 1;
@@ -3336,16 +3581,20 @@ void do_sub(exarg_T *eap)
goto skip;
}
- if (do_ask) {
+ if (subflags.do_ask && !preview) {
int typed = 0;
/* change State to CONFIRM, so that the mouse works
* properly */
- save_State = State;
+ int save_State = State;
State = CONFIRM;
setmouse(); /* disable mouse in xterm */
curwin->w_cursor.col = regmatch.startpos[0].col;
+ if (curwin->w_p_crb) {
+ do_check_cursorbind();
+ }
+
/* When 'cpoptions' contains "u" don't sync undo when
* asking for confirmation. */
if (vim_strchr(p_cpo, CPO_UNDO) != NULL)
@@ -3354,17 +3603,20 @@ void do_sub(exarg_T *eap)
/*
* Loop until 'y', 'n', 'q', CTRL-E or CTRL-Y typed.
*/
- while (do_ask) {
+ while (subflags.do_ask) {
if (exmode_active) {
char_u *resp;
colnr_T sc, ec;
- print_line_no_prefix(lnum, do_number, do_list);
+ print_line_no_prefix(lnum, subflags.do_number, subflags.do_list);
getvcol(curwin, &curwin->w_cursor, &sc, NULL, NULL);
curwin->w_cursor.col = regmatch.endpos[0].col - 1;
+ if (curwin->w_cursor.col < 0) {
+ curwin->w_cursor.col = 0;
+ }
getvcol(curwin, &curwin->w_cursor, NULL, NULL, &ec);
- if (do_number || curwin->w_p_nu) {
+ if (subflags.do_number || curwin->w_p_nu) {
int numw = number_width(curwin) + 1;
sc += numw;
ec += numw;
@@ -3388,7 +3640,7 @@ void do_sub(exarg_T *eap)
curwin->w_p_fen = FALSE;
/* Invert the matched string.
* Remove the inversion afterwards. */
- temp = RedrawingDisabled;
+ int temp = RedrawingDisabled;
RedrawingDisabled = 0;
if (new_start != NULL) {
@@ -3405,7 +3657,7 @@ void do_sub(exarg_T *eap)
// before the cursor.
len_change = (int)STRLEN(new_line) - (int)STRLEN(orig_line);
curwin->w_cursor.col += len_change;
- ml_replace(lnum, new_line, FALSE);
+ ml_replace(lnum, new_line, false);
}
search_match_lines = regmatch.endpos[0].lnum
@@ -3430,7 +3682,7 @@ void do_sub(exarg_T *eap)
msg_no_more = TRUE;
/* write message same highlighting as for
* wait_return */
- smsg_attr(hl_attr(HLF_R),
+ smsg_attr(HL_ATTR(HLF_R),
_("replace with %s (y/n/a/q/l/^E/^Y)?"), sub);
msg_no_more = FALSE;
msg_scroll = i;
@@ -3438,29 +3690,24 @@ void do_sub(exarg_T *eap)
ui_cursor_goto(msg_row, msg_col);
RedrawingDisabled = temp;
- ++no_mapping; /* don't map this key */
- ++allow_keys; /* allow special keys */
+ no_mapping++; // don't map this key
typed = plain_vgetc();
- --allow_keys;
- --no_mapping;
+ no_mapping--;
/* clear the question */
msg_didout = FALSE; /* don't scroll up */
msg_col = 0;
gotocmdline(TRUE);
- /* restore the line */
- if (orig_line != NULL)
- ml_replace(lnum, orig_line, FALSE);
+ // restore the line
+ if (orig_line != NULL) {
+ ml_replace(lnum, orig_line, false);
+ }
}
- need_wait_return = FALSE; /* no hit-return prompt */
- if (typed == 'q' || typed == ESC || typed == Ctrl_C
-#ifdef UNIX
- || typed == intr_char
-#endif
- ) {
- got_quit = TRUE;
+ need_wait_return = false; // no hit-return prompt
+ if (typed == 'q' || typed == ESC || typed == Ctrl_C) {
+ got_quit = true;
break;
}
if (typed == 'n')
@@ -3468,13 +3715,13 @@ void do_sub(exarg_T *eap)
if (typed == 'y')
break;
if (typed == 'l') {
- /* last: replace and then stop */
- do_all = FALSE;
+ // last: replace and then stop
+ subflags.do_all = false;
line2 = lnum;
break;
}
if (typed == 'a') {
- do_ask = FALSE;
+ subflags.do_ask = false;
break;
}
if (typed == Ctrl_E)
@@ -3507,156 +3754,164 @@ void do_sub(exarg_T *eap)
* use "\=col("."). */
curwin->w_cursor.col = regmatch.startpos[0].col;
- /*
- * 3. substitute the string.
- */
- if (do_count) {
- /* prevent accidentally changing the buffer by a function */
- save_ma = curbuf->b_p_ma;
- curbuf->b_p_ma = FALSE;
- sandbox++;
- }
- /* get length of substitution part */
- sublen = vim_regsub_multi(&regmatch,
- sub_firstlnum - regmatch.startpos[0].lnum,
- sub, sub_firstline, FALSE, p_magic, TRUE);
- if (do_count) {
- curbuf->b_p_ma = save_ma;
- sandbox--;
- goto skip;
- }
-
- /* When the match included the "$" of the last line it may
- * go beyond the last line of the buffer. */
+ // When the match included the "$" of the last line it may
+ // go beyond the last line of the buffer.
if (nmatch > curbuf->b_ml.ml_line_count - sub_firstlnum + 1) {
nmatch = curbuf->b_ml.ml_line_count - sub_firstlnum + 1;
- skip_match = TRUE;
+ current_match.end.lnum = sub_firstlnum + nmatch;
+ skip_match = true;
}
- /* Need room for:
- * - result so far in new_start (not for first sub in line)
- * - original text up to match
- * - length of substituted part
- * - original text after match
- */
- if (nmatch == 1)
- p1 = sub_firstline;
- else {
- p1 = ml_get(sub_firstlnum + nmatch - 1);
- nmatch_tl += nmatch - 1;
- }
- copy_len = regmatch.startpos[0].col - copycol;
- needed_len = copy_len + ((unsigned)STRLEN(p1)
- - regmatch.endpos[0].col) + sublen + 1;
- if (new_start == NULL) {
- /*
- * Get some space for a temporary buffer to do the
- * substitution into (and some extra space to avoid
- * too many calls to xmalloc()/free()).
- */
- new_start_len = needed_len + 50;
- new_start = xmalloc(new_start_len);
- *new_start = NUL;
- new_end = new_start;
- } else {
- /*
- * Check if the temporary buffer is long enough to do the
- * substitution into. If not, make it larger (with a bit
- * extra to avoid too many calls to xmalloc()/free()).
- */
- len = (unsigned)STRLEN(new_start);
- needed_len += len;
- if (needed_len > (int)new_start_len) {
- new_start_len = needed_len + 50;
- new_start = xrealloc(new_start, new_start_len);
+#define ADJUST_SUB_FIRSTLNUM() \
+ do { \
+ /* For a multi-line match, make a copy of the last matched */ \
+ /* line and continue in that one. */ \
+ if (nmatch > 1) { \
+ sub_firstlnum += nmatch - 1; \
+ xfree(sub_firstline); \
+ sub_firstline = vim_strsave(ml_get(sub_firstlnum)); \
+ /* When going beyond the last line, stop substituting. */ \
+ if (sub_firstlnum <= line2) { \
+ do_again = true; \
+ } else { \
+ subflags.do_all = false; \
+ } \
+ } \
+ if (skip_match) { \
+ /* Already hit end of the buffer, sub_firstlnum is one */ \
+ /* less than what it ought to be. */ \
+ xfree(sub_firstline); \
+ sub_firstline = vim_strsave((char_u *)""); \
+ copycol = 0; \
+ } \
+ } while (0)
+
+ // Save the line numbers for the preview buffer
+ // NOTE: If the pattern matches a final newline, the next line will
+ // be shown also, but should not be highlighted. Intentional for now.
+ if (preview && !has_second_delim) {
+ current_match.start.col = regmatch.startpos[0].col;
+ if (current_match.end.lnum == 0) {
+ current_match.end.lnum = sub_firstlnum + nmatch - 1;
}
- new_end = new_start + len;
- }
+ current_match.end.col = regmatch.endpos[0].col;
- /*
- * copy the text up to the part that matched
- */
- memmove(new_end, sub_firstline + copycol, (size_t)copy_len);
- new_end += copy_len;
-
- (void)vim_regsub_multi(&regmatch,
- sub_firstlnum - regmatch.startpos[0].lnum,
- sub, new_end, TRUE, p_magic, TRUE);
- sub_nsubs++;
- did_sub = TRUE;
-
- /* Move the cursor to the start of the line, to avoid that it
- * is beyond the end of the line after the substitution. */
- curwin->w_cursor.col = 0;
-
- /* For a multi-line match, make a copy of the last matched
- * line and continue in that one. */
- if (nmatch > 1) {
- sub_firstlnum += nmatch - 1;
- xfree(sub_firstline);
- sub_firstline = vim_strsave(ml_get(sub_firstlnum));
- /* When going beyond the last line, stop substituting. */
- if (sub_firstlnum <= line2)
- do_again = TRUE;
- else
- do_all = FALSE;
- }
+ ADJUST_SUB_FIRSTLNUM();
+ lnum += nmatch - 1;
- /* Remember next character to be copied. */
- copycol = regmatch.endpos[0].col;
-
- if (skip_match) {
- /* Already hit end of the buffer, sub_firstlnum is one
- * less than what it ought to be. */
- xfree(sub_firstline);
- sub_firstline = vim_strsave((char_u *)"");
- copycol = 0;
+ goto skip;
}
- /*
- * Now the trick is to replace CTRL-M chars with a real line
- * break. This would make it impossible to insert a CTRL-M in
- * the text. The line break can be avoided by preceding the
- * CTRL-M with a backslash. To be able to insert a backslash,
- * they must be doubled in the string and are halved here.
- * That is Vi compatible.
- */
- for (p1 = new_end; *p1; ++p1) {
- if (p1[0] == '\\' && p1[1] != NUL) /* remove backslash */
- STRMOVE(p1, p1 + 1);
- else if (*p1 == CAR) {
- if (u_inssub(lnum) == OK) { /* prepare for undo */
- *p1 = NUL; /* truncate up to the CR */
- ml_append(lnum - 1, new_start,
- (colnr_T)(p1 - new_start + 1), FALSE);
- mark_adjust(lnum + 1, (linenr_T)MAXLNUM, 1L, 0L);
- if (do_ask)
- appended_lines(lnum - 1, 1L);
- else {
- if (first_line == 0)
- first_line = lnum;
- last_line = lnum + 1;
+ // 3. Substitute the string. During 'inccommand' preview only do this if
+ // there is a replace pattern.
+ if (!preview || has_second_delim) {
+ if (subflags.do_count) {
+ // prevent accidentally changing the buffer by a function
+ save_ma = curbuf->b_p_ma;
+ curbuf->b_p_ma = false;
+ sandbox++;
+ }
+ // Save flags for recursion. They can change for e.g.
+ // :s/^/\=execute("s#^##gn")
+ subflags_T subflags_save = subflags;
+ // get length of substitution part
+ sublen = vim_regsub_multi(&regmatch,
+ sub_firstlnum - regmatch.startpos[0].lnum,
+ sub, sub_firstline, false, p_magic, true);
+ // Don't keep flags set by a recursive call
+ subflags = subflags_save;
+ if (subflags.do_count) {
+ curbuf->b_p_ma = save_ma;
+ if (sandbox > 0) {
+ sandbox--;
+ }
+ goto skip;
+ }
+
+ // Need room for:
+ // - result so far in new_start (not for first sub in line)
+ // - original text up to match
+ // - length of substituted part
+ // - original text after match
+ if (nmatch == 1) {
+ p1 = sub_firstline;
+ } else {
+ p1 = ml_get(sub_firstlnum + nmatch - 1);
+ nmatch_tl += nmatch - 1;
+ }
+ size_t copy_len = regmatch.startpos[0].col - copycol;
+ new_end = sub_grow_buf(&new_start,
+ (STRLEN(p1) - regmatch.endpos[0].col)
+ + copy_len + sublen + 1);
+
+ // copy the text up to the part that matched
+ memmove(new_end, sub_firstline + copycol, (size_t)copy_len);
+ new_end += copy_len;
+
+ // Finally, at this point we can know where the match actually will
+ // start in the new text
+ current_match.start.col = new_end - new_start;
+
+ (void)vim_regsub_multi(&regmatch,
+ sub_firstlnum - regmatch.startpos[0].lnum,
+ sub, new_end, true, p_magic, true);
+ sub_nsubs++;
+ did_sub = true;
+
+ // Move the cursor to the start of the line, to avoid that it
+ // is beyond the end of the line after the substitution.
+ curwin->w_cursor.col = 0;
+
+ // Remember next character to be copied.
+ copycol = regmatch.endpos[0].col;
+
+ ADJUST_SUB_FIRSTLNUM();
+
+ // Now the trick is to replace CTRL-M chars with a real line
+ // break. This would make it impossible to insert a CTRL-M in
+ // the text. The line break can be avoided by preceding the
+ // CTRL-M with a backslash. To be able to insert a backslash,
+ // they must be doubled in the string and are halved here.
+ // That is Vi compatible.
+ for (p1 = new_end; *p1; p1++) {
+ if (p1[0] == '\\' && p1[1] != NUL) { // remove backslash
+ STRMOVE(p1, p1 + 1);
+ } else if (*p1 == CAR) {
+ if (u_inssub(lnum) == OK) { // prepare for undo
+ *p1 = NUL; // truncate up to the CR
+ ml_append(lnum - 1, new_start,
+ (colnr_T)(p1 - new_start + 1), false);
+ mark_adjust(lnum + 1, (linenr_T)MAXLNUM, 1L, 0L, false);
+ if (subflags.do_ask) {
+ appended_lines(lnum - 1, 1L);
+ } else {
+ if (first_line == 0) {
+ first_line = lnum;
+ }
+ last_line = lnum + 1;
+ }
+ // All line numbers increase.
+ sub_firstlnum++;
+ lnum++;
+ line2++;
+ // move the cursor to the new line, like Vi
+ curwin->w_cursor.lnum++;
+ // copy the rest
+ STRMOVE(new_start, p1 + 1);
+ p1 = new_start - 1;
}
- /* All line numbers increase. */
- ++sub_firstlnum;
- ++lnum;
- ++line2;
- /* move the cursor to the new line, like Vi */
- ++curwin->w_cursor.lnum;
- /* copy the rest */
- STRMOVE(new_start, p1 + 1);
- p1 = new_start - 1;
+ } else if (has_mbyte) {
+ p1 += (*mb_ptr2len)(p1) - 1;
}
- } else if (has_mbyte)
- p1 += (*mb_ptr2len)(p1) - 1;
+ }
+ current_match.end.col = STRLEN(new_start);
+ current_match.end.lnum = lnum;
}
- /*
- * 4. If do_all is set, find next match.
- * Prevent endless loop with patterns that match empty
- * strings, e.g. :s/$/pat/g or :s/[a-z]* /(&)/g.
- * But ":s/\n/#/" is OK.
- */
+ // 4. If subflags.do_all is set, find next match.
+ // Prevent endless loop with patterns that match empty
+ // strings, e.g. :s/$/pat/g or :s/[a-z]* /(&)/g.
+ // But ":s/\n/#/" is OK.
skip:
/* We already know that we did the last subst when we are at
* the end of the line, except that a pattern like
@@ -3667,7 +3922,7 @@ skip:
|| got_int
|| got_quit
|| lnum > line2
- || !(do_all || do_again)
+ || !(subflags.do_all || do_again)
|| (sub_firstline[matchcol] == NUL && nmatch <= 1
&& !re_multiline(regmatch.regprog)));
nmatch = -1;
@@ -3700,9 +3955,10 @@ skip:
prev_matchcol = (colnr_T)STRLEN(sub_firstline)
- prev_matchcol;
- if (u_savesub(lnum) != OK)
+ if (u_savesub(lnum) != OK) {
break;
- ml_replace(lnum, new_start, TRUE);
+ }
+ ml_replace(lnum, new_start, true);
if (nmatch_tl > 0) {
/*
@@ -3717,21 +3973,23 @@ skip:
for (i = 0; i < nmatch_tl; ++i)
ml_delete(lnum, (int)FALSE);
mark_adjust(lnum, lnum + nmatch_tl - 1,
- (long)MAXLNUM, -nmatch_tl);
- if (do_ask)
+ (long)MAXLNUM, -nmatch_tl, false);
+ if (subflags.do_ask) {
deleted_lines(lnum, nmatch_tl);
- --lnum;
- line2 -= nmatch_tl; /* nr of lines decreases */
+ }
+ lnum--;
+ line2 -= nmatch_tl; // nr of lines decreases
nmatch_tl = 0;
}
/* When asking, undo is saved each time, must also set
* changed flag each time. */
- if (do_ask)
+ if (subflags.do_ask) {
changed_bytes(lnum, 0);
- else {
- if (first_line == 0)
+ } else {
+ if (first_line == 0) {
first_line = lnum;
+ }
last_line = lnum + 1;
}
@@ -3757,9 +4015,30 @@ skip:
* found the match. */
if (nmatch == -1)
lnum -= regmatch.startpos[0].lnum;
+
+#define PUSH_PREVIEW_LINES() \
+ do { \
+ linenr_T match_lines = current_match.end.lnum \
+ - current_match.start.lnum +1; \
+ if (preview_lines.subresults.size > 0) { \
+ linenr_T last = kv_last(preview_lines.subresults).end.lnum; \
+ if (last == current_match.start.lnum) { \
+ preview_lines.lines_needed += match_lines - 1; \
+ } \
+ } else { \
+ preview_lines.lines_needed += match_lines; \
+ } \
+ kv_push(preview_lines.subresults, current_match); \
+ } while (0)
+
+ // Push the match to preview_lines.
+ PUSH_PREVIEW_LINES();
+
break;
}
}
+ // Push the match to preview_lines.
+ PUSH_PREVIEW_LINES();
line_breakcheck();
}
@@ -3772,6 +4051,10 @@ skip:
}
line_breakcheck();
+
+ if (profile_passed_limit(timeout)) {
+ got_quit = true;
+ }
}
if (first_line != 0) {
@@ -3779,14 +4062,22 @@ skip:
* the line number before the change (same as adding the number of
* deleted lines). */
i = curbuf->b_ml.ml_line_count - old_line_count;
- changed_lines(first_line, 0, last_line - i, i);
+ changed_lines(first_line, 0, last_line - i, i, false);
+
+ if (kv_size(curbuf->update_channels)) {
+ int64_t num_added = last_line - first_line;
+ int64_t num_removed = num_added - i;
+ buf_updates_send_changes(curbuf, first_line, num_added, num_removed,
+ do_buf_event);
+ }
}
xfree(sub_firstline); /* may have to free allocated copy of the line */
- /* ":s/pat//n" doesn't move the cursor */
- if (do_count)
+ // ":s/pat//n" doesn't move the cursor
+ if (subflags.do_count) {
curwin->w_cursor = old_cursor;
+ }
if (sub_nsubs > start_nsubs) {
/* Set the '[ and '] marks. */
@@ -3795,28 +4086,37 @@ skip:
curbuf->b_op_start.col = curbuf->b_op_end.col = 0;
if (!global_busy) {
- if (!do_ask) { /* when interactive leave cursor on the match */
- if (endcolumn)
+ // when interactive leave cursor on the match
+ if (!subflags.do_ask) {
+ if (endcolumn) {
coladvance((colnr_T)MAXCOL);
- else
+ } else {
beginline(BL_WHITE | BL_FIX);
+ }
}
- if (!do_sub_msg(do_count) && do_ask)
+ if (!preview && !do_sub_msg(subflags.do_count) && subflags.do_ask) {
MSG("");
- } else
- global_need_beginline = TRUE;
- if (do_print)
- print_line(curwin->w_cursor.lnum, do_number, do_list);
+ }
+ } else {
+ global_need_beginline = true;
+ }
+ if (subflags.do_print) {
+ print_line(curwin->w_cursor.lnum, subflags.do_number, subflags.do_list);
+ }
} else if (!global_busy) {
- if (got_int) /* interrupted */
+ if (got_int) {
+ // interrupted
EMSG(_(e_interr));
- else if (got_match) /* did find something but nothing substituted */
+ } else if (got_match) {
+ // did find something but nothing substituted
MSG("");
- else if (do_error) /* nothing found */
+ } else if (subflags.do_error) {
+ // nothing found
EMSG2(_(e_patnotf2), get_search_pat());
+ }
}
- if (do_ask && hasAnyFolding(curwin)) {
+ if (subflags.do_ask && hasAnyFolding(curwin)) {
// Cursor position may require updating
changed_window_setting();
}
@@ -3824,9 +4124,40 @@ skip:
vim_regfree(regmatch.regprog);
// Restore the flag values, they can be used for ":&&".
- do_all = save_do_all;
- do_ask = save_do_ask;
-}
+ subflags.do_all = save_do_all;
+ subflags.do_ask = save_do_ask;
+
+ // Show 'inccommand' preview if there are matched lines.
+ buf_T *preview_buf = NULL;
+ size_t subsize = preview_lines.subresults.size;
+ if (preview && !aborting()) {
+ if (got_quit) { // Substitution is too slow, disable 'inccommand'.
+ set_string_option_direct((char_u *)"icm", -1, (char_u *)"", OPT_FREE,
+ SID_NONE);
+ } else if (*p_icm != NUL && pat != NULL) {
+ if (pre_src_id == 0) {
+ // Get a unique new src_id, saved in a static
+ pre_src_id = bufhl_add_hl(NULL, 0, -1, 0, 0, 0);
+ }
+ if (pre_hl_id == 0) {
+ pre_hl_id = syn_check_group((char_u *)S_LEN("Substitute"));
+ }
+ curbuf->b_changed = save_b_changed; // preserve 'modified' during preview
+ preview_buf = show_sub(eap, old_cursor, &preview_lines,
+ pre_hl_id, pre_src_id);
+ if (subsize > 0) {
+ bufhl_clear_line_range(orig_buf, pre_src_id, eap->line1,
+ kv_last(preview_lines.subresults).end.lnum);
+ }
+ }
+ }
+
+ kv_destroy(preview_lines.subresults);
+
+ return preview_buf;
+#undef ADJUST_SUB_FIRSTLNUM
+#undef PUSH_PREVIEW_LINES
+} // NOLINT(readability/fn_size)
/*
* Give message for number of substitutions.
@@ -3877,6 +4208,17 @@ do_sub_msg (
return false;
}
+static void global_exe_one(char_u *const cmd, const linenr_T lnum)
+{
+ curwin->w_cursor.lnum = lnum;
+ curwin->w_cursor.col = 0;
+ if (*cmd == NUL || *cmd == '\n') {
+ do_cmdline((char_u *)"p", NULL, NULL, DOCMD_NOWAIT);
+ } else {
+ do_cmdline(cmd, NULL, NULL, DOCMD_NOWAIT);
+ }
+}
+
/*
* Execute a global command of the form:
*
@@ -3906,8 +4248,12 @@ void ex_global(exarg_T *eap)
int match;
int which_pat;
- if (global_busy) {
- EMSG(_("E147: Cannot do :global recursive")); /* will increment global_busy */
+ // When nesting the command works on one line. This allows for
+ // ":g/found/v/notfound/command".
+ if (global_busy && (eap->line1 != 1
+ || eap->line2 != curbuf->b_ml.ml_line_count)) {
+ // will increment global_busy to break out of the loop
+ EMSG(_("E147: Cannot do :global recursive with a range"));
return;
}
@@ -3956,95 +4302,97 @@ void ex_global(exarg_T *eap)
return;
}
- /*
- * pass 1: set marks for each (not) matching line
- */
- for (lnum = eap->line1; lnum <= eap->line2 && !got_int; ++lnum) {
- /* a match on this line? */
+ if (global_busy) {
+ lnum = curwin->w_cursor.lnum;
match = vim_regexec_multi(&regmatch, curwin, curbuf, lnum,
- (colnr_T)0, NULL);
+ (colnr_T)0, NULL);
if ((type == 'g' && match) || (type == 'v' && !match)) {
- ml_setmarked(lnum);
- ndone++;
+ global_exe_one(cmd, lnum);
+ }
+ } else {
+ // pass 1: set marks for each (not) matching line
+ for (lnum = eap->line1; lnum <= eap->line2 && !got_int; lnum++) {
+ // a match on this line?
+ match = vim_regexec_multi(&regmatch, curwin, curbuf, lnum,
+ (colnr_T)0, NULL);
+ if ((type == 'g' && match) || (type == 'v' && !match)) {
+ ml_setmarked(lnum);
+ ndone++;
+ }
+ line_breakcheck();
}
- line_breakcheck();
- }
- /*
- * pass 2: execute the command for each line that has been marked
- */
- if (got_int)
- MSG(_(e_interr));
- else if (ndone == 0) {
- if (type == 'v') {
- smsg(_("Pattern found in every line: %s"), pat);
+ // pass 2: execute the command for each line that has been marked
+ if (got_int) {
+ MSG(_(e_interr));
+ } else if (ndone == 0) {
+ if (type == 'v') {
+ smsg(_("Pattern found in every line: %s"), pat);
+ } else {
+ smsg(_("Pattern not found: %s"), pat);
+ }
} else {
- smsg(_("Pattern not found: %s"), pat);
+ global_exe(cmd);
}
- } else {
- start_global_changes();
- global_exe(cmd);
- end_global_changes();
+ ml_clearmarked(); // clear rest of the marks
}
- ml_clearmarked(); /* clear rest of the marks */
vim_regfree(regmatch.regprog);
}
-/*
- * Execute "cmd" on lines marked with ml_setmarked().
- */
+/// Execute `cmd` on lines marked with ml_setmarked().
void global_exe(char_u *cmd)
{
- linenr_T old_lcount; /* b_ml.ml_line_count before the command */
- buf_T *old_buf = curbuf; /* remember what buffer we started in */
- linenr_T lnum; /* line number according to old situation */
-
- /*
- * Set current position only once for a global command.
- * If global_busy is set, setpcmark() will not do anything.
- * If there is an error, global_busy will be incremented.
- */
+ linenr_T old_lcount; // b_ml.ml_line_count before the command
+ buf_T *old_buf = curbuf; // remember what buffer we started in
+ linenr_T lnum; // line number according to old situation
+ int save_mapped_ctrl_c = mapped_ctrl_c;
+
+ // Set current position only once for a global command.
+ // If global_busy is set, setpcmark() will not do anything.
+ // If there is an error, global_busy will be incremented.
setpcmark();
- /* When the command writes a message, don't overwrite the command. */
- msg_didout = TRUE;
+ // When the command writes a message, don't overwrite the command.
+ msg_didout = true;
+ // Disable CTRL-C mapping, let it interrupt (potentially long output).
+ mapped_ctrl_c = 0;
sub_nsubs = 0;
sub_nlines = 0;
- global_need_beginline = FALSE;
+ global_need_beginline = false;
global_busy = 1;
old_lcount = curbuf->b_ml.ml_line_count;
+
while (!got_int && (lnum = ml_firstmarked()) != 0 && global_busy == 1) {
- curwin->w_cursor.lnum = lnum;
- curwin->w_cursor.col = 0;
- if (*cmd == NUL || *cmd == '\n')
- do_cmdline((char_u *)"p", NULL, NULL, DOCMD_NOWAIT);
- else
- do_cmdline(cmd, NULL, NULL, DOCMD_NOWAIT);
+ global_exe_one(cmd, lnum);
os_breakcheck();
}
+ mapped_ctrl_c = save_mapped_ctrl_c;
global_busy = 0;
- if (global_need_beginline)
+ if (global_need_beginline) {
beginline(BL_WHITE | BL_FIX);
- else
- check_cursor(); /* cursor may be beyond the end of the line */
+ } else {
+ check_cursor(); // cursor may be beyond the end of the line
+ }
- /* the cursor may not have moved in the text but a change in a previous
- * line may move it on the screen */
+ // the cursor may not have moved in the text but a change in a previous
+ // line may move it on the screen
changed_line_abv_curs();
- /* If it looks like no message was written, allow overwriting the
- * command with the report for number of changes. */
- if (msg_col == 0 && msg_scrolled == 0)
- msg_didout = FALSE;
+ // If it looks like no message was written, allow overwriting the
+ // command with the report for number of changes.
+ if (msg_col == 0 && msg_scrolled == 0) {
+ msg_didout = false;
+ }
- /* If substitutes done, report number of substitutes, otherwise report
- * number of extra or deleted lines.
- * Don't report extra or deleted lines in the edge case where the buffer
- * we are in after execution is different from the buffer we started in. */
- if (!do_sub_msg(false) && curbuf == old_buf)
+ // If substitutes done, report number of substitutes, otherwise report
+ // number of extra or deleted lines.
+ // Don't report extra or deleted lines in the edge case where the buffer
+ // we are in after execution is different from the buffer we started in.
+ if (!do_sub_msg(false) && curbuf == old_buf) {
msgmore(curbuf->b_ml.ml_line_count - old_lcount);
+ }
}
#if defined(EXITFREE)
@@ -4116,7 +4464,7 @@ void ex_help(exarg_T *eap)
buf_T *buf;
int len;
char_u *lang;
- int old_KeyTyped = KeyTyped;
+ const bool old_KeyTyped = KeyTyped;
if (eap != NULL) {
/*
@@ -4188,22 +4536,25 @@ void ex_help(exarg_T *eap)
* Re-use an existing help window or open a new one.
* Always open a new one for ":tab help".
*/
- if (!curwin->w_buffer->b_help
+ if (!bt_help(curwin->w_buffer)
|| cmdmod.tab != 0
) {
- if (cmdmod.tab != 0)
+ if (cmdmod.tab != 0) {
wp = NULL;
- else
- for (wp = firstwin; wp != NULL; wp = wp->w_next)
- if (wp->w_buffer != NULL && wp->w_buffer->b_help)
+ } else {
+ wp = NULL;
+ FOR_ALL_WINDOWS_IN_TAB(wp2, curtab) {
+ if (bt_help(wp2->w_buffer)) {
+ wp = wp2;
break;
- if (wp != NULL && wp->w_buffer->b_nwindows > 0)
+ }
+ }
+ }
+ if (wp != NULL && wp->w_buffer->b_nwindows > 0) {
win_enter(wp, true);
- else {
- /*
- * There is no help window yet.
- * Try to open the file specified by the "helpfile" option.
- */
+ } else {
+ // There is no help window yet.
+ // Try to open the file specified by the "helpfile" option.
if ((helpfd = mch_fopen((char *)p_hf, READBIN)) == NULL) {
smsg(_("Sorry, help file \"%s\" not found"), p_hf);
goto erret;
@@ -4294,11 +4645,11 @@ char_u *check_help_lang(char_u *arg)
* Assumption is made that the matched_string passed has already been found to
* match some string for which help is requested. webb.
*/
-int
-help_heuristic (
+int
+help_heuristic(
char_u *matched_string,
- int offset, /* offset for match */
- int wrong_case /* no matching case */
+ int offset, // offset for match
+ int wrong_case // no matching case
)
{
int num_letters;
@@ -4346,47 +4697,66 @@ static int help_compare(const void *s1, const void *s2)
return strcmp(p1, p2);
}
-/*
- * Find all help tags matching "arg", sort them and return in matches[], with
- * the number of matches in num_matches.
- * The matches will be sorted with a "best" match algorithm.
- * When "keep_lang" is TRUE try keeping the language of the current buffer.
- */
-int find_help_tags(char_u *arg, int *num_matches, char_u ***matches, int keep_lang)
+// Find all help tags matching "arg", sort them and return in matches[], with
+// the number of matches in num_matches.
+// The matches will be sorted with a "best" match algorithm.
+// When "keep_lang" is true try keeping the language of the current buffer.
+int find_help_tags(const char_u *arg, int *num_matches, char_u ***matches,
+ bool keep_lang)
{
- char_u *s, *d;
int i;
- static char *(mtable[]) = {"*", "g*", "[*", "]*",
- "/*", "/\\*", "\"*", "**",
- "/\\(\\)", "/\\%(\\)",
- "?", ":?", "?<CR>", "g?", "g?g?", "g??", "z?",
- "/\\?", "/\\z(\\)", "\\=", ":s\\=",
- "[count]", "[quotex]", "[range]",
- "[pattern]", "\\|", "\\%$",
- "s/\\~", "s/\\U", "s/\\L",
- "s/\\1", "s/\\2", "s/\\3", "s/\\9"};
- static char *(rtable[]) = {"star", "gstar", "[star", "]star",
- "/star", "/\\\\star", "quotestar", "starstar",
- "/\\\\(\\\\)", "/\\\\%(\\\\)",
- "?", ":?", "?<CR>", "g?", "g?g?", "g??", "z?",
- "/\\\\?", "/\\\\z(\\\\)", "\\\\=", ":s\\\\=",
- "\\[count]", "\\[quotex]", "\\[range]",
- "\\[pattern]", "\\\\bar", "/\\\\%\\$",
- "s/\\\\\\~", "s/\\\\U", "s/\\\\L",
- "s/\\\\1", "s/\\\\2", "s/\\\\3", "s/\\\\9"};
- int flags;
-
- d = IObuff; /* assume IObuff is long enough! */
-
- /*
- * Recognize a few exceptions to the rule. Some strings that contain '*'
- * with "star". Otherwise '*' is recognized as a wildcard.
- */
- for (i = (int)ARRAY_SIZE(mtable); --i >= 0; )
- if (STRCMP(arg, mtable[i]) == 0) {
- STRCPY(d, rtable[i]);
- break;
+ static const char *(mtable[]) = {
+ "*", "g*", "[*", "]*",
+ "/*", "/\\*", "\"*", "**",
+ "/\\(\\)", "/\\%(\\)",
+ "?", ":?", "?<CR>", "g?", "g?g?", "g??",
+ "-?", "q?", "v_g?",
+ "/\\?", "/\\z(\\)", "\\=", ":s\\=",
+ "[count]", "[quotex]",
+ "[range]", ":[range]",
+ "[pattern]", "\\|", "\\%$",
+ "s/\\~", "s/\\U", "s/\\L",
+ "s/\\1", "s/\\2", "s/\\3", "s/\\9"
+ };
+ static const char *(rtable[]) = {
+ "star", "gstar", "[star", "]star",
+ "/star", "/\\\\star", "quotestar", "starstar",
+ "/\\\\(\\\\)", "/\\\\%(\\\\)",
+ "?", ":?", "?<CR>", "g?", "g?g?", "g??",
+ "-?", "q?", "v_g?",
+ "/\\\\?", "/\\\\z(\\\\)", "\\\\=", ":s\\\\=",
+ "\\[count]", "\\[quotex]",
+ "\\[range]", ":\\[range]",
+ "\\[pattern]", "\\\\bar", "/\\\\%\\$",
+ "s/\\\\\\~", "s/\\\\U", "s/\\\\L",
+ "s/\\\\1", "s/\\\\2", "s/\\\\3", "s/\\\\9"
+ };
+ static const char *(expr_table[]) = {
+ "!=?", "!~?", "<=?", "<?", "==?", "=~?",
+ ">=?", ">?", "is?", "isnot?"
+ };
+ char_u *d = IObuff; // assume IObuff is long enough!
+
+ if (STRNICMP(arg, "expr-", 5) == 0) {
+ // When the string starting with "expr-" and containing '?' and matches
+ // the table, it is taken literally. Otherwise '?' is recognized as a
+ // wildcard.
+ for (i = (int)ARRAY_SIZE(expr_table); --i >= 0; ) {
+ if (STRCMP(arg + 5, expr_table[i]) == 0) {
+ STRCPY(d, arg);
+ break;
+ }
+ }
+ } else {
+ // Recognize a few exceptions to the rule. Some strings that contain
+ // '*' with "star". Otherwise '*' is recognized as a wildcard.
+ for (i = (int)ARRAY_SIZE(mtable); --i >= 0; ) {
+ if (STRCMP(arg, mtable[i]) == 0) {
+ STRCPY(d, rtable[i]);
+ break;
+ }
}
+ }
if (i < 0) { /* no match in table */
/* Replace "\S" with "/\\S", etc. Otherwise every tag is matched.
@@ -4418,7 +4788,7 @@ int find_help_tags(char_u *arg, int *num_matches, char_u ***matches, int keep_la
if (*arg == '(' && arg[1] == '\'') {
arg++;
}
- for (s = arg; *s; s++) {
+ for (const char_u *s = arg; *s; s++) {
// Replace "|" with "bar" and '"' with "quote" to match the name of
// the tags for these commands.
// Replace "*" with ".*" and "?" with "." to match command line
@@ -4494,12 +4864,15 @@ int find_help_tags(char_u *arg, int *num_matches, char_u ***matches, int keep_la
break;
}
- /*
- * If tag starts with ', toss everything after a second '. Fixes
- * CTRL-] on 'option'. (would include the trailing '.').
- */
- if (*s == '\'' && s > arg && *arg == '\'')
+ // If tag starts with ', toss everything after a second '. Fixes
+ // CTRL-] on 'option'. (would include the trailing '.').
+ if (*s == '\'' && s > arg && *arg == '\'') {
break;
+ }
+ // Also '{' and '}'. Fixes CTRL-] on '{address}'.
+ if (*s == '}' && s > arg && *arg == '{') {
+ break;
+ }
}
*d = NUL;
@@ -4524,9 +4897,10 @@ int find_help_tags(char_u *arg, int *num_matches, char_u ***matches, int keep_la
*matches = (char_u **)"";
*num_matches = 0;
- flags = TAG_HELP | TAG_REGEXP | TAG_NAMES | TAG_VERBOSE;
- if (keep_lang)
+ int flags = TAG_HELP | TAG_REGEXP | TAG_NAMES | TAG_VERBOSE;
+ if (keep_lang) {
flags |= TAG_KEEP_LANG;
+ }
if (find_tags(IObuff, num_matches, matches, flags, (int)MAXCOL, NULL) == OK
&& *num_matches > 0) {
/* Sort the matches found on the heuristic number that is after the
@@ -4588,19 +4962,19 @@ void fix_help_buffer(void)
{
linenr_T lnum;
char_u *line;
- int in_example = FALSE;
- int len;
- char_u *fname;
- char_u *p;
- char_u *rt;
+ bool in_example = false;
- /* set filetype to "help". */
- set_option_value((char_u *)"ft", 0L, (char_u *)"help", OPT_LOCAL);
+ // Set filetype to "help".
+ if (STRCMP(curbuf->b_p_ft, "help") != 0) {
+ curbuf_lock++;
+ set_option_value("ft", 0L, "help", OPT_LOCAL);
+ curbuf_lock--;
+ }
if (!syntax_present(curwin)) {
- for (lnum = 1; lnum <= curbuf->b_ml.ml_line_count; ++lnum) {
- line = ml_get_buf(curbuf, lnum, FALSE);
- len = (int)STRLEN(line);
+ for (lnum = 1; lnum <= curbuf->b_ml.ml_line_count; lnum++) {
+ line = ml_get_buf(curbuf, lnum, false);
+ const size_t len = STRLEN(line);
if (in_example && len > 0 && !ascii_iswhite(line[0])) {
/* End of example: non-white or '<' in first column. */
if (line[0] == '<') {
@@ -4608,14 +4982,14 @@ void fix_help_buffer(void)
line = ml_get_buf(curbuf, lnum, TRUE);
line[0] = ' ';
}
- in_example = FALSE;
+ in_example = false;
}
if (!in_example && len > 0) {
if (line[len - 1] == '>' && (len == 1 || line[len - 2] == ' ')) {
/* blank-out a '>' in the last column (start of example) */
line = ml_get_buf(curbuf, lnum, TRUE);
line[len - 1] = ' ';
- in_example = TRUE;
+ in_example = true;
} else if (line[len - 1] == '~') {
/* blank-out a '~' at the end of line (header marker) */
line = ml_get_buf(curbuf, lnum, TRUE);
@@ -4629,7 +5003,7 @@ void fix_help_buffer(void)
* In the "help.txt" and "help.abx" file, add the locally added help
* files. This uses the very first line in the help file.
*/
- fname = path_tail(curbuf->b_fname);
+ char_u *const fname = path_tail(curbuf->b_fname);
if (fnamecmp(fname, "help.txt") == 0
|| (fnamencmp(fname, "help.", 5) == 0
&& ASCII_ISALPHA(fname[5])
@@ -4644,22 +5018,25 @@ void fix_help_buffer(void)
/* Go through all directories in 'runtimepath', skipping
* $VIMRUNTIME. */
- p = p_rtp;
+ char_u *p = p_rtp;
while (*p != NUL) {
copy_option_part(&p, NameBuff, MAXPATHL, ",");
- rt = (char_u *)vim_getenv("VIMRUNTIME");
- if (path_full_compare(rt, NameBuff, FALSE) != kEqualFiles) {
+ char_u *const rt = (char_u *)vim_getenv("VIMRUNTIME");
+ if (rt != NULL
+ && path_full_compare(rt, NameBuff, false) != kEqualFiles) {
int fcount;
char_u **fnames;
- FILE *fd;
char_u *s;
- int fi;
vimconv_T vc;
char_u *cp;
- /* Find all "doc/ *.txt" files in this directory. */
- add_pathsep((char *)NameBuff);
- STRCAT(NameBuff, "doc/*.??[tx]");
+ // Find all "doc/ *.txt" files in this directory.
+ if (!add_pathsep((char *)NameBuff)
+ || STRLCAT(NameBuff, "doc/*.??[tx]",
+ sizeof(NameBuff)) >= MAXPATHL) {
+ EMSG(_(e_fnametoolong));
+ continue;
+ }
// Note: We cannot just do `&NameBuff` because it is a statically sized array
// so `NameBuff == &NameBuff` according to C semantics.
@@ -4667,31 +5044,25 @@ void fix_help_buffer(void)
if (gen_expand_wildcards(1, buff_list, &fcount,
&fnames, EW_FILE|EW_SILENT) == OK
&& fcount > 0) {
- int i1;
- int i2;
- char_u *f1;
- char_u *f2;
- char_u *t1;
- char_u *e1;
- char_u *e2;
-
- /* If foo.abx is found use it instead of foo.txt in
- * the same directory. */
- for (i1 = 0; i1 < fcount; ++i1) {
- for (i2 = 0; i2 < fcount; ++i2) {
- if (i1 == i2)
+ // If foo.abx is found use it instead of foo.txt in
+ // the same directory.
+ for (int i1 = 0; i1 < fcount; i1++) {
+ for (int i2 = 0; i2 < fcount; i2++) {
+ if (i1 == i2) {
continue;
- if (fnames[i1] == NULL || fnames[i2] == NULL)
- continue;
- f1 = fnames[i1];
- f2 = fnames[i2];
- t1 = path_tail(f1);
- if (fnamencmp(f1, f2, t1 - f1) != 0)
+ }
+ if (fnames[i1] == NULL || fnames[i2] == NULL) {
continue;
- e1 = vim_strrchr(t1, '.');
- e2 = vim_strrchr(path_tail(f2), '.');
- if (e1 == NUL || e2 == NUL)
+ }
+ const char_u *const f1 = fnames[i1];
+ const char_u *const f2 = fnames[i2];
+ const char_u *const t1 = path_tail(f1);
+ const char_u *const t2 = path_tail(f2);
+ const char_u *const e1 = STRRCHR(t1, '.');
+ const char_u *const e2 = STRRCHR(t2, '.');
+ if (e1 == NULL || e2 == NULL) {
continue;
+ }
if (fnamecmp(e1, ".txt") != 0
&& fnamecmp(e1, fname + 4) != 0) {
/* Not .txt and not .abx, remove it. */
@@ -4699,8 +5070,10 @@ void fix_help_buffer(void)
fnames[i1] = NULL;
continue;
}
- if (fnamencmp(f1, f2, e1 - f1) != 0)
+ if (e1 - f1 != e2 - f2
+ || fnamencmp(f1, f2, e1 - f1) != 0) {
continue;
+ }
if (fnamecmp(e1, ".txt") == 0
&& fnamecmp(e2, fname + 4) == 0) {
/* use .abx instead of .txt */
@@ -4709,10 +5082,12 @@ void fix_help_buffer(void)
}
}
}
- for (fi = 0; fi < fcount; ++fi) {
- if (fnames[fi] == NULL)
+ for (int fi = 0; fi < fcount; fi++) {
+ if (fnames[fi] == NULL) {
continue;
- fd = mch_fopen((char *)fnames[fi], "r");
+ }
+
+ FILE *const fd = mch_fopen((char *)fnames[fi], "r");
if (fd == NULL) {
continue;
}
@@ -4720,9 +5095,9 @@ void fix_help_buffer(void)
if (IObuff[0] == '*'
&& (s = vim_strchr(IObuff + 1, '*'))
!= NULL) {
- int this_utf = MAYBE;
- /* Change tag definition to a
- * reference and remove <CR>/<NL>. */
+ TriState this_utf = kNone;
+ // Change tag definition to a
+ // reference and remove <CR>/<NL>.
IObuff[0] = '|';
*s = '|';
while (*s != NUL) {
@@ -4732,13 +5107,12 @@ void fix_help_buffer(void)
* above 127 is found and no
* illegal byte sequence is found.
*/
- if (*s >= 0x80 && this_utf != FALSE) {
- int l;
-
- this_utf = TRUE;
- l = utf_ptr2len(s);
- if (l == 1)
- this_utf = FALSE;
+ if (*s >= 0x80 && this_utf != kFalse) {
+ this_utf = kTrue;
+ const int l = utf_ptr2len(s);
+ if (l == 1) {
+ this_utf = kFalse;
+ }
s += l - 1;
}
++s;
@@ -4747,18 +5121,20 @@ void fix_help_buffer(void)
* conversion to the current
* 'encoding' may be required. */
vc.vc_type = CONV_NONE;
- convert_setup(&vc, (char_u *)(
- this_utf == TRUE ? "utf-8"
- : "latin1"), p_enc);
- if (vc.vc_type == CONV_NONE)
- /* No conversion needed. */
+ convert_setup(
+ &vc,
+ (char_u *)(this_utf == kTrue ? "utf-8" : "latin1"),
+ p_enc);
+ if (vc.vc_type == CONV_NONE) {
+ // No conversion needed.
cp = IObuff;
- else {
- /* Do the conversion. If it fails
- * use the unconverted text. */
+ } else {
+ // Do the conversion. If it fails
+ // use the unconverted text.
cp = string_convert(&vc, IObuff, NULL);
- if (cp == NULL)
+ if (cp == NULL) {
cp = IObuff;
+ }
}
convert_setup(&vc, NULL, NULL);
@@ -4803,28 +5179,25 @@ void ex_viusage(exarg_T *eap)
/// @param tagname Name of the tags file ("tags" for English, "tags-fr" for
/// French)
/// @param add_help_tags Whether to add the "help-tags" tag
-static void helptags_one(char_u *dir, char_u *ext, char_u *tagfname,
- bool add_help_tags)
+static void helptags_one(char_u *const dir, const char_u *const ext,
+ const char_u *const tagfname, const bool add_help_tags)
{
- FILE *fd_tags;
- FILE *fd;
garray_T ga;
int filecount;
char_u **files;
char_u *p1, *p2;
- int fi;
char_u *s;
- char_u *fname;
- int utf8 = MAYBE;
- int this_utf8;
- int firstline;
- int mix = FALSE; /* detected mixed encodings */
+ TriState utf8 = kNone;
+ bool mix = false; // detected mixed encodings
// Find all *.txt files.
- size_t dirlen = STRLEN(dir);
- STRCPY(NameBuff, dir);
- STRCAT(NameBuff, "/**/*");
- STRCAT(NameBuff, ext);
+ size_t dirlen = STRLCPY(NameBuff, dir, sizeof(NameBuff));
+ if (dirlen >= MAXPATHL
+ || STRLCAT(NameBuff, "/**/*", sizeof(NameBuff)) >= MAXPATHL // NOLINT
+ || STRLCAT(NameBuff, ext, sizeof(NameBuff)) >= MAXPATHL) {
+ EMSG(_(e_fnametoolong));
+ return;
+ }
// Note: We cannot just do `&NameBuff` because it is a statically sized array
// so `NameBuff == &NameBuff` according to C semantics.
@@ -4832,19 +5205,24 @@ static void helptags_one(char_u *dir, char_u *ext, char_u *tagfname,
if (gen_expand_wildcards(1, buff_list, &filecount, &files,
EW_FILE|EW_SILENT) == FAIL
|| filecount == 0) {
- if (!got_int)
- EMSG2("E151: No match: %s", NameBuff);
+ if (!got_int) {
+ EMSG2(_("E151: No match: %s"), NameBuff);
+ }
return;
}
- /*
- * Open the tags file for writing.
- * Do this before scanning through all the files.
- */
- STRCPY(NameBuff, dir);
- add_pathsep((char *)NameBuff);
- STRNCAT(NameBuff, tagfname, sizeof(NameBuff) - dirlen - 2);
- fd_tags = mch_fopen((char *)NameBuff, "w");
+ //
+ // Open the tags file for writing.
+ // Do this before scanning through all the files.
+ //
+ memcpy(NameBuff, dir, dirlen + 1);
+ if (!add_pathsep((char *)NameBuff)
+ || STRLCAT(NameBuff, tagfname, sizeof(NameBuff)) >= MAXPATHL) {
+ EMSG(_(e_fnametoolong));
+ return;
+ }
+
+ FILE *const fd_tags = mch_fopen((char *)NameBuff, "w");
if (fd_tags == NULL) {
EMSG2(_("E152: Cannot open %s for writing"), NameBuff);
FreeWild(filecount, files);
@@ -4856,8 +5234,9 @@ static void helptags_one(char_u *dir, char_u *ext, char_u *tagfname,
* add the "help-tags" tag.
*/
ga_init(&ga, (int)sizeof(char_u *), 100);
- if (add_help_tags || path_full_compare((char_u *)"$VIMRUNTIME/doc",
- dir, FALSE) == kEqualFiles) {
+ if (add_help_tags
+ || path_full_compare((char_u *)"$VIMRUNTIME/doc",
+ dir, false) == kEqualFiles) {
s = xmalloc(18 + STRLEN(tagfname));
sprintf((char *)s, "help-tags\t%s\t1\n", tagfname);
GA_APPEND(char_u *, &ga, s);
@@ -4866,55 +5245,54 @@ static void helptags_one(char_u *dir, char_u *ext, char_u *tagfname,
/*
* Go over all the files and extract the tags.
*/
- for (fi = 0; fi < filecount && !got_int; ++fi) {
- fd = mch_fopen((char *)files[fi], "r");
+ for (int fi = 0; fi < filecount && !got_int; fi++) {
+ FILE *const fd = mch_fopen((char *)files[fi], "r");
if (fd == NULL) {
EMSG2(_("E153: Unable to open %s for reading"), files[fi]);
continue;
}
- fname = files[fi] + dirlen + 1;
+ const char_u *const fname = files[fi] + dirlen + 1;
- firstline = TRUE;
+ bool firstline = true;
while (!vim_fgets(IObuff, IOSIZE, fd) && !got_int) {
if (firstline) {
- /* Detect utf-8 file by a non-ASCII char in the first line. */
- this_utf8 = MAYBE;
- for (s = IObuff; *s != NUL; ++s)
+ // Detect utf-8 file by a non-ASCII char in the first line.
+ TriState this_utf8 = kNone;
+ for (s = IObuff; *s != NUL; s++) {
if (*s >= 0x80) {
- int l;
-
- this_utf8 = TRUE;
- l = utf_ptr2len(s);
+ this_utf8 = kTrue;
+ const int l = utf_ptr2len(s);
if (l == 1) {
- /* Illegal UTF-8 byte sequence. */
- this_utf8 = FALSE;
+ // Illegal UTF-8 byte sequence.
+ this_utf8 = kFalse;
break;
}
s += l - 1;
}
- if (this_utf8 == MAYBE) /* only ASCII characters found */
- this_utf8 = FALSE;
- if (utf8 == MAYBE) /* first file */
+ }
+ if (this_utf8 == kNone) { // only ASCII characters found
+ this_utf8 = kFalse;
+ }
+ if (utf8 == kNone) { // first file
utf8 = this_utf8;
- else if (utf8 != this_utf8) {
+ } else if (utf8 != this_utf8) {
EMSG2(_(
"E670: Mix of help file encodings within a language: %s"),
files[fi]);
mix = !got_int;
got_int = TRUE;
}
- firstline = FALSE;
+ firstline = false;
}
p1 = vim_strchr(IObuff, '*'); /* find first '*' */
while (p1 != NULL) {
- /* Use vim_strbyte() instead of vim_strchr() so that when
- * 'encoding' is dbcs it still works, don't find '*' in the
- * second byte. */
- p2 = vim_strbyte(p1 + 1, '*'); /* find second '*' */
- if (p2 != NULL && p2 > p1 + 1) { /* skip "*" and "**" */
- for (s = p1 + 1; s < p2; ++s)
- if (*s == ' ' || *s == '\t' || *s == '|')
+ p2 = (char_u *)strchr((const char *)p1 + 1, '*'); // Find second '*'.
+ if (p2 != NULL && p2 > p1 + 1) { // Skip "*" and "**".
+ for (s = p1 + 1; s < p2; s++) {
+ if (*s == ' ' || *s == '\t' || *s == '|') {
break;
+ }
+ }
/*
* Only accept a *tag* when it consists of valid
@@ -4974,8 +5352,9 @@ static void helptags_one(char_u *dir, char_u *ext, char_u *tagfname,
}
}
- if (utf8 == TRUE)
+ if (utf8 == kTrue) {
fprintf(fd_tags, "!_TAG_FILE_ENCODING\tutf-8\t//\n");
+ }
/*
* Write the tags into the file.
@@ -5016,9 +5395,12 @@ static void do_helptags(char_u *dirname, bool add_help_tags)
char_u **files;
// Get a list of all files in the help directory and in subdirectories.
- STRCPY(NameBuff, dirname);
- add_pathsep((char *)NameBuff);
- STRCAT(NameBuff, "**");
+ STRLCPY(NameBuff, dirname, sizeof(NameBuff));
+ if (!add_pathsep((char *)NameBuff)
+ || STRLCAT(NameBuff, "**", sizeof(NameBuff)) >= MAXPATHL) {
+ EMSG(_(e_fnametoolong));
+ return;
+ }
// Note: We cannot just do `&NameBuff` because it is a statically sized array
// so `NameBuff == &NameBuff` according to C semantics.
@@ -5026,8 +5408,7 @@ static void do_helptags(char_u *dirname, bool add_help_tags)
if (gen_expand_wildcards(1, buff_list, &filecount, &files,
EW_FILE|EW_SILENT) == FAIL
|| filecount == 0) {
- EMSG2("E151: No match: %s", NameBuff);
- xfree(dirname);
+ EMSG2(_("E151: No match: %s"), NameBuff);
return;
}
@@ -5132,13 +5513,14 @@ void ex_helptags(exarg_T *eap)
struct sign
{
- sign_T *sn_next; /* next sign in list */
- int sn_typenr; /* type number of sign */
- char_u *sn_name; /* name of sign */
- char_u *sn_icon; /* name of pixmap */
- char_u *sn_text; /* text used instead of pixmap */
- int sn_line_hl; /* highlight ID for line */
- int sn_text_hl; /* highlight ID for text */
+ sign_T *sn_next; // next sign in list
+ int sn_typenr; // type number of sign
+ char_u *sn_name; // name of sign
+ char_u *sn_icon; // name of pixmap
+ char_u *sn_text; // text used instead of pixmap
+ int sn_line_hl; // highlight ID for line
+ int sn_text_hl; // highlight ID for text
+ int sn_num_hl; // highlight ID for line number
};
static sign_T *first_sign = NULL;
@@ -5150,8 +5532,8 @@ static int next_sign_typenr = 1;
void ex_helpclose(exarg_T *eap)
{
FOR_ALL_WINDOWS_IN_TAB(win, curtab) {
- if (win->w_buffer->b_help) {
- win_close(win, FALSE);
+ if (bt_help(win->w_buffer)) {
+ win_close(win, false);
return;
}
}
@@ -5201,385 +5583,341 @@ static int sign_cmd_idx(
*/
void ex_sign(exarg_T *eap)
{
- char_u *arg = eap->arg;
- char_u *p;
- int idx;
- sign_T *sp;
- sign_T *sp_prev;
-
- /* Parse the subcommand. */
- p = skiptowhite(arg);
- idx = sign_cmd_idx(arg, p);
- if (idx == SIGNCMD_LAST)
- {
- EMSG2(_("E160: Unknown sign command: %s"), arg);
- return;
+ char_u *arg = eap->arg;
+ char_u *p;
+ int idx;
+ sign_T *sp;
+ sign_T *sp_prev;
+
+ // Parse the subcommand.
+ p = skiptowhite(arg);
+ idx = sign_cmd_idx(arg, p);
+ if (idx == SIGNCMD_LAST) {
+ EMSG2(_("E160: Unknown sign command: %s"), arg);
+ return;
+ }
+ arg = skipwhite(p);
+
+ if (idx <= SIGNCMD_LIST) {
+ // Define, undefine or list signs.
+ if (idx == SIGNCMD_LIST && *arg == NUL) {
+ // ":sign list": list all defined signs
+ for (sp = first_sign; sp != NULL && !got_int; sp = sp->sn_next) {
+ sign_list_defined(sp);
+ }
+ } else if (*arg == NUL) {
+ EMSG(_("E156: Missing sign name"));
+ } else {
+ // Isolate the sign name. If it's a number skip leading zeroes,
+ // so that "099" and "99" are the same sign. But keep "0".
+ p = skiptowhite(arg);
+ if (*p != NUL) {
+ *p++ = NUL;
+ }
+ while (arg[0] == '0' && arg[1] != NUL) {
+ arg++;
+ }
+
+ sp_prev = NULL;
+ for (sp = first_sign; sp != NULL; sp = sp->sn_next) {
+ if (STRCMP(sp->sn_name, arg) == 0) {
+ break;
+ }
+ sp_prev = sp;
+ }
+ if (idx == SIGNCMD_DEFINE) {
+ // ":sign define {name} ...": define a sign
+ if (sp == NULL) {
+ sign_T *lp;
+ int start = next_sign_typenr;
+
+ // Allocate a new sign.
+ sp = xcalloc(1, sizeof(sign_T));
+
+ // Check that next_sign_typenr is not already being used.
+ // This only happens after wrapping around. Hopefully
+ // another one got deleted and we can use its number.
+ for (lp = first_sign; lp != NULL; ) {
+ if (lp->sn_typenr == next_sign_typenr) {
+ next_sign_typenr++;
+ if (next_sign_typenr == MAX_TYPENR) {
+ next_sign_typenr = 1;
+ }
+ if (next_sign_typenr == start) {
+ xfree(sp);
+ EMSG(_("E612: Too many signs defined"));
+ return;
+ }
+ lp = first_sign; // start all over
+ continue;
+ }
+ lp = lp->sn_next;
+ }
+
+ sp->sn_typenr = next_sign_typenr;
+ if (++next_sign_typenr == MAX_TYPENR) {
+ next_sign_typenr = 1; // wrap around
+ }
+
+ sp->sn_name = vim_strsave(arg);
+
+ // add the new sign to the list of signs
+ if (sp_prev == NULL) {
+ first_sign = sp;
+ } else {
+ sp_prev->sn_next = sp;
+ }
+ }
+
+ // set values for a defined sign.
+ for (;;) {
+ arg = skipwhite(p);
+ if (*arg == NUL) {
+ break;
+ }
+ p = skiptowhite_esc(arg);
+ if (STRNCMP(arg, "icon=", 5) == 0) {
+ arg += 5;
+ xfree(sp->sn_icon);
+ sp->sn_icon = vim_strnsave(arg, (int)(p - arg));
+ backslash_halve(sp->sn_icon);
+ } else if (STRNCMP(arg, "text=", 5) == 0) {
+ char_u *s;
+ int cells;
+ int len;
+
+ arg += 5;
+ for (s = arg; s + 1 < p; s++) {
+ if (*s == '\\') {
+ // Remove a backslash, so that it is possible
+ // to use a space.
+ STRMOVE(s, s + 1);
+ p--;
+ }
+ }
+
+ // Count cells and check for non-printable chars
+ cells = 0;
+ for (s = arg; s < p; s += utfc_ptr2len(s)) {
+ if (!vim_isprintc(utf_ptr2char(s))) {
+ break;
+ }
+ cells += utf_ptr2cells(s);
+ }
+ // Currently must be one or two display cells
+ if (s != p || cells < 1 || cells > 2) {
+ *p = NUL;
+ EMSG2(_("E239: Invalid sign text: %s"), arg);
+ return;
+ }
+
+ xfree(sp->sn_text);
+ // Allocate one byte more if we need to pad up
+ // with a space.
+ len = (int)(p - arg + ((cells == 1) ? 1 : 0));
+ sp->sn_text = vim_strnsave(arg, len);
+
+ if (cells == 1) {
+ STRCPY(sp->sn_text + len - 1, " ");
+ }
+ } else if (STRNCMP(arg, "linehl=", 7) == 0) {
+ arg += 7;
+ sp->sn_line_hl = syn_check_group(arg, (int)(p - arg));
+ } else if (STRNCMP(arg, "texthl=", 7) == 0) {
+ arg += 7;
+ sp->sn_text_hl = syn_check_group(arg, (int)(p - arg));
+ } else if (STRNCMP(arg, "numhl=", 6) == 0) {
+ arg += 6;
+ sp->sn_num_hl = syn_check_group(arg, (int)(p - arg));
+ } else {
+ EMSG2(_(e_invarg2), arg);
+ return;
+ }
+ }
+ } else if (sp == NULL) {
+ EMSG2(_("E155: Unknown sign: %s"), arg);
+ } else if (idx == SIGNCMD_LIST) {
+ // ":sign list {name}"
+ sign_list_defined(sp);
+ } else {
+ // ":sign undefine {name}"
+ sign_undefine(sp, sp_prev);
+ }
+ }
+ } else {
+ int id = -1;
+ linenr_T lnum = -1;
+ char_u *sign_name = NULL;
+ char_u *arg1;
+
+ if (*arg == NUL) {
+ if (idx == SIGNCMD_PLACE) {
+ // ":sign place": list placed signs in all buffers
+ sign_list_placed(NULL);
+ } else if (idx == SIGNCMD_UNPLACE) {
+ // ":sign unplace": remove placed sign at cursor
+ id = buf_findsign_id(curwin->w_buffer, curwin->w_cursor.lnum);
+ if (id > 0) {
+ buf_delsign(curwin->w_buffer, id);
+ redraw_buf_line_later(curwin->w_buffer, curwin->w_cursor.lnum);
+ } else {
+ EMSG(_("E159: Missing sign number"));
+ }
+ } else {
+ EMSG(_(e_argreq));
+ }
+ return;
}
- arg = skipwhite(p);
- if (idx <= SIGNCMD_LIST)
- {
- /*
- * Define, undefine or list signs.
- */
- if (idx == SIGNCMD_LIST && *arg == NUL)
- {
- /* ":sign list": list all defined signs */
- for (sp = first_sign; sp != NULL && !got_int; sp = sp->sn_next)
- sign_list_defined(sp);
- }
- else if (*arg == NUL)
- EMSG(_("E156: Missing sign name"));
- else
- {
- /* Isolate the sign name. If it's a number skip leading zeroes,
- * so that "099" and "99" are the same sign. But keep "0". */
- p = skiptowhite(arg);
- if (*p != NUL)
- *p++ = NUL;
- while (arg[0] == '0' && arg[1] != NUL)
- ++arg;
-
- sp_prev = NULL;
- for (sp = first_sign; sp != NULL; sp = sp->sn_next)
- {
- if (STRCMP(sp->sn_name, arg) == 0)
- break;
- sp_prev = sp;
- }
- if (idx == SIGNCMD_DEFINE)
- {
- /* ":sign define {name} ...": define a sign */
- if (sp == NULL)
- {
- sign_T *lp;
- int start = next_sign_typenr;
-
- /* Allocate a new sign. */
- sp = xcalloc(1, sizeof(sign_T));
-
- /* Check that next_sign_typenr is not already being used.
- * This only happens after wrapping around. Hopefully
- * another one got deleted and we can use its number. */
- for (lp = first_sign; lp != NULL; )
- {
- if (lp->sn_typenr == next_sign_typenr)
- {
- ++next_sign_typenr;
- if (next_sign_typenr == MAX_TYPENR)
- next_sign_typenr = 1;
- if (next_sign_typenr == start)
- {
- xfree(sp);
- EMSG(_("E612: Too many signs defined"));
- return;
- }
- lp = first_sign; /* start all over */
- continue;
- }
- lp = lp->sn_next;
- }
-
- sp->sn_typenr = next_sign_typenr;
- if (++next_sign_typenr == MAX_TYPENR)
- next_sign_typenr = 1; /* wrap around */
-
- sp->sn_name = vim_strsave(arg);
-
- /* add the new sign to the list of signs */
- if (sp_prev == NULL)
- first_sign = sp;
- else
- sp_prev->sn_next = sp;
- }
-
- /* set values for a defined sign. */
- for (;;)
- {
- arg = skipwhite(p);
- if (*arg == NUL)
- break;
- p = skiptowhite_esc(arg);
- if (STRNCMP(arg, "icon=", 5) == 0)
- {
- arg += 5;
- xfree(sp->sn_icon);
- sp->sn_icon = vim_strnsave(arg, (int)(p - arg));
- backslash_halve(sp->sn_icon);
- }
- else if (STRNCMP(arg, "text=", 5) == 0)
- {
- char_u *s;
- int cells;
- int len;
-
- arg += 5;
-
- /* Count cells and check for non-printable chars */
- if (has_mbyte)
- {
- cells = 0;
- for (s = arg; s < p; s += (*mb_ptr2len)(s))
- {
- if (!vim_isprintc((*mb_ptr2char)(s)))
- break;
- cells += (*mb_ptr2cells)(s);
- }
- }
- else
-
- {
- for (s = arg; s < p; ++s)
- if (!vim_isprintc(*s))
- break;
- cells = (int)(s - arg);
- }
- /* Currently must be one or two display cells */
- if (s != p || cells < 1 || cells > 2)
- {
- *p = NUL;
- EMSG2(_("E239: Invalid sign text: %s"), arg);
- return;
- }
-
- xfree(sp->sn_text);
- /* Allocate one byte more if we need to pad up
- * with a space. */
- len = (int)(p - arg + ((cells == 1) ? 1 : 0));
- sp->sn_text = vim_strnsave(arg, len);
-
- if (cells == 1)
- STRCPY(sp->sn_text + len - 1, " ");
- }
- else if (STRNCMP(arg, "linehl=", 7) == 0)
- {
- arg += 7;
- sp->sn_line_hl = syn_check_group(arg, (int)(p - arg));
- }
- else if (STRNCMP(arg, "texthl=", 7) == 0)
- {
- arg += 7;
- sp->sn_text_hl = syn_check_group(arg, (int)(p - arg));
- }
- else
- {
- EMSG2(_(e_invarg2), arg);
- return;
- }
- }
- }
- else if (sp == NULL)
- EMSG2(_("E155: Unknown sign: %s"), arg);
- else if (idx == SIGNCMD_LIST)
- /* ":sign list {name}" */
- sign_list_defined(sp);
- else
- /* ":sign undefine {name}" */
- sign_undefine(sp, sp_prev);
- }
+ if (idx == SIGNCMD_UNPLACE && arg[0] == '*' && arg[1] == NUL) {
+ // ":sign unplace *": remove all placed signs
+ buf_delete_all_signs();
+ return;
}
- else
- {
- int id = -1;
- linenr_T lnum = -1;
- char_u *sign_name = NULL;
- char_u *arg1;
-
- if (*arg == NUL)
- {
- if (idx == SIGNCMD_PLACE)
- {
- /* ":sign place": list placed signs in all buffers */
- sign_list_placed(NULL);
- }
- else if (idx == SIGNCMD_UNPLACE)
- {
- /* ":sign unplace": remove placed sign at cursor */
- id = buf_findsign_id(curwin->w_buffer, curwin->w_cursor.lnum);
- if (id > 0)
- {
- buf_delsign(curwin->w_buffer, id);
- update_debug_sign(curwin->w_buffer, curwin->w_cursor.lnum);
- }
- else
- EMSG(_("E159: Missing sign number"));
- }
- else
- EMSG(_(e_argreq));
- return;
- }
-
- if (idx == SIGNCMD_UNPLACE && arg[0] == '*' && arg[1] == NUL)
- {
- /* ":sign unplace *": remove all placed signs */
- buf_delete_all_signs();
- return;
- }
-
- /* first arg could be placed sign id */
- arg1 = arg;
- if (ascii_isdigit(*arg))
- {
- id = getdigits_int(&arg);
- if (!ascii_iswhite(*arg) && *arg != NUL)
- {
- id = -1;
- arg = arg1;
- }
- else
- {
- arg = skipwhite(arg);
- if (idx == SIGNCMD_UNPLACE && *arg == NUL)
- {
- // ":sign unplace {id}": remove placed sign by number
- FOR_ALL_BUFFERS(buf) {
- if ((lnum = buf_delsign(buf, id)) != 0) {
- update_debug_sign(buf, lnum);
- }
- }
- return;
- }
- }
- }
-
- /*
- * Check for line={lnum} name={name} and file={fname} or buffer={nr}.
- * Leave "arg" pointing to {fname}.
- */
-
- buf_T *buf = NULL;
- for (;;)
- {
- if (STRNCMP(arg, "line=", 5) == 0)
- {
- arg += 5;
- lnum = atoi((char *)arg);
- arg = skiptowhite(arg);
- }
- else if (STRNCMP(arg, "*", 1) == 0 && idx == SIGNCMD_UNPLACE)
- {
- if (id != -1)
- {
- EMSG(_(e_invarg));
- return;
- }
- id = -2;
- arg = skiptowhite(arg + 1);
- }
- else if (STRNCMP(arg, "name=", 5) == 0)
- {
- arg += 5;
- sign_name = arg;
- arg = skiptowhite(arg);
- if (*arg != NUL)
- *arg++ = NUL;
- while (sign_name[0] == '0' && sign_name[1] != NUL)
- ++sign_name;
- }
- else if (STRNCMP(arg, "file=", 5) == 0)
- {
- arg += 5;
- buf = buflist_findname(arg);
- break;
- }
- else if (STRNCMP(arg, "buffer=", 7) == 0)
- {
- arg += 7;
- buf = buflist_findnr(getdigits_int(&arg));
- if (*skipwhite(arg) != NUL)
- EMSG(_(e_trailing));
- break;
- }
- else
- {
- EMSG(_(e_invarg));
- return;
- }
- arg = skipwhite(arg);
- }
-
- if (buf == NULL)
- {
- EMSG2(_("E158: Invalid buffer name: %s"), arg);
- }
- else if (id <= 0 && !(idx == SIGNCMD_UNPLACE && id == -2))
- {
- if (lnum >= 0 || sign_name != NULL)
- EMSG(_(e_invarg));
- else
- /* ":sign place file={fname}": list placed signs in one file */
- sign_list_placed(buf);
- }
- else if (idx == SIGNCMD_JUMP)
- {
- /* ":sign jump {id} file={fname}" */
- if (lnum >= 0 || sign_name != NULL)
- EMSG(_(e_invarg));
- else if ((lnum = buf_findsign(buf, id)) > 0)
- { /* goto a sign ... */
- if (buf_jump_open_win(buf) != NULL)
- { /* ... in a current window */
- curwin->w_cursor.lnum = lnum;
- check_cursor_lnum();
- beginline(BL_WHITE);
- }
- else
- { // ... not currently in a window
- char *cmd = xmalloc(STRLEN(buf->b_fname) + 25);
- sprintf(cmd, "e +%" PRId64 " %s",
- (int64_t)lnum, buf->b_fname);
- do_cmdline_cmd(cmd);
- xfree(cmd);
- }
-
- foldOpenCursor();
- }
- else
- EMSGN(_("E157: Invalid sign ID: %" PRId64), id);
- }
- else if (idx == SIGNCMD_UNPLACE)
- {
- if (lnum >= 0 || sign_name != NULL)
- EMSG(_(e_invarg));
- else if (id == -2)
- {
- /* ":sign unplace * file={fname}" */
- redraw_buf_later(buf, NOT_VALID);
- buf_delete_signs(buf);
- }
- else
- {
- /* ":sign unplace {id} file={fname}" */
- lnum = buf_delsign(buf, id);
- update_debug_sign(buf, lnum);
- }
- }
- /* idx == SIGNCMD_PLACE */
- else if (sign_name != NULL)
- {
- for (sp = first_sign; sp != NULL; sp = sp->sn_next)
- if (STRCMP(sp->sn_name, sign_name) == 0)
- break;
- if (sp == NULL)
- {
- EMSG2(_("E155: Unknown sign: %s"), sign_name);
- return;
- }
- if (lnum > 0)
- /* ":sign place {id} line={lnum} name={name} file={fname}":
- * place a sign */
- buf_addsign(buf, id, lnum, sp->sn_typenr);
- else
- /* ":sign place {id} file={fname}": change sign type */
- lnum = buf_change_sign_type(buf, id, sp->sn_typenr);
- if (lnum > 0)
- update_debug_sign(buf, lnum);
- else
- EMSG2(_("E885: Not possible to change sign %s"), sign_name);
- }
- else
- EMSG(_(e_invarg));
+
+ // first arg could be placed sign id
+ arg1 = arg;
+ if (ascii_isdigit(*arg)) {
+ id = getdigits_int(&arg);
+ if (!ascii_iswhite(*arg) && *arg != NUL) {
+ id = -1;
+ arg = arg1;
+ } else {
+ arg = skipwhite(arg);
+ if (idx == SIGNCMD_UNPLACE && *arg == NUL) {
+ // ":sign unplace {id}": remove placed sign by number
+ FOR_ALL_BUFFERS(buf) {
+ if ((lnum = buf_delsign(buf, id)) != 0) {
+ redraw_buf_line_later(buf, lnum);
+ }
+ }
+ return;
+ }
+ }
+ }
+
+ // Check for line={lnum} name={name} and file={fname} or buffer={nr}.
+ // Leave "arg" pointing to {fname}.
+
+ buf_T *buf = NULL;
+ for (;;) {
+ if (STRNCMP(arg, "line=", 5) == 0) {
+ arg += 5;
+ lnum = atoi((char *)arg);
+ arg = skiptowhite(arg);
+ } else if (STRNCMP(arg, "*", 1) == 0 && idx == SIGNCMD_UNPLACE) {
+ if (id != -1) {
+ EMSG(_(e_invarg));
+ return;
+ }
+ id = -2;
+ arg = skiptowhite(arg + 1);
+ } else if (STRNCMP(arg, "name=", 5) == 0) {
+ arg += 5;
+ sign_name = arg;
+ arg = skiptowhite(arg);
+ if (*arg != NUL) {
+ *arg++ = NUL;
+ }
+ while (sign_name[0] == '0' && sign_name[1] != NUL) {
+ sign_name++;
+ }
+ } else if (STRNCMP(arg, "file=", 5) == 0) {
+ arg += 5;
+ buf = buflist_findname(arg);
+ break;
+ } else if (STRNCMP(arg, "buffer=", 7) == 0) {
+ arg += 7;
+ buf = buflist_findnr(getdigits_int(&arg));
+ if (*skipwhite(arg) != NUL) {
+ EMSG(_(e_trailing));
+ }
+ break;
+ } else {
+ EMSG(_(e_invarg));
+ return;
+ }
+ arg = skipwhite(arg);
+ }
+
+ if (buf == NULL) {
+ EMSG2(_("E158: Invalid buffer name: %s"), arg);
+ } else if (id <= 0 && !(idx == SIGNCMD_UNPLACE && id == -2)) {
+ if (lnum >= 0 || sign_name != NULL) {
+ EMSG(_(e_invarg));
+ } else {
+ // ":sign place file={fname}": list placed signs in one file
+ sign_list_placed(buf);
+ }
+ } else if (idx == SIGNCMD_JUMP) {
+ // ":sign jump {id} file={fname}"
+ if (lnum >= 0 || sign_name != NULL) {
+ EMSG(_(e_invarg));
+ } else if ((lnum = buf_findsign(buf, id)) > 0) {
+ // goto a sign ...
+ if (buf_jump_open_win(buf) != NULL) {
+ // ... in a current window
+ curwin->w_cursor.lnum = lnum;
+ check_cursor_lnum();
+ beginline(BL_WHITE);
+ } else {
+ // ... not currently in a window
+ if (buf->b_fname == NULL) {
+ EMSG(_("E934: Cannot jump to a buffer that does not have a name"));
+ return;
+ }
+ size_t cmdlen = STRLEN(buf->b_fname) + 24;
+ char *cmd = xmallocz(cmdlen);
+ snprintf(cmd, cmdlen, "e +%" PRId64 " %s",
+ (int64_t)lnum, buf->b_fname);
+ do_cmdline_cmd(cmd);
+ xfree(cmd);
+ }
+
+ foldOpenCursor();
+ } else {
+ EMSGN(_("E157: Invalid sign ID: %" PRId64), id);
+ }
+ } else if (idx == SIGNCMD_UNPLACE) {
+ if (lnum >= 0 || sign_name != NULL) {
+ EMSG(_(e_invarg));
+ } else if (id == -2) {
+ // ":sign unplace * file={fname}"
+ redraw_buf_later(buf, NOT_VALID);
+ buf_delete_signs(buf);
+ } else {
+ // ":sign unplace {id} file={fname}"
+ lnum = buf_delsign(buf, id);
+ redraw_buf_line_later(buf, lnum);
+ }
+ } else if (sign_name != NULL) {
+ // idx == SIGNCMD_PLACE
+ for (sp = first_sign; sp != NULL; sp = sp->sn_next) {
+ if (STRCMP(sp->sn_name, sign_name) == 0) {
+ break;
+ }
+ }
+ if (sp == NULL) {
+ EMSG2(_("E155: Unknown sign: %s"), sign_name);
+ return;
+ }
+ if (lnum > 0) {
+ // ":sign place {id} line={lnum} name={name} file={fname}":
+ // place a sign
+ buf_addsign(buf, id, lnum, sp->sn_typenr);
+ } else {
+ // ":sign place {id} file={fname}": change sign type
+ lnum = buf_change_sign_type(buf, id, sp->sn_typenr);
+ }
+ if (lnum > 0) {
+ redraw_buf_line_later(buf, lnum);
+ } else {
+ EMSG2(_("E885: Not possible to change sign %s"), sign_name);
+ }
+ } else {
+ EMSG(_(e_invarg));
}
+ }
}
/*
@@ -5587,33 +5925,45 @@ void ex_sign(exarg_T *eap)
*/
static void sign_list_defined(sign_T *sp)
{
- char_u *p;
-
smsg("sign %s", sp->sn_name);
if (sp->sn_icon != NULL) {
- MSG_PUTS(" icon=");
+ msg_puts(" icon=");
msg_outtrans(sp->sn_icon);
- MSG_PUTS(_(" (not supported)"));
+ msg_puts(_(" (not supported)"));
}
if (sp->sn_text != NULL) {
- MSG_PUTS(" text=");
+ msg_puts(" text=");
msg_outtrans(sp->sn_text);
}
if (sp->sn_line_hl > 0) {
- MSG_PUTS(" linehl=");
- p = get_highlight_name(NULL, sp->sn_line_hl - 1);
- if (p == NULL)
- MSG_PUTS("NONE");
- else
+ msg_puts(" linehl=");
+ const char *const p = get_highlight_name_ext(NULL,
+ sp->sn_line_hl - 1, false);
+ if (p == NULL) {
+ msg_puts("NONE");
+ } else {
msg_puts(p);
+ }
}
if (sp->sn_text_hl > 0) {
- MSG_PUTS(" texthl=");
- p = get_highlight_name(NULL, sp->sn_text_hl - 1);
- if (p == NULL)
- MSG_PUTS("NONE");
- else
+ msg_puts(" texthl=");
+ const char *const p = get_highlight_name_ext(NULL,
+ sp->sn_text_hl - 1, false);
+ if (p == NULL) {
+ msg_puts("NONE");
+ } else {
+ msg_puts(p);
+ }
+ }
+ if (sp->sn_num_hl > 0) {
+ msg_puts(" numhl=");
+ const char *const p = get_highlight_name_ext(NULL,
+ sp->sn_num_hl - 1, false);
+ if (p == NULL) {
+ msg_puts("NONE");
+ } else {
msg_puts(p);
+ }
}
}
@@ -5632,25 +5982,33 @@ static void sign_undefine(sign_T *sp, sign_T *sp_prev)
xfree(sp);
}
-/*
- * Get highlighting attribute for sign "typenr".
- * If "line" is TRUE: line highl, if FALSE: text highl.
- */
-int sign_get_attr(int typenr, int line)
+/// Gets highlighting attribute for sign "typenr" corresponding to "type".
+int sign_get_attr(int typenr, SignType type)
{
sign_T *sp;
+ int sign_hl = 0;
- for (sp = first_sign; sp != NULL; sp = sp->sn_next)
+ for (sp = first_sign; sp != NULL; sp = sp->sn_next) {
if (sp->sn_typenr == typenr) {
- if (line) {
- if (sp->sn_line_hl > 0)
- return syn_id2attr(sp->sn_line_hl);
- } else {
- if (sp->sn_text_hl > 0)
- return syn_id2attr(sp->sn_text_hl);
+ switch (type) {
+ case SIGN_TEXT:
+ sign_hl = sp->sn_text_hl;
+ break;
+ case SIGN_LINEHL:
+ sign_hl = sp->sn_line_hl;
+ break;
+ case SIGN_NUMHL:
+ sign_hl = sp->sn_num_hl;
+ break;
+ default:
+ abort();
+ }
+ if (sign_hl > 0) {
+ return syn_id2attr(sign_hl);
}
break;
}
+ }
return 0;
}
@@ -5702,50 +6060,40 @@ static enum
EXP_SIGN_NAMES /* expand with name of placed signs */
} expand_what;
-/*
- * Function given to ExpandGeneric() to obtain the sign command
- * expansion.
- */
+/// Function given to ExpandGeneric() to obtain the sign command
+/// expansion.
char_u * get_sign_name(expand_T *xp, int idx)
{
- sign_T *sp;
- int current_idx;
-
- switch (expand_what)
- {
+ switch (expand_what)
+ {
case EXP_SUBCMD:
- return (char_u *)cmds[idx];
- case EXP_DEFINE:
- {
- char *define_arg[] =
- {
- "icon=", "linehl=", "text=", "texthl=", NULL
- };
- return (char_u *)define_arg[idx];
- }
- case EXP_PLACE:
- {
- char *place_arg[] =
- {
- "line=", "name=", "file=", "buffer=", NULL
- };
- return (char_u *)place_arg[idx];
- }
- case EXP_UNPLACE:
- {
- char *unplace_arg[] = { "file=", "buffer=", NULL };
- return (char_u *)unplace_arg[idx];
- }
- case EXP_SIGN_NAMES:
- /* Complete with name of signs already defined */
- current_idx = 0;
- for (sp = first_sign; sp != NULL; sp = sp->sn_next)
- if (current_idx++ == idx)
- return sp->sn_name;
- return NULL;
+ return (char_u *)cmds[idx];
+ case EXP_DEFINE: {
+ char *define_arg[] = { "icon=", "linehl=", "text=", "texthl=", "numhl=",
+ NULL };
+ return (char_u *)define_arg[idx];
+ }
+ case EXP_PLACE: {
+ char *place_arg[] = { "line=", "name=", "file=", "buffer=", NULL };
+ return (char_u *)place_arg[idx];
+ }
+ case EXP_UNPLACE: {
+ char *unplace_arg[] = { "file=", "buffer=", NULL };
+ return (char_u *)unplace_arg[idx];
+ }
+ case EXP_SIGN_NAMES: {
+ // Complete with name of signs already defined
+ int current_idx = 0;
+ for (sign_T *sp = first_sign; sp != NULL; sp = sp->sn_next) {
+ if (current_idx++ == idx) {
+ return sp->sn_name;
+ }
+ }
+ }
+ return NULL;
default:
- return NULL;
- }
+ return NULL;
+ }
}
/*
@@ -5818,9 +6166,8 @@ void set_context_in_sign_cmd(expand_T *xp, char_u *arg)
// :sign define {name} {args}... {last}=
// | |
// last p
- if (p == NUL)
- {
- /* Expand last argument name (before equal sign). */
+ if (p == NULL) {
+ // Expand last argument name (before equal sign).
xp->xp_pattern = last;
switch (cmd_idx)
{
@@ -5846,7 +6193,8 @@ void set_context_in_sign_cmd(expand_T *xp, char_u *arg)
{
case SIGNCMD_DEFINE:
if (STRNCMP(last, "texthl", p - last) == 0
- || STRNCMP(last, "linehl", p - last) == 0) {
+ || STRNCMP(last, "linehl", p - last) == 0
+ || STRNCMP(last, "numhl", p - last) == 0) {
xp->xp_context = EXPAND_HIGHLIGHT;
} else if (STRNCMP(last, "icon", p - last) == 0) {
xp->xp_context = EXPAND_FILES;
@@ -5865,3 +6213,312 @@ void set_context_in_sign_cmd(expand_T *xp, char_u *arg)
}
}
}
+
+/// Shows the effects of the :substitute command being typed ('inccommand').
+/// If inccommand=split, shows a preview window and later restores the layout.
+static buf_T *show_sub(exarg_T *eap, pos_T old_cusr,
+ PreviewLines *preview_lines, int hl_id, int src_id)
+ FUNC_ATTR_NONNULL_ALL
+{
+ static handle_T bufnr = 0; // special buffer, re-used on each visit
+
+ win_T *save_curwin = curwin;
+ cmdmod_T save_cmdmod = cmdmod;
+ char_u *save_shm_p = vim_strsave(p_shm);
+ PreviewLines lines = *preview_lines;
+ buf_T *orig_buf = curbuf;
+
+ // We keep a special-purpose buffer around, but don't assume it exists.
+ buf_T *preview_buf = bufnr ? buflist_findnr(bufnr) : 0;
+ cmdmod.tab = 0; // disable :tab modifier
+ cmdmod.noswapfile = true; // disable swap for preview buffer
+ // disable file info message
+ set_string_option_direct((char_u *)"shm", -1, (char_u *)"F", OPT_FREE,
+ SID_NONE);
+
+ bool outside_curline = (eap->line1 != old_cusr.lnum
+ || eap->line2 != old_cusr.lnum);
+ bool split = outside_curline && (*p_icm != 'n');
+ if (preview_buf == curbuf) { // Preview buffer cannot preview itself!
+ split = false;
+ preview_buf = NULL;
+ }
+
+ // Place cursor on nearest matching line, to undo do_sub() cursor placement.
+ for (size_t i = 0; i < lines.subresults.size; i++) {
+ SubResult curres = lines.subresults.items[i];
+ if (curres.start.lnum >= old_cusr.lnum) {
+ curwin->w_cursor.lnum = curres.start.lnum;
+ curwin->w_cursor.col = curres.start.col;
+ break;
+ } // Else: All matches are above, do_sub() already placed cursor.
+ }
+
+ // Width of the "| lnum|..." column which displays the line numbers.
+ linenr_T highest_num_line = 0;
+ int col_width = 0;
+
+ if (split && win_split((int)p_cwh, WSP_BOT) != FAIL) {
+ buf_open_scratch(preview_buf ? bufnr : 0, "[Preview]");
+ buf_clear();
+ preview_buf = curbuf;
+ bufnr = preview_buf->handle;
+ curbuf->b_p_bl = false;
+ curbuf->b_p_ma = true;
+ curbuf->b_p_ul = -1;
+ curbuf->b_p_tw = 0; // Reset 'textwidth' (was set by ftplugin)
+ curwin->w_p_cul = false;
+ curwin->w_p_cuc = false;
+ curwin->w_p_spell = false;
+ curwin->w_p_fen = false;
+
+ if (lines.subresults.size > 0) {
+ highest_num_line = kv_last(lines.subresults).end.lnum;
+ col_width = log10(highest_num_line) + 1 + 3;
+ }
+ }
+
+ char *str = NULL; // construct the line to show in here
+ size_t old_line_size = 0;
+ size_t line_size = 0;
+ linenr_T linenr_preview = 0; // last line added to preview buffer
+ linenr_T linenr_origbuf = 0; // last line added to original buffer
+ linenr_T next_linenr = 0; // next line to show for the match
+
+ for (size_t matchidx = 0; matchidx < lines.subresults.size; matchidx++) {
+ SubResult match = lines.subresults.items[matchidx];
+
+ if (split && preview_buf) {
+ lpos_T p_start = { 0, match.start.col }; // match starts here in preview
+ lpos_T p_end = { 0, match.end.col }; // ... and ends here
+
+ if (match.pre_match == 0) {
+ next_linenr = match.start.lnum;
+ } else {
+ next_linenr = match.pre_match;
+ }
+ // Don't add a line twice
+ if (next_linenr == linenr_origbuf) {
+ next_linenr++;
+ p_start.lnum = linenr_preview; // might be redefined below
+ p_end.lnum = linenr_preview; // might be redefined below
+ }
+
+ for (; next_linenr <= match.end.lnum; next_linenr++) {
+ if (next_linenr == match.start.lnum) {
+ p_start.lnum = linenr_preview + 1;
+ }
+ if (next_linenr == match.end.lnum) {
+ p_end.lnum = linenr_preview + 1;
+ }
+ char *line;
+ if (next_linenr == orig_buf->b_ml.ml_line_count + 1) {
+ line = "";
+ } else {
+ line = (char *)ml_get_buf(orig_buf, next_linenr, false);
+ line_size = strlen(line) + col_width + 1;
+
+ // Reallocate if line not long enough
+ if (line_size > old_line_size) {
+ str = xrealloc(str, line_size * sizeof(char));
+ old_line_size = line_size;
+ }
+ }
+ // Put "|lnum| line" into `str` and append it to the preview buffer.
+ snprintf(str, line_size, "|%*ld| %s", col_width - 3,
+ next_linenr, line);
+ if (linenr_preview == 0) {
+ ml_replace(1, (char_u *)str, true);
+ } else {
+ ml_append(linenr_preview, (char_u *)str, (colnr_T)line_size, false);
+ }
+ linenr_preview += 1;
+ }
+ linenr_origbuf = match.end.lnum;
+
+ bufhl_add_hl_pos_offset(preview_buf, src_id, hl_id, p_start,
+ p_end, col_width);
+ }
+ bufhl_add_hl_pos_offset(orig_buf, src_id, hl_id, match.start,
+ match.end, 0);
+ }
+ xfree(str);
+
+ redraw_later(SOME_VALID);
+ win_enter(save_curwin, false); // Return to original window
+ update_topline();
+
+ // Update screen now. Must do this _before_ close_windows().
+ int save_rd = RedrawingDisabled;
+ RedrawingDisabled = 0;
+ update_screen(SOME_VALID);
+ RedrawingDisabled = save_rd;
+
+ set_string_option_direct((char_u *)"shm", -1, save_shm_p, OPT_FREE, SID_NONE);
+ xfree(save_shm_p);
+
+ cmdmod = save_cmdmod;
+
+ return preview_buf;
+}
+
+/// :substitute command
+///
+/// If 'inccommand' is empty: calls do_sub().
+/// If 'inccommand' is set: shows a "live" preview then removes the changes.
+/// from undo history.
+void ex_substitute(exarg_T *eap)
+{
+ bool preview = (State & CMDPREVIEW);
+ if (*p_icm == NUL || !preview) { // 'inccommand' is disabled
+ (void)do_sub(eap, profile_zero(), true);
+ return;
+ }
+
+ block_autocmds(); // Disable events during command preview.
+
+ char_u *save_eap = eap->arg;
+ garray_T save_view;
+ win_size_save(&save_view); // Save current window sizes.
+ save_search_patterns();
+ int save_changedtick = buf_get_changedtick(curbuf);
+ time_t save_b_u_time_cur = curbuf->b_u_time_cur;
+ u_header_T *save_b_u_newhead = curbuf->b_u_newhead;
+ long save_b_p_ul = curbuf->b_p_ul;
+ int save_w_p_cul = curwin->w_p_cul;
+ int save_w_p_cuc = curwin->w_p_cuc;
+
+ curbuf->b_p_ul = LONG_MAX; // make sure we can undo all changes
+ curwin->w_p_cul = false; // Disable 'cursorline'
+ curwin->w_p_cuc = false; // Disable 'cursorcolumn'
+
+ // Don't show search highlighting during live substitution
+ bool save_hls = p_hls;
+ p_hls = false;
+ buf_T *preview_buf = do_sub(eap, profile_setlimit(p_rdt), false);
+ p_hls = save_hls;
+
+ if (save_changedtick != buf_get_changedtick(curbuf)) {
+ // Undo invisibly. This also moves the cursor!
+ if (!u_undo_and_forget(1)) { abort(); }
+ // Restore newhead. It is meaningless when curhead is valid, but we must
+ // restore it so that undotree() is identical before/after the preview.
+ curbuf->b_u_newhead = save_b_u_newhead;
+ curbuf->b_u_time_cur = save_b_u_time_cur;
+ buf_set_changedtick(curbuf, save_changedtick);
+ }
+ if (buf_valid(preview_buf)) {
+ // XXX: Must do this *after* u_undo_and_forget(), why?
+ close_windows(preview_buf, false);
+ }
+ curbuf->b_p_ul = save_b_p_ul;
+ curwin->w_p_cul = save_w_p_cul; // Restore 'cursorline'
+ curwin->w_p_cuc = save_w_p_cuc; // Restore 'cursorcolumn'
+ eap->arg = save_eap;
+ restore_search_patterns();
+ win_size_restore(&save_view);
+ ga_clear(&save_view);
+ unblock_autocmds();
+}
+
+/// Skip over the pattern argument of ":vimgrep /pat/[g][j]".
+/// Put the start of the pattern in "*s", unless "s" is NULL.
+/// If "flags" is not NULL put the flags in it: VGR_GLOBAL, VGR_NOJUMP.
+/// If "s" is not NULL terminate the pattern with a NUL.
+/// Return a pointer to the char just past the pattern plus flags.
+char_u *skip_vimgrep_pat(char_u *p, char_u **s, int *flags)
+{
+ int c;
+
+ if (vim_isIDc(*p)) {
+ // ":vimgrep pattern fname"
+ if (s != NULL) {
+ *s = p;
+ }
+ p = skiptowhite(p);
+ if (s != NULL && *p != NUL) {
+ *p++ = NUL;
+ }
+ } else {
+ // ":vimgrep /pattern/[g][j] fname"
+ if (s != NULL) {
+ *s = p + 1;
+ }
+ c = *p;
+ p = skip_regexp(p + 1, c, true, NULL);
+ if (*p != c) {
+ return NULL;
+ }
+
+ // Truncate the pattern.
+ if (s != NULL) {
+ *p = NUL;
+ }
+ p++;
+
+ // Find the flags
+ while (*p == 'g' || *p == 'j') {
+ if (flags != NULL) {
+ if (*p == 'g') {
+ *flags |= VGR_GLOBAL;
+ } else {
+ *flags |= VGR_NOJUMP;
+ }
+ }
+ p++;
+ }
+ }
+ return p;
+}
+
+/// List v:oldfiles in a nice way.
+void ex_oldfiles(exarg_T *eap)
+{
+ list_T *l = get_vim_var_list(VV_OLDFILES);
+ long nr = 0;
+
+ if (l == NULL) {
+ msg((char_u *)_("No old files"));
+ } else {
+ msg_start();
+ msg_scroll = true;
+ TV_LIST_ITER(l, li, {
+ if (got_int) {
+ break;
+ }
+ nr++;
+ const char *fname = tv_get_string(TV_LIST_ITEM_TV(li));
+ if (!message_filtered((char_u *)fname)) {
+ msg_outnum(nr);
+ MSG_PUTS(": ");
+ msg_outtrans((char_u *)tv_get_string(TV_LIST_ITEM_TV(li)));
+ msg_clr_eos();
+ msg_putchar('\n');
+ ui_flush(); // output one line at a time
+ os_breakcheck();
+ }
+ });
+
+ // Assume "got_int" was set to truncate the listing.
+ got_int = false;
+
+ // File selection prompt on ":browse oldfiles"
+ if (cmdmod.browse) {
+ quit_more = false;
+ nr = prompt_for_number(false);
+ msg_starthere();
+ if (nr > 0 && nr <= tv_list_len(l)) {
+ const char *const p = tv_list_find_str(l, nr - 1);
+ if (p == NULL) {
+ return;
+ }
+ char *const s = (char *)expand_env_save((char_u *)p);
+ eap->arg = (char_u *)s;
+ eap->cmdidx = CMD_edit;
+ cmdmod.browse = false;
+ do_exedit(eap, NULL);
+ xfree(s);
+ }
+ }
+ }
+}
diff --git a/src/nvim/ex_cmds.h b/src/nvim/ex_cmds.h
index 721145efd8..b564cde56c 100644
--- a/src/nvim/ex_cmds.h
+++ b/src/nvim/ex_cmds.h
@@ -4,15 +4,19 @@
#include <stdbool.h>
#include "nvim/os/time.h"
-#include "nvim/eval_defs.h"
+#include "nvim/pos.h"
+#include "nvim/eval/typval.h"
+#include "nvim/buffer_defs.h"
+#include "nvim/ex_cmds_defs.h"
+
+// flags for do_ecmd()
+#define ECMD_HIDE 0x01 // don't free the current buffer
+#define ECMD_SET_HELP 0x02 // set b_help flag of (new) buffer before
+ // opening file
+#define ECMD_OLDBUF 0x04 // use existing buffer if it exists
+#define ECMD_FORCEIT 0x08 // ! used in Ex command
+#define ECMD_ADDBUF 0x10 // don't edit, just add to buffer list
-/* flags for do_ecmd() */
-#define ECMD_HIDE 0x01 /* don't free the current buffer */
-#define ECMD_SET_HELP 0x02 /* set b_help flag of (new) buffer before
- opening file */
-#define ECMD_OLDBUF 0x04 /* use existing buffer if it exists */
-#define ECMD_FORCEIT 0x08 /* ! used in Ex command */
-#define ECMD_ADDBUF 0x10 /* don't edit, just add to buffer list */
/* for lnum argument in do_ecmd() */
#define ECMD_LASTL (linenr_T)0 /* use last position in loaded file */
diff --git a/src/nvim/ex_cmds.lua b/src/nvim/ex_cmds.lua
index 76191d5a56..4806eff1b4 100644
--- a/src/nvim/ex_cmds.lua
+++ b/src/nvim/ex_cmds.lua
@@ -1,4 +1,4 @@
-bit = require 'bit'
+local bit = require 'bit'
-- Description of the values below is contained in ex_cmds_defs.h file.
local RANGE = 0x001
@@ -28,13 +28,15 @@ local FILES = bit.bor(XFILE, EXTRA)
local WORD1 = bit.bor(EXTRA, NOSPC)
local FILE1 = bit.bor(FILES, NOSPC)
-local ADDR_LINES = 0
-local ADDR_WINDOWS = 1
-local ADDR_ARGUMENTS = 2
-local ADDR_LOADED_BUFFERS = 3
-local ADDR_BUFFERS = 4
-local ADDR_TABS = 5
-local ADDR_QUICKFIX = 6
+local ADDR_LINES = 0 -- buffer line numbers
+local ADDR_WINDOWS = 1 -- window number
+local ADDR_ARGUMENTS = 2 -- argument number
+local ADDR_LOADED_BUFFERS = 3 -- buffer number of loaded buffer
+local ADDR_BUFFERS = 4 -- buffer number
+local ADDR_TABS = 5 -- tab page number
+local ADDR_TABS_RELATIVE = 6 -- Tab page that only relative
+local ADDR_QUICKFIX = 7 -- quickfix list entry number
+local ADDR_OTHER = 99 -- something else
-- The following table is described in ex_cmds_defs.h file.
return {
@@ -106,7 +108,7 @@ return {
},
{
command='argedit',
- flags=bit.bor(BANG, NEEDARG, RANGE, NOTADR, ZEROR, FILE1, EDITCMD, ARGOPT, TRLBAR),
+ flags=bit.bor(BANG, NEEDARG, RANGE, NOTADR, ZEROR, FILES, EDITCMD, ARGOPT, TRLBAR),
addr_type=ADDR_ARGUMENTS,
func='ex_argedit',
},
@@ -357,6 +359,12 @@ return {
func='ex_cbuffer',
},
{
+ command='cbottom',
+ flags=bit.bor(TRLBAR),
+ addr_type=ADDR_LINES,
+ func='ex_cbottom',
+ },
+ {
command='cc',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
addr_type=ADDR_LINES,
@@ -443,6 +451,12 @@ return {
func='ex_changes',
},
{
+ command='checkhealth',
+ flags=bit.bor(EXTRA, TRLBAR),
+ addr_type=ADDR_LINES,
+ func='ex_checkhealth',
+ },
+ {
command='checkpath',
flags=bit.bor(TRLBAR, BANG, CMDWIN),
addr_type=ADDR_LINES,
@@ -455,6 +469,12 @@ return {
func='ex_checktime',
},
{
+ command='chistory',
+ flags=bit.bor(TRLBAR),
+ addr_type=ADDR_LINES,
+ func='qf_history',
+ },
+ {
command='clist',
flags=bit.bor(BANG, EXTRA, TRLBAR, CMDWIN),
addr_type=ADDR_LINES,
@@ -473,6 +493,12 @@ return {
func='ex_close',
},
{
+ command='clearjumps',
+ flags=bit.bor(TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
+ func='ex_clearjumps',
+ },
+ {
command='cmap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
addr_type=ADDR_LINES,
@@ -594,7 +620,7 @@ return {
},
{
command='cquit',
- flags=bit.bor(TRLBAR, BANG),
+ flags=bit.bor(RANGE, NOTADR, COUNT, ZEROR, TRLBAR, BANG),
addr_type=ADDR_LINES,
func='ex_cquit',
},
@@ -608,13 +634,13 @@ return {
command='cscope',
flags=bit.bor(EXTRA, NOTRLCOM, XFILE),
addr_type=ADDR_LINES,
- func='do_cscope',
+ func='ex_cscope',
},
{
command='cstag',
flags=bit.bor(BANG, TRLBAR, WORD1),
addr_type=ADDR_LINES,
- func='do_cstag',
+ func='ex_cstag',
},
{
command='cunmap',
@@ -666,13 +692,13 @@ return {
},
{
command='delcommand',
- flags=bit.bor(NEEDARG, WORD1, TRLBAR, CMDWIN),
+ flags=bit.bor(BANG, NEEDARG, WORD1, TRLBAR, CMDWIN),
addr_type=ADDR_LINES,
func='ex_delcommand',
},
{
command='delfunction',
- flags=bit.bor(NEEDARG, WORD1, CMDWIN),
+ flags=bit.bor(BANG, NEEDARG, WORD1, CMDWIN),
addr_type=ADDR_LINES,
func='ex_delfunction',
},
@@ -911,6 +937,12 @@ return {
func='ex_filetype',
},
{
+ command='filter',
+ flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM),
+ addr_type=ADDR_LINES,
+ func='ex_wrongmodifier',
+ },
+ {
command='find',
flags=bit.bor(RANGE, NOTADR, BANG, FILE1, EDITCMD, ARGOPT, TRLBAR),
addr_type=ADDR_LINES,
@@ -1050,7 +1082,7 @@ return {
},
{
command='hide',
- flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EXTRA, NOTRLCOM),
+ flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EXTRA, TRLBAR),
addr_type=ADDR_WINDOWS,
func='ex_hide',
},
@@ -1271,6 +1303,12 @@ return {
func='ex_cbuffer',
},
{
+ command='lbottom',
+ flags=bit.bor(TRLBAR),
+ addr_type=ADDR_LINES,
+ func='ex_cbottom',
+ },
+ {
command='lcd',
flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN),
addr_type=ADDR_LINES,
@@ -1292,7 +1330,7 @@ return {
command='lcscope',
flags=bit.bor(EXTRA, NOTRLCOM, XFILE),
addr_type=ADDR_LINES,
- func='do_cscope',
+ func='ex_cscope',
},
{
command='ldo',
@@ -1381,6 +1419,12 @@ return {
func='ex_helpgrep',
},
{
+ command='lhistory',
+ flags=bit.bor(TRLBAR),
+ addr_type=ADDR_LINES,
+ func='qf_history',
+ },
+ {
command='ll',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
addr_type=ADDR_LINES,
@@ -1510,19 +1554,19 @@ return {
command='lua',
flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN),
addr_type=ADDR_LINES,
- func='ex_script_ni',
+ func='ex_lua',
},
{
command='luado',
flags=bit.bor(RANGE, DFLALL, EXTRA, NEEDARG, CMDWIN),
addr_type=ADDR_LINES,
- func='ex_ni',
+ func='ex_luado',
},
{
command='luafile',
flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN),
addr_type=ADDR_LINES,
- func='ex_ni',
+ func='ex_luafile',
},
{
command='lvimgrep',
@@ -1604,8 +1648,8 @@ return {
},
{
command='messages',
- flags=bit.bor(TRLBAR, CMDWIN),
- addr_type=ADDR_LINES,
+ flags=bit.bor(EXTRA, TRLBAR, RANGE, CMDWIN),
+ addr_type=ADDR_OTHER,
func='ex_messages',
},
{
@@ -1663,24 +1707,6 @@ return {
func='ex_next',
},
{
- command='nbkey',
- flags=bit.bor(EXTRA, NOTADR, NEEDARG),
- addr_type=ADDR_LINES,
- func='ex_ni',
- },
- {
- command='nbclose',
- flags=bit.bor(TRLBAR, CMDWIN),
- addr_type=ADDR_LINES,
- func='ex_ni',
- },
- {
- command='nbstart',
- flags=bit.bor(WORD1, TRLBAR, CMDWIN),
- addr_type=ADDR_LINES,
- func='ex_ni',
- },
- {
command='new',
flags=bit.bor(BANG, FILE1, RANGE, NOTADR, EDITCMD, ARGOPT, TRLBAR),
addr_type=ADDR_LINES,
@@ -1915,18 +1941,6 @@ return {
func='ex_previous',
},
{
- command='promptfind',
- flags=bit.bor(EXTRA, NOTRLCOM, CMDWIN),
- addr_type=ADDR_LINES,
- func='ex_ni',
- },
- {
- command='promptrepl',
- flags=bit.bor(EXTRA, NOTRLCOM, CMDWIN),
- addr_type=ADDR_LINES,
- func='ex_ni',
- },
- {
command='profile',
flags=bit.bor(BANG, EXTRA, TRLBAR, CMDWIN),
addr_type=ADDR_LINES,
@@ -2053,6 +2067,30 @@ return {
func='ex_py3file',
},
{
+ command='pyx',
+ flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN),
+ addr_type=ADDR_LINES,
+ func='ex_pyx',
+ },
+ {
+ command='pyxdo',
+ flags=bit.bor(RANGE, DFLALL, EXTRA, NEEDARG, CMDWIN),
+ addr_type=ADDR_LINES,
+ func='ex_pyxdo',
+ },
+ {
+ command='pythonx',
+ flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN),
+ addr_type=ADDR_LINES,
+ func='ex_pyx',
+ },
+ {
+ command='pyxfile',
+ flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN),
+ addr_type=ADDR_LINES,
+ func='ex_pyxfile',
+ },
+ {
command='quit',
flags=bit.bor(BANG, RANGE, COUNT, NOTADR, TRLBAR, CMDWIN),
addr_type=ADDR_WINDOWS,
@@ -2114,7 +2152,7 @@ return {
},
{
command='resize',
- flags=bit.bor(RANGE, NOTADR, TRLBAR, WORD1),
+ flags=bit.bor(RANGE, NOTADR, TRLBAR, WORD1, CMDWIN),
addr_type=ADDR_LINES,
func='ex_resize',
},
@@ -2170,19 +2208,19 @@ return {
command='ruby',
flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN),
addr_type=ADDR_LINES,
- func='ex_script_ni',
+ func='ex_ruby',
},
{
command='rubydo',
flags=bit.bor(RANGE, DFLALL, EXTRA, NEEDARG, CMDWIN),
addr_type=ADDR_LINES,
- func='ex_ni',
+ func='ex_rubydo',
},
{
command='rubyfile',
flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN),
addr_type=ADDR_LINES,
- func='ex_ni',
+ func='ex_rubyfile',
},
{
command='rviminfo',
@@ -2194,7 +2232,7 @@ return {
command='substitute',
flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, CMDWIN),
addr_type=ADDR_LINES,
- func='do_sub',
+ func='ex_substitute',
},
{
command='sNext',
@@ -2282,8 +2320,8 @@ return {
},
{
command='scriptnames',
- flags=bit.bor(TRLBAR, CMDWIN),
- addr_type=ADDR_LINES,
+ flags=bit.bor(BANG, RANGE, NOTADR, COUNT, TRLBAR, CMDWIN),
+ addr_type=ADDR_OTHER,
func='ex_scriptnames',
},
{
@@ -2296,7 +2334,7 @@ return {
command='scscope',
flags=bit.bor(EXTRA, NOTRLCOM),
addr_type=ADDR_LINES,
- func='do_scscope',
+ func='ex_scscope',
},
{
command='set',
@@ -2619,12 +2657,12 @@ return {
{
command='tab',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
- addr_type=ADDR_LINES,
+ addr_type=ADDR_TABS,
func='ex_wrongmodifier',
},
{
command='tabclose',
- flags=bit.bor(RANGE, NOTADR, COUNT, BANG, TRLBAR, CMDWIN),
+ flags=bit.bor(BANG, RANGE, NOTADR, ZEROR, EXTRA, NOSPC, TRLBAR, CMDWIN),
addr_type=ADDR_TABS,
func='ex_tabclose',
},
@@ -2649,7 +2687,7 @@ return {
{
command='tabfirst',
flags=bit.bor(TRLBAR),
- addr_type=ADDR_LINES,
+ addr_type=ADDR_TABS,
func='ex_tabnext',
},
{
@@ -2661,13 +2699,13 @@ return {
{
command='tablast',
flags=bit.bor(TRLBAR),
- addr_type=ADDR_LINES,
+ addr_type=ADDR_TABS,
func='ex_tabnext',
},
{
command='tabnext',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
- addr_type=ADDR_LINES,
+ flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, NOSPC, TRLBAR),
+ addr_type=ADDR_TABS,
func='ex_tabnext',
},
{
@@ -2678,32 +2716,32 @@ return {
},
{
command='tabonly',
- flags=bit.bor(BANG, RANGE, NOTADR, TRLBAR, CMDWIN),
+ flags=bit.bor(BANG, RANGE, NOTADR, ZEROR, EXTRA, NOSPC, TRLBAR, CMDWIN),
addr_type=ADDR_TABS,
func='ex_tabonly',
},
{
command='tabprevious',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
- addr_type=ADDR_LINES,
+ flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, NOSPC, TRLBAR),
+ addr_type=ADDR_TABS_RELATIVE,
func='ex_tabnext',
},
{
command='tabNext',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
- addr_type=ADDR_LINES,
+ flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, NOSPC, TRLBAR),
+ addr_type=ADDR_TABS_RELATIVE,
func='ex_tabnext',
},
{
command='tabrewind',
flags=bit.bor(TRLBAR),
- addr_type=ADDR_LINES,
+ addr_type=ADDR_TABS,
func='ex_tabnext',
},
{
command='tabs',
flags=bit.bor(TRLBAR, CMDWIN),
- addr_type=ADDR_LINES,
+ addr_type=ADDR_TABS,
func='ex_tabs',
},
{
@@ -3032,13 +3070,13 @@ return {
},
{
command='wincmd',
- flags=bit.bor(NEEDARG, WORD1, RANGE, NOTADR),
+ flags=bit.bor(NEEDARG, WORD1, RANGE, NOTADR, CMDWIN),
addr_type=ADDR_WINDOWS,
func='ex_wincmd',
},
{
command='windo',
- flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, RANGE, NOTADR, DFLALL),
+ flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM, RANGE, NOTADR, DFLALL),
addr_type=ADDR_WINDOWS,
func='ex_listdo',
},
@@ -3073,12 +3111,6 @@ return {
func='do_wqall',
},
{
- command='wsverb',
- flags=bit.bor(EXTRA, NOTADR, NEEDARG),
- addr_type=ADDR_LINES,
- func='ex_ni',
- },
- {
command='wshada',
flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN),
addr_type=ADDR_LINES,
@@ -3181,7 +3213,7 @@ return {
enum='CMD_and',
flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, CMDWIN, MODIFY),
addr_type=ADDR_LINES,
- func='do_sub',
+ func='ex_substitute',
},
{
command='<',
@@ -3222,6 +3254,6 @@ return {
enum='CMD_tilde',
flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, CMDWIN, MODIFY),
addr_type=ADDR_LINES,
- func='do_sub',
+ func='ex_substitute',
},
}
diff --git a/src/nvim/ex_cmds2.c b/src/nvim/ex_cmds2.c
index b56b1cf013..0ecc389699 100644
--- a/src/nvim/ex_cmds2.c
+++ b/src/nvim/ex_cmds2.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/// @file ex_cmds2.c
///
/// Some more functions for command line commands
@@ -27,7 +30,6 @@
#include "nvim/mbyte.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/garray.h"
#include "nvim/memory.h"
#include "nvim/move.h"
@@ -121,7 +123,7 @@ void do_debug(char_u *cmd)
int save_msg_scroll = msg_scroll;
int save_State = State;
int save_did_emsg = did_emsg;
- int save_cmd_silent = cmd_silent;
+ const bool save_cmd_silent = cmd_silent;
int save_msg_silent = msg_silent;
int save_emsg_silent = emsg_silent;
int save_redir_off = redir_off;
@@ -187,7 +189,8 @@ void do_debug(char_u *cmd)
}
xfree(cmdline);
- cmdline = getcmdline_prompt('>', NULL, 0, EXPAND_NOTHING, NULL);
+ cmdline = (char_u *)getcmdline_prompt('>', NULL, 0, EXPAND_NOTHING, NULL,
+ CALLBACK_NONE);
if (typeahead_saved) {
restore_typeahead(&typeaheadbuf);
@@ -897,6 +900,21 @@ void ex_pydo(exarg_T *eap)
script_host_do_range("python", eap);
}
+void ex_ruby(exarg_T *eap)
+{
+ script_host_execute("ruby", eap);
+}
+
+void ex_rubyfile(exarg_T *eap)
+{
+ script_host_execute_file("ruby", eap);
+}
+
+void ex_rubydo(exarg_T *eap)
+{
+ script_host_do_range("ruby", eap);
+}
+
void ex_python3(exarg_T *eap)
{
script_host_execute("python3", eap);
@@ -943,23 +961,21 @@ char_u *get_profile_name(expand_T *xp, int idx)
}
/// Handle command line completion for :profile command.
-void set_context_in_profile_cmd(expand_T *xp, char_u *arg)
+void set_context_in_profile_cmd(expand_T *xp, const char *arg)
{
- char_u *end_subcmd;
-
// Default: expand subcommands.
xp->xp_context = EXPAND_PROFILE;
pexpand_what = PEXP_SUBCMD;
- xp->xp_pattern = arg;
+ xp->xp_pattern = (char_u *)arg;
- end_subcmd = skiptowhite(arg);
+ char_u *const end_subcmd = skiptowhite((const char_u *)arg);
if (*end_subcmd == NUL) {
return;
}
- if (end_subcmd - arg == 5 && STRNCMP(arg, "start", 5) == 0) {
+ if ((const char *)end_subcmd - arg == 5 && strncmp(arg, "start", 5) == 0) {
xp->xp_context = EXPAND_FILES;
- xp->xp_pattern = skipwhite(end_subcmd);
+ xp->xp_pattern = skipwhite((const char_u *)end_subcmd);
return;
}
@@ -1023,9 +1039,14 @@ static void profile_reset(void)
uf->uf_tm_total = profile_zero();
uf->uf_tm_self = profile_zero();
uf->uf_tm_children = profile_zero();
+
+ xfree(uf->uf_tml_count);
+ xfree(uf->uf_tml_total);
+ xfree(uf->uf_tml_self);
uf->uf_tml_count = NULL;
uf->uf_tml_total = NULL;
uf->uf_tml_self = NULL;
+
uf->uf_tml_start = profile_zero();
uf->uf_tml_children = profile_zero();
uf->uf_tml_wait = profile_zero();
@@ -1052,7 +1073,7 @@ static void profile_init(scriptitem_T *si)
si->sn_pr_nest = 0;
}
-/// save time when starting to invoke another script or function.
+/// Save time when starting to invoke another script or function.
void script_prof_save(
proftime_T *tm // place to store wait time
)
@@ -1125,12 +1146,14 @@ static void script_dump_profile(FILE *fd)
if (sfd == NULL) {
fprintf(fd, "Cannot open file!\n");
} else {
- for (int i = 0; i < si->sn_prl_ga.ga_len; i++) {
+ // Keep going till the end of file, so that trailing
+ // continuation lines are listed.
+ for (int i = 0; ; i++) {
if (vim_fgets(IObuff, IOSIZE, sfd)) {
break;
}
- pp = &PRL_ITEM(si, i);
- if (pp->snp_count > 0) {
+ if (i < si->sn_prl_ga.ga_len
+ && (pp = &PRL_ITEM(si, i))->snp_count > 0) {
fprintf(fd, "%5d ", pp->snp_count);
if (profile_equal(pp->sn_prl_total, pp->sn_prl_self)) {
fprintf(fd, " ");
@@ -1167,6 +1190,7 @@ bool prof_def_func(void)
int autowrite(buf_T *buf, int forceit)
{
int r;
+ bufref_T bufref;
if (!(p_aw || p_awa) || !p_write
// never autowrite a "nofile" or "nowrite" buffer
@@ -1174,17 +1198,18 @@ int autowrite(buf_T *buf, int forceit)
|| (!forceit && buf->b_p_ro) || buf->b_ffname == NULL) {
return FAIL;
}
+ set_bufref(&bufref, buf);
r = buf_write_all(buf, forceit);
// Writing may succeed but the buffer still changed, e.g., when there is a
// conversion error. We do want to return FAIL then.
- if (buf_valid(buf) && bufIsChanged(buf)) {
+ if (bufref_valid(&bufref) && bufIsChanged(buf)) {
r = FAIL;
}
return r;
}
-/// flush all buffers, except the ones that are readonly
+/// Flush all buffers, except the ones that are readonly or are never written.
void autowrite_all(void)
{
if (!(p_aw || p_awa) || !p_write) {
@@ -1192,10 +1217,12 @@ void autowrite_all(void)
}
FOR_ALL_BUFFERS(buf) {
- if (bufIsChanged(buf) && !buf->b_p_ro) {
+ if (bufIsChanged(buf) && !buf->b_p_ro && !bt_dontwrite(buf)) {
+ bufref_T bufref;
+ set_bufref(&bufref, buf);
(void)buf_write_all(buf, false);
// an autocommand may have deleted the buffer
- if (!buf_valid(buf)) {
+ if (!bufref_valid(&bufref)) {
buf = firstbuf;
}
}
@@ -1207,6 +1234,8 @@ void autowrite_all(void)
bool check_changed(buf_T *buf, int flags)
{
int forceit = (flags & CCGD_FORCEIT);
+ bufref_T bufref;
+ set_bufref(&bufref, buf);
if (!forceit
&& bufIsChanged(buf)
@@ -1222,12 +1251,12 @@ bool check_changed(buf_T *buf, int flags)
}
}
}
- if (!buf_valid(buf)) {
+ if (!bufref_valid(&bufref)) {
// Autocommand deleted buffer, oops! It's not changed now.
return false;
}
dialog_changed(buf, count > 1);
- if (!buf_valid(buf)) {
+ if (!bufref_valid(&bufref)) {
// Autocommand deleted buffer, oops! It's not changed now.
return false;
}
@@ -1250,15 +1279,13 @@ bool check_changed(buf_T *buf, int flags)
///
/// @param buf
/// @param checkall may abandon all changed buffers
-void dialog_changed(buf_T *buf, int checkall)
+void dialog_changed(buf_T *buf, bool checkall)
{
char_u buff[DIALOG_MSG_SIZE];
int ret;
exarg_T ea;
- dialog_msg(buff, _("Save changes to \"%s\"?"),
- (buf->b_fname != NULL) ?
- buf->b_fname : (char_u *)_("Untitled"));
+ dialog_msg(buff, _("Save changes to \"%s\"?"), buf->b_fname);
if (checkall) {
ret = vim_dialog_yesnoallcancel(VIM_QUESTION, NULL, buff, 1);
} else {
@@ -1286,9 +1313,10 @@ void dialog_changed(buf_T *buf, int checkall)
// Skip readonly buffers, these need to be confirmed
// individually.
FOR_ALL_BUFFERS(buf2) {
- if (bufIsChanged(buf2)
- && (buf2->b_ffname != NULL)
- && !buf2->b_p_ro) {
+ if (bufIsChanged(buf2) && (buf2->b_ffname != NULL) && !buf2->b_p_ro) {
+ bufref_T bufref;
+ set_bufref(&bufref, buf2);
+
if (buf2->b_fname != NULL
&& check_overwrite(&ea, buf2, buf2->b_fname,
buf2->b_ffname, false) == OK) {
@@ -1296,7 +1324,7 @@ void dialog_changed(buf_T *buf, int checkall)
(void)buf_write_all(buf2, false);
}
// an autocommand may have deleted the buffer
- if (!buf_valid(buf2)) {
+ if (!bufref_valid(&bufref)) {
buf2 = firstbuf;
}
}
@@ -1309,11 +1337,27 @@ void dialog_changed(buf_T *buf, int checkall)
}
}
+/// Ask the user whether to close the terminal buffer or not.
+///
+/// @param buf The terminal buffer.
+/// @return bool Whether to close the buffer or not.
+bool dialog_close_terminal(buf_T *buf)
+{
+ char_u buff[DIALOG_MSG_SIZE];
+
+ dialog_msg(buff, _("Close \"%s\"?"),
+ (buf->b_fname != NULL) ? buf->b_fname : (char_u *)"?");
+
+ int ret = vim_dialog_yesnocancel(VIM_QUESTION, NULL, buff, 1);
+
+ return (ret == VIM_YES) ? true : false;
+}
+
/// Return true if the buffer "buf" can be abandoned, either by making it
/// hidden, autowriting it or unloading it.
bool can_abandon(buf_T *buf, int forceit)
{
- return P_HID(buf)
+ return buf_hide(buf)
|| !bufIsChanged(buf)
|| buf->b_nwindows > 1
|| autowrite(buf, forceit) == OK
@@ -1393,11 +1437,14 @@ bool check_changed_any(bool hidden, bool unload)
continue;
}
if ((!hidden || buf->b_nwindows == 0) && bufIsChanged(buf)) {
+ bufref_T bufref;
+ set_bufref(&bufref, buf);
+
// Try auto-writing the buffer. If this fails but the buffer no
// longer exists it's not changed, that's OK.
if (check_changed(buf, (p_awa ? CCGD_AW : 0)
| CCGD_MULTWIN
- | CCGD_ALLBUF) && buf_valid(buf)) {
+ | CCGD_ALLBUF) && bufref_valid(&bufref)) {
break; // didn't save - still changes
}
}
@@ -1433,9 +1480,11 @@ bool check_changed_any(bool hidden, bool unload)
if (buf != curbuf) {
FOR_ALL_TAB_WINDOWS(tp, wp) {
if (wp->w_buffer == buf) {
+ bufref_T bufref;
+ set_bufref(&bufref, buf);
goto_tabpage_win(tp, wp);
// Paranoia: did autocmds wipe out the buffer with changes?
- if (!buf_valid(buf)) {
+ if (!bufref_valid(&bufref)) {
goto theend;
}
goto buf_found;
@@ -1477,7 +1526,7 @@ int buf_write_all(buf_T *buf, int forceit)
(linenr_T)1, buf->b_ml.ml_line_count, NULL,
false, forceit, true, false));
if (curbuf != old_curbuf) {
- msg_source(hl_attr(HLF_W));
+ msg_source(HL_ATTR(HLF_W));
MSG(_("Warning: Entered other buffer unexpectedly (check autocommands)"));
}
return retval;
@@ -1523,12 +1572,17 @@ static char_u *do_one_arg(char_u *str)
/// Separate the arguments in "str" and return a list of pointers in the
/// growarray "gap".
-void get_arglist(garray_T *gap, char_u *str)
+static void get_arglist(garray_T *gap, char_u *str, int escaped)
{
ga_init(gap, (int)sizeof(char_u *), 20);
while (*str != NUL) {
GA_APPEND(char_u *, gap, str);
+ // If str is escaped, don't handle backslashes or spaces
+ if (!escaped) {
+ return;
+ }
+
// Isolate one argument, change it in-place, put a NUL after it.
str = do_one_arg(str);
}
@@ -1543,7 +1597,7 @@ int get_arglist_exp(char_u *str, int *fcountp, char_u ***fnamesp, bool wig)
garray_T ga;
int i;
- get_arglist(&ga, str);
+ get_arglist(&ga, str, true);
if (wig) {
i = expand_wildcards(ga.ga_len, (char_u **)ga.ga_data,
@@ -1574,6 +1628,7 @@ static int do_arglist(char_u *str, int what, int after)
char_u **exp_files;
char_u *p;
int match;
+ int arg_escaped = true;
// Set default argument for ":argadd" command.
if (what == AL_ADD && *str == NUL) {
@@ -1581,10 +1636,11 @@ static int do_arglist(char_u *str, int what, int after)
return FAIL;
}
str = curbuf->b_fname;
+ arg_escaped = false;
}
// Collect all file name arguments in "new_ga".
- get_arglist(&new_ga, str);
+ get_arglist(&new_ga, str, arg_escaped);
if (what == AL_DEL) {
regmatch_T regmatch;
@@ -1716,7 +1772,7 @@ void ex_args(exarg_T *eap)
}
}
- if (!ends_excmd(*eap->arg)) {
+ if (*eap->arg != NUL) {
// ":args file ..": define new argument list, handle like ":next"
// Also for ":argslocal file .." and ":argsglobal file ..".
ex_next(eap);
@@ -1818,12 +1874,12 @@ void do_argfile(exarg_T *eap, int argn)
// if 'hidden' set, only check for changed file when re-editing
// the same buffer
other = true;
- if (P_HID(curbuf)) {
+ if (buf_hide(curbuf)) {
p = (char_u *)fix_fname((char *)alist_name(&ARGLIST[argn]));
other = otherfile(p);
xfree(p);
}
- if ((!P_HID(curbuf) || !other)
+ if ((!buf_hide(curbuf) || !other)
&& check_changed(curbuf, CCGD_AW
| (other ? 0 : CCGD_MULTWIN)
| (eap->forceit ? CCGD_FORCEIT : 0)
@@ -1843,7 +1899,7 @@ void do_argfile(exarg_T *eap, int argn)
// argument index.
if (do_ecmd(0, alist_name(&ARGLIST[curwin->w_arg_idx]), NULL,
eap, ECMD_LAST,
- (P_HID(curwin->w_buffer) ? ECMD_HIDE : 0)
+ (buf_hide(curwin->w_buffer) ? ECMD_HIDE : 0)
+ (eap->forceit ? ECMD_FORCEIT : 0), curwin) == FAIL) {
curwin->w_arg_idx = old_arg_idx;
} else if (eap->cmdidx != CMD_argdo) {
@@ -1860,7 +1916,7 @@ void ex_next(exarg_T *eap)
// check for changed buffer now, if this fails the argument list is not
// redefined.
- if (P_HID(curbuf)
+ if (buf_hide(curbuf)
|| eap->cmdidx == CMD_snext
|| !check_changed(curbuf, CCGD_AW
| (eap->forceit ? CCGD_FORCEIT : 0)
@@ -1880,31 +1936,21 @@ void ex_next(exarg_T *eap)
/// ":argedit"
void ex_argedit(exarg_T *eap)
{
- int fnum;
- int i;
- char_u *s;
+ int i = eap->addr_count ? (int)eap->line2 : curwin->w_arg_idx + 1;
- // Add the argument to the buffer list and get the buffer number.
- fnum = buflist_add(eap->arg, BLN_LISTED);
-
- // Check if this argument is already in the argument list.
- for (i = 0; i < ARGCOUNT; i++) {
- if (ARGLIST[i].ae_fnum == fnum) {
- break;
- }
- }
- if (i == ARGCOUNT) {
- // Can't find it, add it to the argument list.
- s = vim_strsave(eap->arg);
- int after = eap->addr_count > 0 ? (int)eap->line2 : curwin->w_arg_idx + 1;
- i = alist_add_list(1, &s, after);
- curwin->w_arg_idx = i;
+ if (do_arglist(eap->arg, AL_ADD, i) == FAIL) {
+ return;
}
+ maketitle();
- alist_check_arg_idx();
-
+ if (curwin->w_arg_idx == 0 && (curbuf->b_ml.ml_flags & ML_EMPTY)
+ && curbuf->b_ffname == NULL) {
+ i = 0;
+ }
// Edit the argument.
- do_argfile(eap, i);
+ if (i < ARGCOUNT) {
+ do_argfile(eap, i);
+ }
}
/// ":argadd"
@@ -1924,8 +1970,14 @@ void ex_argdelete(exarg_T *eap)
eap->line2 = ARGCOUNT;
}
linenr_T n = eap->line2 - eap->line1 + 1;
- if (*eap->arg != NUL || n <= 0) {
+ if (*eap->arg != NUL) {
+ // Can't have both a range and an argument.
EMSG(_(e_invarg));
+ } else if (n <= 0) {
+ // Don't give an error for ":%argdel" if the list is empty.
+ if (eap->line1 != 1 || eap->line2 != 0) {
+ EMSG(_(e_invrange));
+ }
} else {
for (linenr_T i = eap->line1; i <= eap->line2; i++) {
xfree(ARGLIST[i - 1].ae_fname);
@@ -1968,11 +2020,9 @@ void ex_listdo(exarg_T *eap)
save_ei = au_event_disable(",Syntax");
}
- start_global_changes();
-
if (eap->cmdidx == CMD_windo
|| eap->cmdidx == CMD_tabdo
- || P_HID(curbuf)
+ || buf_hide(curbuf)
|| !check_changed(curbuf, CCGD_AW
| (eap->forceit ? CCGD_FORCEIT : 0)
| CCGD_EXCMD)) {
@@ -2049,9 +2099,9 @@ void ex_listdo(exarg_T *eap)
// Clear 'shm' to avoid that the file message overwrites
// any output from the command.
p_shm_save = vim_strsave(p_shm);
- set_option_value((char_u *)"shm", 0L, (char_u *)"", 0);
+ set_option_value("shm", 0L, "", 0);
do_argfile(eap, i);
- set_option_value((char_u *)"shm", 0L, p_shm_save, 0);
+ set_option_value("shm", 0L, (char *)p_shm_save, 0);
xfree(p_shm_save);
}
if (curwin->w_arg_idx != i) {
@@ -2080,9 +2130,9 @@ void ex_listdo(exarg_T *eap)
// Remember the number of the next listed buffer, in case
// ":bwipe" is used or autocommands do something strange.
next_fnum = -1;
- for (buf_T *buf = curbuf->b_next; buf != NULL; buf = buf->b_next) {
- if (buf->b_p_bl) {
- next_fnum = buf->b_fnum;
+ for (buf_T *bp = curbuf->b_next; bp != NULL; bp = bp->b_next) {
+ if (bp->b_p_bl) {
+ next_fnum = bp->b_fnum;
break;
}
}
@@ -2114,9 +2164,9 @@ void ex_listdo(exarg_T *eap)
// Go to the next buffer. Clear 'shm' to avoid that the file
// message overwrites any output from the command.
p_shm_save = vim_strsave(p_shm);
- set_option_value((char_u *)"shm", 0L, (char_u *)"", 0);
+ set_option_value("shm", 0L, "", 0);
goto_buffer(eap, DOBUF_FIRST, FORWARD, next_fnum);
- set_option_value((char_u *)"shm", 0L, p_shm_save, 0);
+ set_option_value("shm", 0L, (char *)p_shm_save, 0);
xfree(p_shm_save);
// If autocommands took us elsewhere, quit here.
@@ -2166,7 +2216,6 @@ void ex_listdo(exarg_T *eap)
apply_autocmds(EVENT_SYNTAX, curbuf->b_p_syn,
curbuf->b_fname, true, curbuf);
}
- end_global_changes();
}
/// Add files[count] to the arglist of the current window after arg "after".
@@ -2203,6 +2252,15 @@ static int alist_add_list(int count, char_u **files, int after)
}
}
+// Function given to ExpandGeneric() to obtain the possible arguments of the
+// argedit and argdelete commands.
+char_u *get_arglist_name(expand_T *xp FUNC_ATTR_UNUSED, int idx)
+{
+ if (idx >= ARGCOUNT) {
+ return NULL;
+ }
+ return alist_name(&ARGLIST[idx]);
+}
/// ":compiler[!] {name}"
void ex_compiler(exarg_T *eap)
@@ -2227,14 +2285,14 @@ void ex_compiler(exarg_T *eap)
// plugin will then skip the settings. Afterwards set
// "b:current_compiler" and restore "current_compiler".
// Explicitly prepend "g:" to make it work in a function.
- old_cur_comp = get_var_value((char_u *)"g:current_compiler");
+ old_cur_comp = get_var_value("g:current_compiler");
if (old_cur_comp != NULL) {
old_cur_comp = vim_strsave(old_cur_comp);
}
do_cmdline_cmd("command -nargs=* CompilerSet setlocal <args>");
}
- do_unlet((char_u *)"g:current_compiler", true);
- do_unlet((char_u *)"b:current_compiler", true);
+ do_unlet(S_LEN("g:current_compiler"), true);
+ do_unlet(S_LEN("b:current_compiler"), true);
snprintf((char *)buf, bufsize, "compiler/%s.vim", eap->arg);
if (source_runtime(buf, DIP_ALL) == FAIL) {
@@ -2245,7 +2303,7 @@ void ex_compiler(exarg_T *eap)
do_cmdline_cmd(":delcommand CompilerSet");
// Set "b:current_compiler" from "current_compiler".
- p = get_var_value((char_u *)"g:current_compiler");
+ p = get_var_value("g:current_compiler");
if (p != NULL) {
set_internal_string_var((char_u *)"b:current_compiler", p);
}
@@ -2257,7 +2315,7 @@ void ex_compiler(exarg_T *eap)
old_cur_comp);
xfree(old_cur_comp);
} else {
- do_unlet((char_u *)"g:current_compiler", true);
+ do_unlet(S_LEN("g:current_compiler"), true);
}
}
}
@@ -2294,16 +2352,6 @@ static void source_callback(char_u *fname, void *cookie)
(void)do_source(fname, false, DOSO_NONE);
}
-/// Source the file "name" from all directories in 'runtimepath'.
-/// "name" can contain wildcards.
-/// When "flags" has DIP_ALL: source all files, otherwise only the first one.
-///
-/// return FAIL when no file could be sourced, OK otherwise.
-int source_runtime(char_u *name, int flags)
-{
- return do_in_runtimepath(name, flags, source_callback, NULL);
-}
-
/// Find the file "name" in all directories in "path" and invoke
/// "callback(fname, cookie)".
/// "name" can contain wildcards.
@@ -2338,12 +2386,25 @@ int do_in_path(char_u *path, char_u *name, int flags,
while (*rtp != NUL && ((flags & DIP_ALL) || !did_one)) {
// Copy the path from 'runtimepath' to buf[].
copy_option_part(&rtp, buf, MAXPATHL, ",");
+ size_t buflen = STRLEN(buf);
+
+ // Skip after or non-after directories.
+ if (flags & (DIP_NOAFTER | DIP_AFTER)) {
+ bool is_after = buflen >= 5
+ && STRCMP(buf + buflen - 5, "after") == 0;
+
+ if ((is_after && (flags & DIP_NOAFTER))
+ || (!is_after && (flags & DIP_AFTER))) {
+ continue;
+ }
+ }
+
if (name == NULL) {
(*callback)(buf, (void *)&cookie);
if (!did_one) {
did_one = (cookie == NULL);
}
- } else if (STRLEN(buf) + STRLEN(name) + 2 < MAXPATHL) {
+ } else if (buflen + STRLEN(name) + 2 < MAXPATHL) {
add_pathsep((char *)buf);
tail = buf + STRLEN(buf);
@@ -2396,21 +2457,21 @@ int do_in_path(char_u *path, char_u *name, int flags,
return did_one ? OK : FAIL;
}
-/// Find "name" in 'runtimepath'. When found, invoke the callback function for
+/// Find "name" in "path". When found, invoke the callback function for
/// it: callback(fname, "cookie")
/// When "flags" has DIP_ALL repeat for all matches, otherwise only the first
/// one is used.
/// Returns OK when at least one match found, FAIL otherwise.
-/// If "name" is NULL calls callback for each entry in runtimepath. Cookie is
+/// If "name" is NULL calls callback for each entry in "path". Cookie is
/// passed by reference in this case, setting it to NULL indicates that callback
/// has done its job.
-int do_in_runtimepath(char_u *name, int flags, DoInRuntimepathCB callback,
- void *cookie)
+int do_in_path_and_pp(char_u *path, char_u *name, int flags,
+ DoInRuntimepathCB callback, void *cookie)
{
int done = FAIL;
if ((flags & DIP_NORTP) == 0) {
- done = do_in_path(p_rtp, name, flags, callback, cookie);
+ done = do_in_path(path, name, flags, callback, cookie);
}
if ((done == FAIL || (flags & DIP_ALL)) && (flags & DIP_START)) {
@@ -2438,6 +2499,29 @@ int do_in_runtimepath(char_u *name, int flags, DoInRuntimepathCB callback,
return done;
}
+/// Just like do_in_path_and_pp(), using 'runtimepath' for "path".
+int do_in_runtimepath(char_u *name, int flags, DoInRuntimepathCB callback,
+ void *cookie)
+{
+ return do_in_path_and_pp(p_rtp, name, flags, callback, cookie);
+}
+
+/// Source the file "name" from all directories in 'runtimepath'.
+/// "name" can contain wildcards.
+/// When "flags" has DIP_ALL: source all files, otherwise only the first one.
+///
+/// return FAIL when no file could be sourced, OK otherwise.
+int source_runtime(char_u *name, int flags)
+{
+ return source_in_path(p_rtp, name, flags);
+}
+
+/// Just like source_runtime(), but use "path" instead of 'runtimepath'.
+int source_in_path(char_u *path, char_u *name, int flags)
+{
+ return do_in_path_and_pp(path, name, flags, source_callback, NULL);
+}
+
// Expand wildcards in "pat" and invoke do_source() for each match.
static void source_all_matches(char_u *pat)
{
@@ -2452,162 +2536,399 @@ static void source_all_matches(char_u *pat)
}
}
-// used for "cookie" of add_pack_plugin()
-static int APP_ADD_DIR;
-static int APP_LOAD;
-static int APP_BOTH;
-
-static void add_pack_plugin(char_u *fname, void *cookie)
+/// Add the package directory to 'runtimepath'
+static int add_pack_dir_to_rtp(char_u *fname)
{
char_u *p4, *p3, *p2, *p1, *p;
- char_u *new_rtp;
- char_u *ffname = (char_u *)fix_fname((char *)fname);
+ char_u *buf = NULL;
+ char *afterdir = NULL;
+ int retval = FAIL;
- if (ffname == NULL) {
- return;
+ p4 = p3 = p2 = p1 = get_past_head(fname);
+ for (p = p1; *p; MB_PTR_ADV(p)) {
+ if (vim_ispathsep_nocolon(*p)) {
+ p4 = p3; p3 = p2; p2 = p1; p1 = p;
+ }
}
- if (cookie != &APP_LOAD && strstr((char *)p_rtp, (char *)ffname) == NULL) {
- // directory is not yet in 'runtimepath', add it
- p4 = p3 = p2 = p1 = get_past_head(ffname);
- for (p = p1; *p; mb_ptr_adv(p)) {
- if (vim_ispathsep_nocolon(*p)) {
- p4 = p3; p3 = p2; p2 = p1; p1 = p;
- }
- }
+ // now we have:
+ // rtp/pack/name/start/name
+ // p4 p3 p2 p1
+ //
+ // find the part up to "pack" in 'runtimepath'
+ p4++; // append pathsep in order to expand symlink
+ char_u c = *p4;
+ *p4 = NUL;
+ char *const ffname = fix_fname((char *)fname);
+ *p4 = c;
- // now we have:
- // rtp/pack/name/start/name
- // p4 p3 p2 p1
- //
- // find the part up to "pack" in 'runtimepath'
- char_u c = *p4;
- *p4 = NUL;
+ if (ffname == NULL) {
+ return FAIL;
+ }
- // Find "ffname" in "p_rtp", ignoring '/' vs '\' differences
- size_t fname_len = STRLEN(ffname);
- char_u *insp = p_rtp;
- for (;;) {
- if (vim_fnamencmp(insp, ffname, fname_len) == 0) {
- break;
+ // Find "ffname" in "p_rtp", ignoring '/' vs '\' differences
+ // Also stop at the first "after" directory
+ size_t fname_len = strlen(ffname);
+ buf = try_malloc(MAXPATHL);
+ if (buf == NULL) {
+ goto theend;
+ }
+ const char *insp = NULL;
+ const char *after_insp = NULL;
+ for (const char *entry = (const char *)p_rtp; *entry != NUL; ) {
+ const char *cur_entry = entry;
+
+ copy_option_part((char_u **)&entry, buf, MAXPATHL, ",");
+ if (insp == NULL) {
+ add_pathsep((char *)buf);
+ char *const rtp_ffname = fix_fname((char *)buf);
+ if (rtp_ffname == NULL) {
+ goto theend;
}
- insp = vim_strchr(insp, ',');
- if (insp == NULL) {
- break;
+ bool match = path_fnamencmp(rtp_ffname, ffname, fname_len) == 0;
+ xfree(rtp_ffname);
+ if (match) {
+ // Insert "ffname" after this entry (and comma).
+ insp = entry;
}
- insp++;
}
- if (insp == NULL) {
- // not found, append at the end
- insp = p_rtp + STRLEN(p_rtp);
- } else {
- // append after the matching directory.
- insp += STRLEN(ffname);
- while (*insp != NUL && *insp != ',') {
- insp++;
+ if ((p = (char_u *)strstr((char *)buf, "after")) != NULL
+ && p > buf
+ && vim_ispathsep(p[-1])
+ && (vim_ispathsep(p[5]) || p[5] == NUL || p[5] == ',')) {
+ if (insp == NULL) {
+ // Did not find "ffname" before the first "after" directory,
+ // insert it before this entry.
+ insp = cur_entry;
}
+ after_insp = cur_entry;
+ break;
}
- *p4 = c;
+ }
- // check if rtp/pack/name/start/name/after exists
- char *afterdir = concat_fnames((char *)ffname, "after", true);
- size_t afterlen = 0;
- if (os_isdir((char_u *)afterdir)) {
- afterlen = STRLEN(afterdir) + 1; // add one for comma
- }
+ if (insp == NULL) {
+ // Both "fname" and "after" not found, append at the end.
+ insp = (const char *)p_rtp + STRLEN(p_rtp);
+ }
- size_t oldlen = STRLEN(p_rtp);
- size_t addlen = STRLEN(ffname) + 1; // add one for comma
- new_rtp = try_malloc(oldlen + addlen + afterlen + 1); // add one for NUL
- if (new_rtp == NULL) {
- goto theend;
- }
- uintptr_t keep = (uintptr_t)(insp - p_rtp);
- memmove(new_rtp, p_rtp, keep);
- new_rtp[keep] = ',';
- memmove(new_rtp + keep + 1, ffname, addlen);
- if (p_rtp[keep] != NUL) {
- memmove(new_rtp + keep + addlen, p_rtp + keep,
- oldlen - keep + 1);
- }
- if (afterlen > 0) {
- STRCAT(new_rtp, ",");
- STRCAT(new_rtp, afterdir);
- }
- set_option_value((char_u *)"rtp", 0L, new_rtp, 0);
- xfree(new_rtp);
- xfree(afterdir);
+ // check if rtp/pack/name/start/name/after exists
+ afterdir = concat_fnames((char *)fname, "after", true);
+ size_t afterlen = 0;
+ if (os_isdir((char_u *)afterdir)) {
+ afterlen = strlen(afterdir) + 1; // add one for comma
}
- if (cookie != &APP_ADD_DIR) {
- static const char *plugpat = "%s/plugin/*.vim"; // NOLINT
- static const char *ftpat = "%s/ftdetect/*.vim"; // NOLINT
+ const size_t oldlen = STRLEN(p_rtp);
+ const size_t addlen = STRLEN(fname) + 1; // add one for comma
+ const size_t new_rtp_capacity = oldlen + addlen + afterlen + 1;
+ // add one for NUL ------------------------------------------^
+ char *const new_rtp = try_malloc(new_rtp_capacity);
+ if (new_rtp == NULL) {
+ goto theend;
+ }
- size_t len = STRLEN(ffname) + STRLEN(ftpat);
- char_u *pat = try_malloc(len + 1);
- if (pat == NULL) {
- goto theend;
- }
- vim_snprintf((char *)pat, len, plugpat, ffname);
- source_all_matches(pat);
+ // We now have 'rtp' parts: {keep}{keep_after}{rest}.
+ // Create new_rtp, first: {keep},{fname}
+ size_t keep = (size_t)(insp - (const char *)p_rtp);
+ memmove(new_rtp, p_rtp, keep);
+ size_t new_rtp_len = keep;
+ if (*insp == NUL) {
+ new_rtp[new_rtp_len++] = ','; // add comma before
+ }
+ memmove(new_rtp + new_rtp_len, fname, addlen - 1);
+ new_rtp_len += addlen - 1;
+ if (*insp != NUL) {
+ new_rtp[new_rtp_len++] = ','; // add comma after
+ }
- char_u *cmd = vim_strsave((char_u *)"g:did_load_filetypes");
+ if (afterlen > 0 && after_insp != NULL) {
+ size_t keep_after = (size_t)(after_insp - (const char *)p_rtp);
- // If runtime/filetype.vim wasn't loaded yet, the scripts will be
- // found when it loads.
- if (eval_to_number(cmd) > 0) {
- do_cmdline_cmd("augroup filetypedetect");
- vim_snprintf((char *)pat, len, ftpat, ffname);
- source_all_matches(pat);
- do_cmdline_cmd("augroup END");
- }
- xfree(cmd);
- xfree(pat);
+ // Add to new_rtp: {keep},{fname}{keep_after},{afterdir}
+ memmove(new_rtp + new_rtp_len, p_rtp + keep, keep_after - keep);
+ new_rtp_len += keep_after - keep;
+ memmove(new_rtp + new_rtp_len, afterdir, afterlen - 1);
+ new_rtp_len += afterlen - 1;
+ new_rtp[new_rtp_len++] = ',';
+ keep = keep_after;
+ }
+
+ if (p_rtp[keep] != NUL) {
+ // Append rest: {keep},{fname}{keep_after},{afterdir}{rest}
+ memmove(new_rtp + new_rtp_len, p_rtp + keep, oldlen - keep + 1);
+ } else {
+ new_rtp[new_rtp_len] = NUL;
+ }
+
+ if (afterlen > 0 && after_insp == NULL) {
+ // Append afterdir when "after" was not found:
+ // {keep},{fname}{rest},{afterdir}
+ xstrlcat(new_rtp, ",", new_rtp_capacity);
+ xstrlcat(new_rtp, afterdir, new_rtp_capacity);
+ }
+
+ set_option_value("rtp", 0L, new_rtp, 0);
+ xfree(new_rtp);
+ retval = OK;
+
+theend:
+ xfree(buf);
+ xfree(ffname);
+ xfree(afterdir);
+ return retval;
+}
+
+/// Load scripts in "plugin" and "ftdetect" directories of the package.
+static int load_pack_plugin(char_u *fname)
+{
+ static const char *plugpat = "%s/plugin/**/*.vim"; // NOLINT
+ static const char *ftpat = "%s/ftdetect/*.vim"; // NOLINT
+
+ int retval = FAIL;
+ char *const ffname = fix_fname((char *)fname);
+ size_t len = strlen(ffname) + STRLEN(ftpat);
+ char_u *pat = try_malloc(len + 1);
+ if (pat == NULL) {
+ goto theend;
}
+ vim_snprintf((char *)pat, len, plugpat, ffname);
+ source_all_matches(pat);
+
+ char_u *cmd = vim_strsave((char_u *)"g:did_load_filetypes");
+
+ // If runtime/filetype.vim wasn't loaded yet, the scripts will be
+ // found when it loads.
+ if (eval_to_number(cmd) > 0) {
+ do_cmdline_cmd("augroup filetypedetect");
+ vim_snprintf((char *)pat, len, ftpat, ffname);
+ source_all_matches(pat);
+ do_cmdline_cmd("augroup END");
+ }
+ xfree(cmd);
+ xfree(pat);
+ retval = OK;
theend:
xfree(ffname);
+
+ return retval;
+}
+
+// used for "cookie" of add_pack_plugin()
+static int APP_ADD_DIR;
+static int APP_LOAD;
+static int APP_BOTH;
+
+static void add_pack_plugin(char_u *fname, void *cookie)
+{
+ if (cookie != &APP_LOAD) {
+ char *buf = xmalloc(MAXPATHL);
+ bool found = false;
+
+ const char *p = (const char *)p_rtp;
+ while (*p != NUL) {
+ copy_option_part((char_u **)&p, (char_u *)buf, MAXPATHL, ",");
+ if (path_fnamecmp(buf, (char *)fname) == 0) {
+ found = true;
+ break;
+ }
+ }
+ xfree(buf);
+ if (!found) {
+ // directory is not yet in 'runtimepath', add it
+ if (add_pack_dir_to_rtp(fname) == FAIL) {
+ return;
+ }
+ }
+ }
+
+ if (cookie != &APP_ADD_DIR) {
+ load_pack_plugin(fname);
+ }
+}
+
+/// Add all packages in the "start" directory to 'runtimepath'.
+void add_pack_start_dirs(void)
+{
+ do_in_path(p_pp, (char_u *)"pack/*/start/*", DIP_ALL + DIP_DIR, // NOLINT
+ add_pack_plugin, &APP_ADD_DIR);
}
-static bool did_source_packages = false;
+/// Load plugins from all packages in the "start" directory.
+void load_start_packages(void)
+{
+ did_source_packages = true;
+ do_in_path(p_pp, (char_u *)"pack/*/start/*", DIP_ALL + DIP_DIR, // NOLINT
+ add_pack_plugin, &APP_LOAD);
+}
// ":packloadall"
// Find plugins in the package directories and source them.
void ex_packloadall(exarg_T *eap)
{
- if (!did_source_packages || (eap != NULL && eap->forceit)) {
- did_source_packages = true;
-
+ if (!did_source_packages || eap->forceit) {
// First do a round to add all directories to 'runtimepath', then load
// the plugins. This allows for plugins to use an autoload directory
// of another plugin.
- do_in_path(p_pp, (char_u *)"pack/*/start/*", DIP_ALL + DIP_DIR, // NOLINT
- add_pack_plugin, &APP_ADD_DIR);
- do_in_path(p_pp, (char_u *)"pack/*/start/*", DIP_ALL + DIP_DIR, // NOLINT
- add_pack_plugin, &APP_LOAD);
+ add_pack_start_dirs();
+ load_start_packages();
}
}
/// ":packadd[!] {name}"
void ex_packadd(exarg_T *eap)
{
- static const char *plugpat = "pack/*/opt/%s"; // NOLINT
+ static const char *plugpat = "pack/*/%s/%s"; // NOLINT
+ int res = OK;
- size_t len = STRLEN(plugpat) + STRLEN(eap->arg);
- char *pat = (char *)xmallocz(len);
- vim_snprintf(pat, len, plugpat, eap->arg);
- do_in_path(p_pp, (char_u *)pat, DIP_ALL + DIP_DIR + DIP_ERR, add_pack_plugin,
- eap->forceit ? &APP_ADD_DIR : &APP_BOTH);
- xfree(pat);
+ // Round 1: use "start", round 2: use "opt".
+ for (int round = 1; round <= 2; round++) {
+ // Only look under "start" when loading packages wasn't done yet.
+ if (round == 1 && did_source_packages) {
+ continue;
+ }
+
+ const size_t len = STRLEN(plugpat) + STRLEN(eap->arg) + 5;
+ char *pat = xmallocz(len);
+ vim_snprintf(pat, len, plugpat, round == 1 ? "start" : "opt", eap->arg);
+ // The first round don't give a "not found" error, in the second round
+ // only when nothing was found in the first round.
+ res = do_in_path(p_pp, (char_u *)pat,
+ DIP_ALL + DIP_DIR
+ + (round == 2 && res == FAIL ? DIP_ERR : 0),
+ add_pack_plugin, eap->forceit ? &APP_ADD_DIR : &APP_BOTH);
+ xfree(pat);
+ }
}
/// ":options"
void ex_options(exarg_T *eap)
{
+ vim_setenv("OPTWIN_CMD", cmdmod.tab ? "tab" : "");
cmd_source((char_u *)SYS_OPTWIN_FILE, NULL);
}
+// Detect Python 3 or 2, and initialize 'pyxversion'.
+void init_pyxversion(void)
+{
+ if (p_pyx == 0) {
+ if (!eval_has_provider("python3")) {
+ p_pyx = 3;
+ } else if (!eval_has_provider("python")) {
+ p_pyx = 2;
+ }
+ }
+}
+
+// Does a file contain one of the following strings at the beginning of any
+// line?
+// "#!(any string)python2" => returns 2
+// "#!(any string)python3" => returns 3
+// "# requires python 2.x" => returns 2
+// "# requires python 3.x" => returns 3
+// otherwise return 0.
+static int requires_py_version(char_u *filename)
+{
+ FILE *file;
+ int requires_py_version = 0;
+ int i, lines;
+
+ lines = (int)p_mls;
+ if (lines < 0) {
+ lines = 5;
+ }
+
+ file = mch_fopen((char *)filename, "r");
+ if (file != NULL) {
+ for (i = 0; i < lines; i++) {
+ if (vim_fgets(IObuff, IOSIZE, file)) {
+ break;
+ }
+ if (i == 0 && IObuff[0] == '#' && IObuff[1] == '!') {
+ // Check shebang.
+ if (strstr((char *)IObuff + 2, "python2") != NULL) {
+ requires_py_version = 2;
+ break;
+ }
+ if (strstr((char *)IObuff + 2, "python3") != NULL) {
+ requires_py_version = 3;
+ break;
+ }
+ }
+ IObuff[21] = '\0';
+ if (STRCMP("# requires python 2.x", IObuff) == 0) {
+ requires_py_version = 2;
+ break;
+ }
+ if (STRCMP("# requires python 3.x", IObuff) == 0) {
+ requires_py_version = 3;
+ break;
+ }
+ }
+ fclose(file);
+ }
+ return requires_py_version;
+}
+
+
+// Source a python file using the requested python version.
+static void source_pyx_file(exarg_T *eap, char_u *fname)
+{
+ exarg_T ex;
+ long int v = requires_py_version(fname);
+
+ init_pyxversion();
+ if (v == 0) {
+ // user didn't choose a preference, 'pyx' is used
+ v = p_pyx;
+ }
+
+ // now source, if required python version is not supported show
+ // unobtrusive message.
+ if (eap == NULL) {
+ memset(&ex, 0, sizeof(ex));
+ } else {
+ ex = *eap;
+ }
+ ex.arg = fname;
+ ex.cmd = (char_u *)(v == 2 ? "pyfile" : "pyfile3");
+
+ if (v == 2) {
+ ex_pyfile(&ex);
+ } else {
+ ex_py3file(&ex);
+ }
+}
+
+// ":pyxfile {fname}"
+void ex_pyxfile(exarg_T *eap)
+{
+ source_pyx_file(eap, eap->arg);
+}
+
+// ":pyx"
+void ex_pyx(exarg_T *eap)
+{
+ init_pyxversion();
+ if (p_pyx == 2) {
+ ex_python(eap);
+ } else {
+ ex_python3(eap);
+ }
+}
+
+// ":pyxdo"
+void ex_pyxdo(exarg_T *eap)
+{
+ init_pyxversion();
+ if (p_pyx == 2) {
+ ex_pydo(eap);
+ } else {
+ ex_pydo3(eap);
+ }
+}
+
/// ":source {fname}"
void ex_source(exarg_T *eap)
{
@@ -2669,14 +2990,7 @@ static FILE *fopen_noinh_readbin(char *filename)
return NULL;
}
-#ifdef HAVE_FD_CLOEXEC
- {
- int fdflags = fcntl(fd_tmp, F_GETFD);
- if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0) {
- (void)fcntl(fd_tmp, F_SETFD, fdflags | FD_CLOEXEC);
- }
- }
-#endif
+ (void)os_set_cloexec(fd_tmp);
return fdopen(fd_tmp, READBIN);
}
@@ -2803,22 +3117,6 @@ int do_source(char_u *fname, int check_other, int is_vimrc)
save_sourcing_lnum = sourcing_lnum;
sourcing_lnum = 0;
- cookie.conv.vc_type = CONV_NONE; // no conversion
-
- // Read the first line so we can check for a UTF-8 BOM.
- firstline = getsourceline(0, (void *)&cookie, 0);
- if (firstline != NULL && STRLEN(firstline) >= 3 && firstline[0] == 0xef
- && firstline[1] == 0xbb && firstline[2] == 0xbf) {
- // Found BOM; setup conversion, skip over BOM and recode the line.
- convert_setup(&cookie.conv, (char_u *)"utf-8", p_enc);
- p = string_convert(&cookie.conv, firstline + 3, NULL);
- if (p == NULL) {
- p = vim_strsave(firstline + 3);
- }
- xfree(firstline);
- firstline = p;
- }
-
// start measuring script load time if --startuptime was passed and
// time_fd was successfully opened afterwards.
proftime_T rel_time;
@@ -2891,6 +3189,22 @@ int do_source(char_u *fname, int check_other, int is_vimrc)
}
}
+ cookie.conv.vc_type = CONV_NONE; // no conversion
+
+ // Read the first line so we can check for a UTF-8 BOM.
+ firstline = getsourceline(0, (void *)&cookie, 0);
+ if (firstline != NULL && STRLEN(firstline) >= 3 && firstline[0] == 0xef
+ && firstline[1] == 0xbb && firstline[2] == 0xbf) {
+ // Found BOM; setup conversion, skip over BOM and recode the line.
+ convert_setup(&cookie.conv, (char_u *)"utf-8", p_enc);
+ p = string_convert(&cookie.conv, firstline + 3, NULL);
+ if (p == NULL) {
+ p = vim_strsave(firstline + 3);
+ }
+ xfree(firstline);
+ firstline = p;
+ }
+
// Call do_cmdline, which will call getsourceline() to get the lines.
do_cmdline(firstline, getsourceline, (void *)&cookie,
DOCMD_VERBOSE|DOCMD_NOWAIT|DOCMD_REPEAT);
@@ -2954,6 +3268,17 @@ theend:
/// ":scriptnames"
void ex_scriptnames(exarg_T *eap)
{
+ if (eap->addr_count > 0) {
+ // :script {scriptId}: edit the script
+ if (eap->line2 < 1 || eap->line2 > script_items.ga_len) {
+ EMSG(_(e_invarg));
+ } else {
+ eap->arg = SCRIPT_ITEM(eap->line2).sn_name;
+ do_exedit(eap, NULL);
+ }
+ return;
+ }
+
for (int i = 1; i <= script_items.ga_len && !got_int; i++) {
if (SCRIPT_ITEM(i).sn_name != NULL) {
home_replace(NULL, SCRIPT_ITEM(i).sn_name,
@@ -2977,29 +3302,39 @@ void scriptnames_slash_adjust(void)
# endif
/// Get a pointer to a script name. Used for ":verbose set".
-char_u *get_scriptname(scid_T id)
+char_u *get_scriptname(LastSet last_set, bool *should_free)
{
- if (id == SID_MODELINE) {
- return (char_u *)_("modeline");
- }
- if (id == SID_CMDARG) {
- return (char_u *)_("--cmd argument");
- }
- if (id == SID_CARG) {
- return (char_u *)_("-c argument");
- }
- if (id == SID_ENV) {
- return (char_u *)_("environment variable");
- }
- if (id == SID_ERROR) {
- return (char_u *)_("error handler");
+ *should_free = false;
+
+ switch (last_set.script_id) {
+ case SID_MODELINE:
+ return (char_u *)_("modeline");
+ case SID_CMDARG:
+ return (char_u *)_("--cmd argument");
+ case SID_CARG:
+ return (char_u *)_("-c argument");
+ case SID_ENV:
+ return (char_u *)_("environment variable");
+ case SID_ERROR:
+ return (char_u *)_("error handler");
+ case SID_LUA:
+ return (char_u *)_("Lua");
+ case SID_API_CLIENT:
+ vim_snprintf((char *)IObuff, IOSIZE,
+ _("API client (channel id %" PRIu64 ")"),
+ last_set.channel_id);
+ return IObuff;
+ default:
+ *should_free = true;
+ return home_replace_save(NULL, SCRIPT_ITEM(last_set.script_id).sn_name);
}
- return SCRIPT_ITEM(id).sn_name;
}
# if defined(EXITFREE)
void free_scriptnames(void)
{
+ profile_reset();
+
# define FREE_SCRIPTNAME(item) xfree((item)->sn_name)
GA_DEEP_CLEAR(&script_items, scriptitem_T, FREE_SCRIPTNAME);
}
@@ -3122,8 +3457,14 @@ static char_u *get_one_sourceline(struct source_cookie *sp)
ga_grow(&ga, 120);
buf = (char_u *)ga.ga_data;
+retry:
+ errno = 0;
if (fgets((char *)buf + ga.ga_len, ga.ga_maxlen - ga.ga_len,
sp->fp) == NULL) {
+ if (errno == EINTR) {
+ goto retry;
+ }
+
break;
}
len = ga.ga_len + (int)STRLEN(buf + ga.ga_len);
@@ -3164,7 +3505,7 @@ static char_u *get_one_sourceline(struct source_cookie *sp)
ga.ga_len--;
} else { // lines like ":map xx yy^M" will have failed
if (!sp->error) {
- msg_source(hl_attr(HLF_W));
+ msg_source(HL_ATTR(HLF_W));
EMSG(_("W15: Warning: Wrong line separator, ^M may be missing"));
}
sp->error = true;
@@ -3213,7 +3554,8 @@ void script_line_start(void)
if (si->sn_prof_on && sourcing_lnum >= 1) {
// Grow the array before starting the timer, so that the time spent
// here isn't counted.
- ga_grow(&si->sn_prl_ga, (int)(sourcing_lnum - si->sn_prl_ga.ga_len));
+ (void)ga_grow(&si->sn_prl_ga,
+ (int)(sourcing_lnum - si->sn_prl_ga.ga_len));
si->sn_prl_idx = sourcing_lnum - 1;
while (si->sn_prl_ga.ga_len <= si->sn_prl_idx
&& si->sn_prl_ga.ga_len < si->sn_prl_ga.ga_maxlen) {
@@ -3374,7 +3716,12 @@ static char *get_locale_val(int what)
}
#endif
-
+// Return true when "lang" starts with a valid language name.
+// Rejects NULL, empty string, "C", "C.UTF-8" and others.
+static bool is_valid_mess_lang(char *lang)
+{
+ return lang != NULL && ASCII_ISALPHA(lang[0]) && ASCII_ISALPHA(lang[1]);
+}
/// Obtain the current messages language. Used to set the default for
/// 'helplang'. May return NULL or an empty string.
@@ -3394,14 +3741,14 @@ char *get_mess_lang(void)
# endif
# else
p = os_getenv("LC_ALL");
- if (p == NULL) {
+ if (!is_valid_mess_lang(p)) {
p = os_getenv("LC_MESSAGES");
- if (p == NULL) {
+ if (!is_valid_mess_lang(p)) {
p = os_getenv("LANG");
}
}
# endif
- return p;
+ return is_valid_mess_lang(p) ? p : NULL;
}
// Complicated #if; matches with where get_mess_env() is used below.
@@ -3570,18 +3917,11 @@ void ex_language(exarg_T *eap)
static char_u **locales = NULL; // Array of all available locales
-static bool did_init_locales = false;
-/// Lazy initialization of all available locales.
-static void init_locales(void)
-{
- if (!did_init_locales) {
- did_init_locales = true;
- locales = find_locales();
- }
-}
+#ifndef WIN32
+static bool did_init_locales = false;
-// Return an array of strings for all available locales + NULL for the
+/// Return an array of strings for all available locales + NULL for the
/// last element. Return NULL in case of error.
static char_u **find_locales(void)
{
@@ -3613,6 +3953,18 @@ static char_u **find_locales(void)
((char_u **)locales_ga.ga_data)[locales_ga.ga_len] = NULL;
return (char_u **)locales_ga.ga_data;
}
+#endif
+
+/// Lazy initialization of all available locales.
+static void init_locales(void)
+{
+#ifndef WIN32
+ if (!did_init_locales) {
+ did_init_locales = true;
+ locales = find_locales();
+ }
+#endif
+}
# if defined(EXITFREE)
void free_locales(void)
@@ -3665,19 +4017,19 @@ char_u *get_locales(expand_T *xp, int idx)
static void script_host_execute(char *name, exarg_T *eap)
{
- uint8_t *script = script_get(eap, eap->arg);
+ size_t len;
+ char *const script = script_get(eap, &len);
- if (!eap->skip) {
- list_T *args = list_alloc();
+ if (script != NULL) {
+ list_T *const args = tv_list_alloc(3);
// script
- list_append_string(args, script ? script : eap->arg, -1);
+ tv_list_append_allocated_string(args, script);
// current range
- list_append_number(args, (int)eap->line1);
- list_append_number(args, (int)eap->line2);
+ tv_list_append_number(args, (int)eap->line1);
+ tv_list_append_number(args, (int)eap->line2);
+
(void)eval_call_provider(name, "execute", args);
}
-
- xfree(script);
}
static void script_host_execute_file(char *name, exarg_T *eap)
@@ -3685,21 +4037,21 @@ static void script_host_execute_file(char *name, exarg_T *eap)
uint8_t buffer[MAXPATHL];
vim_FullName((char *)eap->arg, (char *)buffer, sizeof(buffer), false);
- list_T *args = list_alloc();
+ list_T *args = tv_list_alloc(3);
// filename
- list_append_string(args, buffer, -1);
+ tv_list_append_string(args, (const char *)buffer, -1);
// current range
- list_append_number(args, (int)eap->line1);
- list_append_number(args, (int)eap->line2);
+ tv_list_append_number(args, (int)eap->line1);
+ tv_list_append_number(args, (int)eap->line2);
(void)eval_call_provider(name, "execute_file", args);
}
static void script_host_do_range(char *name, exarg_T *eap)
{
- list_T *args = list_alloc();
- list_append_number(args, (int)eap->line1);
- list_append_number(args, (int)eap->line2);
- list_append_string(args, eap->arg, -1);
+ list_T *args = tv_list_alloc(3);
+ tv_list_append_number(args, (int)eap->line1);
+ tv_list_append_number(args, (int)eap->line2);
+ tv_list_append_string(args, (const char *)eap->arg, -1);
(void)eval_call_provider(name, "do_range", args);
}
@@ -3749,7 +4101,7 @@ void ex_drop(exarg_T *eap)
// to split the current window or data could be lost.
// Skip the check if the 'hidden' option is set, as in this case the
// buffer won't be lost.
- if (!P_HID(curbuf)) {
+ if (!buf_hide(curbuf)) {
emsg_off++;
split = check_changed(curbuf, CCGD_AW | CCGD_EXCMD);
emsg_off--;
diff --git a/src/nvim/ex_cmds_defs.h b/src/nvim/ex_cmds_defs.h
index f46d1e6d47..6c36922c09 100644
--- a/src/nvim/ex_cmds_defs.h
+++ b/src/nvim/ex_cmds_defs.h
@@ -6,6 +6,7 @@
#include "nvim/pos.h" // for linenr_T
#include "nvim/normal.h"
+#include "nvim/regexp_defs.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "ex_cmds_enum.generated.h"
@@ -58,7 +59,9 @@
#define BUFUNL 0x20000 /* accepts unlisted buffer too */
#define ARGOPT 0x40000 /* allow "++opt=val" argument */
#define SBOXOK 0x80000 /* allowed in the sandbox */
-#define CMDWIN 0x100000 /* allowed in cmdline window */
+#define CMDWIN 0x100000 /* allowed in cmdline window; when missing
+ * disallows editing another buffer when
+ * curbuf_lock is set */
#define MODIFY 0x200000 /* forbidden in non-'modifiable' buffer */
#define EXFLAGS 0x400000 /* allow flags after count in argument */
#define FILES (XFILE | EXTRA) /* multiple extra files allowed */
@@ -72,7 +75,9 @@
#define ADDR_LOADED_BUFFERS 3
#define ADDR_BUFFERS 4
#define ADDR_TABS 5
-#define ADDR_QUICKFIX 6
+#define ADDR_TABS_RELATIVE 6 // Tab page that only relative
+#define ADDR_QUICKFIX 7
+#define ADDR_OTHER 99
typedef struct exarg exarg_T;
@@ -126,57 +131,55 @@ struct exarg {
struct condstack *cstack; ///< condition stack for ":if" etc.
};
-#define FORCE_BIN 1 /* ":edit ++bin file" */
-#define FORCE_NOBIN 2 /* ":edit ++nobin file" */
-
-/* Values for "flags" */
-#define EXFLAG_LIST 0x01 /* 'l': list */
-#define EXFLAG_NR 0x02 /* '#': number */
-#define EXFLAG_PRINT 0x04 /* 'p': print */
-
-/*
- * used for completion on the command line
- */
-typedef struct expand {
- int xp_context; /* type of expansion */
- char_u *xp_pattern; /* start of item to expand */
- int xp_pattern_len; /* bytes in xp_pattern before cursor */
- char_u *xp_arg; /* completion function */
- int xp_scriptID; /* SID for completion function */
- int xp_backslash; /* one of the XP_BS_ values */
+#define FORCE_BIN 1 // ":edit ++bin file"
+#define FORCE_NOBIN 2 // ":edit ++nobin file"
+
+// Values for "flags"
+#define EXFLAG_LIST 0x01 // 'l': list
+#define EXFLAG_NR 0x02 // '#': number
+#define EXFLAG_PRINT 0x04 // 'p': print
+
+// used for completion on the command line
+struct expand {
+ int xp_context; // type of expansion
+ char_u *xp_pattern; // start of item to expand
+ int xp_pattern_len; // bytes in xp_pattern before cursor
+ char_u *xp_arg; // completion function
+ int xp_scriptID; // SID for completion function
+ int xp_backslash; // one of the XP_BS_ values
#ifndef BACKSLASH_IN_FILENAME
- int xp_shell; /* TRUE for a shell command, more
- characters need to be escaped */
+ int xp_shell; // TRUE for a shell command, more
+ // characters need to be escaped
#endif
- int xp_numfiles; /* number of files found by
- file name completion */
- char_u **xp_files; /* list of files */
- char_u *xp_line; /* text being completed */
- int xp_col; /* cursor position in line */
-} expand_T;
-
-/* values for xp_backslash */
-#define XP_BS_NONE 0 /* nothing special for backslashes */
-#define XP_BS_ONE 1 /* uses one backslash before a space */
-#define XP_BS_THREE 2 /* uses three backslashes before a space */
+ int xp_numfiles; // number of files found by file name completion
+ char_u **xp_files; // list of files
+ char_u *xp_line; // text being completed
+ int xp_col; // cursor position in line
+};
-/*
- * Command modifiers ":vertical", ":browse", ":confirm" and ":hide" set a flag.
- * This needs to be saved for recursive commands, put them in a structure for
- * easy manipulation.
- */
+// values for xp_backslash
+#define XP_BS_NONE 0 // nothing special for backslashes
+#define XP_BS_ONE 1 // uses one backslash before a space
+#define XP_BS_THREE 2 // uses three backslashes before a space
+
+/// Command modifiers ":vertical", ":browse", ":confirm", ":hide", etc. set a
+/// flag. This needs to be saved for recursive commands, put them in a
+/// structure for easy manipulation.
typedef struct {
- int hide; /* TRUE when ":hide" was used */
- int split; /* flags for win_split() */
- int tab; /* > 0 when ":tab" was used */
- int confirm; /* TRUE to invoke yes/no dialog */
- int keepalt; /* TRUE when ":keepalt" was used */
- int keepmarks; /* TRUE when ":keepmarks" was used */
- int keepjumps; /* TRUE when ":keepjumps" was used */
- int lockmarks; /* TRUE when ":lockmarks" was used */
- int keeppatterns; /* TRUE when ":keeppatterns" was used */
- bool noswapfile; /* true when ":noswapfile" was used */
- char_u *save_ei; /* saved value of 'eventignore' */
+ int split; ///< flags for win_split()
+ int tab; ///< > 0 when ":tab" was used
+ bool browse; ///< true to invoke file dialog
+ bool confirm; ///< true to invoke yes/no dialog
+ bool hide; ///< true when ":hide" was used
+ bool keepalt; ///< true when ":keepalt" was used
+ bool keepjumps; ///< true when ":keepjumps" was used
+ bool keepmarks; ///< true when ":keepmarks" was used
+ bool keeppatterns; ///< true when ":keeppatterns" was used
+ bool lockmarks; ///< true when ":lockmarks" was used
+ bool noswapfile; ///< true when ":noswapfile" was used
+ char_u *save_ei; ///< saved value of 'eventignore'
+ regmatch_T filter_regmatch; ///< set by :filter /pat/
+ bool filter_force; ///< set for :filter!
} cmdmod_T;
#endif // NVIM_EX_CMDS_DEFS_H
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c
index 9bc7ec39da..f5c16d883a 100644
--- a/src/nvim/ex_docmd.c
+++ b/src/nvim/ex_docmd.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* ex_docmd.c: functions for executing an Ex command line.
*/
@@ -6,6 +9,7 @@
#include <string.h>
#include <stdbool.h>
#include <stdint.h>
+#include <stdlib.h>
#include <inttypes.h>
#include "nvim/vim.h"
@@ -36,7 +40,6 @@
#include "nvim/menu.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/keymap.h"
#include "nvim/file_search.h"
#include "nvim/garray.h"
@@ -51,6 +54,7 @@
#include "nvim/screen.h"
#include "nvim/search.h"
#include "nvim/spell.h"
+#include "nvim/spellfile.h"
#include "nvim/strings.h"
#include "nvim/syntax.h"
#include "nvim/tag.h"
@@ -67,6 +71,9 @@
#include "nvim/event/rstream.h"
#include "nvim/event/wstream.h"
#include "nvim/shada.h"
+#include "nvim/lua/executor.h"
+#include "nvim/globals.h"
+#include "nvim/api/private/helpers.h"
static int quitmore = 0;
static int ex_pressedreturn = FALSE;
@@ -127,7 +134,6 @@ struct dbg_stuff {
char_u *vv_throwpoint;
int did_emsg;
int got_int;
- int did_throw;
int need_rethrow;
int check_cstack;
except_T *current_exception;
@@ -159,12 +165,11 @@ static void save_dbg_stuff(struct dbg_stuff *dsp)
dsp->vv_exception = v_exception(NULL);
dsp->vv_throwpoint = v_throwpoint(NULL);
- /* Necessary for debugging an inactive ":catch", ":finally", ":endtry" */
- dsp->did_emsg = did_emsg; did_emsg = FALSE;
- dsp->got_int = got_int; got_int = FALSE;
- dsp->did_throw = did_throw; did_throw = FALSE;
- dsp->need_rethrow = need_rethrow; need_rethrow = FALSE;
- dsp->check_cstack = check_cstack; check_cstack = FALSE;
+ // Necessary for debugging an inactive ":catch", ":finally", ":endtry".
+ dsp->did_emsg = did_emsg; did_emsg = false;
+ dsp->got_int = got_int; got_int = false;
+ dsp->need_rethrow = need_rethrow; need_rethrow = false;
+ dsp->check_cstack = check_cstack; check_cstack = false;
dsp->current_exception = current_exception; current_exception = NULL;
}
@@ -178,21 +183,13 @@ static void restore_dbg_stuff(struct dbg_stuff *dsp)
(void)v_throwpoint(dsp->vv_throwpoint);
did_emsg = dsp->did_emsg;
got_int = dsp->got_int;
- did_throw = dsp->did_throw;
need_rethrow = dsp->need_rethrow;
check_cstack = dsp->check_cstack;
current_exception = dsp->current_exception;
}
-
-/*
- * do_exmode(): Repeatedly get commands for the "Ex" mode, until the ":vi"
- * command is given.
- */
-void
-do_exmode (
- int improved /* TRUE for "improved Ex" mode */
-)
+/// Repeatedly get commands for Ex mode, until the ":vi" command is given.
+void do_exmode(int improved)
{
int save_msg_scroll;
int prev_msg_row;
@@ -211,8 +208,8 @@ do_exmode (
return;
save_msg_scroll = msg_scroll;
- ++RedrawingDisabled; /* don't redisplay the window */
- ++no_wait_return; /* don't wait for return */
+ RedrawingDisabled++; // don't redisplay the window
+ no_wait_return++; // don't wait for return
MSG(_("Entering Ex mode. Type \"visual\" to go to Normal mode."));
while (exmode_active) {
@@ -221,25 +218,22 @@ do_exmode (
exmode_active = FALSE;
break;
}
- msg_scroll = TRUE;
- need_wait_return = FALSE;
- ex_pressedreturn = FALSE;
- ex_no_reprint = FALSE;
- changedtick = curbuf->b_changedtick;
+ msg_scroll = true;
+ need_wait_return = false;
+ ex_pressedreturn = false;
+ ex_no_reprint = false;
+ changedtick = buf_get_changedtick(curbuf);
prev_msg_row = msg_row;
prev_line = curwin->w_cursor.lnum;
- if (improved) {
- cmdline_row = msg_row;
- do_cmdline(NULL, getexline, NULL, 0);
- } else
- do_cmdline(NULL, getexmodeline, NULL, DOCMD_NOWAIT);
+ cmdline_row = msg_row;
+ do_cmdline(NULL, getexline, NULL, 0);
lines_left = Rows - 1;
if ((prev_line != curwin->w_cursor.lnum
- || changedtick != curbuf->b_changedtick) && !ex_no_reprint) {
- if (curbuf->b_ml.ml_flags & ML_EMPTY)
+ || changedtick != buf_get_changedtick(curbuf)) && !ex_no_reprint) {
+ if (curbuf->b_ml.ml_flags & ML_EMPTY) {
EMSG(_(e_emptybuf));
- else {
+ } else {
if (ex_pressedreturn) {
/* go up one line, to overwrite the ":<CR>" line, so the
* output doesn't contain empty lines. */
@@ -259,20 +253,21 @@ do_exmode (
}
}
- --RedrawingDisabled;
- --no_wait_return;
- update_screen(CLEAR);
- need_wait_return = FALSE;
+ RedrawingDisabled--;
+ no_wait_return--;
+ redraw_all_later(NOT_VALID);
+ update_screen(NOT_VALID);
+ need_wait_return = false;
msg_scroll = save_msg_scroll;
}
/*
* Execute a simple command line. Used for translated commands like "*".
*/
-int do_cmdline_cmd(char *cmd)
+int do_cmdline_cmd(const char *cmd)
{
return do_cmdline((char_u *)cmd, NULL, NULL,
- DOCMD_VERBOSE|DOCMD_NOWAIT|DOCMD_KEYTYPED);
+ DOCMD_NOWAIT|DOCMD_KEYTYPED);
}
/*
@@ -335,17 +330,19 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline,
msg_list = &private_msg_list;
private_msg_list = NULL;
- /* It's possible to create an endless loop with ":execute", catch that
- * here. The value of 200 allows nested function calls, ":source", etc. */
- if (call_depth == 200) {
+ // It's possible to create an endless loop with ":execute", catch that
+ // here. The value of 200 allows nested function calls, ":source", etc.
+ // Allow 200 or 'maxfuncdepth', whatever is larger.
+ if (call_depth >= 200 && call_depth >= p_mfd) {
EMSG(_("E169: Command too recursive"));
- /* When converting to an exception, we do not include the command name
- * since this is not an error of the specific command. */
+ // When converting to an exception, we do not include the command name
+ // since this is not an error of the specific command.
do_errthrow((struct condstack *)NULL, (char_u *)NULL);
msg_list = saved_msg_list;
return FAIL;
}
- ++call_depth;
+ call_depth++;
+ start_batch_changes();
cstack.cs_idx = -1;
cstack.cs_looplevel = 0;
@@ -392,16 +389,11 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline,
initial_trylevel = trylevel;
- /*
- * "did_throw" will be set to TRUE when an exception is being thrown.
- */
- did_throw = FALSE;
- /*
- * "did_emsg" will be set to TRUE when emsg() is used, in which case we
- * cancel the whole command line, and any if/endif or loop.
- * If force_abort is set, we cancel everything.
- */
- did_emsg = FALSE;
+ current_exception = NULL;
+ // "did_emsg" will be set to TRUE when emsg() is used, in which case we
+ // cancel the whole command line, and any if/endif or loop.
+ // If force_abort is set, we cancel everything.
+ did_emsg = false;
/*
* KeyTyped is only set when calling vgetc(). Reset it here when not
@@ -409,7 +401,7 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline,
*/
if (!(flags & DOCMD_KEYTYPED)
&& !getline_equal(fgetline, cookie, getexline))
- KeyTyped = FALSE;
+ KeyTyped = false;
/*
* Continue executing command lines:
@@ -583,10 +575,10 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline,
++no_wait_return;
verbose_enter_scroll();
- smsg(_("line %" PRId64 ": %s"),
- (int64_t)sourcing_lnum, cmdline_copy);
- if (msg_silent == 0)
- msg_puts((char_u *)"\n"); /* don't overwrite this */
+ 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;
@@ -597,11 +589,16 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline,
* do_one_cmd() will return NULL if there is no trailing '|'.
* "cmdline_copy" can change, e.g. for '%' and '#' expansion.
*/
- ++recursive;
- next_cmdline = do_one_cmd(&cmdline_copy, flags & DOCMD_VERBOSE,
- &cstack,
- cmd_getline, cmd_cookie);
- --recursive;
+ recursive++;
+ next_cmdline = do_one_cmd(&cmdline_copy, flags,
+ &cstack,
+ cmd_getline, cmd_cookie);
+ recursive--;
+
+ // Ignore trailing '|'-separated commands in preview-mode ('inccommand').
+ if (State & CMDPREVIEW) {
+ next_cmdline = NULL;
+ }
if (cmd_cookie == (void *)&cmd_loop_cookie)
/* Use "current_line" from "cmd_loop_cookie", it may have been
@@ -651,7 +648,7 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline,
* not to use a cs_line[] from an entry that isn't a ":while"
* or ":for": It would make "current_line" invalid and can
* cause a crash. */
- if (!did_emsg && !got_int && !did_throw
+ if (!did_emsg && !got_int && !current_exception
&& cstack.cs_idx >= 0
&& (cstack.cs_flags[cstack.cs_idx]
& (CSF_WHILE | CSF_FOR))
@@ -699,7 +696,7 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline,
}
/*
- * A ":finally" makes did_emsg, got_int, and did_throw pending for
+ * A ":finally" makes did_emsg, got_int and current_exception pending for
* being restored at the ":endtry". Reset them here and set the
* ACTIVE and FINALLY flags, so that the finally clause gets executed.
* This includes the case where a missing ":endif", ":endwhile" or
@@ -707,10 +704,11 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline,
*/
if (cstack.cs_lflags & CSL_HAD_FINA) {
cstack.cs_lflags &= ~CSL_HAD_FINA;
- report_make_pending(cstack.cs_pending[cstack.cs_idx]
- & (CSTP_ERROR | CSTP_INTERRUPT | CSTP_THROW),
- did_throw ? (void *)current_exception : NULL);
- did_emsg = got_int = did_throw = FALSE;
+ report_make_pending((cstack.cs_pending[cstack.cs_idx]
+ & (CSTP_ERROR | CSTP_INTERRUPT | CSTP_THROW)),
+ current_exception);
+ did_emsg = got_int = false;
+ current_exception = NULL;
cstack.cs_flags[cstack.cs_idx] |= CSF_ACTIVE | CSF_FINALLY;
}
@@ -718,15 +716,14 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline,
* within this loop. */
trylevel = initial_trylevel + cstack.cs_trylevel;
- /*
- * If the outermost try conditional (across function calls and sourced
- * files) is aborted because of an error, an interrupt, or an uncaught
- * exception, cancel everything. If it is left normally, reset
- * force_abort to get the non-EH compatible abortion behavior for
- * the rest of the script.
- */
- if (trylevel == 0 && !did_emsg && !got_int && !did_throw)
- force_abort = FALSE;
+ // If the outermost try conditional (across function calls and sourced
+ // files) is aborted because of an error, an interrupt, or an uncaught
+ // exception, cancel everything. If it is left normally, reset
+ // force_abort to get the non-EH compatible abortion behavior for
+ // the rest of the script.
+ if (trylevel == 0 && !did_emsg && !got_int && !current_exception) {
+ force_abort = false;
+ }
/* Convert an interrupt to an exception if appropriate. */
(void)do_intthrow(&cstack);
@@ -741,11 +738,8 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline,
* - there is a command after '|', inside a :if, :while, :for or :try, or
* looping for ":source" command or function call.
*/
- while (!((got_int
- || (did_emsg && force_abort) || did_throw
- )
- && cstack.cs_trylevel == 0
- )
+ while (!((got_int || (did_emsg && force_abort) || current_exception)
+ && cstack.cs_trylevel == 0)
&& !(did_emsg
/* Keep going when inside try/catch, so that the error can be
* deal with, except when it is a syntax error, it may cause
@@ -767,7 +761,7 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline,
* If a sourced file or executed function ran to its end, report the
* unclosed conditional.
*/
- if (!got_int && !did_throw
+ if (!got_int && !current_exception
&& ((getline_equal(fgetline, cookie, getsourceline)
&& !source_finished(fgetline, cookie))
|| (getline_equal(fgetline, cookie, get_func_line)
@@ -807,17 +801,16 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline,
? (char_u *)"endfunction" : (char_u *)NULL);
if (trylevel == 0) {
- /*
- * When an exception is being thrown out of the outermost try
- * conditional, discard the uncaught exception, disable the conversion
- * of interrupts or errors to exceptions, and ensure that no more
- * commands are executed.
- */
- if (did_throw) {
- void *p = NULL;
- char_u *saved_sourcing_name;
+ // When an exception is being thrown out of the outermost try
+ // conditional, discard the uncaught exception, disable the conversion
+ // of interrupts or errors to exceptions, and ensure that no more
+ // commands are executed.
+ if (current_exception) {
+ void *p = NULL;
+ char_u *saved_sourcing_name;
int saved_sourcing_lnum;
- struct msglist *messages = NULL, *next;
+ struct msglist *messages = NULL;
+ struct msglist *next;
/*
* If the uncaught exception is a user exception, report it as an
@@ -838,8 +831,6 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline,
break;
case ET_INTERRUPT:
break;
- default:
- p = vim_strsave((char_u *)_(e_internal));
}
saved_sourcing_name = sourcing_name;
@@ -879,22 +870,22 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline,
suppress_errthrow = TRUE;
}
- /*
- * The current cstack will be freed when do_cmdline() returns. An uncaught
- * exception will have to be rethrown in the previous cstack. If a function
- * has just returned or a script file was just finished and the previous
- * cstack belongs to the same function or, respectively, script file, it
- * will have to be checked for finally clauses to be executed due to the
- * ":return" or ":finish". This is done in do_one_cmd().
- */
- if (did_throw)
- need_rethrow = TRUE;
+ // The current cstack will be freed when do_cmdline() returns. An uncaught
+ // exception will have to be rethrown in the previous cstack. If a function
+ // has just returned or a script file was just finished and the previous
+ // cstack belongs to the same function or, respectively, script file, it
+ // will have to be checked for finally clauses to be executed due to the
+ // ":return" or ":finish". This is done in do_one_cmd().
+ if (current_exception) {
+ need_rethrow = true;
+ }
if ((getline_equal(fgetline, cookie, getsourceline)
&& ex_nesting_level > source_level(real_cookie))
|| (getline_equal(fgetline, cookie, get_func_line)
&& ex_nesting_level > func_level(real_cookie) + 1)) {
- if (!did_throw)
- check_cstack = TRUE;
+ if (!current_exception) {
+ check_cstack = true;
+ }
} else {
/* When leaving a function, reduce nesting level. */
if (getline_equal(fgetline, cookie, get_func_line))
@@ -952,7 +943,8 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline,
did_endif = FALSE; /* in case do_cmdline used recursively */
- --call_depth;
+ call_depth--;
+ end_batch_changes();
return retval;
}
@@ -982,8 +974,8 @@ static char_u *get_loop_line(int c, void *cookie, int indent)
return line;
}
- KeyTyped = FALSE;
- ++cp->current_line;
+ KeyTyped = false;
+ cp->current_line++;
wp = (wcmd_T *)(cp->lines_gap->ga_data) + cp->current_line;
sourcing_lnum = wp->lnum;
return vim_strsave(wp->line);
@@ -1224,7 +1216,7 @@ static void get_wincmd_addr_type(char_u *arg, exarg_T *eap)
* This function may be called recursively!
*/
static char_u * do_one_cmd(char_u **cmdlinep,
- int sourcing,
+ int flags,
struct condstack *cstack,
LineGetter fgetline,
void *cookie /* argument for fgetline() */
@@ -1243,11 +1235,12 @@ static char_u * do_one_cmd(char_u **cmdlinep,
cmdmod_T save_cmdmod;
int ni; /* set when Not Implemented */
char_u *cmd;
+ int address_count = 1;
memset(&ea, 0, sizeof(ea));
ea.line1 = 1;
ea.line2 = 1;
- ++ex_nesting_level;
+ ex_nesting_level++;
/* When the last file has not been edited :q has to be typed twice. */
if (quitmore
@@ -1300,9 +1293,7 @@ static char_u * do_one_cmd(char_u **cmdlinep,
/*
* 2. Handle command modifiers.
*/
- p = ea.cmd;
- if (ascii_isdigit(*ea.cmd))
- p = skipwhite(skipdigits(ea.cmd));
+ p = skip_range(ea.cmd, NULL);
switch (*p) {
/* When adding an entry, also modify cmd_exists(). */
case 'a': if (!checkforcmd(&ea.cmd, "aboveleft", 3))
@@ -1313,8 +1304,9 @@ static char_u * do_one_cmd(char_u **cmdlinep,
case 'b': if (checkforcmd(&ea.cmd, "belowright", 3)) {
cmdmod.split |= WSP_BELOW;
continue;
- }
+ }
if (checkforcmd(&ea.cmd, "browse", 3)) {
+ cmdmod.browse = true;
continue;
}
if (!checkforcmd(&ea.cmd, "botright", 2))
@@ -1324,36 +1316,61 @@ static char_u * do_one_cmd(char_u **cmdlinep,
case 'c': if (!checkforcmd(&ea.cmd, "confirm", 4))
break;
- cmdmod.confirm = TRUE;
+ cmdmod.confirm = true;
continue;
case 'k': if (checkforcmd(&ea.cmd, "keepmarks", 3)) {
- cmdmod.keepmarks = TRUE;
+ cmdmod.keepmarks = true;
continue;
}
if (checkforcmd(&ea.cmd, "keepalt", 5)) {
- cmdmod.keepalt = TRUE;
+ cmdmod.keepalt = true;
continue;
}
if (checkforcmd(&ea.cmd, "keeppatterns", 5)) {
- cmdmod.keeppatterns = TRUE;
+ cmdmod.keeppatterns = true;
continue;
}
if (!checkforcmd(&ea.cmd, "keepjumps", 5))
break;
- cmdmod.keepjumps = TRUE;
+ cmdmod.keepjumps = true;
+ continue;
+
+ case 'f': { // only accept ":filter {pat} cmd"
+ char_u *reg_pat;
+
+ if (!checkforcmd(&p, "filter", 4) || *p == NUL || ends_excmd(*p)) {
+ break;
+ }
+ if (*p == '!') {
+ cmdmod.filter_force = true;
+ p = skipwhite(p + 1);
+ if (*p == NUL || ends_excmd(*p)) {
+ break;
+ }
+ }
+ p = skip_vimgrep_pat(p, &reg_pat, NULL);
+ if (p == NULL || *p == NUL) {
+ break;
+ }
+ cmdmod.filter_regmatch.regprog = vim_regcomp(reg_pat, RE_MAGIC);
+ if (cmdmod.filter_regmatch.regprog == NULL) {
+ break;
+ }
+ ea.cmd = p;
continue;
+ }
/* ":hide" and ":hide | cmd" are not modifiers */
case 'h': if (p != ea.cmd || !checkforcmd(&p, "hide", 3)
|| *p == NUL || ends_excmd(*p))
break;
ea.cmd = p;
- cmdmod.hide = TRUE;
+ cmdmod.hide = true;
continue;
case 'l': if (checkforcmd(&ea.cmd, "lockmarks", 3)) {
- cmdmod.lockmarks = TRUE;
+ cmdmod.lockmarks = true;
continue;
}
@@ -1373,7 +1390,7 @@ static char_u * do_one_cmd(char_u **cmdlinep,
}
continue;
}
- if (!checkforcmd(&ea.cmd, "noswapfile", 6)) {
+ if (!checkforcmd(&ea.cmd, "noswapfile", 3)) {
break;
}
cmdmod.noswapfile = true;
@@ -1404,12 +1421,18 @@ static char_u * do_one_cmd(char_u **cmdlinep,
continue;
case 't': if (checkforcmd(&p, "tab", 3)) {
- if (ascii_isdigit(*ea.cmd))
- cmdmod.tab = atoi((char *)ea.cmd) + 1;
- else
- cmdmod.tab = tabpage_index(curtab) + 1;
- ea.cmd = p;
- continue;
+ long tabnr = get_address(&ea, &ea.cmd, ADDR_TABS, ea.skip, false, 1);
+ if (tabnr == MAXLNUM) {
+ cmdmod.tab = tabpage_index(curtab) + 1;
+ } else {
+ if (tabnr < 0 || tabnr > LAST_TAB_NR) {
+ errormsg = (char_u *)_(e_invrange);
+ goto doend;
+ }
+ cmdmod.tab = tabnr + 1;
+ }
+ ea.cmd = p;
+ continue;
}
if (!checkforcmd(&ea.cmd, "topleft", 2))
break;
@@ -1440,11 +1463,13 @@ static char_u * do_one_cmd(char_u **cmdlinep,
}
break;
}
+ char_u *after_modifier = ea.cmd;
- ea.skip = did_emsg || got_int || did_throw || (cstack->cs_idx >= 0
- && !(cstack->cs_flags[cstack->
- cs_idx]
- & CSF_ACTIVE));
+ ea.skip = (did_emsg
+ || got_int
+ || current_exception
+ || (cstack->cs_idx >= 0
+ && !(cstack->cs_flags[cstack->cs_idx] & CSF_ACTIVE)));
/* Count this line for profiling if ea.skip is FALSE. */
if (do_profiling == PROF_YES && !ea.skip) {
@@ -1513,8 +1538,7 @@ static char_u * do_one_cmd(char_u **cmdlinep,
ea.line2 = curwin->w_cursor.lnum;
break;
case ADDR_WINDOWS:
- lnum = CURRENT_WIN_NR;
- ea.line2 = lnum;
+ ea.line2 = CURRENT_WIN_NR;
break;
case ADDR_ARGUMENTS:
ea.line2 = curwin->w_arg_idx + 1;
@@ -1527,15 +1551,18 @@ static char_u * do_one_cmd(char_u **cmdlinep,
ea.line2 = curbuf->b_fnum;
break;
case ADDR_TABS:
- lnum = CURRENT_TAB_NR;
- ea.line2 = lnum;
+ ea.line2 = CURRENT_TAB_NR;
+ break;
+ case ADDR_TABS_RELATIVE:
+ ea.line2 = 1;
break;
case ADDR_QUICKFIX:
ea.line2 = qf_get_cur_valid_idx(&ea);
break;
}
ea.cmd = skipwhite(ea.cmd);
- lnum = get_address(&ea, &ea.cmd, ea.addr_type, ea.skip, ea.addr_count == 0);
+ lnum = get_address(&ea, &ea.cmd, ea.addr_type, ea.skip,
+ ea.addr_count == 0, address_count++);
if (ea.cmd == NULL) { // error detected
goto doend;
}
@@ -1577,6 +1604,10 @@ static char_u * do_one_cmd(char_u **cmdlinep,
goto doend;
}
break;
+ case ADDR_TABS_RELATIVE:
+ errormsg = (char_u *)_(e_invrange);
+ goto doend;
+ break;
case ADDR_ARGUMENTS:
if (ARGCOUNT == 0) {
ea.line1 = ea.line2 = 0;
@@ -1622,11 +1653,15 @@ static char_u * do_one_cmd(char_u **cmdlinep,
ea.addr_count++;
if (*ea.cmd == ';') {
- if (!ea.skip)
+ if (!ea.skip) {
curwin->w_cursor.lnum = ea.line2;
- } else if (*ea.cmd != ',')
+ // don't leave the cursor on an illegal line or column
+ check_cursor();
+ }
+ } else if (*ea.cmd != ',') {
break;
- ++ea.cmd;
+ }
+ ea.cmd++;
}
/* One address given: set start and end lines */
@@ -1637,9 +1672,6 @@ static char_u * do_one_cmd(char_u **cmdlinep,
ea.addr_count = 0;
}
- /* Don't leave the cursor on an illegal line (caused by ';') */
- check_cursor_lnum();
-
/*
* 5. Parse the command.
*/
@@ -1703,7 +1735,7 @@ static char_u * do_one_cmd(char_u **cmdlinep,
xfree(p);
// If the autocommands did something and didn't cause an error, try
// finding the command again.
- p = (ret && !aborting()) ? find_command(&ea, NULL) : NULL;
+ p = (ret && !aborting()) ? find_command(&ea, NULL) : ea.cmd;
}
if (p == NULL) {
@@ -1711,16 +1743,19 @@ static char_u * do_one_cmd(char_u **cmdlinep,
errormsg = (char_u *)_("E464: Ambiguous use of user-defined command");
goto doend;
}
- /* Check for wrong commands. */
- if (*p == '!' && ea.cmd[1] == 0151 && ea.cmd[0] == 78) {
- errormsg = uc_fun_cmd();
- goto doend;
- }
+ // Check for wrong commands.
if (ea.cmdidx == CMD_SIZE) {
if (!ea.skip) {
STRCPY(IObuff, _("E492: Not an editor command"));
- if (!sourcing)
- append_command(*cmdlinep);
+ if (!(flags & DOCMD_VERBOSE)) {
+ // If the modifier was parsed OK the error must be in the following
+ // command
+ if (after_modifier != NULL) {
+ append_command(after_modifier);
+ } else {
+ append_command(*cmdlinep);
+ }
+ }
errormsg = IObuff;
did_emsg_syntax = TRUE;
}
@@ -1733,13 +1768,14 @@ static char_u * do_one_cmd(char_u **cmdlinep,
));
- /* forced commands */
+ // Forced commands.
if (*p == '!' && ea.cmdidx != CMD_substitute
&& ea.cmdidx != CMD_smagic && ea.cmdidx != CMD_snomagic) {
- ++p;
- ea.forceit = TRUE;
- } else
- ea.forceit = FALSE;
+ p++;
+ ea.forceit = true;
+ } else {
+ ea.forceit = false;
+ }
/*
* 6. Parse arguments.
@@ -1764,22 +1800,23 @@ static char_u * do_one_cmd(char_u **cmdlinep,
if (text_locked() && !(ea.argt & CMDWIN)
&& !IS_USER_CMDIDX(ea.cmdidx)) {
- /* Command not allowed when editing the command line. */
- if (cmdwin_type != 0)
- errormsg = (char_u *)_(e_cmdwin);
- else
- errormsg = (char_u *)_(e_secure);
+ // Command not allowed when editing the command line.
+ errormsg = (char_u *)_(get_text_locked_msg());
goto doend;
}
- /* Disallow editing another buffer when "curbuf_lock" is set.
- * Do allow ":edit" (check for argument later).
- * Do allow ":checktime" (it's postponed). */
+
+ // Disallow editing another buffer when "curbuf_lock" is set.
+ // Do allow ":checktime" (it is postponed).
+ // Do allow ":edit" (check for an argument later).
+ // Do allow ":file" with no arguments (check for an argument later).
if (!(ea.argt & CMDWIN)
- && ea.cmdidx != CMD_edit
&& ea.cmdidx != CMD_checktime
+ && ea.cmdidx != CMD_edit
+ && ea.cmdidx != CMD_file
&& !IS_USER_CMDIDX(ea.cmdidx)
- && curbuf_locked())
+ && curbuf_locked()) {
goto doend;
+ }
if (!ni && !(ea.argt & RANGE) && ea.addr_count > 0) {
/* no range allowed */
@@ -1805,13 +1842,13 @@ static char_u * do_one_cmd(char_u **cmdlinep,
*/
if (!global_busy && ea.line1 > ea.line2) {
if (msg_silent == 0) {
- if (sourcing || exmode_active) {
+ if ((flags & DOCMD_VERBOSE) || exmode_active) {
errormsg = (char_u *)_("E493: Backwards range given");
goto doend;
}
- if (ask_yesno((char_u *)
- _("Backwards range given, OK to swap"), FALSE) != 'y')
+ if (ask_yesno(_("Backwards range given, OK to swap"), false) != 'y') {
goto doend;
+ }
}
lnum = ea.line1;
ea.line1 = ea.line2;
@@ -1851,6 +1888,11 @@ static char_u * do_one_cmd(char_u **cmdlinep,
else
ea.arg = skipwhite(p);
+ // ":file" cannot be run with an argument when "curbuf_lock" is set
+ if (ea.cmdidx == CMD_file && *ea.arg != NUL && curbuf_locked()) {
+ goto doend;
+ }
+
/*
* Check for "++opt=val" argument.
* Must be first, allow ":w ++enc=utf8 !cmd"
@@ -1965,6 +2007,9 @@ static char_u * do_one_cmd(char_u **cmdlinep,
case ADDR_TABS:
ea.line2 = LAST_TAB_NR;
break;
+ case ADDR_TABS_RELATIVE:
+ ea.line2 = 1;
+ break;
case ADDR_ARGUMENTS:
if (ARGCOUNT == 0) {
ea.line1 = ea.line2 = 0;
@@ -2020,11 +2065,11 @@ static char_u * do_one_cmd(char_u **cmdlinep,
ea.line1 = ea.line2;
ea.line2 += n - 1;
++ea.addr_count;
- /*
- * Be vi compatible: no error message for out of range.
- */
- if (ea.line2 > curbuf->b_ml.ml_line_count)
+ // Be vi compatible: no error message for out of range.
+ if (ea.addr_type == ADDR_LINES
+ && ea.line2 > curbuf->b_ml.ml_line_count) {
ea.line2 = curbuf->b_ml.ml_line_count;
+ }
}
}
@@ -2089,6 +2134,7 @@ static char_u * do_one_cmd(char_u **cmdlinep,
case CMD_echomsg:
case CMD_echon:
case CMD_execute:
+ case CMD_filter:
case CMD_help:
case CMD_hide:
case CMD_ijump:
@@ -2112,6 +2158,10 @@ static char_u * do_one_cmd(char_u **cmdlinep,
case CMD_python:
case CMD_py3:
case CMD_python3:
+ case CMD_pythonx:
+ case CMD_pyx:
+ case CMD_pyxdo:
+ case CMD_pyxfile:
case CMD_return:
case CMD_rightbelow:
case CMD_ruby:
@@ -2217,7 +2267,7 @@ doend:
curwin->w_cursor.lnum = 1;
if (errormsg != NULL && *errormsg != NUL && !did_emsg) {
- if (sourcing) {
+ if (flags & DOCMD_VERBOSE) {
if (errormsg != IObuff) {
STRCPY(IObuff, errormsg);
errormsg = IObuff;
@@ -2240,6 +2290,10 @@ doend:
free_string_option(cmdmod.save_ei);
}
+ if (cmdmod.filter_regmatch.regprog != NULL) {
+ vim_regfree(cmdmod.filter_regmatch.regprog);
+ }
+
cmdmod = save_cmdmod;
if (save_msg_silent != -1) {
@@ -2275,11 +2329,11 @@ doend:
* Check for an Ex command with optional tail.
* If there is a match advance "pp" to the argument and return TRUE.
*/
-int
-checkforcmd (
- char_u **pp, /* start of command */
- char *cmd, /* name of command */
- int len /* required length */
+int
+checkforcmd(
+ char_u **pp, // start of command
+ char *cmd, // name of command
+ int len // required length
)
{
int i;
@@ -2525,28 +2579,29 @@ static struct cmdmod {
int minlen;
int has_count; /* :123verbose :3tab */
} cmdmods[] = {
- {"aboveleft", 3, FALSE},
- {"belowright", 3, FALSE},
- {"botright", 2, FALSE},
- {"browse", 3, FALSE},
- {"confirm", 4, FALSE},
- {"hide", 3, FALSE},
- {"keepalt", 5, FALSE},
- {"keepjumps", 5, FALSE},
- {"keepmarks", 3, FALSE},
- {"keeppatterns", 5, FALSE},
- {"leftabove", 5, FALSE},
- {"lockmarks", 3, FALSE},
- {"noautocmd", 3, FALSE},
- {"noswapfile", 3, FALSE},
- {"rightbelow", 6, FALSE},
- {"sandbox", 3, FALSE},
- {"silent", 3, FALSE},
- {"tab", 3, TRUE},
- {"topleft", 2, FALSE},
- {"unsilent", 3, FALSE},
- {"verbose", 4, TRUE},
- {"vertical", 4, FALSE},
+ { "aboveleft", 3, false },
+ { "belowright", 3, false },
+ { "botright", 2, false },
+ { "browse", 3, false },
+ { "confirm", 4, false },
+ { "filter", 4, false },
+ { "hide", 3, false },
+ { "keepalt", 5, false },
+ { "keepjumps", 5, false },
+ { "keepmarks", 3, false },
+ { "keeppatterns", 5, false },
+ { "leftabove", 5, false },
+ { "lockmarks", 3, false },
+ { "noautocmd", 3, false },
+ { "noswapfile", 3, false },
+ { "rightbelow", 6, false },
+ { "sandbox", 3, false },
+ { "silent", 3, false },
+ { "tab", 3, true },
+ { "topleft", 2, false },
+ { "unsilent", 3, false },
+ { "verbose", 4, true },
+ { "vertical", 4, false },
};
/*
@@ -2576,27 +2631,29 @@ int modifier_len(char_u *cmd)
* Return 2 if there is an exact match.
* Return 3 if there is an ambiguous match.
*/
-int cmd_exists(char_u *name)
+int cmd_exists(const char *const name)
{
exarg_T ea;
- int full = FALSE;
- int i;
- int j;
char_u *p;
- /* Check command modifiers. */
- for (i = 0; i < (int)ARRAY_SIZE(cmdmods); ++i) {
- for (j = 0; name[j] != NUL; ++j)
- if (name[j] != cmdmods[i].name[j])
+ // Check command modifiers.
+ for (int i = 0; i < (int)ARRAY_SIZE(cmdmods); i++) {
+ int j;
+ for (j = 0; name[j] != NUL; j++) {
+ if (name[j] != (char)cmdmods[i].name[j]) {
break;
- if (name[j] == NUL && j >= cmdmods[i].minlen)
+ }
+ }
+ if (name[j] == NUL && j >= cmdmods[i].minlen) {
return cmdmods[i].name[j] == NUL ? 2 : 1;
+ }
}
/* Check built-in commands and user defined commands.
* For ":2match" and ":3match" we need to skip the number. */
- ea.cmd = (*name == '2' || *name == '3') ? name + 1 : name;
+ ea.cmd = (char_u *)((*name == '2' || *name == '3') ? name + 1 : name);
ea.cmdidx = (cmdidx_T)0;
+ int full = false;
p = find_command(&ea, &full);
if (p == NULL)
return 3;
@@ -2614,32 +2671,27 @@ int cmd_exists(char_u *name)
* perfectly compatible with each other, but then the command line syntax
* probably won't change that much -- webb.
*/
-char_u *
-set_one_cmd_context (
+const char * set_one_cmd_context(
expand_T *xp,
- char_u *buff /* buffer for command string */
+ const char *buff // buffer for command string
)
{
- char_u *p;
- char_u *cmd, *arg;
- int len = 0;
+ size_t len = 0;
exarg_T ea;
- int compl = EXPAND_NOTHING;
- int delim;
- int forceit = FALSE;
- int usefilter = FALSE; /* filter instead of file name */
+ int context = EXPAND_NOTHING;
+ bool forceit = false;
+ bool usefilter = false; // Filter instead of file name.
ExpandInit(xp);
- xp->xp_pattern = buff;
- xp->xp_context = EXPAND_COMMANDS; /* Default until we get past command */
+ xp->xp_pattern = (char_u *)buff;
+ xp->xp_context = EXPAND_COMMANDS; // Default until we get past command
ea.argt = 0;
- /*
- * 2. skip comment lines and leading space, colons or bars
- */
- for (cmd = buff; vim_strchr((char_u *)" \t:|", *cmd) != NULL; cmd++)
- ;
- xp->xp_pattern = cmd;
+ // 2. skip comment lines and leading space, colons or bars
+ const char *cmd;
+ for (cmd = buff; vim_strchr((const char_u *)" \t:|", *cmd) != NULL; cmd++) {
+ }
+ xp->xp_pattern = (char_u *)cmd;
if (*cmd == NUL)
return NULL;
@@ -2651,14 +2703,15 @@ set_one_cmd_context (
/*
* 3. parse a range specifier of the form: addr [,addr] [;addr] ..
*/
- cmd = skip_range(cmd, &xp->xp_context);
+ cmd = (const char *)skip_range((const char_u *)cmd, &xp->xp_context);
/*
* 4. parse command
*/
- xp->xp_pattern = cmd;
- if (*cmd == NUL)
+ xp->xp_pattern = (char_u *)cmd;
+ if (*cmd == NUL) {
return NULL;
+ }
if (*cmd == '"') {
xp->xp_context = EXPAND_NOTHING;
return NULL;
@@ -2674,6 +2727,7 @@ set_one_cmd_context (
* do accept "keepmarks", "keepalt" and "keepjumps".
* - the 's' command can be followed directly by 'c', 'g', 'i', 'I' or 'r'
*/
+ const char *p;
if (*cmd == 'k' && cmd[1] != 'e') {
ea.cmdidx = CMD_k;
p = cmd + 1;
@@ -2696,20 +2750,21 @@ set_one_cmd_context (
}
}
// check for non-alpha command
- if (p == cmd && vim_strchr((char_u *)"@*!=><&~#", *p) != NULL) {
+ if (p == cmd && vim_strchr((const char_u *)"@*!=><&~#", *p) != NULL) {
p++;
}
- len = (int)(p - cmd);
+ len = (size_t)(p - cmd);
if (len == 0) {
xp->xp_context = EXPAND_UNSUCCESSFUL;
return NULL;
}
for (ea.cmdidx = (cmdidx_T)0; (int)ea.cmdidx < (int)CMD_SIZE;
- ea.cmdidx = (cmdidx_T)((int)ea.cmdidx + 1))
- if (STRNCMP(cmdnames[(int)ea.cmdidx].cmd_name, cmd,
- (size_t)len) == 0)
+ ea.cmdidx = (cmdidx_T)((int)ea.cmdidx + 1)) {
+ if (STRNCMP(cmdnames[(int)ea.cmdidx].cmd_name, cmd, len) == 0) {
break;
+ }
+ }
if (cmd[0] >= 'A' && cmd[0] <= 'Z') {
while (ASCII_ISALNUM(*p) || *p == '*') { // Allow * wild card
@@ -2726,16 +2781,15 @@ set_one_cmd_context (
return NULL;
if (ea.cmdidx == CMD_SIZE) {
- if (*cmd == 's' && vim_strchr((char_u *)"cgriI", cmd[1]) != NULL) {
+ if (*cmd == 's' && vim_strchr((const char_u *)"cgriI", cmd[1]) != NULL) {
ea.cmdidx = CMD_substitute;
p = cmd + 1;
} else if (cmd[0] >= 'A' && cmd[0] <= 'Z') {
- ea.cmd = cmd;
- p = find_ucmd(&ea, p, NULL, xp,
- &compl
- );
- if (p == NULL)
- ea.cmdidx = CMD_SIZE; /* ambiguous user command */
+ ea.cmd = (char_u *)cmd;
+ p = (const char *)find_ucmd(&ea, (char_u *)p, NULL, xp, &context);
+ if (p == NULL) {
+ ea.cmdidx = CMD_SIZE; // Ambiguous user command.
+ }
}
}
if (ea.cmdidx == CMD_SIZE) {
@@ -2746,9 +2800,9 @@ set_one_cmd_context (
xp->xp_context = EXPAND_NOTHING; /* Default now that we're past command */
- if (*p == '!') { /* forced commands */
- forceit = TRUE;
- ++p;
+ if (*p == '!') { // forced commands
+ forceit = true;
+ p++;
}
/*
@@ -2758,45 +2812,47 @@ set_one_cmd_context (
ea.argt = cmdnames[(int)ea.cmdidx].cmd_argt;
}
- arg = skipwhite(p);
+ const char *arg = (const char *)skipwhite((const char_u *)p);
if (ea.cmdidx == CMD_write || ea.cmdidx == CMD_update) {
- if (*arg == '>') { /* append */
- if (*++arg == '>')
- ++arg;
- arg = skipwhite(arg);
- } else if (*arg == '!' && ea.cmdidx == CMD_write) { /* :w !filter */
- ++arg;
- usefilter = TRUE;
+ if (*arg == '>') { // Append.
+ if (*++arg == '>') {
+ arg++;
+ }
+ arg = (const char *)skipwhite((const char_u *)arg);
+ } else if (*arg == '!' && ea.cmdidx == CMD_write) { // :w !filter
+ arg++;
+ usefilter = true;
}
}
if (ea.cmdidx == CMD_read) {
- usefilter = forceit; /* :r! filter if forced */
- if (*arg == '!') { /* :r !filter */
- ++arg;
- usefilter = TRUE;
+ usefilter = forceit; // :r! filter if forced
+ if (*arg == '!') { // :r !filter
+ arg++;
+ usefilter = true;
}
}
if (ea.cmdidx == CMD_lshift || ea.cmdidx == CMD_rshift) {
- while (*arg == *cmd) /* allow any number of '>' or '<' */
- ++arg;
- arg = skipwhite(arg);
+ while (*arg == *cmd) { // allow any number of '>' or '<'
+ arg++;
+ }
+ arg = (const char *)skipwhite((const char_u *)arg);
}
/* Does command allow "+command"? */
if ((ea.argt & EDITCMD) && !usefilter && *arg == '+') {
/* Check if we're in the +command */
p = arg + 1;
- arg = skip_cmd_arg(arg, FALSE);
+ arg = (const char *)skip_cmd_arg((char_u *)arg, false);
/* Still touching the command after '+'? */
if (*arg == NUL)
return p;
- /* Skip space(s) after +command to get to the real argument */
- arg = skipwhite(arg);
+ // Skip space(s) after +command to get to the real argument.
+ arg = (const char *)skipwhite((const char_u *)arg);
}
/*
@@ -2820,52 +2876,49 @@ set_one_cmd_context (
return NULL; /* It's a comment */
}
}
- mb_ptr_adv(p);
+ MB_PTR_ADV(p);
}
}
// no arguments allowed
- if (!(ea.argt & EXTRA) && *arg != NUL
- && vim_strchr((char_u *)"|\"", *arg) == NULL) {
+ if (!(ea.argt & EXTRA) && *arg != NUL && strchr("|\"", *arg) == NULL) {
return NULL;
}
/* Find start of last argument (argument just before cursor): */
p = buff;
- xp->xp_pattern = p;
- len = (int)STRLEN(buff);
+ xp->xp_pattern = (char_u *)p;
+ len = strlen(buff);
while (*p && p < buff + len) {
if (*p == ' ' || *p == TAB) {
- /* argument starts after a space */
- xp->xp_pattern = ++p;
+ // Argument starts after a space.
+ xp->xp_pattern = (char_u *)++p;
} else {
- if (*p == '\\' && *(p + 1) != NUL)
- ++p; /* skip over escaped character */
- mb_ptr_adv(p);
+ if (*p == '\\' && *(p + 1) != NUL) {
+ p++; // skip over escaped character
+ }
+ MB_PTR_ADV(p);
}
}
if (ea.argt & XFILE) {
int c;
- int in_quote = FALSE;
- char_u *bow = NULL; /* Beginning of word */
+ int in_quote = false;
+ const char *bow = NULL; // Beginning of word.
/*
* Allow spaces within back-quotes to count as part of the argument
* being expanded.
*/
- xp->xp_pattern = skipwhite(arg);
- p = xp->xp_pattern;
+ xp->xp_pattern = skipwhite((const char_u *)arg);
+ p = (const char *)xp->xp_pattern;
while (*p != NUL) {
- if (has_mbyte)
- c = mb_ptr2char(p);
- else
- c = *p;
- if (c == '\\' && p[1] != NUL)
- ++p;
- else if (c == '`') {
+ c = utf_ptr2char((const char_u *)p);
+ if (c == '\\' && p[1] != NUL) {
+ p++;
+ } else if (c == '`') {
if (!in_quote) {
- xp->xp_pattern = p;
+ xp->xp_pattern = (char_u *)p;
bow = p + 1;
}
in_quote = !in_quote;
@@ -2878,33 +2931,30 @@ set_one_cmd_context (
|| ascii_iswhite(c)) {
len = 0; /* avoid getting stuck when space is in 'isfname' */
while (*p != NUL) {
- if (has_mbyte)
- c = mb_ptr2char(p);
- else
- c = *p;
- if (c == '`' || vim_isfilec_or_wc(c))
+ c = utf_ptr2char((const char_u *)p);
+ if (c == '`' || vim_isfilec_or_wc(c)) {
break;
- if (has_mbyte)
- len = (*mb_ptr2len)(p);
- else
- len = 1;
- mb_ptr_adv(p);
+ }
+ len = (size_t)utfc_ptr2len((const char_u *)p);
+ MB_PTR_ADV(p);
}
- if (in_quote)
+ if (in_quote) {
bow = p;
- else
- xp->xp_pattern = p;
+ } else {
+ xp->xp_pattern = (char_u *)p;
+ }
p -= len;
}
- mb_ptr_adv(p);
+ MB_PTR_ADV(p);
}
/*
* If we are still inside the quotes, and we passed a space, just
* expand from there.
*/
- if (bow != NULL && in_quote)
- xp->xp_pattern = bow;
+ if (bow != NULL && in_quote) {
+ xp->xp_pattern = (char_u *)bow;
+ }
xp->xp_context = EXPAND_FILES;
/* For a shell command more chars need to be escaped. */
@@ -2912,34 +2962,37 @@ set_one_cmd_context (
#ifndef BACKSLASH_IN_FILENAME
xp->xp_shell = TRUE;
#endif
- /* When still after the command name expand executables. */
- if (xp->xp_pattern == skipwhite(arg))
+ // When still after the command name expand executables.
+ if (xp->xp_pattern == skipwhite((const char_u *)arg)) {
xp->xp_context = EXPAND_SHELLCMD;
+ }
}
- /* Check for environment variable */
- if (*xp->xp_pattern == '$'
- ) {
- for (p = xp->xp_pattern + 1; *p != NUL; ++p)
- if (!vim_isIDc(*p))
+ // Check for environment variable.
+ if (*xp->xp_pattern == '$') {
+ for (p = (const char *)xp->xp_pattern + 1; *p != NUL; p++) {
+ if (!vim_isIDc((uint8_t)(*p))) {
break;
+ }
+ }
if (*p == NUL) {
xp->xp_context = EXPAND_ENV_VARS;
- ++xp->xp_pattern;
- /* Avoid that the assignment uses EXPAND_FILES again. */
- if (compl != EXPAND_USER_DEFINED && compl != EXPAND_USER_LIST)
- compl = EXPAND_ENV_VARS;
+ xp->xp_pattern++;
+ // Avoid that the assignment uses EXPAND_FILES again.
+ if (context != EXPAND_USER_DEFINED && context != EXPAND_USER_LIST) {
+ context = EXPAND_ENV_VARS;
+ }
}
}
/* Check for user names */
if (*xp->xp_pattern == '~') {
- for (p = xp->xp_pattern + 1; *p != NUL && *p != '/'; ++p)
- ;
- /* Complete ~user only if it partially matches a user name.
- * A full match ~user<Tab> will be replaced by user's home
- * directory i.e. something like ~user<Tab> -> /home/user/ */
- if (*p == NUL && p > xp->xp_pattern + 1
- && match_user(xp->xp_pattern + 1) == 1) {
+ for (p = (const char *)xp->xp_pattern + 1; *p != NUL && *p != '/'; p++) {
+ }
+ // Complete ~user only if it partially matches a user name.
+ // A full match ~user<Tab> will be replaced by user's home
+ // directory i.e. something like ~user<Tab> -> /home/user/
+ if (*p == NUL && p > (const char *)xp->xp_pattern + 1
+ && match_user(xp->xp_pattern + 1) >= 1) {
xp->xp_context = EXPAND_USER;
++xp->xp_pattern;
}
@@ -2968,7 +3021,7 @@ set_one_cmd_context (
break;
case CMD_help:
xp->xp_context = EXPAND_HELP;
- xp->xp_pattern = arg;
+ xp->xp_pattern = (char_u *)arg;
break;
/* Command modifiers: return the argument.
@@ -3007,17 +3060,28 @@ set_one_cmd_context (
case CMD_windo:
return arg;
+ case CMD_filter:
+ if (*arg != NUL) {
+ arg = (const char *)skip_vimgrep_pat((char_u *)arg, NULL, NULL);
+ }
+ if (arg == NULL || *arg == NUL) {
+ xp->xp_context = EXPAND_NOTHING;
+ return NULL;
+ }
+ return (const char *)skipwhite((const char_u *)arg);
+
case CMD_match:
if (*arg == NUL || !ends_excmd(*arg)) {
/* also complete "None" */
set_context_in_echohl_cmd(xp, arg);
- arg = skipwhite(skiptowhite(arg));
+ arg = (const char *)skipwhite(skiptowhite((const char_u *)arg));
if (*arg != NUL) {
xp->xp_context = EXPAND_NOTHING;
- arg = skip_regexp(arg + 1, *arg, p_magic, NULL);
+ arg = (const char *)skip_regexp((char_u *)arg + 1, (uint8_t)(*arg),
+ p_magic, NULL);
}
}
- return find_nextcmd(arg);
+ return (const char *)find_nextcmd((char_u *)arg);
/*
* All completion for the +cmdline_compl feature goes here.
@@ -3026,15 +3090,15 @@ set_one_cmd_context (
case CMD_command:
/* Check for attributes */
while (*arg == '-') {
- arg++; /* Skip "-" */
- p = skiptowhite(arg);
+ arg++; // Skip "-".
+ p = (const char *)skiptowhite((const char_u *)arg);
if (*p == NUL) {
- /* Cursor is still in the attribute */
- p = vim_strchr(arg, '=');
+ // Cursor is still in the attribute.
+ p = strchr(arg, '=');
if (p == NULL) {
- /* No "=", so complete attribute names */
+ // No "=", so complete attribute names.
xp->xp_context = EXPAND_USER_CMD_FLAGS;
- xp->xp_pattern = arg;
+ xp->xp_pattern = (char_u *)arg;
return NULL;
}
@@ -3042,73 +3106,81 @@ set_one_cmd_context (
// their arguments as well.
if (STRNICMP(arg, "complete", p - arg) == 0) {
xp->xp_context = EXPAND_USER_COMPLETE;
- xp->xp_pattern = p + 1;
+ xp->xp_pattern = (char_u *)p + 1;
return NULL;
} else if (STRNICMP(arg, "nargs", p - arg) == 0) {
xp->xp_context = EXPAND_USER_NARGS;
- xp->xp_pattern = p + 1;
+ xp->xp_pattern = (char_u *)p + 1;
return NULL;
} else if (STRNICMP(arg, "addr", p - arg) == 0) {
xp->xp_context = EXPAND_USER_ADDR_TYPE;
- xp->xp_pattern = p + 1;
+ xp->xp_pattern = (char_u *)p + 1;
return NULL;
}
return NULL;
}
- arg = skipwhite(p);
+ arg = (const char *)skipwhite((char_u *)p);
}
- /* After the attributes comes the new command name */
- p = skiptowhite(arg);
+ // After the attributes comes the new command name.
+ p = (const char *)skiptowhite((const char_u *)arg);
if (*p == NUL) {
xp->xp_context = EXPAND_USER_COMMANDS;
- xp->xp_pattern = arg;
+ xp->xp_pattern = (char_u *)arg;
break;
}
- /* And finally comes a normal command */
- return skipwhite(p);
+ // And finally comes a normal command.
+ return (const char *)skipwhite((const char_u *)p);
case CMD_delcommand:
xp->xp_context = EXPAND_USER_COMMANDS;
- xp->xp_pattern = arg;
+ xp->xp_pattern = (char_u *)arg;
break;
case CMD_global:
- case CMD_vglobal:
- delim = *arg; /* get the delimiter */
- if (delim)
- ++arg; /* skip delimiter if there is one */
+ case CMD_vglobal: {
+ const int delim = (uint8_t)(*arg); // Get the delimiter.
+ if (delim) {
+ arg++; // Skip delimiter if there is one.
+ }
- while (arg[0] != NUL && arg[0] != delim) {
- if (arg[0] == '\\' && arg[1] != NUL)
- ++arg;
- ++arg;
+ while (arg[0] != NUL && (uint8_t)arg[0] != delim) {
+ if (arg[0] == '\\' && arg[1] != NUL) {
+ arg++;
+ }
+ arg++;
}
if (arg[0] != NUL)
return arg + 1;
break;
+ }
case CMD_and:
- case CMD_substitute:
- delim = *arg;
+ case CMD_substitute: {
+ const int delim = (uint8_t)(*arg);
if (delim) {
- /* skip "from" part */
- ++arg;
- arg = skip_regexp(arg, delim, p_magic, NULL);
+ // Skip "from" part.
+ arg++;
+ arg = (const char *)skip_regexp((char_u *)arg, delim, p_magic, NULL);
}
- /* skip "to" part */
- while (arg[0] != NUL && arg[0] != delim) {
- if (arg[0] == '\\' && arg[1] != NUL)
- ++arg;
- ++arg;
+ // Skip "to" part.
+ while (arg[0] != NUL && (uint8_t)arg[0] != delim) {
+ if (arg[0] == '\\' && arg[1] != NUL) {
+ arg++;
+ }
+ arg++;
}
- if (arg[0] != NUL) /* skip delimiter */
- ++arg;
- while (arg[0] && vim_strchr((char_u *)"|\"#", arg[0]) == NULL)
- ++arg;
- if (arg[0] != NUL)
+ if (arg[0] != NUL) { // Skip delimiter.
+ arg++;
+ }
+ while (arg[0] && strchr("|\"#", arg[0]) == NULL) {
+ arg++;
+ }
+ if (arg[0] != NUL) {
return arg;
+ }
break;
+ }
case CMD_isearch:
case CMD_dsearch:
case CMD_ilist:
@@ -3118,36 +3190,40 @@ set_one_cmd_context (
case CMD_djump:
case CMD_isplit:
case CMD_dsplit:
- arg = skipwhite(skipdigits(arg)); /* skip count */
- if (*arg == '/') { /* Match regexp, not just whole words */
- for (++arg; *arg && *arg != '/'; arg++)
- if (*arg == '\\' && arg[1] != NUL)
+ // Skip count.
+ arg = (const char *)skipwhite(skipdigits((const char_u *)arg));
+ if (*arg == '/') { // Match regexp, not just whole words.
+ for (++arg; *arg && *arg != '/'; arg++) {
+ if (*arg == '\\' && arg[1] != NUL) {
arg++;
+ }
+ }
if (*arg) {
- arg = skipwhite(arg + 1);
+ arg = (const char *)skipwhite((const char_u *)arg + 1);
- /* Check for trailing illegal characters */
- if (*arg && vim_strchr((char_u *)"|\"\n", *arg) == NULL)
+ // Check for trailing illegal characters.
+ if (*arg && strchr("|\"\n", *arg) == NULL) {
xp->xp_context = EXPAND_NOTHING;
- else
+ } else {
return arg;
+ }
}
}
break;
case CMD_autocmd:
- return set_context_in_autocmd(xp, arg, FALSE);
+ return (const char *)set_context_in_autocmd(xp, (char_u *)arg, false);
case CMD_doautocmd:
case CMD_doautoall:
- return set_context_in_autocmd(xp, arg, TRUE);
+ return (const char *)set_context_in_autocmd(xp, (char_u *)arg, true);
case CMD_set:
- set_context_in_set_cmd(xp, arg, 0);
+ set_context_in_set_cmd(xp, (char_u *)arg, 0);
break;
case CMD_setglobal:
- set_context_in_set_cmd(xp, arg, OPT_GLOBAL);
+ set_context_in_set_cmd(xp, (char_u *)arg, OPT_GLOBAL);
break;
case CMD_setlocal:
- set_context_in_set_cmd(xp, arg, OPT_LOCAL);
+ set_context_in_set_cmd(xp, (char_u *)arg, OPT_LOCAL);
break;
case CMD_tag:
case CMD_stag:
@@ -3159,15 +3235,16 @@ set_one_cmd_context (
case CMD_tjump:
case CMD_stjump:
case CMD_ptjump:
- if (*p_wop != NUL)
+ if (*p_wop != NUL) {
xp->xp_context = EXPAND_TAGS_LISTFILES;
- else
+ } else {
xp->xp_context = EXPAND_TAGS;
- xp->xp_pattern = arg;
+ }
+ xp->xp_pattern = (char_u *)arg;
break;
case CMD_augroup:
xp->xp_context = EXPAND_AUGROUP;
- xp->xp_pattern = arg;
+ xp->xp_pattern = (char_u *)arg;
break;
case CMD_syntax:
set_context_in_syntax_cmd(xp, arg);
@@ -3184,20 +3261,34 @@ set_one_cmd_context (
case CMD_echoerr:
case CMD_call:
case CMD_return:
- set_context_for_expression(xp, arg, ea.cmdidx);
+ case CMD_cexpr:
+ case CMD_caddexpr:
+ case CMD_cgetexpr:
+ case CMD_lexpr:
+ case CMD_laddexpr:
+ case CMD_lgetexpr:
+ set_context_for_expression(xp, (char_u *)arg, ea.cmdidx);
break;
case CMD_unlet:
- while ((xp->xp_pattern = vim_strchr(arg, ' ')) != NULL)
- arg = xp->xp_pattern + 1;
+ while ((xp->xp_pattern = (char_u *)strchr(arg, ' ')) != NULL) {
+ arg = (const char *)xp->xp_pattern + 1;
+ }
+
xp->xp_context = EXPAND_USER_VARS;
- xp->xp_pattern = arg;
+ xp->xp_pattern = (char_u *)arg;
+
+ if (*xp->xp_pattern == '$') {
+ xp->xp_context = EXPAND_ENV_VARS;
+ xp->xp_pattern++;
+ }
+
break;
case CMD_function:
case CMD_delfunction:
xp->xp_context = EXPAND_USER_FUNC;
- xp->xp_pattern = arg;
+ xp->xp_pattern = (char_u *)arg;
break;
case CMD_echohl:
@@ -3212,45 +3303,50 @@ set_one_cmd_context (
set_context_in_cscope_cmd(xp, arg, ea.cmdidx);
break;
case CMD_sign:
- set_context_in_sign_cmd(xp, arg);
+ set_context_in_sign_cmd(xp, (char_u *)arg);
break;
case CMD_bdelete:
case CMD_bwipeout:
case CMD_bunload:
- while ((xp->xp_pattern = vim_strchr(arg, ' ')) != NULL)
- arg = xp->xp_pattern + 1;
- /*FALLTHROUGH*/
+ while ((xp->xp_pattern = (char_u *)strchr(arg, ' ')) != NULL) {
+ arg = (const char *)xp->xp_pattern + 1;
+ }
+ FALLTHROUGH;
case CMD_buffer:
case CMD_sbuffer:
case CMD_checktime:
xp->xp_context = EXPAND_BUFFERS;
- xp->xp_pattern = arg;
+ xp->xp_pattern = (char_u *)arg;
break;
case CMD_USER:
case CMD_USER_BUF:
- if (compl != EXPAND_NOTHING) {
- /* XFILE: file names are handled above */
+ if (context != EXPAND_NOTHING) {
+ // XFILE: file names are handled above.
if (!(ea.argt & XFILE)) {
- if (compl == EXPAND_MENUS)
- return set_context_in_menu_cmd(xp, cmd, arg, forceit);
- if (compl == EXPAND_COMMANDS)
+ if (context == EXPAND_MENUS) {
+ return (const char *)set_context_in_menu_cmd(xp, (char_u *)cmd,
+ (char_u *)arg, forceit);
+ } else if (context == EXPAND_COMMANDS) {
return arg;
- if (compl == EXPAND_MAPPINGS)
- return set_context_in_map_cmd(xp, (char_u *)"map",
- arg, forceit, FALSE, FALSE, CMD_map);
- /* Find start of last argument. */
+ } else if (context == EXPAND_MAPPINGS) {
+ return (const char *)set_context_in_map_cmd(
+ xp, (char_u *)"map", (char_u *)arg, forceit, false, false,
+ CMD_map);
+ }
+ // Find start of last argument.
p = arg;
while (*p) {
- if (*p == ' ')
- /* argument starts after a space */
+ if (*p == ' ') {
+ // argument starts after a space
arg = p + 1;
- else if (*p == '\\' && *(p + 1) != NUL)
- ++p; /* skip over escaped character */
- mb_ptr_adv(p);
+ } else if (*p == '\\' && *(p + 1) != NUL) {
+ p++; // skip over escaped character
+ }
+ MB_PTR_ADV(p);
}
- xp->xp_pattern = arg;
+ xp->xp_pattern = (char_u *)arg;
}
- xp->xp_context = compl;
+ xp->xp_context = context;
}
break;
case CMD_map: case CMD_noremap:
@@ -3262,8 +3358,8 @@ set_one_cmd_context (
case CMD_lmap: case CMD_lnoremap:
case CMD_smap: case CMD_snoremap:
case CMD_xmap: case CMD_xnoremap:
- return set_context_in_map_cmd(xp, cmd, arg, forceit,
- FALSE, FALSE, ea.cmdidx);
+ return (const char *)set_context_in_map_cmd(
+ xp, (char_u *)cmd, (char_u *)arg, forceit, false, false, ea.cmdidx);
case CMD_unmap:
case CMD_nunmap:
case CMD_vunmap:
@@ -3273,18 +3369,31 @@ set_one_cmd_context (
case CMD_lunmap:
case CMD_sunmap:
case CMD_xunmap:
- return set_context_in_map_cmd(xp, cmd, arg, forceit,
- FALSE, TRUE, ea.cmdidx);
+ return (const char *)set_context_in_map_cmd(
+ xp, (char_u *)cmd, (char_u *)arg, forceit, false, true, ea.cmdidx);
+ case CMD_mapclear:
+ case CMD_nmapclear:
+ case CMD_vmapclear:
+ case CMD_omapclear:
+ case CMD_imapclear:
+ case CMD_cmapclear:
+ case CMD_lmapclear:
+ case CMD_smapclear:
+ case CMD_xmapclear:
+ xp->xp_context = EXPAND_MAPCLEAR;
+ xp->xp_pattern = (char_u *)arg;
+ break;
+
case CMD_abbreviate: case CMD_noreabbrev:
case CMD_cabbrev: case CMD_cnoreabbrev:
case CMD_iabbrev: case CMD_inoreabbrev:
- return set_context_in_map_cmd(xp, cmd, arg, forceit,
- TRUE, FALSE, ea.cmdidx);
+ return (const char *)set_context_in_map_cmd(
+ xp, (char_u *)cmd, (char_u *)arg, forceit, true, false, ea.cmdidx);
case CMD_unabbreviate:
case CMD_cunabbrev:
case CMD_iunabbrev:
- return set_context_in_map_cmd(xp, cmd, arg, forceit,
- TRUE, TRUE, ea.cmdidx);
+ return (const char *)set_context_in_map_cmd(
+ xp, (char_u *)cmd, (char_u *)arg, forceit, true, true, ea.cmdidx);
case CMD_menu: case CMD_noremenu: case CMD_unmenu:
case CMD_amenu: case CMD_anoremenu: case CMD_aunmenu:
case CMD_nmenu: case CMD_nnoremenu: case CMD_nunmenu:
@@ -3294,67 +3403,85 @@ set_one_cmd_context (
case CMD_cmenu: case CMD_cnoremenu: case CMD_cunmenu:
case CMD_tmenu: case CMD_tunmenu:
case CMD_popup: case CMD_emenu:
- return set_context_in_menu_cmd(xp, cmd, arg, forceit);
+ return (const char *)set_context_in_menu_cmd(
+ xp, (char_u *)cmd, (char_u *)arg, forceit);
case CMD_colorscheme:
xp->xp_context = EXPAND_COLORS;
- xp->xp_pattern = arg;
+ xp->xp_pattern = (char_u *)arg;
break;
case CMD_compiler:
xp->xp_context = EXPAND_COMPILER;
- xp->xp_pattern = arg;
+ xp->xp_pattern = (char_u *)arg;
break;
case CMD_ownsyntax:
xp->xp_context = EXPAND_OWNSYNTAX;
- xp->xp_pattern = arg;
+ xp->xp_pattern = (char_u *)arg;
break;
case CMD_setfiletype:
xp->xp_context = EXPAND_FILETYPE;
- xp->xp_pattern = arg;
+ xp->xp_pattern = (char_u *)arg;
break;
case CMD_packadd:
xp->xp_context = EXPAND_PACKADD;
- xp->xp_pattern = arg;
+ xp->xp_pattern = (char_u *)arg;
break;
#ifdef HAVE_WORKING_LIBINTL
case CMD_language:
- p = skiptowhite(arg);
+ p = (const char *)skiptowhite((const char_u *)arg);
if (*p == NUL) {
xp->xp_context = EXPAND_LANGUAGE;
- xp->xp_pattern = arg;
+ xp->xp_pattern = (char_u *)arg;
} else {
- if ( STRNCMP(arg, "messages", p - arg) == 0
- || STRNCMP(arg, "ctype", p - arg) == 0
- || STRNCMP(arg, "time", p - arg) == 0) {
+ if (strncmp(arg, "messages", p - arg) == 0
+ || strncmp(arg, "ctype", p - arg) == 0
+ || strncmp(arg, "time", p - arg) == 0) {
xp->xp_context = EXPAND_LOCALES;
- xp->xp_pattern = skipwhite(p);
- } else
+ xp->xp_pattern = skipwhite((const char_u *)p);
+ } else {
xp->xp_context = EXPAND_NOTHING;
+ }
}
break;
#endif
case CMD_profile:
set_context_in_profile_cmd(xp, arg);
break;
+ case CMD_checkhealth:
+ xp->xp_context = EXPAND_CHECKHEALTH;
+ xp->xp_pattern = (char_u *)arg;
+ break;
case CMD_behave:
xp->xp_context = EXPAND_BEHAVE;
- xp->xp_pattern = arg;
+ xp->xp_pattern = (char_u *)arg;
+ break;
+
+ case CMD_messages:
+ xp->xp_context = EXPAND_MESSAGES;
+ xp->xp_pattern = (char_u *)arg;
break;
case CMD_history:
xp->xp_context = EXPAND_HISTORY;
- xp->xp_pattern = arg;
+ xp->xp_pattern = (char_u *)arg;
break;
case CMD_syntime:
xp->xp_context = EXPAND_SYNTIME;
- xp->xp_pattern = arg;
+ xp->xp_pattern = (char_u *)arg;
break;
+ case CMD_argdelete:
+ while ((xp->xp_pattern = vim_strchr((const char_u *)arg, ' ')) != NULL) {
+ arg = (const char *)(xp->xp_pattern + 1);
+ }
+ xp->xp_context = EXPAND_ARGLIST;
+ xp->xp_pattern = (char_u *)arg;
+ break;
default:
break;
@@ -3371,18 +3498,24 @@ set_one_cmd_context (
* Also skip white space and ":" characters.
* Returns the "cmd" pointer advanced to beyond the range.
*/
-char_u *
-skip_range (
- char_u *cmd,
- int *ctx /* pointer to xp_context or NULL */
+char_u *skip_range(
+ const char_u *cmd,
+ int *ctx // pointer to xp_context or NULL
)
{
unsigned delim;
- while (vim_strchr((char_u *)" \t0123456789.$%'/?-+,;", *cmd) != NULL) {
- if (*cmd == '\'') {
- if (*++cmd == NUL && ctx != NULL)
+ while (vim_strchr((char_u *)" \t0123456789.$%'/?-+,;\\", *cmd) != NULL) {
+ if (*cmd == '\\') {
+ if (cmd[1] == '?' || cmd[1] == '/' || cmd[1] == '&') {
+ cmd++;
+ } else {
+ break;
+ }
+ } else if (*cmd == '\'') {
+ if (*++cmd == NUL && ctx != NULL) {
*ctx = EXPAND_NOTHING;
+ }
} else if (*cmd == '/' || *cmd == '?') {
delim = *cmd++;
while (*cmd != NUL && *cmd != delim)
@@ -3399,7 +3532,7 @@ skip_range (
while (*cmd == ':')
cmd = skipwhite(cmd + 1);
- return cmd;
+ return (char_u *)cmd;
}
/*
@@ -3414,8 +3547,8 @@ static linenr_T get_address(exarg_T *eap,
char_u **ptr,
int addr_type, // flag: one of ADDR_LINES, ...
int skip, // only skip the address, don't use it
- int to_other_file // flag: may jump to other file
- )
+ int to_other_file, // flag: may jump to other file
+ int address_count) // 1 for first, >1 after comma
{
int c;
int i;
@@ -3449,6 +3582,11 @@ static linenr_T get_address(exarg_T *eap,
case ADDR_TABS:
lnum = CURRENT_TAB_NR;
break;
+ case ADDR_TABS_RELATIVE:
+ EMSG(_(e_invrange));
+ cmd = NULL;
+ goto error;
+ break;
case ADDR_QUICKFIX:
lnum = qf_get_cur_valid_idx(eap);
break;
@@ -3483,6 +3621,11 @@ static linenr_T get_address(exarg_T *eap,
case ADDR_TABS:
lnum = LAST_TAB_NR;
break;
+ case ADDR_TABS_RELATIVE:
+ EMSG(_(e_invrange));
+ cmd = NULL;
+ goto error;
+ break;
case ADDR_QUICKFIX:
lnum = qf_get_size(eap);
if (lnum == 0) {
@@ -3542,17 +3685,18 @@ static linenr_T get_address(exarg_T *eap,
*/
if (lnum != MAXLNUM)
curwin->w_cursor.lnum = lnum;
- /*
- * Start a forward search at the end of the line.
- * Start a backward search at the start of the line.
- * This makes sure we never match in the current
- * line, and can match anywhere in the
- * next/previous line.
- */
- if (c == '/')
+
+ // Start a forward search at the end of the line (unless
+ // before the first line).
+ // Start a backward search at the start of the line.
+ // This makes sure we never match in the current
+ // line, and can match anywhere in the
+ // next/previous line.
+ if (c == '/' && curwin->w_cursor.lnum > 0) {
curwin->w_cursor.col = MAXCOL;
- else
+ } else {
curwin->w_cursor.col = 0;
+ }
searchcmdlen = 0;
if (!do_search(NULL, c, cmd, 1L,
SEARCH_HIS | SEARCH_MSG, NULL)) {
@@ -3631,6 +3775,9 @@ static linenr_T get_address(exarg_T *eap,
case ADDR_TABS:
lnum = CURRENT_TAB_NR;
break;
+ case ADDR_TABS_RELATIVE:
+ lnum = 1;
+ break;
case ADDR_QUICKFIX:
lnum = qf_get_cur_valid_idx(eap);
break;
@@ -3645,13 +3792,27 @@ static linenr_T get_address(exarg_T *eap,
n = 1;
else
n = getdigits(&cmd);
- if (addr_type == ADDR_LOADED_BUFFERS || addr_type == ADDR_BUFFERS)
+
+ if (addr_type == ADDR_TABS_RELATIVE) {
+ EMSG(_(e_invrange));
+ cmd = NULL;
+ goto error;
+ } else if (addr_type == ADDR_LOADED_BUFFERS || addr_type == ADDR_BUFFERS) {
lnum = compute_buffer_local_count(
addr_type, lnum, (i == '-') ? -1 * n : n);
- else if (i == '-')
- lnum -= n;
- else
- lnum += n;
+ } else {
+ // Relative line addressing, need to adjust for folded lines
+ // now, but only do it after the first address.
+ if (addr_type == ADDR_LINES && (i == '-' || i == '+')
+ && address_count >= 2) {
+ (void)hasFolding(lnum, NULL, &lnum);
+ }
+ if (i == '-') {
+ lnum -= n;
+ } else {
+ lnum += n;
+ }
+ }
}
} while (*cmd == '/' || *cmd == '?');
@@ -3688,10 +3849,12 @@ void ex_ni(exarg_T *eap)
/// Skips over ":perl <<EOF" constructs.
static void ex_script_ni(exarg_T *eap)
{
- if (!eap->skip)
+ if (!eap->skip) {
ex_ni(eap);
- else
- xfree(script_get(eap, eap->arg));
+ } else {
+ size_t len;
+ xfree(script_get(eap, &len));
+ }
}
/*
@@ -3758,6 +3921,9 @@ static char_u *invalid_range(exarg_T *eap)
return (char_u *)_(e_invrange);
}
break;
+ case ADDR_TABS_RELATIVE:
+ // Do nothing
+ break;
case ADDR_QUICKFIX:
assert(eap->line2 >= 0);
if (eap->line2 != 1 && (size_t)eap->line2 > qf_get_size(eap)) {
@@ -3848,7 +4014,7 @@ static char_u *replace_makeprg(exarg_T *eap, char_u *p, char_u **cmdlinep)
ptr = new_cmdline;
while ((pos = (char_u *)strstr((char *)program, "$*")) != NULL) {
i = (int)(pos - program);
- STRNCPY(ptr, program, i);
+ memcpy(ptr, program, i);
STRCPY(ptr += i, p);
ptr += len;
program = pos + 2;
@@ -3934,8 +4100,6 @@ int expand_filename(exarg_T *eap, char_u **cmdlinep, char_u **errormsgp)
* Don't do this for:
* - replacement that already has been escaped: "##"
* - shell commands (may have to use quotes instead).
- * - non-unix systems when there is a single argument (spaces don't
- * separate arguments then).
*/
if (!eap->usefilter
&& !escaped
@@ -3946,9 +4110,8 @@ int expand_filename(exarg_T *eap, char_u **cmdlinep, char_u **errormsgp)
&& eap->cmdidx != CMD_lgrep
&& eap->cmdidx != CMD_grepadd
&& eap->cmdidx != CMD_lgrepadd
-#ifndef UNIX
+ && eap->cmdidx != CMD_hardcopy
&& !(eap->argt & NOSPC)
-#endif
) {
char_u *l;
#ifdef BACKSLASH_IN_FILENAME
@@ -4010,28 +4173,6 @@ int expand_filename(exarg_T *eap, char_u **cmdlinep, char_u **errormsgp)
}
}
- // Replace any other wildcards, remove backslashes.
-#ifdef UNIX
- /*
- * Only for Unix we check for more than one file name.
- * For other systems spaces are considered to be part
- * of the file name.
- * Only check here if there is no wildcard, otherwise
- * ExpandOne() will check for errors. This allows
- * ":e `ls ve*.c`" on Unix.
- */
- if (!has_wildcards)
- for (p = eap->arg; *p; ++p) {
- /* skip escaped characters */
- if (p[1] && (*p == '\\' || *p == Ctrl_V))
- ++p;
- else if (ascii_iswhite(*p)) {
- *errormsgp = (char_u *)_("E172: Only one file name allowed");
- return FAIL;
- }
- }
-#endif
-
/*
* Halve the number of backslashes (this is Vi compatible).
* For Unix, when wildcards are expanded, this is
@@ -4050,14 +4191,12 @@ int expand_filename(exarg_T *eap, char_u **cmdlinep, char_u **errormsgp)
xpc.xp_context = EXPAND_FILES;
if (p_wic)
options += WILD_ICASE;
- p = ExpandOne(&xpc, eap->arg, NULL,
- options, WILD_EXPAND_FREE);
- if (p == NULL)
+ p = ExpandOne(&xpc, eap->arg, NULL, options, WILD_EXPAND_FREE);
+ if (p == NULL) {
return FAIL;
- if (p != NULL) {
- (void)repl_cmdline(eap, eap->arg, STRLEN(eap->arg), p, cmdlinep);
- xfree(p);
}
+ (void)repl_cmdline(eap, eap->arg, STRLEN(eap->arg), p, cmdlinep);
+ xfree(p);
}
}
return OK;
@@ -4122,7 +4261,7 @@ void separate_nextcmd(exarg_T *eap)
p = skip_grep_pat(eap);
- for (; *p; mb_ptr_adv(p)) {
+ for (; *p; MB_PTR_ADV(p)) {
if (*p == Ctrl_V) {
if (eap->argt & (USECTRLV | XFILE))
++p; /* skip CTRL-V and next char */
@@ -4206,7 +4345,7 @@ skip_cmd_arg (
else
++p;
}
- mb_ptr_adv(p);
+ MB_PTR_ADV(p);
}
return p;
}
@@ -4292,6 +4431,89 @@ static int getargopt(exarg_T *eap)
return OK;
}
+/// Handle the argument for a tabpage related ex command.
+/// Returns a tabpage number.
+/// When an error is encountered then eap->errmsg is set.
+static int get_tabpage_arg(exarg_T *eap)
+{
+ int tab_number = 0;
+ int unaccept_arg0 = (eap->cmdidx == CMD_tabmove) ? 0 : 1;
+
+ if (eap->arg && *eap->arg != NUL) {
+ char_u *p = eap->arg;
+ char_u *p_save;
+ int relative = 0; // argument +N/-N means: go to N places to the
+ // right/left relative to the current position.
+
+ if (*p == '-') {
+ relative = -1;
+ p++;
+ } else if (*p == '+') {
+ relative = 1;
+ p++;
+ }
+
+ p_save = p;
+ tab_number = getdigits(&p);
+
+ if (relative == 0) {
+ if (STRCMP(p, "$") == 0) {
+ tab_number = LAST_TAB_NR;
+ } else if (p == p_save || *p_save == '-' || *p != NUL
+ || tab_number > LAST_TAB_NR) {
+ // No numbers as argument.
+ eap->errmsg = e_invarg;
+ goto theend;
+ }
+ } else {
+ if (*p_save == NUL) {
+ tab_number = 1;
+ }
+ else if (p == p_save || *p_save == '-' || *p != NUL || tab_number == 0) {
+ // No numbers as argument.
+ eap->errmsg = e_invarg;
+ goto theend;
+ }
+ tab_number = tab_number * relative + tabpage_index(curtab);
+ if (!unaccept_arg0 && relative == -1) {
+ --tab_number;
+ }
+ }
+ if (tab_number < unaccept_arg0 || tab_number > LAST_TAB_NR) {
+ eap->errmsg = e_invarg;
+ }
+ } else if (eap->addr_count > 0) {
+ if (unaccept_arg0 && eap->line2 == 0) {
+ eap->errmsg = e_invrange;
+ tab_number = 0;
+ } else {
+ tab_number = eap->line2;
+ if (!unaccept_arg0 && **eap->cmdlinep == '-') {
+ --tab_number;
+ if (tab_number < unaccept_arg0) {
+ eap->errmsg = e_invarg;
+ }
+ }
+ }
+ } else {
+ switch (eap->cmdidx) {
+ case CMD_tabnext:
+ tab_number = tabpage_index(curtab) + 1;
+ if (tab_number > LAST_TAB_NR)
+ tab_number = 1;
+ break;
+ case CMD_tabmove:
+ tab_number = LAST_TAB_NR;
+ break;
+ default:
+ tab_number = tabpage_index(curtab);
+ }
+ }
+
+theend:
+ return tab_number;
+}
+
/*
* ":abbreviate" and friends.
*/
@@ -4361,12 +4583,15 @@ static void ex_autocmd(exarg_T *eap)
*/
static void ex_doautocmd(exarg_T *eap)
{
- char_u *arg = eap->arg;
+ char_u *arg = eap->arg;
int call_do_modelines = check_nomodeline(&arg);
+ bool did_aucmd;
- (void)do_doautocmd(arg, TRUE);
- if (call_do_modelines) /* Only when there is no <nomodeline>. */
+ (void)do_doautocmd(arg, true, &did_aucmd);
+ // Only when there is no <nomodeline>.
+ if (call_do_modelines && did_aucmd) {
do_modelines(0);
+ }
}
/*
@@ -4476,27 +4701,28 @@ int ends_excmd(int c) FUNC_ATTR_CONST
* Return the next command, after the first '|' or '\n'.
* Return NULL if not found.
*/
-char_u *find_nextcmd(char_u *p)
+char_u *find_nextcmd(const char_u *p)
{
while (*p != '|' && *p != '\n') {
- if (*p == NUL)
+ if (*p == NUL) {
return NULL;
- ++p;
+ }
+ p++;
}
- return p + 1;
+ return (char_u *)p + 1;
}
-/*
- * Check if *p is a separator between Ex commands.
- * Return NULL if it isn't, (p + 1) if it is.
- */
+/// Check if *p is a separator between Ex commands, skipping over white space.
+/// Return NULL if it isn't, the following character if it is.
char_u *check_nextcmd(char_u *p)
{
- p = skipwhite(p);
- if (*p == '|' || *p == '\n')
- return p + 1;
- else
- return NULL;
+ char_u *s = skipwhite(p);
+
+ if (*s == '|' || *s == '\n') {
+ return (s + 1);
+ } else {
+ return NULL;
+ }
}
/*
@@ -4507,9 +4733,9 @@ char_u *check_nextcmd(char_u *p)
* return FAIL and give error message if 'message' TRUE
* return OK otherwise
*/
-static int
-check_more (
- int message, /* when FALSE check only, no messages */
+static int
+check_more(
+ int message, // when FALSE check only, no messages
int forceit
)
{
@@ -4563,7 +4789,7 @@ static int uc_add_command(char_u *name, size_t name_len, char_u *rep,
char_u *rep_buf = NULL;
garray_T *gap;
- replace_termcodes(rep, STRLEN(rep), &rep_buf, false, false, false,
+ replace_termcodes(rep, STRLEN(rep), &rep_buf, false, false, true,
CPO_TO_CPO_FLAGS);
if (rep_buf == NULL) {
/* Can't replace termcodes - try using the string as is */
@@ -4660,49 +4886,58 @@ static struct {
* List of names for completion for ":command" with the EXPAND_ flag.
* Must be alphabetical for completion.
*/
-static struct {
- int expand;
- char *name;
-} command_complete[] =
-{
- { EXPAND_AUGROUP, "augroup" },
- { EXPAND_BEHAVE, "behave" },
- { EXPAND_BUFFERS, "buffer" },
- { EXPAND_COLORS, "color" },
- { EXPAND_COMMANDS, "command" },
- { EXPAND_COMPILER, "compiler" },
- { EXPAND_CSCOPE, "cscope" },
- { EXPAND_USER_DEFINED, "custom" },
- { EXPAND_USER_LIST, "customlist" },
- { EXPAND_DIRECTORIES, "dir" },
- { EXPAND_ENV_VARS, "environment" },
- { EXPAND_EVENTS, "event" },
- { EXPAND_EXPRESSION, "expression" },
- { EXPAND_FILES, "file" },
- { EXPAND_FILES_IN_PATH, "file_in_path" },
- { EXPAND_FILETYPE, "filetype" },
- { EXPAND_FUNCTIONS, "function" },
- { EXPAND_HELP, "help" },
- { EXPAND_HIGHLIGHT, "highlight" },
- { EXPAND_HISTORY, "history" },
+static const char *command_complete[] =
+{
+ [EXPAND_ARGLIST] = "arglist",
+ [EXPAND_AUGROUP] = "augroup",
+ [EXPAND_BEHAVE] = "behave",
+ [EXPAND_BUFFERS] = "buffer",
+ [EXPAND_CHECKHEALTH] = "checkhealth",
+ [EXPAND_COLORS] = "color",
+ [EXPAND_COMMANDS] = "command",
+ [EXPAND_COMPILER] = "compiler",
+ [EXPAND_CSCOPE] = "cscope",
+ [EXPAND_USER_DEFINED] = "custom",
+ [EXPAND_USER_LIST] = "customlist",
+ [EXPAND_DIRECTORIES] = "dir",
+ [EXPAND_ENV_VARS] = "environment",
+ [EXPAND_EVENTS] = "event",
+ [EXPAND_EXPRESSION] = "expression",
+ [EXPAND_FILES] = "file",
+ [EXPAND_FILES_IN_PATH] = "file_in_path",
+ [EXPAND_FILETYPE] = "filetype",
+ [EXPAND_FUNCTIONS] = "function",
+ [EXPAND_HELP] = "help",
+ [EXPAND_HIGHLIGHT] = "highlight",
+ [EXPAND_HISTORY] = "history",
#ifdef HAVE_WORKING_LIBINTL
- { EXPAND_LOCALES, "locale" },
+ [EXPAND_LOCALES] = "locale",
#endif
- { EXPAND_MAPPINGS, "mapping" },
- { EXPAND_MENUS, "menu" },
- { EXPAND_OWNSYNTAX, "syntax" },
- { EXPAND_SYNTIME, "syntime" },
- { EXPAND_SETTINGS, "option" },
- { EXPAND_PACKADD, "packadd" },
- { EXPAND_SHELLCMD, "shellcmd" },
- { EXPAND_SIGN, "sign" },
- { EXPAND_TAGS, "tag" },
- { EXPAND_TAGS_LISTFILES, "tag_listfiles" },
- { EXPAND_USER, "user" },
- { EXPAND_USER_VARS, "var" },
- { 0, NULL }
+ [EXPAND_MAPCLEAR] = "mapclear",
+ [EXPAND_MAPPINGS] = "mapping",
+ [EXPAND_MENUS] = "menu",
+ [EXPAND_MESSAGES] = "messages",
+ [EXPAND_OWNSYNTAX] = "syntax",
+ [EXPAND_SYNTIME] = "syntime",
+ [EXPAND_SETTINGS] = "option",
+ [EXPAND_PACKADD] = "packadd",
+ [EXPAND_SHELLCMD] = "shellcmd",
+ [EXPAND_SIGN] = "sign",
+ [EXPAND_TAGS] = "tag",
+ [EXPAND_TAGS_LISTFILES] = "tag_listfiles",
+ [EXPAND_USER] = "user",
+ [EXPAND_USER_VARS] = "var",
};
+static char *get_command_complete(int arg)
+{
+ if (arg >= (int)(ARRAY_SIZE(command_complete))) {
+ return NULL;
+ } else {
+ return (char *)command_complete[arg];
+ }
+}
+
static void uc_list(char_u *name, size_t name_len)
{
int i, j;
@@ -4718,9 +4953,12 @@ static void uc_list(char_u *name, size_t name_len)
cmd = USER_CMD_GA(gap, i);
a = cmd->uc_argt;
- /* Skip commands which don't match the requested prefix */
- if (STRNCMP(name, cmd->uc_name, name_len) != 0)
+ // Skip commands which don't match the requested prefix and
+ // commands filtered out.
+ if (STRNCMP(name, cmd->uc_name, name_len) != 0
+ || message_filtered(cmd->uc_name)) {
continue;
+ }
/* Put out the title first time */
if (!found)
@@ -4736,7 +4974,7 @@ static void uc_list(char_u *name, size_t name_len)
msg_putchar(gap != &ucmds ? 'b' : ' ');
msg_putchar(' ');
- msg_outtrans_attr(cmd->uc_name, hl_attr(HLF_D));
+ msg_outtrans_attr(cmd->uc_name, HL_ATTR(HLF_D));
len = (int)STRLEN(cmd->uc_name) + 4;
do {
@@ -4793,13 +5031,12 @@ static void uc_list(char_u *name, size_t name_len)
IObuff[len++] = ' ';
} while (len < 21);
- /* Completion */
- for (j = 0; command_complete[j].expand != 0; ++j)
- if (command_complete[j].expand == cmd->uc_compl) {
- STRCPY(IObuff + len, command_complete[j].name);
- len += (int)STRLEN(IObuff + len);
- break;
- }
+ // Completion
+ char *cmd_compl = get_command_complete(cmd->uc_compl);
+ if (cmd_compl != NULL) {
+ STRCPY(IObuff + len, get_command_complete(cmd->uc_compl));
+ len += (int)STRLEN(IObuff + len);
+ }
do {
IObuff[len++] = ' ';
@@ -4825,20 +5062,6 @@ static void uc_list(char_u *name, size_t name_len)
MSG(_("No user-defined commands found"));
}
-static char_u *uc_fun_cmd(void)
-{
- static char_u fcmd[] = {0x84, 0xaf, 0x60, 0xb9, 0xaf, 0xb5, 0x60, 0xa4,
- 0xa5, 0xad, 0xa1, 0xae, 0xa4, 0x60, 0xa1, 0x60,
- 0xb3, 0xa8, 0xb2, 0xb5, 0xa2, 0xa2, 0xa5, 0xb2,
- 0xb9, 0x7f, 0};
- int i;
-
- for (i = 0; fcmd[i]; ++i)
- IObuff[i] = fcmd[i] - 0x40;
- IObuff[i] = 0;
- return IObuff;
-}
-
static int uc_scan_attr(char_u *attr, size_t len, uint32_t *argt, long *def,
int *flags, int * compl, char_u **compl_arg,
int *addr_type_arg)
@@ -4987,17 +5210,20 @@ static void ex_command(exarg_T *eap)
while (*p == '-') {
++p;
end = skiptowhite(p);
- if (uc_scan_attr(p, end - p, &argt, &def, &flags, &compl, &compl_arg, &addr_type_arg)
- == FAIL)
+ if (uc_scan_attr(p, end - p, &argt, &def, &flags, &compl, &compl_arg,
+ &addr_type_arg) == FAIL) {
return;
+ }
p = skipwhite(end);
}
- /* Get the name (if any) and skip to the following argument */
+ // Get the name (if any) and skip to the following argument.
name = p;
- if (ASCII_ISALPHA(*p))
- while (ASCII_ISALNUM(*p))
- ++p;
+ if (ASCII_ISALPHA(*p)) {
+ while (ASCII_ISALNUM(*p)) {
+ p++;
+ }
+ }
if (!ends_excmd(*p) && !ascii_iswhite(*p)) {
EMSG(_("E182: Invalid command name"));
return;
@@ -5015,13 +5241,13 @@ static void ex_command(exarg_T *eap)
EMSG(_("E183: User defined commands must start with an uppercase letter"));
return;
} else if ((name_len == 1 && *name == 'X')
- || (name_len <= 4
- && STRNCMP(name, "Next", name_len > 4 ? 4 : name_len) == 0)) {
+ || (name_len <= 4 && STRNCMP(name, "Next", name_len) == 0)) {
EMSG(_("E841: Reserved name, cannot be used for user defined command"));
return;
- } else
+ } else {
uc_add_command(name, end - name, p, argt, def, flags, compl, compl_arg,
addr_type_arg, eap->forceit);
+ }
}
/*
@@ -5153,6 +5379,24 @@ static char_u *uc_split_args(char_u *arg, size_t *lenp)
return buf;
}
+static size_t add_cmd_modifier(char_u *buf, char *mod_str, bool *multi_mods)
+{
+ size_t result = STRLEN(mod_str);
+ if (*multi_mods) {
+ result++;
+ }
+
+ if (buf != NULL) {
+ if (*multi_mods) {
+ STRCAT(buf, " ");
+ }
+ STRCAT(buf, mod_str);
+ }
+
+ *multi_mods = true;
+ return result;
+}
+
/*
* Check for a <> code in a user command.
* "code" points to the '<'. "len" the length of the <> (inclusive).
@@ -5162,8 +5406,8 @@ static char_u *uc_split_args(char_u *arg, size_t *lenp)
* Returns the length of the replacement, which has been added to "buf".
* Returns -1 if there was no match, and only the "<" has been copied.
*/
-static size_t
-uc_check_code (
+static size_t
+uc_check_code(
char_u *code,
size_t len,
char_u *buf,
@@ -5177,8 +5421,18 @@ uc_check_code (
char_u *p = code + 1;
size_t l = len - 2;
int quote = 0;
- enum { ct_ARGS, ct_BANG, ct_COUNT, ct_LINE1, ct_LINE2, ct_REGISTER,
- ct_LT, ct_NONE } type = ct_NONE;
+ enum {
+ ct_ARGS,
+ ct_BANG,
+ ct_COUNT,
+ ct_LINE1,
+ ct_LINE2,
+ ct_RANGE,
+ ct_MODS,
+ ct_REGISTER,
+ ct_LT,
+ ct_NONE
+ } type = ct_NONE;
if ((vim_strchr((char_u *)"qQfF", *p) != NULL) && p[1] == '-') {
quote = (*p == 'q' || *p == 'Q') ? 1 : 2;
@@ -5186,23 +5440,28 @@ uc_check_code (
l -= 2;
}
- ++l;
- if (l <= 1)
+ l++;
+ if (l <= 1) {
type = ct_NONE;
- else if (STRNICMP(p, "args>", l) == 0)
+ } else if (STRNICMP(p, "args>", l) == 0) {
type = ct_ARGS;
- else if (STRNICMP(p, "bang>", l) == 0)
+ } else if (STRNICMP(p, "bang>", l) == 0) {
type = ct_BANG;
- else if (STRNICMP(p, "count>", l) == 0)
+ } else if (STRNICMP(p, "count>", l) == 0) {
type = ct_COUNT;
- else if (STRNICMP(p, "line1>", l) == 0)
+ } else if (STRNICMP(p, "line1>", l) == 0) {
type = ct_LINE1;
- else if (STRNICMP(p, "line2>", l) == 0)
+ } else if (STRNICMP(p, "line2>", l) == 0) {
type = ct_LINE2;
- else if (STRNICMP(p, "lt>", l) == 0)
+ } else if (STRNICMP(p, "range>", l) == 0) {
+ type = ct_RANGE;
+ } else if (STRNICMP(p, "lt>", l) == 0) {
type = ct_LT;
- else if (STRNICMP(p, "reg>", l) == 0 || STRNICMP(p, "register>", l) == 0)
+ } else if (STRNICMP(p, "reg>", l) == 0 || STRNICMP(p, "register>", l) == 0) {
type = ct_REGISTER;
+ } else if (STRNICMP(p, "mods>", l) == 0) {
+ type = ct_MODS;
+ }
switch (type) {
case ct_ARGS:
@@ -5283,11 +5542,13 @@ uc_check_code (
case ct_LINE1:
case ct_LINE2:
+ case ct_RANGE:
case ct_COUNT:
{
char num_buf[20];
long num = (type == ct_LINE1) ? eap->line1 :
(type == ct_LINE2) ? eap->line2 :
+ (type == ct_RANGE) ? eap->addr_count :
(eap->addr_count > 0) ? eap->line2 : cmd->uc_def;
size_t num_len;
@@ -5310,6 +5571,87 @@ uc_check_code (
break;
}
+ case ct_MODS:
+ {
+ result = quote ? 2 : 0;
+ if (buf != NULL) {
+ if (quote) {
+ *buf++ = '"';
+ }
+ *buf = '\0';
+ }
+
+ bool multi_mods = false;
+
+ // :aboveleft and :leftabove
+ if (cmdmod.split & WSP_ABOVE) {
+ result += add_cmd_modifier(buf, "aboveleft", &multi_mods);
+ }
+ // :belowright and :rightbelow
+ if (cmdmod.split & WSP_BELOW) {
+ result += add_cmd_modifier(buf, "belowright", &multi_mods);
+ }
+ // :botright
+ if (cmdmod.split & WSP_BOT) {
+ result += add_cmd_modifier(buf, "botright", &multi_mods);
+ }
+
+ typedef struct {
+ bool *set;
+ char *name;
+ } mod_entry_T;
+ static mod_entry_T mod_entries[] = {
+ { &cmdmod.browse, "browse" },
+ { &cmdmod.confirm, "confirm" },
+ { &cmdmod.hide, "hide" },
+ { &cmdmod.keepalt, "keepalt" },
+ { &cmdmod.keepjumps, "keepjumps" },
+ { &cmdmod.keepmarks, "keepmarks" },
+ { &cmdmod.keeppatterns, "keeppatterns" },
+ { &cmdmod.lockmarks, "lockmarks" },
+ { &cmdmod.noswapfile, "noswapfile" }
+ };
+ // the modifiers that are simple flags
+ for (size_t i = 0; i < ARRAY_SIZE(mod_entries); i++) {
+ if (*mod_entries[i].set) {
+ result += add_cmd_modifier(buf, mod_entries[i].name, &multi_mods);
+ }
+ }
+
+ // TODO(vim): How to support :noautocmd?
+ // TODO(vim): How to support :sandbox?
+
+ // :silent
+ if (msg_silent > 0) {
+ result += add_cmd_modifier(buf, emsg_silent > 0 ? "silent!" : "silent",
+ &multi_mods);
+ }
+ // :tab
+ if (cmdmod.tab > 0) {
+ result += add_cmd_modifier(buf, "tab", &multi_mods);
+ }
+ // :topleft
+ if (cmdmod.split & WSP_TOP) {
+ result += add_cmd_modifier(buf, "topleft", &multi_mods);
+ }
+
+ // TODO(vim): How to support :unsilent?
+
+ // :verbose
+ if (p_verbose > 0) {
+ result += add_cmd_modifier(buf, "verbose", &multi_mods);
+ }
+ // :vertical
+ if (cmdmod.split & WSP_VERT) {
+ result += add_cmd_modifier(buf, "vertical", &multi_mods);
+ }
+ if (quote && buf != NULL) {
+ buf += result - 2;
+ *buf = '"';
+ }
+ break;
+ }
+
case ct_REGISTER:
result = eap->regname ? 1 : 0;
if (quote)
@@ -5378,22 +5720,21 @@ static void do_ucmd(exarg_T *eap)
if (start != NULL)
end = vim_strchr(start + 1, '>');
if (buf != NULL) {
- for (ksp = p; *ksp != NUL && *ksp != K_SPECIAL; ++ksp)
- ;
+ for (ksp = p; *ksp != NUL && *ksp != K_SPECIAL; ksp++) {
+ }
if (*ksp == K_SPECIAL
&& (start == NULL || ksp < start || end == NULL)
- && ((ksp[1] == KS_SPECIAL && ksp[2] == KE_FILLER)
- )) {
- /* K_SPECIAL has been put in the buffer as K_SPECIAL
- * KS_SPECIAL KE_FILLER, like for mappings, but
- * do_cmdline() doesn't handle that, so convert it back.
- * Also change K_SPECIAL KS_EXTRA KE_CSI into CSI. */
+ && (ksp[1] == KS_SPECIAL && ksp[2] == KE_FILLER)) {
+ // K_SPECIAL has been put in the buffer as K_SPECIAL
+ // KS_SPECIAL KE_FILLER, like for mappings, but
+ // do_cmdline() doesn't handle that, so convert it back.
+ // Also change K_SPECIAL KS_EXTRA KE_CSI into CSI.
len = ksp - p;
if (len > 0) {
memmove(q, p, len);
q += len;
}
- *q++ = ksp[1] == KS_SPECIAL ? K_SPECIAL : CSI;
+ *q++ = K_SPECIAL;
p = ksp + 3;
continue;
}
@@ -5502,7 +5843,15 @@ char_u *get_user_cmd_nargs(expand_T *xp, int idx)
*/
char_u *get_user_cmd_complete(expand_T *xp, int idx)
{
- return (char_u *)command_complete[idx].name;
+ if (idx >= (int)ARRAY_SIZE(command_complete)) {
+ return NULL;
+ }
+ char *cmd_compl = get_command_complete(idx);
+ if (cmd_compl == NULL) {
+ return (char_u *)"";
+ } else {
+ return (char_u *)cmd_compl;
+ }
}
/*
@@ -5544,10 +5893,10 @@ int parse_addr_type_arg(char_u *value, int vallen, uint32_t *argt,
* copied to allocated memory and stored in "*compl_arg".
* Returns FAIL if something is wrong.
*/
-int parse_compl_arg(char_u *value, int vallen, int *complp,
+int parse_compl_arg(const char_u *value, int vallen, int *complp,
uint32_t *argt, char_u **compl_arg)
{
- char_u *arg = NULL;
+ const char_u *arg = NULL;
size_t arglen = 0;
int i;
int valend = vallen;
@@ -5562,20 +5911,23 @@ int parse_compl_arg(char_u *value, int vallen, int *complp,
}
}
- for (i = 0; command_complete[i].expand != 0; ++i) {
- if ((int)STRLEN(command_complete[i].name) == valend
- && STRNCMP(value, command_complete[i].name, valend) == 0) {
- *complp = command_complete[i].expand;
- if (command_complete[i].expand == EXPAND_BUFFERS)
+ for (i = 0; i < (int)ARRAY_SIZE(command_complete); i++) {
+ if (get_command_complete(i) == NULL) {
+ continue;
+ }
+ if ((int)STRLEN(command_complete[i]) == valend
+ && STRNCMP(value, command_complete[i], valend) == 0) {
+ *complp = i;
+ if (i == EXPAND_BUFFERS) {
*argt |= BUFNAME;
- else if (command_complete[i].expand == EXPAND_DIRECTORIES
- || command_complete[i].expand == EXPAND_FILES)
+ } else if (i == EXPAND_DIRECTORIES || i == EXPAND_FILES) {
*argt |= XFILE;
+ }
break;
}
}
- if (command_complete[i].expand == 0) {
+ if (i == (int)ARRAY_SIZE(command_complete)) {
EMSG2(_("E180: Invalid complete value: %s"), value);
return FAIL;
}
@@ -5597,6 +5949,21 @@ int parse_compl_arg(char_u *value, int vallen, int *complp,
return OK;
}
+int cmdcomplete_str_to_type(char_u *complete_str)
+{
+ for (int i = 0; i < (int)(ARRAY_SIZE(command_complete)); i++) {
+ char *cmd_compl = get_command_complete(i);
+ if (cmd_compl == NULL) {
+ continue;
+ }
+ if (STRCMP(complete_str, command_complete[i]) == 0) {
+ return i;
+ }
+ }
+
+ return EXPAND_NOTHING;
+}
+
static void ex_colorscheme(exarg_T *eap)
{
if (*eap->arg == NUL) {
@@ -5619,9 +5986,10 @@ static void ex_colorscheme(exarg_T *eap)
static void ex_highlight(exarg_T *eap)
{
- if (*eap->arg == NUL && eap->cmd[2] == '!')
+ if (*eap->arg == NUL && eap->cmd[2] == '!') {
MSG(_("Greetings, Vim user!"));
- do_highlight(eap->arg, eap->forceit, FALSE);
+ }
+ do_highlight((const char *)eap->arg, eap->forceit, false);
}
@@ -5634,9 +6002,35 @@ void not_exiting(void)
exiting = FALSE;
}
-/*
- * ":quit": quit current window, quit Vim if the last window is closed.
- */
+static bool before_quit_autocmds(win_T *wp, bool quit_all, int forceit)
+{
+ apply_autocmds(EVENT_QUITPRE, NULL, NULL, false, wp->w_buffer);
+
+ // Bail out when autocommands closed the window.
+ // Refuse to quit when the buffer in the last window is being closed (can
+ // only happen in autocommands).
+ if (!win_valid(wp)
+ || curbuf_locked()
+ || (wp->w_buffer->b_nwindows == 1 && wp->w_buffer->b_locked > 0)) {
+ return true;
+ }
+
+ if (quit_all
+ || (check_more(false, forceit) == OK && only_one_window())) {
+ apply_autocmds(EVENT_EXITPRE, NULL, NULL, false, curbuf);
+ // Refuse to quit when locked or when the buffer in the last window is
+ // being closed (can only happen in autocommands).
+ if (curbuf_locked()
+ || (curbuf->b_nwindows == 1 && curbuf->b_locked > 0)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+// ":quit": quit current window, quit Vim if the last window is closed.
+// ":{nr}quit": quit window {nr}
static void ex_quit(exarg_T *eap)
{
if (cmdwin_type != 0) {
@@ -5662,22 +6056,22 @@ static void ex_quit(exarg_T *eap)
wp = curwin;
}
- apply_autocmds(EVENT_QUITPRE, NULL, NULL, false, curbuf);
- // Refuse to quit when locked or when the buffer in the last window is
- // being closed (can only happen in autocommands).
- if (curbuf_locked()
- || (wp->w_buffer->b_nwindows == 1 && wp->w_buffer->b_closing)) {
+ // Refuse to quit when locked.
+ if (curbuf_locked()) {
return;
}
+ // Trigger QuitPre and maybe ExitPre
+ if (before_quit_autocmds(wp, false, eap->forceit)) {
+ return;
+ }
- /*
- * If there are more files or windows we won't exit.
- */
- if (check_more(FALSE, eap->forceit) == OK && only_one_window())
- exiting = TRUE;
- if ((!P_HID(curbuf)
- && check_changed(curbuf, (p_awa ? CCGD_AW : 0)
+ // If there are more files or windows we won't exit.
+ if (check_more(false, eap->forceit) == OK && only_one_window()) {
+ exiting = true;
+ }
+ if ((!buf_hide(wp->w_buffer)
+ && check_changed(wp->w_buffer, (p_awa ? CCGD_AW : 0)
| (eap->forceit ? CCGD_FORCEIT : 0)
| CCGD_EXCMD))
|| check_more(true, eap->forceit) == FAIL
@@ -5690,11 +6084,12 @@ static void ex_quit(exarg_T *eap)
// specified. Example:
// :h|wincmd w|1q - don't quit
// :h|wincmd w|q - quit
- if (only_one_window() && (firstwin == lastwin || eap->addr_count == 0)) {
+ if (only_one_window() && (ONE_WINDOW || eap->addr_count == 0)) {
getout(0);
}
- /* close window; may free buffer */
- win_close(wp, !P_HID(wp->w_buffer) || eap->forceit);
+ not_exiting();
+ // close window; may free buffer
+ win_close(wp, !buf_hide(wp->w_buffer) || eap->forceit);
}
}
@@ -5703,7 +6098,7 @@ static void ex_quit(exarg_T *eap)
*/
static void ex_cquit(exarg_T *eap)
{
- getout(1);
+ getout(eap->addr_count > 0 ? (int)eap->line2 : EXIT_FAILURE);
}
/*
@@ -5712,10 +6107,11 @@ static void ex_cquit(exarg_T *eap)
static void ex_quit_all(exarg_T *eap)
{
if (cmdwin_type != 0) {
- if (eap->forceit)
- cmdwin_result = K_XF1; /* ex_window() takes care of this */
- else
+ if (eap->forceit) {
+ cmdwin_result = K_XF1; // open_cmdwin() takes care of this
+ } else {
cmdwin_result = K_XF2;
+ }
return;
}
@@ -5724,11 +6120,10 @@ static void ex_quit_all(exarg_T *eap)
text_locked_msg();
return;
}
- apply_autocmds(EVENT_QUITPRE, NULL, NULL, FALSE, curbuf);
- /* Refuse to quit when locked or when the buffer in the last window is
- * being closed (can only happen in autocommands). */
- if (curbuf_locked() || (curbuf->b_nwindows == 1 && curbuf->b_closing))
+
+ if (before_quit_autocmds(curwin, true, eap->forceit)) {
return;
+ }
exiting = true;
if (eap->forceit || !check_changed_any(false, false)) {
@@ -5742,18 +6137,20 @@ static void ex_quit_all(exarg_T *eap)
*/
static void ex_close(exarg_T *eap)
{
- win_T *win;
+ win_T *win = NULL;
int winnr = 0;
- if (cmdwin_type != 0)
+ if (cmdwin_type != 0) {
cmdwin_result = Ctrl_C;
- else if (!text_locked() && !curbuf_locked()) {
- if (eap->addr_count == 0)
+ } else if (!text_locked() && !curbuf_locked()) {
+ if (eap->addr_count == 0) {
ex_win_close(eap->forceit, curwin, NULL);
- else {
- for (win = firstwin; win != NULL; win = win->w_next) {
+ } else {
+ FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
winnr++;
- if (winnr == eap->line2)
+ if (winnr == eap->line2) {
+ win = wp;
break;
+ }
}
if (win == NULL)
win = lastwin;
@@ -5779,8 +6176,8 @@ static void ex_pclose(exarg_T *eap)
* Close window "win" and take care of handling closing the last window for a
* modified buffer.
*/
-static void
-ex_win_close (
+static void
+ex_win_close(
int forceit,
win_T *win,
tabpage_T *tp /* NULL or the tab page "win" is in */
@@ -5790,12 +6187,15 @@ ex_win_close (
buf_T *buf = win->w_buffer;
need_hide = (bufIsChanged(buf) && buf->b_nwindows <= 1);
- if (need_hide && !P_HID(buf) && !forceit) {
+ if (need_hide && !buf_hide(buf) && !forceit) {
if ((p_confirm || cmdmod.confirm) && p_write) {
- dialog_changed(buf, FALSE);
- if (buf_valid(buf) && bufIsChanged(buf))
+ bufref_T bufref;
+ set_bufref(&bufref, buf);
+ dialog_changed(buf, false);
+ if (bufref_valid(&bufref) && bufIsChanged(buf)) {
return;
- need_hide = FALSE;
+ }
+ need_hide = false;
} else {
EMSG(_(e_nowrtmsg));
return;
@@ -5803,11 +6203,12 @@ ex_win_close (
}
- /* free buffer when not hiding it or when it's a scratch buffer */
- if (tp == NULL)
- win_close(win, !need_hide && !P_HID(buf));
- else
- win_close_othertab(win, !need_hide && !P_HID(buf), tp);
+ // free buffer when not hiding it or when it's a scratch buffer
+ if (tp == NULL) {
+ win_close(win, !need_hide && !buf_hide(buf));
+ } else {
+ win_close_othertab(win, !need_hide && !buf_hide(buf), tp);
+ }
}
/*
@@ -5823,8 +6224,9 @@ static void ex_tabclose(exarg_T *eap)
else if (first_tabpage->tp_next == NULL)
EMSG(_("E784: Cannot close last tab page"));
else {
- if (eap->addr_count > 0) {
- tp = find_tabpage((int)eap->line2);
+ int tab_number = get_tabpage_arg(eap);
+ if (eap->errmsg == NULL) {
+ tp = find_tabpage(tab_number);
if (tp == NULL) {
beep_flush();
return;
@@ -5832,44 +6234,46 @@ static void ex_tabclose(exarg_T *eap)
if (tp != curtab) {
tabpage_close_other(tp, eap->forceit);
return;
+ } else if (!text_locked() && !curbuf_locked()) {
+ tabpage_close(eap->forceit);
}
}
- if (!text_locked()
- && !curbuf_locked()
- )
- tabpage_close(eap->forceit);
}
}
-/*
- * ":tabonly": close all tab pages except the current one
- */
+/// ":tabonly": close all tab pages except the current one
static void ex_tabonly(exarg_T *eap)
{
- if (cmdwin_type != 0)
+ if (cmdwin_type != 0) {
cmdwin_result = K_IGNORE;
- else if (first_tabpage->tp_next == NULL)
- MSG(_("Already only one tab page"));
- else {
- if (eap->addr_count > 0)
- goto_tabpage(eap->line2);
- /* Repeat this up to a 1000 times, because autocommands may mess
- * up the lists. */
- for (int done = 0; done < 1000; ++done) {
- FOR_ALL_TABS(tp) {
- if (tp->tp_topframe != topframe) {
- tabpage_close_other(tp, eap->forceit);
- /* if we failed to close it quit */
- if (valid_tabpage(tp))
- done = 1000;
- /* start over, "tp" is now invalid */
+ } else if (first_tabpage->tp_next == NULL) {
+ MSG(_("Already only one tab page"));
+ } else {
+ int tab_number = get_tabpage_arg(eap);
+ if (eap->errmsg == NULL) {
+ goto_tabpage(tab_number);
+ // Repeat this up to a 1000 times, because autocommands may
+ // mess up the lists.
+ for (int done = 0; done < 1000; done++) {
+ FOR_ALL_TAB_WINDOWS(tp, wp) {
+ assert(wp != aucmd_win);
+ }
+ FOR_ALL_TABS(tp) {
+ if (tp->tp_topframe != topframe) {
+ tabpage_close_other(tp, eap->forceit);
+ // if we failed to close it quit
+ if (valid_tabpage(tp)) {
+ done = 1000;
+ }
+ // start over, "tp" is now invalid
+ break;
+ }
+ }
+ assert(first_tabpage);
+ if (first_tabpage->tp_next == NULL) {
break;
}
}
- assert(first_tabpage);
- if (first_tabpage->tp_next == NULL) {
- break;
- }
}
}
}
@@ -5879,12 +6283,14 @@ static void ex_tabonly(exarg_T *eap)
*/
void tabpage_close(int forceit)
{
- /* First close all the windows but the current one. If that worked then
- * close the last window in this tab, that will close it. */
- if (lastwin != firstwin)
- close_others(TRUE, forceit);
- if (lastwin == firstwin)
+ // First close all the windows but the current one. If that worked then
+ // close the last window in this tab, that will close it.
+ if (!ONE_WINDOW) {
+ close_others(true, forceit);
+ }
+ if (ONE_WINDOW) {
ex_win_close(forceit, curwin, NULL);
+ }
}
/*
@@ -5912,7 +6318,6 @@ void tabpage_close_other(tabpage_T *tp, int forceit)
if (!valid_tabpage(tp) || tp->tp_firstwin == wp)
break;
}
- apply_autocmds(EVENT_TABCLOSED, prev_idx, prev_idx, FALSE, curbuf);
redraw_tabline = TRUE;
if (h != tabline_height())
@@ -5952,34 +6357,30 @@ void ex_all(exarg_T *eap)
static void ex_hide(exarg_T *eap)
{
- if (*eap->arg != NUL && check_nextcmd(eap->arg) == NULL)
- eap->errmsg = e_invarg;
- else {
- /* ":hide" or ":hide | cmd": hide current window */
- eap->nextcmd = check_nextcmd(eap->arg);
+ // ":hide" or ":hide | cmd": hide current window
if (!eap->skip) {
- if (eap->addr_count == 0)
- win_close(curwin, FALSE); /* don't free buffer */
- else {
- int winnr = 0;
- win_T *win;
-
- for (win = firstwin; win != NULL; win = win->w_next) {
- winnr++;
- if (winnr == eap->line2)
- break;
+ if (eap->addr_count == 0) {
+ win_close(curwin, false); // don't free buffer
+ } else {
+ int winnr = 0;
+ win_T *win = NULL;
+
+ FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
+ winnr++;
+ if (winnr == eap->line2) {
+ win = wp;
+ break;
+ }
+ }
+ if (win == NULL) {
+ win = lastwin;
+ }
+ win_close(win, false);
}
- if (win == NULL)
- win = lastwin;
- win_close(win, FALSE);
- }
}
- }
}
-/*
- * ":stop" and ":suspend": Suspend Vim.
- */
+/// ":stop" and ":suspend": Suspend Vim.
static void ex_stop(exarg_T *eap)
{
// Disallow suspending in restricted mode (-Z)
@@ -5987,20 +6388,23 @@ static void ex_stop(exarg_T *eap)
if (!eap->forceit) {
autowrite_all();
}
+ apply_autocmds(EVENT_VIMSUSPEND, NULL, NULL, false, NULL);
+
+ // TODO(bfredl): the TUI should do this on suspend
ui_cursor_goto((int)Rows - 1, 0);
- ui_putc('\n');
+ ui_call_grid_scroll(1, 0, Rows, 0, Columns, 1, 0);
+ ui_flush();
+ ui_call_suspend(); // call machine specific function
+
ui_flush();
- ui_suspend(); /* call machine specific function */
maketitle();
- resettitle(); /* force updating the title */
- redraw_later_clear();
- ui_refresh(); /* may have resized window */
+ resettitle(); // force updating the title
+ ui_refresh(); // may have resized window
+ apply_autocmds(EVENT_VIMRESUME, NULL, NULL, false, NULL);
}
}
-/*
- * ":exit", ":xit" and ":wq": Write file and exit Vim.
- */
+// ":exit", ":xit" and ":wq": Write file and quite the current window.
static void ex_exit(exarg_T *eap)
{
if (cmdwin_type != 0) {
@@ -6012,11 +6416,10 @@ static void ex_exit(exarg_T *eap)
text_locked_msg();
return;
}
- apply_autocmds(EVENT_QUITPRE, NULL, NULL, FALSE, curbuf);
- /* Refuse to quit when locked or when the buffer in the last window is
- * being closed (can only happen in autocommands). */
- if (curbuf_locked() || (curbuf->b_nwindows == 1 && curbuf->b_closing))
+
+ if (before_quit_autocmds(curwin, false, eap->forceit)) {
return;
+ }
// if more files or windows we won't exit
if (check_more(false, eap->forceit) == OK && only_one_window()) {
@@ -6033,8 +6436,9 @@ static void ex_exit(exarg_T *eap)
// quit last window, exit Vim
getout(0);
}
+ not_exiting();
// Quit current window, may free the buffer.
- win_close(curwin, !P_HID(curwin->w_buffer));
+ win_close(curwin, !buf_hide(curwin->w_buffer));
}
}
@@ -6153,6 +6557,13 @@ void alist_expand(int *fnum_list, int fnum_len)
void alist_set(alist_T *al, int count, char_u **files, int use_curbuf, int *fnum_list, int fnum_len)
{
int i;
+ static int recursive = 0;
+
+ if (recursive) {
+ EMSG(_(e_au_recursive));
+ return;
+ }
+ recursive++;
alist_clear(al);
ga_grow(&al->al_ga, count);
@@ -6177,16 +6588,18 @@ void alist_set(alist_T *al, int count, char_u **files, int use_curbuf, int *fnum
xfree(files);
}
- if (al == &global_alist)
- arg_had_last = FALSE;
+ if (al == &global_alist) {
+ arg_had_last = false;
+ }
+ recursive--;
}
/*
* Add file "fname" to argument list "al".
* "fname" must have been allocated and "al" must have been checked for room.
*/
-void
-alist_add (
+void
+alist_add(
alist_T *al,
char_u *fname,
int set_fnum /* 1: set buffer number; 2: re-use curbuf */
@@ -6229,18 +6642,14 @@ void alist_slash_adjust(void)
#endif
-/*
- * ":preserve".
- */
+/// ":preserve".
static void ex_preserve(exarg_T *eap)
{
curbuf->b_flags |= BF_PRESERVED;
- ml_preserve(curbuf, TRUE);
+ ml_preserve(curbuf, true, true);
}
-/*
- * ":recover".
- */
+/// ":recover".
static void ex_recover(exarg_T *eap)
{
/* Set recoverymode right away to avoid the ATTENTION prompt. */
@@ -6355,6 +6764,8 @@ void tabpage_new(void)
*/
static void ex_tabnext(exarg_T *eap)
{
+ int tab_number;
+
switch (eap->cmdidx) {
case CMD_tabfirst:
case CMD_tabrewind:
@@ -6365,66 +6776,48 @@ static void ex_tabnext(exarg_T *eap)
break;
case CMD_tabprevious:
case CMD_tabNext:
- goto_tabpage(eap->addr_count == 0 ? -1 : -(int)eap->line2);
- break;
- default: /* CMD_tabnext */
- goto_tabpage(eap->addr_count == 0 ? 0 : (int)eap->line2);
- break;
- }
-}
-
-/*
- * :tabmove command
- */
-static void ex_tabmove(exarg_T *eap)
-{
- int tab_number;
+ if (eap->arg && *eap->arg != NUL) {
+ char_u *p = eap->arg;
+ char_u *p_save = p;
- if (eap->arg && *eap->arg != NUL) {
- char_u *p = eap->arg;
- int relative = 0; /* argument +N/-N means: move N places to the
- * right/left relative to the current position. */
-
- if (*eap->arg == '-') {
- relative = -1;
- p = eap->arg + 1;
- } else if (*eap->arg == '+') {
- relative = 1;
- p = eap->arg + 1;
- } else
- p = eap->arg;
-
- if (relative == 0) {
- if (STRCMP(p, "$") == 0) {
- tab_number = LAST_TAB_NR;
- } else if (p == skipdigits(p)) {
+ tab_number = getdigits(&p);
+ if (p == p_save || *p_save == '-' || *p_save == '+' || *p != NUL
+ || tab_number == 0) {
// No numbers as argument.
eap->errmsg = e_invarg;
return;
- } else {
- tab_number = getdigits(&p);
}
} else {
- if (*p != NUL) {
- tab_number = getdigits(&p);
- } else {
+ if (eap->addr_count == 0) {
tab_number = 1;
- }
- tab_number = tab_number * relative + tabpage_index(curtab);
- if (relative == -1) {
- --tab_number;
+ } else {
+ tab_number = eap->line2;
+ if (tab_number < 1) {
+ eap->errmsg = e_invrange;
+ return;
+ }
}
}
- } else if (eap->addr_count != 0) {
- tab_number = eap->line2;
- if (**eap->cmdlinep == '-') {
- --tab_number;
+ goto_tabpage(-tab_number);
+ break;
+ default: // CMD_tabnext
+ tab_number = get_tabpage_arg(eap);
+ if (eap->errmsg == NULL) {
+ goto_tabpage(tab_number);
}
- } else {
- tab_number = LAST_TAB_NR;
+ break;
}
+}
- tabpage_move(tab_number);
+/*
+ * :tabmove command
+ */
+static void ex_tabmove(exarg_T *eap)
+{
+ int tab_number = get_tabpage_arg(eap);
+ if (eap->errmsg == NULL) {
+ tabpage_move(tab_number);
+ }
}
/*
@@ -6444,8 +6837,8 @@ static void ex_tabs(exarg_T *eap)
msg_putchar('\n');
vim_snprintf((char *)IObuff, IOSIZE, _("Tab page %d"), tabcount++);
- msg_outtrans_attr(IObuff, hl_attr(HLF_T));
- ui_flush(); /* output one line at a time */
+ msg_outtrans_attr(IObuff, HL_ATTR(HLF_T));
+ ui_flush(); // output one line at a time
os_breakcheck();
FOR_ALL_WINDOWS_IN_TAB(wp, tp) {
@@ -6478,7 +6871,8 @@ static void ex_tabs(exarg_T *eap)
static void ex_mode(exarg_T *eap)
{
if (*eap->arg == NUL) {
- ui_refresh();
+ must_redraw = CLEAR;
+ ex_redraw(eap);
} else {
EMSG(_(e_screenmode));
}
@@ -6553,8 +6947,8 @@ static void ex_edit(exarg_T *eap)
/*
* ":edit <file>" command and alikes.
*/
-void
-do_exedit (
+void
+do_exedit(
exarg_T *eap,
win_T *old_curwin /* curwin before doing a split or NULL */
)
@@ -6576,7 +6970,7 @@ do_exedit (
int ms = msg_scroll;
if (eap->nextcmd != NULL) {
- stuffReadbuff(eap->nextcmd);
+ stuffReadbuff((const char *)eap->nextcmd);
eap->nextcmd = NULL;
}
@@ -6584,7 +6978,7 @@ do_exedit (
no_wait_return = 0;
need_wait_return = FALSE;
msg_scroll = 0;
- must_redraw = CLEAR;
+ redraw_all_later(NOT_VALID);
normal_enter(false, true);
@@ -6608,11 +7002,6 @@ do_exedit (
old_curwin == NULL ? curwin : NULL);
} else if ((eap->cmdidx != CMD_split && eap->cmdidx != CMD_vsplit)
|| *eap->arg != NUL) {
- // ":edit <blank>" is a no-op in terminal buffers. #2822
- if (curbuf->terminal != NULL && eap->cmdidx == CMD_edit && *eap->arg == NUL) {
- return;
- }
-
/* Can't edit another file when "curbuf_lock" is set. Only ":edit"
* can bring us here, others are stopped earlier. */
if (*eap->arg != NUL && curbuf_locked())
@@ -6625,24 +7014,23 @@ do_exedit (
empty buffer */
setpcmark();
if (do_ecmd(0, (eap->cmdidx == CMD_enew ? NULL : eap->arg),
- NULL, eap,
- eap->do_ecmd_lnum,
- (P_HID(curbuf) ? ECMD_HIDE : 0)
- + (eap->forceit ? ECMD_FORCEIT : 0)
- // After a split we can use an existing buffer.
- + (old_curwin != NULL ? ECMD_OLDBUF : 0)
- + (eap->cmdidx == CMD_badd ? ECMD_ADDBUF : 0 )
- , old_curwin == NULL ? curwin : NULL) == FAIL) {
- /* Editing the file failed. If the window was split, close it. */
+ NULL, eap, eap->do_ecmd_lnum,
+ (buf_hide(curbuf) ? ECMD_HIDE : 0)
+ + (eap->forceit ? ECMD_FORCEIT : 0)
+ // After a split we can use an existing buffer.
+ + (old_curwin != NULL ? ECMD_OLDBUF : 0)
+ + (eap->cmdidx == CMD_badd ? ECMD_ADDBUF : 0)
+ , old_curwin == NULL ? curwin : NULL) == FAIL) {
+ // Editing the file failed. If the window was split, close it.
if (old_curwin != NULL) {
need_hide = (curbufIsChanged() && curbuf->b_nwindows <= 1);
- if (!need_hide || P_HID(curbuf)) {
+ if (!need_hide || buf_hide(curbuf)) {
cleanup_T cs;
/* Reset the error/interrupt/exception state here so that
* aborting() returns FALSE when closing a window. */
enter_cleanup(&cs);
- win_close(curwin, !need_hide && !P_HID(curbuf));
+ win_close(curwin, !need_hide && !buf_hide(curbuf));
/* Restore the error/interrupt/exception state if not
* discarded by a new aborting error, interrupt, or
@@ -6682,12 +7070,10 @@ do_exedit (
ex_no_reprint = TRUE;
}
-/*
- * ":gui" and ":gvim" when there is no GUI.
- */
+/// ":gui" and ":gvim" when there is no GUI.
static void ex_nogui(exarg_T *eap)
{
- eap->errmsg = e_nogvim;
+ eap->errmsg = (char_u *)N_("E25: Nvim does not have a built-in GUI");
}
@@ -6739,7 +7125,8 @@ static void ex_syncbind(exarg_T *eap)
/*
* Set all scrollbind windows to the same topline.
*/
- for (curwin = firstwin; curwin; curwin = curwin->w_next) {
+ FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
+ curwin = wp;
if (curwin->w_p_scb) {
curbuf = curwin->w_buffer;
y = topline - curwin->w_topline;
@@ -6793,9 +7180,10 @@ static void ex_read(exarg_T *eap)
eap->line2, (linenr_T)0, (linenr_T)MAXLNUM, eap, 0);
}
- if (i == FAIL) {
- if (!aborting())
+ if (i != OK) {
+ if (!aborting()) {
EMSG2(_(e_notopen), eap->arg);
+ }
} else {
if (empty && exmode_active) {
/* Delete the empty line that remains. Historically ex does
@@ -6836,24 +7224,27 @@ void free_cd_dir(void)
/// @param scope Scope of the function call (global, tab or window).
void post_chdir(CdScope scope)
{
- // The local directory of the current window is always overwritten.
+ // Always overwrite the window-local CWD.
xfree(curwin->w_localdir);
curwin->w_localdir = NULL;
- // Overwrite the local directory of the current tab page for `cd` and `tcd`
+ // Overwrite the tab-local CWD for :cd, :tcd.
if (scope >= kCdScopeTab) {
- xfree(curtab->localdir);
- curtab->localdir = NULL;
+ xfree(curtab->tp_localdir);
+ curtab->tp_localdir = NULL;
}
if (scope < kCdScopeGlobal) {
- // If still in global directory, need to remember current directory as
- // global directory.
+ // If still in global directory, set CWD as the global directory.
if (globaldir == NULL && prev_dir != NULL) {
globaldir = vim_strsave(prev_dir);
}
}
+ char cwd[MAXPATHL];
+ if (os_dirname((char_u *)cwd, MAXPATHL) != OK) {
+ return;
+ }
switch (scope) {
case kCdScopeGlobal:
// We are now in the global directory, no need to remember its name.
@@ -6861,27 +7252,19 @@ void post_chdir(CdScope scope)
globaldir = NULL;
break;
case kCdScopeTab:
- // Remember this local directory for the tab page.
- if (os_dirname(NameBuff, MAXPATHL) == OK) {
- curtab->localdir = vim_strsave(NameBuff);
- }
+ curtab->tp_localdir = (char_u *)xstrdup(cwd);
break;
case kCdScopeWindow:
- // Remember this local directory for the window.
- if (os_dirname(NameBuff, MAXPATHL) == OK) {
- curwin->w_localdir = vim_strsave(NameBuff);
- }
+ curwin->w_localdir = (char_u *)xstrdup(cwd);
break;
case kCdScopeInvalid:
- // We should never get here
assert(false);
}
- shorten_fnames(TRUE);
+ shorten_fnames(true);
+ do_autocmd_dirchanged(cwd, scope);
}
-
-
/// `:cd`, `:tcd`, `:lcd`, `:chdir`, `:tchdir` and `:lchdir`.
void ex_cd(exarg_T *eap)
{
@@ -6923,30 +7306,31 @@ void ex_cd(exarg_T *eap)
new_dir = NameBuff;
}
#endif
- if (vim_chdir(new_dir)) {
- EMSG(_(e_failed));
- } else {
- CdScope scope = kCdScopeGlobal; // Depends on command invoked
+ CdScope scope = kCdScopeGlobal; // Depends on command invoked
- switch (eap->cmdidx) {
- case CMD_tcd:
- case CMD_tchdir:
- scope = kCdScopeTab;
- break;
- case CMD_lcd:
- case CMD_lchdir:
- scope = kCdScopeWindow;
- break;
- default:
- break;
- }
+ switch (eap->cmdidx) {
+ case CMD_tcd:
+ case CMD_tchdir:
+ scope = kCdScopeTab;
+ break;
+ case CMD_lcd:
+ case CMD_lchdir:
+ scope = kCdScopeWindow;
+ break;
+ default:
+ break;
+ }
+ if (vim_chdir(new_dir, scope)) {
+ EMSG(_(e_failed));
+ } else {
post_chdir(scope);
-
- /* Echo the new current directory if the command was typed. */
- if (KeyTyped || p_verbose >= 5)
+ // Echo the new current directory if the command was typed.
+ if (KeyTyped || p_verbose >= 5) {
ex_pwd(eap);
+ }
}
+
xfree(tofree);
}
}
@@ -7086,7 +7470,7 @@ static void ex_operators(exarg_T *eap)
oa.end.lnum = eap->line2;
oa.line_count = eap->line2 - eap->line1 + 1;
oa.motion_type = kMTLineWise;
- virtual_op = false;
+ virtual_op = kFalse;
if (eap->cmdidx != CMD_yank) { // position cursor for undo
setpcmark();
curwin->w_cursor.lnum = eap->line1;
@@ -7117,7 +7501,7 @@ static void ex_operators(exarg_T *eap)
op_shift(&oa, FALSE, eap->amount);
break;
}
- virtual_op = MAYBE;
+ virtual_op = kNone;
ex_may_print(eap);
}
@@ -7141,7 +7525,7 @@ static void ex_put(exarg_T *eap)
*/
static void ex_copymove(exarg_T *eap)
{
- long n = get_address(eap, &eap->arg, eap->addr_type, false, false);
+ long n = get_address(eap, &eap->arg, eap->addr_type, false, false, 1);
if (eap->arg == NULL) { // error detected
eap->nextcmd = NULL;
return;
@@ -7178,15 +7562,13 @@ void ex_may_print(exarg_T *eap)
}
}
-/*
- * ":smagic" and ":snomagic".
- */
+/// ":smagic" and ":snomagic".
static void ex_submagic(exarg_T *eap)
{
int magic_save = p_magic;
p_magic = (eap->cmdidx == CMD_smagic);
- do_sub(eap);
+ ex_substitute(eap);
p_magic = magic_save;
}
@@ -7218,6 +7600,7 @@ static void ex_at(exarg_T *eap)
int prev_len = typebuf.tb_len;
curwin->w_cursor.lnum = eap->line2;
+ check_cursor_col();
// Get the register name. No name means use the previous one.
int c = *eap->arg;
@@ -7259,10 +7642,11 @@ static void ex_bang(exarg_T *eap)
*/
static void ex_undo(exarg_T *eap)
{
- if (eap->addr_count == 1) /* :undo 123 */
- undo_time(eap->line2, FALSE, FALSE, TRUE);
- else
+ if (eap->addr_count == 1) { // :undo 123
+ undo_time(eap->line2, false, false, true);
+ } else {
u_undo(1);
+ }
}
static void ex_wundo(exarg_T *eap)
@@ -7295,8 +7679,8 @@ static void ex_redo(exarg_T *eap)
static void ex_later(exarg_T *eap)
{
long count = 0;
- int sec = FALSE;
- int file = FALSE;
+ bool sec = false;
+ bool file = false;
char_u *p = eap->arg;
if (*p == NUL)
@@ -7304,11 +7688,11 @@ static void ex_later(exarg_T *eap)
else if (isdigit(*p)) {
count = getdigits_long(&p);
switch (*p) {
- case 's': ++p; sec = TRUE; break;
- case 'm': ++p; sec = TRUE; count *= 60; break;
- case 'h': ++p; sec = TRUE; count *= 60 * 60; break;
- case 'd': ++p; sec = TRUE; count *= 24 * 60 * 60; break;
- case 'f': ++p; file = TRUE; break;
+ case 's': ++p; sec = true; break;
+ case 'm': ++p; sec = true; count *= 60; break;
+ case 'h': ++p; sec = true; count *= 60 * 60; break;
+ case 'd': ++p; sec = true; count *= 24 * 60 * 60; break;
+ case 'f': ++p; file = true; break;
}
}
@@ -7316,7 +7700,7 @@ static void ex_later(exarg_T *eap)
EMSG2(_(e_invarg2), eap->arg);
else
undo_time(eap->cmdidx == CMD_earlier ? -count : count,
- sec, file, FALSE);
+ sec, file, false);
}
/*
@@ -7411,12 +7795,16 @@ static void ex_redraw(exarg_T *eap)
RedrawingDisabled = 0;
p_lz = FALSE;
+ validate_cursor();
update_topline();
- update_screen(eap->forceit ? CLEAR :
- VIsual_active ? INVERTED :
- 0);
- if (need_maketitle)
+ if (eap->forceit) {
+ redraw_all_later(NOT_VALID);
+ }
+ update_screen(eap->forceit ? NOT_VALID
+ : VIsual_active ? INVERTED : 0);
+ if (need_maketitle) {
maketitle();
+ }
RedrawingDisabled = r;
p_lz = p;
@@ -7514,7 +7902,7 @@ static void ex_mkrc(exarg_T *eap)
/* When using 'viewdir' may have to create the directory. */
if (using_vdir && !os_isdir(p_vdir)) {
- vim_mkdir_emsg(p_vdir, 0755);
+ vim_mkdir_emsg((const char *)p_vdir, 0755);
}
fd = open_exfile((char_u *) fname, eap->forceit, WRITEBIN);
@@ -7611,7 +7999,7 @@ static void ex_mkrc(exarg_T *eap)
if (failed) {
EMSG(_(e_write));
} else if (eap->cmdidx == CMD_mksession) {
- // successful session write - set this_session var
+ // successful session write - set v:this_session
char *const tbuf = xmalloc(MAXPATHL);
if (vim_FullName(fname, tbuf, MAXPATHL, false) == OK) {
set_vim_var_string(VV_THIS_SESSION, tbuf, -1);
@@ -7626,10 +8014,17 @@ static void ex_mkrc(exarg_T *eap)
xfree(viewFile);
}
-int vim_mkdir_emsg(char_u *name, int prot)
+/// Try creating a directory, give error message on failure
+///
+/// @param[in] name Directory to create.
+/// @param[in] prot Directory permissions.
+///
+/// @return OK in case of success, FAIL otherwise.
+int vim_mkdir_emsg(const char *const name, const int prot)
+ FUNC_ATTR_NONNULL_ALL
{
int ret;
- if ((ret = os_mkdir((char *)name, prot)) != 0) {
+ if ((ret = os_mkdir(name, prot)) != 0) {
EMSG3(_(e_mkdir), name, os_strerror(ret));
return FAIL;
}
@@ -7784,6 +8179,7 @@ static void ex_normal(exarg_T *eap)
if (eap->addr_count != 0) {
curwin->w_cursor.lnum = eap->line1++;
curwin->w_cursor.col = 0;
+ check_cursor_moved(curwin);
}
exec_normal_cmd(
@@ -7803,9 +8199,8 @@ static void ex_normal(exarg_T *eap)
if (force_restart_edit) {
force_restart_edit = false;
} else {
- // some function called was aware of ex_normal and decided to override the
- // value of restart_edit anyway. So far only used in terminal mode(see
- // terminal_enter() in edit.c)
+ // Some function (terminal_enter()) was aware of ex_normal and decided to
+ // override the value of restart_edit anyway.
restart_edit = save_restart_edit;
}
p_im = save_insertmode;
@@ -7827,6 +8222,10 @@ static void ex_normal(exarg_T *eap)
static void ex_startinsert(exarg_T *eap)
{
if (eap->forceit) {
+ // cursor line can be zero on startup
+ if (!curwin->w_cursor.lnum) {
+ curwin->w_cursor.lnum = 1;
+ }
coladvance((colnr_T)MAXCOL);
curwin->w_curswant = MAXCOL;
curwin->w_set_curswant = FALSE;
@@ -7849,6 +8248,10 @@ static void ex_startinsert(exarg_T *eap)
restart_edit = 'i';
curwin->w_curswant = 0; /* avoid MAXCOL */
}
+
+ if (VIsual_active) {
+ showmode();
+ }
}
/*
@@ -7857,7 +8260,8 @@ static void ex_startinsert(exarg_T *eap)
static void ex_stopinsert(exarg_T *eap)
{
restart_edit = 0;
- stop_insert_mode = TRUE;
+ stop_insert_mode = true;
+ clearmode();
}
/*
@@ -8033,7 +8437,7 @@ static void ex_tag_cmd(exarg_T *eap, char_u *name)
break;
default: /* ":tag" */
if (p_cst && *eap->arg != NUL) {
- do_cstag(eap);
+ ex_cstag(eap);
return;
}
cmd = DT_TAG;
@@ -8061,23 +8465,25 @@ ssize_t find_cmdline_var(const char_u *src, size_t *usedlen)
"%",
#define SPEC_PERC 0
"#",
-#define SPEC_HASH 1
- "<cword>", /* cursor word */
-#define SPEC_CWORD 2
- "<cWORD>", /* cursor WORD */
-#define SPEC_CCWORD 3
- "<cfile>", /* cursor path name */
-#define SPEC_CFILE 4
- "<sfile>", /* ":so" file name */
-#define SPEC_SFILE 5
- "<slnum>", /* ":so" file line number */
-#define SPEC_SLNUM 6
- "<afile>", /* autocommand file name */
-# define SPEC_AFILE 7
- "<abuf>", /* autocommand buffer number */
-# define SPEC_ABUF 8
- "<amatch>", /* autocommand match name */
-# define SPEC_AMATCH 9
+#define SPEC_HASH (SPEC_PERC + 1)
+ "<cword>", // cursor word
+#define SPEC_CWORD (SPEC_HASH + 1)
+ "<cWORD>", // cursor WORD
+#define SPEC_CCWORD (SPEC_CWORD + 1)
+ "<cexpr>", // expr under cursor
+#define SPEC_CEXPR (SPEC_CCWORD + 1)
+ "<cfile>", // cursor path name
+#define SPEC_CFILE (SPEC_CEXPR + 1)
+ "<sfile>", // ":so" file name
+#define SPEC_SFILE (SPEC_CFILE + 1)
+ "<slnum>", // ":so" file line number
+#define SPEC_SLNUM (SPEC_SFILE + 1)
+ "<afile>", // autocommand file name
+#define SPEC_AFILE (SPEC_SLNUM + 1)
+ "<abuf>", // autocommand buffer number
+#define SPEC_ABUF (SPEC_AFILE + 1)
+ "<amatch>", // autocommand match name
+#define SPEC_AMATCH (SPEC_ABUF + 1)
};
for (size_t i = 0; i < ARRAY_SIZE(spec_str); ++i) {
@@ -8128,9 +8534,9 @@ eval_vars (
char_u *resultbuf = NULL;
size_t resultlen;
buf_T *buf;
- int valid = VALID_HEAD + VALID_PATH; /* assume valid result */
- int skip_mod = FALSE;
- char_u strbuf[30];
+ int valid = VALID_HEAD | VALID_PATH; // Assume valid result.
+ int skip_mod = false;
+ char strbuf[30];
*errormsg = NULL;
if (escaped != NULL)
@@ -8158,10 +8564,16 @@ eval_vars (
/*
* word or WORD under cursor
*/
- if (spec_idx == SPEC_CWORD || spec_idx == SPEC_CCWORD) {
- resultlen = find_ident_under_cursor(&result, (spec_idx == SPEC_CWORD
- ? (FIND_IDENT|FIND_STRING)
- : FIND_STRING));
+ if (spec_idx == SPEC_CWORD
+ || spec_idx == SPEC_CCWORD
+ || spec_idx == SPEC_CEXPR) {
+ resultlen = find_ident_under_cursor(
+ &result,
+ spec_idx == SPEC_CWORD
+ ? (FIND_IDENT | FIND_STRING)
+ : (spec_idx == SPEC_CEXPR
+ ? (FIND_IDENT | FIND_STRING | FIND_EVAL)
+ : FIND_STRING));
if (resultlen == 0) {
*errormsg = (char_u *)"";
return NULL;
@@ -8198,21 +8610,28 @@ eval_vars (
if (*s == '<') /* "#<99" uses v:oldfiles */
++s;
i = getdigits_int(&s);
- *usedlen = (size_t)(s - src); /* length of what we expand */
+ if (s == src + 2 && src[1] == '-') {
+ // just a minus sign, don't skip over it
+ s--;
+ }
+ *usedlen = (size_t)(s - src); // length of what we expand
- if (src[1] == '<') {
+ if (src[1] == '<' && i != 0) {
if (*usedlen < 2) {
/* Should we give an error message for #<text? */
*usedlen = 1;
return NULL;
}
- result = list_find_str(get_vim_var_list(VV_OLDFILES),
- (long)i);
+ result = (char_u *)tv_list_find_str(get_vim_var_list(VV_OLDFILES),
+ i - 1);
if (result == NULL) {
*errormsg = (char_u *)"";
return NULL;
}
} else {
+ if (i == 0 && src[1] == '<' && *usedlen > 1) {
+ *usedlen = 1;
+ }
buf = buflist_findnr(i);
if (buf == NULL) {
*errormsg = (char_u *)_(
@@ -8238,22 +8657,25 @@ eval_vars (
resultbuf = result; /* remember allocated string */
break;
- case SPEC_AFILE: /* file name for autocommand */
- result = autocmd_fname;
- if (result != NULL && !autocmd_fname_full) {
- /* Still need to turn the fname into a full path. It is
- * postponed to avoid a delay when <afile> is not used. */
- autocmd_fname_full = TRUE;
- result = (char_u *)FullName_save((char *)autocmd_fname, FALSE);
- xfree(autocmd_fname);
- autocmd_fname = result;
+ case SPEC_AFILE: // file name for autocommand
+ if (autocmd_fname != NULL
+ && !path_is_absolute(autocmd_fname)
+ // For CmdlineEnter and related events, <afile> is not a path! #9348
+ && !strequal("/", (char *)autocmd_fname)) {
+ // Still need to turn the fname into a full path. It was
+ // postponed to avoid a delay when <afile> is not used.
+ result = (char_u *)FullName_save((char *)autocmd_fname, false);
+ // Copy into `autocmd_fname`, don't reassign it. #8165
+ xstrlcpy((char *)autocmd_fname, (char *)result, MAXPATHL);
+ xfree(result);
}
+ result = autocmd_fname;
if (result == NULL) {
*errormsg = (char_u *)_(
"E495: no autocommand file name to substitute for \"<afile>\"");
return NULL;
}
- result = path_shorten_fname_if_possible(result);
+ result = path_try_shorten_fname(result);
break;
case SPEC_ABUF: /* buffer number for autocommand */
@@ -8262,8 +8684,8 @@ eval_vars (
"E496: no autocommand buffer number to substitute for \"<abuf>\"");
return NULL;
}
- sprintf((char *)strbuf, "%d", autocmd_bufnr);
- result = strbuf;
+ snprintf(strbuf, sizeof(strbuf), "%d", autocmd_bufnr);
+ result = (char_u *)strbuf;
break;
case SPEC_AMATCH: /* match name for autocommand */
@@ -8288,20 +8710,24 @@ eval_vars (
*errormsg = (char_u *)_("E842: no line number to use for \"<slnum>\"");
return NULL;
}
- sprintf((char *)strbuf, "%" PRId64, (int64_t)sourcing_lnum);
- result = strbuf;
+ snprintf(strbuf, sizeof(strbuf), "%" PRIdLINENR, sourcing_lnum);
+ result = (char_u *)strbuf;
break;
default:
// should not happen
*errormsg = (char_u *)"";
- return NULL;
+ result = (char_u *)""; // avoid gcc warning
+ break;
}
- resultlen = STRLEN(result); /* length of new string */
- if (src[*usedlen] == '<') { /* remove the file name extension */
- ++*usedlen;
- if ((s = vim_strrchr(result, '.')) != NULL && s >= path_tail(result))
+ // Length of new string.
+ resultlen = STRLEN(result);
+ // Remove the file name extension.
+ if (src[*usedlen] == '<') {
+ (*usedlen)++;
+ if ((s = STRRCHR(result, '.')) != NULL && s >= path_tail(result)) {
resultlen = (size_t)(s - result);
+ }
} else if (!skip_mod) {
valid |= modify_fname(src, usedlen, &result, &resultbuf, &resultlen);
if (result == NULL) {
@@ -8360,7 +8786,7 @@ static char_u *arg_all(void)
#ifndef BACKSLASH_IN_FILENAME
|| *p == '\\'
#endif
- ) {
+ || *p == '`') {
// insert a backslash
if (retval != NULL) {
retval[len] = '\\';
@@ -8441,8 +8867,8 @@ char_u *expand_sfile(char_u *arg)
* Write openfile commands for the current buffers to an .exrc file.
* Return FAIL on error, OK otherwise.
*/
-static int
-makeopens (
+static int
+makeopens(
FILE *fd,
char_u *dirnow /* Current directory name */
)
@@ -8462,15 +8888,15 @@ makeopens (
if (ssop_flags & SSOP_BUFFERS)
only_save_windows = FALSE; /* Save ALL buffers */
- /*
- * Begin by setting the this_session variable, and then other
- * sessionable variables.
- */
- if (put_line(fd, "let v:this_session=expand(\"<sfile>:p\")") == FAIL)
+ // Begin by setting v:this_session, and then other sessionable variables.
+ if (put_line(fd, "let v:this_session=expand(\"<sfile>:p\")") == FAIL) {
return FAIL;
- if (ssop_flags & SSOP_GLOBALS)
- if (store_session_globals(fd) == FAIL)
+ }
+ if (ssop_flags & SSOP_GLOBALS) {
+ if (store_session_globals(fd) == FAIL) {
return FAIL;
+ }
+ }
/*
* Close all windows but one.
@@ -8523,11 +8949,12 @@ makeopens (
&& buf->b_fname != NULL
&& buf->b_p_bl) {
if (fprintf(fd, "badd +%" PRId64 " ",
- buf->b_wininfo == NULL ?
- (int64_t)1L :
- (int64_t)buf->b_wininfo->wi_fpos.lnum) < 0
- || ses_fname(fd, buf, &ssop_flags) == FAIL)
+ buf->b_wininfo == NULL
+ ? (int64_t)1L
+ : (int64_t)buf->b_wininfo->wi_fpos.lnum) < 0
+ || ses_fname(fd, buf, &ssop_flags, true) == FAIL) {
return FAIL;
+ }
}
}
@@ -8565,15 +8992,16 @@ makeopens (
*/
tab_firstwin = firstwin; /* first window in tab page "tabnr" */
tab_topframe = topframe;
- for (tabnr = 1;; ++tabnr) {
+ for (tabnr = 1;; tabnr++) {
+ tabpage_T *tp = find_tabpage(tabnr);
+ if (tp == NULL) {
+ break; // done all tab pages
+ }
+
int need_tabnew = false;
int cnr = 1;
if ((ssop_flags & SSOP_TABPAGES)) {
- tabpage_T *tp = find_tabpage(tabnr);
-
- if (tp == NULL)
- break; /* done all tab pages */
if (tp == curtab) {
tab_firstwin = firstwin;
tab_topframe = topframe;
@@ -8597,11 +9025,13 @@ makeopens (
&& !bt_nofile(wp->w_buffer)
) {
if (fputs(need_tabnew ? "tabedit " : "edit ", fd) < 0
- || ses_fname(fd, wp->w_buffer, &ssop_flags) == FAIL)
+ || ses_fname(fd, wp->w_buffer, &ssop_flags, true) == FAIL) {
return FAIL;
- need_tabnew = FALSE;
- if (!wp->w_arg_idx_invalid)
+ }
+ need_tabnew = false;
+ if (!wp->w_arg_idx_invalid) {
edited_win = wp;
+ }
break;
}
}
@@ -8640,17 +9070,22 @@ makeopens (
if (put_line(fd, "wincmd t") == FAIL)
return FAIL;
- /*
- * If more than one window, see if sizes can be restored.
- * First set 'winheight' and 'winwidth' to 1 to avoid the windows being
- * resized when moving between windows.
- * Do this before restoring the view, so that the topline and the
- * cursor can be set. This is done again below.
- */
- if (put_line(fd, "set winheight=1 winwidth=1") == FAIL)
+ // If more than one window, see if sizes can be restored.
+ // First set 'winheight' and 'winwidth' to 1 to avoid the windows being
+ // resized when moving between windows.
+ // Do this before restoring the view, so that the topline and the
+ // cursor can be set. This is done again below.
+ // winminheight and winminwidth need to be set to avoid an error if the
+ // user has set winheight or winwidth.
+ if (put_line(fd, "set winminheight=0") == FAIL
+ || put_line(fd, "set winheight=1") == FAIL
+ || put_line(fd, "set winminwidth=0") == FAIL
+ || put_line(fd, "set winwidth=1") == FAIL) {
return FAIL;
- if (nr > 1 && ses_winsizes(fd, restore_size, tab_firstwin) == FAIL)
+ }
+ if (nr > 1 && ses_winsizes(fd, restore_size, tab_firstwin) == FAIL) {
return FAIL;
+ }
/*
* Restore the view of the window (options, file, cursor, etc.).
@@ -8685,6 +9120,16 @@ makeopens (
if (nr > 1 && ses_winsizes(fd, restore_size, tab_firstwin) == FAIL)
return FAIL;
+ // Take care of tab-local working directories if applicable
+ if (tp->tp_localdir) {
+ if (fputs("if has('nvim') | tcd ", fd) < 0
+ || ses_put_fname(fd, tp->tp_localdir, &ssop_flags) == FAIL
+ || fputs(" | endif", fd) < 0
+ || put_eol(fd) == FAIL) {
+ return FAIL;
+ }
+ }
+
/* Don't continue in another tab page when doing only the current one
* or when at the last tab page. */
if (!(ssop_flags & SSOP_TABPAGES))
@@ -8714,11 +9159,18 @@ makeopens (
if (put_line(fd, "unlet! s:wipebuf") == FAIL)
return FAIL;
- /* Re-apply 'winheight', 'winwidth' and 'shortmess'. */
- if (fprintf(fd, "set winheight=%" PRId64 " winwidth=%" PRId64 " shortmess=%s",
- (int64_t)p_wh, (int64_t)p_wiw, p_shm) < 0
- || put_eol(fd) == FAIL)
+ // Re-apply options.
+ if (fprintf(fd, "set winheight=%" PRId64 " winwidth=%" PRId64
+ " winminheight=%" PRId64 " winminwidth=%" PRId64
+ " shortmess=%s",
+ (int64_t)p_wh,
+ (int64_t)p_wiw,
+ (int64_t)p_wmh,
+ (int64_t)p_wmw,
+ p_shm) < 0
+ || put_eol(fd) == FAIL) {
return FAIL;
+ }
/*
* Lastly, execute the x.vim file if it exists.
@@ -8746,10 +9198,10 @@ static int ses_winsizes(FILE *fd, int restore_size, win_T *tab_firstwin)
/* restore height when not full height */
if (wp->w_height + wp->w_status_height < topframe->fr_height
&& (fprintf(fd,
- "exe '%dresize ' . ((&lines * %" PRId64
- " + %" PRId64 ") / %" PRId64 ")",
- n, (int64_t)wp->w_height,
- (int64_t)(Rows / 2), (int64_t)Rows) < 0
+ "exe '%dresize ' . ((&lines * %" PRId64
+ " + %" PRId64 ") / %" PRId64 ")",
+ n, (int64_t)wp->w_grid.Rows,
+ (int64_t)(Rows / 2), (int64_t)Rows) < 0
|| put_eol(fd) == FAIL))
return FAIL;
@@ -8860,12 +9312,24 @@ static int ses_do_win(win_T *wp)
return true;
}
+static int put_view_curpos(FILE *fd, const win_T *wp, char *spaces)
+{
+ int r;
+
+ if (wp->w_curswant == MAXCOL) {
+ r = fprintf(fd, "%snormal! $", spaces);
+ } else {
+ r = fprintf(fd, "%snormal! 0%d|", spaces, wp->w_virtcol + 1);
+ }
+ return r < 0 || put_eol(fd) == FAIL ? FAIL : OK;
+}
+
/*
* Write commands to "fd" to restore the view of a window.
* Caller must make sure 'scrolloff' is zero.
*/
-static int
-put_view (
+static int
+put_view(
FILE *fd,
win_T *wp,
int add_edit, /* add ":edit" command to view */
@@ -8915,24 +9379,35 @@ put_view (
if (wp->w_buffer->b_ffname != NULL
&& (!bt_nofile(wp->w_buffer) || wp->w_buffer->terminal)
) {
- /*
- * Editing a file in this buffer: use ":edit file".
- * This may have side effects! (e.g., compressed or network file).
- */
- if (fputs("edit ", fd) < 0
- || ses_fname(fd, wp->w_buffer, flagp) == FAIL)
+ // Editing a file in this buffer: use ":edit file".
+ // This may have side effects! (e.g., compressed or network file).
+ //
+ // Note, if a buffer for that file already exists, use :badd to
+ // edit that buffer, to not lose folding information (:edit resets
+ // folds in other buffers)
+ if (fputs("if bufexists('", fd) < 0
+ || ses_fname(fd, wp->w_buffer, flagp, false) == FAIL
+ || fputs("') | buffer ", fd) < 0
+ || ses_fname(fd, wp->w_buffer, flagp, false) == FAIL
+ || fputs(" | else | edit ", fd) < 0
+ || ses_fname(fd, wp->w_buffer, flagp, false) == FAIL
+ || fputs(" | endif", fd) < 0
+ || put_eol(fd) == FAIL) {
return FAIL;
+ }
} else {
- /* No file in this buffer, just make it empty. */
- if (put_line(fd, "enew") == FAIL)
+ // No file in this buffer, just make it empty.
+ if (put_line(fd, "enew") == FAIL) {
return FAIL;
+ }
if (wp->w_buffer->b_ffname != NULL) {
- /* The buffer does have a name, but it's not a file name. */
+ // The buffer does have a name, but it's not a file name.
if (fputs("file ", fd) < 0
- || ses_fname(fd, wp->w_buffer, flagp) == FAIL)
+ || ses_fname(fd, wp->w_buffer, flagp, true) == FAIL) {
return FAIL;
+ }
}
- do_cursor = FALSE;
+ do_cursor = false;
}
}
@@ -8988,8 +9463,8 @@ put_view (
" * winheight(0) + %" PRId64 ") / %" PRId64 ")",
(int64_t)wp->w_cursor.lnum,
(int64_t)(wp->w_cursor.lnum - wp->w_topline),
- (int64_t)(wp->w_height / 2),
- (int64_t)wp->w_height) < 0
+ (int64_t)(wp->w_grid.Rows / 2),
+ (int64_t)wp->w_grid.Rows) < 0
|| put_eol(fd) == FAIL
|| put_line(fd, "if s:l < 1 | let s:l = 1 | endif") == FAIL
|| put_line(fd, "exe s:l") == FAIL
@@ -9015,27 +9490,27 @@ put_view (
(int64_t)(wp->w_virtcol + 1)) < 0
|| put_eol(fd) == FAIL
|| put_line(fd, "else") == FAIL
- || fprintf(fd, " normal! 0%d|", wp->w_virtcol + 1) < 0
- || put_eol(fd) == FAIL
+ || put_view_curpos(fd, wp, " ") == FAIL
|| put_line(fd, "endif") == FAIL)
return FAIL;
- } else {
- if (fprintf(fd, "normal! 0%d|", wp->w_virtcol + 1) < 0
- || put_eol(fd) == FAIL)
- return FAIL;
+ } else if (put_view_curpos(fd, wp, "") == FAIL) {
+ return FAIL;
}
}
}
- /*
- * Local directory.
- */
- if (wp->w_localdir != NULL) {
+ //
+ // Local directory, if the current flag is not view options or the "curdir"
+ // option is included.
+ //
+ if (wp->w_localdir != NULL
+ && (flagp != &vop_flags || (*flagp & SSOP_CURDIR))) {
if (fputs("lcd ", fd) < 0
|| ses_put_fname(fd, wp->w_localdir, flagp) == FAIL
- || put_eol(fd) == FAIL)
+ || put_eol(fd) == FAIL) {
return FAIL;
- did_lcd = TRUE;
+ }
+ did_lcd = true;
}
return OK;
@@ -9045,8 +9520,8 @@ put_view (
* Write an argument list to the session file.
* Returns FAIL if writing fails.
*/
-static int
-ses_arglist (
+static int
+ses_arglist(
FILE *fd,
char *cmd,
garray_T *gap,
@@ -9072,7 +9547,7 @@ ses_arglist (
(void)vim_FullName((char *)s, (char *)buf, MAXPATHL, FALSE);
s = buf;
}
- if (fputs("argadd ", fd) < 0 || ses_put_fname(fd, s, flagp) == FAIL
+ if (fputs("$argadd ", fd) < 0 || ses_put_fname(fd, s, flagp) == FAIL
|| put_eol(fd) == FAIL) {
xfree(buf);
return FAIL;
@@ -9083,12 +9558,10 @@ ses_arglist (
return OK;
}
-/*
- * Write a buffer name to the session file.
- * Also ends the line.
- * Returns FAIL if writing fails.
- */
-static int ses_fname(FILE *fd, buf_T *buf, unsigned *flagp)
+/// Write a buffer name to the session file.
+/// Also ends the line, if "add_eol" is true.
+/// Returns FAIL if writing fails.
+static int ses_fname(FILE *fd, buf_T *buf, unsigned *flagp, bool add_eol)
{
char_u *name;
@@ -9105,8 +9578,10 @@ static int ses_fname(FILE *fd, buf_T *buf, unsigned *flagp)
name = buf->b_sfname;
else
name = buf->b_ffname;
- if (ses_put_fname(fd, name, flagp) == FAIL || put_eol(fd) == FAIL)
+ if (ses_put_fname(fd, name, flagp) == FAIL
+ || (add_eol && put_eol(fd) == FAIL)) {
return FAIL;
+ }
return OK;
}
@@ -9123,14 +9598,16 @@ static int ses_put_fname(FILE *fd, char_u *name, unsigned *flagp)
char_u *sname = home_replace_save(NULL, name);
if (*flagp & SSOP_SLASH) {
- /* change all backslashes to forward slashes */
- for (p = sname; *p != NUL; mb_ptr_adv(p))
- if (*p == '\\')
+ // change all backslashes to forward slashes
+ for (p = sname; *p != NUL; MB_PTR_ADV(p)) {
+ if (*p == '\\') {
*p = '/';
+ }
+ }
}
- /* escape special characters */
- p = vim_strsave_fnameescape(sname, FALSE);
+ // Escape special characters.
+ p = (char_u *)vim_strsave_fnameescape((const char *)sname, false);
xfree(sname);
/* write the result */
@@ -9265,18 +9742,18 @@ void dialog_msg(char_u *buff, char *format, char_u *fname)
static void ex_behave(exarg_T *eap)
{
if (STRCMP(eap->arg, "mswin") == 0) {
- set_option_value((char_u *)"selection", 0L, (char_u *)"exclusive", 0);
- set_option_value((char_u *)"selectmode", 0L, (char_u *)"mouse,key", 0);
- set_option_value((char_u *)"mousemodel", 0L, (char_u *)"popup", 0);
- set_option_value((char_u *)"keymodel", 0L,
- (char_u *)"startsel,stopsel", 0);
+ set_option_value("selection", 0L, "exclusive", 0);
+ set_option_value("selectmode", 0L, "mouse,key", 0);
+ set_option_value("mousemodel", 0L, "popup", 0);
+ set_option_value("keymodel", 0L, "startsel,stopsel", 0);
} else if (STRCMP(eap->arg, "xterm") == 0) {
- set_option_value((char_u *)"selection", 0L, (char_u *)"inclusive", 0);
- set_option_value((char_u *)"selectmode", 0L, (char_u *)"", 0);
- set_option_value((char_u *)"mousemodel", 0L, (char_u *)"extend", 0);
- set_option_value((char_u *)"keymodel", 0L, (char_u *)"", 0);
- } else
+ set_option_value("selection", 0L, "inclusive", 0);
+ set_option_value("selectmode", 0L, "", 0);
+ set_option_value("mousemodel", 0L, "extend", 0);
+ set_option_value("keymodel", 0L, "", 0);
+ } else {
EMSG2(_(e_invarg2), eap->arg);
+ }
}
/*
@@ -9292,6 +9769,24 @@ char_u *get_behave_arg(expand_T *xp, int idx)
return NULL;
}
+// Function given to ExpandGeneric() to obtain the possible arguments of the
+// ":messages {clear}" command.
+char_u *get_messages_arg(expand_T *xp FUNC_ATTR_UNUSED, int idx)
+{
+ if (idx == 0) {
+ return (char_u *)"clear";
+ }
+ return NULL;
+}
+
+char_u *get_mapclear_arg(expand_T *xp FUNC_ATTR_UNUSED, int idx)
+{
+ if (idx == 0) {
+ return (char_u *)"<buffer>";
+ }
+ return NULL;
+}
+
static TriState filetype_detect = kNone;
static TriState filetype_plugin = kNone;
static TriState filetype_indent = kNone;
@@ -9348,7 +9843,7 @@ static void ex_filetype(exarg_T *eap)
}
}
if (*arg == 'd') {
- (void)do_doautocmd((char_u *)"filetypedetect BufRead", TRUE);
+ (void)do_doautocmd((char_u *)"filetypedetect BufRead", true, NULL);
do_modelines(0);
}
} else if (STRCMP(arg, "off") == 0) {
@@ -9369,29 +9864,38 @@ static void ex_filetype(exarg_T *eap)
EMSG2(_(e_invarg2), arg);
}
-/// Do ":filetype plugin indent on" if user did not already do some
-/// permutation thereof.
+/// Set all :filetype options ON if user did not explicitly set any to OFF.
void filetype_maybe_enable(void)
{
- if (filetype_detect == kNone
- && filetype_plugin == kNone
- && filetype_indent == kNone) {
+ if (filetype_detect == kNone) {
source_runtime((char_u *)FILETYPE_FILE, true);
filetype_detect = kTrue;
+ }
+ if (filetype_plugin == kNone) {
source_runtime((char_u *)FTPLUGIN_FILE, true);
filetype_plugin = kTrue;
+ }
+ if (filetype_indent == kNone) {
source_runtime((char_u *)INDENT_FILE, true);
filetype_indent = kTrue;
}
}
-/*
- * ":setfiletype {name}"
- */
+/// ":setfiletype [FALLBACK] {name}"
static void ex_setfiletype(exarg_T *eap)
{
- if (!did_filetype)
- set_option_value((char_u *)"filetype", 0L, eap->arg, OPT_LOCAL);
+ if (!did_filetype) {
+ char_u *arg = eap->arg;
+
+ if (STRNCMP(arg, "FALLBACK ", 9) == 0) {
+ arg += 9;
+ }
+
+ set_option_value("filetype", 0L, (char *)arg, OPT_LOCAL);
+ if (arg != eap->arg) {
+ did_filetype = false;
+ }
+ }
}
static void ex_digraphs(exarg_T *eap)
@@ -9477,7 +9981,8 @@ static void ex_match(exarg_T *eap)
c = *end;
*end = NUL;
- match_add(curwin, g, p + 1, 10, id, NULL, NULL);
+ match_add(curwin, (const char *)g, (const char *)p + 1, 10, id,
+ NULL, NULL);
xfree(g);
*end = c;
}
@@ -9499,42 +10004,171 @@ static void ex_foldopen(exarg_T *eap)
static void ex_folddo(exarg_T *eap)
{
- linenr_T lnum;
-
- start_global_changes();
-
- /* First set the marks for all lines closed/open. */
- for (lnum = eap->line1; lnum <= eap->line2; ++lnum)
- if (hasFolding(lnum, NULL, NULL) == (eap->cmdidx == CMD_folddoclosed))
+ // First set the marks for all lines closed/open.
+ for (linenr_T lnum = eap->line1; lnum <= eap->line2; ++lnum) {
+ if (hasFolding(lnum, NULL, NULL) == (eap->cmdidx == CMD_folddoclosed)) {
ml_setmarked(lnum);
+ }
+ }
- /* Execute the command on the marked lines. */
- global_exe(eap->arg);
- ml_clearmarked(); /* clear rest of the marks */
-
- end_global_changes();
+ global_exe(eap->arg); // Execute the command on the marked lines.
+ ml_clearmarked(); // clear rest of the marks
}
static void ex_terminal(exarg_T *eap)
{
- char *name = (char *)p_sh; // Default to 'shell' if {cmd} is not given.
- bool mustfree = false;
- char *lquote = "['";
- char *rquote = "']";
+ char ex_cmd[1024];
+
+ if (*eap->arg != NUL) { // Run {cmd} in 'shell'.
+ char *name = (char *)vim_strsave_escaped(eap->arg, (char_u *)"\"\\");
+ snprintf(ex_cmd, sizeof(ex_cmd),
+ ":enew%s | call termopen(\"%s\")",
+ eap->forceit ? "!" : "", name);
+ xfree(name);
+ } else { // No {cmd}: run the job with tokenized 'shell'.
+ if (*p_sh == NUL) {
+ EMSG(_(e_shellempty));
+ return;
+ }
+
+ char **argv = shell_build_argv(NULL, NULL);
+ char **p = argv;
+ char tempstring[512];
+ char shell_argv[512] = { 0 };
+
+ while (*p != NULL) {
+ snprintf(tempstring, sizeof(tempstring), ",\"%s\"", *p);
+ xstrlcat(shell_argv, tempstring, sizeof(shell_argv));
+ p++;
+ }
+ shell_free_argv(argv);
- if (*eap->arg != NUL) {
- name = (char *)vim_strsave_escaped(eap->arg, (char_u *)"\"\\");
- mustfree = true;
- lquote = rquote = "\"";
+ snprintf(ex_cmd, sizeof(ex_cmd),
+ ":enew%s | call termopen([%s])",
+ eap->forceit ? "!" : "", shell_argv + 1);
}
- char ex_cmd[512];
- snprintf(ex_cmd, sizeof(ex_cmd),
- ":enew%s | call termopen(%s%s%s) | startinsert",
- eap->forceit==TRUE ? "!" : "", lquote, name, rquote);
do_cmdline_cmd(ex_cmd);
+}
- if (mustfree) {
- xfree(name);
+/// Checks if `cmd` is "previewable" (i.e. supported by 'inccommand').
+///
+/// @param[in] cmd Commandline to check. May start with a range or modifier.
+///
+/// @return true if `cmd` is previewable
+bool cmd_can_preview(char_u *cmd)
+{
+ if (cmd == NULL) {
+ return false;
+ }
+
+ // Ignore any leading modifiers (:keeppatterns, :verbose, etc.)
+ for (int len = modifier_len(cmd); len != 0; len = modifier_len(cmd)) {
+ cmd += len;
+ cmd = skipwhite(cmd);
+ }
+
+ exarg_T ea;
+ memset(&ea, 0, sizeof(ea));
+ // parse the command line
+ ea.cmd = skip_range(cmd, NULL);
+ if (*ea.cmd == '*') {
+ ea.cmd = skipwhite(ea.cmd + 1);
+ }
+ char_u *end = find_command(&ea, NULL);
+
+ switch (ea.cmdidx) {
+ case CMD_substitute:
+ case CMD_smagic:
+ case CMD_snomagic:
+ // Only preview once the pattern delimiter has been typed
+ if (*end && !ASCII_ISALNUM(*end)) {
+ return true;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return false;
+}
+
+/// Gets a map of maps describing user-commands defined for buffer `buf` or
+/// defined globally if `buf` is NULL.
+///
+/// @param buf Buffer to inspect, or NULL to get global commands.
+///
+/// @return Map of maps describing commands
+Dictionary commands_array(buf_T *buf)
+{
+ Dictionary rv = ARRAY_DICT_INIT;
+ Object obj = NIL;
+ (void)obj; // Avoid "dead assignment" warning.
+ char str[10];
+ garray_T *gap = (buf == NULL) ? &ucmds : &buf->b_ucmds;
+
+ for (int i = 0; i < gap->ga_len; i++) {
+ char arg[2] = { 0, 0 };
+ Dictionary d = ARRAY_DICT_INIT;
+ ucmd_T *cmd = USER_CMD_GA(gap, i);
+
+ PUT(d, "name", STRING_OBJ(cstr_to_string((char *)cmd->uc_name)));
+ PUT(d, "definition", STRING_OBJ(cstr_to_string((char *)cmd->uc_rep)));
+ PUT(d, "script_id", INTEGER_OBJ(cmd->uc_scriptID));
+ PUT(d, "bang", BOOLEAN_OBJ(!!(cmd->uc_argt & BANG)));
+ PUT(d, "bar", BOOLEAN_OBJ(!!(cmd->uc_argt & TRLBAR)));
+ PUT(d, "register", BOOLEAN_OBJ(!!(cmd->uc_argt & REGSTR)));
+
+ switch (cmd->uc_argt & (EXTRA|NOSPC|NEEDARG)) {
+ case 0: arg[0] = '0'; break;
+ case(EXTRA): arg[0] = '*'; break;
+ case(EXTRA|NOSPC): arg[0] = '?'; break;
+ case(EXTRA|NEEDARG): arg[0] = '+'; break;
+ case(EXTRA|NOSPC|NEEDARG): arg[0] = '1'; break;
+ }
+ PUT(d, "nargs", STRING_OBJ(cstr_to_string(arg)));
+
+ char *cmd_compl = get_command_complete(cmd->uc_compl);
+ PUT(d, "complete", (cmd_compl == NULL
+ ? NIL : STRING_OBJ(cstr_to_string(cmd_compl))));
+ PUT(d, "complete_arg", cmd->uc_compl_arg == NULL
+ ? NIL : STRING_OBJ(cstr_to_string((char *)cmd->uc_compl_arg)));
+
+ obj = NIL;
+ if (cmd->uc_argt & COUNT) {
+ if (cmd->uc_def >= 0) {
+ snprintf(str, sizeof(str), "%" PRId64, (int64_t)cmd->uc_def);
+ obj = STRING_OBJ(cstr_to_string(str)); // -count=N
+ } else {
+ obj = STRING_OBJ(cstr_to_string("0")); // -count
+ }
+ }
+ PUT(d, "count", obj);
+
+ obj = NIL;
+ if (cmd->uc_argt & RANGE) {
+ if (cmd->uc_argt & DFLALL) {
+ obj = STRING_OBJ(cstr_to_string("%")); // -range=%
+ } else if (cmd->uc_def >= 0) {
+ snprintf(str, sizeof(str), "%" PRId64, (int64_t)cmd->uc_def);
+ obj = STRING_OBJ(cstr_to_string(str)); // -range=N
+ } else {
+ obj = STRING_OBJ(cstr_to_string(".")); // -range
+ }
+ }
+ PUT(d, "range", obj);
+
+ obj = NIL;
+ for (int j = 0; addr_type_complete[j].expand != -1; j++) {
+ if (addr_type_complete[j].expand != ADDR_LINES
+ && addr_type_complete[j].expand == cmd->uc_addr_type) {
+ obj = STRING_OBJ(cstr_to_string(addr_type_complete[j].name));
+ break;
+ }
+ }
+ PUT(d, "addr", obj);
+
+ PUT(rv, (char *)cmd->uc_name, DICTIONARY_OBJ(d));
}
+ return rv;
}
diff --git a/src/nvim/ex_docmd.h b/src/nvim/ex_docmd.h
index bafad20169..cff350de08 100644
--- a/src/nvim/ex_docmd.h
+++ b/src/nvim/ex_docmd.h
@@ -2,14 +2,15 @@
#define NVIM_EX_DOCMD_H
#include "nvim/ex_cmds_defs.h"
+#include "nvim/globals.h"
-/* flags for do_cmdline() */
-#define DOCMD_VERBOSE 0x01 /* included command in error message */
-#define DOCMD_NOWAIT 0x02 /* don't call wait_return() and friends */
-#define DOCMD_REPEAT 0x04 /* repeat exec. until getline() returns NULL */
-#define DOCMD_KEYTYPED 0x08 /* don't reset KeyTyped */
-#define DOCMD_EXCRESET 0x10 /* reset exception environment (for debugging)*/
-#define DOCMD_KEEPLINE 0x20 /* keep typed line for repeating with "." */
+// flags for do_cmdline()
+#define DOCMD_VERBOSE 0x01 // included command in error message
+#define DOCMD_NOWAIT 0x02 // don't call wait_return() and friends
+#define DOCMD_REPEAT 0x04 // repeat exec. until getline() returns NULL
+#define DOCMD_KEYTYPED 0x08 // don't reset KeyTyped
+#define DOCMD_EXCRESET 0x10 // reset exception environment (for debugging
+#define DOCMD_KEEPLINE 0x20 // keep typed line for repeating with "."
/* defines for eval_vars() */
#define VALID_PATH 1
@@ -19,21 +20,6 @@
#define EXMODE_NORMAL 1
#define EXMODE_VIM 2
-/// The scope of a working-directory command like `:cd`.
-///
-/// Scopes are enumerated from lowest to highest. When adding a scope make sure
-/// to update all functions using scopes as well, such as the implementation of
-/// `getcwd()`. When using scopes as limits (e.g. in loops) don't use the scopes
-/// directly, use `MIN_CD_SCOPE` and `MAX_CD_SCOPE` instead.
-typedef enum {
- kCdScopeInvalid = -1,
- kCdScopeWindow, ///< Affects one window.
- kCdScopeTab, ///< Affects one tab page.
- kCdScopeGlobal, ///< Affects the entire instance of Neovim.
-} CdScope;
-#define MIN_CD_SCOPE kCdScopeWindow
-#define MAX_CD_SCOPE kCdScopeGlobal
-
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "ex_docmd.h.generated.h"
#endif
diff --git a/src/nvim/ex_eval.c b/src/nvim/ex_eval.c
index 82d4c2b2d5..7f7851f078 100644
--- a/src/nvim/ex_eval.c
+++ b/src/nvim/ex_eval.c
@@ -1,6 +1,11 @@
-/*
- * ex_eval.c: functions for Ex command line for the +eval feature.
- */
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+// TODO(ZyX-I): move to eval/executor
+
+/// @file ex_eval.c
+///
+/// Functions for Ex command line for the +eval feature.
#include <assert.h>
#include <stdbool.h>
#include <stdint.h>
@@ -12,58 +17,65 @@
#include "nvim/ex_eval.h"
#include "nvim/charset.h"
#include "nvim/eval.h"
+#include "nvim/eval/typval.h"
#include "nvim/ex_cmds2.h"
#include "nvim/ex_docmd.h"
#include "nvim/message.h"
-#include "nvim/misc2.h"
#include "nvim/memory.h"
#include "nvim/regexp.h"
#include "nvim/strings.h"
-
-
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "ex_eval.c.generated.h"
#endif
-/*
- * Exception handling terms:
- *
- * :try ":try" command \
- * ... try block |
- * :catch RE ":catch" command |
- * ... catch clause |- try conditional
- * :finally ":finally" command |
- * ... finally clause |
- * :endtry ":endtry" command /
- *
- * The try conditional may have any number of catch clauses and at most one
- * finally clause. A ":throw" command can be inside the try block, a catch
- * clause, the finally clause, or in a function called or script sourced from
- * there or even outside the try conditional. Try conditionals may be nested.
- */
-
-/*
- * Configuration whether an exception is thrown on error or interrupt. When
- * the preprocessor macros below evaluate to FALSE, an error (did_emsg) or
- * interrupt (got_int) under an active try conditional terminates the script
- * after the non-active finally clauses of all active try conditionals have been
- * executed. Otherwise, errors and/or interrupts are converted into catchable
- * exceptions (did_throw additionally set), which terminate the script only if
- * not caught. For user exceptions, only did_throw is set. (Note: got_int can
- * be set asynchronously afterwards by a SIGINT, so did_throw && got_int is not
- * a reliant test that the exception currently being thrown is an interrupt
- * exception. Similarly, did_emsg can be set afterwards on an error in an
- * (unskipped) conditional command inside an inactive conditional, so did_throw
- * && did_emsg is not a reliant test that the exception currently being thrown
- * is an error exception.) - The macros can be defined as expressions checking
- * for a variable that is allowed to be changed during execution of a script.
- */
-/* Values used for the Vim release. */
-# define THROW_ON_ERROR TRUE
-# define THROW_ON_ERROR_TRUE
-# define THROW_ON_INTERRUPT TRUE
-# define THROW_ON_INTERRUPT_TRUE
+// Exception handling terms:
+//
+// :try ":try" command โ”€โ”
+// ... try block โ”‚
+// :catch RE ":catch" command โ”‚
+// ... catch clause โ”œโ”€ try conditional
+// :finally ":finally" command โ”‚
+// ... finally clause โ”‚
+// :endtry ":endtry" command โ”€โ”˜
+//
+// The try conditional may have any number of catch clauses and at most one
+// finally clause. A ":throw" command can be inside the try block, a catch
+// clause, the finally clause, or in a function called or script sourced from
+// there or even outside the try conditional. Try conditionals may be nested.
+
+// Configuration whether an exception is thrown on error or interrupt. When
+// the preprocessor macros below evaluate to FALSE, an error (did_emsg) or
+// interrupt (got_int) under an active try conditional terminates the script
+// after the non-active finally clauses of all active try conditionals have been
+// executed. Otherwise, errors and/or interrupts are converted into catchable
+// exceptions, which terminate the script only if not caught. For user
+// exceptions, only current_exception is set. (Note: got_int can be set
+// asynchronously afterwards by a SIGINT, so current_exception && got_int is not
+// a reliant test that the exception currently being thrown is an interrupt
+// exception. Similarly, did_emsg can be set afterwards on an error in an
+// (unskipped) conditional command inside an inactive conditional, so
+// current_exception && did_emsg is not a reliant test that the exception
+// currently being thrown is an error exception.) - The macros can be defined
+// as expressions checking for a variable that is allowed to be changed during
+// execution of a script.
+
+// Values used for the Vim release.
+#define THROW_ON_ERROR true
+#define THROW_ON_ERROR_TRUE
+#define THROW_ON_INTERRUPT true
+#define THROW_ON_INTERRUPT_TRUE
+
+// Don't do something after an error, interrupt, or throw, or when
+// there is a surrounding conditional and it was not active.
+#define CHECK_SKIP \
+ (did_emsg \
+ || got_int \
+ || current_exception \
+ || (cstack->cs_idx > 0 \
+ && !(cstack->cs_flags[cstack->cs_idx - 1] & CSF_ACTIVE)))
+
+#define discard_pending_return(p) tv_free((typval_T *)(p))
/*
* When several errors appear in a row, setting "force_abort" is delayed until
@@ -89,7 +101,7 @@ static int cause_abort = FALSE;
*/
int aborting(void)
{
- return (did_emsg && force_abort) || got_int || did_throw;
+ return (did_emsg && force_abort) || got_int || current_exception;
}
/*
@@ -173,8 +185,9 @@ int cause_errthrow(char_u *mesg, int severe, int *ignore)
* currently throwing an exception, do nothing. The message text will
* then be stored to v:errmsg by emsg() without displaying it.
*/
- if (((trylevel == 0 && !cause_abort) || emsg_silent) && !did_throw)
- return FALSE;
+ if (((trylevel == 0 && !cause_abort) || emsg_silent) && !current_exception) {
+ return false;
+ }
/*
* Ignore an interrupt message when inside a try conditional or when an
@@ -203,12 +216,13 @@ int cause_errthrow(char_u *mesg, int severe, int *ignore)
* exception currently being thrown to prevent it from being caught. Just
* execute finally clauses and terminate.
*/
- if (did_throw) {
- /* When discarding an interrupt exception, reset got_int to prevent the
- * same interrupt being converted to an exception again and discarding
- * the error exception we are about to throw here. */
- if (current_exception->type == ET_INTERRUPT)
- got_int = FALSE;
+ if (current_exception) {
+ // When discarding an interrupt exception, reset got_int to prevent the
+ // same interrupt being converted to an exception again and discarding
+ // the error exception we are about to throw here.
+ if (current_exception->type == ET_INTERRUPT) {
+ got_int = false;
+ }
discard_current_exception();
}
@@ -328,51 +342,49 @@ void do_errthrow(struct condstack *cstack, char_u *cmdname)
*/
int do_intthrow(struct condstack *cstack)
{
- /*
- * If no interrupt occurred or no try conditional is active and no exception
- * is being thrown, do nothing (for compatibility of non-EH scripts).
- */
- if (!got_int || (trylevel == 0 && !did_throw))
- return FALSE;
+ // If no interrupt occurred or no try conditional is active and no exception
+ // is being thrown, do nothing (for compatibility of non-EH scripts).
+ if (!got_int || (trylevel == 0 && !current_exception)) {
+ return false;
+ }
-#ifdef THROW_TEST /* avoid warning for condition always true */
+#ifdef THROW_TEST // avoid warning for condition always true
if (!THROW_ON_INTERRUPT) {
- /*
- * The interrupt aborts everything except for executing finally clauses.
- * Discard any user or error or interrupt exception currently being
- * thrown.
- */
- if (did_throw)
+ // The interrupt aborts everything except for executing finally clauses.
+ // Discard any user or error or interrupt exception currently being
+ // thrown.
+ if (current_exception) {
discard_current_exception();
- } else
+ }
+ } else {
#endif
- {
- /*
- * Throw an interrupt exception, so that everything will be aborted
- * (except for executing finally clauses), until the interrupt exception
- * is caught; if still uncaught at the top level, the script processing
- * will be terminated then. - If an interrupt exception is already
- * being thrown, do nothing.
- *
- */
- if (did_throw) {
- if (current_exception->type == ET_INTERRUPT)
- return FALSE;
+ // Throw an interrupt exception, so that everything will be aborted
+ // (except for executing finally clauses), until the interrupt exception
+ // is caught; if still uncaught at the top level, the script processing
+ // will be terminated then. - If an interrupt exception is already
+ // being thrown, do nothing.
+
+ if (current_exception) {
+ if (current_exception->type == ET_INTERRUPT) {
+ return false;
+ }
- /* An interrupt exception replaces any user or error exception. */
+ // An interrupt exception replaces any user or error exception.
discard_current_exception();
}
- if (throw_exception("Vim:Interrupt", ET_INTERRUPT, NULL) != FAIL)
+ if (throw_exception("Vim:Interrupt", ET_INTERRUPT, NULL) != FAIL) {
do_throw(cstack);
+ }
+#ifdef THROW_TEST
}
+#endif
- return TRUE;
+ return true;
}
-/*
- * Get an exception message that is to be stored in current_exception->value.
- */
-char_u *get_exception_string(void *value, int type, char_u *cmdname, int *should_free)
+// Get an exception message that is to be stored in current_exception->value.
+char_u *get_exception_string(void *value, except_type_T type, char_u *cmdname,
+ int *should_free)
{
char_u *ret, *mesg;
char_u *p, *val;
@@ -430,13 +442,11 @@ char_u *get_exception_string(void *value, int type, char_u *cmdname, int *should
}
-/*
- * Throw a new exception. Return FAIL when out of memory or it was tried to
- * throw an illegal user exception. "value" is the exception string for a
- * user or interrupt exception, or points to a message list in case of an
- * error exception.
- */
-static int throw_exception(void *value, int type, char_u *cmdname)
+// Throw a new exception. Return FAIL when out of memory or it was tried to
+// throw an illegal user exception. "value" is the exception string for a
+// user or interrupt exception, or points to a message list in case of an
+// error exception.
+static int throw_exception(void *value, except_type_T type, char_u *cmdname)
{
except_T *excp;
int should_free;
@@ -483,7 +493,7 @@ static int throw_exception(void *value, int type, char_u *cmdname)
msg_scroll = TRUE; /* always scroll up, don't overwrite */
smsg(_("Exception thrown: %s"), excp->value);
- msg_puts((char_u *)"\n"); /* don't overwrite this either */
+ msg_puts("\n"); // don't overwrite this either
if (debug_break_level > 0 || *p_vfile == NUL)
cmdline_row = msg_row;
@@ -515,7 +525,7 @@ static void discard_exception(except_T *excp, int was_finished)
char_u *saved_IObuff;
if (excp == NULL) {
- EMSG(_(e_internal));
+ internal_error("discard_exception()");
return;
}
@@ -533,15 +543,17 @@ static void discard_exception(except_T *excp, int was_finished)
smsg(was_finished ? _("Exception finished: %s")
: _("Exception discarded: %s"),
excp->value);
- msg_puts((char_u *)"\n"); /* don't overwrite this either */
- if (debug_break_level > 0 || *p_vfile == NUL)
+ msg_puts("\n"); // don't overwrite this either
+ if (debug_break_level > 0 || *p_vfile == NUL) {
cmdline_row = msg_row;
- --no_wait_return;
- if (debug_break_level > 0)
+ }
+ no_wait_return--;
+ if (debug_break_level > 0) {
msg_silent = save_msg_silent;
- else
+ } else {
verbose_leave();
- STRCPY(IObuff, saved_IObuff);
+ }
+ xstrlcpy((char *)IObuff, (const char *)saved_IObuff, IOSIZE);
xfree(saved_IObuff);
}
if (excp->type != ET_INTERRUPT)
@@ -557,10 +569,11 @@ static void discard_exception(except_T *excp, int was_finished)
*/
void discard_current_exception(void)
{
- discard_exception(current_exception, FALSE);
+ discard_exception(current_exception, false);
+ // Note: all globals manipulated here should be saved/restored in
+ // try_enter/try_leave.
current_exception = NULL;
- did_throw = FALSE;
- need_rethrow = FALSE;
+ need_rethrow = false;
}
/*
@@ -596,7 +609,7 @@ static void catch_exception(except_T *excp)
msg_scroll = TRUE; /* always scroll up, don't overwrite */
smsg(_("Exception caught: %s"), excp->value);
- msg_puts((char_u *)"\n"); /* don't overwrite this either */
+ msg_puts("\n"); // don't overwrite this either
if (debug_break_level > 0 || *p_vfile == NUL)
cmdline_row = msg_row;
@@ -613,8 +626,9 @@ static void catch_exception(except_T *excp)
*/
static void finish_exception(except_T *excp)
{
- if (excp != caught_stack)
- EMSG(_(e_internal));
+ if (excp != caught_stack) {
+ internal_error("finish_exception()");
+ }
caught_stack = caught_stack->caught;
if (caught_stack != NULL) {
set_vim_var_string(VV_EXCEPTION, (char *) caught_stack->value, -1);
@@ -715,7 +729,7 @@ static void report_pending(int action, int pending, void *value)
++no_wait_return;
msg_scroll = TRUE; /* always scroll up, don't overwrite */
smsg(mesg, s);
- msg_puts((char_u *)"\n"); /* don't overwrite this either */
+ msg_puts("\n"); // don't overwrite this either
cmdline_row = msg_row;
--no_wait_return;
if (debug_break_level > 0)
@@ -778,7 +792,6 @@ void report_discard_pending(int pending, void *value)
*/
void ex_if(exarg_T *eap)
{
- int error;
int skip;
int result;
struct condstack *cstack = eap->cstack;
@@ -789,16 +802,9 @@ void ex_if(exarg_T *eap)
++cstack->cs_idx;
cstack->cs_flags[cstack->cs_idx] = 0;
- /*
- * Don't do something after an error, interrupt, or throw, or when there
- * is a surrounding conditional and it was not active.
- */
- skip = did_emsg || got_int || did_throw || (cstack->cs_idx > 0
- && !(cstack->cs_flags[cstack->
- cs_idx -
- 1] &
- CSF_ACTIVE));
+ skip = CHECK_SKIP;
+ bool error;
result = eval_to_bool(eap->arg, &error, &eap->nextcmd, skip);
if (!skip && !error) {
@@ -843,20 +849,11 @@ void ex_endif(exarg_T *eap)
*/
void ex_else(exarg_T *eap)
{
- int error;
int skip;
int result;
struct condstack *cstack = eap->cstack;
- /*
- * Don't do something after an error, interrupt, or throw, or when there is
- * a surrounding conditional and it was not active.
- */
- skip = did_emsg || got_int || did_throw || (cstack->cs_idx > 0
- && !(cstack->cs_flags[cstack->
- cs_idx -
- 1] &
- CSF_ACTIVE));
+ skip = CHECK_SKIP;
if (cstack->cs_idx < 0
|| (cstack->cs_flags[cstack->cs_idx]
@@ -900,6 +897,7 @@ void ex_else(exarg_T *eap)
}
if (eap->cmdidx == CMD_elseif) {
+ bool error;
result = eval_to_bool(eap->arg, &error, &eap->nextcmd, skip);
/* When throwing error exceptions, we want to throw always the first
* of several errors in a row. This is what actually happens when
@@ -924,7 +922,7 @@ void ex_else(exarg_T *eap)
*/
void ex_while(exarg_T *eap)
{
- int error;
+ bool error;
int skip;
int result;
struct condstack *cstack = eap->cstack;
@@ -945,15 +943,7 @@ void ex_while(exarg_T *eap)
cstack->cs_flags[cstack->cs_idx] =
eap->cmdidx == CMD_while ? CSF_WHILE : CSF_FOR;
- /*
- * Don't do something after an error, interrupt, or throw, or when
- * there is a surrounding conditional and it was not active.
- */
- skip = did_emsg || got_int || did_throw || (cstack->cs_idx > 0
- && !(cstack->cs_flags[cstack->
- cs_idx -
- 1] &
- CSF_ACTIVE));
+ skip = CHECK_SKIP;
if (eap->cmdidx == CMD_while) {
/*
* ":while bool-expr"
@@ -1146,23 +1136,25 @@ void ex_endwhile(exarg_T *eap)
*/
void ex_throw(exarg_T *eap)
{
- char_u *arg = eap->arg;
- char_u *value;
+ const char *arg = (const char *)eap->arg;
+ char *value;
- if (*arg != NUL && *arg != '|' && *arg != '\n')
- value = eval_to_string_skip(arg, &eap->nextcmd, eap->skip);
- else {
+ if (*arg != NUL && *arg != '|' && *arg != '\n') {
+ value = eval_to_string_skip(arg, (const char **)&eap->nextcmd,
+ (bool)eap->skip);
+ } else {
EMSG(_(e_argreq));
value = NULL;
}
- /* On error or when an exception is thrown during argument evaluation, do
- * not throw. */
+ // On error or when an exception is thrown during argument evaluation, do
+ // not throw.
if (!eap->skip && value != NULL) {
- if (throw_exception(value, ET_USER, NULL) == FAIL)
+ if (throw_exception((char_u *)value, ET_USER, NULL) == FAIL) {
xfree(value);
- else
+ } else {
do_throw(eap->cstack);
+ }
}
}
@@ -1224,8 +1216,6 @@ void do_throw(struct condstack *cstack)
cstack->cs_flags[idx] &= ~CSF_ACTIVE;
cstack->cs_exception[idx] = current_exception;
}
-
- did_throw = TRUE;
}
/*
@@ -1244,15 +1234,7 @@ void ex_try(exarg_T *eap)
cstack->cs_flags[cstack->cs_idx] = CSF_TRY;
cstack->cs_pending[cstack->cs_idx] = CSTP_NONE;
- /*
- * Don't do something after an error, interrupt, or throw, or when there
- * is a surrounding conditional and it was not active.
- */
- skip = did_emsg || got_int || did_throw || (cstack->cs_idx > 0
- && !(cstack->cs_flags[cstack->
- cs_idx -
- 1] &
- CSF_ACTIVE));
+ skip = CHECK_SKIP;
if (!skip) {
/* Set ACTIVE and TRUE. TRUE means that the corresponding ":catch"
@@ -1344,8 +1326,9 @@ void ex_catch(exarg_T *eap)
* corresponding try block never got active (because of an inactive
* surrounding conditional or after an error or interrupt or throw).
*/
- if (!did_throw || !(cstack->cs_flags[idx] & CSF_TRUE))
- skip = TRUE;
+ if (!current_exception || !(cstack->cs_flags[idx] & CSF_TRUE)) {
+ skip = true;
+ }
/*
* Check for a match only if an exception is thrown but not caught by
@@ -1404,18 +1387,23 @@ void ex_catch(exarg_T *eap)
}
if (caught) {
- /* Make this ":catch" clause active and reset did_emsg, got_int,
- * and did_throw. Put the exception on the caught stack. */
+ /* Make this ":catch" clause active and reset did_emsg and got_int.
+ * Put the exception on the caught stack. */
cstack->cs_flags[idx] |= CSF_ACTIVE | CSF_CAUGHT;
- did_emsg = got_int = did_throw = FALSE;
+ did_emsg = got_int = false;
catch_exception((except_T *)cstack->cs_exception[idx]);
/* It's mandatory that the current exception is stored in the cstack
* so that it can be discarded at the next ":catch", ":finally", or
* ":endtry" or when the catch clause is left by a ":continue",
* ":break", ":return", ":finish", error, interrupt, or another
* exception. */
- if (cstack->cs_exception[cstack->cs_idx] != current_exception)
- EMSG(_(e_internal));
+ if (cstack->cs_exception[cstack->cs_idx] != current_exception) {
+ internal_error("ex_catch()");
+ }
+ // Discarding current_exceptions happens based on what is stored in
+ // cstack->cs_exception, *all* calls to discard_current_exception() are
+ // (and must be) guarded by current_exception check.
+ current_exception = NULL;
} else {
/*
* If there is a preceding catch clause and it caught the exception,
@@ -1474,7 +1462,7 @@ void ex_finally(exarg_T *eap)
* interrupt or throw) or for a ":finally" without ":try" or a multiple
* ":finally". After every other error (did_emsg or the conditional
* errors detected above) or after an interrupt (got_int) or an
- * exception (did_throw), the finally clause must be executed.
+ * exception (current_exception), the finally clause must be executed.
*/
skip = !(cstack->cs_flags[cstack->cs_idx] & CSF_TRUE);
@@ -1501,30 +1489,31 @@ void ex_finally(exarg_T *eap)
cleanup_conditionals(cstack, CSF_TRY, FALSE);
/*
- * Make did_emsg, got_int, did_throw pending. If set, they overrule
- * a pending ":continue", ":break", ":return", or ":finish". Then
- * we have particularly to discard a pending return value (as done
+ * Make did_emsg, got_int, current_exception pending. If set, they
+ * overrule a pending ":continue", ":break", ":return", or ":finish".
+ * Then we have particularly to discard a pending return value (as done
* by the call to cleanup_conditionals() above when did_emsg or
* got_int is set). The pending values are restored by the
* ":endtry", except if there is a new error, interrupt, exception,
* ":continue", ":break", ":return", or ":finish" in the following
* finally clause. A missing ":endwhile", ":endfor" or ":endif"
- * detected here is treated as if did_emsg and did_throw had
+ * detected here is treated as if did_emsg and current_exception had
* already been set, respectively in case that the error is not
- * converted to an exception, did_throw had already been unset.
+ * converted to an exception, current_exception had already been unset.
* We must not set did_emsg here since that would suppress the
* error message.
*/
- if (pending == CSTP_ERROR || did_emsg || got_int || did_throw) {
+ if (pending == CSTP_ERROR || did_emsg || got_int || current_exception) {
if (cstack->cs_pending[cstack->cs_idx] == CSTP_RETURN) {
report_discard_pending(CSTP_RETURN,
cstack->cs_rettv[cstack->cs_idx]);
discard_pending_return(cstack->cs_rettv[cstack->cs_idx]);
}
- if (pending == CSTP_ERROR && !did_emsg)
- pending |= (THROW_ON_ERROR) ? CSTP_THROW : 0;
- else
- pending |= did_throw ? CSTP_THROW : 0;
+ if (pending == CSTP_ERROR && !did_emsg) {
+ pending |= (THROW_ON_ERROR ? CSTP_THROW : 0);
+ } else {
+ pending |= (current_exception ? CSTP_THROW : 0);
+ }
pending |= did_emsg ? CSTP_ERROR : 0;
pending |= got_int ? CSTP_INTERRUPT : 0;
assert(pending >= CHAR_MIN && pending <= CHAR_MAX);
@@ -1537,14 +1526,15 @@ void ex_finally(exarg_T *eap)
* exception. When emsg() is called for a missing ":endif" or
* a missing ":endwhile"/":endfor" detected here, the
* exception will be discarded. */
- if (did_throw && cstack->cs_exception[cstack->cs_idx]
- != current_exception)
- EMSG(_(e_internal));
+ if (current_exception
+ && cstack->cs_exception[cstack->cs_idx] != current_exception) {
+ internal_error("ex_finally()");
+ }
}
/*
* Set CSL_HAD_FINA, so do_cmdline() will reset did_emsg,
- * got_int, and did_throw and make the finally clause active.
+ * got_int, and current_exception and make the finally clause active.
* This will happen after emsg() has been called for a missing
* ":endif" or a missing ":endwhile"/":endfor" detected here, so
* that the following finally clause will be executed even then.
@@ -1579,7 +1569,7 @@ void ex_endtry(exarg_T *eap)
// made inactive by a ":continue", ":break", ":return", or ":finish" in
// the finally clause. The latter case need not be tested since then
// anything pending has already been discarded.
- skip = (did_emsg || got_int || did_throw
+ skip = (did_emsg || got_int || current_exception
|| !(cstack->cs_flags[cstack->cs_idx] & CSF_TRUE));
if (!(cstack->cs_flags[cstack->cs_idx] & CSF_TRY)) {
@@ -1596,12 +1586,13 @@ void ex_endtry(exarg_T *eap)
/*
* If an exception is being thrown, discard it to prevent it from
* being rethrown at the end of this function. It would be
- * discarded by the error message, anyway. Resets did_throw.
+ * discarded by the error message, anyway. Resets current_exception.
* This does not affect the script termination due to the error
* since "trylevel" is decremented after emsg() has been called.
*/
- if (did_throw)
+ if (current_exception) {
discard_current_exception();
+ }
} else {
idx = cstack->cs_idx;
@@ -1611,9 +1602,11 @@ void ex_endtry(exarg_T *eap)
* a finally clause, we need to rethrow it after closing the try
* conditional.
*/
- if (did_throw && (cstack->cs_flags[idx] & CSF_TRUE)
- && !(cstack->cs_flags[idx] & CSF_FINALLY))
- rethrow = TRUE;
+ if (current_exception
+ && (cstack->cs_flags[idx] & CSF_TRUE)
+ && !(cstack->cs_flags[idx] & CSF_FINALLY)) {
+ rethrow = true;
+ }
}
/* If there was no finally clause, show the user when debugging or
@@ -1634,11 +1627,12 @@ void ex_endtry(exarg_T *eap)
if (got_int) {
skip = TRUE;
(void)do_intthrow(cstack);
- /* The do_intthrow() call may have reset did_throw or
- * cstack->cs_pending[idx].*/
- rethrow = FALSE;
- if (did_throw && !(cstack->cs_flags[idx] & CSF_FINALLY))
- rethrow = TRUE;
+ // The do_intthrow() call may have reset current_exception or
+ // cstack->cs_pending[idx].
+ rethrow = false;
+ if (current_exception && !(cstack->cs_flags[idx] & CSF_FINALLY)) {
+ rethrow = true;
+ }
}
}
@@ -1700,26 +1694,30 @@ void ex_endtry(exarg_T *eap)
do_finish(eap, FALSE);
break;
- /* When the finally clause was entered due to an error,
- * interrupt or throw (as opposed to a ":continue", ":break",
- * ":return", or ":finish"), restore the pending values of
- * did_emsg, got_int, and did_throw. This is skipped, if there
- * was a new error, interrupt, throw, ":continue", ":break",
- * ":return", or ":finish". in the finally clause. */
+ // When the finally clause was entered due to an error,
+ // interrupt or throw (as opposed to a ":continue", ":break",
+ // ":return", or ":finish"), restore the pending values of
+ // did_emsg, got_int, and current_exception. This is skipped, if there
+ // was a new error, interrupt, throw, ":continue", ":break",
+ // ":return", or ":finish". in the finally clause.
default:
- if (pending & CSTP_ERROR)
- did_emsg = TRUE;
- if (pending & CSTP_INTERRUPT)
- got_int = TRUE;
- if (pending & CSTP_THROW)
- rethrow = TRUE;
+ if (pending & CSTP_ERROR) {
+ did_emsg = true;
+ }
+ if (pending & CSTP_INTERRUPT) {
+ got_int = true;
+ }
+ if (pending & CSTP_THROW) {
+ rethrow = true;
+ }
break;
}
}
- if (rethrow)
- /* Rethrow the current exception (within this cstack). */
+ if (rethrow) {
+ // Rethrow the current exception (within this cstack).
do_throw(cstack);
+ }
}
}
@@ -1749,33 +1747,34 @@ void enter_cleanup(cleanup_T *csp)
int pending = CSTP_NONE;
/*
- * Postpone did_emsg, got_int, did_throw. The pending values will be
+ * Postpone did_emsg, got_int, current_exception. The pending values will be
* restored by leave_cleanup() except if there was an aborting error,
* interrupt, or uncaught exception after this function ends.
*/
- if (did_emsg || got_int || did_throw || need_rethrow) {
- csp->pending = (did_emsg ? CSTP_ERROR : 0)
- | (got_int ? CSTP_INTERRUPT : 0)
- | (did_throw ? CSTP_THROW : 0)
- | (need_rethrow ? CSTP_THROW : 0);
-
- /* If we are currently throwing an exception (did_throw), save it as
- * well. On an error not yet converted to an exception, update
- * "force_abort" and reset "cause_abort" (as do_errthrow() would do).
- * This is needed for the do_cmdline() call that is going to be made
- * for autocommand execution. We need not save *msg_list because
- * there is an extra instance for every call of do_cmdline(), anyway.
+ if (did_emsg || got_int || current_exception || need_rethrow) {
+ csp->pending = (did_emsg ? CSTP_ERROR : 0)
+ | (got_int ? CSTP_INTERRUPT : 0)
+ | (current_exception ? CSTP_THROW : 0)
+ | (need_rethrow ? CSTP_THROW : 0);
+
+ /* If we are currently throwing an exception, save it as well. On an error
+ * not yet converted to an exception, update "force_abort" and reset
+ * "cause_abort" (as do_errthrow() would do). This is needed for the
+ * do_cmdline() call that is going to be made for autocommand execution. We
+ * need not save *msg_list because there is an extra instance for every call
+ * of do_cmdline(), anyway.
*/
- if (did_throw || need_rethrow)
+ if (current_exception || need_rethrow) {
csp->exception = current_exception;
- else {
+ } else {
csp->exception = NULL;
if (did_emsg) {
force_abort |= cause_abort;
cause_abort = FALSE;
}
}
- did_emsg = got_int = did_throw = need_rethrow = FALSE;
+ did_emsg = got_int = need_rethrow = false;
+ current_exception = NULL;
/* Report if required by the 'verbose' option or when debugging. */
report_make_pending(pending, csp->exception);
@@ -1847,19 +1846,20 @@ void leave_cleanup(cleanup_T *csp)
force_abort = FALSE;
}
- /*
- * Restore the pending values of did_emsg, got_int, and did_throw.
- */
- if (pending & CSTP_ERROR)
- did_emsg = TRUE;
- if (pending & CSTP_INTERRUPT)
- got_int = TRUE;
- if (pending & CSTP_THROW)
- need_rethrow = TRUE; /* did_throw will be set by do_one_cmd() */
+ // Restore the pending values of did_emsg, got_int, and current_exception.
+ if (pending & CSTP_ERROR) {
+ did_emsg = true;
+ }
+ if (pending & CSTP_INTERRUPT) {
+ got_int = true;
+ }
+ if (pending & CSTP_THROW) {
+ need_rethrow = true; // current_exception will be set by do_one_cmd()
+ }
- /* Report if required by the 'verbose' option or when debugging. */
- report_resume_pending(pending,
- (pending & CSTP_THROW) ? (void *)current_exception : NULL);
+ // Report if required by the 'verbose' option or when debugging.
+ report_resume_pending(
+ pending, ((pending & CSTP_THROW) ? (void *)current_exception : NULL));
}
}
diff --git a/src/nvim/ex_eval.h b/src/nvim/ex_eval.h
index 30871c7711..d5f8737bf3 100644
--- a/src/nvim/ex_eval.h
+++ b/src/nvim/ex_eval.h
@@ -23,19 +23,19 @@ struct eslist_elem {
#define CSTACK_LEN 50
struct condstack {
- short cs_flags[CSTACK_LEN]; /* CSF_ flags */
- char cs_pending[CSTACK_LEN]; /* CSTP_: what's pending in ":finally"*/
+ int cs_flags[CSTACK_LEN]; // CSF_ flags
+ char cs_pending[CSTACK_LEN]; // CSTP_: what's pending in ":finally"
union {
- void *csp_rv[CSTACK_LEN]; /* return typeval for pending return */
- void *csp_ex[CSTACK_LEN]; /* exception for pending throw */
+ void *csp_rv[CSTACK_LEN]; // return typeval for pending return
+ void *csp_ex[CSTACK_LEN]; // exception for pending throw
} cs_pend;
- void *cs_forinfo[CSTACK_LEN]; /* info used by ":for" */
- int cs_line[CSTACK_LEN]; /* line nr of ":while"/":for" line */
- int cs_idx; /* current entry, or -1 if none */
- int cs_looplevel; /* nr of nested ":while"s and ":for"s */
- int cs_trylevel; /* nr of nested ":try"s */
- eslist_T *cs_emsg_silent_list; /* saved values of "emsg_silent" */
- char cs_lflags; /* loop flags: CSL_ flags */
+ void *cs_forinfo[CSTACK_LEN]; // info used by ":for"
+ int cs_line[CSTACK_LEN]; // line nr of ":while"/":for" line
+ int cs_idx; // current entry, or -1 if none
+ int cs_looplevel; // nr of nested ":while"s and ":for"s
+ int cs_trylevel; // nr of nested ":try"s
+ eslist_T *cs_emsg_silent_list; // saved values of "emsg_silent"
+ int cs_lflags; // loop flags: CSL_ flags
};
# define cs_rettv cs_pend.csp_rv
# define cs_exception cs_pend.csp_ex
@@ -89,28 +89,29 @@ struct msglist {
struct msglist *next; /* next of several messages in a row */
};
+// The exception types.
+typedef enum
+{
+ ET_USER, // exception caused by ":throw" command
+ ET_ERROR, // error exception
+ ET_INTERRUPT // interrupt exception triggered by Ctrl-C
+} except_type_T;
+
/*
* Structure describing an exception.
* (don't use "struct exception", it's used by the math library).
*/
typedef struct vim_exception except_T;
struct vim_exception {
- int type; /* exception type */
- char_u *value; /* exception value */
- struct msglist *messages; /* message(s) causing error exception */
- char_u *throw_name; /* name of the throw point */
- linenr_T throw_lnum; /* line number of the throw point */
- except_T *caught; /* next exception on the caught stack */
+ except_type_T type; // exception type
+ char_u *value; // exception value
+ struct msglist *messages; // message(s) causing error exception
+ char_u *throw_name; // name of the throw point
+ linenr_T throw_lnum; // line number of the throw point
+ except_T *caught; // next exception on the caught stack
};
/*
- * The exception types.
- */
-#define ET_USER 0 /* exception caused by ":throw" command */
-#define ET_ERROR 1 /* error exception */
-#define ET_INTERRUPT 2 /* interrupt exception triggered by Ctrl-C */
-
-/*
* Structure to save the error/interrupt/exception state between calls to
* enter_cleanup() and leave_cleanup(). Must be allocated as an automatic
* variable by the (common) caller of these functions.
diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c
index cd28554970..8efb027575 100644
--- a/src/nvim/ex_getln.c
+++ b/src/nvim/ex_getln.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* ex_getln.c: Functions for entering and editing an Ex command line.
*/
@@ -8,6 +11,8 @@
#include <stdlib.h>
#include <inttypes.h>
+#include "nvim/assert.h"
+#include "nvim/log.h"
#include "nvim/vim.h"
#include "nvim/ascii.h"
#include "nvim/arabic.h"
@@ -26,15 +31,16 @@
#include "nvim/fileio.h"
#include "nvim/func_attr.h"
#include "nvim/getchar.h"
+#include "nvim/highlight.h"
#include "nvim/if_cscope.h"
#include "nvim/indent.h"
#include "nvim/main.h"
+#include "nvim/mark.h"
#include "nvim/mbyte.h"
#include "nvim/memline.h"
#include "nvim/menu.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/memory.h"
#include "nvim/cursor_shape.h"
#include "nvim/keymap.h"
@@ -58,6 +64,42 @@
#include "nvim/os/os.h"
#include "nvim/event/loop.h"
#include "nvim/os/time.h"
+#include "nvim/lib/kvec.h"
+#include "nvim/api/private/helpers.h"
+#include "nvim/highlight_defs.h"
+#include "nvim/viml/parser/parser.h"
+#include "nvim/viml/parser/expressions.h"
+
+/// Command-line colors: one chunk
+///
+/// Defines a region which has the same highlighting.
+typedef struct {
+ int start; ///< Colored chunk start.
+ int end; ///< Colored chunk end (exclusive, > start).
+ int attr; ///< Highlight attr.
+} CmdlineColorChunk;
+
+/// Command-line colors
+///
+/// Holds data about all colors.
+typedef kvec_t(CmdlineColorChunk) CmdlineColors;
+
+/// Command-line coloring
+///
+/// Holds both what are the colors and what have been colored. Latter is used to
+/// suppress unnecessary calls to coloring callbacks.
+typedef struct {
+ unsigned prompt_id; ///< ID of the prompt which was colored last.
+ char *cmdbuff; ///< What exactly was colored last time or NULL.
+ CmdlineColors colors; ///< Last colors.
+} ColoredCmdline;
+
+/// Keeps track how much state must be sent to external ui.
+typedef enum {
+ kCmdRedrawNone,
+ kCmdRedrawPos,
+ kCmdRedrawAll,
+} CmdRedraw;
/*
* Variables shared between getcmdline(), redrawcmdline() and others.
@@ -65,23 +107,33 @@
* structure.
*/
struct cmdline_info {
- char_u *cmdbuff; /* pointer to command line buffer */
- int cmdbufflen; /* length of cmdbuff */
- int cmdlen; /* number of chars in command line */
- int cmdpos; /* current cursor position */
- int cmdspos; /* cursor column on screen */
- int cmdfirstc; /* ':', '/', '?', '=', '>' or NUL */
- int cmdindent; /* number of spaces before cmdline */
- char_u *cmdprompt; /* message in front of cmdline */
- int cmdattr; /* attributes for prompt */
- int overstrike; /* Typing mode on the command line. Shared by
- getcmdline() and put_on_cmdline(). */
- expand_T *xpc; /* struct being used for expansion, xp_pattern
- may point into cmdbuff */
- int xp_context; /* type of expansion */
- char_u *xp_arg; /* user-defined expansion arg */
- int input_fn; /* when TRUE Invoked for input() function */
+ char_u *cmdbuff; // pointer to command line buffer
+ int cmdbufflen; // length of cmdbuff
+ int cmdlen; // number of chars in command line
+ int cmdpos; // current cursor position
+ int cmdspos; // cursor column on screen
+ int cmdfirstc; // ':', '/', '?', '=', '>' or NUL
+ int cmdindent; // number of spaces before cmdline
+ char_u *cmdprompt; // message in front of cmdline
+ int cmdattr; // attributes for prompt
+ int overstrike; // Typing mode on the command line. Shared by
+ // getcmdline() and put_on_cmdline().
+ expand_T *xpc; // struct being used for expansion, xp_pattern
+ // may point into cmdbuff
+ int xp_context; // type of expansion
+ char_u *xp_arg; // user-defined expansion arg
+ int input_fn; // when TRUE Invoked for input() function
+ unsigned prompt_id; ///< Prompt number, used to disable coloring on errors.
+ Callback highlight_callback; ///< Callback used for coloring user input.
+ ColoredCmdline last_colors; ///< Last cmdline colors
+ int level; // current cmdline level
+ struct cmdline_info *prev_ccline; ///< pointer to saved cmdline state
+ char special_char; ///< last putcmdline char (used for redraws)
+ bool special_shift; ///< shift of last putcmdline char
+ CmdRedraw redraw_state; ///< needed redraw for external cmdline
};
+/// Last value of prompt_id, incremented when doing new prompt
+static unsigned last_prompt_id = 0;
typedef struct command_line_state {
VimState state;
@@ -96,19 +148,28 @@ typedef struct command_line_state {
char_u *lookfor; // string to match
int hiscnt; // current history line in use
int histype; // history type to be used
- pos_T old_cursor;
- colnr_T old_curswant;
- colnr_T old_leftcol;
- linenr_T old_topline;
- int old_topfill;
- linenr_T old_botline;
+ pos_T search_start; // where 'incsearch' starts searching
+ pos_T save_cursor;
+ colnr_T old_curswant;
+ colnr_T init_curswant;
+ colnr_T old_leftcol;
+ colnr_T init_leftcol;
+ linenr_T old_topline;
+ linenr_T init_topline;
+ int old_topfill;
+ int init_topfill;
+ linenr_T old_botline;
+ linenr_T init_botline;
+ pos_T match_start;
+ pos_T match_end;
int did_incsearch;
int incsearch_postponed;
int did_wild_list; // did wild_list() recently
int wim_index; // index in wim_flags[]
int res;
- int save_msg_scroll;
- int save_State; // remember State when called
+ int save_msg_scroll;
+ int save_State; // remember State when called
+ char_u *save_p_icm;
int some_key_typed; // one of the keys was typed
// mouse drag and release events are ignored, unless they are
// preceded with a mouse down event
@@ -116,12 +177,10 @@ typedef struct command_line_state {
int break_ctrl_c;
expand_T xpc;
long *b_im_ptr;
- // Everything that may work recursively should save and restore the
- // current command line in save_ccline. That includes update_screen(), a
- // custom status line may invoke ":normal".
- struct cmdline_info save_ccline;
} CommandLineState;
+typedef struct cmdline_info CmdlineInfo;
+
/* The current cmdline_info. It is initialized in getcmdline() and after that
* used by other functions. When invoking getcmdline() recursively it needs
* to be saved with save_cmdline() and restored with restore_cmdline().
@@ -132,10 +191,16 @@ static int cmd_showtail; /* Only show path tail in lists ? */
static int new_cmdpos; /* position set by set_cmdline_pos() */
+/// currently displayed block of context
+static Array cmdline_block = ARRAY_DICT_INIT;
+
/*
* Type used by call_user_expand_func
*/
-typedef void *(*user_expand_func_T)(char_u *, int, char_u **, int);
+typedef void *(*user_expand_func_T)(const char_u *,
+ int,
+ const char_u * const *,
+ bool);
static histentry_T *(history[HIST_COUNT]) = {NULL, NULL, NULL, NULL, NULL};
static int hisidx[HIST_COUNT] = {-1, -1, -1, -1, -1}; /* lastused entry */
@@ -143,16 +208,30 @@ static int hisnum[HIST_COUNT] = {0, 0, 0, 0, 0};
/* identifying (unique) number of newest history entry */
static int hislen = 0; /* actual length of history tables */
+/// Flag for command_line_handle_key to ignore <C-c>
+///
+/// Used if it was received while processing highlight function in order for
+/// user interrupting highlight function to not interrupt command-line.
+static bool getln_interrupted_highlight = false;
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "ex_getln.c.generated.h"
#endif
-static int cmd_hkmap = 0; /* Hebrew mapping during command line */
+static int cmd_hkmap = 0; // Hebrew mapping during command line
+static int cmd_fkmap = 0; // Farsi mapping during command line
-static int cmd_fkmap = 0; /* Farsi mapping during command line */
+/// Internal entry point for cmdline mode.
+///
+/// caller must use save_cmdline and restore_cmdline. Best is to use
+/// getcmdline or getcmdline_prompt, instead of calling this directly.
static uint8_t *command_line_enter(int firstc, long count, int indent)
{
+ // can be invoked recursively, identify each level
+ static int cmdline_level = 0;
+ cmdline_level++;
+
CommandLineState state, *s = &state;
memset(s, 0, sizeof(CommandLineState));
s->firstc = firstc;
@@ -160,7 +239,14 @@ static uint8_t *command_line_enter(int firstc, long count, int indent)
s->indent = indent;
s->save_msg_scroll = msg_scroll;
s->save_State = State;
+ s->save_p_icm = vim_strsave(p_icm);
s->ignore_drag_release = true;
+ s->match_start = curwin->w_cursor;
+ s->init_curswant = curwin->w_curswant;
+ s->init_leftcol = curwin->w_leftcol;
+ s->init_topline = curwin->w_topline;
+ s->init_topfill = curwin->w_topfill;
+ s->init_botline = curwin->w_botline;
if (s->firstc == -1) {
s->firstc = NUL;
@@ -172,8 +258,12 @@ static uint8_t *command_line_enter(int firstc, long count, int indent)
cmd_hkmap = 0;
}
+ ccline.prompt_id = last_prompt_id++;
+ ccline.level = cmdline_level;
ccline.overstrike = false; // always start in insert mode
- s->old_cursor = curwin->w_cursor; // needs to be restored later
+ clearpos(&s->match_end);
+ s->save_cursor = curwin->w_cursor; // may be restored later
+ s->search_start = curwin->w_cursor;
s->old_curswant = curwin->w_curswant;
s->old_leftcol = curwin->w_leftcol;
s->old_topline = curwin->w_topline;
@@ -189,6 +279,10 @@ static uint8_t *command_line_enter(int firstc, long count, int indent)
ccline.cmdlen = ccline.cmdpos = 0;
ccline.cmdbuff[0] = NUL;
+ ccline.last_colors = (ColoredCmdline){ .cmdbuff = NULL,
+ .colors = KV_INITIAL_VALUE };
+ sb_text_start_cmdline();
+
// autoindent for :insert and :append
if (s->firstc <= 0) {
memset(ccline.cmdbuff, ' ', s->indent);
@@ -210,10 +304,7 @@ static uint8_t *command_line_enter(int firstc, long count, int indent)
redir_off = true; // don't redirect the typed command
if (!cmd_silent) {
- s->i = msg_scrolled;
- msg_scrolled = 0; // avoid wait_return message
gotocmdline(true);
- msg_scrolled += s->i;
redrawcmdprompt(); // draw prompt or indent
set_cmdspos();
}
@@ -262,12 +353,68 @@ static uint8_t *command_line_enter(int firstc, long count, int indent)
redrawcmd();
}
+ // redraw the statusline for statuslines that display the current mode
+ // using the mode() function.
+ if (KeyTyped && msg_scrolled == 0) {
+ curwin->w_redr_status = true;
+ redraw_statuslines();
+ }
+
did_emsg = false;
got_int = false;
s->state.check = command_line_check;
s->state.execute = command_line_execute;
+
+ TryState tstate;
+ Error err = ERROR_INIT;
+ bool tl_ret = true;
+ dict_T *dict = get_vim_var_dict(VV_EVENT);
+ char firstcbuf[2];
+ firstcbuf[0] = firstc > 0 ? firstc : '-';
+ firstcbuf[1] = 0;
+
+ if (has_event(EVENT_CMDLINEENTER)) {
+ // set v:event to a dictionary with information about the commandline
+ tv_dict_add_str(dict, S_LEN("cmdtype"), firstcbuf);
+ tv_dict_add_nr(dict, S_LEN("cmdlevel"), ccline.level);
+ tv_dict_set_keys_readonly(dict);
+ try_enter(&tstate);
+
+ apply_autocmds(EVENT_CMDLINEENTER, (char_u *)firstcbuf, (char_u *)firstcbuf,
+ false, curbuf);
+ tv_dict_clear(dict);
+
+
+ tl_ret = try_leave(&tstate, &err);
+ if (!tl_ret && ERROR_SET(&err)) {
+ msg_putchar('\n');
+ msg_printf_attr(HL_ATTR(HLF_E)|MSG_HIST, (char *)e_autocmd_err, err.msg);
+ api_clear_error(&err);
+ redrawcmd();
+ }
+ tl_ret = true;
+ }
+
state_enter(&s->state);
+ if (has_event(EVENT_CMDLINELEAVE)) {
+ tv_dict_add_str(dict, S_LEN("cmdtype"), firstcbuf);
+ tv_dict_add_nr(dict, S_LEN("cmdlevel"), ccline.level);
+ tv_dict_set_keys_readonly(dict);
+ // not readonly:
+ tv_dict_add_special(dict, S_LEN("abort"),
+ s->gotesc ? kSpecialVarTrue : kSpecialVarFalse);
+ try_enter(&tstate);
+ apply_autocmds(EVENT_CMDLINELEAVE, (char_u *)firstcbuf, (char_u *)firstcbuf,
+ false, curbuf);
+ // error printed below, to avoid redraw issues
+ tl_ret = try_leave(&tstate, &err);
+ if (tv_dict_get_number(dict, "abort") != 0) {
+ s->gotesc = 1;
+ }
+ tv_dict_clear(dict);
+ }
+
cmdmsg_rl = false;
cmd_fkmap = 0;
@@ -276,7 +423,16 @@ static uint8_t *command_line_enter(int firstc, long count, int indent)
ccline.xpc = NULL;
if (s->did_incsearch) {
- curwin->w_cursor = s->old_cursor;
+ if (s->gotesc) {
+ curwin->w_cursor = s->save_cursor;
+ } else {
+ if (!equalpos(s->save_cursor, s->search_start)) {
+ // put the '" mark at the original position
+ curwin->w_cursor = s->save_cursor;
+ setpcmark();
+ }
+ curwin->w_cursor = s->search_start; // -V519
+ }
curwin->w_curswant = s->old_curswant;
curwin->w_leftcol = s->old_leftcol;
curwin->w_topline = s->old_topline;
@@ -284,7 +440,7 @@ static uint8_t *command_line_enter(int firstc, long count, int indent)
curwin->w_botline = s->old_botline;
highlight_match = false;
validate_cursor(); // needed for TAB
- redraw_later(SOME_VALID);
+ redraw_all_later(SOME_VALID);
}
if (ccline.cmdbuff != NULL) {
@@ -301,14 +457,8 @@ static uint8_t *command_line_enter(int firstc, long count, int indent)
}
}
- if (s->gotesc) { // abandon command line
- xfree(ccline.cmdbuff);
- ccline.cmdbuff = NULL;
- if (msg_scrolled == 0) {
- compute_cmdrow();
- }
- MSG("");
- redraw_cmdline = true;
+ if (s->gotesc) {
+ abandon_cmdline();
}
}
@@ -319,22 +469,36 @@ static uint8_t *command_line_enter(int firstc, long count, int indent)
msg_scroll = s->save_msg_scroll;
redir_off = false;
+ if (!tl_ret && ERROR_SET(&err)) {
+ msg_putchar('\n');
+ msg_printf_attr(HL_ATTR(HLF_E)|MSG_HIST, (char *)e_autocmd_err, err.msg);
+ api_clear_error(&err);
+ }
+
// When the command line was typed, no need for a wait-return prompt.
- if (s->some_key_typed) {
+ if (s->some_key_typed && tl_ret) {
need_wait_return = false;
}
+ set_string_option_direct((char_u *)"icm", -1, s->save_p_icm, OPT_FREE,
+ SID_NONE);
State = s->save_State;
setmouse();
ui_cursor_shape(); // may show different cursor shape
+ xfree(s->save_p_icm);
+ xfree(ccline.last_colors.cmdbuff);
+ kv_destroy(ccline.last_colors.colors);
- {
- char_u *p = ccline.cmdbuff;
+ sb_text_end_cmdline();
+
+ char_u *p = ccline.cmdbuff;
- // Make ccline empty, getcmdline() may try to use it.
- ccline.cmdbuff = NULL;
- return p;
+ if (ui_is_external(kUICmdline)) {
+ ui_call_cmdline_hide(ccline.level);
}
+
+ cmdline_level--;
+ return p;
}
static int command_line_check(VimState *state)
@@ -344,7 +508,12 @@ static int command_line_check(VimState *state)
// completion may switch it on.
quit_more = false; // reset after CTRL-D which had a more-prompt
+ did_emsg = false; // There can't really be a reason why an error
+ // that occurs while typing a command should
+ // cause the command not to be executed.
+
cursorcmd(); // set the cursor on the right spot
+ ui_cursor_shape();
return 1;
}
@@ -357,8 +526,12 @@ static int command_line_execute(VimState *state, int key)
CommandLineState *s = (CommandLineState *)state;
s->c = key;
- if (s->c == K_EVENT) {
- queue_process_events(main_loop.events);
+ if (s->c == K_EVENT || s->c == K_COMMAND) {
+ if (s->c == K_EVENT) {
+ multiqueue_process_events(main_loop.events);
+ } else {
+ do_cmdline(NULL, getcmdkeycmd, NULL, DOCMD_NOWAIT);
+ }
redrawcmdline();
return 1;
}
@@ -437,18 +610,22 @@ static int command_line_execute(VimState *state, int key)
}
// free expanded names when finished walking through matches
- if (s->xpc.xp_numfiles != -1
- && !(s->c == p_wc && KeyTyped) && s->c != p_wcm
+ if (!(s->c == p_wc && KeyTyped) && s->c != p_wcm
&& s->c != Ctrl_N && s->c != Ctrl_P && s->c != Ctrl_A
&& s->c != Ctrl_L) {
- (void)ExpandOne(&s->xpc, NULL, NULL, 0, WILD_FREE);
+ if (ui_is_external(kUIWildmenu)) {
+ ui_call_wildmenu_hide();
+ }
+ if (s->xpc.xp_numfiles != -1) {
+ (void)ExpandOne(&s->xpc, NULL, NULL, 0, WILD_FREE);
+ }
s->did_wild_list = false;
if (!p_wmnu || (s->c != K_UP && s->c != K_DOWN)) {
s->xpc.xp_context = EXPAND_NOTHING;
}
s->wim_index = 0;
if (p_wmnu && wild_menu_showing != 0) {
- int skt = KeyTyped;
+ const bool skt = KeyTyped;
int old_RedrawingDisabled = RedrawingDisabled;
if (ccline.input_fn) {
@@ -459,22 +636,22 @@ static int command_line_execute(VimState *state, int key)
// Entered command line, move it up
cmdline_row--;
redrawcmd();
+ wild_menu_showing = 0;
} else if (save_p_ls != -1) {
// restore 'laststatus' and 'winminheight'
p_ls = save_p_ls;
p_wmh = save_p_wmh;
last_status(false);
- save_cmdline(&s->save_ccline);
update_screen(VALID); // redraw the screen NOW
- restore_cmdline(&s->save_ccline);
redrawcmd();
save_p_ls = -1;
+ wild_menu_showing = 0;
} else {
win_redraw_last_status(topframe);
+ wild_menu_showing = 0; // must be before redraw_statuslines #8385
redraw_statuslines();
}
KeyTyped = skt;
- wild_menu_showing = 0;
if (ccline.input_fn) {
RedrawingDisabled = old_RedrawingDisabled;
}
@@ -547,9 +724,7 @@ static int command_line_execute(VimState *state, int key)
s->j = ccline.cmdpos;
s->i = (int)(s->xpc.xp_pattern - ccline.cmdbuff);
while (--s->j > s->i) {
- if (has_mbyte) {
- s->j -= (*mb_head_off)(ccline.cmdbuff, ccline.cmdbuff + s->j);
- }
+ s->j -= utf_head_off(ccline.cmdbuff, ccline.cmdbuff + s->j);
if (vim_ispathsep(ccline.cmdbuff[s->j])) {
found = true;
break;
@@ -569,12 +744,10 @@ static int command_line_execute(VimState *state, int key)
s->j = ccline.cmdpos - 1;
s->i = (int)(s->xpc.xp_pattern - ccline.cmdbuff);
while (--s->j > s->i) {
- if (has_mbyte) {
- s->j -= (*mb_head_off)(ccline.cmdbuff, ccline.cmdbuff + s->j);
- }
+ s->j -= utf_head_off(ccline.cmdbuff, ccline.cmdbuff + s->j);
if (vim_ispathsep(ccline.cmdbuff[s->j])
#ifdef BACKSLASH_IN_FILENAME
- && vim_strchr(" *?[{`$%#", ccline.cmdbuff[s->j + 1])
+ && vim_strchr((const char_u *)" *?[{`$%#", ccline.cmdbuff[s->j + 1])
== NULL
#endif
) {
@@ -617,16 +790,16 @@ static int command_line_execute(VimState *state, int key)
// CTRL-\ CTRL-N goes to Normal mode, CTRL-\ CTRL-G goes to Insert
// mode when 'insertmode' is set, CTRL-\ e prompts for an expression.
if (s->c == Ctrl_BSL) {
- ++no_mapping;
- ++allow_keys;
+ no_mapping++;
s->c = plain_vgetc();
- --no_mapping;
- --allow_keys;
+ no_mapping--;
// CTRL-\ e doesn't work when obtaining an expression, unless it
// is in a mapping.
- if (s->c != Ctrl_N && s->c != Ctrl_G && (s->c != 'e'
- || (ccline.cmdfirstc == '='
- && KeyTyped))) {
+ if (s->c != Ctrl_N
+ && s->c != Ctrl_G
+ && (s->c != 'e'
+ || (ccline.cmdfirstc == '=' && KeyTyped)
+ || cmdline_star > 0)) {
vungetc(s->c);
s->c = Ctrl_BSL;
} else if (s->c == 'e') {
@@ -642,18 +815,17 @@ static int command_line_execute(VimState *state, int key)
new_cmdpos = ccline.cmdpos;
}
- save_cmdline(&s->save_ccline);
s->c = get_expr_register();
- restore_cmdline(&s->save_ccline);
if (s->c == '=') {
// Need to save and restore ccline. And set "textlock"
// to avoid nasty things like going to another buffer when
// evaluating an expression.
- save_cmdline(&s->save_ccline);
- ++textlock;
+ CmdlineInfo save_ccline;
+ save_cmdline(&save_ccline);
+ textlock++;
p = get_expr_line();
- --textlock;
- restore_cmdline(&s->save_ccline);
+ textlock--;
+ restore_cmdline(&save_ccline);
if (p != NULL) {
len = (int)STRLEN(p);
@@ -694,7 +866,7 @@ static int command_line_execute(VimState *state, int key)
if (s->c == cedit_key || s->c == K_CMDWIN) {
if (ex_normal_busy == 0 && got_int == false) {
// Open a window to edit the command line (and history).
- s->c = ex_window();
+ s->c = open_cmdwin();
s->some_key_typed = true;
}
} else {
@@ -723,7 +895,9 @@ static int command_line_execute(VimState *state, int key)
}
if (!cmd_silent) {
- ui_cursor_goto(msg_row, 0);
+ if (!ui_is_external(kUICmdline)) {
+ ui_cursor_goto(msg_row, 0);
+ }
ui_flush();
}
return 0;
@@ -849,6 +1023,144 @@ static int command_line_execute(VimState *state, int key)
return command_line_handle_key(s);
}
+static void command_line_next_incsearch(CommandLineState *s, bool next_match)
+{
+ ui_busy_start();
+ ui_flush();
+
+ pos_T t;
+ char_u *pat;
+ int search_flags = SEARCH_NOOF;
+
+
+ if (s->firstc == ccline.cmdbuff[0]) {
+ pat = last_search_pattern();
+ } else {
+ pat = ccline.cmdbuff;
+ }
+
+ save_last_search_pattern();
+
+ if (next_match) {
+ t = s->match_end;
+ if (lt(s->match_start, s->match_end)) {
+ // start searching at the end of the match
+ // not at the beginning of the next column
+ (void)decl(&t);
+ }
+ search_flags += SEARCH_COL;
+ } else {
+ t = s->match_start;
+ }
+ if (!p_hls) {
+ search_flags += SEARCH_KEEP;
+ }
+ emsg_off++;
+ s->i = searchit(curwin, curbuf, &t,
+ next_match ? FORWARD : BACKWARD,
+ pat, s->count, search_flags,
+ RE_SEARCH, 0, NULL);
+ emsg_off--;
+ ui_busy_stop();
+ if (s->i) {
+ s->search_start = s->match_start;
+ s->match_end = t;
+ s->match_start = t;
+ if (!next_match && s->firstc == '/') {
+ // move just before the current match, so that
+ // when nv_search finishes the cursor will be
+ // put back on the match
+ s->search_start = t;
+ (void)decl(&s->search_start);
+ } else if (next_match && s->firstc == '?') {
+ // move just after the current match, so that
+ // when nv_search finishes the cursor will be
+ // put back on the match
+ s->search_start = t;
+ (void)incl(&s->search_start);
+ }
+ if (lt(t, s->search_start) && next_match) {
+ // wrap around
+ s->search_start = t;
+ if (s->firstc == '?') {
+ (void)incl(&s->search_start);
+ } else {
+ (void)decl(&s->search_start);
+ }
+ }
+
+ set_search_match(&s->match_end);
+ curwin->w_cursor = s->match_start;
+ changed_cline_bef_curs();
+ update_topline();
+ validate_cursor();
+ highlight_match = true;
+ s->old_curswant = curwin->w_curswant;
+ s->old_leftcol = curwin->w_leftcol;
+ s->old_topline = curwin->w_topline;
+ s->old_topfill = curwin->w_topfill;
+ s->old_botline = curwin->w_botline;
+ update_screen(NOT_VALID);
+ redrawcmdline();
+ } else {
+ vim_beep(BO_ERROR);
+ }
+ restore_last_search_pattern();
+ return;
+}
+
+static void command_line_next_histidx(CommandLineState *s, bool next_match)
+{
+ s->j = (int)STRLEN(s->lookfor);
+ for (;; ) {
+ // one step backwards
+ if (!next_match) {
+ if (s->hiscnt == hislen) {
+ // first time
+ s->hiscnt = hisidx[s->histype];
+ } else if (s->hiscnt == 0 && hisidx[s->histype] != hislen - 1) {
+ s->hiscnt = hislen - 1;
+ } else if (s->hiscnt != hisidx[s->histype] + 1) {
+ s->hiscnt--;
+ } else {
+ // at top of list
+ s->hiscnt = s->i;
+ break;
+ }
+ } else { // one step forwards
+ // on last entry, clear the line
+ if (s->hiscnt == hisidx[s->histype]) {
+ s->hiscnt = hislen;
+ break;
+ }
+
+ // not on a history line, nothing to do
+ if (s->hiscnt == hislen) {
+ break;
+ }
+
+ if (s->hiscnt == hislen - 1) {
+ // wrap around
+ s->hiscnt = 0;
+ } else {
+ s->hiscnt++;
+ }
+ }
+
+ if (s->hiscnt < 0 || history[s->histype][s->hiscnt].hisstr == NULL) {
+ s->hiscnt = s->i;
+ break;
+ }
+
+ if ((s->c != K_UP && s->c != K_DOWN)
+ || s->hiscnt == s->i
+ || STRNCMP(history[s->histype][s->hiscnt].hisstr,
+ s->lookfor, (size_t)s->j) == 0) {
+ break;
+ }
+ }
+}
+
static int command_line_handle_key(CommandLineState *s)
{
// Big switch for a typed command line character.
@@ -921,6 +1233,16 @@ static int command_line_handle_key(CommandLineState *s)
// Truncate at the end, required for multi-byte chars.
ccline.cmdbuff[ccline.cmdlen] = NUL;
+ if (ccline.cmdlen == 0) {
+ s->search_start = s->save_cursor;
+ // save view settings, so that the screen won't be restored at the
+ // wrong position
+ s->old_curswant = s->init_curswant;
+ s->old_leftcol = s->init_leftcol;
+ s->old_topline = s->init_topline;
+ s->old_topfill = s->init_topfill;
+ s->old_botline = s->init_botline;
+ }
redrawcmd();
} else if (ccline.cmdlen == 0 && s->c != Ctrl_W
&& ccline.cmdprompt == NULL && s->indent == 0) {
@@ -931,7 +1253,7 @@ static int command_line_handle_key(CommandLineState *s)
xfree(ccline.cmdbuff); // no commandline to return
ccline.cmdbuff = NULL;
- if (!cmd_silent) {
+ if (!cmd_silent && !ui_is_external(kUICmdline)) {
if (cmdmsg_rl) {
msg_col = Columns;
} else {
@@ -939,6 +1261,7 @@ static int command_line_handle_key(CommandLineState *s)
}
msg_putchar(' '); // delete ':'
}
+ s->search_start = s->save_cursor;
redraw_cmdline = true;
return 0; // back to cmd mode
}
@@ -958,7 +1281,7 @@ static int command_line_handle_key(CommandLineState *s)
return command_line_not_changed(s);
case Ctrl_HAT:
- if (map_to_exists_mode((char_u *)"", LANGMAP, false)) {
+ if (map_to_exists_mode("", LANGMAP, false)) {
// ":lmap" mappings exists, toggle use of mappings.
State ^= LANGMAP;
if (s->b_im_ptr != NULL) {
@@ -982,7 +1305,6 @@ static int command_line_handle_key(CommandLineState *s)
status_redraw_curbuf();
return command_line_not_changed(s);
- // case '@': only in very old vi
case Ctrl_U:
// delete all characters left of the cursor
s->j = ccline.cmdpos;
@@ -994,15 +1316,20 @@ static int command_line_handle_key(CommandLineState *s)
// Truncate at the end, required for multi-byte chars.
ccline.cmdbuff[ccline.cmdlen] = NUL;
+ if (ccline.cmdlen == 0) {
+ s->search_start = s->save_cursor;
+ }
redrawcmd();
return command_line_changed(s);
-
case ESC: // get here if p_wc != ESC or when ESC typed twice
case Ctrl_C:
// In exmode it doesn't make sense to return. Except when
- // ":normal" runs out of characters.
- if (exmode_active && (ex_normal_busy == 0 || typebuf.tb_len > 0)) {
+ // ":normal" runs out of characters. Also when highlight callback is active
+ // <C-c> should interrupt only it.
+ if ((exmode_active && (ex_normal_busy == 0 || typebuf.tb_len > 0))
+ || (getln_interrupted_highlight && s->c == Ctrl_C)) {
+ getln_interrupted_highlight = false;
return command_line_not_changed(s);
}
@@ -1027,13 +1354,15 @@ static int command_line_handle_key(CommandLineState *s)
// a new one...
new_cmdpos = -1;
if (s->c == '=') {
- if (ccline.cmdfirstc == '=') { // can't do this recursively
+ if (ccline.cmdfirstc == '=' // can't do this recursively
+ || cmdline_star > 0) { // or when typing a password
beep_flush();
s->c = ESC;
} else {
- save_cmdline(&s->save_ccline);
+ CmdlineInfo save_ccline;
+ save_cmdline(&save_ccline);
s->c = get_expr_register();
- restore_cmdline(&s->save_ccline);
+ restore_cmdline(&save_ccline);
}
}
@@ -1065,6 +1394,7 @@ static int command_line_handle_key(CommandLineState *s)
break; // Use ^D as normal char instead
}
+ wild_menu_showing = WM_LIST;
redrawcmd();
return 1; // don't do incremental search now
@@ -1103,25 +1433,22 @@ static int command_line_handle_key(CommandLineState *s)
return command_line_not_changed(s);
}
do {
- --ccline.cmdpos;
- if (has_mbyte) { // move to first byte of char
- ccline.cmdpos -= (*mb_head_off)(ccline.cmdbuff,
- ccline.cmdbuff + ccline.cmdpos);
- }
+ ccline.cmdpos--;
+ // Move to first byte of possibly multibyte char.
+ ccline.cmdpos -= utf_head_off(ccline.cmdbuff,
+ ccline.cmdbuff + ccline.cmdpos);
ccline.cmdspos -= cmdline_charsize(ccline.cmdpos);
} while (ccline.cmdpos > 0
&& (s->c == K_S_LEFT || s->c == K_C_LEFT
|| (mod_mask & (MOD_MASK_SHIFT|MOD_MASK_CTRL)))
&& ccline.cmdbuff[ccline.cmdpos - 1] != ' ');
- if (has_mbyte) {
- set_cmdspos_cursor();
- }
+ set_cmdspos_cursor();
return command_line_not_changed(s);
case K_IGNORE:
- // Ignore mouse event or ex_window() result.
+ // Ignore mouse event or open_cmdwin() result.
return command_line_not_changed(s);
@@ -1147,7 +1474,7 @@ static int command_line_handle_key(CommandLineState *s)
if (s->ignore_drag_release) {
return command_line_not_changed(s);
}
- // FALLTHROUGH
+ FALLTHROUGH;
case K_LEFTMOUSE:
case K_RIGHTMOUSE:
if (s->c == K_LEFTRELEASE || s->c == K_RIGHTRELEASE) {
@@ -1224,24 +1551,27 @@ static int command_line_handle_key(CommandLineState *s)
case Ctrl_L:
if (p_is && !cmd_silent && (s->firstc == '/' || s->firstc == '?')) {
// Add a character from under the cursor for 'incsearch'
- if (s->did_incsearch && !equalpos(curwin->w_cursor, s->old_cursor)) {
- s->c = gchar_cursor();
- // If 'ignorecase' and 'smartcase' are set and the
- // command line has no uppercase characters, convert
- // the character to lowercase
- if (p_ic && p_scs && !pat_has_uppercase(ccline.cmdbuff)) {
- s->c = vim_tolower(s->c);
- }
-
- if (s->c != NUL) {
- if (s->c == s->firstc
- || vim_strchr((char_u *)(p_magic ? "\\^$.*[" : "\\^$"), s->c)
- != NULL) {
- // put a backslash before special characters
- stuffcharReadbuff(s->c);
- s->c = '\\';
+ if (s->did_incsearch) {
+ curwin->w_cursor = s->match_end;
+ if (!equalpos(curwin->w_cursor, s->search_start)) {
+ s->c = gchar_cursor();
+ // If 'ignorecase' and 'smartcase' are set and the
+ // command line has no uppercase characters, convert
+ // the character to lowercase
+ if (p_ic && p_scs
+ && !pat_has_uppercase(ccline.cmdbuff)) {
+ s->c = mb_tolower(s->c);
+ }
+ if (s->c != NUL) {
+ if (s->c == s->firstc
+ || vim_strchr((char_u *)(p_magic ? "\\~^$.*[" : "\\^$"), s->c)
+ != NULL) {
+ // put a backslash before special characters
+ stuffcharReadbuff(s->c);
+ s->c = '\\';
+ }
+ break;
}
- break;
}
}
return command_line_not_changed(s);
@@ -1260,8 +1590,9 @@ static int command_line_handle_key(CommandLineState *s)
0, s->firstc != '@') == FAIL) {
break;
}
- return command_line_changed(s);
+ return command_line_not_changed(s);
}
+ FALLTHROUGH;
case K_UP:
case K_DOWN:
@@ -1284,60 +1615,14 @@ static int command_line_handle_key(CommandLineState *s)
s->lookfor[ccline.cmdpos] = NUL;
}
- s->j = (int)STRLEN(s->lookfor);
- for (;; ) {
- // one step backwards
- if (s->c == K_UP|| s->c == K_S_UP || s->c == Ctrl_P
- || s->c == K_PAGEUP || s->c == K_KPAGEUP) {
- if (s->hiscnt == hislen) {
- // first time
- s->hiscnt = hisidx[s->histype];
- } else if (s->hiscnt == 0 && hisidx[s->histype] != hislen - 1) {
- s->hiscnt = hislen - 1;
- } else if (s->hiscnt != hisidx[s->histype] + 1) {
- --s->hiscnt;
- } else {
- // at top of list
- s->hiscnt = s->i;
- break;
- }
- } else { // one step forwards
- // on last entry, clear the line
- if (s->hiscnt == hisidx[s->histype]) {
- s->hiscnt = hislen;
- break;
- }
-
- // not on a history line, nothing to do
- if (s->hiscnt == hislen) {
- break;
- }
-
- if (s->hiscnt == hislen - 1) {
- // wrap around
- s->hiscnt = 0;
- } else {
- ++s->hiscnt;
- }
- }
-
- if (s->hiscnt < 0 || history[s->histype][s->hiscnt].hisstr == NULL) {
- s->hiscnt = s->i;
- break;
- }
-
- if ((s->c != K_UP && s->c != K_DOWN)
- || s->hiscnt == s->i
- || STRNCMP(history[s->histype][s->hiscnt].hisstr,
- s->lookfor, (size_t)s->j) == 0) {
- break;
- }
- }
+ bool next_match = (s->c == K_DOWN || s->c == K_S_DOWN || s->c == Ctrl_N
+ || s->c == K_PAGEDOWN || s->c == K_KPAGEDOWN);
+ command_line_next_histidx(s, next_match);
if (s->hiscnt != s->i) {
// jumped to other entry
char_u *p;
- int len;
+ int len = 0;
int old_firstc;
xfree(ccline.cmdbuff);
@@ -1400,6 +1685,16 @@ static int command_line_handle_key(CommandLineState *s)
beep_flush();
return command_line_not_changed(s);
+ case Ctrl_G: // next match
+ case Ctrl_T: // previous match
+ if (p_is && !cmd_silent && (s->firstc == '/' || s->firstc == '?')) {
+ if (ccline.cmdlen != 0) {
+ command_line_next_incsearch(s, s->c == Ctrl_G);
+ }
+ return command_line_not_changed(s);
+ }
+ break;
+
case Ctrl_V:
case Ctrl_Q:
s->ignore_drag_release = true;
@@ -1408,9 +1703,14 @@ static int command_line_handle_key(CommandLineState *s)
s->do_abbr = false; // don't do abbreviation now
// may need to remove ^ when composing char was typed
if (enc_utf8 && utf_iscomposing(s->c) && !cmd_silent) {
- draw_cmdline(ccline.cmdpos, ccline.cmdlen - ccline.cmdpos);
- msg_putchar(' ');
- cursorcmd();
+ if (ui_is_external(kUICmdline)) {
+ // TODO(bfredl): why not make unputcmdline also work with true?
+ unputcmdline();
+ } else {
+ draw_cmdline(ccline.cmdpos, ccline.cmdlen - ccline.cmdpos);
+ msg_putchar(' ');
+ cursorcmd();
+ }
}
break;
@@ -1442,14 +1742,6 @@ static int command_line_handle_key(CommandLineState *s)
}
return command_line_not_changed(s);
- case K_FOCUSGAINED: // Neovim has been given focus
- apply_autocmds(EVENT_FOCUSGAINED, NULL, NULL, false, curbuf);
- return command_line_not_changed(s);
-
- case K_FOCUSLOST: // Neovim has lost focus
- apply_autocmds(EVENT_FOCUSLOST, NULL, NULL, false, curbuf);
- return command_line_not_changed(s);
-
default:
// Normal character with no special meaning. Just set mod_mask
// to 0x0 so that typing Shift-Space in the GUI doesn't enter
@@ -1475,14 +1767,9 @@ static int command_line_handle_key(CommandLineState *s)
if (IS_SPECIAL(s->c) || mod_mask != 0) {
put_on_cmdline(get_special_key_name(s->c, mod_mask), -1, true);
} else {
- if (has_mbyte) {
- s->j = (*mb_char2bytes)(s->c, IObuff);
- IObuff[s->j] = NUL; // exclude composing chars
- put_on_cmdline(IObuff, s->j, true);
- } else {
- IObuff[0] = s->c;
- put_on_cmdline(IObuff, 1, true);
- }
+ s->j = utf_char2bytes(s->c, IObuff);
+ IObuff[s->j] = NUL; // exclude composing chars
+ put_on_cmdline(IObuff, s->j, true);
}
return command_line_changed(s);
}
@@ -1490,19 +1777,62 @@ static int command_line_handle_key(CommandLineState *s)
static int command_line_not_changed(CommandLineState *s)
{
- // This part implements incremental searches for "/" and "?" Jump to
- // cmdline_not_changed when a character has been read but the command line
- // did not change. Then we only search and redraw if something changed in
- // the past. Jump to cmdline_changed when the command line did change.
- // (Sorry for the goto's, I know it is ugly).
+ // Incremental searches for "/" and "?":
+ // Enter command_line_not_changed() when a character has been read but the
+ // command line did not change. Then we only search and redraw if something
+ // changed in the past.
+ // Enter command_line_changed() when the command line did change.
if (!s->incsearch_postponed) {
return 1;
}
return command_line_changed(s);
}
+/// Guess that the pattern matches everything. Only finds specific cases, such
+/// as a trailing \|, which can happen while typing a pattern.
+static int empty_pattern(char_u *p)
+{
+ size_t n = STRLEN(p);
+
+ // remove trailing \v and the like
+ while (n >= 2 && p[n - 2] == '\\'
+ && vim_strchr((char_u *)"mMvVcCZ", p[n - 1]) != NULL) {
+ n -= 2;
+ }
+ return n == 0 || (n >= 2 && p[n - 2] == '\\' && p[n - 1] == '|');
+}
+
static int command_line_changed(CommandLineState *s)
{
+ // Trigger CmdlineChanged autocommands.
+ if (has_event(EVENT_CMDLINECHANGED)) {
+ TryState tstate;
+ Error err = ERROR_INIT;
+ dict_T *dict = get_vim_var_dict(VV_EVENT);
+
+ char firstcbuf[2];
+ firstcbuf[0] = s->firstc > 0 ? s->firstc : '-';
+ firstcbuf[1] = 0;
+
+ // set v:event to a dictionary with information about the commandline
+ tv_dict_add_str(dict, S_LEN("cmdtype"), firstcbuf);
+ tv_dict_add_nr(dict, S_LEN("cmdlevel"), ccline.level);
+ tv_dict_set_keys_readonly(dict);
+ try_enter(&tstate);
+
+ apply_autocmds(EVENT_CMDLINECHANGED, (char_u *)firstcbuf,
+ (char_u *)firstcbuf, false, curbuf);
+ tv_dict_clear(dict);
+
+ bool tl_ret = try_leave(&tstate, &err);
+ if (!tl_ret && ERROR_SET(&err)) {
+ msg_putchar('\n');
+ msg_printf_attr(HL_ATTR(HLF_E)|MSG_HIST, (char *)e_autocmd_err, err.msg);
+ api_clear_error(&err);
+ redrawcmd();
+ }
+ }
+
// 'incsearch' highlighting.
if (p_is && !cmd_silent && (s->firstc == '/' || s->firstc == '?')) {
pos_T end_pos;
@@ -1514,21 +1844,28 @@ static int command_line_changed(CommandLineState *s)
return 1;
}
s->incsearch_postponed = false;
- curwin->w_cursor = s->old_cursor; // start at old position
+ curwin->w_cursor = s->search_start; // start at old position
+ save_last_search_pattern();
// If there is no command line, don't do anything
if (ccline.cmdlen == 0) {
s->i = 0;
+ SET_NO_HLSEARCH(true); // turn off previous highlight
+ redraw_all_later(SOME_VALID);
} else {
+ int search_flags = SEARCH_OPT + SEARCH_NOOF + SEARCH_PEEK;
ui_busy_start();
ui_flush();
++emsg_off; // So it doesn't beep if bad expr
// Set the time limit to half a second.
tm = profile_setlimit(500L);
+ if (!p_hls) {
+ search_flags += SEARCH_KEEP;
+ }
s->i = do_search(NULL, s->firstc, ccline.cmdbuff, s->count,
- SEARCH_KEEP + SEARCH_OPT + SEARCH_NOOF + SEARCH_PEEK,
- &tm);
- --emsg_off;
+ search_flags,
+ &tm);
+ emsg_off--;
// if interrupted while searching, behave like it failed
if (got_int) {
(void)vpeekc(); // remove <C-C> from input stream
@@ -1559,30 +1896,30 @@ static int command_line_changed(CommandLineState *s)
if (s->i != 0) {
pos_T save_pos = curwin->w_cursor;
- // First move cursor to end of match, then to the start. This
- // moves the whole match onto the screen when 'nowrap' is set.
- curwin->w_cursor.lnum += search_match_lines;
- curwin->w_cursor.col = search_match_endcol;
- if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count) {
- curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
- coladvance((colnr_T)MAXCOL);
- }
+ s->match_start = curwin->w_cursor;
+ set_search_match(&curwin->w_cursor);
validate_cursor();
end_pos = curwin->w_cursor;
+ s->match_end = end_pos;
curwin->w_cursor = save_pos;
} else {
end_pos = curwin->w_cursor; // shutup gcc 4
}
+ // Disable 'hlsearch' highlighting if the pattern matches
+ // everything. Avoids a flash when typing "foo\|".
+ if (empty_pattern(ccline.cmdbuff)) {
+ SET_NO_HLSEARCH(true);
+ }
+
validate_cursor();
// May redraw the status line to show the cursor position.
if (p_ru && curwin->w_status_height > 0) {
curwin->w_redr_status = true;
}
- save_cmdline(&s->save_ccline);
update_screen(SOME_VALID);
- restore_cmdline(&s->save_ccline);
+ restore_last_search_pattern();
// Leave it at the end to make CTRL-R CTRL-W work.
if (s->i != 0) {
@@ -1592,6 +1929,36 @@ static int command_line_changed(CommandLineState *s)
msg_starthere();
redrawcmdline();
s->did_incsearch = true;
+ } else if (s->firstc == ':'
+ && current_SID == 0 // only if interactive
+ && *p_icm != NUL // 'inccommand' is set
+ && curbuf->b_p_ma // buffer is modifiable
+ && cmdline_star == 0 // not typing a password
+ && cmd_can_preview(ccline.cmdbuff)
+ && !vpeekc_any()) {
+ // Show 'inccommand' preview. It works like this:
+ // 1. Do the command.
+ // 2. Command implementation detects CMDPREVIEW state, then:
+ // - Update the screen while the effects are in place.
+ // - Immediately undo the effects.
+ State |= CMDPREVIEW;
+ emsg_silent++; // Block error reporting as the command may be incomplete
+ do_cmdline(ccline.cmdbuff, NULL, NULL, DOCMD_KEEPLINE|DOCMD_NOWAIT);
+ emsg_silent--; // Unblock error reporting
+
+ // Restore the window "view".
+ curwin->w_cursor = s->save_cursor;
+ curwin->w_curswant = s->old_curswant;
+ curwin->w_leftcol = s->old_leftcol;
+ curwin->w_topline = s->old_topline;
+ curwin->w_topfill = s->old_topfill;
+ curwin->w_botline = s->old_botline;
+ update_topline();
+
+ redrawcmdline();
+ } else if (State & CMDPREVIEW) {
+ State = (State & ~CMDPREVIEW);
+ update_screen(SOME_VALID); // Clear 'inccommand' preview.
}
if (cmdmsg_rl || (p_arshape && !p_tbidi && enc_utf8)) {
@@ -1599,7 +1966,8 @@ static int command_line_changed(CommandLineState *s)
// right-left typing. Not efficient, but it works.
// Do it only when there are no characters left to read
// to avoid useless intermediate redraws.
- if (vpeekc() == NUL) {
+ // if cmdline is external the ui handles shaping, no redraw needed.
+ if (!ui_is_external(kUICmdline) && vpeekc() == NUL) {
redrawcmd();
}
}
@@ -1607,6 +1975,18 @@ static int command_line_changed(CommandLineState *s)
return 1;
}
+/// Abandon the command line.
+static void abandon_cmdline(void)
+{
+ xfree(ccline.cmdbuff);
+ ccline.cmdbuff = NULL;
+ if (msg_scrolled == 0) {
+ compute_cmdrow();
+ }
+ MSG("");
+ redraw_cmdline = true;
+}
+
/*
* getcmdline() - accept a command line starting with firstc.
*
@@ -1633,44 +2013,64 @@ getcmdline (
int indent // indent for inside conditionals
)
{
- return command_line_enter(firstc, count, indent);
+ // Be prepared for situations where cmdline can be invoked recursively.
+ // That includes cmd mappings, event handlers, as well as update_screen()
+ // (custom status line eval), which all may invoke ":normal :".
+ CmdlineInfo save_ccline;
+ save_cmdline(&save_ccline);
+ char_u *retval = command_line_enter(firstc, count, indent);
+ restore_cmdline(&save_ccline);
+ return retval;
}
-/*
- * Get a command line with a prompt.
- * This is prepared to be called recursively from getcmdline() (e.g. by
- * f_input() when evaluating an expression from CTRL-R =).
- * Returns the command line in allocated memory, or NULL.
- */
-char_u *
-getcmdline_prompt (
- int firstc,
- char_u *prompt, /* command line prompt */
- int attr, /* attributes for prompt */
- int xp_context, /* type of expansion */
- char_u *xp_arg /* user-defined expansion argument */
-)
+/// Get a command line with a prompt
+///
+/// This is prepared to be called recursively from getcmdline() (e.g. by
+/// f_input() when evaluating an expression from `<C-r>=`).
+///
+/// @param[in] firstc Prompt type: e.g. '@' for input(), '>' for debug.
+/// @param[in] prompt Prompt string: what is displayed before the user text.
+/// @param[in] attr Prompt highlighting.
+/// @param[in] xp_context Type of expansion.
+/// @param[in] xp_arg User-defined expansion argument.
+/// @param[in] highlight_callback Callback used for highlighting user input.
+///
+/// @return [allocated] Command line or NULL.
+char *getcmdline_prompt(const char firstc, const char *const prompt,
+ const int attr, const int xp_context,
+ const char *const xp_arg,
+ const Callback highlight_callback)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_MALLOC
{
- char_u *s;
- struct cmdline_info save_ccline;
- int msg_col_save = msg_col;
+ const int msg_col_save = msg_col;
+ CmdlineInfo save_ccline;
save_cmdline(&save_ccline);
- ccline.cmdprompt = prompt;
+
+ ccline.prompt_id = last_prompt_id++;
+ ccline.cmdprompt = (char_u *)prompt;
ccline.cmdattr = attr;
ccline.xp_context = xp_context;
- ccline.xp_arg = xp_arg;
+ ccline.xp_arg = (char_u *)xp_arg;
ccline.input_fn = (firstc == '@');
- s = getcmdline(firstc, 1L, 0);
+ ccline.highlight_callback = highlight_callback;
+
+ int msg_silent_saved = msg_silent;
+ msg_silent = 0;
+
+ char *const ret = (char *)command_line_enter(firstc, 1L, 0);
+
restore_cmdline(&save_ccline);
- /* Restore msg_col, the prompt from input() may have changed it.
- * But only if called recursively and the commandline is therefore being
- * restored to an old one; if not, the input() prompt stays on the screen,
- * so we need its modified msg_col left intact. */
- if (ccline.cmdbuff != NULL)
+ msg_silent = msg_silent_saved;
+ // Restore msg_col, the prompt from input() may have changed it.
+ // But only if called recursively and the commandline is therefore being
+ // restored to an old one; if not, the input() prompt stays on the screen,
+ // so we need its modified msg_col left intact.
+ if (ccline.cmdbuff != NULL) {
msg_col = msg_col_save;
+ }
- return s;
+ return ret;
}
/*
@@ -1689,10 +2089,15 @@ int text_locked(void) {
*/
void text_locked_msg(void)
{
- if (cmdwin_type != 0)
- EMSG(_(e_cmdwin));
- else
- EMSG(_(e_secure));
+ EMSG(_(get_text_locked_msg()));
+}
+
+char_u * get_text_locked_msg(void) {
+ if (cmdwin_type != 0) {
+ return e_cmdwin;
+ } else {
+ return e_secure;
+ }
}
/*
@@ -1776,10 +2181,11 @@ static void set_cmdspos_cursor(void)
*/
static void correct_cmdspos(int idx, int cells)
{
- if ((*mb_ptr2len)(ccline.cmdbuff + idx) > 1
- && (*mb_ptr2cells)(ccline.cmdbuff + idx) > 1
- && ccline.cmdspos % Columns + cells > Columns)
+ if (utfc_ptr2len(ccline.cmdbuff + idx) > 1
+ && utf_ptr2cells(ccline.cmdbuff + idx) > 1
+ && ccline.cmdspos % Columns + cells > Columns) {
ccline.cmdspos++;
+ }
}
/*
@@ -1795,6 +2201,7 @@ getexline (
/* When executing a register, remove ':' that's in front of each line. */
if (exec_from_reg && vpeekc() == ':')
(void)vgetc();
+
return getcmdline(c, 1L, indent);
}
@@ -1842,7 +2249,7 @@ getexmodeline (
vcol = indent;
while (indent >= 8) {
ga_append(&line_ga, TAB);
- msg_puts((char_u *)" ");
+ msg_puts(" ");
indent -= 8;
}
while (indent-- > 0) {
@@ -1850,8 +2257,7 @@ getexmodeline (
msg_putchar(' ');
}
}
- ++no_mapping;
- ++allow_keys;
+ no_mapping++;
/*
* Get the line, one character at a time.
@@ -1863,7 +2269,13 @@ getexmodeline (
/* Get one character at a time. Don't use inchar(), it can't handle
* special characters. */
prev_char = c1;
- c1 = vgetc();
+
+ // Check for a ":normal" command and no more characters left.
+ if (ex_normal_busy > 0 && typebuf.tb_len == 0) {
+ c1 = '\n';
+ } else {
+ c1 = vgetc();
+ }
/*
* Handle line editing.
@@ -1882,14 +2294,10 @@ getexmodeline (
if (c1 == BS || c1 == K_BS || c1 == DEL || c1 == K_DEL || c1 == K_KDEL) {
if (!GA_EMPTY(&line_ga)) {
- if (has_mbyte) {
- p = (char_u *)line_ga.ga_data;
- p[line_ga.ga_len] = NUL;
- len = (*mb_head_off)(p, p + line_ga.ga_len - 1) + 1;
- line_ga.ga_len -= len;
- } else {
- line_ga.ga_len--;
- }
+ p = (char_u *)line_ga.ga_data;
+ p[line_ga.ga_len] = NUL;
+ len = utf_head_off(p, p + line_ga.ga_len - 1) + 1;
+ line_ga.ga_len -= len;
goto redraw;
}
continue;
@@ -1993,16 +2401,11 @@ redraw:
if (IS_SPECIAL(c1)) {
c1 = '?';
}
- if (has_mbyte) {
- len = (*mb_char2bytes)(c1, (char_u *)line_ga.ga_data + line_ga.ga_len);
- } else {
- len = 1;
- ((char_u *)line_ga.ga_data)[line_ga.ga_len] = c1;
- }
- if (c1 == '\n')
+ len = utf_char2bytes(c1, (char_u *)line_ga.ga_data + line_ga.ga_len);
+ if (c1 == '\n') {
msg_putchar('\n');
- else if (c1 == TAB) {
- /* Don't use chartabsize(), 'ts' can be different */
+ } else if (c1 == TAB) {
+ // Don't use chartabsize(), 'ts' can be different.
do {
msg_putchar(' ');
} while (++vcol % 8);
@@ -2041,8 +2444,7 @@ redraw:
}
}
- --no_mapping;
- --allow_keys;
+ no_mapping--;
/* make following messages go to the next line */
msg_didout = FALSE;
@@ -2057,6 +2459,18 @@ redraw:
return (char_u *)line_ga.ga_data;
}
+bool cmdline_overstrike(void)
+{
+ return ccline.overstrike;
+}
+
+
+/// Return true if the cursor is at the end of the cmdline.
+bool cmdline_at_end(void)
+{
+ return (ccline.cmdpos >= ccline.cmdlen);
+}
+
/*
* Allocate a new command line buffer.
* Assigns the new buffer to ccline.cmdbuff and ccline.cmdbufflen.
@@ -2116,75 +2530,389 @@ void free_cmdline_buf(void)
# endif
+enum { MAX_CB_ERRORS = 1 };
+
+/// Color expression cmdline using built-in expressions parser
+///
+/// @param[in] colored_ccline Command-line to color.
+/// @param[out] ret_ccline_colors What should be colored.
+///
+/// Always colors the whole cmdline.
+static void color_expr_cmdline(const CmdlineInfo *const colored_ccline,
+ ColoredCmdline *const ret_ccline_colors)
+ FUNC_ATTR_NONNULL_ALL
+{
+ ParserLine plines[] = {
+ {
+ .data = (const char *)colored_ccline->cmdbuff,
+ .size = STRLEN(colored_ccline->cmdbuff),
+ .allocated = false,
+ },
+ { NULL, 0, false },
+ };
+ ParserLine *plines_p = plines;
+ ParserHighlight colors;
+ kvi_init(colors);
+ ParserState pstate;
+ viml_parser_init(
+ &pstate, parser_simple_get_line, &plines_p, &colors);
+ ExprAST east = viml_pexpr_parse(&pstate, kExprFlagsDisallowEOC);
+ viml_pexpr_free_ast(east);
+ viml_parser_destroy(&pstate);
+ kv_resize(ret_ccline_colors->colors, kv_size(colors));
+ size_t prev_end = 0;
+ for (size_t i = 0 ; i < kv_size(colors) ; i++) {
+ const ParserHighlightChunk chunk = kv_A(colors, i);
+ if (chunk.start.col != prev_end) {
+ kv_push(ret_ccline_colors->colors, ((CmdlineColorChunk) {
+ .start = prev_end,
+ .end = chunk.start.col,
+ .attr = 0,
+ }));
+ }
+ const int id = syn_name2id((const char_u *)chunk.group);
+ const int attr = (id == 0 ? 0 : syn_id2attr(id));
+ kv_push(ret_ccline_colors->colors, ((CmdlineColorChunk) {
+ .start = chunk.start.col,
+ .end = chunk.end_col,
+ .attr = attr,
+ }));
+ prev_end = chunk.end_col;
+ }
+ if (prev_end < (size_t)colored_ccline->cmdlen) {
+ kv_push(ret_ccline_colors->colors, ((CmdlineColorChunk) {
+ .start = prev_end,
+ .end = (size_t)colored_ccline->cmdlen,
+ .attr = 0,
+ }));
+ }
+ kvi_destroy(colors);
+}
+
+/// Color command-line
+///
+/// Should use built-in command parser or user-specified one. Currently only the
+/// latter is supported.
+///
+/// @param[in,out] colored_ccline Command-line to color. Also holds a cache:
+/// if ->prompt_id and ->cmdbuff values happen
+/// to be equal to those from colored_cmdline it
+/// will just do nothing, assuming that ->colors
+/// already contains needed data.
+///
+/// Always colors the whole cmdline.
+///
+/// @return true if draw_cmdline may proceed, false if it does not need anything
+/// to do.
+static bool color_cmdline(CmdlineInfo *colored_ccline)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ bool printed_errmsg = false;
+
+#define PRINT_ERRMSG(...) \
+ do { \
+ msg_putchar('\n'); \
+ msg_printf_attr(HL_ATTR(HLF_E)|MSG_HIST, __VA_ARGS__); \
+ printed_errmsg = true; \
+ } while (0)
+ bool ret = true;
+
+ ColoredCmdline *ccline_colors = &colored_ccline->last_colors;
+
+ // Check whether result of the previous call is still valid.
+ if (ccline_colors->prompt_id == colored_ccline->prompt_id
+ && ccline_colors->cmdbuff != NULL
+ && STRCMP(ccline_colors->cmdbuff, colored_ccline->cmdbuff) == 0) {
+ return ret;
+ }
+
+ kv_size(ccline_colors->colors) = 0;
+
+ if (colored_ccline->cmdbuff == NULL || *colored_ccline->cmdbuff == NUL) {
+ // Nothing to do, exiting.
+ xfree(ccline_colors->cmdbuff);
+ ccline_colors->cmdbuff = NULL;
+ return ret;
+ }
+
+ bool arg_allocated = false;
+ typval_T arg = {
+ .v_type = VAR_STRING,
+ .vval.v_string = colored_ccline->cmdbuff,
+ };
+ typval_T tv = { .v_type = VAR_UNKNOWN };
+
+ static unsigned prev_prompt_id = UINT_MAX;
+ static int prev_prompt_errors = 0;
+ Callback color_cb = CALLBACK_NONE;
+ bool can_free_cb = false;
+ TryState tstate;
+ Error err = ERROR_INIT;
+ const char *err_errmsg = (const char *)e_intern2;
+ bool dgc_ret = true;
+ bool tl_ret = true;
+
+ if (colored_ccline->prompt_id != prev_prompt_id) {
+ prev_prompt_errors = 0;
+ prev_prompt_id = colored_ccline->prompt_id;
+ } else if (prev_prompt_errors >= MAX_CB_ERRORS) {
+ goto color_cmdline_end;
+ }
+ if (colored_ccline->highlight_callback.type != kCallbackNone) {
+ // Currently this should only happen while processing input() prompts.
+ assert(colored_ccline->input_fn);
+ color_cb = colored_ccline->highlight_callback;
+ } else if (colored_ccline->cmdfirstc == ':') {
+ try_enter(&tstate);
+ err_errmsg = N_(
+ "E5408: Unable to get g:Nvim_color_cmdline callback: %s");
+ dgc_ret = tv_dict_get_callback(&globvardict, S_LEN("Nvim_color_cmdline"),
+ &color_cb);
+ tl_ret = try_leave(&tstate, &err);
+ can_free_cb = true;
+ } else if (colored_ccline->cmdfirstc == '=') {
+ color_expr_cmdline(colored_ccline, ccline_colors);
+ }
+ if (!tl_ret || !dgc_ret) {
+ goto color_cmdline_error;
+ }
+
+ if (color_cb.type == kCallbackNone) {
+ goto color_cmdline_end;
+ }
+ if (colored_ccline->cmdbuff[colored_ccline->cmdlen] != NUL) {
+ arg_allocated = true;
+ arg.vval.v_string = xmemdupz((const char *)colored_ccline->cmdbuff,
+ (size_t)colored_ccline->cmdlen);
+ }
+ // msg_start() called by e.g. :echo may shift command-line to the first column
+ // even though msg_silent is here. Two ways to workaround this problem without
+ // altering message.c: use full_screen or save and restore msg_col.
+ //
+ // Saving and restoring full_screen does not work well with :redraw!. Saving
+ // and restoring msg_col is neither ideal, but while with full_screen it
+ // appears shifted one character to the right and cursor position is no longer
+ // correct, with msg_col it just misses leading `:`. Since `redraw!` in
+ // callback lags this is least of the user problems.
+ //
+ // Also using try_enter() because error messages may overwrite typed
+ // command-line which is not expected.
+ getln_interrupted_highlight = false;
+ try_enter(&tstate);
+ err_errmsg = N_("E5407: Callback has thrown an exception: %s");
+ const int saved_msg_col = msg_col;
+ msg_silent++;
+ const bool cbcall_ret = callback_call(&color_cb, 1, &arg, &tv);
+ msg_silent--;
+ msg_col = saved_msg_col;
+ if (got_int) {
+ getln_interrupted_highlight = true;
+ }
+ if (!try_leave(&tstate, &err) || !cbcall_ret) {
+ goto color_cmdline_error;
+ }
+ if (tv.v_type != VAR_LIST) {
+ PRINT_ERRMSG(_("E5400: Callback should return list"));
+ goto color_cmdline_error;
+ }
+ if (tv.vval.v_list == NULL) {
+ goto color_cmdline_end;
+ }
+ varnumber_T prev_end = 0;
+ int i = 0;
+ TV_LIST_ITER_CONST(tv.vval.v_list, li, {
+ if (TV_LIST_ITEM_TV(li)->v_type != VAR_LIST) {
+ PRINT_ERRMSG(_("E5401: List item %i is not a List"), i);
+ goto color_cmdline_error;
+ }
+ const list_T *const l = TV_LIST_ITEM_TV(li)->vval.v_list;
+ if (tv_list_len(l) != 3) {
+ PRINT_ERRMSG(_("E5402: List item %i has incorrect length: %d /= 3"),
+ i, tv_list_len(l));
+ goto color_cmdline_error;
+ }
+ bool error = false;
+ const varnumber_T start = (
+ tv_get_number_chk(TV_LIST_ITEM_TV(tv_list_first(l)), &error));
+ if (error) {
+ goto color_cmdline_error;
+ } else if (!(prev_end <= start && start < colored_ccline->cmdlen)) {
+ PRINT_ERRMSG(_("E5403: Chunk %i start %" PRIdVARNUMBER " not in range "
+ "[%" PRIdVARNUMBER ", %i)"),
+ i, start, prev_end, colored_ccline->cmdlen);
+ goto color_cmdline_error;
+ } else if (utf8len_tab_zero[(uint8_t)colored_ccline->cmdbuff[start]] == 0) {
+ PRINT_ERRMSG(_("E5405: Chunk %i start %" PRIdVARNUMBER " splits "
+ "multibyte character"), i, start);
+ goto color_cmdline_error;
+ }
+ if (start != prev_end) {
+ kv_push(ccline_colors->colors, ((CmdlineColorChunk) {
+ .start = prev_end,
+ .end = start,
+ .attr = 0,
+ }));
+ }
+ const varnumber_T end = tv_get_number_chk(
+ TV_LIST_ITEM_TV(TV_LIST_ITEM_NEXT(l, tv_list_first(l))), &error);
+ if (error) {
+ goto color_cmdline_error;
+ } else if (!(start < end && end <= colored_ccline->cmdlen)) {
+ PRINT_ERRMSG(_("E5404: Chunk %i end %" PRIdVARNUMBER " not in range "
+ "(%" PRIdVARNUMBER ", %i]"),
+ i, end, start, colored_ccline->cmdlen);
+ goto color_cmdline_error;
+ } else if (end < colored_ccline->cmdlen
+ && (utf8len_tab_zero[(uint8_t)colored_ccline->cmdbuff[end]]
+ == 0)) {
+ PRINT_ERRMSG(_("E5406: Chunk %i end %" PRIdVARNUMBER " splits multibyte "
+ "character"), i, end);
+ goto color_cmdline_error;
+ }
+ prev_end = end;
+ const char *const group = tv_get_string_chk(
+ TV_LIST_ITEM_TV(tv_list_last(l)));
+ if (group == NULL) {
+ goto color_cmdline_error;
+ }
+ const int id = syn_name2id((char_u *)group);
+ const int attr = (id == 0 ? 0 : syn_id2attr(id));
+ kv_push(ccline_colors->colors, ((CmdlineColorChunk) {
+ .start = start,
+ .end = end,
+ .attr = attr,
+ }));
+ i++;
+ });
+ if (prev_end < colored_ccline->cmdlen) {
+ kv_push(ccline_colors->colors, ((CmdlineColorChunk) {
+ .start = prev_end,
+ .end = colored_ccline->cmdlen,
+ .attr = 0,
+ }));
+ }
+ prev_prompt_errors = 0;
+color_cmdline_end:
+ assert(!ERROR_SET(&err));
+ if (can_free_cb) {
+ callback_free(&color_cb);
+ }
+ xfree(ccline_colors->cmdbuff);
+ // Note: errors โ€œoutputโ€ is cached just as well as regular results.
+ ccline_colors->prompt_id = colored_ccline->prompt_id;
+ if (arg_allocated) {
+ ccline_colors->cmdbuff = (char *)arg.vval.v_string;
+ } else {
+ ccline_colors->cmdbuff = xmemdupz((const char *)colored_ccline->cmdbuff,
+ (size_t)colored_ccline->cmdlen);
+ }
+ tv_clear(&tv);
+ return ret;
+color_cmdline_error:
+ if (ERROR_SET(&err)) {
+ PRINT_ERRMSG(_(err_errmsg), err.msg);
+ api_clear_error(&err);
+ }
+ assert(printed_errmsg);
+ (void)printed_errmsg;
+
+ prev_prompt_errors++;
+ kv_size(ccline_colors->colors) = 0;
+ redrawcmdline();
+ ret = false;
+ goto color_cmdline_end;
+#undef PRINT_ERRMSG
+}
+
/*
* Draw part of the cmdline at the current cursor position. But draw stars
* when cmdline_star is TRUE.
*/
static void draw_cmdline(int start, int len)
{
- int i;
+ if (!color_cmdline(&ccline)) {
+ return;
+ }
- if (cmdline_star > 0)
- for (i = 0; i < len; ++i) {
+ if (ui_is_external(kUICmdline)) {
+ ccline.special_char = NUL;
+ ccline.redraw_state = kCmdRedrawAll;
+ return;
+ }
+
+ if (cmdline_star > 0) {
+ for (int i = 0; i < len; i++) {
msg_putchar('*');
- if (has_mbyte)
+ if (has_mbyte) {
i += (*mb_ptr2len)(ccline.cmdbuff + start + i) - 1;
+ }
}
- else if (p_arshape && !p_tbidi && enc_utf8 && len > 0) {
- static int buflen = 0;
- char_u *p;
- int j;
- int newlen = 0;
+ } else if (p_arshape && !p_tbidi && enc_utf8 && len > 0) {
+ bool do_arabicshape = false;
int mb_l;
- int pc, pc1 = 0;
- int prev_c = 0;
- int prev_c1 = 0;
- int u8c;
- int u8cc[MAX_MCO];
- int nc = 0;
+ for (int i = start; i < start + len; i += mb_l) {
+ char_u *p = ccline.cmdbuff + i;
+ int u8cc[MAX_MCO];
+ int u8c = utfc_ptr2char_len(p, u8cc, start + len - i);
+ mb_l = utfc_ptr2len_len(p, start + len - i);
+ if (arabic_char(u8c)) {
+ do_arabicshape = true;
+ break;
+ }
+ }
+ if (!do_arabicshape) {
+ goto draw_cmdline_no_arabicshape;
+ }
- /*
- * Do arabic shaping into a temporary buffer. This is very
- * inefficient!
- */
+ static int buflen = 0;
+
+ // Do arabic shaping into a temporary buffer. This is very
+ // inefficient!
if (len * 2 + 2 > buflen) {
- /* Re-allocate the buffer. We keep it around to avoid a lot of
- * alloc()/free() calls. */
+ // Re-allocate the buffer. We keep it around to avoid a lot of
+ // alloc()/free() calls.
xfree(arshape_buf);
buflen = len * 2 + 2;
arshape_buf = xmalloc(buflen);
}
+ int newlen = 0;
if (utf_iscomposing(utf_ptr2char(ccline.cmdbuff + start))) {
- /* Prepend a space to draw the leading composing char on. */
+ // Prepend a space to draw the leading composing char on.
arshape_buf[0] = ' ';
newlen = 1;
}
- for (j = start; j < start + len; j += mb_l) {
- p = ccline.cmdbuff + j;
- u8c = utfc_ptr2char_len(p, u8cc, start + len - j);
- mb_l = utfc_ptr2len_len(p, start + len - j);
+ int prev_c = 0;
+ int prev_c1 = 0;
+ for (int i = start; i < start + len; i += mb_l) {
+ char_u *p = ccline.cmdbuff + i;
+ int u8cc[MAX_MCO];
+ int u8c = utfc_ptr2char_len(p, u8cc, start + len - i);
+ mb_l = utfc_ptr2len_len(p, start + len - i);
if (arabic_char(u8c)) {
- /* Do Arabic shaping. */
+ int pc;
+ int pc1 = 0;
+ int nc = 0;
+ // Do Arabic shaping.
if (cmdmsg_rl) {
- /* displaying from right to left */
+ // Displaying from right to left.
pc = prev_c;
pc1 = prev_c1;
prev_c1 = u8cc[0];
- if (j + mb_l >= start + len)
+ if (i + mb_l >= start + len) {
nc = NUL;
- else
+ } else {
nc = utf_ptr2char(p + mb_l);
+ }
} else {
- /* displaying from left to right */
- if (j + mb_l >= start + len)
+ // Displaying from left to right.
+ if (i + mb_l >= start + len) {
pc = NUL;
- else {
+ } else {
int pcc[MAX_MCO];
- pc = utfc_ptr2char_len(p + mb_l, pcc,
- start + len - j - mb_l);
+ pc = utfc_ptr2char_len(p + mb_l, pcc, start + len - i - mb_l);
pc1 = pcc[0];
}
nc = prev_c;
@@ -2193,12 +2921,12 @@ static void draw_cmdline(int start, int len)
u8c = arabic_shape(u8c, NULL, &u8cc[0], pc, pc1, nc);
- newlen += (*mb_char2bytes)(u8c, arshape_buf + newlen);
+ newlen += utf_char2bytes(u8c, arshape_buf + newlen);
if (u8cc[0] != 0) {
- newlen += (*mb_char2bytes)(u8cc[0], arshape_buf + newlen);
- if (u8cc[1] != 0)
- newlen += (*mb_char2bytes)(u8cc[1],
- arshape_buf + newlen);
+ newlen += utf_char2bytes(u8cc[0], arshape_buf + newlen);
+ if (u8cc[1] != 0) {
+ newlen += utf_char2bytes(u8cc[1], arshape_buf + newlen);
+ }
}
} else {
prev_c = u8c;
@@ -2208,8 +2936,139 @@ static void draw_cmdline(int start, int len)
}
msg_outtrans_len(arshape_buf, newlen);
- } else
- msg_outtrans_len(ccline.cmdbuff + start, len);
+ } else {
+draw_cmdline_no_arabicshape:
+ if (kv_size(ccline.last_colors.colors)) {
+ for (size_t i = 0; i < kv_size(ccline.last_colors.colors); i++) {
+ CmdlineColorChunk chunk = kv_A(ccline.last_colors.colors, i);
+ if (chunk.end <= start) {
+ continue;
+ }
+ const int chunk_start = MAX(chunk.start, start);
+ msg_outtrans_len_attr(ccline.cmdbuff + chunk_start,
+ chunk.end - chunk_start,
+ chunk.attr);
+ }
+ } else {
+ msg_outtrans_len(ccline.cmdbuff + start, len);
+ }
+ }
+}
+
+static void ui_ext_cmdline_show(CmdlineInfo *line)
+{
+ Array content = ARRAY_DICT_INIT;
+ if (cmdline_star) {
+ size_t len = 0;
+ for (char_u *p = ccline.cmdbuff; *p; MB_PTR_ADV(p)) {
+ len++;
+ }
+ char *buf = xmallocz(len);
+ memset(buf, '*', len);
+ Array item = ARRAY_DICT_INIT;
+ ADD(item, INTEGER_OBJ(0));
+ ADD(item, STRING_OBJ(((String) { .data = buf, .size = len })));
+ ADD(content, ARRAY_OBJ(item));
+ } else if (kv_size(line->last_colors.colors)) {
+ for (size_t i = 0; i < kv_size(line->last_colors.colors); i++) {
+ CmdlineColorChunk chunk = kv_A(line->last_colors.colors, i);
+ Array item = ARRAY_DICT_INIT;
+ ADD(item, INTEGER_OBJ(chunk.attr));
+
+ ADD(item, STRING_OBJ(cbuf_to_string((char *)line->cmdbuff + chunk.start,
+ chunk.end-chunk.start)));
+ ADD(content, ARRAY_OBJ(item));
+ }
+ } else {
+ Array item = ARRAY_DICT_INIT;
+ ADD(item, INTEGER_OBJ(0));
+ ADD(item, STRING_OBJ(cstr_to_string((char *)(line->cmdbuff))));
+ ADD(content, ARRAY_OBJ(item));
+ }
+ ui_call_cmdline_show(content, line->cmdpos,
+ cchar_to_string((char)line->cmdfirstc),
+ cstr_to_string((char *)(line->cmdprompt)),
+ line->cmdindent,
+ line->level);
+ if (line->special_char) {
+ ui_call_cmdline_special_char(cchar_to_string((char)(line->special_char)),
+ line->special_shift,
+ line->level);
+ }
+}
+
+void ui_ext_cmdline_block_append(int indent, const char *line)
+{
+ char *buf = xmallocz(indent + strlen(line));
+ memset(buf, ' ', indent);
+ memcpy(buf + indent, line, strlen(line)); // -V575
+
+ Array item = ARRAY_DICT_INIT;
+ ADD(item, INTEGER_OBJ(0));
+ ADD(item, STRING_OBJ(cstr_as_string(buf)));
+ Array content = ARRAY_DICT_INIT;
+ ADD(content, ARRAY_OBJ(item));
+ ADD(cmdline_block, ARRAY_OBJ(content));
+ if (cmdline_block.size > 1) {
+ ui_call_cmdline_block_append(copy_array(content));
+ } else {
+ ui_call_cmdline_block_show(copy_array(cmdline_block));
+ }
+}
+
+void ui_ext_cmdline_block_leave(void)
+{
+ api_free_array(cmdline_block);
+ cmdline_block = (Array)ARRAY_DICT_INIT;
+ ui_call_cmdline_block_hide();
+}
+
+/// Extra redrawing needed for redraw! and on ui_attach
+/// assumes "redrawcmdline()" will already be invoked
+void cmdline_screen_cleared(void)
+{
+ if (!ui_is_external(kUICmdline)) {
+ return;
+ }
+
+ if (cmdline_block.size) {
+ ui_call_cmdline_block_show(copy_array(cmdline_block));
+ }
+
+ int prev_level = ccline.level-1;
+ CmdlineInfo *line = ccline.prev_ccline;
+ while (prev_level > 0 && line) {
+ if (line->level == prev_level) {
+ // don't redraw a cmdline already shown in the cmdline window
+ if (prev_level != cmdwin_level) {
+ line->redraw_state = kCmdRedrawAll;
+ }
+ prev_level--;
+ }
+ line = line->prev_ccline;
+ }
+}
+
+/// called by ui_flush, do what redraws neccessary to keep cmdline updated.
+void cmdline_ui_flush(void)
+{
+ if (!ui_is_external(kUICmdline)) {
+ return;
+ }
+ int level = ccline.level;
+ CmdlineInfo *line = &ccline;
+ while (level > 0 && line) {
+ if (line->level == level) {
+ if (line->redraw_state == kCmdRedrawAll) {
+ ui_ext_cmdline_show(line);
+ } else if (line->redraw_state == kCmdRedrawPos) {
+ ui_call_cmdline_pos(line->cmdpos, line->level);
+ }
+ line->redraw_state = kCmdRedrawNone;
+ level--;
+ }
+ line = line->prev_ccline;
+ }
}
/*
@@ -2219,33 +3078,43 @@ static void draw_cmdline(int start, int len)
*/
void putcmdline(int c, int shift)
{
- if (cmd_silent)
+ if (cmd_silent) {
return;
- msg_no_more = TRUE;
- msg_putchar(c);
- if (shift)
- draw_cmdline(ccline.cmdpos, ccline.cmdlen - ccline.cmdpos);
- msg_no_more = FALSE;
+ }
+ if (!ui_is_external(kUICmdline)) {
+ msg_no_more = true;
+ msg_putchar(c);
+ if (shift) {
+ draw_cmdline(ccline.cmdpos, ccline.cmdlen - ccline.cmdpos);
+ }
+ msg_no_more = false;
+ } else {
+ ccline.special_char = c;
+ ccline.special_shift = shift;
+ if (ccline.redraw_state != kCmdRedrawAll) {
+ ui_call_cmdline_special_char(cchar_to_string((char)(c)), shift,
+ ccline.level);
+ }
+ }
cursorcmd();
+ ui_cursor_shape();
}
-/*
- * Undo a putcmdline(c, FALSE).
- */
+/// Undo a putcmdline(c, FALSE).
void unputcmdline(void)
{
- if (cmd_silent)
+ if (cmd_silent) {
return;
- msg_no_more = TRUE;
- if (ccline.cmdlen == ccline.cmdpos)
+ }
+ msg_no_more = true;
+ if (ccline.cmdlen == ccline.cmdpos && !ui_is_external(kUICmdline)) {
msg_putchar(' ');
- else if (has_mbyte)
- draw_cmdline(ccline.cmdpos,
- (*mb_ptr2len)(ccline.cmdbuff + ccline.cmdpos));
- else
- draw_cmdline(ccline.cmdpos, 1);
- msg_no_more = FALSE;
+ } else {
+ draw_cmdline(ccline.cmdpos, mb_ptr2len(ccline.cmdbuff + ccline.cmdpos));
+ }
+ msg_no_more = false;
cursorcmd();
+ ui_cursor_shape();
}
/*
@@ -2302,18 +3171,15 @@ void put_on_cmdline(char_u *str, int len, int redraw)
i = 0;
c = utf_ptr2char(ccline.cmdbuff + ccline.cmdpos);
while (ccline.cmdpos > 0 && utf_iscomposing(c)) {
- i = (*mb_head_off)(ccline.cmdbuff,
- ccline.cmdbuff + ccline.cmdpos - 1) + 1;
+ i = utf_head_off(ccline.cmdbuff, ccline.cmdbuff + ccline.cmdpos - 1) + 1;
ccline.cmdpos -= i;
len += i;
c = utf_ptr2char(ccline.cmdbuff + ccline.cmdpos);
}
if (i == 0 && ccline.cmdpos > 0 && arabic_maycombine(c)) {
- /* Check the previous character for Arabic combining pair. */
- i = (*mb_head_off)(ccline.cmdbuff,
- ccline.cmdbuff + ccline.cmdpos - 1) + 1;
- if (arabic_combine(utf_ptr2char(ccline.cmdbuff
- + ccline.cmdpos - i), c)) {
+ // Check the previous character for Arabic combining pair.
+ i = utf_head_off(ccline.cmdbuff, ccline.cmdbuff + ccline.cmdpos - 1) + 1;
+ if (arabic_combine(utf_ptr2char(ccline.cmdbuff + ccline.cmdpos - i), c)) {
ccline.cmdpos -= i;
len += i;
} else
@@ -2377,9 +3243,6 @@ void put_on_cmdline(char_u *str, int len, int redraw)
msg_check();
}
-static struct cmdline_info prev_ccline;
-static int prev_ccline_used = FALSE;
-
/*
* Save ccline, because obtaining the "=" register may execute "normal :cmd"
* and overwrite it. But get_cmdline_str() may need it, thus make it
@@ -2387,15 +3250,13 @@ static int prev_ccline_used = FALSE;
*/
static void save_cmdline(struct cmdline_info *ccp)
{
- if (!prev_ccline_used) {
- memset(&prev_ccline, 0, sizeof(struct cmdline_info));
- prev_ccline_used = TRUE;
- }
- *ccp = prev_ccline;
- prev_ccline = ccline;
+ *ccp = ccline;
+ ccline.prev_ccline = ccp;
ccline.cmdbuff = NULL;
ccline.cmdprompt = NULL;
ccline.xpc = NULL;
+ ccline.special_char = NUL;
+ ccline.level = 0;
}
/*
@@ -2403,8 +3264,7 @@ static void save_cmdline(struct cmdline_info *ccp)
*/
static void restore_cmdline(struct cmdline_info *ccp)
{
- ccline = prev_ccline;
- prev_ccline = *ccp;
+ ccline = *ccp;
}
/*
@@ -2439,17 +3299,18 @@ void restore_cmdline_alloc(char_u *p)
/// @returns FAIL for failure, OK otherwise
static bool cmdline_paste(int regname, bool literally, bool remcr)
{
- long i;
char_u *arg;
char_u *p;
- int allocated;
+ bool allocated;
struct cmdline_info save_ccline;
/* check for valid regname; also accept special characters for CTRL-R in
* the command line */
if (regname != Ctrl_F && regname != Ctrl_P && regname != Ctrl_W
- && regname != Ctrl_A && !valid_yank_reg(regname, false))
+ && regname != Ctrl_A && regname != Ctrl_L
+ && !valid_yank_reg(regname, false)) {
return FAIL;
+ }
/* A register containing CTRL-R can cause an endless loop. Allow using
* CTRL-C to break the loop. */
@@ -2461,9 +3322,9 @@ static bool cmdline_paste(int regname, bool literally, bool remcr)
/* Need to save and restore ccline. And set "textlock" to avoid nasty
* things like going to another buffer when evaluating an expression. */
save_cmdline(&save_ccline);
- ++textlock;
- i = get_spec_reg(regname, &arg, &allocated, TRUE);
- --textlock;
+ textlock++;
+ const bool i = get_spec_reg(regname, &arg, &allocated, true);
+ textlock--;
restore_cmdline(&save_ccline);
if (i) {
@@ -2480,16 +3341,11 @@ static bool cmdline_paste(int regname, bool literally, bool remcr)
/* Locate start of last word in the cmd buffer. */
for (w = ccline.cmdbuff + ccline.cmdpos; w > ccline.cmdbuff; ) {
- if (has_mbyte) {
- len = (*mb_head_off)(ccline.cmdbuff, w - 1) + 1;
- if (!vim_iswordc(mb_ptr2char(w - len)))
- break;
- w -= len;
- } else {
- if (!vim_iswordc(w[-1]))
- break;
- --w;
+ len = utf_head_off(ccline.cmdbuff, w - 1) + 1;
+ if (!vim_iswordc(utf_ptr2char(w - len))) {
+ break;
}
+ w -= len;
}
len = (int)((ccline.cmdbuff + ccline.cmdpos) - w);
if (p_ic ? STRNICMP(w, arg, len) == 0 : STRNCMP(w, arg, len) == 0)
@@ -2520,19 +3376,19 @@ void cmdline_paste_str(char_u *s, int literally)
else
while (*s != NUL) {
cv = *s;
- if (cv == Ctrl_V && s[1])
- ++s;
- if (has_mbyte)
- c = mb_cptr2char_adv(&s);
- else
+ if (cv == Ctrl_V && s[1]) {
+ s++;
+ }
+ if (has_mbyte) {
+ c = mb_cptr2char_adv((const char_u **)&s);
+ } else {
c = *s++;
+ }
if (cv == Ctrl_V || c == ESC || c == Ctrl_C
|| c == CAR || c == NL || c == Ctrl_L
-#ifdef UNIX
- || c == intr_char
-#endif
- || (c == Ctrl_BSL && *s == Ctrl_N))
+ || (c == Ctrl_BSL && *s == Ctrl_N)) {
stuffcharReadbuff(Ctrl_V);
+ }
stuffcharReadbuff(c);
}
}
@@ -2549,10 +3405,9 @@ static void cmdline_del(int from)
ccline.cmdpos = from;
}
-/*
- * this function is called when the screen size changes and with incremental
- * search
- */
+// This function is called when the screen size changes and with incremental
+// search and in other situations where the command line may have been
+// overwritten.
void redrawcmdline(void)
{
if (cmd_silent)
@@ -2561,6 +3416,7 @@ void redrawcmdline(void)
compute_cmdrow();
redrawcmd();
cursorcmd();
+ ui_cursor_shape();
}
static void redrawcmdprompt(void)
@@ -2569,17 +3425,25 @@ static void redrawcmdprompt(void)
if (cmd_silent)
return;
- if (ccline.cmdfirstc != NUL)
+ if (ui_is_external(kUICmdline)) {
+ ccline.redraw_state = kCmdRedrawAll;
+ return;
+ }
+ if (ccline.cmdfirstc != NUL) {
msg_putchar(ccline.cmdfirstc);
+ }
if (ccline.cmdprompt != NULL) {
- msg_puts_attr(ccline.cmdprompt, ccline.cmdattr);
+ msg_puts_attr((const char *)ccline.cmdprompt, ccline.cmdattr);
ccline.cmdindent = msg_col + (msg_row - cmdline_row) * Columns;
- /* do the reverse of set_cmdspos() */
- if (ccline.cmdfirstc != NUL)
- --ccline.cmdindent;
- } else
- for (i = ccline.cmdindent; i > 0; --i)
+ // do the reverse of set_cmdspos()
+ if (ccline.cmdfirstc != NUL) {
+ ccline.cmdindent--;
+ }
+ } else {
+ for (i = ccline.cmdindent; i > 0; i--) {
msg_putchar(' ');
+ }
+ }
}
/*
@@ -2590,6 +3454,11 @@ void redrawcmd(void)
if (cmd_silent)
return;
+ if (ui_is_external(kUICmdline)) {
+ draw_cmdline(0, ccline.cmdlen);
+ return;
+ }
+
/* when 'incsearch' is set there may be no command line while redrawing */
if (ccline.cmdbuff == NULL) {
ui_cursor_goto(cmdline_row, 0);
@@ -2633,6 +3502,14 @@ static void cursorcmd(void)
if (cmd_silent)
return;
+ if (ui_is_external(kUICmdline)) {
+ if (ccline.redraw_state < kCmdRedrawPos) {
+ ccline.redraw_state = kCmdRedrawPos;
+ }
+ setcursor();
+ return;
+ }
+
if (cmdmsg_rl) {
msg_row = cmdline_row + (ccline.cmdspos / (int)(Columns - 1));
msg_col = (int)Columns - (ccline.cmdspos % (int)(Columns - 1)) - 1;
@@ -2650,6 +3527,9 @@ static void cursorcmd(void)
void gotocmdline(int clr)
{
+ if (ui_is_external(kUICmdline)) {
+ return;
+ }
msg_start();
if (cmdmsg_rl)
msg_col = Columns - 1;
@@ -2668,10 +3548,28 @@ void gotocmdline(int clr)
*/
static int ccheck_abbr(int c)
{
- if (p_paste || no_abbr) /* no abbreviations or in paste mode */
- return FALSE;
+ int spos = 0;
- return check_abbr(c, ccline.cmdbuff, ccline.cmdpos, 0);
+ if (p_paste || no_abbr) { // no abbreviations or in paste mode
+ return false;
+ }
+
+ // Do not consider '<,'> be part of the mapping, skip leading whitespace.
+ // Actually accepts any mark.
+ while (ascii_iswhite(ccline.cmdbuff[spos]) && spos < ccline.cmdlen) {
+ spos++;
+ }
+ if (ccline.cmdlen - spos > 5
+ && ccline.cmdbuff[spos] == '\''
+ && ccline.cmdbuff[spos + 2] == ','
+ && ccline.cmdbuff[spos + 3] == '\'') {
+ spos += 5;
+ } else {
+ // check abbreviation from the beginning of the commandline
+ spos = 0;
+ }
+
+ return check_abbr(c, ccline.cmdbuff, ccline.cmdpos, spos);
}
static int sort_func_compare(const void *s1, const void *s2)
@@ -2717,47 +3615,42 @@ nextwild (
return FAIL;
}
- MSG_PUTS("..."); /* show that we are busy */
- ui_flush();
+ if (!ui_is_external(kUIWildmenu)) {
+ MSG_PUTS("..."); // show that we are busy
+ ui_flush();
+ }
i = (int)(xp->xp_pattern - ccline.cmdbuff);
xp->xp_pattern_len = ccline.cmdpos - i;
if (type == WILD_NEXT || type == WILD_PREV) {
- /*
- * Get next/previous match for a previous expanded pattern.
- */
+ // Get next/previous match for a previous expanded pattern.
p2 = ExpandOne(xp, NULL, NULL, 0, type);
} else {
- /*
- * Translate string into pattern and expand it.
- */
- if ((p1 = addstar(xp->xp_pattern, xp->xp_pattern_len,
- xp->xp_context)) == NULL)
- p2 = NULL;
- else {
- int use_options = options |
- WILD_HOME_REPLACE|WILD_ADD_SLASH|WILD_SILENT;
- if (escape)
- use_options |= WILD_ESCAPE;
-
- if (p_wic)
- use_options += WILD_ICASE;
- p2 = ExpandOne(xp, p1,
- vim_strnsave(&ccline.cmdbuff[i], xp->xp_pattern_len),
- use_options, type);
- xfree(p1);
- /* longest match: make sure it is not shorter, happens with :help */
- if (p2 != NULL && type == WILD_LONGEST) {
- for (j = 0; j < xp->xp_pattern_len; ++j)
- if (ccline.cmdbuff[i + j] == '*'
- || ccline.cmdbuff[i + j] == '?')
- break;
- if ((int)STRLEN(p2) < j) {
- xfree(p2);
- p2 = NULL;
+ // Translate string into pattern and expand it.
+ p1 = addstar(xp->xp_pattern, xp->xp_pattern_len, xp->xp_context);
+ const int use_options = (
+ options
+ | WILD_HOME_REPLACE
+ | WILD_ADD_SLASH
+ | WILD_SILENT
+ | (escape ? WILD_ESCAPE : 0)
+ | (p_wic ? WILD_ICASE : 0));
+ p2 = ExpandOne(xp, p1, vim_strnsave(&ccline.cmdbuff[i], xp->xp_pattern_len),
+ use_options, type);
+ xfree(p1);
+ // Longest match: make sure it is not shorter, happens with :help.
+ if (p2 != NULL && type == WILD_LONGEST) {
+ for (j = 0; j < xp->xp_pattern_len; j++) {
+ if (ccline.cmdbuff[i + j] == '*'
+ || ccline.cmdbuff[i + j] == '?') {
+ break;
}
}
+ if ((int)STRLEN(p2) < j) {
+ xfree(p2);
+ p2 = NULL;
+ }
}
}
@@ -2871,11 +3764,17 @@ ExpandOne (
else
findex = -1;
}
- if (p_wmnu)
- win_redr_status_matches(xp, xp->xp_numfiles, xp->xp_files,
- findex, cmd_showtail);
- if (findex == -1)
+ if (p_wmnu) {
+ if (ui_is_external(kUIWildmenu)) {
+ ui_call_wildmenu_select(findex);
+ } else {
+ win_redr_status_matches(xp, xp->xp_numfiles, xp->xp_files,
+ findex, cmd_showtail);
+ }
+ }
+ if (findex == -1) {
return vim_strsave(orig_save);
+ }
return vim_strsave(xp->xp_files[findex]);
} else
return NULL;
@@ -2959,30 +3858,19 @@ ExpandOne (
// Find longest common part
if (mode == WILD_LONGEST && xp->xp_numfiles > 0) {
- size_t len;
- size_t mb_len = 1;
- int c0;
- int ci;
+ size_t len = 0;
- for (len = 0; xp->xp_files[0][len]; len += mb_len) {
- if (has_mbyte) {
- mb_len = (* mb_ptr2len)(&xp->xp_files[0][len]);
- c0 = (* mb_ptr2char)(&xp->xp_files[0][len]);
- } else {
- c0 = xp->xp_files[0][len];
- }
- for (i = 1; i < xp->xp_numfiles; ++i) {
- if (has_mbyte) {
- ci =(* mb_ptr2char)(&xp->xp_files[i][len]);
- } else {
- ci = xp->xp_files[i][len];
- }
+ for (size_t mb_len; xp->xp_files[0][len]; len += mb_len) {
+ mb_len = utfc_ptr2len(&xp->xp_files[0][len]);
+ int c0 = utf_ptr2char(&xp->xp_files[0][len]);
+ for (i = 1; i < xp->xp_numfiles; i++) {
+ int ci = utf_ptr2char(&xp->xp_files[i][len]);
if (p_fic && (xp->xp_context == EXPAND_DIRECTORIES
|| xp->xp_context == EXPAND_FILES
|| xp->xp_context == EXPAND_SHELLCMD
|| xp->xp_context == EXPAND_BUFFERS)) {
- if (vim_tolower(c0) != vim_tolower(ci)) {
+ if (mb_tolower(c0) != mb_tolower(ci)) {
break;
}
} else if (c0 != ci) {
@@ -3088,9 +3976,10 @@ void ExpandEscape(expand_T *xp, char_u *str, int numfiles, char_u **files, int o
#endif
}
#ifdef BACKSLASH_IN_FILENAME
- p = vim_strsave_fnameescape(files[i], FALSE);
+ p = (char_u *)vim_strsave_fnameescape((const char *)files[i], false);
#else
- p = vim_strsave_fnameescape(files[i], xp->xp_shell);
+ p = (char_u *)vim_strsave_fnameescape((const char *)files[i],
+ xp->xp_shell);
#endif
xfree(files[i]);
files[i] = p;
@@ -3120,42 +4009,49 @@ void ExpandEscape(expand_T *xp, char_u *str, int numfiles, char_u **files, int o
}
}
-/*
- * Escape special characters in "fname" for when used as a file name argument
- * after a Vim command, or, when "shell" is non-zero, a shell command.
- * Returns the result in allocated memory.
- */
-char_u *vim_strsave_fnameescape(char_u *fname, int shell) FUNC_ATTR_NONNULL_RET
+/// Escape special characters in a file name for use as a command argument
+///
+/// @param[in] fname File name to escape.
+/// @param[in] shell What to escape for: if false, escapes for VimL command,
+/// if true then it escapes for a shell command.
+///
+/// @return [allocated] escaped file name.
+char *vim_strsave_fnameescape(const char *const fname, const bool shell)
+ FUNC_ATTR_NONNULL_RET FUNC_ATTR_MALLOC FUNC_ATTR_NONNULL_ALL
{
- char_u *p;
#ifdef BACKSLASH_IN_FILENAME
-#define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`%#'\"|!<")
- char_u buf[20];
+#define PATH_ESC_CHARS " \t\n*?[{`%#'\"|!<"
+ char_u buf[sizeof(PATH_ESC_CHARS)];
int j = 0;
- /* Don't escape '[', '{' and '!' if they are in 'isfname'. */
- for (p = PATH_ESC_CHARS; *p != NUL; ++p)
- if ((*p != '[' && *p != '{' && *p != '!') || !vim_isfilec(*p))
- buf[j++] = *p;
+ // Don't escape '[', '{' and '!' if they are in 'isfname'.
+ for (const char *s = PATH_ESC_CHARS; *s != NUL; s++) {
+ if ((*s != '[' && *s != '{' && *s != '!') || !vim_isfilec(*s)) {
+ buf[j++] = *s;
+ }
+ }
buf[j] = NUL;
- p = vim_strsave_escaped(fname, buf);
+ char *p = (char *)vim_strsave_escaped((const char_u *)fname,
+ (const char_u *)buf);
#else
#define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<")
#define SHELL_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<>();&")
- p = vim_strsave_escaped(fname, shell ? SHELL_ESC_CHARS : PATH_ESC_CHARS);
+ char *p = (char *)vim_strsave_escaped(
+ (const char_u *)fname, (shell ? SHELL_ESC_CHARS : PATH_ESC_CHARS));
if (shell && csh_like_shell()) {
- /* For csh and similar shells need to put two backslashes before '!'.
- * One is taken by Vim, one by the shell. */
- char_u *s = vim_strsave_escaped(p, (char_u *)"!");
+ // For csh and similar shells need to put two backslashes before '!'.
+ // One is taken by Vim, one by the shell.
+ char *s = (char *)vim_strsave_escaped((const char_u *)p,
+ (const char_u *)"!");
xfree(p);
p = s;
}
#endif
- /* '>' and '+' are special at the start of some commands, e.g. ":edit" and
- * ":write". "cd -" has a special meaning. */
+ // '>' and '+' are special at the start of some commands, e.g. ":edit" and
+ // ":write". "cd -" has a special meaning.
if (*p == '>' || *p == '+' || (*p == '-' && p[1] == NUL)) {
- escape_fname(&p);
+ escape_fname((char_u **)&p);
}
return p;
@@ -3224,6 +4120,15 @@ static int showmatches(expand_T *xp, int wildmenu)
showtail = cmd_showtail;
}
+ if (ui_is_external(kUIWildmenu)) {
+ Array args = ARRAY_DICT_INIT;
+ for (i = 0; i < num_files; i++) {
+ ADD(args, STRING_OBJ(cstr_to_string((char *)files_found[i])));
+ }
+ ui_call_wildmenu_show(args);
+ return EXPAND_OK;
+ }
+
if (!wildmenu) {
msg_didany = FALSE; /* lines_left will be set */
msg_start(); /* prepare for paging */
@@ -3234,12 +4139,12 @@ static int showmatches(expand_T *xp, int wildmenu)
msg_start(); /* prepare for paging */
}
- if (got_int)
- got_int = FALSE; /* only int. the completion, not the cmd line */
- else if (wildmenu)
- win_redr_status_matches(xp, num_files, files_found, 0, showtail);
- else {
- /* find the length of the longest file name */
+ if (got_int) {
+ got_int = false; // only int. the completion, not the cmd line
+ } else if (wildmenu) {
+ win_redr_status_matches(xp, num_files, files_found, -1, showtail);
+ } else {
+ // find the length of the longest file name
maxlen = 0;
for (i = 0; i < num_files; ++i) {
if (!showtail && (xp->xp_context == EXPAND_FILES
@@ -3264,13 +4169,13 @@ static int showmatches(expand_T *xp, int wildmenu)
lines = (num_files + columns - 1) / columns;
}
- attr = hl_attr(HLF_D); /* find out highlighting for directories */
+ attr = HL_ATTR(HLF_D); // find out highlighting for directories
if (xp->xp_context == EXPAND_TAGS_LISTFILES) {
- MSG_PUTS_ATTR(_("tagname"), hl_attr(HLF_T));
+ MSG_PUTS_ATTR(_("tagname"), HL_ATTR(HLF_T));
msg_clr_eos();
msg_advance(maxlen - 3);
- MSG_PUTS_ATTR(_(" kind file\n"), hl_attr(HLF_T));
+ MSG_PUTS_ATTR(_(" kind file\n"), HL_ATTR(HLF_T));
}
/* list the files line by line */
@@ -3278,12 +4183,12 @@ static int showmatches(expand_T *xp, int wildmenu)
lastlen = 999;
for (k = i; k < num_files; k += lines) {
if (xp->xp_context == EXPAND_TAGS_LISTFILES) {
- msg_outtrans_attr(files_found[k], hl_attr(HLF_D));
+ msg_outtrans_attr(files_found[k], HL_ATTR(HLF_D));
p = files_found[k] + STRLEN(files_found[k]) + 1;
msg_advance(maxlen + 1);
- msg_puts(p);
+ msg_puts((const char *)p);
msg_advance(maxlen + 3);
- msg_puts_long_attr(p + 2, hl_attr(HLF_D));
+ msg_puts_long_attr(p + 2, HL_ATTR(HLF_D));
break;
}
for (j = maxlen - lastlen; --j >= 0; )
@@ -3366,7 +4271,7 @@ char_u *sm_gettail(char_u *s)
t = p;
had_sep = FALSE;
}
- mb_ptr_adv(p);
+ MB_PTR_ADV(p);
}
return t;
}
@@ -3433,18 +4338,20 @@ addstar (
* use with vim_regcomp(). First work out how long it will be:
*/
- /* For help tags the translation is done in find_help_tags().
- * For a tag pattern starting with "/" no translation is needed. */
+ // For help tags the translation is done in find_help_tags().
+ // For a tag pattern starting with "/" no translation is needed.
if (context == EXPAND_HELP
+ || context == EXPAND_CHECKHEALTH
|| context == EXPAND_COLORS
|| context == EXPAND_COMPILER
|| context == EXPAND_OWNSYNTAX
|| context == EXPAND_FILETYPE
|| context == EXPAND_PACKADD
- || (context == EXPAND_TAGS && fname[0] == '/'))
+ || ((context == EXPAND_TAGS_LISTFILES || context == EXPAND_TAGS)
+ && fname[0] == '/')) {
retval = vim_strnsave(fname, len);
- else {
- new_len = len + 2; /* +2 for '^' at start, NUL at end */
+ } else {
+ new_len = len + 2; // +2 for '^' at start, NUL at end
for (i = 0; i < len; i++) {
if (fname[i] == '*' || fname[i] == '~')
new_len++; /* '*' needs to be replaced by ".*"
@@ -3579,19 +4486,19 @@ static void set_expand_context(expand_T *xp)
xp->xp_context = EXPAND_NOTHING;
return;
}
- set_cmd_context(xp, ccline.cmdbuff, ccline.cmdlen, ccline.cmdpos);
+ set_cmd_context(xp, ccline.cmdbuff, ccline.cmdlen, ccline.cmdpos, true);
}
void
set_cmd_context (
expand_T *xp,
- char_u *str, /* start of command line */
- int len, /* length of command line (excl. NUL) */
- int col /* position of cursor */
+ char_u *str, // start of command line
+ int len, // length of command line (excl. NUL)
+ int col, // position of cursor
+ int use_ccline // use ccline for info
)
{
int old_char = NUL;
- char_u *nextcomm;
/*
* Avoid a UMR warning from Purify, only save the character if it has been
@@ -3600,18 +4507,20 @@ set_cmd_context (
if (col < len)
old_char = str[col];
str[col] = NUL;
- nextcomm = str;
+ const char *nextcomm = (const char *)str;
- if (ccline.cmdfirstc == '=') {
- /* pass CMD_SIZE because there is no real command */
+ if (use_ccline && ccline.cmdfirstc == '=') {
+ // pass CMD_SIZE because there is no real command
set_context_for_expression(xp, str, CMD_SIZE);
- } else if (ccline.input_fn) {
+ } else if (use_ccline && ccline.input_fn) {
xp->xp_context = ccline.xp_context;
xp->xp_pattern = ccline.cmdbuff;
xp->xp_arg = ccline.xp_arg;
- } else
- while (nextcomm != NULL)
+ } else {
+ while (nextcomm != NULL) {
nextcomm = set_one_cmd_context(xp, nextcomm);
+ }
+ }
/* Store the string here so that call_user_expand_func() can get to them
* easily. */
@@ -3670,31 +4579,60 @@ expand_cmdline (
return EXPAND_OK;
}
-/*
- * Cleanup matches for help tags: remove "@en" if "en" is the only language.
- */
-
+// Cleanup matches for help tags:
+// Remove "@ab" if the top of 'helplang' is "ab" and the language of the first
+// tag matches it. Otherwise remove "@en" if "en" is the only language.
static void cleanup_help_tags(int num_file, char_u **file)
{
- int i, j;
- int len;
+ char_u buf[4];
+ char_u *p = buf;
+
+ if (p_hlg[0] != NUL && (p_hlg[0] != 'e' || p_hlg[1] != 'n')) {
+ *p++ = '@';
+ *p++ = p_hlg[0];
+ *p++ = p_hlg[1];
+ }
+ *p = NUL;
- for (i = 0; i < num_file; ++i) {
- len = (int)STRLEN(file[i]) - 3;
- if (len > 0 && STRCMP(file[i] + len, "@en") == 0) {
- /* Sorting on priority means the same item in another language may
- * be anywhere. Search all items for a match up to the "@en". */
- for (j = 0; j < num_file; ++j)
+ for (int i = 0; i < num_file; i++) {
+ int len = (int)STRLEN(file[i]) - 3;
+ if (len <= 0) {
+ continue;
+ }
+ if (STRCMP(file[i] + len, "@en") == 0) {
+ // Sorting on priority means the same item in another language may
+ // be anywhere. Search all items for a match up to the "@en".
+ int j;
+ for (j = 0; j < num_file; j++) {
if (j != i
&& (int)STRLEN(file[j]) == len + 3
- && STRNCMP(file[i], file[j], len + 1) == 0)
+ && STRNCMP(file[i], file[j], len + 1) == 0) {
break;
- if (j == num_file)
+ }
+ }
+ if (j == num_file) {
+ // item only exists with @en, remove it
file[i][len] = NUL;
+ }
+ }
+ }
+
+ if (*buf != NUL) {
+ for (int i = 0; i < num_file; i++) {
+ int len = (int)STRLEN(file[i]) - 3;
+ if (len <= 0) {
+ continue;
+ }
+ if (STRCMP(file[i] + len, buf) == 0) {
+ // remove the default language
+ file[i][len] = NUL;
+ }
}
}
}
+typedef char_u *(*ExpandFunc)(expand_T *, int);
+
/*
* Do the expansion based on xp->xp_context and "pat".
*/
@@ -3773,7 +4711,7 @@ ExpandFromContext (
/* With an empty argument we would get all the help tags, which is
* very slow. Get matches for "help" instead. */
if (find_help_tags(*pat == NUL ? (char_u *)"help" : pat,
- num_file, file, FALSE) == OK) {
+ num_file, file, false) == OK) {
cleanup_help_tags(*num_file, *file);
return OK;
}
@@ -3810,6 +4748,10 @@ ExpandFromContext (
char *directories[] = { "syntax", "indent", "ftplugin", NULL };
return ExpandRTDir(pat, 0, num_file, file, directories);
}
+ if (xp->xp_context == EXPAND_CHECKHEALTH) {
+ char *directories[] = { "autoload/health", NULL };
+ return ExpandRTDir(pat, 0, num_file, file, directories);
+ }
if (xp->xp_context == EXPAND_USER_LIST) {
return ExpandUserList(xp, num_file, file);
}
@@ -3834,39 +4776,41 @@ ExpandFromContext (
else {
static struct expgen {
int context;
- char_u *((*func)(expand_T *, int));
+ ExpandFunc func;
int ic;
int escaped;
- } tab[] =
- {
- {EXPAND_COMMANDS, get_command_name, FALSE, TRUE},
- {EXPAND_BEHAVE, get_behave_arg, TRUE, TRUE},
- {EXPAND_HISTORY, get_history_arg, TRUE, TRUE},
- {EXPAND_USER_COMMANDS, get_user_commands, FALSE, TRUE},
- {EXPAND_USER_ADDR_TYPE, get_user_cmd_addr_type, FALSE, TRUE},
- {EXPAND_USER_CMD_FLAGS, get_user_cmd_flags, FALSE, TRUE},
- {EXPAND_USER_NARGS, get_user_cmd_nargs, FALSE, TRUE},
- {EXPAND_USER_COMPLETE, get_user_cmd_complete, FALSE, TRUE},
- {EXPAND_USER_VARS, get_user_var_name, FALSE, TRUE},
- {EXPAND_FUNCTIONS, get_function_name, FALSE, TRUE},
- {EXPAND_USER_FUNC, get_user_func_name, FALSE, TRUE},
- {EXPAND_EXPRESSION, get_expr_name, FALSE, TRUE},
- {EXPAND_MENUS, get_menu_name, FALSE, TRUE},
- {EXPAND_MENUNAMES, get_menu_names, FALSE, TRUE},
- {EXPAND_SYNTAX, get_syntax_name, TRUE, TRUE},
- {EXPAND_SYNTIME, get_syntime_arg, TRUE, TRUE},
- {EXPAND_HIGHLIGHT, get_highlight_name, TRUE, TRUE},
- {EXPAND_EVENTS, get_event_name, TRUE, TRUE},
- {EXPAND_AUGROUP, get_augroup_name, TRUE, TRUE},
- {EXPAND_CSCOPE, get_cscope_name, TRUE, TRUE},
- {EXPAND_SIGN, get_sign_name, TRUE, TRUE},
- {EXPAND_PROFILE, get_profile_name, TRUE, TRUE},
+ } tab[] = {
+ { EXPAND_COMMANDS, get_command_name, false, true },
+ { EXPAND_BEHAVE, get_behave_arg, true, true },
+ { EXPAND_MAPCLEAR, get_mapclear_arg, true, true },
+ { EXPAND_MESSAGES, get_messages_arg, true, true },
+ { EXPAND_HISTORY, get_history_arg, true, true },
+ { EXPAND_USER_COMMANDS, get_user_commands, false, true },
+ { EXPAND_USER_ADDR_TYPE, get_user_cmd_addr_type, false, true },
+ { EXPAND_USER_CMD_FLAGS, get_user_cmd_flags, false, true },
+ { EXPAND_USER_NARGS, get_user_cmd_nargs, false, true },
+ { EXPAND_USER_COMPLETE, get_user_cmd_complete, false, true },
+ { EXPAND_USER_VARS, get_user_var_name, false, true },
+ { EXPAND_FUNCTIONS, get_function_name, false, true },
+ { EXPAND_USER_FUNC, get_user_func_name, false, true },
+ { EXPAND_EXPRESSION, get_expr_name, false, true },
+ { EXPAND_MENUS, get_menu_name, false, true },
+ { EXPAND_MENUNAMES, get_menu_names, false, true },
+ { EXPAND_SYNTAX, get_syntax_name, true, true },
+ { EXPAND_SYNTIME, get_syntime_arg, true, true },
+ { EXPAND_HIGHLIGHT, (ExpandFunc)get_highlight_name, true, true },
+ { EXPAND_EVENTS, get_event_name, true, true },
+ { EXPAND_AUGROUP, get_augroup_name, true, true },
+ { EXPAND_CSCOPE, get_cscope_name, true, true },
+ { EXPAND_SIGN, get_sign_name, true, true },
+ { EXPAND_PROFILE, get_profile_name, true, true },
#ifdef HAVE_WORKING_LIBINTL
- {EXPAND_LANGUAGE, get_lang_arg, TRUE, FALSE},
- {EXPAND_LOCALES, get_locales, TRUE, FALSE},
+ { EXPAND_LANGUAGE, get_lang_arg, true, false },
+ { EXPAND_LOCALES, get_locales, true, false },
#endif
- {EXPAND_ENV_VARS, get_env_name, TRUE, TRUE},
- {EXPAND_USER, get_users, TRUE, FALSE},
+ { EXPAND_ENV_VARS, get_env_name, true, true },
+ { EXPAND_USER, get_users, true, false },
+ { EXPAND_ARGLIST, get_arglist_name, true, false },
};
int i;
@@ -3930,23 +4874,27 @@ void ExpandGeneric(
// copy the matching names into allocated memory
count = 0;
- for (i = 0;; ++i) {
+ for (i = 0;; i++) {
str = (*func)(xp, i);
- if (str == NULL) // end of list
+ if (str == NULL) { // End of list.
break;
- if (*str == NUL) // skip empty strings
+ }
+ if (*str == NUL) { // Skip empty strings.
continue;
+ }
if (vim_regexec(regmatch, str, (colnr_T)0)) {
- if (escaped)
+ if (escaped) {
str = vim_strsave_escaped(str, (char_u *)" \t\\.");
- else
+ } else {
str = vim_strsave(str);
+ }
(*file)[count++] = str;
- if (func == get_menu_names && str != NULL) {
- /* test for separator added by get_menu_names() */
+ if (func == get_menu_names) {
+ // Test for separator added by get_menu_names().
str += STRLEN(str) - 1;
- if (*str == '\001')
+ if (*str == '\001') {
*str = '.';
+ }
}
}
}
@@ -3978,7 +4926,7 @@ void ExpandGeneric(
/// @param flagsarg is a combination of EW_* flags.
static void expand_shellcmd(char_u *filepat, int *num_file, char_u ***file,
int flagsarg)
- FUNC_ATTR_NONNULL_ALL
+ FUNC_ATTR_NONNULL_ALL
{
char_u *pat;
int i;
@@ -4001,13 +4949,14 @@ static void expand_shellcmd(char_u *filepat, int *num_file, char_u ***file,
flags |= EW_FILE | EW_EXEC | EW_SHELLCMD;
bool mustfree = false; // Track memory allocation for *path.
- /* For an absolute name we don't use $PATH. */
- if (path_is_absolute_path(pat))
+ // For an absolute name we don't use $PATH.
+ if (path_is_absolute(pat)) {
path = (char_u *)" ";
- else if ((pat[0] == '.' && (vim_ispathsep(pat[1])
- || (pat[1] == '.' && vim_ispathsep(pat[2])))))
+ } else if (pat[0] == '.' && (vim_ispathsep(pat[1])
+ || (pat[1] == '.'
+ && vim_ispathsep(pat[2])))) {
path = (char_u *)".";
- else {
+ } else {
path = (char_u *)vim_getenv("PATH");
if (path == NULL) {
path = (char_u *)"";
@@ -4079,10 +5028,8 @@ static void expand_shellcmd(char_u *filepat, int *num_file, char_u ***file,
}
}
-/*
- * Call "user_expand_func()" to invoke a user defined VimL function and return
- * the result (either a string or a List).
- */
+/// Call "user_expand_func()" to invoke a user defined Vim script function and
+/// return the result (either a string or a List).
static void * call_user_expand_func(user_expand_func_T user_expand_func,
expand_T *xp, int *num_file, char_u ***file)
{
@@ -4114,7 +5061,10 @@ static void * call_user_expand_func(user_expand_func_T user_expand_func,
ccline.cmdprompt = NULL;
current_SID = xp->xp_scriptID;
- ret = user_expand_func(xp->xp_arg, 3, args, FALSE);
+ ret = user_expand_func(xp->xp_arg,
+ 3,
+ (const char_u * const *)args,
+ false);
ccline = save_ccline;
current_SID = save_current_SID;
@@ -4130,36 +5080,34 @@ static void * call_user_expand_func(user_expand_func_T user_expand_func,
*/
static int ExpandUserDefined(expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file)
{
- char_u *retstr;
- char_u *s;
- char_u *e;
- char_u keep;
- garray_T ga;
+ char_u *e;
+ garray_T ga;
+
+ char_u *const retstr = call_user_expand_func(
+ (user_expand_func_T)call_func_retstr, xp, num_file, file);
- retstr = call_user_expand_func(call_func_retstr, xp, num_file, file);
- if (retstr == NULL)
+ if (retstr == NULL) {
return FAIL;
+ }
ga_init(&ga, (int)sizeof(char *), 3);
- for (s = retstr; *s != NUL; s = e) {
+ for (char_u *s = retstr; *s != NUL; s = e) {
e = vim_strchr(s, '\n');
if (e == NULL)
e = s + STRLEN(s);
- keep = *e;
- *e = 0;
+ const int keep = *e;
+ *e = NUL;
- if (xp->xp_pattern[0] && vim_regexec(regmatch, s, (colnr_T)0) == 0) {
- *e = keep;
- if (*e != NUL)
- ++e;
- continue;
+ const bool skip = xp->xp_pattern[0]
+ && vim_regexec(regmatch, s, (colnr_T)0) == 0;
+ *e = keep;
+ if (!skip) {
+ GA_APPEND(char_u *, &ga, vim_strnsave(s, (int)(e - s)));
}
- GA_APPEND(char_u *, &ga, vim_strnsave(s, (int)(e - s)));
-
- *e = keep;
- if (*e != NUL)
- ++e;
+ if (*e != NUL) {
+ e++;
+ }
}
xfree(retstr);
*file = ga.ga_data;
@@ -4172,23 +5120,25 @@ static int ExpandUserDefined(expand_T *xp, regmatch_T *regmatch, int *num_file,
*/
static int ExpandUserList(expand_T *xp, int *num_file, char_u ***file)
{
- list_T *retlist;
- listitem_T *li;
- garray_T ga;
-
- retlist = call_user_expand_func(call_func_retlist, xp, num_file, file);
- if (retlist == NULL)
+ list_T *const retlist = call_user_expand_func(
+ (user_expand_func_T)call_func_retlist, xp, num_file, file);
+ if (retlist == NULL) {
return FAIL;
+ }
+ garray_T ga;
ga_init(&ga, (int)sizeof(char *), 3);
- /* Loop over the items in the list. */
- for (li = retlist->lv_first; li != NULL; li = li->li_next) {
- if (li->li_tv.v_type != VAR_STRING || li->li_tv.vval.v_string == NULL)
- continue; /* Skip non-string items and empty strings */
+ // Loop over the items in the list.
+ TV_LIST_ITER_CONST(retlist, li, {
+ if (TV_LIST_ITEM_TV(li)->v_type != VAR_STRING
+ || TV_LIST_ITEM_TV(li)->vval.v_string == NULL) {
+ continue; // Skip non-string items and empty strings.
+ }
- GA_APPEND(char_u *, &ga, vim_strsave(li->li_tv.vval.v_string));
- }
- list_unref(retlist);
+ GA_APPEND(char *, &ga, xstrdup(
+ (const char *)TV_LIST_ITEM_TV(li)->vval.v_string));
+ });
+ tv_list_unref(retlist);
*file = ga.ga_data;
*num_file = ga.ga_len;
@@ -4247,7 +5197,7 @@ static int ExpandRTDir(char_u *pat, int flags, int *num_file, char_u ***file,
char_u *e = s + STRLEN(s);
if (e - s > 4 && STRNICMP(e - 4, ".vim", 4) == 0) {
e -= 4;
- for (s = e; s > match; mb_ptr_back(match, s)) {
+ for (s = e; s > match; MB_PTR_BACK(match, s)) {
if (vim_ispathsep(*s)) {
break;
}
@@ -4371,6 +5321,7 @@ static HistoryType hist_char2type(const int c)
case '>': {
return HIST_DEBUG;
}
+ case NUL:
case '/':
case '?': {
return HIST_SEARCH;
@@ -4483,7 +5434,7 @@ static inline void hist_free_entry(histentry_T *hisptr)
FUNC_ATTR_NONNULL_ALL
{
xfree(hisptr->hisstr);
- list_unref(hisptr->additional_elements);
+ tv_list_unref(hisptr->additional_elements);
clear_hist_entry(hisptr);
}
@@ -4539,7 +5490,7 @@ in_history (
history[type][last_i] = history[type][i];
last_i = i;
}
- list_unref(list);
+ tv_list_unref(list);
history[type][i].hisnum = ++hisnum[type];
history[type][i].hisstr = str;
history[type][i].timestamp = os_time();
@@ -4561,7 +5512,7 @@ in_history (
///
/// @return Any value from HistoryType enum, including HIST_INVALID. May not
/// return HIST_DEFAULT unless return_default is true.
-HistoryType get_histtype(const char_u *const name, const size_t len,
+HistoryType get_histtype(const char *const name, const size_t len,
const bool return_default)
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
@@ -4615,8 +5566,8 @@ add_to_history (
* down, only lines that were added.
*/
if (histype == HIST_SEARCH && in_map) {
- if (maptick == last_maptick) {
- /* Current line is from the same mapping, remove it */
+ if (maptick == last_maptick && hisidx[HIST_SEARCH] >= 0) {
+ // Current line is from the same mapping, remove it
hisptr = &history[HIST_SEARCH][hisidx[HIST_SEARCH]];
hist_free_entry(hisptr);
--hisnum[histype];
@@ -4665,13 +5616,15 @@ int get_history_idx(int histype)
*/
static struct cmdline_info *get_ccline_ptr(void)
{
- if ((State & CMDLINE) == 0)
+ if ((State & CMDLINE) == 0) {
return NULL;
- if (ccline.cmdbuff != NULL)
+ } else if (ccline.cmdbuff != NULL) {
return &ccline;
- if (prev_ccline_used && prev_ccline.cmdbuff != NULL)
- return &prev_ccline;
- return NULL;
+ } else if (ccline.prev_ccline && ccline.prev_ccline->cmdbuff != NULL) {
+ return ccline.prev_ccline;
+ } else {
+ return NULL;
+ }
}
/*
@@ -4681,6 +5634,9 @@ static struct cmdline_info *get_ccline_ptr(void)
*/
char_u *get_cmdline_str(void)
{
+ if (cmdline_star > 0) {
+ return NULL;
+ }
struct cmdline_info *p = get_ccline_ptr();
if (p == NULL)
@@ -4904,7 +5860,7 @@ int get_list_range(char_u **str, int *num1, int *num2)
{
int len;
int first = false;
- long num;
+ varnumber_T num;
*str = skipwhite(*str);
if (**str == '-' || ascii_isdigit(**str)) { // parse "from" part of range
@@ -4954,7 +5910,7 @@ void ex_history(exarg_T *eap)
while (ASCII_ISALPHA(*end)
|| vim_strchr((char_u *)":=@>/?", *end) != NULL)
end++;
- histype1 = get_histtype(arg, end - arg, false);
+ histype1 = get_histtype((const char *)arg, end - arg, false);
if (histype1 == HIST_INVALID) {
if (STRNICMP(arg, "all", end - arg) == 0) {
histype1 = 0;
@@ -4975,6 +5931,7 @@ void ex_history(exarg_T *eap)
for (; !got_int && histype1 <= histype2; ++histype1) {
STRCPY(IObuff, "\n # ");
+ assert(history_names[histype1] != NULL);
STRCAT(STRCAT(IObuff, history_names[histype1]), " history");
MSG_PUTS_TITLE(IObuff);
idx = hisidx[histype1];
@@ -5066,12 +6023,12 @@ int cmd_gchar(int offset)
* Ctrl_C if it is to be abandoned
* K_IGNORE if editing continues
*/
-static int ex_window(void)
+static int open_cmdwin(void)
{
struct cmdline_info save_ccline;
- buf_T *old_curbuf = curbuf;
+ bufref_T old_curbuf;
+ bufref_T bufref;
win_T *old_curwin = curwin;
- buf_T *bp;
win_T *wp;
int i;
linenr_T lnum;
@@ -5090,6 +6047,8 @@ static int ex_window(void)
return K_IGNORE;
}
+ set_bufref(&old_curbuf, curbuf);
+
/* Save current window sizes. */
win_size_save(&winsizes);
@@ -5097,6 +6056,7 @@ static int ex_window(void)
block_autocmds();
/* don't use a new tab page */
cmdmod.tab = 0;
+ cmdmod.noswapfile = 1;
/* Create a window for the command-line buffer. */
if (win_split((int)p_cwh, WSP_BOT) == FAIL) {
@@ -5105,20 +6065,21 @@ static int ex_window(void)
return K_IGNORE;
}
cmdwin_type = get_cmdline_type();
+ cmdwin_level = ccline.level;
- /* Create the command-line buffer empty. */
- (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, NULL);
- (void)setfname(curbuf, (char_u *)"[Command Line]", NULL, TRUE);
- set_option_value((char_u *)"bt", 0L, (char_u *)"nofile", OPT_LOCAL);
- set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL);
- curbuf->b_p_ma = TRUE;
- curwin->w_p_fen = FALSE;
+ // Create empty command-line buffer.
+ buf_open_scratch(0, "[Command Line]");
+ // Command-line buffer has bufhidden=wipe, unlike a true "scratch" buffer.
+ set_option_value("bh", 0L, "wipe", OPT_LOCAL);
curwin->w_p_rl = cmdmsg_rl;
- cmdmsg_rl = FALSE;
- RESET_BINDING(curwin);
+ cmdmsg_rl = false;
+ curbuf->b_p_ma = true;
+ curwin->w_p_fen = false;
- /* Do execute autocommands for setting the filetype (load syntax). */
+ // Do execute autocommands for setting the filetype (load syntax).
unblock_autocmds();
+ // But don't allow switching to another buffer.
+ curbuf_lock++;
/* Showing the prompt may have set need_wait_return, reset it. */
need_wait_return = FALSE;
@@ -5129,8 +6090,9 @@ static int ex_window(void)
add_map((char_u *)"<buffer> <Tab> <C-X><C-V>", INSERT);
add_map((char_u *)"<buffer> <Tab> a<C-X><C-V>", NORMAL);
}
- set_option_value((char_u *)"ft", 0L, (char_u *)"vim", OPT_LOCAL);
+ set_option_value("ft", 0L, "vim", OPT_LOCAL);
}
+ curbuf_lock--;
/* Reset 'textwidth' after setting 'filetype' (the Vim filetype plugin
* sets 'textwidth' to 78). */
@@ -5154,17 +6116,19 @@ static int ex_window(void)
/* Replace the empty last line with the current command-line and put the
* cursor there. */
- ml_replace(curbuf->b_ml.ml_line_count, ccline.cmdbuff, TRUE);
+ ml_replace(curbuf->b_ml.ml_line_count, ccline.cmdbuff, true);
curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
curwin->w_cursor.col = ccline.cmdpos;
changed_line_abv_curs();
invalidate_botline();
+ if (ui_is_external(kUICmdline)) {
+ ccline.redraw_state = kCmdRedrawNone;
+ ui_call_cmdline_hide(ccline.level);
+ }
redraw_later(SOME_VALID);
- /* Save the command line info, can be used recursively. */
- save_ccline = ccline;
- ccline.cmdbuff = NULL;
- ccline.cmdprompt = NULL;
+ // Save the command line info, can be used recursively.
+ save_cmdline(&save_ccline);
/* No Ex mode here! */
exmode_active = 0;
@@ -5181,6 +6145,7 @@ static int ex_window(void)
i = RedrawingDisabled;
RedrawingDisabled = 0;
+ int save_count = save_batch_count();
/*
* Call the main loop until <CR> or CTRL-C is typed.
@@ -5189,8 +6154,9 @@ static int ex_window(void)
normal_enter(true, false);
RedrawingDisabled = i;
+ restore_batch_count(save_count);
- int save_KeyTyped = KeyTyped;
+ const bool save_KeyTyped = KeyTyped;
/* Trigger CmdwinLeave autocommands. */
apply_autocmds(EVENT_CMDWINLEAVE, typestr, typestr, FALSE, curbuf);
@@ -5198,15 +6164,16 @@ static int ex_window(void)
/* Restore KeyTyped in case it is modified by autocommands */
KeyTyped = save_KeyTyped;
- /* Restore the command line info. */
- ccline = save_ccline;
+ // Restore the command line info.
+ restore_cmdline(&save_ccline);
cmdwin_type = 0;
+ cmdwin_level = 0;
exmode_active = save_exmode;
/* Safety check: The old window or buffer was deleted: It's a bug when
* this happens! */
- if (!win_valid(old_curwin) || !buf_valid(old_curbuf)) {
+ if (!win_valid(old_curwin) || !bufref_valid(&old_curbuf)) {
cmdwin_result = Ctrl_C;
EMSG(_("E199: Active window or buffer deleted"));
} else {
@@ -5215,32 +6182,33 @@ static int ex_window(void)
cmdwin_result = Ctrl_C;
/* Set the new command line from the cmdline buffer. */
xfree(ccline.cmdbuff);
- if (cmdwin_result == K_XF1 || cmdwin_result == K_XF2) { /* :qa[!] typed */
- char *p = (cmdwin_result == K_XF2) ? "qa" : "qa!";
+ if (cmdwin_result == K_XF1 || cmdwin_result == K_XF2) { // :qa[!] typed
+ const char *p = (cmdwin_result == K_XF2) ? "qa" : "qa!";
if (histtype == HIST_CMD) {
- /* Execute the command directly. */
- ccline.cmdbuff = vim_strsave((char_u *)p);
+ // Execute the command directly.
+ ccline.cmdbuff = (char_u *)xstrdup(p);
cmdwin_result = CAR;
} else {
- /* First need to cancel what we were doing. */
+ // First need to cancel what we were doing.
ccline.cmdbuff = NULL;
stuffcharReadbuff(':');
- stuffReadbuff((char_u *)p);
+ stuffReadbuff(p);
stuffcharReadbuff(CAR);
}
- } else if (cmdwin_result == K_XF2) { /* :qa typed */
- ccline.cmdbuff = vim_strsave((char_u *)"qa");
- cmdwin_result = CAR;
} else if (cmdwin_result == Ctrl_C) {
/* :q or :close, don't execute any command
* and don't modify the cmd window. */
ccline.cmdbuff = NULL;
} else
ccline.cmdbuff = vim_strsave(get_cursor_line_ptr());
- if (ccline.cmdbuff == NULL)
+ if (ccline.cmdbuff == NULL) {
+ ccline.cmdbuff = vim_strsave((char_u *)"");
+ ccline.cmdlen = 0;
+ ccline.cmdbufflen = 1;
+ ccline.cmdpos = 0;
cmdwin_result = Ctrl_C;
- else {
+ } else {
ccline.cmdlen = (int)STRLEN(ccline.cmdbuff);
ccline.cmdbufflen = ccline.cmdlen + 1;
ccline.cmdpos = curwin->w_cursor.col;
@@ -5257,14 +6225,15 @@ static int ex_window(void)
// Avoid command-line window first character being concealed
curwin->w_p_cole = 0;
wp = curwin;
- bp = curbuf;
+ set_bufref(&bufref, curbuf);
win_goto(old_curwin);
- win_close(wp, TRUE);
+ win_close(wp, true);
- /* win_close() may have already wiped the buffer when 'bh' is
- * set to 'wipe' */
- if (buf_valid(bp))
- close_buffer(NULL, bp, DOBUF_WIPE, FALSE);
+ // win_close() may have already wiped the buffer when 'bh' is
+ // set to 'wipe'.
+ if (bufref_valid(&bufref)) {
+ close_buffer(NULL, bufref.br_buf, DOBUF_WIPE, false);
+ }
/* Restore window sizes. */
win_size_restore(&winsizes);
@@ -5282,47 +6251,61 @@ static int ex_window(void)
return cmdwin_result;
}
-/*
- * Used for commands that either take a simple command string argument, or:
- * cmd << endmarker
- * {script}
- * endmarker
- * Returns a pointer to allocated memory with {script} or NULL.
- */
-char_u *script_get(exarg_T *eap, char_u *cmd)
+/// Get script string
+///
+/// Used for commands which accept either `:command script` or
+///
+/// :command << endmarker
+/// script
+/// endmarker
+///
+/// @param eap Command being run.
+/// @param[out] lenp Location where length of resulting string is saved. Will
+/// be set to zero when skipping.
+///
+/// @return [allocated] NULL or script. Does not show any error messages.
+/// NULL is returned when skipping and on error.
+char *script_get(exarg_T *const eap, size_t *const lenp)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_MALLOC
{
- char_u *theline;
- char *end_pattern = NULL;
- char dot[] = ".";
- garray_T ga;
+ const char *const cmd = (const char *)eap->arg;
- if (cmd[0] != '<' || cmd[1] != '<' || eap->getline == NULL)
- return NULL;
-
- ga_init(&ga, 1, 0x400);
+ if (cmd[0] != '<' || cmd[1] != '<' || eap->getline == NULL) {
+ *lenp = STRLEN(eap->arg);
+ return eap->skip ? NULL : xmemdupz(eap->arg, *lenp);
+ }
- if (cmd[2] != NUL)
- end_pattern = (char *)skipwhite(cmd + 2);
- else
- end_pattern = dot;
+ garray_T ga = { .ga_data = NULL, .ga_len = 0 };
+ if (!eap->skip) {
+ ga_init(&ga, 1, 0x400);
+ }
- for (;; ) {
- theline = eap->getline(
+ const char *const end_pattern = (
+ cmd[2] != NUL
+ ? (const char *)skipwhite((const char_u *)cmd + 2)
+ : ".");
+ for (;;) {
+ char *const theline = (char *)eap->getline(
eap->cstack->cs_looplevel > 0 ? -1 :
NUL, eap->cookie, 0);
- if (theline == NULL || STRCMP(end_pattern, theline) == 0) {
+ if (theline == NULL || strcmp(end_pattern, theline) == 0) {
xfree(theline);
break;
}
- ga_concat(&ga, theline);
- ga_append(&ga, '\n');
+ if (!eap->skip) {
+ ga_concat(&ga, (const char_u *)theline);
+ ga_append(&ga, '\n');
+ }
xfree(theline);
}
- ga_append(&ga, NUL);
+ *lenp = (size_t)ga.ga_len; // Set length without trailing NUL.
+ if (!eap->skip) {
+ ga_append(&ga, NUL);
+ }
- return (char_u *)ga.ga_data;
+ return (char *)ga.ga_data;
}
/// Iterate over history items
@@ -5408,3 +6391,15 @@ histentry_T *hist_get_array(const uint8_t history_type, int **const new_hisidx,
*new_hisnum = &(hisnum[history_type]);
return history[history_type];
}
+
+static void set_search_match(pos_T *t)
+{
+ // First move cursor to end of match, then to the start. This
+ // moves the whole match onto the screen when 'nowrap' is set.
+ t->lnum += search_match_lines;
+ t->col = search_match_endcol;
+ if (t->lnum > curbuf->b_ml.ml_line_count) {
+ t->lnum = curbuf->b_ml.ml_line_count;
+ coladvance((colnr_T)MAXCOL);
+ }
+}
diff --git a/src/nvim/ex_getln.h b/src/nvim/ex_getln.h
index 24eebdc303..051564fbe1 100644
--- a/src/nvim/ex_getln.h
+++ b/src/nvim/ex_getln.h
@@ -1,8 +1,11 @@
#ifndef NVIM_EX_GETLN_H
#define NVIM_EX_GETLN_H
-#include "nvim/eval_defs.h"
+#include "nvim/eval/typval.h"
#include "nvim/ex_cmds.h"
+#include "nvim/ex_cmds_defs.h"
+#include "nvim/os/time.h"
+#include "nvim/regexp_defs.h"
/* Values for nextwild() and ExpandOne(). See ExpandOne() for meaning. */
#define WILD_FREE 1
diff --git a/src/nvim/farsi.c b/src/nvim/farsi.c
index 61e17128ea..3d714f0fa6 100644
--- a/src/nvim/farsi.c
+++ b/src/nvim/farsi.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/// @file farsi.c
///
/// Functions for Farsi language
@@ -15,7 +18,6 @@
#include "nvim/memline.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/screen.h"
#include "nvim/strings.h"
#include "nvim/vim.h"
@@ -132,7 +134,7 @@ static char_u toF_Xor_X_(int c)
/// @param c The character to convert.
///
/// @return Character converted to the Farsi capital leter.
-char_u toF_TyA(char_u c)
+static char_u toF_TyA(char_u c)
{
char_u tempc;
@@ -322,7 +324,7 @@ static void put_curr_and_l_to_X(char_u c)
}
if ((curwin->w_cursor.col < (colnr_T)STRLEN(get_cursor_line_ptr()))) {
- if ((p_ri && curwin->w_cursor.col) || !p_ri) {
+ if (!p_ri || curwin->w_cursor.col) {
if (p_ri) {
dec_cursor();
} else {
@@ -594,78 +596,83 @@ static void chg_r_to_Xor_X_(void)
int fkmap(int c)
{
int tempc;
- static int revins;
+ int insert_mode = (State & INSERT);
+ static int revins = 0;
if (IS_SPECIAL(c)) {
return c;
}
- if (ascii_isdigit(c)
- || ((c == '.'
- || c == '+'
- || c == '-'
- || c == '^'
- || c == '%'
- || c == '#'
- || c == '=')
- && revins)) {
- if (!revins) {
- if (curwin->w_cursor.col) {
- if (!p_ri) {
- dec_cursor();
- }
+ if (insert_mode) {
+ if (ascii_isdigit(c)
+ || ((c == '.'
+ || c == '+'
+ || c == '-'
+ || c == '^'
+ || c == '%'
+ || c == '#'
+ || c == '=')
+ && revins)) {
+ // Numbers are entered left-to-right.
+ if (!revins) {
+ if (curwin->w_cursor.col) {
+ if (!p_ri) {
+ dec_cursor();
+ }
- chg_c_toX_orX();
- chg_l_toXor_X();
- if (!p_ri) {
- inc_cursor();
+ chg_c_toX_orX();
+ chg_l_toXor_X();
+ if (!p_ri) {
+ inc_cursor();
+ }
}
}
- }
- arrow_used = TRUE;
- (void)stop_arrow();
-
- if (!curwin->w_p_rl && revins) {
- inc_cursor();
- }
-
- revins++;
- p_ri = 1;
- } else {
- if (revins) {
- arrow_used = TRUE;
+ arrow_used = true;
(void)stop_arrow();
- revins = 0;
- if (curwin->w_p_rl) {
- while ((F_isdigit(gchar_cursor())
- || (gchar_cursor() == F_PERIOD
- || gchar_cursor() == F_PLUS
- || gchar_cursor() == F_MINUS
- || gchar_cursor() == F_MUL
- || gchar_cursor() == F_DIVIDE
- || gchar_cursor() == F_PERCENT
- || gchar_cursor() == F_EQUALS))
- && gchar_cursor() != NUL) {
- curwin->w_cursor.col++;
- }
- } else {
- if (curwin->w_cursor.col) {
+ if (!curwin->w_p_rl && revins) {
+ inc_cursor();
+ }
+
+ revins++;
+ p_ri = 1;
+ } else {
+ if (revins) {
+ // Stop entering number.
+ arrow_used = true;
+ (void)stop_arrow();
+
+ revins = 0;
+ if (curwin->w_p_rl) {
while ((F_isdigit(gchar_cursor())
- || (gchar_cursor() == F_PERIOD
- || gchar_cursor() == F_PLUS
- || gchar_cursor() == F_MINUS
- || gchar_cursor() == F_MUL
- || gchar_cursor() == F_DIVIDE
- || gchar_cursor() == F_PERCENT
- || gchar_cursor() == F_EQUALS))
- && --curwin->w_cursor.col) {
+ || (gchar_cursor() == F_PERIOD
+ || gchar_cursor() == F_PLUS
+ || gchar_cursor() == F_MINUS
+ || gchar_cursor() == F_MUL
+ || gchar_cursor() == F_DIVIDE
+ || gchar_cursor() == F_PERCENT
+ || gchar_cursor() == F_EQUALS))
+ && gchar_cursor() != NUL) {
+ curwin->w_cursor.col++;
+ }
+ } else {
+ if (curwin->w_cursor.col) {
+ while ((F_isdigit(gchar_cursor())
+ || (gchar_cursor() == F_PERIOD
+ || gchar_cursor() == F_PLUS
+ || gchar_cursor() == F_MINUS
+ || gchar_cursor() == F_MUL
+ || gchar_cursor() == F_DIVIDE
+ || gchar_cursor() == F_PERCENT
+ || gchar_cursor() == F_EQUALS))
+ && --curwin->w_cursor.col) {
+ }
}
- }
- if (!F_isdigit(gchar_cursor())) {
- ++curwin->w_cursor.col;
+ if (!F_isdigit(gchar_cursor())) {
+ curwin->w_cursor.col++;
+ }
}
}
}
@@ -753,7 +760,7 @@ int fkmap(int c)
case 'Y':
case NL:
case TAB:
- if (p_ri && (c == NL) && curwin->w_cursor.col) {
+ if (p_ri && (c == NL) && curwin->w_cursor.col && insert_mode) {
// If the char before the cursor is _X_ or X_ do not change
// the one under the cursor with X type.
@@ -824,135 +831,137 @@ int fkmap(int c)
}
}
- if (!p_ri) {
- dec_cursor();
- }
+ if (insert_mode) {
+ if (!p_ri) {
+ dec_cursor();
+ }
- switch ((tempc = gchar_cursor())) {
- case _BE:
- case _PE:
- case _TE:
- case _SE:
- case _JIM:
- case _CHE:
- case _HE_J:
- case _XE:
- case _SIN:
- case _SHIN:
- case _SAD:
- case _ZAD:
- case _FE:
- case _GHAF:
- case _KAF:
- case _KAF_H:
- case _GAF:
- case _LAM:
- case _MIM:
- case _NOON:
- case _HE:
- case _HE_:
- case _TA:
- case _ZA:
- put_curr_and_l_to_X(toF_TyA((char_u)tempc));
- break;
+ switch ((tempc = gchar_cursor())) {
+ case _BE:
+ case _PE:
+ case _TE:
+ case _SE:
+ case _JIM:
+ case _CHE:
+ case _HE_J:
+ case _XE:
+ case _SIN:
+ case _SHIN:
+ case _SAD:
+ case _ZAD:
+ case _FE:
+ case _GHAF:
+ case _KAF:
+ case _KAF_H:
+ case _GAF:
+ case _LAM:
+ case _MIM:
+ case _NOON:
+ case _HE:
+ case _HE_:
+ case _TA:
+ case _ZA:
+ put_curr_and_l_to_X(toF_TyA((char_u)tempc));
+ break;
- case _AYN:
- case _AYN_:
- if (!p_ri) {
- if (!curwin->w_cursor.col) {
- put_curr_and_l_to_X(AYN);
- break;
+ case _AYN:
+ case _AYN_:
+ if (!p_ri) {
+ if (!curwin->w_cursor.col) {
+ put_curr_and_l_to_X(AYN);
+ break;
+ }
}
- }
- if (p_ri) {
- inc_cursor();
- } else {
- dec_cursor();
- }
+ if (p_ri) {
+ inc_cursor();
+ } else {
+ dec_cursor();
+ }
- if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) {
- tempc = AYN_;
- } else {
- tempc = AYN;
- }
+ if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) {
+ tempc = AYN_;
+ } else {
+ tempc = AYN;
+ }
- if (p_ri) {
- dec_cursor();
- } else {
- inc_cursor();
- }
+ if (p_ri) {
+ dec_cursor();
+ } else {
+ inc_cursor();
+ }
- put_curr_and_l_to_X((char_u)tempc);
- break;
+ put_curr_and_l_to_X((char_u)tempc);
+ break;
- case _GHAYN:
- case _GHAYN_:
+ case _GHAYN:
+ case _GHAYN_:
- if (!p_ri) {
- if (!curwin->w_cursor.col) {
- put_curr_and_l_to_X(GHAYN);
- break;
+ if (!p_ri) {
+ if (!curwin->w_cursor.col) {
+ put_curr_and_l_to_X(GHAYN);
+ break;
+ }
}
- }
- if (p_ri) {
- inc_cursor();
- } else {
- dec_cursor();
- }
+ if (p_ri) {
+ inc_cursor();
+ } else {
+ dec_cursor();
+ }
- if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) {
- tempc = GHAYN_;
- } else {
- tempc = GHAYN;
- }
+ if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) {
+ tempc = GHAYN_;
+ } else {
+ tempc = GHAYN;
+ }
- if (p_ri) {
- dec_cursor();
- } else {
- inc_cursor();
- }
+ if (p_ri) {
+ dec_cursor();
+ } else {
+ inc_cursor();
+ }
- put_curr_and_l_to_X((char_u)tempc);
- break;
+ put_curr_and_l_to_X((char_u)tempc);
+ break;
- case _YE:
- case _IE:
- case _YEE:
+ case _YE:
+ case _IE:
+ case _YEE:
- if (!p_ri) {
- if (!curwin->w_cursor.col) {
- put_curr_and_l_to_X(
- (tempc == _YE ? YE : tempc == _IE ? IE : YEE));
- break;
+ if (!p_ri) {
+ if (!curwin->w_cursor.col) {
+ put_curr_and_l_to_X(
+ (tempc == _YE ? YE : tempc == _IE ? IE : YEE));
+ break;
+ }
}
- }
- if (p_ri) {
- inc_cursor();
- } else {
- dec_cursor();
- }
+ if (p_ri) {
+ inc_cursor();
+ } else {
+ dec_cursor();
+ }
- if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) {
- tempc = (tempc == _YE ? YE_ : tempc == _IE ? IE_ : YEE_);
- } else {
- tempc = (tempc == _YE ? YE : tempc == _IE ? IE : YEE);
- }
+ if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) {
+ tempc = (tempc == _YE ? YE_ : tempc == _IE ? IE_ : YEE_);
+ } else {
+ tempc = (tempc == _YE ? YE : tempc == _IE ? IE : YEE);
+ }
- if (p_ri) {
- dec_cursor();
- } else {
- inc_cursor();
- }
+ if (p_ri) {
+ dec_cursor();
+ } else {
+ inc_cursor();
+ }
- put_curr_and_l_to_X((char_u)tempc);
- break;
- }
+ put_curr_and_l_to_X((char_u)tempc);
+ break;
+ }
- if (!p_ri) {
- inc_cursor();
+ if (!p_ri) {
+ inc_cursor();
+ }
}
tempc = 0;
@@ -1072,7 +1081,7 @@ int fkmap(int c)
if (gchar_cursor() == _LAM) {
chg_l_toXor_X();
- del_char(FALSE);
+ del_char(false);
AppendCharToRedobuff(K_BS);
if (!p_ri) {
@@ -1558,7 +1567,7 @@ static char_u toF_ending(char_u c)
}
/// Convert the Farsi 3342 standard into Farsi VIM.
-void conv_to_pvim(void)
+static void conv_to_pvim(void)
{
char_u *ptr;
int lnum, llen, i;
@@ -1571,7 +1580,7 @@ void conv_to_pvim(void)
ptr[i] = toF_leading(ptr[i]);
i++;
- while (canF_Rjoin(ptr[i]) && i < llen) {
+ while (i < llen && canF_Rjoin(ptr[i])) {
ptr[i] = toF_Rjoin(ptr[i]);
if (F_isterm(ptr[i]) || !F_isalpha(ptr[i])) {
break;
@@ -1589,23 +1598,23 @@ void conv_to_pvim(void)
}
// Following lines contains Farsi encoded character.
- do_cmdline_cmd("%s/\202\231/\232/g");
- do_cmdline_cmd("%s/\201\231/\370\334/g");
+ do_cmdline_cmd("%s/\202\231/\232/ge");
+ do_cmdline_cmd("%s/\201\231/\370\334/ge");
// Assume the screen has been messed up: clear it and redraw.
- redraw_later(CLEAR);
- MSG_ATTR(farsi_text_1, hl_attr(HLF_S));
+ redraw_later(NOT_VALID);
+ MSG_ATTR((const char *)farsi_text_1, HL_ATTR(HLF_S));
}
/// Convert the Farsi VIM into Farsi 3342 standard.
-void conv_to_pstd(void)
+static void conv_to_pstd(void)
{
char_u *ptr;
int lnum, llen, i;
// Following line contains Farsi encoded character.
- do_cmdline_cmd("%s/\232/\202\231/g");
- for (lnum = 1; lnum <= curbuf->b_ml.ml_line_count; ++lnum) {
+ do_cmdline_cmd("%s/\232/\202\231/ge");
+ for (lnum = 1; lnum <= curbuf->b_ml.ml_line_count; lnum++) {
ptr = ml_get((linenr_T)lnum);
llen = (int)STRLEN(ptr);
for (i = 0; i < llen; i++) {
@@ -1614,8 +1623,8 @@ void conv_to_pstd(void)
}
// Assume the screen has been messed up: clear it and redraw.
- redraw_later(CLEAR);
- MSG_ATTR(farsi_text_2, hl_attr(HLF_S));
+ redraw_later(NOT_VALID);
+ msg_attr((const char *)farsi_text_2, HL_ATTR(HLF_S));
}
/// left-right swap the characters in buf[len].
@@ -2037,34 +2046,31 @@ bool F_ischar(int c)
return c >= TEE_ && c <= YE_;
}
-void farsi_fkey(cmdarg_T *cap)
+void farsi_f8(cmdarg_T *cap FUNC_ATTR_UNUSED)
{
- int c = cap->cmdchar;
-
- if (c == K_F8) {
- if (p_altkeymap) {
- if (curwin->w_farsi & W_R_L) {
- p_fkmap = 0;
- do_cmdline_cmd("set norl");
- MSG("");
- } else {
- p_fkmap = 1;
- do_cmdline_cmd("set rl");
- MSG("");
- }
-
- curwin->w_farsi = curwin->w_farsi ^ W_R_L;
+ if (p_altkeymap) {
+ if (curwin->w_farsi & W_R_L) {
+ p_fkmap = 0;
+ do_cmdline_cmd("set norl");
+ MSG("");
+ } else {
+ p_fkmap = 1;
+ do_cmdline_cmd("set rl");
+ MSG("");
}
+
+ curwin->w_farsi = curwin->w_farsi ^ W_R_L;
}
+}
- if (c == K_F9) {
- if (p_altkeymap && curwin->w_p_rl) {
- curwin->w_farsi = curwin->w_farsi ^ W_CONV;
- if (curwin->w_farsi & W_CONV) {
- conv_to_pvim();
- } else {
- conv_to_pstd();
- }
+void farsi_f9(cmdarg_T *cap FUNC_ATTR_UNUSED)
+{
+ if (p_altkeymap && curwin->w_p_rl) {
+ curwin->w_farsi = curwin->w_farsi ^ W_CONV;
+ if (curwin->w_farsi & W_CONV) {
+ conv_to_pvim();
+ } else {
+ conv_to_pstd();
}
}
}
diff --git a/src/nvim/file_search.c b/src/nvim/file_search.c
index 78b224f04c..ee775bab4a 100644
--- a/src/nvim/file_search.c
+++ b/src/nvim/file_search.c
@@ -1,48 +1,47 @@
-/* TODO: make some #ifdef for this */
-/*--------[ file searching ]-------------------------------------------------*/
-/*
- * File searching functions for 'path', 'tags' and 'cdpath' options.
- * External visible functions:
- * vim_findfile_init() creates/initialises the search context
- * vim_findfile_free_visited() free list of visited files/dirs of search
- * context
- * vim_findfile() find a file in the search context
- * vim_findfile_cleanup() cleanup/free search context created by
- * vim_findfile_init()
- *
- * All static functions and variables start with 'ff_'
- *
- * In general it works like this:
- * First you create yourself a search context by calling vim_findfile_init().
- * It is possible to give a search context from a previous call to
- * vim_findfile_init(), so it can be reused. After this you call vim_findfile()
- * until you are satisfied with the result or it returns NULL. On every call it
- * returns the next file which matches the conditions given to
- * vim_findfile_init(). If it doesn't find a next file it returns NULL.
- *
- * It is possible to call vim_findfile_init() again to reinitialise your search
- * with some new parameters. Don't forget to pass your old search context to
- * it, so it can reuse it and especially reuse the list of already visited
- * directories. If you want to delete the list of already visited directories
- * simply call vim_findfile_free_visited().
- *
- * When you are done call vim_findfile_cleanup() to free the search context.
- *
- * The function vim_findfile_init() has a long comment, which describes the
- * needed parameters.
- *
- *
- *
- * ATTENTION:
- * ==========
- * Also we use an allocated search context here, this functions are NOT
- * thread-safe!!!!!
- *
- * To minimize parameter passing (or because I'm to lazy), only the
- * external visible functions get a search context as a parameter. This is
- * then assigned to a static global, which is used throughout the local
- * functions.
- */
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+// File searching functions for 'path', 'tags' and 'cdpath' options.
+//
+// External visible functions:
+// vim_findfile_init() creates/initialises the search context
+// vim_findfile_free_visited() free list of visited files/dirs of search
+// context
+// vim_findfile() find a file in the search context
+// vim_findfile_cleanup() cleanup/free search context created by
+// vim_findfile_init()
+//
+// All static functions and variables start with 'ff_'
+//
+// In general it works like this:
+// First you create yourself a search context by calling vim_findfile_init().
+// It is possible to give a search context from a previous call to
+// vim_findfile_init(), so it can be reused. After this you call vim_findfile()
+// until you are satisfied with the result or it returns NULL. On every call it
+// returns the next file which matches the conditions given to
+// vim_findfile_init(). If it doesn't find a next file it returns NULL.
+//
+// It is possible to call vim_findfile_init() again to reinitialise your search
+// with some new parameters. Don't forget to pass your old search context to
+// it, so it can reuse it and especially reuse the list of already visited
+// directories. If you want to delete the list of already visited directories
+// simply call vim_findfile_free_visited().
+//
+// When you are done call vim_findfile_cleanup() to free the search context.
+//
+// The function vim_findfile_init() has a long comment, which describes the
+// needed parameters.
+//
+//
+//
+// ATTENTION:
+// ==========
+// We use an allocated search context, these functions are NOT thread-safe!!!!!
+//
+// To minimize parameter passing (or because I'm too lazy), only the
+// external visible functions get a search context as a parameter. This is
+// then assigned to a static global, which is used throughout the local
+// functions.
#include <assert.h>
#include <string.h>
@@ -52,6 +51,7 @@
#include <limits.h>
#include "nvim/vim.h"
+#include "nvim/eval.h"
#include "nvim/ascii.h"
#include "nvim/file_search.h"
#include "nvim/charset.h"
@@ -59,7 +59,7 @@
#include "nvim/memory.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
+#include "nvim/option.h"
#include "nvim/os_unix.h"
#include "nvim/path.h"
#include "nvim/strings.h"
@@ -196,7 +196,6 @@ typedef struct ff_search_ctx_T {
static char_u e_pathtoolong[] = N_("E854: path too long for completion");
-
/*
* Initialization routine for vim_findfile().
*
@@ -326,8 +325,11 @@ vim_findfile_init (
drive[0] = path[0];
drive[1] = ':';
drive[2] = NUL;
- if (vim_FullName(drive, ff_expand_buffer, MAXPATHL, TRUE) == FAIL)
+ if (vim_FullName((const char *)drive, (char *)ff_expand_buffer, MAXPATHL,
+ true)
+ == FAIL) {
goto error_return;
+ }
path += 2;
} else
#endif
@@ -575,7 +577,7 @@ char_u *vim_findfile(void *search_ctx_arg)
char_u *file_path;
char_u *rest_of_wildcards;
char_u *path_end = NULL;
- ff_stack_T *stackp;
+ ff_stack_T *stackp = NULL;
size_t len;
char_u *p;
char_u *suf;
@@ -640,9 +642,8 @@ char_u *vim_findfile(void *search_ctx_arg)
if (p_verbose >= 5) {
verbose_enter_scroll();
smsg("Already Searched: %s (%s)",
- stackp->ffs_fix_path, stackp->ffs_wc_path);
- /* don't overwrite this either */
- msg_puts((char_u *)"\n");
+ stackp->ffs_fix_path, stackp->ffs_wc_path);
+ msg_puts("\n"); // don't overwrite this either
verbose_leave_scroll();
}
#endif
@@ -654,8 +655,7 @@ char_u *vim_findfile(void *search_ctx_arg)
verbose_enter_scroll();
smsg("Searching: %s (%s)",
stackp->ffs_fix_path, stackp->ffs_wc_path);
- /* don't overwrite this either */
- msg_puts((char_u *)"\n");
+ msg_puts("\n"); // don't overwrite this either
verbose_leave_scroll();
}
#endif
@@ -683,28 +683,40 @@ char_u *vim_findfile(void *search_ctx_arg)
dirptrs[0] = file_path;
dirptrs[1] = NULL;
- /* if we have a start dir copy it in */
+ // if we have a start dir copy it in
if (!vim_isAbsName(stackp->ffs_fix_path)
&& search_ctx->ffsc_start_dir) {
+ if (STRLEN(search_ctx->ffsc_start_dir) + 1 >= MAXPATHL) {
+ goto fail;
+ }
STRCPY(file_path, search_ctx->ffsc_start_dir);
- add_pathsep((char *)file_path);
+ if (!add_pathsep((char *)file_path)) {
+ goto fail;
+ }
}
- /* append the fix part of the search path */
+ // append the fix part of the search path
+ if (STRLEN(file_path) + STRLEN(stackp->ffs_fix_path) + 1 >= MAXPATHL) {
+ goto fail;
+ }
STRCAT(file_path, stackp->ffs_fix_path);
- add_pathsep((char *)file_path);
+ if (!add_pathsep((char *)file_path)) {
+ goto fail;
+ }
rest_of_wildcards = stackp->ffs_wc_path;
if (*rest_of_wildcards != NUL) {
len = STRLEN(file_path);
if (STRNCMP(rest_of_wildcards, "**", 2) == 0) {
- /* pointer to the restrict byte
- * The restrict byte is not a character!
- */
+ // pointer to the restrict byte
+ // The restrict byte is not a character!
p = rest_of_wildcards + 2;
if (*p > 0) {
(*p)--;
+ if (len + 1 >= MAXPATHL) {
+ goto fail;
+ }
file_path[len++] = '*';
}
@@ -729,8 +741,12 @@ char_u *vim_findfile(void *search_ctx_arg)
* on the stack again for further search.
*/
while (*rest_of_wildcards
- && !vim_ispathsep(*rest_of_wildcards))
+ && !vim_ispathsep(*rest_of_wildcards)) {
+ if (len + 1 >= MAXPATHL) {
+ goto fail;
+ }
file_path[len++] = *rest_of_wildcards++;
+ }
file_path[len] = NUL;
if (vim_ispathsep(*rest_of_wildcards))
@@ -773,10 +789,15 @@ char_u *vim_findfile(void *search_ctx_arg)
&& !os_isdir(stackp->ffs_filearray[i]))
continue; /* not a directory */
- /* prepare the filename to be checked for existence
- * below */
+ // prepare the filename to be checked for existence below
+ if (STRLEN(stackp->ffs_filearray[i]) + 1
+ + STRLEN(search_ctx->ffsc_file_to_search) >= MAXPATHL) {
+ goto fail;
+ }
STRCPY(file_path, stackp->ffs_filearray[i]);
- add_pathsep((char *)file_path);
+ if (!add_pathsep((char *)file_path)) {
+ goto fail;
+ }
STRCAT(file_path, search_ctx->ffsc_file_to_search);
/*
@@ -813,10 +834,8 @@ char_u *vim_findfile(void *search_ctx_arg)
) == FAIL) {
if (p_verbose >= 5) {
verbose_enter_scroll();
- smsg("Already: %s",
- file_path);
- /* don't overwrite this either */
- msg_puts((char_u *)"\n");
+ smsg("Already: %s", file_path);
+ msg_puts("\n"); // don't overwrite this either
verbose_leave_scroll();
}
continue;
@@ -841,8 +860,7 @@ char_u *vim_findfile(void *search_ctx_arg)
if (p_verbose >= 5) {
verbose_enter_scroll();
smsg("HIT: %s", file_path);
- /* don't overwrite this either */
- msg_puts((char_u *)"\n");
+ msg_puts("\n"); // don't overwrite this either
verbose_leave_scroll();
}
#endif
@@ -927,8 +945,14 @@ char_u *vim_findfile(void *search_ctx_arg)
if (*search_ctx->ffsc_start_dir == 0)
break;
+ if (STRLEN(search_ctx->ffsc_start_dir) + 1
+ + STRLEN(search_ctx->ffsc_fix_path) >= MAXPATHL) {
+ goto fail;
+ }
STRCPY(file_path, search_ctx->ffsc_start_dir);
- add_pathsep((char *)file_path);
+ if (!add_pathsep((char *)file_path)) {
+ goto fail;
+ }
STRCAT(file_path, search_ctx->ffsc_fix_path);
/* create a new stack entry */
@@ -939,6 +963,8 @@ char_u *vim_findfile(void *search_ctx_arg)
break;
}
+fail:
+ ff_free_stack_element(stackp);
xfree(file_path);
return NULL;
}
@@ -1003,10 +1029,8 @@ static ff_visited_list_hdr_T *ff_get_visited_list(char_u *filename, ff_visited_l
#ifdef FF_VERBOSE
if (p_verbose >= 5) {
verbose_enter_scroll();
- smsg("ff_get_visited_list: FOUND list for %s",
- filename);
- /* don't overwrite this either */
- msg_puts((char_u *)"\n");
+ smsg("ff_get_visited_list: FOUND list for %s", filename);
+ msg_puts("\n"); // don't overwrite this either
verbose_leave_scroll();
}
#endif
@@ -1020,8 +1044,7 @@ static ff_visited_list_hdr_T *ff_get_visited_list(char_u *filename, ff_visited_l
if (p_verbose >= 5) {
verbose_enter_scroll();
smsg("ff_get_visited_list: new list for %s", filename);
- /* don't overwrite this either */
- msg_puts((char_u *)"\n");
+ msg_puts("\n"); // don't overwrite this either
verbose_leave_scroll();
}
#endif
@@ -1066,7 +1089,7 @@ static bool ff_wc_equal(char_u *s1, char_u *s2)
c1 = PTR2CHAR(s1 + i);
c2 = PTR2CHAR(s2 + j);
- if ((p_fic ? vim_tolower(c1) != vim_tolower(c2) : c1 != c2)
+ if ((p_fic ? mb_tolower(c1) != mb_tolower(c2) : c1 != c2)
&& (prev1 != '*' || prev2 != '*')) {
return false;
}
@@ -1153,7 +1176,7 @@ static ff_stack_T *ff_create_stack_element(char_u *fix_part, char_u *wc_part, in
new->ffs_filearray_cur = 0;
new->ffs_stage = 0;
new->ffs_level = level;
- new->ffs_star_star_empty = star_star_empty;;
+ new->ffs_star_star_empty = star_star_empty;
/* the following saves NULL pointer checks in vim_findfile */
if (fix_part == NULL)
@@ -1198,14 +1221,19 @@ static ff_stack_T *ff_pop(ff_search_ctx_T *search_ctx)
/*
* free the given stack element
*/
-static void ff_free_stack_element(ff_stack_T *stack_ptr)
+static void ff_free_stack_element(ff_stack_T *const stack_ptr)
{
- /* free handles possible NULL pointers */
+ if (stack_ptr == NULL) {
+ return;
+ }
+
+ // free handles possible NULL pointers
xfree(stack_ptr->ffs_fix_path);
xfree(stack_ptr->ffs_wc_path);
- if (stack_ptr->ffs_filearray != NULL)
+ if (stack_ptr->ffs_filearray != NULL) {
FreeWild(stack_ptr->ffs_filearray_size, stack_ptr->ffs_filearray);
+ }
xfree(stack_ptr);
}
@@ -1374,6 +1402,11 @@ find_file_in_path_option (
char_u *buf = NULL;
int rel_to_curdir;
+ if (rel_fname != NULL && path_with_url((const char *)rel_fname)) {
+ // Do not attempt to search "relative" to a URL. #6009
+ rel_fname = NULL;
+ }
+
if (first == TRUE) {
/* copy file name into NameBuff, expanding environment variables */
save_char = ptr[len];
@@ -1526,3 +1559,91 @@ theend:
return file_name;
}
+void do_autocmd_dirchanged(char *new_dir, CdScope scope)
+{
+ static bool recursive = false;
+
+ if (recursive || !has_event(EVENT_DIRCHANGED)) {
+ // No autocommand was defined or we changed
+ // the directory from this autocommand.
+ return;
+ }
+
+ recursive = true;
+
+ dict_T *dict = get_vim_var_dict(VV_EVENT);
+ char buf[8];
+
+ switch (scope) {
+ case kCdScopeGlobal: {
+ snprintf(buf, sizeof(buf), "global");
+ break;
+ }
+ case kCdScopeTab: {
+ snprintf(buf, sizeof(buf), "tab");
+ break;
+ }
+ case kCdScopeWindow: {
+ snprintf(buf, sizeof(buf), "window");
+ break;
+ }
+ case kCdScopeInvalid: {
+ // Should never happen.
+ assert(false);
+ }
+ }
+
+ tv_dict_add_str(dict, S_LEN("scope"), buf); // -V614
+ tv_dict_add_str(dict, S_LEN("cwd"), new_dir);
+ tv_dict_set_keys_readonly(dict);
+
+ apply_autocmds(EVENT_DIRCHANGED, (char_u *)buf, (char_u *)new_dir, false,
+ curbuf);
+
+ tv_dict_clear(dict);
+
+ recursive = false;
+}
+
+/// Change to a file's directory.
+/// Caller must call shorten_fnames()!
+/// @return OK or FAIL
+int vim_chdirfile(char_u *fname)
+{
+ char dir[MAXPATHL];
+
+ STRLCPY(dir, fname, MAXPATHL);
+ *path_tail_with_sep((char_u *)dir) = NUL;
+
+ if (os_dirname(NameBuff, sizeof(NameBuff)) != OK) {
+ NameBuff[0] = NUL;
+ }
+
+ if (os_chdir(dir) != 0) {
+ return FAIL;
+ }
+
+#ifdef BACKSLASH_IN_FILENAME
+ slash_adjust((char_u *)dir);
+#endif
+ if (!strequal(dir, (char *)NameBuff)) {
+ do_autocmd_dirchanged(dir, kCdScopeWindow);
+ }
+
+ return OK;
+}
+
+/// Change directory to "new_dir". Search 'cdpath' for relative directory names.
+int vim_chdir(char_u *new_dir, CdScope scope)
+{
+ char_u *dir_name = find_directory_in_path(new_dir, STRLEN(new_dir),
+ FNAME_MESS, curbuf->b_ffname);
+ if (dir_name == NULL) {
+ return -1;
+ }
+
+ int r = os_chdir((char *)dir_name);
+ xfree(dir_name);
+ return r;
+}
+
diff --git a/src/nvim/file_search.h b/src/nvim/file_search.h
index 833a1a05ff..b128029123 100644
--- a/src/nvim/file_search.h
+++ b/src/nvim/file_search.h
@@ -1,6 +1,11 @@
#ifndef NVIM_FILE_SEARCH_H
#define NVIM_FILE_SEARCH_H
+#include <stdlib.h> // for size_t
+
+#include "nvim/types.h" // for char_u
+#include "nvim/globals.h" // for CdScope
+
/* Flags for find_file_*() functions. */
#define FINDFILE_FILE 0 /* only files */
#define FINDFILE_DIR 1 /* only directories */
diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c
index 154558b332..ba154ea36a 100644
--- a/src/nvim/fileio.c
+++ b/src/nvim/fileio.c
@@ -1,6 +1,7 @@
-/*
- * fileio.c: read from and write to a file
- */
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+// fileio.c: read from and write to a file
#include <assert.h>
#include <errno.h>
@@ -32,7 +33,6 @@
#include "nvim/memory.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/garray.h"
#include "nvim/move.h"
#include "nvim/normal.h"
@@ -44,6 +44,7 @@
#include "nvim/screen.h"
#include "nvim/search.h"
#include "nvim/sha256.h"
+#include "nvim/state.h"
#include "nvim/strings.h"
#include "nvim/ui.h"
#include "nvim/types.h"
@@ -51,6 +52,7 @@
#include "nvim/window.h"
#include "nvim/shada.h"
#include "nvim/os/os.h"
+#include "nvim/os/os_defs.h"
#include "nvim/os/time.h"
#include "nvim/os/input.h"
@@ -61,57 +63,62 @@
#define BUFSIZE 8192 /* size of normal write buffer */
#define SMBUFSIZE 256 /* size of emergency write buffer */
-/*
- * The autocommands are stored in a list for each event.
- * Autocommands for the same pattern, that are consecutive, are joined
- * together, to avoid having to match the pattern too often.
- * The result is an array of Autopat lists, which point to AutoCmd lists:
- *
- * first_autopat[0] --> Autopat.next --> Autopat.next --> NULL
- * Autopat.cmds Autopat.cmds
- * | |
- * V V
- * AutoCmd.next AutoCmd.next
- * | |
- * V V
- * AutoCmd.next NULL
- * |
- * V
- * NULL
- *
- * first_autopat[1] --> Autopat.next --> NULL
- * Autopat.cmds
- * |
- * V
- * AutoCmd.next
- * |
- * V
- * NULL
- * etc.
- *
- * The order of AutoCmds is important, this is the order in which they were
- * defined and will have to be executed.
- */
+//
+// The autocommands are stored in a list for each event.
+// Autocommands for the same pattern, that are consecutive, are joined
+// together, to avoid having to match the pattern too often.
+// The result is an array of Autopat lists, which point to AutoCmd lists:
+//
+// last_autopat[0] -----------------------------+
+// V
+// first_autopat[0] --> Autopat.next --> Autopat.next --> NULL
+// Autopat.cmds Autopat.cmds
+// | |
+// V V
+// AutoCmd.next AutoCmd.next
+// | |
+// V V
+// AutoCmd.next NULL
+// |
+// V
+// NULL
+//
+// last_autopat[1] --------+
+// V
+// first_autopat[1] --> Autopat.next --> NULL
+// Autopat.cmds
+// |
+// V
+// AutoCmd.next
+// |
+// V
+// NULL
+// etc.
+//
+// The order of AutoCmds is important, this is the order in which they were
+// defined and will have to be executed.
+//
typedef struct AutoCmd {
- char_u *cmd; /* The command to be executed (NULL
- when command has been removed) */
- char nested; /* If autocommands nest here */
- char last; /* last command in list */
- scid_T scriptID; /* script ID where defined */
- struct AutoCmd *next; /* Next AutoCmd in list */
+ char_u *cmd; // The command to be executed (NULL
+ // when command has been removed)
+ char nested; // If autocommands nest here
+ char last; // last command in list
+ scid_T scriptID; // script ID where defined
+ struct AutoCmd *next; // Next AutoCmd in list
} AutoCmd;
typedef struct AutoPat {
- char_u *pat; /* pattern as typed (NULL when pattern
- has been removed) */
- regprog_T *reg_prog; /* compiled regprog for pattern */
- AutoCmd *cmds; /* list of commands to do */
- struct AutoPat *next; /* next AutoPat in AutoPat list */
- int group; /* group ID */
- int patlen; /* strlen() of pat */
- int buflocal_nr; /* !=0 for buffer-local AutoPat */
- char allow_dirs; /* Pattern may match whole path */
- char last; /* last pattern for apply_autocmds() */
+ struct AutoPat *next; // next AutoPat in AutoPat list; MUST
+ // be the first entry
+ char_u *pat; // pattern as typed (NULL when pattern
+ // has been removed)
+ regprog_T *reg_prog; // compiled regprog for pattern
+ AutoCmd *cmds; // list of commands to do
+ int group; // group ID
+ int patlen; // strlen() of pat
+ int buflocal_nr; // !=0 for buffer-local AutoPat
+ char allow_dirs; // Pattern may match whole path
+ char last; // last pattern for apply_autocmds()
} AutoPat;
/*
@@ -187,22 +194,26 @@ struct bw_info {
static char *e_auchangedbuf = N_(
"E812: Autocommands changed buffer or buffer name");
+// Set by the apply_autocmds_group function if the given event is equal to
+// EVENT_FILETYPE. Used by the readfile function in order to determine if
+// EVENT_BUFREADPOST triggered the EVENT_FILETYPE.
+//
+// Relying on this value requires one to reset it prior calling
+// apply_autocmds_group.
+static bool au_did_filetype INIT(= false);
+
void filemess(buf_T *buf, char_u *name, char_u *s, int attr)
{
int msg_scroll_save;
- if (msg_silent != 0)
+ if (msg_silent != 0) {
return;
- msg_add_fname(buf, name); /* put file name in IObuff with quotes */
- /* If it's extremely long, truncate it. */
- if (STRLEN(IObuff) > IOSIZE - 80)
- IObuff[IOSIZE - 80] = NUL;
- STRCAT(IObuff, s);
- /*
- * For the first message may have to start a new line.
- * For further ones overwrite the previous one, reset msg_scroll before
- * calling filemess().
- */
+ }
+ add_quoted_fname((char *)IObuff, IOSIZE - 80, buf, (const char *)name);
+ 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
+ // calling filemess().
msg_scroll_save = msg_scroll;
if (shortmess(SHM_OVERALL) && !exiting && p_verbose == 0)
msg_scroll = FALSE;
@@ -218,6 +229,15 @@ void filemess(buf_T *buf, char_u *name, char_u *s, int attr)
msg_scrolled_ign = FALSE;
}
+static AutoPat *last_autopat[NUM_EVENTS] = {
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
/*
* Read lines from file "fname" into the buffer after line "from".
*
@@ -239,8 +259,9 @@ void filemess(buf_T *buf, char_u *name, char_u *s, int attr)
* stdin)
* READ_DUMMY read into a dummy buffer (to check if file contents changed)
* READ_KEEP_UNDO don't clear undo info or read it from a file
+ * READ_FIFO read from fifo/socket instead of a file
*
- * return FAIL for failure, OK otherwise
+ * return FAIL for failure, NOTDONE for directory (failure), or OK
*/
int
readfile (
@@ -249,7 +270,7 @@ readfile (
linenr_T from,
linenr_T lines_to_skip,
linenr_T lines_to_read,
- exarg_T *eap, /* can be NULL! */
+ exarg_T *eap, // can be NULL!
int flags
)
{
@@ -259,6 +280,7 @@ readfile (
int filtering = (flags & READ_FILTER);
int read_stdin = (flags & READ_STDIN);
int read_buffer = (flags & READ_BUFFER);
+ int read_fifo = (flags & READ_FIFO);
int set_options = newfile || read_buffer
|| (eap != NULL && eap->read_edit);
linenr_T read_buf_lnum = 1; /* next line to read from curbuf */
@@ -272,21 +294,18 @@ readfile (
int wasempty; /* buffer was empty before reading */
colnr_T len;
long size = 0;
- char_u *p;
- off_t filesize = 0;
- int skip_read = FALSE;
+ char_u *p = NULL;
+ off_T filesize = 0;
+ int skip_read = false;
context_sha256_T sha_ctx;
- int read_undo_file = FALSE;
- int split = 0; /* number of split lines */
+ int read_undo_file = false;
linenr_T linecnt;
int error = FALSE; /* errors encountered */
int ff_error = EOL_UNKNOWN; /* file format with errors */
long linerest = 0; /* remaining chars in line */
-#ifdef UNIX
int perm = 0;
+#ifdef UNIX
int swap_mode = -1; /* protection bits for swap file */
-#else
- int perm;
#endif
int fileformat = 0; /* end-of-line format */
int keep_fileformat = FALSE;
@@ -294,12 +313,9 @@ readfile (
linenr_T skip_count = 0;
linenr_T read_count = 0;
int msg_save = msg_scroll;
- linenr_T read_no_eol_lnum = 0; /* non-zero lnum when last line of
- * last read was missing the eol */
- int try_mac = (vim_strchr(p_ffs, 'm') != NULL);
- int try_dos = (vim_strchr(p_ffs, 'd') != NULL);
- int try_unix = (vim_strchr(p_ffs, 'x') != NULL);
- int file_rewind = FALSE;
+ linenr_T read_no_eol_lnum = 0; // non-zero lnum when last line of
+ // last read was missing the eol
+ int file_rewind = false;
int can_retry;
linenr_T conv_error = 0; /* line nr with conversion error */
linenr_T illegal_byte = 0; /* line nr with illegal byte */
@@ -331,6 +347,8 @@ readfile (
int using_b_ffname;
int using_b_fname;
+ au_did_filetype = false; // reset before triggering any autocommands
+
curbuf->b_no_eol_lnum = 0; /* in case it was set by the previous read */
/*
@@ -418,32 +436,31 @@ readfile (
}
}
- if (!read_stdin && !read_buffer) {
+ 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().
- */
- perm = os_getperm(fname);
- if (perm >= 0 && !S_ISREG(perm) /* not a regular file ... */
+ // 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 ...
# ifdef S_ISFIFO
- && !S_ISFIFO(perm) /* ... or fifo */
+ && !S_ISFIFO(perm) // ... or fifo
# endif
# ifdef S_ISSOCK
- && !S_ISSOCK(perm) /* ... or socket */
+ && !S_ISSOCK(perm) // ... or socket
# endif
# ifdef OPEN_CHR_FILES
&& !(S_ISCHR(perm) && is_dev_fd_file(fname))
- /* ... or a character special file named /dev/fd/<n> */
+ // ... or a character special file named /dev/fd/<n>
# endif
) {
- if (S_ISDIR(perm))
+ if (S_ISDIR(perm)) {
filemess(curbuf, fname, (char_u *)_("is a directory"), 0);
- else
+ } else {
filemess(curbuf, fname, (char_u *)_("is not a file"), 0);
+ }
msg_end();
msg_scroll = msg_save;
- return FAIL;
+ return S_ISDIR(perm) ? NOTDONE : FAIL;
}
#endif
}
@@ -461,8 +478,8 @@ readfile (
if (check_readonly && !readonlymode)
curbuf->b_p_ro = FALSE;
- if (newfile && !read_stdin && !read_buffer) {
- /* Remember time of file. */
+ if (newfile && !read_stdin && !read_buffer && !read_fifo) {
+ // Remember time of file.
FileInfo file_info;
if (os_fileinfo((char *)fname, &file_info)) {
buf_store_file_info(curbuf, &file_info);
@@ -493,44 +510,31 @@ readfile (
curbuf->b_flags &= ~(BF_NEW | BF_NEW_W);
}
- /*
- * Check readonly by trying to open the file for writing.
- * If this fails, we know that the file is readonly.
- */
- file_readonly = FALSE;
+ // Check readonly.
+ file_readonly = false;
if (!read_buffer && !read_stdin) {
- if (!newfile || readonlymode) {
- file_readonly = TRUE;
- } else if ((fd = os_open((char *)fname, O_RDWR, 0)) < 0) {
- // opening in readwrite mode failed => file is readonly
- file_readonly = TRUE;
- }
- if (file_readonly == TRUE) {
- // try to open readonly
- fd = os_open((char *)fname, O_RDONLY, 0);
+ if (!newfile || readonlymode || !(perm & 0222)
+ || !os_file_is_writable((char *)fname)) {
+ file_readonly = true;
}
+ fd = os_open((char *)fname, O_RDONLY, 0);
}
- if (fd < 0) { /* cannot open at all */
+ 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.
- */
- perm = os_getperm(fname); /* check if the file exists */
+ // 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
+ curbuf->b_p_ro = true; // must use "w!" now
+ } else {
#endif
if (!newfile) {
return FAIL;
}
- if (perm == UV_ENOENT) {
- /*
- * Set the 'new-file' flag, so that when the file has
- * been created by someone else, a ":w" will complain.
- */
+ if (perm == UV_ENOENT) { // check if the file exists
+ // Set the 'new-file' flag, so that when the file has
+ // been created by someone else, a ":w" will complain.
curbuf->b_flags |= BF_NEW;
/* Create a swap file now, so that other Vims are warned
@@ -581,6 +585,9 @@ readfile (
return FAIL;
}
+#ifndef UNIX
+ }
+#endif
/*
* Only set the 'ro' flag for readonly files the first time they are
@@ -616,10 +623,12 @@ readfile (
return FAIL;
}
#ifdef UNIX
- /* Set swap file protection bits after creating it. */
+ // Set swap file protection bits after creating it.
if (swap_mode > 0 && curbuf->b_ml.ml_mfp != NULL
- && curbuf->b_ml.ml_mfp->mf_fname != NULL)
- (void)os_setperm(curbuf->b_ml.ml_mfp->mf_fname, (long)swap_mode);
+ && curbuf->b_ml.ml_mfp->mf_fname != NULL) {
+ (void)os_setperm((const char *)curbuf->b_ml.ml_mfp->mf_fname,
+ (long)swap_mode);
+ }
#endif
}
@@ -638,37 +647,46 @@ readfile (
curbuf->b_op_start.lnum = ((from == 0) ? 1 : from);
curbuf->b_op_start.col = 0;
+ int try_mac = (vim_strchr(p_ffs, 'm') != NULL);
+ int try_dos = (vim_strchr(p_ffs, 'd') != NULL);
+ int try_unix = (vim_strchr(p_ffs, 'x') != NULL);
+
if (!read_buffer) {
int m = msg_scroll;
int n = msg_scrolled;
- /*
- * The file must be closed again, the autocommands may want to change
- * the file before reading it.
- */
- if (!read_stdin)
- close(fd); /* ignore errors */
+ // The file must be closed again, the autocommands may want to change
+ // the file before reading it.
+ if (!read_stdin) {
+ close(fd); // ignore errors
+ }
- /*
- * The output from the autocommands should not overwrite anything and
- * should not be overwritten: Set msg_scroll, restore its value if no
- * output was done.
- */
- msg_scroll = TRUE;
- if (filtering)
+ // The output from the autocommands should not overwrite anything and
+ // should not be overwritten: Set msg_scroll, restore its value if no
+ // output was done.
+ msg_scroll = true;
+ if (filtering) {
apply_autocmds_exarg(EVENT_FILTERREADPRE, NULL, sfname,
- FALSE, curbuf, eap);
- else if (read_stdin)
+ false, curbuf, eap);
+ } else if (read_stdin) {
apply_autocmds_exarg(EVENT_STDINREADPRE, NULL, sfname,
- FALSE, curbuf, eap);
- else if (newfile)
+ false, curbuf, eap);
+ } else if (newfile) {
apply_autocmds_exarg(EVENT_BUFREADPRE, NULL, sfname,
- FALSE, curbuf, eap);
- else
+ false, curbuf, eap);
+ } else {
apply_autocmds_exarg(EVENT_FILEREADPRE, sfname, sfname,
- FALSE, NULL, eap);
- if (msg_scrolled == n)
+ false, NULL, eap);
+ }
+
+ // autocommands may have changed it
+ try_mac = (vim_strchr(p_ffs, 'm') != NULL);
+ try_dos = (vim_strchr(p_ffs, 'd') != NULL);
+ try_unix = (vim_strchr(p_ffs, 'x') != NULL);
+
+ if (msg_scrolled == n) {
msg_scroll = m;
+ }
if (aborting()) { /* autocmds may abort script processing */
--no_wait_return;
@@ -702,16 +720,9 @@ readfile (
wasempty = (curbuf->b_ml.ml_flags & ML_EMPTY);
if (!recoverymode && !filtering && !(flags & READ_DUMMY)) {
- /*
- * Show the user that we are busy reading the input. Sometimes this
- * may take a while. When reading from stdin another program may
- * still be running, don't move the cursor to the last line, unless
- * always using the GUI.
- */
- if (read_stdin) {
- mch_msg(_("Nvim: Reading from stdin...\n"));
- } else if (!read_buffer)
+ if (!read_stdin && !read_buffer) {
filemess(curbuf, sfname, (char_u *)"", 0);
+ }
}
msg_scroll = FALSE; /* overwrite the file message */
@@ -741,43 +752,14 @@ readfile (
fenc = (char_u *)""; /* binary: don't convert */
fenc_alloced = FALSE;
} else if (curbuf->b_help) {
- char_u firstline[80];
- int fc;
-
- /* Help files are either utf-8 or latin1. Try utf-8 first, if this
- * fails it must be latin1.
- * Always do this when 'encoding' is "utf-8". Otherwise only do
- * this when needed to avoid [converted] remarks all the time.
- * It is needed when the first line contains non-ASCII characters.
- * That is only in *.??x files. */
- fenc = (char_u *)"latin1";
- c = enc_utf8;
- if (!c && !read_stdin) {
- fc = fname[STRLEN(fname) - 1];
- if (TOLOWER_ASC(fc) == 'x') {
- /* Read the first line (and a bit more). Immediately rewind to
- * the start of the file. If the read() fails "len" is -1. */
- len = read_eintr(fd, firstline, 80);
- lseek(fd, (off_t)0L, SEEK_SET);
- for (p = firstline; p < firstline + len; ++p)
- if (*p >= 0x80) {
- c = TRUE;
- break;
- }
- }
- }
-
- if (c) {
- fenc_next = fenc;
- fenc = (char_u *)"utf-8";
-
- /* When the file is utf-8 but a character doesn't fit in
- * 'encoding' don't retry. In help text editing utf-8 bytes
- * doesn't make sense. */
- if (!enc_utf8)
- keep_dest_enc = TRUE;
- }
- fenc_alloced = FALSE;
+ // Help files are either utf-8 or latin1. Try utf-8 first, if this
+ // fails it must be latin1.
+ // It is needed when the first line contains non-ASCII characters.
+ // That is only in *.??x files.
+ fenc_next = (char_u *)"latin1";
+ fenc = (char_u *)"utf-8";
+
+ fenc_alloced = false;
} else if (*p_fencs == NUL) {
fenc = curbuf->b_p_fenc; /* use format from buffer */
fenc_alloced = FALSE;
@@ -812,9 +794,9 @@ retry:
if (read_buffer) {
read_buf_lnum = 1;
read_buf_col = 0;
- } else if (read_stdin || lseek(fd, (off_t)0L, SEEK_SET) != 0) {
- /* Can't rewind the file, give up. */
- error = TRUE;
+ } else if (read_stdin || vim_lseek(fd, (off_T)0L, SEEK_SET) != 0) {
+ // Can't rewind the file, give up.
+ error = true;
goto failed;
}
/* Delete the previously read lines. */
@@ -930,6 +912,7 @@ retry:
* and we can't do it internally or with iconv().
*/
if (fio_flags == 0 && !read_stdin && !read_buffer && *p_ccv != NUL
+ && !read_fifo
# ifdef USE_ICONV
&& iconv_fd == (iconv_t)-1
# endif
@@ -970,7 +953,7 @@ retry:
/* Set "can_retry" when it's possible to rewind the file and try with
* another "fenc" value. It's FALSE when no other "fenc" to try, reading
* stdin or fixed at a specific encoding. */
- can_retry = (*fenc != NUL && !read_stdin && !keep_dest_enc);
+ can_retry = (*fenc != NUL && !read_stdin && !keep_dest_enc && !read_fifo);
if (!skip_read) {
linerest = 0;
@@ -982,6 +965,7 @@ retry:
&& curbuf->b_ffname != NULL
&& curbuf->b_p_udf
&& !filtering
+ && !read_fifo
&& !read_stdin
&& !read_buffer);
if (read_undo_file)
@@ -1042,8 +1026,8 @@ retry:
size = size / ICONV_MULT; /* worst case */
if (conv_restlen > 0) {
- /* Insert unconverted bytes from previous line. */
- memmove(ptr, conv_rest, conv_restlen);
+ // Insert unconverted bytes from previous line.
+ memmove(ptr, conv_rest, conv_restlen); // -V614
ptr += conv_restlen;
size -= conv_restlen;
}
@@ -1394,15 +1378,15 @@ retry:
}
} else if (fio_flags & FIO_UCS4) {
if (fio_flags & FIO_ENDIAN_L) {
- u8c = (*--p << 24);
- u8c += (*--p << 16);
- u8c += (*--p << 8);
+ u8c = (unsigned)(*--p) << 24;
+ u8c += (unsigned)(*--p) << 16;
+ u8c += (unsigned)(*--p) << 8;
u8c += *--p;
} else { /* big endian */
u8c = *--p;
- u8c += (*--p << 8);
- u8c += (*--p << 16);
- u8c += (*--p << 24);
+ u8c += (unsigned)(*--p) << 8;
+ u8c += (unsigned)(*--p) << 16;
+ u8c += (unsigned)(*--p) << 24;
}
} else { /* UTF-8 */
if (*--p < 0x80)
@@ -1647,21 +1631,19 @@ rewind_retry:
*ptr = NUL; /* end of line */
len = (colnr_T)(ptr - line_start + 1);
if (fileformat == EOL_DOS) {
- if (ptr[-1] == CAR) { /* remove CR */
+ if (ptr > line_start && ptr[-1] == CAR) {
+ // remove CR before NL
ptr[-1] = NUL;
- --len;
- }
- /*
- * Reading in Dos format, but no CR-LF found!
- * When 'fileformats' includes "unix", delete all
- * the lines read so far and start all over again.
- * Otherwise give an error message later.
- */
- else if (ff_error != EOL_DOS) {
- if ( try_unix
- && !read_stdin
- && (read_buffer
- || lseek(fd, (off_t)0L, SEEK_SET) == 0)) {
+ len--;
+ } else if (ff_error != EOL_DOS) {
+ // Reading in Dos format, but no CR-LF found!
+ // When 'fileformats' includes "unix", delete all
+ // the lines read so far and start all over again.
+ // Otherwise give an error message later.
+ if (try_unix
+ && !read_stdin
+ && (read_buffer
+ || vim_lseek(fd, (off_T)0L, SEEK_SET) == 0)) {
fileformat = EOL_UNIX;
if (set_options)
set_fileformat(EOL_UNIX, OPT_LOCAL);
@@ -1744,22 +1726,25 @@ failed:
}
# endif
- if (!read_buffer && !read_stdin)
- close(fd); /* errors are ignored */
-#ifdef HAVE_FD_CLOEXEC
- else {
- int fdflags = fcntl(fd, F_GETFD);
- if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0) {
- (void)fcntl(fd, F_SETFD, fdflags | FD_CLOEXEC);
- }
+ if (!read_buffer && !read_stdin) {
+ close(fd); // errors are ignored
+ } else {
+ (void)os_set_cloexec(fd);
}
-#endif
xfree(buffer);
if (read_stdin) {
- /* Use stderr for stdin, makes shell commands work. */
close(0);
- ignored = dup(2);
+#ifndef WIN32
+ // On Unix, use stderr for stdin, makes shell commands work.
+ vim_ignored = dup(2);
+#else
+ // On Windows, use the console input handle for stdin.
+ HANDLE conin = CreateFile("CONIN$", GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES)NULL,
+ OPEN_EXISTING, 0, (HANDLE)NULL);
+ vim_ignored = _open_osfhandle(conin, _O_RDONLY);
+#endif
}
if (tmpname != NULL) {
@@ -1812,8 +1797,8 @@ failed:
}
if (!filtering && !(flags & READ_DUMMY)) {
- msg_add_fname(curbuf, sfname); /* fname in IObuff with quotes */
- c = FALSE;
+ add_quoted_fname((char *)IObuff, IOSIZE, curbuf, (const char *)sfname);
+ c = false;
#ifdef UNIX
# ifdef S_ISFIFO
@@ -1854,10 +1839,6 @@ failed:
STRCAT(IObuff, _("[CR missing]"));
c = TRUE;
}
- if (split) {
- STRCAT(IObuff, _("[long lines split]"));
- c = TRUE;
- }
if (notconverted) {
STRCAT(IObuff, _("[NOT converted]"));
c = TRUE;
@@ -1884,17 +1865,22 @@ failed:
xfree(keep_msg);
keep_msg = NULL;
+ p = NULL;
msg_scrolled_ign = TRUE;
- p = msg_trunc_attr(IObuff, FALSE, 0);
+
+ if (!read_stdin && !read_buffer) {
+ p = msg_trunc_attr(IObuff, FALSE, 0);
+ }
+
if (read_stdin || read_buffer || restart_edit != 0
- || (msg_scrolled != 0 && !need_wait_return))
- /* Need to repeat the message after redrawing when:
- * - When reading from stdin (the screen will be cleared next).
- * - When restart_edit is set (otherwise there will be a delay
- * before redrawing).
- * - When the screen was scrolled but there is no wait-return
- * prompt. */
+ || (msg_scrolled != 0 && !need_wait_return)) {
+ // Need to repeat the message after redrawing when:
+ // - When reading from stdin (the screen will be cleared next).
+ // - When restart_edit is set (otherwise there will be a delay before
+ // redrawing).
+ // - When the screen was scrolled but there is no wait-return prompt.
set_keep_msg(p, 0);
+ }
msg_scrolled_ign = FALSE;
}
@@ -1957,7 +1943,7 @@ failed:
u_read_undo(NULL, hash, fname);
}
- if (!read_stdin && !read_buffer) {
+ if (!read_stdin && !read_fifo && (!read_buffer || sfname != NULL)) {
int m = msg_scroll;
int n = msg_scrolled;
@@ -1971,20 +1957,29 @@ failed:
* should not be overwritten: Set msg_scroll, restore its value if no
* output was done.
*/
- msg_scroll = TRUE;
- if (filtering)
+ msg_scroll = true;
+ if (filtering) {
apply_autocmds_exarg(EVENT_FILTERREADPOST, NULL, sfname,
- FALSE, curbuf, eap);
- else if (newfile)
+ false, curbuf, eap);
+ } else if (newfile || (read_buffer && sfname != NULL)) {
apply_autocmds_exarg(EVENT_BUFREADPOST, NULL, sfname,
- FALSE, curbuf, eap);
- else
+ false, curbuf, eap);
+ if (!au_did_filetype && *curbuf->b_p_ft != NUL) {
+ // EVENT_FILETYPE was not triggered but the buffer already has a
+ // filetype. Trigger EVENT_FILETYPE using the existing filetype.
+ apply_autocmds(EVENT_FILETYPE, curbuf->b_p_ft, curbuf->b_fname,
+ true, curbuf);
+ }
+ } else {
apply_autocmds_exarg(EVENT_FILEREADPOST, sfname, sfname,
- FALSE, NULL, eap);
- if (msg_scrolled == n)
+ false, NULL, eap);
+ }
+ if (msg_scrolled == n) {
msg_scroll = m;
- if (aborting()) /* autocmds may abort script processing */
+ }
+ if (aborting()) { // autocmds may abort script processing
return FAIL;
+ }
}
if (recoverymode && error)
@@ -1999,7 +1994,7 @@ failed:
/// Do not accept "/dev/fd/[012]", opening these may hang Vim.
///
/// @param fname file name to check
-static bool is_dev_fd_file(char_u *fname)
+bool is_dev_fd_file(char_u *fname)
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
{
return STRNCMP(fname, "/dev/fd/", 8) == 0
@@ -2256,22 +2251,30 @@ buf_write (
int len;
linenr_T lnum;
long nchars;
- char_u *errmsg = NULL;
- int errmsg_allocated = FALSE;
- char_u *errnum = NULL;
+#define SET_ERRMSG_NUM(num, msg) \
+ errnum = num, errmsg = msg, errmsgarg = 0
+#define SET_ERRMSG_ARG(msg, error) \
+ errnum = NULL, errmsg = msg, errmsgarg = error
+#define SET_ERRMSG(msg) \
+ errnum = NULL, errmsg = msg, errmsgarg = 0
+ const char *errnum = NULL;
+ char *errmsg = NULL;
+ int errmsgarg = 0;
+ bool errmsg_allocated = false;
char_u *buffer;
char_u smallbuf[SMBUFSIZE];
char_u *backup_ext;
int bufsize;
- long perm; /* file permissions */
+ long perm; // file permissions
int retval = OK;
- int newfile = FALSE; /* TRUE if file doesn't exist yet */
+ int newfile = false; // TRUE if file doesn't exist yet
int msg_save = msg_scroll;
- int overwriting; /* TRUE if writing over original */
- int no_eol = FALSE; /* no end-of-line written */
- int device = FALSE; /* writing to a device */
+ int overwriting; // TRUE if writing over original
+ int no_eol = false; // no end-of-line written
+ int device = false; // writing to a device
int prev_got_int = got_int;
- bool file_readonly = false; /* overwritten file is read-only */
+ int checking_conversion;
+ bool file_readonly = false; // overwritten file is read-only
static char *err_readonly =
"is read-only (cannot override: \"W\" in 'cpoptions')";
#if defined(UNIX)
@@ -2280,7 +2283,6 @@ buf_write (
/* writing everything */
int whole = (start == 1 && end == buf->b_ml.ml_line_count);
linenr_T old_line_count = buf->b_ml.ml_line_count;
- int attr;
int fileformat;
int write_bin;
struct bw_info write_info; /* info for buf_write_bytes() */
@@ -2390,6 +2392,7 @@ buf_write (
int did_cmd = FALSE;
int nofile_err = FALSE;
int empty_memline = (buf->b_ml.ml_mfp == NULL);
+ bufref_T bufref;
/*
* Apply PRE autocommands.
@@ -2405,8 +2408,9 @@ buf_write (
if (fname == buf->b_sfname)
buf_fname_s = TRUE;
- /* set curwin/curbuf to buf and save a few things */
+ // Set curwin/curbuf to buf and save a few things.
aucmd_prepbuf(&aco, buf);
+ set_bufref(&bufref, buf);
if (append) {
if (!(did_cmd = apply_autocmds_exarg(EVENT_FILEAPPENDCMD,
@@ -2454,14 +2458,13 @@ buf_write (
/* restore curwin/curbuf and a few other things */
aucmd_restbuf(&aco);
- /*
- * In three situations we return here and don't write the file:
- * 1. the autocommands deleted or unloaded the buffer.
- * 2. The autocommands abort script processing.
- * 3. If one of the "Cmd" autocommands was executed.
- */
- if (!buf_valid(buf))
+ // In three situations we return here and don't write the file:
+ // 1. the autocommands deleted or unloaded the buffer.
+ // 2. The autocommands abort script processing.
+ // 3. If one of the "Cmd" autocommands was executed.
+ if (!bufref_valid(&bufref)) {
buf = NULL;
+ }
if (buf == NULL || (buf->b_ml.ml_mfp == NULL && !empty_memline)
|| did_cmd || nofile_err
|| aborting()
@@ -2574,13 +2577,11 @@ buf_write (
perm = file_info_old.stat.st_mode;
if (!S_ISREG(file_info_old.stat.st_mode)) { /* not a file */
if (S_ISDIR(file_info_old.stat.st_mode)) {
- errnum = (char_u *)"E502: ";
- errmsg = (char_u *)_("is a directory");
+ SET_ERRMSG_NUM("E502", _("is a directory"));
goto fail;
}
if (os_nodetype((char *)fname) != NODE_WRITABLE) {
- errnum = (char_u *)"E503: ";
- errmsg = (char_u *)_("is not a file or writable device");
+ SET_ERRMSG_NUM("E503", _("is not a file or writable device"));
goto fail;
}
/* It's a device of some kind (or a fifo) which we can write to
@@ -2590,14 +2591,11 @@ buf_write (
perm = -1;
}
}
-#else /* win32 */
- /*
- * Check for a writable device name.
- */
- c = os_nodetype((char *)fname);
+#else // win32
+ // Check for a writable device name.
+ c = fname == NULL ? NODE_OTHER : os_nodetype((char *)fname);
if (c == NODE_OTHER) {
- errnum = (char_u *)"E503: ";
- errmsg = (char_u *)_("is not a file or writable device");
+ SET_ERRMSG_NUM("E503", _("is not a file or writable device"));
goto fail;
}
if (c == NODE_WRITABLE) {
@@ -2605,20 +2603,18 @@ buf_write (
newfile = TRUE;
perm = -1;
} else {
- perm = os_getperm(fname);
- if (perm < 0)
- newfile = TRUE;
- else if (os_isdir(fname)) {
- errnum = (char_u *)"E502: ";
- errmsg = (char_u *)_("is a directory");
+ perm = os_getperm((const char *)fname);
+ if (perm < 0) {
+ newfile = true;
+ } else if (os_isdir(fname)) {
+ SET_ERRMSG_NUM("E502", _("is a directory"));
goto fail;
}
if (overwriting) {
os_fileinfo((char *)fname, &file_info_old);
}
-
}
-#endif /* !UNIX */
+#endif // !UNIX
if (!device && !newfile) {
/*
@@ -2629,11 +2625,9 @@ buf_write (
if (!forceit && file_readonly) {
if (vim_strchr(p_cpo, CPO_FWRITE) != NULL) {
- errnum = (char_u *)"E504: ";
- errmsg = (char_u *)_(err_readonly);
+ SET_ERRMSG_NUM("E504", _(err_readonly));
} else {
- errnum = (char_u *)"E505: ";
- errmsg = (char_u *)_("is read-only (add ! to override)");
+ SET_ERRMSG_NUM("E505", _("is read-only (add ! to override)"));
}
goto fail;
}
@@ -2869,9 +2863,9 @@ buf_write (
xfree(backup);
backup = NULL;
} else {
- /* set file protection same as original file, but
- * strip s-bit */
- (void)os_setperm(backup, perm & 0777);
+ // set file protection same as original file, but
+ // strip s-bit.
+ (void)os_setperm((const char *)backup, perm & 0777);
#ifdef UNIX
/*
@@ -2882,7 +2876,8 @@ buf_write (
*/
if (file_info_new.stat.st_gid != file_info_old.stat.st_gid
&& os_fchown(bfd, -1, file_info_old.stat.st_gid) != 0) {
- os_setperm(backup, (perm & 0707) | ((perm & 07) << 3));
+ os_setperm((const char *)backup,
+ (perm & 0707) | ((perm & 07) << 3));
}
# ifdef HAVE_SELINUX
mch_copy_sec(fname, backup);
@@ -2900,23 +2895,27 @@ buf_write (
while ((write_info.bw_len = read_eintr(fd, copybuf,
BUFSIZE)) > 0) {
if (buf_write_bytes(&write_info) == FAIL) {
- errmsg = (char_u *)_(
- "E506: Can't write to backup file (add ! to override)");
+ SET_ERRMSG(_(
+ "E506: Can't write to backup file (add ! to override)"));
break;
}
os_breakcheck();
if (got_int) {
- errmsg = (char_u *)_(e_interr);
+ SET_ERRMSG(_(e_interr));
break;
}
}
- if (close(bfd) < 0 && errmsg == NULL)
- errmsg = (char_u *)_(
- "E507: Close error for backup file (add ! to override)");
- if (write_info.bw_len < 0)
- errmsg = (char_u *)_(
- "E508: Can't read file for backup (add ! to override)");
+ int error;
+ if ((error = os_close(bfd)) != 0 && errmsg == NULL) {
+ SET_ERRMSG_ARG(_("E507: Close error for backup file "
+ "(add ! to override): %s"),
+ error);
+ }
+ if (write_info.bw_len < 0) {
+ SET_ERRMSG(_(
+ "E508: Can't read file for backup (add ! to override)"));
+ }
#ifdef UNIX
set_file_time(backup,
file_info_old.stat.st_atim.tv_sec,
@@ -2933,18 +2932,19 @@ buf_write (
}
}
nobackup:
- close(fd); /* ignore errors for closing read file */
+ os_close(fd); // Ignore errors for closing read file.
xfree(copybuf);
- if (backup == NULL && errmsg == NULL)
- errmsg = (char_u *)_(
- "E509: Cannot create backup file (add ! to override)");
- /* ignore errors when forceit is TRUE */
+ if (backup == NULL && errmsg == NULL) {
+ SET_ERRMSG(_(
+ "E509: Cannot create backup file (add ! to override)"));
+ }
+ // Ignore errors when forceit is TRUE.
if ((some_error || errmsg != NULL) && !forceit) {
retval = FAIL;
goto fail;
}
- errmsg = NULL;
+ SET_ERRMSG(NULL);
} else {
char_u *dirp;
char_u *p;
@@ -2959,8 +2959,7 @@ nobackup:
* anyway, thus we need an extra check here.
*/
if (file_readonly && vim_strchr(p_cpo, CPO_FWRITE) != NULL) {
- errnum = (char_u *)"E504: ";
- errmsg = (char_u *)_(err_readonly);
+ SET_ERRMSG_NUM("E504", _(err_readonly));
goto fail;
}
@@ -3024,7 +3023,7 @@ nobackup:
}
}
if (backup == NULL && !forceit) {
- errmsg = (char_u *)_("E510: Can't make backup file (add ! to override)");
+ SET_ERRMSG(_("E510: Can't make backup file (add ! to override)"));
goto fail;
}
}
@@ -3036,8 +3035,8 @@ nobackup:
&& file_info_old.stat.st_uid == getuid()
&& vim_strchr(p_cpo, CPO_FWRITE) == NULL) {
perm |= 0200;
- (void)os_setperm(fname, perm);
- made_writable = TRUE;
+ (void)os_setperm((const char *)fname, perm);
+ made_writable = true;
}
#endif
@@ -3063,9 +3062,9 @@ nobackup:
*/
if (reset_changed && !newfile && overwriting
&& !(exiting && backup != NULL)) {
- ml_preserve(buf, FALSE);
+ ml_preserve(buf, false, !!p_fs);
if (got_int) {
- errmsg = (char_u *)_(e_interr);
+ SET_ERRMSG(_(e_interr));
goto restore_backup;
}
}
@@ -3136,8 +3135,8 @@ nobackup:
*/
if (*p_ccv != NUL) {
wfname = vim_tempname();
- if (wfname == NULL) { /* Can't write without a tempfile! */
- errmsg = (char_u *)_("E214: Can't find temp file for writing");
+ if (wfname == NULL) { // Can't write without a tempfile!
+ SET_ERRMSG(_("E214: Can't find temp file for writing"));
goto restore_backup;
}
}
@@ -3149,362 +3148,399 @@ nobackup:
&& wfname == fname
) {
if (!forceit) {
- errmsg = (char_u *)_(
- "E213: Cannot convert (add ! to write without conversion)");
+ SET_ERRMSG(_(
+ "E213: Cannot convert (add ! to write without conversion)"));
goto restore_backup;
}
notconverted = TRUE;
}
- /*
- * Open the file "wfname" for writing.
- * We may try to open the file twice: If we can't write to the
- * file and forceit is TRUE we delete the existing file and try to create
- * a new one. If this still fails we may have lost the original file!
- * (this may happen when the user reached his quotum for number of files).
- * Appending will fail if the file does not exist and forceit is FALSE.
- */
- while ((fd = os_open((char *)wfname, O_WRONLY | (append
- ? (forceit ? (
- O_APPEND |
- O_CREAT) :
- O_APPEND)
- : (O_CREAT |
- O_TRUNC))
- , perm < 0 ? 0666 : (perm & 0777))) < 0) {
- /*
- * A forced write will try to create a new file if the old one is
- * still readonly. This may also happen when the directory is
- * read-only. In that case the os_remove() will fail.
- */
- if (errmsg == NULL) {
+ // If conversion is taking place, we may first pretend to write and check
+ // for conversion errors. Then loop again to write for real.
+ // When not doing conversion this writes for real right away.
+ for (checking_conversion = true; ; checking_conversion = false) {
+ // There is no need to check conversion when:
+ // - there is no conversion
+ // - we make a backup file, that can be restored in case of conversion
+ // failure.
+ if (!converted || dobackup) {
+ checking_conversion = false;
+ }
+
+ if (checking_conversion) {
+ // Make sure we don't write anything.
+ fd = -1;
+ write_info.bw_fd = fd;
+ } else {
+ // Open the file "wfname" for writing.
+ // We may try to open the file twice: If we can't write to the file
+ // and forceit is TRUE we delete the existing file and try to
+ // create a new one. If this still fails we may have lost the
+ // original file! (this may happen when the user reached his
+ // quotum for number of files).
+ // Appending will fail if the file does not exist and forceit is
+ // FALSE.
+ while ((fd = os_open((char *)wfname,
+ O_WRONLY |
+ (append ?
+ (forceit ? (O_APPEND | O_CREAT) : O_APPEND)
+ : (O_CREAT | O_TRUNC))
+ , perm < 0 ? 0666 : (perm & 0777))) < 0) {
+ // A forced write will try to create a new file if the old one
+ // is still readonly. This may also happen when the directory
+ // is read-only. In that case the mch_remove() will fail.
+ if (errmsg == NULL) {
#ifdef UNIX
- FileInfo file_info;
+ FileInfo file_info;
- /* Don't delete the file when it's a hard or symbolic link. */
- if ((!newfile && os_fileinfo_hardlinks(&file_info) > 1)
- || (os_fileinfo_link((char *)fname, &file_info)
- && !os_fileinfo_id_equal(&file_info, &file_info_old))) {
- errmsg = (char_u *)_("E166: Can't open linked file for writing");
- } else
+ // Don't delete the file when it's a hard or symbolic link.
+ if ((!newfile && os_fileinfo_hardlinks(&file_info_old) > 1)
+ || (os_fileinfo_link((char *)fname, &file_info)
+ && !os_fileinfo_id_equal(&file_info, &file_info_old))) {
+ SET_ERRMSG(_("E166: Can't open linked file for writing"));
+ } else {
#endif
- {
- errmsg = (char_u *)_("E212: Can't open file for writing");
- if (forceit && vim_strchr(p_cpo, CPO_FWRITE) == NULL
- && perm >= 0) {
+ SET_ERRMSG_ARG(_("E212: Can't open file for writing: %s"), fd);
+ if (forceit && vim_strchr(p_cpo, CPO_FWRITE) == NULL
+ && perm >= 0) {
+#ifdef UNIX
+ // we write to the file, thus it should be marked
+ // writable after all
+ if (!(perm & 0200)) {
+ made_writable = true;
+ }
+ perm |= 0200;
+ if (file_info_old.stat.st_uid != getuid()
+ || file_info_old.stat.st_gid != getgid()) {
+ perm &= 0777;
+ }
+#endif
+ if (!append) { // don't remove when appending
+ os_remove((char *)wfname);
+ }
+ continue;
+ }
#ifdef UNIX
- /* we write to the file, thus it should be marked
- writable after all */
- if (!(perm & 0200))
- made_writable = TRUE;
- perm |= 0200;
- if (file_info_old.stat.st_uid != getuid()
- || file_info_old.stat.st_gid != getgid()) {
- perm &= 0777;
}
#endif
- if (!append) /* don't remove when appending */
- os_remove((char *)wfname);
- continue;
}
- }
- }
restore_backup:
- {
- /*
- * If we failed to open the file, we don't need a backup. Throw it
- * away. If we moved or removed the original file try to put the
- * backup in its place.
- */
- if (backup != NULL && wfname == fname) {
- if (backup_copy) {
- /*
- * There is a small chance that we removed the original,
- * try to move the copy in its place.
- * This may not work if the vim_rename() fails.
- * In that case we leave the copy around.
- */
- // If file does not exist, put the copy in its place
- if (!os_path_exists(fname)) {
- vim_rename(backup, fname);
+ {
+ // If we failed to open the file, we don't need a backup. Throw it
+ // away. If we moved or removed the original file try to put the
+ // backup in its place.
+ if (backup != NULL && wfname == fname) {
+ if (backup_copy) {
+ // There is a small chance that we removed the original,
+ // try to move the copy in its place.
+ // This may not work if the vim_rename() fails.
+ // In that case we leave the copy around.
+ // If file does not exist, put the copy in its place
+ if (!os_path_exists(fname)) {
+ vim_rename(backup, fname);
+ }
+ // if original file does exist throw away the copy
+ if (os_path_exists(fname)) {
+ os_remove((char *)backup);
+ }
+ } else {
+ // try to put the original file back
+ vim_rename(backup, fname);
+ }
}
- // if original file does exist throw away the copy
- if (os_path_exists(fname)) {
- os_remove((char *)backup);
+
+ // if original file no longer exists give an extra warning
+ if (!newfile && !os_path_exists(fname)) {
+ end = 0;
}
- } else {
- /* try to put the original file back */
- vim_rename(backup, fname);
}
- }
- // if original file no longer exists give an extra warning
- if (!newfile && !os_path_exists(fname)) {
- end = 0;
+ if (wfname != fname) {
+ xfree(wfname);
+ }
+ goto fail;
}
+ write_info.bw_fd = fd;
}
+ SET_ERRMSG(NULL);
- if (wfname != fname)
- xfree(wfname);
- goto fail;
- }
- errmsg = NULL;
-
+ write_info.bw_buf = buffer;
+ nchars = 0;
- write_info.bw_fd = fd;
- write_info.bw_buf = buffer;
- nchars = 0;
-
- /* use "++bin", "++nobin" or 'binary' */
- if (eap != NULL && eap->force_bin != 0)
- write_bin = (eap->force_bin == FORCE_BIN);
- else
- write_bin = buf->b_p_bin;
-
- /*
- * Skip the BOM when appending and the file already existed, the BOM
- * only makes sense at the start of the file.
- */
- if (buf->b_p_bomb && !write_bin && (!append || perm < 0)) {
- write_info.bw_len = make_bom(buffer, fenc);
- if (write_info.bw_len > 0) {
- /* don't convert */
- write_info.bw_flags = FIO_NOCONVERT | wb_flags;
- if (buf_write_bytes(&write_info) == FAIL)
- end = 0;
- else
- nchars += write_info.bw_len;
+ // use "++bin", "++nobin" or 'binary'
+ if (eap != NULL && eap->force_bin != 0) {
+ write_bin = (eap->force_bin == FORCE_BIN);
+ } else {
+ write_bin = buf->b_p_bin;
+ }
+
+ // Skip the BOM when appending and the file already existed, the BOM
+ // only makes sense at the start of the file.
+ if (buf->b_p_bomb && !write_bin && (!append || perm < 0)) {
+ write_info.bw_len = make_bom(buffer, fenc);
+ if (write_info.bw_len > 0) {
+ // don't convert
+ write_info.bw_flags = FIO_NOCONVERT | wb_flags;
+ if (buf_write_bytes(&write_info) == FAIL) {
+ end = 0;
+ } else {
+ nchars += write_info.bw_len;
+ }
+ }
}
- }
- write_info.bw_start_lnum = start;
+ write_info.bw_start_lnum = start;
- write_undo_file = (buf->b_p_udf && overwriting && !append
- && !filtering && reset_changed);
- if (write_undo_file)
- /* Prepare for computing the hash value of the text. */
- sha256_start(&sha_ctx);
+ write_undo_file = (buf->b_p_udf && overwriting && !append
+ && !filtering && reset_changed && !checking_conversion);
+ if (write_undo_file) {
+ // Prepare for computing the hash value of the text.
+ sha256_start(&sha_ctx);
+ }
- write_info.bw_len = bufsize;
+ write_info.bw_len = bufsize;
#ifdef HAS_BW_FLAGS
- write_info.bw_flags = wb_flags;
+ write_info.bw_flags = wb_flags;
#endif
- fileformat = get_fileformat_force(buf, eap);
- s = buffer;
- len = 0;
- for (lnum = start; lnum <= end; ++lnum) {
- /*
- * The next while loop is done once for each character written.
- * Keep it fast!
- */
- ptr = ml_get_buf(buf, lnum, FALSE) - 1;
- if (write_undo_file)
- sha256_update(&sha_ctx, ptr + 1, (uint32_t)(STRLEN(ptr + 1) + 1));
- while ((c = *++ptr) != NUL) {
- if (c == NL)
- *s = NUL; /* replace newlines with NULs */
- else if (c == CAR && fileformat == EOL_MAC)
- *s = NL; /* Mac: replace CRs with NLs */
- else
- *s = c;
- ++s;
- if (++len != bufsize)
- continue;
- if (buf_write_bytes(&write_info) == FAIL) {
- end = 0; /* write error: break loop */
+ fileformat = get_fileformat_force(buf, eap);
+ s = buffer;
+ len = 0;
+ for (lnum = start; lnum <= end; lnum++) {
+ // The next while loop is done once for each character written.
+ // Keep it fast!
+ ptr = ml_get_buf(buf, lnum, false) - 1;
+ if (write_undo_file) {
+ sha256_update(&sha_ctx, ptr + 1, (uint32_t)(STRLEN(ptr + 1) + 1));
+ }
+ while ((c = *++ptr) != NUL) {
+ if (c == NL) {
+ *s = NUL; // replace newlines with NULs
+ } else if (c == CAR && fileformat == EOL_MAC) {
+ *s = NL; // Mac: replace CRs with NLs
+ } else {
+ *s = c;
+ }
+ s++;
+ if (++len != bufsize) {
+ continue;
+ }
+ if (buf_write_bytes(&write_info) == FAIL) {
+ end = 0; // write error: break loop
+ break;
+ }
+ nchars += bufsize;
+ s = buffer;
+ len = 0;
+ write_info.bw_start_lnum = lnum;
+ }
+ // write failed or last line has no EOL: stop here
+ if (end == 0
+ || (lnum == end
+ && (write_bin || !buf->b_p_fixeol)
+ && (lnum == buf->b_no_eol_lnum
+ || (lnum == buf->b_ml.ml_line_count && !buf->b_p_eol)))) {
+ lnum++; // written the line, count it
+ no_eol = true;
break;
}
- nchars += bufsize;
- s = buffer;
- len = 0;
- write_info.bw_start_lnum = lnum;
- }
- /* write failed or last line has no EOL: stop here */
- if (end == 0
- || (lnum == end
- && (write_bin || !buf->b_p_fixeol)
- && (lnum == buf->b_no_eol_lnum
- || (lnum == buf->b_ml.ml_line_count && !buf->b_p_eol)))) {
- ++lnum; /* written the line, count it */
- no_eol = TRUE;
- break;
- }
- if (fileformat == EOL_UNIX)
- *s++ = NL;
- else {
- *s++ = CAR; /* EOL_MAC or EOL_DOS: write CR */
- if (fileformat == EOL_DOS) { /* write CR-NL */
- if (++len == bufsize) {
- if (buf_write_bytes(&write_info) == FAIL) {
- end = 0; /* write error: break loop */
- break;
+ if (fileformat == EOL_UNIX) {
+ *s++ = NL;
+ } else {
+ *s++ = CAR; // EOL_MAC or EOL_DOS: write CR
+ if (fileformat == EOL_DOS) { // write CR-NL
+ if (++len == bufsize) {
+ if (buf_write_bytes(&write_info) == FAIL) {
+ end = 0; // write error: break loop
+ break;
+ }
+ nchars += bufsize;
+ s = buffer;
+ len = 0;
}
- nchars += bufsize;
- s = buffer;
- len = 0;
+ *s++ = NL;
+ }
+ }
+ if (++len == bufsize) {
+ if (buf_write_bytes(&write_info) == FAIL) {
+ end = 0; // Write error: break loop.
+ break;
+ }
+ nchars += bufsize;
+ s = buffer;
+ len = 0;
+
+ os_breakcheck();
+ if (got_int) {
+ end = 0; // Interrupted, break loop.
+ break;
}
- *s++ = NL;
}
}
- if (++len == bufsize && end) {
+ if (len > 0 && end > 0) {
+ write_info.bw_len = len;
if (buf_write_bytes(&write_info) == FAIL) {
- end = 0; /* write error: break loop */
- break;
+ end = 0; // write error
}
- nchars += bufsize;
- s = buffer;
- len = 0;
+ nchars += len;
+ }
- os_breakcheck();
- if (got_int) {
- end = 0; /* Interrupted, break loop */
+ // Stop when writing done or an error was encountered.
+ if (!checking_conversion || end == 0) {
break;
- }
}
- }
- if (len > 0 && end > 0) {
- write_info.bw_len = len;
- if (buf_write_bytes(&write_info) == FAIL)
- end = 0; /* write error */
- nchars += len;
- }
-#if defined(UNIX)
- // On many journalling file systems there is a bug that causes both the
- // original and the backup file to be lost when halting the system right
- // after writing the file. That's because only the meta-data is
- // journalled. Syncing the file slows down the system, but assures it has
- // been written to disk and we don't lose it.
- // For a device do try the fsync() but don't complain if it does not work
- // (could be a pipe).
- // If the 'fsync' option is FALSE, don't fsync(). Useful for laptops.
- if (p_fs && os_fsync(fd) != 0 && !device) {
- errmsg = (char_u *)_("E667: Fsync failed");
- end = 0;
+ // If no error happened until now, writing should be ok, so loop to
+ // really write the buffer.
}
-#endif
+
+ // If we started writing, finish writing. Also when an error was
+ // encountered.
+ if (!checking_conversion) {
+ // On many journalling file systems there is a bug that causes both the
+ // original and the backup file to be lost when halting the system right
+ // after writing the file. That's because only the meta-data is
+ // journalled. Syncing the file slows down the system, but assures it has
+ // been written to disk and we don't lose it.
+ // For a device do try the fsync() but don't complain if it does not work
+ // (could be a pipe).
+ // If the 'fsync' option is FALSE, don't fsync(). Useful for laptops.
+ int error;
+ if (p_fs && (error = os_fsync(fd)) != 0 && !device) {
+ SET_ERRMSG_ARG(_("E667: Fsync failed: %s"), error);
+ end = 0;
+ }
#ifdef HAVE_SELINUX
- /* Probably need to set the security context. */
- if (!backup_copy)
- mch_copy_sec(backup, wfname);
+ // Probably need to set the security context.
+ if (!backup_copy) {
+ mch_copy_sec(backup, wfname);
+ }
#endif
#ifdef UNIX
- /* When creating a new file, set its owner/group to that of the original
- * file. Get the new device and inode number. */
- if (backup != NULL && !backup_copy) {
- /* don't change the owner when it's already OK, some systems remove
- * permission or ACL stuff */
- FileInfo file_info;
- if (!os_fileinfo((char *)wfname, &file_info)
- || file_info.stat.st_uid != file_info_old.stat.st_uid
- || file_info.stat.st_gid != file_info_old.stat.st_gid) {
- os_fchown(fd, file_info_old.stat.st_uid, file_info_old.stat.st_gid);
- if (perm >= 0) /* set permission again, may have changed */
- (void)os_setperm(wfname, perm);
- }
- buf_set_file_id(buf);
- } else if (!buf->file_id_valid) {
- // Set the file_id when creating a new file.
- buf_set_file_id(buf);
- }
+ // When creating a new file, set its owner/group to that of the original
+ // file. Get the new device and inode number.
+ if (backup != NULL && !backup_copy) {
+ // don't change the owner when it's already OK, some systems remove
+ // permission or ACL stuff
+ FileInfo file_info;
+ if (!os_fileinfo((char *)wfname, &file_info)
+ || file_info.stat.st_uid != file_info_old.stat.st_uid
+ || file_info.stat.st_gid != file_info_old.stat.st_gid) {
+ os_fchown(fd, file_info_old.stat.st_uid, file_info_old.stat.st_gid);
+ if (perm >= 0) { // Set permission again, may have changed.
+ (void)os_setperm((const char *)wfname, perm);
+ }
+ }
+ buf_set_file_id(buf);
+ } else if (!buf->file_id_valid) {
+ // Set the file_id when creating a new file.
+ buf_set_file_id(buf);
+ }
#endif
- if (close(fd) != 0) {
- errmsg = (char_u *)_("E512: Close failed");
- end = 0;
- }
+ if ((error = os_close(fd)) != 0) {
+ SET_ERRMSG_ARG(_("E512: Close failed: %s"), error);
+ end = 0;
+ }
#ifdef UNIX
- if (made_writable)
- perm &= ~0200; /* reset 'w' bit for security reasons */
+ if (made_writable) {
+ perm &= ~0200; // reset 'w' bit for security reasons
+ }
#endif
- if (perm >= 0) /* set perm. of new file same as old file */
- (void)os_setperm(wfname, perm);
+ if (perm >= 0) { // Set perm. of new file same as old file.
+ (void)os_setperm((const char *)wfname, perm);
+ }
#ifdef HAVE_ACL
- /* Probably need to set the ACL before changing the user (can't set the
- * ACL on a file the user doesn't own). */
- if (!backup_copy)
- mch_set_acl(wfname, acl);
+ // Probably need to set the ACL before changing the user (can't set the
+ // ACL on a file the user doesn't own).
+ if (!backup_copy) {
+ mch_set_acl(wfname, acl);
+ }
#endif
- if (wfname != fname) {
- /*
- * The file was written to a temp file, now it needs to be converted
- * with 'charconvert' to (overwrite) the output file.
- */
- if (end != 0) {
- if (eval_charconvert(enc_utf8 ? "utf-8" : (char *) p_enc, (char *) fenc,
- (char *) wfname, (char *) fname) == FAIL) {
- write_info.bw_conv_error = true;
- end = 0;
+ if (wfname != fname) {
+ // The file was written to a temp file, now it needs to be converted
+ // with 'charconvert' to (overwrite) the output file.
+ if (end != 0) {
+ if (eval_charconvert(enc_utf8 ? "utf-8" : (char *)p_enc, (char *)fenc,
+ (char *)wfname, (char *)fname) == FAIL) {
+ write_info.bw_conv_error = true;
+ end = 0;
+ }
}
+ os_remove((char *)wfname);
+ xfree(wfname);
}
- os_remove((char *)wfname);
- xfree(wfname);
}
if (end == 0) {
+ // Error encountered.
if (errmsg == NULL) {
if (write_info.bw_conv_error) {
- if (write_info.bw_conv_error_lnum == 0)
- errmsg = (char_u *)_(
- "E513: write error, conversion failed (make 'fenc' empty to override)");
- else {
- errmsg_allocated = TRUE;
- errmsg = xmalloc(300);
- vim_snprintf((char *)errmsg, 300,
- _("E513: write error, conversion failed in line %" PRId64
+ if (write_info.bw_conv_error_lnum == 0) {
+ SET_ERRMSG(_(
+ "E513: write error, conversion failed "
+ "(make 'fenc' empty to override)"));
+ } else {
+ errmsg_allocated = true;
+ SET_ERRMSG(xmalloc(300));
+ vim_snprintf(
+ errmsg, 300,
+ _("E513: write error, conversion failed in line %" PRIdLINENR
" (make 'fenc' empty to override)"),
- (int64_t)write_info.bw_conv_error_lnum);
+ write_info.bw_conv_error_lnum);
}
- } else if (got_int)
- errmsg = (char_u *)_(e_interr);
- else
- errmsg = (char_u *)_("E514: write error (file system full?)");
+ } else if (got_int) {
+ SET_ERRMSG(_(e_interr));
+ } else {
+ SET_ERRMSG(_("E514: write error (file system full?)"));
+ }
}
- /*
- * If we have a backup file, try to put it in place of the new file,
- * because the new file is probably corrupt. This avoids losing the
- * original file when trying to make a backup when writing the file a
- * second time.
- * When "backup_copy" is set we need to copy the backup over the new
- * file. Otherwise rename the backup file.
- * If this is OK, don't give the extra warning message.
- */
+ // If we have a backup file, try to put it in place of the new file,
+ // because the new file is probably corrupt. This avoids losing the
+ // original file when trying to make a backup when writing the file a
+ // second time.
+ // When "backup_copy" is set we need to copy the backup over the new
+ // file. Otherwise rename the backup file.
+ // If this is OK, don't give the extra warning message.
if (backup != NULL) {
if (backup_copy) {
- /* This may take a while, if we were interrupted let the user
- * know we got the message. */
+ // This may take a while, if we were interrupted let the user
+ // know we got the message.
if (got_int) {
MSG(_(e_interr));
ui_flush();
}
if ((fd = os_open((char *)backup, O_RDONLY, 0)) >= 0) {
if ((write_info.bw_fd = os_open((char *)fname,
- O_WRONLY | O_CREAT | O_TRUNC,
- perm & 0777)) >= 0) {
- /* copy the file. */
+ O_WRONLY | O_CREAT | O_TRUNC,
+ perm & 0777)) >= 0) {
+ // copy the file.
write_info.bw_buf = smallbuf;
#ifdef HAS_BW_FLAGS
write_info.bw_flags = FIO_NOCONVERT;
#endif
while ((write_info.bw_len = read_eintr(fd, smallbuf,
- SMBUFSIZE)) > 0)
- if (buf_write_bytes(&write_info) == FAIL)
+ SMBUFSIZE)) > 0) {
+ if (buf_write_bytes(&write_info) == FAIL) {
break;
+ }
+ }
if (close(write_info.bw_fd) >= 0
- && write_info.bw_len == 0)
- end = 1; /* success */
+ && write_info.bw_len == 0) {
+ end = 1; // success
+ }
}
- close(fd); /* ignore errors for closing read file */
+ close(fd); // ignore errors for closing read file
}
} else {
- if (vim_rename(backup, fname) == 0)
+ if (vim_rename(backup, fname) == 0) {
end = 1;
+ }
}
}
goto fail;
@@ -3517,8 +3553,8 @@ restore_backup:
fname = sfname; /* use shortname now, for the messages */
#endif
if (!filtering) {
- msg_add_fname(buf, fname); /* put fname in IObuff with quotes */
- c = FALSE;
+ add_quoted_fname((char *)IObuff, IOSIZE, buf, (const char *)fname);
+ c = false;
if (write_info.bw_conv_error) {
STRCAT(IObuff, _(" CONVERSION ERROR"));
c = TRUE;
@@ -3561,14 +3597,13 @@ restore_backup:
* writing to the original file and '+' is not in 'cpoptions'. */
if (reset_changed && whole && !append
&& !write_info.bw_conv_error
- && (overwriting || vim_strchr(p_cpo, CPO_PLUS) != NULL)
- ) {
- unchanged(buf, TRUE);
- /* buf->b_changedtick is always incremented in unchanged() but that
- * should not trigger a TextChanged event. */
- if (last_changedtick + 1 == buf->b_changedtick
- && last_changedtick_buf == buf) {
- last_changedtick = buf->b_changedtick;
+ && (overwriting || vim_strchr(p_cpo, CPO_PLUS) != NULL)) {
+ unchanged(buf, true);
+ const varnumber_T changedtick = buf_get_changedtick(buf);
+ if (buf->b_last_changedtick + 1 == changedtick) {
+ // changedtick is always incremented in unchanged() but that
+ // should not trigger a TextChanged event.
+ buf->b_last_changedtick = changedtick;
}
u_unchanged(buf);
u_update_save_nr(buf);
@@ -3627,7 +3662,7 @@ restore_backup:
close(empty_fd);
}
if (org != NULL) {
- os_setperm((char_u *)org, os_getperm(fname) & 0777);
+ os_setperm(org, os_getperm((const char *)fname) & 0777);
xfree(org);
}
}
@@ -3667,33 +3702,32 @@ nofail:
#endif
if (errmsg != NULL) {
- int numlen = errnum != NULL ? (int)STRLEN(errnum) : 0;
-
- attr = hl_attr(HLF_E); /* set highlight for error messages */
- msg_add_fname(buf,
+ // - 100 to save some space for further error message
#ifndef UNIX
- sfname
+ add_quoted_fname((char *)IObuff, IOSIZE - 100, buf, (const char *)sfname);
#else
- fname
+ add_quoted_fname((char *)IObuff, IOSIZE - 100, buf, (const char *)fname);
#endif
- ); /* put file name in IObuff with quotes */
- if (STRLEN(IObuff) + STRLEN(errmsg) + numlen >= IOSIZE)
- IObuff[IOSIZE - STRLEN(errmsg) - numlen - 1] = NUL;
- /* If the error message has the form "is ...", put the error number in
- * front of the file name. */
if (errnum != NULL) {
- STRMOVE(IObuff + numlen, IObuff);
- memmove(IObuff, errnum, (size_t)numlen);
+ if (errmsgarg != 0) {
+ emsgf("%s: %s%s: %s", errnum, IObuff, errmsg, os_strerror(errmsgarg));
+ } else {
+ emsgf("%s: %s%s", errnum, IObuff, errmsg);
+ }
+ } else if (errmsgarg != 0) {
+ emsgf(errmsg, os_strerror(errmsgarg));
+ } else {
+ EMSG(errmsg);
}
- STRCAT(IObuff, errmsg);
- emsg(IObuff);
- if (errmsg_allocated)
+ if (errmsg_allocated) {
xfree(errmsg);
+ }
retval = FAIL;
if (end == 0) {
+ const int attr = HL_ATTR(HLF_E); // Set highlight for error messages.
MSG_PUTS_ATTR(_("\nWARNING: Original file may be lost or damaged\n"),
- attr | MSG_HIST);
+ attr | MSG_HIST);
MSG_PUTS_ATTR(_(
"don't quit the editor until the file is successfully written!"),
attr | MSG_HIST);
@@ -3753,6 +3787,9 @@ nofail:
got_int |= prev_got_int;
return retval;
+#undef SET_ERRMSG
+#undef SET_ERRMSG_ARG
+#undef SET_ERRMSG_NUM
}
/*
@@ -3787,24 +3824,34 @@ static int set_rw_fname(char_u *fname, char_u *sfname)
/* Do filetype detection now if 'filetype' is empty. */
if (*curbuf->b_p_ft == NUL) {
- if (au_has_group((char_u *)"filetypedetect"))
- (void)do_doautocmd((char_u *)"filetypedetect BufRead", FALSE);
+ if (au_has_group((char_u *)"filetypedetect")) {
+ (void)do_doautocmd((char_u *)"filetypedetect BufRead", false, NULL);
+ }
do_modelines(0);
}
return OK;
}
-/*
- * Put file name into IObuff with quotes.
- */
-void msg_add_fname(buf_T *buf, char_u *fname)
+/// Put file name into the specified buffer with quotes
+///
+/// Replaces home directory at the start with `~`.
+///
+/// @param[out] ret_buf Buffer to save results to.
+/// @param[in] buf_len ret_buf length.
+/// @param[in] buf buf_T file name is coming from.
+/// @param[in] fname File name to write.
+static void add_quoted_fname(char *const ret_buf, const size_t buf_len,
+ const buf_T *const buf, const char *fname)
+ FUNC_ATTR_NONNULL_ARG(1)
{
- if (fname == NULL)
- fname = (char_u *)"-stdin-";
- home_replace(buf, fname, IObuff + 1, IOSIZE - 4, TRUE);
- IObuff[0] = '"';
- STRCAT(IObuff, "\" ");
+ if (fname == NULL) {
+ fname = "-stdin-";
+ }
+ ret_buf[0] = '"';
+ home_replace(buf, (const char_u *)fname, (char_u *)ret_buf + 1,
+ (int)buf_len - 4, true);
+ xstrlcat(ret_buf, "\" ", buf_len);
}
/// Append message for text mode to IObuff.
@@ -3836,7 +3883,7 @@ static bool msg_add_fileformat(int eol_type)
/*
* Append line and character count to IObuff.
*/
-void msg_add_lines(int insert_space, long lnum, off_t nchars)
+void msg_add_lines(int insert_space, long lnum, off_T nchars)
{
char_u *p;
@@ -3881,15 +3928,15 @@ static int check_mtime(buf_T *buf, FileInfo *file_info)
if (buf->b_mtime_read != 0
&& time_differs(file_info->stat.st_mtim.tv_sec,
buf->b_mtime_read)) {
- msg_scroll = TRUE; /* don't overwrite messages here */
- msg_silent = 0; /* must give this prompt */
- /* don't use emsg() here, don't want to flush the buffers */
- MSG_ATTR(_("WARNING: The file has been changed since reading it!!!"),
- hl_attr(HLF_E));
- if (ask_yesno((char_u *)_("Do you really want to write to it"),
- TRUE) == 'n')
+ msg_scroll = true; // Don't overwrite messages here.
+ msg_silent = 0; // Must give this prompt.
+ // Don't use emsg() here, don't want to flush the buffers.
+ msg_attr(_("WARNING: The file has been changed since reading it!!!"),
+ HL_ATTR(HLF_E));
+ if (ask_yesno(_("Do you really want to write to it"), true) == 'n') {
return FAIL;
- msg_scroll = FALSE; /* always overwrite the file message now */
+ }
+ msg_scroll = false; // Always overwrite the file message now.
}
return OK;
}
@@ -4083,6 +4130,10 @@ static int buf_write_bytes(struct bw_info *ip)
# endif
}
+ if (ip->bw_fd < 0) {
+ // Only checking conversion, which is OK if we get here.
+ return OK;
+ }
wlen = write_eintr(ip->bw_fd, buf, len);
return (wlen < len) ? FAIL : OK;
}
@@ -4178,9 +4229,8 @@ static bool need_conversion(const char_u *fenc)
same_encoding = (enc_flags != 0 && fenc_flags == enc_flags);
}
if (same_encoding) {
- /* Specified encoding matches with 'encoding'. This requires
- * conversion when 'encoding' is Unicode but not UTF-8. */
- return enc_unicode != 0;
+ // Specified file encoding matches UTF-8.
+ return false;
}
/* Encodings differ. However, conversion is not needed when 'enc' is any
@@ -4296,38 +4346,46 @@ static int make_bom(char_u *buf, char_u *name)
return (int)(p - buf);
}
+/// Shorten filename of a buffer.
+/// When "force" is TRUE: Use full path from now on for files currently being
+/// edited, both for file name and swap file name. Try to shorten the file
+/// names a bit, if safe to do so.
+/// When "force" is FALSE: Only try to shorten absolute file names.
+/// For buffers that have buftype "nofile" or "scratch": never change the file
+/// name.
+void shorten_buf_fname(buf_T *buf, char_u *dirname, int force)
+{
+ char_u *p;
+
+ if (buf->b_fname != NULL
+ && !bt_nofile(buf)
+ && !path_with_url((char *)buf->b_fname)
+ && (force
+ || buf->b_sfname == NULL
+ || path_is_absolute(buf->b_sfname))) {
+ xfree(buf->b_sfname);
+ buf->b_sfname = NULL;
+ p = path_shorten_fname(buf->b_ffname, dirname);
+ if (p != NULL) {
+ buf->b_sfname = vim_strsave(p);
+ buf->b_fname = buf->b_sfname;
+ }
+ if (p == NULL || buf->b_fname == NULL) {
+ buf->b_fname = buf->b_ffname;
+ }
+ }
+}
+
/*
* Shorten filenames for all buffers.
- * When "force" is TRUE: Use full path from now on for files currently being
- * edited, both for file name and swap file name. Try to shorten the file
- * names a bit, if safe to do so.
- * When "force" is FALSE: Only try to shorten absolute file names.
- * For buffers that have buftype "nofile" or "scratch": never change the file
- * name.
*/
void shorten_fnames(int force)
{
char_u dirname[MAXPATHL];
- char_u *p;
os_dirname(dirname, MAXPATHL);
FOR_ALL_BUFFERS(buf) {
- if (buf->b_fname != NULL
- && !bt_nofile(buf)
- && !path_with_url((char *)buf->b_fname)
- && (force
- || buf->b_sfname == NULL
- || path_is_absolute_path(buf->b_sfname))) {
- xfree(buf->b_sfname);
- buf->b_sfname = NULL;
- p = path_shorten_fname(buf->b_ffname, dirname);
- if (p != NULL) {
- buf->b_sfname = vim_strsave(p);
- buf->b_fname = buf->b_sfname;
- }
- if (p == NULL || buf->b_fname == NULL)
- buf->b_fname = buf->b_ffname;
- }
+ shorten_buf_fname(buf, dirname, force);
/* Always make the swap file name a full path, a "nofile" buffer may
* also have a swap file. */
@@ -4389,7 +4447,7 @@ char *modname(const char *fname, const char *ext, bool prepend_dot)
// Search backwards until we hit a '/', '\' or ':'.
// Then truncate what is after the '/', '\' or ':' to BASENAMELEN characters.
char *ptr = NULL;
- for (ptr = retval + fnamelen; ptr > retval; mb_ptr_back(retval, ptr)) {
+ for (ptr = retval + fnamelen; ptr > retval; MB_PTR_BACK(retval, ptr)) {
if (vim_ispathsep(*ptr)) {
ptr++;
break;
@@ -4439,33 +4497,163 @@ char *modname(const char *fname, const char *ext, bool prepend_dot)
/// @param size size of the buffer
/// @param fp file to read from
///
-/// @return true for end-of-file.
+/// @return true for EOF or error
bool vim_fgets(char_u *buf, int size, FILE *fp) FUNC_ATTR_NONNULL_ALL
{
- char *eof;
-#define FGETS_SIZE 200
- char tbuf[FGETS_SIZE];
+ char *retval;
+ assert(size > 0);
buf[size - 2] = NUL;
- eof = fgets((char *)buf, size, fp);
+
+ do {
+ errno = 0;
+ retval = fgets((char *)buf, size, fp);
+ } while (retval == NULL && errno == EINTR && ferror(fp));
+
if (buf[size - 2] != NUL && buf[size - 2] != '\n') {
- buf[size - 1] = NUL; /* Truncate the line */
+ char tbuf[200];
- /* Now throw away the rest of the line: */
+ buf[size - 1] = NUL; // Truncate the line.
+
+ // Now throw away the rest of the line:
do {
- tbuf[FGETS_SIZE - 2] = NUL;
- ignoredp = fgets((char *)tbuf, FGETS_SIZE, fp);
- } while (tbuf[FGETS_SIZE - 2] != NUL && tbuf[FGETS_SIZE - 2] != '\n');
+ tbuf[sizeof(tbuf) - 2] = NUL;
+ errno = 0;
+ retval = fgets((char *)tbuf, sizeof(tbuf), fp);
+ if (retval == NULL && (feof(fp) || errno != EINTR)) {
+ break;
+ }
+ } while (tbuf[sizeof(tbuf) - 2] != NUL && tbuf[sizeof(tbuf) - 2] != '\n');
}
- return eof == NULL;
+ return retval == NULL;
}
-/*
- * os_rename() only works if both files are on the same file system, this
- * function will (attempts to?) copy the file across if rename fails -- webb
- * Return -1 for failure, 0 for success.
- */
-int vim_rename(char_u *from, char_u *to)
+/// Read 2 bytes from "fd" and turn them into an int, MSB first.
+/// Returns -1 when encountering EOF.
+int get2c(FILE *fd)
+{
+ const int n = getc(fd);
+ if (n == EOF) {
+ return -1;
+ }
+ const int c = getc(fd);
+ if (c == EOF) {
+ return -1;
+ }
+ return (n << 8) + c;
+}
+
+/// Read 3 bytes from "fd" and turn them into an int, MSB first.
+/// Returns -1 when encountering EOF.
+int get3c(FILE *fd)
+{
+ int n = getc(fd);
+ if (n == EOF) {
+ return -1;
+ }
+ int c = getc(fd);
+ if (c == EOF) {
+ return -1;
+ }
+ n = (n << 8) + c;
+ c = getc(fd);
+ if (c == EOF) {
+ return -1;
+ }
+ return (n << 8) + c;
+}
+
+/// Read 4 bytes from "fd" and turn them into an int, MSB first.
+/// Returns -1 when encountering EOF.
+int get4c(FILE *fd)
+{
+ // Use unsigned rather than int otherwise result is undefined
+ // when left-shift sets the MSB.
+ unsigned n;
+
+ int c = getc(fd);
+ if (c == EOF) {
+ return -1;
+ }
+ n = (unsigned)c;
+ c = getc(fd);
+ if (c == EOF) {
+ return -1;
+ }
+ n = (n << 8) + (unsigned)c;
+ c = getc(fd);
+ if (c == EOF) {
+ return -1;
+ }
+ n = (n << 8) + (unsigned)c;
+ c = getc(fd);
+ if (c == EOF) {
+ return -1;
+ }
+ n = (n << 8) + (unsigned)c;
+ return (int)n;
+}
+
+/// Read 8 bytes from `fd` and turn them into a time_t, MSB first.
+/// Returns -1 when encountering EOF.
+time_t get8ctime(FILE *fd)
+{
+ time_t n = 0;
+
+ for (int i = 0; i < 8; i++) {
+ const int c = getc(fd);
+ if (c == EOF) {
+ return -1;
+ }
+ n = (n << 8) + c;
+ }
+ return n;
+}
+
+/// Reads a string of length "cnt" from "fd" into allocated memory.
+/// @return pointer to the string or NULL when unable to read that many bytes.
+char *read_string(FILE *fd, size_t cnt)
+{
+ char *str = xmallocz(cnt);
+ for (size_t i = 0; i < cnt; i++) {
+ int c = getc(fd);
+ if (c == EOF) {
+ xfree(str);
+ return NULL;
+ }
+ str[i] = (char)c;
+ }
+ return str;
+}
+
+/// Writes a number to file "fd", most significant bit first, in "len" bytes.
+/// @returns false in case of an error.
+bool put_bytes(FILE *fd, uintmax_t number, size_t len)
+{
+ assert(len > 0);
+ for (size_t i = len - 1; i < len; i--) {
+ if (putc((int)(number >> (i * 8)), fd) == EOF) {
+ return false;
+ }
+ }
+ return true;
+}
+
+/// Writes time_t to file "fd" in 8 bytes.
+/// @returns FAIL when the write failed.
+int put_time(FILE *fd, time_t time_)
+{
+ uint8_t buf[8];
+ time_to_bytes(time_, buf);
+ return fwrite(buf, sizeof(uint8_t), ARRAY_SIZE(buf), fd) == 1 ? OK : FAIL;
+}
+
+/// os_rename() only works if both files are on the same file system, this
+/// function will (attempts to?) copy the file across if rename fails -- webb
+///
+/// @return -1 for failure, 0 for success
+int vim_rename(const char_u *from, const char_u *to)
+ FUNC_ATTR_NONNULL_ALL
{
int fd_in;
int fd_out;
@@ -4484,10 +4672,12 @@ int vim_rename(char_u *from, char_u *to)
* the file name differs we need to go through a temp file.
*/
if (fnamecmp(from, to) == 0) {
- if (p_fic && STRCMP(path_tail(from), path_tail(to)) != 0)
+ if (p_fic && (STRCMP(path_tail((char_u *)from), path_tail((char_u *)to))
+ != 0)) {
use_tmp_file = true;
- else
+ } else {
return 0;
+ }
}
// Fail if the "from" file doesn't exist. Avoids that "to" is deleted.
@@ -4553,9 +4743,9 @@ int vim_rename(char_u *from, char_u *to)
/*
* Rename() failed, try copying the file.
*/
- perm = os_getperm(from);
+ perm = os_getperm((const char *)from);
#ifdef HAVE_ACL
- /* For systems that support ACL: get the ACL from the original file. */
+ // For systems that support ACL: get the ACL from the original file.
acl = mch_get_acl(from);
#endif
fd_in = os_open((char *)from, O_RDONLY, 0);
@@ -4577,7 +4767,7 @@ int vim_rename(char_u *from, char_u *to)
return -1;
}
- // Avoid xmalloc() here as vim_rename() is called by buf_write() when neovim
+ // Avoid xmalloc() here as vim_rename() is called by buf_write() when nvim
// is `preserve_exit()`ing.
buffer = try_malloc(BUFSIZE);
if (buffer == NULL) {
@@ -4603,8 +4793,8 @@ int vim_rename(char_u *from, char_u *to)
errmsg = _("E210: Error reading \"%s\"");
to = from;
}
-#ifndef UNIX /* for Unix os_open() already set the permission */
- os_setperm(to, perm);
+#ifndef UNIX // For Unix os_open() already set the permission.
+ os_setperm((const char *)to, perm);
#endif
#ifdef HAVE_ACL
mch_set_acl(to, acl);
@@ -4636,7 +4826,6 @@ check_timestamps (
int focus /* called for GUI focus event */
)
{
- buf_T *buf;
int didit = 0;
int n;
@@ -4655,32 +4844,33 @@ check_timestamps (
if (!stuff_empty() || global_busy || !typebuf_typed()
|| autocmd_busy || curbuf_lock > 0 || allbuf_lock > 0
- )
- need_check_timestamps = TRUE; /* check later */
- else {
- ++no_wait_return;
- did_check_timestamps = TRUE;
- already_warned = FALSE;
- for (buf = firstbuf; buf != NULL; ) {
- /* Only check buffers in a window. */
+ ) {
+ need_check_timestamps = true; // check later
+ } else {
+ no_wait_return++;
+ did_check_timestamps = true;
+ already_warned = false;
+ FOR_ALL_BUFFERS(buf) {
+ // Only check buffers in a window.
if (buf->b_nwindows > 0) {
+ bufref_T bufref;
+ set_bufref(&bufref, buf);
n = buf_check_timestamp(buf, focus);
- if (didit < n)
+ if (didit < n) {
didit = n;
- if (n > 0 && !buf_valid(buf)) {
- /* Autocommands have removed the buffer, start at the
- * first one again. */
+ }
+ if (n > 0 && !bufref_valid(&bufref)) {
+ // Autocommands have removed the buffer, start at the first one again.
buf = firstbuf;
continue;
}
}
- buf = buf->b_next;
}
--no_wait_return;
need_check_timestamps = FALSE;
if (need_wait_return && didit == 2) {
- /* make sure msg isn't overwritten */
- msg_puts((char_u *)"\n");
+ // make sure msg isn't overwritten
+ msg_puts("\n");
ui_flush();
}
}
@@ -4739,6 +4929,7 @@ buf_check_timestamp (
buf_T *buf,
int focus /* called for GUI focus event */
)
+ FUNC_ATTR_NONNULL_ALL
{
int retval = 0;
char_u *path;
@@ -4754,6 +4945,9 @@ buf_check_timestamp (
char_u *s;
char *reason;
+ bufref_T bufref;
+ set_bufref(&bufref, buf);
+
// If its a terminal, there is no file name, the buffer is not loaded,
// 'buftype' is set, we are in the middle of a save or being called
// recursively: ignore this buffer.
@@ -4776,10 +4970,12 @@ buf_check_timestamp (
)) {
retval = 1;
- /* set b_mtime to stop further warnings (e.g., when executing
- * FileChangedShell autocmd) */
+ // set b_mtime to stop further warnings (e.g., when executing
+ // FileChangedShell autocmd)
if (!file_info_ok) {
- buf->b_mtime = 0;
+ // When 'autoread' is set we'll check the file again to see if it
+ // re-appears.
+ buf->b_mtime = buf->b_p_ar;
buf->b_orig_size = 0;
buf->b_orig_mode = 0;
} else {
@@ -4823,8 +5019,9 @@ buf_check_timestamp (
allbuf_lock--;
busy = false;
if (n) {
- if (!buf_valid(buf))
+ if (!bufref_valid(&bufref)) {
EMSG(_("E246: FileChangedShell autocommand deleted buffer"));
+ }
s = get_vim_var_str(VV_FCS_CHOICE);
if (STRCMP(s, "reload") == 0 && *reason != 'd')
reload = TRUE;
@@ -4886,8 +5083,8 @@ buf_check_timestamp (
set_vim_var_string(VV_WARNINGMSG, tbuf, -1);
if (can_reload) {
if (*mesg2 != NUL) {
- strncat(tbuf, "\n", tbuf_len);
- strncat(tbuf, mesg2, tbuf_len);
+ xstrlcat(tbuf, "\n", tbuf_len - 1);
+ xstrlcat(tbuf, mesg2, tbuf_len - 1);
}
if (do_dialog(VIM_WARNING, (char_u *) _("Warning"), (char_u *) tbuf,
(char_u *) _("&OK\n&Load File"), 1, NULL, true) == 2) {
@@ -4895,18 +5092,17 @@ buf_check_timestamp (
}
} else if (State > NORMAL_BUSY || (State & CMDLINE) || already_warned) {
if (*mesg2 != NUL) {
- strncat(tbuf, "; ", tbuf_len);
- strncat(tbuf, mesg2, tbuf_len);
+ xstrlcat(tbuf, "; ", tbuf_len - 1);
+ xstrlcat(tbuf, mesg2, tbuf_len - 1);
}
EMSG(tbuf);
retval = 2;
} else {
if (!autocmd_busy) {
msg_start();
- msg_puts_attr((char_u *) tbuf, hl_attr(HLF_E) + MSG_HIST);
+ msg_puts_attr(tbuf, HL_ATTR(HLF_E) + MSG_HIST);
if (*mesg2 != NUL) {
- msg_puts_attr((char_u *)mesg2,
- hl_attr(HLF_W) + MSG_HIST);
+ msg_puts_attr(mesg2, HL_ATTR(HLF_W) + MSG_HIST);
}
msg_clr_eos();
(void)msg_end();
@@ -4941,11 +5137,11 @@ buf_check_timestamp (
}
}
- /* Trigger FileChangedShell when the file was changed in any way. */
- if (buf_valid(buf) && retval != 0)
- (void)apply_autocmds(EVENT_FILECHANGEDSHELLPOST,
- buf->b_fname, buf->b_fname, FALSE, buf);
-
+ // Trigger FileChangedShell when the file was changed in any way.
+ if (bufref_valid(&bufref) && retval != 0) {
+ (void)apply_autocmds(EVENT_FILECHANGEDSHELLPOST, buf->b_fname, buf->b_fname,
+ false, buf);
+ }
return retval;
}
@@ -4962,6 +5158,7 @@ void buf_reload(buf_T *buf, int orig_mode)
linenr_T old_topline;
int old_ro = buf->b_p_ro;
buf_T *savebuf;
+ bufref_T bufref;
int saved = OK;
aco_save_T aco;
int flags = READ_NEW;
@@ -4985,18 +5182,17 @@ void buf_reload(buf_T *buf, int orig_mode)
flags |= READ_KEEP_UNDO;
}
- /*
- * To behave like when a new file is edited (matters for
- * BufReadPost autocommands) we first need to delete the current
- * buffer contents. But if reading the file fails we should keep
- * the old contents. Can't use memory only, the file might be
- * too big. Use a hidden buffer to move the buffer contents to.
- */
- if (bufempty() || saved == FAIL)
+ // To behave like when a new file is edited (matters for
+ // BufReadPost autocommands) we first need to delete the current
+ // buffer contents. But if reading the file fails we should keep
+ // the old contents. Can't use memory only, the file might be
+ // too big. Use a hidden buffer to move the buffer contents to.
+ if (BUFEMPTY() || saved == FAIL) {
savebuf = NULL;
- else {
- /* Allocate a buffer without putting it in the buffer list. */
+ } else {
+ // Allocate a buffer without putting it in the buffer list.
savebuf = buflist_new(NULL, NULL, (linenr_T)1, BLN_DUMMY);
+ set_bufref(&bufref, savebuf);
if (savebuf != NULL && buf == curbuf) {
/* Open the memline. */
curbuf = savebuf;
@@ -5014,19 +5210,21 @@ void buf_reload(buf_T *buf, int orig_mode)
}
if (saved == OK) {
- curbuf->b_flags |= BF_CHECK_RO; /* check for RO again */
- keep_filetype = TRUE; /* don't detect 'filetype' */
- if (readfile(buf->b_ffname, buf->b_fname, (linenr_T)0,
- (linenr_T)0,
- (linenr_T)MAXLNUM, &ea, flags) == FAIL) {
- if (!aborting())
+ curbuf->b_flags |= BF_CHECK_RO; // check for RO again
+ keep_filetype = true; // don't detect 'filetype'
+ if (readfile(buf->b_ffname, buf->b_fname, (linenr_T)0, (linenr_T)0,
+ (linenr_T)MAXLNUM, &ea, flags) != OK) {
+ if (!aborting()) {
EMSG2(_("E321: Could not reload \"%s\""), buf->b_fname);
- if (savebuf != NULL && buf_valid(savebuf) && buf == curbuf) {
- /* Put the text back from the save buffer. First
- * delete any lines that readfile() added. */
- while (!bufempty())
- if (ml_delete(buf->b_ml.ml_line_count, FALSE) == FAIL)
+ }
+ if (savebuf != NULL && bufref_valid(&bufref) && buf == curbuf) {
+ // Put the text back from the save buffer. First
+ // delete any lines that readfile() added.
+ while (!BUFEMPTY()) {
+ if (ml_delete(buf->b_ml.ml_line_count, false) == FAIL) {
break;
+ }
+ }
(void)move_lines(savebuf, buf);
}
} else if (buf == curbuf) { /* "buf" still valid */
@@ -5043,8 +5241,9 @@ void buf_reload(buf_T *buf, int orig_mode)
}
xfree(ea.cmd);
- if (savebuf != NULL && buf_valid(savebuf))
- wipe_buffer(savebuf, FALSE);
+ if (savebuf != NULL && bufref_valid(&bufref)) {
+ wipe_buffer(savebuf, false);
+ }
/* Invalidate diff info if necessary. */
diff_invalidate(curbuf);
@@ -5107,7 +5306,7 @@ void forward_slash(char_u *fname)
{
char_u *p;
- if (path_with_url(fname)) {
+ if (path_with_url((const char *)fname)) {
return;
}
for (p = fname; *p != NUL; p++) {
@@ -5135,6 +5334,10 @@ static void vim_maketempdir(void)
// Try the entries in `TEMP_DIR_NAMES` to create the temp directory.
char_u template[TEMP_FILE_PATH_MAXLEN];
char_u path[TEMP_FILE_PATH_MAXLEN];
+
+ // Make sure the umask doesn't remove the executable bit.
+ // "repl" has been reported to use "0177".
+ mode_t umask_save = umask(0077);
for (size_t i = 0; i < ARRAY_SIZE(temp_dirs); i++) {
// Expand environment variables, leave room for "/nvimXXXXXX/999999999"
expand_env((char_u *)temp_dirs[i], template, TEMP_FILE_PATH_MAXLEN - 22);
@@ -5158,12 +5361,13 @@ static void vim_maketempdir(void)
os_rmdir((char *)path);
}
}
+ (void)umask(umask_save);
}
/// Delete "name" and everything in it, recursively.
/// @param name The path which should be deleted.
/// @return 0 for success, -1 if some file was not deleted.
-int delete_recursive(char_u *name)
+int delete_recursive(const char *name)
{
int result = 0;
@@ -5177,7 +5381,7 @@ int delete_recursive(char_u *name)
EW_DIR | EW_FILE | EW_SILENT | EW_ALLLINKS
| EW_DODOT | EW_EMPTYOK) == OK) {
for (int i = 0; i < file_count; i++) {
- if (delete_recursive(files[i]) != 0) {
+ if (delete_recursive((const char *)files[i]) != 0) {
result = -1;
}
}
@@ -5187,9 +5391,9 @@ int delete_recursive(char_u *name)
}
xfree(exp);
- os_rmdir((char *)name);
+ os_rmdir(name);
} else {
- result = os_remove((char *)name) == 0 ? 0 : -1;
+ result = os_remove(name) == 0 ? 0 : -1;
}
return result;
@@ -5201,7 +5405,7 @@ void vim_deltempdir(void)
if (vim_tempdir != NULL) {
// remove the trailing path separator
path_tail(vim_tempdir)[-1] = NUL;
- delete_recursive(vim_tempdir);
+ delete_recursive((const char *)vim_tempdir);
xfree(vim_tempdir);
vim_tempdir = NULL;
}
@@ -5272,11 +5476,9 @@ char_u *vim_tempname(void)
static AutoPatCmd *active_apc_list = NULL; /* stack of active autocommands */
-/*
- * augroups stores a list of autocmd group names.
- */
-static garray_T augroups = {0, 0, sizeof(char_u *), 10, NULL};
-#define AUGROUP_NAME(i) (((char_u **)augroups.ga_data)[i])
+/// List of autocmd group names
+static garray_T augroups = { 0, 0, sizeof(char_u *), 10, NULL };
+#define AUGROUP_NAME(i) (((char **)augroups.ga_data)[i])
/*
* The ID of the current group. Group 0 is the default one.
@@ -5291,6 +5493,18 @@ static event_T last_event;
static int last_group;
static int autocmd_blocked = 0; /* block all autocmds */
+// use get_deleted_augroup() to get this
+static const char *deleted_augroup = NULL;
+
+static inline const char *get_deleted_augroup(void)
+ FUNC_ATTR_ALWAYS_INLINE
+{
+ if (deleted_augroup == NULL) {
+ deleted_augroup = _("--Deleted--");
+ }
+ return deleted_augroup;
+}
+
/*
* Show the autocommands for one AutoPat.
*/
@@ -5310,13 +5524,14 @@ static void show_autocmd(AutoPat *ap, event_T event)
return;
if (event != last_event || ap->group != last_group) {
if (ap->group != AUGROUP_DEFAULT) {
- if (AUGROUP_NAME(ap->group) == NULL)
- msg_puts_attr((char_u *)_("--Deleted--"), hl_attr(HLF_E));
- else
- msg_puts_attr(AUGROUP_NAME(ap->group), hl_attr(HLF_T));
- msg_puts((char_u *)" ");
+ if (AUGROUP_NAME(ap->group) == NULL) {
+ msg_puts_attr(get_deleted_augroup(), HL_ATTR(HLF_E));
+ } else {
+ msg_puts_attr(AUGROUP_NAME(ap->group), HL_ATTR(HLF_T));
+ }
+ msg_puts(" ");
}
- msg_puts_attr(event_nr2name(event), hl_attr(HLF_T));
+ msg_puts_attr(event_nr2name(event), HL_ATTR(HLF_T));
last_event = event;
last_group = ap->group;
msg_putchar('\n');
@@ -5407,6 +5622,15 @@ static void au_cleanup(void)
/* remove the pattern if it has been marked for deletion */
if (ap->pat == NULL) {
+ if (ap->next == NULL) {
+ if (prev_ap == &(first_autopat[(int)event])) {
+ last_autopat[(int)event] = NULL;
+ } else {
+ // this depends on the "next" field being the first in
+ // the struct
+ last_autopat[(int)event] = (AutoPat *)prev_ap;
+ }
+ }
*prev_ap = ap->next;
vim_regfree(ap->reg_prog);
xfree(ap);
@@ -5443,7 +5667,7 @@ void aubuflocal_remove(buf_T *buf)
if (p_verbose >= 6) {
verbose_enter();
smsg(_("auto-removing autocommand: %s <buffer=%d>"),
- event_nr2name(event), buf->b_fnum);
+ event_nr2name(event), buf->b_fnum);
verbose_leave();
}
}
@@ -5466,9 +5690,10 @@ static int au_new_group(char_u *name)
ga_grow(&augroups, 1);
}
- AUGROUP_NAME(i) = vim_strsave(name);
- if (i == augroups.ga_len)
- ++augroups.ga_len;
+ AUGROUP_NAME(i) = xstrdup((char *)name);
+ if (i == augroups.ga_len) {
+ augroups.ga_len++;
+ }
}
return i;
@@ -5479,11 +5704,33 @@ static void au_del_group(char_u *name)
int i;
i = au_find_group(name);
- if (i == AUGROUP_ERROR) /* the group doesn't exist */
+ if (i == AUGROUP_ERROR) { // the group doesn't exist
EMSG2(_("E367: No such group: \"%s\""), name);
- else {
+ } else if (i == current_augroup) {
+ EMSG(_("E936: Cannot delete the current group"));
+ } else {
+ event_T event;
+ AutoPat *ap;
+ int in_use = false;
+
+ for (event = (event_T)0; (int)event < (int)NUM_EVENTS;
+ event = (event_T)((int)event + 1)) {
+ for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next) {
+ if (ap->group == i && ap->pat != NULL) {
+ give_warning((char_u *)
+ _("W19: Deleting augroup that is still in use"), true);
+ in_use = true;
+ event = NUM_EVENTS;
+ break;
+ }
+ }
+ }
xfree(AUGROUP_NAME(i));
- AUGROUP_NAME(i) = NULL;
+ if (in_use) {
+ AUGROUP_NAME(i) = (char *)get_deleted_augroup();
+ } else {
+ AUGROUP_NAME(i) = NULL;
+ }
}
}
@@ -5495,8 +5742,9 @@ static void au_del_group(char_u *name)
static int au_find_group(const char_u *name)
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
- for (int i = 0; i < augroups.ga_len; ++i) {
- if (AUGROUP_NAME(i) != NULL && STRCMP(AUGROUP_NAME(i), name) == 0) {
+ for (int i = 0; i < augroups.ga_len; i++) {
+ if (AUGROUP_NAME(i) != NULL && AUGROUP_NAME(i) != get_deleted_augroup()
+ && STRCMP(AUGROUP_NAME(i), name) == 0) {
return i;
}
}
@@ -5533,7 +5781,7 @@ void do_augroup(char_u *arg, int del_group)
for (int i = 0; i < augroups.ga_len; ++i) {
if (AUGROUP_NAME(i) != NULL) {
msg_puts(AUGROUP_NAME(i));
- msg_puts((char_u *)" ");
+ msg_puts(" ");
}
}
msg_clr_eos();
@@ -5545,11 +5793,18 @@ void do_augroup(char_u *arg, int del_group)
void free_all_autocmds(void)
{
for (current_augroup = -1; current_augroup < augroups.ga_len;
- ++current_augroup)
- do_autocmd((char_u *)"", TRUE);
- ga_clear_strings(&augroups);
-}
+ current_augroup++) {
+ do_autocmd((char_u *)"", true);
+ }
+ for (int i = 0; i < augroups.ga_len; i++) {
+ char *const s = ((char **)(augroups.ga_data))[i];
+ if ((const char *)s != get_deleted_augroup()) {
+ xfree(s);
+ }
+ }
+ ga_clear(&augroups);
+}
#endif
/*
@@ -5557,39 +5812,47 @@ void free_all_autocmds(void)
* Return NUM_EVENTS if the event name was not found.
* Return a pointer to the next event name in "end".
*/
-static event_T event_name2nr(char_u *start, char_u **end)
+static event_T event_name2nr(const char_u *start, char_u **end)
{
- char_u *p;
+ const char_u *p;
int i;
int len;
- /* the event name ends with end of line, a blank or a comma */
- for (p = start; *p && !ascii_iswhite(*p) && *p != ','; ++p)
- ;
- for (i = 0; event_names[i].name != NULL; ++i) {
- len = (int) event_names[i].len;
- if (len == p - start && STRNICMP(event_names[i].name, start, len) == 0)
+ // the event name ends with end of line, '|', a blank or a comma
+ for (p = start; *p && !ascii_iswhite(*p) && *p != ',' && *p != '|'; p++) {
+ }
+ for (i = 0; event_names[i].name != NULL; i++) {
+ len = (int)event_names[i].len;
+ if (len == p - start && STRNICMP(event_names[i].name, start, len) == 0) {
break;
+ }
+ }
+ if (*p == ',') {
+ p++;
}
- if (*p == ',')
- ++p;
- *end = p;
- if (event_names[i].name == NULL)
+ *end = (char_u *)p;
+ if (event_names[i].name == NULL) {
return NUM_EVENTS;
+ }
return event_names[i].event;
}
-/*
- * Return the name for event "event".
- */
-static char_u *event_nr2name(event_T event)
+/// Return the name for event
+///
+/// @param[in] event Event to return name for.
+///
+/// @return Event name, static string. Returns "Unknown" for unknown events.
+static const char *event_nr2name(event_T event)
+ FUNC_ATTR_NONNULL_RET FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_CONST
{
int i;
- for (i = 0; event_names[i].name != NULL; ++i)
- if (event_names[i].event == event)
- return (char_u *)event_names[i].name;
- return (char_u *)"Unknown";
+ for (i = 0; event_names[i].name != NULL; i++) {
+ if (event_names[i].event == event) {
+ return event_names[i].name;
+ }
+ }
+ return "Unknown";
}
/*
@@ -5611,7 +5874,7 @@ find_end_event (
}
pat = arg + 1;
} else {
- for (pat = arg; *pat && !ascii_iswhite(*pat); pat = p) {
+ for (pat = arg; *pat && *pat != '|' && !ascii_iswhite(*pat); pat = p) {
if ((int)event_name2nr(pat, &p) >= (int)NUM_EVENTS) {
if (have_group)
EMSG2(_("E216: No such event: %s"), pat);
@@ -5702,19 +5965,19 @@ void au_event_restore(char_u *old_ei)
* will be automatically executed for <event>
* when editing a file matching <pat>, in
* the current group.
- * :autocmd <event> <pat> Show the auto-commands associated with
+ * :autocmd <event> <pat> Show the autocommands associated with
* <event> and <pat>.
- * :autocmd <event> Show the auto-commands associated with
+ * :autocmd <event> Show the autocommands associated with
* <event>.
- * :autocmd Show all auto-commands.
- * :autocmd! <event> <pat> <cmd> Remove all auto-commands associated with
+ * :autocmd Show all autocommands.
+ * :autocmd! <event> <pat> <cmd> Remove all autocommands associated with
* <event> and <pat>, and add the command
* <cmd>, for the current group.
- * :autocmd! <event> <pat> Remove all auto-commands associated with
+ * :autocmd! <event> <pat> Remove all autocommands associated with
* <event> and <pat> for the current group.
- * :autocmd! <event> Remove all auto-commands associated with
+ * :autocmd! <event> Remove all autocommands associated with
* <event> for the current group.
- * :autocmd! Remove ALL auto-commands for the current
+ * :autocmd! Remove ALL autocommands for the current
* group.
*
* Multiple events and patterns may be given separated by commas. Here are
@@ -5726,20 +5989,23 @@ void au_event_restore(char_u *old_ei)
*
* Mostly a {group} argument can optionally appear before <event>.
*/
-void do_autocmd(char_u *arg, int forceit)
+void do_autocmd(char_u *arg_in, int forceit)
{
+ char_u *arg = arg_in;
char_u *pat;
char_u *envpat = NULL;
char_u *cmd;
- event_T event;
- int need_free = FALSE;
- int nested = FALSE;
+ int need_free = false;
+ int nested = false;
int group;
- /*
- * Check for a legal group name. If not, use AUGROUP_ALL.
- */
- group = au_get_grouparg(&arg);
+ if (*arg == '|') {
+ arg = (char_u *)"";
+ group = AUGROUP_ALL; // no argument, use all groups
+ } else {
+ // Check for a legal group name. If not, use AUGROUP_ALL.
+ group = au_get_grouparg(&arg);
+ }
/*
* Scan over the events.
@@ -5749,73 +6015,78 @@ void do_autocmd(char_u *arg, int forceit)
if (pat == NULL)
return;
- /*
- * Scan over the pattern. Put a NUL at the end.
- */
pat = skipwhite(pat);
- cmd = pat;
- while (*cmd && (!ascii_iswhite(*cmd) || cmd[-1] == '\\'))
- cmd++;
- if (*cmd)
- *cmd++ = NUL;
-
- /* Expand environment variables in the pattern. Set 'shellslash', we want
- * forward slashes here. */
- if (vim_strchr(pat, '$') != NULL || vim_strchr(pat, '~') != NULL) {
+ if (*pat == '|') {
+ pat = (char_u *)"";
+ cmd = (char_u *)"";
+ } else {
+ // Scan over the pattern. Put a NUL at the end.
+ cmd = pat;
+ while (*cmd && (!ascii_iswhite(*cmd) || cmd[-1] == '\\')) {
+ cmd++;
+ }
+ if (*cmd) {
+ *cmd++ = NUL;
+ }
+
+ // Expand environment variables in the pattern. Set 'shellslash', we want
+ // forward slashes here.
+ if (vim_strchr(pat, '$') != NULL || vim_strchr(pat, '~') != NULL) {
#ifdef BACKSLASH_IN_FILENAME
- int p_ssl_save = p_ssl;
+ int p_ssl_save = p_ssl;
- p_ssl = TRUE;
+ p_ssl = true;
#endif
- envpat = expand_env_save(pat);
+ envpat = expand_env_save(pat);
#ifdef BACKSLASH_IN_FILENAME
- p_ssl = p_ssl_save;
+ p_ssl = p_ssl_save;
#endif
- if (envpat != NULL)
- pat = envpat;
- }
+ if (envpat != NULL) {
+ pat = envpat;
+ }
+ }
- /*
- * Check for "nested" flag.
- */
- cmd = skipwhite(cmd);
- if (*cmd != NUL && STRNCMP(cmd, "nested", 6) == 0 && ascii_iswhite(cmd[6])) {
- nested = TRUE;
- cmd = skipwhite(cmd + 6);
- }
+ // Check for "nested" flag.
+ cmd = skipwhite(cmd);
+ if (*cmd != NUL && STRNCMP(cmd, "nested", 6) == 0
+ && ascii_iswhite(cmd[6])) {
+ nested = true;
+ cmd = skipwhite(cmd + 6);
+ }
- /*
- * Find the start of the commands.
- * Expand <sfile> in it.
- */
- if (*cmd != NUL) {
- cmd = expand_sfile(cmd);
- if (cmd == NULL) /* some error */
- return;
- need_free = TRUE;
+ // Find the start of the commands.
+ // Expand <sfile> in it.
+ if (*cmd != NUL) {
+ cmd = expand_sfile(cmd);
+ if (cmd == NULL) { // some error
+ return;
+ }
+ need_free = true;
+ }
}
/*
* Print header when showing autocommands.
*/
if (!forceit && *cmd == NUL) {
- /* Highlight title */
- MSG_PUTS_TITLE(_("\n--- Auto-Commands ---"));
+ // Highlight title
+ MSG_PUTS_TITLE(_("\n--- Autocommands ---"));
}
/*
* Loop over the events.
*/
- last_event = (event_T)-1; /* for listing the event name */
- last_group = AUGROUP_ERROR; /* for listing the group name */
- if (*arg == '*' || *arg == NUL) {
- for (event = (event_T)0; (int)event < (int)NUM_EVENTS;
- event = (event_T)((int)event + 1))
- if (do_autocmd_event(event, pat,
- nested, cmd, forceit, group) == FAIL)
+ last_event = (event_T)-1; // for listing the event name
+ last_group = AUGROUP_ERROR; // for listing the group name
+ if (*arg == '*' || *arg == NUL || *arg == '|') {
+ for (event_T event = (event_T)0; (int)event < (int)NUM_EVENTS;
+ event = (event_T)((int)event + 1)) {
+ if (do_autocmd_event(event, pat, nested, cmd, forceit, group) == FAIL) {
break;
+ }
+ }
} else {
- while (*arg && !ascii_iswhite(*arg)) {
+ while (*arg && *arg != '|' && !ascii_iswhite(*arg)) {
event_T event = event_name2nr(arg, &arg);
assert(event < NUM_EVENTS);
if (do_autocmd_event(event, pat, nested, cmd, forceit, group) == FAIL) {
@@ -5842,7 +6113,8 @@ static int au_get_grouparg(char_u **argp)
char_u *arg = *argp;
int group = AUGROUP_ALL;
- p = skiptowhite(arg);
+ for (p = arg; *p && !ascii_iswhite(*p) && *p != '|'; p++) {
+ }
if (p > arg) {
group_name = vim_strnsave(arg, (int)(p - arg));
group = au_find_group(group_name);
@@ -5950,10 +6222,13 @@ static int do_autocmd_event(event_T event, char_u *pat, int nested, char_u *cmd,
patlen = (int)STRLEN(buflocal_pat); /* but not endpat */
}
- /*
- * Find AutoPat entries with this pattern.
- */
- prev_ap = &first_autopat[(int)event];
+ // Find AutoPat entries with this pattern. When adding a command it
+ // always goes at or after the last one, so start at the end.
+ if (!forceit && *cmd != NUL && last_autopat[(int)event] != NULL) {
+ prev_ap = &last_autopat[(int)event];
+ } else {
+ prev_ap = &first_autopat[(int)event];
+ }
while ((ap = *prev_ap) != NULL) {
if (ap->pat != NULL) {
/* Accept a pattern when:
@@ -6010,8 +6285,8 @@ static int do_autocmd_event(event_T event, char_u *pat, int nested, char_u *cmd,
/* refuse to add buffer-local ap if buffer number is invalid */
if (is_buflocal && (buflocal_nr == 0
|| buflist_findnr(buflocal_nr) == NULL)) {
- EMSGN(_("E680: <buffer=%d>: invalid buffer number "),
- buflocal_nr);
+ emsgf(_("E680: <buffer=%d>: invalid buffer number "),
+ buflocal_nr);
return FAIL;
}
@@ -6039,6 +6314,7 @@ static int do_autocmd_event(event_T event, char_u *pat, int nested, char_u *cmd,
}
ap->cmds = NULL;
*prev_ap = ap;
+ last_autopat[(int)event] = ap;
ap->next = NULL;
if (group == AUGROUP_ALL)
ap->group = current_augroup;
@@ -6072,13 +6348,18 @@ static int do_autocmd_event(event_T event, char_u *pat, int nested, char_u *cmd,
int
do_doautocmd (
char_u *arg,
- int do_msg /* give message for no matching autocmds? */
+ int do_msg, // give message for no matching autocmds?
+ bool *did_something
)
{
char_u *fname;
int nothing_done = TRUE;
int group;
+ if (did_something != NULL) {
+ *did_something = false;
+ }
+
/*
* Check for a legal group name. If not, use AUGROUP_ALL.
*/
@@ -6099,16 +6380,20 @@ do_doautocmd (
fname = skipwhite(fname);
- /*
- * Loop over the events.
- */
- while (*arg && !ascii_iswhite(*arg))
- if (apply_autocmds_group(event_name2nr(arg, &arg),
- fname, NULL, TRUE, group, curbuf, NULL))
- nothing_done = FALSE;
+ // Loop over the events.
+ while (*arg && !ends_excmd(*arg) && !ascii_iswhite(*arg)) {
+ if (apply_autocmds_group(event_name2nr(arg, &arg), fname, NULL, true,
+ group, curbuf, NULL)) {
+ nothing_done = false;
+ }
+ }
- if (nothing_done && do_msg)
+ if (nothing_done && do_msg) {
MSG(_("No matching autocommands"));
+ }
+ if (did_something != NULL) {
+ *did_something = !nothing_done;
+ }
return aborting() ? FAIL : OK;
}
@@ -6122,6 +6407,7 @@ void ex_doautoall(exarg_T *eap)
aco_save_T aco;
char_u *arg = eap->arg;
int call_do_modelines = check_nomodeline(&arg);
+ bufref_T bufref;
/*
* This is a bit tricky: For some commands curwin->w_buffer needs to be
@@ -6134,25 +6420,28 @@ void ex_doautoall(exarg_T *eap)
if (buf->b_ml.ml_mfp == NULL) {
continue;
}
- /* find a window for this buffer and save some values */
+ // Find a window for this buffer and save some values.
aucmd_prepbuf(&aco, buf);
+ set_bufref(&bufref, buf);
- /* execute the autocommands for this buffer */
- retval = do_doautocmd(arg, FALSE);
+ bool did_aucmd;
+ // execute the autocommands for this buffer
+ retval = do_doautocmd(arg, false, &did_aucmd);
- if (call_do_modelines) {
- /* Execute the modeline settings, but don't set window-local
- * options if we are using the current window for another
- * buffer. */
+ if (call_do_modelines && did_aucmd) {
+ // Execute the modeline settings, but don't set window-local
+ // options if we are using the current window for another
+ // buffer.
do_modelines(curwin == aucmd_win ? OPT_NOWIN : 0);
}
/* restore the current window */
aucmd_restbuf(&aco);
- /* stop if there is some error or buffer was deleted */
- if (retval == FAIL || !buf_valid(buf))
+ // Stop if there is some error or buffer was deleted.
+ if (retval == FAIL || !bufref_valid(&bufref)) {
break;
+ }
}
check_cursor(); /* just in case lines got deleted */
@@ -6259,30 +6548,27 @@ aucmd_prepbuf (
}
curbuf = buf;
aco->new_curwin = curwin;
- aco->new_curbuf = curbuf;
+ set_bufref(&aco->new_curbuf, curbuf);
}
-/*
- * Cleanup after executing autocommands for a (hidden) buffer.
- * Restore the window as it was (if possible).
- */
-void
-aucmd_restbuf (
- aco_save_T *aco /* structure holding saved values */
-)
+/// Cleanup after executing autocommands for a (hidden) buffer.
+/// Restore the window as it was (if possible).
+///
+/// @param aco structure holding saved values
+void aucmd_restbuf(aco_save_T *aco)
{
int dummy;
if (aco->use_aucmd_win) {
- --curbuf->b_nwindows;
- /* Find "aucmd_win", it can't be closed, but it may be in another tab
- * page. Do not trigger autocommands here. */
+ curbuf->b_nwindows--;
+ // Find "aucmd_win", it can't be closed, but it may be in another tab page.
+ // Do not trigger autocommands here.
block_autocmds();
if (curwin != aucmd_win) {
FOR_ALL_TAB_WINDOWS(tp, wp) {
if (wp == aucmd_win) {
if (tp != curtab) {
- goto_tabpage_tp(tp, TRUE, TRUE);
+ goto_tabpage_tp(tp, true, true);
}
win_goto(aucmd_win);
goto win_found;
@@ -6291,49 +6577,56 @@ aucmd_restbuf (
}
win_found:
- /* Remove the window and frame from the tree of frames. */
+ // Remove the window and frame from the tree of frames.
(void)winframe_remove(curwin, &dummy, NULL);
win_remove(curwin, NULL);
- aucmd_win_used = FALSE;
- last_status(FALSE); /* may need to remove last status line */
- restore_snapshot(SNAP_AUCMD_IDX, FALSE);
- (void)win_comp_pos(); /* recompute window positions */
+ aucmd_win_used = false;
+ last_status(false); // may need to remove last status line
+
+ if (!valid_tabpage_win(curtab)) {
+ // no valid window in current tabpage
+ close_tabpage(curtab);
+ }
+
+ restore_snapshot(SNAP_AUCMD_IDX, false);
+ (void)win_comp_pos(); // recompute window positions
unblock_autocmds();
- if (win_valid(aco->save_curwin))
+ if (win_valid(aco->save_curwin)) {
curwin = aco->save_curwin;
- else
- /* Hmm, original window disappeared. Just use the first one. */
+ } else {
+ // Hmm, original window disappeared. Just use the first one.
curwin = firstwin;
- vars_clear(&aucmd_win->w_vars->dv_hashtab); /* free all w: variables */
- hash_init(&aucmd_win->w_vars->dv_hashtab); /* re-use the hashtab */
+ }
+ vars_clear(&aucmd_win->w_vars->dv_hashtab); // free all w: variables
+ hash_init(&aucmd_win->w_vars->dv_hashtab); // re-use the hashtab
curbuf = curwin->w_buffer;
xfree(globaldir);
globaldir = aco->globaldir;
- /* the buffer contents may have changed */
+ // the buffer contents may have changed
check_cursor();
if (curwin->w_topline > curbuf->b_ml.ml_line_count) {
curwin->w_topline = curbuf->b_ml.ml_line_count;
curwin->w_topfill = 0;
}
} else {
- /* restore curwin */
+ // restore curwin
if (win_valid(aco->save_curwin)) {
- /* Restore the buffer which was previously edited by curwin, if
- * it was changed, we are still the same window and the buffer is
- * valid. */
+ // Restore the buffer which was previously edited by curwin, if it was
+ // changed, we are still the same window and the buffer is valid.
if (curwin == aco->new_curwin
- && curbuf != aco->new_curbuf
- && buf_valid(aco->new_curbuf)
- && aco->new_curbuf->b_ml.ml_mfp != NULL) {
- if (curwin->w_s == &curbuf->b_s)
- curwin->w_s = &aco->new_curbuf->b_s;
- --curbuf->b_nwindows;
- curbuf = aco->new_curbuf;
+ && curbuf != aco->new_curbuf.br_buf
+ && bufref_valid(&aco->new_curbuf)
+ && aco->new_curbuf.br_buf->b_ml.ml_mfp != NULL) {
+ if (curwin->w_s == &curbuf->b_s) {
+ curwin->w_s = &aco->new_curbuf.br_buf->b_s;
+ }
+ curbuf->b_nwindows--;
+ curbuf = aco->new_curbuf.br_buf;
curwin->w_buffer = curbuf;
- ++curbuf->b_nwindows;
+ curbuf->b_nwindows++;
}
curwin = aco->save_curwin;
@@ -6439,7 +6732,7 @@ bool trigger_cursorhold(void) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
/// Return true if "event" autocommand is defined.
///
/// @param event the autocommand to check
-bool has_event(int event) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
+bool has_event(event_T event) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
return first_autopat[event] != NULL;
}
@@ -6468,7 +6761,6 @@ static bool apply_autocmds_group(event_T event, char_u *fname, char_u *fname_io,
char_u *save_sourcing_name;
linenr_T save_sourcing_lnum;
char_u *save_autocmd_fname;
- int save_autocmd_fname_full;
int save_autocmd_bufnr;
char_u *save_autocmd_match;
int save_autocmd_busy;
@@ -6483,13 +6775,15 @@ static bool apply_autocmds_group(event_T event, char_u *fname, char_u *fname_io,
static int filechangeshell_busy = FALSE;
proftime_T wait_time;
bool did_save_redobuff = false;
+ save_redo_T save_redo;
+ const bool save_KeyTyped = KeyTyped;
- /*
- * Quickly return if there are no autocommands for this event or
- * autocommands are blocked.
- */
- if (first_autopat[(int)event] == NULL || autocmd_blocked > 0)
+ // Quickly return if there are no autocommands for this event or
+ // autocommands are blocked.
+ if (event == NUM_EVENTS || first_autopat[(int)event] == NULL
+ || autocmd_blocked > 0) {
goto BYPASS_AU;
+ }
/*
* When autocommands are busy, new autocommands are only executed when
@@ -6541,7 +6835,6 @@ static bool apply_autocmds_group(event_T event, char_u *fname, char_u *fname_io,
* Save the autocmd_* variables and info about the current buffer.
*/
save_autocmd_fname = autocmd_fname;
- save_autocmd_fname_full = autocmd_fname_full;
save_autocmd_bufnr = autocmd_bufnr;
save_autocmd_match = autocmd_match;
save_autocmd_busy = autocmd_busy;
@@ -6555,19 +6848,24 @@ static bool apply_autocmds_group(event_T event, char_u *fname, char_u *fname_io,
* invalid.
*/
if (fname_io == NULL) {
- if (event == EVENT_COLORSCHEME || event == EVENT_OPTIONSET)
+ if (event == EVENT_COLORSCHEME
+ || event == EVENT_COLORSCHEMEPRE
+ || event == EVENT_OPTIONSET) {
autocmd_fname = NULL;
- else if (fname != NULL && *fname != NUL)
+ } else if (fname != NULL && !ends_excmd(*fname)) {
autocmd_fname = fname;
- else if (buf != NULL)
+ } else if (buf != NULL) {
autocmd_fname = buf->b_ffname;
- else
+ } else {
autocmd_fname = NULL;
- } else
+ }
+ } else {
autocmd_fname = fname_io;
- if (autocmd_fname != NULL)
- autocmd_fname = vim_strsave(autocmd_fname);
- autocmd_fname_full = FALSE; /* call FullName_save() later */
+ }
+ if (autocmd_fname != NULL) {
+ // Allocate MAXPATHL for when eval_vars() resolves the fullpath.
+ autocmd_fname = vim_strnsave(autocmd_fname, MAXPATHL);
+ }
/*
* Set the buffer number to be used for <abuf>.
@@ -6601,8 +6899,16 @@ static bool apply_autocmds_group(event_T event, char_u *fname, char_u *fname_io,
fname = vim_strsave(fname); /* make a copy, so we can change it */
} else {
sfname = vim_strsave(fname);
- // don't try expanding the following events
- if (event == EVENT_COLORSCHEME
+ // Don't try expanding the following events.
+ if (event == EVENT_CMDLINECHANGED
+ || event == EVENT_CMDLINEENTER
+ || event == EVENT_CMDLINELEAVE
+ || event == EVENT_CMDWINENTER
+ || event == EVENT_CMDWINLEAVE
+ || event == EVENT_CMDUNDEFINED
+ || event == EVENT_COLORSCHEME
+ || event == EVENT_COLORSCHEMEPRE
+ || event == EVENT_DIRCHANGED
|| event == EVENT_FILETYPE
|| event == EVENT_FUNCUNDEFINED
|| event == EVENT_OPTIONSET
@@ -6611,10 +6917,11 @@ static bool apply_autocmds_group(event_T event, char_u *fname, char_u *fname_io,
|| event == EVENT_REMOTEREPLY
|| event == EVENT_SPELLFILEMISSING
|| event == EVENT_SYNTAX
- || event == EVENT_TABCLOSED)
+ || event == EVENT_TABCLOSED) {
fname = vim_strsave(fname);
- else
- fname = (char_u *)FullName_save((char *)fname, FALSE);
+ } else {
+ fname = (char_u *)FullName_save((char *)fname, false);
+ }
}
if (fname == NULL) { /* out of memory */
xfree(sfname);
@@ -6638,8 +6945,8 @@ static bool apply_autocmds_group(event_T event, char_u *fname, char_u *fname_io,
autocmd_match = fname;
- /* Don't redraw while doing auto commands. */
- ++RedrawingDisabled;
+ // Don't redraw while doing autocommands.
+ RedrawingDisabled++;
save_sourcing_name = sourcing_name;
sourcing_name = NULL; /* don't free this one */
save_sourcing_lnum = sourcing_lnum;
@@ -6659,7 +6966,7 @@ static bool apply_autocmds_group(event_T event, char_u *fname, char_u *fname_io,
if (!autocmd_busy) {
save_search_patterns();
if (!ins_compl_active()) {
- saveRedobuff();
+ saveRedobuff(&save_redo);
did_save_redobuff = true;
}
did_filetype = keep_filetype;
@@ -6696,8 +7003,8 @@ static bool apply_autocmds_group(event_T event, char_u *fname, char_u *fname_io,
patcmd.next = active_apc_list;
active_apc_list = &patcmd;
- /* set v:cmdarg (only when there is a matching pattern) */
- save_cmdbang = get_vim_var_nr(VV_CMDBANG);
+ // set v:cmdarg (only when there is a matching pattern)
+ save_cmdbang = (long)get_vim_var_nr(VV_CMDBANG);
if (eap != NULL) {
save_cmdarg = set_cmdarg(eap, NULL);
set_vim_var_nr(VV_CMDBANG, (long)eap->forceit);
@@ -6732,13 +7039,13 @@ static bool apply_autocmds_group(event_T event, char_u *fname, char_u *fname_io,
sourcing_lnum = save_sourcing_lnum;
xfree(autocmd_fname);
autocmd_fname = save_autocmd_fname;
- autocmd_fname_full = save_autocmd_fname_full;
autocmd_bufnr = save_autocmd_bufnr;
autocmd_match = save_autocmd_match;
current_SID = save_current_SID;
restore_funccal(save_funccalp);
if (do_profiling == PROF_YES)
prof_child_exit(&wait_time);
+ KeyTyped = save_KeyTyped;
xfree(fname);
xfree(sfname);
--nesting; /* see matching increment above */
@@ -6749,7 +7056,7 @@ static bool apply_autocmds_group(event_T event, char_u *fname, char_u *fname_io,
if (!autocmd_busy) {
restore_search_patterns();
if (did_save_redobuff) {
- restoreRedobuff();
+ restoreRedobuff(&save_redo);
}
did_filetype = FALSE;
while (au_pending_free_buf != NULL) {
@@ -6787,6 +7094,10 @@ BYPASS_AU:
if (event == EVENT_BUFWIPEOUT && buf != NULL)
aubuflocal_remove(buf);
+ if (retval == OK && event == EVENT_FILETYPE) {
+ au_did_filetype = true;
+ }
+
return retval;
}
@@ -6827,7 +7138,6 @@ auto_next_pat (
{
AutoPat *ap;
AutoCmd *cp;
- char_u *name;
char *s;
xfree(sourcing_name);
@@ -6846,11 +7156,13 @@ auto_next_pat (
? match_file_pat(NULL, &ap->reg_prog, apc->fname, apc->sfname,
apc->tail, ap->allow_dirs)
: ap->buflocal_nr == apc->arg_bufnr) {
- name = event_nr2name(apc->event);
- s = _("%s Auto commands for \"%s\"");
- sourcing_name = xmalloc(STRLEN(s) + STRLEN(name) + ap->patlen + 1);
- sprintf((char *)sourcing_name, s,
- (char *)name, (char *)ap->pat);
+ const char *const name = event_nr2name(apc->event);
+ s = _("%s Autocommands for \"%s\"");
+ const size_t sourcing_name_len = (STRLEN(s) + strlen(name) + ap->patlen
+ + 1);
+ sourcing_name = xmalloc(sourcing_name_len);
+ snprintf((char *)sourcing_name, sourcing_name_len, s, name,
+ (char *)ap->pat);
if (p_verbose >= 8) {
verbose_enter();
smsg(_("Executing %s"), sourcing_name);
@@ -6916,7 +7228,7 @@ char_u *getnextac(int c, void *cookie, int indent)
if (p_verbose >= 9) {
verbose_enter_scroll();
smsg(_("autocommand %s"), ac->cmd);
- msg_puts((char_u *)"\n"); /* don't overwrite this either */
+ msg_puts("\n"); // don't overwrite this either
verbose_leave_scroll();
}
retval = vim_strsave(ac->cmd);
@@ -6982,13 +7294,17 @@ bool has_autocmd(event_T event, char_u *sfname, buf_T *buf)
*/
char_u *get_augroup_name(expand_T *xp, int idx)
{
- if (idx == augroups.ga_len) /* add "END" add the end */
+ if (idx == augroups.ga_len) { // add "END" add the end
return (char_u *)"END";
- if (idx >= augroups.ga_len) /* end of list */
+ }
+ if (idx >= augroups.ga_len) { // end of list
return NULL;
- if (AUGROUP_NAME(idx) == NULL) /* skip deleted entries */
+ }
+ if (AUGROUP_NAME(idx) == NULL || AUGROUP_NAME(idx) == get_deleted_augroup()) {
+ // skip deleted entries
return (char_u *)"";
- return AUGROUP_NAME(idx); /* return a name */
+ }
+ return (char_u *)AUGROUP_NAME(idx);
}
static int include_groups = FALSE;
@@ -7045,21 +7361,27 @@ set_context_in_autocmd (
*/
char_u *get_event_name(expand_T *xp, int idx)
{
- if (idx < augroups.ga_len) { /* First list group names, if wanted */
- if (!include_groups || AUGROUP_NAME(idx) == NULL)
- return (char_u *)""; /* skip deleted entries */
- return AUGROUP_NAME(idx); /* return a name */
+ if (idx < augroups.ga_len) { // First list group names, if wanted
+ if (!include_groups || AUGROUP_NAME(idx) == NULL
+ || AUGROUP_NAME(idx) == get_deleted_augroup()) {
+ return (char_u *)""; // skip deleted entries
+ }
+ return (char_u *)AUGROUP_NAME(idx);
}
return (char_u *)event_names[idx - augroups.ga_len].name;
}
-/// Return true if autocmd "event" is supported.
-bool autocmd_supported(char_u *event)
+/// Check whether given autocommand is supported
+///
+/// @param[in] event Event to check.
+///
+/// @return True if it is, false otherwise.
+bool autocmd_supported(const char *const event)
+ FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
char_u *p;
-
- return event_name2nr(event, &p) != NUM_EVENTS;
+ return event_name2nr((const char_u *)event, &p) != NUM_EVENTS;
}
/// Return true if an autocommand is defined for a group, event and
@@ -7074,26 +7396,24 @@ bool autocmd_supported(char_u *event)
/// exists("#Event#pat")
///
/// @param arg autocommand string
-bool au_exists(const char_u *arg) FUNC_ATTR_WARN_UNUSED_RESULT
+bool au_exists(const char *const arg) FUNC_ATTR_WARN_UNUSED_RESULT
{
- char_u *arg_save;
- char_u *pattern = NULL;
- char_u *event_name;
- char_u *p;
event_T event;
AutoPat *ap;
buf_T *buflocal_buf = NULL;
int group;
bool retval = false;
- /* Make a copy so that we can change the '#' chars to a NUL. */
- arg_save = vim_strsave(arg);
- p = vim_strchr(arg_save, '#');
- if (p != NULL)
+ // Make a copy so that we can change the '#' chars to a NUL.
+ char *const arg_save = xstrdup(arg);
+ char *p = strchr(arg_save, '#');
+ if (p != NULL) {
*p++ = NUL;
+ }
- /* First, look for an autocmd group name */
- group = au_find_group(arg_save);
+ // First, look for an autocmd group name.
+ group = au_find_group((char_u *)arg_save);
+ char *event_name;
if (group == AUGROUP_ERROR) {
/* Didn't match a group name, assume the first argument is an event. */
group = AUGROUP_ALL;
@@ -7105,17 +7425,18 @@ bool au_exists(const char_u *arg) FUNC_ATTR_WARN_UNUSED_RESULT
goto theend;
}
- /* Must be "Group#Event" or "Group#Event#pat". */
+ // Must be "Group#Event" or "Group#Event#pat".
event_name = p;
- p = vim_strchr(event_name, '#');
- if (p != NULL)
- *p++ = NUL; /* "Group#Event#pat" */
+ p = strchr(event_name, '#');
+ if (p != NULL) {
+ *p++ = NUL; // "Group#Event#pat"
+ }
}
- pattern = p; /* "pattern" is NULL when there is no pattern */
+ char *pattern = p; // "pattern" is NULL when there is no pattern.
- /* find the index (enum) for the event name */
- event = event_name2nr(event_name, &p);
+ // Find the index (enum) for the event name.
+ event = event_name2nr((char_u *)event_name, (char_u **)&p);
/* return FALSE if the event name is not recognized */
if (event == NUM_EVENTS)
@@ -7141,7 +7462,7 @@ bool au_exists(const char_u *arg) FUNC_ATTR_WARN_UNUSED_RESULT
&& (group == AUGROUP_ALL || ap->group == group)
&& (pattern == NULL
|| (buflocal_buf == NULL
- ? fnamecmp(ap->pat, pattern) == 0
+ ? fnamecmp(ap->pat, (char_u *)pattern) == 0
: ap->buflocal_nr == buflocal_buf->b_fnum))) {
retval = true;
break;
diff --git a/src/nvim/fileio.h b/src/nvim/fileio.h
index d93f3f3eb3..8db4b89806 100644
--- a/src/nvim/fileio.h
+++ b/src/nvim/fileio.h
@@ -4,25 +4,28 @@
#include "nvim/buffer_defs.h"
#include "nvim/os/os.h"
-/* Values for readfile() flags */
-#define READ_NEW 0x01 /* read a file into a new buffer */
-#define READ_FILTER 0x02 /* read filter output */
-#define READ_STDIN 0x04 /* read from stdin */
-#define READ_BUFFER 0x08 /* read from curbuf (converting stdin) */
-#define READ_DUMMY 0x10 /* reading into a dummy buffer */
-#define READ_KEEP_UNDO 0x20 /* keep undo info*/
+// Values for readfile() flags
+#define READ_NEW 0x01 // read a file into a new buffer
+#define READ_FILTER 0x02 // read filter output
+#define READ_STDIN 0x04 // read from stdin
+#define READ_BUFFER 0x08 // read from curbuf (converting stdin)
+#define READ_DUMMY 0x10 // reading into a dummy buffer
+#define READ_KEEP_UNDO 0x20 // keep undo info
+#define READ_FIFO 0x40 // read from fifo or socket
+
+#define READ_STRING(x, y) (char_u *)read_string((x), (size_t)(y))
/*
* Struct to save values in before executing autocommands for a buffer that is
* not the current buffer.
*/
typedef struct {
- buf_T *save_curbuf; /* saved curbuf */
- int use_aucmd_win; /* using aucmd_win */
- win_T *save_curwin; /* saved curwin */
- win_T *new_curwin; /* new curwin */
- buf_T *new_curbuf; /* new curbuf */
- char_u *globaldir; /* saved value of globaldir */
+ buf_T *save_curbuf; ///< saved curbuf
+ int use_aucmd_win; ///< using aucmd_win
+ win_T *save_curwin; ///< saved curwin
+ win_T *new_curwin; ///< new curwin
+ bufref_T new_curbuf; ///< new curbuf
+ char_u *globaldir; ///< saved value of globaldir
} aco_save_T;
#ifdef INCLUDE_GENERATED_DECLARATIONS
diff --git a/src/nvim/fold.c b/src/nvim/fold.c
index ac3cf959c8..39975308d7 100644
--- a/src/nvim/fold.c
+++ b/src/nvim/fold.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
// vim: set fdm=marker fdl=1 fdc=3
/*
@@ -17,12 +20,12 @@
#include "nvim/ex_docmd.h"
#include "nvim/func_attr.h"
#include "nvim/indent.h"
+#include "nvim/buffer_updates.h"
#include "nvim/mark.h"
#include "nvim/memline.h"
#include "nvim/memory.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/garray.h"
#include "nvim/move.h"
#include "nvim/option.h"
@@ -30,6 +33,7 @@
#include "nvim/strings.h"
#include "nvim/syntax.h"
#include "nvim/undo.h"
+#include "nvim/ops.h"
/* local declarations. {{{1 */
/* typedef fold_T {{{2 */
@@ -40,14 +44,14 @@
* The info stored in both growarrays is the same: An array of fold_T.
*/
typedef struct {
- linenr_T fd_top; /* first line of fold; for nested fold
- * relative to parent */
- linenr_T fd_len; /* number of lines in the fold */
- garray_T fd_nested; /* array of nested folds */
- char fd_flags; /* see below */
- char fd_small; /* TRUE, FALSE or MAYBE: fold smaller than
- 'foldminlines'; MAYBE applies to nested
- folds too */
+ linenr_T fd_top; // first line of fold; for nested fold
+ // relative to parent
+ linenr_T fd_len; // number of lines in the fold
+ garray_T fd_nested; // array of nested folds
+ char fd_flags; // see below
+ TriState fd_small; // kTrue, kFalse, or kNone: fold smaller than
+ // 'foldminlines'; kNone applies to nested
+ // folds too
} fold_T;
#define FD_OPEN 0 /* fold is open (nested ones can be closed) */
@@ -72,8 +76,8 @@ typedef struct {
this line (copy of "end" of prev. line) */
} fline_T;
-/* Flag is set when redrawing is needed. */
-static int fold_changed;
+// Flag is set when redrawing is needed.
+static bool fold_changed;
/* Function used by foldUpdateIEMSRecurse */
typedef void (*LevelGetter)(fline_T *);
@@ -143,35 +147,32 @@ int hasAnyFolding(win_T *win)
*/
bool hasFolding(linenr_T lnum, linenr_T *firstp, linenr_T *lastp)
{
- return hasFoldingWin(curwin, lnum, firstp, lastp, TRUE, NULL);
+ return hasFoldingWin(curwin, lnum, firstp, lastp, true, NULL);
}
/* hasFoldingWin() {{{2 */
bool hasFoldingWin(
- win_T *win,
- linenr_T lnum,
- linenr_T *firstp,
- linenr_T *lastp,
- int cache, /* when TRUE: use cached values of window */
- foldinfo_T *infop /* where to store fold info */
+ 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
)
{
- int had_folded = FALSE;
+ bool had_folded = false;
linenr_T first = 0;
linenr_T last = 0;
linenr_T lnum_rel = lnum;
- int x;
fold_T *fp;
int level = 0;
- int use_level = FALSE;
- int maybe_small = FALSE;
- garray_T *gap;
- int low_level = 0;;
+ bool use_level = false;
+ bool maybe_small = false;
+ int low_level = 0;
checkupdate(win);
- /*
- * Return quickly when there is no folding at all in this window.
- */
+
+ // Return quickly when there is no folding at all in this window.
if (!hasAnyFolding(win)) {
if (infop != NULL)
infop->fi_level = 0;
@@ -183,7 +184,7 @@ bool hasFoldingWin(
* First look in cached info for displayed lines. This is probably
* the fastest, but it can only be used if the entry is still valid.
*/
- x = find_wl_entry(win, lnum);
+ const int x = find_wl_entry(win, lnum);
if (x >= 0) {
first = win->w_lines[x].wl_lnum;
last = win->w_lines[x].wl_lastlnum;
@@ -195,7 +196,7 @@ bool hasFoldingWin(
/*
* Recursively search for a fold that contains "lnum".
*/
- gap = &win->w_folds;
+ garray_T *gap = &win->w_folds;
for (;; ) {
if (!foldFind(gap, lnum_rel, &fp))
break;
@@ -270,14 +271,11 @@ int foldLevel(linenr_T lnum)
return foldLevelWin(curwin, lnum);
}
-/* lineFolded() {{{2 */
-/*
- * Low level function to check if a line is folded. Doesn't use any caching.
- * Return TRUE if line is folded.
- * Return FALSE if line is not folded.
- * Return MAYBE if the line is folded when next to a folded line.
- */
-int lineFolded(win_T *win, linenr_T lnum)
+// lineFolded() {{{2
+// Low level function to check if a line is folded. Doesn't use any caching.
+// Return true if line is folded.
+// Return false if line is not folded.
+bool lineFolded(win_T *const win, const linenr_T lnum)
{
return foldedCount(win, lnum, NULL) != 0;
}
@@ -295,8 +293,9 @@ long foldedCount(win_T *win, linenr_T lnum, foldinfo_T *infop)
{
linenr_T last;
- if (hasFoldingWin(win, lnum, NULL, &last, FALSE, infop))
+ if (hasFoldingWin(win, lnum, NULL, &last, false, infop)) {
return (long)(last - lnum + 1);
+ }
return 0;
}
@@ -378,13 +377,13 @@ void closeFoldRecurse(linenr_T lnum)
* Open or Close folds for current window in lines "first" to "last".
* Used for "zo", "zO", "zc" and "zC" in Visual mode.
*/
-void
-opFoldRange (
+void
+opFoldRange(
linenr_T first,
linenr_T last,
- int opening, /* TRUE to open, FALSE to close */
- int recurse, /* TRUE to do it recursively */
- int had_visual /* TRUE when Visual selection used */
+ 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 */
@@ -645,7 +644,7 @@ void foldCreate(linenr_T start, linenr_T end)
if (!use_level)
curwin->w_fold_manual = true;
fp->fd_flags = FD_CLOSED;
- fp->fd_small = MAYBE;
+ fp->fd_small = kNone;
/* redraw */
changed_window_setting();
@@ -659,36 +658,31 @@ void foldCreate(linenr_T start, linenr_T end)
* When "end" is not 0, delete all folds from "start" to "end".
* When "recursive" is TRUE delete recursively.
*/
-void
-deleteFold (
- linenr_T start,
- linenr_T end,
- int recursive,
- int had_visual /* TRUE when Visual selection used */
+void deleteFold(
+ const linenr_T start,
+ const linenr_T end,
+ const int recursive,
+ const bool had_visual // true when Visual selection used
)
{
- garray_T *gap;
fold_T *fp;
- garray_T *found_ga;
fold_T *found_fp = NULL;
linenr_T found_off = 0;
- int use_level;
- int maybe_small = FALSE;
+ bool maybe_small = false;
int level = 0;
linenr_T lnum = start;
- linenr_T lnum_off;
- int did_one = FALSE;
+ bool did_one = false;
linenr_T first_lnum = MAXLNUM;
linenr_T last_lnum = 0;
checkupdate(curwin);
while (lnum <= end) {
- /* Find the deepest fold for "start". */
- gap = &curwin->w_folds;
- found_ga = NULL;
- lnum_off = 0;
- use_level = FALSE;
+ // Find the deepest fold for "start".
+ garray_T *gap = &curwin->w_folds;
+ garray_T *found_ga = NULL;
+ linenr_T lnum_off = 0;
+ bool use_level = false;
for (;; ) {
if (!foldFind(gap, lnum - lnum_off, &fp))
break;
@@ -724,7 +718,7 @@ deleteFold (
parseMarker(curwin);
deleteFoldMarkers(found_fp, recursive, found_off);
}
- did_one = TRUE;
+ did_one = true;
/* redraw window */
changed_window_setting();
@@ -739,8 +733,20 @@ deleteFold (
/* Deleting markers may make cursor column invalid. */
check_cursor_col();
- if (last_lnum > 0)
- changed_lines(first_lnum, (colnr_T)0, last_lnum, 0L);
+ if (last_lnum > 0) {
+ changed_lines(first_lnum, (colnr_T)0, last_lnum, 0L, false);
+
+ // send one nvim_buf_lines_event at the end
+ if (kv_size(curbuf->update_channels)) {
+ // last_lnum is the line *after* the last line of the outermost fold
+ // that was modified. Note also that deleting a fold might only require
+ // the modification of the *first* line of the fold, but we send through a
+ // notification that includes every line that was part of the fold
+ int64_t num_changed = last_lnum - first_lnum;
+ buf_updates_send_changes(curbuf, first_lnum, num_changed,
+ num_changed, true);
+ }
+ }
}
/* clearFolding() {{{2 */
@@ -762,21 +768,17 @@ void clearFolding(win_T *win)
*/
void foldUpdate(win_T *wp, linenr_T top, linenr_T bot)
{
- if (compl_busy) {
- return;
- }
-
- fold_T *fp;
- if (wp->w_buffer->terminal) {
+ if (compl_busy || State & INSERT) {
return;
}
// Mark all folds from top to bot as maybe-small.
+ fold_T *fp;
(void)foldFind(&wp->w_folds, top, &fp);
while (fp < (fold_T *)wp->w_folds.ga_data + wp->w_folds.ga_len
&& fp->fd_top < bot) {
- fp->fd_small = MAYBE;
- ++fp;
+ fp->fd_small = kNone;
+ fp++;
}
if (foldmethodIsIndent(wp)
@@ -793,6 +795,19 @@ void foldUpdate(win_T *wp, linenr_T top, linenr_T bot)
}
}
+/// Updates folds when leaving insert-mode.
+void foldUpdateAfterInsert(void)
+{
+ if (foldmethodIsManual(curwin) // foldmethod=manual: No need to update.
+ // These foldmethods are too slow, do not auto-update on insert-leave.
+ || foldmethodIsSyntax(curwin) || foldmethodIsExpr(curwin)) {
+ return;
+ }
+
+ foldUpdateAll(curwin);
+ foldOpenCursor();
+}
+
/* foldUpdateAll() {{{2 */
/*
* Update all lines in a window for folding.
@@ -806,44 +821,34 @@ void foldUpdateAll(win_T *win)
redraw_win_later(win, NOT_VALID);
}
-/* foldMoveTo() {{{2 */
-/*
- * If "updown" is FALSE: Move to the start or end of the fold.
- * If "updown" is TRUE: move to fold at the same level.
- * If not moved return FAIL.
- */
-int
-foldMoveTo (
- int updown,
- int dir, /* FORWARD or BACKWARD */
- long count
+// foldMoveTo() {{{2
+//
+// If "updown" is false: Move to the start or end of the fold.
+// If "updown" is true: move to fold at the same level.
+// If not moved return FAIL.
+int foldMoveTo(
+ const bool updown,
+ const int dir, // FORWARD or BACKWARD
+ const long count
)
{
- long n;
int retval = FAIL;
- linenr_T lnum_off;
- linenr_T lnum_found;
linenr_T lnum;
- int use_level;
- int maybe_small;
- garray_T *gap;
fold_T *fp;
- int level;
- int last;
checkupdate(curwin);
- /* Repeat "count" times. */
- for (n = 0; n < count; ++n) {
- /* Find nested folds. Stop when a fold is closed. The deepest fold
- * that moves the cursor is used. */
- lnum_off = 0;
- gap = &curwin->w_folds;
- use_level = FALSE;
- maybe_small = FALSE;
- lnum_found = curwin->w_cursor.lnum;
- level = 0;
- last = FALSE;
+ // Repeat "count" times.
+ for (long n = 0; n < count; n++) {
+ // Find nested folds. Stop when a fold is closed. The deepest fold
+ // that moves the cursor is used.
+ linenr_T lnum_off = 0;
+ garray_T *gap = &curwin->w_folds;
+ bool use_level = false;
+ bool maybe_small = false;
+ linenr_T lnum_found = curwin->w_cursor.lnum;
+ int level = 0;
+ bool last = false;
for (;; ) {
if (!foldFind(gap, curwin->w_cursor.lnum - lnum_off, &fp)) {
if (!updown)
@@ -861,14 +866,15 @@ foldMoveTo (
}
/* don't look for contained folds, they will always move
* the cursor too far. */
- last = TRUE;
+ last = true;
}
if (!last) {
/* Check if this fold is closed. */
if (check_closed(curwin, fp, &use_level, level,
- &maybe_small, lnum_off))
- last = TRUE;
+ &maybe_small, lnum_off)) {
+ last = true;
+ }
/* "[z" and "]z" stop at closed fold */
if (last && !updown)
@@ -1131,11 +1137,11 @@ static void setFoldRepeat(linenr_T lnum, long count, int do_open)
* Open or close the fold in the current window which contains "lnum".
* Also does this for other windows in diff mode when needed.
*/
-static linenr_T
-setManualFold (
+static linenr_T
+setManualFold(
linenr_T lnum,
- int opening, /* TRUE when opening, FALSE when closing */
- int recurse, /* TRUE when closing/opening recursive */
+ int opening, // TRUE when opening, FALSE when closing
+ int recurse, // TRUE when closing/opening recursive
int *donep
)
{
@@ -1169,12 +1175,12 @@ setManualFold (
* Return the line number of the next line that could be closed.
* It's only valid when "opening" is TRUE!
*/
-static linenr_T
-setManualFoldWin (
+static linenr_T
+setManualFoldWin(
win_T *wp,
linenr_T lnum,
- int opening, /* TRUE when opening, FALSE when closing */
- int recurse, /* TRUE when closing/opening recursive */
+ int opening, // TRUE when opening, FALSE when closing
+ int recurse, // TRUE when closing/opening recursive
int *donep
)
{
@@ -1281,25 +1287,21 @@ static void foldOpenNested(fold_T *fpr)
}
}
-/* deleteFoldEntry() {{{2 */
-/*
- * Delete fold "idx" from growarray "gap".
- * When "recursive" is TRUE also delete all the folds contained in it.
- * When "recursive" is FALSE contained folds are moved one level up.
- */
-static void deleteFoldEntry(garray_T *gap, int idx, int recursive)
+// deleteFoldEntry() {{{2
+// Delete fold "idx" from growarray "gap".
+// When "recursive" is true also delete all the folds contained in it.
+// When "recursive" is false contained folds are moved one level up.
+static void deleteFoldEntry(garray_T *const gap, const int idx,
+ const bool recursive)
{
- fold_T *fp;
- int i;
- fold_T *nfp;
-
- fp = (fold_T *)gap->ga_data + idx;
+ fold_T *fp = (fold_T *)gap->ga_data + idx;
if (recursive || GA_EMPTY(&fp->fd_nested)) {
- /* recursively delete the contained folds */
+ // recursively delete the contained folds
deleteFoldRecurse(&fp->fd_nested);
- --gap->ga_len;
- if (idx < gap->ga_len)
- memmove(fp, fp + 1, sizeof(fold_T) * (size_t)(gap->ga_len - idx));
+ gap->ga_len--;
+ if (idx < gap->ga_len) {
+ memmove(fp, fp + 1, sizeof(*fp) * (size_t)(gap->ga_len - idx));
+ }
} else {
/* Move nested folds one level up, to overwrite the fold that is
* deleted. */
@@ -1309,22 +1311,24 @@ static void deleteFoldEntry(garray_T *gap, int idx, int recursive)
/* Get "fp" again, the array may have been reallocated. */
fp = (fold_T *)gap->ga_data + idx;
- /* adjust fd_top and fd_flags for the moved folds */
- nfp = (fold_T *)fp->fd_nested.ga_data;
- for (i = 0; i < moved; ++i) {
+ // adjust fd_top and fd_flags for the moved folds
+ fold_T *nfp = (fold_T *)fp->fd_nested.ga_data;
+ for (int i = 0; i < moved; i++) {
nfp[i].fd_top += fp->fd_top;
if (fp->fd_flags == FD_LEVEL)
nfp[i].fd_flags = FD_LEVEL;
- if (fp->fd_small == MAYBE)
- nfp[i].fd_small = MAYBE;
+ if (fp->fd_small == kNone) {
+ nfp[i].fd_small = kNone;
+ }
}
- /* move the existing folds down to make room */
- if (idx + 1 < gap->ga_len)
+ // move the existing folds down to make room
+ if (idx + 1 < gap->ga_len) {
memmove(fp + moved, fp + 1,
- sizeof(fold_T) * (size_t)(gap->ga_len - (idx + 1)));
- /* move the contained folds one level up */
- memmove(fp, nfp, sizeof(fold_T) * (size_t)moved);
+ sizeof(*fp) * (size_t)(gap->ga_len - (idx + 1)));
+ }
+ // move the contained folds one level up
+ memmove(fp, nfp, sizeof(*fp) * (size_t)moved);
xfree(nfp);
gap->ga_len += moved - 1;
}
@@ -1404,14 +1408,15 @@ static void foldMarkAdjustRecurse(garray_T *gap, linenr_T line1, linenr_T line2,
fp->fd_top += amount_after;
} else {
if (fp->fd_top >= top && last <= line2) {
- /* 4. fold completely contained in range */
+ // 4. fold completely contained in range
if (amount == MAXLNUM) {
- /* Deleting lines: delete the fold completely */
- deleteFoldEntry(gap, i, TRUE);
- --i; /* adjust index for deletion */
- --fp;
- } else
+ // Deleting lines: delete the fold completely
+ deleteFoldEntry(gap, i, true);
+ i--; // adjust index for deletion
+ fp--;
+ } else {
fp->fd_top += amount;
+ }
} else {
if (fp->fd_top < top) {
/* 2 or 3: need to correct nested folds too */
@@ -1430,13 +1435,16 @@ static void foldMarkAdjustRecurse(garray_T *gap, linenr_T line1, linenr_T line2,
} else {
/* 5. fold is below line1 and contains line2; need to
* correct nested folds too */
- foldMarkAdjustRecurse(&fp->fd_nested, line1 - fp->fd_top,
- line2 - fp->fd_top, amount,
- amount_after + (fp->fd_top - top));
if (amount == MAXLNUM) {
+ foldMarkAdjustRecurse(&fp->fd_nested, line1 - fp->fd_top,
+ line2 - fp->fd_top, amount,
+ amount_after + (fp->fd_top - top));
fp->fd_len -= line2 - fp->fd_top + 1;
fp->fd_top = line1;
} else {
+ foldMarkAdjustRecurse(&fp->fd_nested, line1 - fp->fd_top,
+ line2 - fp->fd_top, amount,
+ amount_after - amount);
fp->fd_len += amount_after - amount;
fp->fd_top += amount;
}
@@ -1477,36 +1485,40 @@ static int getDeepestNestingRecurse(garray_T *gap)
/*
* Check if a fold is closed and update the info needed to check nested folds.
*/
-static int
-check_closed (
- win_T *win,
- fold_T *fp,
- int *use_levelp, /* TRUE: outer fold had FD_LEVEL */
- int level, /* folding depth */
- int *maybe_smallp, /* TRUE: outer this had fd_small == MAYBE */
- linenr_T lnum_off /* line number offset for fp->fd_top */
+static bool check_closed(
+ win_T *const win,
+ fold_T *const fp,
+ bool *const use_levelp, // true: outer fold had FD_LEVEL
+ const int level, // folding depth
+ bool *const maybe_smallp, // true: outer this had fd_small == kNone
+ const linenr_T lnum_off // line number offset for fp->fd_top
)
{
- int closed = FALSE;
+ bool closed = false;
/* Check if this fold is closed. If the flag is FD_LEVEL this
* fold and all folds it contains depend on 'foldlevel'. */
if (*use_levelp || fp->fd_flags == FD_LEVEL) {
- *use_levelp = TRUE;
- if (level >= win->w_p_fdl)
- closed = TRUE;
- } else if (fp->fd_flags == FD_CLOSED)
- closed = TRUE;
-
- /* Small fold isn't closed anyway. */
- if (fp->fd_small == MAYBE)
- *maybe_smallp = TRUE;
+ *use_levelp = true;
+ if (level >= win->w_p_fdl) {
+ closed = true;
+ }
+ } else if (fp->fd_flags == FD_CLOSED) {
+ closed = true;
+ }
+
+ // Small fold isn't closed anyway.
+ if (fp->fd_small == kNone) {
+ *maybe_smallp = true;
+ }
if (closed) {
- if (*maybe_smallp)
- fp->fd_small = MAYBE;
+ if (*maybe_smallp) {
+ fp->fd_small = kNone;
+ }
checkSmall(win, fp, lnum_off);
- if (fp->fd_small == TRUE)
- closed = FALSE;
+ if (fp->fd_small == kTrue) {
+ closed = false;
+ }
}
return closed;
}
@@ -1515,45 +1527,40 @@ check_closed (
/*
* Update fd_small field of fold "fp".
*/
-static void
-checkSmall (
- win_T *wp,
- fold_T *fp,
- linenr_T lnum_off /* offset for fp->fd_top */
+static void
+checkSmall(
+ win_T *const wp,
+ fold_T *const fp,
+ const linenr_T lnum_off // offset for fp->fd_top
)
{
- int count;
- int n;
-
- if (fp->fd_small == MAYBE) {
- /* Mark any nested folds to maybe-small */
+ if (fp->fd_small == kNone) {
+ // Mark any nested folds to maybe-small
setSmallMaybe(&fp->fd_nested);
- if (fp->fd_len > curwin->w_p_fml)
- fp->fd_small = FALSE;
- else {
- count = 0;
- for (n = 0; n < fp->fd_len; ++n) {
+ if (fp->fd_len > curwin->w_p_fml) {
+ fp->fd_small = kFalse;
+ } else {
+ int count = 0;
+ for (int n = 0; n < fp->fd_len; n++) {
count += plines_win_nofold(wp, fp->fd_top + lnum_off + n);
if (count > curwin->w_p_fml) {
- fp->fd_small = FALSE;
+ fp->fd_small = kFalse;
return;
}
}
- fp->fd_small = TRUE;
+ fp->fd_small = kTrue;
}
}
}
-/* setSmallMaybe() {{{2 */
-/*
- * Set small flags in "gap" to MAYBE.
- */
+// setSmallMaybe() {{{2
+// Set small flags in "gap" to kNone.
static void setSmallMaybe(garray_T *gap)
{
fold_T *fp = (fold_T *)gap->ga_data;
- for (int i = 0; i < gap->ga_len; ++i) {
- fp[i].fd_small = MAYBE;
+ for (int i = 0; i < gap->ga_len; i++) {
+ fp[i].fd_small = kNone;
}
}
@@ -1575,36 +1582,47 @@ static void foldCreateMarkers(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. */
- changed_lines(start, (colnr_T)0, end, 0L);
+ changed_lines(start, (colnr_T)0, end, 0L, false);
+
+ if (kv_size(curbuf->update_channels)) {
+ // 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(curbuf, start, num_changed, num_changed, true);
+ }
}
/* foldAddMarker() {{{2 */
/*
* Add "marker[markerlen]" in 'commentstring' to line "lnum".
*/
-static void foldAddMarker(linenr_T lnum, char_u *marker, size_t markerlen)
+static void foldAddMarker(linenr_T lnum, const char_u *marker, size_t markerlen)
{
char_u *cms = curbuf->b_p_cms;
char_u *line;
char_u *newline;
char_u *p = (char_u *)strstr((char *)curbuf->b_p_cms, "%s");
+ bool line_is_comment = false;
- /* Allocate a new line: old-line + 'cms'-start + marker + 'cms'-end */
+ // Allocate a new line: old-line + 'cms'-start + marker + 'cms'-end
line = ml_get(lnum);
size_t line_len = STRLEN(line);
if (u_save(lnum - 1, lnum + 1) == OK) {
+ // Check if the line ends with an unclosed comment
+ skip_comment(line, false, false, &line_is_comment);
newline = xmalloc(line_len + markerlen + STRLEN(cms) + 1);
STRCPY(newline, line);
- if (p == NULL)
+ // Append the marker to the end of the line
+ if (p == NULL || line_is_comment) {
STRLCPY(newline + line_len, marker, markerlen + 1);
- else {
+ } else {
STRCPY(newline + line_len, cms);
- STRNCPY(newline + line_len + (p - cms), marker, markerlen);
+ memcpy(newline + line_len + (p - cms), marker, markerlen);
STRCPY(newline + line_len + (p - cms) + markerlen, p + 2);
}
-
- ml_replace(lnum, newline, FALSE);
+ ml_replace(lnum, newline, false);
}
}
@@ -1612,11 +1630,11 @@ static void foldAddMarker(linenr_T lnum, char_u *marker, size_t markerlen)
/*
* Delete the markers for a fold, causing it to be deleted.
*/
-static void
-deleteFoldMarkers (
+static void
+deleteFoldMarkers(
fold_T *fp,
int recursive,
- linenr_T lnum_off /* offset for fp->fd_top */
+ linenr_T lnum_off // offset for fp->fd_top
)
{
if (recursive) {
@@ -1665,20 +1683,19 @@ static void foldDelMarker(linenr_T lnum, char_u *marker, size_t markerlen)
if (u_save(lnum - 1, lnum + 1) == OK) {
/* Make new line: text-before-marker + text-after-marker */
newline = xmalloc(STRLEN(line) - len + 1);
- STRNCPY(newline, line, p - line);
+ assert(p >= line);
+ memcpy(newline, line, (size_t)(p - line));
STRCPY(newline + (p - line), p + len);
- ml_replace(lnum, newline, FALSE);
+ ml_replace(lnum, newline, false);
}
break;
}
}
-/* 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[51]". Otherwise the
- * result is in allocated memory.
- */
+// 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]".
+/// 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)
FUNC_ATTR_NONNULL_ARG(1)
@@ -1745,12 +1762,13 @@ char_u *get_foldtext(win_T *wp, linenr_T lnum, linenr_T lnume,
if (text != NULL) {
/* Replace unprintable characters, if there are any. But
* replace a TAB with a space. */
- for (p = text; *p != NUL; ++p) {
- int len;
+ for (p = text; *p != NUL; p++) {
+ int len = utfc_ptr2len(p);
- if (has_mbyte && (len = (*mb_ptr2len)(p)) > 1) {
- if (!vim_isprintc((*mb_ptr2char)(p)))
+ if (len > 1) {
+ if (!vim_isprintc(utf_ptr2char(p))) {
break;
+ }
p += len - 1;
} else if (*p == TAB)
*p = ' ';
@@ -1758,15 +1776,19 @@ char_u *get_foldtext(win_T *wp, linenr_T lnum, linenr_T lnume,
break;
}
if (*p != NUL) {
- p = transstr(text);
+ p = (char_u *)transstr((const char *)text);
xfree(text);
text = p;
}
}
}
if (text == NULL) {
- sprintf((char *)buf, _("+--%3ld lines folded "),
- (long)(lnume - lnum + 1));
+ unsigned long count = (unsigned long)(lnume - lnum + 1);
+
+ vim_snprintf((char *)buf, FOLD_TEXT_LEN,
+ NGETTEXT("+--%3ld line folded",
+ "+--%3ld lines folded ", count),
+ count);
text = buf;
}
return text;
@@ -1841,7 +1863,7 @@ void foldtext_cleanup(char_u *str)
++len;
STRMOVE(s, s + len);
} else {
- mb_ptr_adv(s);
+ MB_PTR_ADV(s);
}
}
}
@@ -1854,13 +1876,10 @@ void foldtext_cleanup(char_u *str)
* Update the folding for window "wp", at least from lines "top" to "bot".
* Return TRUE if any folds did change.
*/
-static void foldUpdateIEMS(win_T *wp, linenr_T top, linenr_T bot)
+static void foldUpdateIEMS(win_T *const wp, linenr_T top, linenr_T bot)
{
- linenr_T start;
- linenr_T end;
fline_T fline;
void (*getlevel)(fline_T *);
- int level;
fold_T *fp;
/* Avoid problems when being called recursively. */
@@ -1886,12 +1905,13 @@ static void foldUpdateIEMS(win_T *wp, linenr_T top, linenr_T bot)
bot += diff_context;
}
- /* When deleting lines at the end of the buffer "top" can be past the end
- * of the buffer. */
- if (top > wp->w_buffer->b_ml.ml_line_count)
+ // When deleting lines at the end of the buffer "top" can be past the end
+ // of the buffer.
+ if (top > wp->w_buffer->b_ml.ml_line_count) {
top = wp->w_buffer->b_ml.ml_line_count;
+ }
- fold_changed = FALSE;
+ fold_changed = false;
fline.wp = wp;
fline.off = 0;
fline.lvl = 0;
@@ -1912,8 +1932,8 @@ static void foldUpdateIEMS(win_T *wp, linenr_T top, linenr_T bot)
/* Need to get the level of the line above top, it is used if there is
* no marker at the top. */
if (top > 1) {
- /* Get the fold level at top - 1. */
- level = foldLevelWin(wp, top - 1);
+ // Get the fold level at top - 1.
+ const int level = foldLevelWin(wp, top - 1);
/* The fold may end just above the top, check for that. */
fline.lnum = top - 1;
@@ -1989,11 +2009,12 @@ static void foldUpdateIEMS(win_T *wp, linenr_T top, linenr_T bot)
}
}
- start = fline.lnum;
- end = bot;
- /* Do at least one line. */
- if (start > end && end < wp->w_buffer->b_ml.ml_line_count)
+ linenr_T start = fline.lnum;
+ linenr_T end = bot;
+ // Do at least one line.
+ if (start > end && end < wp->w_buffer->b_ml.ml_line_count) {
end = start;
+ }
while (!got_int) {
/* Always stop at the end of the file ("end" can be past the end of
* the file). */
@@ -2084,22 +2105,21 @@ static void foldUpdateIEMS(win_T *wp, linenr_T top, linenr_T bot)
* Returns bot, which may have been increased for lines that also need to be
* updated as a result of a detected change in the fold.
*/
-static linenr_T foldUpdateIEMSRecurse(garray_T *gap, int level,
- linenr_T startlnum, fline_T *flp,
- LevelGetter getlevel,
- linenr_T bot,
- char topflags /* containing fold flags */
- )
+static linenr_T foldUpdateIEMSRecurse(
+ garray_T *const gap, const int level, const linenr_T startlnum,
+ fline_T *const flp, LevelGetter getlevel, linenr_T bot,
+ const char topflags // containing fold flags
+)
{
linenr_T ll;
fold_T *fp = NULL;
fold_T *fp2;
int lvl = level;
linenr_T startlnum2 = startlnum;
- linenr_T firstlnum = flp->lnum; /* first lnum we got */
+ const linenr_T firstlnum = flp->lnum; // first lnum we got
int i;
- int finish = FALSE;
- linenr_T linecount = flp->wp->w_buffer->b_ml.ml_line_count - flp->off;
+ bool finish = false;
+ const linenr_T linecount = flp->wp->w_buffer->b_ml.ml_line_count - flp->off;
int concat;
/*
@@ -2216,57 +2236,86 @@ static linenr_T foldUpdateIEMSRecurse(garray_T *gap, int level,
* before where we started looking, extend it. If it
* starts at another line, update nested folds to keep
* their position, compensating for the new fd_top. */
- if (fp->fd_top >= startlnum && fp->fd_top != firstlnum) {
- if (fp->fd_top > firstlnum)
- /* like lines are inserted */
+ if (fp->fd_top == firstlnum) {
+ // We have found a fold beginning exactly where we want one.
+ } else if (fp->fd_top >= startlnum) {
+ if (fp->fd_top > firstlnum) {
+ // We will move the start of this fold up, hence we move all
+ // nested folds (with relative line numbers) down.
foldMarkAdjustRecurse(&fp->fd_nested,
- (linenr_T)0, (linenr_T)MAXLNUM,
- (long)(fp->fd_top - firstlnum), 0L);
- else
- /* like lines are deleted */
+ (linenr_T)0, (linenr_T)MAXLNUM,
+ (long)(fp->fd_top - firstlnum), 0L);
+ } else {
+ // Will move fold down, move nested folds relatively up.
foldMarkAdjustRecurse(&fp->fd_nested,
- (linenr_T)0,
- (long)(firstlnum - fp->fd_top - 1),
- (linenr_T)MAXLNUM,
- (long)(fp->fd_top - firstlnum));
+ (linenr_T)0,
+ (long)(firstlnum - fp->fd_top - 1),
+ (linenr_T)MAXLNUM,
+ (long)(fp->fd_top - firstlnum));
+ }
fp->fd_len += fp->fd_top - firstlnum;
fp->fd_top = firstlnum;
- fold_changed = TRUE;
- } else if (flp->start != 0 && lvl == level
- && fp->fd_top != firstlnum) {
- /* Existing fold that includes startlnum must stop
- * if we find the start of a new fold at the same
- * level. Split it. Delete contained folds at
- * this point to split them too. */
- foldRemove(&fp->fd_nested, flp->lnum - fp->fd_top,
- flp->lnum - fp->fd_top);
+ fold_changed = true;
+ } else if ((flp->start != 0 && lvl == level)
+ || (firstlnum != startlnum)) {
+ // Before there was a fold spanning from above startlnum to below
+ // firstlnum. This fold is valid above startlnum (because we are
+ // not updating that range), but there is now a break in it.
+ // If the break is because we are now forced to start a new fold
+ // at the level "level" at line fline->lnum, then we need to
+ // split the fold at fline->lnum.
+ // If the break is because the range [startlnum, firstlnum) is
+ // now at a lower indent than "level", we need to split the fold
+ // in this range.
+ // Any splits have to be done recursively.
+ linenr_T breakstart;
+ linenr_T breakend;
+ if (firstlnum != startlnum) {
+ breakstart = startlnum;
+ breakend = firstlnum;
+ } else {
+ breakstart = flp->lnum;
+ breakend = flp->lnum;
+ }
+ foldRemove(&fp->fd_nested, breakstart - fp->fd_top,
+ breakend - fp->fd_top);
i = (int)(fp - (fold_T *)gap->ga_data);
- foldSplit(gap, i, flp->lnum, flp->lnum - 1);
+ foldSplit(gap, i, breakstart, breakend - 1);
fp = (fold_T *)gap->ga_data + i + 1;
/* If using the "marker" or "syntax" method, we
* need to continue until the end of the fold is
* found. */
if (getlevel == foldlevelMarker
|| getlevel == foldlevelExpr
- || getlevel == foldlevelSyntax)
- finish = TRUE;
+ || getlevel == foldlevelSyntax) {
+ finish = true;
+ }
+ }
+ if (fp->fd_top == startlnum && concat) {
+ i = (int)(fp - (fold_T *)gap->ga_data);
+ if (i != 0) {
+ fp2 = fp - 1;
+ if (fp2->fd_top + fp2->fd_len == fp->fd_top) {
+ foldMerge(fp2, gap, fp);
+ fp = fp2;
+ }
+ }
}
break;
}
if (fp->fd_top >= startlnum) {
- /* A fold that starts at or after startlnum and stops
- * before the new fold must be deleted. Continue
- * looking for the next one. */
- deleteFoldEntry(gap,
- (int)(fp - (fold_T *)gap->ga_data), TRUE);
+ // A fold that starts at or after startlnum and stops
+ // before the new fold must be deleted. Continue
+ // looking for the next one.
+ deleteFoldEntry(gap, (int)(fp - (fold_T *)gap->ga_data), true);
} else {
/* A fold has some lines above startlnum, truncate it
* to stop just above startlnum. */
fp->fd_len = startlnum - fp->fd_top;
foldMarkAdjustRecurse(&fp->fd_nested,
- (linenr_T)fp->fd_len, (linenr_T)MAXLNUM,
- (linenr_T)MAXLNUM, 0L);
- fold_changed = TRUE;
+ (linenr_T)fp->fd_len, (linenr_T)MAXLNUM,
+ (linenr_T)MAXLNUM, 0L);
+ fold_changed = true;
}
} else {
/* Insert new fold. Careful: ga_data may be NULL and it
@@ -2290,14 +2339,15 @@ static linenr_T foldUpdateIEMSRecurse(garray_T *gap, int level,
flp->wp->w_fold_manual = true;
} else
fp->fd_flags = (fp - 1)->fd_flags;
- fp->fd_small = MAYBE;
- /* If using the "marker", "expr" or "syntax" method, we
- * need to continue until the end of the fold is found. */
+ fp->fd_small = kNone;
+ // If using the "marker", "expr" or "syntax" method, we
+ // need to continue until the end of the fold is found.
if (getlevel == foldlevelMarker
|| getlevel == foldlevelExpr
- || getlevel == foldlevelSyntax)
- finish = TRUE;
- fold_changed = TRUE;
+ || getlevel == foldlevelSyntax) {
+ finish = true;
+ }
+ fold_changed = true;
break;
}
}
@@ -2316,12 +2366,11 @@ static linenr_T foldUpdateIEMSRecurse(garray_T *gap, int level,
* Check "fp" for safety.
*/
if (lvl > level && fp != NULL) {
- /*
- * There is a nested fold, handle it recursively.
- */
- /* At least do one line (can happen when finish is TRUE). */
- if (bot < flp->lnum)
+ // There is a nested fold, handle it recursively.
+ // At least do one line (can happen when finish is true).
+ if (bot < flp->lnum) {
bot = flp->lnum;
+ }
/* Line numbers in the nested fold are relative to the start of
* this fold. */
@@ -2383,8 +2432,8 @@ static linenr_T foldUpdateIEMSRecurse(garray_T *gap, int level,
/* Current fold at least extends until lnum. */
if (fp->fd_len < flp->lnum - fp->fd_top) {
fp->fd_len = flp->lnum - fp->fd_top;
- fp->fd_small = MAYBE;
- fold_changed = TRUE;
+ fp->fd_small = kNone;
+ fold_changed = true;
}
/* Delete contained folds from the end of the last one found until where
@@ -2393,27 +2442,28 @@ static linenr_T foldUpdateIEMSRecurse(garray_T *gap, int level,
flp->lnum - 1 - fp->fd_top);
if (lvl < level) {
- /* End of fold found, update the length when it got shorter. */
+ // End of fold found, update the length when it got shorter.
if (fp->fd_len != flp->lnum - fp->fd_top) {
- if (fp->fd_top + fp->fd_len > bot + 1) {
- /* fold continued below bot */
+ if (fp->fd_top + fp->fd_len - 1 > bot) {
+ // fold continued below bot
if (getlevel == foldlevelMarker
|| getlevel == foldlevelExpr
|| getlevel == foldlevelSyntax) {
- /* marker method: truncate the fold and make sure the
- * previously included lines are processed again */
+ // marker method: truncate the fold and make sure the
+ // previously included lines are processed again
bot = fp->fd_top + fp->fd_len - 1;
fp->fd_len = flp->lnum - fp->fd_top;
} else {
- /* indent or expr method: split fold to create a new one
- * below bot */
+ // indent or expr method: split fold to create a new one
+ // below bot
i = (int)(fp - (fold_T *)gap->ga_data);
foldSplit(gap, i, flp->lnum, bot);
fp = (fold_T *)gap->ga_data + i;
}
- } else
+ } else {
fp->fd_len = flp->lnum - fp->fd_top;
- fold_changed = TRUE;
+ }
+ fold_changed = true;
}
}
@@ -2431,7 +2481,7 @@ static linenr_T foldUpdateIEMSRecurse(garray_T *gap, int level,
(linenr_T)MAXLNUM, (long)(fp2->fd_top - flp->lnum));
fp2->fd_len -= flp->lnum - fp2->fd_top;
fp2->fd_top = flp->lnum;
- fold_changed = TRUE;
+ fold_changed = true;
}
if (lvl >= level) {
@@ -2440,8 +2490,8 @@ static linenr_T foldUpdateIEMSRecurse(garray_T *gap, int level,
}
break;
}
- fold_changed = TRUE;
- deleteFoldEntry(gap, (int)(fp2 - (fold_T *)gap->ga_data), TRUE);
+ fold_changed = true;
+ deleteFoldEntry(gap, (int)(fp2 - (fold_T *)gap->ga_data), true);
}
/* Need to redraw the lines we inspected, which might be further down than
@@ -2477,34 +2527,32 @@ static void foldInsert(garray_T *gap, int i)
* The caller must first have taken care of any nested folds from "top" to
* "bot"!
*/
-static void foldSplit(garray_T *gap, int i, linenr_T top, linenr_T bot)
+static void foldSplit(garray_T *const gap, const int i, const linenr_T top,
+ const linenr_T bot)
{
- fold_T *fp;
fold_T *fp2;
- garray_T *gap1;
- garray_T *gap2;
- int idx;
- int len;
/* The fold continues below bot, need to split it. */
foldInsert(gap, i + 1);
- fp = (fold_T *)gap->ga_data + i;
+ fold_T *const fp = (fold_T *)gap->ga_data + i;
fp[1].fd_top = bot + 1;
+ // check for wrap around (MAXLNUM, and 32bit)
+ assert(fp[1].fd_top > bot);
fp[1].fd_len = fp->fd_len - (fp[1].fd_top - fp->fd_top);
fp[1].fd_flags = fp->fd_flags;
- fp[1].fd_small = MAYBE;
- fp->fd_small = MAYBE;
+ fp[1].fd_small = kNone;
+ fp->fd_small = kNone;
/* Move nested folds below bot to new fold. There can't be
* any between top and bot, they have been removed by the caller. */
- gap1 = &fp->fd_nested;
- gap2 = &fp[1].fd_nested;
+ garray_T *const gap1 = &fp->fd_nested;
+ garray_T *const gap2 = &fp[1].fd_nested;
(void)(foldFind(gap1, bot + 1 - fp->fd_top, &fp2));
- len = (int)((fold_T *)gap1->ga_data + gap1->ga_len - fp2);
+ const int len = (int)((fold_T *)gap1->ga_data + gap1->ga_len - fp2);
if (len > 0) {
ga_grow(gap2, len);
- for (idx = 0; idx < len; ++idx) {
+ for (int idx = 0; idx < len; idx++) {
((fold_T *)gap2->ga_data)[idx] = fp2[idx];
((fold_T *)gap2->ga_data)[idx].fd_top
-= fp[1].fd_top - fp->fd_top;
@@ -2513,7 +2561,7 @@ static void foldSplit(garray_T *gap, int i, linenr_T top, linenr_T bot)
gap1->ga_len -= len;
}
fp->fd_len = top - fp->fd_top;
- fold_changed = TRUE;
+ fold_changed = true;
}
/* foldRemove() {{{2 */
@@ -2523,10 +2571,10 @@ static void foldSplit(garray_T *gap, int i, linenr_T top, linenr_T bot)
* 1 2 3
* 1 2 3
* top 2 3 4 5
- * 2 3 4 5
- * bot 2 3 4 5
- * 3 5 6
- * 3 5 6
+ * 2 3 4 5
+ * bot 2 3 4 5
+ * 3 5 6
+ * 3 5 6
*
* 1: not changed
* 2: truncate to stop above "top"
@@ -2539,34 +2587,35 @@ static void foldRemove(garray_T *gap, linenr_T top, linenr_T bot)
{
fold_T *fp = NULL;
- if (bot < top)
- return; /* nothing to do */
+ if (bot < top) {
+ return; // nothing to do
+ }
for (;; ) {
- /* Find fold that includes top or a following one. */
+ // Find fold that includes top or a following one.
if (foldFind(gap, top, &fp) && fp->fd_top < top) {
- /* 2: or 3: need to delete nested folds */
+ // 2: or 3: need to delete nested folds
foldRemove(&fp->fd_nested, top - fp->fd_top, bot - fp->fd_top);
- if (fp->fd_top + fp->fd_len > bot + 1) {
- /* 3: need to split it. */
+ if (fp->fd_top + fp->fd_len - 1 > bot) {
+ // 3: need to split it.
foldSplit(gap, (int)(fp - (fold_T *)gap->ga_data), top, bot);
} else {
- /* 2: truncate fold at "top". */
+ // 2: truncate fold at "top".
fp->fd_len = top - fp->fd_top;
}
- fold_changed = TRUE;
+ fold_changed = true;
continue;
}
if (fp >= (fold_T *)(gap->ga_data) + gap->ga_len
|| fp->fd_top > bot) {
- /* 6: Found a fold below bot, can stop looking. */
+ // 6: Found a fold below bot, can stop looking.
break;
}
if (fp->fd_top >= top) {
- /* Found an entry below top. */
- fold_changed = TRUE;
+ // Found an entry below top.
+ fold_changed = true;
if (fp->fd_top + fp->fd_len - 1 > bot) {
- /* 5: Make fold that includes bot start below bot. */
+ // 5: Make fold that includes bot start below bot.
foldMarkAdjustRecurse(&fp->fd_nested,
(linenr_T)0, (long)(bot - fp->fd_top),
(linenr_T)MAXLNUM, (long)(fp->fd_top - bot - 1));
@@ -2575,11 +2624,170 @@ static void foldRemove(garray_T *gap, linenr_T top, linenr_T bot)
break;
}
- /* 4: Delete completely contained fold. */
- deleteFoldEntry(gap, (int)(fp - (fold_T *)gap->ga_data), TRUE);
+ // 4: Delete completely contained fold.
+ deleteFoldEntry(gap, (int)(fp - (fold_T *)gap->ga_data), true);
+ }
+ }
+}
+
+// foldReverseOrder() {{{2
+static void foldReverseOrder(
+ garray_T *gap,
+ const linenr_T start_arg,
+ const linenr_T end_arg)
+{
+ linenr_T start = start_arg;
+ linenr_T end = end_arg;
+ for (; start < end; start++, end--) {
+ fold_T *left = (fold_T *)gap->ga_data + start;
+ fold_T *right = (fold_T *)gap->ga_data + end;
+ fold_T tmp = *left;
+ *left = *right;
+ *right = tmp;
+ }
+}
+
+// foldMoveRange() {{{2
+// Move folds within the inclusive range "line1" to "line2" to after "dest"
+// require "line1" <= "line2" <= "dest"
+//
+// There are the following situations for the first fold at or below line1 - 1.
+// 1 2 3 4
+// 1 2 3 4
+// line1 2 3 4
+// 2 3 4 5 6 7
+// line2 3 4 5 6 7
+// 3 4 6 7 8 9
+// dest 4 7 8 9
+// 4 7 8 10
+// 4 7 8 10
+//
+// In the following descriptions, "moved" means moving in the buffer, *and* in
+// the fold array.
+// Meanwhile, "shifted" just means moving in the buffer.
+// 1. not changed
+// 2. truncated above line1
+// 3. length reduced by line2 - line1, folds starting between the end of 3 and
+// dest are truncated and shifted up
+// 4. internal folds moved (from [line1, line2] to dest)
+// 5. moved to dest.
+// 6. truncated below line2 and moved.
+// 7. length reduced by line2 - dest, folds starting between line2 and dest are
+// removed, top is moved down by move_len.
+// 8. truncated below dest and shifted up.
+// 9. shifted up
+// 10. not changed
+static void truncate_fold(fold_T *fp, linenr_T end)
+{
+ // I want to stop *at here*, foldRemove() stops *above* top
+ end += 1;
+ foldRemove(&fp->fd_nested, end - fp->fd_top, MAXLNUM);
+ fp->fd_len = end - fp->fd_top;
+}
+
+#define FOLD_END(fp) ((fp)->fd_top + (fp)->fd_len - 1)
+#define VALID_FOLD(fp, gap) ((fp) < ((fold_T *)(gap)->ga_data + (gap)->ga_len))
+#define FOLD_INDEX(fp, gap) ((size_t)(fp - ((fold_T *)(gap)->ga_data)))
+void foldMoveRange(garray_T *gap, const linenr_T line1, const linenr_T line2,
+ const linenr_T dest)
+{
+ fold_T *fp;
+ const linenr_T range_len = line2 - line1 + 1;
+ const linenr_T move_len = dest - line2;
+ const bool at_start = foldFind(gap, line1 - 1, &fp);
+
+ if (at_start) {
+ if (FOLD_END(fp) > dest) {
+ // Case 4 -- don't have to change this fold, but have to move nested
+ // folds.
+ foldMoveRange(&fp->fd_nested, line1 - fp->fd_top, line2 -
+ fp->fd_top, dest - fp->fd_top);
+ return;
+ } else if (FOLD_END(fp) > line2) {
+ // Case 3 -- Remove nested folds between line1 and line2 & reduce the
+ // length of fold by "range_len".
+ // Folds after this one must be dealt with.
+ foldMarkAdjustRecurse(&fp->fd_nested, line1 - fp->fd_top,
+ line2 - fp->fd_top, MAXLNUM, -range_len);
+ fp->fd_len -= range_len;
+ } else {
+ // Case 2 -- truncate fold *above* line1.
+ // Folds after this one must be dealt with.
+ truncate_fold(fp, line1 - 1);
+ }
+ // Look at the next fold, and treat that one as if it were the first after
+ // "line1" (because now it is).
+ fp = fp + 1;
+ }
+
+ if (!VALID_FOLD(fp, gap) || fp->fd_top > dest) {
+ // No folds after "line1" and before "dest"
+ // Case 10.
+ return;
+ } else if (fp->fd_top > line2) {
+ for (; VALID_FOLD(fp, gap) && FOLD_END(fp) <= dest; fp++) {
+ // Case 9. (for all case 9's) -- shift up.
+ fp->fd_top -= range_len;
+ }
+ if (VALID_FOLD(fp, gap) && fp->fd_top <= dest) {
+ // Case 8. -- ensure truncated at dest, shift up
+ truncate_fold(fp, dest);
+ fp->fd_top -= range_len;
+ }
+ return;
+ } else if (FOLD_END(fp) > dest) {
+ // Case 7 -- remove nested folds and shrink
+ foldMarkAdjustRecurse(&fp->fd_nested, line2 + 1 - fp->fd_top,
+ dest - fp->fd_top, MAXLNUM, -move_len);
+ fp->fd_len -= move_len;
+ fp->fd_top += move_len;
+ return;
+ }
+
+ // Case 5 or 6: changes rely on whether there are folds between the end of
+ // this fold and "dest".
+ size_t move_start = FOLD_INDEX(fp, gap);
+ size_t move_end = 0, dest_index = 0;
+ for (; VALID_FOLD(fp, gap) && fp->fd_top <= dest; fp++) {
+ if (fp->fd_top <= line2) {
+ // 5, or 6
+ if (FOLD_END(fp) > line2) {
+ // 6, truncate before moving
+ truncate_fold(fp, line2);
+ }
+ fp->fd_top += move_len;
+ continue;
+ }
+
+ // Record index of the first fold after the moved range.
+ if (move_end == 0) {
+ move_end = FOLD_INDEX(fp, gap);
}
+
+ if (FOLD_END(fp) > dest) {
+ truncate_fold(fp, dest);
+ }
+
+ fp->fd_top -= range_len;
+ }
+ dest_index = FOLD_INDEX(fp, gap);
+
+ // All folds are now correct, but not necessarily in the correct order.
+ // We must swap folds in the range [move_end, dest_index) with those in the
+ // range [move_start, move_end).
+ if (move_end == 0) {
+ // There are no folds after those moved, so none were moved out of order.
+ return;
}
+ foldReverseOrder(gap, (linenr_T)move_start, (linenr_T)(dest_index - 1));
+ foldReverseOrder(gap, (linenr_T)move_start,
+ (linenr_T)(move_start + dest_index - move_end - 1));
+ foldReverseOrder(gap, (linenr_T)(move_start + dest_index - move_end),
+ (linenr_T)(dest_index - 1));
}
+#undef FOLD_END
+#undef VALID_FOLD
+#undef FOLD_INDEX
/* foldMerge() {{{2 */
/*
@@ -2615,8 +2823,8 @@ static void foldMerge(fold_T *fp1, garray_T *gap, fold_T *fp2)
}
fp1->fd_len += fp2->fd_len;
- deleteFoldEntry(gap, (int)(fp2 - (fold_T *)gap->ga_data), TRUE);
- fold_changed = TRUE;
+ deleteFoldEntry(gap, (int)(fp2 - (fold_T *)gap->ga_data), true);
+ fold_changed = true;
}
/* foldlevelIndent() {{{2 */
@@ -2642,8 +2850,9 @@ static void foldlevelIndent(fline_T *flp)
flp->lvl = 0;
else
flp->lvl = -1;
- } else
- flp->lvl = get_indent_buf(buf, lnum) / get_sw_value(curbuf);
+ } else {
+ flp->lvl = get_indent_buf(buf, lnum) / get_sw_value(buf);
+ }
if (flp->lvl > flp->wp->w_p_fdn) {
flp->lvl = (int) MAX(0, flp->wp->w_p_fdn);
}
@@ -2674,7 +2883,6 @@ static void foldlevelExpr(fline_T *flp)
int n;
int c;
linenr_T lnum = flp->lnum + flp->off;
- int save_keytyped;
win = curwin;
curwin = flp->wp;
@@ -2689,8 +2897,8 @@ static void foldlevelExpr(fline_T *flp)
/* KeyTyped may be reset to 0 when calling a function which invokes
* do_cmdline(). To make 'foldopen' work correctly restore KeyTyped. */
- save_keytyped = KeyTyped;
- n = eval_foldexpr(flp->wp->w_p_fde, &c);
+ const bool save_keytyped = KeyTyped;
+ n = (int)eval_foldexpr(flp->wp->w_p_fde, &c);
KeyTyped = save_keytyped;
switch (c) {
@@ -2829,10 +3037,12 @@ static void foldlevelMarker(fline_T *flp)
if (flp->lvl_next > start_lvl)
flp->lvl_next = start_lvl;
}
- } else
- --flp->lvl_next;
- } else
- mb_ptr_adv(s);
+ } else {
+ flp->lvl_next--;
+ }
+ } else {
+ MB_PTR_ADV(s);
+ }
}
/* The level can't go negative, must be missing a start marker. */
diff --git a/src/nvim/fold.h b/src/nvim/fold.h
index 2ff10c0e91..f35b328fb1 100644
--- a/src/nvim/fold.h
+++ b/src/nvim/fold.h
@@ -1,7 +1,12 @@
#ifndef NVIM_FOLD_H
#define NVIM_FOLD_H
+#include <stdio.h>
+
#include "nvim/pos.h"
+#include "nvim/garray.h"
+#include "nvim/types.h"
+#include "nvim/buffer_defs.h"
/*
* Info used to pass info about a fold from the fold-detection code to the
diff --git a/src/nvim/func_attr.h b/src/nvim/func_attr.h
index ea017ab0c8..6e5e47c060 100644
--- a/src/nvim/func_attr.h
+++ b/src/nvim/func_attr.h
@@ -41,9 +41,7 @@
// $ gcc -E -dM - </dev/null
// $ echo | clang -dM -E -
-#ifndef NVIM_FUNC_ATTR_H
-#define NVIM_FUNC_ATTR_H
-#undef NVIM_FUNC_ATTR_H
+#include "nvim/macros.h"
#ifdef FUNC_ATTR_MALLOC
# undef FUNC_ATTR_MALLOC
@@ -93,11 +91,22 @@
# undef FUNC_ATTR_NONNULL_RET
#endif
+#ifdef FUNC_ATTR_NORETURN
+# undef FUNC_ATTR_NORETURN
+#endif
+
+#ifdef FUNC_ATTR_NO_SANITIZE_UNDEFINED
+# undef FUNC_ATTR_NO_SANITIZE_UNDEFINED
+#endif
+
+#ifdef FUNC_ATTR_PRINTF
+# undef FUNC_ATTR_PRINTF
+#endif
+
#ifndef DID_REAL_ATTR
# define DID_REAL_ATTR
# ifdef __GNUC__
-// place defines for all gnulikes here, for now that's gcc, clang and
-// intel.
+// For all gnulikes: gcc, clang, intel.
// place these after the argument list of the function declaration
// (not definition), like so:
@@ -111,27 +120,28 @@
# define REAL_FATTR_UNUSED __attribute__((unused))
# define REAL_FATTR_NONNULL_ALL __attribute__((nonnull))
# define REAL_FATTR_NONNULL_ARG(...) __attribute__((nonnull(__VA_ARGS__)))
+# define REAL_FATTR_NORETURN __attribute__((noreturn))
+# define REAL_FATTR_PRINTF(x, y) __attribute__((format (printf, x, y)))
+
+# if NVIM_HAS_ATTRIBUTE(returns_nonnull)
+# define REAL_FATTR_NONNULL_RET __attribute__((returns_nonnull))
+# endif
-# ifdef __clang__
-// clang only
-# elif defined(__INTEL_COMPILER)
-// intel only
-# else
-# define GCC_VERSION \
- (__GNUC__ * 10000 + \
- __GNUC_MINOR__ * 100 + \
- __GNUC_PATCHLEVEL__)
-// gcc only
+# if NVIM_HAS_ATTRIBUTE(alloc_size)
# define REAL_FATTR_ALLOC_SIZE(x) __attribute__((alloc_size(x)))
# define REAL_FATTR_ALLOC_SIZE_PROD(x, y) __attribute__((alloc_size(x, y)))
-# if GCC_VERSION >= 40900
-# define REAL_FATTR_NONNULL_RET __attribute__((returns_nonnull))
-# endif
+# endif
+
+# if NVIM_HAS_ATTRIBUTE(no_sanitize_undefined)
+# define REAL_FATTR_NO_SANITIZE_UNDEFINED \
+ __attribute__((no_sanitize_undefined))
+# elif NVIM_HAS_ATTRIBUTE(no_sanitize)
+# define REAL_FATTR_NO_SANITIZE_UNDEFINED \
+ __attribute__((no_sanitize("undefined")))
# endif
# endif
-// define function attributes that haven't been defined for this specific
-// compiler.
+// Define attributes that are not defined for this compiler.
# ifndef REAL_FATTR_MALLOC
# define REAL_FATTR_MALLOC
@@ -180,11 +190,26 @@
# ifndef REAL_FATTR_NONNULL_RET
# define REAL_FATTR_NONNULL_RET
# endif
+
+# ifndef REAL_FATTR_NORETURN
+# define REAL_FATTR_NORETURN
+# endif
+
+# ifndef REAL_FATTR_NO_SANITIZE_UNDEFINED
+# define REAL_FATTR_NO_SANITIZE_UNDEFINED
+# endif
+
+# ifndef REAL_FATTR_PRINTF
+# define REAL_FATTR_PRINTF(x, y)
+# endif
#endif
#ifdef DEFINE_FUNC_ATTRIBUTES
# define FUNC_API_ASYNC
# define FUNC_API_NOEXPORT
+# define FUNC_API_REMOTE_ONLY
+# define FUNC_API_SINCE(X)
+# define FUNC_API_DEPRECATED_SINCE(X)
# define FUNC_ATTR_MALLOC REAL_FATTR_MALLOC
# define FUNC_ATTR_ALLOC_SIZE(x) REAL_FATTR_ALLOC_SIZE(x)
# define FUNC_ATTR_ALLOC_SIZE_PROD(x, y) REAL_FATTR_ALLOC_SIZE_PROD(x, y)
@@ -197,6 +222,9 @@
# define FUNC_ATTR_NONNULL_ALL REAL_FATTR_NONNULL_ALL
# define FUNC_ATTR_NONNULL_ARG(...) REAL_FATTR_NONNULL_ARG(__VA_ARGS__)
# define FUNC_ATTR_NONNULL_RET REAL_FATTR_NONNULL_RET
+# define FUNC_ATTR_NORETURN REAL_FATTR_NORETURN
+# define FUNC_ATTR_NO_SANITIZE_UNDEFINED REAL_FATTR_NO_SANITIZE_UNDEFINED
+# define FUNC_ATTR_PRINTF(x, y) REAL_FATTR_PRINTF(x, y)
#elif !defined(DO_NOT_DEFINE_EMPTY_ATTRIBUTES)
# define FUNC_ATTR_MALLOC
# define FUNC_ATTR_ALLOC_SIZE(x)
@@ -210,5 +238,7 @@
# define FUNC_ATTR_NONNULL_ALL
# define FUNC_ATTR_NONNULL_ARG(...)
# define FUNC_ATTR_NONNULL_RET
+# define FUNC_ATTR_NORETURN
+# define FUNC_ATTR_NO_SANITIZE_UNDEFINED
+# define FUNC_ATTR_PRINTF(x, y)
#endif
-#endif // NVIM_FUNC_ATTR_H
diff --git a/src/nvim/garray.c b/src/nvim/garray.c
index 98cec69b54..2d2af54c95 100644
--- a/src/nvim/garray.c
+++ b/src/nvim/garray.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/// @file garray.c
///
/// Functions for handling growing arrays.
@@ -8,7 +11,6 @@
#include "nvim/vim.h"
#include "nvim/ascii.h"
#include "nvim/log.h"
-#include "nvim/misc2.h"
#include "nvim/memory.h"
#include "nvim/path.h"
#include "nvim/garray.h"
diff --git a/src/nvim/garray.h b/src/nvim/garray.h
index 5d7806bbfa..58738df691 100644
--- a/src/nvim/garray.h
+++ b/src/nvim/garray.h
@@ -37,7 +37,7 @@ typedef struct growarray {
static inline void *ga_append_via_ptr(garray_T *gap, size_t item_size)
{
if ((int)item_size != gap->ga_itemsize) {
- ELOG("wrong item size in garray(%d), should be %d", item_size);
+ WLOG("wrong item size (%zu), should be %d", item_size, gap->ga_itemsize);
}
ga_grow(gap, 1);
return ((char *)gap->ga_data) + (item_size * (size_t)gap->ga_len++);
diff --git a/src/nvim/generators/c_grammar.lua b/src/nvim/generators/c_grammar.lua
new file mode 100644
index 0000000000..d3047e1a9c
--- /dev/null
+++ b/src/nvim/generators/c_grammar.lua
@@ -0,0 +1,50 @@
+lpeg = require('lpeg')
+
+-- lpeg grammar for building api metadata from a set of header files. It
+-- ignores comments and preprocessor commands and parses a very small subset
+-- of C prototypes with a limited set of types
+local P, R, S = lpeg.P, lpeg.R, lpeg.S
+local C, Ct, Cc, Cg = lpeg.C, lpeg.Ct, lpeg.Cc, lpeg.Cg
+
+local any = P(1) -- (consume one character)
+local letter = R('az', 'AZ') + S('_$')
+local num = R('09')
+local alpha = letter + num
+local nl = P('\r\n') + P('\n')
+local not_nl = any - nl
+local ws = S(' \t') + nl
+local fill = ws ^ 0
+local c_comment = P('//') * (not_nl ^ 0)
+local c_preproc = P('#') * (not_nl ^ 0)
+local typed_container =
+ (P('ArrayOf(') + P('DictionaryOf(')) * ((any - P(')')) ^ 1) * P(')')
+local c_id = (
+ typed_container +
+ (letter * (alpha ^ 0))
+)
+local c_void = P('void')
+local c_param_type = (
+ ((P('Error') * fill * P('*') * fill) * Cc('error')) +
+ (C(c_id) * (ws ^ 1))
+ )
+local c_type = (C(c_void) * (ws ^ 1)) + c_param_type
+local c_param = Ct(c_param_type * C(c_id))
+local c_param_list = c_param * (fill * (P(',') * fill * c_param) ^ 0)
+local c_params = Ct(c_void + c_param_list)
+local c_proto = Ct(
+ Cg(c_type, 'return_type') * Cg(c_id, 'name') *
+ fill * P('(') * fill * Cg(c_params, 'parameters') * fill * P(')') *
+ Cg(Cc(false), 'async') *
+ (fill * Cg((P('FUNC_API_SINCE(') * C(num ^ 1)) * P(')'), 'since') ^ -1) *
+ (fill * Cg((P('FUNC_API_DEPRECATED_SINCE(') * C(num ^ 1)) * P(')'),
+ 'deprecated_since') ^ -1) *
+ (fill * Cg((P('FUNC_API_ASYNC') * Cc(true)), 'async') ^ -1) *
+ (fill * Cg((P('FUNC_API_NOEXPORT') * Cc(true)), 'noexport') ^ -1) *
+ (fill * Cg((P('FUNC_API_REMOTE_ONLY') * Cc(true)), 'remote_only') ^ -1) *
+ (fill * Cg((P('FUNC_API_REMOTE_IMPL') * Cc(true)), 'remote_impl') ^ -1) *
+ (fill * Cg((P('FUNC_API_BRIDGE_IMPL') * Cc(true)), 'bridge_impl') ^ -1) *
+ fill * P(';')
+ )
+
+local grammar = Ct((c_proto + c_comment + c_preproc + ws) ^ 1)
+return {grammar=grammar, typed_container=typed_container}
diff --git a/src/nvim/generators/dump_bin_array.lua b/src/nvim/generators/dump_bin_array.lua
new file mode 100644
index 0000000000..bee5aba73f
--- /dev/null
+++ b/src/nvim/generators/dump_bin_array.lua
@@ -0,0 +1,17 @@
+local function dump_bin_array(output, name, data)
+ output:write([[
+ static const uint8_t ]]..name..[[[] = {
+]])
+
+ for i = 1, #data do
+ output:write(string.byte(data, i)..', ')
+ if i % 10 == 0 then
+ output:write('\n ')
+ end
+ end
+ output:write([[
+};
+]])
+end
+
+return dump_bin_array
diff --git a/src/nvim/generators/gen_api_dispatch.lua b/src/nvim/generators/gen_api_dispatch.lua
new file mode 100644
index 0000000000..bd9650e4d1
--- /dev/null
+++ b/src/nvim/generators/gen_api_dispatch.lua
@@ -0,0 +1,468 @@
+mpack = require('mpack')
+
+-- we need at least 4 arguments since the last two are output files
+if arg[1] == '--help' then
+ print('Usage: genmsgpack.lua args')
+ print('Args: 1: source directory')
+ print(' 2: dispatch output file (dispatch_wrappers.generated.h)')
+ print(' 3: functions metadata output file (funcs_metadata.generated.h)')
+ print(' 4: API metadata output file (api_metadata.mpack)')
+ print(' 5: lua C bindings output file (msgpack_lua_c_bindings.generated.c)')
+ print(' rest: C files where API functions are defined')
+end
+assert(#arg >= 4)
+functions = {}
+
+local nvimdir = arg[1]
+package.path = nvimdir .. '/?.lua;' .. package.path
+
+-- names of all headers relative to the source root (for inclusion in the
+-- generated file)
+headers = {}
+
+-- output h file with generated dispatch functions
+dispatch_outputf = arg[2]
+-- output h file with packed metadata
+funcs_metadata_outputf = arg[3]
+-- output metadata mpack file, for use by other build scripts
+mpack_outputf = arg[4]
+lua_c_bindings_outputf = arg[5]
+
+-- set of function names, used to detect duplicates
+function_names = {}
+
+c_grammar = require('generators.c_grammar')
+
+-- read each input file, parse and append to the api metadata
+for i = 6, #arg do
+ local full_path = arg[i]
+ local parts = {}
+ for part in string.gmatch(full_path, '[^/]+') do
+ parts[#parts + 1] = part
+ end
+ headers[#headers + 1] = parts[#parts - 1]..'/'..parts[#parts]
+
+ local input = io.open(full_path, 'rb')
+
+ local tmp = c_grammar.grammar:match(input:read('*all'))
+ for i = 1, #tmp do
+ local fn = tmp[i]
+ if not fn.noexport then
+ functions[#functions + 1] = tmp[i]
+ function_names[fn.name] = true
+ if #fn.parameters ~= 0 and fn.parameters[1][2] == 'channel_id' then
+ -- this function should receive the channel id
+ fn.receives_channel_id = true
+ -- remove the parameter since it won't be passed by the api client
+ table.remove(fn.parameters, 1)
+ end
+ if #fn.parameters ~= 0 and fn.parameters[#fn.parameters][1] == 'error' then
+ -- function can fail if the last parameter type is 'Error'
+ fn.can_fail = true
+ -- remove the error parameter, msgpack has it's own special field
+ -- for specifying errors
+ fn.parameters[#fn.parameters] = nil
+ end
+ end
+ end
+ input:close()
+end
+
+local function shallowcopy(orig)
+ local copy = {}
+ for orig_key, orig_value in pairs(orig) do
+ copy[orig_key] = orig_value
+ end
+ return copy
+end
+
+local function startswith(String,Start)
+ return string.sub(String,1,string.len(Start))==Start
+end
+
+-- Export functions under older deprecated names.
+-- These will be removed eventually.
+local deprecated_aliases = require("api.dispatch_deprecated")
+for i,f in ipairs(shallowcopy(functions)) do
+ local ismethod = false
+ if startswith(f.name, "nvim_") then
+ if startswith(f.name, "nvim__") then
+ f.since = -1
+ elseif f.since == nil then
+ print("Function "..f.name.." lacks since field.\n")
+ os.exit(1)
+ end
+ f.since = tonumber(f.since)
+ if f.deprecated_since ~= nil then
+ f.deprecated_since = tonumber(f.deprecated_since)
+ end
+
+ if startswith(f.name, "nvim_buf_") then
+ ismethod = true
+ elseif startswith(f.name, "nvim_win_") then
+ ismethod = true
+ elseif startswith(f.name, "nvim_tabpage_") then
+ ismethod = true
+ end
+ else
+ f.remote_only = true
+ f.since = 0
+ f.deprecated_since = 1
+ end
+ f.method = ismethod
+ local newname = deprecated_aliases[f.name]
+ if newname ~= nil then
+ if function_names[newname] then
+ -- duplicate
+ print("Function "..f.name.." has deprecated alias\n"
+ ..newname.." which has a separate implementation.\n"..
+ "Please remove it from src/nvim/api/dispatch_deprecated.lua")
+ os.exit(1)
+ end
+ local newf = shallowcopy(f)
+ newf.name = newname
+ if newname == "ui_try_resize" then
+ -- The return type was incorrectly set to Object in 0.1.5.
+ -- Keep it that way for clients that rely on this.
+ newf.return_type = "Object"
+ end
+ newf.impl_name = f.name
+ newf.remote_only = true
+ newf.since = 0
+ newf.deprecated_since = 1
+ functions[#functions+1] = newf
+ end
+end
+
+-- don't expose internal attributes like "impl_name" in public metadata
+exported_attributes = {'name', 'parameters', 'return_type', 'method',
+ 'since', 'deprecated_since'}
+exported_functions = {}
+for _,f in ipairs(functions) do
+ if not startswith(f.name, "nvim__") then
+ local f_exported = {}
+ for _,attr in ipairs(exported_attributes) do
+ f_exported[attr] = f[attr]
+ end
+ exported_functions[#exported_functions+1] = f_exported
+ end
+end
+
+
+-- serialize the API metadata using msgpack and embed into the resulting
+-- binary for easy querying by clients
+funcs_metadata_output = io.open(funcs_metadata_outputf, 'wb')
+packed = mpack.pack(exported_functions)
+dump_bin_array = require("generators.dump_bin_array")
+dump_bin_array(funcs_metadata_output, 'funcs_metadata', packed)
+funcs_metadata_output:close()
+
+-- start building the dispatch wrapper output
+output = io.open(dispatch_outputf, 'wb')
+
+local function real_type(type)
+ local rv = type
+ if c_grammar.typed_container:match(rv) then
+ if rv:match('Array') then
+ rv = 'Array'
+ else
+ rv = 'Dictionary'
+ end
+ end
+ return rv
+end
+
+local function attr_name(rt)
+ if rt == 'Float' then
+ return 'floating'
+ else
+ return rt:lower()
+ end
+end
+
+-- start the handler functions. Visit each function metadata to build the
+-- handler function with code generated for validating arguments and calling to
+-- the real API.
+for i = 1, #functions do
+ local fn = functions[i]
+ if fn.impl_name == nil then
+ local args = {}
+
+ output:write('Object handle_'..fn.name..'(uint64_t channel_id, Array args, Error *error)')
+ output:write('\n{')
+ output:write('\n#if MIN_LOG_LEVEL <= DEBUG_LOG_LEVEL')
+ output:write('\n logmsg(DEBUG_LOG_LEVEL, "RPC: ", NULL, -1, true, "invoke '..fn.name..'");')
+ output:write('\n#endif')
+ output:write('\n Object ret = NIL;')
+ -- Declare/initialize variables that will hold converted arguments
+ for j = 1, #fn.parameters do
+ local param = fn.parameters[j]
+ local converted = 'arg_'..j
+ output:write('\n '..param[1]..' '..converted..';')
+ end
+ output:write('\n')
+ output:write('\n if (args.size != '..#fn.parameters..') {')
+ output:write('\n api_set_error(error, kErrorTypeException, "Wrong number of arguments: expecting '..#fn.parameters..' but got %zu", args.size);')
+ output:write('\n goto cleanup;')
+ output:write('\n }\n')
+
+ -- Validation/conversion for each argument
+ for j = 1, #fn.parameters do
+ local converted, convert_arg, param, arg
+ param = fn.parameters[j]
+ converted = 'arg_'..j
+ local rt = real_type(param[1])
+ if rt ~= 'Object' then
+ if rt:match('^Buffer$') or rt:match('^Window$') or rt:match('^Tabpage$') then
+ -- Buffer, Window, and Tabpage have a specific type, but are stored in integer
+ output:write('\n if (args.items['..(j - 1)..'].type == kObjectType'..rt..' && args.items['..(j - 1)..'].data.integer >= 0) {')
+ output:write('\n '..converted..' = (handle_T)args.items['..(j - 1)..'].data.integer;')
+ else
+ output:write('\n if (args.items['..(j - 1)..'].type == kObjectType'..rt..') {')
+ output:write('\n '..converted..' = args.items['..(j - 1)..'].data.'..attr_name(rt)..';')
+ end
+ if rt:match('^Buffer$') or rt:match('^Window$') or rt:match('^Tabpage$') or rt:match('^Boolean$') then
+ -- accept nonnegative integers for Booleans, Buffers, Windows and Tabpages
+ output:write('\n } else if (args.items['..(j - 1)..'].type == kObjectTypeInteger && args.items['..(j - 1)..'].data.integer >= 0) {')
+ output:write('\n '..converted..' = (handle_T)args.items['..(j - 1)..'].data.integer;')
+ end
+ -- accept empty lua tables as empty dictionarys
+ if rt:match('^Dictionary') then
+ output:write('\n } else if (args.items['..(j - 1)..'].type == kObjectTypeArray && args.items['..(j - 1)..'].data.array.size == 0) {')
+ output:write('\n '..converted..' = (Dictionary)ARRAY_DICT_INIT;')
+ end
+ output:write('\n } else {')
+ output:write('\n api_set_error(error, kErrorTypeException, "Wrong type for argument '..j..', expecting '..param[1]..'");')
+ output:write('\n goto cleanup;')
+ output:write('\n }\n')
+ else
+ output:write('\n '..converted..' = args.items['..(j - 1)..'];\n')
+ end
+
+ args[#args + 1] = converted
+ end
+
+ -- function call
+ local call_args = table.concat(args, ', ')
+ output:write('\n ')
+ if fn.return_type ~= 'void' then
+ -- has a return value, prefix the call with a declaration
+ output:write(fn.return_type..' rv = ')
+ end
+
+ -- write the function name and the opening parenthesis
+ output:write(fn.name..'(')
+
+ if fn.receives_channel_id then
+ -- if the function receives the channel id, pass it as first argument
+ if #args > 0 or fn.can_fail then
+ output:write('channel_id, '..call_args)
+ else
+ output:write('channel_id')
+ end
+ else
+ output:write(call_args)
+ end
+
+ if fn.can_fail then
+ -- if the function can fail, also pass a pointer to the local error object
+ if #args > 0 then
+ output:write(', error);\n')
+ else
+ output:write('error);\n')
+ end
+ -- and check for the error
+ output:write('\n if (ERROR_SET(error)) {')
+ output:write('\n goto cleanup;')
+ output:write('\n }\n')
+ else
+ output:write(');\n')
+ end
+
+ if fn.return_type ~= 'void' then
+ output:write('\n ret = '..string.upper(real_type(fn.return_type))..'_OBJ(rv);')
+ end
+ output:write('\n\ncleanup:');
+
+ output:write('\n return ret;\n}\n\n');
+ end
+end
+
+-- Generate a function that initializes method names with handler functions
+output:write([[
+void msgpack_rpc_init_method_table(void)
+{
+ methods = map_new(String, MsgpackRpcRequestHandler)();
+
+]])
+
+for i = 1, #functions do
+ local fn = functions[i]
+ output:write(' msgpack_rpc_add_method_handler('..
+ '(String) {.data = "'..fn.name..'", '..
+ '.size = sizeof("'..fn.name..'") - 1}, '..
+ '(MsgpackRpcRequestHandler) {.fn = handle_'.. (fn.impl_name or fn.name)..
+ ', .async = '..tostring(fn.async)..'});\n')
+
+end
+
+output:write('\n}\n\n')
+output:close()
+
+mpack_output = io.open(mpack_outputf, 'wb')
+mpack_output:write(mpack.pack(functions))
+mpack_output:close()
+
+local function include_headers(output, headers)
+ for i = 1, #headers do
+ if headers[i]:sub(-12) ~= '.generated.h' then
+ output:write('\n#include "nvim/'..headers[i]..'"')
+ end
+ end
+end
+
+local function write_shifted_output(output, str)
+ str = str:gsub('\n ', '\n')
+ str = str:gsub('^ ', '')
+ str = str:gsub(' +$', '')
+ output:write(str)
+end
+
+-- start building lua output
+output = io.open(lua_c_bindings_outputf, 'wb')
+
+output:write([[
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+#include <lua.h>
+#include <lualib.h>
+#include <lauxlib.h>
+
+#include "nvim/func_attr.h"
+#include "nvim/api/private/defs.h"
+#include "nvim/api/private/helpers.h"
+#include "nvim/lua/converter.h"
+]])
+include_headers(output, headers)
+output:write('\n')
+
+lua_c_functions = {}
+
+local function process_function(fn)
+ lua_c_function_name = ('nlua_msgpack_%s'):format(fn.name)
+ write_shifted_output(output, string.format([[
+
+ static int %s(lua_State *lstate)
+ {
+ Error err = ERROR_INIT;
+ if (lua_gettop(lstate) != %i) {
+ api_set_error(&err, kErrorTypeValidation, "Expected %i argument%s");
+ goto exit_0;
+ }
+ ]], lua_c_function_name, #fn.parameters, #fn.parameters,
+ (#fn.parameters == 1) and '' or 's'))
+ lua_c_functions[#lua_c_functions + 1] = {
+ binding=lua_c_function_name,
+ api=fn.name
+ }
+ local cparams = ''
+ local free_code = {}
+ for j = #fn.parameters,1,-1 do
+ param = fn.parameters[j]
+ cparam = string.format('arg%u', j)
+ param_type = real_type(param[1])
+ lc_param_type = param_type:lower()
+ write_shifted_output(output, string.format([[
+ const %s %s = nlua_pop_%s(lstate, &err);
+
+ if (ERROR_SET(&err)) {
+ goto exit_%u;
+ }
+ ]], param[1], cparam, param_type, #fn.parameters - j))
+ free_code[#free_code + 1] = ('api_free_%s(%s);'):format(
+ lc_param_type, cparam)
+ cparams = cparam .. ', ' .. cparams
+ end
+ if fn.receives_channel_id then
+ cparams = 'LUA_INTERNAL_CALL, ' .. cparams
+ end
+ if fn.can_fail then
+ cparams = cparams .. '&err'
+ else
+ cparams = cparams:gsub(', $', '')
+ end
+ local free_at_exit_code = ''
+ for i = 1, #free_code do
+ local rev_i = #free_code - i + 1
+ local code = free_code[rev_i]
+ if i == 1 then
+ free_at_exit_code = free_at_exit_code .. ('\n %s'):format(code)
+ else
+ free_at_exit_code = free_at_exit_code .. ('\n exit_%u:\n %s'):format(
+ rev_i, code)
+ end
+ end
+ local err_throw_code = [[
+
+ exit_0:
+ if (ERROR_SET(&err)) {
+ luaL_where(lstate, 1);
+ lua_pushstring(lstate, err.msg);
+ api_clear_error(&err);
+ lua_concat(lstate, 2);
+ return lua_error(lstate);
+ }
+ ]]
+ if fn.return_type ~= 'void' then
+ if fn.return_type:match('^ArrayOf') then
+ return_type = 'Array'
+ else
+ return_type = fn.return_type
+ end
+ write_shifted_output(output, string.format([[
+ const %s ret = %s(%s);
+ nlua_push_%s(lstate, ret);
+ api_free_%s(ret);
+ %s
+ %s
+ return 1;
+ ]], fn.return_type, fn.name, cparams, return_type, return_type:lower(),
+ free_at_exit_code, err_throw_code))
+ else
+ write_shifted_output(output, string.format([[
+ %s(%s);
+ %s
+ %s
+ return 0;
+ ]], fn.name, cparams, free_at_exit_code, err_throw_code))
+ end
+ write_shifted_output(output, [[
+ }
+ ]])
+end
+
+for _, fn in ipairs(functions) do
+ if not fn.remote_only or fn.name:sub(1, 4) == '_vim' then
+ process_function(fn)
+ end
+end
+
+output:write(string.format([[
+void nlua_add_api_functions(lua_State *lstate)
+ FUNC_ATTR_NONNULL_ALL
+{
+ lua_createtable(lstate, 0, %u);
+]], #lua_c_functions))
+for _, func in ipairs(lua_c_functions) do
+ output:write(string.format([[
+
+ lua_pushcfunction(lstate, &%s);
+ lua_setfield(lstate, -2, "%s");]], func.binding, func.api))
+end
+output:write([[
+
+ lua_setfield(lstate, -2, "api");
+}
+]])
+
+output:close()
diff --git a/src/nvim/generators/gen_api_ui_events.lua b/src/nvim/generators/gen_api_ui_events.lua
new file mode 100644
index 0000000000..e76b601d8a
--- /dev/null
+++ b/src/nvim/generators/gen_api_ui_events.lua
@@ -0,0 +1,177 @@
+mpack = require('mpack')
+
+local nvimdir = arg[1]
+package.path = nvimdir .. '/?.lua;' .. package.path
+
+assert(#arg == 7)
+input = io.open(arg[2], 'rb')
+proto_output = io.open(arg[3], 'wb')
+call_output = io.open(arg[4], 'wb')
+remote_output = io.open(arg[5], 'wb')
+bridge_output = io.open(arg[6], 'wb')
+metadata_output = io.open(arg[7], 'wb')
+
+c_grammar = require('generators.c_grammar')
+local events = c_grammar.grammar:match(input:read('*all'))
+
+function write_signature(output, ev, prefix, notype)
+ output:write('('..prefix)
+ if prefix == "" and #ev.parameters == 0 then
+ output:write('void')
+ end
+ for j = 1, #ev.parameters do
+ if j > 1 or prefix ~= '' then
+ output:write(', ')
+ end
+ local param = ev.parameters[j]
+ if not notype then
+ output:write(param[1]..' ')
+ end
+ output:write(param[2])
+ end
+ output:write(')')
+end
+
+function write_arglist(output, ev, need_copy)
+ output:write(' Array args = ARRAY_DICT_INIT;\n')
+ for j = 1, #ev.parameters do
+ local param = ev.parameters[j]
+ local kind = string.upper(param[1])
+ local do_copy = need_copy and (kind == "ARRAY" or kind == "DICTIONARY" or kind == "STRING" or kind == "OBJECT")
+ output:write(' ADD(args, ')
+ if do_copy then
+ output:write('copy_object(')
+ end
+ output:write(kind..'_OBJ('..param[2]..')')
+ if do_copy then
+ output:write(')')
+ end
+ output:write(');\n')
+ end
+end
+
+for i = 1, #events do
+ ev = events[i]
+ assert(ev.return_type == 'void')
+
+ if ev.since == nil then
+ print("Ui event "..ev.name.." lacks since field.\n")
+ os.exit(1)
+ end
+ ev.since = tonumber(ev.since)
+
+ if not ev.remote_only then
+ proto_output:write(' void (*'..ev.name..')')
+ write_signature(proto_output, ev, 'UI *ui')
+ proto_output:write(';\n')
+
+ if not ev.remote_impl then
+ remote_output:write('static void remote_ui_'..ev.name)
+ write_signature(remote_output, ev, 'UI *ui')
+ remote_output:write('\n{\n')
+ write_arglist(remote_output, ev, true)
+ remote_output:write(' push_call(ui, "'..ev.name..'", args);\n')
+ remote_output:write('}\n\n')
+ end
+
+ if not ev.bridge_impl then
+
+ send, argv, recv, recv_argv, recv_cleanup = '', '', '', '', ''
+ argc = 1
+ for j = 1, #ev.parameters do
+ local param = ev.parameters[j]
+ copy = 'copy_'..param[2]
+ if param[1] == 'String' then
+ send = send..' String copy_'..param[2]..' = copy_string('..param[2]..');\n'
+ argv = argv..', '..copy..'.data, INT2PTR('..copy..'.size)'
+ recv = (recv..' String '..param[2]..
+ ' = (String){.data = argv['..argc..'],'..
+ '.size = (size_t)argv['..(argc+1)..']};\n')
+ recv_argv = recv_argv..', '..param[2]
+ recv_cleanup = recv_cleanup..' api_free_string('..param[2]..');\n'
+ argc = argc+2
+ elseif param[1] == 'Array' then
+ send = send..' Array '..copy..' = copy_array('..param[2]..');\n'
+ argv = argv..', '..copy..'.items, INT2PTR('..copy..'.size)'
+ recv = (recv..' Array '..param[2]..
+ ' = (Array){.items = argv['..argc..'],'..
+ '.size = (size_t)argv['..(argc+1)..']};\n')
+ recv_argv = recv_argv..', '..param[2]
+ recv_cleanup = recv_cleanup..' api_free_array('..param[2]..');\n'
+ argc = argc+2
+ elseif param[1] == 'Object' then
+ send = send..' Object *'..copy..' = xmalloc(sizeof(Object));\n'
+ send = send..' *'..copy..' = copy_object('..param[2]..');\n'
+ argv = argv..', '..copy
+ recv = recv..' Object '..param[2]..' = *(Object *)argv['..argc..'];\n'
+ recv_argv = recv_argv..', '..param[2]
+ recv_cleanup = (recv_cleanup..' api_free_object('..param[2]..');\n'..
+ ' xfree(argv['..argc..']);\n')
+ argc = argc+1
+ elseif param[1] == 'Integer' or param[1] == 'Boolean' then
+ argv = argv..', INT2PTR('..param[2]..')'
+ recv_argv = recv_argv..', PTR2INT(argv['..argc..'])'
+ argc = argc+1
+ else
+ assert(false)
+ end
+ end
+ bridge_output:write('static void ui_bridge_'..ev.name..
+ '_event(void **argv)\n{\n')
+ bridge_output:write(' UI *ui = UI(argv[0]);\n')
+ bridge_output:write(recv)
+ bridge_output:write(' ui->'..ev.name..'(ui'..recv_argv..');\n')
+ bridge_output:write(recv_cleanup)
+ bridge_output:write('}\n\n')
+
+ bridge_output:write('static void ui_bridge_'..ev.name)
+ write_signature(bridge_output, ev, 'UI *ui')
+ bridge_output:write('\n{\n')
+ bridge_output:write(send)
+ bridge_output:write(' UI_BRIDGE_CALL(ui, '..ev.name..', '..argc..', ui'..argv..');\n}\n\n')
+ end
+ end
+
+ if not (ev.remote_only and ev.remote_impl) then
+ call_output:write('void ui_call_'..ev.name)
+ write_signature(call_output, ev, '')
+ call_output:write('\n{\n')
+ if ev.remote_only then
+ write_arglist(call_output, ev, false)
+ call_output:write(' UI_LOG('..ev.name..', 0);\n')
+ call_output:write(' ui_event("'..ev.name..'", args);\n')
+ else
+ call_output:write(' UI_CALL')
+ write_signature(call_output, ev, ev.name, true)
+ call_output:write(";\n")
+ end
+ call_output:write("}\n\n")
+ end
+
+end
+
+proto_output:close()
+call_output:close()
+remote_output:close()
+
+-- don't expose internal attributes like "impl_name" in public metadata
+exported_attributes = {'name', 'parameters',
+ 'since', 'deprecated_since'}
+exported_events = {}
+for _,ev in ipairs(events) do
+ local ev_exported = {}
+ for _,attr in ipairs(exported_attributes) do
+ ev_exported[attr] = ev[attr]
+ end
+ for _,p in ipairs(ev_exported.parameters) do
+ if p[1] == 'HlAttrs' then
+ p[1] = 'Dictionary'
+ end
+ end
+ exported_events[#exported_events+1] = ev_exported
+end
+
+packed = mpack.pack(exported_events)
+dump_bin_array = require("generators.dump_bin_array")
+dump_bin_array(metadata_output, 'ui_events_metadata', packed)
+metadata_output:close()
diff --git a/src/nvim/generators/gen_char_blob.lua b/src/nvim/generators/gen_char_blob.lua
new file mode 100644
index 0000000000..d860375e26
--- /dev/null
+++ b/src/nvim/generators/gen_char_blob.lua
@@ -0,0 +1,48 @@
+if arg[1] == '--help' then
+ print('Usage:')
+ print(' gencharblob.lua source target varname')
+ print('')
+ print('Generates C file with big uint8_t blob.')
+ print('Blob will be stored in a static const array named varname.')
+ os.exit()
+end
+
+assert(#arg == 3)
+
+local source_file = arg[1]
+local target_file = arg[2]
+local varname = arg[3]
+
+source = io.open(source_file, 'r')
+target = io.open(target_file, 'w')
+
+target:write('#include <stdint.h>\n\n')
+target:write(('static const uint8_t %s[] = {\n'):format(varname))
+
+num_bytes = 0
+MAX_NUM_BYTES = 15 -- 78 / 5: maximum number of bytes on one line
+target:write(' ')
+
+increase_num_bytes = function()
+ num_bytes = num_bytes + 1
+ if num_bytes == MAX_NUM_BYTES then
+ num_bytes = 0
+ target:write('\n ')
+ end
+end
+
+for line in source:lines() do
+ for i = 1,string.len(line) do
+ byte = string.byte(line, i)
+ assert(byte ~= 0)
+ target:write(string.format(' %3u,', byte))
+ increase_num_bytes()
+ end
+ target:write(string.format(' %3u,', string.byte('\n', 1)))
+ increase_num_bytes()
+end
+
+target:write(' 0};\n')
+
+source:close()
+target:close()
diff --git a/scripts/gendeclarations.lua b/src/nvim/generators/gen_declarations.lua
index ff69b18ae4..c40c37bb3e 100755
--- a/scripts/gendeclarations.lua
+++ b/src/nvim/generators/gen_declarations.lua
@@ -69,17 +69,18 @@ local word = branch(
right_word
)
)
+local inline_comment = concat(
+ lit('/*'),
+ any_amount(concat(
+ neg_look_ahead(lit('*/')),
+ any_character
+ )),
+ lit('*/')
+)
local spaces = any_amount(branch(
s,
-- Comments are really handled by preprocessor, so the following is not needed
- concat(
- lit('/*'),
- any_amount(concat(
- neg_look_ahead(lit('*/')),
- any_character
- )),
- lit('*/')
- ),
+ inline_comment,
concat(
lit('//'),
any_amount(concat(
@@ -110,6 +111,7 @@ local typ = one_or_more(typ_part)
local typ_id = two_or_more(typ_part)
local arg = typ_id -- argument name is swallowed by typ
local pattern = concat(
+ any_amount(branch(set(' ', '\t'), inline_comment)),
typ_id, -- return type with function name
spaces,
lit('('),
@@ -162,9 +164,40 @@ local pattern = concat(
)
if fname == '--help' then
- print'Usage:'
- print()
- print' gendeclarations.lua definitions.c static.h non-static.h preprocessor.i'
+ print([[
+Usage:
+
+ gendeclarations.lua definitions.c static.h non-static.h definitions.i
+
+Generates declarations for a C file definitions.c, putting declarations for
+static functions into static.h and declarations for non-static functions into
+non-static.h. File `definitions.i' should contain an already preprocessed
+version of definitions.c and it is the only one which is actually parsed,
+definitions.c is needed only to determine functions from which file out of all
+functions found in definitions.i are needed.
+
+Additionally uses the following environment variables:
+
+ NVIM_GEN_DECLARATIONS_LINE_NUMBERS:
+ If set to 1 then all generated declarations receive a comment with file
+ name and line number after the declaration. This may be useful for
+ debugging gen_declarations script, but not much beyond that with
+ configured development environment (i.e. with ctags/cscope/finding
+ definitions with clang/etc).
+
+ WARNING: setting this to 1 will cause extensive rebuilds: declarations
+ generator script will not regenerate non-static.h file if its
+ contents did not change, but including line numbers will make
+ contents actually change.
+
+ With contents changed timestamp of the file is regenerated even
+ when no real changes were made (e.g. a few lines were added to
+ a function which is not at the bottom of the file).
+
+ With changed timestamp build system will assume that header
+ changed, triggering rebuilds of all C files which depend on the
+ "changed" header.
+]])
os.exit()
end
@@ -188,24 +221,36 @@ local footer = [[
local non_static = header
local static = header
-local filepattern = '^#%a* %d+ "[^"]-/?([^"/]+)"'
+local filepattern = '^#%a* (%d+) "([^"]-)/?([^"/]+)"'
local curfile
-init = 0
-curfile = nil
-neededfile = fname:match('[^/]+$')
+local init = 1
+local curfile = nil
+local neededfile = fname:match('[^/]+$')
+local declline = 0
+local declendpos = 0
+local curdir = nil
+local is_needed_file = false
+local init_is_nl = true
while init ~= nil do
- init = text:find('\n', init)
- if init == nil then
- break
- end
- init = init + 1
- if text:sub(init, init) == '#' then
- file = text:match(filepattern, init)
+ if init_is_nl and text:sub(init, init) == '#' then
+ local line, dir, file = text:match(filepattern, init)
if file ~= nil then
curfile = file
+ is_needed_file = (curfile == neededfile)
+ declline = tonumber(line) - 1
+ local curdir_start = dir:find('src/nvim/')
+ if curdir_start ~= nil then
+ curdir = dir:sub(curdir_start + #('src/nvim/'))
+ else
+ curdir = dir
+ end
+ else
+ declline = declline - 1
end
- elseif curfile == neededfile then
+ elseif init < declendpos then
+ -- Skipping over declaration
+ elseif is_needed_file then
s = init
e = pattern:match(text, init)
if e ~= nil then
@@ -225,15 +270,30 @@ while init ~= nil do
declaration = declaration:gsub(' ?(%*+) ?', ' %1')
declaration = declaration:gsub(' ?(FUNC_ATTR_)', ' %1')
declaration = declaration:gsub(' $', '')
- declaration = declaration .. ';\n'
- if text:sub(s, s + 5) == 'static' then
+ declaration = declaration:gsub('^ ', '')
+ declaration = declaration .. ';'
+ if os.getenv('NVIM_GEN_DECLARATIONS_LINE_NUMBERS') == '1' then
+ declaration = declaration .. (' // %s/%s:%u'):format(
+ curdir, curfile, declline)
+ end
+ declaration = declaration .. '\n'
+ if declaration:sub(1, 6) == 'static' then
static = static .. declaration
else
non_static = non_static .. declaration
end
- init = e
+ declendpos = e
end
end
+ init = text:find('[\n;}]', init)
+ if init == nil then
+ break
+ end
+ init_is_nl = text:sub(init, init) == '\n'
+ init = init + 1
+ if init_is_nl and is_needed_file then
+ declline = declline + 1
+ end
end
non_static = non_static .. footer
diff --git a/src/nvim/generators/gen_eval.lua b/src/nvim/generators/gen_eval.lua
new file mode 100644
index 0000000000..23435a1d0b
--- /dev/null
+++ b/src/nvim/generators/gen_eval.lua
@@ -0,0 +1,67 @@
+mpack = require('mpack')
+
+local nvimsrcdir = arg[1]
+local autodir = arg[2]
+local metadata_file = arg[3]
+local funcs_file = arg[4]
+
+if nvimsrcdir == '--help' then
+ print([[
+Usage:
+ lua geneval.lua src/nvim build/src/nvim/auto
+
+Will generate build/src/nvim/auto/funcs.generated.h with definition of functions
+static const array.
+]])
+ os.exit(0)
+end
+
+package.path = nvimsrcdir .. '/?.lua;' .. package.path
+
+local funcsfname = autodir .. '/funcs.generated.h'
+
+local gperfpipe = io.open(funcsfname .. '.gperf', 'wb')
+
+local funcs = require('eval').funcs
+local metadata = mpack.unpack(io.open(arg[3], 'rb'):read("*all"))
+for i,fun in ipairs(metadata) do
+ if not fun.remote_only then
+ funcs[fun.name] = {
+ args=#fun.parameters,
+ func='api_wrapper',
+ data='&handle_'..fun.name,
+ }
+ end
+end
+
+local funcsdata = io.open(funcs_file, 'w')
+funcsdata:write(mpack.pack(funcs))
+funcsdata:close()
+
+gperfpipe:write([[
+%language=ANSI-C
+%global-table
+%readonly-tables
+%define initializer-suffix ,0,0,NULL,NULL
+%define word-array-name functions
+%define hash-function-name hash_internal_func_gperf
+%define lookup-function-name find_internal_func_gperf
+%omit-struct-type
+%struct-type
+VimLFuncDef;
+%%
+]])
+
+for name, def in pairs(funcs) do
+ args = def.args or 0
+ if type(args) == 'number' then
+ args = {args, args}
+ elseif #args == 1 then
+ args[2] = 'MAX_FUNC_ARGS'
+ end
+ func = def.func or ('f_' .. name)
+ data = def.data or "NULL"
+ gperfpipe:write(('%s, %s, %s, &%s, (FunPtr)%s\n')
+ :format(name, args[1], args[2], func, data))
+end
+gperfpipe:close()
diff --git a/scripts/gen_events.lua b/src/nvim/generators/gen_events.lua
index 75e0b3da3a..d03c787b2b 100644
--- a/scripts/gen_events.lua
+++ b/src/nvim/generators/gen_events.lua
@@ -25,25 +25,22 @@ static const struct event_name {
} event_names[] = {]])
for i, event in ipairs(events) do
- if i > 1 then
- comma = ',\n'
- else
- comma = '\n'
+ enum_tgt:write(('\n EVENT_%s = %u,'):format(event:upper(), i - 1))
+ names_tgt:write(('\n {%u, "%s", EVENT_%s},'):format(#event, event, event:upper()))
+ if i == #events then -- Last item.
+ enum_tgt:write(('\n NUM_EVENTS = %u,'):format(i))
end
- enum_tgt:write(('%s EVENT_%s = %u'):format(comma, event:upper(), i - 1))
- names_tgt:write(('%s {%u, "%s", EVENT_%s}'):format(comma, #event, event, event:upper()))
end
for alias, event in pairs(aliases) do
- names_tgt:write((',\n {%u, "%s", EVENT_%s}'):format(#alias, alias, event:upper()))
+ names_tgt:write(('\n {%u, "%s", EVENT_%s},'):format(#alias, alias, event:upper()))
end
-names_tgt:write(',\n {0, NULL, (event_T)0}')
+names_tgt:write('\n {0, NULL, (event_T)0},')
enum_tgt:write('\n} event_T;\n')
names_tgt:write('\n};\n')
-enum_tgt:write(('\n#define NUM_EVENTS %u\n'):format(#events))
names_tgt:write('\nstatic AutoPat *first_autopat[NUM_EVENTS] = {\n ')
line_len = 1
for i = 1,((#events) - 1) do
diff --git a/scripts/genex_cmds.lua b/src/nvim/generators/gen_ex_cmds.lua
index b1d34fbffd..cb566d46ca 100644
--- a/scripts/genex_cmds.lua
+++ b/src/nvim/generators/gen_ex_cmds.lua
@@ -66,7 +66,7 @@ for i, cmd in ipairs(defs) do
defsfile:write(string.format([[
[%s] = {
.cmd_name = (char_u *) "%s",
- .cmd_func = &%s,
+ .cmd_func = (ex_func_T)&%s,
.cmd_argt = %uL,
.cmd_addr_type = %i
}]], enumname, cmd.command, cmd.func, cmd.flags, cmd.addr_type))
diff --git a/scripts/genoptions.lua b/src/nvim/generators/gen_options.lua
index da53d010bd..fdc00d5dc0 100644
--- a/scripts/genoptions.lua
+++ b/src/nvim/generators/gen_options.lua
@@ -31,10 +31,12 @@ local type_flags={
local redraw_flags={
statuslines='P_RSTAT',
current_window='P_RWIN',
+ current_window_only='P_RWINONLY',
current_buffer='P_RBUF',
all_windows='P_RALL',
everything='P_RCLR',
curswant='P_CURSWANT',
+ ui_option='P_UI_OPTION',
}
local list_flags={
@@ -57,9 +59,14 @@ local get_flags = function(o)
add_flag(redraw_flags[r_flag])
end
end
+ if o.expand then
+ add_flag('P_EXPAND')
+ if o.expand == 'nodefault' then
+ add_flag('P_NO_DEF_EXP')
+ end
+ end
for _, flag_desc in ipairs({
{'alloced'},
- {'expand'},
{'nodefault'},
{'no_mkrc'},
{'vi_def'},
@@ -68,6 +75,7 @@ local get_flags = function(o)
{'gettext'},
{'noglob'},
{'normal_fname_chars', 'P_NFNAME'},
+ {'normal_dname_chars', 'P_NDNAME'},
{'pri_mkrc'},
{'deny_in_modelines', 'P_NO_ML'},
{'deny_duplicates', 'P_NODUP'},
@@ -112,7 +120,7 @@ local get_value = function(v)
end
local get_defaults = function(d)
- return '{' .. get_value(d.vi) .. ', ' .. get_value(d.vim) .. '}'
+ return ('{' .. get_value(d.vi) .. ', ' .. get_value(d.vim) .. '}')
end
local defines = {}
diff --git a/scripts/genunicodetables.lua b/src/nvim/generators/gen_unicode_tables.lua
index 36339e2fc6..66430ba26e 100644
--- a/scripts/genunicodetables.lua
+++ b/src/nvim/generators/gen_unicode_tables.lua
@@ -12,19 +12,27 @@
-- 2 then interval applies only to first, third, fifth, โ€ฆ character in range.
-- Fourth value is number that should be added to the codepoint to yield
-- folded/lower/upper codepoint.
+-- 4. emoji_width and emoji_all tables: sorted lists of non-overlapping closed
+-- intervals of Emoji characters. emoji_width contains all the characters
+-- which don't have ambiguous or double width, and emoji_all has all Emojis.
if arg[1] == '--help' then
print('Usage:')
- print(' genunicodetables.lua UnicodeData.txt CaseFolding.txt ' ..
- 'EastAsianWidth.txt')
- print(' unicode_tables.generated.h')
+ print(' genunicodetables.lua unicode/ unicode_tables.generated.h')
os.exit(0)
end
-local unicodedata_fname = arg[1]
-local casefolding_fname = arg[2]
-local eastasianwidth_fname = arg[3]
+local basedir = arg[1]
+local pathsep = package.config:sub(1, 1)
+local get_path = function(fname)
+ return basedir .. pathsep .. fname
+end
+
+local unicodedata_fname = get_path('UnicodeData.txt')
+local casefolding_fname = get_path('CaseFolding.txt')
+local eastasianwidth_fname = get_path('EastAsianWidth.txt')
+local emoji_fname = get_path('emoji-data.txt')
-local utf_tables_fname = arg[4]
+local utf_tables_fname = arg[2]
local split_on_semicolons = function(s)
local ret = {}
@@ -79,6 +87,10 @@ local parse_width_props = function(eaw_fp)
return fp_lines_to_lists(eaw_fp, 2, true)
end
+local parse_emoji_props = function(emoji_fp)
+ return fp_lines_to_lists(emoji_fp, 2, true)
+end
+
local make_range = function(start, end_, step, add)
if step and add then
return (' {0x%x, 0x%x, %d, %d},\n'):format(
@@ -168,6 +180,7 @@ local build_width_table = function(ut_fp, dataprops, widthprops, widths,
local start = -1
local end_ = -1
local dataidx = 1
+ local ret = {}
for _, p in ipairs(widthprops) do
if widths[p[2]:sub(1, 1)] then
local rng_start, rng_end = p[1]:find('%.%.')
@@ -200,6 +213,7 @@ local build_width_table = function(ut_fp, dataprops, widthprops, widths,
else
if start >= 0 then
ut_fp:write(make_range(start, end_))
+ table.insert(ret, {start, end_})
end
start = n
end
@@ -209,6 +223,72 @@ local build_width_table = function(ut_fp, dataprops, widthprops, widths,
end
if start >= 0 then
ut_fp:write(make_range(start, end_))
+ table.insert(ret, {start, end_})
+ end
+ ut_fp:write('};\n')
+ return ret
+end
+
+local build_emoji_table = function(ut_fp, emojiprops, doublewidth, ambiwidth)
+ local emojiwidth = {}
+ local emoji = {}
+ for _, p in ipairs(emojiprops) do
+ if p[2]:match('Emoji%s+#') then
+ local rng_start, rng_end = p[1]:find('%.%.')
+ if rng_start then
+ n = tonumber(p[1]:sub(1, rng_start - 1), 16)
+ n_last = tonumber(p[1]:sub(rng_end + 1), 16)
+ else
+ n = tonumber(p[1], 16)
+ n_last = n
+ end
+ if #emoji > 0 and n - 1 == emoji[#emoji][2] then
+ emoji[#emoji][2] = n_last
+ else
+ table.insert(emoji, { n, n_last })
+ end
+
+ -- Characters below 1F000 may be considered single width traditionally,
+ -- making them double width causes problems.
+ if n >= 0x1f000 then
+ -- exclude characters that are in the ambiguous/doublewidth table
+ for _, ambi in ipairs(ambiwidth) do
+ if n >= ambi[1] and n <= ambi[2] then
+ n = ambi[2] + 1
+ end
+ if n_last >= ambi[1] and n_last <= ambi[2] then
+ n_last = ambi[1] - 1
+ end
+ end
+ for _, double in ipairs(doublewidth) do
+ if n >= double[1] and n <= double[2] then
+ n = double[2] + 1
+ end
+ if n_last >= double[1] and n_last <= double[2] then
+ n_last = double[1] - 1
+ end
+ end
+
+ if n <= n_last then
+ if #emojiwidth > 0 and n - 1 == emojiwidth[#emojiwidth][2] then
+ emojiwidth[#emojiwidth][2] = n_last
+ else
+ table.insert(emojiwidth, { n, n_last })
+ end
+ end
+ end
+ end
+ end
+
+ ut_fp:write('static const struct interval emoji_all[] = {\n')
+ for _, p in ipairs(emoji) do
+ ut_fp:write(make_range(p[1], p[2]))
+ end
+ ut_fp:write('};\n')
+
+ ut_fp:write('static const struct interval emoji_width[] = {\n')
+ for _, p in ipairs(emojiwidth) do
+ ut_fp:write(make_range(p[1], p[2]))
end
ut_fp:write('};\n')
end
@@ -233,7 +313,15 @@ local eaw_fp = io.open(eastasianwidth_fname, 'r')
local widthprops = parse_width_props(eaw_fp)
eaw_fp:close()
-build_width_table(ut_fp, dataprops, widthprops, {W=true, F=true}, 'doublewidth')
-build_width_table(ut_fp, dataprops, widthprops, {A=true}, 'ambiguous')
+local doublewidth = build_width_table(ut_fp, dataprops, widthprops,
+ {W=true, F=true}, 'doublewidth')
+local ambiwidth = build_width_table(ut_fp, dataprops, widthprops,
+ {A=true}, 'ambiguous')
+
+local emoji_fp = io.open(emoji_fname, 'r')
+local emojiprops = parse_emoji_props(emoji_fp)
+emoji_fp:close()
+
+build_emoji_table(ut_fp, emojiprops, doublewidth, ambiwidth)
ut_fp:close()
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c
index ae1857f318..53e9846c2d 100644
--- a/src/nvim/getchar.c
+++ b/src/nvim/getchar.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* getchar.c
*
@@ -15,6 +18,7 @@
#include "nvim/vim.h"
#include "nvim/ascii.h"
#include "nvim/getchar.h"
+#include "nvim/buffer_defs.h"
#include "nvim/charset.h"
#include "nvim/cursor.h"
#include "nvim/edit.h"
@@ -29,7 +33,6 @@
#include "nvim/memory.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/keymap.h"
#include "nvim/garray.h"
#include "nvim/move.h"
@@ -38,12 +41,20 @@
#include "nvim/option.h"
#include "nvim/regexp.h"
#include "nvim/screen.h"
+#include "nvim/state.h"
#include "nvim/strings.h"
#include "nvim/ui.h"
#include "nvim/undo.h"
#include "nvim/event/loop.h"
#include "nvim/os/input.h"
#include "nvim/os/os.h"
+#include "nvim/os/fileio.h"
+#include "nvim/api/private/handle.h"
+
+
+/// Index in scriptin
+static int curscript = 0;
+FileDescriptor *scriptin[NSCRIPT] = { NULL };
/*
* These buffers are used for storing:
@@ -67,11 +78,9 @@
#define MINIMAL_SIZE 20 /* minimal size for b_str */
-static buffheader_T redobuff = {{NULL, {NUL}}, NULL, 0, 0};
-static buffheader_T old_redobuff = {{NULL, {NUL}}, NULL, 0, 0};
-static buffheader_T save_redobuff = {{NULL, {NUL}}, NULL, 0, 0};
-static buffheader_T save_old_redobuff = {{NULL, {NUL}}, NULL, 0, 0};
-static buffheader_T recordbuff = {{NULL, {NUL}}, NULL, 0, 0};
+static buffheader_T redobuff = { { NULL, { NUL } }, NULL, 0, 0 };
+static buffheader_T old_redobuff = { { NULL, { NUL } }, NULL, 0, 0 };
+static buffheader_T recordbuff = { { NULL, { NUL } }, NULL, 0, 0 };
// First read ahead buffer. Used for translated commands.
static buffheader_T readbuf1 = {{NULL, {NUL}}, NULL, 0, 0};
@@ -87,23 +96,20 @@ static int typeahead_char = 0; /* typeahead char that's not flushed */
*/
static int block_redo = FALSE;
-/*
- * Make a hash value for a mapping.
- * "mode" is the lower 4 bits of the State for the mapping.
- * "c1" is the first character of the "lhs".
- * Returns a value between 0 and 255, index in maphash.
- * Put Normal/Visual mode mappings mostly separately from Insert/Cmdline mode.
- */
+// Make a hash value for a mapping.
+// "mode" is the lower 4 bits of the State for the mapping.
+// "c1" is the first character of the "lhs".
+// Returns a value between 0 and 255, index in maphash.
+// Put Normal/Visual mode mappings mostly separately from Insert/Cmdline mode.
#define MAP_HASH(mode, \
c1) (((mode) & \
(NORMAL + VISUAL + SELECTMODE + \
- OP_PENDING)) ? (c1) : ((c1) ^ 0x80))
+ OP_PENDING + TERM_FOCUS)) ? (c1) : ((c1) ^ 0x80))
-/*
- * Each mapping is put in one of the 256 hash lists, to speed up finding it.
- */
-static mapblock_T *(maphash[256]);
-static int maphash_valid = FALSE;
+// Each mapping is put in one of the MAX_MAPHASH hash lists,
+// to speed up finding it.
+static mapblock_T *(maphash[MAX_MAPHASH]);
+static bool maphash_valid = false;
/*
* List used for abbreviations.
@@ -113,7 +119,7 @@ static mapblock_T *first_abbr = NULL; /* first entry in abbrlist */
static int KeyNoremap = 0; /* remapping flags */
/*
- * variables used by vgetorpeek() and flush_buffers()
+ * Variables used by vgetorpeek() and flush_buffers()
*
* typebuf.tb_buf[] contains all characters that are not consumed yet.
* typebuf.tb_buf[typebuf.tb_off] is the first valid character.
@@ -235,34 +241,34 @@ char_u *get_inserted(void)
return get_buffcont(&redobuff, FALSE);
}
-/*
- * Add string "s" after the current block of buffer "buf".
- * K_SPECIAL and CSI should have been escaped already.
- */
-static void
-add_buff (
- buffheader_T *buf,
- char_u *s,
- ssize_t slen // length of "s" or -1
-)
+/// Add string after the current block of the given buffer
+///
+/// K_SPECIAL and CSI should have been escaped already.
+///
+/// @param[out] buf Buffer to add to.
+/// @param[in] s String to add.
+/// @param[in] slen String length or -1 for NUL-terminated string.
+static void add_buff(buffheader_T *const buf, const char *const s,
+ ptrdiff_t slen)
{
if (slen < 0) {
- slen = (ssize_t)STRLEN(s);
+ slen = (ptrdiff_t)strlen(s);
}
if (slen == 0) { // don't add empty strings
return;
}
- if (buf->bh_first.b_next == NULL) { /* first add to list */
+ if (buf->bh_first.b_next == NULL) { // first add to list
buf->bh_space = 0;
buf->bh_curr = &(buf->bh_first);
- } else if (buf->bh_curr == NULL) { /* buffer has already been read */
- EMSG(_("E222: Add to read buffer"));
+ } else if (buf->bh_curr == NULL) { // buffer has already been read
+ IEMSG(_("E222: Add to read buffer"));
return;
- } else if (buf->bh_index != 0)
+ } else if (buf->bh_index != 0) {
memmove(buf->bh_first.b_next->b_str,
- buf->bh_first.b_next->b_str + buf->bh_index,
- STRLEN(buf->bh_first.b_next->b_str + buf->bh_index) + 1);
+ buf->bh_first.b_next->b_str + buf->bh_index,
+ STRLEN(buf->bh_first.b_next->b_str + buf->bh_index) + 1);
+ }
buf->bh_index = 0;
size_t len;
@@ -292,9 +298,8 @@ add_buff (
*/
static void add_num_buff(buffheader_T *buf, long n)
{
- char_u number[32];
-
- sprintf((char *)number, "%" PRId64, (int64_t)n);
+ char number[32];
+ snprintf(number, sizeof(number), "%ld", n);
add_buff(buf, number, -1L);
}
@@ -304,27 +309,29 @@ static void add_num_buff(buffheader_T *buf, long n)
*/
static void add_char_buff(buffheader_T *buf, int c)
{
- char_u bytes[MB_MAXBYTES + 1];
- int len;
- int i;
- char_u temp[4];
+ uint8_t bytes[MB_MAXBYTES + 1];
- if (IS_SPECIAL(c))
+ int len;
+ if (IS_SPECIAL(c)) {
len = 1;
- else
- len = (*mb_char2bytes)(c, bytes);
- for (i = 0; i < len; ++i) {
- if (!IS_SPECIAL(c))
+ } else {
+ len = utf_char2bytes(c, bytes);
+ }
+
+ for (int i = 0; i < len; i++) {
+ if (!IS_SPECIAL(c)) {
c = bytes[i];
+ }
+ char temp[4];
if (IS_SPECIAL(c) || c == K_SPECIAL || c == NUL) {
- /* translate special key code into three byte sequence */
- temp[0] = K_SPECIAL;
- temp[1] = (char_u)K_SECOND(c);
- temp[2] = (char_u)K_THIRD(c);
+ // Translate special key code into three byte sequence.
+ temp[0] = (char)K_SPECIAL;
+ temp[1] = (char)K_SECOND(c);
+ temp[2] = (char)K_THIRD(c);
temp[3] = NUL;
} else {
- temp[0] = (char_u)c;
+ temp[0] = (char)c;
temp[1] = NUL;
}
add_buff(buf, temp, -1L);
@@ -413,7 +420,7 @@ void typeahead_noflush(int c)
* typeahead buffer (used in case of an error). If "flush_typeahead" is true,
* flush all typeahead characters (used when interrupted by a CTRL-C).
*/
-void flush_buffers(int flush_typeahead)
+void flush_buffers(flush_buffers_T flush_typeahead)
{
init_typebuf();
@@ -421,24 +428,28 @@ void flush_buffers(int flush_typeahead)
while (read_readbuffers(TRUE) != NUL) {
}
- if (flush_typeahead) { /* remove all typeahead */
- /*
- * We have to get all characters, because we may delete the first part
- * of an escape sequence.
- * In an xterm we get one char at a time and we have to get them all.
- */
- while (inchar(typebuf.tb_buf, typebuf.tb_buflen - 1, 10L,
- typebuf.tb_change_cnt) != 0)
- ;
- typebuf.tb_off = MAXMAPLEN;
- typebuf.tb_len = 0;
- } else { /* remove mapped characters at the start only */
+ if (flush_typeahead == FLUSH_MINIMAL) {
+ // remove mapped characters at the start only
typebuf.tb_off += typebuf.tb_maplen;
typebuf.tb_len -= typebuf.tb_maplen;
+ } else {
+ // remove typeahead
+ if (flush_typeahead == FLUSH_INPUT) {
+ // We have to get all characters, because we may delete the first
+ // part of an escape sequence. In an xterm we get one char at a
+ // time and we have to get them all.
+ while (inchar(typebuf.tb_buf, typebuf.tb_buflen - 1, 10L) != 0) {
+ }
+ }
+ typebuf.tb_off = MAXMAPLEN;
+ typebuf.tb_len = 0;
+ // Reset the flag that text received from a client or from feedkeys()
+ // was inserted in the typeahead buffer.
+ typebuf_was_filled = false;
}
typebuf.tb_maplen = 0;
typebuf.tb_silent = 0;
- cmd_silent = FALSE;
+ cmd_silent = false;
typebuf.tb_no_abbr_cnt = 0;
}
@@ -471,53 +482,42 @@ void CancelRedo(void)
}
}
-/*
- * Save redobuff and old_redobuff to save_redobuff and save_old_redobuff.
- * Used before executing autocommands and user functions.
- */
-static int save_level = 0;
-
-void saveRedobuff(void)
+/// Save redobuff and old_redobuff to save_redobuff and save_old_redobuff.
+/// Used before executing autocommands and user functions.
+void saveRedobuff(save_redo_T *save_redo)
{
- char_u *s;
-
- if (save_level++ == 0) {
- save_redobuff = redobuff;
- redobuff.bh_first.b_next = NULL;
- save_old_redobuff = old_redobuff;
- old_redobuff.bh_first.b_next = NULL;
-
- /* Make a copy, so that ":normal ." in a function works. */
- s = get_buffcont(&save_redobuff, FALSE);
- if (s != NULL) {
- add_buff(&redobuff, s, -1L);
- xfree(s);
- }
+ save_redo->sr_redobuff = redobuff;
+ redobuff.bh_first.b_next = NULL;
+ save_redo->sr_old_redobuff = old_redobuff;
+ old_redobuff.bh_first.b_next = NULL;
+
+ // Make a copy, so that ":normal ." in a function works.
+ char *const s = (char *)get_buffcont(&save_redo->sr_redobuff, false);
+ if (s != NULL) {
+ add_buff(&redobuff, s, -1L);
+ xfree(s);
}
}
-/*
- * Restore redobuff and old_redobuff from save_redobuff and save_old_redobuff.
- * Used after executing autocommands and user functions.
- */
-void restoreRedobuff(void)
+/// Restore redobuff and old_redobuff from save_redobuff and save_old_redobuff.
+/// Used after executing autocommands and user functions.
+void restoreRedobuff(save_redo_T *save_redo)
{
- if (--save_level == 0) {
- free_buff(&redobuff);
- redobuff = save_redobuff;
- free_buff(&old_redobuff);
- old_redobuff = save_old_redobuff;
- }
+ free_buff(&redobuff);
+ redobuff = save_redo->sr_redobuff;
+ free_buff(&old_redobuff);
+ old_redobuff = save_redo->sr_old_redobuff;
}
/*
* Append "s" to the redo buffer.
* K_SPECIAL and CSI should already have been escaped.
*/
-void AppendToRedobuff(char_u *s)
+void AppendToRedobuff(const char *s)
{
- if (!block_redo)
- add_buff(&redobuff, s, -1L);
+ if (!block_redo) {
+ add_buff(&redobuff, (const char *)s, -1L);
+ }
}
/*
@@ -530,44 +530,47 @@ AppendToRedobuffLit (
int len /* length of "str" or -1 for up to the NUL */
)
{
- char_u *s = str;
- int c;
- char_u *start;
-
- if (block_redo)
+ if (block_redo) {
return;
+ }
+
+ const char *s = (const char *)str;
+ while (len < 0 ? *s != NUL : s - (const char *)str < len) {
+ // Put a string of normal characters in the redo buffer (that's
+ // faster).
+ const char *start = s;
+ while (*s >= ' ' && *s < DEL && (len < 0 || s - (const char *)str < len)) {
+ s++;
+ }
- while (len < 0 ? *s != NUL : s - str < len) {
- /* Put a string of normal characters in the redo buffer (that's
- * faster). */
- start = s;
- while (*s >= ' ' && *s < DEL && (len < 0 || s - str < len))
- ++s;
-
- /* Don't put '0' or '^' as last character, just in case a CTRL-D is
- * typed next. */
- if (*s == NUL && (s[-1] == '0' || s[-1] == '^'))
- --s;
- if (s > start)
+ // Don't put '0' or '^' as last character, just in case a CTRL-D is
+ // typed next.
+ if (*s == NUL && (s[-1] == '0' || s[-1] == '^')) {
+ s--;
+ }
+ if (s > start) {
add_buff(&redobuff, start, (long)(s - start));
+ }
- if (*s == NUL || (len >= 0 && s - str >= len))
+ if (*s == NUL || (len >= 0 && s - (const char *)str >= len)) {
break;
+ }
- /* Handle a special or multibyte character. */
- if (has_mbyte)
- /* Handle composing chars separately. */
- c = mb_cptr2char_adv(&s);
- else
- c = *s++;
- if (c < ' ' || c == DEL || (*s == NUL && (c == '0' || c == '^')))
+ // Handle a special or multibyte character.
+ // Composing chars separately are handled separately.
+ const int c = (has_mbyte
+ ? mb_cptr2char_adv((const char_u **)&s)
+ : (uint8_t)(*s++));
+ if (c < ' ' || c == DEL || (*s == NUL && (c == '0' || c == '^'))) {
add_char_buff(&redobuff, Ctrl_V);
+ }
- /* CTRL-V '0' must be inserted as CTRL-V 048 */
- if (*s == NUL && c == '0')
- add_buff(&redobuff, (char_u *)"048", 3L);
- else
+ // CTRL-V '0' must be inserted as CTRL-V 048.
+ if (*s == NUL && c == '0') {
+ add_buff(&redobuff, "048", 3L);
+ } else {
add_char_buff(&redobuff, c);
+ }
}
}
@@ -594,19 +597,19 @@ void AppendNumberToRedobuff(long n)
* Append string "s" to the stuff buffer.
* CSI and K_SPECIAL must already have been escaped.
*/
-void stuffReadbuff(char_u *s)
+void stuffReadbuff(const char *s)
{
add_buff(&readbuf1, s, -1L);
}
/// Append string "s" to the redo stuff buffer.
/// @remark CSI and K_SPECIAL must already have been escaped.
-void stuffRedoReadbuff(char_u *s)
+void stuffRedoReadbuff(const char *s)
{
add_buff(&readbuf2, s, -1L);
}
-void stuffReadbuffLen(char_u *s, long len)
+void stuffReadbuffLen(const char *s, long len)
{
add_buff(&readbuf1, s, len);
}
@@ -616,19 +619,18 @@ void stuffReadbuffLen(char_u *s, long len)
* escaping other K_SPECIAL and CSI bytes.
* Change CR, LF and ESC into a space.
*/
-void stuffReadbuffSpec(char_u *s)
+void stuffReadbuffSpec(const char *s)
{
- int c;
-
while (*s != NUL) {
- if (*s == K_SPECIAL && s[1] != NUL && s[2] != NUL) {
- /* Insert special key literally. */
- stuffReadbuffLen(s, 3L);
+ if ((uint8_t)(*s) == K_SPECIAL && s[1] != NUL && s[2] != NUL) {
+ // Insert special key literally.
+ stuffReadbuffLen(s, 3);
s += 3;
} else {
- c = mb_ptr2char_adv(&s);
- if (c == CAR || c == NL || c == ESC)
+ int c = mb_ptr2char_adv((const char_u **)&s);
+ if (c == CAR || c == NL || c == ESC) {
c = ' ';
+ }
stuffcharReadbuff(c);
}
}
@@ -651,15 +653,13 @@ void stuffnumReadbuff(long n)
add_num_buff(&readbuf1, n);
}
-/*
- * Read a character from the redo buffer. Translates K_SPECIAL, CSI and
- * multibyte characters.
- * The redo buffer is left as it is.
- * If init is TRUE, prepare for redo, return FAIL if nothing to redo, OK
- * otherwise.
- * If old is TRUE, use old_redobuff instead of redobuff.
- */
-static int read_redo(int init, int old_redo)
+// Read a character from the redo buffer. Translates K_SPECIAL, CSI and
+// multibyte characters.
+// The redo buffer is left as it is.
+// If init is true, prepare for redo, return FAIL if nothing to redo, OK
+// otherwise.
+// If old_redo is true, use old_redobuff instead of redobuff.
+static int read_redo(bool init, bool old_redo)
{
static buffblock_T *bp;
static char_u *p;
@@ -700,7 +700,7 @@ static int read_redo(int init, int old_redo)
buf[i] = (char_u)c;
if (i == n - 1) { // last byte of a character
if (n != 1) {
- c = (*mb_ptr2char)(buf);
+ c = utf_ptr2char(buf);
}
break;
}
@@ -712,64 +712,69 @@ static int read_redo(int init, int old_redo)
return c;
}
-/*
- * Copy the rest of the redo buffer into the stuff buffer (in a slow way).
- * If old_redo is TRUE, use old_redobuff instead of redobuff.
- * The escaped K_SPECIAL and CSI are copied without translation.
- */
-static void copy_redo(int old_redo)
+// Copy the rest of the redo buffer into the stuff buffer (in a slow way).
+// If old_redo is true, use old_redobuff instead of redobuff.
+// The escaped K_SPECIAL and CSI are copied without translation.
+static void copy_redo(bool old_redo)
{
int c;
- while ((c = read_redo(FALSE, old_redo)) != NUL) {
+ while ((c = read_redo(false, old_redo)) != NUL) {
add_char_buff(&readbuf2, c);
}
}
-/*
- * Stuff the redo buffer into readbuf2.
- * Insert the redo count into the command.
- * If "old_redo" is TRUE, the last but one command is repeated
- * instead of the last command (inserting text). This is used for
- * CTRL-O <.> in insert mode
- *
- * return FAIL for failure, OK otherwise
- */
-int start_redo(long count, int old_redo)
+// Stuff the redo buffer into readbuf2.
+// Insert the redo count into the command.
+// If "old_redo" is true, the last but one command is repeated
+// instead of the last command (inserting text). This is used for
+// CTRL-O <.> in insert mode
+//
+// return FAIL for failure, OK otherwise
+int start_redo(long count, bool old_redo)
{
int c;
- /* init the pointers; return if nothing to redo */
- if (read_redo(TRUE, old_redo) == FAIL)
+ // init the pointers; return if nothing to redo
+ if (read_redo(true, old_redo) == FAIL) {
return FAIL;
+ }
- c = read_redo(FALSE, old_redo);
+ c = read_redo(false, old_redo);
/* copy the buffer name, if present */
if (c == '"') {
- add_buff(&readbuf2, (char_u *)"\"", 1L);
- c = read_redo(FALSE, old_redo);
+ add_buff(&readbuf2, "\"", 1L);
+ c = read_redo(false, old_redo);
/* if a numbered buffer is used, increment the number */
if (c >= '1' && c < '9')
++c;
add_char_buff(&readbuf2, c);
- c = read_redo(FALSE, old_redo);
+
+ // the expression register should be re-evaluated
+ if (c == '=') {
+ add_char_buff(&readbuf2, CAR);
+ cmd_silent = true;
+ }
+
+ c = read_redo(false, old_redo);
}
if (c == 'v') { /* redo Visual */
VIsual = curwin->w_cursor;
- VIsual_active = TRUE;
- VIsual_select = FALSE;
- VIsual_reselect = TRUE;
- redo_VIsual_busy = TRUE;
- c = read_redo(FALSE, old_redo);
+ VIsual_active = true;
+ VIsual_select = false;
+ VIsual_reselect = true;
+ redo_VIsual_busy = true;
+ c = read_redo(false, old_redo);
}
- /* try to enter the count (in place of a previous count) */
+ // try to enter the count (in place of a previous count)
if (count) {
- while (ascii_isdigit(c)) /* skip "old" count */
- c = read_redo(FALSE, old_redo);
+ while (ascii_isdigit(c)) { // skip "old" count
+ c = read_redo(false, old_redo);
+ }
add_num_buff(&readbuf2, count);
}
@@ -788,12 +793,13 @@ int start_redo_ins(void)
{
int c;
- if (read_redo(TRUE, FALSE) == FAIL)
+ if (read_redo(true, false) == FAIL) {
return FAIL;
+ }
start_stuff();
- /* skip the count and the command character */
- while ((c = read_redo(FALSE, FALSE)) != NUL) {
+ // skip the count and the command character
+ while ((c = read_redo(false, false)) != NUL) {
if (vim_strchr((char_u *)"AaIiRrOo", c) != NULL) {
if (c == 'O' || c == 'o') {
add_buff(&readbuf2, NL_STR, -1L);
@@ -802,9 +808,9 @@ int start_redo_ins(void)
}
}
- /* copy the typed text from the redo buffer into the stuff buffer */
- copy_redo(FALSE);
- block_redo = TRUE;
+ // copy the typed text from the redo buffer into the stuff buffer
+ copy_redo(false);
+ block_redo = true;
return OK;
}
@@ -825,7 +831,7 @@ static void init_typebuf(void)
typebuf.tb_noremap = noremapbuf_init;
typebuf.tb_buflen = TYPELEN_INIT;
typebuf.tb_len = 0;
- typebuf.tb_off = 0;
+ typebuf.tb_off = MAXMAPLEN + 4;
typebuf.tb_change_cnt = 1;
}
}
@@ -865,20 +871,21 @@ int ins_typebuf(char_u *str, int noremap, int offset, int nottyped, bool silent)
addlen = (int)STRLEN(str);
- /*
- * Easy case: there is room in front of typebuf.tb_buf[typebuf.tb_off]
- */
if (offset == 0 && addlen <= typebuf.tb_off) {
+ // Easy case: there is room in front of typebuf.tb_buf[typebuf.tb_off]
typebuf.tb_off -= addlen;
memmove(typebuf.tb_buf + typebuf.tb_off, str, (size_t)addlen);
- }
- /*
- * Need to allocate a new buffer.
- * In typebuf.tb_buf there must always be room for 3 * MAXMAPLEN + 4
- * characters. We add some extra room to avoid having to allocate too
- * often.
- */
- else {
+ } else if (typebuf.tb_len == 0
+ && typebuf.tb_buflen >= addlen + 3 * (MAXMAPLEN + 4)) {
+ // Buffer is empty and string fits in the existing buffer.
+ // Leave some space before and after, if possible.
+ typebuf.tb_off = (typebuf.tb_buflen - addlen - 3 * (MAXMAPLEN + 4)) / 2;
+ memmove(typebuf.tb_buf + typebuf.tb_off, str, (size_t)addlen);
+ } else {
+ // Need to allocate a new buffer.
+ // In typebuf.tb_buf there must always be room for 3 * (MAXMAPLEN + 4)
+ // characters. We add some extra room to avoid having to allocate too
+ // often.
newoff = MAXMAPLEN + 4;
newlen = typebuf.tb_len + addlen + newoff + 4 * (MAXMAPLEN + 4);
if (newlen < 0) { /* string is getting too long */
@@ -950,7 +957,7 @@ int ins_typebuf(char_u *str, int noremap, int offset, int nottyped, bool silent)
typebuf.tb_maplen += addlen;
if (silent || typebuf.tb_silent > offset) {
typebuf.tb_silent += addlen;
- cmd_silent = TRUE;
+ cmd_silent = true;
}
if (typebuf.tb_no_abbr_cnt && offset == 0) /* and not used for abbrev.s */
typebuf.tb_no_abbr_cnt += addlen;
@@ -973,7 +980,7 @@ void ins_char_typebuf(int c)
buf[2] = (char_u)K_THIRD(c);
buf[3] = NUL;
} else {
- buf[(*mb_char2bytes)(c, buf)] = NUL;
+ buf[utf_char2bytes(c, buf)] = NUL;
}
(void)ins_typebuf(buf, KeyNoremap, 0, !KeyTyped, cmd_silent);
}
@@ -1078,9 +1085,10 @@ void del_typebuf(int len, int offset)
/* Reset the flag that text received from a client or from feedkeys()
* was inserted in the typeahead buffer. */
- typebuf_was_filled = FALSE;
- if (++typebuf.tb_change_cnt == 0)
+ typebuf_was_filled = false;
+ if (++typebuf.tb_change_cnt == 0) {
typebuf.tb_change_cnt = 1;
+ }
}
/*
@@ -1091,21 +1099,19 @@ static void gotchars(char_u *chars, size_t len)
{
char_u *s = chars;
int c;
- char_u buf[2];
// remember how many chars were last recorded
if (Recording) {
last_recorded_len += len;
}
- buf[1] = NUL;
while (len--) {
// Handle one byte at a time; no translation to be done.
c = *s++;
updatescript(c);
if (Recording) {
- buf[0] = (char_u)c;
+ char buf[2] = { (char)c, NUL };
add_buff(&recordbuff, buf, 1L);
}
}
@@ -1142,7 +1148,7 @@ void alloc_typebuf(void)
typebuf.tb_buf = xmalloc(TYPELEN_INIT);
typebuf.tb_noremap = xmalloc(TYPELEN_INIT);
typebuf.tb_buflen = TYPELEN_INIT;
- typebuf.tb_off = 0;
+ typebuf.tb_off = MAXMAPLEN + 4; // can insert without realloc
typebuf.tb_len = 0;
typebuf.tb_maplen = 0;
typebuf.tb_silent = 0;
@@ -1156,14 +1162,16 @@ void alloc_typebuf(void)
*/
void free_typebuf(void)
{
- if (typebuf.tb_buf == typebuf_init)
- EMSG2(_(e_intern2), "Free typebuf 1");
- else
+ if (typebuf.tb_buf == typebuf_init) {
+ internal_error("Free typebuf 1");
+ } else {
xfree(typebuf.tb_buf);
- if (typebuf.tb_noremap == noremapbuf_init)
- EMSG2(_(e_intern2), "Free typebuf 2");
- else
+ }
+ if (typebuf.tb_noremap == noremapbuf_init) {
+ internal_error("Free typebuf 2");
+ } else {
xfree(typebuf.tb_noremap);
+ }
}
/*
@@ -1244,10 +1252,13 @@ openscript (
++curscript;
/* use NameBuff for expanded name */
expand_env(name, NameBuff, MAXPATHL);
- if ((scriptin[curscript] = mch_fopen((char *)NameBuff, READBIN)) == NULL) {
- EMSG2(_(e_notopen), name);
- if (curscript)
- --curscript;
+ int error;
+ if ((scriptin[curscript] = file_open_new(&error, (char *)NameBuff,
+ kFileReadOnly, 0)) == NULL) {
+ emsgf(_(e_notopen_2), name, os_strerror(error));
+ if (curscript) {
+ curscript--;
+ }
return;
}
save_typebuf();
@@ -1297,7 +1308,7 @@ static void closescript(void)
free_typebuf();
typebuf = saved_typebuf[curscript];
- fclose(scriptin[curscript]);
+ file_free(scriptin[curscript], false);
scriptin[curscript] = NULL;
if (curscript > 0)
--curscript;
@@ -1320,32 +1331,32 @@ int using_script(void)
return scriptin[curscript] != NULL;
}
-/*
- * This function is called just before doing a blocking wait. Thus after
- * waiting 'updatetime' for a character to arrive.
- */
+/// This function is called just before doing a blocking wait. Thus after
+/// waiting 'updatetime' for a character to arrive.
void before_blocking(void)
{
updatescript(0);
- if (may_garbage_collect)
- garbage_collect();
+ if (may_garbage_collect) {
+ garbage_collect(false);
+ }
}
-/*
- * updatescipt() is called when a character can be written into the script file
- * or when we have waited some time for a character (c == 0)
- *
- * All the changed memfiles are synced if c == 0 or when the number of typed
- * characters reaches 'updatecount' and 'updatecount' is non-zero.
- */
-void updatescript(int c)
+/// updatescript() is called when a character can be written to the script file
+/// or when we have waited some time for a character (c == 0).
+///
+/// All the changed memfiles are synced if c == 0 or when the number of typed
+/// characters reaches 'updatecount' and 'updatecount' is non-zero.
+static void updatescript(int c)
{
static int count = 0;
- if (c && scriptout)
+ if (c && scriptout) {
putc(c, scriptout);
- if (c == 0 || (p_uc > 0 && ++count >= p_uc)) {
- ml_sync_all(c == 0, TRUE);
+ }
+ bool idle = (c == 0);
+ if (idle || (p_uc > 0 && ++count >= p_uc)) {
+ ml_sync_all(idle, true,
+ (!!p_fs || idle)); // Always fsync at idle (CursorHold).
count = 0;
}
}
@@ -1366,10 +1377,11 @@ int vgetc(void)
char_u buf[MB_MAXBYTES + 1];
int i;
- /* Do garbage collection when garbagecollect() was called previously and
- * we are now at the toplevel. */
- if (may_garbage_collect && want_garbage_collect)
- garbage_collect();
+ // Do garbage collection when garbagecollect() was called previously and
+ // we are now at the toplevel.
+ if (may_garbage_collect && want_garbage_collect) {
+ garbage_collect(false);
+ }
/*
* If a character was put back with vungetc, it was already processed.
@@ -1387,27 +1399,20 @@ int vgetc(void)
for (;; ) { // this is done twice if there are modifiers
bool did_inc = false;
if (mod_mask) { // no mapping after modifier has been read
- ++no_mapping;
- ++allow_keys;
+ no_mapping++;
did_inc = true; // mod_mask may change value
}
c = vgetorpeek(true);
if (did_inc) {
- --no_mapping;
- --allow_keys;
+ no_mapping--;
}
- /* Get two extra bytes for special keys */
- if (c == K_SPECIAL
- ) {
- int save_allow_keys = allow_keys;
-
- ++no_mapping;
- allow_keys = 0; /* make sure BS is not found */
- c2 = vgetorpeek(TRUE); /* no mapping for these chars */
- c = vgetorpeek(TRUE);
- --no_mapping;
- allow_keys = save_allow_keys;
+ // Get two extra bytes for special keys
+ if (c == K_SPECIAL) {
+ no_mapping++;
+ c2 = vgetorpeek(true); // no mapping for these chars
+ c = vgetorpeek(true);
+ no_mapping--;
if (c2 == KS_MODIFIER) {
mod_mask = c;
continue;
@@ -1485,8 +1490,8 @@ int vgetc(void)
buf[i] = CSI;
}
}
- --no_mapping;
- c = (*mb_ptr2char)(buf);
+ no_mapping--;
+ c = utf_ptr2char(buf);
}
break;
@@ -1535,6 +1540,7 @@ int plain_vgetc(void)
* Check if a character is available, such that vgetc() will not block.
* If the next character is a special character or multi-byte, the returned
* character is not valid!.
+ * Returns NUL if no character is available.
*/
int vpeekc(void)
{
@@ -1568,7 +1574,7 @@ int char_avail(void)
no_mapping++;
retval = vpeekc();
- --no_mapping;
+ no_mapping--;
return retval != NUL;
}
@@ -1583,29 +1589,28 @@ vungetc ( /* unget one character (can only be done once!) */
old_mouse_col = mouse_col;
}
-/*
- * get a character:
- * 1. from the stuffbuffer
- * This is used for abbreviated commands like "D" -> "d$".
- * Also used to redo a command for ".".
- * 2. from the typeahead buffer
- * Stores text obtained previously but not used yet.
- * Also stores the result of mappings.
- * Also used for the ":normal" command.
- * 3. from the user
- * This may do a blocking wait if "advance" is TRUE.
- *
- * if "advance" is TRUE (vgetc()):
- * really get the character.
- * KeyTyped is set to TRUE in the case the user typed the key.
- * KeyStuffed is TRUE if the character comes from the stuff buffer.
- * if "advance" is FALSE (vpeekc()):
- * just look whether there is a character available.
- *
- * When "no_mapping" is zero, checks for mappings in the current mode.
- * Only returns one byte (of a multi-byte character).
- * K_SPECIAL and CSI may be escaped, need to get two more bytes then.
- */
+/// Gets a character:
+/// 1. from the stuffbuffer
+/// This is used for abbreviated commands like "D" -> "d$".
+/// Also used to redo a command for ".".
+/// 2. from the typeahead buffer
+/// Stores text obtained previously but not used yet.
+/// Also stores the result of mappings.
+/// Also used for the ":normal" command.
+/// 3. from the user
+/// This may do a blocking wait if "advance" is TRUE.
+///
+/// if "advance" is TRUE (vgetc()):
+/// Really get the character.
+/// KeyTyped is set to TRUE in the case the user typed the key.
+/// KeyStuffed is TRUE if the character comes from the stuff buffer.
+/// if "advance" is FALSE (vpeekc()):
+/// Just look whether there is a character available.
+/// Return NUL if not.
+///
+/// When `no_mapping` (global) is zero, checks for mappings in the current mode.
+/// Only returns one byte (of a multi-byte character).
+/// K_SPECIAL and CSI may be escaped, need to get two more bytes then.
static int vgetorpeek(int advance)
{
int c, c1;
@@ -1669,10 +1674,10 @@ static int vgetorpeek(int advance)
}
if (c != NUL && !got_int) {
if (advance) {
- /* KeyTyped = FALSE; When the command that stuffed something
- * was typed, behave like the stuffed command was typed.
- * needed for CTRL-W CTRl-] to open a fold, for example. */
- KeyStuffed = TRUE;
+ // KeyTyped = false; When the command that stuffed something
+ // was typed, behave like the stuffed command was typed.
+ // needed for CTRL-W CTRL-] to open a fold, for example.
+ KeyStuffed = true;
}
if (typebuf.tb_no_abbr_cnt == 0)
typebuf.tb_no_abbr_cnt = 1; /* no abbreviations now */
@@ -1695,22 +1700,20 @@ static int vgetorpeek(int advance)
os_breakcheck(); /* check for CTRL-C */
keylen = 0;
if (got_int) {
- /* flush all input */
- c = inchar(typebuf.tb_buf, typebuf.tb_buflen - 1, 0L,
- typebuf.tb_change_cnt);
- /*
- * If inchar() returns TRUE (script file was active) or we
- * are inside a mapping, get out of insert mode.
- * Otherwise we behave like having gotten a CTRL-C.
- * As a result typing CTRL-C in insert mode will
- * really insert a CTRL-C.
- */
+ // flush all input
+ c = inchar(typebuf.tb_buf, typebuf.tb_buflen - 1, 0L);
+ // If inchar() returns TRUE (script file was active) or we
+ // are inside a mapping, get out of insert mode.
+ // Otherwise we behave like having gotten a CTRL-C.
+ // As a result typing CTRL-C in insert mode will
+ // really insert a CTRL-C.
if ((c || typebuf.tb_maplen)
- && (State & (INSERT + CMDLINE)))
+ && (State & (INSERT + CMDLINE))) {
c = ESC;
- else
+ } else {
c = Ctrl_C;
- flush_buffers(TRUE); /* flush all typeahead */
+ }
+ flush_buffers(FLUSH_INPUT); // flush all typeahead
if (advance) {
/* Also record this character, it might be needed to
@@ -1718,7 +1721,7 @@ static int vgetorpeek(int advance)
*typebuf.tb_buf = (char_u)c;
gotchars(typebuf.tb_buf, 1);
}
- cmd_silent = FALSE;
+ cmd_silent = false;
break;
} else if (typebuf.tb_len > 0) {
@@ -1810,7 +1813,7 @@ static int vgetorpeek(int advance)
* <M-a> and then changing 'encoding'. Beware
* that 0x80 is escaped. */
char_u *p1 = mp->m_keys;
- char_u *p2 = mb_unescape(&p1);
+ char_u *p2 = (char_u *)mb_unescape((const char **)&p1);
if (has_mbyte && p2 != NULL && MB_BYTE2LEN(c1) > MB_PTR2LEN(p2))
mlen = 0;
@@ -1852,16 +1855,21 @@ static int vgetorpeek(int advance)
keylen = KEYLEN_PART_MAP;
break;
}
- } else if (keylen > mp_match_len) {
- /* found a longer match */
+ } else if (keylen > mp_match_len
+ || (keylen == mp_match_len
+ && mp_match != NULL
+ && (mp_match->m_mode & LANGMAP) == 0
+ && (mp->m_mode & LANGMAP) != 0)) {
+ // found a longer match
mp_match = mp;
mp_match_len = keylen;
}
- } else
- /* No match; may have to check for
- * termcode at next character. */
- if (max_mlen < mlen)
- max_mlen = mlen;
+ } else {
+ // No match; may have to check for termcode at next character.
+ if (max_mlen < mlen) {
+ max_mlen = mlen;
+ }
+ }
}
}
@@ -1888,9 +1896,8 @@ static int vgetorpeek(int advance)
(size_t)(mlen - typebuf.tb_maplen));
}
- del_typebuf(mlen, 0); /* remove the chars */
- set_option_value((char_u *)"paste",
- (long)!p_paste, NULL, 0);
+ del_typebuf(mlen, 0); // Remove the chars.
+ set_option_value("paste", !p_paste, NULL, 0);
if (!(State & INSERT)) {
msg_col = 0;
msg_row = (int)Rows - 1;
@@ -1913,63 +1920,30 @@ static int vgetorpeek(int advance)
if ((mp == NULL || max_mlen >= mp_match_len)
&& keylen != KEYLEN_PART_MAP) {
- /*
- * When no matching mapping found or found a
- * non-matching mapping that matches at least what the
- * matching mapping matched:
- * Check if we have a terminal code, when:
- * mapping is allowed,
- * keys have not been mapped,
- * and not an ESC sequence, not in insert mode or
- * p_ek is on,
- * and when not timed out,
- */
- if ((no_mapping == 0 || allow_keys != 0)
- && (typebuf.tb_maplen == 0
- || (p_remap && typebuf.tb_noremap[
- typebuf.tb_off] == RM_YES))
- && !timedout) {
- keylen = 0;
- } else
- keylen = 0;
- if (keylen == 0) { /* no matching terminal code */
- /* When there was a matching mapping and no
- * termcode could be replaced after another one,
- * use that mapping (loop around). If there was
- * no mapping use the character from the
- * typeahead buffer right here. */
- if (mp == NULL) {
- /*
- * get a character: 2. from the typeahead buffer
- */
- c = typebuf.tb_buf[typebuf.tb_off] & 255;
- if (advance) { /* remove chars from tb_buf */
- cmd_silent = (typebuf.tb_silent > 0);
- if (typebuf.tb_maplen > 0)
- KeyTyped = FALSE;
- else {
- KeyTyped = TRUE;
- /* write char to script file(s) */
- gotchars(typebuf.tb_buf
- + typebuf.tb_off, 1);
- }
- KeyNoremap = typebuf.tb_noremap[
- typebuf.tb_off];
- del_typebuf(1, 0);
+ // No matching mapping found or found a non-matching mapping that
+ // matches at least what the matching mapping matched
+ keylen = 0;
+ // If there was no mapping, use the character from the typeahead
+ // buffer right here. Otherwise, use the mapping (loop around).
+ if (mp == NULL) {
+ // get a character: 2. from the typeahead buffer
+ c = typebuf.tb_buf[typebuf.tb_off] & 255;
+ if (advance) { // remove chars from tb_buf
+ cmd_silent = (typebuf.tb_silent > 0);
+ if (typebuf.tb_maplen > 0) {
+ KeyTyped = false;
+ } else {
+ KeyTyped = true;
+ // write char to script file(s)
+ gotchars(typebuf.tb_buf + typebuf.tb_off, 1);
}
- break; /* got character, break for loop */
+ KeyNoremap = typebuf.tb_noremap[typebuf.tb_off];
+ del_typebuf(1, 0);
}
- }
- if (keylen > 0) { /* full matching terminal code */
- continue; /* try mapping again */
- }
-
- /* Partial match: get some more characters. When a
- * matching mapping was found use that one. */
- if (mp == NULL || keylen < 0)
- keylen = KEYLEN_PART_KEY;
- else
+ break; // got character, break for loop
+ } else {
keylen = mp_match_len;
+ }
}
/* complete match */
@@ -1980,8 +1954,9 @@ static int vgetorpeek(int advance)
char_u *save_m_keys;
char_u *save_m_str;
- // write chars to script file(s)
- if (keylen > typebuf.tb_maplen) {
+ // Write chars to script file(s)
+ // Note: :lmap mappings are written *after* being applied. #5658
+ if (keylen > typebuf.tb_maplen && (mp->m_mode & LANGMAP) == 0) {
gotchars(typebuf.tb_buf + typebuf.tb_off + typebuf.tb_maplen,
(size_t)(keylen - typebuf.tb_maplen));
}
@@ -1999,8 +1974,8 @@ static int vgetorpeek(int advance)
redrawcmdline();
else
setcursor();
- flush_buffers(FALSE);
- mapdepth = 0; /* for next one */
+ flush_buffers(FLUSH_MINIMAL);
+ mapdepth = 0; // for next one
c = -1;
break;
}
@@ -2056,6 +2031,12 @@ static int vgetorpeek(int advance)
else {
int noremap;
+ // If this is a LANGMAP mapping, then we didn't record the keys
+ // at the start of the function and have to record them now.
+ if (keylen > typebuf.tb_maplen && (mp->m_mode & LANGMAP) != 0) {
+ gotchars(s, STRLEN(s));
+ }
+
if (save_m_noremap != REMAP_YES)
noremap = save_m_noremap;
else if (
@@ -2095,18 +2076,17 @@ static int vgetorpeek(int advance)
c = 0;
new_wcol = curwin->w_wcol;
new_wrow = curwin->w_wrow;
- if ( advance
- && typebuf.tb_len == 1
- && typebuf.tb_buf[typebuf.tb_off] == ESC
- && !no_mapping
- && ex_normal_busy == 0
- && typebuf.tb_maplen == 0
- && (State & INSERT)
- && (p_timeout
- || (keylen == KEYLEN_PART_KEY && p_ttimeout))
- && (c = inchar(typebuf.tb_buf + typebuf.tb_off
- + typebuf.tb_len, 3, 25L,
- typebuf.tb_change_cnt)) == 0) {
+ if (advance
+ && typebuf.tb_len == 1
+ && typebuf.tb_buf[typebuf.tb_off] == ESC
+ && !no_mapping
+ && ex_normal_busy == 0
+ && typebuf.tb_maplen == 0
+ && (State & INSERT)
+ && (p_timeout
+ || (keylen == KEYLEN_PART_KEY && p_ttimeout))
+ && (c = inchar(typebuf.tb_buf + typebuf.tb_off + typebuf.tb_len,
+ 3, 25L)) == 0) {
colnr_T col = 0, vcol;
char_u *ptr;
@@ -2140,8 +2120,8 @@ static int vgetorpeek(int advance)
++col;
}
curwin->w_wrow = curwin->w_cline_row
- + curwin->w_wcol / curwin->w_width;
- curwin->w_wcol %= curwin->w_width;
+ + curwin->w_wcol / curwin->w_grid.Columns;
+ curwin->w_wcol %= curwin->w_grid.Columns;
curwin->w_wcol += curwin_col_off();
col = 0; /* no correction needed */
} else {
@@ -2149,17 +2129,18 @@ static int vgetorpeek(int advance)
col = curwin->w_cursor.col - 1;
}
} else if (curwin->w_p_wrap && curwin->w_wrow) {
- --curwin->w_wrow;
- curwin->w_wcol = curwin->w_width - 1;
+ curwin->w_wrow--;
+ curwin->w_wcol = curwin->w_grid.Columns - 1;
col = curwin->w_cursor.col - 1;
}
- if (has_mbyte && col > 0 && curwin->w_wcol > 0) {
- /* Correct when the cursor is on the right halve
- * of a double-wide character. */
+ if (col > 0 && curwin->w_wcol > 0) {
+ // Correct when the cursor is on the right halve
+ // of a double-wide character.
ptr = get_cursor_line_ptr();
- col -= (*mb_head_off)(ptr, ptr + col);
- if ((*mb_ptr2cells)(ptr + col) > 1)
- --curwin->w_wcol;
+ col -= utf_head_off(ptr, ptr + col);
+ if (utf_ptr2cells(ptr + col) > 1) {
+ curwin->w_wcol--;
+ }
}
}
setcursor();
@@ -2277,6 +2258,11 @@ static int vgetorpeek(int advance)
/*
* get a character: 3. from the user - get it
*/
+ if (typebuf.tb_len == 0) {
+ // timedout may have been set while waiting for a mapping
+ // that has a <Nop> RHS.
+ timedout = false;
+ }
wait_tb_len = typebuf.tb_len;
c = inchar(typebuf.tb_buf + typebuf.tb_off + typebuf.tb_len,
typebuf.tb_buflen - typebuf.tb_off - typebuf.tb_len - 1,
@@ -2288,7 +2274,7 @@ static int vgetorpeek(int advance)
? -1L
: ((keylen == KEYLEN_PART_KEY && p_ttm >= 0)
? p_ttm
- : p_tm)), typebuf.tb_change_cnt);
+ : p_tm)));
if (i != 0)
pop_showcmd();
@@ -2369,17 +2355,15 @@ static int vgetorpeek(int advance)
* Return the number of obtained characters.
* Return -1 when end of input script reached.
*/
-int
-inchar (
+int inchar(
char_u *buf,
int maxlen,
- long wait_time, /* milli seconds */
- int tb_change_cnt
+ long wait_time // milli seconds
)
{
- int len = 0; /* init for GCC */
- int retesc = FALSE; /* return ESC with gotint */
- int script_char;
+ int len = 0; // Init for GCC.
+ int retesc = false; // Return ESC with gotint.
+ const int tb_change_cnt = typebuf.tb_change_cnt;
if (wait_time == -1L || wait_time > 100L) {
// flush output before waiting
@@ -2397,45 +2381,38 @@ inchar (
}
undo_off = FALSE; /* restart undo now */
- /*
- * Get a character from a script file if there is one.
- * If interrupted: Stop reading script files, close them all.
- */
- script_char = -1;
- while (scriptin[curscript] != NULL && script_char < 0
- && !ignore_script
- ) {
-
-
- if (got_int || (script_char = getc(scriptin[curscript])) < 0) {
- /* Reached EOF.
- * Careful: closescript() frees typebuf.tb_buf[] and buf[] may
- * point inside typebuf.tb_buf[]. Don't use buf[] after this! */
+ // Get a character from a script file if there is one.
+ // If interrupted: Stop reading script files, close them all.
+ ptrdiff_t read_size = -1;
+ while (scriptin[curscript] != NULL && read_size <= 0 && !ignore_script) {
+ char script_char;
+ if (got_int
+ || (read_size = file_read(scriptin[curscript], &script_char, 1)) != 1) {
+ // Reached EOF or some error occurred.
+ // Careful: closescript() frees typebuf.tb_buf[] and buf[] may
+ // point inside typebuf.tb_buf[]. Don't use buf[] after this!
closescript();
- /*
- * When reading script file is interrupted, return an ESC to get
- * back to normal mode.
- * Otherwise return -1, because typebuf.tb_buf[] has changed.
- */
- if (got_int)
- retesc = TRUE;
- else
+ // When reading script file is interrupted, return an ESC to get
+ // back to normal mode.
+ // Otherwise return -1, because typebuf.tb_buf[] has changed.
+ if (got_int) {
+ retesc = true;
+ } else {
return -1;
+ }
} else {
buf[0] = (char_u)script_char;
len = 1;
}
}
- if (script_char < 0) { /* did not get a character from script */
- /*
- * If we got an interrupt, skip all previously typed characters and
- * return TRUE if quit reading script file.
- * Stop reading typeahead when a single CTRL-C was read,
- * fill_input_buf() returns this when not able to read from stdin.
- * Don't use buf[] here, closescript() may have freed typebuf.tb_buf[]
- * and buf may be pointing inside typebuf.tb_buf[].
- */
+ if (read_size <= 0) { // Did not get a character from script.
+ // If we got an interrupt, skip all previously typed characters and
+ // return TRUE if quit reading script file.
+ // Stop reading typeahead when a single CTRL-C was read,
+ // fill_input_buf() returns this when not able to read from stdin.
+ // Don't use buf[] here, closescript() may have freed typebuf.tb_buf[]
+ // and buf may be pointing inside typebuf.tb_buf[].
if (got_int) {
#define DUM_LEN MAXMAPLEN * 3 + 3
char_u dum[DUM_LEN + 1];
@@ -2448,23 +2425,29 @@ inchar (
return retesc;
}
- /*
- * Always flush the output characters when getting input characters
- * from the user.
- */
+ // Always flush the output characters when getting input characters
+ // from the user.
ui_flush();
- /*
- * Fill up to a third of the buffer, because each character may be
- * tripled below.
- */
+ // Fill up to a third of the buffer, because each character may be
+ // tripled below.
len = os_inchar(buf, maxlen / 3, (int)wait_time, tb_change_cnt);
}
- if (typebuf_changed(tb_change_cnt))
+ // If the typebuf was changed further down, it is like nothing was added by
+ // this call.
+ if (typebuf_changed(tb_change_cnt)) {
return 0;
+ }
- return fix_input_buffer(buf, len, script_char >= 0);
+ // Note the change in the typeahead buffer, this matters for when
+ // vgetorpeek() is called recursively, e.g. using getchar(1) in a timer
+ // function.
+ if (len > 0 && ++typebuf.tb_change_cnt == 0) {
+ typebuf.tb_change_cnt = 1;
+ }
+
+ return fix_input_buffer(buf, len);
}
/*
@@ -2472,12 +2455,7 @@ inchar (
* buf[] must have room to triple the number of bytes!
* Returns the new length.
*/
-int
-fix_input_buffer (
- char_u *buf,
- int len,
- int script /* TRUE when reading from a script */
-)
+int fix_input_buffer(char_u *buf, int len)
{
if (!using_script()) {
// Should not escape K_SPECIAL/CSI reading input from the user because vim
@@ -2494,12 +2472,10 @@ fix_input_buffer (
// Replace NUL by K_SPECIAL KS_ZERO KE_FILLER
// Replace K_SPECIAL by K_SPECIAL KS_SPECIAL KE_FILLER
// Replace CSI by K_SPECIAL KS_EXTRA KE_CSI
- // Don't replace K_SPECIAL when reading a script file.
for (i = len; --i >= 0; ++p) {
if (p[0] == NUL
|| (p[0] == K_SPECIAL
- && !script
- && (i < 2 || p[1] != KS_EXTRA))) {
+ && (i < 2 || p[1] != KS_EXTRA))) {
memmove(p + 3, p + 1, (size_t)i);
p[2] = (char_u)K_THIRD(p[0]);
p[1] = (char_u)K_SECOND(p[0]);
@@ -2581,7 +2557,6 @@ do_map (
bool unique = false;
bool nowait = false;
bool silent = false;
- bool special = false;
bool expr = false;
int noremap;
char_u *orig_rhs;
@@ -2627,12 +2602,9 @@ do_map (
continue;
}
- /*
- * Check for "<special>": accept special keys in <>
- */
+ // Ignore obsolete "<special>" modifier.
if (STRNCMP(keys, "<special>", 9) == 0) {
keys = skipwhite(keys + 9);
- special = true;
continue;
}
@@ -2701,7 +2673,7 @@ do_map (
// needs to be freed later (*keys_buf and *arg_buf).
// replace_termcodes() also removes CTRL-Vs and sometimes backslashes.
if (haskey) {
- keys = replace_termcodes(keys, STRLEN(keys), &keys_buf, true, true, special,
+ keys = replace_termcodes(keys, STRLEN(keys), &keys_buf, true, true, true,
CPO_TO_CPO_FLAGS);
}
orig_rhs = rhs;
@@ -2709,7 +2681,7 @@ do_map (
if (STRICMP(rhs, "<nop>") == 0) { // "<Nop>" means nothing
rhs = (char_u *)"";
} else {
- rhs = replace_termcodes(rhs, STRLEN(rhs), &arg_buf, false, true, special,
+ rhs = replace_termcodes(rhs, STRLEN(rhs), &arg_buf, false, true, true,
CPO_TO_CPO_FLAGS);
}
}
@@ -3165,11 +3137,11 @@ map_clear_int (
}
}
-/*
- * Return characters to represent the map mode in an allocated string.
- * Returns NULL when out of memory.
- */
-char_u *map_mode_to_chars(int mode)
+/// Return characters to represent the map mode in an allocated string
+///
+/// @return [allocated] NUL-terminated string with characters.
+char *map_mode_to_chars(int mode)
+ FUNC_ATTR_MALLOC FUNC_ATTR_NONNULL_RET
{
garray_T mapmode;
@@ -3202,7 +3174,7 @@ char_u *map_mode_to_chars(int mode)
}
ga_append(&mapmode, NUL);
- return (char_u *)mapmode.ga_data;
+ return (char *)mapmode.ga_data;
}
static void
@@ -3211,8 +3183,11 @@ showmap (
int local /* TRUE for buffer-local map */
)
{
- int len = 1;
- char_u *mapchars;
+ size_t len = 1;
+
+ if (message_filtered(mp->m_keys) && message_filtered(mp->m_str)) {
+ return;
+ }
if (msg_didout || msg_silent != 0) {
msg_putchar('\n');
@@ -3220,29 +3195,30 @@ showmap (
return;
}
- mapchars = map_mode_to_chars(mp->m_mode);
- if (mapchars != NULL) {
+ {
+ char *const mapchars = map_mode_to_chars(mp->m_mode);
msg_puts(mapchars);
- len = (int)STRLEN(mapchars);
+ len = strlen(mapchars);
xfree(mapchars);
}
while (++len <= 3)
msg_putchar(' ');
- /* Display the LHS. Get length of what we write. */
- len = msg_outtrans_special(mp->m_keys, TRUE);
+ // Display the LHS. Get length of what we write.
+ len = (size_t)msg_outtrans_special(mp->m_keys, true);
do {
msg_putchar(' '); /* padd with blanks */
++len;
} while (len < 12);
- if (mp->m_noremap == REMAP_NONE)
- msg_puts_attr((char_u *)"*", hl_attr(HLF_8));
- else if (mp->m_noremap == REMAP_SCRIPT)
- msg_puts_attr((char_u *)"&", hl_attr(HLF_8));
- else
+ if (mp->m_noremap == REMAP_NONE) {
+ msg_puts_attr("*", HL_ATTR(HLF_8));
+ } else if (mp->m_noremap == REMAP_SCRIPT) {
+ msg_puts_attr("&", HL_ATTR(HLF_8));
+ } else {
msg_putchar(' ');
+ }
if (local)
msg_putchar('@');
@@ -3251,11 +3227,11 @@ showmap (
/* Use FALSE below if we only want things like <Up> to show up as such on
* the rhs, and not M-x etc, TRUE gets both -- webb */
- if (*mp->m_str == NUL)
- msg_puts_attr((char_u *)"<Nop>", hl_attr(HLF_8));
- else {
- /* Remove escaping of CSI, because "m_str" is in a format to be used
- * as typeahead. */
+ if (*mp->m_str == NUL) {
+ msg_puts_attr("<Nop>", HL_ATTR(HLF_8));
+ } else {
+ // Remove escaping of CSI, because "m_str" is in a format to be used
+ // as typeahead.
char_u *s = vim_strsave(mp->m_str);
vim_unescape_csi(s);
msg_outtrans_special(s, FALSE);
@@ -3266,82 +3242,99 @@ showmap (
ui_flush(); /* show one line at a time */
}
-/*
- * Return TRUE if a map exists that has "str" in the rhs for mode "modechars".
- * Recognize termcap codes in "str".
- * Also checks mappings local to the current buffer.
- */
-int map_to_exists(char_u *str, char_u *modechars, int abbr)
+/// Check if a map exists that has given string in the rhs
+///
+/// Also checks mappings local to the current buffer.
+///
+/// @param[in] str String which mapping must have in the rhs. Termcap codes
+/// are recognized in this argument.
+/// @param[in] modechars Mode(s) in which mappings are checked.
+/// @param[in] abbr true if checking abbreviations in place of mappings.
+///
+/// @return true if there is at least one mapping with given parameters.
+bool map_to_exists(const char *const str, const char *const modechars,
+ const bool abbr)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_PURE
{
int mode = 0;
- char_u *rhs;
- char_u *buf;
int retval;
- rhs = replace_termcodes(str, STRLEN(str), &buf, false, true, false,
- CPO_TO_CPO_FLAGS);
-
- if (vim_strchr(modechars, 'n') != NULL)
- mode |= NORMAL;
- if (vim_strchr(modechars, 'v') != NULL)
- mode |= VISUAL + SELECTMODE;
- if (vim_strchr(modechars, 'x') != NULL)
- mode |= VISUAL;
- if (vim_strchr(modechars, 's') != NULL)
- mode |= SELECTMODE;
- if (vim_strchr(modechars, 'o') != NULL)
- mode |= OP_PENDING;
- if (vim_strchr(modechars, 'i') != NULL)
- mode |= INSERT;
- if (vim_strchr(modechars, 'l') != NULL)
- mode |= LANGMAP;
- if (vim_strchr(modechars, 'c') != NULL)
- mode |= CMDLINE;
-
- retval = map_to_exists_mode(rhs, mode, abbr);
+ char_u *buf;
+ char_u *const rhs = replace_termcodes((const char_u *)str, strlen(str), &buf,
+ false, true, true,
+ CPO_TO_CPO_FLAGS);
+
+#define MAPMODE(mode, modechars, chr, modeflags) \
+ do { \
+ if (strchr(modechars, chr) != NULL) { \
+ mode |= modeflags; \
+ } \
+ } while (0)
+ MAPMODE(mode, modechars, 'n', NORMAL);
+ MAPMODE(mode, modechars, 'v', VISUAL|SELECTMODE);
+ MAPMODE(mode, modechars, 'x', VISUAL);
+ MAPMODE(mode, modechars, 's', SELECTMODE);
+ MAPMODE(mode, modechars, 'o', OP_PENDING);
+ MAPMODE(mode, modechars, 'i', INSERT);
+ MAPMODE(mode, modechars, 'l', LANGMAP);
+ MAPMODE(mode, modechars, 'c', CMDLINE);
+#undef MAPMODE
+
+ retval = map_to_exists_mode((const char *)rhs, mode, abbr);
xfree(buf);
return retval;
}
-/*
- * Return TRUE if a map exists that has "str" in the rhs for mode "mode".
- * Also checks mappings local to the current buffer.
- */
-int map_to_exists_mode(char_u *rhs, int mode, int abbr)
+/// Check if a map exists that has given string in the rhs
+///
+/// Also checks mappings local to the current buffer.
+///
+/// @param[in] rhs String which mapping must have in the rhs. Termcap codes
+/// are recognized in this argument.
+/// @param[in] mode Mode(s) in which mappings are checked.
+/// @param[in] abbr true if checking abbreviations in place of mappings.
+///
+/// @return true if there is at least one mapping with given parameters.
+int map_to_exists_mode(const char *const rhs, const int mode, const bool abbr)
{
mapblock_T *mp;
int hash;
- int expand_buffer = FALSE;
+ bool expand_buffer = false;
validate_maphash();
- /* Do it twice: once for global maps and once for local maps. */
- for (;; ) {
- for (hash = 0; hash < 256; ++hash) {
+ // Do it twice: once for global maps and once for local maps.
+ for (;;) {
+ for (hash = 0; hash < 256; hash++) {
if (abbr) {
- if (hash > 0) /* there is only one abbr list */
+ if (hash > 0) { // There is only one abbr list.
break;
- if (expand_buffer)
+ }
+ if (expand_buffer) {
mp = curbuf->b_first_abbr;
- else
+ } else {
mp = first_abbr;
- } else if (expand_buffer)
+ }
+ } else if (expand_buffer) {
mp = curbuf->b_maphash[hash];
- else
+ } else {
mp = maphash[hash];
+ }
for (; mp; mp = mp->m_next) {
if ((mp->m_mode & mode)
- && strstr((char *)mp->m_str, (char *)rhs) != NULL)
- return TRUE;
+ && strstr((char *)mp->m_str, rhs) != NULL) {
+ return true;
+ }
}
}
- if (expand_buffer)
+ if (expand_buffer) {
break;
- expand_buffer = TRUE;
+ }
+ expand_buffer = true;
}
- return FALSE;
+ return false;
}
/*
@@ -3397,6 +3390,10 @@ set_context_in_map_cmd (
arg = skipwhite(arg + 8);
continue;
}
+ if (STRNCMP(arg, "<special>", 9) == 0) {
+ arg = skipwhite(arg + 9);
+ continue;
+ }
if (STRNCMP(arg, "<script>", 8) == 0) {
arg = skipwhite(arg + 8);
continue;
@@ -3439,21 +3436,24 @@ int ExpandMappings(regmatch_T *regmatch, int *num_file, char_u ***file)
for (round = 1; round <= 2; ++round) {
count = 0;
- for (i = 0; i < 6; ++i) {
- if (i == 0)
+ for (i = 0; i < 7; i++) {
+ if (i == 0) {
p = (char_u *)"<silent>";
- else if (i == 1)
+ } else if (i == 1) {
p = (char_u *)"<unique>";
- else if (i == 2)
+ } else if (i == 2) {
p = (char_u *)"<script>";
- else if (i == 3)
+ } else if (i == 3) {
p = (char_u *)"<expr>";
- else if (i == 4 && !expand_buffer)
+ } else if (i == 4 && !expand_buffer) {
p = (char_u *)"<buffer>";
- else if (i == 5)
+ } else if (i == 5) {
p = (char_u *)"<nowait>";
- else
+ } else if (i == 6) {
+ p = (char_u *)"<special>";
+ } else {
continue;
+ }
if (vim_regexec(regmatch, p, (colnr_T)0)) {
if (round == 1)
@@ -3620,8 +3620,8 @@ int check_abbr(int c, char_u *ptr, int col, int mincol)
char_u *q = mp->m_keys;
int match;
- if (vim_strbyte(mp->m_keys, K_SPECIAL) != NULL) {
- /* might have CSI escaped mp->m_keys */
+ if (strchr((const char *)mp->m_keys, K_SPECIAL) != NULL) {
+ // Might have CSI escaped mp->m_keys.
q = vim_strsave(mp->m_keys);
vim_unescape_csi(q);
qlen = (int)STRLEN(q);
@@ -3659,16 +3659,14 @@ int check_abbr(int c, char_u *ptr, int col, int mincol)
tb[j++] = (char_u)K_SECOND(c);
tb[j++] = (char_u)K_THIRD(c);
} else {
- if (c < ABBR_OFF && (c < ' ' || c > '~'))
- tb[j++] = Ctrl_V; /* special char needs CTRL-V */
- if (has_mbyte) {
- /* if ABBR_OFF has been added, remove it here */
- if (c >= ABBR_OFF)
- c -= ABBR_OFF;
- j += (*mb_char2bytes)(c, tb + j);
- } else {
- tb[j++] = (char_u)c;
+ if (c < ABBR_OFF && (c < ' ' || c > '~')) {
+ tb[j++] = Ctrl_V; // special char needs CTRL-V
}
+ // if ABBR_OFF has been added, remove it here.
+ if (c >= ABBR_OFF) {
+ c -= ABBR_OFF;
+ }
+ j += utf_char2bytes(c, tb + j);
}
tb[j] = NUL;
/* insert the last typed char */
@@ -3757,8 +3755,10 @@ eval_map_expr (
*/
char_u *vim_strsave_escape_csi(char_u *p)
{
- /* Need a buffer to hold up to three times as much. */
- char_u *res = xmalloc(STRLEN(p) * 3 + 1);
+ // Need a buffer to hold up to three times as much. Four in case of an
+ // illegal utf-8 byte:
+ // 0xc0 -> 0xc3 - 0x80 -> 0xc3 K_SPECIAL KS_SPECIAL KE_FILLER
+ char_u *res = xmalloc(STRLEN(p) * 4 + 1);
char_u *d = res;
for (char_u *s = p; *s != NUL; ) {
if (s[0] == K_SPECIAL && s[1] != NUL && s[2] != NUL) {
@@ -3767,17 +3767,10 @@ char_u *vim_strsave_escape_csi(char_u *p)
*d++ = *s++;
*d++ = *s++;
} else {
- int len = mb_char2len(PTR2CHAR(s));
- int len2 = mb_ptr2len(s);
- /* Add character, possibly multi-byte to destination, escaping
- * CSI and K_SPECIAL. */
+ // Add character, possibly multi-byte to destination, escaping
+ // CSI and K_SPECIAL. Be careful, it can be an illegal byte!
d = add_char2buf(PTR2CHAR(s), d);
- while (len < len2) {
- /* add following combining char */
- d = add_char2buf(PTR2CHAR(s + len), d);
- len += mb_char2len(PTR2CHAR(s + len));
- }
- mb_ptr_adv(s);
+ s += MB_CPTR2LEN(s);
}
}
*d = NUL;
@@ -3823,8 +3816,7 @@ makemap (
char *cmd;
int abbr;
int hash;
- int did_cpo = FALSE;
- int i;
+ bool did_cpo = false;
validate_maphash();
@@ -3945,20 +3937,22 @@ makemap (
c1 = 't';
break;
default:
- EMSG(_("E228: makemap: Illegal mode"));
+ IEMSG(_("E228: makemap: Illegal mode"));
return FAIL;
}
do { /* do this twice if c2 is set, 3 times with c3 */
/* When outputting <> form, need to make sure that 'cpo'
* is set to the Vim default. */
if (!did_cpo) {
- if (*mp->m_str == NUL) /* will use <Nop> */
- did_cpo = TRUE;
- else
- for (i = 0; i < 2; ++i)
- for (p = (i ? mp->m_str : mp->m_keys); *p; ++p)
- if (*p == K_SPECIAL || *p == NL)
- did_cpo = TRUE;
+ if (*mp->m_str == NUL) { // Will use <Nop>.
+ did_cpo = true;
+ } else {
+ const char specials[] = { (char)(uint8_t)K_SPECIAL, NL, NUL };
+ if (strpbrk((const char *)mp->m_str, specials) != NULL
+ || strpbrk((const char *)mp->m_keys, specials) != NULL) {
+ did_cpo = true;
+ }
+ }
if (did_cpo) {
if (fprintf(fd, "let s:cpo_save=&cpo") < 0
|| put_eol(fd) < 0
@@ -4026,12 +4020,10 @@ int put_escstr(FILE *fd, char_u *strstart, int what)
return OK;
}
- for (; *str != NUL; ++str) {
- char_u *p;
-
- /* Check for a multi-byte character, which may contain escaped
- * K_SPECIAL and CSI bytes */
- p = mb_unescape(&str);
+ for (; *str != NUL; str++) {
+ // Check for a multi-byte character, which may contain escaped
+ // K_SPECIAL and CSI bytes.
+ const char *p = mb_unescape((const char **)&str);
if (p != NULL) {
while (*p != NUL)
if (fputc(*p++, fd) < 0)
@@ -4187,8 +4179,7 @@ void add_map(char_u *map, int mode)
}
// Translate an internal mapping/abbreviation representation into the
-// corresponding external one recognized by :map/:abbrev commands;
-// respects the current B/k/< settings of 'cpoption'.
+// corresponding external one recognized by :map/:abbrev commands.
//
// This function is called when expanding mappings/abbreviations on the
// command-line, and for building the "Ambiguous mapping..." error message.
@@ -4208,7 +4199,6 @@ static char_u * translate_mapping (
ga_init(&ga, 1, 40);
bool cpo_bslash = !(cpo_flags&FLAG_CPO_BSLASH);
- bool cpo_special = !(cpo_flags&FLAG_CPO_SPECI);
for (; *str; ++str) {
int c = *str;
@@ -4221,7 +4211,7 @@ static char_u * translate_mapping (
}
if (c == K_SPECIAL && str[1] != NUL && str[2] != NUL) {
- if (expmap && cpo_special) {
+ if (expmap) {
ga_clear(&ga);
return NULL;
}
@@ -4232,8 +4222,8 @@ static char_u * translate_mapping (
}
str += 2;
}
- if (IS_SPECIAL(c) || modifiers) { /* special key */
- if (expmap && cpo_special) {
+ if (IS_SPECIAL(c) || modifiers) { // special key
+ if (expmap) {
ga_clear(&ga);
return NULL;
}
@@ -4243,7 +4233,7 @@ static char_u * translate_mapping (
}
if (c == ' ' || c == '\t' || c == Ctrl_J || c == Ctrl_V
- || (c == '<' && !cpo_special) || (c == '\\' && !cpo_bslash)) {
+ || (c == '\\' && !cpo_bslash)) {
ga_append(&ga, cpo_bslash ? Ctrl_V : '\\');
}
@@ -4265,3 +4255,90 @@ static bool typebuf_match_len(const uint8_t *str, int *mlen)
*mlen = i;
return str[i] == NUL; // matched the whole string
}
+
+/// Retrieve the mapblock at the index either globally or for a certain buffer
+///
+/// @param index The index in the maphash[]
+/// @param buf The buffer to get the maphash from. NULL for global
+mapblock_T *get_maphash(int index, buf_T *buf)
+ FUNC_ATTR_PURE
+{
+ if (index >= MAX_MAPHASH) {
+ return NULL;
+ }
+
+ return (buf == NULL) ? maphash[index] : buf->b_maphash[index];
+}
+
+/// Get command argument for <Cmd> key
+char_u * getcmdkeycmd(int promptc, void *cookie, int indent)
+{
+ garray_T line_ga;
+ int c1 = -1, c2;
+ int cmod = 0;
+ bool aborted = false;
+
+ ga_init(&line_ga, 1, 32);
+
+ no_mapping++;
+
+ got_int = false;
+ while (c1 != NUL && !aborted) {
+ ga_grow(&line_ga, 32);
+
+ if (vgetorpeek(false) == NUL) {
+ // incomplete <Cmd> is an error, because there is not much the user
+ // could do in this state.
+ EMSG(e_cmdmap_err);
+ aborted = true;
+ break;
+ }
+
+ // Get one character at a time.
+ c1 = vgetorpeek(true);
+ // Get two extra bytes for special keys
+ if (c1 == K_SPECIAL) {
+ c1 = vgetorpeek(true); // no mapping for these chars
+ c2 = vgetorpeek(true);
+ if (c1 == KS_MODIFIER) {
+ cmod = c2;
+ continue;
+ }
+ c1 = TO_SPECIAL(c1, c2);
+ }
+
+
+ if (got_int) {
+ aborted = true;
+ } else if (c1 == '\r' || c1 == '\n') {
+ c1 = NUL; // end the line
+ } else if (c1 == ESC) {
+ aborted = true;
+ } else if (c1 == K_COMMAND) {
+ // special case to give nicer error message
+ EMSG(e_cmdmap_repeated);
+ aborted = true;
+ } else if (IS_SPECIAL(c1)) {
+ if (c1 == K_SNR) {
+ ga_append(&line_ga, (char)K_SPECIAL);
+ ga_append(&line_ga, (char)KS_EXTRA);
+ ga_append(&line_ga, (char)KE_SNR);
+ } else {
+ EMSG2(e_cmdmap_key, get_special_key_name(c1, cmod));
+ aborted = true;
+ }
+ } else {
+ ga_append(&line_ga, (char)c1);
+ }
+
+ cmod = 0;
+ }
+
+ no_mapping--;
+
+ if (aborted) {
+ ga_clear(&line_ga);
+ }
+
+ return (char_u *)line_ga.ga_data;
+}
diff --git a/src/nvim/getchar.h b/src/nvim/getchar.h
index bdf65909b6..4f548d975a 100644
--- a/src/nvim/getchar.h
+++ b/src/nvim/getchar.h
@@ -1,17 +1,38 @@
#ifndef NVIM_GETCHAR_H
#define NVIM_GETCHAR_H
-/* Values for "noremap" argument of ins_typebuf(). Also used for
- * map->m_noremap and menu->noremap[]. */
-#define REMAP_YES 0 /* allow remapping */
-#define REMAP_NONE -1 /* no remapping */
-#define REMAP_SCRIPT -2 /* remap script-local mappings only */
-#define REMAP_SKIP -3 /* no remapping for first char */
+#include "nvim/os/fileio.h"
+#include "nvim/types.h"
+#include "nvim/buffer_defs.h"
+#include "nvim/ex_cmds_defs.h"
+
+/// Values for "noremap" argument of ins_typebuf()
+///
+/// Also used for map->m_noremap and menu->noremap[].
+enum {
+ REMAP_YES = 0, ///< Allow remapping.
+ REMAP_NONE = -1, ///< No remapping.
+ REMAP_SCRIPT = -2, ///< Remap script-local mappings only.
+ REMAP_SKIP = -3, ///< No remapping for first char.
+} RemapValues;
+
+// Argument for flush_buffers().
+typedef enum {
+ FLUSH_MINIMAL,
+ FLUSH_TYPEAHEAD, // flush current typebuf contents
+ FLUSH_INPUT // flush typebuf and inchar() input
+} flush_buffers_T;
#define KEYLEN_PART_KEY -1 /* keylen value for incomplete key-code */
#define KEYLEN_PART_MAP -2 /* keylen value for incomplete mapping */
#define KEYLEN_REMOVED 9999 /* keylen value for removed sequence */
+/// Maximum number of streams to read script from
+enum { NSCRIPT = 15 };
+
+/// Streams to read script from
+extern FileDescriptor *scriptin[NSCRIPT];
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "getchar.h.generated.h"
#endif
diff --git a/src/nvim/gettext.h b/src/nvim/gettext.h
new file mode 100644
index 0000000000..acc7e3a92c
--- /dev/null
+++ b/src/nvim/gettext.h
@@ -0,0 +1,23 @@
+#ifndef NVIM_GETTEXT_H
+#define NVIM_GETTEXT_H
+
+#ifdef HAVE_WORKING_LIBINTL
+# include <libintl.h>
+# define _(x) gettext((char *)(x))
+// XXX do we actually need this?
+# ifdef gettext_noop
+# define N_(x) gettext_noop(x)
+# else
+# define N_(x) x
+# endif
+# define NGETTEXT(x, xs, n) ngettext(x, xs, n)
+#else
+# define _(x) ((char *)(x))
+# define N_(x) x
+# define NGETTEXT(x, xs, n) ((n) == 1 ? (x) : (xs))
+# define bindtextdomain(x, y) // empty
+# define bind_textdomain_codeset(x, y) // empty
+# define textdomain(x) // empty
+#endif
+
+#endif // NVIM_GETTEXT_H
diff --git a/src/nvim/globals.h b/src/nvim/globals.h
index ed9862a264..2550fb8163 100644
--- a/src/nvim/globals.h
+++ b/src/nvim/globals.h
@@ -12,32 +12,14 @@
#include "nvim/syntax_defs.h"
#include "nvim/types.h"
#include "nvim/event/loop.h"
-
-/*
- * definition of global variables
- */
+#include "nvim/os/os_defs.h"
#define IOSIZE (1024+1) // file I/O and sprintf buffer size
-#define MAX_MCO 6 // maximum value for 'maxcombine'
-
# define MSG_BUF_LEN 480 // length of buffer for small messages
# define MSG_BUF_CLEN (MSG_BUF_LEN / 6) // cell length (worst case: utf-8
// takes 6 bytes for one cell)
-/*
- * Maximum length of a path (for non-unix systems) Make it a bit long, to stay
- * on the safe side. But not too long to put on the stack.
- * TODO(metrix78): Move this to os_defs.h
- */
-#ifndef MAXPATHL
-# ifdef MAXPATHLEN
-# define MAXPATHL MAXPATHLEN
-# else
-# define MAXPATHL 256
-# endif
-#endif
-
#ifdef WIN32
# define _PATHSEPSTR "\\"
#else
@@ -96,6 +78,11 @@ typedef enum {
kTrue = 1,
} TriState;
+EXTERN struct nvim_stats_s {
+ int64_t fsync;
+ int64_t redraw;
+} g_stats INIT(= { 0, 0 });
+
/* Values for "starting" */
#define NO_SCREEN 2 /* no screen updating yet */
#define NO_BUFFERS 1 /* not all buffers loaded yet */
@@ -104,59 +91,43 @@ typedef enum {
/*
* Number of Rows and Columns in the screen.
* Must be long to be able to use them as options in option.c.
- * Note: Use screen_Rows and screen_Columns to access items in ScreenLines[].
- * They may have different values when the screen wasn't (re)allocated yet
- * after setting Rows or Columns (e.g., when starting up).
+ * Note: Use default_grid.Rows and default_grid.Columns to access items in
+ * default_grid.chars[]. They may have different values when the screen
+ * wasn't (re)allocated yet after setting Rows or Columns (e.g., when starting
+ * up).
*/
-
-#define DFLT_COLS 80 /* default value for 'columns' */
-#define DFLT_ROWS 24 /* default value for 'lines' */
-
+#define DFLT_COLS 80 // default value for 'columns'
+#define DFLT_ROWS 24 // default value for 'lines'
EXTERN long Rows INIT(= DFLT_ROWS); // nr of rows in the screen
-
EXTERN long Columns INIT(= DFLT_COLS); // nr of columns in the screen
-/*
- * The characters and attributes cached for the screen.
- */
-typedef char_u schar_T;
-typedef unsigned short sattr_T;
-
-/*
- * The characters that are currently on the screen are kept in ScreenLines[].
- * It is a single block of characters, the size of the screen plus one line.
- * The attributes for those characters are kept in ScreenAttrs[].
- *
- * "LineOffset[n]" is the offset from ScreenLines[] for the start of line 'n'.
- * The same value is used for ScreenLinesUC[] and ScreenAttrs[].
- *
- * Note: before the screen is initialized and when out of memory these can be
- * NULL.
- */
-EXTERN schar_T *ScreenLines INIT(= NULL);
-EXTERN sattr_T *ScreenAttrs INIT(= NULL);
-EXTERN unsigned *LineOffset INIT(= NULL);
-EXTERN char_u *LineWraps INIT(= NULL); /* line wraps to next line */
-
-/*
- * When using Unicode characters (in UTF-8 encoding) the character in
- * ScreenLinesUC[] contains the Unicode for the character at this position, or
- * NUL when the character in ScreenLines[] is to be used (ASCII char).
- * The composing characters are to be drawn on top of the original character.
- * ScreenLinesC[0][off] is only to be used when ScreenLinesUC[off] != 0.
- * Note: These three are only allocated when enc_utf8 is set!
- */
-EXTERN u8char_T *ScreenLinesUC INIT(= NULL); /* decoded UTF-8 characters */
-EXTERN u8char_T *ScreenLinesC[MAX_MCO]; /* composing characters */
-EXTERN int Screen_mco INIT(= 0); /* value of p_mco used when
- allocating ScreenLinesC[] */
-
-/* Only used for euc-jp: Second byte of a character that starts with 0x8e.
- * These are single-width. */
-EXTERN schar_T *ScreenLines2 INIT(= NULL);
-
-EXTERN int screen_Rows INIT(= 0); /* actual size of ScreenLines[] */
-EXTERN int screen_Columns INIT(= 0); /* actual size of ScreenLines[] */
+// We use 64-bit file functions here, if available. E.g. ftello() returns
+// off_t instead of long, which helps if long is 32 bit and off_t is 64 bit.
+// We assume that when fseeko() is available then ftello() is too.
+// Note that Windows has different function names.
+#if (defined(_MSC_VER) && (_MSC_VER >= 1300)) || defined(__MINGW32__)
+typedef __int64 off_T;
+# ifdef __MINGW32__
+# define vim_lseek lseek64
+# define vim_fseek fseeko64
+# define vim_ftell ftello64
+# else
+# define vim_lseek _lseeki64
+# define vim_fseek _fseeki64
+# define vim_ftell _ftelli64
+# endif
+#else
+typedef off_t off_T;
+# ifdef HAVE_FSEEKO
+# define vim_lseek lseek
+# define vim_ftell ftello
+# define vim_fseek fseeko
+# else
+# define vim_lseek lseek
+# define vim_ftell ftell
+# define vim_fseek(a, b, c) fseek(a, (long)b, c)
+# endif
+#endif
/*
* When vgetc() is called, it sets mod_mask to the set of modifiers that are
@@ -182,8 +153,6 @@ EXTERN int cmdline_star INIT(= FALSE); /* cmdline is crypted */
EXTERN int exec_from_reg INIT(= FALSE); /* executing register */
-EXTERN int screen_cleared INIT(= FALSE); /* screen has been cleared */
-
/*
* When '$' is included in 'cpoptions' option set:
* When a change command is given that deletes only part of a line, a dollar
@@ -221,11 +190,8 @@ EXTERN int compl_cont_status INIT(= 0);
# define CONT_LOCAL 32 /* for ctrl_x_mode 0, ^X^P/^X^N do a local
* expansion, (eg use complete=.) */
-/*
- * Functions for putting characters in the command line,
- * while keeping ScreenLines[] updated.
- */
-EXTERN int cmdmsg_rl INIT(= FALSE); /* cmdline is drawn right to left */
+// state for putting characters in the message area
+EXTERN int cmdmsg_rl INIT(= false); // cmdline is drawn right to left
EXTERN int msg_col;
EXTERN int msg_row;
EXTERN int msg_scrolled; /* Number of screen lines that windows have
@@ -271,24 +237,18 @@ EXTERN int did_wait_return INIT(= FALSE); /* wait_return() was used and
nothing written since then */
EXTERN int need_maketitle INIT(= TRUE); /* call maketitle() soon */
-EXTERN int quit_more INIT(= FALSE); /* 'q' hit at "--more--" msg */
-#if defined(UNIX) || defined(MACOS_X)
-EXTERN int newline_on_exit INIT(= FALSE); /* did msg in altern. screen */
-EXTERN int intr_char INIT(= 0); /* extra interrupt character */
-#endif
-EXTERN int ex_keep_indent INIT(= FALSE); /* getexmodeline(): keep indent */
-EXTERN int vgetc_busy INIT(= 0); /* when inside vgetc() then > 0 */
+EXTERN int quit_more INIT(= false); // 'q' hit at "--more--" msg
+EXTERN int ex_keep_indent INIT(= false); // getexmodeline(): keep indent
+EXTERN int vgetc_busy INIT(= 0); // when inside vgetc() then > 0
EXTERN int didset_vim INIT(= FALSE); /* did set $VIM ourselves */
EXTERN int didset_vimruntime INIT(= FALSE); /* idem for $VIMRUNTIME */
-/*
- * Lines left before a "more" message. Ex mode needs to be able to reset this
- * after you type something.
- */
-EXTERN int lines_left INIT(= -1); /* lines left for listing */
-EXTERN int msg_no_more INIT(= FALSE); /* don't use more prompt, truncate
- messages */
+/// Lines left before a "more" message. Ex mode needs to be able to reset this
+/// after you type something.
+EXTERN int lines_left INIT(= -1); // lines left for listing
+EXTERN int msg_no_more INIT(= false); // don't use more prompt, truncate
+ // messages
EXTERN char_u *sourcing_name INIT( = NULL); /* name of error message source */
EXTERN linenr_T sourcing_lnum INIT(= 0); /* line number of the source file */
@@ -299,120 +259,100 @@ EXTERN int debug_did_msg INIT(= false); // did "debug mode" message
EXTERN int debug_tick INIT(= 0); // breakpoint change count
EXTERN int debug_backtrace_level INIT(= 0); // breakpoint backtrace level
-/* Values for "do_profiling". */
-#define PROF_NONE 0 /* profiling not started */
-#define PROF_YES 1 /* profiling busy */
-#define PROF_PAUSED 2 /* profiling paused */
-EXTERN int do_profiling INIT(= PROF_NONE); /* PROF_ values */
+// Values for "do_profiling".
+#define PROF_NONE 0 ///< profiling not started
+#define PROF_YES 1 ///< profiling busy
+#define PROF_PAUSED 2 ///< profiling paused
+EXTERN int do_profiling INIT(= PROF_NONE); ///< PROF_ values
-/*
- * The exception currently being thrown. Used to pass an exception to
- * a different cstack. Also used for discarding an exception before it is
- * caught or made pending. Only valid when did_throw is TRUE.
- */
+/// Exception currently being thrown. Used to pass an exception to a different
+/// cstack. Also used for discarding an exception before it is caught or made
+/// pending.
EXTERN except_T *current_exception;
-/*
- * did_throw: An exception is being thrown. Reset when the exception is caught
- * or as long as it is pending in a finally clause.
- */
-EXTERN int did_throw INIT(= FALSE);
-
-/*
- * need_rethrow: set to TRUE when a throw that cannot be handled in do_cmdline()
- * must be propagated to the cstack of the previously called do_cmdline().
- */
-EXTERN int need_rethrow INIT(= FALSE);
+/// Set when a throw that cannot be handled in do_cmdline() must be propagated
+/// to the cstack of the previously called do_cmdline().
+EXTERN int need_rethrow INIT(= false);
-/*
- * check_cstack: set to TRUE when a ":finish" or ":return" that cannot be
- * handled in do_cmdline() must be propagated to the cstack of the previously
- * called do_cmdline().
- */
-EXTERN int check_cstack INIT(= FALSE);
+/// Set when a ":finish" or ":return" that cannot be handled in do_cmdline()
+/// must be propagated to the cstack of the previously called do_cmdline().
+EXTERN int check_cstack INIT(= false);
-/*
- * Number of nested try conditionals (across function calls and ":source"
- * commands).
- */
+/// Number of nested try conditionals (across function calls and ":source"
+/// commands).
EXTERN int trylevel INIT(= 0);
-/*
- * When "force_abort" is TRUE, always skip commands after an error message,
- * even after the outermost ":endif", ":endwhile" or ":endfor" or for a
- * function without the "abort" flag. It is set to TRUE when "trylevel" is
- * non-zero (and ":silent!" was not used) or an exception is being thrown at
- * the time an error is detected. It is set to FALSE when "trylevel" gets
- * zero again and there was no error or interrupt or throw.
- */
-EXTERN int force_abort INIT(= FALSE);
-
-/*
- * "msg_list" points to a variable in the stack of do_cmdline() which keeps
- * the list of arguments of several emsg() calls, one of which is to be
- * converted to an error exception immediately after the failing command
- * returns. The message to be used for the exception value is pointed to by
- * the "throw_msg" field of the first element in the list. It is usually the
- * same as the "msg" field of that element, but can be identical to the "msg"
- * field of a later list element, when the "emsg_severe" flag was set when the
- * emsg() call was made.
- */
+/// When "force_abort" is TRUE, always skip commands after an error message,
+/// even after the outermost ":endif", ":endwhile" or ":endfor" or for a
+/// function without the "abort" flag. It is set to TRUE when "trylevel" is
+/// non-zero (and ":silent!" was not used) or an exception is being thrown at
+/// the time an error is detected. It is set to FALSE when "trylevel" gets
+/// zero again and there was no error or interrupt or throw.
+EXTERN int force_abort INIT(= false);
+
+/// "msg_list" points to a variable in the stack of do_cmdline() which keeps
+/// the list of arguments of several emsg() calls, one of which is to be
+/// converted to an error exception immediately after the failing command
+/// returns. The message to be used for the exception value is pointed to by
+/// the "throw_msg" field of the first element in the list. It is usually the
+/// same as the "msg" field of that element, but can be identical to the "msg"
+/// field of a later list element, when the "emsg_severe" flag was set when the
+/// emsg() call was made.
EXTERN struct msglist **msg_list INIT(= NULL);
-/*
- * suppress_errthrow: When TRUE, don't convert an error to an exception. Used
- * when displaying the interrupt message or reporting an exception that is still
- * uncaught at the top level (which has already been discarded then). Also used
- * for the error message when no exception can be thrown.
- */
-EXTERN int suppress_errthrow INIT(= FALSE);
+/// When set, don't convert an error to an exception. Used when displaying the
+/// interrupt message or reporting an exception that is still uncaught at the
+/// top level (which has already been discarded then). Also used for the error
+/// message when no exception can be thrown.
+EXTERN int suppress_errthrow INIT(= false);
-/*
- * The stack of all caught and not finished exceptions. The exception on the
- * top of the stack is the one got by evaluation of v:exception. The complete
- * stack of all caught and pending exceptions is embedded in the various
- * cstacks; the pending exceptions, however, are not on the caught stack.
- */
+/// The stack of all caught and not finished exceptions. The exception on the
+/// top of the stack is the one got by evaluation of v:exception. The complete
+/// stack of all caught and pending exceptions is embedded in the various
+/// cstacks; the pending exceptions, however, are not on the caught stack.
EXTERN except_T *caught_stack INIT(= NULL);
-/*
- * Garbage collection can only take place when we are sure there are no Lists
- * or Dictionaries being used internally. This is flagged with
- * "may_garbage_collect" when we are at the toplevel.
- * "want_garbage_collect" is set by the garbagecollect() function, which means
- * we do garbage collection before waiting for a char at the toplevel.
- * "garbage_collect_at_exit" indicates garbagecollect(1) was called.
- */
-EXTERN int may_garbage_collect INIT(= FALSE);
-EXTERN int want_garbage_collect INIT(= FALSE);
-EXTERN int garbage_collect_at_exit INIT(= FALSE);
-
-/* Special values for current_SID. */
-#define SID_MODELINE -1 /* when using a modeline */
-#define SID_CMDARG -2 /* for "--cmd" argument */
-#define SID_CARG -3 /* for "-c" argument */
-#define SID_ENV -4 /* for sourcing environment variable */
-#define SID_ERROR -5 /* option was reset because of an error */
-#define SID_NONE -6 /* don't set scriptID */
-
-/* ID of script being sourced or was sourced to define the current function. */
+///
+/// Garbage collection can only take place when we are sure there are no Lists
+/// or Dictionaries being used internally. This is flagged with
+/// "may_garbage_collect" when we are at the toplevel.
+/// "want_garbage_collect" is set by the garbagecollect() function, which means
+/// we do garbage collection before waiting for a char at the toplevel.
+/// "garbage_collect_at_exit" indicates garbagecollect(1) was called.
+///
+EXTERN int may_garbage_collect INIT(= false);
+EXTERN int want_garbage_collect INIT(= false);
+EXTERN int garbage_collect_at_exit INIT(= false);
+
+// Special values for current_SID.
+#define SID_MODELINE -1 // when using a modeline
+#define SID_CMDARG -2 // for "--cmd" argument
+#define SID_CARG -3 // for "-c" argument
+#define SID_ENV -4 // for sourcing environment variable
+#define SID_ERROR -5 // option was reset because of an error
+#define SID_NONE -6 // don't set scriptID
+#define SID_LUA -7 // for Lua scripts/chunks
+#define SID_API_CLIENT -8 // for API clients
+
+// ID of script being sourced or was sourced to define the current function.
EXTERN scid_T current_SID INIT(= 0);
+// ID of the current channel making a client API call
+EXTERN uint64_t current_channel_id INIT(= 0);
+
+EXTERN bool did_source_packages INIT(= false);
+
// Scope information for the code that indirectly triggered the current
// provider function call
EXTERN struct caller_scope {
scid_T SID;
uint8_t *sourcing_name, *autocmd_fname, *autocmd_match;
linenr_T sourcing_lnum;
- int autocmd_fname_full, autocmd_bufnr;
+ int autocmd_bufnr;
void *funccalp;
} provider_caller_scope;
EXTERN int provider_call_nesting INIT(= 0);
-/* Magic number used for hashitem "hi_key" value indicating a deleted item.
- * Only the address is used. */
-EXTERN char_u hash_removed;
-
EXTERN int t_colors INIT(= 256); // int value of T_CCO
@@ -434,78 +374,6 @@ EXTERN int did_check_timestamps INIT(= FALSE); /* did check timestamps
recently */
EXTERN int no_check_timestamps INIT(= 0); /* Don't check timestamps */
-/*
- * Values for index in highlight_attr[].
- * When making changes, also update HL_FLAGS below! And update the default
- * value of 'highlight' in option.c.
- */
-typedef enum {
- HLF_8 = 0 /* Meta & special keys listed with ":map", text that is
- displayed different from what it is */
- , HLF_EOB //< after the last line in the buffer
- , HLF_TERM //< terminal cursor focused
- , HLF_TERMNC //< terminal cursor unfocused
- , HLF_AT /* @ characters at end of screen, characters that
- don't really exist in the text */
- , HLF_D /* directories in CTRL-D listing */
- , HLF_E /* error messages */
- , HLF_I /* incremental search */
- , HLF_L /* last search string */
- , HLF_M /* "--More--" message */
- , HLF_CM /* Mode (e.g., "-- INSERT --") */
- , HLF_N /* line number for ":number" and ":#" commands */
- , HLF_CLN /* current line number */
- , HLF_R /* return to continue message and yes/no questions */
- , HLF_S /* status lines */
- , HLF_SNC /* status lines of not-current windows */
- , HLF_C /* column to separate vertically split windows */
- , HLF_T /* Titles for output from ":set all", ":autocmd" etc. */
- , HLF_V /* Visual mode */
- , HLF_VNC /* Visual mode, autoselecting and not clipboard owner */
- , HLF_W /* warning messages */
- , HLF_WM /* Wildmenu highlight */
- , HLF_FL /* Folded line */
- , HLF_FC /* Fold column */
- , HLF_ADD /* Added diff line */
- , HLF_CHD /* Changed diff line */
- , HLF_DED /* Deleted diff line */
- , HLF_TXD /* Text Changed in diff line */
- , HLF_CONCEAL /* Concealed text */
- , HLF_SC /* Sign column */
- , HLF_SPB /* SpellBad */
- , HLF_SPC /* SpellCap */
- , HLF_SPR /* SpellRare */
- , HLF_SPL /* SpellLocal */
- , HLF_PNI /* popup menu normal item */
- , HLF_PSI /* popup menu selected item */
- , HLF_PSB /* popup menu scrollbar */
- , HLF_PST /* popup menu scrollbar thumb */
- , HLF_TP /* tabpage line */
- , HLF_TPS /* tabpage line selected */
- , HLF_TPF /* tabpage line filler */
- , HLF_CUC /* 'cursurcolumn' */
- , HLF_CUL /* 'cursurline' */
- , HLF_MC /* 'colorcolumn' */
- , HLF_COUNT /* MUST be the last one */
-} hlf_T;
-
-/* The HL_FLAGS must be in the same order as the HLF_ enums!
- * When changing this also adjust the default for 'highlight'. */
-#define HL_FLAGS {'8', '~', 'z', 'Z', '@', 'd', 'e', 'i', 'l', 'm', 'M', 'n', \
- 'N', 'r', 's', 'S', 'c', 't', 'v', 'V', 'w', 'W', 'f', 'F', \
- 'A', 'C', 'D', 'T', '-', '>', 'B', 'P', 'R', 'L', '+', '=', \
- 'x', 'X', '*', '#', '_', '!', '.', 'o'}
-
-EXTERN int highlight_attr[HLF_COUNT]; /* Highl. attr for each context. */
-EXTERN int highlight_user[9]; /* User[1-9] attributes */
-EXTERN int highlight_stlnc[9]; /* On top of user */
-EXTERN int cterm_normal_fg_color INIT(= 0);
-EXTERN int cterm_normal_fg_bold INIT(= 0);
-EXTERN int cterm_normal_bg_color INIT(= 0);
-EXTERN RgbValue normal_fg INIT(= -1);
-EXTERN RgbValue normal_bg INIT(= -1);
-EXTERN RgbValue normal_sp INIT(= -1);
-
EXTERN int autocmd_busy INIT(= FALSE); /* Is apply_autocmds() busy? */
EXTERN int autocmd_no_enter INIT(= FALSE); /* *Enter autocmds disabled */
EXTERN int autocmd_no_leave INIT(= FALSE); /* *Leave autocmds disabled */
@@ -515,9 +383,9 @@ EXTERN int keep_filetype INIT(= FALSE); /* value for did_filetype when
starting to execute
autocommands */
-/* When deleting the current buffer, another one must be loaded. If we know
- * which one is preferred, au_new_curbuf is set to it */
-EXTERN buf_T *au_new_curbuf INIT(= NULL);
+// When deleting the current buffer, another one must be loaded.
+// If we know which one is preferred, au_new_curbuf is set to it.
+EXTERN bufref_T au_new_curbuf INIT(= { NULL, 0, 0 });
// When deleting a buffer/window and autocmd_busy is TRUE, do not free the
// buffer/window. but link it in the list starting with
@@ -561,6 +429,7 @@ EXTERN int updating_screen INIT(= FALSE);
EXTERN win_T *firstwin; /* first window */
EXTERN win_T *lastwin; /* last window */
EXTERN win_T *prevwin INIT(= NULL); /* previous window */
+# define ONE_WINDOW (firstwin == lastwin)
/*
* When using this macro "break" only breaks out of the inner loop. Use "goto"
* to break out of the tabpage loop.
@@ -569,6 +438,7 @@ EXTERN win_T *prevwin INIT(= NULL); /* previous window */
FOR_ALL_TABS(tp) \
FOR_ALL_WINDOWS_IN_TAB(wp, tp)
+// -V:FOR_ALL_WINDOWS_IN_TAB:501
# define FOR_ALL_WINDOWS_IN_TAB(wp, tp) \
for (win_T *wp = ((tp) == curtab) \
? firstwin : (tp)->tp_firstwin; wp != NULL; wp = wp->w_next)
@@ -599,16 +469,15 @@ EXTERN int redraw_tabline INIT(= FALSE); /* need to redraw tabline */
* All buffers are linked in a list. 'firstbuf' points to the first entry,
* 'lastbuf' to the last entry and 'curbuf' to the currently active buffer.
*/
-EXTERN buf_T *firstbuf INIT(= NULL); /* first buffer */
-EXTERN buf_T *lastbuf INIT(= NULL); /* last buffer */
-EXTERN buf_T *curbuf INIT(= NULL); /* currently active buffer */
+EXTERN buf_T *firstbuf INIT(= NULL); // first buffer
+EXTERN buf_T *lastbuf INIT(= NULL); // last buffer
+EXTERN buf_T *curbuf INIT(= NULL); // currently active buffer
// Iterates over all buffers in the buffer list.
-# define FOR_ALL_BUFFERS(buf) for (buf_T *buf = firstbuf; buf != NULL; buf = buf->b_next)
-
-/* Flag that is set when switching off 'swapfile'. It means that all blocks
- * are to be loaded into memory. Shouldn't be global... */
-EXTERN int mf_dont_release INIT(= FALSE); /* don't release blocks */
+#define FOR_ALL_BUFFERS(buf) \
+ for (buf_T *buf = firstbuf; buf != NULL; buf = buf->b_next)
+#define FOR_ALL_BUFFERS_BACKWARDS(buf) \
+ for (buf_T *buf = lastbuf; buf != NULL; buf = buf->b_prev)
/*
* List of files being edited (global argument list). curwin->w_alist points
@@ -616,80 +485,70 @@ EXTERN int mf_dont_release INIT(= FALSE); /* don't release blocks */
*/
EXTERN alist_T global_alist; /* global argument list */
EXTERN int max_alist_id INIT(= 0); ///< the previous argument list id
-EXTERN int arg_had_last INIT(= FALSE); /* accessed last file in
- global_alist */
+EXTERN bool arg_had_last INIT(= false); // accessed last file in
+ // global_alist
EXTERN int ru_col; /* column for ruler */
EXTERN int ru_wid; /* 'rulerfmt' width of ruler when non-zero */
EXTERN int sc_col; /* column for shown command */
-/*
- * When starting or exiting some things are done differently (e.g. screen
- * updating).
- */
-EXTERN int starting INIT(= NO_SCREEN);
-/* first NO_SCREEN, then NO_BUFFERS and then
- * set to 0 when starting up finished */
-EXTERN int exiting INIT(= FALSE);
-/* TRUE when planning to exit Vim. Might
- * still keep on running if there is a changed
- * buffer. */
-/* volatile because it is used in signal handler deathtrap(). */
-EXTERN volatile int full_screen INIT(= FALSE);
-/* TRUE when doing full-screen output
- * otherwise only writing some messages */
-
-EXTERN int restricted INIT(= FALSE);
-// TRUE when started in restricted mode (-Z)
-EXTERN int secure INIT(= FALSE);
-/* non-zero when only "safe" commands are
- * allowed, e.g. when sourcing .exrc or .vimrc
- * in current directory */
+//
+// When starting or exiting some things are done differently (e.g. screen
+// updating).
+//
+// First NO_SCREEN, then NO_BUFFERS, then 0 when startup finished.
+EXTERN int starting INIT(= NO_SCREEN);
+// true when planning to exit. Might keep running if there is a changed buffer.
+EXTERN int exiting INIT(= false);
+// is stdin a terminal?
+EXTERN int stdin_isatty INIT(= true);
+// is stdout a terminal?
+EXTERN int stdout_isatty INIT(= true);
+// true when doing full-screen output, otherwise only writing some messages.
+// volatile because it is used in a signal handler.
+EXTERN volatile int full_screen INIT(= false);
+
+// When started in restricted mode (-Z).
+EXTERN int restricted INIT(= false);
+
+/// Non-zero when only "safe" commands are allowed, e.g. when sourcing .exrc or
+/// .vimrc in current directory.
+EXTERN int secure INIT(= false);
+
+/// Non-zero when changing text and jumping to another window/buffer is not
+/// allowed.
EXTERN int textlock INIT(= 0);
-/* non-zero when changing text and jumping to
- * another window or buffer is not allowed */
+/// Non-zero when the current buffer can't be changed. Used for FileChangedRO.
EXTERN int curbuf_lock INIT(= 0);
-/* non-zero when the current buffer can't be
- * changed. Used for FileChangedRO. */
+
+/// Non-zero when no buffer name can be changed, no buffer can be deleted and
+/// current directory can't be changed. Used for SwapExists et al.
EXTERN int allbuf_lock INIT(= 0);
-/* non-zero when no buffer name can be
- * changed, no buffer can be deleted and
- * current directory can't be changed.
- * Used for SwapExists et al. */
+
+/// Non-zero when evaluating an expression in a "sandbox". Several things are
+/// not allowed then.
EXTERN int sandbox INIT(= 0);
-/* Non-zero when evaluating an expression in a
- * "sandbox". Several things are not allowed
- * then. */
-
-EXTERN int silent_mode INIT(= FALSE);
-/* set to TRUE when "-s" commandline argument
- * used for ex */
-
-// Set to true when sourcing of startup scripts (init.vim) is done.
-// Used for options that cannot be changed after startup scripts.
-EXTERN bool did_source_startup_scripts INIT(= false);
-
-EXTERN pos_T VIsual; /* start position of active Visual selection */
-EXTERN int VIsual_active INIT(= FALSE);
-/* whether Visual mode is active */
-EXTERN int VIsual_select INIT(= FALSE);
-/* whether Select mode is active */
-EXTERN int VIsual_reselect;
-/* whether to restart the selection after a
- * Select mode mapping or menu */
-EXTERN int VIsual_mode INIT(= 'v');
-/* type of Visual mode */
+/// Batch-mode: "-es" or "-Es" commandline argument was given.
+EXTERN int silent_mode INIT(= false);
-EXTERN int redo_VIsual_busy INIT(= FALSE);
-/* TRUE when redoing Visual */
+/// Start position of active Visual selection.
+EXTERN pos_T VIsual;
+/// Whether Visual mode is active.
+EXTERN int VIsual_active INIT(= false);
+/// Whether Select mode is active.
+EXTERN int VIsual_select INIT(= false);
+/// Whether to restart the selection after a Select-mode mapping or menu.
+EXTERN int VIsual_reselect;
+/// Type of Visual mode.
+EXTERN int VIsual_mode INIT(= 'v');
+/// TRUE when redoing Visual.
+EXTERN int redo_VIsual_busy INIT(= false);
-/*
- * When pasting text with the middle mouse button in visual mode with
- * restart_edit set, remember where it started so we can set Insstart.
- */
+/// When pasting text with the middle mouse button in visual mode with
+/// restart_edit set, remember where it started so we can set Insstart.
EXTERN pos_T where_paste_started;
/*
@@ -698,7 +557,7 @@ EXTERN pos_T where_paste_started;
* reset when any other editing is done on the line. If an <ESC> or <RETURN>
* is received, and did_ai is TRUE, the line is truncated.
*/
-EXTERN int did_ai INIT(= FALSE);
+EXTERN bool did_ai INIT(= false);
/*
* Column of first char after autoindent. 0 when no autoindent done. Used
@@ -726,19 +585,19 @@ EXTERN int did_syncbind INIT(= FALSE);
* This flag is set when a smart indent has been performed. When the next typed
* character is a '{' the inserted tab will be deleted again.
*/
-EXTERN int did_si INIT(= FALSE);
+EXTERN bool did_si INIT(= false);
/*
* This flag is set after an auto indent. If the next typed character is a '}'
* one indent will be removed.
*/
-EXTERN int can_si INIT(= FALSE);
+EXTERN bool can_si INIT(= false);
/*
* This flag is set after an "O" command. If the next typed character is a '{'
* one indent will be removed.
*/
-EXTERN int can_si_back INIT(= FALSE);
+EXTERN bool can_si_back INIT(= false);
// w_cursor before formatting text.
EXTERN pos_T saved_cursor INIT(= INIT_POS_T(0, 0, 0));
@@ -777,45 +636,16 @@ EXTERN int vr_lines_changed INIT(= 0); /* #Lines changed by "gR" so far */
# define DBCS_2BYTE 1 /* 2byte- */
# define DBCS_DEBUG -1
-EXTERN int enc_dbcs INIT(= 0); /* One of DBCS_xxx values if
- DBCS encoding */
-EXTERN int enc_unicode INIT(= 0); /* 2: UCS-2 or UTF-16, 4: UCS-4 */
-EXTERN bool enc_utf8 INIT(= false); /* UTF-8 encoded Unicode */
-EXTERN int enc_latin1like INIT(= TRUE); /* 'encoding' is latin1 comp. */
-EXTERN int has_mbyte INIT(= 0); /* any multi-byte encoding */
+// mbyte flags that used to depend on 'encoding'. These are now deprecated, as
+// 'encoding' is always "utf-8". Code that use them can be refactored to
+// remove dead code.
+#define enc_dbcs 0
+#define enc_utf8 true
+#define has_mbyte true
/// Encoding used when 'fencs' is set to "default"
EXTERN char_u *fenc_default INIT(= NULL);
-/*
- * To speed up BYTELEN() we fill a table with the byte lengths whenever
- * enc_utf8 or enc_dbcs changes.
- */
-EXTERN char mb_bytelen_tab[256];
-
-/*
- * Function pointers, used to quickly get to the right function. Each has
- * three possible values: latin_ (8-bit), utfc_ or utf_ (utf-8) and dbcs_
- * (DBCS).
- * The value is set in mb_init();
- */
-/* length of char in bytes, including following composing chars */
-EXTERN int (*mb_ptr2len)(const char_u *p) INIT(= latin_ptr2len);
-/* idem, with limit on string length */
-EXTERN int (*mb_ptr2len_len)(const char_u *p, int size) INIT(= latin_ptr2len_len);
-/* byte length of char */
-EXTERN int (*mb_char2len)(int c) INIT(= latin_char2len);
-/* convert char to bytes, return the length */
-EXTERN int (*mb_char2bytes)(int c, char_u *buf) INIT(= latin_char2bytes);
-EXTERN int (*mb_ptr2cells)(const char_u *p) INIT(= latin_ptr2cells);
-EXTERN int (*mb_ptr2cells_len)(const char_u *p, int size) INIT(
- = latin_ptr2cells_len);
-EXTERN int (*mb_char2cells)(int c) INIT(= latin_char2cells);
-EXTERN int (*mb_off2cells)(unsigned off, unsigned max_off) INIT(
- = latin_off2cells);
-EXTERN int (*mb_ptr2char)(const char_u *p) INIT(= latin_ptr2char);
-EXTERN int (*mb_head_off)(const char_u *base, const char_u *p) INIT(= latin_head_off);
-
# if defined(USE_ICONV) && defined(DYNAMIC_ICONV)
/* Pointers to functions and variables to be loaded at runtime */
EXTERN size_t (*iconv)(iconv_t cd, const char **inbuf, size_t *inbytesleft,
@@ -826,35 +656,31 @@ EXTERN int (*iconvctl)(iconv_t cd, int request, void *argument);
EXTERN int* (*iconv_errno)(void);
# endif
-/*
- * "State" is the main state of Vim.
- * There are other variables that modify the state:
- * "Visual_mode" When State is NORMAL or INSERT.
- * "finish_op" When State is NORMAL, after typing the operator and before
- * typing the motion command.
- */
-EXTERN int State INIT(= NORMAL); /* This is the current state of the
- * command interpreter. */
+/// "State" is the main state of Vim.
+/// There are other variables that modify the state:
+/// Visual_mode: When State is NORMAL or INSERT.
+/// finish_op : When State is NORMAL, after typing the operator and
+/// before typing the motion command.
+/// motion_force: Last motion_force from do_pending_operator()
+EXTERN int State INIT(= NORMAL); // This is the current state of the
+ // command interpreter.
EXTERN bool finish_op INIT(= false); // true while an operator is pending
EXTERN long opcount INIT(= 0); // count for pending operator
+EXTERN int motion_force INIT(=0); // motion force for pending operator
-/*
- * ex mode (Q) state
- */
-EXTERN int exmode_active INIT(= 0); /* zero, EXMODE_NORMAL or EXMODE_VIM */
-EXTERN int ex_no_reprint INIT(= FALSE); /* no need to print after z or p */
+// Ex Mode (Q) state
+EXTERN int exmode_active INIT(= 0); // Zero, EXMODE_NORMAL or EXMODE_VIM.
+EXTERN int ex_no_reprint INIT(=false); // No need to print after z or p.
-EXTERN int Recording INIT(= FALSE); /* TRUE when recording into a reg. */
-EXTERN int Exec_reg INIT(= FALSE); /* TRUE when executing a register */
+EXTERN int Recording INIT(= false); // TRUE when recording into a reg.
+EXTERN int Exec_reg INIT(= false); // TRUE when executing a register.
-EXTERN int no_mapping INIT(= FALSE); /* currently no mapping allowed */
-EXTERN int no_zero_mapping INIT(= 0); /* mapping zero not allowed */
-EXTERN int allow_keys INIT(= FALSE); /* allow key codes when no_mapping
- * is set */
-EXTERN int no_u_sync INIT(= 0); /* Don't call u_sync() */
-EXTERN int u_sync_once INIT(= 0); /* Call u_sync() once when evaluating
- an expression. */
+EXTERN int no_mapping INIT(= false); // currently no mapping allowed
+EXTERN int no_zero_mapping INIT(= 0); // mapping zero not allowed
+EXTERN int no_u_sync INIT(= 0); // Don't call u_sync()
+EXTERN int u_sync_once INIT(= 0); // Call u_sync() once when evaluating
+ // an expression.
EXTERN bool force_restart_edit INIT(= false); // force restart_edit after
// ex_normal returns
@@ -877,9 +703,10 @@ EXTERN int mapped_ctrl_c INIT(= 0); // Modes where CTRL-C is mapped.
EXTERN cmdmod_T cmdmod; /* Ex command modifiers */
-EXTERN int msg_silent INIT(= 0); /* don't print messages */
-EXTERN int emsg_silent INIT(= 0); /* don't print error messages */
-EXTERN int cmd_silent INIT(= FALSE); /* don't echo the command line */
+EXTERN int msg_silent INIT(= 0); // don't print messages
+EXTERN int emsg_silent INIT(= 0); // don't print error messages
+EXTERN bool emsg_noredir INIT(= false); // don't redirect error messages
+EXTERN bool cmd_silent INIT(= false); // don't echo the command line
/* Values for swap_exists_action: what to do when swap file already exists */
#define SEA_NONE 0 /* don't use dialog */
@@ -893,9 +720,16 @@ EXTERN int swap_exists_action INIT(= SEA_NONE);
EXTERN int swap_exists_did_quit INIT(= FALSE);
/* Selected "quit" at the dialog. */
-EXTERN char_u IObuff[IOSIZE]; /* sprintf's are done in this buffer */
-EXTERN char_u NameBuff[MAXPATHL]; /* buffer for expanding file names */
-EXTERN char_u msg_buf[MSG_BUF_LEN]; /* small buffer for messages */
+EXTERN char_u IObuff[IOSIZE]; ///< Buffer for sprintf, I/O, etc.
+EXTERN char_u NameBuff[MAXPATHL]; ///< Buffer for expanding file names
+EXTERN char_u msg_buf[MSG_BUF_LEN]; ///< Small buffer for messages
+EXTERN char os_buf[ ///< Buffer for the os/ layer
+#if MAXPATHL > IOSIZE
+MAXPATHL
+#else
+IOSIZE
+#endif
+];
/* When non-zero, postpone redrawing. */
EXTERN int RedrawingDisabled INIT(= 0);
@@ -910,13 +744,10 @@ EXTERN int ex_normal_busy INIT(= 0); // recursiveness of ex_normal()
EXTERN int ex_normal_lock INIT(= 0); // forbid use of ex_normal()
EXTERN int ignore_script INIT(= false); // ignore script input
EXTERN int stop_insert_mode; // for ":stopinsert" and 'insertmode'
-EXTERN int KeyTyped; // TRUE if user typed current char
+EXTERN bool KeyTyped; // true if user typed current char
EXTERN int KeyStuffed; // TRUE if current char from stuffbuf
EXTERN int maptick INIT(= 0); // tick for each non-mapped char
-EXTERN uint8_t chartab[256]; // table used in charset.c; See
- // init_chartab() for explanation
-
EXTERN int must_redraw INIT(= 0); /* type of redraw necessary */
EXTERN int skip_redraw INIT(= FALSE); /* skip redraw once */
EXTERN int do_redraw INIT(= FALSE); /* extra redraw once */
@@ -924,14 +755,11 @@ EXTERN int do_redraw INIT(= FALSE); /* extra redraw once */
EXTERN int need_highlight_changed INIT(= true);
EXTERN char *used_shada_file INIT(= NULL); // name of the ShaDa file to use
-#define NSCRIPT 15
-EXTERN FILE *scriptin[NSCRIPT]; /* streams to read script from */
-EXTERN int curscript INIT(= 0); /* index in scriptin[] */
-EXTERN FILE *scriptout INIT(= NULL); /* stream to write script to */
+EXTERN FILE *scriptout INIT(= NULL); ///< Stream to write script to.
-/* volatile because it is used in signal handler catch_sigint(). */
-EXTERN volatile int got_int INIT(= FALSE); /* set to TRUE when interrupt
- signal occurred */
+// volatile because it is used in a signal handler.
+EXTERN volatile int got_int INIT(= false); // set to true when interrupt
+ // signal occurred
EXTERN int bangredo INIT(= FALSE); /* set to TRUE with ! command */
EXTERN int searchcmdlen; /* length of previous search cmd */
EXTERN int reg_do_extmatch INIT(= 0); /* Used when compiling regexp:
@@ -956,16 +784,12 @@ EXTERN char_u *last_cmdline INIT(= NULL); // last command line (for ":)
EXTERN char_u *repeat_cmdline INIT(= NULL); // command line for "."
EXTERN char_u *new_last_cmdline INIT(= NULL); // new value for last_cmdline
EXTERN char_u *autocmd_fname INIT(= NULL); // fname for <afile> on cmdline
-EXTERN int autocmd_fname_full; // autocmd_fname is full path
EXTERN int autocmd_bufnr INIT(= 0); // fnum for <abuf> on cmdline
EXTERN char_u *autocmd_match INIT(= NULL); // name for <amatch> on cmdline
EXTERN int did_cursorhold INIT(= false); // set when CursorHold t'gerd
// for CursorMoved event
EXTERN pos_T last_cursormoved INIT(= INIT_POS_T(0, 0, 0));
-EXTERN int last_changedtick INIT(= 0); // for TextChanged event
-EXTERN buf_T *last_changedtick_buf INIT(= NULL);
-
EXTERN int postponed_split INIT(= 0); /* for CTRL-W CTRL-] command */
EXTERN int postponed_split_flags INIT(= 0); /* args for win_split() */
EXTERN int postponed_split_tab INIT(= 0); /* cmdmod.tab */
@@ -989,18 +813,19 @@ EXTERN int redir_off INIT(= false); // no redirection for a moment
EXTERN FILE *redir_fd INIT(= NULL); // message redirection file
EXTERN int redir_reg INIT(= 0); // message redirection register
EXTERN int redir_vname INIT(= 0); // message redirection variable
-EXTERN garray_T *capture_ga INIT(= NULL); // capture() buffer
+EXTERN garray_T *capture_ga INIT(= NULL); // captured output for execute()
EXTERN char_u langmap_mapchar[256]; /* mapping for language keys */
EXTERN int save_p_ls INIT(= -1); /* Save 'laststatus' setting */
EXTERN int save_p_wmh INIT(= -1); /* Save 'winminheight' setting */
EXTERN int wild_menu_showing INIT(= 0);
-# define WM_SHOWN 1 /* wildmenu showing */
-# define WM_SCROLLED 2 /* wildmenu showing with scroll */
-
+enum {
+ WM_SHOWN = 1, ///< wildmenu showing
+ WM_SCROLLED = 2, ///< wildmenu showing with scroll
+ WM_LIST = 3, ///< cmdline CTRL-D
+};
-EXTERN char breakat_flags[256]; /* which characters are in 'breakat' */
/*
* Some file names are stored in pathdef.c, which is generated from the
@@ -1018,7 +843,7 @@ extern char_u *compiled_sys;
* directory is not a local directory, globaldir is NULL. */
EXTERN char_u *globaldir INIT(= NULL);
-/* Characters from 'listchars' option */
+// 'listchars' characters. Defaults are overridden in set_chars_option().
EXTERN int lcs_eol INIT(= '$');
EXTERN int lcs_ext INIT(= NUL);
EXTERN int lcs_prec INIT(= NUL);
@@ -1029,20 +854,23 @@ EXTERN int lcs_tab2 INIT(= NUL);
EXTERN int lcs_trail INIT(= NUL);
EXTERN int lcs_conceal INIT(= ' ');
-/* Characters from 'fillchars' option */
+// 'fillchars' characters. Defaults are overridden in set_chars_option().
EXTERN int fill_stl INIT(= ' ');
EXTERN int fill_stlnc INIT(= ' ');
-EXTERN int fill_vert INIT(= ' ');
-EXTERN int fill_fold INIT(= '-');
+EXTERN int fill_vert INIT(= 9474); // โ”‚
+EXTERN int fill_fold INIT(= 183); // ยท
EXTERN int fill_diff INIT(= '-');
+EXTERN int fill_msgsep INIT(= ' ');
+EXTERN int fill_eob INIT(= '~');
/* Whether 'keymodel' contains "stopsel" and "startsel". */
EXTERN int km_stopsel INIT(= FALSE);
EXTERN int km_startsel INIT(= FALSE);
-EXTERN int cedit_key INIT(= -1); /* key value of 'cedit' option */
-EXTERN int cmdwin_type INIT(= 0); /* type of cmdline window or 0 */
-EXTERN int cmdwin_result INIT(= 0); /* result of cmdline window or 0 */
+EXTERN int cedit_key INIT(= -1); ///< key value of 'cedit' option
+EXTERN int cmdwin_type INIT(= 0); ///< type of cmdline window or 0
+EXTERN int cmdwin_result INIT(= 0); ///< result of cmdline window or 0
+EXTERN int cmdwin_level INIT(= 0); ///< cmdline recursion level
EXTERN char_u no_lines_msg[] INIT(= N_("--No lines in buffer--"));
@@ -1069,8 +897,8 @@ EXTERN int no_hlsearch INIT(= FALSE);
EXTERN linenr_T printer_page_num;
-EXTERN int typebuf_was_filled INIT(= FALSE); /* received text from client
- or from feedkeys() */
+EXTERN bool typebuf_was_filled INIT(= false); // received text from client
+ // or from feedkeys()
#ifdef BACKSLASH_IN_FILENAME
@@ -1079,9 +907,9 @@ EXTERN char psepcN INIT(= '/'); // abnormal path separator character
EXTERN char pseps[2] INIT(= { '\\', 0 }); // normal path separator string
#endif
-/* Set to TRUE when an operator is being executed with virtual editing, MAYBE
- * when no operator is being executed, FALSE otherwise. */
-EXTERN int virtual_op INIT(= MAYBE);
+// Set to kTrue when an operator is being executed with virtual editing
+// kNone when no operator is being executed, kFalse otherwise.
+EXTERN TriState virtual_op INIT(= kNone);
/* Display tick, incremented for each call to update_screen() */
EXTERN disptick_T display_tick INIT(= 0);
@@ -1090,10 +918,6 @@ EXTERN disptick_T display_tick INIT(= 0);
* cursor position in Insert mode. */
EXTERN linenr_T spell_redraw_lnum INIT(= 0);
-/* Set when the cursor line needs to be redrawn. */
-EXTERN int need_cursor_line_redraw INIT(= FALSE);
-
-
#ifdef USE_MCH_ERRMSG
// Grow array to collect error messages in until they can be displayed.
EXTERN garray_T error_ga INIT(= GA_EMPTY_INIT_VALUE);
@@ -1123,6 +947,7 @@ EXTERN char_u e_for[] INIT(= N_("E588: :endfor without :for"));
EXTERN char_u e_exists[] INIT(= N_("E13: File exists (add ! to override)"));
EXTERN char_u e_failed[] INIT(= N_("E472: Command failed"));
EXTERN char_u e_internal[] INIT(= N_("E473: Internal error"));
+EXTERN char_u e_intern2[] INIT(= N_("E685: Internal error: %s"));
EXTERN char_u e_interr[] INIT(= N_("Interrupted"));
EXTERN char_u e_invaddr[] INIT(= N_("E14: Invalid address"));
EXTERN char_u e_invarg[] INIT(= N_("E474: Invalid argument"));
@@ -1131,12 +956,20 @@ EXTERN char_u e_invexpr2[] INIT(= N_("E15: Invalid expression: %s"));
EXTERN char_u e_invrange[] INIT(= N_("E16: Invalid range"));
EXTERN char_u e_invcmd[] INIT(= N_("E476: Invalid command"));
EXTERN char_u e_isadir2[] INIT(= N_("E17: \"%s\" is a directory"));
-EXTERN char_u e_invjob[] INIT(= N_("E900: Invalid job id"));
+EXTERN char_u e_invchan[] INIT(= N_("E900: Invalid channel id"));
+EXTERN char_u e_invchanjob[] INIT(= N_("E900: Invalid channel id: not a job"));
EXTERN char_u e_jobtblfull[] INIT(= N_("E901: Job table is full"));
-EXTERN char_u e_jobexe[] INIT(= N_("E902: \"%s\" is not an executable"));
EXTERN char_u e_jobspawn[] INIT(= N_(
- "E903: Process for command \"%s\" could not be spawned"));
-EXTERN char_u e_jobnotpty[] INIT(= N_("E904: Job is not connected to a pty"));
+ "E903: Process failed to start: %s: \"%s\""));
+EXTERN char_u e_channotpty[] INIT(= N_("E904: channel is not a pty"));
+EXTERN char_u e_stdiochan2[] INIT(= N_(
+ "E905: Couldn't open stdio channel: %s"));
+EXTERN char_u e_invstream[] INIT(= N_("E906: invalid stream for channel"));
+EXTERN char_u e_invstreamrpc[] INIT(= N_(
+ "E906: invalid stream for rpc channel, use 'rpc'"));
+EXTERN char_u e_streamkey[] INIT(= N_(
+ "E5210: dict key '%s' already set for buffered stream in channel %"
+ PRIu64));
EXTERN char_u e_libcall[] INIT(= N_("E364: Library call failed for \"%s()\""));
EXTERN char_u e_mkdir[] INIT(= N_("E739: Cannot create directory %s: %s"));
EXTERN char_u e_markinval[] INIT(= N_("E19: Mark has invalid line number"));
@@ -1147,7 +980,6 @@ EXTERN char_u e_nesting[] INIT(= N_("E22: Scripts nested too deep"));
EXTERN char_u e_noalt[] INIT(= N_("E23: No alternate file"));
EXTERN char_u e_noabbr[] INIT(= N_("E24: No such abbreviation"));
EXTERN char_u e_nobang[] INIT(= N_("E477: No ! allowed"));
-EXTERN char_u e_nogvim[] INIT(= N_("E25: Nvim does not have a built-in GUI"));
EXTERN char_u e_nogroup[] INIT(= N_("E28: No such highlight group name: %s"));
EXTERN char_u e_noinstext[] INIT(= N_("E29: No inserted text yet"));
EXTERN char_u e_nolastcmd[] INIT(= N_("E30: No previous command line"));
@@ -1161,9 +993,9 @@ EXTERN char_u e_noprev[] INIT(= N_("E34: No previous command"));
EXTERN char_u e_noprevre[] INIT(= N_("E35: No previous regular expression"));
EXTERN char_u e_norange[] INIT(= N_("E481: No range allowed"));
EXTERN char_u e_noroom[] INIT(= N_("E36: Not enough room"));
-EXTERN char_u e_notcreate[] INIT(= N_("E482: Can't create file %s"));
EXTERN char_u e_notmp[] INIT(= N_("E483: Can't get temp file name"));
EXTERN char_u e_notopen[] INIT(= N_("E484: Can't open file %s"));
+EXTERN char_u e_notopen_2[] INIT(= N_("E484: Can't open file %s: %s"));
EXTERN char_u e_notread[] INIT(= N_("E485: Can't read file %s"));
EXTERN char_u e_nowrtmsg[] INIT(= N_(
"E37: No write since last change (add ! to override)"));
@@ -1183,11 +1015,7 @@ EXTERN char_u e_loclist[] INIT(= N_("E776: No location list"));
EXTERN char_u e_re_damg[] INIT(= N_("E43: Damaged match string"));
EXTERN char_u e_re_corr[] INIT(= N_("E44: Corrupted regexp program"));
EXTERN char_u e_readonly[] INIT(= N_(
- "E45: 'readonly' option is set (add ! to override)"));
-EXTERN char_u e_readonlyvar[] INIT(= N_(
- "E46: Cannot change read-only variable \"%s\""));
-EXTERN char_u e_readonlysbx[] INIT(= N_(
- "E794: Cannot set variable in the sandbox: \"%s\""));
+ "E45: 'readonly' option is set (add ! to override)"));
EXTERN char_u e_readerrf[] INIT(= N_("E47: Error while reading errorfile"));
EXTERN char_u e_sandbox[] INIT(= N_("E48: Not allowed in sandbox"));
EXTERN char_u e_secure[] INIT(= N_("E523: Not allowed here"));
@@ -1203,6 +1031,7 @@ EXTERN char_u e_longname[] INIT(= N_("E75: Name too long"));
EXTERN char_u e_toomsbra[] INIT(= N_("E76: Too many ["));
EXTERN char_u e_toomany[] INIT(= N_("E77: Too many file names"));
EXTERN char_u e_trailing[] INIT(= N_("E488: Trailing characters"));
+EXTERN char_u e_trailing2[] INIT(= N_("E488: Trailing characters: %s"));
EXTERN char_u e_umark[] INIT(= N_("E78: Unknown mark"));
EXTERN char_u e_wildexpand[] INIT(= N_("E79: Cannot expand wildcards"));
EXTERN char_u e_winheight[] INIT(= N_(
@@ -1210,9 +1039,9 @@ EXTERN char_u e_winheight[] INIT(= N_(
EXTERN char_u e_winwidth[] INIT(= N_(
"E592: 'winwidth' cannot be smaller than 'winminwidth'"));
EXTERN char_u e_write[] INIT(= N_("E80: Error while writing"));
-EXTERN char_u e_zerocount[] INIT(= N_("Zero count"));
-EXTERN char_u e_usingsid[] INIT(= N_("E81: Using <SID> not in a script context"));
-EXTERN char_u e_intern2[] INIT(= N_("E685: Internal error: %s"));
+EXTERN char_u e_zerocount[] INIT(= N_("E939: Positive count required"));
+EXTERN char_u e_usingsid[] INIT(= N_(
+ "E81: Using <SID> not in a script context"));
EXTERN char_u e_maxmempat[] INIT(= N_(
"E363: pattern uses more memory than 'maxmempattern'"));
EXTERN char_u e_emptybuf[] INIT(= N_("E749: empty buffer"));
@@ -1225,7 +1054,19 @@ EXTERN char_u e_notset[] INIT(= N_("E764: Option '%s' is not set"));
EXTERN char_u e_invalidreg[] INIT(= N_("E850: Invalid register name"));
EXTERN char_u e_dirnotf[] INIT(= N_(
"E919: Directory not found in '%s': \"%s\""));
+EXTERN char_u e_au_recursive[] INIT(= N_(
+ "E952: Autocommand caused recursive behavior"));
EXTERN char_u e_unsupportedoption[] INIT(= N_("E519: Option not supported"));
+EXTERN char_u e_fnametoolong[] INIT(= N_("E856: Filename too long"));
+EXTERN char_u e_float_as_string[] INIT(= N_("E806: using Float as a String"));
+EXTERN char_u e_autocmd_err[] INIT(=N_(
+ "E5500: autocmd has thrown an exception: %s"));
+EXTERN char_u e_cmdmap_err[] INIT(=N_(
+ "E5520: <Cmd> mapping must end with <CR>"));
+EXTERN char_u e_cmdmap_repeated[] INIT(=N_(
+ "E5521: <Cmd> mapping must end with <CR> before second <Cmd>"));
+EXTERN char_u e_cmdmap_key[] INIT(=N_(
+ "E5522: <Cmd> mapping must not include %s key"));
EXTERN char top_bot_msg[] INIT(= N_("search hit TOP, continuing at BOTTOM"));
@@ -1241,11 +1082,12 @@ EXTERN FILE *time_fd INIT(= NULL); /* where to write startup timing */
* can't do anything useful with the value. Assign to this variable to avoid
* the warning.
*/
-EXTERN int ignored;
-EXTERN char *ignoredp;
+EXTERN int vim_ignored;
-// If a msgpack-rpc channel should be started over stdin/stdout
+// Start a msgpack-rpc channel over stdin/stdout.
EXTERN bool embedded_mode INIT(= false);
+// Do not start a UI nor read/write to stdio (unless embedding).
+EXTERN bool headless_mode INIT(= false);
/// Used to track the status of external functions.
/// Currently only used for iconv().
@@ -1255,4 +1097,20 @@ typedef enum {
kBroken
} WorkingStatus;
+/// The scope of a working-directory command like `:cd`.
+///
+/// Scopes are enumerated from lowest to highest. When adding a scope make sure
+/// to update all functions using scopes as well, such as the implementation of
+/// `getcwd()`. When using scopes as limits (e.g. in loops) don't use the scopes
+/// directly, use `MIN_CD_SCOPE` and `MAX_CD_SCOPE` instead.
+typedef enum {
+ kCdScopeInvalid = -1,
+ kCdScopeWindow, ///< Affects one window.
+ kCdScopeTab, ///< Affects one tab page.
+ kCdScopeGlobal, ///< Affects the entire Nvim instance.
+} CdScope;
+
+#define MIN_CD_SCOPE kCdScopeWindow
+#define MAX_CD_SCOPE kCdScopeGlobal
+
#endif /* NVIM_GLOBALS_H */
diff --git a/src/nvim/grid_defs.h b/src/nvim/grid_defs.h
new file mode 100644
index 0000000000..37d85ead0c
--- /dev/null
+++ b/src/nvim/grid_defs.h
@@ -0,0 +1,59 @@
+#ifndef NVIM_GRID_DEFS_H
+#define NVIM_GRID_DEFS_H
+
+#include <stdint.h>
+
+#include "nvim/types.h"
+
+#define MAX_MCO 6 // maximum value for 'maxcombine'
+
+// The characters and attributes drawn on grids.
+typedef char_u schar_T[(MAX_MCO+1) * 4 + 1];
+typedef int16_t sattr_T;
+
+/// ScreenGrid represents a resizable rectuangular grid displayed by UI clients.
+///
+/// chars[] contains the UTF-8 text that is currently displayed on the grid.
+/// It is stored as a single block of cells. When redrawing a part of the grid,
+/// the new state can be compared with the existing state of the grid. This way
+/// we can avoid sending bigger updates than neccessary to the Ul layer.
+///
+/// Screen cells are stored as NUL-terminated UTF-8 strings, and a cell can
+/// contain up to MAX_MCO composing characters after the base character.
+/// The composing characters are to be drawn on top of the original character.
+/// The content after the NUL is not defined (so comparison must be done a
+/// single cell at a time). Double-width characters are stored in the left cell,
+/// and the right cell should only contain the empty string. When a part of the
+/// screen is cleared, the cells should be filled with a single whitespace char.
+///
+/// attrs[] contains the highlighting attribute for each cell.
+/// line_offset[n] is the offset from chars[] and attrs[] for the
+/// start of line 'n'. These offsets are in general not linear, as full screen
+/// scrolling is implemented by rotating the offsets in the line_offset array.
+/// line_wraps[] is an array of boolean flags indicating if the screen line
+/// wraps to the next line. It can only be true if a window occupies the entire
+/// screen width.
+typedef struct {
+ handle_T handle;
+
+ schar_T *chars;
+ sattr_T *attrs;
+ unsigned *line_offset;
+ char_u *line_wraps;
+
+ // the size of the allocated grid.
+ int Rows;
+ int Columns;
+
+ // offsets for the grid relative to the global screen
+ int row_offset;
+ int col_offset;
+
+ // grid size requested by the UI. Used for window grids only.
+ int requested_rows;
+ int requested_cols;
+
+ int was_resized;
+} ScreenGrid;
+
+#endif // NVIM_GRID_DEFS_H
diff --git a/src/nvim/hardcopy.c b/src/nvim/hardcopy.c
index 1c9b8e18ef..983dbb7bbe 100644
--- a/src/nvim/hardcopy.c
+++ b/src/nvim/hardcopy.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* hardcopy.c: printing to paper
*/
@@ -23,7 +26,6 @@
#include "nvim/memline.h"
#include "nvim/memory.h"
#include "nvim/message.h"
-#include "nvim/misc2.h"
#include "nvim/garray.h"
#include "nvim/option.h"
#include "nvim/path.h"
@@ -132,9 +134,9 @@ static int current_syn_id;
#define PRCOLOR_BLACK 0
#define PRCOLOR_WHITE 0xffffff
-static int curr_italic;
-static int curr_bold;
-static int curr_underline;
+static TriState curr_italic;
+static TriState curr_bold;
+static TriState curr_underline;
static uint32_t curr_bg;
static uint32_t curr_fg;
static int page_count;
@@ -270,17 +272,25 @@ char_u *parse_printmbfont(void)
* Returns an error message for an illegal option, NULL otherwise.
* Only used for the printer at the moment...
*/
-static char_u *parse_list_options(char_u *option_str, option_table_T *table, int table_size)
+static char_u *parse_list_options(char_u *option_str, option_table_T *table,
+ size_t table_size)
{
+ option_table_T *old_opts;
+ char_u *ret = NULL;
char_u *stringp;
char_u *colonp;
char_u *commap;
char_u *p;
- int idx = 0; /* init for GCC */
+ size_t idx = 0; // init for GCC
int len;
- for (idx = 0; idx < table_size; ++idx)
- table[idx].present = FALSE;
+ // Save the old values, so that they can be restored in case of an error.
+ old_opts = (option_table_T *)xmalloc(sizeof(option_table_T) * table_size);
+
+ for (idx = 0; idx < table_size; idx++) {
+ old_opts[idx] = table[idx];
+ table[idx].present = false;
+ }
/*
* Repeat for all comma separated parts.
@@ -288,8 +298,10 @@ static char_u *parse_list_options(char_u *option_str, option_table_T *table, int
stringp = option_str;
while (*stringp) {
colonp = vim_strchr(stringp, ':');
- if (colonp == NULL)
- return (char_u *)N_("E550: Missing colon");
+ if (colonp == NULL) {
+ ret = (char_u *)N_("E550: Missing colon");
+ break;
+ }
commap = vim_strchr(stringp, ',');
if (commap == NULL)
commap = option_str + STRLEN(option_str);
@@ -300,15 +312,19 @@ static char_u *parse_list_options(char_u *option_str, option_table_T *table, int
if (STRNICMP(stringp, table[idx].name, len) == 0)
break;
- if (idx == table_size)
- return (char_u *)N_("E551: Illegal component");
+ if (idx == table_size) {
+ ret = (char_u *)N_("E551: Illegal component");
+ break;
+ }
p = colonp + 1;
table[idx].present = TRUE;
if (table[idx].hasnum) {
- if (!ascii_isdigit(*p))
- return (char_u *)N_("E552: digit expected");
+ if (!ascii_isdigit(*p)) {
+ ret = (char_u *)N_("E552: digit expected");
+ break;
+ }
table[idx].number = getdigits_int(&p);
}
@@ -321,7 +337,15 @@ static char_u *parse_list_options(char_u *option_str, option_table_T *table, int
++stringp;
}
- return NULL;
+ if (ret != NULL) {
+ // Restore old options in case of error
+ for (idx = 0; idx < table_size; idx++) {
+ table[idx] = old_opts[idx];
+ }
+ }
+
+ xfree(old_opts);
+ return ret;
}
@@ -348,7 +372,6 @@ static void prt_get_attr(int hl_id, prt_text_attr_T *pattr, int modec)
{
int colorindex;
uint32_t fg_color;
- char *color;
pattr->bold = (highlight_has_attr(hl_id, HL_BOLD, modec) != NULL);
pattr->italic = (highlight_has_attr(hl_id, HL_ITALIC, modec) != NULL);
@@ -356,11 +379,12 @@ static void prt_get_attr(int hl_id, prt_text_attr_T *pattr, int modec)
pattr->undercurl = (highlight_has_attr(hl_id, HL_UNDERCURL, modec) != NULL);
{
- color = (char *)highlight_color(hl_id, (char_u *)"fg", modec);
- if (color == NULL)
+ const char *color = highlight_color(hl_id, "fg", modec);
+ if (color == NULL) {
colorindex = 0;
- else
+ } else {
colorindex = atoi(color);
+ }
if (colorindex >= 0 && colorindex < t_colors)
fg_color = prt_get_term_color(colorindex);
@@ -393,7 +417,8 @@ static void prt_set_bg(uint32_t bg)
}
}
-static void prt_set_font(int bold, int italic, int underline)
+static void prt_set_font(const TriState bold, const TriState italic,
+ const TriState underline)
{
if (curr_bold != bold
|| curr_italic != italic
@@ -405,34 +430,32 @@ static void prt_set_font(int bold, int italic, int underline)
}
}
-/*
- * Print the line number in the left margin.
- */
-static void prt_line_number(prt_settings_T *psettings, int page_line, linenr_T lnum)
+// Print the line number in the left margin.
+static void prt_line_number(prt_settings_T *const psettings,
+ const int page_line, const linenr_T lnum)
{
- int i;
- char_u tbuf[20];
-
prt_set_fg(psettings->number.fg_color);
prt_set_bg(psettings->number.bg_color);
prt_set_font(psettings->number.bold, psettings->number.italic,
- psettings->number.underline);
- mch_print_start_line(TRUE, page_line);
+ psettings->number.underline);
+ mch_print_start_line(true, page_line);
- /* Leave two spaces between the number and the text; depends on
- * PRINT_NUMBER_WIDTH. */
- sprintf((char *)tbuf, "%6ld", (long)lnum);
- for (i = 0; i < 6; i++)
+ // Leave two spaces between the number and the text; depends on
+ // PRINT_NUMBER_WIDTH.
+ char_u tbuf[20];
+ snprintf((char *)tbuf, sizeof(tbuf), "%6ld", (long)lnum);
+ for (int i = 0; i < 6; i++) {
(void)mch_print_text_out(&tbuf[i], 1);
+ }
- if (psettings->do_syntax)
- /* Set colors for next character. */
+ if (psettings->do_syntax) {
+ // Set colors for next character.
current_syn_id = -1;
- else {
- /* Set colors and font back to normal. */
+ } else {
+ // Set colors and font back to normal.
prt_set_fg(PRCOLOR_BLACK);
prt_set_bg(PRCOLOR_WHITE);
- prt_set_font(FALSE, FALSE, FALSE);
+ prt_set_font(kFalse, kFalse, kFalse);
}
}
@@ -475,22 +498,20 @@ int prt_get_unit(int idx)
return u;
}
-/*
- * Print the page header.
- */
-static void prt_header(prt_settings_T *psettings, int pagenum, linenr_T lnum)
+// Print the page header.
+static void prt_header(prt_settings_T *const psettings, const int pagenum,
+ const linenr_T lnum)
{
int width = psettings->chars_per_line;
- int page_line;
- char_u *tbuf;
- char_u *p;
- /* Also use the space for the line number. */
- if (prt_use_number())
+ // Also use the space for the line number.
+ if (prt_use_number()) {
width += PRINT_NUMBER_WIDTH;
+ }
assert(width >= 0);
- tbuf = xmalloc((size_t)width + IOSIZE);
+ const size_t tbuf_size = (size_t)width + IOSIZE;
+ char_u *tbuf = xmalloc(tbuf_size);
if (*p_header != NUL) {
linenr_T tmp_lnum, tmp_topline, tmp_botline;
@@ -519,38 +540,40 @@ static void prt_header(prt_settings_T *psettings, int pagenum, linenr_T lnum)
curwin->w_cursor.lnum = tmp_lnum;
curwin->w_topline = tmp_topline;
curwin->w_botline = tmp_botline;
- } else
- sprintf((char *)tbuf, _("Page %d"), pagenum);
+ } else {
+ snprintf((char *)tbuf, tbuf_size, _("Page %d"), pagenum);
+ }
prt_set_fg(PRCOLOR_BLACK);
prt_set_bg(PRCOLOR_WHITE);
- prt_set_font(TRUE, FALSE, FALSE);
+ prt_set_font(kTrue, kFalse, kFalse);
- /* Use a negative line number to indicate printing in the top margin. */
- page_line = 0 - prt_header_height();
- mch_print_start_line(TRUE, page_line);
- for (p = tbuf; *p != NUL; ) {
- int l = (*mb_ptr2len)(p);
+ // Use a negative line number to indicate printing in the top margin.
+ int page_line = 0 - prt_header_height();
+ mch_print_start_line(true, page_line);
+ for (char_u *p = tbuf; *p != NUL; ) {
+ const int l = (*mb_ptr2len)(p);
assert(l >= 0);
if (mch_print_text_out(p, (size_t)l)) {
- ++page_line;
- if (page_line >= 0) /* out of room in header */
+ page_line++;
+ if (page_line >= 0) { // out of room in header
break;
- mch_print_start_line(TRUE, page_line);
+ }
+ mch_print_start_line(true, page_line);
}
p += l;
}
xfree(tbuf);
- if (psettings->do_syntax)
- /* Set colors for next character. */
+ if (psettings->do_syntax) {
+ // Set colors for next character.
current_syn_id = -1;
- else {
- /* Set colors and font back to normal. */
+ } else {
+ // Set colors and font back to normal.
prt_set_fg(PRCOLOR_BLACK);
prt_set_bg(PRCOLOR_WHITE);
- prt_set_font(FALSE, FALSE, FALSE);
+ prt_set_font(kFalse, kFalse, kFalse);
}
}
@@ -559,8 +582,9 @@ static void prt_header(prt_settings_T *psettings, int pagenum, linenr_T lnum)
*/
static void prt_message(char_u *s)
{
- screen_fill((int)Rows - 1, (int)Rows, 0, (int)Columns, ' ', ' ', 0);
- screen_puts(s, (int)Rows - 1, 0, hl_attr(HLF_R));
+ grid_fill(&default_grid, (int)Rows - 1, (int)Rows, 0, (int)Columns, ' ', ' ',
+ 0);
+ grid_puts(&default_grid, s, (int)Rows - 1, 0, HL_ATTR(HLF_R));
ui_flush();
}
@@ -616,21 +640,19 @@ void ex_hardcopy(exarg_T *eap)
else
settings.do_syntax = settings.has_color;
- /* Set up printing attributes for line numbers */
+ // Set up printing attributes for line numbers
settings.number.fg_color = PRCOLOR_BLACK;
settings.number.bg_color = PRCOLOR_WHITE;
- settings.number.bold = FALSE;
- settings.number.italic = TRUE;
- settings.number.underline = FALSE;
- /*
- * Syntax highlighting of line numbers.
- */
- if (prt_use_number() && settings.do_syntax) {
- int id;
+ settings.number.bold = kFalse;
+ settings.number.italic = kTrue;
+ settings.number.underline = kFalse;
- id = syn_name2id((char_u *)"LineNr");
- if (id > 0)
+ // Syntax highlighting of line numbers.
+ if (prt_use_number() && settings.do_syntax) {
+ int id = syn_name2id((char_u *)"LineNr");
+ if (id > 0) {
id = syn_get_final_id(id);
+ }
prt_get_attr(id, &settings.number, settings.modec);
}
@@ -648,13 +670,13 @@ void ex_hardcopy(exarg_T *eap)
/* Set colors and font to normal. */
curr_bg = 0xffffffff;
curr_fg = 0xffffffff;
- curr_italic = MAYBE;
- curr_bold = MAYBE;
- curr_underline = MAYBE;
+ curr_italic = kNone;
+ curr_bold = kNone;
+ curr_underline = kNone;
prt_set_fg(PRCOLOR_BLACK);
prt_set_bg(PRCOLOR_WHITE);
- prt_set_font(FALSE, FALSE, FALSE);
+ prt_set_font(kFalse, kFalse, kFalse);
current_syn_id = -1;
jobsplit = (printer_opts[OPT_PRINT_JOBSPLIT].present
@@ -817,19 +839,17 @@ static colnr_T hardcopy_line(prt_settings_T *psettings, int page_line, prt_pos_T
tab_spaces = ppos->lead_spaces;
}
- mch_print_start_line(0, page_line);
+ mch_print_start_line(false, page_line);
line = ml_get(ppos->file_line);
/*
* Loop over the columns until the end of the file line or right margin.
*/
for (col = ppos->column; line[col] != NUL && !need_break; col += outputlen) {
- outputlen = 1;
- if (has_mbyte && (outputlen = (*mb_ptr2len)(line + col)) < 1)
+ if ((outputlen = (*mb_ptr2len)(line + col)) < 1) {
outputlen = 1;
- /*
- * syntax highlighting stuff.
- */
+ }
+ // syntax highlighting stuff.
if (psettings->do_syntax) {
id = syn_get_id(curwin, ppos->file_line, col, 1, NULL, FALSE);
if (id > 0)
@@ -873,10 +893,7 @@ static colnr_T hardcopy_line(prt_settings_T *psettings, int page_line, prt_pos_T
need_break = 1;
} else {
need_break = mch_print_text_out(line + col, (size_t)outputlen);
- if (has_mbyte)
- print_pos += (*mb_ptr2cells)(line + col);
- else
- print_pos++;
+ print_pos += utf_ptr2cells(line + col);
}
}
@@ -1244,8 +1261,8 @@ static int prt_do_moveto;
static int prt_need_font;
static int prt_font;
static int prt_need_underline;
-static int prt_underline;
-static int prt_do_underline;
+static TriState prt_underline;
+static TriState prt_do_underline;
static int prt_need_fgcol;
static uint32_t prt_fgcol;
static int prt_need_bgcol;
@@ -1523,8 +1540,8 @@ static int prt_find_resource(char *name, struct prt_ps_resource_S *resource)
/* Look for named resource file in runtimepath */
STRCPY(buffer, "print");
add_pathsep((char *)buffer);
- vim_strcat(buffer, (char_u *)name, MAXPATHL);
- vim_strcat(buffer, (char_u *)".ps", MAXPATHL);
+ xstrlcat((char *)buffer, name, MAXPATHL);
+ xstrlcat((char *)buffer, ".ps", MAXPATHL);
resource->filename[0] = NUL;
retval = (do_in_runtimepath(buffer, 0, prt_resource_name, resource->filename)
&& resource->filename[0] != NUL);
@@ -2106,7 +2123,7 @@ int mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit)
props = enc_canon_props(p_encoding);
if (!(props & ENC_8BIT) && ((*p_pmcs != NUL) || !(props & ENC_UNICODE))) {
p_mbenc_first = NULL;
- int effective_cmap;
+ int effective_cmap = 0;
for (cmap = 0; cmap < (int)ARRAY_SIZE(prt_ps_mbfonts); cmap++)
if (prt_match_encoding((char *)p_encoding, &prt_ps_mbfonts[cmap],
&p_mbenc)) {
@@ -2557,13 +2574,12 @@ int mch_print_begin(prt_settings_T *psettings)
prt_conv.vc_type = CONV_NONE;
if (!(enc_canon_props(p_enc) & enc_canon_props(p_encoding) & ENC_8BIT)) {
- /* Set up encoding conversion if required */
- if (FAIL == convert_setup(&prt_conv, p_enc, p_encoding)) {
- EMSG2(_("E620: Unable to convert to print encoding \"%s\""),
- p_encoding);
- return FALSE;
+ // Set up encoding conversion if required
+ if (convert_setup(&prt_conv, p_enc, p_encoding) == FAIL) {
+ emsgf(_("E620: Unable to convert to print encoding \"%s\""),
+ p_encoding);
+ return false;
}
- prt_do_conv = TRUE;
}
prt_do_conv = prt_conv.vc_type != CONV_NONE;
@@ -2834,7 +2850,7 @@ int mch_print_begin_page(char_u *str)
/* We have reset the font attributes, force setting them again. */
curr_bg = 0xffffffff;
curr_fg = 0xffffffff;
- curr_bold = MAYBE;
+ curr_bold = kNone;
return !prt_file_error;
}
@@ -2847,11 +2863,12 @@ int mch_print_blank_page(void)
static double prt_pos_x = 0;
static double prt_pos_y = 0;
-void mch_print_start_line(int margin, int page_line)
+void mch_print_start_line(const bool margin, const int page_line)
{
prt_pos_x = prt_left_margin;
- if (margin)
+ if (margin) {
prt_pos_x -= prt_number_width;
+ }
prt_pos_y = prt_top_margin - prt_first_line_height -
page_line * prt_line_height;
@@ -2861,17 +2878,13 @@ void mch_print_start_line(int margin, int page_line)
prt_half_width = FALSE;
}
-int mch_print_text_out(char_u *p, size_t len)
+int mch_print_text_out(char_u *const textp, size_t len)
{
- int need_break;
+ char_u *p = textp;
char_u ch;
char_u ch_buff[8];
- double char_width;
- double next_pos;
- int in_ascii;
- int half_width;
-
- char_width = prt_char_width;
+ char_u *tofree = NULL;
+ double char_width = prt_char_width;
/* Ideally VIM would create a rearranged CID font to combine a Roman and
* CJKV font to do what VIM is doing here - use a Roman font for characters
@@ -2881,7 +2894,7 @@ int mch_print_text_out(char_u *p, size_t len)
* years! If they ever do, a lot of this code will disappear.
*/
if (prt_use_courier) {
- in_ascii = (len == 1 && *p < 0x80);
+ const bool in_ascii = (len == 1 && *p < 0x80);
if (prt_in_ascii) {
if (!in_ascii) {
/* No longer in ASCII range - need to switch font */
@@ -2897,9 +2910,10 @@ int mch_print_text_out(char_u *p, size_t len)
}
}
if (prt_out_mbyte) {
- half_width = ((*mb_ptr2cells)(p) == 1);
- if (half_width)
+ const bool half_width = (utf_ptr2cells(p) == 1);
+ if (half_width) {
char_width /= 2;
+ }
if (prt_half_width) {
if (!half_width) {
prt_half_width = FALSE;
@@ -2972,23 +2986,24 @@ int mch_print_text_out(char_u *p, size_t len)
}
if (prt_do_conv) {
- /* Convert from multi-byte to 8-bit encoding */
- p = string_convert(&prt_conv, p, &len);
- if (p == NULL)
- p = (char_u *)xstrdup("");
+ // Convert from multi-byte to 8-bit encoding
+ tofree = p = string_convert(&prt_conv, p, &len);
+ if (p == NULL) {
+ p = (char_u *)"";
+ len = 0;
+ }
}
if (prt_out_mbyte) {
- /* Multi-byte character strings are represented more efficiently as hex
- * strings when outputting clean 8 bit PS.
- */
- do {
+ // Multi-byte character strings are represented more efficiently as hex
+ // strings when outputting clean 8 bit PS.
+ while (len-- > 0) {
ch = prt_hexchar[(unsigned)(*p) >> 4];
ga_append(&prt_ps_buffer, (char)ch);
ch = prt_hexchar[(*p) & 0xf];
ga_append(&prt_ps_buffer, (char)ch);
p++;
- } while (--len);
+ }
} else {
/* Add next character to buffer of characters to output.
* Note: One printed character may require several PS characters to
@@ -3022,25 +3037,26 @@ int mch_print_text_out(char_u *p, size_t len)
ga_append(&prt_ps_buffer, (char)ch);
}
- /* Need to free any translated characters */
- if (prt_do_conv)
- xfree(p);
+ // Need to free any translated characters
+ xfree(tofree);
prt_text_run += char_width;
prt_pos_x += char_width;
// The downside of fp - use relative error on right margin check
- next_pos = prt_pos_x + prt_char_width;
- need_break = ((next_pos > prt_right_margin)
- && ((next_pos - prt_right_margin) > (prt_right_margin * 1e-5)));
+ const double next_pos = prt_pos_x + prt_char_width;
+ const bool need_break = (next_pos > prt_right_margin)
+ && ((next_pos - prt_right_margin) > (prt_right_margin * 1e-5));
- if (need_break)
+ if (need_break) {
prt_flush_buffer();
+ }
return need_break;
}
-void mch_print_set_font(int iBold, int iItalic, int iUnderline)
+void mch_print_set_font(const TriState iBold, const TriState iItalic,
+ const TriState iUnderline)
{
int font = 0;
diff --git a/src/nvim/hardcopy.h b/src/nvim/hardcopy.h
index 4ead8dd5d4..c6a3321b08 100644
--- a/src/nvim/hardcopy.h
+++ b/src/nvim/hardcopy.h
@@ -2,6 +2,11 @@
#define NVIM_HARDCOPY_H
#include <stdint.h>
+#include <stdlib.h> // for size_t
+
+#include "nvim/globals.h" // for TriState
+#include "nvim/types.h" // for char_u
+#include "nvim/ex_cmds_defs.h" // for exarg_T
/*
* Structure to hold printing color and font attributes.
@@ -9,9 +14,9 @@
typedef struct {
uint32_t fg_color;
uint32_t bg_color;
- int bold;
- int italic;
- int underline;
+ TriState bold;
+ TriState italic;
+ TriState underline;
int undercurl;
} prt_text_attr_T;
diff --git a/src/nvim/hashtab.c b/src/nvim/hashtab.c
index 2da937633e..526bc284a4 100644
--- a/src/nvim/hashtab.c
+++ b/src/nvim/hashtab.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/// @file hashtab.c
///
/// Handling of a hashtable with Vim-specific properties.
@@ -28,7 +31,6 @@
#include "nvim/hashtab.h"
#include "nvim/message.h"
#include "nvim/memory.h"
-#include "nvim/misc2.h"
// Magic value for algorithm that walks through the array.
#define PERTURB_SHIFT 5
@@ -37,6 +39,8 @@
# include "hashtab.c.generated.h"
#endif
+char hash_removed;
+
/// Initialize an empty hash table.
void hash_init(hashtab_T *ht)
{
@@ -81,22 +85,43 @@ void hash_clear_all(hashtab_T *ht, unsigned int off)
/// used for that key.
/// WARNING: Returned pointer becomes invalid as soon as the hash table
/// is changed in any way.
-hashitem_T* hash_find(hashtab_T *ht, char_u *key)
+hashitem_T *hash_find(const hashtab_T *const ht, const char_u *const key)
{
- return hash_lookup(ht, key, hash_hash(key));
+ return hash_lookup(ht, (const char *)key, STRLEN(key), hash_hash(key));
+}
+
+/// Like hash_find, but key is not NUL-terminated
+///
+/// @param[in] ht Hashtab to look in.
+/// @param[in] key Key of the looked-for item. Must not be NULL.
+/// @param[in] len Key length.
+///
+/// @return Pointer to the hash item corresponding to the given key.
+/// If not found, then return pointer to the empty item that would be
+/// used for that key.
+///
+/// @warning Returned pointer becomes invalid as soon as the hash table
+/// is changed in any way.
+hashitem_T *hash_find_len(const hashtab_T *const ht, const char *const key,
+ const size_t len)
+{
+ return hash_lookup(ht, key, len, hash_hash_len(key, len));
}
/// Like hash_find(), but caller computes "hash".
///
-/// @param key The key of the looked-for item. Must not be NULL.
-/// @param hash The precomputed hash for the key.
+/// @param[in] key The key of the looked-for item. Must not be NULL.
+/// @param[in] key_len Key length.
+/// @param[in] hash The precomputed hash for the key.
///
/// @return Pointer to the hashitem corresponding to the given key.
/// If not found, then return pointer to the empty item that would be
/// used for that key.
/// WARNING: Returned pointer becomes invalid as soon as the hash table
/// is changed in any way.
-hashitem_T* hash_lookup(hashtab_T *ht, char_u *key, hash_T hash)
+hashitem_T *hash_lookup(const hashtab_T *const ht,
+ const char *const key, const size_t key_len,
+ const hash_T hash)
{
#ifdef HT_DEBUG
hash_count_lookup++;
@@ -116,7 +141,9 @@ hashitem_T* hash_lookup(hashtab_T *ht, char_u *key, hash_T hash)
hashitem_T *freeitem = NULL;
if (hi->hi_key == HI_KEY_REMOVED) {
freeitem = hi;
- } else if ((hi->hi_hash == hash) && (STRCMP(hi->hi_key, key) == 0)) {
+ } else if ((hi->hi_hash == hash)
+ && (STRNCMP(hi->hi_key, key, key_len) == 0)
+ && hi->hi_key[key_len] == NUL) {
return hi;
}
@@ -141,7 +168,8 @@ hashitem_T* hash_lookup(hashtab_T *ht, char_u *key, hash_T hash)
if ((hi->hi_hash == hash)
&& (hi->hi_key != HI_KEY_REMOVED)
- && (STRCMP(hi->hi_key, key) == 0)) {
+ && (STRNCMP(hi->hi_key, key, key_len) == 0)
+ && hi->hi_key[key_len] == NUL) {
return hi;
}
@@ -178,9 +206,9 @@ void hash_debug_results(void)
int hash_add(hashtab_T *ht, char_u *key)
{
hash_T hash = hash_hash(key);
- hashitem_T *hi = hash_lookup(ht, key, hash);
+ hashitem_T *hi = hash_lookup(ht, (const char *)key, STRLEN(key), hash);
if (!HASHITEM_EMPTY(hi)) {
- EMSG2(_(e_intern2), "hash_add()");
+ internal_error("hash_add()");
return FAIL;
}
hash_add_item(ht, hi, key, hash);
@@ -358,27 +386,68 @@ static void hash_may_resize(hashtab_T *ht, size_t minitems)
ht->ht_filled = ht->ht_used;
}
+#define HASH_CYCLE_BODY(hash, p) \
+ hash = hash * 101 + *p++
+
/// Get the hash number for a key.
///
/// If you think you know a better hash function: Compile with HT_DEBUG set and
/// run a script that uses hashtables a lot. Vim will then print statistics
/// when exiting. Try that with the current hash algorithm and yours. The
/// lower the percentage the better.
-hash_T hash_hash(char_u *key)
+hash_T hash_hash(const char_u *key)
{
hash_T hash = *key;
if (hash == 0) {
- // Empty keys are not allowed, but we don't want to crash if we get one.
- return (hash_T) 0;
+ return (hash_T)0;
}
// A simplistic algorithm that appears to do very well.
// Suggested by George Reilly.
- char_u *p = key + 1;
+ const uint8_t *p = key + 1;
while (*p != NUL) {
- hash = hash * 101 + *p++;
+ HASH_CYCLE_BODY(hash, p);
+ }
+
+ return hash;
+}
+
+/// Get the hash number for a key that is not a NUL-terminated string
+///
+/// @warning Function does not check whether key contains NUL. But you will not
+/// be able to get hash entry in this case.
+///
+/// @param[in] key Key.
+/// @param[in] len Key length.
+///
+/// @return Key hash.
+hash_T hash_hash_len(const char *key, const size_t len)
+ FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ if (len == 0) {
+ return 0;
+ }
+
+ hash_T hash = *(uint8_t *)key;
+ const uint8_t *end = (uint8_t *)key + len;
+
+ const uint8_t *p = (const uint8_t *)key + 1;
+ while (p < end) {
+ HASH_CYCLE_BODY(hash, p);
}
return hash;
}
+
+#undef HASH_CYCLE_BODY
+
+/// Function to get HI_KEY_REMOVED value
+///
+/// Used for testing because luajit ffi does not allow getting addresses of
+/// globals.
+const char_u *_hash_key_removed(void)
+ FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ return HI_KEY_REMOVED;
+}
diff --git a/src/nvim/hashtab.h b/src/nvim/hashtab.h
index 7233d8c47c..973b97d476 100644
--- a/src/nvim/hashtab.h
+++ b/src/nvim/hashtab.h
@@ -5,14 +5,19 @@
#include "nvim/types.h"
+/// Magic number used for hashitem "hi_key" value indicating a deleted item
+///
+/// Only the address is used.
+extern char hash_removed;
+
/// Type for hash number (hash calculation result).
typedef size_t hash_T;
/// The address of "hash_removed" is used as a magic number
/// for hi_key to indicate a removed item.
-#define HI_KEY_REMOVED &hash_removed
+#define HI_KEY_REMOVED ((char_u *)&hash_removed)
#define HASHITEM_EMPTY(hi) ((hi)->hi_key == NULL \
- || (hi)->hi_key == &hash_removed)
+ || (hi)->hi_key == (char_u *)&hash_removed)
/// A hastable item.
///
@@ -65,6 +70,25 @@ typedef struct hashtable_S {
hashitem_T ht_smallarray[HT_INIT_SIZE]; /// initial array
} hashtab_T;
+/// Iterate over a hashtab
+///
+/// @param[in] ht Hashtab to iterate over.
+/// @param hi Name of the variable with current hashtab entry.
+/// @param code Cycle body.
+#define HASHTAB_ITER(ht, hi, code) \
+ do { \
+ hashtab_T *const hi##ht_ = (ht); \
+ size_t hi##todo_ = hi##ht_->ht_used; \
+ for (hashitem_T *hi = hi##ht_->ht_array; hi##todo_; hi++) { \
+ if (!HASHITEM_EMPTY(hi)) { \
+ { \
+ code \
+ } \
+ hi##todo_--; \
+ } \
+ } \
+ } while (0)
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "hashtab.h.generated.h"
#endif
diff --git a/src/nvim/highlight.c b/src/nvim/highlight.c
new file mode 100644
index 0000000000..41d60fa3ea
--- /dev/null
+++ b/src/nvim/highlight.c
@@ -0,0 +1,416 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+// highlight.c: low level code for UI and syntax highlighting
+
+#include "nvim/vim.h"
+#include "nvim/highlight.h"
+#include "nvim/highlight_defs.h"
+#include "nvim/map.h"
+#include "nvim/screen.h"
+#include "nvim/syntax.h"
+#include "nvim/ui.h"
+#include "nvim/api/private/defs.h"
+#include "nvim/api/private/helpers.h"
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "highlight.c.generated.h"
+#endif
+
+static bool hlstate_active = false;
+
+static kvec_t(HlEntry) attr_entries = KV_INITIAL_VALUE;
+
+static Map(HlEntry, int) *attr_entry_ids;
+static Map(int, int) *combine_attr_entries;
+
+void highlight_init(void)
+{
+ attr_entry_ids = map_new(HlEntry, int)();
+ combine_attr_entries = map_new(int, int)();
+
+ // index 0 is no attribute, add dummy entry:
+ kv_push(attr_entries, ((HlEntry){ .attr = HLATTRS_INIT, .kind = kHlUnknown,
+ .id1 = 0, .id2 = 0 }));
+}
+
+/// @return TRUE if hl table was reset
+bool highlight_use_hlstate(void)
+{
+ if (hlstate_active) {
+ return false;
+ }
+ hlstate_active = true;
+ // hl tables must now be rebuilt.
+ clear_hl_tables(true);
+ return true;
+}
+
+/// Return the attr number for a set of colors and font, and optionally
+/// a semantic description (see ext_hlstate documentation).
+/// Add a new entry to the attr_entries array if the combination is new.
+/// @return 0 for error.
+static int get_attr_entry(HlEntry entry)
+{
+ if (!hlstate_active) {
+ // This information will not be used, erase it and reduce the table size.
+ entry.kind = kHlUnknown;
+ entry.id1 = 0;
+ entry.id2 = 0;
+ }
+
+ int id = map_get(HlEntry, int)(attr_entry_ids, entry);
+ if (id > 0) {
+ return id;
+ }
+
+ static bool recursive = false;
+ if (kv_size(attr_entries) > MAX_TYPENR) {
+ // Running out of attribute entries! remove all attributes, and
+ // compute new ones for all groups.
+ // When called recursively, we are really out of numbers.
+ if (recursive) {
+ EMSG(_("E424: Too many different highlighting attributes in use"));
+ return 0;
+ }
+ recursive = true;
+
+ clear_hl_tables(true);
+
+ recursive = false;
+ if (entry.kind == kHlCombine) {
+ // This entry is now invalid, don't put it
+ return 0;
+ }
+ }
+
+ id = (int)kv_size(attr_entries);
+ kv_push(attr_entries, entry);
+
+ map_put(HlEntry, int)(attr_entry_ids, entry, id);
+
+ Array inspect = hl_inspect(id);
+
+ // Note: internally we don't distinguish between cterm and rgb attributes,
+ // remote_ui_hl_attr_define will however.
+ ui_call_hl_attr_define(id, entry.attr, entry.attr, inspect);
+ api_free_array(inspect);
+ return id;
+}
+
+/// When a UI connects, we need to send it the table of highlights used so far.
+void ui_send_all_hls(UI *ui)
+{
+ for (size_t i = 1; i < kv_size(attr_entries); i++) {
+ Array inspect = hl_inspect((int)i);
+ ui->hl_attr_define(ui, (Integer)i, kv_A(attr_entries, i).attr,
+ kv_A(attr_entries, i).attr, inspect);
+ api_free_array(inspect);
+ }
+}
+
+/// Get attribute code for a syntax group.
+int hl_get_syn_attr(int idx, HlAttrs at_en)
+{
+ // TODO(bfredl): should we do this unconditionally
+ if (at_en.cterm_fg_color != 0 || at_en.cterm_bg_color != 0
+ || at_en.rgb_fg_color != -1 || at_en.rgb_bg_color != -1
+ || at_en.rgb_sp_color != -1 || at_en.cterm_ae_attr != 0
+ || at_en.rgb_ae_attr != 0) {
+ return get_attr_entry((HlEntry){ .attr = at_en, .kind = kHlSyntax,
+ .id1 = idx, .id2 = 0 });
+ } else {
+ // If all the fields are cleared, clear the attr field back to default value
+ return 0;
+ }
+}
+
+/// Get attribute code for a builtin highlight group.
+///
+/// The final syntax group could be modified by hi-link or 'winhighlight'.
+int hl_get_ui_attr(int idx, int final_id, bool optional)
+{
+ HlAttrs attrs = HLATTRS_INIT;
+ bool available = false;
+
+ int syn_attr = syn_id2attr(final_id);
+ if (syn_attr != 0) {
+ attrs = syn_attr2entry(syn_attr);
+ available = true;
+ }
+ if (optional && !available) {
+ return 0;
+ }
+ return get_attr_entry((HlEntry){ .attr = attrs, .kind = kHlUI,
+ .id1 = idx, .id2 = final_id });
+}
+
+void update_window_hl(win_T *wp, bool invalid)
+{
+ if (!wp->w_hl_needs_update && !invalid) {
+ return;
+ }
+ wp->w_hl_needs_update = false;
+
+ // determine window specific background set in 'winhighlight'
+ if (wp != curwin && wp->w_hl_ids[HLF_INACTIVE] > 0) {
+ wp->w_hl_attr_normal = hl_get_ui_attr(HLF_INACTIVE,
+ wp->w_hl_ids[HLF_INACTIVE], true);
+ } else if (wp->w_hl_id_normal > 0) {
+ wp->w_hl_attr_normal = hl_get_ui_attr(-1, wp->w_hl_id_normal, true);
+ } else {
+ wp->w_hl_attr_normal = 0;
+ }
+ if (wp != curwin) {
+ wp->w_hl_attr_normal = hl_combine_attr(HL_ATTR(HLF_INACTIVE),
+ wp->w_hl_attr_normal);
+ }
+
+ for (int hlf = 0; hlf < (int)HLF_COUNT; hlf++) {
+ int attr;
+ if (wp->w_hl_ids[hlf] > 0) {
+ attr = hl_get_ui_attr(hlf, wp->w_hl_ids[hlf], false);
+ } else {
+ attr = HL_ATTR(hlf);
+ }
+ wp->w_hl_attrs[hlf] = attr;
+ }
+}
+
+/// Gets HL_UNDERLINE highlight.
+int hl_get_underline(void)
+{
+ return get_attr_entry((HlEntry){
+ .attr = (HlAttrs){
+ .cterm_ae_attr = (int16_t)HL_UNDERLINE,
+ .cterm_fg_color = 0,
+ .cterm_bg_color = 0,
+ .rgb_ae_attr = (int16_t)HL_UNDERLINE,
+ .rgb_fg_color = -1,
+ .rgb_bg_color = -1,
+ .rgb_sp_color = -1,
+ },
+ .kind = kHlUI,
+ .id1 = 0,
+ .id2 = 0,
+ });
+}
+
+/// Get attribute code for forwarded :terminal highlights.
+int hl_get_term_attr(HlAttrs *aep)
+{
+ return get_attr_entry((HlEntry){ .attr= *aep, .kind = kHlTerminal,
+ .id1 = 0, .id2 = 0 });
+}
+
+/// Clear all highlight tables.
+void clear_hl_tables(bool reinit)
+{
+ if (reinit) {
+ kv_size(attr_entries) = 1;
+ map_clear(HlEntry, int)(attr_entry_ids);
+ map_clear(int, int)(combine_attr_entries);
+ highlight_attr_set_all();
+ highlight_changed();
+ screen_invalidate_highlights();
+ } else {
+ kv_destroy(attr_entries);
+ map_free(HlEntry, int)(attr_entry_ids);
+ map_free(int, int)(combine_attr_entries);
+ }
+}
+
+// Combine special attributes (e.g., for spelling) with other attributes
+// (e.g., for syntax highlighting).
+// "prim_attr" overrules "char_attr".
+// This creates a new group when required.
+// Since we expect there to be few spelling mistakes we don't cache the
+// result.
+// Return the resulting attributes.
+int hl_combine_attr(int char_attr, int prim_attr)
+{
+ if (char_attr == 0) {
+ return prim_attr;
+ } else if (prim_attr == 0) {
+ return char_attr;
+ }
+
+ // TODO(bfredl): could use a struct for clearer intent.
+ int combine_tag = (char_attr << 16) + prim_attr;
+ int id = map_get(int, int)(combine_attr_entries, combine_tag);
+ if (id > 0) {
+ return id;
+ }
+
+ HlAttrs char_aep = syn_attr2entry(char_attr);
+ HlAttrs spell_aep = syn_attr2entry(prim_attr);
+
+ // start with low-priority attribute, and override colors if present below.
+ HlAttrs new_en = char_aep;
+
+ new_en.cterm_ae_attr |= spell_aep.cterm_ae_attr;
+ new_en.rgb_ae_attr |= spell_aep.rgb_ae_attr;
+
+ if (spell_aep.cterm_fg_color > 0) {
+ new_en.cterm_fg_color = spell_aep.cterm_fg_color;
+ }
+
+ if (spell_aep.cterm_bg_color > 0) {
+ new_en.cterm_bg_color = spell_aep.cterm_bg_color;
+ }
+
+ if (spell_aep.rgb_fg_color >= 0) {
+ new_en.rgb_fg_color = spell_aep.rgb_fg_color;
+ }
+
+ if (spell_aep.rgb_bg_color >= 0) {
+ new_en.rgb_bg_color = spell_aep.rgb_bg_color;
+ }
+
+ if (spell_aep.rgb_sp_color >= 0) {
+ new_en.rgb_sp_color = spell_aep.rgb_sp_color;
+ }
+
+ id = get_attr_entry((HlEntry){ .attr = new_en, .kind = kHlCombine,
+ .id1 = char_attr, .id2 = prim_attr });
+ if (id > 0) {
+ map_put(int, int)(combine_attr_entries, combine_tag, id);
+ }
+
+ return id;
+}
+
+/// Get highlight attributes for a attribute code
+HlAttrs syn_attr2entry(int attr)
+{
+ if (attr <= 0 || attr >= (int)kv_size(attr_entries)) {
+ // invalid attribute code, or the tables were cleared
+ return HLATTRS_INIT;
+ }
+ return kv_A(attr_entries, attr).attr;
+}
+
+/// Gets highlight description for id `attr_id` as a map.
+Dictionary hl_get_attr_by_id(Integer attr_id, Boolean rgb, Error *err)
+{
+ Dictionary dic = ARRAY_DICT_INIT;
+
+ if (attr_id == 0) {
+ return dic;
+ }
+
+ if (attr_id <= 0 || attr_id >= (int)kv_size(attr_entries)) {
+ api_set_error(err, kErrorTypeException,
+ "Invalid attribute id: %" PRId64, attr_id);
+ return dic;
+ }
+
+ return hlattrs2dict(syn_attr2entry((int)attr_id), rgb);
+}
+
+/// Converts an HlAttrs into Dictionary
+///
+/// @param[in] aep data to convert
+/// @param use_rgb use 'gui*' settings if true, else resorts to 'cterm*'
+Dictionary hlattrs2dict(HlAttrs ae, bool use_rgb)
+{
+ Dictionary hl = ARRAY_DICT_INIT;
+ int mask = use_rgb ? ae.rgb_ae_attr : ae.cterm_ae_attr;
+
+ if (mask & HL_BOLD) {
+ PUT(hl, "bold", BOOLEAN_OBJ(true));
+ }
+
+ if (mask & HL_STANDOUT) {
+ PUT(hl, "standout", BOOLEAN_OBJ(true));
+ }
+
+ if (mask & HL_UNDERLINE) {
+ PUT(hl, "underline", BOOLEAN_OBJ(true));
+ }
+
+ if (mask & HL_UNDERCURL) {
+ PUT(hl, "undercurl", BOOLEAN_OBJ(true));
+ }
+
+ if (mask & HL_ITALIC) {
+ PUT(hl, "italic", BOOLEAN_OBJ(true));
+ }
+
+ if (mask & HL_INVERSE) {
+ PUT(hl, "reverse", BOOLEAN_OBJ(true));
+ }
+
+ if (use_rgb) {
+ if (ae.rgb_fg_color != -1) {
+ PUT(hl, "foreground", INTEGER_OBJ(ae.rgb_fg_color));
+ }
+
+ if (ae.rgb_bg_color != -1) {
+ PUT(hl, "background", INTEGER_OBJ(ae.rgb_bg_color));
+ }
+
+ if (ae.rgb_sp_color != -1) {
+ PUT(hl, "special", INTEGER_OBJ(ae.rgb_sp_color));
+ }
+ } else {
+ if (cterm_normal_fg_color != ae.cterm_fg_color) {
+ PUT(hl, "foreground", INTEGER_OBJ(ae.cterm_fg_color - 1));
+ }
+
+ if (cterm_normal_bg_color != ae.cterm_bg_color) {
+ PUT(hl, "background", INTEGER_OBJ(ae.cterm_bg_color - 1));
+ }
+ }
+
+ return hl;
+}
+
+Array hl_inspect(int attr)
+{
+ Array ret = ARRAY_DICT_INIT;
+ if (hlstate_active) {
+ hl_inspect_impl(&ret, attr);
+ }
+ return ret;
+}
+
+static void hl_inspect_impl(Array *arr, int attr)
+{
+ Dictionary item = ARRAY_DICT_INIT;
+ if (attr <= 0 || attr >= (int)kv_size(attr_entries)) {
+ return;
+ }
+
+ HlEntry e = kv_A(attr_entries, attr);
+ switch (e.kind) {
+ case kHlSyntax:
+ PUT(item, "kind", STRING_OBJ(cstr_to_string("syntax")));
+ PUT(item, "hi_name",
+ STRING_OBJ(cstr_to_string((char *)syn_id2name(e.id1))));
+ break;
+
+ case kHlUI:
+ PUT(item, "kind", STRING_OBJ(cstr_to_string("ui")));
+ const char *ui_name = (e.id1 == -1) ? "Normal" : hlf_names[e.id1];
+ PUT(item, "ui_name", STRING_OBJ(cstr_to_string(ui_name)));
+ PUT(item, "hi_name",
+ STRING_OBJ(cstr_to_string((char *)syn_id2name(e.id2))));
+ break;
+
+ case kHlTerminal:
+ PUT(item, "kind", STRING_OBJ(cstr_to_string("term")));
+ break;
+
+ case kHlCombine:
+ // attribute combination is associative, so flatten to an array
+ hl_inspect_impl(arr, e.id1);
+ hl_inspect_impl(arr, e.id2);
+ return;
+
+ case kHlUnknown:
+ return;
+ }
+ PUT(item, "id", INTEGER_OBJ(attr));
+ ADD(*arr, DICTIONARY_OBJ(item));
+}
diff --git a/src/nvim/highlight.h b/src/nvim/highlight.h
new file mode 100644
index 0000000000..6be0d6200b
--- /dev/null
+++ b/src/nvim/highlight.h
@@ -0,0 +1,13 @@
+#ifndef NVIM_HIGHLIGHT_H
+#define NVIM_HIGHLIGHT_H
+
+#include <stdbool.h>
+#include "nvim/highlight_defs.h"
+#include "nvim/api/private/defs.h"
+#include "nvim/ui.h"
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "highlight.h.generated.h"
+#endif
+
+#endif // NVIM_HIGHLIGHT_H
diff --git a/src/nvim/highlight_defs.h b/src/nvim/highlight_defs.h
new file mode 100644
index 0000000000..40025fcbbb
--- /dev/null
+++ b/src/nvim/highlight_defs.h
@@ -0,0 +1,172 @@
+#ifndef NVIM_HIGHLIGHT_DEFS_H
+#define NVIM_HIGHLIGHT_DEFS_H
+
+#include <inttypes.h>
+
+#include "nvim/macros.h"
+
+typedef int32_t RgbValue;
+
+/// Highlighting attribute bits.
+///
+/// sign bit should not be used here, as it identifies invalid highlight
+typedef enum {
+ HL_INVERSE = 0x01,
+ HL_BOLD = 0x02,
+ HL_ITALIC = 0x04,
+ HL_UNDERLINE = 0x08,
+ HL_UNDERCURL = 0x10,
+ HL_STANDOUT = 0x20,
+} HlAttrFlags;
+
+/// Stores a complete highlighting entry, including colors and attributes
+/// for both TUI and GUI.
+typedef struct attr_entry {
+ int16_t rgb_ae_attr, cterm_ae_attr; ///< HlAttrFlags
+ RgbValue rgb_fg_color, rgb_bg_color, rgb_sp_color;
+ int cterm_fg_color, cterm_bg_color;
+} HlAttrs;
+
+#define HLATTRS_INIT (HlAttrs) { \
+ .rgb_ae_attr = 0, \
+ .cterm_ae_attr = 0, \
+ .rgb_fg_color = -1, \
+ .rgb_bg_color = -1, \
+ .rgb_sp_color = -1, \
+ .cterm_fg_color = 0, \
+ .cterm_bg_color = 0, \
+}
+
+/// Values for index in highlight_attr[].
+/// When making changes, also update hlf_names below!
+typedef enum {
+ HLF_8 = 0 // Meta & special keys listed with ":map", text that is
+ // displayed different from what it is
+ , HLF_EOB // after the last line in the buffer
+ , HLF_TERM // terminal cursor focused
+ , HLF_TERMNC // terminal cursor unfocused
+ , HLF_AT // @ characters at end of screen, characters that
+ // don't really exist in the text
+ , HLF_D // directories in CTRL-D listing
+ , HLF_E // error messages
+ , HLF_I // incremental search
+ , HLF_L // last search string
+ , HLF_M // "--More--" message
+ , HLF_CM // Mode (e.g., "-- INSERT --")
+ , HLF_N // line number for ":number" and ":#" commands
+ , HLF_CLN // current line number
+ , HLF_R // return to continue message and yes/no questions
+ , HLF_S // status lines
+ , HLF_SNC // status lines of not-current windows
+ , HLF_C // column to separate vertically split windows
+ , HLF_T // Titles for output from ":set all", ":autocmd" etc.
+ , HLF_V // Visual mode
+ , HLF_VNC // Visual mode, autoselecting and not clipboard owner
+ , HLF_W // warning messages
+ , HLF_WM // Wildmenu highlight
+ , HLF_FL // Folded line
+ , HLF_FC // Fold column
+ , HLF_ADD // Added diff line
+ , HLF_CHD // Changed diff line
+ , HLF_DED // Deleted diff line
+ , HLF_TXD // Text Changed in diff line
+ , HLF_SC // Sign column
+ , HLF_CONCEAL // Concealed text
+ , HLF_SPB // SpellBad
+ , HLF_SPC // SpellCap
+ , HLF_SPR // SpellRare
+ , HLF_SPL // SpellLocal
+ , HLF_PNI // popup menu normal item
+ , HLF_PSI // popup menu selected item
+ , HLF_PSB // popup menu scrollbar
+ , HLF_PST // popup menu scrollbar thumb
+ , HLF_TP // tabpage line
+ , HLF_TPS // tabpage line selected
+ , HLF_TPF // tabpage line filler
+ , HLF_CUC // 'cursorcolumn'
+ , HLF_CUL // 'cursorline'
+ , HLF_MC // 'colorcolumn'
+ , HLF_QFL // selected quickfix line
+ , HLF_0 // Whitespace
+ , HLF_INACTIVE // NormalNC: Normal text in non-current windows
+ , HLF_MSGSEP // message separator line
+ , HLF_COUNT // MUST be the last one
+} hlf_T;
+
+EXTERN const char *hlf_names[] INIT(= {
+ [HLF_8] = "SpecialKey",
+ [HLF_EOB] = "EndOfBuffer",
+ [HLF_TERM] = "TermCursor",
+ [HLF_TERMNC] = "TermCursorNC",
+ [HLF_AT] = "NonText",
+ [HLF_D] = "Directory",
+ [HLF_E] = "ErrorMsg",
+ [HLF_I] = "IncSearch",
+ [HLF_L] = "Search",
+ [HLF_M] = "MoreMsg",
+ [HLF_CM] = "ModeMsg",
+ [HLF_N] = "LineNr",
+ [HLF_CLN] = "CursorLineNr",
+ [HLF_R] = "Question",
+ [HLF_S] = "StatusLine",
+ [HLF_SNC] = "StatusLineNC",
+ [HLF_C] = "VertSplit",
+ [HLF_T] = "Title",
+ [HLF_V] = "Visual",
+ [HLF_VNC] = "VisualNC",
+ [HLF_W] = "WarningMsg",
+ [HLF_WM] = "WildMenu",
+ [HLF_FL] = "Folded",
+ [HLF_FC] = "FoldColumn",
+ [HLF_ADD] = "DiffAdd",
+ [HLF_CHD] = "DiffChange",
+ [HLF_DED] = "DiffDelete",
+ [HLF_TXD] = "DiffText",
+ [HLF_SC] = "SignColumn",
+ [HLF_CONCEAL] = "Conceal",
+ [HLF_SPB] = "SpellBad",
+ [HLF_SPC] = "SpellCap",
+ [HLF_SPR] = "SpellRare",
+ [HLF_SPL] = "SpellLocal",
+ [HLF_PNI] = "Pmenu",
+ [HLF_PSI] = "PmenuSel",
+ [HLF_PSB] = "PmenuSbar",
+ [HLF_PST] = "PmenuThumb",
+ [HLF_TP] = "TabLine",
+ [HLF_TPS] = "TabLineSel",
+ [HLF_TPF] = "TabLineFill",
+ [HLF_CUC] = "CursorColumn",
+ [HLF_CUL] = "CursorLine",
+ [HLF_MC] = "ColorColumn",
+ [HLF_QFL] = "QuickFixLine",
+ [HLF_0] = "Whitespace",
+ [HLF_INACTIVE] = "NormalNC",
+ [HLF_MSGSEP] = "MsgSeparator",
+});
+
+
+EXTERN int highlight_attr[HLF_COUNT]; // Highl. attr for each context.
+EXTERN int highlight_user[9]; // User[1-9] attributes
+EXTERN int highlight_stlnc[9]; // On top of user
+EXTERN int cterm_normal_fg_color INIT(= 0);
+EXTERN int cterm_normal_bg_color INIT(= 0);
+EXTERN RgbValue normal_fg INIT(= -1);
+EXTERN RgbValue normal_bg INIT(= -1);
+EXTERN RgbValue normal_sp INIT(= -1);
+
+typedef enum {
+ kHlUnknown,
+ kHlUI,
+ kHlSyntax,
+ kHlTerminal,
+ kHlCombine,
+} HlKind;
+
+typedef struct {
+ HlAttrs attr;
+ HlKind kind;
+ int id1;
+ int id2;
+} HlEntry;
+
+#endif // NVIM_HIGHLIGHT_DEFS_H
diff --git a/src/nvim/iconv.h b/src/nvim/iconv.h
index 4ac0d3fdd4..d7234090c4 100644
--- a/src/nvim/iconv.h
+++ b/src/nvim/iconv.h
@@ -10,9 +10,7 @@
// USE_ICONV, or to put the USE_ICONV definition in config.h.in directly. As
// it stands, globals.h needs to be included alongside iconv.h.
-#ifdef HAVE_CONFIG_H
-# include "auto/config.h"
-#endif
+#include "auto/config.h"
// Use iconv() when it's available, either by linking to the library at
// compile time or by loading it at runtime.
@@ -24,10 +22,10 @@
// defined, we provide a type shim (pull in errno.h and define iconv_t).
// This enables us to still load and use iconv dynamically at runtime.
#ifdef USE_ICONV
+# include <errno.h>
# ifdef HAVE_ICONV_H
# include <iconv.h>
# else
-# include <errno.h>
typedef void *iconv_t;
# endif
#endif
diff --git a/src/nvim/if_cscope.c b/src/nvim/if_cscope.c
index f2432dd71d..625d6baa17 100644
--- a/src/nvim/if_cscope.c
+++ b/src/nvim/if_cscope.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* CSCOPE support for Vim added by Andy Kahn <kahn@zk3.dec.com>
* Ported to Win32 by Sergey Khorev <sergey.khorev@gmail.com>
@@ -20,7 +23,6 @@
#include "nvim/eval.h"
#include "nvim/fileio.h"
#include "nvim/message.h"
-#include "nvim/misc2.h"
#include "nvim/memory.h"
#include "nvim/os/time.h"
#include "nvim/path.h"
@@ -52,7 +54,7 @@ static cscmd_T cs_cmds[] =
{ "add", cs_add,
N_("Add a new database"), "add file|dir [pre-path] [flags]", 0 },
{ "find", cs_find,
- N_("Query for a pattern"), "find c|d|e|f|g|i|s|t name", 1 },
+ N_("Query for a pattern"), "find a|c|d|e|f|g|i|s|t name", 1 },
{ "help", cs_help,
N_("Show this message"), "help", 0 },
{ "kill", cs_kill,
@@ -105,13 +107,13 @@ char_u *get_cscope_name(expand_T *xp, int idx)
{
const char *query_type[] =
{
- "c", "d", "e", "f", "g", "i", "s", "t", NULL
+ "a", "c", "d", "e", "f", "g", "i", "s", "t", NULL
};
- /* Complete with query type of ":cscope find {query_type}".
- * {query_type} can be letters (c, d, ... t) or numbers (0, 1,
- * ..., 8) but only complete with letters, since numbers are
- * redundant. */
+ // Complete with query type of ":cscope find {query_type}".
+ // {query_type} can be letters (c, d, ... a) or numbers (0, 1,
+ // ..., 9) but only complete with letters, since numbers are
+ // redundant.
return (char_u *)query_type[idx];
}
case EXP_CSCOPE_KILL:
@@ -141,44 +143,39 @@ char_u *get_cscope_name(expand_T *xp, int idx)
/*
* Handle command line completion for :cscope command.
*/
-void set_context_in_cscope_cmd(expand_T *xp, char_u *arg, cmdidx_T cmdidx)
+void set_context_in_cscope_cmd(expand_T *xp, const char *arg, cmdidx_T cmdidx)
{
- char_u *p;
-
- /* Default: expand subcommands */
+ // Default: expand subcommands.
xp->xp_context = EXPAND_CSCOPE;
- xp->xp_pattern = arg;
- expand_what = (cmdidx == CMD_scscope)
- ? EXP_SCSCOPE_SUBCMD : EXP_CSCOPE_SUBCMD;
+ xp->xp_pattern = (char_u *)arg;
+ expand_what = ((cmdidx == CMD_scscope)
+ ? EXP_SCSCOPE_SUBCMD : EXP_CSCOPE_SUBCMD);
/* (part of) subcommand already typed */
if (*arg != NUL) {
- p = skiptowhite(arg);
- if (*p != NUL) { /* past first word */
- xp->xp_pattern = skipwhite(p);
- if (*skiptowhite(xp->xp_pattern) != NUL)
+ const char *p = (const char *)skiptowhite((const char_u *)arg);
+ if (*p != NUL) { // Past first word.
+ xp->xp_pattern = skipwhite((const char_u *)p);
+ if (*skiptowhite(xp->xp_pattern) != NUL) {
xp->xp_context = EXPAND_NOTHING;
- else if (STRNICMP(arg, "add", p - arg) == 0)
+ } else if (STRNICMP(arg, "add", p - arg) == 0) {
xp->xp_context = EXPAND_FILES;
- else if (STRNICMP(arg, "kill", p - arg) == 0)
+ } else if (STRNICMP(arg, "kill", p - arg) == 0) {
expand_what = EXP_CSCOPE_KILL;
- else if (STRNICMP(arg, "find", p - arg) == 0)
+ } else if (STRNICMP(arg, "find", p - arg) == 0) {
expand_what = EXP_CSCOPE_FIND;
- else
+ } else {
xp->xp_context = EXPAND_NOTHING;
+ }
}
}
}
-/*
- * PRIVATE: do_cscope_general
- *
- * Find the command, print help if invalid, and then call the corresponding
- * command function.
- */
-static void
-do_cscope_general (
+/// Find the command, print help if invalid, and then call the corresponding
+/// command function.
+static void
+do_cscope_general(
exarg_T *eap,
int make_split /* whether to split window */
)
@@ -207,29 +204,20 @@ do_cscope_general (
postponed_split_tab = 0;
}
-/*
- * PUBLIC: do_cscope
- */
-void do_cscope(exarg_T *eap)
+/// Implementation of ":cscope" and ":lcscope"
+void ex_cscope(exarg_T *eap)
{
do_cscope_general(eap, FALSE);
}
-/*
- * PUBLIC: do_scscope
- *
- * same as do_cscope, but splits window, too.
- */
-void do_scscope(exarg_T *eap)
+/// Implementation of ":scscope". Same as ex_cscope(), but splits window, too.
+void ex_scscope(exarg_T *eap)
{
do_cscope_general(eap, TRUE);
}
-/*
- * PUBLIC: do_cstag
- *
- */
-void do_cstag(exarg_T *eap)
+/// Implementation of ":cstag"
+void ex_cstag(exarg_T *eap)
{
int ret = FALSE;
@@ -284,18 +272,13 @@ void do_cstag(exarg_T *eap)
(void)EMSG(_("E257: cstag: tag not found"));
g_do_tagpreview = 0;
}
-
-} /* do_cscope */
+}
-/*
- * PUBLIC: cs_find
- *
- * this simulates a vim_fgets(), but for cscope, returns the next line
- * from the cscope output. should only be called from find_tags()
- *
- * returns TRUE if eof, FALSE otherwise
- */
+/// This simulates a vim_fgets(), but for cscope, returns the next line
+/// from the cscope output. should only be called from find_tags()
+///
+/// @return TRUE if eof, FALSE otherwise
int cs_fgets(char_u *buf, int size)
{
char *p;
@@ -308,21 +291,13 @@ int cs_fgets(char_u *buf, int size)
} /* cs_fgets */
-/*
- * PUBLIC: cs_free_tags
- *
- * called only from do_tag(), when popping the tag stack
- */
+/// Called only from do_tag(), when popping the tag stack.
void cs_free_tags(void)
{
cs_manage_matches(NULL, NULL, 0, Free);
}
-/*
- * PUBLIC: cs_print_tags
- *
- * called from do_tag()
- */
+/// Called from do_tag().
void cs_print_tags(void)
{
cs_manage_matches(NULL, NULL, 0, Print);
@@ -403,14 +378,8 @@ int cs_connection(int num, char_u *dbpath, char_u *ppath)
* PRIVATE functions
****************************************************************************/
-/*
- * PRIVATE: cs_add
- *
- * add cscope database or a directory name (to look for cscope.out)
- * to the cscope connection list
- *
- * MAXPATHL 256
- */
+/// Add cscope database or a directory name (to look for cscope.out)
+/// to the cscope connection list.
static int cs_add(exarg_T *eap)
{
char *fname, *ppath, *flags = NULL;
@@ -436,17 +405,13 @@ static void cs_stat_emsg(char *fname)
}
-/*
- * PRIVATE: cs_add_common
- *
- * the common routine to add a new cscope connection. called by
- * cs_add() and cs_reset(). i really don't like to do this, but this
- * routine uses a number of goto statements.
- */
-static int
-cs_add_common (
- char *arg1, /* filename - may contain environment variables */
- char *arg2, /* prepend path - may contain environment variables */
+/// The common routine to add a new cscope connection. Called by
+/// cs_add() and cs_reset(). I really don't like to do this, but this
+/// routine uses a number of goto statements.
+static int
+cs_add_common(
+ char *arg1, // filename - may contain environment variables
+ char *arg2, // prepend path - may contain environment variables
char *flags
)
{
@@ -531,9 +496,9 @@ staterr:
if (p_csverbose) {
msg_clr_eos();
- (void)smsg_attr(hl_attr(HLF_R),
- _("Added cscope database %s"),
- csinfo[i].fname);
+ (void)smsg_attr(HL_ATTR(HLF_R),
+ _("Added cscope database %s"),
+ csinfo[i].fname);
}
}
@@ -560,11 +525,7 @@ static int cs_check_for_tags(void)
return p_tags[0] != NUL && curbuf->b_p_tags != NULL;
} /* cs_check_for_tags */
-/*
- * PRIVATE: cs_cnt_connections
- *
- * count the number of cscope connections
- */
+/// Count the number of cscope connections.
static size_t cs_cnt_connections(void)
{
size_t cnt = 0;
@@ -584,21 +545,23 @@ static void cs_reading_emsg(
}
#define CSREAD_BUFSIZE 2048
-/*
- * PRIVATE: cs_cnt_matches
- *
- * count the number of matches for a given cscope connection.
- */
+/// Count the number of matches for a given cscope connection.
static int cs_cnt_matches(size_t idx)
{
char *stok;
- int nlines;
+ int nlines = 0;
char *buf = xmalloc(CSREAD_BUFSIZE);
for (;; ) {
+ errno = 0;
if (!fgets(buf, CSREAD_BUFSIZE, csinfo[idx].fr_fp)) {
- if (feof(csinfo[idx].fr_fp))
+ if (errno == EINTR) {
+ continue;
+ }
+
+ if (feof(csinfo[idx].fr_fp)) {
errno = EIO;
+ }
cs_reading_emsg(idx);
@@ -606,16 +569,20 @@ static int cs_cnt_matches(size_t idx)
return CSCOPE_FAILURE;
}
- /*
- * If the database is out of date, or there's some other problem,
- * cscope will output error messages before the number-of-lines output.
- * Display/discard any output that doesn't match what we want.
- * Accept "\S*cscope: X lines", also matches "mlcscope".
- */
- if ((stok = strtok(buf, (const char *)" ")) == NULL)
+ // If the database is out of date, or there's some other problem,
+ // cscope will output error messages before the number-of-lines output.
+ // Display/discard any output that doesn't match what we want.
+ // Accept "\S*cscope: X lines", also matches "mlcscope".
+ // Bail out for the "Unable to search" error.
+ if (strstr((const char *)buf, "Unable to search database") != NULL) {
+ break;
+ }
+ if ((stok = strtok(buf, (const char *)" ")) == NULL) {
continue;
- if (strstr((const char *)stok, "cscope:") == NULL)
+ }
+ if (strstr((const char *)stok, "cscope:") == NULL) {
continue;
+ }
if ((stok = strtok(NULL, (const char *)" ")) == NULL)
continue;
@@ -638,11 +605,7 @@ static int cs_cnt_matches(size_t idx)
} /* cs_cnt_matches */
-/*
- * PRIVATE: cs_create_cmd
- *
- * Creates the actual cscope command query from what the user entered.
- */
+/// Creates the actual cscope command query from what the user entered.
static char *cs_create_cmd(char *csoption, char *pattern)
{
char *cmd;
@@ -674,6 +637,9 @@ static char *cs_create_cmd(char *csoption, char *pattern)
case '8': case 'i':
search = 8;
break;
+ case '9': case 'a':
+ search = 9;
+ break;
default:
(void)EMSG(_("E561: unknown cscope search type"));
cs_usage_msg(Find);
@@ -695,12 +661,8 @@ static char *cs_create_cmd(char *csoption, char *pattern)
} /* cs_create_cmd */
-/*
- * PRIVATE: cs_create_connection
- *
- * This piece of code was taken/adapted from nvi. do we need to add
- * the BSD license notice?
- */
+/// This piece of code was taken/adapted from nvi. do we need to add
+/// the BSD license notice?
static int cs_create_connection(size_t i)
{
#ifdef UNIX
@@ -826,7 +788,6 @@ err_closing:
if (execl("/bin/sh", "sh", "-c", cmd, (char *)NULL) == -1)
PERROR(_("cs_create_connection exec failed"));
- stream_set_blocking(input_global_fd(), true); // normalize stream (#2598)
exit(127);
/* NOTREACHED */
default: /* parent. */
@@ -889,14 +850,10 @@ err_closing:
} /* cs_create_connection */
-/*
- * PRIVATE: cs_find
- *
- * query cscope using command line interface. parse the output and use tselect
- * to allow choices. like Nvi, creates a pipe to send to/from query/cscope.
- *
- * returns TRUE if we jump to a tag or abort, FALSE if not.
- */
+/// Query cscope using command line interface. Parse the output and use tselect
+/// to allow choices. Like Nvi, creates a pipe to send to/from query/cscope.
+///
+/// @return TRUE if we jump to a tag or abort, FALSE if not.
static int cs_find(exarg_T *eap)
{
char *opt, *pat;
@@ -930,11 +887,7 @@ static int cs_find(exarg_T *eap)
} /* cs_find */
-/*
- * PRIVATE: cs_find_common
- *
- * common code for cscope find, shared by cs_find() and do_cstag()
- */
+/// Common code for cscope find, shared by cs_find() and ex_cstag().
static int cs_find_common(char *opt, char *pat, int forceit, int verbose,
int use_ll, char_u *cmdline)
{
@@ -970,6 +923,9 @@ static int cs_find_common(char *opt, char *pat, int forceit, int verbose,
case '8':
cmdletter = 'i';
break;
+ case '9':
+ cmdletter = 'a';
+ break;
default:
cmdletter = opt[0];
}
@@ -989,11 +945,12 @@ static int cs_find_common(char *opt, char *pat, int forceit, int verbose,
return FALSE;
}
- if (*qfpos != '0') {
- apply_autocmds(EVENT_QUICKFIXCMDPRE, (char_u *)"cscope",
- curbuf->b_fname, TRUE, curbuf);
- if (did_throw || force_abort)
- return FALSE;
+ if (*qfpos != '0'
+ && apply_autocmds(EVENT_QUICKFIXCMDPRE, (char_u *)"cscope",
+ curbuf->b_fname, true, curbuf)) {
+ if (aborting()) {
+ return false;
+ }
}
}
@@ -1044,8 +1001,8 @@ static int cs_find_common(char *opt, char *pat, int forceit, int verbose,
return FALSE;
}
- if (qfpos != NULL && *qfpos != '0' && totmatches > 0) {
- /* fill error list */
+ if (qfpos != NULL && *qfpos != '0') {
+ // Fill error list.
FILE *f;
char_u *tmp = vim_tempname();
qf_info_T *qi = NULL;
@@ -1059,9 +1016,9 @@ static int cs_find_common(char *opt, char *pat, int forceit, int verbose,
fclose(f);
if (use_ll) /* Use location list */
wp = curwin;
- /* '-' starts a new error list */
+ // '-' starts a new error list
if (qf_init(wp, tmp, (char_u *)"%f%*\\t%l%*\\t%m",
- *qfpos == '-', cmdline) > 0) {
+ *qfpos == '-', cmdline, NULL) > 0) {
if (postponed_split != 0) {
(void)win_split(postponed_split > 0 ? postponed_split : 0,
postponed_split_flags);
@@ -1103,11 +1060,7 @@ static int cs_find_common(char *opt, char *pat, int forceit, int verbose,
} /* cs_find_common */
-/*
- * PRIVATE: cs_help
- *
- * print help
- */
+/// Print help.
static int cs_help(exarg_T *eap)
{
cscmd_T *cmdp = cs_cmds;
@@ -1126,14 +1079,15 @@ static int cs_help(exarg_T *eap)
cmdp->usage);
if (strcmp(cmdp->name, "find") == 0)
MSG_PUTS(_("\n"
- " c: Find functions calling this function\n"
- " d: Find functions called by this function\n"
- " e: Find this egrep pattern\n"
- " f: Find this file\n"
- " g: Find this definition\n"
- " i: Find files #including this file\n"
- " s: Find this C symbol\n"
- " t: Find this text string\n"));
+ " a: Find assignments to this symbol\n"
+ " c: Find functions calling this function\n"
+ " d: Find functions called by this function\n"
+ " e: Find this egrep pattern\n"
+ " f: Find this file\n"
+ " g: Find this definition\n"
+ " i: Find files #including this file\n"
+ " s: Find this C symbol\n"
+ " t: Find this text string\n"));
cmdp++;
}
@@ -1154,11 +1108,7 @@ static void clear_csinfo(size_t i)
csinfo[i].to_fp = NULL;
}
-/*
- * PRIVATE: cs_insert_filelist
- *
- * insert a new cscope database filename into the filelist
- */
+/// Insert a new cscope database filename into the filelist.
static int cs_insert_filelist(char *fname, char *ppath, char *flags,
FileInfo *file_info)
{
@@ -1218,11 +1168,7 @@ static int cs_insert_filelist(char *fname, char *ppath, char *flags,
} /* cs_insert_filelist */
-/*
- * PRIVATE: cs_lookup_cmd
- *
- * find cscope command in command table
- */
+/// Find cscope command in command table.
static cscmd_T * cs_lookup_cmd(exarg_T *eap)
{
cscmd_T *cmdp;
@@ -1247,11 +1193,7 @@ static cscmd_T * cs_lookup_cmd(exarg_T *eap)
} /* cs_lookup_cmd */
-/*
- * PRIVATE: cs_kill
- *
- * nuke em
- */
+/// Nuke em.
static int cs_kill(exarg_T *eap)
{
char *stok;
@@ -1288,9 +1230,10 @@ static int cs_kill(exarg_T *eap)
}
}
- if (i >= csinfo_size || csinfo[i].fname == NULL) {
- if (p_csverbose)
+ if (!killall && (i >= csinfo_size || csinfo[i].fname == NULL)) {
+ if (p_csverbose) {
(void)EMSG2(_("E261: cscope connection %s not found"), stok);
+ }
return CSCOPE_FAILURE;
} else {
if (killall) {
@@ -1307,11 +1250,7 @@ static int cs_kill(exarg_T *eap)
} /* cs_kill */
-/*
- * PRIVATE: cs_kill_execute
- *
- * Actually kills a specific cscope connection.
- */
+/// Actually kills a specific cscope connection.
static void cs_kill_execute(
size_t i, /* cscope table index */
char *cname /* cscope database name */
@@ -1319,33 +1258,29 @@ static void cs_kill_execute(
{
if (p_csverbose) {
msg_clr_eos();
- (void)smsg_attr(hl_attr(HLF_R) | MSG_HIST,
- _("cscope connection %s closed"), cname);
+ (void)smsg_attr(HL_ATTR(HLF_R) | MSG_HIST,
+ _("cscope connection %s closed"), cname);
}
cs_release_csp(i, TRUE);
}
-/*
- * PRIVATE: cs_make_vim_style_matches
- *
- * convert the cscope output into a ctags style entry (as might be found
- * in a ctags tags file). there's one catch though: cscope doesn't tell you
- * the type of the tag you are looking for. for example, in Darren Hiebert's
- * ctags (the one that comes with vim), #define's use a line number to find the
- * tag in a file while function definitions use a regexp search pattern.
- *
- * i'm going to always use the line number because cscope does something
- * quirky (and probably other things i don't know about):
- *
- * if you have "# define" in your source file, which is
- * perfectly legal, cscope thinks you have "#define". this
- * will result in a failed regexp search. :(
- *
- * besides, even if this particular case didn't happen, the search pattern
- * would still have to be modified to escape all the special regular expression
- * characters to comply with ctags formatting.
- */
+/// Convert the cscope output into a ctags style entry (as might be found
+/// in a ctags tags file). there's one catch though: cscope doesn't tell you
+/// the type of the tag you are looking for. for example, in Darren Hiebert's
+/// ctags (the one that comes with vim), #define's use a line number to find the
+/// tag in a file while function definitions use a regexp search pattern.
+///
+/// I'm going to always use the line number because cscope does something
+/// quirky (and probably other things i don't know about):
+///
+/// if you have "# define" in your source file, which is
+/// perfectly legal, cscope thinks you have "#define". this
+/// will result in a failed regexp search. :(
+///
+/// Besides, even if this particular case didn't happen, the search pattern
+/// would still have to be modified to escape all the special regular expression
+/// characters to comply with ctags formatting.
static char *cs_make_vim_style_matches(char *fname, char *slno, char *search,
char *tagstr)
{
@@ -1379,24 +1314,20 @@ static char *cs_make_vim_style_matches(char *fname, char *slno, char *search,
} /* cs_make_vim_style_matches */
-/*
- * PRIVATE: cs_manage_matches
- *
- * this is kind of hokey, but i don't see an easy way round this..
- *
- * Store: keep a ptr to the (malloc'd) memory of matches originally
- * generated from cs_find(). the matches are originally lines directly
- * from cscope output, but transformed to look like something out of a
- * ctags. see cs_make_vim_style_matches for more details.
- *
- * Get: used only from cs_fgets(), this simulates a vim_fgets() to return
- * the next line from the cscope output. it basically keeps track of which
- * lines have been "used" and returns the next one.
- *
- * Free: frees up everything and resets
- *
- * Print: prints the tags
- */
+/// This is kind of hokey, but i don't see an easy way round this.
+///
+/// Store: keep a ptr to the (malloc'd) memory of matches originally
+/// generated from cs_find(). the matches are originally lines directly
+/// from cscope output, but transformed to look like something out of a
+/// ctags. see cs_make_vim_style_matches for more details.
+///
+/// Get: used only from cs_fgets(), this simulates a vim_fgets() to return
+/// the next line from the cscope output. it basically keeps track of which
+/// lines have been "used" and returns the next one.
+///
+/// Free: frees up everything and resets
+///
+/// Print: prints the tags
static char *cs_manage_matches(char **matches, char **contexts,
size_t totmatches, mcmd_e cmd)
{
@@ -1440,10 +1371,12 @@ static char *cs_manage_matches(char **matches, char **contexts,
next = 0;
break;
case Print:
+ assert(mp != NULL);
+ assert(cp != NULL);
cs_print_tags_priv(mp, cp, cnt);
break;
- default: /* should not reach here */
- (void)EMSG(_("E570: fatal error in cs_manage_matches"));
+ default: // should not reach here
+ IEMSG(_("E570: fatal error in cs_manage_matches"));
return NULL;
}
@@ -1451,11 +1384,7 @@ static char *cs_manage_matches(char **matches, char **contexts,
} /* cs_manage_matches */
-/*
- * PRIVATE: cs_parse_results
- *
- * parse cscope output
- */
+/// Parse cscope output.
static char *cs_parse_results(size_t cnumber, char *buf, int bufsize,
char **context, char **linenumber, char **search)
{
@@ -1463,9 +1392,16 @@ static char *cs_parse_results(size_t cnumber, char *buf, int bufsize,
char *p;
char *name;
+retry:
+ errno = 0;
if (fgets(buf, bufsize, csinfo[cnumber].fr_fp) == NULL) {
- if (feof(csinfo[cnumber].fr_fp))
+ if (errno == EINTR) {
+ goto retry;
+ }
+
+ if (feof(csinfo[cnumber].fr_fp)) {
errno = EIO;
+ }
cs_reading_emsg(cnumber);
@@ -1505,11 +1441,7 @@ static char *cs_parse_results(size_t cnumber, char *buf, int bufsize,
return name;
}
-/*
- * PRIVATE: cs_file_results
- *
- * write cscope find results to file
- */
+/// Write cscope find results to file.
static void cs_file_results(FILE *f, int *nummatches_a)
{
char *search, *slno;
@@ -1550,13 +1482,9 @@ static void cs_file_results(FILE *f, int *nummatches_a)
xfree(buf);
}
-/*
- * PRIVATE: cs_fill_results
- *
- * get parsed cscope output and calls cs_make_vim_style_matches to convert
- * into ctags format
- * When there are no matches sets "*matches_p" to NULL.
- */
+/// Get parsed cscope output and calls cs_make_vim_style_matches to convert
+/// into ctags format.
+/// When there are no matches sets "*matches_p" to NULL.
static void cs_fill_results(char *tagstr, size_t totmatches, int *nummatches_a,
char ***matches_p, char ***cntxts_p,
size_t *matched)
@@ -1664,16 +1592,16 @@ static void cs_print_tags_priv(char **matches, char **cntxts,
char *buf = xmalloc(newsize);
size_t bufsize = newsize; // Track available bufsize
(void)snprintf(buf, bufsize, cstag_msg, ptag);
- MSG_PUTS_ATTR(buf, hl_attr(HLF_T));
+ MSG_PUTS_ATTR(buf, HL_ATTR(HLF_T));
msg_clr_eos();
// restore matches[0]
*ptag_end = '\t';
// Column headers for match number, line number and filename.
- MSG_PUTS_ATTR(_("\n # line"), hl_attr(HLF_T));
+ MSG_PUTS_ATTR(_("\n # line"), HL_ATTR(HLF_T));
msg_advance(msg_col + 2);
- MSG_PUTS_ATTR(_("filename / context / line\n"), hl_attr(HLF_T));
+ MSG_PUTS_ATTR(_("filename / context / line\n"), HL_ATTR(HLF_T));
for (size_t i = 0; i < num_matches; i++) {
assert(strcnt(matches[i], '\t') >= 2);
@@ -1700,8 +1628,8 @@ static void cs_print_tags_priv(char **matches, char **cntxts,
bufsize = newsize;
}
(void)snprintf(buf, bufsize, csfmt_str, i + 1, lno);
- MSG_PUTS_ATTR(buf, hl_attr(HLF_CM));
- MSG_PUTS_LONG_ATTR(cs_pathcomponents(fname), hl_attr(HLF_CM));
+ MSG_PUTS_ATTR(buf, HL_ATTR(HLF_CM));
+ MSG_PUTS_LONG_ATTR(cs_pathcomponents(fname), HL_ATTR(HLF_CM));
// compute the required space for the context
char *context = cntxts[i] ? cntxts[i] : globalcntx;
@@ -1748,15 +1676,11 @@ static void cs_print_tags_priv(char **matches, char **cntxts,
xfree(buf);
}
-/*
- * PRIVATE: cs_read_prompt
- *
- * read a cscope prompt (basically, skip over the ">> ")
- */
+/// Read a cscope prompt (basically, skip over the ">> ").
static int cs_read_prompt(size_t i)
{
- char ch;
- char *buf = NULL; /* buffer for possible error message from cscope */
+ int ch;
+ char *buf = NULL; // buffer for possible error message from cscope
size_t bufpos = 0;
char *cs_emsg = _("E609: Cscope error: %s");
size_t cs_emsg_len = strlen(cs_emsg);
@@ -1767,40 +1691,50 @@ static int cs_read_prompt(size_t i)
assert(IOSIZE >= cs_emsg_len);
size_t maxlen = IOSIZE - cs_emsg_len;
- for (;; ) {
- while ((ch = (char)getc(csinfo[i].fr_fp)) != EOF && ch != CSCOPE_PROMPT[0])
- /* if there is room and char is printable */
+ while (1) {
+ while (1) {
+ do {
+ errno = 0;
+ ch = fgetc(csinfo[i].fr_fp);
+ } while (ch == EOF && errno == EINTR && ferror(csinfo[i].fr_fp));
+ if (ch == EOF || ch == CSCOPE_PROMPT[0]) {
+ break;
+ }
+ // if there is room and char is printable
if (bufpos < maxlen - 1 && vim_isprintc(ch)) {
// lazy buffer allocation
if (buf == NULL) {
buf = xmalloc(maxlen);
}
- {
- /* append character to the message */
- buf[bufpos++] = ch;
- buf[bufpos] = NUL;
- if (bufpos >= epromptlen
- && strcmp(&buf[bufpos - epromptlen], eprompt) == 0) {
- /* remove eprompt from buf */
- buf[bufpos - epromptlen] = NUL;
-
- /* print message to user */
- (void)EMSG2(cs_emsg, buf);
+ // append character to the message
+ buf[bufpos++] = (char)ch;
+ buf[bufpos] = NUL;
+ if (bufpos >= epromptlen
+ && strcmp(&buf[bufpos - epromptlen], eprompt) == 0) {
+ // remove eprompt from buf
+ buf[bufpos - epromptlen] = NUL;
+
+ // print message to user
+ (void)EMSG2(cs_emsg, buf);
- /* send RETURN to cscope */
- (void)putc('\n', csinfo[i].to_fp);
- (void)fflush(csinfo[i].to_fp);
+ // send RETURN to cscope
+ (void)putc('\n', csinfo[i].to_fp);
+ (void)fflush(csinfo[i].to_fp);
- /* clear buf */
- bufpos = 0;
- buf[bufpos] = NUL;
- }
+ // clear buf
+ bufpos = 0;
+ buf[bufpos] = NUL;
}
}
+ }
- for (size_t n = 0; n < strlen(CSCOPE_PROMPT); ++n) {
- if (n > 0)
- ch = (char)getc(csinfo[i].fr_fp);
+ for (size_t n = 0; n < strlen(CSCOPE_PROMPT); n++) {
+ if (n > 0) {
+ do {
+ errno = 0;
+ ch = fgetc(csinfo[i].fr_fp);
+ } while (ch == EOF && errno == EINTR && ferror(csinfo[i].fr_fp));
+ }
if (ch == EOF) {
PERROR("cs_read_prompt EOF");
if (buf != NULL && buf[0] != NUL)
@@ -1838,12 +1772,8 @@ static void sig_handler(int s) {
#endif
-/*
- * PRIVATE: cs_release_csp
- *
- * Does the actual free'ing for the cs ptr with an optional flag of whether
- * or not to free the filename. Called by cs_kill and cs_reset.
- */
+/// Does the actual free'ing for the cs ptr with an optional flag of whether
+/// or not to free the filename. Called by cs_kill and cs_reset.
static void cs_release_csp(size_t i, int freefnpp)
{
// Trying to exit normally (not sure whether it is fit to Unix cscope)
@@ -1955,15 +1885,11 @@ static void cs_release_csp(size_t i, int freefnpp)
} /* cs_release_csp */
-/*
- * PRIVATE: cs_reset
- *
- * calls cs_kill on all cscope connections then reinits
- */
+/// Calls cs_kill on all cscope connections then reinits.
static int cs_reset(exarg_T *eap)
{
char **dblist = NULL, **pplist = NULL, **fllist = NULL;
- char buf[20]; /* for snprintf " (#%zu)" */
+ char buf[25]; // for snprintf " (#%zu)"
if (csinfo_size == 0)
return CSCOPE_SUCCESS;
@@ -1991,7 +1917,7 @@ static int cs_reset(exarg_T *eap)
* "Added cscope database..."
*/
snprintf(buf, ARRAY_SIZE(buf), " (#%zu)", i);
- MSG_PUTS_ATTR(buf, hl_attr(HLF_R));
+ MSG_PUTS_ATTR(buf, HL_ATTR(HLF_R));
}
}
xfree(dblist[i]);
@@ -2002,23 +1928,20 @@ static int cs_reset(exarg_T *eap)
xfree(pplist);
xfree(fllist);
- if (p_csverbose)
- MSG_ATTR(_("All cscope databases reset"), hl_attr(HLF_R) | MSG_HIST);
+ if (p_csverbose) {
+ msg_attr(_("All cscope databases reset"), HL_ATTR(HLF_R) | MSG_HIST);
+ }
return CSCOPE_SUCCESS;
} /* cs_reset */
-/*
- * PRIVATE: cs_resolve_file
- *
- * Construct the full pathname to a file found in the cscope database.
- * (Prepends ppath, if there is one and if it's not already prepended,
- * otherwise just uses the name found.)
- *
- * We need to prepend the prefix because on some cscope's (e.g., the one that
- * ships with Solaris 2.6), the output never has the prefix prepended.
- * Contrast this with my development system (Digital Unix), which does.
- */
+/// Construct the full pathname to a file found in the cscope database.
+/// (Prepends ppath, if there is one and if it's not already prepended,
+/// otherwise just uses the name found.)
+///
+/// We need to prepend the prefix because on some cscope's (e.g., the one that
+/// ships with Solaris 2.6), the output never has the prefix prepended.
+/// Contrast this with my development system (Digital Unix), which does.
static char *cs_resolve_file(size_t i, char *name)
{
char *fullname;
@@ -2064,11 +1987,7 @@ static char *cs_resolve_file(size_t i, char *name)
}
-/*
- * PRIVATE: cs_show
- *
- * show all cscope connections
- */
+/// Show all cscope connections.
static int cs_show(exarg_T *eap)
{
if (cs_cnt_connections() == 0)
@@ -2076,7 +1995,7 @@ static int cs_show(exarg_T *eap)
else {
MSG_PUTS_ATTR(
_(" # pid database name prepend path\n"),
- hl_attr(HLF_T));
+ HL_ATTR(HLF_T));
for (size_t i = 0; i < csinfo_size; i++) {
if (csinfo[i].fname == NULL)
continue;
@@ -2096,11 +2015,7 @@ static int cs_show(exarg_T *eap)
} /* cs_show */
-/*
- * PUBLIC: cs_end
- *
- * Only called when VIM exits to quit any cscope sessions.
- */
+/// Only called when VIM exits to quit any cscope sessions.
void cs_end(void)
{
for (size_t i = 0; i < csinfo_size; i++)
diff --git a/src/nvim/if_cscope.h b/src/nvim/if_cscope.h
index 351d9caef6..e20462576a 100644
--- a/src/nvim/if_cscope.h
+++ b/src/nvim/if_cscope.h
@@ -1,6 +1,9 @@
#ifndef NVIM_IF_CSCOPE_H
#define NVIM_IF_CSCOPE_H
+#include "nvim/types.h" // for char_u and expand_T
+#include "nvim/ex_cmds_defs.h" // for exarg_T
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "if_cscope.h.generated.h"
#endif
diff --git a/src/nvim/if_cscope_defs.h b/src/nvim/if_cscope_defs.h
index 8cd74c74e6..fa18866840 100644
--- a/src/nvim/if_cscope_defs.h
+++ b/src/nvim/if_cscope_defs.h
@@ -18,6 +18,7 @@
#include "nvim/os/os_defs.h"
#include "nvim/os/fs_defs.h"
+#include "nvim/ex_cmds_defs.h"
#define CSCOPE_SUCCESS 0
#define CSCOPE_FAILURE -1
@@ -25,18 +26,7 @@
#define CSCOPE_DBFILE "cscope.out"
#define CSCOPE_PROMPT ">> "
-/*
- * s 0name Find this C symbol
- * g 1name Find this definition
- * d 2name Find functions called by this function
- * c 3name Find functions calling this function
- * t 4string find text string (cscope 12.9)
- * t 4name Find assignments to (cscope 13.3)
- * 5pattern change pattern -- NOT USED
- * e 6pattern Find this egrep pattern
- * f 7name Find this file
- * i 8name Find files #including this file
- */
+// See ":help cscope-find" for the possible queries.
typedef struct {
char * name;
diff --git a/src/nvim/indent.c b/src/nvim/indent.c
index f197669a97..13534ac1a9 100644
--- a/src/nvim/indent.c
+++ b/src/nvim/indent.c
@@ -1,16 +1,20 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <inttypes.h>
#include <stdbool.h>
#include "nvim/ascii.h"
+#include "nvim/assert.h"
#include "nvim/indent.h"
#include "nvim/eval.h"
#include "nvim/charset.h"
#include "nvim/cursor.h"
+#include "nvim/mark.h"
#include "nvim/memline.h"
#include "nvim/memory.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/move.h"
#include "nvim/option.h"
#include "nvim/regexp.h"
@@ -18,6 +22,7 @@
#include "nvim/search.h"
#include "nvim/strings.h"
#include "nvim/undo.h"
+#include "nvim/buffer.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
@@ -200,7 +205,12 @@ int set_indent(int size, int flags)
// after the if (!curbuf->b_p_et) below.
if (orig_char_len != -1) {
assert(orig_char_len + size - ind_done + line_len >= 0);
- newline = xmalloc((size_t)(orig_char_len + size - ind_done + line_len));
+ size_t n; // = orig_char_len + size - ind_done + line_len
+ size_t n2;
+ STRICT_ADD(orig_char_len, size, &n, size_t);
+ STRICT_ADD(ind_done, line_len, &n2, size_t);
+ STRICT_SUB(n, n2, &n, size_t);
+ newline = xmalloc(n);
todo = size - ind_done;
// Set total length of indent in characters, which may have been
@@ -222,7 +232,9 @@ int set_indent(int size, int flags)
} else {
todo = size;
assert(ind_len + line_len >= 0);
- newline = xmalloc((size_t)(ind_len + line_len));
+ size_t newline_size;
+ STRICT_ADD(ind_len, line_len, &newline_size, size_t);
+ newline = xmalloc(newline_size);
s = newline;
}
@@ -388,7 +400,9 @@ int copy_indent(int size, char_u *src)
// and the rest of the line.
line_len = (int)STRLEN(get_cursor_line_ptr()) + 1;
assert(ind_len + line_len >= 0);
- line = xmalloc((size_t)(ind_len + line_len));
+ size_t line_size;
+ STRICT_ADD(ind_len, line_len, &line_size, size_t);
+ line = xmalloc(line_size);
p = line;
}
}
@@ -451,26 +465,27 @@ int get_number_indent(linenr_T lnum)
* parameters into account. Window must be specified, since it is not
* necessarily always the current one.
*/
-int get_breakindent_win(win_T *wp, char_u *line) {
- static int prev_indent = 0; /* cached indent value */
- static long prev_ts = 0; /* cached tabstop value */
- static char_u *prev_line = NULL; /* cached pointer to line */
- static int prev_tick = 0; // changedtick of cached value
+int get_breakindent_win(win_T *wp, char_u *line)
+ FUNC_ATTR_NONNULL_ARG(1)
+{
+ static int prev_indent = 0; // Cached indent value.
+ static long prev_ts = 0; // Cached tabstop value.
+ static char_u *prev_line = NULL; // cached pointer to line.
+ static varnumber_T prev_tick = 0; // Changedtick of cached value.
int bri = 0;
- /* window width minus window margin space, i.e. what rests for text */
- const int eff_wwidth = wp->w_width
+ // window width minus window margin space, i.e. what rests for text
+ const int eff_wwidth = wp->w_grid.Columns
- ((wp->w_p_nu || wp->w_p_rnu)
&& (vim_strchr(p_cpo, CPO_NUMCOL) == NULL)
? number_width(wp) + 1 : 0);
/* used cached indent, unless pointer or 'tabstop' changed */
if (prev_line != line || prev_ts != wp->w_buffer->b_p_ts
- || prev_tick != wp->w_buffer->b_changedtick) {
+ || prev_tick != buf_get_changedtick(wp->w_buffer)) {
prev_line = line;
prev_ts = wp->w_buffer->b_p_ts;
- prev_tick = wp->w_buffer->b_changedtick;
- prev_indent = get_indent_str(line,
- (int)wp->w_buffer->b_p_ts, wp->w_p_list);
+ prev_tick = buf_get_changedtick(wp->w_buffer);
+ prev_indent = get_indent_str(line, (int)wp->w_buffer->b_p_ts, wp->w_p_list);
}
bri = prev_indent + wp->w_p_brishift;
@@ -517,7 +532,7 @@ int inindent(int extra)
// Get indent level from 'indentexpr'.
int get_expr_indent(void)
{
- int indent;
+ int indent = -1;
pos_T save_pos;
colnr_T save_curswant;
int save_set_curswant;
@@ -535,7 +550,12 @@ int get_expr_indent(void)
sandbox++;
}
textlock++;
- indent = eval_to_number(curbuf->b_p_inde);
+
+ // Need to make a copy, the 'indentexpr' option could be changed while
+ // evaluating it.
+ char_u *inde_copy = vim_strsave(curbuf->b_p_inde);
+ indent = (int)eval_to_number(inde_copy);
+ xfree(inde_copy);
if (use_sandbox) {
sandbox--;
@@ -599,7 +619,7 @@ int get_lisp_indent(void)
paren = *pos;
pos = findmatch(NULL, '[');
- if ((pos == NULL) || ltp(pos, &paren)) {
+ if ((pos == NULL) || lt(*pos, paren)) {
pos = &paren;
}
}
diff --git a/src/nvim/indent_c.c b/src/nvim/indent_c.c
index efe8e73a3c..f8ce6200d7 100644
--- a/src/nvim/indent_c.c
+++ b/src/nvim/indent_c.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <inttypes.h>
#include <stdint.h>
@@ -10,9 +13,9 @@
#include "nvim/edit.h"
#include "nvim/indent.h"
#include "nvim/indent_c.h"
+#include "nvim/mark.h"
#include "nvim/memline.h"
#include "nvim/memory.h"
-#include "nvim/misc2.h"
#include "nvim/option.h"
#include "nvim/search.h"
#include "nvim/strings.h"
@@ -72,11 +75,12 @@ find_start_comment ( /* XXX */
/// Find the start of a comment or raw string, not knowing if we are in a
/// comment or raw string right now.
/// Search starts at w_cursor.lnum and goes backwards.
+/// If is_raw is given and returns start of raw_string, sets it to true.
///
/// @returns NULL when not inside a comment or raw string.
///
/// @note "CORS" -> Comment Or Raw String
-static pos_T *ind_find_start_CORS(void)
+static pos_T *ind_find_start_CORS(linenr_T *is_raw)
{
// XXX
static pos_T comment_pos_copy;
@@ -93,6 +97,9 @@ static pos_T *ind_find_start_CORS(void)
// If comment_pos is before rs_pos the raw string is inside the comment.
// If rs_pos is before comment_pos the comment is inside the raw string.
if (comment_pos == NULL || (rs_pos != NULL && lt(*rs_pos, *comment_pos))) {
+ if (is_raw != NULL && rs_pos != NULL) {
+ *is_raw = rs_pos->lnum;
+ }
return rs_pos;
}
return comment_pos;
@@ -174,9 +181,8 @@ static char_u *skip_string(char_u *p)
char_u *delim = p + 2;
char_u *paren = vim_strchr(delim, '(');
- if (paren != NULL)
- {
- long delim_len = paren - delim;
+ if (paren != NULL) {
+ const ptrdiff_t delim_len = paren - delim;
for (p += 3; *p; ++p)
if (p[0] == ')' && STRNCMP(p + 1, delim, delim_len) == 0
@@ -382,8 +388,9 @@ int cin_islabel(void)
* it.
*/
curwin->w_cursor.col = 0;
- if ((trypos = ind_find_start_CORS()) != NULL) /* XXX */
+ if ((trypos = ind_find_start_CORS(NULL)) != NULL) { // XXX
curwin->w_cursor = *trypos;
+ }
line = get_cursor_line_ptr();
if (cin_ispreproc(line)) /* ignore #defines, #if, etc. */
@@ -513,34 +520,41 @@ int cin_isscopedecl(char_u *s)
/* Maximum number of lines to search back for a "namespace" line. */
#define FIND_NAMESPACE_LIM 20
-/*
- * Recognize a "namespace" scope declaration.
- */
-static int cin_is_cpp_namespace(char_u *s)
+// Recognize a "namespace" scope declaration.
+static bool cin_is_cpp_namespace(char_u *s)
{
- char_u *p;
- int has_name = FALSE;
+ char_u *p;
+ bool has_name = false;
+ bool has_name_start = false;
s = cin_skipcomment(s);
if (STRNCMP(s, "namespace", 9) == 0 && (s[9] == NUL || !vim_iswordc(s[9]))) {
p = cin_skipcomment(skipwhite(s + 9));
while (*p != NUL) {
if (ascii_iswhite(*p)) {
- has_name = TRUE; /* found end of a name */
+ has_name = true; // found end of a name
p = cin_skipcomment(skipwhite(p));
} else if (*p == '{') {
break;
} else if (vim_iswordc(*p)) {
- if (has_name)
- return FALSE; /* word character after skipping past name */
- ++p;
+ has_name_start = true;
+ if (has_name) {
+ return false; // word character after skipping past name
+ }
+ p++;
+ } else if (p[0] == ':' && p[1] == ':' && vim_iswordc(p[2])) {
+ if (!has_name_start || has_name) {
+ return false;
+ }
+ // C++ 17 nested namespace
+ p += 3;
} else {
- return FALSE;
+ return false;
}
}
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}
/*
@@ -725,16 +739,20 @@ static int cin_ispreproc(char_u *s)
return FALSE;
}
-/*
- * Return TRUE if line "*pp" at "*lnump" is a preprocessor statement or a
- * continuation line of a preprocessor statement. Decrease "*lnump" to the
- * start and return the line in "*pp".
- */
-static int cin_ispreproc_cont(char_u **pp, linenr_T *lnump)
+/// Return TRUE if line "*pp" at "*lnump" is a preprocessor statement or a
+/// continuation line of a preprocessor statement. Decrease "*lnump" to the
+/// start and return the line in "*pp".
+/// Put the amount of indent in "*amount".
+static int cin_ispreproc_cont(char_u **pp, linenr_T *lnump, int *amount)
{
char_u *line = *pp;
linenr_T lnum = *lnump;
- int retval = FALSE;
+ int retval = false;
+ int candidate_amount = *amount;
+
+ if (*line != NUL && line[STRLEN(line) - 1] == '\\') {
+ candidate_amount = get_indent_lnum(lnum);
+ }
for (;; ) {
if (cin_ispreproc(line)) {
@@ -749,8 +767,12 @@ static int cin_ispreproc_cont(char_u **pp, linenr_T *lnump)
break;
}
- if (lnum != *lnump)
+ if (lnum != *lnump) {
*pp = ml_get(*lnump);
+ }
+ if (retval) {
+ *amount = candidate_amount;
+ }
return retval;
}
@@ -820,21 +842,22 @@ cin_isterminated (
return found_start;
}
-/*
- * Recognize the basic picture of a function declaration -- it needs to
- * have an open paren somewhere and a close paren at the end of the line and
- * no semicolons anywhere.
- * When a line ends in a comma we continue looking in the next line.
- * "sp" points to a string with the line. When looking at other lines it must
- * be restored to the line. When it's NULL fetch lines here.
- * "lnum" is where we start looking.
- * "min_lnum" is the line before which we will not be looking.
- */
+/// Recognizes the basic picture of a function declaration -- it needs to
+/// have an open paren somewhere and a close paren at the end of the line and
+/// no semicolons anywhere.
+/// When a line ends in a comma we continue looking in the next line.
+///
+/// @param[in] sp Points to a string with the line. When looking at other
+/// lines it must be restored to the line. When it's NULL fetch
+/// lines here.
+/// @param[in] first_lnum Where to start looking.
+/// @param[in] min_lnum The line before which we will not be looking.
static int cin_isfuncdecl(char_u **sp, linenr_T first_lnum, linenr_T min_lnum)
{
char_u *s;
linenr_T lnum = first_lnum;
- int retval = FALSE;
+ linenr_T save_lnum = curwin->w_cursor.lnum;
+ int retval = false;
pos_T *trypos;
int just_started = TRUE;
@@ -843,18 +866,22 @@ static int cin_isfuncdecl(char_u **sp, linenr_T first_lnum, linenr_T min_lnum)
else
s = *sp;
+ curwin->w_cursor.lnum = lnum;
if (find_last_paren(s, '(', ')')
&& (trypos = find_match_paren(curbuf->b_ind_maxparen)) != NULL) {
lnum = trypos->lnum;
- if (lnum < min_lnum)
- return FALSE;
-
+ if (lnum < min_lnum) {
+ curwin->w_cursor.lnum = save_lnum;
+ return false;
+ }
s = ml_get(lnum);
}
- /* Ignore line starting with #. */
- if (cin_ispreproc(s))
- return FALSE;
+ curwin->w_cursor.lnum = save_lnum;
+ // Ignore line starting with #.
+ if (cin_ispreproc(s)) {
+ return false;
+ }
while (*s && *s != '(' && *s != ';' && *s != '\'' && *s != '"') {
// ignore comments
@@ -1292,6 +1319,43 @@ static int cin_starts_with(char_u *s, char *word)
return STRNCMP(s, word, l) == 0 && !vim_isIDc(s[l]);
}
+/// Recognize a `extern "C"` or `extern "C++"` linkage specifications.
+static int cin_is_cpp_extern_c(char_u *s)
+{
+ char_u *p;
+ int has_string_literal = false;
+
+ s = cin_skipcomment(s);
+ if (STRNCMP(s, "extern", 6) == 0 && (s[6] == NUL || !vim_iswordc(s[6]))) {
+ p = cin_skipcomment(skipwhite(s + 6));
+ while (*p != NUL) {
+ if (ascii_iswhite(*p)) {
+ p = cin_skipcomment(skipwhite(p));
+ } else if (*p == '{') {
+ break;
+ } else if (p[0] == '"' && p[1] == 'C' && p[2] == '"') {
+ if (has_string_literal) {
+ return false;
+ }
+ has_string_literal = true;
+ p += 3;
+ } else if (p[0] == '"' && p[1] == 'C' && p[2] == '+' && p[3] == '+'
+ && p[4] == '"') {
+ if (has_string_literal) {
+ return false;
+ }
+ has_string_literal = true;
+ p += 5;
+ } else {
+ return false;
+ }
+ }
+ return has_string_literal ? true : false;
+ }
+ return false;
+}
+
+
/*
* Skip strings, chars and comments until at or past "trypos".
* Return the column found.
@@ -1300,14 +1364,19 @@ static int cin_skip2pos(pos_T *trypos)
{
char_u *line;
char_u *p;
+ char_u *new_p;
p = line = ml_get(trypos->lnum);
while (*p && (colnr_T)(p - line) < trypos->col) {
- if (cin_iscomment(p))
+ if (cin_iscomment(p)) {
p = cin_skipcomment(p);
- else {
- p = skip_string(p);
- ++p;
+ } else {
+ new_p = skip_string(p);
+ if (new_p == p) {
+ p++;
+ } else {
+ p = new_p;
+ }
}
}
return (int)(p - line);
@@ -1337,10 +1406,12 @@ static pos_T *find_start_brace(void)
pos = NULL;
/* ignore the { if it's in a // or / * * / comment */
if ((colnr_T)cin_skip2pos(trypos) == trypos->col
- && (pos = ind_find_start_CORS()) == NULL) /* XXX */
+ && (pos = ind_find_start_CORS(NULL)) == NULL) { // XXX
break;
- if (pos != NULL)
+ }
+ if (pos != NULL) {
curwin->w_cursor.lnum = pos->lnum;
+ }
}
curwin->w_cursor = cursor_save;
return trypos;
@@ -1379,7 +1450,7 @@ retry:
pos_copy = *trypos; /* copy trypos, findmatch will change it */
trypos = &pos_copy;
curwin->w_cursor = *trypos;
- if ((trypos_wk = ind_find_start_CORS()) != NULL) { /* XXX */
+ if ((trypos_wk = ind_find_start_CORS(NULL)) != NULL) { // XXX
ind_maxp_wk = ind_maxparen - (int)(cursor_save.lnum
- trypos_wk->lnum);
if (ind_maxp_wk > 0) {
@@ -1597,6 +1668,12 @@ void parse_cino(buf_T *buf)
* while(). */
buf->b_ind_if_for_while = 0;
+ // indentation for # comments
+ buf->b_ind_hash_comment = 0;
+
+ // Handle C++ extern "C" or "C++"
+ buf->b_ind_cpp_extern_c = 0;
+
for (p = buf->b_p_cino; *p; ) {
l = p++;
if (*p == '-')
@@ -1665,6 +1742,7 @@ void parse_cino(buf_T *buf)
case '#': buf->b_ind_hash_comment = n; break;
case 'N': buf->b_ind_cpp_namespace = n; break;
case 'k': buf->b_ind_if_for_while = n; break;
+ case 'E': buf->b_ind_cpp_extern_c = n; break;
}
if (*p == ',')
++p;
@@ -1722,6 +1800,7 @@ int get_c_indent(void)
int cont_amount = 0; /* amount for continuation line */
int original_line_islabel;
int added_to_amount = 0;
+ linenr_T raw_string_start = 0;
cpp_baseclass_cache_T cache_cpp_baseclass = { false, { MAXLNUM, 0 } };
/* make a copy, value is changed below */
@@ -1980,14 +2059,16 @@ int get_c_indent(void)
amount = -1;
for (lnum = cur_curpos.lnum - 1; lnum > our_paren_pos.lnum; --lnum) {
l = skipwhite(ml_get(lnum));
- if (cin_nocode(l)) /* skip comment lines */
+ if (cin_nocode(l)) { // skip comment lines
continue;
- if (cin_ispreproc_cont(&l, &lnum))
- continue; /* ignore #define, #if, etc. */
+ }
+ if (cin_ispreproc_cont(&l, &lnum, &amount)) {
+ continue; // ignore #define, #if, etc.
+ }
curwin->w_cursor.lnum = lnum;
- /* Skip a comment or raw string. XXX */
- if ((trypos = ind_find_start_CORS()) != NULL) {
+ // Skip a comment or raw string. XXX
+ if ((trypos = ind_find_start_CORS(NULL)) != NULL) {
lnum = trypos->lnum + 1;
continue;
}
@@ -2293,8 +2374,11 @@ int get_c_indent(void)
amount += curbuf->b_ind_open_imag;
l = skipwhite(get_cursor_line_ptr());
- if (cin_is_cpp_namespace(l))
+ if (cin_is_cpp_namespace(l)) {
amount += curbuf->b_ind_cpp_namespace;
+ } else if (cin_is_cpp_extern_c(l)) {
+ amount += curbuf->b_ind_cpp_extern_c;
+ }
} else {
/* Compensate for adding b_ind_open_extra later. */
amount -= curbuf->b_ind_open_extra;
@@ -2339,15 +2423,14 @@ int get_c_indent(void)
* up with it.
*/
if (curwin->w_cursor.lnum <= ourscope) {
- /* we reached end of scope:
- * if looking for an enum or structure initialization
- * go further back:
- * if it is an initializer (enum xxx or xxx =), then
- * don't add ind_continuation, otherwise it is a variable
- * declaration:
- * int x,
- * here; <-- add ind_continuation
- */
+ // We reached end of scope:
+ // If looking for a enum or structure initialization
+ // go further back:
+ // If it is an initializer (enum xxx or xxx =), then
+ // don't add ind_continuation, otherwise it is a variable
+ // declaration:
+ // int x,
+ // here; <-- add ind_continuation
if (lookfor == LOOKFOR_ENUM_OR_INIT) {
if (curwin->w_cursor.lnum == 0
|| curwin->w_cursor.lnum
@@ -2368,18 +2451,19 @@ int get_c_indent(void)
* If we're in a comment or raw string now, skip to
* the start of it.
*/
- trypos = ind_find_start_CORS();
+ trypos = ind_find_start_CORS(NULL);
if (trypos != NULL) {
curwin->w_cursor.lnum = trypos->lnum + 1;
curwin->w_cursor.col = 0;
continue;
}
- /*
- * Skip preprocessor directives and blank lines.
- */
- if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum))
+ //
+ // Skip preprocessor directives and blank lines.
+ //
+ if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum, &amount)) {
continue;
+ }
if (cin_nocode(l))
continue;
@@ -2476,22 +2560,26 @@ int get_c_indent(void)
/* If we're in a comment or raw string now, skip
* to the start of it. */
- trypos = ind_find_start_CORS();
+ trypos = ind_find_start_CORS(NULL);
if (trypos != NULL) {
curwin->w_cursor.lnum = trypos->lnum + 1;
curwin->w_cursor.col = 0;
continue;
}
- /* Skip preprocessor directives and blank lines. */
- if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum))
+ // Skip preprocessor directives and blank lines.
+ if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum, &amount)) {
continue;
+ }
/* Finally the actual check for "namespace". */
if (cin_is_cpp_namespace(l)) {
amount += curbuf->b_ind_cpp_namespace
- added_to_amount;
break;
+ } else if (cin_is_cpp_extern_c(l)) {
+ amount += curbuf->b_ind_cpp_extern_c - added_to_amount;
+ break;
}
if (cin_nocode(l))
@@ -2501,11 +2589,10 @@ int get_c_indent(void)
break;
}
- /*
- * If we're in a comment or raw string now, skip to the start
- * of it.
- */ /* XXX */
- if ((trypos = ind_find_start_CORS()) != NULL) {
+ // If we're in a comment or raw string now, skip to the start
+ // of it.
+ // XXX
+ if ((trypos = ind_find_start_CORS(&raw_string_start)) != NULL) {
curwin->w_cursor.lnum = trypos->lnum + 1;
curwin->w_cursor.col = 0;
continue;
@@ -2648,9 +2735,10 @@ int get_c_indent(void)
* unlocked it)
*/
l = get_cursor_line_ptr();
- if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum)
- || cin_nocode(l))
+ if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum, &amount)
+ || cin_nocode(l)) {
continue;
+ }
/*
* Are we at the start of a cpp base class declaration or
@@ -3015,7 +3103,8 @@ int get_c_indent(void)
}
if (lookfor != LOOKFOR_TERM
&& lookfor != LOOKFOR_JS_KEY
- && lookfor != LOOKFOR_COMMA) {
+ && lookfor != LOOKFOR_COMMA
+ && raw_string_start != curwin->w_cursor.lnum) {
lookfor = LOOKFOR_UNTERM;
}
}
@@ -3270,11 +3359,10 @@ term_again:
l = get_cursor_line_ptr();
- /*
- * If we're in a comment or raw string now, skip to the start
- * of it.
- */ /* XXX */
- if ((trypos = ind_find_start_CORS()) != NULL) {
+ // If we're in a comment or raw string now, skip to the start
+ // of it.
+ // XXX
+ if ((trypos = ind_find_start_CORS(NULL)) != NULL) {
curwin->w_cursor.lnum = trypos->lnum + 1;
curwin->w_cursor.col = 0;
continue;
@@ -3295,11 +3383,12 @@ term_again:
break;
}
- /*
- * Skip preprocessor directives and blank lines.
- */
- if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum))
+ //
+ // Skip preprocessor directives and blank lines.
+ //
+ if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum, &amount)) {
continue;
+ }
if (cin_nocode(l))
continue;
@@ -3391,9 +3480,10 @@ term_again:
while (curwin->w_cursor.lnum > 1) {
look = ml_get(--curwin->w_cursor.lnum);
- if (!(cin_nocode(look) || cin_ispreproc_cont(
- &look, &curwin->w_cursor.lnum)))
+ if (!(cin_nocode(look)
+ || cin_ispreproc_cont(&look, &curwin->w_cursor.lnum, &amount))) {
break;
+ }
}
if (curwin->w_cursor.lnum > 0
&& cin_ends_in(look, (char_u *)"}", NULL))
diff --git a/src/nvim/keymap.c b/src/nvim/keymap.c
index 99e94fc60f..ade5487ec8 100644
--- a/src/nvim/keymap.c
+++ b/src/nvim/keymap.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <inttypes.h>
#include <limits.h>
@@ -21,23 +24,23 @@
* Some useful tables.
*/
-static struct modmasktable {
- short mod_mask; /* Bit-mask for particular key modifier */
- short mod_flag; /* Bit(s) for particular key modifier */
- char_u name; /* Single letter name of modifier */
-} mod_mask_table[] =
-{
- {MOD_MASK_ALT, MOD_MASK_ALT, (char_u)'M'},
- {MOD_MASK_META, MOD_MASK_META, (char_u)'T'},
- {MOD_MASK_CTRL, MOD_MASK_CTRL, (char_u)'C'},
- {MOD_MASK_SHIFT, MOD_MASK_SHIFT, (char_u)'S'},
- {MOD_MASK_MULTI_CLICK, MOD_MASK_2CLICK, (char_u)'2'},
- {MOD_MASK_MULTI_CLICK, MOD_MASK_3CLICK, (char_u)'3'},
- {MOD_MASK_MULTI_CLICK, MOD_MASK_4CLICK, (char_u)'4'},
- {MOD_MASK_CMD, MOD_MASK_CMD, (char_u)'D'},
+static const struct modmasktable {
+ uint16_t mod_mask; ///< Bit-mask for particular key modifier.
+ uint16_t mod_flag; ///< Bit(s) for particular key modifier.
+ char_u name; ///< Single letter name of modifier.
+} mod_mask_table[] = {
+ { MOD_MASK_ALT, MOD_MASK_ALT, (char_u)'M' },
+ { MOD_MASK_META, MOD_MASK_META, (char_u)'T' },
+ { MOD_MASK_CTRL, MOD_MASK_CTRL, (char_u)'C' },
+ { MOD_MASK_SHIFT, MOD_MASK_SHIFT, (char_u)'S' },
+ { MOD_MASK_MULTI_CLICK, MOD_MASK_2CLICK, (char_u)'2' },
+ { MOD_MASK_MULTI_CLICK, MOD_MASK_3CLICK, (char_u)'3' },
+ { MOD_MASK_MULTI_CLICK, MOD_MASK_4CLICK, (char_u)'4' },
+ { MOD_MASK_CMD, MOD_MASK_CMD, (char_u)'D' },
// 'A' must be the last one
- {MOD_MASK_ALT, MOD_MASK_ALT, (char_u)'A'},
- {0, 0, NUL}
+ { MOD_MASK_ALT, MOD_MASK_ALT, (char_u)'A' },
+ { 0, 0, NUL }
+ // NOTE: when adding an entry, update MAX_KEY_NAME_LEN!
};
/*
@@ -136,156 +139,155 @@ static char_u modifier_keys_table[] =
NUL
};
-static struct key_name_entry {
- int key; /* Special key code or ascii value */
- char_u *name; /* Name of key */
-} key_names_table[] =
-{
- {' ', (char_u *)"Space"},
- {TAB, (char_u *)"Tab"},
- {K_TAB, (char_u *)"Tab"},
- {NL, (char_u *)"NL"},
- {NL, (char_u *)"NewLine"}, /* Alternative name */
- {NL, (char_u *)"LineFeed"}, /* Alternative name */
- {NL, (char_u *)"LF"}, /* Alternative name */
- {CAR, (char_u *)"CR"},
- {CAR, (char_u *)"Return"}, /* Alternative name */
- {CAR, (char_u *)"Enter"}, /* Alternative name */
- {K_BS, (char_u *)"BS"},
- {K_BS, (char_u *)"BackSpace"}, /* Alternative name */
- {ESC, (char_u *)"Esc"},
- {CSI, (char_u *)"CSI"},
- {K_CSI, (char_u *)"xCSI"},
- {'|', (char_u *)"Bar"},
- {'\\', (char_u *)"Bslash"},
- {K_DEL, (char_u *)"Del"},
- {K_DEL, (char_u *)"Delete"}, /* Alternative name */
- {K_KDEL, (char_u *)"kDel"},
- {K_UP, (char_u *)"Up"},
- {K_DOWN, (char_u *)"Down"},
- {K_LEFT, (char_u *)"Left"},
- {K_RIGHT, (char_u *)"Right"},
- {K_XUP, (char_u *)"xUp"},
- {K_XDOWN, (char_u *)"xDown"},
- {K_XLEFT, (char_u *)"xLeft"},
- {K_XRIGHT, (char_u *)"xRight"},
-
- {K_F1, (char_u *)"F1"},
- {K_F2, (char_u *)"F2"},
- {K_F3, (char_u *)"F3"},
- {K_F4, (char_u *)"F4"},
- {K_F5, (char_u *)"F5"},
- {K_F6, (char_u *)"F6"},
- {K_F7, (char_u *)"F7"},
- {K_F8, (char_u *)"F8"},
- {K_F9, (char_u *)"F9"},
- {K_F10, (char_u *)"F10"},
-
- {K_F11, (char_u *)"F11"},
- {K_F12, (char_u *)"F12"},
- {K_F13, (char_u *)"F13"},
- {K_F14, (char_u *)"F14"},
- {K_F15, (char_u *)"F15"},
- {K_F16, (char_u *)"F16"},
- {K_F17, (char_u *)"F17"},
- {K_F18, (char_u *)"F18"},
- {K_F19, (char_u *)"F19"},
- {K_F20, (char_u *)"F20"},
-
- {K_F21, (char_u *)"F21"},
- {K_F22, (char_u *)"F22"},
- {K_F23, (char_u *)"F23"},
- {K_F24, (char_u *)"F24"},
- {K_F25, (char_u *)"F25"},
- {K_F26, (char_u *)"F26"},
- {K_F27, (char_u *)"F27"},
- {K_F28, (char_u *)"F28"},
- {K_F29, (char_u *)"F29"},
- {K_F30, (char_u *)"F30"},
-
- {K_F31, (char_u *)"F31"},
- {K_F32, (char_u *)"F32"},
- {K_F33, (char_u *)"F33"},
- {K_F34, (char_u *)"F34"},
- {K_F35, (char_u *)"F35"},
- {K_F36, (char_u *)"F36"},
- {K_F37, (char_u *)"F37"},
-
- {K_XF1, (char_u *)"xF1"},
- {K_XF2, (char_u *)"xF2"},
- {K_XF3, (char_u *)"xF3"},
- {K_XF4, (char_u *)"xF4"},
-
- {K_HELP, (char_u *)"Help"},
- {K_UNDO, (char_u *)"Undo"},
- {K_INS, (char_u *)"Insert"},
- {K_INS, (char_u *)"Ins"}, /* Alternative name */
- {K_KINS, (char_u *)"kInsert"},
- {K_HOME, (char_u *)"Home"},
- {K_KHOME, (char_u *)"kHome"},
- {K_XHOME, (char_u *)"xHome"},
- {K_ZHOME, (char_u *)"zHome"},
- {K_END, (char_u *)"End"},
- {K_KEND, (char_u *)"kEnd"},
- {K_XEND, (char_u *)"xEnd"},
- {K_ZEND, (char_u *)"zEnd"},
- {K_PAGEUP, (char_u *)"PageUp"},
- {K_PAGEDOWN, (char_u *)"PageDown"},
- {K_KPAGEUP, (char_u *)"kPageUp"},
- {K_KPAGEDOWN, (char_u *)"kPageDown"},
-
- {K_KPLUS, (char_u *)"kPlus"},
- {K_KMINUS, (char_u *)"kMinus"},
- {K_KDIVIDE, (char_u *)"kDivide"},
- {K_KMULTIPLY, (char_u *)"kMultiply"},
- {K_KENTER, (char_u *)"kEnter"},
- {K_KPOINT, (char_u *)"kPoint"},
-
- {K_K0, (char_u *)"k0"},
- {K_K1, (char_u *)"k1"},
- {K_K2, (char_u *)"k2"},
- {K_K3, (char_u *)"k3"},
- {K_K4, (char_u *)"k4"},
- {K_K5, (char_u *)"k5"},
- {K_K6, (char_u *)"k6"},
- {K_K7, (char_u *)"k7"},
- {K_K8, (char_u *)"k8"},
- {K_K9, (char_u *)"k9"},
-
- {'<', (char_u *)"lt"},
-
- {K_MOUSE, (char_u *)"Mouse"},
- {K_LEFTMOUSE, (char_u *)"LeftMouse"},
- {K_LEFTMOUSE_NM, (char_u *)"LeftMouseNM"},
- {K_LEFTDRAG, (char_u *)"LeftDrag"},
- {K_LEFTRELEASE, (char_u *)"LeftRelease"},
- {K_LEFTRELEASE_NM, (char_u *)"LeftReleaseNM"},
- {K_MIDDLEMOUSE, (char_u *)"MiddleMouse"},
- {K_MIDDLEDRAG, (char_u *)"MiddleDrag"},
- {K_MIDDLERELEASE, (char_u *)"MiddleRelease"},
- {K_RIGHTMOUSE, (char_u *)"RightMouse"},
- {K_RIGHTDRAG, (char_u *)"RightDrag"},
- {K_RIGHTRELEASE, (char_u *)"RightRelease"},
- {K_MOUSEDOWN, (char_u *)"ScrollWheelUp"},
- {K_MOUSEUP, (char_u *)"ScrollWheelDown"},
- {K_MOUSELEFT, (char_u *)"ScrollWheelRight"},
- {K_MOUSERIGHT, (char_u *)"ScrollWheelLeft"},
- {K_MOUSEDOWN, (char_u *)"MouseDown"}, /* OBSOLETE: Use */
- {K_MOUSEUP, (char_u *)"MouseUp"}, /* ScrollWheelXXX instead */
- {K_X1MOUSE, (char_u *)"X1Mouse"},
- {K_X1DRAG, (char_u *)"X1Drag"},
- {K_X1RELEASE, (char_u *)"X1Release"},
- {K_X2MOUSE, (char_u *)"X2Mouse"},
- {K_X2DRAG, (char_u *)"X2Drag"},
- {K_X2RELEASE, (char_u *)"X2Release"},
- {K_DROP, (char_u *)"Drop"},
- {K_ZERO, (char_u *)"Nul"},
- {K_SNR, (char_u *)"SNR"},
- {K_PLUG, (char_u *)"Plug"},
- {K_PASTE, (char_u *)"Paste"},
- {K_FOCUSGAINED, (char_u *)"FocusGained"},
- {K_FOCUSLOST, (char_u *)"FocusLost"},
- {0, NULL}
+static const struct key_name_entry {
+ int key; // Special key code or ascii value
+ const char *name; // Name of key
+} key_names_table[] = {
+ { ' ', "Space" },
+ { TAB, "Tab" },
+ { K_TAB, "Tab" },
+ { NL, "NL" },
+ { NL, "NewLine" }, // Alternative name
+ { NL, "LineFeed" }, // Alternative name
+ { NL, "LF" }, // Alternative name
+ { CAR, "CR" },
+ { CAR, "Return" }, // Alternative name
+ { CAR, "Enter" }, // Alternative name
+ { K_BS, "BS" },
+ { K_BS, "BackSpace" }, // Alternative name
+ { ESC, "Esc" },
+ { CSI, "CSI" },
+ { K_CSI, "xCSI" },
+ { '|', "Bar" },
+ { '\\', "Bslash" },
+ { K_DEL, "Del" },
+ { K_DEL, "Delete" }, // Alternative name
+ { K_KDEL, "kDel" },
+ { K_UP, "Up" },
+ { K_DOWN, "Down" },
+ { K_LEFT, "Left" },
+ { K_RIGHT, "Right" },
+ { K_XUP, "xUp" },
+ { K_XDOWN, "xDown" },
+ { K_XLEFT, "xLeft" },
+ { K_XRIGHT, "xRight" },
+
+ { K_F1, "F1" },
+ { K_F2, "F2" },
+ { K_F3, "F3" },
+ { K_F4, "F4" },
+ { K_F5, "F5" },
+ { K_F6, "F6" },
+ { K_F7, "F7" },
+ { K_F8, "F8" },
+ { K_F9, "F9" },
+ { K_F10, "F10" },
+
+ { K_F11, "F11" },
+ { K_F12, "F12" },
+ { K_F13, "F13" },
+ { K_F14, "F14" },
+ { K_F15, "F15" },
+ { K_F16, "F16" },
+ { K_F17, "F17" },
+ { K_F18, "F18" },
+ { K_F19, "F19" },
+ { K_F20, "F20" },
+
+ { K_F21, "F21" },
+ { K_F22, "F22" },
+ { K_F23, "F23" },
+ { K_F24, "F24" },
+ { K_F25, "F25" },
+ { K_F26, "F26" },
+ { K_F27, "F27" },
+ { K_F28, "F28" },
+ { K_F29, "F29" },
+ { K_F30, "F30" },
+
+ { K_F31, "F31" },
+ { K_F32, "F32" },
+ { K_F33, "F33" },
+ { K_F34, "F34" },
+ { K_F35, "F35" },
+ { K_F36, "F36" },
+ { K_F37, "F37" },
+
+ { K_XF1, "xF1" },
+ { K_XF2, "xF2" },
+ { K_XF3, "xF3" },
+ { K_XF4, "xF4" },
+
+ { K_HELP, "Help" },
+ { K_UNDO, "Undo" },
+ { K_INS, "Insert" },
+ { K_INS, "Ins" }, // Alternative name
+ { K_KINS, "kInsert" },
+ { K_HOME, "Home" },
+ { K_KHOME, "kHome" },
+ { K_XHOME, "xHome" },
+ { K_ZHOME, "zHome" },
+ { K_END, "End" },
+ { K_KEND, "kEnd" },
+ { K_XEND, "xEnd" },
+ { K_ZEND, "zEnd" },
+ { K_PAGEUP, "PageUp" },
+ { K_PAGEDOWN, "PageDown" },
+ { K_KPAGEUP, "kPageUp" },
+ { K_KPAGEDOWN, "kPageDown" },
+
+ { K_KPLUS, "kPlus" },
+ { K_KMINUS, "kMinus" },
+ { K_KDIVIDE, "kDivide" },
+ { K_KMULTIPLY, "kMultiply" },
+ { K_KENTER, "kEnter" },
+ { K_KPOINT, "kPoint" },
+
+ { K_K0, "k0" },
+ { K_K1, "k1" },
+ { K_K2, "k2" },
+ { K_K3, "k3" },
+ { K_K4, "k4" },
+ { K_K5, "k5" },
+ { K_K6, "k6" },
+ { K_K7, "k7" },
+ { K_K8, "k8" },
+ { K_K9, "k9" },
+
+ { '<', "lt" },
+
+ { K_MOUSE, "Mouse" },
+ { K_LEFTMOUSE, "LeftMouse" },
+ { K_LEFTMOUSE_NM, "LeftMouseNM" },
+ { K_LEFTDRAG, "LeftDrag" },
+ { K_LEFTRELEASE, "LeftRelease" },
+ { K_LEFTRELEASE_NM, "LeftReleaseNM" },
+ { K_MIDDLEMOUSE, "MiddleMouse" },
+ { K_MIDDLEDRAG, "MiddleDrag" },
+ { K_MIDDLERELEASE, "MiddleRelease" },
+ { K_RIGHTMOUSE, "RightMouse" },
+ { K_RIGHTDRAG, "RightDrag" },
+ { K_RIGHTRELEASE, "RightRelease" },
+ { K_MOUSEDOWN, "ScrollWheelUp" },
+ { K_MOUSEUP, "ScrollWheelDown" },
+ { K_MOUSELEFT, "ScrollWheelRight" },
+ { K_MOUSERIGHT, "ScrollWheelLeft" },
+ { K_MOUSEDOWN, "MouseDown" }, // OBSOLETE: Use
+ { K_MOUSEUP, "MouseUp" }, // ScrollWheelXXX instead
+ { K_X1MOUSE, "X1Mouse" },
+ { K_X1DRAG, "X1Drag" },
+ { K_X1RELEASE, "X1Release" },
+ { K_X2MOUSE, "X2Mouse" },
+ { K_X2DRAG, "X2Drag" },
+ { K_X2RELEASE, "X2Release" },
+ { K_DROP, "Drop" },
+ { K_ZERO, "Nul" },
+ { K_SNR, "SNR" },
+ { K_PLUG, "Plug" },
+ { K_PASTE, "Paste" },
+ { K_COMMAND, "Cmd" },
+ { 0, NULL }
+ // NOTE: When adding a long name update MAX_KEY_NAME_LEN.
};
static struct mousetable {
@@ -317,73 +319,73 @@ static struct mousetable {
{0, 0, 0, 0},
};
-/*
- * Return the modifier mask bit (MOD_MASK_*) which corresponds to the given
- * modifier name ('S' for Shift, 'C' for Ctrl etc).
- */
+/// Return the modifier mask bit (#MOD_MASK_*) corresponding to mod name
+///
+/// E.g. 'S' for shift, 'C' for ctrl.
int name_to_mod_mask(int c)
+ FUNC_ATTR_CONST FUNC_ATTR_WARN_UNUSED_RESULT
{
- int i;
-
c = TOUPPER_ASC(c);
- for (i = 0; mod_mask_table[i].mod_mask != 0; i++)
- if (c == mod_mask_table[i].name)
+ for (size_t i = 0; mod_mask_table[i].mod_mask != 0; i++) {
+ if (c == mod_mask_table[i].name) {
return mod_mask_table[i].mod_flag;
+ }
+ }
return 0;
}
-/*
- * Check if if there is a special key code for "key" that includes the
- * modifiers specified.
- */
-int simplify_key(int key, int *modifiers)
+/// Check if there is a special key code for "key" with specified modifiers
+///
+/// @param[in] key Initial key code.
+/// @param[in,out] modifiers Initial modifiers, is adjusted to have simplified
+/// modifiers.
+///
+/// @return Simplified key code.
+int simplify_key(const int key, int *modifiers)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
{
- int i;
- int key0;
- int key1;
-
if (*modifiers & (MOD_MASK_SHIFT | MOD_MASK_CTRL | MOD_MASK_ALT)) {
- /* TAB is a special case */
+ // TAB is a special case.
if (key == TAB && (*modifiers & MOD_MASK_SHIFT)) {
*modifiers &= ~MOD_MASK_SHIFT;
return K_S_TAB;
}
- key0 = KEY2TERMCAP0(key);
- key1 = KEY2TERMCAP1(key);
- for (i = 0; modifier_keys_table[i] != NUL; i += MOD_KEYS_ENTRY_SIZE)
+ const int key0 = KEY2TERMCAP0(key);
+ const int key1 = KEY2TERMCAP1(key);
+ for (int i = 0; modifier_keys_table[i] != NUL; i += MOD_KEYS_ENTRY_SIZE) {
if (key0 == modifier_keys_table[i + 3]
&& key1 == modifier_keys_table[i + 4]
&& (*modifiers & modifier_keys_table[i])) {
*modifiers &= ~modifier_keys_table[i];
return TERMCAP2KEY(modifier_keys_table[i + 1],
- modifier_keys_table[i + 2]);
+ modifier_keys_table[i + 2]);
}
+ }
}
return key;
}
-/*
- * Change <xHome> to <Home>, <xUp> to <Up>, etc.
- */
-int handle_x_keys(int key)
+/// Change <xKey> to <Key>
+int handle_x_keys(const int key)
+ FUNC_ATTR_CONST FUNC_ATTR_WARN_UNUSED_RESULT
{
switch (key) {
- case K_XUP: return K_UP;
- case K_XDOWN: return K_DOWN;
- case K_XLEFT: return K_LEFT;
- case K_XRIGHT: return K_RIGHT;
- case K_XHOME: return K_HOME;
- case K_ZHOME: return K_HOME;
- case K_XEND: return K_END;
- case K_ZEND: return K_END;
- case K_XF1: return K_F1;
- case K_XF2: return K_F2;
- case K_XF3: return K_F3;
- case K_XF4: return K_F4;
- case K_S_XF1: return K_S_F1;
- case K_S_XF2: return K_S_F2;
- case K_S_XF3: return K_S_F3;
- case K_S_XF4: return K_S_F4;
+ case K_XUP: return K_UP;
+ case K_XDOWN: return K_DOWN;
+ case K_XLEFT: return K_LEFT;
+ case K_XRIGHT: return K_RIGHT;
+ case K_XHOME: return K_HOME;
+ case K_ZHOME: return K_HOME;
+ case K_XEND: return K_END;
+ case K_ZEND: return K_END;
+ case K_XF1: return K_F1;
+ case K_XF2: return K_F2;
+ case K_XF3: return K_F3;
+ case K_XF4: return K_F4;
+ case K_S_XF1: return K_S_F1;
+ case K_S_XF2: return K_S_F2;
+ case K_S_XF3: return K_S_F3;
+ case K_S_XF4: return K_S_F4;
}
return key;
}
@@ -460,29 +462,32 @@ char_u *get_special_key_name(int c, int modifiers)
string[idx++] = '_';
string[idx++] = (char_u)KEY2TERMCAP0(c);
string[idx++] = KEY2TERMCAP1(c);
- }
- /* Not a special key, only modifiers, output directly */
- else {
- if (has_mbyte && (*mb_char2len)(c) > 1)
- idx += (*mb_char2bytes)(c, string + idx);
- else if (vim_isprintc(c))
+ } else {
+ // Not a special key, only modifiers, output directly.
+ if (utf_char2len(c) > 1) {
+ idx += utf_char2bytes(c, string + idx);
+ } else if (vim_isprintc(c)) {
string[idx++] = (char_u)c;
- else {
+ } else {
s = transchar(c);
while (*s)
string[idx++] = *s++;
}
}
- } else { /* use name of special key */
- STRCPY(string + idx, key_names_table[table_idx].name);
- idx = (int)STRLEN(string);
+ } else { // use name of special key
+ size_t len = STRLEN(key_names_table[table_idx].name);
+
+ if ((int)len + idx + 2 <= MAX_KEY_NAME_LEN) {
+ STRCPY(string + idx, key_names_table[table_idx].name);
+ idx += (int)len;
+ }
}
string[idx++] = '>';
string[idx] = NUL;
return string;
}
-/// Try translating a <> name
+/// Try translating a <> name ("keycode").
///
/// @param[in,out] srcp Source from which <> are translated. Is advanced to
/// after the <> name if there is a match.
@@ -490,22 +495,24 @@ char_u *get_special_key_name(int c, int modifiers)
/// @param[out] dst Location where translation result will be kept. Must have
/// at least six bytes.
/// @param[in] keycode Prefer key code, e.g. K_DEL in place of DEL.
+/// @param[in] in_string Inside a double quoted string
///
/// @return Number of characters added to dst, zero for no match.
unsigned int trans_special(const char_u **srcp, const size_t src_len,
- char_u *const dst, const bool keycode)
+ char_u *const dst, const bool keycode,
+ const bool in_string)
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
{
int modifiers = 0;
int key;
unsigned int dlen = 0;
- key = find_special_key(srcp, src_len, &modifiers, keycode, false);
+ key = find_special_key(srcp, src_len, &modifiers, keycode, false, in_string);
if (key == 0) {
return 0;
}
- /* Put the appropriate modifier in a string */
+ // Put the appropriate modifier in a string.
if (modifiers != 0) {
dst[dlen++] = K_SPECIAL;
dst[dlen++] = KS_MODIFIER;
@@ -516,14 +523,12 @@ unsigned int trans_special(const char_u **srcp, const size_t src_len,
dst[dlen++] = K_SPECIAL;
dst[dlen++] = (char_u)KEY2TERMCAP0(key);
dst[dlen++] = KEY2TERMCAP1(key);
- } else if (has_mbyte && !keycode) {
- dlen += (unsigned int)(*mb_char2bytes)(key, dst + dlen);
- } else if (keycode) {
+ } else if (!keycode) {
+ dlen += (unsigned int)utf_char2bytes(key, dst + dlen);
+ } else {
char_u *after = add_char2buf(key, dst + dlen);
assert(after >= dst && (uintmax_t)(after - dst) <= UINT_MAX);
dlen = (unsigned int)(after - dst);
- } else {
- dst[dlen++] = (char_u)key;
}
return dlen;
@@ -536,10 +541,12 @@ unsigned int trans_special(const char_u **srcp, const size_t src_len,
/// @param[out] modp Location where information about modifiers is saved.
/// @param[in] keycode Prefer key code, e.g. K_DEL in place of DEL.
/// @param[in] keep_x_key Donโ€™t translate xHome to Home key.
+/// @param[in] in_string In string, double quote is escaped
///
/// @return Key and modifiers or 0 if there is no match.
int find_special_key(const char_u **srcp, const size_t src_len, int *const modp,
- const bool keycode, const bool keep_x_key)
+ const bool keycode, const bool keep_x_key,
+ const bool in_string)
FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
{
const char_u *last_dash;
@@ -550,7 +557,7 @@ int find_special_key(const char_u **srcp, const size_t src_len, int *const modp,
int modifiers;
int bit;
int key;
- unsigned long n;
+ uvarnumber_T n;
int l;
if (src_len == 0) {
@@ -564,17 +571,19 @@ int find_special_key(const char_u **srcp, const size_t src_len, int *const modp,
// Find end of modifier list
last_dash = src;
- for (bp = src + 1; bp <= end && (*bp == '-' || vim_isIDc(*bp)); bp++) {
+ for (bp = src + 1; bp <= end && (*bp == '-' || ascii_isident(*bp)); bp++) {
if (*bp == '-') {
last_dash = bp;
if (bp + 1 <= end) {
- if (has_mbyte) {
- l = mb_ptr2len_len(bp + 1, (int) (end - bp) + 1);
- } else {
- l = 1;
- }
- if (end - bp > l && bp[l + 1] == '>') {
- bp += l; // anything accepted, like <C-?>
+ l = utfc_ptr2len_len(bp + 1, (int)(end - bp) + 1);
+ // Anything accepted, like <C-?>.
+ // <C-"> or <M-"> are not special in strings as " is
+ // the string delimiter. With a backslash it works: <M-\">
+ if (end - bp > l && !(in_string && bp[1] == '"') && bp[2] == '>') {
+ bp += l;
+ } else if (end - bp > 2 && in_string && bp[1] == '\\'
+ && bp[2] == '"' && bp[3] == '>') {
+ bp += 2;
}
}
}
@@ -610,18 +619,19 @@ int find_special_key(const char_u **srcp, const size_t src_len, int *const modp,
vim_str2nr(last_dash + 6, NULL, NULL, STR2NR_ALL, NULL, &n, 0);
key = (int)n;
} else {
- /*
- * Modifier with single letter, or special key name.
- */
- if (has_mbyte) {
- l = mb_ptr2len(last_dash + 1);
+ int off = 1;
+
+ // Modifier with single letter, or special key name.
+ if (in_string && last_dash[1] == '\\' && last_dash[2] == '"') {
+ // Special case for a double-quoted string
+ off = l = 2;
} else {
- l = 1;
+ l = mb_ptr2len(last_dash + 1);
}
if (modifiers != 0 && last_dash[l + 1] == '>') {
- key = PTR2CHAR(last_dash + 1);
+ key = PTR2CHAR(last_dash + off);
} else {
- key = get_special_key_code(last_dash + 1);
+ key = get_special_key_code(last_dash + off);
if (!keep_x_key) {
key = handle_x_keys(key);
}
@@ -692,33 +702,39 @@ int find_special_key_in_table(int c)
{
int i;
- for (i = 0; key_names_table[i].name != NULL; i++)
- if (c == key_names_table[i].key)
+ for (i = 0; key_names_table[i].name != NULL; i++) {
+ if (c == key_names_table[i].key) {
break;
- if (key_names_table[i].name == NULL)
+ }
+ }
+ if (key_names_table[i].name == NULL) {
i = -1;
+ }
return i;
}
-/*
- * Find the special key with the given name (the given string does not have to
- * end with NUL, the name is assumed to end before the first non-idchar).
- * If the name starts with "t_" the next two characters are interpreted as a
- * termcap name.
- * Return the key code, or 0 if not found.
- */
+/// Find the special key with the given name
+///
+/// @param[in] name Name of the special. Does not have to end with NUL, it is
+/// assumed to end before the first non-idchar. If name starts
+/// with "t_" the next two characters are interpreted as
+/// a termcap name.
+///
+/// @return Key code or 0 if not found.
int get_special_key_code(const char_u *name)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
- char_u *table_name;
- int i, j;
-
- for (i = 0; key_names_table[i].name != NULL; i++) {
- table_name = key_names_table[i].name;
- for (j = 0; vim_isIDc(name[j]) && table_name[j] != NUL; j++)
- if (TOLOWER_ASC(table_name[j]) != TOLOWER_ASC(name[j]))
+ for (int i = 0; key_names_table[i].name != NULL; i++) {
+ const char *const table_name = key_names_table[i].name;
+ int j;
+ for (j = 0; ascii_isident(name[j]) && table_name[j] != NUL; j++) {
+ if (TOLOWER_ASC(table_name[j]) != TOLOWER_ASC(name[j])) {
break;
- if (!vim_isIDc(name[j]) && table_name[j] == NUL)
+ }
+ }
+ if (!ascii_isident(name[j]) && table_name[j] == NUL) {
return key_names_table[i].key;
+ }
}
return 0;
@@ -744,9 +760,9 @@ int get_mouse_button(int code, bool *is_click, bool *is_drag)
/// Replace any terminal code strings with the equivalent internal
/// representation
///
-/// This is used for the "from" and "to" part of a mapping, and the "to" part of
+/// Used for the "from" and "to" part of a mapping, and the "to" part of
/// a menu command. Any strings like "<C-UP>" are also replaced, unless
-/// 'cpoptions' contains '<'. K_SPECIAL by itself is replaced by K_SPECIAL
+/// `special` is false. K_SPECIAL by itself is replaced by K_SPECIAL
/// KS_SPECIAL KE_FILLER.
///
/// @param[in] from What characters to replace.
@@ -759,7 +775,7 @@ int get_mouse_button(int code, bool *is_click, bool *is_drag)
/// When cpo_flags contains #FLAG_CPO_BSLASH, a backslash
/// can be used in place of <C-v>. All other <C-v>
/// characters are removed.
-/// @param[in] special If true, always accept <key> notation.
+/// @param[in] special Replace keycodes, e.g. <CR> becomes a "\n" char.
/// @param[in] cpo_flags Relevant flags derived from p_cpo, see
/// #CPO_TO_CPO_FLAGS.
///
@@ -778,11 +794,9 @@ char_u *replace_termcodes(const char_u *from, const size_t from_len,
const char_u *src;
const char_u *const end = from + from_len - 1;
int do_backslash; // backslash is a special character
- int do_special; // recognize <> key codes
char_u *result; // buffer for resulting string
do_backslash = !(cpo_flags&FLAG_CPO_BSLASH);
- do_special = !(cpo_flags&FLAG_CPO_SPECI) || special;
// Allocate space for the translation. Worst case a single character is
// replaced by 6 bytes (shifted special key), plus a NUL at the end.
@@ -805,10 +819,9 @@ char_u *replace_termcodes(const char_u *from, const size_t from_len,
// Copy each byte from *from to result[dlen]
while (src <= end) {
- // If 'cpoptions' does not contain '<', check for special key codes,
- // like "<C-S-LeftMouse>"
- if (do_special && (do_lt || ((end - src) >= 3
- && STRNCMP(src, "<lt>", 4) != 0))) {
+ // Check for special <> keycodes, like "<C-S-LeftMouse>"
+ if (special && (do_lt || ((end - src) >= 3
+ && STRNCMP(src, "<lt>", 4) != 0))) {
// Replace <SID> by K_SNR <script-nr> _.
// (room: 5 * 6 = 30 bytes; needed: 3 + <nr> + 1 <= 14)
if (end - src >= 4 && STRNICMP(src, "<SID>", 5) == 0) {
@@ -826,14 +839,15 @@ char_u *replace_termcodes(const char_u *from, const size_t from_len,
}
}
- slen = trans_special(&src, (size_t) (end - src) + 1, result + dlen, true);
+ slen = trans_special(&src, (size_t)(end - src) + 1, result + dlen, true,
+ false);
if (slen) {
dlen += slen;
continue;
}
}
- if (do_special) {
+ if (special) {
char_u *p, *s, len;
// Replace <Leader> by the value of "mapleader".
@@ -841,10 +855,10 @@ char_u *replace_termcodes(const char_u *from, const size_t from_len,
// If "mapleader" or "maplocalleader" isn't set use a backslash.
if (end - src >= 7 && STRNICMP(src, "<Leader>", 8) == 0) {
len = 8;
- p = get_var_value((char_u *)"g:mapleader");
+ p = get_var_value("g:mapleader");
} else if (end - src >= 12 && STRNICMP(src, "<LocalLeader>", 13) == 0) {
len = 13;
- p = get_var_value((char_u *)"g:maplocalleader");
+ p = get_var_value("g:maplocalleader");
} else {
len = 0;
p = NULL;
@@ -881,7 +895,7 @@ char_u *replace_termcodes(const char_u *from, const size_t from_len,
}
// skip multibyte char correctly
- for (i = (*mb_ptr2len_len)(src, (int) (end - src) + 1); i > 0; i--) {
+ for (i = utfc_ptr2len_len(src, (int)(end - src) + 1); i > 0; i--) {
// If the character is K_SPECIAL, replace it with K_SPECIAL
// KS_SPECIAL KE_FILLER.
// If compiled with the GUI replace CSI with K_CSI.
diff --git a/src/nvim/keymap.h b/src/nvim/keymap.h
index bb8ba84a6a..baf8963aa8 100644
--- a/src/nvim/keymap.h
+++ b/src/nvim/keymap.h
@@ -115,134 +115,139 @@
KS_ZERO ? K_ZERO : TERMCAP2KEY(a, b))
// Codes for keys that do not have a termcap name.
+// The numbers are fixed to make sure that recorded key sequences remain valid.
+// Add new entries at the end, not halfway.
//
// K_SPECIAL KS_EXTRA KE_xxx
//
// Entries must be in the range 0x02-0x7f (see comment at K_SPECIAL).
enum key_extra {
- KE_NAME = 3 /* name of this terminal entry */
-
- , KE_S_UP /* shift-up */
- , KE_S_DOWN /* shift-down */
-
- , KE_S_F1 /* shifted function keys */
- , KE_S_F2
- , KE_S_F3
- , KE_S_F4
- , KE_S_F5
- , KE_S_F6
- , KE_S_F7
- , KE_S_F8
- , KE_S_F9
- , KE_S_F10
-
- , KE_S_F11
- , KE_S_F12
- , KE_S_F13
- , KE_S_F14
- , KE_S_F15
- , KE_S_F16
- , KE_S_F17
- , KE_S_F18
- , KE_S_F19
- , KE_S_F20
-
- , KE_S_F21
- , KE_S_F22
- , KE_S_F23
- , KE_S_F24
- , KE_S_F25
- , KE_S_F26
- , KE_S_F27
- , KE_S_F28
- , KE_S_F29
- , KE_S_F30
-
- , KE_S_F31
- , KE_S_F32
- , KE_S_F33
- , KE_S_F34
- , KE_S_F35
- , KE_S_F36
- , KE_S_F37
-
- , KE_MOUSE /* mouse event start */
-
- /*
- * Symbols for pseudo keys which are translated from the real key symbols
- * above.
- */
- , KE_LEFTMOUSE /* Left mouse button click */
- , KE_LEFTDRAG /* Drag with left mouse button down */
- , KE_LEFTRELEASE /* Left mouse button release */
- , KE_MIDDLEMOUSE /* Middle mouse button click */
- , KE_MIDDLEDRAG /* Drag with middle mouse button down */
- , KE_MIDDLERELEASE /* Middle mouse button release */
- , KE_RIGHTMOUSE /* Right mouse button click */
- , KE_RIGHTDRAG /* Drag with right mouse button down */
- , KE_RIGHTRELEASE /* Right mouse button release */
-
- , KE_IGNORE /* Ignored mouse drag/release */
-
- , KE_TAB /* unshifted TAB key */
- , KE_S_TAB_OLD /* shifted TAB key (no longer used) */
-
- , KE_XF1 /* extra vt100 function keys for xterm */
- , KE_XF2
- , KE_XF3
- , KE_XF4
- , KE_XEND /* extra (vt100) end key for xterm */
- , KE_ZEND /* extra (vt100) end key for xterm */
- , KE_XHOME /* extra (vt100) home key for xterm */
- , KE_ZHOME /* extra (vt100) home key for xterm */
- , KE_XUP /* extra vt100 cursor keys for xterm */
- , KE_XDOWN
- , KE_XLEFT
- , KE_XRIGHT
-
- , KE_LEFTMOUSE_NM /* non-mappable Left mouse button click */
- , KE_LEFTRELEASE_NM /* non-mappable left mouse button release */
-
- , KE_S_XF1 /* extra vt100 shifted function keys for xterm */
- , KE_S_XF2
- , KE_S_XF3
- , KE_S_XF4
-
- /* NOTE: The scroll wheel events are inverted: i.e. UP is the same as
- * moving the actual scroll wheel down, LEFT is the same as moving the
- * scroll wheel right. */
- , KE_MOUSEDOWN /* scroll wheel pseudo-button Down */
- , KE_MOUSEUP /* scroll wheel pseudo-button Up */
- , KE_MOUSELEFT /* scroll wheel pseudo-button Left */
- , KE_MOUSERIGHT /* scroll wheel pseudo-button Right */
-
- , KE_KINS /* keypad Insert key */
- , KE_KDEL /* keypad Delete key */
-
- , KE_CSI /* CSI typed directly */
- , KE_SNR /* <SNR> */
- , KE_PLUG /* <Plug> */
- , KE_CMDWIN /* open command-line window from Command-line Mode */
-
- , KE_C_LEFT /* control-left */
- , KE_C_RIGHT /* control-right */
- , KE_C_HOME /* control-home */
- , KE_C_END /* control-end */
-
- , KE_X1MOUSE /* X1/X2 mouse-buttons */
- , KE_X1DRAG
- , KE_X1RELEASE
- , KE_X2MOUSE
- , KE_X2DRAG
- , KE_X2RELEASE
-
- , KE_DROP /* DnD data is available */
- , KE_NOP /* doesn't do something */
- , KE_FOCUSGAINED /* focus gained */
- , KE_FOCUSLOST /* focus lost */
- , KE_EVENT // event
- , KE_PASTE // special key to toggle the 'paste' option.
- // sent only by UIs
+ KE_NAME = 3 // name of this terminal entry
+
+ , KE_S_UP = 4 // shift-up
+ , KE_S_DOWN = 5 // shift-down
+
+ , KE_S_F1 = 6 // shifted function keys
+ , KE_S_F2 = 7
+ , KE_S_F3 = 8
+ , KE_S_F4 = 9
+ , KE_S_F5 = 10
+ , KE_S_F6 = 11
+ , KE_S_F7 = 12
+ , KE_S_F8 = 13
+ , KE_S_F9 = 14
+ , KE_S_F10 = 15
+
+ , KE_S_F11 = 16
+ , KE_S_F12 = 17
+ , KE_S_F13 = 18
+ , KE_S_F14 = 19
+ , KE_S_F15 = 20
+ , KE_S_F16 = 21
+ , KE_S_F17 = 22
+ , KE_S_F18 = 23
+ , KE_S_F19 = 24
+ , KE_S_F20 = 25
+
+ , KE_S_F21 = 26
+ , KE_S_F22 = 27
+ , KE_S_F23 = 28
+ , KE_S_F24 = 29
+ , KE_S_F25 = 30
+ , KE_S_F26 = 31
+ , KE_S_F27 = 32
+ , KE_S_F28 = 33
+ , KE_S_F29 = 34
+ , KE_S_F30 = 35
+
+ , KE_S_F31 = 36
+ , KE_S_F32 = 37
+ , KE_S_F33 = 38
+ , KE_S_F34 = 39
+ , KE_S_F35 = 40
+ , KE_S_F36 = 41
+ , KE_S_F37 = 42
+
+ , KE_MOUSE = 43 // mouse event start
+
+ // Symbols for pseudo keys which are translated from the real key symbols
+ // above.
+ , KE_LEFTMOUSE = 44 // Left mouse button click
+ , KE_LEFTDRAG = 45 // Drag with left mouse button down
+ , KE_LEFTRELEASE = 46 // Left mouse button release
+ , KE_MIDDLEMOUSE = 47 // Middle mouse button click
+ , KE_MIDDLEDRAG = 48 // Drag with middle mouse button down
+ , KE_MIDDLERELEASE = 49 // Middle mouse button release
+ , KE_RIGHTMOUSE = 50 // Right mouse button click
+ , KE_RIGHTDRAG = 51 // Drag with right mouse button down
+ , KE_RIGHTRELEASE = 52 // Right mouse button release
+
+ , KE_IGNORE = 53 // Ignored mouse drag/release
+
+ , KE_TAB = 54 // unshifted TAB key
+ , KE_S_TAB_OLD = 55 // shifted TAB key (no longer used)
+
+ // , KE_SNIFF_UNUSED = 56 // obsolete
+ , KE_XF1 = 57 // extra vt100 function keys for xterm
+ , KE_XF2 = 58
+ , KE_XF3 = 59
+ , KE_XF4 = 60
+ , KE_XEND = 61 // extra (vt100) end key for xterm
+ , KE_ZEND = 62 // extra (vt100) end key for xterm
+ , KE_XHOME = 63 // extra (vt100) home key for xterm
+ , KE_ZHOME = 64 // extra (vt100) home key for xterm
+ , KE_XUP = 65 // extra vt100 cursor keys for xterm
+ , KE_XDOWN = 66
+ , KE_XLEFT = 67
+ , KE_XRIGHT = 68
+
+ , KE_LEFTMOUSE_NM = 69 // non-mappable Left mouse button click
+ , KE_LEFTRELEASE_NM = 70 // non-mappable left mouse button release
+
+ , KE_S_XF1 = 71 // vt100 shifted function keys for xterm
+ , KE_S_XF2 = 72
+ , KE_S_XF3 = 73
+ , KE_S_XF4 = 74
+
+ // NOTE: The scroll wheel events are inverted: i.e. UP is the same as
+ // moving the actual scroll wheel down, LEFT is the same as moving the
+ // scroll wheel right.
+ , KE_MOUSEDOWN = 75 // scroll wheel pseudo-button Down
+ , KE_MOUSEUP = 76 // scroll wheel pseudo-button Up
+ , KE_MOUSELEFT = 77 // scroll wheel pseudo-button Left
+ , KE_MOUSERIGHT = 78 // scroll wheel pseudo-button Right
+
+ , KE_KINS = 79 // keypad Insert key
+ , KE_KDEL = 80 // keypad Delete key
+
+ , KE_CSI = 81 // CSI typed directly
+ , KE_SNR = 82 // <SNR>
+ , KE_PLUG = 83 // <Plug>
+ , KE_CMDWIN = 84 // open command-line window from Command-line Mode
+
+ , KE_C_LEFT = 85 // control-left
+ , KE_C_RIGHT = 86 // control-right
+ , KE_C_HOME = 87 // control-home
+ , KE_C_END = 88 // control-end
+
+ , KE_X1MOUSE = 89 // X1/X2 mouse-buttons
+ , KE_X1DRAG = 90
+ , KE_X1RELEASE = 91
+ , KE_X2MOUSE = 92
+ , KE_X2DRAG = 93
+ , KE_X2RELEASE = 94
+
+ , KE_DROP = 95 // DnD data is available
+ // , KE_CURSORHOLD = 96 // CursorHold event
+ , KE_NOP = 97 // doesn't do something
+ , KE_FOCUSGAINED = 98 // focus gained
+ , KE_FOCUSLOST = 99 // focus lost
+ // , KE_MOUSEMOVE = 100 // mouse moved with no button down
+ // , KE_CANCEL = 101 // return from vgetc
+ , KE_EVENT = 102 // event
+ , KE_PASTE = 103 // special key to toggle the 'paste' option.
+ // sent only by UIs
+ , KE_COMMAND = 104 // <Cmd> special key
};
/*
@@ -428,11 +433,10 @@ enum key_extra {
#define K_CMDWIN TERMCAP2KEY(KS_EXTRA, KE_CMDWIN)
#define K_DROP TERMCAP2KEY(KS_EXTRA, KE_DROP)
-#define K_FOCUSGAINED TERMCAP2KEY(KS_EXTRA, KE_FOCUSGAINED)
-#define K_FOCUSLOST TERMCAP2KEY(KS_EXTRA, KE_FOCUSLOST)
#define K_EVENT TERMCAP2KEY(KS_EXTRA, KE_EVENT)
#define K_PASTE TERMCAP2KEY(KS_EXTRA, KE_PASTE)
+#define K_COMMAND TERMCAP2KEY(KS_EXTRA, KE_COMMAND)
/* Bits for modifier mask */
/* 0x01 cannot be used, because the modifier must be 0x02 or higher */
@@ -443,16 +447,17 @@ enum key_extra {
#define MOD_MASK_2CLICK 0x20 // use MOD_MASK_MULTI_CLICK
#define MOD_MASK_3CLICK 0x40 // use MOD_MASK_MULTI_CLICK
#define MOD_MASK_4CLICK 0x60 // use MOD_MASK_MULTI_CLICK
-#define MOD_MASK_CMD 0x80 // "super" key (OSX/Mac: command-key)
+#define MOD_MASK_CMD 0x80 // "super" key (macOS: command-key)
#define MOD_MASK_MULTI_CLICK (MOD_MASK_2CLICK|MOD_MASK_3CLICK| \
MOD_MASK_4CLICK)
/*
* The length of the longest special key name, including modifiers.
- * Current longest is <M-C-S-T-4-MiddleRelease> (length includes '<' and '>').
+ * Current longest is <M-C-S-T-D-A-4-ScrollWheelRight> (length includes '<' and
+ * '>').
*/
-#define MAX_KEY_NAME_LEN 25
+#define MAX_KEY_NAME_LEN 32
// Maximum length of a special key event as tokens. This includes modifiers.
// The longest event is something like <M-C-S-T-4-LeftDrag> which would be the
@@ -464,13 +469,9 @@ enum key_extra {
#define MAX_KEY_CODE_LEN 6
#define FLAG_CPO_BSLASH 0x01
-#define FLAG_CPO_SPECI 0x02
-#define CPO_TO_CPO_FLAGS (((vim_strchr(p_cpo, CPO_BSLASH) == NULL) \
- ? 0 \
- : FLAG_CPO_BSLASH)| \
- (vim_strchr(p_cpo, CPO_SPECI) == NULL \
- ? 0 \
- : FLAG_CPO_SPECI))
+#define CPO_TO_CPO_FLAGS ((vim_strchr(p_cpo, CPO_BSLASH) == NULL) \
+ ? 0 \
+ : FLAG_CPO_BSLASH)
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "keymap.h.generated.h"
diff --git a/src/nvim/lib/kbtree.h b/src/nvim/lib/kbtree.h
new file mode 100644
index 0000000000..e2688064a8
--- /dev/null
+++ b/src/nvim/lib/kbtree.h
@@ -0,0 +1,431 @@
+/*-
+ * Copyright 1997-1999, 2001, John-Mark Gurney.
+ * 2008-2009, Attractive Chaos <attractor@live.co.uk>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef NVIM_LIB_KBTREE_H
+#define NVIM_LIB_KBTREE_H
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+#include "nvim/memory.h"
+
+#define KB_MAX_DEPTH 64
+
+#define __KB_KEY(type, x) (x->key)
+#define __KB_PTR(btr, x) (x->ptr)
+
+#define __KB_TREE_T(name,key_t,T) \
+ typedef struct kbnode_##name##_s kbnode_##name##_t; \
+ struct kbnode_##name##_s { \
+ int32_t n; \
+ bool is_internal; \
+ key_t key[2*T-1]; \
+ kbnode_##name##_t *ptr[]; \
+ } ; \
+ \
+ typedef struct { \
+ kbnode_##name##_t *root; \
+ int n_keys, n_nodes; \
+ } kbtree_##name##_t; \
+ \
+ typedef struct { \
+ kbnode_##name##_t *x; \
+ int i; \
+ } kbpos_##name##_t; \
+ typedef struct { \
+ kbpos_##name##_t stack[KB_MAX_DEPTH], *p; \
+ } kbitr_##name##_t; \
+
+
+#define __kb_destroy(kbnode_t,b) do { \
+ int i; \
+ unsigned int max = 8; \
+ kbnode_t *x, **top, **stack = 0; \
+ if (b->root) { \
+ top = stack = (kbnode_t**)xcalloc(max, sizeof(kbnode_t*)); \
+ *top++ = (b)->root; \
+ while (top != stack) { \
+ x = *--top; \
+ if (x->is_internal == 0) { xfree(x); continue; } \
+ for (i = 0; i <= x->n; ++i) \
+ if (__KB_PTR(b, x)[i]) { \
+ if (top - stack == (int)max) { \
+ max <<= 1; \
+ stack = (kbnode_t**)xrealloc(stack, max * sizeof(kbnode_t*)); \
+ top = stack + (max>>1); \
+ } \
+ *top++ = __KB_PTR(b, x)[i]; \
+ } \
+ xfree(x); \
+ } \
+ } \
+ xfree(stack); \
+ } while (0)
+
+#define __KB_GET_AUX1(name, key_t, kbnode_t, __cmp) \
+ static inline int __kb_getp_aux_##name(const kbnode_t * __restrict x, key_t * __restrict k, int *r) \
+ { \
+ int tr, *rr, begin = 0, end = x->n; \
+ if (x->n == 0) return -1; \
+ rr = r? r : &tr; \
+ while (begin < end) { \
+ int mid = (begin + end) >> 1; \
+ if (__cmp(__KB_KEY(key_t, x)[mid], *k) < 0) begin = mid + 1; \
+ else end = mid; \
+ } \
+ if (begin == x->n) { *rr = 1; return x->n - 1; } \
+ if ((*rr = __cmp(*k, __KB_KEY(key_t, x)[begin])) < 0) --begin; \
+ return begin; \
+ }
+
+#define __KB_GET(name, key_t, kbnode_t) \
+ static key_t *kb_getp_##name(kbtree_##name##_t *b, key_t * __restrict k) \
+ { \
+ if (!b->root) { \
+ return 0; \
+ } \
+ int i, r = 0; \
+ kbnode_t *x = b->root; \
+ while (x) { \
+ i = __kb_getp_aux_##name(x, k, &r); \
+ if (i >= 0 && r == 0) return &__KB_KEY(key_t, x)[i]; \
+ if (x->is_internal == 0) return 0; \
+ x = __KB_PTR(b, x)[i + 1]; \
+ } \
+ return 0; \
+ } \
+ static inline key_t *kb_get_##name(kbtree_##name##_t *b, key_t k) \
+ { \
+ return kb_getp_##name(b, &k); \
+ }
+
+#define __KB_INTERVAL(name, key_t, kbnode_t) \
+ static inline void kb_intervalp_##name(kbtree_##name##_t *b, key_t * __restrict k, key_t **lower, key_t **upper) \
+ { \
+ if (!b->root) { \
+ return; \
+ } \
+ int i, r = 0; \
+ kbnode_t *x = b->root; \
+ *lower = *upper = 0; \
+ while (x) { \
+ i = __kb_getp_aux_##name(x, k, &r); \
+ if (i >= 0 && r == 0) { \
+ *lower = *upper = &__KB_KEY(key_t, x)[i]; \
+ return; \
+ } \
+ if (i >= 0) *lower = &__KB_KEY(key_t, x)[i]; \
+ if (i < x->n - 1) *upper = &__KB_KEY(key_t, x)[i + 1]; \
+ if (x->is_internal == 0) return; \
+ x = __KB_PTR(b, x)[i + 1]; \
+ } \
+ } \
+ static inline void kb_interval_##name(kbtree_##name##_t *b, key_t k, key_t **lower, key_t **upper) \
+ { \
+ kb_intervalp_##name(b, &k, lower, upper); \
+ }
+
+#define __KB_PUT(name, key_t, kbnode_t, __cmp, T, ILEN) \
+ /* x must be an internal node */ \
+ static inline void __kb_split_##name(kbtree_##name##_t *b, kbnode_t *x, int i, kbnode_t *y) \
+ { \
+ kbnode_t *z; \
+ z = (kbnode_t*)xcalloc(1, y->is_internal? ILEN : sizeof(kbnode_##name##_t)); \
+ ++b->n_nodes; \
+ z->is_internal = y->is_internal; \
+ z->n = T - 1; \
+ memcpy(__KB_KEY(key_t, z), &__KB_KEY(key_t, y)[T], sizeof(key_t) * (T - 1)); \
+ if (y->is_internal) memcpy(__KB_PTR(b, z), &__KB_PTR(b, y)[T], sizeof(void*) * T); \
+ y->n = T - 1; \
+ memmove(&__KB_PTR(b, x)[i + 2], &__KB_PTR(b, x)[i + 1], sizeof(void*) * (unsigned int)(x->n - i)); \
+ __KB_PTR(b, x)[i + 1] = z; \
+ memmove(&__KB_KEY(key_t, x)[i + 1], &__KB_KEY(key_t, x)[i], sizeof(key_t) * (unsigned int)(x->n - i)); \
+ __KB_KEY(key_t, x)[i] = __KB_KEY(key_t, y)[T - 1]; \
+ ++x->n; \
+ } \
+ static inline key_t *__kb_putp_aux_##name(kbtree_##name##_t *b, kbnode_t *x, key_t * __restrict k) \
+ { \
+ int i = x->n - 1; \
+ key_t *ret; \
+ if (x->is_internal == 0) { \
+ i = __kb_getp_aux_##name(x, k, 0); \
+ if (i != x->n - 1) \
+ memmove(&__KB_KEY(key_t, x)[i + 2], &__KB_KEY(key_t, x)[i + 1], (unsigned int)(x->n - i - 1) * sizeof(key_t)); \
+ ret = &__KB_KEY(key_t, x)[i + 1]; \
+ *ret = *k; \
+ ++x->n; \
+ } else { \
+ i = __kb_getp_aux_##name(x, k, 0) + 1; \
+ if (__KB_PTR(b, x)[i]->n == 2 * T - 1) { \
+ __kb_split_##name(b, x, i, __KB_PTR(b, x)[i]); \
+ if (__cmp(*k, __KB_KEY(key_t, x)[i]) > 0) ++i; \
+ } \
+ ret = __kb_putp_aux_##name(b, __KB_PTR(b, x)[i], k); \
+ } \
+ return ret; \
+ } \
+ static inline key_t *kb_putp_##name(kbtree_##name##_t *b, key_t * __restrict k) \
+ { \
+ if (!b->root) { \
+ b->root = (kbnode_t*)xcalloc(1, ILEN); \
+ ++b->n_nodes; \
+ } \
+ kbnode_t *r, *s; \
+ ++b->n_keys; \
+ r = b->root; \
+ if (r->n == 2 * T - 1) { \
+ ++b->n_nodes; \
+ s = (kbnode_t*)xcalloc(1, ILEN); \
+ b->root = s; s->is_internal = 1; s->n = 0; \
+ __KB_PTR(b, s)[0] = r; \
+ __kb_split_##name(b, s, 0, r); \
+ r = s; \
+ } \
+ return __kb_putp_aux_##name(b, r, k); \
+ } \
+ static inline void kb_put_##name(kbtree_##name##_t *b, key_t k) \
+ { \
+ kb_putp_##name(b, &k); \
+ }
+
+
+#define __KB_DEL(name, key_t, kbnode_t, T) \
+ static inline key_t __kb_delp_aux_##name(kbtree_##name##_t *b, kbnode_t *x, key_t * __restrict k, int s) \
+ { \
+ int yn, zn, i, r = 0; \
+ kbnode_t *xp, *y, *z; \
+ key_t kp; \
+ if (x == 0) return *k; \
+ if (s) { /* s can only be 0, 1 or 2 */ \
+ r = x->is_internal == 0? 0 : s == 1? 1 : -1; \
+ i = s == 1? x->n - 1 : -1; \
+ } else i = __kb_getp_aux_##name(x, k, &r); \
+ if (x->is_internal == 0) { \
+ if (s == 2) ++i; \
+ kp = __KB_KEY(key_t, x)[i]; \
+ memmove(&__KB_KEY(key_t, x)[i], &__KB_KEY(key_t, x)[i + 1], (unsigned int)(x->n - i - 1) * sizeof(key_t)); \
+ --x->n; \
+ return kp; \
+ } \
+ if (r == 0) { \
+ if ((yn = __KB_PTR(b, x)[i]->n) >= T) { \
+ xp = __KB_PTR(b, x)[i]; \
+ kp = __KB_KEY(key_t, x)[i]; \
+ __KB_KEY(key_t, x)[i] = __kb_delp_aux_##name(b, xp, 0, 1); \
+ return kp; \
+ } else if ((zn = __KB_PTR(b, x)[i + 1]->n) >= T) { \
+ xp = __KB_PTR(b, x)[i + 1]; \
+ kp = __KB_KEY(key_t, x)[i]; \
+ __KB_KEY(key_t, x)[i] = __kb_delp_aux_##name(b, xp, 0, 2); \
+ return kp; \
+ } else if (yn == T - 1 && zn == T - 1) { \
+ y = __KB_PTR(b, x)[i]; z = __KB_PTR(b, x)[i + 1]; \
+ __KB_KEY(key_t, y)[y->n++] = *k; \
+ memmove(&__KB_KEY(key_t, y)[y->n], __KB_KEY(key_t, z), (unsigned int)z->n * sizeof(key_t)); \
+ if (y->is_internal) memmove(&__KB_PTR(b, y)[y->n], __KB_PTR(b, z), (unsigned int)(z->n + 1) * sizeof(void*)); \
+ y->n += z->n; \
+ memmove(&__KB_KEY(key_t, x)[i], &__KB_KEY(key_t, x)[i + 1], (unsigned int)(x->n - i - 1) * sizeof(key_t)); \
+ memmove(&__KB_PTR(b, x)[i + 1], &__KB_PTR(b, x)[i + 2], (unsigned int)(x->n - i - 1) * sizeof(void*)); \
+ --x->n; \
+ xfree(z); \
+ return __kb_delp_aux_##name(b, y, k, s); \
+ } \
+ } \
+ ++i; \
+ if ((xp = __KB_PTR(b, x)[i])->n == T - 1) { \
+ if (i > 0 && (y = __KB_PTR(b, x)[i - 1])->n >= T) { \
+ memmove(&__KB_KEY(key_t, xp)[1], __KB_KEY(key_t, xp), (unsigned int)xp->n * sizeof(key_t)); \
+ if (xp->is_internal) memmove(&__KB_PTR(b, xp)[1], __KB_PTR(b, xp), (unsigned int)(xp->n + 1) * sizeof(void*)); \
+ __KB_KEY(key_t, xp)[0] = __KB_KEY(key_t, x)[i - 1]; \
+ __KB_KEY(key_t, x)[i - 1] = __KB_KEY(key_t, y)[y->n - 1]; \
+ if (xp->is_internal) __KB_PTR(b, xp)[0] = __KB_PTR(b, y)[y->n]; \
+ --y->n; ++xp->n; \
+ } else if (i < x->n && (y = __KB_PTR(b, x)[i + 1])->n >= T) { \
+ __KB_KEY(key_t, xp)[xp->n++] = __KB_KEY(key_t, x)[i]; \
+ __KB_KEY(key_t, x)[i] = __KB_KEY(key_t, y)[0]; \
+ if (xp->is_internal) __KB_PTR(b, xp)[xp->n] = __KB_PTR(b, y)[0]; \
+ --y->n; \
+ memmove(__KB_KEY(key_t, y), &__KB_KEY(key_t, y)[1], (unsigned int)y->n * sizeof(key_t)); \
+ if (y->is_internal) memmove(__KB_PTR(b, y), &__KB_PTR(b, y)[1], (unsigned int)(y->n + 1) * sizeof(void*)); \
+ } else if (i > 0 && (y = __KB_PTR(b, x)[i - 1])->n == T - 1) { \
+ __KB_KEY(key_t, y)[y->n++] = __KB_KEY(key_t, x)[i - 1]; \
+ memmove(&__KB_KEY(key_t, y)[y->n], __KB_KEY(key_t, xp), (unsigned int)xp->n * sizeof(key_t)); \
+ if (y->is_internal) memmove(&__KB_PTR(b, y)[y->n], __KB_PTR(b, xp), (unsigned int)(xp->n + 1) * sizeof(void*)); \
+ y->n += xp->n; \
+ memmove(&__KB_KEY(key_t, x)[i - 1], &__KB_KEY(key_t, x)[i], (unsigned int)(x->n - i) * sizeof(key_t)); \
+ memmove(&__KB_PTR(b, x)[i], &__KB_PTR(b, x)[i + 1], (unsigned int)(x->n - i) * sizeof(void*)); \
+ --x->n; \
+ xfree(xp); \
+ xp = y; \
+ } else if (i < x->n && (y = __KB_PTR(b, x)[i + 1])->n == T - 1) { \
+ __KB_KEY(key_t, xp)[xp->n++] = __KB_KEY(key_t, x)[i]; \
+ memmove(&__KB_KEY(key_t, xp)[xp->n], __KB_KEY(key_t, y), (unsigned int)y->n * sizeof(key_t)); \
+ if (xp->is_internal) memmove(&__KB_PTR(b, xp)[xp->n], __KB_PTR(b, y), (unsigned int)(y->n + 1) * sizeof(void*)); \
+ xp->n += y->n; \
+ memmove(&__KB_KEY(key_t, x)[i], &__KB_KEY(key_t, x)[i + 1], (unsigned int)(x->n - i - 1) * sizeof(key_t)); \
+ memmove(&__KB_PTR(b, x)[i + 1], &__KB_PTR(b, x)[i + 2], (unsigned int)(x->n - i - 1) * sizeof(void*)); \
+ --x->n; \
+ xfree(y); \
+ } \
+ } \
+ return __kb_delp_aux_##name(b, xp, k, s); \
+ } \
+ static inline key_t kb_delp_##name(kbtree_##name##_t *b, key_t * __restrict k) \
+ { \
+ kbnode_t *x; \
+ key_t ret; \
+ ret = __kb_delp_aux_##name(b, b->root, k, 0); \
+ --b->n_keys; \
+ if (b->root->n == 0 && b->root->is_internal) { \
+ --b->n_nodes; \
+ x = b->root; \
+ b->root = __KB_PTR(b, x)[0]; \
+ xfree(x); \
+ } \
+ return ret; \
+ } \
+ static inline key_t kb_del_##name(kbtree_##name##_t *b, key_t k) \
+ { \
+ return kb_delp_##name(b, &k); \
+ }
+
+#define __KB_ITR(name, key_t, kbnode_t) \
+ static inline void kb_itr_first_##name(kbtree_##name##_t *b, kbitr_##name##_t *itr) \
+ { \
+ itr->p = 0; \
+ if (b->n_keys == 0) return; \
+ itr->p = itr->stack; \
+ itr->p->x = b->root; itr->p->i = 0; \
+ while (itr->p->x->is_internal && __KB_PTR(b, itr->p->x)[0] != 0) { \
+ kbnode_t *x = itr->p->x; \
+ ++itr->p; \
+ itr->p->x = __KB_PTR(b, x)[0]; itr->p->i = 0; \
+ } \
+ } \
+ static inline int kb_itr_next_##name(kbtree_##name##_t *b, kbitr_##name##_t *itr) \
+ { \
+ if (itr->p < itr->stack) return 0; \
+ for (;;) { \
+ ++itr->p->i; \
+ while (itr->p->x && itr->p->i <= itr->p->x->n) { \
+ itr->p[1].i = 0; \
+ itr->p[1].x = itr->p->x->is_internal? __KB_PTR(b, itr->p->x)[itr->p->i] : 0; \
+ ++itr->p; \
+ } \
+ --itr->p; \
+ if (itr->p < itr->stack) return 0; \
+ if (itr->p->x && itr->p->i < itr->p->x->n) return 1; \
+ } \
+ } \
+ static inline int kb_itr_prev_##name(kbtree_##name##_t *b, kbitr_##name##_t *itr) \
+ { \
+ if (itr->p < itr->stack) return 0; \
+ for (;;) { \
+ while (itr->p->x && itr->p->i >= 0) { \
+ itr->p[1].x = itr->p->x->is_internal? __KB_PTR(b, itr->p->x)[itr->p->i] : 0; \
+ itr->p[1].i = itr->p[1].x ? itr->p[1].x->n : -1; \
+ ++itr->p; \
+ } \
+ --itr->p; \
+ if (itr->p < itr->stack) return 0; \
+ --itr->p->i; \
+ if (itr->p->x && itr->p->i >= 0) return 1; \
+ } \
+ } \
+ static inline int kb_itr_getp_##name(kbtree_##name##_t *b, key_t * __restrict k, kbitr_##name##_t *itr) \
+ { \
+ if (b->n_keys == 0) { \
+ itr->p = NULL; \
+ return 0; \
+ } \
+ int i, r = 0; \
+ itr->p = itr->stack; \
+ itr->p->x = b->root; \
+ while (itr->p->x) { \
+ i = __kb_getp_aux_##name(itr->p->x, k, &r); \
+ itr->p->i = i; \
+ if (i >= 0 && r == 0) return 1; \
+ ++itr->p->i; \
+ itr->p[1].x = itr->p->x->is_internal? __KB_PTR(b, itr->p->x)[i + 1] : 0; \
+ ++itr->p; \
+ } \
+ return 0; \
+ } \
+ static inline int kb_itr_get_##name(kbtree_##name##_t *b, key_t k, kbitr_##name##_t *itr) \
+ { \
+ return kb_itr_getp_##name(b,&k,itr); \
+ } \
+ static inline void kb_del_itr_##name(kbtree_##name##_t *b, kbitr_##name##_t *itr) \
+ { \
+ key_t k = kb_itr_key(itr); \
+ kb_delp_##name(b, &k); \
+ kb_itr_getp_##name(b, &k, itr); \
+ }
+
+#define KBTREE_INIT(name, key_t, __cmp, T) \
+ KBTREE_INIT_IMPL(name, key_t, kbnode_##name##_t, __cmp, T, (sizeof(kbnode_##name##_t)+(2*T)*sizeof(void *)))
+
+#define KBTREE_INIT_IMPL(name, key_t, kbnode_t, __cmp, T, ILEN) \
+ __KB_TREE_T(name, key_t, T) \
+ __KB_GET_AUX1(name, key_t, kbnode_t, __cmp) \
+ __KB_GET(name, key_t, kbnode_t) \
+ __KB_INTERVAL(name, key_t, kbnode_t) \
+ __KB_PUT(name, key_t, kbnode_t, __cmp, T, ILEN) \
+ __KB_DEL(name, key_t, kbnode_t, T) \
+ __KB_ITR(name, key_t, kbnode_t)
+
+#define KB_DEFAULT_SIZE 512
+
+#define kbtree_t(name) kbtree_##name##_t
+#define kbitr_t(name) kbitr_##name##_t
+#define kb_init(b) ((b)->n_keys = (b)->n_nodes = 0, (b)->root = 0)
+#define kb_destroy(name, b) __kb_destroy(kbnode_##name##_t, b)
+#define kb_get(name, b, k) kb_get_##name(b, k)
+#define kb_put(name, b, k) kb_put_##name(b, k)
+#define kb_del(name, b, k) kb_del_##name(b, k)
+#define kb_interval(name, b, k, l, u) kb_interval_##name(b, k, l, u)
+#define kb_getp(name, b, k) kb_getp_##name(b, k)
+#define kb_putp(name, b, k) kb_putp_##name(b, k)
+#define kb_delp(name, b, k) kb_delp_##name(b, k)
+#define kb_intervalp(name, b, k, l, u) kb_intervalp_##name(b, k, l, u)
+
+#define kb_itr_first(name, b, i) kb_itr_first_##name(b, i)
+#define kb_itr_get(name, b, k, i) kb_itr_get_##name(b, k, i)
+#define kb_itr_getp(name, b, k, i) kb_itr_getp_##name(b, k, i)
+#define kb_itr_next(name, b, i) kb_itr_next_##name(b, i)
+#define kb_itr_prev(name, b, i) kb_itr_prev_##name(b, i)
+#define kb_del_itr(name, b, i) kb_del_itr_##name(b, i)
+#define kb_itr_key(itr) __KB_KEY(dummy, (itr)->p->x)[(itr)->p->i]
+#define kb_itr_valid(itr) ((itr)->p >= (itr)->stack)
+
+#define kb_size(b) ((b)->n_keys)
+
+#define kb_generic_cmp(a, b) (((b) < (a)) - ((a) < (b)))
+#define kb_str_cmp(a, b) strcmp(a, b)
+
+#endif // NVIM_LIB_KBTREE_H
diff --git a/src/nvim/lib/kvec.h b/src/nvim/lib/kvec.h
index 584282d773..93b2f053bc 100644
--- a/src/nvim/lib/kvec.h
+++ b/src/nvim/lib/kvec.h
@@ -41,6 +41,7 @@
#include <string.h>
#include "nvim/memory.h"
+#include "nvim/os/os_defs.h"
#define kv_roundup32(x) \
((--(x)), \
@@ -62,7 +63,16 @@
#define kv_pop(v) ((v).items[--(v).size])
#define kv_size(v) ((v).size)
#define kv_max(v) ((v).capacity)
-#define kv_last(v) kv_A(v, kv_size(v) - 1)
+#define kv_Z(v, i) kv_A(v, kv_size(v) - (i) - 1)
+#define kv_last(v) kv_Z(v, 0)
+
+/// Drop last n items from kvec without resizing
+///
+/// Previously spelled as `(void)kv_pop(v)`, repeated n times.
+///
+/// @param[out] v Kvec to drop items from.
+/// @param[in] n Number of elements to drop.
+#define kv_drop(v, n) ((v).size -= (n))
#define kv_resize(v, s) \
((v).capacity = (s), \
@@ -88,14 +98,14 @@
(*kv_pushp(v) = (x))
#define kv_a(v, i) \
- (((v).capacity <= (size_t) (i) \
+ (*(((v).capacity <= (size_t) (i) \
? ((v).capacity = (v).size = (i) + 1, \
kv_roundup32((v).capacity), \
- kv_resize((v), (v).capacity), 0) \
+ kv_resize((v), (v).capacity), 0UL) \
: ((v).size <= (size_t) (i) \
? (v).size = (i) + 1 \
- : 0)), \
- (v).items[(i)])
+ : 0UL)), \
+ &(v).items[(i)]))
/// Type of a vector with a few first members allocated on stack
///
@@ -132,6 +142,8 @@ static inline void *_memcpy_free(void *const restrict dest,
return dest;
}
+// -V:kvi_push:512
+
/// Resize vector with preallocated array
///
/// @note May not resize to an array smaller then init_array: if requested,
diff --git a/src/nvim/lib/queue.h b/src/nvim/lib/queue.h
index 9fcedf298f..ab9270081e 100644
--- a/src/nvim/lib/queue.h
+++ b/src/nvim/lib/queue.h
@@ -1,3 +1,8 @@
+// Queue implemented by circularly-linked list.
+//
+// Adapted from libuv. Simpler and more efficient than klist.h for implementing
+// queues that support arbitrary insertion/removal.
+//
// Copyright (c) 2013, Ben Noordhuis <info@bnoordhuis.nl>
//
// Permission to use, copy, modify, and/or distribute this software for any
@@ -28,6 +33,8 @@ typedef struct _queue {
#define QUEUE_DATA(ptr, type, field) \
((type *)((char *)(ptr) - offsetof(type, field)))
+// Important note: mutating the list while QUEUE_FOREACH is
+// iterating over its elements results in undefined behavior.
#define QUEUE_FOREACH(q, h) \
for ( /* NOLINT(readability/braces) */ \
(q) = (h)->next; (q) != (h); (q) = (q)->next)
@@ -56,17 +63,6 @@ static inline void QUEUE_ADD(QUEUE *const h, QUEUE *const n)
h->prev->next = h;
}
-static inline void QUEUE_SPLIT(QUEUE *const h, QUEUE *const q, QUEUE *const n)
- FUNC_ATTR_ALWAYS_INLINE
-{
- n->prev = h->prev;
- n->prev->next = n;
- n->next = q;
- h->prev = q->prev;
- h->prev->next = h;
- q->prev = n;
-}
-
static inline void QUEUE_INSERT_HEAD(QUEUE *const h, QUEUE *const q)
FUNC_ATTR_ALWAYS_INLINE
{
diff --git a/src/nvim/lib/ringbuf.h b/src/nvim/lib/ringbuf.h
index 12b75ec65a..e63eae70b0 100644
--- a/src/nvim/lib/ringbuf.h
+++ b/src/nvim/lib/ringbuf.h
@@ -15,6 +15,7 @@
#ifndef NVIM_LIB_RINGBUF_H
#define NVIM_LIB_RINGBUF_H
+#include <stddef.h>
#include <string.h>
#include <assert.h>
#include <stdint.h>
@@ -73,6 +74,32 @@ typedef struct { \
RBType *buf_end; \
} TypeName##RingBuffer;
+/// Dummy item free macros, for use in RINGBUF_INIT
+///
+/// This macros actually does nothing.
+///
+/// @param[in] item Item to be freed.
+#define RINGBUF_DUMMY_FREE(item)
+
+/// Static ring buffer
+///
+/// @warning Ring buffers created with this macros must neither be freed nor
+/// deallocated.
+///
+/// @param scope Ring buffer scope.
+/// @param TypeName Ring buffer type name.
+/// @param RBType Type of the single ring buffer element.
+/// @param varname Variable name.
+/// @param rbsize Ring buffer size.
+#define RINGBUF_STATIC(scope, TypeName, RBType, varname, rbsize) \
+static RBType _##varname##_buf[rbsize]; \
+scope TypeName##RingBuffer varname = { \
+ .buf = _##varname##_buf, \
+ .next = _##varname##_buf, \
+ .first = NULL, \
+ .buf_end = _##varname##_buf + rbsize - 1, \
+};
+
/// Initialize a new ring buffer
///
/// @param TypeName Ring buffer type name. Actual type name will be
diff --git a/src/nvim/log.c b/src/nvim/log.c
index c31af6b287..4d912c452b 100644
--- a/src/nvim/log.c
+++ b/src/nvim/log.c
@@ -1,23 +1,26 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <inttypes.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
+#if !defined(WIN32)
+# include <sys/time.h> // for gettimeofday()
+#endif
+#include <uv.h>
#include "nvim/log.h"
#include "nvim/types.h"
#include "nvim/os/os.h"
#include "nvim/os/time.h"
-/// First location of the log file used by log_path_init()
-#define USR_LOG_FILE "$NVIM_LOG_FILE"
-
-/// Fall back location of the log file used by log_path_init()
-#define USR_LOG_FILE_2 "$HOME" _PATHSEPSTR ".nvimlog"
+#define LOG_FILE_ENV "NVIM_LOG_FILE"
-/// Cached location of the log file set by log_path_init()
-static char expanded_log_file_path[MAXPATHL + 1] = { 0 };
+/// Cached location of the expanded log file path decided by log_path_init().
+static char log_file_path[MAXPATHL + 1] = { 0 };
static uv_mutex_t mutex;
@@ -25,31 +28,57 @@ static uv_mutex_t mutex;
# include "log.c.generated.h"
#endif
-/// Initialize path to log file
+#ifdef HAVE_EXECINFO_BACKTRACE
+# include <execinfo.h>
+#endif
+
+static bool log_try_create(char *fname)
+{
+ if (fname == NULL || fname[0] == '\0') {
+ return false;
+ }
+ FILE *log_file = fopen(fname, "a");
+ if (log_file == NULL) {
+ return false;
+ }
+ fclose(log_file);
+ return true;
+}
+
+/// Initializes path to log file. Sets $NVIM_LOG_FILE if empty.
///
-/// Tries to use #USR_LOG_FILE, then falls back #USR_LOG_FILE_2. Path to log
+/// Tries $NVIM_LOG_FILE, or falls back to $XDG_DATA_HOME/nvim/log. Path to log
/// file is cached, so only the first call has effect, unless first call was not
-/// successful. To make initialization not succeed either a bug in expand_env()
-/// is needed or both `$NVIM_LOG_FILE` and `$HOME` environment variables
-/// undefined.
+/// successful. Failed initialization indicates either a bug in expand_env()
+/// or both $NVIM_LOG_FILE and $HOME environment variables are undefined.
///
/// @return true if path was initialized, false otherwise.
static bool log_path_init(void)
{
- if (expanded_log_file_path[0]) {
+ if (log_file_path[0]) {
return true;
}
- expand_env((char_u *)USR_LOG_FILE, (char_u *)expanded_log_file_path,
- sizeof(expanded_log_file_path) - 1);
- // if the log file path expansion failed then fall back to stderr
- if (strcmp(USR_LOG_FILE, expanded_log_file_path) == 0) {
- memset(expanded_log_file_path, 0, sizeof(expanded_log_file_path));
- expand_env((char_u *)USR_LOG_FILE_2, (char_u *)expanded_log_file_path,
- sizeof(expanded_log_file_path) - 1);
- if (strcmp(USR_LOG_FILE_2, expanded_log_file_path) == 0) {
- memset(expanded_log_file_path, 0, sizeof(expanded_log_file_path));
+ size_t size = sizeof(log_file_path);
+ expand_env((char_u *)"$" LOG_FILE_ENV, (char_u *)log_file_path,
+ (int)size - 1);
+ if (strequal("$" LOG_FILE_ENV, log_file_path)
+ || log_file_path[0] == '\0'
+ || os_isdir((char_u *)log_file_path)
+ || !log_try_create(log_file_path)) {
+ // Invalid $NVIM_LOG_FILE or failed to expand; fall back to default.
+ char *defaultpath = stdpaths_user_data_subpath("log", 0, true);
+ size_t len = xstrlcpy(log_file_path, defaultpath, size);
+ xfree(defaultpath);
+ // Fall back to .nvimlog
+ if (len >= size || !log_try_create(log_file_path)) {
+ len = xstrlcpy(log_file_path, ".nvimlog", size);
+ }
+ // Fall back to stderr
+ if (len >= size || !log_try_create(log_file_path)) {
+ log_file_path[0] = '\0';
return false;
}
+ os_setenv(LOG_FILE_ENV, log_file_path, true);
}
return true;
}
@@ -69,9 +98,23 @@ void log_unlock(void)
uv_mutex_unlock(&mutex);
}
-bool do_log(int log_level, const char *func_name, int line_num, bool eol,
- const char* fmt, ...) FUNC_ATTR_UNUSED
+/// @param context description of a shared context or subsystem
+/// @param func_name function name, or NULL
+/// @param line_num source line number, or -1
+bool logmsg(int log_level, const char *context, const char *func_name,
+ int line_num, bool eol, const char *fmt, ...)
+ FUNC_ATTR_UNUSED FUNC_ATTR_PRINTF(6, 7)
{
+ if (log_level < MIN_LOG_LEVEL) {
+ return false;
+ }
+
+#ifdef EXITFREE
+ // Logging after we've already started freeing all our memory will only cause
+ // pain. We need access to VV_PROGPATH, homedir, etc.
+ assert(!entered_free_all_mem);
+#endif
+
log_lock();
bool ret = false;
FILE *log_file = open_log_file();
@@ -82,8 +125,8 @@ bool do_log(int log_level, const char *func_name, int line_num, bool eol,
va_list args;
va_start(args, fmt);
- ret = v_do_log_to_file(log_file, log_level, func_name, line_num, eol,
- fmt, args);
+ ret = v_do_log_to_file(log_file, log_level, context, func_name, line_num,
+ eol, fmt, args);
va_end(args);
if (log_file != stderr && log_file != stdout) {
@@ -94,26 +137,42 @@ end:
return ret;
}
+void log_uv_handles(void *loop)
+{
+ uv_loop_t *l = loop;
+ log_lock();
+ FILE *log_file = open_log_file();
+
+ if (log_file == NULL) {
+ goto end;
+ }
+
+ uv_print_all_handles(l, log_file);
+
+ if (log_file != stderr && log_file != stdout) {
+ fclose(log_file);
+ }
+end:
+ log_unlock();
+}
+
/// Open the log file for appending.
///
-/// @return The FILE* specified by the USR_LOG_FILE path or stderr in case of
-/// error
+/// @return FILE* decided by log_path_init() or stderr in case of error
FILE *open_log_file(void)
{
static bool opening_log_file = false;
-
// check if it's a recursive call
if (opening_log_file) {
- do_log_to_file(stderr, ERROR_LOG_LEVEL, __func__, __LINE__, true,
- "Trying to LOG() recursively! Please fix it.");
+ do_log_to_file(stderr, ERROR_LOG_LEVEL, NULL, __func__, __LINE__, true,
+ "Cannot LOG() recursively.");
return stderr;
}
- // expand USR_LOG_FILE if needed and open the file
FILE *log_file = NULL;
opening_log_file = true;
if (log_path_init()) {
- log_file = fopen(expanded_log_file_path, "a");
+ log_file = fopen(log_file_path, "a");
}
opening_log_file = false;
@@ -121,53 +180,126 @@ FILE *open_log_file(void)
return log_file;
}
- do_log_to_file(stderr, ERROR_LOG_LEVEL, __func__, __LINE__, true,
- "Couldn't open USR_LOG_FILE, logging to stderr! This may be "
- "caused by attempting to LOG() before initialization "
- "functions are called (e.g. init_homedir()).");
+ // May happen if:
+ // - LOG() is called before early_init()
+ // - Directory does not exist
+ // - File is not writable
+ do_log_to_file(stderr, ERROR_LOG_LEVEL, NULL, __func__, __LINE__, true,
+ "Logging to stderr, failed to open $" LOG_FILE_ENV ": %s",
+ log_file_path);
return stderr;
}
-static bool do_log_to_file(FILE *log_file, int log_level,
+#ifdef HAVE_EXECINFO_BACKTRACE
+void log_callstack_to_file(FILE *log_file, const char *const func_name,
+ const int line_num)
+{
+ void *trace[100];
+ int trace_size = backtrace(trace, ARRAY_SIZE(trace));
+
+ char exepath[MAXPATHL] = { 0 };
+ size_t exepathlen = MAXPATHL;
+ if (os_exepath(exepath, &exepathlen) != 0) {
+ abort();
+ }
+ assert(24 + exepathlen < IOSIZE); // Must fit in `cmdbuf` below.
+
+ char cmdbuf[IOSIZE + (20 * ARRAY_SIZE(trace)) + MAXPATHL];
+ snprintf(cmdbuf, sizeof(cmdbuf), "addr2line -e %s -f -p", exepath);
+ for (int i = 1; i < trace_size; i++) {
+ char buf[20]; // 64-bit pointer 0xNNNNNNNNNNNNNNNN with leading space.
+ snprintf(buf, sizeof(buf), " %p", trace[i]);
+ xstrlcat(cmdbuf, buf, sizeof(cmdbuf));
+ }
+ // Now we have a command string like:
+ // addr2line -e /path/to/exe -f -p 0x123 0x456 ...
+
+ do_log_to_file(log_file, DEBUG_LOG_LEVEL, NULL, func_name, line_num, true,
+ "trace:");
+ FILE *fp = popen(cmdbuf, "r");
+ char linebuf[IOSIZE];
+ while (fgets(linebuf, sizeof(linebuf) - 1, fp) != NULL) {
+ fprintf(log_file, " %s", linebuf);
+ }
+ pclose(fp);
+
+ if (log_file != stderr && log_file != stdout) {
+ fclose(log_file);
+ }
+}
+
+void log_callstack(const char *const func_name, const int line_num)
+{
+ log_lock();
+ FILE *log_file = open_log_file();
+ if (log_file == NULL) {
+ goto end;
+ }
+
+ log_callstack_to_file(log_file, func_name, line_num);
+
+end:
+ log_unlock();
+}
+#endif
+
+static bool do_log_to_file(FILE *log_file, int log_level, const char *context,
const char *func_name, int line_num, bool eol,
- const char* fmt, ...)
+ const char *fmt, ...)
+ FUNC_ATTR_PRINTF(7, 8)
{
va_list args;
va_start(args, fmt);
- bool ret = v_do_log_to_file(log_file, log_level, func_name, line_num, eol,
- fmt, args);
+ bool ret = v_do_log_to_file(log_file, log_level, context, func_name,
+ line_num, eol, fmt, args);
va_end(args);
return ret;
}
static bool v_do_log_to_file(FILE *log_file, int log_level,
- const char *func_name, int line_num, bool eol,
- const char* fmt, va_list args)
+ const char *context, const char *func_name,
+ int line_num, bool eol, const char *fmt,
+ va_list args)
{
static const char *log_levels[] = {
- [DEBUG_LOG_LEVEL] = "debug",
- [INFO_LOG_LEVEL] = "info",
- [WARNING_LOG_LEVEL] = "warning",
- [ERROR_LOG_LEVEL] = "error"
+ [DEBUG_LOG_LEVEL] = "DEBUG",
+ [INFO_LOG_LEVEL] = "INFO ",
+ [WARN_LOG_LEVEL] = "WARN ",
+ [ERROR_LOG_LEVEL] = "ERROR",
};
assert(log_level >= DEBUG_LOG_LEVEL && log_level <= ERROR_LOG_LEVEL);
- // format current timestamp in local time
+ // Format the timestamp.
struct tm local_time;
- if (os_get_localtime(&local_time) == NULL) {
+ if (os_localtime(&local_time) == NULL) {
return false;
}
char date_time[20];
- if (strftime(date_time, sizeof(date_time), "%Y/%m/%d %H:%M:%S",
+ if (strftime(date_time, sizeof(date_time), "%Y-%m-%dT%H:%M:%S",
&local_time) == 0) {
return false;
}
- // print the log message prefixed by the current timestamp and pid
+ int millis = 0;
+#if !defined(WIN32)
+ struct timeval curtime;
+ if (gettimeofday(&curtime, NULL) == 0) {
+ millis = (int)curtime.tv_usec / 1000;
+ }
+#endif
+
+ // Print the log message.
int64_t pid = os_get_pid();
- if (fprintf(log_file, "%s [%s @ %s:%d] %" PRId64 " - ", date_time,
- log_levels[log_level], func_name, line_num, pid) < 0) {
+ int rv = (line_num == -1 || func_name == NULL)
+ ? fprintf(log_file, "%s %s.%03d %-5" PRId64 " %s",
+ log_levels[log_level], date_time, millis, pid,
+ (context == NULL ? "?:" : context))
+ : fprintf(log_file, "%s %s.%03d %-5" PRId64 " %s%s:%d: ",
+ log_levels[log_level], date_time, millis, pid,
+ (context == NULL ? "" : context),
+ func_name, line_num);
+ if (rv < 0) {
return false;
}
if (vfprintf(log_file, fmt, args) < 0) {
diff --git a/src/nvim/log.h b/src/nvim/log.h
index 32b7276f14..7d4c033565 100644
--- a/src/nvim/log.h
+++ b/src/nvim/log.h
@@ -6,7 +6,7 @@
#define DEBUG_LOG_LEVEL 0
#define INFO_LOG_LEVEL 1
-#define WARNING_LOG_LEVEL 2
+#define WARN_LOG_LEVEL 2
#define ERROR_LOG_LEVEL 3
#define DLOG(...)
@@ -18,55 +18,52 @@
#define ELOG(...)
#define ELOGN(...)
-// Logging is disabled if NDEBUG or DISABLE_LOG is defined.
-#if !defined(DISABLE_LOG) && defined(NDEBUG)
-# define DISABLE_LOG
-#endif
-
-// MIN_LOG_LEVEL can be defined during compilation to adjust the desired level
-// of logging. INFO_LOG_LEVEL is used by default.
#ifndef MIN_LOG_LEVEL
# define MIN_LOG_LEVEL INFO_LOG_LEVEL
#endif
-#ifndef DISABLE_LOG
+#define LOG(level, ...) logmsg((level), NULL, __func__, __LINE__, true, \
+ __VA_ARGS__)
-# if MIN_LOG_LEVEL <= DEBUG_LOG_LEVEL
-# undef DLOG
-# undef DLOGN
-# define DLOG(...) do_log(DEBUG_LOG_LEVEL, __func__, __LINE__, true, \
- __VA_ARGS__)
-# define DLOGN(...) do_log(DEBUG_LOG_LEVEL, __func__, __LINE__, false, \
- __VA_ARGS__)
-# endif
+#if MIN_LOG_LEVEL <= DEBUG_LOG_LEVEL
+# undef DLOG
+# undef DLOGN
+# define DLOG(...) logmsg(DEBUG_LOG_LEVEL, NULL, __func__, __LINE__, true, \
+ __VA_ARGS__)
+# define DLOGN(...) logmsg(DEBUG_LOG_LEVEL, NULL, __func__, __LINE__, false, \
+ __VA_ARGS__)
+#endif
-# if MIN_LOG_LEVEL <= INFO_LOG_LEVEL
-# undef ILOG
-# undef ILOGN
-# define ILOG(...) do_log(INFO_LOG_LEVEL, __func__, __LINE__, true, \
- __VA_ARGS__)
-# define ILOGN(...) do_log(INFO_LOG_LEVEL, __func__, __LINE__, false, \
- __VA_ARGS__)
-# endif
+#if MIN_LOG_LEVEL <= INFO_LOG_LEVEL
+# undef ILOG
+# undef ILOGN
+# define ILOG(...) logmsg(INFO_LOG_LEVEL, NULL, __func__, __LINE__, true, \
+ __VA_ARGS__)
+# define ILOGN(...) logmsg(INFO_LOG_LEVEL, NULL, __func__, __LINE__, false, \
+ __VA_ARGS__)
+#endif
-# if MIN_LOG_LEVEL <= WARNING_LOG_LEVEL
-# undef WLOG
-# undef WLOGN
-# define WLOG(...) do_log(WARNING_LOG_LEVEL, __func__, __LINE__, true, \
- __VA_ARGS__)
-# define WLOGN(...) do_log(WARNING_LOG_LEVEL, __func__, __LINE__, false, \
- __VA_ARGS__)
-# endif
+#if MIN_LOG_LEVEL <= WARN_LOG_LEVEL
+# undef WLOG
+# undef WLOGN
+# define WLOG(...) logmsg(WARN_LOG_LEVEL, NULL, __func__, __LINE__, true, \
+ __VA_ARGS__)
+# define WLOGN(...) logmsg(WARN_LOG_LEVEL, NULL, __func__, __LINE__, false, \
+ __VA_ARGS__)
+#endif
-# if MIN_LOG_LEVEL <= ERROR_LOG_LEVEL
-# undef ELOG
-# undef ELOGN
-# define ELOG(...) do_log(ERROR_LOG_LEVEL, __func__, __LINE__, true, \
- __VA_ARGS__)
-# define ELOGN(...) do_log(ERROR_LOG_LEVEL, __func__, __LINE__, false, \
- __VA_ARGS__)
-# endif
+#if MIN_LOG_LEVEL <= ERROR_LOG_LEVEL
+# undef ELOG
+# undef ELOGN
+# define ELOG(...) logmsg(ERROR_LOG_LEVEL, NULL, __func__, __LINE__, true, \
+ __VA_ARGS__)
+# define ELOGN(...) logmsg(ERROR_LOG_LEVEL, NULL, __func__, __LINE__, false, \
+ __VA_ARGS__)
+#endif
+#ifdef HAVE_EXECINFO_BACKTRACE
+# define LOG_CALLSTACK() log_callstack(__func__, __LINE__)
+# define LOG_CALLSTACK_TO_FILE(fp) log_callstack_to_file(fp, __func__, __LINE__)
#endif
#ifdef INCLUDE_GENERATED_DECLARATIONS
diff --git a/src/nvim/lua/converter.c b/src/nvim/lua/converter.c
new file mode 100644
index 0000000000..5da6d2c0a0
--- /dev/null
+++ b/src/nvim/lua/converter.c
@@ -0,0 +1,1206 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+#include <lua.h>
+#include <lualib.h>
+#include <lauxlib.h>
+#include <assert.h>
+#include <stdint.h>
+#include <stdbool.h>
+
+#include "nvim/api/private/defs.h"
+#include "nvim/api/private/helpers.h"
+#include "nvim/func_attr.h"
+#include "nvim/memory.h"
+#include "nvim/assert.h"
+// FIXME: vim.h is not actually needed, but otherwise it states MAXPATHL is
+// redefined
+#include "nvim/vim.h"
+#include "nvim/globals.h"
+#include "nvim/message.h"
+#include "nvim/eval/typval.h"
+#include "nvim/ascii.h"
+#include "nvim/macros.h"
+
+#include "nvim/lib/kvec.h"
+#include "nvim/eval/decode.h"
+
+#include "nvim/lua/converter.h"
+#include "nvim/lua/executor.h"
+
+/// Determine, which keys lua table contains
+typedef struct {
+ size_t maxidx; ///< Maximum positive integral value found.
+ size_t string_keys_num; ///< Number of string keys.
+ bool has_string_with_nul; ///< True if there is string key with NUL byte.
+ ObjectType type; ///< If has_type_key is true then attached value. Otherwise
+ ///< either kObjectTypeNil, kObjectTypeDictionary or
+ ///< kObjectTypeArray, depending on other properties.
+ lua_Number val; ///< If has_val_key and val_type == LUA_TNUMBER: value.
+ bool has_type_key; ///< True if type key is present.
+} LuaTableProps;
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "lua/converter.c.generated.h"
+#endif
+
+#define TYPE_IDX_VALUE true
+#define VAL_IDX_VALUE false
+
+#define LUA_PUSH_STATIC_STRING(lstate, s) \
+ lua_pushlstring(lstate, s, sizeof(s) - 1)
+
+static LuaTableProps nlua_traverse_table(lua_State *const lstate)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ size_t tsize = 0; // Total number of keys.
+ int val_type = 0; // If has_val_key: lua type of the value.
+ bool has_val_key = false; // True if val key was found,
+ // @see nlua_push_val_idx().
+ size_t other_keys_num = 0; // Number of keys that are not string, integral
+ // or type keys.
+ LuaTableProps ret;
+ memset(&ret, 0, sizeof(ret));
+ if (!lua_checkstack(lstate, lua_gettop(lstate) + 3)) {
+ emsgf(_("E1502: Lua failed to grow stack to %i"), lua_gettop(lstate) + 2);
+ ret.type = kObjectTypeNil;
+ return ret;
+ }
+ lua_pushnil(lstate);
+ while (lua_next(lstate, -2)) {
+ switch (lua_type(lstate, -2)) {
+ case LUA_TSTRING: {
+ size_t len;
+ const char *s = lua_tolstring(lstate, -2, &len);
+ if (memchr(s, NUL, len) != NULL) {
+ ret.has_string_with_nul = true;
+ }
+ ret.string_keys_num++;
+ break;
+ }
+ case LUA_TNUMBER: {
+ const lua_Number n = lua_tonumber(lstate, -2);
+ if (n > (lua_Number)SIZE_MAX || n <= 0
+ || ((lua_Number)((size_t)n)) != n) {
+ other_keys_num++;
+ } else {
+ const size_t idx = (size_t)n;
+ if (idx > ret.maxidx) {
+ ret.maxidx = idx;
+ }
+ }
+ break;
+ }
+ case LUA_TBOOLEAN: {
+ const bool b = lua_toboolean(lstate, -2);
+ if (b == TYPE_IDX_VALUE) {
+ if (lua_type(lstate, -1) == LUA_TNUMBER) {
+ lua_Number n = lua_tonumber(lstate, -1);
+ if (n == (lua_Number)kObjectTypeFloat
+ || n == (lua_Number)kObjectTypeArray
+ || n == (lua_Number)kObjectTypeDictionary) {
+ ret.has_type_key = true;
+ ret.type = (ObjectType)n;
+ } else {
+ other_keys_num++;
+ }
+ } else {
+ other_keys_num++;
+ }
+ } else {
+ has_val_key = true;
+ val_type = lua_type(lstate, -1);
+ if (val_type == LUA_TNUMBER) {
+ ret.val = lua_tonumber(lstate, -1);
+ }
+ }
+ break;
+ }
+ default: {
+ other_keys_num++;
+ break;
+ }
+ }
+ tsize++;
+ lua_pop(lstate, 1);
+ }
+ if (ret.has_type_key) {
+ if (ret.type == kObjectTypeFloat
+ && (!has_val_key || val_type != LUA_TNUMBER)) {
+ ret.type = kObjectTypeNil;
+ } else if (ret.type == kObjectTypeArray) {
+ // Determine what is the last number in a *sequence* of keys.
+ // This condition makes sure that Neovim will not crash when it gets table
+ // {[vim.type_idx]=vim.types.array, [SIZE_MAX]=1}: without it maxidx will
+ // be SIZE_MAX, with this condition it should be zero and [SIZE_MAX] key
+ // should be ignored.
+ if (ret.maxidx != 0
+ && ret.maxidx != (tsize
+ - ret.has_type_key
+ - other_keys_num
+ - has_val_key
+ - ret.string_keys_num)) {
+ for (ret.maxidx = 0;; ret.maxidx++) {
+ lua_rawgeti(lstate, -1, (int)ret.maxidx + 1);
+ if (lua_isnil(lstate, -1)) {
+ lua_pop(lstate, 1);
+ break;
+ }
+ lua_pop(lstate, 1);
+ }
+ }
+ }
+ } else {
+ if (tsize == 0
+ || (tsize == ret.maxidx
+ && other_keys_num == 0
+ && ret.string_keys_num == 0)) {
+ ret.type = kObjectTypeArray;
+ } else if (ret.string_keys_num == tsize) {
+ ret.type = kObjectTypeDictionary;
+ } else {
+ ret.type = kObjectTypeNil;
+ }
+ }
+ return ret;
+}
+
+/// Helper structure for nlua_pop_typval
+typedef struct {
+ typval_T *tv; ///< Location where conversion result is saved.
+ bool container; ///< True if tv is a container.
+ bool special; ///< If true then tv is a _VAL part of special dictionary
+ ///< that represents mapping.
+ int idx; ///< Container index (used to detect self-referencing structures).
+} TVPopStackItem;
+
+/// Convert lua object to VimL typval_T
+///
+/// Should pop exactly one value from lua stack.
+///
+/// @param lstate Lua state.
+/// @param[out] ret_tv Where to put the result.
+///
+/// @return `true` in case of success, `false` in case of failure. Error is
+/// reported automatically.
+bool nlua_pop_typval(lua_State *lstate, typval_T *ret_tv)
+{
+ bool ret = true;
+ const int initial_size = lua_gettop(lstate);
+ kvec_t(TVPopStackItem) stack = KV_INITIAL_VALUE;
+ kv_push(stack, ((TVPopStackItem) { ret_tv, false, false, 0 }));
+ while (ret && kv_size(stack)) {
+ if (!lua_checkstack(lstate, lua_gettop(lstate) + 3)) {
+ emsgf(_("E1502: Lua failed to grow stack to %i"), lua_gettop(lstate) + 3);
+ ret = false;
+ break;
+ }
+ TVPopStackItem cur = kv_pop(stack);
+ if (cur.container) {
+ if (cur.special || cur.tv->v_type == VAR_DICT) {
+ assert(cur.tv->v_type == (cur.special ? VAR_LIST : VAR_DICT));
+ bool next_key_found = false;
+ while (lua_next(lstate, -2)) {
+ if (lua_type(lstate, -2) == LUA_TSTRING) {
+ next_key_found = true;
+ break;
+ }
+ lua_pop(lstate, 1);
+ }
+ if (next_key_found) {
+ size_t len;
+ const char *s = lua_tolstring(lstate, -2, &len);
+ if (cur.special) {
+ list_T *const kv_pair = tv_list_alloc(2);
+
+ typval_T s_tv = decode_string(s, len, kTrue, false, false);
+ if (s_tv.v_type == VAR_UNKNOWN) {
+ ret = false;
+ tv_list_unref(kv_pair);
+ continue;
+ }
+ tv_list_append_owned_tv(kv_pair, s_tv);
+
+ // Value: not populated yet, need to create list item to push.
+ tv_list_append_owned_tv(kv_pair, (typval_T) {
+ .v_type = VAR_UNKNOWN,
+ });
+ kv_push(stack, cur);
+ tv_list_append_list(cur.tv->vval.v_list, kv_pair);
+ cur = (TVPopStackItem) {
+ .tv = TV_LIST_ITEM_TV(tv_list_last(kv_pair)),
+ .container = false,
+ .special = false,
+ .idx = 0,
+ };
+ } else {
+ dictitem_T *const di = tv_dict_item_alloc_len(s, len);
+ if (tv_dict_add(cur.tv->vval.v_dict, di) == FAIL) {
+ assert(false);
+ }
+ kv_push(stack, cur);
+ cur = (TVPopStackItem) { &di->di_tv, false, false, 0 };
+ }
+ } else {
+ lua_pop(lstate, 1);
+ continue;
+ }
+ } else {
+ assert(cur.tv->v_type == VAR_LIST);
+ lua_rawgeti(lstate, -1, tv_list_len(cur.tv->vval.v_list) + 1);
+ if (lua_isnil(lstate, -1)) {
+ lua_pop(lstate, 2);
+ continue;
+ }
+ // Not populated yet, need to create list item to push.
+ tv_list_append_owned_tv(cur.tv->vval.v_list, (typval_T) {
+ .v_type = VAR_UNKNOWN,
+ });
+ kv_push(stack, cur);
+ // TODO(ZyX-I): Use indexes, here list item *will* be reallocated.
+ cur = (TVPopStackItem) {
+ .tv = TV_LIST_ITEM_TV(tv_list_last(cur.tv->vval.v_list)),
+ .container = false,
+ .special = false,
+ .idx = 0,
+ };
+ }
+ }
+ assert(!cur.container);
+ *cur.tv = (typval_T) {
+ .v_type = VAR_NUMBER,
+ .v_lock = VAR_UNLOCKED,
+ .vval = { .v_number = 0 },
+ };
+ switch (lua_type(lstate, -1)) {
+ case LUA_TNIL: {
+ cur.tv->v_type = VAR_SPECIAL;
+ cur.tv->vval.v_special = kSpecialVarNull;
+ break;
+ }
+ case LUA_TBOOLEAN: {
+ cur.tv->v_type = VAR_SPECIAL;
+ cur.tv->vval.v_special = (lua_toboolean(lstate, -1)
+ ? kSpecialVarTrue
+ : kSpecialVarFalse);
+ break;
+ }
+ case LUA_TSTRING: {
+ size_t len;
+ const char *s = lua_tolstring(lstate, -1, &len);
+ *cur.tv = decode_string(s, len, kNone, true, false);
+ if (cur.tv->v_type == VAR_UNKNOWN) {
+ ret = false;
+ }
+ break;
+ }
+ case LUA_TNUMBER: {
+ const lua_Number n = lua_tonumber(lstate, -1);
+ if (n > (lua_Number)VARNUMBER_MAX || n < (lua_Number)VARNUMBER_MIN
+ || ((lua_Number)((varnumber_T)n)) != n) {
+ cur.tv->v_type = VAR_FLOAT;
+ cur.tv->vval.v_float = (float_T)n;
+ } else {
+ cur.tv->v_type = VAR_NUMBER;
+ cur.tv->vval.v_number = (varnumber_T)n;
+ }
+ break;
+ }
+ case LUA_TTABLE: {
+ const LuaTableProps table_props = nlua_traverse_table(lstate);
+
+ for (size_t i = 0; i < kv_size(stack); i++) {
+ const TVPopStackItem item = kv_A(stack, i);
+ if (item.container && lua_rawequal(lstate, -1, item.idx)) {
+ tv_copy(item.tv, cur.tv);
+ cur.container = false;
+ goto nlua_pop_typval_table_processing_end;
+ }
+ }
+
+ switch (table_props.type) {
+ case kObjectTypeArray: {
+ cur.tv->v_type = VAR_LIST;
+ cur.tv->vval.v_list = tv_list_alloc((ptrdiff_t)table_props.maxidx);
+ tv_list_ref(cur.tv->vval.v_list);
+ if (table_props.maxidx != 0) {
+ cur.container = true;
+ cur.idx = lua_gettop(lstate);
+ kv_push(stack, cur);
+ }
+ break;
+ }
+ case kObjectTypeDictionary: {
+ if (table_props.string_keys_num == 0) {
+ cur.tv->v_type = VAR_DICT;
+ cur.tv->vval.v_dict = tv_dict_alloc();
+ cur.tv->vval.v_dict->dv_refcount++;
+ } else {
+ cur.special = table_props.has_string_with_nul;
+ if (table_props.has_string_with_nul) {
+ decode_create_map_special_dict(
+ cur.tv, (ptrdiff_t)table_props.string_keys_num);
+ assert(cur.tv->v_type == VAR_DICT);
+ dictitem_T *const val_di = tv_dict_find(cur.tv->vval.v_dict,
+ S_LEN("_VAL"));
+ assert(val_di != NULL);
+ cur.tv = &val_di->di_tv;
+ assert(cur.tv->v_type == VAR_LIST);
+ } else {
+ cur.tv->v_type = VAR_DICT;
+ cur.tv->vval.v_dict = tv_dict_alloc();
+ cur.tv->vval.v_dict->dv_refcount++;
+ }
+ cur.container = true;
+ cur.idx = lua_gettop(lstate);
+ kv_push(stack, cur);
+ lua_pushnil(lstate);
+ }
+ break;
+ }
+ case kObjectTypeFloat: {
+ cur.tv->v_type = VAR_FLOAT;
+ cur.tv->vval.v_float = (float_T)table_props.val;
+ break;
+ }
+ case kObjectTypeNil: {
+ EMSG(_("E5100: Cannot convert given lua table: table "
+ "should either have a sequence of positive integer keys "
+ "or contain only string keys"));
+ ret = false;
+ break;
+ }
+ default: {
+ assert(false);
+ }
+ }
+nlua_pop_typval_table_processing_end:
+ break;
+ }
+ default: {
+ EMSG(_("E5101: Cannot convert given lua type"));
+ ret = false;
+ break;
+ }
+ }
+ if (!cur.container) {
+ lua_pop(lstate, 1);
+ }
+ }
+ kv_destroy(stack);
+ if (!ret) {
+ tv_clear(ret_tv);
+ *ret_tv = (typval_T) {
+ .v_type = VAR_NUMBER,
+ .v_lock = VAR_UNLOCKED,
+ .vval = { .v_number = 0 },
+ };
+ lua_pop(lstate, lua_gettop(lstate) - initial_size + 1);
+ }
+ assert(lua_gettop(lstate) == initial_size - 1);
+ return ret;
+}
+
+#define TYPVAL_ENCODE_ALLOW_SPECIALS true
+
+#define TYPVAL_ENCODE_CONV_NIL(tv) \
+ lua_pushnil(lstate)
+
+#define TYPVAL_ENCODE_CONV_BOOL(tv, num) \
+ lua_pushboolean(lstate, (bool)(num))
+
+#define TYPVAL_ENCODE_CONV_NUMBER(tv, num) \
+ lua_pushnumber(lstate, (lua_Number)(num))
+
+#define TYPVAL_ENCODE_CONV_UNSIGNED_NUMBER TYPVAL_ENCODE_CONV_NUMBER
+
+#define TYPVAL_ENCODE_CONV_FLOAT(tv, flt) \
+ TYPVAL_ENCODE_CONV_NUMBER(tv, flt)
+
+#define TYPVAL_ENCODE_CONV_STRING(tv, str, len) \
+ lua_pushlstring(lstate, (const char *)(str), (len))
+
+#define TYPVAL_ENCODE_CONV_STR_STRING TYPVAL_ENCODE_CONV_STRING
+
+#define TYPVAL_ENCODE_CONV_EXT_STRING(tv, str, len, type) \
+ TYPVAL_ENCODE_CONV_NIL(tv)
+
+#define TYPVAL_ENCODE_CONV_FUNC_START(tv, fun) \
+ do { \
+ TYPVAL_ENCODE_CONV_NIL(tv); \
+ goto typval_encode_stop_converting_one_item; \
+ } while (0)
+
+#define TYPVAL_ENCODE_CONV_FUNC_BEFORE_ARGS(tv, len)
+#define TYPVAL_ENCODE_CONV_FUNC_BEFORE_SELF(tv, len)
+#define TYPVAL_ENCODE_CONV_FUNC_END(tv)
+
+#define TYPVAL_ENCODE_CONV_EMPTY_LIST(tv) \
+ lua_createtable(lstate, 0, 0)
+
+#define TYPVAL_ENCODE_CONV_EMPTY_DICT(tv, dict) \
+ nlua_create_typed_table(lstate, 0, 0, kObjectTypeDictionary)
+
+#define TYPVAL_ENCODE_CONV_LIST_START(tv, len) \
+ do { \
+ if (!lua_checkstack(lstate, lua_gettop(lstate) + 3)) { \
+ emsgf(_("E5102: Lua failed to grow stack to %i"), \
+ lua_gettop(lstate) + 3); \
+ return false; \
+ } \
+ lua_createtable(lstate, (int)(len), 0); \
+ lua_pushnumber(lstate, 1); \
+ } while (0)
+
+#define TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START(tv, mpsv)
+
+#define TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS(tv) \
+ do { \
+ lua_Number idx = lua_tonumber(lstate, -2); \
+ lua_rawset(lstate, -3); \
+ lua_pushnumber(lstate, idx + 1); \
+ } while (0)
+
+#define TYPVAL_ENCODE_CONV_LIST_END(tv) \
+ lua_rawset(lstate, -3)
+
+#define TYPVAL_ENCODE_CONV_DICT_START(tv, dict, len) \
+ do { \
+ if (!lua_checkstack(lstate, lua_gettop(lstate) + 3)) { \
+ emsgf(_("E5102: Lua failed to grow stack to %i"), \
+ lua_gettop(lstate) + 3); \
+ return false; \
+ } \
+ lua_createtable(lstate, 0, (int)(len)); \
+ } while (0)
+
+#define TYPVAL_ENCODE_SPECIAL_DICT_KEY_CHECK(label, kv_pair)
+
+#define TYPVAL_ENCODE_CONV_REAL_DICT_AFTER_START(tv, dict, mpsv)
+
+#define TYPVAL_ENCODE_CONV_DICT_AFTER_KEY(tv, dict)
+
+#define TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS(tv, dict) \
+ lua_rawset(lstate, -3)
+
+#define TYPVAL_ENCODE_CONV_DICT_END(tv, dict) \
+ TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS(tv, dict)
+
+#define TYPVAL_ENCODE_CONV_RECURSE(val, conv_type) \
+ do { \
+ for (size_t backref = kv_size(*mpstack); backref; backref--) { \
+ const MPConvStackVal mpval = kv_A(*mpstack, backref - 1); \
+ if (mpval.type == conv_type) { \
+ if (conv_type == kMPConvDict \
+ ? (void *)mpval.data.d.dict == (void *)(val) \
+ : (void *)mpval.data.l.list == (void *)(val)) { \
+ lua_pushvalue(lstate, \
+ -((int)((kv_size(*mpstack) - backref + 1) * 2))); \
+ break; \
+ } \
+ } \
+ } \
+ } while (0)
+
+#define TYPVAL_ENCODE_SCOPE static
+#define TYPVAL_ENCODE_NAME lua
+#define TYPVAL_ENCODE_FIRST_ARG_TYPE lua_State *const
+#define TYPVAL_ENCODE_FIRST_ARG_NAME lstate
+#include "nvim/eval/typval_encode.c.h"
+#undef TYPVAL_ENCODE_SCOPE
+#undef TYPVAL_ENCODE_NAME
+#undef TYPVAL_ENCODE_FIRST_ARG_TYPE
+#undef TYPVAL_ENCODE_FIRST_ARG_NAME
+
+#undef TYPVAL_ENCODE_CONV_STRING
+#undef TYPVAL_ENCODE_CONV_STR_STRING
+#undef TYPVAL_ENCODE_CONV_EXT_STRING
+#undef TYPVAL_ENCODE_CONV_NUMBER
+#undef TYPVAL_ENCODE_CONV_FLOAT
+#undef TYPVAL_ENCODE_CONV_FUNC_START
+#undef TYPVAL_ENCODE_CONV_FUNC_BEFORE_ARGS
+#undef TYPVAL_ENCODE_CONV_FUNC_BEFORE_SELF
+#undef TYPVAL_ENCODE_CONV_FUNC_END
+#undef TYPVAL_ENCODE_CONV_EMPTY_LIST
+#undef TYPVAL_ENCODE_CONV_LIST_START
+#undef TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START
+#undef TYPVAL_ENCODE_CONV_EMPTY_DICT
+#undef TYPVAL_ENCODE_CONV_NIL
+#undef TYPVAL_ENCODE_CONV_BOOL
+#undef TYPVAL_ENCODE_CONV_UNSIGNED_NUMBER
+#undef TYPVAL_ENCODE_CONV_DICT_START
+#undef TYPVAL_ENCODE_CONV_REAL_DICT_AFTER_START
+#undef TYPVAL_ENCODE_CONV_DICT_END
+#undef TYPVAL_ENCODE_CONV_DICT_AFTER_KEY
+#undef TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS
+#undef TYPVAL_ENCODE_SPECIAL_DICT_KEY_CHECK
+#undef TYPVAL_ENCODE_CONV_LIST_END
+#undef TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS
+#undef TYPVAL_ENCODE_CONV_RECURSE
+#undef TYPVAL_ENCODE_ALLOW_SPECIALS
+
+/// Convert VimL typval_T to lua value
+///
+/// Should leave single value in lua stack. May only fail if lua failed to grow
+/// stack.
+///
+/// @param lstate Lua interpreter state.
+/// @param[in] tv typval_T to convert.
+///
+/// @return true in case of success, false otherwise.
+bool nlua_push_typval(lua_State *lstate, typval_T *const tv)
+{
+ const int initial_size = lua_gettop(lstate);
+ if (!lua_checkstack(lstate, initial_size + 2)) {
+ emsgf(_("E1502: Lua failed to grow stack to %i"), initial_size + 4);
+ return false;
+ }
+ if (encode_vim_to_lua(lstate, tv, "nlua_push_typval argument") == FAIL) {
+ return false;
+ }
+ assert(lua_gettop(lstate) == initial_size + 1);
+ return true;
+}
+
+/// Push value which is a type index
+///
+/// Used for all โ€œtypedโ€ tables: i.e. for all tables which represent VimL
+/// values.
+static inline void nlua_push_type_idx(lua_State *lstate)
+ FUNC_ATTR_NONNULL_ALL
+{
+ lua_pushboolean(lstate, TYPE_IDX_VALUE);
+}
+
+/// Push value which is a value index
+///
+/// Used for tables which represent scalar values, like float value.
+static inline void nlua_push_val_idx(lua_State *lstate)
+ FUNC_ATTR_NONNULL_ALL
+{
+ lua_pushboolean(lstate, VAL_IDX_VALUE);
+}
+
+/// Push type
+///
+/// Type is a value in vim.types table.
+///
+/// @param[out] lstate Lua state.
+/// @param[in] type Type to push.
+static inline void nlua_push_type(lua_State *lstate, ObjectType type)
+ FUNC_ATTR_NONNULL_ALL
+{
+ lua_pushnumber(lstate, (lua_Number)type);
+}
+
+/// Create lua table which has an entry that determines its VimL type
+///
+/// @param[out] lstate Lua state.
+/// @param[in] narr Number of โ€œarrayโ€ entries to be populated later.
+/// @param[in] nrec Number of โ€œdictionaryโ€ entries to be populated later.
+/// @param[in] type Type of the table.
+static inline void nlua_create_typed_table(lua_State *lstate,
+ const size_t narr,
+ const size_t nrec,
+ const ObjectType type)
+ FUNC_ATTR_NONNULL_ALL
+{
+ lua_createtable(lstate, (int)narr, (int)(1 + nrec));
+ nlua_push_type_idx(lstate);
+ nlua_push_type(lstate, type);
+ lua_rawset(lstate, -3);
+}
+
+
+/// Convert given String to lua string
+///
+/// Leaves converted string on top of the stack.
+void nlua_push_String(lua_State *lstate, const String s)
+ FUNC_ATTR_NONNULL_ALL
+{
+ lua_pushlstring(lstate, s.data, s.size);
+}
+
+/// Convert given Integer to lua number
+///
+/// Leaves converted number on top of the stack.
+void nlua_push_Integer(lua_State *lstate, const Integer n)
+ FUNC_ATTR_NONNULL_ALL
+{
+ lua_pushnumber(lstate, (lua_Number)n);
+}
+
+/// Convert given Float to lua table
+///
+/// Leaves converted table on top of the stack.
+void nlua_push_Float(lua_State *lstate, const Float f)
+ FUNC_ATTR_NONNULL_ALL
+{
+ nlua_create_typed_table(lstate, 0, 1, kObjectTypeFloat);
+ nlua_push_val_idx(lstate);
+ lua_pushnumber(lstate, (lua_Number)f);
+ lua_rawset(lstate, -3);
+}
+
+/// Convert given Float to lua boolean
+///
+/// Leaves converted value on top of the stack.
+void nlua_push_Boolean(lua_State *lstate, const Boolean b)
+ FUNC_ATTR_NONNULL_ALL
+{
+ lua_pushboolean(lstate, b);
+}
+
+/// Convert given Dictionary to lua table
+///
+/// Leaves converted table on top of the stack.
+void nlua_push_Dictionary(lua_State *lstate, const Dictionary dict)
+ FUNC_ATTR_NONNULL_ALL
+{
+ if (dict.size == 0) {
+ nlua_create_typed_table(lstate, 0, 0, kObjectTypeDictionary);
+ } else {
+ lua_createtable(lstate, 0, (int)dict.size);
+ }
+ for (size_t i = 0; i < dict.size; i++) {
+ nlua_push_String(lstate, dict.items[i].key);
+ nlua_push_Object(lstate, dict.items[i].value);
+ lua_rawset(lstate, -3);
+ }
+}
+
+/// Convert given Array to lua table
+///
+/// Leaves converted table on top of the stack.
+void nlua_push_Array(lua_State *lstate, const Array array)
+ FUNC_ATTR_NONNULL_ALL
+{
+ lua_createtable(lstate, (int)array.size, 0);
+ for (size_t i = 0; i < array.size; i++) {
+ nlua_push_Object(lstate, array.items[i]);
+ lua_rawseti(lstate, -2, (int)i + 1);
+ }
+}
+
+#define GENERATE_INDEX_FUNCTION(type) \
+void nlua_push_##type(lua_State *lstate, const type item) \
+ FUNC_ATTR_NONNULL_ALL \
+{ \
+ lua_pushnumber(lstate, (lua_Number)(item)); \
+}
+
+GENERATE_INDEX_FUNCTION(Buffer)
+GENERATE_INDEX_FUNCTION(Window)
+GENERATE_INDEX_FUNCTION(Tabpage)
+
+#undef GENERATE_INDEX_FUNCTION
+
+/// Convert given Object to lua value
+///
+/// Leaves converted value on top of the stack.
+void nlua_push_Object(lua_State *lstate, const Object obj)
+ FUNC_ATTR_NONNULL_ALL
+{
+ switch (obj.type) {
+ case kObjectTypeNil: {
+ lua_pushnil(lstate);
+ break;
+ }
+#define ADD_TYPE(type, data_key) \
+ case kObjectType##type: { \
+ nlua_push_##type(lstate, obj.data.data_key); \
+ break; \
+ }
+ ADD_TYPE(Boolean, boolean)
+ ADD_TYPE(Integer, integer)
+ ADD_TYPE(Float, floating)
+ ADD_TYPE(String, string)
+ ADD_TYPE(Array, array)
+ ADD_TYPE(Dictionary, dictionary)
+#undef ADD_TYPE
+#define ADD_REMOTE_TYPE(type) \
+ case kObjectType##type: { \
+ nlua_push_##type(lstate, (type)obj.data.integer); \
+ break; \
+ }
+ ADD_REMOTE_TYPE(Buffer)
+ ADD_REMOTE_TYPE(Window)
+ ADD_REMOTE_TYPE(Tabpage)
+#undef ADD_REMOTE_TYPE
+ }
+}
+
+
+/// Convert lua value to string
+///
+/// Always pops one value from the stack.
+String nlua_pop_String(lua_State *lstate, Error *err)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ if (lua_type(lstate, -1) != LUA_TSTRING) {
+ lua_pop(lstate, 1);
+ api_set_error(err, kErrorTypeValidation, "Expected lua string");
+ return (String) { .size = 0, .data = NULL };
+ }
+ String ret;
+
+ ret.data = (char *)lua_tolstring(lstate, -1, &(ret.size));
+ assert(ret.data != NULL);
+ ret.data = xmemdupz(ret.data, ret.size);
+ lua_pop(lstate, 1);
+
+ return ret;
+}
+
+/// Convert lua value to integer
+///
+/// Always pops one value from the stack.
+Integer nlua_pop_Integer(lua_State *lstate, Error *err)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ if (lua_type(lstate, -1) != LUA_TNUMBER) {
+ lua_pop(lstate, 1);
+ api_set_error(err, kErrorTypeValidation, "Expected lua number");
+ return 0;
+ }
+ const lua_Number n = lua_tonumber(lstate, -1);
+ lua_pop(lstate, 1);
+ if (n > (lua_Number)API_INTEGER_MAX || n < (lua_Number)API_INTEGER_MIN
+ || ((lua_Number)((Integer)n)) != n) {
+ api_set_error(err, kErrorTypeException, "Number is not integral");
+ return 0;
+ }
+ return (Integer)n;
+}
+
+/// Convert lua value to boolean
+///
+/// Always pops one value from the stack.
+Boolean nlua_pop_Boolean(lua_State *lstate, Error *err)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ const Boolean ret = lua_toboolean(lstate, -1);
+ lua_pop(lstate, 1);
+ return ret;
+}
+
+/// Check whether typed table on top of the stack has given type
+///
+/// @param[in] lstate Lua state.
+/// @param[out] err Location where error will be saved. May be NULL.
+/// @param[in] type Type to check.
+///
+/// @return @see nlua_traverse_table().
+static inline LuaTableProps nlua_check_type(lua_State *const lstate,
+ Error *const err,
+ const ObjectType type)
+ FUNC_ATTR_NONNULL_ARG(1) FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ if (lua_type(lstate, -1) != LUA_TTABLE) {
+ if (err) {
+ api_set_error(err, kErrorTypeValidation, "Expected lua table");
+ }
+ return (LuaTableProps) { .type = kObjectTypeNil };
+ }
+ LuaTableProps table_props = nlua_traverse_table(lstate);
+
+ if (type == kObjectTypeDictionary && table_props.type == kObjectTypeArray
+ && table_props.maxidx == 0 && !table_props.has_type_key) {
+ table_props.type = kObjectTypeDictionary;
+ }
+
+ if (table_props.type != type) {
+ if (err) {
+ api_set_error(err, kErrorTypeValidation, "Unexpected type");
+ }
+ }
+
+ return table_props;
+}
+
+/// Convert lua table to float
+///
+/// Always pops one value from the stack.
+Float nlua_pop_Float(lua_State *lstate, Error *err)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ if (lua_type(lstate, -1) == LUA_TNUMBER) {
+ const Float ret = (Float)lua_tonumber(lstate, -1);
+ lua_pop(lstate, 1);
+ return ret;
+ }
+
+ const LuaTableProps table_props = nlua_check_type(lstate, err,
+ kObjectTypeFloat);
+ lua_pop(lstate, 1);
+ if (table_props.type != kObjectTypeFloat) {
+ return 0;
+ } else {
+ return (Float)table_props.val;
+ }
+}
+
+/// Convert lua table to array without determining whether it is array
+///
+/// @param lstate Lua state.
+/// @param[in] table_props nlua_traverse_table() output.
+/// @param[out] err Location where error will be saved.
+static Array nlua_pop_Array_unchecked(lua_State *const lstate,
+ const LuaTableProps table_props,
+ Error *const err)
+{
+ Array ret = { .size = table_props.maxidx, .items = NULL };
+
+ if (ret.size == 0) {
+ lua_pop(lstate, 1);
+ return ret;
+ }
+
+ ret.items = xcalloc(ret.size, sizeof(*ret.items));
+ for (size_t i = 1; i <= ret.size; i++) {
+ Object val;
+
+ lua_rawgeti(lstate, -1, (int)i);
+
+ val = nlua_pop_Object(lstate, err);
+ if (ERROR_SET(err)) {
+ ret.size = i - 1;
+ lua_pop(lstate, 1);
+ api_free_array(ret);
+ return (Array) { .size = 0, .items = NULL };
+ }
+ ret.items[i - 1] = val;
+ }
+ lua_pop(lstate, 1);
+
+ return ret;
+}
+
+/// Convert lua table to array
+///
+/// Always pops one value from the stack.
+Array nlua_pop_Array(lua_State *lstate, Error *err)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ const LuaTableProps table_props = nlua_check_type(lstate, err,
+ kObjectTypeArray);
+ if (table_props.type != kObjectTypeArray) {
+ return (Array) { .size = 0, .items = NULL };
+ }
+ return nlua_pop_Array_unchecked(lstate, table_props, err);
+}
+
+/// Convert lua table to dictionary
+///
+/// Always pops one value from the stack. Does not check whether whether topmost
+/// value on the stack is a table.
+///
+/// @param lstate Lua interpreter state.
+/// @param[in] table_props nlua_traverse_table() output.
+/// @param[out] err Location where error will be saved.
+static Dictionary nlua_pop_Dictionary_unchecked(lua_State *lstate,
+ const LuaTableProps table_props,
+ Error *err)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ Dictionary ret = { .size = table_props.string_keys_num, .items = NULL };
+
+ if (ret.size == 0) {
+ lua_pop(lstate, 1);
+ return ret;
+ }
+ ret.items = xcalloc(ret.size, sizeof(*ret.items));
+
+ lua_pushnil(lstate);
+ for (size_t i = 0; lua_next(lstate, -2) && i < ret.size;) {
+ // stack: dict, key, value
+
+ if (lua_type(lstate, -2) == LUA_TSTRING) {
+ lua_pushvalue(lstate, -2);
+ // stack: dict, key, value, key
+
+ ret.items[i].key = nlua_pop_String(lstate, err);
+ // stack: dict, key, value
+
+ if (!ERROR_SET(err)) {
+ ret.items[i].value = nlua_pop_Object(lstate, err);
+ // stack: dict, key
+ } else {
+ lua_pop(lstate, 1);
+ // stack: dict, key
+ }
+
+ if (ERROR_SET(err)) {
+ ret.size = i;
+ api_free_dictionary(ret);
+ lua_pop(lstate, 2);
+ // stack:
+ return (Dictionary) { .size = 0, .items = NULL };
+ }
+ i++;
+ } else {
+ lua_pop(lstate, 1);
+ // stack: dict, key
+ }
+ }
+ lua_pop(lstate, 1);
+
+ return ret;
+}
+
+/// Convert lua table to dictionary
+///
+/// Always pops one value from the stack.
+Dictionary nlua_pop_Dictionary(lua_State *lstate, Error *err)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ const LuaTableProps table_props = nlua_check_type(lstate, err,
+ kObjectTypeDictionary);
+ if (table_props.type != kObjectTypeDictionary) {
+ lua_pop(lstate, 1);
+ return (Dictionary) { .size = 0, .items = NULL };
+ }
+
+ return nlua_pop_Dictionary_unchecked(lstate, table_props, err);
+}
+
+/// Helper structure for nlua_pop_Object
+typedef struct {
+ Object *obj; ///< Location where conversion result is saved.
+ bool container; ///< True if tv is a container.
+} ObjPopStackItem;
+
+/// Convert lua table to object
+///
+/// Always pops one value from the stack.
+Object nlua_pop_Object(lua_State *const lstate, Error *const err)
+{
+ Object ret = NIL;
+ const int initial_size = lua_gettop(lstate);
+ kvec_t(ObjPopStackItem) stack = KV_INITIAL_VALUE;
+ kv_push(stack, ((ObjPopStackItem) { &ret, false }));
+ while (!ERROR_SET(err) && kv_size(stack)) {
+ if (!lua_checkstack(lstate, lua_gettop(lstate) + 3)) {
+ api_set_error(err, kErrorTypeException, "Lua failed to grow stack");
+ break;
+ }
+ ObjPopStackItem cur = kv_pop(stack);
+ if (cur.container) {
+ if (cur.obj->type == kObjectTypeDictionary) {
+ // stack: โ€ฆ, dict, key
+ if (cur.obj->data.dictionary.size
+ == cur.obj->data.dictionary.capacity) {
+ lua_pop(lstate, 2);
+ continue;
+ }
+ bool next_key_found = false;
+ while (lua_next(lstate, -2)) {
+ // stack: โ€ฆ, dict, new key, val
+ if (lua_type(lstate, -2) == LUA_TSTRING) {
+ next_key_found = true;
+ break;
+ }
+ lua_pop(lstate, 1);
+ // stack: โ€ฆ, dict, new key
+ }
+ if (next_key_found) {
+ // stack: โ€ฆ, dict, new key, val
+ size_t len;
+ const char *s = lua_tolstring(lstate, -2, &len);
+ const size_t idx = cur.obj->data.dictionary.size++;
+ cur.obj->data.dictionary.items[idx].key = (String) {
+ .data = xmemdupz(s, len),
+ .size = len,
+ };
+ kv_push(stack, cur);
+ cur = (ObjPopStackItem) {
+ .obj = &cur.obj->data.dictionary.items[idx].value,
+ .container = false,
+ };
+ } else {
+ // stack: โ€ฆ, dict
+ lua_pop(lstate, 1);
+ // stack: โ€ฆ
+ continue;
+ }
+ } else {
+ if (cur.obj->data.array.size == cur.obj->data.array.capacity) {
+ lua_pop(lstate, 1);
+ continue;
+ }
+ const size_t idx = cur.obj->data.array.size++;
+ lua_rawgeti(lstate, -1, (int)idx + 1);
+ if (lua_isnil(lstate, -1)) {
+ lua_pop(lstate, 2);
+ continue;
+ }
+ kv_push(stack, cur);
+ cur = (ObjPopStackItem) {
+ .obj = &cur.obj->data.array.items[idx],
+ .container = false,
+ };
+ }
+ }
+ assert(!cur.container);
+ *cur.obj = NIL;
+ switch (lua_type(lstate, -1)) {
+ case LUA_TNIL: {
+ break;
+ }
+ case LUA_TBOOLEAN: {
+ *cur.obj = BOOLEAN_OBJ(lua_toboolean(lstate, -1));
+ break;
+ }
+ case LUA_TSTRING: {
+ size_t len;
+ const char *s = lua_tolstring(lstate, -1, &len);
+ *cur.obj = STRING_OBJ(((String) {
+ .data = xmemdupz(s, len),
+ .size = len,
+ }));
+ break;
+ }
+ case LUA_TNUMBER: {
+ const lua_Number n = lua_tonumber(lstate, -1);
+ if (n > (lua_Number)API_INTEGER_MAX || n < (lua_Number)API_INTEGER_MIN
+ || ((lua_Number)((Integer)n)) != n) {
+ *cur.obj = FLOAT_OBJ((Float)n);
+ } else {
+ *cur.obj = INTEGER_OBJ((Integer)n);
+ }
+ break;
+ }
+ case LUA_TTABLE: {
+ const LuaTableProps table_props = nlua_traverse_table(lstate);
+
+ switch (table_props.type) {
+ case kObjectTypeArray: {
+ *cur.obj = ARRAY_OBJ(((Array) {
+ .items = NULL,
+ .size = 0,
+ .capacity = 0,
+ }));
+ if (table_props.maxidx != 0) {
+ cur.obj->data.array.items =
+ xcalloc(table_props.maxidx,
+ sizeof(cur.obj->data.array.items[0]));
+ cur.obj->data.array.capacity = table_props.maxidx;
+ cur.container = true;
+ kv_push(stack, cur);
+ }
+ break;
+ }
+ case kObjectTypeDictionary: {
+ *cur.obj = DICTIONARY_OBJ(((Dictionary) {
+ .items = NULL,
+ .size = 0,
+ .capacity = 0,
+ }));
+ if (table_props.string_keys_num != 0) {
+ cur.obj->data.dictionary.items =
+ xcalloc(table_props.string_keys_num,
+ sizeof(cur.obj->data.dictionary.items[0]));
+ cur.obj->data.dictionary.capacity = table_props.string_keys_num;
+ cur.container = true;
+ kv_push(stack, cur);
+ lua_pushnil(lstate);
+ }
+ break;
+ }
+ case kObjectTypeFloat: {
+ *cur.obj = FLOAT_OBJ((Float)table_props.val);
+ break;
+ }
+ case kObjectTypeNil: {
+ api_set_error(err, kErrorTypeValidation,
+ "Cannot convert given lua table");
+ break;
+ }
+ default: {
+ assert(false);
+ }
+ }
+ break;
+ }
+ default: {
+ api_set_error(err, kErrorTypeValidation,
+ "Cannot convert given lua type");
+ break;
+ }
+ }
+ if (!cur.container) {
+ lua_pop(lstate, 1);
+ }
+ }
+ kv_destroy(stack);
+ if (ERROR_SET(err)) {
+ api_free_object(ret);
+ ret = NIL;
+ lua_pop(lstate, lua_gettop(lstate) - initial_size + 1);
+ }
+ assert(lua_gettop(lstate) == initial_size - 1);
+ return ret;
+}
+
+#define GENERATE_INDEX_FUNCTION(type) \
+type nlua_pop_##type(lua_State *lstate, Error *err) \
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT \
+{ \
+ type ret; \
+ ret = (type)lua_tonumber(lstate, -1); \
+ lua_pop(lstate, 1); \
+ return ret; \
+}
+
+GENERATE_INDEX_FUNCTION(Buffer)
+GENERATE_INDEX_FUNCTION(Window)
+GENERATE_INDEX_FUNCTION(Tabpage)
+
+#undef GENERATE_INDEX_FUNCTION
+
+/// Record some auxilary values in vim module
+///
+/// Assumes that module table is on top of the stack.
+///
+/// Recorded values:
+///
+/// `vim.type_idx`: @see nlua_push_type_idx()
+/// `vim.val_idx`: @see nlua_push_val_idx()
+/// `vim.types`: table mapping possible values of `vim.type_idx` to string
+/// names (i.e. `array`, `float`, `dictionary`) and back.
+void nlua_init_types(lua_State *const lstate)
+{
+ LUA_PUSH_STATIC_STRING(lstate, "type_idx");
+ nlua_push_type_idx(lstate);
+ lua_rawset(lstate, -3);
+
+ LUA_PUSH_STATIC_STRING(lstate, "val_idx");
+ nlua_push_val_idx(lstate);
+ lua_rawset(lstate, -3);
+
+ LUA_PUSH_STATIC_STRING(lstate, "types");
+ lua_createtable(lstate, 0, 3);
+
+ LUA_PUSH_STATIC_STRING(lstate, "float");
+ lua_pushnumber(lstate, (lua_Number)kObjectTypeFloat);
+ lua_rawset(lstate, -3);
+ lua_pushnumber(lstate, (lua_Number)kObjectTypeFloat);
+ LUA_PUSH_STATIC_STRING(lstate, "float");
+ lua_rawset(lstate, -3);
+
+ LUA_PUSH_STATIC_STRING(lstate, "array");
+ lua_pushnumber(lstate, (lua_Number)kObjectTypeArray);
+ lua_rawset(lstate, -3);
+ lua_pushnumber(lstate, (lua_Number)kObjectTypeArray);
+ LUA_PUSH_STATIC_STRING(lstate, "array");
+ lua_rawset(lstate, -3);
+
+ LUA_PUSH_STATIC_STRING(lstate, "dictionary");
+ lua_pushnumber(lstate, (lua_Number)kObjectTypeDictionary);
+ lua_rawset(lstate, -3);
+ lua_pushnumber(lstate, (lua_Number)kObjectTypeDictionary);
+ LUA_PUSH_STATIC_STRING(lstate, "dictionary");
+ lua_rawset(lstate, -3);
+
+ lua_rawset(lstate, -3);
+}
diff --git a/src/nvim/lua/converter.h b/src/nvim/lua/converter.h
new file mode 100644
index 0000000000..542c56ea3e
--- /dev/null
+++ b/src/nvim/lua/converter.h
@@ -0,0 +1,15 @@
+#ifndef NVIM_LUA_CONVERTER_H
+#define NVIM_LUA_CONVERTER_H
+
+#include <lua.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+#include "nvim/api/private/defs.h"
+#include "nvim/func_attr.h"
+#include "nvim/eval.h"
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "lua/converter.h.generated.h"
+#endif
+#endif // NVIM_LUA_CONVERTER_H
diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c
new file mode 100644
index 0000000000..a7bda9d037
--- /dev/null
+++ b/src/nvim/lua/executor.c
@@ -0,0 +1,549 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+#include <lua.h>
+#include <lualib.h>
+#include <lauxlib.h>
+
+#include "nvim/misc1.h"
+#include "nvim/getchar.h"
+#include "nvim/garray.h"
+#include "nvim/func_attr.h"
+#include "nvim/api/private/defs.h"
+#include "nvim/api/private/helpers.h"
+#include "nvim/api/vim.h"
+#include "nvim/vim.h"
+#include "nvim/ex_getln.h"
+#include "nvim/ex_cmds2.h"
+#include "nvim/message.h"
+#include "nvim/memline.h"
+#include "nvim/buffer_defs.h"
+#include "nvim/macros.h"
+#include "nvim/screen.h"
+#include "nvim/cursor.h"
+#include "nvim/undo.h"
+#include "nvim/ascii.h"
+
+#include "nvim/lua/executor.h"
+#include "nvim/lua/converter.h"
+
+typedef struct {
+ Error err;
+ String lua_err_str;
+} LuaError;
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "lua/vim_module.generated.h"
+# include "lua/executor.c.generated.h"
+#endif
+
+/// Name of the run code for use in messages
+#define NLUA_EVAL_NAME "<VimL compiled string>"
+
+/// Convert lua error into a Vim error message
+///
+/// @param lstate Lua interpreter state.
+/// @param[in] msg Message base, must contain one `%s`.
+static void nlua_error(lua_State *const lstate, const char *const msg)
+ FUNC_ATTR_NONNULL_ALL
+{
+ size_t len;
+ const char *const str = lua_tolstring(lstate, -1, &len);
+
+ emsgf(msg, (int)len, str);
+
+ lua_pop(lstate, 1);
+}
+
+/// Compare two strings, ignoring case
+///
+/// Expects two values on the stack: compared strings. Returns one of the
+/// following numbers: 0, -1 or 1.
+///
+/// Does no error handling: never call it with non-string or with some arguments
+/// omitted.
+static int nlua_stricmp(lua_State *const lstate) FUNC_ATTR_NONNULL_ALL
+{
+ size_t s1_len;
+ size_t s2_len;
+ const char *s1 = luaL_checklstring(lstate, 1, &s1_len);
+ const char *s2 = luaL_checklstring(lstate, 2, &s2_len);
+ char *nul1;
+ char *nul2;
+ int ret = 0;
+ assert(s1[s1_len] == NUL);
+ assert(s2[s2_len] == NUL);
+ do {
+ nul1 = memchr(s1, NUL, s1_len);
+ nul2 = memchr(s2, NUL, s2_len);
+ ret = STRICMP(s1, s2);
+ if (ret == 0) {
+ // Compare "a\0" greater then "a".
+ if ((nul1 == NULL) != (nul2 == NULL)) {
+ ret = ((nul1 != NULL) - (nul2 != NULL));
+ break;
+ }
+ if (nul1 != NULL) {
+ assert(nul2 != NULL);
+ // Can't shift both strings by the same amount of bytes: lowercase
+ // letter may have different byte-length than uppercase.
+ s1_len -= (size_t)(nul1 - s1) + 1;
+ s2_len -= (size_t)(nul2 - s2) + 1;
+ s1 = nul1 + 1;
+ s2 = nul2 + 1;
+ } else {
+ break;
+ }
+ } else {
+ break;
+ }
+ } while (true);
+ lua_pop(lstate, 2);
+ lua_pushnumber(lstate, (lua_Number)((ret > 0) - (ret < 0)));
+ return 1;
+}
+
+/// Initialize lua interpreter state
+///
+/// Called by lua interpreter itself to initialize state.
+static int nlua_state_init(lua_State *const lstate) FUNC_ATTR_NONNULL_ALL
+{
+ // print
+ lua_pushcfunction(lstate, &nlua_print);
+ lua_setglobal(lstate, "print");
+
+ // debug.debug
+ lua_getglobal(lstate, "debug");
+ lua_pushcfunction(lstate, &nlua_debug);
+ lua_setfield(lstate, -2, "debug");
+ lua_pop(lstate, 1);
+
+ // vim
+ if (luaL_dostring(lstate, (char *)&vim_module[0])) {
+ nlua_error(lstate, _("E5106: Error while creating vim module: %.*s"));
+ return 1;
+ }
+ // vim.api
+ nlua_add_api_functions(lstate);
+ // vim.types, vim.type_idx, vim.val_idx
+ nlua_init_types(lstate);
+ // stricmp
+ lua_pushcfunction(lstate, &nlua_stricmp);
+ lua_setfield(lstate, -2, "stricmp");
+
+ lua_setglobal(lstate, "vim");
+ return 0;
+}
+
+/// Initialize lua interpreter
+///
+/// Crashes Nvim if initialization fails. Should be called once per lua
+/// interpreter instance.
+///
+/// @return New lua interpreter instance.
+static lua_State *nlua_init(void)
+ FUNC_ATTR_NONNULL_RET FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ lua_State *lstate = luaL_newstate();
+ if (lstate == NULL) {
+ EMSG(_("E970: Failed to initialize lua interpreter"));
+ preserve_exit();
+ }
+ luaL_openlibs(lstate);
+ nlua_state_init(lstate);
+ return lstate;
+}
+
+/// Enter lua interpreter
+///
+/// Calls nlua_init() if needed. Is responsible for pre-lua call initalization
+/// like updating `package.[c]path` with directories derived from &runtimepath.
+///
+/// @return Interpreter instance to use. Will either be initialized now or
+/// taken from previous initialization.
+static lua_State *nlua_enter(void)
+ FUNC_ATTR_NONNULL_RET FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ static lua_State *global_lstate = NULL;
+ if (global_lstate == NULL) {
+ global_lstate = nlua_init();
+ }
+ lua_State *const lstate = global_lstate;
+ // Last used p_rtp value. Must not be dereferenced because value pointed to
+ // may already be freed. Used to check whether &runtimepath option value
+ // changed.
+ static const void *last_p_rtp = NULL;
+ if (last_p_rtp != (const void *)p_rtp) {
+ // stack: (empty)
+ lua_getglobal(lstate, "vim");
+ // stack: vim
+ lua_getfield(lstate, -1, "_update_package_paths");
+ // stack: vim, vim._update_package_paths
+ if (lua_pcall(lstate, 0, 0, 0)) {
+ // stack: vim, error
+ nlua_error(lstate, _("E5117: Error while updating package paths: %.*s"));
+ // stack: vim
+ }
+ // stack: vim
+ lua_pop(lstate, 1);
+ // stack: (empty)
+ last_p_rtp = (const void *)p_rtp;
+ }
+ return lstate;
+}
+
+/// Execute lua string
+///
+/// @param[in] str String to execute.
+/// @param[out] ret_tv Location where result will be saved.
+///
+/// @return Result of the execution.
+void executor_exec_lua(const String str, typval_T *const ret_tv)
+ FUNC_ATTR_NONNULL_ALL
+{
+ lua_State *const lstate = nlua_enter();
+
+ if (luaL_loadbuffer(lstate, str.data, str.size, NLUA_EVAL_NAME)) {
+ nlua_error(lstate, _("E5104: Error while creating lua chunk: %.*s"));
+ return;
+ }
+ if (lua_pcall(lstate, 0, 1, 0)) {
+ nlua_error(lstate, _("E5105: Error while calling lua chunk: %.*s"));
+ return;
+ }
+
+ nlua_pop_typval(lstate, ret_tv);
+}
+
+/// Print as a Vim message
+///
+/// @param lstate Lua interpreter state.
+static int nlua_print(lua_State *const lstate)
+ FUNC_ATTR_NONNULL_ALL
+{
+#define PRINT_ERROR(msg) \
+ do { \
+ errmsg = msg; \
+ errmsg_len = sizeof(msg) - 1; \
+ goto nlua_print_error; \
+ } while (0)
+ const int nargs = lua_gettop(lstate);
+ lua_getglobal(lstate, "tostring");
+ const char *errmsg = NULL;
+ size_t errmsg_len = 0;
+ garray_T msg_ga;
+ ga_init(&msg_ga, 1, 80);
+ int curargidx = 1;
+ for (; curargidx <= nargs; curargidx++) {
+ lua_pushvalue(lstate, -1); // tostring
+ lua_pushvalue(lstate, curargidx); // arg
+ if (lua_pcall(lstate, 1, 1, 0)) {
+ errmsg = lua_tolstring(lstate, -1, &errmsg_len);
+ goto nlua_print_error;
+ }
+ size_t len;
+ const char *const s = lua_tolstring(lstate, -1, &len);
+ if (s == NULL) {
+ PRINT_ERROR(
+ "<Unknown error: lua_tolstring returned NULL for tostring result>");
+ }
+ ga_concat_len(&msg_ga, s, len);
+ if (curargidx < nargs) {
+ ga_append(&msg_ga, ' ');
+ }
+ lua_pop(lstate, 1);
+ }
+#undef PRINT_ERROR
+ lua_pop(lstate, nargs + 1);
+ ga_append(&msg_ga, NUL);
+ {
+ const size_t len = (size_t)msg_ga.ga_len - 1;
+ char *const str = (char *)msg_ga.ga_data;
+
+ for (size_t i = 0; i < len;) {
+ const size_t start = i;
+ while (i < len) {
+ switch (str[i]) {
+ case NUL: {
+ str[i] = NL;
+ i++;
+ continue;
+ }
+ case NL: {
+ str[i] = NUL;
+ i++;
+ break;
+ }
+ default: {
+ i++;
+ continue;
+ }
+ }
+ break;
+ }
+ msg((char_u *)str + start);
+ }
+ if (len && str[len - 1] == NUL) { // Last was newline
+ msg((char_u *)"");
+ }
+ }
+ ga_clear(&msg_ga);
+ return 0;
+nlua_print_error:
+ emsgf(_("E5114: Error while converting print argument #%i: %.*s"),
+ curargidx, (int)errmsg_len, errmsg);
+ ga_clear(&msg_ga);
+ lua_pop(lstate, lua_gettop(lstate));
+ return 0;
+}
+
+/// debug.debug implementation: interaction with user while debugging
+///
+/// @param lstate Lua interpreter state.
+int nlua_debug(lua_State *lstate)
+ FUNC_ATTR_NONNULL_ALL
+{
+ const typval_T input_args[] = {
+ {
+ .v_lock = VAR_FIXED,
+ .v_type = VAR_STRING,
+ .vval.v_string = (char_u *)"lua_debug> ",
+ },
+ {
+ .v_type = VAR_UNKNOWN,
+ },
+ };
+ for (;;) {
+ lua_settop(lstate, 0);
+ typval_T input;
+ get_user_input(input_args, &input, false);
+ msg_putchar('\n'); // Avoid outputting on input line.
+ if (input.v_type != VAR_STRING
+ || input.vval.v_string == NULL
+ || *input.vval.v_string == NUL
+ || STRCMP(input.vval.v_string, "cont") == 0) {
+ tv_clear(&input);
+ return 0;
+ }
+ if (luaL_loadbuffer(lstate, (const char *)input.vval.v_string,
+ STRLEN(input.vval.v_string), "=(debug command)")) {
+ nlua_error(lstate, _("E5115: Error while loading debug string: %.*s"));
+ }
+ tv_clear(&input);
+ if (lua_pcall(lstate, 0, 0, 0)) {
+ nlua_error(lstate, _("E5116: Error while calling debug string: %.*s"));
+ }
+ }
+ return 0;
+}
+
+/// Evaluate lua string
+///
+/// Used for luaeval().
+///
+/// @param[in] str String to execute.
+/// @param[in] arg Second argument to `luaeval()`.
+/// @param[out] ret_tv Location where result will be saved.
+///
+/// @return Result of the execution.
+void executor_eval_lua(const String str, typval_T *const arg,
+ typval_T *const ret_tv)
+ FUNC_ATTR_NONNULL_ALL
+{
+ lua_State *const lstate = nlua_enter();
+
+ garray_T str_ga;
+ ga_init(&str_ga, 1, 80);
+#define EVALHEADER "local _A=select(1,...) return ("
+ const size_t lcmd_len = sizeof(EVALHEADER) - 1 + str.size + 1;
+ char *lcmd;
+ if (lcmd_len < IOSIZE) {
+ lcmd = (char *)IObuff;
+ } else {
+ lcmd = xmalloc(lcmd_len);
+ }
+ memcpy(lcmd, EVALHEADER, sizeof(EVALHEADER) - 1);
+ memcpy(lcmd + sizeof(EVALHEADER) - 1, str.data, str.size);
+ lcmd[lcmd_len - 1] = ')';
+#undef EVALHEADER
+ if (luaL_loadbuffer(lstate, lcmd, lcmd_len, NLUA_EVAL_NAME)) {
+ nlua_error(lstate,
+ _("E5107: Error while creating lua chunk for luaeval(): %.*s"));
+ if (lcmd != (char *)IObuff) {
+ xfree(lcmd);
+ }
+ return;
+ }
+ if (lcmd != (char *)IObuff) {
+ xfree(lcmd);
+ }
+
+ if (arg->v_type == VAR_UNKNOWN) {
+ lua_pushnil(lstate);
+ } else {
+ nlua_push_typval(lstate, arg);
+ }
+ if (lua_pcall(lstate, 1, 1, 0)) {
+ nlua_error(lstate,
+ _("E5108: Error while calling lua chunk for luaeval(): %.*s"));
+ return;
+ }
+
+ nlua_pop_typval(lstate, ret_tv);
+}
+
+/// Execute lua string
+///
+/// Used for nvim_execute_lua().
+///
+/// @param[in] str String to execute.
+/// @param[in] args array of ... args
+/// @param[out] err Location where error will be saved.
+///
+/// @return Return value of the execution.
+Object executor_exec_lua_api(const String str, const Array args, Error *err)
+{
+ lua_State *const lstate = nlua_enter();
+
+ if (luaL_loadbuffer(lstate, str.data, str.size, "<nvim>")) {
+ size_t len;
+ const char *errstr = lua_tolstring(lstate, -1, &len);
+ api_set_error(err, kErrorTypeValidation,
+ "Error loading lua: %.*s", (int)len, errstr);
+ return NIL;
+ }
+
+ for (size_t i = 0; i < args.size; i++) {
+ nlua_push_Object(lstate, args.items[i]);
+ }
+
+ if (lua_pcall(lstate, (int)args.size, 1, 0)) {
+ size_t len;
+ const char *errstr = lua_tolstring(lstate, -1, &len);
+ api_set_error(err, kErrorTypeException,
+ "Error executing lua: %.*s", (int)len, errstr);
+ return NIL;
+ }
+
+ return nlua_pop_Object(lstate, err);
+}
+
+
+/// Run lua string
+///
+/// Used for :lua.
+///
+/// @param eap VimL command being run.
+void ex_lua(exarg_T *const eap)
+ FUNC_ATTR_NONNULL_ALL
+{
+ size_t len;
+ char *const code = script_get(eap, &len);
+ if (eap->skip) {
+ xfree(code);
+ return;
+ }
+ typval_T tv = { .v_type = VAR_UNKNOWN };
+ executor_exec_lua((String) { .data = code, .size = len }, &tv);
+ tv_clear(&tv);
+ xfree(code);
+}
+
+/// Run lua string for each line in range
+///
+/// Used for :luado.
+///
+/// @param eap VimL command being run.
+void ex_luado(exarg_T *const eap)
+ FUNC_ATTR_NONNULL_ALL
+{
+ if (u_save(eap->line1 - 1, eap->line2 + 1) == FAIL) {
+ EMSG(_("cannot save undo information"));
+ return;
+ }
+ const char *const cmd = (const char *)eap->arg;
+ const size_t cmd_len = strlen(cmd);
+
+ lua_State *const lstate = nlua_enter();
+
+#define DOSTART "return function(line, linenr) "
+#define DOEND " end"
+ const size_t lcmd_len = (cmd_len
+ + (sizeof(DOSTART) - 1)
+ + (sizeof(DOEND) - 1));
+ char *lcmd;
+ if (lcmd_len < IOSIZE) {
+ lcmd = (char *)IObuff;
+ } else {
+ lcmd = xmalloc(lcmd_len + 1);
+ }
+ memcpy(lcmd, DOSTART, sizeof(DOSTART) - 1);
+ memcpy(lcmd + sizeof(DOSTART) - 1, cmd, cmd_len);
+ memcpy(lcmd + sizeof(DOSTART) - 1 + cmd_len, DOEND, sizeof(DOEND) - 1);
+#undef DOSTART
+#undef DOEND
+
+ if (luaL_loadbuffer(lstate, lcmd, lcmd_len, NLUA_EVAL_NAME)) {
+ nlua_error(lstate, _("E5109: Error while creating lua chunk: %.*s"));
+ if (lcmd_len >= IOSIZE) {
+ xfree(lcmd);
+ }
+ return;
+ }
+ if (lcmd_len >= IOSIZE) {
+ xfree(lcmd);
+ }
+ if (lua_pcall(lstate, 0, 1, 0)) {
+ nlua_error(lstate, _("E5110: Error while creating lua function: %.*s"));
+ return;
+ }
+ for (linenr_T l = eap->line1; l <= eap->line2; l++) {
+ if (l > curbuf->b_ml.ml_line_count) {
+ break;
+ }
+ lua_pushvalue(lstate, -1);
+ lua_pushstring(lstate, (const char *)ml_get_buf(curbuf, l, false));
+ lua_pushnumber(lstate, (lua_Number)l);
+ if (lua_pcall(lstate, 2, 1, 0)) {
+ nlua_error(lstate, _("E5111: Error while calling lua function: %.*s"));
+ break;
+ }
+ if (lua_isstring(lstate, -1)) {
+ size_t new_line_len;
+ const char *const new_line = lua_tolstring(lstate, -1, &new_line_len);
+ char *const new_line_transformed = xmemdupz(new_line, new_line_len);
+ for (size_t i = 0; i < new_line_len; i++) {
+ if (new_line_transformed[i] == NUL) {
+ new_line_transformed[i] = '\n';
+ }
+ }
+ ml_replace(l, (char_u *)new_line_transformed, false);
+ changed_bytes(l, 0);
+ }
+ lua_pop(lstate, 1);
+ }
+ lua_pop(lstate, 1);
+ check_cursor();
+ update_screen(NOT_VALID);
+}
+
+/// Run lua file
+///
+/// Used for :luafile.
+///
+/// @param eap VimL command being run.
+void ex_luafile(exarg_T *const eap)
+ FUNC_ATTR_NONNULL_ALL
+{
+ lua_State *const lstate = nlua_enter();
+
+ if (luaL_loadfile(lstate, (const char *)eap->arg)) {
+ nlua_error(lstate, _("E5112: Error while creating lua chunk: %.*s"));
+ return;
+ }
+
+ if (lua_pcall(lstate, 0, 0, 0)) {
+ nlua_error(lstate, _("E5113: Error while calling lua chunk: %.*s"));
+ return;
+ }
+}
diff --git a/src/nvim/lua/executor.h b/src/nvim/lua/executor.h
new file mode 100644
index 0000000000..0cbf290f64
--- /dev/null
+++ b/src/nvim/lua/executor.h
@@ -0,0 +1,25 @@
+#ifndef NVIM_LUA_EXECUTOR_H
+#define NVIM_LUA_EXECUTOR_H
+
+#include <lua.h>
+
+#include "nvim/api/private/defs.h"
+#include "nvim/func_attr.h"
+#include "nvim/eval/typval.h"
+#include "nvim/ex_cmds_defs.h"
+
+// Generated by msgpack-gen.lua
+void nlua_add_api_functions(lua_State *lstate) REAL_FATTR_NONNULL_ALL;
+
+#define set_api_error(s, err) \
+ do { \
+ Error *err_ = (err); \
+ err_->type = kErrorTypeException; \
+ err_->set = true; \
+ memcpy(&err_->msg[0], s, sizeof(s)); \
+ } while (0)
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "lua/executor.h.generated.h"
+#endif
+#endif // NVIM_LUA_EXECUTOR_H
diff --git a/src/nvim/lua/vim.lua b/src/nvim/lua/vim.lua
new file mode 100644
index 0000000000..b0d0bfc74b
--- /dev/null
+++ b/src/nvim/lua/vim.lua
@@ -0,0 +1,212 @@
+-- Internal-only until comments in #8107 are addressed.
+-- Returns:
+-- {errcode}, {output}
+local function _system(cmd)
+ local out = vim.api.nvim_call_function('system', { cmd })
+ local err = vim.api.nvim_get_vvar('shell_error')
+ return err, out
+end
+
+-- Gets process info from the `ps` command.
+-- Used by nvim_get_proc() as a fallback.
+local function _os_proc_info(pid)
+ if pid == nil or pid <= 0 or type(pid) ~= 'number' then
+ error('invalid pid')
+ end
+ local cmd = { 'ps', '-p', pid, '-o', 'comm=', }
+ local err, name = _system(cmd)
+ if 1 == err and string.gsub(name, '%s*', '') == '' then
+ return {} -- Process not found.
+ elseif 0 ~= err then
+ local args_str = vim.api.nvim_call_function('string', { cmd })
+ error('command failed: '..args_str)
+ end
+ local _, ppid = _system({ 'ps', '-p', pid, '-o', 'ppid=', })
+ -- Remove trailing whitespace.
+ name = string.gsub(string.gsub(name, '%s+$', ''), '^.*/', '')
+ ppid = string.gsub(ppid, '%s+$', '')
+ ppid = tonumber(ppid) == nil and -1 or tonumber(ppid)
+ return {
+ name = name,
+ pid = pid,
+ ppid = ppid,
+ }
+end
+
+-- Gets process children from the `pgrep` command.
+-- Used by nvim_get_proc_children() as a fallback.
+local function _os_proc_children(ppid)
+ if ppid == nil or ppid <= 0 or type(ppid) ~= 'number' then
+ error('invalid ppid')
+ end
+ local cmd = { 'pgrep', '-P', ppid, }
+ local err, rv = _system(cmd)
+ if 1 == err and string.gsub(rv, '%s*', '') == '' then
+ return {} -- Process not found.
+ elseif 0 ~= err then
+ local args_str = vim.api.nvim_call_function('string', { cmd })
+ error('command failed: '..args_str)
+ end
+ local children = {}
+ for s in string.gmatch(rv, '%S+') do
+ local i = tonumber(s)
+ if i ~= nil then
+ table.insert(children, i)
+ end
+ end
+ return children
+end
+
+-- TODO(ZyX-I): Create compatibility layer.
+--{{{1 package.path updater function
+-- Last inserted paths. Used to clear out items from package.[c]path when they
+-- are no longer in &runtimepath.
+local last_nvim_paths = {}
+local function _update_package_paths()
+ local cur_nvim_paths = {}
+ local rtps = vim.api.nvim_list_runtime_paths()
+ local sep = package.config:sub(1, 1)
+ for _, key in ipairs({'path', 'cpath'}) do
+ local orig_str = package[key] .. ';'
+ local pathtrails_ordered = {}
+ local orig = {}
+ -- Note: ignores trailing item without trailing `;`. Not using something
+ -- simpler in order to preserve empty items (stand for default path).
+ for s in orig_str:gmatch('[^;]*;') do
+ s = s:sub(1, -2) -- Strip trailing semicolon
+ orig[#orig + 1] = s
+ end
+ if key == 'path' then
+ -- /?.lua and /?/init.lua
+ pathtrails_ordered = {sep .. '?.lua', sep .. '?' .. sep .. 'init.lua'}
+ else
+ local pathtrails = {}
+ for _, s in ipairs(orig) do
+ -- Find out path patterns. pathtrail should contain something like
+ -- /?.so, \?.dll. This allows not to bother determining what correct
+ -- suffixes are.
+ local pathtrail = s:match('[/\\][^/\\]*%?.*$')
+ if pathtrail and not pathtrails[pathtrail] then
+ pathtrails[pathtrail] = true
+ pathtrails_ordered[#pathtrails_ordered + 1] = pathtrail
+ end
+ end
+ end
+ local new = {}
+ for _, rtp in ipairs(rtps) do
+ if not rtp:match(';') then
+ for _, pathtrail in pairs(pathtrails_ordered) do
+ local new_path = rtp .. sep .. 'lua' .. pathtrail
+ -- Always keep paths from &runtimepath at the start:
+ -- append them here disregarding orig possibly containing one of them.
+ new[#new + 1] = new_path
+ cur_nvim_paths[new_path] = true
+ end
+ end
+ end
+ for _, orig_path in ipairs(orig) do
+ -- Handle removing obsolete paths originating from &runtimepath: such
+ -- paths either belong to cur_nvim_paths and were already added above or
+ -- to last_nvim_paths and should not be added at all if corresponding
+ -- entry was removed from &runtimepath list.
+ if not (cur_nvim_paths[orig_path] or last_nvim_paths[orig_path]) then
+ new[#new + 1] = orig_path
+ end
+ end
+ package[key] = table.concat(new, ';')
+ end
+ last_nvim_paths = cur_nvim_paths
+end
+
+local function gsplit(s, sep, plain)
+ assert(type(s) == "string")
+ assert(type(sep) == "string")
+ assert(type(plain) == "boolean" or type(plain) == "nil")
+
+ local start = 1
+ local done = false
+
+ local function pass(i, j, ...)
+ if i then
+ assert(j+1 > start, "Infinite loop detected")
+ local seg = s:sub(start, i - 1)
+ start = j + 1
+ return seg, ...
+ else
+ done = true
+ return s:sub(start)
+ end
+ end
+
+ return function()
+ if done then
+ return
+ end
+ if sep == '' then
+ if start == #s then
+ done = true
+ end
+ return pass(start+1, start)
+ end
+ return pass(s:find(sep, start, plain))
+ end
+end
+
+local function split(s,sep,plain)
+ local t={} for c in gsplit(s, sep, plain) do table.insert(t,c) end
+ return t
+end
+
+local function trim(s)
+ assert(type(s) == "string", "Only strings can be trimmed")
+ local result = s:gsub("^%s+", ""):gsub("%s+$", "")
+ return result
+end
+
+local deepcopy
+
+local function id(v)
+ return v
+end
+
+local deepcopy_funcs = {
+ table = function(orig)
+ local copy = {}
+ for k, v in pairs(orig) do
+ copy[deepcopy(k)] = deepcopy(v)
+ end
+ return copy
+ end,
+ number = id,
+ string = id,
+ ['nil'] = id,
+ boolean = id,
+}
+
+deepcopy = function(orig)
+ return deepcopy_funcs[type(orig)](orig)
+end
+
+local function __index(table, key)
+ if key == "inspect" then
+ table.inspect = require("vim.inspect")
+ return table.inspect
+ end
+end
+
+local module = {
+ _update_package_paths = _update_package_paths,
+ _os_proc_children = _os_proc_children,
+ _os_proc_info = _os_proc_info,
+ _system = _system,
+ trim = trim,
+ split = split,
+ gsplit = gsplit,
+ deepcopy = deepcopy,
+}
+
+setmetatable(module, {
+ __index = __index
+})
+
+return module
diff --git a/src/nvim/macros.h b/src/nvim/macros.h
index 5f69fa2f6a..d447bff765 100644
--- a/src/nvim/macros.h
+++ b/src/nvim/macros.h
@@ -19,41 +19,27 @@
# define MAX(X, Y) ((X) > (Y) ? (X) : (Y))
#endif
-/*
- * Position comparisons
- */
-# define lt(a, b) (((a).lnum != (b).lnum) \
- ? (a).lnum < (b).lnum \
- : (a).col != (b).col \
- ? (a).col < (b).col \
- : (a).coladd < (b).coladd)
-# define ltp(a, b) (((a)->lnum != (b)->lnum) \
- ? (a)->lnum < (b)->lnum \
- : (a)->col != (b)->col \
- ? (a)->col < (b)->col \
- : (a)->coladd < (b)->coladd)
-# define equalpos(a, b) (((a).lnum == (b).lnum) && ((a).col == (b).col) && \
- ((a).coladd == (b).coladd))
-# define clearpos(a) {(a)->lnum = 0; (a)->col = 0; (a)->coladd = 0; }
-
-#define ltoreq(a, b) (lt(a, b) || equalpos(a, b))
+/// String with length
+///
+/// For use in functions which accept (char *s, size_t len) pair in arguments.
+///
+/// @param[in] s Static string.
+///
+/// @return `s, sizeof(s) - 1`
+#define S_LEN(s) (s), (sizeof(s) - 1)
-/*
- * lineempty() - return TRUE if the line is empty
- */
-#define lineempty(p) (*ml_get(p) == NUL)
+/// LINEEMPTY() - return TRUE if the line is empty
+#define LINEEMPTY(p) (*ml_get(p) == NUL)
-/*
- * bufempty() - return TRUE if the current buffer is empty
- */
-#define bufempty() (curbuf->b_ml.ml_line_count == 1 && *ml_get((linenr_T)1) == \
+/// BUFEMPTY() - return TRUE if the current buffer is empty
+#define BUFEMPTY() (curbuf->b_ml.ml_line_count == 1 && *ml_get((linenr_T)1) == \
NUL)
/*
* toupper() and tolower() that use the current locale.
* Careful: Only call TOUPPER_LOC() and TOLOWER_LOC() with a character in the
* range 0 - 255. toupper()/tolower() on some systems can't handle others.
- * Note: It is often better to use vim_tolower() and vim_toupper(), because many
+ * Note: It is often better to use mb_tolower() and mb_toupper(), because many
* toupper() and tolower() implementations only work for ASCII.
*/
#define TOUPPER_LOC toupper
@@ -73,11 +59,6 @@
/* Returns empty string if it is NULL. */
#define EMPTY_IF_NULL(x) ((x) ? (x) : (char_u *)"")
-/* macro version of chartab().
- * Only works with values 0-255!
- * Doesn't work for UTF-8 mode with chars >= 0x80. */
-#define CHARSIZE(c) (chartab[c] & CT_CELL_MASK)
-
/*
* Adjust chars in a language according to 'langmap' option.
* NOTE that there is no noticeable overhead if 'langmap' is not set.
@@ -90,7 +71,7 @@
do { \
if (*p_langmap \
&& (condition) \
- && (!p_lnr || (p_lnr && typebuf_maplen() == 0)) \
+ && (p_lrm || (vgetc_busy ? typebuf_maplen() == 0 : KeyTyped)) \
&& !KeyStuffed \
&& (c) >= 0) \
{ \
@@ -101,12 +82,6 @@
} \
} while (0)
-/*
- * vim_isbreak() is used very often if 'linebreak' is set, use a macro to make
- * it work fast.
- */
-#define vim_isbreak(c) (breakat_flags[(char_u)(c)])
-
#define WRITEBIN "wb" /* no CR-LF translation */
#define READBIN "rb"
#define APPENDBIN "ab"
@@ -116,8 +91,10 @@
/* mch_open_rw(): invoke os_open() with third argument for user R/W. */
#if defined(UNIX) /* open in rw------- mode */
# define mch_open_rw(n, f) os_open((n), (f), (mode_t)0600)
+#elif defined(WIN32)
+# define mch_open_rw(n, f) os_open((n), (f), S_IREAD | S_IWRITE)
#else
-# define mch_open_rw(n, f) os_open((n), (f), 0)
+# define mch_open_rw(n, f) os_open((n), (f), 0)
#endif
# define REPLACE_NORMAL(s) (((s) & REPLACE_FLAG) && !((s) & VREPLACE_FLAG))
@@ -127,43 +104,98 @@
/* Whether to draw the vertical bar on the right side of the cell. */
# define CURSOR_BAR_RIGHT (curwin->w_p_rl && (!(State & CMDLINE) || cmdmsg_rl))
-/*
- * mb_ptr_adv(): advance a pointer to the next character, taking care of
- * multi-byte characters if needed.
- * mb_ptr_back(): backup a pointer to the previous character, taking care of
- * multi-byte characters if needed.
- * MB_COPY_CHAR(f, t): copy one char from "f" to "t" and advance the pointers.
- * PTR2CHAR(): get character from pointer.
- */
-/* Get the length of the character p points to */
-# define MB_PTR2LEN(p) (has_mbyte ? (*mb_ptr2len)(p) : 1)
-/* Advance multi-byte pointer, skip over composing chars. */
-# define mb_ptr_adv(p) (p += has_mbyte ? (*mb_ptr2len)((char_u *)p) : 1)
-/* Advance multi-byte pointer, do not skip over composing chars. */
-# define mb_cptr_adv(p) (p += \
- enc_utf8 ? utf_ptr2len(p) : has_mbyte ? (*mb_ptr2len)(p) : 1)
-/* Backup multi-byte pointer. Only use with "p" > "s" ! */
-# define mb_ptr_back(s, p) (p -= has_mbyte ? ((*mb_head_off)((char_u *)s, (char_u *)p - 1) + 1) : 1)
-/* get length of multi-byte char, not including composing chars */
-# define mb_cptr2len(p) (enc_utf8 ? utf_ptr2len(p) : (*mb_ptr2len)(p))
-
-# define MB_COPY_CHAR(f, t) \
- if (has_mbyte) mb_copy_char((const char_u **)(&f), &t); \
- else *t++ = *f++
-# define MB_CHARLEN(p) (has_mbyte ? mb_charlen(p) : (int)STRLEN(p))
-# define MB_CHAR2LEN(c) (has_mbyte ? mb_char2len(c) : 1)
-# define PTR2CHAR(p) (has_mbyte ? mb_ptr2char(p) : (int)*(p))
+// MB_PTR_ADV(): advance a pointer to the next character, taking care of
+// multi-byte characters if needed.
+// MB_PTR_BACK(): backup a pointer to the previous character, taking care of
+// multi-byte characters if needed.
+// MB_COPY_CHAR(f, t): copy one char from "f" to "t" and advance the pointers.
+// PTR2CHAR(): get character from pointer.
+
+// Get the length of the character p points to
+# define MB_PTR2LEN(p) mb_ptr2len(p)
+// Advance multi-byte pointer, skip over composing chars.
+# define MB_PTR_ADV(p) (p += mb_ptr2len((char_u *)p))
+// Advance multi-byte pointer, do not skip over composing chars.
+# define MB_CPTR_ADV(p) (p += utf_ptr2len(p))
+// Backup multi-byte pointer. Only use with "p" > "s" !
+# define MB_PTR_BACK(s, p) \
+ (p -= utf_head_off((char_u *)s, (char_u *)p - 1) + 1)
+// get length of multi-byte char, not including composing chars
+# define MB_CPTR2LEN(p) utf_ptr2len(p)
+
+# define MB_COPY_CHAR(f, t) mb_copy_char((const char_u **)(&f), &t);
+
+# define MB_CHARLEN(p) mb_charlen(p)
+# define MB_CHAR2LEN(c) mb_char2len(c)
+# define PTR2CHAR(p) utf_ptr2char(p)
# define RESET_BINDING(wp) (wp)->w_p_scb = FALSE; (wp)->w_p_crb = FALSE
-/// Calculate the length of a C array.
+/// Calculate the length of a C array
+///
+/// This should be called with a real array. Calling this with a pointer is an
+/// error. A mechanism to detect many (though not all) of those errors at
+/// compile time is implemented. It works by the second division producing
+/// a division by zero in those cases (-Wdiv-by-zero in GCC).
+#define ARRAY_SIZE(arr) \
+ ((sizeof(arr)/sizeof((arr)[0])) \
+ / ((size_t)(!(sizeof(arr) % sizeof((arr)[0])))))
+
+/// Get last array entry
///
/// This should be called with a real array. Calling this with a pointer is an
-/// error. A mechanism to detect many (though not all) of those errors at compile
-/// time is implemented. It works by the second division producing a division by
-/// zero in those cases (-Wdiv-by-zero in GCC).
-#define ARRAY_SIZE(arr) ((sizeof(arr)/sizeof((arr)[0])) / ((size_t)(!(sizeof(arr) % sizeof((arr)[0])))))
+/// error.
+#define ARRAY_LAST_ENTRY(arr) (arr)[ARRAY_SIZE(arr) - 1]
+
+// Duplicated in os/win_defs.h to avoid include-order sensitivity.
+#define RGB_(r, g, b) ((r << 16) | (g << 8) | b)
+
+#define STR_(x) #x
+#define STR(x) STR_(x)
+
+#ifndef __has_attribute
+# define NVIM_HAS_ATTRIBUTE(x) 0
+#elif defined(__clang__) && __clang__ == 1 \
+ && (__clang_major__ < 3 || (__clang_major__ == 3 && __clang_minor__ <= 5))
+// Starting in Clang 3.6, __has_attribute was fixed to only report true for
+// GNU-style attributes. Prior to that, it reported true if _any_ backend
+// supported the attribute.
+# define NVIM_HAS_ATTRIBUTE(x) 0
+#else
+# define NVIM_HAS_ATTRIBUTE __has_attribute
+#endif
+
+#if NVIM_HAS_ATTRIBUTE(fallthrough)
+# define FALLTHROUGH __attribute__((fallthrough))
+#else
+# define FALLTHROUGH
+#endif
+
+// -V:STRUCT_CAST:641
+
+/// Change type of structure pointers: cast `struct a *` to `struct b *`
+///
+/// Used to silence PVS errors.
+///
+/// @param Type Structure to cast to.
+/// @param obj Object to cast.
+///
+/// @return ((Type *)obj).
+#define STRUCT_CAST(Type, obj) ((Type *)(obj))
+
+// Type of uv_buf_t.len is platform-dependent.
+// Related: https://github.com/libuv/libuv/pull/1236
+#if defined(WIN32)
+# define UV_BUF_LEN(x) (ULONG)(x)
+#else
+# define UV_BUF_LEN(x) (x)
+#endif
-#define RGB(r, g, b) ((r << 16) | (g << 8) | b)
+// Type of read()/write() `count` param is platform-dependent.
+#if defined(WIN32)
+# define IO_COUNT(x) (unsigned)(x)
+#else
+# define IO_COUNT(x) (x)
+#endif
#endif // NVIM_MACROS_H
diff --git a/src/nvim/main.c b/src/nvim/main.c
index 64b5de8663..17f3a894d4 100644
--- a/src/nvim/main.c
+++ b/src/nvim/main.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#define EXTERN
#include <assert.h>
#include <stdint.h>
@@ -20,6 +23,7 @@
#include "nvim/fold.h"
#include "nvim/getchar.h"
#include "nvim/hashtab.h"
+#include "nvim/highlight.h"
#include "nvim/iconv.h"
#include "nvim/if_cscope.h"
#ifdef HAVE_LOCALE_H
@@ -30,7 +34,6 @@
#include "nvim/memline.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/garray.h"
#include "nvim/log.h"
#include "nvim/memory.h"
@@ -55,58 +58,59 @@
#include "nvim/os/input.h"
#include "nvim/os/os.h"
#include "nvim/os/time.h"
+#include "nvim/os/fileio.h"
#include "nvim/event/loop.h"
#include "nvim/os/signal.h"
#include "nvim/event/process.h"
-#include "nvim/msgpack_rpc/defs.h"
#include "nvim/msgpack_rpc/helpers.h"
#include "nvim/msgpack_rpc/server.h"
#include "nvim/msgpack_rpc/channel.h"
+#include "nvim/api/ui.h"
#include "nvim/api/private/defs.h"
#include "nvim/api/private/helpers.h"
#include "nvim/api/private/handle.h"
+#include "nvim/api/private/dispatch.h"
+#ifndef WIN32
+# include "nvim/os/pty_process_unix.h"
+#endif
+#include "nvim/api/vim.h"
-/* Maximum number of commands from + or -c arguments. */
+// Maximum number of commands from + or -c arguments.
#define MAX_ARG_CMDS 10
-/* values for "window_layout" */
-#define WIN_HOR 1 /* "-o" horizontally split windows */
-#define WIN_VER 2 /* "-O" vertically split windows */
-#define WIN_TABS 3 /* "-p" windows on tab pages */
+// values for "window_layout"
+#define WIN_HOR 1 // "-o" horizontally split windows
+#define WIN_VER 2 // "-O" vertically split windows
+#define WIN_TABS 3 // "-p" windows on tab pages
-/* Struct for various parameters passed between main() and other functions. */
+// Struct for various parameters passed between main() and other functions.
typedef struct {
int argc;
char **argv;
char *use_vimrc; // vimrc from -u argument
- int n_commands; /* no. of commands from + or -c */
+ int n_commands; // no. of commands from + or -c
char *commands[MAX_ARG_CMDS]; // commands from + or -c arg
- char_u cmds_tofree[MAX_ARG_CMDS]; /* commands that need free() */
- int n_pre_commands; /* no. of commands from --cmd */
+ char_u cmds_tofree[MAX_ARG_CMDS]; // commands that need free()
+ int n_pre_commands; // no. of commands from --cmd
char *pre_commands[MAX_ARG_CMDS]; // commands from --cmd argument
- int edit_type; /* type of editing to do */
- char_u *tagname; /* tag from -t argument */
- char_u *use_ef; /* 'errorfile' from -q argument */
+ int edit_type; // type of editing to do
+ char_u *tagname; // tag from -t argument
+ char_u *use_ef; // 'errorfile' from -q argument
- int want_full_screen;
bool input_isatty; // stdin is a terminal
bool output_isatty; // stdout is a terminal
bool err_isatty; // stderr is a terminal
- bool headless; // Dont try to start an user interface
- // or read/write to stdio(unless
- // embedding)
- int no_swap_file; /* "-n" argument used */
+ int no_swap_file; // "-n" argument used
int use_debug_break_level;
- int window_count; /* number of windows to use */
- int window_layout; /* 0, WIN_HOR, WIN_VER or WIN_TABS */
+ int window_count; // number of windows to use
+ int window_layout; // 0, WIN_HOR, WIN_VER or WIN_TABS
-#if !defined(UNIX)
- int literal; /* don't expand file names */
-#endif
- int diff_mode; /* start with 'diff' set */
+ int diff_mode; // start with 'diff' set
+
+ char *listen_addr; // --listen {address}
} mparm_T;
/* Values for edit_type. */
@@ -122,7 +126,7 @@ typedef struct {
Loop main_loop;
-static char *argv0;
+static char *argv0 = NULL;
// Error messages
static const char *err_arg_missing = N_("Argument missing after");
@@ -147,17 +151,21 @@ void event_init(void)
signal_init();
// finish mspgack-rpc initialization
channel_init();
- server_init();
+ remote_ui_init();
+ api_vim_init();
terminal_init();
}
-void event_teardown(void)
+/// @returns false if main_loop could not be closed gracefully
+bool event_teardown(void)
{
if (!main_loop.events) {
- return;
+ input_stop();
+ return true;
}
- queue_process_events(main_loop.events);
+ multiqueue_process_events(main_loop.events);
+ loop_poll_events(&main_loop, 0); // Drain thread_events, fast_events.
input_stop();
channel_teardown();
process_teardown(&main_loop);
@@ -166,7 +174,7 @@ void event_teardown(void)
signal_teardown();
terminal_teardown();
- loop_close(&main_loop);
+ return loop_close(&main_loop, true);
}
/// Performs early initialization.
@@ -177,12 +185,10 @@ void early_init(void)
log_init();
fs_init();
handle_init();
-
- (void)mb_init(); // init mb_bytelen_tab[] to ones
eval_init(); // init global variables
-
- // Init the table of Normal mode commands.
- init_normal_cmds();
+ init_path(argv0 ? argv0 : "nvim");
+ init_normal_cmds(); // Init the table of Normal mode commands.
+ highlight_init();
#if defined(HAVE_LOCALE_H)
// Setup to use the current locale (for ctype() and many other things).
@@ -216,21 +222,32 @@ void early_init(void)
#ifdef MAKE_LIB
int nvim_main(int argc, char **argv)
+#elif defined(WIN32)
+int wmain(int argc, wchar_t **argv_w) // multibyte args on Windows. #7060
#else
int main(int argc, char **argv)
#endif
{
- argv0 = (char *)path_tail((char_u *)argv[0]);
+#if defined(WIN32) && !defined(MAKE_LIB)
+ char **argv = xmalloc((size_t)argc * sizeof(char *));
+ for (int i = 0; i < argc; i++) {
+ char *buf = NULL;
+ utf16_to_utf8(argv_w[i], &buf);
+ assert(buf);
+ argv[i] = buf;
+ }
+#endif
+
+ argv0 = argv[0];
char_u *fname = NULL; // file name from command line
mparm_T params; // various parameters passed between
// main() and other functions.
- char_u *cwd = NULL; // current workding dir on startup
+ char_u *cwd = NULL; // current working dir on startup
time_init();
- /* Many variables are in "params" so that we can pass them to invoked
- * functions without a lot of arguments. "argc" and "argv" are also
- * copied, so that they can be changed. */
+ // Many variables are in `params` so that we can pass them around easily.
+ // `argc` and `argv` are also copied, so that they can be changed.
init_params(&params, argc, argv);
init_startuptime(&params);
@@ -240,19 +257,23 @@ int main(int argc, char **argv)
// Check if we have an interactive window.
check_and_set_isatty(&params);
- // Get the name with which Nvim was invoked, with and without path.
- set_vim_var_string(VV_PROGPATH, argv[0], -1);
- set_vim_var_string(VV_PROGNAME, (char *) path_tail((char_u *) argv[0]), -1);
-
event_init();
- /*
- * Process the command line arguments. File names are put in the global
- * argument list "global_alist".
- */
+ // Process the command line arguments. File names are put in the global
+ // argument list "global_alist".
command_line_scan(&params);
- if (GARGCOUNT > 0)
- fname = get_fname(&params);
+ if (embedded_mode) {
+ const char *err;
+ if (!channel_from_stdio(true, CALLBACK_READER_INIT, &err)) {
+ abort();
+ }
+ }
+
+ server_init(params.listen_addr);
+
+ if (GARGCOUNT > 0) {
+ fname = get_fname(&params, cwd);
+ }
TIME_MSG("expanding arguments");
@@ -262,57 +283,53 @@ int main(int argc, char **argv)
/* Don't redraw until much later. */
++RedrawingDisabled;
- /*
- * When listing swap file names, don't do cursor positioning et. al.
- */
- if (recoverymode && fname == NULL)
- params.want_full_screen = FALSE;
-
setbuf(stdout, NULL);
- /* This message comes before term inits, but after setting "silent_mode"
- * when the input is not a tty. */
- if (GARGCOUNT > 1 && !silent_mode)
- printf(_("%d files to edit\n"), GARGCOUNT);
+ full_screen = !silent_mode;
- full_screen = true;
- check_tty(&params);
-
- /*
- * Set the default values for the options that use Rows and Columns.
- */
+ // Set the default values for the options that use Rows and Columns.
win_init_size();
// Set the 'diff' option now, so that it can be checked for in a vimrc
// file. There is no buffer yet though.
- if (params.diff_mode)
- diff_win_options(firstwin, FALSE);
+ if (params.diff_mode) {
+ diff_win_options(firstwin, false);
+ }
assert(p_ch >= 0 && Rows >= p_ch && Rows - p_ch <= INT_MAX);
cmdline_row = (int)(Rows - p_ch);
msg_row = cmdline_row;
- screenalloc(false); /* allocate screen buffers */
- set_init_2();
+ screenalloc(false); // allocate screen buffers
+ set_init_2(headless_mode);
TIME_MSG("inits 2");
- msg_scroll = TRUE;
- no_wait_return = TRUE;
+ msg_scroll = true;
+ no_wait_return = true;
- init_highlight(TRUE, FALSE); /* set the default highlight groups */
+ init_highlight(true, false); // Default highlight groups.
TIME_MSG("init highlight");
- /* Set the break level after the terminal is initialized. */
+ // Set the break level after the terminal is initialized.
debug_break_level = params.use_debug_break_level;
- bool reading_input = !params.headless && (params.input_isatty
- || params.output_isatty || params.err_isatty);
-
- if (reading_input) {
+ //
+ // Read user-input if any TTY is connected.
+ // Read ex-commands if invoked with "-es".
+ //
+ bool reading_tty = !headless_mode
+ && !embedded_mode
+ && !silent_mode
+ && (params.input_isatty || params.output_isatty
+ || params.err_isatty);
+ bool reading_excmds = !params.input_isatty
+ && silent_mode
+ && exmode_active == EXMODE_NORMAL;
+ if (reading_tty || reading_excmds) {
// One of the startup commands (arguments, sourced scripts or plugins) may
// prompt the user, so start reading from a tty now.
- int fd = fileno(stdin);
- if (!params.input_isatty || params.edit_type == EDIT_STDIN) {
- // Use stderr or stdout since stdin is not a tty and/or could be used to
- // read the "-" file (eg: cat file | nvim -)
+ int fd = STDIN_FILENO;
+ if (!silent_mode
+ && (!params.input_isatty || params.edit_type == EDIT_STDIN)) {
+ // Use stderr or stdout since stdin is being used to read commands.
fd = params.err_isatty ? fileno(stderr) : fileno(stdout);
}
input_start(fd);
@@ -320,24 +337,50 @@ int main(int argc, char **argv)
// open terminals when opening files that start with term://
#define PROTO "term://"
+ do_cmdline_cmd("augroup nvim_terminal");
+ do_cmdline_cmd("autocmd!");
do_cmdline_cmd("autocmd BufReadCmd " PROTO "* nested "
- ":call termopen( "
+ ":if !exists('b:term_title')|call termopen( "
// Capture the command string
"matchstr(expand(\"<amatch>\"), "
"'\\c\\m" PROTO "\\%(.\\{-}//\\%(\\d\\+:\\)\\?\\)\\?\\zs.*'), "
// capture the working directory
"{'cwd': get(matchlist(expand(\"<amatch>\"), "
- "'\\c\\m" PROTO "\\(.\\{-}\\)//'), 1, '')})");
+ "'\\c\\m" PROTO "\\(.\\{-}\\)//'), 1, '')})"
+ "|endif");
+ do_cmdline_cmd("augroup END");
#undef PROTO
- /* Execute --cmd arguments. */
+ // Reset 'loadplugins' for "-u NONE" before "--cmd" arguments.
+ // Allows for setting 'loadplugins' there.
+ if (params.use_vimrc != NULL && strequal(params.use_vimrc, "NONE")) {
+ p_lpl = false;
+ }
+
+ // give embedders a chance to set up nvim, by processing a request before
+ // startup. This allows an external UI to show messages and prompts from
+ // --cmd and buffer loading (e.g. swap files)
+ bool early_ui = false;
+ if (embedded_mode && !headless_mode) {
+ TIME_MSG("waiting for embedder to make request");
+ remote_ui_wait_for_attach();
+ TIME_MSG("done waiting for embedder");
+
+ // prepare screen now, so external UIs can display messages
+ starting = NO_BUFFERS;
+ screenclear();
+ early_ui = true;
+ TIME_MSG("initialized screen early for embedder");
+ }
+
+ // Execute --cmd arguments.
exe_pre_commands(&params);
- /* Source startup scripts. */
+ // Source startup scripts.
source_startup_scripts(&params);
// If using the runtime (-u is not NONE), enable syntax & filetype plugins.
- if (params.use_vimrc == NULL || strcmp(params.use_vimrc, "NONE") != 0) {
+ if (params.use_vimrc == NULL || !strequal(params.use_vimrc, "NONE")) {
// Does ":filetype plugin indent on".
filetype_maybe_enable();
// Sources syntax/syntax.vim, which calls `:filetype on`.
@@ -363,17 +406,21 @@ int main(int argc, char **argv)
mch_exit(0);
}
- // Set a few option defaults after reading vimrc files:
- // 'title' and 'icon', Unix: 'shellpipe' and 'shellredir'.
+ // Set a few option defaults after reading vimrc files: 'title', 'icon',
+ // 'shellpipe', 'shellredir'.
set_init_3();
TIME_MSG("inits 3");
- /*
- * "-n" argument: Disable swap file by setting 'updatecount' to 0.
- * Note that this overrides anything from a vimrc file.
- */
- if (params.no_swap_file)
+ // "-n" argument: Disable swap file by setting 'updatecount' to 0.
+ // Note that this overrides anything from a vimrc file.
+ if (params.no_swap_file) {
p_uc = 0;
+ }
+
+ // XXX: Minimize 'updatetime' for -es/-Es. #7679
+ if (silent_mode) {
+ p_ut = 1;
+ }
if (curwin->w_p_rl && p_altkeymap) {
p_hkmap = FALSE; /* Reset the Hebrew keymap mode */
@@ -389,9 +436,10 @@ int main(int argc, char **argv)
shada_read_everything(NULL, false, true);
TIME_MSG("reading ShaDa");
}
- /* It's better to make v:oldfiles an empty list than NULL. */
- if (get_vim_var_list(VV_OLDFILES) == NULL)
- set_vim_var_list(VV_OLDFILES, list_alloc());
+ // It's better to make v:oldfiles an empty list than NULL.
+ if (get_vim_var_list(VV_OLDFILES) == NULL) {
+ set_vim_var_list(VV_OLDFILES, tv_list_alloc(0));
+ }
/*
* "-q errorfile": Load the error file now.
@@ -405,48 +453,48 @@ int main(int argc, char **argv)
* Clear screen now, so file message will not be cleared.
*/
starting = NO_BUFFERS;
- no_wait_return = FALSE;
- if (!exmode_active)
- msg_scroll = FALSE;
+ no_wait_return = false;
+ if (!exmode_active) {
+ msg_scroll = false;
+ }
- /*
- * If "-" argument given: Read file from stdin.
- * Do this before starting Raw mode, because it may change things that the
- * writing end of the pipe doesn't like, e.g., in case stdin and stderr
- * are the same terminal: "cat | vim -".
- * Using autocommands here may cause trouble...
- */
- if (params.edit_type == EDIT_STDIN && !recoverymode)
+ // Read file (text, not commands) from stdin if:
+ // - stdin is not a tty
+ // - and -e/-es was not given
+ //
+ // Do this before starting Raw mode, because it may change things that the
+ // writing end of the pipe doesn't like, e.g., in case stdin and stderr
+ // are the same terminal: "cat | vim -".
+ // Using autocommands here may cause trouble...
+ if (params.edit_type == EDIT_STDIN && !recoverymode) {
read_stdin();
+ }
-
- if (reading_input && (need_wait_return || msg_didany)) {
- // Since at this point there's no UI instance running yet, error messages
- // would have been printed to stdout. Before starting (which can result in
- // a alternate screen buffer being shown) we need confirmation that the
- // user has seen the messages and that is done with a call to wait_return.
+ if (reading_tty && (need_wait_return || msg_didany)) {
+ // Because there's no UI yet, error messages would have been printed to
+ // stdout. Before starting we need confirmation that the user has seen the
+ // messages and that is done with a call to wait_return.
TIME_MSG("waiting for return");
- wait_return(TRUE);
+ wait_return(true);
}
- if (!params.headless) {
- // Stop reading from input stream, the UI layer will take over now.
- input_stop();
+ if (!headless_mode && !embedded_mode && !silent_mode) {
+ input_stop(); // Stop reading input, let the UI take over.
ui_builtin_start();
}
setmouse(); // may start using the mouse
- ui_reset_scroll_region(); // In case Rows changed
- // Don't clear the screen when starting in Ex mode, unless using the GUI.
- if (exmode_active)
+ if (exmode_active || early_ui) {
+ // Don't clear the screen when starting in Ex mode, or when an
+ // embedding UI might have displayed messages
must_redraw = CLEAR;
- else {
- screenclear(); /* clear screen */
+ } else {
+ screenclear(); // clear screen
TIME_MSG("clearing screen");
}
- no_wait_return = TRUE;
+ no_wait_return = true;
/*
* Create the requested number of windows and edit buffers in them.
@@ -513,9 +561,16 @@ int main(int argc, char **argv)
if (p_im)
need_start_insertmode = TRUE;
- apply_autocmds(EVENT_VIMENTER, NULL, NULL, FALSE, curbuf);
+ set_vim_var_nr(VV_VIM_DID_ENTER, 1L);
+ apply_autocmds(EVENT_VIMENTER, NULL, NULL, false, curbuf);
TIME_MSG("VimEnter autocommands");
+ // Adjust default register name for "unnamed" in 'clipboard'. Can only be
+ // done after the clipboard is available and all initial commands that may
+ // modify the 'clipboard' setting have run; i.e. just before entering the
+ // main loop.
+ set_reg_var(get_default_register_name());
+
/* When a startup script or session file setup for diff'ing and
* scrollbind, sync the scrollbind now. */
if (curwin->w_p_diff && curwin->w_p_scb) {
@@ -535,18 +590,22 @@ int main(int argc, char **argv)
}
TIME_MSG("before starting main loop");
- ILOG("Starting Neovim main loop.");
+ ILOG("starting main loop");
/*
* Call the main command loop. This never returns.
*/
normal_enter(false, false);
+#if defined(WIN32) && !defined(MAKE_LIB)
+ xfree(argv);
+#endif
return 0;
}
-/* Exit properly */
+/// Exit properly
void getout(int exitval)
+ FUNC_ATTR_NORETURN
{
tabpage_T *tp, *next_tp;
@@ -558,6 +617,8 @@ void getout(int exitval)
if (exmode_active)
exitval += ex_exitval;
+ set_vim_var_nr(VV_EXITING, exitval);
+
/* Position the cursor on the last screen line, below all the text */
ui_cursor_goto((int)Rows - 1, 0);
@@ -575,11 +636,16 @@ void getout(int exitval)
}
buf_T *buf = wp->w_buffer;
- if (buf->b_changedtick != -1) {
+ if (buf_get_changedtick(buf) != -1) {
+ bufref_T bufref;
+
+ set_bufref(&bufref, buf);
apply_autocmds(EVENT_BUFWINLEAVE, buf->b_fname,
- buf->b_fname, FALSE, buf);
- buf->b_changedtick = -1; /* note that we did it already */
- /* start all over, autocommands may mess up the lists */
+ buf->b_fname, false, buf);
+ if (bufref_valid(&bufref)) {
+ buf_set_changedtick(buf, -1); // note that we did it already
+ }
+ // start all over, autocommands may mess up the lists
next_tp = first_tabpage;
break;
}
@@ -589,10 +655,13 @@ void getout(int exitval)
/* Trigger BufUnload for buffers that are loaded */
FOR_ALL_BUFFERS(buf) {
if (buf->b_ml.ml_mfp != NULL) {
- apply_autocmds(EVENT_BUFUNLOAD, buf->b_fname, buf->b_fname,
- FALSE, buf);
- if (!buf_valid(buf)) /* autocmd may delete the buffer */
+ bufref_T bufref;
+ set_bufref(&bufref, buf);
+ apply_autocmds(EVENT_BUFUNLOAD, buf->b_fname, buf->b_fname, false, buf);
+ if (!bufref_valid(&bufref)) {
+ // Autocmd deleted the buffer.
break;
+ }
}
}
apply_autocmds(EVENT_VIMLEAVEPRE, NULL, NULL, FALSE, curbuf);
@@ -618,12 +687,18 @@ void getout(int exitval)
/* Position the cursor again, the autocommands may have moved it */
ui_cursor_goto((int)Rows - 1, 0);
+ // Apply 'titleold'.
+ if (p_title && *p_titleold != NUL) {
+ ui_call_set_title(cstr_as_string((char *)p_titleold));
+ }
+
#if defined(USE_ICONV) && defined(DYNAMIC_ICONV)
iconv_end();
#endif
cs_end();
- if (garbage_collect_at_exit)
- garbage_collect();
+ if (garbage_collect_at_exit) {
+ garbage_collect(false);
+ }
mch_exit(exitval);
}
@@ -641,8 +716,9 @@ void getout(int exitval)
///
/// @return argument's numeric value otherwise
static int get_number_arg(const char *p, int *idx, int def)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
{
- if (ascii_isdigit(p[*idx])) {
+ if (ascii_isdigit(p[*idx])) { // -V522
def = atoi(&(p[*idx]));
while (ascii_isdigit(p[*idx])) {
*idx = *idx + 1;
@@ -652,9 +728,7 @@ static int get_number_arg(const char *p, int *idx, int def)
}
#if defined(HAVE_LOCALE_H)
-/*
- * Setup to use the current locale (for ctype() and many other things).
- */
+/// Setup to use the current locale (for ctype() and many other things).
static void init_locale(void)
{
setlocale(LC_ALL, "");
@@ -670,8 +744,8 @@ static void init_locale(void)
{
char_u *p;
- /* expand_env() doesn't work yet, because chartab[] is not initialized
- * yet, call vim_getenv() directly */
+ // expand_env() doesn't work yet, because g_chartab[] is not
+ // initialized yet, call vim_getenv() directly
p = (char_u *)vim_getenv("VIMRUNTIME");
if (p != NULL && *p != NUL) {
vim_snprintf((char *)NameBuff, MAXPATHL, "%s/lang", p);
@@ -685,63 +759,72 @@ static void init_locale(void)
}
#endif
+/// Decides whether text (as opposed to commands) will be read from stdin.
+/// @see EDIT_STDIN
+static bool edit_stdin(bool explicit, mparm_T *parmp)
+{
+ bool implicit = !headless_mode
+ && !embedded_mode
+ && exmode_active != EXMODE_NORMAL // -E/-Es but not -e/-es.
+ && !parmp->input_isatty
+ && scriptin[0] == NULL; // `-s -` was not given.
+ return explicit || implicit;
+}
-/*
- * Scan the command line arguments.
- */
+/// Scan the command line arguments.
static void command_line_scan(mparm_T *parmp)
{
int argc = parmp->argc;
- char **argv = parmp->argv;
- int argv_idx; /* index in argv[n][] */
- int had_minmin = FALSE; /* found "--" argument */
- int want_argument; /* option argument with argument */
+ char **argv = parmp->argv;
+ int argv_idx; // index in argv[n][]
+ bool had_stdin_file = false; // found explicit "-" argument
+ bool had_minmin = false; // found "--" argument
+ int want_argument; // option argument with argument
int c;
- char_u *p = NULL;
long n;
- --argc;
- ++argv;
- argv_idx = 1; /* active option letter is argv[0][argv_idx] */
+ argc--;
+ argv++;
+ argv_idx = 1; // active option letter is argv[0][argv_idx]
while (argc > 0) {
- /*
- * "+" or "+{number}" or "+/{pat}" or "+{command}" argument.
- */
+ // "+" or "+{number}" or "+/{pat}" or "+{command}" argument.
if (argv[0][0] == '+' && !had_minmin) {
- if (parmp->n_commands >= MAX_ARG_CMDS)
+ if (parmp->n_commands >= MAX_ARG_CMDS) {
mainerr(err_extra_cmd, NULL);
- argv_idx = -1; /* skip to next argument */
- if (argv[0][1] == NUL)
+ }
+ argv_idx = -1; // skip to next argument
+ if (argv[0][1] == NUL) {
parmp->commands[parmp->n_commands++] = "$";
- else
+ } else {
parmp->commands[parmp->n_commands++] = &(argv[0][1]);
- }
- /*
- * Optional argument.
- */
- else if (argv[0][0] == '-' && !had_minmin) {
- want_argument = FALSE;
+ }
+
+ // Optional argument.
+ } else if (argv[0][0] == '-' && !had_minmin) {
+ want_argument = false;
c = argv[0][argv_idx++];
switch (c) {
- case NUL: /* "vim -" read from stdin */
+ case NUL: { // "nvim -" read from stdin
if (exmode_active) {
- // "ex -" silent mode
- silent_mode = TRUE;
+ // "nvim -e -" silent mode
+ silent_mode = true;
} else {
- if (parmp->edit_type != EDIT_NONE) {
+ if (parmp->edit_type != EDIT_NONE
+ && parmp->edit_type != EDIT_FILE
+ && parmp->edit_type != EDIT_STDIN) {
mainerr(err_too_many_args, argv[0]);
}
+ had_stdin_file = true;
parmp->edit_type = EDIT_STDIN;
}
- argv_idx = -1; /* skip to next argument */
+ argv_idx = -1; // skip to next argument
break;
-
- case '-': /* "--" don't take any more option arguments */
- /* "--help" give help message */
- /* "--version" give version message */
- /* "--literal" take files literally */
- /* "--noplugin[s]" skip plugins */
- /* "--cmd <cmd>" execute cmd before vimrc */
+ }
+ case '-': { // "--" don't take any more option arguments
+ // "--help" give help message
+ // "--version" give version message
+ // "--noplugin[s]" skip plugins
+ // "--cmd <cmd>" execute cmd before vimrc
if (STRICMP(argv[0] + argv_idx, "help") == 0) {
usage();
mch_exit(0);
@@ -749,337 +832,376 @@ static void command_line_scan(mparm_T *parmp)
version();
mch_exit(0);
} else if (STRICMP(argv[0] + argv_idx, "api-info") == 0) {
- msgpack_sbuffer* b = msgpack_sbuffer_new();
- msgpack_packer* p = msgpack_packer_new(b, msgpack_sbuffer_write);
- Object md = DICTIONARY_OBJ(api_metadata());
- msgpack_rpc_from_object(md, p);
+ FileDescriptor fp;
+ const int fof_ret = file_open_fd(&fp, STDOUT_FILENO,
+ kFileWriteOnly);
+ msgpack_packer *p = msgpack_packer_new(&fp, msgpack_file_write);
- for (size_t i = 0; i < b->size; i++) {
- putchar(b->data[i]);
+ if (fof_ret != 0) {
+ emsgf(_("E5421: Failed to open stdin: %s"), os_strerror(fof_ret));
}
+ if (p == NULL) {
+ EMSG(_(e_outofmem));
+ }
+
+ Object md = DICTIONARY_OBJ(api_metadata());
+ msgpack_rpc_from_object(md, p);
+
msgpack_packer_free(p);
+ const int ff_ret = file_flush(&fp);
+ if (ff_ret < 0) {
+ msgpack_file_write_error(ff_ret);
+ }
mch_exit(0);
} else if (STRICMP(argv[0] + argv_idx, "headless") == 0) {
- parmp->headless = true;
+ headless_mode = true;
} else if (STRICMP(argv[0] + argv_idx, "embed") == 0) {
embedded_mode = true;
- parmp->headless = true;
- channel_from_stdio();
+ } else if (STRNICMP(argv[0] + argv_idx, "listen", 6) == 0) {
+ want_argument = true;
+ argv_idx += 6;
} else if (STRNICMP(argv[0] + argv_idx, "literal", 7) == 0) {
-#if !defined(UNIX)
- parmp->literal = TRUE;
-#endif
- } else if (STRNICMP(argv[0] + argv_idx, "noplugin", 8) == 0)
- p_lpl = FALSE;
- else if (STRNICMP(argv[0] + argv_idx, "cmd", 3) == 0) {
- want_argument = TRUE;
+ // Do nothing: file args are always literal. #7679
+ } else if (STRNICMP(argv[0] + argv_idx, "noplugin", 8) == 0) {
+ p_lpl = false;
+ } else if (STRNICMP(argv[0] + argv_idx, "cmd", 3) == 0) {
+ want_argument = true;
argv_idx += 3;
} else if (STRNICMP(argv[0] + argv_idx, "startuptime", 11) == 0) {
- want_argument = TRUE;
+ want_argument = true;
argv_idx += 11;
} else {
if (argv[0][argv_idx])
mainerr(err_opt_unknown, argv[0]);
- had_minmin = TRUE;
+ had_minmin = true;
+ }
+ if (!want_argument) {
+ argv_idx = -1; // skip to next argument
}
- if (!want_argument)
- argv_idx = -1; /* skip to next argument */
break;
-
- case 'A': /* "-A" start in Arabic mode */
- set_option_value((char_u *)"arabic", 1L, NULL, 0);
+ }
+ case 'A': { // "-A" start in Arabic mode.
+ set_option_value("arabic", 1L, NULL, 0);
break;
-
- case 'b': /* "-b" binary mode */
- /* Needs to be effective before expanding file names, because
- * for Win32 this makes us edit a shortcut file itself,
- * instead of the file it links to. */
+ }
+ case 'b': { // "-b" binary mode.
+ // Needs to be effective before expanding file names, because
+ // for Win32 this makes us edit a shortcut file itself,
+ // instead of the file it links to.
set_options_bin(curbuf->b_p_bin, 1, 0);
- curbuf->b_p_bin = 1; /* binary file I/O */
+ curbuf->b_p_bin = 1; // Binary file I/O.
break;
+ }
- case 'e': /* "-e" Ex mode */
+ case 'D': { // "-D" Debugging
+ parmp->use_debug_break_level = 9999;
+ break;
+ }
+ case 'd': { // "-d" 'diff'
+ parmp->diff_mode = true;
+ break;
+ }
+ case 'e': { // "-e" Ex mode
exmode_active = EXMODE_NORMAL;
break;
-
- case 'E': /* "-E" Improved Ex mode */
+ }
+ case 'E': { // "-E" Ex mode
exmode_active = EXMODE_VIM;
break;
-
- case 'f': /* "-f" GUI: run in foreground. */
- break;
-
- case 'g': /* "-g" start GUI */
- main_start_gui();
+ }
+ case 'f': { // "-f" GUI: run in foreground.
break;
-
- case 'F': /* "-F" start in Farsi mode: rl + fkmap set */
- p_fkmap = TRUE;
- set_option_value((char_u *)"rl", 1L, NULL, 0);
+ }
+ case 'F': { // "-F" start in Farsi mode: rl + fkmap set.
+ p_fkmap = true;
+ set_option_value("rl", 1L, NULL, 0);
break;
-
- case 'h': /* "-h" give help message */
+ }
+ case '?': // "-?" give help message (for MS-Windows)
+ case 'h': { // "-h" give help message
usage();
mch_exit(0);
-
- case 'H': /* "-H" start in Hebrew mode: rl + hkmap set */
- p_hkmap = TRUE;
- set_option_value((char_u *)"rl", 1L, NULL, 0);
+ }
+ case 'H': { // "-H" start in Hebrew mode: rl + hkmap set.
+ p_hkmap = true;
+ set_option_value("rl", 1L, NULL, 0);
break;
-
- case 'l': /* "-l" lisp mode, 'lisp' and 'showmatch' on */
- set_option_value((char_u *)"lisp", 1L, NULL, 0);
- p_sm = TRUE;
+ }
+ case 'l': { // "-l" lisp mode, 'lisp' and 'showmatch' on.
+ set_option_value("lisp", 1L, NULL, 0);
+ p_sm = true;
break;
-
- case 'M': /* "-M" no changes or writing of files */
+ }
+ case 'M': { // "-M" no changes or writing of files
reset_modifiable();
- /* FALLTHROUGH */
-
- case 'm': /* "-m" no writing of files */
- p_write = FALSE;
+ FALLTHROUGH;
+ }
+ case 'm': { // "-m" no writing of files
+ p_write = false;
break;
+ }
- case 'N': /* "-N" Nocompatible */
- /* No-op */
+ case 'N': // "-N" Nocompatible
+ case 'X': // "-X" Do not connect to X server
+ // No-op
break;
- case 'n': /* "-n" no swap file */
- parmp->no_swap_file = TRUE;
+ case 'n': { // "-n" no swap file
+ parmp->no_swap_file = true;
break;
-
- case 'p': /* "-p[N]" open N tab pages */
-#ifdef TARGET_API_MAC_OSX
- /* For some reason on MacOS X, an argument like:
- -psn_0_10223617 is passed in when invoke from Finder
- or with the 'open' command */
- if (argv[0][argv_idx] == 's') {
- argv_idx = -1; /* bypass full -psn */
- main_start_gui();
- break;
- }
-#endif
- /* default is 0: open window for each file */
+ }
+ case 'p': { // "-p[N]" open N tab pages
+ // default is 0: open window for each file
parmp->window_count = get_number_arg(argv[0], &argv_idx, 0);
parmp->window_layout = WIN_TABS;
break;
-
- case 'o': /* "-o[N]" open N horizontal split windows */
- /* default is 0: open window for each file */
+ }
+ case 'o': { // "-o[N]" open N horizontal split windows
+ // default is 0: open window for each file
parmp->window_count = get_number_arg(argv[0], &argv_idx, 0);
parmp->window_layout = WIN_HOR;
break;
-
- case 'O': /* "-O[N]" open N vertical split windows */
- /* default is 0: open window for each file */
+ }
+ case 'O': { // "-O[N]" open N vertical split windows
+ // default is 0: open window for each file
parmp->window_count = get_number_arg(argv[0], &argv_idx, 0);
parmp->window_layout = WIN_VER;
break;
-
- case 'q': /* "-q" QuickFix mode */
- if (parmp->edit_type != EDIT_NONE)
+ }
+ case 'q': { // "-q" QuickFix mode
+ if (parmp->edit_type != EDIT_NONE) {
mainerr(err_too_many_args, argv[0]);
+ }
parmp->edit_type = EDIT_QF;
- if (argv[0][argv_idx]) { /* "-q{errorfile}" */
+ if (argv[0][argv_idx]) { // "-q{errorfile}"
parmp->use_ef = (char_u *)argv[0] + argv_idx;
argv_idx = -1;
- } else if (argc > 1) /* "-q {errorfile}" */
- want_argument = TRUE;
+ } else if (argc > 1) { // "-q {errorfile}"
+ want_argument = true;
+ }
break;
-
- case 'R': /* "-R" readonly mode */
- readonlymode = TRUE;
- curbuf->b_p_ro = TRUE;
- p_uc = 10000; /* don't update very often */
+ }
+ case 'R': { // "-R" readonly mode
+ readonlymode = true;
+ curbuf->b_p_ro = true;
+ p_uc = 10000; // don't update very often
break;
-
- case 'r': /* "-r" recovery mode */
- case 'L': /* "-L" recovery mode */
+ }
+ case 'r': // "-r" recovery mode
+ case 'L': { // "-L" recovery mode
recoverymode = 1;
break;
-
- case 's':
- if (exmode_active) /* "-s" silent (batch) mode */
- silent_mode = TRUE;
- else /* "-s {scriptin}" read from script file */
- want_argument = TRUE;
+ }
+ case 's': {
+ if (exmode_active) { // "-es" silent (batch) Ex-mode
+ silent_mode = true;
+ } else { // "-s {scriptin}" read from script file
+ want_argument = true;
+ }
break;
-
- case 't': /* "-t {tag}" or "-t{tag}" jump to tag */
- if (parmp->edit_type != EDIT_NONE)
+ }
+ case 't': { // "-t {tag}" or "-t{tag}" jump to tag
+ if (parmp->edit_type != EDIT_NONE) {
mainerr(err_too_many_args, argv[0]);
+ }
parmp->edit_type = EDIT_TAG;
- if (argv[0][argv_idx]) { /* "-t{tag}" */
+ if (argv[0][argv_idx]) { // "-t{tag}"
parmp->tagname = (char_u *)argv[0] + argv_idx;
argv_idx = -1;
- } else /* "-t {tag}" */
- want_argument = TRUE;
- break;
-
- case 'D': /* "-D" Debugging */
- parmp->use_debug_break_level = 9999;
- break;
- case 'd': /* "-d" 'diff' */
- parmp->diff_mode = TRUE;
+ } else { // "-t {tag}"
+ want_argument = true;
+ }
break;
- case 'v':
+ }
+ case 'v': {
version();
mch_exit(0);
- case 'V': /* "-V{N}" Verbose level */
- /* default is 10: a little bit verbose */
+ }
+ case 'V': { // "-V{N}" Verbose level
+ // default is 10: a little bit verbose
p_verbose = get_number_arg(argv[0], &argv_idx, 10);
if (argv[0][argv_idx] != NUL) {
- set_option_value((char_u *)"verbosefile", 0L,
- (char_u *)argv[0] + argv_idx, 0);
+ set_option_value("verbosefile", 0L, argv[0] + argv_idx, 0);
argv_idx = (int)STRLEN(argv[0]);
}
break;
-
- case 'w': /* "-w{number}" set window height */
- /* "-w {scriptout}" write to script */
+ }
+ case 'w': { // "-w{number}" set window height
+ // "-w {scriptout}" write to script
if (ascii_isdigit(((char_u *)argv[0])[argv_idx])) {
n = get_number_arg(argv[0], &argv_idx, 10);
- set_option_value((char_u *)"window", n, NULL, 0);
+ set_option_value("window", n, NULL, 0);
break;
}
- want_argument = TRUE;
+ want_argument = true;
break;
-
- case 'Z': /* "-Z" restricted mode */
- restricted = TRUE;
+ }
+ case 'Z': { // "-Z" restricted mode
+ restricted = true;
break;
+ }
- case 'c': /* "-c{command}" or "-c {command}" execute
- command */
+ case 'c': { // "-c{command}" or "-c {command}" exec command
if (argv[0][argv_idx] != NUL) {
- if (parmp->n_commands >= MAX_ARG_CMDS)
+ if (parmp->n_commands >= MAX_ARG_CMDS) {
mainerr(err_extra_cmd, NULL);
- parmp->commands[parmp->n_commands++] = argv[0]
- + argv_idx;
+ }
+ parmp->commands[parmp->n_commands++] = argv[0] + argv_idx;
argv_idx = -1;
break;
}
- /*FALLTHROUGH*/
- case 'S': /* "-S {file}" execute Vim script */
- case 'i': /* "-i {shada}" use for ShaDa file */
- case 'u': /* "-u {vimrc}" vim inits file */
- case 'U': /* "-U {gvimrc}" gvim inits file */
- case 'W': /* "-W {scriptout}" overwrite */
- want_argument = TRUE;
+ FALLTHROUGH;
+ }
+ case 'S': // "-S {file}" execute Vim script
+ case 'i': // "-i {shada}" use for ShaDa file
+ case 'u': // "-u {vimrc}" vim inits file
+ case 'U': // "-U {gvimrc}" gvim inits file
+ case 'W': { // "-W {scriptout}" overwrite
+ want_argument = true;
break;
+ }
- default:
+ default: {
mainerr(err_opt_unknown, argv[0]);
+ }
}
- /*
- * Handle option arguments with argument.
- */
+ // Handle option arguments with argument.
if (want_argument) {
- /*
- * Check for garbage immediately after the option letter.
- */
- if (argv[0][argv_idx] != NUL)
+ // Check for garbage immediately after the option letter.
+ if (argv[0][argv_idx] != NUL) {
mainerr(err_opt_garbage, argv[0]);
+ }
- --argc;
- if (argc < 1 && c != 'S') /* -S has an optional argument */
+ argc--;
+ if (argc < 1 && c != 'S') { // -S has an optional argument
mainerr(err_arg_missing, argv[0]);
- ++argv;
+ }
+ argv++;
argv_idx = -1;
switch (c) {
- case 'c': /* "-c {command}" execute command */
- case 'S': /* "-S {file}" execute Vim script */
- if (parmp->n_commands >= MAX_ARG_CMDS)
+ case 'c': // "-c {command}" execute command
+ case 'S': { // "-S {file}" execute Vim script
+ if (parmp->n_commands >= MAX_ARG_CMDS) {
mainerr(err_extra_cmd, NULL);
+ }
if (c == 'S') {
- char *a;
+ char *a;
- if (argc < 1)
- /* "-S" without argument: use default session file
- * name. */
+ if (argc < 1) {
+ // "-S" without argument: use default session file name.
a = SESSION_FILE;
- else if (argv[0][0] == '-') {
- /* "-S" followed by another option: use default
- * session file name. */
+ } else if (argv[0][0] == '-') {
+ // "-S" followed by another option: use default session file.
a = SESSION_FILE;
++argc;
--argv;
} else {
a = argv[0];
}
- char *s = xmalloc(STRLEN(a) + 4);
- sprintf(s, "so %s", a);
- parmp->cmds_tofree[parmp->n_commands] = TRUE;
+ size_t s_size = STRLEN(a) + 4;
+ char *s = xmalloc(s_size);
+ snprintf(s, s_size, "so %s", a);
+ parmp->cmds_tofree[parmp->n_commands] = true;
parmp->commands[parmp->n_commands++] = s;
} else {
parmp->commands[parmp->n_commands++] = argv[0];
}
break;
+ }
- case '-':
- if (argv[-1][2] == 'c') {
- /* "--cmd {command}" execute command */
- if (parmp->n_pre_commands >= MAX_ARG_CMDS)
+ case '-': {
+ if (strequal(argv[-1], "--cmd")) {
+ // "--cmd {command}" execute command
+ if (parmp->n_pre_commands >= MAX_ARG_CMDS) {
mainerr(err_extra_cmd, NULL);
+ }
parmp->pre_commands[parmp->n_pre_commands++] = argv[0];
+ } else if (strequal(argv[-1], "--listen")) {
+ // "--listen {address}"
+ parmp->listen_addr = argv[0];
}
- /* "--startuptime <file>" already handled */
+ // "--startuptime <file>" already handled
break;
+ }
- case 'q': /* "-q {errorfile}" QuickFix mode */
+ case 'q': { // "-q {errorfile}" QuickFix mode
parmp->use_ef = (char_u *)argv[0];
break;
+ }
- case 'i': /* "-i {shada}" use for shada */
+ case 'i': { // "-i {shada}" use for shada
used_shada_file = argv[0];
break;
+ }
- case 's': /* "-s {scriptin}" read from script file */
+ case 's': { // "-s {scriptin}" read from script file
if (scriptin[0] != NULL) {
scripterror:
- mch_errmsg(_("Attempt to open script file again: \""));
- mch_errmsg(argv[-1]);
- mch_errmsg(" ");
- mch_errmsg(argv[0]);
- mch_errmsg("\"\n");
+ vim_snprintf((char *)IObuff, IOSIZE,
+ _("Attempt to open script file again: \"%s %s\"\n"),
+ argv[-1], argv[0]);
+ mch_errmsg((const char *)IObuff);
mch_exit(2);
}
- if ((scriptin[0] = mch_fopen(argv[0], READBIN)) == NULL) {
- mch_errmsg(_("Cannot open for reading: \""));
- mch_errmsg(argv[0]);
- mch_errmsg("\"\n");
+ int error;
+ if (strequal(argv[0], "-")) {
+ const int stdin_dup_fd = os_dup(STDIN_FILENO);
+#ifdef WIN32
+ // Replace the original stdin with the console input handle.
+ close(STDIN_FILENO);
+ const HANDLE conin_handle =
+ CreateFile("CONIN$", GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES)NULL,
+ OPEN_EXISTING, 0, (HANDLE)NULL);
+ const int conin_fd = _open_osfhandle(conin_handle, _O_RDONLY);
+ assert(conin_fd == STDIN_FILENO);
+#endif
+ FileDescriptor *const stdin_dup = file_open_fd_new(
+ &error, stdin_dup_fd, kFileReadOnly|kFileNonBlocking);
+ assert(stdin_dup != NULL);
+ scriptin[0] = stdin_dup;
+ } else if ((scriptin[0] = file_open_new(
+ &error, argv[0], kFileReadOnly|kFileNonBlocking, 0)) == NULL) {
+ vim_snprintf((char *)IObuff, IOSIZE,
+ _("Cannot open for reading: \"%s\": %s\n"),
+ argv[0], os_strerror(error));
+ mch_errmsg((const char *)IObuff);
mch_exit(2);
}
save_typebuf();
break;
+ }
- case 't': /* "-t {tag}" */
+ case 't': { // "-t {tag}"
parmp->tagname = (char_u *)argv[0];
break;
-
- case 'u': /* "-u {vimrc}" vim inits file */
+ }
+ case 'u': { // "-u {vimrc}" vim inits file
parmp->use_vimrc = argv[0];
break;
-
- case 'U': /* "-U {gvimrc}" gvim inits file */
+ }
+ case 'U': { // "-U {gvimrc}" gvim inits file
break;
+ }
- case 'w': /* "-w {nr}" 'window' value */
- /* "-w {scriptout}" append to script file */
+ case 'w': { // "-w {nr}" 'window' value
+ // "-w {scriptout}" append to script file
if (ascii_isdigit(*((char_u *)argv[0]))) {
argv_idx = 0;
n = get_number_arg(argv[0], &argv_idx, 10);
- set_option_value((char_u *)"window", n, NULL, 0);
+ set_option_value("window", n, NULL, 0);
argv_idx = -1;
break;
}
- /*FALLTHROUGH*/
- case 'W': /* "-W {scriptout}" overwrite script file */
- if (scriptout != NULL)
+ FALLTHROUGH;
+ }
+ case 'W': { // "-W {scriptout}" overwrite script file
+ if (scriptout != NULL) {
goto scripterror;
+ }
if ((scriptout = mch_fopen(argv[0],
c == 'w' ? APPENDBIN : WRITEBIN)) == NULL) {
mch_errmsg(_("Cannot open for script output: \""));
@@ -1088,30 +1210,28 @@ scripterror:
mch_exit(2);
}
break;
-
+ }
}
}
- }
- /*
- * File name argument.
- */
- else {
- argv_idx = -1; /* skip to next argument */
-
- /* Check for only one type of editing. */
- if (parmp->edit_type != EDIT_NONE && parmp->edit_type != EDIT_FILE)
+ } else { // File name argument.
+ argv_idx = -1; // skip to next argument
+
+ // Check for only one type of editing.
+ if (parmp->edit_type != EDIT_NONE
+ && parmp->edit_type != EDIT_FILE
+ && parmp->edit_type != EDIT_STDIN) {
mainerr(err_too_many_args, argv[0]);
+ }
parmp->edit_type = EDIT_FILE;
- /* Add the file to the global argument list. */
+ // Add the file to the global argument list.
ga_grow(&global_alist.al_ga, 1);
- p = vim_strsave((char_u *)argv[0]);
+ char_u *p = vim_strsave((char_u *)argv[0]);
if (parmp->diff_mode && os_isdir(p) && GARGCOUNT > 0
&& !os_isdir(alist_name(&GARGLIST[0]))) {
- char_u *r;
-
- r = (char_u *)concat_fnames((char *)p, (char *)path_tail(alist_name(&GARGLIST[0])), TRUE);
+ char_u *r = (char_u *)concat_fnames((char *)p,
+ (char *)path_tail(alist_name(&GARGLIST[0])), true);
xfree(p);
p = r;
}
@@ -1121,30 +1241,22 @@ scripterror:
path_fix_case(p);
#endif
- alist_add(&global_alist, p,
-#if !defined(UNIX)
- parmp->literal ? 2 : 0 /* add buffer nr after exp. */
-#else
- 2 /* add buffer number now and use curbuf */
-#endif
- );
-
+ int alist_fnum_flag = edit_stdin(had_stdin_file, parmp)
+ ? 1 // add buffer nr after exp.
+ : 2; // add buffer number now and use curbuf
+ alist_add(&global_alist, p, alist_fnum_flag);
}
- /*
- * If there are no more letters after the current "-", go to next
- * argument. argv_idx is set to -1 when the current argument is to be
- * skipped.
- */
+ // If there are no more letters after the current "-", go to next argument.
+ // argv_idx is set to -1 when the current argument is to be skipped.
if (argv_idx <= 0 || argv[0][argv_idx] == NUL) {
- --argc;
- ++argv;
+ argc--;
+ argv++;
argv_idx = 1;
}
}
- /* If there is a "+123" or "-c" command, set v:swapcommand to the first
- * one. */
+ // If there is a "+123" or "-c" command, set v:swapcommand to the first one.
if (parmp->n_commands > 0) {
const size_t swcmd_len = STRLEN(parmp->commands[0]) + 3;
char *const swcmd = xmalloc(swcmd_len);
@@ -1152,6 +1264,12 @@ scripterror:
set_vim_var_string(VV_SWAPCOMMAND, swcmd, -1);
xfree(swcmd);
}
+
+ // Handle "foo | nvim". EDIT_FILE may be overwritten now. #6299
+ if (edit_stdin(had_stdin_file, parmp)) {
+ parmp->edit_type = EDIT_STDIN;
+ }
+
TIME_MSG("parsing arguments");
}
@@ -1164,15 +1282,12 @@ static void init_params(mparm_T *paramp, int argc, char **argv)
memset(paramp, 0, sizeof(*paramp));
paramp->argc = argc;
paramp->argv = argv;
- paramp->headless = false;
- paramp->want_full_screen = true;
paramp->use_debug_break_level = -1;
paramp->window_count = -1;
+ paramp->listen_addr = NULL;
}
-/*
- * Initialize global startuptime file if "--startuptime" passed as an argument.
- */
+/// Initialize global startuptime file if "--startuptime" passed as an argument.
static void init_startuptime(mparm_T *paramp)
{
for (int i = 1; i < paramp->argc; i++) {
@@ -1188,36 +1303,46 @@ static void init_startuptime(mparm_T *paramp)
static void check_and_set_isatty(mparm_T *paramp)
{
- paramp->input_isatty = os_isatty(fileno(stdin));
- paramp->output_isatty = os_isatty(fileno(stdout));
- paramp->err_isatty = os_isatty(fileno(stderr));
+ stdin_isatty
+ = paramp->input_isatty = os_isatty(STDIN_FILENO);
+ stdout_isatty
+ = paramp->output_isatty = os_isatty(STDOUT_FILENO);
+ paramp->err_isatty = os_isatty(STDERR_FILENO);
+#ifndef WIN32
+ int tty_fd = paramp->input_isatty
+ ? STDIN_FILENO
+ : (paramp->output_isatty
+ ? STDOUT_FILENO
+ : (paramp->err_isatty ? STDERR_FILENO : -1));
+ pty_process_save_termios(tty_fd);
+#endif
TIME_MSG("window checked");
}
-/*
- * Get filename from command line, given that there is one.
- */
-static char_u *get_fname(mparm_T *parmp)
+
+// Sets v:progname and v:progpath. Also modifies $PATH on Windows.
+static void init_path(const char *exename)
+ FUNC_ATTR_NONNULL_ALL
{
-#if !defined(UNIX)
- /*
- * Expand wildcards in file names.
- */
- if (!parmp->literal) {
- cwd = xmalloc(MAXPATHL);
- if (cwd != NULL) {
- os_dirname(cwd, MAXPATHL);
- }
- // Temporarily add '(' and ')' to 'isfname'. These are valid
- // filename characters but are excluded from 'isfname' to make
- // "gf" work on a file name in parenthesis (e.g.: see vim.h).
- do_cmdline_cmd(":set isf+=(,)");
- alist_expand(NULL, 0);
- do_cmdline_cmd(":set isf&");
- if (cwd != NULL) {
- os_chdir((char *)cwd);
- }
+ char exepath[MAXPATHL] = { 0 };
+ size_t exepathlen = MAXPATHL;
+ // Make v:progpath absolute.
+ if (os_exepath(exepath, &exepathlen) != 0) {
+ // Fall back to argv[0]. Missing procfs? #6734
+ path_guess_exepath(exename, exepath, sizeof(exepath));
}
+ set_vim_var_string(VV_PROGPATH, exepath, -1);
+ set_vim_var_string(VV_PROGNAME, (char *)path_tail((char_u *)exename), -1);
+
+#ifdef WIN32
+ // Append the process start directory to $PATH, so that ":!foo" finds tools
+ // shipped with Windows package. This also mimics SearchPath().
+ os_setenv_append_path(exepath);
#endif
+}
+
+/// Get filename from command line, if any.
+static char_u *get_fname(mparm_T *parmp, char_u *cwd)
+{
return alist_name(&GARGLIST[0]);
}
@@ -1241,11 +1366,33 @@ static void set_window_layout(mparm_T *paramp)
static void load_plugins(void)
{
if (p_lpl) {
- source_runtime((char_u *)"plugin/**/*.vim", DIP_ALL); // NOLINT
+ char_u *rtp_copy = NULL;
+
+ // First add all package directories to 'runtimepath', so that their
+ // autoload directories can be found. Only if not done already with a
+ // :packloadall command.
+ // Make a copy of 'runtimepath', so that source_runtime does not use the
+ // pack directories.
+ if (!did_source_packages) {
+ rtp_copy = vim_strsave(p_rtp);
+ add_pack_start_dirs();
+ }
+
+ source_in_path(rtp_copy == NULL ? p_rtp : rtp_copy,
+ (char_u *)"plugin/**/*.vim", // NOLINT
+ DIP_ALL | DIP_NOAFTER);
TIME_MSG("loading plugins");
+ xfree(rtp_copy);
- ex_packloadall(NULL);
+ // Only source "start" packages if not done already with a :packloadall
+ // command.
+ if (!did_source_packages) {
+ load_start_packages();
+ }
TIME_MSG("loading packages");
+
+ source_runtime((char_u *)"plugin/**/*.vim", DIP_ALL | DIP_AFTER);
+ TIME_MSG("loading after plugins");
}
}
@@ -1260,8 +1407,8 @@ static void handle_quickfix(mparm_T *paramp)
set_string_option_direct((char_u *)"ef", -1,
paramp->use_ef, OPT_FREE, SID_CARG);
vim_snprintf((char *)IObuff, IOSIZE, "cfile %s", p_ef);
- if (qf_init(NULL, p_ef, p_efm, TRUE, IObuff) < 0) {
- ui_putc('\n');
+ if (qf_init(NULL, p_ef, p_efm, true, IObuff, p_menc) < 0) {
+ msg_putchar('\n');
mch_exit(3);
}
TIME_MSG("reading errorfile");
@@ -1287,55 +1434,23 @@ static void handle_tag(char_u *tagname)
}
}
-// Print a warning if stdout is not a terminal.
-// When starting in Ex mode and commands come from a file, set Silent mode.
-static void check_tty(mparm_T *parmp)
-{
- if (parmp->headless) {
- return;
- }
-
- // is active input a terminal?
- if (exmode_active) {
- if (!parmp->input_isatty) {
- silent_mode = true;
- }
- } else if (parmp->want_full_screen && (!parmp->err_isatty
- && (!parmp->output_isatty || !parmp->input_isatty))) {
-
- if (!parmp->output_isatty) {
- mch_errmsg(_("Vim: Warning: Output is not to a terminal\n"));
- }
-
- if (!parmp->input_isatty) {
- mch_errmsg(_("Vim: Warning: Input is not from a terminal\n"));
- }
-
- ui_flush();
-
- if (scriptin[0] == NULL) {
- os_delay(2000L, true);
- }
-
- TIME_MSG("Warning delay");
- }
-}
-
-/*
- * Read text from stdin.
- */
+/// Read text from stdin.
static void read_stdin(void)
{
- int i;
-
- /* When getting the ATTENTION prompt here, use a dialog */
+ // When getting the ATTENTION prompt here, use a dialog.
swap_exists_action = SEA_DIALOG;
- no_wait_return = TRUE;
- i = msg_didany;
- set_buflisted(TRUE);
- (void)open_buffer(TRUE, NULL, 0); /* create memfile and read file */
- no_wait_return = FALSE;
- msg_didany = i;
+ no_wait_return = true;
+ int save_msg_didany = msg_didany;
+ set_buflisted(true);
+ (void)open_buffer(true, NULL, 0); // create memfile and read file
+ if (BUFEMPTY() && curbuf->b_next != NULL) {
+ // stdin was empty, go to buffer 2 (e.g. "echo file1 | xargs nvim"). #8561
+ do_cmdline_cmd("silent! bnext");
+ // Delete the empty stdin buffer.
+ do_cmdline_cmd("bwipeout 1");
+ }
+ no_wait_return = false;
+ msg_didany = save_msg_didany;
TIME_MSG("reading stdin");
check_swap_exists_action();
}
@@ -1454,7 +1569,7 @@ static void edit_buffers(mparm_T *parmp, char_u *cwd)
{
int arg_idx; /* index in argument list */
int i;
- int advance = TRUE;
+ bool advance = true;
win_T *win;
/*
@@ -1465,8 +1580,8 @@ static void edit_buffers(mparm_T *parmp, char_u *cwd)
/* When w_arg_idx is -1 remove the window (see create_windows()). */
if (curwin->w_arg_idx == -1) {
- win_close(curwin, TRUE);
- advance = FALSE;
+ win_close(curwin, true);
+ advance = false;
}
arg_idx = 1;
@@ -1476,9 +1591,9 @@ static void edit_buffers(mparm_T *parmp, char_u *cwd)
}
// When w_arg_idx is -1 remove the window (see create_windows()).
if (curwin->w_arg_idx == -1) {
- ++arg_idx;
- win_close(curwin, TRUE);
- advance = FALSE;
+ arg_idx++;
+ win_close(curwin, true);
+ advance = false;
continue;
}
@@ -1493,7 +1608,7 @@ static void edit_buffers(mparm_T *parmp, char_u *cwd)
win_enter(curwin->w_next, false);
}
}
- advance = TRUE;
+ advance = true;
// Only open the file if there is no file in this window yet (that can
// happen when vimrc contains ":sall").
@@ -1512,12 +1627,13 @@ static void edit_buffers(mparm_T *parmp, char_u *cwd)
did_emsg = FALSE; /* avoid hit-enter prompt */
getout(1);
}
- win_close(curwin, TRUE);
- advance = FALSE;
+ win_close(curwin, true);
+ advance = false;
}
- if (arg_idx == GARGCOUNT - 1)
- arg_had_last = TRUE;
- ++arg_idx;
+ if (arg_idx == GARGCOUNT - 1) {
+ arg_had_last = true;
+ }
+ arg_idx++;
}
os_breakcheck();
if (got_int) {
@@ -1605,6 +1721,48 @@ static void exe_commands(mparm_T *parmp)
TIME_MSG("executing command arguments");
}
+/// Source system-wide vimrc if built with one defined
+///
+/// Does one of the following things, stops after whichever succeeds:
+///
+/// 1. Source system vimrc file from $XDG_CONFIG_DIRS/nvim/sysinit.vim
+/// 2. Source system vimrc file from $VIM
+static void do_system_initialization(void)
+{
+ char *const config_dirs = stdpaths_get_xdg_var(kXDGConfigDirs);
+ if (config_dirs != NULL) {
+ const void *iter = NULL;
+ const char path_tail[] = {
+ 'n', 'v', 'i', 'm', PATHSEP,
+ 's', 'y', 's', 'i', 'n', 'i', 't', '.', 'v', 'i', 'm', NUL
+ };
+ do {
+ const char *dir;
+ size_t dir_len;
+ iter = vim_env_iter(':', config_dirs, iter, &dir, &dir_len);
+ if (dir == NULL || dir_len == 0) {
+ break;
+ }
+ char *vimrc = xmalloc(dir_len + sizeof(path_tail) + 1);
+ memcpy(vimrc, dir, dir_len);
+ vimrc[dir_len] = PATHSEP;
+ memcpy(vimrc + dir_len + 1, path_tail, sizeof(path_tail));
+ if (do_source((char_u *)vimrc, false, DOSO_NONE) != FAIL) {
+ xfree(vimrc);
+ xfree(config_dirs);
+ return;
+ }
+ xfree(vimrc);
+ } while (iter != NULL);
+ xfree(config_dirs);
+ }
+
+#ifdef SYS_VIMRC_FILE
+ // Get system wide defaults, if the file name is defined.
+ (void)do_source((char_u *)SYS_VIMRC_FILE, false, DOSO_NONE);
+#endif
+}
+
/// Source vimrc or do other user initialization
///
/// Does one of the following things, stops after whichever succeeds:
@@ -1620,7 +1778,7 @@ static bool do_user_initialization(void)
FUNC_ATTR_WARN_UNUSED_RESULT
{
bool do_exrc = p_exrc;
- if (process_env("VIMINIT", true) == OK) {
+ if (process_env("VIMINIT") == OK) {
do_exrc = p_exrc;
return do_exrc;
}
@@ -1641,7 +1799,7 @@ static bool do_user_initialization(void)
do {
const char *dir;
size_t dir_len;
- iter = vim_colon_env_iter(config_dirs, iter, &dir, &dir_len);
+ iter = vim_env_iter(':', config_dirs, iter, &dir, &dir_len);
if (dir == NULL || dir_len == 0) {
break;
}
@@ -1665,7 +1823,7 @@ static bool do_user_initialization(void)
} while (iter != NULL);
xfree(config_dirs);
}
- if (process_env("EXINIT", false) == OK) {
+ if (process_env("EXINIT") == OK) {
do_exrc = p_exrc;
return do_exrc;
}
@@ -1676,22 +1834,18 @@ static bool do_user_initialization(void)
static void source_startup_scripts(const mparm_T *const parmp)
FUNC_ATTR_NONNULL_ALL
{
- // If -u argument given, use only the initializations from that file and
- // nothing else.
+ // If -u given, use only the initializations from that file and nothing else.
if (parmp->use_vimrc != NULL) {
- if (strcmp(parmp->use_vimrc, "NONE") == 0
- || strcmp(parmp->use_vimrc, "NORC") == 0) {
- if (parmp->use_vimrc[2] == 'N')
- p_lpl = false; // don't load plugins either
+ if (strequal(parmp->use_vimrc, "NONE")
+ || strequal(parmp->use_vimrc, "NORC")) {
+ // Do nothing.
} else {
- if (do_source((char_u *)parmp->use_vimrc, FALSE, DOSO_NONE) != OK)
+ if (do_source((char_u *)parmp->use_vimrc, false, DOSO_NONE) != OK) {
EMSG2(_("E282: Cannot read from \"%s\""), parmp->use_vimrc);
+ }
}
} else if (!silent_mode) {
-#ifdef SYS_VIMRC_FILE
- // Get system wide defaults, if the file name is defined.
- (void) do_source((char_u *)SYS_VIMRC_FILE, false, DOSO_NONE);
-#endif
+ do_system_initialization();
if (do_user_initialization()) {
// Read initialization commands from ".vimrc" or ".exrc" in current
@@ -1724,35 +1878,20 @@ static void source_startup_scripts(const mparm_T *const parmp)
}
secure = 0;
}
- did_source_startup_scripts = true;
TIME_MSG("sourcing vimrc file(s)");
}
-/*
- * Setup to start using the GUI. Exit with an error when not available.
- */
-static void main_start_gui(void)
-{
- mch_errmsg(_(e_nogvim));
- mch_errmsg("\n");
- mch_exit(2);
-}
-
-
/// Get an environment variable, and execute it as Ex commands.
///
/// @param env environment variable to execute
-/// @param is_viminit when true, called for VIMINIT
///
/// @return FAIL if the environment variable was not executed,
/// OK otherwise.
-static int process_env(char *env, bool is_viminit)
+static int process_env(char *env)
+ FUNC_ATTR_NONNULL_ALL
{
const char *initstr = os_getenv(env);
if (initstr != NULL) {
- if (is_viminit) {
- vimrc_found(NULL, NULL);
- }
char_u *save_sourcing_name = sourcing_name;
linenr_T save_sourcing_lnum = sourcing_lnum;
sourcing_name = (char_u *)env;
@@ -1762,7 +1901,7 @@ static int process_env(char *env, bool is_viminit)
do_cmdline_cmd((char *)initstr);
sourcing_name = save_sourcing_name;
sourcing_lnum = save_sourcing_lnum;
- current_SID = save_sid;;
+ current_SID = save_sid;
return OK;
}
return FAIL;
@@ -1774,6 +1913,7 @@ static int process_env(char *env, bool is_viminit)
/// os_fileinfo_link() respectively for extra security.
static bool file_owned(const char *fname)
{
+ assert(fname != NULL);
uid_t uid = getuid();
FileInfo file_info;
bool file_owned = os_fileinfo(fname, &file_info)
@@ -1792,9 +1932,11 @@ static bool file_owned(const char *fname)
/// @param str string to append to the primary error message, or NULL
static void mainerr(const char *errstr, const char *str)
{
+ char *prgname = (char *)path_tail((char_u *)argv0);
+
signal_stop(); // kill us with CTRL-C here, if you like
- mch_errmsg(argv0);
+ mch_errmsg(prgname);
mch_errmsg(": ");
mch_errmsg(_(errstr));
if (str != NULL) {
@@ -1803,7 +1945,7 @@ static void mainerr(const char *errstr, const char *str)
mch_errmsg("\"");
}
mch_errmsg(_("\nMore info with \""));
- mch_errmsg(argv0);
+ mch_errmsg(prgname);
mch_errmsg(" -h\"\n");
mch_exit(1);
@@ -1824,54 +1966,44 @@ static void usage(void)
signal_stop(); // kill us with CTRL-C here, if you like
mch_msg(_("Usage:\n"));
- mch_msg(_(" nvim [arguments] [file ...] Edit specified file(s)\n"));
- mch_msg(_(" nvim [arguments] - Read text from stdin\n"));
- mch_msg(_(" nvim [arguments] -t <tag> Edit file where tag is defined\n"));
- mch_msg(_(" nvim [arguments] -q [errorfile] Edit file with first error\n"));
- mch_msg(_("\nArguments:\n"));
+ mch_msg(_(" nvim [options] [file ...] Edit file(s)\n"));
+ mch_msg(_(" nvim [options] -t <tag> Edit file where tag is defined\n"));
+ mch_msg(_(" nvim [options] -q [errorfile] Edit file with first error\n"));
+ mch_msg(_("\nOptions:\n"));
mch_msg(_(" -- Only file names after this\n"));
-#if !defined(UNIX)
- mch_msg(_(" --literal Don't expand wildcards\n"));
-#endif
- mch_msg(_(" -e Ex mode\n"));
- mch_msg(_(" -E Improved Ex mode\n"));
- mch_msg(_(" -s Silent (batch) mode (only for ex mode)\n"));
+ mch_msg(_(" + Start at end of file\n"));
+ mch_msg(_(" --cmd <cmd> Execute <cmd> before any config\n"));
+ mch_msg(_(" +<cmd>, -c <cmd> Execute <cmd> after config and first file\n"));
+ mch_msg("\n");
+ mch_msg(_(" -b Binary mode\n"));
mch_msg(_(" -d Diff mode\n"));
- mch_msg(_(" -R Read-only mode\n"));
- mch_msg(_(" -Z Restricted mode\n"));
+ mch_msg(_(" -e, -E Ex mode\n"));
+ mch_msg(_(" -es, -Es Silent (batch) mode\n"));
+ mch_msg(_(" -h, --help Print this help message\n"));
+ mch_msg(_(" -i <shada> Use this shada file\n"));
mch_msg(_(" -m Modifications (writing files) not allowed\n"));
mch_msg(_(" -M Modifications in text not allowed\n"));
- mch_msg(_(" -b Binary mode\n"));
- mch_msg(_(" -l Lisp mode\n"));
- mch_msg(_(" -A Arabic mode\n"));
- mch_msg(_(" -F Farsi mode\n"));
- mch_msg(_(" -H Hebrew mode\n"));
- mch_msg(_(" -V[N][file] Be verbose [level N][log messages to file]\n"));
- mch_msg(_(" -D Debugging mode\n"));
mch_msg(_(" -n No swap file, use memory only\n"));
- mch_msg(_(" -r, -L List swap files and exit\n"));
- mch_msg(_(" -r <file> Recover crashed session\n"));
- mch_msg(_(" -u <vimrc> Use <vimrc> instead of the default\n"));
- mch_msg(_(" -i <shada> Use <shada> instead of the default\n"));
- mch_msg(_(" --noplugin Don't load plugin scripts\n"));
- mch_msg(_(" -o[N] Open N windows (default: one for each file)\n"));
- mch_msg(_(" -O[N] Like -o but split vertically\n"));
- mch_msg(_(" -p[N] Open N tab pages (default: one for each file)\n"));
- mch_msg(_(" + Start at end of file\n"));
- mch_msg(_(" +<linenum> Start at line <linenum>\n"));
- mch_msg(_(" +/<pattern> Start at first occurrence of <pattern>\n"));
- mch_msg(_(" --cmd <command> Execute <command> before loading any vimrc\n"));
- mch_msg(_(" -c <command> Execute <command> after loading the first file\n"));
+ mch_msg(_(" -o[N] Open N windows (default: one per file)\n"));
+ mch_msg(_(" -O[N] Open N vertical windows (default: one per file)\n"));
+ mch_msg(_(" -p[N] Open N tab pages (default: one per file)\n"));
+ mch_msg(_(" -r, -L List swap files\n"));
+ mch_msg(_(" -r <file> Recover edit state for this file\n"));
+ mch_msg(_(" -R Read-only mode\n"));
mch_msg(_(" -S <session> Source <session> after loading the first file\n"));
mch_msg(_(" -s <scriptin> Read Normal mode commands from <scriptin>\n"));
- mch_msg(_(" -w <scriptout> Append all typed characters to <scriptout>\n"));
- mch_msg(_(" -W <scriptout> Write all typed characters to <scriptout>\n"));
- mch_msg(_(" --startuptime <file> Write startup timing messages to <file>\n"));
- mch_msg(_(" --api-info Dump API metadata serialized to msgpack and exit\n"));
+ mch_msg(_(" -u <config> Use this config file\n"));
+ mch_msg(_(" -v, --version Print version information\n"));
+ mch_msg(_(" -V[N][file] Verbose [level][file]\n"));
+ mch_msg(_(" -Z Restricted mode\n"));
+ mch_msg("\n");
+ mch_msg(_(" --api-info Write msgpack-encoded API metadata to stdout\n"));
mch_msg(_(" --embed Use stdin/stdout as a msgpack-rpc channel\n"));
mch_msg(_(" --headless Don't start a user interface\n"));
- mch_msg(_(" -v, --version Print version information and exit\n"));
- mch_msg(_(" -h, --help Print this help message and exit\n"));
+ mch_msg(_(" --listen <address> Serve RPC API from this address\n"));
+ mch_msg(_(" --noplugin Don't load plugins\n"));
+ mch_msg(_(" --startuptime <file> Write startup timing messages to <file>\n"));
+ mch_msg(_("\nSee \":help startup-options\" for all options.\n"));
}
diff --git a/src/nvim/map.c b/src/nvim/map.c
index 03439e7a9c..53ab734802 100644
--- a/src/nvim/map.c
+++ b/src/nvim/map.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
@@ -6,7 +9,7 @@
#include "nvim/map_defs.h"
#include "nvim/vim.h"
#include "nvim/memory.h"
-#include "nvim/msgpack_rpc/defs.h"
+#include "nvim/api/private/dispatch.h"
#include "nvim/lib/khash.h"
@@ -20,6 +23,8 @@
#define int_eq kh_int_hash_equal
#define linenr_T_hash kh_int_hash_func
#define linenr_T_eq kh_int_hash_equal
+#define handle_T_hash kh_int_hash_func
+#define handle_T_eq kh_int_hash_equal
#if defined(ARCH_64)
@@ -129,16 +134,36 @@ static inline khint_t String_hash(String s)
static inline bool String_eq(String a, String b)
{
- return strncmp(a.data, b.data, MIN(a.size, b.size)) == 0;
+ if (a.size != b.size) {
+ return false;
+ }
+ return memcmp(a.data, b.data, a.size) == 0;
+}
+
+static inline khint_t HlEntry_hash(HlEntry ae)
+{
+ const uint8_t *data = (const uint8_t *)&ae;
+ khint_t h = 0;
+ for (size_t i = 0; i < sizeof(ae); i++) {
+ h = (h << 5) - h + data[i];
+ }
+ return h;
+}
+
+static inline bool HlEntry_eq(HlEntry ae1, HlEntry ae2)
+{
+ return memcmp(&ae1, &ae2, sizeof(ae1)) == 0;
}
+
MAP_IMPL(int, int, DEFAULT_INITIALIZER)
-MAP_IMPL(cstr_t, uint64_t, DEFAULT_INITIALIZER)
MAP_IMPL(cstr_t, ptr_t, DEFAULT_INITIALIZER)
MAP_IMPL(ptr_t, ptr_t, DEFAULT_INITIALIZER)
MAP_IMPL(uint64_t, ptr_t, DEFAULT_INITIALIZER)
-#define MSGPACK_HANDLER_INITIALIZER {.fn = NULL, .async = false}
+MAP_IMPL(handle_T, ptr_t, DEFAULT_INITIALIZER)
+#define MSGPACK_HANDLER_INITIALIZER { .fn = NULL, .async = false }
MAP_IMPL(String, MsgpackRpcRequestHandler, MSGPACK_HANDLER_INITIALIZER)
#define KVEC_INITIALIZER { .size = 0, .capacity = 0, .items = NULL }
-MAP_IMPL(linenr_T, bufhl_vec_T, KVEC_INITIALIZER)
+MAP_IMPL(HlEntry, int, DEFAULT_INITIALIZER)
+MAP_IMPL(String, handle_T, 0)
diff --git a/src/nvim/map.h b/src/nvim/map.h
index c7d9894bd1..0e4308b953 100644
--- a/src/nvim/map.h
+++ b/src/nvim/map.h
@@ -5,8 +5,14 @@
#include "nvim/map_defs.h"
#include "nvim/api/private/defs.h"
-#include "nvim/msgpack_rpc/defs.h"
+#include "nvim/api/private/dispatch.h"
#include "nvim/bufhl_defs.h"
+#include "nvim/highlight_defs.h"
+
+#if defined(__NetBSD__)
+# undef uint64_t
+# define uint64_t uint64_t
+#endif
#define MAP_DECLS(T, U) \
KHASH_DECLARE(T##_##U##_map, T, U) \
@@ -25,12 +31,13 @@
void map_##T##_##U##_clear(Map(T, U) *map);
MAP_DECLS(int, int)
-MAP_DECLS(cstr_t, uint64_t)
MAP_DECLS(cstr_t, ptr_t)
MAP_DECLS(ptr_t, ptr_t)
MAP_DECLS(uint64_t, ptr_t)
+MAP_DECLS(handle_T, ptr_t)
MAP_DECLS(String, MsgpackRpcRequestHandler)
-MAP_DECLS(linenr_T, bufhl_vec_T)
+MAP_DECLS(HlEntry, int)
+MAP_DECLS(String, handle_T)
#define map_new(T, U) map_##T##_##U##_new
#define map_free(T, U) map_##T##_##U##_free
diff --git a/src/nvim/mark.c b/src/nvim/mark.c
index fe802e48ba..05f78c76bc 100644
--- a/src/nvim/mark.c
+++ b/src/nvim/mark.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* mark.c: functions for setting marks and jumping to them
*/
@@ -21,7 +24,6 @@
#include "nvim/memline.h"
#include "nvim/memory.h"
#include "nvim/message.h"
-#include "nvim/misc2.h"
#include "nvim/normal.h"
#include "nvim/option.h"
#include "nvim/path.h"
@@ -63,7 +65,7 @@ int setmark(int c)
/// Free fmark_T item
void free_fmark(fmark_T fm)
{
- dict_unref(fm.additional_data);
+ tv_dict_unref(fm.additional_data);
}
/// Free xfmark_T item
@@ -104,44 +106,52 @@ int setmark_pos(int c, pos_T *pos, int fnum)
return OK;
}
+ // Can't set a mark in a non-existant buffer.
+ buf_T *buf = buflist_findnr(fnum);
+ if (buf == NULL) {
+ return FAIL;
+ }
+
if (c == '"') {
- RESET_FMARK(&curbuf->b_last_cursor, *pos, curbuf->b_fnum);
+ RESET_FMARK(&buf->b_last_cursor, *pos, buf->b_fnum);
return OK;
}
/* Allow setting '[ and '] for an autocommand that simulates reading a
* file. */
if (c == '[') {
- curbuf->b_op_start = *pos;
+ buf->b_op_start = *pos;
return OK;
}
if (c == ']') {
- curbuf->b_op_end = *pos;
+ buf->b_op_end = *pos;
return OK;
}
if (c == '<' || c == '>') {
- if (c == '<')
- curbuf->b_visual.vi_start = *pos;
- else
- curbuf->b_visual.vi_end = *pos;
- if (curbuf->b_visual.vi_mode == NUL)
- /* Visual_mode has not yet been set, use a sane default. */
- curbuf->b_visual.vi_mode = 'v';
+ if (c == '<') {
+ buf->b_visual.vi_start = *pos;
+ } else {
+ buf->b_visual.vi_end = *pos;
+ }
+ if (buf->b_visual.vi_mode == NUL) {
+ // Visual_mode has not yet been set, use a sane default.
+ buf->b_visual.vi_mode = 'v';
+ }
return OK;
}
- if (c > 'z') /* some islower() and isupper() cannot handle
- characters above 127 */
- return FAIL;
- if (islower(c)) {
+ if (ASCII_ISLOWER(c)) {
i = c - 'a';
- RESET_FMARK(curbuf->b_namedm + i, *pos, curbuf->b_fnum);
+ RESET_FMARK(buf->b_namedm + i, *pos, fnum);
return OK;
}
- if (isupper(c)) {
- assert(c >= 'A' && c <= 'Z');
- i = c - 'A';
+ if (ASCII_ISUPPER(c) || ascii_isdigit(c)) {
+ if (ascii_isdigit(c)) {
+ i = c - '0' + NMARKS;
+ } else {
+ i = c - 'A';
+ }
RESET_XFMARK(namedfm + i, *pos, fnum, NULL);
return OK;
}
@@ -163,6 +173,10 @@ void setpcmark(void)
curwin->w_prev_pcmark = curwin->w_pcmark;
curwin->w_pcmark = curwin->w_cursor;
+ if (curwin->w_pcmark.lnum == 0) {
+ curwin->w_pcmark.lnum = 1;
+ }
+
/* If jumplist is full: remove oldest entry */
if (++curwin->w_jumplistlen > JUMPLISTSIZE) {
curwin->w_jumplistlen = JUMPLISTSIZE;
@@ -346,13 +360,14 @@ pos_T *getmark_buf_fnum(buf_T *buf, int c, int changefile, int *fnum)
} else if (c == '<' || c == '>') { /* start/end of visual area */
startp = &buf->b_visual.vi_start;
endp = &buf->b_visual.vi_end;
- if ((c == '<') == lt(*startp, *endp))
+ if (((c == '<') == lt(*startp, *endp) || endp->lnum == 0)
+ && startp->lnum != 0) {
posp = startp;
- else
+ } else {
posp = endp;
- /*
- * For Visual line mode, set mark at begin or end of line
- */
+ }
+
+ // For Visual line mode, set mark at begin or end of line
if (buf->b_visual.vi_mode == 'V') {
pos_copy = *posp;
posp = &pos_copy;
@@ -474,7 +489,7 @@ static void fname2fnum(xfmark_T *fm)
os_dirname(IObuff, IOSIZE);
p = path_shorten_fname(NameBuff, IObuff);
- /* buflist_new() will call fmarks_check_names() */
+ // buflist_new() will call fmarks_check_names()
(void)buflist_new(NameBuff, p, (linenr_T)1, 0);
}
}
@@ -584,11 +599,12 @@ static char_u *mark_line(pos_T *mp, int lead_len)
if (mp->lnum == 0 || mp->lnum > curbuf->b_ml.ml_line_count)
return vim_strsave((char_u *)"-invalid-");
assert(Columns >= 0 && (size_t)Columns <= SIZE_MAX);
- s = vim_strnsave(skipwhite(ml_get(mp->lnum)), (size_t)Columns);
+ // Allow for up to 5 bytes per character.
+ s = vim_strnsave(skipwhite(ml_get(mp->lnum)), (size_t)Columns * 5);
- /* Truncate the line to fit it in the window */
+ // Truncate the line to fit it in the window
len = 0;
- for (p = s; *p != NUL; mb_ptr_adv(p)) {
+ for (p = s; *p != NUL; MB_PTR_ADV(p)) {
len += ptr2cells(p);
if (len >= Columns - lead_len)
break;
@@ -635,8 +651,8 @@ void do_marks(exarg_T *eap)
show_one_mark(-1, arg, NULL, NULL, false);
}
-static void
-show_one_mark (
+static void
+show_one_mark(
int c,
char_u *arg,
pos_T *p,
@@ -675,9 +691,10 @@ show_one_mark (
mustfree = TRUE;
}
if (name != NULL) {
- msg_outtrans_attr(name, current ? hl_attr(HLF_D) : 0);
- if (mustfree)
+ msg_outtrans_attr(name, current ? HL_ATTR(HLF_D) : 0);
+ if (mustfree) {
xfree(name);
+ }
}
}
ui_flush(); /* show one line at a time */
@@ -788,8 +805,8 @@ void ex_jumps(exarg_T *eap)
curwin->w_jumplist[i].fmark.mark.col);
msg_outtrans(IObuff);
msg_outtrans_attr(name,
- curwin->w_jumplist[i].fmark.fnum == curbuf->b_fnum
- ? hl_attr(HLF_D) : 0);
+ curwin->w_jumplist[i].fmark.fnum == curbuf->b_fnum
+ ? HL_ATTR(HLF_D) : 0);
xfree(name);
os_breakcheck();
}
@@ -799,6 +816,13 @@ void ex_jumps(exarg_T *eap)
MSG_PUTS("\n>");
}
+void ex_clearjumps(exarg_T *eap)
+{
+ free_jumplist(curwin);
+ curwin->w_jumplistlen = 0;
+ curwin->w_jumplistidx = 0;
+}
+
/*
* print the changelist
*/
@@ -807,7 +831,7 @@ void ex_changes(exarg_T *eap)
int i;
char_u *name;
- /* Highlight title */
+ // Highlight title
MSG_PUTS_TITLE(_("\nchange line col text"));
for (i = 0; i < curbuf->b_changelistlen && !got_int; ++i) {
@@ -823,7 +847,7 @@ void ex_changes(exarg_T *eap)
curbuf->b_changelist[i].mark.col);
msg_outtrans(IObuff);
name = mark_line(&curbuf->b_changelist[i].mark, 17);
- msg_outtrans_attr(name, hl_attr(HLF_D));
+ msg_outtrans_attr(name, HL_ATTR(HLF_D));
xfree(name);
os_breakcheck();
}
@@ -873,7 +897,29 @@ void ex_changes(exarg_T *eap)
* Example: Insert two lines below 55: mark_adjust(56, MAXLNUM, 2, 0);
* or: mark_adjust(56, 55, MAXLNUM, 2);
*/
-void mark_adjust(linenr_T line1, linenr_T line2, long amount, long amount_after)
+void mark_adjust(linenr_T line1,
+ linenr_T line2,
+ long amount,
+ long amount_after,
+ bool end_temp)
+{
+ mark_adjust_internal(line1, line2, amount, amount_after, true, end_temp);
+}
+
+// mark_adjust_nofold() does the same as mark_adjust() but without adjusting
+// folds in any way. Folds must be adjusted manually by the caller.
+// This is only useful when folds need to be moved in a way different to
+// calling foldMarkAdjust() with arguments line1, line2, amount, amount_after,
+// for an example of why this may be necessary, see do_move().
+void mark_adjust_nofold(linenr_T line1, linenr_T line2, long amount,
+ long amount_after, bool end_temp)
+{
+ mark_adjust_internal(line1, line2, amount, amount_after, false, end_temp);
+}
+
+static void mark_adjust_internal(linenr_T line1, linenr_T line2,
+ long amount, long amount_after,
+ bool adjust_folds, bool end_temp)
{
int i;
int fnum = curbuf->b_fnum;
@@ -914,15 +960,21 @@ void mark_adjust(linenr_T line1, linenr_T line2, long amount, long amount_after)
one_adjust_nodel(&(curbuf->b_visual.vi_start.lnum));
one_adjust_nodel(&(curbuf->b_visual.vi_end.lnum));
- /* quickfix marks */
- qf_mark_adjust(NULL, line1, line2, amount, amount_after);
- /* location lists */
+ // quickfix marks
+ if (!qf_mark_adjust(NULL, line1, line2, amount, amount_after)) {
+ curbuf->b_has_qf_entry &= ~BUF_HAS_QF_ENTRY;
+ }
+ // location lists
+ bool found_one = false;
FOR_ALL_TAB_WINDOWS(tab, win) {
- qf_mark_adjust(win, line1, line2, amount, amount_after);
+ found_one |= qf_mark_adjust(win, line1, line2, amount, amount_after);
+ }
+ if (!found_one) {
+ curbuf->b_has_qf_entry &= ~BUF_HAS_LL_ENTRY;
}
sign_mark_adjust(line1, line2, amount, amount_after);
- bufhl_mark_adjust(curbuf, line1, line2, amount, amount_after);
+ bufhl_mark_adjust(curbuf, line1, line2, amount, amount_after, end_temp);
}
/* previous context mark */
@@ -999,8 +1051,9 @@ void mark_adjust(linenr_T line1, linenr_T line2, long amount, long amount_after)
}
}
- /* adjust folds */
- foldMarkAdjust(win, line1, line2, amount, amount_after);
+ if (adjust_folds) {
+ foldMarkAdjust(win, line1, line2, amount, amount_after);
+ }
}
}
@@ -1401,3 +1454,30 @@ void free_all_marks(void)
memset(&namedfm[0], 0, sizeof(namedfm));
}
#endif
+
+/// Adjust position to point to the first byte of a multi-byte character
+///
+/// If it points to a tail byte it is move backwards to the head byte.
+///
+/// @param[in] buf Buffer to adjust position in.
+/// @param[out] lp Position to adjust.
+void mark_mb_adjustpos(buf_T *buf, pos_T *lp)
+ FUNC_ATTR_NONNULL_ALL
+{
+ if (lp->col > 0 || lp->coladd > 1) {
+ const char_u *const p = ml_get_buf(buf, lp->lnum, false);
+ if (*p == NUL || (int)STRLEN(p) < lp->col) {
+ lp->col = 0;
+ } else {
+ lp->col -= utf_head_off(p, p + lp->col);
+ }
+ // Reset "coladd" when the cursor would be on the right half of a
+ // double-wide character.
+ if (lp->coladd == 1
+ && p[lp->col] != TAB
+ && vim_isprintc(utf_ptr2char(p + lp->col))
+ && ptr2cells(p + lp->col) > 1) {
+ lp->coladd = 0;
+ }
+ }
+}
diff --git a/src/nvim/mark.h b/src/nvim/mark.h
index aff6e7273a..ed4e47907b 100644
--- a/src/nvim/mark.h
+++ b/src/nvim/mark.h
@@ -4,10 +4,12 @@
#include "nvim/macros.h"
#include "nvim/ascii.h"
#include "nvim/buffer_defs.h"
+#include "nvim/func_attr.h"
#include "nvim/mark_defs.h"
#include "nvim/memory.h"
#include "nvim/pos.h"
#include "nvim/os/time.h"
+#include "nvim/ex_cmds_defs.h" // for exarg_T
/// Set fmark using given value
#define SET_FMARK(fmarkp_, mark_, fnum_) \
@@ -29,7 +31,7 @@
/// Clear given fmark
#define CLEAR_FMARK(fmarkp_) \
- RESET_FMARK(fmarkp_, ((pos_T) {0, 0, 0}), 0)
+ RESET_FMARK(fmarkp_, ((pos_T) { 0, 0, 0 }), 0)
/// Set given extended mark (regular mark + file name)
#define SET_XFMARK(xfmarkp_, mark_, fnum_, fname_) \
@@ -74,6 +76,46 @@ static inline int mark_local_index(const char name)
: -1))));
}
+static inline bool lt(pos_T, pos_T) REAL_FATTR_CONST REAL_FATTR_ALWAYS_INLINE;
+static inline bool equalpos(pos_T, pos_T)
+ REAL_FATTR_CONST REAL_FATTR_ALWAYS_INLINE;
+static inline bool ltoreq(pos_T, pos_T)
+ REAL_FATTR_CONST REAL_FATTR_ALWAYS_INLINE;
+static inline void clearpos(pos_T *)
+ REAL_FATTR_ALWAYS_INLINE;
+
+/// Return true if position a is before (less than) position b.
+static inline bool lt(pos_T a, pos_T b)
+{
+ if (a.lnum != b.lnum) {
+ return a.lnum < b.lnum;
+ } else if (a.col != b.col) {
+ return a.col < b.col;
+ } else {
+ return a.coladd < b.coladd;
+ }
+}
+
+/// Return true if position a and b are equal.
+static inline bool equalpos(pos_T a, pos_T b)
+{
+ return (a.lnum == b.lnum) && (a.col == b.col) && (a.coladd == b.coladd);
+}
+
+/// Return true if position a is less than or equal to b.
+static inline bool ltoreq(pos_T a, pos_T b)
+{
+ return lt(a, b) || equalpos(a, b);
+}
+
+/// Clear the pos_T structure pointed to by a.
+static inline void clearpos(pos_T *a)
+{
+ a->lnum = 0;
+ a->col = 0;
+ a->coladd = 0;
+}
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "mark.h.generated.h"
#endif
diff --git a/src/nvim/mark_defs.h b/src/nvim/mark_defs.h
index 720b2475ed..2cb489501e 100644
--- a/src/nvim/mark_defs.h
+++ b/src/nvim/mark_defs.h
@@ -3,7 +3,7 @@
#include "nvim/pos.h"
#include "nvim/os/time.h"
-#include "nvim/eval_defs.h"
+#include "nvim/eval/typval.h"
/*
* marks: positions in a file
diff --git a/src/nvim/mbyte.c b/src/nvim/mbyte.c
index 0ba9f8b076..ead6b4405d 100644
--- a/src/nvim/mbyte.c
+++ b/src/nvim/mbyte.c
@@ -1,68 +1,30 @@
-/*
- * mbyte.c: Code specifically for handling multi-byte characters.
- * Multibyte extensions partly by Sung-Hoon Baek
- *
- * The encoding used in the core is set with 'encoding'. When 'encoding' is
- * changed, the following four variables are set (for speed).
- * Currently these types of character encodings are supported:
- *
- * "enc_dbcs" When non-zero it tells the type of double byte character
- * encoding (Chinese, Korean, Japanese, etc.).
- * The cell width on the display is equal to the number of
- * bytes. (exception: DBCS_JPNU with first byte 0x8e)
- * Recognizing the first or second byte is difficult, it
- * requires checking a byte sequence from the start.
- * "enc_utf8" When TRUE use Unicode characters in UTF-8 encoding.
- * The cell width on the display needs to be determined from
- * the character value.
- * Recognizing bytes is easy: 0xxx.xxxx is a single-byte
- * char, 10xx.xxxx is a trailing byte, 11xx.xxxx is a leading
- * byte of a multi-byte character.
- * To make things complicated, up to six composing characters
- * are allowed. These are drawn on top of the first char.
- * For most editing the sequence of bytes with composing
- * characters included is considered to be one character.
- * "enc_unicode" When 2 use 16-bit Unicode characters (or UTF-16).
- * When 4 use 32-but Unicode characters.
- * Internally characters are stored in UTF-8 encoding to
- * avoid NUL bytes. Conversion happens when doing I/O.
- * "enc_utf8" will also be TRUE.
- *
- * "has_mbyte" is set when "enc_dbcs" or "enc_utf8" is non-zero.
- *
- * If none of these is TRUE, 8-bit bytes are used for a character. The
- * encoding isn't currently specified (TODO).
- *
- * 'encoding' specifies the encoding used in the core. This is in registers,
- * text manipulation, buffers, etc. Conversion has to be done when characters
- * in another encoding are received or send:
- *
- * clipboard
- * ^
- * | (2)
- * V
- * +---------------+
- * (1) | | (3)
- * keyboard ----->| core |-----> display
- * | |
- * +---------------+
- * ^
- * | (4)
- * V
- * file
- *
- * (1) Typed characters arrive in the current locale.
- * (2) Text will be made available with the encoding specified with
- * 'encoding'. If this is not sufficient, system-specific conversion
- * might be required.
- * (3) For the GUI the correct font must be selected, no conversion done.
- * (4) The encoding of the file is specified with 'fileencoding'. Conversion
- * is to be done when it's different from 'encoding'.
- *
- * The ShaDa file is a special case: Only text is converted, not file names.
- * Vim scripts may contain an ":encoding" command. This has an effect for
- * some commands, like ":menutrans"
- */
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+/// mbyte.c: Code specifically for handling multi-byte characters.
+/// Multibyte extensions partly by Sung-Hoon Baek
+///
+/// The encoding used in nvim is always UTF-8. "enc_utf8" and "has_mbyte" is
+/// thus always true. "enc_dbcs" is always zero. The 'encoding' option is
+/// read-only and always reads "utf-8".
+///
+/// The cell width on the display needs to be determined from the character
+/// value. Recognizing UTF-8 bytes is easy: 0xxx.xxxx is a single-byte char,
+/// 10xx.xxxx is a trailing byte, 11xx.xxxx is a leading byte of a multi-byte
+/// character. To make things complicated, up to six composing characters
+/// are allowed. These are drawn on top of the first char. For most editing
+/// the sequence of bytes with composing characters included is considered to
+/// be one character.
+///
+/// UTF-8 is used everywhere in the core. This is in registers, text
+/// manipulation, buffers, etc. Nvim core communicates with external plugins
+/// and GUIs in this encoding.
+///
+/// The encoding of a file is specified with 'fileencoding'. Conversion
+/// is to be done when it's different from "utf-8".
+///
+/// Vim scripts may contain an ":scriptencoding" command. This has an effect
+/// for some commands, like ":menutrans".
#include <inttypes.h>
#include <stdbool.h>
@@ -75,6 +37,8 @@
#ifdef HAVE_LOCALE_H
# include <locale.h>
#endif
+#include "nvim/eval.h"
+#include "nvim/path.h"
#include "nvim/iconv.h"
#include "nvim/mbyte.h"
#include "nvim/charset.h"
@@ -84,7 +48,6 @@
#include "nvim/memline.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/memory.h"
#include "nvim/option.h"
#include "nvim/screen.h"
@@ -92,6 +55,7 @@
#include "nvim/strings.h"
#include "nvim/os/os.h"
#include "nvim/arabic.h"
+#include "nvim/mark.h"
typedef struct {
int rangeStart;
@@ -110,37 +74,52 @@ struct interval {
# include "unicode_tables.generated.h"
#endif
-/*
- * Lookup table to quickly get the length in bytes of a UTF-8 character from
- * the first byte of a UTF-8 string.
- * Bytes which are illegal when used as the first byte have a 1.
- * The NUL byte has length 1.
- */
-static char utf8len_tab[256] =
-{
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
- 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
- 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1,
+char_u e_loadlib[] = "E370: Could not load library %s";
+char_u e_loadfunc[] = "E448: Could not load library function %s";
+
+// To speed up BYTELEN(); keep a lookup table to quickly get the length in
+// bytes of a UTF-8 character from the first byte of a UTF-8 string. Bytes
+// which are illegal when used as the first byte have a 1. The NUL byte has
+// length 1.
+const uint8_t utf8len_tab[] = {
+ // ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9 ?A ?B ?C ?D ?E ?F
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B?
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // C?
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // D?
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // E?
+ 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 1, 1, // F?
};
-/*
- * Like utf8len_tab above, but using a zero for illegal lead bytes.
- */
-static uint8_t utf8len_tab_zero[256] =
-{
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
- 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,0,0,
+// Like utf8len_tab above, but using a zero for illegal lead bytes.
+const uint8_t utf8len_tab_zero[] = {
+ // ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9 ?A ?B ?C ?D ?E ?F
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7?
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8?
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9?
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // A?
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // B?
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // C?
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // D?
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // E?
+ 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 0, 0, // F?
};
/*
@@ -386,207 +365,6 @@ int enc_canon_props(const char_u *name)
}
/*
- * Set up for using multi-byte characters.
- * Called in three cases:
- * - by main() to initialize (p_enc == NULL)
- * - by set_init_1() after 'encoding' was set to its default.
- * - by do_set() when 'encoding' has been set.
- * p_enc must have been passed through enc_canonize() already.
- * Sets the "enc_unicode", "enc_utf8", "enc_dbcs" and "has_mbyte" flags.
- * Fills mb_bytelen_tab[] and returns NULL when there are no problems.
- * When there is something wrong: Returns an error message and doesn't change
- * anything.
- */
-char_u * mb_init(void)
-{
- int i;
- int idx;
- int n;
- int enc_dbcs_new = 0;
-#if defined(USE_ICONV) && !defined(WIN3264) && !defined(WIN32UNIX) \
- && !defined(MACOS)
-# define LEN_FROM_CONV
- vimconv_T vimconv;
- char_u *p;
-#endif
-
- if (p_enc == NULL) {
- /* Just starting up: set the whole table to one's. */
- for (i = 0; i < 256; ++i)
- mb_bytelen_tab[i] = 1;
- return NULL;
- } else if (STRNCMP(p_enc, "8bit-", 5) == 0
- || STRNCMP(p_enc, "iso-8859-", 9) == 0) {
- /* Accept any "8bit-" or "iso-8859-" name. */
- enc_unicode = 0;
- enc_utf8 = false;
- } else if (STRNCMP(p_enc, "2byte-", 6) == 0) {
- /* Unix: accept any "2byte-" name, assume current locale. */
- enc_dbcs_new = DBCS_2BYTE;
- } else if ((idx = enc_canon_search(p_enc)) >= 0) {
- i = enc_canon_table[idx].prop;
- if (i & ENC_UNICODE) {
- /* Unicode */
- enc_utf8 = true;
- if (i & (ENC_2BYTE | ENC_2WORD))
- enc_unicode = 2;
- else if (i & ENC_4BYTE)
- enc_unicode = 4;
- else
- enc_unicode = 0;
- } else if (i & ENC_DBCS) {
- /* 2byte, handle below */
- enc_dbcs_new = enc_canon_table[idx].codepage;
- } else {
- /* Must be 8-bit. */
- enc_unicode = 0;
- enc_utf8 = false;
- }
- } else /* Don't know what encoding this is, reject it. */
- return e_invarg;
-
- if (enc_dbcs_new != 0) {
- enc_unicode = 0;
- enc_utf8 = false;
- }
- enc_dbcs = enc_dbcs_new;
- has_mbyte = (enc_dbcs != 0 || enc_utf8);
-
-
- /* Detect an encoding that uses latin1 characters. */
- enc_latin1like = (enc_utf8 || STRCMP(p_enc, "latin1") == 0
- || STRCMP(p_enc, "iso-8859-15") == 0);
-
- /*
- * Set the function pointers.
- */
- if (enc_utf8) {
- mb_ptr2len = utfc_ptr2len;
- mb_ptr2len_len = utfc_ptr2len_len;
- mb_char2len = utf_char2len;
- mb_char2bytes = utf_char2bytes;
- mb_ptr2cells = utf_ptr2cells;
- mb_ptr2cells_len = utf_ptr2cells_len;
- mb_char2cells = utf_char2cells;
- mb_off2cells = utf_off2cells;
- mb_ptr2char = utf_ptr2char;
- mb_head_off = utf_head_off;
- } else if (enc_dbcs != 0) {
- mb_ptr2len = dbcs_ptr2len;
- mb_ptr2len_len = dbcs_ptr2len_len;
- mb_char2len = dbcs_char2len;
- mb_char2bytes = dbcs_char2bytes;
- mb_ptr2cells = dbcs_ptr2cells;
- mb_ptr2cells_len = dbcs_ptr2cells_len;
- mb_char2cells = dbcs_char2cells;
- mb_off2cells = dbcs_off2cells;
- mb_ptr2char = dbcs_ptr2char;
- mb_head_off = dbcs_head_off;
- } else {
- mb_ptr2len = latin_ptr2len;
- mb_ptr2len_len = latin_ptr2len_len;
- mb_char2len = latin_char2len;
- mb_char2bytes = latin_char2bytes;
- mb_ptr2cells = latin_ptr2cells;
- mb_ptr2cells_len = latin_ptr2cells_len;
- mb_char2cells = latin_char2cells;
- mb_off2cells = latin_off2cells;
- mb_ptr2char = latin_ptr2char;
- mb_head_off = latin_head_off;
- }
-
- /*
- * Fill the mb_bytelen_tab[] for MB_BYTE2LEN().
- */
-#ifdef LEN_FROM_CONV
- /* When 'encoding' is different from the current locale mblen() won't
- * work. Use conversion to "utf-8" instead. */
- vimconv.vc_type = CONV_NONE;
- if (enc_dbcs) {
- p = enc_locale();
- if (p == NULL || STRCMP(p, p_enc) != 0) {
- convert_setup(&vimconv, p_enc, (char_u *)"utf-8");
- vimconv.vc_fail = true;
- }
- xfree(p);
- }
-#endif
-
- for (i = 0; i < 256; ++i) {
- /* Our own function to reliably check the length of UTF-8 characters,
- * independent of mblen(). */
- if (enc_utf8)
- n = utf8len_tab[i];
- else if (enc_dbcs == 0)
- n = 1;
- else {
- char buf[MB_MAXBYTES + 1];
- if (i == NUL) /* just in case mblen() can't handle "" */
- n = 1;
- else {
- buf[0] = i;
- buf[1] = 0;
-#ifdef LEN_FROM_CONV
- if (vimconv.vc_type != CONV_NONE) {
- /*
- * string_convert() should fail when converting the first
- * byte of a double-byte character.
- */
- p = string_convert(&vimconv, (char_u *)buf, NULL);
- if (p != NULL) {
- xfree(p);
- n = 1;
- } else
- n = 2;
- } else
-#endif
- {
- /*
- * mblen() should return -1 for invalid (means the leading
- * multibyte) character. However there are some platforms
- * where mblen() returns 0 for invalid character.
- * Therefore, following condition includes 0.
- */
- ignored = mblen(NULL, 0); /* First reset the state. */
- if (mblen(buf, (size_t)1) <= 0)
- n = 2;
- else
- n = 1;
- }
- }
- }
- mb_bytelen_tab[i] = n;
- }
-
-#ifdef LEN_FROM_CONV
- convert_setup(&vimconv, NULL, NULL);
-#endif
-
- /* The cell width depends on the type of multi-byte characters. */
- (void)init_chartab();
-
- /* When enc_utf8 is set or reset, (de)allocate ScreenLinesUC[] */
- screenalloc(false);
-
-#ifdef HAVE_WORKING_LIBINTL
- /* GNU gettext 0.10.37 supports this feature: set the codeset used for
- * translated messages independently from the current locale. */
- (void)bind_textdomain_codeset(PROJECT_NAME,
- enc_utf8 ? "utf-8" : (char *)p_enc);
-#endif
-
-
- /* Fire an autocommand to let people do custom font setup. This must be
- * after Vim has been setup for the new encoding. */
- apply_autocmds(EVENT_ENCODINGCHANGED, NULL, (char_u *)"", FALSE, curbuf);
-
- /* Need to reload spell dictionaries */
- spell_reload();
-
- return NULL;
-}
-
-/*
* Return the size of the BOM for the current buffer:
* 0 - no BOM
* 2 - UCS-2 or UTF-16 BOM
@@ -598,20 +376,15 @@ int bomb_size(void)
int n = 0;
if (curbuf->b_p_bomb && !curbuf->b_p_bin) {
- if (*curbuf->b_p_fenc == NUL) {
- if (enc_utf8) {
- if (enc_unicode != 0)
- n = enc_unicode;
- else
- n = 3;
- }
- } else if (STRCMP(curbuf->b_p_fenc, "utf-8") == 0)
+ if (*curbuf->b_p_fenc == NUL
+ || STRCMP(curbuf->b_p_fenc, "utf-8") == 0) {
n = 3;
- else if (STRNCMP(curbuf->b_p_fenc, "ucs-2", 5) == 0
- || STRNCMP(curbuf->b_p_fenc, "utf-16", 6) == 0)
+ } else if (STRNCMP(curbuf->b_p_fenc, "ucs-2", 5) == 0
+ || STRNCMP(curbuf->b_p_fenc, "utf-16", 6) == 0) {
n = 2;
- else if (STRNCMP(curbuf->b_p_fenc, "ucs-4", 5) == 0)
+ } else if (STRNCMP(curbuf->b_p_fenc, "ucs-4", 5) == 0) {
n = 4;
+ }
}
return n;
}
@@ -621,14 +394,13 @@ int bomb_size(void)
*/
void remove_bom(char_u *s)
{
- if (enc_utf8) {
- char_u *p = s;
+ char *p = (char *)s;
- while ((p = vim_strbyte(p, 0xef)) != NULL) {
- if (p[1] == 0xbb && p[2] == 0xbf)
- STRMOVE(p, p + 3);
- else
- ++p;
+ while ((p = strchr(p, 0xef)) != NULL) {
+ if ((uint8_t)p[1] == 0xbb && (uint8_t)p[2] == 0xbf) {
+ STRMOVE(p, p + 3);
+ } else {
+ p++;
}
}
}
@@ -642,259 +414,21 @@ void remove_bom(char_u *s)
*/
int mb_get_class(const char_u *p)
{
- return mb_get_class_buf(p, curbuf);
+ return mb_get_class_tab(p, curbuf->b_chartab);
}
-int mb_get_class_buf(const char_u *p, buf_T *buf)
+int mb_get_class_tab(const char_u *p, const uint64_t *const chartab)
{
if (MB_BYTE2LEN(p[0]) == 1) {
- if (p[0] == NUL || ascii_iswhite(p[0]))
+ if (p[0] == NUL || ascii_iswhite(p[0])) {
return 0;
- if (vim_iswordc_buf(p[0], buf))
+ }
+ if (vim_iswordc_tab(p[0], chartab)) {
return 2;
+ }
return 1;
}
- if (enc_dbcs != 0 && p[0] != NUL && p[1] != NUL)
- return dbcs_class(p[0], p[1]);
- if (enc_utf8)
- return utf_class(utf_ptr2char(p));
- return 0;
-}
-
-/*
- * Get class of a double-byte character. This always returns 3 or bigger.
- * TODO: Should return 1 for punctuation.
- */
-int dbcs_class(unsigned lead, unsigned trail)
-{
- switch (enc_dbcs) {
- /* please add classify routine for your language in here */
-
- case DBCS_JPNU: /* ? */
- case DBCS_JPN:
- {
- /* JIS code classification */
- unsigned char lb = lead;
- unsigned char tb = trail;
-
- /* convert process code to JIS */
- /*
- * XXX: Code page identification can not use with all
- * system! So, some other encoding information
- * will be needed.
- * In japanese: SJIS,EUC,UNICODE,(JIS)
- * Note that JIS-code system don't use as
- * process code in most system because it uses
- * escape sequences(JIS is context depend encoding).
- */
- /* assume process code is JAPANESE-EUC */
- lb &= 0x7f;
- tb &= 0x7f;
- /* exceptions */
- switch (lb << 8 | tb) {
- case 0x2121: /* ZENKAKU space */
- return 0;
- case 0x2122: /* TOU-TEN (Japanese comma) */
- case 0x2123: /* KU-TEN (Japanese period) */
- case 0x2124: /* ZENKAKU comma */
- case 0x2125: /* ZENKAKU period */
- return 1;
- case 0x213c: /* prolongedsound handled as KATAKANA */
- return 13;
- }
- /* sieved by KU code */
- switch (lb) {
- case 0x21:
- case 0x22:
- /* special symbols */
- return 10;
- case 0x23:
- /* alpha-numeric */
- return 11;
- case 0x24:
- /* hiragana */
- return 12;
- case 0x25:
- /* katakana */
- return 13;
- case 0x26:
- /* greek */
- return 14;
- case 0x27:
- /* russian */
- return 15;
- case 0x28:
- /* lines */
- return 16;
- default:
- /* kanji */
- return 17;
- }
- }
-
- case DBCS_KORU: /* ? */
- case DBCS_KOR:
- {
- /* KS code classification */
- unsigned char c1 = lead;
- unsigned char c2 = trail;
-
- /*
- * 20 : Hangul
- * 21 : Hanja
- * 22 : Symbols
- * 23 : Alpha-numeric/Roman Letter (Full width)
- * 24 : Hangul Letter(Alphabet)
- * 25 : Roman Numeral/Greek Letter
- * 26 : Box Drawings
- * 27 : Unit Symbols
- * 28 : Circled/Parenthesized Letter
- * 29 : Hiragana/Katakana
- * 30 : Cyrillic Letter
- */
-
- if (c1 >= 0xB0 && c1 <= 0xC8)
- /* Hangul */
- return 20;
-
- else if (c1 >= 0xCA && c1 <= 0xFD)
- /* Hanja */
- return 21;
- else switch (c1) {
- case 0xA1:
- case 0xA2:
- /* Symbols */
- return 22;
- case 0xA3:
- /* Alpha-numeric */
- return 23;
- case 0xA4:
- /* Hangul Letter(Alphabet) */
- return 24;
- case 0xA5:
- /* Roman Numeral/Greek Letter */
- return 25;
- case 0xA6:
- /* Box Drawings */
- return 26;
- case 0xA7:
- /* Unit Symbols */
- return 27;
- case 0xA8:
- case 0xA9:
- if (c2 <= 0xAF)
- return 25; /* Roman Letter */
- else if (c2 >= 0xF6)
- return 22; /* Symbols */
- else
- /* Circled/Parenthesized Letter */
- return 28;
- case 0xAA:
- case 0xAB:
- /* Hiragana/Katakana */
- return 29;
- case 0xAC:
- /* Cyrillic Letter */
- return 30;
- }
- }
- default:
- break;
- }
- return 3;
-}
-
-/*
- * mb_char2len() function pointer.
- * Return length in bytes of character "c".
- * Returns 1 for a single-byte character.
- */
-int latin_char2len(int c)
-{
- return 1;
-}
-
-static int dbcs_char2len(int c)
-{
- if (c >= 0x100)
- return 2;
- return 1;
-}
-
-/*
- * mb_char2bytes() function pointer.
- * Convert a character to its bytes.
- * Returns the length in bytes.
- */
-int latin_char2bytes(int c, char_u *buf)
-{
- buf[0] = c;
- return 1;
-}
-
-static int dbcs_char2bytes(int c, char_u *buf)
-{
- if (c >= 0x100) {
- buf[0] = (unsigned)c >> 8;
- buf[1] = c;
- /* Never use a NUL byte, it causes lots of trouble. It's an invalid
- * character anyway. */
- if (buf[1] == NUL)
- buf[1] = '\n';
- return 2;
- }
- buf[0] = c;
- return 1;
-}
-
-/*
- * mb_ptr2len() function pointer.
- * Get byte length of character at "*p" but stop at a NUL.
- * For UTF-8 this includes following composing characters.
- * Returns 0 when *p is NUL.
- */
-int latin_ptr2len(const char_u *p)
-{
- return MB_BYTE2LEN(*p);
-}
-
-static int dbcs_ptr2len(const char_u *p)
-{
- int len;
-
- /* Check if second byte is not missing. */
- len = MB_BYTE2LEN(*p);
- if (len == 2 && p[1] == NUL)
- len = 1;
- return len;
-}
-
-/*
- * mb_ptr2len_len() function pointer.
- * Like mb_ptr2len(), but limit to read "size" bytes.
- * Returns 0 for an empty string.
- * Returns 1 for an illegal char or an incomplete byte sequence.
- */
-int latin_ptr2len_len(const char_u *p, int size)
-{
- if (size < 1 || *p == NUL)
- return 0;
- return 1;
-}
-
-static int dbcs_ptr2len_len(const char_u *p, int size)
-{
- int len;
-
- if (size < 1 || *p == NUL)
- return 0;
- if (size == 1)
- return 1;
- /* Check that second byte is not missing. */
- len = MB_BYTE2LEN(*p);
- if (len == 2 && p[1] == NUL)
- len = 1;
- return len;
+ return utf_class_tab(utf_ptr2char(p), chartab);
}
/*
@@ -950,6 +484,9 @@ int utf_char2cells(int c)
if (intable(doublewidth, ARRAY_SIZE(doublewidth), c))
return 2;
#endif
+ if (p_emoji && intable(emoji_width, ARRAY_SIZE(emoji_width), c)) {
+ return 2;
+ }
}
/* Characters below 0x100 are influenced by 'isprint' option */
else if (c >= 0x80 && !vim_isprintc(c))
@@ -961,16 +498,8 @@ int utf_char2cells(int c)
return 1;
}
-/*
- * mb_ptr2cells() function pointer.
- * Return the number of display cells character at "*p" occupies.
- * This doesn't take care of unprintable characters, use ptr2cells() for that.
- */
-int latin_ptr2cells(const char_u *p)
-{
- return 1;
-}
-
+/// Return the number of display cells character at "*p" occupies.
+/// This doesn't take care of unprintable characters, use ptr2cells() for that.
int utf_ptr2cells(const char_u *p)
{
int c;
@@ -989,26 +518,9 @@ int utf_ptr2cells(const char_u *p)
return 1;
}
-int dbcs_ptr2cells(const char_u *p)
-{
- /* Number of cells is equal to number of bytes, except for euc-jp when
- * the first byte is 0x8e. */
- if (enc_dbcs == DBCS_JPNU && *p == 0x8e)
- return 1;
- return MB_BYTE2LEN(*p);
-}
-
-/*
- * mb_ptr2cells_len() function pointer.
- * Like mb_ptr2cells(), but limit string length to "size".
- * For an empty string or truncated character returns 1.
- */
-int latin_ptr2cells_len(const char_u *p, int size)
-{
- return 1;
-}
-
-static int utf_ptr2cells_len(const char_u *p, int size)
+/// Like utf_ptr2cells(), but limit string length to "size".
+/// For an empty string or truncated character returns 1.
+int utf_ptr2cells_len(const char_u *p, int size)
{
int c;
@@ -1028,35 +540,6 @@ static int utf_ptr2cells_len(const char_u *p, int size)
return 1;
}
-static int dbcs_ptr2cells_len(const char_u *p, int size)
-{
- /* Number of cells is equal to number of bytes, except for euc-jp when
- * the first byte is 0x8e. */
- if (size <= 1 || (enc_dbcs == DBCS_JPNU && *p == 0x8e))
- return 1;
- return MB_BYTE2LEN(*p);
-}
-
-/*
- * mb_char2cells() function pointer.
- * Return the number of display cells character "c" occupies.
- * Only takes care of multi-byte chars, not "^C" and such.
- */
-int latin_char2cells(int c)
-{
- return 1;
-}
-
-static int dbcs_char2cells(int c)
-{
- /* Number of cells is equal to number of bytes, except for euc-jp when
- * the first byte is 0x8e. */
- if (enc_dbcs == DBCS_JPNU && ((unsigned)c >> 8) == 0x8e)
- return 1;
- /* use the first byte */
- return MB_BYTE2LEN((unsigned)c >> 8);
-}
-
/// Calculate the number of cells occupied by string `str`.
///
/// @param str The source string, may not be NULL, must be a NUL-terminated
@@ -1067,95 +550,60 @@ size_t mb_string2cells(const char_u *str)
size_t clen = 0;
for (const char_u *p = str; *p != NUL; p += (*mb_ptr2len)(p)) {
- clen += (*mb_ptr2cells)(p);
+ clen += utf_ptr2cells(p);
}
return clen;
}
-/*
- * mb_off2cells() function pointer.
- * Return number of display cells for char at ScreenLines[off].
- * We make sure that the offset used is less than "max_off".
- */
-int latin_off2cells(unsigned off, unsigned max_off)
-{
- return 1;
-}
-
-int dbcs_off2cells(unsigned off, unsigned max_off)
-{
- /* never check beyond end of the line */
- if (off >= max_off)
- return 1;
-
- /* Number of cells is equal to number of bytes, except for euc-jp when
- * the first byte is 0x8e. */
- if (enc_dbcs == DBCS_JPNU && ScreenLines[off] == 0x8e)
- return 1;
- return MB_BYTE2LEN(ScreenLines[off]);
-}
-
-int utf_off2cells(unsigned off, unsigned max_off)
-{
- return (off + 1 < max_off && ScreenLines[off + 1] == 0) ? 2 : 1;
-}
-
-/*
- * mb_ptr2char() function pointer.
- * Convert a byte sequence into a character.
- */
-int latin_ptr2char(const char_u *p)
-{
- return *p;
-}
-
-static int dbcs_ptr2char(const char_u *p)
-{
- if (MB_BYTE2LEN(*p) > 1 && p[1] != NUL)
- return (p[0] << 8) + p[1];
- return *p;
-}
-
-/*
- * Convert a UTF-8 byte sequence to a wide character.
- * If the sequence is illegal or truncated by a NUL the first byte is
- * returned.
- * Does not include composing characters, of course.
- */
-int utf_ptr2char(const char_u *p)
+/// Convert a UTF-8 byte sequence to a wide character
+///
+/// If the sequence is illegal or truncated by a NUL then the first byte is
+/// returned.
+/// For an overlong sequence this may return zero.
+/// Does not include composing characters for obvious reasons.
+///
+/// @param[in] p String to convert.
+///
+/// @return Unicode codepoint or byte value.
+int utf_ptr2char(const char_u *const p)
+ FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
- uint8_t len;
-
- if (p[0] < 0x80) /* be quick for ASCII */
+ if (p[0] < 0x80) { // Be quick for ASCII.
return p[0];
+ }
- len = utf8len_tab_zero[p[0]];
+ const uint8_t len = utf8len_tab_zero[p[0]];
if (len > 1 && (p[1] & 0xc0) == 0x80) {
- if (len == 2)
+ if (len == 2) {
return ((p[0] & 0x1f) << 6) + (p[1] & 0x3f);
+ }
if ((p[2] & 0xc0) == 0x80) {
- if (len == 3)
- return ((p[0] & 0x0f) << 12) + ((p[1] & 0x3f) << 6)
- + (p[2] & 0x3f);
+ if (len == 3) {
+ return (((p[0] & 0x0f) << 12) + ((p[1] & 0x3f) << 6)
+ + (p[2] & 0x3f));
+ }
if ((p[3] & 0xc0) == 0x80) {
- if (len == 4)
- return ((p[0] & 0x07) << 18) + ((p[1] & 0x3f) << 12)
- + ((p[2] & 0x3f) << 6) + (p[3] & 0x3f);
+ if (len == 4) {
+ return (((p[0] & 0x07) << 18) + ((p[1] & 0x3f) << 12)
+ + ((p[2] & 0x3f) << 6) + (p[3] & 0x3f));
+ }
if ((p[4] & 0xc0) == 0x80) {
- if (len == 5)
- return ((p[0] & 0x03) << 24) + ((p[1] & 0x3f) << 18)
- + ((p[2] & 0x3f) << 12) + ((p[3] & 0x3f) << 6)
- + (p[4] & 0x3f);
- if ((p[5] & 0xc0) == 0x80 && len == 6)
- return ((p[0] & 0x01) << 30) + ((p[1] & 0x3f) << 24)
- + ((p[2] & 0x3f) << 18) + ((p[3] & 0x3f) << 12)
- + ((p[4] & 0x3f) << 6) + (p[5] & 0x3f);
+ if (len == 5) {
+ return (((p[0] & 0x03) << 24) + ((p[1] & 0x3f) << 18)
+ + ((p[2] & 0x3f) << 12) + ((p[3] & 0x3f) << 6)
+ + (p[4] & 0x3f));
+ }
+ if ((p[5] & 0xc0) == 0x80 && len == 6) {
+ return (((p[0] & 0x01) << 30) + ((p[1] & 0x3f) << 24)
+ + ((p[2] & 0x3f) << 18) + ((p[3] & 0x3f) << 12)
+ + ((p[4] & 0x3f) << 6) + (p[5] & 0x3f));
+ }
}
}
}
}
- /* Illegal value, just return the first byte */
+ // Illegal value: just return the first byte.
return p[0];
}
@@ -1175,7 +623,7 @@ int utf_ptr2char(const char_u *p)
* If byte sequence is illegal or incomplete, returns -1 and does not advance
* "s".
*/
-static int utf_safe_read_char_adv(char_u **s, size_t *n)
+static int utf_safe_read_char_adv(const char_u **s, size_t *n)
{
int c;
@@ -1217,11 +665,11 @@ static int utf_safe_read_char_adv(char_u **s, size_t *n)
* Get character at **pp and advance *pp to the next character.
* Note: composing characters are skipped!
*/
-int mb_ptr2char_adv(char_u **pp)
+int mb_ptr2char_adv(const char_u **const pp)
{
int c;
- c = (*mb_ptr2char)(*pp);
+ c = utf_ptr2char(*pp);
*pp += (*mb_ptr2len)(*pp);
return c;
}
@@ -1230,15 +678,12 @@ int mb_ptr2char_adv(char_u **pp)
* Get character at **pp and advance *pp to the next character.
* Note: composing characters are returned as separate characters.
*/
-int mb_cptr2char_adv(char_u **pp)
+int mb_cptr2char_adv(const char_u **pp)
{
int c;
- c = (*mb_ptr2char)(*pp);
- if (enc_utf8)
- *pp += utf_ptr2len(*pp);
- else
- *pp += (*mb_ptr2len)(*pp);
+ c = utf_ptr2char(*pp);
+ *pp += utf_ptr2len(*pp);
return c;
}
@@ -1259,12 +704,14 @@ bool utf_composinglike(const char_u *p1, const char_u *p2)
return arabic_combine(utf_ptr2char(p1), c2);
}
-/*
- * Convert a UTF-8 byte string to a wide character. Also get up to MAX_MCO
- * composing characters.
- *
- * @param [out] pcc: composing chars, last one is 0
- */
+/// Convert a UTF-8 string to a wide character
+///
+/// Also gets up to #MAX_MCO composing characters.
+///
+/// @param[out] pcc Location where to store composing characters. Must have
+/// space at least for #MAX_MCO + 1 elements.
+///
+/// @return leading character.
int utfc_ptr2char(const char_u *p, int *pcc)
{
int len;
@@ -1338,44 +785,24 @@ int utfc_ptr2char_len(const char_u *p, int *pcc, int maxlen)
#undef ISCOMPOSING
}
-/*
- * Convert the character at screen position "off" to a sequence of bytes.
- * Includes the composing characters.
- * "buf" must at least have the length MB_MAXBYTES + 1.
- * Only to be used when ScreenLinesUC[off] != 0.
- * Returns the produced number of bytes.
- */
-int utfc_char2bytes(int off, char_u *buf)
-{
- int len;
- int i;
-
- len = utf_char2bytes(ScreenLinesUC[off], buf);
- for (i = 0; i < Screen_mco; ++i) {
- if (ScreenLinesC[i][off] == 0)
- break;
- len += utf_char2bytes(ScreenLinesC[i][off], buf + len);
- }
- return len;
-}
-
-/*
- * Get the length of a UTF-8 byte sequence, not including any following
- * composing characters.
- * Returns 0 for "".
- * Returns 1 for an illegal byte sequence.
- */
-int utf_ptr2len(const char_u *p)
+/// Get the length of a UTF-8 byte sequence representing a single codepoint
+///
+/// @param[in] p UTF-8 string.
+///
+/// @return Sequence length, 0 for empty string and 1 for non-UTF-8 byte
+/// sequence.
+int utf_ptr2len(const char_u *const p)
+ FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
{
- int len;
- int i;
-
- if (*p == NUL)
+ if (*p == NUL) {
return 0;
- len = utf8len_tab[*p];
- for (i = 1; i < len; ++i)
- if ((p[i] & 0xc0) != 0x80)
+ }
+ const int len = utf8len_tab[*p];
+ for (int i = 1; i < len; i++) {
+ if ((p[i] & 0xc0) != 0x80) {
return 1;
+ }
+ }
return len;
}
@@ -1416,38 +843,38 @@ int utf_ptr2len_len(const char_u *p, int size)
return len;
}
-/*
- * Return the number of bytes the UTF-8 encoding of the character at "p" takes.
- * This includes following composing characters.
- */
-int utfc_ptr2len(const char_u *p)
+/// Return the number of bytes occupied by a UTF-8 character in a string
+///
+/// This includes following composing characters.
+int utfc_ptr2len(const char_u *const p)
+ FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
{
- int len;
- int b0 = *p;
- int prevlen;
+ uint8_t b0 = (uint8_t)(*p);
- if (b0 == NUL)
+ if (b0 == NUL) {
return 0;
- if (b0 < 0x80 && p[1] < 0x80) /* be quick for ASCII */
+ }
+ if (b0 < 0x80 && p[1] < 0x80) { // be quick for ASCII
return 1;
+ }
- /* Skip over first UTF-8 char, stopping at a NUL byte. */
- len = utf_ptr2len(p);
+ // Skip over first UTF-8 char, stopping at a NUL byte.
+ int len = utf_ptr2len(p);
- /* Check for illegal byte. */
- if (len == 1 && b0 >= 0x80)
+ // Check for illegal byte.
+ if (len == 1 && b0 >= 0x80) {
return 1;
+ }
- /*
- * Check for composing characters. We can handle only the first six, but
- * skip all of them (otherwise the cursor would get stuck).
- */
- prevlen = 0;
- for (;; ) {
- if (p[len] < 0x80 || !UTF_COMPOSINGLIKE(p + prevlen, p + len))
+ // Check for composing characters. We can handle only the first six, but
+ // skip all of them (otherwise the cursor would get stuck).
+ int prevlen = 0;
+ for (;;) {
+ if (p[len] < 0x80 || !UTF_COMPOSINGLIKE(p + prevlen, p + len)) {
return len;
+ }
- /* Skip over composing char */
+ // Skip over composing char.
prevlen = len;
len += utf_ptr2len(p + len);
}
@@ -1505,70 +932,65 @@ int utfc_ptr2len_len(const char_u *p, int size)
return len;
}
-/*
- * Return the number of bytes the UTF-8 encoding of character "c" takes.
- * This does not include composing characters.
- */
-int utf_char2len(int c)
+/// Determine how many bytes certain unicode codepoint will occupy
+int utf_char2len(const int c)
{
- if (c < 0x80)
+ if (c < 0x80) {
return 1;
- if (c < 0x800)
+ } else if (c < 0x800) {
return 2;
- if (c < 0x10000)
+ } else if (c < 0x10000) {
return 3;
- if (c < 0x200000)
+ } else if (c < 0x200000) {
return 4;
- if (c < 0x4000000)
+ } else if (c < 0x4000000) {
return 5;
- return 6;
+ } else {
+ return 6;
+ }
}
-/*
- * Convert Unicode character "c" to UTF-8 string in "buf[]".
- * Returns the number of bytes.
- * This does not include composing characters.
- */
-int utf_char2bytes(int c, char_u *buf)
+/// Convert Unicode character to UTF-8 string
+///
+/// @param c character to convert to \p buf
+/// @param[out] buf UTF-8 string generated from \p c, does not add \0
+/// @return Number of bytes (1-6). Does not include composing characters.
+int utf_char2bytes(const int c, char_u *const buf)
{
- if (c < 0x80) { /* 7 bits */
+ if (c < 0x80) { // 7 bits
buf[0] = c;
return 1;
- }
- if (c < 0x800) { /* 11 bits */
+ } else if (c < 0x800) { // 11 bits
buf[0] = 0xc0 + ((unsigned)c >> 6);
buf[1] = 0x80 + (c & 0x3f);
return 2;
- }
- if (c < 0x10000) { /* 16 bits */
+ } else if (c < 0x10000) { // 16 bits
buf[0] = 0xe0 + ((unsigned)c >> 12);
buf[1] = 0x80 + (((unsigned)c >> 6) & 0x3f);
buf[2] = 0x80 + (c & 0x3f);
return 3;
- }
- if (c < 0x200000) { /* 21 bits */
+ } else if (c < 0x200000) { // 21 bits
buf[0] = 0xf0 + ((unsigned)c >> 18);
buf[1] = 0x80 + (((unsigned)c >> 12) & 0x3f);
buf[2] = 0x80 + (((unsigned)c >> 6) & 0x3f);
buf[3] = 0x80 + (c & 0x3f);
return 4;
- }
- if (c < 0x4000000) { /* 26 bits */
+ } else if (c < 0x4000000) { // 26 bits
buf[0] = 0xf8 + ((unsigned)c >> 24);
buf[1] = 0x80 + (((unsigned)c >> 18) & 0x3f);
buf[2] = 0x80 + (((unsigned)c >> 12) & 0x3f);
buf[3] = 0x80 + (((unsigned)c >> 6) & 0x3f);
buf[4] = 0x80 + (c & 0x3f);
return 5;
+ } else { // 31 bits
+ buf[0] = 0xfc + ((unsigned)c >> 30);
+ buf[1] = 0x80 + (((unsigned)c >> 24) & 0x3f);
+ buf[2] = 0x80 + (((unsigned)c >> 18) & 0x3f);
+ buf[3] = 0x80 + (((unsigned)c >> 12) & 0x3f);
+ buf[4] = 0x80 + (((unsigned)c >> 6) & 0x3f);
+ buf[5] = 0x80 + (c & 0x3f);
+ return 6;
}
- /* 31 bits */
- buf[0] = 0xfc + ((unsigned)c >> 30);
- buf[1] = 0x80 + (((unsigned)c >> 24) & 0x3f);
- buf[2] = 0x80 + (((unsigned)c >> 18) & 0x3f);
- buf[3] = 0x80 + (((unsigned)c >> 12) & 0x3f);
- buf[4] = 0x80 + (((unsigned)c >> 6) & 0x3f);
- buf[5] = 0x80 + (c & 0x3f);
- return 6;
}
/*
@@ -1612,7 +1034,12 @@ bool utf_printable(int c)
* 1: punctuation
* 2 or bigger: some class of word character.
*/
-int utf_class(int c)
+int utf_class(const int c)
+{
+ return utf_class_tab(c, curbuf->b_chartab);
+}
+
+int utf_class_tab(const int c, const uint64_t *const chartab)
{
/* sorted list of non-overlapping intervals */
static struct clinterval {
@@ -1695,11 +1122,13 @@ int utf_class(int c)
/* First quick check for Latin1 characters, use 'iskeyword'. */
if (c < 0x100) {
- if (c == ' ' || c == '\t' || c == NUL || c == 0xa0)
- return 0; /* blank */
- if (vim_iswordc(c))
- return 2; /* word character */
- return 1; /* punctuation */
+ if (c == ' ' || c == '\t' || c == NUL || c == 0xa0) {
+ return 0; // blank
+ }
+ if (vim_iswordc_tab(c, chartab)) {
+ return 2; // word character
+ }
+ return 1; // punctuation
}
/* binary search in table */
@@ -1713,16 +1142,20 @@ int utf_class(int c)
return (int)classes[mid].class;
}
+ // emoji
+ if (intable(emoji_all, ARRAY_SIZE(emoji_all), c)) {
+ return 3;
+ }
+
/* most other characters are "word" characters */
return 2;
}
-/*
- * Code for Unicode case-dependent operations. Based on notes in
- * http://www.unicode.org/Public/UNIDATA/CaseFolding.txt
- * This code uses simple case folding, not full case folding.
- * Last updated for Unicode 5.2.
- */
+bool utf_ambiguous_width(int c)
+{
+ return c >= 0x80 && (intable(ambiguous, ARRAY_SIZE(ambiguous), c)
+ || intable(emoji_all, ARRAY_SIZE(emoji_all), c));
+}
/*
* Generic conversion function for case operations.
@@ -1758,14 +1191,21 @@ static int utf_convert(int a, const convertStruct *const table, size_t n_items)
*/
int utf_fold(int a)
{
+ if (a < 0x80) {
+ // be fast for ASCII
+ return a >= 0x41 && a <= 0x5a ? a + 32 : a;
+ }
return utf_convert(a, foldCase, ARRAY_SIZE(foldCase));
}
-/*
- * Return the upper-case equivalent of "a", which is a UCS-4 character. Use
- * simple case folding.
- */
-int utf_toupper(int a)
+// Vim's own character class functions. These exist because many library
+// islower()/toupper() etc. do not work properly: they crash when used with
+// invalid values or can't handle latin1 when the locale is C.
+// Speed is most important here.
+
+/// Return the upper-case equivalent of "a", which is a UCS-4 character. Use
+/// simple case folding.
+int mb_toupper(int a)
{
/* If 'casemap' contains "keepascii" use ASCII style toupper(). */
if (a < 128 && (cmp_flags & CMP_KEEPASCII))
@@ -1785,17 +1225,15 @@ int utf_toupper(int a)
return utf_convert(a, toUpper, ARRAY_SIZE(toUpper));
}
-bool utf_islower(int a)
+bool mb_islower(int a)
{
- /* German sharp s is lower case but has no upper case equivalent. */
- return (utf_toupper(a) != a) || a == 0xdf;
+ // German sharp s is lower case but has no upper case equivalent.
+ return (mb_toupper(a) != a) || a == 0xdf;
}
-/*
- * Return the lower-case equivalent of "a", which is a UCS-4 character. Use
- * simple case folding.
- */
-int utf_tolower(int a)
+/// Return the lower-case equivalent of "a", which is a UCS-4 character. Use
+/// simple case folding.
+int mb_tolower(int a)
{
/* If 'casemap' contains "keepascii" use ASCII style tolower(). */
if (a < 128 && (cmp_flags & CMP_KEEPASCII))
@@ -1815,12 +1253,13 @@ int utf_tolower(int a)
return utf_convert(a, toLower, ARRAY_SIZE(toLower));
}
-bool utf_isupper(int a)
+bool mb_isupper(int a)
{
- return utf_tolower(a) != a;
+ return mb_tolower(a) != a;
}
-static int utf_strnicmp(char_u *s1, char_u *s2, size_t n1, size_t n2)
+static int utf_strnicmp(const char_u *s1, const char_u *s2, size_t n1,
+ size_t n2)
{
int c1, c2, cdiff;
char_u buffer[6];
@@ -1885,6 +1324,93 @@ static int utf_strnicmp(char_u *s1, char_u *s2, size_t n1, size_t n2)
return n1 == 0 ? -1 : 1;
}
+#ifdef WIN32
+#ifndef CP_UTF8
+# define CP_UTF8 65001 /* magic number from winnls.h */
+#endif
+
+/// Reassigns `strw` to a new, allocated pointer to a UTF16 string.
+int utf8_to_utf16(const char *str, wchar_t **strw)
+ FUNC_ATTR_NONNULL_ALL
+{
+ ssize_t wchar_len = 0;
+
+ // Compute the length needed to store the converted widechar string.
+ wchar_len = MultiByteToWideChar(CP_UTF8,
+ 0, // dwFlags: must be 0 for utf8
+ str, // lpMultiByteStr: string to convert
+ -1, // -1 => process up to NUL
+ NULL, // lpWideCharStr: converted string
+ 0); // 0 => return length, don't convert
+ if (wchar_len == 0) {
+ return GetLastError();
+ }
+
+ ssize_t buf_sz = wchar_len * sizeof(wchar_t);
+
+ if (buf_sz == 0) {
+ *strw = NULL;
+ return 0;
+ }
+
+ char *buf = xmalloc(buf_sz);
+ char *pos = buf;
+
+ int r = MultiByteToWideChar(CP_UTF8,
+ 0,
+ str,
+ -1,
+ (wchar_t *)pos,
+ wchar_len);
+ assert(r == wchar_len);
+ if (r != wchar_len) {
+ EMSG2("MultiByteToWideChar failed: %d", r);
+ }
+ *strw = (wchar_t *)pos;
+
+ return 0;
+}
+
+/// Reassigns `str` to a new, allocated pointer to a UTF8 string.
+int utf16_to_utf8(const wchar_t *strw, char **str)
+ FUNC_ATTR_NONNULL_ALL
+{
+ // Compute the space required to store the string as UTF-8.
+ DWORD utf8_len = WideCharToMultiByte(CP_UTF8,
+ 0,
+ strw,
+ -1,
+ NULL,
+ 0,
+ NULL,
+ NULL);
+ if (utf8_len == 0) {
+ return GetLastError();
+ }
+
+ *str = xmallocz(utf8_len);
+
+ // Convert to UTF-8.
+ utf8_len = WideCharToMultiByte(CP_UTF8,
+ 0,
+ strw,
+ -1,
+ *str,
+ utf8_len,
+ NULL,
+ NULL);
+ if (utf8_len == 0) {
+ free(*str);
+ *str = NULL;
+ return GetLastError();
+ }
+ (*str)[utf8_len] = '\0';
+
+ return 0;
+}
+
+#endif
+
/*
* Version of strnicmp() that handles multi-byte characters.
* Needed for Big5, Shift-JIS and UTF-8 encoding. Other DBCS encodings can
@@ -1893,48 +1419,26 @@ static int utf_strnicmp(char_u *s1, char_u *s2, size_t n1, size_t n2)
* Returns zero if s1 and s2 are equal (ignoring case), the difference between
* two characters otherwise.
*/
-int mb_strnicmp(char_u *s1, char_u *s2, size_t nn)
+int mb_strnicmp(const char_u *s1, const char_u *s2, const size_t nn)
{
- int i, l;
- int cdiff;
- int n = (int)nn;
-
- if (enc_utf8) {
- return utf_strnicmp(s1, s2, nn, nn);
- } else {
- for (i = 0; i < n; i += l) {
- if (s1[i] == NUL && s2[i] == NUL) /* both strings end */
- return 0;
-
- l = (*mb_ptr2len)(s1 + i);
- if (l <= 1) {
- /* Single byte: first check normally, then with ignore case. */
- if (s1[i] != s2[i]) {
- cdiff = vim_tolower(s1[i]) - vim_tolower(s2[i]);
- if (cdiff != 0)
- return cdiff;
- }
- } else {
- /* For non-Unicode multi-byte don't ignore case. */
- if (l > n - i)
- l = n - i;
- cdiff = STRNCMP(s1 + i, s2 + i, l);
- if (cdiff != 0)
- return cdiff;
- }
- }
- }
- return 0;
+ return utf_strnicmp(s1, s2, nn, nn);
}
-/* We need to call mb_stricmp() even when we aren't dealing with a multi-byte
- * encoding because mb_stricmp() takes care of all ascii and non-ascii
- * encodings, including characters with umlauts in latin1, etc., while
- * STRICMP() only handles the system locale version, which often does not
- * handle non-ascii properly. */
-int mb_stricmp(char_u *s1, char_u *s2)
+/// Compare strings case-insensitively
+///
+/// @note We need to call mb_stricmp() even when we aren't dealing with
+/// a multi-byte encoding because mb_stricmp() takes care of all ASCII and
+/// non-ascii encodings, including characters with umlauts in latin1,
+/// etc., while STRICMP() only handles the system locale version, which
+/// often does not handle non-ascii properly.
+///
+/// @param[in] s1 First string to compare, not more then #MAXCOL characters.
+/// @param[in] s2 Second string to compare, not more then #MAXCOL characters.
+///
+/// @return 0 if strings are equal, <0 if s1 < s2, >0 if s1 > s2.
+int mb_stricmp(const char *s1, const char *s2)
{
- return mb_strnicmp(s1, s2, MAXCOL);
+ return mb_strnicmp((const char_u *)s1, (const char_u *)s2, MAXCOL);
}
/*
@@ -1979,68 +1483,9 @@ void show_utf8(void)
msg(IObuff);
}
-/*
- * mb_head_off() function pointer.
- * Return offset from "p" to the first byte of the character it points into.
- * If "p" points to the NUL at the end of the string return 0.
- * Returns 0 when already at the first byte of a character.
- */
-int latin_head_off(const char_u *base, const char_u *p)
-{
- return 0;
-}
-
-int dbcs_head_off(const char_u *base, const char_u *p)
-{
- /* It can't be a trailing byte when not using DBCS, at the start of the
- * string or the previous byte can't start a double-byte. */
- if (p <= base || MB_BYTE2LEN(p[-1]) == 1 || *p == NUL) {
- return 0;
- }
-
- /* This is slow: need to start at the base and go forward until the
- * byte we are looking for. Return 1 when we went past it, 0 otherwise. */
- const char_u *q = base;
- while (q < p) {
- q += dbcs_ptr2len(q);
- }
-
- return (q == p) ? 0 : 1;
-}
-
-/*
- * Special version of dbcs_head_off() that works for ScreenLines[], where
- * single-width DBCS_JPNU characters are stored separately.
- */
-int dbcs_screen_head_off(const char_u *base, const char_u *p)
-{
- /* It can't be a trailing byte when not using DBCS, at the start of the
- * string or the previous byte can't start a double-byte.
- * For euc-jp an 0x8e byte in the previous cell always means we have a
- * lead byte in the current cell. */
- if (p <= base
- || (enc_dbcs == DBCS_JPNU && p[-1] == 0x8e)
- || MB_BYTE2LEN(p[-1]) == 1
- || *p == NUL)
- return 0;
-
- /* This is slow: need to start at the base and go forward until the
- * byte we are looking for. Return 1 when we went past it, 0 otherwise.
- * For DBCS_JPNU look out for 0x8e, which means the second byte is not
- * stored as the next byte. */
- const char_u *q = base;
- while (q < p) {
- if (enc_dbcs == DBCS_JPNU && *q == 0x8e) {
- ++q;
- }
- else {
- q += dbcs_ptr2len(q);
- }
- }
-
- return (q == p) ? 0 : 1;
-}
-
+/// Return offset from "p" to the first byte of the character it points into.
+/// If "p" points to the NUL at the end of the string return 0.
+/// Returns 0 when already at the first byte of a character.
int utf_head_off(const char_u *base, const char_u *p)
{
int c;
@@ -2089,14 +1534,15 @@ int utf_head_off(const char_u *base, const char_u *p)
return (int)(p - q);
}
-/*
- * Copy a character from "*fp" to "*tp" and advance the pointers.
- */
-void mb_copy_char(const char_u **fp, char_u **tp)
+/// Copy a character, advancing the pointers
+///
+/// @param[in,out] fp Source of the character to copy.
+/// @param[in,out] tp Destination to copy to.
+void mb_copy_char(const char_u **const fp, char_u **const tp)
{
- int l = (*mb_ptr2len)(*fp);
+ const size_t l = (size_t)utfc_ptr2len(*fp);
- memmove(*tp, *fp, (size_t)l);
+ memmove(*tp, *fp, l);
*tp += l;
*fp += l;
}
@@ -2111,27 +1557,24 @@ int mb_off_next(char_u *base, char_u *p)
int i;
int j;
- if (enc_utf8) {
- if (*p < 0x80) /* be quick for ASCII */
- return 0;
+ if (*p < 0x80) { // be quick for ASCII
+ return 0;
+ }
- /* Find the next character that isn't 10xx.xxxx */
- for (i = 0; (p[i] & 0xc0) == 0x80; ++i)
- ;
- if (i > 0) {
- /* Check for illegal sequence. */
- for (j = 0; p - j > base; ++j)
- if ((p[-j] & 0xc0) != 0x80)
- break;
- if (utf8len_tab[p[-j]] != i + j)
- return 0;
+ // Find the next character that isn't 10xx.xxxx
+ for (i = 0; (p[i] & 0xc0) == 0x80; i++) {}
+ if (i > 0) {
+ // Check for illegal sequence.
+ for (j = 0; p - j > base; j++) {
+ if ((p[-j] & 0xc0) != 0x80) {
+ break;
+ }
+ }
+ if (utf8len_tab[p[-j]] != i + j) {
+ return 0;
}
- return i;
}
-
- /* Only need to check if we're on a trail byte, it doesn't matter if we
- * want the offset to the next or current character. */
- return (*mb_head_off)(base, p);
+ return i;
}
/*
@@ -2146,26 +1589,20 @@ int mb_tail_off(char_u *base, char_u *p)
if (*p == NUL)
return 0;
- if (enc_utf8) {
- /* Find the last character that is 10xx.xxxx */
- for (i = 0; (p[i + 1] & 0xc0) == 0x80; ++i)
- ;
- /* Check for illegal sequence. */
- for (j = 0; p - j > base; ++j)
- if ((p[-j] & 0xc0) != 0x80)
- break;
- if (utf8len_tab[p[-j]] != i + j + 1)
- return 0;
- return i;
+ // Find the last character that is 10xx.xxxx
+ for (i = 0; (p[i + 1] & 0xc0) == 0x80; i++) {}
+
+ // Check for illegal sequence.
+ for (j = 0; p - j > base; j++) {
+ if ((p[-j] & 0xc0) != 0x80) {
+ break;
+ }
}
- /* It can't be the first byte if a double-byte when not using DBCS, at the
- * end of the string or the byte can't start a double-byte. */
- if (enc_dbcs == 0 || p[1] == NUL || MB_BYTE2LEN(*p) == 1)
+ if (utf8len_tab[p[-j]] != i + j + 1) {
return 0;
-
- /* Return 1 when on the lead byte, 0 when on the tail byte. */
- return 1 - dbcs_head_off(base, p);
+ }
+ return i;
}
/*
@@ -2180,10 +1617,10 @@ void utf_find_illegal(void)
char_u *tofree = NULL;
vimconv.vc_type = CONV_NONE;
- if (enc_utf8 && (enc_canon_props(curbuf->b_p_fenc) & ENC_8BIT)) {
- /* 'encoding' is "utf-8" but we are editing a 8-bit encoded file,
- * possibly a utf-8 file with illegal bytes. Setup for conversion
- * from utf-8 to 'fileencoding'. */
+ if (enc_canon_props(curbuf->b_p_fenc) & ENC_8BIT) {
+ // 'encoding' is "utf-8" but we are editing a 8-bit encoded file,
+ // possibly a utf-8 file with illegal bytes. Setup for conversion
+ // from utf-8 to 'fileencoding'.
convert_setup(&vimconv, p_enc, curbuf->b_p_fenc);
}
@@ -2240,29 +1677,42 @@ theend:
*/
void mb_adjust_cursor(void)
{
- mb_adjustpos(curbuf, &curwin->w_cursor);
+ mark_mb_adjustpos(curbuf, &curwin->w_cursor);
}
-/*
- * Adjust position "*lp" to point to the first byte of a multi-byte character.
- * If it points to a tail byte it's moved backwards to the head byte.
- */
-void mb_adjustpos(buf_T *buf, pos_T *lp)
+/// Checks and adjusts cursor column. Not mode-dependent.
+/// @see check_cursor_col_win
+///
+/// @param win_ Places cursor on a valid column for this window.
+void mb_check_adjust_col(void *win_)
{
- char_u *p;
+ win_T *win = (win_T *)win_;
+ colnr_T oldcol = win->w_cursor.col;
- if (lp->col > 0
- || lp->coladd > 1
- ) {
- p = ml_get_buf(buf, lp->lnum, FALSE);
- lp->col -= (*mb_head_off)(p, p + lp->col);
- /* Reset "coladd" when the cursor would be on the right half of a
- * double-wide character. */
- if (lp->coladd == 1
- && p[lp->col] != TAB
- && vim_isprintc((*mb_ptr2char)(p + lp->col))
- && ptr2cells(p + lp->col) > 1)
- lp->coladd = 0;
+ // Column 0 is always valid.
+ if (oldcol != 0) {
+ char_u *p = ml_get_buf(win->w_buffer, win->w_cursor.lnum, false);
+ colnr_T len = (colnr_T)STRLEN(p);
+
+ // Empty line or invalid column?
+ if (len == 0 || oldcol < 0) {
+ win->w_cursor.col = 0;
+ } else {
+ // Cursor column too big for line?
+ if (oldcol > len) {
+ win->w_cursor.col = len - 1;
+ }
+ // Move the cursor to the head byte.
+ win->w_cursor.col -= utf_head_off(p, p + win->w_cursor.col);
+ }
+
+ // Reset `coladd` when the cursor would be on the right half of a
+ // double-wide character.
+ if (win->w_cursor.coladd == 1 && p[win->w_cursor.col] != TAB
+ && vim_isprintc(utf_ptr2char(p + win->w_cursor.col))
+ && ptr2cells(p + win->w_cursor.col) > 1) {
+ win->w_cursor.coladd = 0;
+ }
}
}
@@ -2274,8 +1724,9 @@ char_u * mb_prevptr(
char_u *p
)
{
- if (p > line)
- mb_ptr_back(line, p);
+ if (p > line) {
+ MB_PTR_BACK(line, p);
+ }
return p;
}
@@ -2311,85 +1762,59 @@ int mb_charlen_len(char_u *str, int len)
return count;
}
-/*
- * Try to un-escape a multi-byte character.
- * Used for the "to" and "from" part of a mapping.
- * Return the un-escaped string if it is a multi-byte character, and advance
- * "pp" to just after the bytes that formed it.
- * Return NULL if no multi-byte char was found.
- */
-char_u * mb_unescape(char_u **pp)
-{
- static char_u buf[6];
- int n;
- int m = 0;
- char_u *str = *pp;
-
- /* Must translate K_SPECIAL KS_SPECIAL KE_FILLER to K_SPECIAL and CSI
- * KS_EXTRA KE_CSI to CSI.
- * Maximum length of a utf-8 character is 4 bytes. */
- for (n = 0; str[n] != NUL && m < 4; ++n) {
- if (str[n] == K_SPECIAL
- && str[n + 1] == KS_SPECIAL
- && str[n + 2] == KE_FILLER) {
- buf[m++] = K_SPECIAL;
- n += 2;
- } else if ((str[n] == K_SPECIAL
- )
- && str[n + 1] == KS_EXTRA
- && str[n + 2] == (int)KE_CSI) {
- buf[m++] = CSI;
- n += 2;
- } else if (str[n] == K_SPECIAL
- )
- break; /* a special key can't be a multibyte char */
- else
- buf[m++] = str[n];
- buf[m] = NUL;
+/// Try to unescape a multibyte character
+///
+/// Used for the rhs and lhs of the mappings.
+///
+/// @param[in,out] pp String to unescape. Is advanced to just after the bytes
+/// that form a multibyte character.
+///
+/// @return Unescaped string if it is a multibyte character, NULL if no
+/// multibyte character was found. Returns a static buffer, always one
+/// and the same.
+const char *mb_unescape(const char **const pp)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
+{
+ static char buf[6];
+ size_t buf_idx = 0;
+ uint8_t *str = (uint8_t *)(*pp);
+
+ // Must translate K_SPECIAL KS_SPECIAL KE_FILLER to K_SPECIAL and CSI
+ // KS_EXTRA KE_CSI to CSI.
+ // Maximum length of a utf-8 character is 4 bytes.
+ for (size_t str_idx = 0; str[str_idx] != NUL && buf_idx < 4; str_idx++) {
+ if (str[str_idx] == K_SPECIAL
+ && str[str_idx + 1] == KS_SPECIAL
+ && str[str_idx + 2] == KE_FILLER) {
+ buf[buf_idx++] = (char)K_SPECIAL;
+ str_idx += 2;
+ } else if ((str[str_idx] == K_SPECIAL)
+ && str[str_idx + 1] == KS_EXTRA
+ && str[str_idx + 2] == KE_CSI) {
+ buf[buf_idx++] = (char)CSI;
+ str_idx += 2;
+ } else if (str[str_idx] == K_SPECIAL) {
+ break; // A special key can't be a multibyte char.
+ } else {
+ buf[buf_idx++] = (char)str[str_idx];
+ }
+ buf[buf_idx] = NUL;
- /* Return a multi-byte character if it's found. An illegal sequence
- * will result in a 1 here. */
- if ((*mb_ptr2len)(buf) > 1) {
- *pp = str + n + 1;
+ // Return a multi-byte character if it's found. An illegal sequence
+ // will result in a 1 here.
+ if (utf_ptr2len((const char_u *)buf) > 1) {
+ *pp = (const char *)str + str_idx + 1;
return buf;
}
- /* Bail out quickly for ASCII. */
- if (buf[0] < 128)
+ // Bail out quickly for ASCII.
+ if ((uint8_t)buf[0] < 128) {
break;
+ }
}
return NULL;
}
-/*
- * Return true if the character at "row"/"col" on the screen is the left side
- * of a double-width character.
- * Caller must make sure "row" and "col" are not invalid!
- */
-bool mb_lefthalve(int row, int col)
-{
- return (*mb_off2cells)(LineOffset[row] + col,
- LineOffset[row] + screen_Columns) > 1;
-}
-
-/*
- * Correct a position on the screen, if it's the right half of a double-wide
- * char move it to the left half. Returns the corrected column.
- */
-int mb_fix_col(int col, int row)
-{
- col = check_col(col);
- row = check_row(row);
- if (has_mbyte && ScreenLines != NULL && col > 0
- && ((enc_dbcs
- && ScreenLines[LineOffset[row] + col] != NUL
- && dbcs_screen_head_off(ScreenLines + LineOffset[row],
- ScreenLines + LineOffset[row] + col))
- || (enc_utf8 && ScreenLines[LineOffset[row] + col] == 0)))
- return col - 1;
- return col;
-}
-
/*
* Skip the Vim specific head of a 'encoding' name.
@@ -2515,36 +1940,39 @@ char_u * enc_locale(void)
return NULL;
}
- /* The most generic locale format is:
- * language[_territory][.codeset][@modifier][+special][,[sponsor][_revision]]
- * If there is a '.' remove the part before it.
- * if there is something after the codeset, remove it.
- * Make the name lowercase and replace '_' with '-'.
- * Exception: "ja_JP.EUC" == "euc-jp", "zh_CN.EUC" = "euc-cn",
- * "ko_KR.EUC" == "euc-kr"
- */
+ // The most generic locale format is:
+ // language[_territory][.codeset][@modifier][+special][,[sponsor][_revision]]
+ // If there is a '.' remove the part before it.
+ // if there is something after the codeset, remove it.
+ // Make the name lowercase and replace '_' with '-'.
+ // Exception: "ja_JP.EUC" == "euc-jp", "zh_CN.EUC" = "euc-cn",
+ // "ko_KR.EUC" == "euc-kr"
const char *p = (char *)vim_strchr((char_u *)s, '.');
if (p != NULL) {
if (p > s + 2 && !STRNICMP(p + 1, "EUC", 3)
&& !isalnum((int)p[4]) && p[4] != '-' && p[-3] == '_') {
- /* copy "XY.EUC" to "euc-XY" to buf[10] */
- strcpy(buf + 10, "euc-");
- buf[14] = p[-2];
- buf[15] = p[-1];
- buf[16] = 0;
- s = buf + 10;
- } else
+ // Copy "XY.EUC" to "euc-XY" to buf[10].
+ memmove(buf, "euc-", 4);
+ buf[4] = (ASCII_ISALNUM(p[-2]) ? TOLOWER_ASC(p[-2]) : 0);
+ buf[5] = (ASCII_ISALNUM(p[-1]) ? TOLOWER_ASC(p[-1]) : 0);
+ buf[6] = NUL;
+ } else {
s = p + 1;
+ goto enc_locale_copy_enc;
+ }
+ } else {
+enc_locale_copy_enc:
+ for (i = 0; i < (int)sizeof(buf) - 1 && s[i] != NUL; i++) {
+ if (s[i] == '_' || s[i] == '-') {
+ buf[i] = '-';
+ } else if (ASCII_ISALNUM((uint8_t)s[i])) {
+ buf[i] = TOLOWER_ASC(s[i]);
+ } else {
+ break;
+ }
+ }
+ buf[i] = NUL;
}
- for (i = 0; s[i] != NUL && i < (int)sizeof(buf) - 1; ++i) {
- if (s[i] == '_' || s[i] == '-')
- buf[i] = '-';
- else if (isalnum((int)s[i]))
- buf[i] = TOLOWER_ASC(s[i]);
- else
- break;
- }
- buf[i] = NUL;
return enc_canonize((char_u *)buf);
}
@@ -2571,9 +1999,10 @@ void * my_iconv_open(char_u *to, char_u *from)
return (void *)-1; /* detected a broken iconv() previously */
#ifdef DYNAMIC_ICONV
- /* Check if the iconv.dll can be found. */
- if (!iconv_enabled(true))
+ // Check if the iconv.dll can be found.
+ if (!iconv_enabled(true)) {
return (void *)-1;
+ }
#endif
fd = iconv_open((char *)enc_skip(to), (char *)enc_skip(from));
@@ -2607,8 +2036,8 @@ void * my_iconv_open(char_u *to, char_u *from)
* Returns the converted string in allocated memory. NULL for an error.
* If resultlenp is not NULL, sets it to the result length in bytes.
*/
-static char_u * iconv_string(vimconv_T *vcp, char_u *str, size_t slen,
- size_t *unconvlenp, size_t *resultlenp)
+static char_u *iconv_string(const vimconv_T *const vcp, char_u *str,
+ size_t slen, size_t *unconvlenp, size_t *resultlenp)
{
const char *from;
size_t fromlen;
@@ -2662,15 +2091,10 @@ static char_u * iconv_string(vimconv_T *vcp, char_u *str, size_t slen,
* conversion from 'encoding' to something else. In other
* situations we don't know what to skip anyway. */
*to++ = '?';
- if ((*mb_ptr2cells)((char_u *)from) > 1)
+ if (utf_ptr2cells((char_u *)from) > 1) {
*to++ = '?';
- if (enc_utf8)
- l = utfc_ptr2len_len((const char_u *)from, (int)fromlen);
- else {
- l = (*mb_ptr2len)((char_u *)from);
- if (l > (int)fromlen)
- l = (int)fromlen;
}
+ l = utfc_ptr2len_len((const char_u *)from, (int)fromlen);
from += l;
fromlen -= l;
} else if (ICONV_ERRNO != ICONV_E2BIG) {
@@ -2701,7 +2125,7 @@ static HINSTANCE hMsvcrtDLL = 0;
# ifndef DYNAMIC_ICONV_DLL
# define DYNAMIC_ICONV_DLL "iconv.dll"
-# define DYNAMIC_ICONV_DLL_ALT "libiconv.dll"
+# define DYNAMIC_ICONV_DLL_ALT "libiconv-2.dll"
# endif
# ifndef DYNAMIC_MSVCRT_DLL
# define DYNAMIC_MSVCRT_DLL "msvcrt.dll"
@@ -2747,6 +2171,35 @@ static void * get_iconv_import_func(HINSTANCE hInst,
return NULL;
}
+// Load library "name".
+HINSTANCE vimLoadLib(char *name)
+{
+ HINSTANCE dll = NULL;
+
+ // NOTE: Do not use mch_dirname() and mch_chdir() here, they may call
+ // vimLoadLib() recursively, which causes a stack overflow.
+ wchar_t old_dirw[MAXPATHL];
+
+ // Path to exe dir.
+ char *buf = xstrdup((char *)get_vim_var_str(VV_PROGPATH));
+ // ptrdiff_t len = ;
+ // assert(len > 0);
+ buf[path_tail_with_sep(buf) - buf] = '\0';
+
+ if (GetCurrentDirectoryW(MAXPATHL, old_dirw) != 0) {
+ // Change directory to where the executable is, both to make
+ // sure we find a .dll there and to avoid looking for a .dll
+ // in the current directory.
+ SetCurrentDirectory((LPCSTR)buf);
+ // TODO(justinmk): use uv_dlopen instead. see os_libcall
+ dll = LoadLibrary(name);
+ SetCurrentDirectoryW(old_dirw);
+ }
+
+ return dll;
+}
+
+
/*
* Try opening the iconv.dll and return TRUE if iconv() can be used.
*/
@@ -2794,10 +2247,13 @@ bool iconv_enabled(bool verbose)
void iconv_end(void)
{
- if (hIconvDLL != 0)
+ if (hIconvDLL != 0) {
+ // TODO(justinmk): use uv_dlclose instead.
FreeLibrary(hIconvDLL);
- if (hMsvcrtDLL != 0)
+ }
+ if (hMsvcrtDLL != 0) {
FreeLibrary(hMsvcrtDLL);
+ }
hIconvDLL = 0;
hMsvcrtDLL = 0;
}
@@ -2839,9 +2295,7 @@ int convert_setup_ext(vimconv_T *vcp, char_u *from, bool from_unicode_is_utf8,
if (vcp->vc_type == CONV_ICONV && vcp->vc_fd != (iconv_t)-1)
iconv_close(vcp->vc_fd);
# endif
- vcp->vc_type = CONV_NONE;
- vcp->vc_factor = 1;
- vcp->vc_fail = false;
+ *vcp = (vimconv_T)MBYTE_NONE_CONV;
/* No conversion when one of the names is empty or they are equal. */
if (from == NULL || *from == NUL || to == NULL || *to == NUL
@@ -2899,7 +2353,7 @@ int convert_setup_ext(vimconv_T *vcp, char_u *from, bool from_unicode_is_utf8,
* Illegal chars are often changed to "?", unless vcp->vc_fail is set.
* When something goes wrong, NULL is returned and "*lenp" is unchanged.
*/
-char_u * string_convert(vimconv_T *vcp, char_u *ptr, size_t *lenp)
+char_u *string_convert(const vimconv_T *const vcp, char_u *ptr, size_t *lenp)
{
return string_convert_ext(vcp, ptr, lenp, NULL);
}
@@ -2909,7 +2363,7 @@ char_u * string_convert(vimconv_T *vcp, char_u *ptr, size_t *lenp)
* an incomplete sequence at the end it is not converted and "*unconvlenp" is
* set to the number of remaining bytes.
*/
-char_u * string_convert_ext(vimconv_T *vcp, char_u *ptr,
+char_u * string_convert_ext(const vimconv_T *const vcp, char_u *ptr,
size_t *lenp, size_t *unconvlenp)
{
char_u *retval = NULL;
@@ -3037,23 +2491,3 @@ char_u * string_convert_ext(vimconv_T *vcp, char_u *ptr,
return retval;
}
-
-// Check bounds for column number
-static int check_col(int col)
-{
- if (col < 0)
- return 0;
- if (col >= screen_Columns)
- return screen_Columns - 1;
- return col;
-}
-
-// Check bounds for row number
-static int check_row(int row)
-{
- if (row < 0)
- return 0;
- if (row >= screen_Rows)
- return screen_Rows - 1;
- return row;
-}
diff --git a/src/nvim/mbyte.h b/src/nvim/mbyte.h
index 0cfe2c4bab..ed48705c6d 100644
--- a/src/nvim/mbyte.h
+++ b/src/nvim/mbyte.h
@@ -1,7 +1,14 @@
#ifndef NVIM_MBYTE_H
#define NVIM_MBYTE_H
+#include <stdint.h>
#include <stdbool.h>
+#include <string.h>
+
+#include "nvim/iconv.h"
+#include "nvim/func_attr.h"
+#include "nvim/os/os_defs.h" // For indirect
+#include "nvim/types.h" // for char_u
/*
* Return byte length of character that starts with byte "b".
@@ -9,8 +16,11 @@
* MB_BYTE2LEN_CHECK() can be used to count a special key as one byte.
* Don't call MB_BYTE2LEN(b) with b < 0 or b > 255!
*/
-#define MB_BYTE2LEN(b) mb_bytelen_tab[b]
-#define MB_BYTE2LEN_CHECK(b) (((b) < 0 || (b) > 255) ? 1 : mb_bytelen_tab[b])
+#define MB_BYTE2LEN(b) utf8len_tab[b]
+#define MB_BYTE2LEN_CHECK(b) (((b) < 0 || (b) > 255) ? 1 : utf8len_tab[b])
+
+// max length of an unicode char
+#define MB_MAXCHAR 6
/* properties used in enc_canon_table[] (first three mutually exclusive) */
#define ENC_8BIT 0x01
@@ -28,7 +38,56 @@
#define ENC_LATIN9 0x400 /* Latin9 */
#define ENC_MACROMAN 0x800 /* Mac Roman (not Macro Man! :-) */
+// TODO(bfredl): eventually we should keep only one of the namings
+#define mb_ptr2len utfc_ptr2len
+#define mb_char2len utf_char2len
+#define mb_char2cells utf_char2cells
+
+/// Flags for vimconv_T
+typedef enum {
+ CONV_NONE = 0,
+ CONV_TO_UTF8 = 1,
+ CONV_9_TO_UTF8 = 2,
+ CONV_TO_LATIN1 = 3,
+ CONV_TO_LATIN9 = 4,
+ CONV_ICONV = 5,
+} ConvFlags;
+
+#define MBYTE_NONE_CONV { \
+ .vc_type = CONV_NONE, \
+ .vc_factor = 1, \
+ .vc_fail = false, \
+}
+
+/// Structure used for string conversions
+typedef struct {
+ int vc_type; ///< Zero or more ConvFlags.
+ int vc_factor; ///< Maximal expansion factor.
+# ifdef USE_ICONV
+ iconv_t vc_fd; ///< Value for CONV_ICONV.
+# endif
+ bool vc_fail; ///< What to do with invalid characters: if true, fail,
+ ///< otherwise use '?'.
+} vimconv_T;
+
+extern const uint8_t utf8len_tab_zero[256];
+
+extern const uint8_t utf8len_tab[256];
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "mbyte.h.generated.h"
#endif
+
+static inline int mb_strcmp_ic(bool ic, const char *s1, const char *s2)
+ REAL_FATTR_NONNULL_ALL REAL_FATTR_PURE REAL_FATTR_WARN_UNUSED_RESULT;
+
+/// Compare strings
+///
+/// @param[in] ic True if case is to be ignored.
+///
+/// @return 0 if s1 == s2, <0 if s1 < s2, >0 if s1 > s2.
+static inline int mb_strcmp_ic(bool ic, const char *s1, const char *s2)
+{
+ return (ic ? mb_stricmp(s1, s2) : strcmp(s1, s2));
+}
#endif // NVIM_MBYTE_H
diff --git a/src/nvim/memfile.c b/src/nvim/memfile.c
index 9fb03c4ac7..0a16f8aafb 100644
--- a/src/nvim/memfile.c
+++ b/src/nvim/memfile.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/// An abstraction to handle blocks of memory which can be stored in a file.
/// This is the implementation of a sort of virtual memory.
///
@@ -48,18 +51,16 @@
#include "nvim/fileio.h"
#include "nvim/memline.h"
#include "nvim/message.h"
-#include "nvim/misc2.h"
#include "nvim/memory.h"
#include "nvim/os_unix.h"
#include "nvim/path.h"
+#include "nvim/assert.h"
#include "nvim/os/os.h"
#include "nvim/os/input.h"
#define MEMFILE_PAGE_SIZE 4096 /// default page size
-static size_t total_mem_used = 0; /// total memory used for memfiles
-
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "memfile.c.generated.h"
#endif
@@ -76,7 +77,7 @@ static size_t total_mem_used = 0; /// total memory used for memfiles
/// @param flags Flags for open() call.
///
/// @return - The open memory file, on success.
-/// - NULL, on failure.
+/// - NULL, on failure (e.g. file does not exist).
memfile_T *mf_open(char_u *fname, int flags)
{
memfile_T *mfp = xmalloc(sizeof(memfile_T));
@@ -96,7 +97,6 @@ memfile_T *mf_open(char_u *fname, int flags)
mfp->mf_used_first = NULL; // used list is empty
mfp->mf_used_last = NULL;
mfp->mf_dirty = false;
- mfp->mf_used_count = 0;
mf_hash_init(&mfp->mf_hash);
mf_hash_init(&mfp->mf_trans);
mfp->mf_page_size = MEMFILE_PAGE_SIZE;
@@ -106,23 +106,24 @@ memfile_T *mf_open(char_u *fname, int flags)
if (mfp->mf_fd >= 0 && os_fileinfo_fd(mfp->mf_fd, &file_info)) {
uint64_t blocksize = os_fileinfo_blocksize(&file_info);
if (blocksize >= MIN_SWAP_PAGE_SIZE && blocksize <= MAX_SWAP_PAGE_SIZE) {
- assert(blocksize <= UINT_MAX);
+ STATIC_ASSERT(MAX_SWAP_PAGE_SIZE <= UINT_MAX,
+ "MAX_SWAP_PAGE_SIZE must fit into an unsigned");
mfp->mf_page_size = (unsigned)blocksize;
}
}
- off_t size;
+ off_T size;
// When recovering, the actual block size will be retrieved from block 0
// in ml_recover(). The size used here may be wrong, therefore mf_blocknr_max
// must be rounded up.
if (mfp->mf_fd < 0
|| (flags & (O_TRUNC|O_EXCL))
- || (size = lseek(mfp->mf_fd, (off_t)0L, SEEK_END)) <= 0) {
+ || (size = vim_lseek(mfp->mf_fd, 0L, SEEK_END)) <= 0) {
// no file or empty file
mfp->mf_blocknr_max = 0;
} else {
- assert(sizeof(off_t) <= sizeof(blocknr_T)
+ assert(sizeof(off_T) <= sizeof(blocknr_T)
&& mfp->mf_page_size > 0
&& mfp->mf_page_size - 1 <= INT64_MAX - size);
mfp->mf_blocknr_max = (((blocknr_T)size + mfp->mf_page_size - 1)
@@ -132,25 +133,6 @@ memfile_T *mf_open(char_u *fname, int flags)
mfp->mf_neg_count = 0;
mfp->mf_infile_count = mfp->mf_blocknr_max;
- // Compute maximum number of pages ('maxmem' is in Kbytes):
- // 'mammem' * 1Kbyte / page-size-in-bytes.
- // Avoid overflow by first reducing page size as much as possible.
- {
- int shift = 10;
- unsigned page_size = mfp->mf_page_size;
-
- while (shift > 0 && (page_size & 1) == 0) {
- page_size /= 2;
- --shift;
- }
-
- assert(p_mm <= LONG_MAX >> shift); // check we don't overflow
- assert((uintmax_t)(p_mm << shift) <= UINT_MAX); // check we can cast safely
- mfp->mf_used_count_max = (unsigned)(p_mm << shift) / page_size;
- if (mfp->mf_used_count_max < 10)
- mfp->mf_used_count_max = 10;
- }
-
return mfp;
}
@@ -194,7 +176,6 @@ void mf_close(memfile_T *mfp, bool del_file)
// free entries in used list
for (bhdr_T *hp = mfp->mf_used_first, *nextp; hp != NULL; hp = nextp) {
- total_mem_used -= hp->bh_page_count * mfp->mf_page_size;
nextp = hp->bh_next;
mf_free_bhdr(hp);
}
@@ -219,12 +200,9 @@ void mf_close_file(buf_T *buf, bool getlines)
if (getlines) {
// get all blocks in memory by accessing all lines (clumsy!)
- mf_dont_release = true;
- for (linenr_T lnum = 1; lnum <= buf->b_ml.ml_line_count; ++lnum) {
+ for (linenr_T lnum = 1; lnum <= buf->b_ml.ml_line_count; lnum++) {
(void)ml_get_buf(buf, lnum, false);
}
- mf_dont_release = false;
- // TODO(elmart): should check if all blocks are really in core
}
if (close(mfp->mf_fd) < 0) { // close the file
@@ -242,13 +220,6 @@ void mf_close_file(buf_T *buf, bool getlines)
/// and the size it indicates differs from what was guessed.
void mf_new_page_size(memfile_T *mfp, unsigned new_size)
{
- // Correct the memory used for block 0 to the new size, because it will be
- // freed with that size later on.
- if (new_size >= mfp->mf_page_size) {
- total_mem_used += new_size - mfp->mf_page_size;
- } else {
- total_mem_used -= mfp->mf_page_size - new_size;
- }
mfp->mf_page_size = new_size;
}
@@ -258,10 +229,7 @@ void mf_new_page_size(memfile_T *mfp, unsigned new_size)
/// @param page_count Desired number of pages.
bhdr_T *mf_new(memfile_T *mfp, bool negative, unsigned page_count)
{
- // If we reached the maximum size for the used memory blocks, release one.
- // If a bhdr_T is returned, use it and adjust the page_count if necessary.
- // If no bhdr_T is returned, a new one will be created.
- bhdr_T *hp = mf_release(mfp, page_count); // the block to be returned
+ bhdr_T *hp = NULL;
// Decide on the number to use:
// If there is a free block, use its number.
@@ -269,34 +237,22 @@ bhdr_T *mf_new(memfile_T *mfp, bool negative, unsigned page_count)
// a positive number.
bhdr_T *freep = mfp->mf_free_first; // first free block
if (!negative && freep != NULL && freep->bh_page_count >= page_count) {
- // If the block in the free list has more pages, take only the number
- // of pages needed and allocate a new bhdr_T with data.
- //
- // If the number of pages matches and mf_release() did not return a
- // bhdr_T, use the bhdr_T from the free list and allocate the data.
- //
- // If the number of pages matches and mf_release() returned a bhdr_T,
- // just use the number and free the bhdr_T from the free list
if (freep->bh_page_count > page_count) {
- if (hp == NULL) {
- hp = mf_alloc_bhdr(mfp, page_count);
- }
+ // If the block in the free list has more pages, take only the number
+ // of pages needed and allocate a new bhdr_T with data.
+ hp = mf_alloc_bhdr(mfp, page_count);
hp->bh_bnum = freep->bh_bnum;
freep->bh_bnum += page_count;
freep->bh_page_count -= page_count;
- } else if (hp == NULL) { // need to allocate memory for this block
+ } else { // need to allocate memory for this block
+ // If the number of pages matches use the bhdr_T from the free list and
+ // allocate the data.
void *p = xmalloc(mfp->mf_page_size * page_count);
hp = mf_rem_free(mfp);
hp->bh_data = p;
- } else { // use the number, remove entry from free list
- freep = mf_rem_free(mfp);
- hp->bh_bnum = freep->bh_bnum;
- xfree(freep);
}
} else { // get a new number
- if (hp == NULL) {
- hp = mf_alloc_bhdr(mfp, page_count);
- }
+ hp = mf_alloc_bhdr(mfp, page_count);
if (negative) {
hp->bh_bnum = mfp->mf_blocknr_min--;
mfp->mf_neg_count++;
@@ -337,13 +293,7 @@ bhdr_T *mf_get(memfile_T *mfp, blocknr_T nr, unsigned page_count)
// could check here if the block is in the free list
- // Check if we need to flush an existing block.
- // If so, use that block.
- // If not, allocate a new block.
- hp = mf_release(mfp, page_count);
- if (hp == NULL) {
- hp = mf_alloc_bhdr(mfp, page_count);
- }
+ hp = mf_alloc_bhdr(mfp, page_count);
hp->bh_bnum = nr;
hp->bh_flags = 0;
@@ -372,8 +322,9 @@ void mf_put(memfile_T *mfp, bhdr_T *hp, bool dirty, bool infile)
{
unsigned flags = hp->bh_flags;
- if ((flags & BH_LOCKED) == 0)
- EMSG(_("E293: block was not locked"));
+ if ((flags & BH_LOCKED) == 0) {
+ IEMSG(_("E293: block was not locked"));
+ }
flags &= ~BH_LOCKED;
if (dirty) {
flags |= BH_DIRTY;
@@ -509,8 +460,6 @@ static void mf_ins_used(memfile_T *mfp, bhdr_T *hp)
} else {
hp->bh_next->bh_prev = hp;
}
- mfp->mf_used_count += hp->bh_page_count;
- total_mem_used += hp->bh_page_count * mfp->mf_page_size;
}
/// Remove block from memfile's used list.
@@ -525,82 +474,6 @@ static void mf_rem_used(memfile_T *mfp, bhdr_T *hp)
mfp->mf_used_first = hp->bh_next;
else
hp->bh_prev->bh_next = hp->bh_next;
-
- mfp->mf_used_count -= hp->bh_page_count;
- total_mem_used -= hp->bh_page_count * mfp->mf_page_size;
-}
-
-/// Try to release the least recently used block from the used list if the
-/// number of used memory blocks gets too big.
-///
-/// @return The block header, when release needed and possible.
-/// Resulting block header includes memory block, so it can be
-/// reused. Page count is checked to be right.
-/// NULL, when release not needed, or not possible.
-/// Not needed when number of blocks less than allowed maximum and
-/// total memory used below 'maxmemtot'.
-/// Not possible when:
-/// - Called while closing file.
-/// - Tried to create swap file but couldn't.
-/// - All blocks are locked.
-/// - Unlocked dirty block found, but flush failed.
-static bhdr_T *mf_release(memfile_T *mfp, unsigned page_count)
-{
- // don't release while in mf_close_file()
- if (mf_dont_release)
- return NULL;
-
- /// Need to release a block if the number of blocks for this memfile is
- /// higher than the maximum one or total memory used is over 'maxmemtot'.
- bool need_release = (mfp->mf_used_count >= mfp->mf_used_count_max
- || (total_mem_used >> 10) >= (size_t)p_mmt);
-
- /// Try to create swap file if the amount of memory used is getting too high.
- if (mfp->mf_fd < 0 && need_release && p_uc) {
- // find for which buffer this memfile is
- buf_T *buf = NULL;
- FOR_ALL_BUFFERS(bp) {
- if (bp->b_ml.ml_mfp == mfp) {
- buf = bp;
- break;
- }
- }
- if (buf != NULL && buf->b_may_swap) {
- ml_open_file(buf);
- }
- }
-
- /// Don't release a block if:
- /// there is no file for this memfile
- /// or
- /// the number of blocks for this memfile is lower than the maximum
- /// and
- /// total memory used is not up to 'maxmemtot'
- if (mfp->mf_fd < 0 || !need_release)
- return NULL;
-
- bhdr_T *hp;
- for (hp = mfp->mf_used_last; hp != NULL; hp = hp->bh_prev)
- if (!(hp->bh_flags & BH_LOCKED))
- break;
- if (hp == NULL) // not a single one that can be released
- return NULL;
-
- // If the block is dirty, write it.
- // If the write fails we don't free it.
- if ((hp->bh_flags & BH_DIRTY) && mf_write(mfp, hp) == FAIL)
- return NULL;
-
- mf_rem_used(mfp, hp);
- mf_rem_hash(mfp, hp);
-
- /// Make sure page_count of bh_data is right.
- if (hp->bh_page_count != page_count) {
- xfree(hp->bh_data);
- hp->bh_data = xmalloc(mfp->mf_page_size * page_count);
- hp->bh_page_count = page_count;
- }
- return hp;
}
/// Release as many blocks as possible.
@@ -685,9 +558,9 @@ static int mf_read(memfile_T *mfp, bhdr_T *hp)
return FAIL;
unsigned page_size = mfp->mf_page_size;
- // TODO(elmart): Check (page_size * hp->bh_bnum) within off_t bounds.
- off_t offset = (off_t)(page_size * hp->bh_bnum);
- if (lseek(mfp->mf_fd, offset, SEEK_SET) != offset) {
+ // TODO(elmart): Check (page_size * hp->bh_bnum) within off_T bounds.
+ off_T offset = (off_T)(page_size * hp->bh_bnum);
+ if (vim_lseek(mfp->mf_fd, offset, SEEK_SET) != offset) {
PERROR(_("E294: Seek error in swap file read"));
return FAIL;
}
@@ -712,7 +585,7 @@ static int mf_read(memfile_T *mfp, bhdr_T *hp)
/// - Write error in swap file.
static int mf_write(memfile_T *mfp, bhdr_T *hp)
{
- off_t offset; // offset in the file
+ off_T offset; // offset in the file
blocknr_T nr; // block nr which is being written
bhdr_T *hp2;
unsigned page_size; // number of bytes in a page
@@ -741,9 +614,9 @@ static int mf_write(memfile_T *mfp, bhdr_T *hp)
hp2 = hp;
}
- // TODO(elmart): Check (page_size * nr) within off_t bounds.
- offset = (off_t)(page_size * nr);
- if (lseek(mfp->mf_fd, offset, SEEK_SET) != offset) {
+ // TODO(elmart): Check (page_size * nr) within off_T bounds.
+ offset = (off_T)(page_size * nr);
+ if (vim_lseek(mfp->mf_fd, offset, SEEK_SET) != offset) {
PERROR(_("E296: Seek error in swap file write"));
return FAIL;
}
@@ -891,6 +764,7 @@ static bool mf_do_open(memfile_T *mfp, char_u *fname, int flags)
{
// fname cannot be NameBuff, because it must have been allocated.
mf_set_fnames(mfp, fname);
+ assert(mfp->mf_fname != NULL);
/// Extra security check: When creating a swap file it really shouldn't
/// exist yet. If there is a symbolic link, this is most likely an attack.
@@ -910,12 +784,7 @@ static bool mf_do_open(memfile_T *mfp, char_u *fname, int flags)
return false;
}
-#ifdef HAVE_FD_CLOEXEC
- int fdflags = fcntl(mfp->mf_fd, F_GETFD);
- if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0) {
- (void)fcntl(mfp->mf_fd, F_SETFD, fdflags | FD_CLOEXEC);
- }
-#endif
+ (void)os_set_cloexec(mfp->mf_fd);
#ifdef HAVE_SELINUX
mch_copy_sec(fname, mfp->mf_fname);
#endif
diff --git a/src/nvim/memfile_defs.h b/src/nvim/memfile_defs.h
index cc71e1a7ff..2402d2147d 100644
--- a/src/nvim/memfile_defs.h
+++ b/src/nvim/memfile_defs.h
@@ -3,8 +3,10 @@
#include <stdint.h>
#include <stdbool.h>
+#include <stdlib.h>
#include "nvim/types.h"
+#include "nvim/pos.h"
/// A block number.
///
@@ -54,7 +56,6 @@ typedef struct mf_hashtab {
///
/// The used list is a doubly linked list, most recently used block first.
/// The blocks in the used list have a block of memory allocated.
-/// mf_used_count is the number of pages in the used list.
/// The hash lists are used to quickly find a block in the used list.
/// The free list is a single linked list, not sorted.
/// The blocks in the free list have no block of memory allocated and
@@ -93,8 +94,6 @@ typedef struct memfile {
bhdr_T *mf_free_first; /// first block header in free list
bhdr_T *mf_used_first; /// mru block header in used list
bhdr_T *mf_used_last; /// lru block header in used list
- unsigned mf_used_count; /// number of pages in used list
- unsigned mf_used_count_max; /// maximum number of pages in memory
mf_hashtab_T mf_hash; /// hash lists
mf_hashtab_T mf_trans; /// trans lists
blocknr_T mf_blocknr_max; /// highest positive block number + 1
diff --git a/src/nvim/memline.c b/src/nvim/memline.c
index 673205f08f..4c4f7d65bd 100644
--- a/src/nvim/memline.c
+++ b/src/nvim/memline.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/* for debugging */
/* #define CHECK(c, s) if (c) EMSG(s) */
#define CHECK(c, s)
@@ -46,6 +49,7 @@
#include "nvim/buffer.h"
#include "nvim/cursor.h"
#include "nvim/eval.h"
+#include "nvim/getchar.h"
#include "nvim/fileio.h"
#include "nvim/func_attr.h"
#include "nvim/main.h"
@@ -55,7 +59,6 @@
#include "nvim/memory.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/option.h"
#include "nvim/os_unix.h"
#include "nvim/path.h"
@@ -244,7 +247,6 @@ typedef enum {
*/
int ml_open(buf_T *buf)
{
- memfile_T *mfp;
bhdr_T *hp = NULL;
ZERO_BL *b0p;
PTR_BL *pp;
@@ -273,12 +275,11 @@ int ml_open(buf_T *buf)
buf->b_may_swap = false;
}
- /*
- * Open the memfile. No swap file is created yet.
- */
- mfp = mf_open(NULL, 0);
- if (mfp == NULL)
+ // Open the memfile. No swap file is created yet.
+ memfile_T *mfp = mf_open(NULL, 0);
+ if (mfp == NULL) {
goto error;
+ }
buf->b_ml.ml_mfp = mfp;
buf->b_ml.ml_flags = ML_EMPTY;
@@ -291,7 +292,7 @@ int ml_open(buf_T *buf)
*/
hp = mf_new(mfp, false, 1);
if (hp->bh_bnum != 0) {
- EMSG(_("E298: Didn't get block nr 0?"));
+ IEMSG(_("E298: Didn't get block nr 0?"));
goto error;
}
b0p = hp->bh_data;
@@ -333,7 +334,7 @@ int ml_open(buf_T *buf)
if ((hp = ml_new_ptr(mfp)) == NULL)
goto error;
if (hp->bh_bnum != 1) {
- EMSG(_("E298: Didn't get block nr 1?"));
+ IEMSG(_("E298: Didn't get block nr 1?"));
goto error;
}
pp = hp->bh_data;
@@ -349,7 +350,7 @@ int ml_open(buf_T *buf)
*/
hp = ml_new_data(mfp, FALSE, 1);
if (hp->bh_bnum != 2) {
- EMSG(_("E298: Didn't get block nr 2?"));
+ IEMSG(_("E298: Didn't get block nr 2?"));
goto error;
}
@@ -363,9 +364,10 @@ int ml_open(buf_T *buf)
error:
if (mfp != NULL) {
- if (hp)
+ if (hp) {
mf_put(mfp, hp, false, false);
- mf_close(mfp, true); /* will also xfree(mfp->mf_fname) */
+ }
+ mf_close(mfp, true); // will also xfree(mfp->mf_fname)
}
buf->b_ml.ml_mfp = NULL;
return FAIL;
@@ -440,14 +442,7 @@ void ml_setname(buf_T *buf)
EMSG(_("E301: Oops, lost the swap file!!!"));
return;
}
-#ifdef HAVE_FD_CLOEXEC
- {
- int fdflags = fcntl(mfp->mf_fd, F_GETFD);
- if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0) {
- (void)fcntl(mfp->mf_fd, F_SETFD, fdflags | FD_CLOEXEC);
- }
- }
-#endif
+ (void)os_set_cloexec(mfp->mf_fd);
}
if (!success)
EMSG(_("E302: Could not rename swap file"));
@@ -539,17 +534,20 @@ void ml_open_file(buf_T *buf)
buf->b_may_swap = false;
}
-/*
- * If still need to create a swap file, and starting to edit a not-readonly
- * file, or reading into an existing buffer, create a swap file now.
- */
-void
-check_need_swap (
- int newfile /* reading file into new buffer */
-)
+/// If still need to create a swap file, and starting to edit a not-readonly
+/// file, or reading into an existing buffer, create a swap file now.
+///
+/// @param newfile reading file into new buffer
+void check_need_swap(int newfile)
{
- if (curbuf->b_may_swap && (!curbuf->b_p_ro || !newfile))
+ int old_msg_silent = msg_silent; // might be reset by an E325 message
+ msg_silent = 0; // If swap dialog prompts for input, user needs to see it!
+
+ if (curbuf->b_may_swap && (!curbuf->b_p_ro || !newfile)) {
ml_open_file(curbuf);
+ }
+
+ msg_silent = old_msg_silent;
}
/*
@@ -624,7 +622,7 @@ static bool ml_check_b0_strings(ZERO_BL *b0p)
return (memchr(b0p->b0_version, NUL, 10)
&& memchr(b0p->b0_uname, NUL, B0_UNAME_SIZE)
&& memchr(b0p->b0_hname, NUL, B0_HNAME_SIZE)
- && memchr(b0p->b0_fname, NUL, B0_FNAME_SIZE_CRYPT));
+ && memchr(b0p->b0_fname, NUL, B0_FNAME_SIZE_CRYPT)); // -V512
}
/*
@@ -640,13 +638,14 @@ static void ml_upd_block0(buf_T *buf, upd_block0_T what)
if (mfp == NULL || (hp = mf_get(mfp, 0, 1)) == NULL)
return;
b0p = hp->bh_data;
- if (ml_check_b0_id(b0p) == FAIL)
- EMSG(_("E304: ml_upd_block0(): Didn't get block 0??"));
- else {
- if (what == UB_FNAME)
+ if (ml_check_b0_id(b0p) == FAIL) {
+ IEMSG(_("E304: ml_upd_block0(): Didn't get block 0??"));
+ } else {
+ if (what == UB_FNAME) {
set_b0_fname(b0p, buf);
- else /* what == UB_SAME_DIR */
+ } else { // what == UB_SAME_DIR
set_b0_dir_flag(b0p, buf);
+ }
}
mf_put(mfp, hp, true, false);
}
@@ -768,7 +767,7 @@ void ml_recover(void)
int idx;
int top;
int txt_start;
- off_t size;
+ off_T size;
int called_from_main;
int serious_error = TRUE;
long mtime;
@@ -777,19 +776,18 @@ void ml_recover(void)
recoverymode = TRUE;
called_from_main = (curbuf->b_ml.ml_mfp == NULL);
- attr = hl_attr(HLF_E);
+ attr = HL_ATTR(HLF_E);
- /*
- * If the file name ends in ".s[uvw][a-z]" we assume this is the swap file.
- * Otherwise a search is done to find the swap file(s).
- */
+ // If the file name ends in ".s[a-w][a-z]" we assume this is the swap file.
+ // Otherwise a search is done to find the swap file(s).
fname = curbuf->b_fname;
if (fname == NULL) /* When there is no file name */
fname = (char_u *)"";
len = (int)STRLEN(fname);
if (len >= 4
&& STRNICMP(fname + len - 4, ".s", 2) == 0
- && vim_strchr((char_u *)"UVWuvw", fname[len - 2]) != NULL
+ && vim_strchr((char_u *)"abcdefghijklmnopqrstuvw",
+ TOLOWER_ASC(fname[len - 2])) != NULL
&& ASCII_ISALPHA(fname[len - 1])) {
directly = TRUE;
fname_used = vim_strsave(fname); /* make a copy for mf_open() */
@@ -847,8 +845,7 @@ void ml_recover(void)
mfp = mf_open(fname_used, O_RDONLY);
fname_used = p;
if (mfp == NULL || mfp->mf_fd < 0) {
- if (fname_used != NULL)
- EMSG2(_("E306: Cannot open %s"), fname_used);
+ EMSG2(_("E306: Cannot open %s"), fname_used);
goto theend;
}
buf->b_ml.ml_mfp = mfp;
@@ -919,10 +916,11 @@ void ml_recover(void)
msg_end();
goto theend;
}
- if ((size = lseek(mfp->mf_fd, (off_t)0L, SEEK_END)) <= 0)
- mfp->mf_blocknr_max = 0; /* no file or empty file */
- else
+ if ((size = vim_lseek(mfp->mf_fd, (off_T)0L, SEEK_END)) <= 0) {
+ mfp->mf_blocknr_max = 0; // no file or empty file
+ } else {
mfp->mf_blocknr_max = size / mfp->mf_page_size;
+ }
mfp->mf_infile_count = mfp->mf_blocknr_max;
/* need to reallocate the memory used to store the data */
@@ -1000,7 +998,7 @@ void ml_recover(void)
if (b0_ff != 0)
set_fileformat(b0_ff - 1, OPT_LOCAL);
if (b0_fenc != NULL) {
- set_option_value((char_u *)"fenc", 0L, b0_fenc, OPT_LOCAL);
+ set_option_value("fenc", 0L, (char *)b0_fenc, OPT_LOCAL);
xfree(b0_fenc);
}
unchanged(curbuf, TRUE);
@@ -1064,11 +1062,12 @@ void ml_recover(void)
if (!cannot_open) {
line_count = pp->pb_pointer[idx].pe_line_count;
if (readfile(curbuf->b_ffname, NULL, lnum,
- pp->pb_pointer[idx].pe_old_lnum - 1,
- line_count, NULL, 0) == FAIL)
- cannot_open = TRUE;
- else
+ pp->pb_pointer[idx].pe_old_lnum - 1, line_count,
+ NULL, 0) != OK) {
+ cannot_open = true;
+ } else {
lnum += line_count;
+ }
}
if (cannot_open) {
++error;
@@ -1180,7 +1179,7 @@ void ml_recover(void)
* empty. Don't set the modified flag then. */
if (!(curbuf->b_ml.ml_line_count == 2 && *ml_get(1) == NUL)) {
changed_int();
- ++curbuf->b_changedtick;
+ buf_inc_changedtick(curbuf);
}
} else {
for (idx = 1; idx <= lnum; ++idx) {
@@ -1190,7 +1189,7 @@ void ml_recover(void)
xfree(p);
if (i != 0) {
changed_int();
- ++curbuf->b_changedtick;
+ buf_inc_changedtick(curbuf);
break;
}
}
@@ -1299,18 +1298,14 @@ recover_names (
msg_putchar('\n');
}
- /*
- * Do the loop for every directory in 'directory'.
- * First allocate some memory to put the directory name in.
- */
+ // Do the loop for every directory in 'directory'.
+ // First allocate some memory to put the directory name in.
dir_name = xmalloc(STRLEN(p_dir) + 1);
dirp = p_dir;
- while (dir_name != NULL && *dirp) {
- /*
- * Isolate a directory name from *dirp and put it in dir_name (we know
- * it is large enough, so use 31000 for length).
- * Advance dirp to next directory name.
- */
+ while (*dirp) {
+ // Isolate a directory name from *dirp and put it in dir_name (we know
+ // it is large enough, so use 31000 for length).
+ // Advance dirp to next directory name.
(void)copy_option_part(&dirp, dir_name, 31000, ",");
if (dir_name[0] == '.' && dir_name[1] == NUL) { /* check current dir */
@@ -1332,10 +1327,14 @@ recover_names (
names[2] = (char_u *)concat_fnames((char *)dir_name, ".sw?", TRUE);
num_names = 3;
} else {
- p = dir_name + STRLEN(dir_name);
- if (after_pathsep((char *)dir_name, (char *)p) && p[-1] == p[-2]) {
- /* Ends with '//', Use Full path for swap name */
- tail = (char_u *)make_percent_swname((char *)dir_name, (char *)fname_res);
+ int len = (int)STRLEN(dir_name);
+ p = dir_name + len;
+ if (after_pathsep((char *)dir_name, (char *)p)
+ && len > 1
+ && p[-1] == p[-2]) {
+ // Ends with '//', Use Full path for swap name
+ tail = (char_u *)make_percent_swname((char *)dir_name,
+ (char *)fname_res);
} else {
tail = path_tail(fname_res);
tail = (char_u *)concat_fnames((char *)dir_name, (char *)tail, TRUE);
@@ -1374,11 +1373,11 @@ recover_names (
*/
if (curbuf->b_ml.ml_mfp != NULL
&& (p = curbuf->b_ml.ml_mfp->mf_fname) != NULL) {
- for (int i = 0; i < num_files; ++i)
- if (path_full_compare(p, files[i], TRUE) & kEqualFiles) {
- /* Remove the name from files[i]. Move further entries
- * down. When the array becomes empty free it here, since
- * FreeWild() won't be called below. */
+ for (int i = 0; i < num_files; i++) {
+ if (path_full_compare(p, files[i], true) & kEqualFiles) {
+ // Remove the name from files[i]. Move further entries
+ // down. When the array becomes empty free it here, since
+ // FreeWild() won't be called below.
xfree(files[i]);
if (--num_files == 0)
xfree(files);
@@ -1386,6 +1385,7 @@ recover_names (
for (; i < num_files; ++i)
files[i] = files[i + 1];
}
+ }
}
if (nr > 0) {
file_count += num_files;
@@ -1410,8 +1410,8 @@ recover_names (
for (int i = 0; i < num_files; ++i) {
/* print the swap file name */
msg_outnum((long)++file_count);
- MSG_PUTS(". ");
- msg_puts(path_tail(files[i]));
+ msg_puts(". ");
+ msg_puts((const char *)path_tail(files[i]));
msg_putchar('\n');
(void)swapfile_info(files[i]);
}
@@ -1441,7 +1441,7 @@ static char *make_percent_swname(const char *dir, char *name)
char *f = fix_fname(name != NULL ? name : "");
if (f != NULL) {
char *s = xstrdup(f);
- for (d = s; *d != NUL; mb_ptr_adv(d)) {
+ for (d = s; *d != NUL; MB_PTR_ADV(d)) {
if (vim_ispathsep(*d)) {
*d = '%';
}
@@ -1454,7 +1454,7 @@ static char *make_percent_swname(const char *dir, char *name)
}
#ifdef UNIX
-static int process_still_running;
+static bool process_still_running;
#endif
/*
@@ -1463,6 +1463,7 @@ static int process_still_running;
*/
static time_t swapfile_info(char_u *fname)
{
+ assert(fname != NULL);
int fd;
struct block0 b0;
time_t x = (time_t)0;
@@ -1531,8 +1532,8 @@ static time_t swapfile_info(char_u *fname)
msg_outnum(char_to_long(b0.b0_pid));
#if defined(UNIX)
if (kill((pid_t)char_to_long(b0.b0_pid), 0) == 0) {
- MSG_PUTS(_(" (still running)"));
- process_still_running = TRUE;
+ MSG_PUTS(_(" (STILL RUNNING)"));
+ process_still_running = true;
}
#endif
}
@@ -1590,7 +1591,7 @@ static int recov_file_names(char_u **names, char_u *path, int prepend_dot)
* If 'check_char' is TRUE, stop syncing when character becomes available, but
* always sync at least one block.
*/
-void ml_sync_all(int check_file, int check_char)
+void ml_sync_all(int check_file, int check_char, bool do_fsync)
{
FOR_ALL_BUFFERS(buf) {
if (buf->b_ml.ml_mfp == NULL || buf->b_ml.ml_mfp->mf_fname == NULL)
@@ -1609,16 +1610,17 @@ void ml_sync_all(int check_file, int check_char)
if (!os_fileinfo((char *)buf->b_ffname, &file_info)
|| file_info.stat.st_mtim.tv_sec != buf->b_mtime_read
|| os_fileinfo_size(&file_info) != buf->b_orig_size) {
- ml_preserve(buf, FALSE);
- did_check_timestamps = FALSE;
- need_check_timestamps = TRUE; /* give message later */
+ ml_preserve(buf, false, do_fsync);
+ did_check_timestamps = false;
+ need_check_timestamps = true; // give message later
}
}
if (buf->b_ml.ml_mfp->mf_dirty) {
(void)mf_sync(buf->b_ml.ml_mfp, (check_char ? MFS_STOP : 0)
- | (bufIsChanged(buf) ? MFS_FLUSH : 0));
- if (check_char && os_char_avail()) /* character available now */
+ | (do_fsync && bufIsChanged(buf) ? MFS_FLUSH : 0));
+ if (check_char && os_char_avail()) { // character available now
break;
+ }
}
}
}
@@ -1633,7 +1635,7 @@ void ml_sync_all(int check_file, int check_char)
*
* when message is TRUE the success of preserving is reported
*/
-void ml_preserve(buf_T *buf, int message)
+void ml_preserve(buf_T *buf, int message, bool do_fsync)
{
bhdr_T *hp;
linenr_T lnum;
@@ -1651,9 +1653,9 @@ void ml_preserve(buf_T *buf, int message)
* before. */
got_int = FALSE;
- ml_flush_line(buf); /* flush buffered line */
- (void)ml_find_line(buf, (linenr_T)0, ML_FLUSH); /* flush locked block */
- status = mf_sync(mfp, MFS_ALL | MFS_FLUSH);
+ ml_flush_line(buf); // flush buffered line
+ (void)ml_find_line(buf, (linenr_T)0, ML_FLUSH); // flush locked block
+ status = mf_sync(mfp, MFS_ALL | (do_fsync ? MFS_FLUSH : 0));
/* stack is invalid after mf_sync(.., MFS_ALL) */
buf->b_ml.ml_stack_top = 0;
@@ -1681,11 +1683,12 @@ void ml_preserve(buf_T *buf, int message)
CHECK(buf->b_ml.ml_locked_low != lnum, "low != lnum");
lnum = buf->b_ml.ml_locked_high + 1;
}
- (void)ml_find_line(buf, (linenr_T)0, ML_FLUSH); /* flush locked block */
- /* sync the updated pointer blocks */
- if (mf_sync(mfp, MFS_ALL | MFS_FLUSH) == FAIL)
+ (void)ml_find_line(buf, (linenr_T)0, ML_FLUSH); // flush locked block
+ // sync the updated pointer blocks
+ if (mf_sync(mfp, MFS_ALL | (do_fsync ? MFS_FLUSH : 0)) == FAIL) {
status = FAIL;
- buf->b_ml.ml_stack_top = 0; /* stack is invalid now */
+ }
+ buf->b_ml.ml_stack_top = 0; // stack is invalid now
}
theend:
got_int |= got_int_save;
@@ -1744,11 +1747,11 @@ ml_get_buf (
if (lnum > buf->b_ml.ml_line_count) { /* invalid line number */
if (recursive == 0) {
- /* Avoid giving this message for a recursive call, may happen when
- * the GUI redraws part of the text. */
- ++recursive;
- EMSGN(_("E315: ml_get: invalid lnum: %" PRId64), lnum);
- --recursive;
+ // Avoid giving this message for a recursive call, may happen when
+ // the GUI redraws part of the text.
+ recursive++;
+ IEMSGN(_("E315: ml_get: invalid lnum: %" PRId64), lnum);
+ recursive--;
}
errorret:
STRCPY(IObuff, "???");
@@ -1766,7 +1769,7 @@ errorret:
* Don't use the last used line when 'swapfile' is reset, need to load all
* blocks.
*/
- if (buf->b_ml.ml_line_lnum != lnum || mf_dont_release) {
+ if (buf->b_ml.ml_line_lnum != lnum) {
ml_flush_line(buf);
/*
@@ -1776,11 +1779,11 @@ errorret:
*/
if ((hp = ml_find_line(buf, lnum, ML_FIND)) == NULL) {
if (recursive == 0) {
- /* Avoid giving this message for a recursive call, may happen
- * when the GUI redraws part of the text. */
- ++recursive;
- EMSGN(_("E316: ml_get: cannot find line %" PRId64), lnum);
- --recursive;
+ // Avoid giving this message for a recursive call, may happen
+ // when the GUI redraws part of the text.
+ recursive++;
+ IEMSGN(_("E316: ml_get: cannot find line %" PRId64), lnum);
+ recursive--;
}
goto errorret;
}
@@ -2164,7 +2167,7 @@ ml_append_int (
return FAIL;
pp = hp->bh_data; /* must be pointer block */
if (pp->pb_id != PTR_ID) {
- EMSG(_("E317: pointer block id wrong 3"));
+ IEMSG(_("E317: pointer block id wrong 3"));
mf_put(mfp, hp, false, false);
return FAIL;
}
@@ -2297,8 +2300,8 @@ ml_append_int (
* Safety check: fallen out of for loop?
*/
if (stack_idx < 0) {
- EMSG(_("E318: Updated too many blocks?"));
- buf->b_ml.ml_stack_top = 0; /* invalidate stack */
+ IEMSG(_("E318: Updated too many blocks?"));
+ buf->b_ml.ml_stack_top = 0; // invalidate stack
}
}
@@ -2318,7 +2321,7 @@ ml_append_int (
*
* return FAIL for failure, OK otherwise
*/
-int ml_replace(linenr_T lnum, char_u *line, int copy)
+int ml_replace(linenr_T lnum, char_u *line, bool copy)
{
if (line == NULL) /* just checking... */
return FAIL;
@@ -2341,14 +2344,13 @@ int ml_replace(linenr_T lnum, char_u *line, int copy)
return OK;
}
-/*
- * Delete line 'lnum' in the current buffer.
- *
- * Check: The caller of this function should probably also call
- * deleted_lines() after this.
- *
- * return FAIL for failure, OK otherwise
- */
+/// Delete line `lnum` in the current buffer.
+///
+/// @note The caller of this function should probably also call
+/// deleted_lines() after this.
+///
+/// @param message Show "--No lines in buffer--" message.
+/// @return FAIL for failure, OK otherwise
int ml_delete(linenr_T lnum, int message)
{
ml_flush_line(curbuf);
@@ -2384,7 +2386,7 @@ static int ml_delete_int(buf_T *buf, linenr_T lnum, int message)
)
set_keep_msg((char_u *)_(no_lines_msg), 0);
- i = ml_replace((linenr_T)1, (char_u *)"", TRUE);
+ i = ml_replace((linenr_T)1, (char_u *)"", true);
buf->b_ml.ml_flags |= ML_EMPTY;
return i;
@@ -2438,7 +2440,7 @@ static int ml_delete_int(buf_T *buf, linenr_T lnum, int message)
return FAIL;
pp = hp->bh_data; /* must be pointer block */
if (pp->pb_id != PTR_ID) {
- EMSG(_("E317: pointer block id wrong 4"));
+ IEMSG(_("E317: pointer block id wrong 4"));
mf_put(mfp, hp, false, false);
return FAIL;
}
@@ -2633,9 +2635,9 @@ static void ml_flush_line(buf_T *buf)
new_line = buf->b_ml.ml_line_ptr;
hp = ml_find_line(buf, lnum, ML_FIND);
- if (hp == NULL)
- EMSGN(_("E320: Cannot find line %" PRId64), lnum);
- else {
+ if (hp == NULL) {
+ IEMSGN(_("E320: Cannot find line %" PRId64), lnum);
+ } else {
dp = hp->bh_data;
idx = lnum - buf->b_ml.ml_locked_low;
start = ((dp->db_index[idx]) & DB_INDEX_MASK);
@@ -2768,9 +2770,8 @@ static bhdr_T *ml_find_line(buf_T *buf, linenr_T lnum, int action)
if (buf->b_ml.ml_locked) {
if (ML_SIMPLE(action)
&& buf->b_ml.ml_locked_low <= lnum
- && buf->b_ml.ml_locked_high >= lnum
- && !mf_dont_release) {
- /* remember to update pointer blocks and stack later */
+ && buf->b_ml.ml_locked_high >= lnum) {
+ // remember to update pointer blocks and stack later
if (action == ML_INSERT) {
++(buf->b_ml.ml_locked_lineadd);
++(buf->b_ml.ml_locked_high);
@@ -2844,7 +2845,7 @@ static bhdr_T *ml_find_line(buf_T *buf, linenr_T lnum, int action)
pp = (PTR_BL *)(dp); /* must be pointer block */
if (pp->pb_id != PTR_ID) {
- EMSG(_("E317: pointer block id wrong"));
+ IEMSG(_("E317: pointer block id wrong"));
goto error_block;
}
@@ -2881,13 +2882,14 @@ static bhdr_T *ml_find_line(buf_T *buf, linenr_T lnum, int action)
break;
}
}
- if (idx >= (int)pp->pb_count) { /* past the end: something wrong! */
- if (lnum > buf->b_ml.ml_line_count)
- EMSGN(_("E322: line number out of range: %" PRId64 " past the end"),
- lnum - buf->b_ml.ml_line_count);
+ if (idx >= (int)pp->pb_count) { // past the end: something wrong!
+ if (lnum > buf->b_ml.ml_line_count) {
+ IEMSGN(_("E322: line number out of range: %" PRId64 " past the end"),
+ lnum - buf->b_ml.ml_line_count);
- else
- EMSGN(_("E323: line count wrong in block %" PRId64), bnum);
+ } else {
+ IEMSGN(_("E323: line count wrong in block %" PRId64), bnum);
+ }
goto error_block;
}
if (action == ML_DELETE) {
@@ -2963,7 +2965,7 @@ static void ml_lineadd(buf_T *buf, int count)
pp = hp->bh_data; /* must be pointer block */
if (pp->pb_id != PTR_ID) {
mf_put(mfp, hp, false, false);
- EMSG(_("E317: pointer block id wrong 2"));
+ IEMSG(_("E317: pointer block id wrong 2"));
break;
}
pp->pb_pointer[ip->ip_index].pe_line_count += count;
@@ -3017,20 +3019,17 @@ int resolve_symlink(const char_u *fname, char_u *buf)
}
buf[ret] = NUL;
- /*
- * Check whether the symlink is relative or absolute.
- * If it's relative, build a new path based on the directory
- * portion of the filename (if any) and the path the symlink
- * points to.
- */
- if (path_is_absolute_path(buf))
+ // Check whether the symlink is relative or absolute.
+ // If it's relative, build a new path based on the directory
+ // portion of the filename (if any) and the path the symlink
+ // points to.
+ if (path_is_absolute(buf)) {
STRCPY(tmp, buf);
- else {
- char_u *tail;
-
- tail = path_tail(tmp);
- if (STRLEN(tail) + STRLEN(buf) >= MAXPATHL)
+ } else {
+ char_u *tail = path_tail(tmp);
+ if (STRLEN(tail) + STRLEN(buf) >= MAXPATHL) {
return FAIL;
+ }
STRCPY(tail, buf);
}
}
@@ -3055,9 +3054,12 @@ char_u *makeswapname(char_u *fname, char_u *ffname, buf_T *buf, char_u *dir_name
#ifdef HAVE_READLINK
char_u fname_buf[MAXPATHL];
#endif
+ int len = (int)STRLEN(dir_name);
- s = dir_name + STRLEN(dir_name);
- if (after_pathsep((char *)dir_name, (char *)s) && s[-1] == s[-2]) { /* Ends with '//', Use Full path */
+ s = dir_name + len;
+ if (after_pathsep((char *)dir_name, (char *)s)
+ && len > 1
+ && s[-1] == s[-2]) { // Ends with '//', Use Full path
r = NULL;
if ((s = (char_u *)make_percent_swname((char *)dir_name, (char *)fname)) != NULL) {
r = (char_u *)modname((char *)s, ".swp", FALSE);
@@ -3139,6 +3141,7 @@ attention_message (
char_u *fname /* swap file name */
)
{
+ assert(buf->b_fname != NULL);
time_t x, sx;
char *p;
@@ -3152,7 +3155,9 @@ attention_message (
msg_outtrans(buf->b_fname);
MSG_PUTS("\"\n");
FileInfo file_info;
- if (os_fileinfo((char *)buf->b_fname, &file_info)) {
+ if (!os_fileinfo((char *)buf->b_fname, &file_info)) {
+ MSG_PUTS(_(" CANNOT BE FOUND"));
+ } else {
MSG_PUTS(_(" dated: "));
x = file_info.stat.st_mtim.tv_sec;
p = ctime(&x); // includes '\n'
@@ -3165,9 +3170,10 @@ attention_message (
}
/* Some of these messages are long to allow translation to
* other languages. */
- MSG_PUTS(_(
- "\n(1) Another program may be editing the same file. If this is the case,\n be careful not to end up with two different instances of the same\n file when making changes."));
- MSG_PUTS(_(" Quit, or continue with caution.\n"));
+ MSG_PUTS(_("\n(1) Another program may be editing the same file. If this is"
+ " the case,\n be careful not to end up with two different"
+ " instances of the same\n file when making changes."
+ " Quit, or continue with caution.\n"));
MSG_PUTS(_("(2) An edit session for this file crashed.\n"));
MSG_PUTS(_(" If this is the case, use \":recover\" or \"vim -r "));
msg_outtrans(buf->b_fname);
@@ -3348,7 +3354,7 @@ static char *findswapname(buf_T *buf, char **dirp, char *old_fname,
int choice = 0;
#ifdef UNIX
- process_still_running = FALSE;
+ process_still_running = false;
#endif
/*
* If there is a SwapExists autocommand and we can handle
@@ -3360,38 +3366,45 @@ static char *findswapname(buf_T *buf, char **dirp, char *old_fname,
choice = do_swapexists(buf, (char_u *) fname);
if (choice == 0) {
- /* Show info about the existing swap file. */
- attention_message(buf, (char_u *) fname);
+ // Show info about the existing swap file.
+ attention_message(buf, (char_u *)fname);
+
+ // We don't want a 'q' typed at the more-prompt
+ // interrupt loading a file.
+ got_int = false;
- /* We don't want a 'q' typed at the more-prompt
- * interrupt loading a file. */
- got_int = FALSE;
+ // If vimrc has "simalt ~x" we don't want it to
+ // interfere with the prompt here.
+ flush_buffers(FLUSH_TYPEAHEAD);
}
if (swap_exists_action != SEA_NONE && choice == 0) {
- char *name;
+ const char *const sw_msg_1 = _("Swap file \"");
+ const char *const sw_msg_2 = _("\" already exists!");
const size_t fname_len = strlen(fname);
- name = xmalloc(fname_len
- + strlen(_("Swap file \""))
- + strlen(_("\" already exists!")) + 5);
- STRCPY(name, _("Swap file \""));
- home_replace(NULL, (char_u *) fname, (char_u *)&name[strlen(name)],
- fname_len, true);
- STRCAT(name, _("\" already exists!"));
- choice = do_dialog(VIM_WARNING,
- (char_u *)_("VIM - ATTENTION"),
- (char_u *)(name == NULL
- ? _("Swap file already exists!")
- : name),
+ const size_t sw_msg_1_len = strlen(sw_msg_1);
+ const size_t sw_msg_2_len = strlen(sw_msg_2);
+
+ const size_t name_len = sw_msg_1_len + fname_len + sw_msg_2_len + 5;
+
+ char *const name = xmalloc(name_len);
+ memcpy(name, sw_msg_1, sw_msg_1_len + 1);
+ home_replace(NULL, (char_u *)fname, (char_u *)&name[sw_msg_1_len],
+ fname_len, true);
+ xstrlcat(name, sw_msg_2, name_len);
+ choice = do_dialog(VIM_WARNING, (char_u *)_("VIM - ATTENTION"),
+ (char_u *)name,
# if defined(UNIX)
- process_still_running
- ? (char_u *)_(
- "&Open Read-Only\n&Edit anyway\n&Recover\n&Quit\n&Abort") :
+ process_still_running
+ ? (char_u *)_(
+ "&Open Read-Only\n&Edit anyway\n&Recover"
+ "\n&Quit\n&Abort") :
# endif
- (char_u *)_(
- "&Open Read-Only\n&Edit anyway\n&Recover\n&Delete it\n&Quit\n&Abort"),
- 1, NULL, FALSE);
+ (char_u *)_(
+ "&Open Read-Only\n&Edit anyway\n&Recover"
+ "\n&Delete it\n&Quit\n&Abort"),
+ 1, NULL, false);
# if defined(UNIX)
if (process_still_running && choice >= 4)
@@ -3526,17 +3539,16 @@ static int b0_magic_wrong(ZERO_BL *b0p)
* == 0 == 0 OK FAIL TRUE
*
* current file doesn't exist, inode for swap unknown, both file names not
- * available -> probably same file
- * == 0 == 0 FAIL FAIL FALSE
+ * available -> compare file names
+ * == 0 == 0 FAIL FAIL fname_c != fname_s
*
* Only the last 32 bits of the inode will be used. This can't be changed
* without making the block 0 incompatible with 32 bit versions.
*/
-static int
-fnamecmp_ino (
- char_u *fname_c, /* current file name */
- char_u *fname_s, /* file name from swap file */
+static bool fnamecmp_ino(
+ char_u *fname_c, // current file name
+ char_u *fname_s, // file name from swap file
long ino_block0
)
{
@@ -3577,11 +3589,13 @@ fnamecmp_ino (
/*
* Can't compare inodes or file names, guess that the files are different,
- * unless both appear not to exist at all.
+ * unless both appear not to exist at all, then compare with the file name
+ * in the swap file.
*/
- if (ino_s == 0 && ino_c == 0 && retval_c == FAIL && retval_s == FAIL)
- return FALSE;
- return TRUE;
+ if (ino_s == 0 && ino_c == 0 && retval_c == FAIL && retval_s == FAIL) {
+ return STRCMP(fname_c, fname_s) != 0;
+ }
+ return true;
}
/*
@@ -3700,9 +3714,9 @@ static void ml_updatechunk(buf_T *buf, linenr_T line, long len, int updtype)
curix++) {
curline += buf->b_ml.ml_chunksize[curix].mlcs_numlines;
}
- } else if (line >= curline + buf->b_ml.ml_chunksize[curix].mlcs_numlines
- && curix < buf->b_ml.ml_usedchunks - 1) {
- /* Adjust cached curix & curline */
+ } else if (curix < buf->b_ml.ml_usedchunks - 1
+ && line >= curline + buf->b_ml.ml_chunksize[curix].mlcs_numlines) {
+ // Adjust cached curix & curline
curline += buf->b_ml.ml_chunksize[curix].mlcs_numlines;
curix++;
}
@@ -3841,13 +3855,17 @@ static void ml_updatechunk(buf_T *buf, linenr_T line, long len, int updtype)
ml_upd_lastcurix = curix;
}
-/*
- * Find offset for line or line with offset.
- * Find line with offset if "lnum" is 0; return remaining offset in offp
- * Find offset of line if "lnum" > 0
- * return -1 if information is not available
- */
-long ml_find_line_or_offset(buf_T *buf, linenr_T lnum, long *offp)
+/// Find offset for line or line with offset.
+///
+/// @param buf buffer to use
+/// @param lnum if > 0, find offset of lnum, store offset in offp
+/// if == 0, return line with offset *offp
+/// @param offp Location where offset of line is stored, or to read offset to
+/// use to find line. In the later case, store remaining offset.
+/// @param no_ff ignore 'fileformat' option, always use one byte for NL.
+///
+/// @return -1 if information is not available
+long ml_find_line_or_offset(buf_T *buf, linenr_T lnum, long *offp, bool no_ff)
{
linenr_T curline;
int curix;
@@ -3860,7 +3878,7 @@ long ml_find_line_or_offset(buf_T *buf, linenr_T lnum, long *offp)
int text_end;
long offset;
int len;
- int ffdos = (get_fileformat(buf) == EOL_DOS);
+ int ffdos = !no_ff && (get_fileformat(buf) == EOL_DOS);
int extra = 0;
/* take care of cached line first */
@@ -3955,7 +3973,7 @@ long ml_find_line_or_offset(buf_T *buf, linenr_T lnum, long *offp)
/* Don't count the last line break if 'noeol' and ('bin' or
* 'nofixeol'). */
if ((!buf->b_p_fixeol || buf->b_p_bin) && !buf->b_p_eol
- && buf->b_ml.ml_line_count == lnum) {
+ && lnum > buf->b_ml.ml_line_count) {
size -= ffdos + 1;
}
}
@@ -3963,20 +3981,19 @@ long ml_find_line_or_offset(buf_T *buf, linenr_T lnum, long *offp)
return size;
}
-/*
- * Goto byte in buffer with offset 'cnt'.
- */
+/// Goto byte in buffer with offset 'cnt'.
void goto_byte(long cnt)
{
long boff = cnt;
linenr_T lnum;
- ml_flush_line(curbuf); /* cached line may be dirty */
+ ml_flush_line(curbuf); // cached line may be dirty
setpcmark();
- if (boff)
- --boff;
- lnum = ml_find_line_or_offset(curbuf, (linenr_T)0, &boff);
- if (lnum < 1) { /* past the end */
+ if (boff) {
+ boff--;
+ }
+ lnum = ml_find_line_or_offset(curbuf, (linenr_T)0, &boff, false);
+ if (lnum < 1) { // past the end
curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
curwin->w_curswant = MAXCOL;
coladvance((colnr_T)MAXCOL);
@@ -3988,7 +4005,87 @@ void goto_byte(long cnt)
}
check_cursor();
- /* Make sure the cursor is on the first byte of a multi-byte char. */
- if (has_mbyte)
+ // Make sure the cursor is on the first byte of a multi-byte char.
+ if (has_mbyte) {
mb_adjust_cursor();
+ }
+}
+
+/// Increment the line pointer "lp" crossing line boundaries as necessary.
+/// Return 1 when going to the next line.
+/// Return 2 when moving forward onto a NUL at the end of the line).
+/// Return -1 when at the end of file.
+/// Return 0 otherwise.
+int inc(pos_T *lp)
+{
+ // when searching position may be set to end of a line
+ if (lp->col != MAXCOL) {
+ const char_u *const p = ml_get_pos(lp);
+ if (*p != NUL) { // still within line, move to next char (may be NUL)
+ const int l = utfc_ptr2len(p);
+
+ lp->col += l;
+ return ((p[l] != NUL) ? 0 : 2);
+ }
+ }
+ if (lp->lnum != curbuf->b_ml.ml_line_count) { // there is a next line
+ lp->col = 0;
+ lp->lnum++;
+ lp->coladd = 0;
+ return 1;
+ }
+ return -1;
+}
+
+/// Same as inc(), but skip NUL at the end of non-empty lines.
+int incl(pos_T *lp)
+{
+ int r;
+
+ if ((r = inc(lp)) >= 1 && lp->col) {
+ r = inc(lp);
+ }
+ return r;
+}
+
+int dec(pos_T *lp)
+{
+ lp->coladd = 0;
+ if (lp->col == MAXCOL) {
+ // past end of line
+ char_u *p = ml_get(lp->lnum);
+ lp->col = (colnr_T)STRLEN(p);
+ lp->col -= utf_head_off(p, p + lp->col);
+ return 0;
+ }
+
+ if (lp->col > 0) {
+ // still within line
+ lp->col--;
+ char_u *p = ml_get(lp->lnum);
+ lp->col -= utf_head_off(p, p + lp->col);
+ return 0;
+ }
+ if (lp->lnum > 1) {
+ // there is a prior line
+ lp->lnum--;
+ char_u *p = ml_get(lp->lnum);
+ lp->col = (colnr_T)STRLEN(p);
+ lp->col -= utf_head_off(p, p + lp->col);
+ return 1;
+ }
+
+ // at start of file
+ return -1;
+}
+
+/// Same as dec(), but skip NUL at the end of non-empty lines.
+int decl(pos_T *lp)
+{
+ int r;
+
+ if ((r = dec(lp)) == 1 && lp->col) {
+ r = dec(lp);
+ }
+ return r;
}
diff --git a/src/nvim/memline.h b/src/nvim/memline.h
index f84e86fea0..a239c6a031 100644
--- a/src/nvim/memline.h
+++ b/src/nvim/memline.h
@@ -2,6 +2,8 @@
#define NVIM_MEMLINE_H
#include "nvim/types.h"
+#include "nvim/pos.h" // for pos_T, linenr_T, colnr_T
+#include "nvim/buffer_defs.h" // for buf_T
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "memline.h.generated.h"
diff --git a/src/nvim/memory.c b/src/nvim/memory.c
index 8db47b79c1..d38079ca72 100644
--- a/src/nvim/memory.c
+++ b/src/nvim/memory.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
// Various routines dealing with allocation and deallocation of memory.
#include <assert.h>
@@ -7,26 +10,53 @@
#include "nvim/vim.h"
#include "nvim/eval.h"
+#include "nvim/highlight.h"
#include "nvim/memfile.h"
#include "nvim/memory.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
#include "nvim/ui.h"
+#include "nvim/api/vim.h"
#ifdef HAVE_JEMALLOC
// Force je_ prefix on jemalloc functions.
# define JEMALLOC_NO_DEMANGLE
# include <jemalloc/jemalloc.h>
-# define malloc(size) je_malloc(size)
-# define calloc(count, size) je_calloc(count, size)
-# define realloc(ptr, size) je_realloc(ptr, size)
-# define free(ptr) je_free(ptr)
+#endif
+
+#ifdef UNIT_TESTING
+# define malloc(size) mem_malloc(size)
+# define calloc(count, size) mem_calloc(count, size)
+# define realloc(ptr, size) mem_realloc(ptr, size)
+# define free(ptr) mem_free(ptr)
+# ifdef HAVE_JEMALLOC
+MemMalloc mem_malloc = &je_malloc;
+MemFree mem_free = &je_free;
+MemCalloc mem_calloc = &je_calloc;
+MemRealloc mem_realloc = &je_realloc;
+# else
+MemMalloc mem_malloc = &malloc;
+MemFree mem_free = &free;
+MemCalloc mem_calloc = &calloc;
+MemRealloc mem_realloc = &realloc;
+# endif
+#else
+# ifdef HAVE_JEMALLOC
+# define malloc(size) je_malloc(size)
+# define calloc(count, size) je_calloc(count, size)
+# define realloc(ptr, size) je_realloc(ptr, size)
+# define free(ptr) je_free(ptr)
+# endif
#endif
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "memory.c.generated.h"
#endif
+#ifdef EXITFREE
+bool entered_free_all_mem = false;
+#endif
+
/// Try to free memory. Used when trying to recover from out of memory errors.
/// @see {xmalloc}
void try_to_free_memory(void)
@@ -38,7 +68,7 @@ void try_to_free_memory(void)
trying_to_free = true;
// free any scrollback text
- clear_sb_text();
+ clear_sb_text(true);
// Try to save all buffers and release as many blocks as possible
mf_release_all();
@@ -283,18 +313,16 @@ size_t memcnt(const void *data, char c, size_t len)
return cnt;
}
-/// The xstpcpy() function shall copy the string pointed to by src (including
-/// the terminating NUL character) into the array pointed to by dst.
+/// Copies the string pointed to by src (including the terminating NUL
+/// character) into the array pointed to by dst.
///
-/// The xstpcpy() function shall return a pointer to the terminating NUL
-/// character copied into the dst buffer. This is the only difference with
-/// strcpy(), which returns dst.
+/// @returns pointer to the terminating NUL char copied into the dst buffer.
+/// This is the only difference with strcpy(), which returns dst.
///
-/// WARNING: If copying takes place between objects that overlap, the behavior is
-/// undefined.
+/// WARNING: If copying takes place between objects that overlap, the behavior
+/// is undefined.
///
-/// This is the Neovim version of stpcpy(3) as defined in POSIX 2008. We
-/// don't require that supported platforms implement POSIX 2008, so we
+/// Nvim version of POSIX 2008 stpcpy(3). We do not require POSIX 2008, so
/// implement our own version.
///
/// @param dst
@@ -306,24 +334,19 @@ char *xstpcpy(char *restrict dst, const char *restrict src)
return (char *)memcpy(dst, src, len + 1) + len;
}
-/// The xstpncpy() function shall copy not more than n bytes (bytes that follow
-/// a NUL character are not copied) from the array pointed to by src to the
-/// array pointed to by dst.
+/// Copies not more than n bytes (bytes that follow a NUL character are not
+/// copied) from the array pointed to by src to the array pointed to by dst.
///
-/// If a NUL character is written to the destination, the xstpncpy() function
-/// shall return the address of the first such NUL character. Otherwise, it
-/// shall return &dst[maxlen].
+/// If a NUL character is written to the destination, xstpncpy() returns the
+/// address of the first such NUL character. Otherwise, it shall return
+/// &dst[maxlen].
///
-/// WARNING: If copying takes place between objects that overlap, the behavior is
-/// undefined.
+/// WARNING: If copying takes place between objects that overlap, the behavior
+/// is undefined.
///
/// WARNING: xstpncpy will ALWAYS write maxlen bytes. If src is shorter than
/// maxlen, zeroes will be written to the remaining bytes.
///
-/// TODO(aktau): I don't see a good reason to have this last behaviour, and
-/// it is potentially wasteful. Could we perhaps deviate from the standard
-/// and not zero the rest of the buffer?
-///
/// @param dst
/// @param src
/// @param maxlen
@@ -342,29 +365,62 @@ char *xstpncpy(char *restrict dst, const char *restrict src, size_t maxlen)
}
}
-/// xstrlcpy - Copy a %NUL terminated string into a sized buffer
+/// xstrlcpy - Copy a NUL-terminated string into a sized buffer
+///
+/// Compatible with *BSD strlcpy: the result is always a valid NUL-terminated
+/// string that fits in the buffer (unless, of course, the buffer size is
+/// zero). It does not pad out the result like strncpy() does.
///
-/// Compatible with *BSD strlcpy: the result is always a valid
-/// NUL-terminated string that fits in the buffer (unless,
-/// of course, the buffer size is zero). It does not pad
-/// out the result like strncpy() does.
+/// @param[out] dst Buffer to store the result.
+/// @param[in] src String to be copied.
+/// @param[in] dsize Size of `dst`.
///
-/// @param dst Where to copy the string to
-/// @param src Where to copy the string from
-/// @param size Size of destination buffer
-/// @return Length of the source string (i.e.: strlen(src))
-size_t xstrlcpy(char *restrict dst, const char *restrict src, size_t size)
+/// @return Length of `src`. May be greater than `dsize - 1`, which would mean
+/// that string was truncated.
+size_t xstrlcpy(char *restrict dst, const char *restrict src, size_t dsize)
FUNC_ATTR_NONNULL_ALL
{
- size_t ret = strlen(src);
+ size_t slen = strlen(src);
- if (size) {
- size_t len = (ret >= size) ? size - 1 : ret;
- memcpy(dst, src, len);
- dst[len] = '\0';
- }
+ if (dsize) {
+ size_t len = MIN(slen, dsize - 1);
+ memcpy(dst, src, len);
+ dst[len] = '\0';
+ }
+
+ return slen; // Does not include NUL.
+}
+
+/// Appends `src` to string `dst` of size `dsize` (unlike strncat, dsize is the
+/// full size of `dst`, not space left). At most dsize-1 characters
+/// will be copied. Always NUL terminates. `src` and `dst` may overlap.
+///
+/// @see vim_strcat from Vim.
+/// @see strlcat from OpenBSD.
+///
+/// @param[in,out] dst Buffer to be appended-to. Must have a NUL byte.
+/// @param[in] src String to put at the end of `dst`.
+/// @param[in] dsize Size of `dst` including NUL byte. Must be greater than 0.
+///
+/// @return Length of the resulting string as if destination size was #SIZE_MAX.
+/// May be greater than `dsize - 1`, which would mean that string was
+/// truncated.
+size_t xstrlcat(char *const dst, const char *const src, const size_t dsize)
+ FUNC_ATTR_NONNULL_ALL
+{
+ assert(dsize > 0);
+ const size_t dlen = strlen(dst);
+ assert(dlen < dsize);
+ const size_t slen = strlen(src);
+
+ if (slen > dsize - dlen - 1) {
+ memmove(dst + dlen, src, dsize - dlen - 1);
+ dst[dsize - 1] = '\0';
+ } else {
+ memmove(dst + dlen, src, slen + 1);
+ }
- return ret;
+ return slen + dlen; // Does not include NUL.
}
/// strdup() wrapper
@@ -374,10 +430,24 @@ size_t xstrlcpy(char *restrict dst, const char *restrict src, size_t size)
/// @return pointer to a copy of the string
char *xstrdup(const char *str)
FUNC_ATTR_MALLOC FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_RET
+ FUNC_ATTR_NONNULL_ALL
{
return xmemdupz(str, strlen(str));
}
+/// strdup() wrapper
+///
+/// Unlike xstrdup() allocates a new empty string if it receives NULL.
+char *xstrdupnul(const char *const str)
+ FUNC_ATTR_MALLOC FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_RET
+{
+ if (str == NULL) {
+ return xmallocz(0);
+ } else {
+ return xstrdup(str);
+ }
+}
+
/// A version of memchr that starts the search at `src + len`.
///
/// Based on glibc's memrchr.
@@ -404,6 +474,7 @@ void *xmemrchr(const void *src, uint8_t c, size_t len)
/// @return pointer to a copy of the string
char *xstrndup(const char *str, size_t len)
FUNC_ATTR_MALLOC FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_RET
+ FUNC_ATTR_NONNULL_ALL
{
char *p = memchr(str, '\0', len);
return xmemdupz(str, p ? (size_t)(p - str) : len);
@@ -422,6 +493,20 @@ void *xmemdup(const void *data, size_t len)
return memcpy(xmalloc(len), data, len);
}
+/// Returns true if strings `a` and `b` are equal. Arguments may be NULL.
+bool strequal(const char *a, const char *b)
+ FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ return (a == NULL && b == NULL) || (a && b && strcmp(a, b) == 0);
+}
+
+/// Case-insensitive `strequal`.
+bool striequal(const char *a, const char *b)
+ FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ return (a == NULL && b == NULL) || (a && b && STRICMP(a, b) == 0);
+}
+
/*
* Avoid repeating the error message many times (they take 1 second each).
* Did_outofmem_msg is reset when a character is read.
@@ -440,6 +525,16 @@ void do_outofmem_msg(size_t size)
}
}
+/// Writes time_t to "buf[8]".
+void time_to_bytes(time_t time_, uint8_t buf[8])
+{
+ // time_t can be up to 8 bytes in size, more than uintmax_t in 32 bits
+ // systems, thus we can't use put_bytes() here.
+ for (size_t i = 7, bufi = 0; bufi < 8; i--, bufi++) {
+ buf[bufi] = (uint8_t)((uint64_t)time_ >> (i * 8));
+ }
+}
+
#if defined(EXITFREE)
#include "nvim/file_search.h"
@@ -470,6 +565,7 @@ void do_outofmem_msg(size_t size)
#include "nvim/tag.h"
#include "nvim/window.h"
#include "nvim/os/os.h"
+#include "nvim/eval/typval.h"
/*
* Free everything that we allocated.
@@ -481,13 +577,13 @@ void do_outofmem_msg(size_t size)
void free_all_mem(void)
{
buf_T *buf, *nextbuf;
- static bool entered = false;
- /* When we cause a crash here it is caught and Vim tries to exit cleanly.
- * Don't try freeing everything again. */
- if (entered)
+ // When we cause a crash here it is caught and Vim tries to exit cleanly.
+ // Don't try freeing everything again.
+ if (entered_free_all_mem) {
return;
- entered = true;
+ }
+ entered_free_all_mem = true;
// Don't want to trigger autocommands from here on.
block_autocmds();
@@ -496,7 +592,7 @@ void free_all_mem(void)
p_ea = false;
if (first_tabpage->tp_next != NULL)
do_cmdline_cmd("tabonly!");
- if (firstwin != lastwin)
+ if (!ONE_WINDOW)
do_cmdline_cmd("only!");
/* Free all spell info. */
@@ -524,7 +620,6 @@ void free_all_mem(void)
/* Obviously named calls. */
free_all_autocmds();
- free_all_options();
free_all_marks();
alist_clear(&global_alist);
free_homedir();
@@ -539,7 +634,7 @@ void free_all_mem(void)
free_signs();
set_expr_line(NULL);
diff_clear(curtab);
- clear_sb_text(); /* free any scrollback text */
+ clear_sb_text(true); // free any scrollback text
/* Free some global vars. */
xfree(last_cmdline);
@@ -562,17 +657,8 @@ void free_all_mem(void)
/* Destroy all windows. Must come before freeing buffers. */
win_free_all();
- /* Free all buffers. Reset 'autochdir' to avoid accessing things that
- * were freed already. */
- p_acd = false;
- for (buf = firstbuf; buf != NULL; ) {
- nextbuf = buf->b_next;
- close_buffer(NULL, buf, DOBUF_WIPE, false);
- if (buf_valid(buf))
- buf = nextbuf; /* didn't work, try next one */
- else
- buf = firstbuf;
- }
+ // Free all option values. Must come after closing windows.
+ free_all_options();
free_cmdline_buf();
@@ -596,11 +682,27 @@ void free_all_mem(void)
break;
eval_clear();
+ api_vim_free_all_mem();
+
+ // Free all buffers. Reset 'autochdir' to avoid accessing things that
+ // were freed already.
+ // Must be after eval_clear to avoid it trying to access b:changedtick after
+ // freeing it.
+ p_acd = false;
+ for (buf = firstbuf; buf != NULL; ) {
+ bufref_T bufref;
+ set_bufref(&bufref, buf);
+ nextbuf = buf->b_next;
+ close_buffer(NULL, buf, DOBUF_WIPE, false);
+ // Didn't work, try next one.
+ buf = bufref_valid(&bufref) ? nextbuf : firstbuf;
+ }
- /* screenlines (can't display anything now!) */
- free_screenlines();
+ // free screenlines (can't display anything now!)
+ screen_free_all_mem();
- clear_hl_tables();
+ clear_hl_tables(false);
+ list_free_log();
}
#endif
diff --git a/src/nvim/memory.h b/src/nvim/memory.h
index 7b477da2f5..250ac3e08f 100644
--- a/src/nvim/memory.h
+++ b/src/nvim/memory.h
@@ -1,8 +1,41 @@
#ifndef NVIM_MEMORY_H
#define NVIM_MEMORY_H
+#include <stdbool.h> // for bool
#include <stdint.h> // for uint8_t
#include <stddef.h> // for size_t
+#include <time.h> // for time_t
+
+/// `malloc()` function signature
+typedef void *(*MemMalloc)(size_t);
+
+/// `free()` function signature
+typedef void (*MemFree)(void *);
+
+/// `calloc()` function signature
+typedef void *(*MemCalloc)(size_t, size_t);
+
+/// `realloc()` function signature
+typedef void *(*MemRealloc)(void *, size_t);
+
+#ifdef UNIT_TESTING
+/// When unit testing: pointer to the `malloc()` function, may be altered
+extern MemMalloc mem_malloc;
+
+/// When unit testing: pointer to the `free()` function, may be altered
+extern MemFree mem_free;
+
+/// When unit testing: pointer to the `calloc()` function, may be altered
+extern MemCalloc mem_calloc;
+
+/// When unit testing: pointer to the `realloc()` function, may be altered
+extern MemRealloc mem_realloc;
+#endif
+
+#ifdef EXITFREE
+/// Indicates that free_all_mem function was or is running
+extern bool entered_free_all_mem;
+#endif
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "memory.h.generated.h"
diff --git a/src/nvim/menu.c b/src/nvim/menu.c
index 3c2394d579..1c54db10eb 100644
--- a/src/nvim/menu.c
+++ b/src/nvim/menu.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* Code for menus. Used for the GUI and 'wildmenu'.
* GUI/Motif support by Robert Webb
@@ -18,12 +21,12 @@
#include "nvim/memory.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/keymap.h"
#include "nvim/garray.h"
+#include "nvim/state.h"
#include "nvim/strings.h"
#include "nvim/ui.h"
-
+#include "nvim/eval/typval.h"
#define MENUDEPTH 10 /* maximum depth of menus */
@@ -35,8 +38,8 @@
-/* The character for each menu mode */
-static char_u menu_mode_chars[] = {'n', 'v', 's', 'o', 'i', 'c', 't'};
+/// The character for each menu mode
+static char_u menu_mode_chars[] = { 'n', 'v', 's', 'o', 'i', 'c', 't' };
static char_u e_notsubmenu[] = N_(
"E327: Part of menu-item path is not sub-menu");
@@ -44,28 +47,24 @@ static char_u e_othermode[] = N_("E328: Menu only exists in another mode");
static char_u e_nomenu[] = N_("E329: No menu \"%s\"");
-/*
- * Do the :menu command and relatives.
- */
-void
-ex_menu (
- exarg_T *eap /* Ex command arguments */
-)
+/// Do the :menu command and relatives.
+/// @param eap Ex command arguments
+void
+ex_menu(exarg_T *eap)
{
char_u *menu_path;
int modes;
- char_u *map_to;
+ char_u *map_to; // command mapped to the menu entry
int noremap;
bool silent = false;
- bool special = false;
int unmenu;
char_u *map_buf;
char_u *arg;
char_u *p;
int i;
long pri_tab[MENUDEPTH + 1];
- int enable = MAYBE; /* TRUE for "menu enable", FALSE for "menu
- * disable */
+ TriState enable = kNone; // kTrue for "menu enable",
+ // kFalse for "menu disable
vimmenu_T menuarg;
modes = get_menu_cmd_modes(eap->cmd, eap->forceit, &noremap, &unmenu);
@@ -83,7 +82,7 @@ ex_menu (
continue;
}
if (STRNCMP(arg, "<special>", 9) == 0) {
- special = true;
+ // Ignore obsolete "<special>" modifier.
arg = skipwhite(arg + 9);
continue;
}
@@ -91,13 +90,14 @@ ex_menu (
}
- /* Locate an optional "icon=filename" argument. */
+ // Locate an optional "icon=filename" argument
+ // TODO(nvim): Currently this is only parsed. Should expose it to UIs.
if (STRNCMP(arg, "icon=", 5) == 0) {
arg += 5;
while (*arg != NUL && *arg != ' ') {
if (*arg == '\\')
STRMOVE(arg, arg + 1);
- mb_ptr_adv(arg);
+ MB_PTR_ADV(arg);
}
if (*arg != NUL) {
*arg++ = NUL;
@@ -105,12 +105,12 @@ ex_menu (
}
}
- /*
- * Fill in the priority table.
- */
- for (p = arg; *p; ++p)
- if (!ascii_isdigit(*p) && *p != '.')
+ // Fill in the priority table.
+ for (p = arg; *p; p++) {
+ if (!ascii_isdigit(*p) && *p != '.') {
break;
+ }
+ }
if (ascii_iswhite(*p)) {
for (i = 0; i < MENUDEPTH && !ascii_iswhite(*arg); ++i) {
pri_tab[i] = getdigits_long(&arg);
@@ -133,10 +133,10 @@ ex_menu (
* Check for "disable" or "enable" argument.
*/
if (STRNCMP(arg, "enable", 6) == 0 && ascii_iswhite(arg[6])) {
- enable = TRUE;
+ enable = kTrue;
arg = skipwhite(arg + 6);
} else if (STRNCMP(arg, "disable", 7) == 0 && ascii_iswhite(arg[7])) {
- enable = FALSE;
+ enable = kFalse;
arg = skipwhite(arg + 7);
}
@@ -160,22 +160,21 @@ ex_menu (
/*
* If there is only a menu name, display menus with that name.
*/
- if (*map_to == NUL && !unmenu && enable == MAYBE) {
+ if (*map_to == NUL && !unmenu && enable == kNone) {
show_menus(menu_path, modes);
goto theend;
- } else if (*map_to != NUL && (unmenu || enable != MAYBE)) {
+ } else if (*map_to != NUL && (unmenu || enable != kNone)) {
EMSG(_(e_trailing));
goto theend;
}
- if (enable != MAYBE) {
- /*
- * Change sensitivity of the menu.
- * For the PopUp menu, remove a menu for each mode separately.
- * Careful: menu_nable_recurse() changes menu_path.
- */
- if (STRCMP(menu_path, "*") == 0) /* meaning: do all menus */
+ if (enable != kNone) {
+ // Change sensitivity of the menu.
+ // For the PopUp menu, remove a menu for each mode separately.
+ // Careful: menu_nable_recurse() changes menu_path.
+ if (STRCMP(menu_path, "*") == 0) { // meaning: do all menus
menu_path = (char_u *)"";
+ }
if (menu_is_popup(menu_path)) {
for (i = 0; i < MENU_INDEX_TIP; ++i)
@@ -219,13 +218,12 @@ ex_menu (
map_buf = NULL; // Menu tips are plain text.
} else {
map_to = replace_termcodes(map_to, STRLEN(map_to), &map_buf, false, true,
- special, CPO_TO_CPO_FLAGS);
+ true, CPO_TO_CPO_FLAGS);
}
menuarg.modes = modes;
menuarg.noremap[0] = noremap;
menuarg.silent[0] = silent;
- add_menu_path(menu_path, &menuarg, pri_tab, map_to
- );
+ add_menu_path(menu_path, &menuarg, pri_tab, map_to);
/*
* For the PopUp menu, add a menu for each mode separately.
@@ -244,22 +242,24 @@ ex_menu (
xfree(map_buf);
}
- ui_update_menu();
+ ui_call_update_menu();
theend:
;
}
-/*
- * Add the menu with the given name to the menu hierarchy
- */
-static int
-add_menu_path (
- char_u *menu_path,
- vimmenu_T *menuarg, /* passes modes, iconfile, iconidx,
- icon_builtin, silent[0], noremap[0] */
- long *pri_tab,
- char_u *call_data
+
+/// Add the menu with the given name to the menu hierarchy
+///
+/// @param[out] menuarg menu entry
+/// @param[] pri_tab priority table
+/// @param[in] call_data Right hand side command
+static int
+add_menu_path(
+ const char_u *const menu_path,
+ vimmenu_T *menuarg,
+ const long *const pri_tab,
+ const char_u *const call_data
)
{
char_u *path_name;
@@ -294,8 +294,9 @@ add_menu_path (
if (map_to != NULL) {
en_name = name;
name = map_to;
- } else
+ } else {
en_name = NULL;
+ }
dname = menu_text(name, NULL, NULL);
if (*dname == NUL) {
/* Only a mnemonic or accelerator is not valid. */
@@ -309,14 +310,15 @@ add_menu_path (
while (menu != NULL) {
if (menu_name_equal(name, menu) || menu_name_equal(dname, menu)) {
if (*next_name == NUL && menu->children != NULL) {
- if (!sys_menu)
+ if (!sys_menu) {
EMSG(_("E330: Menu path must not lead to a sub-menu"));
+ }
goto erret;
}
- if (*next_name != NUL && menu->children == NULL
- ) {
- if (!sys_menu)
+ if (*next_name != NUL && menu->children == NULL) {
+ if (!sys_menu) {
EMSG(_(e_notsubmenu));
+ }
goto erret;
}
break;
@@ -350,7 +352,7 @@ add_menu_path (
menu->modes = modes;
menu->enabled = MENU_ALL_MODES;
menu->name = vim_strsave(name);
- /* separate mnemonic and accelerator text from actual menu name */
+ // separate mnemonic and accelerator text from actual menu name
menu->dname = menu_text(name, &menu->mnemonic, &menu->actext);
if (en_name != NULL) {
menu->en_name = vim_strsave(en_name);
@@ -362,9 +364,7 @@ add_menu_path (
menu->priority = pri_tab[pri_idx];
menu->parent = parent;
- /*
- * Add after menu that has lower priority.
- */
+ // Add after menu that has lower priority.
menu->next = *lower_pri;
*lower_pri = menu;
@@ -390,8 +390,9 @@ add_menu_path (
name = next_name;
xfree(dname);
dname = NULL;
- if (pri_tab[pri_idx + 1] != -1)
- ++pri_idx;
+ if (pri_tab[pri_idx + 1] != -1) {
+ pri_idx++;
+ }
}
xfree(path_name);
@@ -417,8 +418,7 @@ add_menu_path (
// Don't do this for "<Nop>".
c = 0;
d = 0;
- if (amenu && call_data != NULL && *call_data != NUL
- ) {
+ if (amenu && call_data != NULL && *call_data != NUL) {
switch (1 << i) {
case MENU_VISUAL_MODE:
case MENU_SELECT_MODE:
@@ -436,9 +436,9 @@ add_menu_path (
if (c != 0) {
menu->strings[i] = xmalloc(STRLEN(call_data) + 5 );
menu->strings[i][0] = c;
- if (d == 0)
+ if (d == 0) {
STRCPY(menu->strings[i] + 1, call_data);
- else {
+ } else {
menu->strings[i][1] = d;
STRCPY(menu->strings[i] + 2, call_data);
}
@@ -450,8 +450,9 @@ add_menu_path (
menu->strings[i][len + 1] = Ctrl_G;
menu->strings[i][len + 2] = NUL;
}
- } else
+ } else {
menu->strings[i] = p;
+ }
menu->noremap[i] = menuarg->noremap[0];
menu->silent[i] = menuarg->silent[0];
}
@@ -655,20 +656,109 @@ static void free_menu_string(vimmenu_T *menu, int idx)
menu->strings[idx] = NULL;
}
-/*
- * Show the mapping associated with a menu item or hierarchy in a sub-menu.
- */
-static int show_menus(char_u *path_name, int modes)
+/// Export menus
+///
+/// @param[in] menu if null, starts from root_menu
+/// @param modes, a choice of \ref MENU_MODES
+/// @return a dict with name/commands
+/// @see menu_get
+static dict_T *menu_get_recursive(const vimmenu_T *menu, int modes)
+{
+ dict_T *dict;
+
+ if (!menu || (menu->modes & modes) == 0x0) {
+ return NULL;
+ }
+
+ dict = tv_dict_alloc();
+ tv_dict_add_str(dict, S_LEN("name"), (char *)menu->dname);
+ tv_dict_add_nr(dict, S_LEN("priority"), (int)menu->priority);
+ tv_dict_add_nr(dict, S_LEN("hidden"), menu_is_hidden(menu->dname));
+
+ if (menu->mnemonic) {
+ char buf[MB_MAXCHAR + 1] = { 0 }; // > max value of utf8_char2bytes
+ utf_char2bytes(menu->mnemonic, (char_u *)buf);
+ tv_dict_add_str(dict, S_LEN("shortcut"), buf);
+ }
+
+ if (menu->actext) {
+ tv_dict_add_str(dict, S_LEN("actext"), (char *)menu->actext);
+ }
+
+ if (menu->modes & MENU_TIP_MODE && menu->strings[MENU_INDEX_TIP]) {
+ tv_dict_add_str(dict, S_LEN("tooltip"),
+ (char *)menu->strings[MENU_INDEX_TIP]);
+ }
+
+ if (!menu->children) {
+ // leaf menu
+ dict_T *commands = tv_dict_alloc();
+ tv_dict_add_dict(dict, S_LEN("mappings"), commands);
+
+ for (int bit = 0; bit < MENU_MODES; bit++) {
+ if ((menu->modes & modes & (1 << bit)) != 0) {
+ dict_T *impl = tv_dict_alloc();
+ tv_dict_add_allocated_str(impl, S_LEN("rhs"),
+ str2special_save((char *)menu->strings[bit],
+ false, false));
+ tv_dict_add_nr(impl, S_LEN("silent"), menu->silent[bit]);
+ tv_dict_add_nr(impl, S_LEN("enabled"),
+ (menu->enabled & (1 << bit)) ? 1 : 0);
+ tv_dict_add_nr(impl, S_LEN("noremap"),
+ (menu->noremap[bit] & REMAP_NONE) ? 1 : 0);
+ tv_dict_add_nr(impl, S_LEN("sid"),
+ (menu->noremap[bit] & REMAP_SCRIPT) ? 1 : 0);
+ tv_dict_add_dict(commands, (char *)&menu_mode_chars[bit], 1, impl);
+ }
+ }
+ } else {
+ // visit recursively all children
+ list_T *const children_list = tv_list_alloc(kListLenMayKnow);
+ for (menu = menu->children; menu != NULL; menu = menu->next) {
+ dict_T *dic = menu_get_recursive(menu, modes);
+ if (tv_dict_len(dict) > 0) {
+ tv_list_append_dict(children_list, dic);
+ }
+ }
+ tv_dict_add_list(dict, S_LEN("submenus"), children_list);
+ }
+ return dict;
+}
+
+
+/// Export menus matching path \p path_name
+///
+/// @param path_name
+/// @param modes supported modes, see \ref MENU_MODES
+/// @param[in,out] list must be allocated
+/// @return false if could not find path_name
+bool menu_get(char_u *const path_name, int modes, list_T *list)
{
- char_u *p;
- char_u *name;
vimmenu_T *menu;
- vimmenu_T *parent = NULL;
+ menu = find_menu(root_menu, path_name, modes);
+ if (!menu) {
+ return false;
+ }
+ for (; menu != NULL; menu = menu->next) {
+ dict_T *dict = menu_get_recursive(menu, modes);
+ if (dict && tv_dict_len(dict) > 0) {
+ tv_list_append_dict(list, dict);
+ }
+ }
+ return true;
+}
- menu = root_menu;
- name = path_name = vim_strsave(path_name);
- /* First, find the (sub)menu with the given name */
+/// Find menu matching required name and modes
+///
+/// @param menu top menu to start looking from
+/// @param name path towards the menu
+/// @return menu if \p name is null, found menu or NULL
+vimmenu_T *
+find_menu(vimmenu_T *menu, char_u * name, int modes)
+{
+ char_u *p;
+
while (*name) {
p = menu_name_skip(name);
while (menu != NULL) {
@@ -676,39 +766,46 @@ static int show_menus(char_u *path_name, int modes)
/* Found menu */
if (*p != NUL && menu->children == NULL) {
EMSG(_(e_notsubmenu));
- xfree(path_name);
- return FAIL;
+ return NULL;
} else if ((menu->modes & modes) == 0x0) {
EMSG(_(e_othermode));
- xfree(path_name);
- return FAIL;
+ return NULL;
}
break;
}
menu = menu->next;
}
+
if (menu == NULL) {
EMSG2(_(e_nomenu), name);
- xfree(path_name);
- return FAIL;
+ return NULL;
}
name = p;
- parent = menu;
menu = menu->children;
}
- xfree(path_name);
+ return menu;
+}
+
+/// Show the mapping associated with a menu item or hierarchy in a sub-menu.
+static int show_menus(char_u *const path_name, int modes)
+{
+ vimmenu_T *menu;
+
+ // First, find the (sub)menu with the given name
+ menu = find_menu(root_menu, path_name, modes);
+ if (!menu) {
+ return FAIL;
+ }
/* Now we have found the matching menu, and we list the mappings */
/* Highlight title */
MSG_PUTS_TITLE(_("\n--- Menus ---"));
- show_menus_recursive(parent, modes, 0);
+ show_menus_recursive(menu->parent, modes, 0);
return OK;
}
-/*
- * Recursively show the mappings associated with the menus under the given one
- */
+/// Recursively show the mappings associated with the menus under the given one
static void show_menus_recursive(vimmenu_T *menu, int modes, int depth)
{
int i;
@@ -727,8 +824,8 @@ static void show_menus_recursive(vimmenu_T *menu, int modes, int depth)
msg_outnum((long)menu->priority);
MSG_PUTS(" ");
}
- /* Same highlighting as for directories!? */
- msg_outtrans_attr(menu->name, hl_attr(HLF_D));
+ // Same highlighting as for directories!?
+ msg_outtrans_attr(menu->name, HL_ATTR(HLF_D));
}
if (menu != NULL && menu->children == NULL) {
@@ -755,10 +852,11 @@ static void show_menus_recursive(vimmenu_T *menu, int modes, int depth)
else
msg_putchar(' ');
MSG_PUTS(" ");
- if (*menu->strings[bit] == NUL)
- msg_puts_attr((char_u *)"<Nop>", hl_attr(HLF_8));
- else
- msg_outtrans_special(menu->strings[bit], FALSE);
+ if (*menu->strings[bit] == NUL) {
+ msg_puts_attr("<Nop>", HL_ATTR(HLF_8));
+ } else {
+ msg_outtrans_special(menu->strings[bit], false);
+ }
}
} else {
if (menu == NULL) {
@@ -990,16 +1088,17 @@ char_u *get_menu_names(expand_T *xp, int idx)
return str;
}
-/*
- * Skip over this element of the menu path and return the start of the next
- * element. Any \ and ^Vs are removed from the current element.
- * "name" may be modified.
- */
-char_u *menu_name_skip(char_u *name)
+
+/// Skip over this element of the menu path and return the start of the next
+/// element. Any \ and ^Vs are removed from the current element.
+///
+/// @param name may be modified.
+/// @return start of the next element
+char_u *menu_name_skip(char_u *const name)
{
char_u *p;
- for (p = name; *p && *p != '.'; mb_ptr_adv(p)) {
+ for (p = name; *p && *p != '.'; MB_PTR_ADV(p)) {
if (*p == '\\' || *p == Ctrl_V) {
STRMOVE(p, p + 1);
if (*p == NUL)
@@ -1015,16 +1114,16 @@ char_u *menu_name_skip(char_u *name)
* Return TRUE when "name" matches with menu "menu". The name is compared in
* two ways: raw menu name and menu name without '&'. ignore part after a TAB.
*/
-static int menu_name_equal(char_u *name, vimmenu_T *menu)
+static bool menu_name_equal(const char_u *const name, vimmenu_T *const menu)
{
if (menu->en_name != NULL
&& (menu_namecmp(name, menu->en_name)
|| menu_namecmp(name, menu->en_dname)))
- return TRUE;
+ return true;
return menu_namecmp(name, menu->name) || menu_namecmp(name, menu->dname);
}
-static int menu_namecmp(char_u *name, char_u *mname)
+static bool menu_namecmp(const char_u *const name, const char_u *const mname)
{
int i;
@@ -1035,18 +1134,20 @@ static int menu_namecmp(char_u *name, char_u *mname)
&& (mname[i] == NUL || mname[i] == TAB);
}
-/*
- * Return the modes specified by the given menu command (eg :menu! returns
- * MENU_CMDLINE_MODE | MENU_INSERT_MODE).
- * If "noremap" is not NULL, then the flag it points to is set according to
- * whether the command is a "nore" command.
- * If "unmenu" is not NULL, then the flag it points to is set according to
- * whether the command is an "unmenu" command.
- */
-static int
-get_menu_cmd_modes (
- char_u *cmd,
- int forceit, /* Was there a "!" after the command? */
+
+/// Returns the \ref MENU_MODES specified by menu command `cmd`.
+/// (eg :menu! returns MENU_CMDLINE_MODE | MENU_INSERT_MODE)
+///
+/// @param[in] cmd string like "nmenu", "vmenu", etc.
+/// @param[in] forceit bang (!) was given after the command
+/// @param[out] noremap If not NULL, the flag it points to is set according
+/// to whether the command is a "nore" command.
+/// @param[out] unmenu If not NULL, the flag it points to is set according
+/// to whether the command is an "unmenu" command.
+int
+get_menu_cmd_modes(
+ const char_u * cmd,
+ bool forceit,
int *noremap,
int *unmenu
)
@@ -1085,14 +1186,17 @@ get_menu_cmd_modes (
modes = MENU_NORMAL_MODE;
break;
}
- /* FALLTHROUGH */
+ FALLTHROUGH;
default:
- --cmd;
- if (forceit) /* menu!! */
+ cmd--;
+ if (forceit) {
+ // menu!!
modes = MENU_INSERT_MODE | MENU_CMDLINE_MODE;
- else /* menu */
+ } else {
+ // menu
modes = MENU_NORMAL_MODE | MENU_VISUAL_MODE | MENU_SELECT_MODE
| MENU_OP_PENDING_MODE;
+ }
}
if (noremap != NULL)
@@ -1198,12 +1302,14 @@ int menu_is_separator(char_u *name)
return name[0] == '-' && name[STRLEN(name) - 1] == '-';
}
-/*
- * Return TRUE if the menu is hidden: Starts with ']'
- */
+
+/// True if a popup menu or starts with \ref MNU_HIDDEN_CHAR
+///
+/// @return true if the menu is hidden
static int menu_is_hidden(char_u *name)
{
- return (name[0] == ']') || (menu_is_popup(name) && name[5] != NUL);
+ return (name[0] == MNU_HIDDEN_CHAR)
+ || (menu_is_popup(name) && name[5] != NUL);
}
/*
@@ -1310,17 +1416,20 @@ void ex_emenu(exarg_T *eap)
idx = MENU_INDEX_NORMAL;
}
- if (idx != MENU_INDEX_INVALID && menu->strings[idx] != NULL) {
- /* When executing a script or function execute the commands right now.
- * Otherwise put them in the typeahead buffer. */
- if (current_SID != 0)
+ assert(idx != MENU_INDEX_INVALID);
+ if (menu->strings[idx] != NULL) {
+ // When executing a script or function execute the commands right now.
+ // Otherwise put them in the typeahead buffer.
+ if (current_SID != 0) {
exec_normal_cmd(menu->strings[idx], menu->noremap[idx],
- menu->silent[idx]);
- else
- ins_typebuf(menu->strings[idx], menu->noremap[idx], 0,
- TRUE, menu->silent[idx]);
- } else
+ menu->silent[idx]);
+ } else {
+ ins_typebuf(menu->strings[idx], menu->noremap[idx], 0, true,
+ menu->silent[idx]);
+ }
+ } else {
EMSG2(_("E335: Menu not defined for %s mode"), mode);
+ }
}
/*
@@ -1439,9 +1548,11 @@ static void menu_unescape_name(char_u *name)
{
char_u *p;
- for (p = name; *p && *p != '.'; mb_ptr_adv(p))
- if (*p == '\\')
+ for (p = name; *p && *p != '.'; MB_PTR_ADV(p)) {
+ if (*p == '\\') {
STRMOVE(p, p + 1);
+ }
+ }
}
/*
diff --git a/src/nvim/menu.h b/src/nvim/menu.h
index 3266c511b4..5ff979f2bf 100644
--- a/src/nvim/menu.h
+++ b/src/nvim/menu.h
@@ -1,7 +1,14 @@
#ifndef NVIM_MENU_H
#define NVIM_MENU_H
-/* Indices into vimmenu_T->strings[] and vimmenu_T->noremap[] for each mode */
+#include <stdbool.h> // for bool
+
+#include "nvim/types.h" // for char_u and expand_T
+#include "nvim/ex_cmds_defs.h" // for exarg_T
+
+/// Indices into vimmenu_T->strings[] and vimmenu_T->noremap[] for each mode
+/// \addtogroup MENU_INDEX
+/// @{
#define MENU_INDEX_INVALID -1
#define MENU_INDEX_NORMAL 0
#define MENU_INDEX_VISUAL 1
@@ -11,8 +18,12 @@
#define MENU_INDEX_CMDLINE 5
#define MENU_INDEX_TIP 6
#define MENU_MODES 7
+/// @}
+/// note MENU_INDEX_TIP is not a 'real' mode
-/* Menu modes */
+/// Menu modes
+/// \addtogroup MENU_MODES
+/// @{
#define MENU_NORMAL_MODE (1 << MENU_INDEX_NORMAL)
#define MENU_VISUAL_MODE (1 << MENU_INDEX_VISUAL)
#define MENU_SELECT_MODE (1 << MENU_INDEX_SELECT)
@@ -21,31 +32,30 @@
#define MENU_CMDLINE_MODE (1 << MENU_INDEX_CMDLINE)
#define MENU_TIP_MODE (1 << MENU_INDEX_TIP)
#define MENU_ALL_MODES ((1 << MENU_INDEX_TIP) - 1)
-/*note MENU_INDEX_TIP is not a 'real' mode*/
+/// @}
-/* Start a menu name with this to not include it on the main menu bar */
+/// Start a menu name with this to not include it on the main menu bar
#define MNU_HIDDEN_CHAR ']'
typedef struct VimMenu vimmenu_T;
struct VimMenu {
- int modes; /* Which modes is this menu visible for? */
- int enabled; /* for which modes the menu is enabled */
- char_u *name; /* Name of menu, possibly translated */
- char_u *dname; /* Displayed Name ("name" without '&') */
- char_u *en_name; /* "name" untranslated, NULL when "name"
- * was not translated */
- char_u *en_dname; /* "dname" untranslated, NULL when "dname"
- * was not translated */
- int mnemonic; /* mnemonic key (after '&') */
- char_u *actext; /* accelerator text (after TAB) */
- long priority; /* Menu order priority */
- char_u *strings[MENU_MODES]; /* Mapped string for each mode */
- int noremap[MENU_MODES]; /* A REMAP_ flag for each mode */
- bool silent[MENU_MODES]; /* A silent flag for each mode */
- vimmenu_T *children; /* Children of sub-menu */
- vimmenu_T *parent; /* Parent of menu */
- vimmenu_T *next; /* Next item in menu */
+ int modes; ///< Which modes is this menu visible for
+ int enabled; ///< for which modes the menu is enabled
+ char_u *name; ///< Name of menu, possibly translated
+ char_u *dname; ///< Displayed Name ("name" without '&')
+ char_u *en_name; ///< "name" untranslated, NULL when
+ ///< was not translated
+ char_u *en_dname; ///< NULL when "dname" untranslated
+ int mnemonic; ///< mnemonic key (after '&')
+ char_u *actext; ///< accelerator text (after TAB)
+ long priority; ///< Menu order priority
+ char_u *strings[MENU_MODES]; ///< Mapped string for each mode
+ int noremap[MENU_MODES]; ///< A \ref REMAP_VALUES flag for each mode
+ bool silent[MENU_MODES]; ///< A silent flag for each mode
+ vimmenu_T *children; ///< Children of sub-menu
+ vimmenu_T *parent; ///< Parent of menu
+ vimmenu_T *next; ///< Next item in menu
};
diff --git a/src/nvim/message.c b/src/nvim/message.c
index 77e8f0e4f2..37e40c3cc1 100644
--- a/src/nvim/message.c
+++ b/src/nvim/message.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* message.c: functions for displaying messages on the command line
*/
@@ -7,10 +10,10 @@
#include <stdbool.h>
#include <stdarg.h>
#include <string.h>
-#include <math.h>
#include "nvim/vim.h"
#include "nvim/ascii.h"
+#include "nvim/assert.h"
#include "nvim/message.h"
#include "nvim/charset.h"
#include "nvim/eval.h"
@@ -19,15 +22,16 @@
#include "nvim/fileio.h"
#include "nvim/func_attr.h"
#include "nvim/getchar.h"
+#include "nvim/main.h"
#include "nvim/mbyte.h"
#include "nvim/memory.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/keymap.h"
#include "nvim/garray.h"
#include "nvim/ops.h"
#include "nvim/option.h"
#include "nvim/normal.h"
+#include "nvim/regexp.h"
#include "nvim/screen.h"
#include "nvim/strings.h"
#include "nvim/ui.h"
@@ -128,9 +132,9 @@ int verb_msg(char_u *s)
return n;
}
-int msg_attr(char_u *s, int attr) FUNC_ATTR_NONNULL_ARG(1)
+int msg_attr(const char *s, const int attr) FUNC_ATTR_NONNULL_ARG(1)
{
- return msg_attr_keep(s, attr, FALSE);
+ return msg_attr_keep((char_u *)s, attr, false);
}
int
@@ -145,6 +149,12 @@ msg_attr_keep (
int retval;
char_u *buf = NULL;
+ // Skip messages not match ":filter pattern".
+ // Don't filter when there is an error.
+ if (!emsg_on_display && message_filtered(s)) {
+ return true;
+ }
+
if (attr == 0) {
set_vim_var_string(VV_STATUSMSG, (char *) s, -1);
}
@@ -164,8 +174,9 @@ msg_attr_keep (
|| (*s != '<'
&& last_msg_hist != NULL
&& last_msg_hist->msg != NULL
- && STRCMP(s, last_msg_hist->msg)))
- add_msg_hist(s, -1, attr);
+ && STRCMP(s, last_msg_hist->msg))) {
+ add_msg_hist((const char *)s, -1, attr);
+ }
/* When displaying keep_msg, don't let msg_start() free it, caller must do
* that. */
@@ -236,17 +247,19 @@ msg_strtrunc (
* Truncate a string "s" to "buf" with cell width "room".
* "s" and "buf" may be equal.
*/
-void trunc_string(char_u *s, char_u *buf, int room, int buflen)
+void trunc_string(char_u *s, char_u *buf, int room_in, int buflen)
{
- int half;
- int len;
+ size_t room = room_in - 3; // "..." takes 3 chars
+ size_t half;
+ size_t len = 0;
int e;
int i;
int n;
- room -= 3;
+ if (room_in < 3) {
+ room = 0;
+ }
half = room / 2;
- len = 0;
/* First part: Start of the string. */
for (e = 0; len < half && e < buflen; ++e) {
@@ -256,8 +269,9 @@ void trunc_string(char_u *s, char_u *buf, int room, int buflen)
return;
}
n = ptr2cells(s + e);
- if (len + n >= half)
+ if (len + n > half) {
break;
+ }
len += n;
buf[e] = s[e];
if (has_mbyte)
@@ -268,45 +282,46 @@ void trunc_string(char_u *s, char_u *buf, int room, int buflen)
}
}
- /* Last part: End of the string. */
- i = e;
- if (enc_dbcs != 0) {
- /* For DBCS going backwards in a string is slow, but
- * computing the cell width isn't too slow: go forward
- * until the rest fits. */
- n = vim_strsize(s + i);
- while (len + n > room) {
- n -= ptr2cells(s + i);
- i += (*mb_ptr2len)(s + i);
- }
- } else if (enc_utf8) {
- /* For UTF-8 we can go backwards easily. */
- half = i = (int)STRLEN(s);
- for (;; ) {
- do
- half = half - (*mb_head_off)(s, s + half - 1) - 1;
- while (utf_iscomposing(utf_ptr2char(s + half)) && half > 0);
- n = ptr2cells(s + half);
- if (len + n > room)
- break;
- len += n;
- i = half;
+ // Last part: End of the string.
+ half = i = (int)STRLEN(s);
+ for (;;) {
+ do {
+ half = half - utf_head_off(s, s + half - 1) - 1;
+ } while (half > 0 && utf_iscomposing(utf_ptr2char(s + half)));
+ n = ptr2cells(s + half);
+ if (len + n > room || half == 0) {
+ break;
}
- } else {
- for (i = (int)STRLEN(s); len + (n = ptr2cells(s + i - 1)) <= room; --i)
- len += n;
+ len += n;
+ i = half;
}
- /* Set the middle and copy the last part. */
- if (e + 3 < buflen) {
+ if (i <= e + 3) {
+ // text fits without truncating
+ if (s != buf) {
+ len = STRLEN(s);
+ if (len >= (size_t)buflen) {
+ len = buflen - 1;
+ }
+ len = len - e + 1;
+ if (len < 1) {
+ buf[e - 1] = NUL;
+ } else {
+ memmove(buf + e, s + e, len);
+ }
+ }
+ } else if (e + 3 < buflen) {
+ // set the middle and copy the last part
memmove(buf + e, "...", (size_t)3);
- len = (int)STRLEN(s + i) + 1;
- if (len >= buflen - e - 3)
+ len = STRLEN(s + i) + 1;
+ if (len >= (size_t)buflen - e - 3) {
len = buflen - e - 3 - 1;
+ }
memmove(buf + e + 3, s + i, len);
buf[e + 3 + len - 1] = NUL;
} else {
- buf[e - 1] = NUL; /* make sure it is truncated */
+ // can't fit in the "...", just truncate it
+ buf[e - 1] = NUL;
}
}
@@ -316,6 +331,7 @@ void trunc_string(char_u *s, char_u *buf, int room, int buflen)
*/
int smsg(char *s, ...)
+ FUNC_ATTR_PRINTF(1, 2)
{
va_list arglist;
@@ -326,13 +342,14 @@ int smsg(char *s, ...)
}
int smsg_attr(int attr, char *s, ...)
+ FUNC_ATTR_PRINTF(2, 3)
{
va_list arglist;
va_start(arglist, s);
vim_vsnprintf((char *)IObuff, IOSIZE, s, arglist, NULL);
va_end(arglist);
- return msg_attr(IObuff, attr);
+ return msg_attr((const char *)IObuff, attr);
}
/*
@@ -366,42 +383,40 @@ static int other_sourcing_name(void)
return FALSE;
}
-/*
- * Get the message about the source, as used for an error message.
- * Returns an allocated string with room for one more character.
- * Returns NULL when no message is to be given.
- */
-static char_u *get_emsg_source(void)
+/// Get the message about the source, as used for an error message
+///
+/// @return [allocated] String with room for one more character. NULL when no
+/// message is to be given.
+static char *get_emsg_source(void)
+ FUNC_ATTR_MALLOC FUNC_ATTR_WARN_UNUSED_RESULT
{
- char_u *Buf, *p;
-
if (sourcing_name != NULL && other_sourcing_name()) {
- p = (char_u *)_("Error detected while processing %s:");
- Buf = xmalloc(STRLEN(sourcing_name) + STRLEN(p));
- sprintf((char *)Buf, (char *)p, sourcing_name);
- return Buf;
+ const char *const p = _("Error detected while processing %s:");
+ const size_t buf_len = STRLEN(sourcing_name) + strlen(p) + 1;
+ char *const buf = xmalloc(buf_len);
+ snprintf(buf, buf_len, p, sourcing_name);
+ return buf;
}
return NULL;
}
-/*
- * Get the message about the source lnum, as used for an error message.
- * Returns an allocated string with room for one more character.
- * Returns NULL when no message is to be given.
- */
-static char_u *get_emsg_lnum(void)
+/// Get the message about the source lnum, as used for an error message.
+///
+/// @return [allocated] String with room for one more character. NULL when no
+/// message is to be given.
+static char *get_emsg_lnum(void)
+ FUNC_ATTR_MALLOC FUNC_ATTR_WARN_UNUSED_RESULT
{
- char_u *Buf, *p;
-
- /* lnum is 0 when executing a command from the command line
- * argument, we don't want a line number then */
+ // lnum is 0 when executing a command from the command line
+ // argument, we don't want a line number then
if (sourcing_name != NULL
&& (other_sourcing_name() || sourcing_lnum != last_sourcing_lnum)
&& sourcing_lnum != 0) {
- p = (char_u *)_("line %4ld:");
- Buf = xmalloc(STRLEN(p) + 20);
- sprintf((char *)Buf, (char *)p, (long)sourcing_lnum);
- return Buf;
+ const char *const p = _("line %4ld:");
+ const size_t buf_len = 20 + strlen(p);
+ char *const buf = xmalloc(buf_len);
+ snprintf(buf, buf_len, p, (long)sourcing_lnum);
+ return buf;
}
return NULL;
}
@@ -413,17 +428,15 @@ static char_u *get_emsg_lnum(void)
*/
void msg_source(int attr)
{
- char_u *p;
-
- ++no_wait_return;
- p = get_emsg_source();
+ no_wait_return++;
+ char *p = get_emsg_source();
if (p != NULL) {
msg_attr(p, attr);
xfree(p);
}
p = get_emsg_lnum();
if (p != NULL) {
- msg_attr(p, hl_attr(HLF_N));
+ msg_attr(p, HL_ATTR(HLF_N));
xfree(p);
last_sourcing_lnum = sourcing_lnum; /* only once for each line */
}
@@ -463,10 +476,10 @@ int emsg_not_now(void)
*
* return TRUE if wait_return not called
*/
-int emsg(char_u *s)
+int emsg(const char_u *s_)
{
+ const char *s = (const char *)s_;
int attr;
- char_u *p;
int ignore = false;
int severe;
@@ -476,9 +489,6 @@ int emsg(char_u *s)
}
called_emsg = true;
- if (emsg_silent == 0) {
- ex_exitval = 1;
- }
// If "emsg_severe" is TRUE: When an error exception is to be thrown,
// prefer this message over previous messages for the same command.
@@ -493,41 +503,47 @@ int emsg(char_u *s)
* when the message should be ignored completely (used for the
* interrupt message).
*/
- if (cause_errthrow(s, severe, &ignore) == true) {
+ if (cause_errthrow((char_u *)s, severe, &ignore) == true) {
if (!ignore) {
- did_emsg = true;
+ did_emsg++;
}
return true;
}
// set "v:errmsg", also when using ":silent! cmd"
- set_vim_var_string(VV_ERRMSG, (char *) s, -1);
+ set_vim_var_string(VV_ERRMSG, s, -1);
/*
* When using ":silent! cmd" ignore error messages.
* But do write it to the redirection file.
*/
if (emsg_silent != 0) {
- msg_start();
- p = get_emsg_source();
- if (p != NULL) {
- STRCAT(p, "\n");
- redir_write(p, STRLEN(p));
- xfree(p);
- }
- p = get_emsg_lnum();
- if (p != NULL) {
- STRCAT(p, "\n");
- redir_write(p, STRLEN(p));
- xfree(p);
+ if (!emsg_noredir) {
+ msg_start();
+ char *p = get_emsg_source();
+ if (p != NULL) {
+ const size_t p_len = strlen(p);
+ p[p_len] = '\n';
+ redir_write(p, p_len + 1);
+ xfree(p);
+ }
+ p = get_emsg_lnum();
+ if (p != NULL) {
+ const size_t p_len = strlen(p);
+ p[p_len] = '\n';
+ redir_write(p, p_len + 1);
+ xfree(p);
+ }
+ redir_write(s, strlen(s));
}
- redir_write(s, STRLEN(s));
return true;
}
+ ex_exitval = 1;
+
// Reset msg_silent, an error causes messages to be switched back on.
msg_silent = 0;
- cmd_silent = FALSE;
+ cmd_silent = false;
if (global_busy) { // break :global command
global_busy++;
@@ -536,14 +552,14 @@ int emsg(char_u *s)
if (p_eb) {
beep_flush(); // also includes flush_buffers()
} else {
- flush_buffers(false); // flush internal buffers
+ flush_buffers(FLUSH_MINIMAL); // flush internal buffers
}
- did_emsg = true; // flag for DoOneCmd()
+ did_emsg++; // flag for DoOneCmd()
}
emsg_on_display = true; // remember there is an error message
msg_scroll++; // don't overwrite a previous message
- attr = hl_attr(HLF_E); // set highlight mode for error messages
+ attr = HL_ATTR(HLF_E); // set highlight mode for error messages
if (msg_scrolled != 0) {
need_wait_return = true; // needed in case emsg() is called after
} // wait_return has reset need_wait_return
@@ -555,10 +571,8 @@ int emsg(char_u *s)
*/
msg_source(attr);
- /*
- * Display the error message itself.
- */
- msg_nowait = FALSE; /* wait for this msg */
+ // Display the error message itself.
+ msg_nowait = false; // Wait for this msg.
return msg_attr(s, attr);
}
@@ -569,17 +583,79 @@ void emsg_invreg(int name)
/// Print an error message with unknown number of arguments
bool emsgf(const char *const fmt, ...)
+ FUNC_ATTR_PRINTF(1, 2)
{
+ bool ret;
+
+ va_list ap;
+ va_start(ap, fmt);
+ ret = emsgfv(fmt, ap);
+ va_end(ap);
+
+ return ret;
+}
+
+/// Print an error message with unknown number of arguments
+static bool emsgfv(const char *fmt, va_list ap)
+{
+ static char errbuf[IOSIZE];
if (emsg_not_now()) {
return true;
}
+ vim_vsnprintf(errbuf, sizeof(errbuf), fmt, ap, NULL);
+
+ return emsg((const char_u *)errbuf);
+}
+
+/// Same as emsg(...), but abort on error when ABORT_ON_INTERNAL_ERROR is
+/// defined. It is used for internal errors only, so that they can be
+/// detected when fuzzing vim.
+void iemsg(const char *s)
+{
+ emsg((char_u *)s);
+#ifdef ABORT_ON_INTERNAL_ERROR
+ abort();
+#endif
+}
+
+/// Same as emsgf(...) but abort on error when ABORT_ON_INTERNAL_ERROR is
+/// defined. It is used for internal errors only, so that they can be
+/// detected when fuzzing vim.
+void iemsgf(const char *s, ...)
+{
+ va_list ap;
+ va_start(ap, s);
+ (void)emsgfv(s, ap);
+ va_end(ap);
+#ifdef ABORT_ON_INTERNAL_ERROR
+ abort();
+#endif
+}
+
+/// Give an "Internal error" message.
+void internal_error(char *where)
+{
+ IEMSG2(_(e_intern2), where);
+}
+
+static void msg_emsgf_event(void **argv)
+{
+ char *s = argv[0];
+ (void)emsg((char_u *)s);
+ xfree(s);
+}
+
+void msg_schedule_emsgf(const char *const fmt, ...)
+ FUNC_ATTR_PRINTF(1, 2)
+{
va_list ap;
va_start(ap, fmt);
- vim_vsnprintf((char *) IObuff, IOSIZE, fmt, ap, NULL);
+ vim_vsnprintf((char *)IObuff, IOSIZE, fmt, ap, NULL);
va_end(ap);
- return emsg(IObuff);
+ char *s = xstrdup((char *)IObuff);
+ loop_schedule(&main_loop, event_create(msg_emsgf_event, 1, s));
}
/*
@@ -592,14 +668,14 @@ char_u *msg_trunc_attr(char_u *s, int force, int attr)
{
int n;
- /* Add message to history before truncating */
- add_msg_hist(s, -1, attr);
+ // Add message to history before truncating.
+ add_msg_hist((const char *)s, -1, attr);
s = msg_may_trunc(force, s);
- msg_hist_off = TRUE;
- n = msg_attr(s, attr);
- msg_hist_off = FALSE;
+ msg_hist_off = true;
+ n = msg_attr((const char *)s, attr);
+ msg_hist_off = false;
if (n)
return s;
@@ -627,8 +703,8 @@ char_u *msg_may_trunc(int force, char_u *s)
return s;
for (n = 0; size >= room; ) {
- size -= (*mb_ptr2cells)(s + n);
- n += (*mb_ptr2len)(s + n);
+ size -= utf_ptr2cells(s + n);
+ n += utfc_ptr2len(s + n);
}
--n;
}
@@ -638,12 +714,8 @@ char_u *msg_may_trunc(int force, char_u *s)
return s;
}
-static void
-add_msg_hist (
- char_u *s,
- int len, /* -1 for undetermined length */
- int attr
-)
+/// @param[in] len Length of s or -1.
+static void add_msg_hist(const char *s, int len, int attr)
{
if (msg_hist_off || msg_silent != 0)
return;
@@ -661,9 +733,10 @@ add_msg_hist (
++s;
--len;
}
- while (len > 0 && s[len - 1] == '\n')
- --len;
- p->msg = vim_strnsave(s, len);
+ while (len > 0 && s[len - 1] == '\n') {
+ len--;
+ }
+ p->msg = (char_u *)xmemdupz(s, (size_t)len);
p->next = NULL;
p->attr = attr;
if (last_msg_hist != NULL)
@@ -696,27 +769,53 @@ int delete_first_msg(void)
return OK;
}
-/*
- * ":messages" command.
- */
-void ex_messages(exarg_T *eap)
+/// :messages command implementation
+void ex_messages(void *const eap_p)
+ FUNC_ATTR_NONNULL_ALL
{
+ const exarg_T *const eap = (const exarg_T *)eap_p;
struct msg_hist *p;
- const char *s;
+ int c = 0;
+
+ if (STRCMP(eap->arg, "clear") == 0) {
+ int keep = eap->addr_count == 0 ? 0 : eap->line2;
+
+ while (msg_hist_len > keep) {
+ (void)delete_first_msg();
+ }
+ return;
+ }
+
+ if (*eap->arg != NUL) {
+ EMSG(_(e_invarg));
+ return;
+ }
+
+ msg_hist_off = true;
- msg_hist_off = TRUE;
+ p = first_msg_hist;
- s = os_getenv("LANG");
- if (s)
- msg_attr((char_u *)
- _("Messages maintainer: Bram Moolenaar <Bram@vim.org>"),
- hl_attr(HLF_T));
+ if (eap->addr_count != 0) {
+ // Count total messages
+ for (; p != NULL && !got_int; p = p->next) {
+ c++;
+ }
+
+ c -= eap->line2;
+
+ // Skip without number of messages specified
+ for (p = first_msg_hist; p != NULL && !got_int && c > 0; p = p->next, c--) {
+ }
+ }
- for (p = first_msg_hist; p != NULL && !got_int; p = p->next)
- if (p->msg != NULL)
- msg_attr(p->msg, p->attr);
+ // Display what was not skipped.
+ for (; p != NULL && !got_int; p = p->next) {
+ if (p->msg != NULL) {
+ msg_attr((const char *)p->msg, p->attr);
+ }
+ }
- msg_hist_off = FALSE;
+ msg_hist_off = false;
}
/*
@@ -733,12 +832,11 @@ void msg_end_prompt(void)
lines_left = -1;
}
-/*
- * wait for the user to hit a key (normally a return)
- * if 'redraw' is TRUE, clear and redraw the screen
- * if 'redraw' is FALSE, just redraw the screen
- * if 'redraw' is -1, don't redraw at all
- */
+/// wait for the user to hit a key (normally a return)
+///
+/// if 'redraw' is true, redraw the entire screen NOT_VALID
+/// if 'redraw' is false, do a normal redraw
+/// if 'redraw' is -1, don't redraw at all
void wait_return(int redraw)
{
int c;
@@ -748,8 +846,9 @@ void wait_return(int redraw)
int save_Recording;
FILE *save_scriptout;
- if (redraw == TRUE)
- must_redraw = CLEAR;
+ if (redraw == true) {
+ redraw_all_later(NOT_VALID);
+ }
/* If using ":silent cmd", don't wait for a return. Also don't set
* need_wait_return to do it later. */
@@ -803,23 +902,22 @@ void wait_return(int redraw)
* CTRL-C, but we need to loop then. */
had_got_int = got_int;
- /* Don't do mappings here, we put the character back in the
- * typeahead buffer. */
- ++no_mapping;
- ++allow_keys;
+ // Don't do mappings here, we put the character back in the
+ // typeahead buffer.
+ no_mapping++;
- /* Temporarily disable Recording. If Recording is active, the
- * character will be recorded later, since it will be added to the
- * typebuf after the loop */
+ // Temporarily disable Recording. If Recording is active, the
+ // character will be recorded later, since it will be added to the
+ // typebuf after the loop
save_Recording = Recording;
save_scriptout = scriptout;
Recording = FALSE;
scriptout = NULL;
c = safe_vgetc();
- if (had_got_int && !global_busy)
- got_int = FALSE;
- --no_mapping;
- --allow_keys;
+ if (had_got_int && !global_busy) {
+ got_int = false;
+ }
+ no_mapping--;
Recording = save_Recording;
scriptout = save_scriptout;
@@ -940,9 +1038,10 @@ static void hit_return_msg(void)
if (got_int)
MSG_PUTS(_("Interrupt: "));
- MSG_PUTS_ATTR(_("Press ENTER or type command to continue"), hl_attr(HLF_R));
- if (!msg_use_printf())
+ MSG_PUTS_ATTR(_("Press ENTER or type command to continue"), HL_ATTR(HLF_R));
+ if (!msg_use_printf()) {
msg_clr_eos();
+ }
p_more = save_p_more;
}
@@ -996,9 +1095,10 @@ void msg_start(void)
msg_didout = FALSE; /* no output on current line yet */
}
- /* when redirecting, may need to start a new line. */
- if (!did_return)
- redir_write((char_u *)"\n", -1);
+ // When redirecting, may need to start a new line.
+ if (!did_return) {
+ redir_write("\n", 1);
+ }
}
/*
@@ -1017,24 +1117,24 @@ void msg_putchar(int c)
void msg_putchar_attr(int c, int attr)
{
- char_u buf[MB_MAXBYTES + 1];
+ char buf[MB_MAXBYTES + 1];
if (IS_SPECIAL(c)) {
- buf[0] = K_SPECIAL;
- buf[1] = K_SECOND(c);
- buf[2] = K_THIRD(c);
+ buf[0] = (char)K_SPECIAL;
+ buf[1] = (char)K_SECOND(c);
+ buf[2] = (char)K_THIRD(c);
buf[3] = NUL;
} else {
- buf[(*mb_char2bytes)(c, buf)] = NUL;
+ buf[utf_char2bytes(c, (char_u *)buf)] = NUL;
}
msg_puts_attr(buf, attr);
}
void msg_outnum(long n)
{
- char_u buf[20];
+ char buf[20];
- sprintf((char *)buf, "%" PRId64, (int64_t)n);
+ snprintf(buf, sizeof(buf), "%ld", n);
msg_puts(buf);
}
@@ -1045,7 +1145,7 @@ void msg_home_replace(char_u *fname)
void msg_home_replace_hl(char_u *fname)
{
- msg_home_replace_attr(fname, hl_attr(HLF_D));
+ msg_home_replace_attr(fname, HL_ATTR(HLF_D));
}
static void msg_home_replace_attr(char_u *fname, int attr)
@@ -1090,16 +1190,16 @@ char_u *msg_outtrans_one(char_u *p, int attr)
msg_outtrans_len_attr(p, l, attr);
return p + l;
}
- msg_puts_attr(transchar_byte(*p), attr);
+ msg_puts_attr((const char *)transchar_byte(*p), attr);
return p + 1;
}
int msg_outtrans_len_attr(char_u *msgstr, int len, int attr)
{
int retval = 0;
- char_u *str = msgstr;
- char_u *plain_start = msgstr;
- char_u *s;
+ const char *str = (const char *)msgstr;
+ const char *plain_start = (const char *)msgstr;
+ char_u *s;
int mb_l;
int c;
@@ -1109,60 +1209,59 @@ int msg_outtrans_len_attr(char_u *msgstr, int len, int attr)
attr &= ~MSG_HIST;
}
- /* If the string starts with a composing character first draw a space on
- * which the composing char can be drawn. */
- if (enc_utf8 && utf_iscomposing(utf_ptr2char(msgstr)))
- msg_puts_attr((char_u *)" ", attr);
+ // If the string starts with a composing character first draw a space on
+ // which the composing char can be drawn.
+ if (enc_utf8 && utf_iscomposing(utf_ptr2char(msgstr))) {
+ msg_puts_attr(" ", attr);
+ }
/*
* Go over the string. Special characters are translated and printed.
* Normal characters are printed several at a time.
*/
while (--len >= 0) {
- if (enc_utf8)
- /* Don't include composing chars after the end. */
- mb_l = utfc_ptr2len_len(str, len + 1);
- else if (has_mbyte)
- mb_l = (*mb_ptr2len)(str);
- else
- mb_l = 1;
- if (has_mbyte && mb_l > 1) {
- c = (*mb_ptr2char)(str);
- if (vim_isprintc(c))
- /* printable multi-byte char: count the cells. */
- retval += (*mb_ptr2cells)(str);
- else {
- /* unprintable multi-byte char: print the printable chars so
- * far and the translation of the unprintable char. */
- if (str > plain_start)
- msg_puts_attr_len(plain_start, (int)(str - plain_start),
- attr);
+ // Don't include composing chars after the end.
+ mb_l = utfc_ptr2len_len((char_u *)str, len + 1);
+ if (mb_l > 1) {
+ c = utf_ptr2char((char_u *)str);
+ if (vim_isprintc(c)) {
+ // Printable multi-byte char: count the cells.
+ retval += utf_ptr2cells((char_u *)str);
+ } else {
+ // Unprintable multi-byte char: print the printable chars so
+ // far and the translation of the unprintable char.
+ if (str > plain_start) {
+ msg_puts_attr_len(plain_start, str - plain_start, attr);
+ }
plain_start = str + mb_l;
- msg_puts_attr(transchar(c), attr == 0 ? hl_attr(HLF_8) : attr);
+ msg_puts_attr((const char *)transchar(c),
+ (attr == 0 ? HL_ATTR(HLF_8) : attr));
retval += char2cells(c);
}
len -= mb_l - 1;
str += mb_l;
} else {
- s = transchar_byte(*str);
+ s = transchar_byte((uint8_t)(*str));
if (s[1] != NUL) {
- /* unprintable char: print the printable chars so far and the
- * translation of the unprintable char. */
- if (str > plain_start)
- msg_puts_attr_len(plain_start, (int)(str - plain_start),
- attr);
+ // Unprintable char: print the printable chars so far and the
+ // translation of the unprintable char.
+ if (str > plain_start) {
+ msg_puts_attr_len(plain_start, str - plain_start, attr);
+ }
plain_start = str + 1;
- msg_puts_attr(s, attr == 0 ? hl_attr(HLF_8) : attr);
+ msg_puts_attr((const char *)s, attr == 0 ? HL_ATTR(HLF_8) : attr);
retval += (int)STRLEN(s);
- } else
- ++retval;
- ++str;
+ } else {
+ retval++;
+ }
+ str++;
}
}
- if (str > plain_start)
- /* print the printable chars at the end */
- msg_puts_attr_len(plain_start, (int)(str - plain_start), attr);
+ if (str > plain_start) {
+ // Print the printable chars at the end.
+ msg_puts_attr_len(plain_start, str - plain_start, attr);
+ }
return retval;
}
@@ -1183,152 +1282,165 @@ void msg_make(char_u *arg)
}
}
-/*
- * Output the string 'str' upto a NUL character.
- * Return the number of characters it takes on the screen.
- *
- * If K_SPECIAL is encountered, then it is taken in conjunction with the
- * following character and shown as <F1>, <S-Up> etc. Any other character
- * which is not printable shown in <> form.
- * If 'from' is TRUE (lhs of a mapping), a space is shown as <Space>.
- * If a character is displayed in one of these special ways, is also
- * highlighted (its highlight name is '8' in the p_hl variable).
- * Otherwise characters are not highlighted.
- * This function is used to show mappings, where we want to see how to type
- * the character/string -- webb
- */
-int
-msg_outtrans_special (
- char_u *strstart,
- int from /* TRUE for lhs of a mapping */
+/// Output the string 'str' upto a NUL character.
+/// Return the number of characters it takes on the screen.
+///
+/// If K_SPECIAL is encountered, then it is taken in conjunction with the
+/// following character and shown as <F1>, <S-Up> etc. Any other character
+/// which is not printable shown in <> form.
+/// If 'from' is TRUE (lhs of a mapping), a space is shown as <Space>.
+/// If a character is displayed in one of these special ways, is also
+/// highlighted (its highlight name is '8' in the p_hl variable).
+/// Otherwise characters are not highlighted.
+/// This function is used to show mappings, where we want to see how to type
+/// the character/string -- webb
+int msg_outtrans_special(
+ const char_u *strstart,
+ int from ///< true for LHS of a mapping
)
{
- char_u *str = strstart;
+ if (strstart == NULL) {
+ return 0; // Do nothing.
+ }
+ const char_u *str = strstart;
int retval = 0;
- char_u *string;
- int attr;
- int len;
+ int attr = HL_ATTR(HLF_8);
- attr = hl_attr(HLF_8);
while (*str != NUL) {
- /* Leading and trailing spaces need to be displayed in <> form. */
+ const char *string;
+ // Leading and trailing spaces need to be displayed in <> form.
if ((str == strstart || str[1] == NUL) && *str == ' ') {
- string = (char_u *)"<Space>";
- ++str;
- } else
- string = str2special(&str, from);
- len = vim_strsize(string);
- /* Highlight special keys */
- msg_puts_attr(string, len > 1
- && (*mb_ptr2len)(string) <= 1
- ? attr : 0);
+ string = "<Space>";
+ str++;
+ } else {
+ string = str2special((const char **)&str, from, false);
+ }
+ const int len = vim_strsize((char_u *)string);
+ // Highlight special keys
+ msg_puts_attr(string, (len > 1
+ && (*mb_ptr2len)((char_u *)string) <= 1
+ ? attr : 0));
retval += len;
}
return retval;
}
-/*
- * Return the lhs or rhs of a mapping, with the key codes turned into printable
- * strings, in an allocated string.
- */
-char_u *
-str2special_save (
- char_u *str,
- int is_lhs /* TRUE for lhs, FALSE for rhs */
-)
+/// Convert string, replacing key codes with printables
+///
+/// Used for lhs or rhs of mappings.
+///
+/// @param[in] str String to convert.
+/// @param[in] replace_spaces Convert spaces into `<Space>`, normally used fo
+/// lhs, but not rhs.
+/// @param[in] replace_lt Convert `<` into `<lt>`.
+///
+/// @return [allocated] Converted string.
+char *str2special_save(const char *const str, const bool replace_spaces,
+ const bool replace_lt)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_MALLOC
+ FUNC_ATTR_NONNULL_RET
{
garray_T ga;
- char_u *p = str;
-
ga_init(&ga, 1, 40);
- while (*p != NUL)
- ga_concat(&ga, str2special(&p, is_lhs));
+
+ const char *p = str;
+ while (*p != NUL) {
+ ga_concat(&ga, (const char_u *)str2special(&p, replace_spaces, replace_lt));
+ }
ga_append(&ga, NUL);
- return (char_u *)ga.ga_data;
+ return (char *)ga.ga_data;
}
-/*
- * Return the printable string for the key codes at "*sp".
- * Used for translating the lhs or rhs of a mapping to printable chars.
- * Advances "sp" to the next code.
- */
-char_u *
-str2special (
- char_u **sp,
- int from /* TRUE for lhs of mapping */
-)
-{
- int c;
- static char_u buf[7];
- char_u *str = *sp;
- int modifiers = 0;
- int special = FALSE;
-
- if (has_mbyte) {
- char_u *p;
-
- /* Try to un-escape a multi-byte character. Return the un-escaped
- * string if it is a multi-byte character. */
- p = mb_unescape(sp);
- if (p != NULL)
- return p;
+/// Convert character, replacing key with printable representation.
+///
+/// @param[in,out] sp String to convert. Is advanced to the next key code.
+/// @param[in] replace_spaces Convert spaces into <Space>, normally used for
+/// lhs, but not rhs.
+/// @param[in] replace_lt Convert `<` into `<lt>`.
+///
+/// @return Converted key code, in a static buffer. Buffer is always one and the
+/// same, so save converted string somewhere before running str2special
+/// for the second time.
+const char *str2special(const char **const sp, const bool replace_spaces,
+ const bool replace_lt)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_RET
+{
+ static char buf[7];
+
+ // Try to un-escape a multi-byte character. Return the un-escaped
+ // string if it is a multi-byte character.
+ const char *const p = mb_unescape(sp);
+ if (p != NULL) {
+ return p;
}
- c = *str;
+ const char *str = *sp;
+ int c = (uint8_t)(*str);
+ int modifiers = 0;
+ bool special = false;
if (c == K_SPECIAL && str[1] != NUL && str[2] != NUL) {
- if (str[1] == KS_MODIFIER) {
- modifiers = str[2];
+ if ((uint8_t)str[1] == KS_MODIFIER) {
+ modifiers = (uint8_t)str[2];
str += 3;
- c = *str;
+ c = (uint8_t)(*str);
}
if (c == K_SPECIAL && str[1] != NUL && str[2] != NUL) {
- c = TO_SPECIAL(str[1], str[2]);
+ c = TO_SPECIAL((uint8_t)str[1], (uint8_t)str[2]);
str += 2;
- if (c == KS_ZERO) /* display <Nul> as ^@ or <Nul> */
- c = NUL;
}
- if (IS_SPECIAL(c) || modifiers) /* special key */
- special = TRUE;
+ if (IS_SPECIAL(c) || modifiers) { // Special key.
+ special = true;
+ }
}
- if (has_mbyte && !IS_SPECIAL(c)) {
- int len = (*mb_ptr2len)(str);
+ if (!IS_SPECIAL(c)) {
+ const int len = utf_ptr2len((const char_u *)str);
- /* For multi-byte characters check for an illegal byte. */
- if (has_mbyte && MB_BYTE2LEN(*str) > len) {
- transchar_nonprint(buf, c);
+ // Check for an illegal byte.
+ if (MB_BYTE2LEN((uint8_t)(*str)) > len) {
+ transchar_nonprint((char_u *)buf, c);
*sp = str + 1;
return buf;
}
- /* Since 'special' is TRUE the multi-byte character 'c' will be
- * processed by get_special_key_name() */
- c = (*mb_ptr2char)(str);
+ // Since 'special' is TRUE the multi-byte character 'c' will be
+ // processed by get_special_key_name().
+ c = utf_ptr2char((const char_u *)str);
*sp = str + len;
- } else
+ } else {
*sp = str + 1;
+ }
- /* Make unprintable characters in <> form, also <M-Space> and <Tab>.
- * Use <Space> only for lhs of a mapping. */
- if (special || char2cells(c) > 1 || (from && c == ' '))
- return get_special_key_name(c, modifiers);
- buf[0] = c;
+ // Make unprintable characters in <> form, also <M-Space> and <Tab>.
+ if (special
+ || char2cells(c) > 1
+ || (replace_spaces && c == ' ')
+ || (replace_lt && c == '<')) {
+ return (const char *)get_special_key_name(c, modifiers);
+ }
+ buf[0] = (char)c;
buf[1] = NUL;
return buf;
}
-/*
- * Translate a key sequence into special key names.
- */
-void str2specialbuf(char_u *sp, char_u *buf, int len)
+/// Convert string, replacing key codes with printables
+///
+/// @param[in] str String to convert.
+/// @param[out] buf Buffer to save results to.
+/// @param[in] len Buffer length.
+void str2specialbuf(const char *sp, char *buf, size_t len)
+ FUNC_ATTR_NONNULL_ALL
{
- char_u *s;
-
- *buf = NUL;
while (*sp) {
- s = str2special(&sp, FALSE);
- if ((int)(STRLEN(s) + STRLEN(buf)) < len)
- STRCAT(buf, s);
+ const char *s = str2special(&sp, false, false);
+ const size_t s_len = strlen(s);
+ if (len <= s_len) {
+ break;
+ }
+ memcpy(buf, s, s_len);
+ buf += s_len;
+ len -= s_len;
}
+ *buf = NUL;
}
/*
@@ -1345,7 +1457,6 @@ void msg_prt_line(char_u *s, int list)
int attr = 0;
char_u *trail = NULL;
int l;
- char_u buf[MB_MAXBYTES + 1];
if (curwin->w_p_list)
list = TRUE;
@@ -1364,17 +1475,20 @@ void msg_prt_line(char_u *s, int list)
while (!got_int) {
if (n_extra > 0) {
- --n_extra;
- if (c_extra)
+ n_extra--;
+ if (c_extra) {
c = c_extra;
- else
+ } else {
+ assert(p_extra != NULL);
c = *p_extra++;
- } else if (has_mbyte && (l = (*mb_ptr2len)(s)) > 1) {
- col += (*mb_ptr2cells)(s);
+ }
+ } else if ((l = utfc_ptr2len(s)) > 1) {
+ col += utf_ptr2cells(s);
+ char buf[MB_MAXBYTES + 1];
if (lcs_nbsp != NUL && list
- && (mb_ptr2char(s) == 160 || mb_ptr2char(s) == 0x202f)) {
- mb_char2bytes(lcs_nbsp, buf);
- buf[(*mb_ptr2len)(buf)] = NUL;
+ && (utf_ptr2char(s) == 160 || utf_ptr2char(s) == 0x202f)) {
+ utf_char2bytes(lcs_nbsp, (char_u *)buf);
+ buf[utfc_ptr2len((char_u *)buf)] = NUL;
} else {
memmove(buf, s, (size_t)l);
buf[l] = NUL;
@@ -1394,18 +1508,18 @@ void msg_prt_line(char_u *s, int list)
} else {
c = lcs_tab1;
c_extra = lcs_tab2;
- attr = hl_attr(HLF_8);
+ attr = HL_ATTR(HLF_8);
}
} else if (c == 160 && list && lcs_nbsp != NUL) {
c = lcs_nbsp;
- attr = hl_attr(HLF_8);
+ attr = HL_ATTR(HLF_8);
} else if (c == NUL && list && lcs_eol != NUL) {
p_extra = (char_u *)"";
c_extra = NUL;
n_extra = 1;
c = lcs_eol;
- attr = hl_attr(HLF_AT);
- --s;
+ attr = HL_ATTR(HLF_AT);
+ s--;
} else if (c != NUL && (n = byte2cells(c)) > 1) {
n_extra = n - 1;
p_extra = transchar_byte(c);
@@ -1413,13 +1527,13 @@ void msg_prt_line(char_u *s, int list)
c = *p_extra++;
/* Use special coloring to be able to distinguish <hex> from
* the same in plain text. */
- attr = hl_attr(HLF_8);
+ attr = HL_ATTR(HLF_8);
} else if (c == ' ' && trail != NULL && s > trail) {
c = lcs_trail;
- attr = hl_attr(HLF_8);
+ attr = HL_ATTR(HLF_8);
} else if (c == ' ' && list && lcs_space != NUL) {
c = lcs_space;
- attr = hl_attr(HLF_8);
+ attr = HL_ATTR(HLF_8);
}
}
@@ -1432,25 +1546,22 @@ void msg_prt_line(char_u *s, int list)
msg_clr_eos();
}
-/*
- * Use screen_puts() to output one multi-byte character.
- * Return the pointer "s" advanced to the next character.
- */
+// Use grid_puts() to output one multi-byte character.
+// Return the pointer "s" advanced to the next character.
static char_u *screen_puts_mbyte(char_u *s, int l, int attr)
{
int cw;
- msg_didout = TRUE; /* remember that line is not empty */
- cw = (*mb_ptr2cells)(s);
- if (cw > 1 && (
- cmdmsg_rl ? msg_col <= 1 :
- msg_col == Columns - 1)) {
- /* Doesn't fit, print a highlighted '>' to fill it up. */
- msg_screen_putchar('>', hl_attr(HLF_AT));
+ msg_didout = true; // remember that line is not empty
+ cw = utf_ptr2cells(s);
+ if (cw > 1
+ && (cmdmsg_rl ? msg_col <= 1 : msg_col == Columns - 1)) {
+ // Doesn't fit, print a highlighted '>' to fill it up.
+ msg_screen_putchar('>', HL_ATTR(HLF_AT));
return s;
}
- screen_puts_len(s, l, msg_row, msg_col, attr);
+ grid_puts_len(&default_grid, s, l, msg_row, msg_col, attr);
if (cmdmsg_rl) {
msg_col -= cw;
if (msg_col == 0) {
@@ -1471,14 +1582,14 @@ static char_u *screen_puts_mbyte(char_u *s, int l, int attr)
* Output a string to the screen at position msg_row, msg_col.
* Update msg_row and msg_col for the next message.
*/
-void msg_puts(char_u *s)
+void msg_puts(const char *s)
{
msg_puts_attr(s, 0);
}
-void msg_puts_title(char_u *s)
+void msg_puts_title(const char *s)
{
- msg_puts_attr(s, hl_attr(HLF_T));
+ msg_puts_attr(s, HL_ATTR(HLF_T));
}
/*
@@ -1500,7 +1611,7 @@ void msg_puts_long_len_attr(char_u *longstr, int len, int attr)
if (len > room && room >= 20) {
slen = (room - 3) / 2;
msg_outtrans_len_attr(longstr, slen, attr);
- msg_puts_attr((char_u *)"...", hl_attr(HLF_8));
+ msg_puts_attr("...", HL_ATTR(HLF_8));
}
msg_outtrans_len_attr(longstr + len - slen, slen, attr);
}
@@ -1508,18 +1619,22 @@ void msg_puts_long_len_attr(char_u *longstr, int len, int attr)
/*
* Basic function for writing a message with highlight attributes.
*/
-void msg_puts_attr(char_u *s, int attr)
+void msg_puts_attr(const char *const s, const int attr)
{
msg_puts_attr_len(s, -1, attr);
}
-/// Like msg_puts_attr(), but with a maximum length "maxlen" (in bytes).
-/// When "maxlen" is -1 there is no maximum length.
-/// When "maxlen" is >= 0 the message is not put in the history.
-static void msg_puts_attr_len(char_u *str, int maxlen, int attr)
+/// Write a message with highlight attributes
+///
+/// @param[in] str NUL-terminated message string.
+/// @param[in] len Length of the string or -1.
+/// @param[in] attr Highlight attribute.
+void msg_puts_attr_len(const char *const str, const ptrdiff_t len, int attr)
+ FUNC_ATTR_NONNULL_ALL
{
+ assert(len < 0 || memchr(str, 0, len) == NULL);
// If redirection is on, also write to the redirection file.
- redir_write(str, maxlen);
+ redir_write(str, len);
// Don't print anything when using ":silent cmd".
if (msg_silent != 0) {
@@ -1527,8 +1642,8 @@ static void msg_puts_attr_len(char_u *str, int maxlen, int attr)
}
// if MSG_HIST flag set, add message to history
- if ((attr & MSG_HIST) && maxlen < 0) {
- add_msg_hist(str, -1, attr);
+ if (attr & MSG_HIST) {
+ add_msg_hist(str, (int)len, attr);
attr &= ~MSG_HIST;
}
@@ -1547,24 +1662,46 @@ static void msg_puts_attr_len(char_u *str, int maxlen, int attr)
// different, e.g. for Win32 console) or we just don't know where the
// cursor is.
if (msg_use_printf()) {
- msg_puts_printf((char *)str, maxlen);
+ msg_puts_printf(str, len);
} else {
- msg_puts_display(str, maxlen, attr, false);
+ msg_puts_display((const char_u *)str, len, attr, false);
}
}
+/// Print a formatted message
+///
+/// Message printed is limited by #IOSIZE. Must not be used from inside
+/// msg_puts_attr().
+///
+/// @param[in] attr Highlight attributes.
+/// @param[in] fmt Format string.
+void msg_printf_attr(const int attr, const char *const fmt, ...)
+ FUNC_ATTR_NONNULL_ARG(2) FUNC_ATTR_PRINTF(2, 3)
+{
+ static char msgbuf[IOSIZE];
+
+ va_list ap;
+ va_start(ap, fmt);
+ const size_t len = vim_vsnprintf(msgbuf, sizeof(msgbuf), fmt, ap, NULL);
+ va_end(ap);
+
+ msg_scroll = true;
+ msg_puts_attr_len(msgbuf, (ptrdiff_t)len, attr);
+}
+
/*
* The display part of msg_puts_attr_len().
* May be called recursively to display scroll-back text.
*/
-static void msg_puts_display(char_u *str, int maxlen, int attr, int recurse)
+static void msg_puts_display(const char_u *str, int maxlen, int attr,
+ int recurse)
{
- char_u *s = str;
- char_u *t_s = str; /* string from "t_s" to "s" is still todo */
- int t_col = 0; /* screen cells todo, 0 when "t_s" not used */
+ const char_u *s = str;
+ const char_u *t_s = str; // String from "t_s" to "s" is still todo.
+ int t_col = 0; // Screen cells todo, 0 when "t_s" not used.
int l;
int cw;
- char_u *sb_str = str;
+ const char_u *sb_str = str;
int sb_col = msg_col;
int wrap;
int did_last_char;
@@ -1578,14 +1715,12 @@ static void msg_puts_display(char_u *str, int maxlen, int attr, int recurse)
&& (*s == '\n' || (cmdmsg_rl
? (msg_col <= 1
|| (*s == TAB && msg_col <= 7)
- || (has_mbyte
- && (*mb_ptr2cells)(s) > 1
+ || (utf_ptr2cells(s) > 1
&& msg_col <= 2))
: (msg_col + t_col >= Columns - 1
|| (*s == TAB
&& msg_col + t_col >= ((Columns - 1) & ~7))
- || (has_mbyte
- && (*mb_ptr2cells)(s) > 1
+ || (utf_ptr2cells(s) > 1
&& msg_col + t_col >= Columns - 2))))) {
// The screen is scrolled up when at the last row (some terminals
// scroll automatically, some don't. To avoid problems we scroll
@@ -1606,34 +1741,31 @@ static void msg_puts_display(char_u *str, int maxlen, int attr, int recurse)
if (msg_col >= Columns) /* can happen after screen resize */
msg_col = Columns - 1;
- /* Display char in last column before showing more-prompt. */
- if (*s >= ' '
- && !cmdmsg_rl
- ) {
- if (has_mbyte) {
- if (enc_utf8 && maxlen >= 0)
- /* avoid including composing chars after the end */
- l = utfc_ptr2len_len(s, (int)((str + maxlen) - s));
- else
- l = (*mb_ptr2len)(s);
- s = screen_puts_mbyte(s, l, attr);
- } else
- msg_screen_putchar(*s++, attr);
- did_last_char = TRUE;
- } else
- did_last_char = FALSE;
-
- if (p_more)
- /* store text for scrolling back */
- store_sb_text(&sb_str, s, attr, &sb_col, TRUE);
+ // Display char in last column before showing more-prompt.
+ if (*s >= ' ' && !cmdmsg_rl) {
+ if (maxlen >= 0) {
+ // Avoid including composing chars after the end.
+ l = utfc_ptr2len_len(s, (int)((str + maxlen) - s));
+ } else {
+ l = utfc_ptr2len(s);
+ }
+ s = screen_puts_mbyte((char_u *)s, l, attr);
+ did_last_char = true;
+ } else {
+ did_last_char = false;
+ }
+
+ if (p_more) {
+ // Store text for scrolling back.
+ store_sb_text((char_u **)&sb_str, (char_u *)s, attr, &sb_col, true);
+ }
inc_msg_scrolled();
- need_wait_return = TRUE; /* may need wait_return in main() */
- if (must_redraw < VALID)
- must_redraw = VALID;
- redraw_cmdline = TRUE;
- if (cmdline_row > 0 && !exmode_active)
- --cmdline_row;
+ need_wait_return = true; // may need wait_return in main()
+ redraw_cmdline = true;
+ if (cmdline_row > 0 && !exmode_active) {
+ cmdline_row--;
+ }
/*
* If screen is completely filled and 'more' is set then wait
@@ -1657,17 +1789,19 @@ static void msg_puts_display(char_u *str, int maxlen, int attr, int recurse)
wrap = *s == '\n'
|| msg_col + t_col >= Columns
- || (has_mbyte && (*mb_ptr2cells)(s) > 1
+ || (utf_ptr2cells(s) > 1
&& msg_col + t_col >= Columns - 1)
;
if (t_col > 0 && (wrap || *s == '\r' || *s == '\b'
- || *s == '\t' || *s == BELL))
- /* output any postponed text */
+ || *s == '\t' || *s == BELL)) {
+ // Output any postponed text.
t_puts(&t_col, t_s, s, attr);
+ }
- if (wrap && p_more && !recurse)
- /* store text for scrolling back */
- store_sb_text(&sb_str, s, attr, &sb_col, TRUE);
+ if (wrap && p_more && !recurse) {
+ // Store text for scrolling back.
+ store_sb_text((char_u **)&sb_str, (char_u *)s, attr, &sb_col, true);
+ }
if (*s == '\n') { /* go to next line */
msg_didout = FALSE; /* remember that line is empty */
@@ -1688,24 +1822,20 @@ static void msg_puts_display(char_u *str, int maxlen, int attr, int recurse)
} while (msg_col & 7);
} else if (*s == BELL) { // beep (from ":sh")
vim_beep(BO_SH);
- } else {
- if (has_mbyte) {
- cw = (*mb_ptr2cells)(s);
- if (enc_utf8 && maxlen >= 0)
- /* avoid including composing chars after the end */
- l = utfc_ptr2len_len(s, (int)((str + maxlen) - s));
- else
- l = (*mb_ptr2len)(s);
+ } else if (*s >= 0x20) { // printable char
+ cw = utf_ptr2cells(s);
+ if (maxlen >= 0) {
+ // avoid including composing chars after the end
+ l = utfc_ptr2len_len(s, (int)((str + maxlen) - s));
} else {
- cw = 1;
- l = 1;
+ l = utfc_ptr2len(s);
}
// When drawing from right to left or when a double-wide character
// doesn't fit, draw a single character here. Otherwise collect
// characters and draw them all at once later.
if (cmdmsg_rl || (cw > 1 && msg_col + t_col >= Columns - 1)) {
if (l > 1) {
- s = screen_puts_mbyte(s, l, attr) - 1;
+ s = screen_puts_mbyte((char_u *)s, l, attr) - 1;
} else {
msg_screen_putchar(*s, attr);
}
@@ -1720,22 +1850,56 @@ static void msg_puts_display(char_u *str, int maxlen, int attr, int recurse)
++s;
}
- /* output any postponed text */
- if (t_col > 0)
+ // Output any postponed text.
+ if (t_col > 0) {
t_puts(&t_col, t_s, s, attr);
- if (p_more && !recurse)
- store_sb_text(&sb_str, s, attr, &sb_col, FALSE);
+ }
+ if (p_more && !recurse) {
+ store_sb_text((char_u **)&sb_str, (char_u *)s, attr, &sb_col, false);
+ }
msg_check();
}
+/// Return true when ":filter pattern" was used and "msg" does not match
+/// "pattern".
+bool message_filtered(char_u *msg)
+{
+ if (cmdmod.filter_regmatch.regprog == NULL) {
+ return false;
+ }
+
+ bool match = vim_regexec(&cmdmod.filter_regmatch, msg, (colnr_T)0);
+ return cmdmod.filter_force ? match : !match;
+}
+
+/// including horizontal separator
+int msg_scrollsize(void)
+{
+ return msg_scrolled + p_ch + 1;
+}
+
/*
* Scroll the screen up one line for displaying the next message line.
*/
static void msg_scroll_up(void)
{
- /* scrolling up always works */
- screen_del_lines(0, 0, 1, (int)Rows, NULL);
+ if (msg_scrolled == 0) {
+ ui_call_win_scroll_over_start();
+ }
+ if (dy_flags & DY_MSGSEP) {
+ if (msg_scrolled == 0) {
+ grid_fill(&default_grid, Rows-p_ch-1, Rows-p_ch, 0, (int)Columns,
+ fill_msgsep, fill_msgsep, HL_ATTR(HLF_MSGSEP));
+ }
+ int nscroll = MIN(msg_scrollsize()+1, Rows);
+ grid_del_lines(&default_grid, Rows-nscroll, 1, Rows, 0, Columns);
+ } else {
+ grid_del_lines(&default_grid, 0, 1, (int)Rows, 0, Columns);
+ }
+ // TODO(bfredl): when msgsep display is properly batched, this fill should be
+ // eliminated.
+ grid_fill(&default_grid, Rows-1, Rows, 0, (int)Columns, ' ', ' ', 0);
}
/*
@@ -1762,30 +1926,38 @@ static void inc_msg_scrolled(void)
xfree(tofree);
}
msg_scrolled++;
+ if (must_redraw < VALID) {
+ must_redraw = VALID;
+ }
}
-static msgchunk_T *last_msgchunk = NULL; /* last displayed text */
+static msgchunk_T *last_msgchunk = NULL; // last displayed text
+typedef enum {
+ SB_CLEAR_NONE = 0,
+ SB_CLEAR_ALL,
+ SB_CLEAR_CMDLINE_BUSY,
+ SB_CLEAR_CMDLINE_DONE
+} sb_clear_T;
-static int do_clear_sb_text = FALSE; /* clear text on next msg */
+// When to clear text on next msg.
+static sb_clear_T do_clear_sb_text = SB_CLEAR_NONE;
-/*
- * Store part of a printed message for displaying when scrolling back.
- */
-static void
-store_sb_text (
- char_u **sb_str, /* start of string */
- char_u *s, /* just after string */
+/// Store part of a printed message for displaying when scrolling back.
+static void store_sb_text(
+ char_u **sb_str, // start of string
+ char_u *s, // just after string
int attr,
int *sb_col,
- int finish /* line ends */
+ int finish // line ends
)
{
msgchunk_T *mp;
- if (do_clear_sb_text) {
- clear_sb_text();
- do_clear_sb_text = FALSE;
+ if (do_clear_sb_text == SB_CLEAR_ALL
+ || do_clear_sb_text == SB_CLEAR_CMDLINE_DONE) {
+ clear_sb_text(do_clear_sb_text == SB_CLEAR_ALL);
+ do_clear_sb_text = SB_CLEAR_NONE;
}
if (s > *sb_str) {
@@ -1817,21 +1989,43 @@ store_sb_text (
*/
void may_clear_sb_text(void)
{
- do_clear_sb_text = TRUE;
+ do_clear_sb_text = SB_CLEAR_ALL;
}
-/*
- * Clear any text remembered for scrolling back.
- * Called when redrawing the screen.
- */
-void clear_sb_text(void)
+/// Starting to edit the command line, do not clear messages now.
+void sb_text_start_cmdline(void)
+{
+ do_clear_sb_text = SB_CLEAR_CMDLINE_BUSY;
+ msg_sb_eol();
+}
+
+/// Ending to edit the command line. Clear old lines but the last one later.
+void sb_text_end_cmdline(void)
+{
+ do_clear_sb_text = SB_CLEAR_CMDLINE_DONE;
+}
+
+/// Clear any text remembered for scrolling back.
+/// When "all" is FALSE keep the last line.
+/// Called when redrawing the screen.
+void clear_sb_text(int all)
{
msgchunk_T *mp;
+ msgchunk_T **lastp;
- while (last_msgchunk != NULL) {
- mp = last_msgchunk->sb_prev;
- xfree(last_msgchunk);
- last_msgchunk = mp;
+ if (all) {
+ lastp = &last_msgchunk;
+ } else {
+ if (last_msgchunk == NULL) {
+ return;
+ }
+ lastp = &last_msgchunk->sb_prev;
+ }
+
+ while (*lastp != NULL) {
+ mp = (*lastp)->sb_prev;
+ xfree(*lastp);
+ *lastp = mp;
}
}
@@ -1900,11 +2094,12 @@ static msgchunk_T *disp_sb_line(int row, msgchunk_T *smp)
/*
* Output any postponed text for msg_puts_attr_len().
*/
-static void t_puts(int *t_col, char_u *t_s, char_u *s, int attr)
+static void t_puts(int *t_col, const char_u *t_s, const char_u *s, int attr)
{
- /* output postponed text */
- msg_didout = TRUE; /* remember that line is not empty */
- screen_puts_len(t_s, (int)(s - t_s), msg_row, msg_col, attr);
+ // Output postponed text.
+ msg_didout = true; // Remember that line is not empty.
+ grid_puts_len(&default_grid, (char_u *)t_s, (int)(s - t_s), msg_row, msg_col,
+ attr);
msg_col += *t_col;
*t_col = 0;
/* If the string starts with a composing character don't increment the
@@ -1917,21 +2112,22 @@ static void t_puts(int *t_col, char_u *t_s, char_u *s, int attr)
}
}
-// Returns TRUE when messages should be printed to stdout/stderr, which
-// happens when no UIs are attached and nvim is not being embedded
+// Returns TRUE when messages should be printed to stdout/stderr:
+// - "batch mode" ("silent mode", -es/-Es)
+// - no UI and not embedded
int msg_use_printf(void)
{
return !embedded_mode && !ui_active();
}
/// Print a message when there is no valid screen.
-static void msg_puts_printf(char *str, int maxlen)
+static void msg_puts_printf(const char *str, const ptrdiff_t maxlen)
{
- char *s = str;
+ const char *s = str;
char buf[4];
char *p;
- while (*s != NUL && (maxlen < 0 || (int)(s - str) < maxlen)) {
+ while ((maxlen < 0 || s - str < maxlen) && *s != NUL) {
if (!(silent_mode && p_verbose == 0)) {
// NL --> CR NL translation (for Unix, not for "--version")
p = &buf[0];
@@ -1986,9 +2182,10 @@ static int do_more_prompt(int typed_char)
int i;
// We get called recursively when a timer callback outputs a message. In
- // that case don't show another prompt. Also when at the hit-Enter prompt.
- if (entered || State == HITRETURN) {
- return false;
+ // that case don't show another prompt. Also when at the hit-Enter prompt
+ // and nothing was typed.
+ if (entered || (State == HITRETURN && typed_char == 0)) {
+ return false;
}
entered = true;
@@ -2069,8 +2266,8 @@ static int do_more_prompt(int typed_char)
skip_redraw = TRUE; /* skip redraw once */
need_wait_return = FALSE; /* don't wait in main() */
}
- /*FALLTHROUGH*/
- case 'q': /* quit */
+ FALLTHROUGH;
+ case 'q': // quit
case Ctrl_C:
case ESC:
if (confirm_msg_used) {
@@ -2117,9 +2314,11 @@ static int do_more_prompt(int typed_char)
mp_last = msg_sb_start(mp_last->sb_prev);
}
- if (toscroll == -1 && screen_ins_lines(0, 0, 1,
- (int)Rows, NULL) == OK) {
- /* display line at top */
+ if (toscroll == -1
+ && grid_ins_lines(&default_grid, 0, 1, (int)Rows,
+ 0, (int)Columns) == OK) {
+ grid_fill(&default_grid, 0, 1, 0, (int)Columns, ' ', ' ', 0);
+ // display line at top
(void)disp_sb_line(0, mp);
} else {
/* redisplay all lines */
@@ -2137,18 +2336,18 @@ static int do_more_prompt(int typed_char)
/* scroll up, display line at bottom */
msg_scroll_up();
inc_msg_scrolled();
- screen_fill((int)Rows - 2, (int)Rows - 1, 0,
- (int)Columns, ' ', ' ', 0);
+ grid_fill(&default_grid, (int)Rows - 2, (int)Rows - 1, 0,
+ (int)Columns, ' ', ' ', 0);
mp_last = disp_sb_line((int)Rows - 2, mp_last);
--toscroll;
}
}
if (toscroll <= 0) {
- /* displayed the requested text, more prompt again */
- screen_fill((int)Rows - 1, (int)Rows, 0,
- (int)Columns, ' ', ' ', 0);
- msg_moremsg(FALSE);
+ // displayed the requested text, more prompt again
+ grid_fill(&default_grid, (int)Rows - 1, (int)Rows, 0,
+ (int)Columns, ' ', ' ', 0);
+ msg_moremsg(false);
continue;
}
@@ -2159,8 +2358,9 @@ static int do_more_prompt(int typed_char)
break;
}
- /* clear the --more-- message */
- screen_fill((int)Rows - 1, (int)Rows, 0, (int)Columns, ' ', ' ', 0);
+ // clear the --more-- message
+ grid_fill(&default_grid, (int)Rows - 1, (int)Rows, 0, (int)Columns, ' ', ' ',
+ 0);
State = oldState;
setmouse();
if (quit_more) {
@@ -2188,10 +2388,9 @@ static int do_more_prompt(int typed_char)
* yet. When stderr can't be used, collect error messages until the GUI has
* started and they can be displayed in a message box.
*/
-void mch_errmsg(char *str)
+void mch_errmsg(const char *const str)
+ FUNC_ATTR_NONNULL_ALL
{
- int len;
-
#ifdef UNIX
/* On Unix use stderr if it's a tty.
* When not going to start the GUI also use stderr.
@@ -2205,14 +2404,13 @@ void mch_errmsg(char *str)
/* avoid a delay for a message that isn't there */
emsg_on_display = FALSE;
- len = (int)STRLEN(str) + 1;
+ const size_t len = strlen(str) + 1;
if (error_ga.ga_data == NULL) {
ga_set_growsize(&error_ga, 80);
error_ga.ga_itemsize = 1;
}
ga_grow(&error_ga, len);
- memmove((char_u *)error_ga.ga_data + error_ga.ga_len,
- (char_u *)str, len);
+ memmove(error_ga.ga_data + error_ga.ga_len, str, len);
#ifdef UNIX
/* remove CR characters, they are displayed */
{
@@ -2258,8 +2456,8 @@ void mch_msg(char *str)
*/
static void msg_screen_putchar(int c, int attr)
{
- msg_didout = TRUE; /* remember that line is not empty */
- screen_putchar(c, msg_row, msg_col, attr);
+ msg_didout = true; // remember that line is not empty
+ grid_putchar(&default_grid, c, msg_row, msg_col, attr);
if (cmdmsg_rl) {
if (--msg_col == 0) {
msg_col = Columns;
@@ -2278,12 +2476,13 @@ void msg_moremsg(int full)
int attr;
char_u *s = (char_u *)_("-- More --");
- attr = hl_attr(HLF_M);
- screen_puts(s, (int)Rows - 1, 0, attr);
- if (full)
- screen_puts((char_u *)
- _(" SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "),
- (int)Rows - 1, vim_strsize(s), attr);
+ attr = HL_ATTR(HLF_M);
+ grid_puts(&default_grid, s, (int)Rows - 1, 0, attr);
+ if (full) {
+ grid_puts(&default_grid, (char_u *)
+ _(" SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "),
+ (int)Rows - 1, vim_strsize(s), attr);
+ }
}
/*
@@ -2331,13 +2530,13 @@ void msg_clr_eos(void)
*/
void msg_clr_eos_force(void)
{
- if (cmdmsg_rl) {
- screen_fill(msg_row, msg_row + 1, 0, msg_col + 1, ' ', ' ', 0);
- screen_fill(msg_row + 1, (int)Rows, 0, (int)Columns, ' ', ' ', 0);
- } else {
- screen_fill(msg_row, msg_row + 1, msg_col, (int)Columns, ' ', ' ', 0);
- screen_fill(msg_row + 1, (int)Rows, 0, (int)Columns, ' ', ' ', 0);
- }
+ int msg_startcol = (cmdmsg_rl) ? 0 : msg_col;
+ int msg_endcol = (cmdmsg_rl) ? msg_col + 1 : (int)Columns;
+
+ grid_fill(&default_grid, msg_row, msg_row + 1, msg_startcol, msg_endcol, ' ',
+ ' ', 0);
+ grid_fill(&default_grid, msg_row + 1, (int)Rows, 0, (int)Columns, ' ', ' ',
+ 0);
}
/*
@@ -2387,24 +2586,15 @@ void msg_check(void)
* May write a string to the redirection file.
* When "maxlen" is -1 write the whole string, otherwise up to "maxlen" bytes.
*/
-static void redir_write(char_u *str, int maxlen)
+static void redir_write(const char *const str, const ptrdiff_t maxlen)
{
- char_u *s = str;
+ const char_u *s = (char_u *)str;
static int cur_col = 0;
if (maxlen == 0) {
return;
}
- // Append output to capture().
- if (capture_ga) {
- size_t len = 0;
- while (str[len] && (maxlen < 0 ? 1 : (len < (size_t)maxlen))) {
- len++;
- }
- ga_concat_len(capture_ga, (const char *)str, len);
- }
-
/* Don't do anything for displaying prompts and the like. */
if (redir_off)
return;
@@ -2417,6 +2607,9 @@ static void redir_write(char_u *str, int maxlen)
/* If the string doesn't start with CR or NL, go to msg_col */
if (*s != '\n' && *s != '\r') {
while (cur_col < msg_col) {
+ if (capture_ga) {
+ ga_concat_len(capture_ga, " ", 1);
+ }
if (redir_reg) {
write_reg_contents(redir_reg, (char_u *)" ", 1, true);
} else if (redir_vname) {
@@ -2431,28 +2624,36 @@ static void redir_write(char_u *str, int maxlen)
}
}
+ size_t len = maxlen == -1 ? STRLEN(s) : (size_t)maxlen;
+ if (capture_ga) {
+ ga_concat_len(capture_ga, (const char *)str, len);
+ }
if (redir_reg) {
- size_t len = maxlen == -1 ? STRLEN(s) : (size_t)maxlen;
write_reg_contents(redir_reg, s, len, true);
}
if (redir_vname) {
- var_redir_str(s, maxlen);
+ var_redir_str((char_u *)s, maxlen);
}
- /* Write and adjust the current column. */
- while (*s != NUL && (maxlen < 0 || (int)(s - str) < maxlen)) {
- if (!redir_reg && !redir_vname)
- if (redir_fd != NULL)
+ // Write and adjust the current column.
+ while (*s != NUL
+ && (maxlen < 0 || (int)(s - (const char_u *)str) < maxlen)) {
+ if (!redir_reg && !redir_vname && !capture_ga) {
+ if (redir_fd != NULL) {
putc(*s, redir_fd);
- if (verbose_fd != NULL)
+ }
+ }
+ if (verbose_fd != NULL) {
putc(*s, verbose_fd);
- if (*s == '\r' || *s == '\n')
+ }
+ if (*s == '\r' || *s == '\n') {
cur_col = 0;
- else if (*s == '\t')
+ } else if (*s == '\t') {
cur_col += (8 - cur_col % 8);
- else
- ++cur_col;
- ++s;
+ } else {
+ cur_col++;
+ }
+ s++;
}
if (msg_silent != 0) /* should update msg_col */
@@ -2463,8 +2664,7 @@ static void redir_write(char_u *str, int maxlen)
int redirecting(void)
{
return redir_fd != NULL || *p_vfile != NUL
- || redir_reg || redir_vname
- ;
+ || redir_reg || redir_vname || capture_ga != NULL;
}
/*
@@ -2559,19 +2759,27 @@ void give_warning(char_u *message, bool hl) FUNC_ATTR_NONNULL_ARG(1)
set_vim_var_string(VV_WARNINGMSG, (char *) message, -1);
xfree(keep_msg);
keep_msg = NULL;
- if (hl)
- keep_msg_attr = hl_attr(HLF_W);
- else
+ if (hl) {
+ keep_msg_attr = HL_ATTR(HLF_W);
+ } else {
keep_msg_attr = 0;
- if (msg_attr(message, keep_msg_attr) && msg_scrolled == 0)
+ }
+ if (msg_attr((const char *)message, keep_msg_attr) && msg_scrolled == 0) {
set_keep_msg(message, keep_msg_attr);
- msg_didout = FALSE; /* overwrite this message */
- msg_nowait = TRUE; /* don't wait for this message */
+ }
+ msg_didout = false; // Overwrite this message.
+ msg_nowait = true; // Don't wait for this message.
msg_col = 0;
--no_wait_return;
}
+void give_warning2(char_u *const message, char_u *const a1, bool hl)
+{
+ vim_snprintf((char *)IObuff, IOSIZE, (char *)message, a1);
+ give_warning(IObuff, hl);
+}
+
/*
* Advance msg cursor to column "col".
*/
@@ -2622,18 +2830,22 @@ do_dialog (
Ex command */
)
{
- int oldState;
int retval = 0;
char_u *hotkeys;
int c;
int i;
- /* Don't output anything in silent mode ("ex -s") */
- if (silent_mode)
- return dfltbutton; /* return default option */
+ if (silent_mode // No dialogs in silent mode ("ex -s")
+ || !ui_active() // Without a UI Nvim waits for input forever.
+ ) {
+ return dfltbutton; // return default option
+ }
- oldState = State;
+ int save_msg_silent = msg_silent;
+ int oldState = State;
+
+ msg_silent = 0; // If dialog prompts for input, user needs to see it! #8788
State = CONFIRM;
setmouse();
@@ -2666,17 +2878,15 @@ do_dialog (
break;
}
- /* Make the character lowercase, as chars in "hotkeys" are. */
- c = vim_tolower(c);
+ // Make the character lowercase, as chars in "hotkeys" are.
+ c = mb_tolower(c);
retval = 1;
- for (i = 0; hotkeys[i]; ++i) {
- if (has_mbyte) {
- if ((*mb_ptr2char)(hotkeys + i) == c)
- break;
- i += (*mb_ptr2len)(hotkeys + i) - 1;
- } else if (hotkeys[i] == c)
+ for (i = 0; hotkeys[i]; i++) {
+ if (utf_ptr2char(hotkeys + i) == c) {
break;
- ++retval;
+ }
+ i += utfc_ptr2len(hotkeys + i) - 1;
+ retval++;
}
if (hotkeys[i])
break;
@@ -2688,6 +2898,7 @@ do_dialog (
xfree(hotkeys);
+ msg_silent = save_msg_silent;
State = oldState;
setmouse();
--no_wait_return;
@@ -2708,25 +2919,13 @@ copy_char (
int lowercase /* make character lower case */
)
{
- int len;
- int c;
-
- if (has_mbyte) {
- if (lowercase) {
- c = vim_tolower((*mb_ptr2char)(from));
- return (*mb_char2bytes)(c, to);
- } else {
- len = (*mb_ptr2len)(from);
- memmove(to, from, (size_t)len);
- return len;
- }
- } else {
- if (lowercase)
- *to = (char_u)TOLOWER_LOC(*from);
- else
- *to = *from;
- return 1;
+ if (lowercase) {
+ int c = mb_tolower(utf_ptr2char(from));
+ return utf_char2bytes(c, to);
}
+ int len = utfc_ptr2len(from);
+ memmove(to, from, (size_t)len);
+ return len;
}
#define HAS_HOTKEY_LEN 30
@@ -2771,7 +2970,7 @@ static char_u * console_dialog_alloc(const char_u *message,
}
// Advance to the next character
- mb_ptr_adv(r);
+ MB_PTR_ADV(r);
}
len += (int)(STRLEN(message)
@@ -2889,7 +3088,7 @@ static void copy_hotkeys_and_msg(const char_u *message, char_u *buttons,
}
// advance to the next character
- mb_ptr_adv(r);
+ MB_PTR_ADV(r);
}
*msgp++ = ':';
@@ -2902,11 +3101,12 @@ static void copy_hotkeys_and_msg(const char_u *message, char_u *buttons,
*/
void display_confirm_msg(void)
{
- /* avoid that 'q' at the more prompt truncates the message here */
- ++confirm_msg_used;
- if (confirm_msg != NULL)
- msg_puts_attr(confirm_msg, hl_attr(HLF_M));
- --confirm_msg_used;
+ // Avoid that 'q' at the more prompt truncates the message here.
+ confirm_msg_used++;
+ if (confirm_msg != NULL) {
+ msg_puts_attr((const char *)confirm_msg, HL_ATTR(HLF_M));
+ }
+ confirm_msg_used--;
}
int vim_dialog_yesno(int type, char_u *title, char_u *message, int dflt)
@@ -2945,802 +3145,3 @@ int vim_dialog_yesnoallcancel(int type, char_u *title, char_u *message, int dflt
}
return VIM_CANCEL;
}
-
-
-
-static char *e_printf = N_("E766: Insufficient arguments for printf()");
-
-/*
- * Get number argument from "idxp" entry in "tvs". First entry is 1.
- */
-static long tv_nr(typval_T *tvs, int *idxp)
-{
- int idx = *idxp - 1;
- long n = 0;
- int err = FALSE;
-
- if (tvs[idx].v_type == VAR_UNKNOWN)
- EMSG(_(e_printf));
- else {
- ++*idxp;
- n = get_tv_number_chk(&tvs[idx], &err);
- if (err)
- n = 0;
- }
- return n;
-}
-
-/*
- * Get string argument from "idxp" entry in "tvs". First entry is 1.
- * Returns NULL for an error.
- */
-static char *tv_str(typval_T *tvs, int *idxp)
-{
- int idx = *idxp - 1;
- char *s = NULL;
-
- if (tvs[idx].v_type == VAR_UNKNOWN)
- EMSG(_(e_printf));
- else {
- ++*idxp;
- s = (char *)get_tv_string_chk(&tvs[idx]);
- }
- return s;
-}
-
-/*
- * Get float argument from "idxp" entry in "tvs". First entry is 1.
- */
-static double tv_float(typval_T *tvs, int *idxp)
-{
- int idx = *idxp - 1;
- double f = 0;
-
- if (tvs[idx].v_type == VAR_UNKNOWN)
- EMSG(_(e_printf));
- else {
- ++*idxp;
- if (tvs[idx].v_type == VAR_FLOAT)
- f = tvs[idx].vval.v_float;
- else if (tvs[idx].v_type == VAR_NUMBER)
- f = tvs[idx].vval.v_number;
- else
- EMSG(_("E807: Expected Float argument for printf()"));
- }
- return f;
-}
-
-/*
- * This code was included to provide a portable vsnprintf() and snprintf().
- * Some systems may provide their own, but we always use this one for
- * consistency.
- *
- * This code is based on snprintf.c - a portable implementation of snprintf
- * by Mark Martinec <mark.martinec@ijs.si>, Version 2.2, 2000-10-06.
- * Included with permission. It was heavily modified to fit in Vim.
- * The original code, including useful comments, can be found here:
- * http://www.ijs.si/software/snprintf/
- *
- * This snprintf() only supports the following conversion specifiers:
- * s, c, b, B, d, u, o, x, X, p (and synonyms: i, D, U, O - see below)
- * with flags: '-', '+', ' ', '0' and '#'.
- * An asterisk is supported for field width as well as precision.
- *
- * Limited support for floating point was added: 'f', 'e', 'E', 'g', 'G'.
- *
- * Length modifiers 'h' (short int) and 'l' (long int) are supported.
- * 'll' (long long int) is not supported.
- *
- * The locale is not used, the string is used as a byte string. This is only
- * relevant for double-byte encodings where the second byte may be '%'.
- *
- * It is permitted for "str_m" to be zero, and it is permitted to specify NULL
- * pointer for resulting string argument if "str_m" is zero (as per ISO C99).
- *
- * The return value is the number of characters which would be generated
- * for the given input, excluding the trailing NUL. If this value
- * is greater or equal to "str_m", not all characters from the result
- * have been stored in str, output bytes beyond the ("str_m"-1) -th character
- * are discarded. If "str_m" is greater than zero it is guaranteed
- * the resulting string will be NUL-terminated.
- */
-
-/*
- * When va_list is not supported we only define vim_snprintf().
- *
- * vim_vsnprintf() can be invoked with either "va_list" or a list of
- * "typval_T". When the latter is not used it must be NULL.
- */
-
-/* Like vim_vsnprintf() but append to the string. */
-int vim_snprintf_add(char *str, size_t str_m, char *fmt, ...)
-{
- va_list ap;
- int str_l;
- size_t len = STRLEN(str);
- size_t space;
-
- if (str_m <= len)
- space = 0;
- else
- space = str_m - len;
- va_start(ap, fmt);
- str_l = vim_vsnprintf(str + len, space, fmt, ap, NULL);
- va_end(ap);
- return str_l;
-}
-
-int vim_snprintf(char *str, size_t str_m, const char *fmt, ...)
-{
- va_list ap;
- int str_l;
-
- va_start(ap, fmt);
- str_l = vim_vsnprintf(str, str_m, fmt, ap, NULL);
- va_end(ap);
- return str_l;
-}
-
-int vim_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap,
- typval_T *tvs)
-{
- size_t str_l = 0;
- bool str_avail = str_l < str_m;
- const char *p = fmt;
- int arg_idx = 1;
-
- if (!p) {
- p = "";
- }
- while (*p) {
- if (*p != '%') {
- // copy up to the next '%' or NUL without any changes
- size_t n = (size_t)(xstrchrnul(p + 1, '%') - p);
- if (str_avail) {
- size_t avail = str_m - str_l;
- memmove(str + str_l, p, MIN(n, avail));
- str_avail = n < avail;
- }
- p += n;
- assert(n <= SIZE_MAX - str_l);
- str_l += n;
- } else {
- size_t min_field_width = 0, precision = 0;
- int zero_padding = 0, precision_specified = 0, justify_left = 0;
- int alternate_form = 0, force_sign = 0;
-
- // if both ' ' and '+' flags appear, ' ' flag should be ignored
- int space_for_positive = 1;
-
- // allowed values: \0, h, l, 2 (for ll), z, L
- char length_modifier = '\0';
-
- // temporary buffer for simple numeric->string conversion
-# define TMP_LEN 350 // 1e308 seems reasonable as the maximum printable
- char tmp[TMP_LEN];
-
- // string address in case of string argument
- const char *str_arg;
-
- // natural field width of arg without padding and sign
- size_t str_arg_l;
-
- // unsigned char argument value (only defined for c conversion);
- // standard explicitly states the char argument for the c
- // conversion is unsigned
- unsigned char uchar_arg;
-
- // number of zeros to be inserted for numeric conversions as
- // required by the precision or minimal field width
- size_t number_of_zeros_to_pad = 0;
-
- // index into tmp where zero padding is to be inserted
- size_t zero_padding_insertion_ind = 0;
-
- // current conversion specifier character
- char fmt_spec = '\0';
-
- str_arg = NULL;
- p++; // skip '%'
-
- // parse flags
- while (*p == '0' || *p == '-' || *p == '+' || *p == ' '
- || *p == '#' || *p == '\'') {
- switch (*p) {
- case '0': zero_padding = 1; break;
- case '-': justify_left = 1; break;
- // if both '0' and '-' flags appear, '0' should be ignored
- case '+': force_sign = 1; space_for_positive = 0; break;
- case ' ': force_sign = 1; break;
- // if both ' ' and '+' flags appear, ' ' should be ignored
- case '#': alternate_form = 1; break;
- case '\'': break;
- }
- p++;
- }
-
- // parse field width
- if (*p == '*') {
- p++;
- int j = tvs ? tv_nr(tvs, &arg_idx) : va_arg(ap, int);
- if (j >= 0) {
- min_field_width = j;
- } else {
- min_field_width = -j;
- justify_left = 1;
- }
- } else if (ascii_isdigit((int)(*p))) {
- // size_t could be wider than unsigned int; make sure we treat
- // argument like common implementations do
- unsigned int uj = *p++ - '0';
-
- while (ascii_isdigit((int)(*p))) {
- uj = 10 * uj + (unsigned int)(*p++ - '0');
- }
- min_field_width = uj;
- }
-
- // parse precision
- if (*p == '.') {
- p++;
- precision_specified = 1;
- if (*p == '*') {
- int j = tvs ? tv_nr(tvs, &arg_idx) : va_arg(ap, int);
- p++;
- if (j >= 0) {
- precision = j;
- } else {
- precision_specified = 0;
- precision = 0;
- }
- } else if (ascii_isdigit((int)(*p))) {
- // size_t could be wider than unsigned int; make sure we
- // treat argument like common implementations do
- unsigned int uj = *p++ - '0';
-
- while (ascii_isdigit((int)(*p))) {
- uj = 10 * uj + (unsigned int)(*p++ - '0');
- }
- precision = uj;
- }
- }
-
- // parse 'h', 'l', 'll' and 'z' length modifiers
- if (*p == 'h' || *p == 'l' || *p == 'z') {
- length_modifier = *p;
- p++;
- if (length_modifier == 'l' && *p == 'l') { // ll, encoded as 2
- length_modifier = '2';
- p++;
- }
- }
-
- fmt_spec = *p;
-
- // common synonyms
- switch (fmt_spec) {
- case 'i': fmt_spec = 'd'; break;
- case 'D': fmt_spec = 'd'; length_modifier = 'l'; break;
- case 'U': fmt_spec = 'u'; length_modifier = 'l'; break;
- case 'O': fmt_spec = 'o'; length_modifier = 'l'; break;
- case 'F': fmt_spec = 'f'; break;
- default: break;
- }
-
- // get parameter value, do initial processing
- switch (fmt_spec) {
- // '%' and 'c' behave similar to 's' regarding flags and field widths
- case '%': case 'c': case 's': case 'S':
- str_arg_l = 1;
- switch (fmt_spec) {
- case '%':
- str_arg = p;
- break;
-
- case 'c': {
- int j = tvs ? tv_nr(tvs, &arg_idx) : va_arg(ap, int);
- // standard demands unsigned char
- uchar_arg = (unsigned char)j;
- str_arg = (char *)&uchar_arg;
- break;
- }
-
- case 's':
- case 'S':
- str_arg = tvs ? tv_str(tvs, &arg_idx) : va_arg(ap, char *);
- if (!str_arg) {
- str_arg = "[NULL]";
- str_arg_l = 6;
- } else if (!precision_specified) {
- // make sure not to address string beyond the specified precision
- str_arg_l = strlen(str_arg);
- } else if (precision == 0) {
- // truncate string if necessary as requested by precision
- str_arg_l = 0;
- } else {
- // memchr on HP does not like n > 2^31
- // TODO(elmart): check if this still holds / is relevant
- str_arg_l = (size_t)((char *)xmemscan(str_arg,
- NUL,
- MIN(precision, 0x7fffffff))
- - str_arg);
- }
- if (fmt_spec == 'S') {
- if (min_field_width != 0)
- min_field_width += strlen(str_arg)
- - mb_string2cells((char_u *) str_arg);
- if (precision) {
- char_u *p1 = (char_u *)str_arg;
- for (size_t i = 0; i < precision && *p1; i++) {
- p1 += mb_ptr2len(p1);
- }
- str_arg_l = precision = p1 - (char_u *)str_arg;
- }
- }
- break;
-
- default:
- break;
- }
- break;
-
- case 'd':
- case 'u':
- case 'b': case 'B':
- case 'o':
- case 'x': case 'X':
- case 'p': {
- // u, b, B, o, x, X and p conversion specifiers imply
- // the value is unsigned; d implies a signed value
-
- // 0 if numeric argument is zero (or if pointer is NULL for 'p'),
- // +1 if greater than zero (or non NULL for 'p'),
- // -1 if negative (unsigned argument is never negative)
- int arg_sign = 0;
-
- // only defined for length modifier h, or for no length modifiers
- int int_arg = 0;
- unsigned int uint_arg = 0;
-
- // only defined for length modifier l
- long int long_arg = 0;
- unsigned long int ulong_arg = 0;
-
- // only defined for length modifier ll
- long long int long_long_arg = 0;
- unsigned long long int ulong_long_arg = 0;
-
- // only defined for length modifier z
- size_t size_t_arg = 0;
-
- // only defined for p conversion
- void *ptr_arg = NULL;
-
- if (fmt_spec == 'p') {
- length_modifier = '\0';
- ptr_arg = tvs ? (void *)tv_str(tvs, &arg_idx) : va_arg(ap, void *);
- if (ptr_arg) {
- arg_sign = 1;
- }
- } else if (fmt_spec == 'd') {
- // signed
- switch (length_modifier) {
- case '\0':
- case 'h':
- // char and short arguments are passed as int
- int_arg = tvs ? tv_nr(tvs, &arg_idx) : va_arg(ap, int);
- if (int_arg > 0) {
- arg_sign = 1;
- } else if (int_arg < 0) {
- arg_sign = -1;
- }
- break;
- case 'l':
- long_arg = tvs ? tv_nr(tvs, &arg_idx) : va_arg(ap, long int);
- if (long_arg > 0) {
- arg_sign = 1;
- } else if (long_arg < 0) {
- arg_sign = -1;
- }
- break;
- case '2':
- long_long_arg = tvs ? tv_nr(tvs, &arg_idx)
- : va_arg(ap, long long int); // NOLINT (runtime/int)
- if (long_long_arg > 0) {
- arg_sign = 1;
- } else if (long_long_arg < 0) {
- arg_sign = -1;
- }
- break;
- }
- } else {
- // unsigned
- switch (length_modifier) {
- case '\0':
- case 'h':
- uint_arg = tvs ? (unsigned)tv_nr(tvs, &arg_idx)
- : va_arg(ap, unsigned int);
- if (uint_arg != 0) { arg_sign = 1; }
- break;
- case 'l':
- ulong_arg = tvs ? (unsigned long)tv_nr(tvs, &arg_idx)
- : va_arg(ap, unsigned long int);
- if (ulong_arg != 0) { arg_sign = 1; }
- break;
- case '2':
- ulong_long_arg = tvs
- ? (unsigned long long)tv_nr(tvs, &arg_idx) // NOLINT (runtime/int)
- : va_arg(ap, unsigned long long int); // NOLINT (runtime/int)
- if (ulong_long_arg) { arg_sign = 1; }
- break;
- case 'z':
- size_t_arg = tvs ? (size_t)tv_nr(tvs, &arg_idx)
- : va_arg(ap, size_t);
- if (size_t_arg) { arg_sign = 1; }
- break;
- }
- }
-
- str_arg = tmp;
- str_arg_l = 0;
-
- // For d, i, u, o, x, and X conversions, if precision is specified,
- // '0' flag should be ignored. This is so with Solaris 2.6, Digital UNIX
- // 4.0, HPUX 10, Linux, FreeBSD, NetBSD; but not with Perl.
- if (precision_specified) {
- zero_padding = 0;
- }
-
- if (fmt_spec == 'd') {
- if (force_sign && arg_sign >= 0) {
- tmp[str_arg_l++] = space_for_positive ? ' ' : '+';
- }
- // leave negative numbers for sprintf to handle, to
- // avoid handling tricky cases like (short int)-32768
- } else if (alternate_form) {
- if (arg_sign != 0 && (fmt_spec == 'x' || fmt_spec == 'X'
- || fmt_spec == 'b' || fmt_spec == 'B')) {
- tmp[str_arg_l++] = '0';
- tmp[str_arg_l++] = fmt_spec;
- }
- // alternate form should have no effect for p * conversion, but ...
- }
-
- zero_padding_insertion_ind = str_arg_l;
- if (!precision_specified) {
- precision = 1; // default precision is 1
- }
- if (precision == 0 && arg_sign == 0) {
- // when zero value is formatted with an explicit precision 0,
- // resulting formatted string is empty (d, i, u, b, B, o, x, X, p)
- } else {
- char f[5];
- int f_l = 0;
-
- // construct a simple format string for sprintf
- f[f_l++] = '%';
- if (!length_modifier) {
- } else if (length_modifier == '2') {
- f[f_l++] = 'l';
- f[f_l++] = 'l';
- } else
- f[f_l++] = length_modifier;
- f[f_l++] = fmt_spec;
- f[f_l++] = '\0';
-
- if (fmt_spec == 'p')
- str_arg_l += sprintf(tmp + str_arg_l, f, ptr_arg);
- else if (fmt_spec == 'd') {
- // signed
- switch (length_modifier) {
- case '\0':
- case 'h': str_arg_l += sprintf(tmp + str_arg_l, f, int_arg);
- break;
- case 'l': str_arg_l += sprintf(tmp + str_arg_l, f, long_arg);
- break;
- case '2': str_arg_l += sprintf(tmp + str_arg_l, f, long_long_arg);
- break;
- }
- } else if (fmt_spec == 'b' || fmt_spec == 'B') {
- // binary
- size_t bits = 0;
- switch (length_modifier) {
- case '\0':
- case 'h': for (bits = sizeof(unsigned) * 8; bits > 0; bits--) {
- if ((uint_arg >> (bits - 1)) & 0x1) { break; } }
-
- while (bits > 0) {
- tmp[str_arg_l++] =
- ((uint_arg >> --bits) & 0x1) ? '1' : '0'; }
- break;
- case 'l': for (bits = sizeof(unsigned long) * 8; bits > 0; bits--) {
- if ((ulong_arg >> (bits - 1)) & 0x1) { break; } }
-
- while (bits > 0) {
- tmp[str_arg_l++] =
- ((ulong_arg >> --bits) & 0x1) ? '1' : '0'; }
- break;
- case '2': for (bits = sizeof(unsigned long long) * 8; // NOLINT (runtime/int)
- bits > 0; bits--) {
- if ((ulong_long_arg >> (bits - 1)) & 0x1) { break; } }
-
- while (bits > 0) {
- tmp[str_arg_l++] =
- ((ulong_long_arg >> --bits) & 0x1) ? '1' : '0'; }
- break;
- case 'z': for (bits = sizeof(size_t) * 8; bits > 0; bits--) {
- if ((size_t_arg >> (bits - 1)) & 0x1) { break; } }
-
- while (bits > 0) {
- tmp[str_arg_l++] =
- ((size_t_arg >> --bits) & 0x1) ? '1' : '0'; }
- break;
- }
- } else {
- // unsigned
- switch (length_modifier) {
- case '\0':
- case 'h': str_arg_l += sprintf(tmp + str_arg_l, f, uint_arg);
- break;
- case 'l': str_arg_l += sprintf(tmp + str_arg_l, f, ulong_arg);
- break;
- case '2': str_arg_l += sprintf(tmp + str_arg_l, f, ulong_long_arg);
- break;
- case 'z': str_arg_l += sprintf(tmp + str_arg_l, f, size_t_arg);
- break;
- }
- }
-
- // include the optional minus sign and possible "0x" in the region
- // before the zero padding insertion point
- if (zero_padding_insertion_ind < str_arg_l
- && tmp[zero_padding_insertion_ind] == '-')
- zero_padding_insertion_ind++;
- if (zero_padding_insertion_ind + 1 < str_arg_l
- && tmp[zero_padding_insertion_ind] == '0'
- && (tmp[zero_padding_insertion_ind + 1] == 'x'
- || tmp[zero_padding_insertion_ind + 1] == 'X'
- || tmp[zero_padding_insertion_ind + 1] == 'b'
- || tmp[zero_padding_insertion_ind + 1] == 'B'))
- zero_padding_insertion_ind += 2;
- }
-
- {
- size_t num_of_digits = str_arg_l - zero_padding_insertion_ind;
-
- if (alternate_form && fmt_spec == 'o'
- // unless zero is already the first character
- && !(zero_padding_insertion_ind < str_arg_l
- && tmp[zero_padding_insertion_ind] == '0')) {
- // assure leading zero for alternate-form octal numbers
- if (!precision_specified
- || precision < num_of_digits + 1) {
- // precision is increased to force the first character to be zero,
- // except if a zero value is formatted with an explicit precision
- // of zero
- precision = num_of_digits + 1;
- }
- }
- // zero padding to specified precision?
- if (num_of_digits < precision)
- number_of_zeros_to_pad = precision - num_of_digits;
- }
- // zero padding to specified minimal field width?
- if (!justify_left && zero_padding) {
- int n = (int)(min_field_width - (str_arg_l
- + number_of_zeros_to_pad));
- if (n > 0)
- number_of_zeros_to_pad += n;
- }
- break;
- }
-
- case 'f':
- case 'e':
- case 'E':
- case 'g':
- case 'G':
- {
- // floating point
- char format[40];
- int l;
- int remove_trailing_zeroes = false;
-
- double f = tvs ? tv_float(tvs, &arg_idx) : va_arg(ap, double);
- double abs_f = f < 0 ? -f : f;
-
- if (fmt_spec == 'g' || fmt_spec == 'G') {
- // can't use %g directly, cause it prints "1.0" as "1"
- if ((abs_f >= 0.001 && abs_f < 10000000.0) || abs_f == 0.0)
- fmt_spec = 'f';
- else
- fmt_spec = fmt_spec == 'g' ? 'e' : 'E';
- remove_trailing_zeroes = true;
- }
-
- if (fmt_spec == 'f' && abs_f > 1.0e307) {
- // avoid a buffer overflow
- strcpy(tmp, "inf");
- str_arg_l = 3;
- } else {
- format[0] = '%';
- l = 1;
- if (precision_specified) {
- size_t max_prec = TMP_LEN - 10;
-
- // make sure we don't get more digits than we have room for
- if (fmt_spec == 'f' && abs_f > 1.0)
- max_prec -= (size_t)log10(abs_f);
- if (precision > max_prec)
- precision = max_prec;
- l += sprintf(format + 1, ".%d", (int)precision);
- }
- format[l] = fmt_spec;
- format[l + 1] = NUL;
- str_arg_l = sprintf(tmp, format, f);
-
- if (remove_trailing_zeroes) {
- int i;
- char *tp;
-
- // using %g or %G: remove superfluous zeroes
- if (fmt_spec == 'f')
- tp = tmp + str_arg_l - 1;
- else {
- tp = (char *)vim_strchr((char_u *)tmp,
- fmt_spec == 'e' ? 'e' : 'E');
- if (tp) {
- // remove superfluous '+' and leading zeroes from exponent
- if (tp[1] == '+') {
- // change "1.0e+07" to "1.0e07"
- STRMOVE(tp + 1, tp + 2);
- --str_arg_l;
- }
- i = (tp[1] == '-') ? 2 : 1;
- while (tp[i] == '0') {
- // change "1.0e07" to "1.0e7"
- STRMOVE(tp + i, tp + i + 1);
- --str_arg_l;
- }
- --tp;
- }
- }
-
- if (tp != NULL && !precision_specified)
- // remove trailing zeroes, but keep the one just after a dot
- while (tp > tmp + 2 && *tp == '0' && tp[-1] != '.') {
- STRMOVE(tp, tp + 1);
- --tp;
- --str_arg_l;
- }
- } else {
- // be consistent: some printf("%e") use 1.0e+12 and some 1.0e+012;
- // remove one zero in the last case
- char *tp = (char *)vim_strchr((char_u *)tmp,
- fmt_spec == 'e' ? 'e' : 'E');
- if (tp && (tp[1] == '+' || tp[1] == '-') && tp[2] == '0'
- && ascii_isdigit(tp[3]) && ascii_isdigit(tp[4])) {
- STRMOVE(tp + 2, tp + 3);
- --str_arg_l;
- }
- }
- }
- str_arg = tmp;
- break;
- }
-
- default:
- // unrecognized conversion specifier, keep format string as-is
- zero_padding = 0; // turn zero padding off for non-numeric conversion
- justify_left = 1;
- min_field_width = 0; // reset flags
-
- // discard the unrecognized conversion, just keep
- // the unrecognized conversion character
- str_arg = p;
- str_arg_l = 0;
- if (*p)
- str_arg_l++; // include invalid conversion specifier
- // unchanged if not at end-of-string
- break;
- }
-
- if (*p)
- p++; // step over the just processed conversion specifier
-
- // insert padding to the left as requested by min_field_width;
- // this does not include the zero padding in case of numerical conversions
- if (!justify_left) {
- assert(str_arg_l <= SIZE_MAX - number_of_zeros_to_pad);
- if (min_field_width > str_arg_l + number_of_zeros_to_pad) {
- // left padding with blank or zero
- size_t pn = min_field_width - (str_arg_l + number_of_zeros_to_pad);
- if (str_avail) {
- size_t avail = str_m - str_l;
- memset(str + str_l, zero_padding ? '0' : ' ', MIN(pn, avail));
- str_avail = pn < avail;
- }
- assert(pn <= SIZE_MAX - str_l);
- str_l += pn;
- }
- }
-
- // zero padding as requested by the precision or by the minimal
- // field width for numeric conversions required?
- if (number_of_zeros_to_pad == 0) {
- // will not copy first part of numeric right now,
- // force it to be copied later in its entirety
- zero_padding_insertion_ind = 0;
- } else {
- // insert first part of numerics (sign or '0x') before zero padding
- if (zero_padding_insertion_ind > 0) {
- size_t zn = zero_padding_insertion_ind;
- if (str_avail) {
- size_t avail = str_m - str_l;
- memmove(str + str_l, str_arg, MIN(zn, avail));
- str_avail = zn < avail;
- }
- assert(zn <= SIZE_MAX - str_l);
- str_l += zn;
- }
-
- // insert zero padding as requested by precision or min field width
- if (number_of_zeros_to_pad > 0) {
- size_t zn = number_of_zeros_to_pad;
- if (str_avail) {
- size_t avail = str_m - str_l;
- memset(str + str_l, '0', MIN(zn, avail));
- str_avail = zn < avail;
- }
- assert(zn <= SIZE_MAX - str_l);
- str_l += zn;
- }
- }
-
- // insert formatted string
- // (or as-is conversion specifier for unknown conversions)
- if (str_arg_l > zero_padding_insertion_ind) {
- size_t sn = str_arg_l - zero_padding_insertion_ind;
- if (str_avail) {
- size_t avail = str_m - str_l;
- memmove(str + str_l,
- str_arg + zero_padding_insertion_ind,
- MIN(sn, avail));
- str_avail = sn < avail;
- }
- assert(sn <= SIZE_MAX - str_l);
- str_l += sn;
- }
-
- // insert right padding
- if (justify_left) {
- assert(str_arg_l <= SIZE_MAX - number_of_zeros_to_pad);
- if (min_field_width > str_arg_l + number_of_zeros_to_pad) {
- // right blank padding to the field width
- size_t pn = min_field_width - (str_arg_l + number_of_zeros_to_pad);
- if (str_avail) {
- size_t avail = str_m - str_l;
- memset(str + str_l, ' ', MIN(pn, avail));
- str_avail = pn < avail;
- }
- assert(pn <= SIZE_MAX - str_l);
- str_l += pn;
- }
- }
- }
- }
-
- if (str_m > 0) {
- // make sure the string is nul-terminated even at the expense of
- // overwriting the last character (shouldn't happen, but just in case)
- str[str_l <= str_m - 1 ? str_l : str_m - 1] = '\0';
- }
-
- if (tvs && tvs[arg_idx - 1].v_type != VAR_UNKNOWN)
- EMSG(_("E767: Too many arguments to printf()"));
-
- // return the number of characters formatted (excluding trailing nul
- // character); that is, the number of characters that would have been
- // written to the buffer if it were large enough.
- return (int)str_l;
-}
diff --git a/src/nvim/message.h b/src/nvim/message.h
index d3a16fff93..82935a36a9 100644
--- a/src/nvim/message.h
+++ b/src/nvim/message.h
@@ -3,8 +3,9 @@
#include <stdbool.h>
#include <stdarg.h>
-#include "nvim/eval_defs.h" // for typval_T
-#include "nvim/ex_cmds_defs.h" // for exarg_T
+#include <stddef.h>
+
+#include "nvim/types.h"
/*
* Types of dialogs passed to do_dialog().
@@ -29,7 +30,7 @@
#define MSG(s) msg((char_u *)(s))
/// Show message highlighted according to the attr
-#define MSG_ATTR(s, attr) msg_attr((char_u *)(s), (attr))
+#define MSG_ATTR(s, attr) msg_attr((const char *)(s), (attr))
/// Display error message
///
@@ -48,14 +49,23 @@
/// Like #EMSG, but for messages with one "%" PRIu64 inside
#define EMSGU(s, n) emsgf((const char *) (s), (uint64_t)(n))
+/// Like #EMSG, but for internal messages
+#define IEMSG(s) iemsg((const char *)(s))
+
+/// Like #EMSG2, but for internal messages
+#define IEMSG2(s, p) iemsgf((const char *)(s), (p))
+
+/// Like #EMSGN, but for internal messages
+#define IEMSGN(s, n) iemsgf((const char *)(s), (int64_t)(n))
+
/// Display message at the recorded position
-#define MSG_PUTS(s) msg_puts((char_u *)(s))
+#define MSG_PUTS(s) msg_puts((const char *)(s))
/// Display message at the recorded position, highlighted
-#define MSG_PUTS_ATTR(s, a) msg_puts_attr((char_u *)(s), (a))
+#define MSG_PUTS_ATTR(s, a) msg_puts_attr((const char *)(s), (a))
/// Like #MSG_PUTS, but highlight like title
-#define MSG_PUTS_TITLE(s) msg_puts_title((char_u *)(s))
+#define MSG_PUTS_TITLE(s) msg_puts_title((const char *)(s))
/// Like #MSG_PUTS, but if middle part of too long messages it will be replaced
#define MSG_PUTS_LONG(s) msg_puts_long_attr((char_u *)(s), 0)
diff --git a/src/nvim/misc1.c b/src/nvim/misc1.c
index d72d8e8513..a66ded13f1 100644
--- a/src/nvim/misc1.c
+++ b/src/nvim/misc1.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* misc1.c: functions that didn't seem to fit elsewhere
*/
@@ -25,13 +28,13 @@
#include "nvim/getchar.h"
#include "nvim/indent.h"
#include "nvim/indent_c.h"
+#include "nvim/buffer_updates.h"
#include "nvim/main.h"
#include "nvim/mark.h"
#include "nvim/mbyte.h"
#include "nvim/memline.h"
#include "nvim/memory.h"
#include "nvim/message.h"
-#include "nvim/misc2.h"
#include "nvim/garray.h"
#include "nvim/move.h"
#include "nvim/mouse.h"
@@ -41,6 +44,7 @@
#include "nvim/regexp.h"
#include "nvim/screen.h"
#include "nvim/search.h"
+#include "nvim/state.h"
#include "nvim/strings.h"
#include "nvim/tag.h"
#include "nvim/ui.h"
@@ -48,9 +52,11 @@
#include "nvim/window.h"
#include "nvim/os/os.h"
#include "nvim/os/shell.h"
+#include "nvim/os/signal.h"
#include "nvim/os/input.h"
#include "nvim/os/time.h"
#include "nvim/event/stream.h"
+#include "nvim/buffer.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "misc1.c.generated.h"
@@ -93,7 +99,7 @@ open_line (
colnr_T newcol = 0; // new cursor column
int newindent = 0; // auto-indent of the new line
bool trunc_line = false; // truncate current line afterwards
- bool retval = false; // return value, default is false
+ bool retval = false; // return value
int extra_len = 0; // length of p_extra string
int lead_len; // length of comment leader
char_u *lead_flags; // position in 'comments' for comment leader
@@ -102,7 +108,8 @@ open_line (
char_u *p;
char_u saved_char = NUL; // init for GCC
pos_T *pos;
- bool do_si = (!p_paste && curbuf->b_p_si && !curbuf->b_p_cin);
+ bool do_si = (!p_paste && curbuf->b_p_si && !curbuf->b_p_cin
+ && *curbuf->b_p_inde == NUL);
bool no_si = false; // reset did_si afterwards
int first_char = NUL; // init for GCC
int vreplace_mode;
@@ -159,8 +166,8 @@ open_line (
*p_extra = NUL;
}
- u_clearline(); /* cannot do "U" command when adding lines */
- did_si = FALSE;
+ u_clearline(); // cannot do "U" command when adding lines
+ did_si = false;
ai_col = 0;
/*
@@ -196,7 +203,7 @@ open_line (
char_u *ptr;
char_u last_char;
- pos_T old_cursor = curwin->w_cursor;
+ old_cursor = curwin->w_cursor;
ptr = saved_line;
if (flags & OPENLINE_DO_COM)
lead_len = get_leader_len(ptr, NULL, FALSE, TRUE);
@@ -280,8 +287,8 @@ open_line (
* checking for "if" and the like.
*/
if (last_char == '{') {
- did_si = TRUE; /* do indent */
- no_si = TRUE; /* don't delete it when '{' typed */
+ did_si = true; // do indent
+ no_si = true; // don't delete it when '{' typed
}
/*
* Look for "if" and the like, use 'cinwords'.
@@ -290,7 +297,7 @@ open_line (
*/
else if (last_char != ';' && last_char != '}'
&& cin_is_cinword(ptr))
- did_si = TRUE;
+ did_si = true;
}
} else { // dir == BACKWARD
// Skip preprocessor directives, unless they are
@@ -314,17 +321,19 @@ open_line (
}
}
p = skipwhite(ptr);
- if (*p == '}') /* if line starts with '}': do indent */
- did_si = TRUE;
- else /* can delete indent when '{' typed */
- can_si_back = TRUE;
+ if (*p == '}') { // if line starts with '}': do indent
+ did_si = true;
+ } else { // can delete indent when '{' typed
+ can_si_back = true;
+ }
}
curwin->w_cursor = old_cursor;
}
- if (do_si)
- can_si = TRUE;
+ if (do_si) {
+ can_si = true;
+ }
- did_ai = TRUE;
+ did_ai = true;
}
/*
@@ -525,7 +534,7 @@ open_line (
int l;
while (old_size < repl_size && p > leader) {
- mb_ptr_back(leader, p);
+ MB_PTR_BACK(leader, p);
old_size += ptr2cells(p);
}
l = lead_repl_len - (int)(endp - p);
@@ -540,7 +549,7 @@ open_line (
/* blank-out any other chars from the old leader. */
while (--p >= leader) {
- int l = mb_head_off(leader, p);
+ int l = utf_head_off(leader, p);
if (l > 1) {
p -= l;
@@ -566,7 +575,7 @@ open_line (
int i;
int l;
- for (i = 0; p[i] != NUL && i < lead_len; i += l) {
+ for (i = 0; i < lead_len && p[i] != NUL; i += l) {
l = (*mb_ptr2len)(p + i);
if (vim_strnsize(p, i + l) > repl_size)
break;
@@ -659,7 +668,7 @@ open_line (
}
}
- did_si = can_si = FALSE;
+ did_si = can_si = false;
} else if (comment_end != NULL) {
// We have finished a comment, so we don't use the leader.
// If this was a C-comment and 'ai' or 'si' is set do a normal
@@ -693,17 +702,17 @@ open_line (
replace_push(NUL); /* end of extra blanks */
if (curbuf->b_p_ai || (flags & OPENLINE_DELSPACES)) {
while ((*p_extra == ' ' || *p_extra == '\t')
- && (!enc_utf8
- || !utf_iscomposing(utf_ptr2char(p_extra + 1)))
- ) {
- if (REPLACE_NORMAL(State))
+ && !utf_iscomposing(utf_ptr2char(p_extra + 1))) {
+ if (REPLACE_NORMAL(State)) {
replace_push(*p_extra);
- ++p_extra;
- ++less_cols_off;
+ }
+ p_extra++;
+ less_cols_off++;
}
}
- if (*p_extra != NUL)
- did_ai = FALSE; /* append some text, don't truncate now */
+ if (*p_extra != NUL) {
+ did_ai = false; // append some text, don't truncate now
+ }
/* columns for marks adjusted for removed columns */
less_cols = (int)(p_extra - saved_line);
@@ -730,7 +739,7 @@ open_line (
}
STRCAT(leader, p_extra);
p_extra = leader;
- did_ai = TRUE; /* So truncating blanks works with comments */
+ did_ai = true; // So truncating blanks works with comments
less_cols -= lead_len;
} else
end_comment_pending = NUL; /* turns out there was no leader */
@@ -742,10 +751,15 @@ open_line (
if (ml_append(curwin->w_cursor.lnum, p_extra, (colnr_T)0, FALSE)
== FAIL)
goto theend;
- /* Postpone calling changed_lines(), because it would mess up folding
- * with markers. */
- mark_adjust(curwin->w_cursor.lnum + 1, (linenr_T)MAXLNUM, 1L, 0L);
- did_append = TRUE;
+ // Postpone calling changed_lines(), because it would mess up folding
+ // with markers.
+ // Skip mark_adjust when adding a line after the last one, there can't
+ // be marks there. But still needed in diff mode.
+ if (curwin->w_cursor.lnum + 1 < curbuf->b_ml.ml_line_count
+ || curwin->w_p_diff) {
+ mark_adjust(curwin->w_cursor.lnum + 1, (linenr_T)MAXLNUM, 1L, 0L, false);
+ }
+ did_append = true;
} else {
/*
* In VREPLACE mode we are starting to replace the next line.
@@ -758,7 +772,7 @@ open_line (
(void)u_save_cursor(); /* errors are ignored! */
vr_lines_changed++;
}
- ml_replace(curwin->w_cursor.lnum, p_extra, TRUE);
+ ml_replace(curwin->w_cursor.lnum, p_extra, true);
changed_bytes(curwin->w_cursor.lnum, 0);
curwin->w_cursor.lnum--;
did_append = FALSE;
@@ -801,8 +815,9 @@ open_line (
}
}
newcol += curwin->w_cursor.col;
- if (no_si)
- did_si = FALSE;
+ if (no_si) {
+ did_si = false;
+ }
}
/*
@@ -817,17 +832,18 @@ open_line (
if (dir == FORWARD) {
if (trunc_line || (State & INSERT)) {
- /* truncate current line at cursor */
+ // truncate current line at cursor
saved_line[curwin->w_cursor.col] = NUL;
- /* Remove trailing white space, unless OPENLINE_KEEPTRAIL used. */
- if (trunc_line && !(flags & OPENLINE_KEEPTRAIL))
+ // Remove trailing white space, unless OPENLINE_KEEPTRAIL used.
+ if (trunc_line && !(flags & OPENLINE_KEEPTRAIL)) {
truncate_spaces(saved_line);
- ml_replace(curwin->w_cursor.lnum, saved_line, FALSE);
+ }
+ ml_replace(curwin->w_cursor.lnum, saved_line, false);
saved_line = NULL;
if (did_append) {
changed_lines(curwin->w_cursor.lnum, curwin->w_cursor.col,
- curwin->w_cursor.lnum + 1, 1L);
- did_append = FALSE;
+ curwin->w_cursor.lnum + 1, 1L, true);
+ did_append = false;
/* Move marks after the line break to the new line. */
if (flags & OPENLINE_MARKFIX)
@@ -844,8 +860,9 @@ open_line (
*/
curwin->w_cursor.lnum = old_cursor.lnum + 1;
}
- if (did_append)
- changed_lines(curwin->w_cursor.lnum, 0, curwin->w_cursor.lnum, 1L);
+ if (did_append) {
+ changed_lines(curwin->w_cursor.lnum, 0, curwin->w_cursor.lnum, 1L, true);
+ }
curwin->w_cursor.col = newcol;
curwin->w_cursor.coladd = 0;
@@ -868,8 +885,7 @@ open_line (
&& curbuf->b_p_lisp
&& curbuf->b_p_ai) {
fixthisline(get_lisp_indent);
- p = get_cursor_line_ptr();
- ai_col = (colnr_T)(skipwhite(p) - p);
+ ai_col = (colnr_T)getwhitecols_curline();
}
/*
* May do indenting after opening a new line.
@@ -882,8 +898,7 @@ open_line (
? KEY_OPEN_FORW
: KEY_OPEN_BACK, ' ', linewhite(curwin->w_cursor.lnum))) {
do_c_expr_indent();
- p = get_cursor_line_ptr();
- ai_col = (colnr_T)(skipwhite(p) - p);
+ ai_col = (colnr_T)getwhitecols_curline();
}
if (vreplace_mode != 0)
State = vreplace_mode;
@@ -897,8 +912,8 @@ open_line (
/* Put new line in p_extra */
p_extra = vim_strsave(get_cursor_line_ptr());
- /* Put back original line */
- ml_replace(curwin->w_cursor.lnum, next_line, FALSE);
+ // Put back original line
+ ml_replace(curwin->w_cursor.lnum, next_line, false);
/* Insert new stuff into line again */
curwin->w_cursor.col = 0;
@@ -908,7 +923,7 @@ open_line (
next_line = NULL;
}
- retval = TRUE; /* success! */
+ retval = true; // success!
theend:
curbuf->b_p_pi = saved_pi;
xfree(saved_line);
@@ -1107,8 +1122,9 @@ int get_last_leader_offset(char_u *line, char_u **flags)
if (ascii_iswhite(string[0])) {
if (i == 0 || !ascii_iswhite(line[i - 1]))
continue;
- while (ascii_iswhite(string[0]))
- ++string;
+ while (ascii_iswhite(*string)) {
+ string++;
+ }
}
for (j = 0; string[j] != NUL && string[j] == line[i + j]; ++j)
/* do nothing */;
@@ -1124,6 +1140,19 @@ int get_last_leader_offset(char_u *line, char_u **flags)
continue;
}
+ if (vim_strchr(part_buf, COM_MIDDLE) != NULL) {
+ // For a middlepart comment, only consider it to match if
+ // everything before the current position in the line is
+ // whitespace. Otherwise we would think we are inside a
+ // comment if the middle part appears somewhere in the middle
+ // of the line. E.g. for C the "*" appears often.
+ for (j = 0; ascii_iswhite(line[j]) && j <= i; j++) {
+ }
+ if (j < i) {
+ continue;
+ }
+ }
+
/*
* We have found a match, stop searching.
*/
@@ -1191,16 +1220,15 @@ int get_last_leader_offset(char_u *line, char_u **flags)
/*
* Return the number of window lines occupied by buffer line "lnum".
*/
-int plines(linenr_T lnum)
+int plines(const linenr_T lnum)
{
- return plines_win(curwin, lnum, TRUE);
+ return plines_win(curwin, lnum, true);
}
-int
-plines_win (
- win_T *wp,
- linenr_T lnum,
- int winheight /* when TRUE limit to window height */
+int plines_win(
+ win_T *const wp,
+ const linenr_T lnum,
+ const bool winheight // when true limit to window height
)
{
/* Check for filler lines above this buffer line. When folded the result
@@ -1208,34 +1236,34 @@ plines_win (
return plines_win_nofill(wp, lnum, winheight) + diff_check_fill(wp, lnum);
}
-int plines_nofill(linenr_T lnum)
+int plines_nofill(const linenr_T lnum)
{
- return plines_win_nofill(curwin, lnum, TRUE);
+ return plines_win_nofill(curwin, lnum, true);
}
-int
-plines_win_nofill (
- win_T *wp,
- linenr_T lnum,
- int winheight /* when TRUE limit to window height */
+int plines_win_nofill(
+ win_T *const wp,
+ const linenr_T lnum,
+ const bool winheight // when true limit to window height
)
{
- int lines;
-
- if (!wp->w_p_wrap)
+ if (!wp->w_p_wrap) {
return 1;
+ }
- if (wp->w_width == 0)
+ if (wp->w_grid.Columns == 0) {
return 1;
+ }
- /* A folded lines is handled just like an empty line. */
- /* NOTE: Caller must handle lines that are MAYBE folded. */
- if (lineFolded(wp, lnum) == TRUE)
+ // A folded lines is handled just like an empty line.
+ if (lineFolded(wp, lnum)) {
return 1;
+ }
- lines = plines_win_nofold(wp, lnum);
- if (winheight > 0 && lines > wp->w_height)
- return wp->w_height;
+ const int lines = plines_win_nofold(wp, lnum);
+ if (winheight && lines > wp->w_grid.Rows) {
+ return wp->w_grid.Rows;
+ }
return lines;
}
@@ -1264,9 +1292,9 @@ int plines_win_nofold(win_T *wp, linenr_T lnum)
/*
* Add column offset for 'number', 'relativenumber' and 'foldcolumn'.
*/
- width = wp->w_width - win_col_off(wp);
- if (width <= 0) {
- return 32000; // bigger than the number of lines of the screen
+ width = wp->w_grid.Columns - win_col_off(wp);
+ if (width <= 0 || col > 32000) {
+ return 32000; // bigger than the number of screen columns
}
if (col <= (unsigned int)width) {
return 1;
@@ -1290,8 +1318,9 @@ int plines_win_col(win_T *wp, linenr_T lnum, long column)
if (!wp->w_p_wrap)
return lines + 1;
- if (wp->w_width == 0)
+ if (wp->w_grid.Columns == 0) {
return lines + 1;
+ }
char_u *line = ml_get_buf(wp->w_buffer, lnum, false);
char_u *s = line;
@@ -1299,7 +1328,7 @@ int plines_win_col(win_T *wp, linenr_T lnum, long column)
colnr_T col = 0;
while (*s != NUL && --column >= 0) {
col += win_lbr_chartabsize(wp, line, s, col, NULL);
- mb_ptr_adv(s);
+ MB_PTR_ADV(s);
}
// If *s is a TAB, and the TAB is not displayed as ^I, and we're not in
@@ -1312,7 +1341,7 @@ int plines_win_col(win_T *wp, linenr_T lnum, long column)
}
// Add column offset for 'number', 'relativenumber', 'foldcolumn', etc.
- int width = wp->w_width - win_col_off(wp);
+ int width = wp->w_grid.Columns - win_col_off(wp);
if (width <= 0) {
return 9999;
}
@@ -1335,11 +1364,12 @@ int plines_m_win(win_T *wp, linenr_T first, linenr_T last)
++count; /* count 1 for "+-- folded" line */
first += x;
} else {
- if (first == wp->w_topline)
- count += plines_win_nofill(wp, first, TRUE) + wp->w_topfill;
- else
- count += plines_win(wp, first, TRUE);
- ++first;
+ if (first == wp->w_topline) {
+ count += plines_win_nofill(wp, first, true) + wp->w_topfill;
+ } else {
+ count += plines_win(wp, first, true);
+ }
+ first++;
}
}
return count;
@@ -1384,7 +1414,7 @@ void ins_bytes_len(char_u *p, size_t len)
void ins_char(int c)
{
char_u buf[MB_MAXBYTES + 1];
- size_t n = (size_t)(*mb_char2bytes)(c, buf);
+ size_t n = (size_t)utf_char2bytes(c, buf);
// When "c" is 0x100, 0x200, etc. we don't want to insert a NUL byte.
// Happens for CTRL-Vu9900.
@@ -1401,7 +1431,6 @@ void ins_char_bytes(char_u *buf, size_t charlen)
coladvance_force(getviscol());
}
- int c = buf[0];
size_t col = (size_t)curwin->w_cursor.col;
linenr_T lnum = curwin->w_cursor.lnum;
char_u *oldp = ml_get(lnum);
@@ -1461,7 +1490,7 @@ void ins_char_bytes(char_u *buf, size_t charlen)
}
}
- char_u *newp = (char_u *) xmalloc((size_t)(linelen + newlen - oldlen));
+ char_u *newp = xmalloc((size_t)(linelen + newlen - oldlen));
// Copy bytes before the cursor.
if (col > 0) {
@@ -1470,7 +1499,10 @@ void ins_char_bytes(char_u *buf, size_t charlen)
// Copy bytes after the changed character(s).
char_u *p = newp + col;
- memmove(p + newlen, oldp + col + oldlen, (size_t)(linelen - col - oldlen));
+ if (linelen > col + oldlen) {
+ memmove(p + newlen, oldp + col + oldlen,
+ (size_t)(linelen - col - oldlen));
+ }
// Insert or overwrite the new character.
memmove(p, buf, charlen);
@@ -1480,8 +1512,8 @@ void ins_char_bytes(char_u *buf, size_t charlen)
p[i] = ' ';
}
- /* Replace the line in the buffer. */
- ml_replace(lnum, newp, FALSE);
+ // Replace the line in the buffer.
+ ml_replace(lnum, newp, false);
// mark the buffer as changed and prepare for displaying
changed_bytes(lnum, (colnr_T)col);
@@ -1494,10 +1526,7 @@ void ins_char_bytes(char_u *buf, size_t charlen)
&& msg_silent == 0
&& !ins_compl_active()
) {
- if (has_mbyte)
- showmatch(mb_ptr2char(buf));
- else
- showmatch(c);
+ showmatch(utf_ptr2char(buf));
}
if (!p_ri || (State & REPLACE_FLAG)) {
@@ -1534,19 +1563,17 @@ void ins_str(char_u *s)
memmove(newp, oldp, (size_t)col);
memmove(newp + col, s, (size_t)newlen);
memmove(newp + col + newlen, oldp + col, (size_t)(oldlen - col + 1));
- ml_replace(lnum, newp, FALSE);
+ ml_replace(lnum, newp, false);
changed_bytes(lnum, col);
curwin->w_cursor.col += newlen;
}
-/*
- * Delete one character under the cursor.
- * If "fixpos" is TRUE, don't leave the cursor on the NUL after the line.
- * Caller must have prepared for undo.
- *
- * return FAIL for failure, OK otherwise
- */
-int del_char(int fixpos)
+// Delete one character under the cursor.
+// If "fixpos" is true, don't leave the cursor on the NUL after the line.
+// Caller must have prepared for undo.
+//
+// return FAIL for failure, OK otherwise
+int del_char(bool fixpos)
{
if (has_mbyte) {
/* Make sure the cursor is at the start of a character. */
@@ -1594,11 +1621,19 @@ int del_bytes(colnr_T count, bool fixpos_arg, bool use_delcombine)
char_u *oldp = ml_get(lnum);
colnr_T oldlen = (colnr_T)STRLEN(oldp);
- /*
- * Can't do anything when the cursor is on the NUL after the line.
- */
- if (col >= oldlen)
+ // Can't do anything when the cursor is on the NUL after the line.
+ if (col >= oldlen) {
+ return FAIL;
+ }
+ // If "count" is zero there is nothing to do.
+ if (count == 0) {
+ return OK;
+ }
+ // If "count" is negative the caller must be doing something wrong.
+ if (count < 1) {
+ IEMSGN("E950: Invalid count for del_bytes(): %ld", count);
return FAIL;
+ }
/* If 'delcombine' is set and deleting (less than) one character, only
* delete the last combining character. */
@@ -1633,9 +1668,7 @@ int del_bytes(colnr_T count, bool fixpos_arg, bool use_delcombine)
) {
--curwin->w_cursor.col;
curwin->w_cursor.coladd = 0;
- if (has_mbyte)
- curwin->w_cursor.col -=
- (*mb_head_off)(oldp, oldp + curwin->w_cursor.col);
+ curwin->w_cursor.col -= utf_head_off(oldp, oldp + curwin->w_cursor.col);
}
count = oldlen - col;
movelen = 1;
@@ -1652,8 +1685,9 @@ int del_bytes(colnr_T count, bool fixpos_arg, bool use_delcombine)
memmove(newp, oldp, (size_t)col);
}
memmove(newp + col, oldp + col + count, (size_t)movelen);
- if (!was_alloced)
- ml_replace(lnum, newp, FALSE);
+ if (!was_alloced) {
+ ml_replace(lnum, newp, false);
+ }
/* mark the buffer as changed and prepare for displaying */
changed_bytes(lnum, curwin->w_cursor.col);
@@ -1734,23 +1768,11 @@ del_lines (
int gchar_pos(pos_T *pos)
{
- char_u *ptr = ml_get_pos(pos);
-
- if (has_mbyte)
- return (*mb_ptr2char)(ptr);
- return (int)*ptr;
-}
-
-/*
- * Skip to next part of an option argument: Skip space and comma.
- */
-char_u *skip_to_option_part(char_u *p)
-{
- if (*p == ',')
- ++p;
- while (*p == ' ')
- ++p;
- return p;
+ // When searching columns is sometimes put at the end of a line.
+ if (pos->col == MAXCOL) {
+ return NUL;
+ }
+ return utf_ptr2char(ml_get_pos(pos));
}
/*
@@ -1796,7 +1818,7 @@ void changed(void)
}
changed_int();
}
- ++curbuf->b_changedtick;
+ buf_inc_changedtick(curbuf);
}
/*
@@ -1823,6 +1845,10 @@ void changed_bytes(linenr_T lnum, colnr_T col)
{
changedOneline(curbuf, lnum);
changed_common(lnum, col, lnum + 1, 0L);
+ // notify any channels that are watching
+ if (kv_size(curbuf->update_channels)) {
+ buf_updates_send_changes(curbuf, lnum, 1, 1, true);
+ }
/* Diff highlighting in other diff windows may need to be updated too. */
if (curwin->w_p_diff) {
@@ -1863,7 +1889,7 @@ static void changedOneline(buf_T *buf, linenr_T lnum)
*/
void appended_lines(linenr_T lnum, long count)
{
- changed_lines(lnum + 1, 0, lnum + 1, count);
+ changed_lines(lnum + 1, 0, lnum + 1, count, true);
}
/*
@@ -1871,8 +1897,12 @@ void appended_lines(linenr_T lnum, long count)
*/
void appended_lines_mark(linenr_T lnum, long count)
{
- mark_adjust(lnum + 1, (linenr_T)MAXLNUM, count, 0L);
- changed_lines(lnum + 1, 0, lnum + 1, count);
+ // Skip mark_adjust when adding a line after the last one, there can't
+ // be marks there. But it's still needed in diff mode.
+ if (lnum + count < curbuf->b_ml.ml_line_count || curwin->w_p_diff) {
+ mark_adjust(lnum + 1, (linenr_T)MAXLNUM, count, 0L, false);
+ }
+ changed_lines(lnum + 1, 0, lnum + 1, count, true);
}
/*
@@ -1882,7 +1912,7 @@ void appended_lines_mark(linenr_T lnum, long count)
*/
void deleted_lines(linenr_T lnum, long count)
{
- changed_lines(lnum, 0, lnum + count, -count);
+ changed_lines(lnum, 0, lnum + count, -count, true);
}
/*
@@ -1892,8 +1922,8 @@ void deleted_lines(linenr_T lnum, long count)
*/
void deleted_lines_mark(linenr_T lnum, long count)
{
- mark_adjust(lnum, (linenr_T)(lnum + count - 1), (long)MAXLNUM, -count);
- changed_lines(lnum, 0, lnum + count, -count);
+ mark_adjust(lnum, (linenr_T)(lnum + count - 1), (long)MAXLNUM, -count, false);
+ changed_lines(lnum, 0, lnum + count, -count, true);
}
/*
@@ -1908,20 +1938,24 @@ void deleted_lines_mark(linenr_T lnum, long count)
* Takes care of calling changed() and updating b_mod_*.
* Careful: may trigger autocommands that reload the buffer.
*/
-void
-changed_lines (
- linenr_T lnum, /* first line with change */
- colnr_T col, /* column in first line with change */
- linenr_T lnume, /* line below last changed line */
- long xtra /* number of extra lines (negative when deleting) */
+void
+changed_lines(
+ linenr_T lnum, // first line with change
+ colnr_T col, // column in first line with change
+ linenr_T lnume, // line below last changed line
+ long xtra, // number of extra lines (negative when deleting)
+ bool do_buf_event // some callers like undo/redo call changed_lines()
+ // and then increment changedtick *again*. This flag
+ // allows these callers to send the nvim_buf_lines_event
+ // events after they're done modifying changedtick.
)
{
changed_lines_buf(curbuf, lnum, lnume, xtra);
- if (xtra == 0 && curwin->w_p_diff) {
- /* When the number of lines doesn't change then mark_adjust() isn't
- * called and other diff buffers still need to be marked for
- * displaying. */
+ if (xtra == 0 && curwin->w_p_diff && !diff_internal()) {
+ // When the number of lines doesn't change then mark_adjust() isn't
+ // called and other diff buffers still need to be marked for
+ // displaying.
linenr_T wlnum;
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
@@ -1937,6 +1971,12 @@ changed_lines (
}
changed_common(lnum, col, lnume, xtra);
+
+ if (do_buf_event && kv_size(curbuf->update_channels)) {
+ int64_t num_added = (int64_t)(lnume + xtra - lnum);
+ int64_t num_removed = lnume - lnum;
+ buf_updates_send_changes(curbuf, lnum, num_added, num_removed, true);
+ }
}
/// Mark line range in buffer as changed.
@@ -1984,6 +2024,10 @@ static void changed_common(linenr_T lnum, colnr_T col, linenr_T lnume, long xtra
/* mark the buffer as modified */
changed();
+ if (curwin->w_p_diff && diff_internal()) {
+ curtab->tp_diff_update = true;
+ }
+
/* set the '. mark */
if (!cmdmod.keepjumps) {
RESET_FMARK(&curbuf->b_last_change, ((pos_T) {lnum, col, 0}), 0);
@@ -2151,7 +2195,7 @@ unchanged (
redraw_tabline = TRUE;
need_maketitle = TRUE; /* set window title later */
}
- ++buf->b_changedtick;
+ buf_inc_changedtick(buf);
}
/*
@@ -2202,12 +2246,12 @@ change_warning (
msg_start();
if (msg_row == Rows - 1)
msg_col = col;
- msg_source(hl_attr(HLF_W));
- MSG_PUTS_ATTR(_(w_readonly), hl_attr(HLF_W) | MSG_HIST);
+ msg_source(HL_ATTR(HLF_W));
+ MSG_PUTS_ATTR(_(w_readonly), HL_ATTR(HLF_W) | MSG_HIST);
set_vim_var_string(VV_WARNINGMSG, _(w_readonly), -1);
msg_clr_eos();
(void)msg_end();
- if (msg_silent == 0 && !silent_mode) {
+ if (msg_silent == 0 && !silent_mode && ui_active()) {
ui_flush();
os_delay(1000L, true); /* give the user time to think about it */
}
@@ -2218,44 +2262,47 @@ change_warning (
}
}
-/*
- * Ask for a reply from the user, a 'y' or a 'n'.
- * No other characters are accepted, the message is repeated until a valid
- * reply is entered or CTRL-C is hit.
- * If direct is TRUE, don't use vgetc() but ui_inchar(), don't get characters
- * from any buffers but directly from the user.
- *
- * return the 'y' or 'n'
- */
-int ask_yesno(char_u *str, int direct)
+/// Ask for a reply from the user, 'y' or 'n'
+///
+/// No other characters are accepted, the message is repeated until a valid
+/// reply is entered or <C-c> is hit.
+///
+/// @param[in] str Prompt: question to ask user. Is always followed by
+/// " (y/n)?".
+/// @param[in] direct Determines what function to use to get user input. If
+/// true then ui_inchar() will be used, otherwise vgetc().
+/// I.e. when direct is true then characters are obtained
+/// directly from the user without buffers involved.
+///
+/// @return 'y' or 'n'. Last is also what will be returned in case of interrupt.
+int ask_yesno(const char *const str, const bool direct)
{
- int r = ' ';
- int save_State = State;
+ const int save_State = State;
- ++no_wait_return;
- State = CONFIRM; /* mouse behaves like with :confirm */
- setmouse(); /* disables mouse for xterm */
- ++no_mapping;
- ++allow_keys; /* no mapping here, but recognize keys */
+ no_wait_return++;
+ State = CONFIRM; // Mouse behaves like with :confirm.
+ setmouse(); // Disable mouse in xterm.
+ no_mapping++;
+ int r = ' ';
while (r != 'y' && r != 'n') {
- /* same highlighting as for wait_return */
- smsg_attr(hl_attr(HLF_R),
- "%s (y/n)?", str);
- if (direct)
+ // Same highlighting as for wait_return.
+ smsg_attr(HL_ATTR(HLF_R), "%s (y/n)?", str);
+ if (direct) {
r = get_keystroke();
- else
+ } else {
r = plain_vgetc();
- if (r == Ctrl_C || r == ESC)
+ }
+ if (r == Ctrl_C || r == ESC) {
r = 'n';
- msg_putchar(r); /* show what you typed */
+ }
+ msg_putchar(r); // Show what you typed.
ui_flush();
}
- --no_wait_return;
+ no_wait_return--;
State = save_State;
setmouse();
- --no_mapping;
- --allow_keys;
+ no_mapping--;
return r;
}
@@ -2328,8 +2375,8 @@ int get_keystroke(void)
* terminal code to complete. */
n = os_inchar(buf + len, maxlen, len == 0 ? -1L : 100L, 0);
if (n > 0) {
- /* Replace zero and CSI by a special key code. */
- n = fix_input_buffer(buf + len, n, FALSE);
+ // Replace zero and CSI by a special key code.
+ n = fix_input_buffer(buf + len, n);
len += n;
waited = 0;
} else if (len > 0)
@@ -2365,16 +2412,12 @@ int get_keystroke(void)
}
break;
}
- if (has_mbyte) {
- if (MB_BYTE2LEN(n) > len)
- continue; /* more bytes to get */
- buf[len >= buflen ? buflen - 1 : len] = NUL;
- n = (*mb_ptr2char)(buf);
+ if (MB_BYTE2LEN(n) > len) {
+ // more bytes to get.
+ continue;
}
-#ifdef UNIX
- if (n == intr_char)
- n = ESC;
-#endif
+ buf[len >= buflen ? buflen - 1 : len] = NUL;
+ n = utf_ptr2char(buf);
break;
}
xfree(buf);
@@ -2405,8 +2448,7 @@ get_number (
if (msg_silent != 0)
return 0;
- ++no_mapping;
- ++allow_keys; /* no mapping here, but recognize keys */
+ no_mapping++;
for (;; ) {
ui_cursor_goto(msg_row, msg_col);
c = safe_vgetc();
@@ -2434,8 +2476,7 @@ get_number (
} else if (c == CAR || c == NL || c == Ctrl_C || c == ESC)
break;
}
- --no_mapping;
- --allow_keys;
+ no_mapping--;
return n;
}
@@ -2461,7 +2502,7 @@ int prompt_for_number(int *mouse_used)
save_cmdline_row = cmdline_row;
cmdline_row = 0;
save_State = State;
- State = CMDLINE;
+ State = ASKMORE; // prevents a screen update when using a timer
i = get_number(TRUE, mouse_used);
if (KeyTyped) {
@@ -2511,8 +2552,9 @@ void msgmore(long n)
vim_snprintf((char *)msg_buf, MSG_BUF_LEN,
_("%" PRId64 " fewer lines"), (int64_t)pn);
}
- if (got_int)
- vim_strcat(msg_buf, (char_u *)_(" (Interrupted)"), MSG_BUF_LEN);
+ if (got_int) {
+ xstrlcat((char *)msg_buf, _(" (Interrupted)"), MSG_BUF_LEN);
+ }
if (msg(msg_buf)) {
set_keep_msg(msg_buf, 0);
keep_msg_more = TRUE;
@@ -2526,7 +2568,7 @@ void msgmore(long n)
void beep_flush(void)
{
if (emsg_silent == 0) {
- flush_buffers(false);
+ flush_buffers(FLUSH_MINIMAL);
vim_beep(BO_ERROR);
}
}
@@ -2538,17 +2580,17 @@ void vim_beep(unsigned val)
if (emsg_silent == 0) {
if (!((bo_flags & val) || (bo_flags & BO_ALL))) {
if (p_vb) {
- ui_visual_bell();
+ ui_call_visual_bell();
} else {
- ui_putc(BELL);
+ ui_call_bell();
}
}
/* When 'verbose' is set and we are sourcing a script or executing a
* function give the user a hint where the beep comes from. */
if (vim_strchr(p_debug, 'e') != NULL) {
- msg_source(hl_attr(HLF_W));
- msg_attr((char_u *)_("Beep!"), hl_attr(HLF_W));
+ msg_source(HL_ATTR(HLF_W));
+ msg_attr(_("Beep!"), HL_ATTR(HLF_W));
}
}
}
@@ -2611,24 +2653,28 @@ int match_user(char_u *name)
return result;
}
-/*
- * Preserve files and exit.
- * When called IObuff must contain a message.
- * NOTE: This may be called from deathtrap() in a signal handler, avoid unsafe
- * functions, such as allocating memory.
- */
+/// Preserve files and exit.
+/// @note IObuff must contain a message.
+/// @note This may be called from deadly_signal() in a signal handler, avoid
+/// unsafe functions, such as allocating memory.
void preserve_exit(void)
+ FUNC_ATTR_NORETURN
{
// 'true' when we are sure to exit, e.g., after a deadly signal
static bool really_exiting = false;
// Prevent repeated calls into this method.
if (really_exiting) {
- stream_set_blocking(input_global_fd(), true); //normalize stream (#2598)
+ if (input_global_fd() >= 0) {
+ // normalize stream (#2598)
+ stream_set_blocking(input_global_fd(), true);
+ }
exit(2);
}
really_exiting = true;
+ // Ignore SIGHUP while we are already exiting. #9274
+ signal_reject_deadly();
mch_errmsg(IObuff);
mch_errmsg("\n");
ui_flush();
@@ -2639,7 +2685,7 @@ void preserve_exit(void)
if (buf->b_ml.ml_mfp != NULL && buf->b_ml.ml_mfp->mf_fname != NULL) {
mch_errmsg((uint8_t *)"Vim: preserving files...\n");
ui_flush();
- ml_sync_all(false, false); // preserve all swap files
+ ml_sync_all(false, false, true); // preserve all swap files
break;
}
}
@@ -2683,6 +2729,44 @@ void fast_breakcheck(void)
}
}
+/// os_call_shell() wrapper. Handles 'verbose', :profile, and v:shell_error.
+/// Invalidates cached tags.
+///
+/// @return shell command exit code
+int call_shell(char_u *cmd, ShellOpts opts, char_u *extra_shell_arg)
+{
+ int retval;
+ proftime_T wait_time;
+
+ if (p_verbose > 3) {
+ verbose_enter();
+ smsg(_("Executing command: \"%s\""), cmd == NULL ? p_sh : cmd);
+ msg_putchar('\n');
+ verbose_leave();
+ }
+
+ if (do_profiling == PROF_YES) {
+ prof_child_enter(&wait_time);
+ }
+
+ if (*p_sh == NUL) {
+ EMSG(_(e_shellempty));
+ retval = -1;
+ } else {
+ // The external command may update a tags file, clear cached tags.
+ tag_freematch();
+
+ retval = os_call_shell(cmd, opts, extra_shell_arg);
+ }
+
+ set_vim_var_nr(VV_SHELL_ERROR, (varnumber_T)retval);
+ if (do_profiling == PROF_YES) {
+ prof_child_exit(&wait_time);
+ }
+
+ return retval;
+}
+
/// Get the stdout of an external command.
/// If "ret_len" is NULL replace NUL characters with NL. When "ret_len" is not
/// NULL store the length there.
@@ -2779,4 +2863,3 @@ int goto_im(void)
{
return p_im && stuff_empty() && typebuf_typed();
}
-
diff --git a/src/nvim/misc2.c b/src/nvim/misc2.c
deleted file mode 100644
index 368f83cfb5..0000000000
--- a/src/nvim/misc2.c
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- * misc2.c: Various functions.
- */
-#include <assert.h>
-#include <inttypes.h>
-#include <string.h>
-
-#include "nvim/vim.h"
-#include "nvim/ascii.h"
-#include "nvim/misc2.h"
-#include "nvim/file_search.h"
-#include "nvim/buffer.h"
-#include "nvim/charset.h"
-#include "nvim/cursor.h"
-#include "nvim/diff.h"
-#include "nvim/edit.h"
-#include "nvim/eval.h"
-#include "nvim/ex_cmds.h"
-#include "nvim/ex_docmd.h"
-#include "nvim/ex_getln.h"
-#include "nvim/fileio.h"
-#include "nvim/fold.h"
-#include "nvim/getchar.h"
-#include "nvim/macros.h"
-#include "nvim/mark.h"
-#include "nvim/mbyte.h"
-#include "nvim/memfile.h"
-#include "nvim/memline.h"
-#include "nvim/memory.h"
-#include "nvim/message.h"
-#include "nvim/misc1.h"
-#include "nvim/move.h"
-#include "nvim/option.h"
-#include "nvim/ops.h"
-#include "nvim/os_unix.h"
-#include "nvim/path.h"
-#include "nvim/quickfix.h"
-#include "nvim/regexp.h"
-#include "nvim/screen.h"
-#include "nvim/search.h"
-#include "nvim/spell.h"
-#include "nvim/strings.h"
-#include "nvim/syntax.h"
-#include "nvim/tag.h"
-#include "nvim/ui.h"
-#include "nvim/window.h"
-#include "nvim/os/os.h"
-#include "nvim/os/shell.h"
-
-
-#ifdef INCLUDE_GENERATED_DECLARATIONS
-# include "misc2.c.generated.h"
-#endif
-/*
- * Return TRUE if in the current mode we need to use virtual.
- */
-int virtual_active(void)
-{
- /* While an operator is being executed we return "virtual_op", because
- * VIsual_active has already been reset, thus we can't check for "block"
- * being used. */
- if (virtual_op != MAYBE)
- return virtual_op;
- return ve_flags == VE_ALL
- || ((ve_flags & VE_BLOCK) && VIsual_active && VIsual_mode == Ctrl_V)
- || ((ve_flags & VE_INSERT) && (State & INSERT));
-}
-
-/*
- * Increment the line pointer "lp" crossing line boundaries as necessary.
- * Return 1 when going to the next line.
- * Return 2 when moving forward onto a NUL at the end of the line).
- * Return -1 when at the end of file.
- * Return 0 otherwise.
- */
-int inc(pos_T *lp)
-{
- char_u *p = ml_get_pos(lp);
-
- if (*p != NUL) { /* still within line, move to next char (may be NUL) */
- if (has_mbyte) {
- int l = (*mb_ptr2len)(p);
-
- lp->col += l;
- return (p[l] != NUL) ? 0 : 2;
- }
- lp->col++;
- lp->coladd = 0;
- return (p[1] != NUL) ? 0 : 2;
- }
- if (lp->lnum != curbuf->b_ml.ml_line_count) { /* there is a next line */
- lp->col = 0;
- lp->lnum++;
- lp->coladd = 0;
- return 1;
- }
- return -1;
-}
-
-/*
- * incl(lp): same as inc(), but skip the NUL at the end of non-empty lines
- */
-int incl(pos_T *lp)
-{
- int r;
-
- if ((r = inc(lp)) >= 1 && lp->col)
- r = inc(lp);
- return r;
-}
-
-int dec(pos_T *lp)
-{
- char_u *p;
-
- lp->coladd = 0;
- if (lp->col > 0) { /* still within line */
- lp->col--;
- if (has_mbyte) {
- p = ml_get(lp->lnum);
- lp->col -= (*mb_head_off)(p, p + lp->col);
- }
- return 0;
- }
- if (lp->lnum > 1) { /* there is a prior line */
- lp->lnum--;
- p = ml_get(lp->lnum);
- lp->col = (colnr_T)STRLEN(p);
- if (has_mbyte)
- lp->col -= (*mb_head_off)(p, p + lp->col);
- return 1;
- }
- return -1; /* at start of file */
-}
-
-/*
- * decl(lp): same as dec(), but skip the NUL at the end of non-empty lines
- */
-int decl(pos_T *lp)
-{
- int r;
-
- if ((r = dec(lp)) == 1 && lp->col)
- r = dec(lp);
- return r;
-}
-
-/*
- * Return TRUE when 'shell' has "csh" in the tail.
- */
-int csh_like_shell(void)
-{
- return strstr((char *)path_tail(p_sh), "csh") != NULL;
-}
-
-/*
- * Isolate one part of a string option where parts are separated with
- * "sep_chars".
- * The part is copied into "buf[maxlen]".
- * "*option" is advanced to the next part.
- * The length is returned.
- */
-size_t copy_option_part(char_u **option, char_u *buf, size_t maxlen, char *sep_chars)
-{
- size_t len = 0;
- char_u *p = *option;
-
- /* skip '.' at start of option part, for 'suffixes' */
- if (*p == '.')
- buf[len++] = *p++;
- while (*p != NUL && vim_strchr((char_u *)sep_chars, *p) == NULL) {
- /*
- * Skip backslash before a separator character and space.
- */
- if (p[0] == '\\' && vim_strchr((char_u *)sep_chars, p[1]) != NULL)
- ++p;
- if (len < maxlen - 1)
- buf[len++] = *p;
- ++p;
- }
- buf[len] = NUL;
-
- if (*p != NUL && *p != ',') /* skip non-standard separator */
- ++p;
- p = skip_to_option_part(p); /* p points to next file name */
-
- *option = p;
- return len;
-}
-
-/*
- * Return the current end-of-line type: EOL_DOS, EOL_UNIX or EOL_MAC.
- */
-int get_fileformat(buf_T *buf)
-{
- int c = *buf->b_p_ff;
-
- if (buf->b_p_bin || c == 'u')
- return EOL_UNIX;
- if (c == 'm')
- return EOL_MAC;
- return EOL_DOS;
-}
-
-/*
- * Like get_fileformat(), but override 'fileformat' with "p" for "++opt=val"
- * argument.
- */
-int
-get_fileformat_force (
- buf_T *buf,
- exarg_T *eap /* can be NULL! */
-)
-{
- int c;
-
- if (eap != NULL && eap->force_ff != 0)
- c = eap->cmd[eap->force_ff];
- else {
- if ((eap != NULL && eap->force_bin != 0)
- ? (eap->force_bin == FORCE_BIN) : buf->b_p_bin)
- return EOL_UNIX;
- c = *buf->b_p_ff;
- }
- if (c == 'u')
- return EOL_UNIX;
- if (c == 'm')
- return EOL_MAC;
- return EOL_DOS;
-}
-
-/// Set the current end-of-line type to EOL_UNIX, EOL_MAC, or EOL_DOS.
-///
-/// Sets 'fileformat'.
-///
-/// @param eol_style End-of-line style.
-/// @param opt_flags OPT_LOCAL and/or OPT_GLOBAL
-void set_fileformat(int eol_style, int opt_flags)
-{
- char *p = NULL;
-
- switch (eol_style) {
- case EOL_UNIX:
- p = FF_UNIX;
- break;
- case EOL_MAC:
- p = FF_MAC;
- break;
- case EOL_DOS:
- p = FF_DOS;
- break;
- }
-
- // p is NULL if "eol_style" is EOL_UNKNOWN.
- if (p != NULL) {
- set_string_option_direct((char_u *)"ff",
- -1,
- (char_u *)p,
- OPT_FREE | opt_flags,
- 0);
- }
-
- // This may cause the buffer to become (un)modified.
- check_status(curbuf);
- redraw_tabline = TRUE;
- need_maketitle = TRUE; // Set window title later.
-}
-
-/*
- * Return the default fileformat from 'fileformats'.
- */
-int default_fileformat(void)
-{
- switch (*p_ffs) {
- case 'm': return EOL_MAC;
- case 'd': return EOL_DOS;
- }
- return EOL_UNIX;
-}
-
-// Call shell. Calls os_call_shell, with 'shellxquote' added.
-int call_shell(char_u *cmd, ShellOpts opts, char_u *extra_shell_arg)
-{
- char_u *ncmd;
- int retval;
- proftime_T wait_time;
-
- if (p_verbose > 3) {
- verbose_enter();
- smsg(_("Calling shell to execute: \"%s\""),
- cmd == NULL ? p_sh : cmd);
- ui_putc('\n');
- verbose_leave();
- }
-
- if (do_profiling == PROF_YES)
- prof_child_enter(&wait_time);
-
- if (*p_sh == NUL) {
- EMSG(_(e_shellempty));
- retval = -1;
- } else {
- /* The external command may update a tags file, clear cached tags. */
- tag_freematch();
-
- if (cmd == NULL || *p_sxq == NUL)
- retval = os_call_shell(cmd, opts, extra_shell_arg);
- else {
- char_u *ecmd = cmd;
-
- if (*p_sxe != NUL && STRCMP(p_sxq, "(") == 0) {
- ecmd = vim_strsave_escaped_ext(cmd, p_sxe, '^', FALSE);
- }
- ncmd = xmalloc(STRLEN(ecmd) + STRLEN(p_sxq) * 2 + 1);
- STRCPY(ncmd, p_sxq);
- STRCAT(ncmd, ecmd);
- /* When 'shellxquote' is ( append ).
- * When 'shellxquote' is "( append )". */
- STRCAT(ncmd, STRCMP(p_sxq, "(") == 0 ? (char_u *)")"
- : STRCMP(p_sxq, "\"(") == 0 ? (char_u *)")\""
- : p_sxq);
- retval = os_call_shell(ncmd, opts, extra_shell_arg);
- xfree(ncmd);
-
- if (ecmd != cmd)
- xfree(ecmd);
- }
- }
-
- set_vim_var_nr(VV_SHELL_ERROR, (varnumber_T) retval);
- if (do_profiling == PROF_YES) {
- prof_child_exit(&wait_time);
- }
-
- return retval;
-}
-
-/*
- * VISUAL, SELECTMODE and OP_PENDING State are never set, they are equal to
- * NORMAL State with a condition. This function returns the real State.
- */
-int get_real_state(void)
-{
- if (State & NORMAL) {
- if (VIsual_active) {
- if (VIsual_select)
- return SELECTMODE;
- return VISUAL;
- } else if (finish_op)
- return OP_PENDING;
- }
- return State;
-}
-
-/*
- * Change to a file's directory.
- * Caller must call shorten_fnames()!
- * Return OK or FAIL.
- */
-int vim_chdirfile(char_u *fname)
-{
- char_u dir[MAXPATHL];
-
- STRLCPY(dir, fname, MAXPATHL);
- *path_tail_with_sep(dir) = NUL;
- return os_chdir((char *)dir) == 0 ? OK : FAIL;
-}
-
-/*
- * Change directory to "new_dir". Search 'cdpath' for relative directory names.
- */
-int vim_chdir(char_u *new_dir)
-{
- char_u *dir_name;
- int r;
-
- dir_name = find_directory_in_path(new_dir, STRLEN(new_dir),
- FNAME_MESS, curbuf->b_ffname);
- if (dir_name == NULL)
- return -1;
- r = os_chdir((char *)dir_name);
- xfree(dir_name);
- return r;
-}
-
-/*
- * Read 2 bytes from "fd" and turn them into an int, MSB first.
- */
-int get2c(FILE *fd)
-{
- int n;
-
- n = getc(fd);
- n = (n << 8) + getc(fd);
- return n;
-}
-
-/*
- * Read 3 bytes from "fd" and turn them into an int, MSB first.
- */
-int get3c(FILE *fd)
-{
- int n;
-
- n = getc(fd);
- n = (n << 8) + getc(fd);
- n = (n << 8) + getc(fd);
- return n;
-}
-
-/*
- * Read 4 bytes from "fd" and turn them into an int, MSB first.
- */
-int get4c(FILE *fd)
-{
- /* Use unsigned rather than int otherwise result is undefined
- * when left-shift sets the MSB. */
- unsigned n;
-
- n = (unsigned)getc(fd);
- n = (n << 8) + (unsigned)getc(fd);
- n = (n << 8) + (unsigned)getc(fd);
- n = (n << 8) + (unsigned)getc(fd);
- return (int)n;
-}
-
-/*
- * Read 8 bytes from "fd" and turn them into a time_t, MSB first.
- */
-time_t get8ctime(FILE *fd)
-{
- time_t n = 0;
- int i;
-
- for (i = 0; i < 8; ++i)
- n = (n << 8) + getc(fd);
- return n;
-}
-
-/// Reads a string of length "cnt" from "fd" into allocated memory.
-/// @return pointer to the string or NULL when unable to read that many bytes.
-char *read_string(FILE *fd, size_t cnt)
-{
- uint8_t *str = xmallocz(cnt);
- for (size_t i = 0; i < cnt; i++) {
- int c = getc(fd);
- if (c == EOF) {
- xfree(str);
- return NULL;
- }
- str[i] = (uint8_t)c;
- }
- return (char *)str;
-}
-
-/// Writes a number to file "fd", most significant bit first, in "len" bytes.
-/// @returns false in case of an error.
-bool put_bytes(FILE *fd, uintmax_t number, size_t len)
-{
- assert(len > 0);
- for (size_t i = len - 1; i < len; i--) {
- if (putc((int)(number >> (i * 8)), fd) == EOF) {
- return false;
- }
- }
- return true;
-}
-
-/// Writes time_t to file "fd" in 8 bytes.
-/// @returns FAIL when the write failed.
-int put_time(FILE *fd, time_t time_)
-{
- uint8_t buf[8];
- time_to_bytes(time_, buf);
- return fwrite(buf, sizeof(uint8_t), ARRAY_SIZE(buf), fd) == 1 ? OK : FAIL;
-}
-
-/// Writes time_t to "buf[8]".
-void time_to_bytes(time_t time_, uint8_t buf[8])
-{
- // time_t can be up to 8 bytes in size, more than uintmax_t in 32 bits
- // systems, thus we can't use put_bytes() here.
- for (size_t i = 7, bufi = 0; bufi < 8; i--, bufi++) {
- buf[bufi] = (uint8_t)((uint64_t)time_ >> (i * 8));
- }
-}
diff --git a/src/nvim/misc2.h b/src/nvim/misc2.h
deleted file mode 100644
index 28b5b775d2..0000000000
--- a/src/nvim/misc2.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef NVIM_MISC2_H
-#define NVIM_MISC2_H
-
-#include "nvim/os/shell.h"
-
-#define READ_STRING(x, y) (char_u *)read_string((x), (size_t)(y))
-
-#ifdef INCLUDE_GENERATED_DECLARATIONS
-# include "misc2.h.generated.h"
-#endif
-
-#endif // NVIM_MISC2_H
diff --git a/src/nvim/mouse.c b/src/nvim/mouse.c
index 2f499e477c..887cbde921 100644
--- a/src/nvim/mouse.c
+++ b/src/nvim/mouse.c
@@ -1,11 +1,16 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <stdbool.h>
#include "nvim/mouse.h"
#include "nvim/vim.h"
#include "nvim/ascii.h"
#include "nvim/window.h"
+#include "nvim/state.h"
#include "nvim/strings.h"
#include "nvim/screen.h"
+#include "nvim/syntax.h"
#include "nvim/ui.h"
#include "nvim/os_unix.h"
#include "nvim/fold.h"
@@ -103,12 +108,14 @@ retnomove:
goto retnomove; // ugly goto...
// Remember the character under the mouse, it might be a '-' or '+' in the
- // fold column.
+ // fold column. NB: only works for ASCII chars!
if (row >= 0 && row < Rows && col >= 0 && col <= Columns
- && ScreenLines != NULL)
- mouse_char = ScreenLines[LineOffset[row] + (unsigned)col];
- else
+ && default_grid.chars != NULL) {
+ mouse_char = default_grid.chars[default_grid.line_offset[row]
+ + (unsigned)col][0];
+ } else {
mouse_char = ' ';
+ }
old_curwin = curwin;
old_cursor = curwin->w_cursor;
@@ -119,6 +126,9 @@ retnomove:
// find the window where the row is in
wp = mouse_find_win(&row, &col);
+ if (wp == NULL) {
+ return IN_UNKNOWN;
+ }
dragwin = NULL;
// winpos and height may change in win_enter()!
if (row >= wp->w_height) { // In (or below) status line
@@ -303,9 +313,12 @@ retnomove:
mouse_past_bottom = true;
}
+ if (!(flags & MOUSE_RELEASED) && which_button == MOUSE_LEFT) {
+ col = mouse_adjust_click(curwin, row, col);
+ }
+
// Start Visual mode before coladvance(), for when 'sel' != "old"
if ((flags & MOUSE_MAY_VIS) && !VIsual_active) {
- check_visual_highlight();
VIsual = old_cursor;
VIsual_active = true;
VIsual_reselect = true;
@@ -417,6 +430,7 @@ bool mouse_comp_pos(win_T *win, int *rowp, int *colp, linenr_T *lnump)
// Find the window at screen position "*rowp" and "*colp". The positions are
// updated to become relative to the top-left of the window.
+// Returns NULL when something is wrong.
win_T *mouse_find_win(int *rowp, int *colp)
{
frame_T *fp;
@@ -440,7 +454,14 @@ win_T *mouse_find_win(int *rowp, int *colp)
}
}
}
- return fp->fr_win;
+ // When using a timer that closes a window the window might not actually
+ // exist.
+ FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
+ if (wp == fp->fr_win) {
+ return wp;
+ }
+ }
+ return NULL;
}
/*
@@ -450,6 +471,7 @@ void setmouse(void)
{
int checkfor;
+ ui_cursor_shape();
/* be quick when mouse is off */
if (*p_mouse == NUL)
@@ -469,9 +491,9 @@ void setmouse(void)
checkfor = MOUSE_NORMAL; /* assume normal mode */
if (mouse_has(checkfor)) {
- ui_mouse_on();
+ ui_call_mouse_on();
} else {
- ui_mouse_off();
+ ui_call_mouse_off();
}
}
@@ -515,7 +537,7 @@ static colnr_T scroll_line_len(linenr_T lnum)
if (*line != NUL) {
for (;;) {
int numchar = chartabsize(line, col);
- mb_ptr_adv(line);
+ MB_PTR_ADV(line);
if (*line == NUL) { // don't count the last character
break;
}
@@ -597,3 +619,111 @@ bool mouse_scroll_horiz(int dir)
return leftcol_changed();
}
+
+/// Adjusts the clicked column position when 'conceallevel' > 0
+static int mouse_adjust_click(win_T *wp, int row, int col)
+{
+ if (!(wp->w_p_cole > 0 && curbuf->b_p_smc > 0
+ && wp->w_leftcol < curbuf->b_p_smc && conceal_cursor_line(wp))) {
+ return col;
+ }
+
+ // `col` is the position within the current line that is highlighted by the
+ // cursor without consideration for concealed characters. The current line is
+ // scanned *up to* `col`, nudging it left or right when concealed characters
+ // are encountered.
+ //
+ // chartabsize() is used to keep track of the virtual column position relative
+ // to the line's bytes. For example: if col == 9 and the line starts with a
+ // tab that's 8 columns wide, we would want the cursor to be highlighting the
+ // second byte, not the ninth.
+
+ linenr_T lnum = wp->w_cursor.lnum;
+ char_u *line = ml_get(lnum);
+ char_u *ptr = line;
+ char_u *ptr_end;
+ char_u *ptr_row_offset = line; // Where we begin adjusting `ptr_end`
+
+ // Find the offset where scanning should begin.
+ int offset = wp->w_leftcol;
+ if (row > 0) {
+ offset += row * (wp->w_width - win_col_off(wp) - win_col_off2(wp) -
+ wp->w_leftcol + wp->w_skipcol);
+ }
+
+ int vcol;
+
+ if (offset) {
+ // Skip everything up to an offset since nvim takes care of displaying the
+ // correct portion of the line when horizontally scrolling.
+ // When 'wrap' is enabled, only the row (of the wrapped line) needs to be
+ // checked for concealed characters.
+ vcol = 0;
+ while (vcol < offset && *ptr != NUL) {
+ vcol += chartabsize(ptr, vcol);
+ ptr += utfc_ptr2len(ptr);
+ }
+
+ ptr_row_offset = ptr;
+ }
+
+ // Align `ptr_end` with `col`
+ vcol = offset;
+ ptr_end = ptr_row_offset;
+ while (vcol < col && *ptr_end != NUL) {
+ vcol += chartabsize(ptr_end, vcol);
+ ptr_end += utfc_ptr2len(ptr_end);
+ }
+
+ int matchid;
+ int prev_matchid;
+ int nudge = 0;
+ int cwidth = 0;
+
+ vcol = offset;
+
+#define incr() nudge++; ptr_end += utfc_ptr2len(ptr_end)
+#define decr() nudge--; ptr_end -= utfc_ptr2len(ptr_end)
+
+ while (ptr < ptr_end && *ptr != NUL) {
+ cwidth = chartabsize(ptr, vcol);
+ vcol += cwidth;
+ if (cwidth > 1 && *ptr == '\t' && nudge > 0) {
+ // A tab will "absorb" any previous adjustments.
+ cwidth = MIN(cwidth, nudge);
+ while (cwidth > 0) {
+ decr();
+ cwidth--;
+ }
+ }
+
+ matchid = syn_get_concealed_id(wp, lnum, (colnr_T)(ptr - line));
+ if (matchid != 0) {
+ if (wp->w_p_cole == 3) {
+ incr();
+ } else {
+ if (!(row > 0 && ptr == ptr_row_offset)
+ && (wp->w_p_cole == 1 || (wp->w_p_cole == 2
+ && (lcs_conceal != NUL
+ || syn_get_sub_char() != NUL)))) {
+ // At least one placeholder character will be displayed.
+ decr();
+ }
+
+ prev_matchid = matchid;
+
+ while (prev_matchid == matchid && *ptr != NUL) {
+ incr();
+ ptr += utfc_ptr2len(ptr);
+ matchid = syn_get_concealed_id(wp, lnum, (colnr_T)(ptr - line));
+ }
+
+ continue;
+ }
+ }
+
+ ptr += utfc_ptr2len(ptr);
+ }
+
+ return col + nudge;
+}
diff --git a/src/nvim/move.c b/src/nvim/move.c
index b129c5cb7a..07b355e603 100644
--- a/src/nvim/move.c
+++ b/src/nvim/move.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* move.c: Functions for moving the cursor and scrolling text.
*
@@ -13,7 +16,6 @@
#include <inttypes.h>
#include <stdbool.h>
-#include "nvim/vim.h"
#include "nvim/ascii.h"
#include "nvim/move.h"
#include "nvim/charset.h"
@@ -24,7 +26,7 @@
#include "nvim/mbyte.h"
#include "nvim/memline.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
+#include "nvim/option.h"
#include "nvim/popupmnu.h"
#include "nvim/screen.h"
#include "nvim/strings.h"
@@ -81,8 +83,9 @@ static void comp_botline(win_T *wp)
redraw_for_cursorline(wp);
wp->w_valid |= (VALID_CROW|VALID_CHEIGHT);
}
- if (done + n > wp->w_height)
+ if (done + n > wp->w_grid.Rows) {
break;
+ }
done += n;
lnum = last;
}
@@ -94,16 +97,34 @@ static void comp_botline(win_T *wp)
set_empty_rows(wp, done);
}
-/*
-* Redraw when w_cline_row changes and 'relativenumber' or 'cursorline' is
-* set.
-*/
+void reset_cursorline(void)
+{
+ curwin->w_last_cursorline = 0;
+}
+
+// Redraw when w_cline_row changes and 'relativenumber' or 'cursorline' is set.
static void redraw_for_cursorline(win_T *wp)
{
- if ((wp->w_p_rnu || wp->w_p_cul)
+ if ((wp->w_p_rnu || win_cursorline_standout(wp))
&& (wp->w_valid & VALID_CROW) == 0
&& !pum_visible()) {
- redraw_win_later(wp, SOME_VALID);
+ if (wp->w_p_rnu) {
+ // win_line() will redraw the number column only.
+ redraw_win_later(wp, VALID);
+ }
+ if (win_cursorline_standout(wp)) {
+ if (wp->w_redr_type <= VALID && wp->w_last_cursorline != 0) {
+ // "w_last_cursorline" may be outdated, worst case we redraw
+ // too much. This is optimized for moving the cursor around in
+ // the current window.
+ redrawWinline(wp, wp->w_last_cursorline);
+ redrawWinline(wp, wp->w_cursor.lnum);
+ redraw_win_later(wp, VALID);
+ } else {
+ redraw_win_later(wp, SOME_VALID);
+ }
+ wp->w_last_cursorline = wp->w_cursor.lnum;
+ }
}
}
@@ -129,11 +150,12 @@ void update_topline(void)
bool check_botline = false;
long save_so = p_so;
- if (!screen_valid(true))
- return;
+ // need to have w_grid.Rows/Columns updated
+ win_grid_alloc(curwin);
- // If the window height is zero, just use the cursor line.
- if (curwin->w_height == 0) {
+ // If there is no valid screen and when the window height is zero just use
+ // the cursor line.
+ if (!screen_valid(true) || curwin->w_grid.Rows == 0) {
curwin->w_topline = curwin->w_cursor.lnum;
curwin->w_botline = curwin->w_topline;
curwin->w_valid |= VALID_BOTLINE|VALID_BOTLINE_AP;
@@ -152,12 +174,11 @@ void update_topline(void)
old_topline = curwin->w_topline;
old_topfill = curwin->w_topfill;
- /*
- * If the buffer is empty, always set topline to 1.
- */
- if (bufempty()) { /* special case - file is empty */
- if (curwin->w_topline != 1)
+ // If the buffer is empty, always set topline to 1.
+ if (BUFEMPTY()) { // special case - file is empty
+ if (curwin->w_topline != 1) {
redraw_later(NOT_VALID);
+ }
curwin->w_topline = 1;
curwin->w_botline = 2;
curwin->w_valid |= VALID_BOTLINE|VALID_BOTLINE_AP;
@@ -183,9 +204,10 @@ void update_topline(void)
check_topline = true;
if (check_topline) {
- int halfheight = curwin->w_height / 2 - 1;
- if (halfheight < 2)
+ int halfheight = curwin->w_grid.Rows / 2 - 1;
+ if (halfheight < 2) {
halfheight = 2;
+ }
long n;
if (hasAnyFolding(curwin)) {
/* Count the number of logical lines between the cursor and
@@ -272,20 +294,22 @@ void update_topline(void)
* botline - p_so (approximation of how much will be
* scrolled). */
for (linenr_T lnum = curwin->w_cursor.lnum;
- lnum >= curwin->w_botline - p_so; --lnum) {
- ++line_count;
- /* stop at end of file or when we know we are far off */
- if (lnum <= 0 || line_count > curwin->w_height + 1)
+ lnum >= curwin->w_botline - p_so; lnum--) {
+ line_count++;
+ // stop at end of file or when we know we are far off
+ if (lnum <= 0 || line_count > curwin->w_grid.Rows + 1) {
break;
+ }
(void)hasFolding(lnum, &lnum, NULL);
}
} else
line_count = curwin->w_cursor.lnum - curwin->w_botline
+ 1 + p_so;
- if (line_count <= curwin->w_height + 1)
+ if (line_count <= curwin->w_grid.Rows + 1) {
scroll_cursor_bot(scrolljump_value(), false);
- else
+ } else {
scroll_cursor_halfway(false);
+ }
}
}
}
@@ -329,7 +353,7 @@ void update_topline_win(win_T* win)
*/
static int scrolljump_value(void)
{
- long result = p_sj >= 0 ? p_sj : (curwin->w_height * -p_sj) / 100;
+ long result = p_sj >= 0 ? p_sj : (curwin->w_grid.Rows * -p_sj) / 100;
assert(result <= INT_MAX);
return (int)result;
}
@@ -505,6 +529,7 @@ int cursor_valid(void)
*/
void validate_cursor(void)
{
+ win_grid_alloc(curwin); // we need to have w_grid.Rows/Columns updated
check_cursor_moved(curwin);
if ((curwin->w_valid & (VALID_WCOL|VALID_WROW)) != (VALID_WCOL|VALID_WROW))
curs_columns(true);
@@ -643,18 +668,19 @@ void validate_cursor_col(void)
colnr_T col = curwin->w_virtcol;
colnr_T off = curwin_col_off();
col += off;
- int width = curwin->w_width - off + curwin_col_off2();
-
- /* long line wrapping, adjust curwin->w_wrow */
- if (curwin->w_p_wrap
- && col >= (colnr_T)curwin->w_width
- && width > 0)
- /* use same formula as what is used in curs_columns() */
- col -= ((col - curwin->w_width) / width + 1) * width;
- if (col > (int)curwin->w_leftcol)
+ int width = curwin->w_grid.Columns - off + curwin_col_off2();
+
+ // long line wrapping, adjust curwin->w_wrow
+ if (curwin->w_p_wrap && col >= (colnr_T)curwin->w_grid.Columns
+ && width > 0) {
+ // use same formula as what is used in curs_columns()
+ col -= ((col - curwin->w_grid.Columns) / width + 1) * width;
+ }
+ if (col > (int)curwin->w_leftcol) {
col -= curwin->w_leftcol;
- else
+ } else {
col = 0;
+ }
curwin->w_wcol = col;
curwin->w_valid |= VALID_WCOL;
@@ -670,8 +696,7 @@ int win_col_off(win_T *wp)
return ((wp->w_p_nu || wp->w_p_rnu) ? number_width(wp) + 1 : 0)
+ (cmdwin_type == 0 || wp != curwin ? 0 : 1)
+ (int)wp->w_p_fdc
- + (wp->w_buffer->b_signlist != NULL ? 2 : 0)
- ;
+ + (signcolumn_on(wp) ? win_signcol_width(wp) : 0);
}
int curwin_col_off(void)
@@ -744,20 +769,20 @@ void curs_columns(
*/
curwin->w_wrow = curwin->w_cline_row;
- int textwidth = curwin->w_width - extra;
+ int textwidth = curwin->w_grid.Columns - extra;
if (textwidth <= 0) {
- /* No room for text, put cursor in last char of window. */
- curwin->w_wcol = curwin->w_width - 1;
- curwin->w_wrow = curwin->w_height - 1;
+ // No room for text, put cursor in last char of window.
+ curwin->w_wcol = curwin->w_grid.Columns - 1;
+ curwin->w_wrow = curwin->w_grid.Rows - 1;
} else if (curwin->w_p_wrap
- && curwin->w_width != 0
+ && curwin->w_grid.Columns != 0
) {
width = textwidth + curwin_col_off2();
- /* long line wrapping, adjust curwin->w_wrow */
- if (curwin->w_wcol >= curwin->w_width) {
- /* this same formula is used in validate_cursor_col() */
- n = (curwin->w_wcol - curwin->w_width) / width + 1;
+ // long line wrapping, adjust curwin->w_wrow
+ if (curwin->w_wcol >= curwin->w_grid.Columns) {
+ // this same formula is used in validate_cursor_col()
+ n = (curwin->w_wcol - curwin->w_grid.Columns) / width + 1;
curwin->w_wcol -= n * width;
curwin->w_wrow += n;
@@ -784,7 +809,7 @@ void curs_columns(
assert(p_siso <= INT_MAX);
int off_left = startcol - curwin->w_leftcol - (int)p_siso;
int off_right =
- endcol - curwin->w_leftcol - curwin->w_width + (int)p_siso + 1;
+ endcol - curwin->w_leftcol - curwin->w_grid.Columns + (int)p_siso + 1;
if (off_left < 0 || off_right > 0) {
int diff = (off_left < 0) ? -off_left: off_right;
@@ -827,17 +852,16 @@ void curs_columns(
prev_skipcol = curwin->w_skipcol;
int p_lines = 0;
- if ((curwin->w_wrow >= curwin->w_height
+ if ((curwin->w_wrow >= curwin->w_grid.Rows
|| ((prev_skipcol > 0
- || curwin->w_wrow + p_so >= curwin->w_height)
+ || curwin->w_wrow + p_so >= curwin->w_grid.Rows)
&& (p_lines =
- plines_win_nofill
- (curwin, curwin->w_cursor.lnum, false))
- - 1 >= curwin->w_height))
- && curwin->w_height != 0
+ plines_win_nofill(curwin, curwin->w_cursor.lnum, false)) - 1
+ >= curwin->w_grid.Rows))
+ && curwin->w_grid.Rows != 0
&& curwin->w_cursor.lnum == curwin->w_topline
&& width > 0
- && curwin->w_width != 0
+ && curwin->w_grid.Columns != 0
) {
/* Cursor past end of screen. Happens with a single line that does
* not fit on screen. Find a skipcol to show the text around the
@@ -859,19 +883,22 @@ void curs_columns(
}
else
n = p_lines;
- if ((colnr_T)n >= curwin->w_height + curwin->w_skipcol / width)
+ if ((colnr_T)n >= curwin->w_grid.Rows + curwin->w_skipcol / width) {
extra += 2;
+ }
if (extra == 3 || p_lines < p_so * 2) {
- /* not enough room for 'scrolloff', put cursor in the middle */
+ // not enough room for 'scrolloff', put cursor in the middle
n = curwin->w_virtcol / width;
- if (n > curwin->w_height / 2)
- n -= curwin->w_height / 2;
- else
+ if (n > curwin->w_grid.Rows / 2) {
+ n -= curwin->w_grid.Rows / 2;
+ } else {
n = 0;
- /* don't skip more than necessary */
- if (n > p_lines - curwin->w_height + 1)
- n = p_lines - curwin->w_height + 1;
+ }
+ // don't skip more than necessary
+ if (n > p_lines - curwin->w_grid.Rows + 1) {
+ n = p_lines - curwin->w_grid.Rows + 1;
+ }
curwin->w_skipcol = n * width;
} else if (extra == 1) {
/* less then 'scrolloff' lines above, decrease skipcol */
@@ -884,27 +911,29 @@ void curs_columns(
curwin->w_skipcol -= extra * width;
}
} else if (extra == 2) {
- /* less then 'scrolloff' lines below, increase skipcol */
- endcol = (n - curwin->w_height + 1) * width;
- while (endcol > curwin->w_virtcol)
+ // less then 'scrolloff' lines below, increase skipcol
+ endcol = (n - curwin->w_grid.Rows + 1) * width;
+ while (endcol > curwin->w_virtcol) {
endcol -= width;
- if (endcol > curwin->w_skipcol)
+ }
+ if (endcol > curwin->w_skipcol) {
curwin->w_skipcol = endcol;
+ }
}
curwin->w_wrow -= curwin->w_skipcol / width;
- if (curwin->w_wrow >= curwin->w_height) {
- /* small window, make sure cursor is in it */
- extra = curwin->w_wrow - curwin->w_height + 1;
+ if (curwin->w_wrow >= curwin->w_grid.Rows) {
+ // small window, make sure cursor is in it
+ extra = curwin->w_wrow - curwin->w_grid.Rows + 1;
curwin->w_skipcol += extra * width;
curwin->w_wrow -= extra;
}
extra = ((int)prev_skipcol - (int)curwin->w_skipcol) / width;
if (extra > 0) {
- win_ins_lines(curwin, 0, extra, false, false);
+ win_ins_lines(curwin, 0, extra);
} else if (extra < 0) {
- win_del_lines(curwin, 0, -extra, false, false);
+ win_del_lines(curwin, 0, -extra);
}
} else {
curwin->w_skipcol = 0;
@@ -937,9 +966,9 @@ scrolldown (
validate_cursor(); /* w_wrow needs to be valid */
while (line_count-- > 0) {
if (curwin->w_topfill < diff_check(curwin, curwin->w_topline)
- && curwin->w_topfill < curwin->w_height - 1) {
- ++curwin->w_topfill;
- ++done;
+ && curwin->w_topfill < curwin->w_grid.Rows - 1) {
+ curwin->w_topfill++;
+ done++;
} else {
if (curwin->w_topline == 1)
break;
@@ -972,15 +1001,15 @@ scrolldown (
*/
int wrow = curwin->w_wrow;
if (curwin->w_p_wrap
- && curwin->w_width != 0
+ && curwin->w_grid.Columns != 0
) {
validate_virtcol();
validate_cheight();
wrow += curwin->w_cline_height - 1 -
- curwin->w_virtcol / curwin->w_width;
+ curwin->w_virtcol / curwin->w_grid.Columns;
}
bool moved = false;
- while (wrow >= curwin->w_height && curwin->w_cursor.lnum > 1) {
+ while (wrow >= curwin->w_grid.Rows && curwin->w_cursor.lnum > 1) {
linenr_T first;
if (hasFolding(curwin->w_cursor.lnum, &first, NULL)) {
--wrow;
@@ -1065,14 +1094,15 @@ check_topfill (
{
if (wp->w_topfill > 0) {
int n = plines_win_nofill(wp, wp->w_topline, true);
- if (wp->w_topfill + n > wp->w_height) {
+ if (wp->w_topfill + n > wp->w_grid.Rows) {
if (down && wp->w_topline > 1) {
--wp->w_topline;
wp->w_topfill = 0;
} else {
- wp->w_topfill = wp->w_height - n;
- if (wp->w_topfill < 0)
+ wp->w_topfill = wp->w_grid.Rows - n;
+ if (wp->w_topfill < 0) {
wp->w_topfill = 0;
+ }
}
}
}
@@ -1085,12 +1115,13 @@ check_topfill (
static void max_topfill(void)
{
int n = plines_nofill(curwin->w_topline);
- if (n >= curwin->w_height)
+ if (n >= curwin->w_grid.Rows) {
curwin->w_topfill = 0;
- else {
+ } else {
curwin->w_topfill = diff_check_fill(curwin, curwin->w_topline);
- if (curwin->w_topfill + n > curwin->w_height)
- curwin->w_topfill = curwin->w_height - n;
+ if (curwin->w_topfill + n > curwin->w_grid.Rows) {
+ curwin->w_topfill = curwin->w_grid.Rows - n;
+ }
}
}
@@ -1121,14 +1152,14 @@ void scrolldown_clamp(void)
else
end_row += plines_nofill(curwin->w_topline - 1);
if (curwin->w_p_wrap
- && curwin->w_width != 0
+ && curwin->w_grid.Columns != 0
) {
validate_cheight();
validate_virtcol();
end_row += curwin->w_cline_height - 1 -
- curwin->w_virtcol / curwin->w_width;
+ curwin->w_virtcol / curwin->w_grid.Columns;
}
- if (end_row < curwin->w_height - p_so) {
+ if (end_row < curwin->w_grid.Rows - p_so) {
if (can_fill) {
++curwin->w_topfill;
check_topfill(curwin, true);
@@ -1163,10 +1194,10 @@ void scrollup_clamp(void)
int start_row = curwin->w_wrow - plines_nofill(curwin->w_topline)
- curwin->w_topfill;
if (curwin->w_p_wrap
- && curwin->w_width != 0
+ && curwin->w_grid.Columns != 0
) {
validate_virtcol();
- start_row -= curwin->w_virtcol / curwin->w_width;
+ start_row -= curwin->w_virtcol / curwin->w_grid.Columns;
}
if (start_row >= p_so) {
if (curwin->w_topfill > 0)
@@ -1320,10 +1351,12 @@ void scroll_cursor_top(int min_scroll, int always)
else
used += plines(bot);
}
- if (used > curwin->w_height)
+ if (used > curwin->w_grid.Rows) {
break;
- if (top < curwin->w_topline)
+ }
+ if (top < curwin->w_topline) {
scrolled += i;
+ }
/*
* If scrolling is needed, scroll at least 'sj' lines.
@@ -1343,7 +1376,7 @@ void scroll_cursor_top(int min_scroll, int always)
* This makes sure we get the same position when using "k" and "j"
* in a small window.
*/
- if (used > curwin->w_height) {
+ if (used > curwin->w_grid.Rows) {
scroll_cursor_halfway(false);
} else {
/*
@@ -1377,10 +1410,10 @@ void scroll_cursor_top(int min_scroll, int always)
void set_empty_rows(win_T *wp, int used)
{
wp->w_filler_rows = 0;
- if (used == 0)
- wp->w_empty_rows = 0; /* single line that doesn't fit */
- else {
- wp->w_empty_rows = wp->w_height - used;
+ if (used == 0) {
+ wp->w_empty_rows = 0; // single line that doesn't fit
+ } else {
+ wp->w_empty_rows = wp->w_grid.Rows - used;
if (wp->w_botline <= wp->w_buffer->b_ml.ml_line_count) {
wp->w_filler_rows = diff_check_fill(wp, wp->w_botline);
if (wp->w_empty_rows > wp->w_filler_rows)
@@ -1423,8 +1456,9 @@ void scroll_cursor_bot(int min_scroll, int set_topbot)
curwin->w_topline = loff.lnum) {
loff.lnum = curwin->w_topline;
topline_back(&loff);
- if (loff.height == MAXCOL || used + loff.height > curwin->w_height)
+ if (loff.height == MAXCOL || used + loff.height > curwin->w_grid.Rows) {
break;
+ }
used += loff.height;
curwin->w_topfill = loff.fill;
}
@@ -1481,12 +1515,14 @@ void scroll_cursor_bot(int min_scroll, int set_topbot)
/* Add one line above */
topline_back(&loff);
- if (loff.height == MAXCOL)
+ if (loff.height == MAXCOL) {
used = MAXCOL;
- else
+ } else {
used += loff.height;
- if (used > curwin->w_height)
+ }
+ if (used > curwin->w_grid.Rows) {
break;
+ }
if (loff.lnum >= curwin->w_botline
&& (loff.lnum > curwin->w_botline
|| loff.fill <= fill_below_window)
@@ -1503,8 +1539,9 @@ void scroll_cursor_bot(int min_scroll, int set_topbot)
/* Add one line below */
botline_forw(&boff);
used += boff.height;
- if (used > curwin->w_height)
+ if (used > curwin->w_grid.Rows) {
break;
+ }
if (extra < (
mouse_dragging > 0 ? mouse_dragging - 1 :
p_so) || scrolled < min_scroll) {
@@ -1525,14 +1562,14 @@ void scroll_cursor_bot(int min_scroll, int set_topbot)
}
linenr_T line_count;
- /* curwin->w_empty_rows is larger, no need to scroll */
- if (scrolled <= 0)
+ // curwin->w_empty_rows is larger, no need to scroll
+ if (scrolled <= 0) {
line_count = 0;
- /* more than a screenfull, don't scroll but redraw */
- else if (used > curwin->w_height)
+ // more than a screenfull, don't scroll but redraw
+ } else if (used > curwin->w_grid.Rows) {
line_count = used;
- /* scroll minimal number of lines */
- else {
+ // scroll minimal number of lines
+ } else {
line_count = 0;
boff.fill = curwin->w_topfill;
boff.lnum = curwin->w_topline - 1;
@@ -1550,10 +1587,11 @@ void scroll_cursor_bot(int min_scroll, int set_topbot)
* Scroll up if the cursor is off the bottom of the screen a bit.
* Otherwise put it at 1/2 of the screen.
*/
- if (line_count >= curwin->w_height && line_count > min_scroll)
+ if (line_count >= curwin->w_grid.Rows && line_count > min_scroll) {
scroll_cursor_halfway(false);
- else
+ } else {
scrollup(line_count, true);
+ }
/*
* If topline didn't change we need to restore w_botline and w_empty_rows
@@ -1592,8 +1630,9 @@ void scroll_cursor_halfway(int atend)
if (boff.lnum < curbuf->b_ml.ml_line_count) {
botline_forw(&boff);
used += boff.height;
- if (used > curwin->w_height)
+ if (used > curwin->w_grid.Rows) {
break;
+ }
below += boff.height;
} else {
++below; /* count a "~" line */
@@ -1608,8 +1647,9 @@ void scroll_cursor_halfway(int atend)
used = MAXCOL;
else
used += loff.height;
- if (used > curwin->w_height)
+ if (used > curwin->w_grid.Rows) {
break;
+ }
above += loff.height;
topline = loff.lnum;
topfill = loff.fill;
@@ -1618,8 +1658,9 @@ void scroll_cursor_halfway(int atend)
if (!hasFolding(topline, &curwin->w_topline, NULL))
curwin->w_topline = topline;
curwin->w_topfill = topfill;
- if (old_topline > curwin->w_topline + curwin->w_height)
+ if (old_topline > curwin->w_topline + curwin->w_grid.Rows) {
curwin->w_botfill = false;
+ }
check_topfill(curwin, false);
curwin->w_valid &= ~(VALID_WROW|VALID_CROW|VALID_BOTLINE|VALID_BOTLINE_AP);
curwin->w_valid |= VALID_TOPLINE;
@@ -1646,18 +1687,20 @@ void cursor_correct(void)
}
if (curwin->w_topline == 1) {
above_wanted = 0;
- int max_off = curwin->w_height / 2;
- if (below_wanted > max_off)
+ int max_off = curwin->w_grid.Rows / 2;
+ if (below_wanted > max_off) {
below_wanted = max_off;
+ }
}
validate_botline();
if (curwin->w_botline == curbuf->b_ml.ml_line_count + 1
&& mouse_dragging == 0
) {
below_wanted = 0;
- int max_off = (curwin->w_height - 1) / 2;
- if (above_wanted > max_off)
+ int max_off = (curwin->w_grid.Rows - 1) / 2;
+ if (above_wanted > max_off) {
above_wanted = max_off;
+ }
}
/*
@@ -1727,7 +1770,7 @@ void cursor_correct(void)
*
* return FAIL for failure, OK otherwise
*/
-int onepage(int dir, long count)
+int onepage(Direction dir, long count)
{
long n;
int retval = OK;
@@ -1761,7 +1804,7 @@ int onepage(int dir, long count)
loff.fill = 0;
if (dir == FORWARD) {
- if (firstwin == lastwin && p_window > 0 && p_window < Rows - 1) {
+ if (ONE_WINDOW && p_window > 0 && p_window < Rows - 1) {
/* Vi compatible scrolling */
if (p_window <= 2)
++curwin->w_topline;
@@ -1795,7 +1838,7 @@ int onepage(int dir, long count)
max_topfill();
continue;
}
- if (firstwin == lastwin && p_window > 0 && p_window < Rows - 1) {
+ if (ONE_WINDOW && p_window > 0 && p_window < Rows - 1) {
/* Vi compatible scrolling (sort of) */
if (p_window <= 2)
--curwin->w_topline;
@@ -1828,7 +1871,7 @@ int onepage(int dir, long count)
/* Find the line just above the new topline to get the right line
* at the bottom of the window. */
n = 0;
- while (n <= curwin->w_height && loff.lnum >= 1) {
+ while (n <= curwin->w_grid.Rows && loff.lnum >= 1) {
topline_back(&loff);
if (loff.height == MAXCOL)
n = MAXCOL;
@@ -1879,20 +1922,24 @@ int onepage(int dir, long count)
}
foldAdjustCursor();
cursor_correct();
- if (retval == OK)
+ check_cursor_col();
+ if (retval == OK) {
beginline(BL_SOL | BL_FIX);
+ }
curwin->w_valid &= ~(VALID_WCOL|VALID_WROW|VALID_VIRTCOL);
- /*
- * Avoid the screen jumping up and down when 'scrolloff' is non-zero.
- * But make sure we scroll at least one line (happens with mix of long
- * wrapping lines and non-wrapping line).
- */
- if (retval == OK && dir == FORWARD && check_top_offset()) {
- scroll_cursor_top(1, false);
- if (curwin->w_topline <= old_topline
- && old_topline < curbuf->b_ml.ml_line_count) {
- curwin->w_topline = old_topline + 1;
+ if (retval == OK && dir == FORWARD) {
+ // Avoid the screen jumping up and down when 'scrolloff' is non-zero.
+ // But make sure we scroll at least one line (happens with mix of long
+ // wrapping lines and non-wrapping line).
+ if (check_top_offset()) {
+ scroll_cursor_top(1, false);
+ if (curwin->w_topline <= old_topline
+ && old_topline < curbuf->b_ml.ml_line_count) {
+ curwin->w_topline = old_topline + 1;
+ (void)hasFolding(curwin->w_topline, &curwin->w_topline, NULL);
+ }
+ } else if (curwin->w_botline > curbuf->b_ml.ml_line_count) {
(void)hasFolding(curwin->w_topline, &curwin->w_topline, NULL);
}
}
@@ -1915,7 +1962,7 @@ int onepage(int dir, long count)
*/
static void get_scroll_overlap(lineoff_T *lp, int dir)
{
- int min_height = curwin->w_height - 2;
+ int min_height = curwin->w_grid.Rows - 2;
if (lp->fill > 0)
lp->height = 1;
@@ -1969,13 +2016,15 @@ void halfpage(bool flag, linenr_T Prenum)
long scrolled = 0;
int i;
- if (Prenum)
- curwin->w_p_scr = (Prenum > curwin->w_height) ?
- curwin->w_height : Prenum;
+ if (Prenum) {
+ curwin->w_p_scr = (Prenum > curwin->w_grid.Rows) ? curwin->w_grid.Rows
+ : Prenum;
+ }
assert(curwin->w_p_scr <= INT_MAX);
- int n = curwin->w_p_scr <= curwin->w_height ? (int)curwin->w_p_scr
- : curwin->w_height;
+ int n = curwin->w_p_scr <= curwin->w_grid.Rows ? (int)curwin->w_p_scr
+ : curwin->w_grid.Rows;
+ update_topline();
validate_botline();
int room = curwin->w_empty_rows + curwin->w_filler_rows;
if (flag) {
@@ -1985,9 +2034,8 @@ void halfpage(bool flag, linenr_T Prenum)
while (n > 0 && curwin->w_botline <= curbuf->b_ml.ml_line_count) {
if (curwin->w_topfill > 0) {
i = 1;
- if (--n < 0 && scrolled > 0)
- break;
- --curwin->w_topfill;
+ n--;
+ curwin->w_topfill--;
} else {
i = plines_nofill(curwin->w_topline);
n -= i;
@@ -2063,9 +2111,8 @@ void halfpage(bool flag, linenr_T Prenum)
while (n > 0 && curwin->w_topline > 1) {
if (curwin->w_topfill < diff_check_fill(curwin, curwin->w_topline)) {
i = 1;
- if (--n < 0 && scrolled > 0)
- break;
- ++curwin->w_topfill;
+ n--;
+ curwin->w_topfill++;
} else {
i = plines_nofill(curwin->w_topline - 1);
n -= i;
@@ -2138,18 +2185,17 @@ void do_check_cursorbind(void)
* loop through the cursorbound windows
*/
VIsual_select = VIsual_active = 0;
- for (curwin = firstwin; curwin; curwin = curwin->w_next) {
+ FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
+ curwin = wp;
curbuf = curwin->w_buffer;
/* skip original window and windows with 'noscrollbind' */
if (curwin != old_curwin && curwin->w_p_crb) {
- if (curwin->w_p_diff)
- curwin->w_cursor.lnum
- = diff_get_corresponding_line(old_curbuf,
- line,
- curbuf,
- curwin->w_cursor.lnum);
- else
+ if (curwin->w_p_diff) {
+ curwin->w_cursor.lnum =
+ diff_get_corresponding_line(old_curbuf, line);
+ } else {
curwin->w_cursor.lnum = line;
+ }
curwin->w_cursor.col = col;
curwin->w_cursor.coladd = coladd;
curwin->w_curswant = curswant;
@@ -2161,16 +2207,19 @@ void do_check_cursorbind(void)
int restart_edit_save = restart_edit;
restart_edit = true;
check_cursor();
+ if (win_cursorline_standout(curwin) || curwin->w_p_cuc) {
+ validate_cursor();
+ }
restart_edit = restart_edit_save;
}
- /* Correct cursor for multi-byte character. */
- if (has_mbyte)
- mb_adjust_cursor();
+ // Correct cursor for multi-byte character.
+ mb_adjust_cursor();
redraw_later(VALID);
- /* Only scroll when 'scrollbind' hasn't done this. */
- if (!curwin->w_p_scb)
+ // Only scroll when 'scrollbind' hasn't done this.
+ if (!curwin->w_p_scb) {
update_topline();
+ }
curwin->w_redr_status = true;
}
}
diff --git a/src/nvim/move.h b/src/nvim/move.h
index 3f3bf70929..3670dc9086 100644
--- a/src/nvim/move.h
+++ b/src/nvim/move.h
@@ -2,6 +2,7 @@
#define NVIM_MOVE_H
#include <stdbool.h>
+#include "nvim/vim.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "move.h.generated.h"
diff --git a/src/nvim/msgpack_rpc/channel.c b/src/nvim/msgpack_rpc/channel.c
index 5b249ee1c7..76fbe407c2 100644
--- a/src/nvim/msgpack_rpc/channel.c
+++ b/src/nvim/msgpack_rpc/channel.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <stdbool.h>
#include <string.h>
#include <inttypes.h>
@@ -8,6 +11,7 @@
#include "nvim/api/private/helpers.h"
#include "nvim/api/vim.h"
#include "nvim/api/ui.h"
+#include "nvim/channel.h"
#include "nvim/msgpack_rpc/channel.h"
#include "nvim/event/loop.h"
#include "nvim/event/libuv_process.h"
@@ -19,68 +23,20 @@
#include "nvim/main.h"
#include "nvim/ascii.h"
#include "nvim/memory.h"
+#include "nvim/eval.h"
#include "nvim/os_unix.h"
#include "nvim/message.h"
#include "nvim/map.h"
#include "nvim/log.h"
#include "nvim/misc1.h"
#include "nvim/lib/kvec.h"
-
-#define CHANNEL_BUFFER_SIZE 0xffff
+#include "nvim/os/input.h"
#if MIN_LOG_LEVEL > DEBUG_LOG_LEVEL
#define log_client_msg(...)
#define log_server_msg(...)
#endif
-typedef enum {
- kChannelTypeSocket,
- kChannelTypeProc,
- kChannelTypeStdio
-} ChannelType;
-
-typedef struct {
- uint64_t request_id;
- bool returned, errored;
- Object result;
-} ChannelCallFrame;
-
-typedef struct {
- uint64_t id;
- size_t refcount;
- size_t pending_requests;
- PMap(cstr_t) *subscribed_events;
- bool closed;
- ChannelType type;
- msgpack_unpacker *unpacker;
- union {
- Stream stream;
- struct {
- LibuvProcess uvproc;
- Stream in;
- Stream out;
- Stream err;
- } process;
- struct {
- Stream in;
- Stream out;
- } std;
- } data;
- uint64_t next_request_id;
- kvec_t(ChannelCallFrame *) call_stack;
- kvec_t(WBuffer *) delayed_notifications;
- Queue *events;
-} Channel;
-
-typedef struct {
- Channel *channel;
- MsgpackRpcRequestHandler handler;
- Array args;
- uint64_t request_id;
-} RequestEvent;
-
-static uint64_t next_id = 1;
-static PMap(uint64_t) *channels = NULL;
static PMap(cstr_t) *event_strings = NULL;
static msgpack_sbuffer out_buffer;
@@ -88,104 +44,65 @@ static msgpack_sbuffer out_buffer;
# include "msgpack_rpc/channel.c.generated.h"
#endif
-/// Initializes the module
-void channel_init(void)
+void rpc_init(void)
{
- channels = pmap_new(uint64_t)();
+ ch_before_blocking_events = multiqueue_new_child(main_loop.events);
event_strings = pmap_new(cstr_t)();
msgpack_sbuffer_init(&out_buffer);
- remote_ui_init();
}
-/// Teardown the module
-void channel_teardown(void)
+
+void rpc_start(Channel *channel)
{
- if (!channels) {
- return;
- }
+ channel_incref(channel);
+ channel->is_rpc = true;
+ RpcState *rpc = &channel->rpc;
+ rpc->closed = false;
+ rpc->unpacker = msgpack_unpacker_new(MSGPACK_UNPACKER_INIT_BUFFER_SIZE);
+ rpc->subscribed_events = pmap_new(cstr_t)();
+ rpc->next_request_id = 1;
+ rpc->info = (Dictionary)ARRAY_DICT_INIT;
+ kv_init(rpc->call_stack);
- Channel *channel;
+ if (channel->streamtype != kChannelStreamInternal) {
+ Stream *out = channel_outstream(channel);
+#if MIN_LOG_LEVEL <= DEBUG_LOG_LEVEL
+ Stream *in = channel_instream(channel);
+ DLOG("rpc ch %" PRIu64 " in-stream=%p out-stream=%p", channel->id, in, out);
+#endif
- map_foreach_value(channels, channel, {
- close_channel(channel);
- });
+ rstream_start(out, receive_msgpack, channel);
+ }
}
-/// Creates an API channel by starting a process and connecting to its
-/// stdin/stdout. stderr is forwarded to the editor error stream.
-///
-/// @param argv The argument vector for the process. [consumed]
-/// @return The channel id (> 0), on success.
-/// 0, on error.
-uint64_t channel_from_process(char **argv)
-{
- Channel *channel = register_channel(kChannelTypeProc);
- channel->data.process.uvproc = libuv_process_init(&main_loop, channel);
- Process *proc = &channel->data.process.uvproc.process;
- proc->argv = argv;
- proc->in = &channel->data.process.in;
- proc->out = &channel->data.process.out;
- proc->err = &channel->data.process.err;
- proc->cb = process_exit;
- if (!process_spawn(proc)) {
- loop_poll_events(&main_loop, 0);
- decref(channel);
- return 0;
- }
-
- incref(channel); // process channels are only closed by the exit_cb
- wstream_init(proc->in, 0);
- rstream_init(proc->out, 0);
- rstream_start(proc->out, parse_msgpack);
- rstream_init(proc->err, 0);
- rstream_start(proc->err, forward_stderr);
-
- return channel->id;
-}
-
-/// Creates an API channel from a tcp/pipe socket connection
-///
-/// @param watcher The SocketWatcher ready to accept the connection
-void channel_from_connection(SocketWatcher *watcher)
+
+static Channel *find_rpc_channel(uint64_t id)
{
- Channel *channel = register_channel(kChannelTypeSocket);
- socket_watcher_accept(watcher, &channel->data.stream, channel);
- incref(channel); // close channel only after the stream is closed
- channel->data.stream.internal_close_cb = close_cb;
- channel->data.stream.internal_data = channel;
- wstream_init(&channel->data.stream, 0);
- rstream_init(&channel->data.stream, CHANNEL_BUFFER_SIZE);
- rstream_start(&channel->data.stream, parse_msgpack);
+ Channel *chan = find_channel(id);
+ if (!chan || !chan->is_rpc || chan->rpc.closed) {
+ return NULL;
+ }
+ return chan;
}
-/// Sends event/arguments to channel
+/// Publishes an event to a channel.
///
-/// @param id The channel id. If 0, the event will be sent to all
-/// channels that have subscribed to the event type
-/// @param name The event name, an arbitrary string
-/// @param args Array with event arguments
+/// @param id Channel id. 0 means "broadcast to all subscribed channels"
+/// @param name Event name (application-defined)
+/// @param args Array of event arguments
/// @return True if the event was sent successfully, false otherwise.
-bool channel_send_event(uint64_t id, char *name, Array args)
+bool rpc_send_event(uint64_t id, const char *name, Array args)
{
Channel *channel = NULL;
- if (id && (!(channel = pmap_get(uint64_t)(channels, id))
- || channel->closed)) {
+ if (id && (!(channel = find_rpc_channel(id)))) {
api_free_array(args);
return false;
}
if (channel) {
- if (channel->pending_requests) {
- // Pending request, queue the notification for later sending.
- String method = cstr_as_string(name);
- WBuffer *buffer = serialize_request(id, 0, method, args, &out_buffer, 1);
- kv_push(channel->delayed_notifications, buffer);
- } else {
- send_event(channel, name, args);
- }
+ send_event(channel, name, args);
} else {
- // TODO(tarruda): Implement event broadcasting in vimscript
broadcast_event(name, args);
}
@@ -199,35 +116,35 @@ bool channel_send_event(uint64_t id, char *name, Array args)
/// @param args Array with method arguments
/// @param[out] error True if the return value is an error
/// @return Whatever the remote method returned
-Object channel_send_call(uint64_t id,
- char *method_name,
- Array args,
- Error *err)
+Object rpc_send_call(uint64_t id,
+ const char *method_name,
+ Array args,
+ Error *err)
{
Channel *channel = NULL;
- if (!(channel = pmap_get(uint64_t)(channels, id)) || channel->closed) {
- api_set_error(err, Exception, _("Invalid channel \"%" PRIu64 "\""), id);
+ if (!(channel = find_rpc_channel(id))) {
+ api_set_error(err, kErrorTypeException, "Invalid channel: %" PRIu64, id);
api_free_array(args);
return NIL;
}
- incref(channel);
- uint64_t request_id = channel->next_request_id++;
+ channel_incref(channel);
+ RpcState *rpc = &channel->rpc;
+ uint64_t request_id = rpc->next_request_id++;
// Send the msgpack-rpc request
send_request(channel, request_id, method_name, args);
// Push the frame
ChannelCallFrame frame = { request_id, false, false, NIL };
- kv_push(channel->call_stack, &frame);
- channel->pending_requests++;
+ kv_push(rpc->call_stack, &frame);
LOOP_PROCESS_EVENTS_UNTIL(&main_loop, channel->events, -1, frame.returned);
- (void)kv_pop(channel->call_stack);
- channel->pending_requests--;
+ (void)kv_pop(rpc->call_stack);
if (frame.errored) {
if (frame.result.type == kObjectTypeString) {
- api_set_error(err, Exception, "%s", frame.result.data.string.data);
+ api_set_error(err, kErrorTypeException, "%s",
+ frame.result.data.string.data);
} else if (frame.result.type == kObjectTypeArray) {
// Should be an error in the form [type, message]
Array array = frame.result.data.array;
@@ -235,24 +152,19 @@ Object channel_send_call(uint64_t id,
&& (array.items[0].data.integer == kErrorTypeException
|| array.items[0].data.integer == kErrorTypeValidation)
&& array.items[1].type == kObjectTypeString) {
- err->type = (ErrorType) array.items[0].data.integer;
- xstrlcpy(err->msg, array.items[1].data.string.data, sizeof(err->msg));
- err->set = true;
+ api_set_error(err, (ErrorType)array.items[0].data.integer, "%s",
+ array.items[1].data.string.data);
} else {
- api_set_error(err, Exception, "%s", "unknown error");
+ api_set_error(err, kErrorTypeException, "%s", "unknown error");
}
} else {
- api_set_error(err, Exception, "%s", "unknown error");
+ api_set_error(err, kErrorTypeException, "%s", "unknown error");
}
api_free_object(frame.result);
}
- if (!channel->pending_requests) {
- send_delayed_notifications(channel);
- }
-
- decref(channel);
+ channel_decref(channel);
return frame.errored ? NIL : frame.result;
}
@@ -261,11 +173,11 @@ Object channel_send_call(uint64_t id,
///
/// @param id The channel id
/// @param event The event type string
-void channel_subscribe(uint64_t id, char *event)
+void rpc_subscribe(uint64_t id, char *event)
{
Channel *channel;
- if (!(channel = pmap_get(uint64_t)(channels, id)) || channel->closed) {
+ if (!(channel = find_rpc_channel(id))) {
abort();
}
@@ -276,99 +188,63 @@ void channel_subscribe(uint64_t id, char *event)
pmap_put(cstr_t)(event_strings, event_string, event_string);
}
- pmap_put(cstr_t)(channel->subscribed_events, event_string, event_string);
+ pmap_put(cstr_t)(channel->rpc.subscribed_events, event_string, event_string);
}
/// Unsubscribes to event broadcasts
///
/// @param id The channel id
/// @param event The event type string
-void channel_unsubscribe(uint64_t id, char *event)
+void rpc_unsubscribe(uint64_t id, char *event)
{
Channel *channel;
- if (!(channel = pmap_get(uint64_t)(channels, id)) || channel->closed) {
+ if (!(channel = find_rpc_channel(id))) {
abort();
}
unsubscribe(channel, event);
}
-/// Closes a channel
-///
-/// @param id The channel id
-/// @return true if successful, false otherwise
-bool channel_close(uint64_t id)
-{
- Channel *channel;
-
- if (!(channel = pmap_get(uint64_t)(channels, id)) || channel->closed) {
- return false;
- }
-
- close_channel(channel);
- return true;
-}
-
-/// Creates an API channel from stdin/stdout. This is used when embedding
-/// Neovim
-void channel_from_stdio(void)
-{
- Channel *channel = register_channel(kChannelTypeStdio);
- incref(channel); // stdio channels are only closed on exit
- // read stream
- rstream_init_fd(&main_loop, &channel->data.std.in, 0, CHANNEL_BUFFER_SIZE,
- channel);
- rstream_start(&channel->data.std.in, parse_msgpack);
- // write stream
- wstream_init_fd(&main_loop, &channel->data.std.out, 1, 0, NULL);
-}
-
-static void forward_stderr(Stream *stream, RBuffer *rbuf, size_t count,
- void *data, bool eof)
-{
- while (rbuffer_size(rbuf)) {
- char buf[256];
- size_t read = rbuffer_read(rbuf, buf, sizeof(buf) - 1);
- buf[read] = NUL;
- ELOG("Channel %" PRIu64 " stderr: %s", ((Channel *)data)->id, buf);
- }
-}
-
-static void process_exit(Process *proc, int status, void *data)
-{
- decref(data);
-}
-
-static void parse_msgpack(Stream *stream, RBuffer *rbuf, size_t c, void *data,
- bool eof)
+static void receive_msgpack(Stream *stream, RBuffer *rbuf, size_t c,
+ void *data, bool eof)
{
Channel *channel = data;
- incref(channel);
+ channel_incref(channel);
if (eof) {
- close_channel(channel);
- call_set_error(channel, "Channel was closed by the client");
+ channel_close(channel->id, kChannelPartRpc, NULL);
+ char buf[256];
+ snprintf(buf, sizeof(buf), "ch %" PRIu64 " was closed by the client",
+ channel->id);
+ call_set_error(channel, buf, WARN_LOG_LEVEL);
goto end;
}
size_t count = rbuffer_size(rbuf);
- DLOG("Feeding the msgpack parser with %u bytes of data from Stream(%p)",
- count,
- stream);
+ DLOG("ch %" PRIu64 ": parsing %zu bytes from msgpack Stream: %p",
+ channel->id, count, stream);
// Feed the unpacker with data
- msgpack_unpacker_reserve_buffer(channel->unpacker, count);
- rbuffer_read(rbuf, msgpack_unpacker_buffer(channel->unpacker), count);
- msgpack_unpacker_buffer_consumed(channel->unpacker, count);
+ msgpack_unpacker_reserve_buffer(channel->rpc.unpacker, count);
+ rbuffer_read(rbuf, msgpack_unpacker_buffer(channel->rpc.unpacker), count);
+ msgpack_unpacker_buffer_consumed(channel->rpc.unpacker, count);
+
+ parse_msgpack(channel);
+
+end:
+ channel_decref(channel);
+}
+static void parse_msgpack(Channel *channel)
+{
msgpack_unpacked unpacked;
msgpack_unpacked_init(&unpacked);
msgpack_unpack_return result;
// Deserialize everything we can.
- while ((result = msgpack_unpacker_next(channel->unpacker, &unpacked)) ==
- MSGPACK_UNPACK_SUCCESS) {
+ while ((result = msgpack_unpacker_next(channel->rpc.unpacker, &unpacked)) ==
+ MSGPACK_UNPACK_SUCCESS) {
bool is_response = is_rpc_response(&unpacked.data);
log_client_msg(channel->id, !is_response, unpacked.data);
@@ -377,17 +253,15 @@ static void parse_msgpack(Stream *stream, RBuffer *rbuf, size_t c, void *data,
complete_call(&unpacked.data, channel);
} else {
char buf[256];
- snprintf(buf,
- sizeof(buf),
- "Channel %" PRIu64 " returned a response that doesn't have "
- "a matching request id. Ensure the client is properly "
- "synchronized",
+ snprintf(buf, sizeof(buf),
+ "ch %" PRIu64 " returned a response with an unknown request "
+ "id. Ensure the client is properly synchronized",
channel->id);
- call_set_error(channel, buf);
+ call_set_error(channel, buf, ERROR_LOG_LEVEL);
}
msgpack_unpacked_destroy(&unpacked);
// Bail out from this event loop iteration
- goto end;
+ return;
}
handle_request(channel, &unpacked.data);
@@ -396,7 +270,7 @@ static void parse_msgpack(Stream *stream, RBuffer *rbuf, size_t c, void *data,
if (result == MSGPACK_UNPACK_NOMEM_ERROR) {
mch_errmsg(e_outofmem);
mch_errmsg("\n");
- decref(channel);
+ channel_decref(channel);
preserve_exit();
}
@@ -405,15 +279,12 @@ static void parse_msgpack(Stream *stream, RBuffer *rbuf, size_t c, void *data,
// causes for this error(search for 'goto _failed')
//
// A not so uncommon cause for this might be deserializing objects with
- // a high nesting level: msgpack will break when it's internal parse stack
- // size exceeds MSGPACK_EMBED_STACK_SIZE(defined as 32 by default)
+ // a high nesting level: msgpack will break when its internal parse stack
+ // size exceeds MSGPACK_EMBED_STACK_SIZE (defined as 32 by default)
send_error(channel, 0, "Invalid msgpack payload. "
"This error can also happen when deserializing "
"an object with high level of nesting");
}
-
-end:
- decref(channel);
}
static void handle_request(Channel *channel, msgpack_object *request)
@@ -423,7 +294,7 @@ static void handle_request(Channel *channel, msgpack_object *request)
Error error = ERROR_INIT;
msgpack_rpc_validate(&request_id, request, &error);
- if (error.set) {
+ if (ERROR_SET(&error)) {
// Validation failed, send response with error
if (channel_write(channel,
serialize_response(channel->id,
@@ -433,41 +304,53 @@ static void handle_request(Channel *channel, msgpack_object *request)
&out_buffer))) {
char buf[256];
snprintf(buf, sizeof(buf),
- "Channel %" PRIu64 " sent an invalid message, closed.",
+ "ch %" PRIu64 " sent an invalid message, closed.",
channel->id);
- call_set_error(channel, buf);
+ call_set_error(channel, buf, ERROR_LOG_LEVEL);
}
+ api_clear_error(&error);
return;
}
- // Retrieve the request handler
MsgpackRpcRequestHandler handler;
msgpack_object *method = msgpack_rpc_method(request);
+ handler = msgpack_rpc_get_handler_for(method->via.bin.ptr,
+ method->via.bin.size,
+ &error);
- if (method) {
- handler = msgpack_rpc_get_handler_for(method->via.bin.ptr,
- method->via.bin.size);
- } else {
- handler.fn = msgpack_rpc_handle_missing_method;
- handler.async = true;
+ // check method arguments
+ Array args = ARRAY_DICT_INIT;
+ if (!ERROR_SET(&error)
+ && !msgpack_rpc_to_array(msgpack_rpc_args(request), &args)) {
+ api_set_error(&error, kErrorTypeException, "Invalid method arguments");
}
- Array args = ARRAY_DICT_INIT;
- if (!msgpack_rpc_to_array(msgpack_rpc_args(request), &args)) {
- handler.fn = msgpack_rpc_handle_invalid_arguments;
- handler.async = true;
+ if (ERROR_SET(&error)) {
+ send_error(channel, request_id, error.msg);
+ api_clear_error(&error);
+ api_free_array(args);
+ return;
}
- RequestEvent *event_data = xmalloc(sizeof(RequestEvent));
- event_data->channel = channel;
- event_data->handler = handler;
- event_data->args = args;
- event_data->request_id = request_id;
- incref(channel);
+ RequestEvent *evdata = xmalloc(sizeof(RequestEvent));
+ evdata->channel = channel;
+ evdata->handler = handler;
+ evdata->args = args;
+ evdata->request_id = request_id;
+ channel_incref(channel);
if (handler.async) {
- on_request_event((void **)&event_data);
+ bool is_get_mode = handler.fn == handle_nvim_get_mode;
+
+ if (is_get_mode && !input_blocking()) {
+ // Defer the event to a special queue used by os/input.c. #6247
+ multiqueue_put(ch_before_blocking_events, on_request_event, 1, evdata);
+ } else {
+ // Invoke immediately.
+ on_request_event((void **)&evdata);
+ }
} else {
- queue_put(channel->events, on_request_event, 1, event_data);
+ multiqueue_put(channel->events, on_request_event, 1, evdata);
+ DLOG("RPC: scheduled %.*s", method->via.bin.size, method->via.bin.ptr);
}
}
@@ -479,7 +362,7 @@ static void on_request_event(void **argv)
Array args = e->args;
uint64_t request_id = e->request_id;
Error error = ERROR_INIT;
- Object result = handler.fn(channel->id, request_id, args, &error);
+ Object result = handler.fn(channel->id, args, &error);
if (request_id != NO_RESPONSE) {
// send the response
msgpack_packer response;
@@ -492,66 +375,79 @@ static void on_request_event(void **argv)
} else {
api_free_object(result);
}
- // All arguments were freed already, but we still need to free the array
- xfree(args.items);
- decref(channel);
+ api_free_array(args);
+ channel_decref(channel);
xfree(e);
+ api_clear_error(&error);
}
static bool channel_write(Channel *channel, WBuffer *buffer)
{
bool success;
- if (channel->closed) {
+ if (channel->rpc.closed) {
wstream_release_wbuffer(buffer);
return false;
}
- switch (channel->type) {
- case kChannelTypeSocket:
- success = wstream_write(&channel->data.stream, buffer);
- break;
- case kChannelTypeProc:
- success = wstream_write(&channel->data.process.in, buffer);
- break;
- case kChannelTypeStdio:
- success = wstream_write(&channel->data.std.out, buffer);
- break;
- default:
- abort();
+ if (channel->streamtype == kChannelStreamInternal) {
+ channel_incref(channel);
+ CREATE_EVENT(channel->events, internal_read_event, 2, channel, buffer);
+ success = true;
+ } else {
+ Stream *in = channel_instream(channel);
+ success = wstream_write(in, buffer);
}
+
if (!success) {
// If the write failed for any reason, close the channel
char buf[256];
snprintf(buf,
sizeof(buf),
- "Before returning from a RPC call, channel %" PRIu64 " was "
- "closed due to a failed write",
+ "ch %" PRIu64 ": stream write failed. "
+ "RPC canceled; closing channel",
channel->id);
- call_set_error(channel, buf);
+ call_set_error(channel, buf, ERROR_LOG_LEVEL);
}
return success;
}
+static void internal_read_event(void **argv)
+{
+ Channel *channel = argv[0];
+ WBuffer *buffer = argv[1];
+
+ msgpack_unpacker_reserve_buffer(channel->rpc.unpacker, buffer->size);
+ memcpy(msgpack_unpacker_buffer(channel->rpc.unpacker),
+ buffer->data, buffer->size);
+ msgpack_unpacker_buffer_consumed(channel->rpc.unpacker, buffer->size);
+
+ parse_msgpack(channel);
+
+ channel_decref(channel);
+ wstream_release_wbuffer(buffer);
+}
+
static void send_error(Channel *channel, uint64_t id, char *err)
{
Error e = ERROR_INIT;
- api_set_error(&e, Exception, "%s", err);
+ api_set_error(&e, kErrorTypeException, "%s", err);
channel_write(channel, serialize_response(channel->id,
id,
&e,
NIL,
&out_buffer));
+ api_clear_error(&e);
}
static void send_request(Channel *channel,
uint64_t id,
- char *name,
+ const char *name,
Array args)
{
- String method = {.size = strlen(name), .data = name};
+ const String method = cstr_as_string((char *)name);
channel_write(channel, serialize_request(channel->id,
id,
method,
@@ -561,10 +457,10 @@ static void send_request(Channel *channel,
}
static void send_event(Channel *channel,
- char *name,
+ const char *name,
Array args)
{
- String method = {.size = strlen(name), .data = name};
+ const String method = cstr_as_string((char *)name);
channel_write(channel, serialize_request(channel->id,
0,
method,
@@ -573,13 +469,14 @@ static void send_event(Channel *channel,
1));
}
-static void broadcast_event(char *name, Array args)
+static void broadcast_event(const char *name, Array args)
{
kvec_t(Channel *) subscribed = KV_INITIAL_VALUE;
Channel *channel;
map_foreach_value(channels, channel, {
- if (pmap_has(cstr_t)(channel->subscribed_events, name)) {
+ if (channel->is_rpc
+ && pmap_has(cstr_t)(channel->rpc.subscribed_events, name)) {
kv_push(subscribed, channel);
}
});
@@ -589,7 +486,7 @@ static void broadcast_event(char *name, Array args)
goto end;
}
- String method = {.size = strlen(name), .data = name};
+ const String method = cstr_as_string((char *)name);
WBuffer *buffer = serialize_request(0,
0,
method,
@@ -598,12 +495,8 @@ static void broadcast_event(char *name, Array args)
kv_size(subscribed));
for (size_t i = 0; i < kv_size(subscribed); i++) {
- Channel *channel = kv_A(subscribed, i);
- if (channel->pending_requests) {
- kv_push(channel->delayed_notifications, buffer);
- } else {
- channel_write(channel, buffer);
- }
+ Channel *c = kv_A(subscribed, i);
+ channel_write(c, buffer);
}
end:
@@ -613,10 +506,16 @@ end:
static void unsubscribe(Channel *channel, char *event)
{
char *event_string = pmap_get(cstr_t)(event_strings, event);
- pmap_del(cstr_t)(channel->subscribed_events, event_string);
+ if (!event_string) {
+ WLOG("RPC: ch %" PRIu64 ": tried to unsubscribe unknown event '%s'",
+ channel->id, event);
+ return;
+ }
+ pmap_del(cstr_t)(channel->rpc.subscribed_events, event_string);
map_foreach_value(channels, channel, {
- if (pmap_has(cstr_t)(channel->subscribed_events, event_string)) {
+ if (channel->is_rpc
+ && pmap_has(cstr_t)(channel->rpc.subscribed_events, event_string)) {
return;
}
});
@@ -626,85 +525,44 @@ static void unsubscribe(Channel *channel, char *event)
xfree(event_string);
}
-/// Close the channel streams/process and free the channel resources.
-static void close_channel(Channel *channel)
+
+/// Mark rpc state as closed, and release its reference to the channel.
+/// Don't call this directly, call channel_close(id, kChannelPartRpc, &error)
+void rpc_close(Channel *channel)
{
- if (channel->closed) {
+ if (channel->rpc.closed) {
return;
}
- channel->closed = true;
+ channel->rpc.closed = true;
+ channel_decref(channel);
- switch (channel->type) {
- case kChannelTypeSocket:
- stream_close(&channel->data.stream, NULL);
- break;
- case kChannelTypeProc:
- if (!channel->data.process.uvproc.process.closed) {
- process_stop(&channel->data.process.uvproc.process);
- }
- break;
- case kChannelTypeStdio:
- stream_close(&channel->data.std.in, NULL);
- stream_close(&channel->data.std.out, NULL);
- queue_put(main_loop.fast_events, exit_event, 1, channel);
- return;
- default:
- abort();
+ if (channel->streamtype == kChannelStreamStdio) {
+ multiqueue_put(main_loop.fast_events, exit_event, 0);
}
-
- decref(channel);
}
static void exit_event(void **argv)
{
- decref(argv[0]);
-
if (!exiting) {
mch_exit(0);
}
}
-static void free_channel(Channel *channel)
+void rpc_free(Channel *channel)
{
remote_ui_disconnect(channel->id);
- pmap_del(uint64_t)(channels, channel->id);
- msgpack_unpacker_free(channel->unpacker);
+ msgpack_unpacker_free(channel->rpc.unpacker);
// Unsubscribe from all events
char *event_string;
- map_foreach_value(channel->subscribed_events, event_string, {
+ map_foreach_value(channel->rpc.subscribed_events, event_string, {
unsubscribe(channel, event_string);
});
- pmap_free(cstr_t)(channel->subscribed_events);
- kv_destroy(channel->call_stack);
- kv_destroy(channel->delayed_notifications);
- queue_free(channel->events);
- xfree(channel);
-}
-
-static void close_cb(Stream *stream, void *data)
-{
- decref(data);
-}
-
-static Channel *register_channel(ChannelType type)
-{
- Channel *rv = xmalloc(sizeof(Channel));
- rv->events = queue_new_child(main_loop.events);
- rv->type = type;
- rv->refcount = 1;
- rv->closed = false;
- rv->unpacker = msgpack_unpacker_new(MSGPACK_UNPACKER_INIT_BUFFER_SIZE);
- rv->id = next_id++;
- rv->pending_requests = 0;
- rv->subscribed_events = pmap_new(cstr_t)();
- rv->next_request_id = 1;
- kv_init(rv->call_stack);
- kv_init(rv->delayed_notifications);
- pmap_put(uint64_t)(channels, rv->id, rv);
- return rv;
+ pmap_free(cstr_t)(channel->rpc.subscribed_events);
+ kv_destroy(channel->rpc.call_stack);
+ api_free_dictionary(channel->rpc.info);
}
static bool is_rpc_response(msgpack_object *obj)
@@ -719,15 +577,18 @@ static bool is_rpc_response(msgpack_object *obj)
static bool is_valid_rpc_response(msgpack_object *obj, Channel *channel)
{
uint64_t response_id = obj->via.array.ptr[1].via.u64;
+ if (kv_size(channel->rpc.call_stack) == 0) {
+ return false;
+ }
+
// Must be equal to the frame at the stack's bottom
- return kv_size(channel->call_stack) && response_id
- == kv_A(channel->call_stack, kv_size(channel->call_stack) - 1)->request_id;
+ ChannelCallFrame *frame = kv_last(channel->rpc.call_stack);
+ return response_id == frame->request_id;
}
static void complete_call(msgpack_object *obj, Channel *channel)
{
- ChannelCallFrame *frame = kv_A(channel->call_stack,
- kv_size(channel->call_stack) - 1);
+ ChannelCallFrame *frame = kv_last(channel->rpc.call_stack);
frame->returned = true;
frame->errored = obj->via.array.ptr[2].type != MSGPACK_OBJECT_NIL;
@@ -738,22 +599,23 @@ static void complete_call(msgpack_object *obj, Channel *channel)
}
}
-static void call_set_error(Channel *channel, char *msg)
+static void call_set_error(Channel *channel, char *msg, int loglevel)
{
- ELOG("msgpack-rpc: %s", msg);
- for (size_t i = 0; i < kv_size(channel->call_stack); i++) {
- ChannelCallFrame *frame = kv_A(channel->call_stack, i);
+ LOG(loglevel, "RPC: %s", msg);
+ for (size_t i = 0; i < kv_size(channel->rpc.call_stack); i++) {
+ ChannelCallFrame *frame = kv_A(channel->rpc.call_stack, i);
frame->returned = true;
frame->errored = true;
+ api_free_object(frame->result);
frame->result = STRING_OBJ(cstr_to_string(msg));
}
- close_channel(channel);
+ channel_close(channel->id, kChannelPartRpc, NULL);
}
static WBuffer *serialize_request(uint64_t channel_id,
uint64_t request_id,
- String method,
+ const String method,
Array args,
msgpack_sbuffer *sbuffer,
size_t refcount)
@@ -779,7 +641,16 @@ static WBuffer *serialize_response(uint64_t channel_id,
{
msgpack_packer pac;
msgpack_packer_init(&pac, sbuffer, msgpack_sbuffer_write);
- msgpack_rpc_serialize_response(response_id, err, arg, &pac);
+ if (ERROR_SET(err) && response_id == NO_RESPONSE) {
+ Array args = ARRAY_DICT_INIT;
+ ADD(args, INTEGER_OBJ(err->type));
+ ADD(args, STRING_OBJ(cstr_to_string(err->msg)));
+ msgpack_rpc_serialize_request(0, cstr_as_string("nvim_error_event"),
+ args, &pac);
+ api_free_array(args);
+ } else {
+ msgpack_rpc_serialize_response(response_id, err, arg, &pac);
+ }
log_server_msg(channel_id, sbuffer);
WBuffer *rv = wstream_new_buffer(xmemdup(sbuffer->data, sbuffer->size),
sbuffer->size,
@@ -790,33 +661,28 @@ static WBuffer *serialize_response(uint64_t channel_id,
return rv;
}
-static void send_delayed_notifications(Channel* channel)
+void rpc_set_client_info(uint64_t id, Dictionary info)
{
- for (size_t i = 0; i < kv_size(channel->delayed_notifications); i++) {
- WBuffer *buffer = kv_A(channel->delayed_notifications, i);
- channel_write(channel, buffer);
+ Channel *chan = find_rpc_channel(id);
+ if (!chan) {
+ abort();
}
- kv_size(channel->delayed_notifications) = 0;
-}
-
-static void incref(Channel *channel)
-{
- channel->refcount++;
+ api_free_dictionary(chan->rpc.info);
+ chan->rpc.info = info;
+ channel_info_changed(chan, false);
}
-static void decref(Channel *channel)
+Dictionary rpc_client_info(Channel *chan)
{
- if (!(--channel->refcount)) {
- free_channel(channel);
- }
+ return copy_dictionary(chan->rpc.info);
}
#if MIN_LOG_LEVEL <= DEBUG_LOG_LEVEL
-#define REQ "[request] "
-#define RES "[response] "
-#define NOT "[notification] "
-#define ERR "[error] "
+#define REQ "[request] "
+#define RES "[response] "
+#define NOT "[notify] "
+#define ERR "[error] "
// Cannot define array with negative offsets, so this one is needed to be added
// to MSGPACK_UNPACK_\* values.
@@ -834,7 +700,7 @@ static void log_server_msg(uint64_t channel_id,
{
msgpack_unpacked unpacked;
msgpack_unpacked_init(&unpacked);
- DLOGN("[msgpack-rpc] nvim -> client(%" PRIu64 ") ", channel_id);
+ DLOGN("RPC ->ch %" PRIu64 ": ", channel_id);
const msgpack_unpack_return result =
msgpack_unpack_next(&unpacked, packed->data, packed->size, NULL);
switch (result) {
@@ -871,7 +737,7 @@ static void log_client_msg(uint64_t channel_id,
bool is_request,
msgpack_object msg)
{
- DLOGN("[msgpack-rpc] client(%" PRIu64 ") -> nvim ", channel_id);
+ DLOGN("RPC <-ch %" PRIu64 ": ", channel_id);
log_lock();
FILE *f = open_log_file();
fprintf(f, is_request ? REQ : RES);
@@ -887,4 +753,3 @@ static void log_msg_close(FILE *f, msgpack_object msg)
log_unlock();
}
#endif
-
diff --git a/src/nvim/msgpack_rpc/channel.h b/src/nvim/msgpack_rpc/channel.h
index 104547a7b8..9ff5abdc5f 100644
--- a/src/nvim/msgpack_rpc/channel.h
+++ b/src/nvim/msgpack_rpc/channel.h
@@ -6,10 +6,18 @@
#include "nvim/api/private/defs.h"
#include "nvim/event/socket.h"
+#include "nvim/event/process.h"
#include "nvim/vim.h"
+#include "nvim/channel.h"
#define METHOD_MAXLEN 512
+/// HACK: os/input.c drains this queue immediately before blocking for input.
+/// Events on this queue are async-safe, but they need the resolved state
+/// of os_inchar(), so they are processed "just-in-time".
+MultiQueue *ch_before_blocking_events;
+
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "msgpack_rpc/channel.h.generated.h"
#endif
diff --git a/src/nvim/msgpack_rpc/channel_defs.h b/src/nvim/msgpack_rpc/channel_defs.h
new file mode 100644
index 0000000000..bfa7f7b87c
--- /dev/null
+++ b/src/nvim/msgpack_rpc/channel_defs.h
@@ -0,0 +1,37 @@
+#ifndef NVIM_MSGPACK_RPC_CHANNEL_DEFS_H
+#define NVIM_MSGPACK_RPC_CHANNEL_DEFS_H
+
+#include <stdbool.h>
+#include <uv.h>
+#include <msgpack.h>
+
+#include "nvim/api/private/defs.h"
+#include "nvim/event/socket.h"
+#include "nvim/event/process.h"
+#include "nvim/vim.h"
+
+typedef struct Channel Channel;
+
+typedef struct {
+ uint64_t request_id;
+ bool returned, errored;
+ Object result;
+} ChannelCallFrame;
+
+typedef struct {
+ Channel *channel;
+ MsgpackRpcRequestHandler handler;
+ Array args;
+ uint64_t request_id;
+} RequestEvent;
+
+typedef struct {
+ PMap(cstr_t) *subscribed_events;
+ bool closed;
+ msgpack_unpacker *unpacker;
+ uint64_t next_request_id;
+ kvec_t(ChannelCallFrame *) call_stack;
+ Dictionary info;
+} RpcState;
+
+#endif // NVIM_MSGPACK_RPC_CHANNEL_DEFS_H
diff --git a/src/nvim/msgpack_rpc/defs.h b/src/nvim/msgpack_rpc/defs.h
deleted file mode 100644
index 5611636d4f..0000000000
--- a/src/nvim/msgpack_rpc/defs.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef NVIM_MSGPACK_RPC_DEFS_H
-#define NVIM_MSGPACK_RPC_DEFS_H
-
-
-/// The rpc_method_handlers table, used in msgpack_rpc_dispatch(), stores
-/// functions of this type.
-typedef struct {
- Object (*fn)(uint64_t channel_id,
- uint64_t request_id,
- Array args,
- Error *error);
- bool async; // function is always safe to run immediately instead of being
- // put in a request queue for handling when nvim waits for input.
-} MsgpackRpcRequestHandler;
-
-/// Initializes the msgpack-rpc method table
-void msgpack_rpc_init_method_table(void);
-
-// Add a handler to the method table
-void msgpack_rpc_add_method_handler(String method,
- MsgpackRpcRequestHandler handler);
-
-void msgpack_rpc_init_function_metadata(Dictionary *metadata);
-
-MsgpackRpcRequestHandler msgpack_rpc_get_handler_for(const char *name,
- size_t name_len)
- FUNC_ATTR_NONNULL_ARG(1);
-#endif // NVIM_MSGPACK_RPC_DEFS_H
diff --git a/src/nvim/msgpack_rpc/helpers.c b/src/nvim/msgpack_rpc/helpers.c
index 9195b10614..19cc31f6a6 100644
--- a/src/nvim/msgpack_rpc/helpers.c
+++ b/src/nvim/msgpack_rpc/helpers.c
@@ -1,12 +1,15 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <stdint.h>
#include <stdbool.h>
#include <inttypes.h>
#include <msgpack.h>
+#include "nvim/api/private/dispatch.h"
#include "nvim/api/private/helpers.h"
#include "nvim/msgpack_rpc/helpers.h"
-#include "nvim/msgpack_rpc/defs.h"
#include "nvim/lib/kvec.h"
#include "nvim/vim.h"
#include "nvim/log.h"
@@ -21,11 +24,12 @@ static msgpack_zone zone;
static msgpack_sbuffer sbuffer;
#define HANDLE_TYPE_CONVERSION_IMPL(t, lt) \
- bool msgpack_rpc_to_##lt(const msgpack_object *const obj, t *const arg) \
- FUNC_ATTR_NONNULL_ALL \
+ static bool msgpack_rpc_to_##lt(const msgpack_object *const obj, \
+ Integer *const arg) \
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT \
{ \
if (obj->type != MSGPACK_OBJECT_EXT \
- || obj->via.ext.type != kObjectType##t) { \
+ || obj->via.ext.type + EXT_OBJECT_TYPE_SHIFT != kObjectType##t) { \
return false; \
} \
\
@@ -40,17 +44,18 @@ static msgpack_sbuffer sbuffer;
return false; \
} \
\
- *arg = data.via.u64; \
+ *arg = (handle_T)data.via.i64; \
return true; \
} \
\
- void msgpack_rpc_from_##lt(t o, msgpack_packer *res) \
+ static void msgpack_rpc_from_##lt(Integer o, msgpack_packer *res) \
FUNC_ATTR_NONNULL_ARG(2) \
{ \
msgpack_packer pac; \
msgpack_packer_init(&pac, &sbuffer, msgpack_sbuffer_write); \
- msgpack_pack_uint64(&pac, o); \
- msgpack_pack_ext(res, sbuffer.size, kObjectType##t); \
+ msgpack_pack_int64(&pac, (handle_T)o); \
+ msgpack_pack_ext(res, sbuffer.size, \
+ kObjectType##t - EXT_OBJECT_TYPE_SHIFT); \
msgpack_pack_ext_body(res, sbuffer.data, sbuffer.size); \
msgpack_sbuffer_clear(&sbuffer); \
}
@@ -72,7 +77,7 @@ typedef struct {
size_t idx;
} MPToAPIObjectStackItem;
-/// Convert type used by msgpack parser to Neovim own API type
+/// Convert type used by msgpack parser to Nvim API type.
///
/// @param[in] obj Msgpack value to convert.
/// @param[out] arg Location where result of conversion will be saved.
@@ -83,7 +88,12 @@ bool msgpack_rpc_to_object(const msgpack_object *const obj, Object *const arg)
{
bool ret = true;
kvec_t(MPToAPIObjectStackItem) stack = KV_INITIAL_VALUE;
- kv_push(stack, ((MPToAPIObjectStackItem) { obj, arg, false, 0 }));
+ kv_push(stack, ((MPToAPIObjectStackItem) {
+ .mobj = obj,
+ .aobj = arg,
+ .container = false,
+ .idx = 0,
+ }));
while (ret && kv_size(stack)) {
MPToAPIObjectStackItem cur = kv_last(stack);
if (!cur.container) {
@@ -113,10 +123,16 @@ bool msgpack_rpc_to_object(const msgpack_object *const obj, Object *const arg)
}
break;
}
- case MSGPACK_OBJECT_FLOAT: {
+#ifdef NVIM_MSGPACK_HAS_FLOAT32
+ case MSGPACK_OBJECT_FLOAT32:
+ case MSGPACK_OBJECT_FLOAT64:
+#else
+ case MSGPACK_OBJECT_FLOAT:
+#endif
+ {
STATIC_ASSERT(sizeof(Float) == sizeof(cur.mobj->via.f64),
"Msgpack floating-point size does not match API integer");
- *cur.aobj = FLOATING_OBJ(cur.mobj->via.f64);
+ *cur.aobj = FLOAT_OBJ(cur.mobj->via.f64);
break;
}
#define STR_CASE(type, attr, obj, dest, conv) \
@@ -124,7 +140,7 @@ bool msgpack_rpc_to_object(const msgpack_object *const obj, Object *const arg)
dest = conv(((String) { \
.size = obj->via.attr.size, \
.data = (obj->via.attr.ptr == NULL || obj->via.attr.size == 0 \
- ? NULL \
+ ? xmemdupz("", 0) \
: xmemdupz(obj->via.attr.ptr, obj->via.attr.size)), \
})); \
break; \
@@ -180,7 +196,12 @@ bool msgpack_rpc_to_object(const msgpack_object *const obj, Object *const arg)
case MSGPACK_OBJECT_BOOLEAN:
case MSGPACK_OBJECT_POSITIVE_INTEGER:
case MSGPACK_OBJECT_NEGATIVE_INTEGER:
+#ifdef NVIM_MSGPACK_HAS_FLOAT32
+ case MSGPACK_OBJECT_FLOAT32:
+ case MSGPACK_OBJECT_FLOAT64:
+#else
case MSGPACK_OBJECT_FLOAT:
+#endif
case MSGPACK_OBJECT_EXT:
case MSGPACK_OBJECT_MAP:
case MSGPACK_OBJECT_ARRAY: {
@@ -210,20 +231,29 @@ bool msgpack_rpc_to_object(const msgpack_object *const obj, Object *const arg)
break;
}
case MSGPACK_OBJECT_EXT: {
- switch (cur.mobj->via.ext.type) {
+ switch ((ObjectType)(cur.mobj->via.ext.type + EXT_OBJECT_TYPE_SHIFT)) {
case kObjectTypeBuffer: {
cur.aobj->type = kObjectTypeBuffer;
- ret = msgpack_rpc_to_buffer(cur.mobj, &cur.aobj->data.buffer);
+ ret = msgpack_rpc_to_buffer(cur.mobj, &cur.aobj->data.integer);
break;
}
case kObjectTypeWindow: {
cur.aobj->type = kObjectTypeWindow;
- ret = msgpack_rpc_to_window(cur.mobj, &cur.aobj->data.window);
+ ret = msgpack_rpc_to_window(cur.mobj, &cur.aobj->data.integer);
break;
}
case kObjectTypeTabpage: {
cur.aobj->type = kObjectTypeTabpage;
- ret = msgpack_rpc_to_tabpage(cur.mobj, &cur.aobj->data.tabpage);
+ ret = msgpack_rpc_to_tabpage(cur.mobj, &cur.aobj->data.integer);
+ break;
+ }
+ case kObjectTypeNil:
+ case kObjectTypeBoolean:
+ case kObjectTypeInteger:
+ case kObjectTypeFloat:
+ case kObjectTypeString:
+ case kObjectTypeArray:
+ case kObjectTypeDictionary: {
break;
}
}
@@ -321,11 +351,13 @@ void msgpack_rpc_from_float(Float result, msgpack_packer *res)
msgpack_pack_double(res, result);
}
-void msgpack_rpc_from_string(String result, msgpack_packer *res)
+void msgpack_rpc_from_string(const String result, msgpack_packer *res)
FUNC_ATTR_NONNULL_ARG(2)
{
msgpack_pack_str(res, result.size);
- msgpack_pack_str_body(res, result.data, result.size);
+ if (result.size > 0) {
+ msgpack_pack_str_body(res, result.data, result.size);
+ }
}
typedef struct {
@@ -334,7 +366,7 @@ typedef struct {
size_t idx;
} APIToMPObjectStackItem;
-/// Convert type used by Neovim API to msgpack
+/// Convert type used by Nvim API to msgpack type.
///
/// @param[in] result Object to convert.
/// @param[out] res Structure that defines where conversion results are saved.
@@ -347,6 +379,9 @@ void msgpack_rpc_from_object(const Object result, msgpack_packer *const res)
kv_push(stack, ((APIToMPObjectStackItem) { &result, false, 0 }));
while (kv_size(stack)) {
APIToMPObjectStackItem cur = kv_last(stack);
+ STATIC_ASSERT(kObjectTypeWindow == kObjectTypeBuffer + 1
+ && kObjectTypeTabpage == kObjectTypeWindow + 1,
+ "Buffer, window and tabpage enum items are in order");
switch (cur.aobj->type) {
case kObjectTypeNil: {
msgpack_pack_nil(res);
@@ -369,15 +404,15 @@ void msgpack_rpc_from_object(const Object result, msgpack_packer *const res)
break;
}
case kObjectTypeBuffer: {
- msgpack_rpc_from_buffer(cur.aobj->data.buffer, res);
+ msgpack_rpc_from_buffer(cur.aobj->data.integer, res);
break;
}
case kObjectTypeWindow: {
- msgpack_rpc_from_window(cur.aobj->data.window, res);
+ msgpack_rpc_from_window(cur.aobj->data.integer, res);
break;
}
case kObjectTypeTabpage: {
- msgpack_rpc_from_tabpage(cur.aobj->data.tabpage, res);
+ msgpack_rpc_from_tabpage(cur.aobj->data.integer, res);
break;
}
case kObjectTypeArray: {
@@ -453,31 +488,9 @@ void msgpack_rpc_from_dictionary(Dictionary result, msgpack_packer *res)
}
}
-/// Handler executed when an invalid method name is passed
-Object msgpack_rpc_handle_missing_method(uint64_t channel_id,
- uint64_t request_id,
- Array args,
- Error *error)
-{
- snprintf(error->msg, sizeof(error->msg), "Invalid method name");
- error->set = true;
- return NIL;
-}
-
-/// Handler executed when malformated arguments are passed
-Object msgpack_rpc_handle_invalid_arguments(uint64_t channel_id,
- uint64_t request_id,
- Array args,
- Error *error)
-{
- snprintf(error->msg, sizeof(error->msg), "Invalid method arguments");
- error->set = true;
- return NIL;
-}
-
/// Serializes a msgpack-rpc request or notification(id == 0)
void msgpack_rpc_serialize_request(uint64_t request_id,
- String method,
+ const String method,
Array args,
msgpack_packer *pac)
FUNC_ATTR_NONNULL_ARG(4)
@@ -504,7 +517,7 @@ void msgpack_rpc_serialize_response(uint64_t response_id,
msgpack_pack_int(pac, 1);
msgpack_pack_uint64(pac, response_id);
- if (err->set) {
+ if (ERROR_SET(err)) {
// error represented by a [type, message] array
msgpack_pack_array(pac, 2);
msgpack_rpc_from_integer(err->type, pac);
@@ -557,49 +570,49 @@ void msgpack_rpc_validate(uint64_t *response_id,
*response_id = NO_RESPONSE;
// Validate the basic structure of the msgpack-rpc payload
if (req->type != MSGPACK_OBJECT_ARRAY) {
- api_set_error(err, Validation, _("Message is not an array"));
+ api_set_error(err, kErrorTypeValidation, "Message is not an array");
return;
}
if (req->via.array.size == 0) {
- api_set_error(err, Validation, _("Message is empty"));
+ api_set_error(err, kErrorTypeValidation, "Message is empty");
return;
}
if (req->via.array.ptr[0].type != MSGPACK_OBJECT_POSITIVE_INTEGER) {
- api_set_error(err, Validation, _("Message type must be an integer"));
+ api_set_error(err, kErrorTypeValidation, "Message type must be an integer");
return;
}
uint64_t type = req->via.array.ptr[0].via.u64;
if (type != kMessageTypeRequest && type != kMessageTypeNotification) {
- api_set_error(err, Validation, _("Unknown message type"));
+ api_set_error(err, kErrorTypeValidation, "Unknown message type");
return;
}
if ((type == kMessageTypeRequest && req->via.array.size != 4)
|| (type == kMessageTypeNotification && req->via.array.size != 3)) {
- api_set_error(err, Validation, _("Request array size should be 4 (request) "
- "or 3 (notification)"));
+ api_set_error(err, kErrorTypeValidation,
+ "Request array size must be 4 (request) or 3 (notification)");
return;
}
if (type == kMessageTypeRequest) {
msgpack_object *id_obj = msgpack_rpc_msg_id(req);
if (!id_obj) {
- api_set_error(err, Validation, _("ID must be a positive integer"));
+ api_set_error(err, kErrorTypeValidation, "ID must be a positive integer");
return;
}
*response_id = id_obj->via.u64;
}
if (!msgpack_rpc_method(req)) {
- api_set_error(err, Validation, _("Method must be a string"));
+ api_set_error(err, kErrorTypeValidation, "Method must be a string");
return;
}
if (!msgpack_rpc_args(req)) {
- api_set_error(err, Validation, _("Parameters must be an array"));
+ api_set_error(err, kErrorTypeValidation, "Parameters must be an array");
return;
}
}
diff --git a/src/nvim/msgpack_rpc/helpers.h b/src/nvim/msgpack_rpc/helpers.h
index 7d9f114140..0e4cd1be6d 100644
--- a/src/nvim/msgpack_rpc/helpers.h
+++ b/src/nvim/msgpack_rpc/helpers.h
@@ -9,6 +9,13 @@
#include "nvim/event/wstream.h"
#include "nvim/api/private/defs.h"
+/// Value by which objects represented as EXT type are shifted
+///
+/// Subtracted when packing, added when unpacking. Used to allow moving
+/// buffer/window/tabpage block inside ObjectType enum. This block yet cannot be
+/// split or reordered.
+#define EXT_OBJECT_TYPE_SHIFT kObjectTypeBuffer
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "msgpack_rpc/helpers.h.generated.h"
#endif
diff --git a/src/nvim/msgpack_rpc/server.c b/src/nvim/msgpack_rpc/server.c
index abbd3e8aff..e5d80aea1d 100644
--- a/src/nvim/msgpack_rpc/server.c
+++ b/src/nvim/msgpack_rpc/server.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <stdlib.h>
#include <string.h>
@@ -29,22 +32,27 @@ static garray_T watchers = GA_EMPTY_INIT_VALUE;
#endif
/// Initializes the module
-bool server_init(void)
+bool server_init(const char *listen_addr)
{
ga_init(&watchers, sizeof(SocketWatcher *), 1);
- bool must_free = false;
- const char *listen_address = os_getenv(LISTEN_ADDRESS_ENV_VAR);
- if (listen_address == NULL) {
- must_free = true;
- listen_address = server_address_new();
+ // $NVIM_LISTEN_ADDRESS
+ const char *env_addr = os_getenv(LISTEN_ADDRESS_ENV_VAR);
+ int rv = listen_addr == NULL ? 1 : server_start(listen_addr);
+
+ if (0 != rv) {
+ rv = env_addr == NULL ? 1 : server_start(env_addr);
+ if (0 != rv) {
+ listen_addr = server_address_new();
+ if (listen_addr == NULL) {
+ return false;
+ }
+ rv = server_start(listen_addr);
+ xfree((char *)listen_addr);
+ }
}
- bool ok = (server_start(listen_address) == 0);
- if (must_free) {
- xfree((char *) listen_address);
- }
- return ok;
+ return rv == 0;
}
/// Teardown a single server
@@ -90,39 +98,61 @@ char *server_address_new(void)
#endif
}
-/// Starts listening for API calls on the TCP address or pipe path `endpoint`.
+/// Check if this instance owns a pipe address.
+/// The argument must already be resolved to an absolute path!
+bool server_owns_pipe_address(const char *path)
+{
+ for (int i = 0; i < watchers.ga_len; i++) {
+ if (!strcmp(path, ((SocketWatcher **)watchers.ga_data)[i]->addr)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+/// Starts listening for API calls.
+///
/// The socket type is determined by parsing `endpoint`: If it's a valid IPv4
-/// address in 'ip[:port]' format, then it will be TCP socket. The port is
-/// optional and if omitted defaults to NVIM_DEFAULT_TCP_PORT. Otherwise it
-/// will be a unix socket or named pipe.
+/// or IPv6 address in 'ip:[port]' format, then it will be a TCP socket.
+/// Otherwise it will be a Unix socket or named pipe (Windows).
+///
+/// If no port is given, a random one will be assigned.
///
-/// @param endpoint Address of the server. Either a 'ip[:port]' string or an
-/// arbitrary identifier (trimmed to 256 bytes) for the unix socket or
-/// named pipe.
-/// @returns 0 on success, 1 on a regular error, and negative errno
-/// on failure to bind or connect.
+/// @param endpoint Address of the server. Either a 'ip:[port]' string or an
+/// arbitrary identifier (trimmed to 256 bytes) for the Unix
+/// socket or named pipe.
+/// @returns 0: success, 1: validation error, 2: already listening,
+/// -errno: failed to bind or listen.
int server_start(const char *endpoint)
{
- if (endpoint == NULL) {
- ELOG("Attempting to start server on NULL endpoint");
+ if (endpoint == NULL || endpoint[0] == '\0') {
+ WLOG("Empty or NULL endpoint");
return 1;
}
SocketWatcher *watcher = xmalloc(sizeof(SocketWatcher));
- socket_watcher_init(&main_loop, watcher, endpoint, NULL);
+
+ int result = socket_watcher_init(&main_loop, watcher, endpoint);
+ if (result < 0) {
+ xfree(watcher);
+ return result;
+ }
// Check if a watcher for the endpoint already exists
for (int i = 0; i < watchers.ga_len; i++) {
if (!strcmp(watcher->addr, ((SocketWatcher **)watchers.ga_data)[i]->addr)) {
ELOG("Already listening on %s", watcher->addr);
+ if (watcher->stream->type == UV_TCP) {
+ uv_freeaddrinfo(watcher->uv.tcp.addrinfo);
+ }
socket_watcher_close(watcher, free_server);
- return 1;
+ return 2;
}
}
- int result = socket_watcher_start(watcher, MAX_CONNECTIONS, connection_cb);
+ result = socket_watcher_start(watcher, MAX_CONNECTIONS, connection_cb);
if (result < 0) {
- ELOG("Failed to start server: %s", uv_strerror(result));
+ WLOG("Failed to start server: %s", uv_strerror(result));
socket_watcher_close(watcher, free_server);
return result;
}
@@ -148,9 +178,10 @@ int server_start(const char *endpoint)
/// Stops listening on the address specified by `endpoint`.
///
/// @param endpoint Address of the server.
-void server_stop(char *endpoint)
+bool server_stop(char *endpoint)
{
SocketWatcher *watcher;
+ bool watcher_found = false;
char addr[ADDRESS_MAX_SIZE];
// Trim to `ADDRESS_MAX_SIZE`
@@ -160,13 +191,14 @@ void server_stop(char *endpoint)
for (; i < watchers.ga_len; i++) {
watcher = ((SocketWatcher **)watchers.ga_data)[i];
if (strcmp(addr, watcher->addr) == 0) {
+ watcher_found = true;
break;
}
}
- if (i >= watchers.ga_len) {
- ELOG("Not listening on %s", addr);
- return;
+ if (!watcher_found) {
+ WLOG("Not listening on %s", addr);
+ return false;
}
// Unset $NVIM_LISTEN_ADDRESS if it is the stopped address.
@@ -188,6 +220,8 @@ void server_stop(char *endpoint)
if (STRCMP(addr, get_vim_var_str(VV_SEND_SERVER)) == 0) {
set_vservername(&watchers);
}
+
+ return true;
}
/// Returns an allocated array of server addresses.
diff --git a/src/nvim/msgpack_rpc/server.h b/src/nvim/msgpack_rpc/server.h
index f1a6703938..5446e40e0b 100644
--- a/src/nvim/msgpack_rpc/server.h
+++ b/src/nvim/msgpack_rpc/server.h
@@ -1,6 +1,8 @@
#ifndef NVIM_MSGPACK_RPC_SERVER_H
#define NVIM_MSGPACK_RPC_SERVER_H
+#include <stdio.h>
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "msgpack_rpc/server.h.generated.h"
#endif
diff --git a/src/nvim/normal.c b/src/nvim/normal.c
index c95e5e1a15..0e3946740a 100644
--- a/src/nvim/normal.c
+++ b/src/nvim/normal.c
@@ -1,8 +1,11 @@
-/*
- * normal.c: Contains the main routine for processing characters in command
- * mode. Communicates closely with the code in ops.c to handle
- * the operators.
- */
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+//
+// normal.c: Contains the main routine for processing characters in command
+// mode. Communicates closely with the code in ops.c to handle
+// the operators.
+//
#include <assert.h>
#include <inttypes.h>
@@ -10,6 +13,7 @@
#include <stdbool.h>
#include <stdlib.h>
+#include "nvim/log.h"
#include "nvim/vim.h"
#include "nvim/ascii.h"
#include "nvim/normal.h"
@@ -36,7 +40,6 @@
#include "nvim/memory.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/keymap.h"
#include "nvim/move.h"
#include "nvim/mouse.h"
@@ -46,6 +49,7 @@
#include "nvim/screen.h"
#include "nvim/search.h"
#include "nvim/spell.h"
+#include "nvim/spellfile.h"
#include "nvim/strings.h"
#include "nvim/syntax.h"
#include "nvim/tag.h"
@@ -60,12 +64,9 @@
typedef struct normal_state {
VimState state;
- linenr_T conceal_old_cursor_line;
- linenr_T conceal_new_cursor_line;
bool command_finished;
bool ctrl_w;
bool need_flushbuf;
- bool conceal_update_lines;
bool set_prevcount;
bool previous_got_int; // `got_int` was true
bool cmdwin; // command-line window normal mode
@@ -153,196 +154,195 @@ static const struct nv_cmd {
short cmd_arg; /* value for ca.arg */
} nv_cmds[] =
{
- {NUL, nv_error, 0, 0},
- {Ctrl_A, nv_addsub, 0, 0},
- {Ctrl_B, nv_page, NV_STS, BACKWARD},
- {Ctrl_C, nv_esc, 0, true},
- {Ctrl_D, nv_halfpage, 0, 0},
- {Ctrl_E, nv_scroll_line, 0, true},
- {Ctrl_F, nv_page, NV_STS, FORWARD},
- {Ctrl_G, nv_ctrlg, 0, 0},
- {Ctrl_H, nv_ctrlh, 0, 0},
- {Ctrl_I, nv_pcmark, 0, 0},
- {NL, nv_down, 0, false},
- {Ctrl_K, nv_error, 0, 0},
- {Ctrl_L, nv_clear, 0, 0},
- {Ctrl_M, nv_down, 0, true},
- {Ctrl_N, nv_down, NV_STS, false},
- {Ctrl_O, nv_ctrlo, 0, 0},
- {Ctrl_P, nv_up, NV_STS, false},
- {Ctrl_Q, nv_visual, 0, false},
- {Ctrl_R, nv_redo, 0, 0},
- {Ctrl_S, nv_ignore, 0, 0},
- {Ctrl_T, nv_tagpop, NV_NCW, 0},
- {Ctrl_U, nv_halfpage, 0, 0},
- {Ctrl_V, nv_visual, 0, false},
- {'V', nv_visual, 0, false},
- {'v', nv_visual, 0, false},
- {Ctrl_W, nv_window, 0, 0},
- {Ctrl_X, nv_addsub, 0, 0},
- {Ctrl_Y, nv_scroll_line, 0, false},
- {Ctrl_Z, nv_suspend, 0, 0},
- {ESC, nv_esc, 0, false},
- {Ctrl_BSL, nv_normal, NV_NCH_ALW, 0},
- {Ctrl_RSB, nv_ident, NV_NCW, 0},
- {Ctrl_HAT, nv_hat, NV_NCW, 0},
- {Ctrl__, nv_error, 0, 0},
- {' ', nv_right, 0, 0},
- {'!', nv_operator, 0, 0},
- {'"', nv_regname, NV_NCH_NOP|NV_KEEPREG, 0},
- {'#', nv_ident, 0, 0},
- {'$', nv_dollar, 0, 0},
- {'%', nv_percent, 0, 0},
- {'&', nv_optrans, 0, 0},
- {'\'', nv_gomark, NV_NCH_ALW, true},
- {'(', nv_brace, 0, BACKWARD},
- {')', nv_brace, 0, FORWARD},
- {'*', nv_ident, 0, 0},
- {'+', nv_down, 0, true},
- {',', nv_csearch, 0, true},
- {'-', nv_up, 0, true},
- {'.', nv_dot, NV_KEEPREG, 0},
- {'/', nv_search, 0, false},
- {'0', nv_beginline, 0, 0},
- {'1', nv_ignore, 0, 0},
- {'2', nv_ignore, 0, 0},
- {'3', nv_ignore, 0, 0},
- {'4', nv_ignore, 0, 0},
- {'5', nv_ignore, 0, 0},
- {'6', nv_ignore, 0, 0},
- {'7', nv_ignore, 0, 0},
- {'8', nv_ignore, 0, 0},
- {'9', nv_ignore, 0, 0},
- {':', nv_colon, 0, 0},
- {';', nv_csearch, 0, false},
- {'<', nv_operator, NV_RL, 0},
- {'=', nv_operator, 0, 0},
- {'>', nv_operator, NV_RL, 0},
- {'?', nv_search, 0, false},
- {'@', nv_at, NV_NCH_NOP, false},
- {'A', nv_edit, 0, 0},
- {'B', nv_bck_word, 0, 1},
- {'C', nv_abbrev, NV_KEEPREG, 0},
- {'D', nv_abbrev, NV_KEEPREG, 0},
- {'E', nv_wordcmd, 0, true},
- {'F', nv_csearch, NV_NCH_ALW|NV_LANG, BACKWARD},
- {'G', nv_goto, 0, true},
- {'H', nv_scroll, 0, 0},
- {'I', nv_edit, 0, 0},
- {'J', nv_join, 0, 0},
- {'K', nv_ident, 0, 0},
- {'L', nv_scroll, 0, 0},
- {'M', nv_scroll, 0, 0},
- {'N', nv_next, 0, SEARCH_REV},
- {'O', nv_open, 0, 0},
- {'P', nv_put, 0, 0},
- {'Q', nv_exmode, NV_NCW, 0},
- {'R', nv_Replace, 0, false},
- {'S', nv_subst, NV_KEEPREG, 0},
- {'T', nv_csearch, NV_NCH_ALW|NV_LANG, BACKWARD},
- {'U', nv_Undo, 0, 0},
- {'W', nv_wordcmd, 0, true},
- {'X', nv_abbrev, NV_KEEPREG, 0},
- {'Y', nv_abbrev, NV_KEEPREG, 0},
- {'Z', nv_Zet, NV_NCH_NOP|NV_NCW, 0},
- {'[', nv_brackets, NV_NCH_ALW, BACKWARD},
- {'\\', nv_error, 0, 0},
- {']', nv_brackets, NV_NCH_ALW, FORWARD},
- {'^', nv_beginline, 0, BL_WHITE | BL_FIX},
- {'_', nv_lineop, 0, 0},
- {'`', nv_gomark, NV_NCH_ALW, false},
- {'a', nv_edit, NV_NCH, 0},
- {'b', nv_bck_word, 0, 0},
- {'c', nv_operator, 0, 0},
- {'d', nv_operator, 0, 0},
- {'e', nv_wordcmd, 0, false},
- {'f', nv_csearch, NV_NCH_ALW|NV_LANG, FORWARD},
- {'g', nv_g_cmd, NV_NCH_ALW, false},
- {'h', nv_left, NV_RL, 0},
- {'i', nv_edit, NV_NCH, 0},
- {'j', nv_down, 0, false},
- {'k', nv_up, 0, false},
- {'l', nv_right, NV_RL, 0},
- {'m', nv_mark, NV_NCH_NOP, 0},
- {'n', nv_next, 0, 0},
- {'o', nv_open, 0, 0},
- {'p', nv_put, 0, 0},
- {'q', nv_record, NV_NCH, 0},
- {'r', nv_replace, NV_NCH_NOP|NV_LANG, 0},
- {'s', nv_subst, NV_KEEPREG, 0},
- {'t', nv_csearch, NV_NCH_ALW|NV_LANG, FORWARD},
- {'u', nv_undo, 0, 0},
- {'w', nv_wordcmd, 0, false},
- {'x', nv_abbrev, NV_KEEPREG, 0},
- {'y', nv_operator, 0, 0},
- {'z', nv_zet, NV_NCH_ALW, 0},
- {'{', nv_findpar, 0, BACKWARD},
- {'|', nv_pipe, 0, 0},
- {'}', nv_findpar, 0, FORWARD},
- {'~', nv_tilde, 0, 0},
-
- /* pound sign */
- {POUND, nv_ident, 0, 0},
- {K_MOUSEUP, nv_mousescroll, 0, MSCR_UP},
- {K_MOUSEDOWN, nv_mousescroll, 0, MSCR_DOWN},
- {K_MOUSELEFT, nv_mousescroll, 0, MSCR_LEFT},
- {K_MOUSERIGHT, nv_mousescroll, 0, MSCR_RIGHT},
- {K_LEFTMOUSE, nv_mouse, 0, 0},
- {K_LEFTMOUSE_NM, nv_mouse, 0, 0},
- {K_LEFTDRAG, nv_mouse, 0, 0},
- {K_LEFTRELEASE, nv_mouse, 0, 0},
- {K_LEFTRELEASE_NM, nv_mouse, 0, 0},
- {K_MIDDLEMOUSE, nv_mouse, 0, 0},
- {K_MIDDLEDRAG, nv_mouse, 0, 0},
- {K_MIDDLERELEASE, nv_mouse, 0, 0},
- {K_RIGHTMOUSE, nv_mouse, 0, 0},
- {K_RIGHTDRAG, nv_mouse, 0, 0},
- {K_RIGHTRELEASE, nv_mouse, 0, 0},
- {K_X1MOUSE, nv_mouse, 0, 0},
- {K_X1DRAG, nv_mouse, 0, 0},
- {K_X1RELEASE, nv_mouse, 0, 0},
- {K_X2MOUSE, nv_mouse, 0, 0},
- {K_X2DRAG, nv_mouse, 0, 0},
- {K_X2RELEASE, nv_mouse, 0, 0},
- {K_IGNORE, nv_ignore, NV_KEEPREG, 0},
- {K_NOP, nv_nop, 0, 0},
- {K_INS, nv_edit, 0, 0},
- {K_KINS, nv_edit, 0, 0},
- {K_BS, nv_ctrlh, 0, 0},
- {K_UP, nv_up, NV_SSS|NV_STS, false},
- {K_S_UP, nv_page, NV_SS, BACKWARD},
- {K_DOWN, nv_down, NV_SSS|NV_STS, false},
- {K_S_DOWN, nv_page, NV_SS, FORWARD},
- {K_LEFT, nv_left, NV_SSS|NV_STS|NV_RL, 0},
- {K_S_LEFT, nv_bck_word, NV_SS|NV_RL, 0},
- {K_C_LEFT, nv_bck_word, NV_SSS|NV_RL|NV_STS, 1},
- {K_RIGHT, nv_right, NV_SSS|NV_STS|NV_RL, 0},
- {K_S_RIGHT, nv_wordcmd, NV_SS|NV_RL, false},
- {K_C_RIGHT, nv_wordcmd, NV_SSS|NV_RL|NV_STS, true},
- {K_PAGEUP, nv_page, NV_SSS|NV_STS, BACKWARD},
- {K_KPAGEUP, nv_page, NV_SSS|NV_STS, BACKWARD},
- {K_PAGEDOWN, nv_page, NV_SSS|NV_STS, FORWARD},
- {K_KPAGEDOWN, nv_page, NV_SSS|NV_STS, FORWARD},
- {K_END, nv_end, NV_SSS|NV_STS, false},
- {K_KEND, nv_end, NV_SSS|NV_STS, false},
- {K_S_END, nv_end, NV_SS, false},
- {K_C_END, nv_end, NV_SSS|NV_STS, true},
- {K_HOME, nv_home, NV_SSS|NV_STS, 0},
- {K_KHOME, nv_home, NV_SSS|NV_STS, 0},
- {K_S_HOME, nv_home, NV_SS, 0},
- {K_C_HOME, nv_goto, NV_SSS|NV_STS, false},
- {K_DEL, nv_abbrev, 0, 0},
- {K_KDEL, nv_abbrev, 0, 0},
- {K_UNDO, nv_kundo, 0, 0},
- {K_HELP, nv_help, NV_NCW, 0},
- {K_F1, nv_help, NV_NCW, 0},
- {K_XF1, nv_help, NV_NCW, 0},
- {K_SELECT, nv_select, 0, 0},
- {K_F8, farsi_fkey, 0, 0},
- {K_F9, farsi_fkey, 0, 0},
- {K_EVENT, nv_event, NV_KEEPREG, 0},
- {K_FOCUSGAINED, nv_focusgained, NV_KEEPREG, 0},
- {K_FOCUSLOST, nv_focuslost, NV_KEEPREG, 0},
+ { NUL, nv_error, 0, 0 },
+ { Ctrl_A, nv_addsub, 0, 0 },
+ { Ctrl_B, nv_page, NV_STS, BACKWARD },
+ { Ctrl_C, nv_esc, 0, true },
+ { Ctrl_D, nv_halfpage, 0, 0 },
+ { Ctrl_E, nv_scroll_line, 0, true },
+ { Ctrl_F, nv_page, NV_STS, FORWARD },
+ { Ctrl_G, nv_ctrlg, 0, 0 },
+ { Ctrl_H, nv_ctrlh, 0, 0 },
+ { Ctrl_I, nv_pcmark, 0, 0 },
+ { NL, nv_down, 0, false },
+ { Ctrl_K, nv_error, 0, 0 },
+ { Ctrl_L, nv_clear, 0, 0 },
+ { Ctrl_M, nv_down, 0, true },
+ { Ctrl_N, nv_down, NV_STS, false },
+ { Ctrl_O, nv_ctrlo, 0, 0 },
+ { Ctrl_P, nv_up, NV_STS, false },
+ { Ctrl_Q, nv_visual, 0, false },
+ { Ctrl_R, nv_redo, 0, 0 },
+ { Ctrl_S, nv_ignore, 0, 0 },
+ { Ctrl_T, nv_tagpop, NV_NCW, 0 },
+ { Ctrl_U, nv_halfpage, 0, 0 },
+ { Ctrl_V, nv_visual, 0, false },
+ { 'V', nv_visual, 0, false },
+ { 'v', nv_visual, 0, false },
+ { Ctrl_W, nv_window, 0, 0 },
+ { Ctrl_X, nv_addsub, 0, 0 },
+ { Ctrl_Y, nv_scroll_line, 0, false },
+ { Ctrl_Z, nv_suspend, 0, 0 },
+ { ESC, nv_esc, 0, false },
+ { Ctrl_BSL, nv_normal, NV_NCH_ALW, 0 },
+ { Ctrl_RSB, nv_ident, NV_NCW, 0 },
+ { Ctrl_HAT, nv_hat, NV_NCW, 0 },
+ { Ctrl__, nv_error, 0, 0 },
+ { ' ', nv_right, 0, 0 },
+ { '!', nv_operator, 0, 0 },
+ { '"', nv_regname, NV_NCH_NOP|NV_KEEPREG, 0 },
+ { '#', nv_ident, 0, 0 },
+ { '$', nv_dollar, 0, 0 },
+ { '%', nv_percent, 0, 0 },
+ { '&', nv_optrans, 0, 0 },
+ { '\'', nv_gomark, NV_NCH_ALW, true },
+ { '(', nv_brace, 0, BACKWARD },
+ { ')', nv_brace, 0, FORWARD },
+ { '*', nv_ident, 0, 0 },
+ { '+', nv_down, 0, true },
+ { ',', nv_csearch, 0, true },
+ { '-', nv_up, 0, true },
+ { '.', nv_dot, NV_KEEPREG, 0 },
+ { '/', nv_search, 0, false },
+ { '0', nv_beginline, 0, 0 },
+ { '1', nv_ignore, 0, 0 },
+ { '2', nv_ignore, 0, 0 },
+ { '3', nv_ignore, 0, 0 },
+ { '4', nv_ignore, 0, 0 },
+ { '5', nv_ignore, 0, 0 },
+ { '6', nv_ignore, 0, 0 },
+ { '7', nv_ignore, 0, 0 },
+ { '8', nv_ignore, 0, 0 },
+ { '9', nv_ignore, 0, 0 },
+ { ':', nv_colon, 0, 0 },
+ { ';', nv_csearch, 0, false },
+ { '<', nv_operator, NV_RL, 0 },
+ { '=', nv_operator, 0, 0 },
+ { '>', nv_operator, NV_RL, 0 },
+ { '?', nv_search, 0, false },
+ { '@', nv_at, NV_NCH_NOP, false },
+ { 'A', nv_edit, 0, 0 },
+ { 'B', nv_bck_word, 0, 1 },
+ { 'C', nv_abbrev, NV_KEEPREG, 0 },
+ { 'D', nv_abbrev, NV_KEEPREG, 0 },
+ { 'E', nv_wordcmd, 0, true },
+ { 'F', nv_csearch, NV_NCH_ALW|NV_LANG, BACKWARD },
+ { 'G', nv_goto, 0, true },
+ { 'H', nv_scroll, 0, 0 },
+ { 'I', nv_edit, 0, 0 },
+ { 'J', nv_join, 0, 0 },
+ { 'K', nv_ident, 0, 0 },
+ { 'L', nv_scroll, 0, 0 },
+ { 'M', nv_scroll, 0, 0 },
+ { 'N', nv_next, 0, SEARCH_REV },
+ { 'O', nv_open, 0, 0 },
+ { 'P', nv_put, 0, 0 },
+ { 'Q', nv_exmode, NV_NCW, 0 },
+ { 'R', nv_Replace, 0, false },
+ { 'S', nv_subst, NV_KEEPREG, 0 },
+ { 'T', nv_csearch, NV_NCH_ALW|NV_LANG, BACKWARD },
+ { 'U', nv_Undo, 0, 0 },
+ { 'W', nv_wordcmd, 0, true },
+ { 'X', nv_abbrev, NV_KEEPREG, 0 },
+ { 'Y', nv_abbrev, NV_KEEPREG, 0 },
+ { 'Z', nv_Zet, NV_NCH_NOP|NV_NCW, 0 },
+ { '[', nv_brackets, NV_NCH_ALW, BACKWARD },
+ { '\\', nv_error, 0, 0 },
+ { ']', nv_brackets, NV_NCH_ALW, FORWARD },
+ { '^', nv_beginline, 0, BL_WHITE | BL_FIX },
+ { '_', nv_lineop, 0, 0 },
+ { '`', nv_gomark, NV_NCH_ALW, false },
+ { 'a', nv_edit, NV_NCH, 0 },
+ { 'b', nv_bck_word, 0, 0 },
+ { 'c', nv_operator, 0, 0 },
+ { 'd', nv_operator, 0, 0 },
+ { 'e', nv_wordcmd, 0, false },
+ { 'f', nv_csearch, NV_NCH_ALW|NV_LANG, FORWARD },
+ { 'g', nv_g_cmd, NV_NCH_ALW, false },
+ { 'h', nv_left, NV_RL, 0 },
+ { 'i', nv_edit, NV_NCH, 0 },
+ { 'j', nv_down, 0, false },
+ { 'k', nv_up, 0, false },
+ { 'l', nv_right, NV_RL, 0 },
+ { 'm', nv_mark, NV_NCH_NOP, 0 },
+ { 'n', nv_next, 0, 0 },
+ { 'o', nv_open, 0, 0 },
+ { 'p', nv_put, 0, 0 },
+ { 'q', nv_record, NV_NCH, 0 },
+ { 'r', nv_replace, NV_NCH_NOP|NV_LANG, 0 },
+ { 's', nv_subst, NV_KEEPREG, 0 },
+ { 't', nv_csearch, NV_NCH_ALW|NV_LANG, FORWARD },
+ { 'u', nv_undo, 0, 0 },
+ { 'w', nv_wordcmd, 0, false },
+ { 'x', nv_abbrev, NV_KEEPREG, 0 },
+ { 'y', nv_operator, 0, 0 },
+ { 'z', nv_zet, NV_NCH_ALW, 0 },
+ { '{', nv_findpar, 0, BACKWARD },
+ { '|', nv_pipe, 0, 0 },
+ { '}', nv_findpar, 0, FORWARD },
+ { '~', nv_tilde, 0, 0 },
+
+ // pound sign
+ { POUND, nv_ident, 0, 0 },
+ { K_MOUSEUP, nv_mousescroll, 0, MSCR_UP },
+ { K_MOUSEDOWN, nv_mousescroll, 0, MSCR_DOWN },
+ { K_MOUSELEFT, nv_mousescroll, 0, MSCR_LEFT },
+ { K_MOUSERIGHT, nv_mousescroll, 0, MSCR_RIGHT },
+ { K_LEFTMOUSE, nv_mouse, 0, 0 },
+ { K_LEFTMOUSE_NM, nv_mouse, 0, 0 },
+ { K_LEFTDRAG, nv_mouse, 0, 0 },
+ { K_LEFTRELEASE, nv_mouse, 0, 0 },
+ { K_LEFTRELEASE_NM, nv_mouse, 0, 0 },
+ { K_MIDDLEMOUSE, nv_mouse, 0, 0 },
+ { K_MIDDLEDRAG, nv_mouse, 0, 0 },
+ { K_MIDDLERELEASE, nv_mouse, 0, 0 },
+ { K_RIGHTMOUSE, nv_mouse, 0, 0 },
+ { K_RIGHTDRAG, nv_mouse, 0, 0 },
+ { K_RIGHTRELEASE, nv_mouse, 0, 0 },
+ { K_X1MOUSE, nv_mouse, 0, 0 },
+ { K_X1DRAG, nv_mouse, 0, 0 },
+ { K_X1RELEASE, nv_mouse, 0, 0 },
+ { K_X2MOUSE, nv_mouse, 0, 0 },
+ { K_X2DRAG, nv_mouse, 0, 0 },
+ { K_X2RELEASE, nv_mouse, 0, 0 },
+ { K_IGNORE, nv_ignore, NV_KEEPREG, 0 },
+ { K_NOP, nv_nop, 0, 0 },
+ { K_INS, nv_edit, 0, 0 },
+ { K_KINS, nv_edit, 0, 0 },
+ { K_BS, nv_ctrlh, 0, 0 },
+ { K_UP, nv_up, NV_SSS|NV_STS, false },
+ { K_S_UP, nv_page, NV_SS, BACKWARD },
+ { K_DOWN, nv_down, NV_SSS|NV_STS, false },
+ { K_S_DOWN, nv_page, NV_SS, FORWARD },
+ { K_LEFT, nv_left, NV_SSS|NV_STS|NV_RL, 0 },
+ { K_S_LEFT, nv_bck_word, NV_SS|NV_RL, 0 },
+ { K_C_LEFT, nv_bck_word, NV_SSS|NV_RL|NV_STS, 1 },
+ { K_RIGHT, nv_right, NV_SSS|NV_STS|NV_RL, 0 },
+ { K_S_RIGHT, nv_wordcmd, NV_SS|NV_RL, false },
+ { K_C_RIGHT, nv_wordcmd, NV_SSS|NV_RL|NV_STS, true },
+ { K_PAGEUP, nv_page, NV_SSS|NV_STS, BACKWARD },
+ { K_KPAGEUP, nv_page, NV_SSS|NV_STS, BACKWARD },
+ { K_PAGEDOWN, nv_page, NV_SSS|NV_STS, FORWARD },
+ { K_KPAGEDOWN, nv_page, NV_SSS|NV_STS, FORWARD },
+ { K_END, nv_end, NV_SSS|NV_STS, false },
+ { K_KEND, nv_end, NV_SSS|NV_STS, false },
+ { K_S_END, nv_end, NV_SS, false },
+ { K_C_END, nv_end, NV_SSS|NV_STS, true },
+ { K_HOME, nv_home, NV_SSS|NV_STS, 0 },
+ { K_KHOME, nv_home, NV_SSS|NV_STS, 0 },
+ { K_S_HOME, nv_home, NV_SS, 0 },
+ { K_C_HOME, nv_goto, NV_SSS|NV_STS, false },
+ { K_DEL, nv_abbrev, 0, 0 },
+ { K_KDEL, nv_abbrev, 0, 0 },
+ { K_UNDO, nv_kundo, 0, 0 },
+ { K_HELP, nv_help, NV_NCW, 0 },
+ { K_F1, nv_help, NV_NCW, 0 },
+ { K_XF1, nv_help, NV_NCW, 0 },
+ { K_SELECT, nv_select, 0, 0 },
+ { K_F8, farsi_f8, 0, 0 },
+ { K_F9, farsi_f9, 0, 0 },
+ { K_EVENT, nv_event, NV_KEEPREG, 0 },
+ { K_COMMAND, nv_colon, 0, 0 },
};
/* Number of commands in nv_cmds[]. */
@@ -460,7 +460,7 @@ void normal_enter(bool cmdwin, bool noexmode)
normal_state_init(&state);
state.cmdwin = cmdwin;
state.noexmode = noexmode;
- state.toplevel = !cmdwin && !noexmode;
+ state.toplevel = (!cmdwin || cmdwin_result == 0) && !noexmode;
state_enter(&state.state);
}
@@ -538,7 +538,7 @@ static bool normal_handle_special_visual_command(NormalState *s)
return false;
}
-static bool normal_need_aditional_char(NormalState *s)
+static bool normal_need_additional_char(NormalState *s)
{
int flags = nv_cmds[s->idx].cmd_flags;
bool pending_op = s->oa.op_type != OP_NOP;
@@ -618,7 +618,7 @@ static void normal_redraw_mode_message(NormalState *s)
update_screen(0);
// now reset it, otherwise it's put in the history again
keep_msg = kmsg;
- msg_attr(kmsg, keep_msg_attr);
+ msg_attr((const char *)kmsg, keep_msg_attr);
xfree(kmsg);
}
setcursor();
@@ -642,8 +642,7 @@ static void normal_get_additional_char(NormalState *s)
bool langmap_active = false; // using :lmap mappings
int lang; // getting a text character
- ++no_mapping;
- ++allow_keys; // no mapping for nchar, but allow key codes
+ no_mapping++;
// Don't generate a CursorHold event here, most commands can't handle
// it, e.g., nv_replace(), nv_csearch().
did_cursorhold = true;
@@ -681,8 +680,7 @@ static void normal_get_additional_char(NormalState *s)
}
if (lang && curbuf->b_p_iminsert == B_IMODE_LMAP) {
// Allow mappings defined with ":lmap".
- --no_mapping;
- --allow_keys;
+ no_mapping--;
if (repl) {
State = LREPLACE;
} else {
@@ -695,9 +693,7 @@ static void normal_get_additional_char(NormalState *s)
if (langmap_active) {
// Undo the decrement done above
- ++no_mapping;
- ++allow_keys;
- State = NORMAL_BUSY;
+ no_mapping++;
}
State = NORMAL_BUSY;
s->need_flushbuf |= add_to_showcmd(*cp);
@@ -781,8 +777,7 @@ static void normal_get_additional_char(NormalState *s)
}
no_mapping++;
}
- --no_mapping;
- --allow_keys;
+ no_mapping--;
}
static void normal_invert_horizontal(NormalState *s)
@@ -832,8 +827,7 @@ static bool normal_get_command_count(NormalState *s)
}
if (s->ctrl_w) {
- ++no_mapping;
- ++allow_keys; // no mapping for nchar, but keys
+ no_mapping++;
}
++no_zero_mapping; // don't map zero here
@@ -841,8 +835,7 @@ static bool normal_get_command_count(NormalState *s)
LANGMAP_ADJUST(s->c, true);
--no_zero_mapping;
if (s->ctrl_w) {
- --no_mapping;
- --allow_keys;
+ no_mapping--;
}
s->need_flushbuf |= add_to_showcmd(s->c);
}
@@ -852,12 +845,10 @@ static bool normal_get_command_count(NormalState *s)
s->ctrl_w = true;
s->ca.opcount = s->ca.count0; // remember first count
s->ca.count0 = 0;
- ++no_mapping;
- ++allow_keys; // no mapping for nchar, but keys
+ no_mapping++;
s->c = plain_vgetc(); // get next character
LANGMAP_ADJUST(s->c, true);
- --no_mapping;
- --allow_keys;
+ no_mapping--;
s->need_flushbuf |= add_to_showcmd(s->c);
return true;
}
@@ -925,9 +916,7 @@ normal_end:
checkpcmark(); // check if we moved since setting pcmark
xfree(s->ca.searchbuf);
- if (has_mbyte) {
- mb_adjust_cursor();
- }
+ mb_check_adjust_col(curwin); // #6203
if (curwin->w_p_scb && s->toplevel) {
validate_cursor(); // may need to update w_leftcol
@@ -1091,7 +1080,7 @@ static int normal_execute(VimState *state, int key)
}
// Get an additional character if we need one.
- if (normal_need_aditional_char(s)) {
+ if (normal_need_additional_char(s)) {
normal_get_additional_char(s);
}
@@ -1131,6 +1120,7 @@ static int normal_execute(VimState *state, int key)
start_selection();
unshift_special(&s->ca);
s->idx = find_command(s->ca.cmdchar);
+ assert(s->idx >= 0);
} else if ((nv_cmds[s->idx].cmd_flags & NV_SSS)
&& (mod_mask & MOD_MASK_SHIFT)) {
start_selection();
@@ -1164,7 +1154,7 @@ static void normal_check_stuff_buffer(NormalState *s)
if (need_start_insertmode && goto_im() && !VIsual_active) {
need_start_insertmode = false;
- stuffReadbuff((uint8_t *)"i"); // start insert mode next
+ stuffReadbuff("i"); // start insert mode next
// skip the fileinfo message now, because it would be shown
// after insert mode finishes!
need_fileinfo = false;
@@ -1208,27 +1198,17 @@ static void normal_check_cursor_moved(NormalState *s)
apply_autocmds(EVENT_CURSORMOVED, NULL, NULL, false, curbuf);
}
- if (curwin->w_p_cole > 0) {
- s->conceal_old_cursor_line = last_cursormoved.lnum;
- s->conceal_new_cursor_line = curwin->w_cursor.lnum;
- s->conceal_update_lines = true;
- }
-
last_cursormoved = curwin->w_cursor;
}
}
static void normal_check_text_changed(NormalState *s)
{
- // Trigger TextChanged if b_changedtick differs.
+ // Trigger TextChanged if changedtick differs.
if (!finish_op && has_event(EVENT_TEXTCHANGED)
- && last_changedtick != curbuf->b_changedtick) {
- if (last_changedtick_buf == curbuf) {
- apply_autocmds(EVENT_TEXTCHANGED, NULL, NULL, false, curbuf);
- }
-
- last_changedtick_buf = curbuf;
- last_changedtick = curbuf->b_changedtick;
+ && curbuf->b_last_changedtick != buf_get_changedtick(curbuf)) {
+ apply_autocmds(EVENT_TEXTCHANGED, NULL, NULL, false, curbuf);
+ curbuf->b_last_changedtick = buf_get_changedtick(curbuf);
}
}
@@ -1257,6 +1237,13 @@ static void normal_redraw(NormalState *s)
update_topline();
validate_cursor();
+ // If the cursor moves horizontally when 'concealcursor' is active, then the
+ // current line needs to be redrawn in order to calculate the correct
+ // cursor position.
+ if (curwin->w_p_cole > 0 && conceal_cursor_line(curwin)) {
+ redrawWinline(curwin, curwin->w_cursor.lnum);
+ }
+
if (VIsual_active) {
update_curbuf(INVERTED); // update inverted part
} else if (must_redraw) {
@@ -1276,11 +1263,12 @@ static void normal_redraw(NormalState *s)
// msg_attr_keep() will set keep_msg to NULL, must free the string here.
// Don't reset keep_msg, msg_attr_keep() uses it to check for duplicates.
char *p = (char *)keep_msg;
- msg_attr((uint8_t *)p, keep_msg_attr);
+ msg_attr(p, keep_msg_attr);
xfree(p);
}
- if (need_fileinfo) { // show file info after redraw
+ // show fileinfo after redraw
+ if (need_fileinfo && !shortmess(SHM_FILEINFO)) {
fileinfo(false, true, false);
need_fileinfo = false;
}
@@ -1291,22 +1279,6 @@ static void normal_redraw(NormalState *s)
may_clear_sb_text(); // clear scroll-back text on next msg
showruler(false);
- if (s->conceal_update_lines
- && (s->conceal_old_cursor_line !=
- s->conceal_new_cursor_line
- || conceal_cursor_line(curwin)
- || need_cursor_line_redraw)) {
- if (s->conceal_old_cursor_line !=
- s->conceal_new_cursor_line
- && s->conceal_old_cursor_line <=
- curbuf->b_ml.ml_line_count) {
- update_single_line(curwin, s->conceal_old_cursor_line);
- }
-
- update_single_line(curwin, s->conceal_new_cursor_line);
- curwin->w_valid &= ~VALID_CROW;
- }
-
setcursor();
}
@@ -1335,6 +1307,14 @@ static int normal_check(VimState *state)
normal_check_cursor_moved(s);
normal_check_text_changed(s);
+ // Updating diffs from changed() does not always work properly,
+ // esp. updating folds. Do an update just before redrawing if
+ // needed.
+ if (curtab->tp_diff_update || curtab->tp_diff_invalid) {
+ ex_diffupdate(NULL);
+ curtab->tp_diff_update = false;
+ }
+
// Scroll-binding for diff mode may have been postponed until
// here. Avoids doing it for every change.
if (diff_need_scrollbind) {
@@ -1361,7 +1341,7 @@ static int normal_check(VimState *state)
// Dict internally somewhere.
// "may_garbage_collect" is reset in vgetc() which is invoked through
// do_exmode() and normal_cmd().
- may_garbage_collect = s->toplevel;
+ may_garbage_collect = !s->cmdwin && !s->noexmode;
// Update w_curswant if w_set_curswant has been set.
// Postponed until here to avoid computing w_virtcol too often.
@@ -1447,8 +1427,10 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
oap->motion_type = kMTCharWise;
} else if (oap->motion_force == Ctrl_V) {
// Change line- or characterwise motion into Visual block mode.
- VIsual_active = true;
- VIsual = oap->start;
+ if (!VIsual_active) {
+ VIsual_active = true;
+ VIsual = oap->start;
+ }
VIsual_mode = Ctrl_V;
VIsual_select = false;
VIsual_reselect = false;
@@ -1458,9 +1440,8 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
/* Never redo "zf" (define fold). */
if ((vim_strchr(p_cpo, CPO_YANK) != NULL || oap->op_type != OP_YANK)
&& ((!VIsual_active || oap->motion_force)
- /* Also redo Operator-pending Visual mode mappings */
- || (VIsual_active && cap->cmdchar == ':'
- && oap->op_type != OP_COLON))
+ // Also redo Operator-pending Visual mode mappings.
+ || (cap->cmdchar == ':' && oap->op_type != OP_COLON))
&& cap->cmdchar != 'D'
&& oap->op_type != OP_FOLD
&& oap->op_type != OP_FOLDOPEN
@@ -1478,16 +1459,17 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
* If 'cpoptions' does not contain 'r', insert the search
* pattern to really repeat the same command.
*/
- if (vim_strchr(p_cpo, CPO_REDO) == NULL)
+ if (vim_strchr(p_cpo, CPO_REDO) == NULL) {
AppendToRedobuffLit(cap->searchbuf, -1);
+ }
AppendToRedobuff(NL_STR);
- } else if (cap->cmdchar == ':') {
- /* do_cmdline() has stored the first typed line in
- * "repeat_cmdline". When several lines are typed repeating
- * won't be possible. */
- if (repeat_cmdline == NULL)
+ } else if (cap->cmdchar == ':' || cap->cmdchar == K_COMMAND) {
+ // do_cmdline() has stored the first typed line in
+ // "repeat_cmdline". When several lines are typed repeating
+ // won't be possible.
+ if (repeat_cmdline == NULL) {
ResetRedobuff();
- else {
+ } else {
AppendToRedobuffLit(repeat_cmdline, -1);
AppendToRedobuff(NL_STR);
xfree(repeat_cmdline);
@@ -1518,10 +1500,7 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
coladvance(curwin->w_curswant);
}
cap->count0 = redo_VIsual_count;
- if (redo_VIsual_count != 0)
- cap->count1 = redo_VIsual_count;
- else
- cap->count1 = 1;
+ cap->count1 = (cap->count0 == 0 ? 1 : cap->count0);
} else if (VIsual_active) {
if (!gui_yank) {
/* Save the current VIsual area for '< and '> marks, and "gv" */
@@ -1559,8 +1538,10 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
}
oap->start = VIsual;
- if (VIsual_mode == 'V')
+ if (VIsual_mode == 'V') {
oap->start.col = 0;
+ oap->start.coladd = 0;
+ }
}
/*
@@ -1598,6 +1579,8 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
oap->start = curwin->w_cursor;
}
+ // Just in case lines were deleted that make the position invalid.
+ check_pos(curwin->w_buffer, &oap->end);
oap->line_count = oap->end.lnum - oap->start.lnum + 1;
/* Set "virtual_op" before resetting VIsual_active. */
@@ -1644,16 +1627,22 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
/* Prepare for redoing. Only use the nchar field for "r",
* otherwise it might be the second char of the operator. */
if (cap->cmdchar == 'g' && (cap->nchar == 'n'
- || cap->nchar == 'N'))
+ || cap->nchar == 'N')) {
prep_redo(oap->regname, cap->count0,
- get_op_char(oap->op_type), get_extra_op_char(oap->op_type),
- oap->motion_force, cap->cmdchar, cap->nchar);
- else if (cap->cmdchar != ':')
- prep_redo(oap->regname, 0L, NUL, 'v',
- get_op_char(oap->op_type),
- get_extra_op_char(oap->op_type),
- oap->op_type == OP_REPLACE
- ? cap->nchar : NUL);
+ get_op_char(oap->op_type), get_extra_op_char(oap->op_type),
+ oap->motion_force, cap->cmdchar, cap->nchar);
+ } else if (cap->cmdchar != ':') {
+ int nchar = oap->op_type == OP_REPLACE ? cap->nchar : NUL;
+
+ // reverse what nv_replace() did
+ if (nchar == REPLACE_CR_NCHAR) {
+ nchar = CAR;
+ } else if (nchar == REPLACE_NL_NCHAR) {
+ nchar = NL;
+ }
+ prep_redo(oap->regname, 0L, NUL, 'v', get_op_char(oap->op_type),
+ get_extra_op_char(oap->op_type), nchar);
+ }
if (!redo_VIsual_busy) {
redo_VIsual_mode = resel_VIsual_mode;
redo_VIsual_vcol = resel_VIsual_vcol;
@@ -1812,7 +1801,10 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
} else {
(void)op_delete(oap);
if (oap->motion_type == kMTLineWise && has_format_option(FO_AUTO)) {
- u_save_cursor(); // cursor line wasn't saved yet
+ // cursor line wasn't saved yet
+ if (u_save_cursor() == FAIL) {
+ break;
+ }
}
auto_format(false, true);
}
@@ -1863,10 +1855,12 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
break;
case OP_FILTER:
- if (vim_strchr(p_cpo, CPO_FILTER) != NULL)
- AppendToRedobuff((char_u *)"!\r"); /* use any last used !cmd */
- else
- bangredo = true; /* do_bang() will put cmd in redo buffer */
+ if (vim_strchr(p_cpo, CPO_FILTER) != NULL) {
+ AppendToRedobuff("!\r"); // Use any last used !cmd.
+ } else {
+ bangredo = true; // do_bang() will put cmd in redo buffer.
+ }
+ FALLTHROUGH;
case OP_INDENT:
case OP_COLON:
@@ -1901,12 +1895,13 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
break;
case OP_FORMAT:
- if (*curbuf->b_p_fex != NUL)
- op_formatexpr(oap); /* use expression */
- else if (*p_fp != NUL)
- op_colon(oap); /* use external command */
- else
- op_format(oap, false); /* use internal function */
+ if (*curbuf->b_p_fex != NUL) {
+ op_formatexpr(oap); // use expression
+ } else if (*p_fp != NUL || *curbuf->b_p_fp != NUL) {
+ op_colon(oap); // use external command
+ } else {
+ op_format(oap, false); // use internal function
+ }
break;
case OP_FORMAT2:
@@ -1914,7 +1909,10 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
break;
case OP_FUNCTION:
- op_function(oap); /* call 'operatorfunc' */
+ // Restore linebreak, so that when the user edits it looks as
+ // before.
+ curwin->w_p_lbr = lbr_saved;
+ op_function(oap); // call 'operatorfunc'
break;
case OP_INSERT:
@@ -1945,8 +1943,11 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
* the lines. */
auto_format(false, true);
- if (restart_edit == 0)
+ if (restart_edit == 0) {
restart_edit = restart_edit_save;
+ } else {
+ cap->retval |= CA_COMMAND_BUSY;
+ }
}
break;
@@ -2007,7 +2008,7 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
default:
clearopbeep(oap);
}
- virtual_op = MAYBE;
+ virtual_op = kNone;
if (!gui_yank) {
/*
* if 'sol' not set, go back to old column for some commands
@@ -2022,6 +2023,7 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
curwin->w_cursor = old_cursor;
}
clearop(oap);
+ motion_force = NUL;
}
curwin->w_p_lbr = lbr_saved;
}
@@ -2032,40 +2034,44 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
static void op_colon(oparg_T *oap)
{
stuffcharReadbuff(':');
- if (oap->is_VIsual)
- stuffReadbuff((char_u *)"'<,'>");
- else {
- /*
- * Make the range look nice, so it can be repeated.
- */
- if (oap->start.lnum == curwin->w_cursor.lnum)
+ if (oap->is_VIsual) {
+ stuffReadbuff("'<,'>");
+ } else {
+ // Make the range look nice, so it can be repeated.
+ if (oap->start.lnum == curwin->w_cursor.lnum) {
stuffcharReadbuff('.');
- else
+ } else {
stuffnumReadbuff((long)oap->start.lnum);
+ }
if (oap->end.lnum != oap->start.lnum) {
stuffcharReadbuff(',');
- if (oap->end.lnum == curwin->w_cursor.lnum)
+ if (oap->end.lnum == curwin->w_cursor.lnum) {
stuffcharReadbuff('.');
- else if (oap->end.lnum == curbuf->b_ml.ml_line_count)
+ } else if (oap->end.lnum == curbuf->b_ml.ml_line_count) {
stuffcharReadbuff('$');
- else if (oap->start.lnum == curwin->w_cursor.lnum) {
- stuffReadbuff((char_u *)".+");
+ } else if (oap->start.lnum == curwin->w_cursor.lnum) {
+ stuffReadbuff(".+");
stuffnumReadbuff(oap->line_count - 1);
- } else
+ } else {
stuffnumReadbuff((long)oap->end.lnum);
+ }
}
}
- if (oap->op_type != OP_COLON)
- stuffReadbuff((char_u *)"!");
+ if (oap->op_type != OP_COLON) {
+ stuffReadbuff("!");
+ }
if (oap->op_type == OP_INDENT) {
- stuffReadbuff(get_equalprg());
- stuffReadbuff((char_u *)"\n");
+ stuffReadbuff((const char *)get_equalprg());
+ stuffReadbuff("\n");
} else if (oap->op_type == OP_FORMAT) {
- if (*p_fp == NUL)
- stuffReadbuff((char_u *)"fmt");
- else
- stuffReadbuff(p_fp);
- stuffReadbuff((char_u *)"\n']");
+ if (*curbuf->b_p_fp != NUL) {
+ stuffReadbuff((const char *)curbuf->b_p_fp);
+ } else if (*p_fp != NUL) {
+ stuffReadbuff((const char *)p_fp);
+ } else {
+ stuffReadbuff("fmt");
+ }
+ stuffReadbuff("\n']");
}
/*
@@ -2078,8 +2084,7 @@ static void op_colon(oparg_T *oap)
*/
static void op_function(oparg_T *oap)
{
- char_u *(argv[1]);
- int save_virtual_op = virtual_op;
+ const TriState save_virtual_op = virtual_op;
if (*p_opfunc == NUL)
EMSG(_("E774: 'operatorfunc' is empty"));
@@ -2092,17 +2097,17 @@ static void op_function(oparg_T *oap)
decl(&curbuf->b_op_end);
}
- if (oap->motion_type == kMTBlockWise) {
- argv[0] = (char_u *)"block";
- } else if (oap->motion_type == kMTLineWise) {
- argv[0] = (char_u *)"line";
- } else {
- argv[0] = (char_u *)"char";
- }
+ const char_u *const argv[1] = {
+ (const char_u *)(((const char *const[]) {
+ [kMTBlockWise] = "block",
+ [kMTLineWise] = "line",
+ [kMTCharWise] = "char",
+ })[oap->motion_type]),
+ };
- /* Reset virtual_op so that 'virtualedit' can be changed in the
- * function. */
- virtual_op = MAYBE;
+ // Reset virtual_op so that 'virtualedit' can be changed in the
+ // function.
+ virtual_op = kNone;
(void)call_func_retnr(p_opfunc, 1, argv, false);
@@ -2110,6 +2115,20 @@ static void op_function(oparg_T *oap)
}
}
+// Move the current tab to tab in same column as mouse or to end of the
+// tabline if there is no tab there.
+static void move_tab_to_mouse(void)
+{
+ int tabnr = tab_page_click_defs[mouse_col].tabnr;
+ if (tabnr <= 0) {
+ tabpage_move(9999);
+ } else if (tabnr < tabpage_index(curtab)) {
+ tabpage_move(tabnr - 1);
+ } else {
+ tabpage_move(tabnr);
+ }
+}
+
/*
* Do the appropriate action for the current mouse click in the current mode.
* Not used for Command-line mode.
@@ -2294,7 +2313,7 @@ do_mouse (
if (VIsual_active) {
if (VIsual_select) {
stuffcharReadbuff(Ctrl_G);
- stuffReadbuff((char_u *)"\"+p");
+ stuffReadbuff("\"+p");
} else {
stuffcharReadbuff('y');
stuffcharReadbuff(K_MIDDLEMOUSE);
@@ -2321,10 +2340,11 @@ do_mouse (
if (regname == 0 && eval_has_provider("clipboard")) {
regname = '*';
}
- if ((State & REPLACE_FLAG) && !yank_register_mline(regname))
+ if ((State & REPLACE_FLAG) && !yank_register_mline(regname)) {
insert_reg(regname, true);
- else {
- do_put(regname, NULL, BACKWARD, 1L, fixindent | PUT_CURSEND);
+ } else {
+ do_put(regname, NULL, BACKWARD, 1L,
+ (fixindent ? PUT_FIXINDENT : 0) | PUT_CURSEND);
/* Repeat it with CTRL-R CTRL-O r or CTRL-R CTRL-P r */
AppendCharToRedobuff(Ctrl_R);
@@ -2346,12 +2366,7 @@ do_mouse (
if (mouse_row == 0 && firstwin->w_winrow > 0) {
if (is_drag) {
if (in_tab_line) {
- if (tab_page_click_defs[mouse_col].type == kStlClickTabClose) {
- tabpage_move(9999);
- } else {
- int tabnr = tab_page_click_defs[mouse_col].tabnr;
- tabpage_move(tabnr < tabpage_index(curtab) ? tabnr - 1 : tabnr);
- }
+ move_tab_to_mouse();
}
return false;
}
@@ -2454,22 +2469,19 @@ 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),
- &rettv, ARRAY_SIZE(argv), argv,
- curwin->w_cursor.lnum, curwin->w_cursor.lnum,
- &doesrange, true, NULL);
- clear_tv(&rettv);
+ (void)call_func((char_u *)tab_page_click_defs[mouse_col].func,
+ (int)strlen(tab_page_click_defs[mouse_col].func),
+ &rettv, ARRAY_SIZE(argv), argv, NULL,
+ curwin->w_cursor.lnum, curwin->w_cursor.lnum,
+ &doesrange, true, NULL, NULL);
+ tv_clear(&rettv);
break;
}
}
}
return true;
} else if (is_drag && in_tab_line) {
- tabpage_move(tab_page_click_defs[mouse_col].type == kStlClickTabClose
- ? 9999
- : tab_page_click_defs[mouse_col].tabnr - 1);
- in_tab_line = false;
+ move_tab_to_mouse();
return false;
}
@@ -2684,7 +2696,8 @@ do_mouse (
*/
if (restart_edit != 0)
where_paste_started = curwin->w_cursor;
- do_put(regname, NULL, dir, count, fixindent | PUT_CURSEND);
+ do_put(regname, NULL, dir, count,
+ (fixindent ? PUT_FIXINDENT : 0)| PUT_CURSEND);
}
/*
* Ctrl-Mouse click or double click in a quickfix window jumps to the
@@ -2693,13 +2706,12 @@ do_mouse (
else if (((mod_mask & MOD_MASK_CTRL)
|| (mod_mask & MOD_MASK_MULTI_CLICK) == MOD_MASK_2CLICK)
&& bt_quickfix(curbuf)) {
- if (State & INSERT)
- stuffcharReadbuff(Ctrl_O);
- if (curwin->w_llist_ref == NULL) /* quickfix window */
- stuffReadbuff((char_u *)":.cc\n");
- else /* location list window */
- stuffReadbuff((char_u *)":.ll\n");
- got_click = false; /* ignore drag&release now */
+ if (curwin->w_llist_ref == NULL) { // quickfix window
+ do_cmdline_cmd(".cc");
+ } else { // location list window
+ do_cmdline_cmd(".ll");
+ }
+ got_click = false; // ignore drag&release now
}
/*
* Ctrl-Mouse click (or double click in a help window) jumps to the tag
@@ -2734,10 +2746,9 @@ do_mouse (
} else if ((mod_mask & MOD_MASK_MULTI_CLICK) && (State & (NORMAL | INSERT))
&& mouse_has(MOUSE_VISUAL)) {
if (is_click || !VIsual_active) {
- if (VIsual_active)
+ if (VIsual_active) {
orig_cursor = VIsual;
- else {
- check_visual_highlight();
+ } else {
VIsual = curwin->w_cursor;
orig_cursor = VIsual;
VIsual_active = true;
@@ -2840,9 +2851,10 @@ static void find_start_of_word(pos_T *pos)
while (pos->col > 0) {
col = pos->col - 1;
- col -= (*mb_head_off)(line, line + col);
- if (get_mouse_class(line + col) != cclass)
+ col -= utf_head_off(line, line + col);
+ if (get_mouse_class(line + col) != cclass) {
break;
+ }
pos->col = col;
}
}
@@ -2859,8 +2871,8 @@ static void find_end_of_word(pos_T *pos)
line = ml_get(pos->lnum);
if (*p_sel == 'e' && pos->col > 0) {
- --pos->col;
- pos->col -= (*mb_head_off)(line, line + pos->col);
+ pos->col--;
+ pos->col -= utf_head_off(line, line + pos->col);
}
cclass = get_mouse_class(line + pos->col);
while (line[pos->col] != NUL) {
@@ -2907,21 +2919,6 @@ static int get_mouse_class(char_u *p)
}
/*
- * Check if highlighting for visual mode is possible, give a warning message
- * if not.
- */
-void check_visual_highlight(void)
-{
- static bool did_check = false;
-
- if (full_screen) {
- if (!did_check && hl_attr(HLF_V) == 0)
- MSG(_("Warning: terminal cannot highlight"));
- did_check = true;
- }
-}
-
-/*
* End Visual mode.
* This function should ALWAYS be called to end Visual mode, except from
* do_pending_operator().
@@ -2971,6 +2968,43 @@ void reset_VIsual(void)
}
}
+// Check for a balloon-eval special item to include when searching for an
+// identifier. When "dir" is BACKWARD "ptr[-1]" must be valid!
+// Returns true if the character at "*ptr" should be included.
+// "dir" is FORWARD or BACKWARD, the direction of searching.
+// "*colp" is in/decremented if "ptr[-dir]" should also be included.
+// "bnp" points to a counter for square brackets.
+static bool find_is_eval_item(
+ const char_u *const ptr,
+ int *const colp,
+ int *const bnp,
+ const int dir)
+{
+ // Accept everything inside [].
+ if ((*ptr == ']' && dir == BACKWARD) || (*ptr == '[' && dir == FORWARD)) {
+ *bnp += 1;
+ }
+ if (*bnp > 0) {
+ if ((*ptr == '[' && dir == BACKWARD) || (*ptr == ']' && dir == FORWARD)) {
+ *bnp -= 1;
+ }
+ return true;
+ }
+
+ // skip over "s.var"
+ if (*ptr == '.') {
+ return true;
+ }
+
+ // two-character item: s->var
+ if (ptr[dir == BACKWARD ? 0 : 1] == '>'
+ && ptr[dir == BACKWARD ? -1 : 0] == '-') {
+ *colp += dir;
+ return true;
+ }
+ return false;
+}
+
/*
* Find the identifier under or to the right of the cursor.
* "find_type" can have one of three values:
@@ -3011,6 +3045,7 @@ size_t find_ident_at_pos(win_T *wp, linenr_T lnum, colnr_T startcol,
int this_class = 0;
int prev_class;
int prevcol;
+ int bn = 0; // bracket nesting
/*
* if i == 0: try to find an identifier
@@ -3022,71 +3057,62 @@ size_t find_ident_at_pos(win_T *wp, linenr_T lnum, colnr_T startcol,
* 1. skip to start of identifier/string
*/
col = startcol;
- if (has_mbyte) {
- while (ptr[col] != NUL) {
- this_class = mb_get_class(ptr + col);
- if (this_class != 0 && (i == 1 || this_class != 1))
- break;
- col += (*mb_ptr2len)(ptr + col);
+ while (ptr[col] != NUL) {
+ // Stop at a ']' to evaluate "a[x]".
+ if ((find_type & FIND_EVAL) && ptr[col] == ']') {
+ break;
}
- } else
- while (ptr[col] != NUL
- && (i == 0 ? !vim_iswordc(ptr[col]) : ascii_iswhite(ptr[col]))
- )
- ++col;
-
-
- /*
- * 2. Back up to start of identifier/string.
- */
- if (has_mbyte) {
- /* Remember class of character under cursor. */
this_class = mb_get_class(ptr + col);
- while (col > 0 && this_class != 0) {
- prevcol = col - 1 - (*mb_head_off)(ptr, ptr + col - 1);
- prev_class = mb_get_class(ptr + prevcol);
- if (this_class != prev_class
- && (i == 0
- || prev_class == 0
- || (find_type & FIND_IDENT))
- )
- break;
- col = prevcol;
+ if (this_class != 0 && (i == 1 || this_class != 1)) {
+ break;
}
+ col += utfc_ptr2len(ptr + col);
+ }
- /* If we don't want just any old string, or we've found an
- * identifier, stop searching. */
- if (this_class > 2)
- this_class = 2;
- if (!(find_type & FIND_STRING) || this_class == 2)
- break;
- } else {
- while (col > 0
- && ((i == 0
- ? vim_iswordc(ptr[col - 1])
- : (!ascii_iswhite(ptr[col - 1])
- && (!(find_type & FIND_IDENT)
- || !vim_iswordc(ptr[col - 1]))))
- ))
- --col;
+ // When starting on a ']' count it, so that we include the '['.
+ bn = ptr[col] == ']';
- /* If we don't want just any old string, or we've found an
- * identifier, stop searching. */
- if (!(find_type & FIND_STRING) || vim_iswordc(ptr[col]))
+ //
+ // 2. Back up to start of identifier/string.
+ //
+ // Remember class of character under cursor.
+ if ((find_type & FIND_EVAL) && ptr[col] == ']') {
+ this_class = mb_get_class((char_u *)"a");
+ } else {
+ this_class = mb_get_class(ptr + col);
+ }
+ while (col > 0 && this_class != 0) {
+ prevcol = col - 1 - utf_head_off(ptr, ptr + col - 1);
+ prev_class = mb_get_class(ptr + prevcol);
+ if (this_class != prev_class
+ && (i == 0
+ || prev_class == 0
+ || (find_type & FIND_IDENT))
+ && (!(find_type & FIND_EVAL)
+ || prevcol == 0
+ || !find_is_eval_item(ptr + prevcol, &prevcol, &bn, BACKWARD))) {
break;
+ }
+ col = prevcol;
+ }
+
+ // If we don't want just any old string, or we've found an
+ // identifier, stop searching.
+ if (this_class > 2) {
+ this_class = 2;
+ }
+ if (!(find_type & FIND_STRING) || this_class == 2) {
+ break;
}
}
- if (ptr[col] == NUL || (i == 0 && (
- has_mbyte ? this_class != 2 :
- !vim_iswordc(ptr[col])))) {
- /*
- * didn't find an identifier or string
- */
- if (find_type & FIND_STRING)
+ if (ptr[col] == NUL || (i == 0 && this_class != 2)) {
+ // Didn't find an identifier or string.
+ if (find_type & FIND_STRING) {
EMSG(_("E348: No string under cursor"));
- else
+ } else {
EMSG(_(e_noident));
+ }
return 0;
}
ptr += col;
@@ -3095,21 +3121,20 @@ size_t find_ident_at_pos(win_T *wp, linenr_T lnum, colnr_T startcol,
/*
* 3. Find the end if the identifier/string.
*/
+ bn = 0;
+ startcol -= col;
col = 0;
- if (has_mbyte) {
- /* Search for point of changing multibyte character class. */
- this_class = mb_get_class(ptr);
- while (ptr[col] != NUL
- && ((i == 0 ? mb_get_class(ptr + col) == this_class
- : mb_get_class(ptr + col) != 0)
- ))
- col += (*mb_ptr2len)(ptr + col);
- } else
- while ((i == 0 ? vim_iswordc(ptr[col])
- : (ptr[col] != NUL && !ascii_iswhite(ptr[col])))
- ) {
- ++col;
- }
+ // Search for point of changing multibyte character class.
+ this_class = mb_get_class(ptr);
+ while (ptr[col] != NUL
+ && ((i == 0
+ ? mb_get_class(ptr + col) == this_class
+ : mb_get_class(ptr + col) != 0)
+ || ((find_type & FIND_EVAL)
+ && col <= (int)startcol
+ && find_is_eval_item(ptr + col, &col, &bn, FORWARD)))) {
+ col += utfc_ptr2len(ptr + col);
+ }
assert(col >= 0);
return (size_t)col;
@@ -3409,10 +3434,10 @@ static void display_showcmd(void)
int len;
len = (int)STRLEN(showcmd_buf);
- if (len == 0)
+ if (len == 0) {
showcmd_is_clear = true;
- else {
- screen_puts(showcmd_buf, (int)Rows - 1, sc_col, 0);
+ } else {
+ grid_puts(&default_grid, showcmd_buf, (int)Rows - 1, sc_col, 0);
showcmd_is_clear = false;
}
@@ -3420,7 +3445,8 @@ static void display_showcmd(void)
* clear the rest of an old message by outputting up to SHOWCMD_COLS
* spaces
*/
- screen_puts((char_u *)" " + len, (int)Rows - 1, sc_col + len, 0);
+ grid_puts(&default_grid, (char_u *)" " + len, (int)Rows - 1,
+ sc_col + len, 0);
setcursor(); /* put cursor back where it belongs */
}
@@ -3509,7 +3535,8 @@ void check_scrollbind(linenr_T topline_diff, long leftcol_diff)
* loop through the scrollbound windows and scroll accordingly
*/
VIsual_select = VIsual_active = 0;
- for (curwin = firstwin; curwin; curwin = curwin->w_next) {
+ FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
+ curwin = wp;
curbuf = curwin->w_buffer;
/* skip original window and windows with 'noscrollbind' */
if (curwin == old_curwin || !curwin->w_p_scb) {
@@ -3641,10 +3668,44 @@ nv_gd (
size_t len;
char_u *ptr;
if ((len = find_ident_under_cursor(&ptr, FIND_IDENT)) == 0
- || !find_decl(ptr, len, nchar == 'd', thisblock, 0))
+ || !find_decl(ptr, len, nchar == 'd', thisblock, SEARCH_START)) {
clearopbeep(oap);
- else if ((fdo_flags & FDO_SEARCH) && KeyTyped && oap->op_type == OP_NOP)
+ } else if ((fdo_flags & FDO_SEARCH) && KeyTyped && oap->op_type == OP_NOP) {
foldOpenCursor();
+ }
+}
+
+// Return true if line[offset] is not inside a C-style comment or string, false
+// otherwise.
+static bool is_ident(char_u *line, int offset)
+{
+ bool incomment = false;
+ int instring = 0;
+ int prev = 0;
+
+ for (int i = 0; i < offset && line[i] != NUL; i++) {
+ if (instring != 0) {
+ if (prev != '\\' && line[i] == instring) {
+ instring = 0;
+ }
+ } else if ((line[i] == '"' || line[i] == '\'') && !incomment) {
+ instring = line[i];
+ } else {
+ if (incomment) {
+ if (prev == '*' && line[i] == '/') {
+ incomment = false;
+ }
+ } else if (prev == '/' && line[i] == '*') {
+ incomment = true;
+ } else if (prev == '/' && line[i] == '/') {
+ return false;
+ }
+ }
+
+ prev = line[i];
+ }
+
+ return incomment == false && instring == 0;
}
/*
@@ -3660,7 +3721,7 @@ find_decl (
size_t len,
bool locally,
bool thisblock,
- int searchflags /* flags passed to searchit() */
+ int flags_arg // flags passed to searchit()
)
{
char_u *pat;
@@ -3672,6 +3733,8 @@ find_decl (
bool save_p_scs;
bool retval = true;
bool incll;
+ int searchflags = flags_arg;
+ bool valid;
pat = xmalloc(len + 7);
@@ -3706,20 +3769,25 @@ find_decl (
/* Search forward for the identifier, ignore comment lines. */
clearpos(&found_pos);
for (;; ) {
+ valid = false;
+ (void)valid; // Avoid "dead assignment" warning.
t = searchit(curwin, curbuf, &curwin->w_cursor, FORWARD,
pat, 1L, searchflags, RE_LAST, (linenr_T)0, NULL);
if (curwin->w_cursor.lnum >= old_pos.lnum)
t = false; /* match after start is failure too */
if (thisblock && t != false) {
- pos_T *pos;
-
- /* Check that the block the match is in doesn't end before the
- * position where we started the search from. */
- if ((pos = findmatchlimit(NULL, '}', FM_FORWARD,
- (int)(old_pos.lnum - curwin->w_cursor.lnum + 1))) != NULL
- && pos->lnum < old_pos.lnum)
+ const int64_t maxtravel = old_pos.lnum - curwin->w_cursor.lnum + 1;
+ const pos_T *pos = findmatchlimit(NULL, '}', FM_FORWARD, maxtravel);
+
+ // Check that the block the match is in doesn't end before the
+ // position where we started the search from.
+ if (pos != NULL && pos->lnum < old_pos.lnum) {
+ // There can't be a useful match before the end of this block.
+ // Skip to the end
+ curwin->w_cursor = *pos;
continue;
+ }
}
if (t == false) {
@@ -3736,19 +3804,36 @@ find_decl (
curwin->w_cursor.col = 0;
continue;
}
- if (!locally) /* global search: use first match found */
+ valid = is_ident(get_cursor_line_ptr(), curwin->w_cursor.col);
+
+ // If the current position is not a valid identifier and a previous match is
+ // present, favor that one instead.
+ if (!valid && found_pos.lnum != 0) {
+ curwin->w_cursor = found_pos;
break;
- if (curwin->w_cursor.lnum >= par_pos.lnum) {
- /* If we previously found a valid position, use it. */
- if (found_pos.lnum != 0)
+ }
+ // global search: use first match found
+ if (valid && !locally) {
+ break;
+ }
+ if (valid && curwin->w_cursor.lnum >= par_pos.lnum) {
+ // If we previously found a valid position, use it.
+ if (found_pos.lnum != 0) {
curwin->w_cursor = found_pos;
+ }
break;
}
- /* For finding a local variable and the match is before the "{" search
- * to find a later match. For K&R style function declarations this
- * skips the function header without types. */
- found_pos = curwin->w_cursor;
+ // For finding a local variable and the match is before the "{" or
+ // inside a comment, continue searching. For K&R style function
+ // declarations this skips the function header without types.
+ if (!valid) {
+ clearpos(&found_pos);
+ } else {
+ found_pos = curwin->w_cursor;
+ }
+ // Remove SEARCH_START from flags to avoid getting stuck at one position.
+ searchflags &= ~SEARCH_START;
}
if (t == false) {
@@ -3790,18 +3875,16 @@ static bool nv_screengo(oparg_T *oap, int dir, long dist)
col_off1 = curwin_col_off();
col_off2 = col_off1 - curwin_col_off2();
- width1 = curwin->w_width - col_off1;
- width2 = curwin->w_width - col_off2;
+ width1 = curwin->w_grid.Columns - col_off1;
+ width2 = curwin->w_grid.Columns - col_off2;
if (width2 == 0) {
width2 = 1; // Avoid divide by zero.
}
- if (curwin->w_width != 0) {
- /*
- * Instead of sticking at the last character of the buffer line we
- * try to stick in the last column of the screen.
- */
+ if (curwin->w_grid.Columns != 0) {
+ // Instead of sticking at the last character of the buffer line we
+ // try to stick in the last column of the screen.
if (curwin->w_curswant == MAXCOL) {
atend = true;
validate_virtcol();
@@ -3842,9 +3925,11 @@ static bool nv_screengo(oparg_T *oap, int dir, long dist)
(void)hasFolding(curwin->w_cursor.lnum,
&curwin->w_cursor.lnum, NULL);
linelen = linetabsize(get_cursor_line_ptr());
- if (linelen > width1)
- curwin->w_curswant += (((linelen - width1 - 1) / width2)
- + 1) * width2;
+ if (linelen > width1) {
+ int w = (((linelen - width1 - 1) / width2) + 1) * width2;
+ assert(curwin->w_curswant <= INT_MAX - w);
+ curwin->w_curswant += w;
+ }
}
} else { /* dir == FORWARD */
if (linelen > width1)
@@ -3917,8 +4002,12 @@ static void nv_mousescroll(cmdarg_T *cap)
row = mouse_row;
col = mouse_col;
- /* find the window at the pointer coordinates */
- curwin = mouse_find_win(&row, &col);
+ // find the window at the pointer coordinates
+ win_T *const wp = mouse_find_win(&row, &col);
+ if (wp == NULL) {
+ return;
+ }
+ curwin = wp;
curbuf = curwin->w_buffer;
}
@@ -4028,12 +4117,10 @@ static void nv_zet(cmdarg_T *cap)
return;
n = nchar - '0';
for (;; ) {
- ++no_mapping;
- ++allow_keys; /* no mapping for nchar, but allow key codes */
+ no_mapping++;
nchar = plain_vgetc();
LANGMAP_ADJUST(nchar, true);
- --no_mapping;
- --allow_keys;
+ no_mapping--;
(void)add_to_showcmd(nchar);
if (nchar == K_DEL || nchar == K_KDEL)
n /= 10;
@@ -4094,12 +4181,12 @@ dozet:
else
curwin->w_cursor.lnum = curwin->w_botline;
}
- /* FALLTHROUGH */
+ FALLTHROUGH;
case NL:
case CAR:
case K_KENTER:
beginline(BL_WHITE | BL_FIX);
- /* FALLTHROUGH */
+ FALLTHROUGH;
case 't': scroll_cursor_top(0, true);
redraw_later(VALID);
@@ -4108,7 +4195,7 @@ dozet:
/* "z." and "zz": put cursor in middle of screen */
case '.': beginline(BL_WHITE | BL_FIX);
- /* FALLTHROUGH */
+ FALLTHROUGH;
case 'z': scroll_cursor_halfway(true);
redraw_later(VALID);
@@ -4126,10 +4213,10 @@ dozet:
curwin->w_cursor.lnum = 1;
else
curwin->w_cursor.lnum = curwin->w_topline - 1;
- /* FALLTHROUGH */
+ FALLTHROUGH;
case '-':
beginline(BL_WHITE | BL_FIX);
- /* FALLTHROUGH */
+ FALLTHROUGH;
case 'b': scroll_cursor_bot(0, true);
redraw_later(VALID);
@@ -4138,8 +4225,8 @@ dozet:
/* "zH" - scroll screen right half-page */
case 'H':
- cap->count1 *= curwin->w_width / 2;
- /* FALLTHROUGH */
+ cap->count1 *= curwin->w_grid.Columns / 2;
+ FALLTHROUGH;
/* "zh" - scroll screen to the right */
case 'h':
@@ -4153,9 +4240,9 @@ dozet:
}
break;
- /* "zL" - scroll screen left half-page */
- case 'L': cap->count1 *= curwin->w_width / 2;
- /* FALLTHROUGH */
+ // "zL" - scroll screen left half-page
+ case 'L': cap->count1 *= curwin->w_grid.Columns / 2;
+ FALLTHROUGH;
/* "zl" - scroll screen to the left */
case 'l':
@@ -4190,11 +4277,12 @@ dozet:
col = 0; /* like the cursor is in col 0 */
else
getvcol(curwin, &curwin->w_cursor, NULL, NULL, &col);
- n = curwin->w_width - curwin_col_off();
- if (col + l_p_siso < n)
+ n = curwin->w_grid.Columns - curwin_col_off();
+ if (col + l_p_siso < n) {
col = 0;
- else
+ } else {
col = col + l_p_siso - n + 1;
+ }
if (curwin->w_leftcol != col) {
curwin->w_leftcol = col;
redraw_later(NOT_VALID);
@@ -4361,20 +4449,18 @@ dozet:
break;
- case 'u': /* "zug" and "zuw": undo "zg" and "zw" */
- ++no_mapping;
- ++allow_keys; /* no mapping for nchar, but allow key codes */
+ case 'u': // "zug" and "zuw": undo "zg" and "zw"
+ no_mapping++;
nchar = plain_vgetc();
LANGMAP_ADJUST(nchar, true);
- --no_mapping;
- --allow_keys;
+ no_mapping--;
(void)add_to_showcmd(nchar);
if (vim_strchr((char_u *)"gGwW", nchar) == NULL) {
clearopbeep(cap->oap);
break;
}
undo = true;
- /*FALLTHROUGH*/
+ FALLTHROUGH;
case 'g': /* "zg": add good word to word list */
case 'w': /* "zw": add wrong word to word list */
@@ -4455,26 +4541,25 @@ static void nv_exmode(cmdarg_T *cap)
}
}
-/*
- * Handle a ":" command.
- */
+/// Handle a ":" command and <Cmd>.
static void nv_colon(cmdarg_T *cap)
{
int old_p_im;
bool cmd_result;
+ bool is_cmdkey = cap->cmdchar == K_COMMAND;
- if (VIsual_active)
+ if (VIsual_active && !is_cmdkey) {
nv_operator(cap);
- else {
+ } else {
if (cap->oap->op_type != OP_NOP) {
// Using ":" as a movement is characterwise exclusive.
cap->oap->motion_type = kMTCharWise;
cap->oap->inclusive = false;
- } else if (cap->count0) {
- /* translate "count:" into ":.,.+(count - 1)" */
+ } else if (cap->count0 && !is_cmdkey) {
+ // translate "count:" into ":.,.+(count - 1)"
stuffcharReadbuff('.');
if (cap->count0 > 1) {
- stuffReadbuff((char_u *)",.+");
+ stuffReadbuff(",.+");
stuffnumReadbuff(cap->count0 - 1L);
}
}
@@ -4485,9 +4570,9 @@ static void nv_colon(cmdarg_T *cap)
old_p_im = p_im;
- /* get a command line and execute it */
- cmd_result = do_cmdline(NULL, getexline, NULL,
- cap->oap->op_type != OP_NOP ? DOCMD_KEEPLINE : 0);
+ // get a command line and execute it
+ cmd_result = do_cmdline(NULL, is_cmdkey ? getcmdkeycmd : getexline, NULL,
+ cap->oap->op_type != OP_NOP ? DOCMD_KEEPLINE : 0);
/* If 'insertmode' changed, enter or exit Insert mode */
if (p_im != old_p_im) {
@@ -4665,6 +4750,11 @@ static void nv_ident(cmdarg_T *cap)
char_u *kp = *curbuf->b_p_kp == NUL ? p_kp : curbuf->b_p_kp; // 'keywordprg'
assert(*kp != NUL); // option.c:do_set() should default to ":help" if empty.
bool kp_ex = (*kp == ':'); // 'keywordprg' is an ex command
+ bool kp_help = (STRCMP(kp, ":he") == 0 || STRCMP(kp, ":help") == 0);
+ if (kp_help && *skipwhite(ptr) == NUL) {
+ EMSG(_(e_noident)); // found white space only
+ return;
+ }
size_t buf_size = n * 2 + 30 + STRLEN(kp);
char *buf = xmalloc(buf_size);
buf[0] = NUL;
@@ -4687,7 +4777,9 @@ static void nv_ident(cmdarg_T *cap)
break;
case 'K':
- if (kp_ex) {
+ if (kp_help) {
+ STRCPY(buf, "he! ");
+ } else if (kp_ex) {
if (cap->count0 != 0) { // Send the count to the ex command.
snprintf(buf, buf_size, "%" PRId64, (int64_t)(cap->count0));
}
@@ -4749,13 +4841,16 @@ static void nv_ident(cmdarg_T *cap)
}
}
- /*
- * Now grab the chars in the identifier
- */
- if (cmdchar == 'K' && !kp_ex) {
- /* Escape the argument properly for a shell command */
+ // Now grab the chars in the identifier
+ if (cmdchar == 'K' && !kp_help) {
ptr = vim_strnsave(ptr, n);
- p = vim_strsave_shellescape(ptr, true, true);
+ if (kp_ex) {
+ // Escape the argument properly for an Ex command
+ p = (char_u *)vim_strsave_fnameescape((const char *)ptr, false);
+ } else {
+ // Escape the argument properly for a shell command
+ p = vim_strsave_shellescape(ptr, true, true);
+ }
xfree(ptr);
char *newbuf = xrealloc(buf, STRLEN(buf) + STRLEN(p) + 1);
buf = newbuf;
@@ -4892,11 +4987,11 @@ static void nv_scroll(cmdarg_T *cap)
/* Don't count filler lines above the window. */
used -= diff_check_fill(curwin, curwin->w_topline)
- curwin->w_topfill;
- validate_botline(); /* make sure w_empty_rows is valid */
- half = (curwin->w_height - curwin->w_empty_rows + 1) / 2;
- for (n = 0; curwin->w_topline + n < curbuf->b_ml.ml_line_count; ++n) {
- /* Count half he number of filler lines to be "below this
- * line" and half to be "above the next line". */
+ validate_botline(); // make sure w_empty_rows is valid
+ half = (curwin->w_grid.Rows - curwin->w_empty_rows + 1) / 2;
+ for (n = 0; curwin->w_topline + n < curbuf->b_ml.ml_line_count; n++) {
+ // Count half he number of filler lines to be "below this
+ // line" and half to be "above the next line".
if (n > 0 && used + diff_check_fill(curwin, curwin->w_topline
+ n) / 2 >= half) {
--n;
@@ -4908,9 +5003,10 @@ static void nv_scroll(cmdarg_T *cap)
if (hasFolding(curwin->w_topline + n, NULL, &lnum))
n = lnum - curwin->w_topline;
}
- if (n > 0 && used > curwin->w_height)
- --n;
- } else { /* (cap->cmdchar == 'H') */
+ if (n > 0 && used > curwin->w_grid.Rows) {
+ n--;
+ }
+ } else { // (cap->cmdchar == 'H')
n = cap->count1 - 1;
if (hasAnyFolding(curwin)) {
/* Count a fold for one screen line. */
@@ -4927,7 +5023,10 @@ static void nv_scroll(cmdarg_T *cap)
curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
}
- cursor_correct(); /* correct for 'so' */
+ // Correct for 'so', except when an operator is pending.
+ if (cap->oap->op_type == OP_NOP) {
+ cursor_correct();
+ }
beginline(BL_SOL | BL_FIX);
}
@@ -4962,26 +5061,21 @@ static void nv_right(cmdarg_T *cap)
if ((!PAST_LINE && oneright() == false)
|| (PAST_LINE && *get_cursor_pos_ptr() == NUL)
) {
- /*
- * <Space> wraps to next line if 'whichwrap' has 's'.
- * 'l' wraps to next line if 'whichwrap' has 'l'.
- * CURS_RIGHT wraps to next line if 'whichwrap' has '>'.
- */
- if ( ((cap->cmdchar == ' '
- && vim_strchr(p_ww, 's') != NULL)
- || (cap->cmdchar == 'l'
- && vim_strchr(p_ww, 'l') != NULL)
- || (cap->cmdchar == K_RIGHT
- && vim_strchr(p_ww, '>') != NULL))
- && curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count) {
- /* When deleting we also count the NL as a character.
- * Set cap->oap->inclusive when last char in the line is
- * included, move to next line after that */
- if ( cap->oap->op_type != OP_NOP
- && !cap->oap->inclusive
- && !lineempty(curwin->w_cursor.lnum))
+ // <Space> wraps to next line if 'whichwrap' has 's'.
+ // 'l' wraps to next line if 'whichwrap' has 'l'.
+ // CURS_RIGHT wraps to next line if 'whichwrap' has '>'.
+ if (((cap->cmdchar == ' ' && vim_strchr(p_ww, 's') != NULL)
+ || (cap->cmdchar == 'l' && vim_strchr(p_ww, 'l') != NULL)
+ || (cap->cmdchar == K_RIGHT && vim_strchr(p_ww, '>') != NULL))
+ && curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count) {
+ // When deleting we also count the NL as a character.
+ // Set cap->oap->inclusive when last char in the line is
+ // included, move to next line after that
+ if (cap->oap->op_type != OP_NOP
+ && !cap->oap->inclusive
+ && !LINEEMPTY(curwin->w_cursor.lnum)) {
cap->oap->inclusive = true;
- else {
+ } else {
++curwin->w_cursor.lnum;
curwin->w_cursor.col = 0;
curwin->w_cursor.coladd = 0;
@@ -4991,12 +5085,14 @@ static void nv_right(cmdarg_T *cap)
continue;
}
if (cap->oap->op_type == OP_NOP) {
- /* Only beep and flush if not moved at all */
- if (n == cap->count1)
+ // Only beep and flush if not moved at all
+ if (n == cap->count1) {
beep_flush();
+ }
} else {
- if (!lineempty(curwin->w_cursor.lnum))
+ if (!LINEEMPTY(curwin->w_cursor.lnum)) {
cap->oap->inclusive = true;
+ }
}
break;
} else if (PAST_LINE) {
@@ -5054,13 +5150,12 @@ static void nv_left(cmdarg_T *cap)
coladvance((colnr_T)MAXCOL);
curwin->w_set_curswant = true;
- /* When the NL before the first char has to be deleted we
- * put the cursor on the NUL after the previous line.
- * This is a very special case, be careful!
- * Don't adjust op_end now, otherwise it won't work. */
- if ( (cap->oap->op_type == OP_DELETE
- || cap->oap->op_type == OP_CHANGE)
- && !lineempty(curwin->w_cursor.lnum)) {
+ // When the NL before the first char has to be deleted we
+ // put the cursor on the NUL after the previous line.
+ // This is a very special case, be careful!
+ // Don't adjust op_end now, otherwise it won't work.
+ if ((cap->oap->op_type == OP_DELETE || cap->oap->op_type == OP_CHANGE)
+ && !LINEEMPTY(curwin->w_cursor.lnum)) {
char_u *cp = get_cursor_pos_ptr();
if (*cp != NUL) {
@@ -5159,13 +5254,13 @@ static void nv_gotofile(cmdarg_T *cap)
if (ptr != NULL) {
// do autowrite if necessary
- if (curbufIsChanged() && curbuf->b_nwindows <= 1 && !P_HID(curbuf)) {
+ if (curbufIsChanged() && curbuf->b_nwindows <= 1 && !buf_hide(curbuf)) {
(void)autowrite(curbuf, false);
}
setpcmark();
- (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LAST,
- P_HID(curbuf) ? ECMD_HIDE : 0, curwin);
- if (cap->nchar == 'F' && lnum >= 0) {
+ if (do_ecmd(0, ptr, NULL, NULL, ECMD_LAST,
+ buf_hide(curbuf) ? ECMD_HIDE : 0, curwin) == OK
+ && cap->nchar == 'F' && lnum >= 0) {
curwin->w_cursor.lnum = lnum;
check_cursor_lnum();
beginline(BL_SOL | BL_FIX);
@@ -5215,6 +5310,7 @@ static void nv_dollar(cmdarg_T *cap)
static void nv_search(cmdarg_T *cap)
{
oparg_T *oap = cap->oap;
+ pos_T save_cursor = curwin->w_cursor;
if (cap->cmdchar == '?' && cap->oap->op_type == OP_ROT13) {
/* Translate "g??" to "g?g?" */
@@ -5224,6 +5320,8 @@ static void nv_search(cmdarg_T *cap)
return;
}
+ // When using 'incsearch' the cursor may be moved to set a different search
+ // start position.
cap->searchbuf = getcmdline(cap->cmdchar, cap->count1, 0);
if (cap->searchbuf == NULL) {
@@ -5232,7 +5330,8 @@ static void nv_search(cmdarg_T *cap)
}
(void)normal_search(cap, cap->cmdchar, cap->searchbuf,
- (cap->arg ? 0 : SEARCH_MARK));
+ (cap->arg || !equalpos(save_cursor, curwin->w_cursor))
+ ? 0 : SEARCH_MARK);
}
/*
@@ -5614,6 +5713,8 @@ static void nv_brackets(cmdarg_T *cap)
cap->nchar == 's', false, NULL) == 0) {
clearopbeep(cap->oap);
break;
+ } else {
+ curwin->w_set_curswant = true;
}
if (cap->oap->op_type == OP_NOP && (fdo_flags & FDO_SEARCH) && KeyTyped)
foldOpenCursor();
@@ -5783,10 +5884,13 @@ static void nv_replace(cmdarg_T *cap)
if (got_int)
reset_VIsual();
if (had_ctrl_v) {
- if (cap->nchar == '\r')
- cap->nchar = -1;
- else if (cap->nchar == '\n')
- cap->nchar = -2;
+ // Use a special (negative) number to make a difference between a
+ // literal CR or NL and a line break.
+ if (cap->nchar == CAR) {
+ cap->nchar = REPLACE_CR_NCHAR;
+ } else if (cap->nchar == NL) {
+ cap->nchar = REPLACE_NL_NCHAR;
+ }
}
nv_operator(cap);
return;
@@ -5919,6 +6023,8 @@ static void nv_replace(cmdarg_T *cap)
curwin->w_set_curswant = true;
set_last_insert(cap->nchar);
}
+
+ foldUpdateAfterInsert();
}
/*
@@ -6021,10 +6127,11 @@ static void n_swapchar(cmdarg_T *cap)
pos_T startpos;
int did_change = 0;
- if (checkclearopq(cap->oap))
+ if (checkclearopq(cap->oap)) {
return;
+ }
- if (lineempty(curwin->w_cursor.lnum) && vim_strchr(p_ww, '~') == NULL) {
+ if (LINEEMPTY(curwin->w_cursor.lnum) && vim_strchr(p_ww, '~') == NULL) {
clearopbeep(cap->oap);
return;
}
@@ -6058,7 +6165,7 @@ static void n_swapchar(cmdarg_T *cap)
curwin->w_set_curswant = true;
if (did_change) {
changed_lines(startpos.lnum, startpos.col, curwin->w_cursor.lnum + 1,
- 0L);
+ 0L, true);
curbuf->b_op_start = startpos;
curbuf->b_op_end = curwin->w_cursor;
if (curbuf->b_op_end.col > 0)
@@ -6149,17 +6256,15 @@ static void nv_abbrev(cmdarg_T *cap)
*/
static void nv_optrans(cmdarg_T *cap)
{
- static char_u *(ar[8]) = {(char_u *)"dl", (char_u *)"dh",
- (char_u *)"d$", (char_u *)"c$",
- (char_u *)"cl", (char_u *)"cc",
- (char_u *)"yy", (char_u *)":s\r"};
- static char_u *str = (char_u *)"xXDCsSY&";
+ static const char *(ar[]) = { "dl", "dh", "d$", "c$", "cl", "cc", "yy",
+ ":s\r" };
+ static const char *str = "xXDCsSY&";
if (!checkclearopq(cap->oap)) {
if (cap->count0) {
stuffnumReadbuff(cap->count0);
}
- stuffReadbuff(ar[(int)(vim_strchr(str, cap->cmdchar) - str)]);
+ stuffReadbuff(ar[strchr(str, (char)cap->cmdchar) - str]);
}
cap->opcount = 0;
}
@@ -6173,7 +6278,7 @@ static void nv_gomark(cmdarg_T *cap)
pos_T *pos;
int c;
pos_T old_cursor = curwin->w_cursor;
- int old_KeyTyped = KeyTyped; /* getting file may reset it */
+ const bool old_KeyTyped = KeyTyped; // getting file may reset it
if (cap->cmdchar == 'g')
c = cap->extra_char;
@@ -6189,15 +6294,18 @@ static void nv_gomark(cmdarg_T *cap)
} else
nv_cursormark(cap, cap->arg, pos);
- /* May need to clear the coladd that a mark includes. */
- if (!virtual_active())
+ // May need to clear the coladd that a mark includes.
+ if (!virtual_active()) {
curwin->w_cursor.coladd = 0;
+ }
+ check_cursor_col();
if (cap->oap->op_type == OP_NOP
&& pos != NULL
&& (pos == (pos_T *)-1 || !equalpos(old_cursor, *pos))
&& (fdo_flags & FDO_MARK)
- && old_KeyTyped)
+ && old_KeyTyped) {
foldOpenCursor();
+ }
}
/*
@@ -6207,7 +6315,7 @@ static void nv_pcmark(cmdarg_T *cap)
{
pos_T *pos;
linenr_T lnum = curwin->w_cursor.lnum;
- int old_KeyTyped = KeyTyped; /* getting file may reset it */
+ const bool old_KeyTyped = KeyTyped; // getting file may reset it
if (!checkclearopq(cap->oap)) {
if (cap->cmdchar == 'g')
@@ -6267,8 +6375,8 @@ static void nv_visual(cmdarg_T *cap)
/* 'v', 'V' and CTRL-V can be used while an operator is pending to make it
* characterwise, linewise, or blockwise. */
if (cap->oap->op_type != OP_NOP) {
- cap->oap->motion_force = cap->cmdchar;
- finish_op = false; /* operator doesn't finish now but later */
+ motion_force = cap->oap->motion_force = cap->cmdchar;
+ finish_op = false; // operator doesn't finish now but later
return;
}
@@ -6281,9 +6389,8 @@ static void nv_visual(cmdarg_T *cap)
VIsual_mode = cap->cmdchar;
showmode();
}
- redraw_curbuf_later(INVERTED); /* update the inversion */
- } else { /* start Visual mode */
- check_visual_highlight();
+ redraw_curbuf_later(INVERTED); // update the inversion
+ } else { // start Visual mode
if (cap->count0 > 0 && resel_VIsual_mode != NUL) {
/* use previously selected part */
VIsual = curwin->w_cursor;
@@ -6372,9 +6479,6 @@ void may_start_select(int c)
*/
static void n_start_visual_mode(int c)
{
- /* Check for redraw before changing the state. */
- conceal_check_cursur_line();
-
VIsual_mode = c;
VIsual_active = true;
VIsual_reselect = true;
@@ -6390,8 +6494,8 @@ static void n_start_visual_mode(int c)
foldAdjustVisual();
setmouse();
- /* Check for redraw after changing the state. */
- conceal_check_cursur_line();
+ // Check for redraw after changing the state.
+ conceal_check_cursor_line();
if (p_smd && msg_silent == 0)
redraw_cmdline = true; /* show visual mode later */
@@ -6536,7 +6640,7 @@ static void nv_g_cmd(cmdarg_T *cap)
*/
case K_BS:
cap->nchar = Ctrl_H;
- /* FALLTHROUGH */
+ FALLTHROUGH;
case 'h':
case 'H':
case Ctrl_H:
@@ -6602,7 +6706,7 @@ static void nv_g_cmd(cmdarg_T *cap)
*/
case '^':
flag = true;
- /* FALLTHROUGH */
+ FALLTHROUGH;
case '0':
case 'm':
@@ -6611,9 +6715,9 @@ static void nv_g_cmd(cmdarg_T *cap)
oap->motion_type = kMTCharWise;
oap->inclusive = false;
if (curwin->w_p_wrap
- && curwin->w_width != 0
+ && curwin->w_grid.Columns != 0
) {
- int width1 = curwin->w_width - curwin_col_off();
+ int width1 = curwin->w_grid.Columns - curwin_col_off();
int width2 = width1 + curwin_col_off2();
validate_virtcol();
@@ -6625,10 +6729,11 @@ static void nv_g_cmd(cmdarg_T *cap)
/* Go to the middle of the screen line. When 'number' or
* 'relativenumber' is on and lines are wrapping the middle can be more
* to the left. */
- if (cap->nchar == 'm')
- i += (curwin->w_width - curwin_col_off()
+ if (cap->nchar == 'm') {
+ i += (curwin->w_grid.Columns - curwin_col_off()
+ ((curwin->w_p_wrap && i > 0)
? curwin_col_off2() : 0)) / 2;
+ }
coladvance((colnr_T)i);
if (flag) {
do
@@ -6672,11 +6777,11 @@ static void nv_g_cmd(cmdarg_T *cap)
oap->motion_type = kMTCharWise;
oap->inclusive = true;
if (curwin->w_p_wrap
- && curwin->w_width != 0
+ && curwin->w_grid.Columns != 0
) {
curwin->w_curswant = MAXCOL; /* so we stay at the end */
if (cap->count1 == 1) {
- int width1 = curwin->w_width - col_off;
+ int width1 = curwin->w_grid.Columns - col_off;
int width2 = width1 + curwin_col_off2();
validate_virtcol();
@@ -6702,7 +6807,7 @@ static void nv_g_cmd(cmdarg_T *cap)
} else if (nv_screengo(oap, FORWARD, cap->count1 - 1) == false)
clearopbeep(oap);
} else {
- i = curwin->w_leftcol + curwin->w_width - col_off - 1;
+ i = curwin->w_leftcol + curwin->w_grid.Columns - col_off - 1;
coladvance((colnr_T)i);
/* Make sure we stick in this column. */
@@ -6780,7 +6885,7 @@ static void nv_g_cmd(cmdarg_T *cap)
/* "g'm" and "g`m": jump to mark without setting pcmark */
case '\'':
cap->arg = true;
- /*FALLTHROUGH*/
+ FALLTHROUGH;
case '`':
nv_gomark(cap);
break;
@@ -6811,7 +6916,7 @@ static void nv_g_cmd(cmdarg_T *cap)
else
show_utf8();
break;
-
+ // "g<": show scrollback text
case '<':
show_sb_text();
break;
@@ -6838,7 +6943,7 @@ static void nv_g_cmd(cmdarg_T *cap)
case 'q':
case 'w':
oap->cursor_start = curwin->w_cursor;
- /*FALLTHROUGH*/
+ FALLTHROUGH;
case '~':
case 'u':
case 'U':
@@ -6943,8 +7048,6 @@ static void nv_g_cmd(cmdarg_T *cap)
*/
static void n_opencmd(cmdarg_T *cap)
{
- linenr_T oldline = curwin->w_cursor.lnum;
-
if (!checkclearopq(cap->oap)) {
if (cap->cmdchar == 'O')
/* Open above the first line of a folded sequence of lines */
@@ -6963,10 +7066,7 @@ static void n_opencmd(cmdarg_T *cap)
has_format_option(FO_OPEN_COMS)
? OPENLINE_DO_COM : 0,
0)) {
- if (curwin->w_p_cole > 0 && oldline != curwin->w_cursor.lnum) {
- update_single_line(curwin, oldline);
- }
- if (curwin->w_p_cul) {
+ if (win_cursorline_standout(curwin)) {
// force redraw of cursorline
curwin->w_valid &= ~VALID_CROW;
}
@@ -7067,7 +7167,7 @@ static void set_op_var(int optype)
assert(opchar0 >= 0 && opchar0 <= UCHAR_MAX);
opchars[0] = (char) opchar0;
- int opchar1 = get_extra_op_char(optype);
+ int opchar1 = get_extra_op_char(optype);
assert(opchar1 >= 0 && opchar1 <= UCHAR_MAX);
opchars[1] = (char) opchar1;
@@ -7185,8 +7285,10 @@ static void nv_wordcmd(cmdarg_T *cap)
// Another strangeness: When standing on the end of a word "ce" will
// change until the end of the next word, but "cw" will change only one
// character! This is done by setting "flag".
- cap->oap->inclusive = true;
- word_end = true;
+ if (vim_strchr(p_cpo, CPO_CHANGEW) != NULL) {
+ cap->oap->inclusive = true;
+ word_end = true;
+ }
flag = true;
}
}
@@ -7280,11 +7382,11 @@ static bool unadjust_for_sel(void)
pp = &curwin->w_cursor;
else
pp = &VIsual;
- if (pp->coladd > 0)
- --pp->coladd;
- else if (pp->col > 0) {
- --pp->col;
- mb_adjustpos(curbuf, pp);
+ if (pp->coladd > 0) {
+ pp->coladd--;
+ } else if (pp->col > 0) {
+ pp->col--;
+ mark_mb_adjustpos(curbuf, pp);
} else if (pp->lnum > 1) {
--pp->lnum;
pp->col = (colnr_T)STRLEN(ml_get(pp->lnum));
@@ -7378,8 +7480,10 @@ static void nv_esc(cmdarg_T *cap)
if (restart_edit == 0
&& cmdwin_type == 0
&& !VIsual_active
- && no_reason)
- MSG(_("Type :quit<Enter> to exit Nvim"));
+ && no_reason) {
+ MSG(_("Type :qa! and press <Enter> to abandon all changes"
+ " and exit Nvim"));
+ }
/* Don't reset "restart_edit" when 'insertmode' is set, it won't be
* set again below when halfway through a mapping. */
@@ -7410,27 +7514,23 @@ static void nv_esc(cmdarg_T *cap)
restart_edit = 'a';
}
-/*
- * Handle "A", "a", "I", "i" and <Insert> commands.
- */
+/// Handle "A", "a", "I", "i" and <Insert> commands.
static void nv_edit(cmdarg_T *cap)
{
- /* <Insert> is equal to "i" */
- if (cap->cmdchar == K_INS || cap->cmdchar == K_KINS)
+ // <Insert> is equal to "i"
+ if (cap->cmdchar == K_INS || cap->cmdchar == K_KINS) {
cap->cmdchar = 'i';
+ }
- /* in Visual mode "A" and "I" are an operator */
- if (VIsual_active && (cap->cmdchar == 'A' || cap->cmdchar == 'I'))
+ // in Visual mode "A" and "I" are an operator
+ if (VIsual_active && (cap->cmdchar == 'A' || cap->cmdchar == 'I')) {
v_visop(cap);
-
- /* in Visual mode and after an operator "a" and "i" are for text objects */
- else if ((cap->cmdchar == 'a' || cap->cmdchar == 'i')
- && (cap->oap->op_type != OP_NOP
- || VIsual_active
- )) {
+ // in Visual mode and after an operator "a" and "i" are for text objects
+ } else if ((cap->cmdchar == 'a' || cap->cmdchar == 'i')
+ && (cap->oap->op_type != OP_NOP || VIsual_active)) {
nv_object(cap);
- } else if (!curbuf->b_p_ma && !p_im) {
- /* Only give this error when 'insertmode' is off. */
+ } else if (!curbuf->b_p_ma && !p_im && !curbuf->terminal) {
+ // Only give this error when 'insertmode' is off.
EMSG(_(e_modifiable));
clearop(cap->oap);
} else if (!checkclearopq(cap->oap)) {
@@ -7603,11 +7703,13 @@ static void nv_record(cmdarg_T *cap)
if (cap->nchar == ':' || cap->nchar == '/' || cap->nchar == '?') {
stuffcharReadbuff(cap->nchar);
stuffcharReadbuff(K_CMDWIN);
- } else
- /* (stop) recording into a named register, unless executing a
- * register */
- if (!Exec_reg && do_record(cap->nchar) == false)
- clearopbeep(cap->oap);
+ } else {
+ // (stop) recording into a named register, unless executing a
+ // register.
+ if (!Exec_reg && do_record(cap->nchar) == FAIL) {
+ clearopbeep(cap->oap);
+ }
+ }
}
}
@@ -7716,16 +7818,22 @@ static void nv_put(cmdarg_T *cap)
savereg = copy_register(regname);
}
- /* Now delete the selected text. */
- cap->cmdchar = 'd';
- cap->nchar = NUL;
- cap->oap->regname = NUL;
- nv_operator(cap);
- do_pending_operator(cap, 0, false);
- empty = (curbuf->b_ml.ml_flags & ML_EMPTY);
+ // To place the cursor correctly after a blockwise put, and to leave the
+ // text in the correct position when putting over a selection with
+ // 'virtualedit' and past the end of the line, we use the 'c' operator in
+ // do_put(), which requires the visual selection to still be active.
+ if (!VIsual_active || VIsual_mode == 'V' || regname != '.') {
+ // Now delete the selected text.
+ cap->cmdchar = 'd';
+ cap->nchar = NUL;
+ cap->oap->regname = NUL;
+ nv_operator(cap);
+ do_pending_operator(cap, 0, false);
+ empty = (curbuf->b_ml.ml_flags & ML_EMPTY);
- /* delete PUT_LINE_BACKWARD; */
- cap->oap->regname = regname;
+ // delete PUT_LINE_BACKWARD;
+ cap->oap->regname = regname;
+ }
/* When deleted a linewise Visual area, put the register as
* lines to avoid it joined with the next line. When deletion was
@@ -7809,7 +7917,7 @@ static void get_op_vcol(
colnr_T end;
if (VIsual_mode != Ctrl_V
- || (!initial && oap->end.col < curwin->w_width)) {
+ || (!initial && oap->end.col < curwin->w_grid.Columns)) {
return;
}
@@ -7817,7 +7925,7 @@ static void get_op_vcol(
// prevent from moving onto a trail byte
if (has_mbyte) {
- mb_adjustpos(curwin->w_buffer, &oap->end);
+ mark_mb_adjustpos(curwin->w_buffer, &oap->end);
}
getvvcol(curwin, &(oap->start), &oap->start_vcol, NULL, &oap->end_vcol);
@@ -7872,28 +7980,17 @@ static void nv_event(cmdarg_T *cap)
{
// Garbage collection should have been executed before blocking for events in
// the `os_inchar` in `state_enter`, but we also disable it here in case the
- // `os_inchar` branch was not executed(!queue_empty(loop.events), which could
- // have `may_garbage_collect` set to true in `normal_check`).
+ // `os_inchar` branch was not executed (!multiqueue_empty(loop.events), which
+ // could have `may_garbage_collect` set to true in `normal_check`).
//
// That is because here we may run code that calls `os_inchar`
// later(`f_confirm` or `get_keystroke` for example), but in these cases it is
// not safe to perform garbage collection because there could be unreferenced
// lists or dicts being used.
may_garbage_collect = false;
- queue_process_events(main_loop.events);
+ multiqueue_process_events(main_loop.events);
cap->retval |= CA_COMMAND_BUSY; // don't call edit() now
-}
-
-/// Trigger FocusGained event.
-static void nv_focusgained(cmdarg_T *cap)
-{
- apply_autocmds(EVENT_FOCUSGAINED, NULL, NULL, false, curbuf);
-}
-
-/// Trigger FocusLost event.
-static void nv_focuslost(cmdarg_T *cap)
-{
- apply_autocmds(EVENT_FOCUSLOST, NULL, NULL, false, curbuf);
+ finish_op = false;
}
/*
diff --git a/src/nvim/ops.c b/src/nvim/ops.c
index a498fc481a..e9cb480647 100644
--- a/src/nvim/ops.c
+++ b/src/nvim/ops.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* ops.c: implementation of various operators: op_shift, op_delete, op_tilde,
* op_change, op_yank, do_put, do_join
@@ -14,8 +17,10 @@
#include "nvim/buffer.h"
#include "nvim/charset.h"
#include "nvim/cursor.h"
+#include "nvim/assert.h"
#include "nvim/edit.h"
#include "nvim/eval.h"
+#include "nvim/eval/typval.h"
#include "nvim/ex_cmds.h"
#include "nvim/ex_cmds2.h"
#include "nvim/ex_getln.h"
@@ -30,17 +35,18 @@
#include "nvim/memory.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/move.h"
#include "nvim/normal.h"
#include "nvim/option.h"
#include "nvim/path.h"
#include "nvim/screen.h"
#include "nvim/search.h"
+#include "nvim/state.h"
#include "nvim/strings.h"
#include "nvim/terminal.h"
#include "nvim/ui.h"
#include "nvim/undo.h"
+#include "nvim/macros.h"
#include "nvim/window.h"
#include "nvim/os/input.h"
#include "nvim/os/time.h"
@@ -49,12 +55,11 @@ static yankreg_T y_regs[NUM_REGISTERS];
static yankreg_T *y_previous = NULL; /* ptr to last written yankreg */
-static bool clipboard_didwarn_unnamed = false;
-
-// for behavior between start_global_changes() and end_global_changes())
+// for behavior between start_batch_changes() and end_batch_changes())
+static int batch_change_count = 0; // inside a script
static bool clipboard_delay_update = false; // delay clipboard update
-static int global_change_count = 0; // if set, inside global changes
-static bool clipboard_needs_update = false; // the clipboard was updated
+static bool clipboard_needs_update = false; // clipboard was updated
+static bool clipboard_didwarn = false;
/*
* structure used by block_prep, op_delete and op_yank for blockwise operators
@@ -209,9 +214,7 @@ void op_shift(oparg_T *oap, int curs_top, int amount)
++curwin->w_cursor.lnum;
}
- changed_lines(oap->start.lnum, 0, oap->end.lnum + 1, 0L);
- /* The cursor line is not in a closed fold */
- foldOpenCursor();
+ changed_lines(oap->start.lnum, 0, oap->end.lnum + 1, 0L, true);
if (oap->motion_type == kMTBlockWise) {
curwin->w_cursor.lnum = oap->start.lnum;
@@ -222,6 +225,9 @@ void op_shift(oparg_T *oap, int curs_top, int amount)
} else
--curwin->w_cursor.lnum; /* put cursor on last line, for ":>" */
+ // The cursor line is not in a closed fold
+ foldOpenCursor();
+
if (oap->line_count > p_report) {
if (oap->op_type == OP_RSHIFT)
s = (char_u *)">";
@@ -304,30 +310,32 @@ void shift_line(
*/
static void shift_block(oparg_T *oap, int amount)
{
- int left = (oap->op_type == OP_LSHIFT);
- int oldstate = State;
- int total;
- char_u *newp, *oldp;
- int oldcol = curwin->w_cursor.col;
- int p_sw = get_sw_value(curbuf);
- int p_ts = (int)curbuf->b_p_ts;
+ const bool left = (oap->op_type == OP_LSHIFT);
+ const int oldstate = State;
+ char_u *newp;
+ const int oldcol = curwin->w_cursor.col;
+ const int p_sw = get_sw_value(curbuf);
+ const int p_ts = (int)curbuf->b_p_ts;
struct block_def bd;
int incr;
- colnr_T ws_vcol;
int i = 0, j = 0;
- int len;
- int old_p_ri = p_ri;
+ const int old_p_ri = p_ri;
p_ri = 0; /* don't want revins in indent */
- State = INSERT; /* don't want REPLACE for State */
- block_prep(oap, &bd, curwin->w_cursor.lnum, TRUE);
- if (bd.is_short)
+ State = INSERT; // don't want REPLACE for State
+ block_prep(oap, &bd, curwin->w_cursor.lnum, true);
+ if (bd.is_short) {
return;
+ }
+
+ // total is number of screen columns to be inserted/removed
+ int total = (int)((unsigned)amount * (unsigned)p_sw);
+ if ((total / p_sw) != amount) {
+ return; // multiplication overflow
+ }
- /* total is number of screen columns to be inserted/removed */
- total = amount * p_sw;
- oldp = get_cursor_line_ptr();
+ char_u *const oldp = get_cursor_line_ptr();
if (!left) {
/*
@@ -336,13 +344,19 @@ static void shift_block(oparg_T *oap, int amount)
* 3. Divvy into TABs & spp
* 4. Construct new string
*/
- total += bd.pre_whitesp; /* all virtual WS up to & incl a split TAB */
- ws_vcol = bd.start_vcol - bd.pre_whitesp;
+ total += bd.pre_whitesp; // all virtual WS up to & incl a split TAB
+ colnr_T ws_vcol = bd.start_vcol - bd.pre_whitesp;
if (bd.startspaces) {
- if (has_mbyte)
- bd.textstart += (*mb_ptr2len)(bd.textstart);
- else
- ++bd.textstart;
+ if (has_mbyte) {
+ if ((*mb_ptr2len)(bd.textstart) == 1) {
+ bd.textstart++;
+ } else {
+ ws_vcol = 0;
+ bd.startspaces = 0;
+ }
+ } else {
+ bd.textstart++;
+ }
}
for (; ascii_iswhite(*bd.textstart); ) {
// TODO: is passing bd.textstart for start of the line OK?
@@ -360,8 +374,8 @@ static void shift_block(oparg_T *oap, int amount)
j = total;
/* if we're splitting a TAB, allow for it */
bd.textcol -= bd.pre_whitesp_c - (bd.startspaces != 0);
- len = (int)STRLEN(bd.textstart) + 1;
- newp = (char_u *) xmalloc((size_t)(bd.textcol + i + j + len));
+ const int len = (int)STRLEN(bd.textstart) + 1;
+ newp = (char_u *)xmalloc((size_t)(bd.textcol + i + j + len));
memset(newp, NUL, (size_t)(bd.textcol + i + j + len));
memmove(newp, oldp, (size_t)bd.textcol);
memset(newp + bd.textcol, TAB, (size_t)i);
@@ -378,10 +392,7 @@ static void shift_block(oparg_T *oap, int amount)
size_t fill; // nr of spaces that replace a TAB
size_t new_line_len; // the length of the line after the
// block shift
- colnr_T block_space_width;
- colnr_T shift_amount;
char_u *non_white = bd.textstart;
- colnr_T non_white_col;
/*
* Firstly, let's find the first non-whitespace character that is
@@ -394,22 +405,24 @@ static void shift_block(oparg_T *oap, int amount)
/* If "bd.startspaces" is set, "bd.textstart" points to the character,
* the part of which is displayed at the block's beginning. Let's start
* searching from the next character. */
- if (bd.startspaces)
- mb_ptr_adv(non_white);
+ if (bd.startspaces) {
+ MB_PTR_ADV(non_white);
+ }
- /* The character's column is in "bd.start_vcol". */
- non_white_col = bd.start_vcol;
+ // The character's column is in "bd.start_vcol".
+ colnr_T non_white_col = bd.start_vcol;
while (ascii_iswhite(*non_white)) {
incr = lbr_chartabsize_adv(bd.textstart, &non_white, non_white_col);
non_white_col += incr;
}
- block_space_width = non_white_col - oap->start_vcol;
- /* We will shift by "total" or "block_space_width", whichever is less.
- */
- shift_amount = (block_space_width < total ? block_space_width : total);
+ const colnr_T block_space_width = non_white_col - oap->start_vcol;
+ // We will shift by "total" or "block_space_width", whichever is less.
+ const colnr_T shift_amount = block_space_width < total
+ ? block_space_width
+ : total;
// The column to which we will shift the text.
destination_col = non_white_col - shift_amount;
@@ -431,7 +444,7 @@ static void shift_block(oparg_T *oap, int amount)
if (verbatim_copy_width + incr > destination_col)
break;
verbatim_copy_width += incr;
- mb_ptr_adv(verbatim_copy_end);
+ MB_PTR_ADV(verbatim_copy_end);
}
/* If "destination_col" is different from the width of the initial
@@ -441,7 +454,7 @@ static void shift_block(oparg_T *oap, int amount)
fill = (size_t)(destination_col - verbatim_copy_width);
assert(verbatim_copy_end - oldp >= 0);
- size_t verbatim_diff = (size_t)(verbatim_copy_end - oldp);
+ const size_t verbatim_diff = (size_t)(verbatim_copy_end - oldp);
// The replacement line will consist of:
// - the beginning of the original line up to "verbatim_copy_end",
// - "fill" number of spaces,
@@ -453,8 +466,8 @@ static void shift_block(oparg_T *oap, int amount)
memset(newp + verbatim_diff, ' ', fill);
STRMOVE(newp + verbatim_diff + fill, non_white);
}
- /* replace the line */
- ml_replace(curwin->w_cursor.lnum, newp, FALSE);
+ // replace the line
+ ml_replace(curwin->w_cursor.lnum, newp, false);
changed_bytes(curwin->w_cursor.lnum, (colnr_T)bd.textcol);
State = oldstate;
curwin->w_cursor.col = oldcol;
@@ -507,12 +520,12 @@ static void block_insert(oparg_T *oap, char_u *s, int b_insert, struct block_def
}
}
- if (has_mbyte && spaces > 0) {
+ if (spaces > 0) {
int off;
// Avoid starting halfway through a multi-byte character.
if (b_insert) {
- off = (*mb_head_off)(oldp, oldp + offset + spaces);
+ off = utf_head_off(oldp, oldp + offset + spaces);
} else {
off = (*mb_off_next)(oldp, oldp + offset);
offset += off;
@@ -548,7 +561,7 @@ static void block_insert(oparg_T *oap, char_u *s, int b_insert, struct block_def
offset += count;
STRMOVE(newp + offset, oldp);
- ml_replace(lnum, newp, FALSE);
+ ml_replace(lnum, newp, false);
if (lnum == oap->end.lnum) {
/* Set "']" mark to the end of the block instead of the end of
@@ -558,7 +571,7 @@ static void block_insert(oparg_T *oap, char_u *s, int b_insert, struct block_def
}
} /* for all lnum */
- changed_lines(oap->start.lnum + 1, 0, oap->end.lnum + 1, 0L);
+ changed_lines(oap->start.lnum + 1, 0, oap->end.lnum + 1, 0L, true);
State = oldstate;
}
@@ -620,12 +633,13 @@ void op_reindent(oparg_T *oap, Indenter how)
/* Mark changed lines so that they will be redrawn. When Visual
* highlighting was present, need to continue until the last line. When
* there is no change still need to remove the Visual highlighting. */
- if (last_changed != 0)
+ if (last_changed != 0) {
changed_lines(first_changed, 0,
- oap->is_VIsual ? start_lnum + oap->line_count :
- last_changed + 1, 0L);
- else if (oap->is_VIsual)
+ oap->is_VIsual ? start_lnum + oap->line_count :
+ last_changed + 1, 0L, true);
+ } else if (oap->is_VIsual) {
redraw_curbuf_later(INVERTED);
+ }
if (oap->line_count > p_report) {
i = oap->line_count - (i + 1);
@@ -792,7 +806,6 @@ static bool is_append_register(int regname)
/// Returns a copy of contents in register `name`
/// for use in do_put. Should be freed by caller.
yankreg_T *copy_register(int name)
- FUNC_ATTR_MALLOC
FUNC_ATTR_NONNULL_RET
{
yankreg_T *reg = get_yank_register(name, YREG_PASTE);
@@ -881,7 +894,7 @@ static void set_yreg_additional_data(yankreg_T *reg, dict_T *additional_data)
if (reg->additional_data == additional_data) {
return;
}
- dict_unref(reg->additional_data);
+ tv_dict_unref(reg->additional_data);
reg->additional_data = additional_data;
}
@@ -926,13 +939,11 @@ static int stuff_yank(int regname, char_u *p)
static int execreg_lastc = NUL;
-/*
- * execute a yank register: copy it into the stuff buffer
- *
- * return FAIL for failure, OK otherwise
- */
-int
-do_execreg (
+/// Execute a yank register: copy it into the stuff buffer
+///
+/// Return FAIL for failure, OK otherwise
+int
+do_execreg(
int regname,
int colon, /* insert ':' before each line */
int addcr, /* always add '\n' to end of line */
@@ -1099,8 +1110,7 @@ int insert_reg(
)
{
int retval = OK;
- char_u *arg;
- int allocated;
+ bool allocated;
/*
* It is possible to get into an endless loop by having CTRL-R a in
@@ -1115,21 +1125,24 @@ int insert_reg(
if (regname != NUL && !valid_yank_reg(regname, false))
return FAIL;
- if (regname == '.') /* insert last inserted text */
- retval = stuff_inserted(NUL, 1L, TRUE);
- else if (get_spec_reg(regname, &arg, &allocated, TRUE)) {
- if (arg == NULL)
+ char_u *arg;
+ if (regname == '.') { // Insert last inserted text.
+ retval = stuff_inserted(NUL, 1L, true);
+ } else if (get_spec_reg(regname, &arg, &allocated, true)) {
+ if (arg == NULL) {
return FAIL;
- stuffescaped(arg, literally);
- if (allocated)
+ }
+ stuffescaped((const char *)arg, literally);
+ if (allocated) {
xfree(arg);
- } else { /* name or number register */
+ }
+ } else { // Name or number register.
yankreg_T *reg = get_yank_register(regname, YREG_PASTE);
if (reg->y_array == NULL) {
retval = FAIL;
} else {
for (size_t i = 0; i < reg->y_size; i++) {
- stuffescaped(reg->y_array[i], literally);
+ stuffescaped((const char *)reg->y_array[i], literally);
// Insert a newline between lines and after last line if
// y_type is kMTLineWise.
if (reg->y_type == kMTLineWise || i < reg->y_size - 1) {
@@ -1146,115 +1159,125 @@ int insert_reg(
* Stuff a string into the typeahead buffer, such that edit() will insert it
* literally ("literally" TRUE) or interpret is as typed characters.
*/
-static void stuffescaped(char_u *arg, int literally)
+static void stuffescaped(const char *arg, int literally)
{
- int c;
- char_u *start;
-
while (*arg != NUL) {
- /* Stuff a sequence of normal ASCII characters, that's fast. Also
- * stuff K_SPECIAL to get the effect of a special key when "literally"
- * is TRUE. */
- start = arg;
- while ((*arg >= ' ' && *arg < DEL) || (*arg == K_SPECIAL && !literally))
- ++arg;
- if (arg > start)
+ // Stuff a sequence of normal ASCII characters, that's fast. Also
+ // stuff K_SPECIAL to get the effect of a special key when "literally"
+ // is TRUE.
+ const char *const start = arg;
+ while ((*arg >= ' ' && *arg < DEL) || ((uint8_t)(*arg) == K_SPECIAL
+ && !literally)) {
+ arg++;
+ }
+ if (arg > start) {
stuffReadbuffLen(start, (long)(arg - start));
+ }
/* stuff a single special character */
if (*arg != NUL) {
- if (has_mbyte)
- c = mb_cptr2char_adv(&arg);
- else
- c = *arg++;
- if (literally && ((c < ' ' && c != TAB) || c == DEL))
+ const int c = (has_mbyte
+ ? mb_cptr2char_adv((const char_u **)&arg)
+ : (uint8_t)(*arg++));
+ if (literally && ((c < ' ' && c != TAB) || c == DEL)) {
stuffcharReadbuff(Ctrl_V);
+ }
stuffcharReadbuff(c);
}
}
}
-/*
- * If "regname" is a special register, return TRUE and store a pointer to its
- * value in "argp".
- */
-int get_spec_reg(
+// If "regname" is a special register, return true and store a pointer to its
+// value in "argp".
+bool get_spec_reg(
int regname,
char_u **argp,
- int *allocated, /* return: TRUE when value was allocated */
- int errmsg /* give error message when failing */
+ bool *allocated, // return: true when value was allocated
+ bool errmsg // give error message when failing
)
{
size_t cnt;
*argp = NULL;
- *allocated = FALSE;
+ *allocated = false;
switch (regname) {
case '%': /* file name */
if (errmsg)
check_fname(); /* will give emsg if not set */
*argp = curbuf->b_fname;
- return TRUE;
+ return true;
- case '#': /* alternate file name */
- *argp = getaltfname(errmsg); /* may give emsg if not set */
- return TRUE;
+ case '#': // alternate file name
+ *argp = getaltfname(errmsg); // may give emsg if not set
+ return true;
case '=': /* result of expression */
*argp = get_expr_line();
- *allocated = TRUE;
- return TRUE;
+ *allocated = true;
+ return true;
case ':': /* last command line */
if (last_cmdline == NULL && errmsg)
EMSG(_(e_nolastcmd));
*argp = last_cmdline;
- return TRUE;
+ return true;
case '/': /* last search-pattern */
if (last_search_pat() == NULL && errmsg)
EMSG(_(e_noprevre));
*argp = last_search_pat();
- return TRUE;
+ return true;
case '.': /* last inserted text */
*argp = get_last_insert_save();
- *allocated = TRUE;
- if (*argp == NULL && errmsg)
+ *allocated = true;
+ if (*argp == NULL && errmsg) {
EMSG(_(e_noinstext));
- return TRUE;
+ }
+ return true;
- case Ctrl_F: /* Filename under cursor */
- case Ctrl_P: /* Path under cursor, expand via "path" */
- if (!errmsg)
- return FALSE;
- *argp = file_name_at_cursor(FNAME_MESS | FNAME_HYP
- | (regname == Ctrl_P ? FNAME_EXP : 0), 1L, NULL);
- *allocated = TRUE;
- return TRUE;
+ case Ctrl_F: // Filename under cursor
+ case Ctrl_P: // Path under cursor, expand via "path"
+ if (!errmsg) {
+ return false;
+ }
+ *argp = file_name_at_cursor(
+ FNAME_MESS | FNAME_HYP | (regname == Ctrl_P ? FNAME_EXP : 0),
+ 1L, NULL);
+ *allocated = true;
+ return true;
- case Ctrl_W: /* word under cursor */
- case Ctrl_A: /* WORD (mnemonic All) under cursor */
- if (!errmsg)
- return FALSE;
+ case Ctrl_W: // word under cursor
+ case Ctrl_A: // WORD (mnemonic All) under cursor
+ if (!errmsg) {
+ return false;
+ }
cnt = find_ident_under_cursor(argp, (regname == Ctrl_W
? (FIND_IDENT|FIND_STRING)
: FIND_STRING));
*argp = cnt ? vim_strnsave(*argp, cnt) : NULL;
- *allocated = TRUE;
- return TRUE;
+ *allocated = true;
+ return true;
+
+ case Ctrl_L: // Line under cursor
+ if (!errmsg) {
+ return false;
+ }
+
+ *argp = ml_get_buf(curwin->w_buffer, curwin->w_cursor.lnum, false);
+ return true;
case '_': /* black hole: always empty */
*argp = (char_u *)"";
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}
/// Paste a yank register into the command line.
/// Only for non-special registers.
-/// Used by CTRL-R command in command-line mode
+/// Used by CTRL-R in command-line mode.
/// insert_reg() can't be used here, because special characters from the
/// register contents will be interpreted as commands.
///
@@ -1272,9 +1295,8 @@ bool cmdline_paste_reg(int regname, bool literally, bool remcr)
for (size_t i = 0; i < reg->y_size; i++) {
cmdline_paste_str(reg->y_array[i], literally);
- // Insert ^M between lines and after last line if type is kMTLineWise.
- // Don't do this when "remcr" is true.
- if ((reg->y_type == kMTLineWise || i < reg->y_size - 1) && !remcr) {
+ // Insert ^M between lines, unless `remcr` is true.
+ if (i < reg->y_size - 1 && !remcr) {
cmdline_paste_str((char_u *)"\r", literally);
}
@@ -1397,8 +1419,11 @@ int op_delete(oparg_T *oap)
}
if (oap->regname == 0) {
+ if (reg == NULL) {
+ abort();
+ }
set_clipboard(0, reg);
- yank_do_autocmd(oap, reg);
+ do_autocmd_textyankpost(oap, reg);
}
}
@@ -1412,10 +1437,11 @@ int op_delete(oparg_T *oap)
return FAIL;
}
- for (lnum = curwin->w_cursor.lnum; lnum <= oap->end.lnum; ++lnum) {
- block_prep(oap, &bd, lnum, TRUE);
- if (bd.textlen == 0) /* nothing to delete */
+ for (lnum = curwin->w_cursor.lnum; lnum <= oap->end.lnum; lnum++) {
+ block_prep(oap, &bd, lnum, true);
+ if (bd.textlen == 0) { // nothing to delete
continue;
+ }
/* Adjust cursor position for tab replaced by spaces and 'lbr'. */
if (lnum == curwin->w_cursor.lnum) {
@@ -1442,7 +1468,7 @@ int op_delete(oparg_T *oap)
check_cursor_col();
changed_lines(curwin->w_cursor.lnum, curwin->w_cursor.col,
- oap->end.lnum + 1, 0L);
+ oap->end.lnum + 1, 0L, true);
oap->line_count = 0; // no lines deleted
} else if (oap->motion_type == kMTLineWise) {
if (oap->op_type == OP_CHANGE) {
@@ -1458,9 +1484,9 @@ int op_delete(oparg_T *oap)
}
if (u_save_cursor() == FAIL)
return FAIL;
- if (curbuf->b_p_ai) { /* don't delete indent */
- beginline(BL_WHITE); /* cursor on first non-white */
- did_ai = TRUE; /* delete the indent when ESC hit */
+ if (curbuf->b_p_ai) { // don't delete indent
+ 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 */
@@ -1616,13 +1642,18 @@ int op_replace(oparg_T *oap, int c)
colnr_T oldlen;
struct block_def bd;
char_u *after_p = NULL;
- int had_ctrl_v_cr = (c == -1 || c == -2);
+ int had_ctrl_v_cr = false;
if ((curbuf->b_ml.ml_flags & ML_EMPTY ) || oap->empty)
return OK; /* nothing to do */
- if (had_ctrl_v_cr)
- c = (c == -1 ? '\r' : '\n');
+ if (c == REPLACE_CR_NCHAR) {
+ had_ctrl_v_cr = true;
+ c = CAR;
+ } else if (c == REPLACE_NL_NCHAR) {
+ had_ctrl_v_cr = true;
+ c = NL;
+ }
if (has_mbyte)
mb_adjust_opend(oap);
@@ -1636,11 +1667,12 @@ int op_replace(oparg_T *oap, int c)
*/
if (oap->motion_type == kMTBlockWise) {
bd.is_MAX = (curwin->w_curswant == MAXCOL);
- for (; curwin->w_cursor.lnum <= oap->end.lnum; ++curwin->w_cursor.lnum) {
- curwin->w_cursor.col = 0; /* make sure cursor position is valid */
- block_prep(oap, &bd, curwin->w_cursor.lnum, TRUE);
- if (bd.textlen == 0 && (!virtual_op || bd.is_MAX))
- continue; /* nothing to replace */
+ for (; curwin->w_cursor.lnum <= oap->end.lnum; curwin->w_cursor.lnum++) {
+ curwin->w_cursor.col = 0; // make sure cursor position is valid
+ block_prep(oap, &bd, curwin->w_cursor.lnum, true);
+ if (bd.textlen == 0 && (!virtual_op || bd.is_MAX)) {
+ continue; // nothing to replace
+ }
/* n == number of extra chars required
* If we split a TAB, it may be replaced by several characters.
@@ -1700,18 +1732,13 @@ int op_replace(oparg_T *oap, int c)
// insert pre-spaces
memset(newp + bd.textcol, ' ', (size_t)bd.startspaces);
// insert replacement chars CHECK FOR ALLOCATED SPACE
- // -1/-2 is used for entering CR literally.
+ // REPLACE_CR_NCHAR/REPLACE_NL_NCHAR is used for entering CR literally.
size_t after_p_len = 0;
if (had_ctrl_v_cr || (c != '\r' && c != '\n')) {
// strlen(newp) at this point
int newp_len = bd.textcol + bd.startspaces;
- if (has_mbyte) {
- while (--num_chars >= 0) {
- newp_len += (*mb_char2bytes)(c, newp + newp_len);
- }
- } else {
- memset(newp + newp_len, c, (size_t)numc);
- newp_len += numc;
+ while (--num_chars >= 0) {
+ newp_len += utf_char2bytes(c, newp + newp_len);
}
if (!bd.is_short) {
// insert post-spaces
@@ -1727,8 +1754,8 @@ int op_replace(oparg_T *oap, int c)
after_p = (char_u *)xmalloc(after_p_len);
memmove(after_p, oldp, after_p_len);
}
- /* replace the line */
- ml_replace(curwin->w_cursor.lnum, newp, FALSE);
+ // replace the line
+ ml_replace(curwin->w_cursor.lnum, newp, false);
if (after_p != NULL) {
ml_append(curwin->w_cursor.lnum++, after_p, (int)after_p_len, false);
appended_lines_mark(curwin->w_cursor.lnum, 1L);
@@ -1804,7 +1831,7 @@ int op_replace(oparg_T *oap, int c)
curwin->w_cursor = oap->start;
check_cursor();
- changed_lines(oap->start.lnum, oap->start.col, oap->end.lnum + 1, 0L);
+ changed_lines(oap->start.lnum, oap->start.col, oap->end.lnum + 1, 0L, true);
/* Set "'[" and "']" marks. */
curbuf->b_op_start = oap->start;
@@ -1832,14 +1859,15 @@ void op_tilde(oparg_T *oap)
for (; pos.lnum <= oap->end.lnum; pos.lnum++) {
int one_change;
- block_prep(oap, &bd, pos.lnum, FALSE);
+ block_prep(oap, &bd, pos.lnum, false);
pos.col = bd.textcol;
one_change = swapchars(oap->op_type, &pos, bd.textlen);
did_change |= one_change;
}
- if (did_change)
- changed_lines(oap->start.lnum, 0, oap->end.lnum + 1, 0L);
+ if (did_change) {
+ changed_lines(oap->start.lnum, 0, oap->end.lnum + 1, 0L, true);
+ }
} else { // not block mode
if (oap->motion_type == kMTLineWise) {
oap->start.col = 0;
@@ -1863,7 +1891,7 @@ void op_tilde(oparg_T *oap)
}
if (did_change) {
changed_lines(oap->start.lnum, oap->start.col, oap->end.lnum + 1,
- 0L);
+ 0L, true);
}
}
@@ -1930,13 +1958,12 @@ int swapchar(int op_type, pos_T *pos)
if (c >= 0x80 && op_type == OP_ROT13)
return FALSE;
- if (op_type == OP_UPPER && c == 0xdf
- && (enc_latin1like || STRCMP(p_enc, "iso-8859-2") == 0)) {
+ if (op_type == OP_UPPER && c == 0xdf) {
pos_T sp = curwin->w_cursor;
/* Special handling of German sharp s: change to "SS". */
curwin->w_cursor = *pos;
- del_char(FALSE);
+ del_char(false);
ins_char('S');
ins_char('S');
curwin->w_cursor = sp;
@@ -1946,16 +1973,18 @@ int swapchar(int op_type, pos_T *pos)
if (enc_dbcs != 0 && c >= 0x100) /* No lower/uppercase letter */
return FALSE;
nc = c;
- if (vim_islower(c)) {
- if (op_type == OP_ROT13)
+ if (mb_islower(c)) {
+ if (op_type == OP_ROT13) {
nc = ROT13(c, 'a');
- else if (op_type != OP_LOWER)
- nc = vim_toupper(c);
- } else if (vim_isupper(c)) {
- if (op_type == OP_ROT13)
+ } else if (op_type != OP_LOWER) {
+ nc = mb_toupper(c);
+ }
+ } else if (mb_isupper(c)) {
+ if (op_type == OP_ROT13) {
nc = ROT13(c, 'A');
- else if (op_type != OP_UPPER)
- nc = vim_tolower(c);
+ } else if (op_type != OP_UPPER) {
+ nc = mb_tolower(c);
+ }
}
if (nc != c) {
if (enc_utf8 && (c >= 0x80 || nc >= 0x80)) {
@@ -1980,6 +2009,7 @@ void op_insert(oparg_T *oap, long count1)
{
long ins_len, pre_textlen = 0;
char_u *firstline, *ins_text;
+ colnr_T ind_pre = 0;
struct block_def bd;
int i;
pos_T t1;
@@ -2008,11 +2038,15 @@ void op_insert(oparg_T *oap, long count1)
--curwin->w_cursor.col;
ve_flags = old_ve_flags;
}
- /* Get the info about the block before entering the text */
- block_prep(oap, &bd, oap->start.lnum, TRUE);
+ // Get the info about the block before entering the text
+ block_prep(oap, &bd, oap->start.lnum, true);
+ // Get indent information
+ ind_pre = (colnr_T)getwhitecols_curline();
firstline = ml_get(oap->start.lnum) + bd.textcol;
- if (oap->op_type == OP_APPEND)
+
+ if (oap->op_type == OP_APPEND) {
firstline += bd.textlen;
+ }
pre_textlen = (long)STRLEN(firstline);
}
@@ -2038,15 +2072,16 @@ void op_insert(oparg_T *oap, long count1)
curwin->w_cursor = oap->end;
check_cursor_col();
- /* Works just like an 'i'nsert on the next character. */
- if (!lineempty(curwin->w_cursor.lnum)
- && oap->start_vcol != oap->end_vcol)
+ // Works just like an 'i'nsert on the next character.
+ if (!LINEEMPTY(curwin->w_cursor.lnum)
+ && oap->start_vcol != oap->end_vcol) {
inc_cursor();
+ }
}
}
t1 = oap->start;
- edit(NUL, false, (linenr_T)count1);
+ (void)edit(NUL, false, (linenr_T)count1);
// When a tab was inserted, and the characters in front of the tab
// have been converted to a tab as well, the column of the cursor
@@ -2064,10 +2099,23 @@ void op_insert(oparg_T *oap, long count1)
if (oap->motion_type == kMTBlockWise) {
struct block_def bd2;
-
- /* The user may have moved the cursor before inserting something, try
- * to adjust the block for that. */
- if (oap->start.lnum == curbuf->b_op_start_orig.lnum && !bd.is_MAX) {
+ bool did_indent = false;
+
+ // if indent kicked in, the firstline might have changed
+ // but only do that, if the indent actually increased
+ const colnr_T ind_post = (colnr_T)getwhitecols_curline();
+ if (curbuf->b_op_start.col > ind_pre && ind_post > ind_pre) {
+ bd.textcol += ind_post - ind_pre;
+ bd.start_vcol += ind_post - ind_pre;
+ did_indent = true;
+ }
+
+ // The user may have moved the cursor before inserting something, try
+ // to adjust the block for that. But only do it, if the difference
+ // does not come from indent kicking in.
+ if (oap->start.lnum == curbuf->b_op_start_orig.lnum
+ && !bd.is_MAX
+ && !did_indent) {
if (oap->op_type == OP_INSERT
&& oap->start.col + oap->start.coladd
!= curbuf->b_op_start_orig.col + curbuf->b_op_start_orig.coladd) {
@@ -2096,7 +2144,7 @@ void op_insert(oparg_T *oap, long count1)
* tabs. Get the starting column again and correct the length.
* Don't do this when "$" used, end-of-line will have changed.
*/
- block_prep(oap, &bd2, oap->start.lnum, TRUE);
+ block_prep(oap, &bd2, oap->start.lnum, true);
if (!bd.is_MAX || bd2.textlen < bd.textlen) {
if (oap->op_type == OP_APPEND) {
pre_textlen += bd2.textlen - bd.textlen;
@@ -2111,9 +2159,17 @@ void op_insert(oparg_T *oap, long count1)
* Subsequent calls to ml_get() flush the firstline data - take a
* copy of the required string.
*/
- firstline = ml_get(oap->start.lnum) + bd.textcol;
- if (oap->op_type == OP_APPEND)
- firstline += bd.textlen;
+ firstline = ml_get(oap->start.lnum);
+ const size_t len = STRLEN(firstline);
+ colnr_T add = bd.textcol;
+ if (oap->op_type == OP_APPEND) {
+ add += bd.textlen;
+ }
+ if ((size_t)add > len) {
+ firstline += len; // short line, point to the NUL
+ } else {
+ firstline += add;
+ }
ins_len = (long)STRLEN(firstline) - pre_textlen;
if (pre_textlen >= 0 && ins_len > 0) {
ins_text = vim_strnsave(firstline, (size_t)ins_len);
@@ -2155,7 +2211,7 @@ int op_change(oparg_T *oap)
if (!p_paste && curbuf->b_p_si
&& !curbuf->b_p_cin
)
- can_si = TRUE; /* It's like opening a new line, do si */
+ can_si = true; // It's like opening a new line, do si
}
/* First delete the text in the region. In an empty buffer only need to
@@ -2166,9 +2222,10 @@ int op_change(oparg_T *oap)
} else if (op_delete(oap) == FAIL)
return FALSE;
- if ((l > curwin->w_cursor.col) && !lineempty(curwin->w_cursor.lnum)
- && !virtual_op)
+ if ((l > curwin->w_cursor.col) && !LINEEMPTY(curwin->w_cursor.lnum)
+ && !virtual_op) {
inc_cursor();
+ }
// check for still on same line (<CR> in inserted text meaningless)
// skip blank lines too
@@ -2180,7 +2237,7 @@ int op_change(oparg_T *oap)
}
firstline = ml_get(oap->start.lnum);
pre_textlen = (long)STRLEN(firstline);
- pre_indent = (long)(skipwhite(firstline) - firstline);
+ pre_indent = (long)getwhitecols(firstline);
bd.textcol = curwin->w_cursor.col;
}
@@ -2201,7 +2258,7 @@ int op_change(oparg_T *oap)
// the indent, exclude that indent change from the inserted text.
firstline = ml_get(oap->start.lnum);
if (bd.textcol > (colnr_T)pre_indent) {
- long new_indent = (long)(skipwhite(firstline) - firstline);
+ long new_indent = (long)getwhitecols(firstline);
pre_textlen += new_indent - pre_indent;
bd.textcol += (colnr_T)(new_indent - pre_indent);
@@ -2215,7 +2272,7 @@ int op_change(oparg_T *oap)
STRLCPY(ins_text, firstline + bd.textcol, ins_len + 1);
for (linenr = oap->start.lnum + 1; linenr <= oap->end.lnum;
linenr++) {
- block_prep(oap, &bd, linenr, TRUE);
+ block_prep(oap, &bd, linenr, true);
if (!bd.is_short || virtual_op) {
pos_T vpos;
@@ -2239,11 +2296,11 @@ int op_change(oparg_T *oap)
offset += ins_len;
oldp += bd.textcol;
STRMOVE(newp + offset, oldp);
- ml_replace(linenr, newp, FALSE);
+ ml_replace(linenr, newp, false);
}
}
check_cursor();
- changed_lines(oap->start.lnum + 1, 0, oap->end.lnum + 1, 0L);
+ changed_lines(oap->start.lnum + 1, 0, oap->end.lnum + 1, 0L, true);
xfree(ins_text);
}
}
@@ -2310,7 +2367,7 @@ bool op_yank(oparg_T *oap, bool message)
yankreg_T *reg = get_yank_register(oap->regname, YREG_YANK);
op_yank_reg(oap, message, reg, is_append_register(oap->regname));
set_clipboard(oap->regname, reg);
- yank_do_autocmd(oap, reg);
+ do_autocmd_textyankpost(oap, reg);
return true;
}
@@ -2406,11 +2463,10 @@ static void op_yank_reg(oparg_T *oap, bool message, yankreg_T *reg, bool append)
if (virtual_op) {
getvcol(curwin, &oap->end, &cs, NULL, &ce);
if (p[endcol] == NUL || (cs + oap->end.coladd < ce
- /* Don't add space for double-wide
- * char; endcol will be on last byte
- * of multi-byte char. */
- && (*mb_head_off)(p, p + endcol) == 0
- )) {
+ // Don't add space for double-wide
+ // char; endcol will be on last byte
+ // of multi-byte char.
+ && utf_head_off(p, p + endcol) == 0)) {
if (oap->start.lnum == oap->end.lnum
&& oap->start.col == oap->end.col) {
/* Special case: inside a single char */
@@ -2485,19 +2541,27 @@ static void op_yank_reg(oparg_T *oap, bool message, yankreg_T *reg, bool append)
}
// Some versions of Vi use ">=" here, some don't...
if (yanklines > (size_t)p_report) {
+ char namebuf[100];
+
+ if (oap->regname == NUL) {
+ *namebuf = NUL;
+ } else {
+ vim_snprintf(namebuf, sizeof(namebuf), _(" into \"%c"), oap->regname);
+ }
+
// redisplay now, so message is not deleted
update_topline_redraw();
if (yanklines == 1) {
if (yank_type == kMTBlockWise) {
- MSG(_("block of 1 line yanked"));
+ smsg(_("block of 1 line yanked%s"), namebuf);
} else {
- MSG(_("1 line yanked"));
+ smsg(_("1 line yanked%s"), namebuf);
}
} else if (yank_type == kMTBlockWise) {
- smsg(_("block of %" PRId64 " lines yanked"),
- (int64_t)yanklines);
+ smsg(_("block of %" PRId64 " lines yanked%s"),
+ (int64_t)yanklines, namebuf);
} else {
- smsg(_("%" PRId64 " lines yanked"), (int64_t)yanklines);
+ smsg(_("%" PRId64 " lines yanked%s"), (int64_t)yanklines, namebuf);
}
}
}
@@ -2533,7 +2597,7 @@ static void yank_copy_line(yankreg_T *reg, struct block_def *bd, size_t y_idx)
///
/// @param oap Operator arguments.
/// @param reg The yank register used.
-static void yank_do_autocmd(oparg_T *oap, yankreg_T *reg)
+static void do_autocmd_textyankpost(oparg_T *oap, yankreg_T *reg)
FUNC_ATTR_NONNULL_ALL
{
static bool recursive = false;
@@ -2550,33 +2614,33 @@ static void yank_do_autocmd(oparg_T *oap, yankreg_T *reg)
dict_T *dict = get_vim_var_dict(VV_EVENT);
// the yanked text
- list_T *list = list_alloc();
+ list_T *const list = tv_list_alloc((ptrdiff_t)reg->y_size);
for (size_t i = 0; i < reg->y_size; i++) {
- list_append_string(list, reg->y_array[i], -1);
+ tv_list_append_string(list, (const char *)reg->y_array[i], -1);
}
- list->lv_lock = VAR_FIXED;
- dict_add_list(dict, "regcontents", list);
+ tv_list_set_lock(list, VAR_FIXED);
+ tv_dict_add_list(dict, S_LEN("regcontents"), list);
// the register type
char buf[NUMBUFLEN+2];
format_reg_type(reg->y_type, reg->y_width, buf, ARRAY_SIZE(buf));
- dict_add_nr_str(dict, "regtype", 0, (char_u *)buf);
+ tv_dict_add_str(dict, S_LEN("regtype"), buf);
// name of requested register or the empty string for an unnamed operation.
buf[0] = (char)oap->regname;
buf[1] = NUL;
- dict_add_nr_str(dict, "regname", 0, (char_u *)buf);
+ tv_dict_add_str(dict, S_LEN("regname"), buf);
// kind of operation (yank/delete/change)
buf[0] = (char)get_op_char(oap->op_type);
buf[1] = NUL;
- dict_add_nr_str(dict, "operator", 0, (char_u *)buf);
+ tv_dict_add_str(dict, S_LEN("operator"), buf);
- dict_set_keys_readonly(dict);
+ tv_dict_set_keys_readonly(dict);
textlock++;
apply_autocmds(EVENT_TEXTYANKPOST, NULL, NULL, false, curbuf);
textlock--;
- dict_clear(dict);
+ tv_dict_clear(dict);
recursive = false;
}
@@ -2606,7 +2670,6 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
colnr_T vcol;
int delcount;
int incr = 0;
- long j;
struct block_def bd;
char_u **y_array = NULL;
long nr_lines = 0;
@@ -2618,7 +2681,7 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
int lendiff = 0;
pos_T old_pos;
char_u *insert_string = NULL;
- int allocated = FALSE;
+ bool allocated = false;
long cnt;
if (flags & PUT_FIXINDENT)
@@ -2632,12 +2695,81 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
* special characters (newlines, etc.).
*/
if (regname == '.') {
- (void)stuff_inserted((dir == FORWARD ? (count == -1 ? 'o' : 'a') :
- (count == -1 ? 'O' : 'i')), count, FALSE);
- /* Putting the text is done later, so can't really move the cursor to
- * the next character. Use "l" to simulate it. */
- if ((flags & PUT_CURSEND) && gchar_cursor() != NUL)
- stuffcharReadbuff('l');
+ bool non_linewise_vis = (VIsual_active && VIsual_mode != 'V');
+
+ // PUT_LINE has special handling below which means we use 'i' to start.
+ char command_start_char = non_linewise_vis ? 'c' :
+ (flags & PUT_LINE ? 'i' : (dir == FORWARD ? 'a' : 'i'));
+
+ // To avoid 'autoindent' on linewise puts, create a new line with `:put _`.
+ if (flags & PUT_LINE) {
+ do_put('_', NULL, dir, 1, PUT_LINE);
+ }
+
+ // If given a count when putting linewise, we stuff the readbuf with the
+ // dot register 'count' times split by newlines.
+ if (flags & PUT_LINE) {
+ stuffcharReadbuff(command_start_char);
+ for (; count > 0; count--) {
+ (void)stuff_inserted(NUL, 1, count != 1);
+ if (count != 1) {
+ // To avoid 'autoindent' affecting the text, use Ctrl_U to remove any
+ // whitespace. Can't just insert Ctrl_U into readbuf1, this would go
+ // back to the previous line in the case of 'noautoindent' and
+ // 'backspace' includes "eol". So we insert a dummy space for Ctrl_U
+ // to consume.
+ stuffReadbuff("\n ");
+ stuffcharReadbuff(Ctrl_U);
+ }
+ }
+ } else {
+ (void)stuff_inserted(command_start_char, count, false);
+ }
+
+ // Putting the text is done later, so can't move the cursor to the next
+ // character. Simulate it with motion commands after the insert.
+ if (flags & PUT_CURSEND) {
+ if (flags & PUT_LINE) {
+ stuffReadbuff("j0");
+ } else {
+ // Avoid ringing the bell from attempting to move into the space after
+ // the current line. We can stuff the readbuffer with "l" if:
+ // 1) 'virtualedit' is "all" or "onemore"
+ // 2) We are not at the end of the line
+ // 3) We are not (one past the end of the line && on the last line)
+ // This allows a visual put over a selection one past the end of the
+ // line joining the current line with the one below.
+
+ // curwin->w_cursor.col marks the byte position of the cursor in the
+ // currunt line. It increases up to a max of
+ // STRLEN(ml_get(curwin->w_cursor.lnum)). With 'virtualedit' and the
+ // cursor past the end of the line, curwin->w_cursor.coladd is
+ // incremented instead of curwin->w_cursor.col.
+ char_u *cursor_pos = get_cursor_pos_ptr();
+ bool one_past_line = (*cursor_pos == NUL);
+ bool eol = false;
+ if (!one_past_line) {
+ eol = (*(cursor_pos + mb_ptr2len(cursor_pos)) == NUL);
+ }
+
+ bool ve_allows = (ve_flags == VE_ALL || ve_flags == VE_ONEMORE);
+ bool eof = curbuf->b_ml.ml_line_count == curwin->w_cursor.lnum
+ && one_past_line;
+ if (ve_allows || !(eol || eof)) {
+ stuffcharReadbuff('l');
+ }
+ }
+ } else if (flags & PUT_LINE) {
+ stuffReadbuff("g'[");
+ }
+
+ // So the 'u' command restores cursor position after ".p, save the cursor
+ // position now (though not saving any text).
+ if (command_start_char == 'a') {
+ if (u_save(curwin->w_cursor.lnum, curwin->w_cursor.lnum + 1) == FAIL) {
+ return;
+ }
+ }
return;
}
@@ -2645,16 +2777,16 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
* For special registers '%' (file name), '#' (alternate file name) and
* ':' (last command line), etc. we have to create a fake yank register.
*/
- if (get_spec_reg(regname, &insert_string, &allocated, TRUE)) {
- if (insert_string == NULL)
+ if (get_spec_reg(regname, &insert_string, &allocated, true)) {
+ if (insert_string == NULL) {
return;
+ }
}
if (!curbuf->terminal) {
// Autocommands may be executed when saving lines for undo, which may make
// y_array invalid. Start undo now to avoid that.
if (u_save(curwin->w_cursor.lnum, curwin->w_cursor.lnum + 1) == FAIL) {
- ELOG(_("Failed to save undo information"));
return;
}
}
@@ -2707,16 +2839,7 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
}
if (curbuf->terminal) {
- for (int i = 0; i < count; i++) {
- // feed the lines to the terminal
- for (size_t j = 0; j < y_size; j++) {
- if (j) {
- // terminate the previous line
- terminal_send(curbuf->terminal, "\n", 1);
- }
- terminal_send(curbuf->terminal, (char *)y_array[j], STRLEN(y_array[j]));
- }
- }
+ terminal_paste(count, y_array, y_size);
return;
}
@@ -2729,7 +2852,7 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
}
char_u *p = get_cursor_pos_ptr();
if (dir == FORWARD && *p != NUL) {
- mb_ptr_adv(p);
+ MB_PTR_ADV(p);
}
ptr = vim_strsave(p);
ml_append(curwin->w_cursor.lnum, ptr, (colnr_T)0, false);
@@ -2738,7 +2861,7 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
oldp = get_cursor_line_ptr();
p = oldp + curwin->w_cursor.col;
if (dir == FORWARD && *p != NUL) {
- mb_ptr_adv(p);
+ MB_PTR_ADV(p);
}
ptr = vim_strnsave(oldp, (size_t)(p - oldp));
ml_replace(curwin->w_cursor.lnum, ptr, false);
@@ -2774,25 +2897,30 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
}
} else if (y_type == kMTLineWise) {
lnum = curwin->w_cursor.lnum;
- /* Correct line number for closed fold. Don't move the cursor yet,
- * u_save() uses it. */
- if (dir == BACKWARD)
+ // Correct line number for closed fold. Don't move the cursor yet,
+ // u_save() uses it.
+ if (dir == BACKWARD) {
(void)hasFolding(lnum, &lnum, NULL);
- else
+ } else {
(void)hasFolding(lnum, NULL, &lnum);
- if (dir == FORWARD)
- ++lnum;
- /* In an empty buffer the empty line is going to be replaced, include
- * it in the saved lines. */
- if ((bufempty() ? u_save(0, 2) : u_save(lnum - 1, lnum)) == FAIL)
+ }
+ if (dir == FORWARD) {
+ lnum++;
+ }
+ // In an empty buffer the empty line is going to be replaced, include
+ // it in the saved lines.
+ if ((BUFEMPTY() ? u_save(0, 2) : u_save(lnum - 1, lnum)) == FAIL) {
goto end;
- if (dir == FORWARD)
+ }
+ if (dir == FORWARD) {
curwin->w_cursor.lnum = lnum - 1;
- else
+ } else {
curwin->w_cursor.lnum = lnum;
- curbuf->b_op_start = curwin->w_cursor; /* for mark_adjust() */
- } else if (u_save_cursor() == FAIL)
+ }
+ curbuf->b_op_start = curwin->w_cursor; // for mark_adjust()
+ } else if (u_save_cursor() == FAIL) {
goto end;
+ }
yanklen = (int)STRLEN(y_array[0]);
@@ -2826,14 +2954,12 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
else
getvcol(curwin, &curwin->w_cursor, NULL, NULL, &col);
- if (has_mbyte)
- /* move to start of next multi-byte character */
- curwin->w_cursor.col += (*mb_ptr2len)(get_cursor_pos_ptr());
- else if (c != TAB || ve_flags != VE_ALL)
- ++curwin->w_cursor.col;
- ++col;
- } else
+ // move to start of next multi-byte character
+ curwin->w_cursor.col += (*mb_ptr2len)(get_cursor_pos_ptr());
+ col++;
+ } else {
getvcol(curwin, &curwin->w_cursor, &col, NULL, &endcol2);
+ }
col += curwin->w_cursor.coladd;
if (ve_flags == VE_ALL
@@ -2887,8 +3013,7 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
bd.startspaces = incr - bd.endspaces;
--bd.textcol;
delcount = 1;
- if (has_mbyte)
- bd.textcol -= (*mb_head_off)(oldp, oldp + bd.textcol);
+ bd.textcol -= utf_head_off(oldp, oldp + bd.textcol);
if (oldp[bd.textcol] != TAB) {
/* Only a Tab can be split into spaces. Other
* characters will have to be moved to after the
@@ -2900,12 +3025,14 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
yanklen = (int)STRLEN(y_array[i]);
- /* calculate number of spaces required to fill right side of block*/
+ // calculate number of spaces required to fill right side of block
spaces = y_width + 1;
- for (j = 0; j < yanklen; j++)
+ for (long j = 0; j < yanklen; j++) {
spaces -= lbr_chartabsize(NULL, &y_array[i][j], 0);
- if (spaces < 0)
+ }
+ if (spaces < 0) {
spaces = 0;
+ }
// insert the new text
totlen = (size_t)(count * (yanklen + spaces)
@@ -2915,21 +3042,21 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
ptr = newp;
memmove(ptr, oldp, (size_t)bd.textcol);
ptr += bd.textcol;
- /* may insert some spaces before the new text */
+ // may insert some spaces before the new text
memset(ptr, ' ', (size_t)bd.startspaces);
ptr += bd.startspaces;
- /* insert the new text */
- for (j = 0; j < count; ++j) {
+ // insert the new text
+ for (long j = 0; j < count; j++) {
memmove(ptr, y_array[i], (size_t)yanklen);
ptr += yanklen;
- /* insert block's trailing spaces only if there's text behind */
+ // insert block's trailing spaces only if there's text behind
if ((j < count - 1 || !shortline) && spaces) {
memset(ptr, ' ', (size_t)spaces);
ptr += spaces;
}
}
- /* may insert some spaces after the new text */
+ // may insert some spaces after the new text
memset(ptr, ' ', (size_t)bd.endspaces);
ptr += bd.endspaces;
// move the text after the cursor to the end of the line.
@@ -2942,7 +3069,7 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
curwin->w_cursor.col += bd.startspaces;
}
- changed_lines(lnum, 0, curwin->w_cursor.lnum, nr_lines);
+ changed_lines(lnum, 0, curwin->w_cursor.lnum, nr_lines, true);
/* Set '[ mark. */
curbuf->b_op_start = curwin->w_cursor;
@@ -2970,21 +3097,13 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
// if type is kMTCharWise, FORWARD is the same as BACKWARD on the next
// char
if (dir == FORWARD && gchar_cursor() != NUL) {
- if (has_mbyte) {
- int bytelen = (*mb_ptr2len)(get_cursor_pos_ptr());
-
- /* put it on the next of the multi-byte character. */
- col += bytelen;
- if (yanklen) {
- curwin->w_cursor.col += bytelen;
- curbuf->b_op_end.col += bytelen;
- }
- } else {
- ++col;
- if (yanklen) {
- ++curwin->w_cursor.col;
- ++curbuf->b_op_end.col;
- }
+ int bytelen = (*mb_ptr2len)(get_cursor_pos_ptr());
+
+ // put it on the next of the multi-byte character.
+ col += bytelen;
+ if (yanklen) {
+ curwin->w_cursor.col += bytelen;
+ curbuf->b_op_end.col += bytelen;
}
}
curbuf->b_op_start = curwin->w_cursor;
@@ -2996,15 +3115,26 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
--lnum;
new_cursor = curwin->w_cursor;
- /*
- * simple case: insert into current line
- */
+ // simple case: insert into current line
if (y_type == kMTCharWise && y_size == 1) {
+ linenr_T end_lnum = 0; // init for gcc
+
+ if (VIsual_active) {
+ end_lnum = curbuf->b_visual.vi_end.lnum;
+ if (end_lnum < curbuf->b_visual.vi_start.lnum) {
+ end_lnum = curbuf->b_visual.vi_start.lnum;
+ }
+ }
+
do {
totlen = (size_t)(count * yanklen);
if (totlen > 0) {
oldp = ml_get(lnum);
- newp = (char_u *) xmalloc((size_t)(STRLEN(oldp) + totlen + 1));
+ if (VIsual_active && col > (int)STRLEN(oldp)) {
+ lnum++;
+ continue;
+ }
+ newp = (char_u *)xmalloc((size_t)(STRLEN(oldp) + totlen + 1));
memmove(newp, oldp, (size_t)col);
ptr = newp + col;
for (i = 0; i < (size_t)count; i++) {
@@ -3012,17 +3142,18 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
ptr += yanklen;
}
STRMOVE(ptr, oldp + col);
- ml_replace(lnum, newp, FALSE);
- /* Place cursor on last putted char. */
+ ml_replace(lnum, newp, false);
+ // Place cursor on last putted char.
if (lnum == curwin->w_cursor.lnum) {
- /* make sure curwin->w_virtcol is updated */
+ // make sure curwin->w_virtcol is updated
changed_cline_bef_curs();
curwin->w_cursor.col += (colnr_T)(totlen - 1);
}
}
- if (VIsual_active)
+ if (VIsual_active) {
lnum++;
- } while (VIsual_active && lnum <= curbuf->b_visual.vi_end.lnum);
+ }
+ } while (VIsual_active && lnum <= end_lnum);
if (VIsual_active) { /* reset lnum to the last visual line */
lnum--;
@@ -3058,7 +3189,7 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
memmove(newp, oldp, (size_t)col);
/* append to first line */
memmove(newp + col, y_array[0], (size_t)(yanklen + 1));
- ml_replace(lnum, newp, FALSE);
+ ml_replace(lnum, newp, false);
curwin->w_cursor.lnum = lnum;
i = 1;
@@ -3104,16 +3235,21 @@ error:
if (dir == FORWARD)
curbuf->b_op_start.lnum++;
}
- mark_adjust(curbuf->b_op_start.lnum + (y_type == kMTCharWise),
- (linenr_T)MAXLNUM, nr_lines, 0L);
+ // Skip mark_adjust when adding lines after the last one, there
+ // can't be marks there. But still needed in diff mode.
+ if (curbuf->b_op_start.lnum + (y_type == kMTCharWise) - 1 + nr_lines
+ < curbuf->b_ml.ml_line_count || curwin->w_p_diff) {
+ mark_adjust(curbuf->b_op_start.lnum + (y_type == kMTCharWise),
+ (linenr_T)MAXLNUM, nr_lines, 0L, false);
+ }
// note changed text for displaying and folding
if (y_type == kMTCharWise) {
changed_lines(curwin->w_cursor.lnum, col,
- curwin->w_cursor.lnum + 1, nr_lines);
+ curwin->w_cursor.lnum + 1, nr_lines, true);
} else {
changed_lines(curbuf->b_op_start.lnum, 0,
- curbuf->b_op_start.lnum, nr_lines);
+ curbuf->b_op_start.lnum, nr_lines, true);
}
/* put '] mark at last inserted character */
@@ -3232,7 +3368,7 @@ void ex_display(exarg_T *eap)
if (arg != NULL && *arg == NUL)
arg = NULL;
- int attr = hl_attr(HLF_8);
+ int attr = HL_ATTR(HLF_8);
/* Highlight title */
MSG_PUTS_TITLE(_("\n--- Registers ---"));
@@ -3254,10 +3390,11 @@ void ex_display(exarg_T *eap)
get_clipboard(name, &yb, true);
- if (name == vim_tolower(redir_reg)
- || (redir_reg == '"' && yb == y_previous))
- continue; /* do not list register being written to, the
- * pointer can be freed */
+ if (name == mb_tolower(redir_reg)
+ || (redir_reg == '"' && yb == y_previous)) {
+ continue; // do not list register being written to, the
+ // pointer can be freed
+ }
if (yb->y_array != NULL) {
msg_putchar('\n');
@@ -3370,43 +3507,47 @@ dis_msg (
os_breakcheck();
}
-/*
- * If "process" is TRUE and the line begins with a comment leader (possibly
- * after some white space), return a pointer to the text after it. Put a boolean
- * value indicating whether the line ends with an unclosed comment in
- * "is_comment".
- * line - line to be processed,
- * process - if FALSE, will only check whether the line ends with an unclosed
- * comment,
- * include_space - whether to also skip space following the comment leader,
- * is_comment - will indicate whether the current line ends with an unclosed
- * comment.
- */
-static char_u *skip_comment(char_u *line, int process, int include_space, int *is_comment)
+/// If \p "process" is true and the line begins with a comment leader (possibly
+/// after some white space), return a pointer to the text after it.
+/// Put a boolean value indicating whether the line ends with an unclosed
+/// comment in "is_comment".
+///
+/// @param line - line to be processed
+/// @param process - if false, will only check whether the line ends
+/// with an unclosed comment,
+/// @param include_space - whether to skip space following the comment leader
+/// @param[out] is_comment - whether the current line ends with an unclosed
+/// comment.
+char_u *skip_comment(
+ char_u *line, bool process, bool include_space, bool *is_comment
+)
{
char_u *comment_flags = NULL;
int lead_len;
int leader_offset = get_last_leader_offset(line, &comment_flags);
- *is_comment = FALSE;
+ *is_comment = false;
if (leader_offset != -1) {
/* Let's check whether the line ends with an unclosed comment.
* If the last comment leader has COM_END in flags, there's no comment.
*/
while (*comment_flags) {
if (*comment_flags == COM_END
- || *comment_flags == ':')
+ || *comment_flags == ':') {
break;
- ++comment_flags;
+ }
+ comment_flags++;
+ }
+ if (*comment_flags != COM_END) {
+ *is_comment = true;
}
- if (*comment_flags != COM_END)
- *is_comment = TRUE;
}
- if (process == FALSE)
+ if (process == false) {
return line;
+ }
- lead_len = get_leader_len(line, &comment_flags, FALSE, include_space);
+ lead_len = get_leader_len(line, &comment_flags, false, include_space);
if (lead_len == 0)
return line;
@@ -3428,8 +3569,9 @@ static char_u *skip_comment(char_u *line, int process, int include_space, int *i
* starting with a closing part of a three-part comment. That's good,
* because we don't want to remove those as this would be annoying.
*/
- if (*comment_flags == ':' || *comment_flags == NUL)
+ if (*comment_flags == ':' || *comment_flags == NUL) {
line += lead_len;
+ }
return line;
}
@@ -3463,7 +3605,7 @@ int do_join(size_t count,
int *comments = NULL;
int remove_comments = (use_formatoptions == TRUE)
&& has_format_option(FO_REMOVE_COMS);
- int prev_was_comment;
+ bool prev_was_comment = false;
if (save_undo && u_save(curwin->w_cursor.lnum - 1,
curwin->w_cursor.lnum + (linenr_T)count) == FAIL) {
@@ -3487,26 +3629,25 @@ int do_join(size_t count,
curwin->w_buffer->b_op_start.col = (colnr_T)STRLEN(curr);
}
if (remove_comments) {
- /* We don't want to remove the comment leader if the
- * previous line is not a comment. */
+ // We don't want to remove the comment leader if the
+ // previous line is not a comment.
if (t > 0 && prev_was_comment) {
-
- char_u *new_curr = skip_comment(curr, TRUE, insert_space,
- &prev_was_comment);
+ char_u *new_curr = skip_comment(curr, true, insert_space,
+ &prev_was_comment);
comments[t] = (int)(new_curr - curr);
curr = new_curr;
- } else
- curr = skip_comment(curr, FALSE, insert_space,
- &prev_was_comment);
+ } else {
+ curr = skip_comment(curr, false, insert_space, &prev_was_comment);
+ }
}
if (insert_space && t > 0) {
curr = skipwhite(curr);
if (*curr != ')' && currsize != 0 && endcurr1 != TAB
&& (!has_format_option(FO_MBYTE_JOIN)
- || (mb_ptr2char(curr) < 0x100 && endcurr1 < 0x100))
+ || (utf_ptr2char(curr) < 0x100 && endcurr1 < 0x100))
&& (!has_format_option(FO_MBYTE_JOIN2)
- || mb_ptr2char(curr) < 0x100 || endcurr1 < 0x100)
+ || utf_ptr2char(curr) < 0x100 || endcurr1 < 0x100)
) {
/* don't add a space if the line is ending in a space */
if (endcurr1 == ' ')
@@ -3523,18 +3664,12 @@ int do_join(size_t count,
sumsize += currsize + spaces[t];
endcurr1 = endcurr2 = NUL;
if (insert_space && currsize > 0) {
- if (has_mbyte) {
- cend = curr + currsize;
- mb_ptr_back(curr, cend);
- endcurr1 = (*mb_ptr2char)(cend);
- if (cend > curr) {
- mb_ptr_back(curr, cend);
- endcurr2 = (*mb_ptr2char)(cend);
- }
- } else {
- endcurr1 = *(curr + currsize - 1);
- if (currsize > 1)
- endcurr2 = *(curr + currsize - 2);
+ cend = curr + currsize;
+ MB_PTR_BACK(curr, cend);
+ endcurr1 = utf_ptr2char(cend);
+ if (cend > curr) {
+ MB_PTR_BACK(curr, cend);
+ endcurr2 = utf_ptr2char(cend);
}
}
line_breakcheck();
@@ -3577,7 +3712,7 @@ int do_join(size_t count,
curr = skipwhite(curr);
currsize = (int)STRLEN(curr);
}
- ml_replace(curwin->w_cursor.lnum, newp, FALSE);
+ ml_replace(curwin->w_cursor.lnum, newp, false);
if (setmark) {
// Set the '] mark.
@@ -3588,7 +3723,7 @@ int do_join(size_t count,
/* Only report the change in the first line here, del_lines() will report
* the deleted line. */
changed_lines(curwin->w_cursor.lnum, currsize,
- curwin->w_cursor.lnum + 1, 0L);
+ curwin->w_cursor.lnum + 1, 0L, true);
/*
* Delete following lines. To do this we move the cursor there
@@ -3774,6 +3909,7 @@ fex_format (
int use_sandbox = was_set_insecurely((char_u *)"formatexpr",
OPT_LOCAL);
int r;
+ char_u *fex;
/*
* Set v:lnum to the first line number and v:count to the number of lines.
@@ -3783,16 +3919,19 @@ fex_format (
set_vim_var_nr(VV_COUNT, (varnumber_T)count);
set_vim_var_char(c);
- /*
- * Evaluate the function.
- */
- if (use_sandbox)
- ++sandbox;
- r = eval_to_number(curbuf->b_p_fex);
- if (use_sandbox)
- --sandbox;
+ // Make a copy, the option could be changed while calling it.
+ fex = vim_strsave(curbuf->b_p_fex);
+ // Evaluate the function.
+ if (use_sandbox) {
+ sandbox++;
+ }
+ r = (int)eval_to_number(fex);
+ if (use_sandbox) {
+ sandbox--;
+ }
set_vim_var_string(VV_CHAR, NULL, -1);
+ xfree(fex);
return r;
}
@@ -3907,7 +4046,7 @@ format_lines (
&& (do_second_indent || do_number_indent)
&& prev_is_end_par
&& curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count) {
- if (do_second_indent && !lineempty(curwin->w_cursor.lnum + 1)) {
+ if (do_second_indent && !LINEEMPTY(curwin->w_cursor.lnum + 1)) {
if (leader_len == 0 && next_leader_len == 0) {
/* no comment found */
second_indent =
@@ -3993,10 +4132,9 @@ format_lines (
if (next_leader_len > 0) {
(void)del_bytes(next_leader_len, false, false);
mark_col_adjust(curwin->w_cursor.lnum, (colnr_T)0, 0L,
- (long)-next_leader_len);
- } else if (second_indent > 0) { /* the "leader" for FO_Q_SECOND */
- char_u *p = get_cursor_line_ptr();
- int indent = (int)(skipwhite(p) - p);
+ (long)-next_leader_len);
+ } else if (second_indent > 0) { // the "leader" for FO_Q_SECOND
+ int indent = (int)getwhitecols_curline();
if (indent > 0) {
(void)del_bytes(indent, FALSE, FALSE);
@@ -4125,7 +4263,8 @@ int paragraph_start(linenr_T lnum)
* - start/endspaces is the number of columns of the first/last yanked char
* that are to be yanked.
*/
-static void block_prep(oparg_T *oap, struct block_def *bdp, linenr_T lnum, int is_del)
+static void block_prep(oparg_T *oap, struct block_def *bdp, linenr_T lnum,
+ bool is_del)
{
int incr = 0;
char_u *pend;
@@ -4161,7 +4300,7 @@ static void block_prep(oparg_T *oap, struct block_def *bdp, linenr_T lnum, int i
bdp->pre_whitesp_c = 0;
}
prev_pstart = pstart;
- mb_ptr_adv(pstart);
+ MB_PTR_ADV(pstart);
}
bdp->start_char_vcols = incr;
if (bdp->start_vcol < oap->start_vcol) { /* line too short */
@@ -4254,7 +4393,7 @@ void op_addsub(oparg_T *oap, linenr_T Prenum1, bool g_cmd)
}
change_cnt = do_addsub(oap->op_type, &pos, 0, amount);
if (change_cnt) {
- changed_lines(pos.lnum, 0, pos.lnum + 1, 0L);
+ changed_lines(pos.lnum, 0, pos.lnum + 1, 0L, true);
}
} else {
int one_change;
@@ -4279,7 +4418,7 @@ void op_addsub(oparg_T *oap, linenr_T Prenum1, bool g_cmd)
length = (colnr_T)STRLEN(ml_get(pos.lnum));
} else {
// oap->motion_type == kMTCharWise
- if (!oap->inclusive) {
+ if (pos.lnum == oap->start.lnum && !oap->inclusive) {
dec(&(oap->end));
}
length = (colnr_T)STRLEN(ml_get(pos.lnum));
@@ -4310,7 +4449,7 @@ void op_addsub(oparg_T *oap, linenr_T Prenum1, bool g_cmd)
}
}
if (change_cnt) {
- changed_lines(oap->start.lnum, 0, oap->end.lnum + 1, 0L);
+ changed_lines(oap->start.lnum, 0, oap->end.lnum + 1, 0L, true);
}
if (!change_cnt && oap->is_VIsual) {
@@ -4349,8 +4488,8 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
char_u buf2[NUMBUFLEN];
int pre; // 'X' or 'x': hex; '0': octal; 'B' or 'b': bin
static bool hexupper = false; // 0xABC
- unsigned long n;
- unsigned long oldn;
+ uvarnumber_T n;
+ uvarnumber_T oldn;
char_u *ptr;
int c;
int todel;
@@ -4387,12 +4526,14 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
if (dobin) {
while (col > 0 && ascii_isbdigit(ptr[col])) {
col--;
+ col -= utf_head_off(ptr, ptr + col);
}
}
if (dohex) {
while (col > 0 && ascii_isxdigit(ptr[col])) {
col--;
+ col -= utf_head_off(ptr, ptr + col);
}
}
if (dobin
@@ -4400,6 +4541,7 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
&& !((col > 0
&& (ptr[col] == 'X' || ptr[col] == 'x')
&& ptr[col - 1] == '0'
+ && !utf_head_off(ptr, ptr + col - 1)
&& ascii_isxdigit(ptr[col + 1])))) {
// In case of binary/hexadecimal pattern overlap match, rescan
@@ -4407,6 +4549,7 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
while (col > 0 && ascii_isdigit(ptr[col])) {
col--;
+ col -= utf_head_off(ptr, ptr + col);
}
}
@@ -4414,14 +4557,17 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
&& col > 0
&& (ptr[col] == 'X' || ptr[col] == 'x')
&& ptr[col - 1] == '0'
+ && !utf_head_off(ptr, ptr + col - 1)
&& ascii_isxdigit(ptr[col + 1]))
|| (dobin
&& col > 0
&& (ptr[col] == 'B' || ptr[col] == 'b')
&& ptr[col - 1] == '0'
+ && !utf_head_off(ptr, ptr + col - 1)
&& ascii_isbdigit(ptr[col + 1]))) {
// Found hexadecimal or binary number, move to its start.
col--;
+ col -= utf_head_off(ptr, ptr + col);
} else {
// Search forward and then backward to find the start of number.
col = pos->col;
@@ -4443,15 +4589,18 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
if (visual) {
while (ptr[col] != NUL && length > 0 && !ascii_isdigit(ptr[col])
&& !(doalp && ASCII_ISALPHA(ptr[col]))) {
- col++;
- length--;
+ int mb_len = MB_PTR2LEN(ptr + col);
+
+ col += mb_len;
+ length -= mb_len;
}
if (length == 0) {
goto theend;
}
- if (col > pos->col && ptr[col - 1] == '-') {
+ if (col > pos->col && ptr[col - 1] == '-'
+ && !utf_head_off(ptr, ptr + col - 1)) {
negative = true;
was_positive = false;
}
@@ -4488,16 +4637,15 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
}
}
curwin->w_cursor.col = col;
- if (!did_change) {
- startpos = curwin->w_cursor;
- }
+ startpos = curwin->w_cursor;
did_change = true;
(void)del_char(false);
ins_char(firstdigit);
endpos = curwin->w_cursor;
curwin->w_cursor.col = col;
} else {
- if (col > 0 && ptr[col - 1] == '-' && !visual) {
+ if (col > 0 && ptr[col - 1] == '-'
+ && !utf_head_off(ptr, ptr + col - 1) && !visual) {
// negative number
col--;
negative = true;
@@ -4534,20 +4682,20 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
oldn = n;
- n = subtract ? n - (unsigned long) Prenum1
- : n + (unsigned long) Prenum1;
+ n = subtract ? n - (uvarnumber_T)Prenum1
+ : n + (uvarnumber_T)Prenum1;
// handle wraparound for decimal numbers
if (!pre) {
if (subtract) {
if (n > oldn) {
- n = 1 + (n ^ (unsigned long)-1);
+ n = 1 + (n ^ (uvarnumber_T)-1);
negative ^= true;
}
} else {
// add
if (n < oldn) {
- n = (n ^ (unsigned long)-1);
+ n = (n ^ (uvarnumber_T)-1);
negative ^= true;
}
}
@@ -4564,9 +4712,7 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
// Delete the old number.
curwin->w_cursor.col = col;
- if (!did_change) {
- startpos = curwin->w_cursor;
- }
+ startpos = curwin->w_cursor;
did_change = true;
todel = length;
c = gchar_cursor();
@@ -4593,11 +4739,8 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
// When there are many leading zeros it could be very long.
// Allocate a bit too much.
buf1 = xmalloc((size_t)length + NUMBUFLEN);
- if (buf1 == NULL) {
- goto theend;
- }
ptr = buf1;
- if (negative && (!visual || (visual && was_positive))) {
+ if (negative && (!visual || was_positive)) {
*ptr++ = '-';
}
if (pre) {
@@ -4631,7 +4774,7 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
vim_snprintf((char *)buf2, ARRAY_SIZE(buf2), "%" PRIu64, (uint64_t)n);
} else if (pre == '0') {
vim_snprintf((char *)buf2, ARRAY_SIZE(buf2), "%" PRIo64, (uint64_t)n);
- } else if (pre && hexupper) {
+ } else if (hexupper) {
vim_snprintf((char *)buf2, ARRAY_SIZE(buf2), "%" PRIX64, (uint64_t)n);
} else {
vim_snprintf((char *)buf2, ARRAY_SIZE(buf2), "%" PRIx64, (uint64_t)n);
@@ -4652,23 +4795,23 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
ins_str(buf1); // insert the new number
xfree(buf1);
endpos = curwin->w_cursor;
- if (did_change && curwin->w_cursor.col) {
+ if (curwin->w_cursor.col) {
curwin->w_cursor.col--;
}
}
- if (did_change) {
- // set the '[ and '] marks
- curbuf->b_op_start = startpos;
- curbuf->b_op_end = endpos;
- if (curbuf->b_op_end.col > 0) {
- curbuf->b_op_end.col--;
- }
+ // set the '[ and '] marks
+ curbuf->b_op_start = startpos;
+ curbuf->b_op_end = endpos;
+ if (curbuf->b_op_end.col > 0) {
+ curbuf->b_op_end.col--;
}
theend:
if (visual) {
curwin->w_cursor = save_cursor;
+ } else if (did_change) {
+ curwin->w_set_curswant = true;
}
return did_change;
@@ -4751,9 +4894,8 @@ static void *get_reg_wrap_one_line(char_u *s, int flags)
if (!(flags & kGRegList)) {
return s;
}
- list_T *list = list_alloc();
- list_append_string(list, NULL, -1);
- list->lv_first->li_tv.vval.v_string = s;
+ list_T *const list = tv_list_alloc(1);
+ tv_list_append_allocated_string(list, (char *)s);
return list;
}
@@ -4787,10 +4929,11 @@ void *get_reg_contents(int regname, int flags)
return NULL;
char_u *retval;
- int allocated;
- if (get_spec_reg(regname, &retval, &allocated, FALSE)) {
- if (retval == NULL)
+ bool allocated;
+ if (get_spec_reg(regname, &retval, &allocated, false)) {
+ if (retval == NULL) {
return NULL;
+ }
if (allocated) {
return get_reg_wrap_one_line(retval, flags);
}
@@ -4802,9 +4945,9 @@ void *get_reg_contents(int regname, int flags)
return NULL;
if (flags & kGRegList) {
- list_T *list = list_alloc();
+ list_T *const list = tv_list_alloc((ptrdiff_t)reg->y_size);
for (size_t i = 0; i < reg->y_size; i++) {
- list_append_string(list, reg->y_array[i], -1);
+ tv_list_append_string(list, (const char *)reg->y_array[i], -1);
}
return list;
@@ -4885,7 +5028,7 @@ void write_reg_contents(int name, const char_u *str, ssize_t len,
write_reg_contents_ex(name, str, len, must_append, kMTUnknown, 0L);
}
-void write_reg_contents_lst(int name, char_u **strings, int maxlen,
+void write_reg_contents_lst(int name, char_u **strings,
bool must_append, MotionType yank_type,
colnr_T block_len)
{
@@ -5135,11 +5278,13 @@ void clear_oparg(oparg_T *oap)
* case, eol_size will be added to the character count to account for
* the size of the EOL character.
*/
-static long line_count_info(char_u *line, long *wc, long *cc, long limit, int eol_size)
+static varnumber_T line_count_info(char_u *line, varnumber_T *wc,
+ varnumber_T *cc, varnumber_T limit,
+ int eol_size)
{
- long i;
- long words = 0;
- long chars = 0;
+ varnumber_T i;
+ varnumber_T words = 0;
+ varnumber_T chars = 0;
int is_word = 0;
for (i = 0; i < limit && line[i] != NUL; ) {
@@ -5177,15 +5322,15 @@ void cursor_pos_info(dict_T *dict)
char_u buf1[50];
char_u buf2[40];
linenr_T lnum;
- long byte_count = 0;
- long bom_count = 0;
- long byte_count_cursor = 0;
- long char_count = 0;
- long char_count_cursor = 0;
- long word_count = 0;
- long word_count_cursor = 0;
+ varnumber_T byte_count = 0;
+ varnumber_T bom_count = 0;
+ varnumber_T byte_count_cursor = 0;
+ varnumber_T char_count = 0;
+ varnumber_T char_count_cursor = 0;
+ varnumber_T word_count = 0;
+ varnumber_T word_count_cursor = 0;
int eol_size;
- long last_check = 100000L;
+ varnumber_T last_check = 100000L;
long line_count_selected = 0;
pos_T min_pos, max_pos;
oparg_T oparg;
@@ -5257,8 +5402,8 @@ void cursor_pos_info(dict_T *dict)
switch (l_VIsual_mode) {
case Ctrl_V:
virtual_op = virtual_active();
- block_prep(&oparg, &bd, lnum, 0);
- virtual_op = MAYBE;
+ block_prep(&oparg, &bd, lnum, false);
+ virtual_op = kNone;
s = bd.textstart;
len = (long)bd.textlen;
break;
@@ -5292,15 +5437,16 @@ void cursor_pos_info(dict_T *dict)
if (lnum == curwin->w_cursor.lnum) {
word_count_cursor += word_count;
char_count_cursor += char_count;
- byte_count_cursor = byte_count +
- line_count_info(ml_get(lnum),
- &word_count_cursor, &char_count_cursor,
- (long)(curwin->w_cursor.col + 1), eol_size);
+ byte_count_cursor = byte_count
+ + line_count_info(ml_get(lnum), &word_count_cursor,
+ &char_count_cursor,
+ (varnumber_T)(curwin->w_cursor.col + 1),
+ eol_size);
}
}
- /* Add to the running totals */
- byte_count += line_count_info(ml_get(lnum), &word_count,
- &char_count, (long)MAXCOL, eol_size);
+ // Add to the running totals
+ byte_count += line_count_info(ml_get(lnum), &word_count, &char_count,
+ (varnumber_T)MAXCOL, eol_size);
}
// Correction for when last line doesn't have an EOL.
@@ -5389,17 +5535,19 @@ void cursor_pos_info(dict_T *dict)
if (dict != NULL) {
// Don't shorten this message, the user asked for it.
- dict_add_nr_str(dict, "words", word_count, NULL);
- dict_add_nr_str(dict, "chars", char_count, NULL);
- dict_add_nr_str(dict, "bytes", byte_count + bom_count, NULL);
-
- dict_add_nr_str(dict, l_VIsual_active ? "visual_bytes" : "cursor_bytes",
- byte_count_cursor, NULL);
- dict_add_nr_str(dict, l_VIsual_active ? "visual_chars" : "cursor_chars",
- char_count_cursor, NULL);
- dict_add_nr_str(dict, l_VIsual_active ? "visual_words" : "cursor_words",
- word_count_cursor, NULL);
- }
+ tv_dict_add_nr(dict, S_LEN("words"), (varnumber_T)word_count);
+ tv_dict_add_nr(dict, S_LEN("chars"), (varnumber_T)char_count);
+ tv_dict_add_nr(dict, S_LEN("bytes"), (varnumber_T)(byte_count + bom_count));
+
+ STATIC_ASSERT(sizeof("visual") == sizeof("cursor"),
+ "key_len argument in tv_dict_add_nr is wrong");
+ tv_dict_add_nr(dict, l_VIsual_active ? "visual_bytes" : "cursor_bytes",
+ sizeof("visual_bytes") - 1, (varnumber_T)byte_count_cursor);
+ tv_dict_add_nr(dict, l_VIsual_active ? "visual_chars" : "cursor_chars",
+ sizeof("visual_chars") - 1, (varnumber_T)char_count_cursor);
+ tv_dict_add_nr(dict, l_VIsual_active ? "visual_words" : "cursor_words",
+ sizeof("visual_words") - 1, (varnumber_T)word_count_cursor);
+ }
}
/// Check if the default register (used in an unnamed paste) should be a
@@ -5415,7 +5563,7 @@ int get_default_register_name(void)
}
/// Determine if register `*name` should be used as a clipboard.
-/// In an unnammed operation, `*name` is `NUL` and will be adjusted to `'*'/'+'` if
+/// In an unnamed operation, `*name` is `NUL` and will be adjusted to */+ if
/// `clipboard=unnamed[plus]` is set.
///
/// @param name The name of register, or `NUL` if unnamed.
@@ -5426,42 +5574,53 @@ int get_default_register_name(void)
/// if the register isn't a clipboard or provider isn't available.
static yankreg_T *adjust_clipboard_name(int *name, bool quiet, bool writing)
{
- if (*name == '*' || *name == '+') {
- if(!eval_has_provider("clipboard")) {
- if (!quiet) {
- EMSG("clipboard: provider is not available");
- }
- return NULL;
- }
- return &y_regs[*name == '*' ? STAR_REGISTER : PLUS_REGISTER];
- } else if ((*name == NUL) && (cb_flags & CB_UNNAMEDMASK)) {
- if(!eval_has_provider("clipboard")) {
- if (!quiet && !clipboard_didwarn_unnamed) {
- msg((char_u*)"clipboard: provider not available, ignoring clipboard=unnamed[plus]");
- clipboard_didwarn_unnamed = true;
- }
- return NULL;
+#define MSG_NO_CLIP "clipboard: No provider. " \
+ "Try \":checkhealth\" or \":h clipboard\"."
+
+ yankreg_T *target = NULL;
+ bool explicit_cb_reg = (*name == '*' || *name == '+');
+ bool implicit_cb_reg = (*name == NUL) && (cb_flags & CB_UNNAMEDMASK);
+ if (!explicit_cb_reg && !implicit_cb_reg) {
+ goto end;
+ }
+
+ if (!eval_has_provider("clipboard")) {
+ if (batch_change_count == 1 && !quiet
+ && (!clipboard_didwarn || (explicit_cb_reg && !redirecting()))) {
+ clipboard_didwarn = true;
+ // Do NOT error (emsg()) here--if it interrupts :redir we get into
+ // a weird state, stuck in "redirect mode".
+ msg((char_u *)MSG_NO_CLIP);
}
+ // ... else, be silent (don't flood during :while, :redir, etc.).
+ goto end;
+ }
+
+ if (explicit_cb_reg) {
+ target = &y_regs[*name == '*' ? STAR_REGISTER : PLUS_REGISTER];
+ goto end;
+ } else { // unnamed register: "implicit" clipboard
if (writing && clipboard_delay_update) {
+ // For "set" (copy), defer the clipboard call.
clipboard_needs_update = true;
- return NULL;
+ goto end;
} else if (!writing && clipboard_needs_update) {
- // use the internal value
- return NULL;
+ // For "get" (paste), use the internal value.
+ goto end;
}
- yankreg_T *target;
if (cb_flags & CB_UNNAMEDPLUS) {
- *name = cb_flags & CB_UNNAMED ? '"': '+';
+ *name = (cb_flags & CB_UNNAMED && writing) ? '"': '+';
target = &y_regs[PLUS_REGISTER];
} else {
*name = '*';
target = &y_regs[STAR_REGISTER];
}
- return target; // unnamed register
+ goto end;
}
- // don't do anything for other register names
- return NULL;
+
+end:
+ return target;
}
static bool get_clipboard(int name, yankreg_T **target, bool quiet)
@@ -5475,9 +5634,9 @@ static bool get_clipboard(int name, yankreg_T **target, bool quiet)
}
free_register(reg);
- list_T *args = list_alloc();
- char_u regname = (char_u)name;
- list_append_string(args, &regname, 1);
+ list_T *const args = tv_list_alloc(1);
+ const char regname = (char)name;
+ tv_list_append_string(args, &regname, 1);
typval_T result = eval_call_provider("clipboard", "get", args);
@@ -5489,14 +5648,16 @@ static bool get_clipboard(int name, yankreg_T **target, bool quiet)
goto err;
}
- list_T *res = result.vval.v_list, *lines = NULL;
- if (res->lv_len == 2 && res->lv_first->li_tv.v_type == VAR_LIST) {
- lines = res->lv_first->li_tv.vval.v_list;
- if (res->lv_last->li_tv.v_type != VAR_STRING) {
+ list_T *res = result.vval.v_list;
+ list_T *lines = NULL;
+ if (tv_list_len(res) == 2
+ && TV_LIST_ITEM_TV(tv_list_first(res))->v_type == VAR_LIST) {
+ lines = TV_LIST_ITEM_TV(tv_list_first(res))->vval.v_list;
+ if (TV_LIST_ITEM_TV(tv_list_last(res))->v_type != VAR_STRING) {
goto err;
}
- char_u *regtype = res->lv_last->li_tv.vval.v_string;
- if (regtype == NULL || strlen((char*)regtype) > 1) {
+ char_u *regtype = TV_LIST_ITEM_TV(tv_list_last(res))->vval.v_string;
+ if (regtype == NULL || strlen((char *)regtype) > 1) {
goto err;
}
switch (regtype[0]) {
@@ -5521,20 +5682,21 @@ static bool get_clipboard(int name, yankreg_T **target, bool quiet)
reg->y_type = kMTUnknown;
}
- reg->y_array = xcalloc((size_t)lines->lv_len, sizeof(uint8_t *));
- reg->y_size = (size_t)lines->lv_len;
+ reg->y_array = xcalloc((size_t)tv_list_len(lines), sizeof(char_u *));
+ reg->y_size = (size_t)tv_list_len(lines);
reg->additional_data = NULL;
reg->timestamp = 0;
// Timestamp is not saved for clipboard registers because clipboard registers
// are not saved in the ShaDa file.
- int i = 0;
- for (listitem_T *li = lines->lv_first; li != NULL; li = li->li_next) {
- if (li->li_tv.v_type != VAR_STRING) {
+ size_t tv_idx = 0;
+ TV_LIST_ITER_CONST(lines, li, {
+ if (TV_LIST_ITEM_TV(li)->v_type != VAR_STRING) {
goto err;
}
- reg->y_array[i++] = (uint8_t *)xstrdup((char *)li->li_tv.vval.v_string);
- }
+ reg->y_array[tv_idx++] = (char_u *)xstrdupnul(
+ (const char *)TV_LIST_ITEM_TV(li)->vval.v_string);
+ });
if (reg->y_size > 0 && strlen((char*)reg->y_array[reg->y_size-1]) == 0) {
// a known-to-be charwise yank might have a final linebreak
@@ -5591,63 +5753,91 @@ static void set_clipboard(int name, yankreg_T *reg)
return;
}
- list_T *lines = list_alloc();
+ list_T *const lines = tv_list_alloc(
+ (ptrdiff_t)reg->y_size + (reg->y_type != kMTCharWise));
for (size_t i = 0; i < reg->y_size; i++) {
- list_append_string(lines, reg->y_array[i], -1);
+ tv_list_append_string(lines, (const char *)reg->y_array[i], -1);
}
- list_T *args = list_alloc();
- list_append_list(args, lines);
-
- char_u regtype;
+ char regtype;
switch (reg->y_type) {
- case kMTLineWise:
- regtype = 'V';
- list_append_string(lines, (char_u*)"", 0);
- break;
- case kMTCharWise:
- regtype = 'v';
- break;
- case kMTBlockWise:
- regtype = 'b';
- list_append_string(lines, (char_u*)"", 0);
- break;
- case kMTUnknown:
- assert(false);
- }
- list_append_string(args, &regtype, 1);
-
- char_u regname = (char_u)name;
- list_append_string(args, &regname, 1);
+ case kMTLineWise: {
+ regtype = 'V';
+ tv_list_append_string(lines, NULL, 0);
+ break;
+ }
+ case kMTCharWise: {
+ regtype = 'v';
+ break;
+ }
+ case kMTBlockWise: {
+ regtype = 'b';
+ tv_list_append_string(lines, NULL, 0);
+ break;
+ }
+ case kMTUnknown: {
+ assert(false);
+ }
+ }
+
+ list_T *args = tv_list_alloc(3);
+ tv_list_append_list(args, lines);
+ tv_list_append_string(args, &regtype, 1); // -V614
+ tv_list_append_string(args, ((char[]) { (char)name }), 1);
(void)eval_call_provider("clipboard", "set", args);
}
-/// Avoid clipboard (slow) during batch operations (:global).
-void start_global_changes(void)
+/// Avoid slow things (clipboard) during batch operations (while/for-loops).
+void start_batch_changes(void)
{
- if (++global_change_count > 1) {
+ if (++batch_change_count > 1) {
return;
}
clipboard_delay_update = true;
- clipboard_needs_update = false;
}
-/// Update the clipboard after :global changes finished.
-void end_global_changes(void)
+/// Counterpart to start_batch_changes().
+void end_batch_changes(void)
{
- if (--global_change_count > 0) {
+ if (--batch_change_count > 0) {
// recursive
return;
}
clipboard_delay_update = false;
if (clipboard_needs_update) {
+ // must be before, as set_clipboard will invoke
+ // start/end_batch_changes recursively
+ clipboard_needs_update = false;
+ // unnamed ("implicit" clipboard)
set_clipboard(NUL, y_previous);
+ }
+}
+
+int save_batch_count(void)
+{
+ int save_count = batch_change_count;
+ batch_change_count = 0;
+ clipboard_delay_update = false;
+ if (clipboard_needs_update) {
clipboard_needs_update = false;
+ // unnamed ("implicit" clipboard)
+ set_clipboard(NUL, y_previous);
}
+ return save_count;
}
+void restore_batch_count(int save_count)
+{
+ assert(batch_change_count == 0);
+ batch_change_count = save_count;
+ if (batch_change_count > 0) {
+ clipboard_delay_update = true;
+ }
+}
+
+
/// Check whether register is empty
static inline bool reg_empty(const yankreg_T *const reg)
FUNC_ATTR_PURE
@@ -5668,7 +5858,7 @@ static inline bool reg_empty(const yankreg_T *const reg)
/// @return Pointer that needs to be passed to next `op_register_iter` call or
/// NULL if iteration is over.
const void *op_register_iter(const void *const iter, char *const name,
- yankreg_T *const reg)
+ yankreg_T *const reg, bool *is_unnamed)
FUNC_ATTR_NONNULL_ARG(2, 3) FUNC_ATTR_WARN_UNUSED_RESULT
{
*name = NUL;
@@ -5684,6 +5874,7 @@ const void *op_register_iter(const void *const iter, char *const name,
int iter_off = (int)(iter_reg - &(y_regs[0]));
*name = (char)get_register_name(iter_off);
*reg = *iter_reg;
+ *is_unnamed = (iter_reg == y_previous);
while (++iter_reg - &(y_regs[0]) < NUM_SAVED_REGISTERS) {
if (!reg_empty(iter_reg)) {
return (void *) iter_reg;
@@ -5708,10 +5899,11 @@ size_t op_register_amount(void)
/// Set register to a given value
///
/// @param[in] name Register name.
-/// @param[in] reg Register value.
+/// @param[in] reg Register value.
+/// @param[in] is_unnamed Whether to set the unnamed regiseter to reg
///
/// @return true on success, false on failure.
-bool op_register_set(const char name, const yankreg_T reg)
+bool op_register_set(const char name, const yankreg_T reg, bool is_unnamed)
{
int i = op_reg_index(name);
if (i == -1) {
@@ -5719,6 +5911,10 @@ bool op_register_set(const char name, const yankreg_T reg)
}
free_register(&y_regs[i]);
y_regs[i] = reg;
+
+ if (is_unnamed) {
+ y_previous = &y_regs[i];
+ }
return true;
}
@@ -5735,3 +5931,20 @@ const yankreg_T *op_register_get(const char name)
}
return &y_regs[i];
}
+
+/// Set the previous yank register
+///
+/// @param[in] name Register name.
+///
+/// @return true on success, false on failure.
+bool op_register_set_previous(const char name)
+ FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ int i = op_reg_index(name);
+ if (i == -1) {
+ return false;
+ }
+
+ y_previous = &y_regs[i];
+ return true;
+}
diff --git a/src/nvim/ops.h b/src/nvim/ops.h
index 44df2e9e0c..a8867e02ea 100644
--- a/src/nvim/ops.h
+++ b/src/nvim/ops.h
@@ -6,8 +6,10 @@
#include "nvim/macros.h"
#include "nvim/ascii.h"
#include "nvim/types.h"
-#include "nvim/eval_defs.h"
+#include "nvim/eval/typval.h"
#include "nvim/os/time.h"
+#include "nvim/normal.h" // for MotionType and oparg_T
+#include "nvim/ex_cmds_defs.h" // for exarg_T
typedef int (*Indenter)(void);
diff --git a/src/nvim/option.c b/src/nvim/option.c
index 5333c0291d..b8f5957c09 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -1,24 +1,25 @@
-/*
- * Code to handle user-settable options. This is all pretty much table-
- * driven. Checklist for adding a new option:
- * - Put it in the options array below (copy an existing entry).
- * - For a global option: Add a variable for it in option_defs.h.
- * - For a buffer or window local option:
- * - Add a PV_XX entry to the enum below.
- * - Add a variable to the window or buffer struct in buffer_defs.h.
- * - For a window option, add some code to copy_winopt().
- * - For a buffer option, add some code to buf_copy_options().
- * - For a buffer string option, add code to check_buf_options().
- * - If it's a numeric option, add any necessary bounds checks to do_set().
- * - If it's a list of flags, add some code in do_set(), search for WW_ALL.
- * - When adding an option with expansion (P_EXPAND), but with a different
- * default for Vi and Vim (no P_VI_DEF), add some code at VIMEXP.
- * - Add documentation! One line in doc/help.txt, full description in
- * options.txt, and any other related places.
- * - Add an entry in runtime/optwin.vim.
- * When making changes:
- * - Adjust the help for the option in doc/option.txt.
- */
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+// User-settable options. Checklist for adding a new option:
+// - Put it in options.lua
+// - For a global option: Add a variable for it in option_defs.h.
+// - For a buffer or window local option:
+// - Add a BV_XX or WV_XX entry to option_defs.h
+// - Add a variable to the window or buffer struct in buffer_defs.h.
+// - For a window option, add some code to copy_winopt().
+// - For a window string option, add code to check_winopt()
+// and clear_winopt(). If setting the option needs parsing,
+// add some code to didset_window_options().
+// - For a buffer option, add some code to buf_copy_options().
+// - For a buffer string option, add code to check_buf_options().
+// - If it's a numeric option, add any necessary bounds checks to
+// set_num_option().
+// - If it's a list of flags, add some code in do_set(), search for WW_ALL.
+// - When adding an option with expansion (P_EXPAND), but with a different
+// default for Vi and Vim (no P_VI_DEF), add some code at VIMEXP.
+// - Add documentation! doc/options.txt, and any other related places.
+// - Add an entry in runtime/optwin.vim.
#define IN_OPTION_C
#include <assert.h>
@@ -31,6 +32,7 @@
#include <limits.h>
#include "nvim/vim.h"
+#include "nvim/macros.h"
#include "nvim/ascii.h"
#include "nvim/edit.h"
#include "nvim/option.h"
@@ -40,6 +42,7 @@
#include "nvim/diff.h"
#include "nvim/digraph.h"
#include "nvim/eval.h"
+#include "nvim/eval/typval.h"
#include "nvim/ex_cmds2.h"
#include "nvim/ex_docmd.h"
#include "nvim/ex_getln.h"
@@ -65,13 +68,16 @@
#include "nvim/regexp.h"
#include "nvim/screen.h"
#include "nvim/spell.h"
+#include "nvim/spellfile.h"
#include "nvim/strings.h"
#include "nvim/syntax.h"
#include "nvim/ui.h"
#include "nvim/undo.h"
#include "nvim/window.h"
#include "nvim/os/os.h"
+#include "nvim/api/private/helpers.h"
#include "nvim/os/input.h"
+#include "nvim/os/lang.h"
/*
* The options that are local to a window or buffer have "indir" set to one of
@@ -102,6 +108,9 @@ typedef enum {
*/
#define VAR_WIN ((char_u *)-1)
+static char *p_term = NULL;
+static char *p_ttytype = NULL;
+
/*
* These are the global values for options which are also local to a buffer.
* Only to be used in option.c!
@@ -112,6 +121,7 @@ static int p_bomb;
static char_u *p_bh;
static char_u *p_bt;
static int p_bl;
+static long p_channel;
static int p_ci;
static int p_cin;
static char_u *p_cink;
@@ -177,16 +187,16 @@ static long p_tw_nopaste;
static long p_wm_nopaste;
typedef struct vimoption {
- char *fullname; /* full option name */
- char *shortname; /* permissible abbreviation */
- uint32_t flags; /* see below */
- char_u *var; /* global option: pointer to variable;
- * window-local option: VAR_WIN;
- * buffer-local option: global value */
- idopt_T indir; /* global option: PV_NONE;
- * local option: indirect option index */
- char_u *def_val[2]; /* default values for variable (vi and vim) */
- scid_T scriptID; /* script in which the option was last set */
+ char *fullname; // full option name
+ char *shortname; // permissible abbreviation
+ uint32_t flags; // see below
+ char_u *var; // global option: pointer to variable;
+ // window-local option: VAR_WIN;
+ // buffer-local option: global value
+ idopt_T indir; // global option: PV_NONE;
+ // local option: indirect option index
+ char_u *def_val[2]; // default values for variable (vi and vim)
+ LastSet last_set; // script in which the option was last set
# define SCRIPTID_INIT , 0
} vimoption_T;
@@ -213,12 +223,12 @@ typedef struct vimoption {
#define P_VI_DEF 0x400U /* Use Vi default for Vim */
#define P_VIM 0x800U /* Vim option */
-/* when option changed, what to display: */
-#define P_RSTAT 0x1000U /* redraw status lines */
-#define P_RWIN 0x2000U /* redraw current window */
-#define P_RBUF 0x4000U /* redraw current buffer */
-#define P_RALL 0x6000U /* redraw all windows */
-#define P_RCLR 0x7000U /* clear and redraw all */
+// when option changed, what to display:
+#define P_RSTAT 0x1000U ///< redraw status lines
+#define P_RWIN 0x2000U ///< redraw current window and recompute text
+#define P_RBUF 0x4000U ///< redraw current buffer and recompute text
+#define P_RALL 0x6000U ///< redraw all windows
+#define P_RCLR 0x7000U ///< clear and redraw all
#define P_COMMA 0x8000U ///< comma separated list
#define P_ONECOMMA 0x18000U ///< P_COMMA and cannot have two consecutive
@@ -236,16 +246,22 @@ typedef struct vimoption {
#define P_NO_ML 0x2000000U ///< not allowed in modeline
#define P_CURSWANT 0x4000000U ///< update curswant required; not needed
///< when there is a redraw flag
+#define P_NO_DEF_EXP 0x8000000U ///< Do not expand default value.
+
+#define P_RWINONLY 0x10000000U ///< only redraw current window
+#define P_NDNAME 0x20000000U ///< only normal dir name chars allowed
+#define P_UI_OPTION 0x40000000U ///< send option to remote ui
#define HIGHLIGHT_INIT \
"8:SpecialKey,~:EndOfBuffer,z:TermCursor,Z:TermCursorNC,@:NonText," \
"d:Directory,e:ErrorMsg,i:IncSearch,l:Search,m:MoreMsg,M:ModeMsg,n:LineNr," \
"N:CursorLineNr,r:Question,s:StatusLine,S:StatusLineNC,c:VertSplit,t:Title," \
- "v:Visual,w:WarningMsg,W:WildMenu,f:Folded,F:FoldColumn," \
+ "v:Visual,V:VisualNOS,w:WarningMsg,W:WildMenu,f:Folded,F:FoldColumn," \
"A:DiffAdd,C:DiffChange,D:DiffDelete,T:DiffText,>:SignColumn,-:Conceal," \
"B:SpellBad,P:SpellCap,R:SpellRare,L:SpellLocal,+:Pmenu,=:PmenuSel," \
"x:PmenuSbar,X:PmenuThumb,*:TabLine,#:TabLineSel,_:TabLineFill," \
- "!:CursorColumn,.:CursorLine,o:ColorColumn"
+ "!:CursorColumn,.:CursorLine,o:ColorColumn,q:QuickFixLine," \
+ "0:Whitespace,I:NormalNC"
/*
* options[] is initialized here.
@@ -287,6 +303,8 @@ static char *(p_fdm_values[]) = { "manual", "expr", "marker", "indent",
static char *(p_fcl_values[]) = { "all", NULL };
static char *(p_cot_values[]) = { "menu", "menuone", "longest", "preview",
"noinsert", "noselect", NULL };
+static char *(p_icm_values[]) = { "nosplit", "split", NULL };
+static char *(p_scl_values[]) = { "yes", "no", "auto", NULL };
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "option.c.generated.h"
@@ -332,7 +350,7 @@ static inline size_t compute_double_colon_len(const char *const val,
do {
size_t dir_len;
const char *dir;
- iter = vim_colon_env_iter(val, iter, &dir, &dir_len);
+ iter = vim_env_iter(':', val, iter, &dir, &dir_len);
if (dir != NULL && dir_len > 0) {
ret += ((dir_len + memcnt(dir, ',', dir_len) + common_suf_len
+ !after_pathsep(dir, dir + dir_len)) * 2
@@ -376,8 +394,8 @@ static inline char *add_colon_dirs(char *dest, const char *const val,
do {
size_t dir_len;
const char *dir;
- iter = (forward ? vim_colon_env_iter : vim_colon_env_iter_rev)(
- val, iter, &dir, &dir_len);
+ iter = (forward ? vim_env_iter : vim_env_iter_rev)(':', val, iter, &dir,
+ &dir_len);
if (dir != NULL && dir_len > 0) {
dest = strcpy_comma_escaped(dest, dir, dir_len);
if (!after_pathsep(dest - 1, dest)) {
@@ -520,6 +538,8 @@ static void set_runtimepath_default(void)
#undef SITE_SIZE
#undef AFTER_SIZE
set_string_default("runtimepath", rtp, true);
+ // Make a copy of 'rtp' for 'packpath'
+ set_string_default("packpath", rtp, false);
xfree(data_dirs);
xfree(config_dirs);
xfree(data_home);
@@ -599,27 +619,6 @@ void set_init_1(void)
}
}
- /*
- * 'maxmemtot' and 'maxmem' may have to be adjusted for available memory
- */
- opt_idx = findoption((char_u *)"maxmemtot");
- if (opt_idx >= 0) {
- {
- /* Use half of amount of memory available to Vim. */
- /* If too much to fit in uintptr_t, get uintptr_t max */
- uint64_t available_kib = os_get_total_mem_kib();
- uintptr_t n = available_kib / 2 > UINTPTR_MAX
- ? UINTPTR_MAX
- : (uintptr_t)(available_kib /2);
- options[opt_idx].def_val[VI_DEFAULT] = (char_u *)n;
- opt_idx = findoption((char_u *)"maxmem");
- if (opt_idx >= 0) {
- options[opt_idx].def_val[VI_DEFAULT] = (char_u *)n;
- }
- }
- }
-
-
{
char_u *cdpath;
char_u *buf;
@@ -643,7 +642,7 @@ void set_init_1(void)
}
}
buf[j] = NUL;
- opt_idx = findoption((char_u *)"cdpath");
+ opt_idx = findoption("cdpath");
if (opt_idx >= 0) {
options[opt_idx].def_val[VI_DEFAULT] = buf;
options[opt_idx].flags |= P_DEF_ALLOCED;
@@ -676,15 +675,18 @@ void set_init_1(void)
#endif
false);
- char *backupdir = stdpaths_user_data_subpath("backup", 0);
+ char *backupdir = stdpaths_user_data_subpath("backup", 0, true);
const size_t backupdir_len = strlen(backupdir);
backupdir = xrealloc(backupdir, backupdir_len + 3);
memmove(backupdir + 2, backupdir, backupdir_len + 1);
memmove(backupdir, ".,", 2);
- set_string_default("viewdir", stdpaths_user_data_subpath("view", 0), true);
+ set_string_default("viewdir", stdpaths_user_data_subpath("view", 0, true),
+ true);
set_string_default("backupdir", backupdir, true);
- set_string_default("directory", stdpaths_user_data_subpath("swap", 2), true);
- set_string_default("undodir", stdpaths_user_data_subpath("undo", 0), true);
+ set_string_default("directory", stdpaths_user_data_subpath("swap", 2, true),
+ true);
+ set_string_default("undodir", stdpaths_user_data_subpath("undo", 0, true),
+ true);
// Set default for &runtimepath. All necessary expansions are performed in
// this function.
set_runtimepath_default();
@@ -726,6 +728,9 @@ void set_init_1(void)
* default.
*/
for (opt_idx = 0; options[opt_idx].fullname; opt_idx++) {
+ if (options[opt_idx].flags & P_NO_DEF_EXP) {
+ continue;
+ }
char *p;
if ((options[opt_idx].flags & P_GETTEXT)
&& options[opt_idx].var != NULL) {
@@ -756,29 +761,29 @@ void set_init_1(void)
* NOTE: mlterm's author is being asked to 'set' a variable
* instead of an environment variable due to inheritance.
*/
- if (os_env_exists("MLTERM"))
- set_option_value((char_u *)"tbidi", 1L, NULL, 0);
+ if (os_env_exists("MLTERM")) {
+ set_option_value("tbidi", 1L, NULL, 0);
+ }
didset_options2();
+ lang_init();
+
// enc_locale() will try to find the encoding of the current locale.
// This will be used when 'default' is used as encoding specifier
// in 'fileencodings'
char_u *p = enc_locale();
if (p == NULL) {
// use utf-8 as 'default' if locale encoding can't be detected.
- p = vim_strsave((char_u *)"utf-8");
+ p = (char_u *)xmemdupz(S_LEN("utf-8"));
}
fenc_default = p;
- // Initialize multibyte (utf-8) handling
- mb_init();
-
- // Don't change &encoding when resetting to defaults with ":set all&".
- opt_idx = findoption((char_u *)"encoding");
- if (opt_idx >= 0) {
- options[opt_idx].flags |= P_NODEFAULT;
- }
+#ifdef HAVE_WORKING_LIBINTL
+ // GNU gettext 0.10.37 supports this feature: set the codeset used for
+ // translated messages independently from the current locale.
+ (void)bind_textdomain_codeset(PROJECT_NAME, (char *)p_enc);
+#endif
/* Set the default for 'helplang'. */
set_helplang_default(get_mess_lang());
@@ -806,24 +811,26 @@ set_option_default (
if (flags & P_STRING) {
/* Use set_string_option_direct() for local options to handle
* freeing and allocating the value. */
- if (options[opt_idx].indir != PV_NONE)
+ if (options[opt_idx].indir != PV_NONE) {
set_string_option_direct(NULL, opt_idx,
- options[opt_idx].def_val[dvi], opt_flags, 0);
- else {
- if ((opt_flags & OPT_FREE) && (flags & P_ALLOCED))
+ options[opt_idx].def_val[dvi], opt_flags, 0);
+ } else {
+ if ((opt_flags & OPT_FREE) && (flags & P_ALLOCED)) {
free_string_option(*(char_u **)(varp));
+ }
*(char_u **)varp = options[opt_idx].def_val[dvi];
options[opt_idx].flags &= ~P_ALLOCED;
}
} else if (flags & P_NUM) {
- if (options[opt_idx].indir == PV_SCROLL)
+ if (options[opt_idx].indir == PV_SCROLL) {
win_comp_scroll(curwin);
- else {
- *(long *)varp = (long)options[opt_idx].def_val[dvi];
- /* May also set global value for local option. */
- if (both)
+ } else {
+ *(long *)varp = (long)(intptr_t)options[opt_idx].def_val[dvi];
+ // May also set global value for local option.
+ if (both) {
*(long *)get_varp_scope(&(options[opt_idx]), OPT_GLOBAL) =
*(long *)varp;
+ }
}
} else { /* P_BOOL */
*(int *)varp = (int)(intptr_t)options[opt_idx].def_val[dvi];
@@ -877,7 +884,7 @@ set_options_default (
void set_string_default(const char *name, char *val, bool allocated)
FUNC_ATTR_NONNULL_ALL
{
- int opt_idx = findoption((char_u *)name);
+ int opt_idx = findoption(name);
if (opt_idx >= 0) {
if (options[opt_idx].flags & P_DEF_ALLOCED) {
xfree(options[opt_idx].def_val[VI_DEFAULT]);
@@ -899,63 +906,57 @@ void set_number_default(char *name, long val)
{
int opt_idx;
- opt_idx = findoption((char_u *)name);
- if (opt_idx >= 0)
- options[opt_idx].def_val[VI_DEFAULT] = (char_u *)val;
+ opt_idx = findoption(name);
+ if (opt_idx >= 0) {
+ options[opt_idx].def_val[VI_DEFAULT] = (char_u *)(intptr_t)val;
+ }
}
#if defined(EXITFREE)
-/*
- * Free all options.
- */
+/// Free all options.
void free_all_options(void)
{
- int i;
-
- for (i = 0; options[i].fullname; i++) {
+ for (int i = 0; options[i].fullname; i++) {
if (options[i].indir == PV_NONE) {
- /* global option: free value and default value. */
- if (options[i].flags & P_ALLOCED && options[i].var != NULL)
+ // global option: free value and default value.
+ if ((options[i].flags & P_ALLOCED) && options[i].var != NULL) {
free_string_option(*(char_u **)options[i].var);
- if (options[i].flags & P_DEF_ALLOCED)
+ }
+ if (options[i].flags & P_DEF_ALLOCED) {
free_string_option(options[i].def_val[VI_DEFAULT]);
- } else if (options[i].var != VAR_WIN
- && (options[i].flags & P_STRING))
- /* buffer-local option: free global value */
+ }
+ } else if (options[i].var != VAR_WIN && (options[i].flags & P_STRING)) {
+ // buffer-local option: free global value
free_string_option(*(char_u **)options[i].var);
+ }
}
}
-
#endif
-/*
- * Initialize the options, part two: After getting Rows and Columns and
- * setting 'term'.
- */
-void set_init_2(void)
+/// Initialize the options, part two: After getting Rows and Columns.
+void set_init_2(bool headless)
{
int idx;
- /*
- * 'scroll' defaults to half the window height. Note that this default is
- * wrong when the window height changes.
- */
- set_number_default("scroll", Rows / 2);
- idx = findoption((char_u *)"scroll");
- if (idx >= 0 && !(options[idx].flags & P_WAS_SET))
+ // 'scroll' defaults to half the window height. The stored default is zero,
+ // which results in the actual value computed from the window height.
+ idx = findoption("scroll");
+ if (idx >= 0 && !(options[idx].flags & P_WAS_SET)) {
set_option_default(idx, OPT_LOCAL, p_cp);
+ }
comp_col();
/*
* 'window' is only for backwards compatibility with Vi.
* Default is Rows - 1.
*/
- if (!option_was_set((char_u *)"window"))
+ if (!option_was_set("window")) {
p_window = Rows - 1;
+ }
set_number_default("window", Rows - 1);
- parse_shape_opt(SHAPE_CURSOR); /* set cursor shapes from 'guicursor' */
- (void)parse_printoptions(); /* parse 'printoptions' default value */
+ parse_shape_opt(SHAPE_CURSOR); // set cursor shapes from 'guicursor'
+ (void)parse_printoptions(); // parse 'printoptions' default value
}
/*
@@ -971,16 +972,18 @@ void set_init_3(void)
int idx_sp;
int do_sp;
- idx_srr = findoption((char_u *)"srr");
- if (idx_srr < 0)
- do_srr = FALSE;
- else
+ idx_srr = findoption("srr");
+ if (idx_srr < 0) {
+ do_srr = false;
+ } else {
do_srr = !(options[idx_srr].flags & P_WAS_SET);
- idx_sp = findoption((char_u *)"sp");
- if (idx_sp < 0)
- do_sp = FALSE;
- else
+ }
+ idx_sp = findoption("sp");
+ if (idx_sp < 0) {
+ do_sp = false;
+ } else {
do_sp = !(options[idx_sp].flags & P_WAS_SET);
+ }
size_t len = 0;
char_u *p = (char_u *)invocation_path_tail(p_sh, &len);
@@ -1023,6 +1026,15 @@ void set_init_3(void)
xfree(p);
}
+ if (BUFEMPTY()) {
+ int idx_ffs = findoption_len(S_LEN("ffs"));
+
+ // Apply the first entry of 'fileformats' to the initial buffer.
+ if (idx_ffs >= 0 && (options[idx_ffs].flags & P_WAS_SET)) {
+ set_fileformat(default_fileformat(), OPT_LOCAL);
+ }
+ }
+
set_title_defaults();
}
@@ -1032,19 +1044,27 @@ void set_init_3(void)
*/
void set_helplang_default(const char *lang)
{
- int idx;
+ if (lang == NULL) {
+ return;
+ }
- if (lang == NULL || STRLEN(lang) < 2) /* safety check */
+ const size_t lang_len = strlen(lang);
+ if (lang_len < 2) { // safety check
return;
- idx = findoption((char_u *)"hlg");
+ }
+ int idx = findoption("hlg");
if (idx >= 0 && !(options[idx].flags & P_WAS_SET)) {
if (options[idx].flags & P_ALLOCED)
free_string_option(p_hlg);
- p_hlg = (char_u *)xstrdup(lang);
- /* zh_CN becomes "cn", zh_TW becomes "tw". */
+ p_hlg = (char_u *)xmemdupz(lang, lang_len);
+ // zh_CN becomes "cn", zh_TW becomes "tw".
if (STRNICMP(p_hlg, "zh_", 3) == 0 && STRLEN(p_hlg) >= 5) {
p_hlg[0] = (char_u)TOLOWER_ASC(p_hlg[3]);
p_hlg[1] = (char_u)TOLOWER_ASC(p_hlg[4]);
+ } else if (STRLEN(p_hlg) >= 1 && *p_hlg == 'C') {
+ // any C like setting, such as C.UTF-8, becomes "en"
+ p_hlg[0] = 'e';
+ p_hlg[1] = 'n';
}
p_hlg[2] = NUL;
options[idx].flags |= P_ALLOCED;
@@ -1068,12 +1088,12 @@ void set_title_defaults(void)
* icon name. Saves a bit of time, because the X11 display server does
* not need to be contacted.
*/
- idx1 = findoption((char_u *)"title");
+ idx1 = findoption("title");
if (idx1 >= 0 && !(options[idx1].flags & P_WAS_SET)) {
options[idx1].def_val[VI_DEFAULT] = (char_u *)(intptr_t)0;
p_title = 0;
}
- idx1 = findoption((char_u *)"icon");
+ idx1 = findoption("icon");
if (idx1 >= 0 && !(options[idx1].flags & P_WAS_SET)) {
options[idx1].def_val[VI_DEFAULT] = (char_u *)(intptr_t)0;
p_icon = 0;
@@ -1110,7 +1130,7 @@ do_set (
int afterchar; /* character just after option name */
int len;
int i;
- long value;
+ varnumber_T value;
int key;
uint32_t flags; /* flags for current option */
char_u *varp = NULL; /* pointer to variable for current option */
@@ -1143,15 +1163,12 @@ do_set (
set_options_default(OPT_FREE | opt_flags);
didset_options();
didset_options2();
+ ui_refresh_options();
redraw_all_later(CLEAR);
} else {
showoptions(1, opt_flags);
did_show = TRUE;
}
- } else if (STRNCMP(arg, "termcap",
- 7) == 0 && !(opt_flags & OPT_MODELINE)) {
- did_show = TRUE;
- arg += 7;
} else {
prefix = 1;
if (STRNCMP(arg, "no", 2) == 0) {
@@ -1179,7 +1196,7 @@ do_set (
goto skip;
}
if (arg[1] == 't' && arg[2] == '_') { // could be term code
- opt_idx = findoption_len(arg + 1, (size_t) (len - 1));
+ opt_idx = findoption_len((const char *)arg + 1, (size_t)(len - 1));
}
len++;
if (opt_idx == -1) {
@@ -1195,7 +1212,7 @@ do_set (
len++;
}
}
- opt_idx = findoption_len(arg, (size_t) len);
+ opt_idx = findoption_len((const char *)arg, (size_t)len);
if (opt_idx == -1) {
key = find_key_option(arg);
}
@@ -1319,15 +1336,16 @@ do_set (
if (opt_idx >= 0) {
showoneopt(&options[opt_idx], opt_flags);
if (p_verbose > 0) {
- /* Mention where the option was last set. */
- if (varp == options[opt_idx].var)
- last_set_msg(options[opt_idx].scriptID);
- else if ((int)options[opt_idx].indir & PV_WIN)
- last_set_msg(curwin->w_p_scriptID[
- (int)options[opt_idx].indir & PV_MASK]);
- else if ((int)options[opt_idx].indir & PV_BUF)
- last_set_msg(curbuf->b_p_scriptID[
- (int)options[opt_idx].indir & PV_MASK]);
+ // Mention where the option was last set.
+ if (varp == options[opt_idx].var) {
+ option_last_set_msg(options[opt_idx].last_set);
+ } else if ((int)options[opt_idx].indir & PV_WIN) {
+ option_last_set_msg(curwin->w_p_scriptID[
+ (int)options[opt_idx].indir & PV_MASK]);
+ } else if ((int)options[opt_idx].indir & PV_BUF) {
+ option_last_set_msg(curbuf->b_p_scriptID[
+ (int)options[opt_idx].indir & PV_MASK]);
+ }
}
} else {
errmsg = (char_u *)N_("E846: Key code not set");
@@ -1377,10 +1395,10 @@ do_set (
value = prefix;
}
- errmsg = set_bool_option(opt_idx, varp, (int)value,
- opt_flags);
- } else { /* numeric or string */
- if (vim_strchr((char_u *)"=:&<", nextchar) == NULL
+ errmsg = (char_u *)set_bool_option(opt_idx, varp, (int)value,
+ opt_flags);
+ } else { // Numeric or string.
+ if (vim_strchr((const char_u *)"=:&<", nextchar) == NULL
|| prefix != 1) {
errmsg = e_invarg;
goto skip;
@@ -1396,25 +1414,24 @@ do_set (
* [-]0-9 set number
* other error
*/
- ++arg;
- if (nextchar == '&')
- value = (long)options[opt_idx].def_val[
- ((flags & P_VI_DEF) || cp_val)
- ? VI_DEFAULT : VIM_DEFAULT];
- else if (nextchar == '<') {
- /* For 'undolevels' NO_LOCAL_UNDOLEVEL means to
- * use the global value. */
- if ((long *)varp == &curbuf->b_p_ul
- && opt_flags == OPT_LOCAL)
+ arg++;
+ if (nextchar == '&') {
+ value = (long)(intptr_t)options[opt_idx].def_val[
+ ((flags & P_VI_DEF) || cp_val) ? VI_DEFAULT : VIM_DEFAULT];
+ } else if (nextchar == '<') {
+ // For 'undolevels' NO_LOCAL_UNDOLEVEL means to
+ // use the global value.
+ if ((long *)varp == &curbuf->b_p_ul && opt_flags == OPT_LOCAL) {
value = NO_LOCAL_UNDOLEVEL;
- else
+ } else {
value = *(long *)get_varp_scope(
&(options[opt_idx]), OPT_GLOBAL);
+ }
} else if (((long *)varp == &p_wc
|| (long *)varp == &p_wcm)
&& (*arg == '<'
|| *arg == '^'
- || ((!arg[1] || ascii_iswhite(arg[1]))
+ || (*arg != NUL && (!arg[1] || ascii_iswhite(arg[1]))
&& !ascii_isdigit(*arg)))) {
value = string_to_key(arg);
if (value == 0 && (long *)varp != &p_wcm) {
@@ -1422,8 +1439,7 @@ do_set (
goto skip;
}
} else if (*arg == '-' || ascii_isdigit(*arg)) {
- // Allow negative (for 'undolevels'), octal and
- // hex numbers.
+ // Allow negative, octal and hex numbers.
vim_str2nr(arg, NULL, &i, STR2NR_ALL, &value, NULL, 0);
if (arg[i] != NUL && !ascii_iswhite(arg[i])) {
errmsg = e_invarg;
@@ -1434,21 +1450,26 @@ do_set (
goto skip;
}
- if (adding)
+ if (adding) {
value = *(long *)varp + value;
- if (prepending)
+ }
+ if (prepending) {
value = *(long *)varp * value;
- if (removing)
+ }
+ if (removing) {
value = *(long *)varp - value;
- errmsg = set_num_option(opt_idx, varp, value,
- errbuf, sizeof(errbuf), opt_flags);
- } else if (opt_idx >= 0) { /* string */
+ }
+ errmsg = (char_u *)set_num_option(opt_idx, varp, (long)value,
+ errbuf, sizeof(errbuf),
+ opt_flags);
+ } else if (opt_idx >= 0) { // String.
char_u *save_arg = NULL;
char_u *s = NULL;
char_u *oldval = NULL; // previous value if *varp
char_u *newval;
char_u *origval = NULL;
char *saved_origval = NULL;
+ char *saved_newval = NULL;
unsigned newlen;
int comma;
int bs;
@@ -1465,7 +1486,17 @@ do_set (
/* The old value is kept until we are sure that the
* new value is valid. */
oldval = *(char_u **)varp;
- if (nextchar == '&') { /* set to default val */
+
+ // When setting the local value of a global
+ // option, the old value may be the global value.
+ if (((int)options[opt_idx].indir & PV_BOTH) && (opt_flags
+ & OPT_LOCAL)) {
+ origval = *(char_u **)get_varp(&options[opt_idx]);
+ } else {
+ origval = oldval;
+ }
+
+ if (nextchar == '&') { // set to default val
newval = options[opt_idx].def_val[
((flags & P_VI_DEF) || cp_val)
? VI_DEFAULT : VIM_DEFAULT];
@@ -1473,16 +1504,19 @@ do_set (
* default value was already expanded, only
* required when an environment variable was set
* later */
- if (newval == NULL)
+ new_value_alloced = true;
+ if (newval == NULL) {
newval = empty_option;
- else {
+ } else if (!(options[opt_idx].flags & P_NO_DEF_EXP)) {
s = option_expand(opt_idx, newval);
- if (s == NULL)
+ if (s == NULL) {
s = newval;
+ }
newval = vim_strsave(s);
+ } else {
+ newval = (char_u *)xstrdup((char *)newval);
}
- new_value_alloced = TRUE;
- } else if (nextchar == '<') { /* set to global val */
+ } else if (nextchar == '<') { // set to global val
newval = vim_strsave(*(char_u **)get_varp_scope(
&(options[opt_idx]), OPT_GLOBAL));
new_value_alloced = TRUE;
@@ -1521,6 +1555,9 @@ do_set (
break;
}
xfree(oldval);
+ if (origval == oldval) {
+ origval = *(char_u **)varp;
+ }
oldval = *(char_u **)varp;
}
/*
@@ -1557,15 +1594,6 @@ do_set (
++arg;
}
- /* When setting the local value of a global
- * option, the old value may be the global value. */
- if (((int)options[opt_idx].indir & PV_BOTH)
- && (opt_flags & OPT_LOCAL))
- origval = *(char_u **)get_varp(
- &options[opt_idx]);
- else
- origval = oldval;
-
/*
* Copy the new string into allocated memory.
* Can't use set_string_option_direct(), because
@@ -1708,13 +1736,26 @@ do_set (
}
if (flags & P_FLAGLIST) {
- /* Remove flags that appear twice. */
- for (s = newval; *s; ++s)
- if ((!(flags & P_COMMA) || *s != ',')
- && vim_strchr(s + 1, *s) != NULL) {
- STRMOVE(s, s + 1);
- --s;
+ // Remove flags that appear twice.
+ for (s = newval; *s;) {
+ // if options have P_FLAGLIST and P_ONECOMMA such as
+ // 'whichwrap'
+ if (flags & P_ONECOMMA) {
+ if (*s != ',' && *(s + 1) == ','
+ && vim_strchr(s + 2, *s) != NULL) {
+ // Remove the duplicated value and the next comma.
+ STRMOVE(s, s + 2);
+ continue;
+ }
+ } else {
+ if ((!(flags & P_COMMA) || *s != ',')
+ && vim_strchr(s + 1, *s) != NULL) {
+ STRMOVE(s, s + 1);
+ continue;
+ }
}
+ s++;
+ }
}
if (save_arg != NULL) /* number for 'whichwrap' */
@@ -1722,39 +1763,42 @@ do_set (
new_value_alloced = TRUE;
}
- /* Set the new value. */
+ // Set the new value.
*(char_u **)(varp) = newval;
- if (!starting && origval != NULL) {
- // origval may be freed by
- // did_set_string_option(), make a copy.
- saved_origval = xstrdup((char *) origval);
- }
+ // origval may be freed by
+ // did_set_string_option(), make a copy.
+ saved_origval = (origval != NULL) ? xstrdup((char *)origval) : 0;
- /* Handle side effects, and set the global value for
- * ":set" on local options. */
+ // newval (and varp) may become invalid if the
+ // buffer is closed by autocommands.
+ saved_newval = (newval != NULL) ? xstrdup((char *)newval) : 0;
+
+ // Handle side effects, and set the global value for
+ // ":set" on local options. Note: when setting 'syntax'
+ // or 'filetype' autocommands may be triggered that can
+ // cause havoc.
errmsg = did_set_string_option(opt_idx, (char_u **)varp,
new_value_alloced, oldval, errbuf, opt_flags);
+ if (errmsg == NULL) {
+ if (!starting) {
+ trigger_optionsset_string(opt_idx, opt_flags, saved_origval,
+ saved_newval);
+ }
+ if (options[opt_idx].flags & P_UI_OPTION) {
+ ui_call_option_set(cstr_as_string(options[opt_idx].fullname),
+ STRING_OBJ(cstr_as_string(saved_newval)));
+ }
+ }
+ xfree(saved_origval);
+ xfree(saved_newval);
+
// If error detected, print the error message.
if (errmsg != NULL) {
- xfree(saved_origval);
goto skip;
}
- if (saved_origval != NULL) {
- char buf_type[7];
- vim_snprintf(buf_type, ARRAY_SIZE(buf_type), "%s",
- (opt_flags & OPT_LOCAL) ? "local" : "global");
- set_vim_var_string(VV_OPTION_NEW, *(char **) varp, -1);
- set_vim_var_string(VV_OPTION_OLD, saved_origval, -1);
- set_vim_var_string(VV_OPTION_TYPE, buf_type, -1);
- apply_autocmds(EVENT_OPTIONSET,
- (char_u *)options[opt_idx].fullname,
- NULL, false, NULL);
- reset_v_option_vars();
- xfree(saved_origval);
- }
} else {
// key code option(FIXME(tarruda): Show a warning or something
// similar)
@@ -1899,15 +1943,7 @@ did_set_title (
{
if (starting != NO_SCREEN) {
maketitle();
- if (icon) {
- if (!p_icon) {
- ui_set_icon(NULL);
- }
- } else {
- if (!p_title) {
- ui_set_title(NULL);
- }
- }
+ resettitle();
}
}
@@ -2020,13 +2056,15 @@ static char_u *option_expand(int opt_idx, char_u *val)
if (!(options[opt_idx].flags & P_EXPAND) || options[opt_idx].var == NULL)
return NULL;
- /* If val is longer than MAXPATHL no meaningful expansion can be done,
- * expand_env() would truncate the string. */
- if (val != NULL && STRLEN(val) > MAXPATHL)
- return NULL;
-
- if (val == NULL)
+ if (val == NULL) {
val = *(char_u **)options[opt_idx].var;
+ }
+
+ // If val is longer than MAXPATHL no meaningful expansion can be done,
+ // expand_env() would truncate the string.
+ if (val == NULL || STRLEN(val) > MAXPATHL) {
+ return NULL;
+ }
/*
* Expanding this with NameBuff, expand_env() must not be passed IObuff.
@@ -2077,7 +2115,7 @@ static void didset_options(void)
static void didset_options2(void)
{
// Initialize the highlight_attr[] table.
- (void)highlight_changed();
+ highlight_changed();
// Parse default for 'clipboard'.
(void)opt_strings_flags(p_cb, p_cb_values, &cb_flags, true);
@@ -2118,6 +2156,7 @@ void check_buf_options(buf_T *buf)
check_string_option(&buf->b_p_inex);
check_string_option(&buf->b_p_inde);
check_string_option(&buf->b_p_indk);
+ check_string_option(&buf->b_p_fp);
check_string_option(&buf->b_p_fex);
check_string_option(&buf->b_p_kp);
check_string_option(&buf->b_p_mps);
@@ -2154,6 +2193,7 @@ void check_buf_options(buf_T *buf)
check_string_option(&buf->b_p_tsr);
check_string_option(&buf->b_p_lw);
check_string_option(&buf->b_p_bkc);
+ check_string_option(&buf->b_p_menc);
}
/*
@@ -2189,13 +2229,13 @@ static void check_string_option(char_u **pp)
*/
int was_set_insecurely(char_u *opt, int opt_flags)
{
- int idx = findoption(opt);
+ int idx = findoption((const char *)opt);
if (idx >= 0) {
uint32_t *flagp = insecure_flag(idx, opt_flags);
return (*flagp & P_INSECURE) != 0;
}
- EMSG2(_(e_intern2), "was_set_insecurely()");
+ internal_error("was_set_insecurely()");
return -1;
}
@@ -2251,11 +2291,11 @@ set_string_option_direct (
int both = (opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0;
int idx = opt_idx;
- if (idx == -1) { /* use name */
- idx = findoption(name);
- if (idx < 0) { /* not found (should not happen) */
- EMSG2(_(e_intern2), "set_string_option_direct()");
- EMSG2(_("For option %s"), name);
+ if (idx == -1) { // Use name.
+ idx = findoption((const char *)name);
+ if (idx < 0) { // Not found (should not happen).
+ internal_error("set_string_option_direct()");
+ IEMSG2(_("For option %s"), name);
return;
}
}
@@ -2340,7 +2380,8 @@ static char *set_string_option(const int opt_idx, const char *const value,
char *const oldval = *varp;
*varp = s;
- char *const saved_oldval = (starting ? NULL : xstrdup(oldval));
+ char *const saved_oldval = xstrdup(oldval);
+ char *const saved_newval = xstrdup(s);
char *const r = (char *)did_set_string_option(
opt_idx, (char_u **)varp, (int)true, (char_u *)oldval, NULL, opt_flags);
@@ -2349,23 +2390,38 @@ static char *set_string_option(const int opt_idx, const char *const value,
}
// call autocommand after handling side effects
- if (saved_oldval != NULL) {
- char buf_type[7];
- vim_snprintf(buf_type, ARRAY_SIZE(buf_type), "%s",
- (opt_flags & OPT_LOCAL) ? "local" : "global");
- set_vim_var_string(VV_OPTION_NEW, (char *)(*varp), -1);
- set_vim_var_string(VV_OPTION_OLD, saved_oldval, -1);
- set_vim_var_string(VV_OPTION_TYPE, buf_type, -1);
- apply_autocmds(EVENT_OPTIONSET,
- (char_u *)options[opt_idx].fullname,
- NULL, false, NULL);
- reset_v_option_vars();
- xfree(saved_oldval);
+ if (r == NULL) {
+ if (!starting) {
+ trigger_optionsset_string(opt_idx, opt_flags, saved_oldval, saved_newval);
+ }
+ if (options[opt_idx].flags & P_UI_OPTION) {
+ ui_call_option_set(cstr_as_string(options[opt_idx].fullname),
+ STRING_OBJ(cstr_as_string(saved_newval)));
+ }
}
+ xfree(saved_oldval);
+ xfree(saved_newval);
return r;
}
+/// Return true if "val" is a valid 'filetype' name.
+/// Also used for 'syntax' and 'keymap'.
+static bool valid_filetype(char_u *val)
+{
+ for (char_u *s = val; *s != NUL; s++) {
+ if (!ASCII_ISALNUM(*s) && vim_strchr((char_u *)".-_", *s) == NULL) {
+ return false;
+ }
+ }
+ return true;
+}
+
+#ifdef _MSC_VER
+// MSVC optimizations are disabled for this function because it
+// incorrectly generates an empty string for SHM_ALL.
+#pragma optimize("", off)
+#endif
/*
* Handle string options that need some action to perform when changed.
* Returns NULL for success, or an error message for an error.
@@ -2385,6 +2441,7 @@ did_set_string_option (
int did_chartab = FALSE;
char_u **gvarp;
bool free_oldval = (options[opt_idx].flags & P_ALLOCED);
+ bool value_changed = false;
/* Get the global option to compare with, otherwise we would have to check
* two values for all local options. */
@@ -2394,12 +2451,14 @@ did_set_string_option (
if ((secure || sandbox != 0)
&& (options[opt_idx].flags & P_SECURE)) {
errmsg = e_secure;
- }
- /* Check for a "normal" file name in some options. Disallow a path
- * separator (slash and/or backslash), wildcards and characters that are
- * often illegal in a file name. */
- else if ((options[opt_idx].flags & P_NFNAME)
- && vim_strpbrk(*varp, (char_u *)"/\\*?[|<>") != NULL) {
+ } else if (((options[opt_idx].flags & P_NFNAME)
+ && vim_strpbrk(*varp, (char_u *)(secure ? "/\\*?[|;&<>\r\n"
+ : "/\\*?[<>\r\n")) != NULL)
+ || ((options[opt_idx].flags & P_NDNAME)
+ && vim_strpbrk(*varp, (char_u *)"*?[|;&<>\r\n") != NULL)) {
+ // Check for a "normal" directory or file name in some options. Disallow a
+ // path separator (slash and/or backslash), wildcards and characters that
+ // are often illegal in a file name. Be more permissive if "secure" is off.
errmsg = e_invarg;
}
/* 'backupcopy' */
@@ -2439,16 +2498,13 @@ did_set_string_option (
else if (varp == &curwin->w_p_briopt) {
if (briopt_check(curwin) == FAIL)
errmsg = e_invarg;
- }
- /*
- * 'isident', 'iskeyword', 'isprint or 'isfname' option: refill chartab[]
- * If the new option is invalid, use old value. 'lisp' option: refill
- * chartab[] for '-' char
- */
- else if ( varp == &p_isi
+ } else if (varp == &p_isi
|| varp == &(curbuf->b_p_isk)
|| varp == &p_isp
|| varp == &p_isf) {
+ // 'isident', 'iskeyword', 'isprint or 'isfname' option: refill g_chartab[]
+ // If the new option is invalid, use old value. 'lisp' option: refill
+ // g_chartab[] for '-' char
if (init_chartab() == FAIL) {
did_chartab = TRUE; /* need to restore it below */
errmsg = e_invarg; /* error in value */
@@ -2481,11 +2537,11 @@ did_set_string_option (
if (s[2] == NUL)
break;
}
- }
- /* 'highlight' */
- else if (varp == &p_hl) {
- if (highlight_changed() == FAIL)
- errmsg = e_invarg; /* invalid flags */
+ } else if (varp == &p_hl) {
+ // 'highlight'
+ if (strcmp((char *)(*varp), HIGHLIGHT_INIT) != 0) {
+ errmsg = e_unsupportedoption;
+ }
}
/* 'nrformats' */
else if (gvarp == &p_nf) {
@@ -2507,15 +2563,15 @@ did_set_string_option (
else if (varp == &p_sbo) {
if (check_opt_strings(p_sbo, p_scbopt_values, TRUE) != OK)
errmsg = e_invarg;
- }
- /* 'ambiwidth' */
- else if (varp == &p_ambw) {
- if (check_opt_strings(p_ambw, p_ambw_values, FALSE) != OK)
+ } else if (varp == &p_ambw || (int *)varp == &p_emoji) {
+ // 'ambiwidth'
+ if (check_opt_strings(p_ambw, p_ambw_values, false) != OK) {
errmsg = e_invarg;
- else if (set_chars_option(&p_lcs) != NULL)
+ } else if (set_chars_option(&p_lcs) != NULL) {
errmsg = (char_u *)_("E834: Conflicts with value of 'listchars'");
- else if (set_chars_option(&p_fcs) != NULL)
+ } else if (set_chars_option(&p_fcs) != NULL) {
errmsg = (char_u *)_("E835: Conflicts with value of 'fillchars'");
+ }
}
/* 'background' */
else if (varp == &p_bg) {
@@ -2524,12 +2580,11 @@ did_set_string_option (
init_highlight(FALSE, FALSE);
- if (dark != (*p_bg == 'd')
- && get_var_value((char_u *)"g:colors_name") != NULL) {
- /* The color scheme must have set 'background' back to another
- * value, that's not what we want here. Disable the color
- * scheme and set the colors again. */
- do_unlet((char_u *)"g:colors_name", TRUE);
+ if (dark != (*p_bg == 'd') && get_var_value("g:colors_name") != NULL) {
+ // The color scheme must have set 'background' back to another
+ // value, that's not what we want here. Disable the color
+ // scheme and set the colors again.
+ do_unlet(S_LEN("g:colors_name"), true);
free_string_option(p_bg);
p_bg = vim_strsave((char_u *)(dark ? "dark" : "light"));
check_string_option(&p_bg);
@@ -2558,21 +2613,19 @@ did_set_string_option (
else if (varp == &p_ei) {
if (check_ei() == FAIL)
errmsg = e_invarg;
- /* 'encoding' and 'fileencoding' */
- } else if (varp == &p_enc || gvarp == &p_fenc) {
- if (varp == &p_enc && did_source_startup_scripts) {
- errmsg = e_afterinit;
- } else if (gvarp == &p_fenc) {
- if (!MODIFIABLE(curbuf) && opt_flags != OPT_GLOBAL)
+ // 'encoding', 'fileencoding' and 'makeencoding'
+ } else if (varp == &p_enc || gvarp == &p_fenc || gvarp == &p_menc) {
+ if (gvarp == &p_fenc) {
+ if (!MODIFIABLE(curbuf) && opt_flags != OPT_GLOBAL) {
errmsg = e_modifiable;
- else if (vim_strchr(*varp, ',') != NULL)
- /* No comma allowed in 'fileencoding'; catches confusing it
- * with 'fileencodings'. */
+ } else if (vim_strchr(*varp, ',') != NULL) {
+ // No comma allowed in 'fileencoding'; catches confusing it
+ // with 'fileencodings'.
errmsg = e_invarg;
- else {
- /* May show a "+" in the title now. */
+ } else {
+ // May show a "+" in the title now.
redraw_titles();
- /* Add 'fileencoding' to the swap file. */
+ // Add 'fileencoding' to the swap file.
ml_setflags(curbuf);
}
}
@@ -2583,25 +2636,24 @@ did_set_string_option (
xfree(*varp);
*varp = p;
if (varp == &p_enc) {
- errmsg = mb_init();
- redraw_titles();
+ // only encoding=utf-8 allowed
+ if (STRCMP(p_enc, "utf-8") != 0) {
+ errmsg = e_unsupportedoption;
+ }
}
}
-
- if (errmsg == NULL) {
- /* When 'keymap' is used and 'encoding' changes, reload the keymap
- * (with another encoding). */
- if (varp == &p_enc && *curbuf->b_p_keymap != NUL)
- (void)keymap_init();
- }
} else if (varp == &p_penc) {
/* Canonize printencoding if VIM standard one */
p = enc_canonize(p_penc);
xfree(p_penc);
p_penc = p;
} else if (varp == &curbuf->b_p_keymap) {
- /* load or unload key mapping tables */
- errmsg = keymap_init();
+ if (!valid_filetype(*varp)) {
+ errmsg = e_invarg;
+ } else {
+ // load or unload key mapping tables
+ errmsg = keymap_init();
+ }
if (errmsg == NULL) {
if (*curbuf->b_p_keymap != NUL) {
@@ -2658,7 +2710,7 @@ did_set_string_option (
if (*p != NUL)
x2 = *p++;
if (*p != NUL) {
- x3 = mb_ptr2char(p);
+ x3 = utf_ptr2char(p);
p += mb_ptr2len(p);
}
if (x2 != ':' || x3 == -1 || (*p != NUL && *p != ',')) {
@@ -2728,9 +2780,13 @@ did_set_string_option (
// option.
opt_idx = ((options[opt_idx].fullname[0] == 'v')
? (shada_idx == -1
- ? ((shada_idx = findoption((char_u *) "shada")))
+ ? ((shada_idx = findoption("shada")))
: shada_idx)
: opt_idx);
+ // Update free_oldval now that we have the opt_idx for 'shada', otherwise
+ // there would be a disconnect between the check for P_ALLOCED at the start
+ // of the function and the set of P_ALLOCED at the end of the fuction.
+ free_oldval = (options[opt_idx].flags & P_ALLOCED);
for (s = p_shada; *s; ) {
/* Check it's a valid character */
if (vim_strchr((char_u *)"!\"%'/:<@cfhnrs", *s) == NULL) {
@@ -2781,13 +2837,14 @@ did_set_string_option (
for (s = p_sbr; *s; ) {
if (ptr2cells(s) != 1)
errmsg = (char_u *)N_("E595: contains unprintable or wide character");
- mb_ptr_adv(s);
+ MB_PTR_ADV(s);
}
}
- /* 'guicursor' */
- else if (varp == &p_guicursor)
+ // 'guicursor'
+ else if (varp == &p_guicursor) {
errmsg = parse_shape_opt(SHAPE_CURSOR);
+ }
else if (varp == &p_popt)
errmsg = parse_printoptions();
@@ -2940,9 +2997,10 @@ did_set_string_option (
if (s[-1] == 'k' || s[-1] == 's') {
/* skip optional filename after 'k' and 's' */
while (*s && *s != ',' && *s != ' ') {
- if (*s == '\\')
- ++s;
- ++s;
+ if (*s == '\\' && s[1] != NUL) {
+ s++;
+ }
+ s++;
}
} else {
if (errbuf != NULL) {
@@ -2964,11 +3022,16 @@ did_set_string_option (
} else {
completeopt_was_set();
}
+ } else if (varp == &curwin->w_p_scl) {
+ // 'signcolumn'
+ if (check_opt_strings(*varp, p_scl_values, false) != OK) {
+ errmsg = e_invarg;
+ }
}
/* 'pastetoggle': translate key codes like in a mapping */
else if (varp == &p_pt) {
if (*p_pt) {
- (void)replace_termcodes(p_pt, STRLEN(p_pt), &p, true, true, false,
+ (void)replace_termcodes(p_pt, STRLEN(p_pt), &p, true, true, true,
CPO_TO_CPO_FLAGS);
if (p != NULL) {
if (new_value_alloced)
@@ -3090,21 +3153,42 @@ did_set_string_option (
else if (gvarp == &p_cino) {
/* TODO: recognize errors */
parse_cino(curbuf);
- }
- /* Options that are a list of flags. */
- else {
+ // inccommand
+ } else if (varp == &p_icm) {
+ if (check_opt_strings(p_icm, p_icm_values, false) != OK) {
+ errmsg = e_invarg;
+ }
+ } else if (gvarp == &p_ft) {
+ if (!valid_filetype(*varp)) {
+ errmsg = e_invarg;
+ } else {
+ value_changed = STRCMP(oldval, *varp) != 0;
+ }
+ } else if (gvarp == &p_syn) {
+ if (!valid_filetype(*varp)) {
+ errmsg = e_invarg;
+ } else {
+ value_changed = STRCMP(oldval, *varp) != 0;
+ }
+ } else if (varp == &curwin->w_p_winhl) {
+ if (!parse_winhl_opt(curwin)) {
+ errmsg = e_invarg;
+ }
+ } else {
+ // Options that are a list of flags.
p = NULL;
- if (varp == &p_ww)
+ if (varp == &p_ww) { // 'whichwrap'
p = (char_u *)WW_ALL;
- if (varp == &p_shm)
+ }
+ if (varp == &p_shm) { // 'shortmess'
p = (char_u *)SHM_ALL;
- else if (varp == &(p_cpo))
+ } else if (varp == &(p_cpo)) { // 'cpoptions'
p = (char_u *)CPO_VI;
- else if (varp == &(curbuf->b_p_fo))
+ } else if (varp == &(curbuf->b_p_fo)) { // 'formatoptions'
p = (char_u *)FO_ALL;
- else if (varp == &curwin->w_p_cocu)
+ } else if (varp == &curwin->w_p_cocu) { // 'concealcursor'
p = (char_u *)COCU_ALL;
- else if (varp == &p_mouse) {
+ } else if (varp == &p_mouse) { // 'mouse'
p = (char_u *)MOUSE_ALL;
}
if (p != NULL) {
@@ -3128,8 +3212,6 @@ did_set_string_option (
*/
if (did_chartab)
(void)init_chartab();
- if (varp == &p_hl)
- (void)highlight_changed();
} else {
/* Remember where the option was set. */
set_option_scriptID_idx(opt_idx, opt_flags, current_SID);
@@ -3162,13 +3244,33 @@ did_set_string_option (
*/
/* When 'syntax' is set, load the syntax of that name */
if (varp == &(curbuf->b_p_syn)) {
- apply_autocmds(EVENT_SYNTAX, curbuf->b_p_syn,
- curbuf->b_fname, TRUE, curbuf);
+ static int syn_recursive = 0;
+
+ syn_recursive++;
+ // Only pass true for "force" when the value changed or not used
+ // recursively, to avoid endless recurrence.
+ apply_autocmds(EVENT_SYNTAX, curbuf->b_p_syn, curbuf->b_fname,
+ value_changed || syn_recursive == 1, curbuf);
+ syn_recursive--;
} else if (varp == &(curbuf->b_p_ft)) {
- /* 'filetype' is set, trigger the FileType autocommand */
- did_filetype = TRUE;
- apply_autocmds(EVENT_FILETYPE, curbuf->b_p_ft,
- curbuf->b_fname, TRUE, curbuf);
+ // 'filetype' is set, trigger the FileType autocommand
+ // Skip this when called from a modeline and the filetype was
+ // already set to this value.
+ if (!(opt_flags & OPT_MODELINE) || value_changed) {
+ static int ft_recursive = 0;
+
+ ft_recursive++;
+ did_filetype = true;
+ // Only pass true for "force" when the value changed or not
+ // used recursively, to avoid endless recurrence.
+ apply_autocmds(EVENT_FILETYPE, curbuf->b_p_ft, curbuf->b_fname,
+ value_changed || ft_recursive == 1, curbuf);
+ ft_recursive--;
+ // Just in case the old "curbuf" is now invalid
+ if (varp != &(curbuf->b_p_ft)) {
+ varp = NULL;
+ }
+ }
}
if (varp == &(curwin->w_s->b_p_spl)) {
char_u fname[200];
@@ -3195,7 +3297,7 @@ did_set_string_option (
if (varp == &p_mouse) {
if (*p_mouse == NUL) {
- ui_mouse_off();
+ ui_call_mouse_off();
} else {
setmouse(); // in case 'mouse' changed
}
@@ -3209,6 +3311,9 @@ did_set_string_option (
return errmsg;
}
+#ifdef _MSC_VER
+#pragma optimize("", on)
+#endif
/*
* Simple int comparison function for use with qsort()
@@ -3285,37 +3390,40 @@ skip:
return NULL; /* no error */
}
-/*
- * Handle setting 'listchars' or 'fillchars'.
- * Returns error message, NULL if it's OK.
- */
+
+/// Handle setting 'listchars' or 'fillchars'.
+/// Assume monocell characters
+///
+/// @param varp either &p_lcs ('listchars') or &p_fcs ('fillchar')
+/// @return error message, NULL if it's OK.
static char_u *set_chars_option(char_u **varp)
{
int round, i, len, entries;
char_u *p, *s;
int c1, c2 = 0;
struct charstab {
- int *cp;
- char *name;
+ int *cp; ///< char value
+ char *name; ///< char id
+ int def; ///< default value
};
- static struct charstab filltab[] =
- {
- {&fill_stl, "stl"},
- {&fill_stlnc, "stlnc"},
- {&fill_vert, "vert"},
- {&fill_fold, "fold"},
- {&fill_diff, "diff"},
+ static struct charstab filltab[] = {
+ { &fill_stl, "stl" , ' ' },
+ { &fill_stlnc, "stlnc", ' ' },
+ { &fill_vert, "vert" , 9474 }, // โ”‚
+ { &fill_fold, "fold" , 183 }, // ยท
+ { &fill_diff, "diff" , '-' },
+ { &fill_msgsep, "msgsep", ' ' },
+ { &fill_eob, "eob", '~' },
};
- static struct charstab lcstab[] =
- {
- {&lcs_eol, "eol"},
- {&lcs_ext, "extends"},
- {&lcs_nbsp, "nbsp"},
- {&lcs_prec, "precedes"},
- {&lcs_space, "space"},
- {&lcs_tab2, "tab"},
- {&lcs_trail, "trail"},
- {&lcs_conceal, "conceal"},
+ static struct charstab lcstab[] = {
+ { &lcs_eol, "eol", NUL },
+ { &lcs_ext, "extends", NUL },
+ { &lcs_nbsp, "nbsp", NUL },
+ { &lcs_prec, "precedes", NUL },
+ { &lcs_space, "space", NUL },
+ { &lcs_tab2, "tab", NUL },
+ { &lcs_trail, "trail", NUL },
+ { &lcs_conceal, "conceal", NUL },
};
struct charstab *tab;
@@ -3325,20 +3433,29 @@ static char_u *set_chars_option(char_u **varp)
} else {
tab = filltab;
entries = ARRAY_SIZE(filltab);
+ if (*p_ambw == 'd') {
+ // XXX: If ambiwidth=double then "|" and "ยท" take 2 columns, which is
+ // forbidden (TUI limitation?). Set old defaults.
+ filltab[2].def = '|';
+ filltab[3].def = '-';
+ } else {
+ filltab[2].def = 9474; // โ”‚
+ filltab[3].def = 183; // ยท
+ }
}
- /* first round: check for valid value, second round: assign values */
- for (round = 0; round <= 1; ++round) {
+ // first round: check for valid value, second round: assign values
+ for (round = 0; round <= 1; round++) {
if (round > 0) {
- /* After checking that the value is valid: set defaults: space for
- * 'fillchars', NUL for 'listchars' */
- for (i = 0; i < entries; ++i)
- if (tab[i].cp != NULL)
- *(tab[i].cp) = (varp == &p_lcs ? NUL : ' ');
- if (varp == &p_lcs)
+ // After checking that the value is valid: set defaults
+ for (i = 0; i < entries; i++) {
+ if (tab[i].cp != NULL) {
+ *(tab[i].cp) = tab[i].def;
+ }
+ }
+ if (varp == &p_lcs) {
lcs_tab1 = NUL;
- else
- fill_diff = '-';
+ }
}
p = *varp;
while (*p) {
@@ -3348,15 +3465,22 @@ static char_u *set_chars_option(char_u **varp)
&& p[len] == ':'
&& p[len + 1] != NUL) {
s = p + len + 1;
- c1 = mb_ptr2char_adv(&s);
- if (mb_char2cells(c1) > 1)
+
+ // TODO(bfredl): use schar_T representation and utfc_ptr2len
+ int c1len = utf_ptr2len(s);
+ c1 = mb_cptr2char_adv((const char_u **)&s);
+ if (mb_char2cells(c1) > 1 || (c1len == 1 && c1 > 127)) {
continue;
+ }
if (tab[i].cp == &lcs_tab2) {
- if (*s == NUL)
+ if (*s == NUL) {
continue;
- c2 = mb_ptr2char_adv(&s);
- if (mb_char2cells(c2) > 1)
+ }
+ int c2len = utf_ptr2len(s);
+ c2 = mb_cptr2char_adv((const char_u **)&s);
+ if (mb_char2cells(c2) > 1 || (c2len == 1 && c2 > 127)) {
continue;
+ }
}
if (*s == ',' || *s == NUL) {
if (round) {
@@ -3496,6 +3620,47 @@ static char_u *compile_cap_prog(synblock_T *synblock)
return NULL;
}
+/// Handle setting `winhighlight' in window "wp"
+static bool parse_winhl_opt(win_T *wp)
+{
+ int w_hl_id_normal = 0;
+ int w_hl_ids[HLF_COUNT] = { 0 };
+ int hlf;
+
+ const char *p = (const char *)wp->w_p_winhl;
+ while (*p) {
+ char *colon = strchr(p, ':');
+ if (!colon) {
+ return false;
+ }
+ size_t nlen = (size_t)(colon-p);
+ char *hi = colon+1;
+ char *commap = xstrchrnul(hi, ',');
+ int hl_id = syn_check_group((char_u *)hi, (int)(commap-hi));
+
+ if (strncmp("Normal", p, nlen) == 0) {
+ w_hl_id_normal = hl_id;
+ } else {
+ for (hlf = 0; hlf < (int)HLF_COUNT; hlf++) {
+ if (strncmp(hlf_names[hlf], p, nlen) == 0) {
+ w_hl_ids[hlf] = hl_id;
+ break;
+ }
+ }
+ if (hlf == HLF_COUNT) {
+ return false;
+ }
+ }
+
+ p = *commap ? commap+1 : "";
+ }
+
+ wp->w_hl_id_normal = w_hl_id_normal;
+ memcpy(wp->w_hl_ids, w_hl_ids, sizeof(w_hl_ids));
+ wp->w_hl_needs_update = true;
+ return true;
+}
+
/*
* Set the scriptID for an option, taking care of setting the buffer- or
* window-local value.
@@ -3504,37 +3669,40 @@ static void set_option_scriptID_idx(int opt_idx, int opt_flags, int id)
{
int both = (opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0;
int indir = (int)options[opt_idx].indir;
+ const LastSet last_set = { id, current_channel_id };
- /* Remember where the option was set. For local options need to do that
- * in the buffer or window structure. */
- if (both || (opt_flags & OPT_GLOBAL) || (indir & (PV_BUF|PV_WIN)) == 0)
- options[opt_idx].scriptID = id;
+ // Remember where the option was set. For local options need to do that
+ // in the buffer or window structure.
+ if (both || (opt_flags & OPT_GLOBAL) || (indir & (PV_BUF|PV_WIN)) == 0) {
+ options[opt_idx].last_set = last_set;
+ }
if (both || (opt_flags & OPT_LOCAL)) {
- if (indir & PV_BUF)
- curbuf->b_p_scriptID[indir & PV_MASK] = id;
- else if (indir & PV_WIN)
- curwin->w_p_scriptID[indir & PV_MASK] = id;
+ if (indir & PV_BUF) {
+ curbuf->b_p_scriptID[indir & PV_MASK] = last_set;
+ } else if (indir & PV_WIN) {
+ curwin->w_p_scriptID[indir & PV_MASK] = last_set;
+ }
}
}
-/*
- * Set the value of a boolean option, and take care of side effects.
- * Returns NULL for success, or an error message for an error.
- */
-static char_u *
-set_bool_option (
- int opt_idx, /* index in options[] table */
- char_u *varp, /* pointer to the option variable */
- int value, /* new value */
- int opt_flags /* OPT_LOCAL and/or OPT_GLOBAL */
-)
+/// Set the value of a boolean option, taking care of side effects
+///
+/// @param[in] opt_idx Option index in options[] table.
+/// @param[out] varp Pointer to the option variable.
+/// @param[in] value New value.
+/// @param[in] opt_flags OPT_LOCAL and/or OPT_GLOBAL.
+///
+/// @return NULL on success, error message on error.
+static char *set_bool_option(const int opt_idx, char_u *const varp,
+ const int value,
+ const int opt_flags)
{
int old_value = *(int *)varp;
/* Disallow changing some options from secure mode */
if ((secure || sandbox != 0)
&& (options[opt_idx].flags & P_SECURE)) {
- return e_secure;
+ return (char *)e_secure;
}
*(int *)varp = value; /* set the new value */
@@ -3547,29 +3715,37 @@ set_bool_option (
*(int *)get_varp_scope(&(options[opt_idx]), OPT_GLOBAL) = value;
// Ensure that options set to p_force_on cannot be disabled.
- if ((int *)varp == &p_force_on && p_force_on == FALSE) {
- p_force_on = TRUE;
- return e_unsupportedoption;
- }
+ if ((int *)varp == &p_force_on && p_force_on == false) {
+ p_force_on = true;
+ return (char *)e_unsupportedoption;
// Ensure that options set to p_force_off cannot be enabled.
- else if ((int *)varp == &p_force_off && p_force_off == TRUE) {
- p_force_off = FALSE;
- return e_unsupportedoption;
- }
- /* 'undofile' */
- else if ((int *)varp == &curbuf->b_p_udf || (int *)varp == &p_udf) {
- /* Only take action when the option was set. When reset we do not
- * delete the undo file, the option may be set again without making
- * any changes in between. */
+ } else if ((int *)varp == &p_force_off && p_force_off == true) {
+ p_force_off = false;
+ return (char *)e_unsupportedoption;
+ } else if ((int *)varp == &p_lrm) {
+ // 'langremap' -> !'langnoremap'
+ p_lnr = !p_lrm;
+ } else if ((int *)varp == &p_lnr) {
+ // 'langnoremap' -> !'langremap'
+ p_lrm = !p_lnr;
+ } else if ((int *)varp == &curwin->w_p_cul && !value && old_value) {
+ // 'cursorline'
+ reset_cursorline();
+ // 'undofile'
+ } else if ((int *)varp == &curbuf->b_p_udf || (int *)varp == &p_udf) {
+ // Only take action when the option was set. When reset we do not
+ // delete the undo file, the option may be set again without making
+ // any changes in between.
if (curbuf->b_p_udf || p_udf) {
char_u hash[UNDO_HASH_SIZE];
buf_T *save_curbuf = curbuf;
- for (curbuf = firstbuf; curbuf != NULL; curbuf = curbuf->b_next) {
- /* When 'undofile' is set globally: for every buffer, otherwise
- * only for the current buffer: Try to read in the undofile,
- * if one exists, the buffer wasn't changed and the buffer was
- * loaded */
+ FOR_ALL_BUFFERS(bp) {
+ curbuf = bp;
+ // When 'undofile' is set globally: for every buffer, otherwise
+ // only for the current buffer: Try to read in the undofile,
+ // if one exists, the buffer wasn't changed and the buffer was
+ // loaded
if ((curbuf == save_curbuf
|| (opt_flags & OPT_GLOBAL) || opt_flags == 0)
&& !curbufIsChanged() && curbuf->b_ml.ml_mfp != NULL) {
@@ -3647,14 +3823,16 @@ set_bool_option (
/* when 'insertmode' is set from an autocommand need to do work here */
else if ((int *)varp == &p_im) {
if (p_im) {
- if ((State & INSERT) == 0)
- need_start_insertmode = TRUE;
- stop_insert_mode = FALSE;
- } else {
- need_start_insertmode = FALSE;
- stop_insert_mode = TRUE;
- if (restart_edit != 0 && mode_displayed)
- clear_cmdline = TRUE; /* remove "(insert)" */
+ if ((State & INSERT) == 0) {
+ need_start_insertmode = true;
+ }
+ stop_insert_mode = false;
+ } else if (old_value) { // only reset if it was set previously
+ need_start_insertmode = false;
+ stop_insert_mode = true;
+ if (restart_edit != 0 && mode_displayed) {
+ clear_cmdline = true; // remove "(insert)"
+ }
restart_edit = 0;
}
}
@@ -3679,28 +3857,24 @@ set_bool_option (
if (curwin->w_p_pvw) {
FOR_ALL_WINDOWS_IN_TAB(win, curtab) {
if (win->w_p_pvw && win != curwin) {
- curwin->w_p_pvw = FALSE;
- return (char_u *)N_("E590: A preview window already exists");
+ curwin->w_p_pvw = false;
+ return N_("E590: A preview window already exists");
}
}
}
- }
-
- /*
- * When 'lisp' option changes include/exclude '-' in
- * keyword characters.
- */
- else if (varp == (char_u *)&(curbuf->b_p_lisp)) {
- (void)buf_init_chartab(curbuf, FALSE); /* ignore errors */
- }
- /* when 'title' changed, may need to change the title; same for 'icon' */
- else if ((int *)varp == &p_title) {
- did_set_title(FALSE);
+ } else if (varp == (char_u *)&(curbuf->b_p_lisp)) {
+ // When 'lisp' option changes include/exclude '-' in
+ // keyword characters.
+ (void)buf_init_chartab(curbuf, false); // ignore errors
+ } else if ((int *)varp == &p_title) {
+ // when 'title' changed, may need to change the title; same for 'icon'
+ did_set_title(false);
} else if ((int *)varp == &p_icon) {
- did_set_title(TRUE);
- } else if ((bool *)varp == &curbuf->b_changed) {
- if (!value)
- save_file_ff(curbuf); /* Buffer is unchanged */
+ did_set_title(true);
+ } else if ((int *)varp == &curbuf->b_changed) {
+ if (!value) {
+ save_file_ff(curbuf); // Buffer is unchanged
+ }
redraw_titles();
modified_was_set = value;
}
@@ -3728,11 +3902,12 @@ set_bool_option (
else if ((int *)varp == &curwin->w_p_wrap) {
if (curwin->w_p_wrap)
curwin->w_leftcol = 0;
- } else if ((bool *)varp == &p_ea) {
- if (p_ea && !old_value)
+ } else if ((int *)varp == &p_ea) {
+ if (p_ea && !old_value) {
win_equal(curwin, false, 0);
- } else if ((bool *)varp == &p_acd) {
- /* Change directories when the 'acd' option is set now. */
+ }
+ } else if ((int *)varp == &p_acd) {
+ // Change directories when the 'acd' option is set now.
do_autochdir();
}
/* 'diff' */
@@ -3812,8 +3987,8 @@ set_bool_option (
/* Enable Arabic shaping (major part of what Arabic requires) */
if (!p_arshape) {
- p_arshape = TRUE;
- redraw_later_clear();
+ p_arshape = true;
+ redraw_all_later(NOT_VALID);
}
}
@@ -3823,17 +3998,16 @@ set_bool_option (
static char *w_arabic = N_(
"W17: Arabic requires UTF-8, do ':set encoding=utf-8'");
- msg_source(hl_attr(HLF_W));
- MSG_ATTR(_(w_arabic), hl_attr(HLF_W));
+ msg_source(HL_ATTR(HLF_W));
+ msg_attr(_(w_arabic), HL_ATTR(HLF_W));
set_vim_var_string(VV_WARNINGMSG, _(w_arabic), -1);
}
/* set 'delcombine' */
p_deco = TRUE;
- /* Force-set the necessary keymap for arabic */
- set_option_value((char_u *)"keymap", 0L, (char_u *)"arabic",
- OPT_LOCAL);
+ // Force-set the necessary keymap for arabic.
+ set_option_value("keymap", 0L, "arabic", OPT_LOCAL);
p_altkeymap = 0;
p_hkmap = 0;
p_fkmap = 0;
@@ -3871,7 +4045,8 @@ set_bool_option (
options[opt_idx].flags |= P_WAS_SET;
- if (!starting) {
+ // Don't do this while starting up or recursively.
+ if (!starting && *get_vim_var_str(VV_OPTION_TYPE) == NUL) {
char buf_old[2];
char buf_new[2];
char buf_type[7];
@@ -3890,6 +4065,11 @@ set_bool_option (
reset_v_option_vars();
}
+ if (options[opt_idx].flags & P_UI_OPTION) {
+ ui_call_option_set(cstr_as_string(options[opt_idx].fullname),
+ BOOLEAN_OBJ(value));
+ }
+
comp_col(); /* in case 'ruler' or 'showcmd' changed */
if (curwin->w_curswant != MAXCOL
&& (options[opt_idx].flags & (P_CURSWANT | P_RALL)) != 0)
@@ -3899,20 +4079,18 @@ set_bool_option (
return NULL;
}
-/*
- * Set the value of a number option, and take care of side effects.
- * Returns NULL for success, or an error message for an error.
- */
-static char_u *
-set_num_option (
- int opt_idx, /* index in options[] table */
- char_u *varp, /* pointer to the option variable */
- long value, /* new value */
- char_u *errbuf, /* buffer for error messages */
- size_t errbuflen, /* length of "errbuf" */
- int opt_flags /* OPT_LOCAL, OPT_GLOBAL and
- OPT_MODELINE */
-)
+/// Set the value of a number option, taking care of side effects
+///
+/// @param[in] opt_idx Option index in options[] table.
+/// @param[out] varp Pointer to the option variable.
+/// @param[in] value New value.
+/// @param errbuf Buffer for error messages.
+/// @param[in] errbuflen Length of `errbuf`.
+/// @param[in] opt_flags OPT_LOCAL, OPT_GLOBAL or OPT_MODELINE.
+///
+/// @return NULL on success, error message on error.
+static char *set_num_option(int opt_idx, char_u *varp, long value,
+ char_u *errbuf, size_t errbuflen, int opt_flags)
{
char_u *errmsg = NULL;
long old_value = *(long *)varp;
@@ -3923,113 +4101,198 @@ set_num_option (
/* Disallow changing some options from secure mode. */
if ((secure || sandbox != 0)
&& (options[opt_idx].flags & P_SECURE)) {
- return e_secure;
+ return (char *)e_secure;
}
- *pp = value;
- /* Remember where the option was set. */
- set_option_scriptID_idx(opt_idx, opt_flags, current_SID);
-
- if (curbuf->b_p_sw < 0) {
- errmsg = e_positive;
- curbuf->b_p_sw = curbuf->b_p_ts;
+ // Many number options assume their value is in the signed int range.
+ if (value < INT_MIN || value > INT_MAX) {
+ return (char *)e_invarg;
}
- /*
- * Number options that need some action when changed
- */
- if (pp == &p_wh || pp == &p_hh) {
- if (p_wh < 1) {
+ // Options that need some validation.
+ if (pp == &p_wh) {
+ if (value < 1) {
errmsg = e_positive;
- p_wh = 1;
- }
- if (p_wmh > p_wh) {
+ } else if (p_wmh > value) {
errmsg = e_winheight;
- p_wh = p_wmh;
}
- if (p_hh < 0) {
+ } else if (pp == &p_hh) {
+ if (value < 0) {
errmsg = e_positive;
- p_hh = 0;
}
-
- /* Change window height NOW */
- if (lastwin != firstwin) {
- if (pp == &p_wh && curwin->w_height < p_wh)
- win_setheight((int)p_wh);
- if (pp == &p_hh && curbuf->b_help && curwin->w_height < p_hh)
- win_setheight((int)p_hh);
- }
- }
- /* 'winminheight' */
- else if (pp == &p_wmh) {
- if (p_wmh < 0) {
+ } else if (pp == &p_wmh) {
+ if (value < 0) {
errmsg = e_positive;
- p_wmh = 0;
- }
- if (p_wmh > p_wh) {
+ } else if (value > p_wh) {
errmsg = e_winheight;
- p_wmh = p_wh;
}
- win_setminheight();
} else if (pp == &p_wiw) {
- if (p_wiw < 1) {
+ if (value < 1) {
errmsg = e_positive;
- p_wiw = 1;
+ } else if (p_wmw > value) {
+ errmsg = e_winwidth;
}
- if (p_wmw > p_wiw) {
+ } else if (pp == &p_wmw) {
+ if (value < 0) {
+ errmsg = e_positive;
+ } else if (value > p_wiw) {
errmsg = e_winwidth;
- p_wiw = p_wmw;
}
+ } else if (pp == &p_mco) {
+ value = MAX_MCO;
+ } else if (pp == &p_titlelen) {
+ if (value < 0) {
+ errmsg = e_positive;
+ }
+ } else if (pp == &p_uc) {
+ if (value < 0) {
+ errmsg = e_positive;
+ }
+ } else if (pp == &p_ch) {
+ if (value < 1) {
+ errmsg = e_positive;
+ }
+ } else if (pp == &p_tm) {
+ if (value < 0) {
+ errmsg = e_positive;
+ }
+ } else if (pp == &p_hi) {
+ if (value < 0) {
+ errmsg = e_positive;
+ } else if (value > 10000) {
+ errmsg = e_invarg;
+ }
+ } else if (pp == &p_re) {
+ if (value < 0 || value > 2) {
+ errmsg = e_invarg;
+ }
+ } else if (pp == &p_report) {
+ if (value < 0) {
+ errmsg = e_positive;
+ }
+ } else if (pp == &p_so) {
+ if (value < 0 && full_screen) {
+ errmsg = e_scroll;
+ }
+ } else if (pp == &p_siso) {
+ if (value < 0 && full_screen) {
+ errmsg = e_positive;
+ }
+ } else if (pp == &p_cwh) {
+ if (value < 1) {
+ errmsg = e_positive;
+ }
+ } else if (pp == &p_ut) {
+ if (value < 0) {
+ errmsg = e_positive;
+ }
+ } else if (pp == &p_ss) {
+ if (value < 0) {
+ errmsg = e_positive;
+ }
+ } else if (pp == &curwin->w_p_fdl || pp == &curwin->w_allbuf_opt.wo_fdl) {
+ if (value < 0) {
+ errmsg = e_positive;
+ }
+ } else if (pp == &curwin->w_p_fdc || pp == &curwin->w_allbuf_opt.wo_fdc) {
+ if (value < 0) {
+ errmsg = e_positive;
+ } else if (value > 12) {
+ errmsg = e_invarg;
+ }
+ } else if (pp == &curwin->w_p_cole || pp == &curwin->w_allbuf_opt.wo_cole) {
+ if (value < 0) {
+ errmsg = e_positive;
+ } else if (value > 3) {
+ errmsg = e_invarg;
+ }
+ } else if (pp == &curwin->w_p_nuw || pp == &curwin->w_allbuf_opt.wo_nuw) {
+ if (value < 1) {
+ errmsg = e_positive;
+ } else if (value > 10) {
+ errmsg = e_invarg;
+ }
+ } else if (pp == &curbuf->b_p_iminsert || pp == &p_iminsert) {
+ if (value < 0 || value > B_IMODE_LAST) {
+ errmsg = e_invarg;
+ }
+ } else if (pp == &curbuf->b_p_imsearch || pp == &p_imsearch) {
+ if (value < -1 || value > B_IMODE_LAST) {
+ errmsg = e_invarg;
+ }
+ } else if (pp == &curbuf->b_p_channel || pp == &p_channel) {
+ errmsg = e_invarg;
+ } else if (pp == &curbuf->b_p_scbk || pp == &p_scbk) {
+ if (value < -1 || value > SB_MAX
+ || (value != -1 && opt_flags == OPT_LOCAL && !curbuf->terminal)) {
+ errmsg = e_invarg;
+ }
+ } else if (pp == &curbuf->b_p_sw || pp == &p_sw) {
+ if (value < 0) {
+ errmsg = e_positive;
+ }
+ } else if (pp == &curbuf->b_p_ts || pp == &p_ts) {
+ if (value < 1) {
+ errmsg = e_positive;
+ }
+ } else if (pp == &curbuf->b_p_tw || pp == &p_tw) {
+ if (value < 0) {
+ errmsg = e_positive;
+ }
+ }
- /* Change window width NOW */
- if (lastwin != firstwin && curwin->w_width < p_wiw)
- win_setwidth((int)p_wiw);
+ // Don't change the value and return early if validation failed.
+ if (errmsg != NULL) {
+ return (char *)errmsg;
}
- /* 'winminwidth' */
- else if (pp == &p_wmw) {
- if (p_wmw < 0) {
- errmsg = e_positive;
- p_wmw = 0;
+
+ *pp = value;
+ // Remember where the option was set.
+ set_option_scriptID_idx(opt_idx, opt_flags, current_SID);
+
+ // For these options we want to fix some invalid values.
+ if (pp == &p_window) {
+ if (p_window < 1) {
+ p_window = Rows - 1;
+ } else if (p_window >= Rows) {
+ p_window = Rows - 1;
}
- if (p_wmw > p_wiw) {
- errmsg = e_winwidth;
- p_wmw = p_wiw;
+ } else if (pp == &p_ch) {
+ if (p_ch > Rows - min_rows() + 1) {
+ p_ch = Rows - min_rows() + 1;
}
+ }
+
+ // Number options that need some action when changed
+ if (pp == &p_wh) {
+ if (!ONE_WINDOW && curwin->w_height < p_wh) {
+ win_setheight((int)p_wh);
+ }
+ } else if (pp == &p_hh) {
+ if (!ONE_WINDOW && curbuf->b_help && curwin->w_height < p_hh) {
+ win_setheight((int)p_hh);
+ }
+ } else if (pp == &p_wmh) {
win_setminheight();
+ } else if (pp == &p_wiw) {
+ if (!ONE_WINDOW && curwin->w_width < p_wiw) {
+ win_setwidth((int)p_wiw);
+ }
} else if (pp == &p_ls) {
- /* (re)set last window status line */
- last_status(false);
- }
- /* (re)set tab page line */
- else if (pp == &p_stal) {
- shell_new_rows(); /* recompute window positions and heights */
- }
- /* 'foldlevel' */
- else if (pp == &curwin->w_p_fdl) {
- if (curwin->w_p_fdl < 0)
- curwin->w_p_fdl = 0;
+ last_status(false); // (re)set last window status line.
+ } else if (pp == &p_stal) {
+ // (re)set tab page line
+ shell_new_rows(); // recompute window positions and heights
+ } else if (pp == &curwin->w_p_fdl) {
newFoldLevel();
- }
- /* 'foldminlines' */
- else if (pp == &curwin->w_p_fml) {
+ } else if (pp == &curwin->w_p_fml) {
foldUpdateAll(curwin);
- }
- /* 'foldnestmax' */
- else if (pp == &curwin->w_p_fdn) {
- if (foldmethodIsSyntax(curwin) || foldmethodIsIndent(curwin))
+ } else if (pp == &curwin->w_p_fdn) {
+ if (foldmethodIsSyntax(curwin) || foldmethodIsIndent(curwin)) {
foldUpdateAll(curwin);
- }
- /* 'foldcolumn' */
- else if (pp == &curwin->w_p_fdc) {
- if (curwin->w_p_fdc < 0) {
- errmsg = e_positive;
- curwin->w_p_fdc = 0;
- } else if (curwin->w_p_fdc > 12) {
- errmsg = e_invarg;
- curwin->w_p_fdc = 12;
}
- // 'shiftwidth' or 'tabstop'
- } else if (pp == &curbuf->b_p_sw || pp == (long *)&curbuf->b_p_ts) {
+ } else if (pp == &curbuf->b_p_sw || pp == &curbuf->b_p_ts) {
+ // 'shiftwidth' or 'tabstop'
if (foldmethodIsIndent(curwin)) {
foldUpdateAll(curwin);
}
@@ -4038,114 +4301,52 @@ set_num_option (
if (pp == &curbuf->b_p_sw || curbuf->b_p_sw == 0) {
parse_cino(curbuf);
}
- }
- /* 'maxcombine' */
- else if (pp == &p_mco) {
- if (p_mco > MAX_MCO)
- p_mco = MAX_MCO;
- else if (p_mco < 0)
- p_mco = 0;
- screenclear(); /* will re-allocate the screen */
} else if (pp == &curbuf->b_p_iminsert) {
- if (curbuf->b_p_iminsert < 0 || curbuf->b_p_iminsert > B_IMODE_LAST) {
- errmsg = e_invarg;
- curbuf->b_p_iminsert = B_IMODE_NONE;
- }
- p_iminsert = curbuf->b_p_iminsert;
showmode();
- /* Show/unshow value of 'keymap' in status lines. */
+ // Show/unshow value of 'keymap' in status lines.
status_redraw_curbuf();
- } else if (pp == &p_window) {
- if (p_window < 1)
- p_window = 1;
- else if (p_window >= Rows)
- p_window = Rows - 1;
- } else if (pp == &curbuf->b_p_imsearch) {
- if (curbuf->b_p_imsearch < -1 || curbuf->b_p_imsearch > B_IMODE_LAST) {
- errmsg = e_invarg;
- curbuf->b_p_imsearch = B_IMODE_NONE;
- }
- p_imsearch = curbuf->b_p_imsearch;
- }
- /* if 'titlelen' has changed, redraw the title */
- else if (pp == &p_titlelen) {
- if (p_titlelen < 0) {
- errmsg = e_positive;
- p_titlelen = 85;
- }
- if (starting != NO_SCREEN && old_value != p_titlelen)
- need_maketitle = TRUE;
- }
- /* if p_ch changed value, change the command line height */
- else if (pp == &p_ch) {
- if (p_ch < 1) {
- errmsg = e_positive;
- p_ch = 1;
- }
- if (p_ch > Rows - min_rows() + 1)
- p_ch = Rows - min_rows() + 1;
-
- /* Only compute the new window layout when startup has been
- * completed. Otherwise the frame sizes may be wrong. */
- if (p_ch != old_value && full_screen
- )
+ } else if (pp == &p_titlelen) {
+ // if 'titlelen' has changed, redraw the title
+ if (starting != NO_SCREEN && old_value != p_titlelen) {
+ need_maketitle = true;
+ }
+ } else if (pp == &p_ch) {
+ // if p_ch changed value, change the command line height
+ // Only compute the new window layout when startup has been
+ // completed. Otherwise the frame sizes may be wrong.
+ if (p_ch != old_value && full_screen) {
command_height();
- }
- /* when 'updatecount' changes from zero to non-zero, open swap files */
- else if (pp == &p_uc) {
- if (p_uc < 0) {
- errmsg = e_positive;
- p_uc = 100;
}
- if (p_uc && !old_value)
+ } else if (pp == &p_uc) {
+ // when 'updatecount' changes from zero to non-zero, open swap files
+ if (p_uc && !old_value) {
ml_open_files();
- } else if (pp == &curwin->w_p_cole) {
- if (curwin->w_p_cole < 0) {
- errmsg = e_positive;
- curwin->w_p_cole = 0;
- } else if (curwin->w_p_cole > 3) {
- errmsg = e_invarg;
- curwin->w_p_cole = 3;
- }
- }
- /* sync undo before 'undolevels' changes */
- else if (pp == &p_ul) {
- /* use the old value, otherwise u_sync() may not work properly */
- p_ul = old_value;
- u_sync(TRUE);
- p_ul = value;
- } else if (pp == &curbuf->b_p_ul) {
- /* use the old value, otherwise u_sync() may not work properly */
- curbuf->b_p_ul = old_value;
- u_sync(TRUE);
- curbuf->b_p_ul = value;
- }
- /* 'numberwidth' must be positive */
- else if (pp == &curwin->w_p_nuw) {
- if (curwin->w_p_nuw < 1) {
- errmsg = e_positive;
- curwin->w_p_nuw = 1;
}
- if (curwin->w_p_nuw > 10) {
+ } else if (pp == &p_pyx) {
+ if (p_pyx != 0 && p_pyx != 2 && p_pyx != 3) {
errmsg = e_invarg;
- curwin->w_p_nuw = 10;
}
- curwin->w_nrwidth_line_count = 0;
+ } else if (pp == &p_ul || pp == &curbuf->b_p_ul) {
+ // sync undo before 'undolevels' changes
+ // use the old value, otherwise u_sync() may not work properly
+ *pp = old_value;
+ u_sync(true);
+ *pp = value;
} else if (pp == &curbuf->b_p_tw) {
- if (curbuf->b_p_tw < 0) {
- errmsg = e_positive;
- curbuf->b_p_tw = 0;
- }
-
FOR_ALL_TAB_WINDOWS(tp, wp) {
check_colorcolumn(wp);
}
-
+ } else if (pp == &curbuf->b_p_scbk || pp == &p_scbk) {
+ if (curbuf->terminal) {
+ // Force the scrollback to take effect.
+ terminal_resize(curbuf->terminal, UINT16_MAX, UINT16_MAX);
+ }
+ } else if (pp == &curwin->w_p_nuw) {
+ curwin->w_nrwidth_line_count = 0;
}
- /*
- * Check the bounds for numeric options here
- */
+
+ // Check the (new) bounds for Rows and Columns here.
if (Rows < min_rows() && full_screen) {
if (errbuf != NULL) {
vim_snprintf((char *)errbuf, errbuflen,
@@ -4165,37 +4366,28 @@ set_num_option (
limit_screen_size();
- /*
- * If the screen (shell) height has been changed, assume it is the
- * physical screenheight.
- */
+ // If the screen (shell) height has been changed, assume it is the
+ // physical screenheight.
if (old_Rows != Rows || old_Columns != Columns) {
- /* Changing the screen size is not allowed while updating the screen. */
+ // Changing the screen size is not allowed while updating the screen.
if (updating_screen) {
*pp = old_value;
} else if (full_screen) {
screen_resize((int)Columns, (int)Rows);
} else {
- /* Postpone the resizing; check the size and cmdline position for
- * messages. */
+ // Postpone the resizing; check the size and cmdline position for
+ // messages.
check_shellsize();
if (cmdline_row > Rows - p_ch && Rows > p_ch) {
assert(p_ch >= 0 && Rows - p_ch <= INT_MAX);
cmdline_row = (int)(Rows - p_ch);
}
}
- if (p_window >= Rows || !option_was_set((char_u *)"window"))
+ if (p_window >= Rows || !option_was_set("window")) {
p_window = Rows - 1;
+ }
}
- if (curbuf->b_p_ts <= 0) {
- errmsg = e_positive;
- curbuf->b_p_ts = 8;
- }
- if (p_tm < 0) {
- errmsg = e_positive;
- p_tm = 0;
- }
if ((curwin->w_p_scr <= 0
|| (curwin->w_p_scr > curwin->w_height
&& curwin->w_height > 0))
@@ -4212,21 +4404,6 @@ set_num_option (
else /* curwin->w_p_scr > curwin->w_height */
curwin->w_p_scr = curwin->w_height;
}
- if (p_hi < 0) {
- errmsg = e_positive;
- p_hi = 0;
- } else if (p_hi > 10000) {
- errmsg = e_invarg;
- p_hi = 10000;
- }
- if (p_re < 0 || p_re > 2) {
- errmsg = e_invarg;
- p_re = 0;
- }
- if (p_report < 0) {
- errmsg = e_positive;
- p_report = 1;
- }
if ((p_sj < -100 || p_sj >= Rows) && full_screen) {
if (Rows != old_Rows) /* Rows changed, just adjust p_sj */
p_sj = Rows / 2;
@@ -4235,34 +4412,21 @@ set_num_option (
p_sj = 1;
}
}
- if (p_so < 0 && full_screen) {
- errmsg = e_scroll;
- p_so = 0;
- }
- if (p_siso < 0 && full_screen) {
- errmsg = e_positive;
- p_siso = 0;
- }
- if (p_cwh < 1) {
- errmsg = e_positive;
- p_cwh = 1;
- }
- if (p_ut < 0) {
- errmsg = e_positive;
- p_ut = 2000;
- }
- if (p_ss < 0) {
- errmsg = e_positive;
- p_ss = 0;
- }
- /* May set global value for local option. */
- if ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0)
+ // May set global value for local option.
+ if ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0) {
*(long *)get_varp_scope(&(options[opt_idx]), OPT_GLOBAL) = *pp;
+ }
+
+ if (pp == &curbuf->b_p_scbk && !curbuf->terminal) {
+ // Normal buffer: reset local 'scrollback' after updating the global value.
+ curbuf->b_p_scbk = -1;
+ }
options[opt_idx].flags |= P_WAS_SET;
- if (!starting && errmsg == NULL) {
+ // Don't do this while starting up, failure or recursively.
+ if (!starting && errmsg == NULL && *get_vim_var_str(VV_OPTION_TYPE) == NUL) {
char buf_old[NUMBUFLEN];
char buf_new[NUMBUFLEN];
char buf_type[7];
@@ -4279,13 +4443,38 @@ set_num_option (
reset_v_option_vars();
}
+ if (errmsg == NULL && options[opt_idx].flags & P_UI_OPTION) {
+ ui_call_option_set(cstr_as_string(options[opt_idx].fullname),
+ INTEGER_OBJ(value));
+ }
+
comp_col(); /* in case 'columns' or 'ls' changed */
if (curwin->w_curswant != MAXCOL
&& (options[opt_idx].flags & (P_CURSWANT | P_RALL)) != 0)
curwin->w_set_curswant = TRUE;
check_redraw(options[opt_idx].flags);
- return errmsg;
+ return (char *)errmsg;
+}
+
+static void trigger_optionsset_string(int opt_idx, int opt_flags,
+ char *oldval, char *newval)
+{
+ // Don't do this recursively.
+ if (oldval != NULL
+ && newval != NULL
+ && *get_vim_var_str(VV_OPTION_TYPE) == NUL) {
+ char buf_type[7];
+
+ vim_snprintf(buf_type, ARRAY_SIZE(buf_type), "%s",
+ (opt_flags & OPT_LOCAL) ? "local" : "global");
+ set_vim_var_string(VV_OPTION_OLD, oldval, -1);
+ set_vim_var_string(VV_OPTION_NEW, newval, -1);
+ set_vim_var_string(VV_OPTION_TYPE, buf_type, -1);
+ apply_autocmds(EVENT_OPTIONSET,
+ (char_u *)options[opt_idx].fullname, NULL, false, NULL);
+ reset_v_option_vars();
+ }
}
/*
@@ -4297,17 +4486,24 @@ static void check_redraw(uint32_t flags)
bool doclear = (flags & P_RCLR) == P_RCLR;
bool all = ((flags & P_RALL) == P_RALL || doclear);
- if ((flags & P_RSTAT) || all) /* mark all status lines dirty */
+ if ((flags & P_RSTAT) || all) { // mark all status lines dirty
status_redraw_all();
+ }
- if ((flags & P_RBUF) || (flags & P_RWIN) || all)
+ if ((flags & P_RBUF) || (flags & P_RWIN) || all) {
changed_window_setting();
- if (flags & P_RBUF)
+ }
+ if (flags & P_RBUF) {
redraw_curbuf_later(NOT_VALID);
- if (doclear)
+ }
+ if (flags & P_RWINONLY) {
+ redraw_later(NOT_VALID);
+ }
+ if (doclear) {
redraw_all_later(CLEAR);
- else if (all)
+ } else if (all) {
redraw_all_later(NOT_VALID);
+ }
}
/// Find index for named option
@@ -4316,39 +4512,36 @@ static void check_redraw(uint32_t flags)
/// @param[in] len Length of the option.
///
/// @return Index of the option or -1 if option was not found.
-int findoption_len(const char_u *const arg, const size_t len)
+int findoption_len(const char *const arg, const size_t len)
{
- char *s, *p;
+ const char *s;
+ const char *p;
static int quick_tab[27] = { 0, 0 }; // quick access table
- int is_term_opt;
- /*
- * For first call: Initialize the quick-access table.
- * It contains the index for the first option that starts with a certain
- * letter. There are 26 letters, plus the first "t_" option.
- */
+ // For first call: Initialize the quick-access table.
+ // It contains the index for the first option that starts with a certain
+ // letter. There are 26 letters, plus the first "t_" option.
if (quick_tab[1] == 0) {
p = options[0].fullname;
for (short int i = 1; (s = options[i].fullname) != NULL; i++) {
if (s[0] != p[0]) {
- if (s[0] == 't' && s[1] == '_')
+ if (s[0] == 't' && s[1] == '_') {
quick_tab[26] = i;
- else
+ } else {
quick_tab[CharOrdLow(s[0])] = i;
+ }
}
p = s;
}
}
- /*
- * Check for name starting with an illegal character.
- */
+ // Check for name starting with an illegal character.
if (len == 0 || arg[0] < 'a' || arg[0] > 'z') {
return -1;
}
int opt_idx;
- is_term_opt = (len > 2 && arg[0] == 't' && arg[1] == '_');
+ const bool is_term_opt = (len > 2 && arg[0] == 't' && arg[1] == '_');
if (is_term_opt) {
opt_idx = quick_tab[26];
} else {
@@ -4356,7 +4549,7 @@ int findoption_len(const char_u *const arg, const size_t len)
}
// Match full name
for (; (s = options[opt_idx].fullname) != NULL; opt_idx++) {
- if (STRNCMP(arg, s, len) == 0 && s[len] == NUL) {
+ if (strncmp(arg, s, len) == 0 && s[len] == NUL) {
break;
}
}
@@ -4365,26 +4558,32 @@ int findoption_len(const char_u *const arg, const size_t len)
// Match short name
for (; options[opt_idx].fullname != NULL; opt_idx++) {
s = options[opt_idx].shortname;
- if (s != NULL && STRNCMP(arg, s, len) == 0 && s[len] == NUL) {
+ if (s != NULL && strncmp(arg, s, len) == 0 && s[len] == NUL) {
break;
}
s = NULL;
}
}
- if (s == NULL)
+ if (s == NULL) {
opt_idx = -1;
+ }
return opt_idx;
}
-bool is_tty_option(char *name)
+bool is_tty_option(const char *name)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
- return (name[0] == 't' && name[1] == '_') || !strcmp((char *)name, "term");
+ return (name[0] == 't' && name[1] == '_')
+ || strequal(name, "term")
+ || strequal(name, "ttytype");
}
#define TCO_BUFFER_SIZE 8
+/// @param name TUI-related option
+/// @param[out,allocated] value option string value
bool get_tty_option(char *name, char **value)
{
- if (!strcmp(name, "t_Co")) {
+ if (strequal(name, "t_Co")) {
if (value) {
if (t_colors <= 1) {
*value = xstrdup("");
@@ -4396,9 +4595,16 @@ bool get_tty_option(char *name, char **value)
return true;
}
- if (!strcmp(name, "term") || !strcmp(name, "ttytype")) {
+ if (strequal(name, "term")) {
if (value) {
- *value = xstrdup("nvim");
+ *value = p_term ? xstrdup(p_term) : xstrdup("nvim");
+ }
+ return true;
+ }
+
+ if (strequal(name, "ttytype")) {
+ if (value) {
+ *value = p_ttytype ? xstrdup(p_ttytype) : xstrdup("nvim");
}
return true;
}
@@ -4414,51 +4620,49 @@ bool get_tty_option(char *name, char **value)
return false;
}
-bool set_tty_option(char *name, char *value)
+bool set_tty_option(const char *name, char *value)
{
- if (!strcmp(name, "t_Co")) {
- int colors = atoi(value);
-
- // Only reinitialize colors if t_Co value has really changed to
- // avoid expensive reload of colorscheme if t_Co is set to the
- // same value multiple times
- if (colors != t_colors) {
- t_colors = colors;
- // We now have a different color setup, initialize it again.
- init_highlight(TRUE, FALSE);
+ if (strequal(name, "term")) {
+ if (p_term) {
+ xfree(p_term);
}
+ p_term = value;
+ return true;
+ }
+ if (strequal(name, "ttytype")) {
+ if (p_ttytype) {
+ xfree(p_ttytype);
+ }
+ p_ttytype = value;
return true;
}
- return is_tty_option(name) || !strcmp(name, "term")
- || !strcmp(name, "ttytype");
+ return false;
}
-/*
- * Find index for option 'arg'.
- * Return -1 if not found.
- */
-static int findoption(char_u *arg)
+/// Find index for an option
+///
+/// @param[in] arg Option name.
+///
+/// @return Option index or -1 if option was not found.
+static int findoption(const char *const arg)
{
- return findoption_len(arg, STRLEN(arg));
+ return findoption_len(arg, strlen(arg));
}
-/*
- * Get the value for an option.
- *
- * Returns:
- * Number or Toggle option: 1, *numval gets value.
- * String option: 0, *stringval gets allocated string.
- * Hidden Number or Toggle option: -1.
- * hidden String option: -2.
- * unknown option: -3.
- */
-int
-get_option_value (
+/// Gets the value for an option.
+///
+/// @returns:
+/// Number or Toggle option: 1, *numval gets value.
+/// String option: 0, *stringval gets allocated string.
+/// Hidden Number or Toggle option: -1.
+/// hidden String option: -2.
+/// unknown option: -3.
+int get_option_value(
char_u *name,
long *numval,
- char_u **stringval, /* NULL when only checking existence */
+ char_u **stringval, ///< NULL when only checking existence
int opt_flags
)
{
@@ -4466,35 +4670,36 @@ get_option_value (
return 0;
}
- int opt_idx;
- char_u *varp;
-
- opt_idx = findoption(name);
- if (opt_idx < 0) /* unknown option */
+ int opt_idx = findoption((const char *)name);
+ if (opt_idx < 0) { // Unknown option.
return -3;
+ }
- varp = get_varp_scope(&(options[opt_idx]), opt_flags);
+ char_u *varp = get_varp_scope(&(options[opt_idx]), opt_flags);
if (options[opt_idx].flags & P_STRING) {
- if (varp == NULL) /* hidden option */
+ if (varp == NULL) { // hidden option
return -2;
+ }
if (stringval != NULL) {
*stringval = vim_strsave(*(char_u **)(varp));
}
return 0;
}
- if (varp == NULL) /* hidden option */
+ if (varp == NULL) { // hidden option
return -1;
- if (options[opt_idx].flags & P_NUM)
+ }
+ if (options[opt_idx].flags & P_NUM) {
*numval = *(long *)varp;
- else {
- /* Special case: 'modified' is b_changed, but we also want to consider
- * it set when 'ff' or 'fenc' changed. */
- if ((bool *)varp == &curbuf->b_changed)
+ } else {
+ // Special case: 'modified' is b_changed, but we also want to consider
+ // it set when 'ff' or 'fenc' changed.
+ if ((int *)varp == &curbuf->b_changed) {
*numval = curbufIsChanged();
- else
- *numval = *(int *)varp;
+ } else {
+ *numval = (long) *(int *)varp; // NOLINT(whitespace/cast)
+ }
}
return 1;
}
@@ -4507,7 +4712,7 @@ get_option_value (
//
// Pretends that option is absent if it is not present in the requested scope
// (i.e. has no global, window-local or buffer-local value depending on
-// opt_type). Uses
+// opt_type).
//
// Returned flags:
// 0 hidden or unknown option, also option that does not have requested
@@ -4526,14 +4731,13 @@ int get_option_value_strict(char *name,
}
char_u *varp = NULL;
- vimoption_T *p;
int rv = 0;
- int opt_idx = findoption((uint8_t *)name);
+ int opt_idx = findoption(name);
if (opt_idx < 0) {
return 0;
}
- p = &(options[opt_idx]);
+ vimoption_T *p = &options[opt_idx];
// Hidden option
if (p->var == NULL) {
@@ -4549,26 +4753,25 @@ int get_option_value_strict(char *name,
}
if (p->indir == PV_NONE) {
- if (opt_type == SREQ_GLOBAL)
+ if (opt_type == SREQ_GLOBAL) {
rv |= SOPT_GLOBAL;
- else
- return 0; // Did not request global-only option
+ } else {
+ return 0; // Did not request global-only option
+ }
} else {
if (p->indir & PV_BOTH) {
rv |= SOPT_GLOBAL;
- } else if (opt_type == SREQ_GLOBAL) {
- return 0; // Requested global option
}
if (p->indir & PV_WIN) {
if (opt_type == SREQ_BUF) {
- return 0; // Did not request window-local option
+ return 0; // Requested buffer-local, not window-local option
} else {
rv |= SOPT_WIN;
}
} else if (p->indir & PV_BUF) {
if (opt_type == SREQ_WIN) {
- return 0; // Did not request buffer-local option
+ return 0; // Requested window-local, not buffer-local option
} else {
rv |= SOPT_BUF;
}
@@ -4580,24 +4783,31 @@ int get_option_value_strict(char *name,
}
if (opt_type == SREQ_GLOBAL) {
- varp = p->var;
+ if (p->var == VAR_WIN) {
+ return 0;
+ } else {
+ varp = p->var;
+ }
} else {
if (opt_type == SREQ_BUF) {
// Special case: 'modified' is b_changed, but we also want to
// consider it set when 'ff' or 'fenc' changed.
if (p->indir == PV_MOD) {
- *numval = bufIsChanged((buf_T *) from);
+ *numval = bufIsChanged((buf_T *)from);
varp = NULL;
} else {
- aco_save_T aco;
- aucmd_prepbuf(&aco, (buf_T *) from);
+ buf_T *save_curbuf = curbuf;
+
+ // only getting a pointer, no need to use aucmd_prepbuf()
+ curbuf = (buf_T *)from;
+ curwin->w_buffer = curbuf;
varp = get_varp(p);
- aucmd_restbuf(&aco);
+ curbuf = save_curbuf;
+ curwin->w_buffer = curbuf;
}
} else if (opt_type == SREQ_WIN) {
- win_T *save_curwin;
- save_curwin = curwin;
- curwin = (win_T *) from;
+ win_T *save_curwin = curwin;
+ curwin = (win_T *)from;
curbuf = curwin->w_buffer;
varp = get_varp(p);
curwin = save_curwin;
@@ -4622,31 +4832,29 @@ int get_option_value_strict(char *name,
return rv;
}
-/*
- * Set the value of option "name".
- * Use "string" for string options, use "number" for other options.
- *
- * Returns NULL on success or error message on error.
- */
-char_u *
-set_option_value (
- char_u *name,
- long number,
- char_u *string,
- int opt_flags /* OPT_LOCAL or 0 (both) */
-)
+/// Set the value of an option
+///
+/// @param[in] name Option name.
+/// @param[in] number New value for the number or boolean option.
+/// @param[in] string New value for string option.
+/// @param[in] opt_flags Flags: OPT_LOCAL, OPT_GLOBAL, or 0 (both).
+///
+/// @return NULL on success, error message on error.
+char *set_option_value(const char *const name, const long number,
+ const char *const string, const int opt_flags)
+ FUNC_ATTR_NONNULL_ARG(1)
{
- if (set_tty_option((char *)name, (char *)string)) {
- return NULL;
+ if (is_tty_option(name)) {
+ return NULL; // Fail silently; many old vimrcs set t_xx options.
}
int opt_idx;
char_u *varp;
opt_idx = findoption(name);
- if (opt_idx < 0)
+ if (opt_idx < 0) {
EMSG2(_("E355: Unknown option: %s"), name);
- else {
+ } else {
uint32_t flags = options[opt_idx].flags;
// Disallow changing some options in the sandbox
if (sandbox > 0 && (flags & P_SECURE)) {
@@ -4654,11 +4862,11 @@ set_option_value (
return NULL;
}
if (flags & P_STRING) {
- const char *s = (const char *)string;
+ const char *s = string;
if (s == NULL) {
s = "";
}
- return (char_u *)set_string_option(opt_idx, s, opt_flags);
+ return set_string_option(opt_idx, s, opt_flags);
} else {
varp = get_varp_scope(&(options[opt_idx]), opt_flags);
if (varp != NULL) { /* hidden option is not changed */
@@ -4677,28 +4885,17 @@ set_option_value (
return NULL; // do nothing as we hit an error
}
}
- if (flags & P_NUM)
- return set_num_option(opt_idx, varp, number,
- NULL, 0, opt_flags);
- else
- return set_bool_option(opt_idx, varp, (int)number,
- opt_flags);
+ if (flags & P_NUM) {
+ return set_num_option(opt_idx, varp, number, NULL, 0, opt_flags);
+ } else {
+ return set_bool_option(opt_idx, varp, (int)number, opt_flags);
+ }
}
}
}
return NULL;
}
-char_u *get_highlight_default(void)
-{
- int i;
-
- i = findoption((char_u *)"hl");
- if (i >= 0)
- return options[i].def_val[VI_DEFAULT];
- return (char_u *)NULL;
-}
-
/*
* Translate a string like "t_xx", "<t_xx>" or "<S-Tab>" to a key number.
*/
@@ -4714,7 +4911,7 @@ int find_key_option_len(const char_u *arg, size_t len)
} else {
arg--; // put arg at the '<'
modifiers = 0;
- key = find_special_key(&arg, len + 1, &modifiers, true, true);
+ key = find_special_key(&arg, len + 1, &modifiers, true, true, false);
if (modifiers) { // can't handle modifiers here
key = 0;
}
@@ -4727,7 +4924,6 @@ static int find_key_option(const char_u *arg)
return find_key_option_len(arg, STRLEN(arg));
}
-
/*
* if 'all' == 0: show changed options
* if 'all' == 1: show all normal options
@@ -4753,15 +4949,14 @@ showoptions (
vimoption_T **items = xmalloc(sizeof(vimoption_T *) * PARAM_COUNT);
- /* Highlight title */
- if (all == 2)
- MSG_PUTS_TITLE(_("\n--- Terminal codes ---"));
- else if (opt_flags & OPT_GLOBAL)
+ // Highlight title
+ if (opt_flags & OPT_GLOBAL) {
MSG_PUTS_TITLE(_("\n--- Global option values ---"));
- else if (opt_flags & OPT_LOCAL)
+ } else if (opt_flags & OPT_LOCAL) {
MSG_PUTS_TITLE(_("\n--- Local option values ---"));
- else
+ } else {
MSG_PUTS_TITLE(_("\n--- Options ---"));
+ }
/*
* do the loop two times:
@@ -4836,14 +5031,39 @@ static int optval_default(vimoption_T *p, char_u *varp)
if (varp == NULL)
return TRUE; /* hidden option is always at default */
dvi = ((p->flags & P_VI_DEF) || p_cp) ? VI_DEFAULT : VIM_DEFAULT;
- if (p->flags & P_NUM)
- return *(long *)varp == (long)p->def_val[dvi];
- if (p->flags & P_BOOL)
+ if (p->flags & P_NUM) {
+ return *(long *)varp == (long)(intptr_t)p->def_val[dvi];
+ }
+ if (p->flags & P_BOOL) {
return *(int *)varp == (int)(intptr_t)p->def_val[dvi];
- /* P_STRING */
+ }
+ // P_STRING
return STRCMP(*(char_u **)varp, p->def_val[dvi]) == 0;
}
+/// Send update to UIs with values of UI relevant options
+void ui_refresh_options(void)
+{
+ for (int opt_idx = 0; options[opt_idx].fullname; opt_idx++) {
+ uint32_t flags = options[opt_idx].flags;
+ if (!(flags & P_UI_OPTION)) {
+ continue;
+ }
+ String name = cstr_as_string(options[opt_idx].fullname);
+ void *varp = options[opt_idx].var;
+ Object value = OBJECT_INIT;
+ if (flags & P_BOOL) {
+ value = BOOLEAN_OBJ(*(int *)varp);
+ } else if (flags & P_NUM) {
+ value = INTEGER_OBJ(*(long *)varp);
+ } else if (flags & P_STRING) {
+ // cstr_as_string handles NULL string
+ value = STRING_OBJ(cstr_as_string(*(char **)varp));
+ }
+ ui_call_option_set(name, value);
+ }
+}
+
/*
* showoneopt: show the value of one option
* must not be called with a hidden option!
@@ -4862,14 +5082,15 @@ showoneopt (
varp = get_varp_scope(p, opt_flags);
- /* for 'modified' we also need to check if 'ff' or 'fenc' changed. */
- if ((p->flags & P_BOOL) && ((bool *)varp == &curbuf->b_changed
- ? !curbufIsChanged() : !*(bool *)varp))
+ // for 'modified' we also need to check if 'ff' or 'fenc' changed.
+ if ((p->flags & P_BOOL) && ((int *)varp == &curbuf->b_changed
+ ? !curbufIsChanged() : !*(int *)varp)) {
MSG_PUTS("no");
- else if ((p->flags & P_BOOL) && *(int *)varp < 0)
+ } else if ((p->flags & P_BOOL) && *(int *)varp < 0) {
MSG_PUTS("--");
- else
+ } else {
MSG_PUTS(" ");
+ }
MSG_PUTS(p->fullname);
if (!(p->flags & P_BOOL)) {
msg_putchar('=');
@@ -5040,9 +5261,13 @@ static int put_setstring(FILE *fd, char *cmd, char *name, char_u **valuep, int e
* CTRL-V or backslash */
if (valuep == &p_pt) {
s = *valuep;
- while (*s != NUL)
- if (put_escstr(fd, str2special(&s, FALSE), 2) == FAIL)
+ while (*s != NUL) {
+ if (put_escstr(fd, (char_u *)str2special((const char **)&s, false,
+ false), 2)
+ == FAIL) {
return FAIL;
+ }
+ }
} else if (expand) {
buf = xmalloc(MAXPATHL);
home_replace(NULL, *valuep, buf, MAXPATHL, FALSE);
@@ -5097,7 +5322,7 @@ static int put_setbool(FILE *fd, char *cmd, char *name, int value)
void comp_col(void)
{
- int last_has_status = (p_ls == 2 || (p_ls == 1 && firstwin != lastwin));
+ int last_has_status = (p_ls == 2 || (p_ls == 1 && !ONE_WINDOW));
sc_col = 0;
ru_col = 0;
@@ -5132,7 +5357,7 @@ void unset_global_local_option(char *name, void *from)
vimoption_T *p;
buf_T *buf = (buf_T *)from;
- int opt_idx = findoption((uint8_t *)name);
+ int opt_idx = findoption(name);
if (opt_idx < 0) {
EMSG2(_("E355: Unknown option: %s"), name);
return;
@@ -5177,6 +5402,9 @@ void unset_global_local_option(char *name, void *from)
case PV_TSR:
clear_string_option(&buf->b_p_tsr);
break;
+ case PV_FP:
+ clear_string_option(&buf->b_p_fp);
+ break;
case PV_EFM:
clear_string_option(&buf->b_p_efm);
break;
@@ -5195,6 +5423,9 @@ void unset_global_local_option(char *name, void *from)
case PV_LW:
clear_string_option(&buf->b_p_lw);
break;
+ case PV_MENC:
+ clear_string_option(&buf->b_p_menc);
+ break;
}
}
@@ -5210,6 +5441,7 @@ static char_u *get_varp_scope(vimoption_T *p, int opt_flags)
}
if ((opt_flags & OPT_LOCAL) && ((int)p->indir & PV_BOTH)) {
switch ((int)p->indir) {
+ case PV_FP: return (char_u *)&(curbuf->b_p_fp);
case PV_EFM: return (char_u *)&(curbuf->b_p_efm);
case PV_GP: return (char_u *)&(curbuf->b_p_gp);
case PV_MP: return (char_u *)&(curbuf->b_p_mp);
@@ -5227,6 +5459,7 @@ static char_u *get_varp_scope(vimoption_T *p, int opt_flags)
case PV_UL: return (char_u *)&(curbuf->b_p_ul);
case PV_LW: return (char_u *)&(curbuf->b_p_lw);
case PV_BKC: return (char_u *)&(curbuf->b_p_bkc);
+ case PV_MENC: return (char_u *)&(curbuf->b_p_menc);
}
return NULL; /* "cannot happen" */
}
@@ -5268,6 +5501,8 @@ static char_u *get_varp(vimoption_T *p)
? (char_u *)&(curbuf->b_p_dict) : p->var;
case PV_TSR: return *curbuf->b_p_tsr != NUL
? (char_u *)&(curbuf->b_p_tsr) : p->var;
+ case PV_FP: return *curbuf->b_p_fp != NUL
+ ? (char_u *)&(curbuf->b_p_fp) : p->var;
case PV_EFM: return *curbuf->b_p_efm != NUL
? (char_u *)&(curbuf->b_p_efm) : p->var;
case PV_GP: return *curbuf->b_p_gp != NUL
@@ -5280,6 +5515,8 @@ static char_u *get_varp(vimoption_T *p)
? (char_u *)&(curbuf->b_p_ul) : p->var;
case PV_LW: return *curbuf->b_p_lw != NUL
? (char_u *)&(curbuf->b_p_lw) : p->var;
+ case PV_MENC: return *curbuf->b_p_menc != NUL
+ ? (char_u *)&(curbuf->b_p_menc) : p->var;
case PV_ARAB: return (char_u *)&(curwin->w_p_arab);
case PV_LIST: return (char_u *)&(curwin->w_p_list);
@@ -5322,6 +5559,7 @@ static char_u *get_varp(vimoption_T *p)
case PV_BH: return (char_u *)&(curbuf->b_p_bh);
case PV_BT: return (char_u *)&(curbuf->b_p_bt);
case PV_BL: return (char_u *)&(curbuf->b_p_bl);
+ case PV_CHANNEL:return (char_u *)&(curbuf->b_p_channel);
case PV_CI: return (char_u *)&(curbuf->b_p_ci);
case PV_CIN: return (char_u *)&(curbuf->b_p_cin);
case PV_CINK: return (char_u *)&(curbuf->b_p_cink);
@@ -5357,6 +5595,7 @@ static char_u *get_varp(vimoption_T *p)
case PV_PI: return (char_u *)&(curbuf->b_p_pi);
case PV_QE: return (char_u *)&(curbuf->b_p_qe);
case PV_RO: return (char_u *)&(curbuf->b_p_ro);
+ case PV_SCBK: return (char_u *)&(curbuf->b_p_scbk);
case PV_SI: return (char_u *)&(curbuf->b_p_si);
case PV_STS: return (char_u *)&(curbuf->b_p_sts);
case PV_SUA: return (char_u *)&(curbuf->b_p_sua);
@@ -5372,7 +5611,9 @@ static char_u *get_varp(vimoption_T *p)
case PV_UDF: return (char_u *)&(curbuf->b_p_udf);
case PV_WM: return (char_u *)&(curbuf->b_p_wm);
case PV_KMAP: return (char_u *)&(curbuf->b_p_keymap);
- default: EMSG(_("E356: get_varp ERROR"));
+ case PV_SCL: return (char_u *)&(curwin->w_p_scl);
+ case PV_WINHL: return (char_u *)&(curwin->w_p_winhl);
+ default: IEMSG(_("E356: get_varp ERROR"));
}
/* always return a valid pointer to avoid a crash! */
return (char_u *)&(curbuf->b_p_wm);
@@ -5398,7 +5639,6 @@ void win_copy_options(win_T *wp_from, win_T *wp_to)
copy_winopt(&wp_from->w_allbuf_opt, &wp_to->w_allbuf_opt);
/* Is this right? */
wp_to->w_farsi = wp_from->w_farsi;
- briopt_check(wp_to);
}
/*
@@ -5449,7 +5689,9 @@ void copy_winopt(winopt_T *from, winopt_T *to)
to->wo_fde = vim_strsave(from->wo_fde);
to->wo_fdt = vim_strsave(from->wo_fdt);
to->wo_fmr = vim_strsave(from->wo_fmr);
- check_winopt(to); /* don't want NULL pointers */
+ to->wo_scl = vim_strsave(from->wo_scl);
+ to->wo_winhl = vim_strsave(from->wo_winhl);
+ check_winopt(to); // don't want NULL pointers
}
/*
@@ -5472,11 +5714,13 @@ static void check_winopt(winopt_T *wop)
check_string_option(&wop->wo_fde);
check_string_option(&wop->wo_fdt);
check_string_option(&wop->wo_fmr);
+ check_string_option(&wop->wo_scl);
check_string_option(&wop->wo_rlc);
check_string_option(&wop->wo_stl);
check_string_option(&wop->wo_cc);
check_string_option(&wop->wo_cocu);
check_string_option(&wop->wo_briopt);
+ check_string_option(&wop->wo_winhl);
}
/*
@@ -5490,13 +5734,23 @@ void clear_winopt(winopt_T *wop)
clear_string_option(&wop->wo_fde);
clear_string_option(&wop->wo_fdt);
clear_string_option(&wop->wo_fmr);
+ clear_string_option(&wop->wo_scl);
clear_string_option(&wop->wo_rlc);
clear_string_option(&wop->wo_stl);
clear_string_option(&wop->wo_cc);
clear_string_option(&wop->wo_cocu);
clear_string_option(&wop->wo_briopt);
+ clear_string_option(&wop->wo_winhl);
+}
+
+void didset_window_options(win_T *wp)
+{
+ check_colorcolumn(wp);
+ briopt_check(wp);
+ parse_winhl_opt(wp);
}
+
/*
* Copy global option values to local options for one buffer.
* Used when creating a new buffer and sometimes when entering a buffer.
@@ -5514,12 +5768,6 @@ void buf_copy_options(buf_T *buf, int flags)
int did_isk = FALSE;
/*
- * Don't do anything if the buffer is invalid.
- */
- if (buf == NULL || !buf_valid(buf))
- return;
-
- /*
* Skip this when the option defaults have not been set yet. Happens when
* main() allocates the first buffer.
*/
@@ -5560,15 +5808,34 @@ void buf_copy_options(buf_T *buf, int flags)
free_buf_options(buf, TRUE);
buf->b_p_ro = FALSE; /* don't copy readonly */
buf->b_p_fenc = vim_strsave(p_fenc);
- buf->b_p_ff = vim_strsave(p_ff);
+ switch (*p_ffs) {
+ case 'm': {
+ buf->b_p_ff = vim_strsave((char_u *)FF_MAC);
+ break;
+ }
+ case 'd': {
+ buf->b_p_ff = vim_strsave((char_u *)FF_DOS);
+ break;
+ }
+ case 'u': {
+ buf->b_p_ff = vim_strsave((char_u *)FF_UNIX);
+ break;
+ }
+ default: {
+ buf->b_p_ff = vim_strsave(p_ff);
+ break;
+ }
+ }
buf->b_p_bh = empty_option;
buf->b_p_bt = empty_option;
- } else
- free_buf_options(buf, FALSE);
+ } else {
+ free_buf_options(buf, false);
+ }
buf->b_p_ai = p_ai;
buf->b_p_ai_nopaste = p_ai_nopaste;
buf->b_p_sw = p_sw;
+ buf->b_p_scbk = -1;
buf->b_p_tw = p_tw;
buf->b_p_tw_nopaste = p_tw_nopaste;
buf->b_p_tw_nobin = p_tw_nobin;
@@ -5584,7 +5851,7 @@ void buf_copy_options(buf_T *buf, int flags)
buf->b_p_ml = p_ml;
buf->b_p_ml_nobin = p_ml_nobin;
buf->b_p_inf = p_inf;
- buf->b_p_swf = p_swf;
+ buf->b_p_swf = cmdmod.noswapfile ? false : p_swf;
buf->b_p_cpt = vim_strsave(p_cpt);
buf->b_p_cfu = vim_strsave(p_cfu);
buf->b_p_ofu = vim_strsave(p_ofu);
@@ -5597,6 +5864,7 @@ void buf_copy_options(buf_T *buf, int flags)
buf->b_p_nf = vim_strsave(p_nf);
buf->b_p_mps = vim_strsave(p_mps);
buf->b_p_si = p_si;
+ buf->b_p_channel = 0;
buf->b_p_ci = p_ci;
buf->b_p_cin = p_cin;
buf->b_p_cink = vim_strsave(p_cink);
@@ -5616,6 +5884,7 @@ void buf_copy_options(buf_T *buf, int flags)
buf->b_s.b_p_spl = vim_strsave(p_spl);
buf->b_p_inde = vim_strsave(p_inde);
buf->b_p_indk = vim_strsave(p_indk);
+ buf->b_p_fp = empty_option;
buf->b_p_fex = vim_strsave(p_fex);
buf->b_p_sua = vim_strsave(p_sua);
buf->b_p_keymap = vim_strsave(p_keymap);
@@ -5648,6 +5917,7 @@ void buf_copy_options(buf_T *buf, int flags)
buf->b_p_qe = vim_strsave(p_qe);
buf->b_p_udf = p_udf;
buf->b_p_lw = empty_option;
+ buf->b_p_menc = empty_option;
/*
* Don't copy the options set by ex_help(), use the saved values,
@@ -5688,11 +5958,12 @@ void reset_modifiable(void)
{
int opt_idx;
- curbuf->b_p_ma = FALSE;
- p_ma = FALSE;
- opt_idx = findoption((char_u *)"ma");
- if (opt_idx >= 0)
- options[opt_idx].def_val[VI_DEFAULT] = FALSE;
+ curbuf->b_p_ma = false;
+ p_ma = false;
+ opt_idx = findoption("ma");
+ if (opt_idx >= 0) {
+ options[opt_idx].def_val[VI_DEFAULT] = false;
+ }
}
/*
@@ -5790,15 +6061,15 @@ set_context_in_set_cmd (
expand_option_name[2] = p[-2];
expand_option_name[3] = p[-1];
} else {
- /* Allow * wildcard */
- while (ASCII_ISALNUM(*p) || *p == '_' || *p == '*')
+ // Allow * wildcard.
+ while (ASCII_ISALNUM(*p) || *p == '_' || *p == '*') {
p++;
- if (*p == NUL)
+ }
+ if (*p == NUL) {
return;
+ }
nextchar = *p;
- *p = NUL;
- opt_idx = findoption(arg);
- *p = nextchar;
+ opt_idx = findoption_len((const char *)arg, (size_t)(p - arg));
if (opt_idx == -1 || options[opt_idx].var == NULL) {
xp->xp_context = EXPAND_NOTHING;
return;
@@ -5820,7 +6091,7 @@ set_context_in_set_cmd (
xp->xp_context = EXPAND_UNSUCCESSFUL;
return;
}
- if (xp->xp_context != EXPAND_BOOL_SETTINGS && p[1] == NUL) {
+ if (p[1] == NUL) {
xp->xp_context = EXPAND_OLD_SETTING;
if (is_term_option)
expand_option_idx = -1;
@@ -5895,8 +6166,8 @@ int ExpandSettings(expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***
int count = 0;
char_u *str;
int loop;
- static char *(names[]) = {"all", "termcap"};
- int ic = regmatch->rm_ic; /* remember the ignore-case flag */
+ static char *(names[]) = { "all" };
+ int ic = regmatch->rm_ic; // remember the ignore-case flag
/* do this loop twice:
* loop == 0: count the number of matching options
@@ -5960,30 +6231,33 @@ void ExpandOldSetting(int *num_file, char_u ***file)
* For a terminal key code expand_option_idx is < 0.
*/
if (expand_option_idx < 0) {
- expand_option_idx = findoption(expand_option_name);
+ expand_option_idx = findoption((const char *)expand_option_name);
}
if (expand_option_idx >= 0) {
- /* put string of option value in NameBuff */
+ // Put string of option value in NameBuff.
option_value2string(&options[expand_option_idx], expand_option_flags);
var = NameBuff;
- } else if (var == NULL)
+ } else {
var = (char_u *)"";
+ }
- /* A backslash is required before some characters. This is the reverse of
- * what happens in do_set(). */
+ // A backslash is required before some characters. This is the reverse of
+ // what happens in do_set().
char_u *buf = vim_strsave_escaped(var, escape_chars);
#ifdef BACKSLASH_IN_FILENAME
/* For MS-Windows et al. we don't double backslashes at the start and
* before a file name character. */
- for (var = buf; *var != NUL; mb_ptr_adv(var))
+ for (var = buf; *var != NUL; MB_PTR_ADV(var)) {
if (var[0] == '\\' && var[1] == '\\'
&& expand_option_idx >= 0
&& (options[expand_option_idx].flags & P_EXPAND)
&& vim_isfilec(var[2])
- && (var[2] != '\\' || (var == buf && var[4] != '\\')))
+ && (var[2] != '\\' || (var == buf && var[4] != '\\'))) {
STRMOVE(var, var + 1);
+ }
+ }
#endif
*file[0] = buf;
@@ -6019,15 +6293,16 @@ option_value2string (
}
} else { // P_STRING
varp = *(char_u **)(varp);
- if (varp == NULL) /* just in case */
+ if (varp == NULL) { // Just in case.
NameBuff[0] = NUL;
- else if (opp->flags & P_EXPAND)
- home_replace(NULL, varp, NameBuff, MAXPATHL, FALSE);
- /* Translate 'pastetoggle' into special key names */
- else if ((char_u **)opp->var == &p_pt)
- str2specialbuf(p_pt, NameBuff, MAXPATHL);
- else
+ } else if (opp->flags & P_EXPAND) {
+ home_replace(NULL, varp, NameBuff, MAXPATHL, false);
+ // Translate 'pastetoggle' into special key names.
+ } else if ((char_u **)opp->var == &p_pt) {
+ str2specialbuf((const char *)p_pt, (char *)NameBuff, MAXPATHL);
+ } else {
STRLCPY(NameBuff, varp, MAXPATHL);
+ }
}
}
@@ -6150,9 +6425,10 @@ static void langmap_set(void)
for (p = p_langmap; p[0] != NUL; ) {
for (p2 = p; p2[0] != NUL && p2[0] != ',' && p2[0] != ';';
- mb_ptr_adv(p2)) {
- if (p2[0] == '\\' && p2[1] != NUL)
- ++p2;
+ MB_PTR_ADV(p2)) {
+ if (p2[0] == '\\' && p2[1] != NUL) {
+ p2++;
+ }
}
if (p2[0] == ';')
++p2; /* abcd;ABCD form, p2 points to A */
@@ -6163,22 +6439,25 @@ static void langmap_set(void)
++p;
break;
}
- if (p[0] == '\\' && p[1] != NUL)
- ++p;
- from = (*mb_ptr2char)(p);
+ if (p[0] == '\\' && p[1] != NUL) {
+ p++;
+ }
+ from = utf_ptr2char(p);
to = NUL;
if (p2 == NULL) {
- mb_ptr_adv(p);
+ MB_PTR_ADV(p);
if (p[0] != ',') {
- if (p[0] == '\\')
- ++p;
- to = (*mb_ptr2char)(p);
+ if (p[0] == '\\') {
+ p++;
+ }
+ to = utf_ptr2char(p);
}
} else {
if (p2[0] != ',') {
- if (p2[0] == '\\')
- ++p2;
- to = (*mb_ptr2char)(p2);
+ if (p2[0] == '\\') {
+ p2++;
+ }
+ to = utf_ptr2char(p2);
}
}
if (to == NUL) {
@@ -6194,10 +6473,10 @@ static void langmap_set(void)
langmap_mapchar[from & 255] = (char_u)to;
}
- /* Advance to next pair */
- mb_ptr_adv(p);
+ // Advance to next pair
+ MB_PTR_ADV(p);
if (p2 != NULL) {
- mb_ptr_adv(p2);
+ MB_PTR_ADV(p2);
if (*p == ';') {
p = p2;
if (p[0] != NUL) {
@@ -6343,15 +6622,13 @@ static void paste_option_changed(void)
/// When "fname" is not NULL, use it to set $"envname" when it wasn't set yet.
void vimrc_found(char_u *fname, char_u *envname)
{
- char_u *p;
-
- if (fname != NULL) {
- p = (char_u *)vim_getenv((char *)envname);
+ if (fname != NULL && envname != NULL) {
+ char *p = vim_getenv((char *)envname);
if (p == NULL) {
- /* Set $MYVIMRC to the first vimrc file found. */
- p = (char_u *)FullName_save((char *)fname, FALSE);
+ // Set $MYVIMRC to the first vimrc file found.
+ p = FullName_save((char *)fname, false);
if (p != NULL) {
- vim_setenv((char *)envname, (char *)p);
+ vim_setenv((char *)envname, p);
xfree(p);
}
} else {
@@ -6360,20 +6637,34 @@ void vimrc_found(char_u *fname, char_u *envname)
}
}
-/*
- * Return TRUE when option "name" has been set.
- * Only works correctly for global options.
- */
-int option_was_set(char_u *name)
+/// Check whether global option has been set
+///
+/// @param[in] name Option name.
+///
+/// @return True if it was set.
+bool option_was_set(const char *name)
{
int idx;
idx = findoption(name);
- if (idx < 0) /* unknown option */
- return FALSE;
- if (options[idx].flags & P_WAS_SET)
- return TRUE;
- return FALSE;
+ if (idx < 0) { // Unknown option.
+ return false;
+ } else if (options[idx].flags & P_WAS_SET) {
+ return true;
+ }
+ return false;
+}
+
+/// Reset the flag indicating option "name" was set.
+///
+/// @param[in] name Option name.
+void reset_option_was_set(const char *name)
+{
+ const int idx = findoption(name);
+
+ if (idx >= 0) {
+ options[idx].flags &= ~P_WAS_SET;
+ }
}
/*
@@ -6574,10 +6865,8 @@ int get_sw_value(buf_T *buf)
return (int)result;
}
-/*
- * Return the effective softtabstop value for the current buffer, using the
- * 'tabstop' value when 'softtabstop' is negative.
- */
+// Return the effective softtabstop value for the current buffer,
+// using the effective shiftwidth value when 'softtabstop' is negative.
int get_sts_value(void)
{
long result = curbuf->b_p_sts < 0 ? get_sw_value(curbuf) : curbuf->b_p_sts;
@@ -6593,66 +6882,37 @@ int get_sts_value(void)
*/
void find_mps_values(int *initc, int *findc, int *backwards, int switchit)
{
- char_u *ptr;
+ char_u *ptr = curbuf->b_p_mps;
- ptr = curbuf->b_p_mps;
while (*ptr != NUL) {
- if (has_mbyte) {
- char_u *prev;
-
- if (mb_ptr2char(ptr) == *initc) {
- if (switchit) {
- *findc = *initc;
- *initc = mb_ptr2char(ptr + mb_ptr2len(ptr) + 1);
- *backwards = TRUE;
- } else {
- *findc = mb_ptr2char(ptr + mb_ptr2len(ptr) + 1);
- *backwards = FALSE;
- }
- return;
- }
- prev = ptr;
- ptr += mb_ptr2len(ptr) + 1;
- if (mb_ptr2char(ptr) == *initc) {
- if (switchit) {
- *findc = *initc;
- *initc = mb_ptr2char(prev);
- *backwards = FALSE;
- } else {
- *findc = mb_ptr2char(prev);
- *backwards = TRUE;
- }
- return;
- }
- ptr += mb_ptr2len(ptr);
- } else {
- if (*ptr == *initc) {
- if (switchit) {
- *backwards = TRUE;
- *findc = *initc;
- *initc = ptr[2];
- } else {
- *backwards = FALSE;
- *findc = ptr[2];
- }
- return;
+ if (utf_ptr2char(ptr) == *initc) {
+ if (switchit) {
+ *findc = *initc;
+ *initc = utf_ptr2char(ptr + utfc_ptr2len(ptr) + 1);
+ *backwards = true;
+ } else {
+ *findc = utf_ptr2char(ptr + utfc_ptr2len(ptr) + 1);
+ *backwards = false;
}
- ptr += 2;
- if (*ptr == *initc) {
- if (switchit) {
- *backwards = FALSE;
- *findc = *initc;
- *initc = ptr[-2];
- } else {
- *backwards = TRUE;
- *findc = ptr[-2];
- }
- return;
+ return;
+ }
+ char_u *prev = ptr;
+ ptr += utfc_ptr2len(ptr) + 1;
+ if (utf_ptr2char(ptr) == *initc) {
+ if (switchit) {
+ *findc = *initc;
+ *initc = utf_ptr2char(prev);
+ *backwards = false;
+ } else {
+ *findc = utf_ptr2char(prev);
+ *backwards = true;
}
- ++ptr;
+ return;
+ }
+ ptr += utfc_ptr2len(ptr);
+ if (*ptr == ',') {
+ ptr++;
}
- if (*ptr == ',')
- ++ptr;
}
}
@@ -6703,3 +6963,189 @@ unsigned int get_bkc_value(buf_T *buf)
{
return buf->b_bkc_flags ? buf->b_bkc_flags : bkc_flags;
}
+
+/// Return the current end-of-line type: EOL_DOS, EOL_UNIX or EOL_MAC.
+int get_fileformat(buf_T *buf)
+{
+ int c = *buf->b_p_ff;
+
+ if (buf->b_p_bin || c == 'u') {
+ return EOL_UNIX;
+ }
+ if (c == 'm') {
+ return EOL_MAC;
+ }
+ return EOL_DOS;
+}
+
+/// Like get_fileformat(), but override 'fileformat' with "p" for "++opt=val"
+/// argument.
+///
+/// @param eap can be NULL!
+int get_fileformat_force(buf_T *buf, exarg_T *eap)
+{
+ int c;
+
+ if (eap != NULL && eap->force_ff != 0) {
+ c = eap->cmd[eap->force_ff];
+ } else {
+ if ((eap != NULL && eap->force_bin != 0)
+ ? (eap->force_bin == FORCE_BIN) : buf->b_p_bin) {
+ return EOL_UNIX;
+ }
+ c = *buf->b_p_ff;
+ }
+ if (c == 'u') {
+ return EOL_UNIX;
+ }
+ if (c == 'm') {
+ return EOL_MAC;
+ }
+ return EOL_DOS;
+}
+
+/// Return the default fileformat from 'fileformats'.
+int default_fileformat(void)
+{
+ switch (*p_ffs) {
+ case 'm': return EOL_MAC;
+ case 'd': return EOL_DOS;
+ }
+ return EOL_UNIX;
+}
+
+/// Set the current end-of-line type to EOL_UNIX, EOL_MAC, or EOL_DOS.
+///
+/// Sets 'fileformat'.
+///
+/// @param eol_style End-of-line style.
+/// @param opt_flags OPT_LOCAL and/or OPT_GLOBAL
+void set_fileformat(int eol_style, int opt_flags)
+{
+ char *p = NULL;
+
+ switch (eol_style) {
+ case EOL_UNIX:
+ p = FF_UNIX;
+ break;
+ case EOL_MAC:
+ p = FF_MAC;
+ break;
+ case EOL_DOS:
+ p = FF_DOS;
+ break;
+ }
+
+ // p is NULL if "eol_style" is EOL_UNKNOWN.
+ if (p != NULL) {
+ set_string_option_direct((char_u *)"ff",
+ -1,
+ (char_u *)p,
+ OPT_FREE | opt_flags,
+ 0);
+ }
+
+ // This may cause the buffer to become (un)modified.
+ check_status(curbuf);
+ redraw_tabline = true;
+ need_maketitle = true; // Set window title later.
+}
+
+/// Skip to next part of an option argument: skip space and comma
+char_u *skip_to_option_part(const char_u *p)
+{
+ if (*p == ',') {
+ p++;
+ }
+ while (*p == ' ') {
+ p++;
+ }
+ return (char_u *)p;
+}
+
+/// Isolate one part of a string option separated by `sep_chars`.
+///
+/// @param[in,out] option advanced to the next part
+/// @param[in,out] buf copy of the isolated part
+/// @param[in] maxlen length of `buf`
+/// @param[in] sep_chars chars that separate the option parts
+///
+/// @return length of `*option`
+size_t copy_option_part(char_u **option, char_u *buf, size_t maxlen,
+ char *sep_chars)
+{
+ size_t len = 0;
+ char_u *p = *option;
+
+ // skip '.' at start of option part, for 'suffixes'
+ if (*p == '.') {
+ buf[len++] = *p++;
+ }
+ while (*p != NUL && vim_strchr((char_u *)sep_chars, *p) == NULL) {
+ // Skip backslash before a separator character and space.
+ if (p[0] == '\\' && vim_strchr((char_u *)sep_chars, p[1]) != NULL) {
+ p++;
+ }
+ if (len < maxlen - 1) {
+ buf[len++] = *p;
+ }
+ p++;
+ }
+ buf[len] = NUL;
+
+ if (*p != NUL && *p != ',') { // skip non-standard separator
+ p++;
+ }
+ p = skip_to_option_part(p); // p points to next file name
+
+ *option = p;
+ return len;
+}
+
+/// Return TRUE when 'shell' has "csh" in the tail.
+int csh_like_shell(void)
+{
+ return strstr((char *)path_tail(p_sh), "csh") != NULL;
+}
+
+/// Return true when window "wp" has a column to draw signs in.
+bool signcolumn_on(win_T *wp)
+{
+ if (*wp->w_p_scl == 'n') {
+ return false;
+ }
+ if (*wp->w_p_scl == 'y') {
+ return true;
+ }
+ return wp->w_buffer->b_signlist != NULL;
+}
+
+/// Get window or buffer local options
+dict_T *get_winbuf_options(const int bufopt)
+ FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ dict_T *const d = tv_dict_alloc();
+
+ for (int opt_idx = 0; options[opt_idx].fullname; opt_idx++) {
+ struct vimoption *opt = &options[opt_idx];
+
+ if ((bufopt && (opt->indir & PV_BUF))
+ || (!bufopt && (opt->indir & PV_WIN))) {
+ char_u *varp = get_varp(opt);
+
+ if (varp != NULL) {
+ if (opt->flags & P_STRING) {
+ tv_dict_add_str(d, opt->fullname, strlen(opt->fullname),
+ *(const char **)varp);
+ } else if (opt->flags & P_NUM) {
+ tv_dict_add_nr(d, opt->fullname, strlen(opt->fullname),
+ *(long *)varp);
+ } else {
+ tv_dict_add_nr(d, opt->fullname, strlen(opt->fullname), *(int *)varp);
+ }
+ }
+ }
+ }
+
+ return d;
+}
diff --git a/src/nvim/option.h b/src/nvim/option.h
index 5c2b2662b5..60f14dea44 100644
--- a/src/nvim/option.h
+++ b/src/nvim/option.h
@@ -1,22 +1,25 @@
#ifndef NVIM_OPTION_H
#define NVIM_OPTION_H
+#include "nvim/ex_cmds_defs.h" // for exarg_T
+
/* flags for buf_copy_options() */
#define BCO_ENTER 1 /* going to enter the buffer */
#define BCO_ALWAYS 2 /* always copy the options */
#define BCO_NOHELP 4 /* don't touch the help related options */
-/*
- * "flags" values for option-setting functions.
- * When OPT_GLOBAL and OPT_LOCAL are both missing, set both local and global
- * values, get local value.
- */
-#define OPT_FREE 1 /* free old value if it was allocated */
-#define OPT_GLOBAL 2 /* use global value */
-#define OPT_LOCAL 4 /* use local value */
-#define OPT_MODELINE 8 /* option in modeline */
-#define OPT_WINONLY 16 /* only set window-local options */
-#define OPT_NOWIN 32 /* don't set window-local options */
+/// Flags for option-setting functions
+///
+/// When OPT_GLOBAL and OPT_LOCAL are both missing, set both local and global
+/// values, get local value.
+typedef enum {
+ OPT_FREE = 1, ///< Free old value if it was allocated.
+ OPT_GLOBAL = 2, ///< Use global value.
+ OPT_LOCAL = 4, ///< Use local value.
+ OPT_MODELINE = 8, ///< Option in modeline.
+ OPT_WINONLY = 16, ///< Only set window-local options.
+ OPT_NOWIN = 32, ///< Donโ€™t set window-local options.
+} OptionFlags;
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "option.h.generated.h"
diff --git a/src/nvim/option_defs.h b/src/nvim/option_defs.h
index 8d6f42e088..7b99b6f266 100644
--- a/src/nvim/option_defs.h
+++ b/src/nvim/option_defs.h
@@ -1,10 +1,9 @@
#ifndef NVIM_OPTION_DEFS_H
#define NVIM_OPTION_DEFS_H
-#include <stdbool.h>
-
#include "nvim/types.h"
#include "nvim/macros.h" // For EXTERN
+#include "eval/typval.h" // For scid_T
// option_defs.h: definition of global variables for settable options
@@ -18,9 +17,9 @@
#define SOPT_UNSET 0x40 // Option does not have local value set
// Option types for various functions in option.c
-#define SREQ_GLOBAL 0 // Request global option
-#define SREQ_WIN 1 // Request window-local option
-#define SREQ_BUF 2 // Request buffer-local option
+#define SREQ_GLOBAL 0 // Request global option value
+#define SREQ_WIN 1 // Request window-local option value
+#define SREQ_BUF 2 // Request buffer-local option value
/*
* Default values for 'errorformat'.
@@ -83,57 +82,56 @@
#define DFLT_FO_VIM "tcqj"
#define FO_ALL "tcroq2vlb1mMBn,awj" /* for do_set() */
-/* characters for the p_cpo option: */
-#define CPO_ALTREAD 'a' /* ":read" sets alternate file name */
-#define CPO_ALTWRITE 'A' /* ":write" sets alternate file name */
-#define CPO_BAR 'b' /* "\|" ends a mapping */
-#define CPO_BSLASH 'B' /* backslash in mapping is not special */
+// characters for the p_cpo option:
+#define CPO_ALTREAD 'a' // ":read" sets alternate file name
+#define CPO_ALTWRITE 'A' // ":write" sets alternate file name
+#define CPO_BAR 'b' // "\|" ends a mapping
+#define CPO_BSLASH 'B' // backslash in mapping is not special
#define CPO_SEARCH 'c'
-#define CPO_CONCAT 'C' /* Don't concatenate sourced lines */
-#define CPO_DOTTAG 'd' /* "./tags" in 'tags' is in current dir */
-#define CPO_DIGRAPH 'D' /* No digraph after "r", "f", etc. */
+#define CPO_CONCAT 'C' // Don't concatenate sourced lines
+#define CPO_DOTTAG 'd' // "./tags" in 'tags' is in current dir
+#define CPO_DIGRAPH 'D' // No digraph after "r", "f", etc.
#define CPO_EXECBUF 'e'
-#define CPO_EMPTYREGION 'E' /* operating on empty region is an error */
-#define CPO_FNAMER 'f' /* set file name for ":r file" */
-#define CPO_FNAMEW 'F' /* set file name for ":w file" */
-#define CPO_INTMOD 'i' /* interrupt a read makes buffer modified */
-#define CPO_INDENT 'I' /* remove auto-indent more often */
-#define CPO_ENDOFSENT 'J' /* need two spaces to detect end of sentence */
-#define CPO_KEYCODE 'k' /* don't recognize raw key code in mappings */
-#define CPO_KOFFSET 'K' /* don't wait for key code in mappings */
-#define CPO_LITERAL 'l' /* take char after backslash in [] literal */
-#define CPO_LISTWM 'L' /* 'list' changes wrapmargin */
+#define CPO_EMPTYREGION 'E' // operating on empty region is an error
+#define CPO_FNAMER 'f' // set file name for ":r file"
+#define CPO_FNAMEW 'F' // set file name for ":w file"
+#define CPO_INTMOD 'i' // interrupt a read makes buffer modified
+#define CPO_INDENT 'I' // remove auto-indent more often
+#define CPO_ENDOFSENT 'J' // need two spaces to detect end of sentence
+#define CPO_KOFFSET 'K' // don't wait for key code in mappings
+#define CPO_LITERAL 'l' // take char after backslash in [] literal
+#define CPO_LISTWM 'L' // 'list' changes wrapmargin
#define CPO_SHOWMATCH 'm'
-#define CPO_MATCHBSL 'M' /* "%" ignores use of backslashes */
-#define CPO_NUMCOL 'n' /* 'number' column also used for text */
+#define CPO_MATCHBSL 'M' // "%" ignores use of backslashes
+#define CPO_NUMCOL 'n' // 'number' column also used for text
#define CPO_LINEOFF 'o'
-#define CPO_OVERNEW 'O' /* silently overwrite new file */
-#define CPO_LISP 'p' /* 'lisp' indenting */
-#define CPO_FNAMEAPP 'P' /* set file name for ":w >>file" */
-#define CPO_JOINCOL 'q' /* with "3J" use column after first join */
+#define CPO_OVERNEW 'O' // silently overwrite new file
+#define CPO_LISP 'p' // 'lisp' indenting
+#define CPO_FNAMEAPP 'P' // set file name for ":w >>file"
+#define CPO_JOINCOL 'q' // with "3J" use column after first join
#define CPO_REDO 'r'
-#define CPO_REMMARK 'R' /* remove marks when filtering */
+#define CPO_REMMARK 'R' // remove marks when filtering
#define CPO_BUFOPT 's'
#define CPO_BUFOPTGLOB 'S'
#define CPO_TAGPAT 't'
-#define CPO_UNDO 'u' /* "u" undoes itself */
-#define CPO_BACKSPACE 'v' /* "v" keep deleted text */
-#define CPO_FWRITE 'W' /* "w!" doesn't overwrite readonly files */
+#define CPO_UNDO 'u' // "u" undoes itself
+#define CPO_BACKSPACE 'v' // "v" keep deleted text
+#define CPO_FWRITE 'W' // "w!" doesn't overwrite readonly files
#define CPO_ESC 'x'
-#define CPO_REPLCNT 'X' /* "R" with a count only deletes chars once */
+#define CPO_REPLCNT 'X' // "R" with a count only deletes chars once
#define CPO_YANK 'y'
-#define CPO_KEEPRO 'Z' /* don't reset 'readonly' on ":w!" */
+#define CPO_KEEPRO 'Z' // don't reset 'readonly' on ":w!"
#define CPO_DOLLAR '$'
#define CPO_FILTER '!'
#define CPO_MATCH '%'
-#define CPO_PLUS '+' /* ":write file" resets 'modified' */
-#define CPO_SPECI '<' /* don't recognize <> in mappings */
-#define CPO_REGAPPEND '>' /* insert NL when appending to a register */
-#define CPO_SCOLON ';' /* using "," and ";" will skip over char if
- * cursor would not move */
-/* default values for Vim and Vi */
-#define CPO_VIM "aABceFs"
-#define CPO_VI "aAbBcCdDeEfFiIJkKlLmMnoOpPqrRsStuvWxXyZ$!%+<>;"
+#define CPO_PLUS '+' // ":write file" resets 'modified'
+#define CPO_REGAPPEND '>' // insert NL when appending to a register
+#define CPO_SCOLON ';' // using "," and ";" will skip over char if
+ // cursor would not move
+#define CPO_CHANGEW '_' // "cw" special-case
+// default values for Vim and Vi
+#define CPO_VIM "aABceFs_"
+#define CPO_VI "aAbBcCdDeEfFiIJKlLmMnoOpPqrRsStuvWxXyZ$!%+>;_"
/* characters for p_ww option: */
#define WW_ALL "bshl<>[],~"
@@ -296,16 +294,16 @@ enum {
* The following are actual variables for the options
*/
-EXTERN long p_aleph; /* 'aleph' */
-EXTERN bool p_acd; /* 'autochdir' */
-EXTERN char_u *p_ambw; /* 'ambiwidth' */
-EXTERN int p_ar; /* 'autoread' */
-EXTERN int p_aw; /* 'autowrite' */
-EXTERN int p_awa; /* 'autowriteall' */
-EXTERN char_u *p_bs; /* 'backspace' */
-EXTERN char_u *p_bg; /* 'background' */
-EXTERN int p_bk; /* 'backup' */
-EXTERN char_u *p_bkc; /* 'backupcopy' */
+EXTERN long p_aleph; // 'aleph'
+EXTERN int p_acd; // 'autochdir'
+EXTERN char_u *p_ambw; // 'ambiwidth'
+EXTERN int p_ar; // 'autoread'
+EXTERN int p_aw; // 'autowrite'
+EXTERN int p_awa; // 'autowriteall'
+EXTERN char_u *p_bs; // 'backspace'
+EXTERN char_u *p_bg; // 'background'
+EXTERN int p_bk; // 'backup'
+EXTERN char_u *p_bkc; // 'backupcopy'
EXTERN unsigned int bkc_flags; ///< flags from 'backupcopy'
#ifdef IN_OPTION_C
static char *(p_bkc_values[]) =
@@ -316,9 +314,10 @@ static char *(p_bkc_values[]) =
# define BKC_NO 0x004
# define BKC_BREAKSYMLINK 0x008
# define BKC_BREAKHARDLINK 0x010
-EXTERN char_u *p_bdir; /* 'backupdir' */
-EXTERN char_u *p_bex; /* 'backupext' */
-EXTERN char_u *p_bo; // 'belloff'
+EXTERN char_u *p_bdir; // 'backupdir'
+EXTERN char_u *p_bex; // 'backupext'
+EXTERN char_u *p_bo; // 'belloff'
+EXTERN char breakat_flags[256]; // which characters are in 'breakat'
EXTERN unsigned bo_flags;
# ifdef IN_OPTION_C
static char *(p_bo_values[]) = {"all", "backspace", "cursor", "complete",
@@ -370,17 +369,17 @@ static char *(p_cb_values[]) = {"unnamed", "unnamedplus", NULL};
# define CB_UNNAMED 0x001
# define CB_UNNAMEDPLUS 0x002
# define CB_UNNAMEDMASK (CB_UNNAMED | CB_UNNAMEDPLUS)
-EXTERN long p_cwh; /* 'cmdwinheight' */
-EXTERN long p_ch; /* 'cmdheight' */
-EXTERN int p_confirm; /* 'confirm' */
-EXTERN int p_cp; /* 'compatible' */
-EXTERN char_u *p_cot; /* 'completeopt' */
-EXTERN long p_ph; /* 'pumheight' */
-EXTERN char_u *p_cpo; /* 'cpoptions' */
-EXTERN char_u *p_csprg; /* 'cscopeprg' */
-EXTERN int p_csre; /* 'cscoperelative' */
-EXTERN char_u *p_csqf; /* 'cscopequickfix' */
-# define CSQF_CMDS "sgdctefi"
+EXTERN long p_cwh; // 'cmdwinheight'
+EXTERN long p_ch; // 'cmdheight'
+EXTERN int p_confirm; // 'confirm'
+EXTERN int p_cp; // 'compatible'
+EXTERN char_u *p_cot; // 'completeopt'
+EXTERN long p_ph; // 'pumheight'
+EXTERN char_u *p_cpo; // 'cpoptions'
+EXTERN char_u *p_csprg; // 'cscopeprg'
+EXTERN int p_csre; // 'cscoperelative'
+EXTERN char_u *p_csqf; // 'cscopequickfix'
+# define CSQF_CMDS "sgdctefia"
# define CSQF_FLAGS "+-0"
EXTERN int p_cst; /* 'cscopetag' */
EXTERN long p_csto; /* 'cscopetagorder' */
@@ -397,28 +396,31 @@ EXTERN char_u *p_dir; /* 'directory' */
EXTERN char_u *p_dy; /* 'display' */
EXTERN unsigned dy_flags;
#ifdef IN_OPTION_C
-static char *(p_dy_values[]) = {"lastline", "uhex", NULL};
+static char *(p_dy_values[]) = { "lastline", "truncate", "uhex", "msgsep",
+ NULL };
#endif
#define DY_LASTLINE 0x001
-#define DY_UHEX 0x002
-EXTERN int p_ed; /* 'edcompatible' */
-EXTERN char_u *p_ead; /* 'eadirection' */
-EXTERN bool p_ea; /* 'equalalways' */
-EXTERN char_u *p_ep; /* 'equalprg' */
-EXTERN int p_eb; /* 'errorbells' */
-EXTERN char_u *p_ef; /* 'errorfile' */
-EXTERN char_u *p_efm; /* 'errorformat' */
-EXTERN char_u *p_gefm; /* 'grepformat' */
-EXTERN char_u *p_gp; /* 'grepprg' */
-EXTERN char_u *p_ei; /* 'eventignore' */
-EXTERN int p_ek; /* 'esckeys' */
-EXTERN int p_exrc; /* 'exrc' */
-EXTERN char_u *p_fencs; /* 'fileencodings' */
-EXTERN char_u *p_ffs; /* 'fileformats' */
-EXTERN bool p_fic; ///< 'fileignorecase'
-EXTERN char_u *p_fcl; /* 'foldclose' */
-EXTERN long p_fdls; /* 'foldlevelstart' */
-EXTERN char_u *p_fdo; /* 'foldopen' */
+#define DY_TRUNCATE 0x002
+#define DY_UHEX 0x004
+#define DY_MSGSEP 0x008
+EXTERN int p_ed; // 'edcompatible'
+EXTERN int p_emoji; // 'emoji'
+EXTERN char_u *p_ead; // 'eadirection'
+EXTERN int p_ea; // 'equalalways'
+EXTERN char_u *p_ep; // 'equalprg'
+EXTERN int p_eb; // 'errorbells'
+EXTERN char_u *p_ef; // 'errorfile'
+EXTERN char_u *p_efm; // 'errorformat'
+EXTERN char_u *p_gefm; // 'grepformat'
+EXTERN char_u *p_gp; // 'grepprg'
+EXTERN char_u *p_ei; // 'eventignore'
+EXTERN int p_exrc; // 'exrc'
+EXTERN char_u *p_fencs; // 'fileencodings'
+EXTERN char_u *p_ffs; // 'fileformats'
+EXTERN int p_fic; // 'fileignorecase'
+EXTERN char_u *p_fcl; // 'foldclose'
+EXTERN long p_fdls; // 'foldlevelstart'
+EXTERN char_u *p_fdo; // 'foldopen'
EXTERN unsigned fdo_flags;
# ifdef IN_OPTION_C
static char *(p_fdo_values[]) = {"all", "block", "hor", "mark", "percent",
@@ -449,13 +451,13 @@ EXTERN char_u *p_popt; // 'printoptions'
EXTERN char_u *p_header; // 'printheader'
EXTERN int p_prompt; // 'prompt'
EXTERN char_u *p_guicursor; // 'guicursor'
+EXTERN char_u *p_guifont; // 'guifont'
+EXTERN char_u *p_guifontset; // 'guifontset'
+EXTERN char_u *p_guifontwide; // 'guifontwide'
EXTERN char_u *p_hf; // 'helpfile'
EXTERN long p_hh; // 'helpheight'
EXTERN char_u *p_hlg; // 'helplang'
EXTERN int p_hid; // 'hidden'
-// Use P_HID to check if a buffer is to be hidden when it is no longer
-// visible in a window.
-# define P_HID(buf) (buf_hide(buf))
EXTERN char_u *p_hl; // 'highlight'
EXTERN int p_hls; // 'hlsearch'
EXTERN long p_hi; // 'history'
@@ -468,6 +470,7 @@ EXTERN int p_icon; // 'icon'
EXTERN char_u *p_iconstring; // 'iconstring'
EXTERN int p_ic; // 'ignorecase'
EXTERN int p_is; // 'incsearch'
+EXTERN char_u *p_icm; // 'inccommand'
EXTERN int p_im; // 'insertmode'
EXTERN char_u *p_isf; // 'isfname'
EXTERN char_u *p_isi; // 'isident'
@@ -475,9 +478,11 @@ EXTERN char_u *p_isp; // 'isprint'
EXTERN int p_js; // 'joinspaces'
EXTERN char_u *p_kp; // 'keywordprg'
EXTERN char_u *p_km; // 'keymodel'
-EXTERN char_u *p_langmap; // 'langmap'*/
-EXTERN int p_lnr; // 'langnoremap'*/
+EXTERN char_u *p_langmap; // 'langmap'
+EXTERN int p_lnr; // 'langnoremap'
+EXTERN int p_lrm; // 'langremap'
EXTERN char_u *p_lm; // 'langmenu'
+EXTERN long *p_linespace; // 'linespace'
EXTERN char_u *p_lispwords; // 'lispwords'
EXTERN long p_ls; // 'laststatus'
EXTERN long p_stal; // 'showtabline'
@@ -486,6 +491,7 @@ EXTERN char_u *p_lcs; // 'listchars'
EXTERN int p_lz; // 'lazyredraw'
EXTERN int p_lpl; // 'loadplugins'
EXTERN int p_magic; // 'magic'
+EXTERN char_u *p_menc; // 'makeencoding'
EXTERN char_u *p_mef; // 'makeef'
EXTERN char_u *p_mp; // 'makeprg'
EXTERN char_u *p_cc; // 'colorcolumn'
@@ -494,9 +500,7 @@ EXTERN long p_mat; // 'matchtime'
EXTERN long p_mco; // 'maxcombine'
EXTERN long p_mfd; // 'maxfuncdepth'
EXTERN long p_mmd; // 'maxmapdepth'
-EXTERN long p_mm; // 'maxmem'
EXTERN long p_mmp; // 'maxmempattern'
-EXTERN long p_mmt; // 'maxmemtot'
EXTERN long p_mis; // 'menuitems'
EXTERN char_u *p_msm; // 'mkspellmem'
EXTERN long p_mls; // 'modelines'
@@ -512,6 +516,7 @@ EXTERN char_u *p_pex; // 'patchexpr'
EXTERN char_u *p_pm; // 'patchmode'
EXTERN char_u *p_path; // 'path'
EXTERN char_u *p_cdpath; // 'cdpath'
+EXTERN long p_pyx; // 'pyxversion'
EXTERN long p_rdt; // 'redrawtime'
EXTERN int p_remap; // 'remap'
EXTERN long p_re; // 'regexpengine'
@@ -523,6 +528,7 @@ EXTERN int p_ru; // 'ruler'
EXTERN char_u *p_ruf; // 'rulerformat'
EXTERN char_u *p_pp; // 'packpath'
EXTERN char_u *p_rtp; // 'runtimepath'
+EXTERN long p_scbk; // 'scrollback'
EXTERN long p_sj; // 'scrolljump'
EXTERN long p_so; // 'scrolloff'
EXTERN char_u *p_sbo; // 'scrollopt'
@@ -538,7 +544,7 @@ static char *(p_ssop_values[]) = {"buffers", "winpos", "resize", "winsize",
"localoptions", "options", "help", "blank",
"globals", "slash", "unix",
"sesdir", "curdir", "folds", "cursor",
- "tabpages", NULL};
+ "tabpages", NULL };
# endif
# define SSOP_BUFFERS 0x001
# define SSOP_WINPOS 0x002
@@ -556,16 +562,17 @@ static char *(p_ssop_values[]) = {"buffers", "winpos", "resize", "winsize",
# define SSOP_FOLDS 0x2000
# define SSOP_CURSOR 0x4000
# define SSOP_TABPAGES 0x8000
-EXTERN char_u *p_sh; /* 'shell' */
-EXTERN char_u *p_shcf; /* 'shellcmdflag' */
-EXTERN char_u *p_sp; /* 'shellpipe' */
-EXTERN char_u *p_shq; /* 'shellquote' */
-EXTERN char_u *p_sxq; /* 'shellxquote' */
-EXTERN char_u *p_sxe; /* 'shellxescape' */
-EXTERN char_u *p_srr; /* 'shellredir' */
-EXTERN int p_stmp; /* 'shelltemp' */
+
+EXTERN char_u *p_sh; // 'shell'
+EXTERN char_u *p_shcf; // 'shellcmdflag'
+EXTERN char_u *p_sp; // 'shellpipe'
+EXTERN char_u *p_shq; // 'shellquote'
+EXTERN char_u *p_sxq; // 'shellxquote'
+EXTERN char_u *p_sxe; // 'shellxescape'
+EXTERN char_u *p_srr; // 'shellredir'
+EXTERN int p_stmp; // 'shelltemp'
#ifdef BACKSLASH_IN_FILENAME
-EXTERN int p_ssl; /* 'shellslash' */
+EXTERN int p_ssl; // 'shellslash'
#endif
EXTERN char_u *p_stl; // 'statusline'
EXTERN int p_sr; // 'shiftround'
@@ -601,11 +608,14 @@ EXTERN int p_tbs; ///< 'tagbsearch'
EXTERN char_u *p_tc; ///< 'tagcase'
EXTERN unsigned tc_flags; ///< flags from 'tagcase'
#ifdef IN_OPTION_C
-static char *(p_tc_values[]) = { "followic", "ignore", "match", NULL };
+static char *(p_tc_values[]) =
+ { "followic", "ignore", "match", "followscs", "smart", NULL };
#endif
#define TC_FOLLOWIC 0x01
#define TC_IGNORE 0x02
#define TC_MATCH 0x04
+#define TC_FOLLOWSCS 0x08
+#define TC_SMART 0x10
EXTERN long p_tl; ///< 'taglength'
EXTERN int p_tr; ///< 'tagrelative'
EXTERN char_u *p_tags; ///< 'tags'
@@ -620,7 +630,7 @@ EXTERN long p_titlelen; ///< 'titlelen'
EXTERN char_u *p_titleold; ///< 'titleold'
EXTERN char_u *p_titlestring; ///< 'titlestring'
EXTERN char_u *p_tsr; ///< 'thesaurus'
-EXTERN bool p_tgc; ///< 'termguicolors'
+EXTERN int p_tgc; ///< 'termguicolors'
EXTERN int p_ttimeout; ///< 'ttimeout'
EXTERN long p_ttm; ///< 'ttimeoutlen'
EXTERN char_u *p_udir; ///< 'undodir'
@@ -649,26 +659,26 @@ char_u *p_vfile = (char_u *)""; /* used before options are initialized */
#else
extern char_u *p_vfile; /* 'verbosefile' */
#endif
-EXTERN int p_warn; /* 'warn' */
-EXTERN char_u *p_wop; /* 'wildoptions' */
-EXTERN long p_window; /* 'window' */
-EXTERN char_u *p_wak; /* 'winaltkeys' */
-EXTERN char_u *p_wig; /* 'wildignore' */
-EXTERN char_u *p_ww; /* 'whichwrap' */
-EXTERN long p_wc; /* 'wildchar' */
-EXTERN long p_wcm; /* 'wildcharm' */
-EXTERN bool p_wic; ///< 'wildignorecase'
-EXTERN char_u *p_wim; /* 'wildmode' */
-EXTERN int p_wmnu; /* 'wildmenu' */
-EXTERN long p_wh; /* 'winheight' */
-EXTERN long p_wmh; /* 'winminheight' */
-EXTERN long p_wmw; /* 'winminwidth' */
-EXTERN long p_wiw; /* 'winwidth' */
-EXTERN bool p_ws; /* 'wrapscan' */
-EXTERN int p_write; /* 'write' */
-EXTERN int p_wa; /* 'writeany' */
-EXTERN int p_wb; /* 'writebackup' */
-EXTERN long p_wd; /* 'writedelay' */
+EXTERN int p_warn; // 'warn'
+EXTERN char_u *p_wop; // 'wildoptions'
+EXTERN long p_window; // 'window'
+EXTERN char_u *p_wak; // 'winaltkeys'
+EXTERN char_u *p_wig; // 'wildignore'
+EXTERN char_u *p_ww; // 'whichwrap'
+EXTERN long p_wc; // 'wildchar'
+EXTERN long p_wcm; // 'wildcharm'
+EXTERN int p_wic; // 'wildignorecase'
+EXTERN char_u *p_wim; // 'wildmode'
+EXTERN int p_wmnu; // 'wildmenu'
+EXTERN long p_wh; // 'winheight'
+EXTERN long p_wmh; // 'winminheight'
+EXTERN long p_wmw; // 'winminwidth'
+EXTERN long p_wiw; // 'winwidth'
+EXTERN int p_ws; // 'wrapscan'
+EXTERN int p_write; // 'write'
+EXTERN int p_wa; // 'writeany'
+EXTERN int p_wb; // 'writebackup'
+EXTERN long p_wd; // 'writedelay'
EXTERN int p_force_on; ///< options that cannot be turned off.
EXTERN int p_force_off; ///< options that cannot be turned on.
@@ -690,6 +700,7 @@ enum {
, BV_BIN
, BV_BL
, BV_BOMB
+ , BV_CHANNEL
, BV_CI
, BV_CIN
, BV_CINK
@@ -709,6 +720,7 @@ enum {
, BV_EP
, BV_ET
, BV_FENC
+ , BV_FP
, BV_BEXPR
, BV_FEX
, BV_FF
@@ -726,6 +738,7 @@ enum {
, BV_KP
, BV_LISP
, BV_LW
+ , BV_MENC
, BV_MA
, BV_ML
, BV_MOD
@@ -736,6 +749,7 @@ enum {
, BV_PI
, BV_QE
, BV_RO
+ , BV_SCBK
, BV_SI
, BV_SMC
, BV_SYN
@@ -798,10 +812,20 @@ enum {
, WV_WFH
, WV_WFW
, WV_WRAP
- , WV_COUNT /* must be the last one */
+ , WV_SCL
+ , WV_WINHL
+ , WV_COUNT // must be the last one
};
/* Value for b_p_ul indicating the global value must be used. */
#define NO_LOCAL_UNDOLEVEL -123456
+#define SB_MAX 100000 // Maximum 'scrollback' value.
+
+/// Stores an identifier of a script or channel that last set an option.
+typedef struct {
+ scid_T script_id; /// Script ID or one of SID_* special values.
+ uint64_t channel_id; /// Only used when script_id is SID_API_CLIENT.
+} LastSet;
+
#endif // NVIM_OPTION_DEFS_H
diff --git a/src/nvim/options.lua b/src/nvim/options.lua
index d19af4f73f..aba8f8b893 100644
--- a/src/nvim/options.lua
+++ b/src/nvim/options.lua
@@ -7,7 +7,7 @@
-- enable_if=nil,
-- defaults={condition=nil, if_true={vi=224, vim=0}, if_false=nil},
-- secure=nil, gettext=nil, noglob=nil, normal_fname_chars=nil,
--- pri_mkrc=nil, deny_in_modelines=nil,
+-- pri_mkrc=nil, deny_in_modelines=nil, normal_dname_chars=nil,
-- expand=nil, nodefault=nil, no_mkrc=nil, vi_def=true, vim=true,
-- alloced=nil,
-- save_pv_indir=nil,
@@ -17,8 +17,8 @@
-- types: bool, number, string
-- lists: (nil), comma, onecomma, flags, flagscomma
-- scopes: global, buffer, window
--- redraw options: statuslines, current_window, current_buffer, all_windows,
--- everything, curswant
+-- redraw options: statuslines, current_window, curent_window_only,
+-- current_buffer, all_windows, everything, curswant
-- default: {vi=โ€ฆ[, vim=โ€ฆ]}
-- defaults: {condition=#if condition, if_true=default, if_false=default}
-- #if condition:
@@ -34,6 +34,11 @@ local macros=function(s)
return s
end
end
+local imacros=function(s)
+ return function()
+ return '(intptr_t)' .. s
+ end
+end
local N_=function(s)
return function()
return 'N_(' .. cstr(s) .. ')'
@@ -63,7 +68,8 @@ return {
type='bool', scope={'global'},
vi_def=true,
vim=true,
- redraw={'everything'},
+ redraw={'all_windows', 'ui_option'},
+
varname='p_arshape',
defaults={if_true={vi=true}}
},
@@ -86,7 +92,7 @@ return {
full_name='ambiwidth', abbreviation='ambw',
type='string', scope={'global'},
vi_def=true,
- redraw={'everything'},
+ redraw={'all_windows', 'ui_option'},
varname='p_ambw',
defaults={if_true={vi="single"}}
},
@@ -126,10 +132,10 @@ return {
{
full_name='background', abbreviation='bg',
type='string', scope={'global'},
- vi_def=true,
- redraw={'everything'},
+ vim=true,
+ redraw={'all_windows'},
varname='p_bg',
- defaults={if_true={vi="light"}}
+ defaults={if_true={vi="light",vim="dark"}}
},
{
full_name='backspace', abbreviation='bs',
@@ -165,7 +171,7 @@ return {
deny_duplicates=true,
secure=true,
vi_def=true,
- expand=true,
+ expand='nodefault',
varname='p_bdir',
defaults={if_true={vi=''}}
},
@@ -190,7 +196,7 @@ return {
type='string', list='comma', scope={'global'},
vi_def=true,
varname='p_bo',
- defaults={if_true={vi=""}}
+ defaults={if_true={vi="all"}}
},
{
full_name='binary', abbreviation='bin',
@@ -290,6 +296,14 @@ return {
defaults={if_true={vi="", vim=macros('CTRL_F_STR')}}
},
{
+ full_name='channel',
+ type='number', scope={'buffer'},
+ no_mkrc=true,
+ nodefault=true,
+ varname='p_channel',
+ defaults={if_true={vi=0}}
+ },
+ {
full_name='charconvert', abbreviation='ccv',
type='string', scope={'global'},
secure=true,
@@ -519,7 +533,7 @@ return {
vi_def=true,
vim=true,
varname='p_csverbose',
- defaults={if_true={vi=0}}
+ defaults={if_true={vi=1}}
},
{
full_name='cursorbind', abbreviation='crb',
@@ -539,7 +553,7 @@ return {
full_name='cursorline', abbreviation='cul',
type='bool', scope={'window'},
vi_def=true,
- redraw={'current_window'},
+ redraw={'current_window_only'},
defaults={if_true={vi=false}}
},
{
@@ -570,6 +584,7 @@ return {
full_name='dictionary', abbreviation='dict',
type='string', list='onecomma', scope={'global', 'buffer'},
deny_duplicates=true,
+ normal_dname_chars=true,
vi_def=true,
expand=true,
varname='p_dict',
@@ -600,7 +615,7 @@ return {
alloced=true,
redraw={'current_window'},
varname='p_dip',
- defaults={if_true={vi="filler"}}
+ defaults={if_true={vi="internal,filler"}}
},
{
full_name='digraph', abbreviation='dg',
@@ -616,7 +631,7 @@ return {
deny_duplicates=true,
secure=true,
vi_def=true,
- expand=true,
+ expand='nodefault',
varname='p_dir',
defaults={if_true={vi=''}}
},
@@ -627,7 +642,7 @@ return {
vim=true,
redraw={'all_windows'},
varname='p_dy',
- defaults={if_true={vi="", vim="lastline"}}
+ defaults={if_true={vi="", vim="lastline,msgsep"}}
},
{
full_name='eadirection', abbreviation='ead',
@@ -644,11 +659,18 @@ return {
defaults={if_true={vi=false}}
},
{
+ full_name='emoji', abbreviation='emo',
+ type='bool', scope={'global'},
+ vi_def=true,
+ redraw={'all_windows', 'ui_option'},
+ varname='p_emoji',
+ defaults={if_true={vi=true}}
+ },
+ {
full_name='encoding', abbreviation='enc',
type='string', scope={'global'},
deny_in_modelines=true,
vi_def=true,
- redraw={'everything'},
varname='p_enc',
defaults={if_true={vi=macros('ENC_DFLT')}}
},
@@ -703,13 +725,6 @@ return {
defaults={if_true={vi=macros('DFLT_EFM')}}
},
{
- full_name='esckeys', abbreviation='ek',
- type='bool', scope={'global'},
- vim=true,
- varname='p_ek',
- defaults={if_true={vi=false, vim=true}}
- },
- {
full_name='eventignore', abbreviation='ei',
type='string', list='onecomma', scope={'global'},
deny_duplicates=true,
@@ -796,7 +811,7 @@ return {
vi_def=true,
redraw={'all_windows'},
varname='p_fcs',
- defaults={if_true={vi="vert:|,fold:-"}}
+ defaults={if_true={vi=''}}
},
{
full_name='fixendofline', abbreviation='fixeol',
@@ -947,7 +962,7 @@ return {
},
{
full_name='formatprg', abbreviation='fp',
- type='string', scope={'global'},
+ type='string', scope={'global', 'buffer'},
secure=true,
vi_def=true,
expand=true,
@@ -960,7 +975,7 @@ return {
secure=true,
vi_def=true,
varname='p_fs',
- defaults={if_true={vi=true}}
+ defaults={if_true={vi=false}}
},
{
full_name='gdefault', abbreviation='gd',
@@ -986,11 +1001,11 @@ return {
expand=true,
varname='p_gp',
defaults={
- condition='UNIX',
+ condition='WIN32',
-- Add an extra file name so that grep will always
-- insert a file name in the match line. */
- if_true={vi="grep -n $* /dev/null"},
- if_false={vi="grep -n "},
+ if_true={vi="findstr /n $* nul"},
+ if_false={vi="grep -n $* /dev/null"}
}
},
{
@@ -999,37 +1014,33 @@ return {
deny_duplicates=true,
vi_def=true,
varname='p_guicursor',
- defaults={if_true={vi="n-v-c:block,o:hor50,i-ci:hor15,r-cr:hor30,sm:block"}}
+ defaults={if_true={vi="n-v-c-sm:block,i-ci-ve:ver25,r-cr-o:hor20"}}
},
{
full_name='guifont', abbreviation='gfn',
type='string', list='onecomma', scope={'global'},
deny_duplicates=true,
vi_def=true,
- redraw={'everything'},
- enable_if=false,
+ varname='p_guifont',
+ redraw={'ui_option'},
+ defaults={if_true={vi=""}}
},
{
full_name='guifontset', abbreviation='gfs',
type='string', list='onecomma', scope={'global'},
vi_def=true,
- redraw={'everything'},
- enable_if=false,
+ varname='p_guifontset',
+ redraw={'ui_option'},
+ defaults={if_true={vi=""}}
},
{
full_name='guifontwide', abbreviation='gfw',
type='string', list='onecomma', scope={'global'},
deny_duplicates=true,
vi_def=true,
- redraw={'everything'},
- enable_if=false,
- },
- {
- full_name='guiheadroom', abbreviation='ghr',
- type='number', scope={'global'},
- vi_def=true,
- enable_if=false,
- defaults={if_true={vi=50}}
+ redraw={'ui_option'},
+ varname='p_guifontwide',
+ defaults={if_true={vi=""}}
},
{
full_name='guioptions', abbreviation='go',
@@ -1087,7 +1098,6 @@ return {
type='string', list='onecomma', scope={'global'},
deny_duplicates=true,
vi_def=true,
- redraw={'everything'},
varname='p_hl',
defaults={if_true={vi=macros('HIGHLIGHT_INIT')}}
},
@@ -1180,6 +1190,14 @@ return {
}
},
{
+ full_name='inccommand', abbreviation='icm',
+ type='string', scope={'global'},
+ vi_def=true,
+ redraw={'all_windows'},
+ varname='p_icm',
+ defaults={if_true={vi=""}}
+ },
+ {
full_name='include', abbreviation='inc',
type='string', scope={'global', 'buffer'},
vi_def=true,
@@ -1338,6 +1356,12 @@ return {
defaults={if_true={vi=false, vim=true}}
},
{
+ full_name='langremap', abbreviation='lrm',
+ type='bool', scope={'global'},
+ varname='p_lrm',
+ defaults={if_true={vi=true, vim=false}}
+ },
+ {
full_name='laststatus', abbreviation='ls',
type='number', scope={'global'},
vim=true,
@@ -1373,8 +1397,9 @@ return {
full_name='linespace', abbreviation='lsp',
type='number', scope={'global'},
vi_def=true,
- redraw={'everything'},
- enable_if=false,
+ redraw={'ui_option'},
+ varname='p_linespace',
+ defaults={if_true={vi=0}}
},
{
full_name='lisp',
@@ -1431,6 +1456,13 @@ return {
defaults={if_true={vi=""}}
},
{
+ full_name='makeencoding', abbreviation='menc',
+ type='string', scope={'global', 'buffer'},
+ vi_def=true,
+ varname='p_menc',
+ defaults={if_true={vi=""}}
+ },
+ {
full_name='makeprg', abbreviation='mp',
type='string', scope={'global', 'buffer'},
secure=true,
@@ -1459,9 +1491,8 @@ return {
full_name='maxcombine', abbreviation='mco',
type='number', scope={'global'},
vi_def=true,
- redraw={'curswant'},
varname='p_mco',
- defaults={if_true={vi=2}}
+ defaults={if_true={vi=6}}
},
{
full_name='maxfuncdepth', abbreviation='mfd',
@@ -1478,13 +1509,6 @@ return {
defaults={if_true={vi=1000}}
},
{
- full_name='maxmem', abbreviation='mm',
- type='number', scope={'global'},
- vi_def=true,
- varname='p_mm',
- defaults={if_true={vi=macros('DFLT_MAXMEM')}}
- },
- {
full_name='maxmempattern', abbreviation='mmp',
type='number', scope={'global'},
vi_def=true,
@@ -1492,13 +1516,6 @@ return {
defaults={if_true={vi=1000}}
},
{
- full_name='maxmemtot', abbreviation='mmt',
- type='number', scope={'global'},
- vi_def=true,
- varname='p_mmt',
- defaults={if_true={vi=macros('DFLT_MAXMEMTOT')}}
- },
- {
full_name='menuitems', abbreviation='mis',
type='number', scope={'global'},
vi_def=true,
@@ -1556,7 +1573,7 @@ return {
full_name='mouse',
type='string', list='flags', scope={'global'},
varname='p_mouse',
- defaults={if_true={vi="", vim="a"}}
+ defaults={if_true={vi="", vim=""}}
},
{
full_name='mousefocus', abbreviation='mousef',
@@ -1737,6 +1754,7 @@ return {
{
full_name='printexpr', abbreviation='pexpr',
type='string', scope={'global'},
+ secure=true,
vi_def=true,
varname='p_pexpr',
defaults={if_true={vi=""}}
@@ -1751,10 +1769,9 @@ return {
{
full_name='printheader', abbreviation='pheader',
type='string', scope={'global'},
- gettext=true,
vi_def=true,
varname='p_header',
- defaults={if_true={vi=N_("%<%f%h%m%=Page %N")}}
+ defaults={if_true={vi="%<%f%h%m%=Page %N"}}
},
{
full_name='printmbcharset', abbreviation='pmbcs',
@@ -1793,6 +1810,14 @@ return {
defaults={if_true={vi=0}}
},
{
+ full_name='pyxversion', abbreviation='pyx',
+ type='number', scope={'global'},
+ secure=true,
+ vi_def=true,
+ varname='p_pyx',
+ defaults={if_true={vi=0}}
+ },
+ {
full_name='quoteescape', abbreviation='qe',
type='string', scope={'buffer'},
vi_def=true,
@@ -1874,7 +1899,7 @@ return {
vim=true,
redraw={'statuslines'},
varname='p_ru',
- defaults={if_true={vi=false}}
+ defaults={if_true={vi=true}}
},
{
full_name='rulerformat', abbreviation='ruf',
@@ -1891,7 +1916,7 @@ return {
deny_duplicates=true,
secure=true,
vi_def=true,
- expand=true,
+ expand='nodefault',
varname='p_rtp',
defaults={if_true={vi=''}}
},
@@ -1901,7 +1926,15 @@ return {
no_mkrc=true,
vi_def=true,
pv_name='p_scroll',
- defaults={if_true={vi=12}}
+ defaults={if_true={vi=0}}
+ },
+ {
+ full_name='scrollback', abbreviation='scbk',
+ type='number', scope={'buffer'},
+ vi_def=true,
+ varname='p_scbk',
+ redraw={'current_buffer'},
+ defaults={if_true={vi=10000}}
},
{
full_name='scrollbind', abbreviation='scb',
@@ -2005,7 +2038,7 @@ return {
varname='p_shcf',
defaults={
condition='WIN32',
- if_true={vi="/c"},
+ if_true={vi="/s /c"},
if_false={vi="-c"}
}
},
@@ -2016,9 +2049,9 @@ return {
vi_def=true,
varname='p_sp',
defaults={
- condition='UNIX',
- if_true={vi="| tee"},
- if_false={vi=">"},
+ condition='WIN32',
+ if_true={vi=">%s 2>&1"},
+ if_false={vi="| tee"},
}
},
{
@@ -2035,7 +2068,11 @@ return {
secure=true,
vi_def=true,
varname='p_srr',
- defaults={if_true={vi=">"}}
+ defaults={
+ condition='WIN32',
+ if_true={vi=">%s 2>&1"},
+ if_false={vi=">"}
+ }
},
{
full_name='shellslash', abbreviation='ssl',
@@ -2057,7 +2094,11 @@ return {
secure=true,
vi_def=true,
varname='p_sxq',
- defaults={if_true={vi=""}}
+ defaults={
+ condition='WIN32',
+ if_true={vi="\""},
+ if_false={vi=""},
+ }
},
{
full_name='shellxescape', abbreviation='sxe',
@@ -2087,7 +2128,7 @@ return {
type='string', list='flags', scope={'global'},
vim=true,
varname='p_shm',
- defaults={if_true={vi="", vim="filnxtToO"}}
+ defaults={if_true={vi="", vim="filnxtToOF"}}
},
{
full_name='showbreak', abbreviation='sbr',
@@ -2102,11 +2143,7 @@ return {
type='bool', scope={'global'},
vim=true,
varname='p_sc',
- defaults={
- condition='UNIX',
- if_true={vi=false, vim=false},
- if_false={vi=false, vim=true},
- }
+ defaults={if_true={vi=false, vim=true}}
},
{
full_name='showfulltag', abbreviation='sft',
@@ -2133,7 +2170,7 @@ return {
full_name='showtabline', abbreviation='stal',
type='number', scope={'global'},
vi_def=true,
- redraw={'all_windows'},
+ redraw={'all_windows', 'ui_option'},
varname='p_stal',
defaults={if_true={vi=1}}
},
@@ -2142,7 +2179,7 @@ return {
type='number', scope={'global'},
vi_def=true,
varname='p_ss',
- defaults={if_true={vi=0}}
+ defaults={if_true={vi=1}}
},
{
full_name='sidescrolloff', abbreviation='siso',
@@ -2154,6 +2191,14 @@ return {
defaults={if_true={vi=0}}
},
{
+ full_name='signcolumn', abbreviation='scl',
+ type='string', scope={'window'},
+ vi_def=true,
+ alloced=true,
+ redraw={'current_window'},
+ defaults={if_true={vi="auto"}}
+ },
+ {
full_name='smartcase', abbreviation='scs',
type='bool', scope={'global'},
vi_def=true,
@@ -2389,14 +2434,13 @@ return {
full_name='termencoding', abbreviation='tenc',
type='string', scope={'global'},
vi_def=true,
- redraw={'everything'},
defaults={if_true={vi=""}}
},
{
full_name='termguicolors', abbreviation='tgc',
type='bool', scope={'global'},
vi_def=false,
- redraw={'everything'},
+ redraw={'ui_option'},
varname='p_tgc',
defaults={if_true={vi=false}}
},
@@ -2420,6 +2464,7 @@ return {
full_name='thesaurus', abbreviation='tsr',
type='string', list='onecomma', scope={'global', 'buffer'},
deny_duplicates=true,
+ normal_dname_chars=true,
vi_def=true,
expand=true,
varname='p_tsr',
@@ -2465,11 +2510,10 @@ return {
full_name='titleold',
type='string', scope={'global'},
secure=true,
- gettext=true,
no_mkrc=true,
vi_def=true,
varname='p_titleold',
- defaults={if_true={vi=N_("Thanks for flying Vim")}}
+ defaults={if_true={vi=""}}
},
{
full_name='titlestring',
@@ -2484,14 +2528,14 @@ return {
vi_def=true,
vim=true,
varname='p_ttimeout',
- defaults={if_true={vi=false}}
+ defaults={if_true={vi=true}}
},
{
full_name='ttimeoutlen', abbreviation='ttm',
type='number', scope={'global'},
vi_def=true,
varname='p_ttm',
- defaults={if_true={vi=-1}}
+ defaults={if_true={vi=50}}
},
{
full_name='ttyfast', abbreviation='tf',
@@ -2507,7 +2551,7 @@ return {
deny_duplicates=true,
secure=true,
vi_def=true,
- expand=true,
+ expand='nodefault',
varname='p_udir',
defaults={if_true={vi=''}}
},
@@ -2568,7 +2612,7 @@ return {
type='string', scope={'global'},
secure=true,
vi_def=true,
- expand=true,
+ expand='nodefault',
varname='p_vdir',
defaults={if_true={vi=''}}
},
@@ -2578,7 +2622,7 @@ return {
deny_duplicates=true,
vi_def=true,
varname='p_vop',
- defaults={if_true={vi="folds,options,cursor"}}
+ defaults={if_true={vi="folds,options,cursor,curdir"}}
},
{
full_name='viminfo', abbreviation='vi',
@@ -2624,7 +2668,7 @@ return {
type='number', scope={'global'},
vim=true,
varname='p_wc',
- defaults={if_true={vi=macros('Ctrl_E'), vim=macros('TAB')}}
+ defaults={if_true={vi=imacros('Ctrl_E'), vim=imacros('TAB')}}
},
{
full_name='wildcharm', abbreviation='wcm',
@@ -2678,6 +2722,14 @@ return {
defaults={if_true={vi="menu"}}
},
{
+ full_name='winhighlight', abbreviation='winhl',
+ type='string', scope={'window'},
+ vi_def=true,
+ alloced=true,
+ redraw={'current_window'},
+ defaults={if_true={vi=""}}
+ },
+ {
full_name='window', abbreviation='wi',
type='number', scope={'global'},
vi_def=true,
diff --git a/src/nvim/os/dl.c b/src/nvim/os/dl.c
index fef02cc784..267cf5ae4b 100644
--- a/src/nvim/os/dl.c
+++ b/src/nvim/os/dl.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/// Functions for using external native libraries
#include <stdbool.h>
diff --git a/src/nvim/os/env.c b/src/nvim/os/env.c
index edc430410c..c6794e4be5 100644
--- a/src/nvim/os/env.c
+++ b/src/nvim/os/env.c
@@ -1,24 +1,29 @@
-// env.c -- environment variable access
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
-#include <assert.h>
+// Environment inspection
+#include <assert.h>
#include <uv.h>
-// vim.h must be included before charset.h (and possibly others) or things
-// blow up
#include "nvim/vim.h"
#include "nvim/ascii.h"
#include "nvim/charset.h"
+#include "nvim/fileio.h"
#include "nvim/os/os.h"
#include "nvim/memory.h"
#include "nvim/message.h"
-#include "nvim/misc2.h"
#include "nvim/path.h"
+#include "nvim/macros.h"
#include "nvim/strings.h"
#include "nvim/eval.h"
#include "nvim/ex_getln.h"
#include "nvim/version.h"
+#ifdef WIN32
+#include "nvim/mbyte.h" // for utf8_to_utf16, utf16_to_utf8
+#endif
+
#ifdef HAVE__NSGETENVIRON
#include <crt_externs.h>
#endif
@@ -46,7 +51,21 @@ bool os_env_exists(const char *name)
int os_setenv(const char *name, const char *value, int overwrite)
FUNC_ATTR_NONNULL_ALL
{
-#ifdef HAVE_SETENV
+#ifdef WIN32
+ size_t envbuflen = strlen(name) + strlen(value) + 2;
+ char *envbuf = xmalloc(envbuflen);
+ snprintf(envbuf, envbuflen, "%s=%s", name, value);
+
+ wchar_t *p;
+ utf8_to_utf16(envbuf, &p);
+ xfree(envbuf);
+ if (p == NULL) {
+ return -1;
+ }
+ _wputenv(p);
+ xfree(p); // Unlike Unix systems, we can free the string for _wputenv().
+ return 0;
+#elif defined(HAVE_SETENV)
return setenv(name, value, overwrite);
#elif defined(HAVE_PUTENV_S)
if (!overwrite && os_getenv(name) != NULL) {
@@ -100,7 +119,6 @@ char *os_getenvname_at_index(size_t index)
return name;
}
-
/// Get the process ID of the Neovim process.
///
/// @return the process ID.
@@ -113,11 +131,11 @@ int64_t os_get_pid(void)
#endif
}
-/// Get the hostname of the machine running Neovim.
+/// Gets the hostname of the current machine.
///
-/// @param hostname Buffer to store the hostname.
-/// @param len Length of `hostname`.
-void os_get_hostname(char *hostname, size_t len)
+/// @param hostname Buffer to store the hostname.
+/// @param size Size of `hostname`.
+void os_get_hostname(char *hostname, size_t size)
{
#ifdef HAVE_SYS_UTSNAME_H
struct utsname vutsname;
@@ -125,13 +143,29 @@ void os_get_hostname(char *hostname, size_t len)
if (uname(&vutsname) < 0) {
*hostname = '\0';
} else {
- strncpy(hostname, vutsname.nodename, len - 1);
- hostname[len - 1] = '\0';
+ xstrlcpy(hostname, vutsname.nodename, size);
}
+#elif defined(WIN32)
+ wchar_t host_utf16[MAX_COMPUTERNAME_LENGTH + 1];
+ DWORD host_wsize = sizeof(host_utf16) / sizeof(host_utf16[0]);
+ if (GetComputerNameW(host_utf16, &host_wsize) == 0) {
+ *hostname = '\0';
+ DWORD err = GetLastError();
+ EMSG2("GetComputerNameW failed: %d", err);
+ return;
+ }
+ host_utf16[host_wsize] = '\0';
+
+ char *host_utf8;
+ int conversion_result = utf16_to_utf8(host_utf16, &host_utf8);
+ if (conversion_result != 0) {
+ EMSG2("utf16_to_utf8 failed: %d", conversion_result);
+ return;
+ }
+ xstrlcpy(hostname, host_utf8, size);
+ xfree(host_utf8);
#else
- // TODO(unknown): Implement this for windows.
- // See the implementation used in vim:
- // https://code.google.com/p/vim/source/browse/src/os_win32.c?r=6b69d8dde19e32909f4ee3a6337e6a2ecfbb6f72#2899
+ EMSG("os_get_hostname failed: missing uname()");
*hostname = '\0';
#endif
}
@@ -143,15 +177,15 @@ void os_get_hostname(char *hostname, size_t len)
/// - do os_dirname() to get the real name of that directory.
/// This also works with mounts and links.
/// Don't do this for Windows, it will change the "current dir" for a drive.
-static char_u *homedir = NULL;
+static char *homedir = NULL;
void init_homedir(void)
{
- // In case we are called a second time (when 'encoding' changes).
+ // In case we are called a second time.
xfree(homedir);
homedir = NULL;
- char_u *var = (char_u *)os_getenv("HOME");
+ const char *var = os_getenv("HOME");
#ifdef WIN32
// Typically, $HOME is not defined on Windows, unless the user has
@@ -162,33 +196,35 @@ void init_homedir(void)
const char *homedrive = os_getenv("HOMEDRIVE");
const char *homepath = os_getenv("HOMEPATH");
if (homepath == NULL) {
- homepath = "\\";
+ homepath = "\\";
}
- if (homedrive != NULL && strlen(homedrive) + strlen(homepath) < MAXPATHL) {
- snprintf((char *)NameBuff, MAXPATHL, "%s%s", homedrive, homepath);
- if (NameBuff[0] != NUL) {
- var = NameBuff;
- vim_setenv("HOME", (char *)NameBuff);
+ if (homedrive != NULL
+ && strlen(homedrive) + strlen(homepath) < MAXPATHL) {
+ snprintf(os_buf, MAXPATHL, "%s%s", homedrive, homepath);
+ if (os_buf[0] != NUL) {
+ var = os_buf;
}
}
}
+ if (var == NULL) {
+ var = os_getenv("USERPROFILE");
+ }
#endif
if (var != NULL) {
#ifdef UNIX
// Change to the directory and get the actual path. This resolves
// links. Don't do it when we can't return.
- if (os_dirname(NameBuff, MAXPATHL) == OK
- && os_chdir((char *)NameBuff) == 0) {
- if (!os_chdir((char *)var) && os_dirname(IObuff, IOSIZE) == OK) {
- var = IObuff;
+ if (os_dirname((char_u *)os_buf, MAXPATHL) == OK && os_chdir(os_buf) == 0) {
+ if (!os_chdir(var) && os_dirname(IObuff, IOSIZE) == OK) {
+ var = (char *)IObuff;
}
- if (os_chdir((char *)NameBuff) != 0) {
+ if (os_chdir(os_buf) != 0) {
EMSG(_(e_prev_dir));
}
}
#endif
- homedir = vim_strsave(var);
+ homedir = xstrdup(var);
}
}
@@ -227,25 +263,24 @@ char_u *expand_env_save_opt(char_u *src, bool one)
/// "~/" is also expanded, using $HOME. For Unix "~user/" is expanded.
/// Skips over "\ ", "\~" and "\$" (not for Win32 though).
/// If anything fails no expansion is done and dst equals src.
-/// @param src Input string e.g. "$HOME/vim.hlp"
-/// @param dst Where to put the result
-/// @param dstlen Maximum length of the result
+///
+/// @param src Input string e.g. "$HOME/vim.hlp"
+/// @param dst[out] Where to put the result
+/// @param dstlen Maximum length of the result
void expand_env(char_u *src, char_u *dst, int dstlen)
{
expand_env_esc(src, dst, dstlen, false, false, NULL);
}
/// Expand environment variable with path name and escaping.
-/// "~/" is also expanded, using $HOME. For Unix "~user/" is expanded.
-/// Skips over "\ ", "\~" and "\$" (not for Win32 though).
-/// If anything fails no expansion is done and dst equals src.
-/// prefix recognize the start of a new name, for '~' expansion.
-/// @param srcp Input string e.g. "$HOME/vim.hlp"
-/// @param dst Where to put the result
-/// @param dstlen Maximum length of the result
-/// @param esc Should we escape spaces in expanded variables?
-/// @param one Should we expand more than one '~'?
-/// @param prefix Common prefix for paths, can be NULL
+/// @see expand_env
+///
+/// @param srcp Input string e.g. "$HOME/vim.hlp"
+/// @param dst[out] Where to put the result
+/// @param dstlen Maximum length of the result
+/// @param esc Escape spaces in expanded variables
+/// @param one `srcp` is a single filename
+/// @param prefix Start again after this (can be NULL)
void expand_env_esc(char_u *restrict srcp,
char_u *restrict dst,
int dstlen,
@@ -326,7 +361,7 @@ void expand_env_esc(char_u *restrict srcp,
} else if (src[1] == NUL // home directory
|| vim_ispathsep(src[1])
|| vim_strchr((char_u *)" ,\t\n", src[1]) != NULL) {
- var = homedir;
+ var = (char_u *)homedir;
tail = src + 1;
} else { // user directory
#if defined(UNIX)
@@ -341,11 +376,10 @@ void expand_env_esc(char_u *restrict srcp,
*var++ = *tail++;
}
*var = NUL;
- // Use os_get_user_directory() to get the user directory.
- // If this function fails, the shell is used to
- // expand ~user. This is slower and may fail if the shell
- // does not support ~user (old versions of /bin/sh).
- var = (char_u *)os_get_user_directory((char *)dst + 1);
+ // Get the user directory. If this fails the shell is used to expand
+ // ~user, which is slower and may fail on old versions of /bin/sh.
+ var = (*dst == NUL) ? NULL
+ : (char_u *)os_get_user_directory((char *)dst + 1);
mustfree = true;
if (var == NULL) {
expand_T xpc;
@@ -423,12 +457,15 @@ void expand_env_esc(char_u *restrict srcp,
} else if ((src[0] == ' ' || src[0] == ',') && !one) {
at_start = true;
}
- *dst++ = *src++;
- --dstlen;
+ if (dstlen > 0) {
+ *dst++ = *src++;
+ dstlen--;
- if (prefix != NULL && src - prefix_len >= srcp
- && STRNCMP(src - prefix_len, prefix, prefix_len) == 0) {
- at_start = true;
+ if (prefix != NULL
+ && src - prefix_len >= srcp
+ && STRNCMP(src - prefix_len, prefix, prefix_len) == 0) {
+ at_start = true;
+ }
}
}
}
@@ -490,10 +527,11 @@ static char *remove_tail(char *path, char *pend, char *dirname)
return pend;
}
-/// Iterate over colon-separated list
+/// Iterate over a delimited list.
///
/// @note Environment variables must not be modified during iteration.
///
+/// @param[in] delim Delimiter character.
/// @param[in] val Value of the environment variable to iterate over.
/// @param[in] iter Pointer used for iteration. Must be NULL on first
/// iteration.
@@ -502,18 +540,19 @@ static char *remove_tail(char *path, char *pend, char *dirname)
/// @param[out] len Location where current directory length should be saved.
///
/// @return Next iter argument value or NULL when iteration should stop.
-const void *vim_colon_env_iter(const char *const val,
- const void *const iter,
- const char **const dir,
- size_t *const len)
- FUNC_ATTR_NONNULL_ARG(1, 3, 4) FUNC_ATTR_WARN_UNUSED_RESULT
+const void *vim_env_iter(const char delim,
+ const char *const val,
+ const void *const iter,
+ const char **const dir,
+ size_t *const len)
+ FUNC_ATTR_NONNULL_ARG(2, 4, 5) FUNC_ATTR_WARN_UNUSED_RESULT
{
const char *varval = (const char *) iter;
if (varval == NULL) {
varval = val;
}
*dir = varval;
- const char *const dirend = strchr(varval, ':');
+ const char *const dirend = strchr(varval, delim);
if (dirend == NULL) {
*len = strlen(varval);
return NULL;
@@ -523,10 +562,11 @@ const void *vim_colon_env_iter(const char *const val,
}
}
-/// Iterate over colon-separated list in reverse order
+/// Iterate over a delimited list in reverse order.
///
/// @note Environment variables must not be modified during iteration.
///
+/// @param[in] delim Delimiter character.
/// @param[in] val Value of the environment variable to iterate over.
/// @param[in] iter Pointer used for iteration. Must be NULL on first
/// iteration.
@@ -535,18 +575,19 @@ const void *vim_colon_env_iter(const char *const val,
/// @param[out] len Location where current directory length should be saved.
///
/// @return Next iter argument value or NULL when iteration should stop.
-const void *vim_colon_env_iter_rev(const char *const val,
- const void *const iter,
- const char **const dir,
- size_t *const len)
- FUNC_ATTR_NONNULL_ARG(1, 3, 4) FUNC_ATTR_WARN_UNUSED_RESULT
+const void *vim_env_iter_rev(const char delim,
+ const char *const val,
+ const void *const iter,
+ const char **const dir,
+ size_t *const len)
+ FUNC_ATTR_NONNULL_ARG(2, 4, 5) FUNC_ATTR_WARN_UNUSED_RESULT
{
const char *varend = (const char *) iter;
if (varend == NULL) {
varend = val + strlen(val) - 1;
}
- const size_t varlen = (size_t) (varend - val) + 1;
- const char *const colon = xmemrchr(val, ':', varlen);
+ const size_t varlen = (size_t)(varend - val) + 1;
+ const char *const colon = xmemrchr(val, (uint8_t)delim, varlen);
if (colon == NULL) {
*len = varlen;
*dir = val;
@@ -561,15 +602,24 @@ const void *vim_colon_env_iter_rev(const char *const val,
/// Vim's version of getenv().
/// Special handling of $HOME, $VIM and $VIMRUNTIME, allowing the user to
/// override the vim runtime directory at runtime. Also does ACP to 'enc'
-/// conversion for Win32. Results must be freed by the calling function.
-/// @param name Name of environment variable to expand
+/// conversion for Win32. Result must be freed by the caller.
+/// @param name Environment variable to expand
char *vim_getenv(const char *name)
{
+ // init_path() should have been called before now.
+ assert(get_vim_var_str(VV_PROGPATH)[0] != NUL);
+
const char *kos_env_path = os_getenv(name);
if (kos_env_path != NULL) {
return xstrdup(kos_env_path);
}
+#ifdef WIN32
+ if (strcmp(name, "HOME") == 0) {
+ return xstrdup(homedir);
+ }
+#endif
+
bool vimruntime = (strcmp(name, "VIMRUNTIME") == 0);
if (!vimruntime && strcmp(name, "VIM") != 0) {
return NULL;
@@ -599,6 +649,24 @@ char *vim_getenv(const char *name)
if (p_hf != NULL && vim_strchr(p_hf, '$') == NULL) {
vim_path = (char *)p_hf;
}
+
+ char exe_name[MAXPATHL];
+ // Find runtime path relative to the nvim binary: ../share/nvim/runtime
+ if (vim_path == NULL) {
+ xstrlcpy(exe_name, (char *)get_vim_var_str(VV_PROGPATH),
+ sizeof(exe_name));
+ char *path_end = (char *)path_tail_with_sep((char_u *)exe_name);
+ *path_end = '\0'; // remove the trailing "nvim.exe"
+ path_end = (char *)path_tail((char_u *)exe_name);
+ *path_end = '\0'; // remove the trailing "bin/"
+ if (append_path(
+ exe_name,
+ "share" _PATHSEPSTR "nvim" _PATHSEPSTR "runtime" _PATHSEPSTR,
+ MAXPATHL) == OK) {
+ vim_path = exe_name; // -V507
+ }
+ }
+
if (vim_path != NULL) {
// remove the file name
char *vim_path_end = (char *)path_tail((char_u *)vim_path);
@@ -628,6 +696,7 @@ char *vim_getenv(const char *name)
vim_path = NULL;
}
}
+ assert(vim_path != exe_name);
}
#ifdef HAVE_PATHDEF
@@ -662,107 +731,128 @@ char *vim_getenv(const char *name)
/// Replace home directory by "~" in each space or comma separated file name in
/// 'src'.
+///
+/// Replace home directory with tilde in each file name
+///
/// If anything fails (except when out of space) dst equals src.
-/// @param buf When not NULL, check for help files
-/// @param src Input file name
-/// @param dst Where to put the result
-/// @param dstlen Maximum length of the result
-/// @param one If true, only replace one file name, including spaces and commas
-/// in the file name
-void home_replace(buf_T *buf, char_u *src, char_u *dst, int dstlen, bool one)
+///
+/// @param[in] buf When not NULL, uses this buffer to check whether it is
+/// a help file. If it is then path to file is removed
+/// completely, `one` is ignored and assumed to be true.
+/// @param[in] src Input file names. Assumed to be a space/comma separated
+/// list unless `one` is true.
+/// @param[out] dst Where to put the result.
+/// @param[in] dstlen Destination length.
+/// @param[in] one If true, assumes source is a single file name and not
+/// a list of them.
+///
+/// @return length of the string put into dst, does not include NUL byte.
+size_t home_replace(const buf_T *const buf, const char_u *src,
+ char_u *const dst, size_t dstlen, const bool one)
+ FUNC_ATTR_NONNULL_ARG(3)
{
- size_t dirlen = 0, envlen = 0;
- size_t len;
+ size_t dirlen = 0;
+ size_t envlen = 0;
if (src == NULL) {
*dst = NUL;
- return;
+ return 0;
}
- /*
- * If the file is a help file, remove the path completely.
- */
if (buf != NULL && buf->b_help) {
- STRCPY(dst, path_tail(src));
- return;
+ const size_t dlen = xstrlcpy((char *)dst, (char *)path_tail(src), dstlen);
+ return MIN(dlen, dstlen - 1);
}
- /*
- * We check both the value of the $HOME environment variable and the
- * "real" home directory.
- */
- if (homedir != NULL)
- dirlen = STRLEN(homedir);
+ // We check both the value of the $HOME environment variable and the
+ // "real" home directory.
+ if (homedir != NULL) {
+ dirlen = strlen(homedir);
+ }
- char_u *homedir_env = (char_u *)os_getenv("HOME");
+ const char *homedir_env = os_getenv("HOME");
+#ifdef WIN32
+ if (homedir_env == NULL) {
+ homedir_env = os_getenv("USERPROFILE");
+ }
+#endif
+ char *homedir_env_mod = (char *)homedir_env;
bool must_free = false;
- if (homedir_env != NULL && vim_strchr(homedir_env, '~') != NULL) {
+ if (homedir_env_mod != NULL && *homedir_env_mod == '~') {
must_free = true;
size_t usedlen = 0;
- size_t flen = STRLEN(homedir_env);
+ size_t flen = strlen(homedir_env_mod);
char_u *fbuf = NULL;
- (void)modify_fname((char_u *)":p", &usedlen, &homedir_env, &fbuf, &flen);
- flen = STRLEN(homedir_env);
- if (flen > 0 && vim_ispathsep(homedir_env[flen - 1]))
- /* Remove the trailing / that is added to a directory. */
- homedir_env[flen - 1] = NUL;
+ (void)modify_fname((char_u *)":p", &usedlen, (char_u **)&homedir_env_mod,
+ &fbuf, &flen);
+ flen = strlen(homedir_env_mod);
+ assert(homedir_env_mod != homedir_env);
+ if (vim_ispathsep(homedir_env_mod[flen - 1])) {
+ // Remove the trailing / that is added to a directory.
+ homedir_env_mod[flen - 1] = NUL;
+ }
}
- if (homedir_env != NULL)
- envlen = STRLEN(homedir_env);
+ if (homedir_env_mod != NULL) {
+ envlen = strlen(homedir_env_mod);
+ }
- if (!one)
+ if (!one) {
src = skipwhite(src);
+ }
+ char *dst_p = (char *)dst;
while (*src && dstlen > 0) {
- /*
- * Here we are at the beginning of a file name.
- * First, check to see if the beginning of the file name matches
- * $HOME or the "real" home directory. Check that there is a '/'
- * after the match (so that if e.g. the file is "/home/pieter/bla",
- * and the home directory is "/home/piet", the file does not end up
- * as "~er/bla" (which would seem to indicate the file "bla" in user
- * er's home directory)).
- */
- char_u *p = homedir;
- len = dirlen;
- for (;; ) {
- if ( len
- && fnamencmp(src, p, len) == 0
- && (vim_ispathsep(src[len])
- || (!one && (src[len] == ',' || src[len] == ' '))
- || src[len] == NUL)) {
+ // Here we are at the beginning of a file name.
+ // First, check to see if the beginning of the file name matches
+ // $HOME or the "real" home directory. Check that there is a '/'
+ // after the match (so that if e.g. the file is "/home/pieter/bla",
+ // and the home directory is "/home/piet", the file does not end up
+ // as "~er/bla" (which would seem to indicate the file "bla" in user
+ // er's home directory)).
+ char *p = homedir;
+ size_t len = dirlen;
+ for (;;) {
+ if (len
+ && fnamencmp(src, (char_u *)p, len) == 0
+ && (vim_ispathsep(src[len])
+ || (!one && (src[len] == ',' || src[len] == ' '))
+ || src[len] == NUL)) {
src += len;
- if (--dstlen > 0)
- *dst++ = '~';
-
- /*
- * If it's just the home directory, add "/".
- */
- if (!vim_ispathsep(src[0]) && --dstlen > 0)
- *dst++ = '/';
+ if (--dstlen > 0) {
+ *dst_p++ = '~';
+ }
+
+ // If it's just the home directory, add "/".
+ if (!vim_ispathsep(src[0]) && --dstlen > 0) {
+ *dst_p++ = '/';
+ }
break;
}
- if (p == homedir_env)
+ if (p == homedir_env_mod) {
break;
- p = homedir_env;
+ }
+ p = homedir_env_mod;
len = envlen;
}
- /* if (!one) skip to separator: space or comma */
- while (*src && (one || (*src != ',' && *src != ' ')) && --dstlen > 0)
- *dst++ = *src++;
- /* skip separator */
- while ((*src == ' ' || *src == ',') && --dstlen > 0)
- *dst++ = *src++;
+ // if (!one) skip to separator: space or comma.
+ while (*src && (one || (*src != ',' && *src != ' ')) && --dstlen > 0) {
+ *dst_p++ = (char)(*src++);
+ }
+ // Skip separator.
+ while ((*src == ' ' || *src == ',') && --dstlen > 0) {
+ *dst_p++ = (char)(*src++);
+ }
}
- /* if (dstlen == 0) out of space, what to do??? */
+ // If (dstlen == 0) out of space, what to do???
- *dst = NUL;
+ *dst_p = NUL;
if (must_free) {
- xfree(homedir_env);
+ xfree(homedir_env_mod);
}
+ return (size_t)(dst_p - (char *)dst);
}
/// Like home_replace, store the replaced string in allocated memory.
@@ -775,7 +865,7 @@ char_u * home_replace_save(buf_T *buf, char_u *src) FUNC_ATTR_NONNULL_RET
len += STRLEN(src);
}
char_u *dst = xmalloc(len);
- home_replace(buf, src, dst, (int)len, true);
+ home_replace(buf, src, dst, len, true);
return dst;
}
@@ -813,3 +903,61 @@ char_u *get_env_name(expand_T *xp, int idx)
return NULL;
}
+/// Appends the head of `fname` to $PATH and sets it in the environment.
+///
+/// @param fname Full path whose parent directory will be appended to $PATH.
+///
+/// @return true if `path` was appended-to
+bool os_setenv_append_path(const char *fname)
+ FUNC_ATTR_NONNULL_ALL
+{
+#ifdef WIN32
+// 8191 (plus NUL) is considered the practical maximum.
+# define MAX_ENVPATHLEN 8192
+#else
+// No prescribed maximum on unix.
+# define MAX_ENVPATHLEN INT_MAX
+#endif
+ if (!path_is_absolute((char_u *)fname)) {
+ internal_error("os_setenv_append_path()");
+ return false;
+ }
+ const char *tail = (char *)path_tail_with_sep((char_u *)fname);
+ size_t dirlen = (size_t)(tail - fname);
+ assert(tail >= fname && dirlen + 1 < sizeof(os_buf));
+ xstrlcpy(os_buf, fname, dirlen + 1);
+ const char *path = os_getenv("PATH");
+ const size_t pathlen = path ? strlen(path) : 0;
+ const size_t newlen = pathlen + dirlen + 2;
+ if (newlen < MAX_ENVPATHLEN) {
+ char *temp = xmalloc(newlen);
+ if (pathlen == 0) {
+ temp[0] = NUL;
+ } else {
+ xstrlcpy(temp, path, newlen);
+ xstrlcat(temp, ENV_SEPSTR, newlen);
+ }
+ xstrlcat(temp, os_buf, newlen);
+ os_setenv("PATH", temp, 1);
+ xfree(temp);
+ return true;
+ }
+ return false;
+}
+
+/// Returns true if `sh` looks like it resolves to "cmd.exe".
+bool os_shell_is_cmdexe(const char *sh)
+ FUNC_ATTR_NONNULL_ALL
+{
+ if (*sh == NUL) {
+ return false;
+ }
+ if (striequal(sh, "$COMSPEC")) {
+ const char *comspec = os_getenv("COMSPEC");
+ return striequal("cmd.exe", (char *)path_tail((char_u *)comspec));
+ }
+ if (striequal(sh, "cmd.exe") || striequal(sh, "cmd")) {
+ return true;
+ }
+ return striequal("cmd.exe", (char *)path_tail((char_u *)sh));
+}
diff --git a/src/nvim/os/fileio.c b/src/nvim/os/fileio.c
index 6cee102305..ccf35fd57c 100644
--- a/src/nvim/os/fileio.c
+++ b/src/nvim/os/fileio.c
@@ -1,10 +1,12 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/// @file fileio.c
///
/// Buffered reading/writing to a file. Unlike fileio.c this is not dealing with
-/// Neovim stuctures for buffer, with autocommands, etc: just fopen/fread/fwrite
+/// Nvim stuctures for buffer, with autocommands, etc: just fopen/fread/fwrite
/// replacement.
-#include <unistd.h>
#include <assert.h>
#include <stddef.h>
#include <stdbool.h>
@@ -24,6 +26,7 @@
#include "nvim/globals.h"
#include "nvim/rbuffer.h"
#include "nvim/macros.h"
+#include "nvim/message.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "os/fileio.c.generated.h"
@@ -36,18 +39,18 @@
/// @param[in] fname File name to open.
/// @param[in] flags Flags, @see FileOpenFlags. Currently reading from and
/// writing to the file at once is not supported, so either
-/// FILE_WRITE_ONLY or FILE_READ_ONLY is required.
+/// kFileWriteOnly or kFileReadOnly is required.
/// @param[in] mode Permissions for the newly created file (ignored if flags
-/// does not have FILE_CREATE\*).
+/// does not have kFileCreate\*).
///
-/// @return Error code (@see os_strerror()) or 0.
+/// @return Error code, or 0 on success. @see os_strerror()
int file_open(FileDescriptor *const ret_fp, const char *const fname,
const int flags, const int mode)
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
{
int os_open_flags = 0;
- int fd;
TriState wr = kNone;
+ // -V:FLAG:501
#define FLAG(flags, flag, fcntl_flags, wrval, cond) \
do { \
if (flags & flag) { \
@@ -63,19 +66,51 @@ int file_open(FileDescriptor *const ret_fp, const char *const fname,
FLAG(flags, kFileCreate, O_CREAT|O_WRONLY, kTrue, !(flags & kFileCreateOnly));
FLAG(flags, kFileTruncate, O_TRUNC|O_WRONLY, kTrue,
!(flags & kFileCreateOnly));
+ FLAG(flags, kFileAppend, O_APPEND|O_WRONLY, kTrue,
+ !(flags & kFileCreateOnly));
FLAG(flags, kFileReadOnly, O_RDONLY, kFalse, wr != kTrue);
#ifdef O_NOFOLLOW
FLAG(flags, kFileNoSymlink, O_NOFOLLOW, kNone, true);
#endif
#undef FLAG
+ // wr is used for kFileReadOnly flag, but on
+ // QB:neovim-qb-slave-ubuntu-12-04-64bit it still errors out with
+ // `error: variable โ€˜wrโ€™ set but not used [-Werror=unused-but-set-variable]`
+ (void)wr;
- fd = os_open(fname, os_open_flags, mode);
+ const int fd = os_open(fname, os_open_flags, mode);
if (fd < 0) {
return fd;
}
+ return file_open_fd(ret_fp, fd, flags);
+}
- ret_fp->wr = (wr == kTrue);
+/// Wrap file descriptor with FileDescriptor structure
+///
+/// @warning File descriptor wrapped like this must not be accessed by other
+/// means.
+///
+/// @param[out] ret_fp Address where information needed for reading from or
+/// writing to a file is saved
+/// @param[in] fd File descriptor to wrap.
+/// @param[in] flags Flags, @see FileOpenFlags. Currently reading from and
+/// writing to the file at once is not supported, so either
+/// FILE_WRITE_ONLY or FILE_READ_ONLY is required.
+///
+/// @return Error code (@see os_strerror()) or 0. Currently always returns 0.
+int file_open_fd(FileDescriptor *const ret_fp, const int fd,
+ const int flags)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ ret_fp->wr = !!(flags & (kFileCreate
+ |kFileCreateOnly
+ |kFileTruncate
+ |kFileAppend
+ |kFileWriteOnly));
+ ret_fp->non_blocking = !!(flags & kFileNonBlocking);
+ // Non-blocking writes not supported currently.
+ assert(!ret_fp->wr || !ret_fp->non_blocking);
ret_fp->fd = fd;
ret_fp->eof = false;
ret_fp->rv = rbuffer_new(kRWBufferSize);
@@ -89,17 +124,16 @@ int file_open(FileDescriptor *const ret_fp, const char *const fname,
/// Like file_open(), but allocate and return ret_fp
///
-/// @param[out] error Error code, @see os_strerror(). Is set to zero on
-/// success.
+/// @param[out] error Error code, or 0 on success. @see os_strerror()
/// @param[in] fname File name to open.
/// @param[in] flags Flags, @see FileOpenFlags.
/// @param[in] mode Permissions for the newly created file (ignored if flags
-/// does not have FILE_CREATE\*).
+/// does not have kFileCreate\*).
///
/// @return [allocated] Opened file or NULL in case of error.
FileDescriptor *file_open_new(int *const error, const char *const fname,
const int flags, const int mode)
- FUNC_ATTR_NONNULL_ALL FUNC_ATTR_MALLOC FUNC_ATTR_WARN_UNUSED_RESULT
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
{
FileDescriptor *const fp = xmalloc(sizeof(*fp));
if ((*error = file_open(fp, fname, flags, mode)) != 0) {
@@ -109,30 +143,55 @@ FileDescriptor *file_open_new(int *const error, const char *const fname,
return fp;
}
+/// Like file_open_fd(), but allocate and return ret_fp
+///
+/// @param[out] error Error code, or 0 on success. @see os_strerror()
+/// @param[in] fd File descriptor to wrap.
+/// @param[in] flags Flags, @see FileOpenFlags.
+/// @param[in] mode Permissions for the newly created file (ignored if flags
+/// does not have FILE_CREATE\*).
+///
+/// @return [allocated] Opened file or NULL in case of error.
+FileDescriptor *file_open_fd_new(int *const error, const int fd,
+ const int flags)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_MALLOC FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ FileDescriptor *const fp = xmalloc(sizeof(*fp));
+ if ((*error = file_open_fd(fp, fd, flags)) != 0) {
+ xfree(fp);
+ return NULL;
+ }
+ return fp;
+}
+
/// Close file and free its buffer
///
/// @param[in,out] fp File to close.
+/// @param[in] do_fsync If true, use fsync() to write changes to disk.
///
/// @return 0 or error code.
-int file_close(FileDescriptor *const fp) FUNC_ATTR_NONNULL_ALL
+int file_close(FileDescriptor *const fp, const bool do_fsync)
+ FUNC_ATTR_NONNULL_ALL
{
- const int error = file_fsync(fp);
- const int error2 = os_close(fp->fd);
+ const int flush_error = (do_fsync ? file_fsync(fp) : file_flush(fp));
+ const int close_error = os_close(fp->fd);
rbuffer_free(fp->rv);
- if (error2 != 0) {
- return error2;
+ if (close_error != 0) {
+ return close_error;
}
- return error;
+ return flush_error;
}
/// Close and free file obtained using file_open_new()
///
/// @param[in,out] fp File to close.
+/// @param[in] do_fsync If true, use fsync() to write changes to disk.
///
/// @return 0 or error code.
-int file_free(FileDescriptor *const fp) FUNC_ATTR_NONNULL_ALL
+int file_free(FileDescriptor *const fp, const bool do_fsync)
+ FUNC_ATTR_NONNULL_ALL
{
- const int ret = file_close(fp);
+ const int ret = file_close(fp, do_fsync);
xfree(fp);
return ret;
}
@@ -142,19 +201,38 @@ int file_free(FileDescriptor *const fp) FUNC_ATTR_NONNULL_ALL
/// @param[in,out] fp File to work with.
///
/// @return 0 or error code.
-int file_fsync(FileDescriptor *const fp)
+int file_flush(FileDescriptor *const fp)
FUNC_ATTR_NONNULL_ALL
{
if (!fp->wr) {
return 0;
}
file_rb_write_full_cb(fp->rv, fp);
- if (fp->_error != 0) {
- const int error = fp->_error;
- fp->_error = 0;
- return error;
+ const int error = fp->_error;
+ fp->_error = 0;
+ return error;
+}
+
+/// Flush file modifications to disk and run fsync()
+///
+/// @param[in,out] fp File to work with.
+///
+/// @return 0 or error code.
+int file_fsync(FileDescriptor *const fp)
+ FUNC_ATTR_NONNULL_ALL
+{
+ if (!fp->wr) {
+ return 0;
+ }
+ const int flush_error = file_flush(fp);
+ if (flush_error != 0) {
+ return flush_error;
+ }
+ const int fsync_error = os_fsync(fp->fd);
+ if (fsync_error != UV_EINVAL && fsync_error != UV_EROFS) {
+ return fsync_error;
}
- return os_fsync(fp->fd);
+ return 0;
}
/// Buffer used for writing
@@ -177,7 +255,8 @@ static void file_rb_write_full_cb(RBuffer *const rv, FileDescriptor *const fp)
return;
}
const size_t read_bytes = rbuffer_read(rv, writebuf, kRWBufferSize);
- const ptrdiff_t wres = os_write(fp->fd, writebuf, read_bytes);
+ const ptrdiff_t wres = os_write(fp->fd, writebuf, read_bytes,
+ fp->non_blocking);
if (wres != (ptrdiff_t)read_bytes) {
if (wres >= 0) {
fp->_error = UV_EIO;
@@ -203,6 +282,7 @@ ptrdiff_t file_read(FileDescriptor *const fp, char *const ret_buf,
char *buf = ret_buf;
size_t read_remaining = size;
RBuffer *const rv = fp->rv;
+ bool called_read = false;
while (read_remaining) {
const size_t rv_size = rbuffer_size(rv);
if (rv_size > 0) {
@@ -210,7 +290,9 @@ ptrdiff_t file_read(FileDescriptor *const fp, char *const ret_buf,
buf += rsize;
read_remaining -= rsize;
}
- if (fp->eof) {
+ if (fp->eof
+ // Allow only at most one os_read[v] call.
+ || (called_read && fp->non_blocking)) {
break;
}
if (read_remaining) {
@@ -227,7 +309,7 @@ ptrdiff_t file_read(FileDescriptor *const fp, char *const ret_buf,
};
assert(write_count == kRWBufferSize);
const ptrdiff_t r_ret = os_readv(fp->fd, &fp->eof, iov,
- ARRAY_SIZE(iov));
+ ARRAY_SIZE(iov), fp->non_blocking);
if (r_ret > 0) {
if (r_ret > (ptrdiff_t)read_remaining) {
rbuffer_produced(rv, (size_t)(r_ret - (ptrdiff_t)read_remaining));
@@ -243,7 +325,8 @@ ptrdiff_t file_read(FileDescriptor *const fp, char *const ret_buf,
if (read_remaining >= kRWBufferSize) {
// โ€ฆotherwise leave RBuffer empty and populate only target buffer,
// because filtering information through rbuffer will be more syscalls.
- const ptrdiff_t r_ret = os_read(fp->fd, &fp->eof, buf, read_remaining);
+ const ptrdiff_t r_ret = os_read(fp->fd, &fp->eof, buf, read_remaining,
+ fp->non_blocking);
if (r_ret >= 0) {
read_remaining -= (size_t)r_ret;
return (ptrdiff_t)(size - read_remaining);
@@ -254,7 +337,7 @@ ptrdiff_t file_read(FileDescriptor *const fp, char *const ret_buf,
size_t write_count;
const ptrdiff_t r_ret = os_read(fp->fd, &fp->eof,
rbuffer_write_ptr(rv, &write_count),
- kRWBufferSize);
+ kRWBufferSize, fp->non_blocking);
assert(write_count == kRWBufferSize);
if (r_ret > 0) {
rbuffer_produced(rv, (size_t)r_ret);
@@ -263,6 +346,7 @@ ptrdiff_t file_read(FileDescriptor *const fp, char *const ret_buf,
}
}
#endif
+ called_read = true;
}
}
return (ptrdiff_t)(size - read_remaining);
@@ -317,3 +401,32 @@ ptrdiff_t file_skip(FileDescriptor *const fp, const size_t size)
return (ptrdiff_t)read_bytes;
}
+
+/// Msgpack callback for writing to a file
+///
+/// @param data File to write to.
+/// @param[in] buf Data to write.
+/// @param[in] len Length of the data to write.
+///
+/// @return 0 in case of success, -1 in case of error.
+int msgpack_file_write(void *data, const char *buf, size_t len)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ assert(len < PTRDIFF_MAX);
+ const ptrdiff_t written_bytes = file_write((FileDescriptor *)data, buf, len);
+ if (written_bytes < 0) {
+ return msgpack_file_write_error((int)written_bytes);
+ }
+ return 0;
+}
+
+/// Print error which occurs when failing to write msgpack data
+///
+/// @param[in] error Error code of the error to print.
+///
+/// @return -1 (error return for msgpack_packer callbacks).
+int msgpack_file_write_error(const int error)
+{
+ emsgf(_("E5420: Failed to write to file: %s"), os_strerror(error));
+ return -1;
+}
diff --git a/src/nvim/os/fileio.h b/src/nvim/os/fileio.h
index 2cffd5c851..7c53cd4f07 100644
--- a/src/nvim/os/fileio.h
+++ b/src/nvim/os/fileio.h
@@ -14,6 +14,7 @@ typedef struct {
RBuffer *rv; ///< Read or write buffer.
bool wr; ///< True if file is in write mode.
bool eof; ///< True if end of file was encountered.
+ bool non_blocking; ///< True if EAGAIN should not restart syscalls.
} FileDescriptor;
/// file_open() flags
@@ -30,6 +31,10 @@ typedef enum {
kFileTruncate = 32, ///< Truncate the file if it exists.
///< Implies kFileWriteOnly. Cannot be used with
///< kFileCreateOnly.
+ kFileAppend = 64, ///< Append to the file. Implies kFileWriteOnly. Cannot
+ ///< be used with kFileCreateOnly.
+ kFileNonBlocking = 128, ///< Do not restart read() or write() syscall if
+ ///< EAGAIN was encountered.
} FileOpenFlags;
static inline bool file_eof(const FileDescriptor *const fp)
diff --git a/src/nvim/os/fs.c b/src/nvim/os/fs.c
index d12d34d595..9a4391a0ae 100644
--- a/src/nvim/os/fs.c
+++ b/src/nvim/os/fs.c
@@ -1,9 +1,11 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
// fs.c -- filesystem access
#include <stdbool.h>
#include <stddef.h>
#include <assert.h>
#include <limits.h>
-#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
@@ -22,10 +24,13 @@
#include "nvim/message.h"
#include "nvim/assert.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/path.h"
#include "nvim/strings.h"
+#ifdef WIN32
+#include "nvim/mbyte.h" // for utf8_to_utf16, utf16_to_utf8
+#endif
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "os/fs.c.generated.h"
#endif
@@ -56,9 +61,9 @@ void fs_init(void)
}
-/// Change to the given directory.
+/// Changes the current directory to `path`.
///
-/// @return `0` on success, a libuv error code on failure.
+/// @return 0 on success, or negative error code.
int os_chdir(const char *path)
FUNC_ATTR_NONNULL_ALL
{
@@ -89,11 +94,11 @@ int os_dirname(char_u *buf, size_t len)
/// Check if the given path is a directory and not a symlink to a directory.
/// @return `true` if `name` is a directory and NOT a symlink to a directory.
/// `false` if `name` is not a directory or if an error occurred.
-bool os_isrealdir(const char_u *name)
+bool os_isrealdir(const char *name)
FUNC_ATTR_NONNULL_ALL
{
uv_fs_t request;
- if (uv_fs_lstat(&fs_loop, &request, (char *)name, NULL) != kLibuvSuccess) {
+ if (uv_fs_lstat(&fs_loop, &request, name, NULL) != kLibuvSuccess) {
return false;
}
if (S_ISLNK(request.statbuf.st_mode)) {
@@ -105,11 +110,11 @@ bool os_isrealdir(const char_u *name)
/// Check if the given path is a directory or not.
///
-/// @return `true` if `fname` is a directory.
+/// @return `true` if `name` is a directory.
bool os_isdir(const char_u *name)
FUNC_ATTR_NONNULL_ALL
{
- int32_t mode = os_getperm(name);
+ int32_t mode = os_getperm((const char *)name);
if (mode < 0) {
return false;
}
@@ -121,28 +126,38 @@ bool os_isdir(const char_u *name)
return true;
}
+/// Check if the given path is a directory and is executable.
+/// Gives the same results as `os_isdir()` on Windows.
+///
+/// @return `true` if `name` is a directory and executable.
+bool os_isdir_executable(const char *name)
+ FUNC_ATTR_NONNULL_ALL
+{
+ int32_t mode = os_getperm((const char *)name);
+ if (mode < 0) {
+ return false;
+ }
+
+#ifdef WIN32
+ return (S_ISDIR(mode));
+#else
+ return (S_ISDIR(mode) && (S_IXUSR & mode));
+#endif
+}
+
/// Check what `name` is:
/// @return NODE_NORMAL: file or directory (or doesn't exist)
/// NODE_WRITABLE: writable device, socket, fifo, etc.
/// NODE_OTHER: non-writable things
int os_nodetype(const char *name)
+ FUNC_ATTR_NONNULL_ALL
{
-#ifdef WIN32
- // Edge case from Vim os_win32.c:
- // We can't open a file with a name "\\.\con" or "\\.\prn", trying to read
- // from it later will cause Vim to hang. Thus return NODE_WRITABLE here.
- if (STRNCMP(name, "\\\\.\\", 4) == 0) {
- return NODE_WRITABLE;
- }
-#endif
-
+#ifndef WIN32 // Unix
uv_stat_t statbuf;
if (0 != os_stat(name, &statbuf)) {
return NODE_NORMAL; // File doesn't exist.
}
-
-#ifndef WIN32
- // libuv does not handle BLK and DIR in uv_handle_type.
+ // uv_handle_type does not distinguish BLK and DIR.
// Related: https://github.com/joyent/libuv/pull/1421
if (S_ISREG(statbuf.st_mode) || S_ISDIR(statbuf.st_mode)) {
return NODE_NORMAL;
@@ -150,40 +165,65 @@ int os_nodetype(const char *name)
if (S_ISBLK(statbuf.st_mode)) { // block device isn't writable
return NODE_OTHER;
}
-#endif
+ // Everything else is writable?
+ // buf_write() expects NODE_WRITABLE for char device /dev/stderr.
+ return NODE_WRITABLE;
+#else // Windows
+ // Edge case from Vim os_win32.c:
+ // We can't open a file with a name "\\.\con" or "\\.\prn", trying to read
+ // from it later will cause Vim to hang. Thus return NODE_WRITABLE here.
+ if (STRNCMP(name, "\\\\.\\", 4) == 0) {
+ return NODE_WRITABLE;
+ }
- // Vim os_win32.c:mch_nodetype does this (since patch 7.4.015):
- // if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) {
- // wn = enc_to_utf16(name, NULL);
- // hFile = CreatFile(wn, ...)
- // to get a HANDLE. But libuv just calls win32's _get_osfhandle() on the fd we
- // give it. uv_fs_open calls fs__capture_path which does a similar dance and
- // saves us the hassle.
-
- int nodetype = NODE_WRITABLE;
- int fd = os_open(name, O_RDONLY, 0);
- switch(uv_guess_handle(fd)) {
- case UV_TTY: // FILE_TYPE_CHAR
- nodetype = NODE_WRITABLE;
- break;
- case UV_FILE: // FILE_TYPE_DISK
- nodetype = NODE_NORMAL;
- break;
- case UV_NAMED_PIPE: // not handled explicitly in Vim os_win32.c
- case UV_UDP: // unix only
- case UV_TCP: // unix only
+ // Vim os_win32.c:mch_nodetype does (since 7.4.015):
+ // wn = enc_to_utf16(name, NULL);
+ // hFile = CreatFile(wn, ...)
+ // to get a HANDLE. Whereas libuv just calls _get_osfhandle() on the fd we
+ // give it. But uv_fs_open later calls fs__capture_path which does a similar
+ // utf8-to-utf16 dance and saves us the hassle.
+
+ // macOS: os_open(/dev/stderr) would return UV_EACCES.
+ int fd = os_open(name, O_RDONLY
+# ifdef O_NONBLOCK
+ | O_NONBLOCK
+# endif
+ , 0);
+ if (fd < 0) { // open() failed.
+ return NODE_NORMAL;
+ }
+ int guess = uv_guess_handle(fd);
+ if (close(fd) == -1) {
+ ELOG("close(%d) failed. name='%s'", fd, name);
+ }
+
+ switch (guess) {
+ case UV_TTY: // FILE_TYPE_CHAR
+ return NODE_WRITABLE;
+ case UV_FILE: // FILE_TYPE_DISK
+ return NODE_NORMAL;
+ case UV_NAMED_PIPE: // not handled explicitly in Vim os_win32.c
+ case UV_UDP: // unix only
+ case UV_TCP: // unix only
case UV_UNKNOWN_HANDLE:
default:
-#ifdef WIN32
- nodetype = NODE_NORMAL;
-#else
- nodetype = NODE_WRITABLE; // Everything else is writable?
-#endif
- break;
+ return NODE_OTHER; // Vim os_win32.c default
}
+#endif
+}
- close(fd);
- return nodetype;
+/// Gets the absolute path of the currently running executable.
+/// May fail if procfs is missing. #6734
+/// @see path_exepath
+///
+/// @param[out] buffer Full path to the executable.
+/// @param[in] size Size of `buffer`.
+///
+/// @return 0 on success, or libuv error code.
+int os_exepath(char *buffer, size_t *size)
+ FUNC_ATTR_NONNULL_ALL
+{
+ return uv_exepath(buffer, size);
}
/// Checks if the given path represents an executable file.
@@ -201,49 +241,87 @@ int os_nodetype(const char *name)
bool os_can_exe(const char_u *name, char_u **abspath, bool use_path)
FUNC_ATTR_NONNULL_ARG(1)
{
- // when use_path is false or if it's an absolute or relative path don't
- // need to use $PATH.
- if (!use_path || path_is_absolute_path(name)
- || (name[0] == '.'
- && (name[1] == '/'
- || (name[1] == '.' && name[2] == '/')))) {
- // There must be a path separator, files in the current directory
- // can't be executed
- if (gettail_dir(name) != name && is_executable(name)) {
+ bool no_path = !use_path || path_is_absolute(name);
+#ifndef WIN32
+ // If the filename is "qualified" (relative or absolute) do not check $PATH.
+ no_path |= (name[0] == '.'
+ && (name[1] == '/' || (name[1] == '.' && name[2] == '/')));
+#endif
+
+ if (no_path) {
+#ifdef WIN32
+ const char *pathext = os_getenv("PATHEXT");
+ if (!pathext) {
+ pathext = ".com;.exe;.bat;.cmd";
+ }
+ bool ok = is_executable((char *)name) || is_executable_ext((char *)name,
+ pathext);
+#else
+ // Must have path separator, cannot execute files in the current directory.
+ const bool ok = ((const char_u *)gettail_dir((const char *)name) != name
+ && is_executable((char *)name));
+#endif
+ if (ok) {
if (abspath != NULL) {
- *abspath = save_absolute_path(name);
+ *abspath = save_abs_path(name);
}
-
return true;
}
-
return false;
}
return is_executable_in_path(name, abspath);
}
-// Return true if "name" is an executable file, false if not or it doesn't
-// exist.
-static bool is_executable(const char_u *name)
+/// Returns true if `name` is an executable file.
+static bool is_executable(const char *name)
FUNC_ATTR_NONNULL_ALL
{
- int32_t mode = os_getperm(name);
+ int32_t mode = os_getperm((const char *)name);
if (mode < 0) {
return false;
}
-#if WIN32
+#ifdef WIN32
// Windows does not have exec bit; just check if the file exists and is not
// a directory.
return (S_ISREG(mode));
#else
return (S_ISREG(mode) && (S_IXUSR & mode));
#endif
+}
+
+#ifdef WIN32
+/// Appends file extensions from `pathext` to `name` and returns true if any
+/// such combination is executable.
+static bool is_executable_ext(char *name, const char *pathext)
+ FUNC_ATTR_NONNULL_ALL
+{
+ xstrlcpy(os_buf, name, sizeof(os_buf));
+ char *buf_end = xstrchrnul(os_buf, '\0');
+ for (const char *ext = pathext; *ext; ext++) {
+ // Skip the extension if there is no suffix after a '.'.
+ if (ext[0] == '.' && (ext[1] == '\0' || ext[1] == ENV_SEPCHAR)) {
+ ext++;
+ continue;
+ }
+
+ const char *ext_end = xstrchrnul(ext, ENV_SEPCHAR);
+ STRLCPY(buf_end, ext, ext_end - ext + 1);
+ if (is_executable(os_buf)) {
+ return true;
+ }
+
+ if (*ext_end != ENV_SEPCHAR) {
+ break;
+ }
+ ext = ext_end;
+ }
return false;
}
+#endif
/// Checks if a file is inside the `$PATH` and is executable.
///
@@ -254,89 +332,69 @@ static bool is_executable(const char_u *name)
static bool is_executable_in_path(const char_u *name, char_u **abspath)
FUNC_ATTR_NONNULL_ARG(1)
{
- const char *path = os_getenv("PATH");
- if (path == NULL) {
+ const char *path_env = os_getenv("PATH");
+ if (path_env == NULL) {
return false;
}
- size_t buf_len = STRLEN(name) + STRLEN(path) + 2;
+#ifdef WIN32
+ // Prepend ".;" to $PATH.
+ size_t pathlen = strlen(path_env);
+ char *path = memcpy(xmallocz(pathlen + 3), "." ENV_SEPSTR, 2);
+ memcpy(path + 2, path_env, pathlen);
+#else
+ char *path = xstrdup(path_env);
+#endif
+
+ size_t buf_len = STRLEN(name) + strlen(path) + 2;
#ifdef WIN32
const char *pathext = os_getenv("PATHEXT");
if (!pathext) {
pathext = ".com;.exe;.bat;.cmd";
}
-
- buf_len += STRLEN(pathext);
+ buf_len += strlen(pathext);
#endif
- char_u *buf = xmalloc(buf_len);
+ char *buf = xmalloc(buf_len);
// Walk through all entries in $PATH to check if "name" exists there and
// is an executable file.
+ char *p = path;
+ bool rv = false;
for (;; ) {
- const char *e = xstrchrnul(path, ENV_SEPCHAR);
-
- // Glue together the given directory from $PATH with name and save into
- // buf.
- STRLCPY(buf, path, e - path + 1);
- append_path((char *) buf, (const char *) name, buf_len);
-
- if (is_executable(buf)) {
- // Check if the caller asked for a copy of the path.
- if (abspath != NULL) {
- *abspath = save_absolute_path(buf);
- }
+ char *e = xstrchrnul(p, ENV_SEPCHAR);
- xfree(buf);
-
- return true;
- }
+ // Combine the $PATH segment with `name`.
+ STRLCPY(buf, p, e - p + 1);
+ append_path(buf, (char *)name, buf_len);
#ifdef WIN32
- // Try appending file extensions from $PATHEXT to the name.
- char *buf_end = xstrchrnul((char *)buf, '\0');
- for (const char *ext = pathext; *ext; ext++) {
- // Skip the extension if there is no suffix after a '.'.
- if (ext[0] == '.' && (ext[1] == '\0' || ext[1] == ';')) {
- *ext++;
-
- continue;
- }
-
- const char *ext_end = xstrchrnul(ext, ENV_SEPCHAR);
- STRLCPY(buf_end, ext, ext_end - ext + 1);
-
- if (is_executable(buf)) {
- // Check if the caller asked for a copy of the path.
- if (abspath != NULL) {
- *abspath = save_absolute_path(buf);
- }
-
- xfree(buf);
-
- return true;
+ bool ok = is_executable(buf) || is_executable_ext(buf, pathext);
+#else
+ bool ok = is_executable(buf);
+#endif
+ if (ok) {
+ if (abspath != NULL) { // Caller asked for a copy of the path.
+ *abspath = save_abs_path((char_u *)buf);
}
- if (*ext_end != ENV_SEPCHAR) {
- break;
- }
- ext = ext_end;
+ rv = true;
+ goto end;
}
-#endif
if (*e != ENV_SEPCHAR) {
// End of $PATH without finding any executable called name.
- xfree(buf);
- return false;
+ goto end;
}
- path = e + 1;
+ p = e + 1;
}
- // We should never get to this point.
- assert(false);
- return false;
+end:
+ xfree(buf);
+ xfree(path);
+ return rv;
}
/// Opens or creates a file and returns a non-negative integer representing
@@ -348,14 +406,45 @@ static bool is_executable_in_path(const char_u *name, char_u **abspath)
/// @param mode Permissions for the newly-created file (IGNORED if 'flags' is
/// not `O_CREAT` or `O_TMPFILE`), subject to the current umask
/// @return file descriptor, or libuv error code on failure
-int os_open(const char* path, int flags, int mode)
- FUNC_ATTR_NONNULL_ALL
+int os_open(const char *path, int flags, int mode)
{
+ if (path == NULL) { // uv_fs_open asserts on NULL. #7561
+ return UV_EINVAL;
+ }
int r;
RUN_UV_FS_FUNC(r, uv_fs_open, path, flags, mode, NULL);
return r;
}
+/// Sets file descriptor `fd` to close-on-exec.
+//
+// @return -1 if failed to set, 0 otherwise.
+int os_set_cloexec(const int fd)
+{
+#ifdef HAVE_FD_CLOEXEC
+ int e;
+ int fdflags = fcntl(fd, F_GETFD);
+ if (fdflags < 0) {
+ e = errno;
+ ELOG("Failed to get flags on descriptor %d: %s", fd, strerror(e));
+ errno = e;
+ return -1;
+ }
+ if ((fdflags & FD_CLOEXEC) == 0
+ && fcntl(fd, F_SETFD, fdflags | FD_CLOEXEC) == -1) {
+ e = errno;
+ ELOG("Failed to set CLOEXEC on descriptor %d: %s", fd, strerror(e));
+ errno = e;
+ return -1;
+ }
+ return 0;
+#endif
+
+ // No FD_CLOEXEC flag. On Windows, the file should have been opened with
+ // O_NOINHERIT anyway.
+ return -1;
+}
+
/// Close a file
///
/// @return 0 or libuv error code on failure.
@@ -366,6 +455,29 @@ int os_close(const int fd)
return r;
}
+/// Duplicate file descriptor
+///
+/// @param[in] fd File descriptor to duplicate.
+///
+/// @return New file descriptor or libuv error code (< 0).
+int os_dup(const int fd)
+ FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ int ret;
+os_dup_dup:
+ ret = dup(fd);
+ if (ret < 0) {
+ const int error = os_translate_sys_error(errno);
+ errno = 0;
+ if (error == UV_EINTR) {
+ goto os_dup_dup;
+ } else {
+ return error;
+ }
+ }
+ return ret;
+}
+
/// Read from a file
///
/// Handles EINTR and ENOMEM, but not other errors.
@@ -375,10 +487,11 @@ int os_close(const int fd)
/// to false. Initial value is ignored.
/// @param[out] ret_buf Buffer to write to. May be NULL if size is zero.
/// @param[in] size Amount of bytes to read.
+/// @param[in] non_blocking Do not restart syscall if EAGAIN was encountered.
///
/// @return Number of bytes read or libuv error code (< 0).
-ptrdiff_t os_read(const int fd, bool *ret_eof, char *const ret_buf,
- const size_t size)
+ptrdiff_t os_read(const int fd, bool *const ret_eof, char *const ret_buf,
+ const size_t size, const bool non_blocking)
FUNC_ATTR_WARN_UNUSED_RESULT
{
*ret_eof = false;
@@ -389,23 +502,18 @@ ptrdiff_t os_read(const int fd, bool *ret_eof, char *const ret_buf,
size_t read_bytes = 0;
bool did_try_to_free = false;
while (read_bytes != size) {
+ assert(size >= read_bytes);
const ptrdiff_t cur_read_bytes = read(fd, ret_buf + read_bytes,
- size - read_bytes);
+ IO_COUNT(size - read_bytes));
if (cur_read_bytes > 0) {
read_bytes += (size_t)cur_read_bytes;
- assert(read_bytes <= size);
}
if (cur_read_bytes < 0) {
-#ifdef HAVE_UV_TRANSLATE_SYS_ERROR
- const int error = uv_translate_sys_error(errno);
-#else
- const int error = -errno;
- STATIC_ASSERT(-EINTR == UV_EINTR, "Need to translate error codes");
- STATIC_ASSERT(-EAGAIN == UV_EAGAIN, "Need to translate error codes");
- STATIC_ASSERT(-ENOMEM == UV_ENOMEM, "Need to translate error codes");
-#endif
+ const int error = os_translate_sys_error(errno);
errno = 0;
- if (error == UV_EINTR || error == UV_EAGAIN) {
+ if (non_blocking && error == UV_EAGAIN) {
+ break;
+ } else if (error == UV_EINTR || error == UV_EAGAIN) {
continue;
} else if (error == UV_ENOMEM && !did_try_to_free) {
try_to_free_memory();
@@ -435,7 +543,11 @@ ptrdiff_t os_read(const int fd, bool *ret_eof, char *const ret_buf,
/// may change, it is incorrect to use data it points to after
/// os_readv().
/// @param[in] iov_size Number of buffers in iov.
-ptrdiff_t os_readv(int fd, bool *ret_eof, struct iovec *iov, size_t iov_size)
+/// @param[in] non_blocking Do not restart syscall if EAGAIN was encountered.
+///
+/// @return Number of bytes read or libuv error code (< 0).
+ptrdiff_t os_readv(const int fd, bool *const ret_eof, struct iovec *iov,
+ size_t iov_size, const bool non_blocking)
FUNC_ATTR_NONNULL_ALL
{
*ret_eof = false;
@@ -449,7 +561,7 @@ ptrdiff_t os_readv(int fd, bool *ret_eof, struct iovec *iov, size_t iov_size)
}
while (read_bytes < toread && iov_size && !*ret_eof) {
ptrdiff_t cur_read_bytes = readv(fd, iov, (int)iov_size);
- if (toread && cur_read_bytes == 0) {
+ if (cur_read_bytes == 0) {
*ret_eof = true;
}
if (cur_read_bytes > 0) {
@@ -466,16 +578,11 @@ ptrdiff_t os_readv(int fd, bool *ret_eof, struct iovec *iov, size_t iov_size)
}
}
} else if (cur_read_bytes < 0) {
-#ifdef HAVE_UV_TRANSLATE_SYS_ERROR
- const int error = uv_translate_sys_error(errno);
-#else
- const int error = -errno;
- STATIC_ASSERT(-EINTR == UV_EINTR, "Need to translate error codes");
- STATIC_ASSERT(-EAGAIN == UV_EAGAIN, "Need to translate error codes");
- STATIC_ASSERT(-ENOMEM == UV_ENOMEM, "Need to translate error codes");
-#endif
+ const int error = os_translate_sys_error(errno);
errno = 0;
- if (error == UV_EINTR || error == UV_EAGAIN) {
+ if (non_blocking && error == UV_EAGAIN) {
+ break;
+ } else if (error == UV_EINTR || error == UV_EAGAIN) {
continue;
} else if (error == UV_ENOMEM && !did_try_to_free) {
try_to_free_memory();
@@ -495,9 +602,11 @@ ptrdiff_t os_readv(int fd, bool *ret_eof, struct iovec *iov, size_t iov_size)
/// @param[in] fd File descriptor to write to.
/// @param[in] buf Data to write. May be NULL if size is zero.
/// @param[in] size Amount of bytes to write.
+/// @param[in] non_blocking Do not restart syscall if EAGAIN was encountered.
///
/// @return Number of bytes written or libuv error code (< 0).
-ptrdiff_t os_write(const int fd, const char *const buf, const size_t size)
+ptrdiff_t os_write(const int fd, const char *const buf, const size_t size,
+ const bool non_blocking)
FUNC_ATTR_WARN_UNUSED_RESULT
{
if (buf == NULL) {
@@ -506,23 +615,18 @@ ptrdiff_t os_write(const int fd, const char *const buf, const size_t size)
}
size_t written_bytes = 0;
while (written_bytes != size) {
+ assert(size >= written_bytes);
const ptrdiff_t cur_written_bytes = write(fd, buf + written_bytes,
- size - written_bytes);
+ IO_COUNT(size - written_bytes));
if (cur_written_bytes > 0) {
written_bytes += (size_t)cur_written_bytes;
}
if (cur_written_bytes < 0) {
-#ifdef HAVE_UV_TRANSLATE_SYS_ERROR
- const int error = uv_translate_sys_error(errno);
-#else
- const int error = -errno;
- STATIC_ASSERT(-EINTR == UV_EINTR, "Need to translate error codes");
- STATIC_ASSERT(-EAGAIN == UV_EAGAIN, "Need to translate error codes");
- // According to the man page open() may fail with ENOMEM, but write()
- // canโ€™t.
-#endif
+ const int error = os_translate_sys_error(errno);
errno = 0;
- if (error == UV_EINTR || error == UV_EAGAIN) {
+ if (non_blocking && error == UV_EAGAIN) {
+ break;
+ } else if (error == UV_EINTR || error == UV_EAGAIN) {
continue;
} else {
return error;
@@ -544,15 +648,19 @@ int os_fsync(int fd)
{
int r;
RUN_UV_FS_FUNC(r, uv_fs_fsync, fd, NULL);
+ g_stats.fsync++;
return r;
}
/// Get stat information for a file.
///
-/// @return libuv return code.
+/// @return libuv return code, or -errno
static int os_stat(const char *name, uv_stat_t *statbuf)
- FUNC_ATTR_NONNULL_ALL
+ FUNC_ATTR_NONNULL_ARG(2)
{
+ if (!name) {
+ return UV_EINVAL;
+ }
uv_fs_t request;
int result = uv_fs_stat(&fs_loop, &request, name, NULL);
*statbuf = request.statbuf;
@@ -563,11 +671,10 @@ static int os_stat(const char *name, uv_stat_t *statbuf)
/// Get the file permissions for a given file.
///
/// @return libuv error code on error.
-int32_t os_getperm(const char_u *name)
- FUNC_ATTR_NONNULL_ALL
+int32_t os_getperm(const char *name)
{
uv_stat_t statbuf;
- int stat_result = os_stat((char *)name, &statbuf);
+ int stat_result = os_stat(name, &statbuf);
if (stat_result == kLibuvSuccess) {
return (int32_t)statbuf.st_mode;
} else {
@@ -578,11 +685,11 @@ int32_t os_getperm(const char_u *name)
/// Set the permission of a file.
///
/// @return `OK` for success, `FAIL` for failure.
-int os_setperm(const char_u *name, int perm)
+int os_setperm(const char *const name, int perm)
FUNC_ATTR_NONNULL_ALL
{
int r;
- RUN_UV_FS_FUNC(r, uv_fs_chmod, (const char *)name, perm, NULL);
+ RUN_UV_FS_FUNC(r, uv_fs_chmod, name, perm, NULL);
return (r == kLibuvSuccess ? OK : FAIL);
}
@@ -603,7 +710,6 @@ int os_fchown(int fd, uv_uid_t owner, uv_gid_t group)
///
/// @return `true` if `path` exists
bool os_path_exists(const char_u *path)
- FUNC_ATTR_NONNULL_ALL
{
uv_stat_t statbuf;
return os_stat((char *)path, &statbuf) == kLibuvSuccess;
@@ -793,7 +899,7 @@ int os_remove(const char *path)
/// @param[out] file_info Pointer to a FileInfo to put the information in.
/// @return `true` on success, `false` for failure.
bool os_fileinfo(const char *path, FileInfo *file_info)
- FUNC_ATTR_NONNULL_ALL
+ FUNC_ATTR_NONNULL_ARG(2)
{
return os_stat(path, &(file_info->stat)) == kLibuvSuccess;
}
@@ -804,8 +910,11 @@ bool os_fileinfo(const char *path, FileInfo *file_info)
/// @param[out] file_info Pointer to a FileInfo to put the information in.
/// @return `true` on success, `false` for failure.
bool os_fileinfo_link(const char *path, FileInfo *file_info)
- FUNC_ATTR_NONNULL_ALL
+ FUNC_ATTR_NONNULL_ARG(2)
{
+ if (path == NULL) {
+ return false;
+ }
uv_fs_t request;
int result = uv_fs_lstat(&fs_loop, &request, path, NULL);
file_info->stat = request.statbuf;
@@ -923,10 +1032,223 @@ bool os_fileid_equal(const FileID *file_id_1, const FileID *file_id_2)
/// @param file_info Pointer to a `FileInfo`
/// @return `true` if the `FileID` and the `FileInfo` represent te same file.
bool os_fileid_equal_fileinfo(const FileID *file_id,
- const FileInfo *file_info)
+ const FileInfo *file_info)
FUNC_ATTR_NONNULL_ALL
{
return file_id->inode == file_info->stat.st_ino
&& file_id->device_id == file_info->stat.st_dev;
}
+#ifdef WIN32
+# include <shlobj.h>
+
+/// When "fname" is the name of a shortcut (*.lnk) resolve the file it points
+/// to and return that name in allocated memory.
+/// Otherwise NULL is returned.
+char *os_resolve_shortcut(const char *fname)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_MALLOC
+{
+ HRESULT hr;
+ IPersistFile *ppf = NULL;
+ OLECHAR wsz[MAX_PATH];
+ char *rfname = NULL;
+ IShellLinkW *pslw = NULL;
+ WIN32_FIND_DATAW ffdw;
+
+ // Check if the file name ends in ".lnk". Avoid calling CoCreateInstance(),
+ // it's quite slow.
+ if (fname == NULL) {
+ return rfname;
+ }
+ const size_t len = strlen(fname);
+ if (len <= 4 || STRNICMP(fname + len - 4, ".lnk", 4) != 0) {
+ return rfname;
+ }
+
+ CoInitialize(NULL);
+
+ // create a link manager object and request its interface
+ hr = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IShellLinkW, (void **)&pslw);
+ if (hr == S_OK) {
+ wchar_t *p;
+ const int conversion_result = utf8_to_utf16(fname, &p);
+ if (conversion_result != 0) {
+ EMSG2("utf8_to_utf16 failed: %d", conversion_result);
+ }
+
+ if (p != NULL) {
+ // Get a pointer to the IPersistFile interface.
+ hr = pslw->lpVtbl->QueryInterface(
+ pslw, &IID_IPersistFile, (void **)&ppf);
+ if (hr != S_OK) {
+ goto shortcut_errorw;
+ }
+
+ // "load" the name and resolve the link
+ hr = ppf->lpVtbl->Load(ppf, p, STGM_READ);
+ if (hr != S_OK) {
+ goto shortcut_errorw;
+ }
+
+# if 0 // This makes Vim wait a long time if the target does not exist.
+ hr = pslw->lpVtbl->Resolve(pslw, NULL, SLR_NO_UI);
+ if (hr != S_OK) {
+ goto shortcut_errorw;
+ }
+# endif
+
+ // Get the path to the link target.
+ ZeroMemory(wsz, MAX_PATH * sizeof(wchar_t));
+ hr = pslw->lpVtbl->GetPath(pslw, wsz, MAX_PATH, &ffdw, 0);
+ if (hr == S_OK && wsz[0] != NUL) {
+ const int conversion_result = utf16_to_utf8(wsz, &rfname);
+ if (conversion_result != 0) {
+ EMSG2("utf16_to_utf8 failed: %s", uv_strerror(conversion_result));
+ }
+ }
+
+shortcut_errorw:
+ xfree(p);
+ goto shortcut_end;
+ }
+ }
+
+shortcut_end:
+ // Release all interface pointers (both belong to the same object)
+ if (ppf != NULL) {
+ ppf->lpVtbl->Release(ppf);
+ }
+ if (pslw != NULL) {
+ pslw->lpVtbl->Release(pslw);
+ }
+
+ CoUninitialize();
+ return rfname;
+}
+
+#endif
+
+int os_translate_sys_error(int sys_errno)
+{
+#ifdef HAVE_UV_TRANSLATE_SYS_ERROR
+ return uv_translate_sys_error(sys_errno);
+#elif defined(WIN32)
+ // TODO(equalsraf): libuv does not yet expose uv_translate_sys_error()
+ // in its public API, include a version here until it can be used.
+ // See https://github.com/libuv/libuv/issues/79
+# ifndef ERROR_SYMLINK_NOT_SUPPORTED
+# define ERROR_SYMLINK_NOT_SUPPORTED 1464
+# endif
+
+ if (sys_errno <= 0) {
+ return sys_errno; // If < 0 then it's already a libuv error
+ }
+
+ switch (sys_errno) {
+ case ERROR_NOACCESS: return UV_EACCES;
+ case WSAEACCES: return UV_EACCES;
+ case ERROR_ADDRESS_ALREADY_ASSOCIATED: return UV_EADDRINUSE;
+ case WSAEADDRINUSE: return UV_EADDRINUSE;
+ case WSAEADDRNOTAVAIL: return UV_EADDRNOTAVAIL;
+ case WSAEAFNOSUPPORT: return UV_EAFNOSUPPORT;
+ case WSAEWOULDBLOCK: return UV_EAGAIN;
+ case WSAEALREADY: return UV_EALREADY;
+ case ERROR_INVALID_FLAGS: return UV_EBADF;
+ case ERROR_INVALID_HANDLE: return UV_EBADF;
+ case ERROR_LOCK_VIOLATION: return UV_EBUSY;
+ case ERROR_PIPE_BUSY: return UV_EBUSY;
+ case ERROR_SHARING_VIOLATION: return UV_EBUSY;
+ case ERROR_OPERATION_ABORTED: return UV_ECANCELED;
+ case WSAEINTR: return UV_ECANCELED;
+ case ERROR_NO_UNICODE_TRANSLATION: return UV_ECHARSET;
+ case ERROR_CONNECTION_ABORTED: return UV_ECONNABORTED;
+ case WSAECONNABORTED: return UV_ECONNABORTED;
+ case ERROR_CONNECTION_REFUSED: return UV_ECONNREFUSED;
+ case WSAECONNREFUSED: return UV_ECONNREFUSED;
+ case ERROR_NETNAME_DELETED: return UV_ECONNRESET;
+ case WSAECONNRESET: return UV_ECONNRESET;
+ case ERROR_ALREADY_EXISTS: return UV_EEXIST;
+ case ERROR_FILE_EXISTS: return UV_EEXIST;
+ case ERROR_BUFFER_OVERFLOW: return UV_EFAULT;
+ case WSAEFAULT: return UV_EFAULT;
+ case ERROR_HOST_UNREACHABLE: return UV_EHOSTUNREACH;
+ case WSAEHOSTUNREACH: return UV_EHOSTUNREACH;
+ case ERROR_INSUFFICIENT_BUFFER: return UV_EINVAL;
+ case ERROR_INVALID_DATA: return UV_EINVAL;
+ case ERROR_INVALID_PARAMETER: return UV_EINVAL;
+ case ERROR_SYMLINK_NOT_SUPPORTED: return UV_EINVAL;
+ case WSAEINVAL: return UV_EINVAL;
+ case WSAEPFNOSUPPORT: return UV_EINVAL;
+ case WSAESOCKTNOSUPPORT: return UV_EINVAL;
+ case ERROR_BEGINNING_OF_MEDIA: return UV_EIO;
+ case ERROR_BUS_RESET: return UV_EIO;
+ case ERROR_CRC: return UV_EIO;
+ case ERROR_DEVICE_DOOR_OPEN: return UV_EIO;
+ case ERROR_DEVICE_REQUIRES_CLEANING: return UV_EIO;
+ case ERROR_DISK_CORRUPT: return UV_EIO;
+ case ERROR_EOM_OVERFLOW: return UV_EIO;
+ case ERROR_FILEMARK_DETECTED: return UV_EIO;
+ case ERROR_GEN_FAILURE: return UV_EIO;
+ case ERROR_INVALID_BLOCK_LENGTH: return UV_EIO;
+ case ERROR_IO_DEVICE: return UV_EIO;
+ case ERROR_NO_DATA_DETECTED: return UV_EIO;
+ case ERROR_NO_SIGNAL_SENT: return UV_EIO;
+ case ERROR_OPEN_FAILED: return UV_EIO;
+ case ERROR_SETMARK_DETECTED: return UV_EIO;
+ case ERROR_SIGNAL_REFUSED: return UV_EIO;
+ case WSAEISCONN: return UV_EISCONN;
+ case ERROR_CANT_RESOLVE_FILENAME: return UV_ELOOP;
+ case ERROR_TOO_MANY_OPEN_FILES: return UV_EMFILE;
+ case WSAEMFILE: return UV_EMFILE;
+ case WSAEMSGSIZE: return UV_EMSGSIZE;
+ case ERROR_FILENAME_EXCED_RANGE: return UV_ENAMETOOLONG;
+ case ERROR_NETWORK_UNREACHABLE: return UV_ENETUNREACH;
+ case WSAENETUNREACH: return UV_ENETUNREACH;
+ case WSAENOBUFS: return UV_ENOBUFS;
+ case ERROR_BAD_PATHNAME: return UV_ENOENT;
+ case ERROR_DIRECTORY: return UV_ENOENT;
+ case ERROR_FILE_NOT_FOUND: return UV_ENOENT;
+ case ERROR_INVALID_NAME: return UV_ENOENT;
+ case ERROR_INVALID_DRIVE: return UV_ENOENT;
+ case ERROR_INVALID_REPARSE_DATA: return UV_ENOENT;
+ case ERROR_MOD_NOT_FOUND: return UV_ENOENT;
+ case ERROR_PATH_NOT_FOUND: return UV_ENOENT;
+ case WSAHOST_NOT_FOUND: return UV_ENOENT;
+ case WSANO_DATA: return UV_ENOENT;
+ case ERROR_NOT_ENOUGH_MEMORY: return UV_ENOMEM;
+ case ERROR_OUTOFMEMORY: return UV_ENOMEM;
+ case ERROR_CANNOT_MAKE: return UV_ENOSPC;
+ case ERROR_DISK_FULL: return UV_ENOSPC;
+ case ERROR_EA_TABLE_FULL: return UV_ENOSPC;
+ case ERROR_END_OF_MEDIA: return UV_ENOSPC;
+ case ERROR_HANDLE_DISK_FULL: return UV_ENOSPC;
+ case ERROR_NOT_CONNECTED: return UV_ENOTCONN;
+ case WSAENOTCONN: return UV_ENOTCONN;
+ case ERROR_DIR_NOT_EMPTY: return UV_ENOTEMPTY;
+ case WSAENOTSOCK: return UV_ENOTSOCK;
+ case ERROR_NOT_SUPPORTED: return UV_ENOTSUP;
+ case ERROR_BROKEN_PIPE: return UV_EOF;
+ case ERROR_ACCESS_DENIED: return UV_EPERM;
+ case ERROR_PRIVILEGE_NOT_HELD: return UV_EPERM;
+ case ERROR_BAD_PIPE: return UV_EPIPE;
+ case ERROR_NO_DATA: return UV_EPIPE;
+ case ERROR_PIPE_NOT_CONNECTED: return UV_EPIPE;
+ case WSAESHUTDOWN: return UV_EPIPE;
+ case WSAEPROTONOSUPPORT: return UV_EPROTONOSUPPORT;
+ case ERROR_WRITE_PROTECT: return UV_EROFS;
+ case ERROR_SEM_TIMEOUT: return UV_ETIMEDOUT;
+ case WSAETIMEDOUT: return UV_ETIMEDOUT;
+ case ERROR_NOT_SAME_DEVICE: return UV_EXDEV;
+ case ERROR_INVALID_FUNCTION: return UV_EISDIR;
+ case ERROR_META_EXPANSION_TOO_LONG: return UV_E2BIG;
+ default: return UV_UNKNOWN;
+ }
+#else
+ const int error = -errno;
+ STATIC_ASSERT(-EINTR == UV_EINTR, "Need to translate error codes");
+ STATIC_ASSERT(-EAGAIN == UV_EAGAIN, "Need to translate error codes");
+ STATIC_ASSERT(-ENOMEM == UV_ENOMEM, "Need to translate error codes");
+ return error;
+#endif
+}
diff --git a/src/nvim/os/fs_defs.h b/src/nvim/os/fs_defs.h
index 0bd9c37750..2277d926b3 100644
--- a/src/nvim/os/fs_defs.h
+++ b/src/nvim/os/fs_defs.h
@@ -14,7 +14,7 @@ typedef struct {
uint64_t device_id; ///< @private The id of the device containing the file
} FileID;
-#define FILE_ID_EMPTY (FileID) {.inode = 0, .device_id = 0}
+#define FILE_ID_EMPTY (FileID) { .inode = 0, .device_id = 0 }
typedef struct {
uv_fs_t request; ///< @private The request to uv for the directory.
diff --git a/src/nvim/os/input.c b/src/nvim/os/input.c
index 0c46dc96ee..f62253cbce 100644
--- a/src/nvim/os/input.c
+++ b/src/nvim/os/input.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <string.h>
#include <stdbool.h>
@@ -19,7 +22,8 @@
#include "nvim/getchar.h"
#include "nvim/main.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
+#include "nvim/state.h"
+#include "nvim/msgpack_rpc/channel.h"
#define READ_BUFFER_SIZE 0xfff
#define INPUT_BUFFER_SIZE (READ_BUFFER_SIZE * 4)
@@ -30,24 +34,23 @@ typedef enum {
kInputEof
} InbufPollResult;
-static Stream read_stream = {.closed = true};
+static Stream read_stream = { .closed = true }; // Input before UI starts.
static RBuffer *input_buffer = NULL;
static bool input_eof = false;
-static int global_fd = 0;
+static int global_fd = -1;
static int events_enabled = 0;
+static bool blocking = false;
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "os/input.c.generated.h"
#endif
-// Helper function used to push bytes from the 'event' key sequence partially
-// between calls to os_inchar when maxlen < 3
void input_init(void)
{
input_buffer = rbuffer_new(INPUT_BUFFER_SIZE + MAX_KEY_CODE_LEN);
}
-/// Gets the file from which input was gathered at startup.
+/// Global TTY (or pipe for "-es") input stream, before UI starts.
int input_global_fd(void)
{
return global_fd;
@@ -60,8 +63,8 @@ void input_start(int fd)
}
global_fd = fd;
- rstream_init_fd(&main_loop, &read_stream, fd, READ_BUFFER_SIZE, NULL);
- rstream_start(&read_stream, read_cb);
+ rstream_init_fd(&main_loop, &read_stream, fd, READ_BUFFER_SIZE);
+ rstream_start(&read_stream, input_read_cb, NULL);
}
void input_stop(void)
@@ -71,7 +74,7 @@ void input_stop(void)
}
rstream_stop(&read_stream);
- stream_close(&read_stream, NULL);
+ stream_close(&read_stream, NULL, NULL);
}
static void cursorhold_event(void **argv)
@@ -87,8 +90,8 @@ static void create_cursorhold_event(void)
// have been called(inbuf_poll would return kInputAvail)
// TODO(tarruda): Cursorhold should be implemented as a timer set during the
// `state_check` callback for the states where it can be triggered.
- assert(!events_enabled || queue_empty(main_loop.events));
- queue_put(main_loop.events, cursorhold_event, 0);
+ assert(!events_enabled || multiqueue_empty(main_loop.events));
+ multiqueue_put(main_loop.events, cursorhold_event, 0);
}
// Low level input function
@@ -105,6 +108,11 @@ int os_inchar(uint8_t *buf, int maxlen, int ms, int tb_change_cnt)
}
} else {
if ((result = inbuf_poll((int)p_ut)) == kInputNone) {
+ if (read_stream.closed && silent_mode) {
+ // Drained eventloop & initial input; exit silent/batch-mode (-es/-Es).
+ read_error_exit();
+ }
+
if (trigger_cursorhold() && !typebuf_changed(tb_change_cnt)) {
create_cursorhold_event();
} else {
@@ -146,9 +154,15 @@ bool os_char_avail(void)
// Check for CTRL-C typed by reading all available characters.
void os_breakcheck(void)
{
+ int save_us = updating_screen;
+ // We do not want screen_resize() to redraw here.
+ updating_screen++;
+
if (!got_int) {
loop_poll_events(&main_loop, 0);
}
+
+ updating_screen = save_us;
}
void input_enable_events(void)
@@ -172,12 +186,14 @@ bool os_isatty(int fd)
size_t input_enqueue(String keys)
{
- char *ptr = keys.data, *end = ptr + keys.size;
+ char *ptr = keys.data;
+ char *end = ptr + keys.size;
while (rbuffer_space(input_buffer) >= 6 && ptr < end) {
uint8_t buf[6] = { 0 };
- unsigned int new_size = trans_special((const uint8_t **)&ptr, keys.size,
- buf, true);
+ unsigned int new_size
+ = trans_special((const uint8_t **)&ptr, (size_t)(end - ptr), buf, true,
+ false);
if (new_size) {
new_size = handle_mouse_event(&ptr, buf, new_size);
@@ -187,8 +203,7 @@ size_t input_enqueue(String keys)
if (*ptr == '<') {
char *old_ptr = ptr;
- // Invalid or incomplete key sequence, skip until the next '>' or until
- // *end
+ // Invalid or incomplete key sequence, skip until the next '>' or *end.
do {
ptr++;
} while (ptr < end && *ptr != '>');
@@ -266,29 +281,32 @@ static unsigned int handle_mouse_event(char **ptr, uint8_t *buf,
}
static int orig_num_clicks = 0;
- static int orig_mouse_code = 0;
- static int orig_mouse_col = 0;
- static int orig_mouse_row = 0;
- static uint64_t orig_mouse_time = 0; // time of previous mouse click
- uint64_t mouse_time = os_hrtime(); // time of current mouse click
-
- // compute the time elapsed since the previous mouse click and
- // convert p_mouse from ms to ns
- uint64_t timediff = mouse_time - orig_mouse_time;
- uint64_t mouset = (uint64_t)p_mouset * 1000000;
- if (mouse_code == orig_mouse_code
- && timediff < mouset
- && orig_num_clicks != 4
- && orig_mouse_col == mouse_col
- && orig_mouse_row == mouse_row) {
- orig_num_clicks++;
- } else {
- orig_num_clicks = 1;
+ if (mouse_code != KE_LEFTRELEASE && mouse_code != KE_RIGHTRELEASE
+ && mouse_code != KE_MIDDLERELEASE) {
+ static int orig_mouse_code = 0;
+ static int orig_mouse_col = 0;
+ static int orig_mouse_row = 0;
+ static uint64_t orig_mouse_time = 0; // time of previous mouse click
+ uint64_t mouse_time = os_hrtime(); // time of current mouse click (ns)
+
+ // compute the time elapsed since the previous mouse click and
+ // convert p_mouse from ms to ns
+ uint64_t timediff = mouse_time - orig_mouse_time;
+ uint64_t mouset = (uint64_t)p_mouset * 1000000;
+ if (mouse_code == orig_mouse_code
+ && timediff < mouset
+ && orig_num_clicks != 4
+ && orig_mouse_col == mouse_col
+ && orig_mouse_row == mouse_row) {
+ orig_num_clicks++;
+ } else {
+ orig_num_clicks = 1;
+ }
+ orig_mouse_code = mouse_code;
+ orig_mouse_col = mouse_col;
+ orig_mouse_row = mouse_row;
+ orig_mouse_time = mouse_time;
}
- orig_mouse_code = mouse_code;
- orig_mouse_col = mouse_col;
- orig_mouse_row = mouse_row;
- orig_mouse_time = mouse_time;
uint8_t modifiers = 0;
if (orig_num_clicks == 2) {
@@ -316,13 +334,27 @@ static unsigned int handle_mouse_event(char **ptr, uint8_t *buf,
return bufsize;
}
+/// @return true if the main loop is blocked and waiting for input.
+bool input_blocking(void)
+{
+ return blocking;
+}
+
static bool input_poll(int ms)
{
if (do_profiling == PROF_YES && ms) {
prof_inchar_enter();
}
+ if ((ms == - 1 || ms > 0) && !events_enabled && !input_eof) {
+ // The pending input provoked a blocking wait. Do special events now. #6247
+ blocking = true;
+ multiqueue_process_events(ch_before_blocking_events);
+ }
+ DLOG("blocking... events_enabled=%d events_pending=%d", events_enabled,
+ !multiqueue_empty(main_loop.events));
LOOP_PROCESS_EVENTS_UNTIL(&main_loop, NULL, ms, input_ready() || input_eof);
+ blocking = false;
if (do_profiling == PROF_YES && ms) {
prof_inchar_exit();
@@ -351,11 +383,11 @@ static InbufPollResult inbuf_poll(int ms)
return input_eof ? kInputEof : kInputNone;
}
-static void read_cb(Stream *stream, RBuffer *buf, size_t c, void *data,
- bool at_eof)
+static void input_read_cb(Stream *stream, RBuffer *buf, size_t c, void *data,
+ bool at_eof)
{
if (at_eof) {
- input_eof = true;
+ input_done();
}
assert(rbuffer_space(input_buffer) >= rbuffer_size(buf));
@@ -386,6 +418,8 @@ static void process_interrupts(void)
}
}
+// Helper function used to push bytes from the 'event' key sequence partially
+// between calls to os_inchar when maxlen < 3
static int push_event_key(uint8_t *buf, int maxlen)
{
static const uint8_t key[3] = { K_SPECIAL, KS_EXTRA, KE_EVENT };
@@ -411,13 +445,14 @@ static bool input_ready(void)
// Exit because of an input read error.
static void read_error_exit(void)
{
- if (silent_mode) /* Normal way to exit for "ex -s" */
+ if (silent_mode) { // Normal way to exit for "nvim -es".
getout(0);
+ }
STRCPY(IObuff, _("Vim: Error reading input, exiting...\n"));
preserve_exit();
}
static bool pending_events(void)
{
- return events_enabled && !queue_empty(main_loop.events);
+ return events_enabled && !multiqueue_empty(main_loop.events);
}
diff --git a/src/nvim/os/lang.c b/src/nvim/os/lang.c
new file mode 100644
index 0000000000..108a9c6c39
--- /dev/null
+++ b/src/nvim/os/lang.c
@@ -0,0 +1,65 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+#ifdef __APPLE__
+# define Boolean CFBoolean // Avoid conflict with API's Boolean
+# include <CoreFoundation/CFLocale.h>
+# include <CoreFoundation/CFString.h>
+# undef Boolean
+#endif
+
+#ifdef HAVE_LOCALE_H
+# include <locale.h>
+#endif
+#include "nvim/os/os.h"
+
+void lang_init(void)
+{
+#ifdef __APPLE__
+ if (os_getenv("LANG") == NULL) {
+ const char *lang_region = NULL;
+ CFTypeRef cf_lang_region = NULL;
+
+ CFLocaleRef cf_locale = CFLocaleCopyCurrent();
+ if (cf_locale) {
+ cf_lang_region = CFLocaleGetValue(cf_locale, kCFLocaleIdentifier);
+ CFRetain(cf_lang_region);
+ lang_region = CFStringGetCStringPtr(cf_lang_region,
+ kCFStringEncodingUTF8);
+ CFRelease(cf_locale);
+ } else {
+ // Use the primary language defined in Preferences -> Language & Region
+ CFArrayRef cf_langs = CFLocaleCopyPreferredLanguages();
+ if (cf_langs && CFArrayGetCount(cf_langs) > 0) {
+ cf_lang_region = CFArrayGetValueAtIndex(cf_langs, 0);
+ CFRetain(cf_lang_region);
+ CFRelease(cf_langs);
+ lang_region = CFStringGetCStringPtr(cf_lang_region,
+ kCFStringEncodingUTF8);
+ } else {
+ ELOG("$LANG is empty and your primary language cannot be inferred.");
+ return;
+ }
+ }
+
+ if (lang_region) {
+ os_setenv("LANG", lang_region, true);
+ } else {
+ char buf[20] = { 0 };
+ if (CFStringGetCString(cf_lang_region, buf, 20,
+ kCFStringEncodingUTF8)) {
+ os_setenv("LANG", buf, true);
+ }
+ }
+ CFRelease(cf_lang_region);
+# ifdef HAVE_LOCALE_H
+ setlocale(LC_ALL, "");
+
+# ifdef LC_NUMERIC
+ // Make sure strtod() uses a decimal point, not a comma.
+ setlocale(LC_NUMERIC, "C");
+# endif
+# endif
+ }
+#endif
+}
diff --git a/src/nvim/os/lang.h b/src/nvim/os/lang.h
new file mode 100644
index 0000000000..f60e064f57
--- /dev/null
+++ b/src/nvim/os/lang.h
@@ -0,0 +1,7 @@
+#ifndef NVIM_OS_LANG_H
+#define NVIM_OS_LANG_H
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "os/lang.h.generated.h"
+#endif
+#endif // NVIM_OS_LANG_H
diff --git a/src/nvim/os/mem.c b/src/nvim/os/mem.c
index 871ece7a0e..eccb3c97e5 100644
--- a/src/nvim/os/mem.c
+++ b/src/nvim/os/mem.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/// Functions for accessing system memory information.
#include <uv.h>
diff --git a/src/nvim/os/os_defs.h b/src/nvim/os/os_defs.h
index 5e164b54a5..c29af5c160 100644
--- a/src/nvim/os/os_defs.h
+++ b/src/nvim/os/os_defs.h
@@ -16,7 +16,7 @@
#define BASENAMELEN (NAME_MAX - 5)
// Use the system path length if it makes sense.
-#if defined(PATH_MAX) && (PATH_MAX > 1000)
+#if defined(PATH_MAX) && (PATH_MAX > 1024)
# define MAXPATHL PATH_MAX
#else
# define MAXPATHL 1024
@@ -25,15 +25,6 @@
// Command-processing buffer. Use large buffers for all platforms.
#define CMDBUFFSIZE 1024
-// Use up to 5 Mbyte for a buffer.
-#ifndef DFLT_MAXMEM
-# define DFLT_MAXMEM (5*1024)
-#endif
-// use up to 10 Mbyte for Vim.
-#ifndef DFLT_MAXMEMTOT
-# define DFLT_MAXMEMTOT (10*1024)
-#endif
-
// Note: Some systems need both string.h and strings.h (Savage). However,
// some systems can't handle both, only use string.h in that case.
#include <string.h>
diff --git a/src/nvim/os/process.c b/src/nvim/os/process.c
new file mode 100644
index 0000000000..a67e7487eb
--- /dev/null
+++ b/src/nvim/os/process.c
@@ -0,0 +1,267 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+/// OS process functions
+///
+/// psutil is a good reference for cross-platform syscall voodoo:
+/// https://github.com/giampaolo/psutil/tree/master/psutil/arch
+
+#include <uv.h> // for HANDLE (win32)
+
+#ifdef WIN32
+# include <tlhelp32.h> // for CreateToolhelp32Snapshot
+#endif
+
+#if defined(__FreeBSD__) // XXX: OpenBSD ?
+# include <string.h>
+# include <sys/types.h>
+# include <sys/user.h>
+#endif
+
+#if defined(__NetBSD__) || defined(__OpenBSD__)
+# include <sys/param.h>
+#endif
+
+#if defined(__APPLE__) || defined(BSD)
+# include <sys/sysctl.h>
+# include <pwd.h>
+#endif
+
+#include "nvim/globals.h"
+#include "nvim/log.h"
+#include "nvim/os/process.h"
+#include "nvim/os/os.h"
+#include "nvim/os/os_defs.h"
+#include "nvim/api/private/helpers.h"
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "os/process.c.generated.h"
+#endif
+
+#ifdef WIN32
+static bool os_proc_tree_kill_rec(HANDLE process, int sig)
+{
+ if (process == NULL) {
+ return false;
+ }
+ PROCESSENTRY32 pe;
+ DWORD pid = GetProcessId(process);
+
+ if (pid != 0) {
+ HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
+ if (h != INVALID_HANDLE_VALUE) {
+ pe.dwSize = sizeof(PROCESSENTRY32);
+ if (!Process32First(h, &pe)) {
+ goto theend;
+ }
+ do {
+ if (pe.th32ParentProcessID == pid) {
+ HANDLE ph = OpenProcess(PROCESS_ALL_ACCESS, false, pe.th32ProcessID);
+ if (ph != NULL) {
+ os_proc_tree_kill_rec(ph, sig);
+ CloseHandle(ph);
+ }
+ }
+ } while (Process32Next(h, &pe));
+ CloseHandle(h);
+ }
+ }
+
+theend:
+ return (bool)TerminateProcess(process, (unsigned int)sig);
+}
+/// Kills process `pid` and its descendants recursively.
+bool os_proc_tree_kill(int pid, int sig)
+{
+ assert(sig >= 0);
+ assert(sig == SIGTERM || sig == SIGKILL);
+ if (pid > 0) {
+ ILOG("terminating process tree: %d", pid);
+ HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, false, (DWORD)pid);
+ return os_proc_tree_kill_rec(h, sig);
+ } else {
+ ELOG("invalid pid: %d", pid);
+ }
+ return false;
+}
+#else
+/// Kills process group where `pid` is the process group leader.
+bool os_proc_tree_kill(int pid, int sig)
+{
+ assert(sig == SIGTERM || sig == SIGKILL);
+ int pgid = getpgid(pid);
+ if (pgid > 0) { // Ignore error. Never kill self (pid=0).
+ if (pgid == pid) {
+ ILOG("sending %s to process group: -%d",
+ sig == SIGTERM ? "SIGTERM" : "SIGKILL", pgid);
+ int rv = uv_kill(-pgid, sig);
+ return rv == 0;
+ } else {
+ // Should never happen, because process_spawn() did setsid() in the child.
+ ELOG("pgid %d != pid %d", pgid, pid);
+ }
+ } else {
+ ELOG("getpgid(%d) returned %d", pid, pgid);
+ }
+ return false;
+}
+#endif
+
+/// Gets the process ids of the immediate children of process `ppid`.
+///
+/// @param ppid Process to inspect.
+/// @param[out,allocated] proc_list Child process ids.
+/// @param[out] proc_count Number of child processes.
+/// @return 0 on success, 1 if process not found, 2 on other error.
+int os_proc_children(int ppid, int **proc_list, size_t *proc_count)
+{
+ if (ppid < 0) {
+ return 2;
+ }
+
+ int *temp = NULL;
+ *proc_list = NULL;
+ *proc_count = 0;
+
+#ifdef WIN32
+ PROCESSENTRY32 pe;
+
+ // Snapshot of all processes.
+ HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
+ if (h == INVALID_HANDLE_VALUE) {
+ return 2;
+ }
+
+ pe.dwSize = sizeof(PROCESSENTRY32);
+ // Get root process.
+ if (!Process32First(h, &pe)) {
+ CloseHandle(h);
+ return 2;
+ }
+ // Collect processes whose parent matches `ppid`.
+ do {
+ if (pe.th32ParentProcessID == (DWORD)ppid) {
+ temp = xrealloc(temp, (*proc_count + 1) * sizeof(*temp));
+ temp[*proc_count] = (int)pe.th32ProcessID;
+ (*proc_count)++;
+ }
+ } while (Process32Next(h, &pe));
+ CloseHandle(h);
+
+#elif defined(__APPLE__) || defined(BSD)
+# if defined(__APPLE__)
+# define KP_PID(o) o.kp_proc.p_pid
+# define KP_PPID(o) o.kp_eproc.e_ppid
+# elif defined(__FreeBSD__)
+# define KP_PID(o) o.ki_pid
+# define KP_PPID(o) o.ki_ppid
+# else
+# define KP_PID(o) o.p_pid
+# define KP_PPID(o) o.p_ppid
+# endif
+# ifdef __NetBSD__
+ static int name[] = {
+ CTL_KERN, KERN_PROC2, KERN_PROC_ALL, 0, (int)(sizeof(struct kinfo_proc2)), 0
+ };
+# else
+ static int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 };
+# endif
+
+ // Get total process count.
+ size_t len = 0;
+ int rv = sysctl(name, ARRAY_SIZE(name) - 1, NULL, &len, NULL, 0);
+ if (rv) {
+ return 2;
+ }
+
+ // Get ALL processes.
+# ifdef __NetBSD__
+ struct kinfo_proc2 *p_list = xmalloc(len);
+# else
+ struct kinfo_proc *p_list = xmalloc(len);
+# endif
+ rv = sysctl(name, ARRAY_SIZE(name) - 1, p_list, &len, NULL, 0);
+ if (rv) {
+ xfree(p_list);
+ return 2;
+ }
+
+ // Collect processes whose parent matches `ppid`.
+ bool exists = false;
+ size_t p_count = len / sizeof(*p_list);
+ for (size_t i = 0; i < p_count; i++) {
+ exists = exists || KP_PID(p_list[i]) == ppid;
+ if (KP_PPID(p_list[i]) == ppid) {
+ temp = xrealloc(temp, (*proc_count + 1) * sizeof(*temp));
+ temp[*proc_count] = KP_PID(p_list[i]);
+ (*proc_count)++;
+ }
+ }
+ xfree(p_list);
+ if (!exists) {
+ return 1; // Process not found.
+ }
+
+#elif defined(__linux__)
+ char proc_p[256] = { 0 };
+ // Collect processes whose parent matches `ppid`.
+ // Rationale: children are defined in thread with same ID of process.
+ snprintf(proc_p, sizeof(proc_p), "/proc/%d/task/%d/children", ppid, ppid);
+ FILE *fp = fopen(proc_p, "r");
+ if (fp == NULL) {
+ return 2; // Process not found, or /proc/โ€ฆ/children not supported.
+ }
+ int match_pid;
+ while (fscanf(fp, "%d", &match_pid) > 0) {
+ temp = xrealloc(temp, (*proc_count + 1) * sizeof(*temp));
+ temp[*proc_count] = match_pid;
+ (*proc_count)++;
+ }
+ fclose(fp);
+#endif
+
+ *proc_list = temp;
+ return 0;
+}
+
+#ifdef WIN32
+/// Gets various properties of the process identified by `pid`.
+///
+/// @param pid Process to inspect.
+/// @return Map of process properties, empty on error.
+Dictionary os_proc_info(int pid)
+{
+ Dictionary pinfo = ARRAY_DICT_INIT;
+ PROCESSENTRY32 pe;
+
+ // Snapshot of all processes. This is used instead of:
+ // OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, โ€ฆ)
+ // to avoid ERROR_PARTIAL_COPY. https://stackoverflow.com/a/29942376
+ HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
+ if (h == INVALID_HANDLE_VALUE) {
+ return pinfo; // Return empty.
+ }
+
+ pe.dwSize = sizeof(PROCESSENTRY32);
+ // Get root process.
+ if (!Process32First(h, &pe)) {
+ CloseHandle(h);
+ return pinfo; // Return empty.
+ }
+ // Find the process.
+ do {
+ if (pe.th32ProcessID == (DWORD)pid) {
+ break;
+ }
+ } while (Process32Next(h, &pe));
+ CloseHandle(h);
+
+ if (pe.th32ProcessID == (DWORD)pid) {
+ PUT(pinfo, "pid", INTEGER_OBJ(pid));
+ PUT(pinfo, "ppid", INTEGER_OBJ((int)pe.th32ParentProcessID));
+ PUT(pinfo, "name", STRING_OBJ(cstr_to_string(pe.szExeFile)));
+ }
+
+ return pinfo;
+}
+#endif
diff --git a/src/nvim/os/process.h b/src/nvim/os/process.h
new file mode 100644
index 0000000000..1722d56bd3
--- /dev/null
+++ b/src/nvim/os/process.h
@@ -0,0 +1,11 @@
+#ifndef NVIM_OS_PROCESS_H
+#define NVIM_OS_PROCESS_H
+
+#include <stddef.h>
+#include "nvim/api/private/defs.h"
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "os/process.h.generated.h"
+#endif
+
+#endif // NVIM_OS_PROCESS_H
diff --git a/src/nvim/os/pty_process_unix.c b/src/nvim/os/pty_process_unix.c
index 436de030ba..bcf57e1b5b 100644
--- a/src/nvim/os/pty_process_unix.c
+++ b/src/nvim/os/pty_process_unix.c
@@ -1,16 +1,18 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
// Some of the code came from pangoterm and libuv
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
-#include <unistd.h>
#include <termios.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/ioctl.h>
// forkpty is not in POSIX, so headers are platform-specific
-#if defined(__FreeBSD__)
+#if defined(__FreeBSD__) || defined(__DragonFly__)
# include <libutil.h>
#elif defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__)
# include <util.h>
@@ -34,57 +36,89 @@
# include "os/pty_process_unix.c.generated.h"
#endif
-bool pty_process_spawn(PtyProcess *ptyproc)
+/// termios saved at startup (for TUI) or initialized by pty_process_spawn().
+static struct termios termios_default;
+
+/// Saves the termios properties associated with `tty_fd`.
+///
+/// @param tty_fd TTY file descriptor, or -1 if not in a terminal.
+void pty_process_save_termios(int tty_fd)
+{
+ DLOG("tty_fd=%d", tty_fd);
+ if (tty_fd == -1 || tcgetattr(tty_fd, &termios_default) != 0) {
+ return;
+ }
+}
+
+/// @returns zero on success, or negative error code
+int pty_process_spawn(PtyProcess *ptyproc)
FUNC_ATTR_NONNULL_ALL
{
- static struct termios termios;
- if (!termios.c_cflag) {
- init_termios(&termios);
+ if (!termios_default.c_cflag) {
+ // TODO(jkeyes): We could pass NULL to forkpty() instead ...
+ init_termios(&termios_default);
}
+ int status = 0; // zero or negative error code (libuv convention)
Process *proc = (Process *)ptyproc;
- assert(!proc->err);
+ assert(proc->err.closed);
uv_signal_start(&proc->loop->children_watcher, chld_handler, SIGCHLD);
ptyproc->winsize = (struct winsize){ ptyproc->height, ptyproc->width, 0, 0 };
uv_disable_stdio_inheritance();
int master;
- int pid = forkpty(&master, NULL, &termios, &ptyproc->winsize);
+ int pid = forkpty(&master, NULL, &termios_default, &ptyproc->winsize);
if (pid < 0) {
+ status = -errno;
ELOG("forkpty failed: %s", strerror(errno));
- return false;
+ return status;
} else if (pid == 0) {
- init_child(ptyproc);
- abort();
+ init_child(ptyproc); // never returns
}
// make sure the master file descriptor is non blocking
int master_status_flags = fcntl(master, F_GETFL);
if (master_status_flags == -1) {
+ status = -errno;
ELOG("Failed to get master descriptor status flags: %s", strerror(errno));
goto error;
}
if (fcntl(master, F_SETFL, master_status_flags | O_NONBLOCK) == -1) {
+ status = -errno;
ELOG("Failed to make master descriptor non-blocking: %s", strerror(errno));
goto error;
}
- if (proc->in && !set_duplicating_descriptor(master, &proc->in->uv.pipe)) {
+ // Other jobs and providers should not get a copy of this file descriptor.
+ if (os_set_cloexec(master) == -1) {
+ status = -errno;
+ ELOG("Failed to set CLOEXEC on ptmx file descriptor");
goto error;
}
- if (proc->out && !set_duplicating_descriptor(master, &proc->out->uv.pipe)) {
+
+ if (!proc->in.closed
+ && (status = set_duplicating_descriptor(master, &proc->in.uv.pipe))) {
+ goto error;
+ }
+ if (!proc->out.closed
+ && (status = set_duplicating_descriptor(master, &proc->out.uv.pipe))) {
goto error;
}
ptyproc->tty_fd = master;
proc->pid = pid;
- return true;
+ return 0;
error:
close(master);
kill(pid, SIGKILL);
waitpid(pid, NULL, 0);
- return false;
+ return status;
+}
+
+const char *pty_process_tty_name(PtyProcess *ptyproc)
+{
+ return ptsname(ptyproc->tty_fd);
}
void pty_process_resize(PtyProcess *ptyproc, uint16_t width, uint16_t height)
@@ -117,8 +151,12 @@ void pty_process_teardown(Loop *loop)
uv_signal_stop(&loop->children_watcher);
}
-static void init_child(PtyProcess *ptyproc) FUNC_ATTR_NONNULL_ALL
+static void init_child(PtyProcess *ptyproc)
+ FUNC_ATTR_NONNULL_ALL
{
+ // New session/process-group. #6530
+ setsid();
+
unsetenv("COLUMNS");
unsetenv("LINES");
unsetenv("TERMCAP");
@@ -134,13 +172,15 @@ static void init_child(PtyProcess *ptyproc) FUNC_ATTR_NONNULL_ALL
Process *proc = (Process *)ptyproc;
if (proc->cwd && os_chdir(proc->cwd) != 0) {
- fprintf(stderr, "chdir failed: %s\n", strerror(errno));
+ ELOG("chdir failed: %s", strerror(errno));
return;
}
+ char *prog = ptyproc->process.argv[0];
setenv("TERM", ptyproc->term_name ? ptyproc->term_name : "ansi", 1);
- execvp(ptyproc->process.argv[0], ptyproc->process.argv);
- fprintf(stderr, "execvp failed: %s\n", strerror(errno));
+ execvp(prog, ptyproc->process.argv);
+ ELOG("execvp failed: %s: %s", strerror(errno), prog);
+ _exit(122); // 122 is EXEC_FAILED in the Vim source.
}
static void init_termios(struct termios *termios) FUNC_ATTR_NONNULL_ALL
@@ -198,22 +238,34 @@ static void init_termios(struct termios *termios) FUNC_ATTR_NONNULL_ALL
termios->c_cc[VTIME] = 0;
}
-static bool set_duplicating_descriptor(int fd, uv_pipe_t *pipe)
+static int set_duplicating_descriptor(int fd, uv_pipe_t *pipe)
FUNC_ATTR_NONNULL_ALL
{
+ int status = 0; // zero or negative error code (libuv convention)
int fd_dup = dup(fd);
if (fd_dup < 0) {
+ status = -errno;
ELOG("Failed to dup descriptor %d: %s", fd, strerror(errno));
- return false;
+ return status;
}
- int uv_result = uv_pipe_open(pipe, fd_dup);
- if (uv_result) {
+
+ if (os_set_cloexec(fd_dup) == -1) {
+ status = -errno;
+ ELOG("Failed to set CLOEXEC on duplicate fd");
+ goto error;
+ }
+
+ status = uv_pipe_open(pipe, fd_dup);
+ if (status) {
ELOG("Failed to set pipe to descriptor %d: %s",
- fd_dup, uv_strerror(uv_result));
- close(fd_dup);
- return false;
+ fd_dup, uv_strerror(status));
+ goto error;
}
- return true;
+ return status;
+
+error:
+ close(fd_dup);
+ return status;
}
static void chld_handler(uv_signal_t *handle, int signum)
@@ -221,26 +273,23 @@ static void chld_handler(uv_signal_t *handle, int signum)
int stat = 0;
int pid;
- do {
- pid = waitpid(-1, &stat, WNOHANG);
- } while (pid < 0 && errno == EINTR);
-
- if (pid <= 0) {
- return;
- }
-
Loop *loop = handle->loop->data;
kl_iter(WatcherPtr, loop->children, current) {
Process *proc = (*current)->data;
- if (proc->pid == pid) {
- if (WIFEXITED(stat)) {
- proc->status = WEXITSTATUS(stat);
- } else if (WIFSIGNALED(stat)) {
- proc->status = WTERMSIG(stat);
- }
- proc->internal_exit_cb(proc);
- break;
+ do {
+ pid = waitpid(proc->pid, &stat, WNOHANG);
+ } while (pid < 0 && errno == EINTR);
+
+ if (pid <= 0) {
+ continue;
+ }
+
+ if (WIFEXITED(stat)) {
+ proc->status = WEXITSTATUS(stat);
+ } else if (WIFSIGNALED(stat)) {
+ proc->status = WTERMSIG(stat);
}
+ proc->internal_exit_cb(proc);
}
}
diff --git a/src/nvim/os/pty_process_win.c b/src/nvim/os/pty_process_win.c
new file mode 100644
index 0000000000..c5f8efadff
--- /dev/null
+++ b/src/nvim/os/pty_process_win.c
@@ -0,0 +1,418 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+#include <assert.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include <winpty_constants.h>
+
+#include "nvim/os/os.h"
+#include "nvim/ascii.h"
+#include "nvim/memory.h"
+#include "nvim/mbyte.h" // for utf8_to_utf16, utf16_to_utf8
+#include "nvim/os/pty_process_win.h"
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "os/pty_process_win.c.generated.h"
+#endif
+
+static void CALLBACK pty_process_finish1(void *context, BOOLEAN unused)
+ FUNC_ATTR_NONNULL_ALL
+{
+ PtyProcess *ptyproc = (PtyProcess *)context;
+ Process *proc = (Process *)ptyproc;
+
+ uv_timer_init(&proc->loop->uv, &ptyproc->wait_eof_timer);
+ ptyproc->wait_eof_timer.data = (void *)ptyproc;
+ uv_timer_start(&ptyproc->wait_eof_timer, wait_eof_timer_cb, 200, 200);
+}
+
+/// @returns zero on success, or negative error code.
+int pty_process_spawn(PtyProcess *ptyproc)
+ FUNC_ATTR_NONNULL_ALL
+{
+ Process *proc = (Process *)ptyproc;
+ int status = 0;
+ winpty_error_ptr_t err = NULL;
+ winpty_config_t *cfg = NULL;
+ winpty_spawn_config_t *spawncfg = NULL;
+ winpty_t *winpty_object = NULL;
+ char *in_name = NULL;
+ char *out_name = NULL;
+ HANDLE process_handle = NULL;
+ uv_connect_t *in_req = NULL;
+ uv_connect_t *out_req = NULL;
+ wchar_t *cmd_line = NULL;
+ wchar_t *cwd = NULL;
+ const char *emsg = NULL;
+
+ assert(proc->err.closed);
+
+ cfg = winpty_config_new(WINPTY_FLAG_ALLOW_CURPROC_DESKTOP_CREATION, &err);
+ if (cfg == NULL) {
+ emsg = "Failed, winpty_config_new.";
+ goto cleanup;
+ }
+
+ winpty_config_set_initial_size(cfg, ptyproc->width, ptyproc->height);
+ winpty_object = winpty_open(cfg, &err);
+ if (winpty_object == NULL) {
+ emsg = "Failed, winpty_open.";
+ goto cleanup;
+ }
+
+ status = utf16_to_utf8(winpty_conin_name(winpty_object), &in_name);
+ if (status != 0) {
+ emsg = "Failed to convert in_name from utf16 to utf8.";
+ goto cleanup;
+ }
+
+ status = utf16_to_utf8(winpty_conout_name(winpty_object), &out_name);
+ if (status != 0) {
+ emsg = "Failed to convert out_name from utf16 to utf8.";
+ goto cleanup;
+ }
+
+ if (!proc->in.closed) {
+ in_req = xmalloc(sizeof(uv_connect_t));
+ uv_pipe_connect(
+ in_req,
+ &proc->in.uv.pipe,
+ in_name,
+ pty_process_connect_cb);
+ }
+
+ if (!proc->out.closed) {
+ out_req = xmalloc(sizeof(uv_connect_t));
+ uv_pipe_connect(
+ out_req,
+ &proc->out.uv.pipe,
+ out_name,
+ pty_process_connect_cb);
+ }
+
+ if (proc->cwd != NULL) {
+ status = utf8_to_utf16(proc->cwd, &cwd);
+ if (status != 0) {
+ emsg = "Failed to convert pwd form utf8 to utf16.";
+ goto cleanup;
+ }
+ }
+
+ status = build_cmd_line(proc->argv, &cmd_line,
+ os_shell_is_cmdexe(proc->argv[0]));
+ if (status != 0) {
+ emsg = "Failed to convert cmd line form utf8 to utf16.";
+ goto cleanup;
+ }
+
+ spawncfg = winpty_spawn_config_new(
+ WINPTY_SPAWN_FLAG_AUTO_SHUTDOWN,
+ NULL, // Optional application name
+ cmd_line,
+ cwd,
+ NULL, // Optional environment variables
+ &err);
+ if (spawncfg == NULL) {
+ emsg = "Failed winpty_spawn_config_new.";
+ goto cleanup;
+ }
+
+ DWORD win_err = 0;
+ if (!winpty_spawn(winpty_object,
+ spawncfg,
+ &process_handle,
+ NULL, // Optional thread handle
+ &win_err,
+ &err)) {
+ if (win_err) {
+ status = (int)win_err;
+ emsg = "Failed spawn process.";
+ } else {
+ emsg = "Failed winpty_spawn.";
+ }
+ goto cleanup;
+ }
+ proc->pid = (int)GetProcessId(process_handle);
+
+ if (!RegisterWaitForSingleObject(
+ &ptyproc->finish_wait,
+ process_handle,
+ pty_process_finish1,
+ ptyproc,
+ INFINITE,
+ WT_EXECUTEDEFAULT | WT_EXECUTEONLYONCE)) {
+ abort();
+ }
+
+ // Wait until pty_process_connect_cb is called.
+ while ((in_req != NULL && in_req->handle != NULL)
+ || (out_req != NULL && out_req->handle != NULL)) {
+ uv_run(&proc->loop->uv, UV_RUN_ONCE);
+ }
+
+ ptyproc->winpty_object = winpty_object;
+ ptyproc->process_handle = process_handle;
+ winpty_object = NULL;
+ process_handle = NULL;
+
+cleanup:
+ if (status) {
+ // In the case of an error of MultiByteToWideChar or CreateProcessW.
+ ELOG("%s error code: %d", emsg, status);
+ status = os_translate_sys_error(status);
+ } else if (err != NULL) {
+ status = (int)winpty_error_code(err);
+ ELOG("%s error code: %d", emsg, status);
+ status = translate_winpty_error(status);
+ }
+ winpty_error_free(err);
+ winpty_config_free(cfg);
+ winpty_spawn_config_free(spawncfg);
+ winpty_free(winpty_object);
+ xfree(in_name);
+ xfree(out_name);
+ if (process_handle != NULL) {
+ CloseHandle(process_handle);
+ }
+ xfree(in_req);
+ xfree(out_req);
+ xfree(cmd_line);
+ xfree(cwd);
+ return status;
+}
+
+const char *pty_process_tty_name(PtyProcess *ptyproc)
+{
+ return "?";
+}
+
+void pty_process_resize(PtyProcess *ptyproc, uint16_t width,
+ uint16_t height)
+ FUNC_ATTR_NONNULL_ALL
+{
+ if (ptyproc->winpty_object != NULL) {
+ winpty_set_size(ptyproc->winpty_object, width, height, NULL);
+ }
+}
+
+void pty_process_close(PtyProcess *ptyproc)
+ FUNC_ATTR_NONNULL_ALL
+{
+ Process *proc = (Process *)ptyproc;
+
+ pty_process_close_master(ptyproc);
+
+ if (proc->internal_close_cb) {
+ proc->internal_close_cb(proc);
+ }
+}
+
+void pty_process_close_master(PtyProcess *ptyproc)
+ FUNC_ATTR_NONNULL_ALL
+{
+ if (ptyproc->winpty_object != NULL) {
+ winpty_free(ptyproc->winpty_object);
+ ptyproc->winpty_object = NULL;
+ }
+}
+
+void pty_process_teardown(Loop *loop)
+ FUNC_ATTR_NONNULL_ALL
+{
+}
+
+static void pty_process_connect_cb(uv_connect_t *req, int status)
+ FUNC_ATTR_NONNULL_ALL
+{
+ assert(status == 0);
+ req->handle = NULL;
+}
+
+static void wait_eof_timer_cb(uv_timer_t *wait_eof_timer)
+ FUNC_ATTR_NONNULL_ALL
+{
+ PtyProcess *ptyproc = wait_eof_timer->data;
+ Process *proc = (Process *)ptyproc;
+
+ if (proc->out.closed || !uv_is_readable(proc->out.uvstream)) {
+ uv_timer_stop(&ptyproc->wait_eof_timer);
+ pty_process_finish2(ptyproc);
+ }
+}
+
+static void pty_process_finish2(PtyProcess *ptyproc)
+ FUNC_ATTR_NONNULL_ALL
+{
+ Process *proc = (Process *)ptyproc;
+
+ UnregisterWaitEx(ptyproc->finish_wait, NULL);
+ uv_close((uv_handle_t *)&ptyproc->wait_eof_timer, NULL);
+
+ DWORD exit_code = 0;
+ GetExitCodeProcess(ptyproc->process_handle, &exit_code);
+ proc->status = (int)exit_code;
+
+ CloseHandle(ptyproc->process_handle);
+ ptyproc->process_handle = NULL;
+
+ proc->internal_exit_cb(proc);
+}
+
+/// Build the command line to pass to CreateProcessW.
+///
+/// @param[in] argv Array with string arguments.
+/// @param[out] cmd_line Location where saved builded cmd line.
+///
+/// @returns zero on success, or error code of MultiByteToWideChar function.
+///
+static int build_cmd_line(char **argv, wchar_t **cmd_line, bool is_cmdexe)
+ FUNC_ATTR_NONNULL_ALL
+{
+ size_t utf8_cmd_line_len = 0;
+ size_t argc = 0;
+ QUEUE args_q;
+
+ QUEUE_INIT(&args_q);
+ while (*argv) {
+ size_t buf_len = is_cmdexe ? (strlen(*argv) + 1) : (strlen(*argv) * 2 + 3);
+ ArgNode *arg_node = xmalloc(sizeof(*arg_node));
+ arg_node->arg = xmalloc(buf_len);
+ if (is_cmdexe) {
+ xstrlcpy(arg_node->arg, *argv, buf_len);
+ } else {
+ quote_cmd_arg(arg_node->arg, buf_len, *argv);
+ }
+ utf8_cmd_line_len += strlen(arg_node->arg);
+ QUEUE_INIT(&arg_node->node);
+ QUEUE_INSERT_TAIL(&args_q, &arg_node->node);
+ argc++;
+ argv++;
+ }
+
+ utf8_cmd_line_len += argc;
+ char *utf8_cmd_line = xmalloc(utf8_cmd_line_len);
+ *utf8_cmd_line = NUL;
+ while (1) {
+ QUEUE *head = QUEUE_HEAD(&args_q);
+ QUEUE_REMOVE(head);
+ ArgNode *arg_node = QUEUE_DATA(head, ArgNode, node);
+ xstrlcat(utf8_cmd_line, arg_node->arg, utf8_cmd_line_len);
+ xfree(arg_node->arg);
+ xfree(arg_node);
+ if (QUEUE_EMPTY(&args_q)) {
+ break;
+ } else {
+ xstrlcat(utf8_cmd_line, " ", utf8_cmd_line_len);
+ }
+ }
+
+ int result = utf8_to_utf16(utf8_cmd_line, cmd_line);
+ xfree(utf8_cmd_line);
+ return result;
+}
+
+/// Emulate quote_cmd_arg of libuv and quotes command line argument.
+/// Most of the code came from libuv.
+///
+/// @param[out] dest Location where saved quotes argument.
+/// @param dest_remaining Destination buffer size.
+/// @param[in] src Pointer to argument.
+///
+static void quote_cmd_arg(char *dest, size_t dest_remaining, const char *src)
+ FUNC_ATTR_NONNULL_ALL
+{
+ size_t src_len = strlen(src);
+ bool quote_hit = true;
+ char *start = dest;
+
+ if (src_len == 0) {
+ // Need double quotation for empty argument.
+ snprintf(dest, dest_remaining, "\"\"");
+ return;
+ }
+
+ if (NULL == strpbrk(src, " \t\"")) {
+ // No quotation needed.
+ xstrlcpy(dest, src, dest_remaining);
+ return;
+ }
+
+ if (NULL == strpbrk(src, "\"\\")) {
+ // No embedded double quotes or backlashes, so I can just wrap quote marks.
+ // around the whole thing.
+ snprintf(dest, dest_remaining, "\"%s\"", src);
+ return;
+ }
+
+ // Expected input/output:
+ // input : 'hello"world'
+ // output: '"hello\"world"'
+ // input : 'hello""world'
+ // output: '"hello\"\"world"'
+ // input : 'hello\world'
+ // output: 'hello\world'
+ // input : 'hello\\world'
+ // output: 'hello\\world'
+ // input : 'hello\"world'
+ // output: '"hello\\\"world"'
+ // input : 'hello\\"world'
+ // output: '"hello\\\\\"world"'
+ // input : 'hello world\'
+ // output: '"hello world\\"'
+
+ assert(dest_remaining--);
+ *(dest++) = NUL;
+ assert(dest_remaining--);
+ *(dest++) = '"';
+ for (size_t i = src_len; i > 0; i--) {
+ assert(dest_remaining--);
+ *(dest++) = src[i - 1];
+ if (quote_hit && src[i - 1] == '\\') {
+ assert(dest_remaining--);
+ *(dest++) = '\\';
+ } else if (src[i - 1] == '"') {
+ quote_hit = true;
+ assert(dest_remaining--);
+ *(dest++) = '\\';
+ } else {
+ quote_hit = false;
+ }
+ }
+ assert(dest_remaining);
+ *dest = '"';
+
+ while (start < dest) {
+ char tmp = *start;
+ *start = *dest;
+ *dest = tmp;
+ start++;
+ dest--;
+ }
+}
+
+/// Translate winpty error code to libuv error.
+///
+/// @param[in] winpty_errno Winpty error code returned by winpty_error_code
+/// function.
+///
+/// @returns Error code of libuv error.
+int translate_winpty_error(int winpty_errno)
+{
+ if (winpty_errno <= 0) {
+ return winpty_errno; // If < 0 then it's already a libuv error.
+ }
+
+ switch (winpty_errno) {
+ case WINPTY_ERROR_OUT_OF_MEMORY: return UV_ENOMEM;
+ case WINPTY_ERROR_SPAWN_CREATE_PROCESS_FAILED: return UV_EAI_FAIL;
+ case WINPTY_ERROR_LOST_CONNECTION: return UV_ENOTCONN;
+ case WINPTY_ERROR_AGENT_EXE_MISSING: return UV_ENOENT;
+ case WINPTY_ERROR_UNSPECIFIED: return UV_UNKNOWN;
+ case WINPTY_ERROR_AGENT_DIED: return UV_ESRCH;
+ case WINPTY_ERROR_AGENT_TIMEOUT: return UV_ETIMEDOUT;
+ case WINPTY_ERROR_AGENT_CREATION_FAILED: return UV_EAI_FAIL;
+ default: return UV_UNKNOWN;
+ }
+}
diff --git a/src/nvim/os/pty_process_win.h b/src/nvim/os/pty_process_win.h
index 20cc589925..1a4019e654 100644
--- a/src/nvim/os/pty_process_win.h
+++ b/src/nvim/os/pty_process_win.h
@@ -1,19 +1,27 @@
#ifndef NVIM_OS_PTY_PROCESS_WIN_H
#define NVIM_OS_PTY_PROCESS_WIN_H
-#include "nvim/event/libuv_process.h"
+#include <uv.h>
+#include <winpty.h>
+
+#include "nvim/event/process.h"
+#include "nvim/lib/queue.h"
typedef struct pty_process {
Process process;
char *term_name;
uint16_t width, height;
+ winpty_t *winpty_object;
+ HANDLE finish_wait;
+ HANDLE process_handle;
+ uv_timer_t wait_eof_timer;
} PtyProcess;
-#define pty_process_spawn(job) libuv_process_spawn((LibuvProcess *)job)
-#define pty_process_close(job) libuv_process_close((LibuvProcess *)job)
-#define pty_process_close_master(job) libuv_process_close((LibuvProcess *)job)
-#define pty_process_resize(job, width, height)
-#define pty_process_teardown(loop)
+// Structure used by build_cmd_line()
+typedef struct arg_node {
+ char *arg; // pointer to argument.
+ QUEUE node; // QUEUE structure.
+} ArgNode;
static inline PtyProcess pty_process_init(Loop *loop, void *data)
{
@@ -22,7 +30,14 @@ static inline PtyProcess pty_process_init(Loop *loop, void *data)
rv.term_name = NULL;
rv.width = 80;
rv.height = 24;
+ rv.winpty_object = NULL;
+ rv.finish_wait = NULL;
+ rv.process_handle = NULL;
return rv;
}
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "os/pty_process_win.h.generated.h"
+#endif
+
#endif // NVIM_OS_PTY_PROCESS_WIN_H
diff --git a/src/nvim/os/shell.c b/src/nvim/os/shell.c
index 64c673930a..19d199f4d5 100644
--- a/src/nvim/os/shell.c
+++ b/src/nvim/os/shell.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <string.h>
#include <assert.h>
#include <stdbool.h>
@@ -19,14 +22,15 @@
#include "nvim/message.h"
#include "nvim/memory.h"
#include "nvim/ui.h"
-#include "nvim/misc2.h"
#include "nvim/screen.h"
#include "nvim/memline.h"
#include "nvim/option_defs.h"
#include "nvim/charset.h"
#include "nvim/strings.h"
-#define DYNAMIC_BUFFER_INIT {NULL, 0, 0}
+#define DYNAMIC_BUFFER_INIT { NULL, 0, 0 }
+#define NS_1_SECOND 1000000000U // 1 second, in nanoseconds
+#define OUT_DATA_THRESHOLD 1024 * 10U // 10KB, "a few screenfuls" of data.
typedef struct {
char *data;
@@ -38,14 +42,15 @@ typedef struct {
#endif
/// Builds the argument vector for running the user-configured 'shell' (p_sh)
-/// with an optional command prefixed by 'shellcmdflag' (p_shcf).
+/// with an optional command prefixed by 'shellcmdflag' (p_shcf). E.g.:
+///
+/// ["shell", "-extra_args", "-shellcmdflag", "command with spaces"]
///
/// @param cmd Command string, or NULL to run an interactive shell.
/// @param extra_args Extra arguments to the shell, or NULL.
-/// @return A newly allocated argument vector. It must be freed with
-/// `shell_free_argv` when no longer needed.
+/// @return Newly allocated argument vector. Must be freed with shell_free_argv.
char **shell_build_argv(const char *cmd, const char *extra_args)
- FUNC_ATTR_NONNULL_RET FUNC_ATTR_MALLOC
+ FUNC_ATTR_NONNULL_RET
{
size_t argc = tokenize(p_sh, NULL) + (cmd ? tokenize(p_shcf, NULL) : 0);
char **rv = xmalloc((argc + 4) * sizeof(*rv));
@@ -54,12 +59,12 @@ char **shell_build_argv(const char *cmd, const char *extra_args)
size_t i = tokenize(p_sh, rv);
if (extra_args) {
- rv[i++] = xstrdup(extra_args); // Push a copy of `extra_args`
+ rv[i++] = xstrdup(extra_args); // Push a copy of `extra_args`
}
if (cmd) {
- i += tokenize(p_shcf, rv + i); // Split 'shellcmdflag'
- rv[i++] = xstrdup(cmd); // Push a copy of the command.
+ i += tokenize(p_shcf, rv + i); // Split 'shellcmdflag'
+ rv[i++] = shell_xescape_xquote(cmd); // Copy (and escape) `cmd`.
}
rv[i] = NULL;
@@ -75,27 +80,61 @@ char **shell_build_argv(const char *cmd, const char *extra_args)
void shell_free_argv(char **argv)
{
char **p = argv;
-
if (p == NULL) {
// Nothing was allocated, return
return;
}
-
while (*p != NULL) {
// Free each argument
xfree(*p);
p++;
}
-
xfree(argv);
}
+/// Joins shell arguments from `argv` into a new string.
+/// If the result is too long it is truncated with ellipsis ("...").
+///
+/// @returns[allocated] `argv` joined to a string.
+char *shell_argv_to_str(char **const argv)
+ FUNC_ATTR_NONNULL_ALL
+{
+ size_t n = 0;
+ char **p = argv;
+ char *rv = xcalloc(256, sizeof(*rv));
+ const size_t maxsize = (256 * sizeof(*rv));
+ if (*p == NULL) {
+ return rv;
+ }
+ while (*p != NULL) {
+ xstrlcat(rv, "'", maxsize);
+ xstrlcat(rv, *p, maxsize);
+ n = xstrlcat(rv, "' ", maxsize);
+ if (n >= maxsize) {
+ break;
+ }
+ p++;
+ }
+ if (n < maxsize) {
+ rv[n - 1] = '\0';
+ } else {
+ // Command too long, show ellipsis: "/bin/bash 'foo' 'bar'..."
+ rv[maxsize - 4] = '.';
+ rv[maxsize - 3] = '.';
+ rv[maxsize - 2] = '.';
+ rv[maxsize - 1] = '\0';
+ }
+ return rv;
+}
+
/// Calls the user-configured 'shell' (p_sh) for running a command or wildcard
/// expansion.
///
/// @param cmd The command to execute, or NULL to run an interactive shell.
/// @param opts Options that control how the shell will work.
/// @param extra_args Extra arguments to the shell, or NULL.
+///
+/// @return shell command exit code
int os_call_shell(char_u *cmd, ShellOpts opts, char_u *extra_args)
{
DynamicBuffer input = DYNAMIC_BUFFER_INIT;
@@ -118,36 +157,33 @@ int os_call_shell(char_u *cmd, ShellOpts opts, char_u *extra_args)
if (opts & kShellOptRead) {
output_ptr = &output;
forward_output = false;
+ } else if (opts & kShellOptDoOut) {
+ // Caller has already redirected output
+ forward_output = false;
}
}
size_t nread;
-
- int status = do_os_system(shell_build_argv((char *)cmd, (char *)extra_args),
- input.data,
- input.len,
- output_ptr,
- &nread,
- emsg_silent,
- forward_output);
-
+ int exitcode = do_os_system(shell_build_argv((char *)cmd, (char *)extra_args),
+ input.data, input.len, output_ptr, &nread,
+ emsg_silent, forward_output);
xfree(input.data);
if (output) {
- (void)write_output(output, nread, true, true);
+ (void)write_output(output, nread, true);
xfree(output);
}
- if (!emsg_silent && status != 0 && !(opts & kShellOptSilent)) {
+ if (!emsg_silent && exitcode != 0 && !(opts & kShellOptSilent)) {
MSG_PUTS(_("\nshell returned "));
- msg_outnum(status);
+ msg_outnum(exitcode);
msg_putchar('\n');
}
State = current_state;
signal_accept_deadly();
- return status;
+ return exitcode;
}
/// os_system - synchronously execute a command in the shell
@@ -156,14 +192,14 @@ int os_call_shell(char_u *cmd, ShellOpts opts, char_u *extra_args)
/// char *output = NULL;
/// size_t nread = 0;
/// char *argv[] = {"ls", "-la", NULL};
-/// int status = os_sytem(argv, NULL, 0, &output, &nread);
+/// int exitcode = os_sytem(argv, NULL, 0, &output, &nread);
///
/// @param argv The commandline arguments to be passed to the shell. `argv`
/// will be consumed.
/// @param input The input to the shell (NULL for no input), passed to the
/// stdin of the resulting process.
/// @param len The length of the input buffer (not used if `input` == NULL)
-/// @param[out] output A pointer to to a location where the output will be
+/// @param[out] output Pointer to a location where the output will be
/// allocated and stored. Will point to NULL if the shell
/// command did not output anything. If NULL is passed,
/// the shell output will be ignored.
@@ -188,6 +224,10 @@ static int do_os_system(char **argv,
bool silent,
bool forward_output)
{
+ out_data_decide_throttle(0); // Initialize throttle decider.
+ out_data_ring(NULL, 0); // Initialize output ring-buffer.
+ bool has_input = (input != NULL && input[0] != '\0');
+
// the output buffer
DynamicBuffer buf = DYNAMIC_BUFFER_INIT;
stream_read_cb data_cb = system_data_cb;
@@ -205,60 +245,74 @@ static int do_os_system(char **argv,
char prog[MAXPATHL];
xstrlcpy(prog, argv[0], MAXPATHL);
- Stream in, out, err;
LibuvProcess uvproc = libuv_process_init(&main_loop, &buf);
Process *proc = &uvproc.process;
- Queue *events = queue_new_child(main_loop.events);
+ MultiQueue *events = multiqueue_new_child(main_loop.events);
proc->events = events;
proc->argv = argv;
- proc->in = input != NULL ? &in : NULL;
- proc->out = &out;
- proc->err = &err;
- if (!process_spawn(proc)) {
+ int status = process_spawn(proc, has_input, true, true);
+ if (status) {
loop_poll_events(&main_loop, 0);
- // Failed, probably due to `sh` not being executable
+ // Failed, probably 'shell' is not executable.
if (!silent) {
- MSG_PUTS(_("\nCannot execute "));
+ MSG_PUTS(_("\nshell failed to start: "));
+ msg_outtrans((char_u *)os_strerror(status));
+ MSG_PUTS(": ");
msg_outtrans((char_u *)prog);
msg_putchar('\n');
}
- queue_free(events);
+ multiqueue_free(events);
return -1;
}
- // We want to deal with stream events as fast a possible while queueing
- // process events, so reset everything to NULL. It prevents closing the
- // streams while there's still data in the OS buffer(due to the process
+ // Note: unlike process events, stream events are not queued, as we want to
+ // deal with stream events as fast a possible. It prevents closing the
+ // streams while there's still data in the OS buffer (due to the process
// exiting before all data is read).
- if (input != NULL) {
- proc->in->events = NULL;
- wstream_init(proc->in, 0);
+ if (has_input) {
+ wstream_init(&proc->in, 0);
}
- proc->out->events = NULL;
- rstream_init(proc->out, 0);
- rstream_start(proc->out, data_cb);
- proc->err->events = NULL;
- rstream_init(proc->err, 0);
- rstream_start(proc->err, data_cb);
+ rstream_init(&proc->out, 0);
+ rstream_start(&proc->out, data_cb, &buf);
+ rstream_init(&proc->err, 0);
+ rstream_start(&proc->err, data_cb, &buf);
// write the input, if any
- if (input) {
- WBuffer *input_buffer = wstream_new_buffer((char *) input, len, 1, NULL);
+ if (has_input) {
+ WBuffer *input_buffer = wstream_new_buffer((char *)input, len, 1, NULL);
- if (!wstream_write(&in, input_buffer)) {
+ if (!wstream_write(&proc->in, input_buffer)) {
// couldn't write, stop the process and tell the user about it
process_stop(proc);
return -1;
}
// close the input stream after everything is written
- wstream_set_write_cb(&in, shell_write_cb);
+ wstream_set_write_cb(&proc->in, shell_write_cb, NULL);
}
- // invoke busy_start here so event_poll_until wont change the busy state for
- // the UI
+ // Invoke busy_start here so LOOP_PROCESS_EVENTS_UNTIL will not change the
+ // busy state.
ui_busy_start();
ui_flush();
- int status = process_wait(proc, -1, NULL);
+ if (forward_output) {
+ msg_sb_eol();
+ msg_start();
+ msg_no_more = true;
+ lines_left = -1;
+ }
+ int exitcode = process_wait(proc, -1, NULL);
+ if (!got_int && out_data_decide_throttle(0)) {
+ // Last chunk of output was skipped; display it now.
+ out_data_ring(NULL, SIZE_MAX);
+ }
+ if (forward_output) {
+ // caller should decide if wait_return is invoked
+ no_wait_return++;
+ msg_end();
+ no_wait_return--;
+ msg_no_more = false;
+ }
+
ui_busy_stop();
// prepare the out parameters if requested
@@ -278,10 +332,10 @@ static int do_os_system(char **argv,
}
}
- assert(queue_empty(events));
- queue_free(events);
+ assert(multiqueue_empty(events));
+ multiqueue_free(events);
- return status;
+ return exitcode;
}
/// - ensures at least `desired` bytes in buffer
@@ -310,71 +364,178 @@ static void system_data_cb(Stream *stream, RBuffer *buf, size_t count,
dbuf->len += nread;
}
-/// Continue to append data to last screen line.
+/// Tracks output received for the current executing shell command, and displays
+/// a pulsing "..." when output should be skipped. Tracking depends on the
+/// synchronous/blocking nature of ":!".
///
-/// @param output Data to append to screen lines.
-/// @param remaining Size of data.
-/// @param new_line If true, next data output will be on a new line.
-static void append_to_screen_end(char *output, size_t remaining, bool new_line)
+/// Purpose:
+/// 1. CTRL-C is more responsive. #1234 #5396
+/// 2. Improves performance of :! (UI, esp. TUI, is the bottleneck).
+/// 3. Avoids OOM during long-running, spammy :!.
+///
+/// Vim does not need this hack because:
+/// 1. :! in terminal-Vim runs in cooked mode, so CTRL-C is caught by the
+/// terminal and raises SIGINT out-of-band.
+/// 2. :! in terminal-Vim uses a tty (Nvim uses pipes), so commands
+/// (e.g. `git grep`) may page themselves.
+///
+/// @param size Length of data, used with internal state to decide whether
+/// output should be skipped. size=0 resets the internal state and
+/// returns the previous decision.
+///
+/// @returns true if output should be skipped and pulse was displayed.
+/// Returns the previous decision if size=0.
+static bool out_data_decide_throttle(size_t size)
{
- // Column of last row to start appending data to.
- static colnr_T last_col = 0;
+ static uint64_t started = 0; // Start time of the current throttle.
+ static size_t received = 0; // Bytes observed since last throttle.
+ static size_t visit = 0; // "Pulse" count of the current throttle.
+ static char pulse_msg[] = { ' ', ' ', ' ', '\0' };
+
+ if (!size) {
+ bool previous_decision = (visit > 0);
+ started = received = visit = 0;
+ return previous_decision;
+ }
- size_t off = 0;
- int last_row = (int)Rows - 1;
+ received += size;
+ if (received < OUT_DATA_THRESHOLD
+ // Display at least the first chunk of output even if it is big.
+ || (!started && received < size + 1000)) {
+ return false;
+ } else if (!visit) {
+ started = os_hrtime();
+ } else if (visit % 20 == 0) {
+ uint64_t since = os_hrtime() - started;
+ if (since > (3 * NS_1_SECOND)) {
+ received = visit = 0;
+ return false;
+ }
+ }
- while (off < remaining) {
- // Found end of line?
- if (output[off] == NL) {
- // Can we start a new line or do we need to continue the last one?
- if (last_col == 0) {
- screen_del_lines(0, 0, 1, (int)Rows, NULL);
- }
- screen_puts_len((char_u *)output, (int)off, last_row, last_col, 0);
- last_col = 0;
+ visit++;
+ // Pulse "..." at the bottom of the screen.
+ size_t tick = (visit % 20 == 0)
+ ? 3 // Force all dots "..." on last visit.
+ : (visit % 4);
+ pulse_msg[0] = (tick == 0) ? ' ' : '.';
+ pulse_msg[1] = (tick == 0 || 1 == tick) ? ' ' : '.';
+ pulse_msg[2] = (tick == 0 || 1 == tick || 2 == tick) ? ' ' : '.';
+ if (visit == 1) {
+ msg_putchar('\n');
+ }
+ msg_putchar('\r'); // put cursor at start of line
+ msg_puts(pulse_msg);
+ ui_flush();
+ return true;
+}
- size_t skip = off + 1;
- output += skip;
- remaining -= skip;
- off = 0;
- continue;
- }
+/// Saves output in a quasi-ringbuffer. Used to ensure the last ~page of
+/// output for a shell-command is always displayed.
+///
+/// Init mode: Resets the internal state.
+/// output = NULL
+/// size = 0
+/// Print mode: Displays the current saved data.
+/// output = NULL
+/// size = SIZE_MAX
+///
+/// @param output Data to save, or NULL to invoke a special mode.
+/// @param size Length of `output`.
+static void out_data_ring(char *output, size_t size)
+{
+#define MAX_CHUNK_SIZE (OUT_DATA_THRESHOLD / 2)
+ static char last_skipped[MAX_CHUNK_SIZE]; // Saved output.
+ static size_t last_skipped_len = 0;
- // Translate NUL to SOH
- if (output[off] == NUL) {
- output[off] = 1;
- }
+ assert(output != NULL || (size == 0 || size == SIZE_MAX));
- off++;
+ if (output == NULL && size == 0) { // Init mode
+ last_skipped_len = 0;
+ return;
+ }
+
+ if (output == NULL && size == SIZE_MAX) { // Print mode
+ out_data_append_to_screen(last_skipped, &last_skipped_len, true);
+ return;
}
- if (remaining) {
- if (last_col == 0) {
- screen_del_lines(0, 0, 1, (int)Rows, NULL);
+ // This is basically a ring-buffer...
+ if (size >= MAX_CHUNK_SIZE) { // Save mode
+ size_t start = size - MAX_CHUNK_SIZE;
+ memcpy(last_skipped, output + start, MAX_CHUNK_SIZE);
+ last_skipped_len = MAX_CHUNK_SIZE;
+ } else if (size > 0) {
+ // Length of the old data that can be kept.
+ size_t keep_len = MIN(last_skipped_len, MAX_CHUNK_SIZE - size);
+ size_t keep_start = last_skipped_len - keep_len;
+ // Shift the kept part of the old data to the start.
+ if (keep_start) {
+ memmove(last_skipped, last_skipped + keep_start, keep_len);
}
- screen_puts_len((char_u *)output, (int)remaining, last_row, last_col, 0);
- last_col += (colnr_T)remaining;
+ // Copy the entire new data to the remaining space.
+ memcpy(last_skipped + keep_len, output, size);
+ last_skipped_len = keep_len + size;
}
+}
+
+/// Continue to append data to last screen line.
+///
+/// @param output Data to append to screen lines.
+/// @param remaining Size of data.
+/// @param new_line If true, next data output will be on a new line.
+static void out_data_append_to_screen(char *output, size_t *count, bool eof)
+ FUNC_ATTR_NONNULL_ALL
+{
+ char *p = output, *end = output + *count;
+ while (p < end) {
+ if (*p == '\n' || *p == '\r' || *p == TAB || *p == BELL) {
+ msg_putchar_attr((uint8_t)(*p), 0);
+ p++;
+ } else {
+ // Note: this is not 100% precise:
+ // 1. we don't check if received continuation bytes are already invalid
+ // and we thus do some buffering that could be avoided
+ // 2. we don't compose chars over buffer boundaries, even if we see an
+ // incomplete UTF-8 sequence that could be composing with the last
+ // complete sequence.
+ // This will be corrected when we switch to vterm based implementation
+ int i = *p ? utfc_ptr2len_len((char_u *)p, (int)(end-p)) : 1;
+ if (!eof && i == 1 && utf8len_tab_zero[*(uint8_t *)p] > (end-p)) {
+ *count = (size_t)(p - output);
+ goto end;
+ }
- if (new_line) {
- last_col = 0;
+ (void)msg_outtrans_len_attr((char_u *)p, i, 0);
+ p += i;
+ }
}
+end:
ui_flush();
}
static void out_data_cb(Stream *stream, RBuffer *buf, size_t count, void *data,
bool eof)
{
- // We always output the whole buffer, so the buffer can never
- // wrap around.
size_t cnt;
char *ptr = rbuffer_read_ptr(buf, &cnt);
- append_to_screen_end(ptr, cnt, eof);
+ if (ptr != NULL && cnt > 0
+ && out_data_decide_throttle(cnt)) { // Skip output above a threshold.
+ // Save the skipped output. If it is the final chunk, we display it later.
+ out_data_ring(ptr, cnt);
+ } else if (ptr != NULL) {
+ out_data_append_to_screen(ptr, &cnt, eof);
+ }
+
if (cnt) {
rbuffer_consumed(buf, cnt);
}
+
+ // Move remaining data to start of buffer, so the buffer can never
+ // wrap around.
+ rbuffer_reset(buf);
}
/// Parses a command string into a sequence of words, taking quotes into
@@ -463,14 +624,10 @@ static void read_input(DynamicBuffer *buf)
if (len == l) {
// Finished a line, add a NL, unless this line should not have one.
- // FIXME need to make this more readable
if (lnum != curbuf->b_op_end.lnum
- || (!curbuf->b_p_bin
- && curbuf->b_p_fixeol)
+ || (!curbuf->b_p_bin && curbuf->b_p_fixeol)
|| (lnum != curbuf->b_no_eol_lnum
- && (lnum !=
- curbuf->b_ml.ml_line_count
- || curbuf->b_p_eol))) {
+ && (lnum != curbuf->b_ml.ml_line_count || curbuf->b_p_eol))) {
dynamic_buffer_ensure(buf, buf->len + 1);
buf->data[buf->len++] = NL;
}
@@ -486,28 +643,20 @@ static void read_input(DynamicBuffer *buf)
}
}
-static size_t write_output(char *output, size_t remaining, bool to_buffer,
- bool eof)
+static size_t write_output(char *output, size_t remaining, bool eof)
{
if (!output) {
return 0;
}
- char replacement_NUL = to_buffer ? NL : 1;
char *start = output;
size_t off = 0;
- int lastrow = (int)Rows - 1;
while (off < remaining) {
if (output[off] == NL) {
// Insert the line
- if (to_buffer) {
- output[off] = NUL;
- ml_append(curwin->w_cursor.lnum++, (char_u *)output, (int)off + 1,
- false);
- } else {
- screen_del_lines(0, 0, 1, (int)Rows, NULL);
- screen_puts_len((char_u *)output, (int)off, lastrow, 0, 0);
- }
+ output[off] = NUL;
+ ml_append(curwin->w_cursor.lnum++, (char_u *)output, (int)off + 1,
+ false);
size_t skip = off + 1;
output += skip;
remaining -= skip;
@@ -517,24 +666,19 @@ static size_t write_output(char *output, size_t remaining, bool to_buffer,
if (output[off] == NUL) {
// Translate NUL to NL
- output[off] = replacement_NUL;
+ output[off] = NL;
}
off++;
}
if (eof) {
if (remaining) {
- if (to_buffer) {
- // append unfinished line
- ml_append(curwin->w_cursor.lnum++, (char_u *)output, 0, false);
- // remember that the NL was missing
- curbuf->b_no_eol_lnum = curwin->w_cursor.lnum;
- } else {
- screen_del_lines(0, 0, 1, (int)Rows, NULL);
- screen_puts_len((char_u *)output, (int)remaining, lastrow, 0, 0);
- }
+ // append unfinished line
+ ml_append(curwin->w_cursor.lnum++, (char_u *)output, 0, false);
+ // remember that the NL was missing
+ curbuf->b_no_eol_lnum = curwin->w_cursor.lnum;
output += remaining;
- } else if (to_buffer) {
+ } else {
curbuf->b_no_eol_lnum = 0;
}
}
@@ -546,5 +690,47 @@ static size_t write_output(char *output, size_t remaining, bool to_buffer,
static void shell_write_cb(Stream *stream, void *data, int status)
{
- stream_close(stream, NULL);
+ if (status) {
+ // Can happen if system() tries to send input to a shell command that was
+ // backgrounded (:call system("cat - &", "foo")). #3529 #5241
+ msg_schedule_emsgf(_("E5677: Error writing input to shell-command: %s"),
+ uv_err_name(status));
+ }
+ stream_close(stream, NULL, NULL);
+}
+
+/// Applies 'shellxescape' (p_sxe) and 'shellxquote' (p_sxq) to a command.
+///
+/// @param cmd Command string
+/// @return Escaped/quoted command string (allocated).
+static char *shell_xescape_xquote(const char *cmd)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_MALLOC FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ if (*p_sxq == NUL) {
+ return xstrdup(cmd);
+ }
+
+ const char *ecmd = cmd;
+ if (*p_sxe != NUL && STRCMP(p_sxq, "(") == 0) {
+ ecmd = (char *)vim_strsave_escaped_ext((char_u *)cmd, p_sxe, '^', false);
+ }
+ size_t ncmd_size = strlen(ecmd) + STRLEN(p_sxq) * 2 + 1;
+ char *ncmd = xmalloc(ncmd_size);
+
+ // When 'shellxquote' is ( append ).
+ // When 'shellxquote' is "( append )".
+ if (STRCMP(p_sxq, "(") == 0) {
+ vim_snprintf(ncmd, ncmd_size, "(%s)", ecmd);
+ } else if (STRCMP(p_sxq, "\"(") == 0) {
+ vim_snprintf(ncmd, ncmd_size, "\"(%s)\"", ecmd);
+ } else {
+ vim_snprintf(ncmd, ncmd_size, "%s%s%s", p_sxq, ecmd, p_sxq);
+ }
+
+ if (ecmd != cmd) {
+ xfree((void *)ecmd);
+ }
+
+ return ncmd;
}
+
diff --git a/src/nvim/os/shell.h b/src/nvim/os/shell.h
index 58960db157..48503f2601 100644
--- a/src/nvim/os/shell.h
+++ b/src/nvim/os/shell.h
@@ -1,6 +1,8 @@
#ifndef NVIM_OS_SHELL_H
#define NVIM_OS_SHELL_H
+#include <stdio.h>
+
#include "nvim/types.h"
// Flags for os_call_shell() second argument
diff --git a/src/nvim/os/signal.c b/src/nvim/os/signal.c
index 4abc9cfc36..fc7f9cefd1 100644
--- a/src/nvim/os/signal.c
+++ b/src/nvim/os/signal.c
@@ -1,9 +1,16 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <stdbool.h>
#include <uv.h>
+#ifndef WIN32
+# include <signal.h> // for sigset_t
+#endif
#include "nvim/ascii.h"
+#include "nvim/log.h"
#include "nvim/vim.h"
#include "nvim/globals.h"
#include "nvim/memline.h"
@@ -11,7 +18,6 @@
#include "nvim/main.h"
#include "nvim/memory.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/event/signal.h"
#include "nvim/os/signal.h"
#include "nvim/event/loop.h"
@@ -29,6 +35,16 @@ static bool rejecting_deadly;
void signal_init(void)
{
+#ifndef WIN32
+ // Ensure a clean slate by unblocking all signals. For example, if SIGCHLD is
+ // blocked, libuv may hang after spawning a subprocess on Linux. #5230
+ sigset_t mask;
+ sigemptyset(&mask);
+ if (pthread_sigmask(SIG_SETMASK, &mask, NULL) != 0) {
+ ELOG("Could not unblock signals, nvim might behave strangely.");
+ }
+#endif
+
signal_watcher_init(&main_loop, &spipe, NULL);
signal_watcher_init(&main_loop, &shup, NULL);
signal_watcher_init(&main_loop, &squit, NULL);
@@ -129,7 +145,7 @@ static void on_signal(SignalWatcher *handle, int signum, void *data)
case SIGPWR:
// Signal of a power failure(eg batteries low), flush the swap files to
// be safe
- ml_sync_all(false, false);
+ ml_sync_all(false, false, true);
break;
#endif
#ifdef SIGPIPE
@@ -147,7 +163,7 @@ static void on_signal(SignalWatcher *handle, int signum, void *data)
}
break;
default:
- fprintf(stderr, "Invalid signal %d", signum);
+ ELOG("invalid signal: %d", signum);
break;
}
}
diff --git a/src/nvim/os/stdpaths.c b/src/nvim/os/stdpaths.c
index 81ceb919c4..f6503dfdb0 100644
--- a/src/nvim/os/stdpaths.c
+++ b/src/nvim/os/stdpaths.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <stdbool.h>
#include "nvim/os/stdpaths_defs.h"
@@ -16,20 +19,29 @@ static const char *xdg_env_vars[] = {
[kXDGDataDirs] = "XDG_DATA_DIRS",
};
+#ifdef WIN32
+static const char *const xdg_defaults_env_vars[] = {
+ [kXDGConfigHome] = "LOCALAPPDATA",
+ [kXDGDataHome] = "LOCALAPPDATA",
+ [kXDGCacheHome] = "TEMP",
+ [kXDGRuntimeDir] = NULL,
+ [kXDGConfigDirs] = NULL,
+ [kXDGDataDirs] = NULL,
+};
+#endif
+
/// Defaults for XDGVarType values
///
/// Used in case environment variables contain nothing. Need to be expanded.
static const char *const xdg_defaults[] = {
#ifdef WIN32
- // Windows
- [kXDGConfigHome] = "$LOCALAPPDATA",
- [kXDGDataHome] = "$LOCALAPPDATA",
- [kXDGCacheHome] = "$TEMP",
+ [kXDGConfigHome] = "~\\AppData\\Local",
+ [kXDGDataHome] = "~\\AppData\\Local",
+ [kXDGCacheHome] = "~\\AppData\\Local\\Temp",
[kXDGRuntimeDir] = NULL,
[kXDGConfigDirs] = NULL,
[kXDGDataDirs] = NULL,
#else
- // Linux, BSD, CYGWIN, Apple
[kXDGConfigHome] = "~/.config",
[kXDGDataHome] = "~/.local/share",
[kXDGCacheHome] = "~/.cache",
@@ -50,12 +62,19 @@ char *stdpaths_get_xdg_var(const XDGVarType idx)
const char *const env = xdg_env_vars[idx];
const char *const fallback = xdg_defaults[idx];
- const char *const env_val = os_getenv(env);
+ const char *env_val = os_getenv(env);
+
+#ifdef WIN32
+ if (env_val == NULL && xdg_defaults_env_vars[idx] != NULL) {
+ env_val = os_getenv(xdg_defaults_env_vars[idx]);
+ }
+#endif
+
char *ret = NULL;
if (env_val != NULL) {
ret = xstrdup(env_val);
} else if (fallback) {
- ret = (char *) expand_env_save((char_u *)fallback);
+ ret = (char *)expand_env_save((char_u *)fallback);
}
return ret;
@@ -69,7 +88,7 @@ char *stdpaths_get_xdg_var(const XDGVarType idx)
///
/// In WIN32 get_xdg_home(kXDGDataHome) returns `{xdg_directory}/nvim-data` to
/// avoid storing configuration and data files in the same path.
-static char *get_xdg_home(const XDGVarType idx)
+char *get_xdg_home(const XDGVarType idx)
FUNC_ATTR_WARN_UNUSED_RESULT
{
char *dir = stdpaths_get_xdg_var(idx);
@@ -100,18 +119,30 @@ char *stdpaths_user_conf_subpath(const char *fname)
///
/// @param[in] fname New component of the path.
/// @param[in] trailing_pathseps Amount of trailing path separators to add.
+/// @param[in] escape_commas If true, all commas will be escaped.
///
-/// @return [allocated] `$XDG_DATA_HOME/nvim/{fname}`
+/// @return [allocated] `$XDG_DATA_HOME/nvim/{fname}`.
char *stdpaths_user_data_subpath(const char *fname,
- const size_t trailing_pathseps)
+ const size_t trailing_pathseps,
+ const bool escape_commas)
FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_RET
{
char *ret = concat_fnames_realloc(get_xdg_home(kXDGDataHome), fname, true);
- if (trailing_pathseps) {
- const size_t len = strlen(ret);
- ret = xrealloc(ret, len + trailing_pathseps + 1);
- memset(ret + len, PATHSEP, trailing_pathseps);
- ret[len + trailing_pathseps] = NUL;
+ const size_t len = strlen(ret);
+ const size_t numcommas = (escape_commas ? memcnt(ret, ',', len) : 0);
+ if (numcommas || trailing_pathseps) {
+ ret = xrealloc(ret, len + trailing_pathseps + numcommas + 1);
+ for (size_t i = 0 ; i < len + numcommas ; i++) {
+ if (ret[i] == ',') {
+ memmove(ret + i + 1, ret + i, len - i + numcommas);
+ ret[i] = '\\';
+ i++;
+ }
+ }
+ if (trailing_pathseps) {
+ memset(ret + len + numcommas, PATHSEP, trailing_pathseps);
+ }
+ ret[len + trailing_pathseps + numcommas] = NUL;
}
return ret;
}
diff --git a/src/nvim/os/time.c b/src/nvim/os/time.c
index 2205ad0958..31ef1a0cd6 100644
--- a/src/nvim/os/time.c
+++ b/src/nvim/os/time.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <stdint.h>
#include <stdbool.h>
@@ -7,6 +10,7 @@
#include <uv.h>
#include "nvim/os/time.h"
+#include "nvim/os/input.h"
#include "nvim/event/loop.h"
#include "nvim/vim.h"
#include "nvim/main.h"
@@ -34,38 +38,54 @@ uint64_t os_hrtime(void)
return uv_hrtime();
}
-/// Sleeps for a certain amount of milliseconds
+/// Sleeps for `ms` milliseconds.
///
-/// @param milliseconds Number of milliseconds to sleep
-/// @param ignoreinput If true, allow a SIGINT to interrupt us
-void os_delay(uint64_t milliseconds, bool ignoreinput)
+/// @param ms Number of milliseconds to sleep
+/// @param ignoreinput If true, only SIGINT (CTRL-C) can interrupt.
+void os_delay(uint64_t ms, bool ignoreinput)
{
if (ignoreinput) {
- if (milliseconds > INT_MAX) {
- milliseconds = INT_MAX;
+ if (ms > INT_MAX) {
+ ms = INT_MAX;
}
- LOOP_PROCESS_EVENTS_UNTIL(&main_loop, NULL, (int)milliseconds, got_int);
+ LOOP_PROCESS_EVENTS_UNTIL(&main_loop, NULL, (int)ms, got_int);
} else {
- os_microdelay(milliseconds * 1000);
+ os_microdelay(ms * 1000u, ignoreinput);
}
}
-/// Sleeps for a certain amount of microseconds
+/// Sleeps for `us` microseconds.
///
-/// @param microseconds Number of microseconds to sleep
-void os_microdelay(uint64_t microseconds)
+/// @param us Number of microseconds to sleep.
+/// @param ignoreinput If true, ignore all input (including SIGINT/CTRL-C).
+/// If false, waiting is aborted on any input.
+void os_microdelay(uint64_t us, bool ignoreinput)
{
- uint64_t elapsed = 0;
- uint64_t ns = microseconds * 1000; // convert to nanoseconds
+ uint64_t elapsed = 0u;
uint64_t base = uv_hrtime();
+ // Convert microseconds to nanoseconds, or UINT64_MAX on overflow.
+ const uint64_t ns = (us < UINT64_MAX / 1000u) ? us * 1000u : UINT64_MAX;
uv_mutex_lock(&delay_mutex);
while (elapsed < ns) {
- if (uv_cond_timedwait(&delay_cond, &delay_mutex, ns - elapsed)
- == UV_ETIMEDOUT)
+ // If ignoring input, we simply wait the full delay.
+ // Else we check for input in ~100ms intervals.
+ const uint64_t ns_delta = ignoreinput
+ ? ns - elapsed
+ : MIN(ns - elapsed, 100000000u); // 100ms
+
+ const int rv = uv_cond_timedwait(&delay_cond, &delay_mutex, ns_delta);
+ if (0 != rv && UV_ETIMEDOUT != rv) {
+ assert(false);
+ break;
+ } // Else: Timeout proceeded normally.
+
+ if (!ignoreinput && os_char_avail()) {
break;
- uint64_t now = uv_hrtime();
+ }
+
+ const uint64_t now = uv_hrtime();
elapsed += now - base;
base = now;
}
@@ -94,12 +114,12 @@ struct tm *os_localtime_r(const time_t *restrict clock,
#endif
}
-/// Obtains the current Unix timestamp and adjusts it to local time.
+/// Gets the current Unix timestamp and adjusts it to local time.
///
/// @param result Pointer to a 'struct tm' where the result should be placed
/// @return A pointer to a 'struct tm' in the current time zone (the 'result'
/// argument) or NULL in case of error
-struct tm *os_get_localtime(struct tm *result) FUNC_ATTR_NONNULL_ALL
+struct tm *os_localtime(struct tm *result) FUNC_ATTR_NONNULL_ALL
{
time_t rawtime = time(NULL);
return os_localtime_r(&rawtime, result);
diff --git a/src/nvim/os/tty.c b/src/nvim/os/tty.c
new file mode 100644
index 0000000000..bd5b9b4506
--- /dev/null
+++ b/src/nvim/os/tty.c
@@ -0,0 +1,60 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+//
+// Terminal/console utils
+//
+
+#include "nvim/os/os.h"
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "os/tty.c.generated.h"
+#endif
+
+#ifdef WIN32
+# if !defined(ENABLE_VIRTUAL_TERMINAL_PROCESSING)
+# define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
+# endif
+/// Guesses the terminal-type. Calls SetConsoleMode() and uv_set_vterm_state()
+/// if appropriate.
+///
+/// @param[in,out] term Name of the guessed terminal, statically-allocated
+/// @param out_fd stdout file descriptor
+void os_tty_guess_term(const char **term, int out_fd)
+{
+ bool winpty = (os_getenv("NVIM") != NULL);
+
+ if (winpty) {
+ // Force TERM=win32con when running in winpty.
+ *term = "win32con";
+ uv_set_vterm_state(UV_UNSUPPORTED);
+ return;
+ }
+
+ bool conemu_ansi = strequal(os_getenv("ConEmuANSI"), "ON");
+ bool vtp = false;
+
+ HANDLE handle = (HANDLE)_get_osfhandle(out_fd);
+ DWORD dwMode;
+ if (handle != INVALID_HANDLE_VALUE && GetConsoleMode(handle, &dwMode)) {
+ dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
+ if (SetConsoleMode(handle, dwMode)) {
+ vtp = true;
+ }
+ }
+
+ if (*term == NULL) {
+ if (vtp) {
+ *term = "vtpcon";
+ } else if (conemu_ansi) {
+ *term = "conemu";
+ } else {
+ *term = "win32con";
+ }
+ }
+
+ if (conemu_ansi) {
+ uv_set_vterm_state(UV_SUPPORTED);
+ }
+}
+#endif
diff --git a/src/nvim/os/tty.h b/src/nvim/os/tty.h
new file mode 100644
index 0000000000..d771e63768
--- /dev/null
+++ b/src/nvim/os/tty.h
@@ -0,0 +1,7 @@
+#ifndef NVIM_OS_TTY_H
+#define NVIM_OS_TTY_H
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "os/tty.h.generated.h"
+#endif
+#endif // NVIM_OS_TTY_H
diff --git a/src/nvim/os/unix_defs.h b/src/nvim/os/unix_defs.h
index 690a39c3cd..60a2dfa882 100644
--- a/src/nvim/os/unix_defs.h
+++ b/src/nvim/os/unix_defs.h
@@ -1,14 +1,13 @@
#ifndef NVIM_OS_UNIX_DEFS_H
#define NVIM_OS_UNIX_DEFS_H
-// Windows doesn't have unistd.h, so we include it here to avoid numerous
-// instances of `#ifdef WIN32'.
#include <unistd.h>
+#include <sys/param.h>
// POSIX.1-2008 says that NAME_MAX should be in here
#include <limits.h>
-#define TEMP_DIR_NAMES {"$TMPDIR", "/tmp", ".", "~"}
+#define TEMP_DIR_NAMES { "$TMPDIR", "/tmp", ".", "~" }
#define TEMP_FILE_PATH_MAXLEN 256
#define HAVE_ACL (HAVE_POSIX_ACL || HAVE_SOLARIS_ACL)
@@ -16,7 +15,8 @@
// Special wildcards that need to be handled by the shell.
#define SPECIAL_WILDCHAR "`'{"
-// Separator character for environment variables.
+// Character that separates entries in $PATH.
#define ENV_SEPCHAR ':'
+#define ENV_SEPSTR ":"
#endif // NVIM_OS_UNIX_DEFS_H
diff --git a/src/nvim/os/users.c b/src/nvim/os/users.c
index 8ebb7562ef..c6463c2c92 100644
--- a/src/nvim/os/users.c
+++ b/src/nvim/os/users.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
// users.c -- operating system user information
#include <uv.h>
@@ -6,7 +9,6 @@
#include "nvim/os/os.h"
#include "nvim/garray.h"
#include "nvim/memory.h"
-#include "nvim/misc2.h"
#include "nvim/strings.h"
#ifdef HAVE_PWD_H
# include <pwd.h>
@@ -73,11 +75,10 @@ int os_get_uname(uv_uid_t uid, char *s, size_t len)
char *os_get_user_directory(const char *name)
{
#if defined(HAVE_GETPWNAM) && defined(HAVE_PWD_H)
- struct passwd *pw;
- if (name == NULL) {
+ if (name == NULL || *name == NUL) {
return NULL;
}
- pw = getpwnam(name); // NOLINT(runtime/threadsafe_fn)
+ struct passwd *pw = getpwnam(name); // NOLINT(runtime/threadsafe_fn)
if (pw != NULL) {
// save the string from the static passwd entry into malloced memory
return xstrdup(pw->pw_dir);
diff --git a/src/nvim/os/win_defs.h b/src/nvim/os/win_defs.h
index 6a29f86e79..356094baa1 100644
--- a/src/nvim/os/win_defs.h
+++ b/src/nvim/os/win_defs.h
@@ -1,6 +1,10 @@
#ifndef NVIM_OS_WIN_DEFS_H
#define NVIM_OS_WIN_DEFS_H
+#ifndef WIN32
+# error Header must be included only when compiling for Windows.
+#endif
+
// winsock2.h must be first to avoid incompatibilities
// with winsock.h (included by windows.h)
#include <winsock2.h>
@@ -15,18 +19,21 @@
#define NAME_MAX _MAX_PATH
-#define TEMP_DIR_NAMES {"$TMP", "$TEMP", "$USERPROFILE", ""}
+#define TEMP_DIR_NAMES { "$TMPDIR", "$TMP", "$TEMP", "$USERPROFILE", "" }
#define TEMP_FILE_PATH_MAXLEN _MAX_PATH
#define FNAME_ILLEGAL "\"*?><|"
-// Separator character for environment variables.
+// Character that separates entries in $PATH.
#define ENV_SEPCHAR ';'
+#define ENV_SEPSTR ";"
#define USE_CRNL
-// We have our own RGB macro in macros.h.
-#undef RGB
+// Windows defines a RGB macro that produces 0x00bbggrr color values for use
+// with GDI. Our macro is different, and we don't use GDI.
+// Duplicated from macros.h to avoid include-order sensitivity.
+#define RGB_(r, g, b) ((r << 16) | (g << 8) | b)
#ifdef _MSC_VER
# ifndef inline
@@ -35,6 +42,9 @@
# ifndef restrict
# define restrict __restrict
# endif
+# ifndef STDIN_FILENO
+# define STDIN_FILENO _fileno(stdin)
+# endif
# ifndef STDOUT_FILENO
# define STDOUT_FILENO _fileno(stdout)
# endif
@@ -49,7 +59,7 @@
#define BACKSLASH_IN_FILENAME
#ifdef _MSC_VER
-typedef SSIZE_T ssize_t;
+typedef int mode_t;
#endif
#ifndef SSIZE_MAX
@@ -86,4 +96,14 @@ typedef SSIZE_T ssize_t;
# define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
#endif
+#ifndef STDIN_FILENO
+# define STDIN_FILENO 0
+#endif
+#ifndef STDOUT_FILENO
+# define STDOUT_FILENO 1
+#endif
+#ifndef STDERR_FILENO
+# define STDERR_FILENO 2
+#endif
+
#endif // NVIM_OS_WIN_DEFS_H
diff --git a/src/nvim/os_unix.c b/src/nvim/os_unix.c
index def7e3b0e5..09ba718302 100644
--- a/src/nvim/os_unix.c
+++ b/src/nvim/os_unix.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* os_unix.c -- code for all flavors of Unix (BSD, SYSV, SVR4, POSIX, ...)
*
@@ -27,7 +30,6 @@
#include "nvim/memory.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/mouse.h"
#include "nvim/garray.h"
#include "nvim/path.h"
@@ -63,9 +65,7 @@ static int selinux_enabled = -1;
#if defined(HAVE_SELINUX)
-/*
- * Copy security info from "from_file" to "to_file".
- */
+// Copy security info from "from_file" to "to_file".
void mch_copy_sec(char_u *from_file, char_u *to_file)
{
if (from_file == NULL)
@@ -79,11 +79,12 @@ void mch_copy_sec(char_u *from_file, char_u *to_file)
security_context_t to_context = NULL;
if (getfilecon((char *)from_file, &from_context) < 0) {
- /* If the filesystem doesn't support extended attributes,
- the original had no special security context and the
- target cannot have one either. */
- if (errno == EOPNOTSUPP)
+ // If the filesystem doesn't support extended attributes,
+ // the original had no special security context and the
+ // target cannot have one either.
+ if (errno == EOPNOTSUPP) {
return;
+ }
MSG_PUTS(_("\nCould not get security context for "));
msg_outtrans(from_file);
@@ -108,22 +109,18 @@ void mch_copy_sec(char_u *from_file, char_u *to_file)
freecon(from_context);
}
}
-#endif /* HAVE_SELINUX */
+#endif // HAVE_SELINUX
-/*
- * Return a pointer to the ACL of file "fname" in allocated memory.
- * Return NULL if the ACL is not available for whatever reason.
- */
-vim_acl_T mch_get_acl(char_u *fname)
+// Return a pointer to the ACL of file "fname" in allocated memory.
+// Return NULL if the ACL is not available for whatever reason.
+vim_acl_T mch_get_acl(const char_u *fname)
{
vim_acl_T ret = NULL;
return ret;
}
-/*
- * Set the ACL of file "fname" to "acl" (unless it's NULL).
- */
-void mch_set_acl(char_u *fname, vim_acl_T aclent)
+// Set the ACL of file "fname" to "acl" (unless it's NULL).
+void mch_set_acl(const char_u *fname, vim_acl_T aclent)
{
if (aclent == NULL)
return;
@@ -137,15 +134,22 @@ void mch_free_acl(vim_acl_T aclent)
#endif
void mch_exit(int r)
+ FUNC_ATTR_NORETURN
{
exiting = true;
- ui_builtin_stop();
ui_flush();
- ml_close_all(true); /* remove all memfiles */
+ ui_builtin_stop();
+ ml_close_all(true); // remove all memfiles
+
+ if (!event_teardown() && r == 0) {
+ r = 1; // Exit with error if main_loop did not teardown gracefully.
+ }
+ if (input_global_fd() >= 0) {
+ stream_set_blocking(input_global_fd(), true); // normalize stream (#2598)
+ }
- event_teardown();
- stream_set_blocking(input_global_fd(), true); // normalize stream (#2598)
+ ILOG("Nvim exit: %d", r);
#ifdef EXITFREE
free_all_mem();
@@ -176,7 +180,7 @@ void mch_exit(int r)
/// @returns OK for success or FAIL for error.
int mch_expand_wildcards(int num_pat, char_u **pat, int *num_file,
char_u ***file, int flags) FUNC_ATTR_NONNULL_ARG(3)
- FUNC_ATTR_NONNULL_ARG(4)
+ FUNC_ATTR_NONNULL_ARG(4)
{
int i;
size_t len;
@@ -199,17 +203,22 @@ int mch_expand_wildcards(int num_pat, char_u **pat, int *num_file,
int check_spaces;
static bool did_find_nul = false;
bool ampersent = false;
- /* vimglob() function to define for Posix shell */
+ // vimglob() function to define for Posix shell
static char *sh_vimglob_func =
"vimglob() { while [ $# -ge 1 ]; do echo \"$1\"; shift; done }; vimglob >";
- *num_file = 0; /* default: no files found */
+ bool is_fish_shell =
+#if defined(UNIX)
+ STRNCMP(invocation_path_tail(p_sh, NULL), "fish", 4) == 0;
+#else
+ false;
+#endif
+
+ *num_file = 0; // default: no files found
*file = NULL;
- /*
- * If there are no wildcards, just copy the names to allocated memory.
- * Saves a lot of time, because we don't have to start a new shell.
- */
+ // If there are no wildcards, just copy the names to allocated memory.
+ // Saves a lot of time, because we don't have to start a new shell.
if (!have_wildcard(num_pat, pat)) {
save_patterns(num_pat, pat, num_file, file);
return OK;
@@ -220,87 +229,99 @@ int mch_expand_wildcards(int num_pat, char_u **pat, int *num_file,
return FAIL;
}
- /*
- * Don't allow the use of backticks in secure and restricted mode.
- */
- if (secure || restricted)
- for (i = 0; i < num_pat; ++i)
+ // Don't allow the use of backticks in secure and restricted mode.
+ if (secure || restricted) {
+ for (i = 0; i < num_pat; i++) {
if (vim_strchr(pat[i], '`') != NULL
- && (check_restricted() || check_secure()))
+ && (check_restricted() || check_secure())) {
return FAIL;
+ }
+ }
+ }
- /*
- * get a name for the temp file
- */
+ // get a name for the temp file
if ((tempname = vim_tempname()) == NULL) {
EMSG(_(e_notmp));
return FAIL;
}
- /*
- * Let the shell expand the patterns and write the result into the temp
- * file.
- * STYLE_BT: NL separated
- * If expanding `cmd` execute it directly.
- * STYLE_GLOB: NUL separated
- * If we use *csh, "glob" will work better than "echo".
- * STYLE_PRINT: NL or NUL separated
- * If we use *zsh, "print -N" will work better than "glob".
- * STYLE_VIMGLOB: NL separated
- * If we use *sh*, we define "vimglob()".
- * STYLE_ECHO: space separated.
- * A shell we don't know, stay safe and use "echo".
- */
+ // Let the shell expand the patterns and write the result into the temp
+ // file.
+ // STYLE_BT: NL separated
+ // If expanding `cmd` execute it directly.
+ // STYLE_GLOB: NUL separated
+ // If we use *csh, "glob" will work better than "echo".
+ // STYLE_PRINT: NL or NUL separated
+ // If we use *zsh, "print -N" will work better than "glob".
+ // STYLE_VIMGLOB: NL separated
+ // If we use *sh*, we define "vimglob()".
+ // STYLE_ECHO: space separated.
+ // A shell we don't know, stay safe and use "echo".
if (num_pat == 1 && *pat[0] == '`'
&& (len = STRLEN(pat[0])) > 2
- && *(pat[0] + len - 1) == '`')
+ && *(pat[0] + len - 1) == '`') {
shell_style = STYLE_BT;
- else if ((len = STRLEN(p_sh)) >= 3) {
- if (STRCMP(p_sh + len - 3, "csh") == 0)
+ } else if ((len = STRLEN(p_sh)) >= 3) {
+ if (STRCMP(p_sh + len - 3, "csh") == 0) {
shell_style = STYLE_GLOB;
- else if (STRCMP(p_sh + len - 3, "zsh") == 0)
+ } else if (STRCMP(p_sh + len - 3, "zsh") == 0) {
shell_style = STYLE_PRINT;
+ }
}
if (shell_style == STYLE_ECHO && strstr((char *)path_tail(p_sh),
"sh") != NULL)
shell_style = STYLE_VIMGLOB;
- /* Compute the length of the command. We need 2 extra bytes: for the
- * optional '&' and for the NUL.
- * Worst case: "unset nonomatch; print -N >" plus two is 29 */
+ // Compute the length of the command. We need 2 extra bytes: for the
+ // optional '&' and for the NUL.
+ // Worst case: "unset nonomatch; print -N >" plus two is 29
len = STRLEN(tempname) + 29;
if (shell_style == STYLE_VIMGLOB)
len += STRLEN(sh_vimglob_func);
- for (i = 0; i < num_pat; ++i) {
- /* Count the length of the patterns in the same way as they are put in
- * "command" below. */
- ++len; /* add space */
- for (j = 0; pat[i][j] != NUL; ++j) {
- if (vim_strchr(SHELL_SPECIAL, pat[i][j]) != NULL)
- ++len; /* may add a backslash */
- ++len;
+ for (i = 0; i < num_pat; i++) {
+ // Count the length of the patterns in the same way as they are put in
+ // "command" below.
+ len++; // add space
+ for (j = 0; pat[i][j] != NUL; j++) {
+ if (vim_strchr(SHELL_SPECIAL, pat[i][j]) != NULL) {
+ len++; // may add a backslash
+ }
+ len++;
}
}
+
+ if (is_fish_shell) {
+ len += sizeof("egin;"" end") - 1;
+ }
+
command = xmalloc(len);
- /*
- * Build the shell command:
- * - Set $nonomatch depending on EW_NOTFOUND (hopefully the shell
- * recognizes this).
- * - Add the shell command to print the expanded names.
- * - Add the temp file name.
- * - Add the file name patterns.
- */
+ // Build the shell command:
+ // - Set $nonomatch depending on EW_NOTFOUND (hopefully the shell
+ // recognizes this).
+ // - Add the shell command to print the expanded names.
+ // - Add the temp file name.
+ // - Add the file name patterns.
if (shell_style == STYLE_BT) {
- /* change `command; command& ` to (command; command ) */
- STRCPY(command, "(");
- STRCAT(command, pat[0] + 1); /* exclude first backtick */
+ // change `command; command& ` to (command; command )
+ if (is_fish_shell) {
+ STRCPY(command, "begin; ");
+ } else {
+ STRCPY(command, "(");
+ }
+ STRCAT(command, pat[0] + 1); // exclude first backtick
p = command + STRLEN(command) - 1;
- *p-- = ')'; /* remove last backtick */
- while (p > command && ascii_iswhite(*p))
- --p;
- if (*p == '&') { /* remove trailing '&' */
+ if (is_fish_shell) {
+ *p-- = ';';
+ STRCAT(command, " end");
+ } else {
+ *p-- = ')'; // remove last backtick
+ }
+ while (p > command && ascii_iswhite(*p)) {
+ p--;
+ }
+ if (*p == '&') { // remove trailing '&'
ampersent = true;
*p = ' ';
}
@@ -322,113 +343,108 @@ int mch_expand_wildcards(int num_pat, char_u **pat, int *num_file,
STRCAT(command, tempname);
- if (shell_style != STYLE_BT)
- for (i = 0; i < num_pat; ++i) {
- /* Put a backslash before special
- * characters, except inside ``. */
+ if (shell_style != STYLE_BT) {
+ for (i = 0; i < num_pat; i++) {
+ // Put a backslash before special
+ // characters, except inside ``.
bool intick = false;
p = command + STRLEN(command);
*p++ = ' ';
- for (j = 0; pat[i][j] != NUL; ++j) {
- if (pat[i][j] == '`')
+ for (j = 0; pat[i][j] != NUL; j++) {
+ if (pat[i][j] == '`') {
intick = !intick;
- else if (pat[i][j] == '\\' && pat[i][j + 1] != NUL) {
- /* Remove a backslash, take char literally. But keep
- * backslash inside backticks, before a special character
- * and before a backtick. */
+ } else if (pat[i][j] == '\\' && pat[i][j + 1] != NUL) {
+ // Remove a backslash, take char literally. But keep
+ // backslash inside backticks, before a special character
+ // and before a backtick.
if (intick
|| vim_strchr(SHELL_SPECIAL, pat[i][j + 1]) != NULL
- || pat[i][j + 1] == '`')
+ || pat[i][j + 1] == '`') {
*p++ = '\\';
- ++j;
+ }
+ j++;
} else if (!intick
- && ((flags & EW_KEEPDOLLAR) == 0 || pat[i][j] != '$')
- && vim_strchr(SHELL_SPECIAL, pat[i][j]) != NULL)
- /* Put a backslash before a special character, but not
- * when inside ``. And not for $var when EW_KEEPDOLLAR is
- * set. */
+ && ((flags & EW_KEEPDOLLAR) == 0 || pat[i][j] != '$')
+ && vim_strchr(SHELL_SPECIAL, pat[i][j]) != NULL) {
+ // Put a backslash before a special character, but not
+ // when inside ``. And not for $var when EW_KEEPDOLLAR is
+ // set.
*p++ = '\\';
+ }
- /* Copy one character. */
+ // Copy one character.
*p++ = pat[i][j];
}
*p = NUL;
}
+ }
if (flags & EW_SILENT) {
shellopts |= kShellOptHideMess;
}
- if (ampersent)
- STRCAT(command, "&"); /* put the '&' after the redirection */
-
- /*
- * Using zsh -G: If a pattern has no matches, it is just deleted from
- * the argument list, otherwise zsh gives an error message and doesn't
- * expand any other pattern.
- */
- if (shell_style == STYLE_PRINT)
- extra_shell_arg = (char_u *)"-G"; /* Use zsh NULL_GLOB option */
-
- /*
- * If we use -f then shell variables set in .cshrc won't get expanded.
- * vi can do it, so we will too, but it is only necessary if there is a "$"
- * in one of the patterns, otherwise we can still use the fast option.
- */
- else if (shell_style == STYLE_GLOB && !have_dollars(num_pat, pat))
- extra_shell_arg = (char_u *)"-f"; /* Use csh fast option */
-
- /*
- * execute the shell command
- */
+ if (ampersent) {
+ STRCAT(command, "&"); // put the '&' after the redirection
+ }
+
+ // Using zsh -G: If a pattern has no matches, it is just deleted from
+ // the argument list, otherwise zsh gives an error message and doesn't
+ // expand any other pattern.
+ if (shell_style == STYLE_PRINT) {
+ extra_shell_arg = (char_u *)"-G"; // Use zsh NULL_GLOB option
+
+ // If we use -f then shell variables set in .cshrc won't get expanded.
+ // vi can do it, so we will too, but it is only necessary if there is a "$"
+ // in one of the patterns, otherwise we can still use the fast option.
+ } else if (shell_style == STYLE_GLOB && !have_dollars(num_pat, pat)) {
+ extra_shell_arg = (char_u *)"-f"; // Use csh fast option
+ }
+
+ // execute the shell command
i = call_shell(
command,
shellopts,
extra_shell_arg
);
- /* When running in the background, give it some time to create the temp
- * file, but don't wait for it to finish. */
- if (ampersent)
+ // When running in the background, give it some time to create the temp
+ // file, but don't wait for it to finish.
+ if (ampersent) {
os_delay(10L, true);
+ }
xfree(command);
- if (i) { /* os_call_shell() failed */
+ if (i) { // os_call_shell() failed
os_remove((char *)tempname);
xfree(tempname);
- /*
- * With interactive completion, the error message is not printed.
- */
- if (!(flags & EW_SILENT))
- {
- redraw_later_clear(); /* probably messed up screen */
- msg_putchar('\n'); /* clear bottom line quickly */
+ // With interactive completion, the error message is not printed.
+ if (!(flags & EW_SILENT)) {
+ msg_putchar('\n'); // clear bottom line quickly
#if SIZEOF_LONG > SIZEOF_INT
assert(Rows <= (long)INT_MAX + 1);
#endif
- cmdline_row = (int)(Rows - 1); /* continue on last line */
+ cmdline_row = (int)(Rows - 1); // continue on last line
MSG(_(e_wildexpand));
- msg_start(); /* don't overwrite this message */
+ msg_start(); // don't overwrite this message
}
- /* If a `cmd` expansion failed, don't list `cmd` as a match, even when
- * EW_NOTFOUND is given */
- if (shell_style == STYLE_BT)
+ // If a `cmd` expansion failed, don't list `cmd` as a match, even when
+ // EW_NOTFOUND is given
+ if (shell_style == STYLE_BT) {
return FAIL;
+ }
goto notfound;
}
- /*
- * read the names from the file into memory
- */
+ // read the names from the file into memory
fd = fopen((char *)tempname, READBIN);
if (fd == NULL) {
- /* Something went wrong, perhaps a file name with a special char. */
+ // Something went wrong, perhaps a file name with a special char.
if (!(flags & EW_SILENT)) {
MSG(_(e_wildexpand));
- msg_start(); /* don't overwrite this message */
+ msg_start(); // don't overwrite this message
}
xfree(tempname);
goto notfound;
@@ -439,7 +455,7 @@ int mch_expand_wildcards(int num_pat, char_u **pat, int *num_file,
fclose(fd);
return FAIL;
}
- long long templen = ftell(fd); /* get size of temp file */
+ int64_t templen = ftell(fd); // get size of temp file
if (templen < 0) {
xfree(tempname);
fclose(fd);
@@ -457,7 +473,7 @@ int mch_expand_wildcards(int num_pat, char_u **pat, int *num_file,
fclose(fd);
os_remove((char *)tempname);
if (readlen != len) {
- /* unexpected read error */
+ // unexpected read error
EMSG2(_(e_notread), tempname);
xfree(tempname);
xfree(buffer);
@@ -465,41 +481,40 @@ int mch_expand_wildcards(int num_pat, char_u **pat, int *num_file,
}
xfree(tempname);
- /* file names are separated with Space */
+ // file names are separated with Space
if (shell_style == STYLE_ECHO) {
- buffer[len] = '\n'; /* make sure the buffer ends in NL */
+ buffer[len] = '\n'; // make sure the buffer ends in NL
p = buffer;
- for (i = 0; *p != '\n'; ++i) { /* count number of entries */
- while (*p != ' ' && *p != '\n')
- ++p;
- p = skipwhite(p); /* skip to next entry */
+ for (i = 0; *p != '\n'; i++) { // count number of entries
+ while (*p != ' ' && *p != '\n') {
+ p++;
+ }
+ p = skipwhite(p); // skip to next entry
}
- }
- /* file names are separated with NL */
- else if (shell_style == STYLE_BT || shell_style == STYLE_VIMGLOB) {
- buffer[len] = NUL; /* make sure the buffer ends in NUL */
+ // file names are separated with NL
+ } else if (shell_style == STYLE_BT || shell_style == STYLE_VIMGLOB) {
+ buffer[len] = NUL; // make sure the buffer ends in NUL
p = buffer;
- for (i = 0; *p != NUL; ++i) { /* count number of entries */
- while (*p != '\n' && *p != NUL)
- ++p;
- if (*p != NUL)
- ++p;
- p = skipwhite(p); /* skip leading white space */
+ for (i = 0; *p != NUL; i++) { // count number of entries
+ while (*p != '\n' && *p != NUL) {
+ p++;
+ }
+ if (*p != NUL) {
+ p++;
+ }
+ p = skipwhite(p); // skip leading white space
}
- }
- /* file names are separated with NUL */
- else {
- /*
- * Some versions of zsh use spaces instead of NULs to separate
- * results. Only do this when there is no NUL before the end of the
- * buffer, otherwise we would never be able to use file names with
- * embedded spaces when zsh does use NULs.
- * When we found a NUL once, we know zsh is OK, set did_find_nul and
- * don't check for spaces again.
- */
+ // file names are separated with NUL
+ } else {
+ // Some versions of zsh use spaces instead of NULs to separate
+ // results. Only do this when there is no NUL before the end of the
+ // buffer, otherwise we would never be able to use file names with
+ // embedded spaces when zsh does use NULs.
+ // When we found a NUL once, we know zsh is OK, set did_find_nul and
+ // don't check for spaces again.
check_spaces = false;
if (shell_style == STYLE_PRINT && !did_find_nul) {
- /* If there is a NUL, set did_find_nul, else set check_spaces */
+ // If there is a NUL, set did_find_nul, else set check_spaces
buffer[len] = NUL;
if (len && (int)STRLEN(buffer) < (int)len)
did_find_nul = true;
@@ -507,72 +522,69 @@ int mch_expand_wildcards(int num_pat, char_u **pat, int *num_file,
check_spaces = true;
}
- /*
- * Make sure the buffer ends with a NUL. For STYLE_PRINT there
- * already is one, for STYLE_GLOB it needs to be added.
- */
- if (len && buffer[len - 1] == NUL)
- --len;
- else
+ // Make sure the buffer ends with a NUL. For STYLE_PRINT there
+ // already is one, for STYLE_GLOB it needs to be added.
+ if (len && buffer[len - 1] == NUL) {
+ len--;
+ } else {
buffer[len] = NUL;
+ }
i = 0;
- for (p = buffer; p < buffer + len; ++p)
- if (*p == NUL || (*p == ' ' && check_spaces)) { /* count entry */
- ++i;
+ for (p = buffer; p < buffer + len; p++) {
+ if (*p == NUL || (*p == ' ' && check_spaces)) { // count entry
+ i++;
*p = NUL;
}
- if (len)
- ++i; /* count last entry */
+ }
+ if (len) {
+ i++; // count last entry
+ }
}
assert(buffer[len] == NUL || buffer[len] == '\n');
if (i == 0) {
- /*
- * Can happen when using /bin/sh and typing ":e $NO_SUCH_VAR^I".
- * /bin/sh will happily expand it to nothing rather than returning an
- * error; and hey, it's good to check anyway -- webb.
- */
+ // Can happen when using /bin/sh and typing ":e $NO_SUCH_VAR^I".
+ // /bin/sh will happily expand it to nothing rather than returning an
+ // error; and hey, it's good to check anyway -- webb.
xfree(buffer);
goto notfound;
}
*num_file = i;
*file = xmalloc(sizeof(char_u *) * (size_t)i);
- /*
- * Isolate the individual file names.
- */
+ // Isolate the individual file names.
p = buffer;
for (i = 0; i < *num_file; ++i) {
(*file)[i] = p;
- /* Space or NL separates */
+ // Space or NL separates
if (shell_style == STYLE_ECHO || shell_style == STYLE_BT
|| shell_style == STYLE_VIMGLOB) {
while (!(shell_style == STYLE_ECHO && *p == ' ')
- && *p != '\n' && *p != NUL)
- ++p;
- if (p == buffer + len) /* last entry */
+ && *p != '\n' && *p != NUL) {
+ p++;
+ }
+ if (p == buffer + len) { // last entry
*p = NUL;
- else {
+ } else {
*p++ = NUL;
- p = skipwhite(p); /* skip to next entry */
+ p = skipwhite(p); // skip to next entry
+ }
+ } else { // NUL separates
+ while (*p && p < buffer + len) { // skip entry
+ p++;
}
- } else { /* NUL separates */
- while (*p && p < buffer + len) /* skip entry */
- ++p;
- ++p; /* skip NUL */
+ p++; // skip NUL
}
}
- /*
- * Move the file names to allocated memory.
- */
+ // Move the file names to allocated memory.
for (j = 0, i = 0; i < *num_file; i++) {
// Require the files to exist. Helps when using /bin/sh
if (!(flags & EW_NOTFOUND) && !os_path_exists((*file)[i])) {
continue;
}
- /* check if this entry should be included */
+ // check if this entry should be included
dir = (os_isdir((*file)[i]));
if ((dir && !(flags & EW_DIR)) || (!dir && !(flags & EW_FILE)))
continue;
@@ -585,14 +597,15 @@ int mch_expand_wildcards(int num_pat, char_u **pat, int *num_file,
p = xmalloc(STRLEN((*file)[i]) + 1 + dir);
STRCPY(p, (*file)[i]);
- if (dir)
- add_pathsep((char *)p); /* add '/' to a directory name */
+ if (dir) {
+ add_pathsep((char *)p); // add '/' to a directory name
+ }
(*file)[j++] = p;
}
xfree(buffer);
*num_file = j;
- if (*num_file == 0) { /* rejected all entries */
+ if (*num_file == 0) { // rejected all entries
xfree(*file);
*file = NULL;
goto notfound;
@@ -620,8 +633,8 @@ static void save_patterns(int num_pat, char_u **pat, int *num_file,
for (i = 0; i < num_pat; i++) {
s = vim_strsave(pat[i]);
- /* Be compatible with expand_filename(): halve the number of
- * backslashes. */
+ // Be compatible with expand_filename(): halve the number of
+ // backslashes.
backslash_halve(s);
(*file)[i] = s;
}
diff --git a/src/nvim/path.c b/src/nvim/path.c
index 57499429ec..de697642c7 100644
--- a/src/nvim/path.c
+++ b/src/nvim/path.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <inttypes.h>
#include <stdbool.h>
@@ -18,7 +21,6 @@
#include "nvim/memory.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/option.h"
#include "nvim/os/os.h"
#include "nvim/os/shell.h"
@@ -50,7 +52,8 @@
/// @param s2 Second file name.
/// @param checkname When both files don't exist, only compare their names.
/// @return Enum of type FileComparison. @see FileComparison.
-FileComparison path_full_compare(char_u *s1, char_u *s2, int checkname)
+FileComparison path_full_compare(char_u *const s1, char_u *const s2,
+ const bool checkname)
{
assert(s1 && s2);
char_u exp1[MAXPATHL];
@@ -85,23 +88,23 @@ FileComparison path_full_compare(char_u *s1, char_u *s2, int checkname)
///
/// @return pointer just past the last path separator (empty string, if fname
/// ends in a slash), or empty string if fname is NULL.
-char_u *path_tail(char_u *fname)
+char_u *path_tail(const char_u *fname)
FUNC_ATTR_NONNULL_RET
{
if (fname == NULL) {
return (char_u *)"";
}
- char_u *tail = get_past_head(fname);
- char_u *p = tail;
+ const char_u *tail = get_past_head(fname);
+ const char_u *p = tail;
// Find last part of path.
while (*p != NUL) {
if (vim_ispathsep_nocolon(*p)) {
tail = p + 1;
}
- mb_ptr_adv(p);
+ MB_PTR_ADV(p);
}
- return tail;
+ return (char_u *)tail;
}
/// Get pointer to tail of "fname", including path separators.
@@ -142,7 +145,7 @@ const char_u *invocation_path_tail(const char_u *invocation, size_t *len)
const char_u *p = tail;
while (*p != NUL && *p != ' ') {
bool was_sep = vim_ispathsep_nocolon(*p);
- mb_ptr_adv(p);
+ MB_PTR_ADV(p);
if (was_sep) {
tail = p; // Now tail points one past the separator.
}
@@ -160,11 +163,11 @@ const char_u *invocation_path_tail(const char_u *invocation, size_t *len)
/// @param fname A file path. (Must be != NULL.)
/// @return Pointer to first found path separator + 1.
/// An empty string, if `fname` doesn't contain a path separator,
-char_u *path_next_component(char_u *fname)
+const char *path_next_component(const char *fname)
{
assert(fname != NULL);
while (*fname != NUL && !vim_ispathsep(*fname)) {
- mb_ptr_adv(fname);
+ MB_PTR_ADV(fname);
}
if (*fname != NUL) {
fname++;
@@ -172,21 +175,25 @@ char_u *path_next_component(char_u *fname)
return fname;
}
-/*
- * Get a pointer to one character past the head of a path name.
- * Unix: after "/"; DOS: after "c:\"; Mac: no head.
- * If there is no head, path is returned.
- */
-char_u *get_past_head(char_u *path)
+/// Get a pointer to one character past the head of a path name.
+/// Unix: after "/"; Win: after "c:\"
+/// If there is no head, path is returned.
+char_u *get_past_head(const char_u *path)
{
- char_u *retval;
+ const char_u *retval = path;
- retval = path;
+#ifdef WIN32
+ // May skip "c:"
+ if (isalpha(path[0]) && path[1] == ':') {
+ retval = path + 2;
+ }
+#endif
- while (vim_ispathsep(*retval))
+ while (vim_ispathsep(*retval)) {
++retval;
+ }
- return retval;
+ return (char_u *)retval;
}
/*
@@ -279,48 +286,63 @@ bool dir_of_file_exists(char_u *fname)
return retval;
}
-/*
- * Versions of fnamecmp() and fnamencmp() that handle '/' and '\' equally
- * and deal with 'fileignorecase'.
- */
-int vim_fnamecmp(char_u *x, char_u *y)
+/// Compare two file names
+///
+/// Handles '/' and '\\' correctly and deals with &fileignorecase option.
+///
+/// @param[in] fname1 First file name.
+/// @param[in] fname2 Second file name.
+///
+/// @return 0 if they are equal, non-zero otherwise.
+int path_fnamecmp(const char *fname1, const char *fname2)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
#ifdef BACKSLASH_IN_FILENAME
- return vim_fnamencmp(x, y, MAXPATHL);
+ const size_t len1 = strlen(fname1);
+ const size_t len2 = strlen(fname2);
+ return path_fnamencmp(fname1, fname2, MAX(len1, len2));
#else
- if (p_fic)
- return mb_stricmp(x, y);
- return STRCMP(x, y);
+ return mb_strcmp_ic((bool)p_fic, fname1, fname2);
#endif
}
-int vim_fnamencmp(char_u *x, char_u *y, size_t len)
+/// Compare two file names
+///
+/// Handles '/' and '\\' correctly and deals with &fileignorecase option.
+///
+/// @param[in] fname1 First file name.
+/// @param[in] fname2 Second file name.
+/// @param[in] len Compare at most len bytes.
+///
+/// @return 0 if they are equal, non-zero otherwise.
+int path_fnamencmp(const char *const fname1, const char *const fname2,
+ size_t len)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
#ifdef BACKSLASH_IN_FILENAME
- char_u *px = x;
- char_u *py = y;
- int cx = NUL;
- int cy = NUL;
+ int c1 = NUL;
+ int c2 = NUL;
+ const char *p1 = fname1;
+ const char *p2 = fname2;
while (len > 0) {
- cx = PTR2CHAR(px);
- cy = PTR2CHAR(py);
- if (cx == NUL || cy == NUL
- || ((p_fic ? vim_tolower(cx) != vim_tolower(cy) : cx != cy)
- && !(cx == '/' && cy == '\\')
- && !(cx == '\\' && cy == '/')))
+ c1 = PTR2CHAR((const char_u *)p1);
+ c2 = PTR2CHAR((const char_u *)p2);
+ if ((c1 == NUL || c2 == NUL
+ || (!((c1 == '/' || c1 == '\\') && (c2 == '\\' || c2 == '/'))))
+ && (p_fic ? (c1 != c2 && CH_FOLD(c1) != CH_FOLD(c2)) : c1 != c2)) {
break;
- len -= MB_PTR2LEN(px);
- px += MB_PTR2LEN(px);
- py += MB_PTR2LEN(py);
+ }
+ len -= (size_t)MB_PTR2LEN((const char_u *)p1);
+ p1 += MB_PTR2LEN((const char_u *)p1);
+ p2 += MB_PTR2LEN((const char_u *)p2);
}
- if (len == 0)
- return 0;
- return cx - cy;
+ return c1 - c2;
#else
- if (p_fic)
- return mb_strnicmp(x, y, len);
- return STRNCMP(x, y, len);
+ if (p_fic) {
+ return mb_strnicmp((const char_u *)fname1, (const char_u *)fname2, len);
+ }
+ return strncmp(fname1, fname2, len);
#endif
}
@@ -388,15 +410,22 @@ char *concat_fnames_realloc(char *fname1, const char *fname2, bool sep)
fname2, len2, sep);
}
-/*
- * Add a path separator to a file name, unless it already ends in a path
- * separator.
- */
-void add_pathsep(char *p)
+/// Adds a path separator to a filename, unless it already ends in one.
+///
+/// @return `true` if the path separator was added or already existed.
+/// `false` if the filename is too long.
+bool add_pathsep(char *p)
FUNC_ATTR_NONNULL_ALL
{
- if (*p != NUL && !after_pathsep(p, p + strlen(p)))
- strcat(p, PATHSEPSTR);
+ const size_t len = strlen(p);
+ if (*p != NUL && !after_pathsep(p, p + len)) {
+ const size_t pathsep_len = sizeof(PATHSEPSTR);
+ if (len > MAXPATHL - pathsep_len) {
+ return false;
+ }
+ memcpy(p + len, PATHSEPSTR, pathsep_len);
+ }
+ return true;
}
/// Get an allocated copy of the full path to a file.
@@ -406,32 +435,28 @@ void add_pathsep(char *p)
///
/// @return [allocated] Copy of absolute path to `fname` or NULL when
/// `fname` is NULL.
-char *FullName_save(char *fname, bool force)
- FUNC_ATTR_NONNULL_RET FUNC_ATTR_MALLOC
+char *FullName_save(const char *fname, bool force)
+ FUNC_ATTR_MALLOC
{
if (fname == NULL) {
return NULL;
}
char *buf = xmalloc(MAXPATHL);
- char *new_fname = NULL;
- if (vim_FullName(fname, buf, MAXPATHL, force) != FAIL) {
- new_fname = xstrdup(buf);
- } else {
- new_fname = xstrdup(fname);
+ if (vim_FullName(fname, buf, MAXPATHL, force) == FAIL) {
+ xfree(buf);
+ return xstrdup(fname);
}
- xfree(buf);
-
- return new_fname;
+ return buf;
}
/// Saves the absolute path.
/// @param name An absolute or relative path.
/// @return The absolute path of `name`.
-char_u *save_absolute_path(const char_u *name)
- FUNC_ATTR_MALLOC FUNC_ATTR_NONNULL_RET FUNC_ATTR_NONNULL_ALL
+char_u *save_abs_path(const char_u *name)
+ FUNC_ATTR_MALLOC FUNC_ATTR_NONNULL_ALL
{
- if (!path_is_absolute_path(name)) {
+ if (!path_is_absolute(name)) {
return (char_u *)FullName_save((char *)name, true);
}
return vim_strsave((char_u *) name);
@@ -444,7 +469,7 @@ char_u *save_absolute_path(const char_u *name)
bool path_has_wildcard(const char_u *p)
FUNC_ATTR_NONNULL_ALL
{
- for (; *p; mb_ptr_adv(p)) {
+ for (; *p; MB_PTR_ADV(p)) {
#if defined(UNIX)
if (p[0] == '\\' && p[1] != NUL) {
p++;
@@ -479,7 +504,7 @@ static int pstrcmp(const void *a, const void *b)
bool path_has_exp_wildcard(const char_u *p)
FUNC_ATTR_NONNULL_ALL
{
- for (; *p != NUL; mb_ptr_adv(p)) {
+ for (; *p != NUL; MB_PTR_ADV(p)) {
#if defined(UNIX)
if (p[0] == '\\' && p[1] != NUL) {
p++;
@@ -562,11 +587,12 @@ static size_t do_path_expand(garray_T *gap, const char_u *path,
while (*path_end != NUL) {
/* May ignore a wildcard that has a backslash before it; it will
* be removed by rem_backslash() or file_pat_to_reg_pat() below. */
- if (path_end >= path + wildoff && rem_backslash(path_end))
+ if (path_end >= path + wildoff && rem_backslash(path_end)) {
*p++ = *path_end++;
- else if (*path_end == '/') {
- if (e != NULL)
+ } else if (vim_ispathsep_nocolon(*path_end)) {
+ if (e != NULL) {
break;
+ }
s = p + 1;
} else if (path_end >= path + wildoff
&& (vim_strchr((char_u *)"*?[{~$", *path_end) != NULL
@@ -579,7 +605,7 @@ static size_t do_path_expand(garray_T *gap, const char_u *path,
}
if (has_mbyte) {
len = (size_t)(*mb_ptr2len)(path_end);
- STRNCPY(p, path_end, len);
+ memcpy(p, path_end, len);
p += len;
path_end += len;
} else
@@ -648,11 +674,12 @@ static size_t do_path_expand(garray_T *gap, const char_u *path,
// Find all matching entries.
char_u *name;
scandir_next_with_dots(NULL); // initialize
- while ((name = (char_u *) scandir_next_with_dots(&dir)) && name != NULL) {
+ while ((name = (char_u *)scandir_next_with_dots(&dir)) != NULL) {
if ((name[0] != '.'
|| starts_with_dot
|| ((flags & EW_DODOT)
- && name[1] != NUL && (name[1] != '.' || name[2] != NUL)))
+ && name[1] != NUL
+ && (name[1] != '.' || name[2] != NUL))) // -V557
&& ((regmatch.regprog != NULL && vim_regexec(&regmatch, name, 0))
|| ((flags & EW_NOTWILD)
&& fnamencmp(path + (s - buf), name, e - s) == 0))) {
@@ -718,7 +745,7 @@ static int find_previous_pathsep(char_u *path, char_u **psep)
while (*psep > path) {
if (vim_ispathsep(**psep))
return OK;
- mb_ptr_back(path, *psep);
+ MB_PTR_BACK(path, *psep);
}
return FAIL;
@@ -789,7 +816,7 @@ static void expand_path_option(char_u *curdir, garray_T *gap)
STRCPY(buf, curdir); // relative to current directory
} else if (path_with_url((char *)buf)) {
continue; // URL can't be used here
- } else if (!path_is_absolute_path(buf)) {
+ } else if (!path_is_absolute(buf)) {
// Expand relative path to their full path equivalent
size_t len = STRLEN(curdir);
if (len + STRLEN(buf) + 3 > MAXPATHL) {
@@ -797,7 +824,7 @@ static void expand_path_option(char_u *curdir, garray_T *gap)
}
STRMOVE(buf + len + 1, buf);
STRCPY(buf, curdir);
- buf[len] = PATHSEP;
+ buf[len] = (char_u)PATHSEP;
simplify_filename(buf);
}
@@ -833,10 +860,12 @@ static char_u *get_path_cutoff(char_u *fname, garray_T *gap)
}
}
- /* skip to the file or directory name */
- if (cutoff != NULL)
- while (vim_ispathsep(*cutoff))
- mb_ptr_adv(cutoff);
+ // skip to the file or directory name
+ if (cutoff != NULL) {
+ while (vim_ispathsep(*cutoff)) {
+ MB_PTR_ADV(cutoff);
+ }
+ }
return cutoff;
}
@@ -884,9 +913,9 @@ static void uniquefy_paths(garray_T *gap, char_u *pattern)
in_curdir = xcalloc((size_t)gap->ga_len, sizeof(char_u *));
for (int i = 0; i < gap->ga_len && !got_int; i++) {
- char_u *path = fnames[i];
+ char_u *path = fnames[i];
int is_in_curdir;
- char_u *dir_end = gettail_dir(path);
+ char_u *dir_end = (char_u *)gettail_dir((const char *)path);
char_u *pathsep_p;
char_u *path_cutoff;
@@ -899,31 +928,42 @@ static void uniquefy_paths(garray_T *gap, char_u *pattern)
/* Shorten the filename while maintaining its uniqueness */
path_cutoff = get_path_cutoff(path, &path_ga);
- /* we start at the end of the path */
- pathsep_p = path + len - 1;
-
- while (find_previous_pathsep(path, &pathsep_p))
- if (vim_regexec(&regmatch, pathsep_p + 1, (colnr_T)0)
- && is_unique(pathsep_p + 1, gap, i)
- && path_cutoff != NULL && pathsep_p + 1 >= path_cutoff) {
- sort_again = true;
- memmove(path, pathsep_p + 1, STRLEN(pathsep_p));
- break;
+ // Don't assume all files can be reached without path when search
+ // pattern starts with **/, so only remove path_cutoff
+ // when possible.
+ if (pattern[0] == '*' && pattern[1] == '*'
+ && vim_ispathsep_nocolon(pattern[2])
+ && path_cutoff != NULL
+ && vim_regexec(&regmatch, path_cutoff, (colnr_T)0)
+ && is_unique(path_cutoff, gap, i)) {
+ sort_again = true;
+ memmove(path, path_cutoff, STRLEN(path_cutoff) + 1);
+ } else {
+ // Here all files can be reached without path, so get shortest
+ // unique path. We start at the end of the path. */
+ pathsep_p = path + len - 1;
+ while (find_previous_pathsep(path, &pathsep_p)) {
+ if (vim_regexec(&regmatch, pathsep_p + 1, (colnr_T)0)
+ && is_unique(pathsep_p + 1, gap, i)
+ && path_cutoff != NULL && pathsep_p + 1 >= path_cutoff) {
+ sort_again = true;
+ memmove(path, pathsep_p + 1, STRLEN(pathsep_p));
+ break;
+ }
}
+ }
- if (path_is_absolute_path(path)) {
- /*
- * Last resort: shorten relative to curdir if possible.
- * 'possible' means:
- * 1. It is under the current directory.
- * 2. The result is actually shorter than the original.
- *
- * Before curdir After
- * /foo/bar/file.txt /foo/bar ./file.txt
- * c:\foo\bar\file.txt c:\foo\bar .\file.txt
- * /file.txt / /file.txt
- * c:\file.txt c:\ .\file.txt
- */
+ if (path_is_absolute(path)) {
+ // Last resort: shorten relative to curdir if possible.
+ // 'possible' means:
+ // 1. It is under the current directory.
+ // 2. The result is actually shorter than the original.
+ //
+ // Before curdir After
+ // /foo/bar/file.txt /foo/bar ./file.txt
+ // c:\foo\bar\file.txt c:\foo\bar .\file.txt
+ // /file.txt / /file.txt
+ // c:\file.txt c:\ .\file.txt
short_name = path_shorten_fname(path, curdir);
if (short_name != NULL && short_name > path + 1
) {
@@ -975,20 +1015,22 @@ static void uniquefy_paths(garray_T *gap, char_u *pattern)
ga_remove_duplicate_strings(gap);
}
-/*
- * Return the end of the directory name, on the first path
- * separator:
- * "/path/file", "/path/dir/", "/path//dir", "/file"
- * ^ ^ ^ ^
- */
-char_u *gettail_dir(const char_u *fname)
+/// Find end of the directory name
+///
+/// @param[in] fname File name to process.
+///
+/// @return end of the directory name, on the first path separator:
+///
+/// "/path/file", "/path/dir/", "/path//dir", "/file"
+/// ^ ^ ^ ^
+const char *gettail_dir(const char *const fname)
+ FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
{
- const char_u *dir_end = fname;
- const char_u *next_dir_end = fname;
+ const char *dir_end = fname;
+ const char *next_dir_end = fname;
bool look_for_sep = true;
- const char_u *p;
- for (p = fname; *p != NUL; ) {
+ for (const char *p = fname; *p != NUL; ) {
if (vim_ispathsep(*p)) {
if (look_for_sep) {
next_dir_end = p;
@@ -999,9 +1041,9 @@ char_u *gettail_dir(const char_u *fname)
dir_end = next_dir_end;
look_for_sep = true;
}
- mb_ptr_adv(p);
+ MB_PTR_ADV(p);
}
- return (char_u *)dir_end;
+ return dir_end;
}
@@ -1010,30 +1052,35 @@ char_u *gettail_dir(const char_u *fname)
* result in "gap".
* Returns the total number of matches.
*/
-static int
-expand_in_path (
- garray_T *gap,
- char_u *pattern,
- int flags /* EW_* flags */
+static int expand_in_path(
+ garray_T *const gap,
+ char_u *const pattern,
+ const int flags // EW_* flags
)
{
- char_u *curdir;
garray_T path_ga;
- char_u *paths = NULL;
- curdir = xmalloc(MAXPATHL);
+ char_u *const curdir = xmalloc(MAXPATHL);
os_dirname(curdir, MAXPATHL);
ga_init(&path_ga, (int)sizeof(char_u *), 1);
expand_path_option(curdir, &path_ga);
xfree(curdir);
- if (GA_EMPTY(&path_ga))
+ if (GA_EMPTY(&path_ga)) {
return 0;
+ }
- paths = ga_concat_strings(&path_ga);
+ char_u *const paths = ga_concat_strings(&path_ga);
ga_clear_strings(&path_ga);
- globpath(paths, pattern, gap, (flags & EW_ICASE) ? WILD_ICASE : 0);
+ int glob_flags = 0;
+ if (flags & EW_ICASE) {
+ glob_flags |= WILD_ICASE;
+ }
+ if (flags & EW_ADDSLASH) {
+ glob_flags |= WILD_ADD_SLASH;
+ }
+ globpath(paths, pattern, gap, glob_flags);
xfree(paths);
return gap->ga_len;
@@ -1046,29 +1093,29 @@ expand_in_path (
*/
static bool has_env_var(char_u *p)
{
- for (; *p; mb_ptr_adv(p)) {
- if (*p == '\\' && p[1] != NUL)
- ++p;
- else if (vim_strchr((char_u *)
- "$"
- , *p) != NULL)
+ for (; *p; MB_PTR_ADV(p)) {
+ if (*p == '\\' && p[1] != NUL) {
+ p++;
+ } else if (vim_strchr((char_u *) "$" , *p) != NULL) {
return true;
+ }
}
return false;
}
#ifdef SPECIAL_WILDCHAR
-/*
- * Return TRUE if "p" contains a special wildcard character.
- * Allowing for escaping.
- */
+
+// Return TRUE if "p" contains a special wildcard character, one that Vim
+// cannot expand, requires using a shell.
static bool has_special_wildchar(char_u *p)
{
- for (; *p; mb_ptr_adv(p)) {
- if (*p == '\\' && p[1] != NUL)
- ++p;
- else if (vim_strchr((char_u *)SPECIAL_WILDCHAR, *p) != NULL)
+ for (; *p; MB_PTR_ADV(p)) {
+ // Allow for escaping
+ if (*p == '\\' && p[1] != NUL) {
+ p++;
+ } else if (vim_strchr((char_u *)SPECIAL_WILDCHAR, *p) != NULL) {
return true;
+ }
}
return false;
}
@@ -1181,7 +1228,7 @@ int gen_expand_wildcards(int num_pat, char_u **pat, int *num_file,
*/
if (path_has_exp_wildcard(p)) {
if ((flags & EW_PATH)
- && !path_is_absolute_path(p)
+ && !path_is_absolute(p)
&& !(p[0] == '.'
&& (vim_ispathsep(p[1])
|| (p[1] == '.' && vim_ispathsep(p[2]))))
@@ -1207,7 +1254,7 @@ int gen_expand_wildcards(int num_pat, char_u **pat, int *num_file,
* "vim c:/" work. */
if (flags & EW_NOTFOUND) {
addfile(&ga, t, flags | EW_DIR | EW_FILE);
- } else if (os_path_exists(t)) {
+ } else {
addfile(&ga, t, flags);
}
xfree(t);
@@ -1296,14 +1343,14 @@ static int expand_backtick(
/// When the path looks like a URL leave it unmodified.
void slash_adjust(char_u *p)
{
- if (path_with_url(p)) {
+ if (path_with_url((const char *)p)) {
return;
}
while (*p) {
- if (*p == psepcN) {
- *p = psepc;
+ if (*p == (char_u)psepcN) {
+ *p = (char_u)psepc;
}
- mb_ptr_adv(p);
+ MB_PTR_ADV(p);
}
}
#endif
@@ -1404,19 +1451,22 @@ void simplify_filename(char_u *filename)
* we are after "start", or strip "." if we are at the beginning
* of an absolute path name . */
tail = p + 1;
- if (p[1] != NUL)
- while (vim_ispathsep(*tail))
- mb_ptr_adv(tail);
- else if (p > start)
- --p; /* strip preceding path separator */
+ if (p[1] != NUL) {
+ while (vim_ispathsep(*tail)) {
+ MB_PTR_ADV(tail);
+ }
+ } else if (p > start) {
+ p--; // strip preceding path separator
+ }
STRMOVE(p, tail);
}
} else if (p[0] == '.' && p[1] == '.'
&& (vim_ispathsep(p[2]) || p[2] == NUL)) {
// Skip to after ".." or "../" or "..///".
tail = p + 2;
- while (vim_ispathsep(*tail))
- mb_ptr_adv(tail);
+ while (vim_ispathsep(*tail)) {
+ MB_PTR_ADV(tail);
+ }
if (components > 0) { /* strip one preceding component */
bool do_strip = false;
@@ -1435,10 +1485,11 @@ void simplify_filename(char_u *filename)
}
p[-1] = saved_char;
- --p;
- /* Skip back to after previous '/'. */
- while (p > start && !after_pathsep((char *)start, (char *)p))
- mb_ptr_back(start, p);
+ p--;
+ // Skip back to after previous '/'.
+ while (p > start && !after_pathsep((char *)start, (char *)p)) {
+ MB_PTR_BACK(start, p);
+ }
if (!do_strip) {
/* If the component exists in the file system, check
@@ -1520,8 +1571,8 @@ void simplify_filename(char_u *filename)
p = tail; /* skip to char after ".." or "../" */
}
} else {
- ++components; /* simple path component */
- p = path_next_component(p);
+ components++; // Simple path component.
+ p = (char_u *)path_next_component((const char *)p);
}
} while (*p != NUL);
}
@@ -1627,35 +1678,48 @@ int path_with_url(const char *fname)
*/
bool vim_isAbsName(char_u *name)
{
- return path_with_url((char *)name) != 0 || path_is_absolute_path(name);
+ return path_with_url((char *)name) != 0 || path_is_absolute(name);
}
/// Save absolute file name to "buf[len]".
///
-/// @param fname is the filename to evaluate
-/// @param[out] buf is the buffer for returning the absolute path for `fname`
-/// @param len is the length of `buf`
-/// @param force is a flag to force expanding even if the path is absolute
+/// @param fname filename to evaluate
+/// @param[out] buf contains `fname` absolute path, or:
+/// - truncated `fname` if longer than `len`
+/// - unmodified `fname` if absolute path fails or is a URL
+/// @param len length of `buf`
+/// @param force flag to force expanding even if the path is absolute
///
/// @return FAIL for failure, OK otherwise
int vim_FullName(const char *fname, char *buf, size_t len, bool force)
FUNC_ATTR_NONNULL_ARG(2)
{
- int retval = OK;
- int url;
-
*buf = NUL;
- if (fname == NULL)
+ if (fname == NULL) {
return FAIL;
+ }
- url = path_with_url(fname);
- if (!url)
- retval = path_get_absolute_path((char_u *)fname, (char_u *)buf, len, force);
- if (url || retval == FAIL) {
- /* something failed; use the file name (truncate when too long) */
+ if (strlen(fname) > (len - 1)) {
+ xstrlcpy(buf, fname, len); // truncate
+#ifdef WIN32
+ slash_adjust((char_u *)buf);
+#endif
+ return FAIL;
+ }
+
+ if (path_with_url(fname)) {
xstrlcpy(buf, fname, len);
+ return OK;
}
- return retval;
+
+ int rv = path_to_absolute((char_u *)fname, (char_u *)buf, len, force);
+ if (rv == FAIL) {
+ xstrlcpy(buf, fname, len); // something failed; use the filename
+ }
+#ifdef WIN32
+ slash_adjust((char_u *)buf);
+#endif
+ return rv;
}
/// Get the full resolved path for `fname`
@@ -1668,7 +1732,7 @@ int vim_FullName(const char *fname, char *buf, size_t len, bool force)
///
/// @param fname is the filename to expand
/// @return [allocated] Full path (NULL for failure).
-char *fix_fname(char *fname)
+char *fix_fname(const char *fname)
{
#ifdef UNIX
return FullName_save(fname, true);
@@ -1688,7 +1752,7 @@ char *fix_fname(char *fname)
path_fix_case((char_u *)fname); // set correct case for file name
# endif
- return fname;
+ return (char *)fname;
#endif
}
@@ -1706,7 +1770,7 @@ void path_fix_case(char_u *name)
}
// Open the directory where the file is located.
- char_u *slash = vim_strrchr(name, '/');
+ char_u *slash = STRRCHR(name, '/');
char_u *tail;
Directory dir;
bool ok;
@@ -1755,7 +1819,7 @@ void path_fix_case(char_u *name)
int after_pathsep(const char *b, const char *p)
{
return p > b && vim_ispathsep(p[-1])
- && (!has_mbyte || (*mb_head_off)((char_u *)b, (char_u *)p - 1) == 0);
+ && utf_head_off((char_u *)b, (char_u *)p - 1) == 0;
}
/*
@@ -1809,7 +1873,7 @@ int pathcmp(const char *p, const char *q, int maxlen)
break;
}
- if ((p_fic ? vim_toupper(c1) != vim_toupper(c2) : c1 != c2)
+ if ((p_fic ? mb_toupper(c1) != mb_toupper(c2) : c1 != c2)
#ifdef BACKSLASH_IN_FILENAME
/* consider '/' and '\\' to be equal */
&& !((c1 == '/' && c2 == '\\')
@@ -1820,8 +1884,8 @@ int pathcmp(const char *p, const char *q, int maxlen)
return -1;
if (vim_ispathsep(c2))
return 1;
- return p_fic ? vim_toupper(c1) - vim_toupper(c2)
- : c1 - c2; /* no match */
+ return p_fic ? mb_toupper(c1) - mb_toupper(c2)
+ : c1 - c2; // no match
}
i += MB_PTR2LEN((char_u *)p + i);
@@ -1857,7 +1921,7 @@ int pathcmp(const char *p, const char *q, int maxlen)
/// - Pointer into `full_path` if shortened.
/// - `full_path` unchanged if no shorter name is possible.
/// - NULL if `full_path` is NULL.
-char_u *path_shorten_fname_if_possible(char_u *full_path)
+char_u *path_try_shorten_fname(char_u *full_path)
{
char_u *dirname = xmalloc(MAXPATHL);
char_u *p = full_path;
@@ -1974,14 +2038,13 @@ int expand_wildcards(int num_pat, char_u **pat, int *num_files, char_u ***files,
if (*p_wig) {
char_u *ffname;
- // check all filess in (*files)[]
+ // check all files in (*files)[]
for (i = 0; i < *num_files; i++) {
ffname = (char_u *)FullName_save((char *)(*files)[i], false);
- if (ffname == NULL) { // out of memory
- break;
- }
+ assert((*files)[i] != NULL);
+ assert(ffname != NULL);
if (match_file_list(p_wig, (*files)[i], ffname)) {
- // remove this matching files from the list
+ // remove this matching file from the list
xfree((*files)[i]);
for (j = i; j + 1 < *num_files; j++) {
(*files)[j] = (*files)[j + 1];
@@ -2099,24 +2162,18 @@ int path_full_dir_name(char *directory, char *buffer, size_t len)
}
// Append to_append to path with a slash in between.
-// Append to_append to path with a slash in between.
int append_path(char *path, const char *to_append, size_t max_len)
{
size_t current_length = strlen(path);
size_t to_append_length = strlen(to_append);
- // Do not append empty strings.
- if (to_append_length == 0) {
- return OK;
- }
-
- // Do not append a dot.
- if (STRCMP(to_append, ".") == 0) {
+ // Do not append empty string or a dot.
+ if (to_append_length == 0 || strcmp(to_append, ".") == 0) {
return OK;
}
- // Glue both paths with a slash.
- if (current_length > 0 && path[current_length-1] != '/') {
+ // Combine the path segments, separated by a slash.
+ if (current_length > 0 && !vim_ispathsep_nocolon(path[current_length-1])) {
current_length += 1; // Count the trailing slash.
// +1 for the NUL at the end.
@@ -2124,7 +2181,7 @@ int append_path(char *path, const char *to_append, size_t max_len)
return FAIL;
}
- STRCAT(path, "/");
+ xstrlcat(path, PATHSEPSTR, max_len);
}
// +1 for the NUL at the end.
@@ -2132,7 +2189,7 @@ int append_path(char *path, const char *to_append, size_t max_len)
return FAIL;
}
- STRCAT(path, to_append);
+ xstrlcat(path, to_append, max_len);
return OK;
}
@@ -2144,8 +2201,8 @@ int append_path(char *path, const char *to_append, size_t max_len)
/// @param force also expand when "fname" is already absolute.
///
/// @return FAIL for failure, OK for success.
-static int path_get_absolute_path(const char_u *fname, char_u *buf,
- size_t len, int force)
+static int path_to_absolute(const char_u *fname, char_u *buf, size_t len,
+ int force)
{
char_u *p;
*buf = NUL;
@@ -2154,15 +2211,22 @@ static int path_get_absolute_path(const char_u *fname, char_u *buf,
char *end_of_path = (char *) fname;
// expand it if forced or not an absolute path
- if (force || !path_is_absolute_path(fname)) {
- if ((p = vim_strrchr(fname, '/')) != NULL) {
+ if (force || !path_is_absolute(fname)) {
+ p = STRRCHR(fname, '/');
+#ifdef WIN32
+ if (p == NULL) {
+ p = STRRCHR(fname, '\\');
+ }
+#endif
+ if (p != NULL) {
// relative to root
if (p == fname) {
// only one path component
- relative_directory[0] = '/';
+ relative_directory[0] = PATHSEP;
relative_directory[1] = NUL;
} else {
- STRNCPY(relative_directory, fname, p-fname);
+ assert(p >= fname);
+ memcpy(relative_directory, fname, (size_t)(p - fname));
relative_directory[p-fname] = NUL;
}
end_of_path = (char *) (p + 1);
@@ -2180,11 +2244,65 @@ static int path_get_absolute_path(const char_u *fname, char_u *buf,
return append_path((char *)buf, end_of_path, len);
}
-/// Check if the given file is absolute.
+/// Check if file `fname` is a full (absolute) path.
///
-/// This just checks if the file name starts with '/' or '~'.
/// @return `TRUE` if "fname" is absolute.
-int path_is_absolute_path(const char_u *fname)
+int path_is_absolute(const char_u *fname)
{
+#ifdef WIN32
+ // A name like "d:/foo" and "//server/share" is absolute
+ return ((isalpha(fname[0]) && fname[1] == ':'
+ && vim_ispathsep_nocolon(fname[2]))
+ || (vim_ispathsep_nocolon(fname[0]) && fname[0] == fname[1]));
+#else
+ // UNIX: This just checks if the file name starts with '/' or '~'.
return *fname == '/' || *fname == '~';
+#endif
+}
+
+/// Builds a full path from an invocation name `argv0`, based on heuristics.
+///
+/// @param[in] argv0 Name by which Nvim was invoked.
+/// @param[out] buf Guessed full path to `argv0`.
+/// @param[in] bufsize Size of `buf`.
+///
+/// @see os_exepath
+void path_guess_exepath(const char *argv0, char *buf, size_t bufsize)
+ FUNC_ATTR_NONNULL_ALL
+{
+ char *path = getenv("PATH");
+
+ if (path == NULL || path_is_absolute((char_u *)argv0)) {
+ xstrlcpy(buf, argv0, bufsize);
+ } else if (argv0[0] == '.' || strchr(argv0, PATHSEP)) {
+ // Relative to CWD.
+ if (os_dirname((char_u *)buf, MAXPATHL) != OK) {
+ buf[0] = NUL;
+ }
+ xstrlcat(buf, PATHSEPSTR, bufsize);
+ xstrlcat(buf, argv0, bufsize);
+ } else {
+ // Search $PATH for plausible location.
+ const void *iter = NULL;
+ do {
+ const char *dir;
+ size_t dir_len;
+ iter = vim_env_iter(ENV_SEPCHAR, path, iter, &dir, &dir_len);
+ if (dir == NULL || dir_len == 0) {
+ break;
+ }
+ if (dir_len + 1 > sizeof(NameBuff)) {
+ continue;
+ }
+ xstrlcpy((char *)NameBuff, dir, dir_len + 1);
+ xstrlcat((char *)NameBuff, PATHSEPSTR, sizeof(NameBuff));
+ xstrlcat((char *)NameBuff, argv0, sizeof(NameBuff));
+ if (os_can_exe(NameBuff, NULL, false)) {
+ xstrlcpy(buf, (char *)NameBuff, bufsize);
+ return;
+ }
+ } while (iter != NULL);
+ // Not found in $PATH, fall back to argv0.
+ xstrlcpy(buf, argv0, bufsize);
+ }
}
diff --git a/src/nvim/po/CMakeLists.txt b/src/nvim/po/CMakeLists.txt
index 184c4894b9..3a70264dd1 100644
--- a/src/nvim/po/CMakeLists.txt
+++ b/src/nvim/po/CMakeLists.txt
@@ -1,15 +1,14 @@
-find_package(Gettext)
+find_package(Gettext REQUIRED)
find_program(XGETTEXT_PRG xgettext)
find_program(ICONV_PRG iconv)
-if(HAVE_WORKING_LIBINTL AND GETTEXT_FOUND AND XGETTEXT_PRG AND ICONV_PRG)
- set(ENV{OLD_PO_FILE_INPUT} yes)
- set(ENV{OLD_PO_FILE_OUTPUT} yes)
-
+option(LANGUAGES "Localizations to build")
+if(NOT LANGUAGES)
set(LANGUAGES
af
ca
cs
+ da
de
en_GB
eo
@@ -22,22 +21,26 @@ if(HAVE_WORKING_LIBINTL AND GETTEXT_FOUND AND XGETTEXT_PRG AND ICONV_PRG)
ko.UTF-8
nl
no
- pl
+ pl.UTF-8
pt_BR
ru
sk
sv
uk
vi
- zh_CN
zh_CN.UTF-8
- zh_TW
zh_TW.UTF-8)
+endif()
+
+if(HAVE_WORKING_LIBINTL AND GETTEXT_FOUND AND XGETTEXT_PRG AND ICONV_PRG)
+ set(ENV{OLD_PO_FILE_INPUT} yes)
+ set(ENV{OLD_PO_FILE_OUTPUT} yes)
+
- set(NEOVIM_RELATIVE_SOURCES)
- foreach(SRC ${NEOVIM_SOURCES} ${NEOVIM_HEADERS})
+ set(NVIM_RELATIVE_SOURCES)
+ foreach(SRC ${NVIM_SOURCES} ${NVIM_HEADERS})
file(RELATIVE_PATH RELATIVE_SRC ${CMAKE_CURRENT_SOURCE_DIR} ${SRC})
- list(APPEND NEOVIM_RELATIVE_SOURCES ${RELATIVE_SRC})
+ list(APPEND NVIM_RELATIVE_SOURCES ${RELATIVE_SRC})
endforeach()
set(NVIM_POT ${CMAKE_CURRENT_BINARY_DIR}/nvim.pot)
@@ -48,11 +51,12 @@ if(HAVE_WORKING_LIBINTL AND GETTEXT_FOUND AND XGETTEXT_PRG AND ICONV_PRG)
-DXGETTEXT_PRG=${XGETTEXT_PRG}
-DPOT_FILE=${NVIM_POT}
-DSEARCH_DIR=${CMAKE_CURRENT_SOURCE_DIR}
- "'-DSOURCES=${NEOVIM_RELATIVE_SOURCES}'"
+ "\"-DSOURCES=${NVIM_RELATIVE_SOURCES}\""
-P ${PROJECT_SOURCE_DIR}/cmake/RunXgettext.cmake
- DEPENDS ${NEOVIM_SOURCES})
+ DEPENDS ${NVIM_SOURCES})
add_custom_target(potfile DEPENDS ${NVIM_POT})
+ set_target_properties(potfile PROPERTIES FOLDER po)
set(LANGUAGE_MO_FILES)
set(UPDATE_PO_TARGETS)
@@ -89,6 +93,7 @@ if(HAVE_WORKING_LIBINTL AND GETTEXT_FOUND AND XGETTEXT_PRG AND ICONV_PRG)
COMMENT "Checking ${name}.po"
VERBATIM
DEPENDS ${poFile})
+ set_target_properties(check-po-${name} PROPERTIES FOLDER po/check)
endmacro()
macro(BuildPoIconvGenericWithCharset
@@ -137,49 +142,30 @@ if(HAVE_WORKING_LIBINTL AND GETTEXT_FOUND AND XGETTEXT_PRG AND ICONV_PRG)
endmacro()
# Create some translations from others.
- BuildPoIconv(ja utf-8 euc-jp)
- BuildMo(ja.euc-jp)
-
- BuildPoIconv(cs ISO-8859-2 cp1250)
- BuildMo(cs.cp1250)
-
- BuildPoIconv(pl ISO-8859-2 cp1250)
- BuildMo(pl.cp1250)
-
- BuildPoIconv(pl ISO-8859-2 UTF-8)
- BuildMo(pl.UTF-8)
-
- BuildPoIconv(sk ISO-8859-2 cp1250)
- BuildMo(sk.cp1250)
-
- BuildPoIconv(ru UTF-8 cp1251)
- BuildMo(ru.cp1251)
-
- BuildPoIconv(uk UTF-8 cp1251)
- BuildMo(uk.cp1251)
+ if(";${LANGUAGES};" MATCHES ";ja;")
+ BuildPoIconv(ja utf-8 euc-jp)
+ BuildMo(ja.euc-jp)
+ endif()
- BuildPoIconvGeneric(ko ko.UTF-8 ko UTF-8 euc-kr)
- BuildMo(ko)
+ if(";${LANGUAGES};" MATCHES ";cs;")
+ BuildPoIconv(cs ISO-8859-2 cp1250)
+ BuildMo(cs.cp1250)
+ endif()
- BuildPoIconvGenericWithCharset(zh_CN.cp936 zh_CN zh_CN.cp936 gb2312 cp936 gbk)
- BuildMo(zh_CN.cp936)
+ if(";${LANGUAGES};" MATCHES ";sk;")
+ BuildPoIconv(sk ISO-8859-2 cp1250)
+ BuildMo(sk.cp1250)
+ endif()
add_custom_target(update-po-nb
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_CURRENT_SOURCE_DIR}/no.po ${CMAKE_CURRENT_SOURCE_DIR}/nb.po
DEPENDS no.po)
list(APPEND UPDATE_PO_TARGETS update-po-nb)
- CheckPo(nb)
- BuildMo(nb)
-
- add_executable(sjiscorr sjiscorr.c)
- add_custom_target(update-po-ja.sjis
- COMMAND iconv -f utf-8 -t cp932 ${CMAKE_CURRENT_SOURCE_DIR}/ja.po |
- $<TARGET_FILE:sjiscorr> > ${CMAKE_CURRENT_SOURCE_DIR}/ja.sjis.po
- DEPENDS ja.po sjiscorr)
- list(APPEND UPDATE_PO_TARGETS update-po-ja.sjis)
- CheckPo(ja.sjis)
- BuildMo(ja.sjis)
+ if(";${LANGUAGES};" MATCHES ";no;")
+ CheckPo(nb)
+ BuildMo(nb)
+ endif()
foreach(LANGUAGE ${LANGUAGES})
set(poFile "${CMAKE_CURRENT_SOURCE_DIR}/${LANGUAGE}.po")
@@ -199,7 +185,9 @@ if(HAVE_WORKING_LIBINTL AND GETTEXT_FOUND AND XGETTEXT_PRG AND ICONV_PRG)
BuildMo(${LANGUAGE})
endforeach()
+ set_target_properties(${UPDATE_PO_TARGETS} PROPERTIES FOLDER po/update)
add_custom_target(translations ALL DEPENDS ${LANGUAGE_MO_FILES})
add_custom_target(update-po DEPENDS ${UPDATE_PO_TARGETS})
+ set_target_properties(translations update-po PROPERTIES FOLDER po)
endif()
diff --git a/src/nvim/po/af.po b/src/nvim/po/af.po
index 6bb93b9e02..61ad72d7e0 100644
--- a/src/nvim/po/af.po
+++ b/src/nvim/po/af.po
@@ -26,7 +26,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Vim 6.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-05-26 14:21+0200\n"
+"POT-Creation-Date: 2017-11-07 20:04+0100\n"
"PO-Revision-Date: Wed Oct 31 13:41 SAST 2001\n"
"Last-Translator: Danie Roux <droux@tuks.co.za>\n"
"Language-Team: Danie Roux <droux@tuks.co.za>\n"
@@ -35,101 +35,74 @@ msgstr ""
"Content-Type: text/plain; charset=ISO_8859-1\n"
"Content-Transfer-Encoding: 8-bit\n"
-#: ../api/private/helpers.c:201
-#, fuzzy
-msgid "Unable to get option value"
-msgstr "E258: Kan nie na kli๋nt stuur nie"
-
-#: ../api/private/helpers.c:204
-msgid "internal error: unknown option type"
-msgstr ""
-
-#: ../buffer.c:92
-msgid "[Location List]"
-msgstr ""
+#~ msgid "[Location List]"
+#~ msgstr ""
-#: ../buffer.c:93
-msgid "[Quickfix List]"
-msgstr ""
+#~ msgid "[Quickfix List]"
+#~ msgstr ""
-#: ../buffer.c:94
-msgid "E855: Autocommands caused command to abort"
-msgstr ""
+#~ msgid "E855: Autocommands caused command to abort"
+#~ msgstr ""
-#: ../buffer.c:135
msgid "E82: Cannot allocate any buffer, exiting..."
msgstr "E82: Kan nie buffer toeken nie, program sluit..."
-#: ../buffer.c:138
msgid "E83: Cannot allocate buffer, using other one..."
msgstr "E83: Kan nie buffer toeken nie, gaan ander een gebruik..."
-#: ../buffer.c:763
+#~ msgid "E937: Attempt to delete a buffer that is in use"
+#~ msgstr ""
+
msgid "E515: No buffers were unloaded"
msgstr "E515: Geen buffers is uitgelaai nie"
-#: ../buffer.c:765
msgid "E516: No buffers were deleted"
msgstr "E516: Geen buffers is geskrap nie"
-#: ../buffer.c:767
msgid "E517: No buffers were wiped out"
msgstr "E517: Geen buffers is geskrap nie"
-#: ../buffer.c:772
msgid "1 buffer unloaded"
msgstr "1 buffer uitgelaai"
-#: ../buffer.c:774
#, c-format
msgid "%d buffers unloaded"
msgstr "%d buffers uitgelaai"
-#: ../buffer.c:777
msgid "1 buffer deleted"
msgstr "1 buffer geskrap"
-#: ../buffer.c:779
#, c-format
msgid "%d buffers deleted"
msgstr "%d buffers geskrap"
-#: ../buffer.c:782
msgid "1 buffer wiped out"
msgstr "1 buffer geskrap"
-#: ../buffer.c:784
#, c-format
msgid "%d buffers wiped out"
msgstr "%d buffers geskrap"
-#: ../buffer.c:806
msgid "E90: Cannot unload last buffer"
msgstr "E90: Kan nie laaste buffer uitlaai nie"
-#: ../buffer.c:874
msgid "E84: No modified buffer found"
msgstr "E84: Geen veranderde buffer gevind nie"
#. back where we started, didn't find anything.
-#: ../buffer.c:903
msgid "E85: There is no listed buffer"
msgstr "E85: Daar is geen gelyste buffer nie"
-#: ../buffer.c:913
-#, c-format
-msgid "E86: Buffer %<PRId64> does not exist"
-msgstr "E86: Buffer %<PRId64> bestaan nie"
-
-#: ../buffer.c:915
msgid "E87: Cannot go beyond last buffer"
msgstr "E87: Kan nie verby laaste buffer gaan nie"
-#: ../buffer.c:917
msgid "E88: Cannot go before first buffer"
msgstr "E88: Kan nie v๓๓r eerste buffer gaan nie"
-#: ../buffer.c:945
+#, fuzzy, c-format
+#~ msgid "E89: %s will be killed(add ! to override)"
+#~ msgstr "E189: \"%s\" bestaan (gebruik ! om te dwing)"
+
#, c-format
msgid ""
"E89: No write since last change for buffer %<PRId64> (add ! to override)"
@@ -138,117 +111,85 @@ msgstr ""
"dwing)"
#. wrap around (may cause duplicates)
-#: ../buffer.c:1423
msgid "W14: Warning: List of file names overflow"
msgstr "W14: Waarskuwing: L๊erlys loop oor"
-#: ../buffer.c:1555 ../quickfix.c:3361
#, c-format
msgid "E92: Buffer %<PRId64> not found"
msgstr "E92: buffer %<PRId64> kon nie gevind word nie"
-#: ../buffer.c:1798
#, c-format
msgid "E93: More than one match for %s"
msgstr "E93: Meer as een treffer vir %s"
-#: ../buffer.c:1800
#, c-format
msgid "E94: No matching buffer for %s"
msgstr "E94: Geen buffer wat by %s pas nie"
-#: ../buffer.c:2161
#, c-format
msgid "line %<PRId64>"
msgstr "re๋l %<PRId64>"
-#: ../buffer.c:2233
msgid "E95: Buffer with this name already exists"
msgstr "E95: Buffer met hierdie naam bestaan alreeds"
-#: ../buffer.c:2498
msgid " [Modified]"
msgstr " [Gewysig]"
-#: ../buffer.c:2501
msgid "[Not edited]"
msgstr "[Ongewysig]"
-#: ../buffer.c:2504
msgid "[New file]"
msgstr "[Nuwe l๊er]"
-#: ../buffer.c:2505
msgid "[Read errors]"
msgstr "[Leesfoute]"
-#: ../buffer.c:2506 ../buffer.c:3217 ../fileio.c:1807 ../screen.c:4895
msgid "[RO]"
msgstr "[RO]"
-#: ../buffer.c:2507 ../fileio.c:1807
msgid "[readonly]"
msgstr "[lees alleen]"
-#: ../buffer.c:2524
#, c-format
msgid "1 line --%d%%--"
msgstr "1 re๋l --%d%%--"
-#: ../buffer.c:2526
#, c-format
msgid "%<PRId64> lines --%d%%--"
msgstr "%<PRId64> re๋ls --%d%%--"
-#: ../buffer.c:2530
#, c-format
msgid "line %<PRId64> of %<PRId64> --%d%%-- col "
msgstr "re๋l %<PRId64> van %<PRId64> --%d%%-- kolom "
-#: ../buffer.c:2632 ../buffer.c:4292 ../memline.c:1554
#, fuzzy
-msgid "[No Name]"
-msgstr "[Geen l๊er]"
+#~ msgid "[No Name]"
+#~ msgstr "[Geen l๊er]"
#. must be a help buffer
-#: ../buffer.c:2667
msgid "help"
msgstr "help"
-#: ../buffer.c:3225 ../screen.c:4883
#, fuzzy
-msgid "[Help]"
-msgstr "[help]"
+#~ msgid "[Help]"
+#~ msgstr "[help]"
-#: ../buffer.c:3254 ../screen.c:4887
msgid "[Preview]"
msgstr "[Voorskou]"
-#: ../buffer.c:3528
msgid "All"
msgstr "Alles"
-#: ../buffer.c:3528
msgid "Bot"
msgstr "Ond"
-#: ../buffer.c:3531
msgid "Top"
msgstr "Bo"
-#: ../buffer.c:4244
-msgid ""
-"\n"
-"# Buffer list:\n"
-msgstr ""
-"\n"
-"# Buffer lys:\n"
-
-#: ../buffer.c:4289
-msgid "[Scratch]"
-msgstr ""
+#~ msgid "[Scratch]"
+#~ msgstr ""
-#: ../buffer.c:4529
msgid ""
"\n"
"--- Signs ---"
@@ -256,208 +197,161 @@ msgstr ""
"\n"
"--- Tekens ---"
-#: ../buffer.c:4538
#, c-format
msgid "Signs for %s:"
msgstr "Tekens vir %s:"
-#: ../buffer.c:4543
#, c-format
msgid " line=%<PRId64> id=%d name=%s"
msgstr " re๋l=%<PRId64> id=%d naam=%s"
-#: ../cursor_shape.c:68
msgid "E545: Missing colon"
msgstr "E545: Ontbrekende dubbelpunt"
-#: ../cursor_shape.c:70 ../cursor_shape.c:94
msgid "E546: Illegal mode"
msgstr "E546: Ongeldige modus"
-#: ../cursor_shape.c:134
msgid "E548: digit expected"
msgstr "E548: syfer verwag"
-#: ../cursor_shape.c:138
msgid "E549: Illegal percentage"
msgstr "E549: Ongeldige persentasie"
-#: ../diff.c:146
-#, c-format
-msgid "E96: Can not diff more than %<PRId64> buffers"
-msgstr "E96: Kan nie meer as %<PRId64> buffers 'diff' nie"
+#, fuzzy, c-format
+#~ msgid "E96: Cannot diff more than %<PRId64> buffers"
+#~ msgstr "E96: Kan nie meer as %<PRId64> buffers 'diff' nie"
-#: ../diff.c:753
#, fuzzy
-msgid "E810: Cannot read or write temp files"
-msgstr "E557: Kan nie 'termcap'-l๊er oopmaak nie"
+#~ msgid "E810: Cannot read or write temp files"
+#~ msgstr "E557: Kan nie 'termcap'-l๊er oopmaak nie"
-#: ../diff.c:755
msgid "E97: Cannot create diffs"
msgstr "E97: Kan nie 'diffs' skep nie "
-#: ../diff.c:966
#, fuzzy
-msgid "E816: Cannot read patch output"
-msgstr "E98: Kan nie 'diff' afvoer lees nie"
+#~ msgid "E816: Cannot read patch output"
+#~ msgstr "E98: Kan nie 'diff' afvoer lees nie"
-#: ../diff.c:1220
msgid "E98: Cannot read diff output"
msgstr "E98: Kan nie 'diff' afvoer lees nie"
-#: ../diff.c:2081
msgid "E99: Current buffer is not in diff mode"
msgstr "E99: Huidige buffer is nie in 'diff' modus nie"
-#: ../diff.c:2100
#, fuzzy
-msgid "E793: No other buffer in diff mode is modifiable"
-msgstr "E100: Geen ander buffer in 'diff' modus nie"
+#~ msgid "E793: No other buffer in diff mode is modifiable"
+#~ msgstr "E100: Geen ander buffer in 'diff' modus nie"
-#: ../diff.c:2102
msgid "E100: No other buffer in diff mode"
msgstr "E100: Geen ander buffer in 'diff' modus nie"
-#: ../diff.c:2112
msgid "E101: More than two buffers in diff mode, don't know which one to use"
msgstr ""
"E101: Meer as twee buffers in 'diff' modus, weet nie watter een om te "
"gebruik nie"
-#: ../diff.c:2141
#, c-format
msgid "E102: Can't find buffer \"%s\""
msgstr "E102: Kan buffer %s nie vind nie"
-#: ../diff.c:2152
#, c-format
msgid "E103: Buffer \"%s\" is not in diff mode"
msgstr "E103: Buffer \"%s\" is nie in 'diff' modus nie"
-#: ../diff.c:2193
-msgid "E787: Buffer changed unexpectedly"
-msgstr ""
+#~ msgid "E787: Buffer changed unexpectedly"
+#~ msgstr ""
-#: ../digraph.c:1598
msgid "E104: Escape not allowed in digraph"
msgstr "E104: 'Escape' nie toegelaat in digraaf nie"
-#: ../digraph.c:1760
msgid "E544: Keymap file not found"
msgstr "E544: Sleutelbindingl๊er nie gevind nie"
-#: ../digraph.c:1785
msgid "E105: Using :loadkeymap not in a sourced file"
msgstr "E105: :loadkeymap word buite 'n uitvoerl๊er gebruik"
-#: ../digraph.c:1821
-msgid "E791: Empty keymap entry"
-msgstr ""
+#~ msgid "E791: Empty keymap entry"
+#~ msgstr ""
-#: ../edit.c:82
msgid " Keyword completion (^N^P)"
msgstr " Sleutelwoord voltooiing (^N^P)"
#. ctrl_x_mode == 0, ^P/^N compl.
-#: ../edit.c:83
#, fuzzy
-msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-msgstr " ^X modus (^E^Y^L^]^F^I^K^D^V^N^P)"
+#~ msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
+#~ msgstr " ^X modus (^E^Y^L^]^F^I^K^D^V^N^P)"
-#: ../edit.c:85
msgid " Whole line completion (^L^N^P)"
msgstr " Hele-re๋l voltooiing (^L^N^P)"
-#: ../edit.c:86
msgid " File name completion (^F^N^P)"
msgstr " L๊ernaam voltooiing (^F^N^P)"
-#: ../edit.c:87
msgid " Tag completion (^]^N^P)"
msgstr " Etiketvoltooiing (^]^N^P)"
-#: ../edit.c:88
msgid " Path pattern completion (^N^P)"
msgstr " Gidspatroon voltooiing (^N^P)"
-#: ../edit.c:89
msgid " Definition completion (^D^N^P)"
msgstr " Definisievoltooiing (^D^N^P)"
-#: ../edit.c:91
msgid " Dictionary completion (^K^N^P)"
msgstr " Woordeboekvoltooiing (^K^N^P)"
-#: ../edit.c:92
msgid " Thesaurus completion (^T^N^P)"
msgstr " Tesourusvoltooiing (^T^N^P)"
-#: ../edit.c:93
msgid " Command-line completion (^V^N^P)"
msgstr " Bevelre๋lvoltooiing (^V^N^P)"
-#: ../edit.c:94
#, fuzzy
-msgid " User defined completion (^U^N^P)"
-msgstr " Hele-re๋l voltooiing (^L^N^P)"
+#~ msgid " User defined completion (^U^N^P)"
+#~ msgstr " Hele-re๋l voltooiing (^L^N^P)"
-#: ../edit.c:95
#, fuzzy
-msgid " Omni completion (^O^N^P)"
-msgstr " Etiketvoltooiing (^]^N^P)"
+#~ msgid " Omni completion (^O^N^P)"
+#~ msgstr " Etiketvoltooiing (^]^N^P)"
-#: ../edit.c:96
#, fuzzy
-msgid " Spelling suggestion (s^N^P)"
-msgstr " Hele-re๋l voltooiing (^L^N^P)"
+#~ msgid " Spelling suggestion (s^N^P)"
+#~ msgstr " Hele-re๋l voltooiing (^L^N^P)"
-#: ../edit.c:97
msgid " Keyword Local completion (^N^P)"
msgstr " Sleutelwoord Lokale voltooiing (^N^P)"
-#: ../edit.c:100
msgid "Hit end of paragraph"
msgstr "Het einde van paragraaf getref"
-#: ../edit.c:101
-msgid "E839: Completion function changed window"
-msgstr ""
+#~ msgid "E839: Completion function changed window"
+#~ msgstr ""
-#: ../edit.c:102
-msgid "E840: Completion function deleted text"
-msgstr ""
+#~ msgid "E840: Completion function deleted text"
+#~ msgstr ""
-#: ../edit.c:1847
msgid "'dictionary' option is empty"
msgstr "'dictionary' opsie is leeg"
-#: ../edit.c:1848
msgid "'thesaurus' option is empty"
msgstr "'thesaurus' opsie is leeg"
-#: ../edit.c:2655
#, c-format
msgid "Scanning dictionary: %s"
msgstr "Deursoek woordeboek: %s"
-#: ../edit.c:3079
msgid " (insert) Scroll (^E/^Y)"
msgstr " (invoeg) Rol (^E/^Y)"
-#: ../edit.c:3081
msgid " (replace) Scroll (^E/^Y)"
msgstr " (vervang) Rol (^E/^Y)"
-#: ../edit.c:3587
#, c-format
msgid "Scanning: %s"
msgstr "Soek vir: %s"
-#: ../edit.c:3614
msgid "Scanning tags."
msgstr "Deursoek etikette."
-#: ../edit.c:4519
msgid " Adding"
msgstr " Word bygevoeg"
@@ -465,605 +359,550 @@ msgstr " Word bygevoeg"
#. * be called before line = ml_get(), or when this address is no
#. * longer needed. -- Acevedo.
#.
-#: ../edit.c:4562
msgid "-- Searching..."
msgstr "-- Soekend..."
-#: ../edit.c:4618
msgid "Back at original"
msgstr "Terug by oorspronklike"
-#: ../edit.c:4621
msgid "Word from other line"
msgstr "Woord van ander re๋l"
-#: ../edit.c:4624
msgid "The only match"
msgstr "Die enigste treffer"
-#: ../edit.c:4680
#, c-format
msgid "match %d of %d"
msgstr "treffer %d van %d"
-#: ../edit.c:4684
#, c-format
msgid "match %d"
msgstr "treffer %d"
-#: ../eval.c:137
#, fuzzy
-msgid "E18: Unexpected characters in :let"
-msgstr "E18: Onverwagte karakters voor '='"
+#~ msgid "E18: Unexpected characters in :let"
+#~ msgstr "E18: Onverwagte karakters voor '='"
-#: ../eval.c:138
-#, fuzzy, c-format
-msgid "E684: list index out of range: %<PRId64>"
-msgstr "E322: re๋lnommer buite perke: %<PRId64> verby die einde"
-
-#: ../eval.c:139
-#, c-format
-msgid "E121: Undefined variable: %s"
-msgstr "E121: Ongedefinieerde veranderlike: %s"
-
-#: ../eval.c:140
msgid "E111: Missing ']'"
msgstr "E111: Ontbrekende ']'"
-#: ../eval.c:141
#, fuzzy, c-format
-msgid "E686: Argument of %s must be a List"
-msgstr "E487: Parameter moet positief wees"
+#~ msgid "E686: Argument of %s must be a List"
+#~ msgstr "E487: Parameter moet positief wees"
-#: ../eval.c:143
#, fuzzy, c-format
-msgid "E712: Argument of %s must be a List or Dictionary"
-msgstr "E487: Parameter moet positief wees"
+#~ msgid "E712: Argument of %s must be a List or Dictionary"
+#~ msgstr "E487: Parameter moet positief wees"
-#: ../eval.c:144
#, fuzzy
-msgid "E713: Cannot use empty key for Dictionary"
-msgstr "E214: Kan nie tydelike l๊er vind vir skryf nie"
+#~ msgid "E714: List required"
+#~ msgstr "E471: Parameter benodig"
-#: ../eval.c:145
#, fuzzy
-msgid "E714: List required"
-msgstr "E471: Parameter benodig"
+#~ msgid "E715: Dictionary required"
+#~ msgstr "E129: Funksienaam vereis"
-#: ../eval.c:146
#, fuzzy
-msgid "E715: Dictionary required"
-msgstr "E129: Funksienaam vereis"
+#~ msgid "E928: String required"
+#~ msgstr "E397: L๊ernaam benodig"
-#: ../eval.c:147
#, c-format
msgid "E118: Too many arguments for function: %s"
msgstr "E118: Te veel parameters vir funksie: %s"
-#: ../eval.c:148
#, c-format
-msgid "E716: Key not present in Dictionary: %s"
-msgstr ""
+#~ msgid "E716: Key not present in Dictionary: %s"
+#~ msgstr ""
-#: ../eval.c:150
#, c-format
msgid "E122: Function %s already exists, add ! to replace it"
msgstr "E122: Funksie %s bestaan alreeds, gebruik ! om te vervang"
-#: ../eval.c:151
#, fuzzy
-msgid "E717: Dictionary entry already exists"
-msgstr "E95: Buffer met hierdie naam bestaan alreeds"
+#~ msgid "E717: Dictionary entry already exists"
+#~ msgstr "E95: Buffer met hierdie naam bestaan alreeds"
-#: ../eval.c:152
#, fuzzy
-msgid "E718: Funcref required"
-msgstr "E129: Funksienaam vereis"
+#~ msgid "E718: Funcref required"
+#~ msgstr "E129: Funksienaam vereis"
-#: ../eval.c:153
#, fuzzy
-msgid "E719: Cannot use [:] with a Dictionary"
-msgstr "E360: Kan nie dop met -f opsie uitvoer nie"
+#~ msgid "E719: Cannot use [:] with a Dictionary"
+#~ msgstr "E360: Kan nie dop met -f opsie uitvoer nie"
-#: ../eval.c:154
-#, c-format
-msgid "E734: Wrong variable type for %s="
-msgstr ""
-
-#: ../eval.c:155
#, fuzzy, c-format
-msgid "E130: Unknown function: %s"
-msgstr "E117: Onbekende funksie: %s"
+#~ msgid "E130: Unknown function: %s"
+#~ msgstr "E117: Onbekende funksie: %s"
-#: ../eval.c:156
#, c-format
msgid "E461: Illegal variable name: %s"
msgstr "E461: Ongeldige veranderlikenaam: %s"
-#: ../eval.c:157
-msgid "E806: using Float as a String"
-msgstr ""
+#, fuzzy, c-format
+#~ msgid "E46: Cannot change read-only variable \"%.*s\""
+#~ msgstr "E46: Kan nie lees-alleen veranderlike stel nie \"%s\""
-#: ../eval.c:1830
-msgid "E687: Less targets than List items"
-msgstr ""
+#. TODO(ZyX-I): move to eval/executor
+#, c-format
+#~ msgid "E734: Wrong variable type for %s="
+#~ msgstr ""
-#: ../eval.c:1834
-msgid "E688: More targets than List items"
-msgstr ""
+#~ msgid "E687: Less targets than List items"
+#~ msgstr ""
-#: ../eval.c:1906
-msgid "Double ; in list of variables"
-msgstr ""
+#~ msgid "E688: More targets than List items"
+#~ msgstr ""
+
+#~ msgid "Double ; in list of variables"
+#~ msgstr ""
-#: ../eval.c:2078
#, fuzzy, c-format
-msgid "E738: Can't list variables for %s"
-msgstr "E138: Kan nie viminfo l๊er %s stoor nie!"
+#~ msgid "E738: Can't list variables for %s"
+#~ msgstr "E138: Kan nie viminfo l๊er %s stoor nie!"
-#: ../eval.c:2391
-msgid "E689: Can only index a List or Dictionary"
-msgstr ""
+#, fuzzy, c-format
+#~ msgid "E121: Undefined variable: %.*s"
+#~ msgstr "E121: Ongedefinieerde veranderlike: %s"
-#: ../eval.c:2396
-msgid "E708: [:] must come last"
-msgstr ""
+#~ msgid "E689: Can only index a List or Dictionary"
+#~ msgstr ""
-#: ../eval.c:2439
-msgid "E709: [:] requires a List value"
-msgstr ""
+#~ msgid "E708: [:] must come last"
+#~ msgstr ""
-#: ../eval.c:2674
-msgid "E710: List value has more items than target"
-msgstr ""
+#, fuzzy
+#~ msgid "E713: Cannot use empty key after ."
+#~ msgstr "E214: Kan nie tydelike l๊er vind vir skryf nie"
-#: ../eval.c:2678
-msgid "E711: List value has not enough items"
-msgstr ""
+#~ msgid "E709: [:] requires a List value"
+#~ msgstr ""
+
+#~ msgid "E710: List value has more items than target"
+#~ msgstr ""
+
+#~ msgid "E711: List value has not enough items"
+#~ msgstr ""
-#: ../eval.c:2867
#, fuzzy
-msgid "E690: Missing \"in\" after :for"
-msgstr "E69: Ontbrekende ] na %s%%["
+#~ msgid "E690: Missing \"in\" after :for"
+#~ msgstr "E69: Ontbrekende ] na %s%%["
-#: ../eval.c:3063
#, c-format
msgid "E107: Missing parentheses: %s"
msgstr "E107: Ontbrekende hakies: %s"
-#: ../eval.c:3263
#, c-format
msgid "E108: No such variable: \"%s\""
msgstr "E108: Geen veranderlike: \"%s\""
-#: ../eval.c:3333
-msgid "E743: variable nested too deep for (un)lock"
-msgstr ""
+#. For historical reasons this error is not given for Lists and
+#. Dictionaries. E.g. b: dictionary may be locked/unlocked.
+#, fuzzy, c-format
+#~ msgid "E940: Cannot lock or unlock variable %s"
+#~ msgstr "E46: Kan nie lees-alleen veranderlike stel nie \"%s\""
-#: ../eval.c:3630
msgid "E109: Missing ':' after '?'"
msgstr "E109: Ontbrekende ':' na '?'"
-#: ../eval.c:3893
-msgid "E691: Can only compare List with List"
-msgstr ""
+#~ msgid "E691: Can only compare List with List"
+#~ msgstr ""
-#: ../eval.c:3895
#, fuzzy
-msgid "E692: Invalid operation for Lists"
-msgstr "E449: Ongeldige uitdrukking ontvang"
+#~ msgid "E692: Invalid operation for List"
+#~ msgstr "E449: Ongeldige uitdrukking ontvang"
-#: ../eval.c:3915
-msgid "E735: Can only compare Dictionary with Dictionary"
-msgstr ""
+#~ msgid "E735: Can only compare Dictionary with Dictionary"
+#~ msgstr ""
-#: ../eval.c:3917
#, fuzzy
-msgid "E736: Invalid operation for Dictionary"
-msgstr "E116: Ongeldige parameters vir funksie %s"
-
-#: ../eval.c:3932
-msgid "E693: Can only compare Funcref with Funcref"
-msgstr ""
+#~ msgid "E736: Invalid operation for Dictionary"
+#~ msgstr "E116: Ongeldige parameters vir funksie %s"
-#: ../eval.c:3934
#, fuzzy
-msgid "E694: Invalid operation for Funcrefs"
-msgstr "E116: Ongeldige parameters vir funksie %s"
+#~ msgid "E694: Invalid operation for Funcrefs"
+#~ msgstr "E116: Ongeldige parameters vir funksie %s"
-#: ../eval.c:4277
#, fuzzy
-msgid "E804: Cannot use '%' with Float"
-msgstr "E360: Kan nie dop met -f opsie uitvoer nie"
+#~ msgid "E804: Cannot use '%' with Float"
+#~ msgstr "E360: Kan nie dop met -f opsie uitvoer nie"
-#: ../eval.c:4478
msgid "E110: Missing ')'"
msgstr "E110: Ontbrekende ')'"
-#: ../eval.c:4609
#, fuzzy
-msgid "E695: Cannot index a Funcref"
-msgstr "E90: Kan nie laaste buffer uitlaai nie"
+#~ msgid "E695: Cannot index a Funcref"
+#~ msgstr "E90: Kan nie laaste buffer uitlaai nie"
+
+#, fuzzy
+#~ msgid "E909: Cannot index a special variable"
+#~ msgstr "E90: Kan nie laaste buffer uitlaai nie"
-#: ../eval.c:4839
#, c-format
msgid "E112: Option name missing: %s"
msgstr "E112: Opsienaam ontbreek: %s"
-#: ../eval.c:4855
#, c-format
msgid "E113: Unknown option: %s"
msgstr "E113: Onbekende opsie: %s"
-#: ../eval.c:4904
#, c-format
msgid "E114: Missing quote: %s"
msgstr "E114: Ontbrekende aanhalingsteken: %s"
-#: ../eval.c:5020
#, c-format
msgid "E115: Missing quote: %s"
msgstr "E115: Ontbrekende aanhalingsteken: %s"
-#: ../eval.c:5084
#, fuzzy, c-format
-msgid "E696: Missing comma in List: %s"
-msgstr "E405: Ontbrekende gelykaanteken: %s"
+#~ msgid "E696: Missing comma in List: %s"
+#~ msgstr "E405: Ontbrekende gelykaanteken: %s"
-#: ../eval.c:5091
#, fuzzy, c-format
-msgid "E697: Missing end of List ']': %s"
-msgstr "E398: Ontbrekende '=': %s"
+#~ msgid "E697: Missing end of List ']': %s"
+#~ msgstr "E398: Ontbrekende '=': %s"
+
+#~ msgid "Not enough memory to set references, garbage collection aborted!"
+#~ msgstr ""
-#: ../eval.c:6475
#, fuzzy, c-format
-msgid "E720: Missing colon in Dictionary: %s"
-msgstr "E242: Ontbrekende kleur: %s"
+#~ msgid "E720: Missing colon in Dictionary: %s"
+#~ msgstr "E242: Ontbrekende kleur: %s"
-#: ../eval.c:6499
#, c-format
-msgid "E721: Duplicate key in Dictionary: \"%s\""
-msgstr ""
+#~ msgid "E721: Duplicate key in Dictionary: \"%s\""
+#~ msgstr ""
-#: ../eval.c:6517
#, fuzzy, c-format
-msgid "E722: Missing comma in Dictionary: %s"
-msgstr "E242: Ontbrekende kleur: %s"
+#~ msgid "E722: Missing comma in Dictionary: %s"
+#~ msgstr "E242: Ontbrekende kleur: %s"
-#: ../eval.c:6524
#, fuzzy, c-format
-msgid "E723: Missing end of Dictionary '}': %s"
-msgstr "E126: Ontbrekende ':endfunction'"
+#~ msgid "E723: Missing end of Dictionary '}': %s"
+#~ msgstr "E126: Ontbrekende ':endfunction'"
-#: ../eval.c:6555
-#, fuzzy
-msgid "E724: variable nested too deep for displaying"
-msgstr "E22: Skripte te diep ge-nes"
+#, c-format
+msgid "E125: Illegal argument: %s"
+msgstr "E125: Ongeldige parameter: %s"
-#: ../eval.c:7188
#, fuzzy, c-format
-msgid "E740: Too many arguments for function %s"
-msgstr "E118: Te veel parameters vir funksie: %s"
+#~ msgid "E853: Duplicate argument name: %s"
+#~ msgstr "E125: Ongeldige parameter: %s"
+
+#, fuzzy, c-format
+#~ msgid "E740: Too many arguments for function %s"
+#~ msgstr "E118: Te veel parameters vir funksie: %s"
-#: ../eval.c:7190
#, c-format
msgid "E116: Invalid arguments for function %s"
msgstr "E116: Ongeldige parameters vir funksie %s"
-#: ../eval.c:7377
#, c-format
msgid "E117: Unknown function: %s"
msgstr "E117: Onbekende funksie: %s"
-#: ../eval.c:7383
+#, fuzzy, c-format
+#~ msgid "E933: Function was deleted: %s"
+#~ msgstr "E129: Funksienaam vereis"
+
#, c-format
msgid "E119: Not enough arguments for function: %s"
msgstr "E119: Te min parameters vir funksie: %s"
-#: ../eval.c:7387
#, c-format
msgid "E120: Using <SID> not in a script context: %s"
msgstr "E120: <SID> word buite skripkonteks gebruik: %s"
-#: ../eval.c:7391
#, c-format
-msgid "E725: Calling dict function without Dictionary: %s"
-msgstr ""
+#~ msgid "E725: Calling dict function without Dictionary: %s"
+#~ msgstr ""
+
+#, c-format
+#~ msgid "Error converting the call result: %s"
+#~ msgstr ""
-#: ../eval.c:7453
#, fuzzy
-msgid "E808: Number or Float required"
-msgstr "E521: Nommer vereis na ="
+#~ msgid "E699: Too many arguments"
+#~ msgstr "Te veel redigeer-parameters"
-#: ../eval.c:7503
#, fuzzy
-msgid "add() argument"
-msgstr "Ongeldige parameter vir"
+#~ msgid "E785: complete() can only be used in Insert mode"
+#~ msgstr "E328: Kieslys bestaan slegs in 'n ander modus"
+
+msgid "&Ok"
+msgstr "&Ok"
-#: ../eval.c:7907
#, fuzzy
-msgid "E699: Too many arguments"
-msgstr "Te veel redigeer-parameters"
+#~ msgid "dictwatcheradd() argument"
+#~ msgstr "Ongeldige parameter vir"
+
+#~ msgid "extend() argument"
+#~ msgstr ""
-#: ../eval.c:8073
#, fuzzy
-msgid "E785: complete() can only be used in Insert mode"
-msgstr "E328: Kieslys bestaan slegs in 'n ander modus"
+#~ msgid "map() argument"
+#~ msgstr " vim [parameters] "
-#: ../eval.c:8156
-msgid "&Ok"
-msgstr "&Ok"
+#~ msgid "filter() argument"
+#~ msgstr ""
-#: ../eval.c:8676
#, fuzzy, c-format
-msgid "E737: Key already exists: %s"
-msgstr "E227: binding bestaan alreeds vir %s"
+#~ msgid "+-%s%3ld line: "
+#~ msgid_plural "+-%s%3ld lines: "
+#~ msgstr[0] "+-%s%3ld re๋ls: "
+#~ msgstr[1] "+-%s%3ld re๋ls: "
-#: ../eval.c:8692
-msgid "extend() argument"
-msgstr ""
+#, fuzzy, c-format
+#~ msgid "E700: Unknown function: %s"
+#~ msgstr "E117: Onbekende funksie: %s"
+
+#~ msgid "E922: expected a dict"
+#~ msgstr ""
-#: ../eval.c:8915
#, fuzzy
-msgid "map() argument"
-msgstr " vim [parameters] "
+#~ msgid "E923: Second argument of function() must be a list or a dict"
+#~ msgstr "E487: Parameter moet positief wees"
-#: ../eval.c:8916
-msgid "filter() argument"
-msgstr ""
+#, fuzzy
+#~ msgid "E5000: Cannot find tab number."
+#~ msgstr "E90: Kan nie laaste buffer uitlaai nie"
-#: ../eval.c:9229
-#, c-format
-msgid "+-%s%3ld lines: "
-msgstr "+-%s%3ld re๋ls: "
+#~ msgid "E5001: Higher scope cannot be -1 if lower scope is >= 0."
+#~ msgstr ""
-#: ../eval.c:9291
-#, fuzzy, c-format
-msgid "E700: Unknown function: %s"
-msgstr "E117: Onbekende funksie: %s"
+#, fuzzy
+#~ msgid "E5002: Cannot find window number."
+#~ msgstr "E671: Kan nie venster titel vind nie \"%s\""
+
+#~ msgid "E5050: {opts} must be the only argument"
+#~ msgstr ""
-#: ../eval.c:10729
msgid "called inputrestore() more often than inputsave()"
msgstr "inputrestore() is meer gereeld as inputsave() geroep"
-#: ../eval.c:10771
#, fuzzy
-msgid "insert() argument"
-msgstr "Te veel redigeer-parameters"
+#~ msgid "insert() argument"
+#~ msgstr "Te veel redigeer-parameters"
-#: ../eval.c:10841
#, fuzzy
-msgid "E786: Range not allowed"
-msgstr "E481: Geen omvang toegelaat nie"
+#~ msgid "E786: Range not allowed"
+#~ msgstr "E481: Geen omvang toegelaat nie"
+
+#~ msgid "Invalid stream on rpc job, use jobclose(id, 'rpc')"
+#~ msgstr ""
+
+#~ msgid "Invalid job stream: Not an rpc job"
+#~ msgstr ""
+
+#, c-format
+#~ msgid "Invalid job stream \"%s\""
+#~ msgstr ""
+
+#~ msgid "Can't send data to the job: stdin is closed"
+#~ msgstr ""
+
+#~ msgid "Can't send raw data to rpc channel"
+#~ msgstr ""
+
+#~ msgid "E474: Failed to convert list to string"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "E474: Failed to parse %.*s"
+#~ msgstr "E241: Kan nie na %s stuur nie"
-#: ../eval.c:11140
#, fuzzy
-msgid "E701: Invalid type for len()"
-msgstr "E596: Ongeldige font(e)"
+#~ msgid "E701: Invalid type for len()"
+#~ msgstr "E596: Ongeldige font(e)"
-#: ../eval.c:11980
-msgid "E726: Stride is zero"
-msgstr ""
+#, c-format
+#~ msgid "E798: ID is reserved for \":match\": %<PRId64>"
+#~ msgstr ""
-#: ../eval.c:11982
-msgid "E727: Start past end"
-msgstr ""
+#, c-format
+#~ msgid "E798: ID is reserved for \"match\": %<PRId64>"
+#~ msgstr ""
-#: ../eval.c:12024 ../eval.c:15297
-msgid "<empty>"
-msgstr ""
+#, fuzzy, c-format
+#~ msgid "msgpackdump() argument, index %i"
+#~ msgstr " vim [parameters] "
-#: ../eval.c:12282
-msgid "remove() argument"
-msgstr ""
+#~ msgid "E5070: Character number must not be less than zero"
+#~ msgstr ""
+
+#, c-format
+#~ msgid "E5071: Character number must not be greater than INT_MAX (%i)"
+#~ msgstr ""
+
+#~ msgid "E726: Stride is zero"
+#~ msgstr ""
+
+#~ msgid "E727: Start past end"
+#~ msgstr ""
+
+#~ msgid "<empty>"
+#~ msgstr ""
+
+#~ msgid "remove() argument"
+#~ msgstr ""
-#: ../eval.c:12466
msgid "E655: Too many symbolic links (cycle?)"
msgstr "E655: Te veel simboliese skakels (siklus?)"
-#: ../eval.c:12593
-msgid "reverse() argument"
-msgstr ""
+#~ msgid "reverse() argument"
+#~ msgstr ""
-#: ../eval.c:13721
-msgid "sort() argument"
-msgstr ""
+#, fuzzy, c-format
+#~ msgid "E927: Invalid action: '%s'"
+#~ msgstr "E383: Ongeldige soekstring: %s"
+
+#, fuzzy, c-format
+#~ msgid "connection failed: %s"
+#~ msgstr "XSMP 'SmcOpenConnection' het gefaal: %s"
+
+#~ msgid "sort() argument"
+#~ msgstr ""
-#: ../eval.c:13721
#, fuzzy
-msgid "uniq() argument"
-msgstr "Ongeldige parameter vir"
+#~ msgid "uniq() argument"
+#~ msgstr "Ongeldige parameter vir"
-#: ../eval.c:13776
#, fuzzy
-msgid "E702: Sort compare function failed"
-msgstr "E237: Drukker-seleksie het gefaal"
+#~ msgid "E702: Sort compare function failed"
+#~ msgstr "E237: Drukker-seleksie het gefaal"
-#: ../eval.c:13806
-msgid "E882: Uniq compare function failed"
-msgstr ""
+#~ msgid "E882: Uniq compare function failed"
+#~ msgstr ""
-#: ../eval.c:14085
msgid "(Invalid)"
msgstr "(Ongeldig)"
-#: ../eval.c:14590
-#, fuzzy
-msgid "E677: Error writing temp file"
-msgstr "E208: Kan nie skryf na \"%s\""
-
-#: ../eval.c:16159
-msgid "E805: Using a Float as a Number"
-msgstr ""
+#, fuzzy, c-format
+#~ msgid "E935: invalid submatch number: %d"
+#~ msgstr "E354: Ongeldige registernaam: '%s'"
-#: ../eval.c:16162
-msgid "E703: Using a Funcref as a Number"
-msgstr ""
+#~ msgid "Can only call this function in an unmodified buffer"
+#~ msgstr ""
-#: ../eval.c:16170
-msgid "E745: Using a List as a Number"
-msgstr ""
+#, fuzzy
+#~ msgid "E921: Invalid callback argument"
+#~ msgstr "E474: Ongeldige parameter"
-#: ../eval.c:16173
-msgid "E728: Using a Dictionary as a Number"
-msgstr ""
+#, fuzzy, c-format
+#~ msgid "E80: Error while writing: %s"
+#~ msgstr "E80: Fout tydens skryfoperasie"
-#: ../eval.c:16259
-msgid "E729: using Funcref as a String"
-msgstr ""
+#. Using %s, p and not %c, *p to preserve multibyte characters
+#, fuzzy, c-format
+#~ msgid "E5060: Unknown flag: %s"
+#~ msgstr "E235: Onbekende font: %s"
-#: ../eval.c:16262
#, fuzzy
-msgid "E730: using List as a String"
-msgstr "E374: Ontbrekende ] in formaatstring"
+#~ msgid "E482: Can't open file with an empty name"
+#~ msgstr "E212: Kan l๊er nie oopmaak vir skryf nie"
-#: ../eval.c:16265
-msgid "E731: using Dictionary as a String"
-msgstr ""
+#, fuzzy, c-format
+#~ msgid "E482: Can't open file %s for writing: %s"
+#~ msgstr "E212: Kan l๊er nie oopmaak vir skryf nie"
-#: ../eval.c:16619
#, fuzzy, c-format
-msgid "E706: Variable type mismatch for: %s"
-msgstr "E93: Meer as een treffer vir %s"
+#~ msgid "E80: Error when closing file %s: %s"
+#~ msgstr "E209: Kan \"%s\" nie sluit nie"
-#: ../eval.c:16705
#, fuzzy, c-format
-msgid "E795: Cannot delete variable %s"
-msgstr "E46: Kan nie lees-alleen veranderlike stel nie \"%s\""
+#~ msgid "E794: Cannot set variable in the sandbox: \"%.*s\""
+#~ msgstr "E46: Kan nie lees-alleen veranderlike stel nie \"%s\""
-#: ../eval.c:16724
#, fuzzy, c-format
-msgid "E704: Funcref variable name must start with a capital: %s"
-msgstr "E128: Funksienaam moet met 'n hoofletter begin: %s"
+#~ msgid "E795: Cannot delete variable %.*s"
+#~ msgstr "E46: Kan nie lees-alleen veranderlike stel nie \"%s\""
-#: ../eval.c:16732
-#, c-format
-msgid "E705: Variable name conflicts with existing function: %s"
-msgstr ""
+#, fuzzy, c-format
+#~ msgid "E704: Funcref variable name must start with a capital: %s"
+#~ msgstr "E128: Funksienaam moet met 'n hoofletter begin: %s"
-#: ../eval.c:16763
#, c-format
-msgid "E741: Value is locked: %s"
-msgstr ""
-
-#: ../eval.c:16764 ../eval.c:16769 ../message.c:1839
-msgid "Unknown"
-msgstr "Onbekend"
-
-#: ../eval.c:16768
-#, fuzzy, c-format
-msgid "E742: Cannot change value of %s"
-msgstr "E284: Kan nie IC waardes stel nie"
+#~ msgid "E705: Variable name conflicts with existing function: %s"
+#~ msgstr ""
-#: ../eval.c:16838
-msgid "E698: variable nested too deep for making a copy"
-msgstr ""
+#~ msgid "E698: variable nested too deep for making a copy"
+#~ msgstr ""
-#: ../eval.c:17249
#, c-format
msgid "E123: Undefined function: %s"
msgstr "E123: Ongedefinieerde funksie: %s"
-#: ../eval.c:17260
#, c-format
msgid "E124: Missing '(': %s"
msgstr "E124: Ontbrekende '(': %s"
-#: ../eval.c:17293
#, fuzzy
-msgid "E862: Cannot use g: here"
-msgstr "E284: Kan nie IC waardes stel nie"
+#~ msgid "E862: Cannot use g: here"
+#~ msgstr "E284: Kan nie IC waardes stel nie"
-#: ../eval.c:17312
#, c-format
-msgid "E125: Illegal argument: %s"
-msgstr "E125: Ongeldige parameter: %s"
-
-#: ../eval.c:17323
-#, fuzzy, c-format
-msgid "E853: Duplicate argument name: %s"
-msgstr "E125: Ongeldige parameter: %s"
+#~ msgid "E932: Closure function should not be at top level: %s"
+#~ msgstr ""
-#: ../eval.c:17416
msgid "E126: Missing :endfunction"
msgstr "E126: Ontbrekende ':endfunction'"
-#: ../eval.c:17537
#, fuzzy, c-format
-msgid "E707: Function name conflicts with variable: %s"
-msgstr "E128: Funksienaam moet met 'n hoofletter begin: %s"
+#~ msgid "E707: Function name conflicts with variable: %s"
+#~ msgstr "E128: Funksienaam moet met 'n hoofletter begin: %s"
-#: ../eval.c:17549
#, c-format
msgid "E127: Cannot redefine function %s: It is in use"
msgstr "E127: Kan funksie %s nie herdefinieer nie: Dit is in gebruik"
-#: ../eval.c:17604
#, fuzzy, c-format
-msgid "E746: Function name does not match script file name: %s"
-msgstr "E128: Funksienaam moet met 'n hoofletter begin: %s"
+#~ msgid "E746: Function name does not match script file name: %s"
+#~ msgstr "E128: Funksienaam moet met 'n hoofletter begin: %s"
-#: ../eval.c:17716
msgid "E129: Function name required"
msgstr "E129: Funksienaam vereis"
-#: ../eval.c:17824
#, fuzzy, c-format
-msgid "E128: Function name must start with a capital or \"s:\": %s"
-msgstr "E128: Funksienaam moet met 'n hoofletter begin: %s"
+#~ msgid "E128: Function name must start with a capital or \"s:\": %s"
+#~ msgstr "E128: Funksienaam moet met 'n hoofletter begin: %s"
-#: ../eval.c:17833
#, fuzzy, c-format
-msgid "E884: Function name cannot contain a colon: %s"
-msgstr "E128: Funksienaam moet met 'n hoofletter begin: %s"
+#~ msgid "E884: Function name cannot contain a colon: %s"
+#~ msgstr "E128: Funksienaam moet met 'n hoofletter begin: %s"
-#: ../eval.c:18336
#, c-format
msgid "E131: Cannot delete function %s: It is in use"
msgstr "E131: Kan funksie %s nie verwyder nie: Dit is in gebruik"
-#: ../eval.c:18441
+#, fuzzy, c-format
+#~ msgid "Cannot delete function %s: It is being used internally"
+#~ msgstr "E131: Kan funksie %s nie verwyder nie: Dit is in gebruik"
+
msgid "E132: Function call depth is higher than 'maxfuncdepth'"
msgstr "E132: Funksieroepdiepte is groter as 'maxfuncdepth'"
-#: ../eval.c:18568
#, c-format
msgid "calling %s"
msgstr "roep %s"
-#: ../eval.c:18651
#, c-format
msgid "%s aborted"
msgstr "%s gekanselleer"
-#: ../eval.c:18653
#, c-format
msgid "%s returning #%<PRId64>"
msgstr "%s lewer #%<PRId64> op"
-#: ../eval.c:18670
#, fuzzy, c-format
-msgid "%s returning %s"
-msgstr "%s lewer \"%s\" op"
+#~ msgid "%s returning %s"
+#~ msgstr "%s lewer \"%s\" op"
-#: ../eval.c:18691 ../ex_cmds2.c:2695
#, c-format
msgid "continuing in %s"
msgstr "vervolg in %s"
-#: ../eval.c:18795
msgid "E133: :return not inside a function"
msgstr "E133: ':return' buite funksie"
-#: ../eval.c:19159
-msgid ""
-"\n"
-"# global variables:\n"
-msgstr ""
-"\n"
-"# globale veranderlikes:\n"
-
-#: ../eval.c:19254
msgid ""
"\n"
"\tLast set from "
@@ -1071,154 +910,418 @@ msgstr ""
"\n"
"\tLaas gestel vanaf "
-#: ../eval.c:19272
-#, fuzzy
-msgid "No old files"
-msgstr "Geen ingeslote l๊ers nie"
+#~ msgid "E5009: $VIMRUNTIME is empty or unset"
+#~ msgstr ""
-#: ../ex_cmds.c:122
#, c-format
-msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
-msgstr "<%s>%s%s %d, Hex %02x, Oktaal %03o"
+#~ msgid "E5009: Invalid $VIMRUNTIME: %s"
+#~ msgstr ""
-#: ../ex_cmds.c:145
#, c-format
-msgid "> %d, Hex %04x, Octal %o"
-msgstr "> %d, Hex %04x, Oktaal %o"
+#~ msgid "E474: Expected comma before list item: %s"
+#~ msgstr ""
-#: ../ex_cmds.c:146
#, c-format
-msgid "> %d, Hex %08x, Octal %o"
-msgstr "> %d, Hex %08x, Oktaal %o"
+#~ msgid "E474: Expected colon before dictionary value: %s"
+#~ msgstr ""
-#: ../ex_cmds.c:684
-msgid "E134: Move lines into themselves"
-msgstr "E134: Skuif re๋ls in hulself in"
+#, fuzzy, c-format
+#~ msgid "E474: Expected string key: %s"
+#~ msgstr "E415: onverwagte gelykaanteken: %s"
-#: ../ex_cmds.c:747
-msgid "1 line moved"
-msgstr "1 re๋l geskuif"
+#, fuzzy, c-format
+#~ msgid "E474: Expected comma before dictionary key: %s"
+#~ msgstr "E242: Ontbrekende kleur: %s"
+
+#, fuzzy, c-format
+#~ msgid "E474: Unfinished escape sequence: %.*s"
+#~ msgstr "E540: Onvoltooide uitdrukkingreeks"
-#: ../ex_cmds.c:749
#, c-format
-msgid "%<PRId64> lines moved"
-msgstr "%<PRId64> re๋ls geskuif"
+#~ msgid "E474: Unfinished unicode escape sequence: %.*s"
+#~ msgstr ""
-#: ../ex_cmds.c:1175
#, c-format
-msgid "%<PRId64> lines filtered"
-msgstr "%<PRId64> re๋ls filtreer"
+#~ msgid "E474: Expected four hex digits after \\u: %.*s"
+#~ msgstr ""
-#: ../ex_cmds.c:1194
-msgid "E135: *Filter* Autocommands must not change current buffer"
-msgstr "E135: *Filter* Outobevele mag nie die huidige buffer verander nie"
+#, fuzzy, c-format
+#~ msgid "E474: Unknown escape sequence: %.*s"
+#~ msgstr "E409: Onbekende groepnaam: %s"
-#: ../ex_cmds.c:1244
-msgid "[No write since last change]\n"
-msgstr "[Ongestoor sedert vorige verandering]\n"
+#, c-format
+#~ msgid "E474: ASCII control characters cannot be present inside string: %.*s"
+#~ msgstr ""
-#: ../ex_cmds.c:1424
#, c-format
-msgid "%sviminfo: %s in line: "
-msgstr "%sviminfo: %s in re๋l: "
+#~ msgid "E474: Only UTF-8 strings allowed: %.*s"
+#~ msgstr ""
-#: ../ex_cmds.c:1431
-msgid "E136: viminfo: Too many errors, skipping rest of file"
-msgstr "E136: viminfo: Te veel foute, slaan die res van die l๊er oor"
+#, c-format
+#~ msgid ""
+#~ "E474: Only UTF-8 code points up to U+10FFFF are allowed to appear unescaped: "
+#~ "%.*s"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "E474: Expected string end: %.*s"
+#~ msgstr "E415: onverwagte gelykaanteken: %s"
+
+#, fuzzy, c-format
+#~ msgid "E474: Leading zeroes are not allowed: %.*s"
+#~ msgstr "E481: Geen omvang toegelaat nie"
+
+#, fuzzy, c-format
+#~ msgid "E474: Missing number after minus sign: %.*s"
+#~ msgstr "E526: Ontbrekende nommer na <%s>"
+
+#, fuzzy, c-format
+#~ msgid "E474: Missing number after decimal dot: %.*s"
+#~ msgstr "E526: Ontbrekende nommer na <%s>"
+
+#, fuzzy, c-format
+#~ msgid "E474: Missing exponent: %.*s"
+#~ msgstr "E114: Ontbrekende aanhalingsteken: %s"
-#: ../ex_cmds.c:1458
#, c-format
-msgid "Reading viminfo file \"%s\"%s%s%s"
-msgstr "Besig om viminfo l๊er \"%s\"%s%s%s te lees"
+#~ msgid ""
+#~ "E685: internal error: while converting number \"%.*s\" to float string2float "
+#~ "consumed %zu bytes in place of %zu"
+#~ msgstr ""
-#: ../ex_cmds.c:1460
-msgid " info"
-msgstr " inligting"
+#, c-format
+#~ msgid ""
+#~ "E685: internal error: while converting number \"%.*s\" to integer vim_str2nr "
+#~ "consumed %i bytes in place of %zu"
+#~ msgstr ""
-#: ../ex_cmds.c:1461
-msgid " marks"
-msgstr " merkers"
+#~ msgid "E474: Attempt to decode a blank string"
+#~ msgstr ""
+
+#, c-format
+#~ msgid "E474: No container to close: %.*s"
+#~ msgstr ""
+
+#, c-format
+#~ msgid "E474: Closing list with curly bracket: %.*s"
+#~ msgstr ""
+
+#, c-format
+#~ msgid "E474: Closing dictionary with square bracket: %.*s"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "E474: Trailing comma: %.*s"
+#~ msgstr "E488: Oorbodige karakters"
+
+#, c-format
+#~ msgid "E474: Expected value after colon: %.*s"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "E474: Expected value: %.*s"
+#~ msgstr "E415: onverwagte gelykaanteken: %s"
+
+#, fuzzy, c-format
+#~ msgid "E474: Comma not inside container: %.*s"
+#~ msgstr "E242: Kleurnaam is onbekend: %s"
+
+#, fuzzy, c-format
+#~ msgid "E474: Duplicate comma: %.*s"
+#~ msgstr "E125: Ongeldige parameter: %s"
+
+#, fuzzy, c-format
+#~ msgid "E474: Comma after colon: %.*s"
+#~ msgstr "E254: Kan nie kleur %s toeken nie"
+
+#, fuzzy, c-format
+#~ msgid "E474: Using comma in place of colon: %.*s"
+#~ msgstr "E242: Ontbrekende kleur: %s"
+
+#, c-format
+#~ msgid "E474: Leading comma: %.*s"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "E474: Colon not inside container: %.*s"
+#~ msgstr "E242: Kleurnaam is onbekend: %s"
+
+#, fuzzy, c-format
+#~ msgid "E474: Using colon not in dictionary: %.*s"
+#~ msgstr "E242: Ontbrekende kleur: %s"
+
+#, fuzzy, c-format
+#~ msgid "E474: Unexpected colon: %.*s"
+#~ msgstr "E415: onverwagte gelykaanteken: %s"
+
+#, c-format
+#~ msgid "E474: Colon after comma: %.*s"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "E474: Duplicate colon: %.*s"
+#~ msgstr "gelaaide fontnaam: %s"
+
+#, fuzzy, c-format
+#~ msgid "E474: Expected null: %.*s"
+#~ msgstr "E415: onverwagte gelykaanteken: %s"
+
+#, fuzzy, c-format
+#~ msgid "E474: Expected true: %.*s"
+#~ msgstr "E415: onverwagte gelykaanteken: %s"
+
+#, fuzzy, c-format
+#~ msgid "E474: Expected false: %.*s"
+#~ msgstr "E415: onverwagte gelykaanteken: %s"
+
+#, fuzzy, c-format
+#~ msgid "E474: Unidentified byte: %.*s"
+#~ msgstr "E121: Ongedefinieerde veranderlike: %s"
+
+#, fuzzy, c-format
+#~ msgid "E474: Trailing characters: %.*s"
+#~ msgstr "E488: Oorbodige karakters"
+
+#, fuzzy, c-format
+#~ msgid "E474: Unexpected end of input: %.*s"
+#~ msgstr "E415: onverwagte gelykaanteken: %s"
+
+#, c-format
+#~ msgid "key %s"
+#~ msgstr ""
+
+#, c-format
+#~ msgid "key %s at index %i from special map"
+#~ msgstr ""
+
+#, c-format
+#~ msgid "index %i"
+#~ msgstr ""
+
+#~ msgid "partial"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "argument %i"
+#~ msgstr " vim [parameters] "
+
+#~ msgid "partial self dictionary"
+#~ msgstr ""
+
+#~ msgid "itself"
+#~ msgstr ""
+
+#. Only give this message once for a recursive call to avoid
+#. flooding the user with errors.
+#~ msgid "E724: unable to correctly dump variable with self-referencing container"
+#~ msgstr ""
+
+#~ msgid "E474: Unable to represent NaN value in JSON"
+#~ msgstr ""
+
+#~ msgid "E474: Unable to represent infinity in JSON"
+#~ msgstr ""
+
+#, c-format
+#~ msgid ""
+#~ "E474: String \"%.*s\" contains byte that does not start any UTF-8 character"
+#~ msgstr ""
+
+#, c-format
+#~ msgid ""
+#~ "E474: UTF-8 string contains code point which belongs to a surrogate pair: "
+#~ "%.*s"
+#~ msgstr ""
-#: ../ex_cmds.c:1462
#, fuzzy
-msgid " oldfiles"
-msgstr "Geen ingeslote l๊ers nie"
+#~ msgid "E474: Unable to convert EXT string to JSON"
+#~ msgstr "E620: Kon nie van wye-greep na \"%s\" enkodering verander nie"
-#: ../ex_cmds.c:1463
-msgid " FAILED"
-msgstr " GEFAAL"
+#, c-format
+#~ msgid "E474: Error while dumping %s, %s: attempt to dump function reference"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "E474: Invalid key in special dictionary"
+#~ msgstr "E116: Ongeldige parameters vir funksie %s"
+
+#, fuzzy
+#~ msgid "encode_tv2string() argument"
+#~ msgstr "Te veel redigeer-parameters"
+
+#, fuzzy
+#~ msgid ":echo argument"
+#~ msgstr " vim [parameters] "
+
+#, fuzzy
+#~ msgid "encode_tv2json() argument"
+#~ msgstr "Te veel redigeer-parameters"
-#. avoid a wait_return for this message, it's annoying
-#: ../ex_cmds.c:1541
#, c-format
-msgid "E137: Viminfo file is not writable: %s"
-msgstr "E137: Viminfo l๊er is nie skryfbaar nie: %s"
+#~ msgid "E5004: Error while dumping %s, %s: attempt to dump function reference"
+#~ msgstr ""
-#: ../ex_cmds.c:1626
#, c-format
-msgid "E138: Can't write viminfo file %s!"
-msgstr "E138: Kan nie viminfo l๊er %s stoor nie!"
+#~ msgid "E5005: Unable to dump %s: container references itself in %s"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "E684: list index out of range: %<PRId64>"
+#~ msgstr "E322: re๋lnommer buite perke: %<PRId64> verby die einde"
+
+#~ msgid "E6000: Argument is not a function or function name"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "E737: Key already exists: %s"
+#~ msgstr "E227: binding bestaan alreeds vir %s"
+
+#~ msgid "E743: variable nested too deep for (un)lock"
+#~ msgstr ""
-#: ../ex_cmds.c:1635
#, c-format
-msgid "Writing viminfo file \"%s\""
-msgstr "Besig om viminfo l๊er \"%s\" te stoor"
+#~ msgid "E741: Value is locked: %.*s"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "E742: Cannot change value of %.*s"
+#~ msgstr "E284: Kan nie IC waardes stel nie"
+
+msgid "Unknown"
+msgstr "Onbekend"
+
+#~ msgid "E805: Expected a Number or a String, Float found"
+#~ msgstr ""
+
+#~ msgid "E703: Expected a Number or a String, Funcref found"
+#~ msgstr ""
+
+#~ msgid "E745: Expected a Number or a String, List found"
+#~ msgstr ""
+
+#~ msgid "E728: Expected a Number or a String, Dictionary found"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "E5300: Expected a Number or a String"
+#~ msgstr "E373: Onverwagte %%%c in formaatstring"
+
+#~ msgid "E745: Using a List as a Number"
+#~ msgstr ""
+
+#~ msgid "E728: Using a Dictionary as a Number"
+#~ msgstr ""
+
+#~ msgid "E805: Using a Float as a Number"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "E685: using an invalid value as a Number"
+#~ msgstr "E19: Merker het ongeldige re๋lnommer"
+
+#, fuzzy
+#~ msgid "E730: using List as a String"
+#~ msgstr "E374: Ontbrekende ] in formaatstring"
+
+#~ msgid "E731: using Dictionary as a String"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "E908: using an invalid value as a String"
+#~ msgstr "E374: Ontbrekende ] in formaatstring"
+
+#~ msgid "E891: Using a Funcref as a Float"
+#~ msgstr ""
+
+#~ msgid "E892: Using a String as a Float"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "E893: Using a List as a Float"
+#~ msgstr "E374: Ontbrekende ] in formaatstring"
+
+#, fuzzy
+#~ msgid "E894: Using a Dictionary as a Float"
+#~ msgstr "E242: Ontbrekende kleur: %s"
+
+#~ msgid "E907: Using a special value as a Float"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "E808: Number or Float required"
+#~ msgstr "E521: Nommer vereis na ="
+
+#~ msgid "tcp address must be host:port"
+#~ msgstr ""
+
+#~ msgid "failed to lookup host or port"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "connection refused"
+#~ msgstr "'cscope' verbinding gesluit"
-#. Write the info:
-#: ../ex_cmds.c:1720
#, c-format
-msgid "# This viminfo file was generated by Vim %s.\n"
-msgstr "# Hierdie viminfo l๊er is gegenereer deur Vim %s.\n"
+msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
+msgstr "<%s>%s%s %d, Hex %02x, Oktaal %03o"
-#: ../ex_cmds.c:1722
-msgid ""
-"# You may edit it if you're careful!\n"
-"\n"
-msgstr ""
-"# Jy mag dit wysig as jy versigtig is!\n"
-"\n"
+#, c-format
+msgid "> %d, Hex %04x, Octal %o"
+msgstr "> %d, Hex %04x, Oktaal %o"
+
+#, c-format
+msgid "> %d, Hex %08x, Octal %o"
+msgstr "> %d, Hex %08x, Oktaal %o"
-#: ../ex_cmds.c:1723
-msgid "# Value of 'encoding' when this file was written\n"
-msgstr "# Waarde van 'encoding' toe hierdie l๊er gestoor is\n"
+msgid "E134: Move lines into themselves"
+msgstr "E134: Skuif re๋ls in hulself in"
-#: ../ex_cmds.c:1800
-msgid "Illegal starting char"
-msgstr "Ongeldige beginkarakter"
+msgid "1 line moved"
+msgstr "1 re๋l geskuif"
+
+#, c-format
+msgid "%<PRId64> lines moved"
+msgstr "%<PRId64> re๋ls geskuif"
+
+#, c-format
+msgid "E482: Can't create file %s"
+msgstr "E482: Kan nie l๊er %s skep nie"
+
+#, c-format
+msgid "%<PRId64> lines filtered"
+msgstr "%<PRId64> re๋ls filtreer"
+
+msgid "E135: *Filter* Autocommands must not change current buffer"
+msgstr "E135: *Filter* Outobevele mag nie die huidige buffer verander nie"
+
+msgid "[No write since last change]\n"
+msgstr "[Ongestoor sedert vorige verandering]\n"
-#: ../ex_cmds.c:2162
msgid "Write partial file?"
msgstr "Skryf gedeeltelike l๊er?"
-#: ../ex_cmds.c:2166
msgid "E140: Use ! to write partial buffer"
msgstr "E140: Gebruik ! om gedeeltelike buffer te skryf"
-#: ../ex_cmds.c:2281
#, fuzzy, c-format
-msgid "Overwrite existing file \"%s\"?"
-msgstr "Oorskryf bestaande l๊er \"%.*s\"?"
+#~ msgid "Overwrite existing file \"%s\"?"
+#~ msgstr "Oorskryf bestaande l๊er \"%.*s\"?"
-#: ../ex_cmds.c:2317
#, c-format
-msgid "Swap file \"%s\" exists, overwrite anyway?"
-msgstr ""
+#~ msgid "Swap file \"%s\" exists, overwrite anyway?"
+#~ msgstr ""
-#: ../ex_cmds.c:2326
#, fuzzy, c-format
-msgid "E768: Swap file exists: %s (:silent! overrides)"
-msgstr "E13: L๊er bestaan (gebruik ! om te dwing)"
+#~ msgid "E768: Swap file exists: %s (:silent! overrides)"
+#~ msgstr "E13: L๊er bestaan (gebruik ! om te dwing)"
-#: ../ex_cmds.c:2381
#, c-format
msgid "E141: No file name for buffer %<PRId64>"
msgstr "E141: Geen l๊ernaam vir buffer %<PRId64> nie"
-#: ../ex_cmds.c:2412
msgid "E142: File not written: Writing is disabled by 'write' option"
msgstr "E142: L๊er nie gestoor nie: Stoor is afgeskakel deur die 'write' opsie"
-#: ../ex_cmds.c:2434
#, fuzzy, c-format
msgid ""
"'readonly' option is set for \"%s\".\n"
@@ -1227,823 +1330,667 @@ msgstr ""
"'readonly' opsie is aan vir \"%.*s\".\n"
"Wil jy dit forseer?"
-#: ../ex_cmds.c:2439
#, c-format
-msgid ""
-"File permissions of \"%s\" are read-only.\n"
-"It may still be possible to write it.\n"
-"Do you wish to try?"
-msgstr ""
+#~ msgid ""
+#~ "File permissions of \"%s\" are read-only.\n"
+#~ "It may still be possible to write it.\n"
+#~ "Do you wish to try?"
+#~ msgstr ""
-#: ../ex_cmds.c:2451
#, fuzzy, c-format
-msgid "E505: \"%s\" is read-only (add ! to override)"
-msgstr "is lees-alleen (gebruik ! om te dwing)"
+#~ msgid "E505: \"%s\" is read-only (add ! to override)"
+#~ msgstr "is lees-alleen (gebruik ! om te dwing)"
-#: ../ex_cmds.c:3120
#, c-format
msgid "E143: Autocommands unexpectedly deleted new buffer %s"
msgstr "E143: Outobevele het nuwe buffer %s onverwags geskrap"
-#: ../ex_cmds.c:3313
msgid "E144: non-numeric argument to :z"
msgstr "E144: nie-numeriese parameter vir :z"
-#: ../ex_cmds.c:3404
-msgid "E145: Shell commands not allowed in rvim"
-msgstr "E145: Dop bevele nie toegelaat in rvim"
+#, fuzzy
+#~ msgid "E145: Shell commands not allowed in restricted mode"
+#~ msgstr "E145: Dop bevele nie toegelaat in rvim"
-#: ../ex_cmds.c:3498
msgid "E146: Regular expressions can't be delimited by letters"
msgstr "E146: Patrone kan nie deur letters afgebaken word nie"
-#: ../ex_cmds.c:3964
#, c-format
msgid "replace with %s (y/n/a/q/l/^E/^Y)?"
msgstr "vervang met %s (y/n/a/q/l/^E/^Y)?"
-#: ../ex_cmds.c:4379
msgid "(Interrupted) "
msgstr "(Onderbreek) "
-#: ../ex_cmds.c:4384
#, fuzzy
-msgid "1 match"
-msgstr "; treffer "
+#~ msgid "1 match"
+#~ msgstr "; treffer "
-#: ../ex_cmds.c:4384
msgid "1 substitution"
msgstr "1 vervanging"
-#: ../ex_cmds.c:4387
#, fuzzy, c-format
-msgid "%<PRId64> matches"
-msgstr "%<PRId64> veranderinge"
+#~ msgid "%<PRId64> matches"
+#~ msgstr "%<PRId64> veranderinge"
-#: ../ex_cmds.c:4388
#, c-format
msgid "%<PRId64> substitutions"
msgstr "%<PRId64> vervangings"
-#: ../ex_cmds.c:4392
msgid " on 1 line"
msgstr " op 1 re๋l"
-#: ../ex_cmds.c:4395
#, c-format
msgid " on %<PRId64> lines"
msgstr " op %<PRId64> re๋ls"
-#: ../ex_cmds.c:4438
msgid "E147: Cannot do :global recursive"
msgstr "E147: Kan nie :global rekursief doen nie "
-#: ../ex_cmds.c:4467
msgid "E148: Regular expression missing from global"
msgstr "E148: Patroon ontbreek uit globaal"
-#: ../ex_cmds.c:4508
#, c-format
msgid "Pattern found in every line: %s"
msgstr "Patroon gevind in elke re๋l: %s"
-#: ../ex_cmds.c:4510
#, fuzzy, c-format
-msgid "Pattern not found: %s"
-msgstr "Patroon nie gevind nie"
+#~ msgid "Pattern not found: %s"
+#~ msgstr "Patroon nie gevind nie"
-#: ../ex_cmds.c:4587
-msgid ""
-"\n"
-"# Last Substitute String:\n"
-"$"
-msgstr ""
-"\n"
-"# Vorige Vervangstring:\n"
-"$"
-
-#: ../ex_cmds.c:4679
msgid "E478: Don't panic!"
msgstr "E478: Bly kalm!"
-#: ../ex_cmds.c:4717
#, c-format
msgid "E661: Sorry, no '%s' help for %s"
msgstr "E661: Jammer, geen '%s' hulp vir %s nie"
-#: ../ex_cmds.c:4719
#, c-format
msgid "E149: Sorry, no help for %s"
msgstr "E149: Jammer, geen hulp vir %s nie"
-#: ../ex_cmds.c:4751
#, c-format
msgid "Sorry, help file \"%s\" not found"
msgstr "Jammer, hulpl๊er \"%s\" kan nie gevind word nie"
-#: ../ex_cmds.c:5323
-#, c-format
-msgid "E150: Not a directory: %s"
-msgstr "E150: Nie 'n gids nie: %s"
+#, fuzzy, c-format
+#~ msgid "E151: No match: %s"
+#~ msgstr "E480: Geen treffer: %s"
-#: ../ex_cmds.c:5446
#, c-format
msgid "E152: Cannot open %s for writing"
msgstr "E152: Kan nie %s oopmaak om te skryf nie"
-#: ../ex_cmds.c:5471
#, c-format
msgid "E153: Unable to open %s for reading"
msgstr "E153: Kan nie %s oop maak om te lees nie"
-#: ../ex_cmds.c:5500
#, c-format
msgid "E670: Mix of help file encodings within a language: %s"
msgstr "E670: 'n Mengsel van hulpl๊er enkoderings in 'n taal: %s"
-#: ../ex_cmds.c:5565
#, c-format
msgid "E154: Duplicate tag \"%s\" in file %s/%s"
msgstr "E154: Duplikaat etiket \"%s\" in l๊er %s/%s"
-#: ../ex_cmds.c:5687
+#, c-format
+msgid "E150: Not a directory: %s"
+msgstr "E150: Nie 'n gids nie: %s"
+
#, c-format
msgid "E160: Unknown sign command: %s"
msgstr "E160: Onbekende funksie: %s"
-#: ../ex_cmds.c:5704
msgid "E156: Missing sign name"
msgstr "E156: Ontbrekende tekennaam"
-#: ../ex_cmds.c:5746
msgid "E612: Too many signs defined"
msgstr "E612: Te veel tekens gedefinieer"
-#: ../ex_cmds.c:5813
#, c-format
msgid "E239: Invalid sign text: %s"
msgstr "E239: Ongeldige tekenteks: %s"
-#: ../ex_cmds.c:5844 ../ex_cmds.c:6035
#, c-format
msgid "E155: Unknown sign: %s"
msgstr "E155: Onbekende opsie: %s"
-#: ../ex_cmds.c:5877
msgid "E159: Missing sign number"
msgstr "E159: Ontbrekende tekennommer"
-#: ../ex_cmds.c:5971
#, c-format
msgid "E158: Invalid buffer name: %s"
msgstr "E158: Ongeldige buffernaam: %s"
-#: ../ex_cmds.c:6008
+#~ msgid "E934: Cannot jump to a buffer that does not have a name"
+#~ msgstr ""
+
#, c-format
msgid "E157: Invalid sign ID: %<PRId64>"
msgstr "E157: Ongeldige teken ID: %<PRId64>"
-#: ../ex_cmds.c:6066
+#, c-format
+#~ msgid "E885: Not possible to change sign %s"
+#~ msgstr ""
+
msgid " (not supported)"
msgstr " (word nie ondersteun nie)"
-#: ../ex_cmds.c:6169
msgid "[Deleted]"
msgstr "[Geskrap]"
-#: ../ex_cmds2.c:139
+#, fuzzy
+#~ msgid "No old files"
+#~ msgstr "Geen ingeslote l๊ers nie"
+
msgid "Entering Debug mode. Type \"cont\" to continue."
msgstr "Ontfoutmodus begin nou. Tik \"cont\" om te verlaat."
-#: ../ex_cmds2.c:143 ../ex_docmd.c:759
#, c-format
msgid "line %<PRId64>: %s"
msgstr "re๋l %<PRId64>: %s"
-#: ../ex_cmds2.c:145
#, c-format
msgid "cmd: %s"
msgstr "cmd: %s"
-#: ../ex_cmds2.c:322
+#~ msgid "frame is zero"
+#~ msgstr ""
+
+#, c-format
+#~ msgid "frame at highest level: %d"
+#~ msgstr ""
+
#, c-format
msgid "Breakpoint in \"%s%s\" line %<PRId64>"
msgstr "Inspeksiepunt in \"%s%s\" re๋l %<PRId64>"
-#: ../ex_cmds2.c:581
#, c-format
msgid "E161: Breakpoint not found: %s"
msgstr "E161: Inspeksiepunt kon nie gevind word nie: %s"
-#: ../ex_cmds2.c:611
msgid "No breakpoints defined"
msgstr "Geen inspeksiepunte gedefinieer nie"
-#: ../ex_cmds2.c:617
#, c-format
msgid "%3d %s %s line %<PRId64>"
msgstr "%3d %s %s re๋l %<PRId64>"
-#: ../ex_cmds2.c:942
-msgid "E750: First use \":profile start {fname}\""
-msgstr ""
+#~ msgid "E750: First use \":profile start {fname}\""
+#~ msgstr ""
-#: ../ex_cmds2.c:1269
#, fuzzy, c-format
-msgid "Save changes to \"%s\"?"
-msgstr "Stoor veranderinge na \"%.*s\"?"
+#~ msgid "Save changes to \"%s\"?"
+#~ msgstr "Stoor veranderinge na \"%.*s\"?"
-#: ../ex_cmds2.c:1271 ../ex_docmd.c:8851
msgid "Untitled"
msgstr "Ongetiteld"
-#: ../ex_cmds2.c:1421
#, c-format
msgid "E162: No write since last change for buffer \"%s\""
msgstr "E162: Buffer \"%s\" is nie geskryf sedert vorige wysiging nie"
-#: ../ex_cmds2.c:1480
msgid "Warning: Entered other buffer unexpectedly (check autocommands)"
msgstr "Waarskuwing: Ander buffer onverwags betree (kyk na outobevele)"
-#: ../ex_cmds2.c:1826
msgid "E163: There is only one file to edit"
msgstr "E163: Daar is net een l๊er om te bewerk"
-#: ../ex_cmds2.c:1828
msgid "E164: Cannot go before first file"
msgstr "E164: Kan nie v๓๓r die eerste l๊er gaan nie"
-#: ../ex_cmds2.c:1830
msgid "E165: Cannot go beyond last file"
msgstr "E165: Kan nie verby die laaste l๊er gaan nie"
-#: ../ex_cmds2.c:2175
#, c-format
msgid "E666: compiler not supported: %s"
msgstr "E666: vertaler word nie ondersteun nie: %s"
-#: ../ex_cmds2.c:2257
#, c-format
msgid "Searching for \"%s\" in \"%s\""
msgstr "Besig om te soek vir \"%s\" in \"%s\""
-#: ../ex_cmds2.c:2284
#, c-format
msgid "Searching for \"%s\""
msgstr "Besig om te soek vir \"%s\""
-#: ../ex_cmds2.c:2307
-#, c-format
-msgid "not found in 'runtimepath': \"%s\""
-msgstr "kon nie in 'runtimepath' gevind word nie: \"%s\""
+#, fuzzy, c-format
+#~ msgid "not found in '%s': \"%s\""
+#~ msgstr "kon nie in 'runtimepath' gevind word nie: \"%s\""
-#: ../ex_cmds2.c:2472
#, c-format
msgid "Cannot source a directory: \"%s\""
msgstr "Kan nie gids uitvoer nie: \"%s\""
-#: ../ex_cmds2.c:2518
#, c-format
msgid "could not source \"%s\""
msgstr "kon nie \"%s\" uitvoer nie"
-#: ../ex_cmds2.c:2520
#, c-format
msgid "line %<PRId64>: could not source \"%s\""
msgstr "re๋l %<PRId64>: kon nie \"%s\" uitvoer nie"
-#: ../ex_cmds2.c:2535
#, c-format
msgid "sourcing \"%s\""
msgstr "besig om \"%s\" uit te voer"
-#: ../ex_cmds2.c:2537
#, c-format
msgid "line %<PRId64>: sourcing \"%s\""
msgstr "re๋l %<PRId64>: voer nou \"%s\" uit"
-#: ../ex_cmds2.c:2693
#, c-format
msgid "finished sourcing %s"
msgstr "%s klaar uitgevoer"
-#: ../ex_cmds2.c:2765
#, fuzzy
-msgid "modeline"
-msgstr "1 re๋l meer"
+#~ msgid "modeline"
+#~ msgstr "1 re๋l meer"
-#: ../ex_cmds2.c:2767
#, fuzzy
-msgid "--cmd argument"
-msgstr " vim [parameters] "
+#~ msgid "--cmd argument"
+#~ msgstr " vim [parameters] "
-#: ../ex_cmds2.c:2769
#, fuzzy
-msgid "-c argument"
-msgstr " vim [parameters] "
+#~ msgid "-c argument"
+#~ msgstr " vim [parameters] "
-#: ../ex_cmds2.c:2771
#, fuzzy
-msgid "environment variable"
-msgstr "Stel die 'LANG' omgewingsveranderlike na jou lokaal toe"
+#~ msgid "environment variable"
+#~ msgstr "Stel die 'LANG' omgewingsveranderlike na jou lokaal toe"
-#: ../ex_cmds2.c:2773
#, fuzzy
-msgid "error handler"
-msgstr "Fout en onderbreking"
+#~ msgid "error handler"
+#~ msgstr "Fout en onderbreking"
-#: ../ex_cmds2.c:3020
msgid "W15: Warning: Wrong line separator, ^M may be missing"
msgstr "W15: Waarskuwing: Verkeerde re๋lskeiding, ^M ontbreek dalk"
-#: ../ex_cmds2.c:3139
msgid "E167: :scriptencoding used outside of a sourced file"
msgstr "E167: ':scriptencoding' buite 'n uitvoerl๊er gebruik"
-#: ../ex_cmds2.c:3166
msgid "E168: :finish used outside of a sourced file"
msgstr "E168: ':finish' buite 'n uitvoerl๊er gebruik"
-#: ../ex_cmds2.c:3389
#, c-format
msgid "Current %slanguage: \"%s\""
msgstr "Huidige %staal: \"%s\""
-#: ../ex_cmds2.c:3404
#, c-format
msgid "E197: Cannot set language to \"%s\""
msgstr "E197: Kan nie taal na \"%s\" verander nie"
#. don't redisplay the window
#. don't wait for return
-#: ../ex_docmd.c:387
msgid "Entering Ex mode. Type \"visual\" to go to Normal mode."
msgstr "Betree Ex modus. Tik \"visual\" om na Normale modus terug te keer."
-#: ../ex_docmd.c:428
msgid "E501: At end-of-file"
msgstr "E501: By l๊ereinde"
-#: ../ex_docmd.c:513
msgid "E169: Command too recursive"
msgstr "E169: Bevel te rekursief"
-#: ../ex_docmd.c:1006
+#, fuzzy
+#~ msgid "line %"
+#~ msgstr "re๋l %4ld:"
+
#, c-format
msgid "E605: Exception not caught: %s"
msgstr "E605: Uitsondering nie gevang nie: %s"
-#: ../ex_docmd.c:1085
msgid "End of sourced file"
msgstr "Einde van uitvoerl๊er"
-#: ../ex_docmd.c:1086
msgid "End of function"
msgstr "Einde van funksie "
-#: ../ex_docmd.c:1628
msgid "E464: Ambiguous use of user-defined command"
msgstr "E464: Dubbelsinnige gebruik van gebruiker-gedefinieerde bevel"
-#: ../ex_docmd.c:1638
msgid "E492: Not an editor command"
msgstr "E492: Nie 'n verwerkerbevel nie"
-#: ../ex_docmd.c:1729
msgid "E493: Backwards range given"
msgstr "E493: Terugwaardse omvang gegee"
-#: ../ex_docmd.c:1733
msgid "Backwards range given, OK to swap"
msgstr "Terugwaardse omvang gegee, OK om te ruil"
#. append
#. typed wrong
-#: ../ex_docmd.c:1787
msgid "E494: Use w or w>>"
msgstr "E494: Gebruik w of w>>"
-#: ../ex_docmd.c:3454
msgid "E319: The command is not available in this version"
msgstr "E319: Jammer, die bevel is nie ge๏mplementeer nie"
-#: ../ex_docmd.c:3752
-msgid "E172: Only one file name allowed"
-msgstr "E172: Slegs een l๊ernaam toegelaat"
-
-#: ../ex_docmd.c:4238
msgid "1 more file to edit. Quit anyway?"
msgstr "Nog 1 l๊er om te bewerk. Stop in elk geval?"
-#: ../ex_docmd.c:4242
#, c-format
msgid "%d more files to edit. Quit anyway?"
msgstr "Nog %d l๊ers om te bewerk. Stop in elk geval?"
-#: ../ex_docmd.c:4248
msgid "E173: 1 more file to edit"
msgstr "E173: Nog 1 l๊er om te bewerk"
-#: ../ex_docmd.c:4250
#, c-format
msgid "E173: %<PRId64> more files to edit"
msgstr "E173: Nog %<PRId64> l๊ers om te bewerk"
-#: ../ex_docmd.c:4320
msgid "E174: Command already exists: add ! to replace it"
msgstr "E174: Bevel bestaan alreeds: gebruik ! om te herdefinieer"
-#: ../ex_docmd.c:4432
+#, fuzzy
msgid ""
"\n"
-" Name Args Range Complete Definition"
+" Name Args Address Complete Definition"
msgstr ""
"\n"
" Naam Args Reeks Klaar Definisie"
-#: ../ex_docmd.c:4516
msgid "No user-defined commands found"
msgstr "Geen gebruiker-gedefinieerde bevele gevind nie"
-#: ../ex_docmd.c:4538
msgid "E175: No attribute specified"
msgstr "E175: Geen eienskappe gespesifiseer nie"
-#: ../ex_docmd.c:4583
msgid "E176: Invalid number of arguments"
msgstr "E176: Ongeldige aantal parameters"
-#: ../ex_docmd.c:4594
msgid "E177: Count cannot be specified twice"
msgstr "E177: Telling kan nie twee keer gespesifiseer word nie"
-#: ../ex_docmd.c:4603
msgid "E178: Invalid default value for count"
msgstr "E178: Ongeldige verstekwaarde vir telling"
-#: ../ex_docmd.c:4625
#, fuzzy
-msgid "E179: argument required for -complete"
-msgstr "E179: parameter nodig vir voltooiing"
+#~ msgid "E179: argument required for -complete"
+#~ msgstr "E179: parameter nodig vir voltooiing"
+
+#, fuzzy
+#~ msgid "E179: argument required for -addr"
+#~ msgstr "E179: parameter nodig vir voltooiing"
-#: ../ex_docmd.c:4635
#, c-format
msgid "E181: Invalid attribute: %s"
msgstr "E181: Ongeldige eienskap: %s"
-#: ../ex_docmd.c:4678
msgid "E182: Invalid command name"
msgstr "E182: Ongeldige bevelnaam"
-#: ../ex_docmd.c:4691
msgid "E183: User defined commands must start with an uppercase letter"
msgstr "E183: Gebruiker-gedefinieerde bevele moet met 'n hoofletter begin"
-#: ../ex_docmd.c:4696
#, fuzzy
-msgid "E841: Reserved name, cannot be used for user defined command"
-msgstr "E464: Dubbelsinnige gebruik van gebruiker-gedefinieerde bevel"
+#~ msgid "E841: Reserved name, cannot be used for user defined command"
+#~ msgstr "E464: Dubbelsinnige gebruik van gebruiker-gedefinieerde bevel"
-#: ../ex_docmd.c:4751
#, c-format
msgid "E184: No such user-defined command: %s"
msgstr "E184: Geen gebruiker-gedefinieerde bevel nie: %s"
-#: ../ex_docmd.c:5219
+#, fuzzy, c-format
+#~ msgid "E180: Invalid address type value: %s"
+#~ msgstr "E180: Ongeldige voltooiingswaarde: %s"
+
#, c-format
msgid "E180: Invalid complete value: %s"
msgstr "E180: Ongeldige voltooiingswaarde: %s"
-#: ../ex_docmd.c:5225
msgid "E468: Completion argument only allowed for custom completion"
msgstr "E468: Voltooiingsargument words slegs toegelaat vir eie voltooiing"
-#: ../ex_docmd.c:5231
msgid "E467: Custom completion requires a function argument"
msgstr "E467: Eie voltooiing benodig 'n funksie parameter"
-#: ../ex_docmd.c:5257
#, fuzzy, c-format
-msgid "E185: Cannot find color scheme '%s'"
-msgstr "E185: Kan nie kleurskema %s vind nie"
+#~ msgid "E185: Cannot find color scheme '%s'"
+#~ msgstr "E185: Kan nie kleurskema %s vind nie"
-#: ../ex_docmd.c:5263
msgid "Greetings, Vim user!"
msgstr "Goeiedag, Vim gebruiker!"
-#: ../ex_docmd.c:5431
#, fuzzy
-msgid "E784: Cannot close last tab page"
-msgstr "E444: Kan nie laaste venster toemaak nie"
+#~ msgid "E784: Cannot close last tab page"
+#~ msgstr "E444: Kan nie laaste venster toemaak nie"
-#: ../ex_docmd.c:5462
#, fuzzy
-msgid "Already only one tab page"
-msgstr "Daar is alreeds slegs een venster"
+#~ msgid "Already only one tab page"
+#~ msgstr "Daar is alreeds slegs een venster"
-#: ../ex_docmd.c:6004
#, fuzzy, c-format
-msgid "Tab page %d"
-msgstr "Bladsy %d"
+#~ msgid "Tab page %d"
+#~ msgstr "Bladsy %d"
-#: ../ex_docmd.c:6295
msgid "No swap file"
msgstr "Geen ruill๊er"
-#: ../ex_docmd.c:6478
-#, fuzzy
-msgid "E747: Cannot change directory, buffer is modified (add ! to override)"
-msgstr "E509: Kan rugsteunl๊er nie skep nie (gebruik ! om te dwing)"
-
-#: ../ex_docmd.c:6485
msgid "E186: No previous directory"
msgstr "E186: Geen vorige gids nie"
-#: ../ex_docmd.c:6530
msgid "E187: Unknown"
msgstr "E187: Onbekend"
-#: ../ex_docmd.c:6610
msgid "E465: :winsize requires two number arguments"
msgstr "E465: ':winsize' benodig twee nommer parameters"
-#: ../ex_docmd.c:6655
-msgid "E188: Obtaining window position not implemented for this platform"
-msgstr ""
-"E188: Verkryging van vensterposisie is nie vir hierdie platform "
-"ge๏mplementeer nie"
-
-#: ../ex_docmd.c:6662
-msgid "E466: :winpos requires two number arguments"
-msgstr "E466: :winpos benodig twee parameters"
-
-#: ../ex_docmd.c:7241
-#, fuzzy, c-format
-msgid "E739: Cannot create directory: %s"
-msgstr "Kan nie gids uitvoer nie: \"%s\""
-
-#: ../ex_docmd.c:7268
#, c-format
msgid "E189: \"%s\" exists (add ! to override)"
msgstr "E189: \"%s\" bestaan (gebruik ! om te dwing)"
-#: ../ex_docmd.c:7273
#, c-format
msgid "E190: Cannot open \"%s\" for writing"
msgstr "E190: Kan \"%s\" nie oopmaak vir skryf nie"
#. set mark
-#: ../ex_docmd.c:7294
msgid "E191: Argument must be a letter or forward/backward quote"
msgstr ""
"E191: Parameter moet 'n letter of 'n terug/vorentoe aanhalingsteken wees"
-#: ../ex_docmd.c:7333
msgid "E192: Recursive use of :normal too deep"
msgstr "E192: Rekursiewe gebruik van ':normal' te diep"
-#: ../ex_docmd.c:7807
msgid "E194: No alternate file name to substitute for '#'"
msgstr "E194: Geen alternatiewe l๊ernaam vir '#' nie"
-#: ../ex_docmd.c:7841
msgid "E495: no autocommand file name to substitute for \"<afile>\""
msgstr "E495: geen outobevel-l๊ernaam om \"<afile>\" mee te vervang nie"
-#: ../ex_docmd.c:7850
msgid "E496: no autocommand buffer number to substitute for \"<abuf>\""
msgstr "E496: geen outobevel buffernommer om \"<abuf>\" mee te vervang nie"
-#: ../ex_docmd.c:7861
msgid "E497: no autocommand match name to substitute for \"<amatch>\""
msgstr "E497: geen outobevel treffernaam om \"<amatch>\" mee te vervang nie"
-#: ../ex_docmd.c:7870
msgid "E498: no :source file name to substitute for \"<sfile>\""
msgstr "E498: geen ':source' l๊ernaam om \"<sfile>\" mee te vervang nie"
-#: ../ex_docmd.c:7876
#, fuzzy
-msgid "E842: no line number to use for \"<slnum>\""
-msgstr "E498: geen ':source' l๊ernaam om \"<sfile>\" mee te vervang nie"
+#~ msgid "E842: no line number to use for \"<slnum>\""
+#~ msgstr "E498: geen ':source' l๊ernaam om \"<sfile>\" mee te vervang nie"
-#: ../ex_docmd.c:7903
#, c-format
msgid "E499: Empty file name for '%' or '#', only works with \":p:h\""
msgstr "E499: Le๋ l๊ernaam vir '%' of '#', werk slegs met \":p:h\""
-#: ../ex_docmd.c:7905
msgid "E500: Evaluates to an empty string"
msgstr "E500: Evalueer na 'n le๋ string"
-#: ../ex_docmd.c:8838
-msgid "E195: Cannot open viminfo file for reading"
-msgstr "E195: Kan 'viminfo' l๊er nie oopmaak om te lees nie"
-
-#: ../ex_eval.c:464
msgid "E608: Cannot :throw exceptions with 'Vim' prefix"
msgstr "E608: Kan nie uitsonderings ':throw' met 'Vim' voorvoegsel nie"
#. always scroll up, don't overwrite
-#: ../ex_eval.c:496
#, c-format
msgid "Exception thrown: %s"
msgstr "Uitsondering gegooi: %s"
-#: ../ex_eval.c:545
+#. always scroll up, don't overwrite
#, c-format
msgid "Exception finished: %s"
msgstr "Uitsondering het klaar gemaak: %s"
-#: ../ex_eval.c:546
#, c-format
msgid "Exception discarded: %s"
msgstr "Uitsondering weg gegooi: %s"
-#: ../ex_eval.c:588 ../ex_eval.c:634
#, c-format
msgid "%s, line %<PRId64>"
msgstr "%s, re๋l %<PRId64>"
#. always scroll up, don't overwrite
-#: ../ex_eval.c:608
#, c-format
msgid "Exception caught: %s"
msgstr "Uitsondering gevang: %s"
-#: ../ex_eval.c:676
#, c-format
msgid "%s made pending"
msgstr "%s is afwagtend gemaak"
-#: ../ex_eval.c:679
#, c-format
msgid "%s resumed"
msgstr "%s teruggekeer"
-#: ../ex_eval.c:683
#, c-format
msgid "%s discarded"
msgstr "%s weg gegooi"
-#: ../ex_eval.c:708
msgid "Exception"
msgstr "Uitsondering"
-#: ../ex_eval.c:713
msgid "Error and interrupt"
msgstr "Fout en onderbreking"
-#: ../ex_eval.c:715
msgid "Error"
msgstr "Fout"
#. if (pending & CSTP_INTERRUPT)
-#: ../ex_eval.c:717
msgid "Interrupt"
msgstr "Onderbreek"
-#: ../ex_eval.c:795
msgid "E579: :if nesting too deep"
msgstr "E579: geneste ':if' te diep"
-#: ../ex_eval.c:830
msgid "E580: :endif without :if"
msgstr "E580: ':endif' sonder ':if'"
-#: ../ex_eval.c:873
msgid "E581: :else without :if"
msgstr "E581: ':else' sonder ':if'"
-#: ../ex_eval.c:876
msgid "E582: :elseif without :if"
msgstr "E582: ':elseif' sonder ':if'"
-#: ../ex_eval.c:880
msgid "E583: multiple :else"
msgstr "E583: meer as een ':else'"
-#: ../ex_eval.c:883
msgid "E584: :elseif after :else"
msgstr "E584: ':elseif' na ':else'"
-#: ../ex_eval.c:941
#, fuzzy
-msgid "E585: :while/:for nesting too deep"
-msgstr "E585: ':while' te diep genes"
+#~ msgid "E585: :while/:for nesting too deep"
+#~ msgstr "E585: ':while' te diep genes"
-#: ../ex_eval.c:1028
#, fuzzy
-msgid "E586: :continue without :while or :for"
-msgstr "E586: ':continue' sonder ':while'"
+#~ msgid "E586: :continue without :while or :for"
+#~ msgstr "E586: ':continue' sonder ':while'"
-#: ../ex_eval.c:1061
#, fuzzy
-msgid "E587: :break without :while or :for"
-msgstr "E587: ':break' sonder ':while'"
+#~ msgid "E587: :break without :while or :for"
+#~ msgstr "E587: ':break' sonder ':while'"
-#: ../ex_eval.c:1102
#, fuzzy
-msgid "E732: Using :endfor with :while"
-msgstr "E170: Ontbrekende ':endwhile'"
+#~ msgid "E732: Using :endfor with :while"
+#~ msgstr "E170: Ontbrekende ':endwhile'"
-#: ../ex_eval.c:1104
#, fuzzy
-msgid "E733: Using :endwhile with :for"
-msgstr "E170: Ontbrekende ':endwhile'"
+#~ msgid "E733: Using :endwhile with :for"
+#~ msgstr "E170: Ontbrekende ':endwhile'"
-#: ../ex_eval.c:1247
msgid "E601: :try nesting too deep"
msgstr "E601: geneste ':try' te diep"
-#: ../ex_eval.c:1317
msgid "E603: :catch without :try"
msgstr "E603: ':catch' sonder ':try'"
#. Give up for a ":catch" after ":finally" and ignore it.
#. * Just parse.
-#: ../ex_eval.c:1332
msgid "E604: :catch after :finally"
msgstr "E604: ':catch' na ':finally'"
-#: ../ex_eval.c:1451
msgid "E606: :finally without :try"
msgstr "E606: ':finally' sonder ':try'"
#. Give up for a multiple ":finally" and ignore it.
-#: ../ex_eval.c:1467
msgid "E607: multiple :finally"
msgstr "E607: meer as een ':finally'"
-#: ../ex_eval.c:1571
msgid "E602: :endtry without :try"
msgstr "E602: ':endtry' sonder ':try'"
-#: ../ex_eval.c:2026
msgid "E193: :endfunction not inside a function"
msgstr "E193: ':endfunction' nie in 'n funksie nie"
-#: ../ex_getln.c:1643
#, fuzzy
-msgid "E788: Not allowed to edit another buffer now"
-msgstr "E48: Nie toegelaat in sandput nie"
+#~ msgid "E788: Not allowed to edit another buffer now"
+#~ msgstr "E48: Nie toegelaat in sandput nie"
-#: ../ex_getln.c:1656
#, fuzzy
-msgid "E811: Not allowed to change buffer information now"
-msgstr "E94: Geen buffer wat by %s pas nie"
+#~ msgid "E811: Not allowed to change buffer information now"
+#~ msgstr "E94: Geen buffer wat by %s pas nie"
-#: ../ex_getln.c:3178
-msgid "tagname"
-msgstr "etiketnaam"
+#, c-format
+#~ msgid "E5408: Unable to get g:Nvim_color_cmdline callback: %s"
+#~ msgstr ""
-#: ../ex_getln.c:3181
-msgid " kind file\n"
-msgstr " tipe l๊er\n"
+#, c-format
+#~ msgid "E5409: Unable to get g:Nvim_color_expr callback: %s"
+#~ msgstr ""
-#: ../ex_getln.c:4799
-msgid "'history' option is zero"
-msgstr "'history' opsie is nul"
+#, c-format
+#~ msgid "E5407: Callback has thrown an exception: %s"
+#~ msgstr ""
+
+#~ msgid "E5400: Callback should return list"
+#~ msgstr ""
-#: ../ex_getln.c:5046
#, c-format
-msgid ""
-"\n"
-"# %s History (newest to oldest):\n"
-msgstr ""
-"\n"
-"# %s Geskiedenis (van nuutste na oudste):\n"
+#~ msgid "E5401: List item %i is not a List"
+#~ msgstr ""
+
+#, c-format
+#~ msgid "E5402: List item %i has incorrect length: %li /= 3"
+#~ msgstr ""
+
+#~ msgid "E5403: Chunk %i start %"
+#~ msgstr ""
-#: ../ex_getln.c:5047
-msgid "Command Line"
-msgstr "Bevelre๋l"
+#~ msgid "E5405: Chunk %i start %"
+#~ msgstr ""
-#: ../ex_getln.c:5048
-msgid "Search String"
-msgstr "Soekstring"
+#~ msgid "E5404: Chunk %i end %"
+#~ msgstr ""
-#: ../ex_getln.c:5049
-msgid "Expression"
-msgstr "Uitdrukking"
+#~ msgid "E5406: Chunk %i end %"
+#~ msgstr ""
-#: ../ex_getln.c:5050
-msgid "Input Line"
-msgstr "Invoer Lyn"
+msgid "tagname"
+msgstr "etiketnaam"
+
+msgid " kind file\n"
+msgstr " tipe l๊er\n"
+
+msgid "'history' option is zero"
+msgstr "'history' opsie is nul"
-#: ../ex_getln.c:5117
msgid "E198: cmd_pchar beyond the command length"
msgstr "E198: 'cmd_pchar' verby die einde van opdraglengte"
-#: ../ex_getln.c:5279
msgid "E199: Active window or buffer deleted"
msgstr "E199: Aktiewe venster of buffer geskrap"
-#: ../file_search.c:203
-msgid "E854: path too long for completion"
-msgstr ""
+#~ msgid "E854: path too long for completion"
+#~ msgstr ""
-#: ../file_search.c:446
#, c-format
msgid ""
"E343: Invalid path: '**[number]' must be at the end of the path or be "
@@ -2052,267 +1999,208 @@ msgstr ""
"E343: Ongeldige pad: '**[nommer]' moet aan die einde van 'n pad wees of "
"gevolg wees deur %s'."
-#: ../file_search.c:1505
#, c-format
msgid "E344: Can't find directory \"%s\" in cdpath"
msgstr "E344: Kan nie gids \"%s\" in 'cdpath' vind nie"
-#: ../file_search.c:1508
#, c-format
msgid "E345: Can't find file \"%s\" in path"
msgstr "E345: Kan l๊er \"%s\" nie vind in pad nie"
-#: ../file_search.c:1512
#, c-format
msgid "E346: No more directory \"%s\" found in cdpath"
msgstr "E346: Geen gids \"%s\" meer gevind in 'cdpath' nie"
-#: ../file_search.c:1515
#, c-format
msgid "E347: No more file \"%s\" found in path"
msgstr "E347: Geen l๊er \"%s\" meer gevind in pad nie"
-#: ../fileio.c:137
#, fuzzy
-msgid "E812: Autocommands changed buffer or buffer name"
-msgstr "E135: *Filter* Outobevele mag nie die huidige buffer verander nie"
+#~ msgid "E812: Autocommands changed buffer or buffer name"
+#~ msgstr "E135: *Filter* Outobevele mag nie die huidige buffer verander nie"
-#: ../fileio.c:368
msgid "Illegal file name"
msgstr "Ongeldige l๊ernaam"
-#: ../fileio.c:395 ../fileio.c:476 ../fileio.c:2543 ../fileio.c:2578
msgid "is a directory"
msgstr "is 'n gids"
-#: ../fileio.c:397
msgid "is not a file"
msgstr "is nie 'n l๊er nie"
-#: ../fileio.c:508 ../fileio.c:3522
msgid "[New File]"
msgstr "[Nuwe l๊er]"
-#: ../fileio.c:511
-msgid "[New DIRECTORY]"
-msgstr ""
+#~ msgid "[New DIRECTORY]"
+#~ msgstr ""
-#: ../fileio.c:529 ../fileio.c:532
-msgid "[File too big]"
-msgstr ""
+#. libuv only returns -errno in Unix and in Windows open() does not
+#. set EOVERFLOW
+#~ msgid "[File too big]"
+#~ msgstr ""
-#: ../fileio.c:534
msgid "[Permission Denied]"
msgstr "[Toestemming Geweier]"
-#: ../fileio.c:653
msgid "E200: *ReadPre autocommands made the file unreadable"
msgstr "E200: '*ReadPre' outobevele het die l๊er onleesbaar gemaak"
-#: ../fileio.c:655
msgid "E201: *ReadPre autocommands must not change current buffer"
msgstr "E201: '*ReadPre' outobevele mag nie die huidige buffer verander nie"
-#: ../fileio.c:672
-msgid "Nvim: Reading from stdin...\n"
-msgstr "Vim: Lees nou vanaf 'stdin'...\n"
-
#. Re-opening the original file failed!
-#: ../fileio.c:909
msgid "E202: Conversion made file unreadable!"
msgstr "E202: Omsetting het l๊er onleesbaar gemaak!"
#. fifo or socket
-#: ../fileio.c:1782
msgid "[fifo/socket]"
msgstr "[fifo/socket]"
#. fifo
-#: ../fileio.c:1788
msgid "[fifo]"
msgstr "[fifo]"
#. or socket
-#: ../fileio.c:1794
msgid "[socket]"
msgstr "[socket]"
#. or character special
-#: ../fileio.c:1801
#, fuzzy
-msgid "[character special]"
-msgstr "1 karakter"
+#~ msgid "[character special]"
+#~ msgstr "1 karakter"
-#: ../fileio.c:1815
msgid "[CR missing]"
msgstr "[CR ontbreek]"
-#: ../fileio.c:1819
msgid "[long lines split]"
msgstr "[lang re๋ls verdeel]"
-#: ../fileio.c:1823 ../fileio.c:3512
msgid "[NOT converted]"
msgstr "[NIE omgesit nie]"
-#: ../fileio.c:1826 ../fileio.c:3515
msgid "[converted]"
msgstr "[omgesit]"
-#: ../fileio.c:1831
#, fuzzy, c-format
-msgid "[CONVERSION ERROR in line %<PRId64>]"
-msgstr "[ONWETTIGE GREEP in re๋l %<PRId64>]"
+#~ msgid "[CONVERSION ERROR in line %<PRId64>]"
+#~ msgstr "[ONWETTIGE GREEP in re๋l %<PRId64>]"
-#: ../fileio.c:1835
#, c-format
msgid "[ILLEGAL BYTE in line %<PRId64>]"
msgstr "[ONWETTIGE GREEP in re๋l %<PRId64>]"
-#: ../fileio.c:1838
msgid "[READ ERRORS]"
msgstr "[LEESFOUTE]"
-#: ../fileio.c:2104
msgid "Can't find temp file for conversion"
msgstr "Kan nie tydelike l๊er vir omsetting vind nie"
-#: ../fileio.c:2110
msgid "Conversion with 'charconvert' failed"
msgstr "Omsetting met 'charconvert' het gefaal"
-#: ../fileio.c:2113
msgid "can't read output of 'charconvert'"
msgstr "kan afvoer van 'charconvert' nie lees nie"
-#: ../fileio.c:2437
#, fuzzy
-msgid "E676: No matching autocommands for acwrite buffer"
-msgstr "Geen passende outobevele nie"
+#~ msgid "E676: No matching autocommands for acwrite buffer"
+#~ msgstr "Geen passende outobevele nie"
-#: ../fileio.c:2466
msgid "E203: Autocommands deleted or unloaded buffer to be written"
msgstr "E203: Outobevele het die skryfbuffer geskrap of uitgelaai"
-#: ../fileio.c:2486
msgid "E204: Autocommand changed number of lines in unexpected way"
msgstr "E204: Outobevel het etlike re๋ls op onverwagse wyse verander "
-#: ../fileio.c:2548 ../fileio.c:2565
msgid "is not a file or writable device"
msgstr "is nie 'n l๊er of 'n skryfbare toestel nie"
-#: ../fileio.c:2601
msgid "is read-only (add ! to override)"
msgstr "is lees-alleen (gebruik ! om te dwing)"
-#: ../fileio.c:2886
msgid "E506: Can't write to backup file (add ! to override)"
msgstr "E506: Kan nie na rugsteunl๊er skryf nie (gebruik ! om te dwing)"
-#: ../fileio.c:2898
-msgid "E507: Close error for backup file (add ! to override)"
-msgstr "E507: Sluitfout vir rugsteunl๊er (gebruik ! om te dwing)"
+#, fuzzy, c-format
+#~ msgid "E507: Close error for backup file (add ! to override): %s"
+#~ msgstr "E507: Sluitfout vir rugsteunl๊er (gebruik ! om te dwing)"
-#: ../fileio.c:2901
msgid "E508: Can't read file for backup (add ! to override)"
msgstr "E508: Kan rugsteunl๊er nie lees nie (gebruik ! om te dwing)"
-#: ../fileio.c:2923
msgid "E509: Cannot create backup file (add ! to override)"
msgstr "E509: Kan rugsteunl๊er nie skep nie (gebruik ! om te dwing)"
-#: ../fileio.c:3008
msgid "E510: Can't make backup file (add ! to override)"
msgstr "E510: Kan rugsteunl๊er nie skep nie (gebruik ! om te dwing)"
#. Can't write without a tempfile!
-#: ../fileio.c:3121
msgid "E214: Can't find temp file for writing"
msgstr "E214: Kan nie tydelike l๊er vind vir skryf nie"
-#: ../fileio.c:3134
msgid "E213: Cannot convert (add ! to write without conversion)"
msgstr "E213: Kan nie omsit nie (gebruik ! om te skryf sonder omsetting)"
-#: ../fileio.c:3169
msgid "E166: Can't open linked file for writing"
msgstr "E166: Kan l๊er nie oopmaak vir skryf nie"
-#: ../fileio.c:3173
-msgid "E212: Can't open file for writing"
-msgstr "E212: Kan l๊er nie oopmaak vir skryf nie"
+#, fuzzy, c-format
+#~ msgid "E212: Can't open file for writing: %s"
+#~ msgstr "E212: Kan l๊er nie oopmaak vir skryf nie"
-#: ../fileio.c:3363
-msgid "E667: Fsync failed"
-msgstr "E667: 'Fsync' het gefaal"
+#, fuzzy, c-format
+#~ msgid "E667: Fsync failed: %s"
+#~ msgstr "E667: 'Fsync' het gefaal"
-#: ../fileio.c:3398
-msgid "E512: Close failed"
-msgstr "E512: Sluiting gefaal"
+#, fuzzy, c-format
+#~ msgid "E512: Close failed: %s"
+#~ msgstr "E512: Sluiting gefaal"
-#: ../fileio.c:3436
#, fuzzy
-msgid "E513: write error, conversion failed (make 'fenc' empty to override)"
-msgstr "E513: skryffout, omsetting gefaal"
+#~ msgid "E513: write error, conversion failed (make 'fenc' empty to override)"
+#~ msgstr "E513: skryffout, omsetting gefaal"
-#: ../fileio.c:3441
-#, c-format
-msgid ""
-"E513: write error, conversion failed in line %<PRId64> (make 'fenc' empty to "
-"override)"
-msgstr ""
+#, fuzzy
+#~ msgid "E513: write error, conversion failed in line %"
+#~ msgstr "E513: skryffout, omsetting gefaal"
-#: ../fileio.c:3448
msgid "E514: write error (file system full?)"
msgstr "E514: skryffout (l๊erstelsel vol?)"
-#: ../fileio.c:3506
msgid " CONVERSION ERROR"
msgstr " OMSETTINGSFOUT"
-#: ../fileio.c:3509
#, fuzzy, c-format
-msgid " in line %<PRId64>;"
-msgstr "re๋l %<PRId64>"
+#~ msgid " in line %<PRId64>;"
+#~ msgstr "re๋l %<PRId64>"
-#: ../fileio.c:3519
msgid "[Device]"
msgstr "[Toestel]"
-#: ../fileio.c:3522
msgid "[New]"
msgstr "[Nuut]"
-#: ../fileio.c:3535
msgid " [a]"
msgstr " [a]"
-#: ../fileio.c:3535
msgid " appended"
msgstr " bygevoeg"
-#: ../fileio.c:3537
msgid " [w]"
msgstr " [w]"
-#: ../fileio.c:3537
msgid " written"
msgstr " geskryf"
-#: ../fileio.c:3579
msgid "E205: Patchmode: can't save original file"
msgstr "E205: patchmode: kan oorspronklike l๊er nie stoor nie"
-#: ../fileio.c:3602
msgid "E206: patchmode: can't touch empty original file"
msgstr "E206: patchmode: kan le๋ oorsprongl๊er nie 'touch' nie"
-#: ../fileio.c:3616
msgid "E207: Can't delete backup file"
msgstr "E207: Kan rugsteunl๊er nie verwyder nie"
-#: ../fileio.c:3672
+#. Set highlight for error messages.
msgid ""
"\n"
"WARNING: Original file may be lost or damaged\n"
@@ -2320,96 +2208,75 @@ msgstr ""
"\n"
"WAARSKUWING: Oorspronklike l๊er mag verlore of beskadig wees\n"
-#: ../fileio.c:3675
msgid "don't quit the editor until the file is successfully written!"
msgstr "moenie die verwerker verlaat voor die l๊er suksesvol geskryf is nie!"
-#: ../fileio.c:3795
-msgid "[dos]"
-msgstr "[dos]"
-
-#: ../fileio.c:3795
msgid "[dos format]"
msgstr "[dos formaat]"
-#: ../fileio.c:3801
-msgid "[mac]"
-msgstr "[mac]"
+msgid "[dos]"
+msgstr "[dos]"
-#: ../fileio.c:3801
msgid "[mac format]"
msgstr "[mac formaat]"
-#: ../fileio.c:3807
-msgid "[unix]"
-msgstr "[unix]"
+msgid "[mac]"
+msgstr "[mac]"
-#: ../fileio.c:3807
msgid "[unix format]"
msgstr "[unix formaat]"
-#: ../fileio.c:3831
+msgid "[unix]"
+msgstr "[unix]"
+
msgid "1 line, "
msgstr "1 re๋l, "
-#: ../fileio.c:3833
#, c-format
msgid "%<PRId64> lines, "
msgstr "%<PRId64> re๋ls, "
-#: ../fileio.c:3836
msgid "1 character"
msgstr "1 karakter"
-#: ../fileio.c:3838
#, c-format
msgid "%<PRId64> characters"
msgstr "%<PRId64> karakters"
-#: ../fileio.c:3849
-msgid "[noeol]"
-msgstr "[noeol]"
-
-#: ../fileio.c:3849
msgid "[Incomplete last line]"
msgstr "[Onvoltooide laaste re๋l]"
-#. don't overwrite messages here
-#. must give this prompt
-#. don't use emsg() here, don't want to flush the buffers
-#: ../fileio.c:3865
+msgid "[noeol]"
+msgstr "[noeol]"
+
+#. Don't overwrite messages here.
+#. Must give this prompt.
+#. Don't use emsg() here, don't want to flush the buffers.
msgid "WARNING: The file has been changed since reading it!!!"
msgstr "WAARSKUWING: Die l๊er het verander sedert dit gelees is!!!"
-#: ../fileio.c:3867
msgid "Do you really want to write to it"
msgstr "Wil jy regtig soontoe skryf?"
-#: ../fileio.c:4648
#, c-format
msgid "E208: Error writing to \"%s\""
msgstr "E208: Kan nie skryf na \"%s\""
-#: ../fileio.c:4655
#, c-format
msgid "E209: Error closing \"%s\""
msgstr "E209: Kan \"%s\" nie sluit nie"
-#: ../fileio.c:4657
#, c-format
msgid "E210: Error reading \"%s\""
msgstr "E210: Kan \"%s\" nie lees nie"
-#: ../fileio.c:4883
msgid "E246: FileChangedShell autocommand deleted buffer"
msgstr "E246: 'FileChangedShell' outobevel het buffer verwyder"
-#: ../fileio.c:4894
#, fuzzy, c-format
-msgid "E211: File \"%s\" no longer available"
-msgstr "E211: Waarskuwing: L๊er \"%s\" is nie meer beskikbaar nie"
+#~ msgid "E211: File \"%s\" no longer available"
+#~ msgstr "E211: Waarskuwing: L๊er \"%s\" is nie meer beskikbaar nie"
-#: ../fileio.c:4906
#, c-format
msgid ""
"W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as "
@@ -2418,42 +2285,34 @@ msgstr ""
"W12: Waarskuwing: L๊er \"%s\" het verander sedert bewerking begin het en die "
"buffer in Vim het ook verander"
-#: ../fileio.c:4907
#, fuzzy
-msgid "See \":help W12\" for more info."
-msgstr "Sien \":help W11\" vir meer inligting."
+#~ msgid "See \":help W12\" for more info."
+#~ msgstr "Sien \":help W11\" vir meer inligting."
-#: ../fileio.c:4910
#, c-format
msgid "W11: Warning: File \"%s\" has changed since editing started"
msgstr "W11: Waarskuwing: L๊er \"%s\" het verander sedert bewerking begin het"
-#: ../fileio.c:4911
msgid "See \":help W11\" for more info."
msgstr "Sien \":help W11\" vir meer inligting."
-#: ../fileio.c:4914
#, c-format
msgid "W16: Warning: Mode of file \"%s\" has changed since editing started"
msgstr ""
"W16: Waarskuwing: Modus van l๊er \"%s\" het verander sedert bewerking begin "
"het"
-#: ../fileio.c:4915
#, fuzzy
-msgid "See \":help W16\" for more info."
-msgstr "Sien \":help W11\" vir meer inligting."
+#~ msgid "See \":help W16\" for more info."
+#~ msgstr "Sien \":help W11\" vir meer inligting."
-#: ../fileio.c:4927
#, c-format
msgid "W13: Warning: File \"%s\" has been created after editing started"
msgstr "W13: Waarskuwing: L๊er \"%s\" is geskep sedert bewerking begin het"
-#: ../fileio.c:4947
msgid "Warning"
msgstr "Waarskuwing"
-#: ../fileio.c:4948
msgid ""
"&OK\n"
"&Load File"
@@ -2461,157 +2320,135 @@ msgstr ""
"&OK\n"
"&Laai L๊er"
-#: ../fileio.c:5065
#, c-format
msgid "E462: Could not prepare for reloading \"%s\""
msgstr "E462: Kon nie voorberei vir herlaai nie \"%s\""
-#: ../fileio.c:5078
#, c-format
msgid "E321: Could not reload \"%s\""
msgstr "E321: Kon nie \"%s\" herlaai nie"
-#: ../fileio.c:5601
msgid "--Deleted--"
msgstr "--Geskrap--"
-#: ../fileio.c:5732
#, c-format
-msgid "auto-removing autocommand: %s <buffer=%d>"
-msgstr ""
+#~ msgid "auto-removing autocommand: %s <buffer=%d>"
+#~ msgstr ""
#. the group doesn't exist
-#: ../fileio.c:5772
#, c-format
msgid "E367: No such group: \"%s\""
msgstr "E367: Geen sodanige groep nie: \"%s\""
-#: ../fileio.c:5897
+#, fuzzy
+#~ msgid "E936: Cannot delete the current group"
+#~ msgstr "E351: Kan nie vou skrap met huidige 'foldmethod' nie"
+
+#~ msgid "W19: Deleting augroup that is still in use"
+#~ msgstr ""
+
#, c-format
msgid "E215: Illegal character after *: %s"
msgstr "E215: Ongeldige karakter na *: %s"
-#: ../fileio.c:5905
#, c-format
msgid "E216: No such event: %s"
msgstr "E216: Geen sodanige gebeurtenis nie: %s"
-#: ../fileio.c:5907
#, c-format
msgid "E216: No such group or event: %s"
msgstr "E216: Geen sodanige groep of gebeurtenis nie: %s"
#. Highlight title
-#: ../fileio.c:6090
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
"--- Outobevele ---"
-#: ../fileio.c:6293
#, fuzzy, c-format
-msgid "E680: <buffer=%d>: invalid buffer number "
-msgstr "ongeldige buffernommer"
+#~ msgid "E680: <buffer=%d>: invalid buffer number "
+#~ msgstr "ongeldige buffernommer"
-#: ../fileio.c:6370
msgid "E217: Can't execute autocommands for ALL events"
msgstr "E217: Kan nie outobevele uitvoer vir 'ALL' gebeurtenisse nie"
-#: ../fileio.c:6393
msgid "No matching autocommands"
msgstr "Geen passende outobevele nie"
-#: ../fileio.c:6831
msgid "E218: autocommand nesting too deep"
msgstr "E218: outobevele te diep genes"
-#: ../fileio.c:7143
#, c-format
-msgid "%s Auto commands for \"%s\""
+msgid "%s Autocommands for \"%s\""
msgstr "%s outobevele vir \"%s\""
-#: ../fileio.c:7149
#, c-format
msgid "Executing %s"
msgstr "Voer %s uit"
-#: ../fileio.c:7211
#, c-format
msgid "autocommand %s"
msgstr "outobevel %s"
-#: ../fileio.c:7795
msgid "E219: Missing {."
msgstr "E219: Ontbrekende {."
-#: ../fileio.c:7797
msgid "E220: Missing }."
msgstr "E220: Ontbrekende }."
-#: ../fold.c:93
msgid "E490: No fold found"
msgstr "E490: Geen vou gevind nie"
-#: ../fold.c:544
msgid "E350: Cannot create fold with current 'foldmethod'"
msgstr "E350: Kan nie vou skep met huidige 'foldmethod' nie"
-#: ../fold.c:546
msgid "E351: Cannot delete fold with current 'foldmethod'"
msgstr "E351: Kan nie vou skrap met huidige 'foldmethod' nie"
-#: ../fold.c:1784
-#, c-format
-msgid "+--%3ld lines folded "
-msgstr "+--%3ld re๋ls gevou "
+#, fuzzy, c-format
+#~ msgid "+--%3ld line folded"
+#~ msgid_plural "+--%3ld lines folded "
+#~ msgstr[0] "+--%3ld re๋ls gevou "
+#~ msgstr[1] "+--%3ld re๋ls gevou "
#. buffer has already been read
-#: ../getchar.c:273
msgid "E222: Add to read buffer"
msgstr "E222: Voeg by leesbuffer"
-#: ../getchar.c:2040
msgid "E223: recursive mapping"
msgstr "E223: rekursiewe binding"
-#: ../getchar.c:2849
#, c-format
msgid "E224: global abbreviation already exists for %s"
msgstr "E224: globale afkorting bestaan alreeds vir %s"
-#: ../getchar.c:2852
#, c-format
msgid "E225: global mapping already exists for %s"
msgstr "E225: globale binding bestaan alreeds vir %s"
-#: ../getchar.c:2952
#, c-format
msgid "E226: abbreviation already exists for %s"
msgstr "E226: afkorting bestaan already vir %s"
-#: ../getchar.c:2955
#, c-format
msgid "E227: mapping already exists for %s"
msgstr "E227: binding bestaan alreeds vir %s"
-#: ../getchar.c:3008
msgid "No abbreviation found"
msgstr "Geen afkorting gevind nie"
-#: ../getchar.c:3010
msgid "No mapping found"
msgstr "Geen binding gevind nie"
-#: ../getchar.c:3974
msgid "E228: makemap: Illegal mode"
msgstr "E228: makemap: Ongeldige modus"
-#. key value of 'cedit' option
-#. type of cmdline window or 0
-#. result of cmdline window or 0
-#: ../globals.h:924
+#. /< key value of 'cedit' option
+#. /< type of cmdline window or 0
+#. /< result of cmdline window or 0
+#. /< cmdline recursion level
msgid "--No lines in buffer--"
msgstr "--Geen re๋ls in buffer--"
@@ -2619,696 +2456,566 @@ msgstr "--Geen re๋ls in buffer--"
#. * The error messages that can be shared are included here.
#. * Excluded are errors that are only used once and debugging messages.
#.
-#: ../globals.h:996
msgid "E470: Command aborted"
msgstr "E470: Bevel gekanselleer"
-#: ../globals.h:997
+#, fuzzy
+#~ msgid "E905: Cannot set this option after startup"
+#~ msgstr "E529: Kan nie 'term' stel na le๋ string nie"
+
+#, fuzzy
+#~ msgid "E903: Could not spawn API job"
+#~ msgstr "E623: Kon nie 'cscope' proses skep nie"
+
msgid "E471: Argument required"
msgstr "E471: Parameter benodig"
-#: ../globals.h:998
msgid "E10: \\ should be followed by /, ? or &"
msgstr "E10: \\ moet gevolg word deur /, ? of &"
-#: ../globals.h:1000
msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
msgstr "E11: Ongeldig in bevelre๋l venster: <CR> voer uit, CTRL-C stop"
-#: ../globals.h:1002
msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
msgstr ""
"E12: Bevel uit exrc/vimrc nie toegelaat in huidige gids- of etiketsoektog nie"
-#: ../globals.h:1003
msgid "E171: Missing :endif"
msgstr "E171: Ontbrekende ':endif'"
-#: ../globals.h:1004
msgid "E600: Missing :endtry"
msgstr "E600: Ontbrekende ':endtry'"
-#: ../globals.h:1005
msgid "E170: Missing :endwhile"
msgstr "E170: Ontbrekende ':endwhile'"
-#: ../globals.h:1006
#, fuzzy
-msgid "E170: Missing :endfor"
-msgstr "E171: Ontbrekende ':endif'"
+#~ msgid "E170: Missing :endfor"
+#~ msgstr "E171: Ontbrekende ':endif'"
-#: ../globals.h:1007
msgid "E588: :endwhile without :while"
msgstr "E588: ':endwhile' sonder ':while'"
-#: ../globals.h:1008
#, fuzzy
-msgid "E588: :endfor without :for"
-msgstr "E580: ':endif' sonder ':if'"
+#~ msgid "E588: :endfor without :for"
+#~ msgstr "E580: ':endif' sonder ':if'"
-#: ../globals.h:1009
msgid "E13: File exists (add ! to override)"
msgstr "E13: L๊er bestaan (gebruik ! om te dwing)"
-#: ../globals.h:1010
msgid "E472: Command failed"
msgstr "E472: Bevel het gefaal"
-#: ../globals.h:1011
msgid "E473: Internal error"
msgstr "E473: Interne fout"
-#: ../globals.h:1012
msgid "Interrupted"
msgstr "Onderbreek"
-#: ../globals.h:1013
msgid "E14: Invalid address"
msgstr "E14: Ongeldige adres"
-#: ../globals.h:1014
msgid "E474: Invalid argument"
msgstr "E474: Ongeldige parameter"
-#: ../globals.h:1015
#, c-format
msgid "E475: Invalid argument: %s"
msgstr "E475: Ongeldige parameter: %s"
-#: ../globals.h:1016
#, c-format
msgid "E15: Invalid expression: %s"
msgstr "E15: Ongeldige uitdrukking: %s"
-#: ../globals.h:1017
msgid "E16: Invalid range"
msgstr "E16: Ongeldige omvang"
-#: ../globals.h:1018
msgid "E476: Invalid command"
msgstr "E476: Ongeldige bevel"
-#: ../globals.h:1019
#, c-format
msgid "E17: \"%s\" is a directory"
msgstr "E17: \"%s\" is 'n gids"
-#: ../globals.h:1020
#, fuzzy
-msgid "E900: Invalid job id"
-msgstr "E49: Ongeldige rolgrootte"
+#~ msgid "E900: Invalid job id"
+#~ msgstr "E49: Ongeldige rolgrootte"
-#: ../globals.h:1021
-msgid "E901: Job table is full"
-msgstr ""
+#~ msgid "E901: Job table is full"
+#~ msgstr ""
-#: ../globals.h:1022
#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
+#~ msgid "E903: Process failed to start: %s: \"%s\""
+#~ msgstr ""
+
+#~ msgid "E904: Job is not connected to a pty"
+#~ msgstr ""
-#: ../globals.h:1024
#, c-format
msgid "E364: Library call failed for \"%s()\""
msgstr "E364: Biblioteekroep het gefaal vir \"%s\"()"
-#: ../globals.h:1026
+#, fuzzy, c-format
+#~ msgid "E739: Cannot create directory %s: %s"
+#~ msgstr "Kan nie gids uitvoer nie: \"%s\""
+
msgid "E19: Mark has invalid line number"
msgstr "E19: Merker het ongeldige re๋lnommer"
-#: ../globals.h:1027
msgid "E20: Mark not set"
msgstr "E20: Merker nie gestel nie"
-#: ../globals.h:1029
msgid "E21: Cannot make changes, 'modifiable' is off"
msgstr "E21: Kan nie wysig nie, 'modifiable' is af"
-#: ../globals.h:1030
msgid "E22: Scripts nested too deep"
msgstr "E22: Skripte te diep ge-nes"
-#: ../globals.h:1031
msgid "E23: No alternate file"
msgstr "E23: Geen alternatiewe l๊er nie"
-#: ../globals.h:1032
msgid "E24: No such abbreviation"
msgstr "E24: Afkorting bestaan nie"
-#: ../globals.h:1033
msgid "E477: No ! allowed"
msgstr "E477: Geen ! toegelaat nie"
-#: ../globals.h:1035
msgid "E25: Nvim does not have a built-in GUI"
msgstr "E25: GUI kan nie gebruik word nie: Nie tydens kompilering gekies nie"
-#: ../globals.h:1036
#, c-format
msgid "E28: No such highlight group name: %s"
msgstr "E28: Geen sodanige uitliggroepnaam nie: %s"
-#: ../globals.h:1037
msgid "E29: No inserted text yet"
msgstr "E29: Nog geen ingevoegde teks nie"
-#: ../globals.h:1038
msgid "E30: No previous command line"
msgstr "E30: Geen vorige bevelre๋l nie"
-#: ../globals.h:1039
msgid "E31: No such mapping"
msgstr "E31: Geen so 'n binding nie"
-#: ../globals.h:1040
msgid "E479: No match"
msgstr "E479: Geen treffer nie"
-#: ../globals.h:1041
#, c-format
msgid "E480: No match: %s"
msgstr "E480: Geen treffer: %s"
-#: ../globals.h:1042
msgid "E32: No file name"
msgstr "E32: Geen l๊ernaam"
-#: ../globals.h:1044
msgid "E33: No previous substitute regular expression"
msgstr "E33: Geen vorige vervangingspatroon nie"
-#: ../globals.h:1045
msgid "E34: No previous command"
msgstr "E34: Geen vorige bevel nie"
-#: ../globals.h:1046
msgid "E35: No previous regular expression"
msgstr "E35: Geen vorige patroon nie"
-#: ../globals.h:1047
msgid "E481: No range allowed"
msgstr "E481: Geen omvang toegelaat nie"
-#: ../globals.h:1048
msgid "E36: Not enough room"
msgstr "E36: Te min plek"
-#: ../globals.h:1049
-#, c-format
-msgid "E482: Can't create file %s"
-msgstr "E482: Kan nie l๊er %s skep nie"
-
-#: ../globals.h:1050
msgid "E483: Can't get temp file name"
msgstr "E483: Kan nie tydelike l๊ernaam kry nie"
-#: ../globals.h:1051
#, c-format
msgid "E484: Can't open file %s"
msgstr "E484: Kan nie l๊er %s oopmaak nie"
-#: ../globals.h:1052
#, c-format
msgid "E485: Can't read file %s"
msgstr "E485: Kan nie l๊er %s lees nie"
-#: ../globals.h:1054
msgid "E37: No write since last change (add ! to override)"
msgstr "E37: Ongeskryf sedert vorige verandering (gebruik ! om te dwing)"
-#: ../globals.h:1055
#, fuzzy
-msgid "E37: No write since last change"
-msgstr "[Ongestoor sedert vorige verandering]\n"
+#~ msgid "E37: No write since last change"
+#~ msgstr "[Ongestoor sedert vorige verandering]\n"
-#: ../globals.h:1056
msgid "E38: Null argument"
msgstr "E38: Nul parameter"
-#: ../globals.h:1057
msgid "E39: Number expected"
msgstr "E39: Nommer verwag"
-#: ../globals.h:1058
#, c-format
msgid "E40: Can't open errorfile %s"
msgstr "E40: Kan nie foutl๊er %s oopmaak nie"
-#: ../globals.h:1059
msgid "E41: Out of memory!"
msgstr "E41: Geheue op!"
-#: ../globals.h:1060
msgid "Pattern not found"
msgstr "Patroon nie gevind nie"
-#: ../globals.h:1061
#, c-format
msgid "E486: Pattern not found: %s"
msgstr "E486: Patroon nie gevind nie: %s"
-#: ../globals.h:1062
msgid "E487: Argument must be positive"
msgstr "E487: Parameter moet positief wees"
-#: ../globals.h:1064
msgid "E459: Cannot go back to previous directory"
msgstr "E459: Kan nie terug gaan na die vorige gids nie"
-#: ../globals.h:1066
msgid "E42: No Errors"
msgstr "E42: Geen Foute"
-#: ../globals.h:1067
-msgid "E776: No location list"
-msgstr ""
+#~ msgid "E776: No location list"
+#~ msgstr ""
-#: ../globals.h:1068
msgid "E43: Damaged match string"
msgstr "E43: Beskadige trefferstring"
-#: ../globals.h:1069
msgid "E44: Corrupted regexp program"
msgstr "E44: Korrupte patroonprogram"
-#: ../globals.h:1071
msgid "E45: 'readonly' option is set (add ! to override)"
msgstr "E45: 'readonly' opsie is aan (gebruik ! om te dwing)"
-#: ../globals.h:1073
-#, fuzzy, c-format
-msgid "E46: Cannot change read-only variable \"%s\""
-msgstr "E46: Kan nie lees-alleen veranderlike stel nie \"%s\""
-
-#: ../globals.h:1075
-#, fuzzy, c-format
-msgid "E794: Cannot set variable in the sandbox: \"%s\""
-msgstr "E46: Kan nie lees-alleen veranderlike stel nie \"%s\""
-
-#: ../globals.h:1076
msgid "E47: Error while reading errorfile"
msgstr "E47: Fout tydens lees van 'errorfile'"
-#: ../globals.h:1078
msgid "E48: Not allowed in sandbox"
msgstr "E48: Nie toegelaat in sandput nie"
-#: ../globals.h:1080
msgid "E523: Not allowed here"
msgstr "E523: Nie hier toegelaat nie"
-#: ../globals.h:1082
msgid "E359: Screen mode setting not supported"
msgstr "E359: Skermmodus instelling nie ondersteun nie"
-#: ../globals.h:1083
msgid "E49: Invalid scroll size"
msgstr "E49: Ongeldige rolgrootte"
-#: ../globals.h:1084
msgid "E91: 'shell' option is empty"
msgstr "E91: 'shell' (dop) opsie is leeg"
-#: ../globals.h:1085
msgid "E255: Couldn't read in sign data!"
msgstr "E255: Fout -- kon nie tekendata lees nie!"
-#: ../globals.h:1086
msgid "E72: Close error on swap file"
msgstr "E72: Sluitfout met ruill๊er"
-#: ../globals.h:1087
msgid "E73: tag stack empty"
msgstr "E73: etiketstapel leeg"
-#: ../globals.h:1088
msgid "E74: Command too complex"
msgstr "E74: Bevel te kompleks"
-#: ../globals.h:1089
msgid "E75: Name too long"
msgstr "E75: Naam te lank"
-#: ../globals.h:1090
msgid "E76: Too many ["
msgstr "E76: Te veel ["
-#: ../globals.h:1091
msgid "E77: Too many file names"
msgstr "E77: Te veel l๊ername"
-#: ../globals.h:1092
msgid "E488: Trailing characters"
msgstr "E488: Oorbodige karakters"
-#: ../globals.h:1093
+#, fuzzy, c-format
+#~ msgid "E488: Trailing characters: %s"
+#~ msgstr "E488: Oorbodige karakters"
+
msgid "E78: Unknown mark"
msgstr "E78: Onbekende merker"
-#: ../globals.h:1094
msgid "E79: Cannot expand wildcards"
msgstr "E79: Kan nie plekhouers uitbrei nie"
-#: ../globals.h:1096
msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
msgstr "E591: 'winheight' kan nie kleiner as 'winminheight' wees nie"
-#: ../globals.h:1098
msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
msgstr "E592: 'winwidth' kan nie kleiner as 'winminwidth' wees nie"
-#: ../globals.h:1099
msgid "E80: Error while writing"
msgstr "E80: Fout tydens skryfoperasie"
-#: ../globals.h:1100
-msgid "Zero count"
-msgstr "Nul telling"
+#, fuzzy
+#~ msgid "E939: Positive count required"
+#~ msgstr "E397: L๊ernaam benodig"
-#: ../globals.h:1101
msgid "E81: Using <SID> not in a script context"
msgstr "E81: Gebruik van '<SID>' buite skripkonteks"
-#: ../globals.h:1102
#, fuzzy, c-format
-msgid "E685: Internal error: %s"
-msgstr "E473: Interne fout"
+#~ msgid "E685: Internal error: %s"
+#~ msgstr "E473: Interne fout"
-#: ../globals.h:1104
-msgid "E363: pattern uses more memory than 'maxmempattern'"
-msgstr ""
+#~ msgid "E363: pattern uses more memory than 'maxmempattern'"
+#~ msgstr ""
-#: ../globals.h:1105
#, fuzzy
-msgid "E749: empty buffer"
-msgstr "E279: Nie 'n SNiFF+ buffer nie"
+#~ msgid "E749: empty buffer"
+#~ msgstr "E279: Nie 'n SNiFF+ buffer nie"
+
+#, c-format
+msgid "E86: Buffer %<PRId64> does not exist"
+msgstr "E86: Buffer %<PRId64> bestaan nie"
-#: ../globals.h:1108
#, fuzzy
-msgid "E682: Invalid search pattern or delimiter"
-msgstr "E383: Ongeldige soekstring: %s"
+#~ msgid "E682: Invalid search pattern or delimiter"
+#~ msgstr "E383: Ongeldige soekstring: %s"
-#: ../globals.h:1109
msgid "E139: File is loaded in another buffer"
msgstr "E139: L๊er is gelaai in ander buffer"
-#: ../globals.h:1110
#, fuzzy, c-format
-msgid "E764: Option '%s' is not set"
-msgstr "E236: Font \"%s\" is nie 'n vaste-wydte font nie"
+#~ msgid "E764: Option '%s' is not set"
+#~ msgstr "E236: Font \"%s\" is nie 'n vaste-wydte font nie"
-#: ../globals.h:1111
#, fuzzy
-msgid "E850: Invalid register name"
-msgstr "E354: Ongeldige registernaam: '%s'"
+#~ msgid "E850: Invalid register name"
+#~ msgstr "E354: Ongeldige registernaam: '%s'"
+
+#, fuzzy, c-format
+#~ msgid "E919: Directory not found in '%s': \"%s\""
+#~ msgstr "E161: Inspeksiepunt kon nie gevind word nie: %s"
+
+msgid "E519: Option not supported"
+msgstr "E519: Opsie is nie ondersteun nie"
+
+#, fuzzy
+#~ msgid "E856: Filename too long"
+#~ msgstr "E75: Naam te lank"
+
+#~ msgid "E806: using Float as a String"
+#~ msgstr ""
-#: ../globals.h:1114
msgid "search hit TOP, continuing at BOTTOM"
msgstr "soektog het BO getref, gaan voort van ONDER af"
-#: ../globals.h:1115
msgid "search hit BOTTOM, continuing at TOP"
msgstr "soektog het ONDER getref, gaan voort van BO af"
-#: ../hardcopy.c:240
msgid "E550: Missing colon"
msgstr "E550: Ontbrekende dubbelpunt"
-#: ../hardcopy.c:252
msgid "E551: Illegal component"
msgstr "E551: Ongeldige komponent"
-#: ../hardcopy.c:259
msgid "E552: digit expected"
msgstr "E552: syfer verwag"
-#: ../hardcopy.c:473
#, c-format
msgid "Page %d"
msgstr "Bladsy %d"
-#: ../hardcopy.c:597
msgid "No text to be printed"
msgstr "Geen teks om te druk nie"
-#: ../hardcopy.c:668
-#, c-format
-msgid "Printing page %d (%d%%)"
-msgstr "Druk nou bladsy %d (%d%%)"
+#, fuzzy, c-format
+#~ msgid "Printing page %d (%zu%%)"
+#~ msgstr "Druk nou bladsy %d (%d%%)"
-#: ../hardcopy.c:680
#, c-format
msgid " Copy %d of %d"
msgstr " Kopie %d van %d"
-#: ../hardcopy.c:733
#, c-format
msgid "Printed: %s"
msgstr "Gedruk: %s"
-#: ../hardcopy.c:740
msgid "Printing aborted"
msgstr "Drukkery gestaak"
-#: ../hardcopy.c:1365
msgid "E455: Error writing to PostScript output file"
msgstr "E455: Kan nie na 'PostScript' afvoerl๊er skryf nie"
-#: ../hardcopy.c:1747
#, c-format
msgid "E624: Can't open file \"%s\""
msgstr "E624: Kan nie l๊er \"%s\" oopmaak nie"
-#: ../hardcopy.c:1756 ../hardcopy.c:2470
#, c-format
msgid "E457: Can't read PostScript resource file \"%s\""
msgstr "E457: Kan nie 'PostScript' hulpbron-l๊er \"%s\" lees nie"
-#: ../hardcopy.c:1772
#, c-format
msgid "E618: file \"%s\" is not a PostScript resource file"
msgstr "E618: L๊er \"%s\" is nie 'n 'PostScript' hulpbron-l๊er nie"
-#: ../hardcopy.c:1788 ../hardcopy.c:1805 ../hardcopy.c:1844
#, c-format
msgid "E619: file \"%s\" is not a supported PostScript resource file"
msgstr ""
"E619: L๊er \"%s\" is nie 'n ondersteunde 'PostScript' hulpbron-l๊er nie"
-#: ../hardcopy.c:1856
#, c-format
msgid "E621: \"%s\" resource file has wrong version"
msgstr "E621: \"%s\" die hulpbron l๊er het die verkeerde weergawe"
-#: ../hardcopy.c:2225
-msgid "E673: Incompatible multi-byte encoding and character set."
-msgstr ""
+#~ msgid "E673: Incompatible multi-byte encoding and character set."
+#~ msgstr ""
-#: ../hardcopy.c:2238
-msgid "E674: printmbcharset cannot be empty with multi-byte encoding."
-msgstr ""
+#~ msgid "E674: printmbcharset cannot be empty with multi-byte encoding."
+#~ msgstr ""
-#: ../hardcopy.c:2254
-msgid "E675: No default font specified for multi-byte printing."
-msgstr ""
+#~ msgid "E675: No default font specified for multi-byte printing."
+#~ msgstr ""
-#: ../hardcopy.c:2426
msgid "E324: Can't open PostScript output file"
msgstr "E324: Kan nie 'PostScript' afvoerl๊er oopmaak nie"
-#: ../hardcopy.c:2458
#, c-format
msgid "E456: Can't open file \"%s\""
msgstr "E456: Kan nie l๊er %s oopmaak nie"
-#: ../hardcopy.c:2583
msgid "E456: Can't find PostScript resource file \"prolog.ps\""
msgstr "E456: Kan nie 'PostScript' hulpbron-l๊er \"prolog.ps\" lees nie"
-#: ../hardcopy.c:2593
#, fuzzy
-msgid "E456: Can't find PostScript resource file \"cidfont.ps\""
-msgstr "E456: Kan nie 'PostScript' hulpbron-l๊er \"%s\" vind nie"
+#~ msgid "E456: Can't find PostScript resource file \"cidfont.ps\""
+#~ msgstr "E456: Kan nie 'PostScript' hulpbron-l๊er \"%s\" vind nie"
-#: ../hardcopy.c:2622 ../hardcopy.c:2639 ../hardcopy.c:2665
#, c-format
msgid "E456: Can't find PostScript resource file \"%s.ps\""
msgstr "E456: Kan nie 'PostScript' hulpbron-l๊er \"%s\" vind nie"
-#: ../hardcopy.c:2654
#, fuzzy, c-format
-msgid "E620: Unable to convert to print encoding \"%s\""
-msgstr "E620: Kon nie van wye-greep na \"%s\" enkodering verander nie"
+#~ msgid "E620: Unable to convert to print encoding \"%s\""
+#~ msgstr "E620: Kon nie van wye-greep na \"%s\" enkodering verander nie"
-#: ../hardcopy.c:2877
msgid "Sending to printer..."
msgstr "Besig om te stuur na drukker..."
-#: ../hardcopy.c:2881
msgid "E365: Failed to print PostScript file"
msgstr "E365: Kon nie 'PostScript' l๊er druk nie"
-#: ../hardcopy.c:2883
msgid "Print job sent."
msgstr "Druktaak gestuur."
-#: ../if_cscope.c:85
msgid "Add a new database"
msgstr "Voeg 'n nuwe databasis by"
-#: ../if_cscope.c:87
msgid "Query for a pattern"
msgstr "Soek vir 'n patroon"
-#: ../if_cscope.c:89
msgid "Show this message"
msgstr "Wys hierdie boodskap"
-#: ../if_cscope.c:91
msgid "Kill a connection"
msgstr "Sluit 'n verbinding"
-#: ../if_cscope.c:93
msgid "Reinit all connections"
msgstr "Herstel alle verbindings"
-#: ../if_cscope.c:95
msgid "Show connections"
msgstr "Wys verbindings"
-#: ../if_cscope.c:101
#, c-format
msgid "E560: Usage: cs[cope] %s"
msgstr "E560: Gebruik: cs[cope] %s"
-#: ../if_cscope.c:225
msgid "This cscope command does not support splitting the window.\n"
msgstr ""
"Hierdie 'cscope' bevel ondersteun nie die splitsing van die venster nie.\n"
-#: ../if_cscope.c:266
msgid "E562: Usage: cstag <ident>"
msgstr "E562: Gebruik: 'cstag <ident>'"
-#: ../if_cscope.c:313
msgid "E257: cstag: tag not found"
msgstr "E257: 'cstag': etiket nie gevind nie"
-#: ../if_cscope.c:461
#, c-format
msgid "E563: stat(%s) error: %d"
msgstr "E563: 'stat(%s)' fout: %d"
-#: ../if_cscope.c:551
#, c-format
msgid "E564: %s is not a directory or a valid cscope database"
msgstr "E564: %s is nie 'n gids of 'n geldige 'cscope' databasis nie"
-#: ../if_cscope.c:566
#, c-format
msgid "Added cscope database %s"
msgstr "'cscope' databasis %s bygevoeg"
-#: ../if_cscope.c:616
-#, c-format
-msgid "E262: error reading cscope connection %<PRId64>"
-msgstr "E262: 'cscope' verbinding %<PRId64> kon nie gelees word nie"
+#, fuzzy, c-format
+#~ msgid "E262: error reading cscope connection %<PRIu64>"
+#~ msgstr "E262: 'cscope' verbinding %<PRId64> kon nie gelees word nie"
-#: ../if_cscope.c:711
msgid "E561: unknown cscope search type"
msgstr "E561: onbekende 'cscope' soektipe"
-#: ../if_cscope.c:752 ../if_cscope.c:789
msgid "E566: Could not create cscope pipes"
msgstr "E566: Kon nie 'cscope' pype skep nie"
-#: ../if_cscope.c:767
msgid "E622: Could not fork for cscope"
msgstr "E622: Kon nie vurk vir 'cscope' nie"
-#: ../if_cscope.c:849
#, fuzzy
-msgid "cs_create_connection setpgid failed"
-msgstr "'cs_create_connection' uitvoering het misluk"
+#~ msgid "cs_create_connection setpgid failed"
+#~ msgstr "'cs_create_connection' uitvoering het misluk"
-#: ../if_cscope.c:853 ../if_cscope.c:889
msgid "cs_create_connection exec failed"
msgstr "'cs_create_connection' uitvoering het misluk"
-#: ../if_cscope.c:863 ../if_cscope.c:902
msgid "cs_create_connection: fdopen for to_fp failed"
msgstr "'cs_create_connection': 'fdopen' vir 'to_fp' het misluk"
-#: ../if_cscope.c:865 ../if_cscope.c:906
msgid "cs_create_connection: fdopen for fr_fp failed"
msgstr "'cs_create_connection': 'fdopen' vir 'fr_fp' het misluk"
-#: ../if_cscope.c:890
msgid "E623: Could not spawn cscope process"
msgstr "E623: Kon nie 'cscope' proses skep nie"
-#: ../if_cscope.c:932
msgid "E567: no cscope connections"
msgstr "E567: geen 'cscope' verbindings nie"
-#: ../if_cscope.c:1009
#, c-format
msgid "E469: invalid cscopequickfix flag %c for %c"
msgstr "E469: ongeldige 'cscopequickfix' vlag %c vir %c"
-#: ../if_cscope.c:1058
#, c-format
msgid "E259: no matches found for cscope query %s of %s"
msgstr "E259: geen treffers gevind vir 'cscope' versoek %s van %s nie"
-#: ../if_cscope.c:1142
msgid "cscope commands:\n"
msgstr "'cscope' bevele:\n"
-#: ../if_cscope.c:1150
#, fuzzy, c-format
-msgid "%-5s: %s%*s (Usage: %s)"
-msgstr "%-5s: %-30s: (Gebruik: %s)"
+#~ msgid "%-5s: %s%*s (Usage: %s)"
+#~ msgstr "%-5s: %-30s: (Gebruik: %s)"
-#: ../if_cscope.c:1155
-msgid ""
-"\n"
-" c: Find functions calling this function\n"
-" d: Find functions called by this function\n"
-" e: Find this egrep pattern\n"
-" f: Find this file\n"
-" g: Find this definition\n"
-" i: Find files #including this file\n"
-" s: Find this C symbol\n"
-" t: Find this text string\n"
-msgstr ""
+#~ msgid ""
+#~ "\n"
+#~ " a: Find assignments to this symbol\n"
+#~ " c: Find functions calling this function\n"
+#~ " d: Find functions called by this function\n"
+#~ " e: Find this egrep pattern\n"
+#~ " f: Find this file\n"
+#~ " g: Find this definition\n"
+#~ " i: Find files #including this file\n"
+#~ " s: Find this C symbol\n"
+#~ " t: Find this text string\n"
+#~ msgstr ""
-#: ../if_cscope.c:1226
msgid "E568: duplicate cscope database not added"
msgstr "E568: duplikaat 'cscope' databasis nie bygevoeg nie"
-#: ../if_cscope.c:1335
#, c-format
msgid "E261: cscope connection %s not found"
msgstr "E261: 'cscope' verbinding %s nie gevind nie"
-#: ../if_cscope.c:1364
#, c-format
msgid "cscope connection %s closed"
msgstr "'cscope' verbinding %s gesluit"
#. should not reach here
-#: ../if_cscope.c:1486
msgid "E570: fatal error in cs_manage_matches"
msgstr "E570: fatale fout in 'cs_manage_matches'"
-#: ../if_cscope.c:1693
#, c-format
msgid "Cscope tag: %s"
msgstr "Cscope etiket: %s"
-#: ../if_cscope.c:1711
+#. Column headers for match number, line number and filename.
msgid ""
"\n"
" # line"
@@ -3316,329 +3023,314 @@ msgstr ""
"\n"
" # re๋l"
-#: ../if_cscope.c:1713
msgid "filename / context / line\n"
msgstr "l๊ernaam / konteks / re๋l\n"
-#: ../if_cscope.c:1809
#, c-format
msgid "E609: Cscope error: %s"
msgstr "E609: Cscope fout: %s"
-#: ../if_cscope.c:2053
msgid "All cscope databases reset"
msgstr "Alle 'cscope' databasisse herstel"
-#: ../if_cscope.c:2123
msgid "no cscope connections\n"
msgstr "geen 'cscope' verbindings nie\n"
-#: ../if_cscope.c:2126
msgid " # pid database name prepend path\n"
msgstr " # pid databasis naam gidsvoorvoegsel\n"
-#: ../main.c:144
-#, fuzzy
-msgid "Unknown option argument"
-msgstr "Onbekende opsie"
+#, c-format
+#~ msgid "E1502: Lua failed to grow stack to %i"
+#~ msgstr ""
-#: ../main.c:146
-msgid "Too many edit arguments"
-msgstr "Te veel redigeer-parameters"
+#~ msgid ""
+#~ "E5100: Cannot convert given lua table: table should either have a sequence "
+#~ "of positive integer keys or contain only string keys"
+#~ msgstr ""
+
+#~ msgid "E5101: Cannot convert given lua type"
+#~ msgstr ""
+
+#, c-format
+#~ msgid "E5102: Lua failed to grow stack to %i"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "E5104: Error while creating lua chunk: %.*s"
+#~ msgstr "E47: Fout tydens lees van 'errorfile'"
+
+#, fuzzy, c-format
+#~ msgid "E5105: Error while calling lua chunk: %.*s"
+#~ msgstr "E47: Fout tydens lees van 'errorfile'"
+
+#, fuzzy, c-format
+#~ msgid "E5109: Error while creating lua chunk: %.*s"
+#~ msgstr "E47: Fout tydens lees van 'errorfile'"
+
+#, fuzzy, c-format
+#~ msgid "E5110: Error while creating lua function: %.*s"
+#~ msgstr "E47: Fout tydens lees van 'errorfile'"
+
+#, fuzzy, c-format
+#~ msgid "E5111: Error while calling lua function: %.*s"
+#~ msgstr "E47: Fout tydens lees van 'errorfile'"
+
+#, fuzzy, c-format
+#~ msgid "E5112: Error while creating lua chunk: %.*s"
+#~ msgstr "E47: Fout tydens lees van 'errorfile'"
+
+#, fuzzy, c-format
+#~ msgid "E5113: Error while calling lua chunk: %.*s"
+#~ msgstr "E47: Fout tydens lees van 'errorfile'"
+
+#, fuzzy, c-format
+#~ msgid "E5106: Error while creating vim module: %.*s"
+#~ msgstr "E47: Fout tydens lees van 'errorfile'"
-#: ../main.c:148
+#~ msgid "E970: Failed to initialize lua interpreter"
+#~ msgstr ""
+
+#. stack: vim, error
+#, fuzzy, c-format
+#~ msgid "E5117: Error while updating package paths: %.*s"
+#~ msgstr "E47: Fout tydens lees van 'errorfile'"
+
+#, fuzzy, c-format
+#~ msgid "E5107: Error while creating lua chunk for luaeval(): %.*s"
+#~ msgstr "E47: Fout tydens lees van 'errorfile'"
+
+#, fuzzy, c-format
+#~ msgid "E5108: Error while calling lua chunk for luaeval(): %.*s"
+#~ msgstr "E47: Fout tydens lees van 'errorfile'"
+
+#, c-format
+#~ msgid "E5114: Error while converting print argument #%i: %.*s"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "E5115: Error while loading debug string: %.*s"
+#~ msgstr "E47: Fout tydens lees van 'errorfile'"
+
+#, fuzzy, c-format
+#~ msgid "E5116: Error while calling debug string: %.*s"
+#~ msgstr "E47: Fout tydens lees van 'errorfile'"
+
+msgid "cannot save undo information"
+msgstr "kan nie herwin-inligting stoor nie"
+
+#. Error messages
msgid "Argument missing after"
msgstr "Parameter ontbreek na"
-#: ../main.c:150
#, fuzzy
-msgid "Garbage after option argument"
-msgstr "Gemors na opsie"
+#~ msgid "Garbage after option argument"
+#~ msgstr "Gemors na opsie"
+
+#, fuzzy
+#~ msgid "Unknown option argument"
+#~ msgstr "Onbekende opsie"
+
+msgid "Too many edit arguments"
+msgstr "Te veel redigeer-parameters"
-#: ../main.c:152
msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"
msgstr "Te veel \"+command\", \"-c command\" of \"--cmd command\" parameters"
-#: ../main.c:154
-msgid "Invalid argument for"
-msgstr "Ongeldige parameter vir"
-
-#: ../main.c:294
-#, c-format
-msgid "%d files to edit\n"
-msgstr "%d l๊ers om te bewerk\n"
+#, fuzzy, c-format
+#~ msgid "E5421: Failed to open stdin: %s"
+#~ msgstr "E286: Gefaal om invoermetode oop te maak"
-#: ../main.c:1342
msgid "Attempt to open script file again: \""
msgstr "Probeer weer om skripl๊er oop te maak: \""
-#: ../main.c:1350
msgid "Cannot open for reading: \""
msgstr "Kan nie oopmaak om te lees nie: \""
-#: ../main.c:1393
msgid "Cannot open for script output: \""
msgstr "Kan nie oopmaak vir skrip-afvoer nie: \""
-#: ../main.c:1622
msgid "Vim: Warning: Output is not to a terminal\n"
msgstr "Vim: Waarskuwing: Afvoer gaan nie na 'n terminaal nie\n"
-#: ../main.c:1624
msgid "Vim: Warning: Input is not from a terminal\n"
msgstr "Vim: Waarskuwing: Invoer kom nie vanaf 'n terminaal nie\n"
#. just in case..
-#: ../main.c:1891
msgid "pre-vimrc command line"
msgstr "v๓๓r-'vimrc' bevelre๋l"
-#: ../main.c:1964
#, c-format
msgid "E282: Cannot read from \"%s\""
msgstr "E282: Kan nie lees uit \"%s\" nie"
-#: ../main.c:2149
+#, fuzzy
msgid ""
"\n"
-"More info with: \"vim -h\"\n"
+"More info with \""
msgstr ""
"\n"
"Meer inligting met: \"vim -h\"\n"
-#: ../main.c:2178
-msgid "[file ..] edit specified file(s)"
-msgstr "[l๊er ..] bewerk l๊er(s)"
-
-#: ../main.c:2179
-msgid "- read text from stdin"
-msgstr "- lees teks uit 'stdin'"
-
-#: ../main.c:2180
-msgid "-t tag edit file where tag is defined"
-msgstr "-t tag bewerk l๊er waar etiket gedefinieer is"
+#. kill us with CTRL-C here, if you like
+#, fuzzy
+#~ msgid "Usage:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ "gebruik:"
-#: ../main.c:2181
-msgid "-q [errorfile] edit file with first error"
-msgstr "-q [foutl๊er] bewerk l๊er met eerste fout"
+#, fuzzy
+#~ msgid " nvim [options] [file ...] Edit file(s)\n"
+#~ msgstr "[l๊er ..] bewerk l๊er(s)"
-#: ../main.c:2187
-msgid ""
-"\n"
-"\n"
-"usage:"
-msgstr ""
-"\n"
-"\n"
-"gebruik:"
+#, fuzzy
+#~ msgid " nvim [options] - Read text from stdin\n"
+#~ msgstr "- lees teks uit 'stdin'"
-#: ../main.c:2189
-msgid " vim [arguments] "
-msgstr " vim [parameters] "
+#, fuzzy
+#~ msgid " nvim [options] -t <tag> Edit file where tag is defined\n"
+#~ msgstr "-t tag bewerk l๊er waar etiket gedefinieer is"
-#: ../main.c:2193
-msgid ""
-"\n"
-" or:"
-msgstr ""
-"\n"
-" of:"
+#, fuzzy
+#~ msgid " nvim [options] -q [errorfile] Edit file with first error\n"
+#~ msgstr "-q [foutl๊er] bewerk l๊er met eerste fout"
-#: ../main.c:2196
+#, fuzzy
msgid ""
"\n"
-"\n"
-"Arguments:\n"
+"Options:\n"
msgstr ""
"\n"
-"\n"
-"Parameters:\n"
-
-#: ../main.c:2197
-msgid "--\t\t\tOnly file names after this"
-msgstr "--\t\t\tSlegs l๊ername hierna"
-
-#: ../main.c:2199
-msgid "--literal\t\tDon't expand wildcards"
-msgstr "--literal\t\tMoet nie plekhouers uitbrei nie"
-
-#: ../main.c:2201
-msgid "-v\t\t\tVi mode (like \"vi\")"
-msgstr "-v\t\t\tVi modus (soos \"vi\")"
-
-#: ../main.c:2202
-msgid "-e\t\t\tEx mode (like \"ex\")"
-msgstr "-e\t\t\tEx modus (soos \"ex\")"
-
-#: ../main.c:2203
-msgid "-E\t\t\tImproved Ex mode"
-msgstr ""
-
-#: ../main.c:2204
-msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")"
-msgstr "-s\t\t\tStil (bondel) modus (slegs vir \"ex\")"
-
-#: ../main.c:2205
-msgid "-d\t\t\tDiff mode (like \"vimdiff\")"
-msgstr "-d\t\t\tDiff modus (soos \"vimdiff\")"
-
-#: ../main.c:2206
-msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
-msgstr "-y\t\t\tEasy modus (soos \"evim\", modusloos)"
-
-#: ../main.c:2207
-msgid "-R\t\t\tReadonly mode (like \"view\")"
-msgstr "-R\t\t\tLeesalleen modus (soos \"view\")"
-
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tBeperkte modus (soos \"rvim\")"
+"--- Opsies ---"
-#: ../main.c:2209
-msgid "-m\t\t\tModifications (writing files) not allowed"
-msgstr "-m\t\t\tVeranderings (skryf van l๊ers) nie toegelaat nie"
+#, fuzzy
+#~ msgid " -- Only file names after this\n"
+#~ msgstr "--\t\t\tSlegs l๊ername hierna"
-#: ../main.c:2210
-msgid "-M\t\t\tModifications in text not allowed"
-msgstr "-M\t\t\tVeranderings aan teks nie toegelaat nie"
+#, fuzzy
+#~ msgid " + Start at end of file\n"
+#~ msgstr " vir twee modusse "
-#: ../main.c:2211
-msgid "-b\t\t\tBinary mode"
-msgstr "-b\t\t\tBin๊re modus"
+#, fuzzy
+#~ msgid " --cmd <cmd> Execute <cmd> before any config\n"
+#~ msgstr "--cmd <bevel>\tVoer <bevel> uit voor enige .vimrc-l๊er gelaai word"
-#: ../main.c:2212
-msgid "-l\t\t\tLisp mode"
-msgstr "-l\t\t\tLisp modus"
+#, fuzzy
+#~ msgid " +<cmd>, -c <cmd> Execute <cmd> after config and first file\n"
+#~ msgstr "-c <bevel>\t\tVoer <bevel> uit na eerste l๊er gelaai is"
-#: ../main.c:2213
-msgid "-C\t\t\tCompatible with Vi: 'compatible'"
-msgstr "-C\t\t\tVersoenbaar met Vi: 'compatible'"
+#, fuzzy
+#~ msgid " -b Binary mode\n"
+#~ msgstr " vir twee modusse "
-#: ../main.c:2214
-msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'"
-msgstr "-N\t\t\tNie ten volle Vi-versoenbaar nie: 'nocompatible'"
+#, fuzzy
+#~ msgid " -d Diff mode\n"
+#~ msgstr " vir twee modusse "
-#: ../main.c:2215
-msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]"
-msgstr ""
+#~ msgid " -e, -E Ex mode, Improved Ex mode\n"
+#~ msgstr ""
-#: ../main.c:2216
-msgid "-D\t\t\tDebugging mode"
-msgstr "-D\t\t\tOntfoutmodus"
+#, fuzzy
+#~ msgid " -es Silent (batch) mode\n"
+#~ msgstr " vir twee modusse "
-#: ../main.c:2217
-msgid "-n\t\t\tNo swap file, use memory only"
-msgstr "-n\t\t\tGeen ruill๊er, gebruik slegs geheue"
+#~ msgid " -h, --help Print this help message\n"
+#~ msgstr ""
-#: ../main.c:2218
-msgid "-r\t\t\tList swap files and exit"
-msgstr "-r\t\t\tLys ruill๊ers en verlaat vim"
+#~ msgid " -i <shada> Use this shada file\n"
+#~ msgstr ""
-#: ../main.c:2219
-msgid "-r (with file name)\tRecover crashed session"
-msgstr "-r (met l๊er naam)\tHerwin ineengestorte sessie"
+#, fuzzy
+#~ msgid " -m Modifications (writing files) not allowed\n"
+#~ msgstr "-m\t\t\tVeranderings (skryf van l๊ers) nie toegelaat nie"
-#: ../main.c:2220
-msgid "-L\t\t\tSame as -r"
-msgstr "-L\t\t\tSelfde as -r"
+#, fuzzy
+#~ msgid " -M Modifications in text not allowed\n"
+#~ msgstr "-M\t\t\tVeranderings aan teks nie toegelaat nie"
-#: ../main.c:2221
-msgid "-A\t\t\tstart in Arabic mode"
-msgstr "-A\t\t\tbegin in Arabiese modus"
+#, fuzzy
+#~ msgid " -n No swap file, use memory only\n"
+#~ msgstr "-n\t\t\tGeen ruill๊er, gebruik slegs geheue"
-#: ../main.c:2222
-msgid "-H\t\t\tStart in Hebrew mode"
-msgstr "-H\t\t\tBegin in Hebreeuse modus"
+#, fuzzy
+#~ msgid " -o[N] Open N windows (default: one per file)\n"
+#~ msgstr "-o[N]\t\tMaak N vensters oop (verstek: een vir elke l๊er)"
-#: ../main.c:2223
-msgid "-F\t\t\tStart in Farsi mode"
-msgstr "-F\t\t\tBegin in Farsi modus"
+#, fuzzy
+msgid ""
+" -O[N] Open N vertical windows (default: one per file)\n"
+msgstr "-o[N]\t\tMaak N vensters oop (verstek: een vir elke l๊er)"
-#: ../main.c:2224
-msgid "-T <terminal>\tSet terminal type to <terminal>"
-msgstr "-T <terminaal>\tStel terminaaltipe na <terminaal>"
+#, fuzzy
+#~ msgid " -p[N] Open N tab pages (default: one per file)\n"
+#~ msgstr "-o[N]\t\tMaak N vensters oop (verstek: een vir elke l๊er)"
-#: ../main.c:2225
-msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc"
-msgstr "-u <vimrc>\t\tGebruik <vimrc> in plaas van enige ander .vimrc"
+#~ msgid " -r, -L List swap files\n"
+#~ msgstr ""
-#: ../main.c:2226
-msgid "--noplugin\t\tDon't load plugin scripts"
-msgstr "--noplugin\t\tMoet nie inpropskripte laai nie"
+#~ msgid " -r <file> Recover edit state for this file\n"
+#~ msgstr ""
-#: ../main.c:2227
#, fuzzy
-msgid "-p[N]\t\tOpen N tab pages (default: one for each file)"
-msgstr "-o[N]\t\tMaak N vensters oop (verstek: een vir elke l๊er)"
-
-#: ../main.c:2228
-msgid "-o[N]\t\tOpen N windows (default: one for each file)"
-msgstr "-o[N]\t\tMaak N vensters oop (verstek: een vir elke l๊er)"
+#~ msgid " -R Read-only mode\n"
+#~ msgstr " vir twee modusse "
-#: ../main.c:2229
-msgid "-O[N]\t\tLike -o but split vertically"
-msgstr "-O[N]\t\tSoos -o maar verdeel vertikaal"
+#, fuzzy
+#~ msgid " -S <session> Source <session> after loading the first file\n"
+#~ msgstr ""
+#~ "-S <sessie>\t\tVoer bevele in l๊er <sessie> uit na eerste l๊er gelaai is"
-#: ../main.c:2230
-msgid "+\t\t\tStart at end of file"
-msgstr "+\t\t\tBegin by einde van l๊er"
+#, fuzzy
+#~ msgid " -s <scriptin> Read Normal mode commands from <scriptin>\n"
+#~ msgstr "-s <skripin>\t\tLees Normale-modus bevele van l๊er <skripin>"
-#: ../main.c:2231
-msgid "+<lnum>\t\tStart at line <lnum>"
-msgstr "+<lnum>\t\tBegin by re๋l <lnum>"
+#~ msgid " -u <config> Use this config file\n"
+#~ msgstr ""
-#: ../main.c:2232
-msgid "--cmd <command>\tExecute <command> before loading any vimrc file"
-msgstr "--cmd <bevel>\tVoer <bevel> uit voor enige .vimrc-l๊er gelaai word"
+#, fuzzy
+#~ msgid " -v, --version Print version information\n"
+#~ msgstr "--version\t\tSkryf weergawe-inligting en sluit"
-#: ../main.c:2233
-msgid "-c <command>\t\tExecute <command> after loading the first file"
-msgstr "-c <bevel>\t\tVoer <bevel> uit na eerste l๊er gelaai is"
+#~ msgid " -V[N][file] Verbose [level][file]\n"
+#~ msgstr ""
-#: ../main.c:2235
-msgid "-S <session>\t\tSource file <session> after loading the first file"
-msgstr ""
-"-S <sessie>\t\tVoer bevele in l๊er <sessie> uit na eerste l๊er gelaai is"
+#, fuzzy
+#~ msgid " -Z Restricted mode\n"
+#~ msgstr " vir twee modusse "
-#: ../main.c:2236
-msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>"
-msgstr "-s <skripin>\t\tLees Normale-modus bevele van l๊er <skripin>"
+#~ msgid " --api-info Write msgpack-encoded API metadata to stdout\n"
+#~ msgstr ""
-#: ../main.c:2237
-msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>"
-msgstr "-w <skripuit>\tLas alle getikte bevele aan by l๊er <skripuit>"
+#~ msgid " --embed Use stdin/stdout as a msgpack-rpc channel\n"
+#~ msgstr ""
-#: ../main.c:2238
-msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>"
-msgstr "-W <skripuit>\tSkryf alle getikte bevele na l๊er <skripuit>"
+#~ msgid " --headless Don't start a user interface\n"
+#~ msgstr ""
-#: ../main.c:2240
-msgid "--startuptime <file>\tWrite startup timing messages to <file>"
-msgstr ""
+#, fuzzy
+#~ msgid " --literal Don't expand wildcards\n"
+#~ msgstr "--literal\t\tMoet nie plekhouers uitbrei nie"
-#: ../main.c:2242
-msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
-msgstr "-i <viminfo>\t\tGebruik <viminfo> in plaas van .viminfo"
+#, fuzzy
+#~ msgid " --noplugin Don't load plugins\n"
+#~ msgstr "--noplugin\t\tMoet nie inpropskripte laai nie"
-#: ../main.c:2243
-msgid "-h or --help\tPrint Help (this message) and exit"
-msgstr "-h of --help\tSkryf Hulp (hierdie boodskap) en sluit"
+#~ msgid " --startuptime <file> Write startup timing messages to <file>\n"
+#~ msgstr ""
-#: ../main.c:2244
-msgid "--version\t\tPrint version information and exit"
-msgstr "--version\t\tSkryf weergawe-inligting en sluit"
+#~ msgid ""
+#~ "\n"
+#~ "See \":help startup-options\" for all options.\n"
+#~ msgstr ""
-#: ../mark.c:676
msgid "No marks set"
msgstr "Geen merkers gestel nie"
-#: ../mark.c:678
#, c-format
msgid "E283: No marks matching \"%s\""
msgstr "E283: Geen merkers pas op \"%s\" nie"
#. Highlight title
-#: ../mark.c:687
msgid ""
"\n"
"mark line col file/text"
@@ -3647,7 +3339,6 @@ msgstr ""
"merk re๋l kol l๊er/teks"
#. Highlight title
-#: ../mark.c:789
msgid ""
"\n"
" jump line col file/text"
@@ -3656,7 +3347,6 @@ msgstr ""
" spring re๋l kol l๊er/teks"
#. Highlight title
-#: ../mark.c:831
msgid ""
"\n"
"change line col text"
@@ -3664,110 +3354,63 @@ msgstr ""
"\n"
"verander re๋l kol teks"
-#: ../mark.c:1238
-msgid ""
-"\n"
-"# File marks:\n"
-msgstr ""
-"\n"
-"# L๊ermerkers:\n"
-
-#. Write the jumplist with -'
-#: ../mark.c:1271
-msgid ""
-"\n"
-"# Jumplist (newest first):\n"
-msgstr ""
-"\n"
-"# Springlys (nuutste eerste):\n"
-
-#: ../mark.c:1352
-msgid ""
-"\n"
-"# History of marks within files (newest to oldest):\n"
-msgstr ""
-"\n"
-"# Geskiedenis van merkers in l๊ers (nuutste tot oudste):\n"
-
-#: ../mark.c:1431
-msgid "Missing '>'"
-msgstr "Ontbrekende '>'"
-
-#: ../memfile.c:426
msgid "E293: block was not locked"
msgstr "E293: blok was nie gesluit nie"
-#: ../memfile.c:799
msgid "E294: Seek error in swap file read"
msgstr "E294: Soekfout in lees van ruill๊er"
-#: ../memfile.c:803
msgid "E295: Read error in swap file"
msgstr "E295: Leesfout in ruill๊er"
-#: ../memfile.c:849
msgid "E296: Seek error in swap file write"
msgstr "E296: Soekfout in skryf van ruill๊er"
-#: ../memfile.c:865
msgid "E297: Write error in swap file"
msgstr "E297: Skryffout in ruill๊er"
-#: ../memfile.c:1036
msgid "E300: Swap file already exists (symlink attack?)"
msgstr "E300: Ruill๊er bestaan alreeds! ('symlink' probleem?)"
-#: ../memline.c:318
msgid "E298: Didn't get block nr 0?"
msgstr "E298: Het nie blok no 0 gekry nie?"
-#: ../memline.c:361
msgid "E298: Didn't get block nr 1?"
msgstr "E298: Het nie blok no 1 gekry nie?"
-#: ../memline.c:377
msgid "E298: Didn't get block nr 2?"
msgstr "E298: Het nie blok no 2 gekry nie?"
#. could not (re)open the swap file, what can we do????
-#: ../memline.c:465
msgid "E301: Oops, lost the swap file!!!"
msgstr "E301: Hiert, die ruill๊er is weg!!!"
-#: ../memline.c:477
msgid "E302: Could not rename swap file"
msgstr "E302: Kon nie ruill๊er vernoem nie"
-#: ../memline.c:554
#, c-format
msgid "E303: Unable to open swap file for \"%s\", recovery impossible"
msgstr "E303: Kon nie ruill๊er oopmaak vir \"%s\" nie, herwinning onmoontlik"
-#: ../memline.c:666
#, fuzzy
-msgid "E304: ml_upd_block0(): Didn't get block 0??"
-msgstr "E304: 'ml_timestamp': Het nie blok 0 gekry nie??"
+#~ msgid "E304: ml_upd_block0(): Didn't get block 0??"
+#~ msgstr "E304: 'ml_timestamp': Het nie blok 0 gekry nie??"
#. no swap files found
-#: ../memline.c:830
#, c-format
msgid "E305: No swap file found for %s"
msgstr "E305: Geen ruill๊er gevind vir %s nie"
-#: ../memline.c:839
msgid "Enter number of swap file to use (0 to quit): "
msgstr "Tik die nommer van die ruill๊er om te gebruik (0 om te stop)"
-#: ../memline.c:879
#, c-format
msgid "E306: Cannot open %s"
msgstr "E306: Kan %s nie oopmaak nie"
-#: ../memline.c:897
msgid "Unable to read block 0 from "
msgstr "Kan nie blok 0 lees vanaf "
-#: ../memline.c:900
msgid ""
"\n"
"Maybe no changes were made or Vim did not update the swap file."
@@ -3775,28 +3418,22 @@ msgstr ""
"\n"
"Vim het die ruill๊er nie opgedateer nie. Dalk was niks verander nie."
-#: ../memline.c:909
msgid " cannot be used with this version of Vim.\n"
msgstr " kan nie gebruik word met hierdie weergawe van Vim nie.\n"
-#: ../memline.c:911
msgid "Use Vim version 3.0.\n"
msgstr "Gebruik Vim weergawe 3.0.\n"
-#: ../memline.c:916
#, c-format
msgid "E307: %s does not look like a Vim swap file"
msgstr "E307: %s lyk nie soos 'n Vim ruill๊er nie"
-#: ../memline.c:922
msgid " cannot be used on this computer.\n"
msgstr " kan nie gebruik word op hierdie rekenaar nie.\n"
-#: ../memline.c:924
msgid "The file was created on "
msgstr "Die l๊er is geskep op "
-#: ../memline.c:928
msgid ""
",\n"
"or the file has been damaged."
@@ -3804,85 +3441,66 @@ msgstr ""
",\n"
"of die l๊er is beskadig."
-#: ../memline.c:945
-msgid " has been damaged (page size is smaller than minimum value).\n"
-msgstr ""
+#~ msgid " has been damaged (page size is smaller than minimum value).\n"
+#~ msgstr ""
-#: ../memline.c:974
#, c-format
msgid "Using swap file \"%s\""
msgstr "Gebruik ruill๊er \"%s\""
-#: ../memline.c:980
#, c-format
msgid "Original file \"%s\""
msgstr "Oorspronklike l๊er \"%s\""
-#: ../memline.c:995
msgid "E308: Warning: Original file may have been changed"
msgstr "E308: Waarskuwing: Oorspronklike l๊er is dalk gewysig"
-#: ../memline.c:1061
#, c-format
msgid "E309: Unable to read block 1 from %s"
msgstr "E309: Kan nie block 1 lees van %s"
-#: ../memline.c:1065
msgid "???MANY LINES MISSING"
msgstr "???BAIE REหLS WEG"
-#: ../memline.c:1076
msgid "???LINE COUNT WRONG"
msgstr "???REหLTELLING FOUTIEF"
-#: ../memline.c:1082
msgid "???EMPTY BLOCK"
msgstr "???LEห BLOK"
-#: ../memline.c:1103
msgid "???LINES MISSING"
msgstr "???REหLS WEG"
-#: ../memline.c:1128
#, c-format
msgid "E310: Block 1 ID wrong (%s not a .swp file?)"
msgstr "E310: Blok 1 se ID is foutief (%s nie 'n .swp l๊er nie?)"
-#: ../memline.c:1133
msgid "???BLOCK MISSING"
msgstr "???BLOK WEG"
-#: ../memline.c:1147
msgid "??? from here until ???END lines may be messed up"
msgstr "??? van hier tot ???END mag re๋ls deurmekaar wees"
-#: ../memline.c:1164
msgid "??? from here until ???END lines may have been inserted/deleted"
msgstr "??? van hier tot ???END mag daar re๋ls ingevoeg/geskrap wees"
-#: ../memline.c:1181
msgid "???END"
msgstr "???END"
-#: ../memline.c:1238
msgid "E311: Recovery Interrupted"
msgstr "E311: Herwinning onderbreek"
-#: ../memline.c:1243
msgid ""
"E312: Errors detected while recovering; look for lines starting with ???"
msgstr ""
"E312: Foute raakgesien gedurende herwinning; soek vir re๋ls wat begin met ???"
-#: ../memline.c:1245
msgid "See \":help E312\" for more information."
msgstr "Sien \":help E312\" vir meer inligting."
-#: ../memline.c:1249
msgid "Recovery completed. You should check if everything is OK."
msgstr "Herwinning is klaar. Kyk of alles reg is."
-#: ../memline.c:1251
msgid ""
"\n"
"(You might want to write out this file under another name\n"
@@ -3890,16 +3508,13 @@ msgstr ""
"\n"
"(Jy wil dalk die l๊er stoor onder 'n ander naam\n"
-#: ../memline.c:1252
#, fuzzy
-msgid "and run diff with the original file to check for changes)"
-msgstr "en dit \"diff\" teen die oorspronklike l๊er om wysigings te soek)\n"
+#~ msgid "and run diff with the original file to check for changes)"
+#~ msgstr "en dit \"diff\" teen die oorspronklike l๊er om wysigings te soek)\n"
-#: ../memline.c:1254
-msgid "Recovery completed. Buffer contents equals file contents."
-msgstr ""
+#~ msgid "Recovery completed. Buffer contents equals file contents."
+#~ msgstr ""
-#: ../memline.c:1255
#, fuzzy
msgid ""
"\n"
@@ -3910,51 +3525,42 @@ msgstr ""
"\n"
#. use msg() to start the scrolling properly
-#: ../memline.c:1327
msgid "Swap files found:"
msgstr "Ruill๊ers gevind:"
-#: ../memline.c:1446
msgid " In current directory:\n"
msgstr " In huidige gids:\n"
-#: ../memline.c:1448
msgid " Using specified name:\n"
msgstr " Wat gespesifiseerde naam gebruik:\n"
-#: ../memline.c:1450
msgid " In directory "
msgstr " In gids "
-#: ../memline.c:1465
msgid " -- none --\n"
msgstr " -- geen --\n"
-#: ../memline.c:1527
msgid " owned by: "
msgstr " eienaar: "
-#: ../memline.c:1529
msgid " dated: "
msgstr " gedateer: "
-#: ../memline.c:1532 ../memline.c:3231
msgid " dated: "
msgstr " gedateer: "
-#: ../memline.c:1548
msgid " [from Vim version 3.0]"
msgstr " [van Vim weergawe 3.0]"
-#: ../memline.c:1550
msgid " [does not look like a Vim swap file]"
msgstr " [lyk nie soos 'n Vim ruill๊er nie]"
-#: ../memline.c:1552
+#~ msgid " [garbled strings (not nul terminated)]"
+#~ msgstr ""
+
msgid " file name: "
msgstr " l๊ernaam: "
-#: ../memline.c:1558
msgid ""
"\n"
" modified: "
@@ -3962,15 +3568,12 @@ msgstr ""
"\n"
" gewysig: "
-#: ../memline.c:1559
msgid "YES"
msgstr "JA"
-#: ../memline.c:1559
msgid "no"
msgstr "nee"
-#: ../memline.c:1562
msgid ""
"\n"
" user name: "
@@ -3978,11 +3581,9 @@ msgstr ""
"\n"
" gebruikersnaam: "
-#: ../memline.c:1568
msgid " host name: "
msgstr " gasheernaam: "
-#: ../memline.c:1570
msgid ""
"\n"
" host name: "
@@ -3990,7 +3591,6 @@ msgstr ""
"\n"
" gasheernaam: "
-#: ../memline.c:1575
msgid ""
"\n"
" process ID: "
@@ -3998,11 +3598,9 @@ msgstr ""
"\n"
" proses ID: "
-#: ../memline.c:1579
msgid " (still running)"
msgstr " (nog steeds aan die uitvoer)"
-#: ../memline.c:1586
msgid ""
"\n"
" [not usable on this computer]"
@@ -4010,97 +3608,75 @@ msgstr ""
"\n"
" [nie bruikbaar op hierdie rekenaar nie]"
-#: ../memline.c:1590
msgid " [cannot be read]"
msgstr " [kan nie gelees word nie]"
-#: ../memline.c:1593
msgid " [cannot be opened]"
msgstr " [kan nie oopgemaak word nie]"
-#: ../memline.c:1698
msgid "E313: Cannot preserve, there is no swap file"
msgstr "E313: Kan nie bewaar nie, daar is geen ruill๊er nie"
-#: ../memline.c:1747
msgid "File preserved"
msgstr "L๊er bewaar"
-#: ../memline.c:1749
msgid "E314: Preserve failed"
msgstr "E314: Kon nie bewaar nie"
-#: ../memline.c:1819
#, c-format
msgid "E315: ml_get: invalid lnum: %<PRId64>"
msgstr "E315: 'ml_get': ongeldige 'lnum': %<PRId64>"
-#: ../memline.c:1851
#, c-format
msgid "E316: ml_get: cannot find line %<PRId64>"
msgstr "E316: 'ml_get': kan re๋l %<PRId64> nie vind nie"
-#: ../memline.c:2236
msgid "E317: pointer block id wrong 3"
msgstr "E317: wyser blok id verkeerd 3"
-#: ../memline.c:2311
msgid "stack_idx should be 0"
msgstr "'stack_idx' moet 0 wees"
-#: ../memline.c:2369
msgid "E318: Updated too many blocks?"
msgstr "E318: Te veel blokke opgedateer?"
-#: ../memline.c:2511
msgid "E317: pointer block id wrong 4"
msgstr "E317: wyser blok id verkeerd 4"
-#: ../memline.c:2536
msgid "deleted block 1?"
msgstr "verwyder blok 1?"
-#: ../memline.c:2707
#, c-format
msgid "E320: Cannot find line %<PRId64>"
msgstr "E320: Kan nie re๋l %<PRId64> vind nie"
-#: ../memline.c:2916
msgid "E317: pointer block id wrong"
msgstr "E317: wyser blok id verkeerd"
-#: ../memline.c:2930
msgid "pe_line_count is zero"
msgstr "'pe_line_count' is nul"
-#: ../memline.c:2955
#, c-format
msgid "E322: line number out of range: %<PRId64> past the end"
msgstr "E322: re๋lnommer buite perke: %<PRId64> verby die einde"
-#: ../memline.c:2959
#, c-format
msgid "E323: line count wrong in block %<PRId64>"
msgstr "E323: re๋ltelling mag verkeerd wees in blok %<PRId64>"
-#: ../memline.c:2999
msgid "Stack size increases"
msgstr "Stapel grootte verhoog"
-#: ../memline.c:3038
msgid "E317: pointer block id wrong 2"
msgstr "E317: wyser blok id verkeerd 2"
-#: ../memline.c:3070
#, c-format
-msgid "E773: Symlink loop for \"%s\""
-msgstr ""
+#~ msgid "E773: Symlink loop for \"%s\""
+#~ msgstr ""
-#: ../memline.c:3221
msgid "E325: ATTENTION"
msgstr "E325: LET OP"
-#: ../memline.c:3222
msgid ""
"\n"
"Found a swap file by the name \""
@@ -4108,44 +3684,35 @@ msgstr ""
"\n"
"Het 'n ruill๊er gevind met die naam \""
-#: ../memline.c:3226
msgid "While opening file \""
msgstr "Tydens oopmaak van l๊er \""
-#: ../memline.c:3239
msgid " NEWER than swap file!\n"
msgstr " NUWER as die ruill๊er!\n"
-#: ../memline.c:3244
+#. Some of these messages are long to allow translation to
+#. * other languages.
#, fuzzy
msgid ""
"\n"
"(1) Another program may be editing the same file. If this is the case,\n"
" be careful not to end up with two different instances of the same\n"
-" file when making changes."
+" file when making changes. Quit, or continue with caution.\n"
msgstr ""
"\n"
"(1) 'n Ander program mag besig wees met hierdie l๊er.\n"
" Indien wel, pas op om nie met twee verskillende weergawes\n"
" van dieselfde l๊er te sit wanneer veranderinge gemaak word nie.\n"
-#: ../memline.c:3245
-#, fuzzy
-msgid " Quit, or continue with caution.\n"
-msgstr " Stop, of gaan versigtig voort.\n"
-
-#: ../memline.c:3246
#, fuzzy
-msgid "(2) An edit session for this file crashed.\n"
-msgstr ""
-"\n"
-"(2) 'n Bewerkingsessie van hierdie l๊er het ineengestort.\n"
+#~ msgid "(2) An edit session for this file crashed.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "(2) 'n Bewerkingsessie van hierdie l๊er het ineengestort.\n"
-#: ../memline.c:3247
msgid " If this is the case, use \":recover\" or \"vim -r "
msgstr " Indien wel, gebruik \":recover\" of \"vim -r"
-#: ../memline.c:3249
msgid ""
"\"\n"
" to recover the changes (see \":help recovery\").\n"
@@ -4153,11 +3720,9 @@ msgstr ""
"\"\n"
" om die veranderinge te herwin (sien \":help recovery\").\n"
-#: ../memline.c:3250
msgid " If you did this already, delete the swap file \""
msgstr " Indien jy dit alreeds gedoen het, verwyder die ruill๊er \""
-#: ../memline.c:3252
msgid ""
"\"\n"
" to avoid this message.\n"
@@ -4165,23 +3730,15 @@ msgstr ""
"\"\n"
" om hierdie boodskap te vermy.\n"
-#: ../memline.c:3450 ../memline.c:3452
msgid "Swap file \""
msgstr "Ruill๊er \""
-#: ../memline.c:3451 ../memline.c:3455
msgid "\" already exists!"
msgstr "\" bestaan alreeds!"
-#: ../memline.c:3457
msgid "VIM - ATTENTION"
msgstr "VIM - LET OP"
-#: ../memline.c:3459
-msgid "Swap file already exists!"
-msgstr "Ruill๊er bestaan alreeds!"
-
-#: ../memline.c:3464
msgid ""
"&Open Read-Only\n"
"&Edit anyway\n"
@@ -4195,7 +3752,6 @@ msgstr ""
"&Verlaat\n"
"&Stop"
-#: ../memline.c:3467
#, fuzzy
msgid ""
"&Open Read-Only\n"
@@ -4219,48 +3775,47 @@ msgstr ""
#.
#. ".s?a"
#. ".saa": tried enough, give up
-#: ../memline.c:3528
msgid "E326: Too many swap files found"
msgstr "E326: Te veel ruill๊ers gevind"
-#: ../memory.c:227
+#, fuzzy, c-format
+msgid ""
+"E303: Unable to create directory \"%s\" for swap file, recovery impossible: "
+"%s"
+msgstr "E303: Kon nie ruill๊er oopmaak vir \"%s\" nie, herwinning onmoontlik"
+
+#~ msgid "Vim: Data too large to fit into virtual memory space\n"
+#~ msgstr ""
+
#, c-format
msgid "E342: Out of memory! (allocating %<PRIu64> bytes)"
msgstr "E342: Geheue is op! (ken %<PRIu64> grepe toe)"
-#: ../menu.c:62
msgid "E327: Part of menu-item path is not sub-menu"
msgstr "E327: Deel van kieslys-item pad is nie 'n sub-kieslys nie"
-#: ../menu.c:63
msgid "E328: Menu only exists in another mode"
msgstr "E328: Kieslys bestaan slegs in 'n ander modus"
-#: ../menu.c:64
#, fuzzy, c-format
-msgid "E329: No menu \"%s\""
-msgstr "E329: Geen kieslys met daardie naam nie"
+#~ msgid "E329: No menu \"%s\""
+#~ msgstr "E329: Geen kieslys met daardie naam nie"
#. Only a mnemonic or accelerator is not valid.
-#: ../menu.c:329
-msgid "E792: Empty menu name"
-msgstr ""
+#~ msgid "E792: Empty menu name"
+#~ msgstr ""
-#: ../menu.c:340
msgid "E330: Menu path must not lead to a sub-menu"
msgstr "E330: Kieslyspad moenie lei na 'n sub-kieslys nie"
-#: ../menu.c:365
msgid "E331: Must not add menu items directly to menu bar"
msgstr "E331: Moenie kieslysitems direk by kieslysstaaf voeg nie"
-#: ../menu.c:370
msgid "E332: Separator cannot be part of a menu path"
msgstr "E332: Verdeler kan nie deel wees van kieslyspad nie"
#. Now we have found the matching menu, and we list the mappings
#. Highlight title
-#: ../menu.c:762
msgid ""
"\n"
"--- Menus ---"
@@ -4268,74 +3823,49 @@ msgstr ""
"\n"
"--- Kieslyste ---"
-#: ../menu.c:1313
msgid "E333: Menu path must lead to a menu item"
msgstr "E333: Kieslyspad moet lei na 'n kieslysitem"
-#: ../menu.c:1330
#, c-format
msgid "E334: Menu not found: %s"
msgstr "E334: Kieslys nie gevind nie: %s"
-#: ../menu.c:1396
#, c-format
msgid "E335: Menu not defined for %s mode"
msgstr "E335: Kieslys nie gedefinieer vir %s modus nie"
-#: ../menu.c:1426
-msgid "E336: Menu path must lead to a sub-menu"
-msgstr "E336: Kieslyspad moet lei na 'n sub-kieslys"
-
-#: ../menu.c:1447
-msgid "E337: Menu not found - check menu names"
-msgstr "E337: Kieslys nie gevind nie - maak seker oor die kieslys name"
-
-#: ../message.c:423
#, c-format
msgid "Error detected while processing %s:"
msgstr "Fout ontdek tydens verwerking van %s: "
-#: ../message.c:445
#, c-format
msgid "line %4ld:"
msgstr "re๋l %4ld:"
-#: ../message.c:617
#, c-format
msgid "E354: Invalid register name: '%s'"
msgstr "E354: Ongeldige registernaam: '%s'"
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr "Boodskappe onderhouers: Danie Roux en Jean Jordaan <droux@tuks.co.za>"
-
-#: ../message.c:986
msgid "Interrupt: "
msgstr "Onderbreek: "
-#: ../message.c:988
#, fuzzy
-msgid "Press ENTER or type command to continue"
-msgstr "Druk ENTER of tik 'n bevel om voort te gaan"
+#~ msgid "Press ENTER or type command to continue"
+#~ msgstr "Druk ENTER of tik 'n bevel om voort te gaan"
-#: ../message.c:1843
#, fuzzy, c-format
-msgid "%s line %<PRId64>"
-msgstr "%s, re๋l %<PRId64>"
+#~ msgid "%s line %<PRId64>"
+#~ msgstr "%s, re๋l %<PRId64>"
-#: ../message.c:2392
msgid "-- More --"
msgstr "-- Meer --"
-#: ../message.c:2398
-msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "
-msgstr ""
+#~ msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "
+#~ msgstr ""
-#: ../message.c:3021 ../message.c:3031
msgid "Question"
msgstr "Vraag"
-#: ../message.c:3023
msgid ""
"&Yes\n"
"&No"
@@ -4343,7 +3873,6 @@ msgstr ""
"&Ja\n"
"&Nee"
-#: ../message.c:3033
msgid ""
"&Yes\n"
"&No\n"
@@ -4353,7 +3882,6 @@ msgstr ""
"&Nee\n"
"&Kanselleer"
-#: ../message.c:3045
msgid ""
"&Yes\n"
"&No\n"
@@ -4367,180 +3895,131 @@ msgstr ""
"&Gooi alles weg\n"
"&Kanselleer"
-#: ../message.c:3058
-#, fuzzy
-msgid "E766: Insufficient arguments for printf()"
-msgstr "E116: Ongeldige parameters vir funksie %s"
-
-#: ../message.c:3119
-msgid "E807: Expected Float argument for printf()"
-msgstr ""
-
-#: ../message.c:3873
-#, fuzzy
-msgid "E767: Too many arguments to printf()"
-msgstr "E118: Te veel parameters vir funksie: %s"
-
-#: ../misc1.c:2256
msgid "W10: Warning: Changing a readonly file"
msgstr "W10: Waarskuwing: Jy wysig aan 'n leesalleen l๊er"
-#: ../misc1.c:2537
-msgid "Type number and <Enter> or click with mouse (empty cancels): "
-msgstr ""
+#~ msgid "Type number and <Enter> or click with mouse (empty cancels): "
+#~ msgstr ""
-#: ../misc1.c:2539
-msgid "Type number and <Enter> (empty cancels): "
-msgstr ""
+#~ msgid "Type number and <Enter> (empty cancels): "
+#~ msgstr ""
-#: ../misc1.c:2585
msgid "1 more line"
msgstr "1 re๋l meer"
-#: ../misc1.c:2588
msgid "1 line less"
msgstr "1 re๋l minder"
-#: ../misc1.c:2593
#, c-format
msgid "%<PRId64> more lines"
msgstr "%<PRId64> meer re๋ls"
-#: ../misc1.c:2596
#, c-format
msgid "%<PRId64> fewer lines"
msgstr "%<PRId64> minder re๋ls"
-#: ../misc1.c:2599
msgid " (Interrupted)"
msgstr " (Onderbreek)"
-#: ../misc1.c:2635
-msgid "Beep!"
-msgstr ""
+#~ msgid "Beep!"
+#~ msgstr ""
-#: ../misc2.c:738
#, c-format
msgid "Calling shell to execute: \"%s\""
msgstr "Roep dop om uit te voer: \"%s\""
-#: ../normal.c:183
+#.
+#. * nv_*(): functions called to handle Normal and Visual mode commands.
+#. * n_*(): functions called to handle Normal mode commands.
+#. * v_*(): functions called to handle Visual mode commands.
+#.
msgid "E349: No identifier under cursor"
msgstr "E349: Geen identifiseerder onder loper nie"
-#: ../normal.c:1866
#, fuzzy
-msgid "E774: 'operatorfunc' is empty"
-msgstr "E221: 'commentstring' opsie is leeg"
+#~ msgid "E774: 'operatorfunc' is empty"
+#~ msgstr "E221: 'commentstring' opsie is leeg"
-#: ../normal.c:2637
msgid "Warning: terminal cannot highlight"
msgstr "Waarskuwing: terminaal kan nie teks uitlig nie"
-#: ../normal.c:2807
msgid "E348: No string under cursor"
msgstr "E348: Geen string onder loper nie"
-#: ../normal.c:3937
msgid "E352: Cannot erase folds with current 'foldmethod'"
msgstr "E352: Kan nie voue verwyder met huidige 'foldmethod' nie"
-#: ../normal.c:5897
msgid "E664: changelist is empty"
msgstr "E664: 'changelist' is leeg"
-#: ../normal.c:5899
msgid "E662: At start of changelist"
msgstr "E662: By die begin van die veranderingslys"
-#: ../normal.c:5901
msgid "E663: At end of changelist"
msgstr "E663: By die einde van die veranderingslys"
-#: ../normal.c:7053
msgid "Type :quit<Enter> to exit Nvim"
msgstr "Tik :quit<Enter> om Vim te verlaat"
# Het te doen met < en >
-#: ../ops.c:248
#, c-format
msgid "1 line %sed 1 time"
msgstr "1 re๋l 1 keer ge-%s"
-#: ../ops.c:250
#, c-format
msgid "1 line %sed %d times"
msgstr "1 re๋l ge-%s %d keer"
-#: ../ops.c:253
#, c-format
msgid "%<PRId64> lines %sed 1 time"
msgstr "%<PRId64> re๋ls 1 keer ge-%s"
-#: ../ops.c:256
#, c-format
msgid "%<PRId64> lines %sed %d times"
msgstr "%<PRId64> re๋ls ge-%s %d keer"
-#: ../ops.c:592
#, c-format
msgid "%<PRId64> lines to indent... "
msgstr "%<PRId64> re๋ls om in te keep..."
-#: ../ops.c:634
msgid "1 line indented "
msgstr "1 re๋l ingekeep "
-#: ../ops.c:636
#, c-format
msgid "%<PRId64> lines indented "
msgstr "%<PRId64> re๋ls ingekeep "
-#: ../ops.c:938
#, fuzzy
-msgid "E748: No previously used register"
-msgstr "E186: Geen vorige gids nie"
-
-#. must display the prompt
-#: ../ops.c:1433
-msgid "cannot yank; delete anyway"
-msgstr "kan nie pluk nie: verwyder in elk geval"
+#~ msgid "E748: No previously used register"
+#~ msgstr "E186: Geen vorige gids nie"
-#: ../ops.c:1929
msgid "1 line changed"
msgstr "1 re๋l verander"
-#: ../ops.c:1931
#, c-format
msgid "%<PRId64> lines changed"
msgstr "%<PRId64> re๋ls verander"
-#: ../ops.c:2521
#, fuzzy
-msgid "block of 1 line yanked"
-msgstr "1 re๋l gepluk"
+#~ msgid "block of 1 line yanked"
+#~ msgstr "1 re๋l gepluk"
-#: ../ops.c:2523
msgid "1 line yanked"
msgstr "1 re๋l gepluk"
-#: ../ops.c:2525
#, fuzzy, c-format
-msgid "block of %<PRId64> lines yanked"
-msgstr "%<PRId64> re๋ls gepluk"
+#~ msgid "block of %<PRId64> lines yanked"
+#~ msgstr "%<PRId64> re๋ls gepluk"
-#: ../ops.c:2528
#, c-format
msgid "%<PRId64> lines yanked"
msgstr "%<PRId64> re๋ls gepluk"
-#: ../ops.c:2710
#, c-format
msgid "E353: Nothing in register %s"
msgstr "E353: Niks in register %s nie"
#. Highlight title
-#: ../ops.c:3185
msgid ""
"\n"
"--- Registers ---"
@@ -4548,29 +4027,15 @@ msgstr ""
"\n"
"--- Registers ---"
-#: ../ops.c:4455
-msgid "Illegal register name"
-msgstr "Ongeldige registernaam"
-
-#: ../ops.c:4533
-msgid ""
-"\n"
-"# Registers:\n"
-msgstr ""
-"\n"
-"# Registers:\n"
-
-#: ../ops.c:4575
-#, c-format
-msgid "E574: Unknown register type %d"
-msgstr "E574: Onbekende registertipe %d"
+#~ msgid ""
+#~ "E883: search pattern and expression register may not contain two or more "
+#~ "lines"
+#~ msgstr ""
-#: ../ops.c:5089
#, c-format
msgid "%<PRId64> Cols; "
msgstr "%<PRId64> Kolomme; "
-#: ../ops.c:5097
#, c-format
msgid ""
"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
@@ -4579,7 +4044,6 @@ msgstr ""
"%s%<PRId64> van %<PRId64> re๋ls gekies; %<PRId64> van %<PRId64> Woorde; "
"%<PRId64> van %<PRId64> Grepe"
-#: ../ops.c:5105
#, fuzzy, c-format
msgid ""
"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
@@ -4589,7 +4053,6 @@ msgstr ""
"%<PRId64> van %<PRId64> Grepe"
# njj: Karakters kan meerdere grepe wees, sien ':h multibyte'
-#: ../ops.c:5123
#, c-format
msgid ""
"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Byte "
@@ -4599,7 +4062,6 @@ msgstr ""
"Greep %<PRId64> van %<PRId64>"
# njj: Karakters kan meerdere grepe wees, sien ':h multibyte'
-#: ../ops.c:5133
#, fuzzy, c-format
msgid ""
"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Char "
@@ -4608,148 +4070,104 @@ msgstr ""
"Kol %s van %s; Re๋l %<PRId64> van %<PRId64>; Woord %<PRId64> van %<PRId64>; "
"Greep %<PRId64> van %<PRId64>"
-#: ../ops.c:5146
#, c-format
msgid "(+%<PRId64> for BOM)"
msgstr "(+%<PRId64> vir 'BOM')"
-#: ../option.c:1238
-msgid "%<%f%h%m%=Page %N"
-msgstr "%<%f%h%m%=Bladsy %N"
-
-#: ../option.c:1574
-msgid "Thanks for flying Vim"
-msgstr "Dankie dat jy vlieg met Vim"
-
#. found a mismatch: skip
-#: ../option.c:2698
msgid "E518: Unknown option"
msgstr "E518: Onbekende opsie"
-#: ../option.c:2709
-msgid "E519: Option not supported"
-msgstr "E519: Opsie is nie ondersteun nie"
-
-#: ../option.c:2740
msgid "E520: Not allowed in a modeline"
msgstr "E520: Nie toegelaat in 'n moduslyn nie"
-#: ../option.c:2815
-msgid "E846: Key code not set"
-msgstr ""
+#~ msgid "E846: Key code not set"
+#~ msgstr ""
-#: ../option.c:2924
msgid "E521: Number required after ="
msgstr "E521: Nommer vereis na ="
-#: ../option.c:3226 ../option.c:3864
-msgid "E522: Not found in termcap"
-msgstr "E522: Nie gevind in 'termcap' nie"
-
-#: ../option.c:3335
#, c-format
msgid "E539: Illegal character <%s>"
msgstr "E539: Ongeldige karakter <%s>"
-#: ../option.c:3862
-msgid "E529: Cannot set 'term' to empty string"
-msgstr "E529: Kan nie 'term' stel na le๋ string nie"
+#, c-format
+#~ msgid "For option %s"
+#~ msgstr ""
-#: ../option.c:3885
msgid "E589: 'backupext' and 'patchmode' are equal"
msgstr "E589: 'backupext' en 'patchmode' is dieselfde"
-#: ../option.c:3964
-msgid "E834: Conflicts with value of 'listchars'"
-msgstr ""
+#~ msgid "E834: Conflicts with value of 'listchars'"
+#~ msgstr ""
-#: ../option.c:3966
-msgid "E835: Conflicts with value of 'fillchars'"
-msgstr ""
+#~ msgid "E835: Conflicts with value of 'fillchars'"
+#~ msgstr ""
-#: ../option.c:4163
msgid "E524: Missing colon"
msgstr "E524: Ontbrekende dubbelpunt"
-#: ../option.c:4165
msgid "E525: Zero length string"
msgstr "E525: Nul-lengte string"
-#: ../option.c:4220
#, c-format
msgid "E526: Missing number after <%s>"
msgstr "E526: Ontbrekende nommer na <%s>"
-#: ../option.c:4232
msgid "E527: Missing comma"
msgstr "E527: Ontbrekende komma"
-#: ../option.c:4239
msgid "E528: Must specify a ' value"
msgstr "E528: Moet 'n ' waarde spesifiseer"
-#: ../option.c:4271
msgid "E595: contains unprintable or wide character"
msgstr "E595: bevat 'n ondrukbare of wye karakter"
-#: ../option.c:4469
#, c-format
msgid "E535: Illegal character after <%c>"
msgstr "E535: Ongeldige karakter na <%c>"
-#: ../option.c:4534
msgid "E536: comma required"
msgstr "E536: komma benodig"
-#: ../option.c:4543
#, c-format
msgid "E537: 'commentstring' must be empty or contain %s"
msgstr "E537: 'commentstring' moet leeg wees of %s bevat"
-#: ../option.c:4928
msgid "E540: Unclosed expression sequence"
msgstr "E540: Onvoltooide uitdrukkingreeks"
-#: ../option.c:4932
msgid "E541: too many items"
msgstr "E541: te veel items"
-#: ../option.c:4934
msgid "E542: unbalanced groups"
msgstr "E542: ongebalanseerde groepe"
-#: ../option.c:5148
msgid "E590: A preview window already exists"
msgstr "E590: Daar bestaan reeds 'n voorskouvenster"
-#: ../option.c:5311
msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'"
msgstr "W17: Arabies benodig UTF-8, doen ':set encoding=utf-8'"
-#: ../option.c:5623
#, c-format
msgid "E593: Need at least %d lines"
msgstr "E593: Benodig ten minste %d re๋ls"
-#: ../option.c:5631
#, c-format
msgid "E594: Need at least %d columns"
msgstr "E594: Benodig ten minste %d kolomme"
-#: ../option.c:6011
#, c-format
msgid "E355: Unknown option: %s"
msgstr "E355: Onbekende opsie: %s"
#. There's another character after zeros or the string
-#. * is empty. In both cases, we are trying to set a
-#. * num option using a string.
-#: ../option.c:6037
+#. is empty. In both cases, we are trying to set a
+#. num option using a string.
#, fuzzy, c-format
-msgid "E521: Number required: &%s = '%s'"
-msgstr "E521: Nommer vereis na ="
+#~ msgid "E521: Number required: &%s = '%s'"
+#~ msgstr "E521: Nommer vereis na ="
-#: ../option.c:6149
msgid ""
"\n"
"--- Terminal codes ---"
@@ -4757,7 +4175,6 @@ msgstr ""
"\n"
"--- Terminaal kodes ---"
-#: ../option.c:6151
msgid ""
"\n"
"--- Global option values ---"
@@ -4765,7 +4182,6 @@ msgstr ""
"\n"
"--- Globale opsie waardes ---"
-#: ../option.c:6153
msgid ""
"\n"
"--- Local option values ---"
@@ -4773,7 +4189,6 @@ msgstr ""
"\n"
"--- Lokale opsie waardes ---"
-#: ../option.c:6155
msgid ""
"\n"
"--- Options ---"
@@ -4781,29 +4196,28 @@ msgstr ""
"\n"
"--- Opsies ---"
-#: ../option.c:6816
msgid "E356: get_varp ERROR"
msgstr "E356: 'get_varp' FOUT"
-#: ../option.c:7696
#, c-format
msgid "E357: 'langmap': Matching character missing for %s"
msgstr "E357: 'langmap': Passende karakter ontbreek vir %s"
-#: ../option.c:7715
#, c-format
msgid "E358: 'langmap': Extra characters after semicolon: %s"
msgstr "E358: 'langmap: Ekstra karakters na kommapunt: %s"
-#: ../os/shell.c:194
-msgid ""
-"\n"
-"Cannot execute shell "
-msgstr ""
-"\n"
-"Kan nie dop uitvoer nie "
+#, c-format
+#~ msgid "dlerror = \"%s\""
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "E5420: Failed to write to file: %s"
+#~ msgstr "E365: Kon nie 'PostScript' l๊er druk nie"
+
+msgid "Vim: Error reading input, exiting...\n"
+msgstr "Vim: Fout met lees van invoer, verlaat...\n"
-#: ../os/shell.c:439
msgid ""
"\n"
"shell returned "
@@ -4811,959 +4225,930 @@ msgstr ""
"\n"
"dop lewer "
-#: ../os_unix.c:465 ../os_unix.c:471
-msgid ""
-"\n"
-"Could not get security context for "
-msgstr ""
+#~ msgid ""
+#~ "\n"
+#~ "shell failed to start: "
+#~ msgstr ""
-#: ../os_unix.c:479
-msgid ""
-"\n"
-"Could not set security context for "
-msgstr ""
+#. Can happen if system() tries to send input to a shell command that was
+#. backgrounded (:call system("cat - &", "foo")). #3529 #5241
+#, fuzzy, c-format
+#~ msgid "E5677: Error writing input to shell-command: %s"
+#~ msgstr "E208: Kan nie skryf na \"%s\""
-#: ../os_unix.c:1558 ../os_unix.c:1647
-#, c-format
-msgid "dlerror = \"%s\""
-msgstr ""
+#~ msgid ""
+#~ "\n"
+#~ "Could not get security context for "
+#~ msgstr ""
+
+#~ msgid ""
+#~ "\n"
+#~ "Could not set security context for "
+#~ msgstr ""
-#: ../path.c:1449
#, c-format
msgid "E447: Can't find file \"%s\" in path"
msgstr "E447: Kan l๊er \"%s\" nie vind in pad nie"
-#: ../quickfix.c:359
#, c-format
msgid "E372: Too many %%%c in format string"
msgstr "E372: Te veel %%%c in formaatstring"
-#: ../quickfix.c:371
#, c-format
msgid "E373: Unexpected %%%c in format string"
msgstr "E373: Onverwagte %%%c in formaatstring"
-#: ../quickfix.c:420
msgid "E374: Missing ] in format string"
msgstr "E374: Ontbrekende ] in formaatstring"
-#: ../quickfix.c:431
#, c-format
msgid "E375: Unsupported %%%c in format string"
msgstr "E375: Ongesteunde %%%c in formaatstring"
-#: ../quickfix.c:448
#, c-format
msgid "E376: Invalid %%%c in format string prefix"
msgstr "E376: Ongeldige %%%c in formaatstringvoorvoegsel"
-#: ../quickfix.c:454
#, c-format
msgid "E377: Invalid %%%c in format string"
msgstr "E377: Ongeldige %%%c in formaatstring"
#. nothing found
-#: ../quickfix.c:477
msgid "E378: 'errorformat' contains no pattern"
msgstr "E378: 'errorformat' bevat geen patroon nie"
-#: ../quickfix.c:695
msgid "E379: Missing or empty directory name"
msgstr "E379: Ontbrekende of le๋ gidsnaam"
-#: ../quickfix.c:1305
msgid "E553: No more items"
msgstr "E553: Geen items meer nie"
-#: ../quickfix.c:1674
+#~ msgid "E924: Current window was closed"
+#~ msgstr ""
+
+#~ msgid "E925: Current quickfix was changed"
+#~ msgstr ""
+
+#~ msgid "E926: Current location list was changed"
+#~ msgstr ""
+
#, c-format
msgid "(%d of %d)%s%s: "
msgstr "(%d van %d)%s%s: "
-#: ../quickfix.c:1676
msgid " (line deleted)"
msgstr " (re๋l verwyder)"
-#: ../quickfix.c:1863
+#, fuzzy, c-format
+#~ msgid "%serror list %d of %d; %d errors "
+#~ msgstr "foutelys %d van %d; %d foute"
+
msgid "E380: At bottom of quickfix stack"
msgstr "E380: Onder aan 'quickfix' stapel"
-#: ../quickfix.c:1869
msgid "E381: At top of quickfix stack"
msgstr "E381: Bo aan 'quickfix' stapel"
-#: ../quickfix.c:1880
-#, c-format
-msgid "error list %d of %d; %d errors"
-msgstr "foutelys %d van %d; %d foute"
+#~ msgid "No entries"
+#~ msgstr ""
-#: ../quickfix.c:2427
msgid "E382: Cannot write, 'buftype' option is set"
msgstr "E382: Kan nie skryf nie, 'buftype' opsie is aan"
-#: ../quickfix.c:2812
-msgid "E683: File name missing or invalid pattern"
-msgstr ""
+#~ msgid "E683: File name missing or invalid pattern"
+#~ msgstr ""
-#: ../quickfix.c:2911
#, fuzzy, c-format
-msgid "Cannot open file \"%s\""
-msgstr "Kan nie l๊er %s oopmaak nie"
+#~ msgid "Cannot open file \"%s\""
+#~ msgstr "Kan nie l๊er %s oopmaak nie"
-#: ../quickfix.c:3429
#, fuzzy
-msgid "E681: Buffer is not loaded"
-msgstr "1 buffer uitgelaai"
+#~ msgid "E681: Buffer is not loaded"
+#~ msgstr "1 buffer uitgelaai"
-#: ../quickfix.c:3487
#, fuzzy
-msgid "E777: String or List expected"
-msgstr "E548: syfer verwag"
+#~ msgid "E777: String or List expected"
+#~ msgstr "E548: syfer verwag"
-#: ../regexp.c:359
#, c-format
msgid "E369: invalid item in %s%%[]"
msgstr "E369: ongeldige item in %s%%[]"
-#: ../regexp.c:374
#, fuzzy, c-format
-msgid "E769: Missing ] after %s["
-msgstr "E69: Ontbrekende ] na %s%%["
+#~ msgid "E769: Missing ] after %s["
+#~ msgstr "E69: Ontbrekende ] na %s%%["
-#: ../regexp.c:375
#, c-format
msgid "E53: Unmatched %s%%("
msgstr "E53: Onpaar %s%%("
-#: ../regexp.c:376
#, c-format
msgid "E54: Unmatched %s("
msgstr "E54: Onpaar %s("
-#: ../regexp.c:377
#, c-format
msgid "E55: Unmatched %s)"
msgstr "E55: Onpaar %s)"
-#: ../regexp.c:378
msgid "E66: \\z( not allowed here"
msgstr "E66: \\z( nie hier toegelaat nie"
-#: ../regexp.c:379
-msgid "E67: \\z1 et al. not allowed here"
+msgid "E67: \\z1 - \\z9 not allowed here"
msgstr "E67: \\z1 e.a. nie hier toegelaat nie"
-#: ../regexp.c:380
#, c-format
msgid "E69: Missing ] after %s%%["
msgstr "E69: Ontbrekende ] na %s%%["
-#: ../regexp.c:381
#, c-format
msgid "E70: Empty %s%%[]"
msgstr "E70: Le๋ %s%%[]"
-#: ../regexp.c:1209 ../regexp.c:1224
msgid "E339: Pattern too long"
msgstr "E339: Patroon te lank"
-#: ../regexp.c:1371
msgid "E50: Too many \\z("
msgstr "E50: Te veel \\z("
-#: ../regexp.c:1378
#, c-format
msgid "E51: Too many %s("
msgstr "E51: Te veel %s("
-#: ../regexp.c:1427
msgid "E52: Unmatched \\z("
msgstr "E52: Onpaar \\z("
-#: ../regexp.c:1637
#, c-format
msgid "E59: invalid character after %s@"
msgstr "E59: ongeldige karakter na %s@"
-#: ../regexp.c:1672
#, c-format
msgid "E60: Too many complex %s{...}s"
msgstr "E60: Te veel komplekse %s{...}ies"
-#: ../regexp.c:1687
#, c-format
msgid "E61: Nested %s*"
msgstr "E61: Geneste %s*"
-#: ../regexp.c:1690
#, c-format
msgid "E62: Nested %s%c"
msgstr "E62: Geneste %s%c"
-#: ../regexp.c:1800
msgid "E63: invalid use of \\_"
msgstr "E63: ongeldige gebruik van \\_"
-#: ../regexp.c:1850
#, c-format
msgid "E64: %s%c follows nothing"
msgstr "E64: %s%c volg niks"
-#: ../regexp.c:1902
msgid "E65: Illegal back reference"
msgstr "E65: Ongeldige tru-verwysing"
-#: ../regexp.c:1943
msgid "E68: Invalid character after \\z"
msgstr "E68: ongeldige karakter na \\z"
-#: ../regexp.c:2049 ../regexp_nfa.c:1296
#, fuzzy, c-format
-msgid "E678: Invalid character after %s%%[dxouU]"
-msgstr "E71: Ongeldige karakter na %s%%"
+#~ msgid "E678: Invalid character after %s%%[dxouU]"
+#~ msgstr "E71: Ongeldige karakter na %s%%"
-#: ../regexp.c:2107
#, c-format
msgid "E71: Invalid character after %s%%"
msgstr "E71: Ongeldige karakter na %s%%"
-#: ../regexp.c:3017
+#, fuzzy, c-format
+#~ msgid "E888: (NFA regexp) cannot repeat %s"
+#~ msgstr "E50: Te veel \\z("
+
#, c-format
msgid "E554: Syntax error in %s{...}"
msgstr "E554: Sintaksfout in %s{...}"
-#: ../regexp.c:3805
msgid "External submatches:\n"
msgstr "Eksterne subtreffers:\n"
-#: ../regexp.c:7022
-msgid ""
-"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be "
-"used "
-msgstr ""
-
-#: ../regexp_nfa.c:239
-msgid "E865: (NFA) Regexp end encountered prematurely"
-msgstr ""
-
-#: ../regexp_nfa.c:240
-#, c-format
-msgid "E866: (NFA regexp) Misplaced %c"
-msgstr ""
-
-#: ../regexp_nfa.c:242
-#, c-format
-msgid "E877: (NFA regexp) Invalid character class: %<PRId64>"
-msgstr ""
-
-#: ../regexp_nfa.c:1261
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\z%c'"
-msgstr ""
-
-#: ../regexp_nfa.c:1387
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\%%%c'"
-msgstr ""
-
-#: ../regexp_nfa.c:1802
-#, c-format
-msgid "E869: (NFA) Unknown operator '\\@%c'"
-msgstr ""
-
-#: ../regexp_nfa.c:1831
-msgid "E870: (NFA regexp) Error reading repetition limits"
-msgstr ""
-
-#. Can't have a multi follow a multi.
-#: ../regexp_nfa.c:1895
-msgid "E871: (NFA regexp) Can't have a multi follow a multi !"
-msgstr ""
-
-#. Too many `('
-#: ../regexp_nfa.c:2037
-msgid "E872: (NFA regexp) Too many '('"
-msgstr ""
-
-#: ../regexp_nfa.c:2042
-#, fuzzy
-msgid "E879: (NFA regexp) Too many \\z("
-msgstr "E50: Te veel \\z("
-
-#: ../regexp_nfa.c:2066
-msgid "E873: (NFA regexp) proper termination error"
-msgstr ""
-
-#: ../regexp_nfa.c:2599
-msgid "E874: (NFA) Could not pop the stack !"
-msgstr ""
-
-#: ../regexp_nfa.c:3298
-msgid ""
-"E875: (NFA regexp) (While converting from postfix to NFA), too many states "
-"left on stack"
-msgstr ""
-
-#: ../regexp_nfa.c:3302
-msgid "E876: (NFA regexp) Not enough space to store the whole NFA "
-msgstr ""
-
-#: ../regexp_nfa.c:4571 ../regexp_nfa.c:4869
-msgid ""
-"Could not open temporary log file for writing, displaying on stderr ... "
-msgstr ""
+#~ msgid ""
+#~ "E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be "
+#~ "used "
+#~ msgstr ""
-#: ../regexp_nfa.c:4840
-#, c-format
-msgid "(NFA) COULD NOT OPEN %s !"
-msgstr ""
+#~ msgid "Switching to backtracking RE engine for pattern: "
+#~ msgstr ""
-#: ../regexp_nfa.c:6049
-#, fuzzy
-msgid "Could not open temporary log file for writing "
-msgstr "E214: Kan nie tydelike l๊er vind vir skryf nie"
+#~ msgid " TERMINAL"
+#~ msgstr ""
-#: ../screen.c:7435
msgid " VREPLACE"
msgstr " VVERVANG"
-#: ../screen.c:7437
msgid " REPLACE"
msgstr " VERVANG"
-#: ../screen.c:7440
msgid " REVERSE"
msgstr " OMKEER"
-#: ../screen.c:7441
msgid " INSERT"
msgstr " INVOEG"
-#: ../screen.c:7443
msgid " (insert)"
msgstr " (invoeg)"
-#: ../screen.c:7445
msgid " (replace)"
msgstr " (vervang)"
-#: ../screen.c:7447
msgid " (vreplace)"
msgstr " (vvervang)"
-#: ../screen.c:7449
msgid " Hebrew"
msgstr " Hebreeus"
-#: ../screen.c:7454
msgid " Arabic"
msgstr " Arabies"
-#: ../screen.c:7456
-msgid " (lang)"
-msgstr " (taal)"
-
-#: ../screen.c:7459
msgid " (paste)"
msgstr " (plak)"
-#: ../screen.c:7469
msgid " VISUAL"
msgstr " VISUELE"
-#: ../screen.c:7470
msgid " VISUAL LINE"
msgstr " VISUELE REหL"
-#: ../screen.c:7471
msgid " VISUAL BLOCK"
msgstr " VISUELE BLOK"
-#: ../screen.c:7472
msgid " SELECT"
msgstr " KIES"
-#: ../screen.c:7473
msgid " SELECT LINE"
msgstr " KIES REหL"
-#: ../screen.c:7474
msgid " SELECT BLOCK"
msgstr " KIES BLOK"
-#: ../screen.c:7486 ../screen.c:7541
msgid "recording"
msgstr "besig om op te neem"
-#: ../search.c:487
#, c-format
msgid "E383: Invalid search string: %s"
msgstr "E383: Ongeldige soekstring: %s"
-#: ../search.c:832
#, c-format
msgid "E384: search hit TOP without match for: %s"
msgstr "E384: soektog het BO getref sonder treffer vir: %s"
-#: ../search.c:835
#, c-format
msgid "E385: search hit BOTTOM without match for: %s"
msgstr "E385: soektog het ONDER getref sonder treffer vir: %s"
-#: ../search.c:1200
msgid "E386: Expected '?' or '/' after ';'"
msgstr "E386: Verwag '?' of '/' na ';'"
-#: ../search.c:4085
msgid " (includes previously listed match)"
msgstr " (sluit in vorige gelyste treffer)"
#. cursor at status line
-#: ../search.c:4104
msgid "--- Included files "
msgstr "--- Ingeslote l๊ers"
-#: ../search.c:4106
msgid "not found "
msgstr "nie gevind nie "
-#: ../search.c:4107
msgid "in path ---\n"
msgstr "in pad ---\n"
-#: ../search.c:4168
msgid " (Already listed)"
msgstr " (Alreeds gelys)"
-#: ../search.c:4170
msgid " NOT FOUND"
msgstr " NIE GEVIND NIE"
-#: ../search.c:4211
#, c-format
msgid "Scanning included file: %s"
msgstr "Deursoek ingeslote l๊er: %s"
-#: ../search.c:4216
#, fuzzy, c-format
-msgid "Searching included file %s"
-msgstr "Deursoek ingeslote l๊er: %s"
+#~ msgid "Searching included file %s"
+#~ msgstr "Deursoek ingeslote l๊er: %s"
-#: ../search.c:4405
msgid "E387: Match is on current line"
msgstr "E387: Treffer is op huidige re๋l"
-#: ../search.c:4517
msgid "All included files were found"
msgstr "Alle ingeslote l๊ers is gevind"
-#: ../search.c:4519
msgid "No included files"
msgstr "Geen ingeslote l๊ers nie"
-#: ../search.c:4527
msgid "E388: Couldn't find definition"
msgstr "E388: Kon definisie nie vind nie"
-#: ../search.c:4529
msgid "E389: Couldn't find pattern"
msgstr "E389: Kon patroon nie vind nie"
-#: ../search.c:4668
-#, fuzzy
-msgid "Substitute "
-msgstr "1 vervanging"
+#~ msgid "too few bytes read"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "System error while skipping in ShaDa file: %s"
+#~ msgstr "E47: Fout tydens lees van 'errorfile'"
-#: ../search.c:4681
#, c-format
-msgid ""
-"\n"
-"# Last %sSearch Pattern:\n"
-"~"
-msgstr ""
+#~ msgid ""
+#~ "Error while reading ShaDa file: last entry specified that it occupies "
+#~ "%<PRIu64> bytes, but file ended earlier"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "System error while closing ShaDa file: %s"
+#~ msgstr "E47: Fout tydens lees van 'errorfile'"
+
+#, fuzzy, c-format
+#~ msgid "System error while writing ShaDa file: %s"
+#~ msgstr "E47: Fout tydens lees van 'errorfile'"
+
+#, fuzzy, c-format
+#~ msgid "Reading ShaDa file \"%s\"%s%s%s"
+#~ msgstr "Besig om viminfo l๊er \"%s\"%s%s%s te lees"
+
+msgid " info"
+msgstr " inligting"
+
+msgid " marks"
+msgstr " merkers"
-#: ../spell.c:951
#, fuzzy
-msgid "E759: Format error in spell file"
-msgstr "E297: Skryffout in ruill๊er"
+#~ msgid " oldfiles"
+#~ msgstr "Geen ingeslote l๊ers nie"
-#: ../spell.c:952
-msgid "E758: Truncated spell file"
-msgstr ""
+msgid " FAILED"
+msgstr " GEFAAL"
-#: ../spell.c:953
#, c-format
-msgid "Trailing text in %s line %d: %s"
-msgstr ""
+#~ msgid "System error while opening ShaDa file %s for reading: %s"
+#~ msgstr ""
+
+#~ msgid "additional elements of ShaDa "
+#~ msgstr ""
+
+#~ msgid "additional data of ShaDa "
+#~ msgstr ""
-#: ../spell.c:954
#, c-format
-msgid "Affix name too long in %s line %d: %s"
-msgstr ""
+#~ msgid "Failed to write variable %s"
+#~ msgstr ""
-#: ../spell.c:955
-#, fuzzy
-msgid "E761: Format error in affix file FOL, LOW or UPP"
-msgstr "E431: Formaatfout in etiketl๊er \"%s\""
+#, c-format
+#~ msgid ""
+#~ "Failed to parse ShaDa file due to a msgpack parser error at position "
+#~ "%<PRIu64>"
+#~ msgstr ""
-#: ../spell.c:957
-msgid "E762: Character in FOL, LOW or UPP is out of range"
-msgstr ""
+#, c-format
+#~ msgid ""
+#~ "Failed to parse ShaDa file: incomplete msgpack string at position %<PRIu64>"
+#~ msgstr ""
-#: ../spell.c:958
-msgid "Compressing word tree..."
-msgstr ""
+#, c-format
+#~ msgid ""
+#~ "Failed to parse ShaDa file: extra bytes in msgpack string at position "
+#~ "%<PRIu64>"
+#~ msgstr ""
-#: ../spell.c:1951
-msgid "E756: Spell checking is not enabled"
-msgstr ""
+#, c-format
+#~ msgid ""
+#~ "System error while opening ShaDa file %s for reading to merge before writing "
+#~ "it: %s"
+#~ msgstr ""
-#: ../spell.c:2249
+#. Tried names from .tmp.a to .tmp.z, all failed. Something must be
+#. wrong then.
#, c-format
-msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
-msgstr ""
+#~ msgid "E138: All %s.tmp.X files exist, cannot write ShaDa file!"
+#~ msgstr ""
-#: ../spell.c:2473
#, fuzzy, c-format
-msgid "Reading spell file \"%s\""
-msgstr "Gebruik ruill๊er \"%s\""
+#~ msgid "System error while opening temporary ShaDa file %s for writing: %s"
+#~ msgstr "E214: Kan nie tydelike l๊er vind vir skryf nie"
-#: ../spell.c:2496
-#, fuzzy
-msgid "E757: This does not look like a spell file"
-msgstr "E307: %s lyk nie soos 'n Vim ruill๊er nie"
+#, c-format
+#~ msgid "Failed to create directory %s for writing ShaDa file: %s"
+#~ msgstr ""
-#: ../spell.c:2501
-msgid "E771: Old spell file, needs to be updated"
-msgstr ""
+#, c-format
+#~ msgid "System error while opening ShaDa file %s for writing: %s"
+#~ msgstr ""
-#: ../spell.c:2504
-msgid "E772: Spell file is for newer version of Vim"
-msgstr ""
+#, fuzzy, c-format
+#~ msgid "Writing ShaDa file \"%s\""
+#~ msgstr "Besig om viminfo l๊er \"%s\" te stoor"
-#: ../spell.c:2602
-#, fuzzy
-msgid "E770: Unsupported section in spell file"
-msgstr "E297: Skryffout in ruill๊er"
+#, fuzzy, c-format
+#~ msgid "Failed setting uid and gid for file %s: %s"
+#~ msgstr "%s klaar uitgevoer"
-#: ../spell.c:3762
#, fuzzy, c-format
-msgid "Warning: region %s not supported"
-msgstr "E519: Opsie is nie ondersteun nie"
+#~ msgid "E137: ShaDa file is not writable: %s"
+#~ msgstr "E137: Viminfo l๊er is nie skryfbaar nie: %s"
+
+#, c-format
+#~ msgid "Can't rename ShaDa file from %s to %s!"
+#~ msgstr ""
-#: ../spell.c:4550
#, fuzzy, c-format
-msgid "Reading affix file %s ..."
-msgstr "Deursoek etiketl๊er %s"
+#~ msgid "Did not rename %s because %s does not look like a ShaDa file"
+#~ msgstr " [lyk nie soos 'n Vim ruill๊er nie]"
-#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
#, c-format
-msgid "Conversion failure for word in %s line %d: %s"
-msgstr ""
+#~ msgid "Did not rename %s to %s because there were errors during writing it"
+#~ msgstr ""
-#: ../spell.c:4630 ../spell.c:6170
#, c-format
-msgid "Conversion in %s not supported: from %s to %s"
-msgstr ""
+#~ msgid "Do not forget to remove %s or rename it manually to %s."
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "System error while reading ShaDa file: %s"
+#~ msgstr "E47: Fout tydens lees van 'errorfile'"
+
+#, fuzzy, c-format
+#~ msgid "System error while reading integer from ShaDa file: %s"
+#~ msgstr "E47: Fout tydens lees van 'errorfile'"
-#: ../spell.c:4642
#, c-format
-msgid "Invalid value for FLAG in %s line %d: %s"
-msgstr ""
+#~ msgid ""
+#~ "Error while reading ShaDa file: expected positive integer at position "
+#~ "%<PRIu64>, but got nothing"
+#~ msgstr ""
-#: ../spell.c:4655
#, c-format
-msgid "FLAG after using flags in %s line %d: %s"
-msgstr ""
+#~ msgid ""
+#~ "Error while reading ShaDa file: expected positive integer at position "
+#~ "%<PRIu64>"
+#~ msgstr ""
-#: ../spell.c:4723
#, c-format
-msgid ""
-"Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line "
-"%d"
-msgstr ""
+#~ msgid ""
+#~ "Error while reading ShaDa file: there is an item at position %<PRIu64> that "
+#~ "is stated to be too long"
+#~ msgstr ""
-#: ../spell.c:4731
+#. kSDItemUnknown cannot possibly pass that far because it is -1 and that
+#. will fail in msgpack_read_uint64. But kSDItemMissing may and it will
+#. otherwise be skipped because (1 << 0) will never appear in flags.
#, c-format
-msgid ""
-"Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line "
-"%d"
-msgstr ""
+#~ msgid ""
+#~ "Error while reading ShaDa file: there is an item at position %<PRIu64> that "
+#~ "must not be there: Missing items are for internal uses only"
+#~ msgstr ""
-#: ../spell.c:4747
#, c-format
-msgid "Wrong COMPOUNDRULES value in %s line %d: %s"
-msgstr ""
+#~ msgid ""
+#~ "Error while reading ShaDa file: buffer list at position %<PRIu64> contains "
+#~ "entry that is not a dictionary"
+#~ msgstr ""
-#: ../spell.c:4771
#, c-format
-msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s"
-msgstr ""
+#~ msgid ""
+#~ "Error while reading ShaDa file: buffer list at position %<PRIu64> contains "
+#~ "entry with invalid line number"
+#~ msgstr ""
-#: ../spell.c:4777
#, c-format
-msgid "Wrong COMPOUNDMIN value in %s line %d: %s"
-msgstr ""
+#~ msgid ""
+#~ "Error while reading ShaDa file: buffer list at position %<PRIu64> contains "
+#~ "entry with invalid column number"
+#~ msgstr ""
-#: ../spell.c:4783
#, c-format
-msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s"
-msgstr ""
+#~ msgid ""
+#~ "Error while reading ShaDa file: buffer list at position %<PRIu64> contains "
+#~ "entry that does not have a file name"
+#~ msgstr ""
+
+#. values for ts_isdiff
+#. no different byte (yet)
+#. different byte found
+#. inserting character
+#. values for ts_flags
+#. already checked that prefix is OK
+#. tried split at this point
+#. did a delete, "ts_delidx" has index
+#. special values ts_prefixdepth
+#. not using prefixes
+#. walking through the prefix tree
+#. highest value that's not special
+#. mode values for find_word
+#. find word case-folded
+#. find keep-case word
+#. find word after prefix
+#. find case-folded compound word
+#. find keep-case compound word
+#, fuzzy
+#~ msgid "E759: Format error in spell file"
+#~ msgstr "E297: Skryffout in ruill๊er"
+
+#~ msgid "E756: Spell checking is not enabled"
+#~ msgstr ""
-#: ../spell.c:4795
#, c-format
-msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"
-msgstr ""
+#~ msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "E797: SpellFileMissing autocommand deleted buffer"
+#~ msgstr "E246: 'FileChangedShell' outobevel het buffer verwyder"
+
+#. This is probably an error. Give a warning and
+#. accept the words anyway.
+#, fuzzy, c-format
+#~ msgid "Warning: region %s not supported"
+#~ msgstr "E519: Opsie is nie ondersteun nie"
+
+#~ msgid "Sorry, no suggestions"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "Sorry, only %<PRId64> suggestions"
+#~ msgstr " op %<PRId64> re๋ls"
+
+#. for when 'cmdheight' > 1
+#. avoid more prompt
+#, fuzzy, c-format
+#~ msgid "Change \"%.*s\" to:"
+#~ msgstr "Stoor veranderinge na \"%.*s\"?"
-#: ../spell.c:4847
#, c-format
-msgid "Different combining flag in continued affix block in %s line %d: %s"
-msgstr ""
+#~ msgid " < \"%.*s\""
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "E752: No previous spell replacement"
+#~ msgstr "E35: Geen vorige patroon nie"
-#: ../spell.c:4850
#, fuzzy, c-format
-msgid "Duplicate affix in %s line %d: %s"
-msgstr "E154: Duplikaat etiket \"%s\" in l๊er %s/%s"
+#~ msgid "E753: Not found: %s"
+#~ msgstr "E334: Kieslys nie gevind nie: %s"
+
+#~ msgid "E758: Truncated spell file"
+#~ msgstr ""
-#: ../spell.c:4871
#, c-format
-msgid ""
-"Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s "
-"line %d: %s"
-msgstr ""
+#~ msgid "Trailing text in %s line %d: %s"
+#~ msgstr ""
-#: ../spell.c:4893
#, c-format
-msgid "Expected Y or N in %s line %d: %s"
-msgstr ""
+#~ msgid "Affix name too long in %s line %d: %s"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "E761: Format error in affix file FOL, LOW or UPP"
+#~ msgstr "E431: Formaatfout in etiketl๊er \"%s\""
+
+#~ msgid "E762: Character in FOL, LOW or UPP is out of range"
+#~ msgstr ""
+
+#~ msgid "Compressing word tree..."
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "Reading spell file \"%s\""
+#~ msgstr "Gebruik ruill๊er \"%s\""
+
+#, fuzzy
+#~ msgid "E757: This does not look like a spell file"
+#~ msgstr "E307: %s lyk nie soos 'n Vim ruill๊er nie"
+
+#, fuzzy, c-format
+#~ msgid "E5042: Failed to read spell file %s: %s"
+#~ msgstr "E482: Kan nie l๊er %s skep nie"
+
+#~ msgid "E771: Old spell file, needs to be updated"
+#~ msgstr ""
+
+#~ msgid "E772: Spell file is for newer version of Vim"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "E770: Unsupported section in spell file"
+#~ msgstr "E297: Skryffout in ruill๊er"
+
+#, fuzzy, c-format
+#~ msgid "E778: This does not look like a .sug file: %s"
+#~ msgstr "E307: %s lyk nie soos 'n Vim ruill๊er nie"
-#: ../spell.c:4968
#, c-format
-msgid "Broken condition in %s line %d: %s"
-msgstr ""
+#~ msgid "E779: Old .sug file, needs to be updated: %s"
+#~ msgstr ""
-#: ../spell.c:5091
#, c-format
-msgid "Expected REP(SAL) count in %s line %d"
-msgstr ""
+#~ msgid "E780: .sug file is for newer version of Vim: %s"
+#~ msgstr ""
-#: ../spell.c:5120
#, c-format
-msgid "Expected MAP count in %s line %d"
-msgstr ""
+#~ msgid "E781: .sug file doesn't match .spl file: %s"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "E782: error while reading .sug file: %s"
+#~ msgstr "E47: Fout tydens lees van 'errorfile'"
+
+#, fuzzy, c-format
+#~ msgid "Reading affix file %s ..."
+#~ msgstr "Deursoek etiketl๊er %s"
-#: ../spell.c:5132
#, c-format
-msgid "Duplicate character in MAP in %s line %d"
-msgstr ""
+#~ msgid "Conversion failure for word in %s line %d: %s"
+#~ msgstr ""
-#: ../spell.c:5176
#, c-format
-msgid "Unrecognized or duplicate item in %s line %d: %s"
-msgstr ""
+#~ msgid "Conversion in %s not supported: from %s to %s"
+#~ msgstr ""
-#: ../spell.c:5197
#, c-format
-msgid "Missing FOL/LOW/UPP line in %s"
-msgstr ""
+#~ msgid "Invalid value for FLAG in %s line %d: %s"
+#~ msgstr ""
-#: ../spell.c:5220
-msgid "COMPOUNDSYLMAX used without SYLLABLE"
-msgstr ""
+#, c-format
+#~ msgid "FLAG after using flags in %s line %d: %s"
+#~ msgstr ""
-#: ../spell.c:5236
-#, fuzzy
-msgid "Too many postponed prefixes"
-msgstr "Te veel redigeer-parameters"
+#, c-format
+#~ msgid ""
+#~ "Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line "
+#~ "%d"
+#~ msgstr ""
-#: ../spell.c:5238
-#, fuzzy
-msgid "Too many compound flags"
-msgstr "Te veel redigeer-parameters"
+#, c-format
+#~ msgid ""
+#~ "Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line "
+#~ "%d"
+#~ msgstr ""
-#: ../spell.c:5240
-msgid "Too many postponed prefixes and/or compound flags"
-msgstr ""
+#, c-format
+#~ msgid "Wrong COMPOUNDRULES value in %s line %d: %s"
+#~ msgstr ""
-#: ../spell.c:5250
#, c-format
-msgid "Missing SOFO%s line in %s"
-msgstr ""
+#~ msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s"
+#~ msgstr ""
-#: ../spell.c:5253
#, c-format
-msgid "Both SAL and SOFO lines in %s"
-msgstr ""
+#~ msgid "Wrong COMPOUNDMIN value in %s line %d: %s"
+#~ msgstr ""
-#: ../spell.c:5331
#, c-format
-msgid "Flag is not a number in %s line %d: %s"
-msgstr ""
+#~ msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s"
+#~ msgstr ""
-#: ../spell.c:5334
#, c-format
-msgid "Illegal flag in %s line %d: %s"
-msgstr ""
+#~ msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"
+#~ msgstr ""
-#: ../spell.c:5493 ../spell.c:5501
#, c-format
-msgid "%s value differs from what is used in another .aff file"
-msgstr ""
+#~ msgid "Different combining flag in continued affix block in %s line %d: %s"
+#~ msgstr ""
-#: ../spell.c:5602
#, fuzzy, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "Deursoek woordeboek: %s"
+#~ msgid "Duplicate affix in %s line %d: %s"
+#~ msgstr "E154: Duplikaat etiket \"%s\" in l๊er %s/%s"
-#: ../spell.c:5611
#, c-format
-msgid "E760: No word count in %s"
-msgstr ""
+#~ msgid ""
+#~ "Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGESTin %s "
+#~ "line %d: %s"
+#~ msgstr ""
-#: ../spell.c:5669
#, c-format
-msgid "line %6d, word %6d - %s"
-msgstr ""
-
-#: ../spell.c:5691
-#, fuzzy, c-format
-msgid "Duplicate word in %s line %d: %s"
-msgstr "Patroon gevind in elke re๋l: %s"
+#~ msgid "Expected Y or N in %s line %d: %s"
+#~ msgstr ""
-#: ../spell.c:5694
#, c-format
-msgid "First duplicate word in %s line %d: %s"
-msgstr ""
+#~ msgid "Broken condition in %s line %d: %s"
+#~ msgstr ""
-#: ../spell.c:5746
#, c-format
-msgid "%d duplicate word(s) in %s"
-msgstr ""
+#~ msgid "Expected REP(SAL) count in %s line %d"
+#~ msgstr ""
-#: ../spell.c:5748
#, c-format
-msgid "Ignored %d word(s) with non-ASCII characters in %s"
-msgstr ""
+#~ msgid "Expected MAP count in %s line %d"
+#~ msgstr ""
-#: ../spell.c:6115
-#, fuzzy, c-format
-msgid "Reading word file %s ..."
-msgstr "Lees nou vanaf stdin... "
+#, c-format
+#~ msgid "Duplicate character in MAP in %s line %d"
+#~ msgstr ""
-#: ../spell.c:6155
#, c-format
-msgid "Duplicate /encoding= line ignored in %s line %d: %s"
-msgstr ""
+#~ msgid "Unrecognized or duplicate item in %s line %d: %s"
+#~ msgstr ""
-#: ../spell.c:6159
#, c-format
-msgid "/encoding= line after word ignored in %s line %d: %s"
-msgstr ""
+#~ msgid "Missing FOL/LOW/UPP line in %s"
+#~ msgstr ""
+
+#~ msgid "COMPOUNDSYLMAX used without SYLLABLE"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "Too many postponed prefixes"
+#~ msgstr "Te veel redigeer-parameters"
+
+#, fuzzy
+#~ msgid "Too many compound flags"
+#~ msgstr "Te veel redigeer-parameters"
+
+#~ msgid "Too many postponed prefixes and/or compound flags"
+#~ msgstr ""
-#: ../spell.c:6180
#, c-format
-msgid "Duplicate /regions= line ignored in %s line %d: %s"
-msgstr ""
+#~ msgid "Missing SOFO%s line in %s"
+#~ msgstr ""
-#: ../spell.c:6185
#, c-format
-msgid "Too many regions in %s line %d: %s"
-msgstr ""
+#~ msgid "Both SAL and SOFO lines in %s"
+#~ msgstr ""
-#: ../spell.c:6198
#, c-format
-msgid "/ line ignored in %s line %d: %s"
-msgstr ""
+#~ msgid "Flag is not a number in %s line %d: %s"
+#~ msgstr ""
-#: ../spell.c:6224
-#, fuzzy, c-format
-msgid "Invalid region nr in %s line %d: %s"
-msgstr "E573: Ongeldige bediener-id gebruik: %s"
+#, c-format
+#~ msgid "Illegal flag in %s line %d: %s"
+#~ msgstr ""
-#: ../spell.c:6230
#, c-format
-msgid "Unrecognized flags in %s line %d: %s"
-msgstr ""
+#~ msgid "%s value differs from what is used in another .aff file"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "Reading dictionary file %s ..."
+#~ msgstr "Deursoek woordeboek: %s"
-#: ../spell.c:6257
#, c-format
-msgid "Ignored %d words with non-ASCII characters"
-msgstr ""
+#~ msgid "E760: No word count in %s"
+#~ msgstr ""
-#: ../spell.c:6656
#, c-format
-msgid "Compressed %d of %d nodes; %d (%d%%) remaining"
-msgstr ""
+#~ msgid "line %6d, word %6d - %s"
+#~ msgstr ""
-#: ../spell.c:7340
-msgid "Reading back spell file..."
-msgstr ""
+#, fuzzy, c-format
+#~ msgid "Duplicate word in %s line %d: %s"
+#~ msgstr "Patroon gevind in elke re๋l: %s"
-#. Go through the trie of good words, soundfold each word and add it to
-#. the soundfold trie.
-#: ../spell.c:7357
-msgid "Performing soundfolding..."
-msgstr ""
+#, c-format
+#~ msgid "First duplicate word in %s line %d: %s"
+#~ msgstr ""
-#: ../spell.c:7368
#, c-format
-msgid "Number of words after soundfolding: %<PRId64>"
-msgstr ""
+#~ msgid "%d duplicate word(s) in %s"
+#~ msgstr ""
-#: ../spell.c:7476
#, c-format
-msgid "Total number of words: %d"
-msgstr ""
+#~ msgid "Ignored %d word(s) with non-ASCII characters in %s"
+#~ msgstr ""
-#: ../spell.c:7655
#, fuzzy, c-format
-msgid "Writing suggestion file %s ..."
-msgstr "Besig om viminfo l๊er \"%s\" te stoor"
+#~ msgid "Reading word file %s ..."
+#~ msgstr "Lees nou vanaf stdin... "
-#: ../spell.c:7707 ../spell.c:7927
#, c-format
-msgid "Estimated runtime memory use: %d bytes"
-msgstr ""
+#~ msgid "Duplicate /encoding= line ignored in %s line %d: %s"
+#~ msgstr ""
-#: ../spell.c:7820
-msgid "E751: Output file name must not have region name"
-msgstr ""
+#, c-format
+#~ msgid "/encoding= line after word ignored in %s line %d: %s"
+#~ msgstr ""
-#: ../spell.c:7822
-#, fuzzy
-msgid "E754: Only up to 8 regions supported"
-msgstr "E519: Opsie is nie ondersteun nie"
+#, c-format
+#~ msgid "Duplicate /regions= line ignored in %s line %d: %s"
+#~ msgstr ""
-#: ../spell.c:7846
-#, fuzzy, c-format
-msgid "E755: Invalid region in %s"
-msgstr "E15: Ongeldige uitdrukking: %s"
+#, c-format
+#~ msgid "Too many regions in %s line %d: %s"
+#~ msgstr ""
-#: ../spell.c:7907
-msgid "Warning: both compounding and NOBREAK specified"
-msgstr ""
+#, c-format
+#~ msgid "/ line ignored in %s line %d: %s"
+#~ msgstr ""
-#: ../spell.c:7920
#, fuzzy, c-format
-msgid "Writing spell file %s ..."
-msgstr "Besig om viminfo l๊er \"%s\" te stoor"
+#~ msgid "Invalid region nr in %s line %d: %s"
+#~ msgstr "E573: Ongeldige bediener-id gebruik: %s"
-#: ../spell.c:7925
-msgid "Done!"
-msgstr ""
-
-#: ../spell.c:8034
#, c-format
-msgid "E765: 'spellfile' does not have %<PRId64> entries"
-msgstr ""
+#~ msgid "Unrecognized flags in %s line %d: %s"
+#~ msgstr ""
-#: ../spell.c:8074
#, c-format
-msgid "Word '%.*s' removed from %s"
-msgstr ""
+#~ msgid "Ignored %d words with non-ASCII characters"
+#~ msgstr ""
-#: ../spell.c:8117
#, c-format
-msgid "Word '%.*s' added to %s"
-msgstr ""
+#~ msgid "Compressed %d of %d nodes; %d (%d%%) remaining"
+#~ msgstr ""
-#: ../spell.c:8381
-msgid "E763: Word characters differ between spell files"
-msgstr ""
+#~ msgid "Reading back spell file..."
+#~ msgstr ""
-#: ../spell.c:8684
-msgid "Sorry, no suggestions"
-msgstr ""
+#. Go through the trie of good words, soundfold each word and add it to
+#. the soundfold trie.
+#~ msgid "Performing soundfolding..."
+#~ msgstr ""
-#: ../spell.c:8687
-#, fuzzy, c-format
-msgid "Sorry, only %<PRId64> suggestions"
-msgstr " op %<PRId64> re๋ls"
+#, c-format
+#~ msgid "Number of words after soundfolding: %<PRId64>"
+#~ msgstr ""
+
+#, c-format
+#~ msgid "Total number of words: %d"
+#~ msgstr ""
-#. for when 'cmdheight' > 1
-#. avoid more prompt
-#: ../spell.c:8704
#, fuzzy, c-format
-msgid "Change \"%.*s\" to:"
-msgstr "Stoor veranderinge na \"%.*s\"?"
+#~ msgid "Writing suggestion file %s ..."
+#~ msgstr "Besig om viminfo l๊er \"%s\" te stoor"
-#: ../spell.c:8737
#, c-format
-msgid " < \"%.*s\""
-msgstr ""
+#~ msgid "Estimated runtime memory use: %d bytes"
+#~ msgstr ""
+
+#~ msgid "E751: Output file name must not have region name"
+#~ msgstr ""
-#: ../spell.c:8882
#, fuzzy
-msgid "E752: No previous spell replacement"
-msgstr "E35: Geen vorige patroon nie"
+#~ msgid "E754: Only up to 8 regions supported"
+#~ msgstr "E519: Opsie is nie ondersteun nie"
-#: ../spell.c:8925
#, fuzzy, c-format
-msgid "E753: Not found: %s"
-msgstr "E334: Kieslys nie gevind nie: %s"
+#~ msgid "E755: Invalid region in %s"
+#~ msgstr "E15: Ongeldige uitdrukking: %s"
+
+#~ msgid "Warning: both compounding and NOBREAK specified"
+#~ msgstr ""
-#: ../spell.c:9276
#, fuzzy, c-format
-msgid "E778: This does not look like a .sug file: %s"
-msgstr "E307: %s lyk nie soos 'n Vim ruill๊er nie"
+#~ msgid "Writing spell file %s ..."
+#~ msgstr "Besig om viminfo l๊er \"%s\" te stoor"
+
+#~ msgid "Done!"
+#~ msgstr ""
-#: ../spell.c:9282
#, c-format
-msgid "E779: Old .sug file, needs to be updated: %s"
-msgstr ""
+#~ msgid "E765: 'spellfile' does not have %<PRId64> entries"
+#~ msgstr ""
-#: ../spell.c:9286
#, c-format
-msgid "E780: .sug file is for newer version of Vim: %s"
-msgstr ""
+#~ msgid "Word '%.*s' removed from %s"
+#~ msgstr ""
-#: ../spell.c:9295
#, c-format
-msgid "E781: .sug file doesn't match .spl file: %s"
-msgstr ""
+#~ msgid "Word '%.*s' added to %s"
+#~ msgstr ""
-#: ../spell.c:9305
-#, fuzzy, c-format
-msgid "E782: error while reading .sug file: %s"
-msgstr "E47: Fout tydens lees van 'errorfile'"
+#~ msgid "E763: Word characters differ between spell files"
+#~ msgstr ""
#. This should have been checked when generating the .spl
#. file.
-#: ../spell.c:11575
-msgid "E783: duplicate char in MAP entry"
-msgstr ""
+#~ msgid "E783: duplicate char in MAP entry"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "E766: Insufficient arguments for printf()"
+#~ msgstr "E116: Ongeldige parameters vir funksie %s"
+
+#~ msgid "E807: Expected Float argument for printf()"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "E767: Too many arguments to printf()"
+#~ msgstr "E118: Te veel parameters vir funksie: %s"
-#: ../syntax.c:266
msgid "No Syntax items defined for this buffer"
msgstr "Geen Sintaks-items gedefinieer vir hierdie buffer nie"
-#: ../syntax.c:3083 ../syntax.c:3104 ../syntax.c:3127
#, c-format
msgid "E390: Illegal argument: %s"
msgstr "E390: Ongeldige parameter: %s"
-#: ../syntax.c:3299
+#~ msgid "syntax iskeyword "
+#~ msgstr ""
+
#, c-format
msgid "E391: No such syntax cluster: %s"
msgstr "E391: Geen sodanige sintakskluster nie: %s"
-#: ../syntax.c:3433
msgid "syncing on C-style comments"
msgstr "sinchroniseer met C-styl kommentaar"
-#: ../syntax.c:3439
msgid "no syncing"
msgstr "geen sinchronisering"
-#: ../syntax.c:3441
msgid "syncing starts "
msgstr "sinchronisasie begin "
-#: ../syntax.c:3443 ../syntax.c:3506
msgid " lines before top line"
msgstr " re๋ls voor boonste lyn"
-#: ../syntax.c:3448
msgid ""
"\n"
"--- Syntax sync items ---"
@@ -5771,7 +5156,6 @@ msgstr ""
"\n"
"--- Sintaks sync items ---"
-#: ../syntax.c:3452
msgid ""
"\n"
"syncing on items"
@@ -5779,7 +5163,6 @@ msgstr ""
"\n"
"sinchronisering met items"
-#: ../syntax.c:3457
msgid ""
"\n"
"--- Syntax items ---"
@@ -5787,275 +5170,216 @@ msgstr ""
"\n"
"--- Sintaks items ---"
-#: ../syntax.c:3475
#, c-format
msgid "E392: No such syntax cluster: %s"
msgstr "E392: Geen sodanige sintakskluster nie: %s"
-#: ../syntax.c:3497
msgid "minimal "
msgstr "minimaal "
-#: ../syntax.c:3503
msgid "maximal "
msgstr "maksimaal "
-#: ../syntax.c:3513
msgid "; match "
msgstr "; treffer "
-#: ../syntax.c:3515
msgid " line breaks"
msgstr " re๋l breuke"
-#: ../syntax.c:4076
msgid "E395: contains argument not accepted here"
msgstr "E395: bevat parameters nie hier aanvaar nie"
-#: ../syntax.c:4096
#, fuzzy
-msgid "E844: invalid cchar value"
-msgstr "E474: Ongeldige parameter"
+#~ msgid "E844: invalid cchar value"
+#~ msgstr "E474: Ongeldige parameter"
-#: ../syntax.c:4107
msgid "E393: group[t]here not accepted here"
msgstr "E393: 'group[t]here' nie hier aanvaar nie"
-#: ../syntax.c:4126
#, c-format
msgid "E394: Didn't find region item for %s"
msgstr "E394: Kon nie omgewingsitem vind vir %s nie"
-#: ../syntax.c:4188
msgid "E397: Filename required"
msgstr "E397: L๊ernaam benodig"
-#: ../syntax.c:4221
#, fuzzy
-msgid "E847: Too many syntax includes"
-msgstr "E77: Te veel l๊ername"
+#~ msgid "E847: Too many syntax includes"
+#~ msgstr "E77: Te veel l๊ername"
-#: ../syntax.c:4303
#, fuzzy, c-format
-msgid "E789: Missing ']': %s"
-msgstr "E398: Ontbrekende '=': %s"
+#~ msgid "E789: Missing ']': %s"
+#~ msgstr "E398: Ontbrekende '=': %s"
+
+#, fuzzy, c-format
+#~ msgid "E890: trailing char after ']': %s]%s"
+#~ msgstr "E488: Oorbodige karakters"
-#: ../syntax.c:4531
#, c-format
msgid "E398: Missing '=': %s"
msgstr "E398: Ontbrekende '=': %s"
-#: ../syntax.c:4666
#, c-format
msgid "E399: Not enough arguments: syntax region %s"
msgstr "E399: Nie genoeg parameters nie: sintaksomgewing %s"
-#: ../syntax.c:4870
#, fuzzy
-msgid "E848: Too many syntax clusters"
-msgstr "E391: Geen sodanige sintakskluster nie: %s"
+#~ msgid "E848: Too many syntax clusters"
+#~ msgstr "E391: Geen sodanige sintakskluster nie: %s"
-#: ../syntax.c:4954
msgid "E400: No cluster specified"
msgstr "E400: Geen kluster gespesifiseer nie"
#. end delimiter not found
-#: ../syntax.c:4986
#, c-format
msgid "E401: Pattern delimiter not found: %s"
msgstr "E401: Patroonbegrenser nie gevind nie: %s"
-#: ../syntax.c:5049
#, c-format
msgid "E402: Garbage after pattern: %s"
msgstr "E402: Gemors na patroon: %s"
-#: ../syntax.c:5120
msgid "E403: syntax sync: line continuations pattern specified twice"
msgstr "E403: sintaks sync: re๋lvoortgaanpatroon twee keer gespesifiseer"
-#: ../syntax.c:5169
#, c-format
msgid "E404: Illegal arguments: %s"
msgstr "E404: Ongeldige parameters: %s"
-#: ../syntax.c:5217
#, c-format
msgid "E405: Missing equal sign: %s"
msgstr "E405: Ontbrekende gelykaanteken: %s"
-#: ../syntax.c:5222
#, c-format
msgid "E406: Empty argument: %s"
msgstr "E406: Le๋ parameter: %s"
-#: ../syntax.c:5240
#, c-format
msgid "E407: %s not allowed here"
msgstr "E407: %s nie toegelaat hier nie"
-#: ../syntax.c:5246
#, c-format
msgid "E408: %s must be first in contains list"
msgstr "E408: %s moet v๓๓r in 'contains' lys wees"
-#: ../syntax.c:5304
#, c-format
msgid "E409: Unknown group name: %s"
msgstr "E409: Onbekende groepnaam: %s"
-#: ../syntax.c:5512
#, c-format
msgid "E410: Invalid :syntax subcommand: %s"
msgstr "E410: Ongeldige :syntax subbevel %s"
-#: ../syntax.c:5854
-msgid ""
-" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
-msgstr ""
+#~ msgid ""
+#~ " TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
+#~ msgstr ""
-#: ../syntax.c:6146
msgid "E679: recursive loop loading syncolor.vim"
msgstr "E679: rekursiewe lus gedurende laai van syncolor.vim"
-#: ../syntax.c:6256
#, c-format
msgid "E411: highlight group not found: %s"
msgstr "E411: uitliggroep nie gevind nie: %s"
-#: ../syntax.c:6278
#, c-format
msgid "E412: Not enough arguments: \":highlight link %s\""
msgstr "E412: Te min parameters: \":highlight link %s\""
-#: ../syntax.c:6284
#, c-format
msgid "E413: Too many arguments: \":highlight link %s\""
msgstr "E413: Te veel parameters: \":highlight link %s\""
-#: ../syntax.c:6302
msgid "E414: group has settings, highlight link ignored"
msgstr ""
"E414: groep het instellings, uitligskakel ('highlight link') ge๏gnoreer"
-#: ../syntax.c:6367
#, c-format
msgid "E415: unexpected equal sign: %s"
msgstr "E415: onverwagte gelykaanteken: %s"
-#: ../syntax.c:6395
#, c-format
msgid "E416: missing equal sign: %s"
msgstr "E416: ontbrekende gelykaanteken: %s"
-#: ../syntax.c:6418
#, c-format
msgid "E417: missing argument: %s"
msgstr "E417: ontbrekende parameter: %s"
-#: ../syntax.c:6446
#, c-format
msgid "E418: Illegal value: %s"
msgstr "E418: Ongeldige waarde: %s"
-#: ../syntax.c:6496
msgid "E419: FG color unknown"
msgstr "E419: FG kleur onbekend"
-#: ../syntax.c:6504
msgid "E420: BG color unknown"
msgstr "E420: BG kleur onbekend"
-#: ../syntax.c:6564
#, c-format
msgid "E421: Color name or number not recognized: %s"
msgstr "E421: Kleurnaam of -nommer nie herken nie: %s"
-#: ../syntax.c:6714
-#, c-format
-msgid "E422: terminal code too long: %s"
-msgstr "E422: terminaalkode te lank: %s"
-
-#: ../syntax.c:6753
#, c-format
msgid "E423: Illegal argument: %s"
msgstr "E423: Ongeldige parameter: %s"
-#: ../syntax.c:6925
msgid "E424: Too many different highlighting attributes in use"
msgstr "E424: Te veel verskillende uitlig-eienskappe in gebruik"
-#: ../syntax.c:7427
msgid "E669: Unprintable character in group name"
msgstr "E669: Onvertoonbare karakter in groepnaam"
-#: ../syntax.c:7434
msgid "W18: Invalid character in group name"
msgstr "W18: Ongeldige karakter groepnaam"
-#: ../syntax.c:7448
-msgid "E849: Too many highlight and syntax groups"
-msgstr ""
+#~ msgid "E849: Too many highlight and syntax groups"
+#~ msgstr ""
-#: ../tag.c:104
msgid "E555: at bottom of tag stack"
msgstr "E555: onderaan etiketstapel"
-#: ../tag.c:105
msgid "E556: at top of tag stack"
msgstr "E556: bo-aan etiketstapel"
-#: ../tag.c:380
msgid "E425: Cannot go before first matching tag"
msgstr "E425: Kan nie v๓๓r eerste etiket-treffer gaan nie"
-#: ../tag.c:504
#, c-format
msgid "E426: tag not found: %s"
msgstr "E426: etiket nie gevind nie: %s"
-#: ../tag.c:528
msgid " # pri kind tag"
msgstr " # pri tipe etiket"
-#: ../tag.c:531
msgid "file\n"
msgstr "l๊er\n"
-#: ../tag.c:829
msgid "E427: There is only one matching tag"
msgstr "E427: Daar is slegs een etiket-treffer"
-#: ../tag.c:831
msgid "E428: Cannot go beyond last matching tag"
msgstr "E428: Kan nie verby laaste etiket-treffer gaan nie"
-#: ../tag.c:850
#, c-format
msgid "File \"%s\" does not exist"
msgstr "L๊er \"%s\" bestaan nie"
#. Give an indication of the number of matching tags
-#: ../tag.c:859
#, c-format
msgid "tag %d of %d%s"
msgstr "etiket %d van %d%s"
-#: ../tag.c:862
msgid " or more"
msgstr " of meer"
-#: ../tag.c:864
msgid " Using tag with different case!"
msgstr " Gaan etiket met ander kas gebruik!"
-#: ../tag.c:909
#, c-format
msgid "E429: File \"%s\" does not exist"
msgstr "E429: L๊er \"%s\" bestaan nie"
#. Highlight title
-#: ../tag.c:960
msgid ""
"\n"
" # TO tag FROM line in file/text"
@@ -6063,275 +5387,173 @@ msgstr ""
"\n"
" # NA etiket VAN re๋l in l๊er/teks"
-#: ../tag.c:1303
#, c-format
msgid "Searching tags file %s"
msgstr "Deursoek etiketl๊er %s"
-#: ../tag.c:1545
-msgid "Ignoring long line in tags file"
-msgstr ""
+#~ msgid "Ignoring long line in tags file"
+#~ msgstr ""
-#: ../tag.c:1915
#, c-format
msgid "E431: Format error in tags file \"%s\""
msgstr "E431: Formaatfout in etiketl๊er \"%s\""
-#: ../tag.c:1917
#, c-format
msgid "Before byte %<PRId64>"
msgstr "Voor greep %<PRId64>"
-#: ../tag.c:1929
#, c-format
msgid "E432: Tags file not sorted: %s"
msgstr "E432: Etiketl๊er ongesorteer: %s"
#. never opened any tags file
-#: ../tag.c:1960
msgid "E433: No tags file"
msgstr "E433: Geen etiketl๊er nie"
-#: ../tag.c:2536
msgid "E434: Can't find tag pattern"
msgstr "E434: Kan nie etiketpatroon vind nie"
-#: ../tag.c:2544
msgid "E435: Couldn't find tag, just guessing!"
msgstr "E435: Kon nie etiket vind nie, ek raai maar!"
-#: ../tag.c:2797
#, fuzzy, c-format
-msgid "Duplicate field name: %s"
-msgstr "gelaaide fontnaam: %s"
-
-#: ../term.c:1442
-msgid "' not known. Available builtin terminals are:"
-msgstr "' onbekend. Beskikbare ingeboude terminale is:"
-
-#: ../term.c:1463
-msgid "defaulting to '"
-msgstr "gebruik verstek '"
-
-#: ../term.c:1731
-msgid "E557: Cannot open termcap file"
-msgstr "E557: Kan nie 'termcap'-l๊er oopmaak nie"
-
-#: ../term.c:1735
-msgid "E558: Terminal entry not found in terminfo"
-msgstr "E558: Terminaalinskrywing nie in 'terminfo' gevind nie"
-
-#: ../term.c:1737
-msgid "E559: Terminal entry not found in termcap"
-msgstr "E559: Terminaalinskrywing nie in 'termcap' gevind nie"
-
-#: ../term.c:1878
-#, c-format
-msgid "E436: No \"%s\" entry in termcap"
-msgstr "E436: Geen \"%s\" inskrywing in termcap nie"
-
-#: ../term.c:2249
-msgid "E437: terminal capability \"cm\" required"
-msgstr "E437: terminaalvermo๋ \"cm\" vereis"
-
-#. Highlight title
-#: ../term.c:4376
-msgid ""
-"\n"
-"--- Terminal keys ---"
-msgstr ""
-"\n"
-"--- Terminaal sleutels ---"
-
-#: ../ui.c:481
-msgid "Vim: Error reading input, exiting...\n"
-msgstr "Vim: Fout met lees van invoer, verlaat...\n"
+#~ msgid "Duplicate field name: %s"
+#~ msgstr "gelaaide fontnaam: %s"
#. This happens when the FileChangedRO autocommand changes the
#. * file in a way it becomes shorter.
-#: ../undo.c:379
-msgid "E881: Line count changed unexpectedly"
-msgstr ""
+#~ msgid "E881: Line count changed unexpectedly"
+#~ msgstr ""
-#: ../undo.c:627
#, fuzzy, c-format
-msgid "E828: Cannot open undo file for writing: %s"
-msgstr "E212: Kan l๊er nie oopmaak vir skryf nie"
+#~ msgid "E828: Cannot open undo file for writing: %s"
+#~ msgstr "E212: Kan l๊er nie oopmaak vir skryf nie"
+
+#, fuzzy, c-format
+#~ msgid "E5003: Unable to create directory \"%s\" for undo file: %s"
+#~ msgstr "E346: Geen gids \"%s\" meer gevind in 'cdpath' nie"
-#: ../undo.c:717
#, c-format
-msgid "E825: Corrupted undo file (%s): %s"
-msgstr ""
+#~ msgid "E825: Corrupted undo file (%s): %s"
+#~ msgstr ""
-#: ../undo.c:1039
-msgid "Cannot write undo file in any directory in 'undodir'"
-msgstr ""
+#~ msgid "Cannot write undo file in any directory in 'undodir'"
+#~ msgstr ""
-#: ../undo.c:1074
#, c-format
-msgid "Will not overwrite with undo file, cannot read: %s"
-msgstr ""
+#~ msgid "Will not overwrite with undo file, cannot read: %s"
+#~ msgstr ""
-#: ../undo.c:1092
#, c-format
-msgid "Will not overwrite, this is not an undo file: %s"
-msgstr ""
+#~ msgid "Will not overwrite, this is not an undo file: %s"
+#~ msgstr ""
-#: ../undo.c:1108
-msgid "Skipping undo file write, nothing to undo"
-msgstr ""
+#~ msgid "Skipping undo file write, nothing to undo"
+#~ msgstr ""
-#: ../undo.c:1121
#, fuzzy, c-format
-msgid "Writing undo file: %s"
-msgstr "Besig om viminfo l๊er \"%s\" te stoor"
+#~ msgid "Writing undo file: %s"
+#~ msgstr "Besig om viminfo l๊er \"%s\" te stoor"
-#: ../undo.c:1213
#, fuzzy, c-format
-msgid "E829: write error in undo file: %s"
-msgstr "E297: Skryffout in ruill๊er"
+#~ msgid "E829: write error in undo file: %s"
+#~ msgstr "E297: Skryffout in ruill๊er"
-#: ../undo.c:1280
#, c-format
-msgid "Not reading undo file, owner differs: %s"
-msgstr ""
+#~ msgid "Not reading undo file, owner differs: %s"
+#~ msgstr ""
-#: ../undo.c:1292
#, fuzzy, c-format
-msgid "Reading undo file: %s"
-msgstr "Besig om viminfo l๊er \"%s\"%s%s%s te lees"
+#~ msgid "Reading undo file: %s"
+#~ msgstr "Besig om viminfo l๊er \"%s\"%s%s%s te lees"
-#: ../undo.c:1299
#, fuzzy, c-format
-msgid "E822: Cannot open undo file for reading: %s"
-msgstr "E195: Kan 'viminfo' l๊er nie oopmaak om te lees nie"
+#~ msgid "E822: Cannot open undo file for reading: %s"
+#~ msgstr "E195: Kan 'viminfo' l๊er nie oopmaak om te lees nie"
-#: ../undo.c:1308
#, fuzzy, c-format
-msgid "E823: Not an undo file: %s"
-msgstr "E484: Kan nie l๊er %s oopmaak nie"
+#~ msgid "E823: Not an undo file: %s"
+#~ msgstr "E484: Kan nie l๊er %s oopmaak nie"
-#: ../undo.c:1313
#, fuzzy, c-format
-msgid "E824: Incompatible undo file: %s"
-msgstr "E484: Kan nie l๊er %s oopmaak nie"
+#~ msgid "E824: Incompatible undo file: %s"
+#~ msgstr "E484: Kan nie l๊er %s oopmaak nie"
-#: ../undo.c:1328
-msgid "File contents changed, cannot use undo info"
-msgstr ""
+#~ msgid "File contents changed, cannot use undo info"
+#~ msgstr ""
-#: ../undo.c:1497
#, fuzzy, c-format
-msgid "Finished reading undo file %s"
-msgstr "%s klaar uitgevoer"
+#~ msgid "Finished reading undo file %s"
+#~ msgstr "%s klaar uitgevoer"
-#: ../undo.c:1586 ../undo.c:1812
-msgid "Already at oldest change"
-msgstr ""
+#~ msgid "Already at oldest change"
+#~ msgstr ""
-#: ../undo.c:1597 ../undo.c:1814
-msgid "Already at newest change"
-msgstr ""
+#~ msgid "Already at newest change"
+#~ msgstr ""
-#: ../undo.c:1806
#, fuzzy, c-format
-msgid "E830: Undo number %<PRId64> not found"
-msgstr "E92: buffer %<PRId64> kon nie gevind word nie"
+#~ msgid "E830: Undo number %<PRId64> not found"
+#~ msgstr "E92: buffer %<PRId64> kon nie gevind word nie"
-#: ../undo.c:1979
msgid "E438: u_undo: line numbers wrong"
msgstr "E438: u_undo: re๋lnommers foutief"
-#: ../undo.c:2183
#, fuzzy
-msgid "more line"
-msgstr "1 re๋l meer"
+#~ msgid "more line"
+#~ msgstr "1 re๋l meer"
-#: ../undo.c:2185
#, fuzzy
-msgid "more lines"
-msgstr "1 re๋l meer"
+#~ msgid "more lines"
+#~ msgstr "1 re๋l meer"
-#: ../undo.c:2187
#, fuzzy
-msgid "line less"
-msgstr "1 re๋l minder"
+#~ msgid "line less"
+#~ msgstr "1 re๋l minder"
-#: ../undo.c:2189
#, fuzzy
-msgid "fewer lines"
-msgstr "%<PRId64> minder re๋ls"
+#~ msgid "fewer lines"
+#~ msgstr "%<PRId64> minder re๋ls"
-#: ../undo.c:2193
#, fuzzy
-msgid "change"
-msgstr "1 verandering"
+#~ msgid "change"
+#~ msgstr "1 verandering"
-#: ../undo.c:2195
#, fuzzy
-msgid "changes"
-msgstr "1 verandering"
+#~ msgid "changes"
+#~ msgstr "1 verandering"
-#: ../undo.c:2225
#, fuzzy, c-format
-msgid "%<PRId64> %s; %s #%<PRId64> %s"
-msgstr "%<PRId64>R, %<PRId64>K"
+#~ msgid "%<PRId64> %s; %s #%<PRId64> %s"
+#~ msgstr "%<PRId64>R, %<PRId64>K"
-#: ../undo.c:2228
-msgid "before"
-msgstr ""
+#~ msgid "after"
+#~ msgstr ""
-#: ../undo.c:2228
-msgid "after"
-msgstr ""
+#~ msgid "before"
+#~ msgstr ""
-#: ../undo.c:2325
#, fuzzy
-msgid "Nothing to undo"
-msgstr "Geen binding gevind nie"
+#~ msgid "Nothing to undo"
+#~ msgstr "Geen binding gevind nie"
-#: ../undo.c:2330
-msgid "number changes when saved"
-msgstr ""
+#~ msgid "number changes when saved"
+#~ msgstr ""
-#: ../undo.c:2360
#, fuzzy, c-format
-msgid "%<PRId64> seconds ago"
-msgstr "%<PRId64> Kolomme; "
+#~ msgid "%<PRId64> seconds ago"
+#~ msgstr "%<PRId64> Kolomme; "
-#: ../undo.c:2372
#, fuzzy
-msgid "E790: undojoin is not allowed after undo"
-msgstr "E407: %s nie toegelaat hier nie"
+#~ msgid "E790: undojoin is not allowed after undo"
+#~ msgstr "E407: %s nie toegelaat hier nie"
-#: ../undo.c:2466
msgid "E439: undo list corrupt"
msgstr "E439: herstellys korrup"
-#: ../undo.c:2495
msgid "E440: undo line missing"
msgstr "E440: herstelre๋l ontbreek"
-#: ../version.c:600
-msgid ""
-"\n"
-"Included patches: "
-msgstr ""
-"\n"
-"Ingeslote laslappies:"
-
-#: ../version.c:627
-#, fuzzy
-msgid ""
-"\n"
-"Extra patches: "
-msgstr "Eksterne subtreffers:\n"
-
-#: ../version.c:639 ../version.c:864
-msgid "Modified by "
-msgstr "Gewysig deur "
-
-#: ../version.c:646
msgid ""
"\n"
"Compiled "
@@ -6339,933 +5561,919 @@ msgstr ""
"\n"
"Gekompileer op "
-#: ../version.c:649
msgid "by "
msgstr "deur "
-#: ../version.c:660
-msgid ""
-"\n"
-"Huge version "
-msgstr ""
-"\n"
-"Enorme weergawe "
-
-#: ../version.c:661
-msgid "without GUI."
-msgstr "sonder GUI."
-
-#: ../version.c:662
-msgid " Features included (+) or not (-):\n"
-msgstr " Kenmerke in- (+) of uitgesluit (-):\n"
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ "Features: "
+#~ msgstr ""
-#: ../version.c:667
msgid " system vimrc file: \""
msgstr " stelsel vimrc-l๊er: \""
-#: ../version.c:672
-msgid " user vimrc file: \""
-msgstr " gebruiker vimrc-l๊er: \""
-
-#: ../version.c:677
-msgid " 2nd user vimrc file: \""
-msgstr " 2de gebruiker vimrc-l๊er \""
-
-#: ../version.c:682
-msgid " 3rd user vimrc file: \""
-msgstr " 3de gebruiker vimrc-l๊er \""
-
-#: ../version.c:687
-msgid " user exrc file: \""
-msgstr " gebruiker exrc-l๊er: \""
-
-#: ../version.c:692
-msgid " 2nd user exrc file: \""
-msgstr " 2de gebruiker exrc-l๊er: \""
-
-#: ../version.c:699
msgid " fall-back for $VIM: \""
msgstr " bystand vir $VIM: \""
-#: ../version.c:705
msgid " f-b for $VIMRUNTIME: \""
msgstr " bystand vir $VIMRUNTIME: \""
-#: ../version.c:709
-msgid "Compilation: "
-msgstr "Kompilering: "
-
-#: ../version.c:712
-msgid "Linking: "
-msgstr "Koppeling: "
+#, fuzzy
+#~ msgid "Nvim is open source and freely distributable"
+#~ msgstr "Vim is vryekode, en vrylik verspreibaar"
-#: ../version.c:717
-msgid " DEBUG BUILD"
-msgstr " ONTFOUTINGS-KOMPILERING"
+#~ msgid "https://neovim.io/community"
+#~ msgstr ""
-#: ../version.c:767
-msgid "VIM - Vi IMproved"
-msgstr "VIM - Vi Met skop"
+#, fuzzy
+#~ msgid "type :help nvim<Enter> if you are new! "
+#~ msgstr "tik :help uganda<Enter> as jy hou van Vim "
-# njj: :))
-#: ../version.c:769
-msgid "version "
-msgstr "Weergawe "
+#, fuzzy
+#~ msgid "type :checkhealth<Enter> to optimize Nvim"
+#~ msgstr "Tik :quit<Enter> om Vim te verlaat"
-#: ../version.c:770
-msgid "by Bram Moolenaar et al."
-msgstr "deur Bram Moolenaar et al."
+msgid "type :q<Enter> to exit "
+msgstr "tik :q<Enter> om program verlaat "
-#: ../version.c:774
-msgid "Vim is open source and freely distributable"
-msgstr "Vim is vryekode, en vrylik verspreibaar"
+#, fuzzy
+#~ msgid "type :help<Enter> for help "
+#~ msgstr "tik :q<Enter> om program verlaat "
-#: ../version.c:776
msgid "Help poor children in Uganda!"
msgstr "Help arm kinders in Uganda!"
-#: ../version.c:777
msgid "type :help iccf<Enter> for information "
msgstr "tik :help iccf<Enter> vir meer inligting hieroor "
-#: ../version.c:779
-msgid "type :q<Enter> to exit "
-msgstr "tik :q<Enter> om program verlaat "
-
-#: ../version.c:780
-msgid "type :help<Enter> or <F1> for on-line help"
-msgstr "tik :help<Enter> of <F1> vir aanlyn hulp "
-
-#: ../version.c:781
-msgid "type :help version7<Enter> for version info"
-msgstr "tik :help version7<Enter> vir weergawe-inligting"
-
-#: ../version.c:784
-msgid "Running in Vi compatible mode"
-msgstr "Voer tans uit in Vi-versoenbare modus"
-
-#: ../version.c:785
-msgid "type :set nocp<Enter> for Vim defaults"
-msgstr "tik :set nocp<Enter> vir Vim verstekwaardes "
-
-#: ../version.c:786
-msgid "type :help cp-default<Enter> for info on this"
-msgstr "tik :help cp-default<Enter> vir meer inligting hieroor"
-
-#: ../version.c:827
msgid "Sponsor Vim development!"
msgstr "Borg Vim ontwikkeling!"
-#: ../version.c:828
msgid "Become a registered Vim user!"
msgstr "Word 'n geregistreerde Vim gebruiker!"
-#: ../version.c:831
msgid "type :help sponsor<Enter> for information "
msgstr "tik :help sponsor<Enter> vir meer inligting hieroor "
-#: ../version.c:832
msgid "type :help register<Enter> for information "
msgstr "tik :help register<Enter> vir meer inligting hieroor "
-#: ../version.c:834
msgid "menu Help->Sponsor/Register for information "
msgstr "menu Hulp->Borg/Registreer vir meer inligting"
-#: ../window.c:119
msgid "Already only one window"
msgstr "Daar is alreeds slegs een venster"
-#: ../window.c:224
msgid "E441: There is no preview window"
msgstr "E441: Daar is nie 'n voorskou-venster nie"
-#: ../window.c:559
msgid "E442: Can't split topleft and botright at the same time"
msgstr "E442: Kan nie bo-links en onder-regs terselfdertyd verdeel nie"
-#: ../window.c:1228
msgid "E443: Cannot rotate when another window is split"
msgstr "E443: Kan nie roteer terwyl 'n ander venster verdeel is nie"
-#: ../window.c:1803
msgid "E444: Cannot close last window"
msgstr "E444: Kan nie laaste venster toemaak nie"
-#: ../window.c:1810
#, fuzzy
-msgid "E813: Cannot close autocmd window"
-msgstr "E444: Kan nie laaste venster toemaak nie"
+#~ msgid "E813: Cannot close autocmd window"
+#~ msgstr "E444: Kan nie laaste venster toemaak nie"
-#: ../window.c:1814
#, fuzzy
-msgid "E814: Cannot close window, only autocmd window would remain"
-msgstr "E444: Kan nie laaste venster toemaak nie"
+#~ msgid "E814: Cannot close window, only autocmd window would remain"
+#~ msgstr "E444: Kan nie laaste venster toemaak nie"
-#: ../window.c:2717
msgid "E445: Other window contains changes"
msgstr "E445: Die ander venster bevat veranderinge"
-#: ../window.c:4805
msgid "E446: No file name under cursor"
msgstr "E446: Geen l๊ernaam onder loper"
-#~ msgid "[Error List]"
-#~ msgstr "[Foutlys]"
-
-#~ msgid "[No File]"
-#~ msgstr "[Geen l๊er]"
+#, c-format
+#~ msgid "E799: Invalid ID: %<PRId64> (must be greater than or equal to 1)"
+#~ msgstr ""
-#~ msgid "Patch file"
-#~ msgstr "Laslap l๊er"
+#, fuzzy, c-format
+#~ msgid "E801: ID already taken: %<PRId64>"
+#~ msgstr "E157: Ongeldige teken ID: %<PRId64>"
-#~ msgid "E106: Unknown variable: \"%s\""
-#~ msgstr "E106: Onbekende veranderlike: \"%s\""
+#, fuzzy
+#~ msgid "List or number required"
+#~ msgstr "E471: Parameter benodig"
-#~ msgid ""
-#~ "&OK\n"
-#~ "&Cancel"
+#, c-format
+#~ msgid "E802: Invalid ID: %<PRId64> (must be greater than or equal to 1)"
#~ msgstr ""
-#~ "&OK\n"
-#~ "&Kanselleer"
-#~ msgid "E240: No connection to Vim server"
-#~ msgstr "E240: Geen verbinding met Vim bediener"
-
-#~ msgid "E277: Unable to read a server reply"
-#~ msgstr "E277: Kon bediener-terugvoer nie lees nie"
+#, fuzzy, c-format
+#~ msgid "E803: ID not found: %<PRId64>"
+#~ msgstr "E320: Kan nie re๋l %<PRId64> vind nie"
-#~ msgid "E241: Unable to send to %s"
-#~ msgstr "E241: Kan nie na %s stuur nie"
+#~ msgid "WARNING: tag command changed a buffer!!!"
+#~ msgstr "WAARSKUWING: etiketbevel het buffer verander!!!"
-#~ msgid "E130: Undefined function: %s"
-#~ msgstr "E130: Ongedefinieerde funksie: %s"
+#~ msgid "Leave: %s"
+#~ msgstr "Verlaat: %s"
-#~ msgid "Save As"
-#~ msgstr "Stoor As"
+#~ msgid "File name '%s' is valid"
+#~ msgstr "l๊ernaam '%s is ongeldig"
-#~ msgid "Source Vim script"
-#~ msgstr "Voer Vim skrip uit"
+#~ msgid "Not a proper file name: '%s'"
+#~ msgstr "Nie 'n geldige l๊ernaam nie: '%s'"
-#~ msgid "Edit File"
-#~ msgstr "Verander l๊er"
+#~ msgid "Change dir debugging enabled."
+#~ msgstr "Verandergids ontfouting in staat gestel"
-#~ msgid " (NOT FOUND)"
-#~ msgstr " (NIE GEVIND NIE)"
+#~ msgid "Warning: %s option changed from modeline"
+#~ msgstr "Waarskuwing: %s opsie verander vanaf moduslyn"
-#~ msgid "Edit File in new window"
-#~ msgstr "Bewerk l๊er in nuwe venster"
+#~ msgid "Security error: shell command output is a symbolic link"
+#~ msgstr "Sekuriteitsfout: Dop-bevel afvoer is 'n simboliese skakel"
-#~ msgid "Append File"
-#~ msgstr "Las aan by l๊er"
+#~ msgid "No fold at this line"
+#~ msgstr "Geen vou by hierdie re๋l nie"
-#~ msgid "Window position: X %d, Y %d"
-#~ msgstr "Vensterposisie: X %d, Y %d"
+#~ msgid "Fold must be at least two lines"
+#~ msgstr "'n Vou moet ten minste 2 re๋ls wees"
-#~ msgid "Save Redirection"
-#~ msgstr "Stoor Herversturing"
+#~ msgid "Security error: filter input is a symbolic link: %s"
+#~ msgstr "Sekuriteitsfout: filter invoer is 'n simboliese skakel"
-#~ msgid "Save View"
-#~ msgstr "Stoor Oorsig"
+#~ msgid "Security error: 'charconvert' output is a symbolic link"
+#~ msgstr "Sekuriteitsfout: 'charconvert' afvoer is 'n simboliese skakel"
-#~ msgid "Save Session"
-#~ msgstr "Stoor Sessie"
+#~ msgid "Security error: filter output is a symbolic link: %s"
+#~ msgstr "Sekuriteitsfout: filter afvoer is 'n simboliese skakel"
-#~ msgid "Save Setup"
-#~ msgstr "Stoor konfigurasie"
+#~ msgid "makeef option not set"
+#~ msgstr "'makeef' opsie nie aan nie"
-#~ msgid "E196: No digraphs in this version"
-#~ msgstr "E196: Geen digrawe in hierdie weergawe nie"
+#~ msgid "line ~%<PRId64>: %s"
+#~ msgstr "re๋l ~%<PRId64>: %s"
-#~ msgid "[NL found]"
-#~ msgstr "[NL gevind]"
+#~ msgid "Security error: new viminfo file is a symbolic link"
+#~ msgstr "Sekuriteitsfout: nuwe viminfo l๊er is a simboliese skakel"
-#~ msgid "[crypted]"
-#~ msgstr "[gekodeer]"
+#~ msgid " PPC has a much better architecture. "
+#~ msgstr " PPC het 'n veel beter argitektuur. "
-#~ msgid "[CONVERSION ERROR]"
-#~ msgstr "[OMSETTINGSFOUT]"
+#~ msgid " WARNING: Intel CPU detected. "
+#~ msgstr " WAARSKUWING: Intel SVE bespeur. "
-#~ msgid "NetBeans disallows writes of unmodified buffers"
-#~ msgstr "NetBeans laat nie skryf toe van onveranderde buffers nie"
+#~ msgid "Unexpected magic character; check META."
+#~ msgstr "Onverwagte toorkarakter; kyk na META."
-#~ msgid "Partial writes disallowed for NetBeans buffers"
-#~ msgstr "Gedeeltelike skryf word nie toegelaat vir NetBeans buffers nie"
+#~ msgid "\\* follows nothing"
+#~ msgstr "\\* volg niks"
-#~ msgid "E460: The resource fork would be lost (add ! to override)"
-#~ msgstr "E460: Die hulpbronvurk sal verlore gaan (gebruik ! om te dwing)"
+#~ msgid "\\{ follows nothing"
+#~ msgstr "\\{ volg niks"
-#~ msgid "<cannot open> "
-#~ msgstr "<kan nie oopmaak nie> "
+#~ msgid "\\@ follows nothing"
+#~ msgstr "\\@ volg niks"
-#~ msgid "E616: vim_SelFile: can't get font %s"
-#~ msgstr "E616: 'vim_SelFile': kan font %s nie kry nie"
+#~ msgid "\\+ follows nothing"
+#~ msgstr "\\+ volg niks"
-#~ msgid "E614: vim_SelFile: can't return to current directory"
-#~ msgstr "E614: 'vim_SelFile': Kan nie terugkeer na huidige gids nie"
+#~ msgid "\\= follows nothing"
+#~ msgstr "\\= volg niks"
-#~ msgid "Pathname:"
-#~ msgstr "Gidsnaam:"
+#~ msgid "Nested *, \\=, \\+, \\! or \\{"
+#~ msgstr "Geneste *, \\=, \\+, \\! of \\{"
-#~ msgid "E615: vim_SelFile: can't get current directory"
-#~ msgstr "E615: vim_SelFile: Kan nie huidige gids verkry nie"
+#~ msgid "Unmatched \\("
+#~ msgstr "Onpaar \\("
-#~ msgid "OK"
-#~ msgstr "OK"
+#~ msgid "Too many \\("
+#~ msgstr "Te veel \\("
-#~ msgid "Cancel"
-#~ msgstr "Kanselleer"
+#~ msgid "Ambiguous mapping, conflicts with \"%s\""
+#~ msgstr "Dubbelsinnige binding, bots met \"%s\""
-#~ msgid "Vim dialog"
-#~ msgstr "Vim dialooghokkie"
+#~ msgid "Ambiguous mapping"
+#~ msgstr "Dubbelsinnige binding"
-#~ msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
-#~ msgstr ""
-#~ "Rolstaafelement: Kon nie pikselmatriks-duimnael se geometrie kry nie"
+#~ msgid "Command too long"
+#~ msgstr "Bevel te lank"
-#~ msgid "E232: Cannot create BalloonEval with both message and callback"
-#~ msgstr "E232: Kan nie BalloonEval skep met beide boodskap en terugroep nie"
+#~ msgid "GUI is not running"
+#~ msgstr "GUI voer nie uit nie"
-#~ msgid "E229: Cannot start the GUI"
-#~ msgstr "E229: Kan nie die GUI begin nie"
+#~ msgid "Cannot clear all highlight groups"
+#~ msgstr "Kan nie alle uitliggroepe leegmaak nie"
-#~ msgid "E230: Cannot read from \"%s\""
-#~ msgstr "E230: Kan nie lees uit \"%s\" nie"
+#~ msgid "Library call failed"
+#~ msgstr "Biblioteekfunksieroep het gefaal"
-#~ msgid "E665: Cannot start GUI, no valid font found"
-#~ msgstr "E665: Kan nie GUI begin nie, geen geldige font gevind nie"
+#~ msgid "some"
+#~ msgstr "sommige"
-#~ msgid "E231: 'guifontwide' invalid"
-#~ msgstr "E231: 'guifontwide' ongeldig"
+#~ msgid "deadly signal"
+#~ msgstr "dodelike sein"
-#~ msgid "E599: Value of 'imactivatekey' is invalid"
-#~ msgstr "E599: Waarde van 'imactivatekey' is ongeldig"
+#~ msgid "Unsupported screen mode"
+#~ msgstr "Ongesteunde skermmodus"
-#~ msgid "E254: Cannot allocate color %s"
-#~ msgstr "E254: Kan nie kleur %s toeken nie"
+#~ msgid "PC (16 bits Vim)"
+#~ msgstr "PC (16 bisse Vim)"
-#~ msgid "Vim dialog..."
-#~ msgstr "Vim dialooghokkie..."
+#~ msgid "PC (32 bits Vim)"
+#~ msgstr "PC (32 bisse Vim)"
-#~ msgid "Input _Methods"
-#~ msgstr "Invoer _Metodes"
+#~ msgid "Out of memory"
+#~ msgstr "Geheue op"
-#~ msgid "VIM - Search and Replace..."
-#~ msgstr "VIM - Soek en Vervang..."
+#~ msgid "Sorry, deleting a menu is not possible in the Athena version"
+#~ msgstr ""
+#~ "Jammer, in die Athena weergawe is dit onmoontlik om 'n kieslys te skrap"
-#~ msgid "VIM - Search..."
-#~ msgstr "VIM - Soek..."
+#~ msgid "Can't create input context."
+#~ msgstr "Kan nie invoerkonteks skep nie."
-#~ msgid "Find what:"
-#~ msgstr "Soek na:"
+#~ msgid "Unrecognized sniff request [%s]"
+#~ msgstr "Onbekende sniff versoek [%s]"
-#~ msgid "Replace with:"
-#~ msgstr "Vervang met:"
+#~ msgid "-- SNiFF+ commands --"
+#~ msgstr "-- SNiFF+ bevele --"
-#~ msgid "Match whole word only"
-#~ msgstr "Tref slegs presiese woord"
+#~ msgid "Retrieve next symbol"
+#~ msgstr "Kry volgende simbool"
-#~ msgid "Match case"
-#~ msgstr "Tref kas"
+#~ msgid "cs_add_common: alloc fail #4"
+#~ msgstr "'cs_add_common': toeken onsuksesvol #4"
-#~ msgid "Direction"
-#~ msgstr "Rigting"
+#~ msgid "cs_add_common: alloc fail #3"
+#~ msgstr "'cs_add_common': toeken onsuksesvol #3"
-#~ msgid "Up"
-#~ msgstr "Op"
+#~ msgid "cs_add_common: alloc fail #2"
+#~ msgstr "'cs_add_common': toeken onsuksesvol #2"
-#~ msgid "Down"
-#~ msgstr "Af"
+#~ msgid "cs_add_common: alloc fail #1"
+#~ msgstr "'cs_add_common': toeken onsuksesvol #1"
-#~ msgid "Find Next"
-#~ msgstr "Vind volgende"
+#~ msgid "automata ERROR: internal"
+#~ msgstr "automata FOUT: intern"
-#~ msgid "Replace"
-#~ msgstr "Vervang"
+#~ msgid "Your language Font missing"
+#~ msgstr "Jou taal Font ontbreek"
-#~ msgid "Replace All"
-#~ msgstr "Vervang alles"
+#~ msgid "fontset name: %s"
+#~ msgstr "fontstel naam: %s"
-#~ msgid "Vim: Received \"die\" request from session manager\n"
-#~ msgstr "Vim: Het die \"die\" opdrag ontvang van sessiebestuurder\n"
+#~ msgid " sh : export LANG=ko"
+#~ msgstr " sh: export LANG=af"
-#~ msgid "Vim: Main window unexpectedly destroyed\n"
-#~ msgstr "Vim: Hoofvenster onverwags verwoes\n"
+#~ msgid " csh: setenv LANG ko"
+#~ msgstr " csh: setenv LANG af"
-#~ msgid "Font Selection"
-#~ msgstr "Fontkeuse"
+#~ msgid "For korean:"
+#~ msgstr "Vir Afrikaans:"
-#~ msgid "Used CUT_BUFFER0 instead of empty selection"
-#~ msgstr "'CUT_BUFFER0' is gebruik in plaas van le๋ seleksie"
+#~ msgid "locale is not set correctly"
+#~ msgstr "lokaal is nie korrek gestel nie"
-#~ msgid "Filter"
-#~ msgstr "Filter"
+#~ msgid "Error: During loading fontset %s"
+#~ msgstr "Fout: Gedurende die laai van fontstel %s"
-#~ msgid "Directories"
-#~ msgstr "Gidse"
+#~ msgid "Topic:"
+#~ msgstr "Onderwerp:"
-#~ msgid "Help"
-#~ msgstr "Hulp"
+#~ msgid "VIM - Help on..."
+#~ msgstr "VIM - Hulp met.."
-#~ msgid "Files"
-#~ msgstr "L๊ers"
+#~ msgid "Cannot use :normal from event handler"
+#~ msgstr "Kan ':normal' nie vanuit gebeurtenishanteerder gebruik nie"
-#~ msgid "Selection"
-#~ msgstr "Seleksie"
+#~ msgid "Invalid line number: %<PRId64>"
+#~ msgstr "Ongeldige re๋lnommer: %<PRId64>"
-#~ msgid "Undo"
-#~ msgstr "Herroep"
+#~ msgid "Missing filename"
+#~ msgstr "Ontbrekende l๊ernaam"
-#~ msgid "E671: Cannot find window title \"%s\""
-#~ msgstr "E671: Kan nie venster titel vind nie \"%s\""
+#~ msgid "No servers found for this display"
+#~ msgstr "Geen bedieners gevind vir die 'display' nie"
-#~ msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
-#~ msgstr "E243: Parameter nie bekend: \"-%s\"; Gebruik die OLE weergawe."
+#~ msgid "E258: no matches found in cscope connections"
+#~ msgstr "E258: geen treffers gevind in 'cscope' verbindings nie"
-#~ msgid "E672: Unable to open window inside MDI application"
-#~ msgstr "E672: Kon nie venster oopmaak binne 'n MDI toepassing nie"
+#~ msgid "Binary tag search"
+#~ msgstr "Bin๊re etiketsoek"
-#~ msgid "Find string (use '\\\\' to find a '\\')"
-#~ msgstr "Vind string (gebruik '\\\\' om 'n '\\' te vind"
+#~ msgid "Linear tag search"
+#~ msgstr "Lini๊re etiketsoek"
-#~ msgid "Find & Replace (use '\\\\' to find a '\\')"
-#~ msgstr "Vind & vervang string (gebruik '\\\\' om 'n '\\' te vind"
+#~ msgid " LINE"
+#~ msgstr " REหL"
-#~ msgid ""
-#~ "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
-#~ msgstr ""
-#~ "Vim E458: Kan nie kleurkaart-inskrywing toeken nie, sommige kleure mag "
-#~ "verkeerd wees"
+#~ msgid " BLOCK"
+#~ msgstr " BLOK"
-#~ msgid "E250: Fonts for the following charsets are missing in fontset %s:"
-#~ msgstr ""
-#~ "E250: Fonte vir die volgende karakterstelle ontbreek in fontversameling "
-#~ "%s:"
+#~ msgid "%<PRId64> lines ~ed"
+#~ msgstr "%<PRId64> re๋ls ge-~"
-#~ msgid "E252: Fontset name: %s"
-#~ msgstr "E252: Fontstel naam: %s"
+#~ msgid "1 line ~ed"
+#~ msgstr "1 re๋l ge-~"
-#~ msgid "Font '%s' is not fixed-width"
-#~ msgstr "Font '%s' is nie 'n vaste-wydte font nie"
+#~ msgid "--help\t\tShow Gnome arguments"
+#~ msgstr "--help\t\tWys Gnome parameters"
-#~ msgid "E253: Fontset name: %s\n"
-#~ msgstr "E253: Fonstel naam: %s\n"
+#~ msgid "\"\n"
+#~ msgstr "\"\n"
-#~ msgid "Font0: %s\n"
-#~ msgstr "Font0: %s\n"
+#~ msgid "E249: couldn't read VIM instance registry property"
+#~ msgstr "E249: kon nie VIM instansie register-kenmerk lees nie"
-#~ msgid "Font1: %s\n"
-#~ msgstr "Font1: %s\n"
+#~ msgid "%2d %-5ld %-34s <none>\n"
+#~ msgstr "%2d %-5ld %-34s <geen>\n"
-#~ msgid "Font%<PRId64> width is not twice that of font0\n"
-#~ msgstr "Font%<PRId64> wydte is nie twee keer dํe van font0 nie\n"
+# njj: dalk 'verbinding' ipv 'verbinding' orals?
+#~ msgid "couldn't malloc\n"
+#~ msgstr "kon nie 'malloc' nie\n"
-#~ msgid "Font0 width: %<PRId64>\n"
-#~ msgstr "Font0 wydte: %<PRId64>\n"
+#~ msgid "E260: cscope connection not found"
+#~ msgstr "E260: 'cscope' verbinding nie gevind nie"
-#~ msgid ""
-#~ "Font1 width: %<PRId64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "Font1 wydte: %<PRId64>\n"
-#~ "\n"
+#~ msgid "error reading cscope connection %d"
+#~ msgstr "'cscope' verbinding %d kon nie gelees word nie"
-#~ msgid "E256: Hangul automata ERROR"
-#~ msgstr "E256: Hangul outomatiserings FOUT"
+#~ msgid "Run Macro"
+#~ msgstr "Voer Makro uit"
-#~ msgid "E563: stat error"
-#~ msgstr "E563: 'stat' fout"
+#~ msgid "function "
+#~ msgstr "funksie "
-#~ msgid "E625: cannot open cscope database: %s"
-#~ msgstr "E625: Kon nie 'cscope' databasis oopmaak nie: %s"
+#~ msgid "E463: Region is guarded, cannot modify"
+#~ msgstr "E463: Omgewing is onder bewaking, kan nie verander nie"
-#~ msgid "E626: cannot get cscope database information"
-#~ msgstr "E626: kan nie 'cscope' databasisinligting kry nie"
+#~ msgid "E233: cannot open display"
+#~ msgstr "E233: kan nie vertoonskerm oopmaak nie"
-#~ msgid "E569: maximum number of cscope connections reached"
-#~ msgstr "E569: maksimum aantal 'cscope' verbindings bereik"
+#~ msgid "E247: no registered server named \"%s\""
+#~ msgstr "E247: geen geregistreerde bediener genaamd \"%s\""
-#~ msgid ""
-#~ "E263: Sorry, this command is disabled, the Python library could not be "
-#~ "loaded."
+#~ msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
#~ msgstr ""
-#~ "E263: Jammer, hierdie bevel is afgeskakel, die Python biblioteek l๊er kon "
-#~ "nie gelaai word nie."
+#~ "E800: Arabies kan nie gebruik word nie: Nie tydens kompilering gekies "
+#~ "nie\n"
-#~ msgid "E659: Cannot invoke Python recursively"
-#~ msgstr "E659: Kan nie Python rekursief roep nie"
+#~ msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
+#~ msgstr ""
+#~ "E27: Farsi kan nie gebruik word nie: Nie tydens kompilering gekies nie\n"
-#~ msgid "can't delete OutputObject attributes"
-#~ msgstr "kan nie 'OutputObject' eienskappe skrap nie"
+#~ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
+#~ msgstr ""
+#~ "E26: Hebreeus kan nie gebruik word nie: Nie tydens kompilering gekies "
+#~ "nie\n"
-#~ msgid "softspace must be an integer"
-#~ msgstr "'softspace' moet 'n heelgetal wees"
+#~ msgid "E448: Could not load library function %s"
+#~ msgstr "E448: Kon nie biblioteek funksie laai nie %s"
-#~ msgid "invalid attribute"
-#~ msgstr "ongeldige eienskap"
+#~ msgid "E234: Unknown fontset: %s"
+#~ msgstr "E234: Onbekende fontstel: %s"
-#~ msgid "writelines() requires list of strings"
-#~ msgstr "'writelines()' benodig 'n lys van stringe"
+#~ msgid "Path length too long!"
+#~ msgstr "Pad-lengte te lank"
-#~ msgid "E264: Python: Error initialising I/O objects"
-#~ msgstr "E264: Python: Kon nie I/O objekte inwy nie"
+#~ msgid "gvimext.dll error"
+#~ msgstr "'gvimext.dll' fout"
-# njj: net 'n voorstel ..
-#~ msgid "invalid expression"
-#~ msgstr "ongeldige uitdrukking"
+#~ msgid "Error creating process: Check if gvim is in your path!"
+#~ msgstr "FOut met die skep van proses: Kyk of gvim in jou pad is!"
-#~ msgid "expressions disabled at compile time"
-#~ msgstr "uitdrukkings afgeskakel tydens kompilering"
+#~ msgid "Edits the selected file(s) with Vim"
+#~ msgstr "Wysig die gekose l๊er(s) met Vim"
-#~ msgid "attempt to refer to deleted buffer"
-#~ msgstr "poging om na 'n geskrapte buffer te verwys"
+#~ msgid "Edit with existing Vim - &"
+#~ msgstr "Wysig met bestaande Vim - &"
-#~ msgid "line number out of range"
-#~ msgstr "re๋lnommer buite omvang"
+#~ msgid "Edit with &Vim"
+#~ msgstr "Wysig met &Vim"
-#~ msgid "<buffer object (deleted) at %8lX>"
-#~ msgstr "<buffervoorwerp (geskrap) by %8lX>"
+#~ msgid "&Diff with Vim"
+#~ msgstr "Wys verskille ('&diff') met Vim"
-#~ msgid "invalid mark name"
-#~ msgstr "onbekende merknaam"
+#~ msgid "Edit with single &Vim"
+#~ msgstr "Wysig met 'n enkel &Vim"
-#~ msgid "no such buffer"
-#~ msgstr "buffer bestaan nie"
+#~ msgid "Edit with &multiple Vims"
+#~ msgstr "Wysig met &meer as een Vim"
-#~ msgid "attempt to refer to deleted window"
-#~ msgstr "poging om na geskrapte venster te verwys"
+#~ msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
+#~ msgstr ""
+#~ "E299: Perl evaluasie verbied in die sandput sonder die 'Safe' module"
-#~ msgid "readonly attribute"
-#~ msgstr "leesalleen eienskap"
+#~ msgid ""
+#~ "Sorry, this command is disabled: the Perl library could not be loaded."
+#~ msgstr ""
+#~ "Jammer, hierdie bevel is afgeskakel: die Perl biblioteek kon nie gelaai "
+#~ "word nie."
-#~ msgid "cursor position outside buffer"
-#~ msgstr "loperposisie buite buffer"
+#~ msgid "E370: Could not load library %s"
+#~ msgstr "E370: Kon nie biblioteek laai nie %s"
-#~ msgid "<window object (deleted) at %.8lX>"
-#~ msgstr "<venster voorwerp (geskrap) by %.8lX>"
+#~ msgid "type :help windows95<Enter> for info on this"
+#~ msgstr "tik :help windows95<Enter> vir meer inligting hieroor"
-#~ msgid "<window object (unknown) at %.8lX>"
-#~ msgstr "<verwyder voorwerp (onbekend) by %.8lX>"
+#~ msgid "WARNING: Windows 95/98/ME detected"
+#~ msgstr "WAARSKUWING: Windows 95/98/ME bespeur"
-#~ msgid "<window %d>"
-#~ msgstr "<venster %d>"
+#~ msgid " for Vim defaults "
+#~ msgstr " vir Vim verstekwaardes"
-#~ msgid "no such window"
-#~ msgstr "geen sodanige venster nie"
+#~ msgid "menu Edit->Global Settings->Toggle Vi Compatible"
+#~ msgstr "menu Redigeer->Global verstellings->Stel en herstel Vi Versoenbaar"
-#~ msgid "cannot save undo information"
-#~ msgstr "kan nie herwin-inligting stoor nie"
+#~ msgid "menu Edit->Global Settings->Toggle Insert Mode "
+#~ msgstr "menu Redigeer->Globale verstellings->Stel en herstel Invoeg Modus"
-#~ msgid "cannot delete line"
-#~ msgstr "kan re๋l nie verwyder nie"
+#~ msgid "Running modeless, typed text is inserted"
+#~ msgstr "Voer modus-loos uit, getikte teks word ingevoeg"
-#~ msgid "cannot replace line"
-#~ msgstr "kan re๋l nie vervang nie"
+#~ msgid "menu Help->Orphans for information "
+#~ msgstr "menu Hulp->Weeskinders vir meer inligting hieroor "
-#~ msgid "cannot insert line"
-#~ msgstr "kan re๋l nie byvoeg nie"
+#~ msgid "Compiler: "
+#~ msgstr "Kompileerder: "
-#~ msgid "string cannot contain newlines"
-#~ msgstr "string kan nie 'newlines' bevat nie"
+#~ msgid " system menu file: \""
+#~ msgstr " stelsel kieslys-l๊er: \""
-#~ msgid ""
-#~ "E266: Sorry, this command is disabled, the Ruby library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E266: Jammer, hierdie bevel is afgeskakel, die Ruby biblioteekl๊er kon "
-#~ "nie gelaai word nie."
+#~ msgid "3rd user gvimrc file: \""
+#~ msgstr "3de gebruiker gvimrc-l๊er: \""
-#~ msgid "E273: unknown longjmp status %d"
-#~ msgstr "E273: Onbekende 'longjmp' status %d"
+#~ msgid "2nd user gvimrc file: \""
+#~ msgstr "2de gebruiker gvimrc-l๊er: \""
-#~ msgid "Toggle implementation/definition"
-#~ msgstr "Stel en herstel implimentasie/definisie"
+#~ msgid " user gvimrc file: \""
+#~ msgstr " gebruiker gvimrc-l๊er: \""
-#~ msgid "Show base class of"
-#~ msgstr "Wys basisklas van"
+#~ msgid " system gvimrc file: \""
+#~ msgstr " stelsel gvimrc-l๊er: \""
-#~ msgid "Show overridden member function"
-#~ msgstr "Wys vervangde lidfunksie"
+#~ msgid "with (classic) GUI."
+#~ msgstr "met (klassieke) GUI."
-#~ msgid "Retrieve from file"
-#~ msgstr "Gaan haal uit l๊er"
+#~ msgid "with Cocoa GUI."
+#~ msgstr "met Cocoa GUI."
-#~ msgid "Retrieve from project"
-#~ msgstr "Gaan haal uit projek"
+#~ msgid "with Carbon GUI."
+#~ msgstr "met Carbon GUI."
-#~ msgid "Retrieve from all projects"
-#~ msgstr "Gaan haal uit alle projekte"
+#~ msgid "with GUI."
+#~ msgstr "met GUI."
-#~ msgid "Retrieve"
-#~ msgstr "Gaan haal"
+#~ msgid "with Photon GUI."
+#~ msgstr "met Photon GUI."
-#~ msgid "Show source of"
-#~ msgstr "Wys kode van"
+#~ msgid "with BeOS GUI."
+#~ msgstr "met BeOS GUI"
-#~ msgid "Find symbol"
-#~ msgstr "Vind simbool"
+#~ msgid "with X11-Athena GUI."
+#~ msgstr "met X11-Athena GUI"
-#~ msgid "Browse class"
-#~ msgstr "Kyk klas deur"
+#~ msgid "with X11-neXtaw GUI."
+#~ msgstr "met X11-neXtaw GUI"
-#~ msgid "Show class in hierarchy"
-#~ msgstr "Wys klas in hi๋rargie"
+#~ msgid "with X11-Motif GUI."
+#~ msgstr "met X11-Motif GUI."
-#~ msgid "Show class in restricted hierarchy"
-#~ msgstr "Wys klas in beperkte hi๋rargie"
+#~ msgid "with GTK GUI."
+#~ msgstr "met GTK GUI"
-#~ msgid "Xref refers to"
-#~ msgstr "Xref verwys na"
+#~ msgid "with GTK2 GUI."
+#~ msgstr "met GTK2 GUI"
-#~ msgid "Xref referred by"
-#~ msgstr "Xref verwys deur"
+#~ msgid "with GTK-GNOME GUI."
+#~ msgstr "met GTK-GNOME GUI."
-#~ msgid "Xref has a"
-#~ msgstr "Xref het 'n"
+#~ msgid "with GTK2-GNOME GUI."
+#~ msgstr "met GTK2-GNOME GUI."
-#~ msgid "Xref used by"
-#~ msgstr "Xref gebruik deur"
+#~ msgid ""
+#~ "\n"
+#~ "Tiny version "
+#~ msgstr ""
+#~ "\n"
+#~ "Piepklein weergawe "
-#~ msgid "Show docu of"
-#~ msgstr "Wys 'docu' van"
+#~ msgid ""
+#~ "\n"
+#~ "Small version "
+#~ msgstr ""
+#~ "\n"
+#~ "Klein weergawe "
-#~ msgid "Generate docu for"
-#~ msgstr "Genereer 'docu' vir"
+#~ msgid ""
+#~ "\n"
+#~ "Normal version "
+#~ msgstr ""
+#~ "\n"
+#~ "Normale weergawe "
#~ msgid ""
-#~ "Cannot connect to SNiFF+. Check environment (sniffemacs must be found in "
-#~ "$PATH).\n"
+#~ "\n"
+#~ "Big version "
#~ msgstr ""
-#~ "Kan nie 'n verbinding met 'SNiFF+' maak nie. Kyk of die omgewing reg is "
-#~ "('sniffemacs' moet in '$PATH' gevind word).\n"
+#~ "\n"
+#~ "Groot weergawe "
-#~ msgid "E274: Sniff: Error during read. Disconnected"
-#~ msgstr "E274: Sniff: Fout gedurende lees. Verbinding gebreek"
+#~ msgid ""
+#~ "\n"
+#~ "RISC OS version"
+#~ msgstr ""
+#~ "\n"
+#~ "RISC OS weergawe"
-#~ msgid "SNiFF+ is currently "
-#~ msgstr "SNiFF+ is tans"
+#~ msgid ""
+#~ "\n"
+#~ "MacOS version"
+#~ msgstr ""
+#~ "\n"
+#~ "MacOS weergawe"
-#~ msgid "not "
-#~ msgstr "nie "
+#~ msgid ""
+#~ "\n"
+#~ "MacOS X version"
+#~ msgstr ""
+#~ "\n"
+#~ "MacOS X weergawe"
-#~ msgid "connected"
-#~ msgstr "gekonnekteer"
+#~ msgid ""
+#~ "\n"
+#~ "MacOS X (unix) version"
+#~ msgstr ""
+#~ "\n"
+#~ "MacOS X (unix) weergawe"
-#~ msgid "E275: Unknown SNiFF+ request: %s"
-#~ msgstr "E275: Onbekende SNiFF+ versoek: %s"
+#~ msgid ""
+#~ "\n"
+#~ "16-bit MS-DOS version"
+#~ msgstr ""
+#~ "\n"
+#~ "16-bis MS-DOS weergawe"
-#~ msgid "E276: Error connecting to SNiFF+"
-#~ msgstr "E276: Fout in konnekteer met SNiFF+"
+#~ msgid ""
+#~ "\n"
+#~ "32-bit MS-DOS version"
+#~ msgstr ""
+#~ "\n"
+#~ "32-bis MS-DOS weergawe"
-#~ msgid "E278: SNiFF+ not connected"
-#~ msgstr "E278: SNiFF+ is nie gekonnekteer nie"
+#~ msgid ""
+#~ "\n"
+#~ "MS-Windows 16-bit version"
+#~ msgstr ""
+#~ "\n"
+#~ "MS-Windows 16-bis weergawe"
-#~ msgid "Sniff: Error during write. Disconnected"
-#~ msgstr "Sniff: Fout gedurende stoor. Verbinding gebreek"
+#~ msgid ""
+#~ "\n"
+#~ "MS-Windows 32-bit console version"
+#~ msgstr ""
+#~ "\n"
+#~ "MS-Windows 32-bis konsole weergawe"
-#~ msgid "not implemented yet"
-#~ msgstr "nog nie ge๏mplementeer nie"
+#~ msgid " with OLE support"
+#~ msgstr " met OLE ondersteuning"
-#~ msgid "unknown option"
-#~ msgstr "onbekende opsie"
+#~ msgid " in Win32s mode"
+#~ msgstr " in Win32s modus"
-#~ msgid "cannot set line(s)"
-#~ msgstr "kan nie re๋l(s) stel nie"
+#~ msgid ""
+#~ "\n"
+#~ "MS-Windows 32-bit GUI version"
+#~ msgstr ""
+#~ "\n"
+#~ "MS-Windows 32-bis GUI version"
-#~ msgid "mark not set"
-#~ msgstr "merker nie gestel nie"
+#~ msgid ""
+#~ "\n"
+#~ "MS-Windows 16/32-bit GUI version"
+#~ msgstr ""
+#~ "\n"
+#~ "MS-Windows 16/32-bis GUI weergawe"
-#~ msgid "row %d column %d"
-#~ msgstr "ry %d kolom %d"
+#~ msgid "No undo possible; continue anyway"
+#~ msgstr "Geen herstel moontlik; gaan in elk geval voort"
-#~ msgid "cannot insert/append line"
-#~ msgstr "kan nie re๋l invoeg/aanlas nie"
+#~ msgid "new shell started\n"
+#~ msgstr "nuwe dop begin\n"
-#~ msgid "unknown flag: "
-#~ msgstr "onbekende vlag: "
+#~ msgid "E430: Tag file path truncated for %s\n"
+#~ msgstr "E430: Etiketl๊ergids afgekap vir %s\n"
-#~ msgid "unknown vimOption"
-#~ msgstr "onbekende 'vimOption'"
+#~ msgid "Enter nr of choice (<CR> to abort): "
+#~ msgstr "Sleutel nommer van keuse in (<CR> om te stop): "
-#~ msgid "keyboard interrupt"
-#~ msgstr "sleutelbordonderbreking"
+#~ msgid "E396: containedin argument not accepted here"
+#~ msgstr "E396: 'containedin' parameter nie hier aanvaar nie"
-#~ msgid "vim error"
-#~ msgstr "vim fout"
+#~ msgid "E363: pattern caused out-of-stack error"
+#~ msgstr "E363: patroon het l๋e-stapel fout veroorsaak"
-#~ msgid "cannot create buffer/window command: object is being deleted"
-#~ msgstr "kan nie buffer/venster bevel skep nie: voorwerp word geskrap"
+#~ msgid "E361: Crash intercepted; regexp too complex?"
+#~ msgstr "E361: Ineenstorting onderskep. Patroon te kompleks?"
-#~ msgid ""
-#~ "cannot register callback command: buffer/window is already being deleted"
-#~ msgstr ""
-#~ "kan nie terugroepbevel registreer nie: buffer/venster word alreeds geskrap"
+#~ msgid "E58: %s{ operand could be empty"
+#~ msgstr "E58: %s{ operand mag leeg wees"
-#~ msgid ""
-#~ "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-"
-#~ "dev@vim.org"
-#~ msgstr ""
-#~ "E280: TCL FATALE FOUT: verwlys korrup!? Rapporteer dit asb. aan <vim-"
-#~ "dev@vim.org>"
+#~ msgid "E57: %s+ operand could be empty"
+#~ msgstr "E57: %s+ operand mag leeg wees"
-#~ msgid "cannot register callback command: buffer/window reference not found"
-#~ msgstr ""
-#~ "kan terugroepbevel nie registreer nie: buffer/vensterverwysing nie gevind "
-#~ "nie"
+#~ msgid "E56: %s* operand could be empty"
+#~ msgstr "E56: %s* operand mag leeg wees"
-#~ msgid ""
-#~ "E571: Sorry, this command is disabled: the Tcl library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E571: Jammer, hierdie bevel is afgeskakel, die Tcl biblioteek kon nie "
-#~ "gelaai word nie."
+#~ msgid "Vim Warning"
+#~ msgstr "Vim Waarskuwing"
#~ msgid ""
-#~ "E281: TCL ERROR: exit code is not int!? Please report this to vim-dev@vim."
-#~ "org"
+#~ "VIMRUN.EXE not found in your $PATH.\n"
+#~ "External commands will not pause after completion.\n"
+#~ "See :help win32-vimrun for more information."
#~ msgstr ""
-#~ "E281: TCL FOUT: verlaatkode is nie 'n 'int'!? Rapporteer dit asb. aan "
-#~ "<vim-dev@vim.org>"
-
-#~ msgid "cannot get line"
-#~ msgstr "kan nie re๋l kry nie"
-
-#~ msgid "Unable to register a command server name"
-#~ msgstr "Kon nie bevelbediener naam registreer nie"
-
-#~ msgid "E248: Failed to send command to the destination program"
-#~ msgstr "E248: Het gefaal om bevel na doel program te stuur"
+#~ "'VIMRUN.EXE' nie gevind in '$PATH' nie.\n"
+#~ "Eksterne opdragte sal nie wag na voltooiing nie\n"
+#~ "Sien ':help win32-vimrun' vir meer inligting."
-#~ msgid "E251: VIM instance registry property is badly formed. Deleted!"
-#~ msgstr "E251: VIM instansie register-kenmerk is swak gevorm. Geskrap!"
+#~ msgid "E371: Command not found"
+#~ msgstr "E371: Bevel nie gevind nie"
-#~ msgid "This Vim was not compiled with the diff feature."
-#~ msgstr "Hierdie Vim is nie gekompileer met 'diff' funksionaliteit nie."
+#~ msgid "shutdown"
+#~ msgstr "sit af"
-#~ msgid "-register\t\tRegister this gvim for OLE"
-#~ msgstr "-register\t\tRegistreer hierdie gvim vir OLE"
+#~ msgid "logoff"
+#~ msgstr "teken uit"
-#~ msgid "-unregister\t\tUnregister gvim for OLE"
-#~ msgstr "-unregister\t\tOnregistreer gvim vir OLE"
+#~ msgid "close"
+#~ msgstr "maak toe"
-#~ msgid "-g\t\t\tRun using GUI (like \"gvim\")"
-#~ msgstr "-g\t\t\tVoer uit met die GUI (soos \"gvim\")"
+#~ msgid "Vim: Caught %s event\n"
+#~ msgstr "Vim: Het %s gebeurtenis gevang\n"
-#~ msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
-#~ msgstr "-f of --nofork\tVoorgrond: Moenie vurk wanneer GUI begin nie"
+#~ msgid "shell returned %d"
+#~ msgstr "dop het %d gelewer"
-#~ msgid "-V[N]\t\tVerbose level"
-#~ msgstr "-V[N]\t\tOmslagtigheidsgraad"
+#~ msgid "Could not fix up function pointers to the DLL!"
+#~ msgstr "Kon nie funksiewysers na die DLL opstel nie!"
-#~ msgid "-f\t\t\tDon't use newcli to open window"
-#~ msgstr "-f\t\t\tMoet nie 'newcli' gebruik om venster oop te maak nie"
+#~ msgid "Could not load vim32.dll!"
+#~ msgstr "Kon nie 'vim32.dll' laai nie!"
-#~ msgid "-dev <device>\t\tUse <device> for I/O"
-#~ msgstr "-dev <toestel>\t\tGebruik <toestel> vir I/O"
+#~ msgid "VIM Error"
+#~ msgstr "VIM Fout"
-#~ msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
-#~ msgstr "-U <gvimrc>\t\tGebruik <gvimrc> in plaas van enige .gvimrc"
+#~ msgid "Could not allocate memory for command line."
+#~ msgstr "Kan nie geheue toeken vir bevelre๋l nie"
-#~ msgid "-x\t\t\tEdit encrypted files"
-#~ msgstr "-x\t\t\tBewerk ge๋nkripteerde l๊ers"
+#~ msgid "At line"
+#~ msgstr "By re๋l"
-#~ msgid "-display <display>\tConnect vim to this particular X-server"
-#~ msgstr "-display <display>\tKoppel vim aan hierdie X-bediener"
+#~ msgid "XSMP ICE connection watch failed"
+#~ msgstr "XSMP ICE konneksie beloer het gefaal"
-#~ msgid "-X\t\t\tDo not connect to X server"
-#~ msgstr "-X\t\t\tMoet nie verbinding met X-bediener maak nie"
+#~ msgid "XSMP opening connection"
+#~ msgstr "XSMP maak nou konneksie oop"
-#~ msgid "--remote <files>\tEdit <files> in a Vim server if possible"
-#~ msgstr ""
-#~ "--remote <l๊ers>\tWysig die <l๊ers> in a Vim bediener indien moontlik"
+#~ msgid "XSMP handling save-yourself request"
+#~ msgstr "XSMP hanteer 'save-yourself' versoek"
-#~ msgid "--remote-silent <files> Same, don't complain if there is no server"
-#~ msgstr ""
-#~ "--remote-silent <l๊ers> Dieselfde, moet nie kla as daar nie so 'n "
-#~ "bediener is nie"
+#~ msgid "Opening the X display failed"
+#~ msgstr "Oopmaak van die X vertoonskerm het gefaal"
-#~ msgid ""
-#~ "--remote-wait <files> As --remote but wait for files to have been edited"
-#~ msgstr ""
-#~ "--remote-wait <l๊ers> Soos '--remote', maar wag vir l๊ers om gewysig te "
-#~ "word"
+#~ msgid "XSMP lost ICE connection"
+#~ msgstr "XSMP het ICE konneksie verloor"
#~ msgid ""
-#~ "--remote-wait-silent <files> Same, don't complain if there is no server"
-#~ msgstr ""
-#~ "--remote-wait-silent <l๊ers> Dieselfde, moet nie kla as daar nie so 'n "
-#~ "bediener is nie"
-
-#~ msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
+#~ "\n"
+#~ "Command terminated\n"
#~ msgstr ""
-#~ "--remote-send <sleutels>\tStuur <sleutels> na 'n Vim-bediener en verlaat"
+#~ "\n"
+#~ "Bevel be๋indig\n"
#~ msgid ""
-#~ "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
+#~ "\n"
+#~ "Cannot fork\n"
#~ msgstr ""
-#~ "--remote-expr <expr>\tEvalueer <expr> in 'n Vim-bediener en druk resultaat"
-
-#~ msgid "--serverlist\t\tList available Vim server names and exit"
-#~ msgstr "--serverlist\t\tLys beskikbare Vim-bediener name en verlaat"
-
-#~ msgid "--servername <name>\tSend to/become the Vim server <name>"
-#~ msgstr "--servername <naam>\tStuur na/word die Vim-bediener <naam>"
+#~ "\n"
+#~ "Kan nie vurk nie\n"
#~ msgid ""
#~ "\n"
-#~ "Arguments recognised by gvim (Motif version):\n"
+#~ "Cannot create pipes\n"
#~ msgstr ""
#~ "\n"
-#~ "Parameters deur gvim herken (Motif weergawe):\n"
+#~ "Kan nie pype skep nie\n"
#~ msgid ""
#~ "\n"
-#~ "Arguments recognised by gvim (neXtaw version):\n"
+#~ "Cannot execute shell sh\n"
#~ msgstr ""
#~ "\n"
-#~ "Parameters deur gvim herken (neXtaw weergawe):\n"
+#~ "Kan nie dop 'sh' uitvoer nie\n"
+
+#~ msgid "Opening the X display timed out"
+#~ msgstr "Oopmaak van die X-vertoonskerm het uitgetel"
+
+#~ msgid "Testing the X display failed"
+#~ msgstr "Toetsing van die X-vertoonskerm het gefaal"
#~ msgid ""
#~ "\n"
-#~ "Arguments recognised by gvim (Athena version):\n"
+#~ "Vim: Got X error\n"
#~ msgstr ""
#~ "\n"
-#~ "Parameters deur gvim herken (Athena weergawe):\n"
+#~ "Vim: Het X fout ontvang\n"
-#~ msgid "-display <display>\tRun vim on <display>"
-#~ msgstr "-display <display>\tVoer vim op <display> uit"
+#~ msgid "Opening the X display took %<PRId64> msec"
+#~ msgstr "Om die X-vertoonskerm oop te maak het %<PRId64> msek gevat"
-#~ msgid "-iconic\t\tStart vim iconified"
-#~ msgstr "-iconic\t\tBegin vim as ikoon"
+#~ msgid "Vim: Caught deadly signal\n"
+#~ msgstr "Vim: Het dodelike sein gevang\n"
-#~ msgid "-name <name>\t\tUse resource as if vim was <name>"
-#~ msgstr "-name <name>\t\tGebruik hulpbron asof vim <name> was"
+#~ msgid "Vim: Caught deadly signal %s\n"
+#~ msgstr "Vim: Het dodelike sein %s gevang\n"
-#~ msgid "\t\t\t (Unimplemented)\n"
-#~ msgstr "\t\t\t (Nog nie ge๏mplementeer nie)\n"
+#~ msgid "Vim: Double signal, exiting\n"
+#~ msgstr "Vim: Dubbel sein, staak\n"
-#~ msgid "-background <color>\tUse <color> for the background (also: -bg)"
-#~ msgstr "-background <kleur>\tGebruik <kleur> vir die agtergrond (ook: -bg)"
+#~ msgid "E245: Illegal char '%c' in font name \"%s\""
+#~ msgstr "E245: Ongeldige karakter '%c' in fontnaam \"%s\""
-#~ msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
-#~ msgstr "-voorgrond <kleur>\tGebruik <kleur> vir normale teks (ook: -fg)"
+#~ msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
+#~ msgstr "E244: Ongeldige karakterstelnaam \"%s\" in fontnaam \"%s\""
-#~ msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
-#~ msgstr "-font <font>\t\tGebruik <font> vir normale teks (ook -fn)"
+#~ msgid "Printing '%s'"
+#~ msgstr "Druk nou '%s'"
-#~ msgid "-boldfont <font>\tUse <font> for bold text"
-#~ msgstr "ญboldfont <font>\t Gebruik <font> vir vetletter teks"
+#~ msgid "E238: Print error: %s"
+#~ msgstr "E238: Drukfout: %s"
-#~ msgid "-italicfont <font>\tUse <font> for italic text"
-#~ msgstr "-italicfont <font>\tGebruik <font> vir kursiewe teks"
+#~ msgid "E613: Unknown printer font: %s"
+#~ msgstr "E613: Onbekende drukker font: %s"
-#~ msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
-#~ msgstr "-geometry <geom>\tGebruik <geom> vir aanvanklike geometrie"
+#~ msgid "to %s on %s"
+#~ msgstr "na %s op %s"
-#~ msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
-#~ msgstr "-borderwidth <wydte>\tGebruik 'n grenswydte van <wydte> (ook: -bw)"
+#~ msgid "'columns' is not 80, cannot execute external commands"
+#~ msgstr "'columns' is nie 80 nie, kan nie eksterne bevele uitvoer nie"
-#~ msgid ""
-#~ "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
-#~ msgstr ""
-#~ "-scrollbarwidth <wydte>\tGebruik 'n rolstaafwydte van <wydte> (ook: -sw>"
+#~ msgid "...(truncated)"
+#~ msgstr "...(afgekap)"
-#~ msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
-#~ msgstr ""
-#~ "-menuheight <hoogte>\tGebruik a kieslysstaafhoogte van <hoogte> (ook: -mh)"
+#~ msgid "I/O ERROR"
+#~ msgstr "I/O FOUT"
-#~ msgid "-reverse\t\tUse reverse video (also: -rv)"
-#~ msgstr "-reverse\t\tGebruik tru-video (ook: -rv)"
+#~ msgid "ANCHOR_BUF_SIZE too small."
+#~ msgstr "'ANCHOR_BUF_SIZE' is te klein"
-#~ msgid "+reverse\t\tDon't use reverse video (also: +rv)"
-#~ msgstr "+reverse\t\tMoet nie tru-video gebruik nie (ook: +rv)"
+#~ msgid " returned\n"
+#~ msgstr " teruggekeer\n"
-#~ msgid "-xrm <resource>\tSet the specified resource"
-#~ msgstr "-xrm <hulpbron>\tStel die gespesifiseerde hulpbron"
+#~ msgid "shell "
+#~ msgstr "dop "
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (RISC OS version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Parameters wat gvim verstaan (RISC OS weergawe):\n"
+#~ msgid "Cannot execute "
+#~ msgstr "Kan nie uitvoer nie "
-#~ msgid "--columns <number>\tInitial width of window in columns"
-#~ msgstr "--columns <aantal>\tAanvanklike wydte van venster in kolomme"
+#~ msgid "mch_get_shellsize: not a console??\n"
+#~ msgstr "'mch_get_shellsize': nie 'n konsole nie??\n"
-#~ msgid "--rows <number>\tInitial height of window in rows"
-#~ msgstr "--rows <aantal>\tAanvanklike hoogte van venster in rye"
+#~ msgid "cannot change console mode ?!\n"
+#~ msgstr "kan konsole-modus nie verander nie ?!\n"
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (GTK+ version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Parameters wat gvim verstaan (GTK+ weergawe):\n"
+#~ msgid "Vim exiting with %d\n"
+#~ msgstr "Vim stop met %d\n"
-#~ msgid "-display <display>\tRun vim on <display> (also: --display)"
-#~ msgstr "-display <skerm>\tVoer vim op <skerm> uit: (ook --display)"
+#~ msgid "Cannot create "
+#~ msgstr "Kan nie skep nie: "
-#~ msgid "--role <role>\tSet a unique role to identify the main window"
-#~ msgstr "--role <rol>\tStel 'n unieke rol om die hoofvenster te identifiseer"
+#~ msgid "Cannot open NIL:\n"
+#~ msgstr "Kan nie NIL: oopmaak nie\n"
-#~ msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
-#~ msgstr "--socketid <xid>\tMaak Vim in 'n ander GTK element oop"
+#~ msgid "Need %s version %<PRId64>\n"
+#~ msgstr "Benodig %s weergawe %<PRId64>\n"
-#~ msgid "-P <parent title>\tOpen Vim inside parent application"
-#~ msgstr "-P <ouer title>\tMaak Vim oop binne 'n ouer toepassing"
+#~ msgid "Need Amigados version 2.04 or later\n"
+#~ msgstr "Benodig Amigados weergawe 2.04 of later\n"
-#~ msgid "No display"
-#~ msgstr "Geen vertoonskerm"
+#~ msgid "VIM: Can't open window!\n"
+#~ msgstr "VIM: Kan nie venster oopmaak nie!\n"
-#~ msgid ": Send failed.\n"
-#~ msgstr ": Stuur het gefaal.\n"
+#~ msgid "cannot open "
+#~ msgstr "kan nie oopmaak nie "
-#~ msgid ": Send failed. Trying to execute locally\n"
-#~ msgstr ": Stuur het gefaal. Probeer om lokaal uit te voer\n"
+#~ msgid "E538: No mouse support"
+#~ msgstr "E538: Geen muisondersteuning nie"
-#~ msgid "%d of %d edited"
-#~ msgstr "%d van %d l๊ers bewerk"
+#~ msgid "E534: Invalid wide font"
+#~ msgstr "E534: Ongeldige wye font"
-#~ msgid "No display: Send expression failed.\n"
-#~ msgstr "Geen vertoonskerm: Stuur van uitdrukking het gefaal.\n"
+#~ msgid "E533: can't select wide font"
+#~ msgstr "E533: kan nie wye font kies nie"
-#~ msgid ": Send expression failed.\n"
-#~ msgstr ": Stuur van uitdrukking het gefaal.\n"
+#~ msgid "E598: Invalid fontset"
+#~ msgstr "E598: Ongeldige fontstel"
-#~ msgid "E543: Not a valid codepage"
-#~ msgstr "E543: Nie 'n geldige kodeblad nie"
+#~ msgid "E597: can't select fontset"
+#~ msgstr "E597: kan nie fontstel kies nie"
-#~ msgid "E285: Failed to create input context"
-#~ msgstr "E285: Gefaal met die skep van invoerkonteks"
+#~ msgid "E617: Cannot be changed in the GTK+ 2 GUI"
+#~ msgstr "E617: Kan nie 'term' verander in die GTK+ 2 GUI nie"
-#~ msgid "E286: Failed to open input method"
-#~ msgstr "E286: Gefaal om invoermetode oop te maak"
+#~ msgid "E531: Use \":gui\" to start the GUI"
+#~ msgstr "E531: Gebruik \":gui\" om die GUI te begin"
-#~ msgid "E287: Warning: Could not set destroy callback to IM"
-#~ msgstr "E287: Waarskuwing: Kon nie uitwis-terugroep na IM stel nie"
+#~ msgid "E530: Cannot change term in GUI"
+#~ msgstr "E530: Kan nie 'term' verander in GUI nie"
-#~ msgid "E288: input method doesn't support any style"
-#~ msgstr "E288: invoermetode ondersteun geen styl nie"
+#~ msgid "freeing %<PRId64> lines"
+#~ msgstr "laat %<PRId64> re๋ls gaan"
-#~ msgid "E289: input method doesn't support my preedit type"
-#~ msgstr "E289: invoermetode ondersteun nie my voor-bewerking tipe nie"
+#~ msgid "E658: NetBeans connection lost for buffer %<PRId64>"
+#~ msgstr "E658: NetBeans konneksie vir buffer %<PRId64> verloor"
-#~ msgid "E290: over-the-spot style requires fontset"
-#~ msgstr "E290: oor-die-plek styl vereis fontstel"
+#~ msgid "read from Netbeans socket"
+#~ msgstr "lees vanaf Netbeans 'socket'"
-#~ msgid "E291: Your GTK+ is older than 1.2.3. Status area disabled"
-#~ msgstr "E291: Jou GTK+ is ouer as 1.2.3. Statusarea afgeskakel"
+#~ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
+#~ msgstr ""
+#~ "E668: Verkeerde toegangsmodue vir NetBeans konneksie inligtingsl๊er: \"%s"
+#~ "\""
-#~ msgid "E292: Input Method Server is not running"
-#~ msgstr "E292: Invoermetodebediener voer nie uit nie"
+#~ msgid "Cannot connect to Netbeans"
+#~ msgstr "Kan nie aan Netbeans koppel nie"
+
+#~ msgid "Cannot connect to Netbeans #2"
+#~ msgstr "Kan nie aan Netbeans #2 koppel nie"
+
+#~ msgid "Keys don't match!"
+#~ msgstr "Sleutels verskil!"
+
+#~ msgid "Enter same key again: "
+#~ msgstr "Voer die sleutel weer in: "
+
+#~ msgid "Enter encryption key: "
+#~ msgstr "Voer enkripsie-sleutel in: "
+
+#~ msgid "E547: Illegal mouseshape"
+#~ msgstr "E547: Ongeldige muisvorm"
+
+#~ msgid "E341: Internal error: lalloc(%<PRId64>, )"
+#~ msgstr "E341: Interne fout: 'lalloc(%<PRId64>, )'"
+
+#~ msgid "E340: Line is becoming too long"
+#~ msgstr "E340: R๋el word te lank"
#~ msgid ""
+#~ "[calls] total re/malloc()'s %<PRIu64>, total free()'s %<PRIu64>\n"
#~ "\n"
-#~ " [not usable with this version of Vim]"
#~ msgstr ""
+#~ "[roepe] totaal re/malloc()'s %<PRIu64>, totale free()'s %<PRIu64>\n"
#~ "\n"
-#~ " [nie bruikbaar met hierdie weergawe van Vim nie]"
+
+#~ msgid ""
+#~ "\n"
+#~ "[bytes] total alloc-freed %<PRIu64>-%<PRIu64>, in use %<PRIu64>, peak use "
+#~ "%<PRIu64>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "[grepe] totaal 'alloc'-vrygelaat %<PRIu64>-%<PRIu64>, in gebruik "
+#~ "%<PRIu64>, piekgebruik %<PRIu64>\n"
+
+#~ msgid "ERROR: "
+#~ msgstr "FOUT: "
+
+#~ msgid "Vim: Finished.\n"
+#~ msgstr "Vim: Klaar.\n"
+
+#~ msgid "Vim: preserving files...\n"
+#~ msgstr "Vim: bewaar l๊ers...\n"
+
+#~ msgid "E338: Sorry, no file browser in console mode"
+#~ msgstr "E338: Jammer, l๊erblaaier nie beskikbaar in konsole-modus nie"
+
+#~ msgid "Open File dialog"
+#~ msgstr "Maak l๊er oop dialooghokkie"
+
+#~ msgid "Save File dialog"
+#~ msgstr "Stoor L๊er dialooghokkie"
+
+#~ msgid " (RET: line, SPACE: page, d: half page, q: quit)"
+#~ msgstr " (RET: re๋l, SPACE: bladsy, d: halwe bladsy, q: los dit"
+
+#~ msgid " (RET/BS: line, SPACE/b: page, d/u: half page, q: quit)"
+#~ msgstr " (RET/BS: re๋l, SPACE/b: bladsy, d/u: halwe bladsy, q: los dit"
+
+#~ msgid "Hit ENTER to continue"
+#~ msgstr "Druk ENTER om voort te gaan"
+
+#~ msgid "[string too long]"
+#~ msgstr "[string te lank]"
+
+#~ msgid "Tear off this menu"
+#~ msgstr "Skeur die kieslys af"
#~ msgid ""
#~ "&Open Read-Only\n"
@@ -7282,824 +6490,1139 @@ msgstr "E446: Geen l๊ernaam onder loper"
#~ "&Stop\n"
#~ "S&krap dit"
-#~ msgid "Tear off this menu"
-#~ msgstr "Skeur die kieslys af"
+#~ msgid ""
+#~ "\n"
+#~ " [not usable with this version of Vim]"
+#~ msgstr ""
+#~ "\n"
+#~ " [nie bruikbaar met hierdie weergawe van Vim nie]"
-#~ msgid "[string too long]"
-#~ msgstr "[string te lank]"
+#~ msgid "E292: Input Method Server is not running"
+#~ msgstr "E292: Invoermetodebediener voer nie uit nie"
-#~ msgid "Hit ENTER to continue"
-#~ msgstr "Druk ENTER om voort te gaan"
+#~ msgid "E291: Your GTK+ is older than 1.2.3. Status area disabled"
+#~ msgstr "E291: Jou GTK+ is ouer as 1.2.3. Statusarea afgeskakel"
-#~ msgid " (RET/BS: line, SPACE/b: page, d/u: half page, q: quit)"
-#~ msgstr " (RET/BS: re๋l, SPACE/b: bladsy, d/u: halwe bladsy, q: los dit"
+#~ msgid "E290: over-the-spot style requires fontset"
+#~ msgstr "E290: oor-die-plek styl vereis fontstel"
-#~ msgid " (RET: line, SPACE: page, d: half page, q: quit)"
-#~ msgstr " (RET: re๋l, SPACE: bladsy, d: halwe bladsy, q: los dit"
+#~ msgid "E289: input method doesn't support my preedit type"
+#~ msgstr "E289: invoermetode ondersteun nie my voor-bewerking tipe nie"
-#~ msgid "Save File dialog"
-#~ msgstr "Stoor L๊er dialooghokkie"
+#~ msgid "E288: input method doesn't support any style"
+#~ msgstr "E288: invoermetode ondersteun geen styl nie"
-#~ msgid "Open File dialog"
-#~ msgstr "Maak l๊er oop dialooghokkie"
+#~ msgid "E287: Warning: Could not set destroy callback to IM"
+#~ msgstr "E287: Waarskuwing: Kon nie uitwis-terugroep na IM stel nie"
-#~ msgid "E338: Sorry, no file browser in console mode"
-#~ msgstr "E338: Jammer, l๊erblaaier nie beskikbaar in konsole-modus nie"
+#~ msgid "E285: Failed to create input context"
+#~ msgstr "E285: Gefaal met die skep van invoerkonteks"
-#~ msgid "Vim: preserving files...\n"
-#~ msgstr "Vim: bewaar l๊ers...\n"
+#~ msgid "E543: Not a valid codepage"
+#~ msgstr "E543: Nie 'n geldige kodeblad nie"
-#~ msgid "Vim: Finished.\n"
-#~ msgstr "Vim: Klaar.\n"
+#~ msgid ": Send expression failed.\n"
+#~ msgstr ": Stuur van uitdrukking het gefaal.\n"
-#~ msgid "ERROR: "
-#~ msgstr "FOUT: "
+#~ msgid "No display: Send expression failed.\n"
+#~ msgstr "Geen vertoonskerm: Stuur van uitdrukking het gefaal.\n"
+
+#~ msgid "%d of %d edited"
+#~ msgstr "%d van %d l๊ers bewerk"
+
+#~ msgid ": Send failed. Trying to execute locally\n"
+#~ msgstr ": Stuur het gefaal. Probeer om lokaal uit te voer\n"
+
+#~ msgid ": Send failed.\n"
+#~ msgstr ": Stuur het gefaal.\n"
+
+#~ msgid "No display"
+#~ msgstr "Geen vertoonskerm"
+
+#~ msgid "-P <parent title>\tOpen Vim inside parent application"
+#~ msgstr "-P <ouer title>\tMaak Vim oop binne 'n ouer toepassing"
+
+#~ msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
+#~ msgstr "--socketid <xid>\tMaak Vim in 'n ander GTK element oop"
+
+#~ msgid "--role <role>\tSet a unique role to identify the main window"
+#~ msgstr "--role <rol>\tStel 'n unieke rol om die hoofvenster te identifiseer"
+
+#~ msgid "-display <display>\tRun vim on <display> (also: --display)"
+#~ msgstr "-display <skerm>\tVoer vim op <skerm> uit: (ook --display)"
#~ msgid ""
#~ "\n"
-#~ "[bytes] total alloc-freed %<PRIu64>-%<PRIu64>, in use %<PRIu64>, peak use "
-#~ "%<PRIu64>\n"
+#~ "Arguments recognised by gvim (GTK+ version):\n"
#~ msgstr ""
#~ "\n"
-#~ "[grepe] totaal 'alloc'-vrygelaat %<PRIu64>-%<PRIu64>, in gebruik "
-#~ "%<PRIu64>, piekgebruik %<PRIu64>\n"
+#~ "Parameters wat gvim verstaan (GTK+ weergawe):\n"
+
+#~ msgid "--rows <number>\tInitial height of window in rows"
+#~ msgstr "--rows <aantal>\tAanvanklike hoogte van venster in rye"
+
+#~ msgid "--columns <number>\tInitial width of window in columns"
+#~ msgstr "--columns <aantal>\tAanvanklike wydte van venster in kolomme"
#~ msgid ""
-#~ "[calls] total re/malloc()'s %<PRIu64>, total free()'s %<PRIu64>\n"
#~ "\n"
+#~ "Arguments recognised by gvim (RISC OS version):\n"
#~ msgstr ""
-#~ "[roepe] totaal re/malloc()'s %<PRIu64>, totale free()'s %<PRIu64>\n"
#~ "\n"
+#~ "Parameters wat gvim verstaan (RISC OS weergawe):\n"
-#~ msgid "E340: Line is becoming too long"
-#~ msgstr "E340: R๋el word te lank"
-
-#~ msgid "E341: Internal error: lalloc(%<PRId64>, )"
-#~ msgstr "E341: Interne fout: 'lalloc(%<PRId64>, )'"
-
-#~ msgid "E547: Illegal mouseshape"
-#~ msgstr "E547: Ongeldige muisvorm"
-
-#~ msgid "Enter encryption key: "
-#~ msgstr "Voer enkripsie-sleutel in: "
-
-#~ msgid "Enter same key again: "
-#~ msgstr "Voer die sleutel weer in: "
+#~ msgid "-xrm <resource>\tSet the specified resource"
+#~ msgstr "-xrm <hulpbron>\tStel die gespesifiseerde hulpbron"
-#~ msgid "Keys don't match!"
-#~ msgstr "Sleutels verskil!"
+#~ msgid "+reverse\t\tDon't use reverse video (also: +rv)"
+#~ msgstr "+reverse\t\tMoet nie tru-video gebruik nie (ook: +rv)"
-#~ msgid "Cannot connect to Netbeans #2"
-#~ msgstr "Kan nie aan Netbeans #2 koppel nie"
+#~ msgid "-reverse\t\tUse reverse video (also: -rv)"
+#~ msgstr "-reverse\t\tGebruik tru-video (ook: -rv)"
-#~ msgid "Cannot connect to Netbeans"
-#~ msgstr "Kan nie aan Netbeans koppel nie"
+#~ msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
+#~ msgstr ""
+#~ "-menuheight <hoogte>\tGebruik a kieslysstaafhoogte van <hoogte> (ook: -mh)"
-#~ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
+#~ msgid ""
+#~ "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
#~ msgstr ""
-#~ "E668: Verkeerde toegangsmodue vir NetBeans konneksie inligtingsl๊er: \"%s"
-#~ "\""
+#~ "-scrollbarwidth <wydte>\tGebruik 'n rolstaafwydte van <wydte> (ook: -sw>"
-#~ msgid "read from Netbeans socket"
-#~ msgstr "lees vanaf Netbeans 'socket'"
+#~ msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
+#~ msgstr "-borderwidth <wydte>\tGebruik 'n grenswydte van <wydte> (ook: -bw)"
-#~ msgid "E658: NetBeans connection lost for buffer %<PRId64>"
-#~ msgstr "E658: NetBeans konneksie vir buffer %<PRId64> verloor"
+#~ msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
+#~ msgstr "-geometry <geom>\tGebruik <geom> vir aanvanklike geometrie"
-#~ msgid "freeing %<PRId64> lines"
-#~ msgstr "laat %<PRId64> re๋ls gaan"
+#~ msgid "-italicfont <font>\tUse <font> for italic text"
+#~ msgstr "-italicfont <font>\tGebruik <font> vir kursiewe teks"
-#~ msgid "E530: Cannot change term in GUI"
-#~ msgstr "E530: Kan nie 'term' verander in GUI nie"
+#~ msgid "-boldfont <font>\tUse <font> for bold text"
+#~ msgstr "ญboldfont <font>\t Gebruik <font> vir vetletter teks"
-#~ msgid "E531: Use \":gui\" to start the GUI"
-#~ msgstr "E531: Gebruik \":gui\" om die GUI te begin"
+#~ msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
+#~ msgstr "-font <font>\t\tGebruik <font> vir normale teks (ook -fn)"
-#~ msgid "E617: Cannot be changed in the GTK+ 2 GUI"
-#~ msgstr "E617: Kan nie 'term' verander in die GTK+ 2 GUI nie"
+#~ msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
+#~ msgstr "-voorgrond <kleur>\tGebruik <kleur> vir normale teks (ook: -fg)"
-#~ msgid "E597: can't select fontset"
-#~ msgstr "E597: kan nie fontstel kies nie"
+#~ msgid "-background <color>\tUse <color> for the background (also: -bg)"
+#~ msgstr "-background <kleur>\tGebruik <kleur> vir die agtergrond (ook: -bg)"
-#~ msgid "E598: Invalid fontset"
-#~ msgstr "E598: Ongeldige fontstel"
+#~ msgid "\t\t\t (Unimplemented)\n"
+#~ msgstr "\t\t\t (Nog nie ge๏mplementeer nie)\n"
-#~ msgid "E533: can't select wide font"
-#~ msgstr "E533: kan nie wye font kies nie"
+#~ msgid "-name <name>\t\tUse resource as if vim was <name>"
+#~ msgstr "-name <name>\t\tGebruik hulpbron asof vim <name> was"
-#~ msgid "E534: Invalid wide font"
-#~ msgstr "E534: Ongeldige wye font"
+#~ msgid "-iconic\t\tStart vim iconified"
+#~ msgstr "-iconic\t\tBegin vim as ikoon"
-#~ msgid "E538: No mouse support"
-#~ msgstr "E538: Geen muisondersteuning nie"
+#~ msgid "-display <display>\tRun vim on <display>"
+#~ msgstr "-display <display>\tVoer vim op <display> uit"
-#~ msgid "cannot open "
-#~ msgstr "kan nie oopmaak nie "
+#~ msgid ""
+#~ "\n"
+#~ "Arguments recognised by gvim (Athena version):\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Parameters deur gvim herken (Athena weergawe):\n"
-#~ msgid "VIM: Can't open window!\n"
-#~ msgstr "VIM: Kan nie venster oopmaak nie!\n"
+#~ msgid ""
+#~ "\n"
+#~ "Arguments recognised by gvim (neXtaw version):\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Parameters deur gvim herken (neXtaw weergawe):\n"
-#~ msgid "Need Amigados version 2.04 or later\n"
-#~ msgstr "Benodig Amigados weergawe 2.04 of later\n"
+#~ msgid ""
+#~ "\n"
+#~ "Arguments recognised by gvim (Motif version):\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Parameters deur gvim herken (Motif weergawe):\n"
-#~ msgid "Need %s version %<PRId64>\n"
-#~ msgstr "Benodig %s weergawe %<PRId64>\n"
+#~ msgid "--servername <name>\tSend to/become the Vim server <name>"
+#~ msgstr "--servername <naam>\tStuur na/word die Vim-bediener <naam>"
-#~ msgid "Cannot open NIL:\n"
-#~ msgstr "Kan nie NIL: oopmaak nie\n"
+#~ msgid "--serverlist\t\tList available Vim server names and exit"
+#~ msgstr "--serverlist\t\tLys beskikbare Vim-bediener name en verlaat"
-#~ msgid "Cannot create "
-#~ msgstr "Kan nie skep nie: "
+#~ msgid ""
+#~ "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
+#~ msgstr ""
+#~ "--remote-expr <expr>\tEvalueer <expr> in 'n Vim-bediener en druk resultaat"
-#~ msgid "Vim exiting with %d\n"
-#~ msgstr "Vim stop met %d\n"
+#~ msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
+#~ msgstr ""
+#~ "--remote-send <sleutels>\tStuur <sleutels> na 'n Vim-bediener en verlaat"
-#~ msgid "cannot change console mode ?!\n"
-#~ msgstr "kan konsole-modus nie verander nie ?!\n"
+#~ msgid ""
+#~ "--remote-wait-silent <files> Same, don't complain if there is no server"
+#~ msgstr ""
+#~ "--remote-wait-silent <l๊ers> Dieselfde, moet nie kla as daar nie so 'n "
+#~ "bediener is nie"
-#~ msgid "mch_get_shellsize: not a console??\n"
-#~ msgstr "'mch_get_shellsize': nie 'n konsole nie??\n"
+#~ msgid ""
+#~ "--remote-wait <files> As --remote but wait for files to have been edited"
+#~ msgstr ""
+#~ "--remote-wait <l๊ers> Soos '--remote', maar wag vir l๊ers om gewysig te "
+#~ "word"
-#~ msgid "Cannot execute "
-#~ msgstr "Kan nie uitvoer nie "
+#~ msgid "--remote-silent <files> Same, don't complain if there is no server"
+#~ msgstr ""
+#~ "--remote-silent <l๊ers> Dieselfde, moet nie kla as daar nie so 'n "
+#~ "bediener is nie"
-#~ msgid "shell "
-#~ msgstr "dop "
+#~ msgid "--remote <files>\tEdit <files> in a Vim server if possible"
+#~ msgstr ""
+#~ "--remote <l๊ers>\tWysig die <l๊ers> in a Vim bediener indien moontlik"
-#~ msgid " returned\n"
-#~ msgstr " teruggekeer\n"
+#~ msgid "-X\t\t\tDo not connect to X server"
+#~ msgstr "-X\t\t\tMoet nie verbinding met X-bediener maak nie"
-#~ msgid "ANCHOR_BUF_SIZE too small."
-#~ msgstr "'ANCHOR_BUF_SIZE' is te klein"
+#~ msgid "-display <display>\tConnect vim to this particular X-server"
+#~ msgstr "-display <display>\tKoppel vim aan hierdie X-bediener"
-#~ msgid "I/O ERROR"
-#~ msgstr "I/O FOUT"
+#~ msgid "-x\t\t\tEdit encrypted files"
+#~ msgstr "-x\t\t\tBewerk ge๋nkripteerde l๊ers"
-#~ msgid "...(truncated)"
-#~ msgstr "...(afgekap)"
+#~ msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
+#~ msgstr "-U <gvimrc>\t\tGebruik <gvimrc> in plaas van enige .gvimrc"
-#~ msgid "'columns' is not 80, cannot execute external commands"
-#~ msgstr "'columns' is nie 80 nie, kan nie eksterne bevele uitvoer nie"
+#~ msgid "-dev <device>\t\tUse <device> for I/O"
+#~ msgstr "-dev <toestel>\t\tGebruik <toestel> vir I/O"
-#~ msgid "to %s on %s"
-#~ msgstr "na %s op %s"
+#~ msgid "-f\t\t\tDon't use newcli to open window"
+#~ msgstr "-f\t\t\tMoet nie 'newcli' gebruik om venster oop te maak nie"
-#~ msgid "E613: Unknown printer font: %s"
-#~ msgstr "E613: Onbekende drukker font: %s"
+#~ msgid "-V[N]\t\tVerbose level"
+#~ msgstr "-V[N]\t\tOmslagtigheidsgraad"
-#~ msgid "E238: Print error: %s"
-#~ msgstr "E238: Drukfout: %s"
+#~ msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
+#~ msgstr "-f of --nofork\tVoorgrond: Moenie vurk wanneer GUI begin nie"
-#~ msgid "Printing '%s'"
-#~ msgstr "Druk nou '%s'"
+#~ msgid "-g\t\t\tRun using GUI (like \"gvim\")"
+#~ msgstr "-g\t\t\tVoer uit met die GUI (soos \"gvim\")"
-#~ msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
-#~ msgstr "E244: Ongeldige karakterstelnaam \"%s\" in fontnaam \"%s\""
+#~ msgid "-unregister\t\tUnregister gvim for OLE"
+#~ msgstr "-unregister\t\tOnregistreer gvim vir OLE"
-#~ msgid "E245: Illegal char '%c' in font name \"%s\""
-#~ msgstr "E245: Ongeldige karakter '%c' in fontnaam \"%s\""
+#~ msgid "-register\t\tRegister this gvim for OLE"
+#~ msgstr "-register\t\tRegistreer hierdie gvim vir OLE"
-#~ msgid "Vim: Double signal, exiting\n"
-#~ msgstr "Vim: Dubbel sein, staak\n"
+#~ msgid "This Vim was not compiled with the diff feature."
+#~ msgstr "Hierdie Vim is nie gekompileer met 'diff' funksionaliteit nie."
-#~ msgid "Vim: Caught deadly signal %s\n"
-#~ msgstr "Vim: Het dodelike sein %s gevang\n"
+#~ msgid "E251: VIM instance registry property is badly formed. Deleted!"
+#~ msgstr "E251: VIM instansie register-kenmerk is swak gevorm. Geskrap!"
-#~ msgid "Vim: Caught deadly signal\n"
-#~ msgstr "Vim: Het dodelike sein gevang\n"
+#~ msgid "E248: Failed to send command to the destination program"
+#~ msgstr "E248: Het gefaal om bevel na doel program te stuur"
-#~ msgid "Opening the X display took %<PRId64> msec"
-#~ msgstr "Om die X-vertoonskerm oop te maak het %<PRId64> msek gevat"
+#~ msgid "Unable to register a command server name"
+#~ msgstr "Kon nie bevelbediener naam registreer nie"
+
+#~ msgid "cannot get line"
+#~ msgstr "kan nie re๋l kry nie"
#~ msgid ""
-#~ "\n"
-#~ "Vim: Got X error\n"
+#~ "E281: TCL ERROR: exit code is not int!? Please report this to vim-dev@vim."
+#~ "org"
#~ msgstr ""
-#~ "\n"
-#~ "Vim: Het X fout ontvang\n"
-
-#~ msgid "Testing the X display failed"
-#~ msgstr "Toetsing van die X-vertoonskerm het gefaal"
-
-#~ msgid "Opening the X display timed out"
-#~ msgstr "Oopmaak van die X-vertoonskerm het uitgetel"
+#~ "E281: TCL FOUT: verlaatkode is nie 'n 'int'!? Rapporteer dit asb. aan "
+#~ "<vim-dev@vim.org>"
#~ msgid ""
-#~ "\n"
-#~ "Cannot execute shell sh\n"
+#~ "E571: Sorry, this command is disabled: the Tcl library could not be "
+#~ "loaded."
#~ msgstr ""
-#~ "\n"
-#~ "Kan nie dop 'sh' uitvoer nie\n"
+#~ "E571: Jammer, hierdie bevel is afgeskakel, die Tcl biblioteek kon nie "
+#~ "gelaai word nie."
-#~ msgid ""
-#~ "\n"
-#~ "Cannot create pipes\n"
+#~ msgid "cannot register callback command: buffer/window reference not found"
#~ msgstr ""
-#~ "\n"
-#~ "Kan nie pype skep nie\n"
+#~ "kan terugroepbevel nie registreer nie: buffer/vensterverwysing nie gevind "
+#~ "nie"
#~ msgid ""
-#~ "\n"
-#~ "Cannot fork\n"
+#~ "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-"
+#~ "dev@vim.org"
#~ msgstr ""
-#~ "\n"
-#~ "Kan nie vurk nie\n"
+#~ "E280: TCL FATALE FOUT: verwlys korrup!? Rapporteer dit asb. aan <vim-"
+#~ "dev@vim.org>"
#~ msgid ""
-#~ "\n"
-#~ "Command terminated\n"
+#~ "cannot register callback command: buffer/window is already being deleted"
#~ msgstr ""
-#~ "\n"
-#~ "Bevel be๋indig\n"
+#~ "kan nie terugroepbevel registreer nie: buffer/venster word alreeds geskrap"
-#~ msgid "XSMP lost ICE connection"
-#~ msgstr "XSMP het ICE konneksie verloor"
+#~ msgid "cannot create buffer/window command: object is being deleted"
+#~ msgstr "kan nie buffer/venster bevel skep nie: voorwerp word geskrap"
-#~ msgid "Opening the X display failed"
-#~ msgstr "Oopmaak van die X vertoonskerm het gefaal"
+#~ msgid "vim error"
+#~ msgstr "vim fout"
-#~ msgid "XSMP handling save-yourself request"
-#~ msgstr "XSMP hanteer 'save-yourself' versoek"
+#~ msgid "keyboard interrupt"
+#~ msgstr "sleutelbordonderbreking"
-#~ msgid "XSMP opening connection"
-#~ msgstr "XSMP maak nou konneksie oop"
+#~ msgid "unknown vimOption"
+#~ msgstr "onbekende 'vimOption'"
-#~ msgid "XSMP ICE connection watch failed"
-#~ msgstr "XSMP ICE konneksie beloer het gefaal"
+#~ msgid "unknown flag: "
+#~ msgstr "onbekende vlag: "
-#~ msgid "XSMP SmcOpenConnection failed: %s"
-#~ msgstr "XSMP 'SmcOpenConnection' het gefaal: %s"
+#~ msgid "cannot insert/append line"
+#~ msgstr "kan nie re๋l invoeg/aanlas nie"
-#~ msgid "At line"
-#~ msgstr "By re๋l"
+#~ msgid "row %d column %d"
+#~ msgstr "ry %d kolom %d"
-#~ msgid "Could not allocate memory for command line."
-#~ msgstr "Kan nie geheue toeken vir bevelre๋l nie"
+#~ msgid "mark not set"
+#~ msgstr "merker nie gestel nie"
-#~ msgid "VIM Error"
-#~ msgstr "VIM Fout"
+#~ msgid "cannot set line(s)"
+#~ msgstr "kan nie re๋l(s) stel nie"
-#~ msgid "Could not load vim32.dll!"
-#~ msgstr "Kon nie 'vim32.dll' laai nie!"
+#~ msgid "unknown option"
+#~ msgstr "onbekende opsie"
-#~ msgid "Could not fix up function pointers to the DLL!"
-#~ msgstr "Kon nie funksiewysers na die DLL opstel nie!"
+#~ msgid "not implemented yet"
+#~ msgstr "nog nie ge๏mplementeer nie"
-#~ msgid "shell returned %d"
-#~ msgstr "dop het %d gelewer"
+#~ msgid "Sniff: Error during write. Disconnected"
+#~ msgstr "Sniff: Fout gedurende stoor. Verbinding gebreek"
-#~ msgid "Vim: Caught %s event\n"
-#~ msgstr "Vim: Het %s gebeurtenis gevang\n"
+#~ msgid "E278: SNiFF+ not connected"
+#~ msgstr "E278: SNiFF+ is nie gekonnekteer nie"
-#~ msgid "close"
-#~ msgstr "maak toe"
+#~ msgid "E276: Error connecting to SNiFF+"
+#~ msgstr "E276: Fout in konnekteer met SNiFF+"
-#~ msgid "logoff"
-#~ msgstr "teken uit"
+#~ msgid "E275: Unknown SNiFF+ request: %s"
+#~ msgstr "E275: Onbekende SNiFF+ versoek: %s"
-#~ msgid "shutdown"
-#~ msgstr "sit af"
+#~ msgid "connected"
+#~ msgstr "gekonnekteer"
-#~ msgid "E371: Command not found"
-#~ msgstr "E371: Bevel nie gevind nie"
+#~ msgid "not "
+#~ msgstr "nie "
+
+#~ msgid "SNiFF+ is currently "
+#~ msgstr "SNiFF+ is tans"
+
+#~ msgid "E274: Sniff: Error during read. Disconnected"
+#~ msgstr "E274: Sniff: Fout gedurende lees. Verbinding gebreek"
#~ msgid ""
-#~ "VIMRUN.EXE not found in your $PATH.\n"
-#~ "External commands will not pause after completion.\n"
-#~ "See :help win32-vimrun for more information."
+#~ "Cannot connect to SNiFF+. Check environment (sniffemacs must be found in "
+#~ "$PATH).\n"
#~ msgstr ""
-#~ "'VIMRUN.EXE' nie gevind in '$PATH' nie.\n"
-#~ "Eksterne opdragte sal nie wag na voltooiing nie\n"
-#~ "Sien ':help win32-vimrun' vir meer inligting."
+#~ "Kan nie 'n verbinding met 'SNiFF+' maak nie. Kyk of die omgewing reg is "
+#~ "('sniffemacs' moet in '$PATH' gevind word).\n"
-#~ msgid "Vim Warning"
-#~ msgstr "Vim Waarskuwing"
+#~ msgid "Generate docu for"
+#~ msgstr "Genereer 'docu' vir"
-#~ msgid "E56: %s* operand could be empty"
-#~ msgstr "E56: %s* operand mag leeg wees"
+#~ msgid "Show docu of"
+#~ msgstr "Wys 'docu' van"
-#~ msgid "E57: %s+ operand could be empty"
-#~ msgstr "E57: %s+ operand mag leeg wees"
+#~ msgid "Xref used by"
+#~ msgstr "Xref gebruik deur"
-#~ msgid "E58: %s{ operand could be empty"
-#~ msgstr "E58: %s{ operand mag leeg wees"
+#~ msgid "Xref has a"
+#~ msgstr "Xref het 'n"
-#~ msgid "E361: Crash intercepted; regexp too complex?"
-#~ msgstr "E361: Ineenstorting onderskep. Patroon te kompleks?"
+#~ msgid "Xref referred by"
+#~ msgstr "Xref verwys deur"
-#~ msgid "E363: pattern caused out-of-stack error"
-#~ msgstr "E363: patroon het l๋e-stapel fout veroorsaak"
+#~ msgid "Xref refers to"
+#~ msgstr "Xref verwys na"
-#~ msgid "E396: containedin argument not accepted here"
-#~ msgstr "E396: 'containedin' parameter nie hier aanvaar nie"
+#~ msgid "Show class in restricted hierarchy"
+#~ msgstr "Wys klas in beperkte hi๋rargie"
-#~ msgid "Enter nr of choice (<CR> to abort): "
-#~ msgstr "Sleutel nommer van keuse in (<CR> om te stop): "
+#~ msgid "Show class in hierarchy"
+#~ msgstr "Wys klas in hi๋rargie"
-#~ msgid "E430: Tag file path truncated for %s\n"
-#~ msgstr "E430: Etiketl๊ergids afgekap vir %s\n"
+#~ msgid "Browse class"
+#~ msgstr "Kyk klas deur"
-#~ msgid "new shell started\n"
-#~ msgstr "nuwe dop begin\n"
+#~ msgid "Find symbol"
+#~ msgstr "Vind simbool"
-#~ msgid "No undo possible; continue anyway"
-#~ msgstr "Geen herstel moontlik; gaan in elk geval voort"
+#~ msgid "Show source of"
+#~ msgstr "Wys kode van"
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16/32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 16/32-bis GUI weergawe"
+#~ msgid "Retrieve"
+#~ msgstr "Gaan haal"
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 32-bis GUI version"
+#~ msgid "Retrieve from all projects"
+#~ msgstr "Gaan haal uit alle projekte"
-#~ msgid " in Win32s mode"
-#~ msgstr " in Win32s modus"
+#~ msgid "Retrieve from project"
+#~ msgstr "Gaan haal uit projek"
-#~ msgid " with OLE support"
-#~ msgstr " met OLE ondersteuning"
+#~ msgid "Retrieve from file"
+#~ msgstr "Gaan haal uit l๊er"
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 32-bis konsole weergawe"
+#~ msgid "Show overridden member function"
+#~ msgstr "Wys vervangde lidfunksie"
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16-bit version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 16-bis weergawe"
+#~ msgid "Show base class of"
+#~ msgstr "Wys basisklas van"
-#~ msgid ""
-#~ "\n"
-#~ "32-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "32-bis MS-DOS weergawe"
+#~ msgid "Toggle implementation/definition"
+#~ msgstr "Stel en herstel implimentasie/definisie"
-#~ msgid ""
-#~ "\n"
-#~ "16-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "16-bis MS-DOS weergawe"
+#~ msgid "E273: unknown longjmp status %d"
+#~ msgstr "E273: Onbekende 'longjmp' status %d"
#~ msgid ""
-#~ "\n"
-#~ "MacOS X (unix) version"
+#~ "E266: Sorry, this command is disabled, the Ruby library could not be "
+#~ "loaded."
#~ msgstr ""
-#~ "\n"
-#~ "MacOS X (unix) weergawe"
+#~ "E266: Jammer, hierdie bevel is afgeskakel, die Ruby biblioteekl๊er kon "
+#~ "nie gelaai word nie."
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS X weergawe"
+#~ msgid "string cannot contain newlines"
+#~ msgstr "string kan nie 'newlines' bevat nie"
-#~ msgid ""
-#~ "\n"
-#~ "MacOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS weergawe"
+#~ msgid "cannot insert line"
+#~ msgstr "kan re๋l nie byvoeg nie"
+
+#~ msgid "cannot replace line"
+#~ msgstr "kan re๋l nie vervang nie"
+
+#~ msgid "cannot delete line"
+#~ msgstr "kan re๋l nie verwyder nie"
+
+#~ msgid "no such window"
+#~ msgstr "geen sodanige venster nie"
+
+#~ msgid "<window %d>"
+#~ msgstr "<venster %d>"
+
+#~ msgid "<window object (unknown) at %.8lX>"
+#~ msgstr "<verwyder voorwerp (onbekend) by %.8lX>"
+
+#~ msgid "<window object (deleted) at %.8lX>"
+#~ msgstr "<venster voorwerp (geskrap) by %.8lX>"
+
+#~ msgid "cursor position outside buffer"
+#~ msgstr "loperposisie buite buffer"
+
+#~ msgid "readonly attribute"
+#~ msgstr "leesalleen eienskap"
+
+#~ msgid "attempt to refer to deleted window"
+#~ msgstr "poging om na geskrapte venster te verwys"
+
+#~ msgid "no such buffer"
+#~ msgstr "buffer bestaan nie"
+
+#~ msgid "invalid mark name"
+#~ msgstr "onbekende merknaam"
+
+#~ msgid "<buffer object (deleted) at %8lX>"
+#~ msgstr "<buffervoorwerp (geskrap) by %8lX>"
+
+#~ msgid "line number out of range"
+#~ msgstr "re๋lnommer buite omvang"
+
+#~ msgid "attempt to refer to deleted buffer"
+#~ msgstr "poging om na 'n geskrapte buffer te verwys"
+
+#~ msgid "expressions disabled at compile time"
+#~ msgstr "uitdrukkings afgeskakel tydens kompilering"
+
+# njj: net 'n voorstel ..
+#~ msgid "invalid expression"
+#~ msgstr "ongeldige uitdrukking"
+
+#~ msgid "E264: Python: Error initialising I/O objects"
+#~ msgstr "E264: Python: Kon nie I/O objekte inwy nie"
+
+#~ msgid "writelines() requires list of strings"
+#~ msgstr "'writelines()' benodig 'n lys van stringe"
+
+#~ msgid "invalid attribute"
+#~ msgstr "ongeldige eienskap"
+
+#~ msgid "softspace must be an integer"
+#~ msgstr "'softspace' moet 'n heelgetal wees"
+
+#~ msgid "can't delete OutputObject attributes"
+#~ msgstr "kan nie 'OutputObject' eienskappe skrap nie"
+
+#~ msgid "E659: Cannot invoke Python recursively"
+#~ msgstr "E659: Kan nie Python rekursief roep nie"
#~ msgid ""
-#~ "\n"
-#~ "RISC OS version"
+#~ "E263: Sorry, this command is disabled, the Python library could not be "
+#~ "loaded."
#~ msgstr ""
-#~ "\n"
-#~ "RISC OS weergawe"
+#~ "E263: Jammer, hierdie bevel is afgeskakel, die Python biblioteek l๊er kon "
+#~ "nie gelaai word nie."
+
+#~ msgid "E569: maximum number of cscope connections reached"
+#~ msgstr "E569: maksimum aantal 'cscope' verbindings bereik"
+
+#~ msgid "E626: cannot get cscope database information"
+#~ msgstr "E626: kan nie 'cscope' databasisinligting kry nie"
+
+#~ msgid "E625: cannot open cscope database: %s"
+#~ msgstr "E625: Kon nie 'cscope' databasis oopmaak nie: %s"
+
+#~ msgid "E563: stat error"
+#~ msgstr "E563: 'stat' fout"
+
+#~ msgid "E256: Hangul automata ERROR"
+#~ msgstr "E256: Hangul outomatiserings FOUT"
#~ msgid ""
+#~ "Font1 width: %<PRId64>\n"
#~ "\n"
-#~ "Big version "
#~ msgstr ""
+#~ "Font1 wydte: %<PRId64>\n"
#~ "\n"
-#~ "Groot weergawe "
-#~ msgid ""
-#~ "\n"
-#~ "Normal version "
+#~ msgid "Font0 width: %<PRId64>\n"
+#~ msgstr "Font0 wydte: %<PRId64>\n"
+
+#~ msgid "Font%<PRId64> width is not twice that of font0\n"
+#~ msgstr "Font%<PRId64> wydte is nie twee keer dํe van font0 nie\n"
+
+#~ msgid "Font1: %s\n"
+#~ msgstr "Font1: %s\n"
+
+#~ msgid "Font0: %s\n"
+#~ msgstr "Font0: %s\n"
+
+#~ msgid "E253: Fontset name: %s\n"
+#~ msgstr "E253: Fonstel naam: %s\n"
+
+#~ msgid "Font '%s' is not fixed-width"
+#~ msgstr "Font '%s' is nie 'n vaste-wydte font nie"
+
+#~ msgid "E252: Fontset name: %s"
+#~ msgstr "E252: Fontstel naam: %s"
+
+#~ msgid "E250: Fonts for the following charsets are missing in fontset %s:"
#~ msgstr ""
-#~ "\n"
-#~ "Normale weergawe "
+#~ "E250: Fonte vir die volgende karakterstelle ontbreek in fontversameling "
+#~ "%s:"
#~ msgid ""
-#~ "\n"
-#~ "Small version "
+#~ "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
#~ msgstr ""
-#~ "\n"
-#~ "Klein weergawe "
+#~ "Vim E458: Kan nie kleurkaart-inskrywing toeken nie, sommige kleure mag "
+#~ "verkeerd wees"
-#~ msgid ""
-#~ "\n"
-#~ "Tiny version "
+#~ msgid "Find & Replace (use '\\\\' to find a '\\')"
+#~ msgstr "Vind & vervang string (gebruik '\\\\' om 'n '\\' te vind"
+
+#~ msgid "Find string (use '\\\\' to find a '\\')"
+#~ msgstr "Vind string (gebruik '\\\\' om 'n '\\' te vind"
+
+#~ msgid "E672: Unable to open window inside MDI application"
+#~ msgstr "E672: Kon nie venster oopmaak binne 'n MDI toepassing nie"
+
+#~ msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
+#~ msgstr "E243: Parameter nie bekend: \"-%s\"; Gebruik die OLE weergawe."
+
+#~ msgid "Undo"
+#~ msgstr "Herroep"
+
+#~ msgid "Selection"
+#~ msgstr "Seleksie"
+
+#~ msgid "Files"
+#~ msgstr "L๊ers"
+
+#~ msgid "Help"
+#~ msgstr "Hulp"
+
+#~ msgid "Directories"
+#~ msgstr "Gidse"
+
+#~ msgid "Filter"
+#~ msgstr "Filter"
+
+#~ msgid "Used CUT_BUFFER0 instead of empty selection"
+#~ msgstr "'CUT_BUFFER0' is gebruik in plaas van le๋ seleksie"
+
+#~ msgid "Font Selection"
+#~ msgstr "Fontkeuse"
+
+#~ msgid "Vim: Main window unexpectedly destroyed\n"
+#~ msgstr "Vim: Hoofvenster onverwags verwoes\n"
+
+#~ msgid "Vim: Received \"die\" request from session manager\n"
+#~ msgstr "Vim: Het die \"die\" opdrag ontvang van sessiebestuurder\n"
+
+#~ msgid "Replace All"
+#~ msgstr "Vervang alles"
+
+#~ msgid "Replace"
+#~ msgstr "Vervang"
+
+#~ msgid "Find Next"
+#~ msgstr "Vind volgende"
+
+#~ msgid "Down"
+#~ msgstr "Af"
+
+#~ msgid "Up"
+#~ msgstr "Op"
+
+#~ msgid "Direction"
+#~ msgstr "Rigting"
+
+#~ msgid "Match case"
+#~ msgstr "Tref kas"
+
+#~ msgid "Match whole word only"
+#~ msgstr "Tref slegs presiese woord"
+
+#~ msgid "Replace with:"
+#~ msgstr "Vervang met:"
+
+#~ msgid "Find what:"
+#~ msgstr "Soek na:"
+
+#~ msgid "VIM - Search..."
+#~ msgstr "VIM - Soek..."
+
+#~ msgid "VIM - Search and Replace..."
+#~ msgstr "VIM - Soek en Vervang..."
+
+#~ msgid "Input _Methods"
+#~ msgstr "Invoer _Metodes"
+
+#~ msgid "Vim dialog..."
+#~ msgstr "Vim dialooghokkie..."
+
+#~ msgid "E599: Value of 'imactivatekey' is invalid"
+#~ msgstr "E599: Waarde van 'imactivatekey' is ongeldig"
+
+#~ msgid "E231: 'guifontwide' invalid"
+#~ msgstr "E231: 'guifontwide' ongeldig"
+
+#~ msgid "E665: Cannot start GUI, no valid font found"
+#~ msgstr "E665: Kan nie GUI begin nie, geen geldige font gevind nie"
+
+#~ msgid "E230: Cannot read from \"%s\""
+#~ msgstr "E230: Kan nie lees uit \"%s\" nie"
+
+#~ msgid "E229: Cannot start the GUI"
+#~ msgstr "E229: Kan nie die GUI begin nie"
+
+#~ msgid "E232: Cannot create BalloonEval with both message and callback"
+#~ msgstr "E232: Kan nie BalloonEval skep met beide boodskap en terugroep nie"
+
+#~ msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
#~ msgstr ""
-#~ "\n"
-#~ "Piepklein weergawe "
+#~ "Rolstaafelement: Kon nie pikselmatriks-duimnael se geometrie kry nie"
-#~ msgid "with GTK2-GNOME GUI."
-#~ msgstr "met GTK2-GNOME GUI."
+#~ msgid "Vim dialog"
+#~ msgstr "Vim dialooghokkie"
-#~ msgid "with GTK-GNOME GUI."
-#~ msgstr "met GTK-GNOME GUI."
+#~ msgid "Cancel"
+#~ msgstr "Kanselleer"
-#~ msgid "with GTK2 GUI."
-#~ msgstr "met GTK2 GUI"
+#~ msgid "OK"
+#~ msgstr "OK"
-#~ msgid "with GTK GUI."
-#~ msgstr "met GTK GUI"
+#~ msgid "E615: vim_SelFile: can't get current directory"
+#~ msgstr "E615: vim_SelFile: Kan nie huidige gids verkry nie"
-#~ msgid "with X11-Motif GUI."
-#~ msgstr "met X11-Motif GUI."
+#~ msgid "Pathname:"
+#~ msgstr "Gidsnaam:"
-#~ msgid "with X11-neXtaw GUI."
-#~ msgstr "met X11-neXtaw GUI"
+#~ msgid "E614: vim_SelFile: can't return to current directory"
+#~ msgstr "E614: 'vim_SelFile': Kan nie terugkeer na huidige gids nie"
-#~ msgid "with X11-Athena GUI."
-#~ msgstr "met X11-Athena GUI"
+#~ msgid "E616: vim_SelFile: can't get font %s"
+#~ msgstr "E616: 'vim_SelFile': kan font %s nie kry nie"
-#~ msgid "with BeOS GUI."
-#~ msgstr "met BeOS GUI"
+#~ msgid "<cannot open> "
+#~ msgstr "<kan nie oopmaak nie> "
-#~ msgid "with Photon GUI."
-#~ msgstr "met Photon GUI."
+#~ msgid "E460: The resource fork would be lost (add ! to override)"
+#~ msgstr "E460: Die hulpbronvurk sal verlore gaan (gebruik ! om te dwing)"
-#~ msgid "with GUI."
-#~ msgstr "met GUI."
+#~ msgid "Partial writes disallowed for NetBeans buffers"
+#~ msgstr "Gedeeltelike skryf word nie toegelaat vir NetBeans buffers nie"
-#~ msgid "with Carbon GUI."
-#~ msgstr "met Carbon GUI."
+#~ msgid "NetBeans disallows writes of unmodified buffers"
+#~ msgstr "NetBeans laat nie skryf toe van onveranderde buffers nie"
-#~ msgid "with Cocoa GUI."
-#~ msgstr "met Cocoa GUI."
+#~ msgid "[CONVERSION ERROR]"
+#~ msgstr "[OMSETTINGSFOUT]"
-#~ msgid "with (classic) GUI."
-#~ msgstr "met (klassieke) GUI."
+#~ msgid "[crypted]"
+#~ msgstr "[gekodeer]"
-#~ msgid " system gvimrc file: \""
-#~ msgstr " stelsel gvimrc-l๊er: \""
+#~ msgid "[NL found]"
+#~ msgstr "[NL gevind]"
-#~ msgid " user gvimrc file: \""
-#~ msgstr " gebruiker gvimrc-l๊er: \""
+#~ msgid "E196: No digraphs in this version"
+#~ msgstr "E196: Geen digrawe in hierdie weergawe nie"
-#~ msgid "2nd user gvimrc file: \""
-#~ msgstr "2de gebruiker gvimrc-l๊er: \""
+#~ msgid "Save Setup"
+#~ msgstr "Stoor konfigurasie"
-#~ msgid "3rd user gvimrc file: \""
-#~ msgstr "3de gebruiker gvimrc-l๊er: \""
+#~ msgid "Save Session"
+#~ msgstr "Stoor Sessie"
-#~ msgid " system menu file: \""
-#~ msgstr " stelsel kieslys-l๊er: \""
+#~ msgid "Save View"
+#~ msgstr "Stoor Oorsig"
-#~ msgid "Compiler: "
-#~ msgstr "Kompileerder: "
+#~ msgid "Save Redirection"
+#~ msgstr "Stoor Herversturing"
-#~ msgid "menu Help->Orphans for information "
-#~ msgstr "menu Hulp->Weeskinders vir meer inligting hieroor "
+#~ msgid "Window position: X %d, Y %d"
+#~ msgstr "Vensterposisie: X %d, Y %d"
-#~ msgid "Running modeless, typed text is inserted"
-#~ msgstr "Voer modus-loos uit, getikte teks word ingevoeg"
+#~ msgid "Append File"
+#~ msgstr "Las aan by l๊er"
-#~ msgid "menu Edit->Global Settings->Toggle Insert Mode "
-#~ msgstr "menu Redigeer->Globale verstellings->Stel en herstel Invoeg Modus"
+#~ msgid "Edit File in new window"
+#~ msgstr "Bewerk l๊er in nuwe venster"
-#~ msgid " for two modes "
-#~ msgstr " vir twee modusse "
+#~ msgid " (NOT FOUND)"
+#~ msgstr " (NIE GEVIND NIE)"
-#~ msgid "menu Edit->Global Settings->Toggle Vi Compatible"
-#~ msgstr "menu Redigeer->Global verstellings->Stel en herstel Vi Versoenbaar"
+#~ msgid "Edit File"
+#~ msgstr "Verander l๊er"
-#~ msgid " for Vim defaults "
-#~ msgstr " vir Vim verstekwaardes"
+#~ msgid "Source Vim script"
+#~ msgstr "Voer Vim skrip uit"
-#~ msgid "WARNING: Windows 95/98/ME detected"
-#~ msgstr "WAARSKUWING: Windows 95/98/ME bespeur"
+#~ msgid "Save As"
+#~ msgstr "Stoor As"
-#~ msgid "type :help windows95<Enter> for info on this"
-#~ msgstr "tik :help windows95<Enter> vir meer inligting hieroor"
+#~ msgid "E130: Undefined function: %s"
+#~ msgstr "E130: Ongedefinieerde funksie: %s"
-#~ msgid "E370: Could not load library %s"
-#~ msgstr "E370: Kon nie biblioteek laai nie %s"
+#~ msgid "E277: Unable to read a server reply"
+#~ msgstr "E277: Kon bediener-terugvoer nie lees nie"
+
+#~ msgid "E240: No connection to Vim server"
+#~ msgstr "E240: Geen verbinding met Vim bediener"
#~ msgid ""
-#~ "Sorry, this command is disabled: the Perl library could not be loaded."
+#~ "&OK\n"
+#~ "&Cancel"
#~ msgstr ""
-#~ "Jammer, hierdie bevel is afgeskakel: die Perl biblioteek kon nie gelaai "
-#~ "word nie."
+#~ "&OK\n"
+#~ "&Kanselleer"
-#~ msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
-#~ msgstr ""
-#~ "E299: Perl evaluasie verbied in die sandput sonder die 'Safe' module"
+#~ msgid "E106: Unknown variable: \"%s\""
+#~ msgstr "E106: Onbekende veranderlike: \"%s\""
-#~ msgid "Edit with &multiple Vims"
-#~ msgstr "Wysig met &meer as een Vim"
+#~ msgid "Patch file"
+#~ msgstr "Laslap l๊er"
-#~ msgid "Edit with single &Vim"
-#~ msgstr "Wysig met 'n enkel &Vim"
+#~ msgid "[No File]"
+#~ msgstr "[Geen l๊er]"
-#~ msgid "&Diff with Vim"
-#~ msgstr "Wys verskille ('&diff') met Vim"
+#~ msgid "[Error List]"
+#~ msgstr "[Foutlys]"
-#~ msgid "Edit with &Vim"
-#~ msgstr "Wysig met &Vim"
+#~ msgid "type :help cp-default<Enter> for info on this"
+#~ msgstr "tik :help cp-default<Enter> vir meer inligting hieroor"
-#~ msgid "Edit with existing Vim - &"
-#~ msgstr "Wysig met bestaande Vim - &"
+#~ msgid "type :set nocp<Enter> for Vim defaults"
+#~ msgstr "tik :set nocp<Enter> vir Vim verstekwaardes "
-#~ msgid "Edits the selected file(s) with Vim"
-#~ msgstr "Wysig die gekose l๊er(s) met Vim"
+#~ msgid "Running in Vi compatible mode"
+#~ msgstr "Voer tans uit in Vi-versoenbare modus"
-#~ msgid "Error creating process: Check if gvim is in your path!"
-#~ msgstr "FOut met die skep van proses: Kyk of gvim in jou pad is!"
+#~ msgid "type :help version7<Enter> for version info"
+#~ msgstr "tik :help version7<Enter> vir weergawe-inligting"
-#~ msgid "gvimext.dll error"
-#~ msgstr "'gvimext.dll' fout"
+#~ msgid "type :help<Enter> or <F1> for on-line help"
+#~ msgstr "tik :help<Enter> of <F1> vir aanlyn hulp "
-#~ msgid "Path length too long!"
-#~ msgstr "Pad-lengte te lank"
+#~ msgid "by Bram Moolenaar et al."
+#~ msgstr "deur Bram Moolenaar et al."
-#~ msgid "E234: Unknown fontset: %s"
-#~ msgstr "E234: Onbekende fontstel: %s"
+# njj: :))
+#~ msgid "version "
+#~ msgstr "Weergawe "
-#~ msgid "E235: Unknown font: %s"
-#~ msgstr "E235: Onbekende font: %s"
+#~ msgid "VIM - Vi IMproved"
+#~ msgstr "VIM - Vi Met skop"
-#~ msgid "E448: Could not load library function %s"
-#~ msgstr "E448: Kon nie biblioteek funksie laai nie %s"
+#~ msgid " DEBUG BUILD"
+#~ msgstr " ONTFOUTINGS-KOMPILERING"
-#~ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
+#~ msgid "Linking: "
+#~ msgstr "Koppeling: "
+
+#~ msgid "Compilation: "
+#~ msgstr "Kompilering: "
+
+#~ msgid " 2nd user exrc file: \""
+#~ msgstr " 2de gebruiker exrc-l๊er: \""
+
+#~ msgid " user exrc file: \""
+#~ msgstr " gebruiker exrc-l๊er: \""
+
+#~ msgid " 3rd user vimrc file: \""
+#~ msgstr " 3de gebruiker vimrc-l๊er \""
+
+#~ msgid " 2nd user vimrc file: \""
+#~ msgstr " 2de gebruiker vimrc-l๊er \""
+
+#~ msgid " user vimrc file: \""
+#~ msgstr " gebruiker vimrc-l๊er: \""
+
+#~ msgid " Features included (+) or not (-):\n"
+#~ msgstr " Kenmerke in- (+) of uitgesluit (-):\n"
+
+#~ msgid "without GUI."
+#~ msgstr "sonder GUI."
+
+#~ msgid ""
+#~ "\n"
+#~ "Huge version "
#~ msgstr ""
-#~ "E26: Hebreeus kan nie gebruik word nie: Nie tydens kompilering gekies "
-#~ "nie\n"
+#~ "\n"
+#~ "Enorme weergawe "
-#~ msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
+#~ msgid "Modified by "
+#~ msgstr "Gewysig deur "
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Extra patches: "
+#~ msgstr "Eksterne subtreffers:\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Included patches: "
#~ msgstr ""
-#~ "E27: Farsi kan nie gebruik word nie: Nie tydens kompilering gekies nie\n"
+#~ "\n"
+#~ "Ingeslote laslappies:"
-#~ msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
+#~ msgid ""
+#~ "\n"
+#~ "--- Terminal keys ---"
#~ msgstr ""
-#~ "E800: Arabies kan nie gebruik word nie: Nie tydens kompilering gekies "
-#~ "nie\n"
+#~ "\n"
+#~ "--- Terminaal sleutels ---"
-#~ msgid "E247: no registered server named \"%s\""
-#~ msgstr "E247: geen geregistreerde bediener genaamd \"%s\""
+#~ msgid "E437: terminal capability \"cm\" required"
+#~ msgstr "E437: terminaalvermo๋ \"cm\" vereis"
-#~ msgid "E233: cannot open display"
-#~ msgstr "E233: kan nie vertoonskerm oopmaak nie"
+#~ msgid "E436: No \"%s\" entry in termcap"
+#~ msgstr "E436: Geen \"%s\" inskrywing in termcap nie"
-#~ msgid "E463: Region is guarded, cannot modify"
-#~ msgstr "E463: Omgewing is onder bewaking, kan nie verander nie"
+#~ msgid "E559: Terminal entry not found in termcap"
+#~ msgstr "E559: Terminaalinskrywing nie in 'termcap' gevind nie"
-#~ msgid "function "
-#~ msgstr "funksie "
+#~ msgid "E558: Terminal entry not found in terminfo"
+#~ msgstr "E558: Terminaalinskrywing nie in 'terminfo' gevind nie"
-#~ msgid "Run Macro"
-#~ msgstr "Voer Makro uit"
+#~ msgid "E557: Cannot open termcap file"
+#~ msgstr "E557: Kan nie 'termcap'-l๊er oopmaak nie"
-#~ msgid "E242: Color name not recognized: %s"
-#~ msgstr "E242: Kleurnaam is onbekend: %s"
+#~ msgid "defaulting to '"
+#~ msgstr "gebruik verstek '"
-#~ msgid "error reading cscope connection %d"
-#~ msgstr "'cscope' verbinding %d kon nie gelees word nie"
+#~ msgid "' not known. Available builtin terminals are:"
+#~ msgstr "' onbekend. Beskikbare ingeboude terminale is:"
-#~ msgid "E260: cscope connection not found"
-#~ msgstr "E260: 'cscope' verbinding nie gevind nie"
+#~ msgid "E422: terminal code too long: %s"
+#~ msgstr "E422: terminaalkode te lank: %s"
-#~ msgid "cscope connection closed"
-#~ msgstr "'cscope' verbinding gesluit"
+#, fuzzy
+#~ msgid "Substitute "
+#~ msgstr "1 vervanging"
-# njj: dalk 'verbinding' ipv 'verbinding' orals?
-#~ msgid "couldn't malloc\n"
-#~ msgstr "kon nie 'malloc' nie\n"
+#~ msgid " (lang)"
+#~ msgstr " (taal)"
-#~ msgid "%2d %-5ld %-34s <none>\n"
-#~ msgstr "%2d %-5ld %-34s <geen>\n"
+#~ msgid ""
+#~ "\n"
+#~ "Cannot execute shell "
+#~ msgstr ""
+#~ "\n"
+#~ "Kan nie dop uitvoer nie "
-#~ msgid "E249: couldn't read VIM instance registry property"
-#~ msgstr "E249: kon nie VIM instansie register-kenmerk lees nie"
+#~ msgid "E522: Not found in termcap"
+#~ msgstr "E522: Nie gevind in 'termcap' nie"
-#~ msgid "\"\n"
-#~ msgstr "\"\n"
+#~ msgid "Thanks for flying Vim"
+#~ msgstr "Dankie dat jy vlieg met Vim"
-#~ msgid "--help\t\tShow Gnome arguments"
-#~ msgstr "--help\t\tWys Gnome parameters"
+#~ msgid "%<%f%h%m%=Page %N"
+#~ msgstr "%<%f%h%m%=Bladsy %N"
-#~ msgid "1 line ~ed"
-#~ msgstr "1 re๋l ge-~"
+#~ msgid "E574: Unknown register type %d"
+#~ msgstr "E574: Onbekende registertipe %d"
-#~ msgid "%<PRId64> lines ~ed"
-#~ msgstr "%<PRId64> re๋ls ge-~"
+#~ msgid ""
+#~ "\n"
+#~ "# Registers:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "# Registers:\n"
-#~ msgid " BLOCK"
-#~ msgstr " BLOK"
+#~ msgid "Illegal register name"
+#~ msgstr "Ongeldige registernaam"
-#~ msgid " LINE"
-#~ msgstr " REหL"
+#~ msgid "cannot yank; delete anyway"
+#~ msgstr "kan nie pluk nie: verwyder in elk geval"
-#~ msgid "Linear tag search"
-#~ msgstr "Lini๊re etiketsoek"
+#~ msgid "E337: Menu not found - check menu names"
+#~ msgstr "E337: Kieslys nie gevind nie - maak seker oor die kieslys name"
-#~ msgid "Binary tag search"
-#~ msgstr "Bin๊re etiketsoek"
+#~ msgid "E336: Menu path must lead to a sub-menu"
+#~ msgstr "E336: Kieslyspad moet lei na 'n sub-kieslys"
-#~ msgid "E258: no matches found in cscope connections"
-#~ msgstr "E258: geen treffers gevind in 'cscope' verbindings nie"
+#~ msgid "Swap file already exists!"
+#~ msgstr "Ruill๊er bestaan alreeds!"
-#~ msgid "No servers found for this display"
-#~ msgstr "Geen bedieners gevind vir die 'display' nie"
+#, fuzzy
+#~ msgid " Quit, or continue with caution.\n"
+#~ msgstr " Stop, of gaan versigtig voort.\n"
-#~ msgid "Missing filename"
-#~ msgstr "Ontbrekende l๊ernaam"
+#~ msgid "Missing '>'"
+#~ msgstr "Ontbrekende '>'"
-#~ msgid "Invalid line number: %<PRId64>"
-#~ msgstr "Ongeldige re๋lnommer: %<PRId64>"
+#~ msgid ""
+#~ "\n"
+#~ "# History of marks within files (newest to oldest):\n"
+#~ msgstr ""
+#~ "\n"
+#~ "# Geskiedenis van merkers in l๊ers (nuutste tot oudste):\n"
-#~ msgid "Cannot use :normal from event handler"
-#~ msgstr "Kan ':normal' nie vanuit gebeurtenishanteerder gebruik nie"
+#~ msgid ""
+#~ "\n"
+#~ "# Jumplist (newest first):\n"
+#~ msgstr ""
+#~ "\n"
+#~ "# Springlys (nuutste eerste):\n"
-#~ msgid "VIM - Help on..."
-#~ msgstr "VIM - Hulp met.."
+#~ msgid ""
+#~ "\n"
+#~ "# File marks:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "# L๊ermerkers:\n"
-#~ msgid "Topic:"
-#~ msgstr "Onderwerp:"
+#~ msgid "-h or --help\tPrint Help (this message) and exit"
+#~ msgstr "-h of --help\tSkryf Hulp (hierdie boodskap) en sluit"
-#~ msgid "Error: During loading fontset %s"
-#~ msgstr "Fout: Gedurende die laai van fontstel %s"
+#~ msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
+#~ msgstr "-i <viminfo>\t\tGebruik <viminfo> in plaas van .viminfo"
-#~ msgid "locale is not set correctly"
-#~ msgstr "lokaal is nie korrek gestel nie"
+#~ msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>"
+#~ msgstr "-W <skripuit>\tSkryf alle getikte bevele na l๊er <skripuit>"
-#~ msgid "For korean:"
-#~ msgstr "Vir Afrikaans:"
+#~ msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>"
+#~ msgstr "-w <skripuit>\tLas alle getikte bevele aan by l๊er <skripuit>"
-#~ msgid " csh: setenv LANG ko"
-#~ msgstr " csh: setenv LANG af"
+#~ msgid "+<lnum>\t\tStart at line <lnum>"
+#~ msgstr "+<lnum>\t\tBegin by re๋l <lnum>"
-#~ msgid " sh : export LANG=ko"
-#~ msgstr " sh: export LANG=af"
+#~ msgid "+\t\t\tStart at end of file"
+#~ msgstr "+\t\t\tBegin by einde van l๊er"
-#~ msgid "fontset name: %s"
-#~ msgstr "fontstel naam: %s"
+#~ msgid "-O[N]\t\tLike -o but split vertically"
+#~ msgstr "-O[N]\t\tSoos -o maar verdeel vertikaal"
-#~ msgid "Your language Font missing"
-#~ msgstr "Jou taal Font ontbreek"
+#~ msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc"
+#~ msgstr "-u <vimrc>\t\tGebruik <vimrc> in plaas van enige ander .vimrc"
-#~ msgid "automata ERROR: internal"
-#~ msgstr "automata FOUT: intern"
+#~ msgid "-T <terminal>\tSet terminal type to <terminal>"
+#~ msgstr "-T <terminaal>\tStel terminaaltipe na <terminaal>"
-#~ msgid "cs_add_common: alloc fail #1"
-#~ msgstr "'cs_add_common': toeken onsuksesvol #1"
+#~ msgid "-F\t\t\tStart in Farsi mode"
+#~ msgstr "-F\t\t\tBegin in Farsi modus"
-#~ msgid "cs_add_common: alloc fail #2"
-#~ msgstr "'cs_add_common': toeken onsuksesvol #2"
+#~ msgid "-H\t\t\tStart in Hebrew mode"
+#~ msgstr "-H\t\t\tBegin in Hebreeuse modus"
-#~ msgid "cs_add_common: alloc fail #3"
-#~ msgstr "'cs_add_common': toeken onsuksesvol #3"
+#~ msgid "-A\t\t\tstart in Arabic mode"
+#~ msgstr "-A\t\t\tbegin in Arabiese modus"
-#~ msgid "cs_add_common: alloc fail #4"
-#~ msgstr "'cs_add_common': toeken onsuksesvol #4"
+#~ msgid "-L\t\t\tSame as -r"
+#~ msgstr "-L\t\t\tSelfde as -r"
-#~ msgid "Retrieve next symbol"
-#~ msgstr "Kry volgende simbool"
+#~ msgid "-r (with file name)\tRecover crashed session"
+#~ msgstr "-r (met l๊er naam)\tHerwin ineengestorte sessie"
-#~ msgid "-- SNiFF+ commands --"
-#~ msgstr "-- SNiFF+ bevele --"
+#~ msgid "-r\t\t\tList swap files and exit"
+#~ msgstr "-r\t\t\tLys ruill๊ers en verlaat vim"
-#~ msgid "Unrecognized sniff request [%s]"
-#~ msgstr "Onbekende sniff versoek [%s]"
+#~ msgid "-D\t\t\tDebugging mode"
+#~ msgstr "-D\t\t\tOntfoutmodus"
-#~ msgid "Can't create input context."
-#~ msgstr "Kan nie invoerkonteks skep nie."
+#~ msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'"
+#~ msgstr "-N\t\t\tNie ten volle Vi-versoenbaar nie: 'nocompatible'"
-#~ msgid "Sorry, deleting a menu is not possible in the Athena version"
-#~ msgstr ""
-#~ "Jammer, in die Athena weergawe is dit onmoontlik om 'n kieslys te skrap"
+#~ msgid "-C\t\t\tCompatible with Vi: 'compatible'"
+#~ msgstr "-C\t\t\tVersoenbaar met Vi: 'compatible'"
-#~ msgid "Out of memory"
-#~ msgstr "Geheue op"
+#~ msgid "-l\t\t\tLisp mode"
+#~ msgstr "-l\t\t\tLisp modus"
-#~ msgid "PC (32 bits Vim)"
-#~ msgstr "PC (32 bisse Vim)"
+#~ msgid "-b\t\t\tBinary mode"
+#~ msgstr "-b\t\t\tBin๊re modus"
-#~ msgid "PC (16 bits Vim)"
-#~ msgstr "PC (16 bisse Vim)"
+#~ msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
+#~ msgstr "-Z\t\t\tBeperkte modus (soos \"rvim\")"
-#~ msgid "Unsupported screen mode"
-#~ msgstr "Ongesteunde skermmodus"
+#~ msgid "-R\t\t\tReadonly mode (like \"view\")"
+#~ msgstr "-R\t\t\tLeesalleen modus (soos \"view\")"
-#~ msgid "deadly signal"
-#~ msgstr "dodelike sein"
+#~ msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
+#~ msgstr "-y\t\t\tEasy modus (soos \"evim\", modusloos)"
-#~ msgid "some"
-#~ msgstr "sommige"
+#~ msgid "-d\t\t\tDiff mode (like \"vimdiff\")"
+#~ msgstr "-d\t\t\tDiff modus (soos \"vimdiff\")"
-#~ msgid "Library call failed"
-#~ msgstr "Biblioteekfunksieroep het gefaal"
+#~ msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")"
+#~ msgstr "-s\t\t\tStil (bondel) modus (slegs vir \"ex\")"
-#~ msgid "Cannot clear all highlight groups"
-#~ msgstr "Kan nie alle uitliggroepe leegmaak nie"
+#~ msgid "-e\t\t\tEx mode (like \"ex\")"
+#~ msgstr "-e\t\t\tEx modus (soos \"ex\")"
-#~ msgid "GUI is not running"
-#~ msgstr "GUI voer nie uit nie"
+#~ msgid "-v\t\t\tVi mode (like \"vi\")"
+#~ msgstr "-v\t\t\tVi modus (soos \"vi\")"
-#~ msgid "Command too long"
-#~ msgstr "Bevel te lank"
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ "Arguments:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ "Parameters:\n"
-#~ msgid "Ambiguous mapping"
-#~ msgstr "Dubbelsinnige binding"
+#~ msgid ""
+#~ "\n"
+#~ " or:"
+#~ msgstr ""
+#~ "\n"
+#~ " of:"
-#~ msgid "Ambiguous mapping, conflicts with \"%s\""
-#~ msgstr "Dubbelsinnige binding, bots met \"%s\""
+#~ msgid " vim [arguments] "
+#~ msgstr " vim [parameters] "
-#~ msgid "Too many \\("
-#~ msgstr "Te veel \\("
+#~ msgid "%d files to edit\n"
+#~ msgstr "%d l๊ers om te bewerk\n"
-#~ msgid "Unmatched \\("
-#~ msgstr "Onpaar \\("
+#~ msgid "Invalid argument for"
+#~ msgstr "Ongeldige parameter vir"
-#~ msgid "Nested *, \\=, \\+, \\! or \\{"
-#~ msgstr "Geneste *, \\=, \\+, \\! of \\{"
+#~ msgid "Zero count"
+#~ msgstr "Nul telling"
-#~ msgid "\\= follows nothing"
-#~ msgstr "\\= volg niks"
+#~ msgid "Nvim: Reading from stdin...\n"
+#~ msgstr "Vim: Lees nou vanaf 'stdin'...\n"
-#~ msgid "\\+ follows nothing"
-#~ msgstr "\\+ volg niks"
+#~ msgid "Input Line"
+#~ msgstr "Invoer Lyn"
-#~ msgid "\\@ follows nothing"
-#~ msgstr "\\@ volg niks"
+#~ msgid "Expression"
+#~ msgstr "Uitdrukking"
-#~ msgid "\\{ follows nothing"
-#~ msgstr "\\{ volg niks"
+#~ msgid "Search String"
+#~ msgstr "Soekstring"
-#~ msgid "\\* follows nothing"
-#~ msgstr "\\* volg niks"
+#~ msgid "Command Line"
+#~ msgstr "Bevelre๋l"
-#~ msgid "Unexpected magic character; check META."
-#~ msgstr "Onverwagte toorkarakter; kyk na META."
+#~ msgid ""
+#~ "\n"
+#~ "# %s History (newest to oldest):\n"
+#~ msgstr ""
+#~ "\n"
+#~ "# %s Geskiedenis (van nuutste na oudste):\n"
-#~ msgid "type :help uganda<Enter> if you like Vim "
-#~ msgstr "tik :help uganda<Enter> as jy hou van Vim "
+#~ msgid "E195: Cannot open viminfo file for reading"
+#~ msgstr "E195: Kan 'viminfo' l๊er nie oopmaak om te lees nie"
-#~ msgid " WARNING: Intel CPU detected. "
-#~ msgstr " WAARSKUWING: Intel SVE bespeur. "
+#~ msgid "E466: :winpos requires two number arguments"
+#~ msgstr "E466: :winpos benodig twee parameters"
-#~ msgid " PPC has a much better architecture. "
-#~ msgstr " PPC het 'n veel beter argitektuur. "
+#~ msgid "E188: Obtaining window position not implemented for this platform"
+#~ msgstr ""
+#~ "E188: Verkryging van vensterposisie is nie vir hierdie platform "
+#~ "ge๏mplementeer nie"
-#~ msgid "Security error: new viminfo file is a symbolic link"
-#~ msgstr "Sekuriteitsfout: nuwe viminfo l๊er is a simboliese skakel"
+#, fuzzy
+#~ msgid ""
+#~ "E747: Cannot change directory, buffer is modified (add ! to override)"
+#~ msgstr "E509: Kan rugsteunl๊er nie skep nie (gebruik ! om te dwing)"
-#~ msgid "line ~%<PRId64>: %s"
-#~ msgstr "re๋l ~%<PRId64>: %s"
+#~ msgid "E172: Only one file name allowed"
+#~ msgstr "E172: Slegs een l๊ernaam toegelaat"
-#~ msgid "makeef option not set"
-#~ msgstr "'makeef' opsie nie aan nie"
+#~ msgid ""
+#~ "\n"
+#~ "# Last Substitute String:\n"
+#~ "$"
+#~ msgstr ""
+#~ "\n"
+#~ "# Vorige Vervangstring:\n"
+#~ "$"
-#~ msgid "Security error: filter output is a symbolic link: %s"
-#~ msgstr "Sekuriteitsfout: filter afvoer is 'n simboliese skakel"
+#~ msgid "Illegal starting char"
+#~ msgstr "Ongeldige beginkarakter"
-#~ msgid "Security error: 'charconvert' output is a symbolic link"
-#~ msgstr "Sekuriteitsfout: 'charconvert' afvoer is 'n simboliese skakel"
+#~ msgid "# Value of 'encoding' when this file was written\n"
+#~ msgstr "# Waarde van 'encoding' toe hierdie l๊er gestoor is\n"
-#~ msgid "Security error: filter input is a symbolic link: %s"
-#~ msgstr "Sekuriteitsfout: filter invoer is 'n simboliese skakel"
+#~ msgid ""
+#~ "# You may edit it if you're careful!\n"
+#~ "\n"
+#~ msgstr ""
+#~ "# Jy mag dit wysig as jy versigtig is!\n"
+#~ "\n"
-#~ msgid "Fold must be at least two lines"
-#~ msgstr "'n Vou moet ten minste 2 re๋ls wees"
+#~ msgid "# This viminfo file was generated by Vim %s.\n"
+#~ msgstr "# Hierdie viminfo l๊er is gegenereer deur Vim %s.\n"
-#~ msgid "No fold at this line"
-#~ msgstr "Geen vou by hierdie re๋l nie"
+#~ msgid "E138: Can't write viminfo file %s!"
+#~ msgstr "E138: Kan nie viminfo l๊er %s stoor nie!"
-#~ msgid "Security error: shell command output is a symbolic link"
-#~ msgstr "Sekuriteitsfout: Dop-bevel afvoer is 'n simboliese skakel"
+#~ msgid "E136: viminfo: Too many errors, skipping rest of file"
+#~ msgstr "E136: viminfo: Te veel foute, slaan die res van die l๊er oor"
-#~ msgid "Warning: %s option changed from modeline"
-#~ msgstr "Waarskuwing: %s opsie verander vanaf moduslyn"
+#~ msgid "%sviminfo: %s in line: "
+#~ msgstr "%sviminfo: %s in re๋l: "
-#~ msgid "Change dir debugging enabled."
-#~ msgstr "Verandergids ontfouting in staat gestel"
+#~ msgid ""
+#~ "\n"
+#~ "# global variables:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "# globale veranderlikes:\n"
-#~ msgid "Not a proper file name: '%s'"
-#~ msgstr "Nie 'n geldige l๊ernaam nie: '%s'"
+#, fuzzy
+#~ msgid "E706: Variable type mismatch for: %s"
+#~ msgstr "E93: Meer as een treffer vir %s"
-#~ msgid "File name '%s' is valid"
-#~ msgstr "l๊ernaam '%s is ongeldig"
+#, fuzzy
+#~ msgid "E724: variable nested too deep for displaying"
+#~ msgstr "E22: Skripte te diep ge-nes"
-#~ msgid "Leave: %s"
-#~ msgstr "Verlaat: %s"
+#~ msgid ""
+#~ "\n"
+#~ "# Buffer list:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "# Buffer lys:\n"
-#~ msgid "WARNING: tag command changed a buffer!!!"
-#~ msgstr "WAARSKUWING: etiketbevel het buffer verander!!!"
+#, fuzzy
+#~ msgid "Unable to get option value"
+#~ msgstr "E258: Kan nie na kli๋nt stuur nie"
diff --git a/src/nvim/po/ca.po b/src/nvim/po/ca.po
index 79434cfdcd..7e83cb08ed 100644
--- a/src/nvim/po/ca.po
+++ b/src/nvim/po/ca.po
@@ -299,7 +299,7 @@ msgstr "E100: No hi ha cap altre buffer en mode diff"
#: ../diff.c:2112
msgid "E101: More than two buffers in diff mode, don't know which one to use"
-msgstr "E101: Hi ha m้s de 2 buffers en mode diff, no se sap quin usar"
+msgstr "E101: Hi ha m้s de 2 buffers en mode diff"
#: ../diff.c:2141
#, c-format
@@ -1095,7 +1095,7 @@ msgstr "%<PRId64> lํnies filtrades"
#: ../ex_cmds.c:1194
msgid "E135: *Filter* Autocommands must not change current buffer"
-msgstr "E135: Les auto-ordres *Filter* no poden canviar el buffer actual"
+msgstr "E135: Les ordres automเtiques *Filter* han de no modificar el buffer"
#: ../ex_cmds.c:1244
msgid "[No write since last change]\n"
@@ -1582,7 +1582,7 @@ msgstr "E605: No s'ha interceptat l'excepci๓: %s"
#: ../ex_docmd.c:1085
msgid "End of sourced file"
-msgstr "Final del fitxer interpretat"
+msgstr "Final de l'script"
#: ../ex_docmd.c:1086
msgid "End of function"
@@ -1881,7 +1881,7 @@ msgstr "%s s'ha descartat"
#: ../ex_eval.c:708
msgid "Exception"
-msgstr "Exepci๓"
+msgstr "Excepci๓"
#: ../ex_eval.c:713
msgid "Error and interrupt"
@@ -2162,7 +2162,7 @@ msgstr "[ERRORS DE LECTURA]"
#: ../fileio.c:2104
msgid "Can't find temp file for conversion"
-msgstr "No s'ha trobat el fitxer temporal per la conversi๓"
+msgstr "No s'ha trobat el fitxer temporal per a fer la conversi๓"
#: ../fileio.c:2110
msgid "Conversion with 'charconvert' failed"
@@ -2298,7 +2298,7 @@ msgstr "E205: patchmode: no s'ha pogut desar el fitxer original"
#: ../fileio.c:3602
msgid "E206: patchmode: can't touch empty original file"
-msgstr "E206: patchmode: no s'ha pogut tocar el fitxer original buit"
+msgstr "E206: patchmode: no s'ha pogut fer un toc al fitxer original buit"
#: ../fileio.c:3616
msgid "E207: Can't delete backup file"
@@ -2308,9 +2308,7 @@ msgstr "E207: No s'ha pogut eliminar la c๒pia de seguretat"
msgid ""
"\n"
"WARNING: Original file may be lost or damaged\n"
-msgstr ""
-"\n"
-"ATENCIำ: El fitxer original es pot haver fet malb้\n"
+msgstr "\nATENCIำ: El fitxer original es pot haver perdut o fet malb้\n"
#: ../fileio.c:3675
msgid "don't quit the editor until the file is successfully written!"
@@ -2460,7 +2458,7 @@ msgstr ""
#: ../fileio.c:5065
#, c-format
msgid "E462: Could not prepare for reloading \"%s\""
-msgstr "E462: No s'han pogut fer les preparacions per rellegir \"%s\""
+msgstr "E462: No s'han pogut fer les preparacions per a rellegir \"%s\""
#: ../fileio.c:5078
#, c-format
@@ -2536,7 +2534,7 @@ msgstr "Executant %s"
#: ../fileio.c:7211
#, c-format
msgid "autocommand %s"
-msgstr "auto-ordre %s"
+msgstr "ordre automเtica %s"
#: ../fileio.c:7795
msgid "E219: Missing {."
@@ -2717,11 +2715,6 @@ msgstr "E49: La distเncia de despla็ament no ้s vเlida"
msgid "E901: Job table is full"
msgstr ""
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
#: ../globals.h:1024
#, c-format
msgid "E364: Library call failed for \"%s()\""
@@ -3048,7 +3041,7 @@ msgstr "No hi ha text per imprimir"
#: ../hardcopy.c:668
#, c-format
msgid "Printing page %d (%d%%)"
-msgstr "S'estเ imprimint la pเgina %d (%d%%)"
+msgstr "Imprimint la pเgina %d (%d%%)"
#: ../hardcopy.c:680
#, c-format
@@ -3062,7 +3055,7 @@ msgstr "S'ha impr่s: %s"
#: ../hardcopy.c:740
msgid "Printing aborted"
-msgstr "S'ha avortat l'impressi๓"
+msgstr "S'ha avortat la impressi๓"
#: ../hardcopy.c:1365
msgid "E455: Error writing to PostScript output file"
@@ -3319,7 +3312,7 @@ msgstr "E609: Error de cscope: %s"
#: ../if_cscope.c:2053
msgid "All cscope databases reset"
-msgstr "S'han reiniciat totes les bases de dades cscope"
+msgstr "S'han restablert totes les bases de dades cscope"
#: ../if_cscope.c:2123
msgid "no cscope connections\n"
@@ -3416,7 +3409,7 @@ msgstr "-q [ftxerrors] edita el fitxer on hi ha el primer error"
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
@@ -3522,7 +3515,7 @@ msgstr "-n\t\t\tNo usa fitxers d'intercanvi, nom้s mem๒ria"
#: ../main.c:2218
msgid "-r\t\t\tList swap files and exit"
-msgstr "-r\t\t\tLlista els fitxers d'intercanvi i surt"
+msgstr "-r\t\t\tLlistat dels fitxers d'intercanvi"
#: ../main.c:2219
msgid "-r (with file name)\tRecover crashed session"
@@ -3554,7 +3547,7 @@ msgstr "-u <vimrc>\t\tUsa <vimrc> en lloc de qualsevol altre .vimrc"
#: ../main.c:2226
msgid "--noplugin\t\tDon't load plugin scripts"
-msgstr "--noplugin\t\tNo carrega cap plugin"
+msgstr "--noplugin\t\tNo carrega plugins"
#: ../main.c:2227
msgid "-p[N]\t\tOpen N tab pages (default: one for each file)"
@@ -3566,7 +3559,7 @@ msgstr "-o[N]\t\tObre N finestres (per omissi๓: una per fitxer)"
#: ../main.c:2229
msgid "-O[N]\t\tLike -o but split vertically"
-msgstr "-O[N]\t\tCom -o per๒ amb divisions verticals"
+msgstr "-O[N]\t\tCom -o per๒ amb divisi๓ vertical"
#: ../main.c:2230
msgid "+\t\t\tStart at end of file"
@@ -3744,7 +3737,7 @@ msgstr "E305: No s'ha trobat el fitxer d'intercanvi de %s"
#: ../memline.c:839
msgid "Enter number of swap file to use (0 to quit): "
-msgstr "Entreu el n๚mero del fitxer d'intercanvi a utilitzar (0 per sortir): "
+msgstr "Entreu el n๚mero del fitxer .swp a utilitzar (0 per a sortir): "
#: ../memline.c:879
#, c-format
@@ -3812,6 +3805,30 @@ msgstr "E308: Atenci๓: El fitxer original pot haver canviat"
#: ../memline.c:1061
#, c-format
+msgid "Swap file is encrypted: \"%s\""
+msgstr "El fitxer d'intercanvi estเ xifrat: \"%s\""
+
+msgid ""
+"\n"
+"If you entered a new crypt key but did not write the text file,"
+msgstr "\nSi vau entrar una nova clau de xifrat per๒ no vau desar el fitxer,"
+
+msgid ""
+"\n"
+"enter the new crypt key."
+msgstr "\nentreu la nova clau."
+
+msgid ""
+"\n"
+"If you wrote the text file after changing the crypt key press enter"
+msgstr "\nSi vau desar el fitxer despr้s de canviar la clau, premeu Entrar per a"
+
+msgid ""
+"\n"
+"to use the same key for text file and swap file"
+msgstr "\nusar la mateixa clau per al fitxer de text i per al fitxer d'intercanvi."
+
+#, c-format
msgid "E309: Unable to read block 1 from %s"
msgstr "E309: No s'ha pogut llegir el bloc 1 de %s"
@@ -3936,7 +3953,7 @@ msgstr " [del Vim versi๓ 3.0]"
#: ../memline.c:1550
msgid " [does not look like a Vim swap file]"
-msgstr " [no sembla un fitxer d'intercanvi de Vim]"
+msgstr " [no sembla un fitxer .swp de Vim]"
#: ../memline.c:1552
msgid " file name: "
@@ -4008,7 +4025,7 @@ msgstr " [no es pot obrir]"
#: ../memline.c:1698
msgid "E313: Cannot preserve, there is no swap file"
-msgstr "E313: No s'ha pogut preservar, no hi ha fitxer d'intercanvi"
+msgstr "E313: No s'ha pogut preservar, no existeix cap fitxer d'intercanvi"
#: ../memline.c:1747
msgid "File preserved"
@@ -4030,7 +4047,7 @@ msgstr "E316: ml_get: no s'ha trobat la lํnia %<PRId64>"
#: ../memline.c:2236
msgid "E317: pointer block id wrong 3"
-msgstr "E317: Punter a la id d'un bloc incorrecte 3"
+msgstr "E317: punter a id de bloc incorrecte 3"
#: ../memline.c:2311
msgid "stack_idx should be 0"
@@ -4042,7 +4059,7 @@ msgstr "E318: S'han actualitzat massa blocs?"
#: ../memline.c:2511
msgid "E317: pointer block id wrong 4"
-msgstr "E317: Punter a la id d'un bloc incorrecte 4"
+msgstr "E317: Punter a id de bloc incorrecte 4"
#: ../memline.c:2536
msgid "deleted block 1?"
@@ -4092,9 +4109,7 @@ msgstr "E325: ATENCIำ"
msgid ""
"\n"
"Found a swap file by the name \""
-msgstr ""
-"\n"
-"S'ha trobat un fitxer d'intercanvi de nom \""
+msgstr "\nS'ha trobat un fitxer d'intercanvi amb nom \""
#: ../memline.c:3226
msgid "While opening file \""
@@ -4139,7 +4154,7 @@ msgid ""
" to recover the changes (see \":help recovery\").\n"
msgstr ""
"\"\n"
-" per recuperar els canvis (vegeu \":help recovery\").\n"
+" per a recuperar els canvis (vegeu \":help recovery\").\n"
#: ../memline.c:3250
msgid " If you did this already, delete the swap file \""
@@ -4151,7 +4166,7 @@ msgid ""
" to avoid this message.\n"
msgstr ""
"\"\n"
-" per evitar aquest missatge.\n"
+" per a evitar aquest missatge.\n"
#: ../memline.c:3450 ../memline.c:3452
msgid "Swap file \""
@@ -4177,7 +4192,7 @@ msgid ""
"&Quit\n"
"&Abort"
msgstr ""
-"&Obrir nom้s-lectura\n"
+"&Obrir amb nom้s lectura\n"
"&Editar igualment\n"
"&Recuperar\n"
"&Sortir\n"
@@ -4293,10 +4308,6 @@ msgstr "lํnia %4ld:"
msgid "E354: Invalid register name: '%s'"
msgstr "E354: El nom de registre no ้s vเlid: '%s'"
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr "Traducci๓ dels missatges: Ernest Adrogu้ <eadrogue@gmx.net>"
-
#: ../message.c:986
msgid "Interrupt: "
msgstr "Interrupci๓: "
@@ -4849,7 +4860,7 @@ msgstr "E377: %%%c no vเlid a la cadena de format"
#. nothing found
#: ../quickfix.c:477
msgid "E378: 'errorformat' contains no pattern"
-msgstr "E378: L'opci๓ 'errorformat' no cont้ cap patr๓"
+msgstr "E378: 'errorformat' no cont้ cap patr๓"
#: ../quickfix.c:695
msgid "E379: Missing or empty directory name"
@@ -5243,7 +5254,7 @@ msgstr "S'han trobat tots els fitxers inclosos"
#: ../search.c:4519
msgid "No included files"
-msgstr "No hi han fitxers inclosos"
+msgstr "No hi ha fitxers inclosos"
#: ../search.c:4527
msgid "E388: Couldn't find definition"
@@ -5338,8 +5349,8 @@ msgstr "Atenci๓: la regi๓ %s no estเ suportada"
#: ../spell.c:4550
#, c-format
-msgid "Reading affix file %s ..."
-msgstr "Llegint el fitxer d'afixos %s ..."
+msgid "Reading affix file %s..."
+msgstr "Llegint el fitxer d'afixos %s..."
#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
#, c-format
@@ -5537,8 +5548,8 @@ msgstr "%d paraula/es ignorada/es amb carเcters no-ASCII a %s"
#: ../spell.c:6115
#, c-format
-msgid "Reading word file %s ..."
-msgstr "Llegint el fitxer de paraules %s ..."
+msgid "Reading word file %s..."
+msgstr "Llegint el fitxer de paraules %s..."
#: ../spell.c:6155
#, c-format
@@ -5608,13 +5619,13 @@ msgstr "Nombre total de paraules: %d"
#: ../spell.c:7655
#, c-format
-msgid "Writing suggestion file %s ..."
-msgstr "Escrivint el fitxer de suggeriments %s ..."
+msgid "Writing suggestion file %s..."
+msgstr "Escrivint el fitxer de suggeriments %s..."
#: ../spell.c:7707 ../spell.c:7927
#, c-format
msgid "Estimated runtime memory use: %d bytes"
-msgstr "ฺs estimat de mem๒ria en funcionament: %d octets"
+msgstr "ฺs estimat de mem๒ria durant l'execuci๓: %d octets"
#: ../spell.c:7820
msgid "E751: Output file name must not have region name"
@@ -5631,12 +5642,12 @@ msgstr "E755: Regi๓ no vเlida a %s"
#: ../spell.c:7907
msgid "Warning: both compounding and NOBREAK specified"
-msgstr "Atenci๓: heu especificat composici๓ i NOBREAK alhora"
+msgstr "Atenci๓: s'ha especificat composici๓ i NOBREAK alhora"
#: ../spell.c:7920
#, c-format
-msgid "Writing spell file %s ..."
-msgstr "Escrivint el fitxer d'ortografia %s ..."
+msgid "Writing spell file %s..."
+msgstr "Escrivint el fitxer d'ortografia %s..."
#: ../spell.c:7925
msgid "Done!"
@@ -6382,7 +6393,7 @@ msgstr " alternativa per a $VIM: \""
# 29 carเcters fins el ":" (incl๒s)
#: ../version.c:705
msgid " f-b for $VIMRUNTIME: \""
-msgstr " alt per a $VIMRUNTIME: \""
+msgstr " altern. per a $VIMRUNTIME: \""
#: ../version.c:709
msgid "Compilation: "
@@ -6410,7 +6421,7 @@ msgstr "per Bram Moolenaar et al."
#: ../version.c:774
msgid "Vim is open source and freely distributable"
-msgstr "Vim ้s un programa obert i lliure distribuci๓"
+msgstr "Vim ้s un programa obert i de lliure distribuci๓"
#: ../version.c:776
msgid "Help poor children in Uganda!"
diff --git a/src/nvim/po/check.vim b/src/nvim/po/check.vim
index 1622741da6..eae27ef74d 100644
--- a/src/nvim/po/check.vim
+++ b/src/nvim/po/check.vim
@@ -33,36 +33,67 @@ func! GetMline()
return substitute(idline, '[^%]*\(%[-+ #''.0-9*]*l\=[dsuxXpoc%]\)\=', '\1', 'g')
endfunc
-" This only works when 'wrapscan' is set.
+" This only works when 'wrapscan' is not set.
let s:save_wrapscan = &wrapscan
-set wrapscan
+set nowrapscan
" Start at the first "msgid" line.
+let wsv = winsaveview()
1
-/^msgid
-let startline = line('.')
+/^msgid\>
+
+" When an error is detected this is set to the line number.
+" Note: this is used in the Makefile.
let error = 0
while 1
if getline(line('.') - 1) !~ "no-c-format"
- let fromline = GetMline()
+ " go over the "msgid" and "msgid_plural" lines
+ let prevfromline = 'foobar'
+ while 1
+ let fromline = GetMline()
+ if prevfromline != 'foobar' && prevfromline != fromline
+ echomsg 'Mismatching % in line ' . (line('.') - 1)
+ echomsg 'msgid: ' . prevfromline
+ echomsg 'msgid ' . fromline
+ if error == 0
+ let error = line('.')
+ endif
+ endif
+ if getline('.') !~ 'msgid_plural'
+ break
+ endif
+ let prevfromline = fromline
+ endwhile
+
if getline('.') !~ '^msgstr'
- echo 'Missing "msgstr" in line ' . line('.')
- let error = 1
- endif
- let toline = GetMline()
- if fromline != toline
- echo 'Mismatching % in line ' . (line('.') - 1)
- echo 'msgid: ' . fromline
- echo 'msgstr: ' . toline
- let error = 1
+ echomsg 'Missing "msgstr" in line ' . line('.')
+ if error == 0
+ let error = line('.')
+ endif
endif
+
+ " check all the 'msgstr' lines
+ while getline('.') =~ '^msgstr'
+ let toline = GetMline()
+ if fromline != toline
+ echomsg 'Mismatching % in line ' . (line('.') - 1)
+ echomsg 'msgid: ' . fromline
+ echomsg 'msgstr: ' . toline
+ if error == 0
+ let error = line('.')
+ endif
+ endif
+ if line('.') == line('$')
+ break
+ endif
+ endwhile
endif
- " Find next msgid.
- " Wrap around at the end of the file, quit when back at the first one.
- /^msgid
- if line('.') == startline
+ " Find next msgid. Quit when there is no more.
+ let lnum = line('.')
+ silent! /^msgid\>
+ if line('.') == lnum
break
endif
endwhile
@@ -77,12 +108,103 @@ endwhile
"
1
if search('msgid "\("\n"\)\?\([EW][0-9]\+:\).*\nmsgstr "\("\n"\)\?[^"]\@=\2\@!') > 0
- echo 'Mismatching error/warning code in line ' . line('.')
- let error = 1
+ echomsg 'Mismatching error/warning code in line ' . line('.')
+ if error == 0
+ let error = line('.')
+ endif
endif
+func! CountNl(first, last)
+ let nl = 0
+ for lnum in range(a:first, a:last)
+ let nl += count(getline(lnum), "\n")
+ endfor
+ return nl
+endfunc
+
+" Check that the \n at the end of the msgid line is also present in the msgstr
+" line. Skip over the header.
+1
+/^"MIME-Version:
+while 1
+ let lnum = search('^msgid\>')
+ if lnum <= 0
+ break
+ endif
+ let strlnum = search('^msgstr\>')
+ let end = search('^$')
+ if end <= 0
+ let end = line('$') + 1
+ endif
+ let origcount = CountNl(lnum, strlnum - 1)
+ let transcount = CountNl(strlnum, end - 1)
+ " Allow for a few more or less line breaks when there are 2 or more
+ if origcount != transcount && (origcount <= 2 || transcount <= 2)
+ echomsg 'Mismatching "\n" in line ' . line('.')
+ if error == 0
+ let error = lnum
+ endif
+ endif
+endwhile
+
+" Check that the file is well formed according to msgfmts understanding
+if executable("msgfmt")
+ let filename = expand("%")
+ let a = system("msgfmt --statistics OLD_PO_FILE_INPUT=yes " . filename)
+ if v:shell_error != 0
+ let error = matchstr(a, filename.':\zs\d\+\ze:')+0
+ for line in split(a, '\n') | echomsg line | endfor
+ endif
+endif
+
+" Check that the plural form is properly initialized
+1
+let plural = search('^msgid_plural ', 'n')
+if (plural && search('^"Plural-Forms: ', 'n') == 0) || (plural && search('^msgstr\[0\] ".\+"', 'n') != plural + 1)
+ if search('^"Plural-Forms: ', 'n') == 0
+ echomsg "Missing Plural header"
+ if error == 0
+ let error = search('\(^"[A-Za-z-_]\+: .*\\n"\n\)\+\zs', 'n') - 1
+ endif
+ elseif error == 0
+ let error = plural
+ endif
+elseif !plural && search('^"Plural-Forms: ', 'n')
+ " We allow for a stray plural header, msginit adds one.
+endif
+
+" Check that 8bit encoding is used instead of 8-bit
+let cte = search('^"Content-Transfer-Encoding:\s\+8-bit', 'n')
+let ctc = search('^"Content-Type:.*;\s\+\<charset=[iI][sS][oO]_', 'n')
+let ctu = search('^"Content-Type:.*;\s\+\<charset=utf-8', 'n')
+if cte
+ echomsg "Content-Transfer-Encoding should be 8bit instead of 8-bit"
+ " TODO: make this an error
+ " if error == 0
+ " let error = cte
+ " endif
+elseif ctc
+ echomsg "Content-Type charset should be 'ISO-...' instead of 'ISO_...'"
+ " TODO: make this an error
+ " if error == 0
+ " let error = ct
+ " endif
+elseif ctu
+ echomsg "Content-Type charset should be 'UTF-8' instead of 'utf-8'"
+ " TODO: make this an error
+ " if error == 0
+ " let error = ct
+ " endif
+endif
+
+
if error == 0
- echo "OK"
+ " If all was OK restore the view.
+ call winrestview(wsv)
+ echomsg "OK"
+else
+ " Put the cursor on the line with the error.
+ exe error
endif
redir END
diff --git a/src/nvim/po/cleanup.vim b/src/nvim/po/cleanup.vim
index 24ae74ed38..b27d88092f 100644
--- a/src/nvim/po/cleanup.vim
+++ b/src/nvim/po/cleanup.vim
@@ -8,12 +8,18 @@
let s:was_diff = &diff
setl nodiff
-silent g/^#: /d
+" untranslated message preceded by c-format or comment
+silent g/^#, c-format\n#/.d
+silent g/^#\..*\n#/.d
+
+silent g/^#[:~] /d
silent g/^#, fuzzy\(, .*\)\=\nmsgid ""\@!/.+1,/^$/-1s/^/#\~ /
silent g/^msgstr"/s//msgstr "/
silent g/^msgid"/s//msgid "/
silent g/^msgstr ""\(\n"\)\@!/?^msgid?,.s/^/#\~ /
+silent g/^\n\n\n/.d
+
if s:was_diff
setl diff
endif
diff --git a/src/nvim/po/cs.cp1250.po b/src/nvim/po/cs.cp1250.po
index 1e62034317..26bdbe8c45 100644
--- a/src/nvim/po/cs.cp1250.po
+++ b/src/nvim/po/cs.cp1250.po
@@ -2535,7 +2535,7 @@ msgstr "E216: Udแlost %s neexistuje"
#: ../fileio.c:6090
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
"--- Automatick้ p๘ํkazy ---"
@@ -2559,7 +2559,7 @@ msgstr "E218: vno๘enํ automatick้ho p๘ํkazu p๘ํliš hlubokแ"
#: ../fileio.c:7143
#, c-format
-msgid "%s Auto commands for \"%s\""
+msgid "%s Autocommands for \"%s\""
msgstr "%s automatick้ p๘ํkazy pro \"%s\""
#: ../fileio.c:7149
@@ -2763,11 +2763,6 @@ msgstr "E49: Chybnแ hodnota volby 'scroll'"
msgid "E901: Job table is full"
msgstr ""
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
#: ../globals.h:1024
#, c-format
msgid "E364: Library call failed for \"%s()\""
@@ -3491,7 +3486,7 @@ msgstr "-q [chybov soubor] editovat soubor na mํst์ vskytu prvnํ chyby"
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
@@ -4378,10 +4373,6 @@ msgstr "๘แdek %4ld:"
msgid "E354: Invalid register name: '%s'"
msgstr "E354: '%s' nenํ p๘ํpustn้ jm้no registru"
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr "Sprแvce zprแv: Bram Moolenaar <Bram@vim.org>"
-
#: ../message.c:986
msgid "Interrupt: "
msgstr "P๘erušenํ: "
diff --git a/src/nvim/po/cs.po b/src/nvim/po/cs.po
index dd7016fedb..986d6753a8 100644
--- a/src/nvim/po/cs.po
+++ b/src/nvim/po/cs.po
@@ -2535,7 +2535,7 @@ msgstr "E216: Udแlost %s neexistuje"
#: ../fileio.c:6090
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
"--- Automatick้ p๘ํkazy ---"
@@ -2559,7 +2559,7 @@ msgstr "E218: vno๘enํ automatick้ho p๘ํkazu p๘ํliน hlubokแ"
#: ../fileio.c:7143
#, c-format
-msgid "%s Auto commands for \"%s\""
+msgid "%s Autocommands for \"%s\""
msgstr "%s automatick้ p๘ํkazy pro \"%s\""
#: ../fileio.c:7149
@@ -2763,11 +2763,6 @@ msgstr "E49: Chybnแ hodnota volby 'scroll'"
msgid "E901: Job table is full"
msgstr ""
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
#: ../globals.h:1024
#, c-format
msgid "E364: Library call failed for \"%s()\""
@@ -3491,7 +3486,7 @@ msgstr "-q [chybov soubor] editovat soubor na mํst์ vskytu prvnํ chyby"
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
@@ -4378,10 +4373,6 @@ msgstr "๘แdek %4ld:"
msgid "E354: Invalid register name: '%s'"
msgstr "E354: '%s' nenํ p๘ํpustn้ jm้no registru"
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr "Sprแvce zprแv: Bram Moolenaar <Bram@vim.org>"
-
#: ../message.c:986
msgid "Interrupt: "
msgstr "P๘eruนenํ: "
diff --git a/src/nvim/po/da.po b/src/nvim/po/da.po
new file mode 100644
index 0000000000..58cd19210b
--- /dev/null
+++ b/src/nvim/po/da.po
@@ -0,0 +1,7088 @@
+# Danish translation for Vim
+# Copyright (C) 2018 The Vim authors
+# This file is distributed under the same license as the vim package.
+# scootergrisen, 2018.
+msgid ""
+msgstr ""
+"Project-Id-Version: Vim 8.1\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-06-08 22:09+0200\n"
+"PO-Revision-Date: 2018-06-23 23:30+0200\n"
+"Last-Translator: scootergrisen\n"
+"Language-Team: Danish\n"
+"Language: da\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "E831: bf_key_init() called with empty password"
+msgstr "E831: bf_key_init() kaldt med tom adgangskode"
+
+msgid "E820: sizeof(uint32_t) != 4"
+msgstr "E820: sizeof(uint32_t) != 4"
+
+msgid "E817: Blowfish big/little endian use wrong"
+msgstr "E817: Forkert brug af stor/lille byterรฆkkefรธlge for blowfish"
+
+msgid "E818: sha256 test failed"
+msgstr "E818: sha256-test mislykkede"
+
+msgid "E819: Blowfish test failed"
+msgstr "E819: Blowfish-test mislykkede"
+
+msgid "[Location List]"
+msgstr "[Placeringsliste]"
+
+msgid "[Quickfix List]"
+msgstr "[Quickfix-liste]"
+
+msgid "E855: Autocommands caused command to abort"
+msgstr "E855: Autokommandoer forรฅrsagede afbrydelse af kommando"
+
+msgid "E82: Cannot allocate any buffer, exiting..."
+msgstr "E82: Kan ikke allokere buffer, afslutter..."
+
+msgid "E83: Cannot allocate buffer, using other one..."
+msgstr "E83: Kan ikke allokere buffer, bruger en anden..."
+
+msgid "E931: Buffer cannot be registered"
+msgstr "E931: Buffer kan ikke registreres"
+
+msgid "E937: Attempt to delete a buffer that is in use"
+msgstr "E937: Forsรธg pรฅ at slette en buffer som er i brug"
+
+msgid "E515: No buffers were unloaded"
+msgstr "E515: Ingen buffere blev udlรฆst"
+
+msgid "E516: No buffers were deleted"
+msgstr "E516: Ingen brugere blev slettet"
+
+msgid "E517: No buffers were wiped out"
+msgstr "E517: Ingen buffere blev ryddet"
+
+msgid "1 buffer unloaded"
+msgstr "1 buffer udlรฆst"
+
+#, c-format
+msgid "%d buffers unloaded"
+msgstr "%d buffere udlรฆst"
+
+msgid "1 buffer deleted"
+msgstr "1 buffer slettet"
+
+#, c-format
+msgid "%d buffers deleted"
+msgstr "%d buffere slettet"
+
+msgid "1 buffer wiped out"
+msgstr "1 buffer ryddet"
+
+#, c-format
+msgid "%d buffers wiped out"
+msgstr "%d buffere ryddet"
+
+msgid "E90: Cannot unload last buffer"
+msgstr "E90: Kan ikke udlรฆse sidste buffer"
+
+msgid "E84: No modified buffer found"
+msgstr "E84: Fandt ingen รฆndret buffer"
+
+msgid "E85: There is no listed buffer"
+msgstr "E85: Der er ingen oplistet buffer"
+
+msgid "E87: Cannot go beyond last buffer"
+msgstr "E87: Kan ikke gรฅ over sidste buffer"
+
+msgid "E88: Cannot go before first buffer"
+msgstr "E88: Kan ikke gรฅ fรธr fรธrste buffer"
+
+#, c-format
+msgid "E89: No write since last change for buffer %ld (add ! to override)"
+msgstr ""
+"E89: Ingen skrivning siden sidste รฆndring for bufferen %ld (tilfรธj ! for at "
+"tilsidesรฆtte)"
+
+msgid "E948: Job still running (add ! to end the job)"
+msgstr "E948: Job kรธrer stadig (tilfรธj ! for at afslutte jobbet)"
+
+msgid "E37: No write since last change (add ! to override)"
+msgstr ""
+"E37: Ingen skrivning siden sidste รฆndring (tilfรธj ! for at tilsidesรฆtte)"
+
+msgid "E948: Job still running"
+msgstr "E948: Job kรธrer stadig"
+
+msgid "E37: No write since last change"
+msgstr "E37: Ingen skrivning siden sidste รฆndring"
+
+msgid "W14: Warning: List of file names overflow"
+msgstr "W14: Advarsel: Overlรธb i liste over filnavne"
+
+#, c-format
+msgid "E92: Buffer %ld not found"
+msgstr "E92: Bufferen %ld blev ikke fundet"
+
+#, c-format
+msgid "E93: More than one match for %s"
+msgstr "E93: Flere end รฉt match for %s"
+
+#, c-format
+msgid "E94: No matching buffer for %s"
+msgstr "E94: Ingen matchende buffer for %s"
+
+#, c-format
+msgid "line %ld"
+msgstr "linje %ld"
+
+msgid "E95: Buffer with this name already exists"
+msgstr "E95: Buffer med dette navn findes allerede"
+
+msgid " [Modified]"
+msgstr " [ร†ndret]"
+
+msgid "[Not edited]"
+msgstr "[Ikke redigeret]"
+
+msgid "[New file]"
+msgstr "[Ny fil]"
+
+msgid "[Read errors]"
+msgstr "[Lรฆsefejl]"
+
+msgid "[RO]"
+msgstr "[SB]"
+
+msgid "[readonly]"
+msgstr "[skrivebeskyttet]"
+
+#, c-format
+msgid "1 line --%d%%--"
+msgstr "1 linje --%d%%--"
+
+#, c-format
+msgid "%ld lines --%d%%--"
+msgstr "%ld linjer --%d%%--"
+
+#, c-format
+msgid "line %ld of %ld --%d%%-- col "
+msgstr "linje %ld af %ld --%d%%-- kol "
+
+msgid "[No Name]"
+msgstr "[Intet navn]"
+
+msgid "help"
+msgstr "hjรฆlp"
+
+msgid "[Help]"
+msgstr "[Hjรฆlp]"
+
+msgid "[Preview]"
+msgstr "[Forhรฅndsvisning]"
+
+msgid "All"
+msgstr "Alt"
+
+msgid "Bot"
+msgstr "Ned"
+
+msgid "Top"
+msgstr "ร˜ve"
+
+msgid ""
+"\n"
+"# Buffer list:\n"
+msgstr ""
+"\n"
+"# Bufferliste:\n"
+
+msgid "E382: Cannot write, 'buftype' option is set"
+msgstr "E382: Kan ikke skrive, 'buftype'-tilvalget er sat"
+
+msgid "[Prompt]"
+msgstr "[Prompt]"
+
+msgid "[Scratch]"
+msgstr "[Kladdeblok]"
+
+msgid ""
+"\n"
+"--- Signs ---"
+msgstr ""
+"\n"
+"--- Signs ---"
+
+#, c-format
+msgid "Signs for %s:"
+msgstr "Signs for %s:"
+
+#, c-format
+msgid " line=%ld id=%d name=%s"
+msgstr " linje=%ld id=%d navn=%s"
+
+msgid "E902: Cannot connect to port"
+msgstr "E902: Kan ikke oprette forbindelse til port"
+
+msgid "E901: gethostbyname() in channel_open()"
+msgstr "E901: gethostbyname() i channel_open()"
+
+msgid "E898: socket() in channel_open()"
+msgstr "E898: socket() i channel_open()"
+
+msgid "E903: received command with non-string argument"
+msgstr "E903: modtog kommando med argument som ikke er en streng"
+
+msgid "E904: last argument for expr/call must be a number"
+msgstr "E904: sidste argument for udtryk/kald skal vรฆre et nummer"
+
+msgid "E904: third argument for call must be a list"
+msgstr "E904: tredje argument for kald skal vรฆre en liste"
+
+#, c-format
+msgid "E905: received unknown command: %s"
+msgstr "E905: modtog ukendt kommando: %s"
+
+#, c-format
+msgid "E630: %s(): write while not connected"
+msgstr "E630: %s(): skrivning mens der ikke er forbindelse"
+
+#, c-format
+msgid "E631: %s(): write failed"
+msgstr "E631: %s(): skrivning mislykkedes"
+
+#, c-format
+msgid "E917: Cannot use a callback with %s()"
+msgstr "E917: Kan ikke bruge et callback med %s()"
+
+msgid "E912: cannot use ch_evalexpr()/ch_sendexpr() with a raw or nl channel"
+msgstr ""
+"E912: kan ikke bruge ch_evalexpr()/ch_sendexpr() med en rรฅ- eller nl-kanal"
+
+msgid "E906: not an open channel"
+msgstr "E906: ikke en รฅben kanal"
+
+msgid "E920: _io file requires _name to be set"
+msgstr "E920: _io-fil krรฆver at _name er sat"
+
+msgid "E915: in_io buffer requires in_buf or in_name to be set"
+msgstr "E915: in_io-buffer krรฆver at in_buf eller in_name er sat"
+
+#, c-format
+msgid "E918: buffer must be loaded: %s"
+msgstr "E918: buffer skal vรฆre indlรฆst: %s"
+
+msgid "E821: File is encrypted with unknown method"
+msgstr "E821: Filen er krypteret med ukendt metode"
+
+msgid "Warning: Using a weak encryption method; see :help 'cm'"
+msgstr "Advarsel: Bruger en svag krypteringsmetode; se :help 'cm'"
+
+msgid "Enter encryption key: "
+msgstr "Indtast krypteringsnรธgle: "
+
+msgid "Enter same key again: "
+msgstr "Indtast samme nรธgle igen: "
+
+msgid "Keys don't match!"
+msgstr "Nรธglerne er ikke ens!"
+
+msgid "[crypted]"
+msgstr "[crypted]"
+
+#, c-format
+msgid "E720: Missing colon in Dictionary: %s"
+msgstr "E720: Manglende kolon i ordbog: %s"
+
+#, c-format
+msgid "E721: Duplicate key in Dictionary: \"%s\""
+msgstr "E721: Duplikeret nรธgle i ordbog: \"%s\""
+
+#, c-format
+msgid "E722: Missing comma in Dictionary: %s"
+msgstr "E722: Manglende komma i ordbog: %s"
+
+#, c-format
+msgid "E723: Missing end of Dictionary '}': %s"
+msgstr "E723: Manglende slutning pรฅ ordbog '}': %s"
+
+msgid "extend() argument"
+msgstr "extend()-argument"
+
+#, c-format
+msgid "E737: Key already exists: %s"
+msgstr "E737: Nรธgle findes allerede: %s"
+
+#, c-format
+msgid "E96: Cannot diff more than %ld buffers"
+msgstr "E96: Kan ikke diff'e flere end %ld buffere"
+
+msgid "E810: Cannot read or write temp files"
+msgstr "E810: Kan ikke lรฆse eller skrive midlertidige filer"
+
+msgid "E97: Cannot create diffs"
+msgstr "E97: Kan ikke oprette diff'er"
+
+msgid "Patch file"
+msgstr "Patch-fil"
+
+msgid "E816: Cannot read patch output"
+msgstr "E816: Kan ikke lรฆse patch-output"
+
+msgid "E98: Cannot read diff output"
+msgstr "E98: Kan ikke lรฆse diff-output"
+
+msgid "E99: Current buffer is not in diff mode"
+msgstr "E99: Nuvรฆrende buffer er ikke i diff-tilstand"
+
+msgid "E793: No other buffer in diff mode is modifiable"
+msgstr "E793: Ingen anden buffer i diff-tilstand kan รฆndres"
+
+msgid "E100: No other buffer in diff mode"
+msgstr "E100: Ingen anden buffer i diff-tilstand"
+
+msgid "E101: More than two buffers in diff mode, don't know which one to use"
+msgstr ""
+"E101: Mere end to buffere i diff-tilstand, ved ikke hvilke der skal bruges"
+
+#, c-format
+msgid "E102: Can't find buffer \"%s\""
+msgstr "E102: Kan ikke finde bufferen \"%s\""
+
+#, c-format
+msgid "E103: Buffer \"%s\" is not in diff mode"
+msgstr "E103: Bufferen \"%s\" er ikke i diff-tilstand"
+
+msgid "E787: Buffer changed unexpectedly"
+msgstr "E787: Buffer รฆndret uventet"
+
+msgid "E104: Escape not allowed in digraph"
+msgstr "E104: Escape ikke tilladt i digraf"
+
+msgid "E544: Keymap file not found"
+msgstr "E544: Keymap-fil ikke fundet"
+
+msgid "E105: Using :loadkeymap not in a sourced file"
+msgstr "E105: Bruger :loadkeymap ikke i en sourced fil"
+
+msgid "E791: Empty keymap entry"
+msgstr "E791: Tom keymap-post"
+
+msgid " Keyword completion (^N^P)"
+msgstr " Fuldfรธrelse af nรธgleord (^N^P)"
+
+msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
+msgstr " ^X tilstand (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
+
+msgid " Whole line completion (^L^N^P)"
+msgstr " Fuldfรธrelse af hel linje (^L^N^P)"
+
+msgid " File name completion (^F^N^P)"
+msgstr " Fuldfรธrelse af filnavn (^F^N^P)"
+
+msgid " Tag completion (^]^N^P)"
+msgstr " Fuldfรธrelse af tag (^]^N^P)"
+
+msgid " Path pattern completion (^N^P)"
+msgstr " Fuldfรธrelse af sti (^N^P)"
+
+msgid " Definition completion (^D^N^P)"
+msgstr " Fuldfรธrelse af definition (^D^N^P)"
+
+msgid " Dictionary completion (^K^N^P)"
+msgstr " Fuldfรธrelse af ordbog (^K^N^P)"
+
+msgid " Thesaurus completion (^T^N^P)"
+msgstr " Fuldfรธrelse af tesaurus (^T^N^P)"
+
+msgid " Command-line completion (^V^N^P)"
+msgstr " Fuldfรธrelse af kommandolinje (^V^N^P)"
+
+msgid " User defined completion (^U^N^P)"
+msgstr " Fuldfรธrelse af brugerdefineret (^U^N^P)"
+
+msgid " Omni completion (^O^N^P)"
+msgstr " Fuldfรธrelse af omni (^O^N^P)"
+
+msgid " Spelling suggestion (s^N^P)"
+msgstr " Staveforslag (s^N^P)"
+
+msgid " Keyword Local completion (^N^P)"
+msgstr " Fuldfรธrelse af nรธgleord local (^N^P)"
+
+msgid "Hit end of paragraph"
+msgstr "Stรธdte pรฅ slutningen af afsnit"
+
+msgid "E839: Completion function changed window"
+msgstr "E839: Fuldfรธrelse-funktion รฆndrede vindue"
+
+msgid "E840: Completion function deleted text"
+msgstr "E840: Fuldfรธrelse-funktion slettede tekst"
+
+msgid "'dictionary' option is empty"
+msgstr "'dictionary'-tilvalget er tomt"
+
+msgid "'thesaurus' option is empty"
+msgstr "'thesaurus'-tilvalget er tomt"
+
+#, c-format
+msgid "Scanning dictionary: %s"
+msgstr "Skanner ordbog: %s"
+
+msgid " (insert) Scroll (^E/^Y)"
+msgstr " (indsรฆt) Rul (^E/^Y)"
+
+msgid " (replace) Scroll (^E/^Y)"
+msgstr " (erstat) Rul (^E/^Y)"
+
+#, c-format
+msgid "Scanning: %s"
+msgstr "Skanner: %s"
+
+msgid "Scanning tags."
+msgstr "Skanner tags."
+
+msgid "match in file"
+msgstr "match i fil"
+
+msgid " Adding"
+msgstr " Tilfรธjer"
+
+msgid "-- Searching..."
+msgstr "-- Sรธger..."
+
+msgid "Back at original"
+msgstr "Tilbage ved original"
+
+msgid "Word from other line"
+msgstr "Ord fra anden linje"
+
+msgid "The only match"
+msgstr "Det eneste match"
+
+#, c-format
+msgid "match %d of %d"
+msgstr "match %d af %d"
+
+#, c-format
+msgid "match %d"
+msgstr "match %d"
+
+msgid "E18: Unexpected characters in :let"
+msgstr "E18: Uventede tegn i :let"
+
+#, c-format
+msgid "E121: Undefined variable: %s"
+msgstr "E121: Udefineret variabel: %s"
+
+msgid "E111: Missing ']'"
+msgstr "E111: Manglende ']'"
+
+msgid "E719: Cannot use [:] with a Dictionary"
+msgstr "E719: Kan ikke bruge [:] med en ordbog"
+
+#, c-format
+msgid "E734: Wrong variable type for %s="
+msgstr "E734: Forkert variabeltype for %s="
+
+#, c-format
+msgid "E461: Illegal variable name: %s"
+msgstr "E461: Ulovligt variabelnavn: %s"
+
+msgid "E806: using Float as a String"
+msgstr "E806: bruger flydende kommatal som en streng"
+
+msgid "E687: Less targets than List items"
+msgstr "E687: Fรฆrre mรฅl end listepunkter"
+
+msgid "E688: More targets than List items"
+msgstr "E688: Flere mรฅl end listepunkter"
+
+msgid "Double ; in list of variables"
+msgstr "Dobbelt ; i liste over variabler"
+
+#, c-format
+msgid "E738: Can't list variables for %s"
+msgstr "E738: Kan ikke opliste variabler for %s"
+
+msgid "E689: Can only index a List or Dictionary"
+msgstr "E689: Kan kun indeksere en liste eller ordbog"
+
+msgid "E708: [:] must come last"
+msgstr "E708: [:] skal vรฆre sidst"
+
+msgid "E709: [:] requires a List value"
+msgstr "E709: [:] krรฆver en listevรฆrdi"
+
+msgid "E710: List value has more items than target"
+msgstr "E710: Listevรฆrdi har flere punkter end mรฅl"
+
+msgid "E711: List value has not enough items"
+msgstr "E711: Listevรฆrdi har ikke nok punkter"
+
+msgid "E690: Missing \"in\" after :for"
+msgstr "E690: Manglende \"in\" efter :for"
+
+#, c-format
+msgid "E108: No such variable: \"%s\""
+msgstr "E108: Ingen sรฅdan variabel: \"%s\""
+
+#, c-format
+msgid "E940: Cannot lock or unlock variable %s"
+msgstr "E940: Kan ikke lรฅse eller lรฅse op for variablen %s"
+
+msgid "E743: variable nested too deep for (un)lock"
+msgstr "E743: variabel indlejret for dybt til at blive lรฅst/lรฅst op"
+
+msgid "E109: Missing ':' after '?'"
+msgstr "E109: Manglende ':' efter '?'"
+
+msgid "E804: Cannot use '%' with Float"
+msgstr "E804: Kan ikke bruge '%' med flydende kommatal"
+
+msgid "E110: Missing ')'"
+msgstr "E110: Manglende ')'"
+
+msgid "E695: Cannot index a Funcref"
+msgstr "E695: Kan ikke indeksere en funcref"
+
+msgid "E909: Cannot index a special variable"
+msgstr "E909: Kan ikke indeksere en speciel variabel"
+
+#, c-format
+msgid "E112: Option name missing: %s"
+msgstr "E112: Tilvalgsnavn mangler: %s"
+
+#, c-format
+msgid "E113: Unknown option: %s"
+msgstr "E113: Ukendt tilvalg: %s"
+
+#, c-format
+msgid "E114: Missing quote: %s"
+msgstr "E114: Manglende citationstegn: %s"
+
+#, c-format
+msgid "E115: Missing quote: %s"
+msgstr "E115: Manglende citationstegn: %s"
+
+msgid "Not enough memory to set references, garbage collection aborted!"
+msgstr "Ikke nok hukommelse til at sรฆtte referencer, affaldsindsamling afbrudt!"
+
+msgid "E724: variable nested too deep for displaying"
+msgstr "E724: variabel indlejret for dybt til at blive vist"
+
+msgid "E805: Using a Float as a Number"
+msgstr "E805: Bruger et flydende kommatal som et nummer"
+
+msgid "E703: Using a Funcref as a Number"
+msgstr "E703: Bruger en funcref som et nummer"
+
+msgid "E745: Using a List as a Number"
+msgstr "E745: Bruger en liste som et nummer"
+
+msgid "E728: Using a Dictionary as a Number"
+msgstr "E728: Bruger en ordbog som et nummer"
+
+msgid "E910: Using a Job as a Number"
+msgstr "E910: Bruger et job som et nummer"
+
+msgid "E913: Using a Channel as a Number"
+msgstr "E913: Bruger en kanal som et nummer"
+
+msgid "E891: Using a Funcref as a Float"
+msgstr "E891: Bruger en funcref som et fyldende kommatal"
+
+msgid "E892: Using a String as a Float"
+msgstr "E892: Bruger en streng som et flydende kommatal"
+
+msgid "E893: Using a List as a Float"
+msgstr "E893: Bruger en liste som et flydende kommatal"
+
+msgid "E894: Using a Dictionary as a Float"
+msgstr "E894: Bruger en ordbog som et flydende kommatal"
+
+msgid "E907: Using a special value as a Float"
+msgstr "E907: Bruger en speciel vรฆrdi som et flydende kommatal"
+
+msgid "E911: Using a Job as a Float"
+msgstr "E911: Bruger et job som et flydende kommatal"
+
+msgid "E914: Using a Channel as a Float"
+msgstr "E914: Bruger en kanal som et flydende kommatal"
+
+msgid "E729: using Funcref as a String"
+msgstr "E729: bruger funcref som en streng"
+
+msgid "E730: using List as a String"
+msgstr "E730: bruger liste som en streng"
+
+msgid "E731: using Dictionary as a String"
+msgstr "E731: bruger ordbog som en streng"
+
+msgid "E908: using an invalid value as a String"
+msgstr "E908: bruger en ugyldig vรฆrdi som en streng"
+
+#, c-format
+msgid "E795: Cannot delete variable %s"
+msgstr "E795: Kan ikke slette variablen %s"
+
+#, c-format
+msgid "E704: Funcref variable name must start with a capital: %s"
+msgstr "E704: Funcref-variabelnavn skal begynde med et stort bogstav: %s"
+
+#, c-format
+msgid "E705: Variable name conflicts with existing function: %s"
+msgstr "E705: Variabelnavn er i konflikt med eksisterende funktion: %s"
+
+#, c-format
+msgid "E741: Value is locked: %s"
+msgstr "E741: Vรฆrdien er lรฅst: %s"
+
+msgid "Unknown"
+msgstr "Ukendt"
+
+#, c-format
+msgid "E742: Cannot change value of %s"
+msgstr "E742: Kan ikke รฆndre vรฆrdien af %s"
+
+msgid "E698: variable nested too deep for making a copy"
+msgstr "E698: variabel indlejret for dybt til at lave en kopi"
+
+msgid ""
+"\n"
+"# global variables:\n"
+msgstr ""
+"\n"
+"# globale variabler:\n"
+
+msgid ""
+"\n"
+"\tLast set from "
+msgstr ""
+"\n"
+"\tSidst sat fra "
+
+msgid "E691: Can only compare List with List"
+msgstr "E691: Kan kun sammenligne liste med liste"
+
+msgid "E692: Invalid operation for List"
+msgstr "E692: Ugyldig handling for liste"
+
+msgid "E735: Can only compare Dictionary with Dictionary"
+msgstr "E735: Kan kun sammenligne ordbog med ordbog"
+
+msgid "E736: Invalid operation for Dictionary"
+msgstr "E736: Ugyldig handling for ordbog"
+
+msgid "E694: Invalid operation for Funcrefs"
+msgstr "E694: Ugyldig handling for funcref'er"
+
+msgid "map() argument"
+msgstr "map()-argument"
+
+msgid "filter() argument"
+msgstr "filter()-argument"
+
+#, c-format
+msgid "E686: Argument of %s must be a List"
+msgstr "E686: Argument af %s skal vรฆre en liste"
+
+msgid "E928: String required"
+msgstr "E928: Streng krรฆves"
+
+msgid "E808: Number or Float required"
+msgstr "E808: Nummer eller flydende kommatal krรฆves"
+
+msgid "add() argument"
+msgstr "add()-argument"
+
+msgid "E785: complete() can only be used in Insert mode"
+msgstr "E785: complete() kan kun bruges i indsรฆt-tilstand"
+
+msgid "&Ok"
+msgstr "&Ok"
+
+#, c-format
+msgid "+-%s%3ld line: "
+msgid_plural "+-%s%3ld lines: "
+msgstr[0] "+-%s%3ld linje: "
+msgstr[1] "+-%s%3ld linjer: "
+
+#, c-format
+msgid "E700: Unknown function: %s"
+msgstr "E700: Ukendt funktion: %s"
+
+msgid "E922: expected a dict"
+msgstr "E922: ventede en ordbog"
+
+msgid "E923: Second argument of function() must be a list or a dict"
+msgstr "E923: Andet argument af function() skal vรฆre en liste eller en ordbog"
+
+msgid ""
+"&OK\n"
+"&Cancel"
+msgstr ""
+"&OK\n"
+"&Annuller"
+
+msgid "called inputrestore() more often than inputsave()"
+msgstr "kaldte inputrestore() flere gange end inputsave()"
+
+msgid "insert() argument"
+msgstr "insert()-argument"
+
+msgid "E786: Range not allowed"
+msgstr "E786: Omrรฅde ikke tilladt"
+
+msgid "E916: not a valid job"
+msgstr "E916: ikke et gyldigt job"
+
+msgid "E701: Invalid type for len()"
+msgstr "E701: Ugyldig type for len()"
+
+#, c-format
+msgid "E798: ID is reserved for \":match\": %ld"
+msgstr "E798: ID er reserveret til \":match\": %ld"
+
+msgid "E726: Stride is zero"
+msgstr "E726: Stride er nul"
+
+msgid "E727: Start past end"
+msgstr "E727: Start efter slutningen"
+
+msgid "<empty>"
+msgstr "<tom>"
+
+msgid "E240: No connection to the X server"
+msgstr "E240: Ingen forbindelse til X-serveren"
+
+#, c-format
+msgid "E241: Unable to send to %s"
+msgstr "E241: Kan ikke sende til %s"
+
+msgid "E277: Unable to read a server reply"
+msgstr "E277: Kan ikke lรฆse et serversvar"
+
+msgid "E941: already started a server"
+msgstr "E941: allerede startet en server"
+
+msgid "E942: +clientserver feature not available"
+msgstr "E942: +clientserver-funktionalitet ikke tilgรฆngelig"
+
+msgid "remove() argument"
+msgstr "remove()-argument"
+
+msgid "E655: Too many symbolic links (cycle?)"
+msgstr "E655: For mange symbolske links (cyklus?)"
+
+msgid "reverse() argument"
+msgstr "reverse()-argument"
+
+msgid "E258: Unable to send to client"
+msgstr "E258: Kan ikke sende til klient"
+
+#, c-format
+msgid "E927: Invalid action: '%s'"
+msgstr "E927: Ugyldig handling: '%s'"
+
+msgid "sort() argument"
+msgstr "sort()-argument"
+
+msgid "uniq() argument"
+msgstr "uniq()-argument"
+
+msgid "E702: Sort compare function failed"
+msgstr "E702: Sort-sammenligningsfunktion mislykkedes"
+
+msgid "E882: Uniq compare function failed"
+msgstr "E882: Uniq-sammenligningsfunktion mislykkedes"
+
+msgid "(Invalid)"
+msgstr "(Ugyldig)"
+
+#, c-format
+msgid "E935: invalid submatch number: %d"
+msgstr "E935: ugyldigt undermatch-nummer: %d"
+
+msgid "E677: Error writing temp file"
+msgstr "E677: Fejl ved skrivning af midlertidig fil"
+
+msgid "E921: Invalid callback argument"
+msgstr "E921: Ugyldigt callback-argument"
+
+#, c-format
+msgid "<%s>%s%s %d, Hex %02x, Oct %03o, Digr %s"
+msgstr "<%s>%s%s %d, hex %02x, oct %03o, digr %s"
+
+#, c-format
+msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
+msgstr "<%s>%s%s %d, hex %02x, octal %03o"
+
+#, c-format
+msgid "> %d, Hex %04x, Oct %o, Digr %s"
+msgstr "> %d, hex %04x, oct %o, digr %s"
+
+#, c-format
+msgid "> %d, Hex %08x, Oct %o, Digr %s"
+msgstr "> %d, hex %08x, oct %o, digr %s"
+
+#, c-format
+msgid "> %d, Hex %04x, Octal %o"
+msgstr "> %d, hex %04x, octal %o"
+
+#, c-format
+msgid "> %d, Hex %08x, Octal %o"
+msgstr "> %d, hex %08x, octal %o"
+
+msgid "E134: Move lines into themselves"
+msgstr "E134: flyt linjer ind i dem selv"
+
+msgid "1 line moved"
+msgstr "1 linje flyttet"
+
+#, c-format
+msgid "%ld lines moved"
+msgstr "%ld linjer flyttet"
+
+#, c-format
+msgid "%ld lines filtered"
+msgstr "%ld linjer filtreret"
+
+msgid "E135: *Filter* Autocommands must not change current buffer"
+msgstr "E135: *Filter*-autokommandoer mรฅ ikke รฆndre nuvรฆrende buffer"
+
+msgid "[No write since last change]\n"
+msgstr "[Ingen skrivning siden sidste รฆndring]\n"
+
+#, c-format
+msgid "%sviminfo: %s in line: "
+msgstr "%sviminfo: %s pรฅ linje: "
+
+msgid "E136: viminfo: Too many errors, skipping rest of file"
+msgstr "E136: viminfo: For mange fejl, springer resten af filen over"
+
+#, c-format
+msgid "Reading viminfo file \"%s\"%s%s%s"
+msgstr "Lรฆser viminfo-filen \"%s\"%s%s%s"
+
+msgid " info"
+msgstr " info"
+
+msgid " marks"
+msgstr " mรฆrker"
+
+msgid " oldfiles"
+msgstr " gamle filer"
+
+msgid " FAILED"
+msgstr " MISLYKKEDES"
+
+#, c-format
+msgid "E137: Viminfo file is not writable: %s"
+msgstr "E137: Viminfo-filen er skrivebeskyttet: %s"
+
+#, c-format
+msgid "E929: Too many viminfo temp files, like %s!"
+msgstr "E929: For mange midlertidige filer for viminfo, sรฅsom %s!"
+
+#, c-format
+msgid "E138: Can't write viminfo file %s!"
+msgstr "E138: Kan ikke skrive viminfo-filen %s!"
+
+#, c-format
+msgid "Writing viminfo file \"%s\""
+msgstr "Skriver viminfo-filen \"%s\""
+
+#, c-format
+msgid "E886: Can't rename viminfo file to %s!"
+msgstr "E886: Kan ikke omdรธbe viminfo-fil til %s!"
+
+#, c-format
+msgid "# This viminfo file was generated by Vim %s.\n"
+msgstr "# Denne viminfo-fil blev genereret af Vim %s.\n"
+
+msgid ""
+"# You may edit it if you're careful!\n"
+"\n"
+msgstr ""
+"# Du kan redigere den, hvis du er forsigtig!\n"
+"\n"
+
+msgid "# Value of 'encoding' when this file was written\n"
+msgstr "# Vรฆrdien af 'encoding' da filen blev skrevet\n"
+
+msgid "Illegal starting char"
+msgstr "Ulovligt tegn i begyndelsen"
+
+msgid ""
+"\n"
+"# Bar lines, copied verbatim:\n"
+msgstr ""
+"\n"
+"#-bjรฆlkelinjer, kopieret ordret:\n"
+
+msgid "Save As"
+msgstr "Gem som"
+
+msgid "Write partial file?"
+msgstr "Skriv ufuldstรฆndig fil?"
+
+msgid "E140: Use ! to write partial buffer"
+msgstr "E140: Brug ! til at skrive ufuldstรฆndig buffer"
+
+#, c-format
+msgid "Overwrite existing file \"%s\"?"
+msgstr "Overskriv eksisterende fil \"%s\"?"
+
+#, c-format
+msgid "Swap file \"%s\" exists, overwrite anyway?"
+msgstr "Swap-filen \"%s\" findes, overskriv alligevel?"
+
+#, c-format
+msgid "E768: Swap file exists: %s (:silent! overrides)"
+msgstr "E768: Swap-filen findes: %s (:silent! tilsidesรฆtter)"
+
+#, c-format
+msgid "E141: No file name for buffer %ld"
+msgstr "E141: Intet filnavn for buffer %ld"
+
+msgid "E142: File not written: Writing is disabled by 'write' option"
+msgstr "E142: Fil ikke skrevet: Skrivning er deaktiveret af 'write'-tilvalget"
+
+#, c-format
+msgid ""
+"'readonly' option is set for \"%s\".\n"
+"Do you wish to write anyway?"
+msgstr ""
+"'readonly'-tilvalget er sat for \"%s\".\n"
+"Vil du skrive alligevel?"
+
+#, c-format
+msgid ""
+"File permissions of \"%s\" are read-only.\n"
+"It may still be possible to write it.\n"
+"Do you wish to try?"
+msgstr ""
+"Filtilladelserne for \"%s\" er skrivebeskyttede.\n"
+"Der kan stadig vรฆre mulighed for at skrive den.\n"
+"Vil du prรธve?"
+
+#, c-format
+msgid "E505: \"%s\" is read-only (add ! to override)"
+msgstr "E505: \"%s\" er skrivebeskyttet (tilfรธj ! for at tilsidesรฆtte)"
+
+msgid "Edit File"
+msgstr "Rediger fil"
+
+#, c-format
+msgid "E143: Autocommands unexpectedly deleted new buffer %s"
+msgstr "E143: Autokommandoer slettede uventede ny buffer %s"
+
+msgid "E144: non-numeric argument to :z"
+msgstr "E144: ikke-numerisk argument til :z"
+
+msgid "E145: Shell commands not allowed in rvim"
+msgstr "E145: Skalkommandoer er ikke tilladt i rvim"
+
+msgid "E146: Regular expressions can't be delimited by letters"
+msgstr "E146: Regulรฆre udtryk kan ikke afgrรฆnses af bogstaver"
+
+#, c-format
+msgid "replace with %s (y/n/a/q/l/^E/^Y)?"
+msgstr "erstat med %s (y/n/a/q/l/^E/^Y)?"
+
+msgid "(Interrupted) "
+msgstr "(Afbrudt) "
+
+msgid "1 match"
+msgstr "1 match"
+
+msgid "1 substitution"
+msgstr "1 erstatning"
+
+#, c-format
+msgid "%ld matches"
+msgstr "%ld match"
+
+#, c-format
+msgid "%ld substitutions"
+msgstr "%ld erstatninger"
+
+msgid " on 1 line"
+msgstr " pรฅ 1 linje"
+
+#, c-format
+msgid " on %ld lines"
+msgstr " pรฅ %ld linjer"
+
+msgid "E147: Cannot do :global recursive with a range"
+msgstr "E147: Kan ikke foretage :global rekursivt med et omrรฅde"
+
+msgid "E148: Regular expression missing from global"
+msgstr "E148: Regulรฆre udtryk mangler fra global"
+
+#, c-format
+msgid "Pattern found in every line: %s"
+msgstr "Mรธnster fundet pรฅ hver linje: %s"
+
+#, c-format
+msgid "Pattern not found: %s"
+msgstr "Mรธnster ikke fundet: %s"
+
+msgid ""
+"\n"
+"# Last Substitute String:\n"
+"$"
+msgstr ""
+"\n"
+"# Sidste erstatningsstreng:\n"
+"$"
+
+msgid "E478: Don't panic!"
+msgstr "E478: Tag det bare helt roligt!"
+
+#, c-format
+msgid "E661: Sorry, no '%s' help for %s"
+msgstr "E661: Beklager, ingen '%s' hjรฆlp til %s"
+
+#, c-format
+msgid "E149: Sorry, no help for %s"
+msgstr "E149: Beklager, ingen hjรฆlp til %s"
+
+#, c-format
+msgid "Sorry, help file \"%s\" not found"
+msgstr "Beklager, hjรฆlpfilen \"%s\" ikke fundet"
+
+#, c-format
+msgid "E151: No match: %s"
+msgstr "E151: Intet match: %s"
+
+#, c-format
+msgid "E152: Cannot open %s for writing"
+msgstr "E152: Kan ikke รฅbne %s til skrivning"
+
+#, c-format
+msgid "E153: Unable to open %s for reading"
+msgstr "E153: Kan ikke รฅbne %s til lรฆsning"
+
+#, c-format
+msgid "E670: Mix of help file encodings within a language: %s"
+msgstr "E670: Blanding af kodninger for hjรฆlpfiler i samme sprog: %s"
+
+#, c-format
+msgid "E154: Duplicate tag \"%s\" in file %s/%s"
+msgstr "E154: Duplikeret tag \"%s\" i fil %s/%s"
+
+#, c-format
+msgid "E150: Not a directory: %s"
+msgstr "E150: Ikke en mappe: %s"
+
+#, c-format
+msgid "E160: Unknown sign command: %s"
+msgstr "E160: Ukendt sign-kommando: %s"
+
+msgid "E156: Missing sign name"
+msgstr "E156: Manglende sign-navn"
+
+msgid "E612: Too many signs defined"
+msgstr "E612: For mange signs defineret"
+
+#, c-format
+msgid "E239: Invalid sign text: %s"
+msgstr "E239: Ugyldig sign-tekst: %s"
+
+#, c-format
+msgid "E155: Unknown sign: %s"
+msgstr "E155: Ukendt sign: %s"
+
+msgid "E159: Missing sign number"
+msgstr "E159: Manglende sign-nummer"
+
+#, c-format
+msgid "E158: Invalid buffer name: %s"
+msgstr "E158: Ugyldigt buffernavn: %s"
+
+msgid "E934: Cannot jump to a buffer that does not have a name"
+msgstr "E934: Kan ikke hoppe til en buffer som ikke har et navn"
+
+#, c-format
+msgid "E157: Invalid sign ID: %ld"
+msgstr "E157: Ugyldigt sign-ID: %ld"
+
+#, c-format
+msgid "E885: Not possible to change sign %s"
+msgstr "E885: Det er ikke muligt at รฆndre sign %s"
+
+msgid " (NOT FOUND)"
+msgstr " (IKKE FUNDET)"
+
+msgid " (not supported)"
+msgstr " (understรธttes ikke)"
+
+msgid "[Deleted]"
+msgstr "[Slettet]"
+
+msgid "No old files"
+msgstr "Ingen gamle filer"
+
+msgid "Entering Debug mode. Type \"cont\" to continue."
+msgstr "Gรฅr i fejlretningstilstand. Skriv \"cont\" for at fortsรฆtte."
+
+#, c-format
+msgid "Oldval = \"%s\""
+msgstr "Oldval = \"%s\""
+
+#, c-format
+msgid "Newval = \"%s\""
+msgstr "Newval = \"%s\""
+
+#, c-format
+msgid "line %ld: %s"
+msgstr "linje %ld: %s"
+
+#, c-format
+msgid "cmd: %s"
+msgstr "cmd: %s"
+
+msgid "frame is zero"
+msgstr "ramme er nul"
+
+#, c-format
+msgid "frame at highest level: %d"
+msgstr "ramme pรฅ hรธjeste niveau: %d"
+
+#, c-format
+msgid "Breakpoint in \"%s%s\" line %ld"
+msgstr "Breakpoint i \"%s%s\" linje %ld"
+
+#, c-format
+msgid "E161: Breakpoint not found: %s"
+msgstr "E161: Breakpoint ikke fundet: %s"
+
+msgid "No breakpoints defined"
+msgstr "Ingen breakpoints defineret"
+
+#, c-format
+msgid "%3d %s %s line %ld"
+msgstr "%3d %s %s linje %ld"
+
+#, c-format
+msgid "%3d expr %s"
+msgstr "%3d udtryk %s"
+
+msgid "E750: First use \":profile start {fname}\""
+msgstr "E750: Brug fรธrst \":profile start {fname}\""
+
+#, c-format
+msgid "Save changes to \"%s\"?"
+msgstr "Gem รฆndringer til \"%s\"?"
+
+#, c-format
+msgid "E947: Job still running in buffer \"%s\""
+msgstr "E947: Job kรธrer stadig i bufferen \"%s\""
+
+#, c-format
+msgid "E162: No write since last change for buffer \"%s\""
+msgstr "E162: Ingen skrivning siden sidste รฆndring for bufferen \"%s\""
+
+msgid "Warning: Entered other buffer unexpectedly (check autocommands)"
+msgstr "Advarsel: Indtastede anden buffer uventede (tjek autokommandoer)"
+
+msgid "E163: There is only one file to edit"
+msgstr "E163: Der er kun รฉn fil at redigere"
+
+msgid "E164: Cannot go before first file"
+msgstr "E164: Kan ikke gรฅ fรธr fรธrste fil"
+
+msgid "E165: Cannot go beyond last file"
+msgstr "E165: Kan ikke gรฅ over sidste fil"
+
+#, c-format
+msgid "E666: compiler not supported: %s"
+msgstr "E666: kompiler understรธttes ikke: %s"
+
+#, c-format
+msgid "Searching for \"%s\" in \"%s\""
+msgstr "Sรธger efter \"%s\" i \"%s\""
+
+#, c-format
+msgid "Searching for \"%s\""
+msgstr "Sรธger efter \"%s\""
+
+#, c-format
+msgid "not found in '%s': \"%s\""
+msgstr "ikke fundet i '%s': \"%s\""
+
+#, c-format
+msgid "W20: Required python version 2.x not supported, ignoring file: %s"
+msgstr "W20: Krรฆvede python-version 2.x understรธttes ikke, ignorerer fil: %s"
+
+#, c-format
+msgid "W21: Required python version 3.x not supported, ignoring file: %s"
+msgstr "W21: Krรฆvede python-version 3.x understรธttes ikke, ignorerer fil: %s"
+
+msgid "Source Vim script"
+msgstr "Source Vim-script"
+
+#, c-format
+msgid "Cannot source a directory: \"%s\""
+msgstr "Kan ikke source en mappe: \"%s\""
+
+#, c-format
+msgid "could not source \"%s\""
+msgstr "kunne ikke source \"%s\""
+
+#, c-format
+msgid "line %ld: could not source \"%s\""
+msgstr "linje %ld: kunne ikke source \"%s\""
+
+#, c-format
+msgid "sourcing \"%s\""
+msgstr "sourcing \"%s\""
+
+#, c-format
+msgid "line %ld: sourcing \"%s\""
+msgstr "linje %ld: sourcing \"%s\""
+
+#, c-format
+msgid "finished sourcing %s"
+msgstr "fรฆrdig med sourcing af %s"
+
+#, c-format
+msgid "continuing in %s"
+msgstr "fortsรฆtter i %s"
+
+msgid "modeline"
+msgstr "tilstandslinje"
+
+msgid "--cmd argument"
+msgstr "--cmd-argument"
+
+msgid "-c argument"
+msgstr "-c-argument"
+
+msgid "environment variable"
+msgstr "miljรธvariabel"
+
+msgid "error handler"
+msgstr "fejlhรฅndtering"
+
+msgid "W15: Warning: Wrong line separator, ^M may be missing"
+msgstr "W15: Advarsel: Forkert linjeseparator, ^M mangler muligvis"
+
+msgid "E167: :scriptencoding used outside of a sourced file"
+msgstr "E167: :scriptencoding brugt udenfor en sourced fil"
+
+msgid "E168: :finish used outside of a sourced file"
+msgstr "E168: :finish udenfor en sourced fil"
+
+#, c-format
+msgid "Current %slanguage: \"%s\""
+msgstr "Nuvรฆrende %ssprog: \"%s\""
+
+#, c-format
+msgid "E197: Cannot set language to \"%s\""
+msgstr "E197: Kan ikke sรฆtte sprog til \"%s\""
+
+msgid "Entering Ex mode. Type \"visual\" to go to Normal mode."
+msgstr "Gรฅr i Ex-tilstand. Skriv \"visual\" for at gรฅ til normal tilstand."
+
+msgid "E501: At end-of-file"
+msgstr "E501: Ved filens slutning"
+
+msgid "E169: Command too recursive"
+msgstr "E169: Kommando for rekursiv"
+
+#, c-format
+msgid "E605: Exception not caught: %s"
+msgstr "E605: Undtagelse ikke fanget: %s"
+
+msgid "End of sourced file"
+msgstr "Slut pรฅ sourced fil"
+
+msgid "End of function"
+msgstr "Slutning af funktion"
+
+msgid "E464: Ambiguous use of user-defined command"
+msgstr "E464: Flertydig brug af brugerdefineret kommando"
+
+msgid "E492: Not an editor command"
+msgstr "E492: Ikke en editor-kommando"
+
+msgid "E493: Backwards range given"
+msgstr "E493: Baglรฆns omrรฅde givet"
+
+msgid "Backwards range given, OK to swap"
+msgstr "Baglรฆns omrรฅde givet, OK at bytte om"
+
+msgid "E494: Use w or w>>"
+msgstr "E494: Brug w eller w>>"
+
+msgid "E943: Command table needs to be updated, run 'make cmdidxs'"
+msgstr "E943: Kommandotabel skal opdateres, kรธr 'make cmdidxs'"
+
+msgid "E319: Sorry, the command is not available in this version"
+msgstr "E319: Beklager, kommandoen er ikke tilgรฆngelig i denne version"
+
+msgid "1 more file to edit. Quit anyway?"
+msgstr "1 fil mere at redigere. Afslut alligevel?"
+
+#, c-format
+msgid "%d more files to edit. Quit anyway?"
+msgstr "%d filer mere at redigere. Afslut alligevel?"
+
+msgid "E173: 1 more file to edit"
+msgstr "E173: 1 fil mere at redigere"
+
+#, c-format
+msgid "E173: %ld more files to edit"
+msgstr "E173: %ld filer mere at redigere"
+
+msgid "E174: Command already exists: add ! to replace it"
+msgstr "E174: Kommandoen findes allerede: tilfรธj ! for at erstatte den"
+
+msgid ""
+"\n"
+" Name Args Address Complete Definition"
+msgstr ""
+"\n"
+" Navn Argumenter Adresse Fuldfรธrt Definition"
+
+msgid "No user-defined commands found"
+msgstr "Fandt ingen brugerdefinerede kommandoer"
+
+msgid "E175: No attribute specified"
+msgstr "E175: Ingen attribut angivet"
+
+msgid "E176: Invalid number of arguments"
+msgstr "E176: Ugyldigt antal argumenter"
+
+msgid "E177: Count cannot be specified twice"
+msgstr "E177: Tรฆlling mรฅ ikke angives to gange"
+
+msgid "E178: Invalid default value for count"
+msgstr "E178: Ugyldig standardvรฆrdi for tรฆlling"
+
+msgid "E179: argument required for -complete"
+msgstr "E179: argument krรฆves til -complete"
+
+msgid "E179: argument required for -addr"
+msgstr "E179: argument krรฆves til -addr"
+
+#, c-format
+msgid "E181: Invalid attribute: %s"
+msgstr "E181: Ugyldig attribut: %s"
+
+msgid "E182: Invalid command name"
+msgstr "E182: Ugyldigt kommandonavn"
+
+msgid "E183: User defined commands must start with an uppercase letter"
+msgstr "E183: Brugerdefinerede kommandoer skal begynde med et stort bogstav"
+
+msgid "E841: Reserved name, cannot be used for user defined command"
+msgstr "E841: Reserveret navn, kan ikke bruges til brugerdefineret kommando"
+
+#, c-format
+msgid "E184: No such user-defined command: %s"
+msgstr "E184: Ingen sรฅdan brugerdefineret kommando: %s"
+
+#, c-format
+msgid "E180: Invalid address type value: %s"
+msgstr "E180: Ugyldig vรฆrdi for adressetype: %s"
+
+#, c-format
+msgid "E180: Invalid complete value: %s"
+msgstr "E180: Ugyldig complete-vรฆrdi: %s"
+
+msgid "E468: Completion argument only allowed for custom completion"
+msgstr "E468: Fuldfรธrelse-argument kun tilladt for tilpasset fuldfรธrelse"
+
+msgid "E467: Custom completion requires a function argument"
+msgstr "E467: Tilpasset fuldfรธrelse krรฆver et funktion-argument"
+
+msgid "unknown"
+msgstr "ukendt"
+
+#, c-format
+msgid "E185: Cannot find color scheme '%s'"
+msgstr "E185: Kan ikke finde farveskemaet '%s'"
+
+msgid "Greetings, Vim user!"
+msgstr "Hejsa, Vim-bruger!"
+
+msgid "E784: Cannot close last tab page"
+msgstr "E784: Kan ikke lukke sidste fanebladsside"
+
+msgid "Already only one tab page"
+msgstr "Allerede kun รฉn fanebladsside"
+
+msgid "Edit File in new window"
+msgstr "Rediger fil i nyt vindue"
+
+#, c-format
+msgid "Tab page %d"
+msgstr "Fanebladsside %d"
+
+msgid "No swap file"
+msgstr "Ingen swap-fil"
+
+msgid "Append File"
+msgstr "Tilfรธj fil til slutningen"
+
+msgid "E747: Cannot change directory, buffer is modified (add ! to override)"
+msgstr ""
+"E747: Kan ikke skifte mappe, buffer er รฆndret (tilfรธj ! for at tilsidesรฆtte)"
+
+msgid "E186: No previous directory"
+msgstr "E186: Ingen tidligere ordbog"
+
+msgid "E187: Unknown"
+msgstr "E187: Ukendt"
+
+msgid "E465: :winsize requires two number arguments"
+msgstr "E465: :winsize krรฆver to nummer-argumenter"
+
+#, c-format
+msgid "Window position: X %d, Y %d"
+msgstr "Vinduesplacering: X %d, Y %d"
+
+msgid "E188: Obtaining window position not implemented for this platform"
+msgstr ""
+"E188: Indhentelse af vinduesplacering ikke implementeret pรฅ denne platform"
+
+msgid "E466: :winpos requires two number arguments"
+msgstr "E466: :winpos krรฆver to nummer-argumenter"
+
+msgid "E930: Cannot use :redir inside execute()"
+msgstr "E930: Kan ikke bruge :redir i execute()"
+
+msgid "Save Redirection"
+msgstr "Gem omdirigering"
+
+msgid "Save View"
+msgstr "Gem visning"
+
+msgid "Save Session"
+msgstr "Gem session"
+
+msgid "Save Setup"
+msgstr "Gem opsรฆtning"
+
+#, c-format
+msgid "E739: Cannot create directory: %s"
+msgstr "E739: Kan ikke oprette mappe: %s"
+
+#, c-format
+msgid "E189: \"%s\" exists (add ! to override)"
+msgstr "E189: \"%s\" findes (tilfรธj ! for at tilsidesรฆtte)"
+
+#, c-format
+msgid "E190: Cannot open \"%s\" for writing"
+msgstr "E190: Kan ikke รฅbne \"%s\" til skrivning"
+
+msgid "E191: Argument must be a letter or forward/backward quote"
+msgstr ""
+"E191: Argument skal vรฆre et bogstav eller retvendt/omvendt citationstegn"
+
+msgid "E192: Recursive use of :normal too deep"
+msgstr "E192: Rekursiv brug af :normal for dyb"
+
+msgid "E809: #< is not available without the +eval feature"
+msgstr "E809: #< er ikke tilgรฆngelig uden +eval-funktionaliteten"
+
+msgid "E194: No alternate file name to substitute for '#'"
+msgstr "E194: Intet alternate-filnavn til erstatning for '#'"
+
+msgid "E495: no autocommand file name to substitute for \"<afile>\""
+msgstr "E495: intet autokommando-filnavn til erstatning for \"<afile>\""
+
+msgid "E496: no autocommand buffer number to substitute for \"<abuf>\""
+msgstr "E496: intet autokommando-buffernummer til erstatning for \"<abuf>\""
+
+msgid "E497: no autocommand match name to substitute for \"<amatch>\""
+msgstr "E497: intet autokommando-matchnavn til erstatning for \"<amatch>\""
+
+msgid "E498: no :source file name to substitute for \"<sfile>\""
+msgstr "E498: intet :source-filnavn til erstatning for \"<sfile>\""
+
+msgid "E842: no line number to use for \"<slnum>\""
+msgstr "E842: intet linjenummer til brug for \"<slnum>\""
+
+#, no-c-format
+msgid "E499: Empty file name for '%' or '#', only works with \":p:h\""
+msgstr "E499: Tomt filnavn for '%' eller '#', virker kun med \":p:h\""
+
+msgid "E500: Evaluates to an empty string"
+msgstr "E500: Evaluerer til en tom streng"
+
+msgid "E195: Cannot open viminfo file for reading"
+msgstr "E195: Kan ikke รฅbne viminfo-fil til lรฆsning"
+
+msgid "Untitled"
+msgstr "Unavngivet"
+
+msgid "E196: No digraphs in this version"
+msgstr "E196: Ingen digraffer i denne version"
+
+msgid "E608: Cannot :throw exceptions with 'Vim' prefix"
+msgstr "E608: Kan ikke :throw-undtagelser med 'Vim'-prรฆfiks"
+
+#, c-format
+msgid "Exception thrown: %s"
+msgstr "Undtagelse kastet: %s"
+
+#, c-format
+msgid "Exception finished: %s"
+msgstr "Undtagelse fรฆrdig: %s"
+
+#, c-format
+msgid "Exception discarded: %s"
+msgstr "Undtagelse forkastet: %s"
+
+#, c-format
+msgid "%s, line %ld"
+msgstr "%s, linje %ld"
+
+#, c-format
+msgid "Exception caught: %s"
+msgstr "Undtagelse fanget: %s"
+
+#, c-format
+msgid "%s made pending"
+msgstr "%s gjort afventende"
+
+#, c-format
+msgid "%s resumed"
+msgstr "%s genoptaget"
+
+#, c-format
+msgid "%s discarded"
+msgstr "%s forkastet"
+
+msgid "Exception"
+msgstr "Undtagelse"
+
+msgid "Error and interrupt"
+msgstr "Fejl og afbryd"
+
+msgid "Error"
+msgstr "Fejl"
+
+msgid "Interrupt"
+msgstr "Afbryd"
+
+msgid "E579: :if nesting too deep"
+msgstr "E579: :if-indlejring for dyb"
+
+msgid "E580: :endif without :if"
+msgstr "E580: :endif uden :if"
+
+msgid "E581: :else without :if"
+msgstr "E581: :else uden :if"
+
+msgid "E582: :elseif without :if"
+msgstr "E582: :elseif uden :if"
+
+msgid "E583: multiple :else"
+msgstr "E583: flere :else"
+
+msgid "E584: :elseif after :else"
+msgstr "E584: :elseif efter :else"
+
+msgid "E585: :while/:for nesting too deep"
+msgstr "E585: :while/:for-indlejring for dyb"
+
+msgid "E586: :continue without :while or :for"
+msgstr "E586: :continue uden :while eller :for"
+
+msgid "E587: :break without :while or :for"
+msgstr "E587: :break uden :while eller :for"
+
+msgid "E732: Using :endfor with :while"
+msgstr "E732: Bruger :endfor med :while"
+
+msgid "E733: Using :endwhile with :for"
+msgstr "E733: Bruger :endwhile med :for"
+
+msgid "E601: :try nesting too deep"
+msgstr "E601: :try-indlejring for dyb"
+
+msgid "E603: :catch without :try"
+msgstr "E603: :catch uden :try"
+
+msgid "E604: :catch after :finally"
+msgstr "E604: :catch efter :finally"
+
+msgid "E606: :finally without :try"
+msgstr "E606: :finally uden :try"
+
+msgid "E607: multiple :finally"
+msgstr "E607: flere :finally"
+
+msgid "E602: :endtry without :try"
+msgstr "E602: :endtry uden :try"
+
+msgid "E193: :endfunction not inside a function"
+msgstr "E193: :endfunction ikke i en funktion"
+
+msgid "E788: Not allowed to edit another buffer now"
+msgstr "E788: Ikke tilladt at redigere anden buffer nu"
+
+msgid "E811: Not allowed to change buffer information now"
+msgstr "E811: Ikke tilladt at รฆndre bufferinformation nu"
+
+msgid "tagname"
+msgstr "tagnavn"
+
+msgid " kind file\n"
+msgstr " kind-fil\n"
+
+msgid "'history' option is zero"
+msgstr "'history'-tilvalget er nul"
+
+#, c-format
+msgid ""
+"\n"
+"# %s History (newest to oldest):\n"
+msgstr ""
+"\n"
+"# %s Historik (nyeste til รฆldste):\n"
+
+msgid "Command Line"
+msgstr "Kommandolinje"
+
+msgid "Search String"
+msgstr "Sรธgestreng"
+
+msgid "Expression"
+msgstr "Udtryk"
+
+msgid "Input Line"
+msgstr "Inputlinje"
+
+msgid "Debug Line"
+msgstr "Fejlretningslinje"
+
+msgid "E198: cmd_pchar beyond the command length"
+msgstr "E198: cmd_pchar efter kommandolรฆngden"
+
+msgid "E199: Active window or buffer deleted"
+msgstr "E199: Aktivt vindue eller buffer slettet"
+
+msgid "E812: Autocommands changed buffer or buffer name"
+msgstr "E812: Autokommandoer รฆndrede buffer eller buffernavn"
+
+msgid "Illegal file name"
+msgstr "Ulovlig filnavn"
+
+msgid "is a directory"
+msgstr "er en mappe"
+
+msgid "is not a file"
+msgstr "er ikke en fil"
+
+msgid "is a device (disabled with 'opendevice' option)"
+msgstr "er en enhed (deaktiveret med 'opendevice'-tilvalget)"
+
+msgid "[New File]"
+msgstr "[Ny fil]"
+
+msgid "[New DIRECTORY]"
+msgstr "[Ny MAPPE]"
+
+msgid "[File too big]"
+msgstr "[Filen er for stor]"
+
+msgid "[Permission Denied]"
+msgstr "[Tilladelse nรฆgtet]"
+
+msgid "E200: *ReadPre autocommands made the file unreadable"
+msgstr "E200: *ReadPre-autokommandoer gjorde filen ulรฆselig"
+
+msgid "E201: *ReadPre autocommands must not change current buffer"
+msgstr "E201: *ReadPre-autokommandoer mรฅ ikke รฆndre nuvรฆrende buffer"
+
+msgid "Vim: Reading from stdin...\n"
+msgstr "Vim: Lรฆser fra stdin...\n"
+
+msgid "Reading from stdin..."
+msgstr "Lรฆser fra stdin..."
+
+msgid "E202: Conversion made file unreadable!"
+msgstr "E202: Konvertering gjorde filen ulรฆselig!"
+
+msgid "[fifo/socket]"
+msgstr "[fifo/sokkel]"
+
+msgid "[fifo]"
+msgstr "[fifo]"
+
+msgid "[socket]"
+msgstr "[sokkel]"
+
+msgid "[character special]"
+msgstr "[character special]"
+
+msgid "[CR missing]"
+msgstr "[CR mangler]"
+
+msgid "[long lines split]"
+msgstr "[opdeling af lange linjer]"
+
+msgid "[NOT converted]"
+msgstr "[IKKE konverteret]"
+
+msgid "[converted]"
+msgstr "[konverteret]"
+
+#, c-format
+msgid "[CONVERSION ERROR in line %ld]"
+msgstr "[KONVERTERINGSFEJL pรฅ linje %ld]"
+
+#, c-format
+msgid "[ILLEGAL BYTE in line %ld]"
+msgstr "[ULOVLIG BYTE pรฅ linje %ld]"
+
+msgid "[READ ERRORS]"
+msgstr "[Lร†SEFEJL]"
+
+msgid "Can't find temp file for conversion"
+msgstr "Kan ikke finde midlertidig fil til konvertering"
+
+msgid "Conversion with 'charconvert' failed"
+msgstr "Konvertering med 'charconvert' mislykkedes"
+
+msgid "can't read output of 'charconvert'"
+msgstr "kan ikke lรฆse output af 'charconvert'"
+
+msgid "E676: No matching autocommands for acwrite buffer"
+msgstr "E676: Ingen matchende autokommandoer for acwrite-buffer"
+
+msgid "E203: Autocommands deleted or unloaded buffer to be written"
+msgstr "E203: Autokommandoer slettet eller udlรฆste buffer som skal skrives"
+
+msgid "E204: Autocommand changed number of lines in unexpected way"
+msgstr "E204: Autokommando รฆndrede antal linjer pรฅ en uventede mรฅde"
+
+msgid "NetBeans disallows writes of unmodified buffers"
+msgstr "NetBeans tillader ikke skrivninger af uรฆndrede buffere"
+
+msgid "Partial writes disallowed for NetBeans buffers"
+msgstr "Ufuldstรฆndige skrivninger er ikke tilladt for NetBeans-buffere"
+
+msgid "is not a file or writable device"
+msgstr "er ikke en fil eller enhed som der kan skrives til"
+
+msgid "writing to device disabled with 'opendevice' option"
+msgstr "skrivning til enhed er deaktiveret med 'opendevice'-tilvalget"
+
+msgid "is read-only (add ! to override)"
+msgstr "er skrivebeskyttet (tilfรธj ! for at tilsidesรฆtte)"
+
+msgid "E506: Can't write to backup file (add ! to override)"
+msgstr ""
+"E506: Kan ikke skrive til sikkerhedskopieret fil (tilfรธj ! for at "
+"tilsidesรฆtte)"
+
+msgid "E507: Close error for backup file (add ! to override)"
+msgstr ""
+"E507: Fejl ved lukning af sikkerhedskopieret fil (tilfรธj ! for at "
+"tilsidesรฆtte)"
+
+msgid "E508: Can't read file for backup (add ! to override)"
+msgstr ""
+"E508: Kan ikke lรฆse fil til sikkerhedskopiering (tilfรธj ! for at "
+"tilsidesรฆtte)"
+
+msgid "E509: Cannot create backup file (add ! to override)"
+msgstr ""
+"E509: Kan ikke oprette (create) sikkerhedskopieret fil (tilfรธj ! for at "
+"tilsidesรฆtte)"
+
+msgid "E510: Can't make backup file (add ! to override)"
+msgstr ""
+"E510: Kan ikke oprette (make) sikkerhedskopieret fil (tilfรธj ! for at "
+"tilsidesรฆtte)"
+
+msgid "E214: Can't find temp file for writing"
+msgstr "E214: Kan ikke finde midlertidig fil til skrivning"
+
+msgid "E213: Cannot convert (add ! to write without conversion)"
+msgstr "E213: Kan ikke konvertere (tilfรธj ! for at skrive uden konvertering)"
+
+msgid "E166: Can't open linked file for writing"
+msgstr "E166: Kan ikke รฅbne linket fil til skrivning"
+
+msgid "E212: Can't open file for writing"
+msgstr "E212: Kan ikke รฅbne filen til skrivning"
+
+msgid "E949: File changed while writing"
+msgstr "E949: Filen blev รฆndret ved skrivning"
+
+msgid "E512: Close failed"
+msgstr "E512: Lukning mislykkedes"
+
+msgid "E513: write error, conversion failed (make 'fenc' empty to override)"
+msgstr ""
+"E513: fejl ved skrivning, konvertering mislykkedes (gรธr 'fenc' tom for at "
+"tilsidesรฆtte)"
+
+#, c-format
+msgid ""
+"E513: write error, conversion failed in line %ld (make 'fenc' empty to "
+"override)"
+msgstr ""
+"E513: fejl ved skrivning, konvertering mislykkedes pรฅ linje %ld (gรธr 'fenc' "
+"tom for at tilsidesรฆtte)"
+
+msgid "E514: write error (file system full?)"
+msgstr "E514: skrivefejl (er filsystemet fuldt?)"
+
+msgid " CONVERSION ERROR"
+msgstr " KONVERTERINGSFEJL"
+
+#, c-format
+msgid " in line %ld;"
+msgstr " pรฅ linje %ld;"
+
+msgid "[Device]"
+msgstr "[Enhed]"
+
+msgid "[New]"
+msgstr "[Ny]"
+
+msgid " [a]"
+msgstr " [a]"
+
+msgid " appended"
+msgstr " tilfรธjet i slutningen"
+
+msgid " [w]"
+msgstr " [s]"
+
+msgid " written"
+msgstr " skrevet"
+
+msgid "E205: Patchmode: can't save original file"
+msgstr "E205: Patchmode: kan ikke gemme original fil"
+
+msgid "E206: patchmode: can't touch empty original file"
+msgstr "E206: patchmode: kan ikke touch tom original fil"
+
+msgid "E207: Can't delete backup file"
+msgstr "E207: Kan ikke slette sikkerhedskopieret fil"
+
+msgid ""
+"\n"
+"WARNING: Original file may be lost or damaged\n"
+msgstr ""
+"\n"
+"ADVARSEL: Den originale fil kan man mistet eller beskadiget\n"
+
+msgid "don't quit the editor until the file is successfully written!"
+msgstr "afslut ikke editoren inden filen er blevet skrevet!"
+
+msgid "[dos]"
+msgstr "[dos]"
+
+msgid "[dos format]"
+msgstr "[dos-format]"
+
+msgid "[mac]"
+msgstr "[mac]"
+
+msgid "[mac format]"
+msgstr "[mac-format]"
+
+msgid "[unix]"
+msgstr "[unix]"
+
+msgid "[unix format]"
+msgstr "[unix-format]"
+
+msgid "1 line, "
+msgstr "1 linje, "
+
+#, c-format
+msgid "%ld lines, "
+msgstr "%ld linjer, "
+
+msgid "1 character"
+msgstr "1 tegn"
+
+#, c-format
+msgid "%lld characters"
+msgstr "%lld tegn"
+
+msgid "[noeol]"
+msgstr "[ingen eol]"
+
+msgid "[Incomplete last line]"
+msgstr "[Ufuldstรฆndig sidste linje]"
+
+msgid "WARNING: The file has been changed since reading it!!!"
+msgstr "ADVARSEL: Filen er blevet รฆndret siden den blev lรฆst!!!"
+
+msgid "Do you really want to write to it"
+msgstr "Vil du virkelig skrive den"
+
+#, c-format
+msgid "E208: Error writing to \"%s\""
+msgstr "E208: Fejl ved skrivning til \"%s\""
+
+#, c-format
+msgid "E209: Error closing \"%s\""
+msgstr "E209: Fejl ved lukning af \"%s\""
+
+#, c-format
+msgid "E210: Error reading \"%s\""
+msgstr "E210: Fejl ved lรฆsning af \"%s\""
+
+msgid "E246: FileChangedShell autocommand deleted buffer"
+msgstr "E246: FileChangedShell-autokommando slettede buffer"
+
+#, c-format
+msgid "E211: File \"%s\" no longer available"
+msgstr "E211: Filen \"%s\" er ikke lรฆngere tilgรฆngelig"
+
+#, c-format
+msgid ""
+"W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as "
+"well"
+msgstr ""
+"W12: Advarsel: Filen \"%s\" er blevet รฆndret og bufferen blev ogsรฅ รฆndret i "
+"Vim"
+
+msgid "See \":help W12\" for more info."
+msgstr "Se \":help W12\" for mere info."
+
+#, c-format
+msgid "W11: Warning: File \"%s\" has changed since editing started"
+msgstr "W11: Advarsel: Filen \"%s\" er blevet รฆndret siden redigeringen startede"
+
+msgid "See \":help W11\" for more info."
+msgstr "Se \":help W11\" for mere info."
+
+#, c-format
+msgid "W16: Warning: Mode of file \"%s\" has changed since editing started"
+msgstr ""
+"W16: Advarsel: Tilstanden af filen \"%s\" er blevet รฆndret siden redigeringen "
+"startede"
+
+msgid "See \":help W16\" for more info."
+msgstr "Se \":help W16\" for mere info."
+
+#, c-format
+msgid "W13: Warning: File \"%s\" has been created after editing started"
+msgstr ""
+"W13: Advarsel: Filen \"%s\" er blevet oprettet efter redigeringen startede"
+
+msgid "Warning"
+msgstr "Advarsel"
+
+msgid ""
+"&OK\n"
+"&Load File"
+msgstr ""
+"&OK\n"
+"&Indlรฆs fil"
+
+#, c-format
+msgid "E462: Could not prepare for reloading \"%s\""
+msgstr "E462: Kunne ikke forbedre til genindlรฆsning af \"%s\""
+
+#, c-format
+msgid "E321: Could not reload \"%s\""
+msgstr "E321: Kunne ikke genindlรฆse \"%s\""
+
+msgid "--Deleted--"
+msgstr "--Slettet--"
+
+#, c-format
+msgid "auto-removing autocommand: %s <buffer=%d>"
+msgstr "auto-removing-autokommando: %s <buffer=%d>"
+
+#, c-format
+msgid "E367: No such group: \"%s\""
+msgstr "E367: Ingen sรฅdan gruppe: \"%s\""
+
+msgid "E936: Cannot delete the current group"
+msgstr "E936: Kan ikke slette den nuvรฆrende gruppe"
+
+msgid "W19: Deleting augroup that is still in use"
+msgstr "W19: Sletter augroup som stadig er i brug"
+
+#, c-format
+msgid "E215: Illegal character after *: %s"
+msgstr "E215: Ulovligt tegn efter *: %s"
+
+#, c-format
+msgid "E216: No such event: %s"
+msgstr "E216: Ingen sรฅdan hรฆndelse: %s"
+
+#, c-format
+msgid "E216: No such group or event: %s"
+msgstr "E216: Ingen sรฅdan gruppe eller hรฆndelse: %s"
+
+msgid ""
+"\n"
+"--- Auto-Commands ---"
+msgstr ""
+"\n"
+"--- Auto-kommandoer ---"
+
+#, c-format
+msgid "E680: <buffer=%d>: invalid buffer number "
+msgstr "E680: <buffer=%d>: ugyldigt buffernummer "
+
+msgid "E217: Can't execute autocommands for ALL events"
+msgstr "E217: Kan ikke udfรธre autokommandoer for ALLE hรฆndelser"
+
+msgid "No matching autocommands"
+msgstr "Ingen matchende autokommandoer"
+
+msgid "E218: autocommand nesting too deep"
+msgstr "E218: autokommando indlejret for dyb"
+
+#, c-format
+msgid "%s Auto commands for \"%s\""
+msgstr "%s Auto-kommandoer for \"%s\""
+
+#, c-format
+msgid "Executing %s"
+msgstr "Udfรธrer %s"
+
+#, c-format
+msgid "autocommand %s"
+msgstr "autokommando %s"
+
+msgid "E219: Missing {."
+msgstr "E219: Manglende {."
+
+msgid "E220: Missing }."
+msgstr "E220: Manglende }."
+
+msgid "E490: No fold found"
+msgstr "E490: Ingen sammenfoldning fundet"
+
+msgid "E350: Cannot create fold with current 'foldmethod'"
+msgstr "E350: Kan ikke oprette sammenfoldning med nuvรฆrende 'foldmethod'"
+
+msgid "E351: Cannot delete fold with current 'foldmethod'"
+msgstr "E351: Kan ikke slette sammenfoldning med nuvรฆrende 'foldmethod'"
+
+#, c-format
+msgid "+--%3ld line folded "
+msgid_plural "+--%3ld lines folded "
+msgstr[0] "+--%3ld linje sammenfoldet "
+msgstr[1] "+--%3ld linjer sammenfoldet "
+
+msgid "E222: Add to read buffer"
+msgstr "E222: Tilfรธj til lรฆsebuffer"
+
+msgid "E223: recursive mapping"
+msgstr "E223: rekursiv mapping"
+
+#, c-format
+msgid "E224: global abbreviation already exists for %s"
+msgstr "E224: global forkortelse findes allerede for %s"
+
+#, c-format
+msgid "E225: global mapping already exists for %s"
+msgstr "E225: global mapping findes allerede for %s"
+
+#, c-format
+msgid "E226: abbreviation already exists for %s"
+msgstr "E226: forkortelse findes allerede for %s"
+
+#, c-format
+msgid "E227: mapping already exists for %s"
+msgstr "E227: mapping findes allerede for %s"
+
+msgid "No abbreviation found"
+msgstr "Ingen forkortelse fundet"
+
+msgid "No mapping found"
+msgstr "Ingen mapping fundet"
+
+msgid "E228: makemap: Illegal mode"
+msgstr "E228: makemap: Ulovlig tilstand"
+
+msgid "E851: Failed to create a new process for the GUI"
+msgstr "E851: Kunne ikke oprette en ny proces for GUI'en"
+
+msgid "E852: The child process failed to start the GUI"
+msgstr "E852: Barneprocessen kunne ikke starte GUI'en"
+
+msgid "E229: Cannot start the GUI"
+msgstr "E229: Kan ikke starte GUI'en"
+
+#, c-format
+msgid "E230: Cannot read from \"%s\""
+msgstr "E230: Kan ikke lรฆse fra \"%s\""
+
+msgid "E665: Cannot start GUI, no valid font found"
+msgstr "E665: Kan ikke starte GUI, ingen gyldig skrifttype fundet"
+
+msgid "E231: 'guifontwide' invalid"
+msgstr "E231: 'guifontwide' ugyldig"
+
+msgid "E599: Value of 'imactivatekey' is invalid"
+msgstr "E599: Vรฆrdien af 'imactivatekey' er ugyldig"
+
+#, c-format
+msgid "E254: Cannot allocate color %s"
+msgstr "E254: Kan ikke allokere farven %s"
+
+msgid "No match at cursor, finding next"
+msgstr "Intet match ved markรธr, finder nรฆste"
+
+msgid "<cannot open> "
+msgstr "<kan ikke รฅbne> "
+
+#, c-format
+msgid "E616: vim_SelFile: can't get font %s"
+msgstr "E616: vim_SelFile: kan ikke hente skrifttypen %s"
+
+msgid "E614: vim_SelFile: can't return to current directory"
+msgstr "E614: vim_SelFile: kan ikke vende tilbage til nuvรฆrende mappe"
+
+msgid "Pathname:"
+msgstr "Stinavn:"
+
+msgid "E615: vim_SelFile: can't get current directory"
+msgstr "E615: vim_SelFile: kan ikke hente nuvรฆrende mappe"
+
+msgid "OK"
+msgstr "OK"
+
+msgid "Cancel"
+msgstr "Annuller"
+
+msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
+msgstr ""
+"Rullebjรฆlke-widget: Kunne ikke hente geometri eller pixelkort til miniature."
+
+msgid "Vim dialog"
+msgstr "Vim-dialog"
+
+msgid "E232: Cannot create BalloonEval with both message and callback"
+msgstr "E232: Kan ikke oprette BalloonEval med bรฅde meddelelse og callback"
+
+msgid "_Cancel"
+msgstr "_Annuller"
+
+msgid "_Save"
+msgstr "_Gem"
+
+msgid "_Open"
+msgstr "_ร…bn"
+
+msgid "_OK"
+msgstr "_OK"
+
+msgid ""
+"&Yes\n"
+"&No\n"
+"&Cancel"
+msgstr ""
+"&Ja\n"
+"&Nej\n"
+"&Annuller"
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "No"
+msgstr "Nej"
+
+msgid "Input _Methods"
+msgstr "Input_metoder"
+
+msgid "VIM - Search and Replace..."
+msgstr "VIM - Sรธg og erstat..."
+
+msgid "VIM - Search..."
+msgstr "VIM - Sรธg..."
+
+msgid "Find what:"
+msgstr "Find hvad:"
+
+msgid "Replace with:"
+msgstr "Erstat med:"
+
+msgid "Match whole word only"
+msgstr "Match kun hele ord"
+
+msgid "Match case"
+msgstr "Der skelnes ikke mellem store og smรฅ bogstaver"
+
+msgid "Direction"
+msgstr "Retning"
+
+msgid "Up"
+msgstr "Op"
+
+msgid "Down"
+msgstr "Ned"
+
+msgid "Find Next"
+msgstr "Find nรฆste"
+
+msgid "Replace"
+msgstr "Erstat"
+
+msgid "Replace All"
+msgstr "Erstat alle"
+
+msgid "_Close"
+msgstr "_Luk"
+
+msgid "Vim: Received \"die\" request from session manager\n"
+msgstr "Vim: Modtog \"die\"-anmodning fra sessionshรฅndtering\n"
+
+msgid "Close tab"
+msgstr "Luk faneblad"
+
+msgid "New tab"
+msgstr "Nyt faneblad"
+
+msgid "Open Tab..."
+msgstr "ร…bn faneblad..."
+
+msgid "Vim: Main window unexpectedly destroyed\n"
+msgstr "Vim: Hovedvindue uventet รธdelagt\n"
+
+msgid "&Filter"
+msgstr "&Filter"
+
+msgid "&Cancel"
+msgstr "&Annuller"
+
+msgid "Directories"
+msgstr "Mapper"
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "&Help"
+msgstr "&Hjรฆlp"
+
+msgid "Files"
+msgstr "Filer"
+
+msgid "&OK"
+msgstr "&OK"
+
+msgid "Selection"
+msgstr "Markering"
+
+msgid "Find &Next"
+msgstr "Find &nรฆste"
+
+msgid "&Replace"
+msgstr "&Erstat"
+
+msgid "Replace &All"
+msgstr "Erstat &alle"
+
+msgid "&Undo"
+msgstr "&Fortryd"
+
+msgid "Open tab..."
+msgstr "ร…bn faneblad..."
+
+msgid "Find string (use '\\\\' to find a '\\')"
+msgstr "Find streng (brug '\\\\' til at finde et '\\')"
+
+msgid "Find & Replace (use '\\\\' to find a '\\')"
+msgstr "Find og erstat (brug '\\\\' til at finde et '\\')"
+
+msgid "Not Used"
+msgstr "Ikke brugt"
+
+msgid "Directory\t*.nothing\n"
+msgstr "Mappe\t\t*.nothing\n"
+
+#, c-format
+msgid "E671: Cannot find window title \"%s\""
+msgstr "E671: Kan ikke finde vinduestitlen \"%s\""
+
+#, c-format
+msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
+msgstr "E243: Argumentet understรธttes ikke: \"-%s\"; Brug OLE-versionen."
+
+msgid "E672: Unable to open window inside MDI application"
+msgstr "E672: Kan ikke รฅbne vindue i MDI-program"
+
+msgid "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
+msgstr ""
+"Vim E458: Kan ikke allokere colormap-post, nogle farver kan vรฆre forkerte"
+
+#, c-format
+msgid "E250: Fonts for the following charsets are missing in fontset %s:"
+msgstr "E250: Skrifttyper for fรธlgende tegnsรฆt mangler i skrifttypesรฆttet %s:"
+
+#, c-format
+msgid "E252: Fontset name: %s"
+msgstr "E252: Skrifttypesรฆtnavn: %s"
+
+#, c-format
+msgid "Font '%s' is not fixed-width"
+msgstr "Skrifttypen '%s' er ikke med fast bredde"
+
+#, c-format
+msgid "E253: Fontset name: %s"
+msgstr "E253: Skrifttypesรฆtnavn: %s"
+
+#, c-format
+msgid "Font0: %s"
+msgstr "Skrifttype0: %s"
+
+#, c-format
+msgid "Font1: %s"
+msgstr "Skrifttype1: %s"
+
+#, c-format
+msgid "Font%ld width is not twice that of font0"
+msgstr "Bredden pรฅ skrifttype%ld er ikke det dobbelte af skrifttype0"
+
+#, c-format
+msgid "Font0 width: %ld"
+msgstr "Bredden pรฅ skrifttype0: %ld"
+
+#, c-format
+msgid "Font1 width: %ld"
+msgstr "Bredden pรฅ skrifttype1: %ld"
+
+msgid "Invalid font specification"
+msgstr "Ugyldig skrifttypespecifikation"
+
+msgid "&Dismiss"
+msgstr "&Luk"
+
+msgid "no specific match"
+msgstr "intet specifikt match"
+
+msgid "Vim - Font Selector"
+msgstr "Vim - Skrifttypevรฆlger"
+
+msgid "Name:"
+msgstr "Navn:"
+
+msgid "Show size in Points"
+msgstr "Vis stรธrrelse i punkter"
+
+msgid "Encoding:"
+msgstr "Kodning:"
+
+msgid "Font:"
+msgstr "Skrifttype:"
+
+msgid "Style:"
+msgstr "Stil:"
+
+msgid "Size:"
+msgstr "Stรธrrelse:"
+
+msgid "E256: Hangul automata ERROR"
+msgstr "E256: FEJL ved Hangul automata"
+
+msgid "E550: Missing colon"
+msgstr "E550: Manglende kolon"
+
+msgid "E551: Illegal component"
+msgstr "E551: Ulovlig komponent"
+
+msgid "E552: digit expected"
+msgstr "E552: ciffer ventet"
+
+#, c-format
+msgid "Page %d"
+msgstr "Side %d"
+
+msgid "No text to be printed"
+msgstr "Ingen tekst at udskrive"
+
+#, c-format
+msgid "Printing page %d (%d%%)"
+msgstr "Udskriver side %d (%d%%)"
+
+#, c-format
+msgid " Copy %d of %d"
+msgstr " Kopi %d af %d"
+
+#, c-format
+msgid "Printed: %s"
+msgstr "Udskrev: %s"
+
+msgid "Printing aborted"
+msgstr "Udskrivning afbrudt"
+
+msgid "E455: Error writing to PostScript output file"
+msgstr "E455: Fejl ved skrivning til PostScript-output-fil"
+
+#, c-format
+msgid "E624: Can't open file \"%s\""
+msgstr "E624: Kan ikke รฅbne filen \"%s\""
+
+#, c-format
+msgid "E457: Can't read PostScript resource file \"%s\""
+msgstr "E457: Kan ikke lรฆse PostScript-ressourcefilen \"%s\""
+
+#, c-format
+msgid "E618: file \"%s\" is not a PostScript resource file"
+msgstr "E618: filen \"%s\" er ikke en PostScript-ressourcefil"
+
+#, c-format
+msgid "E619: file \"%s\" is not a supported PostScript resource file"
+msgstr "E619: filen \"%s\" er ikke en understรธttet PostScript-ressourcefil"
+
+#, c-format
+msgid "E621: \"%s\" resource file has wrong version"
+msgstr "E621: \"%s\"-ressourcefilen har forkert version"
+
+msgid "E673: Incompatible multi-byte encoding and character set."
+msgstr "E673: Inkompatibel multibyte-kodning og -tegnsรฆt."
+
+msgid "E674: printmbcharset cannot be empty with multi-byte encoding."
+msgstr "E674: printmbcharset mรฅ ikke vรฆre tom med multibyte-kodning."
+
+msgid "E675: No default font specified for multi-byte printing."
+msgstr "E675: Ingen standardskrifttype angivet for multibyte-udskrivning."
+
+msgid "E324: Can't open PostScript output file"
+msgstr "E324: Kan ikke รฅbne PostScript-output-fil"
+
+#, c-format
+msgid "E456: Can't open file \"%s\""
+msgstr "E456: Kan ikke รฅbne filen \"%s\""
+
+msgid "E456: Can't find PostScript resource file \"prolog.ps\""
+msgstr "E456: Kan ikke finde PostScript-ressourcefilen \"prolog.ps\""
+
+msgid "E456: Can't find PostScript resource file \"cidfont.ps\""
+msgstr "E456: Kan ikke finde PostScript-ressourcefilen \"cidfont.ps\""
+
+#, c-format
+msgid "E456: Can't find PostScript resource file \"%s.ps\""
+msgstr "E456: Kan ikke finde PostScript-ressourcefilen \"%s.ps\""
+
+#, c-format
+msgid "E620: Unable to convert to print encoding \"%s\""
+msgstr "E620: Kan ikke konvertere til udskrivningskodningen \"%s\""
+
+msgid "Sending to printer..."
+msgstr "Sender til printer..."
+
+msgid "E365: Failed to print PostScript file"
+msgstr "E365: Kunne ikke udskrive PostScript-fil"
+
+msgid "Print job sent."
+msgstr "Udskrivningsjob sendt."
+
+msgid "Add a new database"
+msgstr "Tilfรธj en ny database"
+
+msgid "Query for a pattern"
+msgstr "Forespรธrgsel til et mรธnster"
+
+msgid "Show this message"
+msgstr "Vis denne meddelelse"
+
+msgid "Kill a connection"
+msgstr "Drรฆb en forbindelse"
+
+msgid "Reinit all connections"
+msgstr "Geninitialisere alle forbindelser"
+
+msgid "Show connections"
+msgstr "Vis forbindelser"
+
+#, c-format
+msgid "E560: Usage: cs[cope] %s"
+msgstr "E560: Anvendelse: cs[cope] %s"
+
+msgid "This cscope command does not support splitting the window.\n"
+msgstr "Denne cscope-kommando understรธtter ikke opdeling af vinduet.\n"
+
+msgid "E562: Usage: cstag <ident>"
+msgstr "E562: Anvendelse: cstag <ident>"
+
+msgid "E257: cstag: tag not found"
+msgstr "E257: cstag: tag ikke fundet"
+
+#, c-format
+msgid "E563: stat(%s) error: %d"
+msgstr "E563: fejl ved stat(%s): %d"
+
+msgid "E563: stat error"
+msgstr "E563: fejl ved stat"
+
+#, c-format
+msgid "E564: %s is not a directory or a valid cscope database"
+msgstr "E564: %s er ikke en mappe eller en gyldig cscope-database"
+
+#, c-format
+msgid "Added cscope database %s"
+msgstr "Tilfรธjede cscope-databasen %s"
+
+#, c-format
+msgid "E262: error reading cscope connection %ld"
+msgstr "E262: fejl ved lรฆsning af cscope-forbindelse %ld"
+
+msgid "E561: unknown cscope search type"
+msgstr "E561: ukendt cscope-sรธgetype"
+
+msgid "E566: Could not create cscope pipes"
+msgstr "E566: Kunne ikke oprette cscope-pipes"
+
+msgid "E622: Could not fork for cscope"
+msgstr "E622: Kunne ikke fork for cscope"
+
+msgid "cs_create_connection setpgid failed"
+msgstr "cs_create_connection setpgid mislykkedes"
+
+msgid "cs_create_connection exec failed"
+msgstr "cs_create_connection exec mislykkedes"
+
+msgid "cs_create_connection: fdopen for to_fp failed"
+msgstr "cs_create_connection: fdopen for to_fp mislykkedes"
+
+msgid "cs_create_connection: fdopen for fr_fp failed"
+msgstr "cs_create_connection: fdopen for fr_fp mislykkedes"
+
+msgid "E623: Could not spawn cscope process"
+msgstr "E623: Kunne ikke spawn cscope-proces"
+
+msgid "E567: no cscope connections"
+msgstr "E567: ingen cscope-forbindelser"
+
+#, c-format
+msgid "E469: invalid cscopequickfix flag %c for %c"
+msgstr "E469: ugyldigt cscopequickfix-flag %c for %c"
+
+#, c-format
+msgid "E259: no matches found for cscope query %s of %s"
+msgstr "E259: ingen match fundet for cscope-forespรธrgsel %s af %s"
+
+msgid "cscope commands:\n"
+msgstr "cscope-kommandoer:\n"
+
+#, c-format
+msgid "%-5s: %s%*s (Usage: %s)"
+msgstr "%-5s: %s%*s (Anvendelse: %s)"
+
+msgid ""
+"\n"
+" a: Find assignments to this symbol\n"
+" c: Find functions calling this function\n"
+" d: Find functions called by this function\n"
+" e: Find this egrep pattern\n"
+" f: Find this file\n"
+" g: Find this definition\n"
+" i: Find files #including this file\n"
+" s: Find this C symbol\n"
+" t: Find this text string\n"
+msgstr ""
+"\n"
+" a: Find tildelinger til symbolet\n"
+" c: Find funktioner som kalder funktionen\n"
+" d: Find funktioner som kaldes af funktionen\n"
+" e: Find dette egrep-mรธnster\n"
+" f: Find filen\n"
+" g: Find definitionen\n"
+" i: Find filer som #inkludere filen\n"
+" s: Find C-symbolet\n"
+" t: Find tekststrengen\n"
+
+#, c-format
+msgid "E625: cannot open cscope database: %s"
+msgstr "E625: kan ikke รฅbne cscope-database: %s"
+
+msgid "E626: cannot get cscope database information"
+msgstr "E626: kan ikke hente information for cscope-database"
+
+msgid "E568: duplicate cscope database not added"
+msgstr "E568: duplikeret cscope-database ikke tilfรธjet"
+
+#, c-format
+msgid "E261: cscope connection %s not found"
+msgstr "E261: cscope-forbindelsen %s ikke fundet"
+
+#, c-format
+msgid "cscope connection %s closed"
+msgstr "cscope-forbindelsen %s lukket"
+
+msgid "E570: fatal error in cs_manage_matches"
+msgstr "E570: fatal fejl i cs_manage_matches"
+
+#, c-format
+msgid "Cscope tag: %s"
+msgstr "Cscope-tag: %s"
+
+msgid ""
+"\n"
+" # line"
+msgstr ""
+"\n"
+" # linje"
+
+msgid "filename / context / line\n"
+msgstr "filnavn/kontekst/linje\n"
+
+#, c-format
+msgid "E609: Cscope error: %s"
+msgstr "E609: Fejl ved cscope: %s"
+
+msgid "All cscope databases reset"
+msgstr "Alle cscope-databaser nulstillet"
+
+msgid "no cscope connections\n"
+msgstr "ingen cscope-forbindelser\n"
+
+msgid " # pid database name prepend path\n"
+msgstr " # pid databasenavn prepend-sti\n"
+
+msgid "Lua library cannot be loaded."
+msgstr "Lua-bibliotek kan ikke indlรฆses."
+
+msgid "cannot save undo information"
+msgstr "kan ikke gemme fortrydinformation"
+
+msgid ""
+"E815: Sorry, this command is disabled, the MzScheme libraries could not be "
+"loaded."
+msgstr ""
+"E815: Beklager, kommandoen er deaktiveret, MzScheme-bibliotekerne kunne ikke "
+"indlรฆses."
+
+msgid ""
+"E895: Sorry, this command is disabled, the MzScheme's racket/base module "
+"could not be loaded."
+msgstr ""
+"E895: Beklager, kommandoen er deaktiveret, MzScheme's racket-/base-modul "
+"kunne ikke indlรฆses."
+
+msgid "invalid expression"
+msgstr "ugyldigt udtryk"
+
+msgid "expressions disabled at compile time"
+msgstr "udtryk deaktiveret ved kompileringstid"
+
+msgid "hidden option"
+msgstr "skjult tilvalg"
+
+msgid "unknown option"
+msgstr "ukendt tilvalg"
+
+msgid "window index is out of range"
+msgstr "vinduesindeks udenfor omrรฅde"
+
+msgid "couldn't open buffer"
+msgstr "kan ikke รฅbne buffer"
+
+msgid "cannot delete line"
+msgstr "kan ikke slette linje"
+
+msgid "cannot replace line"
+msgstr "kan ikke erstatte linje"
+
+msgid "cannot insert line"
+msgstr "kan ikke indsรฆtte linje"
+
+msgid "string cannot contain newlines"
+msgstr "streng mรฅ ikke indeholde linjeskift"
+
+msgid "error converting Scheme values to Vim"
+msgstr "fejl ved konvertering af Scheme-vรฆrdier til Vim"
+
+msgid "Vim error: ~a"
+msgstr "Fejl ved Vim: ~a"
+
+msgid "Vim error"
+msgstr "Fejl ved Vim"
+
+msgid "buffer is invalid"
+msgstr "buffer er ugyldig"
+
+msgid "window is invalid"
+msgstr "vindue er ugyldigt"
+
+msgid "linenr out of range"
+msgstr "linjenummer udenfor omrรฅde"
+
+msgid "not allowed in the Vim sandbox"
+msgstr "ikke tilladt i Vim-sandboksen"
+
+msgid "E836: This Vim cannot execute :python after using :py3"
+msgstr "E836: Denne Vim kan ikke udfรธre :python efter brug af :py3"
+
+msgid ""
+"E263: Sorry, this command is disabled, the Python library could not be "
+"loaded."
+msgstr ""
+"E263: Beklager, kommandoen er deaktiveret, Python-biblioteket kunne ikke "
+"indlรฆses."
+
+msgid ""
+"E887: Sorry, this command is disabled, the Python's site module could not be "
+"loaded."
+msgstr ""
+"E887: Beklager, kommandoen er deaktiveret, Python's site-modul kunne ikke "
+"indlรฆses."
+
+msgid "E659: Cannot invoke Python recursively"
+msgstr "E659: Kan ikke starte Python rekursivt"
+
+msgid "E837: This Vim cannot execute :py3 after using :python"
+msgstr "E837: Denne Vim kan ikke udfรธre :py3 efter brug af :python"
+
+msgid "E265: $_ must be an instance of String"
+msgstr "E265: $_ skal vรฆre en instans af streng"
+
+msgid ""
+"E266: Sorry, this command is disabled, the Ruby library could not be loaded."
+msgstr ""
+"E266: Beklager, kommandoen er deaktiveret, Ruby-biblioteket kunne ikke "
+"indlรฆses."
+
+msgid "E267: unexpected return"
+msgstr "E267: uventet return"
+
+msgid "E268: unexpected next"
+msgstr "E268: uventet next"
+
+msgid "E269: unexpected break"
+msgstr "E269: uventet break"
+
+msgid "E270: unexpected redo"
+msgstr "E270: uventet redo"
+
+msgid "E271: retry outside of rescue clause"
+msgstr "E271: prรธv igen udenfor rescue clause"
+
+msgid "E272: unhandled exception"
+msgstr "E272: uhรฅndteret undtagelse"
+
+#, c-format
+msgid "E273: unknown longjmp status %d"
+msgstr "E273: ukendt longjmp-status %d"
+
+msgid "invalid buffer number"
+msgstr "ugyldigt buffernummer"
+
+msgid "not implemented yet"
+msgstr "endnu ikke implementeret"
+
+msgid "cannot set line(s)"
+msgstr "kan ikke sรฆtte linje(r)"
+
+msgid "invalid mark name"
+msgstr "ugyldigt mรฆrkenavn"
+
+msgid "mark not set"
+msgstr "mรฆrke ikke sat"
+
+#, c-format
+msgid "row %d column %d"
+msgstr "rรฆkke %d kolonne %d"
+
+msgid "cannot insert/append line"
+msgstr "kan ikke indsรฆtte/tilfรธje linje"
+
+msgid "line number out of range"
+msgstr "linjenummer udenfor omrรฅde"
+
+msgid "unknown flag: "
+msgstr "ukendt flag: "
+
+msgid "unknown vimOption"
+msgstr "ukendt vimOption"
+
+msgid "keyboard interrupt"
+msgstr "tastaturafbryd"
+
+msgid "vim error"
+msgstr "fejl ved vim"
+
+msgid "cannot create buffer/window command: object is being deleted"
+msgstr "kan ikke oprette buffer-/vindue-kommando: objekt slettes"
+
+msgid ""
+"cannot register callback command: buffer/window is already being deleted"
+msgstr ""
+"kan ikke registrere callback-kommando: buffer/vindue er allerede ved at "
+"blive slettet"
+
+msgid ""
+"E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-dev@vim."
+"org"
+msgstr ""
+"E280: FATAL FEJL VED TCL: reflist korrupt!? Rapportรฉr det venligst til vim-"
+"dev@vim.org"
+
+msgid "cannot register callback command: buffer/window reference not found"
+msgstr ""
+"kan ikke registrere callback-kommando: buffer-/vindue-reference ikke fundet"
+
+msgid ""
+"E571: Sorry, this command is disabled: the Tcl library could not be loaded."
+msgstr ""
+"E571: Beklager, kommandoen er deaktiveret: Tcl-biblioteket kunne ikke "
+"indlรฆses."
+
+#, c-format
+msgid "E572: exit code %d"
+msgstr "E572: afslutningskode %d"
+
+msgid "cannot get line"
+msgstr "kan ikke hente linje"
+
+msgid "Unable to register a command server name"
+msgstr "Kan ikke registrere et kommandoservernavn"
+
+msgid "E248: Failed to send command to the destination program"
+msgstr "E248: Kunne ikke sende kommando til destinationsprogrammet"
+
+#, c-format
+msgid "E573: Invalid server id used: %s"
+msgstr "E573: Ugyldigt server-id brugt: %s"
+
+msgid "E251: VIM instance registry property is badly formed. Deleted!"
+msgstr ""
+"E251: Registreringsegenskab for VIM-instans er dรฅrligt udformet. Slettet!"
+
+#, c-format
+msgid "E938: Duplicate key in JSON: \"%s\""
+msgstr "E938: Duplikeret nรธgle i JSON: \"%s\""
+
+#, c-format
+msgid "E696: Missing comma in List: %s"
+msgstr "E696: Manglende komma i liste: %s"
+
+#, c-format
+msgid "E697: Missing end of List ']': %s"
+msgstr "E697: Manglende slutning pรฅ List ']': %s"
+
+msgid "Unknown option argument"
+msgstr "Ukendt tilvalgsargument"
+
+msgid "Too many edit arguments"
+msgstr "For mange redigeringsargumenter"
+
+msgid "Argument missing after"
+msgstr "Argument mangler efter"
+
+msgid "Garbage after option argument"
+msgstr "Affald efter tilvalgsargument"
+
+msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"
+msgstr ""
+"For mange \"+kommando\"-, \"-c kommando\"- eller \"--cmd kommando\"-argumenter"
+
+msgid "Invalid argument for"
+msgstr "Ugyldigt argument for"
+
+#, c-format
+msgid "%d files to edit\n"
+msgstr "%d filer at redigere\n"
+
+msgid "netbeans is not supported with this GUI\n"
+msgstr "netbeans understรธttes ikke med denne GUI\n"
+
+msgid "'-nb' cannot be used: not enabled at compile time\n"
+msgstr "'-nb' kan ikke bruges: ikke aktiveret ved kompileringstid\n"
+
+msgid "This Vim was not compiled with the diff feature."
+msgstr "Denne Vim blev ikke kompileret med diff-funktionaliteten."
+
+msgid "Attempt to open script file again: \""
+msgstr "Forsรธg pรฅ at รฅbne scriptfil igen: \""
+
+msgid "Cannot open for reading: \""
+msgstr "Kan ikke รฅbne til lรฆsning: \""
+
+msgid "Cannot open for script output: \""
+msgstr "Kan ikke รฅbne for script-output: \""
+
+msgid "Vim: Error: Failure to start gvim from NetBeans\n"
+msgstr "Vim: Fejl: Kunne ikke starte gvim fra NetBeans\n"
+
+msgid "Vim: Error: This version of Vim does not run in a Cygwin terminal\n"
+msgstr "Vim: Fejl: Denne version af Vim kรธrer ikke i en Cygwin-terminal\n"
+
+msgid "Vim: Warning: Output is not to a terminal\n"
+msgstr "Vim: Advarsel: Output er ikke til en terminal\n"
+
+msgid "Vim: Warning: Input is not from a terminal\n"
+msgstr "Vim: Advarsel: Input er ikke fra en terminal\n"
+
+msgid "pre-vimrc command line"
+msgstr "pre-vimrc-kommandolinje"
+
+#, c-format
+msgid "E282: Cannot read from \"%s\""
+msgstr "E282: Kan ikke lรฆse fra \"%s\""
+
+msgid ""
+"\n"
+"More info with: \"vim -h\"\n"
+msgstr ""
+"\n"
+"Mere info med: \"vim -h\"\n"
+
+msgid "[file ..] edit specified file(s)"
+msgstr "[fil ..] rediger angivne fil(er)"
+
+msgid "- read text from stdin"
+msgstr "- lรฆs tekst fra stdin"
+
+msgid "-t tag edit file where tag is defined"
+msgstr "-t tag rediger fil hvor tag er defineret"
+
+msgid "-q [errorfile] edit file with first error"
+msgstr "-q [fejlfil] rediger fil med fรธrste fejl"
+
+msgid ""
+"\n"
+"\n"
+"usage:"
+msgstr ""
+"\n"
+"\n"
+"anvendelse:"
+
+msgid " vim [arguments] "
+msgstr " vim [argumenter] "
+
+msgid ""
+"\n"
+" or:"
+msgstr ""
+"\n"
+" eller:"
+
+msgid ""
+"\n"
+"Where case is ignored prepend / to make flag upper case"
+msgstr ""
+"\n"
+"Nรฅr der ikke skelnes mellem store og smรฅ bogstaver, sรฅ tilfรธj / i "
+"begyndelsen for at gรธre flag til store bogstaver"
+
+msgid ""
+"\n"
+"\n"
+"Arguments:\n"
+msgstr ""
+"\n"
+"\n"
+"Argumenter:\n"
+
+msgid "--\t\t\tOnly file names after this"
+msgstr "--\t\t\tKun filnavne herefter"
+
+msgid "--literal\t\tDon't expand wildcards"
+msgstr "--literal\t\tUdvid ikke jokertegn"
+
+msgid "-register\t\tRegister this gvim for OLE"
+msgstr "-register\t\tRegistrer denne gvim til OLE"
+
+msgid "-unregister\t\tUnregister gvim for OLE"
+msgstr "-unregister\t\tAfregistrer gvim for OLE"
+
+msgid "-g\t\t\tRun using GUI (like \"gvim\")"
+msgstr "-g\t\t\tKรธr med GUI (ligesom \"gvim\")"
+
+msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
+msgstr "-f eller --nofork\tForgrund: Fork ikke nรฅr GUI startes"
+
+msgid "-v\t\t\tVi mode (like \"vi\")"
+msgstr "-v\t\t\tVi-tilstand (ligesom \"vi\")"
+
+msgid "-e\t\t\tEx mode (like \"ex\")"
+msgstr "-e\t\t\tEx-tilstand (ligesom \"ex\")"
+
+msgid "-E\t\t\tImproved Ex mode"
+msgstr "-E\t\t\tForbedret Ex-tilstand"
+
+msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")"
+msgstr "-s\t\t\tStille (batch) tilstand (kun til \"ex\")"
+
+msgid "-d\t\t\tDiff mode (like \"vimdiff\")"
+msgstr "-d\t\t\tDiff-tilstand (ligesom \"vimdiff\")"
+
+msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
+msgstr "-y\t\t\tEasy-tilstand (ligesom \"evim\", tilstandslรธs)"
+
+msgid "-R\t\t\tReadonly mode (like \"view\")"
+msgstr "-R\t\t\tSkrivebeskyttet tilstand (ligesom \"view\")"
+
+msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
+msgstr "-Z\t\t\tRestriktiv tilstand (ligesom \"rvim\")"
+
+msgid "-m\t\t\tModifications (writing files) not allowed"
+msgstr "-m\t\t\tร†ndringer (skrivning af filer) ikke tilladt"
+
+msgid "-M\t\t\tModifications in text not allowed"
+msgstr "-M\t\t\tร†ndringer i tekst ikke tilladt"
+
+msgid "-b\t\t\tBinary mode"
+msgstr "-b\t\t\tBinรฆr tilstand"
+
+msgid "-l\t\t\tLisp mode"
+msgstr "-l\t\t\tLisp-tilstand"
+
+msgid "-C\t\t\tCompatible with Vi: 'compatible'"
+msgstr "-C\t\t\tKompatibel med Vi: 'compatible'"
+
+msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'"
+msgstr "-N\t\t\tIkke fuldt ud Vi-kompatibel: 'nocompatible'"
+
+msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]"
+msgstr "-V[N][fnavn]\t\tVรฆr uddybende [niveau N] [log meddelelser til fnavn]"
+
+msgid "-D\t\t\tDebugging mode"
+msgstr "-D\t\t\tFejlretningstilstand"
+
+msgid "-n\t\t\tNo swap file, use memory only"
+msgstr "-n\t\t\tIngen swap-fil, brug kun hukommelse"
+
+msgid "-r\t\t\tList swap files and exit"
+msgstr "-r\t\t\tOplist swap-filer og afslut"
+
+msgid "-r (with file name)\tRecover crashed session"
+msgstr "-r (med filnavn)\tGendan session som holdt op med at virke"
+
+msgid "-L\t\t\tSame as -r"
+msgstr "-L\t\t\tSamme som -r"
+
+msgid "-f\t\t\tDon't use newcli to open window"
+msgstr "-f\t\t\tBrug ikke newcli til at รฅbne vindue"
+
+msgid "-dev <device>\t\tUse <device> for I/O"
+msgstr "-dev <enhed>\t\tBrug <enhed> til I/O"
+
+msgid "-A\t\t\tstart in Arabic mode"
+msgstr "-A\t\t\tstart i arabisk tilstand"
+
+msgid "-H\t\t\tStart in Hebrew mode"
+msgstr "-H\t\t\tStart i hebraisk tilstand"
+
+msgid "-F\t\t\tStart in Farsi mode"
+msgstr "-F\t\t\tStart i persisk tilstand"
+
+msgid "-T <terminal>\tSet terminal type to <terminal>"
+msgstr "-T <terminal>\tSรฆt terminaltype til <terminal>"
+
+msgid "--not-a-term\t\tSkip warning for input/output not being a terminal"
+msgstr ""
+"--not-a-term\t\tSpring advarsel over for input/output som ikke er en terminal"
+
+msgid "--ttyfail\t\tExit if input or output is not a terminal"
+msgstr "--ttyfail\t\tAfslut hvis input eller output ikke er en terminal"
+
+msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc"
+msgstr "-u <vimrc>\t\tBrug <vimrc> i stedet for nogen .vimrc"
+
+msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
+msgstr "-U <gvimrc>\t\tBrug <gvimrc> i stedet for nogen .gvimrc"
+
+msgid "--noplugin\t\tDon't load plugin scripts"
+msgstr "--noplugin\t\tIndlรฆs ikke plugin-scripts"
+
+msgid "-p[N]\t\tOpen N tab pages (default: one for each file)"
+msgstr "-p[N]\t\tร…bn N fanebladssider (standard: รฉn pr. fil)"
+
+msgid "-o[N]\t\tOpen N windows (default: one for each file)"
+msgstr "-o[N]\t\tร…bn N vinduer (standard: รฉn pr. fil)"
+
+msgid "-O[N]\t\tLike -o but split vertically"
+msgstr "-O[N]\t\tLigesom -o men opdel lodret"
+
+msgid "+\t\t\tStart at end of file"
+msgstr "+\t\t\tBegynd ved slutningen af filen"
+
+msgid "+<lnum>\t\tStart at line <lnum>"
+msgstr "+<lnum>\t\tBegynd ved linje <lnum>"
+
+msgid "--cmd <command>\tExecute <command> before loading any vimrc file"
+msgstr "--cmd <kommando>\tUdfรธr <kommando> inden indlรฆsning af vimrc-filer"
+
+msgid "-c <command>\t\tExecute <command> after loading the first file"
+msgstr "-c <kommando>\tUdfรธr <kommando> efter indlรฆsning af den fรธrste fil"
+
+msgid "-S <session>\t\tSource file <session> after loading the first file"
+msgstr "-S <session>\t\tSource filen <session> efter indlรฆsning af den fรธrste fil"
+
+msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>"
+msgstr "-s <scriptind>\tLรฆs normal tilstand-kommandoer fra filen <scriptind>"
+
+msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>"
+msgstr ""
+"-w <scriptud>\tTilfรธj alle indtastede kommandoer til slutningen af filen "
+"<scriptud>"
+
+msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>"
+msgstr "-W <scriptud>\tSkriv alle indtastede kommandoer til filen <scriptud>"
+
+msgid "-x\t\t\tEdit encrypted files"
+msgstr "-x\t\t\tRediger krypterede filer"
+
+msgid "-display <display>\tConnect vim to this particular X-server"
+msgstr "-display <display>\tForbind vim til denne X-server"
+
+msgid "-X\t\t\tDo not connect to X server"
+msgstr "-X\t\t\tOpret ikke forbindelse til X-server"
+
+msgid "--remote <files>\tEdit <files> in a Vim server if possible"
+msgstr "--remote <filer>\tRediger <filer> i en Vim-server, hvis det er muligt"
+
+msgid "--remote-silent <files> Same, don't complain if there is no server"
+msgstr ""
+"--remote-silent <filer> Samme, men vรฆr tavs hvis der ikke er nogen server"
+
+msgid ""
+"--remote-wait <files> As --remote but wait for files to have been edited"
+msgstr ""
+"--remote-wait <filer> Som --remote men vent pรฅ filer som skal redigeres"
+
+msgid ""
+"--remote-wait-silent <files> Same, don't complain if there is no server"
+msgstr ""
+"--remote-wait-silent <filer> Samme, men vรฆr tavs hvis der ikke er nogen "
+"server"
+
+msgid ""
+"--remote-tab[-wait][-silent] <files> As --remote but use tab page per file"
+msgstr ""
+"--remote-tab[-wait][-silent] <filer> Som --remote men brug fanebladsside "
+"pr. fil"
+
+msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
+msgstr "--remote-send <nรธgler>\tSend <nรธgler> til en Vim-server og afslut"
+
+msgid "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
+msgstr ""
+"--remote-expr <udtryk>\tEvaluรฉr <udtryk> i en Vim-server og udskriv "
+"resultatet"
+
+msgid "--serverlist\t\tList available Vim server names and exit"
+msgstr "--serverlist\t\tOplist tilgรฆngelige Vim-servernavne og afslut"
+
+msgid "--servername <name>\tSend to/become the Vim server <name>"
+msgstr "--servername <navn>\tSend til/bliv Vim-serveren <navn>"
+
+msgid "--startuptime <file>\tWrite startup timing messages to <file>"
+msgstr "--startuptime <fil>\tSkriv meddelelser om opstartstiming til <fil>"
+
+msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
+msgstr "-i <viminfo>\t\tBrug <viminfo> i stedet for .viminfo"
+
+msgid "--clean\t\t'nocompatible', Vim defaults, no plugins, no viminfo"
+msgstr "--clean\t\t'nocompatible', Vim-standarder, ingen plugins, ingen viminfo"
+
+msgid "-h or --help\tPrint Help (this message) and exit"
+msgstr "-h eller --help\tUdskriv hjรฆlp (denne meddelelse) og afslut"
+
+msgid "--version\t\tPrint version information and exit"
+msgstr "--version\t\tUdskriv versionsinformation og afslut"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (Motif version):\n"
+msgstr ""
+"\n"
+"Argumenter som genkendes af gvim (Motif-version):\n"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (neXtaw version):\n"
+msgstr ""
+"\n"
+"Argumenter som genkendes af gvim (neXtaw-version):\n"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (Athena version):\n"
+msgstr ""
+"\n"
+"Argumenter som genkendes af gvim (Athena-version):\n"
+
+msgid "-display <display>\tRun vim on <display>"
+msgstr "-display <display>\tKรธr vim pรฅ <display>"
+
+msgid "-iconic\t\tStart vim iconified"
+msgstr "-iconic\t\tStart vim som ikon"
+
+msgid "-background <color>\tUse <color> for the background (also: -bg)"
+msgstr "-background <farve>\tBrug <farve> til baggrunden (ogsรฅ: -bg)"
+
+msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
+msgstr "-foreground <farve>\tBrug <farve> til normal tekst (ogsรฅ: -fg)"
+
+msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
+msgstr "-font <skrifttype>\tBrug <skrifttype> til normal tekst (ogsรฅ: -fn)"
+
+msgid "-boldfont <font>\tUse <font> for bold text"
+msgstr "-boldfont <skrifttype>\tBrug <skrifttype> til fed tekst"
+
+msgid "-italicfont <font>\tUse <font> for italic text"
+msgstr "-italicfont <skriftt.>\tBrug <skrifttype> til kursiv tekst"
+
+msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
+msgstr "-geometry <geom>\tBrug <geom> for indledende geometri (ogsรฅ: -geom)"
+
+msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
+msgstr "-borderwidth <bredde>\tBrug en kantbredde pรฅ <bredde> (ogsรฅ: -bw)"
+
+msgid "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
+msgstr ""
+"-scrollbarwidth <bredde> Brug en rullebjรฆlkebredde pรฅ <bredde> (ogsรฅ: -sw)"
+
+msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
+msgstr "-menuheight <hรธjde>\tBrug en menulinjehรธjde pรฅ <hรธjde> (ogsรฅ: -mh)"
+
+msgid "-reverse\t\tUse reverse video (also: -rv)"
+msgstr "-reverse\t\tBrug omvendt grafik (ogsรฅ: -rv)"
+
+msgid "+reverse\t\tDon't use reverse video (also: +rv)"
+msgstr "+reverse\t\tBrug ikke omvendt grafik (ogsรฅ: +rv)"
+
+msgid "-xrm <resource>\tSet the specified resource"
+msgstr "-xrm <ressource>\tSรฆt den angivne ressource"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (GTK+ version):\n"
+msgstr ""
+"\n"
+"Argumenter genkendt af gvim (GTK+-version):\n"
+
+msgid "-display <display>\tRun vim on <display> (also: --display)"
+msgstr "-display <display>\tKรธr vim pรฅ <display> (ogsรฅ: --display)"
+
+msgid "--role <role>\tSet a unique role to identify the main window"
+msgstr "--role <rolle>\tSรฆt en unik rolle til at identificere hovedvinduet"
+
+msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
+msgstr "--socketid <xid>\tร…bn Vim i en anden GTK-widget"
+
+msgid "--echo-wid\t\tMake gvim echo the Window ID on stdout"
+msgstr "--echo-wid\t\tFรฅ gvim til at skrive vinduets ID til stdout"
+
+msgid "-P <parent title>\tOpen Vim inside parent application"
+msgstr "-P <forรฆldertitel>\tร…bn Vim i forรฆlderprogram"
+
+msgid "--windowid <HWND>\tOpen Vim inside another win32 widget"
+msgstr "--windowid <HWND>\tร…bn Vim i en anden win32-widget"
+
+msgid "No display"
+msgstr "Intet display"
+
+msgid ": Send failed.\n"
+msgstr ": Sending mislykkedes.\n"
+
+msgid ": Send failed. Trying to execute locally\n"
+msgstr ": Sending mislykkedes. Prรธver at udfรธre lokalt\n"
+
+#, c-format
+msgid "%d of %d edited"
+msgstr "%d af %d redigeret"
+
+msgid "No display: Send expression failed.\n"
+msgstr "Intet display: Send-udtryk mislykkedes.\n"
+
+msgid ": Send expression failed.\n"
+msgstr ": Send-udtryk mislykkedes.\n"
+
+msgid "No marks set"
+msgstr "Ingen mรฆrker sat"
+
+#, c-format
+msgid "E283: No marks matching \"%s\""
+msgstr "E283: Ingen mรฆrker matcher \"%s\""
+
+msgid ""
+"\n"
+"mark line col file/text"
+msgstr ""
+"\n"
+"mรฆrke linje kol fil/tekst"
+
+msgid ""
+"\n"
+" jump line col file/text"
+msgstr ""
+"\n"
+" hop linje kol fil/tekst"
+
+msgid ""
+"\n"
+"change line col text"
+msgstr ""
+"\n"
+"skift linje kol tekst"
+
+msgid ""
+"\n"
+"# File marks:\n"
+msgstr ""
+"\n"
+"# Filmรฆrker:\n"
+
+msgid ""
+"\n"
+"# Jumplist (newest first):\n"
+msgstr ""
+"\n"
+"# Hopliste (nyeste fรธrst):\n"
+
+msgid ""
+"\n"
+"# History of marks within files (newest to oldest):\n"
+msgstr ""
+"\n"
+"# Historik over mรฆrker i filer (nyeste til รฆldste):\n"
+
+msgid "Missing '>'"
+msgstr "Manglende '>'"
+
+msgid "E543: Not a valid codepage"
+msgstr "E543: Ikke en gyldig tegnkodningstabel"
+
+msgid "E284: Cannot set IC values"
+msgstr "E284: Kan ikke sรฆtte IC-vรฆrdier"
+
+msgid "E285: Failed to create input context"
+msgstr "E285: Kunne ikke oprette inputkontekst"
+
+msgid "E286: Failed to open input method"
+msgstr "E286: Kunne ikke รฅbne inputmetode"
+
+msgid "E287: Warning: Could not set destroy callback to IM"
+msgstr "E287: Advarsel: Kunne ikke sรฆtte destroy callback til IM"
+
+msgid "E288: input method doesn't support any style"
+msgstr "E288: inputmetode understรธtter ikke nogen stil"
+
+msgid "E289: input method doesn't support my preedit type"
+msgstr "E289: inputmetode understรธtter ikke min preedit-type"
+
+msgid "E293: block was not locked"
+msgstr "E293: blok blev ikke lรฅst"
+
+msgid "E294: Seek error in swap file read"
+msgstr "E294: Sรธgefejl ved lรฆsning af swap-fil"
+
+msgid "E295: Read error in swap file"
+msgstr "E295: Lรฆsefejl i swap-fil"
+
+msgid "E296: Seek error in swap file write"
+msgstr "E296: Sรธgefejl ved skrivning af swap-fil"
+
+msgid "E297: Write error in swap file"
+msgstr "E297: Skrivefejl i swap-fil"
+
+msgid "E300: Swap file already exists (symlink attack?)"
+msgstr "E300: Swap-filen findes allerede (symlink angreb?)"
+
+msgid "E298: Didn't get block nr 0?"
+msgstr "E298: Blev blok nr. 0 ikke hentet?"
+
+msgid "E298: Didn't get block nr 1?"
+msgstr "E298: Blev blok nr. 1 ikke hentet?"
+
+msgid "E298: Didn't get block nr 2?"
+msgstr "E298: Blev blok nr. 2 ikke hentet?"
+
+msgid "E843: Error while updating swap file crypt"
+msgstr "E843: Fejl ved opdatering af crypt for swap-fil"
+
+msgid "E301: Oops, lost the swap file!!!"
+msgstr "E301: Ups, mistede swap-filen!!!"
+
+msgid "E302: Could not rename swap file"
+msgstr "E302: Kunne ikke omdรธbe swap-fil"
+
+#, c-format
+msgid "E303: Unable to open swap file for \"%s\", recovery impossible"
+msgstr "E303: Kan ikke รฅbne swap-filen for \"%s\", gendannelse er ikke muligt"
+
+msgid "E304: ml_upd_block0(): Didn't get block 0??"
+msgstr "E304: ml_upd_block0(): Blev blok 0 ikke hentet??"
+
+#, c-format
+msgid "E305: No swap file found for %s"
+msgstr "E305: Fandt ingen swap-fil for %s"
+
+msgid "Enter number of swap file to use (0 to quit): "
+msgstr "Indtast antal swap-filer som der skal bruges (0 for at afslutte): "
+
+#, c-format
+msgid "E306: Cannot open %s"
+msgstr "E306: Kan ikke รฅbne %s"
+
+msgid "Unable to read block 0 from "
+msgstr "Kan ikke lรฆse blok 0 fra "
+
+msgid ""
+"\n"
+"Maybe no changes were made or Vim did not update the swap file."
+msgstr ""
+"\n"
+"Mรฅske er der ikke foretaget nogen รฆndringer eller Vim opdaterede ikke swap-"
+"filen."
+
+msgid " cannot be used with this version of Vim.\n"
+msgstr " kan ikke bruges med denne version af Vim.\n"
+
+msgid "Use Vim version 3.0.\n"
+msgstr "Brug Vim version 3.0.\n"
+
+#, c-format
+msgid "E307: %s does not look like a Vim swap file"
+msgstr "E307: %s ligner ikke en Vim swap-fil"
+
+msgid " cannot be used on this computer.\n"
+msgstr " kan ikke bruges pรฅ denne computer.\n"
+
+msgid "The file was created on "
+msgstr "Filen blev oprettet pรฅ "
+
+msgid ""
+",\n"
+"or the file has been damaged."
+msgstr ""
+",\n"
+"eller filen er beskadiget."
+
+#, c-format
+msgid ""
+"E833: %s is encrypted and this version of Vim does not support encryption"
+msgstr ""
+"E833: %s er krypteret og denne version af Vim understรธtter ikke kryptering"
+
+msgid " has been damaged (page size is smaller than minimum value).\n"
+msgstr " er beskadiget (sidestรธrrelsen er mindre end minimumsvรฆrdien).\n"
+
+#, c-format
+msgid "Using swap file \"%s\""
+msgstr "Bruger swap-filen \"%s\""
+
+#, c-format
+msgid "Original file \"%s\""
+msgstr "Den originale fil \"%s\""
+
+msgid "E308: Warning: Original file may have been changed"
+msgstr "E308: Advarsel: Den originale fil kan vรฆre รฆndret"
+
+#, c-format
+msgid "Swap file is encrypted: \"%s\""
+msgstr "Swap-filen er krypteret: \"%s\""
+
+msgid ""
+"\n"
+"If you entered a new crypt key but did not write the text file,"
+msgstr ""
+"\n"
+"Hvis du indtastede en ny crypt-nรธgle men ikke skrev tekstfilen,"
+
+msgid ""
+"\n"
+"enter the new crypt key."
+msgstr ""
+"\n"
+"sรฅ indtast den nye crypt-nรธgle."
+
+msgid ""
+"\n"
+"If you wrote the text file after changing the crypt key press enter"
+msgstr ""
+"\n"
+"Hvis du skrev tekstfilen efter crypt-nรธglen blev รฆndret, sรฅ tryk pรฅ enter"
+
+msgid ""
+"\n"
+"to use the same key for text file and swap file"
+msgstr ""
+"\n"
+"for at bruge den samme nรธgle til tekstfilen og swap-filen"
+
+#, c-format
+msgid "E309: Unable to read block 1 from %s"
+msgstr "E309: Kan ikke lรฆse blok 1 fra %s"
+
+msgid "???MANY LINES MISSING"
+msgstr "???MANGE LINJER MANGLER"
+
+msgid "???LINE COUNT WRONG"
+msgstr "???LINJEANTAL FORKERT"
+
+msgid "???EMPTY BLOCK"
+msgstr "???TOM BLOK"
+
+msgid "???LINES MISSING"
+msgstr "???LINJER MANGLER"
+
+#, c-format
+msgid "E310: Block 1 ID wrong (%s not a .swp file?)"
+msgstr "E310: Forkert ID for blok 1 (%s ikke en .swp-fil?)"
+
+msgid "???BLOCK MISSING"
+msgstr "???BLOK MANGLER"
+
+msgid "??? from here until ???END lines may be messed up"
+msgstr "??? herfra indtil ???SLUT kan linjer vรฆre rodet"
+
+msgid "??? from here until ???END lines may have been inserted/deleted"
+msgstr "??? herfra indtil ???SLUT kan linjer vรฆre indsat/slettet"
+
+msgid "???END"
+msgstr "???SLUT"
+
+msgid "E311: Recovery Interrupted"
+msgstr "E311: Gendannelse afbrudt"
+
+msgid ""
+"E312: Errors detected while recovering; look for lines starting with ???"
+msgstr ""
+"E312: Fejl registreret ved gendannelse; kig efter linjer som begynder med "
+"???"
+
+msgid "See \":help E312\" for more information."
+msgstr "Se \":help E312\" for mere information."
+
+msgid "Recovery completed. You should check if everything is OK."
+msgstr "Gendannelse gennemfรธrt. Du bรธr tjekke om alt er OK."
+
+msgid ""
+"\n"
+"(You might want to write out this file under another name\n"
+msgstr ""
+"\n"
+"(Det kan vรฆre du vil skrive filen under et andet navn\n"
+
+msgid "and run diff with the original file to check for changes)"
+msgstr "og kรธr diff men den originale fil for at tjekke for รฆndringer)"
+
+msgid "Recovery completed. Buffer contents equals file contents."
+msgstr ""
+"Gendannelse gennemfรธrt. Bufferens indhold er det samme som filens indhold."
+
+msgid ""
+"\n"
+"You may want to delete the .swp file now.\n"
+"\n"
+msgstr ""
+"\n"
+"Det kan vรฆre du vil slette .swp-filen nu.\n"
+"\n"
+
+msgid "Using crypt key from swap file for the text file.\n"
+msgstr "Bruger crypt-nรธglen fra swap-filen til tekstfilen.\n"
+
+msgid "Swap files found:"
+msgstr "Swap-filer fundet:"
+
+msgid " In current directory:\n"
+msgstr " I nuvรฆrende mappe:\n"
+
+msgid " Using specified name:\n"
+msgstr " Bruger angivne navn:\n"
+
+msgid " In directory "
+msgstr " I mappe "
+
+msgid " -- none --\n"
+msgstr " -- ingen --\n"
+
+msgid " owned by: "
+msgstr " ejet af: "
+
+msgid " dated: "
+msgstr " dateret: "
+
+msgid " dated: "
+msgstr " dateret: "
+
+msgid " [from Vim version 3.0]"
+msgstr " [fra Vim version 3.0]"
+
+msgid " [does not look like a Vim swap file]"
+msgstr " [ligner ikke en Vim swap-fil]"
+
+msgid " file name: "
+msgstr " filnavn: "
+
+msgid ""
+"\n"
+" modified: "
+msgstr ""
+"\n"
+" รฆndret: "
+
+msgid "YES"
+msgstr "JA"
+
+msgid "no"
+msgstr "nej"
+
+msgid ""
+"\n"
+" user name: "
+msgstr ""
+"\n"
+" brugernavn: "
+
+msgid " host name: "
+msgstr " vรฆrtsnavn: "
+
+msgid ""
+"\n"
+" host name: "
+msgstr ""
+"\n"
+" vรฆrtsnavn: "
+
+msgid ""
+"\n"
+" process ID: "
+msgstr ""
+"\n"
+" proces-ID: "
+
+msgid " (still running)"
+msgstr " (kรธrer stadig)"
+
+msgid ""
+"\n"
+" [not usable with this version of Vim]"
+msgstr ""
+"\n"
+" [ikke anvendelig med denne version af Vim]"
+
+msgid ""
+"\n"
+" [not usable on this computer]"
+msgstr ""
+"\n"
+" [ikke anvendelig pรฅ denne computer]"
+
+msgid " [cannot be read]"
+msgstr " [kan ikke lรฆses]"
+
+msgid " [cannot be opened]"
+msgstr " [kan ikke รฅbnes]"
+
+msgid "E313: Cannot preserve, there is no swap file"
+msgstr "E313: Kan ikke bevares, der er ikke nogen swap-fil"
+
+msgid "File preserved"
+msgstr "Fil bevaret"
+
+msgid "E314: Preserve failed"
+msgstr "E314: Bevaring mislykkedes"
+
+#, c-format
+msgid "E315: ml_get: invalid lnum: %ld"
+msgstr "E315: ml_get: ugyldig lnum: %ld"
+
+#, c-format
+msgid "E316: ml_get: cannot find line %ld"
+msgstr "E316: ml_get: kan ikke finde linje %ld"
+
+msgid "E317: pointer block id wrong 3"
+msgstr "E317: forkert blok-id for pointer 3"
+
+msgid "stack_idx should be 0"
+msgstr "stack_idx skal vรฆre 0"
+
+msgid "E318: Updated too many blocks?"
+msgstr "E318: Opdaterede for mange blokke?"
+
+msgid "E317: pointer block id wrong 4"
+msgstr "E317: forkert blok-id for pointer 4"
+
+msgid "deleted block 1?"
+msgstr "slettede blok 1?"
+
+#, c-format
+msgid "E320: Cannot find line %ld"
+msgstr "E320: Kan ikke finde linje %ld"
+
+msgid "E317: pointer block id wrong"
+msgstr "E317: forkert blok-id for pointer"
+
+msgid "pe_line_count is zero"
+msgstr "pe_line_count er nul"
+
+#, c-format
+msgid "E322: line number out of range: %ld past the end"
+msgstr "E322: linjenummer udenfor omrรฅde: %ld efter slutningen"
+
+#, c-format
+msgid "E323: line count wrong in block %ld"
+msgstr "E323: linje antal forkert i blok %ld"
+
+msgid "Stack size increases"
+msgstr "Stakstรธrrelse รธges"
+
+msgid "E317: pointer block id wrong 2"
+msgstr "E317: forkert blok-id for pointer 2"
+
+#, c-format
+msgid "E773: Symlink loop for \"%s\""
+msgstr "E773: Symlink-lรธkke for \"%s\""
+
+msgid "E325: ATTENTION"
+msgstr "E325: OBS"
+
+msgid ""
+"\n"
+"Found a swap file by the name \""
+msgstr ""
+"\n"
+"Fandt en swap-fil ved navn \""
+
+msgid "While opening file \""
+msgstr "Ved รฅbning af filen \""
+
+msgid " NEWER than swap file!\n"
+msgstr " NYERE end swap-fil!\n"
+
+msgid ""
+"\n"
+"(1) Another program may be editing the same file. If this is the case,\n"
+" be careful not to end up with two different instances of the same\n"
+" file when making changes. Quit, or continue with caution.\n"
+msgstr ""
+"\n"
+"(1) Et andet program redigere muligvis den samme fil. Hvis det er tilfรฆldet,\n"
+" sรฅ pas pรฅ ikke at ende med to forskellige instanser af den samme\n"
+" fil nรฅr der foretages รฆndringer. Afslut, eller fortsรฆt med forsigtighed.\n"
+
+msgid "(2) An edit session for this file crashed.\n"
+msgstr "(2) En redigeringssession for filen holdt op med at virke.\n"
+
+msgid " If this is the case, use \":recover\" or \"vim -r "
+msgstr " Hvis det er tilfรฆldet, sรฅ brug \":recover\" eller \"vim -r "
+
+msgid ""
+"\"\n"
+" to recover the changes (see \":help recovery\").\n"
+msgstr ""
+"\"\n"
+" for at gendanne รฆndringerne (se \":help recovery\").\n"
+
+msgid " If you did this already, delete the swap file \""
+msgstr " Hvis du allerede har gjort det, sรฅ slet swap-filen \""
+
+msgid ""
+"\"\n"
+" to avoid this message.\n"
+msgstr ""
+"\"\n"
+" for at undgรฅ denne meddelelse.\n"
+
+msgid "Swap file \""
+msgstr "Swap-filen \""
+
+msgid "\" already exists!"
+msgstr "\" findes allerede!"
+
+msgid "VIM - ATTENTION"
+msgstr "VIM - OBS"
+
+msgid "Swap file already exists!"
+msgstr "Swap-filen findes allerede!"
+
+msgid ""
+"&Open Read-Only\n"
+"&Edit anyway\n"
+"&Recover\n"
+"&Quit\n"
+"&Abort"
+msgstr ""
+"&ร…bn skrivebeskyttet\n"
+"&Rediger alligevel\n"
+"&Gendan\n"
+"&Afslut\n"
+"&Afbryd"
+
+msgid ""
+"&Open Read-Only\n"
+"&Edit anyway\n"
+"&Recover\n"
+"&Delete it\n"
+"&Quit\n"
+"&Abort"
+msgstr ""
+"&ร…bn skrivebeskyttet\n"
+"&Rediger alligevel\n"
+"&Gendan\n"
+"&Slet den\n"
+"&Afslut\n"
+"&Afbryd"
+
+msgid "E326: Too many swap files found"
+msgstr "E326: For mange swap-filer fundet"
+
+msgid "E327: Part of menu-item path is not sub-menu"
+msgstr "E327: Del af sti til menupunkt er ikke undermenu"
+
+msgid "E328: Menu only exists in another mode"
+msgstr "E328: Menuen findes kun i en anden tilstand"
+
+#, c-format
+msgid "E329: No menu \"%s\""
+msgstr "E329: Ingen menu \"%s\""
+
+msgid "E792: Empty menu name"
+msgstr "E792: Tomt menunavn"
+
+msgid "E330: Menu path must not lead to a sub-menu"
+msgstr "E330: Menusti mรฅ ikke lede til en undermenu"
+
+msgid "E331: Must not add menu items directly to menu bar"
+msgstr "E331: Mรฅ ikke tilfรธje menupunkter direkte til menulinje"
+
+msgid "E332: Separator cannot be part of a menu path"
+msgstr "E332: Separator mรฅ ikke vรฆre del af en menusti"
+
+msgid ""
+"\n"
+"--- Menus ---"
+msgstr ""
+"\n"
+"--- Menuer ---"
+
+msgid "Tear off this menu"
+msgstr "Lรธsriv menuen"
+
+#, c-format
+msgid "E335: Menu not defined for %s mode"
+msgstr "E335: Menu ikke defineret for %s-tilstand"
+
+msgid "E333: Menu path must lead to a menu item"
+msgstr "E333: Menusti skal lede til et menupunkt"
+
+#, c-format
+msgid "E334: Menu not found: %s"
+msgstr "E334: Menu ikke fundet: %s"
+
+msgid "E336: Menu path must lead to a sub-menu"
+msgstr "E336: Menusti skal lede til en undermenu"
+
+msgid "E337: Menu not found - check menu names"
+msgstr "E337: Menu ikke fundet - tjek menunavne"
+
+#, c-format
+msgid "Error detected while processing %s:"
+msgstr "Fejl registreret ved behandling af %s:"
+
+#, c-format
+msgid "line %4ld:"
+msgstr "linje %4ld:"
+
+#, c-format
+msgid "E354: Invalid register name: '%s'"
+msgstr "E354: Ugyldigt registernavn: '%s'"
+
+msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
+msgstr "Oversรฆtter: scootergrisen"
+
+msgid "Interrupt: "
+msgstr "Afbryd: "
+
+msgid "Press ENTER or type command to continue"
+msgstr "Tryk pรฅ ENTER eller skriv kommando for at fortsรฆtte"
+
+#, c-format
+msgid "%s line %ld"
+msgstr "%s linje %ld"
+
+msgid "-- More --"
+msgstr "-- Mere --"
+
+msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "
+msgstr " MELLEMRUM/d/j: skรฆrm/side/linje ned, b/u/k: op, q: afslut "
+
+msgid "Question"
+msgstr "Spรธrgsmรฅl"
+
+msgid ""
+"&Yes\n"
+"&No"
+msgstr ""
+"&Ja\n"
+"&Nej"
+
+msgid ""
+"&Yes\n"
+"&No\n"
+"Save &All\n"
+"&Discard All\n"
+"&Cancel"
+msgstr ""
+"&Ja\n"
+"&Nej\n"
+"Gem &alle\n"
+"&Forkast alle\n"
+"&Annuller"
+
+msgid "Select Directory dialog"
+msgstr "Vรฆlg mappe-dialog"
+
+msgid "Save File dialog"
+msgstr "Gem fil-dialog"
+
+msgid "Open File dialog"
+msgstr "ร…bn fil-dialog"
+
+msgid "E338: Sorry, no file browser in console mode"
+msgstr "E338: Beklager, ingen filbrowser i konsol-tilstand"
+
+msgid "E766: Insufficient arguments for printf()"
+msgstr "E766: Ikke nok argumenter for printf()"
+
+msgid "E807: Expected Float argument for printf()"
+msgstr "E807: Ventede flydende kommatal-argument for printf()"
+
+msgid "E767: Too many arguments to printf()"
+msgstr "E767: For mange argumenter til printf()"
+
+msgid "W10: Warning: Changing a readonly file"
+msgstr "W10: Advarsel: ร†ndre en skrivebeskyttet fil"
+
+msgid "Type number and <Enter> or click with mouse (empty cancels): "
+msgstr "Skriv nummer og <Enter> eller klik med musen (tom annullerer): "
+
+msgid "Type number and <Enter> (empty cancels): "
+msgstr "Skriv nummer og <Enter> (tom annullerer): "
+
+msgid "1 more line"
+msgstr "1 linje mere"
+
+msgid "1 line less"
+msgstr "1 linje mindre"
+
+#, c-format
+msgid "%ld more lines"
+msgstr "%ld linjer mere"
+
+#, c-format
+msgid "%ld fewer lines"
+msgstr "%ld linjere mindre"
+
+msgid " (Interrupted)"
+msgstr " (Afbrudt)"
+
+msgid "Beep!"
+msgstr "Bip!"
+
+msgid "ERROR: "
+msgstr "FEJL: "
+
+#, c-format
+msgid ""
+"\n"
+"[bytes] total alloc-freed %lu-%lu, in use %lu, peak use %lu\n"
+msgstr ""
+"\n"
+"[byte] samlet allok-frigivet %lu-%lu, i brug %lu, spidspunktsbrug %lu\n"
+
+#, c-format
+msgid ""
+"[calls] total re/malloc()'s %lu, total free()'s %lu\n"
+"\n"
+msgstr ""
+"[kald] samlet re/malloc()'er %lu, samlet free()'er %lu\n"
+"\n"
+
+msgid "E340: Line is becoming too long"
+msgstr "E340: Linje er ved at blive for lang"
+
+#, c-format
+msgid "E341: Internal error: lalloc(%ld, )"
+msgstr "E341: Intern fejl: lalloc(%ld, )"
+
+#, c-format
+msgid "E342: Out of memory! (allocating %lu bytes)"
+msgstr "E342: Ikke mere ledig hukommelse! (allokerer %lu byte)"
+
+#, c-format
+msgid "Calling shell to execute: \"%s\""
+msgstr "Kalder skal til udfรธrelse af: \"%s\""
+
+msgid "E545: Missing colon"
+msgstr "E545: Manglende kolon"
+
+msgid "E546: Illegal mode"
+msgstr "E546: Ulovlig tilstand"
+
+msgid "E547: Illegal mouseshape"
+msgstr "E547: Ulovlig museform"
+
+msgid "E548: digit expected"
+msgstr "E548: ciffer ventet"
+
+msgid "E549: Illegal percentage"
+msgstr "E549: Ulovlig procent"
+
+msgid "E854: path too long for completion"
+msgstr "E854: sti for lang til fuldfรธrelse"
+
+#, c-format
+msgid ""
+"E343: Invalid path: '**[number]' must be at the end of the path or be "
+"followed by '%s'."
+msgstr ""
+"E343: Ugyldig sti: '**[nummer]' skal vรฆre i slutningen af stien eller "
+"efterfรธlges af '%s'."
+
+#, c-format
+msgid "E344: Can't find directory \"%s\" in cdpath"
+msgstr "E344: Kan ikke finde mappen \"%s\" i cdpath"
+
+#, c-format
+msgid "E345: Can't find file \"%s\" in path"
+msgstr "E345: Kan ikke finde filen \"%s\" i path"
+
+#, c-format
+msgid "E346: No more directory \"%s\" found in cdpath"
+msgstr "E346: Ikke flere mappe \"%s\" fundet i cdpath"
+
+#, c-format
+msgid "E347: No more file \"%s\" found in path"
+msgstr "E347: Ikke flere fil \"%s\" fundet i path"
+
+#, c-format
+msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
+msgstr "E668: Forkert adgangstilstand for NetBeans-forbindelsens info-fil: \"%s\""
+
+#, c-format
+msgid "E658: NetBeans connection lost for buffer %ld"
+msgstr "E658: NetBeans-forbindelse mistet for buffer %ld"
+
+msgid "E838: netbeans is not supported with this GUI"
+msgstr "E838: netbeans understรธttes ikke med denne GUI"
+
+msgid "E511: netbeans already connected"
+msgstr "E511: netbeans allerede forbundet"
+
+#, c-format
+msgid "E505: %s is read-only (add ! to override)"
+msgstr "E505: %s er skrivebeskyttet (tilfรธj ! for at tilsidesรฆtte)"
+
+msgid "E349: No identifier under cursor"
+msgstr "E349: Ingen identifikator under markรธr"
+
+msgid "E774: 'operatorfunc' is empty"
+msgstr "E774: 'operatorfunc' er tom"
+
+msgid "E775: Eval feature not available"
+msgstr "E775: Eval-funktionalitet ikke tilgรฆngelig"
+
+msgid "Warning: terminal cannot highlight"
+msgstr "Advarsel: terminal kan ikke fremhรฆve"
+
+msgid "E348: No string under cursor"
+msgstr "E348: Ingen streng under markรธr"
+
+msgid "E352: Cannot erase folds with current 'foldmethod'"
+msgstr "E352: Kan ikke slette sammenfoldninger med nuvรฆrende 'foldmethod'"
+
+msgid "E664: changelist is empty"
+msgstr "E664: รฆndringsliste er tom"
+
+msgid "E662: At start of changelist"
+msgstr "E662: Ved begyndelsen af รฆndringsliste"
+
+msgid "E663: At end of changelist"
+msgstr "E663: Ved slutningen af รฆndringsliste"
+
+msgid "Type :qa! and press <Enter> to abandon all changes and exit Vim"
+msgstr ""
+"Skriv :qa! og tryk pรฅ <Enter> for at droppe alle รฆndringer og afslut Vim"
+
+#, c-format
+msgid "1 line %sed 1 time"
+msgstr "1 linje %sed 1 gang"
+
+#, c-format
+msgid "1 line %sed %d times"
+msgstr "1 linje %sed %d gange"
+
+#, c-format
+msgid "%ld lines %sed 1 time"
+msgstr "%ld linjer %sed 1 gang"
+
+#, c-format
+msgid "%ld lines %sed %d times"
+msgstr "%ld linjer %sed %d gange"
+
+#, c-format
+msgid "%ld lines to indent... "
+msgstr "%ld linjer at indrykke... "
+
+msgid "1 line indented "
+msgstr "1 linje indrykket "
+
+#, c-format
+msgid "%ld lines indented "
+msgstr "%ld linjer indrykket "
+
+msgid "E748: No previously used register"
+msgstr "E748: Intet tidligere brugt register"
+
+msgid "cannot yank; delete anyway"
+msgstr "kan ikke rykke; slet alligevel"
+
+msgid "1 line changed"
+msgstr "1 linje รฆndret"
+
+#, c-format
+msgid "%ld lines changed"
+msgstr "%ld linjer รฆndret"
+
+#, c-format
+msgid "freeing %ld lines"
+msgstr "frigรธr %ld linjer"
+
+#, c-format
+msgid " into \"%c"
+msgstr " i \"%c"
+
+#, c-format
+msgid "block of 1 line yanked%s"
+msgstr "blok pรฅ 1 linje rykket%s"
+
+#, c-format
+msgid "1 line yanked%s"
+msgstr "1 linje rykket%s"
+
+#, c-format
+msgid "block of %ld lines yanked%s"
+msgstr "blok pรฅ %ld linjer rykket%s"
+
+#, c-format
+msgid "%ld lines yanked%s"
+msgstr "%ld linjer rykket%s"
+
+#, c-format
+msgid "E353: Nothing in register %s"
+msgstr "E353: Intet i register %s"
+
+msgid ""
+"\n"
+"--- Registers ---"
+msgstr ""
+"\n"
+"--- Registre ---"
+
+msgid "Illegal register name"
+msgstr "Ulovligt registernavn"
+
+msgid ""
+"\n"
+"# Registers:\n"
+msgstr ""
+"\n"
+"# Registre:\n"
+
+#, c-format
+msgid "E574: Unknown register type %d"
+msgstr "E574: Ukendt registertype %d"
+
+msgid ""
+"E883: search pattern and expression register may not contain two or more "
+"lines"
+msgstr ""
+"E883: sรธgemรธnster og udtryksregister mรฅ ikke indeholde to eller flere linjer"
+
+#, c-format
+msgid "%ld Cols; "
+msgstr "%ld kolonner; "
+
+#, c-format
+msgid "Selected %s%ld of %ld Lines; %lld of %lld Words; %lld of %lld Bytes"
+msgstr "Markerede %s%ld af %ld linje; %lld af %lld ord; %lld af %lld byte"
+
+#, c-format
+msgid ""
+"Selected %s%ld of %ld Lines; %lld of %lld Words; %lld of %lld Chars; %lld of "
+"%lld Bytes"
+msgstr ""
+"Markerede %s%ld af %ld linje; %lld af %lld ord; %lld af %lld tegn; %lld af %"
+"lld byte"
+
+#, c-format
+msgid "Col %s of %s; Line %ld of %ld; Word %lld of %lld; Byte %lld of %lld"
+msgstr "Kol %s af %s; Linje %ld af %ld; Ord %lld af %lld; Byte %lld af %lld"
+
+#, c-format
+msgid ""
+"Col %s of %s; Line %ld of %ld; Word %lld of %lld; Char %lld of %lld; Byte "
+"%lld of %lld"
+msgstr ""
+"Kol %s af %s; Linje %ld af %ld; Ord %lld af %lld; Tegn %lld af %lld; Byte %"
+"lld af %lld"
+
+#, c-format
+msgid "(+%lld for BOM)"
+msgstr "(+%lld for BOM)"
+
+msgid "Thanks for flying Vim"
+msgstr "Tak fordi du flรธj med Vim"
+
+msgid "E518: Unknown option"
+msgstr "E518: Ukendt tilvalg"
+
+msgid "E519: Option not supported"
+msgstr "E519: Tilvalg understรธttes ikke"
+
+msgid "E520: Not allowed in a modeline"
+msgstr "E520: Ikke tilladt pรฅ en tilstandslinje"
+
+msgid "E846: Key code not set"
+msgstr "E846: Tastekode ikke sat"
+
+msgid "E521: Number required after ="
+msgstr "E521: Nummer krรฆves efter ="
+
+msgid "E522: Not found in termcap"
+msgstr "E522: Ikke fundet i termcap"
+
+#, c-format
+msgid "E539: Illegal character <%s>"
+msgstr "E539: Ulovligt tegn <%s>"
+
+#, c-format
+msgid "For option %s"
+msgstr "For tilvalget %s"
+
+msgid "E529: Cannot set 'term' to empty string"
+msgstr "E529: Kan ikke sรฆtte 'term' til tom streng"
+
+msgid "E530: Cannot change term in GUI"
+msgstr "E530: Kan ikke skifte term i GUI"
+
+msgid "E531: Use \":gui\" to start the GUI"
+msgstr "E531: Brug \":gui\" til at starte GUI'en"
+
+msgid "E589: 'backupext' and 'patchmode' are equal"
+msgstr "E589: 'backupext' og 'patchmode' er ens"
+
+msgid "E834: Conflicts with value of 'listchars'"
+msgstr "E834: Er i konflikt med vรฆrdien af 'listchars'"
+
+msgid "E835: Conflicts with value of 'fillchars'"
+msgstr "E835: Er i konflikt med vรฆrdien af 'fillchars'"
+
+msgid "E617: Cannot be changed in the GTK+ 2 GUI"
+msgstr "E617: Kan ikke รฆndres i GTK+ 2 GUI'en"
+
+#, c-format
+msgid "E950: Cannot convert between %s and %s"
+msgstr "E950: Kan ikke konvertere mellem %s og %s"
+
+msgid "E524: Missing colon"
+msgstr "E524: Manglende kolon"
+
+msgid "E525: Zero length string"
+msgstr "E525: Streng uden lรฆngde"
+
+#, c-format
+msgid "E526: Missing number after <%s>"
+msgstr "E526: Manglende nummer efter <%s>"
+
+msgid "E527: Missing comma"
+msgstr "E527: Manglende komma"
+
+msgid "E528: Must specify a ' value"
+msgstr "E528: Skal angive en '-vรฆrdi"
+
+msgid "E595: contains unprintable or wide character"
+msgstr "E595: indeholder tegn som ikke kan udskrives eller er bredt"
+
+msgid "E596: Invalid font(s)"
+msgstr "E596: Ugyldig skrifttype(r)"
+
+msgid "E597: can't select fontset"
+msgstr "E597: kan ikke vรฆlge skrifttypesรฆt"
+
+msgid "E598: Invalid fontset"
+msgstr "E598: Ugyldigt skrifttypesรฆt"
+
+msgid "E533: can't select wide font"
+msgstr "E533: kan ikke vรฆlge bred skrifttype"
+
+msgid "E534: Invalid wide font"
+msgstr "E534: Ugyldig bred skrifttype"
+
+#, c-format
+msgid "E535: Illegal character after <%c>"
+msgstr "E535: Ulovligt tegn efter <%c>"
+
+msgid "E536: comma required"
+msgstr "E536: komma krรฆves"
+
+#, c-format
+msgid "E537: 'commentstring' must be empty or contain %s"
+msgstr "E537: 'commentstring' skal vรฆre tom eller indeholde %s"
+
+msgid "E538: No mouse support"
+msgstr "E538: Ingen understรธttelse af mus"
+
+msgid "E540: Unclosed expression sequence"
+msgstr "E540: Ulukket udtryk-sekvens"
+
+msgid "E541: too many items"
+msgstr "E541: for mange punkter"
+
+msgid "E542: unbalanced groups"
+msgstr "E542: ubalancerede grupper"
+
+msgid "E946: Cannot make a terminal with running job modifiable"
+msgstr "E946: Kan ikke gรธre en terminal med kรธrende job รฆndringsbar"
+
+msgid "E590: A preview window already exists"
+msgstr "E590: Der findes allerede et forhรฅndsvisningsvindue"
+
+msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'"
+msgstr "W17: Arabisk krรฆver UTF-8, brug ':set encoding=utf-8'"
+
+msgid "E954: 24-bit colors are not supported on this environment"
+msgstr "E954: 24-bit farver understรธttes ikke i dette miljรธ"
+
+#, c-format
+msgid "E593: Need at least %d lines"
+msgstr "E593: Skal vรฆre mindst %d linjer"
+
+#, c-format
+msgid "E594: Need at least %d columns"
+msgstr "E594: Skal vรฆre mindst %d kolonner"
+
+#, c-format
+msgid "E355: Unknown option: %s"
+msgstr "E355: Ukendt tilvalg: %s"
+
+#, c-format
+msgid "E521: Number required: &%s = '%s'"
+msgstr "E521: Nummer krรฆves: &%s = '%s'"
+
+msgid ""
+"\n"
+"--- Terminal codes ---"
+msgstr ""
+"\n"
+"--- Terminal-koder ---"
+
+msgid ""
+"\n"
+"--- Global option values ---"
+msgstr ""
+"\n"
+"--- Vรฆrdier for globale tilvalg ---"
+
+msgid ""
+"\n"
+"--- Local option values ---"
+msgstr ""
+"\n"
+"--- Vรฆrdier for lokale tilvalg ---"
+
+msgid ""
+"\n"
+"--- Options ---"
+msgstr ""
+"\n"
+"--- Tilvalg ---"
+
+msgid "E356: get_varp ERROR"
+msgstr "E356: Fejl ved get_varp"
+
+#, c-format
+msgid "E357: 'langmap': Matching character missing for %s"
+msgstr "E357: 'langmap': Matchende tegn mangler for %s"
+
+#, c-format
+msgid "E358: 'langmap': Extra characters after semicolon: %s"
+msgstr "E358: 'langmap': Ekstra tegn efter semikolon: %s"
+
+msgid "cannot open "
+msgstr "kan ikke รฅbne "
+
+msgid "VIM: Can't open window!\n"
+msgstr "VIM: Kan ikke รฅbne vindue!\n"
+
+msgid "Need Amigados version 2.04 or later\n"
+msgstr "Behรธver Amigados version 2.04 eller senere\n"
+
+#, c-format
+msgid "Need %s version %ld\n"
+msgstr "Behรธver %s version %ld\n"
+
+msgid "Cannot open NIL:\n"
+msgstr "Kan ikke รฅbne NIL:\n"
+
+msgid "Cannot create "
+msgstr "Kan ikke oprette "
+
+#, c-format
+msgid "Vim exiting with %d\n"
+msgstr "Vim afsluttede med %d\n"
+
+msgid "cannot change console mode ?!\n"
+msgstr "kan ikke skifte konsoltilstand ?!\n"
+
+msgid "mch_get_shellsize: not a console??\n"
+msgstr "mch_get_shellsize: ikke en konsol??\n"
+
+msgid "E360: Cannot execute shell with -f option"
+msgstr "E360: Kan ikke udfรธre skal med -f-tilvalget"
+
+msgid "Cannot execute "
+msgstr "Kan ikke udfรธre "
+
+msgid "shell "
+msgstr "skal "
+
+msgid " returned\n"
+msgstr " returnerede\n"
+
+msgid "ANCHOR_BUF_SIZE too small."
+msgstr "ANCHOR_BUF_SIZE for lille."
+
+msgid "I/O ERROR"
+msgstr "FEJL VED I/O"
+
+msgid "Message"
+msgstr "Meddelelse"
+
+msgid "E237: Printer selection failed"
+msgstr "E237: Valg af printer mislykkedes"
+
+#, c-format
+msgid "to %s on %s"
+msgstr "til %s pรฅ %s"
+
+#, c-format
+msgid "E613: Unknown printer font: %s"
+msgstr "E613: Ukendt skrifttype til printer: %s"
+
+#, c-format
+msgid "E238: Print error: %s"
+msgstr "E238: Fejl ved udskrivning: %s"
+
+#, c-format
+msgid "Printing '%s'"
+msgstr "Udskriver '%s'"
+
+#, c-format
+msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
+msgstr "E244: Ulovligt tegnsรฆtnavn \"%s\" i skrifttypenavnet \"%s\""
+
+#, c-format
+msgid "E244: Illegal quality name \"%s\" in font name \"%s\""
+msgstr "E244: Ulovligt kvalitetsnavn \"%s\" i skrifttypenavnet \"%s\""
+
+#, c-format
+msgid "E245: Illegal char '%c' in font name \"%s\""
+msgstr "E245: Ulovligt tegn '%c' i skrifttypenavnet \"%s\""
+
+#, c-format
+msgid "Opening the X display took %ld msec"
+msgstr "ร…bningen af X-displayet tog %ld ms"
+
+msgid ""
+"\n"
+"Vim: Got X error\n"
+msgstr ""
+"\n"
+"Vim: Fik fejl ved X\n"
+
+msgid "Testing the X display failed"
+msgstr "Test af X-displayet mislykkedes"
+
+msgid "Opening the X display timed out"
+msgstr "ร…bningen af X-displayet fik timeout"
+
+msgid ""
+"\n"
+"Could not get security context for "
+msgstr ""
+"\n"
+"Kunne ikke hente sikkerhedskontekst for "
+
+msgid ""
+"\n"
+"Could not set security context for "
+msgstr ""
+"\n"
+"Kunne ikke sรฆtte sikkerhedskontekst for "
+
+#, c-format
+msgid "Could not set security context %s for %s"
+msgstr "Kunne ikke sรฆtte sikkerhedskonteksten %s for %s"
+
+#, c-format
+msgid "Could not get security context %s for %s. Removing it!"
+msgstr "Kunne ikke hente sikkerhedskonteksten %s for %s. Fjerner den!"
+
+msgid ""
+"\n"
+"Cannot execute shell sh\n"
+msgstr ""
+"\n"
+"Kan ikke udfรธre skallen sh\n"
+
+msgid ""
+"\n"
+"shell returned "
+msgstr ""
+"\n"
+"skal returnerede "
+
+msgid ""
+"\n"
+"Cannot create pipes\n"
+msgstr ""
+"\n"
+"Kan ikke oprette pipes\n"
+
+msgid ""
+"\n"
+"Cannot fork\n"
+msgstr ""
+"\n"
+"Kan ikke fork\n"
+
+msgid ""
+"\n"
+"Cannot execute shell "
+msgstr ""
+"\n"
+"Kan ikke udfรธre skallen "
+
+msgid ""
+"\n"
+"Command terminated\n"
+msgstr ""
+"\n"
+"Kommando termineret\n"
+
+msgid "XSMP lost ICE connection"
+msgstr "XSMP mistede ICE-forbindelse"
+
+#, c-format
+msgid "dlerror = \"%s\""
+msgstr "dlerror = \"%s\""
+
+msgid "Opening the X display failed"
+msgstr "ร…bningen af X-displayet mislykkedes"
+
+msgid "XSMP handling save-yourself request"
+msgstr "XSMP-hรฅndtering save-yourself-anmodning"
+
+msgid "XSMP opening connection"
+msgstr "XSMP รฅbner forbindelse"
+
+msgid "XSMP ICE connection watch failed"
+msgstr "XSMP ICE-forbindelse watch mislykkedes"
+
+#, c-format
+msgid "XSMP SmcOpenConnection failed: %s"
+msgstr "XSMP SmcOpenConnection mislykkedes: %s"
+
+msgid "At line"
+msgstr "Pรฅ linje"
+
+msgid "Could not load vim32.dll!"
+msgstr "Kunne ikke indlรฆse vim32.dll!"
+
+msgid "VIM Error"
+msgstr "Fejl ved VIM"
+
+msgid "Could not fix up function pointers to the DLL!"
+msgstr "Kunne ikke rette op pรฅ funktion-pointere til DLL'en!"
+
+#, c-format
+msgid "Vim: Caught %s event\n"
+msgstr "Vim: Fangede %s-hรฆndelse\n"
+
+msgid "close"
+msgstr "luk"
+
+msgid "logoff"
+msgstr "log ud"
+
+msgid "shutdown"
+msgstr "luk ned"
+
+msgid "E371: Command not found"
+msgstr "E371: Kommando ikke fundet"
+
+msgid ""
+"VIMRUN.EXE not found in your $PATH.\n"
+"External commands will not pause after completion.\n"
+"See :help win32-vimrun for more information."
+msgstr ""
+"VIMRUN.EXE ikke fundet i din $PATH.\n"
+"Eksterne kommandoer sรฆttes ikke pรฅ pause efter fuldfรธrelse.\n"
+"Se :help win32-vimrun for mere information."
+
+msgid "Vim Warning"
+msgstr "Advarsel ved Vim"
+
+#, c-format
+msgid "shell returned %d"
+msgstr "skal returnerede %d"
+
+msgid "E926: Current location list was changed"
+msgstr "E926: Nuvรฆrende placeringsliste blev รฆndret"
+
+#, c-format
+msgid "E372: Too many %%%c in format string"
+msgstr "E372: For mange %%%c i formatet streng"
+
+#, c-format
+msgid "E373: Unexpected %%%c in format string"
+msgstr "E373: Uventet %%%c i formatet streng"
+
+msgid "E374: Missing ] in format string"
+msgstr "E374: Manglende ] i formatet streng"
+
+#, c-format
+msgid "E375: Unsupported %%%c in format string"
+msgstr "E375: Ikke-understรธttet %%%c i formatet streng"
+
+#, c-format
+msgid "E376: Invalid %%%c in format string prefix"
+msgstr "E376: Ugyldig %%%c i prรฆfiks for formatet streng"
+
+#, c-format
+msgid "E377: Invalid %%%c in format string"
+msgstr "E377: Ugyldig %%%c i formatet streng"
+
+msgid "E378: 'errorformat' contains no pattern"
+msgstr "E378: 'errorformat' indeholder ikke noget mรธnter"
+
+msgid "E379: Missing or empty directory name"
+msgstr "E379: Manglende eller tomt mappenavn"
+
+msgid "E553: No more items"
+msgstr "E553: Ikke flere punkter"
+
+msgid "E924: Current window was closed"
+msgstr "E924: Nuvรฆrende vindue blev lukket"
+
+msgid "E925: Current quickfix was changed"
+msgstr "E925: Nuvรฆrende quickfix blev รฆndret"
+
+#, c-format
+msgid "(%d of %d)%s%s: "
+msgstr "(%d af %d)%s%s: "
+
+msgid " (line deleted)"
+msgstr " (linje slettet)"
+
+#, c-format
+msgid "%serror list %d of %d; %d errors "
+msgstr "%sfejlliste %d af %d; %d fejl "
+
+msgid "E380: At bottom of quickfix stack"
+msgstr "E380: Nederst i quickfix-stakken"
+
+msgid "E381: At top of quickfix stack"
+msgstr "E381: ร˜verst i quickfix-stakken"
+
+msgid "No entries"
+msgstr "Ingen poster"
+
+msgid "Error file"
+msgstr "Fejlfil"
+
+msgid "E683: File name missing or invalid pattern"
+msgstr "E683: Filnavn mangler eller ugyldigt mรธnster"
+
+#, c-format
+msgid "Cannot open file \"%s\""
+msgstr "Kan ikke รฅbne filen \"%s\""
+
+msgid "E681: Buffer is not loaded"
+msgstr "E681: Buffer er ikke indlรฆst"
+
+msgid "E777: String or List expected"
+msgstr "E777: Streng eller liste ventet"
+
+#, c-format
+msgid "E369: invalid item in %s%%[]"
+msgstr "E369: ugyldigt punkt i %s%%[]"
+
+#, c-format
+msgid "E769: Missing ] after %s["
+msgstr "E769: Manglende ] efter %s["
+
+msgid "E944: Reverse range in character class"
+msgstr "E944: Baglรฆns omrรฅde i tegnklasse"
+
+msgid "E945: Range too large in character class"
+msgstr "E945: Omrรฅde for stort i tegnklasse"
+
+#, c-format
+msgid "E53: Unmatched %s%%("
+msgstr "E53: Ikke-matchet %s%%("
+
+#, c-format
+msgid "E54: Unmatched %s("
+msgstr "E54: Ikke-matchet %s("
+
+#, c-format
+msgid "E55: Unmatched %s)"
+msgstr "E55: Ikke-matchet %s)"
+
+msgid "E66: \\z( not allowed here"
+msgstr "E66: \\z( ikke tilladt her"
+
+msgid "E67: \\z1 et al. not allowed here"
+msgstr "E67: \\z1 og andre ikke tilladt her"
+
+#, c-format
+msgid "E69: Missing ] after %s%%["
+msgstr "E69: Manglende ] efter %s%%["
+
+#, c-format
+msgid "E70: Empty %s%%[]"
+msgstr "E70: Tom %s%%[]"
+
+msgid "E65: Illegal back reference"
+msgstr "E65: Ulovlig tilbage-reference"
+
+msgid "E339: Pattern too long"
+msgstr "E339: Mรธnster for langt"
+
+msgid "E50: Too many \\z("
+msgstr "E50: For mange \\z("
+
+#, c-format
+msgid "E51: Too many %s("
+msgstr "E51: For mange %s("
+
+msgid "E52: Unmatched \\z("
+msgstr "E52: Ikke-matchet \\z("
+
+#, c-format
+msgid "E59: invalid character after %s@"
+msgstr "E59: ugyldigt tegn efter %s@"
+
+#, c-format
+msgid "E60: Too many complex %s{...}s"
+msgstr "E60: For mange komplekse %s{...}s"
+
+#, c-format
+msgid "E61: Nested %s*"
+msgstr "E61: Indlejret %s*"
+
+#, c-format
+msgid "E62: Nested %s%c"
+msgstr "E62: Indlejret %s%c"
+
+msgid "E63: invalid use of \\_"
+msgstr "E63: ugyldig brug af \\_"
+
+#, c-format
+msgid "E64: %s%c follows nothing"
+msgstr "E64: %s%c efterfรธlger intet"
+
+msgid "E68: Invalid character after \\z"
+msgstr "E68: Ugyldigt tegn efter \\z"
+
+#, c-format
+msgid "E678: Invalid character after %s%%[dxouU]"
+msgstr "E678: Ugyldigt tegn efter %s%%[dxouU]"
+
+#, c-format
+msgid "E71: Invalid character after %s%%"
+msgstr "E71: Ugyldigt tegn efter %s%%"
+
+#, c-format
+msgid "E554: Syntax error in %s{...}"
+msgstr "E554: Fejl ved syntaks i %s{...}"
+
+msgid "External submatches:\n"
+msgstr "Eksterne undermatch:\n"
+
+#, c-format
+msgid "E888: (NFA regexp) cannot repeat %s"
+msgstr "E888: (NFA regexp) kan ikke gentage %s"
+
+msgid ""
+"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be "
+"used "
+msgstr ""
+"E864: \\%#= mรฅ kun efterfรธlges af 0, 1 eller 2. Bruger den automatiske motor "
+
+msgid "Switching to backtracking RE engine for pattern: "
+msgstr "Skifter til backtracking RE-motor for mรธnster: "
+
+msgid "E865: (NFA) Regexp end encountered prematurely"
+msgstr "E865: (NFA) Mรธdte slutningen pรฅ regulรฆrt udtryk for tidligt"
+
+#, c-format
+msgid "E866: (NFA regexp) Misplaced %c"
+msgstr "E866: (NFA regexp) Forkert placeret %c"
+
+#, c-format
+msgid "E877: (NFA regexp) Invalid character class: %ld"
+msgstr "E877: (NFA regexp) Ugyldig tegnklasse: %ld"
+
+#, c-format
+msgid "E867: (NFA) Unknown operator '\\z%c'"
+msgstr "E867: (NFA) Ukendt operator '\\z%c'"
+
+msgid "E951: \\% value too large"
+msgstr "E951: \\%-vรฆrdi for stor"
+
+#, c-format
+msgid "E867: (NFA) Unknown operator '\\%%%c'"
+msgstr "E867: (NFA) Ukendt operator '\\%%%c'"
+
+msgid "E868: Error building NFA with equivalence class!"
+msgstr "E868: Fejl ved bygning af NFA med ligestillet klasse!"
+
+#, c-format
+msgid "E869: (NFA) Unknown operator '\\@%c'"
+msgstr "E869: (NFA) Ukendt operator '\\@%c'"
+
+msgid "E870: (NFA regexp) Error reading repetition limits"
+msgstr "E870: (NFA regexp) Fejl ved lรฆsning af gentagelsesgrรฆnser"
+
+msgid "E871: (NFA regexp) Can't have a multi follow a multi !"
+msgstr "E871: (NFA regexp) En multi mรฅ ikke efterfรธlges af en multi !"
+
+msgid "E872: (NFA regexp) Too many '('"
+msgstr "E872: (NFA regexp) For mange '('"
+
+msgid "E879: (NFA regexp) Too many \\z("
+msgstr "E879: (NFA regexp) For mange \\z("
+
+msgid "E873: (NFA regexp) proper termination error"
+msgstr "E873: (NFA regexp) fejl ved korrekt terminering"
+
+msgid "E874: (NFA) Could not pop the stack !"
+msgstr "E874: (NFA) Kunne ikke pop'e stakken !"
+
+msgid ""
+"E875: (NFA regexp) (While converting from postfix to NFA), too many states "
+"left on stack"
+msgstr ""
+"E875: (NFA regexp) (Ved konvertering fra postfix til NFA), for mange "
+"tilstande tilbage pรฅ stak"
+
+msgid "E876: (NFA regexp) Not enough space to store the whole NFA "
+msgstr "E876: (NFA regexp) Ikke nok plads til at lagre hele NFA'en "
+
+msgid "E878: (NFA) Could not allocate memory for branch traversal!"
+msgstr "E878: (NFA) Kunne ikke allokere hukommelse til gennemgang af gren!"
+
+msgid ""
+"Could not open temporary log file for writing, displaying on stderr ... "
+msgstr "Kunne ikke รฅbne midlertidig logfil til skrivning, viser pรฅ stderr ... "
+
+#, c-format
+msgid "(NFA) COULD NOT OPEN %s !"
+msgstr "(NFA) KUNNE IKKE ร…BNE %s !"
+
+msgid "Could not open temporary log file for writing "
+msgstr "Kunne ikke รฅbne midlertidig logfil til skrivning "
+
+msgid " VREPLACE"
+msgstr " VERSTAT"
+
+msgid " REPLACE"
+msgstr " ERSTAT"
+
+msgid " REVERSE"
+msgstr " BAGLร†NS"
+
+msgid " INSERT"
+msgstr " INDSร†T"
+
+msgid " (insert)"
+msgstr " (indsรฆt)"
+
+msgid " (replace)"
+msgstr " (erstat)"
+
+msgid " (vreplace)"
+msgstr " (verstat)"
+
+msgid " Hebrew"
+msgstr " Hebraisk"
+
+msgid " Arabic"
+msgstr " Arabisk"
+
+msgid " (paste)"
+msgstr " (indsรฆt)"
+
+msgid " VISUAL"
+msgstr " VISUEL"
+
+msgid " VISUAL LINE"
+msgstr " VISUEL LINJE"
+
+msgid " VISUAL BLOCK"
+msgstr " VISUEL BLOK"
+
+msgid " SELECT"
+msgstr " Vร†LG"
+
+msgid " SELECT LINE"
+msgstr " Vร†LG LINJE"
+
+msgid " SELECT BLOCK"
+msgstr " Vร†LG BLOK"
+
+msgid "recording"
+msgstr "optager"
+
+#, c-format
+msgid "E383: Invalid search string: %s"
+msgstr "E383: Ugyldig sรธgestreng: %s"
+
+#, c-format
+msgid "E384: search hit TOP without match for: %s"
+msgstr "E384: sรธgning ramte ร˜VERST uden match for: %s"
+
+#, c-format
+msgid "E385: search hit BOTTOM without match for: %s"
+msgstr "E385: sรธgning ramte NEDERST uden match for: %s"
+
+msgid "E386: Expected '?' or '/' after ';'"
+msgstr "E386: Ventede '?' eller '/' efter ';'"
+
+msgid " (includes previously listed match)"
+msgstr " (inkluderer tidligere oplistet match)"
+
+msgid "--- Included files "
+msgstr "--- Inkluderede filer "
+
+msgid "not found "
+msgstr "ikke fundet "
+
+msgid "in path ---\n"
+msgstr "i sti ---\n"
+
+msgid " (Already listed)"
+msgstr " (Allerede oplistet)"
+
+msgid " NOT FOUND"
+msgstr " IKKE FUNDET"
+
+#, c-format
+msgid "Scanning included file: %s"
+msgstr "Skanner inkluderede filer: %s"
+
+#, c-format
+msgid "Searching included file %s"
+msgstr "Sรธger efter inkluderede fil %s"
+
+msgid "E387: Match is on current line"
+msgstr "E387: Match er pรฅ nuvรฆrende linje"
+
+msgid "All included files were found"
+msgstr "Alle inkluderede filer blev fundet"
+
+msgid "No included files"
+msgstr "Ingen inkluderede filer"
+
+msgid "E388: Couldn't find definition"
+msgstr "E388: Kunne ikke finde definition"
+
+msgid "E389: Couldn't find pattern"
+msgstr "E389: Kunne ikke finde mรธnster"
+
+msgid "Substitute "
+msgstr "Erstatning "
+
+#, c-format
+msgid ""
+"\n"
+"# Last %sSearch Pattern:\n"
+"~"
+msgstr ""
+"\n"
+"# Sidste %sSรธgemรธnster:\n"
+"~"
+
+msgid "E756: Spell checking is not enabled"
+msgstr "E756: Stavekontrol er ikke aktiveret"
+
+#, c-format
+msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\""
+msgstr "Advarsel: Kan ikke finde ordlisten \"%s_%s.spl\" eller \"%s_ascii.spl\""
+
+#, c-format
+msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
+msgstr "Advarsel: Kan ikke finde ordlisten \"%s.%s.spl\" eller \"%s.ascii.spl\""
+
+msgid "E797: SpellFileMissing autocommand deleted buffer"
+msgstr "E797: SpellFileMissing-autokommando slettede buffer"
+
+#, c-format
+msgid "Warning: region %s not supported"
+msgstr "Advarsel: regionen %s understรธttes ikke"
+
+msgid "Sorry, no suggestions"
+msgstr "Beklager, ingen forslag"
+
+#, c-format
+msgid "Sorry, only %ld suggestions"
+msgstr "Beklager, kun %ld forslag"
+
+#, c-format
+msgid "Change \"%.*s\" to:"
+msgstr "ร†ndr \"%.*s\" til:"
+
+#, c-format
+msgid " < \"%.*s\""
+msgstr " < \"%.*s\""
+
+msgid "E752: No previous spell replacement"
+msgstr "E752: Ingen tidligere staveerstatning"
+
+#, c-format
+msgid "E753: Not found: %s"
+msgstr "E753: Ikke fundet: %s"
+
+msgid "E758: Truncated spell file"
+msgstr "E758: Afkortet spell-fil"
+
+#, c-format
+msgid "Trailing text in %s line %d: %s"
+msgstr "Efterstillede tekst i %s linje %d: %s"
+
+#, c-format
+msgid "Affix name too long in %s line %d: %s"
+msgstr "Affix-navn for langt i %s linje %d: %s"
+
+msgid "E761: Format error in affix file FOL, LOW or UPP"
+msgstr "E761: Fejl i format i affix-filens FOL, LOW eller UPP"
+
+msgid "E762: Character in FOL, LOW or UPP is out of range"
+msgstr "E762: Tegn i FOL, LOW eller UPP er udenfor omrรฅde"
+
+msgid "Compressing word tree..."
+msgstr "Komprimerer ordtrรฆ..."
+
+#, c-format
+msgid "Reading spell file \"%s\""
+msgstr "Lรฆser spell-filen \"%s\""
+
+msgid "E757: This does not look like a spell file"
+msgstr "E757: Det ligner ikke en spell-fil"
+
+msgid "E771: Old spell file, needs to be updated"
+msgstr "E771: Gammel spell-fil, som skal opdateres"
+
+msgid "E772: Spell file is for newer version of Vim"
+msgstr "E772: Spell-filen er til en nyere version af Vim"
+
+msgid "E770: Unsupported section in spell file"
+msgstr "E770: Ikke-understรธttet sektion i spell-fil"
+
+#, c-format
+msgid "E778: This does not look like a .sug file: %s"
+msgstr "E778: ligner ikke en .sug-fil: %s"
+
+#, c-format
+msgid "E779: Old .sug file, needs to be updated: %s"
+msgstr "E779: Gammel .sug-fil, som skal opdateres: %s"
+
+#, c-format
+msgid "E780: .sug file is for newer version of Vim: %s"
+msgstr "E780: .sug-filen er til en nyere version af Vim: %s"
+
+#, c-format
+msgid "E781: .sug file doesn't match .spl file: %s"
+msgstr "E781: .sug-filen matcher ikke .spl-filen: %s"
+
+#, c-format
+msgid "E782: error while reading .sug file: %s"
+msgstr "E782: fejl ved lรฆsning af .sug-fil: %s"
+
+#, c-format
+msgid "Reading affix file %s ..."
+msgstr "Lรฆser affix-filen %s ..."
+
+#, c-format
+msgid "Conversion failure for word in %s line %d: %s"
+msgstr "Mislykkede konvertering for ordet %s linje %d: %s"
+
+#, c-format
+msgid "Conversion in %s not supported: from %s to %s"
+msgstr "Konvertering i %s understรธttes ikke: fra %s til %s"
+
+#, c-format
+msgid "Conversion in %s not supported"
+msgstr "Konvertering i %s understรธttes ikke"
+
+#, c-format
+msgid "Invalid value for FLAG in %s line %d: %s"
+msgstr "Ugyldig vรฆrdi for FLAG i %s linje %d: %s"
+
+#, c-format
+msgid "FLAG after using flags in %s line %d: %s"
+msgstr "FLAG efter brug af flag i %s linje %d: %s"
+
+#, c-format
+msgid ""
+"Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line "
+"%d"
+msgstr ""
+"Definering af COMPOUNDFORBIDFLAG efter PFX-punkt kan give forkerte "
+"resultater i %s linje %d"
+
+#, c-format
+msgid ""
+"Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line "
+"%d"
+msgstr ""
+"Definering af COMPOUNDPERMITFLAG efter PFX-punkt kan give forkerte "
+"resultater i %s linje %d"
+
+#, c-format
+msgid "Wrong COMPOUNDRULES value in %s line %d: %s"
+msgstr "Forkert COMPOUNDRULES-vรฆrdi i %s linje %d: %s"
+
+#, c-format
+msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s"
+msgstr "Forkert COMPOUNDWORDMAX-vรฆrdi i %s linje %d: %s"
+
+#, c-format
+msgid "Wrong COMPOUNDMIN value in %s line %d: %s"
+msgstr "Forkert COMPOUNDMIN-vรฆrdi i %s linje %d: %s"
+
+#, c-format
+msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s"
+msgstr "Forkert COMPOUNDSYLMAX-vรฆrdi i %s linje %d: %s"
+
+#, c-format
+msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"
+msgstr "Forkert CHECKCOMPOUNDPATTERN-vรฆrdi i %s linje %d: %s"
+
+#, c-format
+msgid "Different combining flag in continued affix block in %s line %d: %s"
+msgstr "Forskellige kombineringsflag i fortsat affix-blok i %s linje %d: %s"
+
+#, c-format
+msgid "Duplicate affix in %s line %d: %s"
+msgstr "Duplikeret affix i %s linje %d: %s"
+
+#, c-format
+msgid ""
+"Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s "
+"line %d: %s"
+msgstr ""
+"Affix ogsรฅ brugt for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST i %s "
+"linje %d: %s"
+
+#, c-format
+msgid "Expected Y or N in %s line %d: %s"
+msgstr "Ventede Y eller N i %s linje %d: %s"
+
+#, c-format
+msgid "Broken condition in %s line %d: %s"
+msgstr "ร˜delagt betingelse i %s linje %d: %s"
+
+#, c-format
+msgid "Expected REP(SAL) count in %s line %d"
+msgstr "Ventede REP(SAL)-tรฆlling i %s linje %d"
+
+#, c-format
+msgid "Expected MAP count in %s line %d"
+msgstr "Ventede MAP-tรฆlling i %s linje %d"
+
+#, c-format
+msgid "Duplicate character in MAP in %s line %d"
+msgstr "Duplikeret tegn i MAP i %s linje %d"
+
+#, c-format
+msgid "Unrecognized or duplicate item in %s line %d: %s"
+msgstr "Ikke-genkendt eller duplikeret punkt i %s linje %d: %s"
+
+#, c-format
+msgid "Missing FOL/LOW/UPP line in %s"
+msgstr "Manglende FOL-/LOW-/UPP-linje i %s"
+
+msgid "COMPOUNDSYLMAX used without SYLLABLE"
+msgstr "COMPOUNDSYLMAX brugt uden SYLLABLE"
+
+msgid "Too many postponed prefixes"
+msgstr "For mange udskudte prรฆfikser"
+
+msgid "Too many compound flags"
+msgstr "For mange compound-flag"
+
+msgid "Too many postponed prefixes and/or compound flags"
+msgstr "For mange udskudte prรฆfikser og/eller compound-flag"
+
+#, c-format
+msgid "Missing SOFO%s line in %s"
+msgstr "Manglende SOFO%s-linje i %s"
+
+#, c-format
+msgid "Both SAL and SOFO lines in %s"
+msgstr "Bรฅde SAL- og SOFO-linjer i %s"
+
+#, c-format
+msgid "Flag is not a number in %s line %d: %s"
+msgstr "Flag er ikke et nummer i %s linje %d: %s"
+
+#, c-format
+msgid "Illegal flag in %s line %d: %s"
+msgstr "Ulovligt flag i %s linje %d: %s"
+
+#, c-format
+msgid "%s value differs from what is used in another .aff file"
+msgstr "%s-vรฆrdi er ikke den samme som bruges i en anden .aff-fil"
+
+#, c-format
+msgid "Reading dictionary file %s ..."
+msgstr "Lรฆser ordbogsfilen %s ..."
+
+#, c-format
+msgid "E760: No word count in %s"
+msgstr "E760: Ingen ordtรฆlling i %s"
+
+#, c-format
+msgid "line %6d, word %6ld - %s"
+msgstr "linje %6d, ord %6ld - %s"
+
+#, c-format
+msgid "Duplicate word in %s line %d: %s"
+msgstr "Duplikeret ord i %s linje %d: %s"
+
+#, c-format
+msgid "First duplicate word in %s line %d: %s"
+msgstr "Fรธrste duplikeret ord i %s linje %d: %s"
+
+#, c-format
+msgid "%d duplicate word(s) in %s"
+msgstr "%d duplikeret ord i %s"
+
+#, c-format
+msgid "Ignored %d word(s) with non-ASCII characters in %s"
+msgstr "Ignorerede %d ord med ikke-ASCII-tegn i %s"
+
+#, c-format
+msgid "Reading word file %s ..."
+msgstr "Lรฆser ordfilen %s ..."
+
+#, c-format
+msgid "Duplicate /encoding= line ignored in %s line %d: %s"
+msgstr "Duplikeret /encoding=-linje ignoreret i %s linje %d: %s"
+
+#, c-format
+msgid "/encoding= line after word ignored in %s line %d: %s"
+msgstr "/encoding=-linje efter ord ignoreret i %s linje %d: %s"
+
+#, c-format
+msgid "Duplicate /regions= line ignored in %s line %d: %s"
+msgstr "Duplikerede /regions=-linjer ignoreret i %s linje %d: %s"
+
+#, c-format
+msgid "Too many regions in %s line %d: %s"
+msgstr "For mange regioner i %s linje %d: %s"
+
+#, c-format
+msgid "/ line ignored in %s line %d: %s"
+msgstr "/-linje ignoreret i %s linje %d: %s"
+
+#, c-format
+msgid "Invalid region nr in %s line %d: %s"
+msgstr "Ugyldigt regisionsnummer i %s linje %d: %s"
+
+#, c-format
+msgid "Unrecognized flags in %s line %d: %s"
+msgstr "Ugenkendte flag i %s linje %d: %s"
+
+#, c-format
+msgid "Ignored %d words with non-ASCII characters"
+msgstr "Ignorerer %d ord med ikke-ASCII-tegn"
+
+msgid "E845: Insufficient memory, word list will be incomplete"
+msgstr "E845: Ikke nok hukommelse, ordlisten vil vรฆre ufuldstรฆndig"
+
+#, c-format
+msgid "Compressed %d of %d nodes; %d (%d%%) remaining"
+msgstr "Komprimerede %d af %d punkter; %d (%d%%) tilbage"
+
+msgid "Reading back spell file..."
+msgstr "Lรฆser spell-fil tilbage..."
+
+msgid "Performing soundfolding..."
+msgstr "Udfรธrer lydsammenfoldning..."
+
+#, c-format
+msgid "Number of words after soundfolding: %ld"
+msgstr "Antal ord efter lydsammenfoldning: %ld"
+
+#, c-format
+msgid "Total number of words: %d"
+msgstr "Samlet antal ord: %d"
+
+#, c-format
+msgid "Writing suggestion file %s ..."
+msgstr "Skriver forslagsfilen %s ..."
+
+#, c-format
+msgid "Estimated runtime memory use: %d bytes"
+msgstr "Anslรฅet brug af afviklingshukommelse: %d byte"
+
+msgid "E751: Output file name must not have region name"
+msgstr "E751: Outputfilnavn mรฅ ikke have regionsnavn"
+
+#, c-format
+msgid "E754: Only up to %ld regions supported"
+msgstr "E754: Kun op til %ld regioner understรธttes"
+
+#, c-format
+msgid "E755: Invalid region in %s"
+msgstr "E755: Ugyldig region i %s"
+
+msgid "Warning: both compounding and NOBREAK specified"
+msgstr "Advarsel: bรฅde compounding og NOBREAK angivet"
+
+#, c-format
+msgid "Writing spell file %s ..."
+msgstr "Skriver spell-filen %s ..."
+
+msgid "Done!"
+msgstr "Fรฆrdig!"
+
+#, c-format
+msgid "E765: 'spellfile' does not have %ld entries"
+msgstr "E765: 'spellfile' har ingen %ld-poster"
+
+#, c-format
+msgid "Word '%.*s' removed from %s"
+msgstr "Ordet '%.*s' fjernet fra %s"
+
+#, c-format
+msgid "Word '%.*s' added to %s"
+msgstr "Ordet '%.*s' tilfรธjet til %s"
+
+msgid "E763: Word characters differ between spell files"
+msgstr "E763: Ordtegn er ikke ens i spell-filer"
+
+msgid "E783: duplicate char in MAP entry"
+msgstr "E783: duplikeret tegn i MAP-post"
+
+msgid "No Syntax items defined for this buffer"
+msgstr "Ingen syntakspunkter defineret for denne buffer"
+
+msgid "syntax conceal on"
+msgstr "syntax conceal on"
+
+msgid "syntax conceal off"
+msgstr "syntax conceal off"
+
+#, c-format
+msgid "E390: Illegal argument: %s"
+msgstr "E390: Ulovligt argument: %s"
+
+msgid "syntax case ignore"
+msgstr "syntax case ignore"
+
+msgid "syntax case match"
+msgstr "syntax case match"
+
+msgid "syntax spell toplevel"
+msgstr "syntax spell toplevel"
+
+msgid "syntax spell notoplevel"
+msgstr "syntax spell notoplevel"
+
+msgid "syntax spell default"
+msgstr "syntax spell default"
+
+msgid "syntax iskeyword "
+msgstr "syntax iskeyword "
+
+#, c-format
+msgid "E391: No such syntax cluster: %s"
+msgstr "E391: Ingen sรฅdan syntaks-cluster: %s"
+
+msgid "syncing on C-style comments"
+msgstr "synkronisering pรฅ C-style-kommentarer"
+
+msgid "no syncing"
+msgstr "ingen synkronisering"
+
+msgid "syncing starts "
+msgstr "synkronisering starter "
+
+msgid " lines before top line"
+msgstr " linjer inden รธverste linje"
+
+msgid ""
+"\n"
+"--- Syntax sync items ---"
+msgstr ""
+"\n"
+"--- Syntaks-synkroniseringspunkter ---"
+
+msgid ""
+"\n"
+"syncing on items"
+msgstr ""
+"\n"
+"synkroniserer pรฅ punkter"
+
+msgid ""
+"\n"
+"--- Syntax items ---"
+msgstr ""
+"\n"
+"--- Syntakspunkter ---"
+
+#, c-format
+msgid "E392: No such syntax cluster: %s"
+msgstr "E392: Ingen sรฅdan syntaks-cluster: %s"
+
+msgid "minimal "
+msgstr "minimal "
+
+msgid "maximal "
+msgstr "maksimal "
+
+msgid "; match "
+msgstr "; match "
+
+msgid " line breaks"
+msgstr " linjeombrydninger"
+
+msgid "E395: contains argument not accepted here"
+msgstr "E395: indeholder argument som ikke accepteres her"
+
+msgid "E844: invalid cchar value"
+msgstr "E844: ugyldig cchar-vรฆrdi"
+
+msgid "E393: group[t]here not accepted here"
+msgstr "E393: group[t]here accepteres ikke her"
+
+#, c-format
+msgid "E394: Didn't find region item for %s"
+msgstr "E394: Find ikke regionspunkter for %s"
+
+msgid "E397: Filename required"
+msgstr "E397: Filnavn krรฆves"
+
+msgid "E847: Too many syntax includes"
+msgstr "E847: For mange syntaks inkluderinger"
+
+#, c-format
+msgid "E789: Missing ']': %s"
+msgstr "E789: Manglende ']': %s"
+
+#, c-format
+msgid "E890: trailing char after ']': %s]%s"
+msgstr "E890: efterstillede tegn efter ']': %s]%s"
+
+#, c-format
+msgid "E398: Missing '=': %s"
+msgstr "E398: Manglende '=': %s"
+
+#, c-format
+msgid "E399: Not enough arguments: syntax region %s"
+msgstr "E399: For mange argumenter: syntaks region %s"
+
+msgid "E848: Too many syntax clusters"
+msgstr "E848: For mange syntaks-clusters"
+
+msgid "E400: No cluster specified"
+msgstr "E400: Ingen cluster angivet"
+
+#, c-format
+msgid "E401: Pattern delimiter not found: %s"
+msgstr "E401: Mรธnsterafgrรฆnser ikke fundet: %s"
+
+#, c-format
+msgid "E402: Garbage after pattern: %s"
+msgstr "E402: Affald efter mรธnster: %s"
+
+msgid "E403: syntax sync: line continuations pattern specified twice"
+msgstr ""
+"E403: syntaks synkronisering: linjefortsรฆttelsesmรธnster angivet to gange"
+
+#, c-format
+msgid "E404: Illegal arguments: %s"
+msgstr "E404: Ulovlige argumenter: %s"
+
+#, c-format
+msgid "E405: Missing equal sign: %s"
+msgstr "E405: Manglende lighedstegn: %s"
+
+#, c-format
+msgid "E406: Empty argument: %s"
+msgstr "E406: Tomt argument: %s"
+
+#, c-format
+msgid "E407: %s not allowed here"
+msgstr "E407: %s ikke tilladt her"
+
+#, c-format
+msgid "E408: %s must be first in contains list"
+msgstr "E408: %s skal vรฆre fรธrst i contains-liste"
+
+#, c-format
+msgid "E409: Unknown group name: %s"
+msgstr "E409: Ukendt gruppenavn: %s"
+
+#, c-format
+msgid "E410: Invalid :syntax subcommand: %s"
+msgstr "E410: Ugyldig :syntax-underkommando: %s"
+
+msgid ""
+" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
+msgstr ""
+" SAMLET ANTAL MATCH LANGSOMST GENNEMS. NAVN Mร˜NSTER"
+
+msgid "E679: recursive loop loading syncolor.vim"
+msgstr "E679: rekursiv lรธkke ved indlรฆsning af syncolor.vim"
+
+#, c-format
+msgid "E411: highlight group not found: %s"
+msgstr "E411: fremhรฆvningsgruppe ikke fundet: %s"
+
+#, c-format
+msgid "E412: Not enough arguments: \":highlight link %s\""
+msgstr "E412: Ikke nok argumenter: \":highlight link %s\""
+
+#, c-format
+msgid "E413: Too many arguments: \":highlight link %s\""
+msgstr "E413: For mange argumenter: \":highlight link %s\""
+
+msgid "E414: group has settings, highlight link ignored"
+msgstr "E414: gruppe har indstillinger, highlight link ignoreret"
+
+#, c-format
+msgid "E415: unexpected equal sign: %s"
+msgstr "E415: uventet lighedstegn: %s"
+
+#, c-format
+msgid "E416: missing equal sign: %s"
+msgstr "E416: manglende lighedstegn: %s"
+
+#, c-format
+msgid "E417: missing argument: %s"
+msgstr "E417: manglende argument: %s"
+
+#, c-format
+msgid "E418: Illegal value: %s"
+msgstr "E418: Ulovlig vรฆrdi: %s"
+
+msgid "E419: FG color unknown"
+msgstr "E419: Forgrundsfarve ukendt"
+
+msgid "E420: BG color unknown"
+msgstr "E420: Baggrundsfarve ukendt"
+
+#, c-format
+msgid "E421: Color name or number not recognized: %s"
+msgstr "E421: Farvenavn eller -nummer ikke genkendt: %s"
+
+#, c-format
+msgid "E422: terminal code too long: %s"
+msgstr "E422: terminalkode for lang: %s"
+
+#, c-format
+msgid "E423: Illegal argument: %s"
+msgstr "E423: Ulovligt argument: %s"
+
+msgid "E424: Too many different highlighting attributes in use"
+msgstr "E424: For mange forskellige fremhรฆvningsattributter i brug"
+
+msgid "E669: Unprintable character in group name"
+msgstr "E669: Tegn som ikke kan udskrives i gruppenavn"
+
+msgid "W18: Invalid character in group name"
+msgstr "W18: Ugyldige tegn i gruppenavn"
+
+msgid "E849: Too many highlight and syntax groups"
+msgstr "E849: For mange fremhรฆvnings- og syntaksgrupper"
+
+msgid "E555: at bottom of tag stack"
+msgstr "E555: nederst i tag-stak"
+
+msgid "E556: at top of tag stack"
+msgstr "E556: รธverst i tag-stak"
+
+msgid "E425: Cannot go before first matching tag"
+msgstr "E425: Kan ikke gรฅ efter fรธrste matchende tag"
+
+#, c-format
+msgid "E426: tag not found: %s"
+msgstr "E426: tag ikke fundet: %s"
+
+msgid " # pri kind tag"
+msgstr " # pri kind tag"
+
+msgid "file\n"
+msgstr "fil\n"
+
+msgid "E427: There is only one matching tag"
+msgstr "E427: Der er kun รฉt matchende tag"
+
+msgid "E428: Cannot go beyond last matching tag"
+msgstr "E428: Kan ikke gรฅ efter sidste matchende tag"
+
+#, c-format
+msgid "File \"%s\" does not exist"
+msgstr "Filen \"%s\" findes ikke"
+
+#, c-format
+msgid "tag %d of %d%s"
+msgstr "tag %d af %d%s"
+
+msgid " or more"
+msgstr " eller flere"
+
+msgid " Using tag with different case!"
+msgstr " Bruger tag med anden versaltype!"
+
+#, c-format
+msgid "E429: File \"%s\" does not exist"
+msgstr "E429: Filen \"%s\" findes ikke"
+
+msgid ""
+"\n"
+" # TO tag FROM line in file/text"
+msgstr ""
+"\n"
+" # TIL tag FRA linje i fil/tekst"
+
+#, c-format
+msgid "Searching tags file %s"
+msgstr "Sรธger i tags-filen %s"
+
+#, c-format
+msgid "E430: Tag file path truncated for %s\n"
+msgstr "E430: Tag-filens sti afkortet for %s\n"
+
+msgid "Ignoring long line in tags file"
+msgstr "Ignorerer lang linje i tags-fil"
+
+#, c-format
+msgid "E431: Format error in tags file \"%s\""
+msgstr "E431: Fejl ved format i tags-filen \"%s\""
+
+#, c-format
+msgid "Before byte %ld"
+msgstr "Inden byte %ld"
+
+#, c-format
+msgid "E432: Tags file not sorted: %s"
+msgstr "E432: Tags-fil ikke sorteret: %s"
+
+msgid "E433: No tags file"
+msgstr "E433: Ingen tags-fil"
+
+msgid "E434: Can't find tag pattern"
+msgstr "E434: Kan ikke finde tag-mรธnster"
+
+msgid "E435: Couldn't find tag, just guessing!"
+msgstr "E435: Kunne ikke finde tag, gรฆtter bare!"
+
+#, c-format
+msgid "Duplicate field name: %s"
+msgstr "Duplikeret feltnavn: %s"
+
+msgid "' not known. Available builtin terminals are:"
+msgstr "' ikke kendt. Tilgรฆngelige indbyggede terminaler:"
+
+msgid "defaulting to '"
+msgstr "bruger standarden '"
+
+msgid "E557: Cannot open termcap file"
+msgstr "E557: Kan ikke รฅbne termcap-fil"
+
+msgid "E558: Terminal entry not found in terminfo"
+msgstr "E558: Terminal-post ikke fundet i terminfo"
+
+msgid "E559: Terminal entry not found in termcap"
+msgstr "E559: Terminal-post ikke fundet i termcap"
+
+#, c-format
+msgid "E436: No \"%s\" entry in termcap"
+msgstr "E436: Ingen \"%s\"-post i termcap"
+
+msgid "E437: terminal capability \"cm\" required"
+msgstr "E437: terminal-formรฅenheden \"cm\" krรฆves"
+
+msgid ""
+"\n"
+"--- Terminal keys ---"
+msgstr ""
+"\n"
+"--- Terminal-taster ---"
+
+msgid "Cannot open $VIMRUNTIME/rgb.txt"
+msgstr "Kan ikke รฅbne $VIMRUNTIME/rgb.txt"
+
+#, c-format
+msgid "Kill job in \"%s\"?"
+msgstr "Drรฆb job i \"%s\"?"
+
+msgid "Terminal"
+msgstr "Terminal"
+
+msgid "Terminal-finished"
+msgstr "Terminal-fรฆrdig"
+
+msgid "active"
+msgstr "aktiv"
+
+msgid "running"
+msgstr "kรธre"
+
+msgid "finished"
+msgstr "fรฆrdig"
+
+#, c-format
+msgid "E953: File exists: %s"
+msgstr "E953: Filen findes: %s"
+
+msgid "E955: Not a terminal buffer"
+msgstr "E955: Ikke en terminal-buffer"
+
+msgid "new shell started\n"
+msgstr "ny skal startet\n"
+
+msgid "Vim: Error reading input, exiting...\n"
+msgstr "Vim: Fejl ved lรฆsning af input, afslutter...\n"
+
+msgid "Used CUT_BUFFER0 instead of empty selection"
+msgstr "Brugte CUT_BUFFER0 i stedet for tom markering"
+
+msgid "E881: Line count changed unexpectedly"
+msgstr "E881: Linjeantal รฆndret uventet"
+
+msgid "No undo possible; continue anyway"
+msgstr "Ingen fortryd mulig; fortsรฆtter alligevel"
+
+#, c-format
+msgid "E828: Cannot open undo file for writing: %s"
+msgstr "E828: Kan ikke รฅbne fortrydelsesfil til skrivning: %s"
+
+#, c-format
+msgid "E825: Corrupted undo file (%s): %s"
+msgstr "E825: Korrupt fortrydelsesfil (%s): %s"
+
+msgid "Cannot write undo file in any directory in 'undodir'"
+msgstr "Kan ikke skrive fortrydelsesfil i nogen mappe i 'undodir'"
+
+#, c-format
+msgid "Will not overwrite with undo file, cannot read: %s"
+msgstr "Overskriver ikke med fortrydelsesfil, kan ikke lรฆse: %s"
+
+#, c-format
+msgid "Will not overwrite, this is not an undo file: %s"
+msgstr "Overskriver ikke, det er ikke en fortrydelsesfil: %s"
+
+msgid "Skipping undo file write, nothing to undo"
+msgstr "Springer skrivning af fortrydelsesfil over, intet at fortryde"
+
+#, c-format
+msgid "Writing undo file: %s"
+msgstr "Skriver fortrydelsesfil: %s"
+
+#, c-format
+msgid "E829: write error in undo file: %s"
+msgstr "E829: fejl ved skrivning i fortrydelsesfil: %s"
+
+#, c-format
+msgid "Not reading undo file, owner differs: %s"
+msgstr "Lรฆser ikke fortrydelsesfil, ejer er ikke den samme: %s"
+
+#, c-format
+msgid "Reading undo file: %s"
+msgstr "Lรฆser fortrydelsesfil: %s"
+
+#, c-format
+msgid "E822: Cannot open undo file for reading: %s"
+msgstr "E822: Kan ikke รฅbne fortrydelsesfil til lรฆsning: %s"
+
+#, c-format
+msgid "E823: Not an undo file: %s"
+msgstr "E823: Ikke en fortrydelsesfil: %s"
+
+#, c-format
+msgid "E832: Non-encrypted file has encrypted undo file: %s"
+msgstr "E832: Ikke-krypteret fil har krypteret fortrydelsesfil: %s"
+
+#, c-format
+msgid "E826: Undo file decryption failed: %s"
+msgstr "E826: Dekryptering af fortrydelsesfil mislykkedes: %s"
+
+#, c-format
+msgid "E827: Undo file is encrypted: %s"
+msgstr "E827: Fortrydelsesfilen er krypteret: %s"
+
+#, c-format
+msgid "E824: Incompatible undo file: %s"
+msgstr "E824: Inkompatibel fortrydelsesfil: %s"
+
+msgid "File contents changed, cannot use undo info"
+msgstr "Filindholdet รฆndret, kan ikke bruge fortrydelsesinfo"
+
+#, c-format
+msgid "Finished reading undo file %s"
+msgstr "Fรฆrdig med at lรฆse fortrydelsesfilen %s"
+
+msgid "Already at oldest change"
+msgstr "Allerede ved รฆldste รฆndring"
+
+msgid "Already at newest change"
+msgstr "Allerede ved nyeste รฆndring"
+
+#, c-format
+msgid "E830: Undo number %ld not found"
+msgstr "E830: Fortrydelsesnummer %ld ikke fundet"
+
+msgid "E438: u_undo: line numbers wrong"
+msgstr "E438: u_undo: linjenumre forkerte"
+
+msgid "more line"
+msgstr "linje mere"
+
+msgid "more lines"
+msgstr "linjer mere"
+
+msgid "line less"
+msgstr "linje mindre"
+
+msgid "fewer lines"
+msgstr "linjere mindre"
+
+msgid "change"
+msgstr "รฆndring"
+
+msgid "changes"
+msgstr "รฆndringer"
+
+#, c-format
+msgid "%ld %s; %s #%ld %s"
+msgstr "%ld %s; %s #%ld %s"
+
+msgid "before"
+msgstr "inden"
+
+msgid "after"
+msgstr "efter"
+
+msgid "Nothing to undo"
+msgstr "Intet at fortryde"
+
+msgid "number changes when saved"
+msgstr "nummer รฆndrin. hvornรฅr gemt"
+
+#, c-format
+msgid "%ld seconds ago"
+msgstr "%ld sekunder siden"
+
+msgid "E790: undojoin is not allowed after undo"
+msgstr "E790: undojoin ikke tilladt efter undo"
+
+msgid "E439: undo list corrupt"
+msgstr "E439: fortrydelsesliste korrupt"
+
+msgid "E440: undo line missing"
+msgstr "E440: fortrydelseslinje mangler"
+
+#, c-format
+msgid "E122: Function %s already exists, add ! to replace it"
+msgstr "E122: Funktionen %s findes allerede, tilfรธj ! for at erstatte den"
+
+msgid "E717: Dictionary entry already exists"
+msgstr "E717: Ordbog-post findes allerede"
+
+msgid "E718: Funcref required"
+msgstr "E718: Funcref krรฆves"
+
+#, c-format
+msgid "E130: Unknown function: %s"
+msgstr "E130: Ukendt funktion: %s"
+
+#, c-format
+msgid "E125: Illegal argument: %s"
+msgstr "E125: Ulovligt argument: %s"
+
+#, c-format
+msgid "E853: Duplicate argument name: %s"
+msgstr "E853: Duplikeret argumentnavn: %s"
+
+#, c-format
+msgid "E740: Too many arguments for function %s"
+msgstr "E740: For mange argumenter til funktionen %s"
+
+#, c-format
+msgid "E116: Invalid arguments for function %s"
+msgstr "E116: Ugyldige argumenter til funktionen %s"
+
+msgid "E132: Function call depth is higher than 'maxfuncdepth'"
+msgstr "E132: Dybden af funktionskald er stรธrre end 'maxfuncdepth'"
+
+#, c-format
+msgid "calling %s"
+msgstr "kalder %s"
+
+#, c-format
+msgid "%s aborted"
+msgstr "%s afbrudt"
+
+#, c-format
+msgid "%s returning #%ld"
+msgstr "%s returnerer #%ld"
+
+#, c-format
+msgid "%s returning %s"
+msgstr "%s returnerer %s"
+
+msgid "E699: Too many arguments"
+msgstr "E699: For mange argumenter"
+
+#, c-format
+msgid "E117: Unknown function: %s"
+msgstr "E117: Ukendt funktion: %s"
+
+#, c-format
+msgid "E933: Function was deleted: %s"
+msgstr "E933: Funktion blev slettet: %s"
+
+#, c-format
+msgid "E119: Not enough arguments for function: %s"
+msgstr "E119: Ikke nok argumenter til funktionen: %s"
+
+#, c-format
+msgid "E120: Using <SID> not in a script context: %s"
+msgstr "E120: Bruger <SID> ikke i et script kontekst: %s"
+
+#, c-format
+msgid "E725: Calling dict function without Dictionary: %s"
+msgstr "E725: Kalder dict-funktion uden ordbog: %s"
+
+msgid "E129: Function name required"
+msgstr "E129: Funktionsnavn krรฆves"
+
+#, c-format
+msgid "E128: Function name must start with a capital or \"s:\": %s"
+msgstr "E128: Funktionsnavnet skal begynde med et stort bogstav eller \"s:\": %s"
+
+#, c-format
+msgid "E884: Function name cannot contain a colon: %s"
+msgstr "E884: Funktionsnavnet mรฅ ikke indeholdet et kolon: %s"
+
+#, c-format
+msgid "E123: Undefined function: %s"
+msgstr "E123: Udefineret funktion: %s"
+
+#, c-format
+msgid "E124: Missing '(': %s"
+msgstr "E124: Manglende '(': %s"
+
+msgid "E862: Cannot use g: here"
+msgstr "E862: Kan ikke bruge g: her"
+
+#, c-format
+msgid "E932: Closure function should not be at top level: %s"
+msgstr "E932: Closure-funktion skal ikke vรฆre pรฅ topniveau: %s"
+
+msgid "E126: Missing :endfunction"
+msgstr "E126: Manglende :endfunction"
+
+#, c-format
+msgid "W22: Text found after :endfunction: %s"
+msgstr "W22: Tekst fundet efter :endfunction: %s"
+
+#, c-format
+msgid "E707: Function name conflicts with variable: %s"
+msgstr "E707: Funktionsnavnet er i konflikt med variablen: %s"
+
+#, c-format
+msgid "E127: Cannot redefine function %s: It is in use"
+msgstr "E127: Kan ikke redefinere funktionen %s: Den er i brug"
+
+#, c-format
+msgid "E746: Function name does not match script file name: %s"
+msgstr "E746: Funktionsnavn matcher ikke scriptfilnavn: %s"
+
+#, c-format
+msgid "E131: Cannot delete function %s: It is in use"
+msgstr "E131: Kan ikke slette funktionen %s: Den er i brug"
+
+msgid "E133: :return not inside a function"
+msgstr "E133: :return ikke i en funktion"
+
+#, c-format
+msgid "E107: Missing parentheses: %s"
+msgstr "E107: Manglende parenteser: %s"
+
+msgid ""
+"\n"
+"MS-Windows 64-bit GUI version"
+msgstr ""
+"\n"
+"MS-Windows 64-bit GUI-version"
+
+msgid ""
+"\n"
+"MS-Windows 32-bit GUI version"
+msgstr ""
+"\n"
+"MS-Windows 32-bit GUI-version"
+
+msgid " with OLE support"
+msgstr " med understรธttelse af OLE"
+
+msgid ""
+"\n"
+"MS-Windows 64-bit console version"
+msgstr ""
+"\n"
+"MS-Windows 64-bit konsol-version"
+
+msgid ""
+"\n"
+"MS-Windows 32-bit console version"
+msgstr ""
+"\n"
+"MS-Windows 32-bit konsol-version"
+
+msgid ""
+"\n"
+"macOS version"
+msgstr ""
+"\n"
+"macOS-version"
+
+msgid ""
+"\n"
+"macOS version w/o darwin feat."
+msgstr ""
+"\n"
+"macOS-version med/uden darwin-funktionalitet."
+
+msgid ""
+"\n"
+"OpenVMS version"
+msgstr ""
+"\n"
+"OpenVMS-version"
+
+msgid ""
+"\n"
+"Included patches: "
+msgstr ""
+"\n"
+"Rettelser som er med: "
+
+msgid ""
+"\n"
+"Extra patches: "
+msgstr ""
+"\n"
+"Ekstra rettelser: "
+
+msgid "Modified by "
+msgstr "ร†ndret af "
+
+msgid ""
+"\n"
+"Compiled "
+msgstr ""
+"\n"
+"Kompileret "
+
+msgid "by "
+msgstr "af "
+
+msgid ""
+"\n"
+"Huge version "
+msgstr ""
+"\n"
+"Huge-version "
+
+msgid ""
+"\n"
+"Big version "
+msgstr ""
+"\n"
+"Big-version "
+
+msgid ""
+"\n"
+"Normal version "
+msgstr ""
+"\n"
+"Normal-version "
+
+msgid ""
+"\n"
+"Small version "
+msgstr ""
+"\n"
+"Small-version "
+
+msgid ""
+"\n"
+"Tiny version "
+msgstr ""
+"\n"
+"Tiny-version "
+
+msgid "without GUI."
+msgstr "uden GUI."
+
+msgid "with GTK3 GUI."
+msgstr "med GTK3-GUI."
+
+msgid "with GTK2-GNOME GUI."
+msgstr "med GTK2-GNOME-GUI."
+
+msgid "with GTK2 GUI."
+msgstr "med GTK2-GUI."
+
+msgid "with X11-Motif GUI."
+msgstr "med X11-Motif-GUI."
+
+msgid "with X11-neXtaw GUI."
+msgstr "med X11-neXtaw-GUI."
+
+msgid "with X11-Athena GUI."
+msgstr "med X11-Athena-GUI."
+
+msgid "with Photon GUI."
+msgstr "med Photon-GUI."
+
+msgid "with GUI."
+msgstr "med GUI."
+
+msgid "with Carbon GUI."
+msgstr "med Carbon-GUI."
+
+msgid "with Cocoa GUI."
+msgstr "med Cocoa-GUI."
+
+msgid " Features included (+) or not (-):\n"
+msgstr " Funktionaliteter som er med (+) eller ikke (-):\n"
+
+msgid " system vimrc file: \""
+msgstr " system vimrc-fil: \""
+
+msgid " user vimrc file: \""
+msgstr " bruger vimrc-fil: \""
+
+msgid " 2nd user vimrc file: \""
+msgstr " 2. bruger vimrc-fil: \""
+
+msgid " 3rd user vimrc file: \""
+msgstr " 3. bruger vimrc-fil: \""
+
+msgid " user exrc file: \""
+msgstr " bruger exrc-fil: \""
+
+msgid " 2nd user exrc file: \""
+msgstr " 2. bruger exrc-fil: \""
+
+msgid " system gvimrc file: \""
+msgstr " system gvimrc-fil: \""
+
+msgid " user gvimrc file: \""
+msgstr " bruger gvimrc-fil: \""
+
+msgid "2nd user gvimrc file: \""
+msgstr "2. bruger gvimrc-fil: \""
+
+msgid "3rd user gvimrc file: \""
+msgstr "3. bruger gvimrc-fil: \""
+
+msgid " defaults file: \""
+msgstr " defaults-fil: \""
+
+msgid " system menu file: \""
+msgstr " system menu-fil: \""
+
+msgid " fall-back for $VIM: \""
+msgstr " fall-back for $VIM: \""
+
+msgid " f-b for $VIMRUNTIME: \""
+msgstr " f-b for $VIMRUNTIME: \""
+
+msgid "Compilation: "
+msgstr "Kompilering: "
+
+msgid "Compiler: "
+msgstr "Kompiler: "
+
+msgid "Linking: "
+msgstr "Linking: "
+
+msgid " DEBUG BUILD"
+msgstr " FEJLRETNINGSBYG"
+
+msgid "VIM - Vi IMproved"
+msgstr "VIM - Vi IMproved"
+
+msgid "version "
+msgstr "version "
+
+msgid "by Bram Moolenaar et al."
+msgstr "af Bram Moolenaar og andre"
+
+msgid "Vim is open source and freely distributable"
+msgstr "Vim er open source og kan frit distribueres"
+
+msgid "Help poor children in Uganda!"
+msgstr "Hjรฆlp fattige bรธrn i Uganda!"
+
+msgid "type :help iccf<Enter> for information "
+msgstr "skriv :help iccf<Enter> for information "
+
+msgid "type :q<Enter> to exit "
+msgstr "skriv :q<Enter> for at afslutte "
+
+msgid "type :help<Enter> or <F1> for on-line help"
+msgstr "skriv :help<Enter> eller <F1> for onlinehjรฆlp "
+
+msgid "type :help version8<Enter> for version info"
+msgstr "skriv :help version8<Enter> for versionsinfo"
+
+msgid "Running in Vi compatible mode"
+msgstr "Kรธrer i Vi-kompatibel-tilstand"
+
+msgid "type :set nocp<Enter> for Vim defaults"
+msgstr "skriv :set nocp<Enter> for Vim-standarder"
+
+msgid "type :help cp-default<Enter> for info on this"
+msgstr "skriv :help cp-default<Enter> for info om det "
+
+msgid "menu Help->Orphans for information "
+msgstr "menu Hjรฆlp->Forรฆldrelรธse bรธrnfor information "
+
+msgid "Running modeless, typed text is inserted"
+msgstr "Kรธrer tilstandslรธs, skrevet tekst indsรฆttes"
+
+msgid "menu Edit->Global Settings->Toggle Insert Mode "
+msgstr "menu Rediger->Globale indstillinger->Indsรฆt-tilstand til/fra "
+
+msgid " for two modes "
+msgstr " for to-tilstande "
+
+msgid "menu Edit->Global Settings->Toggle Vi Compatible"
+msgstr "menu Rediger->Globale indstillinger->Vi-kompatibel til/fra"
+
+msgid " for Vim defaults "
+msgstr " for Vim-standarder "
+
+msgid "Sponsor Vim development!"
+msgstr "Sponsorer udviklingen af Vim!"
+
+msgid "Become a registered Vim user!"
+msgstr "Bliv en registreret Vim-bruger!"
+
+msgid "type :help sponsor<Enter> for information "
+msgstr "skriv :help sponsor<Enter> for information "
+
+msgid "type :help register<Enter> for information "
+msgstr "skriv :help register<Enter> for information "
+
+msgid "menu Help->Sponsor/Register for information "
+msgstr "menu Hjรฆlp->Sponsorer/registrer for information "
+
+msgid "Already only one window"
+msgstr "Allerede kun รฉt vindue"
+
+msgid "E441: There is no preview window"
+msgstr "E441: Der er ikke noget forhรฅndsvisningsvindue"
+
+msgid "E442: Can't split topleft and botright at the same time"
+msgstr "E442: Kan ikke opdele รธverste venstre og nederste hรธjre pรฅ samme tid"
+
+msgid "E443: Cannot rotate when another window is split"
+msgstr "E443: Kan ikke rotere nรฅr et andet vindue er opdelt"
+
+msgid "E444: Cannot close last window"
+msgstr "E444: Kan ikke lukke sidste vindue"
+
+msgid "E813: Cannot close autocmd window"
+msgstr "E813: Kan ikke lukke autocmd-vindue"
+
+msgid "E814: Cannot close window, only autocmd window would remain"
+msgstr "E814: Kan ikke lukke vindue, kun autocmd-vindue ville vรฆre tilbage"
+
+msgid "E445: Other window contains changes"
+msgstr "E445: Et andet vindue indeholder รฆndringer"
+
+msgid "E446: No file name under cursor"
+msgstr "E446: Intet filnavn under markรธr"
+
+#, c-format
+msgid "E447: Can't find file \"%s\" in path"
+msgstr "E447: Kan ikke finde filen \"%s\" i sti"
+
+#, c-format
+msgid "E799: Invalid ID: %ld (must be greater than or equal to 1)"
+msgstr "E799: Ugyldigt ID: %ld (skal vรฆre stรธrre end eller lig med 1)"
+
+#, c-format
+msgid "E801: ID already taken: %ld"
+msgstr "E801: ID allerede taget: %ld"
+
+msgid "List or number required"
+msgstr "Liste eller nummer krรฆves"
+
+#, c-format
+msgid "E802: Invalid ID: %ld (must be greater than or equal to 1)"
+msgstr "E802: Ugyldigt ID: %ld (skal vรฆre stรธrre end eller lig med 1)"
+
+#, c-format
+msgid "E803: ID not found: %ld"
+msgstr "E803: ID ikke fundet: %ld"
+
+#, c-format
+msgid "E370: Could not load library %s"
+msgstr "E370: Kunne ikke indlรฆse biblioteket %s"
+
+msgid "Sorry, this command is disabled: the Perl library could not be loaded."
+msgstr ""
+"Beklager, kommandoen er deaktiveret: Perl-biblioteket kunne ikke indlรฆses."
+
+msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
+msgstr "E299: Perl-evaluering forbudt i sandbox uden Safe-modulet"
+
+msgid "Edit with &multiple Vims"
+msgstr "Rediger med &flere Vim'er"
+
+msgid "Edit with single &Vim"
+msgstr "Rediger med รฉn &Vim"
+
+msgid "Diff with Vim"
+msgstr "Diff med Vim"
+
+msgid "Edit with &Vim"
+msgstr "Rediger med &Vim"
+
+msgid "Edit with existing Vim - "
+msgstr "Rediger med eksisterende Vim - "
+
+msgid "Edits the selected file(s) with Vim"
+msgstr "Redigerer den valgt fil(er) med Vim"
+
+msgid "Error creating process: Check if gvim is in your path!"
+msgstr "Fejl ved oprettelse af proces: Tjek om gvim er i din sti!"
+
+msgid "gvimext.dll error"
+msgstr "fejl ved gvimext.dll"
+
+msgid "Path length too long!"
+msgstr "Stiens lรฆngde er for lang!"
+
+msgid "--No lines in buffer--"
+msgstr "--Ingen linjer i buffer--"
+
+msgid "E470: Command aborted"
+msgstr "E470: Kommando afbrudt"
+
+msgid "E471: Argument required"
+msgstr "E471: Argument krรฆves"
+
+msgid "E10: \\ should be followed by /, ? or &"
+msgstr "E10: \\ skal efterfรธles af /, ? eller &"
+
+msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
+msgstr "E11: Ugyldig i kommandolinjevindue; <CR> udfรธrer, CTRL-C afslutter"
+
+msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
+msgstr ""
+"E12: Kommando ikke tilladt fra exrc/vimrc i nuvรฆrende mappe- eller "
+"tagsรธgning"
+
+msgid "E171: Missing :endif"
+msgstr "E171: Manglende :endif"
+
+msgid "E600: Missing :endtry"
+msgstr "E600: Manglende :endtry"
+
+msgid "E170: Missing :endwhile"
+msgstr "E170: Manglende :endwhile"
+
+msgid "E170: Missing :endfor"
+msgstr "E170: Manglende :endfor"
+
+msgid "E588: :endwhile without :while"
+msgstr "E588: :endwhile uden :while"
+
+msgid "E588: :endfor without :for"
+msgstr "E588: :endfor uden :for"
+
+msgid "E13: File exists (add ! to override)"
+msgstr "E13: Filen findes (tilfรธj ! for at tilsidesรฆtte)"
+
+msgid "E472: Command failed"
+msgstr "E472: Kommando mislykkede"
+
+#, c-format
+msgid "E234: Unknown fontset: %s"
+msgstr "E234: Ukendt skrifttypesรฆt: %s"
+
+#, c-format
+msgid "E235: Unknown font: %s"
+msgstr "E235: Ukendt skrifttype: %s"
+
+#, c-format
+msgid "E236: Font \"%s\" is not fixed-width"
+msgstr "E236: Skrifttypen \"%s\" er ikke med fast bredde"
+
+msgid "E473: Internal error"
+msgstr "E473: Intern fejl"
+
+#, c-format
+msgid "E685: Internal error: %s"
+msgstr "E685: Intern fejl: %s"
+
+msgid "Interrupted"
+msgstr "Afbrudt"
+
+msgid "E14: Invalid address"
+msgstr "E14: Ugyldig adresse"
+
+msgid "E474: Invalid argument"
+msgstr "E474: Ugyldigt argument"
+
+#, c-format
+msgid "E475: Invalid argument: %s"
+msgstr "E475: Ugyldigt argument: %s"
+
+#, c-format
+msgid "E475: Invalid value for argument %s"
+msgstr "E475: Ugyldig vรฆrdi for argumentet %s"
+
+#, c-format
+msgid "E475: Invalid value for argument %s: %s"
+msgstr "E475: Ugyldig vรฆrdi for argumentet %s: %s"
+
+#, c-format
+msgid "E15: Invalid expression: %s"
+msgstr "E15: Ugyldigt udtryk: %s"
+
+msgid "E16: Invalid range"
+msgstr "E16: Ugyldigt omrรฅde"
+
+msgid "E476: Invalid command"
+msgstr "E476: Ugyldig kommando"
+
+#, c-format
+msgid "E17: \"%s\" is a directory"
+msgstr "E17: \"%s\" er en mappe"
+
+#, c-format
+msgid "E364: Library call failed for \"%s()\""
+msgstr "E364: Kald af bibliotek mislykkedes for \"%s()\""
+
+msgid "E667: Fsync failed"
+msgstr "E667: Fsync mislykkedes"
+
+#, c-format
+msgid "E448: Could not load library function %s"
+msgstr "E448: Kunne ikke indlรฆse biblioteksfunktionen %s"
+
+msgid "E19: Mark has invalid line number"
+msgstr "E19: Mรฆrke har ugyldigt linjenummer"
+
+msgid "E20: Mark not set"
+msgstr "E20: Mรฆrke ikke sat"
+
+msgid "E21: Cannot make changes, 'modifiable' is off"
+msgstr "E21: Kan ikke foretage รฆndringer, 'modifiable' er slรฅet fra"
+
+msgid "E22: Scripts nested too deep"
+msgstr "E22: Scripts indlejret for dybt"
+
+msgid "E23: No alternate file"
+msgstr "E23: Ingen alternate-fil"
+
+msgid "E24: No such abbreviation"
+msgstr "E24: Ingen sรฅdan forkortelse"
+
+msgid "E477: No ! allowed"
+msgstr "E477: Ingen ! tilladt"
+
+msgid "E25: GUI cannot be used: Not enabled at compile time"
+msgstr "E25: GUI kan ikke bruges: Ikke aktiveret ved kompileringstid"
+
+msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
+msgstr "E26: Hebraisk kan ikke bruges: Ikke aktiveret ved kompileringstid\n"
+
+msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
+msgstr ""
+"E27: Persisk kan ikke bruges: Ikke aktiveret ved kompileringstid\n"
+"\n"
+
+msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
+msgstr "E800: Arabisk kan ikke bruges: Ikke aktiveret ved kompileringstid\n"
+
+#, c-format
+msgid "E28: No such highlight group name: %s"
+msgstr "E28: Intet sรฅdan fremhรฆvningsgruppenavn: %s"
+
+msgid "E29: No inserted text yet"
+msgstr "E29: Endnu ingen indsat tekst"
+
+msgid "E30: No previous command line"
+msgstr "E30: Ingen tidligere kommandolinje"
+
+msgid "E31: No such mapping"
+msgstr "E31: Ingen sรฅdan mapping"
+
+msgid "E479: No match"
+msgstr "E479: Intet match"
+
+#, c-format
+msgid "E480: No match: %s"
+msgstr "E480: Intet match: %s"
+
+msgid "E32: No file name"
+msgstr "E32: Intet filnavn"
+
+msgid "E33: No previous substitute regular expression"
+msgstr "E33: Ingen tidligere erstatnings regulรฆrt udtryk"
+
+msgid "E34: No previous command"
+msgstr "E34: Ingen tidligere kommando"
+
+msgid "E35: No previous regular expression"
+msgstr "E35: Ingen tidligere regulรฆre udtryk"
+
+msgid "E481: No range allowed"
+msgstr "E481: Intet omrรฅde tilladt"
+
+msgid "E36: Not enough room"
+msgstr "E36: Ikke plads nok"
+
+#, c-format
+msgid "E247: no registered server named \"%s\""
+msgstr "E247: ingen registreret server ved navn \"%s\""
+
+#, c-format
+msgid "E482: Can't create file %s"
+msgstr "E482: Kan ikke oprette filen %s"
+
+msgid "E483: Can't get temp file name"
+msgstr "E483: Kan ikke hente midlertidigt filnavn"
+
+#, c-format
+msgid "E484: Can't open file %s"
+msgstr "E484: Kan ikke รฅbne filen %s"
+
+#, c-format
+msgid "E485: Can't read file %s"
+msgstr "E485: Kan ikke lรฆse filen %s"
+
+msgid "E38: Null argument"
+msgstr "E38: Null-argument"
+
+msgid "E39: Number expected"
+msgstr "E39: Nummer ventet"
+
+#, c-format
+msgid "E40: Can't open errorfile %s"
+msgstr "E40: Kan ikke รฅbne fejlfilen %s"
+
+msgid "E233: cannot open display"
+msgstr "E233: kan ikke รฅbne display"
+
+msgid "E41: Out of memory!"
+msgstr "E41: Ikke mere ledig hukommelse!"
+
+msgid "Pattern not found"
+msgstr "Mรธnster ikke fundet"
+
+#, c-format
+msgid "E486: Pattern not found: %s"
+msgstr "E486: Mรธnster ikke fundet: %s"
+
+msgid "E487: Argument must be positive"
+msgstr "E487: Argument skal vรฆre positivt"
+
+msgid "E459: Cannot go back to previous directory"
+msgstr "E459: Kan ikke gรฅ tilbage til tidligere mappe"
+
+msgid "E42: No Errors"
+msgstr "E42: Ingen fejl"
+
+msgid "E776: No location list"
+msgstr "E776: Ingen placeringsliste"
+
+msgid "E43: Damaged match string"
+msgstr "E43: Beskadiget matchstreng"
+
+msgid "E44: Corrupted regexp program"
+msgstr "E44: Korrupt regexp-program"
+
+msgid "E45: 'readonly' option is set (add ! to override)"
+msgstr "E45: 'readonly'-tilvalget er sat (tilfรธj ! for at tilsidesรฆtte)"
+
+#, c-format
+msgid "E46: Cannot change read-only variable \"%s\""
+msgstr "E46: Kan ikke รฆndre skrivebeskyttet variabel \"%s\""
+
+#, c-format
+msgid "E794: Cannot set variable in the sandbox: \"%s\""
+msgstr "E794: Kan ikke sรฆtte variabel i sandboksen: \"%s\""
+
+msgid "E713: Cannot use empty key for Dictionary"
+msgstr "E713: Kan ikke bruge tom nรธgle til ordbog"
+
+msgid "E715: Dictionary required"
+msgstr "E715: Ordbog krรฆves"
+
+#, c-format
+msgid "E684: list index out of range: %ld"
+msgstr "E684: listeindeks udenfor omrรฅde: %ld"
+
+#, c-format
+msgid "E118: Too many arguments for function: %s"
+msgstr "E118: For mange argumenter til funktion: %s"
+
+#, c-format
+msgid "E716: Key not present in Dictionary: %s"
+msgstr "E716: Nรธgle findes ikke i ordbog: %s"
+
+msgid "E714: List required"
+msgstr "E714: Liste krรฆves"
+
+#, c-format
+msgid "E712: Argument of %s must be a List or Dictionary"
+msgstr "E712: Argument af %s skal vรฆre en liste eller ordbog"
+
+msgid "E47: Error while reading errorfile"
+msgstr "E47: Fejl ved lรฆsning af fejlfil"
+
+msgid "E48: Not allowed in sandbox"
+msgstr "E48: Ikke tilladt i sandboks"
+
+msgid "E523: Not allowed here"
+msgstr "E523: Ikke tilladt her"
+
+msgid "E359: Screen mode setting not supported"
+msgstr "E359: Skรฆrmtilstand-indstilling understรธttes ikke"
+
+msgid "E49: Invalid scroll size"
+msgstr "E49: Ugyldig rullestรธrrelse"
+
+msgid "E91: 'shell' option is empty"
+msgstr "E91: 'shell'-tilvalget er tomt"
+
+msgid "E255: Couldn't read in sign data!"
+msgstr "E255: Kunne ikke lรฆse i sign-data!"
+
+msgid "E72: Close error on swap file"
+msgstr "E72: Fejl ved lukning af swap-fil"
+
+msgid "E73: tag stack empty"
+msgstr "E73: tag-stak tom"
+
+msgid "E74: Command too complex"
+msgstr "E74: Kommando for kompleks"
+
+msgid "E75: Name too long"
+msgstr "E75: Navn for langt"
+
+msgid "E76: Too many ["
+msgstr "E76: For mange ["
+
+msgid "E77: Too many file names"
+msgstr "E77: For mange filnavne"
+
+msgid "E488: Trailing characters"
+msgstr "E488: Efterstillede tegn"
+
+msgid "E78: Unknown mark"
+msgstr "E78: Ukendt mรฆrke"
+
+msgid "E79: Cannot expand wildcards"
+msgstr "E79: Kan ikke udvide jokertegn"
+
+msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
+msgstr "E591: 'winheight' mรฅ ikke vรฆre mindre end 'winminheight'"
+
+msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
+msgstr "E592: 'winwidth' mรฅ ikke vรฆre mindre end 'winminwidth'"
+
+msgid "E80: Error while writing"
+msgstr "E80: Fejl ved skrivning"
+
+msgid "E939: Positive count required"
+msgstr "E939: Positiv tรฆlling krรฆves"
+
+msgid "E81: Using <SID> not in a script context"
+msgstr "E81: Bruger <SID> ikke i et script kontekst"
+
+msgid "E449: Invalid expression received"
+msgstr "E449: Ugyldigt udtryk modtaget"
+
+msgid "E463: Region is guarded, cannot modify"
+msgstr "E463: Regionen er beskyttet, kan ikke รฆndre"
+
+msgid "E744: NetBeans does not allow changes in read-only files"
+msgstr "E744: NetBeans tillader ikke รฆndringer i skrivebeskyttede filer"
+
+msgid "E363: pattern uses more memory than 'maxmempattern'"
+msgstr "E363: mรธnster bruger mere hukommelse end 'maxmempattern'"
+
+msgid "E749: empty buffer"
+msgstr "E749: tom buffer"
+
+#, c-format
+msgid "E86: Buffer %ld does not exist"
+msgstr "E86: Bufferen %ld findes ikke"
+
+msgid "E682: Invalid search pattern or delimiter"
+msgstr "E682: Ugyldigt sรธgemรธnster eller -afgrรฆnser"
+
+msgid "E139: File is loaded in another buffer"
+msgstr "E139: Filen er indlรฆst i en anden buffer"
+
+#, c-format
+msgid "E764: Option '%s' is not set"
+msgstr "E764: Tilvalget '%s' er ikke sat"
+
+msgid "E850: Invalid register name"
+msgstr "E850: Ugyldigt registernavn"
+
+#, c-format
+msgid "E919: Directory not found in '%s': \"%s\""
+msgstr "E919: Mappe ikke fundet i '%s': \"%s\""
+
+msgid "E952: Autocommand caused recursive behavior"
+msgstr "E952: Autokommando forรฅrsagede rekursiv opfรธrsel"
+
+msgid "search hit TOP, continuing at BOTTOM"
+msgstr "sรธgning ramte ร˜VERST, fortsรฆtter ved NEDERST"
+
+msgid "search hit BOTTOM, continuing at TOP"
+msgstr "sรธgning ramte NEDERST, fortsรฆtter ved ร˜VERST"
+
+#, c-format
+msgid "Need encryption key for \"%s\""
+msgstr "Behรธver krypteringsnรธgle til \"%s\""
+
+msgid "empty keys are not allowed"
+msgstr "tomme nรธgler er ikke tilladt"
+
+msgid "dictionary is locked"
+msgstr "ordbog er lรฅst"
+
+msgid "list is locked"
+msgstr "liste er lรฅst"
+
+#, c-format
+msgid "failed to add key '%s' to dictionary"
+msgstr "kunne ikke tilfรธje nรธglen '%s' til ordbog"
+
+#, c-format
+msgid "index must be int or slice, not %s"
+msgstr "indeks skal vรฆre heltal eller slice, ikke %s"
+
+#, c-format
+msgid "expected str() or unicode() instance, but got %s"
+msgstr "ventede str()- eller unicode()-instans, men fik %s"
+
+#, c-format
+msgid "expected bytes() or str() instance, but got %s"
+msgstr "ventede bytes()- eller str()-instans, min fik %s"
+
+#, c-format
+msgid ""
+"expected int(), long() or something supporting coercing to long(), but got %s"
+msgstr ""
+"ventede int(), long() eller noget som understรธtter coercing til long(), min "
+"fik %s"
+
+#, c-format
+msgid "expected int() or something supporting coercing to int(), but got %s"
+msgstr ""
+"ventede int() eller noget som understรธtter coercing til int(), min fik %s"
+
+msgid "value is too large to fit into C int type"
+msgstr "vรฆrdi er for stor til at passe i C-heltalstype"
+
+msgid "value is too small to fit into C int type"
+msgstr "vรฆrdi er for lille til at passe i C-heltalstype"
+
+msgid "number must be greater than zero"
+msgstr "nummer skal vรฆre stรธrre end nul"
+
+msgid "number must be greater or equal to zero"
+msgstr "nummer skal vรฆre stรธrre end eller lig med nul"
+
+msgid "can't delete OutputObject attributes"
+msgstr "kan ikke slette OutputObject-attributter"
+
+#, c-format
+msgid "invalid attribute: %s"
+msgstr "ugyldig attribut: %s"
+
+msgid "E264: Python: Error initialising I/O objects"
+msgstr "E264: Python: Fejl ved initialisering af I/O-objekter"
+
+msgid "failed to change directory"
+msgstr "kunne ikke skifte mappe"
+
+#, c-format
+msgid "expected 3-tuple as imp.find_module() result, but got %s"
+msgstr "ventede 3-tuple som imp.find_module() resultat, men fik %s"
+
+#, c-format
+msgid "expected 3-tuple as imp.find_module() result, but got tuple of size %d"
+msgstr ""
+"ventede 3-tuple som imp.find_module() resultat, men fik tuple af stรธrrelse %"
+"d"
+
+msgid "internal error: imp.find_module returned tuple with NULL"
+msgstr "intern fejl: imp.find_module returnerede tuple med NULL"
+
+msgid "cannot delete vim.Dictionary attributes"
+msgstr "kan ikke slette vim.Dictionary-attributter"
+
+msgid "cannot modify fixed dictionary"
+msgstr "kan ikke รฆndre fast ordbog"
+
+#, c-format
+msgid "cannot set attribute %s"
+msgstr "kan ikke sรฆtte attributten %s"
+
+msgid "hashtab changed during iteration"
+msgstr "hashtab รฆndret under gennemlรธb"
+
+#, c-format
+msgid "expected sequence element of size 2, but got sequence of size %d"
+msgstr "ventede sekvenselement af stรธrrelse 2, men fik sekvens af stรธrrelse %d"
+
+msgid "list constructor does not accept keyword arguments"
+msgstr "liste-constructor accepterer ikke nรธgleord-argumenter"
+
+msgid "list index out of range"
+msgstr "listeindeks udenfor omrรฅde"
+
+#, c-format
+msgid "internal error: failed to get vim list item %d"
+msgstr "intern fejl: kunne ikke hente vim-listepunkt %d"
+
+msgid "slice step cannot be zero"
+msgstr "slice-trin mรฅ ikke vรฆre nul"
+
+#, c-format
+msgid "attempt to assign sequence of size greater than %d to extended slice"
+msgstr "forsรธg pรฅ at tildele sekvens som er stรธrre end %d til udvidet slice"
+
+#, c-format
+msgid "internal error: no vim list item %d"
+msgstr "intern fejl: intet vim-listepunkt %d"
+
+msgid "internal error: not enough list items"
+msgstr "intern fejl: ikke nok listepunkter"
+
+msgid "internal error: failed to add item to list"
+msgstr "intern fejl: kunne ikke tilfรธje punkt til liste"
+
+#, c-format
+msgid "attempt to assign sequence of size %d to extended slice of size %d"
+msgstr ""
+"forsรธg pรฅ at tildele sekvens af stรธrrelsen %d til udvidet slice af "
+"stรธrrelsen %d"
+
+msgid "failed to add item to list"
+msgstr "kunne ikke tilfรธje punkt til liste"
+
+msgid "cannot delete vim.List attributes"
+msgstr "kan ikke slette vim.List-attributter"
+
+msgid "cannot modify fixed list"
+msgstr "kan ikke รฆndre fast liste"
+
+#, c-format
+msgid "unnamed function %s does not exist"
+msgstr "unavngivet funktion %s findes ikke"
+
+#, c-format
+msgid "function %s does not exist"
+msgstr "funktionen %s findes ikke"
+
+#, c-format
+msgid "failed to run function %s"
+msgstr "kunne ikke kรธre funktionen %s"
+
+msgid "unable to get option value"
+msgstr "kan ikke hente tilvalgsvรฆrdi"
+
+msgid "internal error: unknown option type"
+msgstr "intern fejl: ukendt tilvalgstype"
+
+msgid "problem while switching windows"
+msgstr "problem ved skift af vinduer"
+
+#, c-format
+msgid "unable to unset global option %s"
+msgstr "kan ikke fjerne det globale tilvalg %s"
+
+#, c-format
+msgid "unable to unset option %s which does not have global value"
+msgstr "kan ikke fjerne tilvalget %s som ikke har global vรฆrdi"
+
+msgid "attempt to refer to deleted tab page"
+msgstr "forsรธg pรฅ at referere til slettet fanebladsside"
+
+msgid "no such tab page"
+msgstr "ingen sรฅdan fanebladsside"
+
+msgid "attempt to refer to deleted window"
+msgstr "forsรธg pรฅ at referere til slettet vindue"
+
+msgid "readonly attribute: buffer"
+msgstr "skrivebeskyttet attribut: buffer"
+
+msgid "cursor position outside buffer"
+msgstr "markรธrposition udenfor buffer"
+
+msgid "no such window"
+msgstr "intet sรฅdan vindue"
+
+msgid "attempt to refer to deleted buffer"
+msgstr "forsรธg pรฅ at referere til slettet buffer"
+
+msgid "failed to rename buffer"
+msgstr "kunne ikke omdรธbe bufferen"
+
+msgid "mark name must be a single character"
+msgstr "mรฆrkenavn skal vรฆre รฉt tegn"
+
+#, c-format
+msgid "expected vim.Buffer object, but got %s"
+msgstr "ventede vim.Buffer-objekt, men fik %s"
+
+#, c-format
+msgid "failed to switch to buffer %d"
+msgstr "kunne ikke skifte til bufferen %d"
+
+#, c-format
+msgid "expected vim.Window object, but got %s"
+msgstr "ventede vim.Window-objekt, men fik %s"
+
+msgid "failed to find window in the current tab page"
+msgstr "kunne ikke finde vindue i den nuvรฆrende fanebladsside"
+
+msgid "did not switch to the specified window"
+msgstr "skiftede ikke til det angivne vindue"
+
+#, c-format
+msgid "expected vim.TabPage object, but got %s"
+msgstr "ventede vim.TabPage-objekt, men fik %s"
+
+msgid "did not switch to the specified tab page"
+msgstr "skiftede ikke til den angivne fanebladsside"
+
+msgid "failed to run the code"
+msgstr "kunne ikke kรธre koden"
+
+msgid "E858: Eval did not return a valid python object"
+msgstr "E858: Eval returnerede ikke et gyldigt python-objekt"
+
+msgid "E859: Failed to convert returned python object to vim value"
+msgstr "E859: Kunne ikke konvertere returnerede python-objekt til vim-vรฆrdi"
+
+#, c-format
+msgid "unable to convert %s to vim dictionary"
+msgstr "kan ikke konvertere %s til vim-ordbog"
+
+#, c-format
+msgid "unable to convert %s to vim list"
+msgstr "kan ikke konvertere %s til vim-liste"
+
+#, c-format
+msgid "unable to convert %s to vim structure"
+msgstr "kan ikke konvertere %s til vim-struktur"
+
+msgid "internal error: NULL reference passed"
+msgstr "intern fejl: NULL-reference givet"
+
+msgid "internal error: invalid value type"
+msgstr "intern fejl: ugyldig vรฆrditype"
+
+msgid ""
+"Failed to set path hook: sys.path_hooks is not a list\n"
+"You should now do the following:\n"
+"- append vim.path_hook to sys.path_hooks\n"
+"- append vim.VIM_SPECIAL_PATH to sys.path\n"
+msgstr ""
+"Kunne ikke sรฆtte sti-hook: sys.path_hooks er ikke en liste\n"
+"Du bรธr nu gรธre fรธlgende:\n"
+"- tilfรธj vim.path_hook til slutningen af sys.path_hooks\n"
+"- tilfรธj vim.VIM_SPECIAL_PATH til slutningen af sys.path\n"
+
+msgid ""
+"Failed to set path: sys.path is not a list\n"
+"You should now append vim.VIM_SPECIAL_PATH to sys.path"
+msgstr ""
+"Kunne ikke sรฆtte sti: sys.path er ikke en liste\n"
+"Du bรธr nu tilfรธje vim.VIM_SPECIAL_PATH til slutningen af sys.path"
+
+msgid ""
+"Vim macro files (*.vim)\t*.vim\n"
+"All Files (*.*)\t*.*\n"
+msgstr ""
+"Vim-makrofiler (*.vim)\t*.vim\n"
+"Alle filer (*.*)\t*.*\n"
+
+msgid "All Files (*.*)\t*.*\n"
+msgstr "Alle filer (*.*)\t*.*\n"
+
+msgid ""
+"All Files (*.*)\t*.*\n"
+"C source (*.c, *.h)\t*.c;*.h\n"
+"C++ source (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
+"VB code (*.bas, *.frm)\t*.bas;*.frm\n"
+"Vim files (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
+msgstr ""
+"Alle filer (*.*)\t*.*\n"
+"C-kildekode (*.c, *.h)\t*.c;*.h\n"
+"C++-kildekode (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
+"VB-kode (*.bas, *.frm)\t*.bas;*.frm\n"
+"Vim-filer (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
+
+msgid ""
+"Vim macro files (*.vim)\t*.vim\n"
+"All Files (*)\t*\n"
+msgstr ""
+"Vim-makrofiler (*.vim)\t*.vim\n"
+"Alle filer (*)\t*\n"
+
+msgid "All Files (*)\t*\n"
+msgstr "Alle filer (*)\t*\n"
+
+msgid ""
+"All Files (*)\t*\n"
+"C source (*.c, *.h)\t*.c;*.h\n"
+"C++ source (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
+"Vim files (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
+msgstr ""
+"Alle filer (*)\t*\n"
+"C-kildekode (*.c, *.h)\t*.c;*.h\n"
+"C++-kildekode (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
+"Vim-filer (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
diff --git a/src/nvim/po/de.po b/src/nvim/po/de.po
index 4950533a21..a6ba8476d8 100644
--- a/src/nvim/po/de.po
+++ b/src/nvim/po/de.po
@@ -12,7 +12,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-06-26 15:13+0200\n"
"PO-Revision-Date: 2008-05-24 17:26+0200\n"
-"Last-Translator: Georg Dahn <georg.dahn@gmail.com>\n"
+"Last-Translator: was: Georg Dahn\n"
"Language-Team: German <de@li.org>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
@@ -377,7 +377,7 @@ msgstr " Definitions-Ergไnzung (^D^N^P)"
#: ../edit.c:92
msgid " Dictionary completion (^K^N^P)"
-msgstr " W๖rterbuch-Ergไnzung (^K^N^P) "
+msgstr " Dictionary-Ergไnzung (^K^N^P) "
#: ../edit.c:93
msgid " Thesaurus completion (^T^N^P)"
@@ -401,7 +401,7 @@ msgstr " Vorschlag der Rechtschreibprfung (s^N^P)"
#: ../edit.c:98
msgid " Keyword Local completion (^N^P)"
-msgstr " Lokale Schlsselwort-Ergไnzung(^N^P)"
+msgstr " Lokale Stichwort-Ergไnzung(^N^P)"
#: ../edit.c:101
msgid "Hit end of paragraph"
@@ -443,7 +443,7 @@ msgstr "Durchsuche: %s"
#: ../edit.c:3513
msgid "Scanning tags."
-msgstr "Durchsuchen von Tags."
+msgstr "Durchsuche Tags"
#: ../edit.c:4418
msgid " Adding"
@@ -633,6 +633,9 @@ msgstr ""
#: ../ex_cmds.c:2433
#, c-format
+msgid "Pattern not found: %s"
+msgstr "Muster nicht gefunden: %s"
+
msgid ""
"File permissions of \"%s\" are read-only.\n"
"It may still be possible to write it.\n"
@@ -713,11 +716,6 @@ msgstr "E148: Regulไrer Ausdruck fehlt in global"
msgid "Pattern found in every line: %s"
msgstr "Muster in jeder Zeile gefunden: %s"
-#: ../ex_cmds.c:4504
-#, c-format
-msgid "Pattern not found: %s"
-msgstr "Muster nicht gefunden: %s"
-
#: ../ex_cmds.c:4581
msgid ""
"\n"
@@ -1920,7 +1918,7 @@ msgstr "E216: Keine solche Gruppe oder Ereignis: %s"
#: ../fileio.c:5993
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
"--- Autokommandos ---"
@@ -1944,7 +1942,7 @@ msgstr "E218: Autokommandos zu tief verschachtelt"
#: ../fileio.c:7042
#, c-format
-msgid "%s Auto commands for \"%s\""
+msgid "%s Autocommands for \"%s\""
msgstr "%s Autokommandos fr \"%s\""
#: ../fileio.c:7048
@@ -1996,7 +1994,7 @@ msgstr "E223: rekursive Zuordnung"
#: ../getchar.c:2835
#, c-format
msgid "E224: global abbreviation already exists for %s"
-msgstr "E224: Globale Abkrzung fr %s existiert bereits"
+msgstr "E224: Globale Kurzform fr %s existiert bereits"
#: ../getchar.c:2838
#, c-format
@@ -2137,11 +2135,6 @@ msgstr "E900: Ungltige Job-ID"
msgid "E901: Job table is full"
msgstr "E901: Job-Tabelle ist voll"
-#: ../globals.h:1021
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr "E902: \"%s\" ist nicht ausfhrbar"
-
#: ../globals.h:1023
#, c-format
msgid "E364: Library call failed for \"%s()\""
@@ -2169,7 +2162,7 @@ msgstr "E23: Keine alternative Datei"
#: ../globals.h:1031
msgid "E24: No such abbreviation"
-msgstr "E24: Keine Abkrzung gefunden"
+msgstr "E24: Diese Kurzform nicht gefunden"
#: ../globals.h:1032
msgid "E477: No ! allowed"
@@ -2842,7 +2835,7 @@ msgstr "-q [Fehler-Datei] ๖ffne Datei mit erstem Fehler"
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
@@ -4778,8 +4771,8 @@ msgstr "Achtung: Region %s nicht untersttzt"
#: ../spell.c:4364
#, c-format
-msgid "Reading affix file %s ..."
-msgstr "Lese Affix-Datei %s ..."
+msgid "Reading affix file %s..."
+msgstr "Lese Affix-Datei %s..."
#: ../spell.c:4403 ../spell.c:5449 ../spell.c:5954
#, c-format
@@ -4945,8 +4938,8 @@ msgstr ""
#: ../spell.c:5416
#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "Lese W๖rterbuch-Datei %s ..."
+msgid "Reading dictionary file %s..."
+msgstr "Lese W๖rterbuch-Datei %s..."
#: ../spell.c:5425
#, c-format
@@ -4980,8 +4973,8 @@ msgstr "%d Wort(e) mit Nicht-ASCII-Zeichen ignoriert in %s"
#: ../spell.c:5929
#, c-format
-msgid "Reading word file %s ..."
-msgstr "Lese Wort-Datei %s ..."
+msgid "Reading word file %s..."
+msgstr "Lese Wort-Datei %s..."
#: ../spell.c:5969
#, c-format
@@ -5050,8 +5043,8 @@ msgstr "Gesamte Anzahl von W๖rtern: %d"
#: ../spell.c:7468
#, c-format
-msgid "Writing suggestion file %s ..."
-msgstr "Schreibe Datei %s fr Vorschlไge ..."
+msgid "Writing suggestion file %s..."
+msgstr "Schreibe Datei %s fr Vorschlไge..."
#: ../spell.c:7520 ../spell.c:7740
#, c-format
@@ -5077,8 +5070,8 @@ msgstr "Achtung: Sowohl zusammengesetzte W๖rter als auch NOBREAK angegeben"
#: ../spell.c:7733
#, c-format
-msgid "Writing spell file %s ..."
-msgstr "Schreibe Rechtschreibw๖rterbuch %s ..."
+msgid "Writing spell file %s..."
+msgstr "Schreibe Rechtschreibw๖rterbuch %s..."
#: ../spell.c:7738
msgid "Done!"
@@ -6493,7 +6486,7 @@ msgid ""
"\tLast set from "
msgstr ""
"\n"
-"\tZuletzt gesetzt von "
+"\tZuletzt gesetzt in "
#: ../eval.c:18682
msgid "No old files"
diff --git a/src/nvim/po/en_GB.po b/src/nvim/po/en_GB.po
index b4b38e11e3..00a05195b4 100644
--- a/src/nvim/po/en_GB.po
+++ b/src/nvim/po/en_GB.po
@@ -2623,11 +2623,6 @@ msgstr ""
msgid "E901: Job table is full"
msgstr ""
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
#: ../globals.h:1024
#, c-format
msgid "E364: Library call failed for \"%s()\""
@@ -4128,10 +4123,6 @@ msgstr ""
msgid "E354: Invalid register name: '%s'"
msgstr ""
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr "Messages maintainer: Mike Williams <mrw@eandem.co.uk>"
-
#: ../message.c:986
msgid "Interrupt: "
msgstr ""
diff --git a/src/nvim/po/eo.po b/src/nvim/po/eo.po
index 6bc76506ae..d1ce47d97c 100644
--- a/src/nvim/po/eo.po
+++ b/src/nvim/po/eo.po
@@ -5,7 +5,7 @@
#
# UNUA TRADUKISTO Dominique PELLE <dominique.pelle ฤ‰e gmail.com>
# PROVLEGANTO(J) Felipe CASTRO <fefcas ฤ‰e gmail.com>
-# Antono MECHELYNCK <antoine.mechelynck ฤ‰e skynet.be>
+# Antono MECHELYNCK <antoine.mechelynck ฤ‰e gmail.com>
# Yves NEVELSTEEN
#
# Uzitaj vortaroj kaj fakvortaroj:
@@ -13,18 +13,12 @@
# Komputeko: http://komputeko.net/index_eo.php
# Komputada leksikono: http://bertilow.com/div/komputada_leksikono/
#
-# Lasta versio:
-# http://dominique.pelle.free.fr/vim-eo.php
-#
-# ฤˆiu komento estas bonvenata...
-# Every remark is welcome...
-#
msgid ""
msgstr ""
"Project-Id-Version: Vim(Esperanto)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-02-13 23:42+0100\n"
-"PO-Revision-Date: 2016-02-13 23:45+0100\n"
+"POT-Creation-Date: 2017-10-02 22:42+0200\n"
+"PO-Revision-Date: 2017-10-02 22:57+0200\n"
"Last-Translator: Dominique PELLร‰ <dominique.pelle@gmail.com>\n"
"Language-Team: \n"
"Language: eo\n"
@@ -32,203 +26,174 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ../api/private/helpers.c:201
-#, fuzzy
-msgid "Unable to get option value"
-msgstr "fiaskis akiri valoron de opcio"
+msgid "E831: bf_key_init() called with empty password"
+msgstr "E831: bf_key_init() alvokita kun malplena pasvorto"
-#: ../api/private/helpers.c:204
-#, fuzzy
-msgid "internal error: unknown option type"
-msgstr "interna eraro: neniu vim-a listero"
+msgid "E820: sizeof(uint32_t) != 4"
+msgstr "E820: sizeof(uint32_t) != 4"
+
+msgid "E817: Blowfish big/little endian use wrong"
+msgstr "E817: Misuzo de pezkomenca/pezfina en blowfish"
+
+msgid "E818: sha256 test failed"
+msgstr "E818: Testo de sha256 malsukcesis"
+
+msgid "E819: Blowfish test failed"
+msgstr "E819: Testo de blowfish malsukcesis"
-#: ../buffer.c:92
msgid "[Location List]"
msgstr "[Listo de lokoj]"
# DP: ฤˆu vere indas traduki Quickfix?
-#: ../buffer.c:93
msgid "[Quickfix List]"
msgstr "[Listo de rapidriparoj]"
-#: ../buffer.c:94
msgid "E855: Autocommands caused command to abort"
msgstr "E855: Aลญtokomandoj haltigis komandon"
-#: ../buffer.c:135
msgid "E82: Cannot allocate any buffer, exiting..."
msgstr "E82: Ne eblas disponigi iun ajn bufron, nun eliras..."
-#: ../buffer.c:138
msgid "E83: Cannot allocate buffer, using other one..."
msgstr "E83: Ne eblas disponigi bufron, nun uzas alian..."
-#: ../buffer.c:763
+msgid "E931: Buffer cannot be registered"
+msgstr "E931: Bufro ne povas esti registrita"
+
+msgid "E937: Attempt to delete a buffer that is in use"
+msgstr "E937: Provo de forviลo de bufro, kiu estas en uzo"
+
msgid "E515: No buffers were unloaded"
msgstr "E515: Neniu bufro estis malลargita"
-#: ../buffer.c:765
msgid "E516: No buffers were deleted"
msgstr "E516: Neniu bufro estis forviลita"
-#: ../buffer.c:767
msgid "E517: No buffers were wiped out"
msgstr "E517: Neniu bufro estis detruita"
-#: ../buffer.c:772
-msgid "1 buffer unloaded"
-msgstr "1 bufro malลargita"
-
-#: ../buffer.c:774
#, c-format
-msgid "%d buffers unloaded"
-msgstr "%d bufroj malลargitaj"
+msgid "%d buffer unloaded"
+msgid_plural "%d buffers unloaded"
+msgstr[0] "%d bufro malลargita"
+msgstr[1] "%d bufroj malลargitaj"
-#: ../buffer.c:777
-msgid "1 buffer deleted"
-msgstr "1 bufro forviลita"
-
-#: ../buffer.c:779
#, c-format
-msgid "%d buffers deleted"
-msgstr "%d bufroj forviลitaj"
-
-#: ../buffer.c:782
-msgid "1 buffer wiped out"
-msgstr "1 bufro detruita"
+msgid "%d buffer deleted"
+msgid_plural "%d buffers deleted"
+msgstr[0] "%d bufro forviลita"
+msgstr[1] "%d bufroj forviลitaj"
-#: ../buffer.c:784
#, c-format
-msgid "%d buffers wiped out"
-msgstr "%d bufroj detruitaj"
+msgid "%d buffer wiped out"
+msgid_plural "%d buffers wiped out"
+msgstr[0] "%d bufro detruita"
+msgstr[1] "%d bufroj detruitaj"
-#: ../buffer.c:806
msgid "E90: Cannot unload last buffer"
msgstr "E90: Ne eblas malลargi la lastan bufron"
-#: ../buffer.c:874
msgid "E84: No modified buffer found"
msgstr "E84: Neniu modifita bufro trovita"
-#. back where we started, didn't find anything.
-#: ../buffer.c:903
msgid "E85: There is no listed buffer"
msgstr "E85: Estas neniu listigita bufro"
-#: ../buffer.c:915
msgid "E87: Cannot go beyond last buffer"
msgstr "E87: Ne eblas iri preter la lastan bufron"
-#: ../buffer.c:917
msgid "E88: Cannot go before first buffer"
msgstr "E88: Ne eblas iri antaลญ la unuan bufron"
-#: ../buffer.c:945
#, c-format
-msgid ""
-"E89: No write since last change for buffer %<PRId64> (add ! to override)"
+msgid "E89: No write since last change for buffer %ld (add ! to override)"
msgstr ""
-"E89: Neniu skribo de post la lasta ลanฤo de la bufro %<PRId64> (aldonu ! por "
+"E89: Neniu skribo de post la lasta ลanฤo de la bufro %ld (aldonu ! por "
"transpasi)"
-#. wrap around (may cause duplicates)
-#: ../buffer.c:1423
+msgid "E948: Job still running (add ! to end the job)"
+msgstr "E948: Tasko akoraลญ aktiva (aldonu ! por fini la taskon)"
+
+msgid "E37: No write since last change (add ! to override)"
+msgstr "E37: Neniu skribo de post lasta ลanฤo (aldonu ! por transpasi)"
+
+msgid "E948: Job still running"
+msgstr "E948: Tasko ankoraลญ aktiva"
+
+msgid "E37: No write since last change"
+msgstr "E37: Neniu skribo de post lasta ลanฤo"
+
msgid "W14: Warning: List of file names overflow"
msgstr "W14: Averto: Listo de dosiernomoj troas"
-#: ../buffer.c:1555 ../quickfix.c:3361
#, c-format
-msgid "E92: Buffer %<PRId64> not found"
-msgstr "E92: Bufro %<PRId64> ne trovita"
+msgid "E92: Buffer %ld not found"
+msgstr "E92: Bufro %ld ne trovita"
-#: ../buffer.c:1798
#, c-format
msgid "E93: More than one match for %s"
msgstr "E93: Pli ol unu kongruo kun %s"
-#: ../buffer.c:1800
#, c-format
msgid "E94: No matching buffer for %s"
msgstr "E94: Neniu bufro kongruas kun %s"
-#: ../buffer.c:2161
#, c-format
-msgid "line %<PRId64>"
-msgstr "linio %<PRId64>"
+msgid "line %ld"
+msgstr "linio %ld"
-#: ../buffer.c:2233
msgid "E95: Buffer with this name already exists"
msgstr "E95: Bufro kun tiu nomo jam ekzistas"
-#: ../buffer.c:2498
msgid " [Modified]"
msgstr "[Modifita]"
-#: ../buffer.c:2501
msgid "[Not edited]"
msgstr "[Ne redaktita]"
-#: ../buffer.c:2504
msgid "[New file]"
msgstr "[Nova dosiero]"
-#: ../buffer.c:2505
msgid "[Read errors]"
msgstr "[Eraroj de legado]"
-#: ../buffer.c:2506 ../buffer.c:3217 ../fileio.c:1807 ../screen.c:4895
msgid "[RO]"
msgstr "[Nurlegebla]"
-#: ../buffer.c:2507 ../fileio.c:1807
msgid "[readonly]"
msgstr "[nurlegebla]"
-#: ../buffer.c:2524
-#, c-format
-msgid "1 line --%d%%--"
-msgstr "1 linio --%d%%--"
-
-#: ../buffer.c:2526
#, c-format
-msgid "%<PRId64> lines --%d%%--"
-msgstr "%<PRId64> linioj --%d%%--"
+msgid "%ld line --%d%%--"
+msgid_plural "%ld lines --%d%%--"
+msgstr[0] "%ld linio --%d%%--"
+msgstr[1] "%ld linioj --%d%%--"
-#: ../buffer.c:2530
#, c-format
-msgid "line %<PRId64> of %<PRId64> --%d%%-- col "
-msgstr "linio %<PRId64> de %<PRId64> --%d%%-- kol "
+msgid "line %ld of %ld --%d%%-- col "
+msgstr "linio %ld de %ld --%d%%-- kol "
-#: ../buffer.c:2632 ../buffer.c:4292 ../memline.c:1554
msgid "[No Name]"
msgstr "[Neniu nomo]"
-#. must be a help buffer
-#: ../buffer.c:2667
msgid "help"
msgstr "helpo"
-#: ../buffer.c:3225 ../screen.c:4883
msgid "[Help]"
msgstr "[Helpo]"
-#: ../buffer.c:3254 ../screen.c:4887
msgid "[Preview]"
msgstr "[Antaลญvido]"
-#: ../buffer.c:3528
msgid "All"
msgstr "ฤˆio"
-#: ../buffer.c:3528
msgid "Bot"
msgstr "Subo"
-#: ../buffer.c:3531
msgid "Top"
msgstr "Supro"
-#: ../buffer.c:4244
msgid ""
"\n"
"# Buffer list:\n"
@@ -236,12 +201,16 @@ msgstr ""
"\n"
"# Listo de bufroj:\n"
-#: ../buffer.c:4289
+msgid "E382: Cannot write, 'buftype' option is set"
+msgstr "E382: Ne eblas skribi, opcio 'buftype' estas ลaltita"
+
+msgid "[Prompt]"
+msgstr "[Invito]"
+
msgid "[Scratch]"
msgstr "[Malneto]"
# DP: Vidu ":help sign-support" por klarigo pri "Sign"
-#: ../buffer.c:4529
msgid ""
"\n"
"--- Signs ---"
@@ -249,630 +218,396 @@ msgstr ""
"\n"
"--- Emfazaj simbolaฤตoj ---"
-#: ../buffer.c:4538
#, c-format
msgid "Signs for %s:"
msgstr "Emfazaj simbolaฤตoj de %s:"
-#: ../buffer.c:4543
#, c-format
-msgid " line=%<PRId64> id=%d name=%s"
-msgstr " linio=%<PRId64> id=%d nomo=%s"
+msgid " line=%ld id=%d name=%s"
+msgstr " linio=%ld id=%d nomo=%s"
-#: ../cursor_shape.c:68
-msgid "E545: Missing colon"
-msgstr "E545: Mankas dupunkto"
+msgid "E902: Cannot connect to port"
+msgstr "E902: Ne eblas konekti al pordo"
-#: ../cursor_shape.c:70 ../cursor_shape.c:94
-msgid "E546: Illegal mode"
-msgstr "E546: Reฤimo nepermesata"
+msgid "E901: gethostbyname() in channel_open()"
+msgstr "E901: gethostbyname() en channel_open()"
-#: ../cursor_shape.c:134
-msgid "E548: digit expected"
-msgstr "E548: cifero atendata"
+msgid "E898: socket() in channel_open()"
+msgstr "E898: gethostbyname() en channel_open()"
-#: ../cursor_shape.c:138
-msgid "E549: Illegal percentage"
-msgstr "E549: Nevalida procento"
+msgid "E903: received command with non-string argument"
+msgstr "E903: ricevis komandon kun argumento, kiu ne estas ฤ‰eno"
+
+msgid "E904: last argument for expr/call must be a number"
+msgstr "E904: lasta argumento de \"expr/call\" devas esti nombro"
+
+msgid "E904: third argument for call must be a list"
+msgstr "E904: tria argumento de \"call\" devas esti listo"
-#: ../diff.c:146
#, c-format
-msgid "E96: Can not diff more than %<PRId64> buffers"
-msgstr "E96: Ne eblas dosierdiferenci pli ol %<PRId64> bufrojn"
+msgid "E905: received unknown command: %s"
+msgstr "E905: nekonata komando ricevita: %s"
+
+#, c-format
+msgid "E630: %s(): write while not connected"
+msgstr "E630: %s(): konservo dum nekonektita"
+
+#, c-format
+msgid "E631: %s(): write failed"
+msgstr "E631: %s(): Konservo malsukcesis"
+
+#, c-format
+msgid "E917: Cannot use a callback with %s()"
+msgstr "E917: Ne eblas uzi reagfunkcion kun %s()"
+
+msgid "E912: cannot use ch_evalexpr()/ch_sendexpr() with a raw or nl channel"
+msgstr "E912: ne eblas uzi ch_evalexpr()/ch_sendexpr() kun kruda aลญ nl kanalo"
+
+msgid "E906: not an open channel"
+msgstr "E906: ne estas malfermita kanalo"
+
+msgid "E920: _io file requires _name to be set"
+msgstr "E920: dosiero _io bezonas _name"
+
+msgid "E915: in_io buffer requires in_buf or in_name to be set"
+msgstr "E915: bufro in_io bezonas in_buf aลญ in_name"
+
+#, c-format
+msgid "E918: buffer must be loaded: %s"
+msgstr "E918: bufro devas esti ลargita: %s"
+
+msgid "E821: File is encrypted with unknown method"
+msgstr "E821: Dosiero estas ฤ‰ifrita per nekonata metodo"
+
+msgid "Warning: Using a weak encryption method; see :help 'cm'"
+msgstr "Averto: uzo de malfortika ฤ‰ifrada metodo; vidu :help 'cm'"
+
+msgid "Enter encryption key: "
+msgstr "Tajpu la ลlosilon de ฤ‰ifrado: "
+
+msgid "Enter same key again: "
+msgstr "Tajpu la ลlosilon denove: "
+
+msgid "Keys don't match!"
+msgstr "ลœlosiloj ne kongruas!"
+
+msgid "[crypted]"
+msgstr "[ฤ‰ifrita]"
+
+#, c-format
+msgid "E720: Missing colon in Dictionary: %s"
+msgstr "E720: Mankas dupunkto en la vortaro: %s"
+
+#, c-format
+msgid "E721: Duplicate key in Dictionary: \"%s\""
+msgstr "E721: Ripetita ลlosilo en la vortaro: \"%s\""
+
+#, c-format
+msgid "E722: Missing comma in Dictionary: %s"
+msgstr "E722: Mankas komo en la vortaro: %s"
+
+#, c-format
+msgid "E723: Missing end of Dictionary '}': %s"
+msgstr "E723: Mankas fino de vortaro '}': %s"
+
+msgid "extend() argument"
+msgstr "argumento de extend()"
+
+#, c-format
+msgid "E737: Key already exists: %s"
+msgstr "E737: ลœlosilo jam ekzistas: %s"
+
+#, c-format
+msgid "E96: Cannot diff more than %ld buffers"
+msgstr "E96: Ne eblas dosierdiferenci pli ol %ld bufrojn"
-#: ../diff.c:753
msgid "E810: Cannot read or write temp files"
msgstr "E810: Ne eblas legi aลญ skribi provizorajn dosierojn"
-#: ../diff.c:755
msgid "E97: Cannot create diffs"
msgstr "E97: Ne eblas krei dosierdiferencojn"
-#: ../diff.c:966
+msgid "Patch file"
+msgstr "Flika dosiero"
+
msgid "E816: Cannot read patch output"
msgstr "E816: Ne eblas legi eliron de flikilo \"patch\""
-#: ../diff.c:1220
msgid "E98: Cannot read diff output"
msgstr "E98: Ne eblas legi eliron de dosierdiferencilo \"diff\""
-#: ../diff.c:2081
msgid "E99: Current buffer is not in diff mode"
msgstr "E99: Aktuala bufro ne estas en dosierdiferenca reฤimo"
-#: ../diff.c:2100
msgid "E793: No other buffer in diff mode is modifiable"
msgstr "E793: Neniu alia bufro en dosierdiferenca reฤimo estas modifebla"
-#: ../diff.c:2102
msgid "E100: No other buffer in diff mode"
msgstr "E100: Neniu alia bufro en dosierdiferenca reฤimo"
-#: ../diff.c:2112
msgid "E101: More than two buffers in diff mode, don't know which one to use"
msgstr "E101: Pli ol du bufroj en dosierdiferenca reฤimo, ne scias kiun uzi"
-#: ../diff.c:2141
#, c-format
msgid "E102: Can't find buffer \"%s\""
msgstr "E102: Ne eblas trovi bufron \"%s\""
-#: ../diff.c:2152
#, c-format
msgid "E103: Buffer \"%s\" is not in diff mode"
msgstr "E103: Bufro \"%s\" ne estas en dosierdiferenca reฤimo"
-#: ../diff.c:2193
msgid "E787: Buffer changed unexpectedly"
msgstr "E787: Bufro ลanฤiฤis neatendite"
-#: ../digraph.c:1598
msgid "E104: Escape not allowed in digraph"
msgstr "E104: Eskapsigno nepermesebla en duliteraฤตo"
-#: ../digraph.c:1760
msgid "E544: Keymap file not found"
msgstr "E544: Dosiero de klavmapo ne troveblas"
-#: ../digraph.c:1785
msgid "E105: Using :loadkeymap not in a sourced file"
msgstr "E105: Uzo de \":loadkeymap\" nur eblas en vim-skripto"
-#: ../digraph.c:1821
msgid "E791: Empty keymap entry"
msgstr "E791: Malplena rikordo en klavmapo"
-#: ../edit.c:82
msgid " Keyword completion (^N^P)"
msgstr " Kompletigo de ลlosilvorto (^N^P)"
-#. ctrl_x_mode == 0, ^P/^N compl.
-#: ../edit.c:83
msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
msgstr " Reฤimo ^X (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-#: ../edit.c:85
msgid " Whole line completion (^L^N^P)"
msgstr " Kompletigo de tuta linio (^L^N^P)"
-#: ../edit.c:86
msgid " File name completion (^F^N^P)"
msgstr " Kompletigo de dosiernomo (^F^N^P)"
-#: ../edit.c:87
msgid " Tag completion (^]^N^P)"
msgstr " Kompletigo de etikedo (^]^N^P)"
-#: ../edit.c:88
msgid " Path pattern completion (^N^P)"
msgstr " Kompletigo de ลablona dosierindiko (^N^P)"
-#: ../edit.c:89
msgid " Definition completion (^D^N^P)"
msgstr " Kompletigo de difino (^D^N^P)"
-#: ../edit.c:91
msgid " Dictionary completion (^K^N^P)"
msgstr " Kompletigo de vortaro (^K^N^P)"
-#: ../edit.c:92
msgid " Thesaurus completion (^T^N^P)"
msgstr " Kompletigo de tezaลญro (^T^N^P)"
-#: ../edit.c:93
msgid " Command-line completion (^V^N^P)"
msgstr " Kompletigo de komanda linio (^V^N^P)"
-#: ../edit.c:94
msgid " User defined completion (^U^N^P)"
msgstr " Kompletigo difinita de uzanto (^U^N^P)"
# DP: ฤˆu eblas trovi pli bonan tradukon?
-#: ../edit.c:95
msgid " Omni completion (^O^N^P)"
msgstr " Kompletigo Omni (^O^N^P)"
-#: ../edit.c:96
msgid " Spelling suggestion (s^N^P)"
msgstr " Sugesto de literumo (s^N^P)"
-#: ../edit.c:97
msgid " Keyword Local completion (^N^P)"
msgstr " Kompletigo loka de ลlosilvorto (^N/^P)"
-#: ../edit.c:100
msgid "Hit end of paragraph"
msgstr "Atingis finon de alineo"
-#: ../edit.c:101
msgid "E839: Completion function changed window"
msgstr "E839: Kompletiga funkcio ลanฤis la fenestron"
-#: ../edit.c:102
msgid "E840: Completion function deleted text"
msgstr "E840: Kompletiga funkcio forviลis tekston"
-#: ../edit.c:1847
msgid "'dictionary' option is empty"
msgstr "La opcio 'dictionary' estas malplena"
-#: ../edit.c:1848
msgid "'thesaurus' option is empty"
msgstr "La opcio 'thesaurus' estas malplena"
-#: ../edit.c:2655
#, c-format
msgid "Scanning dictionary: %s"
msgstr "Analizas vortaron: %s"
-#: ../edit.c:3079
msgid " (insert) Scroll (^E/^Y)"
msgstr " (enmeto) Rulumo (^E/^Y)"
-#: ../edit.c:3081
msgid " (replace) Scroll (^E/^Y)"
msgstr " (anstataลญigo) Rulumo (^E/^Y)"
-#: ../edit.c:3587
#, c-format
msgid "Scanning: %s"
msgstr "Analizas: %s"
-#: ../edit.c:3614
msgid "Scanning tags."
msgstr "Analizas etikedojn."
-#: ../edit.c:4519
+msgid "match in file"
+msgstr "kongruo en dosiero"
+
msgid " Adding"
msgstr " Aldonanta"
-#. showmode might reset the internal line pointers, so it must
-#. * be called before line = ml_get(), or when this address is no
-#. * longer needed. -- Acevedo.
-#.
-#: ../edit.c:4562
msgid "-- Searching..."
msgstr "-- Serฤ‰anta..."
-#: ../edit.c:4618
msgid "Back at original"
msgstr "Reveninta al originalo"
-#: ../edit.c:4621
msgid "Word from other line"
msgstr "Vorto el alia linio"
-#: ../edit.c:4624
msgid "The only match"
msgstr "La sola kongruo"
-#: ../edit.c:4680
#, c-format
msgid "match %d of %d"
msgstr "kongruo %d de %d"
-#: ../edit.c:4684
#, c-format
msgid "match %d"
msgstr "kongruo %d"
-#: ../eval.c:137
msgid "E18: Unexpected characters in :let"
msgstr "E18: Neatenditaj signoj en \":let\""
-#: ../eval.c:138
-#, c-format
-msgid "E684: list index out of range: %<PRId64>"
-msgstr "E684: indekso de listo ekster limoj: %<PRId64>"
-
-#: ../eval.c:139
#, c-format
msgid "E121: Undefined variable: %s"
msgstr "E121: Nedifinita variablo: %s"
-#: ../eval.c:140
msgid "E111: Missing ']'"
msgstr "E111: Mankas ']'"
-#: ../eval.c:141
-#, c-format
-msgid "E686: Argument of %s must be a List"
-msgstr "E686: Argumento de %s devas esti Listo"
-
-#: ../eval.c:143
-#, c-format
-msgid "E712: Argument of %s must be a List or Dictionary"
-msgstr "E712: Argumento de %s devas esti Listo aลญ Vortaro"
-
-#: ../eval.c:145
-msgid "E714: List required"
-msgstr "E714: Listo bezonata"
-
-#: ../eval.c:146
-msgid "E715: Dictionary required"
-msgstr "E715: Vortaro bezonata"
-
-#: ../eval.c:147
-#, c-format
-msgid "E118: Too many arguments for function: %s"
-msgstr "E118: Tro da argumentoj por funkcio: %s"
-
-#: ../eval.c:148
-#, c-format
-msgid "E716: Key not present in Dictionary: %s"
-msgstr "E716: ลœlosilo malekzistas en Vortaro: %s"
-
-#: ../eval.c:150
-#, c-format
-msgid "E122: Function %s already exists, add ! to replace it"
-msgstr "E122: La funkcio %s jam ekzistas (aldonu ! por anstataลญigi ฤin)"
-
-#: ../eval.c:151
-msgid "E717: Dictionary entry already exists"
-msgstr "E717: Rikordo de vortaro jam ekzistas"
-
-#: ../eval.c:152
-msgid "E718: Funcref required"
-msgstr "E718: Funcref bezonata"
-
-#: ../eval.c:153
msgid "E719: Cannot use [:] with a Dictionary"
msgstr "E719: Uzo de [:] ne eblas kun Vortaro"
-#: ../eval.c:154
#, c-format
msgid "E734: Wrong variable type for %s="
msgstr "E734: Nevalida datumtipo de variablo de %s="
-#: ../eval.c:155
-#, c-format
-msgid "E130: Unknown function: %s"
-msgstr "E130: Nekonata funkcio: %s"
-
-#: ../eval.c:156
#, c-format
msgid "E461: Illegal variable name: %s"
msgstr "E461: Nevalida nomo de variablo: %s"
-#: ../eval.c:157
msgid "E806: using Float as a String"
msgstr "E806: uzo de Glitpunktnombro kiel ฤˆeno"
-#: ../eval.c:1830
msgid "E687: Less targets than List items"
msgstr "E687: Malpli da celoj ol Listeroj"
-#: ../eval.c:1834
msgid "E688: More targets than List items"
msgstr "E688: Pli da celoj ol Listeroj"
-#: ../eval.c:1906
msgid "Double ; in list of variables"
msgstr "Duobla ; en listo de variabloj"
-#: ../eval.c:2078
#, c-format
msgid "E738: Can't list variables for %s"
msgstr "E738: Ne eblas listigi variablojn de %s"
-#: ../eval.c:2391
msgid "E689: Can only index a List or Dictionary"
msgstr "E689: Nur eblas indeksi Liston aลญ Vortaron"
-#: ../eval.c:2396
msgid "E708: [:] must come last"
msgstr "E708: [:] devas esti laste"
-#: ../eval.c:2439
msgid "E709: [:] requires a List value"
msgstr "E709: [:] bezonas listan valoron"
-#: ../eval.c:2674
msgid "E710: List value has more items than target"
msgstr "E710: Lista valoro havas pli da eroj ol la celo"
-#: ../eval.c:2678
msgid "E711: List value has not enough items"
msgstr "E711: Lista valoro ne havas sufiฤ‰e da eroj"
-#: ../eval.c:2867
msgid "E690: Missing \"in\" after :for"
-msgstr "E690: \"in\" mankas post \":for\""
-
-#: ../eval.c:3063
-#, c-format
-msgid "E107: Missing parentheses: %s"
-msgstr "E107: Mankas krampoj: %s"
+msgstr "E690: \"in\" mankas malantaลญ \":for\""
-#: ../eval.c:3263
#, c-format
msgid "E108: No such variable: \"%s\""
msgstr "E108: Ne estas tia variablo: \"%s\""
-#: ../eval.c:3333
+#, c-format
+msgid "E940: Cannot lock or unlock variable %s"
+msgstr "E940: Ne eblas ลlosi aลญ malลlosi variablon %s"
+
msgid "E743: variable nested too deep for (un)lock"
-msgstr "E743: variablo ingita tro profunde por malลlosi"
+msgstr "E743: variablo ingita tro profunde por (mal)ลlosi"
-#: ../eval.c:3630
msgid "E109: Missing ':' after '?'"
-msgstr "E109: Mankas ':' post '?'"
+msgstr "E109: Mankas ':' malantaลญ '?'"
-#: ../eval.c:3893
msgid "E691: Can only compare List with List"
msgstr "E691: Eblas nur kompari Liston kun Listo"
-#: ../eval.c:3895
-msgid "E692: Invalid operation for Lists"
+msgid "E692: Invalid operation for List"
msgstr "E692: Nevalida operacio de Listoj"
-#: ../eval.c:3915
msgid "E735: Can only compare Dictionary with Dictionary"
msgstr "E735: Eblas nur kompari Vortaron kun Vortaro"
-#: ../eval.c:3917
msgid "E736: Invalid operation for Dictionary"
msgstr "E736: Nevalida operacio de Vortaro"
-#: ../eval.c:3932
-msgid "E693: Can only compare Funcref with Funcref"
-msgstr "E693: Eblas nur kompari Funcref kun Funcref"
-
-#: ../eval.c:3934
msgid "E694: Invalid operation for Funcrefs"
msgstr "E694: Nevalida operacio de Funcref-oj"
-#: ../eval.c:4277
msgid "E804: Cannot use '%' with Float"
msgstr "E804: Ne eblas uzi '%' kun Glitpunktnombro"
-#: ../eval.c:4478
msgid "E110: Missing ')'"
msgstr "E110: Mankas ')'"
-#: ../eval.c:4609
msgid "E695: Cannot index a Funcref"
msgstr "E695: Ne eblas indeksi Funcref"
msgid "E909: Cannot index a special variable"
msgstr "E909: Ne eblas indeksi specialan variablon"
-#: ../eval.c:4839
#, c-format
msgid "E112: Option name missing: %s"
msgstr "E112: Mankas nomo de opcio: %s"
-#: ../eval.c:4855
#, c-format
msgid "E113: Unknown option: %s"
msgstr "E113: Nekonata opcio: %s"
-#: ../eval.c:4904
#, c-format
msgid "E114: Missing quote: %s"
msgstr "E114: Mankas citilo: %s"
-#: ../eval.c:5020
#, c-format
msgid "E115: Missing quote: %s"
msgstr "E115: Mankas citilo: %s"
-#: ../eval.c:5084
-#, c-format
-msgid "E696: Missing comma in List: %s"
-msgstr "E696: Mankas komo en Listo: %s"
-
-#: ../eval.c:5091
-#, c-format
-msgid "E697: Missing end of List ']': %s"
-msgstr "E697: Mankas fino de Listo ']': %s"
-
-#: ../eval.c:5750
msgid "Not enough memory to set references, garbage collection aborted!"
msgstr "Ne sufiฤ‰a memoro por valorigi referencojn, senrubigado ฤ‰esigita!"
-#: ../eval.c:6475
-#, c-format
-msgid "E720: Missing colon in Dictionary: %s"
-msgstr "E720: Mankas dupunkto en la vortaro: %s"
-
-#: ../eval.c:6499
-#, c-format
-msgid "E721: Duplicate key in Dictionary: \"%s\""
-msgstr "E721: Ripetita ลlosilo en la vortaro: \"%s\""
-
-#: ../eval.c:6517
-#, c-format
-msgid "E722: Missing comma in Dictionary: %s"
-msgstr "E722: Mankas komo en la vortaro: %s"
-
-#: ../eval.c:6524
-#, c-format
-msgid "E723: Missing end of Dictionary '}': %s"
-msgstr "E723: Mankas fino de vortaro '}': %s"
-
-#: ../eval.c:6555
msgid "E724: variable nested too deep for displaying"
msgstr "E724: variablo ingita tro profunde por vidigi"
-#: ../eval.c:7188
-#, c-format
-msgid "E740: Too many arguments for function %s"
-msgstr "E740: Tro da argumentoj por funkcio: %s"
-
-#: ../eval.c:7190
-#, c-format
-msgid "E116: Invalid arguments for function %s"
-msgstr "E116: Nevalidaj argumentoj por funkcio: %s"
-
-#: ../eval.c:7377
-#, c-format
-msgid "E117: Unknown function: %s"
-msgstr "E117: Nekonata funkcio: %s"
-
-#: ../eval.c:7383
-#, c-format
-msgid "E119: Not enough arguments for function: %s"
-msgstr "E119: Ne sufiฤ‰e da argumentoj por funkcio: %s"
-
-#: ../eval.c:7387
-#, c-format
-msgid "E120: Using <SID> not in a script context: %s"
-msgstr "E120: <SID> estas uzata ekster kunteksto de skripto: %s"
-
-#: ../eval.c:7391
-#, c-format
-msgid "E725: Calling dict function without Dictionary: %s"
-msgstr "E725: Alvoko de funkcio dict sen Vortaro: %s"
-
-#: ../eval.c:7453
-msgid "E808: Number or Float required"
-msgstr "E808: Nombro aลญ Glitpunktnombro bezonata"
-
-#: ../eval.c:7503
-msgid "add() argument"
-msgstr "argumento de add()"
-
-#: ../eval.c:7907
-msgid "E699: Too many arguments"
-msgstr "E699: Tro da argumentoj"
-
-#: ../eval.c:8073
-msgid "E785: complete() can only be used in Insert mode"
-msgstr "E785: complete() uzeblas nur en Enmeta reฤimo"
-
-#: ../eval.c:8156
-msgid "&Ok"
-msgstr "&Bone"
-
-#: ../eval.c:8676
-#, c-format
-msgid "E737: Key already exists: %s"
-msgstr "E737: ลœlosilo jam ekzistas: %s"
-
-#: ../eval.c:8692
-msgid "extend() argument"
-msgstr "argumento de extend()"
-
-#: ../eval.c:8915
-msgid "map() argument"
-msgstr "argumento de map()"
-
-#: ../eval.c:8916
-msgid "filter() argument"
-msgstr "argumento de filter()"
-
-#: ../eval.c:9229
-#, c-format
-msgid "+-%s%3ld lines: "
-msgstr "+-%s%3ld linioj: "
-
-#: ../eval.c:9291
-#, c-format
-msgid "E700: Unknown function: %s"
-msgstr "E700: Nekonata funkcio: %s"
-
-#: ../eval.c:10729
-msgid "called inputrestore() more often than inputsave()"
-msgstr "alvokis inputrestore() pli ofte ol inputsave()"
-
-#: ../eval.c:10771
-msgid "insert() argument"
-msgstr "argumento de insert()"
-
-#: ../eval.c:10841
-msgid "E786: Range not allowed"
-msgstr "E786: Amplekso nepermesebla"
-
-#: ../eval.c:11140
-msgid "E701: Invalid type for len()"
-msgstr "E701: Nevalida datumtipo de len()"
-
-#: ../eval.c:11980
-msgid "E726: Stride is zero"
-msgstr "E726: Paลo estas nul"
-
-#: ../eval.c:11982
-msgid "E727: Start past end"
-msgstr "E727: Komenco preter fino"
-
-#: ../eval.c:12024 ../eval.c:15297
-msgid "<empty>"
-msgstr "<malplena>"
-
-#: ../eval.c:12282
-msgid "remove() argument"
-msgstr "argumento de remove()"
-
-#: ../eval.c:12466
-msgid "E655: Too many symbolic links (cycle?)"
-msgstr "E655: Tro da simbolaj ligiloj (ฤ‰u estas ciklo?)"
-
-#: ../eval.c:12593
-msgid "reverse() argument"
-msgstr "argumento de reverse()"
-
-#: ../eval.c:13721
-msgid "sort() argument"
-msgstr "argumento de sort()"
-
-#: ../eval.c:13721
-#, fuzzy
-msgid "uniq() argument"
-msgstr "argumento de add()"
-
-#: ../eval.c:13776
-msgid "E702: Sort compare function failed"
-msgstr "E702: Ordiga funkcio fiaskis"
-
-#: ../eval.c:13806
-#, fuzzy
-msgid "E882: Uniq compare function failed"
-msgstr "E702: Ordiga funkcio fiaskis"
-
-#: ../eval.c:14085
-msgid "(Invalid)"
-msgstr "(Nevalida)"
-
-#: ../eval.c:14590
-msgid "E677: Error writing temp file"
-msgstr "E677: Eraro dum skribo de provizora dosiero"
-
-#: ../eval.c:16159
msgid "E805: Using a Float as a Number"
msgstr "E805: Uzo de Glitpunktnombro kiel Nombro"
-#: ../eval.c:16162
msgid "E703: Using a Funcref as a Number"
msgstr "E703: Uzo de Funcref kiel Nombro"
-#: ../eval.c:16170
msgid "E745: Using a List as a Number"
msgstr "E745: Uzo de Listo kiel Nombro"
-#: ../eval.c:16173
msgid "E728: Using a Dictionary as a Number"
msgstr "E728: Uzo de Vortaro kiel Nombro"
+msgid "E910: Using a Job as a Number"
+msgstr "E910: Uzo de Tasko kiel Nombro"
+
+msgid "E913: Using a Channel as a Number"
+msgstr "E913: Uzo de Kanalo kiel Nombro"
+
msgid "E891: Using a Funcref as a Float"
msgstr "E891: Uzo de Funcref kiel Glitpunktnombro"
@@ -885,268 +620,275 @@ msgstr "E893: Uzo de Listo kiel Glitpunktnombro"
msgid "E894: Using a Dictionary as a Float"
msgstr "E894: Uzo de Vortaro kiel Glitpunktnombro"
-#: ../eval.c:16259
+msgid "E907: Using a special value as a Float"
+msgstr "E907: Uzo de speciala valoro kiel Glitpunktnombro"
+
+msgid "E911: Using a Job as a Float"
+msgstr "E911: Uzo de Tasko kiel Glitpunktnombro"
+
+msgid "E914: Using a Channel as a Float"
+msgstr "E914: Uzo de Kanalo kiel Glitpunktnombro"
+
msgid "E729: using Funcref as a String"
msgstr "E729: uzo de Funcref kiel ฤˆeno"
-#: ../eval.c:16262
msgid "E730: using List as a String"
msgstr "E730: uzo de Listo kiel ฤˆeno"
-#: ../eval.c:16265
msgid "E731: using Dictionary as a String"
msgstr "E731: uzo de Vortaro kiel ฤˆeno"
msgid "E908: using an invalid value as a String"
msgstr "E908: uzo de nevalida valoro kiel ฤˆeno"
-#: ../eval.c:16619
-#, c-format
-msgid "E706: Variable type mismatch for: %s"
-msgstr "E706: Nekongrua datumtipo de variablo: %s"
-
-#: ../eval.c:16705
#, c-format
msgid "E795: Cannot delete variable %s"
msgstr "E795: Ne eblas forviลi variablon %s"
-#: ../eval.c:16724
#, c-format
msgid "E704: Funcref variable name must start with a capital: %s"
-msgstr "E704: Nomo de variablo Funcref devas finiฤi per majusklo: %s"
+msgstr "E704: Nomo de variablo Funcref devas eki per majusklo: %s"
-#: ../eval.c:16732
#, c-format
msgid "E705: Variable name conflicts with existing function: %s"
msgstr "E705: Nomo de variablo konfliktas kun ekzistanta funkcio: %s"
-#: ../eval.c:16763
#, c-format
msgid "E741: Value is locked: %s"
msgstr "E741: Valoro estas ลlosita: %s"
-#: ../eval.c:16764 ../eval.c:16769 ../message.c:1839
msgid "Unknown"
msgstr "Nekonata"
-#: ../eval.c:16768
#, c-format
msgid "E742: Cannot change value of %s"
msgstr "E742: Ne eblas ลanฤi valoron de %s"
-#: ../eval.c:16838
msgid "E698: variable nested too deep for making a copy"
msgstr "E698: variablo ingita tro profunde por fari kopion"
-#: ../eval.c:17249
-#, c-format
-msgid "E123: Undefined function: %s"
-msgstr "E123: Nedifinita funkcio: %s"
+msgid ""
+"\n"
+"# global variables:\n"
+msgstr ""
+"\n"
+"# mallokaj variabloj:\n"
-#: ../eval.c:17260
-#, c-format
-msgid "E124: Missing '(': %s"
-msgstr "E124: Mankas '(': %s"
+msgid ""
+"\n"
+"\tLast set from "
+msgstr ""
+"\n"
+"\tLaste ลaltita de "
-#: ../eval.c:17293
-msgid "E862: Cannot use g: here"
-msgstr "E862: Ne eblas uzi g: ฤ‰i tie"
+msgid "map() argument"
+msgstr "argumento de map()"
-#: ../eval.c:17312
-#, c-format
-msgid "E125: Illegal argument: %s"
-msgstr "E125: Nevalida argumento: %s"
+msgid "filter() argument"
+msgstr "argumento de filter()"
-#: ../eval.c:17323
#, c-format
-msgid "E853: Duplicate argument name: %s"
-msgstr "E853: Ripetita nomo de argumento: %s"
+msgid "E686: Argument of %s must be a List"
+msgstr "E686: Argumento de %s devas esti Listo"
-#: ../eval.c:17416
-msgid "E126: Missing :endfunction"
-msgstr "E126: Mankas \":endfunction\""
+msgid "E928: String required"
+msgstr "E928: ฤˆeno bezonata"
-#: ../eval.c:17537
-#, c-format
-msgid "E707: Function name conflicts with variable: %s"
-msgstr "E707: Nomo de funkcio konfliktas kun variablo: %s"
+msgid "E808: Number or Float required"
+msgstr "E808: Nombro aลญ Glitpunktnombro bezonata"
-#: ../eval.c:17549
-#, c-format
-msgid "E127: Cannot redefine function %s: It is in use"
-msgstr "E127: Ne eblas redifini funkcion %s: Estas nuntempe uzata"
+msgid "add() argument"
+msgstr "argumento de add()"
+
+msgid "E785: complete() can only be used in Insert mode"
+msgstr "E785: complete() uzeblas nur en Enmeta reฤimo"
+
+msgid "&Ok"
+msgstr "&Bone"
-#: ../eval.c:17604
#, c-format
-msgid "E746: Function name does not match script file name: %s"
-msgstr "E746: Nomo de funkcio ne kongruas kun dosiernomo de skripto: %s"
+msgid "E700: Unknown function: %s"
+msgstr "E700: Nekonata funkcio: %s"
-#: ../eval.c:17716
-msgid "E129: Function name required"
-msgstr "E129: Nomo de funkcio bezonata"
+msgid "E922: expected a dict"
+msgstr "E922: vortaro atendita"
-#: ../eval.c:17824
-#, fuzzy, c-format
-msgid "E128: Function name must start with a capital or \"s:\": %s"
-msgstr "E128: Nomo de funkcio devas eki per majusklo aลญ enhavi dupunkton: %s"
+msgid "E923: Second argument of function() must be a list or a dict"
+msgstr "E923: Dua argumento de function() devas esti listo aลญ Vortaro"
-#: ../eval.c:17833
-#, fuzzy, c-format
-msgid "E884: Function name cannot contain a colon: %s"
-msgstr "E128: Nomo de funkcio devas eki per majusklo aลญ enhavi dupunkton: %s"
+msgid ""
+"&OK\n"
+"&Cancel"
+msgstr ""
+"&Bone\n"
+"&Rezigni"
-#: ../eval.c:18336
-#, c-format
-msgid "E131: Cannot delete function %s: It is in use"
-msgstr "E131: Ne eblas forviลi funkcion %s: Estas nuntempe uzata"
+msgid "called inputrestore() more often than inputsave()"
+msgstr "alvokis inputrestore() pli ofte ol inputsave()"
-#: ../eval.c:18441
-msgid "E132: Function call depth is higher than 'maxfuncdepth'"
-msgstr "E132: Profundo de funkcia alvoko superas 'maxfuncdepth'"
+msgid "insert() argument"
+msgstr "argumento de insert()"
-#: ../eval.c:18568
-#, c-format
-msgid "calling %s"
-msgstr "alvokas %s"
+msgid "E786: Range not allowed"
+msgstr "E786: Amplekso nepermesebla"
-#: ../eval.c:18651
-#, c-format
-msgid "%s aborted"
-msgstr "%s ฤ‰esigita"
+msgid "E916: not a valid job"
+msgstr "E916: nevalida tasko"
+
+msgid "E701: Invalid type for len()"
+msgstr "E701: Nevalida datumtipo de len()"
+
+msgid "E957: Invalid window number"
+msgstr "E957: Nevalida numero de vindozo"
-#: ../eval.c:18653
#, c-format
-msgid "%s returning #%<PRId64>"
-msgstr "%s liveras #%<PRId64>"
+msgid "E798: ID is reserved for \":match\": %ld"
+msgstr "E798: ID estas rezervita por \":match\": %ld"
+
+msgid "E726: Stride is zero"
+msgstr "E726: Paลo estas nul"
+
+msgid "E727: Start past end"
+msgstr "E727: Komenco preter fino"
+
+msgid "<empty>"
+msgstr "<malplena>"
+
+msgid "E240: No connection to the X server"
+msgstr "E240: Neniu konekto al X-servilo"
-#: ../eval.c:18670
#, c-format
-msgid "%s returning %s"
-msgstr "%s liveras %s"
+msgid "E241: Unable to send to %s"
+msgstr "E241: Ne eblas sendi al %s"
+
+msgid "E277: Unable to read a server reply"
+msgstr "E277: Ne eblas legi respondon de servilo"
+
+msgid "E941: already started a server"
+msgstr "E941: servilo jam lanฤ‰ita"
+
+msgid "E942: +clientserver feature not available"
+msgstr "E942: la eblo +clientserver ne disponeblas"
+
+msgid "remove() argument"
+msgstr "argumento de remove()"
+
+msgid "E655: Too many symbolic links (cycle?)"
+msgstr "E655: Tro da simbolaj ligiloj (ฤ‰u estas ciklo?)"
+
+msgid "reverse() argument"
+msgstr "argumento de reverse()"
+
+msgid "E258: Unable to send to client"
+msgstr "E258: Ne eblas sendi al kliento"
-#: ../eval.c:18691 ../ex_cmds2.c:2695
#, c-format
-msgid "continuing in %s"
-msgstr "daลญrigas en %s"
+msgid "E927: Invalid action: '%s'"
+msgstr "E927: Nevalida ago: '%s'"
-#: ../eval.c:18795
-msgid "E133: :return not inside a function"
-msgstr "E133: \":return\" ekster funkcio"
+msgid "sort() argument"
+msgstr "argumento de sort()"
-#: ../eval.c:19159
-msgid ""
-"\n"
-"# global variables:\n"
-msgstr ""
-"\n"
-"# mallokaj variabloj:\n"
+msgid "uniq() argument"
+msgstr "argumento de uniq()"
-#: ../eval.c:19254
-msgid ""
-"\n"
-"\tLast set from "
-msgstr ""
-"\n"
-"\tLaste ลaltita de "
+msgid "E702: Sort compare function failed"
+msgstr "E702: Ordiga funkcio malsukcesis"
-#: ../eval.c:19272
-msgid "No old files"
-msgstr "Neniu malnova dosiero"
+msgid "E882: Uniq compare function failed"
+msgstr "E882: kompara funkcio de uniq() malsukcesis"
+
+msgid "(Invalid)"
+msgstr "(Nevalida)"
+
+#, c-format
+msgid "E935: invalid submatch number: %d"
+msgstr "E935: nevalida indekso de \"submatch\": %d"
+
+msgid "E677: Error writing temp file"
+msgstr "E677: Eraro dum skribo de provizora dosiero"
+
+msgid "E921: Invalid callback argument"
+msgstr "E921: Nevalida argumento de reagfunctio"
-#: ../ex_cmds.c:122
#, c-format
msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
msgstr "<%s>%s%s %d, Deksesuma %02x, Okuma %03o"
-#: ../ex_cmds.c:145
#, c-format
msgid "> %d, Hex %04x, Octal %o"
msgstr "> %d, Deksesuma %04x, Okuma %o"
-#: ../ex_cmds.c:146
#, c-format
msgid "> %d, Hex %08x, Octal %o"
msgstr "> %d, Deksesuma %08x, Okuma %o"
-#: ../ex_cmds.c:684
msgid "E134: Move lines into themselves"
msgstr "E134: Movas liniojn en ilin mem"
-#: ../ex_cmds.c:747
-msgid "1 line moved"
-msgstr "1 linio movita"
-
-#: ../ex_cmds.c:749
#, c-format
-msgid "%<PRId64> lines moved"
-msgstr "%<PRId64> linioj movitaj"
+msgid "%ld line moved"
+msgid_plural "%ld lines moved"
+msgstr[0] "%ld linio movita"
+msgstr[1] "%ld linioj movitaj"
-#: ../ex_cmds.c:1175
#, c-format
-msgid "%<PRId64> lines filtered"
-msgstr "%<PRId64> linioj filtritaj"
+msgid "%ld lines filtered"
+msgstr "%ld linioj filtritaj"
-#: ../ex_cmds.c:1194
msgid "E135: *Filter* Autocommands must not change current buffer"
msgstr "E135: *Filtraj* Aลญtokomandoj ne rajtas ลanฤi aktualan bufron"
-#: ../ex_cmds.c:1244
msgid "[No write since last change]\n"
msgstr "[Neniu skribo de post lasta ลanฤo]\n"
-#: ../ex_cmds.c:1424
#, c-format
msgid "%sviminfo: %s in line: "
msgstr "%sviminfo: %s en linio: "
-#: ../ex_cmds.c:1431
msgid "E136: viminfo: Too many errors, skipping rest of file"
msgstr "E136: viminfo: Tro da eraroj, nun ignoras la reston de la dosiero"
-#: ../ex_cmds.c:1458
#, c-format
msgid "Reading viminfo file \"%s\"%s%s%s"
msgstr "Legado de dosiero viminfo \"%s\"%s%s%s"
-#: ../ex_cmds.c:1460
msgid " info"
msgstr " informo"
-#: ../ex_cmds.c:1461
msgid " marks"
msgstr " markoj"
-#: ../ex_cmds.c:1462
msgid " oldfiles"
msgstr " malnovaj dosieroj"
-#: ../ex_cmds.c:1463
msgid " FAILED"
-msgstr " FIASKIS"
+msgstr " MALSUKCESIS"
-#. avoid a wait_return for this message, it's annoying
-#: ../ex_cmds.c:1541
#, c-format
msgid "E137: Viminfo file is not writable: %s"
msgstr "E137: Dosiero viminfo ne skribeblas: %s"
-#: ../ex_cmds.c:1626
+#, c-format
+msgid "E929: Too many viminfo temp files, like %s!"
+msgstr "E929: Tro da provizoraj dosieroj viminfo, kiel %s!"
+
#, c-format
msgid "E138: Can't write viminfo file %s!"
msgstr "E138: Ne eblas skribi dosieron viminfo %s!"
-#: ../ex_cmds.c:1635
#, c-format
msgid "Writing viminfo file \"%s\""
msgstr "Skribas dosieron viminfo \"%s\""
-#. Write the info:
-#: ../ex_cmds.c:1720
+#, c-format
+msgid "E886: Can't rename viminfo file to %s!"
+msgstr "E886: Ne eblas renomi dosieron viminfo al %s!"
+
#, c-format
msgid "# This viminfo file was generated by Vim %s.\n"
msgstr "# Tiu dosiero viminfo estis kreita de Vim %s.\n"
-#: ../ex_cmds.c:1722
msgid ""
"# You may edit it if you're careful!\n"
"\n"
@@ -1154,47 +896,47 @@ msgstr ""
"# Vi povas redakti ฤin se vi estas singarda.\n"
"\n"
-#: ../ex_cmds.c:1723
msgid "# Value of 'encoding' when this file was written\n"
msgstr "# Valoro de 'encoding' kiam tiu dosiero estis kreita\n"
-#: ../ex_cmds.c:1800
msgid "Illegal starting char"
msgstr "Nevalida eka signo"
-#: ../ex_cmds.c:2162
+msgid ""
+"\n"
+"# Bar lines, copied verbatim:\n"
+msgstr ""
+"\n"
+"# Linioj komencantaj per |, kopiitaj sen ลanฤo:\n"
+
+msgid "Save As"
+msgstr "Konservi kiel"
+
msgid "Write partial file?"
msgstr "ฤˆu skribi partan dosieron?"
-#: ../ex_cmds.c:2166
msgid "E140: Use ! to write partial buffer"
msgstr "E140: Uzu ! por skribi partan bufron"
-#: ../ex_cmds.c:2281
#, c-format
msgid "Overwrite existing file \"%s\"?"
msgstr "ฤˆu anstataลญigi ekzistantan dosieron \"%s\"?"
-#: ../ex_cmds.c:2317
#, c-format
msgid "Swap file \"%s\" exists, overwrite anyway?"
msgstr "Permutodosiero .swp \"%s\" ekzistas, ฤ‰u tamen anstataลญigi ฤin?"
-#: ../ex_cmds.c:2326
#, c-format
msgid "E768: Swap file exists: %s (:silent! overrides)"
msgstr "E768: Permutodosiero .swp ekzistas: %s (:silent! por transpasi)"
-#: ../ex_cmds.c:2381
#, c-format
-msgid "E141: No file name for buffer %<PRId64>"
-msgstr "E141: Neniu dosiernomo de bufro %<PRId64>"
+msgid "E141: No file name for buffer %ld"
+msgstr "E141: Neniu dosiernomo de bufro %ld"
-#: ../ex_cmds.c:2412
msgid "E142: File not written: Writing is disabled by 'write' option"
msgstr "E142: Dosiero ne skribita: Skribo malลaltita per la opcio 'write'"
-#: ../ex_cmds.c:2434
#, c-format
msgid ""
"'readonly' option is set for \"%s\".\n"
@@ -1203,7 +945,6 @@ msgstr ""
"La opcio 'readonly' estas ลaltita por \"%s\".\n"
"ฤˆu vi tamen volas skribi?"
-#: ../ex_cmds.c:2439
#, c-format
msgid ""
"File permissions of \"%s\" are read-only.\n"
@@ -1214,84 +955,72 @@ msgstr ""
"Bonลance ฤi eble skribeblus.\n"
"ฤˆu vi volas provi?"
-#: ../ex_cmds.c:2451
#, c-format
msgid "E505: \"%s\" is read-only (add ! to override)"
msgstr "E505: \"%s\" estas nurlegebla (aldonu ! por transpasi)"
-#: ../ex_cmds.c:3120
+msgid "Edit File"
+msgstr "Redakti dosieron"
+
#, c-format
msgid "E143: Autocommands unexpectedly deleted new buffer %s"
msgstr "E143: Aลญtokomandoj neatendite forviลis novan bufron %s"
-#: ../ex_cmds.c:3313
msgid "E144: non-numeric argument to :z"
msgstr "E144: nenumera argumento de :z"
-#: ../ex_cmds.c:3404
msgid "E145: Shell commands not allowed in rvim"
msgstr "E145: ลœelkomandoj nepermeseblaj en rvim"
-#: ../ex_cmds.c:3498
msgid "E146: Regular expressions can't be delimited by letters"
msgstr "E146: Ne eblas limigi regulesprimon per literoj"
-#: ../ex_cmds.c:3964
#, c-format
msgid "replace with %s (y/n/a/q/l/^E/^Y)?"
msgstr "ฤ‰u anstataลญigi per %s (y/n/a/q/l/^E/^Y)?"
-#: ../ex_cmds.c:4379
msgid "(Interrupted) "
msgstr "(Interrompita) "
-#: ../ex_cmds.c:4384
-msgid "1 match"
-msgstr "1 kongruo"
-
-#: ../ex_cmds.c:4384
-msgid "1 substitution"
-msgstr "1 anstataลญigo"
-
-#: ../ex_cmds.c:4387
#, c-format
-msgid "%<PRId64> matches"
-msgstr "%<PRId64> kongruoj"
+msgid "%ld match on %ld line"
+msgid_plural "%ld matches on %ld line"
+msgstr[0] "%ld kongruo en %ld linio"
+msgstr[1] "%ld kongruoj en %ld linio"
-#: ../ex_cmds.c:4388
#, c-format
-msgid "%<PRId64> substitutions"
-msgstr "%<PRId64> anstataลญigoj"
+msgid "%ld substitution on %ld line"
+msgid_plural "%ld substitutions on %ld line"
+msgstr[0] "%ld anstataลญigo en %ld linio"
+msgstr[1] "%ld anstataลญigoj en %ld linio"
-#: ../ex_cmds.c:4392
-msgid " on 1 line"
-msgstr " en 1 linio"
+#, c-format
+msgid "%ld match on %ld lines"
+msgid_plural "%ld matches on %ld lines"
+msgstr[0] "%ld kongruo en %ld linioj"
+msgstr[1] "%ld kongruoj en %ld linioj"
-#: ../ex_cmds.c:4395
#, c-format
-msgid " on %<PRId64> lines"
-msgstr " en %<PRId64> linioj"
+msgid "%ld substitution on %ld lines"
+msgid_plural "%ld substitutions on %ld lines"
+msgstr[0] "%ld anstataลญigo en %ld linioj"
+msgstr[1] "%ld anstataลญigoj en %ld linioj"
-#: ../ex_cmds.c:4438
-msgid "E147: Cannot do :global recursive"
-msgstr "E147: Ne eblas fari \":global\" rekursie"
+msgid "E147: Cannot do :global recursive with a range"
+msgstr "E147: Ne eblas fari \":global\" rekursie kun amplekso"
# DP: global estas por ":global" do mi ne tradukis ฤin
-#: ../ex_cmds.c:4467
msgid "E148: Regular expression missing from global"
msgstr "E148: Regulesprimo mankas el global"
-#: ../ex_cmds.c:4508
#, c-format
msgid "Pattern found in every line: %s"
msgstr "ลœablono trovita en ฤ‰iuj linioj: %s"
-#: ../ex_cmds.c:4510
#, c-format
msgid "Pattern not found: %s"
msgstr "ลœablono ne trovita: %s"
-#: ../ex_cmds.c:4587
msgid ""
"\n"
"# Last Substitute String:\n"
@@ -1302,105 +1031,100 @@ msgstr ""
"$"
# This message should *so* be E42!
-#: ../ex_cmds.c:4679
msgid "E478: Don't panic!"
msgstr "E478: Ne paniku!"
-#: ../ex_cmds.c:4717
#, c-format
msgid "E661: Sorry, no '%s' help for %s"
msgstr "E661: Bedaลญrinde estas neniu helpo '%s' por %s"
-#: ../ex_cmds.c:4719
#, c-format
msgid "E149: Sorry, no help for %s"
msgstr "E149: Bedaลญrinde estas neniu helpo por %s"
-#: ../ex_cmds.c:4751
#, c-format
msgid "Sorry, help file \"%s\" not found"
msgstr "Bedaลญrinde, la helpdosiero \"%s\" ne troveblas"
-#: ../ex_cmds.c:5323
#, c-format
-msgid "E150: Not a directory: %s"
-msgstr "E150: Ne estas dosierujo: %s"
+msgid "E151: No match: %s"
+msgstr "E151: Neniu kongruo: %s"
-#: ../ex_cmds.c:5446
#, c-format
msgid "E152: Cannot open %s for writing"
msgstr "E152: Ne eblas malfermi %s en skribreฤimo"
-#: ../ex_cmds.c:5471
#, c-format
msgid "E153: Unable to open %s for reading"
msgstr "E153: Ne eblas malfermi %s en legreฤimo"
-#: ../ex_cmds.c:5500
#, c-format
msgid "E670: Mix of help file encodings within a language: %s"
msgstr "E670: Miksaฤตo de kodoprezento de helpa dosiero en lingvo: %s"
-#: ../ex_cmds.c:5565
#, c-format
msgid "E154: Duplicate tag \"%s\" in file %s/%s"
msgstr "E154: Ripetita etikedo \"%s\" en dosiero %s/%s"
-#: ../ex_cmds.c:5687
+#, c-format
+msgid "E150: Not a directory: %s"
+msgstr "E150: Ne estas dosierujo: %s"
+
#, c-format
msgid "E160: Unknown sign command: %s"
msgstr "E160: Nekonata simbola komando: %s"
-#: ../ex_cmds.c:5704
msgid "E156: Missing sign name"
msgstr "E156: Mankas nomo de simbolo"
-#: ../ex_cmds.c:5746
msgid "E612: Too many signs defined"
msgstr "E612: Tro da simboloj estas difinitaj"
-#: ../ex_cmds.c:5813
#, c-format
msgid "E239: Invalid sign text: %s"
msgstr "E239: Nevalida teksto de simbolo: %s"
-#: ../ex_cmds.c:5844 ../ex_cmds.c:6035
#, c-format
msgid "E155: Unknown sign: %s"
msgstr "E155: Nekonata simbolo: %s"
-#: ../ex_cmds.c:5877
msgid "E159: Missing sign number"
msgstr "E159: Mankas numero de simbolo"
-#: ../ex_cmds.c:5971
#, c-format
msgid "E158: Invalid buffer name: %s"
msgstr "E158: Nevalida nomo de bufro: %s"
-#: ../ex_cmds.c:6008
+msgid "E934: Cannot jump to a buffer that does not have a name"
+msgstr "E934: Ne eblas salti al sennoma bufro"
+
+#, c-format
+msgid "E157: Invalid sign ID: %ld"
+msgstr "E157: Nevalida identigilo de simbolo: %ld"
+
#, c-format
-msgid "E157: Invalid sign ID: %<PRId64>"
-msgstr "E157: Nevalida identigilo de simbolo: %<PRId64>"
+msgid "E885: Not possible to change sign %s"
+msgstr "E885: Ne eblas ลanฤi simbolon %s"
+
+msgid " (NOT FOUND)"
+msgstr " (NETROVITA)"
-#: ../ex_cmds.c:6066
msgid " (not supported)"
msgstr " (nesubtenata)"
-#: ../ex_cmds.c:6169
msgid "[Deleted]"
msgstr "[Forviลita]"
-#: ../ex_cmds2.c:139
+msgid "No old files"
+msgstr "Neniu malnova dosiero"
+
msgid "Entering Debug mode. Type \"cont\" to continue."
msgstr "Eniras sencimigan reฤimon. Tajpu \"cont\" por daลญrigi."
-#: ../ex_cmds2.c:143 ../ex_docmd.c:759
#, c-format
-msgid "line %<PRId64>: %s"
-msgstr "linio %<PRId64>: %s"
+msgid "line %ld: %s"
+msgstr "linio %ld: %s"
-#: ../ex_cmds2.c:145
#, c-format
msgid "cmd: %s"
msgstr "kmd: %s"
@@ -1412,231 +1136,193 @@ msgstr "kadro estas nul"
msgid "frame at highest level: %d"
msgstr "kadro je la plej alta nivelo: %d"
-#: ../ex_cmds2.c:322
#, c-format
-msgid "Breakpoint in \"%s%s\" line %<PRId64>"
-msgstr "Kontrolpunkto en \"%s%s\" linio %<PRId64>"
+msgid "Breakpoint in \"%s%s\" line %ld"
+msgstr "Kontrolpunkto en \"%s%s\" linio %ld"
-#: ../ex_cmds2.c:581
#, c-format
msgid "E161: Breakpoint not found: %s"
msgstr "E161: Kontrolpunkto ne trovita: %s"
-#: ../ex_cmds2.c:611
msgid "No breakpoints defined"
msgstr "Neniu kontrolpunkto estas difinita"
-#: ../ex_cmds2.c:617
#, c-format
-msgid "%3d %s %s line %<PRId64>"
-msgstr "%3d %s %s linio %<PRId64>"
+msgid "%3d %s %s line %ld"
+msgstr "%3d %s %s linio %ld"
-#: ../ex_cmds2.c:942
msgid "E750: First use \":profile start {fname}\""
msgstr "E750: Uzu unue \":profile start {dosiernomo}\""
-#: ../ex_cmds2.c:1269
#, c-format
msgid "Save changes to \"%s\"?"
msgstr "ฤˆu konservi ลanฤojn al \"%s\"?"
-#: ../ex_cmds2.c:1271 ../ex_docmd.c:8851
-msgid "Untitled"
-msgstr "Sen titolo"
+#, c-format
+msgid "E947: Job still running in buffer \"%s\""
+msgstr "E947: Tasko ankoraลญ aktiva en la bufro \"%s\""
-#: ../ex_cmds2.c:1421
#, c-format
msgid "E162: No write since last change for buffer \"%s\""
msgstr "E162: Neniu skribo de post la lasta ลanฤo por bufro \"%s\""
-#: ../ex_cmds2.c:1480
msgid "Warning: Entered other buffer unexpectedly (check autocommands)"
msgstr "Averto: Eniris neatendite alian bufron (kontrolu aลญtokomandojn)"
-#: ../ex_cmds2.c:1826
msgid "E163: There is only one file to edit"
msgstr "E163: Estas nur unu redaktenda dosiero"
-#: ../ex_cmds2.c:1828
msgid "E164: Cannot go before first file"
msgstr "E164: Ne eblas iri antaลญ ol la unuan dosieron"
-#: ../ex_cmds2.c:1830
msgid "E165: Cannot go beyond last file"
msgstr "E165: Ne eblas iri preter la lastan dosieron"
-#: ../ex_cmds2.c:2175
#, c-format
msgid "E666: compiler not supported: %s"
msgstr "E666: kompililo nesubtenata: %s"
-#: ../ex_cmds2.c:2257
#, c-format
msgid "Searching for \"%s\" in \"%s\""
msgstr "Serฤ‰ado de \"%s\" en \"%s\""
-#: ../ex_cmds2.c:2284
#, c-format
msgid "Searching for \"%s\""
msgstr "Serฤ‰ado de \"%s\""
-#: ../ex_cmds2.c:2307
#, c-format
-msgid "not found in 'runtimepath': \"%s\""
-msgstr "ne trovita en 'runtimepath': \"%s\""
+msgid "not found in '%s': \"%s\""
+msgstr "ne trovita en '%s: \"%s\""
+
+#, c-format
+msgid "W20: Required python version 2.x not supported, ignoring file: %s"
+msgstr "W20: Pitono versio 2.x bezonata sed nesubtenata, ignoro de dosiero: %s"
+
+#, c-format
+msgid "W21: Required python version 3.x not supported, ignoring file: %s"
+msgstr "W21: pitono versio 3.x bezonata sed nesubtenata, ignoro de dosiero: %s"
+
+msgid "Source Vim script"
+msgstr "Ruli Vim-skripton"
-#: ../ex_cmds2.c:2472
#, c-format
msgid "Cannot source a directory: \"%s\""
msgstr "Ne eblas ruli dosierujon: \"%s\""
-#: ../ex_cmds2.c:2518
#, c-format
msgid "could not source \"%s\""
msgstr "ne eblis ruli \"%s\""
-#: ../ex_cmds2.c:2520
#, c-format
-msgid "line %<PRId64>: could not source \"%s\""
-msgstr "linio %<PRId64>: ne eblis ruli \"%s\""
+msgid "line %ld: could not source \"%s\""
+msgstr "linio %ld: ne eblis ruli \"%s\""
-#: ../ex_cmds2.c:2535
#, c-format
msgid "sourcing \"%s\""
msgstr "rulas \"%s\""
-#: ../ex_cmds2.c:2537
#, c-format
-msgid "line %<PRId64>: sourcing \"%s\""
-msgstr "linio %<PRId64>: rulas \"%s\""
+msgid "line %ld: sourcing \"%s\""
+msgstr "linio %ld: rulas \"%s\""
-#: ../ex_cmds2.c:2693
#, c-format
msgid "finished sourcing %s"
msgstr "finis ruli %s"
-#: ../ex_cmds2.c:2765
+#, c-format
+msgid "continuing in %s"
+msgstr "daลญrigas en %s"
+
msgid "modeline"
msgstr "reฤimlinio"
-#: ../ex_cmds2.c:2767
msgid "--cmd argument"
msgstr "--cmd argumento"
-#: ../ex_cmds2.c:2769
msgid "-c argument"
msgstr "-c argumento"
-#: ../ex_cmds2.c:2771
msgid "environment variable"
msgstr "medivariablo"
-#: ../ex_cmds2.c:2773
msgid "error handler"
msgstr "erartraktilo"
-#: ../ex_cmds2.c:3020
msgid "W15: Warning: Wrong line separator, ^M may be missing"
msgstr "W15: Averto: Neฤusta disigilo de linio, ^M eble mankas"
-#: ../ex_cmds2.c:3139
msgid "E167: :scriptencoding used outside of a sourced file"
msgstr "E167: \":scriptencoding\" uzita ekster rulita dosiero"
-#: ../ex_cmds2.c:3166
msgid "E168: :finish used outside of a sourced file"
msgstr "E168: \":finish\" uzita ekster rulita dosiero"
-#: ../ex_cmds2.c:3389
#, c-format
msgid "Current %slanguage: \"%s\""
msgstr "Aktuala %slingvo: \"%s\""
-#: ../ex_cmds2.c:3404
#, c-format
msgid "E197: Cannot set language to \"%s\""
msgstr "E197: Ne eblas ลanฤi la lingvon al \"%s\""
-#. don't redisplay the window
-#. don't wait for return
-#: ../ex_docmd.c:387
msgid "Entering Ex mode. Type \"visual\" to go to Normal mode."
msgstr "Eniras reฤimon Ex. Tajpu \"visual\" por iri al reฤimo Normala."
-#: ../ex_docmd.c:428
msgid "E501: At end-of-file"
msgstr "E501: ฤˆe fino-de-dosiero"
-#: ../ex_docmd.c:513
msgid "E169: Command too recursive"
msgstr "E169: Komando tro rekursia"
-#: ../ex_docmd.c:1006
#, c-format
msgid "E605: Exception not caught: %s"
msgstr "E605: Escepto nekaptita: %s"
-#: ../ex_docmd.c:1085
msgid "End of sourced file"
msgstr "Fino de rulita dosiero"
-#: ../ex_docmd.c:1086
msgid "End of function"
msgstr "Fino de funkcio"
-#: ../ex_docmd.c:1628
msgid "E464: Ambiguous use of user-defined command"
msgstr "E464: Ambigua uzo de komando difinita de uzanto"
-#: ../ex_docmd.c:1638
msgid "E492: Not an editor command"
msgstr "E492: Ne estas redaktila komando"
-#: ../ex_docmd.c:1729
msgid "E493: Backwards range given"
msgstr "E493: Inversa amplekso donita"
-#: ../ex_docmd.c:1733
msgid "Backwards range given, OK to swap"
msgstr "Inversa amplekso donita, permuteblas"
-#. append
-#. typed wrong
-#: ../ex_docmd.c:1787
msgid "E494: Use w or w>>"
msgstr "E494: Uzu w aลญ w>>"
-#: ../ex_docmd.c:3454
-msgid "E319: The command is not available in this version"
+msgid "E943: Command table needs to be updated, run 'make cmdidxs'"
+msgstr "E943: Tabulo de komandoj estas ฤisdatigenda, lanฤ‰u 'make cmdidx'"
+
+msgid "E319: Sorry, the command is not available in this version"
msgstr "E319: Bedaลญrinde, tiu komando ne haveblas en tiu versio"
-#: ../ex_docmd.c:3752
msgid "E172: Only one file name allowed"
msgstr "E172: Nur unu dosiernomo permesebla"
-#: ../ex_docmd.c:4238
-msgid "1 more file to edit. Quit anyway?"
-msgstr "1 plia redaktenda dosiero. ฤˆu tamen eliri?"
-
-#: ../ex_docmd.c:4242
#, c-format
-msgid "%d more files to edit. Quit anyway?"
-msgstr "%d pliaj redaktendaj dosieroj. ฤˆu tamen eliri?"
+msgid "%d more file to edit. Quit anyway?"
+msgid_plural "%d more files to edit. Quit anyway?"
+msgstr[0] "%d plia redaktenda dosiero. ฤˆu tamen eliri?"
+msgstr[1] "%d pliaj redaktendaj dosieroj. ฤˆu tamen eliri?"
-#: ../ex_docmd.c:4248
-msgid "E173: 1 more file to edit"
-msgstr "E173: 1 plia redaktenda dosiero"
-
-#: ../ex_docmd.c:4250
#, c-format
-msgid "E173: %<PRId64> more files to edit"
-msgstr "E173: %<PRId64> pliaj redaktendaj dosieroj"
+msgid "E173: %ld more file to edit"
+msgid_plural "E173: %ld more files to edit"
+msgstr[0] "E173: %ld plia redaktenda dosiero"
+msgstr[1] "E173: %ld pliaj redaktendaj dosieroj"
-#: ../ex_docmd.c:4320
msgid "E174: Command already exists: add ! to replace it"
msgstr "E174: La komando jam ekzistas: aldonu ! por anstataลญigi ฤin"
-#: ../ex_docmd.c:4432
msgid ""
"\n"
" Name Args Address Complete Definition"
@@ -1644,352 +1330,307 @@ msgstr ""
"\n"
" Nomo Argumentoj Adreso Kompleto Difino"
-#: ../ex_docmd.c:4516
msgid "No user-defined commands found"
msgstr "Neniu komando difinita de uzanto trovita"
-#: ../ex_docmd.c:4538
msgid "E175: No attribute specified"
msgstr "E175: Neniu atributo specifita"
-#: ../ex_docmd.c:4583
msgid "E176: Invalid number of arguments"
msgstr "E176: Nevalida nombro de argumentoj"
-#: ../ex_docmd.c:4594
msgid "E177: Count cannot be specified twice"
msgstr "E177: Kvantoro ne povas aperi dufoje"
-#: ../ex_docmd.c:4603
msgid "E178: Invalid default value for count"
msgstr "E178: Nevalida defaลญlta valoro de kvantoro"
-#: ../ex_docmd.c:4625
msgid "E179: argument required for -complete"
msgstr "E179: argumento bezonata por -complete"
-#: ../ex_docmd.c:4933
msgid "E179: argument required for -addr"
msgstr "E179: argumento bezonata por -addr"
-#: ../ex_docmd.c:4635
#, c-format
msgid "E181: Invalid attribute: %s"
msgstr "E181: Nevalida atributo: %s"
-#: ../ex_docmd.c:4678
msgid "E182: Invalid command name"
msgstr "E182: Nevalida komanda nomo"
-#: ../ex_docmd.c:4691
msgid "E183: User defined commands must start with an uppercase letter"
msgstr "E183: Komandoj difinataj de uzanto devas eki per majusklo"
-#: ../ex_docmd.c:4696
msgid "E841: Reserved name, cannot be used for user defined command"
msgstr "E841: Rezervita nomo, neuzebla por komando difinita de uzanto"
-#: ../ex_docmd.c:4751
#, c-format
msgid "E184: No such user-defined command: %s"
msgstr "E184: Neniu komando-difinita-de-uzanto kiel: %s"
-#: ../ex_docmd.c:5516
#, c-format
msgid "E180: Invalid address type value: %s"
msgstr "E180: Nevalida valoro de tipo de adreso: %s"
-#: ../ex_docmd.c:5219
#, c-format
msgid "E180: Invalid complete value: %s"
msgstr "E180: Nevalida valoro de kompletigo: %s"
-#: ../ex_docmd.c:5225
msgid "E468: Completion argument only allowed for custom completion"
msgstr ""
"E468: Argumento de kompletigo nur permesebla por kompletigo difinita de "
"uzanto"
-#: ../ex_docmd.c:5231
msgid "E467: Custom completion requires a function argument"
msgstr "E467: Uzula kompletigo bezonas funkcian argumenton"
-#: ../ex_docmd.c:5257
+msgid "unknown"
+msgstr "nekonata"
+
#, c-format
msgid "E185: Cannot find color scheme '%s'"
msgstr "E185: Ne eblas trovi agordaron de koloroj '%s'"
-#: ../ex_docmd.c:5263
msgid "Greetings, Vim user!"
msgstr "Bonvenon, uzanto de Vim!"
-#: ../ex_docmd.c:5431
msgid "E784: Cannot close last tab page"
msgstr "E784: Ne eblas fermi lastan langeton"
-#: ../ex_docmd.c:5462
msgid "Already only one tab page"
msgstr "Jam nur unu langeto"
-#: ../ex_docmd.c:6004
+msgid "Edit File in new tab page"
+msgstr "Redakti Dosieron en nova langeto"
+
+msgid "Edit File in new window"
+msgstr "Redakti Dosieron en nova fenestro"
+
#, c-format
msgid "Tab page %d"
msgstr "Langeto %d"
-#: ../ex_docmd.c:6295
msgid "No swap file"
msgstr "Neniu permutodosiero .swp"
-#: ../ex_docmd.c:6478
+msgid "Append File"
+msgstr "Postaldoni dosieron"
+
msgid "E747: Cannot change directory, buffer is modified (add ! to override)"
msgstr ""
"E747: Ne eblas ลanฤi dosierujon, bufro estas ลanฤita (aldonu ! por transpasi)"
-#: ../ex_docmd.c:6485
msgid "E186: No previous directory"
msgstr "E186: Neniu antaลญa dosierujo"
-#: ../ex_docmd.c:6530
msgid "E187: Unknown"
msgstr "E187: Nekonata"
-#: ../ex_docmd.c:6610
msgid "E465: :winsize requires two number arguments"
msgstr "E465: \":winsize\" bezonas du numerajn argumentojn"
-#: ../ex_docmd.c:6655
+#, c-format
+msgid "Window position: X %d, Y %d"
+msgstr "Pozicio de fenestro: X %d, Y %d"
+
msgid "E188: Obtaining window position not implemented for this platform"
msgstr ""
"E188: Akiro de pozicio de fenestro ne estas realigita por tiu platformo"
-#: ../ex_docmd.c:6662
msgid "E466: :winpos requires two number arguments"
msgstr "E466: \":winpos\" bezonas du numerajn argumentojn"
-#: ../ex_docmd.c:7241
+msgid "E930: Cannot use :redir inside execute()"
+msgstr "E930: Ne eblas uzi :redir en execute()"
+
+msgid "Save Redirection"
+msgstr "Konservi alidirekton"
+
+# DP: mi ne certas pri superflugo
+msgid "Save View"
+msgstr "Konservi superflugon"
+
+msgid "Save Session"
+msgstr "Konservi seancon"
+
+msgid "Save Setup"
+msgstr "Konservi agordaron"
+
#, c-format
msgid "E739: Cannot create directory: %s"
msgstr "E739: Ne eblas krei dosierujon %s"
-#: ../ex_docmd.c:7268
#, c-format
msgid "E189: \"%s\" exists (add ! to override)"
msgstr "E189: \"%s\" ekzistas (aldonu ! por transpasi)"
-#: ../ex_docmd.c:7273
#, c-format
msgid "E190: Cannot open \"%s\" for writing"
msgstr "E190: Ne eblas malfermi \"%s\" por skribi"
-#. set mark
-#: ../ex_docmd.c:7294
msgid "E191: Argument must be a letter or forward/backward quote"
msgstr "E191: Argumento devas esti litero, citilo aลญ retrocitilo"
-#: ../ex_docmd.c:7333
msgid "E192: Recursive use of :normal too deep"
msgstr "E192: Tro profunda rekursia alvoko de \":normal\""
-#: ../ex_docmd.c:7807
+msgid "E809: #< is not available without the +eval feature"
+msgstr "E809: #< ne haveblas sen la eblo +eval"
+
msgid "E194: No alternate file name to substitute for '#'"
msgstr "E194: Neniu alterna dosiernomo por anstataลญigi al '#'"
-#: ../ex_docmd.c:7841
msgid "E495: no autocommand file name to substitute for \"<afile>\""
msgstr "E495: neniu dosiernomo de aลญtokomando por anstataลญigi al \"<afile>\""
-#: ../ex_docmd.c:7850
msgid "E496: no autocommand buffer number to substitute for \"<abuf>\""
msgstr ""
"E496: neniu numero de bufro de aลญtokomando por anstataลญigi al \"<abuf>\""
# DP: ฤ‰u match estas verbo aลญ nomo en la angla version?
# AM: ฤ‰i tie, nomo, ลajnas al mi
-#: ../ex_docmd.c:7861
msgid "E497: no autocommand match name to substitute for \"<amatch>\""
msgstr ""
"E497: neniu nomo de kongruo de aลญtokomando por anstataลญigi al \"<amatch>\""
-#: ../ex_docmd.c:7870
msgid "E498: no :source file name to substitute for \"<sfile>\""
msgstr "E498: neniu dosiernomo \":source\" por anstataลญigi al \"<sfile>\""
-#: ../ex_docmd.c:7876
msgid "E842: no line number to use for \"<slnum>\""
msgstr "E842: neniu uzebla numero de linio por \"<slnum>\""
-#: ../ex_docmd.c:7903
-#, fuzzy, c-format
+#, no-c-format
msgid "E499: Empty file name for '%' or '#', only works with \":p:h\""
msgstr "E499: Malplena dosiernomo por '%' aลญ '#', nur funkcias kun \":p:h\""
-#: ../ex_docmd.c:7905
msgid "E500: Evaluates to an empty string"
msgstr "E500: Liveras malplenan ฤ‰enon"
-#: ../ex_docmd.c:8838
msgid "E195: Cannot open viminfo file for reading"
msgstr "E195: Ne eblas malfermi dosieron viminfo en lega reฤimo"
-#: ../ex_eval.c:464
+msgid "Untitled"
+msgstr "Sen titolo"
+
+msgid "E196: No digraphs in this version"
+msgstr "E196: Neniu duliteraฤตo en tiu versio"
+
msgid "E608: Cannot :throw exceptions with 'Vim' prefix"
msgstr "E608: Ne eblas lanฤ‰i (:throw) escepton kun prefikso 'Vim'"
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:496
#, c-format
msgid "Exception thrown: %s"
msgstr "Escepto lanฤ‰ita: %s"
-#: ../ex_eval.c:545
#, c-format
msgid "Exception finished: %s"
msgstr "Escepto finiฤis: %s"
-#: ../ex_eval.c:546
#, c-format
msgid "Exception discarded: %s"
msgstr "Escepto ne konservita: %s"
-#: ../ex_eval.c:588 ../ex_eval.c:634
#, c-format
-msgid "%s, line %<PRId64>"
-msgstr "%s, linio %<PRId64>"
+msgid "%s, line %ld"
+msgstr "%s, linio %ld"
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:608
#, c-format
msgid "Exception caught: %s"
msgstr "Kaptis escepton: %s"
-#: ../ex_eval.c:676
#, c-format
msgid "%s made pending"
msgstr "%s iฤis atendanta(j)"
-#: ../ex_eval.c:679
#, c-format
msgid "%s resumed"
msgstr "%s daลญrigita(j)"
-#: ../ex_eval.c:683
#, c-format
msgid "%s discarded"
msgstr "%s ne konservita(j)"
-#: ../ex_eval.c:708
msgid "Exception"
msgstr "Escepto"
-#: ../ex_eval.c:713
msgid "Error and interrupt"
msgstr "Eraro kaj interrompo"
-#: ../ex_eval.c:715
msgid "Error"
msgstr "Eraro"
-#. if (pending & CSTP_INTERRUPT)
-#: ../ex_eval.c:717
msgid "Interrupt"
msgstr "Interrompo"
-#: ../ex_eval.c:795
msgid "E579: :if nesting too deep"
msgstr "E579: \":if\" tro profunde ingita"
-#: ../ex_eval.c:830
msgid "E580: :endif without :if"
msgstr "E580: \":endif\" sen \":if\""
-#: ../ex_eval.c:873
msgid "E581: :else without :if"
msgstr "E581: \":else\" sen \":if\""
-#: ../ex_eval.c:876
msgid "E582: :elseif without :if"
msgstr "E582: \":elseif\" sen \":if\""
-#: ../ex_eval.c:880
msgid "E583: multiple :else"
msgstr "E583: pluraj \":else\""
-#: ../ex_eval.c:883
msgid "E584: :elseif after :else"
-msgstr "E584: \":elseif\" post \":else\""
+msgstr "E584: \":elseif\" malantaลญ \":else\""
-#: ../ex_eval.c:941
msgid "E585: :while/:for nesting too deep"
msgstr "E585: \":while/:for\" ingita tro profunde"
-#: ../ex_eval.c:1028
msgid "E586: :continue without :while or :for"
msgstr "E586: \":continue\" sen \":while\" aลญ \":for\""
-#: ../ex_eval.c:1061
msgid "E587: :break without :while or :for"
msgstr "E587: \":break\" sen \":while\" aลญ \":for\""
-#: ../ex_eval.c:1102
msgid "E732: Using :endfor with :while"
msgstr "E732: Uzo de \":endfor\" kun \":while\""
-#: ../ex_eval.c:1104
msgid "E733: Using :endwhile with :for"
msgstr "E733: Uzo de \":endwhile\" kun \":for\""
-#: ../ex_eval.c:1247
msgid "E601: :try nesting too deep"
msgstr "E601: \":try\" ingita tro profunde"
-#: ../ex_eval.c:1317
msgid "E603: :catch without :try"
msgstr "E603: \":catch\" sen \":try\""
-#. Give up for a ":catch" after ":finally" and ignore it.
-#. * Just parse.
-#: ../ex_eval.c:1332
msgid "E604: :catch after :finally"
-msgstr "E604: \":catch\" post \":finally\""
+msgstr "E604: \":catch\" malantaลญ \":finally\""
-#: ../ex_eval.c:1451
msgid "E606: :finally without :try"
msgstr "E606: \":finally\" sen \":try\""
-#. Give up for a multiple ":finally" and ignore it.
-#: ../ex_eval.c:1467
msgid "E607: multiple :finally"
msgstr "E607: pluraj \":finally\""
-#: ../ex_eval.c:1571
msgid "E602: :endtry without :try"
msgstr "E602: \":endtry\" sen \":try\""
-#: ../ex_eval.c:2026
msgid "E193: :endfunction not inside a function"
msgstr "E193: \":endfunction\" ekster funkcio"
-#: ../ex_getln.c:1643
msgid "E788: Not allowed to edit another buffer now"
msgstr "E788: Ne eblas redakti alian bufron nun"
-#: ../ex_getln.c:1656
msgid "E811: Not allowed to change buffer information now"
msgstr "E811: Ne eblas ลanฤi informon de bufro nun"
-#: ../ex_getln.c:3178
msgid "tagname"
msgstr "nomo de etikedo"
-#: ../ex_getln.c:3181
msgid " kind file\n"
msgstr " tipo de dosiero\n"
-#: ../ex_getln.c:4799
msgid "'history' option is zero"
msgstr "opcio 'history' estas nul"
-#: ../ex_getln.c:5046
#, c-format
msgid ""
"\n"
@@ -1998,303 +1639,220 @@ msgstr ""
"\n"
"# Historio %s (de plej nova al plej malnova):\n"
-#: ../ex_getln.c:5047
msgid "Command Line"
msgstr "Komanda linio"
-#: ../ex_getln.c:5048
msgid "Search String"
msgstr "Serฤ‰a ฤ‰eno"
-#: ../ex_getln.c:5049
msgid "Expression"
msgstr "Esprimo"
-#: ../ex_getln.c:5050
msgid "Input Line"
msgstr "Eniga linio"
-#: ../ex_getln.c:5117
+msgid "Debug Line"
+msgstr "Sencimiga linio"
+
msgid "E198: cmd_pchar beyond the command length"
msgstr "E198: cmd_pchar preter la longo de komando"
-#: ../ex_getln.c:5279
msgid "E199: Active window or buffer deleted"
msgstr "E199: Aktiva fenestro aลญ bufro forviลita"
-#: ../file_search.c:203
-msgid "E854: path too long for completion"
-msgstr "E854: tro longa vojo por kompletigo"
-
-#: ../file_search.c:446
-#, c-format
-msgid ""
-"E343: Invalid path: '**[number]' must be at the end of the path or be "
-"followed by '%s'."
-msgstr ""
-"E343: Nevalida vojo: '**[nombro]' devas esti ฤ‰e la fino de la vojo aลญ "
-"sekvita de '%s'."
-
-#: ../file_search.c:1505
-#, c-format
-msgid "E344: Can't find directory \"%s\" in cdpath"
-msgstr "E344: Ne eblas trovi dosierujon \"%s\" en cdpath"
-
-#: ../file_search.c:1508
-#, c-format
-msgid "E345: Can't find file \"%s\" in path"
-msgstr "E345: Ne eblas trovi dosieron \"%s\" en serฤ‰vojo"
-
-#: ../file_search.c:1512
-#, c-format
-msgid "E346: No more directory \"%s\" found in cdpath"
-msgstr "E346: Ne plu trovis dosierujon \"%s\" en cdpath"
-
-#: ../file_search.c:1515
-#, c-format
-msgid "E347: No more file \"%s\" found in path"
-msgstr "E347: Ne plu trovis dosieron \"%s\" en serฤ‰vojo"
-
-#: ../fileio.c:137
msgid "E812: Autocommands changed buffer or buffer name"
msgstr "E812: Aลญtokomandoj ลanฤis bufron aลญ nomon de bufro"
-#: ../fileio.c:368
msgid "Illegal file name"
msgstr "Nevalida dosiernomo"
-#: ../fileio.c:395 ../fileio.c:476 ../fileio.c:2543 ../fileio.c:2578
msgid "is a directory"
msgstr "estas dosierujo"
-#: ../fileio.c:397
msgid "is not a file"
msgstr "ne estas dosiero"
-#: ../fileio.c:508 ../fileio.c:3522
+msgid "is a device (disabled with 'opendevice' option)"
+msgstr "estas aparatdosiero (malลaltita per la opcio 'opendevice')"
+
msgid "[New File]"
msgstr "[Nova dosiero]"
-#: ../fileio.c:511
msgid "[New DIRECTORY]"
msgstr "[Nova DOSIERUJO]"
-#: ../fileio.c:529 ../fileio.c:532
msgid "[File too big]"
msgstr "[Dosiero tro granda]"
-#: ../fileio.c:534
msgid "[Permission Denied]"
msgstr "[Permeso rifuzita]"
-#: ../fileio.c:653
msgid "E200: *ReadPre autocommands made the file unreadable"
msgstr "E200: La aลญtokomandoj *ReadPre igis la dosieron nelegebla"
-#: ../fileio.c:655
msgid "E201: *ReadPre autocommands must not change current buffer"
msgstr "E201: La aลญtokomandoj *ReadPre ne rajtas ลanฤi la aktualan bufron"
-#: ../fileio.c:672
-msgid "Nvim: Reading from stdin...\n"
+msgid "Vim: Reading from stdin...\n"
msgstr "Vim: Legado el stdin...\n"
-#. Re-opening the original file failed!
-#: ../fileio.c:909
+msgid "Reading from stdin..."
+msgstr "Legado el stdin..."
+
msgid "E202: Conversion made file unreadable!"
msgstr "E202: Konverto igis la dosieron nelegebla!"
-#. fifo or socket
-#: ../fileio.c:1782
-msgid "[fifo/socket]"
-msgstr "[rektvica memoro/kontaktoskatolo]"
-
-#. fifo
-#: ../fileio.c:1788
msgid "[fifo]"
msgstr "[rektvica memoro]"
-#. or socket
-#: ../fileio.c:1794
msgid "[socket]"
msgstr "[kontaktoskatolo]"
-#. or character special
-#: ../fileio.c:1801
msgid "[character special]"
msgstr "[speciala signo]"
-#: ../fileio.c:1815
msgid "[CR missing]"
msgstr "[CR mankas]"
-#: ../fileio.c:1819
msgid "[long lines split]"
msgstr "[divido de longaj linioj]"
-#: ../fileio.c:1823 ../fileio.c:3512
msgid "[NOT converted]"
msgstr "[NE konvertita]"
-#: ../fileio.c:1826 ../fileio.c:3515
msgid "[converted]"
msgstr "[konvertita]"
-#: ../fileio.c:1831
#, c-format
-msgid "[CONVERSION ERROR in line %<PRId64>]"
-msgstr "[ERARO DE KONVERTO en linio %<PRId64>]"
+msgid "[CONVERSION ERROR in line %ld]"
+msgstr "[ERARO DE KONVERTO en linio %ld]"
-#: ../fileio.c:1835
#, c-format
-msgid "[ILLEGAL BYTE in line %<PRId64>]"
-msgstr "[NEVALIDA BAJTO en linio %<PRId64>]"
+msgid "[ILLEGAL BYTE in line %ld]"
+msgstr "[NEVALIDA BAJTO en linio %ld]"
-#: ../fileio.c:1838
msgid "[READ ERRORS]"
msgstr "[ERAROJ DE LEGADO]"
-#: ../fileio.c:2104
msgid "Can't find temp file for conversion"
msgstr "Ne eblas trovi provizoran dosieron por konverti"
-#: ../fileio.c:2110
msgid "Conversion with 'charconvert' failed"
-msgstr "Konverto kun 'charconvert' fiaskis"
+msgstr "Konverto kun 'charconvert' malsukcesis"
-#: ../fileio.c:2113
msgid "can't read output of 'charconvert'"
msgstr "ne eblas legi la eligon de 'charconvert'"
-#: ../fileio.c:2437
msgid "E676: No matching autocommands for acwrite buffer"
msgstr "E676: Neniu kongrua aลญtokomando por la bufro acwrite"
-#: ../fileio.c:2466
msgid "E203: Autocommands deleted or unloaded buffer to be written"
msgstr "E203: Aลญtokomandoj forviลis aลญ malลargis la skribendan bufron"
-#: ../fileio.c:2486
msgid "E204: Autocommand changed number of lines in unexpected way"
msgstr "E204: Aลญtokomando ลanฤis la nombron de linioj neatendite"
-#: ../fileio.c:2548 ../fileio.c:2565
+msgid "NetBeans disallows writes of unmodified buffers"
+msgstr "NetBeans malpermesas skribojn de neลanฤitaj bufroj"
+
+msgid "Partial writes disallowed for NetBeans buffers"
+msgstr "Partaj skriboj malpermesitaj ฤ‰e bufroj NetBeans"
+
msgid "is not a file or writable device"
msgstr "ne estas dosiero aลญ skribebla aparatdosiero"
-#: ../fileio.c:2601
+msgid "writing to device disabled with 'opendevice' option"
+msgstr "skribo al aparatdosiero malลaltita per la opcio 'opendevice'"
+
msgid "is read-only (add ! to override)"
msgstr "estas nurlegebla (aldonu ! por transpasi)"
-#: ../fileio.c:2886
msgid "E506: Can't write to backup file (add ! to override)"
msgstr "E506: Ne eblas skribi restaลญrkopion (aldonu ! por transpasi)"
-#: ../fileio.c:2898
msgid "E507: Close error for backup file (add ! to override)"
msgstr "E507: Eraro dum fermo de restaลญrkopio (aldonu ! transpasi)"
-#: ../fileio.c:2901
msgid "E508: Can't read file for backup (add ! to override)"
msgstr "E508: Ne eblas legi restaลญrkopion (aldonu ! por transpasi)"
-#: ../fileio.c:2923
msgid "E509: Cannot create backup file (add ! to override)"
msgstr "E509: Ne eblas krei restaลญrkopion (aldonu ! por transpasi)"
-#: ../fileio.c:3008
msgid "E510: Can't make backup file (add ! to override)"
msgstr "E510: Ne eblas krei restaลญrkopion (aldonu ! por transpasi)"
-#. Can't write without a tempfile!
-#: ../fileio.c:3121
+msgid "E460: The resource fork would be lost (add ! to override)"
+msgstr "E460: La rimeda forko estus perdita (aldonu ! por transpasi)"
+
msgid "E214: Can't find temp file for writing"
msgstr "E214: Ne eblas trovi provizoran dosieron por skribi"
-#: ../fileio.c:3134
msgid "E213: Cannot convert (add ! to write without conversion)"
msgstr "E213: Ne eblas konverti (aldonu ! por skribi sen konverto)"
-#: ../fileio.c:3169
msgid "E166: Can't open linked file for writing"
msgstr "E166: Ne eblas malfermi ligitan dosieron por skribi"
-#: ../fileio.c:3173
msgid "E212: Can't open file for writing"
msgstr "E212: Ne eblas malfermi la dosieron por skribi"
# AM: fsync: ne traduku (nomo de C-komando)
-#: ../fileio.c:3363
msgid "E667: Fsync failed"
-msgstr "E667: Fsync fiaskis"
+msgstr "E667: Fsync malsukcesis"
-#: ../fileio.c:3398
msgid "E512: Close failed"
-msgstr "E512: Fermo fiaskis"
+msgstr "E512: Fermo malsukcesis"
-#: ../fileio.c:3436
msgid "E513: write error, conversion failed (make 'fenc' empty to override)"
-msgstr "E513: skriberaro, konverto fiaskis (igu 'fenc' malplena por transpasi)"
+msgstr ""
+"E513: skriberaro, konverto malsukcesis (igu 'fenc' malplena por transpasi)"
-#: ../fileio.c:3441
#, c-format
msgid ""
-"E513: write error, conversion failed in line %<PRId64> (make 'fenc' empty to "
+"E513: write error, conversion failed in line %ld (make 'fenc' empty to "
"override)"
msgstr ""
-"E513: skriberaro, konverto fiaskis en linio %<PRId64> (igu 'fenc' malplena "
+"E513: skriberaro, konverto malsukcesis en linio %ld (igu 'fenc' malplena "
"por transpasi)"
-#: ../fileio.c:3448
msgid "E514: write error (file system full?)"
msgstr "E514: skriberaro (ฤ‰u plena dosiersistemo?)"
-#: ../fileio.c:3506
msgid " CONVERSION ERROR"
msgstr " ERARO DE KONVERTO"
-#: ../fileio.c:3509
#, c-format
-msgid " in line %<PRId64>;"
-msgstr " en linio %<PRId64>;"
+msgid " in line %ld;"
+msgstr " en linio %ld;"
-#: ../fileio.c:3519
msgid "[Device]"
msgstr "[Aparatdosiero]"
-#: ../fileio.c:3522
msgid "[New]"
msgstr "[Nova]"
-#: ../fileio.c:3535
msgid " [a]"
msgstr " [a]"
-#: ../fileio.c:3535
msgid " appended"
msgstr " postaldonita(j)"
-#: ../fileio.c:3537
msgid " [w]"
msgstr " [s]"
-#: ../fileio.c:3537
msgid " written"
msgstr " skribita(j)"
-#: ../fileio.c:3579
msgid "E205: Patchmode: can't save original file"
msgstr "E205: Patchmode: ne eblas konservi originalan dosieron"
-#: ../fileio.c:3602
msgid "E206: patchmode: can't touch empty original file"
msgstr "E206: patchmode: ne eblas tuลi malplenan originalan dosieron"
-#: ../fileio.c:3616
msgid "E207: Can't delete backup file"
msgstr "E207: Ne eblas forviลi restaลญrkopion"
-#: ../fileio.c:3672
msgid ""
"\n"
"WARNING: Original file may be lost or damaged\n"
@@ -2302,96 +1860,70 @@ msgstr ""
"\n"
"AVERTO: Originala dosiero estas eble perdita aลญ difekta\n"
-#: ../fileio.c:3675
msgid "don't quit the editor until the file is successfully written!"
msgstr "ne eliru el la redaktilo ฤis kiam la dosiero estas sukcese konservita!"
-#: ../fileio.c:3795
msgid "[dos]"
msgstr "[dos]"
-#: ../fileio.c:3795
msgid "[dos format]"
msgstr "[formato dos]"
-#: ../fileio.c:3801
msgid "[mac]"
msgstr "[mac]"
-#: ../fileio.c:3801
msgid "[mac format]"
msgstr "[formato mac]"
-#: ../fileio.c:3807
msgid "[unix]"
msgstr "[unikso]"
-#: ../fileio.c:3807
msgid "[unix format]"
msgstr "[formato unikso]"
-#: ../fileio.c:3831
-msgid "1 line, "
-msgstr "1 linio, "
-
-#: ../fileio.c:3833
#, c-format
-msgid "%<PRId64> lines, "
-msgstr "%<PRId64> linioj, "
+msgid "%ld line, "
+msgid_plural "%ld lines, "
+msgstr[0] "%ld linio, "
+msgstr[1] "%ld linioj, "
-#: ../fileio.c:3836
-msgid "1 character"
-msgstr "1 signo"
-
-#: ../fileio.c:3838
#, c-format
-msgid "%<PRId64> characters"
-msgstr "%<PRId64> signoj"
+msgid "%lld character"
+msgid_plural "%lld characters"
+msgstr[0] "%lld signo"
+msgstr[1] "%lld signoj"
-#: ../fileio.c:3849
msgid "[noeol]"
msgstr "[sen EOL]"
-#: ../fileio.c:3849
msgid "[Incomplete last line]"
msgstr "[Nekompleta lasta linio]"
-#. don't overwrite messages here
-#. must give this prompt
-#. don't use emsg() here, don't want to flush the buffers
-#: ../fileio.c:3865
msgid "WARNING: The file has been changed since reading it!!!"
msgstr "AVERTO: La dosiero estas ลanฤita de post kiam ฤi estis legita!!!"
-#: ../fileio.c:3867
msgid "Do you really want to write to it"
msgstr "ฤˆu vi vere volas skribi al ฤi"
-#: ../fileio.c:4648
#, c-format
msgid "E208: Error writing to \"%s\""
msgstr "E208: Eraro dum skribo de \"%s\""
-#: ../fileio.c:4655
#, c-format
msgid "E209: Error closing \"%s\""
msgstr "E209: Eraro dum fermo de \"%s\""
-#: ../fileio.c:4657
#, c-format
msgid "E210: Error reading \"%s\""
msgstr "E210: Eraro dum lego de \"%s\""
-#: ../fileio.c:4883
msgid "E246: FileChangedShell autocommand deleted buffer"
msgstr "E246: Aลญtokomando FileChangedShell forviลis bufron"
-#: ../fileio.c:4894
#, c-format
msgid "E211: File \"%s\" no longer available"
msgstr "E211: Dosiero \"%s\" ne plu haveblas"
-#: ../fileio.c:4906
#, c-format
msgid ""
"W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as "
@@ -2399,38 +1931,30 @@ msgid ""
msgstr ""
"W12: Averto: Dosiero \"%s\" ลanฤiฤis kaj la bufro estis ลanฤita ankaลญ en Vim"
-#: ../fileio.c:4907
msgid "See \":help W12\" for more info."
msgstr "Vidu \":help W12\" por pliaj informoj."
-#: ../fileio.c:4910
#, c-format
msgid "W11: Warning: File \"%s\" has changed since editing started"
msgstr "W11: Averto: La dosiero \"%s\" ลanฤiฤis ekde redakti ฤin"
-#: ../fileio.c:4911
msgid "See \":help W11\" for more info."
msgstr "Vidu \":help W11\" por pliaj informoj."
-#: ../fileio.c:4914
#, c-format
msgid "W16: Warning: Mode of file \"%s\" has changed since editing started"
msgstr "W16: Averto: Permeso de dosiero \"%s\" ลanฤiฤis ekde redakti ฤin"
-#: ../fileio.c:4915
msgid "See \":help W16\" for more info."
msgstr "Vidu \":help W16\" por pliaj informoj."
-#: ../fileio.c:4927
#, c-format
msgid "W13: Warning: File \"%s\" has been created after editing started"
msgstr "W13: Averto: Dosiero \"%s\" kreiฤis post la komenco de redaktado"
-#: ../fileio.c:4947
msgid "Warning"
msgstr "Averto"
-#: ../fileio.c:4948
msgid ""
"&OK\n"
"&Load File"
@@ -2438,821 +1962,593 @@ msgstr ""
"&Bone\n"
"ลœ&argi Dosieron"
-#: ../fileio.c:5065
#, c-format
msgid "E462: Could not prepare for reloading \"%s\""
msgstr "E462: Ne eblis prepari por reลargi \"%s\""
-#: ../fileio.c:5078
#, c-format
msgid "E321: Could not reload \"%s\""
msgstr "E321: Ne eblis reลargi \"%s\""
-#: ../fileio.c:5601
msgid "--Deleted--"
msgstr "--Forviลita--"
-#: ../fileio.c:5732
#, c-format
msgid "auto-removing autocommand: %s <buffer=%d>"
msgstr "aลญto-forviลas aลญtokomandon: %s <bufro=%d>"
-#. the group doesn't exist
-#: ../fileio.c:5772
#, c-format
msgid "E367: No such group: \"%s\""
msgstr "E367: Ne ekzistas tia grupo: \"%s\""
-#: ../fileio.c:5897
+msgid "E936: Cannot delete the current group"
+msgstr "E936: Ne eblas forviลi la aktualan grupon"
+
+msgid "W19: Deleting augroup that is still in use"
+msgstr "W19: Forviลo de augroup kiu estas ankoraลญ uzata"
+
#, c-format
msgid "E215: Illegal character after *: %s"
-msgstr "E215: Nevalida signo post *: %s"
+msgstr "E215: Nevalida signo malantaลญ *: %s"
-#: ../fileio.c:5905
#, c-format
msgid "E216: No such event: %s"
msgstr "E216: Ne estas tia evento: %s"
-#: ../fileio.c:5907
#, c-format
msgid "E216: No such group or event: %s"
msgstr "E216: Ne ekzistas tia grupo aลญ evento: %s"
-#. Highlight title
-#: ../fileio.c:6090
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
"--- Aลญto-Komandoj ---"
-#: ../fileio.c:6293
#, c-format
msgid "E680: <buffer=%d>: invalid buffer number "
msgstr "E680: <bufro=%d>: nevalida numero de bufro "
-#: ../fileio.c:6370
msgid "E217: Can't execute autocommands for ALL events"
msgstr "E217: Ne eblas plenumi aลญtokomandojn por ฤˆIUJ eventoj"
-#: ../fileio.c:6393
msgid "No matching autocommands"
msgstr "Neniu kongrua aลญtokomando"
-#: ../fileio.c:6831
msgid "E218: autocommand nesting too deep"
msgstr "E218: aลญtokomando tro ingita"
-#: ../fileio.c:7143
#, c-format
-msgid "%s Auto commands for \"%s\""
+msgid "%s Autocommands for \"%s\""
msgstr "%s Aลญtokomandoj por \"%s\""
-#: ../fileio.c:7149
#, c-format
msgid "Executing %s"
msgstr "Plenumado de %s"
-#: ../fileio.c:7211
#, c-format
msgid "autocommand %s"
msgstr "aลญtokomando %s"
-#: ../fileio.c:7795
msgid "E219: Missing {."
msgstr "E219: Mankas {."
-#: ../fileio.c:7797
msgid "E220: Missing }."
msgstr "E220: Mankas }."
-#: ../fold.c:93
msgid "E490: No fold found"
msgstr "E490: Neniu faldo trovita"
-#: ../fold.c:544
msgid "E350: Cannot create fold with current 'foldmethod'"
msgstr "E350: Ne eblas krei faldon per la aktuala 'foldmethod'"
-#: ../fold.c:546
msgid "E351: Cannot delete fold with current 'foldmethod'"
msgstr "E351: Ne eblas forviลi faldon per la aktuala 'foldmethod'"
-#: ../fold.c:1784
-#, c-format
-msgid "+--%3ld lines folded "
-msgstr "+--%3ld linioj falditaj "
-
-#. buffer has already been read
-#: ../getchar.c:273
msgid "E222: Add to read buffer"
msgstr "E222: Aldoni al lega bufro"
-#: ../getchar.c:2040
msgid "E223: recursive mapping"
msgstr "E223: rekursia mapo"
-#: ../getchar.c:2849
#, c-format
msgid "E224: global abbreviation already exists for %s"
msgstr "E224: malloka mallongigo jam ekzistas por %s"
-#: ../getchar.c:2852
#, c-format
msgid "E225: global mapping already exists for %s"
msgstr "E225: malloka mapo jam ekzistas por %s"
-#: ../getchar.c:2952
#, c-format
msgid "E226: abbreviation already exists for %s"
msgstr "E226: mallongigo jam ekzistas por %s"
-#: ../getchar.c:2955
#, c-format
msgid "E227: mapping already exists for %s"
msgstr "E227: mapo jam ekzistas por %s"
-#: ../getchar.c:3008
msgid "No abbreviation found"
msgstr "Neniu mallongigo trovita"
-#: ../getchar.c:3010
msgid "No mapping found"
msgstr "Neniu mapo trovita"
-#: ../getchar.c:3974
msgid "E228: makemap: Illegal mode"
msgstr "E228: makemap: Nevalida reฤimo"
-#. key value of 'cedit' option
-#. type of cmdline window or 0
-#. result of cmdline window or 0
-#: ../globals.h:924
-msgid "--No lines in buffer--"
-msgstr "--Neniu linio en bufro--"
-
-#.
-#. * The error messages that can be shared are included here.
-#. * Excluded are errors that are only used once and debugging messages.
-#.
-#: ../globals.h:996
-msgid "E470: Command aborted"
-msgstr "E470: komando ฤ‰esigita"
+msgid "E851: Failed to create a new process for the GUI"
+msgstr "E851: Malsukcesis krei novan procezon por la grafika interfaco"
-#: ../globals.h:997
-msgid "E471: Argument required"
-msgstr "E471: Argumento bezonata"
+msgid "E852: The child process failed to start the GUI"
+msgstr "E852: La ida procezo malsukcesis startigi la grafikan interfacon"
-#: ../globals.h:998
-msgid "E10: \\ should be followed by /, ? or &"
-msgstr "E10: \\ devus esti sekvita de /, ? aลญ &"
+msgid "E229: Cannot start the GUI"
+msgstr "E229: Ne eblas lanฤ‰i la grafikan interfacon"
-#: ../globals.h:1000
-msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
-msgstr ""
-"E11: Nevalida en fenestro de komanda linio; <CR> plenumas, CTRL-C eliras"
+#, c-format
+msgid "E230: Cannot read from \"%s\""
+msgstr "E230: Ne eblas legi el \"%s\""
-#: ../globals.h:1002
-msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
+msgid "E665: Cannot start GUI, no valid font found"
msgstr ""
-"E12: Nepermesebla komando el exrc/vimrc en aktuala dosierujo aลญ etikeda serฤ‰o"
+"E665: Ne eblas startigi grafikan interfacon, neniu valida tiparo trovita"
-#: ../globals.h:1003
-msgid "E171: Missing :endif"
-msgstr "E171: Mankas \":endif\""
-
-#: ../globals.h:1004
-msgid "E600: Missing :endtry"
-msgstr "E600: Mankas \":endtry\""
+msgid "E231: 'guifontwide' invalid"
+msgstr "E231: 'guifontwide' nevalida"
-#: ../globals.h:1005
-msgid "E170: Missing :endwhile"
-msgstr "E170: Mankas \":endwhile\""
+msgid "E599: Value of 'imactivatekey' is invalid"
+msgstr "E599: Valoro de 'imactivatekey' estas nevalida"
-#: ../globals.h:1006
-msgid "E170: Missing :endfor"
-msgstr "E170: Mankas \":endfor\""
+#, c-format
+msgid "E254: Cannot allocate color %s"
+msgstr "E254: Ne eblas disponigi koloron %s"
-#: ../globals.h:1007
-msgid "E588: :endwhile without :while"
-msgstr "E588: \":endwhile\" sen \":while\""
+msgid "No match at cursor, finding next"
+msgstr "Neniu kongruo ฤ‰e kursorpozicio, trovas sekvan"
-#: ../globals.h:1008
-msgid "E588: :endfor without :for"
-msgstr "E588: \":endfor\" sen \":for\""
+msgid "<cannot open> "
+msgstr "<ne eblas malfermi> "
-#: ../globals.h:1009
-msgid "E13: File exists (add ! to override)"
-msgstr "E13: Dosiero ekzistas (aldonu ! por transpasi)"
+#, c-format
+msgid "E616: vim_SelFile: can't get font %s"
+msgstr "E616: vim_SelFile: ne eblas akiri tiparon %s"
-#: ../globals.h:1010
-msgid "E472: Command failed"
-msgstr "E472: La komando fiaskis"
+msgid "E614: vim_SelFile: can't return to current directory"
+msgstr "E614: vim_SelFile: ne eblas reveni al la aktuala dosierujo"
-#: ../globals.h:1011
-msgid "E473: Internal error"
-msgstr "E473: Interna eraro"
+msgid "Pathname:"
+msgstr "Serฤ‰vojo:"
-#: ../globals.h:1012
-msgid "Interrupted"
-msgstr "Interrompita"
+msgid "E615: vim_SelFile: can't get current directory"
+msgstr "E615: vim_SelFile: ne eblas akiri aktualan dosierujon"
-#: ../globals.h:1013
-msgid "E14: Invalid address"
-msgstr "E14: Nevalida adreso"
+msgid "OK"
+msgstr "Bone"
-#: ../globals.h:1014
-msgid "E474: Invalid argument"
-msgstr "E474: Nevalida argumento"
+msgid "Cancel"
+msgstr "Rezigni"
-#: ../globals.h:1015
-#, c-format
-msgid "E475: Invalid argument: %s"
-msgstr "E475: Nevalida argumento: %s"
+msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
+msgstr ""
+"Fenestraฤตo de rulumskalo: Ne eblis akiri geometrion de reduktita rastrumbildo"
-#: ../globals.h:1016
-#, c-format
-msgid "E15: Invalid expression: %s"
-msgstr "E15: Nevalida esprimo: %s"
+msgid "Vim dialog"
+msgstr "Vim dialogo"
-#: ../globals.h:1017
-msgid "E16: Invalid range"
-msgstr "E16: Nevalida amplekso"
+msgid "E232: Cannot create BalloonEval with both message and callback"
+msgstr "E232: Ne eblas krei BalloonEval kun ambaลญ mesaฤo kaj reagfunkcio"
-#: ../globals.h:1018
-msgid "E476: Invalid command"
-msgstr "E476: Nevalida komando"
+msgid "_Cancel"
+msgstr "_Rezigni"
-#: ../globals.h:1019
-#, c-format
-msgid "E17: \"%s\" is a directory"
-msgstr "E17: \"%s\" estas dosierujo"
+msgid "_Save"
+msgstr "_Konservi"
-#: ../globals.h:1020
-#, fuzzy
-msgid "E900: Invalid job id"
-msgstr "E49: Nevalida grando de rulumo"
+msgid "_Open"
+msgstr "_Malfermi"
-#: ../globals.h:1021
-msgid "E901: Job table is full"
-msgstr ""
+msgid "_OK"
+msgstr "_Bone"
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
+msgid ""
+"&Yes\n"
+"&No\n"
+"&Cancel"
msgstr ""
+"&Jes\n"
+"&Ne\n"
+"&Rezigni"
-#: ../globals.h:1024
-#, c-format
-msgid "E364: Library call failed for \"%s()\""
-msgstr "E364: Alvoko al biblioteko fiaskis por \"%s()\""
+msgid "Yes"
+msgstr "Jes"
-#: ../globals.h:1026
-msgid "E19: Mark has invalid line number"
-msgstr "E19: Marko havas nevalidan numeron de linio"
+msgid "No"
+msgstr "Ne"
-#: ../globals.h:1027
-msgid "E20: Mark not set"
-msgstr "E20: Marko ne estas agordita"
+# todo '_' is for hotkey, i guess?
+msgid "Input _Methods"
+msgstr "Enigaj _metodoj"
-#: ../globals.h:1029
-msgid "E21: Cannot make changes, 'modifiable' is off"
-msgstr "E21: Ne eblas fari ลanฤojn, 'modifiable' estas malลaltita"
+msgid "VIM - Search and Replace..."
+msgstr "VIM - Serฤ‰i kaj anstataลญigi..."
-#: ../globals.h:1030
-msgid "E22: Scripts nested too deep"
-msgstr "E22: Tro profunde ingitaj skriptoj"
+msgid "VIM - Search..."
+msgstr "VIM- Serฤ‰i..."
-#: ../globals.h:1031
-msgid "E23: No alternate file"
-msgstr "E23: Neniu alterna dosiero"
+msgid "Find what:"
+msgstr "Serฤ‰i kion:"
-#: ../globals.h:1032
-msgid "E24: No such abbreviation"
-msgstr "E24: Ne estas tia mallongigo"
+msgid "Replace with:"
+msgstr "Anstataลญigi per:"
-#: ../globals.h:1033
-msgid "E477: No ! allowed"
-msgstr "E477: Neniu ! permesebla"
+msgid "Match whole word only"
+msgstr "Kongrui kun nur plena vorto"
-#: ../globals.h:1035
-msgid "E25: Nvim does not have a built-in GUI"
-msgstr "E25: Grafika interfaco ne uzeblas: Malลaltita dum kompilado"
+msgid "Match case"
+msgstr "Uskleca kongruo"
-#: ../globals.h:1036
-#, c-format
-msgid "E28: No such highlight group name: %s"
-msgstr "E28: Neniu grupo de emfazo kiel: %s"
+msgid "Direction"
+msgstr "Direkto"
-#: ../globals.h:1037
-msgid "E29: No inserted text yet"
-msgstr "E29: Ankoraลญ neniu enmetita teksto"
+msgid "Up"
+msgstr "Supren"
-#: ../globals.h:1038
-msgid "E30: No previous command line"
-msgstr "E30: Neniu antaลญa komanda linio"
+msgid "Down"
+msgstr "Suben"
-#: ../globals.h:1039
-msgid "E31: No such mapping"
-msgstr "E31: Neniu tiel mapo"
+msgid "Find Next"
+msgstr "Trovi sekvantan"
-#: ../globals.h:1040
-msgid "E479: No match"
-msgstr "E479: Neniu kongruo"
+msgid "Replace"
+msgstr "Anstataลญigi"
-#: ../globals.h:1041
-#, c-format
-msgid "E480: No match: %s"
-msgstr "E480: Neniu kongruo: %s"
+msgid "Replace All"
+msgstr "Anstataลญigi ฤ‰iujn"
-#: ../globals.h:1042
-msgid "E32: No file name"
-msgstr "E32: Neniu dosiernomo"
+msgid "_Close"
+msgstr "_Fermi"
-#: ../globals.h:1044
-msgid "E33: No previous substitute regular expression"
-msgstr "E33: Neniu antaลญa regulesprimo de anstataลญigo"
+msgid "Vim: Received \"die\" request from session manager\n"
+msgstr "Vim: Ricevis peton \"die\" (morti) el la seanca administrilo\n"
-#: ../globals.h:1045
-msgid "E34: No previous command"
-msgstr "E34: Neniu antaลญa komando"
+msgid "Close tab"
+msgstr "Fermi langeton"
-#: ../globals.h:1046
-msgid "E35: No previous regular expression"
-msgstr "E35: Neniu antaลญa regulesprimo"
+msgid "New tab"
+msgstr "Nova langeto"
-#: ../globals.h:1047
-msgid "E481: No range allowed"
-msgstr "E481: Amplekso nepermesebla"
+msgid "Open Tab..."
+msgstr "Malfermi langeton..."
-#: ../globals.h:1048
-msgid "E36: Not enough room"
-msgstr "E36: Ne sufiฤ‰e da spaco"
+msgid "Vim: Main window unexpectedly destroyed\n"
+msgstr "Vim: ฤˆefa fenestro neatendite detruiฤis\n"
-#: ../globals.h:1049
-#, c-format
-msgid "E482: Can't create file %s"
-msgstr "E482: Ne eblas krei dosieron %s"
+msgid "&Filter"
+msgstr "&Filtri"
-#: ../globals.h:1050
-msgid "E483: Can't get temp file name"
-msgstr "E483: Ne eblas akiri provizoran dosiernomon"
+msgid "&Cancel"
+msgstr "&Rezigni"
-#: ../globals.h:1051
-#, c-format
-msgid "E484: Can't open file %s"
-msgstr "E484: Ne eblas malfermi dosieron %s"
+msgid "Directories"
+msgstr "Dosierujoj"
-#: ../globals.h:1052
-#, c-format
-msgid "E485: Can't read file %s"
-msgstr "E485: Ne eblas legi dosieron %s"
+msgid "Filter"
+msgstr "Filtri"
-#: ../globals.h:1054
-msgid "E37: No write since last change (add ! to override)"
-msgstr "E37: Neniu skribo de post lasta ลanฤo (aldonu ! por transpasi)"
+msgid "&Help"
+msgstr "&Helpo"
-#: ../globals.h:1055
-#, fuzzy
-msgid "E37: No write since last change"
-msgstr "[Neniu skribo de post lasta ลanฤo]\n"
+msgid "Files"
+msgstr "Dosieroj"
-#: ../globals.h:1056
-msgid "E38: Null argument"
-msgstr "E38: Nula argumento"
+msgid "&OK"
+msgstr "&Bone"
-#: ../globals.h:1057
-msgid "E39: Number expected"
-msgstr "E39: Nombro atendita"
+msgid "Selection"
+msgstr "Apartigo"
-#: ../globals.h:1058
-#, c-format
-msgid "E40: Can't open errorfile %s"
-msgstr "E40: Ne eblas malfermi eraran dosieron %s"
+msgid "Find &Next"
+msgstr "Trovi &Sekvanta"
-#: ../globals.h:1059
-msgid "E41: Out of memory!"
-msgstr "E41: Ne plu restas memoro!"
+msgid "&Replace"
+msgstr "&Anstataลญigi"
-#: ../globals.h:1060
-msgid "Pattern not found"
-msgstr "ลœablono ne trovita"
+msgid "Replace &All"
+msgstr "Anstataลญigi ฤ‰i&on"
-#: ../globals.h:1061
-#, c-format
-msgid "E486: Pattern not found: %s"
-msgstr "E486: ลœablono ne trovita: %s"
+msgid "&Undo"
+msgstr "&Malfari"
-#: ../globals.h:1062
-msgid "E487: Argument must be positive"
-msgstr "E487: La argumento devas esti pozitiva"
+msgid "Open tab..."
+msgstr "Malfermi langeton..."
-#: ../globals.h:1064
-msgid "E459: Cannot go back to previous directory"
-msgstr "E459: Ne eblas reiri al antaลญa dosierujo"
+msgid "Find string"
+msgstr "Trovi ฤ‰enon"
-#: ../globals.h:1066
-msgid "E42: No Errors"
-msgstr "E42: Neniu eraro"
+msgid "Find & Replace"
+msgstr "Trovi & Anstataลญigi"
-#: ../globals.h:1067
-msgid "E776: No location list"
-msgstr "E776: Neniu listo de loko"
+msgid "Not Used"
+msgstr "Ne uzata"
-#: ../globals.h:1068
-msgid "E43: Damaged match string"
-msgstr "E43: Difekta kongruenda ฤ‰eno"
+msgid "Directory\t*.nothing\n"
+msgstr "Dosierujo\t*.nenio\n"
-#: ../globals.h:1069
-msgid "E44: Corrupted regexp program"
-msgstr "E44: Difekta programo de regulesprimo"
-
-#: ../globals.h:1071
-msgid "E45: 'readonly' option is set (add ! to override)"
-msgstr "E45: La opcio 'readonly' estas ลaltita '(aldonu ! por transpasi)"
-
-#: ../globals.h:1073
#, c-format
-msgid "E46: Cannot change read-only variable \"%s\""
-msgstr "E46: Ne eblas ลanฤi nurlegeblan variablon \"%s\""
+msgid "E671: Cannot find window title \"%s\""
+msgstr "E671: Ne eblas trovi titolon de fenestro \"%s\""
-#: ../globals.h:1075
#, c-format
-msgid "E794: Cannot set variable in the sandbox: \"%s\""
-msgstr "E794: Ne eblas agordi variablon en la sabloludejo: \"%s\""
+msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
+msgstr "E243: Ne subtenata argumento: \"-%s\"; Uzu la version OLE."
-msgid "E713: Cannot use empty key for Dictionary"
-msgstr "E713: Ne eblas uzi malplenan ลlosilon de Vortaro"
-
-#: ../globals.h:1076
-msgid "E47: Error while reading errorfile"
-msgstr "E47: Eraro dum legado de erardosiero"
+msgid "E672: Unable to open window inside MDI application"
+msgstr "E672: Ne eblas malfermi fenestron interne de aplikaฤตo MDI"
-#: ../globals.h:1078
-msgid "E48: Not allowed in sandbox"
-msgstr "E48: Nepermesebla en sabloludejo"
-
-#: ../globals.h:1080
-msgid "E523: Not allowed here"
-msgstr "E523: Nepermesebla tie"
-
-#: ../globals.h:1082
-msgid "E359: Screen mode setting not supported"
-msgstr "E359: Reฤimo de ekrano ne subtenata"
-
-#: ../globals.h:1083
-msgid "E49: Invalid scroll size"
-msgstr "E49: Nevalida grando de rulumo"
-
-#: ../globals.h:1084
-msgid "E91: 'shell' option is empty"
-msgstr "E91: La opcio 'shell' estas malplena"
-
-#: ../globals.h:1085
-msgid "E255: Couldn't read in sign data!"
-msgstr "E255: Ne eblis legi datumojn de simboloj!"
-
-#: ../globals.h:1086
-msgid "E72: Close error on swap file"
-msgstr "E72: Eraro dum malfermo de permutodosiero .swp"
-
-#: ../globals.h:1087
-msgid "E73: tag stack empty"
-msgstr "E73: malplena stako de etikedo"
-
-#: ../globals.h:1088
-msgid "E74: Command too complex"
-msgstr "E74: Komando tro kompleksa"
-
-#: ../globals.h:1089
-msgid "E75: Name too long"
-msgstr "E75: Nomo tro longa"
+msgid "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
+msgstr ""
+"Vim E458: Ne eblas disponigi rikordon de kolormapo, iuj koloroj estas eble "
+"neฤustaj"
-#: ../globals.h:1090
-msgid "E76: Too many ["
-msgstr "E76: Tro da ["
+#, c-format
+msgid "E250: Fonts for the following charsets are missing in fontset %s:"
+msgstr "E250: Tiparoj de tiuj signaroj mankas en aro de tiparo %s:"
-#: ../globals.h:1091
-msgid "E77: Too many file names"
-msgstr "E77: Tro da dosiernomoj"
+#, c-format
+msgid "E252: Fontset name: %s"
+msgstr "E252: Nomo de tiparo: %s"
-#: ../globals.h:1092
-msgid "E488: Trailing characters"
-msgstr "E488: Vostaj signoj"
+#, c-format
+msgid "Font '%s' is not fixed-width"
+msgstr "Tiparo '%s' ne estas egallarฤa"
-#: ../globals.h:1093
-msgid "E78: Unknown mark"
-msgstr "E78: Nekonata marko"
+#, c-format
+msgid "E253: Fontset name: %s"
+msgstr "E253: Nomo de tiparo: %s"
-#: ../globals.h:1094
-msgid "E79: Cannot expand wildcards"
-msgstr "E79: Ne eblas malvolvi ฤตokerojn"
+#, c-format
+msgid "Font0: %s"
+msgstr "Font0: %s"
-#: ../globals.h:1096
-msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
-msgstr "E591: 'winheight' ne rajtas esti malpli ol 'winminheight'"
+#, c-format
+msgid "Font1: %s"
+msgstr "Font1: %s"
-#: ../globals.h:1098
-msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
-msgstr "E592: 'winwidth' ne rajtas esti malpli ol 'winminwidth'"
+#, c-format
+msgid "Font%ld width is not twice that of font0"
+msgstr "Font%ld ne estas duoble pli larฤa ol font0"
-#: ../globals.h:1099
-msgid "E80: Error while writing"
-msgstr "E80: Eraro dum skribado"
+#, c-format
+msgid "Font0 width: %ld"
+msgstr "Larฤo de font0: %ld"
-#: ../globals.h:1100
-msgid "Zero count"
-msgstr "Nul kvantoro"
+#, c-format
+msgid "Font1 width: %ld"
+msgstr "Larฤo de Font1: %ld"
-#: ../globals.h:1101
-msgid "E81: Using <SID> not in a script context"
-msgstr "E81: Uzo de <SID> ekster kunteksto de skripto"
+msgid "Invalid font specification"
+msgstr "Nevalida tiparo specifita"
-#: ../globals.h:1102
-#, c-format
-msgid "E685: Internal error: %s"
-msgstr "E685: Interna eraro: %s"
+msgid "&Dismiss"
+msgstr "&Forlasi"
-#: ../globals.h:1104
-msgid "E363: pattern uses more memory than 'maxmempattern'"
-msgstr "E363: ลablono uzas pli da memoro ol 'maxmempattern'"
+msgid "no specific match"
+msgstr "Neniu specifa kongruo"
-#: ../globals.h:1105
-msgid "E749: empty buffer"
-msgstr "E749: malplena bufro"
+msgid "Vim - Font Selector"
+msgstr "Vim - Elektilo de tiparo"
-#: ../globals.h:1226
-#, c-format
-msgid "E86: Buffer %<PRId64> does not exist"
-msgstr "E86: La bufro %<PRId64> ne ekzistas"
+msgid "Name:"
+msgstr "Nomo:"
-#: ../globals.h:1108
-msgid "E682: Invalid search pattern or delimiter"
-msgstr "E682: Nevalida serฤ‰a ลablono aลญ disigilo"
+msgid "Show size in Points"
+msgstr "Montri grandon en punktoj"
-#: ../globals.h:1109
-msgid "E139: File is loaded in another buffer"
-msgstr "E139: Dosiero estas ลargita en alia bufro"
+msgid "Encoding:"
+msgstr "Kodoprezento:"
-#: ../globals.h:1110
-#, c-format
-msgid "E764: Option '%s' is not set"
-msgstr "E764: La opcio '%s' ne estas ลaltita"
+msgid "Font:"
+msgstr "Tiparo:"
-#: ../globals.h:1111
-msgid "E850: Invalid register name"
-msgstr "E850: Nevalida nomo de reฤistro"
+msgid "Style:"
+msgstr "Stilo:"
-#: ../globals.h:1114
-msgid "search hit TOP, continuing at BOTTOM"
-msgstr "serฤ‰o atingis SUPRON, daลญrigonte al SUBO"
+msgid "Size:"
+msgstr "Grando:"
-#: ../globals.h:1115
-msgid "search hit BOTTOM, continuing at TOP"
-msgstr "serฤ‰o atingis SUBON, daลญrigonte al SUPRO"
+msgid "E256: Hangul automata ERROR"
+msgstr "E256: ERARO en aลญtomato de korea alfabeto"
-#: ../hardcopy.c:240
msgid "E550: Missing colon"
msgstr "E550: Mankas dupunkto"
-#: ../hardcopy.c:252
msgid "E551: Illegal component"
msgstr "E551: Nevalida komponento"
-#: ../hardcopy.c:259
msgid "E552: digit expected"
msgstr "E552: cifero atendita"
-#: ../hardcopy.c:473
#, c-format
msgid "Page %d"
msgstr "Paฤo %d"
-#: ../hardcopy.c:597
msgid "No text to be printed"
msgstr "Neniu presenda teksto"
-#: ../hardcopy.c:668
#, c-format
msgid "Printing page %d (%d%%)"
msgstr "Presas paฤon %d (%d%%)"
-#: ../hardcopy.c:680
#, c-format
msgid " Copy %d of %d"
msgstr " Kopio %d de %d"
-#: ../hardcopy.c:733
#, c-format
msgid "Printed: %s"
msgstr "Presis: %s"
-#: ../hardcopy.c:740
msgid "Printing aborted"
msgstr "Presado ฤ‰esigita"
-#: ../hardcopy.c:1365
msgid "E455: Error writing to PostScript output file"
msgstr "E455: Eraro dum skribo de PostSkripta eliga dosiero"
-#: ../hardcopy.c:1747
#, c-format
msgid "E624: Can't open file \"%s\""
msgstr "E624: Ne eblas malfermi dosieron \"%s\""
-#: ../hardcopy.c:1756 ../hardcopy.c:2470
#, c-format
msgid "E457: Can't read PostScript resource file \"%s\""
msgstr "E457: Ne eblas legi dosieron de PostSkripta rimedo \"%s\""
-#: ../hardcopy.c:1772
#, c-format
msgid "E618: file \"%s\" is not a PostScript resource file"
msgstr "E618: \"%s\" ne estas dosiero de PostSkripta rimedo"
-#: ../hardcopy.c:1788 ../hardcopy.c:1805 ../hardcopy.c:1844
#, c-format
msgid "E619: file \"%s\" is not a supported PostScript resource file"
msgstr "E619: \"%s\" ne estas subtenata dosiero de PostSkripta rimedo"
-#: ../hardcopy.c:1856
#, c-format
msgid "E621: \"%s\" resource file has wrong version"
msgstr "E621: \"%s\" dosiero de rimedo havas neฤustan version"
-#: ../hardcopy.c:2225
msgid "E673: Incompatible multi-byte encoding and character set."
msgstr "E673: Nekongrua plurbajta kodoprezento kaj signaro."
-#: ../hardcopy.c:2238
msgid "E674: printmbcharset cannot be empty with multi-byte encoding."
msgstr ""
"E674: printmbcharset ne rajtas esti malplena kun plurbajta kodoprezento."
-#: ../hardcopy.c:2254
msgid "E675: No default font specified for multi-byte printing."
msgstr "E675: Neniu defaลญlta tiparo specifita por plurbajta presado."
-#: ../hardcopy.c:2426
msgid "E324: Can't open PostScript output file"
msgstr "E324: Ne eblas malfermi eligan PostSkriptan dosieron"
-#: ../hardcopy.c:2458
#, c-format
msgid "E456: Can't open file \"%s\""
msgstr "E456: Ne eblas malfermi dosieron \"%s\""
-#: ../hardcopy.c:2583
msgid "E456: Can't find PostScript resource file \"prolog.ps\""
msgstr "E456: Dosiero de PostSkripta rimedo \"prolog.ps\" ne troveblas"
-#: ../hardcopy.c:2593
msgid "E456: Can't find PostScript resource file \"cidfont.ps\""
msgstr "E456: Dosiero de PostSkripta rimedo \"cidfont.ps\" ne troveblas"
-#: ../hardcopy.c:2622 ../hardcopy.c:2639 ../hardcopy.c:2665
#, c-format
msgid "E456: Can't find PostScript resource file \"%s.ps\""
msgstr "E456: Dosiero de PostSkripta rimedo \"%s.ps\" ne troveblas"
-#: ../hardcopy.c:2654
#, c-format
msgid "E620: Unable to convert to print encoding \"%s\""
msgstr "E620: Ne eblas konverti al la presa kodoprezento \"%s\""
-#: ../hardcopy.c:2877
msgid "Sending to printer..."
msgstr "Sendas al presilo..."
-#: ../hardcopy.c:2881
msgid "E365: Failed to print PostScript file"
-msgstr "E365: Presado de PostSkripta dosiero fiaskis"
+msgstr "E365: Presado de PostSkripta dosiero malsukcesis"
-#: ../hardcopy.c:2883
msgid "Print job sent."
msgstr "Laboro de presado sendita."
-#: ../if_cscope.c:85
msgid "Add a new database"
msgstr "Aldoni novan datumbazon"
-#: ../if_cscope.c:87
msgid "Query for a pattern"
msgstr "Serฤ‰i ลablonon"
-#: ../if_cscope.c:89
msgid "Show this message"
msgstr "Montri tiun mesaฤon"
-#: ../if_cscope.c:91
msgid "Kill a connection"
msgstr "ฤˆesigi konekton"
-#: ../if_cscope.c:93
msgid "Reinit all connections"
msgstr "Repravalorizi ฤ‰iujn konektojn"
-#: ../if_cscope.c:95
msgid "Show connections"
msgstr "Montri konektojn"
-#: ../if_cscope.c:101
#, c-format
msgid "E560: Usage: cs[cope] %s"
msgstr "E560: Uzo: cs[cope] %s"
-#: ../if_cscope.c:225
msgid "This cscope command does not support splitting the window.\n"
msgstr "Tiu ฤ‰i komando de cscope ne subtenas dividon de fenestro.\n"
-#: ../if_cscope.c:266
msgid "E562: Usage: cstag <ident>"
msgstr "E562: Uzo: cstag <ident>"
-#: ../if_cscope.c:313
msgid "E257: cstag: tag not found"
msgstr "E257: cstag: etikedo netrovita"
-#: ../if_cscope.c:461
#, c-format
msgid "E563: stat(%s) error: %d"
msgstr "E563: Eraro de stat(%s): %d"
-#: ../if_cscope.c:551
+msgid "E563: stat error"
+msgstr "E563: Eraro de stat"
+
#, c-format
msgid "E564: %s is not a directory or a valid cscope database"
msgstr "E564: %s ne estas dosierujo aลญ valida datumbazo de cscope"
-#: ../if_cscope.c:566
#, c-format
msgid "Added cscope database %s"
msgstr "Aldonis datumbazon de cscope %s"
-#: ../if_cscope.c:616
#, c-format
-msgid "E262: error reading cscope connection %<PRId64>"
-msgstr "E262: eraro dum legado de konekto de cscope %<PRId64>"
+msgid "E262: error reading cscope connection %ld"
+msgstr "E262: eraro dum legado de konekto de cscope %ld"
-#: ../if_cscope.c:711
msgid "E561: unknown cscope search type"
msgstr "E561: nekonata tipo de serฤ‰o de cscope"
-#: ../if_cscope.c:752 ../if_cscope.c:789
msgid "E566: Could not create cscope pipes"
msgstr "E566: Ne eblis krei duktojn de cscope"
-#: ../if_cscope.c:767
msgid "E622: Could not fork for cscope"
msgstr "E622: Ne eblis forki cscope"
-#: ../if_cscope.c:849
-#, fuzzy
msgid "cs_create_connection setpgid failed"
-msgstr "plenumo de cs_create_connection fiaskis"
+msgstr "plenumo de cs_create_connection-setgpid malsukcesis"
-#: ../if_cscope.c:853 ../if_cscope.c:889
msgid "cs_create_connection exec failed"
-msgstr "plenumo de cs_create_connection fiaskis"
+msgstr "plenumo de cs_create_connection malsukcesis"
-#: ../if_cscope.c:863 ../if_cscope.c:902
msgid "cs_create_connection: fdopen for to_fp failed"
-msgstr "cs_create_connection: fdopen de to_fp fiaskis"
+msgstr "cs_create_connection: fdopen de to_fp malsukcesis"
-#: ../if_cscope.c:865 ../if_cscope.c:906
msgid "cs_create_connection: fdopen for fr_fp failed"
-msgstr "cs_create_connection: fdopen de fr_fp fiaskis"
+msgstr "cs_create_connection: fdopen de fr_fp malsukcesis"
-#: ../if_cscope.c:890
msgid "E623: Could not spawn cscope process"
msgstr "E623: Ne eblis naskigi procezon cscope"
-#: ../if_cscope.c:932
msgid "E567: no cscope connections"
msgstr "E567: neniu konekto al cscope"
-#: ../if_cscope.c:1009
#, c-format
msgid "E469: invalid cscopequickfix flag %c for %c"
msgstr "E469: nevalida flago cscopequickfix %c de %c"
-#: ../if_cscope.c:1058
#, c-format
msgid "E259: no matches found for cscope query %s of %s"
msgstr "E259: neniu kongruo trovita por serฤ‰o per cscope %s de %s"
-#: ../if_cscope.c:1142
msgid "cscope commands:\n"
msgstr "komandoj de cscope:\n"
-#: ../if_cscope.c:1150
#, c-format
msgid "%-5s: %s%*s (Usage: %s)"
msgstr "%-5s: %s%*s (Uzo: %s)"
-#: ../if_cscope.c:1155
msgid ""
"\n"
+" a: Find assignments to this symbol\n"
" c: Find functions calling this function\n"
" d: Find functions called by this function\n"
" e: Find this egrep pattern\n"
@@ -3263,6 +2559,7 @@ msgid ""
" t: Find this text string\n"
msgstr ""
"\n"
+" a: Trovi valorizojn al tiu simbolo\n"
" c: Trovi funkciojn, kiuj alvokas tiun funkcion\n"
" d: Trovi funkciojn alvokataj de tiu funkcio\n"
" e: Trovi tiun egrep-ลablonon\n"
@@ -3272,31 +2569,31 @@ msgstr ""
" s: Trovi tiun C-simbolon\n"
" t: Trovi tiun ฤ‰enon\n"
-#: ../if_cscope.c:1226
+#, c-format
+msgid "E625: cannot open cscope database: %s"
+msgstr "E625: ne eblas malfermi datumbazon de cscope: %s"
+
+msgid "E626: cannot get cscope database information"
+msgstr "E626: ne eblas akiri informojn pri la datumbazo de cscope"
+
msgid "E568: duplicate cscope database not added"
msgstr "E568: ripetita datumbazo de cscope ne aldonita"
-#: ../if_cscope.c:1335
#, c-format
msgid "E261: cscope connection %s not found"
msgstr "E261: konekto cscope %s netrovita"
-#: ../if_cscope.c:1364
#, c-format
msgid "cscope connection %s closed"
msgstr "konekto cscope %s fermita"
-#. should not reach here
-#: ../if_cscope.c:1486
msgid "E570: fatal error in cs_manage_matches"
msgstr "E570: neriparebla eraro en cs_manage_matches"
-#: ../if_cscope.c:1693
#, c-format
msgid "Cscope tag: %s"
msgstr "Etikedo de cscope: %s"
-#: ../if_cscope.c:1711
msgid ""
"\n"
" # line"
@@ -3304,87 +2601,303 @@ msgstr ""
"\n"
" nro linio"
-#: ../if_cscope.c:1713
msgid "filename / context / line\n"
msgstr "dosiernomo / kunteksto / linio\n"
-#: ../if_cscope.c:1809
#, c-format
msgid "E609: Cscope error: %s"
msgstr "E609: Eraro de cscope: %s"
-#: ../if_cscope.c:2053
msgid "All cscope databases reset"
msgstr "Reลargo de ฤ‰iuj datumbazoj de cscope"
-#: ../if_cscope.c:2123
msgid "no cscope connections\n"
msgstr "neniu konekto de cscope\n"
-#: ../if_cscope.c:2126
msgid " # pid database name prepend path\n"
msgstr " # pid nomo de datumbazo prefiksa vojo\n"
-#: ../main.c:144
+msgid "Lua library cannot be loaded."
+msgstr "La biblioteko Lua no ลargeblis."
+
+msgid "cannot save undo information"
+msgstr "ne eblas konservi informojn de malfaro"
+
+msgid ""
+"E815: Sorry, this command is disabled, the MzScheme libraries could not be "
+"loaded."
+msgstr ""
+"E815: Bedaลญrinde, tiu komando estas malลaltita, ne eblis ลargi la "
+"bibliotekojn."
+
+msgid ""
+"E895: Sorry, this command is disabled, the MzScheme's racket/base module "
+"could not be loaded."
+msgstr ""
+"E895: Bedaลญrinde, tiu komando estas malลaltita, ne eblis ลargi la modulon de "
+"MzScheme racket/base."
+
+msgid "invalid expression"
+msgstr "nevalida esprimo"
+
+msgid "expressions disabled at compile time"
+msgstr "esprimoj malลaltitaj dum kompilado"
+
+msgid "hidden option"
+msgstr "kaลita opcio"
+
+msgid "unknown option"
+msgstr "nekonata opcio"
+
+msgid "window index is out of range"
+msgstr "indekso de fenestro estas ekster limoj"
+
+msgid "couldn't open buffer"
+msgstr "ne eblis malfermi bufron"
+
+msgid "cannot delete line"
+msgstr "ne eblas forviลi linion"
+
+msgid "cannot replace line"
+msgstr "ne eblas anstataลญigi linion"
+
+msgid "cannot insert line"
+msgstr "ne eblas enmeti linion"
+
+msgid "string cannot contain newlines"
+msgstr "ฤ‰eno ne rajtas enhavi liniavancojn"
+
+msgid "error converting Scheme values to Vim"
+msgstr "eraro dum konverto de Scheme-valoro al Vim"
+
+msgid "Vim error: ~a"
+msgstr "Eraro de Vim: ~a"
+
+msgid "Vim error"
+msgstr "Eraro de Vim"
+
+msgid "buffer is invalid"
+msgstr "bufro estas nevalida"
+
+msgid "window is invalid"
+msgstr "fenestro estas nevalida"
+
+msgid "linenr out of range"
+msgstr "numero de linio ekster limoj"
+
+msgid "not allowed in the Vim sandbox"
+msgstr "nepermesebla en sabloludejo de Vim"
+
+msgid "E836: This Vim cannot execute :python after using :py3"
+msgstr "E836: Vim ne povas plenumi :python post uzo de :py3"
+
+msgid ""
+"E263: Sorry, this command is disabled, the Python library could not be "
+"loaded."
+msgstr ""
+"E263: Bedaลญrinde tiu komando estas malลaltita: la biblioteko de Pitono ne "
+"ลargeblis."
+
+msgid ""
+"E887: Sorry, this command is disabled, the Python's site module could not be "
+"loaded."
+msgstr ""
+"E887` Bedaลญrinde tiu komando estas malลaltita: la biblioteko de Pitono ne "
+"ลargeblis."
+
+msgid "E659: Cannot invoke Python recursively"
+msgstr "E659: Ne eblas alvoki Pitonon rekursie"
+
+msgid "E837: This Vim cannot execute :py3 after using :python"
+msgstr "E837: Vim ne povas plenumi :py3 post uzo de :python"
+
+msgid "E265: $_ must be an instance of String"
+msgstr "E265: $_ devas esti apero de ฤˆeno"
+
+msgid ""
+"E266: Sorry, this command is disabled, the Ruby library could not be loaded."
+msgstr ""
+"E266: Bedaลญrinde tiu komando estas malลaltita, la biblioteko Ruby ne "
+"ลargeblis."
+
+msgid "E267: unexpected return"
+msgstr "E267: \"return\" neatendita"
+
+msgid "E268: unexpected next"
+msgstr "E268: \"next\" neatendita"
+
+msgid "E269: unexpected break"
+msgstr "E269: \"break\" neatendita"
+
+msgid "E270: unexpected redo"
+msgstr "E270: \"redo\" neatendita"
+
+msgid "E271: retry outside of rescue clause"
+msgstr "E271: \"retry\" ekster klaลญzo \"rescue\""
+
+msgid "E272: unhandled exception"
+msgstr "E272: netraktita escepto"
+
+#, c-format
+msgid "E273: unknown longjmp status %d"
+msgstr "E273: nekonata stato de longjmp: %d"
+
+msgid "invalid buffer number"
+msgstr "nevalida numero de bufro"
+
+msgid "not implemented yet"
+msgstr "ankoraลญ ne realigita"
+
+msgid "cannot set line(s)"
+msgstr "ne eblas meti la linio(j)n"
+
+msgid "invalid mark name"
+msgstr "nevalida nomo de marko"
+
+msgid "mark not set"
+msgstr "marko ne estas metita"
+
+#, c-format
+msgid "row %d column %d"
+msgstr "linio %d kolumno %d"
+
+msgid "cannot insert/append line"
+msgstr "ne eblas enmeti/postaldoni linion"
+
+msgid "line number out of range"
+msgstr "numero de linio ekster limoj"
+
+msgid "unknown flag: "
+msgstr "nekonata flago: "
+
+# DP: ฤ‰u traduki vimOption
+msgid "unknown vimOption"
+msgstr "nekonata vimOption"
+
+msgid "keyboard interrupt"
+msgstr "klavara interrompo"
+
+msgid "vim error"
+msgstr "eraro de Vim"
+
+msgid "cannot create buffer/window command: object is being deleted"
+msgstr "ne eblas krei komandon de bufro/fenestro: objekto estas forviลiฤanta"
+
+msgid ""
+"cannot register callback command: buffer/window is already being deleted"
+msgstr ""
+"ne eblas registri postalvokan komandon: bufro/fenestro estas jam forviลiฤanta"
+
+msgid ""
+"E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-dev@vim."
+"org"
+msgstr ""
+"E280: NERIPAREBLA TCL-ERARO: reflist difekta!? Bv. retpoลti al vim-dev@vim."
+"org"
+
+msgid "cannot register callback command: buffer/window reference not found"
+msgstr ""
+"ne eblas registri postalvokan komandon: referenco de bufro/fenestro ne "
+"troveblas"
+
+msgid ""
+"E571: Sorry, this command is disabled: the Tcl library could not be loaded."
+msgstr ""
+"E571: Bedaลญrinde tiu komando estas malลaltita: la biblioteko Tcl ne "
+"ลargeblis."
+
+#, c-format
+msgid "E572: exit code %d"
+msgstr "E572: elira kodo %d"
+
+msgid "cannot get line"
+msgstr "ne eblas akiri linion"
+
+msgid "Unable to register a command server name"
+msgstr "Ne eblas registri nomon de komanda servilo"
+
+msgid "E248: Failed to send command to the destination program"
+msgstr "E248: Sendo de komando al cela programo malsukcesis"
+
+#, c-format
+msgid "E573: Invalid server id used: %s"
+msgstr "E573: Nevalida identigilo de servilo uzita: %s"
+
+msgid "E251: VIM instance registry property is badly formed. Deleted!"
+msgstr ""
+"E251: Ecoj de registro de apero de VIM estas nevalide formata. Forviลita!"
+
+#, c-format
+msgid "E938: Duplicate key in JSON: \"%s\""
+msgstr "E938: Ripetita ลlosilo en JSON: \"%s\""
+
+#, c-format
+msgid "E696: Missing comma in List: %s"
+msgstr "E696: Mankas komo en Listo: %s"
+
+#, c-format
+msgid "E697: Missing end of List ']': %s"
+msgstr "E697: Mankas fino de Listo ']': %s"
+
msgid "Unknown option argument"
msgstr "Nekonata argumento de opcio"
-#: ../main.c:146
msgid "Too many edit arguments"
msgstr "Tro da argumentoj de redakto"
-#: ../main.c:148
msgid "Argument missing after"
-msgstr "Argumento mankas post"
+msgstr "Argumento mankas malantaลญ"
-#: ../main.c:150
msgid "Garbage after option argument"
-msgstr "Forฤตetindaฤตo post argumento de opcio"
+msgstr "Forฤตetindaฤตo malantaลญ argumento de opcio"
-#: ../main.c:152
msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"
msgstr "Tro da argumentoj \"+komando\", \"-c komando\" aลญ \"--cmd komando\""
-#: ../main.c:154
msgid "Invalid argument for"
msgstr "Nevalida argumento por"
-#: ../main.c:294
#, c-format
msgid "%d files to edit\n"
msgstr "%d redaktendaj dosieroj\n"
-#: ../main.c:1342
+msgid "netbeans is not supported with this GUI\n"
+msgstr "netbeans ne estas subtenata kun tiu grafika interfaco\n"
+
+msgid "'-nb' cannot be used: not enabled at compile time\n"
+msgstr "'-nb' ne uzeblas: malลaltita dum kompilado\n"
+
+msgid "This Vim was not compiled with the diff feature."
+msgstr "Tiu Vim ne estis kompilita kun la kompara eblo."
+
msgid "Attempt to open script file again: \""
msgstr "Provas malfermi skriptan dosieron denove: \""
-#: ../main.c:1350
msgid "Cannot open for reading: \""
msgstr "Ne eblas malfermi en lega reฤimo: \""
-#: ../main.c:1393
msgid "Cannot open for script output: \""
msgstr "Ne eblas malfermi por eligo de skripto: \""
-#: ../main.c:1622
+msgid "Vim: Error: Failure to start gvim from NetBeans\n"
+msgstr "Vim: Eraro: malsukcesis lanฤ‰i gvim el NetBeans\n"
+
+msgid "Vim: Error: This version of Vim does not run in a Cygwin terminal\n"
+msgstr "Vim: Eraro: Tiu versio de Vim ne ruliฤas en terminalo Cygwin\n"
+
msgid "Vim: Warning: Output is not to a terminal\n"
msgstr "Vim: Averto: Eligo ne estas al terminalo\n"
-#: ../main.c:1624
msgid "Vim: Warning: Input is not from a terminal\n"
msgstr "Vim: Averto: Enigo ne estas el terminalo\n"
-#. just in case..
-#: ../main.c:1891
msgid "pre-vimrc command line"
msgstr "komanda linio pre-vimrc"
-#: ../main.c:1964
#, c-format
msgid "E282: Cannot read from \"%s\""
msgstr "E282: Ne eblas legi el \"%s\""
-#: ../main.c:2149
msgid ""
"\n"
"More info with: \"vim -h\"\n"
@@ -3393,37 +2906,30 @@ msgstr ""
"Pliaj informoj per: \"vim -h\"\n"
# DP: tajpu "vim --help" por testi tiujn mesaฤojn
-#: ../main.c:2178
msgid "[file ..] edit specified file(s)"
msgstr "[dosiero...] redakti specifita(j)n dosiero(j)n"
-#: ../main.c:2179
msgid "- read text from stdin"
msgstr "- legi tekston el stdin"
-#: ../main.c:2180
msgid "-t tag edit file where tag is defined"
msgstr "-t etikedo redakti dosieron kie etikedo estas difinata"
-#: ../main.c:2181
msgid "-q [errorfile] edit file with first error"
msgstr "-q [erardosiero] redakti dosieron kun unua eraro"
-#: ../main.c:2187
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
" uzo:"
-#: ../main.c:2189
msgid " vim [arguments] "
msgstr " vim [argumentoj] "
-#: ../main.c:2193
msgid ""
"\n"
" or:"
@@ -3431,7 +2937,13 @@ msgstr ""
"\n"
" aลญ:"
-#: ../main.c:2196
+msgid ""
+"\n"
+"Where case is ignored prepend / to make flag upper case"
+msgstr ""
+"\n"
+"Kie uskleco estas ignorita antaลญaldonu / por igi flagon majuskla"
+
msgid ""
"\n"
"\n"
@@ -3441,197 +2953,335 @@ msgstr ""
"\n"
"Argumentoj:\n"
-#: ../main.c:2197
msgid "--\t\t\tOnly file names after this"
-msgstr "--\t\t\tNur dosiernomoj post tio"
+msgstr "--\t\t\tNur dosiernomoj malantaลญ tio"
-#: ../main.c:2199
msgid "--literal\t\tDon't expand wildcards"
msgstr "--literal\t\tNe malvolvi ฤตokerojn"
-#: ../main.c:2201
+msgid "-register\t\tRegister this gvim for OLE"
+msgstr "-register\t\tRegistri tiun gvim al OLE"
+
+msgid "-unregister\t\tUnregister gvim for OLE"
+msgstr "-unregister\t\tMalregistri gvim de OLE"
+
+msgid "-g\t\t\tRun using GUI (like \"gvim\")"
+msgstr "-g\t\t\tRuli per grafika interfaco (kiel \"gvim\")"
+
+msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
+msgstr "-f aลญ --nofork\tMalfono: ne forki kiam lanฤ‰as grafikan interfacon"
+
msgid "-v\t\t\tVi mode (like \"vi\")"
msgstr "-v\t\t\tReฤimo Vi (kiel \"vi\")"
-#: ../main.c:2202
msgid "-e\t\t\tEx mode (like \"ex\")"
msgstr "-e\t\t\tReฤimo Ex (kiel \"ex\")"
-#: ../main.c:2203
msgid "-E\t\t\tImproved Ex mode"
msgstr "-E\t\t\tPlibonigita Ex-reฤimo"
-#: ../main.c:2204
msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")"
msgstr "-s\t\t\tSilenta (stapla) reฤimo (nur por \"ex\")"
-#: ../main.c:2205
msgid "-d\t\t\tDiff mode (like \"vimdiff\")"
msgstr "-d\t\t\tKompara reฤimo (kiel \"vimdiff\")"
-#: ../main.c:2206
msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
msgstr "-y\t\t\tFacila reฤimo (kiel \"evim\", senreฤima)"
-#: ../main.c:2207
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tNurlegebla reฤimo (kiel \"view\")"
-#: ../main.c:2208
msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
msgstr "-Z\t\t\tLimigita reฤimo (kiel \"rvim\")"
-#: ../main.c:2209
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tลœanฤoj (skribo al dosieroj) nepermeseblaj"
-#: ../main.c:2210
msgid "-M\t\t\tModifications in text not allowed"
msgstr "-M\t\t\tลœanฤoj al teksto nepermeseblaj"
-#: ../main.c:2211
msgid "-b\t\t\tBinary mode"
msgstr "-b\t\t\tDuuma reฤimo"
-#: ../main.c:2212
msgid "-l\t\t\tLisp mode"
msgstr "-l\t\t\tReฤimo Lisp"
-#: ../main.c:2213
msgid "-C\t\t\tCompatible with Vi: 'compatible'"
msgstr "-C\t\t\tKongrua kun Vi: 'compatible'"
-#: ../main.c:2214
msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'"
msgstr "-N\t\t\tNe tute kongrua kun Vi: 'nocompatible'"
-#: ../main.c:2215
msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]"
msgstr ""
"-V[N][dosiernomo]\tEsti babilema [nivelo N] [konservi mesaฤojn al dosiernomo]"
-#: ../main.c:2216
msgid "-D\t\t\tDebugging mode"
msgstr "-D\t\t\tSencimiga reฤimo"
-#: ../main.c:2217
msgid "-n\t\t\tNo swap file, use memory only"
msgstr "-n\t\t\tNeniu permutodosiero .swp, uzas nur memoron"
-#: ../main.c:2218
msgid "-r\t\t\tList swap files and exit"
msgstr "-r\t\t\tListigi permutodosierojn .swp kaj eliri"
-#: ../main.c:2219
msgid "-r (with file name)\tRecover crashed session"
msgstr "-r (kun dosiernomo)\tRestaลญri kolapsintan seancon"
-#: ../main.c:2220
msgid "-L\t\t\tSame as -r"
msgstr "-L\t\t\tKiel -r"
-#: ../main.c:2221
-msgid "-A\t\t\tstart in Arabic mode"
+msgid "-f\t\t\tDon't use newcli to open window"
+msgstr "-f\t\t\tNe uzi newcli por malfermi fenestrojn"
+
+msgid "-dev <device>\t\tUse <device> for I/O"
+msgstr "-dev <aparatdosiero>\t\tUzi <aparatdosiero>-n por eneligo"
+
+msgid "-A\t\t\tStart in Arabic mode"
msgstr "-A\t\t\tKomenci en araba reฤimo"
-#: ../main.c:2222
msgid "-H\t\t\tStart in Hebrew mode"
msgstr "-H\t\t\tKomenci en hebrea reฤimo"
-#: ../main.c:2223
msgid "-F\t\t\tStart in Farsi mode"
msgstr "-F\t\t\tKomenci en persa reฤimo"
-#: ../main.c:2224
msgid "-T <terminal>\tSet terminal type to <terminal>"
msgstr "-T <terminalo>\tAgordi terminalon al <terminalo>"
-#: ../main.c:2225
+msgid "--not-a-term\t\tSkip warning for input/output not being a terminal"
+msgstr ""
+"--not-a-term\t\tPreterpasi averton por enigo/eligo, kiu ne estas terminalo"
+
+msgid "--ttyfail\t\tExit if input or output is not a terminal"
+msgstr "--ttyfail\t\tEliri se la eniro aลญ eliro ne estas terminalo"
+
msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc"
msgstr "-u <vimrc>\t\tUzi <vimrc> anstataลญ iun ajn .vimrc"
-#: ../main.c:2226
+msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
+msgstr "-U <gvimrc>\t\tUzi <gvimrc> anstataลญ iun ajn .gvimrc"
+
msgid "--noplugin\t\tDon't load plugin scripts"
msgstr "--noplugin\t\tNe ลargi kromaฤตajn skriptojn"
-#: ../main.c:2227
msgid "-p[N]\t\tOpen N tab pages (default: one for each file)"
msgstr "-p[N]\t\tMalfermi N langetojn (defaลญlto: po unu por ฤ‰iu dosiero)"
-#: ../main.c:2228
msgid "-o[N]\t\tOpen N windows (default: one for each file)"
msgstr "-o[N]\t\tMalfermi N fenestrojn (defaลญlto: po unu por ฤ‰iu dosiero)"
-#: ../main.c:2229
msgid "-O[N]\t\tLike -o but split vertically"
msgstr "-O[N]\t\tKiel -o sed dividi vertikale"
-#: ../main.c:2230
msgid "+\t\t\tStart at end of file"
msgstr "+\t\t\tKomenci ฤ‰e la fino de la dosiero"
-#: ../main.c:2231
msgid "+<lnum>\t\tStart at line <lnum>"
msgstr "+<numL>\t\tKomenci ฤ‰e linio <numL>"
-#: ../main.c:2232
msgid "--cmd <command>\tExecute <command> before loading any vimrc file"
msgstr ""
"--cmd <komando>\tPlenumi <komando>-n antaลญ ol ลargi iun ajn dosieron vimrc"
-#: ../main.c:2233
msgid "-c <command>\t\tExecute <command> after loading the first file"
msgstr "-c <komando>\t\tPlenumi <komando>-n post kiam la unua dosiero ลargiฤis"
-#: ../main.c:2235
msgid "-S <session>\t\tSource file <session> after loading the first file"
msgstr ""
"-S <seanco>\t\tRuli dosieron <seanco>-n post kiam la unua dosiero ลargiฤis"
-#: ../main.c:2236
msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>"
msgstr "-s <skripto>\t\tLegi komandojn en Normala reฤimo el dosiero <skripto>"
-#: ../main.c:2237
msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>"
msgstr ""
"-w <eligaskripto>\tPostaldoni ฤ‰iujn tajpitajn komandojn al dosiero "
"<eligaskripto>"
-#: ../main.c:2238
msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>"
msgstr ""
"-W <eligaskripto>\tSkribi ฤ‰iujn tajpitajn komandojn al dosiero <eligaskripto>"
-#: ../main.c:2240
+msgid "-x\t\t\tEdit encrypted files"
+msgstr "-x\t\t\tRedakti ฤ‰ifradan dosieron"
+
+msgid "-display <display>\tConnect vim to this particular X-server"
+msgstr "-display <ekrano>\tKonekti Vim al tiu X-servilo"
+
+msgid "-X\t\t\tDo not connect to X server"
+msgstr "-X\t\t\tNe konekti al X-servilo"
+
+msgid "--remote <files>\tEdit <files> in a Vim server if possible"
+msgstr "--remote <dosieroj>\tRedakti <dosieroj>-n en Vim-servilo se eblas"
+
+msgid "--remote-silent <files> Same, don't complain if there is no server"
+msgstr "--remote-silent <dosieroj> Same, sed ne plendi se ne estas servilo"
+
+msgid ""
+"--remote-wait <files> As --remote but wait for files to have been edited"
+msgstr ""
+"--remote-wait <dosieroj> Kiel --remote sed atendi ฤis dosieroj estas "
+"redaktitaj"
+
+msgid ""
+"--remote-wait-silent <files> Same, don't complain if there is no server"
+msgstr ""
+"--remote-wait-silent <dosieroj> Same, sed ne plendi se ne estas servilo"
+
+msgid ""
+"--remote-tab[-wait][-silent] <files> As --remote but use tab page per file"
+msgstr ""
+"--remote-tab[-wait][-silent] <dosieroj> Kiel --remote sed uzi langeton por "
+"ฤ‰iu dosiero"
+
+msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
+msgstr "--remote-send <klavoj> Sendi <klavoj>-n al Vim-servilo kaj eliri"
+
+msgid "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
+msgstr "--remote-expr <espr>\tKomputi <espr> en Vim-servilo kaj afiลi rezulton"
+
+msgid "--serverlist\t\tList available Vim server names and exit"
+msgstr "--serverlist\t\tListigi haveblajn nomojn de Vim-serviloj kaj eliri"
+
+msgid "--servername <name>\tSend to/become the Vim server <name>"
+msgstr "--servername <nomo>\tSendu al/iฤi la Vim-servilo <nomo>"
+
msgid "--startuptime <file>\tWrite startup timing messages to <file>"
msgstr ""
"--startuptime <dosiero> Skribi mesaฤojn de komenca tempomezurado al "
"<dosiero>"
-#: ../main.c:2242
msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
msgstr "-i <viminfo>\t\tUzi <viminfo> anstataลญ .viminfo"
-#: ../main.c:2243
+msgid "--clean\t\t'nocompatible', Vim defaults, no plugins, no viminfo"
+msgstr "--clean\t\t'nocompatible', defaลญltaj agordoj de Vim, neniu viminfo"
+
msgid "-h or --help\tPrint Help (this message) and exit"
msgstr "-h aลญ --help\tAfiลi Helpon (tiun mesaฤon) kaj eliri"
-#: ../main.c:2244
msgid "--version\t\tPrint version information and exit"
msgstr "--version\t\tAfiลi informon de versio kaj eliri"
-#: ../mark.c:676
+msgid ""
+"\n"
+"Arguments recognised by gvim (Motif version):\n"
+msgstr ""
+"\n"
+"Argumentoj agnoskitaj de gvim (versio Motif):\n"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (neXtaw version):\n"
+msgstr ""
+"\n"
+"Argumentoj agnoskitaj de gvim (versio neXtaw):\n"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (Athena version):\n"
+msgstr ""
+"\n"
+"Argumentoj agnoskitaj de gvim (versio Athena):\n"
+
+msgid "-display <display>\tRun vim on <display>"
+msgstr "-display <ekrano>\tLanฤ‰i vim sur <ekrano>"
+
+msgid "-iconic\t\tStart vim iconified"
+msgstr "-iconic\t\tLanฤ‰i vim piktograme"
+
+msgid "-background <color>\tUse <color> for the background (also: -bg)"
+msgstr "-background <koloro>\tUzi <koloro>-n por la fona koloro (ankaลญ: -bg)"
+
+msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
+msgstr ""
+"-foreground <koloro>\tUzi <koloro>-n por la malfona koloro (ankaลญ: -fg)"
+
+msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
+msgstr "-font <tiparo>\tUzi <tiparo>-n por normala teksto (ankaลญ: -fn)"
+
+msgid "-boldfont <font>\tUse <font> for bold text"
+msgstr "-boldfont <tiparo>\tUzi <tiparo>-n por grasa teksto"
+
+msgid "-italicfont <font>\tUse <font> for italic text"
+msgstr "-italicfont <tiparo>\tUzi <tiparo>-n por kursiva teksto"
+
+msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
+msgstr "-geometry <geom>\tUzi <geom> kiel komenca geometrio (ankaลญ: -geom)"
+
+msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
+msgstr "-borderwidth <larฤo>\tUzi <larฤo>-n kiel larฤo de bordero (ankaลญ: -bw)"
+
+msgid "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
+msgstr ""
+"-scrollbarwidth <larฤo> Uzi <larฤo>-n kiel larฤo de rulumskalo (ankaลญ: -sw)"
+
+msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
+msgstr ""
+"-menuheight <alto>\tUzi <alto>-n kiel alto de menuzona alto (ankaลญ: -mh)"
+
+msgid "-reverse\t\tUse reverse video (also: -rv)"
+msgstr "-reverse\t\tUzi inversan videon (ankaลญ: -rv)"
+
+msgid "+reverse\t\tDon't use reverse video (also: +rv)"
+msgstr "+reverse\t\tNe uzi inversan videon (ankaลญ: +rv)"
+
+msgid "-xrm <resource>\tSet the specified resource"
+msgstr "-xrm <rimedo>\tAgordi la specifitan <rimedo>-n"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (GTK+ version):\n"
+msgstr ""
+"\n"
+"Argumentoj agnoskitaj de gvim (versio GTK+):\n"
+
+msgid "-display <display>\tRun vim on <display> (also: --display)"
+msgstr "-display <ekrano>\tLanฤ‰i Vim sur tiu <ekrano> (ankaลญ: --display)"
+
+msgid "--role <role>\tSet a unique role to identify the main window"
+msgstr "--role <rolo>\tDoni unikan rolon por identigi la ฤ‰efan fenestron"
+
+msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
+msgstr "--socketid <xid>\tMalfermi Vim en alia GTK fenestraฤตo"
+
+msgid "--echo-wid\t\tMake gvim echo the Window ID on stdout"
+msgstr "--echo-wid\t\tIgas gvim afiลi la identigilon de vindozo sur stdout"
+
+msgid "-P <parent title>\tOpen Vim inside parent application"
+msgstr "-P <gepatra titolo>\tMalfermi Vim en gepatra aplikaฤตo"
+
+msgid "--windowid <HWND>\tOpen Vim inside another win32 widget"
+msgstr "--windowid <HWND>\tMalfermi Vim en alia win32 fenestraฤตo"
+
+msgid "No display"
+msgstr "Neniu ekrano"
+
+msgid ": Send failed.\n"
+msgstr ": Sendo malsukcesis.\n"
+
+msgid ": Send failed. Trying to execute locally\n"
+msgstr ": Sendo malsukcesis. Provo de loka plenumo\n"
+
+#, c-format
+msgid "%d of %d edited"
+msgstr "%d de %d redaktita(j)"
+
+msgid "No display: Send expression failed.\n"
+msgstr "Neniu ekrano: Sendado de esprimo malsukcesis.\n"
+
+msgid ": Send expression failed.\n"
+msgstr ": Sendado de esprimo malsukcesis.\n"
+
msgid "No marks set"
msgstr "Neniu marko"
-#: ../mark.c:678
#, c-format
msgid "E283: No marks matching \"%s\""
msgstr "E283: Neniu marko kongruas kun \"%s\""
-#. Highlight title
-#: ../mark.c:687
msgid ""
"\n"
"mark line col file/text"
@@ -3639,8 +3289,6 @@ msgstr ""
"\n"
"mark linio kol dosiero/teksto"
-#. Highlight title
-#: ../mark.c:789
msgid ""
"\n"
" jump line col file/text"
@@ -3648,8 +3296,6 @@ msgstr ""
"\n"
" salt linio kol dosiero/teksto"
-#. Highlight title
-#: ../mark.c:831
msgid ""
"\n"
"change line col text"
@@ -3657,7 +3303,6 @@ msgstr ""
"\n"
"ลanฤo linio kol teksto"
-#: ../mark.c:1238
msgid ""
"\n"
"# File marks:\n"
@@ -3665,8 +3310,6 @@ msgstr ""
"\n"
"# Markoj de dosiero:\n"
-#. Write the jumplist with -'
-#: ../mark.c:1271
msgid ""
"\n"
"# Jumplist (newest first):\n"
@@ -3674,7 +3317,6 @@ msgstr ""
"\n"
"# Saltlisto (plej novaj unue):\n"
-#: ../mark.c:1352
msgid ""
"\n"
"# History of marks within files (newest to oldest):\n"
@@ -3682,85 +3324,89 @@ msgstr ""
"\n"
"# Historio de markoj en dosieroj (de plej nova al plej malnova):\n"
-#: ../mark.c:1431
msgid "Missing '>'"
msgstr "Mankas '>'"
-#: ../memfile.c:426
+msgid "E543: Not a valid codepage"
+msgstr "E543: Nevalida kodpaฤo"
+
+msgid "E284: Cannot set IC values"
+msgstr "E284: Ne eblas agordi valorojn de IC"
+
+msgid "E285: Failed to create input context"
+msgstr "E285: Kreado de eniga kunteksto malsukcesis"
+
+msgid "E286: Failed to open input method"
+msgstr "E286: Malfermo de eniga metodo malsukcesis"
+
+msgid "E287: Warning: Could not set destroy callback to IM"
+msgstr "E287: Averto: Ne eblis agordi detruan reagfunkcion al IM"
+
+msgid "E288: input method doesn't support any style"
+msgstr "E288: eniga metodo subtenas neniun stilon"
+
+# DP: mi ne scias, kio estas "preedit"
+msgid "E289: input method doesn't support my preedit type"
+msgstr "E289: eniga metodo ne subtenas mian antaลญredaktan tipon"
+
msgid "E293: block was not locked"
msgstr "E293: bloko ne estis ลlosita"
-#: ../memfile.c:799
msgid "E294: Seek error in swap file read"
msgstr "E294: Eraro de enpoziciigo dum lego de permutodosiero .swp"
-#: ../memfile.c:803
msgid "E295: Read error in swap file"
msgstr "E295: Eraro de lego en permutodosiero .swp"
-#: ../memfile.c:849
msgid "E296: Seek error in swap file write"
msgstr "E296: Eraro de enpoziciigo dum skribo de permutodosiero .swp"
-#: ../memfile.c:865
msgid "E297: Write error in swap file"
msgstr "E297: Skriberaro en permutodosiero .swp"
-#: ../memfile.c:1036
msgid "E300: Swap file already exists (symlink attack?)"
msgstr "E300: Permutodosiero .swp jam ekzistas (ฤ‰u atako per simbola ligilo?)"
-#: ../memline.c:318
msgid "E298: Didn't get block nr 0?"
msgstr "E298: ฤˆu ne akiris blokon n-ro 0?"
-#: ../memline.c:361
msgid "E298: Didn't get block nr 1?"
msgstr "E298: ฤˆu ne akiris blokon n-ro 1?"
-#: ../memline.c:377
msgid "E298: Didn't get block nr 2?"
msgstr "E298: ฤˆu ne akiris blokon n-ro 2?"
-#. could not (re)open the swap file, what can we do????
-#: ../memline.c:465
+msgid "E843: Error while updating swap file crypt"
+msgstr "E843: Eraro dum ฤisdatigo de ฤ‰ifrada permutodosiero .swp"
+
msgid "E301: Oops, lost the swap file!!!"
msgstr "E301: Ve, perdis la permutodosieron .swp!!!"
-#: ../memline.c:477
msgid "E302: Could not rename swap file"
msgstr "E302: Ne eblis renomi la permutodosieron .swp"
-#: ../memline.c:554
#, c-format
msgid "E303: Unable to open swap file for \"%s\", recovery impossible"
msgstr ""
"E303: Ne eblas malfermi permutodosieron .swp de \"%s\", restaลญro neeblas"
-#: ../memline.c:666
msgid "E304: ml_upd_block0(): Didn't get block 0??"
msgstr "E304: ml_upd_block0(): Ne akiris blokon 0??"
-#. no swap files found
-#: ../memline.c:830
#, c-format
msgid "E305: No swap file found for %s"
msgstr "E305: Neniu permutodosiero .swp trovita por %s"
-#: ../memline.c:839
msgid "Enter number of swap file to use (0 to quit): "
msgstr "Entajpu la uzendan numeron de permutodosiero .swp (0 por eliri): "
-#: ../memline.c:879
#, c-format
msgid "E306: Cannot open %s"
msgstr "E306: Ne eblas malfermi %s"
-#: ../memline.c:897
msgid "Unable to read block 0 from "
msgstr "Ne eblas legi blokon 0 de "
-#: ../memline.c:900
msgid ""
"\n"
"Maybe no changes were made or Vim did not update the swap file."
@@ -3768,28 +3414,22 @@ msgstr ""
"\n"
"Eble neniu ลanฤo estis farita aลญ Vim ne ฤisdatigis la permutodosieron .swp."
-#: ../memline.c:909
msgid " cannot be used with this version of Vim.\n"
msgstr " ne uzeblas per tiu versio de vim.\n"
-#: ../memline.c:911
msgid "Use Vim version 3.0.\n"
msgstr "Uzu version 3.0 de Vim\n"
-#: ../memline.c:916
#, c-format
msgid "E307: %s does not look like a Vim swap file"
msgstr "E307: %s ne aspektas kiel permutodosiero .swp de Vim"
-#: ../memline.c:922
msgid " cannot be used on this computer.\n"
msgstr " ne uzeblas per tiu komputilo.\n"
-#: ../memline.c:924
msgid "The file was created on "
msgstr "La dosiero estas kreita je "
-#: ../memline.c:928
msgid ""
",\n"
"or the file has been damaged."
@@ -3797,85 +3437,104 @@ msgstr ""
",\n"
"aลญ la dosiero estas difekta."
-#: ../memline.c:945
+#, c-format
+msgid ""
+"E833: %s is encrypted and this version of Vim does not support encryption"
+msgstr "E833: %s estas ฤ‰ifrita kaj tiu versio de Vim ne subtenas ฤ‰ifradon"
+
msgid " has been damaged (page size is smaller than minimum value).\n"
msgstr " difektiฤis (paฤa grando pli malgranda ol minimuma valoro).\n"
-#: ../memline.c:974
#, c-format
msgid "Using swap file \"%s\""
msgstr "Uzado de permutodosiero .swp \"%s\""
-#: ../memline.c:980
#, c-format
msgid "Original file \"%s\""
msgstr "Originala dosiero \"%s\""
-#: ../memline.c:995
msgid "E308: Warning: Original file may have been changed"
msgstr "E308: Averto: Originala dosiero eble ลanฤiฤis"
-#: ../memline.c:1061
+#, c-format
+msgid "Swap file is encrypted: \"%s\""
+msgstr "Permutodosiero .swp estas ฤ‰ifrita: \"%s\""
+
+msgid ""
+"\n"
+"If you entered a new crypt key but did not write the text file,"
+msgstr ""
+"\n"
+"Se vi tajpis novan ลlosilon de ฤ‰ifrado sed ne skribis la tekstan dosieron,"
+
+msgid ""
+"\n"
+"enter the new crypt key."
+msgstr ""
+"\n"
+"tajpu la novan ลlosilon de ฤ‰ifrado."
+
+msgid ""
+"\n"
+"If you wrote the text file after changing the crypt key press enter"
+msgstr ""
+"\n"
+"Se vi skribis la tekstan dosieron post ลanฤo de la ลlosilo de ฤ‰ifrado, premu "
+"enenklavon"
+
+msgid ""
+"\n"
+"to use the same key for text file and swap file"
+msgstr ""
+"\n"
+"por uzi la saman ลlosilon por la teksta dosiero kaj permutodosiero .swp"
+
#, c-format
msgid "E309: Unable to read block 1 from %s"
msgstr "E309: Ne eblas legi blokon 1 de %s"
-#: ../memline.c:1065
msgid "???MANY LINES MISSING"
msgstr "???MULTAJ LINIOJ MANKAS"
-#: ../memline.c:1076
msgid "???LINE COUNT WRONG"
msgstr "???NOMBRO DE LINIOJ NE ฤœUSTAS"
-#: ../memline.c:1082
msgid "???EMPTY BLOCK"
msgstr "???MALPLENA BLOKO"
-#: ../memline.c:1103
msgid "???LINES MISSING"
msgstr "???LINIOJ MANKANTAJ"
-#: ../memline.c:1128
#, c-format
msgid "E310: Block 1 ID wrong (%s not a .swp file?)"
msgstr ""
"E310: Nevalida identigilo de bloko 1 (ฤ‰u %s ne estas permutodosiero .swp?)"
-#: ../memline.c:1133
msgid "???BLOCK MISSING"
msgstr "???MANKAS BLOKO"
-#: ../memline.c:1147
msgid "??? from here until ???END lines may be messed up"
msgstr "??? ekde tie ฤis ???FINO linioj estas eble difektaj"
-#: ../memline.c:1164
msgid "??? from here until ???END lines may have been inserted/deleted"
msgstr "??? ekde tie ฤis ???FINO linioj estas eble enmetitaj/forviลitaj"
-#: ../memline.c:1181
msgid "???END"
msgstr "???FINO"
-#: ../memline.c:1238
msgid "E311: Recovery Interrupted"
msgstr "E311: Restaลญro interrompita"
-#: ../memline.c:1243
msgid ""
"E312: Errors detected while recovering; look for lines starting with ???"
msgstr "E312: Eraroj dum restaลญro; rigardu liniojn komencantajn per ???"
-#: ../memline.c:1245
msgid "See \":help E312\" for more information."
msgstr "Vidu \":help E312\" por pliaj informoj."
-#: ../memline.c:1249
msgid "Recovery completed. You should check if everything is OK."
msgstr "Restaลญro finiฤis. Indus kontroli ฤ‰u ฤ‰io estas en ordo."
-#: ../memline.c:1251
msgid ""
"\n"
"(You might want to write out this file under another name\n"
@@ -3883,16 +3542,13 @@ msgstr ""
"\n"
"(Indas konservi tiun dosieron per alia nomo\n"
-#: ../memline.c:1252
msgid "and run diff with the original file to check for changes)"
msgstr "kaj lanฤ‰i diff kun la originala dosiero por kontroli la ลanฤojn)"
-#: ../memline.c:1254
msgid "Recovery completed. Buffer contents equals file contents."
msgstr ""
"Restaลญro finiฤis. La enhavo de la bufro samas kun la enhavo de la dosiero."
-#: ../memline.c:1255
msgid ""
"\n"
"You may want to delete the .swp file now.\n"
@@ -3902,52 +3558,43 @@ msgstr ""
"La dosiero .swp nun forviลindas.\n"
"\n"
-#. use msg() to start the scrolling properly
-#: ../memline.c:1327
+msgid "Using crypt key from swap file for the text file.\n"
+msgstr ""
+"Uzas ลlosilon de ฤ‰ifrado el permutodosiero .swp por la teksta dosiero.\n"
+
msgid "Swap files found:"
msgstr "Permutodosiero .swp trovita:"
-#: ../memline.c:1446
msgid " In current directory:\n"
msgstr " En la aktuala dosierujo:\n"
-#: ../memline.c:1448
msgid " Using specified name:\n"
msgstr " Uzado de specifita nomo:\n"
-#: ../memline.c:1450
msgid " In directory "
msgstr " En dosierujo "
-#: ../memline.c:1465
msgid " -- none --\n"
msgstr " -- nenio --\n"
-#: ../memline.c:1527
msgid " owned by: "
msgstr " posedata de: "
-#: ../memline.c:1529
msgid " dated: "
msgstr " dato: "
-#: ../memline.c:1532 ../memline.c:3231
msgid " dated: "
msgstr " dato: "
-#: ../memline.c:1548
msgid " [from Vim version 3.0]"
msgstr " [de Vim versio 3.0]"
-#: ../memline.c:1550
msgid " [does not look like a Vim swap file]"
msgstr " [ne aspektas kiel permutodosiero .swp de Vim]"
-#: ../memline.c:1552
msgid " file name: "
msgstr " dosiernomo: "
-#: ../memline.c:1558
msgid ""
"\n"
" modified: "
@@ -3955,15 +3602,12 @@ msgstr ""
"\n"
" modifita: "
-#: ../memline.c:1559
msgid "YES"
msgstr "JES"
-#: ../memline.c:1559
msgid "no"
msgstr "ne"
-#: ../memline.c:1562
msgid ""
"\n"
" user name: "
@@ -3971,11 +3615,9 @@ msgstr ""
"\n"
" uzantonomo: "
-#: ../memline.c:1568
msgid " host name: "
msgstr " komputila nomo: "
-#: ../memline.c:1570
msgid ""
"\n"
" host name: "
@@ -3983,7 +3625,6 @@ msgstr ""
"\n"
" komputila nomo: "
-#: ../memline.c:1575
msgid ""
"\n"
" process ID: "
@@ -3991,11 +3632,16 @@ msgstr ""
"\n"
" proceza ID: "
-#: ../memline.c:1579
msgid " (still running)"
msgstr " (ankoraลญ ruliฤas)"
-#: ../memline.c:1586
+msgid ""
+"\n"
+" [not usable with this version of Vim]"
+msgstr ""
+"\n"
+" [ne uzebla per tiu versio de Vim]"
+
msgid ""
"\n"
" [not usable on this computer]"
@@ -4003,97 +3649,75 @@ msgstr ""
"\n"
" [neuzebla per tiu komputilo]"
-#: ../memline.c:1590
msgid " [cannot be read]"
msgstr " [nelegebla]"
-#: ../memline.c:1593
msgid " [cannot be opened]"
msgstr " [nemalfermebla]"
-#: ../memline.c:1698
msgid "E313: Cannot preserve, there is no swap file"
msgstr "E313: Ne eblas konservi, ne estas permutodosiero .swp"
-#: ../memline.c:1747
msgid "File preserved"
msgstr "Dosiero konservita"
-#: ../memline.c:1749
msgid "E314: Preserve failed"
-msgstr "E314: Konservo fiaskis"
+msgstr "E314: Konservo malsukcesis"
-#: ../memline.c:1819
#, c-format
-msgid "E315: ml_get: invalid lnum: %<PRId64>"
-msgstr "E315: ml_get: nevalida lnum: %<PRId64>"
+msgid "E315: ml_get: invalid lnum: %ld"
+msgstr "E315: ml_get: nevalida lnum: %ld"
-#: ../memline.c:1851
#, c-format
-msgid "E316: ml_get: cannot find line %<PRId64>"
-msgstr "E316: ml_get: ne eblas trovi linion %<PRId64>"
+msgid "E316: ml_get: cannot find line %ld"
+msgstr "E316: ml_get: ne eblas trovi linion %ld"
-#: ../memline.c:2236
msgid "E317: pointer block id wrong 3"
msgstr "E317: nevalida referenco de bloko id 3"
-#: ../memline.c:2311
msgid "stack_idx should be 0"
msgstr "stack_idx devus esti 0"
-#: ../memline.c:2369
msgid "E318: Updated too many blocks?"
msgstr "E318: ฤˆu ฤisdatigis tro da blokoj?"
-#: ../memline.c:2511
msgid "E317: pointer block id wrong 4"
msgstr "E317: nevalida referenco de bloko id 4"
-#: ../memline.c:2536
msgid "deleted block 1?"
msgstr "ฤ‰u forviลita bloko 1?"
-#: ../memline.c:2707
#, c-format
-msgid "E320: Cannot find line %<PRId64>"
-msgstr "E320: Ne eblas trovi linion %<PRId64>"
+msgid "E320: Cannot find line %ld"
+msgstr "E320: Ne eblas trovi linion %ld"
-#: ../memline.c:2916
msgid "E317: pointer block id wrong"
msgstr "E317: nevalida referenco de bloko id"
-#: ../memline.c:2930
msgid "pe_line_count is zero"
msgstr "pe_line_count estas nul"
-#: ../memline.c:2955
#, c-format
-msgid "E322: line number out of range: %<PRId64> past the end"
-msgstr "E322: numero de linio ekster limoj: %<PRId64> preter la fino"
+msgid "E322: line number out of range: %ld past the end"
+msgstr "E322: numero de linio ekster limoj: %ld preter la fino"
-#: ../memline.c:2959
#, c-format
-msgid "E323: line count wrong in block %<PRId64>"
-msgstr "E323: nevalida nombro de linioj en bloko %<PRId64>"
+msgid "E323: line count wrong in block %ld"
+msgstr "E323: nevalida nombro de linioj en bloko %ld"
-#: ../memline.c:2999
msgid "Stack size increases"
msgstr "Stako pligrandiฤas"
-#: ../memline.c:3038
msgid "E317: pointer block id wrong 2"
msgstr "E317: nevalida referenco de bloko id 2"
-#: ../memline.c:3070
#, c-format
msgid "E773: Symlink loop for \"%s\""
msgstr "E773: Buklo de simbolaj ligiloj por \"%s\""
-#: ../memline.c:3221
msgid "E325: ATTENTION"
msgstr "E325: ATENTO"
-#: ../memline.c:3222
msgid ""
"\n"
"Found a swap file by the name \""
@@ -4101,15 +3725,12 @@ msgstr ""
"\n"
"Trovis permutodosieron .swp kun la nomo \""
-#: ../memline.c:3226
msgid "While opening file \""
msgstr "Dum malfermo de dosiero \""
-#: ../memline.c:3239
msgid " NEWER than swap file!\n"
msgstr " PLI NOVA ol permutodosiero .swp!\n"
-#: ../memline.c:3244
msgid ""
"\n"
"(1) Another program may be editing the same file. If this is the case,\n"
@@ -4121,19 +3742,12 @@ msgstr ""
" por ne havi du malsamajn aperojn de la sama dosiero, kiam vi faros\n"
" ลanฤojn. Eliru aลญ daลญrigu singarde.\n"
-#: ../memline.c:3245
-msgid " Quit, or continue with caution.\n"
-msgstr " Eliru, aลญ daลญrigu singarde.\n"
-
-#: ../memline.c:3246
msgid "(2) An edit session for this file crashed.\n"
msgstr "(2) Redakta seanco de tiu dosiero kolapsis.\n"
-#: ../memline.c:3247
msgid " If this is the case, use \":recover\" or \"vim -r "
msgstr " Se veras, uzu \":recover\" aลญ \"vim -r "
-#: ../memline.c:3249
msgid ""
"\"\n"
" to recover the changes (see \":help recovery\").\n"
@@ -4141,11 +3755,9 @@ msgstr ""
"\"\n"
" por restaลญri la ลanฤojn (vidu \":help recovery\").\n"
-#: ../memline.c:3250
msgid " If you did this already, delete the swap file \""
msgstr " Se vi jam faris ฤin, forviลu la permutodosieron .swp \""
-#: ../memline.c:3252
msgid ""
"\"\n"
" to avoid this message.\n"
@@ -4153,25 +3765,20 @@ msgstr ""
"\"\n"
" por eviti tiun mesaฤon.\n"
-#: ../memline.c:3450 ../memline.c:3452
msgid "Swap file \""
msgstr "Permutodosiero .swp \""
-#: ../memline.c:3451 ../memline.c:3455
msgid "\" already exists!"
msgstr "\" jam ekzistas!"
-#: ../memline.c:3457
msgid "VIM - ATTENTION"
msgstr "VIM - ATENTO"
-#: ../memline.c:3459
msgid "Swap file already exists!"
msgstr "Permutodosiero .swp jam ekzistas!"
# AM: ฤ‰u Vim konvertos la unuliterajn respondojn de la uzulo?
# DP: jes, la '&' respondoj bone funkcias (mi kontrolis)
-#: ../memline.c:3464
msgid ""
"&Open Read-Only\n"
"&Edit anyway\n"
@@ -4185,7 +3792,6 @@ msgstr ""
"&Eliri\n"
"ฤˆe&sigi"
-#: ../memline.c:3467
msgid ""
"&Open Read-Only\n"
"&Edit anyway\n"
@@ -4201,56 +3807,31 @@ msgstr ""
"&Eliri\n"
"ฤˆe&sigi"
-#.
-#. * Change the ".swp" extension to find another file that can be used.
-#. * First decrement the last char: ".swo", ".swn", etc.
-#. * If that still isn't enough decrement the last but one char: ".svz"
-#. * Can happen when editing many "No Name" buffers.
-#.
-#. ".s?a"
-#. ".saa": tried enough, give up
-#: ../memline.c:3528
msgid "E326: Too many swap files found"
msgstr "E326: Tro da dosieroj trovitaj"
-#: ../memory.c:227
-#, c-format
-msgid "E342: Out of memory! (allocating %<PRIu64> bytes)"
-msgstr "E342: Ne plu restas memoro! (disponigo de %<PRIu64> bajtoj)"
-
-#: ../menu.c:62
msgid "E327: Part of menu-item path is not sub-menu"
msgstr "E327: Parto de vojo de menuero ne estas sub-menuo"
-#: ../menu.c:63
msgid "E328: Menu only exists in another mode"
msgstr "E328: Menuo nur ekzistas en alia reฤimo"
-#: ../menu.c:64
#, c-format
msgid "E329: No menu \"%s\""
msgstr "E329: Neniu menuo \"%s\""
-#. Only a mnemonic or accelerator is not valid.
-#: ../menu.c:329
msgid "E792: Empty menu name"
msgstr "E792: Malplena nomo de menuo"
-#: ../menu.c:340
msgid "E330: Menu path must not lead to a sub-menu"
msgstr "E330: Vojo de menuo ne rajtas konduki al sub-menuo"
-#: ../menu.c:365
msgid "E331: Must not add menu items directly to menu bar"
msgstr "E331: Aldono de menueroj direkte al menuzono estas malpermesita"
-#: ../menu.c:370
msgid "E332: Separator cannot be part of a menu path"
msgstr "E332: Disigilo ne rajtas esti ero de vojo de menuo"
-#. Now we have found the matching menu, and we list the mappings
-#. Highlight title
-#: ../menu.c:762
msgid ""
"\n"
"--- Menus ---"
@@ -4258,73 +3839,60 @@ msgstr ""
"\n"
"--- Menuoj ---"
-#: ../menu.c:1313
+msgid "Tear off this menu"
+msgstr "Disigi tiun menuon"
+
+#, c-format
+msgid "E335: Menu not defined for %s mode"
+msgstr "E335: Menuo ne estas difinita por reฤimo %s"
+
msgid "E333: Menu path must lead to a menu item"
msgstr "E333: Vojo de menuo devas konduki al menuero"
-#: ../menu.c:1330
#, c-format
msgid "E334: Menu not found: %s"
msgstr "E334: Menuo netrovita: %s"
-#: ../menu.c:1396
-#, c-format
-msgid "E335: Menu not defined for %s mode"
-msgstr "E335: Menuo ne estas difinita por reฤimo %s"
-
-#: ../menu.c:1426
msgid "E336: Menu path must lead to a sub-menu"
msgstr "E336: Vojo de menuo devas konduki al sub-menuo"
-#: ../menu.c:1447
msgid "E337: Menu not found - check menu names"
msgstr "E337: Menuo ne trovita - kontrolu nomojn de menuoj"
-#: ../message.c:423
#, c-format
msgid "Error detected while processing %s:"
msgstr "Eraro okazis dum traktado de %s:"
-#: ../message.c:445
#, c-format
msgid "line %4ld:"
msgstr "linio %4ld:"
-#: ../message.c:617
#, c-format
msgid "E354: Invalid register name: '%s'"
msgstr "E354: Nevalida nomo de reฤistro: '%s'"
-#: ../message.c:745
msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
msgstr "Flegado de mesaฤoj: Dominique PELLร‰ <dominique.pelle@gmail.com>"
-#: ../message.c:986
msgid "Interrupt: "
msgstr "Interrompo: "
-#: ../message.c:988
msgid "Press ENTER or type command to continue"
msgstr "Premu ENEN-KLAVON aลญ tajpu komandon por daลญrigi"
-#: ../message.c:1843
#, c-format
-msgid "%s line %<PRId64>"
-msgstr "%s linio %<PRId64>"
+msgid "%s line %ld"
+msgstr "%s linio %ld"
-#: ../message.c:2392
msgid "-- More --"
msgstr "-- Pli --"
-#: ../message.c:2398
msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "
msgstr " SPACETO/d/j: ekrano/paฤo/sub linio, b/u/k: supre, q: eliri "
-#: ../message.c:3021 ../message.c:3031
msgid "Question"
msgstr "Demando"
-#: ../message.c:3023
msgid ""
"&Yes\n"
"&No"
@@ -4332,19 +3900,8 @@ msgstr ""
"&Jes\n"
"&Ne"
-#: ../message.c:3033
-msgid ""
-"&Yes\n"
-"&No\n"
-"&Cancel"
-msgstr ""
-"&Jes\n"
-"&Ne\n"
-"&Rezigni"
-
# AM: ฤ‰u Vim konvertos unuliterajn respondojn?
# DP: jes, '&' bone funkcias (mi kontrolis)
-#: ../message.c:3045
msgid ""
"&Yes\n"
"&No\n"
@@ -4358,175 +3915,242 @@ msgstr ""
"&Forlasi ฤˆion\n"
"&Rezigni"
-#: ../message.c:3058
+msgid "Select Directory dialog"
+msgstr "Dialogujo de dosiera elekto"
+
+msgid "Save File dialog"
+msgstr "Dialogujo de dosiera konservo"
+
+msgid "Open File dialog"
+msgstr "Dialogujo de dosiera malfermo"
+
+msgid "E338: Sorry, no file browser in console mode"
+msgstr "E338: Bedaลญrinde ne estas dosierfoliumilo en konzola reฤimo"
+
msgid "E766: Insufficient arguments for printf()"
msgstr "E766: Ne sufiฤ‰aj argumentoj por printf()"
-#: ../message.c:3119
msgid "E807: Expected Float argument for printf()"
-msgstr "E807: Atendis Glitpunktnombron kiel argumento de printf()"
+msgstr "E807: Atendis Glitpunktnombron kiel argumenton de printf()"
-#: ../message.c:3873
msgid "E767: Too many arguments to printf()"
msgstr "E767: Tro da argumentoj al printf()"
-#: ../misc1.c:2256
msgid "W10: Warning: Changing a readonly file"
msgstr "W10: Averto: ลœanฤo de nurlegebla dosiero"
-#: ../misc1.c:2537
msgid "Type number and <Enter> or click with mouse (empty cancels): "
msgstr ""
"Tajpu nombron kaj <Enenklavon> aลญ alklaku per la muso (malpleno rezignas): "
-#: ../misc1.c:2539
msgid "Type number and <Enter> (empty cancels): "
msgstr "Tajpu nombron kaj <Enenklavon> (malpleno rezignas): "
-#: ../misc1.c:2585
-msgid "1 more line"
-msgstr "1 plia linio"
-
-#: ../misc1.c:2588
-msgid "1 line less"
-msgstr "1 malplia linio"
-
-#: ../misc1.c:2593
#, c-format
-msgid "%<PRId64> more lines"
-msgstr "%<PRId64> pliaj linioj"
+msgid "%ld more line"
+msgid_plural "%ld more lines"
+msgstr[0] "%ld plia linio"
+msgstr[1] "%ld pliaj linioj"
-#: ../misc1.c:2596
#, c-format
-msgid "%<PRId64> fewer lines"
-msgstr "%<PRId64> malpliaj linioj"
+msgid "%ld line less"
+msgid_plural "%ld fewer lines"
+msgstr[0] "%ld malplia linio"
+msgstr[1] "%ld malpliaj linioj"
-#: ../misc1.c:2599
msgid " (Interrupted)"
msgstr " (Interrompita)"
-#: ../misc1.c:2635
msgid "Beep!"
msgstr "Bip!"
-#: ../misc2.c:738
+msgid "ERROR: "
+msgstr "ERARO: "
+
+#, c-format
+msgid ""
+"\n"
+"[bytes] total alloc-freed %lu-%lu, in use %lu, peak use %lu\n"
+msgstr ""
+"\n"
+"[bajtoj] totalaj disponigitaj/maldisponigitaj %lu-%lu, nun uzataj %lu, "
+"kulmina uzo %lu\n"
+
+#, c-format
+msgid ""
+"[calls] total re/malloc()'s %lu, total free()'s %lu\n"
+"\n"
+msgstr ""
+"[alvokoj] totalaj re/malloc() %lu, totalaj free() %lu\n"
+"\n"
+
+msgid "E340: Line is becoming too long"
+msgstr "E340: Linio iฤas tro longa"
+
+#, c-format
+msgid "E341: Internal error: lalloc(%ld, )"
+msgstr "E341: Interna eraro: lalloc(%ld, )"
+
+#, c-format
+msgid "E342: Out of memory! (allocating %lu bytes)"
+msgstr "E342: Ne plu restas memoro! (disponigo de %lu bajtoj)"
+
#, c-format
msgid "Calling shell to execute: \"%s\""
msgstr "Alvokas ลelon por plenumi: \"%s\""
-#: ../normal.c:183
+msgid "E545: Missing colon"
+msgstr "E545: Mankas dupunkto"
+
+msgid "E546: Illegal mode"
+msgstr "E546: Reฤimo nepermesata"
+
+msgid "E547: Illegal mouseshape"
+msgstr "E547: Nevalida formo de muskursoro"
+
+msgid "E548: digit expected"
+msgstr "E548: cifero atendata"
+
+msgid "E549: Illegal percentage"
+msgstr "E549: Nevalida procento"
+
+msgid "E854: path too long for completion"
+msgstr "E854: tro longa vojo por kompletigo"
+
+#, c-format
+msgid ""
+"E343: Invalid path: '**[number]' must be at the end of the path or be "
+"followed by '%s'."
+msgstr ""
+"E343: Nevalida vojo: '**[nombro]' devas esti ฤ‰e la fino de la vojo aลญ "
+"sekvita de '%s'."
+
+#, c-format
+msgid "E344: Can't find directory \"%s\" in cdpath"
+msgstr "E344: Ne eblas trovi dosierujon \"%s\" en cdpath"
+
+#, c-format
+msgid "E345: Can't find file \"%s\" in path"
+msgstr "E345: Ne eblas trovi dosieron \"%s\" en serฤ‰vojo"
+
+#, c-format
+msgid "E346: No more directory \"%s\" found in cdpath"
+msgstr "E346: Ne plu trovis dosierujon \"%s\" en cdpath"
+
+#, c-format
+msgid "E347: No more file \"%s\" found in path"
+msgstr "E347: Ne plu trovis dosieron \"%s\" en serฤ‰vojo"
+
+#, c-format
+msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
+msgstr ""
+"E668: Nevalida permeso de dosiero de informo de konekto NetBeans: \"%s\""
+
+#, c-format
+msgid "E658: NetBeans connection lost for buffer %ld"
+msgstr "E658: Konekto de NetBeans perdita por bufro %ld"
+
+msgid "E838: netbeans is not supported with this GUI"
+msgstr "E838: netbeans ne estas subtenata kun tiu grafika interfaco"
+
+msgid "E511: netbeans already connected"
+msgstr "E511: nebeans jam konektata"
+
+#, c-format
+msgid "E505: %s is read-only (add ! to override)"
+msgstr "E505: %s estas nurlegebla (aldonu ! por transpasi)"
+
msgid "E349: No identifier under cursor"
msgstr "E349: Neniu identigilo sub la kursoro"
-#: ../normal.c:1866
msgid "E774: 'operatorfunc' is empty"
msgstr "E774: 'operatorfunc' estas malplena"
-#: ../normal.c:2637
+# DP: ฤ‰u Eval devas esti tradukita?
+msgid "E775: Eval feature not available"
+msgstr "E775: Eval eblo ne disponeblas"
+
msgid "Warning: terminal cannot highlight"
msgstr "Averto: terminalo ne povas emfazi"
-#: ../normal.c:2807
msgid "E348: No string under cursor"
msgstr "E348: Neniu ฤ‰eno sub la kursoro"
-#: ../normal.c:3937
msgid "E352: Cannot erase folds with current 'foldmethod'"
msgstr "E352: Ne eblas forviลi faldon per aktuala 'foldmethod'"
-#: ../normal.c:5897
msgid "E664: changelist is empty"
msgstr "E664: Listo de ลanฤoj estas malplena"
-#: ../normal.c:5899
msgid "E662: At start of changelist"
msgstr "E662: ฤˆe komenco de ลanฤlisto"
-#: ../normal.c:5901
msgid "E663: At end of changelist"
msgstr "E663: ฤˆe fino de ลanฤlisto"
-#: ../normal.c:7053
-msgid "Type :quit<Enter> to exit Nvim"
-msgstr "Tajpu \":quit<Enenklavo>\" por eliri el Vim"
-
-#: ../ops.c:248
-#, c-format
-msgid "1 line %sed 1 time"
-msgstr "1 linio %sita 1 foje"
-
-#: ../ops.c:250
-#, c-format
-msgid "1 line %sed %d times"
-msgstr "1 linio %sita %d foje"
+msgid "Type :qa! and press <Enter> to abandon all changes and exit Vim"
+msgstr ""
+"Tajpu :qa! kaj premu <Enenklavon> por forlasi ฤ‰iujn ลanฤojn kaj eliri el "
+"Vim"
-#: ../ops.c:253
#, c-format
-msgid "%<PRId64> lines %sed 1 time"
-msgstr "%<PRId64> linio %sita 1 foje"
+msgid "%ld line %sed %d time"
+msgid_plural "%ld line %sed %d times"
+msgstr[0] "%ld linio %sita %d foje"
+msgstr[1] "%ld linio %sita %d foje"
-#: ../ops.c:256
#, c-format
-msgid "%<PRId64> lines %sed %d times"
-msgstr "%<PRId64> linioj %sitaj %d foje"
+msgid "%ld lines %sed %d time"
+msgid_plural "%ld lines %sed %d times"
+msgstr[0] "%ld linioj %sitaj %d foje"
+msgstr[1] "%ld linioj %sitaj %d foje"
-#: ../ops.c:592
#, c-format
-msgid "%<PRId64> lines to indent... "
-msgstr "%<PRId64> krommarฤenendaj linioj... "
-
-#: ../ops.c:634
-msgid "1 line indented "
-msgstr "1 linio krommarฤenita "
+msgid "%ld lines to indent... "
+msgstr "%ld krommarฤenendaj linioj... "
-#: ../ops.c:636
#, c-format
-msgid "%<PRId64> lines indented "
-msgstr "%<PRId64> linioj krommarฤenitaj "
+msgid "%ld line indented "
+msgid_plural "%ld lines indented "
+msgstr[0] "%ld linio krommarฤenita "
+msgstr[1] "%ld linioj krommarฤenitaj "
-#: ../ops.c:938
msgid "E748: No previously used register"
msgstr "E748: Neniu reฤistro antaลญe uzata"
-#. must display the prompt
-#: ../ops.c:1433
msgid "cannot yank; delete anyway"
-msgstr "ne eblas kopii; forviลi tamene"
+msgstr "ne eblas kopii; tamen forviลi"
-#: ../ops.c:1929
-msgid "1 line changed"
-msgstr "1 linio ลanฤita"
-
-#: ../ops.c:1931
#, c-format
-msgid "%<PRId64> lines changed"
-msgstr "%<PRId64> linioj ลanฤitaj"
+msgid "%ld line changed"
+msgid_plural "%ld lines changed"
+msgstr[0] "%ld linio ลanฤita"
+msgstr[1] "%ld linioj ลanฤitaj"
-#: ../ops.c:2521
-msgid "block of 1 line yanked"
-msgstr "bloko de 1 linio kopiita"
+#, c-format
+msgid "freeing %ld lines"
+msgstr "malokupas %ld liniojn"
-#: ../ops.c:2523
-msgid "1 line yanked"
-msgstr "1 linio kopiita"
+#, c-format
+msgid " into \"%c"
+msgstr " en \"%c"
-#: ../ops.c:2525
#, c-format
-msgid "block of %<PRId64> lines yanked"
-msgstr "bloko de %<PRId64> linioj kopiita"
+msgid "block of %ld line yanked%s"
+msgid_plural "block of %ld lines yanked%s"
+msgstr[0] "bloko de %ld linio kopiita%s"
+msgstr[1] "bloko de %ld linioj kopiitaj%s"
-#: ../ops.c:2528
#, c-format
-msgid "%<PRId64> lines yanked"
-msgstr "%<PRId64> linioj kopiitaj"
+msgid "%ld line yanked%s"
+msgid_plural "%ld lines yanked%s"
+msgstr[0] "%ld linio kopiita%s"
+msgstr[1] "%ld linioj kopiitaj%s"
-#: ../ops.c:2710
#, c-format
msgid "E353: Nothing in register %s"
msgstr "E353: Nenio en reฤistro %s"
-#. Highlight title
-#: ../ops.c:3185
msgid ""
"\n"
"--- Registers ---"
@@ -4534,11 +4158,9 @@ msgstr ""
"\n"
"--- Reฤistroj ---"
-#: ../ops.c:4455
msgid "Illegal register name"
msgstr "Nevalida nomo de reฤistro"
-#: ../ops.c:4533
msgid ""
"\n"
"# Registers:\n"
@@ -4546,199 +4168,181 @@ msgstr ""
"\n"
"# Reฤistroj:\n"
-#: ../ops.c:4575
#, c-format
msgid "E574: Unknown register type %d"
msgstr "E574: Nekonata tipo de reฤistro %d"
-#: ../ops.c:5089
+msgid ""
+"E883: search pattern and expression register may not contain two or more "
+"lines"
+msgstr ""
+"E883: serฤ‰a ลablono kaj esprima reฤistro ne povas enhavi du aลญ pliajn liniojn"
+
#, c-format
-msgid "%<PRId64> Cols; "
-msgstr "%<PRId64> Kolumnoj; "
+msgid "%ld Cols; "
+msgstr "%ld Kolumnoj; "
-#: ../ops.c:5097
#, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Bytes"
+msgid "Selected %s%ld of %ld Lines; %lld of %lld Words; %lld of %lld Bytes"
msgstr ""
-"Apartigis %s%<PRId64> de %<PRId64> Linioj; %<PRId64> de %<PRId64> Vortoj; "
-"%<PRId64> de %<PRId64> Bajtoj"
+"Apartigis %s%ld de %ld Linioj; %lld de %lld Vortoj; %lld de %lld Bajtoj"
-#: ../ops.c:5105
#, c-format
msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Chars; %<PRId64> of %<PRId64> Bytes"
+"Selected %s%ld of %ld Lines; %lld of %lld Words; %lld of %lld Chars; %lld of "
+"%lld Bytes"
msgstr ""
-"Apartigis %s%<PRId64> de %<PRId64> Linioj; %<PRId64> de %<PRId64> Vortoj; "
-"%<PRId64> de %<PRId64> Signoj; %<PRId64> de %<PRId64> Bajtoj"
+"Apartigis %s%ld de %ld Linioj; %lld de %lld Vortoj; %lld de %lld Signoj; "
+"%lld de %lld Bajtoj"
-#: ../ops.c:5123
#, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Byte "
-"%<PRId64> of %<PRId64>"
-msgstr ""
-"Kol %s de %s; Linio %<PRId64> de %<PRId64>; Vorto %<PRId64> de %<PRId64>; "
-"Bajto %<PRId64> de %<PRId64>"
+msgid "Col %s of %s; Line %ld of %ld; Word %lld of %lld; Byte %lld of %lld"
+msgstr "Kol %s de %s; Linio %ld de %ld; Vorto %lld de %lld; Bajto %lld de %lld"
-#: ../ops.c:5133
#, c-format
msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Char "
-"%<PRId64> of %<PRId64>; Byte %<PRId64> of %<PRId64>"
+"Col %s of %s; Line %ld of %ld; Word %lld of %lld; Char %lld of %lld; Byte "
+"%lld of %lld"
msgstr ""
-"Kol %s de %s; Linio %<PRId64> de %<PRId64>; Vorto %<PRId64> de %<PRId64>; "
-"Signo %<PRId64> de %<PRId64>; Bajto %<PRId64> de %<PRId64>"
+"Kol %s de %s; Linio %ld de %ld; Vorto %lld de %lld; Signo %lld de %lld; "
+"Bajto %lld de %lld"
-#: ../ops.c:5146
#, c-format
-msgid "(+%<PRId64> for BOM)"
-msgstr "(+%<PRId64> por BOM)"
+msgid "(+%ld for BOM)"
+msgstr "(+%ld por BOM)"
-#: ../option.c:1238
-msgid "%<%f%h%m%=Page %N"
-msgstr "%<%f%h%m%=Folio %N"
-
-#: ../option.c:1574
msgid "Thanks for flying Vim"
msgstr "Dankon pro flugi per Vim"
-#. found a mismatch: skip
-#: ../option.c:2698
msgid "E518: Unknown option"
msgstr "E518: Nekonata opcio"
-#: ../option.c:2709
msgid "E519: Option not supported"
msgstr "E519: Opcio ne subtenata"
-#: ../option.c:2740
msgid "E520: Not allowed in a modeline"
msgstr "E520: Nepermesebla en reฤimlinio"
-#: ../option.c:2815
msgid "E846: Key code not set"
msgstr "E846: Klavkodo ne agordita"
-#: ../option.c:2924
msgid "E521: Number required after ="
-msgstr "E521: Nombro bezonata post ="
+msgstr "E521: Nombro bezonata malantaลญ ="
-#: ../option.c:3226 ../option.c:3864
msgid "E522: Not found in termcap"
msgstr "E522: Netrovita en termcap"
-#: ../option.c:3335
#, c-format
msgid "E539: Illegal character <%s>"
msgstr "E539: Nevalida signo <%s>"
-#: ../option.c:2253
#, c-format
msgid "For option %s"
msgstr "Por opcio %s"
-#: ../option.c:3862
msgid "E529: Cannot set 'term' to empty string"
msgstr "E529: Ne eblas agordi 'term' al malplena ฤ‰eno"
-#: ../option.c:3885
+msgid "E530: Cannot change term in GUI"
+msgstr "E530: term ne ลanฤeblas en grafika interfaco"
+
+msgid "E531: Use \":gui\" to start the GUI"
+msgstr "E531: Uzu \":gui\" por lanฤ‰i la grafikan interfacon"
+
msgid "E589: 'backupext' and 'patchmode' are equal"
msgstr "E589: 'backupext' kaj 'patchmode' estas egalaj"
-#: ../option.c:3964
msgid "E834: Conflicts with value of 'listchars'"
msgstr "E834: Konfliktoj kun la valoro de 'listchars'"
-#: ../option.c:3966
msgid "E835: Conflicts with value of 'fillchars'"
msgstr "E835: Konfliktoj kun la valoro de 'fillchars'"
-#: ../option.c:4163
+msgid "E617: Cannot be changed in the GTK+ 2 GUI"
+msgstr "E617: Ne ลanฤeblas en la grafika interfaco GTK+ 2"
+
msgid "E524: Missing colon"
msgstr "E524: Mankas dupunkto"
-#: ../option.c:4165
msgid "E525: Zero length string"
msgstr "E525: ฤˆeno de nula longo"
-#: ../option.c:4220
#, c-format
msgid "E526: Missing number after <%s>"
-msgstr "E526: Mankas nombro post <%s>"
+msgstr "E526: Mankas nombro malantaลญ <%s>"
-#: ../option.c:4232
msgid "E527: Missing comma"
msgstr "E527: Mankas komo"
-#: ../option.c:4239
msgid "E528: Must specify a ' value"
msgstr "E528: Devas specifi ' valoron"
-#: ../option.c:4271
msgid "E595: contains unprintable or wide character"
msgstr "E595: enhavas nepreseblan aลญ plurฤ‰ellarฤan signon"
-#: ../option.c:4469
+msgid "E596: Invalid font(s)"
+msgstr "E596: Nevalida(j) tiparo(j)"
+
+msgid "E597: can't select fontset"
+msgstr "E597: ne eblas elekti tiparon"
+
+msgid "E598: Invalid fontset"
+msgstr "E598: Nevalida tiparo"
+
+msgid "E533: can't select wide font"
+msgstr "E533: ne eblas elekti larฤan tiparon"
+
+msgid "E534: Invalid wide font"
+msgstr "E534: Nevalida larฤa tiparo"
+
#, c-format
msgid "E535: Illegal character after <%c>"
-msgstr "E535: Nevalida signo post <%c>"
+msgstr "E535: Nevalida signo malantaลญ <%c>"
-#: ../option.c:4534
msgid "E536: comma required"
msgstr "E536: komo bezonata"
-#: ../option.c:4543
#, c-format
msgid "E537: 'commentstring' must be empty or contain %s"
msgstr "E537: 'commentstring' devas esti malplena aลญ enhavi %s"
-#: ../option.c:4928
+msgid "E538: No mouse support"
+msgstr "E538: Neniu muso subtenata"
+
msgid "E540: Unclosed expression sequence"
msgstr "E540: '}' mankas"
-#: ../option.c:4932
msgid "E541: too many items"
msgstr "E541: tro da elementoj"
-#: ../option.c:4934
msgid "E542: unbalanced groups"
-msgstr "E542: misekvilibritaj grupoj"
+msgstr "E542: misekvilibraj grupoj"
+
+msgid "E946: Cannot make a terminal with running job modifiable"
+msgstr "E946: Ne eblas igi modifebla terminalon kun aktiva tasko"
-#: ../option.c:5148
msgid "E590: A preview window already exists"
msgstr "E590: Antaลญvida fenestro jam ekzistas"
-#: ../option.c:5311
msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'"
msgstr "W17: La araba bezonas UTF-8, tajpu \":set encoding=utf-8\""
-#: ../option.c:5623
#, c-format
msgid "E593: Need at least %d lines"
msgstr "E593: Bezonas almenaลญ %d liniojn"
-#: ../option.c:5631
#, c-format
msgid "E594: Need at least %d columns"
msgstr "E594: Bezonas almenaลญ %d kolumnojn"
-#: ../option.c:6011
#, c-format
msgid "E355: Unknown option: %s"
msgstr "E355: Nekonata opcio: %s"
-#. There's another character after zeros or the string
-#. * is empty. In both cases, we are trying to set a
-#. * num option using a string.
-#: ../option.c:6037
#, c-format
msgid "E521: Number required: &%s = '%s'"
msgstr "E521: Nombro bezonata: &%s = '%s'"
-#: ../option.c:6149
msgid ""
"\n"
"--- Terminal codes ---"
@@ -4746,7 +4350,6 @@ msgstr ""
"\n"
"--- Kodoj de terminalo ---"
-#: ../option.c:6151
msgid ""
"\n"
"--- Global option values ---"
@@ -4754,7 +4357,6 @@ msgstr ""
"\n"
"--- Mallokaj opcioj ---"
-#: ../option.c:6153
msgid ""
"\n"
"--- Local option values ---"
@@ -4762,7 +4364,6 @@ msgstr ""
"\n"
"--- Valoroj de lokaj opcioj ---"
-#: ../option.c:6155
msgid ""
"\n"
"--- Options ---"
@@ -4770,37 +4371,115 @@ msgstr ""
"\n"
"--- Opcioj ---"
-#: ../option.c:6816
msgid "E356: get_varp ERROR"
msgstr "E356: ERARO get_varp"
-#: ../option.c:7696
#, c-format
msgid "E357: 'langmap': Matching character missing for %s"
msgstr "E357: 'langmap': Kongrua signo mankas por %s"
-#: ../option.c:7715
#, c-format
msgid "E358: 'langmap': Extra characters after semicolon: %s"
-msgstr "E358: 'langmap': Ekstraj signoj post punktokomo: %s"
+msgstr "E358: 'langmap': Ekstraj signoj malantaลญ punktokomo: %s"
-#: ../os/shell.c:194
-msgid ""
-"\n"
-"Cannot execute shell "
-msgstr ""
-"\n"
-"Ne eblas plenumi ลelon "
+msgid "cannot open "
+msgstr "ne eblas malfermi "
+
+msgid "VIM: Can't open window!\n"
+msgstr "VIM: Ne eblas malfermi fenestron!\n"
+
+msgid "Need Amigados version 2.04 or later\n"
+msgstr "Bezonas version 2.04 de Amigados aลญ pli novan\n"
+
+#, c-format
+msgid "Need %s version %ld\n"
+msgstr "Bezonas %s-on versio %ld\n"
+
+msgid "Cannot open NIL:\n"
+msgstr "Ne eblas malfermi NIL:\n"
+
+msgid "Cannot create "
+msgstr "Ne eblas krei "
+
+#, c-format
+msgid "Vim exiting with %d\n"
+msgstr "Vim eliras kun %d\n"
+
+msgid "cannot change console mode ?!\n"
+msgstr "ne eblas ลanฤi reฤimon de konzolo?!\n"
+
+msgid "mch_get_shellsize: not a console??\n"
+msgstr "mch_get_shellsize: ne estas konzolo??\n"
+
+msgid "E360: Cannot execute shell with -f option"
+msgstr "E360: Ne eblas plenumi ลelon kun opcio -f"
+
+msgid "Cannot execute "
+msgstr "Ne eblas plenumi "
+
+msgid "shell "
+msgstr "ลelo "
+
+msgid " returned\n"
+msgstr " liveris\n"
+
+msgid "ANCHOR_BUF_SIZE too small."
+msgstr "ANCHOR_BUF_SIZE tro malgranda."
+
+msgid "I/O ERROR"
+msgstr "ERARO DE ENIGO/ELIGO"
+
+msgid "Message"
+msgstr "Mesaฤo"
+
+msgid "E237: Printer selection failed"
+msgstr "E237: Elekto de presilo malsukcesis"
+
+#, c-format
+msgid "to %s on %s"
+msgstr "al %s de %s"
+
+#, c-format
+msgid "E613: Unknown printer font: %s"
+msgstr "E613: Nekonata tiparo de presilo: %s"
+
+#, c-format
+msgid "E238: Print error: %s"
+msgstr "E238: Eraro de presado: %s"
+
+#, c-format
+msgid "Printing '%s'"
+msgstr "Presas '%s'"
+
+#, c-format
+msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
+msgstr "E244: Nevalida nomo de signaro \"%s\" en nomo de tiparo \"%s\""
+
+#, c-format
+msgid "E244: Illegal quality name \"%s\" in font name \"%s\""
+msgstr "E244: Nevalida nomo de kvalito \"%s\" en nomo de tiparo \"%s\""
+
+#, c-format
+msgid "E245: Illegal char '%c' in font name \"%s\""
+msgstr "E245: Nevalida signo '%c' en nomo de tiparo \"%s\""
+
+#, c-format
+msgid "Opening the X display took %ld msec"
+msgstr "Malfermo de vidigo X daลญris %ld msek"
-#: ../os/shell.c:439
msgid ""
"\n"
-"shell returned "
+"Vim: Got X error\n"
msgstr ""
"\n"
-"ลelo liveris "
+"Vim: Alvenis X eraro\n"
+
+msgid "Testing the X display failed"
+msgstr "Testo de la vidigo X malsukcesis"
+
+msgid "Opening the X display timed out"
+msgstr "Tempolimo okazis dum malfermo de vidigo X"
-#: ../os_unix.c:465 ../os_unix.c:471
msgid ""
"\n"
"Could not get security context for "
@@ -4808,7 +4487,6 @@ msgstr ""
"\n"
"Ne povis akiri kuntekston de sekureco por "
-#: ../os_unix.c:479
msgid ""
"\n"
"Could not set security context for "
@@ -4823,221 +4501,300 @@ msgstr "Ne povis ลalti kuntekston de sekureco %s por %s"
#, c-format
msgid "Could not get security context %s for %s. Removing it!"
msgstr ""
-"Ne povis akiri kuntekston de sekureco %s por %s. Gi nun estas forigata!"
+"Ne povis akiri kuntekston de sekureco %s por %s. ฤœi nun estas forigata!"
+
+msgid ""
+"\n"
+"Cannot execute shell sh\n"
+msgstr ""
+"\n"
+"Ne eblas plenumi ลelon sh\n"
+
+msgid ""
+"\n"
+"shell returned "
+msgstr ""
+"\n"
+"ลelo liveris "
+
+msgid ""
+"\n"
+"Cannot create pipes\n"
+msgstr ""
+"\n"
+"Ne eblas krei duktojn\n"
+
+msgid ""
+"\n"
+"Cannot fork\n"
+msgstr ""
+"\n"
+"Ne eblas forki\n"
+
+msgid ""
+"\n"
+"Cannot execute shell "
+msgstr ""
+"\n"
+"Ne eblas plenumi ลelon "
+
+msgid ""
+"\n"
+"Command terminated\n"
+msgstr ""
+"\n"
+"Komando terminigita\n"
+
+msgid "XSMP lost ICE connection"
+msgstr "XSMP perdis la konekton ICE"
-#: ../os_unix.c:1558 ../os_unix.c:1647
#, c-format
msgid "dlerror = \"%s\""
msgstr "dlerror = \"%s\""
-#: ../path.c:1449
+msgid "Opening the X display failed"
+msgstr "Malfermo de vidigo X malsukcesis"
+
+msgid "XSMP handling save-yourself request"
+msgstr "XSMP: traktado de peto konservi-mem"
+
+msgid "XSMP opening connection"
+msgstr "XSMP: malfermo de konekto"
+
+msgid "XSMP ICE connection watch failed"
+msgstr "XSMP: kontrolo de konekto ICE malsukcesis"
+
#, c-format
-msgid "E447: Can't find file \"%s\" in path"
-msgstr "E447: Ne eblas trovi dosieron \"%s\" en serฤ‰vojo"
+msgid "XSMP SmcOpenConnection failed: %s"
+msgstr "XSMP: SmcOpenConnection malsukcesis: %s"
+
+msgid "At line"
+msgstr "ฤˆe linio"
+
+msgid "Could not load vim32.dll!"
+msgstr "Ne eblis ลargi vim32.dll!"
+
+msgid "VIM Error"
+msgstr "Eraro de VIM"
+
+msgid "Could not fix up function pointers to the DLL!"
+msgstr "Ne eblis ripari referencojn de funkcioj al la DLL!"
+
+# DP: la eventoj estas tiuj, kiuj estas en la sekvantaj ฤ‰enoj
+#, c-format
+msgid "Vim: Caught %s event\n"
+msgstr "Vim: Kaptis eventon %s\n"
+
+msgid "close"
+msgstr "fermo"
+
+msgid "logoff"
+msgstr "elsaluto"
+
+msgid "shutdown"
+msgstr "sistemfermo"
+
+msgid "E371: Command not found"
+msgstr "E371: Netrovebla komando"
+
+msgid ""
+"VIMRUN.EXE not found in your $PATH.\n"
+"External commands will not pause after completion.\n"
+"See :help win32-vimrun for more information."
+msgstr ""
+"VIMRUN.EXE ne troveblas en via $PATH.\n"
+"Eksteraj komandoj ne paลญzos post kompletigo.\n"
+"Vidu :help win32-vimrun por pliaj informoj."
+
+msgid "Vim Warning"
+msgstr "Averto de Vim"
+
+#, c-format
+msgid "shell returned %d"
+msgstr "la ลelo liveris %d"
-#: ../quickfix.c:359
#, c-format
msgid "E372: Too many %%%c in format string"
msgstr "E372: Tro da %%%c en formata ฤ‰eno"
-#: ../quickfix.c:371
#, c-format
msgid "E373: Unexpected %%%c in format string"
msgstr "E373: Neatendita %%%c en formata ฤ‰eno"
-#: ../quickfix.c:420
msgid "E374: Missing ] in format string"
msgstr "E374: Mankas ] en formata ฤ‰eno"
-#: ../quickfix.c:431
#, c-format
msgid "E375: Unsupported %%%c in format string"
msgstr "E375: Nesubtenata %%%c en formata ฤ‰eno"
-#: ../quickfix.c:448
#, c-format
msgid "E376: Invalid %%%c in format string prefix"
msgstr "E376: Nevalida %%%c en prefikso de formata ฤ‰eno"
-#: ../quickfix.c:454
#, c-format
msgid "E377: Invalid %%%c in format string"
msgstr "E377: Nevalida %%%c en formata ฤ‰eno"
-#. nothing found
-#: ../quickfix.c:477
msgid "E378: 'errorformat' contains no pattern"
msgstr "E378: 'errorformat' enhavas neniun ลablonon"
-#: ../quickfix.c:695
msgid "E379: Missing or empty directory name"
msgstr "E379: Nomo de dosierujo mankas aลญ estas malplena"
-#: ../quickfix.c:1305
msgid "E553: No more items"
msgstr "E553: Ne plu estas eroj"
-#: ../quickfix.c:1674
+msgid "E924: Current window was closed"
+msgstr "E924: Aktuala vindozo fermiฤis"
+
+msgid "E925: Current quickfix was changed"
+msgstr "E925: Aktuala rapidriparo ลanฤiฤis"
+
+msgid "E926: Current location list was changed"
+msgstr "E926: Aktuala listo de lokoj ลanฤiฤis"
+
#, c-format
msgid "(%d of %d)%s%s: "
msgstr "(%d de %d)%s%s: "
-#: ../quickfix.c:1676
msgid " (line deleted)"
msgstr " (forviลita linio)"
-#: ../quickfix.c:1863
+#, c-format
+msgid "%serror list %d of %d; %d errors "
+msgstr "%slisto de eraroj %d de %d; %d eraroj"
+
msgid "E380: At bottom of quickfix stack"
msgstr "E380: ฤˆe la subo de stako de rapidriparo"
-#: ../quickfix.c:1869
msgid "E381: At top of quickfix stack"
msgstr "E381: ฤˆe la supro de stako de rapidriparo"
-#: ../quickfix.c:1880
-#, c-format
-msgid "error list %d of %d; %d errors"
-msgstr "listo de eraroj %d de %d; %d eraroj"
+msgid "No entries"
+msgstr "Neniu ano"
-#: ../quickfix.c:2427
-msgid "E382: Cannot write, 'buftype' option is set"
-msgstr "E382: Ne eblas skribi, opcio 'buftype' estas ลaltita"
+msgid "Error file"
+msgstr "Erara Dosiero"
-#: ../quickfix.c:2812
msgid "E683: File name missing or invalid pattern"
msgstr "E683: Dosiernomo mankas aลญ nevalida ลablono"
-#: ../quickfix.c:2911
#, c-format
msgid "Cannot open file \"%s\""
msgstr "Ne eblas malfermi dosieron \"%s\""
-#: ../quickfix.c:3429
msgid "E681: Buffer is not loaded"
msgstr "E681: Bufro ne estas ลargita"
-#: ../quickfix.c:3487
msgid "E777: String or List expected"
msgstr "E777: ฤˆeno aลญ Listo atendita"
-#: ../regexp.c:359
#, c-format
msgid "E369: invalid item in %s%%[]"
msgstr "E369: nevalida ano en %s%%[]"
-#: ../regexp.c:374
#, c-format
msgid "E769: Missing ] after %s["
-msgstr "E769: Mankas ] post %s["
+msgstr "E769: Mankas ] malantaลญ %s["
+
+msgid "E944: Reverse range in character class"
+msgstr "E944: Inversa amplekso en klaso de signoj"
+
+msgid "E945: Range too large in character class"
+msgstr "E945: tro larga amplekso de klaso de signoj"
-#: ../regexp.c:375
#, c-format
msgid "E53: Unmatched %s%%("
msgstr "E53: Neekvilibra %s%%("
-#: ../regexp.c:376
#, c-format
msgid "E54: Unmatched %s("
msgstr "E54: Neekvilibra %s("
-#: ../regexp.c:377
#, c-format
msgid "E55: Unmatched %s)"
msgstr "E55: Neekvilibra %s"
-#: ../regexp.c:378
msgid "E66: \\z( not allowed here"
-msgstr "E66: \\z( estas permesebla tie"
+msgstr "E66: \\z( estas nepermesebla tie"
# DP: vidu http://www.thefreedictionary.com/et+al.
-#: ../regexp.c:379
-msgid "E67: \\z1 et al. not allowed here"
+msgid "E67: \\z1 - \\z9 not allowed here"
msgstr "E67: \\z1 kaj aliaj estas nepermeseblaj tie"
-#: ../regexp.c:380
#, c-format
msgid "E69: Missing ] after %s%%["
-msgstr "E69: Mankas ] post %s%%["
+msgstr "E69: Mankas ] malantaลญ %s%%["
-#: ../regexp.c:381
#, c-format
msgid "E70: Empty %s%%[]"
msgstr "E70: Malplena %s%%[]"
-#: ../regexp.c:1209 ../regexp.c:1224
+msgid "E956: Cannot use pattern recursively"
+msgstr "E956: Ne eblas uzi ลablonon rekursie"
+
+msgid "E65: Illegal back reference"
+msgstr "E65: Nevalida retro-referenco"
+
msgid "E339: Pattern too long"
msgstr "E339: ลœablono tro longa"
-#: ../regexp.c:1371
msgid "E50: Too many \\z("
msgstr "E50: Tro da \\z("
-#: ../regexp.c:1378
#, c-format
msgid "E51: Too many %s("
msgstr "E51: Tro da %s("
-#: ../regexp.c:1427
msgid "E52: Unmatched \\z("
msgstr "E52: Neekvilibra \\z("
-#: ../regexp.c:1637
#, c-format
msgid "E59: invalid character after %s@"
-msgstr "E59: nevalida signo post %s@"
+msgstr "E59: nevalida signo malantaลญ %s@"
-#: ../regexp.c:1672
#, c-format
msgid "E60: Too many complex %s{...}s"
msgstr "E60: Tro da kompleksaj %s{...}-oj"
-#: ../regexp.c:1687
#, c-format
msgid "E61: Nested %s*"
msgstr "E61: Ingita %s*"
-#: ../regexp.c:1690
#, c-format
msgid "E62: Nested %s%c"
msgstr "E62: Ingita %s%c"
-#: ../regexp.c:1800
msgid "E63: invalid use of \\_"
msgstr "E63: nevalida uzo de \\_"
-#: ../regexp.c:1850
#, c-format
msgid "E64: %s%c follows nothing"
msgstr "E64: %s%c sekvas nenion"
-#: ../regexp.c:1902
-msgid "E65: Illegal back reference"
-msgstr "E65: Nevalida retro-referenco"
-
-#: ../regexp.c:1943
msgid "E68: Invalid character after \\z"
-msgstr "E68: Nevalida signo post \\z"
+msgstr "E68: Nevalida signo malantaลญ \\z"
-#: ../regexp.c:2049 ../regexp_nfa.c:1296
#, c-format
msgid "E678: Invalid character after %s%%[dxouU]"
-msgstr "E678: Nevalida signo post %s%%[dxouU]"
+msgstr "E678: Nevalida signo malantaลญ %s%%[dxouU]"
-#: ../regexp.c:2107
#, c-format
msgid "E71: Invalid character after %s%%"
-msgstr "E71: Nevalida signo post %s%%"
+msgstr "E71: Nevalida signo malantaลญ %s%%"
-#: ../regexp.c:3017
#, c-format
msgid "E554: Syntax error in %s{...}"
msgstr "E554: Sintaksa eraro en %s{...}"
-#: ../regexp.c:3805
msgid "External submatches:\n"
msgstr "Eksteraj subkongruoj:\n"
-#: ../regexp.c:7022
+#, c-format
+msgid "E888: (NFA regexp) cannot repeat %s"
+msgstr "E888: (NFA-regulesprimo) ne eblas ripeti %s"
+
msgid ""
"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be "
"used "
@@ -5045,65 +4802,60 @@ msgstr ""
"E864: \\%#= povas nur esti sekvita de 0, 1, aลญ 2. La aลญtomata motoro de "
"regulesprimo estos uzata "
-#: ../regexp_nfa.c:239
+msgid "Switching to backtracking RE engine for pattern: "
+msgstr "ลœanฤas al malavanca motoro de regulesprimo por ลablono: "
+
msgid "E865: (NFA) Regexp end encountered prematurely"
msgstr "E865: (NFA) Trovis finon de regulesprimo tro frue"
-#: ../regexp_nfa.c:240
#, c-format
msgid "E866: (NFA regexp) Misplaced %c"
msgstr "E866: (NFA-regulesprimo) Mispoziciigita %c"
-#: ../regexp_nfa.c:242
-#, fuzzy, c-format
-msgid "E877: (NFA regexp) Invalid character class: %<PRId64>"
-msgstr "E877: (NFA-regulesprimo) Nevalida klaso de signo "
+#, c-format
+msgid "E877: (NFA regexp) Invalid character class: %ld"
+msgstr "E877: (NFA-regulesprimo) Nevalida klaso de signoj: %ld"
-#: ../regexp_nfa.c:1261
#, c-format
msgid "E867: (NFA) Unknown operator '\\z%c'"
msgstr "E867: (NFA) Nekonata operatoro '\\z%c'"
-#: ../regexp_nfa.c:1387
-#, fuzzy, c-format
+#, c-format
msgid "E867: (NFA) Unknown operator '\\%%%c'"
-msgstr "E867: (NFA) Nekonata operatoro '\\z%c'"
+msgstr "E867: (NFA) Nekonata operatoro '\\%%%c'"
+
+msgid "E868: Error building NFA with equivalence class!"
+msgstr "E868: Eraro dum prekomputado de NFA kun ekvivalentoklaso!"
-#: ../regexp_nfa.c:1802
#, c-format
msgid "E869: (NFA) Unknown operator '\\@%c'"
msgstr "E869: (NFA) Nekonata operatoro '\\@%c'"
-#: ../regexp_nfa.c:1831
msgid "E870: (NFA regexp) Error reading repetition limits"
msgstr "E870: (NFS-regulesprimo) Eraro dum legado de limoj de ripeto"
-#. Can't have a multi follow a multi.
-#: ../regexp_nfa.c:1895
-msgid "E871: (NFA regexp) Can't have a multi follow a multi !"
+msgid "E871: (NFA regexp) Can't have a multi follow a multi"
msgstr ""
"E871: (NFA-regulesprimo) Ne povas havi mult-selekton tuj post alia mult-"
-"selekto!"
+"selekto"
-#. Too many `('
-#: ../regexp_nfa.c:2037
msgid "E872: (NFA regexp) Too many '('"
msgstr "E872: (NFA-regulesprimo) tro da '('"
-#: ../regexp_nfa.c:2042
-#, fuzzy
msgid "E879: (NFA regexp) Too many \\z("
-msgstr "E872: (NFA-regulesprimo) tro da '('"
+msgstr "E879: (NFA-regulesprimo) tro da \\z("
-#: ../regexp_nfa.c:2066
msgid "E873: (NFA regexp) proper termination error"
msgstr "E873: (NFA-regulesprimo) propra end-eraro"
-#: ../regexp_nfa.c:2599
-msgid "E874: (NFA) Could not pop the stack !"
+msgid "Could not open temporary log file for writing, displaying on stderr... "
+msgstr ""
+"Ne povis malfermi provizoran protokolan dosieron por skribi, nun montras sur "
+"stderr..."
+
+msgid "E874: (NFA) Could not pop the stack!"
msgstr "E874: (NFA) Ne povis elpreni de la staplo!"
-#: ../regexp_nfa.c:3298
msgid ""
"E875: (NFA regexp) (While converting from postfix to NFA), too many states "
"left on stack"
@@ -5111,177 +4863,122 @@ msgstr ""
"E875: (NFA-regulesprimo) (dum konverto de postmeto al NFA), restas tro da "
"statoj en la staplo"
-#: ../regexp_nfa.c:3302
msgid "E876: (NFA regexp) Not enough space to store the whole NFA "
-msgstr "E876: (NFA-regulesprimo) ne sufiฤ‰a spaco por enmomorigi la tutan NFA "
-
-#: ../regexp_nfa.c:4571 ../regexp_nfa.c:4869
-msgid ""
-"Could not open temporary log file for writing, displaying on stderr ... "
-msgstr ""
-"Ne povis malfermi provizoran protokolan dosieron por skribi, nun montras sur "
-"stderr ..."
-
-#: ../regexp_nfa.c:4840
-#, c-format
-msgid "(NFA) COULD NOT OPEN %s !"
-msgstr "(NFA) NE POVIS MALFERMI %s!"
+msgstr "E876: (NFA-regulesprimo) ne sufiฤ‰a spaco por enmemorigi la tutan NFA "
-#: ../regexp_nfa.c:6049
-msgid "Could not open temporary log file for writing "
-msgstr "Ne povis malfermi la provizoran protokolan dosieron por skribi "
+msgid "E878: (NFA) Could not allocate memory for branch traversal!"
+msgstr "E878: (NFA) Ne povis asigni memoron por traigi branฤ‰ojn!"
-#: ../screen.c:7435
msgid " VREPLACE"
msgstr " V-ANSTATAลฌIGO"
-#: ../screen.c:7437
msgid " REPLACE"
msgstr " ANSTATAลฌIGO"
-#: ../screen.c:7440
msgid " REVERSE"
msgstr " INVERSI"
-#: ../screen.c:7441
msgid " INSERT"
msgstr " ENMETO"
-#: ../screen.c:7443
msgid " (insert)"
msgstr " (enmeto)"
-#: ../screen.c:7445
msgid " (replace)"
msgstr " (anstataลญigo)"
-#: ../screen.c:7447
msgid " (vreplace)"
msgstr " (v-anstataลญigo)"
-#: ../screen.c:7449
msgid " Hebrew"
msgstr " hebrea"
-#: ../screen.c:7454
msgid " Arabic"
msgstr " araba"
-#: ../screen.c:7456
-msgid " (lang)"
-msgstr " (lingvo)"
-
-#: ../screen.c:7459
msgid " (paste)"
msgstr " (algluo)"
-#: ../screen.c:7469
msgid " VISUAL"
msgstr " VIDUMA"
-#: ../screen.c:7470
msgid " VISUAL LINE"
msgstr " VIDUMA LINIO"
-#: ../screen.c:7471
msgid " VISUAL BLOCK"
msgstr " VIDUMA BLOKO"
-#: ../screen.c:7472
msgid " SELECT"
msgstr " APARTIGO"
-#: ../screen.c:7473
msgid " SELECT LINE"
msgstr " APARTIGITA LINIO"
-#: ../screen.c:7474
msgid " SELECT BLOCK"
msgstr " APARTIGITA BLOKO"
-#: ../screen.c:7486 ../screen.c:7541
msgid "recording"
msgstr "registrado"
-#: ../search.c:487
#, c-format
msgid "E383: Invalid search string: %s"
msgstr "E383: Nevalida serฤ‰enda ฤ‰eno: %s"
-#: ../search.c:832
#, c-format
msgid "E384: search hit TOP without match for: %s"
msgstr "E384: serฤ‰o atingis SUPRON sen trovi: %s"
-#: ../search.c:835
#, c-format
msgid "E385: search hit BOTTOM without match for: %s"
msgstr "E385: serฤ‰o atingis SUBON sen trovi: %s"
-#: ../search.c:1200
msgid "E386: Expected '?' or '/' after ';'"
-msgstr "E386: Atendis '?' aลญ '/' post ';'"
+msgstr "E386: Atendis '?' aลญ '/' malantaลญ ';'"
-#: ../search.c:4085
msgid " (includes previously listed match)"
msgstr " (enhavas antaลญe listigitajn kongruojn)"
-#. cursor at status line
-#: ../search.c:4104
msgid "--- Included files "
msgstr "--- Inkluzivitaj dosieroj "
-#: ../search.c:4106
msgid "not found "
msgstr "netrovitaj "
-#: ../search.c:4107
msgid "in path ---\n"
msgstr "en serฤ‰vojo ---\n"
-#: ../search.c:4168
msgid " (Already listed)"
msgstr " (Jam listigita)"
-#: ../search.c:4170
msgid " NOT FOUND"
msgstr " NETROVITA"
-#: ../search.c:4211
#, c-format
msgid "Scanning included file: %s"
msgstr "Skanado de inkluzivitaj dosieroj: %s"
-#: ../search.c:4216
#, c-format
msgid "Searching included file %s"
msgstr "Serฤ‰ado de inkluzivitaj dosieroj %s"
-#: ../search.c:4405
msgid "E387: Match is on current line"
msgstr "E387: Kongruo estas ฤ‰e aktuala linio"
-#: ../search.c:4517
msgid "All included files were found"
msgstr "ฤˆiuj inkluzivitaj dosieroj estis trovitaj"
-#: ../search.c:4519
msgid "No included files"
msgstr "Neniu inkluzivita dosiero"
-#: ../search.c:4527
msgid "E388: Couldn't find definition"
msgstr "E388: Ne eblis trovi difinon"
-#: ../search.c:4529
msgid "E389: Couldn't find pattern"
msgstr "E389: Ne eblis trovi ลablonon"
-#: ../search.c:4668
msgid "Substitute "
msgstr "Anstataลญigi "
-#: ../search.c:4681
#, c-format
msgid ""
"\n"
@@ -5292,97 +4989,126 @@ msgstr ""
"# Lasta serฤ‰a ลablono %s:\n"
"~"
-#: ../spell.c:951
-msgid "E759: Format error in spell file"
-msgstr "E759: Eraro de formato en literuma dosiero"
+msgid "E756: Spell checking is not enabled"
+msgstr "E756: Literumilo ne estas ลaltita"
+
+#, c-format
+msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\""
+msgstr "Averto: Ne eblas trovi vortliston \"%s_%s.spl\" aลญ \"%s_ascii.spl\""
+
+#, c-format
+msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
+msgstr "Averto: Ne eblas trovi vortliston \"%s.%s.spl\" aลญ \"%s.ascii.spl\""
+
+msgid "E797: SpellFileMissing autocommand deleted buffer"
+msgstr "E797: Aลญtokomando SpellFileMissing forviลis bufron"
+
+#, c-format
+msgid "Warning: region %s not supported"
+msgstr "Averto: regiono %s ne subtenata"
+
+msgid "Sorry, no suggestions"
+msgstr "Bedaลญrinde ne estas sugestoj"
+
+#, c-format
+msgid "Sorry, only %ld suggestions"
+msgstr "Bedaลญrinde estas nur %ld sugestoj"
+
+#, c-format
+msgid "Change \"%.*s\" to:"
+msgstr "Anstataลญigi \"%.*s\" per:"
+
+#, c-format
+msgid " < \"%.*s\""
+msgstr " < \"%.*s\""
+
+msgid "E752: No previous spell replacement"
+msgstr "E752: Neniu antaลญa literuma anstataลญigo"
+
+#, c-format
+msgid "E753: Not found: %s"
+msgstr "E753: Netrovita: %s"
-#: ../spell.c:952
msgid "E758: Truncated spell file"
msgstr "E758: Trunkita literuma dosiero"
-#: ../spell.c:953
#, c-format
msgid "Trailing text in %s line %d: %s"
msgstr "Vosta teksto en %s linio %d: %s"
-#: ../spell.c:954
#, c-format
msgid "Affix name too long in %s line %d: %s"
msgstr "Nomo de afikso tro longa en %s linio %d: %s"
-#: ../spell.c:955
msgid "E761: Format error in affix file FOL, LOW or UPP"
msgstr "E761: Eraro de formato en afiksa dosiero FOL, LOW aลญ UPP"
-#: ../spell.c:957
msgid "E762: Character in FOL, LOW or UPP is out of range"
msgstr "E762: Signo en FOL, LOW aลญ UPP estas ekster limoj"
-#: ../spell.c:958
msgid "Compressing word tree..."
msgstr "Densigas arbon de vortoj..."
-#: ../spell.c:1951
-msgid "E756: Spell checking is not enabled"
-msgstr "E756: Literumilo ne estas ลaltita"
-
-#: ../spell.c:2249
-#, c-format
-msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
-msgstr "Averto: Ne eblas trovi vortliston \"%s.%s.spl\" aลญ \"%s.ascii.spl\""
-
-#: ../spell.c:2473
#, c-format
msgid "Reading spell file \"%s\""
msgstr "Legado de literuma dosiero \"%s\""
-#: ../spell.c:2496
msgid "E757: This does not look like a spell file"
msgstr "E757: Tio ne ลajnas esti literuma dosiero"
-#: ../spell.c:2501
msgid "E771: Old spell file, needs to be updated"
msgstr "E771: Malnova literuma dosiero, ฤisdatigo bezonata"
-#: ../spell.c:2504
msgid "E772: Spell file is for newer version of Vim"
msgstr "E772: Literuma dosiero estas por pli nova versio de Vim"
-#: ../spell.c:2602
msgid "E770: Unsupported section in spell file"
msgstr "E770: Nesubtenata sekcio en literuma dosiero"
-#: ../spell.c:3762
#, c-format
-msgid "Warning: region %s not supported"
-msgstr "Averto: regiono %s ne subtenata"
+msgid "E778: This does not look like a .sug file: %s"
+msgstr "E778: Tio ne ลajnas esti dosiero .sug: %s"
-#: ../spell.c:4550
#, c-format
-msgid "Reading affix file %s ..."
-msgstr "Legado de afiksa dosiero %s ..."
+msgid "E779: Old .sug file, needs to be updated: %s"
+msgstr "E779: Malnova dosiero .sug, bezonas ฤisdatigon: %s"
+
+#, c-format
+msgid "E780: .sug file is for newer version of Vim: %s"
+msgstr "E780: Dosiero .sug estas por pli nova versio de Vim: %s"
+
+#, c-format
+msgid "E781: .sug file doesn't match .spl file: %s"
+msgstr "E781: Dosiero .sug ne kongruas kun dosiero .spl: %s"
+
+#, c-format
+msgid "E782: error while reading .sug file: %s"
+msgstr "E782: eraro dum legado de dosiero .sug: %s"
+
+#, c-format
+msgid "Reading affix file %s..."
+msgstr "Legado de afiksa dosiero %s..."
-#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
#, c-format
msgid "Conversion failure for word in %s line %d: %s"
msgstr "Malsukceso dum konverto de vorto en %s linio %d: %s"
-#: ../spell.c:4630 ../spell.c:6170
#, c-format
msgid "Conversion in %s not supported: from %s to %s"
msgstr "Konverto en %s nesubtenata: de %s al %s"
-#: ../spell.c:4642
+#, c-format
+msgid "Conversion in %s not supported"
+msgstr "Konverto en %s nesubtenata"
+
#, c-format
msgid "Invalid value for FLAG in %s line %d: %s"
msgstr "Nevalida valoro de FLAG en %s linio %d: %s"
-#: ../spell.c:4655
#, c-format
msgid "FLAG after using flags in %s line %d: %s"
msgstr "FLAG post flagoj en %s linio %d: %s"
-#: ../spell.c:4723
#, c-format
msgid ""
"Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line "
@@ -5391,7 +5117,6 @@ msgstr ""
"Difino de COMPOUNDFORBIDFLAG post ano PFX povas doni neฤustajn rezultojn en "
"%s linio %d"
-#: ../spell.c:4731
#, c-format
msgid ""
"Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line "
@@ -5400,42 +5125,34 @@ msgstr ""
"Difino de COMPOUNDPERMITFLAG post ano PFX povas doni neฤustajn rezultojn en "
"%s linio %d"
-#: ../spell.c:4747
#, c-format
msgid "Wrong COMPOUNDRULES value in %s line %d: %s"
msgstr "Nevalida valoro de COMPOUNDRULES en %s linio %d: %s"
-#: ../spell.c:4771
#, c-format
msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s"
msgstr "Nevalida valoro de COMPOUNDWORDMAX en %s linio %d: %s"
-#: ../spell.c:4777
#, c-format
msgid "Wrong COMPOUNDMIN value in %s line %d: %s"
msgstr "Nevalida valoro de COMPOUNDMIN en %s linio %d: %s"
-#: ../spell.c:4783
#, c-format
msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s"
msgstr "Nevalida valoro de COMPOUNDSYLMAX en %s linio %d: %s"
-#: ../spell.c:4795
#, c-format
msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"
msgstr "Nevalida valoro de CHECKCOMPOUNDPATTERN en %s linio %d: %s"
-#: ../spell.c:4847
#, c-format
msgid "Different combining flag in continued affix block in %s line %d: %s"
msgstr "Malsama flago de kombino en daลญra bloko de afikso en %s linio %d: %s"
-#: ../spell.c:4850
#, c-format
msgid "Duplicate affix in %s line %d: %s"
msgstr "Ripetita afikso en %s linio %d: %s"
-#: ../spell.c:4871
#, c-format
msgid ""
"Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s "
@@ -5444,337 +5161,251 @@ msgstr ""
"Afikso ankaลญ uzata por BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST en "
"%s linio %d: %s"
-#: ../spell.c:4893
#, c-format
msgid "Expected Y or N in %s line %d: %s"
msgstr "Y aลญ N atendita en %s linio %d: %s"
-#: ../spell.c:4968
#, c-format
msgid "Broken condition in %s line %d: %s"
msgstr "Nevalida kondiฤ‰o en %s linio %d: %s"
-#: ../spell.c:5091
#, c-format
msgid "Expected REP(SAL) count in %s line %d"
msgstr "Neatendita nombro REP(SAL) en %s linio %d"
-#: ../spell.c:5120
#, c-format
msgid "Expected MAP count in %s line %d"
msgstr "Neatendita nombro de MAPen %s linio %d"
-#: ../spell.c:5132
#, c-format
msgid "Duplicate character in MAP in %s line %d"
msgstr "Ripetita signo en MAP en %s linio %d"
-#: ../spell.c:5176
#, c-format
msgid "Unrecognized or duplicate item in %s line %d: %s"
msgstr "Neagnoskita aลญ ripetita ano en %s linio %d: %s"
-#: ../spell.c:5197
#, c-format
msgid "Missing FOL/LOW/UPP line in %s"
msgstr "Mankas linio FOL/LOW/UPP en %s"
-#: ../spell.c:5220
msgid "COMPOUNDSYLMAX used without SYLLABLE"
msgstr "COMPOUNDSYLMAX uzita sen SYLLABLE"
-#: ../spell.c:5236
msgid "Too many postponed prefixes"
msgstr "Tro da prokrastitaj prefiksoj"
-#: ../spell.c:5238
msgid "Too many compound flags"
msgstr "Tro da kunmetitaj flagoj"
-#: ../spell.c:5240
msgid "Too many postponed prefixes and/or compound flags"
msgstr "Tro da prokrastitaj prefiksoj kaj/aลญ kunmetitaj flagoj"
-#: ../spell.c:5250
#, c-format
msgid "Missing SOFO%s line in %s"
msgstr "Mankas SOFO%s-aj linioj en %s"
-#: ../spell.c:5253
#, c-format
msgid "Both SAL and SOFO lines in %s"
msgstr "Ambaลญ SAL kaj SOFO linioj en %s"
-#: ../spell.c:5331
#, c-format
msgid "Flag is not a number in %s line %d: %s"
msgstr "Flago ne estas nombro en %s linio %d: %s"
-#: ../spell.c:5334
#, c-format
msgid "Illegal flag in %s line %d: %s"
msgstr "Nevalida flago en %s linio %d: %s"
-#: ../spell.c:5493 ../spell.c:5501
#, c-format
msgid "%s value differs from what is used in another .aff file"
msgstr "Valoro de %s malsamas ol tiu en alia dosiero .aff"
-#: ../spell.c:5602
#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "Legado de vortardosiero %s ..."
+msgid "Reading dictionary file %s..."
+msgstr "Legado de vortardosiero %s..."
-#: ../spell.c:5611
#, c-format
msgid "E760: No word count in %s"
msgstr "E760: Ne estas nombro de vortoj en %s"
-#: ../spell.c:5669
#, c-format
msgid "line %6d, word %6d - %s"
msgstr "linio %6d, vorto %6d - %s"
-#: ../spell.c:5691
#, c-format
msgid "Duplicate word in %s line %d: %s"
msgstr "Ripetita vorto en %s linio %d: %s"
-#: ../spell.c:5694
#, c-format
msgid "First duplicate word in %s line %d: %s"
msgstr "Unua ripetita vorto en %s linio %d: %s"
-#: ../spell.c:5746
#, c-format
msgid "%d duplicate word(s) in %s"
msgstr "%d ripetita(j) vorto(j) en %s"
-#: ../spell.c:5748
#, c-format
msgid "Ignored %d word(s) with non-ASCII characters in %s"
msgstr "%d ignorita(j) vorto(j) kun neaskiaj signoj en %s"
-#: ../spell.c:6115
#, c-format
-msgid "Reading word file %s ..."
-msgstr "Legado de dosiero de vortoj %s ..."
+msgid "Reading word file %s..."
+msgstr "Legado de dosiero de vortoj %s..."
-#: ../spell.c:6155
#, c-format
msgid "Duplicate /encoding= line ignored in %s line %d: %s"
msgstr "Ripetita linio /encoding= ignorita en %s linio %d: %s"
-#: ../spell.c:6159
#, c-format
msgid "/encoding= line after word ignored in %s line %d: %s"
msgstr "Linio /encoding= post vorto ignorita en %s linio %d: %s"
-#: ../spell.c:6180
#, c-format
msgid "Duplicate /regions= line ignored in %s line %d: %s"
msgstr "Ripetita linio /regions= ignorita en %s linio %d: %s"
-#: ../spell.c:6185
#, c-format
msgid "Too many regions in %s line %d: %s"
msgstr "Tro da regionoj en %s linio %d: %s"
-#: ../spell.c:6198
#, c-format
msgid "/ line ignored in %s line %d: %s"
msgstr "Linio / ignorita en %s linio %d: %s"
-#: ../spell.c:6224
#, c-format
msgid "Invalid region nr in %s line %d: %s"
msgstr "Nevalida regiono nr en %s linio %d: %s"
-#: ../spell.c:6230
#, c-format
msgid "Unrecognized flags in %s line %d: %s"
msgstr "Nekonata flago en %s linio %d: %s"
-#: ../spell.c:6257
#, c-format
msgid "Ignored %d words with non-ASCII characters"
msgstr "Ignoris %d vorto(j)n kun neaskiaj signoj"
-#: ../spell.c:6656
+msgid "E845: Insufficient memory, word list will be incomplete"
+msgstr "E845: Ne sufiฤ‰e da memoro, vortlisto estos nekompleta."
+
#, c-format
msgid "Compressed %d of %d nodes; %d (%d%%) remaining"
msgstr "Densigis %d de %d nodoj; %d (%d%%) restantaj"
-#: ../spell.c:7340
msgid "Reading back spell file..."
msgstr "Relegas la dosieron de literumo..."
-#. Go through the trie of good words, soundfold each word and add it to
-#. the soundfold trie.
-#: ../spell.c:7357
msgid "Performing soundfolding..."
msgstr "Fonetika analizado..."
-#: ../spell.c:7368
#, c-format
-msgid "Number of words after soundfolding: %<PRId64>"
-msgstr "Nombro de vortoj post fonetika analizado: %<PRId64>"
+msgid "Number of words after soundfolding: %ld"
+msgstr "Nombro de vortoj post fonetika analizado: %ld"
-#: ../spell.c:7476
#, c-format
msgid "Total number of words: %d"
msgstr "Totala nombro de vortoj: %d"
-#: ../spell.c:7655
#, c-format
-msgid "Writing suggestion file %s ..."
-msgstr "Skribado de dosiero de sugesto %s ..."
+msgid "Writing suggestion file %s..."
+msgstr "Skribado de dosiero de sugesto %s..."
-#: ../spell.c:7707 ../spell.c:7927
#, c-format
msgid "Estimated runtime memory use: %d bytes"
msgstr "Evaluo de memoro uzata: %d bajtoj"
-#: ../spell.c:7820
msgid "E751: Output file name must not have region name"
msgstr "E751: Nomo de eliga dosiero ne devas havi nomon de regiono"
-#: ../spell.c:7822
msgid "E754: Only up to 8 regions supported"
msgstr "E754: Nur 8 regionoj subtenataj"
-#: ../spell.c:7846
#, c-format
msgid "E755: Invalid region in %s"
msgstr "E755: Nevalida regiono en %s"
-#: ../spell.c:7907
msgid "Warning: both compounding and NOBREAK specified"
msgstr "Averto: ambaลญ NOBREAK kaj NOBREAK specifitaj"
-#: ../spell.c:7920
#, c-format
-msgid "Writing spell file %s ..."
-msgstr "Skribado de literuma dosiero %s ..."
+msgid "Writing spell file %s..."
+msgstr "Skribado de literuma dosiero %s..."
-#: ../spell.c:7925
msgid "Done!"
msgstr "Farita!"
-#: ../spell.c:8034
#, c-format
-msgid "E765: 'spellfile' does not have %<PRId64> entries"
-msgstr "E765: 'spellfile' ne havas %<PRId64> rikordojn"
+msgid "E765: 'spellfile' does not have %ld entries"
+msgstr "E765: 'spellfile' ne havas %ld rikordojn"
-#: ../spell.c:8074
-#, fuzzy, c-format
+#, c-format
msgid "Word '%.*s' removed from %s"
-msgstr "Vorto fortirita el %s"
+msgstr "Vorto '%.*s' fortirita el %s"
-#: ../spell.c:8117
-#, fuzzy, c-format
+#, c-format
msgid "Word '%.*s' added to %s"
-msgstr "Vorto aldonita al %s"
+msgstr "Vorto '%.*s' aldonita al %s"
-#: ../spell.c:8381
msgid "E763: Word characters differ between spell files"
msgstr "E763: Signoj de vorto malsamas tra literumaj dosieroj"
-#: ../spell.c:8684
-msgid "Sorry, no suggestions"
-msgstr "Bedaลญrinde ne estas sugestoj"
-
-#: ../spell.c:8687
-#, c-format
-msgid "Sorry, only %<PRId64> suggestions"
-msgstr "Bedaลญrinde estas nur %<PRId64> sugestoj"
-
-#. for when 'cmdheight' > 1
-#. avoid more prompt
-#: ../spell.c:8704
-#, c-format
-msgid "Change \"%.*s\" to:"
-msgstr "Anstataลญigi \"%.*s\" per:"
-
-#: ../spell.c:8737
-#, c-format
-msgid " < \"%.*s\""
-msgstr " < \"%.*s\""
+msgid "E783: duplicate char in MAP entry"
+msgstr "E783: ripetita signo en rikordo MAP"
-#: ../spell.c:8882
-msgid "E752: No previous spell replacement"
-msgstr "E752: Neniu antaลญa literuma anstataลญigo"
+msgid "No Syntax items defined for this buffer"
+msgstr "Neniu sintaksa elemento difinita por tiu bufro"
-#: ../spell.c:8925
-#, c-format
-msgid "E753: Not found: %s"
-msgstr "E753: Netrovita: %s"
+msgid "'redrawtime' exceeded, syntax highlighting disabled"
+msgstr "'redrawtime' transpasita, sintaksa emfazo malลaltita"
-#: ../spell.c:9276
-#, c-format
-msgid "E778: This does not look like a .sug file: %s"
-msgstr "E778: Tio ne ลajnas esti dosiero .sug: %s"
+msgid "syntax conceal on"
+msgstr "sintakso de conceal ลaltata"
-#: ../spell.c:9282
-#, c-format
-msgid "E779: Old .sug file, needs to be updated: %s"
-msgstr "E779: Malnova dosiero .sug, bezonas ฤisdatigon: %s"
+msgid "syntax conceal off"
+msgstr "sintakso de conceal malลaltita"
-#: ../spell.c:9286
#, c-format
-msgid "E780: .sug file is for newer version of Vim: %s"
-msgstr "E780: Dosiero .sug estas por pli nova versio de Vim: %s"
+msgid "E390: Illegal argument: %s"
+msgstr "E390: Nevalida argumento: %s"
-#: ../spell.c:9295
-#, c-format
-msgid "E781: .sug file doesn't match .spl file: %s"
-msgstr "E781: Dosiero .sug ne kongruas kun dosiero .spl: %s"
+msgid "syntax case ignore"
+msgstr "sintakso ignoras usklecon"
-#: ../spell.c:9305
-#, c-format
-msgid "E782: error while reading .sug file: %s"
-msgstr "E782: eraro dum legado de dosiero .sug: %s"
+msgid "syntax case match"
+msgstr "sintakso konsideras usklecon"
-#. This should have been checked when generating the .spl
-#. file.
-#: ../spell.c:11575
-msgid "E783: duplicate char in MAP entry"
-msgstr "E783: ripetita signo en rikordo MAP"
+msgid "syntax spell toplevel"
+msgstr "literumado en teksto sen sintaksa grupo"
-#: ../syntax.c:266
-msgid "No Syntax items defined for this buffer"
-msgstr "Neniu sintaksa elemento difinita por tiu bufro"
+msgid "syntax spell notoplevel"
+msgstr "sen literumado en teksto sen sintaksa grupo"
-#: ../syntax.c:3083 ../syntax.c:3104 ../syntax.c:3127
-#, c-format
-msgid "E390: Illegal argument: %s"
-msgstr "E390: Nevalida argumento: %s"
+msgid "syntax spell default"
+msgstr ""
+"literumado en teksto sen sintaksa grupo, nur se ne estas @Spell aลญ @NoSpell"
msgid "syntax iskeyword "
msgstr "sintakso iskeyword "
-#: ../syntax.c:3299
+msgid "syntax iskeyword not set"
+msgstr "sintakso iskeyword ne ลaltita"
+
#, c-format
msgid "E391: No such syntax cluster: %s"
msgstr "E391: Nenia sintaksa fasko: %s"
-#: ../syntax.c:3433
msgid "syncing on C-style comments"
msgstr "sinkronigo per C-stilaj komentoj"
-#: ../syntax.c:3439
msgid "no syncing"
msgstr "neniu sinkronigo"
-#: ../syntax.c:3441
msgid "syncing starts "
msgstr "sinkronigo ekas "
-#: ../syntax.c:3443 ../syntax.c:3506
msgid " lines before top line"
msgstr " linioj antaลญ supra linio"
-#: ../syntax.c:3448
msgid ""
"\n"
"--- Syntax sync items ---"
@@ -5782,7 +5413,6 @@ msgstr ""
"\n"
"--- Eroj de sintaksa sinkronigo ---"
-#: ../syntax.c:3452
msgid ""
"\n"
"syncing on items"
@@ -5790,7 +5420,6 @@ msgstr ""
"\n"
"sinkronigo per eroj"
-#: ../syntax.c:3457
msgid ""
"\n"
"--- Syntax items ---"
@@ -5798,276 +5427,215 @@ msgstr ""
"\n"
"--- Sintakseroj ---"
-#: ../syntax.c:3475
#, c-format
msgid "E392: No such syntax cluster: %s"
msgstr "E392: Nenia sintaksa fasko: %s"
-#: ../syntax.c:3497
msgid "minimal "
msgstr "minimuma "
-#: ../syntax.c:3503
msgid "maximal "
msgstr "maksimuma "
-#: ../syntax.c:3513
msgid "; match "
msgstr "; kongruo "
-#: ../syntax.c:3515
msgid " line breaks"
msgstr " liniavancoj"
-#: ../syntax.c:4076
msgid "E395: contains argument not accepted here"
msgstr "E395: La argumento \"contains\" ne akcepteblas tie"
-#: ../syntax.c:4096
msgid "E844: invalid cchar value"
msgstr "E844: nevalida valoro de cchar"
-#: ../syntax.c:4107
msgid "E393: group[t]here not accepted here"
msgstr "E393: La argumento \"group[t]here\" ne akcepteblas tie"
-#: ../syntax.c:4126
#, c-format
msgid "E394: Didn't find region item for %s"
msgstr "E394: Ne trovis regionan elementon por %s"
-#: ../syntax.c:4188
msgid "E397: Filename required"
msgstr "E397: Dosiernomo bezonata"
-#: ../syntax.c:4221
msgid "E847: Too many syntax includes"
msgstr "E847: Tro da sintaksaj inkluzivoj"
-#: ../syntax.c:4303
#, c-format
msgid "E789: Missing ']': %s"
msgstr "E789: Mankas ']': %s"
#, c-format
msgid "E890: trailing char after ']': %s]%s"
-msgstr "E890: vosta signo post ']': %s]%s"
+msgstr "E890: vosta signo malantaลญ ']': %s]%s"
-#: ../syntax.c:4531
#, c-format
msgid "E398: Missing '=': %s"
msgstr "E398: Mankas '=': %s"
-#: ../syntax.c:4666
#, c-format
msgid "E399: Not enough arguments: syntax region %s"
msgstr "E399: Ne sufiฤ‰aj argumentoj: sintaksa regiono %s"
-#: ../syntax.c:4870
msgid "E848: Too many syntax clusters"
msgstr "E848: Tro da sintaksaj grupoj"
-#: ../syntax.c:4954
msgid "E400: No cluster specified"
msgstr "E400: Neniu fasko specifita"
-#. end delimiter not found
-#: ../syntax.c:4986
#, c-format
msgid "E401: Pattern delimiter not found: %s"
msgstr "E401: Disigilo de ลablono netrovita: %s"
-#: ../syntax.c:5049
#, c-format
msgid "E402: Garbage after pattern: %s"
-msgstr "E402: Forฤตetindaฤตo post ลablono: %s"
+msgstr "E402: Forฤตetindaฤตo malantaลญ ลablono: %s"
-#: ../syntax.c:5120
msgid "E403: syntax sync: line continuations pattern specified twice"
msgstr "E403: sintaksa sinkronigo: ลablono de linia daลญrigo specifita dufoje"
-#: ../syntax.c:5169
#, c-format
msgid "E404: Illegal arguments: %s"
msgstr "E404: Nevalidaj argumentoj: %s"
-#: ../syntax.c:5217
#, c-format
msgid "E405: Missing equal sign: %s"
msgstr "E405: Mankas egalsigno: %s"
-#: ../syntax.c:5222
#, c-format
msgid "E406: Empty argument: %s"
msgstr "E406: Malplena argumento: %s"
-#: ../syntax.c:5240
#, c-format
msgid "E407: %s not allowed here"
msgstr "E407: %s ne estas permesebla tie"
-#: ../syntax.c:5246
#, c-format
msgid "E408: %s must be first in contains list"
msgstr "E408: %s devas esti la unua ano de la listo \"contains\""
-#: ../syntax.c:5304
#, c-format
msgid "E409: Unknown group name: %s"
msgstr "E409: Nekonata nomo de grupo: %s"
-#: ../syntax.c:5512
#, c-format
msgid "E410: Invalid :syntax subcommand: %s"
msgstr "E410: Nevalida \":syntax\" subkomando: %s"
-#: ../syntax.c:5854
msgid ""
" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
msgstr ""
+" TOTALO NOMBRO KONGRUO PLEJ MALRAPID MEZA NOMO ลœABLONO"
-#: ../syntax.c:6146
msgid "E679: recursive loop loading syncolor.vim"
msgstr "E679: rekursia buklo dum ลargo de syncolor.vim"
-#: ../syntax.c:6256
#, c-format
msgid "E411: highlight group not found: %s"
msgstr "E411: emfaza grupo netrovita: %s"
-#: ../syntax.c:6278
#, c-format
msgid "E412: Not enough arguments: \":highlight link %s\""
msgstr "E412: Ne sufiฤ‰aj argumentoj: \":highlight link %s\""
-#: ../syntax.c:6284
#, c-format
msgid "E413: Too many arguments: \":highlight link %s\""
-msgstr "E413: Tro argumentoj: \":highlight link %s\""
+msgstr "E413: Tro da argumentoj: \":highlight link %s\""
-#: ../syntax.c:6302
msgid "E414: group has settings, highlight link ignored"
msgstr "E414: grupo havas agordojn, ligilo de emfazo ignorita"
-#: ../syntax.c:6367
#, c-format
msgid "E415: unexpected equal sign: %s"
msgstr "E415: neatendita egalsigno: %s"
-#: ../syntax.c:6395
#, c-format
msgid "E416: missing equal sign: %s"
msgstr "E416: mankas egalsigno: %s"
-#: ../syntax.c:6418
#, c-format
msgid "E417: missing argument: %s"
msgstr "E417: mankas argumento: %s"
-#: ../syntax.c:6446
#, c-format
msgid "E418: Illegal value: %s"
msgstr "E418: Nevalida valoro: %s"
-#: ../syntax.c:6496
msgid "E419: FG color unknown"
msgstr "E419: Nekonata malfona koloro"
-#: ../syntax.c:6504
msgid "E420: BG color unknown"
msgstr "E420: Nekonata fona koloro"
-#: ../syntax.c:6564
#, c-format
msgid "E421: Color name or number not recognized: %s"
msgstr "E421: Kolora nomo aลญ nombro nerekonita: %s"
-#: ../syntax.c:6714
#, c-format
msgid "E422: terminal code too long: %s"
msgstr "E422: kodo de terminalo estas tro longa: %s"
-#: ../syntax.c:6753
#, c-format
msgid "E423: Illegal argument: %s"
msgstr "E423: Nevalida argumento: %s"
-#: ../syntax.c:6925
msgid "E424: Too many different highlighting attributes in use"
msgstr "E424: Tro da malsamaj atributoj de emfazo uzataj"
-#: ../syntax.c:7427
msgid "E669: Unprintable character in group name"
msgstr "E669: Nepresebla signo en nomo de grupo"
-#: ../syntax.c:7434
msgid "W18: Invalid character in group name"
msgstr "W18: Nevalida signo en nomo de grupo"
-#: ../syntax.c:7448
msgid "E849: Too many highlight and syntax groups"
msgstr "E849: Tro da emfazaj kaj sintaksaj grupoj"
-#: ../tag.c:104
msgid "E555: at bottom of tag stack"
msgstr "E555: ฤ‰e subo de stako de etikedoj"
-#: ../tag.c:105
msgid "E556: at top of tag stack"
msgstr "E556: ฤ‰e supro de stako de etikedoj"
-#: ../tag.c:380
msgid "E425: Cannot go before first matching tag"
msgstr "E425: Ne eblas iri antaลญ la unuan kongruan etikedon"
-#: ../tag.c:504
#, c-format
msgid "E426: tag not found: %s"
msgstr "E426: etikedo netrovita: %s"
# DP: "pri" estas "priority"
-#: ../tag.c:528
msgid " # pri kind tag"
msgstr "nro pri tipo etikedo"
-#: ../tag.c:531
msgid "file\n"
msgstr "dosiero\n"
-#: ../tag.c:829
msgid "E427: There is only one matching tag"
msgstr "E427: Estas nur unu kongrua etikedo"
-#: ../tag.c:831
msgid "E428: Cannot go beyond last matching tag"
msgstr "E428: Ne eblas iri preter lastan kongruan etikedon"
-#: ../tag.c:850
#, c-format
msgid "File \"%s\" does not exist"
msgstr "La dosiero \"%s\" ne ekzistas"
-#. Give an indication of the number of matching tags
-#: ../tag.c:859
#, c-format
msgid "tag %d of %d%s"
msgstr "etikedo %d de %d%s"
-#: ../tag.c:862
msgid " or more"
msgstr " aลญ pli"
-#: ../tag.c:864
msgid " Using tag with different case!"
msgstr " Uzo de etikedo kun malsama uskleco!"
-#: ../tag.c:909
#, c-format
msgid "E429: File \"%s\" does not exist"
msgstr "E429: Dosiero \"%s\" ne ekzistas"
-#. Highlight title
-#: ../tag.c:960
msgid ""
"\n"
" # TO tag FROM line in file/text"
@@ -6075,79 +5643,64 @@ msgstr ""
"\n"
"nro AL etikedo DE linio en dosiero/teksto"
-#: ../tag.c:1303
#, c-format
msgid "Searching tags file %s"
msgstr "Serฤ‰ado de dosiero de etikedoj %s"
-#: ../tag.c:1545
+#, c-format
+msgid "E430: Tag file path truncated for %s\n"
+msgstr "E430: Vojo de etikeda dosiero trunkita por %s\n"
+
msgid "Ignoring long line in tags file"
msgstr "Ignoro de longa linio en etikeda dosiero"
-#: ../tag.c:1915
#, c-format
msgid "E431: Format error in tags file \"%s\""
msgstr "E431: Eraro de formato en etikeda dosiero \"%s\""
-#: ../tag.c:1917
#, c-format
-msgid "Before byte %<PRId64>"
-msgstr "Antaลญ bajto %<PRId64>"
+msgid "Before byte %ld"
+msgstr "Antaลญ bajto %ld"
-#: ../tag.c:1929
#, c-format
msgid "E432: Tags file not sorted: %s"
msgstr "E432: Etikeda dosiero ne estas ordigita: %s"
-#. never opened any tags file
-#: ../tag.c:1960
msgid "E433: No tags file"
msgstr "E433: Neniu etikeda dosiero"
-#: ../tag.c:2536
msgid "E434: Can't find tag pattern"
msgstr "E434: Ne eblas trovi ลablonon de etikedo"
-#: ../tag.c:2544
msgid "E435: Couldn't find tag, just guessing!"
msgstr "E435: Ne eblis trovi etikedon, nur divenas!"
-#: ../tag.c:2797
#, c-format
msgid "Duplicate field name: %s"
msgstr "Ripetita kamponomo: %s"
-#: ../term.c:1442
msgid "' not known. Available builtin terminals are:"
msgstr "' nekonata. Haveblaj terminaloj estas:"
-#: ../term.c:1463
msgid "defaulting to '"
msgstr "defaลญlto al '"
-#: ../term.c:1731
msgid "E557: Cannot open termcap file"
msgstr "E557: Ne eblas malfermi la dosieron termcap"
-#: ../term.c:1735
msgid "E558: Terminal entry not found in terminfo"
msgstr "E558: Ne trovis rikordon de terminalo terminfo"
-#: ../term.c:1737
msgid "E559: Terminal entry not found in termcap"
msgstr "E559: Ne trovis rikordon de terminalo en termcap"
-#: ../term.c:1878
#, c-format
msgid "E436: No \"%s\" entry in termcap"
msgstr "E436: Neniu rikordo \"%s\" en termcap"
-#: ../term.c:2249
msgid "E437: terminal capability \"cm\" required"
msgstr "E437: kapablo de terminalo \"cm\" bezonata"
-#. Highlight title
-#: ../term.c:4376
msgid ""
"\n"
"--- Terminal keys ---"
@@ -6155,169 +5708,361 @@ msgstr ""
"\n"
"--- Klavoj de terminalo ---"
-#: ../ui.c:481
+msgid "Cannot open $VIMRUNTIME/rgb.txt"
+msgstr "Ne povas malfermi $VIMRUNTIME/rgb.txt"
+
+msgid "Terminal"
+msgstr "Terminalo"
+
+msgid "Terminal-finished"
+msgstr "Terminalo-finiฤis"
+
+msgid "active"
+msgstr "aktiva"
+
+msgid "running"
+msgstr "ruliฤas"
+
+msgid "finished"
+msgstr "finiฤis"
+
+msgid "new shell started\n"
+msgstr "nova ลelo lanฤ‰ita\n"
+
msgid "Vim: Error reading input, exiting...\n"
msgstr "Vim: Eraro dum legado de eniro, elironta...\n"
-#. This happens when the FileChangedRO autocommand changes the
-#. * file in a way it becomes shorter.
-#: ../undo.c:379
-#, fuzzy
+msgid "Used CUT_BUFFER0 instead of empty selection"
+msgstr "Uzis CUT_BUFFER0 anstataลญ malplenan apartigon"
+
msgid "E881: Line count changed unexpectedly"
-msgstr "E834: Nombro de linioj ลanฤiฤis neatendite"
+msgstr "E881: Nombro de linioj ลanฤiฤis neatendite"
+
+msgid "No undo possible; continue anyway"
+msgstr "Malfaro neebla; tamen daลญrigi"
-#: ../undo.c:627
#, c-format
msgid "E828: Cannot open undo file for writing: %s"
msgstr "E828: Ne eblas malfermi la malfaran dosieron por skribi: %s"
-#: ../undo.c:717
#, c-format
msgid "E825: Corrupted undo file (%s): %s"
msgstr "E825: Difektita malfara dosiero (%s): %s"
-#: ../undo.c:1039
msgid "Cannot write undo file in any directory in 'undodir'"
msgstr "Ne eblis skribi malfaran dosieron en iu dosiero ajn de 'undodir'"
-#: ../undo.c:1074
#, c-format
msgid "Will not overwrite with undo file, cannot read: %s"
msgstr "Ne superskribos malfaran dosieron, ne eblis legi: %s"
-#: ../undo.c:1092
#, c-format
msgid "Will not overwrite, this is not an undo file: %s"
msgstr "Ne superskribos, tio ne estas malfara dosiero: %s"
-#: ../undo.c:1108
msgid "Skipping undo file write, nothing to undo"
msgstr "Preterpasas skribon de malfara dosiero, nenio por malfari"
-#: ../undo.c:1121
#, c-format
msgid "Writing undo file: %s"
msgstr "Skribas malfaran dosieron: %s"
-#: ../undo.c:1213
#, c-format
msgid "E829: write error in undo file: %s"
msgstr "E829: Skriberaro en malfara dosiero: %s"
-#: ../undo.c:1280
#, c-format
msgid "Not reading undo file, owner differs: %s"
msgstr "Ne legas malfaran dosieron, posedanto malsamas: %s"
-#: ../undo.c:1292
#, c-format
msgid "Reading undo file: %s"
msgstr "Legado de malfara dosiero: %s"
-#: ../undo.c:1299
#, c-format
msgid "E822: Cannot open undo file for reading: %s"
msgstr "E822: Ne eblas malfermi malfaran dosieron por legi: %s"
-#: ../undo.c:1308
#, c-format
msgid "E823: Not an undo file: %s"
msgstr "E823: Ne estas malfara dosiero: %s"
-#: ../undo.c:1313
+#, c-format
+msgid "E832: Non-encrypted file has encrypted undo file: %s"
+msgstr "E832: Ne ฤ‰ifrita dosiero havas ฤ‰ifritan malfaran dosieron: %s"
+
+#, c-format
+msgid "E826: Undo file decryption failed: %s"
+msgstr "E826: Malฤ‰ifrado de malfara dosiero malsukcesis: %s"
+
+#, c-format
+msgid "E827: Undo file is encrypted: %s"
+msgstr "E827: Malfara dosiero estas ฤ‰ifrita: %s"
+
#, c-format
msgid "E824: Incompatible undo file: %s"
msgstr "E824: Malkongrua malfara dosiero: %s"
-#: ../undo.c:1328
msgid "File contents changed, cannot use undo info"
msgstr "Enhavo de dosiero ลanฤiฤis, ne eblas uzi malfarajn informojn"
-#: ../undo.c:1497
#, c-format
msgid "Finished reading undo file %s"
msgstr "Finis legi malfaran dosieron %s"
-#: ../undo.c:1586 ../undo.c:1812
msgid "Already at oldest change"
msgstr "Jam al la plej malnova ลanฤo"
-#: ../undo.c:1597 ../undo.c:1814
msgid "Already at newest change"
msgstr "Jam al la plej nova ลanฤo"
-#: ../undo.c:1806
#, c-format
-msgid "E830: Undo number %<PRId64> not found"
-msgstr "E830: Malfara numero %<PRId64> netrovita"
+msgid "E830: Undo number %ld not found"
+msgstr "E830: Malfara numero %ld netrovita"
-#: ../undo.c:1979
msgid "E438: u_undo: line numbers wrong"
msgstr "E438: u_undo: nevalidaj numeroj de linioj"
-#: ../undo.c:2183
msgid "more line"
msgstr "plia linio"
-#: ../undo.c:2185
msgid "more lines"
msgstr "pliaj linioj"
-#: ../undo.c:2187
msgid "line less"
msgstr "malpli linio"
-#: ../undo.c:2189
msgid "fewer lines"
msgstr "malpli linioj"
-#: ../undo.c:2193
msgid "change"
msgstr "ลanฤo"
-#: ../undo.c:2195
msgid "changes"
msgstr "ลanฤoj"
-#: ../undo.c:2225
#, c-format
-msgid "%<PRId64> %s; %s #%<PRId64> %s"
-msgstr "%<PRId64> %s; %s #%<PRId64> %s"
+msgid "%ld %s; %s #%ld %s"
+msgstr "%ld %s; %s #%ld %s"
-#: ../undo.c:2228
msgid "before"
msgstr "antaลญ"
-#: ../undo.c:2228
msgid "after"
msgstr "post"
-#: ../undo.c:2325
msgid "Nothing to undo"
msgstr "Nenio por malfari"
-#: ../undo.c:2330
msgid "number changes when saved"
msgstr "numero ลanฤoj tempo konservita"
-#: ../undo.c:2360
#, c-format
-msgid "%<PRId64> seconds ago"
-msgstr "antaลญ %<PRId64> sekundoj"
+msgid "%ld second ago"
+msgid_plural "%ld seconds ago"
+msgstr[0] "antaลญ %ld sekundo"
+msgstr[1] "antaลญ %ld sekundoj"
-#: ../undo.c:2372
msgid "E790: undojoin is not allowed after undo"
msgstr "E790: undojoin estas nepermesebla post malfaro"
-#: ../undo.c:2466
msgid "E439: undo list corrupt"
msgstr "E439: listo de malfaro estas difekta"
-#: ../undo.c:2495
msgid "E440: undo line missing"
msgstr "E440: linio de malfaro mankas"
-#: ../version.c:600
+#, c-format
+msgid "E122: Function %s already exists, add ! to replace it"
+msgstr "E122: La funkcio %s jam ekzistas (aldonu ! por anstataลญigi ฤin)"
+
+msgid "E717: Dictionary entry already exists"
+msgstr "E717: Rikordo de vortaro jam ekzistas"
+
+msgid "E718: Funcref required"
+msgstr "E718: Funcref bezonata"
+
+#, c-format
+msgid "E130: Unknown function: %s"
+msgstr "E130: Nekonata funkcio: %s"
+
+#, c-format
+msgid "E125: Illegal argument: %s"
+msgstr "E125: Nevalida argumento: %s"
+
+#, c-format
+msgid "E853: Duplicate argument name: %s"
+msgstr "E853: Ripetita nomo de argumento: %s"
+
+#, c-format
+msgid "E740: Too many arguments for function %s"
+msgstr "E740: Tro da argumentoj por funkcio: %s"
+
+#, c-format
+msgid "E116: Invalid arguments for function %s"
+msgstr "E116: Nevalidaj argumentoj por funkcio: %s"
+
+msgid "E132: Function call depth is higher than 'maxfuncdepth'"
+msgstr "E132: Profundo de funkcia alvoko superas 'maxfuncdepth'"
+
+#, c-format
+msgid "calling %s"
+msgstr "alvokas %s"
+
+#, c-format
+msgid "%s aborted"
+msgstr "%s ฤ‰esigita"
+
+#, c-format
+msgid "%s returning #%ld"
+msgstr "%s liveras #%ld"
+
+#, c-format
+msgid "%s returning %s"
+msgstr "%s liveras %s"
+
+msgid "E699: Too many arguments"
+msgstr "E699: Tro da argumentoj"
+
+#, c-format
+msgid "E117: Unknown function: %s"
+msgstr "E117: Nekonata funkcio: %s"
+
+#, c-format
+msgid "E933: Function was deleted: %s"
+msgstr "E933: funkcio estis forviลita: %s"
+
+#, c-format
+msgid "E119: Not enough arguments for function: %s"
+msgstr "E119: Ne sufiฤ‰e da argumentoj por funkcio: %s"
+
+#, c-format
+msgid "E120: Using <SID> not in a script context: %s"
+msgstr "E120: <SID> estas uzata ekster kunteksto de skripto: %s"
+
+#, c-format
+msgid "E725: Calling dict function without Dictionary: %s"
+msgstr "E725: Alvoko de funkcio dict sen Vortaro: %s"
+
+msgid "E129: Function name required"
+msgstr "E129: Nomo de funkcio bezonata"
+
+#, c-format
+msgid "E128: Function name must start with a capital or \"s:\": %s"
+msgstr "E128: Nomo de funkcio devas eki per majusklo aลญ per \"s:\": %s"
+
+#, c-format
+msgid "E884: Function name cannot contain a colon: %s"
+msgstr "E884: Nomo de funkcio ne povas enhavi dupunkton: %s"
+
+#, c-format
+msgid "E123: Undefined function: %s"
+msgstr "E123: Nedifinita funkcio: %s"
+
+#, c-format
+msgid "E124: Missing '(': %s"
+msgstr "E124: Mankas '(': %s"
+
+msgid "E862: Cannot use g: here"
+msgstr "E862: Ne eblas uzi g: ฤ‰i tie"
+
+#, c-format
+msgid "E932: Closure function should not be at top level: %s"
+msgstr "E932: Fermo-funkcio devus esti je la plej alta nivelo: %s"
+
+msgid "E126: Missing :endfunction"
+msgstr "E126: Mankas \":endfunction\""
+
+#, c-format
+msgid "W22: Text found after :endfunction: %s"
+msgstr "W22: Teksto trovita malantaลญ :endfunction: %s"
+
+#, c-format
+msgid "E707: Function name conflicts with variable: %s"
+msgstr "E707: Nomo de funkcio konfliktas kun variablo: %s"
+
+#, c-format
+msgid "E127: Cannot redefine function %s: It is in use"
+msgstr "E127: Ne eblas redifini funkcion %s: Estas nuntempe uzata"
+
+#, c-format
+msgid "E746: Function name does not match script file name: %s"
+msgstr "E746: Nomo de funkcio ne kongruas kun dosiernomo de skripto: %s"
+
+#, c-format
+msgid "E131: Cannot delete function %s: It is in use"
+msgstr "E131: Ne eblas forviลi funkcion %s: Estas nuntempe uzata"
+
+msgid "E133: :return not inside a function"
+msgstr "E133: \":return\" ekster funkcio"
+
+#, c-format
+msgid "E107: Missing parentheses: %s"
+msgstr "E107: Mankas krampoj: %s"
+
+#, c-format
+msgid "%s (%s, compiled %s)"
+msgstr "%s (%s, kompilita %s)"
+
+msgid ""
+"\n"
+"MS-Windows 64-bit GUI version"
+msgstr ""
+"\n"
+"Grafika versio MS-Vindozo 64-bitoj"
+
+msgid ""
+"\n"
+"MS-Windows 32-bit GUI version"
+msgstr ""
+"\n"
+"Grafika versio MS-Vindozo 32-bitoj"
+
+msgid " with OLE support"
+msgstr " kun subteno de OLE"
+
+msgid ""
+"\n"
+"MS-Windows 64-bit console version"
+msgstr ""
+"\n"
+"Versio konzola MS-Vindozo 64-bitoj"
+
+msgid ""
+"\n"
+"MS-Windows 32-bit console version"
+msgstr ""
+"\n"
+"Versio konzola MS-Vindozo 32-bitoj"
+
+msgid ""
+"\n"
+"MacOS X (unix) version"
+msgstr ""
+"\n"
+"Versio Mak OS X (unikso)"
+
+msgid ""
+"\n"
+"MacOS X version"
+msgstr ""
+"\n"
+"Versio Mak OS X"
+
+msgid ""
+"\n"
+"MacOS version"
+msgstr ""
+"\n"
+"Versio Mak OS"
+
+msgid ""
+"\n"
+"OpenVMS version"
+msgstr ""
+"\n"
+"Versio OpenVMS"
+
msgid ""
"\n"
"Included patches: "
@@ -6325,7 +6070,6 @@ msgstr ""
"\n"
"Flikaฤตoj inkluzivitaj: "
-#: ../version.c:627
msgid ""
"\n"
"Extra patches: "
@@ -6333,11 +6077,9 @@ msgstr ""
"\n"
"Ekstraj flikaฤตoj: "
-#: ../version.c:639 ../version.c:864
msgid "Modified by "
msgstr "Modifita de "
-#: ../version.c:646
msgid ""
"\n"
"Compiled "
@@ -6345,11 +6087,9 @@ msgstr ""
"\n"
"Kompilita "
-#: ../version.c:649
msgid "by "
msgstr "de "
-#: ../version.c:660
msgid ""
"\n"
"Huge version "
@@ -6357,1897 +6097,924 @@ msgstr ""
"\n"
"Grandega versio "
-#: ../version.c:661
+msgid ""
+"\n"
+"Big version "
+msgstr ""
+"\n"
+"Granda versio "
+
+msgid ""
+"\n"
+"Normal version "
+msgstr ""
+"\n"
+"Normala versio "
+
+msgid ""
+"\n"
+"Small version "
+msgstr ""
+"\n"
+"Malgranda versio "
+
+msgid ""
+"\n"
+"Tiny version "
+msgstr ""
+"\n"
+"Malgrandega versio "
+
msgid "without GUI."
msgstr "sen grafika interfaco."
-#: ../version.c:662
+msgid "with GTK3 GUI."
+msgstr "kun grafika interfaco GTK3."
+
+msgid "with GTK2-GNOME GUI."
+msgstr "kun grafika interfaco GTK2-GNOME."
+
+msgid "with GTK2 GUI."
+msgstr "kun grafika interfaco GTK2."
+
+msgid "with X11-Motif GUI."
+msgstr "kun grafika interfaco X11-Motif."
+
+msgid "with X11-neXtaw GUI."
+msgstr "kun grafika interfaco X11-neXtaw."
+
+msgid "with X11-Athena GUI."
+msgstr "kun grafika interfaco X11-Athena."
+
+msgid "with Photon GUI."
+msgstr "kun grafika interfaco Photon."
+
+msgid "with GUI."
+msgstr "sen grafika interfaco."
+
+msgid "with Carbon GUI."
+msgstr "kun grafika interfaco Carbon."
+
+msgid "with Cocoa GUI."
+msgstr "kun grafika interfaco Cocoa."
+
+msgid "with (classic) GUI."
+msgstr "kun (klasika) grafika interfaco."
+
msgid " Features included (+) or not (-):\n"
msgstr " Ebloj inkluzivitaj (+) aลญ ne (-):\n"
-#: ../version.c:667
msgid " system vimrc file: \""
msgstr " sistema dosiero vimrc: \""
-#: ../version.c:672
msgid " user vimrc file: \""
msgstr " dosiero vimrc de uzanto: \""
-#: ../version.c:677
msgid " 2nd user vimrc file: \""
msgstr " 2-a dosiero vimrc de uzanto: \""
-#: ../version.c:682
msgid " 3rd user vimrc file: \""
msgstr " 3-a dosiero vimrc de uzanto: \""
-#: ../version.c:687
msgid " user exrc file: \""
msgstr " dosiero exrc de uzanto: \""
-#: ../version.c:692
msgid " 2nd user exrc file: \""
msgstr " 2-a dosiero exrc de uzanto: \""
-#: ../version.c:699
+msgid " system gvimrc file: \""
+msgstr " sistema dosiero gvimrc: \""
+
+msgid " user gvimrc file: \""
+msgstr " dosiero gvimrc de uzanto: \""
+
+msgid "2nd user gvimrc file: \""
+msgstr " 2-a dosiero gvimrc de uzanto: \""
+
+msgid "3rd user gvimrc file: \""
+msgstr " 3-a dosiero gvimrc de uzanto: \""
+
+msgid " defaults file: \""
+msgstr " dosiero de defaลญltoj: \""
+
+msgid " system menu file: \""
+msgstr " dosiero de sistema menuo: \""
+
msgid " fall-back for $VIM: \""
msgstr " defaลญlto de $VIM: \""
-#: ../version.c:705
msgid " f-b for $VIMRUNTIME: \""
msgstr " defaลญlto de VIMRUNTIME: \""
-#: ../version.c:709
msgid "Compilation: "
msgstr "Kompilado: "
-#: ../version.c:712
+msgid "Compiler: "
+msgstr "Kompililo: "
+
msgid "Linking: "
msgstr "Ligado: "
-#: ../version.c:717
msgid " DEBUG BUILD"
msgstr " SENCIMIGA MUNTO"
-#: ../version.c:767
msgid "VIM - Vi IMproved"
msgstr "VIM - Vi plibonigita"
-#: ../version.c:769
msgid "version "
msgstr "versio "
# DP: vidu http://www.thefreedictionary.com/et+al.
-#: ../version.c:770
msgid "by Bram Moolenaar et al."
msgstr "de Bram Moolenaar kaj aliuloj"
-#: ../version.c:774
msgid "Vim is open source and freely distributable"
msgstr "Vim estas libera programo kaj disdoneblas libere"
-#: ../version.c:776
msgid "Help poor children in Uganda!"
msgstr "Helpu malriฤ‰ajn infanojn en Ugando!"
# DP: atentu al la spacetoj: ฤ‰iuj ฤ‰enoj devas havi la saman longon
-#: ../version.c:777
msgid "type :help iccf<Enter> for information "
msgstr "tajpu :help iccf<Enenklavo> por pliaj informoj "
# DP: atentu al la spacetoj: ฤ‰iuj ฤ‰enoj devas havi la saman longon
-#: ../version.c:779
msgid "type :q<Enter> to exit "
msgstr "tajpu :q<Enenklavo> por eliri "
# DP: atentu al la spacetoj: ฤ‰iuj ฤ‰enoj devas havi la saman longon
-#: ../version.c:780
msgid "type :help<Enter> or <F1> for on-line help"
msgstr "tajpu :help<Enenklavo> aลญ <F1> por aliri la helpon "
# DP: atentu al la spacetoj: ฤ‰iuj ฤ‰enoj devas havi la saman longon
-#: ../version.c:781
-msgid "type :help version7<Enter> for version info"
-msgstr "tajpu :help version7<Enenklavo> por informo de versio"
+msgid "type :help version8<Enter> for version info"
+msgstr "tajpu :help version8<Enenklavo> por informo de versio"
-#: ../version.c:784
msgid "Running in Vi compatible mode"
msgstr "Ruliฤas en reฤimo kongrua kun Vi"
# DP: atentu al la spacetoj: ฤ‰iuj ฤ‰enoj devas havi la saman longon
-#: ../version.c:785
msgid "type :set nocp<Enter> for Vim defaults"
msgstr "tajpu :set nocp<Enenklavo> por Vim defaลญltoj "
# DP: atentu al la spacetoj: ฤ‰iuj ฤ‰enoj devas havi la saman longon
-#: ../version.c:786
msgid "type :help cp-default<Enter> for info on this"
msgstr "tajpu :help cp-default<Enenklavo> por pliaj informoj "
-#: ../version.c:827
+# DP: atentu al la spacetoj: ฤ‰iuj ฤ‰enoj devas havi la saman longon
+msgid "menu Help->Orphans for information "
+msgstr "menuo Help->Orfinoj por pliaj informoj "
+
+msgid "Running modeless, typed text is inserted"
+msgstr "Ruliฤas senreฤime, tajpita teksto estas enmetita"
+
+# DP: atentu al la spacetoj: ฤ‰iuj ฤ‰enoj devas havi la saman longon
+msgid "menu Edit->Global Settings->Toggle Insert Mode "
+msgstr "menuo Redakti->Mallokaj Agordoj->Baskuligi Enmetan Reฤimon"
+
+# DP: atentu al la spacetoj: ฤ‰iuj ฤ‰enoj devas havi la saman longon
+msgid " for two modes "
+msgstr " por du reฤimoj "
+
+# DP: tiu ฤ‰eno pli longas (mi ne volas igi ฤ‰iujn aliajn ฤ‰enojn
+# pli longajn)
+msgid "menu Edit->Global Settings->Toggle Vi Compatible"
+msgstr "menuo Redakti->Mallokaj Agordoj->Baskuligi Reฤimon Kongruan kun Vi"
+
+# DP: atentu al la spacetoj: ฤ‰iuj ฤ‰enoj devas havi la saman longon
+msgid " for Vim defaults "
+msgstr " por defaลญltoj de Vim "
+
msgid "Sponsor Vim development!"
msgstr "Subtenu la programadon de Vim!"
-#: ../version.c:828
msgid "Become a registered Vim user!"
msgstr "Iฤu registrita uzanto de Vim!"
# DP: atentu al la spacetoj: ฤ‰iuj ฤ‰enoj devas havi la saman longon
-#: ../version.c:831
msgid "type :help sponsor<Enter> for information "
msgstr "tajpu :help sponsor<Enenklavo> por pliaj informoj "
# DP: atentu al la spacetoj: ฤ‰iuj ฤ‰enoj devas havi la saman longon
-#: ../version.c:832
msgid "type :help register<Enter> for information "
msgstr "tajpu :help register<Enenklavo> por pliaj informoj "
# DP: atentu al la spacetoj: ฤ‰iuj ฤ‰enoj devas havi la saman longon
-#: ../version.c:834
msgid "menu Help->Sponsor/Register for information "
msgstr "menuo Helpo->Subteni/Registri por pliaj informoj "
-#: ../window.c:119
msgid "Already only one window"
msgstr "Jam nur unu fenestro"
-#: ../window.c:224
msgid "E441: There is no preview window"
msgstr "E441: Ne estas antaลญvida fenestro"
-#: ../window.c:559
msgid "E442: Can't split topleft and botright at the same time"
msgstr "E442: Ne eblas dividi supralivan kaj subdekstran samtempe"
-#: ../window.c:1228
msgid "E443: Cannot rotate when another window is split"
msgstr "E443: Ne eblas rotacii kiam alia fenestro estas dividita"
-#: ../window.c:1803
msgid "E444: Cannot close last window"
msgstr "E444: Ne eblas fermi la lastan fenestron"
-#: ../window.c:1810
msgid "E813: Cannot close autocmd window"
msgstr "E813: Ne eblas fermi la fenestron de aลญtokomandoj"
-#: ../window.c:1814
msgid "E814: Cannot close window, only autocmd window would remain"
msgstr "E814: Ne eblas fermi fenestron, nur la fenestro de aลญtokomandoj restus"
-#: ../window.c:2717
msgid "E445: Other window contains changes"
msgstr "E445: La alia fenestro enhavas ลanฤojn"
-#: ../window.c:4805
msgid "E446: No file name under cursor"
msgstr "E446: Neniu dosiernomo sub la kursoro"
-#~ msgid "E831: bf_key_init() called with empty password"
-#~ msgstr "E831: bf_key_init() alvokita kun malplena pasvorto"
-
-#~ msgid "E820: sizeof(uint32_t) != 4"
-#~ msgstr "E820: sizeof(uint32_t) != 4"
-
-#~ msgid "E817: Blowfish big/little endian use wrong"
-#~ msgstr "E817: Misuzo de pezkomenca/pezfina en blowfish"
-
-#~ msgid "E818: sha256 test failed"
-#~ msgstr "E818: Testo de sha256 fiaskis"
-
-#~ msgid "E819: Blowfish test failed"
-#~ msgstr "E819: Testo de blowfish fiaskis"
-
-#~ msgid "Patch file"
-#~ msgstr "Flika dosiero"
-
-#~ msgid ""
-#~ "&OK\n"
-#~ "&Cancel"
-#~ msgstr ""
-#~ "&Bone\n"
-#~ "&Rezigni"
-
-#~ msgid "E240: No connection to Vim server"
-#~ msgstr "E240: Neniu konekto al Vim-servilo"
-
-#~ msgid "E241: Unable to send to %s"
-#~ msgstr "E241: Ne eblas sendi al %s"
-
-#~ msgid "E277: Unable to read a server reply"
-#~ msgstr "E277: Ne eblas legi respondon de servilo"
-
-#~ msgid "E258: Unable to send to client"
-#~ msgstr "E258: Ne eblas sendi al kliento"
-
-#~ msgid "Save As"
-#~ msgstr "Konservi kiel"
-
-#~ msgid "Edit File"
-#~ msgstr "Redakti dosieron"
-
-#~ msgid " (NOT FOUND)"
-#~ msgstr " (NETROVITA)"
-
-#~ msgid "Source Vim script"
-#~ msgstr "Ruli Vim-skripton"
-
-#~ msgid "unknown"
-#~ msgstr "nekonata"
-
-#~ msgid "Edit File in new window"
-#~ msgstr "Redakti Dosieron en nova fenestro"
-
-#~ msgid "Append File"
-#~ msgstr "Postaldoni dosieron"
-
-#~ msgid "Window position: X %d, Y %d"
-#~ msgstr "Pozicio de fenestro: X %d, Y %d"
-
-#~ msgid "Save Redirection"
-#~ msgstr "Konservi alidirekton"
-
-# DP: mi ne certas pri superflugo
-#~ msgid "Save View"
-#~ msgstr "Konservi superflugon"
-
-#~ msgid "Save Session"
-#~ msgstr "Konservi seancon"
-
-#~ msgid "Save Setup"
-#~ msgstr "Konservi agordaron"
-
-#~ msgid "E809: #< is not available without the +eval feature"
-#~ msgstr "E809: #< ne haveblas sen la eblo +eval"
-
-#~ msgid "E196: No digraphs in this version"
-#~ msgstr "E196: Neniu duliteraฤตo en tiu versio"
-
-#~ msgid "is a device (disabled with 'opendevice' option)"
-#~ msgstr "estas aparatdosiero (malลaltita per la opcio 'opendevice')"
-
-#~ msgid "Reading from stdin..."
-#~ msgstr "Legado el stdin..."
-
-#~ msgid "[crypted]"
-#~ msgstr "[ฤ‰ifrita]"
-
-#~ msgid "E821: File is encrypted with unknown method"
-#~ msgstr "E821: Dosiero estas ฤ‰ifrata per nekonata metodo"
-
-#~ msgid "Warning: Using a weak encryption method; see :help 'cm'"
-#~ msgstr "Averto: uzo de malfortika ฤ‰ifrada metodo; vidu :help 'cm'"
-
-#~ msgid "NetBeans disallows writes of unmodified buffers"
-#~ msgstr "NetBeans malpermesas skribojn de neลanฤitaj bufroj"
-
-#~ msgid "Partial writes disallowed for NetBeans buffers"
-#~ msgstr "Partaj skriboj malpermesitaj ฤ‰e bufroj NetBeans"
-
-#~ msgid "writing to device disabled with 'opendevice' option"
-#~ msgstr "skribo al aparatdosiero malลaltita per la opcio 'opendevice'"
-
-#~ msgid "E460: The resource fork would be lost (add ! to override)"
-#~ msgstr "E460: La rimeda forko estus perdita (aldonu ! por transpasi)"
-
-#~ msgid "E851: Failed to create a new process for the GUI"
-#~ msgstr "E851: Ne sukcesis krei novan procezon por la grafika interfaco"
-
-#~ msgid "E852: The child process failed to start the GUI"
-#~ msgstr "E852: La ida procezo ne sukcesis startigi la grafikan interfacon"
-
-#~ msgid "E229: Cannot start the GUI"
-#~ msgstr "E229: Ne eblas lanฤ‰i la grafikan interfacon"
-
-#~ msgid "E230: Cannot read from \"%s\""
-#~ msgstr "E230: Ne eblas legi el \"%s\""
-
-#~ msgid "E665: Cannot start GUI, no valid font found"
-#~ msgstr ""
-#~ "E665: Ne eblas startigi grafikan interfacon, neniu valida tiparo trovita"
-
-#~ msgid "E231: 'guifontwide' invalid"
-#~ msgstr "E231: 'guifontwide' nevalida"
-
-#~ msgid "E599: Value of 'imactivatekey' is invalid"
-#~ msgstr "E599: Valoro de 'imactivatekey' estas nevalida"
-
-#~ msgid "E254: Cannot allocate color %s"
-#~ msgstr "E254: Ne eblas disponigi koloron %s"
-
-#~ msgid "No match at cursor, finding next"
-#~ msgstr "Neniu kongruo ฤ‰e kursorpozicio, trovas sekvan"
-
-#~ msgid "<cannot open> "
-#~ msgstr "<ne eblas malfermi> "
-
-#~ msgid "E616: vim_SelFile: can't get font %s"
-#~ msgstr "E616: vim_SelFile: ne eblas akiri tiparon %s"
-
-#~ msgid "E614: vim_SelFile: can't return to current directory"
-#~ msgstr "E614: vim_SelFile: ne eblas reveni al la aktuala dosierujo"
-
-#~ msgid "Pathname:"
-#~ msgstr "Serฤ‰vojo:"
-
-#~ msgid "E615: vim_SelFile: can't get current directory"
-#~ msgstr "E615: vim_SelFile: ne eblas akiri aktualan dosierujon"
-
-#~ msgid "OK"
-#~ msgstr "Bone"
-
-#~ msgid "Cancel"
-#~ msgstr "Rezigni"
-
-#~ msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
-#~ msgstr ""
-#~ "Fenestraฤตo de rulumskalo: Ne eblis akiri geometrion de reduktita "
-#~ "rastrumbildo"
-
-#~ msgid "Vim dialog"
-#~ msgstr "Vim dialogo"
-
-#~ msgid "E232: Cannot create BalloonEval with both message and callback"
-#~ msgstr "E232: Ne eblas krei BalloonEval kun ambaลญ mesaฤo kaj reagfunkcio"
-
-# todo '_' is for hotkey, i guess?
-#~ msgid "Input _Methods"
-#~ msgstr "Enigaj _metodoj"
-
-#~ msgid "VIM - Search and Replace..."
-#~ msgstr "VIM - Serฤ‰i kaj anstataลญigi..."
-
-#~ msgid "VIM - Search..."
-#~ msgstr "VIM- Serฤ‰i..."
-
-#~ msgid "Find what:"
-#~ msgstr "Serฤ‰i kion:"
-
-#~ msgid "Replace with:"
-#~ msgstr "Anstataลญigi per:"
-
-#~ msgid "Match whole word only"
-#~ msgstr "Kongrui kun nur plena vorto"
-
-#~ msgid "Match case"
-#~ msgstr "Uskleca kongruo"
-
-#~ msgid "Direction"
-#~ msgstr "Direkto"
-
-#~ msgid "Up"
-#~ msgstr "Supren"
-
-#~ msgid "Down"
-#~ msgstr "Suben"
-
-#~ msgid "Find Next"
-#~ msgstr "Trovi sekvantan"
-
-#~ msgid "Replace"
-#~ msgstr "Anstataลญigi"
-
-#~ msgid "Replace All"
-#~ msgstr "Anstataลญigi ฤ‰iujn"
-
-#~ msgid "Vim: Received \"die\" request from session manager\n"
-#~ msgstr "Vim: Ricevis peton \"die\" (morti) el la seanca administrilo\n"
-
-#~ msgid "Close tab"
-#~ msgstr "Fermi langeton"
-
-#~ msgid "New tab"
-#~ msgstr "Nova langeto"
-
-#~ msgid "Open Tab..."
-#~ msgstr "Malfermi langeton..."
-
-#~ msgid "Vim: Main window unexpectedly destroyed\n"
-#~ msgstr "Vim: ฤˆefa fenestro neatendite detruiฤis\n"
-
-#~ msgid "&Filter"
-#~ msgstr "&Filtri"
-
-#~ msgid "&Cancel"
-#~ msgstr "&Rezigni"
-
-#~ msgid "Directories"
-#~ msgstr "Dosierujoj"
-
-#~ msgid "Filter"
-#~ msgstr "Filtri"
-
-#~ msgid "&Help"
-#~ msgstr "&Helpo"
-
-#~ msgid "Files"
-#~ msgstr "Dosieroj"
-
-#~ msgid "&OK"
-#~ msgstr "&Bone"
-
-#~ msgid "Selection"
-#~ msgstr "Apartigo"
-
-#~ msgid "Find &Next"
-#~ msgstr "Trovi &Sekvanta"
-
-#~ msgid "&Replace"
-#~ msgstr "&Anstataลญigi"
-
-#~ msgid "Replace &All"
-#~ msgstr "Anstataลญigi ฤ‰i&on"
-
-#~ msgid "&Undo"
-#~ msgstr "&Malfari"
-
-#~ msgid "E671: Cannot find window title \"%s\""
-#~ msgstr "E671: Ne eblas trovi titolon de fenestro \"%s\""
-
-#~ msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
-#~ msgstr "E243: Ne subtenata argumento: \"-%s\"; Uzu la version OLE."
-
-#~ msgid "E672: Unable to open window inside MDI application"
-#~ msgstr "E672: Ne eblas malfermi fenestron interne de aplikaฤตo MDI"
-
-#~ msgid "Open tab..."
-#~ msgstr "Malfermi langeton..."
-
-#~ msgid "Find string (use '\\\\' to find a '\\')"
-#~ msgstr "Trovi ฤ‰enon (uzu '\\\\' por trovi '\\')"
-
-#~ msgid "Find & Replace (use '\\\\' to find a '\\')"
-#~ msgstr "Trovi kaj anstataลญigi (uzu '\\\\' por trovi '\\')"
-
-#~ msgid "Not Used"
-#~ msgstr "Ne uzata"
-
-#~ msgid "Directory\t*.nothing\n"
-#~ msgstr "Dosierujo\t*.nenio\n"
-
-#~ msgid ""
-#~ "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
-#~ msgstr ""
-#~ "Vim E458: Ne eblas disponigi rikordon de kolormapo, iuj koloroj estas "
-#~ "eble neฤustaj"
-
-#~ msgid "E250: Fonts for the following charsets are missing in fontset %s:"
-#~ msgstr "E250: Tiparoj de tiuj signaroj mankas en aro de tiparo %s:"
-
-#~ msgid "E252: Fontset name: %s"
-#~ msgstr "E252: Nomo de tiparo: %s"
-
-#~ msgid "Font '%s' is not fixed-width"
-#~ msgstr "Tiparo '%s' ne estas egallarฤa"
-
-#~ msgid "E253: Fontset name: %s\n"
-#~ msgstr "E253: Nomo de tiparo: %s\n"
-
-#~ msgid "Font0: %s\n"
-#~ msgstr "Font0: %s\n"
-
-#~ msgid "Font1: %s\n"
-#~ msgstr "Font1: %s\n"
-
-#~ msgid "Font%<PRId64> width is not twice that of font0\n"
-#~ msgstr "Font%<PRId64> ne estas duoble pli larฤa ol font0\n"
-
-#~ msgid "Font0 width: %<PRId64>\n"
-#~ msgstr "Larฤo de font0: %<PRId64>\n"
-
-#~ msgid ""
-#~ "Font1 width: %<PRId64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "Larฤo de Font1: %<PRId64>\n"
-#~ "\n"
-
-#~ msgid "Invalid font specification"
-#~ msgstr "Nevalida tiparo specifita"
-
-#~ msgid "&Dismiss"
-#~ msgstr "&Forlasi"
-
-#~ msgid "no specific match"
-#~ msgstr "Neniu specifa kongruo"
-
-#~ msgid "Vim - Font Selector"
-#~ msgstr "Vim - Elektilo de tiparo"
-
-#~ msgid "Name:"
-#~ msgstr "Nomo:"
-
-#~ msgid "Show size in Points"
-#~ msgstr "Montri grandon en punktoj"
-
-#~ msgid "Encoding:"
-#~ msgstr "Kodoprezento:"
-
-#~ msgid "Font:"
-#~ msgstr "Tiparo:"
-
-#~ msgid "Style:"
-#~ msgstr "Stilo:"
-
-#~ msgid "Size:"
-#~ msgstr "Grando:"
-
-#~ msgid "E256: Hangul automata ERROR"
-#~ msgstr "E256: ERARO en aลญtomato de korea alfabeto"
-
-#~ msgid "E563: stat error"
-#~ msgstr "E563: Eraro de stat"
-
-#~ msgid "E625: cannot open cscope database: %s"
-#~ msgstr "E625: ne eblas malfermi datumbazon de cscope: %s"
-
-#~ msgid "E626: cannot get cscope database information"
-#~ msgstr "E626: ne eblas akiri informojn pri la datumbazo de cscope"
-
-#~ msgid "Lua library cannot be loaded."
-#~ msgstr "La biblioteko Lua no ลargeblis."
-
-#~ msgid "cannot save undo information"
-#~ msgstr "ne eblas konservi informojn de malfaro"
-
-#~ msgid ""
-#~ "E815: Sorry, this command is disabled, the MzScheme libraries could not "
-#~ "be loaded."
-#~ msgstr ""
-#~ "E815: Bedaลญrinde, tiu komando estas malลaltita, ne eblis ลargi la "
-#~ "bibliotekojn."
-
-#~ msgid "invalid expression"
-#~ msgstr "nevalida esprimo"
-
-#~ msgid "expressions disabled at compile time"
-#~ msgstr "esprimoj malลaltitaj dum kompilado"
-
-#~ msgid "hidden option"
-#~ msgstr "kaลita opcio"
-
-#~ msgid "unknown option"
-#~ msgstr "nekonata opcio"
-
-#~ msgid "window index is out of range"
-#~ msgstr "indekso de fenestro estas ekster limoj"
-
-#~ msgid "couldn't open buffer"
-#~ msgstr "ne eblis malfermi bufron"
-
-#~ msgid "cannot delete line"
-#~ msgstr "ne eblas forviลi linion"
-
-#~ msgid "cannot replace line"
-#~ msgstr "ne eblas anstataลญigi linion"
-
-#~ msgid "cannot insert line"
-#~ msgstr "ne eblas enmeti linion"
-
-#~ msgid "string cannot contain newlines"
-#~ msgstr "ฤ‰eno ne rajtas enhavi liniavancojn"
-
-#~ msgid "error converting Scheme values to Vim"
-#~ msgstr "eraro dum konverto de Scheme-valoro al Vim"
-
-#~ msgid "Vim error: ~a"
-#~ msgstr "Eraro de Vim: ~a"
-
-#~ msgid "Vim error"
-#~ msgstr "Eraro de Vim"
-
-#~ msgid "buffer is invalid"
-#~ msgstr "bufro estas nevalida"
-
-#~ msgid "window is invalid"
-#~ msgstr "fenestro estas nevalida"
-
-#~ msgid "linenr out of range"
-#~ msgstr "numero de linio ekster limoj"
-
-#~ msgid "not allowed in the Vim sandbox"
-#~ msgstr "nepermesebla en sabloludejo de Vim"
-
-#~ msgid "E836: This Vim cannot execute :python after using :py3"
-#~ msgstr "E836: Vim ne povas plenumi :python post uzo de :py3"
-
-#~ msgid "only string keys are allowed"
-#~ msgstr "nur ฤ‰enaj ลlosiloj estas permeseblaj"
-
-#~ msgid ""
-#~ "E263: Sorry, this command is disabled, the Python library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E263: Bedaลญrinde tiu komando estas malลaltita: la biblioteko de Pitono ne "
-#~ "ลargeblis."
-
-#~ msgid "E659: Cannot invoke Python recursively"
-#~ msgstr "E659: Ne eblas alvoki Pitonon rekursie"
-
-#~ msgid "E837: This Vim cannot execute :py3 after using :python"
-#~ msgstr "E837: Vim ne povas plenumi :py3 post uzo de :python"
-
-#~ msgid "index must be int or slice"
-#~ msgstr "indekso devas esti 'int' aลญ 'slice'"
-
-#~ msgid "E265: $_ must be an instance of String"
-#~ msgstr "E265: $_ devas esti apero de ฤˆeno"
-
-#~ msgid ""
-#~ "E266: Sorry, this command is disabled, the Ruby library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E266: Bedaลญrinde tiu komando estas malลaltita, la biblioteko Ruby ne "
-#~ "ลargeblis."
-
-#~ msgid "E267: unexpected return"
-#~ msgstr "E267: \"return\" neatendita"
-
-#~ msgid "E268: unexpected next"
-#~ msgstr "E268: \"next\" neatendita"
-
-#~ msgid "E269: unexpected break"
-#~ msgstr "E269: \"break\" neatendita"
-
-#~ msgid "E270: unexpected redo"
-#~ msgstr "E270: \"redo\" neatendita"
-
-#~ msgid "E271: retry outside of rescue clause"
-#~ msgstr "E271: \"retry\" ekster klaลญzo \"rescue\""
-
-#~ msgid "E272: unhandled exception"
-#~ msgstr "E272: netraktita escepto"
-
-#~ msgid "E273: unknown longjmp status %d"
-#~ msgstr "E273: nekonata stato de longjmp: %d"
-
-#~ msgid "Toggle implementation/definition"
-#~ msgstr "Baskuligi realigon/difinon"
-
-#~ msgid "Show base class of"
-#~ msgstr "Vidigi bazan klason de"
-
-#~ msgid "Show overridden member function"
-#~ msgstr "Montri anajn homonimigajn funkciojn"
-
-#~ msgid "Retrieve from file"
-#~ msgstr "Rekuperi el dosiero"
-
-#~ msgid "Retrieve from project"
-#~ msgstr "Rekuperi el projekto"
-
-#~ msgid "Retrieve from all projects"
-#~ msgstr "Rekuperi de ฤ‰iuj projektoj"
-
-#~ msgid "Retrieve"
-#~ msgstr "Rekuperi"
-
-#~ msgid "Show source of"
-#~ msgstr "Vidigi fonton de"
-
-#~ msgid "Find symbol"
-#~ msgstr "Trovi simbolon"
-
-#~ msgid "Browse class"
-#~ msgstr "Foliumi klasojn"
-
-#~ msgid "Show class in hierarchy"
-#~ msgstr "Montri klason en hierarkio"
-
-#~ msgid "Show class in restricted hierarchy"
-#~ msgstr "Montri klason en hierarkio restriktita"
-
-# todo
-#~ msgid "Xref refers to"
-#~ msgstr "Xref ligas al"
-
-#~ msgid "Xref referred by"
-#~ msgstr "Xref ligiฤas de"
-
-#~ msgid "Xref has a"
-#~ msgstr "Xref havas"
-
-#~ msgid "Xref used by"
-#~ msgstr "Xref uzita de"
-
-# DP: mi ne certas pri kio temas
-#~ msgid "Show docu of"
-#~ msgstr "Vidigi dokumentaron de"
-
-#~ msgid "Generate docu for"
-#~ msgstr "Krei dokumentaron de"
-
-#~ msgid ""
-#~ "Cannot connect to SNiFF+. Check environment (sniffemacs must be found in "
-#~ "$PATH).\n"
-#~ msgstr ""
-#~ "Konekto al SNiFF+ neeblas. Kontrolu medion (sniffemacs trovendas en "
-#~ "$PATH).\n"
-
-#~ msgid "E274: Sniff: Error during read. Disconnected"
-#~ msgstr "E274: Sniff: Eraro dum lego. Malkonektita"
-
-# DP: Tiuj 3 mesaฤoj estas kune
-#~ msgid "SNiFF+ is currently "
-#~ msgstr "SNiFF+ estas aktuale "
-
-#~ msgid "not "
-#~ msgstr "ne "
-
-#~ msgid "connected"
-#~ msgstr "konektita"
-
-#~ msgid "E275: Unknown SNiFF+ request: %s"
-#~ msgstr "E275: Nekonata peto de SNiFF+: %s"
-
-#~ msgid "E276: Error connecting to SNiFF+"
-#~ msgstr "E276: Eraro dum konekto al SNiFF+"
-
-#~ msgid "E278: SNiFF+ not connected"
-#~ msgstr "E278: SNiFF+ ne estas konektita"
-
-#~ msgid "E279: Not a SNiFF+ buffer"
-#~ msgstr "E279: Ne estas bufro SNiFF+"
-
-#~ msgid "Sniff: Error during write. Disconnected"
-#~ msgstr "Sniff: Eraro dum skribo. Malkonektita"
-
-#~ msgid "invalid buffer number"
-#~ msgstr "nevalida numero de bufro"
-
-#~ msgid "not implemented yet"
-#~ msgstr "ankoraลญ ne realigita"
-
-#~ msgid "cannot set line(s)"
-#~ msgstr "ne eblas meti la linio(j)n"
-
-#~ msgid "invalid mark name"
-#~ msgstr "nevalida nomo de marko"
-
-#~ msgid "mark not set"
-#~ msgstr "marko ne estas metita"
-
-#~ msgid "row %d column %d"
-#~ msgstr "linio %d kolumno %d"
-
-#~ msgid "cannot insert/append line"
-#~ msgstr "ne eblas enmeti/postaldoni linion"
-
-#~ msgid "line number out of range"
-#~ msgstr "numero de linio ekster limoj"
-
-#~ msgid "unknown flag: "
-#~ msgstr "nekonata flago: "
-
-# DP: ฤ‰u traduki vimOption
-#~ msgid "unknown vimOption"
-#~ msgstr "nekonata vimOption"
-
-#~ msgid "keyboard interrupt"
-#~ msgstr "klavara interrompo"
-
-#~ msgid "vim error"
-#~ msgstr "eraro de Vim"
-
-#~ msgid "cannot create buffer/window command: object is being deleted"
-#~ msgstr ""
-#~ "ne eblas krei komandon de bufro/fenestro: objekto estas forviลiฤanta"
-
-#~ msgid ""
-#~ "cannot register callback command: buffer/window is already being deleted"
-#~ msgstr ""
-#~ "ne eblas registri postalvokan komandon: bufro/fenestro estas jam "
-#~ "forviลiฤanta"
-
-#~ msgid ""
-#~ "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-"
-#~ "dev@vim.org"
-#~ msgstr ""
-#~ "E280: NERIPAREBLA TCL-ERARO: reflist difekta!? Bv. retpoลti al vim-"
-#~ "dev@vim.org"
-
-#~ msgid "cannot register callback command: buffer/window reference not found"
-#~ msgstr ""
-#~ "ne eblas registri postalvokan komandon: referenco de bufro/fenestro ne "
-#~ "troveblas"
-
-#~ msgid ""
-#~ "E571: Sorry, this command is disabled: the Tcl library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E571: Bedaลญrinde tiu komando estas malลaltita: la biblioteko Tcl ne "
-#~ "ลargeblis."
-
-#~ msgid "E572: exit code %d"
-#~ msgstr "E572: elira kodo %d"
-
-#~ msgid "cannot get line"
-#~ msgstr "ne eblas akiri linion"
-
-#~ msgid "Unable to register a command server name"
-#~ msgstr "Ne eblas registri nomon de komanda servilo"
-
-#~ msgid "E248: Failed to send command to the destination program"
-#~ msgstr "E248: Sendo de komando al cela programo fiaskis"
-
-#~ msgid "E573: Invalid server id used: %s"
-#~ msgstr "E573: Nevalida identigilo de servilo uzita: %s"
-
-#~ msgid "E251: VIM instance registry property is badly formed. Deleted!"
-#~ msgstr ""
-#~ "E251: Ecoj de registro de apero de VIM estas nevalide formata. Forviลita!"
-
-#~ msgid "netbeans is not supported with this GUI\n"
-#~ msgstr "netbeans ne estas subtenata kun tiu grafika interfaco\n"
-
-#~ msgid "This Vim was not compiled with the diff feature."
-#~ msgstr "Tiu Vim ne estis kompilita kun la kompara eblo."
-
-#~ msgid "'-nb' cannot be used: not enabled at compile time\n"
-#~ msgstr "'-nb' ne uzeblas: malลaltita dum kompilado\n"
-
-#~ msgid "Vim: Error: Failure to start gvim from NetBeans\n"
-#~ msgstr "Vim: Eraro: Fiaskis lanฤ‰i gvim el NetBeans\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Where case is ignored prepend / to make flag upper case"
-#~ msgstr ""
-#~ "\n"
-#~ "Kie uskleco estas ignorita antaลญaldonu / por igi flagon majuskla"
-
-#~ msgid "-register\t\tRegister this gvim for OLE"
-#~ msgstr "-register\t\tRegistri tiun gvim al OLE"
-
-#~ msgid "-unregister\t\tUnregister gvim for OLE"
-#~ msgstr "-unregister\t\tMalregistri gvim de OLE"
-
-#~ msgid "-g\t\t\tRun using GUI (like \"gvim\")"
-#~ msgstr "-g\t\t\tRuli per grafika interfaco (kiel \"gvim\")"
-
-#~ msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
-#~ msgstr "-f aลญ --nofork\tMalfono: ne forki kiam lanฤ‰as grafikan interfacon"
-
-#~ msgid "-f\t\t\tDon't use newcli to open window"
-#~ msgstr "-f\t\t\tNe uzi newcli por malfermi fenestrojn"
-
-#~ msgid "-dev <device>\t\tUse <device> for I/O"
-#~ msgstr "-dev <aparatdosiero>\t\tUzi <aparatdosiero>-n por eneligo"
-
-#~ msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
-#~ msgstr "-U <gvimrc>\t\tUzi <gvimrc> anstataลญ iun ajn .gvimrc"
-
-#~ msgid "-x\t\t\tEdit encrypted files"
-#~ msgstr "-x\t\t\tRedakti ฤ‰ifradan dosieron"
-
-#~ msgid "-display <display>\tConnect vim to this particular X-server"
-#~ msgstr "-display <ekrano>\tKonekti Vim al tiu X-servilo"
-
-#~ msgid "-X\t\t\tDo not connect to X server"
-#~ msgstr "-X\t\t\tNe konekti al X-servilo"
-
-#~ msgid "--remote <files>\tEdit <files> in a Vim server if possible"
-#~ msgstr "--remote <dosieroj>\tRedakti <dosieroj>-n en Vim-servilo se eblas"
-
-#~ msgid "--remote-silent <files> Same, don't complain if there is no server"
-#~ msgstr "--remote-silent <dosieroj> Same, sed ne plendi se ne estas servilo"
-
-#~ msgid ""
-#~ "--remote-wait <files> As --remote but wait for files to have been edited"
-#~ msgstr ""
-#~ "--remote-wait <dosieroj> Kiel --remote sed atendi ฤis dosieroj estas "
-#~ "redaktitaj"
-
-#~ msgid ""
-#~ "--remote-wait-silent <files> Same, don't complain if there is no server"
-#~ msgstr ""
-#~ "--remote-wait-silent <dosieroj> Same, sed ne plendi se ne estas servilo"
-
-#~ msgid ""
-#~ "--remote-tab[-wait][-silent] <files> As --remote but use tab page per "
-#~ "file"
-#~ msgstr ""
-#~ "--remote-tab[-wait][-silent] <dosieroj> Kiel --remote sed uzi langeton "
-#~ "por ฤ‰iu dosiero"
-
-#~ msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
-#~ msgstr "--remote-send <klavoj> Sendi <klavoj>-n al Vim-servilo kaj eliri"
-
-#~ msgid ""
-#~ "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
-#~ msgstr ""
-#~ "--remote-expr <espr>\tKomputi <espr> en Vim-servilo kaj afiลi rezulton"
-
-#~ msgid "--serverlist\t\tList available Vim server names and exit"
-#~ msgstr "--serverlist\t\tListigi haveblajn nomojn de Vim-serviloj kaj eliri"
-
-#~ msgid "--servername <name>\tSend to/become the Vim server <name>"
-#~ msgstr "--servername <nomo>\tSendu al/iฤi la Vim-servilo <nomo>"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Motif version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Argumentoj agnoskitaj de gvim (versio Motif):\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (neXtaw version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Argumentoj agnoskitaj de gvim (versio neXtaw):\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Athena version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Argumentoj agnoskitaj de gvim (versio Athena):\n"
-
-#~ msgid "-display <display>\tRun vim on <display>"
-#~ msgstr "-display <ekrano>\tLanฤ‰i vim sur <ekrano>"
-
-#~ msgid "-iconic\t\tStart vim iconified"
-#~ msgstr "-iconic\t\tLanฤ‰i vim piktograme"
-
-#~ msgid "-background <color>\tUse <color> for the background (also: -bg)"
-#~ msgstr ""
-#~ "-background <koloro>\tUzi <koloro>-n por la fona koloro (ankaลญ: -bg)"
-
-#~ msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
-#~ msgstr ""
-#~ "-foreground <koloro>\tUzi <koloro>-n por la malfona koloro (ankaลญ: -fg)"
-
-#~ msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
-#~ msgstr "-font <tiparo>\tUzi <tiparo>-n por normala teksto (ankaลญ: -fn)"
-
-#~ msgid "-boldfont <font>\tUse <font> for bold text"
-#~ msgstr "-boldfont <tiparo>\tUzi <tiparo>-n por grasa teksto"
-
-#~ msgid "-italicfont <font>\tUse <font> for italic text"
-#~ msgstr "-italicfont <tiparo>\tUzi <tiparo>-n por kursiva teksto"
-
-#~ msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
-#~ msgstr "-geometry <geom>\tUzi <geom> kiel komenca geometrio (ankaลญ: -geom)"
-
-#~ msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
-#~ msgstr ""
-#~ "-borderwidth <larฤo>\tUzi <larฤo>-n kiel larฤo de bordero (ankaลญ: -bw)"
-
-#~ msgid ""
-#~ "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
-#~ msgstr ""
-#~ "-scrollbarwidth <larฤo> Uzi <larฤo>-n kiel larฤo de rulumskalo (ankaลญ: -"
-#~ "sw)"
-
-#~ msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
-#~ msgstr ""
-#~ "-menuheight <alto>\tUzi <alto>-n kiel alto de menuzona alto (ankaลญ: -mh)"
-
-#~ msgid "-reverse\t\tUse reverse video (also: -rv)"
-#~ msgstr "-reverse\t\tUzi inversan videon (ankaลญ: -rv)"
-
-#~ msgid "+reverse\t\tDon't use reverse video (also: +rv)"
-#~ msgstr "+reverse\t\tNe uzi inversan videon (ankaลญ: +rv)"
-
-#~ msgid "-xrm <resource>\tSet the specified resource"
-#~ msgstr "-xrm <rimedo>\tAgordi la specifitan <rimedo>-n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (GTK+ version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Argumentoj agnoskitaj de gvim (versio GTK+):\n"
+#, c-format
+msgid "E447: Can't find file \"%s\" in path"
+msgstr "E447: Ne eblas trovi dosieron \"%s\" en serฤ‰vojo"
-#~ msgid "-display <display>\tRun vim on <display> (also: --display)"
-#~ msgstr "-display <ekrano>\tLanฤ‰i Vim sur tiu <ekrano> (ankaลญ: --display)"
+#, c-format
+msgid "E799: Invalid ID: %ld (must be greater than or equal to 1)"
+msgstr "E799: Nevalida ID: %ld (devas esti egala aลญ pli granda ol 1)"
-#~ msgid "--role <role>\tSet a unique role to identify the main window"
-#~ msgstr "--role <rolo>\tDoni unikan rolon por identigi la ฤ‰efan fenestron"
+#, c-format
+msgid "E801: ID already taken: %ld"
+msgstr "E801: ID jam uzata: %ld"
-#~ msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
-#~ msgstr "--socketid <xid>\tMalfermi Vim en alia GTK fenestraฤตo"
+msgid "List or number required"
+msgstr "Listo aลญ nombro bezonata"
-#~ msgid "--echo-wid\t\tMake gvim echo the Window ID on stdout"
-#~ msgstr "--echo-wid\t\tIgas gvim afiลi la identigilon de vindozo sur stdout"
+#, c-format
+msgid "E802: Invalid ID: %ld (must be greater than or equal to 1)"
+msgstr "E802: Nevalida ID: %ld (devas esti egala aลญ pli granda ol 1)"
-#~ msgid "-P <parent title>\tOpen Vim inside parent application"
-#~ msgstr "-P <gepatra titolo>\tMalfermi Vim en gepatra aplikaฤตo"
+#, c-format
+msgid "E803: ID not found: %ld"
+msgstr "E803: ID netrovita: %ld"
-#~ msgid "--windowid <HWND>\tOpen Vim inside another win32 widget"
-#~ msgstr "--windowid <HWND>\tMalfermi Vim en alia win32 fenestraฤตo"
+#, c-format
+msgid "E370: Could not load library %s"
+msgstr "E370: Ne eblis ลargi bibliotekon %s"
-#~ msgid "No display"
-#~ msgstr "Neniu ekrano"
+msgid "Sorry, this command is disabled: the Perl library could not be loaded."
+msgstr ""
+"Bedaลญrinde tiu komando estas malลaltita: la biblioteko de Perl ne ลargeblis."
-#~ msgid ": Send failed.\n"
-#~ msgstr ": Sendo fiaskis.\n"
+msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
+msgstr ""
+"E299: Plenumo de Perl esprimoj malpermesata en sabloludejo sen la modulo Safe"
-#~ msgid ": Send failed. Trying to execute locally\n"
-#~ msgstr ": Sendo fiaskis. Provo de loka plenumo\n"
+msgid "Edit with &multiple Vims"
+msgstr "Redakti per &pluraj Vim-oj"
-#~ msgid "%d of %d edited"
-#~ msgstr "%d de %d redaktita(j)"
+msgid "Edit with single &Vim"
+msgstr "Redakti per unuopa &Vim"
-#~ msgid "No display: Send expression failed.\n"
-#~ msgstr "Neniu ekrano: Sendado de esprimo fiaskis.\n"
+msgid "Diff with Vim"
+msgstr "Kompari per Vim"
-#~ msgid ": Send expression failed.\n"
-#~ msgstr ": Sendado de esprimo fiaskis.\n"
+msgid "Edit with &Vim"
+msgstr "Redakti per &Vim"
-#~ msgid "E543: Not a valid codepage"
-#~ msgstr "E543: Nevalida kodpaฤo"
+msgid "Edit with existing Vim - "
+msgstr "Redakti per ekzistanta Vim - "
-#~ msgid "E284: Cannot set IC values"
-#~ msgstr "E284: Ne eblas agordi valorojn de IC"
+msgid "Edits the selected file(s) with Vim"
+msgstr "Redakti la apartigita(j)n dosiero(j)n per Vim"
-#~ msgid "E285: Failed to create input context"
-#~ msgstr "E285: Ne eblis krei enigan kuntekston"
+msgid "Error creating process: Check if gvim is in your path!"
+msgstr "Eraro dum kreo de procezo: Kontrolu ฤ‰u gvim estas en via serฤ‰vojo!"
-#~ msgid "E286: Failed to open input method"
-#~ msgstr "E286: Ne eblis malfermi enigan metodon"
+msgid "gvimext.dll error"
+msgstr "Eraro de gvimext.dll"
-#~ msgid "E287: Warning: Could not set destroy callback to IM"
-#~ msgstr "E287: Averto: Ne eblis agordi detruan reagfunkcion al IM"
+msgid "Path length too long!"
+msgstr "Serฤ‰vojo estas tro longa!"
-#~ msgid "E288: input method doesn't support any style"
-#~ msgstr "E288: eniga metodo subtenas neniun stilon"
+msgid "--No lines in buffer--"
+msgstr "--Neniu linio en bufro--"
-# DP: mi ne scias, kio estas "preedit"
-#~ msgid "E289: input method doesn't support my preedit type"
-#~ msgstr "E289: eniga metodo ne subtenas mian antaลญredaktan tipon"
-
-#~ msgid "E843: Error while updating swap file crypt"
-#~ msgstr "E843: Eraro dum ฤisdatigo de ฤ‰ifrada permutodosiero .swp"
-
-#~ msgid ""
-#~ "E833: %s is encrypted and this version of Vim does not support encryption"
-#~ msgstr "E833: %s estas ฤ‰ifrata kaj tiu versio de Vim ne subtenas ฤ‰ifradon"
-
-#~ msgid "Swap file is encrypted: \"%s\""
-#~ msgstr "Perumutodosiero .swp estas ฤ‰ifrata: \"%s\""
-
-#~ msgid ""
-#~ "\n"
-#~ "If you entered a new crypt key but did not write the text file,"
-#~ msgstr ""
-#~ "\n"
-#~ "Se vi tajpis novan ลlosilon de ฤ‰ifrado sed ne skribis la tekstan dosieron,"
-
-#~ msgid ""
-#~ "\n"
-#~ "enter the new crypt key."
-#~ msgstr ""
-#~ "\n"
-#~ "tajpu la novan ลlosilon de ฤ‰ifrado."
+msgid "E470: Command aborted"
+msgstr "E470: komando ฤ‰esigita"
-#~ msgid ""
-#~ "\n"
-#~ "If you wrote the text file after changing the crypt key press enter"
-#~ msgstr ""
-#~ "\n"
-#~ "Se vi skribis la tekstan dosieron post ลanฤo de la ลlosilo de ฤ‰ifrado, "
-#~ "premu enenklavon"
+msgid "E471: Argument required"
+msgstr "E471: Argumento bezonata"
-#~ msgid ""
-#~ "\n"
-#~ "to use the same key for text file and swap file"
-#~ msgstr ""
-#~ "\n"
-#~ "por uzi la saman ลlosilon por la teksta dosiero kaj permuto dosiero .swp"
+msgid "E10: \\ should be followed by /, ? or &"
+msgstr "E10: \\ devus esti sekvita de /, ? aลญ &"
-#~ msgid "Using crypt key from swap file for the text file.\n"
-#~ msgstr ""
-#~ "Uzas ลlosilon de ฤ‰ifrado el permuto dosiero .swp por la teksta dosiero.\n"
+msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
+msgstr ""
+"E11: Nevalida en fenestro de komanda linio; <CR> plenumas, CTRL-C eliras"
-#~ msgid ""
-#~ "\n"
-#~ " [not usable with this version of Vim]"
-#~ msgstr ""
-#~ "\n"
-#~ " [ne uzebla per tiu versio de Vim]"
+msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
+msgstr ""
+"E12: Nepermesebla komando el exrc/vimrc en aktuala dosierujo aลญ etikeda serฤ‰o"
-#~ msgid "Tear off this menu"
-#~ msgstr "Disigi tiun menuon"
+msgid "E171: Missing :endif"
+msgstr "E171: Mankas \":endif\""
-#~ msgid "Select Directory dialog"
-#~ msgstr "Dialogujo de dosiera elekto"
+msgid "E600: Missing :endtry"
+msgstr "E600: Mankas \":endtry\""
-#~ msgid "Save File dialog"
-#~ msgstr "Dialogujo de dosiera konservo"
+msgid "E170: Missing :endwhile"
+msgstr "E170: Mankas \":endwhile\""
-#~ msgid "Open File dialog"
-#~ msgstr "Dialogujo de dosiera malfermo"
+msgid "E170: Missing :endfor"
+msgstr "E170: Mankas \":endfor\""
-#~ msgid "E338: Sorry, no file browser in console mode"
-#~ msgstr "E338: Bedaลญrinde ne estas dosierfoliumilo en konzola reฤimo"
+msgid "E588: :endwhile without :while"
+msgstr "E588: \":endwhile\" sen \":while\""
-#~ msgid "Vim: preserving files...\n"
-#~ msgstr "Vim: konservo de dosieroj...\n"
+msgid "E588: :endfor without :for"
+msgstr "E588: \":endfor\" sen \":for\""
-#~ msgid "Vim: Finished.\n"
-#~ msgstr "Vim: Finita.\n"
+msgid "E13: File exists (add ! to override)"
+msgstr "E13: Dosiero ekzistas (aldonu ! por transpasi)"
-#~ msgid "ERROR: "
-#~ msgstr "ERARO: "
+msgid "E472: Command failed"
+msgstr "E472: La komando malsukcesis"
-#~ msgid ""
-#~ "\n"
-#~ "[bytes] total alloc-freed %<PRIu64>-%<PRIu64>, in use %<PRIu64>, peak use "
-#~ "%<PRIu64>\n"
-#~ msgstr ""
-#~ "\n"
-#~ "[bajtoj] totalaj disponigitaj/maldisponigitaj %<PRIu64>-%<PRIu64>, nun "
-#~ "uzataj %<PRIu64>, kulmina uzo %<PRIu64>\n"
+#, c-format
+msgid "E234: Unknown fontset: %s"
+msgstr "E234: Nekonata familio de tiparo: %s"
-#~ msgid ""
-#~ "[calls] total re/malloc()'s %<PRIu64>, total free()'s %<PRIu64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "[alvokoj] totalaj re/malloc() %<PRIu64>, totalaj free() %<PRIu64>\n"
-#~ "\n"
+#, c-format
+msgid "E235: Unknown font: %s"
+msgstr "E235: Nekonata tiparo: %s"
-#~ msgid "E340: Line is becoming too long"
-#~ msgstr "E340: Linio iฤas tro longa"
+#, c-format
+msgid "E236: Font \"%s\" is not fixed-width"
+msgstr "E236: La tiparo \"%s\" ne estas egallarฤa"
-#~ msgid "E341: Internal error: lalloc(%<PRId64>, )"
-#~ msgstr "E341: Interna eraro: lalloc(%<PRId64>, )"
+msgid "E473: Internal error"
+msgstr "E473: Interna eraro"
-#~ msgid "E547: Illegal mouseshape"
-#~ msgstr "E547: Nevalida formo de muskursoro"
+#, c-format
+msgid "E685: Internal error: %s"
+msgstr "E685: Interna eraro: %s"
-#~ msgid "Enter encryption key: "
-#~ msgstr "Tajpu la ลlosilon de ฤ‰ifrado: "
+msgid "Interrupted"
+msgstr "Interrompita"
-#~ msgid "Enter same key again: "
-#~ msgstr "Tajpu la ลlosilon denove: "
+msgid "E14: Invalid address"
+msgstr "E14: Nevalida adreso"
-#~ msgid "Keys don't match!"
-#~ msgstr "ลœlosiloj ne kongruas!"
+msgid "E474: Invalid argument"
+msgstr "E474: Nevalida argumento"
-#~ msgid "Cannot connect to Netbeans #2"
-#~ msgstr "Ne eblas konekti al Netbeans n-ro 2"
+#, c-format
+msgid "E475: Invalid argument: %s"
+msgstr "E475: Nevalida argumento: %s"
-#~ msgid "Cannot connect to Netbeans"
-#~ msgstr "Ne eblas konekti al Netbeans"
+#, c-format
+msgid "E15: Invalid expression: %s"
+msgstr "E15: Nevalida esprimo: %s"
-#~ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
-#~ msgstr ""
-#~ "E668: Nevalida permeso de dosiero de informo de konekto NetBeans: \"%s\""
+msgid "E16: Invalid range"
+msgstr "E16: Nevalida amplekso"
-#~ msgid "read from Netbeans socket"
-#~ msgstr "lego el kontaktoskatolo de Netbeans"
+msgid "E476: Invalid command"
+msgstr "E476: Nevalida komando"
-#~ msgid "E658: NetBeans connection lost for buffer %<PRId64>"
-#~ msgstr "E658: Konekto de NetBeans perdita por bufro %<PRId64>"
+#, c-format
+msgid "E17: \"%s\" is a directory"
+msgstr "E17: \"%s\" estas dosierujo"
-#~ msgid "E838: netbeans is not supported with this GUI"
-#~ msgstr "E838: netbeans ne estas subtenata kun tiu grafika interfaco"
+#, c-format
+msgid "E364: Library call failed for \"%s()\""
+msgstr "E364: Alvoko al biblioteko malsukcesis por \"%s()\""
-#~ msgid "E511: netbeans already connected"
-#~ msgstr "E511: nebeans jam konektata"
+#, c-format
+msgid "E448: Could not load library function %s"
+msgstr "E448: Ne eblis ลargi bibliotekan funkcion %s"
-#~ msgid "E505: %s is read-only (add ! to override)"
-#~ msgstr "E505: %s estas nurlegebla (aldonu ! por transpasi)"
+msgid "E19: Mark has invalid line number"
+msgstr "E19: Marko havas nevalidan numeron de linio"
-# DP: ฤ‰u Eval devas esti tradukita?
-#~ msgid "E775: Eval feature not available"
-#~ msgstr "E775: Eval eblo ne disponeblas"
+msgid "E20: Mark not set"
+msgstr "E20: Marko ne estas agordita"
-#~ msgid "freeing %<PRId64> lines"
-#~ msgstr "malokupas %<PRId64> liniojn"
+msgid "E21: Cannot make changes, 'modifiable' is off"
+msgstr "E21: Ne eblas fari ลanฤojn, 'modifiable' estas malลaltita"
-#~ msgid "E530: Cannot change term in GUI"
-#~ msgstr "E530: term ne ลanฤeblas en grafika interfaco"
+msgid "E22: Scripts nested too deep"
+msgstr "E22: Tro profunde ingitaj skriptoj"
-#~ msgid "E531: Use \":gui\" to start the GUI"
-#~ msgstr "E531: Uzu \":gui\" por lanฤ‰i la grafikan interfacon"
+msgid "E23: No alternate file"
+msgstr "E23: Neniu alterna dosiero"
-#~ msgid "E617: Cannot be changed in the GTK+ 2 GUI"
-#~ msgstr "E617: Ne ลanฤeblas en la grafika interfaco GTK+ 2"
+msgid "E24: No such abbreviation"
+msgstr "E24: Ne estas tia mallongigo"
-#~ msgid "E596: Invalid font(s)"
-#~ msgstr "E596: Nevalida(j) tiparo(j)"
+msgid "E477: No ! allowed"
+msgstr "E477: Neniu ! permesebla"
-#~ msgid "E597: can't select fontset"
-#~ msgstr "E597: ne eblas elekti tiparon"
+msgid "E25: GUI cannot be used: Not enabled at compile time"
+msgstr "E25: Grafika interfaco ne uzeblas: Malลaltita dum kompilado"
-#~ msgid "E598: Invalid fontset"
-#~ msgstr "E598: Nevalida tiparo"
+msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
+msgstr "E26: La hebrea ne uzeblas: Malลaltita dum kompilado\n"
-#~ msgid "E533: can't select wide font"
-#~ msgstr "E533: ne eblas elekti larฤan tiparon"
+msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
+msgstr "E27: La persa ne uzeblas: Malลaltita dum kompilado\n"
-#~ msgid "E534: Invalid wide font"
-#~ msgstr "E534: Nevalida larฤa tiparo"
+msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
+msgstr "E800: La araba ne uzeblas: Malลaltita dum kompilado\n"
-#~ msgid "E538: No mouse support"
-#~ msgstr "E538: Neniu muso subtenata"
+#, c-format
+msgid "E28: No such highlight group name: %s"
+msgstr "E28: Neniu grupo de emfazo kiel: %s"
-#~ msgid "cannot open "
-#~ msgstr "ne eblas malfermi "
+msgid "E29: No inserted text yet"
+msgstr "E29: Ankoraลญ neniu enmetita teksto"
-#~ msgid "VIM: Can't open window!\n"
-#~ msgstr "VIM: Ne eblas malfermi fenestron!\n"
+msgid "E30: No previous command line"
+msgstr "E30: Neniu antaลญa komanda linio"
-#~ msgid "Need Amigados version 2.04 or later\n"
-#~ msgstr "Bezonas version 2.04 de Amigados aลญ pli novan\n"
+msgid "E31: No such mapping"
+msgstr "E31: Neniu tiel mapo"
-#~ msgid "Need %s version %<PRId64>\n"
-#~ msgstr "Bezonas %s-on versio %<PRId64>\n"
+msgid "E479: No match"
+msgstr "E479: Neniu kongruo"
-#~ msgid "Cannot open NIL:\n"
-#~ msgstr "Ne eblas malfermi NIL:\n"
+#, c-format
+msgid "E480: No match: %s"
+msgstr "E480: Neniu kongruo: %s"
-#~ msgid "Cannot create "
-#~ msgstr "Ne eblas krei "
+msgid "E32: No file name"
+msgstr "E32: Neniu dosiernomo"
-#~ msgid "Vim exiting with %d\n"
-#~ msgstr "Vim eliras kun %d\n"
+msgid "E33: No previous substitute regular expression"
+msgstr "E33: Neniu antaลญa regulesprimo de anstataลญigo"
-#~ msgid "cannot change console mode ?!\n"
-#~ msgstr "ne eblas ลanฤi reฤimon de konzolo?!\n"
+msgid "E34: No previous command"
+msgstr "E34: Neniu antaลญa komando"
-#~ msgid "mch_get_shellsize: not a console??\n"
-#~ msgstr "mch_get_shellsize: ne estas konzolo??\n"
+msgid "E35: No previous regular expression"
+msgstr "E35: Neniu antaลญa regulesprimo"
-#~ msgid "E360: Cannot execute shell with -f option"
-#~ msgstr "E360: Ne eblas plenumi ลelon kun opcio -f"
+msgid "E481: No range allowed"
+msgstr "E481: Amplekso nepermesebla"
-#~ msgid "Cannot execute "
-#~ msgstr "Ne eblas plenumi "
+msgid "E36: Not enough room"
+msgstr "E36: Ne sufiฤ‰e da spaco"
-#~ msgid "shell "
-#~ msgstr "ลelo "
+#, c-format
+msgid "E247: no registered server named \"%s\""
+msgstr "E247: neniu registrita servilo nomita \"%s\""
-#~ msgid " returned\n"
-#~ msgstr " liveris\n"
+#, c-format
+msgid "E482: Can't create file %s"
+msgstr "E482: Ne eblas krei dosieron %s"
-#~ msgid "ANCHOR_BUF_SIZE too small."
-#~ msgstr "ANCHOR_BUF_SIZE tro malgranda."
+msgid "E483: Can't get temp file name"
+msgstr "E483: Ne eblas akiri provizoran dosiernomon"
-#~ msgid "I/O ERROR"
-#~ msgstr "ERARO DE ENIGO/ELIGO"
+#, c-format
+msgid "E484: Can't open file %s"
+msgstr "E484: Ne eblas malfermi dosieron %s"
-#~ msgid "Message"
-#~ msgstr "Mesaฤo"
+#, c-format
+msgid "E485: Can't read file %s"
+msgstr "E485: Ne eblas legi dosieron %s"
-#~ msgid "'columns' is not 80, cannot execute external commands"
-#~ msgstr "'columns' ne estas 80, ne eblas plenumi eksternajn komandojn"
+msgid "E38: Null argument"
+msgstr "E38: Nula argumento"
-#~ msgid "E237: Printer selection failed"
-#~ msgstr "E237: Elekto de presilo fiaskis"
+msgid "E39: Number expected"
+msgstr "E39: Nombro atendita"
-#~ msgid "to %s on %s"
-#~ msgstr "al %s de %s"
+#, c-format
+msgid "E40: Can't open errorfile %s"
+msgstr "E40: Ne eblas malfermi eraran dosieron %s"
-#~ msgid "E613: Unknown printer font: %s"
-#~ msgstr "E613: Nekonata tiparo de presilo: %s"
+msgid "E233: cannot open display"
+msgstr "E233: ne eblas malfermi vidigon"
-#~ msgid "E238: Print error: %s"
-#~ msgstr "E238: Eraro de presado: %s"
+msgid "E41: Out of memory!"
+msgstr "E41: Ne plu restas memoro!"
-#~ msgid "Printing '%s'"
-#~ msgstr "Presas '%s'"
+msgid "Pattern not found"
+msgstr "ลœablono ne trovita"
-#~ msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
-#~ msgstr "E244: Nevalida nomo de signaro \"%s\" en nomo de tiparo \"%s\""
+#, c-format
+msgid "E486: Pattern not found: %s"
+msgstr "E486: ลœablono ne trovita: %s"
-#~ msgid "E245: Illegal char '%c' in font name \"%s\""
-#~ msgstr "E245: Nevalida signo '%c' en nomo de tiparo \"%s\""
+msgid "E487: Argument must be positive"
+msgstr "E487: La argumento devas esti pozitiva"
-#~ msgid "Vim: Double signal, exiting\n"
-#~ msgstr "Vim: Duobla signalo, eliranta\n"
+msgid "E459: Cannot go back to previous directory"
+msgstr "E459: Ne eblas reiri al antaลญa dosierujo"
-#~ msgid "Vim: Caught deadly signal %s\n"
-#~ msgstr "Vim: Kaptis mortigantan signalon %s\n"
+msgid "E42: No Errors"
+msgstr "E42: Neniu eraro"
-#~ msgid "Vim: Caught deadly signal\n"
-#~ msgstr "Vim: Kaptis mortigantan signalon\n"
+msgid "E776: No location list"
+msgstr "E776: Neniu listo de lokoj"
-#~ msgid "Opening the X display took %<PRId64> msec"
-#~ msgstr "Malfermo de vidigo X daลญris %<PRId64> msek"
+msgid "E43: Damaged match string"
+msgstr "E43: Difekta kongruenda ฤ‰eno"
-#~ msgid ""
-#~ "\n"
-#~ "Vim: Got X error\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Vim: Alvenis X eraro\n"
+msgid "E44: Corrupted regexp program"
+msgstr "E44: Difekta programo de regulesprimo"
-#~ msgid "Testing the X display failed"
-#~ msgstr "Testo de la vidigo X fiaskis"
+msgid "E45: 'readonly' option is set (add ! to override)"
+msgstr "E45: La opcio 'readonly' estas ลaltita '(aldonu ! por transpasi)"
-#~ msgid "Opening the X display timed out"
-#~ msgstr "Tempolimo okazis dum malfermo de vidigo X"
+#, c-format
+msgid "E46: Cannot change read-only variable \"%s\""
+msgstr "E46: Ne eblas ลanฤi nurlegeblan variablon \"%s\""
-#~ msgid ""
-#~ "\n"
-#~ "Cannot execute shell sh\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Ne eblas plenumi ลelon sh\n"
+#, c-format
+msgid "E794: Cannot set variable in the sandbox: \"%s\""
+msgstr "E794: Ne eblas agordi variablon en la sabloludejo: \"%s\""
-#~ msgid ""
-#~ "\n"
-#~ "Cannot create pipes\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Ne eblas krei duktojn\n"
+msgid "E713: Cannot use empty key for Dictionary"
+msgstr "E713: Ne eblas uzi malplenan ลlosilon de Vortaro"
-#~ msgid ""
-#~ "\n"
-#~ "Cannot fork\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Ne eblas forki\n"
+msgid "E715: Dictionary required"
+msgstr "E715: Vortaro bezonata"
-#~ msgid ""
-#~ "\n"
-#~ "Command terminated\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Komando terminigita\n"
+#, c-format
+msgid "E684: list index out of range: %ld"
+msgstr "E684: indekso de listo ekster limoj: %ld"
-#~ msgid "XSMP lost ICE connection"
-#~ msgstr "XSMP perdis la konekton ICE"
+#, c-format
+msgid "E118: Too many arguments for function: %s"
+msgstr "E118: Tro da argumentoj por funkcio: %s"
-#~ msgid "Opening the X display failed"
-#~ msgstr "Malfermo de vidigo X fiaskis"
+#, c-format
+msgid "E716: Key not present in Dictionary: %s"
+msgstr "E716: ลœlosilo malekzistas en Vortaro: %s"
-#~ msgid "XSMP handling save-yourself request"
-#~ msgstr "XSMP: traktado de peto konservi-mem"
+msgid "E714: List required"
+msgstr "E714: Listo bezonata"
-#~ msgid "XSMP opening connection"
-#~ msgstr "XSMP: malfermo de konekto"
+#, c-format
+msgid "E712: Argument of %s must be a List or Dictionary"
+msgstr "E712: Argumento de %s devas esti Listo aลญ Vortaro"
-#~ msgid "XSMP ICE connection watch failed"
-#~ msgstr "XSMP: kontrolo de konekto ICE fiaskis"
+msgid "E47: Error while reading errorfile"
+msgstr "E47: Eraro dum legado de erardosiero"
-#~ msgid "XSMP SmcOpenConnection failed: %s"
-#~ msgstr "XSMP: SmcOpenConnection fiaskis: %s"
+msgid "E48: Not allowed in sandbox"
+msgstr "E48: Nepermesebla en sabloludejo"
-#~ msgid "At line"
-#~ msgstr "ฤˆe linio"
+msgid "E523: Not allowed here"
+msgstr "E523: Nepermesebla tie"
-#~ msgid "Could not load vim32.dll!"
-#~ msgstr "Ne eblis ลargi vim32.dll!"
+msgid "E359: Screen mode setting not supported"
+msgstr "E359: Reฤimo de ekrano ne subtenata"
-#~ msgid "VIM Error"
-#~ msgstr "Eraro de VIM"
+msgid "E49: Invalid scroll size"
+msgstr "E49: Nevalida grando de rulumo"
-#~ msgid "Could not fix up function pointers to the DLL!"
-#~ msgstr "Ne eblis ripari referencojn de funkcioj al la DLL!"
+msgid "E91: 'shell' option is empty"
+msgstr "E91: La opcio 'shell' estas malplena"
-#~ msgid "shell returned %d"
-#~ msgstr "la ลelo liveris %d"
+msgid "E255: Couldn't read in sign data!"
+msgstr "E255: Ne eblis legi datumojn de simboloj!"
-# DP: la eventoj estas tiuj, kiuj estas en la sekvantaj ฤ‰enoj
-#~ msgid "Vim: Caught %s event\n"
-#~ msgstr "Vim: Kaptis eventon %s\n"
+msgid "E72: Close error on swap file"
+msgstr "E72: Eraro dum malfermo de permutodosiero .swp"
-#~ msgid "close"
-#~ msgstr "fermo"
+msgid "E73: tag stack empty"
+msgstr "E73: malplena stako de etikedo"
-#~ msgid "logoff"
-#~ msgstr "elsaluto"
+msgid "E74: Command too complex"
+msgstr "E74: Komando tro kompleksa"
-#~ msgid "shutdown"
-#~ msgstr "sistemfermo"
+msgid "E75: Name too long"
+msgstr "E75: Nomo tro longa"
-#~ msgid "E371: Command not found"
-#~ msgstr "E371: Netrovebla komando"
+msgid "E76: Too many ["
+msgstr "E76: Tro da ["
-#~ msgid ""
-#~ "VIMRUN.EXE not found in your $PATH.\n"
-#~ "External commands will not pause after completion.\n"
-#~ "See :help win32-vimrun for more information."
-#~ msgstr ""
-#~ "VIMRUN.EXE ne troveblas en via $PATH.\n"
-#~ "Eksteraj komandoj ne paลญzos post kompletigo.\n"
-#~ "Vidu :help win32-vimrun por pliaj informoj."
-
-#~ msgid "Vim Warning"
-#~ msgstr "Averto de Vim"
-
-#~ msgid "Error file"
-#~ msgstr "Erara Dosiero"
-
-#~ msgid "E868: Error building NFA with equivalence class!"
-#~ msgstr "E868: Eraro dum prekomputado de NFA kun ekvivalentoklaso!"
-
-#~ msgid "E999: (NFA regexp internal error) Should not process NOT node !"
-#~ msgstr ""
-#~ "E999: (interna eraro de NFA-regulesprimo) Ne devus procezi nodon 'NOT'!"
-
-#~ msgid "E878: (NFA) Could not allocate memory for branch traversal!"
-#~ msgstr "E878: (NFA) Ne povis asigni memoron por traigi branฤ‰ojn!"
-
-#~ msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\""
-#~ msgstr "Averto: Ne eblas trovi vortliston \"%s_%s.spl\" aลญ \"%s_ascii.spl\""
-
-#~ msgid "Conversion in %s not supported"
-#~ msgstr "Konverto en %s nesubtenata"
-
-#~ msgid "E845: Insufficient memory, word list will be incomplete"
-#~ msgstr "E845: Ne sufiฤ‰e da memoro, vortlisto estos nekompleta."
-
-#~ msgid "E430: Tag file path truncated for %s\n"
-#~ msgstr "E430: Vojo de etikeda dosiero trunkita por %s\n"
-
-#~ msgid "new shell started\n"
-#~ msgstr "nova ลelo lanฤ‰ita\n"
-
-#~ msgid "Used CUT_BUFFER0 instead of empty selection"
-#~ msgstr "Uzis CUT_BUFFER0 anstataลญ malplenan apartigon"
-
-#~ msgid "No undo possible; continue anyway"
-#~ msgstr "Malfaro neebla; daลญrigi tamene"
-
-#~ msgid "E832: Non-encrypted file has encrypted undo file: %s"
-#~ msgstr "E832: Ne ฤ‰ifrata dosiero havas ฤ‰ifratan malfaran dosieron: %s"
-
-#~ msgid "E826: Undo file decryption failed: %s"
-#~ msgstr "E826: Malฤ‰ifrado de malfara dosiero fiaskis: %s"
-
-#~ msgid "E827: Undo file is encrypted: %s"
-#~ msgstr "E827: Malfara dosiero estas ฤ‰ifrata: %s"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16/32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "Grafika versio MS-Vindozo 16/32-bitoj"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "Grafika versio MS-Vindozo 64-bitoj"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "Grafika versio MS-Vindozo 32-bitoj"
-
-#~ msgid " in Win32s mode"
-#~ msgstr " en reฤimo Win32s"
-
-#~ msgid " with OLE support"
-#~ msgstr " kun subteno de OLE"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "Versio konzola MS-Vindozo 64-bitoj"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "Versio konzola MS-Vindozo 32-bitoj"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16-bit version"
-#~ msgstr ""
-#~ "\n"
-#~ "Versio MS-Vindozo 16-bitoj"
-
-#~ msgid ""
-#~ "\n"
-#~ "32-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "Versio MS-DOS 32-bitoj"
-
-#~ msgid ""
-#~ "\n"
-#~ "16-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "Versio MS-DOS 16-bitoj"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X (unix) version"
-#~ msgstr ""
-#~ "\n"
-#~ "Versio Mak OS X (unikso)"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X version"
-#~ msgstr ""
-#~ "\n"
-#~ "Versio Mak OS X"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "Versio Mak OS"
-
-#~ msgid ""
-#~ "\n"
-#~ "OpenVMS version"
-#~ msgstr ""
-#~ "\n"
-#~ "Versio OpenVMS"
-
-#~ msgid ""
-#~ "\n"
-#~ "Big version "
-#~ msgstr ""
-#~ "\n"
-#~ "Granda versio "
-
-#~ msgid ""
-#~ "\n"
-#~ "Normal version "
-#~ msgstr ""
-#~ "\n"
-#~ "Normala versio "
-
-#~ msgid ""
-#~ "\n"
-#~ "Small version "
-#~ msgstr ""
-#~ "\n"
-#~ "Malgranda versio "
-
-#~ msgid ""
-#~ "\n"
-#~ "Tiny version "
-#~ msgstr ""
-#~ "\n"
-#~ "Malgrandega versio "
-
-#~ msgid "with GTK2-GNOME GUI."
-#~ msgstr "kun grafika interfaco GTK2-GNOME."
-
-#~ msgid "with GTK2 GUI."
-#~ msgstr "kun grafika interfaco GTK2."
-
-#~ msgid "with X11-Motif GUI."
-#~ msgstr "kun grafika interfaco X11-Motif."
-
-#~ msgid "with X11-neXtaw GUI."
-#~ msgstr "kun grafika interfaco X11-neXtaw."
-
-#~ msgid "with X11-Athena GUI."
-#~ msgstr "kun grafika interfaco X11-Athena."
-
-#~ msgid "with Photon GUI."
-#~ msgstr "kun grafika interfaco Photon."
-
-#~ msgid "with GUI."
-#~ msgstr "sen grafika interfaco."
-
-#~ msgid "with Carbon GUI."
-#~ msgstr "kun grafika interfaco Carbon."
-
-#~ msgid "with Cocoa GUI."
-#~ msgstr "kun grafika interfaco Cocoa."
-
-#~ msgid "with (classic) GUI."
-#~ msgstr "kun (klasika) grafika interfaco."
-
-#~ msgid " system gvimrc file: \""
-#~ msgstr " sistema dosiero gvimrc: \""
-
-#~ msgid " user gvimrc file: \""
-#~ msgstr " dosiero gvimrc de uzanto: \""
-
-#~ msgid "2nd user gvimrc file: \""
-#~ msgstr " 2-a dosiero gvimrc de uzanto: \""
-
-#~ msgid "3rd user gvimrc file: \""
-#~ msgstr " 3-a dosiero gvimrc de uzanto: \""
-
-#~ msgid " system menu file: \""
-#~ msgstr " dosiero de sistema menuo: \""
-
-#~ msgid "Compiler: "
-#~ msgstr "Kompililo: "
+msgid "E77: Too many file names"
+msgstr "E77: Tro da dosiernomoj"
-# DP: atentu al la spacetoj: ฤ‰iuj ฤ‰enoj devas havi la saman longon
-#~ msgid "menu Help->Orphans for information "
-#~ msgstr "menuo Help->Orfinoj por pliaj informoj "
+msgid "E488: Trailing characters"
+msgstr "E488: Vostaj signoj"
-#~ msgid "Running modeless, typed text is inserted"
-#~ msgstr "Ruliฤas senreฤime, tajpita teksto estas enmetita"
+msgid "E78: Unknown mark"
+msgstr "E78: Nekonata marko"
-# DP: atentu al la spacetoj: ฤ‰iuj ฤ‰enoj devas havi la saman longon
-#~ msgid "menu Edit->Global Settings->Toggle Insert Mode "
-#~ msgstr "menuo Redakti->Mallokaj Agordoj->Baskuligi Enmetan Reฤimon"
+msgid "E79: Cannot expand wildcards"
+msgstr "E79: Ne eblas malvolvi ฤตokerojn"
-# DP: atentu al la spacetoj: ฤ‰iuj ฤ‰enoj devas havi la saman longon
-#~ msgid " for two modes "
-#~ msgstr " por du reฤimoj "
+msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
+msgstr "E591: 'winheight' ne rajtas esti malpli ol 'winminheight'"
-# DP: tiu ฤ‰eno pli longas (mi ne volas igi ฤ‰iujn aliajn ฤ‰enojn
-# pli longajn)
-#~ msgid "menu Edit->Global Settings->Toggle Vi Compatible"
-#~ msgstr "menuo Redakti->Mallokaj Agordoj->Baskuligi Reฤimon Kongruan kun Vi"
+msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
+msgstr "E592: 'winwidth' ne rajtas esti malpli ol 'winminwidth'"
-# DP: atentu al la spacetoj: ฤ‰iuj ฤ‰enoj devas havi la saman longon
-#~ msgid " for Vim defaults "
-#~ msgstr " por defaลญltoj de Vim "
+msgid "E80: Error while writing"
+msgstr "E80: Eraro dum skribado"
-#~ msgid "WARNING: Windows 95/98/ME detected"
-#~ msgstr "AVERTO: Trovis Vindozon 95/98/ME"
+msgid "E939: Positive count required"
+msgstr "E939: Pozitiva kvantoro bezonata"
-# DP: atentu al la spacetoj: ฤ‰iuj ฤ‰enoj devas havi la saman longon
-#~ msgid "type :help windows95<Enter> for info on this"
-#~ msgstr "tajpu :help windows95<Enenklavo> por pliaj informoj "
+msgid "E81: Using <SID> not in a script context"
+msgstr "E81: Uzo de <SID> ekster kunteksto de skripto"
-#~ msgid "E370: Could not load library %s"
-#~ msgstr "E370: Ne eblis ลargi bibliotekon %s"
+msgid "E449: Invalid expression received"
+msgstr "E449: Nevalida esprimo ricevita"
-#~ msgid ""
-#~ "Sorry, this command is disabled: the Perl library could not be loaded."
-#~ msgstr ""
-#~ "Bedaลญrinde tiu komando estas malลaltita: la biblioteko de Perl ne "
-#~ "ลargeblis."
+msgid "E463: Region is guarded, cannot modify"
+msgstr "E463: Regiono estas gardita, ne eblas ลanฤi"
-#~ msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
-#~ msgstr ""
-#~ "E299: Plenumo de Perl esprimoj malpermesata en sabloludejo sen la modulo "
-#~ "Safe"
+msgid "E744: NetBeans does not allow changes in read-only files"
+msgstr "E744: NetBeans ne permesas ลanฤojn en nurlegeblaj dosieroj"
-#~ msgid "Edit with &multiple Vims"
-#~ msgstr "Redakti per &pluraj Vim-oj"
+msgid "E363: pattern uses more memory than 'maxmempattern'"
+msgstr "E363: ลablono uzas pli da memoro ol 'maxmempattern'"
-#~ msgid "Edit with single &Vim"
-#~ msgstr "Redakti per unuopa &Vim"
+msgid "E749: empty buffer"
+msgstr "E749: malplena bufro"
-#~ msgid "Diff with Vim"
-#~ msgstr "Kompari per Vim"
+#, c-format
+msgid "E86: Buffer %ld does not exist"
+msgstr "E86: La bufro %ld ne ekzistas"
-#~ msgid "Edit with &Vim"
-#~ msgstr "Redakti per &Vim"
+msgid "E682: Invalid search pattern or delimiter"
+msgstr "E682: Nevalida serฤ‰a ลablono aลญ disigilo"
-#~ msgid "Edit with existing Vim - "
-#~ msgstr "Redakti per ekzistanta Vim - "
+msgid "E139: File is loaded in another buffer"
+msgstr "E139: Dosiero estas ลargita en alia bufro"
-#~ msgid "Edits the selected file(s) with Vim"
-#~ msgstr "Redakti la apartigita(j)n dosiero(j)n per Vim"
+#, c-format
+msgid "E764: Option '%s' is not set"
+msgstr "E764: La opcio '%s' ne estas ลaltita"
-#~ msgid "Error creating process: Check if gvim is in your path!"
-#~ msgstr "Eraro dum kreo de procezo: Kontrolu ฤ‰u gvim estas en via serฤ‰vojo!"
+msgid "E850: Invalid register name"
+msgstr "E850: Nevalida nomo de reฤistro"
-#~ msgid "gvimext.dll error"
-#~ msgstr "Eraro de gvimext.dll"
+#, c-format
+msgid "E919: Directory not found in '%s': \"%s\""
+msgstr "E919: Dosierujo ne trovita en '%s': \"%s\""
-#~ msgid "Path length too long!"
-#~ msgstr "Serฤ‰vojo estas tro longa!"
+msgid "search hit TOP, continuing at BOTTOM"
+msgstr "serฤ‰o atingis SUPRON, daลญrigonte al SUBO"
-#~ msgid "E234: Unknown fontset: %s"
-#~ msgstr "E234: Nekonata familio de tiparo: %s"
+msgid "search hit BOTTOM, continuing at TOP"
+msgstr "serฤ‰o atingis SUBON, daลญrigonte al SUPRO"
-#~ msgid "E235: Unknown font: %s"
-#~ msgstr "E235: Nekonata tiparo: %s"
+#, c-format
+msgid "Need encryption key for \"%s\""
+msgstr "ลœlosilo de ฤ‰ifrado bezonata por \"%s\""
-#~ msgid "E236: Font \"%s\" is not fixed-width"
-#~ msgstr "E236: La tiparo \"%s\" ne estas egallarฤa"
+msgid "empty keys are not allowed"
+msgstr "malplenaj ลlosiloj nepermeseblaj"
-#~ msgid "E448: Could not load library function %s"
-#~ msgstr "E448: Ne eblis ลargi bibliotekan funkcion %s"
+msgid "dictionary is locked"
+msgstr "vortaro estas ลlosita"
-#~ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
-#~ msgstr "E26: La hebrea ne uzeblas: Malลaltita dum kompilado\n"
+msgid "list is locked"
+msgstr "listo estas ลlosita"
-#~ msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
-#~ msgstr "E27: La persa ne uzeblas: Malลaltita dum kompilado\n"
+#, c-format
+msgid "failed to add key '%s' to dictionary"
+msgstr "aldono de ลlosilo '%s' al vortaro malsukcesis"
-#~ msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
-#~ msgstr "E800: La araba ne uzeblas: Malลaltita dum kompilado\n"
+#, c-format
+msgid "index must be int or slice, not %s"
+msgstr "indekso devas esti 'int' aลญ 'slice', ne %s"
-#~ msgid "E247: no registered server named \"%s\""
-#~ msgstr "E247: neniu registrita servilo nomita \"%s\""
+#, c-format
+msgid "expected str() or unicode() instance, but got %s"
+msgstr "atendis aperon de str() aลญ unicode(), sed ricevis %s"
-#~ msgid "E233: cannot open display"
-#~ msgstr "E233: ne eblas malfermi vidigon"
+#, c-format
+msgid "expected bytes() or str() instance, but got %s"
+msgstr "atendis aperon de bytes() aลญ str(), sed ricevis %s"
-#~ msgid "E449: Invalid expression received"
-#~ msgstr "E449: Nevalida esprimo ricevita"
+#, c-format
+msgid ""
+"expected int(), long() or something supporting coercing to long(), but got %s"
+msgstr "atendis int(), long() aลญ ion konverteblan al long(), sed ricevis %s"
-#~ msgid "E463: Region is guarded, cannot modify"
-#~ msgstr "E463: Regiono estas gardita, ne eblas ลanฤi"
+#, c-format
+msgid "expected int() or something supporting coercing to int(), but got %s"
+msgstr "atendis int() aลญ ion konverteblan al int(), sed ricevis %s"
-#~ msgid "E744: NetBeans does not allow changes in read-only files"
-#~ msgstr "E744: NetBeans ne permesas ลanฤojn en nurlegeblaj dosieroj"
+msgid "value is too large to fit into C int type"
+msgstr "valoro estas tro grada por C-tipo 'int'"
-#~ msgid "Need encryption key for \"%s\""
-#~ msgstr "ลœlosilo de ฤ‰ifrado bezonata por \"%s\""
+msgid "value is too small to fit into C int type"
+msgstr "valoro estas tro malgranda por C-tipo 'int'"
-#~ msgid "can't delete OutputObject attributes"
-#~ msgstr "ne eblas forviลi atributojn de OutputObject"
+msgid "number must be greater than zero"
+msgstr "nombro devas esti pli granda ol nul"
-#~ msgid "softspace must be an integer"
-#~ msgstr "malmolspaceto (softspace) devas esti entjero"
+msgid "number must be greater or equal to zero"
+msgstr "nombro devas esti egala aลญ pli granda ol nul"
-#~ msgid "invalid attribute"
-#~ msgstr "nevalida atributo"
+msgid "can't delete OutputObject attributes"
+msgstr "ne eblas forviลi atributojn de OutputObject"
-#~ msgid "writelines() requires list of strings"
-#~ msgstr "writelines() bezonas liston de ฤ‰enoj"
+#, c-format
+msgid "invalid attribute: %s"
+msgstr "nevalida atributo: %s"
-#~ msgid "E264: Python: Error initialising I/O objects"
-#~ msgstr "E264: Pitono: Eraro de pravalorizo de eneligaj objektoj"
+msgid "E264: Python: Error initialising I/O objects"
+msgstr "E264: Pitono: Eraro de pravalorizo de eneligaj objektoj"
-#~ msgid "empty keys are not allowed"
-#~ msgstr "malplenaj ลlosiloj nepermeseblaj"
+msgid "failed to change directory"
+msgstr "malsukcesis ลanฤi dosierujon"
-#~ msgid "Cannot delete DictionaryObject attributes"
-#~ msgstr "ne eblas forviลi atributojn de DictionaryObject"
+#, c-format
+msgid "expected 3-tuple as imp.find_module() result, but got %s"
+msgstr "atendis 3-opon kiel rezulto de imp.find_module(), sed ricevis %s"
-#~ msgid "Cannot modify fixed dictionary"
-#~ msgstr "Ne eblas ลanฤi fiksan vortaron"
+#, c-format
+msgid "expected 3-tuple as imp.find_module() result, but got tuple of size %d"
+msgstr "atendis 3-opon kiel rezulto de imp.find_module(), sed ricevis %d-opon"
-#~ msgid "Cannot set this attribute"
-#~ msgstr "Ne eblas agordi tiun atributon"
+msgid "internal error: imp.find_module returned tuple with NULL"
+msgstr "interna eraro: imp.find_module liveris opon kun NULL"
-#~ msgid "dict is locked"
-#~ msgstr "vortaro estas ลlosita"
+msgid "cannot delete vim.Dictionary attributes"
+msgstr "ne eblas forviลi atributojn de 'vim.Dictionary'"
-#~ msgid "failed to add key to dictionary"
-#~ msgstr "aldono de ลlosilo al vortaro fiaskis"
+msgid "cannot modify fixed dictionary"
+msgstr "ne eblas ลanฤi fiksan vortaron"
-#~ msgid "list index out of range"
-#~ msgstr "indekso de listo ekster limoj"
+#, c-format
+msgid "cannot set attribute %s"
+msgstr "ne eblas agordi atributon %s"
-#~ msgid "internal error: failed to get vim list item"
-#~ msgstr "interna eraro: obteno de vim-a listero fiaskis"
+msgid "hashtab changed during iteration"
+msgstr "hakettabelo ลanฤiฤis dum iteracio"
-#~ msgid "list is locked"
-#~ msgstr "listo estas ลlosita"
+#, c-format
+msgid "expected sequence element of size 2, but got sequence of size %d"
+msgstr "atendis 2-longan sekvencon, sed ricevis %d-longan sekvencon"
-#~ msgid "Failed to add item to list"
-#~ msgstr "Aldono de listero fiaskis"
+msgid "list constructor does not accept keyword arguments"
+msgstr "konstruilo de listo ne akceptas ลlosilvortajn argumentojn"
-#~ msgid "can only assign lists to slice"
-#~ msgstr "nur eblas pravalorizi listojn al segmento"
+msgid "list index out of range"
+msgstr "indekso de listo ekster limoj"
-#~ msgid "internal error: failed to add item to list"
-#~ msgstr "interna eraro: aldono de listero fiaskis"
+#, c-format
+msgid "internal error: failed to get vim list item %d"
+msgstr "interna eraro: obteno de vim-a listero %d malsukcesis"
-#~ msgid "can only concatenate with lists"
-#~ msgstr "eblas nur kunmeti kun listoj"
+msgid "slice step cannot be zero"
+msgstr "paลo de sekco ne povas esti nul"
-#~ msgid "cannot delete vim.dictionary attributes"
-#~ msgstr "ne eblas forviลi atributojn de 'vim.dictionary'"
+#, c-format
+msgid "attempt to assign sequence of size greater than %d to extended slice"
+msgstr "provis valorizi sekvencon kun pli ol %d eroj en etendita sekco"
-#~ msgid "cannot modify fixed list"
-#~ msgstr "ne eblas ลanฤi fiksan liston"
+#, c-format
+msgid "internal error: no vim list item %d"
+msgstr "interna eraro: neniu vim-a listero %d"
-#~ msgid "cannot set this attribute"
-#~ msgstr "ne eblas agordi tiun atributon"
+msgid "internal error: not enough list items"
+msgstr "interna eraro: ne sufiฤ‰aj listeroj"
-#~ msgid "'self' argument must be a dictionary"
-#~ msgstr "argumento 'self' devas esti vortaro"
+msgid "internal error: failed to add item to list"
+msgstr "interna eraro: aldono de listero malsukcesis"
-#~ msgid "failed to run function"
-#~ msgstr "fiaskis ruli funkcion"
+#, c-format
+msgid "attempt to assign sequence of size %d to extended slice of size %d"
+msgstr "provis valorizi sekvencon kun %d eroj al etendita sekco kun %d eroj"
-#~ msgid "unable to unset global option"
-#~ msgstr "ne povis malลalti mallokan opcion"
+msgid "failed to add item to list"
+msgstr "aldono de listero malsukcesis"
-#~ msgid "unable to unset option without global value"
-#~ msgstr "ne povis malลalti opcion sen malloka valoro"
+msgid "cannot delete vim.List attributes"
+msgstr "ne eblas forviลi atributojn de 'vim.List'"
-#~ msgid "object must be integer"
-#~ msgstr "objekto devas esti entjero."
+msgid "cannot modify fixed list"
+msgstr "ne eblas ลanฤi fiksan liston"
-#~ msgid "object must be string"
-#~ msgstr "objekto devas esti ฤ‰eno"
+#, c-format
+msgid "unnamed function %s does not exist"
+msgstr "sennoma funkcio %s ne ekzistas"
-#~ msgid "attempt to refer to deleted tab page"
-#~ msgstr "provo de referenco al forviลita langeto"
+#, c-format
+msgid "function %s does not exist"
+msgstr "funkcio %s ne ekzistas"
-#~ msgid "<tabpage object (deleted) at %p>"
-#~ msgstr "<langeta objekto (forviลita) ฤ‰e %p>"
+#, c-format
+msgid "failed to run function %s"
+msgstr "malsukcesis ruli funkcion %s"
-#~ msgid "<tabpage object (unknown) at %p>"
-#~ msgstr "<langeta objekto (nekonata) ฤ‰e %p>"
+msgid "unable to get option value"
+msgstr "malsukcesis akiri valoron de opcio"
-#~ msgid "<tabpage %d>"
-#~ msgstr "<langeto %d>"
+msgid "internal error: unknown option type"
+msgstr "interna eraro: nekonata tipo de opcio"
-#~ msgid "no such tab page"
-#~ msgstr "ne estas tia langeto"
+msgid "problem while switching windows"
+msgstr "problemo dum salto al vindozoj"
-#~ msgid "attempt to refer to deleted window"
-#~ msgstr "provo de referenco al forviลita fenestro"
+#, c-format
+msgid "unable to unset global option %s"
+msgstr "ne povis malลalti mallokan opcion %s"
-#~ msgid "readonly attribute"
-#~ msgstr "nurlegebla atributo"
+#, c-format
+msgid "unable to unset option %s which does not have global value"
+msgstr "ne povis malลalti opcion %s, kiu ne havas mallokan valoron"
-#~ msgid "cursor position outside buffer"
-#~ msgstr "kursoro poziciita ekster bufro"
+msgid "attempt to refer to deleted tab page"
+msgstr "provo de referenco al forviลita langeto"
-#~ msgid "<window object (deleted) at %p>"
-#~ msgstr "<fenestra objekto (forviลita) ฤ‰e %p>"
+msgid "no such tab page"
+msgstr "ne estas tia langeto"
-#~ msgid "<window object (unknown) at %p>"
-#~ msgstr "<objekta fenestro (nekonata) ฤ‰e %p>"
+msgid "attempt to refer to deleted window"
+msgstr "provo de referenco al forviลita fenestro"
-#~ msgid "<window %d>"
-#~ msgstr "<fenestro %d>"
+msgid "readonly attribute: buffer"
+msgstr "nurlegebla atributo: buffer"
-#~ msgid "no such window"
-#~ msgstr "ne estas tia fenestro"
+msgid "cursor position outside buffer"
+msgstr "kursoro poziciita ekster bufro"
-#~ msgid "attempt to refer to deleted buffer"
-#~ msgstr "provo de referenco al forviลita bufro"
+msgid "no such window"
+msgstr "ne estas tia fenestro"
-#~ msgid "<buffer object (deleted) at %p>"
-#~ msgstr "<bufra objekto (forviลita) ฤ‰e %p>"
+msgid "attempt to refer to deleted buffer"
+msgstr "provo de referenco al forviลita bufro"
-#~ msgid "key must be integer"
-#~ msgstr "ลlosilo devas esti entjero."
+msgid "failed to rename buffer"
+msgstr "malsukcesis renomi bufron"
-#~ msgid "expected vim.buffer object"
-#~ msgstr "atendis objekton vim.buffer"
+msgid "mark name must be a single character"
+msgstr "nomo de marko devas esti unuopa signo"
-#~ msgid "failed to switch to given buffer"
-#~ msgstr "ne povis salti al la specifita bufro"
+#, c-format
+msgid "expected vim.Buffer object, but got %s"
+msgstr "atendis objekton vim.Buffer, sed ricevis %s"
-#~ msgid "expected vim.window object"
-#~ msgstr "atendis objekton vim.window"
+#, c-format
+msgid "failed to switch to buffer %d"
+msgstr "salto al la bufro %d malsukcesis"
-#~ msgid "failed to find window in the current tab page"
-#~ msgstr "ne povis trovi vindozon en la nuna langeto"
+#, c-format
+msgid "expected vim.Window object, but got %s"
+msgstr "atendis objekton vim.window, sed ricevis %s"
-#~ msgid "did not switch to the specified window"
-#~ msgstr "ne saltis al la specifita vindozo"
+msgid "failed to find window in the current tab page"
+msgstr "malsukcesis trovi vindozon en la nuna langeto"
-#~ msgid "expected vim.tabpage object"
-#~ msgstr "atendis objekton vim.tabpage"
+msgid "did not switch to the specified window"
+msgstr "ne saltis al la specifita vindozo"
-#~ msgid "did not switch to the specified tab page"
-#~ msgstr "ne saltis al la specifita langeto"
+#, c-format
+msgid "expected vim.TabPage object, but got %s"
+msgstr "atendis objekton vim.TabPage, sed ricevis %s"
-#~ msgid "failed to run the code"
-#~ msgstr "fiaskis ruli la kodon"
+msgid "did not switch to the specified tab page"
+msgstr "ne saltis al la specifita langeto"
-#~ msgid "E858: Eval did not return a valid python object"
-#~ msgstr "E858: Eval ne revenis kun valida python-objekto"
+msgid "failed to run the code"
+msgstr "malsukcesis ruli la kodon"
-#~ msgid "E859: Failed to convert returned python object to vim value"
-#~ msgstr "E859: Konverto de revena python-objekto al vim-valoro fiaskis"
+msgid "E858: Eval did not return a valid python object"
+msgstr "E858: Eval ne revenis kun valida python-objekto"
-#~ msgid "unable to convert to vim structure"
-#~ msgstr "ne povis konverti al vim-strukturo"
+msgid "E859: Failed to convert returned python object to vim value"
+msgstr "E859: Konverto de revena python-objekto al vim-valoro malsukcesis"
-#~ msgid "NULL reference passed"
-#~ msgstr "NULL-referenco argumento"
+#, c-format
+msgid "unable to convert %s to vim dictionary"
+msgstr "ne povis konverti %s al vim-vortaro"
-#~ msgid "internal error: invalid value type"
-#~ msgstr "interna eraro: nevalida tipo de valoro"
+#, c-format
+msgid "unable to convert %s to vim list"
+msgstr "ne povis konverti %s al vim-listo"
-#~ msgid "E863: return value must be an instance of str"
-#~ msgstr "E863: elira valoro devas esti apero de str"
+#, c-format
+msgid "unable to convert %s to vim structure"
+msgstr "ne povis konverti %s al vim-strukturo"
-#~ msgid "E860: Eval did not return a valid python 3 object"
-#~ msgstr "E860: Eval ne revenis kun valida python3-objekto"
+msgid "internal error: NULL reference passed"
+msgstr "interna eraro: NULL-referenco argumento"
-#~ msgid "E861: Failed to convert returned python 3 object to vim value"
-#~ msgstr "E861: Konverto de revena python3-objekto al vim-valoro fiaskis"
+msgid "internal error: invalid value type"
+msgstr "interna eraro: nevalida tipo de valoro"
-#~ msgid "Only boolean objects are allowed"
-#~ msgstr "Nur buleaj objektoj estas permeseblaj"
+msgid ""
+"Failed to set path hook: sys.path_hooks is not a list\n"
+"You should now do the following:\n"
+"- append vim.path_hook to sys.path_hooks\n"
+"- append vim.VIM_SPECIAL_PATH to sys.path\n"
+msgstr ""
+"Valorizo de sys.path_hooks malsukcesis: sys.path_hooks ne estas listo\n"
+"Vi nun devas fari tion:\n"
+"- postaldoni vim.path_hook al sys.path_hooks\n"
+"- postaldoni vim.VIM_SPECIAL_PATH al sys.path\n"
-#~ msgid "no such key in dictionary"
-#~ msgstr "tiu ลlosilo ne ekzistas en vortaro"
+msgid ""
+"Failed to set path: sys.path is not a list\n"
+"You should now append vim.VIM_SPECIAL_PATH to sys.path"
+msgstr ""
+"Agordo de serฤ‰vojo malsukcesis: sys.path ne estas listo\n"
+"Vi nun devas aldoni vim.VIM_SPECIAL_PATH al sys.path"
diff --git a/src/nvim/po/es.po b/src/nvim/po/es.po
index 8a9c86e88d..f30e8780f9 100644
--- a/src/nvim/po/es.po
+++ b/src/nvim/po/es.po
@@ -1197,7 +1197,7 @@ msgstr "E141: No existe un nombre de archivo para el bรบfer %<PRId64>"
#: ../ex_cmds.c:2412
msgid "E142: File not written: Writing is disabled by 'write' option"
msgstr ""
-"E142: No se ha escrito el archivo: escritura desactivada por \n"
+"E142: No se ha escrito el archivo: escritura desactivada por "
"la opciรณn 'write'"
#: ../ex_cmds.c:2434
@@ -2209,7 +2209,7 @@ msgstr "es de solo lectura (aรฑada ! para sobreescribir)"
#: ../fileio.c:2886
msgid "E506: Can't write to backup file (add ! to override)"
msgstr ""
-"E506: No se pudo escribir en el archivo de recuperaciรณn\n"
+"E506: No se pudo escribir en el archivo de recuperaciรณn "
"(aรฑada ! para forzar la orden)"
#: ../fileio.c:2898
@@ -2525,7 +2525,7 @@ msgstr "E216: No existe tal grupo o evento: %s"
#: ../fileio.c:6090
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
"--- Auto-รณrdenes ---"
@@ -2549,7 +2549,7 @@ msgstr "E218: La auto-orden se anida en exceso"
#: ../fileio.c:7143
#, c-format
-msgid "%s Auto commands for \"%s\""
+msgid "%s Autocommands for \"%s\""
msgstr "%s Auto-รณrdenes para \"%s\""
#: ../fileio.c:7149
@@ -2748,11 +2748,6 @@ msgstr "E49: La longitud de desplazamiento no es vรกlida"
msgid "E901: Job table is full"
msgstr ""
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
#: ../globals.h:1024
#, c-format
msgid "E364: Library call failed for \"%s()\""
@@ -3141,7 +3136,7 @@ msgstr ""
#: ../hardcopy.c:2254
msgid "E675: No default font specified for multi-byte printing."
msgstr ""
-"E675: No se ha definido un tipo de letra predeterminado para impresiรณn\n"
+"E675: No se ha definido un tipo de letra predeterminado para impresiรณn "
"multi-byte"
#: ../hardcopy.c:2426
@@ -3398,7 +3393,7 @@ msgstr "Basura despuรฉs de la opciรณn"
#: ../main.c:152
msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"
msgstr ""
-"Demasiados argumentos tales como: \"+orden\", \"-c orden\" \n"
+"Demasiados argumentos tales como: \"+orden\", \"-c orden\" "
"o \"--cmd orden\""
#: ../main.c:154
@@ -3469,7 +3464,7 @@ msgstr "-q [fich. err.] Editar el archivo con el primer error"
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
@@ -3802,7 +3797,7 @@ msgstr "E302: No pude cambiar el nombre del archivo de intercambio"
#, c-format
msgid "E303: Unable to open swap file for \"%s\", recovery impossible"
msgstr ""
-"E303: Incapaz de abrir el archivo de intercambio para %s,\n"
+"E303: Incapaz de abrir el archivo de intercambio para %s, "
"recuperaciรณn imposible"
#: ../memline.c:666
@@ -3921,7 +3916,7 @@ msgstr "??? desde aquรญ hasta ???FIN las lรญneas pueden estar desordenadas"
#: ../memline.c:1164
msgid "??? from here until ???END lines may have been inserted/deleted"
msgstr ""
-"??? desde aquรญ hasta ???FIN las lรญneas pueden haber sido\n"
+"??? desde aquรญ hasta ???FIN las lรญneas pueden haber sido "
"insertadas/borradas"
#: ../memline.c:1181
@@ -3936,7 +3931,7 @@ msgstr "E311: Recuperaciรณn interrumpida"
msgid ""
"E312: Errors detected while recovering; look for lines starting with ???"
msgstr ""
-"E312: Se han detectado errores al recuperar; busque lรญneas que\n"
+"E312: Se han detectado errores al recuperar; busque lรญneas que "
"empiecen con ???"
#: ../memline.c:1245
@@ -4377,12 +4372,6 @@ msgstr "lรญnea %4ld"
msgid "E354: Invalid register name: '%s'"
msgstr "E354: Nombre de registro no vรกlido: '%s'"
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr ""
-"Traducciรณn: Proyecto vim-doc-es <http://www.assembla.com/wiki/show/vim-doc-"
-"es>"
-
#: ../message.c:986
msgid "Interrupt: "
msgstr "Interrupciรณn: "
@@ -5393,7 +5382,7 @@ msgstr "E756: La correcciรณn ortogrรกfica estรก desactivada"
#, c-format
msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
msgstr ""
-"Advertencia: No se pudo hallar la lista de palabras \"%s.%s.spl\" \n"
+"Advertencia: No se pudo hallar la lista de palabras \"%s.%s.spl\" "
"or \"%s.ascii.spl\""
#: ../spell.c:2473
@@ -5424,7 +5413,7 @@ msgstr "Advertencia: la regiรณn %s no es compatible"
#: ../spell.c:4550
#, c-format
-msgid "Reading affix file %s ..."
+msgid "Reading affix file %s..."
msgstr "Leyendo el archivo de afijos \"%s\"..."
#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
@@ -5454,8 +5443,7 @@ msgid ""
"%d"
msgstr ""
"Definir COMPOUNDFORBIDFLAG despuรฉs de un elemento PFX puede dar resultados "
-"errรณneos\n"
-"en %s lรญnea %d"
+"errรณneos en %s lรญnea %d"
#: ../spell.c:4731
#, c-format
@@ -5464,8 +5452,7 @@ msgid ""
"%d"
msgstr ""
"Definir COMPOUNDPERMITFLAG despuรฉs de un รญtem PFX puede dar resultados "
-"errรณneos\n"
-"en %s lรญnea %d"
+"errรณneos en %s lรญnea %d"
#: ../spell.c:4747
#, c-format
@@ -5496,7 +5483,7 @@ msgstr "Valor equivocado de CHECKCOMPOUNDPATTERN en %s lรญnea %d: %s"
#, c-format
msgid "Different combining flag in continued affix block in %s line %d: %s"
msgstr ""
-"Marca de combinaciรณn diferente en el bloque de afijos continuo\n"
+"Marca de combinaciรณn diferente en el bloque de afijos continuo "
"en %s lรญnea %d: %s"
#: ../spell.c:4850
@@ -5511,8 +5498,7 @@ msgid ""
"line %d: %s"
msgstr ""
"Afijo usado tambiรฉn para BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST "
-"en\n"
-"%s lรญnea %d: %s"
+"en %s lรญnea %d: %s"
#: ../spell.c:4893
#, c-format
@@ -5592,8 +5578,8 @@ msgstr "El valor %s difiere de los que se usa en otro archivo .aff"
#: ../spell.c:5602
#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "Leyendo el archivo de diccionario %s ..."
+msgid "Reading dictionary file %s..."
+msgstr "Leyendo el archivo de diccionario %s..."
#: ../spell.c:5611
#, c-format
@@ -5627,8 +5613,8 @@ msgstr "Ignorando %d palabra(s) con caracteres no-ASCII en %s"
#: ../spell.c:6115
#, c-format
-msgid "Reading word file %s ..."
-msgstr "Leyendo archivo de palabras \"%s\" ..."
+msgid "Reading word file %s..."
+msgstr "Leyendo archivo de palabras \"%s\"..."
#: ../spell.c:6155
#, c-format
@@ -5697,8 +5683,8 @@ msgstr "Nรบmero total de palabras: %d"
#: ../spell.c:7655
#, c-format
-msgid "Writing suggestion file %s ..."
-msgstr "Escribiendo el archivo de sugerencias %s ..."
+msgid "Writing suggestion file %s..."
+msgstr "Escribiendo el archivo de sugerencias %s..."
#: ../spell.c:7707 ../spell.c:7927
#, c-format
@@ -5725,8 +5711,8 @@ msgstr "Advertencia: Se especificรณ \"compounding\" y NOBREAK"
#: ../spell.c:7920
#, c-format
-msgid "Writing spell file %s ..."
-msgstr "Escribiendo archivo de ortografรญa \"%s\" ..."
+msgid "Writing spell file %s..."
+msgstr "Escribiendo archivo de ortografรญa \"%s\"..."
#: ../spell.c:7925
msgid "Done!"
@@ -5953,7 +5939,7 @@ msgstr "E402: Basura despuรฉs del patrรณn: %s"
#: ../syntax.c:5120
msgid "E403: syntax sync: line continuations pattern specified twice"
msgstr ""
-"E403: Sincronizaciรณn de sintaxis: Se especificรณ dos veces un\n"
+"E403: Sincronizaciรณn de sintaxis: Se especificรณ dos veces un "
"patrรณn de continuaciรณn de lรญnea"
#: ../syntax.c:5169
@@ -6580,7 +6566,7 @@ msgstr "E813: No se puede cerrar la ventana de autocmd"
#: ../window.c:1814
msgid "E814: Cannot close window, only autocmd window would remain"
msgstr ""
-"E814: No se pudo cerrar la รบltima ventana, solo quedarรก\n"
+"E814: No se pudo cerrar la รบltima ventana, solo quedarรก "
"la ventana de autocmd"
#: ../window.c:2717
diff --git a/src/nvim/po/fi.po b/src/nvim/po/fi.po
index d4082135aa..4612988c95 100644
--- a/src/nvim/po/fi.po
+++ b/src/nvim/po/fi.po
@@ -1,247 +1,417 @@
# Finnish translation for Vim.
# Copyright (C) 2003-2006 Free Software Foundation, Inc.
-# 2007-2010, Flammie Pirinen <flammie@iki.fi>
+# 2007-2018, Flammie Pirinen <flammie@iki.fi>
#
-# Vimin kไyttไjไt on n๖rttejไ. Sanasto on jargonia :-p
-#
-# Lไhinnไ latin-1:tไ, sillไ vim pitไไ portata ilmeisen obskuureille
-# alustoille. My๖s: pluralit puuttuu, ohjelman kไytt๖liittymไn fontti
-# tasavไlinen, tila rajattu, jne. jne., luovia ratkaisuja edessไ.
+# Jargonia ei ole yritetty suotta kotoperรคistรครค missรค teknisempi lainasanasto
+# tulee paremmin kyseeseen.
#
# Sanastosta:
-# Fold on sellainen moderneissa ohjelmointi-IDE:issไ oleva toiminto, jolla
-# lohko koodia esim. funktio piilotetaan nไkymไstไ: suom. taitos alkup.
+# * Fold on sellainen moderneissa ohjelmointi-IDE:issรค oleva toiminto, jolla
+# lohko koodia esim. funktio piilotetaan nรคkymรคstรค: suom. taitos alkup.
# analogian mukaan
-# source v. lataa tiedoston, kuten bash-komento source (tai .)
+# * source, v. lataa tiedoston, kuten bash-komento source (tai .)
+# * dictionary (dict) on vaihtelevasti sanakirja tai tietorakenne
#
msgid ""
msgstr ""
"Project-Id-Version: Vim 7\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-05-26 14:21+0200\n"
-"PO-Revision-Date: 2010-08-09 02:35+0300\n"
-"Last-Translator: Flammie Pirinen <flammie@iki.fi>\n"
+"POT-Creation-Date: 2017-04-19 16:46+0200\n"
+"PO-Revision-Date: 2016-08-29 11:27+0200\n"
+"Last-Translator: Flammie A Pirinen <flammie@iki.fi>\n"
"Language-Team: Finnish <laatu@lokalisointi.org>\n"
"Language: fi\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ../api/private/helpers.c:201
#, fuzzy
-msgid "Unable to get option value"
-msgstr "Roskaa argumentin perไssไ"
+#~ msgid "Index out of bounds"
+#~ msgstr "ei lรถytynyt "
-#: ../api/private/helpers.c:204
-msgid "internal error: unknown option type"
-msgstr ""
+#, fuzzy
+#~ msgid "Line index is too high"
+#~ msgstr "ikkunan indeksi alueen ulkopuolella"
+
+#~ msgid "Argument \"start\" is higher than \"end\""
+#~ msgstr ""
+
+#~ msgid "All items in the replacement array must be strings"
+#~ msgstr ""
+
+msgid "string cannot contain newlines"
+msgstr "merkkijono ei saa sisรคltรครค rivinvaihtoja"
+
+#, fuzzy
+#~ msgid "Failed to save undo information"
+#~ msgstr "ei voitu tallentaa kumoustietoja"
+
+#, fuzzy
+#~ msgid "Failed to delete line"
+#~ msgstr "ei voitu poistaa riviรค"
+
+#~ msgid "Index value is too high"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "Failed to replace line"
+#~ msgstr "ei voitu korvata riviรค"
+
+#, fuzzy
+#~ msgid "Failed to insert line"
+#~ msgstr "ei voitu lisรคtรค riviรค"
+
+#, fuzzy
+#~ msgid "Failed to rename buffer"
+#~ msgstr "ei voity uudelleennimetรค puskuria"
+
+#, fuzzy
+#~ msgid "Mark name must be a single character"
+#~ msgstr "merkin nimen pitรครค olla yksi merkki"
+
+#, fuzzy
+#~ msgid "Invalid mark name"
+#~ msgstr "virheellinen merkin nimi"
+
+#, fuzzy
+#~ msgid "Line number outside range"
+#~ msgstr "rivinumero arvoalueen ulkopuolella"
+
+#, fuzzy
+#~ msgid "Column value outside range"
+#~ msgstr "rivinumero arvoalueen ulkopuolella"
+
+#, fuzzy
+#~ msgid "Keyboard interrupt"
+#~ msgstr "nรคppรคimistรถkeskeytys"
+
+#, fuzzy
+#~ msgid "Key not found"
+#~ msgstr "ei lรถytynyt "
+
+#, fuzzy
+#~ msgid "Dictionary is locked"
+#~ msgstr "dictionary on lukittu"
+
+#, fuzzy
+#~ msgid "Empty variable names aren't allowed"
+#~ msgstr "tyhjiรค avaimia ei voi kรคyttรครค"
+
+#, fuzzy
+#~ msgid "Key length is too high"
+#~ msgstr "Liian pitkรค polku"
+
+#, c-format
+#~ msgid "Key is read-only: %s"
+#~ msgstr ""
+
+#, c-format
+#~ msgid "Key is fixed: %s"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "Key is locked: %s"
+#~ msgstr "E741: Arvo on lukittu: %s"
+
+#. Doesn't exist, fail
+#, fuzzy, c-format
+#~ msgid "Key does not exist: %s"
+#~ msgstr "Tiedostoa %s ei ole"
+
+#, fuzzy
+#~ msgid "Empty option name"
+#~ msgstr "E792: tyhjรค valikkonimi"
+
+#, fuzzy, c-format
+#~ msgid "Invalid option name \"%s\""
+#~ msgstr "E755: Virheellinen alue kohteelle %s"
+
+#, fuzzy, c-format
+#~ msgid "Unable to get value for option \"%s\""
+#~ msgstr "ei voi tyhjentรครค yleistรค asetusta %s"
+
+#, fuzzy, c-format
+#~ msgid "Unknown type for option \"%s\""
+#~ msgstr "E113: Tuntematon asetus: %s"
+
+#, fuzzy, c-format
+#~ msgid "Unable to unset option \"%s\""
+#~ msgstr "ei voi tyhjentรครค yleistรค asetusta %s"
+
+#, fuzzy, c-format
+#~ msgid "Cannot unset option \"%s\" because it doesn't have a global value"
+#~ msgstr "ei voi tyhjentรครค asetusta %s jolla ei ole yleistรค arvoa"
+
+#, c-format
+#~ msgid "Option \"%s\" requires a boolean value"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "Option \"%s\" requires an integer value"
+#~ msgstr "E709: [:] toimii vain listalla"
+
+#, c-format
+#~ msgid "Value for option \"%s\" is outside range"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "Option \"%s\" requires a string value"
+#~ msgstr "E709: [:] toimii vain listalla"
+
+#, fuzzy
+#~ msgid "Invalid buffer id"
+#~ msgstr "virheellinen puskurinumero"
+
+#, fuzzy
+#~ msgid "Invalid window id"
+#~ msgstr "E534: Viallinen leveรค fontti"
+
+#, fuzzy
+#~ msgid "Invalid tabpage id"
+#~ msgstr "Vรครคrรค argumentti valitsimelle"
+
+#~ msgid "Integer value outside range"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "Empty dictionary keys aren't allowed"
+#~ msgstr "tyhjiรค avaimia ei voi kรคyttรครค"
+
+#, fuzzy
+#~ msgid "Problem while switching windows"
+#~ msgstr "virhe ikkunaa vaihtaessa"
+
+#, fuzzy
+#~ msgid "UI already attached for channel"
+#~ msgstr "Vanhimmassa muutoksessa"
+
+#~ msgid "Expected width > 0 and height > 0"
+#~ msgstr ""
+
+#~ msgid "UI is not attached for channel"
+#~ msgstr ""
+
+#~ msgid "rgb must be a Boolean"
+#~ msgstr ""
+
+#~ msgid "popupmenu_external must be a Boolean"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "No such ui option"
+#~ msgstr "E24: Lyhennettรค ei ole"
+
+#~ msgid "Function called with too many arguments."
+#~ msgstr ""
+
+#~ msgid "Error calling function."
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "String length is too high"
+#~ msgstr "Liian pitkรค polku"
+
+#~ msgid "Directory string is too long"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "Failed to change directory"
+#~ msgstr "hakemistoa ei voitu muuttaa"
+
+#, fuzzy, c-format
+#~ msgid "Failed to switch to buffer %d"
+#~ msgstr "ei voitu vaihtaa puskuriin %d"
+
+#, fuzzy, c-format
+#~ msgid "Failed to switch to window %d"
+#~ msgstr "ei voitu vaihtaa puskuriin %d"
+
+#, fuzzy, c-format
+#~ msgid "Failed to switch to tabpage %d"
+#~ msgstr "ei voitu vaihtaa puskuriin %d"
+
+#~ msgid "All items in calls array must be arrays"
+#~ msgstr ""
+
+#~ msgid "All items in calls array must be arrays of size 2"
+#~ msgstr ""
+
+#~ msgid "name must be String"
+#~ msgstr ""
+
+#~ msgid "args must be Array"
+#~ msgstr ""
+
+# datarakenteita
+#, fuzzy
+#~ msgid "Argument \"pos\" must be a [row, col] array"
+#~ msgstr "E712: Argumentin %s pitรครค olla lista tai sanakirja"
+
+#, fuzzy
+#~ msgid "Cursor position outside buffer"
+#~ msgstr "kursorin sijainti puskurin ulkopuolella"
+
+#~ msgid "Height value outside range"
+#~ msgstr ""
+
+#~ msgid "Width value outside range"
+#~ msgstr ""
-#: ../buffer.c:92
msgid "[Location List]"
msgstr "[Sijaintiluettelo]"
-#: ../buffer.c:93
msgid "[Quickfix List]"
msgstr "[Pikakorjausluettelo]"
-#: ../buffer.c:94
-#, fuzzy
msgid "E855: Autocommands caused command to abort"
-msgstr "E812: Autocommands muutti puskurin tai sen nimen"
+msgstr "E855: Autocommands lopetti komennon"
-#: ../buffer.c:135
msgid "E82: Cannot allocate any buffer, exiting..."
-msgstr "E82: Mitไไn puskuria ei voitu varata, lopetetaan..."
+msgstr "E82: Mitรครคn puskuria ei voitu varata, lopetetaan..."
-#: ../buffer.c:138
msgid "E83: Cannot allocate buffer, using other one..."
-msgstr "E83: Puskuria ei voitu varata, kไytetไไn toista..."
+msgstr "E83: Puskuria ei voitu varata, kรคytetรครคn toista..."
+
+#, fuzzy
+#~ msgid "E937: Attempt to delete a buffer that is in use"
+#~ msgstr "E934: Ei voida hypรคtรค puskuriin jolla ei ole nimeรค"
-#: ../buffer.c:763
msgid "E515: No buffers were unloaded"
msgstr "E515: Puskureita ei vapautettu"
-#: ../buffer.c:765
msgid "E516: No buffers were deleted"
msgstr "E516: Puskureita ei poistettu"
-#: ../buffer.c:767
msgid "E517: No buffers were wiped out"
msgstr "E517: Puskureita ei pyyhitty"
-#: ../buffer.c:772
msgid "1 buffer unloaded"
msgstr "1 puskuri vapautettiin"
-#: ../buffer.c:774
#, c-format
msgid "%d buffers unloaded"
msgstr "%d puskuria vapautettiin"
-#: ../buffer.c:777
msgid "1 buffer deleted"
msgstr "1 puskuri poistettu"
-#: ../buffer.c:779
#, c-format
msgid "%d buffers deleted"
msgstr "%d puskuria poistettu"
-#: ../buffer.c:782
msgid "1 buffer wiped out"
msgstr "1 puskuri pyyhitty"
-#: ../buffer.c:784
#, c-format
msgid "%d buffers wiped out"
msgstr "%d puskuria pyyhitty"
-#: ../buffer.c:806
msgid "E90: Cannot unload last buffer"
-msgstr "E90: Ei voi vapauttaa viimeistไ puskuria"
+msgstr "E90: Ei voi vapauttaa viimeistรค puskuria"
-#: ../buffer.c:874
msgid "E84: No modified buffer found"
msgstr "E84: Ei muokattuja puskureita"
-#. back where we started, didn't find anything.
-#: ../buffer.c:903
msgid "E85: There is no listed buffer"
msgstr "E85: Luetteloitua puskuria ei ole"
-#: ../buffer.c:913
-#, c-format
-msgid "E86: Buffer %<PRId64> does not exist"
-msgstr "E86: Puskuria %<PRId64> ei ole"
-
-#: ../buffer.c:915
msgid "E87: Cannot go beyond last buffer"
-msgstr "E87: Viimeisen puskurin ohi ei voi edetไ"
+msgstr "E87: Viimeisen puskurin ohi ei voi edetรค"
-#: ../buffer.c:917
msgid "E88: Cannot go before first buffer"
-msgstr "E88: Ensimmไisen puskurin ohi ei voi edetไ"
+msgstr "E88: Ensimmรคisen puskurin ohi ei voi edetรค"
-#: ../buffer.c:945
-#, c-format
+#, fuzzy, c-format
+#~ msgid "E89: %s will be killed(add ! to override)"
+#~ msgstr "E189: %s on jo olemassa (lisรครค komentoon ! ohittaaksesi)"
+
+#, fuzzy, c-format
msgid ""
"E89: No write since last change for buffer %<PRId64> (add ! to override)"
msgstr ""
-"E89: Puskurin %<PRId64> muutoksia ei ole tallennettu (lisไไ komentoon ! "
+"E89: Puskurin %ld muutoksia ei ole tallennettu (lisรครค komentoon ! "
"ohittaaksesi)"
#. wrap around (may cause duplicates)
-#: ../buffer.c:1423
msgid "W14: Warning: List of file names overflow"
msgstr "W14: Varoitus: Tiedostonimiluettelon ylivuoto"
-#: ../buffer.c:1555 ../quickfix.c:3361
-#, c-format
-msgid "E92: Buffer %<PRId64> not found"
-msgstr "E92: Puskuria %<PRId64> ei l๖ydy"
+#, fuzzy, c-format
+#~ msgid "E92: Buffer %<PRId64> not found"
+#~ msgstr "E92: Puskuria %ld ei lรถydy"
-#: ../buffer.c:1798
#, c-format
msgid "E93: More than one match for %s"
-msgstr "E93: %s tไsmไไ useampaan kuin yhteen puskuriin"
+msgstr "E93: %s tรคsmรครค useampaan kuin yhteen puskuriin"
-#: ../buffer.c:1800
#, c-format
msgid "E94: No matching buffer for %s"
-msgstr "E94: %s ei tไsmไไ yhteenkไไn puskuriin"
+msgstr "E94: %s ei tรคsmรครค yhteenkรครคn puskuriin"
-#: ../buffer.c:2161
-#, c-format
-msgid "line %<PRId64>"
-msgstr "rivi %<PRId64>"
+#, fuzzy, c-format
+#~ msgid "line %<PRId64>"
+#~ msgstr "rivi %ld"
-#: ../buffer.c:2233
msgid "E95: Buffer with this name already exists"
msgstr "E95: Samanniminen puskuri on jo olemassa"
-#: ../buffer.c:2498
msgid " [Modified]"
msgstr " [Muokattu]"
-#: ../buffer.c:2501
msgid "[Not edited]"
msgstr "[Muokkaamaton]"
-#: ../buffer.c:2504
msgid "[New file]"
msgstr "[Uusi tiedosto]"
-#: ../buffer.c:2505
msgid "[Read errors]"
-msgstr "[Lukuvirheitไ]"
+msgstr "[Lukuvirheitรค]"
-#: ../buffer.c:2506 ../buffer.c:3217 ../fileio.c:1807 ../screen.c:4895
msgid "[RO]"
msgstr "[Luku]"
-#: ../buffer.c:2507 ../fileio.c:1807
msgid "[readonly]"
msgstr "[kirjoitussuojattu]"
-#: ../buffer.c:2524
#, c-format
msgid "1 line --%d%%--"
msgstr "1 rivi --%d %%--"
-#: ../buffer.c:2526
-#, c-format
-msgid "%<PRId64> lines --%d%%--"
-msgstr "%<PRId64> riviไ --%d %%--"
+#, fuzzy, c-format
+#~ msgid "%<PRId64> lines --%d%%--"
+#~ msgstr "%ld riviรค --%d %%--"
-#: ../buffer.c:2530
-#, c-format
-msgid "line %<PRId64> of %<PRId64> --%d%%-- col "
-msgstr "rivi %<PRId64>/%<PRId64> --%d %%-- sarake "
+#, fuzzy, c-format
+#~ msgid "line %<PRId64> of %<PRId64> --%d%%-- col "
+#~ msgstr "rivi %ld/%ld --%d %%-- sarake "
-#: ../buffer.c:2632 ../buffer.c:4292 ../memline.c:1554
msgid "[No Name]"
-msgstr "[Nimet๖n]"
+msgstr "[Nimetรถn]"
-#. must be a help buffer
-#: ../buffer.c:2667
msgid "help"
msgstr "ohje"
-#: ../buffer.c:3225 ../screen.c:4883
msgid "[Help]"
msgstr "[Ohje]"
-#: ../buffer.c:3254 ../screen.c:4887
msgid "[Preview]"
msgstr "[Esikatselu]"
# sijainti tiedostossa -indikaattoreja:
-# 4 merkkiไ sais riittไไ
-#: ../buffer.c:3528
+# 4 merkkiรค sais riittรครค
msgid "All"
msgstr "Kaik"
-#: ../buffer.c:3528
msgid "Bot"
msgstr "Loppu"
-#: ../buffer.c:3531
msgid "Top"
msgstr "Alku"
-#: ../buffer.c:4244
-msgid ""
-"\n"
-"# Buffer list:\n"
-msgstr ""
-"\n"
-"# Puskuriluettelo:\n"
-
-#: ../buffer.c:4289
msgid "[Scratch]"
msgstr "[Raapust]"
-#: ../buffer.c:4529
msgid ""
"\n"
"--- Signs ---"
@@ -249,795 +419,664 @@ msgstr ""
"\n"
"--- Merkit ---"
-#: ../buffer.c:4538
#, c-format
msgid "Signs for %s:"
msgstr "Merkit kohteelle %s:"
-#: ../buffer.c:4543
-#, c-format
-msgid " line=%<PRId64> id=%d name=%s"
-msgstr " rivi=%<PRId64> id=%d nimi=%s"
+#, fuzzy, c-format
+#~ msgid " line=%<PRId64> id=%d name=%s"
+#~ msgstr " rivi=%ld id=%d nimi=%s"
-#: ../cursor_shape.c:68
msgid "E545: Missing colon"
msgstr "E545: Kaksoispiste puuttuu"
-#: ../cursor_shape.c:70 ../cursor_shape.c:94
msgid "E546: Illegal mode"
msgstr "E546: Virheellinen tila"
-#: ../cursor_shape.c:134
msgid "E548: digit expected"
-msgstr "E548: pitไไ olla numero"
+msgstr "E548: pitรครค olla numero"
-#: ../cursor_shape.c:138
msgid "E549: Illegal percentage"
msgstr "E549: Virheellinen prosenttiluku"
-#: ../diff.c:146
-#, c-format
-msgid "E96: Can not diff more than %<PRId64> buffers"
-msgstr "E96: Ei voi diffata enempไไ kuin %<PRId64> puskuria"
+#, fuzzy, c-format
+#~ msgid "E96: Cannot diff more than %<PRId64> buffers"
+#~ msgstr "E96: Ei voi diffata enempรครค kuin %ld puskuria"
-#: ../diff.c:753
msgid "E810: Cannot read or write temp files"
-msgstr "E810: Ei voi lukea tai kirjoittaa vไliaikaistiedostoja"
+msgstr "E810: Ei voi lukea tai kirjoittaa vรคliaikaistiedostoja"
-#: ../diff.c:755
msgid "E97: Cannot create diffs"
-msgstr "E97: Ei voi luoda diffejไ"
+msgstr "E97: Ei voi luoda diffejรค"
-#: ../diff.c:966
msgid "E816: Cannot read patch output"
msgstr "E816: Ei voi lukea patchin tulostetta"
-#: ../diff.c:1220
msgid "E98: Cannot read diff output"
msgstr "E98: Ei voi lukea diffin tulostetta"
-#: ../diff.c:2081
msgid "E99: Current buffer is not in diff mode"
-msgstr "E99: Tไmไ puskuri ei ole diff-tilassa"
+msgstr "E99: Tรคmรค puskuri ei ole diff-tilassa"
-#: ../diff.c:2100
msgid "E793: No other buffer in diff mode is modifiable"
-msgstr "E793: Yksikไไn muu diff-tilan puskurit ei ole muokattavissa"
+msgstr "E793: Yksikรครคn muu diff-tilan puskurit ei ole muokattavissa"
-#: ../diff.c:2102
msgid "E100: No other buffer in diff mode"
-msgstr "E100: Yksikไไn muu puskuri ei ole diff-tilassa"
+msgstr "E100: Yksikรครคn muu puskuri ei ole diff-tilassa"
-#: ../diff.c:2112
msgid "E101: More than two buffers in diff mode, don't know which one to use"
-msgstr "E101: Monta puskuria on diff-tilassa, kไytettไvไn valinta ei onnistu"
+msgstr "E101: Monta puskuria on diff-tilassa, kรคytettรคvรคn valinta ei onnistu"
-#: ../diff.c:2141
#, c-format
msgid "E102: Can't find buffer \"%s\""
-msgstr "E102: Puskuria %s ei l๖ydy"
+msgstr "E102: Puskuria %s ei lรถydy"
-#: ../diff.c:2152
#, c-format
msgid "E103: Buffer \"%s\" is not in diff mode"
msgstr "E103: Puskuri %s ei ole diff-tilassa"
-#: ../diff.c:2193
msgid "E787: Buffer changed unexpectedly"
msgstr "E787: Puskuri vaihtui odottamatta"
-#: ../digraph.c:1598
msgid "E104: Escape not allowed in digraph"
-msgstr "E104: Escapea ei voi kไyttไไ digraafissa"
+msgstr "E104: Escapea ei voi kรคyttรครค digraafissa"
-#: ../digraph.c:1760
msgid "E544: Keymap file not found"
-msgstr "E544: Nไppไinkarttaa ei l๖ydy"
+msgstr "E544: Nรคppรคinkarttaa ei lรถydy"
-#: ../digraph.c:1785
msgid "E105: Using :loadkeymap not in a sourced file"
-msgstr "E105: Kไytetไไn :loadkeymapia ladatun tiedoston ulkopuolella"
+msgstr "E105: Kรคytetรครคn :loadkeymapia ladatun tiedoston ulkopuolella"
-#: ../digraph.c:1821
msgid "E791: Empty keymap entry"
-msgstr "E791: Tyhjไ keymap-kenttไ"
+msgstr "E791: Tyhjรค keymap-kenttรค"
-#: ../edit.c:82
msgid " Keyword completion (^N^P)"
-msgstr " Avainsanatไydennys (^N^P)"
+msgstr " Avainsanatรคydennys (^N^P)"
-#. ctrl_x_mode == 0, ^P/^N compl.
-#: ../edit.c:83
msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
msgstr " ^X-tila (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-#: ../edit.c:85
msgid " Whole line completion (^L^N^P)"
-msgstr " Tไysrivitไydennys (^L^N^P)"
+msgstr " Tรคysrivitรคydennys (^L^N^P)"
-#: ../edit.c:86
msgid " File name completion (^F^N^P)"
-msgstr " Tiedostonimitไydennys (^F^N^P)"
+msgstr " Tiedostonimitรคydennys (^F^N^P)"
-#: ../edit.c:87
msgid " Tag completion (^]^N^P)"
-msgstr " Tไgitไydennys (^]^N^P)"
+msgstr " Tรคgitรคydennys (^]^N^P)"
-#: ../edit.c:88
msgid " Path pattern completion (^N^P)"
-msgstr " Polkukuviotไydennys (^N^P)"
+msgstr " Polkukuviotรคydennys (^N^P)"
-#: ../edit.c:89
msgid " Definition completion (^D^N^P)"
-msgstr " Mไไritelmไtไydennys (^D^N^P)"
+msgstr " Mรครคritelmรคtรคydennys (^D^N^P)"
-#: ../edit.c:91
msgid " Dictionary completion (^K^N^P)"
-msgstr " Sanakirjatไydennys (^K^N^P)"
+msgstr " Sanakirjatรคydennys (^K^N^P)"
-#: ../edit.c:92
msgid " Thesaurus completion (^T^N^P)"
-msgstr " Thesaurus-tไydennys (^T^N^P)"
+msgstr " Thesaurus-tรคydennys (^T^N^P)"
-#: ../edit.c:93
msgid " Command-line completion (^V^N^P)"
-msgstr " Komentorivitไydennys (^V^N^P)"
+msgstr " Komentorivitรคydennys (^V^N^P)"
-#: ../edit.c:94
msgid " User defined completion (^U^N^P)"
-msgstr " Kไyttไjไn mไไrittelemไ tไydennys (^U^N^P)"
+msgstr " Kรคyttรคjรคn mรครคrittelemรค tรคydennys (^U^N^P)"
-#: ../edit.c:95
msgid " Omni completion (^O^N^P)"
-msgstr " Omnitไydennys (^O^N^P)"
+msgstr " Omnitรคydennys (^O^N^P)"
-#: ../edit.c:96
msgid " Spelling suggestion (s^N^P)"
msgstr " Oikaisulukuehdotus (s^N^P)"
-#: ../edit.c:97
msgid " Keyword Local completion (^N^P)"
-msgstr " Avainsanan paikallinen tไydennys (^N^P)"
+msgstr " Avainsanan paikallinen tรคydennys (^N^P)"
-#: ../edit.c:100
msgid "Hit end of paragraph"
msgstr "Kappaleen loppu tuli vastaan"
-#: ../edit.c:101
-#, fuzzy
msgid "E839: Completion function changed window"
-msgstr "E813: Ei voi sulkea autocmd-ikkunaa"
+msgstr "E839: Tรคydennys vaihtoi ikkunaa"
-#: ../edit.c:102
msgid "E840: Completion function deleted text"
-msgstr ""
+msgstr "E840: Tรคydennys poisti tekstiรค"
-#: ../edit.c:1847
msgid "'dictionary' option is empty"
-msgstr "dictionary-asetus on tyhjไ"
+msgstr "dictionary-asetus on tyhjรค"
-#: ../edit.c:1848
msgid "'thesaurus' option is empty"
-msgstr "thesaurus-asetus on tyhjไ"
+msgstr "thesaurus-asetus on tyhjรค"
-#: ../edit.c:2655
#, c-format
msgid "Scanning dictionary: %s"
msgstr "Luetaan sanakirjaa: %s"
-#: ../edit.c:3079
msgid " (insert) Scroll (^E/^Y)"
-msgstr " (sy๖tt๖) Vieritys (^E/^Y)"
+msgstr " (syรถttรถ) Vieritys (^E/^Y)"
-#: ../edit.c:3081
msgid " (replace) Scroll (^E/^Y)"
msgstr " (korvaus) Vieritys (^E/^Y)"
-#: ../edit.c:3587
#, c-format
msgid "Scanning: %s"
msgstr "Luetaan: %s"
-#: ../edit.c:3614
msgid "Scanning tags."
-msgstr "Luetaan tไgejไ."
+msgstr "Luetaan tรคgejรค."
-#: ../edit.c:4519
msgid " Adding"
-msgstr " Lisไtไไn"
+msgstr " Lisรคtรครคn"
-#. showmode might reset the internal line pointers, so it must
-#. * be called before line = ml_get(), or when this address is no
-#. * longer needed. -- Acevedo.
-#.
-#: ../edit.c:4562
msgid "-- Searching..."
msgstr "-- Haetaan..."
-#: ../edit.c:4618
msgid "Back at original"
-msgstr "Takaisin lไht๖pisteessไ"
+msgstr "Takaisin lรคhtรถpisteessรค"
-#: ../edit.c:4621
msgid "Word from other line"
-msgstr "Sana toisella rivillไ"
+msgstr "Sana toisella rivillรค"
-#: ../edit.c:4624
msgid "The only match"
-msgstr "Ainoa tไsmไys"
+msgstr "Ainoa tรคsmรคys"
-#: ../edit.c:4680
#, c-format
msgid "match %d of %d"
-msgstr "tไsmไys %d/%d"
+msgstr "tรคsmรคys %d/%d"
-#: ../edit.c:4684
#, c-format
msgid "match %d"
-msgstr "tไsmไys %d"
+msgstr "tรคsmรคys %d"
-#: ../eval.c:137
msgid "E18: Unexpected characters in :let"
-msgstr "E18: Odottamattomia merkkejไ komennossa :let"
-
-#: ../eval.c:138
-#, c-format
-msgid "E684: list index out of range: %<PRId64>"
-msgstr "E684: Indeksi %<PRId64> luettelon rajojen ulkopuolella"
+msgstr "E18: Odottamattomia merkkejรค komennossa :let"
-#: ../eval.c:139
-#, c-format
-msgid "E121: Undefined variable: %s"
-msgstr "E121: Mไไrittelemไt๖n muuttuja: %s"
-
-#: ../eval.c:140
msgid "E111: Missing ']'"
msgstr "E111: ] puuttuu"
-#: ../eval.c:141
#, c-format
msgid "E686: Argument of %s must be a List"
-msgstr "E686: Argumentin %s pitไไ olla lista"
+msgstr "E686: Argumentin %s pitรครค olla lista"
# datarakenteita
-#: ../eval.c:143
#, c-format
msgid "E712: Argument of %s must be a List or Dictionary"
-msgstr "E712: Argumentin %s pitไไ olla lista tai sanakirja"
-
-#: ../eval.c:144
-msgid "E713: Cannot use empty key for Dictionary"
-msgstr "E713: Sanakirjassa ei voi olla tyhjiไ avaimia"
+msgstr "E712: Argumentin %s pitรครค olla lista tai sanakirja"
-#: ../eval.c:145
msgid "E714: List required"
msgstr "E714: Lista tarvitaan"
-#: ../eval.c:146
msgid "E715: Dictionary required"
msgstr "E715: Sanakirja tarvitaan"
-#: ../eval.c:147
+msgid "E928: String required"
+msgstr "E928: Merkkijono puuttuu"
+
#, c-format
msgid "E118: Too many arguments for function: %s"
msgstr "E118: Liikaa argumentteja funktiolle: %s"
-#: ../eval.c:148
#, c-format
msgid "E716: Key not present in Dictionary: %s"
msgstr "E716: Avainta %s ei ole sanakirjassa"
-#: ../eval.c:150
#, c-format
msgid "E122: Function %s already exists, add ! to replace it"
-msgstr "E122: Funktio %s on jo olemassa, lisไไ ! korvataksesi"
+msgstr "E122: Funktio %s on jo olemassa, lisรครค ! korvataksesi"
-#: ../eval.c:151
msgid "E717: Dictionary entry already exists"
msgstr "E717: Sanakirja-alkio on jo olemassa"
-#: ../eval.c:152
msgid "E718: Funcref required"
msgstr "E718: Funcref tarvitaan"
-#: ../eval.c:153
msgid "E719: Cannot use [:] with a Dictionary"
-msgstr "E719: Sanakirjassa ei voi kไyttไไ merkintไไ [:]"
+msgstr "E719: Sanakirjassa ei voi kรคyttรครค merkintรครค [:]"
-#: ../eval.c:154
-#, c-format
-msgid "E734: Wrong variable type for %s="
-msgstr "E734: Vไไrไ muuttujatyyppi muuttujalle %s="
-
-#: ../eval.c:155
#, c-format
msgid "E130: Unknown function: %s"
msgstr "E130: Tuntematon funktio: %s"
-#: ../eval.c:156
#, c-format
msgid "E461: Illegal variable name: %s"
msgstr "E461: Virheellinen muuttujanimi: %s"
-#: ../eval.c:157
-msgid "E806: using Float as a String"
-msgstr "E806: Float ei kไy merkkijonosta"
+#, fuzzy, c-format
+#~ msgid "E46: Cannot change read-only variable \"%.*s\""
+#~ msgstr "E46: Kirjoitussuojattua muuttujaa %s ei voi muuttaa"
+
+#. TODO(ZyX-I): move to eval/executor
+#, c-format
+msgid "E734: Wrong variable type for %s="
+msgstr "E734: Vรครคrรค muuttujatyyppi muuttujalle %s="
-#: ../eval.c:1830
msgid "E687: Less targets than List items"
-msgstr "E687: Kohteita on vไhemmไn kuin listan alkioita"
+msgstr "E687: Kohteita on vรคhemmรคn kuin listan alkioita"
-#: ../eval.c:1834
msgid "E688: More targets than List items"
-msgstr "E688: Kohteita on enemmไn kuin listan alkioita"
+msgstr "E688: Kohteita on enemmรคn kuin listan alkioita"
-#: ../eval.c:1906
msgid "Double ; in list of variables"
-msgstr "Kaksi ;:ttไ listan muuttujissa"
+msgstr "Kaksi ;:ttรค listan muuttujissa"
-#: ../eval.c:2078
#, c-format
msgid "E738: Can't list variables for %s"
msgstr "E738: Kohteen %s muuttujia ei voi listata"
-#: ../eval.c:2391
+#, fuzzy, c-format
+#~ msgid "E121: Undefined variable: %.*s"
+#~ msgstr "E121: Mรครคrittelemรคtรถn muuttuja: %s"
+
msgid "E689: Can only index a List or Dictionary"
-msgstr "E689: Vain listalla ja sanakirjalla voi olla indeksejไ"
+msgstr "E689: Vain listalla ja sanakirjalla voi olla indeksejรค"
-#: ../eval.c:2396
msgid "E708: [:] must come last"
-msgstr "E708: [:]:n pitไไ olla viimeisenไ"
+msgstr "E708: [:]:n pitรครค olla viimeisenรค"
+
+#, fuzzy
+#~ msgid "E713: Cannot use empty key after ."
+#~ msgstr "E713: Sanakirjassa ei voi olla tyhjiรค avaimia"
-#: ../eval.c:2439
msgid "E709: [:] requires a List value"
msgstr "E709: [:] toimii vain listalla"
-#: ../eval.c:2674
msgid "E710: List value has more items than target"
-msgstr "E710: Listalla on enemmไn alkioita kuin kohteella"
+msgstr "E710: Listalla on enemmรคn alkioita kuin kohteella"
-#: ../eval.c:2678
msgid "E711: List value has not enough items"
msgstr "E711: Listalla ei ole tarpeeksi alkioita"
-#: ../eval.c:2867
msgid "E690: Missing \"in\" after :for"
msgstr "E690: :for-kommenolta puuttuu in"
-#: ../eval.c:3063
#, c-format
msgid "E107: Missing parentheses: %s"
msgstr "E107: Sulkeita puuttuu: %s"
-#: ../eval.c:3263
#, c-format
msgid "E108: No such variable: \"%s\""
msgstr "E108: Muuttujaa %s ei ole"
-#: ../eval.c:3333
-msgid "E743: variable nested too deep for (un)lock"
-msgstr "E743: muuttujassa liian monta tasoa lukituksen kไsittelyyn"
+#. For historical reasons this error is not given for Lists and
+#. Dictionaries. E.g. b: dictionary may be locked/unlocked.
+#, fuzzy, c-format
+#~ msgid "E940: Cannot lock or unlock variable %s"
+#~ msgstr "E46: Kirjoitussuojattua muuttujaa %s ei voi muuttaa"
-#: ../eval.c:3630
msgid "E109: Missing ':' after '?'"
-msgstr "E109: ?:n jไlkeen puuttuu :"
+msgstr "E109: ?:n jรคlkeen puuttuu :"
-#: ../eval.c:3893
msgid "E691: Can only compare List with List"
msgstr "E691: Listaa voi verrata vain listaan"
-#: ../eval.c:3895
-msgid "E692: Invalid operation for Lists"
+msgid "E692: Invalid operation for List"
msgstr "E692: Virheellinen toiminto listalle"
-#: ../eval.c:3915
msgid "E735: Can only compare Dictionary with Dictionary"
msgstr "E735: Sanakirjaa voi verrata vain sanakirjaan"
-#: ../eval.c:3917
msgid "E736: Invalid operation for Dictionary"
msgstr "E736: Virheellinen toiminto sanakirjalle"
-#: ../eval.c:3932
-msgid "E693: Can only compare Funcref with Funcref"
-msgstr "E693: Funcrefiไ voi verrata vain funcrefiin"
-
-#: ../eval.c:3934
msgid "E694: Invalid operation for Funcrefs"
msgstr "E694: Virheellinen toiminto funcrefille"
-#: ../eval.c:4277
msgid "E804: Cannot use '%' with Float"
-msgstr "E804: Ei voi kไyttไไ '%':a Floatin kanssa"
+msgstr "E804: Ei voi kรคyttรครค '%':a Floatin kanssa"
-#: ../eval.c:4478
msgid "E110: Missing ')'"
msgstr "E110: ) puuttuu"
-#: ../eval.c:4609
msgid "E695: Cannot index a Funcref"
-msgstr "E695: Funcrefiไ ei voi indeksoida"
+msgstr "E695: Funcrefiรค ei voi indeksoida"
+
+msgid "E909: Cannot index a special variable"
+msgstr "E909: erikoismuuttujaa ei voi indeksoida"
-#: ../eval.c:4839
#, c-format
msgid "E112: Option name missing: %s"
msgstr "E112: Asetuksen nimi puuttuu: %s"
-#: ../eval.c:4855
#, c-format
msgid "E113: Unknown option: %s"
msgstr "E113: Tuntematon asetus: %s"
-#: ../eval.c:4904
#, c-format
msgid "E114: Missing quote: %s"
msgstr "E114: Puuttuva lainausmerkki: %s"
-#: ../eval.c:5020
#, c-format
msgid "E115: Missing quote: %s"
msgstr "E115: Puuttuva lainausmerkki: %s"
-#: ../eval.c:5084
#, c-format
msgid "E696: Missing comma in List: %s"
msgstr "E696: Listasta puuttuu pilkku: %s"
-#: ../eval.c:5091
#, c-format
msgid "E697: Missing end of List ']': %s"
msgstr "E697: Listan lopusta puuttuu ]: %s"
-#: ../eval.c:6475
+msgid "Not enough memory to set references, garbage collection aborted!"
+msgstr ""
+"Ei tarpeeksi muistia viitteiden asettamista varten, roskiekeruu peruttiin."
+
#, c-format
msgid "E720: Missing colon in Dictionary: %s"
msgstr "E720: Sanakirjasta puuttuu kaksoispiste: %s"
-#: ../eval.c:6499
#, c-format
msgid "E721: Duplicate key in Dictionary: \"%s\""
msgstr "E721: Kaksi samaa avainta sanakirjassa: %s"
-#: ../eval.c:6517
#, c-format
msgid "E722: Missing comma in Dictionary: %s"
msgstr "E722: Sanakirjasta puuttuu pilkku: %s"
-#: ../eval.c:6524
#, c-format
msgid "E723: Missing end of Dictionary '}': %s"
msgstr "E723: Sanakirjan lopusta puuttuu }: %s"
-#: ../eval.c:6555
-msgid "E724: variable nested too deep for displaying"
-msgstr "E724: muuttuja on upotettu liian syvไlle nไytettไvไksi"
+#, c-format
+msgid "E125: Illegal argument: %s"
+msgstr "E125: Virheellinen argumentti: %s"
+
+#, c-format
+msgid "E853: Duplicate argument name: %s"
+msgstr "E853: Kaksoiskappale argumentin nimestรค: %s"
-#: ../eval.c:7188
#, c-format
msgid "E740: Too many arguments for function %s"
msgstr "E740: Liikaa argumentteja funktiolle %s"
-#: ../eval.c:7190
#, c-format
msgid "E116: Invalid arguments for function %s"
-msgstr "E116: Vไไriไ argumentteja funktiolle %s"
+msgstr "E116: Vรครคriรค argumentteja funktiolle %s"
-#: ../eval.c:7377
#, c-format
msgid "E117: Unknown function: %s"
msgstr "E117: Tuntematon funktio: %s"
-#: ../eval.c:7383
+#, c-format
+msgid "E933: Function was deleted: %s"
+msgstr "E933: Funktion nimi poistettu: %s"
+
#, c-format
msgid "E119: Not enough arguments for function: %s"
msgstr "E119: Liikaa argumentteja funktiolle %s"
-#: ../eval.c:7387
#, c-format
msgid "E120: Using <SID> not in a script context: %s"
msgstr "E120: <SID> skriptin ulkopuolella: %s"
-#: ../eval.c:7391
#, c-format
msgid "E725: Calling dict function without Dictionary: %s"
msgstr "E725: dict-funktio ilman sanakirjaa: %s"
-#: ../eval.c:7453
-msgid "E808: Number or Float required"
-msgstr "E808: Number tai Float vaaditaan"
+#, fuzzy, c-format
+#~ msgid "Error converting the call result: %s"
+#~ msgstr "virhe Schemestรค Vimiin konversiossa"
-#: ../eval.c:7503
-#, fuzzy
msgid "add() argument"
-msgstr "-c-argumentti"
+msgstr "add()-argumentti"
-#: ../eval.c:7907
msgid "E699: Too many arguments"
msgstr "E699: Liikaa argumentteja"
-#: ../eval.c:8073
msgid "E785: complete() can only be used in Insert mode"
-msgstr "E785: complete() toimii vain sy๖tt๖tilassa"
+msgstr "E785: complete() toimii vain syรถttรถtilassa"
-#: ../eval.c:8156
msgid "&Ok"
msgstr "&Ok"
-#: ../eval.c:8676
-#, c-format
-msgid "E737: Key already exists: %s"
-msgstr "E737: Avain on jo olemassa: %s"
-
-#: ../eval.c:8692
#, fuzzy
+#~ msgid "dictwatcheradd() argument"
+#~ msgstr "add()-argumentti"
+
msgid "extend() argument"
-msgstr "--cmd-argumentti"
+msgstr "extend()-argumentti"
-#: ../eval.c:8915
-#, fuzzy
msgid "map() argument"
-msgstr "-c-argumentti"
+msgstr "map()-argumentti"
-#: ../eval.c:8916
-#, fuzzy
msgid "filter() argument"
-msgstr "-c-argumentti"
+msgstr "filter()-argumentti"
-#: ../eval.c:9229
-#, c-format
-msgid "+-%s%3ld lines: "
-msgstr "+-%s%3ld riviไ: "
+#, fuzzy, c-format
+#~ msgid "+-%s%3ld lines: "
+#~ msgstr "+-%s%3ld rivi: "
-#: ../eval.c:9291
#, c-format
msgid "E700: Unknown function: %s"
msgstr "E700: Tuntematon funktio: %s"
-#: ../eval.c:10729
+msgid "E922: expected a dict"
+msgstr "E922: odotettiin dictiรค"
+
+# datarakenteita
+msgid "E923: Second argument of function() must be a list or a dict"
+msgstr "E923: toisen function()-argumentin pitรครค olla lista tai sanakirja"
+
+#, fuzzy
+#~ msgid "E5000: Cannot find tab number."
+#~ msgstr "E695: Funcrefiรค ei voi indeksoida"
+
+#~ msgid "E5001: Higher scope cannot be -1 if lower scope is >= 0."
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "E5002: Cannot find window number."
+#~ msgstr "E671: Ikkunan otsikkoa ei lรถydy %s"
+
msgid "called inputrestore() more often than inputsave()"
msgstr "inputrestore() suoritettu useammin kuin inputsave()"
-#: ../eval.c:10771
-#, fuzzy
msgid "insert() argument"
-msgstr "-c-argumentti"
+msgstr "insert()-argumentti"
-#: ../eval.c:10841
msgid "E786: Range not allowed"
-msgstr "E786: Aluetta ei voi kไyttไไ"
+msgstr "E786: Aluetta ei voi kรคyttรครค"
+
+#~ msgid "Invalid stream on rpc job, use jobclose(id, 'rpc')"
+#~ msgstr ""
+
+#~ msgid "Invalid job stream: Not an rpc job"
+#~ msgstr ""
+
+#, c-format
+#~ msgid "Invalid job stream \"%s\""
+#~ msgstr ""
+
+#~ msgid "Can't send data to the job: stdin is closed"
+#~ msgstr ""
+
+#~ msgid "Can't send raw data to rpc channel"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "E474: Failed to convert list to string"
+#~ msgstr "ei voitu konvertoida tyypistรค %s vim-listaksi"
+
+#, fuzzy, c-format
+#~ msgid "E474: Failed to parse %.*s"
+#~ msgstr "E241: Kohteeseen %s lรคhettรคminen ei onnistunut"
-#: ../eval.c:11140
msgid "E701: Invalid type for len()"
msgstr "E701: Virheellinen tyyppi funktiolle len()"
-#: ../eval.c:11980
+#, fuzzy, c-format
+#~ msgid "msgpackdump() argument, index %i"
+#~ msgstr "map()-argumentti"
+
+#, fuzzy
+#~ msgid "E5070: Character number must not be less than zero"
+#~ msgstr "luvun on oltava nollaa suurempi"
+
+#, fuzzy, c-format
+#~ msgid "E5071: Character number must not be greater than INT_MAX (%i)"
+#~ msgstr "luvun on oltava nollaa suurempi"
+
msgid "E726: Stride is zero"
msgstr "E726: Stride on nolla"
-#: ../eval.c:11982
msgid "E727: Start past end"
-msgstr "E727: Alku on lopun jไlkeen"
+msgstr "E727: Alku on lopun jรคlkeen"
-#: ../eval.c:12024 ../eval.c:15297
msgid "<empty>"
-msgstr "<tyhjไ>"
+msgstr "<tyhjรค>"
-#: ../eval.c:12282
-#, fuzzy
msgid "remove() argument"
-msgstr "--cmd-argumentti"
+msgstr "remove()-argumentti"
-#: ../eval.c:12466
msgid "E655: Too many symbolic links (cycle?)"
-msgstr "E655: Liikaa symbolisia linkkejไ (mahdollinen sykli)"
+msgstr "E655: Liikaa symbolisia linkkejรค (mahdollinen sykli)"
-#: ../eval.c:12593
-#, fuzzy
msgid "reverse() argument"
-msgstr "-c-argumentti"
+msgstr "reverse()-argumentti"
+
+#, c-format
+msgid "E927: Invalid action: '%s'"
+msgstr "E927: Viallinen toiminto: %s"
-#: ../eval.c:13721
-#, fuzzy
msgid "sort() argument"
-msgstr "-c-argumentti"
+msgstr "sort()-argumentti"
-#: ../eval.c:13721
-#, fuzzy
msgid "uniq() argument"
-msgstr "-c-argumentti"
+msgstr "uniq()-argumentti"
-#: ../eval.c:13776
msgid "E702: Sort compare function failed"
msgstr "E702: Lajittelun vertausfunktio ei onnistunut"
-#: ../eval.c:13806
-#, fuzzy
msgid "E882: Uniq compare function failed"
-msgstr "E702: Lajittelun vertausfunktio ei onnistunut"
+msgstr "E882: Uniqin vertausfunktio ei onnistunut"
-#: ../eval.c:14085
msgid "(Invalid)"
msgstr "(Virheellinen)"
-#: ../eval.c:14590
-msgid "E677: Error writing temp file"
-msgstr "E677: Vไliaikaistiedostoon kirjoittaminen ei onnistunut"
+#, c-format
+msgid "E935: invalid submatch number: %d"
+msgstr "E935: Virheellinen alitรคsmรคyksen numero: %d"
-#: ../eval.c:16159
-msgid "E805: Using a Float as a Number"
-msgstr "E805: Float ei kไy Numberista"
+#~ msgid "Can only call this function in an unmodified buffer"
+#~ msgstr ""
-#: ../eval.c:16162
-msgid "E703: Using a Funcref as a Number"
-msgstr "E703: Funcref ei kไy Numberista"
+msgid "E921: Invalid callback argument"
+msgstr "E921: Virheellinen callback-argumentti"
-#: ../eval.c:16170
-msgid "E745: Using a List as a Number"
-msgstr "E745: Lista ei kไy Numberista"
+#, fuzzy, c-format
+#~ msgid "E80: Error while writing: %s"
+#~ msgstr "E80: Kirjoitusvirhe"
-#: ../eval.c:16173
-msgid "E728: Using a Dictionary as a Number"
-msgstr "E728: Sanakirja ei kไy Numberista"
+#. Using %s, p and not %c, *p to preserve multibyte characters
+#, fuzzy, c-format
+#~ msgid "E5060: Unknown flag: %s"
+#~ msgstr "E235: Tuntematon fontti: %s"
-#: ../eval.c:16259
-msgid "E729: using Funcref as a String"
-msgstr "E729: Funcref ei kไy merkkijonosta"
+#, fuzzy
+#~ msgid "E482: Can't open file with an empty name"
+#~ msgstr "E212: Tiedoston avaus kirjoittamista varten ei onnistu"
-#: ../eval.c:16262
-msgid "E730: using List as a String"
-msgstr "E730: Lista ei kไy merkkijonosta"
+#, fuzzy, c-format
+#~ msgid "E482: Can't open file %s for writing: %s"
+#~ msgstr "E212: Tiedoston avaus kirjoittamista varten ei onnistu"
-#: ../eval.c:16265
-msgid "E731: using Dictionary as a String"
-msgstr "E731: Sanakirja ei kไy merkkijonosta"
+#, fuzzy, c-format
+#~ msgid "E80: Error when closing file %s: %s"
+#~ msgstr "E209: Virhe suljettaessa tiedostoa %s"
-#: ../eval.c:16619
-#, c-format
-msgid "E706: Variable type mismatch for: %s"
-msgstr "E706: Muuttujatyyppi ei tไsmไไ: %s"
+#, fuzzy, c-format
+#~ msgid "E794: Cannot set variable in the sandbox: \"%.*s\""
+#~ msgstr "E794: Muuttujaa ei voi asettaa hiekkalaatikossa: %s"
-#: ../eval.c:16705
-#, c-format
-msgid "E795: Cannot delete variable %s"
-msgstr "E795: Muuttujaa %s ei voi poistaa"
+#, fuzzy, c-format
+#~ msgid "E795: Cannot delete variable %.*s"
+#~ msgstr "E795: Muuttujaa %s ei voi poistaa"
-#: ../eval.c:16724
#, c-format
msgid "E704: Funcref variable name must start with a capital: %s"
-msgstr "E704: Funcrefin muuttujanimen pitไไ alkaa suuraakkosella: %s"
+msgstr "E704: Funcrefin muuttujanimen pitรครค alkaa suuraakkosella: %s"
-#: ../eval.c:16732
#, c-format
msgid "E705: Variable name conflicts with existing function: %s"
msgstr "E705: Muuttujanimi on sama kuin olemassaolevan funktion: %s"
-#: ../eval.c:16763
-#, c-format
-msgid "E741: Value is locked: %s"
-msgstr "E741: Arvo on lukittu: %s"
-
-#: ../eval.c:16764 ../eval.c:16769 ../message.c:1839
-msgid "Unknown"
-msgstr "Tuntematon"
-
-#: ../eval.c:16768
-#, c-format
-msgid "E742: Cannot change value of %s"
-msgstr "E742: Ei voi muuttaa muuttujan %s arvoa"
-
-#: ../eval.c:16838
msgid "E698: variable nested too deep for making a copy"
-msgstr "E698: muuttuja on upotettu liian syvไlle kopioitavaksi"
+msgstr "E698: muuttuja on upotettu liian syvรคlle kopioitavaksi"
-#: ../eval.c:17249
#, c-format
msgid "E123: Undefined function: %s"
msgstr "E123: Tuntematon funktio: %s"
-#: ../eval.c:17260
#, c-format
msgid "E124: Missing '(': %s"
msgstr "E124: ( puuttuu: %s"
-#: ../eval.c:17293
-#, fuzzy
msgid "E862: Cannot use g: here"
-msgstr "E284: Ei voi asettaa IC-arvoja"
+msgstr "E862: g: ei toimi tรครคllรค"
-#: ../eval.c:17312
-#, c-format
-msgid "E125: Illegal argument: %s"
-msgstr "E125: Virheellinen argumentti: %s"
-
-#: ../eval.c:17323
#, fuzzy, c-format
-msgid "E853: Duplicate argument name: %s"
-msgstr "Kaksoiskappale kentไn nimestไ: %s"
+#~ msgid "E932: Closure function should not be at top level: %s"
+#~ msgstr "E932 Sulkeumafunktio ei voi olla uloimmalla tasolla: %s"
-#: ../eval.c:17416
msgid "E126: Missing :endfunction"
msgstr "E126: :endfunction puuttuu"
-#: ../eval.c:17537
#, c-format
msgid "E707: Function name conflicts with variable: %s"
msgstr "E707: Funktion nimi on ristiriidassa muuttujan kanssa: %s"
-#: ../eval.c:17549
#, c-format
msgid "E127: Cannot redefine function %s: It is in use"
-msgstr "E127: Funktiota %s ei voi mไไritellไ uudestaan, koska se on kไyt๖ssไ"
+msgstr "E127: Funktiota %s ei voi mรครคritellรค uudestaan, koska se on kรคytรถssรค"
-#: ../eval.c:17604
#, c-format
msgid "E746: Function name does not match script file name: %s"
msgstr "E746: Funktion nimi ei ole sama kuin skriptin tiedostonnimi: %s"
-#: ../eval.c:17716
msgid "E129: Function name required"
msgstr "E129: Funktion nimi puuttuu"
-#: ../eval.c:17824
-#, fuzzy, c-format
+#, c-format
msgid "E128: Function name must start with a capital or \"s:\": %s"
-msgstr ""
-"E128: Funktion nimen pitไไ alkaa suuraakkosella tai sisไltไไ kaksoispisteen: "
-"%s"
+msgstr "E128: Funktion nimen pitรครค alkaa suuraakkosella tai merkeillรค โ€™s:โ€™: %s"
-#: ../eval.c:17833
-#, fuzzy, c-format
+#, c-format
msgid "E884: Function name cannot contain a colon: %s"
-msgstr ""
-"E128: Funktion nimen pitไไ alkaa suuraakkosella tai sisไltไไ kaksoispisteen: "
-"%s"
+msgstr "E884: Funktion nimessรค ei saa olla kaksoispistettรค: %s"
-#: ../eval.c:18336
#, c-format
msgid "E131: Cannot delete function %s: It is in use"
msgstr "E131: Funktiota %s ei voi poistaa"
-#: ../eval.c:18441
+#, fuzzy, c-format
+#~ msgid "Cannot delete function %s: It is being used internally"
+#~ msgstr "E131: Funktiota %s ei voi poistaa"
+
msgid "E132: Function call depth is higher than 'maxfuncdepth'"
-msgstr "E132: Funktiokutsujen syvyys on enemmไn kuin maxfuncdepth"
+msgstr "E132: Funktiokutsujen syvyys on enemmรคn kuin maxfuncdepth"
-#: ../eval.c:18568
#, c-format
msgid "calling %s"
msgstr "kutsutaan funktiota %s"
-#: ../eval.c:18651
#, c-format
msgid "%s aborted"
msgstr "%s keskeytettiin"
-#: ../eval.c:18653
-#, c-format
-msgid "%s returning #%<PRId64>"
-msgstr "%s palaa kohdassa #%<PRId64>"
+#, fuzzy, c-format
+#~ msgid "%s returning #%<PRId64>"
+#~ msgstr "%s palaa kohdassa #%ld"
-#: ../eval.c:18670
#, c-format
msgid "%s returning %s"
msgstr "%s palaa kohdassa %s"
-#: ../eval.c:18691 ../ex_cmds2.c:2695
#, c-format
msgid "continuing in %s"
msgstr "jatkaa kohdassa %s"
-#: ../eval.c:18795
msgid "E133: :return not inside a function"
-msgstr "E133: :return ei ole funktion sisไllไ"
-
-#: ../eval.c:19159
-msgid ""
-"\n"
-"# global variables:\n"
-msgstr ""
-"\n"
-"# globaalit muuttujat:\n"
+msgstr "E133: :return ei ole funktion sisรคllรค"
-#: ../eval.c:19254
msgid ""
"\n"
"\tLast set from "
@@ -1045,154 +1084,408 @@ msgstr ""
"\n"
"\tViimeksi asetettu kohteesta "
-#: ../eval.c:19272
msgid "No old files"
msgstr "Ei vanhoja tiedostoja"
-# puhutaan merkin ulkoasusta snprintf(..., c, c, c, c)
-#: ../ex_cmds.c:122
#, c-format
-msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
-msgstr "<%s>%s%s %d, heksana %02x, oktaalina %03o"
+#~ msgid "E474: Expected comma before list item: %s"
+#~ msgstr ""
-#: ../ex_cmds.c:145
#, c-format
-msgid "> %d, Hex %04x, Octal %o"
-msgstr "> %d, heksana %04x, oktaalina %o"
+#~ msgid "E474: Expected colon before dictionary value: %s"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "E474: Expected string key: %s"
+#~ msgstr "E415: odotuksenvastainen =-merkki: %s"
+
+#, fuzzy, c-format
+#~ msgid "E474: Expected comma before dictionary key: %s"
+#~ msgstr "E722: Sanakirjasta puuttuu pilkku: %s"
+
+#, fuzzy, c-format
+#~ msgid "E474: Unfinished escape sequence: %.*s"
+#~ msgstr "E540: Sulkematon lausekesarja"
-#: ../ex_cmds.c:146
#, c-format
-msgid "> %d, Hex %08x, Octal %o"
-msgstr "> %d, hekdana %08x, oktaalina %o"
+#~ msgid "E474: Unfinished unicode escape sequence: %.*s"
+#~ msgstr ""
-#: ../ex_cmds.c:684
-msgid "E134: Move lines into themselves"
-msgstr "E134: Rivien siirto itsejensไ pไไlle"
+#, c-format
+#~ msgid "E474: Expected four hex digits after \\u: %.*s"
+#~ msgstr ""
-#: ../ex_cmds.c:747
-msgid "1 line moved"
-msgstr "1 rivi siirretty"
+#, fuzzy, c-format
+#~ msgid "E474: Unknown escape sequence: %.*s"
+#~ msgstr "E409: Tuntematon ryhmรคn nimi: %s"
-#: ../ex_cmds.c:749
#, c-format
-msgid "%<PRId64> lines moved"
-msgstr "%<PRId64> riviไ siirretty"
+#~ msgid "E474: ASCII control characters cannot be present inside string: %.*s"
+#~ msgstr ""
-#: ../ex_cmds.c:1175
#, c-format
-msgid "%<PRId64> lines filtered"
-msgstr "%<PRId64> riviไ suodatettu"
+#~ msgid "E474: Only UTF-8 strings allowed: %.*s"
+#~ msgstr ""
-#: ../ex_cmds.c:1194
-msgid "E135: *Filter* Autocommands must not change current buffer"
-msgstr "E135: *Filter*-autocommand ei voi vaihtaa puskuria"
+#, c-format
+#~ msgid ""
+#~ "E474: Only UTF-8 code points up to U+10FFFF are allowed to appear unescaped: "
+#~ "%.*s"
+#~ msgstr ""
-#: ../ex_cmds.c:1244
-msgid "[No write since last change]\n"
-msgstr "[Viimeisintไ muutosta ei ole kirjoitettu]\n"
+#, fuzzy, c-format
+#~ msgid "E474: Expected string end: %.*s"
+#~ msgstr "E415: odotuksenvastainen =-merkki: %s"
+
+#, fuzzy, c-format
+#~ msgid "E474: Leading zeroes are not allowed: %.*s"
+#~ msgstr "E786: Aluetta ei voi kรคyttรครค"
+
+#, fuzzy, c-format
+#~ msgid "E474: Missing number after minus sign: %.*s"
+#~ msgstr "E526: Lukuarvo puuttuu merkkijonon <%s> jรคlkeen"
+
+#, fuzzy, c-format
+#~ msgid "E474: Missing number after decimal dot: %.*s"
+#~ msgstr "E526: Lukuarvo puuttuu merkkijonon <%s> jรคlkeen"
+
+#, fuzzy, c-format
+#~ msgid "E474: Missing exponent: %.*s"
+#~ msgstr "E114: Puuttuva lainausmerkki: %s"
+
+#, c-format
+#~ msgid ""
+#~ "E685: internal error: while converting number \"%.*s\" to float string2float "
+#~ "consumed %zu bytes in place of %zu"
+#~ msgstr ""
-#: ../ex_cmds.c:1424
#, c-format
-msgid "%sviminfo: %s in line: "
-msgstr "%sviminfo: %s rivillไ: "
+#~ msgid ""
+#~ "E685: internal error: while converting number \"%.*s\" to integer vim_str2nr "
+#~ "consumed %i bytes in place of %zu"
+#~ msgstr ""
-#: ../ex_cmds.c:1431
-msgid "E136: viminfo: Too many errors, skipping rest of file"
-msgstr "E136: viminfo: liikaa virheitไ, ohitetaan lopputiedosto"
+#~ msgid "E474: Attempt to decode a blank string"
+#~ msgstr ""
-#: ../ex_cmds.c:1458
#, c-format
-msgid "Reading viminfo file \"%s\"%s%s%s"
-msgstr "Luetaan viminfo-tiedostoa \"%s\"%s%s%s"
+#~ msgid "E474: No container to close: %.*s"
+#~ msgstr ""
-#: ../ex_cmds.c:1460
-msgid " info"
-msgstr " info"
+#, c-format
+#~ msgid "E474: Closing list with curly bracket: %.*s"
+#~ msgstr ""
-#: ../ex_cmds.c:1461
-msgid " marks"
-msgstr " merkit"
+#, fuzzy, c-format
+#~ msgid "E474: Closing dictionary with square bracket: %.*s"
+#~ msgstr "E725: dict-funktio ilman sanakirjaa: %s"
-#: ../ex_cmds.c:1462
-msgid " oldfiles"
-msgstr " vanhaatiedostoa"
+#, fuzzy, c-format
+#~ msgid "E474: Trailing comma: %.*s"
+#~ msgstr "E488: Ylimรครคrรคisiรค merkkejรค perรคssรค"
-#: ../ex_cmds.c:1463
-msgid " FAILED"
-msgstr " EPฤONNISTUI"
+#, c-format
+#~ msgid "E474: Expected value after colon: %.*s"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "E474: Expected value: %.*s"
+#~ msgstr "E415: odotuksenvastainen =-merkki: %s"
-#. avoid a wait_return for this message, it's annoying
-#: ../ex_cmds.c:1541
#, c-format
-msgid "E137: Viminfo file is not writable: %s"
-msgstr "E137: Viminfo-tiedostoon ei voitu kirjoittaa: %s"
+#~ msgid "E474: Comma not inside container: %.*s"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "E474: Duplicate comma: %.*s"
+#~ msgstr "E721: Kaksi samaa avainta sanakirjassa: %s"
+
+#, fuzzy, c-format
+#~ msgid "E474: Comma after colon: %.*s"
+#~ msgstr "E254: Vรคriรค %s ei voi mรครคritellรค"
+
+#, fuzzy, c-format
+#~ msgid "E474: Using comma in place of colon: %.*s"
+#~ msgstr "E722: Sanakirjasta puuttuu pilkku: %s"
-#: ../ex_cmds.c:1626
#, c-format
-msgid "E138: Can't write viminfo file %s!"
-msgstr "E138: Viminfo-tiedoston kirjoittaminen ei onnistu %s"
+#~ msgid "E474: Leading comma: %.*s"
+#~ msgstr ""
-#: ../ex_cmds.c:1635
#, c-format
-msgid "Writing viminfo file \"%s\""
-msgstr "Kirjoitetaan viminfo-tiedostoa %s"
+#~ msgid "E474: Colon not inside container: %.*s"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "E474: Using colon not in dictionary: %.*s"
+#~ msgstr "E720: Sanakirjasta puuttuu kaksoispiste: %s"
+
+#, fuzzy, c-format
+#~ msgid "E474: Unexpected colon: %.*s"
+#~ msgstr "E415: odotuksenvastainen =-merkki: %s"
-#. Write the info:
-#: ../ex_cmds.c:1720
#, c-format
-msgid "# This viminfo file was generated by Vim %s.\n"
-msgstr "# Vimin %s generoima viminfo-tiedosto.\n"
+#~ msgid "E474: Colon after comma: %.*s"
+#~ msgstr ""
-#: ../ex_cmds.c:1722
-msgid ""
-"# You may edit it if you're careful!\n"
-"\n"
-msgstr ""
-"# Muokkaa varovasti!\n"
-"\n"
+#, fuzzy, c-format
+#~ msgid "E474: Duplicate colon: %.*s"
+#~ msgstr "E721: Kaksi samaa avainta sanakirjassa: %s"
+
+#, fuzzy, c-format
+#~ msgid "E474: Expected null: %.*s"
+#~ msgstr "E415: odotuksenvastainen =-merkki: %s"
+
+#, fuzzy, c-format
+#~ msgid "E474: Expected true: %.*s"
+#~ msgstr "E270: odotuksenvastainen redo"
+
+#, fuzzy, c-format
+#~ msgid "E474: Expected false: %.*s"
+#~ msgstr "E415: odotuksenvastainen =-merkki: %s"
+
+#, fuzzy, c-format
+#~ msgid "E474: Unidentified byte: %.*s"
+#~ msgstr "E121: Mรครคrittelemรคtรถn muuttuja: %s"
+
+#, fuzzy, c-format
+#~ msgid "E474: Trailing characters: %.*s"
+#~ msgstr "E488: Ylimรครคrรคisiรค merkkejรค perรคssรค"
+
+#, fuzzy, c-format
+#~ msgid "E474: Unexpected end of input: %.*s"
+#~ msgstr "E415: odotuksenvastainen =-merkki: %s"
+
+#, c-format
+#~ msgid "key %s"
+#~ msgstr ""
+
+#, c-format
+#~ msgid "key %s at index %i from special map"
+#~ msgstr ""
+
+#, c-format
+#~ msgid "index %i"
+#~ msgstr ""
+
+#~ msgid "partial"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "argument %i"
+#~ msgstr "-c-argumentti"
+
+#, fuzzy
+#~ msgid "partial self dictionary"
+#~ msgstr "ei voida muuttaa kiinnitettyรค sanakirjaa"
+
+#~ msgid "itself"
+#~ msgstr ""
+
+#. Only give this message once for a recursive call to avoid
+#. flooding the user with errors.
+#~ msgid "E724: unable to correctly dump variable with self-referencing container"
+#~ msgstr ""
+
+#~ msgid "E474: Unable to represent NaN value in JSON"
+#~ msgstr ""
+
+#~ msgid "E474: Unable to represent infinity in JSON"
+#~ msgstr ""
+
+#, c-format
+#~ msgid ""
+#~ "E474: String \"%.*s\" contains byte that does not start any UTF-8 character"
+#~ msgstr ""
+
+#, c-format
+#~ msgid ""
+#~ "E474: UTF-8 string contains code point which belongs to a surrogate pair: "
+#~ "%.*s"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "E474: Unable to convert EXT string to JSON"
+#~ msgstr "E620: Tulostuskoodaukseen %s muunto ei onnistu"
+
+#, c-format
+#~ msgid "E474: Error while dumping %s, %s: attempt to dump function reference"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "E474: Invalid key in special dictionary"
+#~ msgstr "E736: Virheellinen toiminto sanakirjalle"
+
+#, c-format
+#~ msgid "E5004: Error while dumping %s, %s: attempt to dump function reference"
+#~ msgstr ""
+
+#, c-format
+#~ msgid "E5005: Unable to dump %s: container references itself in %s"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "E684: list index out of range: %<PRId64>"
+#~ msgstr "E684: Indeksi %ld luettelon rajojen ulkopuolella"
-#: ../ex_cmds.c:1723
-msgid "# Value of 'encoding' when this file was written\n"
-msgstr "# encoding-muuttujan arvo tiedostoa kirjoitettaessa\n"
+#~ msgid "E6000: Argument is not a function or function name"
+#~ msgstr ""
+
+#, c-format
+msgid "E737: Key already exists: %s"
+msgstr "E737: Avain on jo olemassa: %s"
+
+#, fuzzy
+#~ msgid "tv_clear() argument"
+#~ msgstr "filter()-argumentti"
+
+msgid "E743: variable nested too deep for (un)lock"
+msgstr "E743: muuttujassa liian monta tasoa lukituksen kรคsittelyyn"
-#: ../ex_cmds.c:1800
-msgid "Illegal starting char"
-msgstr "Virheellinen aloitusmerkki"
+#, fuzzy, c-format
+#~ msgid "E741: Value is locked: %.*s"
+#~ msgstr "E741: Arvo on lukittu: %s"
+
+#, fuzzy, c-format
+#~ msgid "E742: Cannot change value of %.*s"
+#~ msgstr "E742: Ei voi muuttaa muuttujan %s arvoa"
+
+msgid "Unknown"
+msgstr "Tuntematon"
+
+#, fuzzy
+#~ msgid "E805: Expected a Number or a String, Float found"
+#~ msgstr "E807: Odotettiin Float-argumenttia printf():lle"
+
+#~ msgid "E703: Expected a Number or a String, Funcref found"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "E745: Expected a Number or a String, List found"
+#~ msgstr "E807: Odotettiin Float-argumenttia printf():lle"
+
+#~ msgid "E728: Expected a Number or a String, Dictionary found"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "E5300: Expected a Number or a String"
+#~ msgstr "E807: Odotettiin Float-argumenttia printf():lle"
+
+msgid "E745: Using a List as a Number"
+msgstr "E745: Lista ei kรคy Numberista"
+
+msgid "E728: Using a Dictionary as a Number"
+msgstr "E728: Sanakirja ei kรคy Numberista"
+
+msgid "E805: Using a Float as a Number"
+msgstr "E805: Float ei kรคy Numberista"
+
+#, fuzzy
+#~ msgid "E685: using an invalid value as a Number"
+#~ msgstr "E908: huono arvo merkkijonolle"
+
+msgid "E730: using List as a String"
+msgstr "E730: Lista ei kรคy merkkijonosta"
+
+msgid "E731: using Dictionary as a String"
+msgstr "E731: Sanakirja ei kรคy merkkijonosta"
+
+msgid "E908: using an invalid value as a String"
+msgstr "E908: huono arvo merkkijonolle"
+
+msgid "E891: Using a Funcref as a Float"
+msgstr "E891: Funcref ei kรคy Floatista"
+
+msgid "E892: Using a String as a Float"
+msgstr "E892: String ei kรคy Floatista"
+
+msgid "E893: Using a List as a Float"
+msgstr "E893: Lista ei kรคy Floatista"
+
+msgid "E894: Using a Dictionary as a Float"
+msgstr "E894: Sanakirja ei kรคy Floatista"
+
+msgid "E907: Using a special value as a Float"
+msgstr "E907: Kรคytettiin erikoisarvoa Floattina"
+
+msgid "E808: Number or Float required"
+msgstr "E808: Number tai Float vaaditaan"
+
+#, c-format
+msgid "line %ld: %s"
+msgstr "rivi %ld: %s"
+
+#, c-format
+msgid "Breakpoint in \"%s%s\" line %ld"
+msgstr "Katkaisukohta %s%s rivillรค %ld"
+
+#, c-format
+msgid "%3d %s %s line %ld"
+msgstr "%3d %s %s rivi %ld"
+
+# puhutaan merkin ulkoasusta snprintf(..., c, c, c, c)
+#, c-format
+msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
+msgstr "<%s>%s%s %d, heksana %02x, oktaalina %03o"
+
+#, c-format
+msgid "> %d, Hex %04x, Octal %o"
+msgstr "> %d, heksana %04x, oktaalina %o"
+
+#, c-format
+msgid "> %d, Hex %08x, Octal %o"
+msgstr "> %d, hekdana %08x, oktaalina %o"
+
+msgid "E134: Move lines into themselves"
+msgstr "E134: Rivien siirto itsejensรค pรครคlle"
+
+msgid "1 line moved"
+msgstr "1 rivi siirretty"
+
+#, fuzzy, c-format
+#~ msgid "%<PRId64> lines moved"
+#~ msgstr "%ld riviรค siirretty"
+
+#, c-format
+msgid "E482: Can't create file %s"
+msgstr "E482: Tiedostoa %s ei voi luoda"
+
+#, fuzzy, c-format
+#~ msgid "%<PRId64> lines filtered"
+#~ msgstr "%ld riviรค suodatettu"
+
+msgid "E135: *Filter* Autocommands must not change current buffer"
+msgstr "E135: *Filter*-autocommand ei voi vaihtaa puskuria"
+
+msgid "[No write since last change]\n"
+msgstr "[Viimeisintรค muutosta ei ole kirjoitettu]\n"
-#: ../ex_cmds.c:2162
msgid "Write partial file?"
msgstr "Kirjoita osittainen tiedosto"
-#: ../ex_cmds.c:2166
msgid "E140: Use ! to write partial buffer"
-msgstr "E140: Kไytไ !-komentoa osittaisen puskurin kirjoittamiseen"
+msgstr "E140: Kรคytรค !-komentoa osittaisen puskurin kirjoittamiseen"
-#: ../ex_cmds.c:2281
#, c-format
msgid "Overwrite existing file \"%s\"?"
msgstr "Ylikirjoitetaanko olemassaoleva tiedosto %s?"
-#: ../ex_cmds.c:2317
#, c-format
msgid "Swap file \"%s\" exists, overwrite anyway?"
msgstr "Swap-tiedosto %s on olemassa, ylikirjoitetaanko?"
-#: ../ex_cmds.c:2326
#, c-format
msgid "E768: Swap file exists: %s (:silent! overrides)"
msgstr "E768: Swap-tiedosto on jo olemassa: %s (komento :silent! ohittaa)"
-#: ../ex_cmds.c:2381
-#, c-format
-msgid "E141: No file name for buffer %<PRId64>"
-msgstr "E141: Ei tiedostonimeไ puskurille %<PRId64>"
+#, fuzzy, c-format
+#~ msgid "E141: No file name for buffer %<PRId64>"
+#~ msgstr "E141: Ei tiedostonimeรค puskurille %ld"
-#: ../ex_cmds.c:2412
msgid "E142: File not written: Writing is disabled by 'write' option"
msgstr ""
-"E142: Tiedostoa ei kirjoitettu; write-asetus poistaa kirjoituksen kไyt๖stไ"
+"E142: Tiedostoa ei kirjoitettu; write-asetus poistaa kirjoituksen kรคytรถstรค"
-#: ../ex_cmds.c:2434
#, c-format
msgid ""
"'readonly' option is set for \"%s\".\n"
@@ -1201,7 +1494,6 @@ msgstr ""
"readonly asetettu tiedostolle \"%s\".\n"
"Kirjoitetaanko?"
-#: ../ex_cmds.c:2439
#, c-format
msgid ""
"File permissions of \"%s\" are read-only.\n"
@@ -1210,799 +1502,597 @@ msgid ""
msgstr ""
"Tiedosto %s on kirjoitussuojattu.\n"
"Siihen saattaa voida silti kirjoittaa.\n"
-"Yritetไไnk๖?"
+"Yritetรครคnkรถ?"
-#: ../ex_cmds.c:2451
#, c-format
msgid "E505: \"%s\" is read-only (add ! to override)"
-msgstr "E505: %s on kirjoitussuojattu (lisไไ komentoon ! ohittaaksesi)"
+msgstr "E505: %s on kirjoitussuojattu (lisรครค komentoon ! ohittaaksesi)"
-#: ../ex_cmds.c:3120
#, c-format
msgid "E143: Autocommands unexpectedly deleted new buffer %s"
msgstr "E143: Autocommand poisti uuden puskurin odotuksen vastaisesti %s"
-#: ../ex_cmds.c:3313
msgid "E144: non-numeric argument to :z"
msgstr "E144: :z:n argumentti ei ole numero"
-#: ../ex_cmds.c:3404
-msgid "E145: Shell commands not allowed in rvim"
-msgstr "E145: Kuoren komennot eivไt toimi rvimissไ"
+#, fuzzy
+#~ msgid "E145: Shell commands not allowed in restricted mode"
+#~ msgstr "E145: Kuoren komennot eivรคt toimi rvimissรค"
-#: ../ex_cmds.c:3498
msgid "E146: Regular expressions can't be delimited by letters"
-msgstr "E146: Sไไnn๖llistไ ilmausta ei voi rajata kirjaimilla"
+msgstr "E146: Sรครคnnรถllistรค ilmausta ei voi rajata kirjaimilla"
-#: ../ex_cmds.c:3964
#, c-format
msgid "replace with %s (y/n/a/q/l/^E/^Y)?"
msgstr "korvaa kohteella %s (y/n/a/q/l/^E/^Y)?"
-#: ../ex_cmds.c:4379
msgid "(Interrupted) "
msgstr "(Keskeytetty)"
-#: ../ex_cmds.c:4384
msgid "1 match"
-msgstr "1 tไsmไys"
+msgstr "1 tรคsmรคys"
-#: ../ex_cmds.c:4384
msgid "1 substitution"
msgstr "1 korvaus"
-#: ../ex_cmds.c:4387
-#, c-format
-msgid "%<PRId64> matches"
-msgstr "%<PRId64> tไsmไystไ"
+#, fuzzy, c-format
+#~ msgid "%<PRId64> matches"
+#~ msgstr "%ld tรคsmรคystรค"
-#: ../ex_cmds.c:4388
-#, c-format
-msgid "%<PRId64> substitutions"
-msgstr "%<PRId64> korvausta"
+#, fuzzy, c-format
+#~ msgid "%<PRId64> substitutions"
+#~ msgstr "%ld korvausta"
-#: ../ex_cmds.c:4392
msgid " on 1 line"
-msgstr " 1 rivillไ"
+msgstr " 1 rivillรค"
-#: ../ex_cmds.c:4395
-#, c-format
-msgid " on %<PRId64> lines"
-msgstr " %<PRId64> rivillไ"
+#, fuzzy, c-format
+#~ msgid " on %<PRId64> lines"
+#~ msgstr " %ld rivillรค"
-#: ../ex_cmds.c:4438
-msgid "E147: Cannot do :global recursive"
+msgid "E147: Cannot do :global recursive with a range"
msgstr "E147: :globalia ei voi suorittaa rekursiivisesti"
-#: ../ex_cmds.c:4467
msgid "E148: Regular expression missing from global"
-msgstr "E148: Sไไnn๖llinen ilmaus puuttuu globaalista"
+msgstr "E148: Sรครคnnรถllinen ilmaus puuttuu globaalista"
-#: ../ex_cmds.c:4508
#, c-format
msgid "Pattern found in every line: %s"
-msgstr "Kuvio l๖ytyi joka riviltไ: %s"
+msgstr "Kuvio lรถytyi joka riviltรค: %s"
-#: ../ex_cmds.c:4510
-#, fuzzy, c-format
+#, c-format
msgid "Pattern not found: %s"
-msgstr "Kuviota ei l๖ydy"
-
-#: ../ex_cmds.c:4587
-msgid ""
-"\n"
-"# Last Substitute String:\n"
-"$"
-msgstr ""
-"\n"
-"# Viimeisin korvausmerkkijono:\n"
-"$"
+msgstr "Kuviota ei lรถydy: %s"
-#: ../ex_cmds.c:4679
msgid "E478: Don't panic!"
-msgstr "E478: ฤlไ panikoi."
+msgstr "E478: ร„lรค panikoi."
-#: ../ex_cmds.c:4717
#, c-format
msgid "E661: Sorry, no '%s' help for %s"
-msgstr "E661: Sori, ei l๖ydy %s-ohjetta kohteelle %s"
+msgstr "E661: ei lรถydy %s-ohjetta kohteelle %s"
-#: ../ex_cmds.c:4719
#, c-format
msgid "E149: Sorry, no help for %s"
-msgstr "E149: Sori, ei l๖ydy ohjetta kohteelle %s"
+msgstr "E149: ei lรถydy ohjetta kohteelle %s"
-#: ../ex_cmds.c:4751
#, c-format
msgid "Sorry, help file \"%s\" not found"
-msgstr "Sori, ohjetiedostoa %s ei l๖ydy"
+msgstr "ohjetiedostoa %s ei lรถydy"
-#: ../ex_cmds.c:5323
#, c-format
-msgid "E150: Not a directory: %s"
-msgstr "E150: Ei ole hakemisto: %s"
+msgid "E151: No match: %s"
+msgstr "E151: Ei tรคsmรครค: %s"
-#: ../ex_cmds.c:5446
#, c-format
msgid "E152: Cannot open %s for writing"
msgstr "E152: Ei voi avata tiedostoa %s kirjoittamista varten"
-#: ../ex_cmds.c:5471
#, c-format
msgid "E153: Unable to open %s for reading"
msgstr "E153: Ei voi avata tiedostoa %s lukemista varten"
-#: ../ex_cmds.c:5500
#, c-format
msgid "E670: Mix of help file encodings within a language: %s"
-msgstr "E670: Monia ohjetiedostokoodauksia kielessไ: %s"
+msgstr "E670: Monia ohjetiedostokoodauksia kielessรค: %s"
-#: ../ex_cmds.c:5565
#, c-format
msgid "E154: Duplicate tag \"%s\" in file %s/%s"
-msgstr "E154: Kaksoiskappale tไgistไ %s tiedostossa %s/%s"
+msgstr "E154: Kaksoiskappale tรคgistรค %s tiedostossa %s/%s"
+
+#, c-format
+msgid "E150: Not a directory: %s"
+msgstr "E150: Ei ole hakemisto: %s"
-#: ../ex_cmds.c:5687
#, c-format
msgid "E160: Unknown sign command: %s"
msgstr "E160: Tuntematon merkkikomento: %s"
-#: ../ex_cmds.c:5704
msgid "E156: Missing sign name"
msgstr "E156: Merkki puuttuu"
-#: ../ex_cmds.c:5746
msgid "E612: Too many signs defined"
-msgstr "E612: Liikaa merkkejไ mไไritelty"
+msgstr "E612: Liikaa merkkejรค mรครคritelty"
-#: ../ex_cmds.c:5813
#, c-format
msgid "E239: Invalid sign text: %s"
msgstr "E239: Virheellinen merkkiteksti: %s"
-#: ../ex_cmds.c:5844 ../ex_cmds.c:6035
#, c-format
msgid "E155: Unknown sign: %s"
msgstr "E155: Tuntematon merkki: %s"
-#: ../ex_cmds.c:5877
msgid "E159: Missing sign number"
msgstr "E159: Merkin numero puuttuu"
-#: ../ex_cmds.c:5971
#, c-format
msgid "E158: Invalid buffer name: %s"
msgstr "E158: Virheellinen puskurin nimi: %s"
-#: ../ex_cmds.c:6008
+msgid "E934: Cannot jump to a buffer that does not have a name"
+msgstr "E934: Ei voida hypรคtรค puskuriin jolla ei ole nimeรค"
+
+#, fuzzy, c-format
+#~ msgid "E157: Invalid sign ID: %<PRId64>"
+#~ msgstr "E157: Virheellinen merkin tunnus: %ld"
+
#, c-format
-msgid "E157: Invalid sign ID: %<PRId64>"
-msgstr "E157: Virheellinen merkin tunnus: %<PRId64>"
+msgid "E885: Not possible to change sign %s"
+msgstr "E885: Ei voida muuttaa merkkiรค %s"
-#: ../ex_cmds.c:6066
msgid " (not supported)"
msgstr " (ei tuettu)"
-#: ../ex_cmds.c:6169
msgid "[Deleted]"
msgstr "[Poistettu]"
-#: ../ex_cmds2.c:139
msgid "Entering Debug mode. Type \"cont\" to continue."
-msgstr "Siirrytไไn vianetsintไtilaan, kirjoita cont jatkaaksesi."
+msgstr "Siirrytรครคn vianetsintรคtilaan, kirjoita cont jatkaaksesi."
-#: ../ex_cmds2.c:143 ../ex_docmd.c:759
-#, c-format
-msgid "line %<PRId64>: %s"
-msgstr "rivi %<PRId64>: %s"
+#, fuzzy, c-format
+#~ msgid "line %<PRId64>: %s"
+#~ msgstr "rivi %ld: %s"
-#: ../ex_cmds2.c:145
#, c-format
msgid "cmd: %s"
msgstr "kmnt: %s"
-#: ../ex_cmds2.c:322
+msgid "frame is zero"
+msgstr "kehys on nolla"
+
#, c-format
-msgid "Breakpoint in \"%s%s\" line %<PRId64>"
-msgstr "Katkaisukohta %s%s rivillไ %<PRId64>"
+msgid "frame at highest level: %d"
+msgstr "kehys ylimmรคllรค tasolla: %d"
+
+#, fuzzy, c-format
+#~ msgid "Breakpoint in \"%s%s\" line %<PRId64>"
+#~ msgstr "Katkaisukohta %s%s rivillรค %ld"
-#: ../ex_cmds2.c:581
#, c-format
msgid "E161: Breakpoint not found: %s"
msgstr "E161: Katkaisukohta puuttuu: %s"
-#: ../ex_cmds2.c:611
msgid "No breakpoints defined"
msgstr "Ei katkaisukohtia"
-#: ../ex_cmds2.c:617
-#, c-format
-msgid "%3d %s %s line %<PRId64>"
-msgstr "%3d %s %s rivi %<PRId64>"
+#, fuzzy, c-format
+#~ msgid "%3d %s %s line %<PRId64>"
+#~ msgstr "%3d %s %s rivi %ld"
-#: ../ex_cmds2.c:942
msgid "E750: First use \":profile start {fname}\""
-msgstr "E750: Aloita kไskyllไ :profile start {fname}"
+msgstr "E750: Aloita kรคskyllรค :profile start {fname}"
-#: ../ex_cmds2.c:1269
#, c-format
msgid "Save changes to \"%s\"?"
msgstr "Tallennetaanko muutokset tiedostoon %s?"
-#: ../ex_cmds2.c:1271 ../ex_docmd.c:8851
msgid "Untitled"
-msgstr "Nimet๖n"
+msgstr "Nimetรถn"
-#: ../ex_cmds2.c:1421
#, c-format
msgid "E162: No write since last change for buffer \"%s\""
-msgstr "E162: Muutoksia ei ole kirjoitettu puskurin %s viime muutoksen jไlkeen"
+msgstr "E162: Muutoksia ei ole kirjoitettu puskurin %s viime muutoksen jรคlkeen"
-#: ../ex_cmds2.c:1480
msgid "Warning: Entered other buffer unexpectedly (check autocommands)"
msgstr "Varoitus: Puskuri vaihtui odottamatta (tarkista autocommands)"
-#: ../ex_cmds2.c:1826
msgid "E163: There is only one file to edit"
msgstr "E163: Vain yksi tiedosto muokattavana"
-#: ../ex_cmds2.c:1828
msgid "E164: Cannot go before first file"
-msgstr "E164: Ensimmไisen tiedoston ohi ei voi mennไ"
+msgstr "E164: Ensimmรคisen tiedoston ohi ei voi mennรค"
-#: ../ex_cmds2.c:1830
msgid "E165: Cannot go beyond last file"
-msgstr "E165: Viimeisen tiedoston ohi ei voi mennไ"
+msgstr "E165: Viimeisen tiedoston ohi ei voi mennรค"
-#: ../ex_cmds2.c:2175
#, c-format
msgid "E666: compiler not supported: %s"
-msgstr "E666: kไไntไjไไ ei tueta: %s"
+msgstr "E666: kรครคntรคjรครค ei tueta: %s"
-#: ../ex_cmds2.c:2257
#, c-format
msgid "Searching for \"%s\" in \"%s\""
-msgstr "Etsitไไn ilmausta %s kohteesta %s"
+msgstr "Etsitรครคn ilmausta %s kohteesta %s"
-#: ../ex_cmds2.c:2284
#, c-format
msgid "Searching for \"%s\""
-msgstr "Etsitไไn ilmausta %s"
+msgstr "Etsitรครคn ilmausta %s"
-#: ../ex_cmds2.c:2307
#, c-format
-msgid "not found in 'runtimepath': \"%s\""
-msgstr "ei l๖ydy runtimepathista: %s"
+msgid "not found in '%s': \"%s\""
+msgstr "'%s' ei lรถydy kohteesta: %s"
-#: ../ex_cmds2.c:2472
#, c-format
msgid "Cannot source a directory: \"%s\""
msgstr "Hakemistoa ei voi ladata: %s"
-#: ../ex_cmds2.c:2518
#, c-format
msgid "could not source \"%s\""
msgstr "ei voitu ladata %s"
-#: ../ex_cmds2.c:2520
-#, c-format
-msgid "line %<PRId64>: could not source \"%s\""
-msgstr "rivi %<PRId64>: ei voitu ladata %s"
+#, fuzzy, c-format
+#~ msgid "line %<PRId64>: could not source \"%s\""
+#~ msgstr "rivi %ld: ei voitu ladata %s"
-#: ../ex_cmds2.c:2535
#, c-format
msgid "sourcing \"%s\""
msgstr "ladataan %s"
-#: ../ex_cmds2.c:2537
-#, c-format
-msgid "line %<PRId64>: sourcing \"%s\""
-msgstr "rivi %<PRId64>: ladataan %s"
+#, fuzzy, c-format
+#~ msgid "line %<PRId64>: sourcing \"%s\""
+#~ msgstr "rivi %ld: ladataan %s"
-#: ../ex_cmds2.c:2693
#, c-format
msgid "finished sourcing %s"
msgstr "ladattu %s"
-#: ../ex_cmds2.c:2765
msgid "modeline"
msgstr "mode-rivi"
-#: ../ex_cmds2.c:2767
msgid "--cmd argument"
msgstr "--cmd-argumentti"
-#: ../ex_cmds2.c:2769
msgid "-c argument"
msgstr "-c-argumentti"
-#: ../ex_cmds2.c:2771
msgid "environment variable"
-msgstr "ympไrist๖muuttuja"
+msgstr "ympรคristรถmuuttuja"
-#: ../ex_cmds2.c:2773
msgid "error handler"
-msgstr "virhekไsittelin"
+msgstr "virhekรคsittelin"
-#: ../ex_cmds2.c:3020
msgid "W15: Warning: Wrong line separator, ^M may be missing"
-msgstr "W15: Varoitus: Vไไrไ rivierotin, ^M saattaa puuttua"
+msgstr "W15: Varoitus: Vรครคrรค rivierotin, ^M saattaa puuttua"
-#: ../ex_cmds2.c:3139
msgid "E167: :scriptencoding used outside of a sourced file"
msgstr "E167: :scriptencoding ladatun tiedoston ulkopuolella"
-#: ../ex_cmds2.c:3166
msgid "E168: :finish used outside of a sourced file"
msgstr "E168: :finish ladatun tiedoston ulkopuolella"
-#: ../ex_cmds2.c:3389
#, c-format
msgid "Current %slanguage: \"%s\""
-msgstr "Kไyt๖ssไ oleva %skieli: %s"
+msgstr "Kรคytรถssรค oleva %skieli: %s"
-#: ../ex_cmds2.c:3404
#, c-format
msgid "E197: Cannot set language to \"%s\""
-msgstr "E197: Kieleksi ei voitu asettaa kieltไ %s"
+msgstr "E197: Kieleksi ei voitu asettaa kieltรค %s"
#. don't redisplay the window
#. don't wait for return
-#: ../ex_docmd.c:387
msgid "Entering Ex mode. Type \"visual\" to go to Normal mode."
-msgstr "Siirrytไไn Ex-tilaan, kirjoita visual palataksesi normaaliin tilaan."
+msgstr "Siirrytรครคn Ex-tilaan, kirjoita visual palataksesi normaaliin tilaan."
-#: ../ex_docmd.c:428
msgid "E501: At end-of-file"
msgstr "E501: Tiedoston lopussa"
-#: ../ex_docmd.c:513
msgid "E169: Command too recursive"
msgstr "E169: Liian rekursiivinen komento"
-#: ../ex_docmd.c:1006
+#, fuzzy
+#~ msgid "line %"
+#~ msgstr "rivi %ld"
+
#, c-format
msgid "E605: Exception not caught: %s"
msgstr "E605: Kiinniottamaton poikkeus: %s"
-#: ../ex_docmd.c:1085
msgid "End of sourced file"
msgstr "Ladatun tiedoston loppu"
-#: ../ex_docmd.c:1086
msgid "End of function"
msgstr "Funktion loppu"
-#: ../ex_docmd.c:1628
msgid "E464: Ambiguous use of user-defined command"
-msgstr "E464: Kไyttไjไn mไไrittelemไn komennon monimerkityksinen kไytt๖"
+msgstr "E464: Kรคyttรคjรคn mรครคrittelemรคn komennon monimerkityksinen kรคyttรถ"
-#: ../ex_docmd.c:1638
msgid "E492: Not an editor command"
msgstr "E492: Ei ole editorikomento"
-#: ../ex_docmd.c:1729
msgid "E493: Backwards range given"
msgstr "E493: Takaperoinen arvoalue annettu"
-#: ../ex_docmd.c:1733
msgid "Backwards range given, OK to swap"
-msgstr "Takaperoinen arvoalue annettu, OK kไไntไไ"
+msgstr "Takaperoinen arvoalue annettu, OK kรครคntรครค"
#. append
#. typed wrong
-#: ../ex_docmd.c:1787
msgid "E494: Use w or w>>"
-msgstr "E494: Kไytไ w:tไ tai w>>:aa"
+msgstr "E494: Kรคytรค w:tรค tai w>>:aa"
-#: ../ex_docmd.c:3454
-msgid "E319: The command is not available in this version"
-msgstr "E319: Komento ei ole kไytettไvissไ tไssไ versiossa"
-
-#: ../ex_docmd.c:3752
-msgid "E172: Only one file name allowed"
-msgstr "E172: Vain yksi tiedostonimi sallitaan"
+#, fuzzy
+#~ msgid "E319: The command is not available in this version"
+#~ msgstr "E319: Komento ei ole kรคytettรคvissรค tรคssรค versiossa"
-#: ../ex_docmd.c:4238
msgid "1 more file to edit. Quit anyway?"
-msgstr "vielไ 1 tiedosto muokattavana, lopetaanko silti?"
+msgstr "vielรค 1 tiedosto muokattavana, lopetaanko silti?"
-#: ../ex_docmd.c:4242
#, c-format
msgid "%d more files to edit. Quit anyway?"
-msgstr "vielไ %d tiedostoa muokattavana, lopetetaanko silti?"
+msgstr "vielรค %d tiedostoa muokattavana, lopetetaanko silti?"
-#: ../ex_docmd.c:4248
msgid "E173: 1 more file to edit"
-msgstr "E173: vielไ 1 tiedosto muokattavana"
+msgstr "E173: vielรค 1 tiedosto muokattavana"
-#: ../ex_docmd.c:4250
-#, c-format
-msgid "E173: %<PRId64> more files to edit"
-msgstr "E173: vielไ %<PRId64> tiedostoa muokattavana"
+#, fuzzy, c-format
+#~ msgid "E173: %<PRId64> more files to edit"
+#~ msgstr "E173: vielรค %ld tiedostoa muokattavana"
-#: ../ex_docmd.c:4320
msgid "E174: Command already exists: add ! to replace it"
-msgstr "E174: Komento on jo olemassa, kไytไ !:ไ korvataksesi"
+msgstr "E174: Komento on jo olemassa, kรคytรค !:รค korvataksesi"
-#: ../ex_docmd.c:4432
msgid ""
"\n"
-" Name Args Range Complete Definition"
+" Name Args Address Complete Definition"
msgstr ""
"\n"
-" Nimi Arg Arvot Valmis Mไไritelmไ"
+" Nimi Argumentit Osoite Valmis Mรครคritelmรค"
-#: ../ex_docmd.c:4516
msgid "No user-defined commands found"
-msgstr "Ei kไyttไjไn mไไrittelemiไ komentoja"
+msgstr "Ei kรคyttรคjรคn mรครคrittelemiรค komentoja"
-#: ../ex_docmd.c:4538
msgid "E175: No attribute specified"
-msgstr "E175: Ei attribuutteja mไไriteltynไ"
+msgstr "E175: Ei attribuutteja mรครคriteltynรค"
-#: ../ex_docmd.c:4583
msgid "E176: Invalid number of arguments"
-msgstr "E176: Vไไrไ mไไrไ attribuutteja"
+msgstr "E176: Vรครคrรค mรครคrรค attribuutteja"
-#: ../ex_docmd.c:4594
msgid "E177: Count cannot be specified twice"
-msgstr "E177: Lukumไไrไไ ei voi mไไritellไ kahdesti"
+msgstr "E177: Lukumรครคrรครค ei voi mรครคritellรค kahdesti"
-#: ../ex_docmd.c:4603
msgid "E178: Invalid default value for count"
-msgstr "E178: Lukumไไrไn oletusarvo on vไไrไ"
+msgstr "E178: Lukumรครคrรคn oletusarvo on vรครคrรค"
-#: ../ex_docmd.c:4625
msgid "E179: argument required for -complete"
msgstr "E179: -complete vaatii argumentin"
-#: ../ex_docmd.c:4635
+msgid "E179: argument required for -addr"
+msgstr "E179: -addr vaatii argumentin"
+
#, c-format
msgid "E181: Invalid attribute: %s"
msgstr "E181: Virheellinen attribuutti: %s"
-#: ../ex_docmd.c:4678
msgid "E182: Invalid command name"
msgstr "E182: Virheellinen komennon nimi"
-#: ../ex_docmd.c:4691
msgid "E183: User defined commands must start with an uppercase letter"
-msgstr "E183: Kไyttไjไn mไไrittelemไn komennon pitไไ alkaa suuraakkosella"
+msgstr "E183: Kรคyttรคjรคn mรครคrittelemรคn komennon pitรครค alkaa suuraakkosella"
-#: ../ex_docmd.c:4696
-#, fuzzy
msgid "E841: Reserved name, cannot be used for user defined command"
-msgstr "E464: Kไyttไjไn mไไrittelemไn komennon monimerkityksinen kไytt๖"
+msgstr "E841: Varattua nimeรค ei voi kรคyttรครค kรคyttรคjรคn mรครคrittelemรคnรค komentona"
-#: ../ex_docmd.c:4751
#, c-format
msgid "E184: No such user-defined command: %s"
-msgstr "E184: Kไyttไjไn komentoa ei ole olemassa: %s"
+msgstr "E184: Kรคyttรคjรคn komentoa ei ole olemassa: %s"
+
+#, c-format
+msgid "E180: Invalid address type value: %s"
+msgstr "E180: Virheellinen osoitetyyppiarvo: %s"
-#: ../ex_docmd.c:5219
#, c-format
msgid "E180: Invalid complete value: %s"
-msgstr "E180: Virheellinen tไydennysarvo: %s"
+msgstr "E180: Virheellinen tรคydennysarvo: %s"
-#: ../ex_docmd.c:5225
msgid "E468: Completion argument only allowed for custom completion"
-msgstr "E468: Tไydennysargumentti sopii vain itse mไไriteltyyn tไydennykseen"
+msgstr "E468: Tรคydennysargumentti sopii vain itse mรครคriteltyyn tรคydennykseen"
-#: ../ex_docmd.c:5231
msgid "E467: Custom completion requires a function argument"
-msgstr "E467: Itse mไไritelty tไydennys vaatii funktioargumentin"
+msgstr "E467: Itse mรครคritelty tรคydennys vaatii funktioargumentin"
-#: ../ex_docmd.c:5257
-#, fuzzy, c-format
+#, c-format
msgid "E185: Cannot find color scheme '%s'"
-msgstr "E185: Vไriteemaa %s ei l๖ydy"
+msgstr "E185: Vรคriteemaa %s ei lรถydy"
-#: ../ex_docmd.c:5263
msgid "Greetings, Vim user!"
-msgstr "Tervehdys, Vimin kไyttไjไ."
+msgstr "Tervehdys, Vimin kรคyttรคjรค."
-#: ../ex_docmd.c:5431
msgid "E784: Cannot close last tab page"
-msgstr "E784: Viimeistไ vไlilehteไ ei voi sulkea"
+msgstr "E784: Viimeistรค vรคlilehteรค ei voi sulkea"
-#: ../ex_docmd.c:5462
msgid "Already only one tab page"
-msgstr "Vain yksi vไlilehti jไljellไ enไไ"
+msgstr "Vain yksi vรคlilehti jรคljellรค enรครค"
-#: ../ex_docmd.c:6004
#, c-format
msgid "Tab page %d"
msgstr "Tabisivu %d"
-#: ../ex_docmd.c:6295
msgid "No swap file"
msgstr "Ei swap-tiedostoa"
-#: ../ex_docmd.c:6478
-msgid "E747: Cannot change directory, buffer is modified (add ! to override)"
-msgstr ""
-"E747: Hakemistoa ei voida muuttaa, puskuria on muokattu (lisไไ komentoon ! "
-"ohittaaksesi"
-
-#: ../ex_docmd.c:6485
msgid "E186: No previous directory"
-msgstr "E186: Ei edellistไ hakemistoa"
+msgstr "E186: Ei edellistรค hakemistoa"
-#: ../ex_docmd.c:6530
msgid "E187: Unknown"
msgstr "E187: Tuntematon"
-#: ../ex_docmd.c:6610
msgid "E465: :winsize requires two number arguments"
msgstr "E465: :winsize vaatii kaksi numeroargumenttia"
-#: ../ex_docmd.c:6655
-msgid "E188: Obtaining window position not implemented for this platform"
-msgstr "E188: Ikkunan sijainnin selvitys ei toimi tไllไ alustalla"
-
-#: ../ex_docmd.c:6662
-msgid "E466: :winpos requires two number arguments"
-msgstr "E466: :winpos vaatii kaksi lukuargumenttia"
-
-#: ../ex_docmd.c:7241
-#, c-format
-msgid "E739: Cannot create directory: %s"
-msgstr "E739: hakemistoa ei voi luoda: %s"
-
-#: ../ex_docmd.c:7268
#, c-format
msgid "E189: \"%s\" exists (add ! to override)"
-msgstr "E189: %s on jo olemassa (lisไไ komentoon ! ohittaaksesi)"
+msgstr "E189: %s on jo olemassa (lisรครค komentoon ! ohittaaksesi)"
-#: ../ex_docmd.c:7273
#, c-format
msgid "E190: Cannot open \"%s\" for writing"
msgstr "E190: Tiedostoa %s ei voitu avata kirjoittamista varten"
-#. set mark
-#: ../ex_docmd.c:7294
msgid "E191: Argument must be a letter or forward/backward quote"
-msgstr "E191: Argumentin eteen- tai taaksepไin lainaukseen pitไไ olla kirjain"
+msgstr "E191: Argumentin eteen- tai taaksepรคin lainaukseen pitรครค olla kirjain"
-#: ../ex_docmd.c:7333
msgid "E192: Recursive use of :normal too deep"
-msgstr "E192: :normalin liian syvไ rekursio"
+msgstr "E192: :normalin liian syvรค rekursio"
-#: ../ex_docmd.c:7807
msgid "E194: No alternate file name to substitute for '#'"
-msgstr "E194: Ei vaihtoehtoista tiedostonimeไ #:lle"
+msgstr "E194: Ei vaihtoehtoista tiedostonimeรค #:lle"
-#: ../ex_docmd.c:7841
msgid "E495: no autocommand file name to substitute for \"<afile>\""
msgstr "E495: ei autocommand-tiedostoa kohteelle <afile>"
-#: ../ex_docmd.c:7850
msgid "E496: no autocommand buffer number to substitute for \"<abuf>\""
msgstr "E496: ei autocommand-puskurinumeroa kohteelle <abuf>"
-#: ../ex_docmd.c:7861
msgid "E497: no autocommand match name to substitute for \"<amatch>\""
-msgstr "E497: ei autocommand-tไsmไysnimeไ kohteella <amatch>"
+msgstr "E497: ei autocommand-tรคsmรคysnimeรค kohteella <amatch>"
-#: ../ex_docmd.c:7870
msgid "E498: no :source file name to substitute for \"<sfile>\""
-msgstr "E498: ei :source-tiedostonimeไ kohteelle <sfile>"
+msgstr "E498: ei :source-tiedostonimeรค kohteelle <sfile>"
-#: ../ex_docmd.c:7876
-#, fuzzy
msgid "E842: no line number to use for \"<slnum>\""
-msgstr "E498: ei :source-tiedostonimeไ kohteelle <sfile>"
+msgstr "E842: ei rivinumeroa kohteelle <slnum>"
-#: ../ex_docmd.c:7903
#, fuzzy, c-format
-msgid "E499: Empty file name for '%' or '#', only works with \":p:h\""
-msgstr "E499: Tyhjไ tiedostonimi kohteissa % tai # toimii vain :p:h"
+#~ msgid "E499: Empty file name for '%' or '#', only works with \":p:h\""
+#~ msgstr "E499: Tyhjรค tiedostonimi kohteissa % tai # toimii vain :p:h"
-#: ../ex_docmd.c:7905
msgid "E500: Evaluates to an empty string"
-msgstr "E500: Loppuarvo on tyhjไ merkkijono"
-
-#: ../ex_docmd.c:8838
-msgid "E195: Cannot open viminfo file for reading"
-msgstr "E195: Viminfoa ei voi avata lukemista varten"
+msgstr "E500: Loppuarvo on tyhjรค merkkijono"
-#: ../ex_eval.c:464
msgid "E608: Cannot :throw exceptions with 'Vim' prefix"
-msgstr "E608: Vim-alkuisia poikkeuksia ei voi heittไไ :throw-komennolla"
+msgstr "E608: Vim-alkuisia poikkeuksia ei voi heittรครค :throw-komennolla"
#. always scroll up, don't overwrite
-#: ../ex_eval.c:496
#, c-format
msgid "Exception thrown: %s"
msgstr "Poikkeus heitetty: %s"
-#: ../ex_eval.c:545
+#. always scroll up, don't overwrite
#, c-format
msgid "Exception finished: %s"
msgstr "Poikkeus lopeteltu: %s"
-#: ../ex_eval.c:546
#, c-format
msgid "Exception discarded: %s"
msgstr "Poikkeus poistettu: %s"
-#: ../ex_eval.c:588 ../ex_eval.c:634
-#, c-format
-msgid "%s, line %<PRId64>"
-msgstr "%s, rivi %<PRId64>"
+#, fuzzy, c-format
+#~ msgid "%s, line %<PRId64>"
+#~ msgstr "%s, rivi %ld"
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:608
#, c-format
msgid "Exception caught: %s"
msgstr "Poikkeus otettu kiinni: %s"
-#: ../ex_eval.c:676
#, c-format
msgid "%s made pending"
msgstr "%s odotutettu"
-#: ../ex_eval.c:679
#, c-format
msgid "%s resumed"
msgstr "%s palautettu"
-#: ../ex_eval.c:683
#, c-format
msgid "%s discarded"
msgstr "%s poistettu"
-#: ../ex_eval.c:708
msgid "Exception"
msgstr "Poikkeus"
-#: ../ex_eval.c:713
msgid "Error and interrupt"
msgstr "Virhe ja keskeytys"
-#: ../ex_eval.c:715
msgid "Error"
msgstr "Virhe"
-#. if (pending & CSTP_INTERRUPT)
-#: ../ex_eval.c:717
msgid "Interrupt"
msgstr "Keskeytys"
-#: ../ex_eval.c:795
msgid "E579: :if nesting too deep"
msgstr "E579: liian monta kerrosta :if-komennossa"
-#: ../ex_eval.c:830
msgid "E580: :endif without :if"
msgstr "E580: :endif ilman komentoa :if"
-#: ../ex_eval.c:873
msgid "E581: :else without :if"
msgstr "E581: :else ilman komentoa :if"
-#: ../ex_eval.c:876
msgid "E582: :elseif without :if"
msgstr "E582: :elseif ilman komentoa :if"
-#: ../ex_eval.c:880
msgid "E583: multiple :else"
msgstr "E583: :else monta kertaa"
-#: ../ex_eval.c:883
msgid "E584: :elseif after :else"
-msgstr "E584: :elseif komennon :else jไlkeen"
+msgstr "E584: :elseif komennon :else jรคlkeen"
-#: ../ex_eval.c:941
msgid "E585: :while/:for nesting too deep"
msgstr "E585: liian monta tasoa :while- tai :for-komennoissa"
-#: ../ex_eval.c:1028
msgid "E586: :continue without :while or :for"
msgstr "E586: :continue ilman komentoa :while tai :for"
-#: ../ex_eval.c:1061
msgid "E587: :break without :while or :for"
msgstr "E587: :break ilman komentoa :while tai :for"
-#: ../ex_eval.c:1102
msgid "E732: Using :endfor with :while"
msgstr "E732: :endfor ilman komentoa :while"
-#: ../ex_eval.c:1104
msgid "E733: Using :endwhile with :for"
msgstr "E733: :endwhile ilman komentoa :for"
-#: ../ex_eval.c:1247
msgid "E601: :try nesting too deep"
msgstr "E601: liian monta tasoa :try-komennossa"
-#: ../ex_eval.c:1317
msgid "E603: :catch without :try"
msgstr "E603: :catch ilman komentoa :try"
-#. Give up for a ":catch" after ":finally" and ignore it.
-#. * Just parse.
-#: ../ex_eval.c:1332
msgid "E604: :catch after :finally"
msgstr "E604: :catch ilman komentoa :finally"
-#: ../ex_eval.c:1451
msgid "E606: :finally without :try"
msgstr "E606: :finally ilman komentoa :try"
-#. Give up for a multiple ":finally" and ignore it.
-#: ../ex_eval.c:1467
msgid "E607: multiple :finally"
msgstr "E607: :finally monta kertaa"
-#: ../ex_eval.c:1571
msgid "E602: :endtry without :try"
msgstr "E602: :endtry ilman komentoa :try"
-#: ../ex_eval.c:2026
msgid "E193: :endfunction not inside a function"
msgstr "E193: :endfunction funktion ulkopuolella"
-#: ../ex_getln.c:1643
msgid "E788: Not allowed to edit another buffer now"
msgstr "E788: Puskuria ei voi muokata nyt"
-#: ../ex_getln.c:1656
msgid "E811: Not allowed to change buffer information now"
msgstr "E811: Puskuria ei voi vaihtaa nyt"
-#: ../ex_getln.c:3178
msgid "tagname"
-msgstr "tไginimi"
+msgstr "tรคginimi"
-#: ../ex_getln.c:3181
msgid " kind file\n"
msgstr " -tiedostotyyppi\n"
-#: ../ex_getln.c:4799
msgid "'history' option is zero"
msgstr "history-asetus on nolla"
-#: ../ex_getln.c:5046
-#, c-format
-msgid ""
-"\n"
-"# %s History (newest to oldest):\n"
-msgstr ""
-"\n"
-"# %s Historia (uusimmasta alkaen):\n"
-
-#: ../ex_getln.c:5047
-msgid "Command Line"
-msgstr "Komentorivi"
-
-#: ../ex_getln.c:5048
-msgid "Search String"
-msgstr "Hakujono"
-
-#: ../ex_getln.c:5049
-msgid "Expression"
-msgstr "Ilmaus"
-
-#: ../ex_getln.c:5050
-msgid "Input Line"
-msgstr "Sy๖terivi"
-
-#: ../ex_getln.c:5117
msgid "E198: cmd_pchar beyond the command length"
msgstr "E198: cmd_pchar komennon pituuden ulkopuolella"
-#: ../ex_getln.c:5279
msgid "E199: Active window or buffer deleted"
msgstr "E199: Aktiivinen ikkuna tai puskuri poistettu"
-#: ../file_search.c:203
msgid "E854: path too long for completion"
-msgstr ""
+msgstr "E854: polku on liian pitkรค tรคydennykseen"
-#: ../file_search.c:446
#, c-format
msgid ""
"E343: Invalid path: '**[number]' must be at the end of the path or be "
@@ -2011,376 +2101,295 @@ msgstr ""
"E343: Virheellinen polku: '**[numero]' kuuluu polun loppuun tai ennen kohtaa "
"%s."
-#: ../file_search.c:1505
#, c-format
msgid "E344: Can't find directory \"%s\" in cdpath"
-msgstr "E344: Hakemistoa %s ei l๖ydy cdpathista"
+msgstr "E344: Hakemistoa %s ei lรถydy cdpathista"
-#: ../file_search.c:1508
#, c-format
msgid "E345: Can't find file \"%s\" in path"
-msgstr "E345: Tiedostoa %s ei l๖ydy polulta"
+msgstr "E345: Tiedostoa %s ei lรถydy polulta"
-#: ../file_search.c:1512
#, c-format
msgid "E346: No more directory \"%s\" found in cdpath"
-msgstr "E346: Hakemisto %s ei ole enไไ cdpathissa"
+msgstr "E346: Hakemisto %s ei ole enรครค cdpathissa"
-#: ../file_search.c:1515
#, c-format
msgid "E347: No more file \"%s\" found in path"
-msgstr "E347: Tiedosto %s ei ole enไไ polulla"
+msgstr "E347: Tiedosto %s ei ole enรครค polulla"
-#: ../fileio.c:137
msgid "E812: Autocommands changed buffer or buffer name"
msgstr "E812: Autocommands muutti puskurin tai sen nimen"
-#: ../fileio.c:368
msgid "Illegal file name"
msgstr "Virheellinen tiedostonimi"
-#: ../fileio.c:395 ../fileio.c:476 ../fileio.c:2543 ../fileio.c:2578
msgid "is a directory"
msgstr "on hakemisto"
-#: ../fileio.c:397
msgid "is not a file"
msgstr "ei ole tiedosto"
-#: ../fileio.c:508 ../fileio.c:3522
msgid "[New File]"
msgstr "[Uusi tiedosto]"
-#: ../fileio.c:511
msgid "[New DIRECTORY]"
msgstr "[uusi HAKEMISTO]"
-#: ../fileio.c:529 ../fileio.c:532
+#. libuv only returns -errno in Unix and in Windows open() does not
+#. set EOVERFLOW
msgid "[File too big]"
msgstr "[Liian iso tiedosto]"
-#: ../fileio.c:534
msgid "[Permission Denied]"
msgstr "[Lupa kielletty]"
-#: ../fileio.c:653
msgid "E200: *ReadPre autocommands made the file unreadable"
msgstr ""
-"E200: *ReadPre-autocommand-komennot tekivไt tiedostosta lukukelvottoman"
+"E200: *ReadPre-autocommand-komennot tekivรคt tiedostosta lukukelvottoman"
-#: ../fileio.c:655
msgid "E201: *ReadPre autocommands must not change current buffer"
-msgstr "E201: *ReadPre-autocommand-komennot eivไt saa muuttaa puskuria"
+msgstr "E201: *ReadPre-autocommand-komennot eivรคt saa muuttaa puskuria"
-#: ../fileio.c:672
-msgid "Nvim: Reading from stdin...\n"
-msgstr "Vim: Luetaan vakiosy๖tteestไ...\n"
-
-#. Re-opening the original file failed!
-#: ../fileio.c:909
msgid "E202: Conversion made file unreadable!"
msgstr "E202: Muunnos teki tiedostosta lukukelvottoman."
#. fifo or socket
-#: ../fileio.c:1782
msgid "[fifo/socket]"
msgstr "[fifo t. soketti]"
#. fifo
-#: ../fileio.c:1788
msgid "[fifo]"
msgstr "[fifo]"
#. or socket
-#: ../fileio.c:1794
msgid "[socket]"
msgstr "[soketti]"
#. or character special
-#: ../fileio.c:1801
msgid "[character special]"
msgstr "[merkki erikoinen]"
-# Carriage Return elikkไ rivinvaihtomerkin erไs muoto/osa (vrt. LF)
-#: ../fileio.c:1815
+# Carriage Return elikkรค rivinvaihtomerkin erรคs muoto/osa (vrt. LF)
msgid "[CR missing]"
msgstr "[CR puuttuu]"
-#: ../fileio.c:1819
msgid "[long lines split]"
-msgstr "[pitkไt rivit hajotettu]"
+msgstr "[pitkรคt rivit hajotettu]"
-#: ../fileio.c:1823 ../fileio.c:3512
msgid "[NOT converted]"
msgstr "[EI muunnettu]"
-#: ../fileio.c:1826 ../fileio.c:3515
msgid "[converted]"
msgstr "[muunnettu]"
-#: ../fileio.c:1831
-#, c-format
-msgid "[CONVERSION ERROR in line %<PRId64>]"
-msgstr "[MUUNNOSVIRHE rivillไ %<PRId64>]"
+#, fuzzy, c-format
+#~ msgid "[CONVERSION ERROR in line %<PRId64>]"
+#~ msgstr "[MUUNNOSVIRHE rivillรค %ld]"
-#: ../fileio.c:1835
-#, c-format
-msgid "[ILLEGAL BYTE in line %<PRId64>]"
-msgstr "[VIRHEELLINEN OKTETTI rivillไ %<PRId64>]"
+#, fuzzy, c-format
+#~ msgid "[ILLEGAL BYTE in line %<PRId64>]"
+#~ msgstr "[VIRHEELLINEN OKTETTI rivillรค %ld]"
-#: ../fileio.c:1838
msgid "[READ ERRORS]"
-msgstr "[LUKUVIRHEITฤ]"
+msgstr "[LUKUVIRHEITร„]"
-#: ../fileio.c:2104
msgid "Can't find temp file for conversion"
-msgstr "Ei voi l๖ytไไ vไliaikaistiedstoa muuntamiseksi"
+msgstr "Ei voi lรถytรครค vรคliaikaistiedstoa muuntamiseksi"
-#: ../fileio.c:2110
msgid "Conversion with 'charconvert' failed"
-msgstr "Muunnos charconvert epไonnistui"
+msgstr "Muunnos charconvert epรคonnistui"
-#: ../fileio.c:2113
msgid "can't read output of 'charconvert'"
msgstr "charconvertin tulostetta ei voida lukea"
-#: ../fileio.c:2437
msgid "E676: No matching autocommands for acwrite buffer"
msgstr "E676: Ei autocommand-komentoa acwrite-puskurille"
-#: ../fileio.c:2466
msgid "E203: Autocommands deleted or unloaded buffer to be written"
msgstr ""
"E203: Autocommand-komennot poistivat tai vapauttivat puskurin, johon piti "
"kirjoittaa"
-#: ../fileio.c:2486
msgid "E204: Autocommand changed number of lines in unexpected way"
-msgstr "E204: Autocommand-komento muutti rivien mไไrไ odottamatta"
+msgstr "E204: Autocommand-komento muutti rivien mรครคrรค odottamatta"
-#: ../fileio.c:2548 ../fileio.c:2565
msgid "is not a file or writable device"
msgstr "ei ole tiedosto tai kirjoitettava laite"
-#: ../fileio.c:2601
msgid "is read-only (add ! to override)"
-msgstr "on kirjoitussuojattu (lisไไ komentoon ! ohittaaksesi)"
+msgstr "on kirjoitussuojattu (lisรครค komentoon ! ohittaaksesi)"
-#: ../fileio.c:2886
msgid "E506: Can't write to backup file (add ! to override)"
msgstr ""
-"E506: Ei voi kirjoittaa varmuuskopiotiedostoon (lisไไ komentoon ! "
+"E506: Ei voi kirjoittaa varmuuskopiotiedostoon (lisรครค komentoon ! "
"ohittaaksesi)"
-#: ../fileio.c:2898
-msgid "E507: Close error for backup file (add ! to override)"
-msgstr ""
-"E507: Varmuuskopiotiedoston sulkeminen ei onnistu (lisไไ komentoon ! "
-"ohittaaksesi)"
+#, fuzzy, c-format
+#~ msgid "E507: Close error for backup file (add ! to override): %s"
+#~ msgstr ""
+#~ "E507: Varmuuskopiotiedoston sulkeminen ei onnistu (lisรครค komentoon ! "
+#~ "ohittaaksesi)"
-#: ../fileio.c:2901
msgid "E508: Can't read file for backup (add ! to override)"
msgstr ""
-"E508: Varmuuskopiotiedostoa ei voi lukea (lisไไ komentoon ! ohittaaksesi)"
+"E508: Varmuuskopiotiedostoa ei voi lukea (lisรครค komentoon ! ohittaaksesi)"
-#: ../fileio.c:2923
msgid "E509: Cannot create backup file (add ! to override)"
msgstr ""
-"E509: Ei voi luoda varmuuskopiotiedostoa (lisไไ komentoon ! ohittaaksesi)"
+"E509: Ei voi luoda varmuuskopiotiedostoa (lisรครค komentoon ! ohittaaksesi)"
-#: ../fileio.c:3008
msgid "E510: Can't make backup file (add ! to override)"
msgstr ""
-"E510: Ei voi tehdไ varmuuskopiotiedostoa (lisไไ komentoon ! ohittaaksesi)"
+"E510: Ei voi tehdรค varmuuskopiotiedostoa (lisรครค komentoon ! ohittaaksesi)"
#. Can't write without a tempfile!
-#: ../fileio.c:3121
msgid "E214: Can't find temp file for writing"
-msgstr "E214: Ei voi l๖ytไไ vไliaikaistiedostoa kirjoitettavaksi"
+msgstr "E214: Ei voi lรถytรครค vรคliaikaistiedostoa kirjoitettavaksi"
-#: ../fileio.c:3134
msgid "E213: Cannot convert (add ! to write without conversion)"
msgstr ""
-"E213: Muunnos ei onnistu (lisไไ komentoon ! kirjoittaaksesi muuntamatta)"
+"E213: Muunnos ei onnistu (lisรครค komentoon ! kirjoittaaksesi muuntamatta)"
-#: ../fileio.c:3169
msgid "E166: Can't open linked file for writing"
msgstr "E166: Linkitetyn tiedoston avaus kirjoittamista varten ei onnistu"
-#: ../fileio.c:3173
-msgid "E212: Can't open file for writing"
-msgstr "E212: Tiedoston avaus kirjoittamista varten ei onnistu"
+#, fuzzy, c-format
+#~ msgid "E212: Can't open file for writing: %s"
+#~ msgstr "E212: Tiedoston avaus kirjoittamista varten ei onnistu"
-#: ../fileio.c:3363
-msgid "E667: Fsync failed"
-msgstr "E667: Fsync ei onnistunut"
+#, fuzzy, c-format
+#~ msgid "E667: Fsync failed: %s"
+#~ msgstr "E667: Fsync ei onnistunut"
-#: ../fileio.c:3398
-msgid "E512: Close failed"
-msgstr "E512: Sulkeminen ei onnistunut"
+#, fuzzy, c-format
+#~ msgid "E512: Close failed: %s"
+#~ msgstr "E512: Sulkeminen ei onnistunut"
-#: ../fileio.c:3436
msgid "E513: write error, conversion failed (make 'fenc' empty to override)"
-msgstr "E513: kirjoitusvirhe, muunnos epไonnistui (tyhjไไ fenc ohittaaksesi)"
+msgstr "E513: kirjoitusvirhe, muunnos epรคonnistui (tyhjรครค fenc ohittaaksesi)"
-#: ../fileio.c:3441
-#, c-format
-msgid ""
-"E513: write error, conversion failed in line %<PRId64> (make 'fenc' empty to "
-"override)"
-msgstr ""
-"E513: kirjoitusvirhe, muunnos epไonnistui rivillไ %<PRId64>(tyhjไไ fenc "
-"ohittaaksesi)"
+#, fuzzy
+#~ msgid "E513: write error, conversion failed in line %"
+#~ msgstr ""
+#~ "E513: kirjoitusvirhe, muunnos epรคonnistui rivillรค %ld(tyhjรครค fenc "
+#~ "ohittaaksesi)"
-#: ../fileio.c:3448
msgid "E514: write error (file system full?)"
-msgstr "E514: kirjoitusvirhe (tiedostojไrjestelmไ tไysi)"
+msgstr "E514: kirjoitusvirhe (tiedostojรคrjestelmรค tรคysi)"
-#: ../fileio.c:3506
msgid " CONVERSION ERROR"
msgstr " MUUNNOSVIRHE"
-#: ../fileio.c:3509
-#, c-format
-msgid " in line %<PRId64>;"
-msgstr " rivillไ %<PRId64>"
+#, fuzzy, c-format
+#~ msgid " in line %<PRId64>;"
+#~ msgstr " rivillรค %ld"
-#: ../fileio.c:3519
msgid "[Device]"
msgstr "[Laite]"
-#: ../fileio.c:3522
msgid "[New]"
msgstr "[Uusi]"
-#: ../fileio.c:3535
msgid " [a]"
msgstr " [a]"
-#: ../fileio.c:3535
msgid " appended"
-msgstr " lisไtty"
+msgstr " lisรคtty"
-#: ../fileio.c:3537
msgid " [w]"
msgstr " [w]"
-#: ../fileio.c:3537
msgid " written"
msgstr " kirjoitettu"
-#: ../fileio.c:3579
msgid "E205: Patchmode: can't save original file"
-msgstr "E205: Patch-tilassa ei voi tallentaa alkuperไistiedostoa"
+msgstr "E205: Patch-tilassa ei voi tallentaa alkuperรคistiedostoa"
-#: ../fileio.c:3602
msgid "E206: patchmode: can't touch empty original file"
-msgstr "E206: patch-tilassa ei voi muuttaa tyhjไไ alkuperไistiedostoa"
+msgstr "E206: patch-tilassa ei voi muuttaa tyhjรครค alkuperรคistiedostoa"
-#: ../fileio.c:3616
msgid "E207: Can't delete backup file"
msgstr "E207: Ei voi poistaa varmuuskopiota"
-#: ../fileio.c:3672
+#. Set highlight for error messages.
msgid ""
"\n"
"WARNING: Original file may be lost or damaged\n"
msgstr ""
"\n"
-"VAROITUS: Alkuperไistiedosto voi hไvitไ tai vahingoittua\n"
+"VAROITUS: Alkuperรคistiedosto voi hรคvitรค tai vahingoittua\n"
-#: ../fileio.c:3675
msgid "don't quit the editor until the file is successfully written!"
-msgstr "ไlไ lopeta editoria kesken tallentamisen."
+msgstr "รคlรค lopeta editoria kesken tallentamisen."
-#: ../fileio.c:3795
-msgid "[dos]"
-msgstr "[dos]"
-
-#: ../fileio.c:3795
msgid "[dos format]"
msgstr "[dos-muoto]"
-#: ../fileio.c:3801
-msgid "[mac]"
-msgstr "[mac]"
+msgid "[dos]"
+msgstr "[dos]"
-#: ../fileio.c:3801
msgid "[mac format]"
msgstr "[mac-muoto]"
-#: ../fileio.c:3807
-msgid "[unix]"
-msgstr "[unix]"
+msgid "[mac]"
+msgstr "[mac]"
-#: ../fileio.c:3807
msgid "[unix format]"
msgstr "[unix-muoto]"
-#: ../fileio.c:3831
+msgid "[unix]"
+msgstr "[unix]"
+
msgid "1 line, "
msgstr "1 rivi, "
-#: ../fileio.c:3833
-#, c-format
-msgid "%<PRId64> lines, "
-msgstr "%<PRId64> riviไ, "
+#, fuzzy, c-format
+#~ msgid "%<PRId64> lines, "
+#~ msgstr "%ld riviรค, "
-#: ../fileio.c:3836
msgid "1 character"
msgstr "1 merkki"
-#: ../fileio.c:3838
-#, c-format
-msgid "%<PRId64> characters"
-msgstr "%<PRId64> merkkiไ"
+#, fuzzy, c-format
+#~ msgid "%<PRId64> characters"
+#~ msgstr "%lld merkkiรค"
+
+msgid "[Incomplete last line]"
+msgstr "[Vajaa viimeinen rivi]"
# ei rivinvaihtoja
-#: ../fileio.c:3849
msgid "[noeol]"
msgstr "[eiriviv.]"
-#: ../fileio.c:3849
-msgid "[Incomplete last line]"
-msgstr "[Vajaa viimeinen rivi]"
-
-# Jos aukiolevaa tiedostoa s๖rkkii toisella ohjelmalla
-#. don't overwrite messages here
-#. must give this prompt
-#. don't use emsg() here, don't want to flush the buffers
-#: ../fileio.c:3865
+# Jos aukiolevaa tiedostoa sรถrkkii toisella ohjelmalla
+#. Don't overwrite messages here.
+#. Must give this prompt.
+#. Don't use emsg() here, don't want to flush the buffers.
msgid "WARNING: The file has been changed since reading it!!!"
-msgstr "VAROITUS: tiedosto on muuttunut viime lukukerran jไlkeen!"
+msgstr "VAROITUS: tiedosto on muuttunut viime lukukerran jรคlkeen!"
-#: ../fileio.c:3867
msgid "Do you really want to write to it"
msgstr "Kirjoitetaanko"
-#: ../fileio.c:4648
#, c-format
msgid "E208: Error writing to \"%s\""
msgstr "E208: Virhe kirjoitettaessa tiedostoon %s"
-#: ../fileio.c:4655
#, c-format
msgid "E209: Error closing \"%s\""
msgstr "E209: Virhe suljettaessa tiedostoa %s"
-#: ../fileio.c:4657
#, c-format
msgid "E210: Error reading \"%s\""
msgstr "E210: Virhe luettaessa tiedostoa %s"
-#: ../fileio.c:4883
msgid "E246: FileChangedShell autocommand deleted buffer"
msgstr "E246: FileChangedShell-autocommand poisti puskurin"
-#: ../fileio.c:4894
#, c-format
msgid "E211: File \"%s\" no longer available"
-msgstr "E211: Tiedostoa %s ei ole enไไ"
+msgstr "E211: Tiedostoa %s ei ole enรครค"
-#: ../fileio.c:4906
#, c-format
msgid ""
"W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as "
@@ -2389,41 +2398,33 @@ msgstr ""
"W12: Varoitus: Tiedostoa %s on muutettu ja Vimin puskurissa on muutoksia "
"tiedostoon"
-#: ../fileio.c:4907
msgid "See \":help W12\" for more info."
-msgstr ":help W12 kertoo lisไtietoja."
+msgstr ":help W12 kertoo lisรคtietoja."
-#: ../fileio.c:4910
#, c-format
msgid "W11: Warning: File \"%s\" has changed since editing started"
-msgstr "W11: Varoitus: Tiedostoa %s on muutettu muokkauksen aloituksen jไlkeen"
+msgstr "W11: Varoitus: Tiedostoa %s on muutettu muokkauksen aloituksen jรคlkeen"
-#: ../fileio.c:4911
msgid "See \":help W11\" for more info."
-msgstr ":help W11 kertoo lisไtietoja."
+msgstr ":help W11 kertoo lisรคtietoja."
-#: ../fileio.c:4914
#, c-format
msgid "W16: Warning: Mode of file \"%s\" has changed since editing started"
msgstr ""
"W16: Varoitus: Tiedoston %s oikeuksia on muutettu muokkauksen aloituksen "
-"jไlkeen"
+"jรคlkeen"
-#: ../fileio.c:4915
msgid "See \":help W16\" for more info."
-msgstr ":help W16 kertoo lisไtietoja."
+msgstr ":help W16 kertoo lisรคtietoja."
-#: ../fileio.c:4927
#, c-format
msgid "W13: Warning: File \"%s\" has been created after editing started"
-msgstr "W13: Varoitus: Tiedosto %s on luotu muokkauksen aloituksen jไlkeen"
+msgstr "W13: Varoitus: Tiedosto %s on luotu muokkauksen aloituksen jรคlkeen"
-#: ../fileio.c:4947
msgid "Warning"
msgstr "Varoitus"
-# yllไ olevien varoitusten ratkaisut
-#: ../fileio.c:4948
+# yllรค olevien varoitusten ratkaisut
msgid ""
"&OK\n"
"&Load File"
@@ -2431,816 +2432,657 @@ msgstr ""
"&OK\n"
"&Avaa tiedosto uudelleen"
-#: ../fileio.c:5065
#, c-format
msgid "E462: Could not prepare for reloading \"%s\""
msgstr "E462: Ei voitu valmistella uudelleen avausta %s"
-#: ../fileio.c:5078
#, c-format
msgid "E321: Could not reload \"%s\""
msgstr "E321: Ei voitu uudelleenavata %s"
-#: ../fileio.c:5601
msgid "--Deleted--"
msgstr "--Poistettu--"
-#: ../fileio.c:5732
#, c-format
msgid "auto-removing autocommand: %s <buffer=%d>"
msgstr "poistetaan autocommand automaattisesti: %s <puskuri=%d>"
#. the group doesn't exist
-#: ../fileio.c:5772
#, c-format
msgid "E367: No such group: \"%s\""
-msgstr "E367: Ryhmไไ ei ole: %s"
+msgstr "E367: Ryhmรครค ei ole: %s"
+
+#, fuzzy
+#~ msgid "E936: Cannot delete the current group"
+#~ msgstr "E351: Taitosta ei voi poistaa tรคllรค foldmethodilla"
+
+msgid "W19: Deleting augroup that is still in use"
+msgstr "W19: kรคytรถssรค oleva augroup poistetaan"
-#: ../fileio.c:5897
#, c-format
msgid "E215: Illegal character after *: %s"
-msgstr "E215: Virheellinen merkki *:n jไlkeen: %s"
+msgstr "E215: Virheellinen merkki *:n jรคlkeen: %s"
-#: ../fileio.c:5905
#, c-format
msgid "E216: No such event: %s"
-msgstr "E216: Eventtiไ ei ole: %s"
+msgstr "E216: Eventtiรค ei ole: %s"
-#: ../fileio.c:5907
#, c-format
msgid "E216: No such group or event: %s"
-msgstr "E216: Ryhmไไ tai eventtiไ ei ole: %s"
+msgstr "E216: Ryhmรครค tai eventtiรค ei ole: %s"
-#. Highlight title
-#: ../fileio.c:6090
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
"--- Autocommandit ---"
-#: ../fileio.c:6293
#, c-format
msgid "E680: <buffer=%d>: invalid buffer number "
msgstr "E680: <puskuri=%d>: virheellinen puskurinumero"
-#: ../fileio.c:6370
msgid "E217: Can't execute autocommands for ALL events"
msgstr "E217: Ei voi suorittaa autocommandsia kaikille eventeille"
-#: ../fileio.c:6393
msgid "No matching autocommands"
-msgstr "Ei tไsmไไviไ autocommandsia"
+msgstr "Ei tรคsmรครคviรค autocommandsia"
-#: ../fileio.c:6831
msgid "E218: autocommand nesting too deep"
msgstr "E218: liian monta tasoa autocommandissa"
-#: ../fileio.c:7143
#, c-format
-msgid "%s Auto commands for \"%s\""
+msgid "%s Autocommands for \"%s\""
msgstr "%s Autocommands kohteelle %s"
-#: ../fileio.c:7149
#, c-format
msgid "Executing %s"
msgstr "Suoritetaan %s"
-#: ../fileio.c:7211
#, c-format
msgid "autocommand %s"
msgstr "autocommand %s"
-#: ../fileio.c:7795
msgid "E219: Missing {."
msgstr "E219: { puuttuu."
-#: ../fileio.c:7797
msgid "E220: Missing }."
msgstr "E220: } puuttuu."
-#: ../fold.c:93
msgid "E490: No fold found"
msgstr "E490: taitos puuttuu"
-#: ../fold.c:544
msgid "E350: Cannot create fold with current 'foldmethod'"
-msgstr "E350: Taitoksia ei voi tehdไ tไllไ foldmethodilla"
+msgstr "E350: Taitoksia ei voi tehdรค tรคllรค foldmethodilla"
-#: ../fold.c:546
msgid "E351: Cannot delete fold with current 'foldmethod'"
-msgstr "E351: Taitosta ei voi poistaa tไllไ foldmethodilla"
+msgstr "E351: Taitosta ei voi poistaa tรคllรค foldmethodilla"
-#: ../fold.c:1784
-#, c-format
-msgid "+--%3ld lines folded "
-msgstr "+--%3ld riviไ taitettu pois "
+#, fuzzy, c-format
+#~ msgid "+--%3ld lines folded "
+#~ msgstr "+--%3ld rivi taitettu pois "
#. buffer has already been read
-#: ../getchar.c:273
msgid "E222: Add to read buffer"
-msgstr "E222: Lisไไ lukupuskuriin"
+msgstr "E222: Lisรครค lukupuskuriin"
-#: ../getchar.c:2040
msgid "E223: recursive mapping"
msgstr "E223: rekursiivinen kuvaus"
-#: ../getchar.c:2849
#, c-format
msgid "E224: global abbreviation already exists for %s"
-msgstr "E224: globaali lyhenne merkinnไlle %s on jo olemassa"
+msgstr "E224: globaali lyhenne merkinnรคlle %s on jo olemassa"
-#: ../getchar.c:2852
#, c-format
msgid "E225: global mapping already exists for %s"
-msgstr "E225: globaali kuvaus merkinnไlle %s on jo olemassa"
+msgstr "E225: globaali kuvaus merkinnรคlle %s on jo olemassa"
-#: ../getchar.c:2952
#, c-format
msgid "E226: abbreviation already exists for %s"
msgstr "E226: lyhenne on jo olemassa %s"
-#: ../getchar.c:2955
#, c-format
msgid "E227: mapping already exists for %s"
msgstr "E227: kuvaus on jo olemassa %s"
-#: ../getchar.c:3008
msgid "No abbreviation found"
-msgstr "Lyhennettไ ei l๖ydy"
+msgstr "Lyhennettรค ei lรถydy"
-#: ../getchar.c:3010
msgid "No mapping found"
-msgstr "Kuvausta ei l๖ydy"
+msgstr "Kuvausta ei lรถydy"
-#: ../getchar.c:3974
msgid "E228: makemap: Illegal mode"
msgstr "E228: makemap: Virheellinen tila"
#. key value of 'cedit' option
#. type of cmdline window or 0
#. result of cmdline window or 0
-#: ../globals.h:924
msgid "--No lines in buffer--"
-msgstr "--Ei rivejไ puskurissa--"
+msgstr "--Ei rivejรค puskurissa--"
#.
#. * The error messages that can be shared are included here.
#. * Excluded are errors that are only used once and debugging messages.
#.
-#: ../globals.h:996
msgid "E470: Command aborted"
msgstr "E470: Komento peruttu"
-#: ../globals.h:997
+#, fuzzy
+#~ msgid "E905: Cannot set this option after startup"
+#~ msgstr "E529: Termiรค ei voi asettaa tyhjรคksi merkkijonoksi"
+
+#, fuzzy
+#~ msgid "E903: Could not spawn API job"
+#~ msgstr "E623: Cscope-prosessin luonti epรคonnistui"
+
msgid "E471: Argument required"
msgstr "E471: Argumentti puuttuu"
-#: ../globals.h:998
msgid "E10: \\ should be followed by /, ? or &"
-msgstr "E10: \\:n jไlkeen pitไไ tulla /, ? tai &"
+msgstr "E10: \\:n jรคlkeen pitรครค tulla /, ? tai &"
-#: ../globals.h:1000
msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
msgstr "E11: Virheellinen komentorivi-ikkuna, <CR> suorittaa, Ctrl C lopettaa"
-#: ../globals.h:1002
msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
msgstr ""
-"E12: Komentoa ei tueta exrc:ssไ tai vimrc:ssไ tไssไ hakemistossa tai "
-"tไgihaussa"
+"E12: Komentoa ei tueta exrc:ssรค tai vimrc:ssรค tรคssรค hakemistossa tai "
+"tรคgihaussa"
-#: ../globals.h:1003
msgid "E171: Missing :endif"
msgstr "E171: :endif puuttuu"
-#: ../globals.h:1004
msgid "E600: Missing :endtry"
msgstr "E600: :endtry puuttuu"
-#: ../globals.h:1005
msgid "E170: Missing :endwhile"
msgstr "E170: :endwhile puuttuu"
-#: ../globals.h:1006
msgid "E170: Missing :endfor"
msgstr "E170: :endfor puuttuu"
-#: ../globals.h:1007
msgid "E588: :endwhile without :while"
msgstr "E588: :endwhile ilman komentoa :while"
-#: ../globals.h:1008
msgid "E588: :endfor without :for"
msgstr "E588: :endfor ilman komentoa :for"
-#: ../globals.h:1009
msgid "E13: File exists (add ! to override)"
-msgstr "E13: Tiedosto on jo olemassa (lisไไ ! ohittaaksesi)"
+msgstr "E13: Tiedosto on jo olemassa (lisรครค ! ohittaaksesi)"
-#: ../globals.h:1010
msgid "E472: Command failed"
-msgstr "E472: Komento epไonnistui"
+msgstr "E472: Komento epรคonnistui"
-#: ../globals.h:1011
msgid "E473: Internal error"
-msgstr "E473: Sisไinen virhe"
+msgstr "E473: Sisรคinen virhe"
-#: ../globals.h:1012
msgid "Interrupted"
msgstr "Keskeytetty"
-#: ../globals.h:1013
msgid "E14: Invalid address"
msgstr "E14: Virheellinen osoite"
-#: ../globals.h:1014
msgid "E474: Invalid argument"
msgstr "E474: Virheellinen argumentti"
-#: ../globals.h:1015
#, c-format
msgid "E475: Invalid argument: %s"
msgstr "E475: Virheellinen argumentti: %s"
-#: ../globals.h:1016
#, c-format
msgid "E15: Invalid expression: %s"
msgstr "E15: Virheellinen ilmaus: %s"
-#: ../globals.h:1017
msgid "E16: Invalid range"
msgstr "E16: Virheellinen arvoalue"
-#: ../globals.h:1018
msgid "E476: Invalid command"
msgstr "E476: Virheellinen komento"
-#: ../globals.h:1019
#, c-format
msgid "E17: \"%s\" is a directory"
msgstr "E17: %s on hakemisto"
-#: ../globals.h:1020
#, fuzzy
-msgid "E900: Invalid job id"
-msgstr "E49: Virheellinen vierityskoko"
+#~ msgid "E900: Invalid job id"
+#~ msgstr "E916: ei ole job"
-#: ../globals.h:1021
-msgid "E901: Job table is full"
-msgstr ""
+#~ msgid "E901: Job table is full"
+#~ msgstr ""
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
+#, fuzzy, c-format
+#~ msgid "E903: Process failed to start: %s: \"%s\""
+#~ msgstr "E852: Lapsiprosesi ei voinut kรคynnistรครค kรคyttรถliittymรครค"
+
+#, fuzzy
+#~ msgid "E904: Job is not connected to a pty"
+#~ msgstr "E902: Ei voi yhdistรครค porttiin"
-#: ../globals.h:1024
#, c-format
msgid "E364: Library call failed for \"%s()\""
-msgstr "E364: Kirjastukutsu %s() epไonnistui"
+msgstr "E364: Kirjastukutsu %s() epรคonnistui"
+
+#, fuzzy, c-format
+#~ msgid "E739: Cannot create directory %s: %s"
+#~ msgstr "E739: hakemistoa ei voi luoda: %s"
-#: ../globals.h:1026
msgid "E19: Mark has invalid line number"
-msgstr "E19: Merkillไ on virheellinen rivinumero"
+msgstr "E19: Merkillรค on virheellinen rivinumero"
-#: ../globals.h:1027
msgid "E20: Mark not set"
-msgstr "E20: Merkkiไ ei asetettu"
+msgstr "E20: Merkkiรค ei asetettu"
-#: ../globals.h:1029
msgid "E21: Cannot make changes, 'modifiable' is off"
-msgstr "E21: Ei voi tehdไ muutoksia, modifiable on pois pไไltไ"
+msgstr "E21: Ei voi tehdรค muutoksia, modifiable on pois pรครคltรค"
-#: ../globals.h:1030
msgid "E22: Scripts nested too deep"
-msgstr "E22: Liian monta tasoa skripteissไ"
+msgstr "E22: Liian monta tasoa skripteissรค"
-#: ../globals.h:1031
msgid "E23: No alternate file"
msgstr "E23: Eo vaihtoehtoista tiedostoa"
-#: ../globals.h:1032
msgid "E24: No such abbreviation"
-msgstr "E24: Lyhennettไ ei ole"
+msgstr "E24: Lyhennettรค ei ole"
-#: ../globals.h:1033
msgid "E477: No ! allowed"
msgstr "E477: ! ei sallittu"
-#: ../globals.h:1035
-msgid "E25: Nvim does not have a built-in GUI"
-msgstr "E25: GUIta ei voi kไyttไไ, koska sitไ ei kไไnnetty mukaan"
+#~ msgid "E25: Nvim does not have a built-in GUI"
+#~ msgstr ""
-#: ../globals.h:1036
#, c-format
msgid "E28: No such highlight group name: %s"
-msgstr "E28: Korostusryhmไไ ei ole nimellไ: %s"
+msgstr "E28: Korostusryhmรครค ei ole nimellรค: %s"
-#: ../globals.h:1037
msgid "E29: No inserted text yet"
-msgstr "E29: Tekstiไ ei ole sy๖tetty vielไ"
+msgstr "E29: Tekstiรค ei ole syรถtetty vielรค"
-#: ../globals.h:1038
msgid "E30: No previous command line"
-msgstr "E30: Ei edellistไ komentoriviไ"
+msgstr "E30: Ei edellistรค komentoriviรค"
-#: ../globals.h:1039
msgid "E31: No such mapping"
msgstr "E31: Kuvausta ei ole"
-#: ../globals.h:1040
msgid "E479: No match"
-msgstr "E479: Ei tไsmไไ"
+msgstr "E479: Ei tรคsmรครค"
-#: ../globals.h:1041
#, c-format
msgid "E480: No match: %s"
-msgstr "E480: Ei tsไmไไ: %s"
+msgstr "E480: Ei tsรคmรครค: %s"
-#: ../globals.h:1042
msgid "E32: No file name"
-msgstr "E32: Ei tiedostonimeไ"
+msgstr "E32: Ei tiedostonimeรค"
-#: ../globals.h:1044
msgid "E33: No previous substitute regular expression"
-msgstr "E33: Ei edellistไ korvausta sไไnn๖lliselle ilmaukselle"
+msgstr "E33: Ei edellistรค korvausta sรครคnnรถlliselle ilmaukselle"
-#: ../globals.h:1045
msgid "E34: No previous command"
-msgstr "E34: Ei edellistไ komentoa"
+msgstr "E34: Ei edellistรค komentoa"
-#: ../globals.h:1046
msgid "E35: No previous regular expression"
-msgstr "E35: Ei edellistไ sไไnn๖llistไ ilmausta"
+msgstr "E35: Ei edellistรค sรครคnnรถllistรค ilmausta"
-#: ../globals.h:1047
msgid "E481: No range allowed"
msgstr "E481: Arvoalue ei sallittu"
-#: ../globals.h:1048
msgid "E36: Not enough room"
-msgstr "E36: Tila ei riitไ"
-
-#: ../globals.h:1049
-#, c-format
-msgid "E482: Can't create file %s"
-msgstr "E482: Tiedostoa %s ei voi luoda"
+msgstr "E36: Tila ei riitรค"
-#: ../globals.h:1050
msgid "E483: Can't get temp file name"
-msgstr "E483: vไliaikaistiedoston nimeไ ei saada selville"
+msgstr "E483: vรคliaikaistiedoston nimeรค ei saada selville"
-#: ../globals.h:1051
#, c-format
msgid "E484: Can't open file %s"
msgstr "E484: Ei voi avata tiedostoa %s"
-#: ../globals.h:1052
#, c-format
msgid "E485: Can't read file %s"
msgstr "E485: Ei voi lukea tiedostoa %s"
-#: ../globals.h:1054
msgid "E37: No write since last change (add ! to override)"
msgstr ""
-"E37: Viimeisen muutoksen jไlkeen ei ole kirjoitettu (lisไไ ! ohittaaksesi)"
+"E37: Viimeisen muutoksen jรคlkeen ei ole kirjoitettu (lisรครค ! ohittaaksesi)"
-#: ../globals.h:1055
-#, fuzzy
msgid "E37: No write since last change"
-msgstr "[Viimeisintไ muutosta ei ole kirjoitettu]\n"
+msgstr "E37: Viimeisimmรคn muutoksen jรคlkeen ei ole kirjoitettu mitรครคn"
-#: ../globals.h:1056
msgid "E38: Null argument"
msgstr "E38: Null-argumentti"
-#: ../globals.h:1057
msgid "E39: Number expected"
-msgstr "E39: Pitไไ olla numero"
+msgstr "E39: Pitรครค olla numero"
-#: ../globals.h:1058
#, c-format
msgid "E40: Can't open errorfile %s"
msgstr "E40: virhetiedostoa %s ei voi avata"
-#: ../globals.h:1059
msgid "E41: Out of memory!"
msgstr "E41: Muisti loppui"
-#: ../globals.h:1060
msgid "Pattern not found"
-msgstr "Kuviota ei l๖ydy"
+msgstr "Kuviota ei lรถydy"
-#: ../globals.h:1061
#, c-format
msgid "E486: Pattern not found: %s"
-msgstr "E486: Kuviota ei l๖ydy: %s"
+msgstr "E486: Kuviota ei lรถydy: %s"
-#: ../globals.h:1062
msgid "E487: Argument must be positive"
-msgstr "E487: Argumentin pitไไ olla positiivinen"
+msgstr "E487: Argumentin pitรครค olla positiivinen"
-#: ../globals.h:1064
msgid "E459: Cannot go back to previous directory"
-msgstr "E459: Ei voi siirtyไ edelliseen hakemistoon"
+msgstr "E459: Ei voi siirtyรค edelliseen hakemistoon"
# ;-)
-#: ../globals.h:1066
msgid "E42: No Errors"
-msgstr "E42: Ei virheitไ"
+msgstr "E42: Ei virheitรค"
-#: ../globals.h:1067
msgid "E776: No location list"
msgstr "E776: Ei sijaintilistaa"
-#: ../globals.h:1068
msgid "E43: Damaged match string"
-msgstr "E43: Viallinen tไsmไysmerkkijono"
+msgstr "E43: Viallinen tรคsmรคysmerkkijono"
-#: ../globals.h:1069
msgid "E44: Corrupted regexp program"
msgstr "E44: Viallinen regexp-ohjelma"
-#: ../globals.h:1071
msgid "E45: 'readonly' option is set (add ! to override)"
-msgstr "E45: readonly asetettu (lisไไ ! ohittaaksesi)"
-
-#: ../globals.h:1073
-#, c-format
-msgid "E46: Cannot change read-only variable \"%s\""
-msgstr "E46: Kirjoitussuojattua muuttujaa %s ei voi muuttaa"
-
-#: ../globals.h:1075
-#, c-format
-msgid "E794: Cannot set variable in the sandbox: \"%s\""
-msgstr "E794: Muuttujaa ei voi asettaa hiekkalaatikossa: %s"
+msgstr "E45: readonly asetettu (lisรครค ! ohittaaksesi)"
-#: ../globals.h:1076
msgid "E47: Error while reading errorfile"
msgstr "E47: Virhe virhetiedostoa luettaessa"
-#: ../globals.h:1078
msgid "E48: Not allowed in sandbox"
msgstr "E48: Ei sallittu hiekkalaatikossa"
-#: ../globals.h:1080
msgid "E523: Not allowed here"
-msgstr "E523: Ei sallittu tไไllไ"
+msgstr "E523: Ei sallittu tรครคllรค"
-#: ../globals.h:1082
msgid "E359: Screen mode setting not supported"
-msgstr "E359: Nไytt๖tila-asetus ei tuettu"
+msgstr "E359: Nรคyttรถtila-asetus ei tuettu"
-#: ../globals.h:1083
msgid "E49: Invalid scroll size"
msgstr "E49: Virheellinen vierityskoko"
-#: ../globals.h:1084
msgid "E91: 'shell' option is empty"
-msgstr "E91: shell-asetus on tyhjไ"
+msgstr "E91: shell-asetus on tyhjรค"
-#: ../globals.h:1085
msgid "E255: Couldn't read in sign data!"
msgstr "E255: Merkkidatan luku ei onnistu"
-#: ../globals.h:1086
msgid "E72: Close error on swap file"
msgstr "E72: Swap-tiedoston sulkemisvirhe"
-#: ../globals.h:1087
msgid "E73: tag stack empty"
-msgstr "E73: tไgipino tyhjไ"
+msgstr "E73: tรคgipino tyhjรค"
-#: ../globals.h:1088
msgid "E74: Command too complex"
msgstr "E74: Liian monimutkainen komento"
-#: ../globals.h:1089
msgid "E75: Name too long"
-msgstr "E75: Liian pitkไ nimi"
+msgstr "E75: Liian pitkรค nimi"
-#: ../globals.h:1090
msgid "E76: Too many ["
msgstr "E76: Liian monta [:a"
-#: ../globals.h:1091
msgid "E77: Too many file names"
-msgstr "E77: Liikaa tiedostonimiไ"
+msgstr "E77: Liikaa tiedostonimiรค"
-#: ../globals.h:1092
msgid "E488: Trailing characters"
-msgstr "E488: Ylimไไrไisiไ merkkejไ perไssไ"
+msgstr "E488: Ylimรครคrรคisiรค merkkejรค perรคssรค"
-#: ../globals.h:1093
msgid "E78: Unknown mark"
msgstr "E78: Tuntematon merkki"
-#: ../globals.h:1094
msgid "E79: Cannot expand wildcards"
msgstr "E79: Jokerimerkkien avaus ei onnistu"
-#: ../globals.h:1096
msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
msgstr "E591: winheight ei voi olla pienempi kuin winminheight"
-#: ../globals.h:1098
msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
msgstr "E592: winwidth ei voi olla pienempi kuin winminwidth"
-#: ../globals.h:1099
msgid "E80: Error while writing"
msgstr "E80: Kirjoitusvirhe"
-#: ../globals.h:1100
msgid "Zero count"
msgstr "Nollalaskuri"
-#: ../globals.h:1101
msgid "E81: Using <SID> not in a script context"
msgstr "E81: <SID> skriptin ulkopuolella"
-#: ../globals.h:1102
#, c-format
msgid "E685: Internal error: %s"
-msgstr "E685: Sisไinen virhe: %s"
+msgstr "E685: Sisรคinen virhe: %s"
-#: ../globals.h:1104
msgid "E363: pattern uses more memory than 'maxmempattern'"
-msgstr "E363: kuvio kไyttไไ enemmไn muistia kuin maxmempattern on"
+msgstr "E363: kuvio kรคyttรครค enemmรคn muistia kuin maxmempattern on"
-#: ../globals.h:1105
msgid "E749: empty buffer"
-msgstr "E749: tyhjไ puskuri"
+msgstr "E749: tyhjรค puskuri"
+
+#, fuzzy, c-format
+#~ msgid "E86: Buffer %<PRId64> does not exist"
+#~ msgstr "E86: Puskuria %ld ei ole"
-#: ../globals.h:1108
msgid "E682: Invalid search pattern or delimiter"
msgstr "E682: Virheellinen hakulauseke tai erotin"
-#: ../globals.h:1109
msgid "E139: File is loaded in another buffer"
msgstr "E139: Tiedosto on ladattu toiseen puskuriin"
-#: ../globals.h:1110
#, c-format
msgid "E764: Option '%s' is not set"
msgstr "E764: Asetus %s on asettamatta"
-#: ../globals.h:1111
-#, fuzzy
msgid "E850: Invalid register name"
-msgstr "E354: Virheellinen rekisterin nimi: %s"
+msgstr "E850: Virheellinen rekisterin nimi"
+
+#, c-format
+msgid "E919: Directory not found in '%s': \"%s\""
+msgstr "E919: Hakemisto puuttuu kohteesta %s: %s"
+
+msgid "E519: Option not supported"
+msgstr "E519: Asetusta ei tueta"
+
+#, fuzzy
+#~ msgid "E856: Filename too long"
+#~ msgstr "E75: Liian pitkรค nimi"
+
+msgid "E806: using Float as a String"
+msgstr "E806: Float ei kรคy merkkijonosta"
-#: ../globals.h:1114
msgid "search hit TOP, continuing at BOTTOM"
-msgstr "haku pไไsi ALKUUN, jatketaan LOPUSTA"
+msgstr "haku pรครคsi ALKUUN, jatketaan LOPUSTA"
-#: ../globals.h:1115
msgid "search hit BOTTOM, continuing at TOP"
-msgstr "haku pไไsi LOPPUUN, jatketaan ALUSTA"
+msgstr "haku pรครคsi LOPPUUN, jatketaan ALUSTA"
-#: ../hardcopy.c:240
msgid "E550: Missing colon"
msgstr "E550: kaksoispiste puuttuu"
-#: ../hardcopy.c:252
msgid "E551: Illegal component"
msgstr "E551: Virheellinen komponentti"
-#: ../hardcopy.c:259
msgid "E552: digit expected"
-msgstr "E552: pitไisi olla numero"
+msgstr "E552: pitรคisi olla numero"
-#: ../hardcopy.c:473
#, c-format
msgid "Page %d"
msgstr "Sivu %d"
-#: ../hardcopy.c:597
msgid "No text to be printed"
-msgstr "Ei tekstiไ tulostettavaksi"
+msgstr "Ei tekstiรค tulostettavaksi"
-#: ../hardcopy.c:668
-#, c-format
-msgid "Printing page %d (%d%%)"
-msgstr "Tulostetaan sivua %d (%d %%)"
+#, fuzzy, c-format
+#~ msgid "Printing page %d (%zu%%)"
+#~ msgstr "Tulostetaan sivua %d (%d %%)"
-#: ../hardcopy.c:680
#, c-format
msgid " Copy %d of %d"
msgstr " Kopio %d/%d"
-#: ../hardcopy.c:733
#, c-format
msgid "Printed: %s"
msgstr "Tulostettu: %s"
-#: ../hardcopy.c:740
msgid "Printing aborted"
msgstr "Tulostus peruttu"
-#: ../hardcopy.c:1365
msgid "E455: Error writing to PostScript output file"
-msgstr "E455: Virhe kirjoitettaessa PostScriptiไ tiedostoon"
+msgstr "E455: Virhe kirjoitettaessa PostScriptiรค tiedostoon"
-#: ../hardcopy.c:1747
#, c-format
msgid "E624: Can't open file \"%s\""
msgstr "E624: Ei voi avata tiedostoa %s"
-#: ../hardcopy.c:1756 ../hardcopy.c:2470
#, c-format
msgid "E457: Can't read PostScript resource file \"%s\""
msgstr "E457: Ei voi lukea PostScript-resurssitiedostoa %s"
-#: ../hardcopy.c:1772
#, c-format
msgid "E618: file \"%s\" is not a PostScript resource file"
msgstr "E618: tiedosto %s ei ole PostScript-resurssitiedosto"
-#: ../hardcopy.c:1788 ../hardcopy.c:1805 ../hardcopy.c:1844
#, c-format
msgid "E619: file \"%s\" is not a supported PostScript resource file"
msgstr "E619: tiedosto %s ei ole tuettu PostScript-resurssitiedosto"
-#: ../hardcopy.c:1856
#, c-format
msgid "E621: \"%s\" resource file has wrong version"
-msgstr "E621: resurssitiedoston %s versio on vไไrไ"
+msgstr "E621: resurssitiedoston %s versio on vรครคrรค"
-#: ../hardcopy.c:2225
msgid "E673: Incompatible multi-byte encoding and character set."
-msgstr "E673: Tukematon monitvauinen merkist๖koodaus ja merkist๖."
+msgstr "E673: Tukematon monitvauinen merkistรถkoodaus ja merkistรถ."
-#: ../hardcopy.c:2238
msgid "E674: printmbcharset cannot be empty with multi-byte encoding."
-msgstr "E674: printmbcharset ei voi olla tyhjไ monitavuiselle koodaukselle."
+msgstr "E674: printmbcharset ei voi olla tyhjรค monitavuiselle koodaukselle."
-#: ../hardcopy.c:2254
msgid "E675: No default font specified for multi-byte printing."
msgstr "E675: Ei oletusfonttia monitavuiseen tulostukseen"
-#: ../hardcopy.c:2426
msgid "E324: Can't open PostScript output file"
msgstr "E324: PostScript-tulostetiedoston avaus ei onnistu"
-#: ../hardcopy.c:2458
#, c-format
msgid "E456: Can't open file \"%s\""
msgstr "E456: Tiedoston %s avaus ei onnistu"
-#: ../hardcopy.c:2583
msgid "E456: Can't find PostScript resource file \"prolog.ps\""
-msgstr "E456: PostScript-resurssitiedostoa prolog.ps ei l๖ydy"
+msgstr "E456: PostScript-resurssitiedostoa prolog.ps ei lรถydy"
-#: ../hardcopy.c:2593
msgid "E456: Can't find PostScript resource file \"cidfont.ps\""
-msgstr "E456: PostScript-resurssitiedostoa cidfont.ps ei l๖ydy"
+msgstr "E456: PostScript-resurssitiedostoa cidfont.ps ei lรถydy"
-#: ../hardcopy.c:2622 ../hardcopy.c:2639 ../hardcopy.c:2665
#, c-format
msgid "E456: Can't find PostScript resource file \"%s.ps\""
-msgstr "E456: Postscript-resurssitiedosta %s.ps ei l๖ydy"
+msgstr "E456: Postscript-resurssitiedosta %s.ps ei lรถydy"
-#: ../hardcopy.c:2654
#, c-format
msgid "E620: Unable to convert to print encoding \"%s\""
msgstr "E620: Tulostuskoodaukseen %s muunto ei onnistu"
-#: ../hardcopy.c:2877
msgid "Sending to printer..."
-msgstr "Lไhetetไไn tulostimelle..."
+msgstr "Lรคhetetรครคn tulostimelle..."
-#: ../hardcopy.c:2881
msgid "E365: Failed to print PostScript file"
-msgstr "E365: PostScript-tiedoston tulostus epไonnistui"
+msgstr "E365: PostScript-tiedoston tulostus epรคonnistui"
-#: ../hardcopy.c:2883
msgid "Print job sent."
-msgstr "Tulostusty๖ lไhetetty."
+msgstr "Tulostustyรถ lรคhetetty."
-#: ../if_cscope.c:85
msgid "Add a new database"
-msgstr "Lisไไ uusi tietokanta"
+msgstr "Lisรครค uusi tietokanta"
-#: ../if_cscope.c:87
msgid "Query for a pattern"
msgstr "Hae kuviota"
-#: ../if_cscope.c:89
msgid "Show this message"
-msgstr "Nไytไ tไmไ viesti"
+msgstr "Nรคytรค tรคmรค viesti"
-#: ../if_cscope.c:91
msgid "Kill a connection"
msgstr "Tapa yhteys"
-#: ../if_cscope.c:93
msgid "Reinit all connections"
msgstr "Alusta uudelleen yhteydet"
-#: ../if_cscope.c:95
msgid "Show connections"
-msgstr "Nไytไ yhteydet"
+msgstr "Nรคytรค yhteydet"
-#: ../if_cscope.c:101
#, c-format
msgid "E560: Usage: cs[cope] %s"
-msgstr "E560: Kไytt๖: cs[cope] %s"
+msgstr "E560: Kรคyttรถ: cs[cope] %s"
-#: ../if_cscope.c:225
msgid "This cscope command does not support splitting the window.\n"
-msgstr "Tไmไ cscope-komento ei tue ikkunan jakamista.\n"
+msgstr "Tรคmรค cscope-komento ei tue ikkunan jakamista.\n"
-#: ../if_cscope.c:266
msgid "E562: Usage: cstag <ident>"
-msgstr "E562: Kไytt๖: cstag <ident>"
+msgstr "E562: Kรคyttรถ: cstag <ident>"
-#: ../if_cscope.c:313
msgid "E257: cstag: tag not found"
-msgstr "E257: cstag: tไgia ei l๖ydy"
+msgstr "E257: cstag: tรคgia ei lรถydy"
-#: ../if_cscope.c:461
#, c-format
msgid "E563: stat(%s) error: %d"
msgstr "E563: stat(%s)-virhe: %d"
-#: ../if_cscope.c:551
#, c-format
msgid "E564: %s is not a directory or a valid cscope database"
-msgstr "E564: %s ei ole hakemisto eikไ cscope-tietokanta"
+msgstr "E564: %s ei ole hakemisto eikรค cscope-tietokanta"
-#: ../if_cscope.c:566
#, c-format
msgid "Added cscope database %s"
-msgstr "Lisไtty cscope-tietokanta %s"
+msgstr "Lisรคtty cscope-tietokanta %s"
-#: ../if_cscope.c:616
-#, c-format
-msgid "E262: error reading cscope connection %<PRId64>"
-msgstr "E262: Virhe luettaessa cscope-yhteyttไ %<PRId64>"
+#, fuzzy, c-format
+#~ msgid "E262: error reading cscope connection %<PRIu64>"
+#~ msgstr "E262: Virhe luettaessa cscope-yhteyttรค %ld"
-#: ../if_cscope.c:711
msgid "E561: unknown cscope search type"
msgstr "E561: tuntematon cscope-hakutyyppi"
-#: ../if_cscope.c:752 ../if_cscope.c:789
msgid "E566: Could not create cscope pipes"
msgstr "E566: Ei voitu luoda cscope-putkia"
-#: ../if_cscope.c:767
msgid "E622: Could not fork for cscope"
msgstr "E622: Ei voitu haarauttaa cscopea"
-#: ../if_cscope.c:849
-#, fuzzy
msgid "cs_create_connection setpgid failed"
-msgstr "cs_create_connection epไonnistui"
+msgstr "cs_create_connection setpgid epรคonnistui"
-#: ../if_cscope.c:853 ../if_cscope.c:889
msgid "cs_create_connection exec failed"
-msgstr "cs_create_connection epไonnistui"
+msgstr "cs_create_connection epรคonnistui"
-#: ../if_cscope.c:863 ../if_cscope.c:902
msgid "cs_create_connection: fdopen for to_fp failed"
-msgstr "cs_create_connection: fdopen to_fp epไonnistui"
+msgstr "cs_create_connection: fdopen to_fp epรคonnistui"
-#: ../if_cscope.c:865 ../if_cscope.c:906
msgid "cs_create_connection: fdopen for fr_fp failed"
-msgstr "cs_create_connection: fdopen fr_fp epไonnistui"
+msgstr "cs_create_connection: fdopen fr_fp epรคonnistui"
-#: ../if_cscope.c:890
msgid "E623: Could not spawn cscope process"
-msgstr "E623: Cscope-prosessin luonti epไonnistui"
+msgstr "E623: Cscope-prosessin luonti epรคonnistui"
-#: ../if_cscope.c:932
msgid "E567: no cscope connections"
-msgstr "E567: ei cscope-yhteyksiไ"
+msgstr "E567: ei cscope-yhteyksiรค"
-#: ../if_cscope.c:1009
#, c-format
msgid "E469: invalid cscopequickfix flag %c for %c"
msgstr "E469: virheellinen cscopequickfix-asetus %c kohteelle %c"
-#: ../if_cscope.c:1058
#, c-format
msgid "E259: no matches found for cscope query %s of %s"
-msgstr "E259: ei tไsmไyksiไ cscope-hakuun %s/%s"
+msgstr "E259: ei tรคsmรคyksiรค cscope-hakuun %s/%s"
-#: ../if_cscope.c:1142
msgid "cscope commands:\n"
msgstr "cscope-komennot:\n"
-#: ../if_cscope.c:1150
#, c-format
msgid "%-5s: %s%*s (Usage: %s)"
-msgstr "%-5s: %s%*s (Kไytt๖: %s)"
+msgstr "%-5s: %s%*s (Kรคyttรถ: %s)"
-#: ../if_cscope.c:1155
-#, fuzzy
msgid ""
"\n"
+" a: Find assignments to this symbol\n"
" c: Find functions calling this function\n"
" d: Find functions called by this function\n"
" e: Find this egrep pattern\n"
@@ -3251,40 +3093,35 @@ msgid ""
" t: Find this text string\n"
msgstr ""
"\n"
-" c: Etsi tไtไ funktiota kutsuvat funktiot\n"
-" d: Etsi tไmไn funktion kutsumat funktiot\n"
-" e: Etsi tไmไ egrep-lauseke\n"
-" f: Find tไmไ tiedosto\n"
-" g: Etsi tไmไ mไไritys\n"
-" i: Etsi tiedostoja jotka #inkluudaavat tไmไn\n"
-" s: Etsi tไmไ C-symboli\n"
+" a: Etsi sijotukset tรคhรคn symboliin\n"
+" c: Etsi tรคtรค funktiota kutsuvat funktiot\n"
+" d: Etsi tรคmรคn funktion kutsumat funktiot\n"
+" e: Etsi tรคmรค egrep-lauseke\n"
+" f: Etsi tรคmรค tiedosto\n"
+" g: Etsi tรคmรค mรครคritys\n"
+" i: Etsi tiedostoja jotka #inkluudaavat tรคmรคn\n"
+" s: Etsi tรคmรค C-symboli\n"
" t: Etsi sijoitukset muuttujaan \n"
-#: ../if_cscope.c:1226
msgid "E568: duplicate cscope database not added"
-msgstr "E568: kaksoiskappaletta cscope-tietokannasta ei lisไtty"
+msgstr "E568: kaksoiskappaletta cscope-tietokannasta ei lisรคtty"
-#: ../if_cscope.c:1335
#, c-format
msgid "E261: cscope connection %s not found"
msgstr "E261: cscope-yhteys %s puuttuu"
-#: ../if_cscope.c:1364
#, c-format
msgid "cscope connection %s closed"
msgstr "cscope-yhteys %s on katkaistu"
-#. should not reach here
-#: ../if_cscope.c:1486
msgid "E570: fatal error in cs_manage_matches"
msgstr "E570: kriittinen virhe cs_manage_matches-funktiossa"
-#: ../if_cscope.c:1693
#, c-format
msgid "Cscope tag: %s"
-msgstr "Cscope-tไgi: %s"
+msgstr "Cscope-tรคgi: %s"
-#: ../if_cscope.c:1711
+#. Column headers for match number, line number and filename.
msgid ""
"\n"
" # line"
@@ -3292,326 +3129,270 @@ msgstr ""
"\n"
" # rivi"
-#: ../if_cscope.c:1713
msgid "filename / context / line\n"
msgstr "tiedosto / konteksti / rivi\n"
-#: ../if_cscope.c:1809
#, c-format
msgid "E609: Cscope error: %s"
msgstr "E609: Cscope-virhe: %s"
-#: ../if_cscope.c:2053
msgid "All cscope databases reset"
msgstr "Kaikki cscope-tietokannat nollattu"
-#: ../if_cscope.c:2123
msgid "no cscope connections\n"
-msgstr "ei cscope-yhteyksiไ\n"
+msgstr "ei cscope-yhteyksiรค\n"
-#: ../if_cscope.c:2126
msgid " # pid database name prepend path\n"
-msgstr " # pid tietokanta lisไyspolku\n"
+msgstr " # pid tietokanta lisรคyspolku\n"
+
+#. Error messages
+msgid "Argument missing after"
+msgstr "Argumentti puuttuu kohdasta"
+
+msgid "Garbage after option argument"
+msgstr "Roskaa argumentin perรคssรค"
-#: ../main.c:144
msgid "Unknown option argument"
msgstr "Tuntematon asetusargumentti"
-#: ../main.c:146
msgid "Too many edit arguments"
msgstr "Liikaa muokkausargumentteja"
-#: ../main.c:148
-msgid "Argument missing after"
-msgstr "Argumentti puuttuu kohdasta"
-
-#: ../main.c:150
-msgid "Garbage after option argument"
-msgstr "Roskaa argumentin perไssไ"
-
-#: ../main.c:152
msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"
msgstr "Liikaa +komentoja, -c-komentoja tai --cmd-komentoja"
-#: ../main.c:154
-msgid "Invalid argument for"
-msgstr "Vไไrไ argumentti valitsimelle"
-
-#: ../main.c:294
-#, c-format
-msgid "%d files to edit\n"
-msgstr "%d tiedostoa muokattavana\n"
-
-#: ../main.c:1342
msgid "Attempt to open script file again: \""
msgstr "Yritettiin avata skriptitiedostoa uudestaan:"
-#: ../main.c:1350
msgid "Cannot open for reading: \""
msgstr "Ei voi avata luettavaksi: "
-#: ../main.c:1393
msgid "Cannot open for script output: \""
msgstr "Ei voi avata skriptin tulostetta varten: "
-#: ../main.c:1622
msgid "Vim: Warning: Output is not to a terminal\n"
msgstr "Vim: Varoitus: Tuloste ei mene terminaalille\n"
-#: ../main.c:1624
msgid "Vim: Warning: Input is not from a terminal\n"
-msgstr "Vim: Varoitus: Sy๖te ei tule terminaalilta\n"
+msgstr "Vim: Varoitus: Syรถte ei tule terminaalilta\n"
-#. just in case..
-#: ../main.c:1891
msgid "pre-vimrc command line"
msgstr "esi-vimrc-komentorivi"
-#: ../main.c:1964
#, c-format
msgid "E282: Cannot read from \"%s\""
msgstr "E282: Ei voida lukea kohteesta %s"
-#: ../main.c:2149
+#, fuzzy
msgid ""
"\n"
-"More info with: \"vim -h\"\n"
+"More info with \""
msgstr ""
"\n"
-"Lisไtietoja: \"vim -h\"\n"
+"Lisรคtietoja: \"vim -h\"\n"
-#: ../main.c:2178
-msgid "[file ..] edit specified file(s)"
-msgstr "[tiedosto ..] muokkaa tiedostoja"
-
-#: ../main.c:2179
-msgid "- read text from stdin"
-msgstr "- lue vakiosy๖tteestไ"
-
-#: ../main.c:2180
-msgid "-t tag edit file where tag is defined"
-msgstr "-t tไgi muokkaa tiedostoa tไgistไ"
+#. kill us with CTRL-C here, if you like
+#, fuzzy
+#~ msgid "Usage:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ "kรคyttรถ:"
-#: ../main.c:2181
-msgid "-q [errorfile] edit file with first error"
-msgstr "-q [virhetiedosto] muokkaa tiedostoa ensimmไisestไ virheestไ"
+#, fuzzy
+#~ msgid " nvim [arguments] [file ...] Edit specified file(s)\n"
+#~ msgstr "[tiedosto ..] muokkaa tiedostoja"
-#: ../main.c:2187
-msgid ""
-"\n"
-"\n"
-"usage:"
-msgstr ""
-"\n"
-"\n"
-"kไytt๖:"
+#, fuzzy
+#~ msgid " nvim [arguments] - Read text from stdin\n"
+#~ msgstr "- lue vakiosyรถtteestรค"
-#: ../main.c:2189
-msgid " vim [arguments] "
-msgstr " vim [argumentit] "
+#, fuzzy
+#~ msgid " nvim [arguments] -t <tag> Edit file where tag is defined\n"
+#~ msgstr "-t tรคgi muokkaa tiedostoa tรคgistรค"
-#: ../main.c:2193
-msgid ""
-"\n"
-" or:"
-msgstr ""
-"\n"
-" tai:"
+#, fuzzy
+#~ msgid " nvim [arguments] -q [errorfile] Edit file with first error\n"
+#~ msgstr "-q [virhetiedosto] muokkaa tiedostoa ensimmรคisestรค virheestรค"
-#: ../main.c:2196
+#, fuzzy
msgid ""
"\n"
-"\n"
"Arguments:\n"
msgstr ""
"\n"
"\n"
"Argumentit:\n"
-#: ../main.c:2197
-msgid "--\t\t\tOnly file names after this"
-msgstr "--\t\t\tvain tiedostonimiไ tไmไn jไlkeen"
-
-#: ../main.c:2199
-msgid "--literal\t\tDon't expand wildcards"
-msgstr "--literal\t\tฤlไ kไsittele jokerimerkkejไ "
-
-#: ../main.c:2201
-msgid "-v\t\t\tVi mode (like \"vi\")"
-msgstr "-v\t\t\tVi-tila (kuten villไ)"
+#, fuzzy
+#~ msgid " -- Only file names after this\n"
+#~ msgstr "--\t\t\tvain tiedostonimiรค tรคmรคn jรคlkeen"
-#: ../main.c:2202
-msgid "-e\t\t\tEx mode (like \"ex\")"
-msgstr "-e\t\t\tEx-tila (kute exillไ)"
+#, fuzzy
+#~ msgid " --literal Don't expand wildcards\n"
+#~ msgstr "--literal\t\tร„lรค kรคsittele jokerimerkkejรค "
-#: ../main.c:2203
-msgid "-E\t\t\tImproved Ex mode"
-msgstr ""
+#, fuzzy
+#~ msgid " -e Ex mode\n"
+#~ msgstr " kahta tilaa varten "
-#: ../main.c:2204
-msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")"
-msgstr "-s\t\t\tHiljainen (erไajo)tila (vain exillไ)"
+#, fuzzy
+#~ msgid " -E Improved Ex mode\n"
+#~ msgstr " kahta tilaa varten "
-#: ../main.c:2205
-msgid "-d\t\t\tDiff mode (like \"vimdiff\")"
-msgstr "-d\t\t\tDiff-tila (kuten vimdiffillไ)"
+#, fuzzy
+#~ msgid " -s Silent (batch) mode (only for ex mode)\n"
+#~ msgstr "-s\t\t\tHiljainen (erรคajo)tila (vain exillรค)"
-#: ../main.c:2206
-msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
-msgstr "-y\t\t\tHelppokไytt๖tila (kuten evimissไ, ilman tiloja)"
+#, fuzzy
+#~ msgid " -d Diff mode\n"
+#~ msgstr " kahta tilaa varten "
-#: ../main.c:2207
-msgid "-R\t\t\tReadonly mode (like \"view\")"
-msgstr "-R\t\t\tKirjoitussuojattu tila (kuten view'lla)"
+#, fuzzy
+#~ msgid " -R Read-only mode\n"
+#~ msgstr " kahta tilaa varten "
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tRajoitettu tila (kuten rvimillไ)"
+#, fuzzy
+#~ msgid " -Z Restricted mode\n"
+#~ msgstr " kahta tilaa varten "
-#: ../main.c:2209
-msgid "-m\t\t\tModifications (writing files) not allowed"
-msgstr "-m\t\t\tMuokkaukset (kirjoittaminen tiedostoon) pois kไyt๖stไ"
+#, fuzzy
+#~ msgid " -m Modifications (writing files) not allowed\n"
+#~ msgstr "-m\t\t\tMuokkaukset (kirjoittaminen tiedostoon) pois kรคytรถstรค"
-#: ../main.c:2210
-msgid "-M\t\t\tModifications in text not allowed"
-msgstr "-M\t\t\tTekstin muokkaus pois kไyt๖stไ"
+#, fuzzy
+#~ msgid " -M Modifications in text not allowed\n"
+#~ msgstr "-M\t\t\tTekstin muokkaus pois kรคytรถstรค"
-#: ../main.c:2211
-msgid "-b\t\t\tBinary mode"
-msgstr "-b\t\t\tBinไไritila"
+#, fuzzy
+#~ msgid " -b Binary mode\n"
+#~ msgstr " kahta tilaa varten "
-#: ../main.c:2212
-msgid "-l\t\t\tLisp mode"
-msgstr "-l\t\t\tLisp-tila"
+#, fuzzy
+#~ msgid " -l Lisp mode\n"
+#~ msgstr " kahta tilaa varten "
-#: ../main.c:2213
-msgid "-C\t\t\tCompatible with Vi: 'compatible'"
-msgstr "-C\t\t\tVi-yhteensopivuustila: compatible"
+#, fuzzy
+#~ msgid " -A Arabic mode\n"
+#~ msgstr " kahta tilaa varten "
-#: ../main.c:2214
-msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'"
-msgstr "-N\t\t\tEi Vi-yhteensopivuutta: nocompatible"
+#, fuzzy
+#~ msgid " -F Farsi mode\n"
+#~ msgstr " kahta tilaa varten "
-#: ../main.c:2215
-msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]"
-msgstr ""
-"-V[N][tnimi]\t\tMonisanainen tuloste [Taso N] [kirjoita tuloste tnimeen] "
+#, fuzzy
+#~ msgid " -H Hebrew mode\n"
+#~ msgstr " kahta tilaa varten "
-#: ../main.c:2216
-msgid "-D\t\t\tDebugging mode"
-msgstr "-D\t\t\tVianetsintไtila"
+#, fuzzy
+#~ msgid " -V[N][file] Be verbose [level N][log messages to file]\n"
+#~ msgstr ""
+#~ "-V[N][tnimi]\t\tMonisanainen tuloste [Taso N] [kirjoita tuloste tnimeen] "
-#: ../main.c:2217
-msgid "-n\t\t\tNo swap file, use memory only"
-msgstr "-n\t\t\tEi swap-tiedostoja, kไytไ muistia"
+#, fuzzy
+#~ msgid " -D Debugging mode\n"
+#~ msgstr " kahta tilaa varten "
-#: ../main.c:2218
-msgid "-r\t\t\tList swap files and exit"
-msgstr "-r\t\t\tLuetteloi swap-tiedostot ja poistu"
+#, fuzzy
+#~ msgid " -n No swap file, use memory only\n"
+#~ msgstr "-n\t\t\tEi swap-tiedostoja, kรคytรค muistia"
-#: ../main.c:2219
-msgid "-r (with file name)\tRecover crashed session"
-msgstr "-r (tiedostonimi)\tPalauta kaatunut sessio"
+#, fuzzy
+#~ msgid " -r, -L List swap files and exit\n"
+#~ msgstr "-r\t\t\tLuetteloi swap-tiedostot ja poistu"
-#: ../main.c:2220
-msgid "-L\t\t\tSame as -r"
-msgstr "-L\t\t\tkuten -r"
+#, fuzzy
+#~ msgid " -r <file> Recover crashed session\n"
+#~ msgstr "-r (tiedostonimi)\tPalauta kaatunut sessio"
-#: ../main.c:2221
-msgid "-A\t\t\tstart in Arabic mode"
-msgstr "-A\t\t\tkไynnistไ arabia-tilassa"
+#, fuzzy
+#~ msgid " -u <vimrc> Use <vimrc> instead of the default\n"
+#~ msgstr "-u <vimrc>\t\tKรคytรค <vimrc>-tiedostoa .vimrc:iden sijasta"
-#: ../main.c:2222
-msgid "-H\t\t\tStart in Hebrew mode"
-msgstr "-H\t\t\tkไynnistไ heprea-tilassa"
+#~ msgid " -i <shada> Use <shada> instead of the default\n"
+#~ msgstr ""
-#: ../main.c:2223
-msgid "-F\t\t\tStart in Farsi mode"
-msgstr "-F\t\t\tkไynnistไ farsi-tilassa"
+#, fuzzy
+#~ msgid " --noplugin Don't load plugin scripts\n"
+#~ msgstr "--noplugin\t\tร„lรค lataa liitรคnnรคisiรค"
-#: ../main.c:2224
-msgid "-T <terminal>\tSet terminal type to <terminal>"
-msgstr "-T <terminaali>\tAseta terminaalin tyypiksi <terminaali>"
+#, fuzzy
+#~ msgid " -o[N] Open N windows (default: one for each file)\n"
+#~ msgstr "-o[N]\t\tAvaa N ikkunaa (oletus: yksi per tiedosto)"
-#: ../main.c:2225
-msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc"
-msgstr "-u <vimrc>\t\tKไytไ <vimrc>-tiedostoa .vimrc:iden sijasta"
+#, fuzzy
+#~ msgid " -O[N] Like -o but split vertically\n"
+#~ msgstr "-O[N]\t\tKuten -o, mutta jaa pystysuunnassa"
-#: ../main.c:2226
-msgid "--noplugin\t\tDon't load plugin scripts"
-msgstr "--noplugin\t\tฤlไ lataa liitไnnไisiไ"
+#, fuzzy
+#~ msgid " -p[N] Open N tab pages (default: one for each file)\n"
+#~ msgstr "-p[N]\t\tAvaa N vรคlilehteรค (oletus: yksi per tiedosto)"
-#: ../main.c:2227
-msgid "-p[N]\t\tOpen N tab pages (default: one for each file)"
-msgstr "-p[N]\t\tAvaa N vไlilehteไ (oletus: yksi per tiedosto)"
+#, fuzzy
+#~ msgid " + Start at end of file\n"
+#~ msgstr " kahta tilaa varten "
-#: ../main.c:2228
-msgid "-o[N]\t\tOpen N windows (default: one for each file)"
-msgstr "-o[N]\t\tAvaa N ikkunaa (oletus: yksi per tiedosto)"
+#, fuzzy
+#~ msgid " +<linenum> Start at line <linenum>\n"
+#~ msgstr "+<rivi>\t\t\tAloita riviltรค <rivi>"
-#: ../main.c:2229
-msgid "-O[N]\t\tLike -o but split vertically"
-msgstr "-O[N]\t\tKuten -o, mutta jaa pystysuunnassa"
+#~ msgid " +/<pattern> Start at first occurrence of <pattern>\n"
+#~ msgstr ""
-#: ../main.c:2230
-msgid "+\t\t\tStart at end of file"
-msgstr "+\t\t\tAloita tiedoston lopusta"
+#, fuzzy
+#~ msgid " --cmd <command> Execute <command> before loading any vimrc\n"
+#~ msgstr "--cmd <komento>\tSuorita <komento> ennen vimrc:iden latausta"
-#: ../main.c:2231
-msgid "+<lnum>\t\tStart at line <lnum>"
-msgstr "+<rivi>\t\t\tAloita riviltไ <rivi>"
+#, fuzzy
+msgid ""
+" -c <command> Execute <command> after loading the first file\n"
+msgstr "-c <komento>\t\tSuorita <komento> ensimmรคisen tiedoston latauduttua"
-#: ../main.c:2232
-msgid "--cmd <command>\tExecute <command> before loading any vimrc file"
-msgstr "--cmd <komento>\tSuorita <komento> ennen vimrc:iden latausta"
+#, fuzzy
+#~ msgid " -S <session> Source <session> after loading the first file\n"
+#~ msgstr "-S <sessio>\t\tLataa <sessio> ensimmรคisen tiedoston latauduttua"
-#: ../main.c:2233
-msgid "-c <command>\t\tExecute <command> after loading the first file"
-msgstr "-c <komento>\t\tSuorita <komento> ensimmไisen tiedoston latauduttua"
+#, fuzzy
+#~ msgid " -s <scriptin> Read Normal mode commands from <scriptin>\n"
+#~ msgstr "-s <skripti>\tLue normaalitilan komentoja <skripti>-tiedostosta"
-#: ../main.c:2235
-msgid "-S <session>\t\tSource file <session> after loading the first file"
-msgstr "-S <sessio>\t\tLataa <sessio> ensimmไisen tiedoston latauduttua"
+#, fuzzy
+#~ msgid " -w <scriptout> Append all typed characters to <scriptout>\n"
+#~ msgstr "-w <skripti>\tLisรครค kirjoitetut komennot <skripti>-tiedostoon"
-#: ../main.c:2236
-msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>"
-msgstr "-s <skripti>\tLue normaalitilan komentoja <skripti>-tiedostosta"
+#, fuzzy
+#~ msgid " -W <scriptout> Write all typed characters to <scriptout>\n"
+#~ msgstr "-W <skripti>\tKirjoita komennot <skripti>-tiedostoon"
-#: ../main.c:2237
-msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>"
-msgstr "-w <skripti>\tLisไไ kirjoitetut komennot <skripti>-tiedostoon"
+#, fuzzy
+#~ msgid " --startuptime <file> Write startup timing messages to <file>\n"
+#~ msgstr "--startuptime <file>\tKirjoita kรคynnistysaikaviestit tiedostoon <file>"
-#: ../main.c:2238
-msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>"
-msgstr "-W <skripti>\tKirjoita komennot <skripti>-tiedostoon"
+#~ msgid ""
+#~ " --api-info Dump API metadata serialized to msgpack and exit\n"
+#~ msgstr ""
-#: ../main.c:2240
-msgid "--startuptime <file>\tWrite startup timing messages to <file>"
-msgstr "--startuptime <file>\tKirjoita kไynnistysaikaviestit tiedostoon <file>"
+#~ msgid " --embed Use stdin/stdout as a msgpack-rpc channel\n"
+#~ msgstr ""
-#: ../main.c:2242
-msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
-msgstr "-i <viminfo>\t\tKไytไ <viminfo>-tiedostoa .viminfon sijaan"
+#~ msgid " --headless Don't start a user interface\n"
+#~ msgstr ""
-#: ../main.c:2243
-msgid "-h or --help\tPrint Help (this message) and exit"
-msgstr "-h tai --help\tTulosta ohje (tไmไ viesti) ja lopeta"
+#, fuzzy
+#~ msgid " -v, --version Print version information and exit\n"
+#~ msgstr "--version\t\t\tTulosta versiotiedot ja lopeta"
-#: ../main.c:2244
-msgid "--version\t\tPrint version information and exit"
-msgstr "--version\t\t\tTulosta versiotiedot ja lopeta"
+#, fuzzy
+#~ msgid " -h, --help Print this help message and exit\n"
+#~ msgstr "-h tai --help\tTulosta ohje (tรคmรค viesti) ja lopeta"
-#: ../mark.c:676
msgid "No marks set"
-msgstr "Ei asetettuja merkkejไ"
+msgstr "Ei asetettuja merkkejรค"
-#: ../mark.c:678
#, c-format
msgid "E283: No marks matching \"%s\""
-msgstr "E283: Mikไไn merkki ei tไsmไไ ilmaukseen \"%s\""
+msgstr "E283: Mikรครคn merkki ei tรคsmรครค ilmaukseen \"%s\""
-#. Highlight title
-#: ../mark.c:687
msgid ""
"\n"
"mark line col file/text"
@@ -3619,8 +3400,6 @@ msgstr ""
"\n"
"merkki rivi sarake tiedosto/teksti"
-#. Highlight title
-#: ../mark.c:789
msgid ""
"\n"
" jump line col file/text"
@@ -3628,8 +3407,6 @@ msgstr ""
"\n"
"hyppy rivi sarake tiedosto/teksti"
-#. Highlight title
-#: ../mark.c:831
msgid ""
"\n"
"change line col text"
@@ -3637,138 +3414,84 @@ msgstr ""
"\n"
"muutos rivi sarake teksti"
-#: ../mark.c:1238
-msgid ""
-"\n"
-"# File marks:\n"
-msgstr ""
-"\n"
-"# Tiedoston merkit:\n"
-
-#. Write the jumplist with -'
-#: ../mark.c:1271
-msgid ""
-"\n"
-"# Jumplist (newest first):\n"
-msgstr ""
-"\n"
-"# Hyppylista (uusin ensiksi):\n"
-
-#: ../mark.c:1352
-msgid ""
-"\n"
-"# History of marks within files (newest to oldest):\n"
-msgstr ""
-"\n"
-"# Tiedostojen merkkien historia (uusimmasta vanhimpaan):\n"
-
-#: ../mark.c:1431
-msgid "Missing '>'"
-msgstr "> puuttuu"
-
-#: ../memfile.c:426
msgid "E293: block was not locked"
msgstr "E293: lohkoa ei ole lukittu"
-#: ../memfile.c:799
msgid "E294: Seek error in swap file read"
msgstr "E294: Hakuvirhe swap-tiedostoa luettaessa"
-#: ../memfile.c:803
msgid "E295: Read error in swap file"
msgstr "E295: Lukuvirhe swap-tiedostossa"
-#: ../memfile.c:849
msgid "E296: Seek error in swap file write"
msgstr "E296: Hakuvirhe swap-tiedostoa kirjoitettaessa"
-#: ../memfile.c:865
msgid "E297: Write error in swap file"
msgstr "E297: Kirjoitusvirhe swap-tiedostossa"
-#: ../memfile.c:1036
msgid "E300: Swap file already exists (symlink attack?)"
-msgstr "E300: Swaptiedosto on jo olemassa (symlink-hy๖kkไys?)"
+msgstr "E300: Swaptiedosto on jo olemassa (symlink-hyรถkkรคys?)"
-#: ../memline.c:318
msgid "E298: Didn't get block nr 0?"
msgstr "E298: Lohko 0:aa ei saatu?"
-#: ../memline.c:361
msgid "E298: Didn't get block nr 1?"
-msgstr "E298: Lohko 1:tไ ei saatu?"
+msgstr "E298: Lohko 1:tรค ei saatu?"
-#: ../memline.c:377
msgid "E298: Didn't get block nr 2?"
msgstr "E298: Lohko 2:ta ei saatu?"
-#. could not (re)open the swap file, what can we do????
-#: ../memline.c:465
msgid "E301: Oops, lost the swap file!!!"
-msgstr "E301: Hups, swap-tiedosto hไvisi!"
+msgstr "E301: Hups, swap-tiedosto hรคvisi!"
-#: ../memline.c:477
msgid "E302: Could not rename swap file"
msgstr "E302: Swap-tiedoston uudellennimeys ei onnistu"
-#: ../memline.c:554
#, c-format
msgid "E303: Unable to open swap file for \"%s\", recovery impossible"
msgstr "E303: Swap-tiedostoa %s ei voi avata, palautus ei onnistu"
-#: ../memline.c:666
msgid "E304: ml_upd_block0(): Didn't get block 0??"
msgstr "E304: ml_upd_block0(): Lohko 0:aa ei saatu?"
#. no swap files found
-#: ../memline.c:830
#, c-format
msgid "E305: No swap file found for %s"
msgstr "E305: Ei swap-tiedostoa tiedostolle %s"
-#: ../memline.c:839
msgid "Enter number of swap file to use (0 to quit): "
msgstr "Anna swap-tiedoston numero tai 0 lopettaaksesi: "
-#: ../memline.c:879
#, c-format
msgid "E306: Cannot open %s"
msgstr "E306: Ei voi avata tiedostoa %s"
-#: ../memline.c:897
msgid "Unable to read block 0 from "
msgstr "Ei voi lukea lohkoa 0 kohteesta "
-#: ../memline.c:900
msgid ""
"\n"
"Maybe no changes were made or Vim did not update the swap file."
msgstr ""
"\n"
-"Muutoksia ei tehty, tai Vim ei pไivittไnyt swap-tiedostoa."
+"Muutoksia ei tehty, tai Vim ei pรคivittรคnyt swap-tiedostoa."
-#: ../memline.c:909
msgid " cannot be used with this version of Vim.\n"
-msgstr " ei toimi tไmไn version Vimin kanssa.\n"
+msgstr " ei toimi tรคmรคn version Vimin kanssa.\n"
-#: ../memline.c:911
msgid "Use Vim version 3.0.\n"
-msgstr "Kไytไ Vimin versiota 3.0\n"
+msgstr "Kรคytรค Vimin versiota 3.0\n"
-#: ../memline.c:916
#, c-format
msgid "E307: %s does not look like a Vim swap file"
msgstr "E307: %s ei ole Vimin swap-tiedosto"
-#: ../memline.c:922
msgid " cannot be used on this computer.\n"
-msgstr " ei toimi tไllไ koneella.\n"
+msgstr " ei toimi tรคllรค koneella.\n"
-#: ../memline.c:924
msgid "The file was created on "
msgstr "Tiedosto luotiin "
-#: ../memline.c:928
msgid ""
",\n"
"or the file has been damaged."
@@ -3776,100 +3499,78 @@ msgstr ""
",\n"
"tai tiedosto on vahingoittunut."
-#: ../memline.c:945
msgid " has been damaged (page size is smaller than minimum value).\n"
-msgstr " on vioittunut (sivun koko on vไhimmไisarvoa pienempi).\n"
+msgstr " on vioittunut (sivun koko on vรคhimmรคisarvoa pienempi).\n"
-#: ../memline.c:974
#, c-format
msgid "Using swap file \"%s\""
-msgstr "Kไytetไไn swap-tiedostoa %s"
+msgstr "Kรคytetรครคn swap-tiedostoa %s"
-#: ../memline.c:980
#, c-format
msgid "Original file \"%s\""
-msgstr "Alkuperไinen tiedosto %s"
+msgstr "Alkuperรคinen tiedosto %s"
-#: ../memline.c:995
msgid "E308: Warning: Original file may have been changed"
-msgstr "E308: Varoitus: Alkuperไistไ tiedostoa saattaa olla muutettu"
+msgstr "E308: Varoitus: Alkuperรคistรค tiedostoa saattaa olla muutettu"
-#: ../memline.c:1061
#, c-format
msgid "E309: Unable to read block 1 from %s"
msgstr "E309: Ei voitu lukea lohkoa 1 tiedostosta %s"
-#: ../memline.c:1065
msgid "???MANY LINES MISSING"
-msgstr "???PALJON RIVEJฤ PUUTTUU"
+msgstr "???PALJON RIVEJร„ PUUTTUU"
-#: ../memline.c:1076
msgid "???LINE COUNT WRONG"
-msgstr "???RIVIMฤฤRฤ PIELESSฤ"
+msgstr "???RIVIMร„ร„Rร„ PIELESSร„"
-#: ../memline.c:1082
msgid "???EMPTY BLOCK"
-msgstr "???TYHJฤ LOHKO"
+msgstr "???TYHJร„ LOHKO"
-#: ../memline.c:1103
msgid "???LINES MISSING"
-msgstr "???RIVEJฤ PUUTTUU"
+msgstr "???RIVEJร„ PUUTTUU"
-#: ../memline.c:1128
#, c-format
msgid "E310: Block 1 ID wrong (%s not a .swp file?)"
-msgstr "E310: Lohon 1 tunniste vไไrไ (%s ei ole .swp-tiedosto?)"
+msgstr "E310: Lohon 1 tunniste vรครคrรค (%s ei ole .swp-tiedosto?)"
-#: ../memline.c:1133
msgid "???BLOCK MISSING"
msgstr "???LOHKO PUUTTUU"
-#: ../memline.c:1147
msgid "??? from here until ???END lines may be messed up"
-msgstr "??? tไstไ kohtaan ???LOPPU rivejไ sekaisin"
+msgstr "??? tรคstรค kohtaan ???LOPPU rivejรค sekaisin"
-#: ../memline.c:1164
msgid "??? from here until ???END lines may have been inserted/deleted"
-msgstr "??? tไstไ kohtaan ???LOPPU rivejไ saattaa olla lisไtty tai poistettu"
+msgstr "??? tรคstรค kohtaan ???LOPPU rivejรค saattaa olla lisรคtty tai poistettu"
-#: ../memline.c:1181
msgid "???END"
msgstr "???LOPPU"
-#: ../memline.c:1238
msgid "E311: Recovery Interrupted"
msgstr "E311: Palautus keskeytetty"
-#: ../memline.c:1243
msgid ""
"E312: Errors detected while recovering; look for lines starting with ???"
-msgstr "E312: Palautuksessa oli virheitไ, etsi rivejไ, jotka alkavat ???"
+msgstr "E312: Palautuksessa oli virheitรค, etsi rivejรค, jotka alkavat ???"
-#: ../memline.c:1245
msgid "See \":help E312\" for more information."
-msgstr ":help E312 kertoo lisไtietoja"
+msgstr ":help E312 kertoo lisรคtietoja"
-#: ../memline.c:1249
msgid "Recovery completed. You should check if everything is OK."
-msgstr "Palautus onnistui. Tarkista, ettไ kaikki on kunnossa."
+msgstr "Palautus onnistui. Tarkista, ettรค kaikki on kunnossa."
-#: ../memline.c:1251
msgid ""
"\n"
"(You might want to write out this file under another name\n"
msgstr ""
"\n"
-"(Saattaa kannattaa kirjoittaa tไmไ tiedosto toisella nimellไ\n"
+"(Saattaa kannattaa kirjoittaa tรคmรค tiedosto toisella nimellรค\n"
-#: ../memline.c:1252
msgid "and run diff with the original file to check for changes)"
-msgstr "ja katso diffillไ muutokset alkuperไiseen tiedostoon)"
+msgstr "ja katso diffillรค muutokset alkuperรคiseen tiedostoon)"
-#: ../memline.c:1254
msgid "Recovery completed. Buffer contents equals file contents."
-msgstr "Palautus onnistui. Puskurin ja tiedoston sisไll๖t tไsmไไvไt."
+msgstr "Palautus onnistui. Puskurin ja tiedoston sisรคllรถt tรคsmรครคvรคt."
-#: ../memline.c:1255
msgid ""
"\n"
"You may want to delete the .swp file now.\n"
@@ -3879,52 +3580,42 @@ msgstr ""
"Voit poistaa .swp-tiedosto nyt.\n"
"\n"
-#. use msg() to start the scrolling properly
-#: ../memline.c:1327
msgid "Swap files found:"
-msgstr "Swap-tiedostoja l๖ytyi:"
+msgstr "Swap-tiedostoja lรถytyi:"
-#: ../memline.c:1446
msgid " In current directory:\n"
-msgstr " Tไssไ hakemistossa:\n"
+msgstr " Tรคssรค hakemistossa:\n"
-#: ../memline.c:1448
msgid " Using specified name:\n"
-msgstr " Mไไritellyllไ nimellไ:\n"
+msgstr " Mรครคritellyllรค nimellรค:\n"
-#: ../memline.c:1450
msgid " In directory "
msgstr " Hakemistossa "
-#: ../memline.c:1465
msgid " -- none --\n"
-msgstr " -- ei mitไไn --\n"
+msgstr " -- ei mitรครคn --\n"
-#: ../memline.c:1527
msgid " owned by: "
msgstr " omistaja: "
-#: ../memline.c:1529
msgid " dated: "
msgstr " ajalta: "
-#: ../memline.c:1532 ../memline.c:3231
msgid " dated: "
msgstr " ajalta:"
-#: ../memline.c:1548
msgid " [from Vim version 3.0]"
msgstr " [Vimin 3.0-versiosta]"
-#: ../memline.c:1550
msgid " [does not look like a Vim swap file]"
-msgstr " [ei nไytไ Vimin swap-tiedostolta]"
+msgstr " [ei nรคytรค Vimin swap-tiedostolta]"
+
+#~ msgid " [garbled strings (not nul terminated)]"
+#~ msgstr ""
-#: ../memline.c:1552
msgid " file name: "
msgstr " tiedostonimi: "
-#: ../memline.c:1558
msgid ""
"\n"
" modified: "
@@ -3932,27 +3623,22 @@ msgstr ""
"\n"
" muokattu: "
-#: ../memline.c:1559
msgid "YES"
-msgstr "KYLLฤ"
+msgstr "KYLLร„"
-#: ../memline.c:1559
msgid "no"
msgstr "ei"
-#: ../memline.c:1562
msgid ""
"\n"
" user name: "
msgstr ""
"\n"
-" kไyttไjไnimi: "
+" kรคyttรคjรคnimi: "
-#: ../memline.c:1568
msgid " host name: "
msgstr " laitenimi: "
-#: ../memline.c:1570
msgid ""
"\n"
" host name: "
@@ -3960,7 +3646,6 @@ msgstr ""
"\n"
" laitenimi: "
-#: ../memline.c:1575
msgid ""
"\n"
" process ID: "
@@ -3968,190 +3653,141 @@ msgstr ""
"\n"
" prosessin tunniste: "
-#: ../memline.c:1579
msgid " (still running)"
-msgstr " (kไynnissไ)"
+msgstr " (kรคynnissรค)"
-#: ../memline.c:1586
msgid ""
"\n"
" [not usable on this computer]"
msgstr ""
"\n"
-" [ei toimi tไllไ koneella]"
+" [ei toimi tรคllรค koneella]"
-#: ../memline.c:1590
msgid " [cannot be read]"
msgstr " [ei voi lukea]"
-#: ../memline.c:1593
msgid " [cannot be opened]"
msgstr " [ei voi avata]"
-#: ../memline.c:1698
msgid "E313: Cannot preserve, there is no swap file"
-msgstr "E313: Ei voi sไilyttไไ, swap-tiedostoa ei ole"
+msgstr "E313: Ei voi sรคilyttรครค, swap-tiedostoa ei ole"
-#: ../memline.c:1747
msgid "File preserved"
-msgstr "Tiedosto sไilytetty"
+msgstr "Tiedosto sรคilytetty"
-#: ../memline.c:1749
msgid "E314: Preserve failed"
-msgstr "E314: Sไilyttไminen epไonnistui"
+msgstr "E314: Sรคilyttรคminen epรคonnistui"
-#: ../memline.c:1819
-#, c-format
-msgid "E315: ml_get: invalid lnum: %<PRId64>"
-msgstr "E315: ml_get: virheellinen lnum: %<PRId64>"
+#, fuzzy, c-format
+#~ msgid "E315: ml_get: invalid lnum: %<PRId64>"
+#~ msgstr "E315: ml_get: virheellinen lnum: %ld"
-#: ../memline.c:1851
-#, c-format
-msgid "E316: ml_get: cannot find line %<PRId64>"
-msgstr "E316: ml_get: riviไ %<PRId64> ei l๖ydy"
+#, fuzzy, c-format
+#~ msgid "E316: ml_get: cannot find line %<PRId64>"
+#~ msgstr "E316: ml_get: riviรค %ld ei lรถydy"
-#: ../memline.c:2236
msgid "E317: pointer block id wrong 3"
-msgstr "E317: osoitinlohkon tunnus vไไrไ 3"
+msgstr "E317: osoitinlohkon tunnus vรครคrรค 3"
-#: ../memline.c:2311
msgid "stack_idx should be 0"
-msgstr "stack_idx pitไไ olla 0"
+msgstr "stack_idx pitรครค olla 0"
-#: ../memline.c:2369
msgid "E318: Updated too many blocks?"
-msgstr "E318: Pไivitetty liikaa lohkoja"
+msgstr "E318: Pรคivitetty liikaa lohkoja"
-#: ../memline.c:2511
msgid "E317: pointer block id wrong 4"
-msgstr "E317: osoitinlohkon tunnus vไไrไ 4"
+msgstr "E317: osoitinlohkon tunnus vรครคrรค 4"
-#: ../memline.c:2536
msgid "deleted block 1?"
msgstr "poistettu lohko 1?"
-#: ../memline.c:2707
-#, c-format
-msgid "E320: Cannot find line %<PRId64>"
-msgstr "E320: Riviไ %<PRId64> ei l๖ydy"
+#, fuzzy, c-format
+#~ msgid "E320: Cannot find line %<PRId64>"
+#~ msgstr "E320: Riviรค %ld ei lรถydy"
-#: ../memline.c:2916
msgid "E317: pointer block id wrong"
-msgstr "E317: osoitinlohkon tunnus vไไrไ"
+msgstr "E317: osoitinlohkon tunnus vรครคrรค"
-#: ../memline.c:2930
msgid "pe_line_count is zero"
msgstr "pe_line_count on nolla"
-#: ../memline.c:2955
-#, c-format
-msgid "E322: line number out of range: %<PRId64> past the end"
-msgstr "E322: rivinumero arvoalueen ulkopuoleta: %<PRId64> on loppua suurempi"
+#, fuzzy, c-format
+#~ msgid "E322: line number out of range: %<PRId64> past the end"
+#~ msgstr "E322: rivinumero arvoalueen ulkopuoleta: %ld on loppua suurempi"
-#: ../memline.c:2959
-#, c-format
-msgid "E323: line count wrong in block %<PRId64>"
-msgstr "E323: rivimไไrไ vไไrin lohkossa %<PRId64>"
+#, fuzzy, c-format
+#~ msgid "E323: line count wrong in block %<PRId64>"
+#~ msgstr "E323: rivimรครคrรค vรครคrin lohkossa %ld"
-#: ../memline.c:2999
msgid "Stack size increases"
msgstr "Pinon koko kasvaa"
-#: ../memline.c:3038
msgid "E317: pointer block id wrong 2"
-msgstr "E317: osoitinlohon tunnus vไไrไ 2"
+msgstr "E317: osoitinlohon tunnus vรครคrรค 2"
-#: ../memline.c:3070
#, c-format
msgid "E773: Symlink loop for \"%s\""
msgstr "E773: Symlinkkisilmukka kohteelle %s"
-#: ../memline.c:3221
msgid "E325: ATTENTION"
msgstr "E325: HUOMAA"
-#: ../memline.c:3222
msgid ""
"\n"
"Found a swap file by the name \""
msgstr ""
"\n"
-"Swap-tiedosto l๖ytyi: \""
+"Swap-tiedosto lรถytyi: \""
-#: ../memline.c:3226
msgid "While opening file \""
msgstr "Avattaessa tiedostoa "
-#: ../memline.c:3239
msgid " NEWER than swap file!\n"
msgstr " joka on UUDEMPI kuin swap-tiedosto!\n"
-#: ../memline.c:3244
-#, fuzzy
msgid ""
"\n"
"(1) Another program may be editing the same file. If this is the case,\n"
" be careful not to end up with two different instances of the same\n"
-" file when making changes."
+" file when making changes. Quit, or continue with caution.\n"
msgstr ""
"\n"
-"(1) Toinen ohjelma saattaa kไyttไไ samaa tiedostoa.\n"
-" Jos nไin on, varo, ettet muokkaa saman tiedoston\n"
-" kahta instanssia yhtไ aikaa.\n"
+"(1) Toinen ohjelma saattaa kรคyttรครค samaa tiedostoa.\n"
+" Jos nรคin on, varo, ettet muokkaa saman tiedoston\n"
+" kahta instanssia yhtรค aikaa. Lopeta tai jatka varoen.\n"
-#: ../memline.c:3245
-#, fuzzy
-msgid " Quit, or continue with caution.\n"
-msgstr " Lopeta, tai jatka.\n"
-
-#: ../memline.c:3246
-#, fuzzy
msgid "(2) An edit session for this file crashed.\n"
-msgstr ""
-"\n"
-"(2) Ohjelma on kaatunut muokatessa tiedostoa.\n"
+msgstr "(2) Tiedostonmuokkausistunto on kaatunut.\n"
-#: ../memline.c:3247
msgid " If this is the case, use \":recover\" or \"vim -r "
-msgstr " Jos nไin on, kไytไ komentoa :recover tai vim -r "
+msgstr " Jos nรคin on, kรคytรค komentoa :recover tai vim -r "
-#: ../memline.c:3249
msgid ""
"\"\n"
" to recover the changes (see \":help recovery\").\n"
msgstr ""
"\"\n"
-" palauttaaksesi muutokset (lisไtietoja: \":help recovery\").\n"
+" palauttaaksesi muutokset (lisรคtietoja: \":help recovery\").\n"
-#: ../memline.c:3250
msgid " If you did this already, delete the swap file \""
-msgstr " Jos teit jo nไin, poista swap-tiedosto "
+msgstr " Jos teit jo nรคin, poista swap-tiedosto "
-#: ../memline.c:3252
msgid ""
"\"\n"
" to avoid this message.\n"
msgstr ""
"\"\n"
-" vไlttไไksesi tไmไn viestin.\n"
+" vรคlttรครคksesi tรคmรคn viestin.\n"
-#: ../memline.c:3450 ../memline.c:3452
msgid "Swap file \""
msgstr "Swap-tiedosto "
-#: ../memline.c:3451 ../memline.c:3455
msgid "\" already exists!"
msgstr " on jo olemassa"
-#: ../memline.c:3457
msgid "VIM - ATTENTION"
msgstr "VIM - HUOMAUTUS"
-#: ../memline.c:3459
-msgid "Swap file already exists!"
-msgstr "Swap-tiedosto on jo olemassa"
-
-#: ../memline.c:3464
msgid ""
"&Open Read-Only\n"
"&Edit anyway\n"
@@ -4165,7 +3801,6 @@ msgstr ""
"&Lopeta\n"
"P&eru"
-#: ../memline.c:3467
msgid ""
"&Open Read-Only\n"
"&Edit anyway\n"
@@ -4189,48 +3824,45 @@ msgstr ""
#.
#. ".s?a"
#. ".saa": tried enough, give up
-#: ../memline.c:3528
msgid "E326: Too many swap files found"
msgstr "E326: Liian monta swap-tiedostoa"
-#: ../memory.c:227
-#, c-format
-msgid "E342: Out of memory! (allocating %<PRIu64> bytes)"
-msgstr "E342: Muisti loppui! (varattaessa %<PRIu64> tavua)"
+#, fuzzy, c-format
+msgid ""
+"E303: Unable to create directory \"%s\" for swap file, recovery impossible: "
+"%s"
+msgstr "E303: Swap-tiedostoa %s ei voi avata, palautus ei onnistu"
+
+#, fuzzy
+#~ msgid "Vim: Data too large to fit into virtual memory space\n"
+#~ msgstr "arvo on liian suuri mahtumaan C:n int-tyyppiin"
+
+#, fuzzy, c-format
+#~ msgid "E342: Out of memory! (allocating %<PRIu64> bytes)"
+#~ msgstr "E342: Muisti loppui! (varattaessa %lu tavua)"
-#: ../menu.c:62
msgid "E327: Part of menu-item path is not sub-menu"
msgstr "E327: Valikkokohtapolun osa ei ole alivalikko"
-#: ../menu.c:63
msgid "E328: Menu only exists in another mode"
msgstr "E328: Valikko on olemassa vain toisessa tilassa"
-#: ../menu.c:64
#, c-format
msgid "E329: No menu \"%s\""
msgstr "E329: Ei valikkoa %s"
-#. Only a mnemonic or accelerator is not valid.
-#: ../menu.c:329
msgid "E792: Empty menu name"
-msgstr "E792: tyhjไ valikkonimi"
+msgstr "E792: tyhjรค valikkonimi"
-#: ../menu.c:340
msgid "E330: Menu path must not lead to a sub-menu"
msgstr "E330: Valikkopolku ei saa johtaa alivalikkoon"
-#: ../menu.c:365
msgid "E331: Must not add menu items directly to menu bar"
-msgstr "E331: Valikkokohtia ei saa lisไtไ suoraan valikkopalkkiin"
+msgstr "E331: Valikkokohtia ei saa lisรคtรค suoraan valikkopalkkiin"
-#: ../menu.c:370
msgid "E332: Separator cannot be part of a menu path"
msgstr "E332: Erotin ei voi olla valikkopolun osa"
-#. Now we have found the matching menu, and we list the mappings
-#. Highlight title
-#: ../menu.c:762
msgid ""
"\n"
"--- Menus ---"
@@ -4238,91 +3870,64 @@ msgstr ""
"\n"
"--- Valikot ---"
-#: ../menu.c:1313
msgid "E333: Menu path must lead to a menu item"
msgstr "E333: Valikkopolun on johdettava valikkokohtaan"
-#: ../menu.c:1330
#, c-format
msgid "E334: Menu not found: %s"
-msgstr "E334: Valikkoa ei l๖ydy: %s"
+msgstr "E334: Valikkoa ei lรถydy: %s"
-#: ../menu.c:1396
#, c-format
msgid "E335: Menu not defined for %s mode"
-msgstr "E335: Valikkoa ei ole mไไritelty %s-tilassa"
-
-#: ../menu.c:1426
-msgid "E336: Menu path must lead to a sub-menu"
-msgstr "E336: Valikkopolun pitไไ johtaa alivalikkoon"
+msgstr "E335: Valikkoa ei ole mรครคritelty %s-tilassa"
-#: ../menu.c:1447
-msgid "E337: Menu not found - check menu names"
-msgstr "E337: Valikkoa ei l๖ytynyt - tarkista valikkojen nimet"
-
-#: ../message.c:423
#, c-format
msgid "Error detected while processing %s:"
msgstr "Virhe suoritettaessa komentoja %s:"
-#: ../message.c:445
#, c-format
msgid "line %4ld:"
msgstr "rivi %4ld:"
-#: ../message.c:617
#, c-format
msgid "E354: Invalid register name: '%s'"
msgstr "E354: Virheellinen rekisterin nimi: %s"
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr "Kไไnn๖ksen yllไpitไjไ: Flammie Pirinen <flammie@iki.fi>"
-
-#: ../message.c:986
msgid "Interrupt: "
msgstr "Keskeytys: "
-#: ../message.c:988
msgid "Press ENTER or type command to continue"
-msgstr "Paina enteriไ tai kirjoita komento aloittaaksesi "
+msgstr "Paina enteriรค tai kirjoita komento aloittaaksesi "
-#: ../message.c:1843
-#, c-format
-msgid "%s line %<PRId64>"
-msgstr "%s rivi %<PRId64>"
+#, fuzzy, c-format
+#~ msgid "%s line %<PRId64>"
+#~ msgstr "%s rivi %ld"
-#: ../message.c:2392
msgid "-- More --"
-msgstr "-- Lisไไ --"
+msgstr "-- Lisรครค --"
-#: ../message.c:2398
msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "
-msgstr " SPACE/d/j: ruutu/sivu/rivi alas, b/u/k: yl๖s, q: lopeta "
+msgstr " SPACE/d/j: ruutu/sivu/rivi alas, b/u/k: ylรถs, q: lopeta "
-#: ../message.c:3021 ../message.c:3031
msgid "Question"
msgstr "Kysymys"
-#: ../message.c:3023
msgid ""
"&Yes\n"
"&No"
msgstr ""
-"&Kyllไ\n"
+"&Kyllรค\n"
"&Ei"
-#: ../message.c:3033
msgid ""
"&Yes\n"
"&No\n"
"&Cancel"
msgstr ""
-"&Kyllไ\n"
+"&Kyllรค\n"
"&Ei\n"
"&Peru"
-#: ../message.c:3045
msgid ""
"&Yes\n"
"&No\n"
@@ -4330,180 +3935,165 @@ msgid ""
"&Discard All\n"
"&Cancel"
msgstr ""
-"&Kyllไ\n"
+"&Kyllรค\n"
"&Ei\n"
"&Tallenna kaikki\n"
"T&uhoa kaikki\n"
"&Peru"
-#: ../message.c:3058
-msgid "E766: Insufficient arguments for printf()"
-msgstr "E766: printf():lle ei annettu tarpeeksi argumentteja"
-
-#: ../message.c:3119
-msgid "E807: Expected Float argument for printf()"
-msgstr "E807: Odotettiin Float-argumenttia printf():lle"
-
-#: ../message.c:3873
-msgid "E767: Too many arguments to printf()"
-msgstr "E767: printf():lle annettiin liikaa argumentteja"
-
-#: ../misc1.c:2256
msgid "W10: Warning: Changing a readonly file"
msgstr "W10: Varoitus: Muutetaan kirjoitussuojattua tiedostoa"
-#: ../misc1.c:2537
msgid "Type number and <Enter> or click with mouse (empty cancels): "
-msgstr "Kirjoita numero ja <Enter> tai valitse hiirellไ (tyhjไ peruu): "
+msgstr "Kirjoita numero ja <Enter> tai valitse hiirellรค (tyhjรค peruu): "
-#: ../misc1.c:2539
msgid "Type number and <Enter> (empty cancels): "
-msgstr "Valitse numero ja <Enter> (tyhjไ peruu): "
+msgstr "Valitse numero ja <Enter> (tyhjรค peruu): "
-#: ../misc1.c:2585
msgid "1 more line"
-msgstr "1 rivi lisไไ"
+msgstr "1 rivi lisรครค"
-#: ../misc1.c:2588
msgid "1 line less"
-msgstr "1 rivi vไhemmไn"
+msgstr "1 rivi vรคhemmรคn"
-#: ../misc1.c:2593
-#, c-format
-msgid "%<PRId64> more lines"
-msgstr "%<PRId64> riviไ lisไไ"
+#, fuzzy, c-format
+#~ msgid "%<PRId64> more lines"
+#~ msgstr "%ld riviรค lisรครค"
-#: ../misc1.c:2596
-#, c-format
-msgid "%<PRId64> fewer lines"
-msgstr "%<PRId64> riviไ vไhemmไn"
+#, fuzzy, c-format
+#~ msgid "%<PRId64> fewer lines"
+#~ msgstr "%ld riviรค vรคhemmรคn"
-#: ../misc1.c:2599
msgid " (Interrupted)"
msgstr " (Keskeytetty)"
-#: ../misc1.c:2635
msgid "Beep!"
msgstr "Piip!"
-#: ../misc2.c:738
#, c-format
msgid "Calling shell to execute: \"%s\""
msgstr "Kutsutaan kuorta suorittamaan: %s"
-#: ../normal.c:183
+#, c-format
+#~ msgid "Invalid channel: %<PRIu64>"
+#~ msgstr ""
+
+#~ msgid "Message is not an array"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "Message is empty"
+#~ msgstr "Viesti"
+
+#~ msgid "Message type must be an integer"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "Unknown message type"
+#~ msgstr "E574: Tuntematon rekisterityyppi %d"
+
+#~ msgid "Request array size must be 4 (request) or 3 (notification)"
+#~ msgstr ""
+
+#~ msgid "ID must be a positive integer"
+#~ msgstr ""
+
+#~ msgid "Method must be a string"
+#~ msgstr ""
+
+#, fuzzy
+#~ msgid "Parameters must be an array"
+#~ msgstr "merkin nimen pitรครค olla yksi merkki"
+
+#.
+#. * nv_*(): functions called to handle Normal and Visual mode commands.
+#. * n_*(): functions called to handle Normal mode commands.
+#. * v_*(): functions called to handle Visual mode commands.
+#.
msgid "E349: No identifier under cursor"
msgstr "E349: Ei tunnistetta osoittimen alla"
-#: ../normal.c:1866
msgid "E774: 'operatorfunc' is empty"
-msgstr "E774: operatorfunc on tyhjไ"
+msgstr "E774: operatorfunc on tyhjรค"
-#: ../normal.c:2637
msgid "Warning: terminal cannot highlight"
msgstr "Varoitus: terminaalista puuttuu korostus"
-#: ../normal.c:2807
msgid "E348: No string under cursor"
msgstr "E348: Ei merkkijonoa kursorin alla"
-#: ../normal.c:3937
msgid "E352: Cannot erase folds with current 'foldmethod'"
-msgstr "E352: taitoksia ei voi poistaa tไllไ foldmethodilla"
+msgstr "E352: taitoksia ei voi poistaa tรคllรค foldmethodilla"
-#: ../normal.c:5897
msgid "E664: changelist is empty"
-msgstr "E664: muutoslista on tyhjไ"
+msgstr "E664: muutoslista on tyhjรค"
-#: ../normal.c:5899
msgid "E662: At start of changelist"
msgstr "E662: Muutoslistan alussa"
-#: ../normal.c:5901
msgid "E663: At end of changelist"
msgstr "E663: Muutoslistan lopussa"
-#: ../normal.c:7053
-msgid "Type :quit<Enter> to exit Nvim"
-msgstr "Komento :quit<Enter> lopettaa Vimin"
+#, fuzzy
+#~ msgid "Type :quit<Enter> to exit Nvim"
+#~ msgstr "Komento :quit<Enter> lopettaa Vimin"
-#: ../ops.c:248
#, c-format
msgid "1 line %sed 1 time"
-msgstr "1 riviไ %s kerran"
+msgstr "1 riviรค %s kerran"
-#: ../ops.c:250
#, c-format
msgid "1 line %sed %d times"
-msgstr "1 riviไ %s %d kertaa"
+msgstr "1 riviรค %s %d kertaa"
-#: ../ops.c:253
-#, c-format
-msgid "%<PRId64> lines %sed 1 time"
-msgstr "%<PRId64> riviไ %s kerran"
+#, fuzzy, c-format
+#~ msgid "%<PRId64> lines %sed 1 time"
+#~ msgstr "%ld riviรค %s kerran"
-#: ../ops.c:256
-#, c-format
-msgid "%<PRId64> lines %sed %d times"
-msgstr "%<PRId64> riviไ %s %d kertaa"
+#, fuzzy, c-format
+#~ msgid "%<PRId64> lines %sed %d times"
+#~ msgstr "%ld riviรค %s %d kertaa"
-#: ../ops.c:592
-#, c-format
-msgid "%<PRId64> lines to indent... "
-msgstr "%<PRId64> riviไ sisennettไvไnไ..."
+#, fuzzy, c-format
+#~ msgid "%<PRId64> lines to indent... "
+#~ msgstr "%ld riviรค sisennettรคvรคnรค..."
-#: ../ops.c:634
msgid "1 line indented "
msgstr "1 rivi sisennetty "
-#: ../ops.c:636
-#, c-format
-msgid "%<PRId64> lines indented "
-msgstr "%<PRId64> riviไ sisennetty "
+#, fuzzy, c-format
+#~ msgid "%<PRId64> lines indented "
+#~ msgstr "%ld riviรค sisennetty "
-#: ../ops.c:938
msgid "E748: No previously used register"
-msgstr "E748: Ei aiemmin kไytettyjไ rekisterejไ"
-
-#. must display the prompt
-#: ../ops.c:1433
-msgid "cannot yank; delete anyway"
-msgstr "Ei voi kopioida; poista joka tapauksessa"
+msgstr "E748: Ei aiemmin kรคytettyjรค rekisterejรค"
-#: ../ops.c:1929
msgid "1 line changed"
msgstr "1 rivi muuttui"
-#: ../ops.c:1931
-#, c-format
-msgid "%<PRId64> lines changed"
-msgstr "%<PRId64> riviไ muuttui"
+#, fuzzy, c-format
+#~ msgid "%<PRId64> lines changed"
+#~ msgstr "%ld riviรค muuttui"
-#: ../ops.c:2521
msgid "block of 1 line yanked"
msgstr "1 rivin lohko kopioitu"
-#: ../ops.c:2523
msgid "1 line yanked"
msgstr "1 rivi kopioitu"
-#: ../ops.c:2525
-#, c-format
-msgid "block of %<PRId64> lines yanked"
-msgstr "lohko %<PRId64> riviltไ kopioitu"
+#, fuzzy, c-format
+#~ msgid "block of %<PRId64> lines yanked"
+#~ msgstr "lohko %ld riviltรค kopioitu"
-#: ../ops.c:2528
-#, c-format
-msgid "%<PRId64> lines yanked"
-msgstr "%<PRId64> riviไ kopioitu"
+#, fuzzy, c-format
+#~ msgid "%<PRId64> lines yanked"
+#~ msgstr "%ld riviรค kopioitu"
-#: ../ops.c:2710
#, c-format
msgid "E353: Nothing in register %s"
-msgstr "E353: Rekisterissไ %s ei ole mitไไn"
+msgstr "E353: Rekisterissรค %s ei ole mitรครคn"
#. Highlight title
-#: ../ops.c:3185
msgid ""
"\n"
"--- Registers ---"
@@ -4511,207 +4101,142 @@ msgstr ""
"\n"
"--- Rekisterit ---"
-#: ../ops.c:4455
-msgid "Illegal register name"
-msgstr "Virheellinen rekisterin nimi"
-
-#: ../ops.c:4533
msgid ""
-"\n"
-"# Registers:\n"
+"E883: search pattern and expression register may not contain two or more "
+"lines"
msgstr ""
-"\n"
-"# Rekisterit:\n"
+"E883: hakulauseke- ja -ilmausrekisteri ei voi sisรคltรครค kahta tai useampaa "
+"riviรค"
-#: ../ops.c:4575
-#, c-format
-msgid "E574: Unknown register type %d"
-msgstr "E574: Tuntematon rekisterityyppi %d"
-
-#: ../ops.c:5089
-#, c-format
-msgid "%<PRId64> Cols; "
-msgstr "%<PRId64> saraketta, "
+#, fuzzy, c-format
+#~ msgid "%<PRId64> Cols; "
+#~ msgstr "%ld saraketta, "
-#: ../ops.c:5097
-#, c-format
+#, fuzzy, c-format
msgid ""
"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
"%<PRId64> of %<PRId64> Bytes"
-msgstr ""
-"Valittu %s%<PRId64>/%<PRId64> riviไ, %<PRId64>/%<PRId64> sanaa, %<PRId64>/"
-"%<PRId64> tavua"
+msgstr "Valittu %s%ld/%ld riviรค, %lld/%lld sanaa, %lld/%lld tavua"
-#: ../ops.c:5105
-#, c-format
+#, fuzzy, c-format
msgid ""
"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
"%<PRId64> of %<PRId64> Chars; %<PRId64> of %<PRId64> Bytes"
msgstr ""
-"Valittu %s%<PRId64>/%<PRId64> riviไ, %<PRId64>/%<PRId64> sanaa, %<PRId64>/"
-"%<PRId64> merkkiไ, %<PRId64>/%<PRId64> tavua"
+"Valittu %s%ld/%ld riviรค, %lld/%lld sanaa, %lld/%lld merkkiรค, %lld/%lld tavua"
-#: ../ops.c:5123
-#, c-format
+#, fuzzy, c-format
msgid ""
"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Byte "
"%<PRId64> of %<PRId64>"
-msgstr ""
-"Sarake %s/%s, Rivi %<PRId64>/%<PRId64>, sana %<PRId64>/%<PRId64>, tavu "
-"%<PRId64>/%<PRId64>"
+msgstr "Sarake %s/%s, Rivi %ld/%ld, sana %lld/%lld, tavu %lld/%lld"
-#: ../ops.c:5133
-#, c-format
+#, fuzzy, c-format
msgid ""
"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Char "
"%<PRId64> of %<PRId64>; Byte %<PRId64> of %<PRId64>"
msgstr ""
-"Sarake %s/%s, rivi %<PRId64>/%<PRId64>, sana %<PRId64>/%<PRId64>, merkki "
-"%<PRId64>/%<PRId64>, tavu %<PRId64>/%<PRId64>"
+"Sarake %s/%s, rivi %ld/%ld, sana %lld/%lld, merkki %lld/%lld, tavu %lld/%lld"
# Unicode Byte Order Mark
-#: ../ops.c:5146
-#, c-format
-msgid "(+%<PRId64> for BOM)"
-msgstr "(+%<PRId64> BOMista)"
-
-#: ../option.c:1238
-msgid "%<%f%h%m%=Page %N"
-msgstr "%<%f%h%m%=Sivu %N"
-
-#: ../option.c:1574
-msgid "Thanks for flying Vim"
-msgstr "Kiitos ettไ ajoit Vimiไ"
+#, fuzzy, c-format
+#~ msgid "(+%<PRId64> for BOM)"
+#~ msgstr "(+%ld BOMista)"
#. found a mismatch: skip
-#: ../option.c:2698
msgid "E518: Unknown option"
msgstr "E518: Tuntematon asetus"
-#: ../option.c:2709
-msgid "E519: Option not supported"
-msgstr "E519: Asetusta ei tueta"
-
-#: ../option.c:2740
msgid "E520: Not allowed in a modeline"
-msgstr "E520: Ei sallitu modeline-rivillไ"
+msgstr "E520: Ei sallitu modeline-rivillรค"
-#: ../option.c:2815
msgid "E846: Key code not set"
-msgstr ""
+msgstr "E846: Avainkoodi puuttuu"
-#: ../option.c:2924
msgid "E521: Number required after ="
-msgstr "E521: =:n jไlkeen tarvitaan luku"
-
-#: ../option.c:3226 ../option.c:3864
-msgid "E522: Not found in termcap"
-msgstr "E522: Puuttuu termcapista"
+msgstr "E521: =:n jรคlkeen tarvitaan luku"
-#: ../option.c:3335
#, c-format
msgid "E539: Illegal character <%s>"
msgstr "E539: Virheellinen merkki <%s>"
-#: ../option.c:3862
-msgid "E529: Cannot set 'term' to empty string"
-msgstr "E529: Termiไ ei voi asettaa tyhjไksi merkkijonoksi"
+#, c-format
+msgid "For option %s"
+msgstr "Asetukselle %s"
-#: ../option.c:3885
msgid "E589: 'backupext' and 'patchmode' are equal"
msgstr "E589: backupext ja patchmod ovat samat"
-#: ../option.c:3964
msgid "E834: Conflicts with value of 'listchars'"
msgstr "E834: listcharsin arvoissa on ristiriitoja"
-#: ../option.c:3966
msgid "E835: Conflicts with value of 'fillchars'"
msgstr "E835: fillcharsin arvossa on ristiriitoja"
-#: ../option.c:4163
msgid "E524: Missing colon"
msgstr "E524: Kaksoispiste puuttuu"
-#: ../option.c:4165
msgid "E525: Zero length string"
msgstr "E525: Nollan pituinen merkkijono"
-#: ../option.c:4220
#, c-format
msgid "E526: Missing number after <%s>"
-msgstr "E526: Lukuarvo puuttuu merkkijonon <%s> jไlkeen"
+msgstr "E526: Lukuarvo puuttuu merkkijonon <%s> jรคlkeen"
-#: ../option.c:4232
msgid "E527: Missing comma"
msgstr "E527: Pilkku puuttuu"
-#: ../option.c:4239
msgid "E528: Must specify a ' value"
-msgstr "E528: '-arvo pitไไ antaa"
+msgstr "E528: '-arvo pitรครค antaa"
-#: ../option.c:4271
msgid "E595: contains unprintable or wide character"
-msgstr "E595: Sisไltไไ tulostumattomia tai leveitไ merkkejไ"
+msgstr "E595: Sisรคltรครค tulostumattomia tai leveitรค merkkejรค"
-#: ../option.c:4469
#, c-format
msgid "E535: Illegal character after <%c>"
-msgstr "E535: Virheellinen merkki merkin <%c> jไlkeen"
+msgstr "E535: Virheellinen merkki merkin <%c> jรคlkeen"
-#: ../option.c:4534
msgid "E536: comma required"
msgstr "E536: pilkku puuttuu"
-#: ../option.c:4543
#, c-format
msgid "E537: 'commentstring' must be empty or contain %s"
-msgstr "E537: commentstringin pitไไ olla tyhjไ tai sisไltไไ %s"
+msgstr "E537: commentstringin pitรครค olla tyhjรค tai sisรคltรครค %s"
-#: ../option.c:4928
msgid "E540: Unclosed expression sequence"
msgstr "E540: Sulkematon lausekesarja"
-#: ../option.c:4932
msgid "E541: too many items"
msgstr "E541: liikaa kohteita"
-#: ../option.c:4934
msgid "E542: unbalanced groups"
-msgstr "E542: epไtasapainoisia ryhmiไ"
+msgstr "E542: epรคtasapainoisia ryhmiรค"
-#: ../option.c:5148
msgid "E590: A preview window already exists"
msgstr "E590: Esikatseluikkuna on jo olemassa"
-#: ../option.c:5311
msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'"
-msgstr "W17: Arabialle pitไไ olla UTF-8:aa, aseta :set encoding=utf-8"
+msgstr "W17: Arabialle pitรครค olla UTF-8:aa, aseta :set encoding=utf-8"
-#: ../option.c:5623
#, c-format
msgid "E593: Need at least %d lines"
-msgstr "E593: Tarvitaan ainakin %d riviไ"
+msgstr "E593: Tarvitaan ainakin %d riviรค"
-#: ../option.c:5631
#, c-format
msgid "E594: Need at least %d columns"
msgstr "E594: Tarvitaan ainakin %d saraketta"
-#: ../option.c:6011
#, c-format
msgid "E355: Unknown option: %s"
msgstr "E355: Tuntematon asetus: %s"
#. There's another character after zeros or the string
-#. * is empty. In both cases, we are trying to set a
-#. * num option using a string.
-#: ../option.c:6037
+#. is empty. In both cases, we are trying to set a
+#. num option using a string.
#, c-format
msgid "E521: Number required: &%s = '%s'"
msgstr "E521: tarvitaan luku: &%s = '%s'"
-#: ../option.c:6149
msgid ""
"\n"
"--- Terminal codes ---"
@@ -4719,7 +4244,6 @@ msgstr ""
"\n"
"--- Terminaalikoodit ---"
-#: ../option.c:6151
msgid ""
"\n"
"--- Global option values ---"
@@ -4727,7 +4251,6 @@ msgstr ""
"\n"
"--- Globaalit asetukset ---"
-#: ../option.c:6153
msgid ""
"\n"
"--- Local option values ---"
@@ -4735,7 +4258,6 @@ msgstr ""
"\n"
"--- Paikalliset asetukset ---"
-#: ../option.c:6155
msgid ""
"\n"
"--- Options ---"
@@ -4743,29 +4265,24 @@ msgstr ""
"\n"
"--- Asetukset ---"
-#: ../option.c:6816
msgid "E356: get_varp ERROR"
msgstr "E356: get_varp-virhe"
-#: ../option.c:7696
#, c-format
msgid "E357: 'langmap': Matching character missing for %s"
-msgstr "E357: langmap: Merkkiin %s tไsmไไvไ merkki puuttuu"
+msgstr "E357: langmap: Merkkiin %s tรคsmรครคvรค merkki puuttuu"
-#: ../option.c:7715
#, c-format
msgid "E358: 'langmap': Extra characters after semicolon: %s"
-msgstr "E358: langmap: ylimไไrไisiไ merkkejไ puolipisteen jไlkeen: %s"
+msgstr "E358: langmap: ylimรครคrรคisiรค merkkejรค puolipisteen jรคlkeen: %s"
-#: ../os/shell.c:194
-msgid ""
-"\n"
-"Cannot execute shell "
-msgstr ""
-"\n"
-"Kuoren suoritus ei onnistu "
+#, c-format
+msgid "dlerror = \"%s\""
+msgstr "dlerror = %s"
+
+msgid "Vim: Error reading input, exiting...\n"
+msgstr "Vim: Virhe luettaessa syรถtettรค, poistutaan...\n"
-#: ../os/shell.c:439
msgid ""
"\n"
"shell returned "
@@ -4773,8 +4290,18 @@ msgstr ""
"\n"
"kuoren palautusarvo "
-# mikไ security context?
-#: ../os_unix.c:465 ../os_unix.c:471
+#~ msgid ""
+#~ "\n"
+#~ "shell failed to start: "
+#~ msgstr ""
+
+#. Can happen if system() tries to send input to a shell command that was
+#. backgrounded (:call system("cat - &", "foo")). #3529 #5241
+#, fuzzy, c-format
+#~ msgid "E5677: Error writing input to shell-command: %s"
+#~ msgstr "E677: Vรคliaikaistiedostoon kirjoittaminen ei onnistunut"
+
+# mikรค security context?
msgid ""
"\n"
"Could not get security context for "
@@ -4782,7 +4309,6 @@ msgstr ""
"\n"
"Ei saatu turvallisuuskontekstia kohteelle "
-#: ../os_unix.c:479
msgid ""
"\n"
"Could not set security context for "
@@ -4790,947 +4316,890 @@ msgstr ""
"\n"
"Ei voitu asettaa turvallisuuskontekstia kohteelle "
-#: ../os_unix.c:1558 ../os_unix.c:1647
-#, c-format
-msgid "dlerror = \"%s\""
-msgstr "dlerror = %s"
-
-#: ../path.c:1449
#, c-format
msgid "E447: Can't find file \"%s\" in path"
-msgstr "E447: Tiedosto %s ei l๖ydy polulta"
+msgstr "E447: Tiedosto %s ei lรถydy polulta"
-#: ../quickfix.c:359
#, c-format
msgid "E372: Too many %%%c in format string"
msgstr "E372: Liikaa %%%c-juttuja muotoilumerkkijonossa"
-#: ../quickfix.c:371
#, c-format
msgid "E373: Unexpected %%%c in format string"
msgstr "E373: Odottamaton %%%c muotoilumerkkijonossa"
-#: ../quickfix.c:420
msgid "E374: Missing ] in format string"
msgstr "E374: ] puuttuu muotoilemerkkijonosta"
-#: ../quickfix.c:431
#, c-format
msgid "E375: Unsupported %%%c in format string"
msgstr "E375: Tukematon %%%c muotoilumerkkijonossa"
-#: ../quickfix.c:448
#, c-format
msgid "E376: Invalid %%%c in format string prefix"
msgstr "E376: Virheellinen %%%c muotoilumerkkijonon alussa"
-#: ../quickfix.c:454
#, c-format
msgid "E377: Invalid %%%c in format string"
msgstr "E377: Virheellinen %%%c muotoilumerkkijonossa"
-#. nothing found
-#: ../quickfix.c:477
msgid "E378: 'errorformat' contains no pattern"
msgstr "E378: errorformatissa ei ole kuvioita"
-#: ../quickfix.c:695
msgid "E379: Missing or empty directory name"
-msgstr "E379: Puuttuva tai tyhjไ hakemiston nimi"
+msgstr "E379: Puuttuva tai tyhjรค hakemiston nimi"
-#: ../quickfix.c:1305
msgid "E553: No more items"
-msgstr "E553: Ei enไไ kohteita"
+msgstr "E553: Ei enรครค kohteita"
+
+msgid "E924: Current window was closed"
+msgstr "E924: Nykyinen ikkuna on suljettu"
+
+msgid "E925: Current quickfix was changed"
+msgstr "E925: Nykyinen quickfix on muuttunut"
+
+msgid "E926: Current location list was changed"
+msgstr "E926: Nykyinen sijaintiluettelo on muuttunut"
-#: ../quickfix.c:1674
#, c-format
msgid "(%d of %d)%s%s: "
msgstr "(%d/%d)%s%s: "
-#: ../quickfix.c:1676
msgid " (line deleted)"
msgstr " (rivi poistettu)"
-#: ../quickfix.c:1863
+#, c-format
+msgid "%serror list %d of %d; %d errors "
+msgstr "%svirhelista %d/%d, %d virhettรค"
+
msgid "E380: At bottom of quickfix stack"
msgstr "E380: quickfix-pinon pohjalla"
-#: ../quickfix.c:1869
msgid "E381: At top of quickfix stack"
msgstr "E381: quickfix-pinon huipulla"
-#: ../quickfix.c:1880
-#, c-format
-msgid "error list %d of %d; %d errors"
-msgstr "virhelista %d/%d, %d virhettไ"
+msgid "No entries"
+msgstr "Ei kenttiรค"
-#: ../quickfix.c:2427
msgid "E382: Cannot write, 'buftype' option is set"
msgstr "E382: Ei voi kirjoittaa, buftype asetettu"
-#: ../quickfix.c:2812
msgid "E683: File name missing or invalid pattern"
msgstr "E683: Tiedostonimi puuttuu tai kuvio on viallinen"
-#: ../quickfix.c:2911
#, c-format
msgid "Cannot open file \"%s\""
msgstr "Tiedostoa %s ei voi avata"
-#: ../quickfix.c:3429
msgid "E681: Buffer is not loaded"
msgstr "E681: Puskuria ei ole ladattu"
-#: ../quickfix.c:3487
msgid "E777: String or List expected"
-msgstr "E777: Pitไไ olla merkkijono tai lista"
+msgstr "E777: Pitรครค olla merkkijono tai lista"
-#: ../regexp.c:359
#, c-format
msgid "E369: invalid item in %s%%[]"
msgstr "E369: virheellinen olio kohdassa %s%%[]"
-#: ../regexp.c:374
#, c-format
msgid "E769: Missing ] after %s["
-msgstr "E769: ] puuttuu merkinnไn %s[ jไljestไ"
+msgstr "E769: ] puuttuu merkinnรคn %s[ jรคljestรค"
-#: ../regexp.c:375
#, c-format
msgid "E53: Unmatched %s%%("
msgstr "E53: Pariton %s%%("
-#: ../regexp.c:376
#, c-format
msgid "E54: Unmatched %s("
msgstr "E54: Pariton %s("
-#: ../regexp.c:377
#, c-format
msgid "E55: Unmatched %s)"
msgstr "E55: Pariton %s)"
-#: ../regexp.c:378
msgid "E66: \\z( not allowed here"
-msgstr "E66: \\z( ei ole sallittu tไssไ"
+msgstr "E66: \\z( ei ole sallittu tรคssรค"
-#: ../regexp.c:379
-msgid "E67: \\z1 et al. not allowed here"
-msgstr "E67: \\z1 jne. ei ole sallittu tไssไ"
+msgid "E67: \\z1 - \\z9 not allowed here"
+msgstr "E67: \\z1 jne. ei ole sallittu tรคssรค"
-#: ../regexp.c:380
#, c-format
msgid "E69: Missing ] after %s%%["
-msgstr "E69: ] puuttuu merkinnไn %s%%[ jไljestไ"
+msgstr "E69: ] puuttuu merkinnรคn %s%%[ jรคljestรค"
-#: ../regexp.c:381
#, c-format
msgid "E70: Empty %s%%[]"
-msgstr "E70: Tyhjไ %s%%[]"
+msgstr "E70: Tyhjรค %s%%[]"
-#: ../regexp.c:1209 ../regexp.c:1224
msgid "E339: Pattern too long"
-msgstr "E339: Liian pitkไ kuvio"
+msgstr "E339: Liian pitkรค kuvio"
-#: ../regexp.c:1371
msgid "E50: Too many \\z("
-msgstr "E50: Liikaa merkkejไ \\z("
+msgstr "E50: Liikaa merkkejรค \\z("
-#: ../regexp.c:1378
#, c-format
msgid "E51: Too many %s("
-msgstr "E51: Liikaa merkkejไ %s("
+msgstr "E51: Liikaa merkkejรค %s("
-#: ../regexp.c:1427
msgid "E52: Unmatched \\z("
msgstr "E52: Pariton \\z("
-#: ../regexp.c:1637
#, c-format
msgid "E59: invalid character after %s@"
-msgstr "E59: virheellinen merkki kohdan %s@ jไlkeen"
+msgstr "E59: virheellinen merkki kohdan %s@ jรคlkeen"
-#: ../regexp.c:1672
#, c-format
msgid "E60: Too many complex %s{...}s"
msgstr "E60: Liikaa monimutkaisia ilmauksia %s{...}s"
-#: ../regexp.c:1687
#, c-format
msgid "E61: Nested %s*"
-msgstr "E61: Sisไkkไistetty %s*"
+msgstr "E61: Sisรคkkรคistetty %s*"
-#: ../regexp.c:1690
#, c-format
msgid "E62: Nested %s%c"
-msgstr "E62: Sisไkkไistetty %s%c"
+msgstr "E62: Sisรคkkรคistetty %s%c"
-#: ../regexp.c:1800
msgid "E63: invalid use of \\_"
-msgstr "E63: vไไrinkไytetty \\_"
+msgstr "E63: vรครคrinkรคytetty \\_"
-#: ../regexp.c:1850
#, c-format
msgid "E64: %s%c follows nothing"
-msgstr "E64: %s%c jไlkeen ei minkไไn"
-
-#: ../regexp.c:1902
-msgid "E65: Illegal back reference"
-msgstr "E65: Virheellinen tไsmไysviittaus"
+msgstr "E64: %s%c jรคlkeen ei minkรครคn"
-#: ../regexp.c:1943
msgid "E68: Invalid character after \\z"
-msgstr "E68: Virheellinen merkki ilmauksen \\z jไlkeen"
+msgstr "E68: Virheellinen merkki ilmauksen \\z jรคlkeen"
-#: ../regexp.c:2049 ../regexp_nfa.c:1296
#, c-format
msgid "E678: Invalid character after %s%%[dxouU]"
-msgstr "E678: Virheellinen merkki merkinnไn %s%%[dxouU] jไljessไ"
+msgstr "E678: Virheellinen merkki merkinnรคn %s%%[dxouU] jรคljessรค"
-#: ../regexp.c:2107
#, c-format
msgid "E71: Invalid character after %s%%"
-msgstr "E71: Virheellinen merkki merkinnไn %s%% jไljessไ"
+msgstr "E71: Virheellinen merkki merkinnรคn %s%% jรคljessรค"
+
+#, c-format
+msgid "E888: (NFA regexp) cannot repeat %s"
+msgstr "E888: (NFA-sรครคnn. ilmaus) ei voi toistaa kohdetta %s"
-#: ../regexp.c:3017
#, c-format
msgid "E554: Syntax error in %s{...}"
msgstr "E554: Syntaksivirhe ilmauksessa %s{...}"
-#: ../regexp.c:3805
msgid "External submatches:\n"
-msgstr "Ulkoisia alitไsmไyksiไ:\n"
+msgstr "Ulkoisia alitรคsmรคyksiรค:\n"
-#: ../regexp.c:7022
msgid ""
"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be "
"used "
msgstr ""
+"E864: \\%#=-merkkien perรครคn voi tulla vain 0, 1 tai 2. Kรคytetรครคn "
+"automaattista engineรค "
-#: ../regexp_nfa.c:239
-msgid "E865: (NFA) Regexp end encountered prematurely"
-msgstr ""
-
-#: ../regexp_nfa.c:240
-#, c-format
-msgid "E866: (NFA regexp) Misplaced %c"
-msgstr ""
-
-#: ../regexp_nfa.c:242
-#, c-format
-msgid "E877: (NFA regexp) Invalid character class: %<PRId64>"
-msgstr ""
-
-#: ../regexp_nfa.c:1261
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\z%c'"
-msgstr ""
-
-#: ../regexp_nfa.c:1387
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\%%%c'"
-msgstr ""
-
-#: ../regexp_nfa.c:1802
-#, c-format
-msgid "E869: (NFA) Unknown operator '\\@%c'"
-msgstr ""
-
-#: ../regexp_nfa.c:1831
-msgid "E870: (NFA regexp) Error reading repetition limits"
-msgstr ""
-
-#. Can't have a multi follow a multi.
-#: ../regexp_nfa.c:1895
-msgid "E871: (NFA regexp) Can't have a multi follow a multi !"
-msgstr ""
-
-#. Too many `('
-#: ../regexp_nfa.c:2037
-msgid "E872: (NFA regexp) Too many '('"
-msgstr ""
-
-#: ../regexp_nfa.c:2042
-#, fuzzy
-msgid "E879: (NFA regexp) Too many \\z("
-msgstr "E50: Liikaa merkkejไ \\z("
-
-#: ../regexp_nfa.c:2066
-msgid "E873: (NFA regexp) proper termination error"
-msgstr ""
-
-#: ../regexp_nfa.c:2599
-msgid "E874: (NFA) Could not pop the stack !"
-msgstr ""
-
-#: ../regexp_nfa.c:3298
-msgid ""
-"E875: (NFA regexp) (While converting from postfix to NFA), too many states "
-"left on stack"
-msgstr ""
+msgid "Switching to backtracking RE engine for pattern: "
+msgstr "Vaihdetaan kรคyttรคmรครคn backtrackkaavaa RE-engineรค ilmaukselle: "
-#: ../regexp_nfa.c:3302
-msgid "E876: (NFA regexp) Not enough space to store the whole NFA "
-msgstr ""
-
-#: ../regexp_nfa.c:4571 ../regexp_nfa.c:4869
-msgid ""
-"Could not open temporary log file for writing, displaying on stderr ... "
-msgstr ""
-
-#: ../regexp_nfa.c:4840
-#, c-format
-msgid "(NFA) COULD NOT OPEN %s !"
-msgstr ""
-
-#: ../regexp_nfa.c:6049
-#, fuzzy
-msgid "Could not open temporary log file for writing "
-msgstr "E828: Kumoustiedoston avaus kirjoittamista varten ei onnistu: %s"
+#~ msgid " TERMINAL"
+#~ msgstr ""
# tiloja
-#: ../screen.c:7435
msgid " VREPLACE"
msgstr " VKORVAUS"
-#: ../screen.c:7437
msgid " REPLACE"
msgstr " KORVAUS"
-#: ../screen.c:7440
msgid " REVERSE"
-msgstr " KฤฤNTEIS"
+msgstr " Kร„ร„NTEIS"
-#: ../screen.c:7441
msgid " INSERT"
-msgstr " SYึTTึ"
+msgstr " SYร–TTร–"
-#: ../screen.c:7443
msgid " (insert)"
-msgstr " (sy๖tt๖)"
+msgstr " (syรถttรถ)"
-#: ../screen.c:7445
msgid " (replace)"
msgstr " (korvaus)"
-#: ../screen.c:7447
msgid " (vreplace)"
msgstr " (vkorvaus)"
-#: ../screen.c:7449
msgid " Hebrew"
msgstr " Heprea"
-#: ../screen.c:7454
msgid " Arabic"
msgstr " Arabia"
-#: ../screen.c:7456
-msgid " (lang)"
-msgstr " (kieli)"
-
-#: ../screen.c:7459
msgid " (paste)"
msgstr " (liitos)"
-#: ../screen.c:7469
msgid " VISUAL"
msgstr " VALINTA"
-#: ../screen.c:7470
msgid " VISUAL LINE"
msgstr " VALINTARIVI"
-#: ../screen.c:7471
msgid " VISUAL BLOCK"
msgstr " VALINTALOHKO"
-#: ../screen.c:7472
msgid " SELECT"
msgstr " WALINTA"
-#: ../screen.c:7473
msgid " SELECT LINE"
msgstr " WALINTARIVI"
-#: ../screen.c:7474
msgid " SELECT BLOCK"
msgstr " WALINTALOHKO"
-#: ../screen.c:7486 ../screen.c:7541
msgid "recording"
msgstr "tallennetaan"
-#: ../search.c:487
#, c-format
msgid "E383: Invalid search string: %s"
msgstr "E383: Viallinen hakujono: %s"
-#: ../search.c:832
#, c-format
msgid "E384: search hit TOP without match for: %s"
-msgstr "E384: Haku pไไsi alkuun l๖ytไmไttไ jonoa: %s"
+msgstr "E384: Haku pรครคsi alkuun lรถytรคmรคttรค jonoa: %s"
-#: ../search.c:835
#, c-format
msgid "E385: search hit BOTTOM without match for: %s"
-msgstr "E385: Haku pไไsi loppuun l๖ytไmไttไ jonoa: %s"
+msgstr "E385: Haku pรครคsi loppuun lรถytรคmรคttรค jonoa: %s"
-#: ../search.c:1200
msgid "E386: Expected '?' or '/' after ';'"
-msgstr "E386: ;:n jไlkeen pitไไ olla ? tai /"
+msgstr "E386: ;:n jรคlkeen pitรครค olla ? tai /"
-#: ../search.c:4085
msgid " (includes previously listed match)"
-msgstr " (sisไltไไ viimeksi luetellun tไsmไyksen)"
+msgstr " (sisรคltรครค viimeksi luetellun tรคsmรคyksen)"
-#. cursor at status line
-#: ../search.c:4104
msgid "--- Included files "
-msgstr "--- Sisไllytetyt tiedostot "
+msgstr "--- Sisรคllytetyt tiedostot "
-#: ../search.c:4106
msgid "not found "
-msgstr "ei l๖ytynyt "
+msgstr "ei lรถytynyt "
-#: ../search.c:4107
msgid "in path ---\n"
msgstr "polusta ---\n"
-#: ../search.c:4168
msgid " (Already listed)"
msgstr " (Jo lueteltu)"
-#: ../search.c:4170
msgid " NOT FOUND"
-msgstr " EI LึYTYNYT"
+msgstr " EI Lร–YTYNYT"
-#: ../search.c:4211
#, c-format
msgid "Scanning included file: %s"
-msgstr "Haku sisไlsi tiedoston: %s"
+msgstr "Haku sisรคlsi tiedoston: %s"
-#: ../search.c:4216
#, c-format
msgid "Searching included file %s"
-msgstr "Haku sisไlsi tiedoston %s"
+msgstr "Haku sisรคlsi tiedoston %s"
-#: ../search.c:4405
msgid "E387: Match is on current line"
-msgstr "E387: Tไsmไys tไllไ rivillไ"
+msgstr "E387: Tรคsmรคys tรคllรค rivillรค"
-#: ../search.c:4517
msgid "All included files were found"
-msgstr "Kaikki sisไllytetyt rivit l๖ytyivไt"
+msgstr "Kaikki sisรคllytetyt rivit lรถytyivรคt"
-#: ../search.c:4519
msgid "No included files"
-msgstr "Ei sisไllytettyjไ tiedostoja"
+msgstr "Ei sisรคllytettyjรค tiedostoja"
-#: ../search.c:4527
msgid "E388: Couldn't find definition"
-msgstr "E388: Mไไritelmไ ei l๖ydy"
+msgstr "E388: Mรครคritelmรค ei lรถydy"
-#: ../search.c:4529
msgid "E389: Couldn't find pattern"
-msgstr "E389: kuvio ei l๖ydy"
+msgstr "E389: kuvio ei lรถydy"
+
+#~ msgid "too few bytes read"
+#~ msgstr ""
-#: ../search.c:4668
-msgid "Substitute "
-msgstr "Korvaa "
+#, fuzzy, c-format
+#~ msgid "System error while skipping in ShaDa file: %s"
+#~ msgstr "E782: virhe luettaessa .sug-tiedostoa: %s"
-#: ../search.c:4681
#, c-format
-msgid ""
-"\n"
-"# Last %sSearch Pattern:\n"
-"~"
-msgstr ""
-"\n"
-"# Edellinen %sHakulauseke:\n"
-"~"
+#~ msgid ""
+#~ "Error while reading ShaDa file: last entry specified that it occupies "
+#~ "%<PRIu64> bytes, but file ended earlier"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "System error while closing ShaDa file: %s"
+#~ msgstr "E782: virhe luettaessa .sug-tiedostoa: %s"
+
+#, fuzzy, c-format
+#~ msgid "System error while writing ShaDa file: %s"
+#~ msgstr "E782: virhe luettaessa .sug-tiedostoa: %s"
+
+#, fuzzy, c-format
+#~ msgid "Reading ShaDa file \"%s\"%s%s%s"
+#~ msgstr "Luetaan viminfo-tiedostoa \"%s\"%s%s%s"
+
+msgid " info"
+msgstr " info"
+
+msgid " marks"
+msgstr " merkit"
+
+msgid " oldfiles"
+msgstr " vanhaatiedostoa"
+
+msgid " FAILED"
+msgstr " EPร„ONNISTUI"
+
+#, c-format
+#~ msgid "System error while opening ShaDa file %s for reading: %s"
+#~ msgstr ""
+
+#~ msgid "additional elements of ShaDa "
+#~ msgstr ""
+
+#~ msgid "additional data of ShaDa "
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "Failed to write variable %s"
+#~ msgstr "ei voitu vaihtaa puskuriin %d"
+
+#, c-format
+#~ msgid ""
+#~ "Failed to parse ShaDa file due to a msgpack parser error at position "
+#~ "%<PRIu64>"
+#~ msgstr ""
+
+#, c-format
+#~ msgid ""
+#~ "Failed to parse ShaDa file: incomplete msgpack string at position %<PRIu64>"
+#~ msgstr ""
+
+#, c-format
+#~ msgid ""
+#~ "Failed to parse ShaDa file: extra bytes in msgpack string at position "
+#~ "%<PRIu64>"
+#~ msgstr ""
+
+#, c-format
+#~ msgid ""
+#~ "System error while opening ShaDa file %s for reading to merge before writing "
+#~ "it: %s"
+#~ msgstr ""
+
+#. Tried names from .tmp.a to .tmp.z, all failed. Something must be
+#. wrong then.
+#, c-format
+#~ msgid "E138: All %s.tmp.X files exist, cannot write ShaDa file!"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "System error while opening temporary ShaDa file %s for writing: %s"
+#~ msgstr "Vรคliaikaislokitiedoston avaus kirjoittamista varten ei onnistu"
+
+#, c-format
+#~ msgid "Failed to create directory %s for writing ShaDa file: %s"
+#~ msgstr ""
+
+#, c-format
+#~ msgid "System error while opening ShaDa file %s for writing: %s"
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "Writing ShaDa file \"%s\""
+#~ msgstr "Kirjoitetaan viminfo-tiedostoa %s"
+
+#, fuzzy, c-format
+#~ msgid "Failed setting uid and gid for file %s: %s"
+#~ msgstr "Ladattu kumoustiedoto %s"
+
+#, fuzzy, c-format
+#~ msgid "E137: ShaDa file is not writable: %s"
+#~ msgstr "E137: Viminfo-tiedostoon ei voitu kirjoittaa: %s"
+
+#, fuzzy, c-format
+#~ msgid "Can't rename ShaDa file from %s to %s!"
+#~ msgstr "E886: Viminfo-tiedostoa ei voit uudelleennimetรค nimelle %s"
+
+#, fuzzy, c-format
+#~ msgid "Did not rename %s because %s does not look like a ShaDa file"
+#~ msgstr " [ei nรคytรค Vimin swap-tiedostolta]"
+
+#, c-format
+#~ msgid "Did not rename %s to %s because there were errors during writing it"
+#~ msgstr ""
+
+#, c-format
+#~ msgid "Do not forget to remove %s or rename it manually to %s."
+#~ msgstr ""
+
+#, fuzzy, c-format
+#~ msgid "System error while reading ShaDa file: %s"
+#~ msgstr "E782: virhe luettaessa .sug-tiedostoa: %s"
+
+#, fuzzy, c-format
+#~ msgid "System error while reading integer from ShaDa file: %s"
+#~ msgstr "E782: virhe luettaessa .sug-tiedostoa: %s"
-#: ../spell.c:951
-msgid "E759: Format error in spell file"
-msgstr "E759: Muotoiluvirhe oikolukutiedostossa"
+#, c-format
+#~ msgid ""
+#~ "Error while reading ShaDa file: expected positive integer at position "
+#~ "%<PRIu64>, but got nothing"
+#~ msgstr ""
+
+#, c-format
+#~ msgid ""
+#~ "Error while reading ShaDa file: expected positive integer at position "
+#~ "%<PRIu64>"
+#~ msgstr ""
+
+#. kSDItemUnknown cannot possibly pass that far because it is -1 and that
+#. will fail in msgpack_read_uint64. But kSDItemMissing may and it will
+#. otherwise be skipped because (1 << 0) will never appear in flags.
+#, c-format
+#~ msgid ""
+#~ "Error while reading ShaDa file: there is an item at position %<PRIu64> that "
+#~ "must not be there: Missing items are for internal uses only"
+#~ msgstr ""
+
+#, c-format
+#~ msgid ""
+#~ "Error while reading ShaDa file: buffer list at position %<PRIu64> contains "
+#~ "entry that is not a dictionary"
+#~ msgstr ""
+
+#, c-format
+#~ msgid ""
+#~ "Error while reading ShaDa file: buffer list at position %<PRIu64> contains "
+#~ "entry with invalid line number"
+#~ msgstr ""
+
+#, c-format
+#~ msgid ""
+#~ "Error while reading ShaDa file: buffer list at position %<PRIu64> contains "
+#~ "entry with invalid column number"
+#~ msgstr ""
+
+#, c-format
+#~ msgid ""
+#~ "Error while reading ShaDa file: buffer list at position %<PRIu64> contains "
+#~ "entry that does not have a file name"
+#~ msgstr ""
+
+#. values for ts_isdiff
+#. no different byte (yet)
+#. different byte found
+#. inserting character
+#. values for ts_flags
+#. already checked that prefix is OK
+#. tried split at this point
+#. did a delete, "ts_delidx" has index
+#. special values ts_prefixdepth
+#. not using prefixes
+#. walking through the prefix tree
+#. highest value that's not special
+#. mode values for find_word
+#. find word case-folded
+#. find keep-case word
+#. find word after prefix
+#. find case-folded compound word
+#. find keep-case compound word
+#, fuzzy
+#~ msgid "E759: Format error in spell file"
+#~ msgstr "E297: Kirjoitusvirhe swap-tiedostossa"
+
+msgid "E756: Spell checking is not enabled"
+msgstr "E756: Oikaisuluku ei ole pรครคllรค"
+
+#, c-format
+msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
+msgstr "Varoitus: Ei lรถydetty sanalistaa %s.%s.spl tai %s.ascii.spl"
+
+#. This is probably an error. Give a warning and
+#. accept the words anyway.
+#, c-format
+msgid "Warning: region %s not supported"
+msgstr "Varoitus: osaa %s ei tueta"
+
+msgid "Sorry, no suggestions"
+msgstr "ei ehdotuksia"
+
+#, fuzzy, c-format
+#~ msgid "Sorry, only %<PRId64> suggestions"
+#~ msgstr "vain %ld ehdotusta"
+
+#, c-format
+msgid "Change \"%.*s\" to:"
+msgstr "Muuta %.*s:"
+
+#, c-format
+msgid " < \"%.*s\""
+msgstr " < %.*s"
+
+msgid "E752: No previous spell replacement"
+msgstr "E752: Ei edellistรค oikaisulukukorjausta"
+
+#, c-format
+msgid "E753: Not found: %s"
+msgstr "E753: Ei lรถytynyt: %s"
-#: ../spell.c:952
msgid "E758: Truncated spell file"
msgstr "E758: Oikolukutiedosto katkaistu"
-#: ../spell.c:953
#, c-format
msgid "Trailing text in %s line %d: %s"
-msgstr "Tekstiไ rivin perไssไ tiedostossa %s rivillไ %d: %s"
+msgstr "Tekstiรค rivin perรคssรค tiedostossa %s rivillรค %d: %s"
-#: ../spell.c:954
#, c-format
msgid "Affix name too long in %s line %d: %s"
-msgstr "Affiksin nimi on liian pitkไ tiedostossa %s rivillไ %d: %s"
+msgstr "Affiksin nimi on liian pitkรค tiedostossa %s rivillรค %d: %s"
-#: ../spell.c:955
msgid "E761: Format error in affix file FOL, LOW or UPP"
msgstr "E761: Affiksitiedoston FOL-, LOW- tai UPP-muotovirhe "
-#: ../spell.c:957
msgid "E762: Character in FOL, LOW or UPP is out of range"
-msgstr "E762: Merkki FOL:ssไ, LOW:ssไ tai UPP:ssไ ei kuulu arvoalueeseen"
+msgstr "E762: Merkki FOL:ssรค, LOW:ssรค tai UPP:ssรค ei kuulu arvoalueeseen"
-#: ../spell.c:958
msgid "Compressing word tree..."
-msgstr "Tiivistetไไn sanapuuta..."
+msgstr "Tiivistetรครคn sanapuuta..."
-#: ../spell.c:1951
-msgid "E756: Spell checking is not enabled"
-msgstr "E756: Oikaisuluku ei ole pไไllไ"
-
-#: ../spell.c:2249
-#, c-format
-msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
-msgstr "Varoitus: Ei l๖ydetty sanalistaa %s.%s.spl tai %s.ascii.spl"
-
-#: ../spell.c:2473
#, c-format
msgid "Reading spell file \"%s\""
msgstr "Luetaan oikaisulukutiedosta %s"
-#: ../spell.c:2496
msgid "E757: This does not look like a spell file"
msgstr "E757: Ei vaikuta oikaisulukutiedostolta"
-#: ../spell.c:2501
+#, fuzzy, c-format
+#~ msgid "E5042: Failed to read spell file %s: %s"
+#~ msgstr "E482: Tiedostoa %s ei voi luoda"
+
msgid "E771: Old spell file, needs to be updated"
-msgstr "E771: Vanha oikaisulukutiedosto vaatii pไivittไmistไ"
+msgstr "E771: Vanha oikaisulukutiedosto vaatii pรคivittรคmistรค"
-#: ../spell.c:2504
msgid "E772: Spell file is for newer version of Vim"
msgstr "E772: Oikaisulukutiedosto on uudemmalle Vimille"
-#: ../spell.c:2602
msgid "E770: Unsupported section in spell file"
msgstr "E770: Tukematon osio oikaisulukutiedostossa"
-#: ../spell.c:3762
#, c-format
-msgid "Warning: region %s not supported"
-msgstr "Varoitus: osaa %s ei tueta"
+msgid "E778: This does not look like a .sug file: %s"
+msgstr "E778: Ei vaikuta .sug-tiedostolta: %s"
+
+#, c-format
+msgid "E779: Old .sug file, needs to be updated: %s"
+msgstr "E779: Vanha .sug-tiedosto pitรครค pรคivittรครค: %s"
+
+#, c-format
+msgid "E780: .sug file is for newer version of Vim: %s"
+msgstr "E780: .sug-tiedosto on uudemmalle Vimille: %s"
+
+#, c-format
+msgid "E781: .sug file doesn't match .spl file: %s"
+msgstr "E781: .sug-tiedosto ei tรคsmรครค .spl-tiedostoon: %s"
-#: ../spell.c:4550
#, c-format
-msgid "Reading affix file %s ..."
+msgid "E782: error while reading .sug file: %s"
+msgstr "E782: virhe luettaessa .sug-tiedostoa: %s"
+
+#, c-format
+msgid "Reading affix file %s..."
msgstr "Luetaan affiksitiedostoa %s..."
-#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
#, c-format
msgid "Conversion failure for word in %s line %d: %s"
-msgstr "Muunnosvirhe sanalle %s rivillไ %d: %s"
+msgstr "Muunnosvirhe sanalle %s rivillรค %d: %s"
-#: ../spell.c:4630 ../spell.c:6170
#, c-format
msgid "Conversion in %s not supported: from %s to %s"
msgstr "Muunnosta kohteessa %s ei tueta: kohteesta %s kohteeseen %s"
-#: ../spell.c:4642
#, c-format
msgid "Invalid value for FLAG in %s line %d: %s"
-msgstr "Tuntematon FLAG kohteessa %s rivillไ %d: %s"
+msgstr "Tuntematon FLAG kohteessa %s rivillรค %d: %s"
-#: ../spell.c:4655
#, c-format
msgid "FLAG after using flags in %s line %d: %s"
-msgstr "FLAG kohteessa %s lippujen jไlkeen rivillไ %d: %s"
+msgstr "FLAG kohteessa %s lippujen jรคlkeen rivillรค %d: %s"
-#: ../spell.c:4723
#, c-format
msgid ""
"Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line "
"%d"
msgstr ""
-"COMPOUNDFORBIDFLAG PFX:n jไlkeen voi antaa vไไriไ tuloksia kohteessa %s "
-"rivillไ %d"
+"COMPOUNDFORBIDFLAG PFX:n jรคlkeen voi antaa vรครคriรค tuloksia kohteessa %s "
+"rivillรค %d"
-#: ../spell.c:4731
#, c-format
msgid ""
"Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line "
"%d"
msgstr ""
-"COMPOUNDPERMITFLAG PFX:n jไlkeen voi antaa vไไriไ tuloksia kohteessa %s "
-"rivillไ %d"
+"COMPOUNDPERMITFLAG PFX:n jรคlkeen voi antaa vรครคriรค tuloksia kohteessa %s "
+"rivillรค %d"
-#: ../spell.c:4747
#, c-format
msgid "Wrong COMPOUNDRULES value in %s line %d: %s"
-msgstr "Vไไrไ COMPOUNDRULES-arvo kohteessa %s rivillไ %d: %s"
+msgstr "Vรครคrรค COMPOUNDRULES-arvo kohteessa %s rivillรค %d: %s"
-#: ../spell.c:4771
#, c-format
msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s"
-msgstr "Vไไrไ COMPOUNDWORDMAX-arvo kohteessa %s rivillไ %d: %s"
+msgstr "Vรครคrรค COMPOUNDWORDMAX-arvo kohteessa %s rivillรค %d: %s"
-#: ../spell.c:4777
#, c-format
msgid "Wrong COMPOUNDMIN value in %s line %d: %s"
-msgstr "Vไไrไ COMPOUNDMIN-arvo kohteessa %s rivillไ %d: %s"
+msgstr "Vรครคrรค COMPOUNDMIN-arvo kohteessa %s rivillรค %d: %s"
-#: ../spell.c:4783
#, c-format
msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s"
-msgstr "Vไไrไ COMPOUNDSYLMAX-arvo kohteessa %s rivillไ %d: %s"
+msgstr "Vรครคrรค COMPOUNDSYLMAX-arvo kohteessa %s rivillรค %d: %s"
-#: ../spell.c:4795
#, c-format
msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"
-msgstr "Vไไrไ CHECKCOMPOUNDPATTERN-arvo kohteessa %s rivillไ %d: %s"
+msgstr "Vรครคrรค CHECKCOMPOUNDPATTERN-arvo kohteessa %s rivillรค %d: %s"
-#: ../spell.c:4847
#, c-format
msgid "Different combining flag in continued affix block in %s line %d: %s"
msgstr ""
-"Eri yhdistelmไlippu jatketussa affiksilohkossa kohteessa %s rivillไ %d: %s"
+"Eri yhdistelmรคlippu jatketussa affiksilohkossa kohteessa %s rivillรค %d: %s"
-#: ../spell.c:4850
#, c-format
msgid "Duplicate affix in %s line %d: %s"
-msgstr "Kaksoiskappale affiksista kohteessa %s rivillไ %d: %s"
+msgstr "Kaksoiskappale affiksista kohteessa %s rivillรค %d: %s"
-#: ../spell.c:4871
-#, c-format
+#, fuzzy, c-format
msgid ""
-"Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s "
+"Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGESTin %s "
"line %d: %s"
msgstr ""
-"Affiksia kไytetty my๖s BAD-, RARE-, KEEPCASE-, NEEDAFFIX-, NEEDCOMPOUND- tai "
-"NOSUGGEST-arvossa kohteessa %s rivillไ %d: %s"
+"Affiksia kรคytetty myรถs BAD-, RARE-, KEEPCASE-, NEEDAFFIX-, NEEDCOMPOUND- tai "
+"NOSUGGEST-arvossa kohteessa %s rivillรค %d: %s"
-#: ../spell.c:4893
#, c-format
msgid "Expected Y or N in %s line %d: %s"
-msgstr "Odotettiin Y:tไ tai N:ไไ kohteessa %s rivillไ %d: %s"
+msgstr "Odotettiin Y:tรค tai N:รครค kohteessa %s rivillรค %d: %s"
-#: ../spell.c:4968
#, c-format
msgid "Broken condition in %s line %d: %s"
-msgstr "Viallinen ehto kohteessa %s rivillไ %d: %s"
+msgstr "Viallinen ehto kohteessa %s rivillรค %d: %s"
-#: ../spell.c:5091
#, c-format
msgid "Expected REP(SAL) count in %s line %d"
-msgstr "Odotettiin REP(SAL)-arvoa kohteessa %s rivillไ %d"
+msgstr "Odotettiin REP(SAL)-arvoa kohteessa %s rivillรค %d"
-#: ../spell.c:5120
#, c-format
msgid "Expected MAP count in %s line %d"
-msgstr "Odotettiin MAP-arvoa kohteessa %s rivillไ %d"
+msgstr "Odotettiin MAP-arvoa kohteessa %s rivillรค %d"
-#: ../spell.c:5132
#, c-format
msgid "Duplicate character in MAP in %s line %d"
-msgstr "Kaksoiskappale merkistไ MAP:ssไ kohteessa %s rivillไ %d"
+msgstr "Kaksoiskappale merkistรค MAP:ssรค kohteessa %s rivillรค %d"
-#: ../spell.c:5176
#, c-format
msgid "Unrecognized or duplicate item in %s line %d: %s"
-msgstr "Tunnistamaton tai kaksoiskappale arvosta kohteessa %s rivillไ %d: %s"
+msgstr "Tunnistamaton tai kaksoiskappale arvosta kohteessa %s rivillรค %d: %s"
-#: ../spell.c:5197
#, c-format
msgid "Missing FOL/LOW/UPP line in %s"
msgstr "Puuttuva FOL, LOW tai UPP rivi kohteessa %s"
-#: ../spell.c:5220
msgid "COMPOUNDSYLMAX used without SYLLABLE"
msgstr "COMPOUNDSYLMAX ilman SYLLABLEa"
-#: ../spell.c:5236
msgid "Too many postponed prefixes"
-msgstr "Liikaa jไlkikไteistettyjไ prefiksejไ"
+msgstr "Liikaa jรคlkikรคteistettyjรค prefiksejรค"
-#: ../spell.c:5238
msgid "Too many compound flags"
msgstr "Liikaa yhdyssanalippuja"
-#: ../spell.c:5240
msgid "Too many postponed prefixes and/or compound flags"
-msgstr "Liikaa jไlkikไteistettyjไ prefiksejไ tai yhdyssanalippuja"
+msgstr "Liikaa jรคlkikรคteistettyjรค prefiksejรค tai yhdyssanalippuja"
-#: ../spell.c:5250
#, c-format
msgid "Missing SOFO%s line in %s"
msgstr "Puuttuva SOFO%s-rivi kohteessa %s"
-#: ../spell.c:5253
#, c-format
msgid "Both SAL and SOFO lines in %s"
msgstr "SAL- ja SOFO-rivit kohteessa %s"
-#: ../spell.c:5331
#, c-format
msgid "Flag is not a number in %s line %d: %s"
-msgstr "Lippu ei ole lukuarvo kohteessa %s rivillไ %d: %s"
+msgstr "Lippu ei ole lukuarvo kohteessa %s rivillรค %d: %s"
-#: ../spell.c:5334
#, c-format
msgid "Illegal flag in %s line %d: %s"
-msgstr "Tuntematon lippu kohteessa %s rivillไ %d: %s"
+msgstr "Tuntematon lippu kohteessa %s rivillรค %d: %s"
-#: ../spell.c:5493 ../spell.c:5501
#, c-format
msgid "%s value differs from what is used in another .aff file"
msgstr "%s-arvo eroaa toisessa .aff-tiedostossa olevasta"
-#: ../spell.c:5602
#, c-format
-msgid "Reading dictionary file %s ..."
+msgid "Reading dictionary file %s..."
msgstr "Luetaan sanakirjatiedostoa %s"
-#: ../spell.c:5611
#, c-format
msgid "E760: No word count in %s"
msgstr "E760: Ei sanalaskuria kohteessa %s"
-#: ../spell.c:5669
#, c-format
msgid "line %6d, word %6d - %s"
msgstr "rivi %6d, sana %6d - %s"
-#: ../spell.c:5691
#, c-format
msgid "Duplicate word in %s line %d: %s"
-msgstr "Toistettu sana kohteessa %s rivillไ %d: %s"
+msgstr "Toistettu sana kohteessa %s rivillรค %d: %s"
-#: ../spell.c:5694
#, c-format
msgid "First duplicate word in %s line %d: %s"
-msgstr "Ensimmไinen kappale kohteessa %s rivillไ %d: %s"
+msgstr "Ensimmรคinen kappale kohteessa %s rivillรค %d: %s"
-#: ../spell.c:5746
#, c-format
msgid "%d duplicate word(s) in %s"
msgstr "toistettuja sanoja %d kohteessa %s"
-#: ../spell.c:5748
#, c-format
msgid "Ignored %d word(s) with non-ASCII characters in %s"
msgstr "Ei-ASCII-merkkien takia ohitettuja sanoja %d kohteessa %s"
-#: ../spell.c:6115
#, c-format
-msgid "Reading word file %s ..."
+msgid "Reading word file %s..."
msgstr "Luetaan sanatiedostoa %s..."
-#: ../spell.c:6155
#, c-format
msgid "Duplicate /encoding= line ignored in %s line %d: %s"
-msgstr "Toistettu /encoding= ohitettu kohteessa %s rivillไ %d: %s"
+msgstr "Toistettu /encoding= ohitettu kohteessa %s rivillรค %d: %s"
-#: ../spell.c:6159
#, c-format
msgid "/encoding= line after word ignored in %s line %d: %s"
-msgstr "/encoding= sanojen jไlkeen ohitettu kohteessa %s rivillไ %d: %s"
+msgstr "/encoding= sanojen jรคlkeen ohitettu kohteessa %s rivillรค %d: %s"
-#: ../spell.c:6180
#, c-format
msgid "Duplicate /regions= line ignored in %s line %d: %s"
-msgstr "Toistettu /regions= ohitettu kohteessa %s rivillไ %d: %s"
+msgstr "Toistettu /regions= ohitettu kohteessa %s rivillรค %d: %s"
-#: ../spell.c:6185
#, c-format
msgid "Too many regions in %s line %d: %s"
-msgstr "Liikaa regionseja kohteessa %s rivillไ %d: %s"
+msgstr "Liikaa regionseja kohteessa %s rivillรค %d: %s"
-#: ../spell.c:6198
#, c-format
msgid "/ line ignored in %s line %d: %s"
-msgstr "/ ohitettu kohteessa %s rivillไ %d: %s"
+msgstr "/ ohitettu kohteessa %s rivillรค %d: %s"
-#: ../spell.c:6224
#, c-format
msgid "Invalid region nr in %s line %d: %s"
-msgstr "Virheellinen region-luku kohteessa %s rivillไ %d: %s"
+msgstr "Virheellinen region-luku kohteessa %s rivillรค %d: %s"
-#: ../spell.c:6230
#, c-format
msgid "Unrecognized flags in %s line %d: %s"
-msgstr "Tunnistamaton lippu kohteessa %s rivillไ %d: %s"
+msgstr "Tunnistamaton lippu kohteessa %s rivillรค %d: %s"
-#: ../spell.c:6257
#, c-format
msgid "Ignored %d words with non-ASCII characters"
msgstr "Ei-ASCIIn takia ohitettuja sanoja %d"
-#: ../spell.c:6656
#, c-format
msgid "Compressed %d of %d nodes; %d (%d%%) remaining"
-msgstr "Tiivistetty %d/%d noodia. %d (%d %%) jไljellไ"
+msgstr "Tiivistetty %d/%d noodia. %d (%d %%) jรคljellรค"
-#: ../spell.c:7340
msgid "Reading back spell file..."
msgstr "Luetaan taas oikaisulukutiedostoa..."
#. Go through the trie of good words, soundfold each word and add it to
#. the soundfold trie.
-#: ../spell.c:7357
msgid "Performing soundfolding..."
-msgstr "ฤไntไmyksen mukaan yhdistellไไn..."
+msgstr "ร„รคntรคmyksen mukaan yhdistellรครคn..."
-#: ../spell.c:7368
-#, c-format
-msgid "Number of words after soundfolding: %<PRId64>"
-msgstr "Sanoja ไไntไmysyhdistelyn jไlkeen: %<PRId64>"
+#, fuzzy, c-format
+#~ msgid "Number of words after soundfolding: %<PRId64>"
+#~ msgstr "Sanoja รครคntรคmysyhdistelyn jรคlkeen: %ld"
-#: ../spell.c:7476
#, c-format
msgid "Total number of words: %d"
-msgstr "Sanoja yhteensไ: %d"
+msgstr "Sanoja yhteensรค: %d"
-#: ../spell.c:7655
#, c-format
-msgid "Writing suggestion file %s ..."
+msgid "Writing suggestion file %s..."
msgstr "Kirjoitetaan ehdotustiedostoa %s..."
-#: ../spell.c:7707 ../spell.c:7927
#, c-format
msgid "Estimated runtime memory use: %d bytes"
-msgstr "Arvioitu kไytt๖muisti: %d tavua"
+msgstr "Arvioitu kรคyttรถmuisti: %d tavua"
-#: ../spell.c:7820
msgid "E751: Output file name must not have region name"
-msgstr "E751: Tulostetiedostonimessไ ei saa olla alueen nimeไ"
+msgstr "E751: Tulostetiedostonimessรค ei saa olla alueen nimeรค"
-#: ../spell.c:7822
msgid "E754: Only up to 8 regions supported"
-msgstr "E754: Enintไไn 8 aluetta tuetaan"
+msgstr "E754: Enintรครคn 8 aluetta tuetaan"
-#: ../spell.c:7846
#, c-format
msgid "E755: Invalid region in %s"
msgstr "E755: Virheellinen alue kohteelle %s"
-#: ../spell.c:7907
msgid "Warning: both compounding and NOBREAK specified"
-msgstr "Varoitus: sekไ yhdyssanamuodostus ettไ NOBREAK kไyt๖ssไ"
+msgstr "Varoitus: sekรค yhdyssanamuodostus ettรค NOBREAK kรคytรถssรค"
-#: ../spell.c:7920
#, c-format
-msgid "Writing spell file %s ..."
+msgid "Writing spell file %s..."
msgstr "Kirjoitetaan oikaisulukutiedostoa %s..."
-#: ../spell.c:7925
msgid "Done!"
msgstr "Valmista."
-#: ../spell.c:8034
-#, c-format
-msgid "E765: 'spellfile' does not have %<PRId64> entries"
-msgstr "E765: spellfile ei sisไllไ %<PRId64> kohtaa"
-
-#: ../spell.c:8074
-#, fuzzy, c-format
-msgid "Word '%.*s' removed from %s"
-msgstr "Sana poistettu kohteesta %s"
-
-#: ../spell.c:8117
#, fuzzy, c-format
-msgid "Word '%.*s' added to %s"
-msgstr "Sana lisไtty kohteeseen %s"
-
-#: ../spell.c:8381
-msgid "E763: Word characters differ between spell files"
-msgstr "E763: Sanan merkit muuttuvat oikaisulukutiedostojen vไlillไ"
-
-#: ../spell.c:8684
-msgid "Sorry, no suggestions"
-msgstr "Sori, ei ehdotuksia"
-
-#: ../spell.c:8687
-#, c-format
-msgid "Sorry, only %<PRId64> suggestions"
-msgstr "Sori, vain %<PRId64> ehdotusta"
-
-#. for when 'cmdheight' > 1
-#. avoid more prompt
-#: ../spell.c:8704
-#, c-format
-msgid "Change \"%.*s\" to:"
-msgstr "Muuta %.*s:"
-
-#: ../spell.c:8737
-#, c-format
-msgid " < \"%.*s\""
-msgstr " < %.*s"
-
-#: ../spell.c:8882
-msgid "E752: No previous spell replacement"
-msgstr "E752: Ei edellistไ oikaisulukukorjausta"
+#~ msgid "E765: 'spellfile' does not have %<PRId64> entries"
+#~ msgstr "E765: spellfile ei sisรคllรค %ld kohtaa"
-#: ../spell.c:8925
#, c-format
-msgid "E753: Not found: %s"
-msgstr "E753: Ei l๖ytynyt: %s"
-
-#: ../spell.c:9276
-#, c-format
-msgid "E778: This does not look like a .sug file: %s"
-msgstr "E778: Ei vaikuta .sug-tiedostolta: %s"
-
-#: ../spell.c:9282
-#, c-format
-msgid "E779: Old .sug file, needs to be updated: %s"
-msgstr "E779: Vanha .sug-tiedosto pitไไ pไivittไไ: %s"
-
-#: ../spell.c:9286
-#, c-format
-msgid "E780: .sug file is for newer version of Vim: %s"
-msgstr "E780: .sug-tiedosto on uudemmalle Vimille: %s"
+msgid "Word '%.*s' removed from %s"
+msgstr "Sana %.*s poistettu kohteesta %s"
-#: ../spell.c:9295
#, c-format
-msgid "E781: .sug file doesn't match .spl file: %s"
-msgstr "E781: .sug-tiedosto ei tไsmไไ .spl-tiedostoon: %s"
+msgid "Word '%.*s' added to %s"
+msgstr "Sana %.*s lisรคtty kohteeseen %s"
-#: ../spell.c:9305
-#, c-format
-msgid "E782: error while reading .sug file: %s"
-msgstr "E782: virhe luettaessa .sug-tiedostoa: %s"
+msgid "E763: Word characters differ between spell files"
+msgstr "E763: Sanan merkit muuttuvat oikaisulukutiedostojen vรคlillรค"
#. This should have been checked when generating the .spl
#. file.
-#: ../spell.c:11575
msgid "E783: duplicate char in MAP entry"
-msgstr "E783: kaksoiskappale merkistไ MAP-kohdassa"
+msgstr "E783: kaksoiskappale merkistรค MAP-kohdassa"
+
+msgid "E766: Insufficient arguments for printf()"
+msgstr "E766: printf():lle ei annettu tarpeeksi argumentteja"
+
+msgid "E807: Expected Float argument for printf()"
+msgstr "E807: Odotettiin Float-argumenttia printf():lle"
+
+msgid "E767: Too many arguments to printf()"
+msgstr "E767: printf():lle annettiin liikaa argumentteja"
-#: ../syntax.c:266
msgid "No Syntax items defined for this buffer"
-msgstr "Ei syntaksikohteita tไlle puskurille"
+msgstr "Ei syntaksikohteita tรคlle puskurille"
-#: ../syntax.c:3083 ../syntax.c:3104 ../syntax.c:3127
#, c-format
msgid "E390: Illegal argument: %s"
msgstr "E390: Virheellinen argumentti: %s"
-#: ../syntax.c:3299
+msgid "syntax iskeyword "
+msgstr "syntax iskeyword "
+
#, c-format
msgid "E391: No such syntax cluster: %s"
msgstr "E391: Syntaksiklusteri puuttuu: %s"
-#: ../syntax.c:3433
msgid "syncing on C-style comments"
msgstr "synkkaa C-tyylin kommentteihin"
-#: ../syntax.c:3439
msgid "no syncing"
msgstr "ei synkkausta"
-#: ../syntax.c:3441
msgid "syncing starts "
msgstr "synkkaus aloitettu "
-#: ../syntax.c:3443 ../syntax.c:3506
msgid " lines before top line"
-msgstr " riviไ ennen alkua"
+msgstr " riviรค ennen alkua"
-#: ../syntax.c:3448
msgid ""
"\n"
"--- Syntax sync items ---"
@@ -5738,7 +5207,6 @@ msgstr ""
"\n"
"--- Syntax sync -kohteet ---"
-#: ../syntax.c:3452
msgid ""
"\n"
"syncing on items"
@@ -5746,7 +5214,6 @@ msgstr ""
"\n"
"synkataan kohteisiin"
-#: ../syntax.c:3457
msgid ""
"\n"
"--- Syntax items ---"
@@ -5754,2314 +5221,2496 @@ msgstr ""
"\n"
"--- Syntax-kohteet ---"
-#: ../syntax.c:3475
#, c-format
msgid "E392: No such syntax cluster: %s"
msgstr "E392: syntaksiklusteria ei ole: %s"
-#: ../syntax.c:3497
msgid "minimal "
-msgstr "vไhintไไn "
+msgstr "vรคhintรครคn "
-#: ../syntax.c:3503
msgid "maximal "
-msgstr "enitntไไn "
+msgstr "enitntรครคn "
-#: ../syntax.c:3513
msgid "; match "
-msgstr "; tไsmไไ "
+msgstr "; tรคsmรครค "
-#: ../syntax.c:3515
msgid " line breaks"
msgstr " rivinvaihdot"
-#: ../syntax.c:4076
msgid "E395: contains argument not accepted here"
-msgstr "E395: contains ei sovi tไhไn"
+msgstr "E395: contains ei sovi tรคhรคn"
-#: ../syntax.c:4096
-#, fuzzy
msgid "E844: invalid cchar value"
-msgstr "E474: Virheellinen argumentti"
+msgstr "E844: Virheellinen cchar-arvo"
-#: ../syntax.c:4107
msgid "E393: group[t]here not accepted here"
-msgstr "E393: group[t]here ei sovi tไhไn"
+msgstr "E393: group[t]here ei sovi tรคhรคn"
-#: ../syntax.c:4126
#, c-format
msgid "E394: Didn't find region item for %s"
-msgstr "E394: Aluetta nimelle %s ei l๖ydy"
+msgstr "E394: Aluetta nimelle %s ei lรถydy"
-#: ../syntax.c:4188
msgid "E397: Filename required"
msgstr "E397: Tiedostonimi puuttuu"
-#: ../syntax.c:4221
-#, fuzzy
msgid "E847: Too many syntax includes"
-msgstr "E77: Liikaa tiedostonimiไ"
+msgstr "E847: Liikaa syntax includeja"
-#: ../syntax.c:4303
#, c-format
msgid "E789: Missing ']': %s"
msgstr "E789: ] puuttuu: %s"
-#: ../syntax.c:4531
+#, c-format
+msgid "E890: trailing char after ']': %s]%s"
+msgstr "E890: Ylimรครคrรคisiรค merkkejรค merkin ] perรคssรค: %s]%s"
+
#, c-format
msgid "E398: Missing '=': %s"
msgstr "E398: = puuttuu: %s"
-#: ../syntax.c:4666
#, c-format
msgid "E399: Not enough arguments: syntax region %s"
msgstr "E399: Argumentteja puuttuu: syntaksialue %s"
-#: ../syntax.c:4870
-#, fuzzy
msgid "E848: Too many syntax clusters"
-msgstr "E391: Syntaksiklusteri puuttuu: %s"
+msgstr "E848: Liikaa syntaksiklustereita"
-#: ../syntax.c:4954
msgid "E400: No cluster specified"
-msgstr "E400: klusteri mไไrittelemไttไ"
+msgstr "E400: klusteri mรครคrittelemรคttรค"
#. end delimiter not found
-#: ../syntax.c:4986
#, c-format
msgid "E401: Pattern delimiter not found: %s"
msgstr "E401: Kuvoin erotin puuttuu: %s"
-#: ../syntax.c:5049
#, c-format
msgid "E402: Garbage after pattern: %s"
-msgstr "E402: Roskia kuvion jไljessไ: %s"
+msgstr "E402: Roskia kuvion jรคljessรค: %s"
-#: ../syntax.c:5120
msgid "E403: syntax sync: line continuations pattern specified twice"
-msgstr "E403: syntax sync: rivinjatkamiskuvio mไไritelty kahdesti"
+msgstr "E403: syntax sync: rivinjatkamiskuvio mรครคritelty kahdesti"
-#: ../syntax.c:5169
#, c-format
msgid "E404: Illegal arguments: %s"
msgstr "E404: Virheelliset argumentit: %s"
-#: ../syntax.c:5217
#, c-format
msgid "E405: Missing equal sign: %s"
msgstr "E405: = puuttuu: %s"
-#: ../syntax.c:5222
#, c-format
msgid "E406: Empty argument: %s"
-msgstr "E406: Tyhjไ argumentti: %s"
+msgstr "E406: Tyhjรค argumentti: %s"
-#: ../syntax.c:5240
#, c-format
msgid "E407: %s not allowed here"
-msgstr "E407: %s ei sovi tไhไn"
+msgstr "E407: %s ei sovi tรคhรคn"
-#: ../syntax.c:5246
#, c-format
msgid "E408: %s must be first in contains list"
msgstr "E408: %s kuuluu contains-listan alkuun"
-#: ../syntax.c:5304
#, c-format
msgid "E409: Unknown group name: %s"
-msgstr "E409: Tuntematon ryhmไn nimi: %s"
+msgstr "E409: Tuntematon ryhmรคn nimi: %s"
-#: ../syntax.c:5512
#, c-format
msgid "E410: Invalid :syntax subcommand: %s"
msgstr "E410: Virheelluinen :syntax-osakomento: %s"
-#: ../syntax.c:5854
msgid ""
" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
msgstr ""
+" KAIKKI Mร„ร„Rร„ Tร„SMร„YS HITAIN KEKSIARVO NIMI ILMAUS"
-#: ../syntax.c:6146
msgid "E679: recursive loop loading syncolor.vim"
-msgstr "E679: rekursiivinen silmukka syncolor.vimissไ"
+msgstr "E679: rekursiivinen silmukka syncolor.vimissรค"
-#: ../syntax.c:6256
#, c-format
msgid "E411: highlight group not found: %s"
-msgstr "E411: korostusryhmไไ ei l๖ytynyt: %s"
+msgstr "E411: korostusryhmรครค ei lรถytynyt: %s"
-#: ../syntax.c:6278
#, c-format
msgid "E412: Not enough arguments: \":highlight link %s\""
msgstr "E412: Argumentteja puuttuu: :highlight link %s"
-#: ../syntax.c:6284
#, c-format
msgid "E413: Too many arguments: \":highlight link %s\""
msgstr "E413: Liikaa argumentteja: :highlight link %s"
-#: ../syntax.c:6302
msgid "E414: group has settings, highlight link ignored"
-msgstr "E414: ryhmไllไ on asetuksia, highlight link -komento ohitetaan"
+msgstr "E414: ryhmรคllรค on asetuksia, highlight link -komento ohitetaan"
-#: ../syntax.c:6367
#, c-format
msgid "E415: unexpected equal sign: %s"
msgstr "E415: odotuksenvastainen =-merkki: %s"
-#: ../syntax.c:6395
#, c-format
msgid "E416: missing equal sign: %s"
msgstr "E416: puuttuva =-merkki: %s"
-#: ../syntax.c:6418
#, c-format
msgid "E417: missing argument: %s"
msgstr "E417: puuttuva argumentti: %s"
-#: ../syntax.c:6446
#, c-format
msgid "E418: Illegal value: %s"
msgstr "E418: Viallinen arvo: %s"
-#: ../syntax.c:6496
msgid "E419: FG color unknown"
-msgstr "E419: edustavไri tuntematon"
+msgstr "E419: edustavรคri tuntematon"
-#: ../syntax.c:6504
msgid "E420: BG color unknown"
-msgstr "E420: taustavไri tuntematon"
+msgstr "E420: taustavรคri tuntematon"
-#: ../syntax.c:6564
#, c-format
msgid "E421: Color name or number not recognized: %s"
-msgstr "E421: Vไrin nimi tai numero tuntematon: %s"
+msgstr "E421: Vรคrin nimi tai numero tuntematon: %s"
-#: ../syntax.c:6714
-#, c-format
-msgid "E422: terminal code too long: %s"
-msgstr "E422: terminaalikoodi liian pitkไ: %s"
-
-#: ../syntax.c:6753
#, c-format
msgid "E423: Illegal argument: %s"
msgstr "E423: Virheellinen argumentti: %s"
-#: ../syntax.c:6925
msgid "E424: Too many different highlighting attributes in use"
msgstr "E424: Liikaa eri korostusattribuutteja"
-#: ../syntax.c:7427
msgid "E669: Unprintable character in group name"
-msgstr "E669: Tulostuskelvoton merkki ryhmไn nimessไ"
+msgstr "E669: Tulostuskelvoton merkki ryhmรคn nimessรค"
-#: ../syntax.c:7434
msgid "W18: Invalid character in group name"
-msgstr "W18: Virheellinen merkki ryhmไn nimessไ"
+msgstr "W18: Virheellinen merkki ryhmรคn nimessรค"
-#: ../syntax.c:7448
msgid "E849: Too many highlight and syntax groups"
-msgstr ""
+msgstr "E849: Liikaa korostuksia ja syntaksiryhmiรค"
-#: ../tag.c:104
msgid "E555: at bottom of tag stack"
-msgstr "E555: tไgipinon pohja"
+msgstr "E555: tรคgipinon pohja"
-#: ../tag.c:105
msgid "E556: at top of tag stack"
-msgstr "E556: tไgipinon huippu"
+msgstr "E556: tรคgipinon huippu"
-#: ../tag.c:380
msgid "E425: Cannot go before first matching tag"
-msgstr "E425: Ei voida mennไ ensimmไistไ tไsmไไvไไ tไgiไ alummaksi"
+msgstr "E425: Ei voida mennรค ensimmรคistรค tรคsmรครคvรครค tรคgiรค alummaksi"
-#: ../tag.c:504
#, c-format
msgid "E426: tag not found: %s"
-msgstr "E426: tไgi puuttuu: %s"
+msgstr "E426: tรคgi puuttuu: %s"
-#: ../tag.c:528
msgid " # pri kind tag"
-msgstr " # arvo tyyppi tไgi"
+msgstr " # arvo tyyppi tรคgi"
-#: ../tag.c:531
msgid "file\n"
msgstr "tiedosto\n"
-#: ../tag.c:829
msgid "E427: There is only one matching tag"
-msgstr "E427: Vain yksi tไgi tไsmไไ"
+msgstr "E427: Vain yksi tรคgi tรคsmรครค"
-#: ../tag.c:831
msgid "E428: Cannot go beyond last matching tag"
-msgstr "E428: Ei voida edetไ viimeisen tไsmไไvไn tไgin ohi"
+msgstr "E428: Ei voida edetรค viimeisen tรคsmรครคvรคn tรคgin ohi"
-#: ../tag.c:850
#, c-format
msgid "File \"%s\" does not exist"
msgstr "Tiedostoa %s ei ole"
-#. Give an indication of the number of matching tags
-#: ../tag.c:859
#, c-format
msgid "tag %d of %d%s"
-msgstr "tไgi %d/%d%s"
+msgstr "tรคgi %d/%d%s"
-#: ../tag.c:862
msgid " or more"
msgstr " tai useammasta"
-#: ../tag.c:864
msgid " Using tag with different case!"
-msgstr " Tไgissไ eri kirjaintaso"
+msgstr " Tรคgissรค eri kirjaintaso"
-#: ../tag.c:909
#, c-format
msgid "E429: File \"%s\" does not exist"
msgstr "E429: Tiedostoa %s ei ole"
-#. Highlight title
-#: ../tag.c:960
msgid ""
"\n"
" # TO tag FROM line in file/text"
msgstr ""
"\n"
-" # TILL tagg FRลN LINJE i fil/text"
+" # TILL tagg FRร…N LINJE i fil/text"
-#: ../tag.c:1303
#, c-format
msgid "Searching tags file %s"
-msgstr "Etsitไไn tไgitiedostoa %s"
+msgstr "Etsitรครคn tรคgitiedostoa %s"
-#: ../tag.c:1545
msgid "Ignoring long line in tags file"
-msgstr "Ohitetaan pitkไ rivi tไgitiedostossa"
+msgstr "Ohitetaan pitkรค rivi tรคgitiedostossa"
-#: ../tag.c:1915
#, c-format
msgid "E431: Format error in tags file \"%s\""
-msgstr "E431: Muotovirh tไgitiedostossa %s"
+msgstr "E431: Muotovirh tรคgitiedostossa %s"
-#: ../tag.c:1917
-#, c-format
-msgid "Before byte %<PRId64>"
-msgstr "Ennen tavua %<PRId64>"
+#, fuzzy, c-format
+#~ msgid "Before byte %<PRId64>"
+#~ msgstr "Ennen tavua %ld"
-#: ../tag.c:1929
#, c-format
msgid "E432: Tags file not sorted: %s"
-msgstr "E432: Tไgitiedosto ei ole jไrjestetty: %s"
+msgstr "E432: Tรคgitiedosto ei ole jรคrjestetty: %s"
-#. never opened any tags file
-#: ../tag.c:1960
msgid "E433: No tags file"
-msgstr "E433: Ei tไgitiedostoja"
+msgstr "E433: Ei tรคgitiedostoja"
-#: ../tag.c:2536
msgid "E434: Can't find tag pattern"
-msgstr "E434: Tไgikuviota ei l๖ydy"
+msgstr "E434: Tรคgikuviota ei lรถydy"
-#: ../tag.c:2544
msgid "E435: Couldn't find tag, just guessing!"
-msgstr "E435: Tไgiไ ei l๖ydy, arvataan."
+msgstr "E435: Tรคgiรค ei lรถydy, arvataan."
-#: ../tag.c:2797
#, c-format
msgid "Duplicate field name: %s"
-msgstr "Kaksoiskappale kentไn nimestไ: %s"
-
-#: ../term.c:1442
-msgid "' not known. Available builtin terminals are:"
-msgstr " ei tunnettu. Tuetut terminaalit:"
-
-#: ../term.c:1463
-msgid "defaulting to '"
-msgstr "oletusarvona "
-
-#: ../term.c:1731
-msgid "E557: Cannot open termcap file"
-msgstr "E557: Ei voi avata termcap-tiedostoa"
-
-#: ../term.c:1735
-msgid "E558: Terminal entry not found in terminfo"
-msgstr "E558: Terminaalia ei l๖ytynyt terminfosta"
-
-#: ../term.c:1737
-msgid "E559: Terminal entry not found in termcap"
-msgstr "E559: Terminaalia ei l๖ytynyt termcapista"
-
-#: ../term.c:1878
-#, c-format
-msgid "E436: No \"%s\" entry in termcap"
-msgstr "E436: %s ei l๖ytynyt termcapista"
-
-#: ../term.c:2249
-msgid "E437: terminal capability \"cm\" required"
-msgstr "E437: terminaalilla pitไไ olla cm kyvyissไไn"
-
-#. Highlight title
-#: ../term.c:4376
-msgid ""
-"\n"
-"--- Terminal keys ---"
-msgstr ""
-"\n"
-"--- Terminaalinไppไimet ---"
-
-#: ../ui.c:481
-msgid "Vim: Error reading input, exiting...\n"
-msgstr "Vim: Virhe luettaessa sy๖tettไ, poistutaan...\n"
+msgstr "Kaksoiskappale kentรคn nimestรค: %s"
#. This happens when the FileChangedRO autocommand changes the
#. * file in a way it becomes shorter.
-#: ../undo.c:379
-#, fuzzy
msgid "E881: Line count changed unexpectedly"
-msgstr "E834: Rivimไไrไ vaihtui odottamatta"
+msgstr "E881: Rivimรครคrรค vaihtui odottamatta"
-#: ../undo.c:627
#, c-format
msgid "E828: Cannot open undo file for writing: %s"
msgstr "E828: Kumoustiedoston avaus kirjoittamista varten ei onnistu: %s"
-#: ../undo.c:717
+#, fuzzy, c-format
+#~ msgid "E5003: Unable to create directory \"%s\" for undo file: %s"
+#~ msgstr "E346: Hakemisto %s ei ole enรครค cdpathissa"
+
#, c-format
msgid "E825: Corrupted undo file (%s): %s"
msgstr "E825: Pilaanntunut kumoustiedosto (%s): %s"
-#: ../undo.c:1039
msgid "Cannot write undo file in any directory in 'undodir'"
-msgstr "Ei voitu lukea kumoustiedostoa mistไไn undodir-muuttujan hakemistosta"
+msgstr "Ei voitu lukea kumoustiedostoa mistรครคn undodir-muuttujan hakemistosta"
-#: ../undo.c:1074
#, c-format
msgid "Will not overwrite with undo file, cannot read: %s"
msgstr "Ei ylikirjoitetat kumoustiedostolla, koska ei voida lukea: %s"
-#: ../undo.c:1092
#, c-format
msgid "Will not overwrite, this is not an undo file: %s"
-msgstr "Ei ylikirjoiteta, koska tไmไ ei ole kumoustiedosto: %s"
+msgstr "Ei ylikirjoiteta, koska tรคmรค ei ole kumoustiedosto: %s"
-#: ../undo.c:1108
msgid "Skipping undo file write, nothing to undo"
msgstr "Ohitetaan kumoustiedoston kirjoitus, koska ei ole peruutettavia"
-#: ../undo.c:1121
#, c-format
msgid "Writing undo file: %s"
msgstr "Kirjoitetaan kumoustiedostoa: %s"
-#: ../undo.c:1213
#, c-format
msgid "E829: write error in undo file: %s"
msgstr "E829: Kirjoitusvirhe kumoustiedostossa: %s"
-#: ../undo.c:1280
#, c-format
msgid "Not reading undo file, owner differs: %s"
msgstr "Ei lueta kumoustiedosto jonka omistaja on eri: %s"
-#: ../undo.c:1292
#, c-format
msgid "Reading undo file: %s"
msgstr "Luetaan kumoustiedostoa: %s"
-#: ../undo.c:1299
#, c-format
msgid "E822: Cannot open undo file for reading: %s"
msgstr "E822: Kumoustiedostoa ei voi avata lukemista varten: %s"
-#: ../undo.c:1308
#, c-format
msgid "E823: Not an undo file: %s"
msgstr "E823: Ei ole kumoustiedosto: %s"
-#: ../undo.c:1313
#, c-format
msgid "E824: Incompatible undo file: %s"
-msgstr "E824: Epไyhteensopiva kumoustiedosto: %s"
+msgstr "E824: Epรคyhteensopiva kumoustiedosto: %s"
-#: ../undo.c:1328
msgid "File contents changed, cannot use undo info"
msgstr ""
-"Tiedoston sisไlt๖ on muuttunut, joen kumoustiedot ovat kไytt๖kelvottomia"
+"Tiedoston sisรคltรถ on muuttunut, joen kumoustiedot ovat kรคyttรถkelvottomia"
-#: ../undo.c:1497
#, c-format
msgid "Finished reading undo file %s"
msgstr "Ladattu kumoustiedoto %s"
-#: ../undo.c:1586 ../undo.c:1812
msgid "Already at oldest change"
msgstr "Vanhimmassa muutoksessa"
-#: ../undo.c:1597 ../undo.c:1814
msgid "Already at newest change"
msgstr "Nuorimmassa muutoksessa"
-#: ../undo.c:1806
-#, c-format
-msgid "E830: Undo number %<PRId64> not found"
-msgstr "E830: Kumouslukua %<PRId64> ei l๖ydy"
+#, fuzzy, c-format
+#~ msgid "E830: Undo number %<PRId64> not found"
+#~ msgstr "E830: Kumouslukua %ld ei lรถydy"
-#: ../undo.c:1979
msgid "E438: u_undo: line numbers wrong"
-msgstr "E438: u_undo: vไไrไt rivinumerot"
+msgstr "E438: u_undo: vรครคrรคt rivinumerot"
-#: ../undo.c:2183
msgid "more line"
-msgstr "rivi lisไไ"
+msgstr "rivi lisรครค"
-#: ../undo.c:2185
msgid "more lines"
-msgstr "riviไ lisไไ"
+msgstr "riviรค lisรครค"
-#: ../undo.c:2187
msgid "line less"
-msgstr "rivi vไhemmไn"
+msgstr "rivi vรคhemmรคn"
-#: ../undo.c:2189
msgid "fewer lines"
-msgstr "riviไ vไhemmไn"
+msgstr "riviรค vรคhemmรคn"
-#: ../undo.c:2193
msgid "change"
msgstr "muutos"
-#: ../undo.c:2195
msgid "changes"
msgstr "muutosta"
-# eka %s ylไpuolelta, toka %s alapuolelta, kolmas %s aika
-#: ../undo.c:2225
-#, c-format
-msgid "%<PRId64> %s; %s #%<PRId64> %s"
-msgstr "%<PRId64> %s, %s #%<PRId64> %s"
+# eka %s ylรคpuolelta, toka %s alapuolelta, kolmas %s aika
+#, fuzzy, c-format
+#~ msgid "%<PRId64> %s; %s #%<PRId64> %s"
+#~ msgstr "%ld %s, %s #%ld %s"
+
+msgid "after"
+msgstr "jรคlkeen muutoksen"
-#: ../undo.c:2228
msgid "before"
msgstr "ennen muutosta"
-#: ../undo.c:2228
-msgid "after"
-msgstr "jไlkeen muutoksen"
-
-#: ../undo.c:2325
msgid "Nothing to undo"
msgstr "Ei kumottavaa"
-#: ../undo.c:2330
-#, fuzzy
msgid "number changes when saved"
-msgstr "muutoksia aika tallennettu"
+msgstr "numero muutoksia aika tallennettu"
-#: ../undo.c:2360
-#, c-format
-msgid "%<PRId64> seconds ago"
-msgstr "%<PRId64> sekuntia sitten"
+#, fuzzy, c-format
+#~ msgid "%<PRId64> seconds ago"
+#~ msgstr "%ld sekuntia sitten"
-#: ../undo.c:2372
msgid "E790: undojoin is not allowed after undo"
-msgstr "E790: undojoin ei toimi undon jไlkeen"
+msgstr "E790: undojoin ei toimi undon jรคlkeen"
-#: ../undo.c:2466
msgid "E439: undo list corrupt"
msgstr "E439: kumouslista rikki"
-#: ../undo.c:2495
msgid "E440: undo line missing"
msgstr "E440: kumousrivi puuttuu"
-#: ../version.c:600
-msgid ""
-"\n"
-"Included patches: "
-msgstr ""
-"\n"
-"Pไtsit: "
-
-#: ../version.c:627
msgid ""
"\n"
"Extra patches: "
msgstr ""
"\n"
-"Muita pไtsejไ: "
-
-#: ../version.c:639 ../version.c:864
-msgid "Modified by "
-msgstr "Muokannut "
+"Muita pรคtsejรค: "
-#: ../version.c:646
msgid ""
"\n"
"Compiled "
msgstr ""
"\n"
-"Kไไntไnyt "
+"Kรครคntรคnyt "
-#: ../version.c:649
msgid "by "
msgstr ": "
-#: ../version.c:660
+#, fuzzy
msgid ""
"\n"
-"Huge version "
-msgstr ""
"\n"
-"Huge-versio "
-
-#: ../version.c:661
-msgid "without GUI."
-msgstr "ilman GUIta."
-
-#: ../version.c:662
-msgid " Features included (+) or not (-):\n"
+"Optional features included (+) or not (-): "
msgstr " Ominaisuudet mukana (+) ja poissa (-):\n"
-#: ../version.c:667
msgid " system vimrc file: \""
-msgstr " jไrjestelmไn vimrc: \""
-
-#: ../version.c:672
-msgid " user vimrc file: \""
-msgstr " kไyttไjไn vimrc: \""
-
-#: ../version.c:677
-msgid " 2nd user vimrc file: \""
-msgstr " 2. kไyttไjไn vimrc: \""
+msgstr " jรคrjestelmรคn vimrc: \""
-#: ../version.c:682
-msgid " 3rd user vimrc file: \""
-msgstr " 3. kไyttไjไn vimrc: \""
-
-#: ../version.c:687
-msgid " user exrc file: \""
-msgstr " kไyttไjไn exrc: \""
-
-#: ../version.c:692
-msgid " 2nd user exrc file: \""
-msgstr " 2. kไyttไjไn exrc: \""
-
-#: ../version.c:699
msgid " fall-back for $VIM: \""
msgstr " $VIMin fallback: \""
-#: ../version.c:705
msgid " f-b for $VIMRUNTIME: \""
msgstr " $VIMRUNTIMEn f-b: \""
-#: ../version.c:709
-msgid "Compilation: "
-msgstr "Kไไnn๖s: "
-
-#: ../version.c:712
-msgid "Linking: "
-msgstr "Linkitys: "
-
-#: ../version.c:717
-msgid " DEBUG BUILD"
-msgstr " DEBUG-versio"
-
-#: ../version.c:767
-msgid "VIM - Vi IMproved"
-msgstr "VIM - Vi IMproved"
-
-#: ../version.c:769
-msgid "version "
-msgstr "versio "
-
-#: ../version.c:770
msgid "by Bram Moolenaar et al."
-msgstr "tekijไt Bram Moolenaar et al."
+msgstr "tekijรคt Bram Moolenaar et al."
-#: ../version.c:774
-msgid "Vim is open source and freely distributable"
-msgstr "Vim on avointa lไhdekoodia ja vapaasti jaossa"
+#, fuzzy
+#~ msgid "Nvim is open source and freely distributable"
+#~ msgstr "Vim on avointa lรคhdekoodia ja vapaasti jaossa"
-#: ../version.c:776
-msgid "Help poor children in Uganda!"
-msgstr "Auta Ugandan k๖yhiไ lapsia"
+#~ msgid "https://neovim.io/community"
+#~ msgstr ""
-#: ../version.c:777
-msgid "type :help iccf<Enter> for information "
-msgstr "kirjoita :help iccf<Enter> lisไtietoa varten "
+#, fuzzy
+#~ msgid "type :help nvim<Enter> if you are new! "
+#~ msgstr "kirjoita :help iccf<Enter> lisรคtietoa varten "
+
+#, fuzzy
+#~ msgid "type :CheckHealth<Enter> to optimize Nvim"
+#~ msgstr "kirjoita :help iccf<Enter> lisรคtietoa varten "
-#: ../version.c:779
msgid "type :q<Enter> to exit "
msgstr "kirjoita :q<Enter> lopettaaksesi "
-#: ../version.c:780
-msgid "type :help<Enter> or <F1> for on-line help"
-msgstr "kirjoita :help<Enter> tai <F1> ohjetta varten "
-
-#: ../version.c:781
-msgid "type :help version7<Enter> for version info"
-msgstr "kirjoita :help version7<Enter> versiotietoja varten "
-
-#: ../version.c:784
-msgid "Running in Vi compatible mode"
-msgstr "Suoritetaan Vi-yhteensopivuustilaa"
+#, fuzzy
+#~ msgid "type :help<Enter> for help "
+#~ msgstr "kirjoita :q<Enter> lopettaaksesi "
-#: ../version.c:785
-msgid "type :set nocp<Enter> for Vim defaults"
-msgstr "kirjoita :set nocp<Enter> Vimin oletuksiin "
+msgid "Help poor children in Uganda!"
+msgstr "Auta Ugandan kรถyhiรค lapsia"
-#: ../version.c:786
-msgid "type :help cp-default<Enter> for info on this"
-msgstr "kirjoita :help cp-default<Enter> ohjetta oletuksista varten"
+msgid "type :help iccf<Enter> for information "
+msgstr "kirjoita :help iccf<Enter> lisรคtietoa varten "
-#: ../version.c:827
msgid "Sponsor Vim development!"
-msgstr "Tue Vimin kehitystไ"
+msgstr "Tue Vimin kehitystรค"
-#: ../version.c:828
msgid "Become a registered Vim user!"
-msgstr "Rekister๖idy Vim-kไyttไjไksi."
+msgstr "Rekisterรถidy Vim-kรคyttรคjรคksi."
-#: ../version.c:831
msgid "type :help sponsor<Enter> for information "
-msgstr "kirjoita :help sponsor<Enter> lisไtietoja varten"
+msgstr "kirjoita :help sponsor<Enter> lisรคtietoja varten"
-#: ../version.c:832
msgid "type :help register<Enter> for information "
-msgstr "kirjoita :help register<Enter> lisไtietoja varten"
+msgstr "kirjoita :help register<Enter> lisรคtietoja varten"
-#: ../version.c:834
msgid "menu Help->Sponsor/Register for information "
-msgstr "valikko Ohje->Sponsoroi/Rekister๖i lisไtietoja varten"
+msgstr "valikko Ohje->Sponsoroi/Rekisterรถi lisรคtietoja varten"
-#: ../window.c:119
msgid "Already only one window"
-msgstr "Enไไ yksi ikkuna jไljellไ"
+msgstr "Enรครค yksi ikkuna jรคljellรค"
-#: ../window.c:224
msgid "E441: There is no preview window"
msgstr "E441: Ei esikatseluikkunaa"
-#: ../window.c:559
msgid "E442: Can't split topleft and botright at the same time"
-msgstr "E442: Ei voi jakaa vasenta ylไnurkkaa ja oikeaa alanurkkaa yhtไaikaa"
+msgstr "E442: Ei voi jakaa vasenta ylรคnurkkaa ja oikeaa alanurkkaa yhtรคaikaa"
-#: ../window.c:1228
msgid "E443: Cannot rotate when another window is split"
-msgstr "E443: Ei voi kiertไไ kun toinen ikkuna on jaettu"
+msgstr "E443: Ei voi kiertรครค kun toinen ikkuna on jaettu"
-#: ../window.c:1803
msgid "E444: Cannot close last window"
-msgstr "E444: Ei voi sulkea viimeistไ ikkunaa"
+msgstr "E444: Ei voi sulkea viimeistรค ikkunaa"
-#: ../window.c:1810
msgid "E813: Cannot close autocmd window"
msgstr "E813: Ei voi sulkea autocmd-ikkunaa"
-#: ../window.c:1814
msgid "E814: Cannot close window, only autocmd window would remain"
-msgstr "E814: Ei voi sulkea viimeistไ ikkunaa, joka ei ole autocmd-ikkuna"
+msgstr "E814: Ei voi sulkea viimeistรค ikkunaa, joka ei ole autocmd-ikkuna"
-#: ../window.c:2717
msgid "E445: Other window contains changes"
-msgstr "E445: Toinen ikkuna sisไltไไ muutoksia"
+msgstr "E445: Toinen ikkuna sisรคltรครค muutoksia"
-#: ../window.c:4805
msgid "E446: No file name under cursor"
-msgstr "E446: Ei tiedostonimeไ kursorin alla"
+msgstr "E446: Ei tiedostonimeรค kursorin alla"
-#~ msgid "E831: bf_key_init() called with empty password"
-#~ msgstr "E831: bf_key_init() tyhjไllไ salasanalla"
+msgid "List or number required"
+msgstr "Lista tai luku tarvitaan"
-#~ msgid "E820: sizeof(uint32_t) != 4"
-#~ msgstr "E820: sizeof(uint32_t) != 4"
+#~ msgid ""
+#~ "Failed to set path: sys.path is not a list\n"
+#~ "You should now append vim.VIM_SPECIAL_PATH to sys.path"
+#~ msgstr ""
+#~ "Ei onnistuttu asettaman polkua: sys.path ei ole list\n"
+#~ "Lisรครค vim.VIM_SPECIAL_PATH muuttujaan sys.path"
-#~ msgid "E817: Blowfish big/little endian use wrong"
-#~ msgstr "E817: Blowfishin tavujไrjestys vไไrไ"
+#~ msgid ""
+#~ "Failed to set path hook: sys.path_hooks is not a list\n"
+#~ "You should now do the following:\n"
+#~ "- append vim.path_hook to sys.path_hooks\n"
+#~ "- append vim.VIM_SPECIAL_PATH to sys.path\n"
+#~ msgstr ""
+#~ "Ei voitu asettaa polkukoukkua: sys.path_hooks ei ole lista\n"
+#~ "Koeta seuraavaa:\n"
+#~ "- lisรครค vim.path_hook muuttujaan sys.path_hooks\n"
+#~ "- lisรครค vim.VIM_SPECIAL_PATH muuttujaan sys.path\n"
-#~ msgid "E818: sha256 test failed"
-#~ msgstr "E818: sha256-testi epไonnistui failed"
+#~ msgid "internal error: invalid value type"
+#~ msgstr "sisรคinen virhe: huono arvotyyppi"
-#~ msgid "E819: Blowfish test failed"
-#~ msgstr "E819: Blowfish-testi epไonnistui"
+#~ msgid "internal error: NULL reference passed"
+#~ msgstr "sisรคinen virhe: NULL-viite annettu"
-#~ msgid "Patch file"
-#~ msgstr "Patch-tiedosto"
+#~ msgid "unable to convert %s to vim structure"
+#~ msgstr "ei voi konvertoida oliota %s vim-tietorakenteeksi"
-#~ msgid ""
-#~ "&OK\n"
-#~ "&Cancel"
-#~ msgstr ""
-#~ "&OK\n"
-#~ "&Peru"
+#~ msgid "unable to convert %s to vim dictionary"
+#~ msgstr "ei voitu konvertoida oliota %s vim-sanakirjaksi"
-#~ msgid "E240: No connection to Vim server"
-#~ msgstr "E240: Ei yhteyttไ vim-palvelimeen"
+#~ msgid "E859: Failed to convert returned python object to vim value"
+#~ msgstr "E859: Ei voitu konvertoida python-oliota vim-arvoksi"
-#~ msgid "E241: Unable to send to %s"
-#~ msgstr "E241: Kohteeseen %s lไhettไminen ei onnistunut"
+#~ msgid "E858: Eval did not return a valid python object"
+#~ msgstr "E858: Eval ei palauttanut python-oliota"
-#~ msgid "E277: Unable to read a server reply"
-#~ msgstr "E277: Palvelimen vastauksen lukeminen ei onnistunut"
+#~ msgid "failed to run the code"
+#~ msgstr "ei voitu suorittaa koodia"
-#~ msgid "E258: Unable to send to client"
-#~ msgstr "E258: Asiakkaalle lไhetys ei onnistunut"
+#~ msgid "did not switch to the specified tab page"
+#~ msgstr "ei voitu vaihtaa annetulle vรคlilehtisivulle"
-#~ msgid "Save As"
-#~ msgstr "Tallenna nimellไ"
+#~ msgid "expected vim.TabPage object, but got %s"
+#~ msgstr "odotettiin vim.TabPage-oliota, saatiin %s"
-#~ msgid "Source Vim script"
-#~ msgstr "Lataa vim-skripti"
+#~ msgid "did not switch to the specified window"
+#~ msgstr "ei vaihdettu annettuun ikkunaan"
-#~ msgid "Edit File"
-#~ msgstr "Muokkaa tiedostoa"
+#~ msgid "failed to find window in the current tab page"
+#~ msgstr "ei voitu lรถytรครค ikkunaa nykyiselle vรคlilehtisivulle"
-#~ msgid " (NOT FOUND)"
-#~ msgstr " (EI LึYTYNYT)"
+#~ msgid "expected vim.Window object, but got %s"
+#~ msgstr "odotettiin vim.Window-oliota, saatiin %s"
-#~ msgid "unknown"
-#~ msgstr "tuntematon"
+#~ msgid "expected vim.Buffer object, but got %s"
+#~ msgstr "odotettiin vim.Buffer-oliota, ei %s"
-#~ msgid "Edit File in new window"
-#~ msgstr "Muokkaa uudessa ikkunassa"
+#~ msgid "attempt to refer to deleted buffer"
+#~ msgstr "yritettiin viitata poistettuun puskuriin"
-#~ msgid "Append File"
-#~ msgstr "Lisไไ tiedostoon"
+#~ msgid "no such window"
+#~ msgstr "ikkunaa ei ole"
-#~ msgid "Window position: X %d, Y %d"
-#~ msgstr "Ikkunan sijainti: X %d, Y %d"
+#~ msgid "readonly attribute: buffer"
+#~ msgstr "kirjoitussuojausattribuutti: puskuri"
-#~ msgid "Save Redirection"
-#~ msgstr "Tallenna uudelleenosoitus"
+#~ msgid "attempt to refer to deleted window"
+#~ msgstr "yritettiin viitata poistettuun ikkunaan"
-#~ msgid "Save View"
-#~ msgstr "Tallenna nไkymไ"
+#~ msgid "no such tab page"
+#~ msgstr "vรคlilehteรค ei ole"
-#~ msgid "Save Session"
-#~ msgstr "Tallenna sessio"
+#~ msgid "attempt to refer to deleted tab page"
+#~ msgstr "yritettiin viitata poistettuun vรคlilehteen"
-#~ msgid "Save Setup"
-#~ msgstr "Tallenna asetukset"
+#~ msgid "internal error: unknown option type"
+#~ msgstr "sisรคinen virhe: tuntematon asetustyyppi"
-#~ msgid "E809: #< is not available without the +eval feature"
-#~ msgstr "E809: #< ei ole kไyt๖ssไ jollei +eval ole pไไllไ"
+#~ msgid "unable to get option value"
+#~ msgstr "ei voitu hakea asetuksen arvoa"
-#~ msgid "E196: No digraphs in this version"
-#~ msgstr "E196: Digraafeja ei ole tไssไ versiossa"
+#~ msgid "failed to run function %s"
+#~ msgstr "ei voitu suorittaa funktiota %s"
-#~ msgid "is a device (disabled with 'opendevice' option)"
-#~ msgstr "on laite (ei kไyt๖ssไ opendevice-asetuksen takia)"
+#~ msgid "function %s does not exist"
+#~ msgstr "funktiota %s ei ole"
-#~ msgid "Reading from stdin..."
-#~ msgstr "Luetaan vakiosy๖tteestไ"
+#~ msgid "unnamed function %s does not exist"
+#~ msgstr "nimetรถntรค funktiota %s ei ole"
-#~ msgid "[crypted]"
-#~ msgstr "[salattu]"
+#~ msgid "cannot modify fixed list"
+#~ msgstr "ei voida muokata kiinitettyรค listaa"
-#~ msgid "E821: File is encrypted with unknown method"
-#~ msgstr "E821: Tiedoston salaus on tuntematon"
+#~ msgid "cannot delete vim.List attributes"
+#~ msgstr "ei voi poistaa vim.List-attribuutteja"
-#~ msgid "NetBeans disallows writes of unmodified buffers"
-#~ msgstr "NetBeans ei salli kirjoittaa muokkaamattomiin puskureihin"
+#~ msgid "failed to add item to list"
+#~ msgstr "ei voitu lisรคtรค kohtaa listaan"
-#~ msgid "Partial writes disallowed for NetBeans buffers"
-#~ msgstr "Osittaiset kirjoitukset kielletty NetBeans-puskureissa"
-
-#~ msgid "writing to device disabled with 'opendevice' option"
-#~ msgstr "laitteeseen kirjoittaminen pois kไyt๖stไ opendevice-asetuksella"
+#~ msgid "attempt to assign sequence of size %d to extended slice of size %d"
+#~ msgstr ""
+#~ "yritettiin asettaa sekvenssiรค jonka koko on %d sliceen jonka koko on %d"
-# tietไไkseni resurssiforkki on applen tiedostojไrjestelmไn tunnistejuttujuttu
-#~ msgid "E460: The resource fork would be lost (add ! to override)"
-#~ msgstr "E460: resurssiosa hไviไisi (lisไไ komentoon ! ohittaaksesi)"
+#~ msgid "internal error: failed to add item to list"
+#~ msgstr "sisรคinen virhe: ei voitu lisรคtรค kohtaa listaan"
-#~ msgid "<cannot open> "
-#~ msgstr "<ei voi avata> "
+#~ msgid "internal error: not enough list items"
+#~ msgstr "sisรคinen virhe: ei tarpeeksi listan kohtia"
-#~ msgid "E616: vim_SelFile: can't get font %s"
-#~ msgstr "E616: vim_SelFile: ei saada fonttia %s"
+#~ msgid "internal error: no vim list item %d"
+#~ msgstr "sisรคinen virhe: ei vim-listan indeksiรค %d"
-#~ msgid "E614: vim_SelFile: can't return to current directory"
-#~ msgstr "E614: vim_SelFile: nykyiseen hakemistoon ei voi palata"
+#~ msgid "attempt to assign sequence of size greater than %d to extended slice"
+#~ msgstr ""
+#~ "yritettiin sijoittaa sekvenssiรค jonka koko on enemmรคn kuin %d sliceen"
-#~ msgid "Pathname:"
-#~ msgstr "Polku:"
+#~ msgid "slice step cannot be zero"
+#~ msgstr "slicen askel ei voi olla nolla"
-#~ msgid "E615: vim_SelFile: can't get current directory"
-#~ msgstr "E615: vim_SelFile: nykyistไ hakemistoa ei saada selville"
+#~ msgid "internal error: failed to get vim list item %d"
+#~ msgstr "sisรคinen virhe: ei pystytty hakea vimin listan indeksiรค %d"
-#~ msgid "OK"
-#~ msgstr "OK"
+#~ msgid "list index out of range"
+#~ msgstr "listaindeksi arvoalueen ulkopuolelta"
-#~ msgid "Cancel"
-#~ msgstr "Peru"
+#~ msgid "list constructor does not accept keyword arguments"
+#~ msgstr "listakonstruktori ei tue avainsanaparametrejรค"
-#~ msgid "Vim dialog"
-#~ msgstr "Vim-ikkuna"
+#~ msgid "expected sequence element of size 2, but got sequence of size %d"
+#~ msgstr "sekvenssin elementin koon pitรคisi olla 2, ei %d"
-#~ msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
-#~ msgstr "Vierityspalkki: Pixmapin geometria ei selviไ"
+#~ msgid "hashtab changed during iteration"
+#~ msgstr "hashtab muuttui kesken iteraation"
-#~ msgid "E232: Cannot create BalloonEval with both message and callback"
-#~ msgstr "E232: Ei voi luoda BalloonEvalia viestille ja callbackille"
+#~ msgid "cannot set attribute %s"
+#~ msgstr "ei voi asettaa attribuuttia %s"
-#~ msgid "E229: Cannot start the GUI"
-#~ msgstr "E229: GUIn kไynnistys ei onnistu"
+#~ msgid "cannot delete vim.Dictionary attributes"
+#~ msgstr "ei voi poistaa vim.Dictionary-attribuutteja"
-#~ msgid "E230: Cannot read from \"%s\""
-#~ msgstr "E230: Ei voi lukea kohteesta %s"
+#~ msgid "internal error: imp.find_module returned tuple with NULL"
+#~ msgstr ""
+#~ "sisรคinen virhe: imp.find_module palautti tuplen joka sisรคltรครค nullin"
-#~ msgid "E665: Cannot start GUI, no valid font found"
-#~ msgstr "E665: Ei voi avata GUIta, sopivaa fonttia ei l๖ydy"
+#~ msgid ""
+#~ "expected 3-tuple as imp.find_module() result, but got tuple of size %d"
+#~ msgstr ""
+#~ "odotettiin 3-tuple tuloksnea imp.find_module()-kutsulle, mutta tuplen "
+#~ "koko onkin %d"
-#~ msgid "E231: 'guifontwide' invalid"
-#~ msgstr "E231: guifontwide virheellinen"
+#~ msgid "expected 3-tuple as imp.find_module() result, but got %s"
+#~ msgstr "odotettiin 3-tuplea tuloksena imp.find_module()-kutsulle, ei %s"
-#~ msgid "E599: Value of 'imactivatekey' is invalid"
-#~ msgstr "E599: imactivatekeyn arvo on virheellinen"
+#~ msgid "E264: Python: Error initialising I/O objects"
+#~ msgstr "E264: Python: Virhe IO-olioiden alustuksessa"
-#~ msgid "E254: Cannot allocate color %s"
-#~ msgstr "E254: Vไriไ %s ei voi mไไritellไ"
+#~ msgid "invalid attribute: %s"
+#~ msgstr "virheellinen attribuutti: %s"
-#~ msgid "No match at cursor, finding next"
-#~ msgstr "Ei tไsmไystไ kursorin alla, etsitไไn seuraava"
+#~ msgid "can't delete OutputObject attributes"
+#~ msgstr "ei voi poistaa OutputObject-attribuutteja"
-#~ msgid "Input _Methods"
-#~ msgstr "Sy๖te_menetelmไt"
+#~ msgid "number must be greater or equal to zero"
+#~ msgstr "luvun on oltava yhtรค suuri tai suurempi kuin nolla"
-#~ msgid "VIM - Search and Replace..."
-#~ msgstr "VIM - Etsi ja korvaa..."
+#~ msgid "value is too small to fit into C int type"
+#~ msgstr "arvo on liian pieni mahtumaan C:n int-tyyppiin"
-#~ msgid "VIM - Search..."
-#~ msgstr "VIM - Etsi..."
+#~ msgid "expected int() or something supporting coercing to int(), but got %s"
+#~ msgstr ""
+#~ "odotettiin tyyppiรค int() tai jotain joka muuntuu tyyppiin int(), ei %s"
-#~ msgid "Find what:"
-#~ msgstr "Etsi:"
+#~ msgid ""
+#~ "expected int(), long() or something supporting coercing to long(), but "
+#~ "got %s"
+#~ msgstr ""
+#~ "odotettiin instanssia tyypeistรค int(), long() tai mitรค tahansa joka "
+#~ "muuntuisi tyyppiin long(), ei %s"
-#~ msgid "Replace with:"
-#~ msgstr "Korvaa:"
+#~ msgid "expected bytes() or str() instance, but got %s"
+#~ msgstr "odotettiin instanssia tyypeistรค bytes() tai str(), ei %s"
-#~ msgid "Match whole word only"
-#~ msgstr "Korvaa kokonaisia sanoja"
+#~ msgid "expected str() or unicode() instance, but got %s"
+#~ msgstr "odottettiin insanssia tyypeistรค str() tai unicode(), ei %s"
-#~ msgid "Match case"
-#~ msgstr "Kirjaintaso"
+#~ msgid "index must be int or slice, not %s"
+#~ msgstr "indeksin pitรครค olla int tai slice, ei %s"
-#~ msgid "Direction"
-#~ msgstr "Suunta"
+#~ msgid "failed to add key '%s' to dictionary"
+#~ msgstr "avaimen %s lisรครคminen sanakirjaan ei onnistu"
-#~ msgid "Up"
-#~ msgstr "Yl๖s"
+#~ msgid "list is locked"
+#~ msgstr "luettelo on lukittu"
-#~ msgid "Down"
-#~ msgstr "Alas"
+#~ msgid "Need encryption key for \"%s\""
+#~ msgstr "Tarvitaan salausavain kohteelle %s "
-#~ msgid "Find Next"
-#~ msgstr "Etsi seuraava"
+#~ msgid "E744: NetBeans does not allow changes in read-only files"
+#~ msgstr "E744: NetBeans ei tue muutoksia kirjoitussuojattuihin tiedostoihin"
-#~ msgid "Replace"
-#~ msgstr "Korvaa"
+#~ msgid "E463: Region is guarded, cannot modify"
+#~ msgstr "E463: Alue on suojattu, muuttaminen ei onnistu"
-#~ msgid "Replace All"
-#~ msgstr "Korvaa kaikki"
+#~ msgid "E449: Invalid expression received"
+#~ msgstr "E449: Virheellinen ilmaus saatu"
-#~ msgid "Vim: Received \"die\" request from session manager\n"
-#~ msgstr "Vim: sessiomanageri lไhetti die-pyynn๖n\n"
+#~ msgid "E233: cannot open display"
+#~ msgstr "E233: nรคyttรถรค ei voi avata"
-#~ msgid "Close"
-#~ msgstr "Sulje"
+#~ msgid "E247: no registered server named \"%s\""
+#~ msgstr "E247: palvelinta %s ei ole rekisterรถitynรค"
-#~ msgid "New tab"
-#~ msgstr "Uusi vไlilehti"
+#~ msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
+#~ msgstr "E800: Arabiaa ei voi kรคyttรครค, koska sitรค ei kรครคnnetty mukaan\n"
-#~ msgid "Open Tab..."
-#~ msgstr "Avaa vไlilehti..."
+#~ msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
+#~ msgstr "E27: Farsia ei voi kรคyttรครค, koska sitรค ei kรครคnnetty mukaan\n"
-#~ msgid "Vim: Main window unexpectedly destroyed\n"
-#~ msgstr "Vim: Pไไikkuna tuhoutui odottamatta\n"
+#~ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
+#~ msgstr "E26: Hepreaa ei voi kรคyttรครค, koska sitรค ei kรครคnnetty mukaan\n"
-#~ msgid "&Filter"
-#~ msgstr "&Suodata"
+#~ msgid "E25: GUI cannot be used: Not enabled at compile time"
+#~ msgstr "E25: GUIta ei voi kรคyttรครค, koska sitรค ei kรครคnnetty mukaan"
-#~ msgid "&Cancel"
-#~ msgstr "&Peru"
+#~ msgid "E448: Could not load library function %s"
+#~ msgstr "E448: Ei voitu ladta kirjastofunktiota %s"
-#~ msgid "Directories"
-#~ msgstr "Hakemistot"
+#~ msgid "E236: Font \"%s\" is not fixed-width"
+#~ msgstr "E236: Fontti %s ei ole tasavรคlinen"
-#~ msgid "Filter"
-#~ msgstr "Suodatus"
+#~ msgid "E234: Unknown fontset: %s"
+#~ msgstr "E234: Tuntematon fontset: %s"
-#~ msgid "&Help"
-#~ msgstr "O&hje"
+#~ msgid "gvimext.dll error"
+#~ msgstr "gvimext.dll-virhe"
-#~ msgid "Files"
-#~ msgstr "Tiedostot"
+#~ msgid "Error creating process: Check if gvim is in your path!"
+#~ msgstr "Virhe prosessin kรคynnistรคmisessรค, varmista ettรค gvim on polulla"
-#~ msgid "&OK"
-#~ msgstr "&Ok"
+#~ msgid "Edits the selected file(s) with Vim"
+#~ msgstr "Muokkaa valittuja tiedostoja Vimillรค"
-#~ msgid "Selection"
-#~ msgstr "Valinta"
+#~ msgid "Edit with existing Vim - "
+#~ msgstr "Muokkaa olemassaolevalla Vimillรค - "
-#~ msgid "Find &Next"
-#~ msgstr "Hae &seuraava"
+#~ msgid "Edit with &Vim"
+#~ msgstr "Muokkaa &Vimillรค"
-#~ msgid "&Replace"
-#~ msgstr "Ko&rvaa"
+#~ msgid "Diff with Vim"
+#~ msgstr "Diffi Vimillรค"
-#~ msgid "Replace &All"
-#~ msgstr "Korvaa k&aikki"
+#~ msgid "Edit with single &Vim"
+#~ msgstr "Muokkaa yhdellรค &Vimillรค"
-#~ msgid "&Undo"
-#~ msgstr "&Kumoa"
+#~ msgid "Edit with &multiple Vims"
+#~ msgstr "&Muokkaa usealla Vimillรค"
-#~ msgid "E671: Cannot find window title \"%s\""
-#~ msgstr "E671: Ikkunan otsikkoa ei l๖ydy %s"
+#~ msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
+#~ msgstr "E299: Perl-suoritus kielletty hiekkalaatikossa ilman Safe-moduulia"
-# OLE on object linking and embedding pๅ windowska
-#~ msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
-#~ msgstr "E243: Argumenttia ei tueta: -%s, kไytไ OLE-versiota"
+#~ msgid ""
+#~ "Sorry, this command is disabled: the Perl library could not be loaded."
+#~ msgstr "komento ei toimi, Perl kirjastoa ei voinut ladata."
-# MDI eli windowsin moni-ikkunasovellus
-#~ msgid "E672: Unable to open window inside MDI application"
-#~ msgstr "E672: Ikkunaa ei voitu avata MDI-sovellukseen"
+#~ msgid "E370: Could not load library %s"
+#~ msgstr "E370: Kirjaston %s lataaminen ei onnistu"
-#~ msgid "Close tab"
-#~ msgstr "Sulje vไlilehti"
+#~ msgid "type :help windows95<Enter> for info on this"
+#~ msgstr "kirjoita :help windows95<Enter> lisรคtietoja varten"
-#~ msgid "Open tab..."
-#~ msgstr "Avaa vไlilehti..."
+#~ msgid "WARNING: Windows 95/98/ME detected"
+#~ msgstr "VAROITUS: Window 95/98/ME havaittu"
-#~ msgid "Find string (use '\\\\' to find a '\\')"
-#~ msgstr "Etsi merkkijonoa (\\\\:llไ l๖ytไไ \\:t)"
+#~ msgid " for Vim defaults "
+#~ msgstr " Vim-oletuksia varten"
-#~ msgid "Find & Replace (use '\\\\' to find a '\\')"
-#~ msgstr "Etsi ja korvaa (\\\\:llไ l๖ytไไ \\:t)"
+#~ msgid "menu Edit->Global Settings->Toggle Vi Compatible"
+#~ msgstr "valikko Muokkaa->Yleiset asetukset->Vaihda Vi-yhteensopivuutta"
-#~ msgid "Not Used"
-#~ msgstr "Ei kไyt๖ssไ"
+#~ msgid "menu Edit->Global Settings->Toggle Insert Mode "
+#~ msgstr "valikko Muokkaa->Yleiset asetukset->Vaihda syรถtetilaa"
-#~ msgid "Directory\t*.nothing\n"
-#~ msgstr "Hakemisto\t*.nothing\n"
+#~ msgid "Running modeless, typed text is inserted"
+#~ msgstr "Suoritetaan tilattomana, kirjoitettu teksti syรถtetรครคn"
-#~ msgid ""
-#~ "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
-#~ msgstr ""
-#~ "Vim E458: Ei voi varata vไrikartan alkiota, vไrit voivat mennไ vไไrin"
+#~ msgid "menu Help->Orphans for information "
+#~ msgstr "valikko Ohje->Orvot lisรคtietoja varten "
-#~ msgid "E250: Fonts for the following charsets are missing in fontset %s:"
-#~ msgstr "E250: Seuraavien merkist๖joukkojen fontit puuttuvat fontsetistไ %s:"
+#~ msgid "type :help cp-default<Enter> for info on this"
+#~ msgstr "kirjoita :help cp-default<Enter> ohjetta oletuksista varten"
-#~ msgid "E252: Fontset name: %s"
-#~ msgstr "E252: Fontsetin nimi: %s"
+#~ msgid "type :set nocp<Enter> for Vim defaults"
+#~ msgstr "kirjoita :set nocp<Enter> Vimin oletuksiin "
-#~ msgid "Font '%s' is not fixed-width"
-#~ msgstr "Fontti %s ei ole tasavไlinen"
+#~ msgid "Running in Vi compatible mode"
+#~ msgstr "Suoritetaan Vi-yhteensopivuustilaa"
-#~ msgid "E253: Fontset name: %s\n"
-#~ msgstr "E253: Fontsetin nimi: %s\n"
+#~ msgid "type :help version8<Enter> for version info"
+#~ msgstr "kirjoita :help version8<Enter> versiotietoja varten "
-#~ msgid "Font0: %s\n"
-#~ msgstr "Fontti0: %s\n"
+#~ msgid "type :help<Enter> or <F1> for on-line help"
+#~ msgstr "kirjoita :help<Enter> tai <F1> ohjetta varten "
-#~ msgid "Font1: %s\n"
-#~ msgstr "Fontti1: %s\n"
+#~ msgid "version "
+#~ msgstr "versio "
-#~ msgid "Font%<PRId64> width is not twice that of font0\n"
-#~ msgstr "Fontti%<PRId64>:n leveys ei ole kaksi kertaa fontti0:n\n"
+#~ msgid "VIM - Vi IMproved"
+#~ msgstr "VIM - Vi IMproved"
-#~ msgid "Font0 width: %<PRId64>\n"
-#~ msgstr "Fontti0:n leveys: %<PRId64>\n"
+#~ msgid " DEBUG BUILD"
+#~ msgstr " DEBUG-versio"
-#~ msgid ""
-#~ "Font1 width: %<PRId64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "Fontti1:n leveys: %<PRId64>\n"
-#~ "\n"
+#~ msgid "Linking: "
+#~ msgstr "Linkitys: "
-#~ msgid "Invalid font specification"
-#~ msgstr "Virheellinen fonttimไไritys"
+#~ msgid "Compiler: "
+#~ msgstr "Kรครคnnin: "
-#~ msgid "&Dismiss"
-#~ msgstr "&Ohita"
+#~ msgid "Compilation: "
+#~ msgstr "Kรครคnnรถs: "
-#~ msgid "no specific match"
-#~ msgstr "ei tarkkaa tไsmไystไ"
+#~ msgid " system menu file: \""
+#~ msgstr " jรคrjestelmรคvalikko: \""
-#~ msgid "Vim - Font Selector"
-#~ msgstr "Vim - fonttivalitsin"
+#~ msgid " defaults file: \""
+#~ msgstr " defaults-tiedosto: \""
-#~ msgid "Name:"
-#~ msgstr "Nimi:"
+#~ msgid "3rd user gvimrc file: \""
+#~ msgstr "3. kรคyttรคjรคn gvimrc: \""
-#~ msgid "Show size in Points"
-#~ msgstr "Nไytไ koko pisteinไ"
+#~ msgid "2nd user gvimrc file: \""
+#~ msgstr "2. kรคyttรคjรคn gvimrc: \""
-#~ msgid "Encoding:"
-#~ msgstr "Koodaus:"
+#~ msgid " user gvimrc file: \""
+#~ msgstr " kรคyttรคjรคn gvimrc: \""
-#~ msgid "Font:"
-#~ msgstr "Fontti:"
+#~ msgid " system gvimrc file: \""
+#~ msgstr " jรคrjestelmรคn gvimrc: \""
-#~ msgid "Style:"
-#~ msgstr "Tyyli:"
+#~ msgid " 2nd user exrc file: \""
+#~ msgstr " 2. kรคyttรคjรคn exrc: \""
-#~ msgid "Size:"
-#~ msgstr "Koko:"
+#~ msgid " user exrc file: \""
+#~ msgstr " kรคyttรคjรคn exrc: \""
-#~ msgid "E256: Hangul automata ERROR"
-#~ msgstr "E256: Hangu-automaattivirhe"
+#~ msgid " 3rd user vimrc file: \""
+#~ msgstr " 3. kรคyttรคjรคn vimrc: \""
-#~ msgid "E563: stat error"
-#~ msgstr "E563: stat-virhe"
+#~ msgid " 2nd user vimrc file: \""
+#~ msgstr " 2. kรคyttรคjรคn vimrc: \""
-#~ msgid "E625: cannot open cscope database: %s"
-#~ msgstr "E625: ei voi avata cscope-tietokantaa: %s"
+#~ msgid " user vimrc file: \""
+#~ msgstr " kรคyttรคjรคn vimrc: \""
-#~ msgid "E626: cannot get cscope database information"
-#~ msgstr "E626: ei voi hakea cscope-tietokannan tietoja"
+#~ msgid "with (classic) GUI."
+#~ msgstr "perinteisellรค GUIlla."
-#~ msgid "Lua library cannot be loaded."
-#~ msgstr "Luan kirjastoa ei voitu ladata."
+#~ msgid "with Cocoa GUI."
+#~ msgstr "Cocoa-GUIlla."
-#~ msgid "cannot save undo information"
-#~ msgstr "ei voitu tallentaa kumoustietoja"
+#~ msgid "with Carbon GUI."
+#~ msgstr "Carbon-GUIlla."
-#~ msgid ""
-#~ "E815: Sorry, this command is disabled, the MzScheme libraries could not "
-#~ "be loaded."
-#~ msgstr "E815: Sori, komento ei toimi, MzScheme-kirjastoa ei voitu ladata."
+#~ msgid "with GUI."
+#~ msgstr "GUIlla."
-#~ msgid "invalid expression"
-#~ msgstr "virheellinen ilmaus"
+#~ msgid "with Photon GUI."
+#~ msgstr "Photon-GUIlla."
-#~ msgid "expressions disabled at compile time"
-#~ msgstr "ilmaukset poistettu kไyt๖stไ kไไnn๖saikana"
+#~ msgid "with X11-Athena GUI."
+#~ msgstr "X11-Athena-GUIlla."
-#~ msgid "hidden option"
-#~ msgstr "piilotettu asetus"
+#~ msgid "with X11-neXtaw GUI."
+#~ msgstr "X11-neXtaw-GUIlla."
-#~ msgid "unknown option"
-#~ msgstr "tuntematon asetus"
+#~ msgid "with X11-Motif GUI."
+#~ msgstr "X11-Motif-GUIlla."
-#~ msgid "window index is out of range"
-#~ msgstr "ikkunan indeksi alueen ulkopuolella"
+#~ msgid "with GTK2 GUI."
+#~ msgstr "GTK2-GUIlla."
-#~ msgid "couldn't open buffer"
-#~ msgstr "ei voitu avata puskuria"
+#~ msgid "with GTK2-GNOME GUI."
+#~ msgstr "GTK2-Gnome-GUIlla."
-#~ msgid "cannot delete line"
-#~ msgstr "ei voitu poistaa riviไ"
+#~ msgid "with GTK3 GUI."
+#~ msgstr "GTK3-GUIlla."
-#~ msgid "cannot replace line"
-#~ msgstr "ei voitu korvata riviไ"
+#~ msgid "without GUI."
+#~ msgstr "ilman GUIta."
-#~ msgid "cannot insert line"
-#~ msgstr "ei voitu lisไtไ riviไ"
+#~ msgid ""
+#~ "\n"
+#~ "Tiny version "
+#~ msgstr ""
+#~ "\n"
+#~ "Tiny-versio "
-#~ msgid "string cannot contain newlines"
-#~ msgstr "merkkijono ei saa sisไltไไ rivinvaihtoja"
+#~ msgid ""
+#~ "\n"
+#~ "Small version "
+#~ msgstr ""
+#~ "\n"
+#~ "Small-versio "
-#~ msgid "Vim error: ~a"
-#~ msgstr "Vim-virhe: ~a"
+#~ msgid ""
+#~ "\n"
+#~ "Normal version "
+#~ msgstr ""
+#~ "\n"
+#~ "Normal-versio "
-#~ msgid "Vim error"
-#~ msgstr "Vim-virhe"
+#~ msgid ""
+#~ "\n"
+#~ "Big version "
+#~ msgstr ""
+#~ "\n"
+#~ "Big-version "
-#~ msgid "buffer is invalid"
-#~ msgstr "puskuri on virheellinen"
+#~ msgid ""
+#~ "\n"
+#~ "Huge version "
+#~ msgstr ""
+#~ "\n"
+#~ "Huge-versio "
-#~ msgid "window is invalid"
-#~ msgstr "ikkuna on virheellinen"
+#~ msgid "Modified by "
+#~ msgstr "Muokannut "
-#~ msgid "linenr out of range"
-#~ msgstr "rivinumero arvoalueen ulkopuolelta"
+#~ msgid ""
+#~ "\n"
+#~ "Included patches: "
+#~ msgstr ""
+#~ "\n"
+#~ "Pรคtsit: "
-#~ msgid "not allowed in the Vim sandbox"
-#~ msgstr "ei sallittu Vimin hiekkalaatikossa"
+#~ msgid ""
+#~ "\n"
+#~ "OpenVMS version"
+#~ msgstr ""
+#~ "\n"
+#~ "OpenVMS-version"
-#~ msgid "E836: This Vim cannot execute :python after using :py3"
+#~ msgid ""
+#~ "\n"
+#~ "MacOS version"
#~ msgstr ""
-#~ "E836: Python: Ei voi kไyttไไ komentoja :py ja :py3 samassa istunnossa"
+#~ "\n"
+#~ "MacOS-version"
-#~ msgid "E837: This Vim cannot execute :py3 after using :python"
+#~ msgid ""
+#~ "\n"
+#~ "MacOS X version"
#~ msgstr ""
-#~ "E837: Python: Ei voi kไyttไไ komentoja :py ja :py3 samassa istunnossa"
+#~ "\n"
+#~ "MacOS X-version"
#~ msgid ""
-#~ "E263: Sorry, this command is disabled, the Python library could not be "
-#~ "loaded."
+#~ "\n"
+#~ "MacOS X (unix) version"
#~ msgstr ""
-#~ "E263: Sori, komento ei toimi, Python-kirjaston lataaminen ei onnistunut."
+#~ "\n"
+#~ "MacOS X-version (unix)"
-#~ msgid "can't delete OutputObject attributes"
-#~ msgstr "ei voi poistaa OutputObject-attribuutteja"
+#~ msgid ""
+#~ "\n"
+#~ "MS-Windows 32-bit console version"
+#~ msgstr ""
+#~ "\n"
+#~ "MS-Windows 32-bittinen konsoliversio"
-#~ msgid "softspace must be an integer"
-#~ msgstr "softspacen pitไไ olla kokonaisluku"
+#~ msgid ""
+#~ "\n"
+#~ "MS-Windows 64-bit console version"
+#~ msgstr ""
+#~ "\n"
+#~ "MS-Windows 32-bittinen konsoliversio"
-#~ msgid "invalid attribute"
-#~ msgstr "virheellinen attribuutti"
+#~ msgid " with OLE support"
+#~ msgstr " OLE-tuella"
-#~ msgid "<buffer object (deleted) at %p>"
-#~ msgstr "<puskuriolio (poistettu) kohdassa %p>"
+#~ msgid " in Win32s mode"
+#~ msgstr " Win32s-tilassa"
-#~ msgid "E659: Cannot invoke Python recursively"
-#~ msgstr "E659: Pythonia ei voi kutsua rekursiivisesti"
+#~ msgid ""
+#~ "\n"
+#~ "MS-Windows 32-bit GUI version"
+#~ msgstr ""
+#~ "\n"
+#~ "MS-Windows 32-bittinen GUI-version"
-#~ msgid "E265: $_ must be an instance of String"
-#~ msgstr "E265: muuttujan $_ pitไไ olla Stringin instanssi"
+#~ msgid ""
+#~ "\n"
+#~ "MS-Windows 64-bit GUI version"
+#~ msgstr ""
+#~ "\n"
+#~ "MS-Windows 64-bittinen GUI-versio"
#~ msgid ""
-#~ "E266: Sorry, this command is disabled, the Ruby library could not be "
-#~ "loaded."
-#~ msgstr "E266: Sori, komento ei toimi, Ruby-kirjastoa ei voitu ladata."
+#~ "\n"
+#~ "MS-Windows 16/32-bit GUI version"
+#~ msgstr ""
+#~ "\n"
+#~ "MS-Windows 16- t. 32-bittinen GUI-versio"
-#~ msgid "E267: unexpected return"
-#~ msgstr "E267: odotuksenvastainen return"
+#~ msgid "E827: Undo file is encrypted: %s"
+#~ msgstr "E827: Kumoustiedosto on salattu: %s"
-#~ msgid "E268: unexpected next"
-#~ msgstr "E268: Odotuksenvastainen next"
+#~ msgid "E826: Undo file decryption failed: %s"
+#~ msgstr "E826: Kumoustiedoston purku epรคonnistui: %s"
-#~ msgid "E269: unexpected break"
-#~ msgstr "E269: Odotuksenvastainen break"
+#~ msgid "E832: Non-encrypted file has encrypted undo file: %s"
+#~ msgstr "E832: Salaamattomalla tiedostolla on salattu kumoustiedosto: %s"
-#~ msgid "E270: unexpected redo"
-#~ msgstr "E270: odotuksenvastainen redo"
+#~ msgid "No undo possible; continue anyway"
+#~ msgstr "Ei voi kumota, jatketaan silti"
-#~ msgid "E271: retry outside of rescue clause"
-#~ msgstr "E271: retry rescuen ulkopuolella"
+#~ msgid "Used CUT_BUFFER0 instead of empty selection"
+#~ msgstr "Kรคytettiin CUT_BUFFER0:aa tyhjรคn valinnan sijaan"
-#~ msgid "E272: unhandled exception"
-#~ msgstr "E272: kไsittelemไt๖n poikkeus"
+#~ msgid "new shell started\n"
+#~ msgstr "uusi kuori avattu\n"
-#~ msgid "E273: unknown longjmp status %d"
-#~ msgstr "E273: tuntematon longjmp-tila %d"
+#~ msgid "Cannot open $VIMRUNTIME/rgb.txt"
+#~ msgstr "Ei voida avata tiedostoa $VIMRUNTIME/rgb.txt"
-#~ msgid "Toggle implementation/definition"
-#~ msgstr "Vaihda toteutuksen ja mไไritelmไn vไlillไ"
+#~ msgid ""
+#~ "\n"
+#~ "--- Terminal keys ---"
+#~ msgstr ""
+#~ "\n"
+#~ "--- Terminaalinรคppรคimet ---"
-#~ msgid "Show base class of"
-#~ msgstr "Nไytไ kantaluokka kohteelle"
+#~ msgid "E437: terminal capability \"cm\" required"
+#~ msgstr "E437: terminaalilla pitรครค olla cm kyvyissรครคn"
-#~ msgid "Show overridden member function"
-#~ msgstr "Nไytไ korvattu jไsenfunktio"
+#~ msgid "E436: No \"%s\" entry in termcap"
+#~ msgstr "E436: %s ei lรถytynyt termcapista"
-#~ msgid "Retrieve from file"
-#~ msgstr "Jไljitไ tiedostosta"
+#~ msgid "E559: Terminal entry not found in termcap"
+#~ msgstr "E559: Terminaalia ei lรถytynyt termcapista"
-#~ msgid "Retrieve from project"
-#~ msgstr "Jไljitไ projektista"
+#~ msgid "E558: Terminal entry not found in terminfo"
+#~ msgstr "E558: Terminaalia ei lรถytynyt terminfosta"
-#~ msgid "Retrieve from all projects"
-#~ msgstr "Jไljitไ kaikista projekteista"
+#~ msgid "E557: Cannot open termcap file"
+#~ msgstr "E557: Ei voi avata termcap-tiedostoa"
-#~ msgid "Retrieve"
-#~ msgstr "Jไljitไ"
+#~ msgid "defaulting to '"
+#~ msgstr "oletusarvona "
-#~ msgid "Show source of"
-#~ msgstr "Nไytไ lไhdekoodi kohteelle"
+#~ msgid "' not known. Available builtin terminals are:"
+#~ msgstr " ei tunnettu. Tuetut terminaalit:"
-#~ msgid "Find symbol"
-#~ msgstr "Etsi symboli"
+#~ msgid "E430: Tag file path truncated for %s\n"
+#~ msgstr "E430: Tรคgitiedoston polku katkaistu kohdassa %s\n"
-#~ msgid "Browse class"
-#~ msgstr "Selaa luokkaa"
+#~ msgid "E422: terminal code too long: %s"
+#~ msgstr "E422: terminaalikoodi liian pitkรค: %s"
-#~ msgid "Show class in hierarchy"
-#~ msgstr "Nไytไ luokka hierarkiassa"
+#~ msgid "E845: Insufficient memory, word list will be incomplete"
+#~ msgstr "E845: Muisti ei riitรค, sanalista jรครค keskenerรคiseksi"
-#~ msgid "Show class in restricted hierarchy"
-#~ msgstr "Nไytไ luokka rajoitetussa hierarkiassa"
+#~ msgid "Conversion in %s not supported"
+#~ msgstr "Muutosta kohteessa %s ei tueta"
-#~ msgid "Xref refers to"
-#~ msgstr "Xref viittaa kohteeseen"
+#~ msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\""
+#~ msgstr "Varoitus: Ei lรถydetty sanalistaa %s_%s.spl tai %s_ascii.spl"
-#~ msgid "Xref referred by"
-#~ msgstr "Xref viitattu kohteesta"
+#~ msgid ""
+#~ "\n"
+#~ "# Last %sSearch Pattern:\n"
+#~ "~"
+#~ msgstr ""
+#~ "\n"
+#~ "# Edellinen %sHakulauseke:\n"
+#~ "~"
+
+#~ msgid "Substitute "
+#~ msgstr "Korvaa "
-#~ msgid "Xref has a"
-#~ msgstr "Xref sisไltไไ kohteen"
+#~ msgid "(NFA) COULD NOT OPEN %s !"
+#~ msgstr "(NFA) EI VOI AVATA KOHDETTA %s"
-#~ msgid "Xref used by"
-#~ msgstr "Xrefiไ kไyttไไ"
+#~ msgid ""
+#~ "Could not open temporary log file for writing, displaying on stderr ... "
+#~ msgstr ""
+#~ "Ei voitu avata vรคliaikaislokitiedosta kirjoittamista varten, joten "
+#~ "virheet nรคytetรครคn vakiovirhevirrassa. "
-#~ msgid "Show docu of"
-#~ msgstr "Nไytไ dokumentti kohteelle"
+#~ msgid "E878: (NFA) Could not allocate memory for branch traversal!"
+#~ msgstr "E878: (NFA) Ei voitu allokoida muistia polkujen lรคpikรคyntiin"
-#~ msgid "Generate docu for"
-#~ msgstr "Luo dokumentti kohteelle"
+#~ msgid "E876: (NFA regexp) Not enough space to store the whole NFA "
+#~ msgstr "E876: (NFA regexp) Tila ei riitรค NFA:n tallentamiseen"
#~ msgid ""
-#~ "Cannot connect to SNiFF+. Check environment (sniffemacs must be found in "
-#~ "$PATH).\n"
+#~ "E875: (NFA regexp) (While converting from postfix to NFA), too many "
+#~ "states left on stack"
#~ msgstr ""
-#~ "Ei voida yhdistไไ SNiFF+:aan. Tarkista ympไrist๖muuttujat (sniffemacsin "
-#~ "l๖ytyไ polkumuuttujasta $PATH).\n"
+#~ "E875: (NFA regexp) (Muunnettaessa postfixistรค NFA:ksi), liikaa tiloja "
+#~ "jรคljellรค pinossa"
-#~ msgid "E274: Sniff: Error during read. Disconnected"
-#~ msgstr "E274: Sniff: Virhe luettaessa, yhteys katkaistu"
+#~ msgid "E874: (NFA) Could not pop the stack !"
+#~ msgstr "E874: (NFA) Ei voida poistaa pinosta"
-#~ msgid "SNiFF+ is currently "
-#~ msgstr "SNiFF+ "
+#~ msgid "E873: (NFA regexp) proper termination error"
+#~ msgstr "E873: (NFA regexp) oikea lopetusvirhe"
-#~ msgid "not "
-#~ msgstr "ei ole "
+#~ msgid "E879: (NFA regexp) Too many \\z("
+#~ msgstr "E879: (NFA regexp) Liikaa merkkejรค \\z("
-#~ msgid "connected"
-#~ msgstr "yhdistetty"
+#~ msgid "E872: (NFA regexp) Too many '('"
+#~ msgstr "E872: (NFA regexp) Liian monta suljetta '('"
-#~ msgid "E275: Unknown SNiFF+ request: %s"
-#~ msgstr "E275: Tuntematon SNiFF+-pyynt๖: %s"
+#~ msgid "E871: (NFA regexp) Can't have a multi follow a multi !"
+#~ msgstr "E871: (NFA regexp) Multi ei voi seurata multia"
-#~ msgid "E276: Error connecting to SNiFF+"
-#~ msgstr "E276: Virhe yhdistettไessไ SNiFF+:aan"
+#~ msgid "E870: (NFA regexp) Error reading repetition limits"
+#~ msgstr "E870: (NFA regexp) Virhe luettaessa toiston mรครคriรค"
-#~ msgid "E278: SNiFF+ not connected"
-#~ msgstr "E278: SNiFF+ ei ole yhdistetty"
+#~ msgid "E869: (NFA) Unknown operator '\\@%c'"
+#~ msgstr "E869: (NFA) Tuntematon operaattori '\\@%c'"
-#~ msgid "E279: Not a SNiFF+ buffer"
-#~ msgstr "E279: Ei ole SNiFF+-puskuri"
+#~ msgid "E868: Error building NFA with equivalence class!"
+#~ msgstr "E868: Virhe NFA:n ekvivalenssiluokkia tekemisessรค"
-#~ msgid "Sniff: Error during write. Disconnected"
-#~ msgstr "Sniff: Virhe kirjoituksessa, yhteys katkaistu"
+#~ msgid "E867: (NFA) Unknown operator '\\%%%c'"
+#~ msgstr "E867: (NFA) Tuntematon operaattori '\\%%%c'"
-#~ msgid "invalid buffer number"
-#~ msgstr "virheellinen puskurinumero"
+#~ msgid "E867: (NFA) Unknown operator '\\z%c'"
+#~ msgstr "E867: (NFA) Tuntematon operaattori '\\z%c'"
-#~ msgid "not implemented yet"
-#~ msgstr "ei toteutettu"
+#~ msgid "E877: (NFA regexp) Invalid character class: %ld"
+#~ msgstr "E877: (NFA regexp) Virheellinen merkkiluokka: %ld"
-#~ msgid "cannot set line(s)"
-#~ msgstr "ei voi asettaa rivejไ"
+#~ msgid "E866: (NFA regexp) Misplaced %c"
+#~ msgstr "E866: (NFA-regexp) %c vรครคrรคssรค paikassa"
-#~ msgid "invalid mark name"
-#~ msgstr "virheellinen merkin nimi"
+#~ msgid "E865: (NFA) Regexp end encountered prematurely"
+#~ msgstr "E865: (NFA) Sรครคnnรถllisen ilmauksen ennenaikainen loppu"
-#~ msgid "mark not set"
-#~ msgstr "merkko ei ole asetettu"
+#~ msgid "Error file"
+#~ msgstr "Virhetiedosto"
-#~ msgid "row %d column %d"
-#~ msgstr "rivi %d sarake %d"
+#~ msgid "shell returned %d"
+#~ msgstr "kuori palautti arvon %d"
-#~ msgid "cannot insert/append line"
-#~ msgstr "rivin lisไys ei onnistu"
+#~ msgid "Vim Warning"
+#~ msgstr "Vim-varoitus"
-#~ msgid "line number out of range"
-#~ msgstr "rivinumero arvoalueen ulkopuolella"
+#~ msgid ""
+#~ "VIMRUN.EXE not found in your $PATH.\n"
+#~ "External commands will not pause after completion.\n"
+#~ "See :help win32-vimrun for more information."
+#~ msgstr ""
+#~ "VIMRUN.EXEรค ei lรถydy muuttujasta $PATH.\n"
+#~ "Ulkoiset komennot eivรคt pysรคhdy suorituksen lopussa.\n"
+#~ "Lisรคtietoja komennolla :help win32-vimrun"
-#~ msgid "unknown flag: "
-#~ msgstr "tuntematon asetus: "
+#~ msgid "E371: Command not found"
+#~ msgstr "E371: Komentoa ei lรถydy"
-#~ msgid "unknown vimOption"
-#~ msgstr "tuntematon vimOption"
+#~ msgid "shutdown"
+#~ msgstr "sammutus"
-#~ msgid "keyboard interrupt"
-#~ msgstr "nไppไimist๖keskeytys"
+#~ msgid "logoff"
+#~ msgstr "uloskirjautuminen"
-#~ msgid "vim error"
-#~ msgstr "vim-virhe"
+#~ msgid "close"
+#~ msgstr "sulkeminen"
-#~ msgid "cannot create buffer/window command: object is being deleted"
-#~ msgstr "ei voi luoda puskuri- tai ikkunakomentoa, olio on poistumassa"
+#~ msgid "Vim: Caught %s event\n"
+#~ msgstr "Vim: Napattiin %s\n"
+
+#~ msgid "Could not fix up function pointers to the DLL!"
+#~ msgstr "Ei voitu korjata funktio-osoittimia DLL:ssรค"
+
+#~ msgid "VIM Error"
+#~ msgstr "VIM-virhe"
+
+#~ msgid "Could not load vim32.dll!"
+#~ msgstr "Vim32.dll:รครค ei voitu ladata"
+
+#~ msgid "At line"
+#~ msgstr "Rivillรค"
+
+#~ msgid "XSMP SmcOpenConnection failed: %s"
+#~ msgstr "XSMP SmcOpenConnection epรคonnistui: %s"
+
+#~ msgid "XSMP ICE connection watch failed"
+#~ msgstr "XSMP:n ICE-yhteyden tarkkailu epรคonnistui"
+
+#~ msgid "XSMP opening connection"
+#~ msgstr "XSMP avaa yhteyttรค"
+
+#~ msgid "XSMP handling save-yourself request"
+#~ msgstr "XSMP kรคsittelee save-yourself-pyyntรถรค"
+
+#~ msgid "Opening the X display failed"
+#~ msgstr "X-nรคytรถn avaus epรคonnistui"
+
+#~ msgid "XSMP lost ICE connection"
+#~ msgstr "XSMP kadotti ICE-yhteyden"
#~ msgid ""
-#~ "cannot register callback command: buffer/window is already being deleted"
-#~ msgstr "callbackia ei voi rekister๖idไ: puskuri tai ikkuna on poistettu"
+#~ "\n"
+#~ "Command terminated\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Komento loppui\n"
#~ msgid ""
-#~ "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-"
-#~ "dev@vim.org"
+#~ "\n"
+#~ "Cannot execute shell "
#~ msgstr ""
-#~ "E280: kriittinen TCL-virhe: reflist hajalla? Ilmoita asiasta "
-#~ "postituslistalle vim-dev@vim.org"
+#~ "\n"
+#~ "Kuoren suoritus ei onnistu "
-#~ msgid "cannot register callback command: buffer/window reference not found"
+#~ msgid ""
+#~ "\n"
+#~ "Cannot fork\n"
#~ msgstr ""
-#~ "callbackia ei voi rekister๖idไ: puskurin tai ikkunan viitettไ ei l๖ydy"
+#~ "\n"
+#~ "Ei voi haarauttaa\n"
#~ msgid ""
-#~ "E571: Sorry, this command is disabled: the Tcl library could not be "
-#~ "loaded."
-#~ msgstr "E571: Sori, komento ei toimi, Tcl-kirjastoa ei voitu ladata."
+#~ "\n"
+#~ "Cannot create pipes\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Putkia ei voi tehdรค\n"
#~ msgid ""
-#~ "E281: TCL ERROR: exit code is not int!? Please report this to vim-dev@vim."
-#~ "org"
+#~ "\n"
+#~ "Cannot execute shell sh\n"
#~ msgstr ""
-#~ "E281: TCL-virhe: lopetuskoodi ei ole kokonaisluku? Ilmoita asiasta "
-#~ "postituslistalle vim-dev@vim.org"
+#~ "\n"
+#~ "Kuoren sh suoritus ei onnistu\n"
-#~ msgid "E572: exit code %d"
-#~ msgstr "E572: palautusarvo %d"
+# mikรค security context?
+#~ msgid "Could not get security context %s for %s. Removing it!"
+#~ msgstr "Ei saatu turvallisuuskontekstia %s kohteelle %s ja se poistetaan"
-#~ msgid "cannot get line"
-#~ msgstr "ei voida hakea riviไ"
+#~ msgid "Could not set security context %s for %s"
+#~ msgstr "Ei voitu asettaa turvallisuuskontekstia %s kohteelle %s"
-#~ msgid "Unable to register a command server name"
-#~ msgstr "Komentopalvelimen nimen rekister๖inti ei onnistu"
+#~ msgid "Opening the X display timed out"
+#~ msgstr "X-nรคytรถn avaus aikakatkaistiin"
-#~ msgid "E248: Failed to send command to the destination program"
-#~ msgstr "E248: Komennon lไhetys kohdeohjelmalle ei onnistu"
+#~ msgid "Testing the X display failed"
+#~ msgstr "X-nรคytรถn testaus epรคonnistui"
-#~ msgid "E573: Invalid server id used: %s"
-#~ msgstr "E573: Virheellinen palvelimen tunniste: %s"
+#~ msgid ""
+#~ "\n"
+#~ "Vim: Got X error\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Vim: X-virhe\n"
-#~ msgid "E251: VIM instance registry property is badly formed. Deleted!"
-#~ msgstr "E251: VIMin instanssin rekisteriarvo on virheellinen, poistettiin."
+#~ msgid "Opening the X display took %ld msec"
+#~ msgstr "X-nรคytรถn avaus vei %ld millisekuntia"
-#~ msgid "netbeans is not supported with this GUI\n"
-#~ msgstr "netbeans ei toimi tไssไ kไytt๖liittymไssไ\n"
+#~ msgid "E245: Illegal char '%c' in font name \"%s\""
+#~ msgstr "E245: Virheellinen merkki %c fontin nimessรค %s"
-#~ msgid "This Vim was not compiled with the diff feature."
-#~ msgstr "Tไhไn Vimiin ei ole kไไnnetty diff-toimintoja mukaan."
+#~ msgid "E244: Illegal quality name \"%s\" in font name \"%s\""
+#~ msgstr "E244: Virheellinen laatunimi %s fontin nimessรค %s"
-#~ msgid "'-nb' cannot be used: not enabled at compile time\n"
-#~ msgstr "-nb:tไ ei voi kไyttไไ, koska sitไ ei kไไnnetty mukaan\n"
+#~ msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
+#~ msgstr "E244: Virheellinen merkistรถn nimi %s fontin nimessรค %s"
-#~ msgid "Vim: Error: Failure to start gvim from NetBeans\n"
-#~ msgstr "Vim: Virhe: Gvimin kไynnistys NetBeansistไ ei onnistu\n"
+#~ msgid "Printing '%s'"
+#~ msgstr "Tulostetaan %s"
+
+#~ msgid "E238: Print error: %s"
+#~ msgstr "E238: Tulostinvirhe: %s"
+
+#~ msgid "E613: Unknown printer font: %s"
+#~ msgstr "E613: Tuntematon tulostimen fontti: %s"
+
+#~ msgid "to %s on %s"
+#~ msgstr "tulostimelle %s kohteessa %s"
+
+#~ msgid "E237: Printer selection failed"
+#~ msgstr "E237: Tulostimen valinta epรคonnistui"
+
+#~ msgid "'columns' is not 80, cannot execute external commands"
+#~ msgstr "columns ei ole 80, ei voi suorittaa ulkoista komentoa"
+
+#~ msgid "I/O ERROR"
+#~ msgstr "IO-virhe"
+
+#~ msgid "ANCHOR_BUF_SIZE too small."
+#~ msgstr "ANCHOR_BUF_SIZE liian pieni."
+
+#~ msgid " returned\n"
+#~ msgstr " palautti\n"
+
+#~ msgid "shell "
+#~ msgstr "kuori "
+
+#~ msgid "Cannot execute "
+#~ msgstr "Ei voi suorittaa "
+
+#~ msgid "E360: Cannot execute shell with -f option"
+#~ msgstr "E360: Kuorta ei voi avata asetuksella -f"
+
+#~ msgid "mch_get_shellsize: not a console??\n"
+#~ msgstr "mch_get_shellsize: ei ole konsoli?\n"
+
+#~ msgid "cannot change console mode ?!\n"
+#~ msgstr "ei voi vaihtaa konsolitilaa?\n"
+
+#~ msgid "Vim exiting with %d\n"
+#~ msgstr "Vim sulkeutuu koodilla %d\n"
+
+#~ msgid "Cannot create "
+#~ msgstr "Ei voi luoda "
+
+#~ msgid "Cannot open NIL:\n"
+#~ msgstr "Ei voi avata NILiรค:\n"
+
+#~ msgid "Need %s version %ld\n"
+#~ msgstr "Tarvitaan %s versio %ld\n"
+
+#~ msgid "Need Amigados version 2.04 or later\n"
+#~ msgstr "Amigados 2.04 tai uudempi tarvitaan\n"
+
+#~ msgid "VIM: Can't open window!\n"
+#~ msgstr "VIM: Ei voi avata ikkunaa\n"
+
+#~ msgid "cannot open "
+#~ msgstr "ei voi avata "
+
+#~ msgid "E538: No mouse support"
+#~ msgstr "E538: Hiirtรค ei tueta"
+
+#~ msgid "E533: can't select wide font"
+#~ msgstr "E533: Leveรคn fontin valinta ei onnistu"
+
+#~ msgid "E598: Invalid fontset"
+#~ msgstr "E598: Viallinen fontset"
+
+#~ msgid "E597: can't select fontset"
+#~ msgstr "E597: Fontsetin valinta ei onnistu"
+
+#~ msgid "E596: Invalid font(s)"
+#~ msgstr "E596: Viallisia fontteja"
+
+#~ msgid "E617: Cannot be changed in the GTK+ 2 GUI"
+#~ msgstr "E617: Ei voi muuttaa GTK+2-GUIssa"
+
+#~ msgid "E531: Use \":gui\" to start the GUI"
+#~ msgstr "E531: Kรคytรค komentoa :gui GUIn kรคynnistรคmiseen"
+
+#~ msgid "E530: Cannot change term in GUI"
+#~ msgstr "E530: Ei voi vaihtaa termiรค GUIssa"
+
+#~ msgid "E522: Not found in termcap"
+#~ msgstr "E522: Puuttuu termcapista"
+
+#~ msgid "Thanks for flying Vim"
+#~ msgstr "Kiitos ettรค ajoit Vimiรค"
+
+#~ msgid "%<%f%h%m%=Page %N"
+#~ msgstr "%<%f%h%m%=Sivu %N"
#~ msgid ""
#~ "\n"
-#~ "Where case is ignored prepend / to make flag upper case"
+#~ "# Registers:\n"
#~ msgstr ""
#~ "\n"
-#~ "Jos aakkoslaji on ohitettu, lisไไ alkuun / tehdไksesi asetuksesta "
-#~ "suuraakkosia"
+#~ "# Rekisterit:\n"
-#~ msgid "-register\t\tRegister this gvim for OLE"
-#~ msgstr "-register\t\trekister๖i gvim OLEa varten"
+#~ msgid "Illegal register name"
+#~ msgstr "Virheellinen rekisterin nimi"
-#~ msgid "-unregister\t\tUnregister gvim for OLE"
-#~ msgstr "-unregister\t\tPoista gvim OLE-rekisteristไ"
+#~ msgid "freeing %ld lines"
+#~ msgstr "vapautetaan %ld riviรค"
-#~ msgid "-g\t\t\tRun using GUI (like \"gvim\")"
-#~ msgstr "-g\t\t\tAvaa GUI (kuten gvimillไ)"
+#~ msgid "cannot yank; delete anyway"
+#~ msgstr "Ei voi kopioida; poista joka tapauksessa"
-#~ msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
-#~ msgstr "-f tai --nofork\tEdustalle: ฤlไ haarauta GUIn kไynnistyksessไ"
+#~ msgid "E775: Eval feature not available"
+#~ msgstr "E775: Eval ei ole kรคytettรคvissรค"
-#~ msgid "-f\t\t\tDon't use newcli to open window"
-#~ msgstr "-f\t\t\tฤlไ kไytไ newcli:tไ ikkunan avaamiseen"
+#~ msgid "E505: %s is read-only (add ! to override)"
+#~ msgstr "E505: %s on kirjoitussuojattu (lisรครค komentoon ! ohittaaksesi)"
-#~ msgid "-dev <device>\t\tUse <device> for I/O"
-#~ msgstr "-dev <laite>\t\tKไytไ <laitetta> IO:hon"
+#~ msgid "E511: netbeans already connected"
+#~ msgstr "E511: netbeans on yhdistetty jo"
-#~ msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
-#~ msgstr "-U <gvimrc>\t\tKไytไ <gvimrc>-tiedostoa .gvimrc:iden sijasta"
+#~ msgid "E838: netbeans is not supported with this GUI"
+#~ msgstr "E838: netbeans ei toimi tรคssรค kรคyttรถliittymรคssรค"
-#~ msgid "-x\t\t\tEdit encrypted files"
-#~ msgstr "-x\t\t\tMuokkaa salattua tiedostoa"
+#~ msgid "E658: NetBeans connection lost for buffer %ld"
+#~ msgstr "E658: NetBeans-yhteys katkesi puskurille %ld"
-#~ msgid "-display <display>\tConnect vim to this particular X-server"
-#~ msgstr "-display <nไytt๖>\tYhdistไ vim tiettyyn X-palvelimeen"
+#~ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
+#~ msgstr "E668: Vรครคrรค avaustila NetBeans-yhteyden infotiedostolle: %s"
-#~ msgid "-X\t\t\tDo not connect to X server"
-#~ msgstr "-X\t\t\tฤlไ yhdistไ X-palvelimeen"
+#~ msgid "E547: Illegal mouseshape"
+#~ msgstr "E547: Virheellinen hiiren muoto"
-#~ msgid "--remote <files>\tEdit <files> in a Vim server if possible"
-#~ msgstr ""
-#~ "--remote <tiedostoja>\tMuokkaa <tiedostoja> Vim-palvelimessa, jos "
-#~ "mahdollista"
+#~ msgid "E341: Internal error: lalloc(%ld, )"
+#~ msgstr "E341: Sisรคinen virhe: lalloc(%ld, )"
-#~ msgid "--remote-silent <files> Same, don't complain if there is no server"
-#~ msgstr ""
-#~ "--remote-silent <tiedostoja>\tSama, mutta ไlไ ilmoita puuttuvasta "
-#~ "palvelimesta"
+#~ msgid "E340: Line is becoming too long"
+#~ msgstr "E340: Rivistรค tulee liian pitkรค"
#~ msgid ""
-#~ "--remote-wait <files> As --remote but wait for files to have been edited"
+#~ "[calls] total re/malloc()'s %lu, total free()'s %lu\n"
+#~ "\n"
#~ msgstr ""
-#~ "--remote-wait <tiedostoja> kuten --remote, mutta odota tiedostojen "
-#~ "muokkaamista"
+#~ "[kutsut] yht. re/malloc() %lu, yht. free() %lu\n"
+#~ "\n"
#~ msgid ""
-#~ "--remote-wait-silent <files> Same, don't complain if there is no server"
+#~ "\n"
+#~ "[bytes] total alloc-freed %lu-%lu, in use %lu, peak use %lu\n"
#~ msgstr ""
-#~ "--remote-wait-silent <tiedostoja> sama, mutta ไlไ ilmoita puuttuvasta "
-#~ "palvelimesta"
+#~ "\n"
+#~ "[tavua] yht. alloc-free %lu-%lu, kรคytรถssรค %lu, kรคyttรถhuippu %lu\n"
-#~ msgid ""
-#~ "--remote-tab[-wait][-silent] <files> As --remote but use tab page per "
-#~ "file"
-#~ msgstr ""
-#~ "--remote-tab[-wait][-silent] <tiedostoja> kuten --remote, mutta avaa "
-#~ "vไlilehti joka tiedostolle"
+#~ msgid "ERROR: "
+#~ msgstr "VIRHE: "
-#~ msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
-#~ msgstr ""
-#~ "--remote-send <nไppไimiไ>\tLไhetไ <nไppไimiไ> painalluksina Vimille ja "
-#~ "lopeta"
+#~ msgid "E338: Sorry, no file browser in console mode"
+#~ msgstr "E338: tiedostonselain puuttuu konsolitilasta"
-#~ msgid ""
-#~ "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
-#~ msgstr ""
-#~ "--remote-expr <ilmaus>\tKไsittele <ilmaus> Vim-palvelimella ja tulosta "
-#~ "tulos"
+#~ msgid "Open File dialog"
+#~ msgstr "Avausikkuna"
-#~ msgid "--serverlist\t\tList available Vim server names and exit"
-#~ msgstr "--serverlist\t\tLuettele Vim-palvelinten nimet ja lopeta"
+#~ msgid "Save File dialog"
+#~ msgstr "Tallennusikkuna"
-#~ msgid "--servername <name>\tSend to/become the Vim server <name>"
-#~ msgstr "--servername <nimi>\tLไhetไ Vim-palvelimelle <nimi> tai luo se"
+#~ msgid "Select Directory dialog"
+#~ msgstr "Hakemiston valintaikkuna"
+
+#~ msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
+#~ msgstr "Kรครคnnรถksen yllรคpitรคjรค: Flammie Pirinen <flammie@iki.fi>"
+
+#~ msgid "E337: Menu not found - check menu names"
+#~ msgstr "E337: Valikkoa ei lรถytynyt - tarkista valikkojen nimet"
+
+#~ msgid "E336: Menu path must lead to a sub-menu"
+#~ msgstr "E336: Valikkopolun pitรครค johtaa alivalikkoon"
+
+#~ msgid "Tear off this menu"
+#~ msgstr "Repรคise valikko irti"
+
+#~ msgid "Swap file already exists!"
+#~ msgstr "Swap-tiedosto on jo olemassa"
#~ msgid ""
#~ "\n"
-#~ "Arguments recognised by gvim (Motif version):\n"
+#~ " [not usable with this version of Vim]"
#~ msgstr ""
#~ "\n"
-#~ "Gvimin (Motif-version) tuntemat argumentit:\n"
+#~ " [ei toimi tรคmรคn Vim-version kanssa]"
+
+#~ msgid "Using crypt key from swap file for the text file.\n"
+#~ msgstr "Kรคytetรครคn swรคpin salausavainta tekstitiedostolle\n"
#~ msgid ""
#~ "\n"
-#~ "Arguments recognised by gvim (neXtaw version):\n"
+#~ "to use the same key for text file and swap file"
#~ msgstr ""
#~ "\n"
-#~ "Gvimin (neXtaw-version) tuntemat argumentit:\n"
+#~ "kรคyttรครคksesi samaa avainta teksti- ja swรคppitiedostoille"
#~ msgid ""
#~ "\n"
-#~ "Arguments recognised by gvim (Athena version):\n"
+#~ "If you wrote the text file after changing the crypt key press enter"
#~ msgstr ""
#~ "\n"
-#~ "Gvimin (Athena-version) tuntemat argumentit:\n"
+#~ "Jos kirjoitit tekstitiedoston salausavaimen vaihdon jรคlkeen paina enteriรค"
-#~ msgid "-display <display>\tRun vim on <display>"
-#~ msgstr "-display <nไytt๖>\tSuorita vim <nไyt๖ssไ>"
+#~ msgid ""
+#~ "\n"
+#~ "enter the new crypt key."
+#~ msgstr ""
+#~ "\n"
+#~ "anna uusi salausavain."
-#~ msgid "-iconic\t\tStart vim iconified"
-#~ msgstr "-iconic\t\tKไynnistไ pienennettynไ"
+#~ msgid ""
+#~ "\n"
+#~ "If you entered a new crypt key but did not write the text file,"
+#~ msgstr ""
+#~ "\n"
+#~ "Jos kรคytit uutta salausavainta muttet kirjoittanut tekstitiedostoa,"
-#~ msgid "-background <color>\tUse <color> for the background (also: -bg)"
-#~ msgstr "-background <vไri>\tKไytไ <vไriไ> taustavไrinไ (my๖s: -bg)"
+#~ msgid "Swap file is encrypted: \"%s\""
+#~ msgstr "Swap-tiedosto on salattu: %s"
-#~ msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
-#~ msgstr "-foreground <vไri>\tKไytไ <vไriไ> tekstin vไrinไ (my๖s: -fg)"
+#~ msgid ""
+#~ "E833: %s is encrypted and this version of Vim does not support encryption"
+#~ msgstr "E833: %s on salattu eikรค tรคmรค Vim tue salausta"
-#~ msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
-#~ msgstr "-font <fontti>\t\tKไytไ <fonttia> tekstissไ (my๖s: -fn)"
+#~ msgid "E843: Error while updating swap file crypt"
+#~ msgstr "E843: Virhe pรคivitettรคessรค swapin kryptausta"
-#~ msgid "-boldfont <font>\tUse <font> for bold text"
-#~ msgstr "-boldfont <fontti>\tKไytไ <fonttia> lihavoidussa tekstissไ"
+#~ msgid "E289: input method doesn't support my preedit type"
+#~ msgstr "E289: syรถtemetodi ei tue tรคtรค preedit-tyyppiรค"
-#~ msgid "-italicfont <font>\tUse <font> for italic text"
-#~ msgstr "-italicfont <fontti>\tKไytไ <fonttia> kursivoidussa tekstissไ"
+#~ msgid "E288: input method doesn't support any style"
+#~ msgstr "E288: syรถtemetodi ei tue tyylejรค"
-#~ msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
+#~ msgid "E287: Warning: Could not set destroy callback to IM"
#~ msgstr ""
-#~ "-geometry <geom>\tKไytไ mittoja <geom> ikkunan asetteluun (my๖s: -geom)"
+#~ "E287: Varoitus: Ei voitu asettaa destroy-kutsua syรถtemetodipalvelimelle"
-#~ msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
-#~ msgstr "-borderwidt <leveys>\tKไytไ <leveyttไ> reunuksissa (my๖s: -bw) "
-
-#~ msgid ""
-#~ "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
-#~ msgstr ""
-#~ "-scrollbarwidth <leveys> Kไytไ <leveyttไ> vierityspalkissa (my๖s: -sw)"
+#~ msgid "E286: Failed to open input method"
+#~ msgstr "E286: Syรถtemetodin avaus ei onnistu"
-#~ msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
-#~ msgstr "-menuheight <korkeus>\tKไytไ <korkeutta> valikossa (my๖s: -mh)"
+#~ msgid "E285: Failed to create input context"
+#~ msgstr "E285: Syรถtekontekstin luonti ei onnistu"
-#~ msgid "-reverse\t\tUse reverse video (also: -rv)"
-#~ msgstr "-reverse\t\tKไytไ kไไnteisvไrejไ (my๖s: -rv) "
+#~ msgid "E284: Cannot set IC values"
+#~ msgstr "E284: Ei voi asettaa IC-arvoja"
-#~ msgid "+reverse\t\tDon't use reverse video (also: +rv)"
-#~ msgstr "+reverse\t\tฤlไ kไytไ kไไnteisvไrejไ (my๖s: +rv)"
+#~ msgid "E543: Not a valid codepage"
+#~ msgstr "E543: Koodisivu ei ole kรคypรค"
-#~ msgid "-xrm <resource>\tSet the specified resource"
-#~ msgstr "-xrm <resurssi>\tAseta resurssi"
+#~ msgid "Missing '>'"
+#~ msgstr "> puuttuu"
#~ msgid ""
#~ "\n"
-#~ "Arguments recognised by gvim (RISC OS version):\n"
+#~ "# History of marks within files (newest to oldest):\n"
#~ msgstr ""
#~ "\n"
-#~ "Gvimin (RISC OS -version) tuntemat argumentit:\n"
-
-#~ msgid "--columns <number>\tInitial width of window in columns"
-#~ msgstr "--columns <luku>\tIkkunan alkuleveys sarakkeina"
+#~ "# Tiedostojen merkkien historia (uusimmasta vanhimpaan):\n"
-#~ msgid "--rows <number>\tInitial height of window in rows"
-#~ msgstr "--rows <luku>\tIkkunan alkukorkeus riveinไ"
+#~ msgid ""
+#~ "\n"
+#~ "# Jumplist (newest first):\n"
+#~ msgstr ""
+#~ "\n"
+#~ "# Hyppylista (uusin ensiksi):\n"
#~ msgid ""
#~ "\n"
-#~ "Arguments recognised by gvim (GTK+ version):\n"
+#~ "# File marks:\n"
#~ msgstr ""
#~ "\n"
-#~ "Gvimin (GTK+-version) tuntemat argumentit:\n"
+#~ "# Tiedoston merkit:\n"
-#~ msgid "-display <display>\tRun vim on <display> (also: --display)"
-#~ msgstr "-display <nไytt๖>\tSuorita vim nไyt๖llไ <nไytt๖> (my๖s: --display)"
+#~ msgid ": Send expression failed.\n"
+#~ msgstr ": Ilmauksen lรคhetys epรคonnistui.\n"
-# X-ikkunointijไrjestelmไssไ saman sovelluksen saman luokan ikkunat
-# tunnistetaan rooliresursseista
-#~ msgid "--role <role>\tSet a unique role to identify the main window"
-#~ msgstr ""
-#~ "--role <rooli>\tAseta pไไikkunalle ainutlaatuinen rooli tunnisteeksi"
+#~ msgid "No display: Send expression failed.\n"
+#~ msgstr "Ei nรคyttรถรค: Ilmauksen lรคhetys epรคonnistui.\n"
-#~ msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
-#~ msgstr "--socketid <xid>\tAvaa Vim annettuun GTK-olioon "
+#~ msgid "%d of %d edited"
+#~ msgstr "%d/%d muokattu"
-#~ msgid "-P <parent title>\tOpen Vim inside parent application"
-#~ msgstr "-P <otsikko>\tAvaa Vim isไntไohjelman sisไไn"
+#~ msgid ": Send failed. Trying to execute locally\n"
+#~ msgstr ": Lรคhetys epรคonnistui. Yritetรครคn suorittaa paikallisena\n"
+
+#~ msgid ": Send failed.\n"
+#~ msgstr ": Lรคhetys epรคonnistui.\n"
+
+#~ msgid "No display"
+#~ msgstr "Ei nรคyttรถรค"
#~ msgid "--windowid <HWND>\tOpen Vim inside another win32 widget"
#~ msgstr "--windowid <HWND>\tAvaa Vim annettuun win32-olioon "
-#~ msgid "No display"
-#~ msgstr "Ei nไytt๖ไ"
+#~ msgid "-P <parent title>\tOpen Vim inside parent application"
+#~ msgstr "-P <otsikko>\tAvaa Vim isรคntรคohjelman sisรครคn"
-#~ msgid ": Send failed.\n"
-#~ msgstr ": Lไhetys epไonnistui.\n"
+#~ msgid "--echo-wid\t\tMake gvim echo the Window ID on stdout"
+#~ msgstr "--echo-wid\t\tTulosta gvimin Window ID vakiotulosteeseen"
-#~ msgid ": Send failed. Trying to execute locally\n"
-#~ msgstr ": Lไhetys epไonnistui. Yritetไไn suorittaa paikallisena\n"
+#~ msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
+#~ msgstr "--socketid <xid>\tAvaa Vim annettuun GTK-olioon "
-#~ msgid "%d of %d edited"
-#~ msgstr "%d/%d muokattu"
+# X-ikkunointijรคrjestelmรคssรค saman sovelluksen saman luokan ikkunat
+# tunnistetaan rooliresursseista
+#~ msgid "--role <role>\tSet a unique role to identify the main window"
+#~ msgstr ""
+#~ "--role <rooli>\tAseta pรครคikkunalle ainutlaatuinen rooli tunnisteeksi"
-#~ msgid "No display: Send expression failed.\n"
-#~ msgstr "Ei nไytt๖ไ: Ilmauksen lไhetys epไonnistui.\n"
+#~ msgid "-display <display>\tRun vim on <display> (also: --display)"
+#~ msgstr "-display <nรคyttรถ>\tSuorita vim nรคytรถllรค <nรคyttรถ> (myรถs: --display)"
-#~ msgid ": Send expression failed.\n"
-#~ msgstr ": Ilmauksen lไhetys epไonnistui.\n"
+#~ msgid ""
+#~ "\n"
+#~ "Arguments recognised by gvim (GTK+ version):\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Gvimin (GTK+-version) tuntemat argumentit:\n"
-#~ msgid "E543: Not a valid codepage"
-#~ msgstr "E543: Koodisivu ei ole kไypไ"
+#~ msgid "-xrm <resource>\tSet the specified resource"
+#~ msgstr "-xrm <resurssi>\tAseta resurssi"
-#~ msgid "E285: Failed to create input context"
-#~ msgstr "E285: Sy๖tekontekstin luonti ei onnistu"
+#~ msgid "+reverse\t\tDon't use reverse video (also: +rv)"
+#~ msgstr "+reverse\t\tร„lรค kรคytรค kรครคnteisvรคrejรค (myรถs: +rv)"
-#~ msgid "E286: Failed to open input method"
-#~ msgstr "E286: Sy๖temetodin avaus ei onnistu"
+#~ msgid "-reverse\t\tUse reverse video (also: -rv)"
+#~ msgstr "-reverse\t\tKรคytรค kรครคnteisvรคrejรค (myรถs: -rv) "
-#~ msgid "E287: Warning: Could not set destroy callback to IM"
+#~ msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
+#~ msgstr "-menuheight <korkeus>\tKรคytรค <korkeutta> valikossa (myรถs: -mh)"
+
+#~ msgid ""
+#~ "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
#~ msgstr ""
-#~ "E287: Varoitus: Ei voitu asettaa destroy-kutsua sy๖temetodipalvelimelle"
+#~ "-scrollbarwidth <leveys> Kรคytรค <leveyttรค> vierityspalkissa (myรถs: -sw)"
-#~ msgid "E288: input method doesn't support any style"
-#~ msgstr "E288: sy๖temetodi ei tue tyylejไ"
+#~ msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
+#~ msgstr "-borderwidt <leveys>\tKรคytรค <leveyttรค> reunuksissa (myรถs: -bw) "
-#~ msgid "E289: input method doesn't support my preedit type"
-#~ msgstr "E289: sy๖temetodi ei tue tไtไ preedit-tyyppiไ"
+#~ msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
+#~ msgstr ""
+#~ "-geometry <geom>\tKรคytรค mittoja <geom> ikkunan asetteluun (myรถs: -geom)"
-#~ msgid ""
-#~ "E833: %s is encrypted and this version of Vim does not support encryption"
-#~ msgstr "E833: %s on salattu eikไ tไmไ Vim tue salausta"
+#~ msgid "-italicfont <font>\tUse <font> for italic text"
+#~ msgstr "-italicfont <fontti>\tKรคytรค <fonttia> kursivoidussa tekstissรค"
-#~ msgid "Swap file is encrypted: \"%s\""
-#~ msgstr "Swap-tiedosto on salattu: %s"
+#~ msgid "-boldfont <font>\tUse <font> for bold text"
+#~ msgstr "-boldfont <fontti>\tKรคytรค <fonttia> lihavoidussa tekstissรค"
+
+#~ msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
+#~ msgstr "-font <fontti>\t\tKรคytรค <fonttia> tekstissรค (myรถs: -fn)"
+
+#~ msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
+#~ msgstr "-foreground <vรคri>\tKรคytรค <vรคriรค> tekstin vรคrinรค (myรถs: -fg)"
+
+#~ msgid "-background <color>\tUse <color> for the background (also: -bg)"
+#~ msgstr "-background <vรคri>\tKรคytรค <vรคriรค> taustavรคrinรค (myรถs: -bg)"
+
+#~ msgid "-iconic\t\tStart vim iconified"
+#~ msgstr "-iconic\t\tKรคynnistรค pienennettynรค"
+
+#~ msgid "-display <display>\tRun vim on <display>"
+#~ msgstr "-display <nรคyttรถ>\tSuorita vim <nรคytรถssรค>"
#~ msgid ""
#~ "\n"
-#~ "If you entered a new crypt key but did not write the text file,"
+#~ "Arguments recognised by gvim (Athena version):\n"
#~ msgstr ""
#~ "\n"
-#~ "Jos kไytit uutta salausavainta muttet kirjoittanut tekstitiedostoa,"
+#~ "Gvimin (Athena-version) tuntemat argumentit:\n"
#~ msgid ""
#~ "\n"
-#~ "enter the new crypt key."
+#~ "Arguments recognised by gvim (neXtaw version):\n"
#~ msgstr ""
#~ "\n"
-#~ "anna uusi salausavain."
+#~ "Gvimin (neXtaw-version) tuntemat argumentit:\n"
#~ msgid ""
#~ "\n"
-#~ "If you wrote the text file after changing the crypt key press enter"
+#~ "Arguments recognised by gvim (Motif version):\n"
#~ msgstr ""
#~ "\n"
-#~ "Jos kirjoitit tekstitiedoston salausavaimen vaihdon jไlkeen paina enteriไ"
+#~ "Gvimin (Motif-version) tuntemat argumentit:\n"
+
+#~ msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
+#~ msgstr "-i <viminfo>\t\tKรคytรค <viminfo>-tiedostoa .viminfon sijaan"
+
+#~ msgid "--servername <name>\tSend to/become the Vim server <name>"
+#~ msgstr "--servername <nimi>\tLรคhetรค Vim-palvelimelle <nimi> tai luo se"
+
+#~ msgid "--serverlist\t\tList available Vim server names and exit"
+#~ msgstr "--serverlist\t\tLuettele Vim-palvelinten nimet ja lopeta"
#~ msgid ""
-#~ "\n"
-#~ "to use the same key for text file and swap file"
+#~ "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
#~ msgstr ""
-#~ "\n"
-#~ "kไyttไไksesi samaa avainta teksti- ja swไppitiedostoille"
+#~ "--remote-expr <ilmaus>\tKรคsittele <ilmaus> Vim-palvelimella ja tulosta "
+#~ "tulos"
-#~ msgid "Using crypt key from swap file for the text file.\n"
-#~ msgstr "Kไytetไไn swไpin salausavainta tekstitiedostolle\n"
+#~ msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
+#~ msgstr ""
+#~ "--remote-send <nรคppรคimiรค>\tLรคhetรค <nรคppรคimiรค> painalluksina Vimille ja "
+#~ "lopeta"
#~ msgid ""
-#~ "\n"
-#~ " [not usable with this version of Vim]"
+#~ "--remote-tab[-wait][-silent] <files> As --remote but use tab page per "
+#~ "file"
#~ msgstr ""
-#~ "\n"
-#~ " [ei toimi tไmไn Vim-version kanssa]"
+#~ "--remote-tab[-wait][-silent] <tiedostoja> kuten --remote, mutta avaa "
+#~ "vรคlilehti joka tiedostolle"
-#~ msgid "Tear off this menu"
-#~ msgstr "Repไise valikko irti"
+#~ msgid ""
+#~ "--remote-wait-silent <files> Same, don't complain if there is no server"
+#~ msgstr ""
+#~ "--remote-wait-silent <tiedostoja> sama, mutta รคlรค ilmoita puuttuvasta "
+#~ "palvelimesta"
-#~ msgid "Select Directory dialog"
-#~ msgstr "Hakemiston valintaikkuna"
+#~ msgid ""
+#~ "--remote-wait <files> As --remote but wait for files to have been edited"
+#~ msgstr ""
+#~ "--remote-wait <tiedostoja> kuten --remote, mutta odota tiedostojen "
+#~ "muokkaamista"
-#~ msgid "Save File dialog"
-#~ msgstr "Tallennusikkuna"
+#~ msgid "--remote-silent <files> Same, don't complain if there is no server"
+#~ msgstr ""
+#~ "--remote-silent <tiedostoja>\tSama, mutta รคlรค ilmoita puuttuvasta "
+#~ "palvelimesta"
-#~ msgid "Open File dialog"
-#~ msgstr "Avausikkuna"
+#~ msgid "--remote <files>\tEdit <files> in a Vim server if possible"
+#~ msgstr ""
+#~ "--remote <tiedostoja>\tMuokkaa <tiedostoja> Vim-palvelimessa, jos "
+#~ "mahdollista"
-#~ msgid "E338: Sorry, no file browser in console mode"
-#~ msgstr "E338: Sori, tiedostonselain puuttuu konsolitilasta"
+#~ msgid "-X\t\t\tDo not connect to X server"
+#~ msgstr "-X\t\t\tร„lรค yhdistรค X-palvelimeen"
-#~ msgid "Vim: preserving files...\n"
-#~ msgstr "Vim: sไไstetไไn tiedostoja...\n"
+#~ msgid "-display <display>\tConnect vim to this particular X-server"
+#~ msgstr "-display <nรคyttรถ>\tYhdistรค vim tiettyyn X-palvelimeen"
-#~ msgid "Vim: Finished.\n"
-#~ msgstr "Vim: Valmis.\n"
+#~ msgid "-x\t\t\tEdit encrypted files"
+#~ msgstr "-x\t\t\tMuokkaa salattua tiedostoa"
-#~ msgid "ERROR: "
-#~ msgstr "VIRHE: "
+#~ msgid "+\t\t\tStart at end of file"
+#~ msgstr "+\t\t\tAloita tiedoston lopusta"
-#~ msgid ""
-#~ "\n"
-#~ "[bytes] total alloc-freed %<PRIu64>-%<PRIu64>, in use %<PRIu64>, peak use "
-#~ "%<PRIu64>\n"
-#~ msgstr ""
-#~ "\n"
-#~ "[tavua] yht. alloc-free %<PRIu64>-%<PRIu64>, kไyt๖ssไ %<PRIu64>, "
-#~ "kไytt๖huippu %<PRIu64>\n"
+#~ msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
+#~ msgstr "-U <gvimrc>\t\tKรคytรค <gvimrc>-tiedostoa .gvimrc:iden sijasta"
-#~ msgid ""
-#~ "[calls] total re/malloc()'s %<PRIu64>, total free()'s %<PRIu64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "[kutsut] yht. re/malloc() %<PRIu64>, yht. free() %<PRIu64>\n"
-#~ "\n"
+#~ msgid "--not-a-term\t\tSkip warning for input/output not being a terminal"
+#~ msgstr "--not-a-term\t\tOhita varoitus siitรค ettรค i/o ei ole terminaali"
-#~ msgid "E340: Line is becoming too long"
-#~ msgstr "E340: Rivistไ tulee liian pitkไ"
+#~ msgid "-T <terminal>\tSet terminal type to <terminal>"
+#~ msgstr "-T <terminaali>\tAseta terminaalin tyypiksi <terminaali>"
-#~ msgid "E341: Internal error: lalloc(%<PRId64>, )"
-#~ msgstr "E341: Sisไinen virhe: lalloc(%<PRId64>, )"
+#~ msgid "-F\t\t\tStart in Farsi mode"
+#~ msgstr "-F\t\t\tkรคynnistรค farsi-tilassa"
-#~ msgid "E547: Illegal mouseshape"
-#~ msgstr "E547: Virheellinen hiiren muoto"
+#~ msgid "-H\t\t\tStart in Hebrew mode"
+#~ msgstr "-H\t\t\tkรคynnistรค heprea-tilassa"
-#~ msgid "Enter encryption key: "
-#~ msgstr "Anna salausavain: "
+#~ msgid "-A\t\t\tstart in Arabic mode"
+#~ msgstr "-A\t\t\tkรคynnistรค arabia-tilassa"
-#~ msgid "Enter same key again: "
-#~ msgstr "Anna sama avain uudestaan: "
+#~ msgid "-dev <device>\t\tUse <device> for I/O"
+#~ msgstr "-dev <laite>\t\tKรคytรค <laitetta> IO:hon"
-#~ msgid "Keys don't match!"
-#~ msgstr "Avaimet eivไt tไsmไไ!"
+#~ msgid "-f\t\t\tDon't use newcli to open window"
+#~ msgstr "-f\t\t\tร„lรค kรคytรค newcli:tรค ikkunan avaamiseen"
-#~ msgid "Cannot connect to Netbeans #2"
-#~ msgstr "Ei voi yhdistไไ Netbeans #2:een"
+#~ msgid "-L\t\t\tSame as -r"
+#~ msgstr "-L\t\t\tkuten -r"
-#~ msgid "Cannot connect to Netbeans"
-#~ msgstr "Ei voi yhdistไไ Netbeansiin"
+#~ msgid "-D\t\t\tDebugging mode"
+#~ msgstr "-D\t\t\tVianetsintรคtila"
-#~ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
-#~ msgstr "E668: Vไไrไ avaustila NetBeans-yhteyden infotiedostolle: %s"
+#~ msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'"
+#~ msgstr "-N\t\t\tEi Vi-yhteensopivuutta: nocompatible"
-#~ msgid "read from Netbeans socket"
-#~ msgstr "luettu Netbeans-soketista"
+#~ msgid "-C\t\t\tCompatible with Vi: 'compatible'"
+#~ msgstr "-C\t\t\tVi-yhteensopivuustila: compatible"
-#~ msgid "E658: NetBeans connection lost for buffer %<PRId64>"
-#~ msgstr "E658: NetBeans-yhteys katkesi puskurille %<PRId64>"
+#~ msgid "-l\t\t\tLisp mode"
+#~ msgstr "-l\t\t\tLisp-tila"
-#~ msgid "E511: netbeans already connected"
-#~ msgstr "E511: netbeans on yhdistetty jo"
+#~ msgid "-b\t\t\tBinary mode"
+#~ msgstr "-b\t\t\tBinรครคritila"
-#~ msgid "E505: "
-#~ msgstr "E505: "
+#~ msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
+#~ msgstr "-Z\t\t\tRajoitettu tila (kuten rvimillรค)"
-#~ msgid "E775: Eval feature not available"
-#~ msgstr "E775: Eval ei ole kไytettไvissไ"
+#~ msgid "-R\t\t\tReadonly mode (like \"view\")"
+#~ msgstr "-R\t\t\tKirjoitussuojattu tila (kuten view'lla)"
-#~ msgid "freeing %<PRId64> lines"
-#~ msgstr "vapautetaan %<PRId64> riviไ"
+#~ msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
+#~ msgstr "-y\t\t\tHelppokรคyttรถtila (kuten evimissรค, ilman tiloja)"
-#~ msgid "E530: Cannot change term in GUI"
-#~ msgstr "E530: Ei voi vaihtaa termiไ GUIssa"
+#~ msgid "-d\t\t\tDiff mode (like \"vimdiff\")"
+#~ msgstr "-d\t\t\tDiff-tila (kuten vimdiffillรค)"
-#~ msgid "E531: Use \":gui\" to start the GUI"
-#~ msgstr "E531: Kไytไ komentoa :gui GUIn kไynnistไmiseen"
+#~ msgid "-E\t\t\tImproved Ex mode"
+#~ msgstr "-E\t\t\tParanneltu Ex-tila"
-#~ msgid "E617: Cannot be changed in the GTK+ 2 GUI"
-#~ msgstr "E617: Ei voi muuttaa GTK+2-GUIssa"
+#~ msgid "-e\t\t\tEx mode (like \"ex\")"
+#~ msgstr "-e\t\t\tEx-tila (kute exillรค)"
-#~ msgid "E596: Invalid font(s)"
-#~ msgstr "E596: Viallisia fontteja"
+#~ msgid "-v\t\t\tVi mode (like \"vi\")"
+#~ msgstr "-v\t\t\tVi-tila (kuten villรค)"
-#~ msgid "E597: can't select fontset"
-#~ msgstr "E597: Fontsetin valinta ei onnistu"
+#~ msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
+#~ msgstr "-f tai --nofork\tEdustalle: ร„lรค haarauta GUIn kรคynnistyksessรค"
-#~ msgid "E598: Invalid fontset"
-#~ msgstr "E598: Viallinen fontset"
+#~ msgid "-g\t\t\tRun using GUI (like \"gvim\")"
+#~ msgstr "-g\t\t\tAvaa GUI (kuten gvimillรค)"
-#~ msgid "E533: can't select wide font"
-#~ msgstr "E533: Leveไn fontin valinta ei onnistu"
+#~ msgid "-unregister\t\tUnregister gvim for OLE"
+#~ msgstr "-unregister\t\tPoista gvim OLE-rekisteristรค"
-#~ msgid "E534: Invalid wide font"
-#~ msgstr "E534: Viallinen leveไ fontti"
+#~ msgid "-register\t\tRegister this gvim for OLE"
+#~ msgstr "-register\t\trekisterรถi gvim OLEa varten"
-#~ msgid "E538: No mouse support"
-#~ msgstr "E538: Hiirtไ ei tueta"
+#~ msgid ""
+#~ "\n"
+#~ "Where case is ignored prepend / to make flag upper case"
+#~ msgstr ""
+#~ "\n"
+#~ "Jos aakkoslaji on ohitettu, lisรครค alkuun / tehdรคksesi asetuksesta "
+#~ "suuraakkosia"
-#~ msgid "cannot open "
-#~ msgstr "ei voi avata "
+#~ msgid ""
+#~ "\n"
+#~ " or:"
+#~ msgstr ""
+#~ "\n"
+#~ " tai:"
-#~ msgid "VIM: Can't open window!\n"
-#~ msgstr "VIM: Ei voi avata ikkunaa\n"
+#~ msgid " vim [arguments] "
+#~ msgstr " vim [argumentit] "
-#~ msgid "Need Amigados version 2.04 or later\n"
-#~ msgstr "Amigados 2.04 tai uudempi tarvitaan\n"
+#~ msgid "Vim: Error: This version of Vim does not run in a Cygwin terminal\n"
+#~ msgstr "Vim: Virhe: Tรคmรค versio Vimistรค ei toimi Cygwinin terminaalissa\n"
-#~ msgid "Need %s version %<PRId64>\n"
-#~ msgstr "Tarvitaan %s versio %<PRId64>\n"
+#~ msgid "Vim: Error: Failure to start gvim from NetBeans\n"
+#~ msgstr "Vim: Virhe: Gvimin kรคynnistys NetBeansistรค ei onnistu\n"
-#~ msgid "Cannot open NIL:\n"
-#~ msgstr "Ei voi avata NILiไ:\n"
+#~ msgid "This Vim was not compiled with the diff feature."
+#~ msgstr "Tรคhรคn Vimiin ei ole kรครคnnetty diff-toimintoja mukaan."
-#~ msgid "Cannot create "
-#~ msgstr "Ei voi luoda "
+#~ msgid "'-nb' cannot be used: not enabled at compile time\n"
+#~ msgstr "-nb:tรค ei voi kรคyttรครค, koska sitรค ei kรครคnnetty mukaan\n"
-#~ msgid "Vim exiting with %d\n"
-#~ msgstr "Vim sulkeutuu koodilla %d\n"
+#~ msgid "netbeans is not supported with this GUI\n"
+#~ msgstr "netbeans ei toimi tรคssรค kรคyttรถliittymรคssรค\n"
-#~ msgid "cannot change console mode ?!\n"
-#~ msgstr "ei voi vaihtaa konsolitilaa?\n"
+#~ msgid "%d files to edit\n"
+#~ msgstr "%d tiedostoa muokattavana\n"
-#~ msgid "mch_get_shellsize: not a console??\n"
-#~ msgstr "mch_get_shellsize: ei ole konsoli?\n"
+#~ msgid "E251: VIM instance registry property is badly formed. Deleted!"
+#~ msgstr "E251: VIMin instanssin rekisteriarvo on virheellinen, poistettiin."
-#~ msgid "E360: Cannot execute shell with -f option"
-#~ msgstr "E360: Kuorta ei voi avata asetuksella -f"
+#~ msgid "E573: Invalid server id used: %s"
+#~ msgstr "E573: Virheellinen palvelimen tunniste: %s"
-#~ msgid "Cannot execute "
-#~ msgstr "Ei voi suorittaa "
+#~ msgid "E248: Failed to send command to the destination program"
+#~ msgstr "E248: Komennon lรคhetys kohdeohjelmalle ei onnistu"
-#~ msgid "shell "
-#~ msgstr "kuori "
+#~ msgid "Unable to register a command server name"
+#~ msgstr "Komentopalvelimen nimen rekisterรถinti ei onnistu"
-#~ msgid " returned\n"
-#~ msgstr " palautti\n"
+#~ msgid "cannot get line"
+#~ msgstr "ei voida hakea riviรค"
-#~ msgid "ANCHOR_BUF_SIZE too small."
-#~ msgstr "ANCHOR_BUF_SIZE liian pieni."
+#~ msgid "E572: exit code %d"
+#~ msgstr "E572: palautusarvo %d"
-#~ msgid "I/O ERROR"
-#~ msgstr "IO-virhe"
+#~ msgid ""
+#~ "E571: Sorry, this command is disabled: the Tcl library could not be "
+#~ "loaded."
+#~ msgstr "E571: komento ei toimi, Tcl-kirjastoa ei voitu ladata."
-#~ msgid "Message"
-#~ msgstr "Viesti"
+#~ msgid "cannot register callback command: buffer/window reference not found"
+#~ msgstr ""
+#~ "callbackia ei voi rekisterรถidรค: puskurin tai ikkunan viitettรค ei lรถydy"
-#~ msgid "'columns' is not 80, cannot execute external commands"
-#~ msgstr "columns ei ole 80, ei voi suorittaa ulkoista komentoa"
+#~ msgid ""
+#~ "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-"
+#~ "dev@vim.org"
+#~ msgstr ""
+#~ "E280: kriittinen TCL-virhe: reflist hajalla? Ilmoita asiasta "
+#~ "postituslistalle vim-dev@vim.org"
-#~ msgid "E237: Printer selection failed"
-#~ msgstr "E237: Tulostimen valinta epไonnistui"
+#~ msgid ""
+#~ "cannot register callback command: buffer/window is already being deleted"
+#~ msgstr "callbackia ei voi rekisterรถidรค: puskuri tai ikkuna on poistettu"
-#~ msgid "to %s on %s"
-#~ msgstr "tulostimelle %s kohteessa %s"
+#~ msgid "cannot create buffer/window command: object is being deleted"
+#~ msgstr "ei voi luoda puskuri- tai ikkunakomentoa, olio on poistumassa"
-#~ msgid "E613: Unknown printer font: %s"
-#~ msgstr "E613: Tuntematon tulostimen fontti: %s"
+#~ msgid "vim error"
+#~ msgstr "vim-virhe"
-#~ msgid "E238: Print error: %s"
-#~ msgstr "E238: Tulostinvirhe: %s"
+#~ msgid "unknown vimOption"
+#~ msgstr "tuntematon vimOption"
-#~ msgid "Printing '%s'"
-#~ msgstr "Tulostetaan %s"
+#~ msgid "unknown flag: "
+#~ msgstr "tuntematon asetus: "
-#~ msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
-#~ msgstr "E244: Virheellinen merkist๖n nimi %s fontin nimessไ %s"
+#~ msgid "cannot insert/append line"
+#~ msgstr "rivin lisรคys ei onnistu"
-#~ msgid "E245: Illegal char '%c' in font name \"%s\""
-#~ msgstr "E245: Virheellinen merkki %c fontin nimessไ %s"
+#~ msgid "row %d column %d"
+#~ msgstr "rivi %d sarake %d"
+
+#~ msgid "mark not set"
+#~ msgstr "merkko ei ole asetettu"
-#~ msgid "Vim: Double signal, exiting\n"
-#~ msgstr "Vim: Kaksoissignaali, lopetetaan\n"
+#~ msgid "cannot set line(s)"
+#~ msgstr "ei voi asettaa rivejรค"
-#~ msgid "Vim: Caught deadly signal %s\n"
-#~ msgstr "Vim: Tappava signaali %s\n"
+#~ msgid "not implemented yet"
+#~ msgstr "ei toteutettu"
-#~ msgid "Vim: Caught deadly signal\n"
-#~ msgstr "Vim: Tappava signaali\n"
+#~ msgid "E273: unknown longjmp status %d"
+#~ msgstr "E273: tuntematon longjmp-tila %d"
-#~ msgid "Opening the X display took %<PRId64> msec"
-#~ msgstr "X-nไyt๖n avaus vei %<PRId64> millisekuntia"
+#~ msgid "E272: unhandled exception"
+#~ msgstr "E272: kรคsittelemรคtรถn poikkeus"
-#~ msgid ""
-#~ "\n"
-#~ "Vim: Got X error\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Vim: X-virhe\n"
+#~ msgid "E271: retry outside of rescue clause"
+#~ msgstr "E271: retry rescuen ulkopuolella"
-#~ msgid "Testing the X display failed"
-#~ msgstr "X-nไyt๖n testaus epไonnistui"
+#~ msgid "E269: unexpected break"
+#~ msgstr "E269: Odotuksenvastainen break"
-#~ msgid "Opening the X display timed out"
-#~ msgstr "X-nไyt๖n avaus aikakatkaistiin"
+#~ msgid "E268: unexpected next"
+#~ msgstr "E268: Odotuksenvastainen next"
+
+#~ msgid "E267: unexpected return"
+#~ msgstr "E267: odotuksenvastainen return"
#~ msgid ""
-#~ "\n"
-#~ "Cannot execute shell sh\n"
+#~ "E266: Sorry, this command is disabled, the Ruby library could not be "
+#~ "loaded."
+#~ msgstr "E266: komento ei toimi, Ruby-kirjastoa ei voitu ladata."
+
+#~ msgid "E265: $_ must be an instance of String"
+#~ msgstr "E265: muuttujan $_ pitรครค olla Stringin instanssi"
+
+#~ msgid "E837: This Vim cannot execute :py3 after using :python"
#~ msgstr ""
-#~ "\n"
-#~ "Kuoren sh suoritus ei onnistu\n"
+#~ "E837: Python: Ei voi kรคyttรครค komentoja :py ja :py3 samassa istunnossa"
+
+#~ msgid "E659: Cannot invoke Python recursively"
+#~ msgstr "E659: Pythonia ei voi kutsua rekursiivisesti"
#~ msgid ""
-#~ "\n"
-#~ "Cannot create pipes\n"
+#~ "E887: Sorry, this command is disabled, the Python's site module could not "
+#~ "be loaded."
#~ msgstr ""
-#~ "\n"
-#~ "Putkia ei voi tehdไ\n"
+#~ "E887: Komento ei toimi, Pythonin site-moduulien lataaminen ei onnistunut."
#~ msgid ""
-#~ "\n"
-#~ "Cannot fork\n"
+#~ "E263: Sorry, this command is disabled, the Python library could not be "
+#~ "loaded."
+#~ msgstr "E263: komento ei toimi, Python-kirjaston lataaminen ei onnistunut."
+
+#~ msgid "E836: This Vim cannot execute :python after using :py3"
#~ msgstr ""
-#~ "\n"
-#~ "Ei voi haarauttaa\n"
+#~ "E836: Python: Ei voi kรคyttรครค komentoja :py ja :py3 samassa istunnossa"
+
+#~ msgid "not allowed in the Vim sandbox"
+#~ msgstr "ei sallittu Vimin hiekkalaatikossa"
+
+#~ msgid "linenr out of range"
+#~ msgstr "rivinumero arvoalueen ulkopuolelta"
+
+#~ msgid "window is invalid"
+#~ msgstr "ikkuna on virheellinen"
+
+#~ msgid "buffer is invalid"
+#~ msgstr "puskuri on virheellinen"
+
+#~ msgid "Vim error"
+#~ msgstr "Vim-virhe"
+
+#~ msgid "Vim error: ~a"
+#~ msgstr "Vim-virhe: ~a"
+
+#~ msgid "couldn't open buffer"
+#~ msgstr "ei voitu avata puskuria"
+
+#~ msgid "unknown option"
+#~ msgstr "tuntematon asetus"
+
+#~ msgid "hidden option"
+#~ msgstr "piilotettu asetus"
+
+#~ msgid "expressions disabled at compile time"
+#~ msgstr "ilmaukset poistettu kรคytรถstรค kรครคnnรถsaikana"
+
+#~ msgid "invalid expression"
+#~ msgstr "virheellinen ilmaus"
#~ msgid ""
-#~ "\n"
-#~ "Command terminated\n"
+#~ "E895: Sorry, this command is disabled, the MzScheme's racket/base module "
+#~ "could not be loaded."
#~ msgstr ""
-#~ "\n"
-#~ "Komento loppui\n"
+#~ "E895: Komento ei toimi, MzScheme-moduulia racket/base ei voitu ladata."
-#~ msgid "XSMP lost ICE connection"
-#~ msgstr "XSMP kadotti ICE-yhteyden"
+#~ msgid ""
+#~ "E815: Sorry, this command is disabled, the MzScheme libraries could not "
+#~ "be loaded."
+#~ msgstr "E815: komento ei toimi, MzScheme-kirjastoa ei voitu ladata."
-#~ msgid "Opening the X display failed"
-#~ msgstr "X-nไyt๖n avaus epไonnistui"
+#~ msgid "Lua library cannot be loaded."
+#~ msgstr "Luan kirjastoa ei voitu ladata."
-#~ msgid "XSMP handling save-yourself request"
-#~ msgstr "XSMP kไsittelee save-yourself-pyynt๖ไ"
+#~ msgid "E626: cannot get cscope database information"
+#~ msgstr "E626: ei voi hakea cscope-tietokannan tietoja"
-#~ msgid "XSMP opening connection"
-#~ msgstr "XSMP avaa yhteyttไ"
+#~ msgid "E625: cannot open cscope database: %s"
+#~ msgstr "E625: ei voi avata cscope-tietokantaa: %s"
-#~ msgid "XSMP ICE connection watch failed"
-#~ msgstr "XSMP:n ICE-yhteyden tarkkailu epไonnistui"
+#~ msgid "E563: stat error"
+#~ msgstr "E563: stat-virhe"
-#~ msgid "XSMP SmcOpenConnection failed: %s"
-#~ msgstr "XSMP SmcOpenConnection epไonnistui: %s"
+#~ msgid "E256: Hangul automata ERROR"
+#~ msgstr "E256: Hangu-automaattivirhe"
-#~ msgid "At line"
-#~ msgstr "Rivillไ"
+#~ msgid "Size:"
+#~ msgstr "Koko:"
-#~ msgid "Could not load vim32.dll!"
-#~ msgstr "Vim32.dll:ไไ ei voitu ladata"
+#~ msgid "Style:"
+#~ msgstr "Tyyli:"
-#~ msgid "VIM Error"
-#~ msgstr "VIM-virhe"
+#~ msgid "Font:"
+#~ msgstr "Fontti:"
-#~ msgid "Could not fix up function pointers to the DLL!"
-#~ msgstr "Ei voitu korjata funktio-osoittimia DLL:ssไ"
+#~ msgid "Encoding:"
+#~ msgstr "Koodaus:"
-#~ msgid "shell returned %d"
-#~ msgstr "kuori palautti arvon %d"
+#~ msgid "Show size in Points"
+#~ msgstr "Nรคytรค koko pisteinรค"
-#~ msgid "Vim: Caught %s event\n"
-#~ msgstr "Vim: Napattiin %s\n"
+#~ msgid "Name:"
+#~ msgstr "Nimi:"
-#~ msgid "close"
-#~ msgstr "sulkeminen"
+#~ msgid "Vim - Font Selector"
+#~ msgstr "Vim - fonttivalitsin"
-#~ msgid "logoff"
-#~ msgstr "uloskirjautuminen"
+#~ msgid "no specific match"
+#~ msgstr "ei tarkkaa tรคsmรคystรค"
-#~ msgid "shutdown"
-#~ msgstr "sammutus"
+#~ msgid "&Dismiss"
+#~ msgstr "&Ohita"
-#~ msgid "E371: Command not found"
-#~ msgstr "E371: Komentoa ei l๖ydy"
+#~ msgid "Invalid font specification"
+#~ msgstr "Virheellinen fonttimรครคritys"
+
+#~ msgid "Font1 width: %ld"
+#~ msgstr "Fontti1:n leveys: %ld"
+
+#~ msgid "Font0 width: %ld"
+#~ msgstr "Fontti0:n leveys: %ld"
+
+#~ msgid "Font%ld width is not twice that of font0"
+#~ msgstr "Fontti%ld:n leveys ei ole kaksi kertaa fontti0:n"
+
+#~ msgid "Font1: %s"
+#~ msgstr "Fontti1: %s"
+
+#~ msgid "Font0: %s"
+#~ msgstr "Fontti0: %s"
+
+#~ msgid "E253: Fontset name: %s"
+#~ msgstr "E253: Fontsetin nimi: %s"
+
+#~ msgid "Font '%s' is not fixed-width"
+#~ msgstr "Fontti %s ei ole tasavรคlinen"
+
+#~ msgid "E252: Fontset name: %s"
+#~ msgstr "E252: Fontsetin nimi: %s"
+
+#~ msgid "E250: Fonts for the following charsets are missing in fontset %s:"
+#~ msgstr "E250: Seuraavien merkistรถjoukkojen fontit puuttuvat fontsetistรค %s:"
#~ msgid ""
-#~ "VIMRUN.EXE not found in your $PATH.\n"
-#~ "External commands will not pause after completion.\n"
-#~ "See :help win32-vimrun for more information."
+#~ "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
#~ msgstr ""
-#~ "VIMRUN.EXEไ ei l๖ydy muuttujasta $PATH.\n"
-#~ "Ulkoiset komennot eivไt pysไhdy suorituksen lopussa.\n"
-#~ "Lisไtietoja komennolla :help win32-vimrun"
+#~ "Vim E458: Ei voi varata vรคrikartan alkiota, vรคrit voivat mennรค vรครคrin"
-#~ msgid "Vim Warning"
-#~ msgstr "Vim-varoitus"
+# MDI eli windowsin moni-ikkunasovellus
+#~ msgid "E672: Unable to open window inside MDI application"
+#~ msgstr "E672: Ikkunaa ei voitu avata MDI-sovellukseen"
-#~ msgid "Error file"
-#~ msgstr "Virhetiedosto"
+# OLE on object linking and embedding pรฅ windowska
+#~ msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
+#~ msgstr "E243: Argumenttia ei tueta: -%s, kรคytรค OLE-versiota"
-#~ msgid "Conversion in %s not supported"
-#~ msgstr "Muutosta kohteessa %s ei tueta"
+#~ msgid "Directory\t*.nothing\n"
+#~ msgstr "Hakemisto\t*.nothing\n"
-#~ msgid "E430: Tag file path truncated for %s\n"
-#~ msgstr "E430: Tไgitiedoston polku katkaistu kohdassa %s\n"
+#~ msgid "Not Used"
+#~ msgstr "Ei kรคytรถssรค"
-#~ msgid "new shell started\n"
-#~ msgstr "uusi kuori avattu\n"
+#~ msgid "Find & Replace (use '\\\\' to find a '\\')"
+#~ msgstr "Etsi ja korvaa (\\\\:llรค lรถytรครค \\:t)"
-#~ msgid "Used CUT_BUFFER0 instead of empty selection"
-#~ msgstr "Kไytettiin CUT_BUFFER0:aa tyhjไn valinnan sijaan"
+#~ msgid "Find string (use '\\\\' to find a '\\')"
+#~ msgstr "Etsi merkkijonoa (\\\\:llรค lรถytรครค \\:t)"
-#~ msgid "No undo possible; continue anyway"
-#~ msgstr "Ei voi kumota, jatketaan silti"
+#~ msgid "Open tab..."
+#~ msgstr "Avaa vรคlilehti..."
-#~ msgid "E832: Non-encrypted file has encrypted undo file: %s"
-#~ msgstr "E832: Salaamattomalla tiedostolla on salattu kumoustiedosto: %s"
+#~ msgid "&Undo"
+#~ msgstr "&Kumoa"
-#~ msgid "E826: Undo file decryption failed: %s"
-#~ msgstr "E826: Kumoustiedoston purku epไonnistui: %s"
+#~ msgid "Replace &All"
+#~ msgstr "Korvaa k&aikki"
-#~ msgid "E827: Undo file is encrypted: %s"
-#~ msgstr "E827: Kumoustiedosto on salattu: %s"
+#~ msgid "&Replace"
+#~ msgstr "Ko&rvaa"
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16/32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 16- t. 32-bittinen GUI-versio"
+#~ msgid "Find &Next"
+#~ msgstr "Hae &seuraava"
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 64-bittinen GUI-versio"
+#~ msgid "Selection"
+#~ msgstr "Valinta"
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 32-bittinen GUI-version"
+#~ msgid "&OK"
+#~ msgstr "&Ok"
-#~ msgid " in Win32s mode"
-#~ msgstr " Win32s-tilassa"
+#~ msgid "Files"
+#~ msgstr "Tiedostot"
-#~ msgid " with OLE support"
-#~ msgstr " OLE-tuella"
+#~ msgid "&Help"
+#~ msgstr "O&hje"
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 32-bittinen konsoliversio"
+#~ msgid "Filter"
+#~ msgstr "Suodatus"
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 32-bittinen konsoliversio"
+#~ msgid "Directories"
+#~ msgstr "Hakemistot"
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16-bit version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 16-bittinen versio"
+#~ msgid "&Cancel"
+#~ msgstr "&Peru"
-#~ msgid ""
-#~ "\n"
-#~ "32-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "32-bittinen MS-DOS-versio"
+#~ msgid "&Filter"
+#~ msgstr "&Suodata"
-#~ msgid ""
-#~ "\n"
-#~ "16-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "16-bittinen MS-DOS-versio"
+#~ msgid "Vim: Main window unexpectedly destroyed\n"
+#~ msgstr "Vim: Pรครคikkuna tuhoutui odottamatta\n"
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X (unix) version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS X-version (unix)"
+#~ msgid "Open Tab..."
+#~ msgstr "Avaa vรคlilehti..."
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS X-version"
+#~ msgid "New tab"
+#~ msgstr "Uusi vรคlilehti"
-#~ msgid ""
-#~ "\n"
-#~ "MacOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS-version"
+#~ msgid "Close tab"
+#~ msgstr "Sulje vรคlilehti"
-#~ msgid ""
-#~ "\n"
-#~ "RISC OS version"
-#~ msgstr ""
-#~ "\n"
-#~ "RISC OS-version"
+#~ msgid "Vim: Received \"die\" request from session manager\n"
+#~ msgstr "Vim: sessiomanageri lรคhetti die-pyynnรถn\n"
-#~ msgid ""
-#~ "\n"
-#~ "OpenVMS version"
-#~ msgstr ""
-#~ "\n"
-#~ "OpenVMS-version"
+#~ msgid "_Close"
+#~ msgstr "_Sulje"
-#~ msgid ""
-#~ "\n"
-#~ "Big version "
-#~ msgstr ""
-#~ "\n"
-#~ "Big-version "
+#~ msgid "Replace All"
+#~ msgstr "Korvaa kaikki"
-#~ msgid ""
-#~ "\n"
-#~ "Normal version "
-#~ msgstr ""
-#~ "\n"
-#~ "Normal-versio "
+#~ msgid "Replace"
+#~ msgstr "Korvaa"
-#~ msgid ""
-#~ "\n"
-#~ "Small version "
-#~ msgstr ""
-#~ "\n"
-#~ "Small-versio "
+#~ msgid "Find Next"
+#~ msgstr "Etsi seuraava"
-#~ msgid ""
-#~ "\n"
-#~ "Tiny version "
-#~ msgstr ""
-#~ "\n"
-#~ "Tiny-versio "
+#~ msgid "Down"
+#~ msgstr "Alas"
-#~ msgid "with GTK2-GNOME GUI."
-#~ msgstr "GTK2-Gnome-GUIlla."
+#~ msgid "Up"
+#~ msgstr "Ylรถs"
-#~ msgid "with GTK2 GUI."
-#~ msgstr "GTK2-GUIlla."
+#~ msgid "Direction"
+#~ msgstr "Suunta"
-#~ msgid "with X11-Motif GUI."
-#~ msgstr "X11-Motif-GUIlla."
+#~ msgid "Match case"
+#~ msgstr "Kirjaintaso"
-#~ msgid "with X11-neXtaw GUI."
-#~ msgstr "X11-neXtaw-GUIlla."
+#~ msgid "Match whole word only"
+#~ msgstr "Korvaa kokonaisia sanoja"
-#~ msgid "with X11-Athena GUI."
-#~ msgstr "X11-Athena-GUIlla."
+#~ msgid "Replace with:"
+#~ msgstr "Korvaa:"
-#~ msgid "with Photon GUI."
-#~ msgstr "Photon-GUIlla."
+#~ msgid "Find what:"
+#~ msgstr "Etsi:"
-#~ msgid "with GUI."
-#~ msgstr "GUIlla."
+#~ msgid "VIM - Search..."
+#~ msgstr "VIM - Etsi..."
-#~ msgid "with Carbon GUI."
-#~ msgstr "Carbon-GUIlla."
+#~ msgid "VIM - Search and Replace..."
+#~ msgstr "VIM - Etsi ja korvaa..."
-#~ msgid "with Cocoa GUI."
-#~ msgstr "Cocoa-GUIlla."
+#~ msgid "Input _Methods"
+#~ msgstr "Syรถte_menetelmรคt"
-#~ msgid "with (classic) GUI."
-#~ msgstr "perinteisellไ GUIlla."
+#~ msgid "No"
+#~ msgstr "Ei"
-#~ msgid " system gvimrc file: \""
-#~ msgstr " jไrjestelmไn gvimrc: \""
+#~ msgid "Yes"
+#~ msgstr "Kyllรค"
-#~ msgid " user gvimrc file: \""
-#~ msgstr " kไyttไjไn gvimrc: \""
+#~ msgid "_OK"
+#~ msgstr "_OK"
-#~ msgid "2nd user gvimrc file: \""
-#~ msgstr "2. kไyttไjไn gvimrc: \""
+#~ msgid "_Open"
+#~ msgstr "_Avaa"
-#~ msgid "3rd user gvimrc file: \""
-#~ msgstr "3. kไyttไjไn gvimrc: \""
+#~ msgid "_Save"
+#~ msgstr "_Tallenna"
-#~ msgid " system menu file: \""
-#~ msgstr " jไrjestelmไvalikko: \""
+#~ msgid "_Cancel"
+#~ msgstr "_Peru"
-#~ msgid "Compiler: "
-#~ msgstr "Kไไnnin: "
+#~ msgid "E232: Cannot create BalloonEval with both message and callback"
+#~ msgstr "E232: Ei voi luoda BalloonEvalia viestille ja callbackille"
-#~ msgid "menu Help->Orphans for information "
-#~ msgstr "valikko Ohje->Orvot lisไtietoja varten "
+#~ msgid "Vim dialog"
+#~ msgstr "Vim-ikkuna"
-#~ msgid "Running modeless, typed text is inserted"
-#~ msgstr "Suoritetaan tilattomana, kirjoitettu teksti sy๖tetไไn"
+#~ msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
+#~ msgstr "Vierityspalkki: Pixmapin geometria ei selviรค"
-#~ msgid "menu Edit->Global Settings->Toggle Insert Mode "
-#~ msgstr "valikko Muokkaa->Yleiset asetukset->Vaihda sy๖tetilaa"
+#~ msgid "Cancel"
+#~ msgstr "Peru"
-#~ msgid " for two modes "
-#~ msgstr " kahta tilaa varten "
+#~ msgid "OK"
+#~ msgstr "OK"
-#~ msgid "menu Edit->Global Settings->Toggle Vi Compatible"
-#~ msgstr "valikko Muokkaa->Yleiset asetukset->Vaihda Vi-yhteensopivuutta"
+#~ msgid "E615: vim_SelFile: can't get current directory"
+#~ msgstr "E615: vim_SelFile: nykyistรค hakemistoa ei saada selville"
-#~ msgid " for Vim defaults "
-#~ msgstr " Vim-oletuksia varten"
+#~ msgid "Pathname:"
+#~ msgstr "Polku:"
-#~ msgid "WARNING: Windows 95/98/ME detected"
-#~ msgstr "VAROITUS: Window 95/98/ME havaittu"
+#~ msgid "E614: vim_SelFile: can't return to current directory"
+#~ msgstr "E614: vim_SelFile: nykyiseen hakemistoon ei voi palata"
-#~ msgid "type :help windows95<Enter> for info on this"
-#~ msgstr "kirjoita :help windows95<Enter> lisไtietoja varten"
+#~ msgid "E616: vim_SelFile: can't get font %s"
+#~ msgstr "E616: vim_SelFile: ei saada fonttia %s"
-#~ msgid "E370: Could not load library %s"
-#~ msgstr "E370: Kirjaston %s lataaminen ei onnistu"
+#~ msgid "<cannot open> "
+#~ msgstr "<ei voi avata> "
+
+#~ msgid "No match at cursor, finding next"
+#~ msgstr "Ei tรคsmรคystรค kursorin alla, etsitรครคn seuraava"
+
+#~ msgid "E599: Value of 'imactivatekey' is invalid"
+#~ msgstr "E599: imactivatekeyn arvo on virheellinen"
+
+#~ msgid "E231: 'guifontwide' invalid"
+#~ msgstr "E231: guifontwide virheellinen"
+
+#~ msgid "E665: Cannot start GUI, no valid font found"
+#~ msgstr "E665: Ei voi avata GUIta, sopivaa fonttia ei lรถydy"
+
+#~ msgid "E230: Cannot read from \"%s\""
+#~ msgstr "E230: Ei voi lukea kohteesta %s"
+
+#~ msgid "E229: Cannot start the GUI"
+#~ msgstr "E229: GUIn kรคynnistys ei onnistu"
+
+#~ msgid "E851: Failed to create a new process for the GUI"
+#~ msgstr "E851: Ei voitu luoda uutta prosessia kรคyttรถliittymรคlle"
+
+# tietรครคkseni resurssiforkki on applen tiedostojรคrjestelmรคn tunnistejuttujuttu
+#~ msgid "E460: The resource fork would be lost (add ! to override)"
+#~ msgstr "E460: resurssiosa hรคviรคisi (lisรครค komentoon ! ohittaaksesi)"
+
+#~ msgid "writing to device disabled with 'opendevice' option"
+#~ msgstr "laitteeseen kirjoittaminen pois kรคytรถstรค opendevice-asetuksella"
+
+#~ msgid "Partial writes disallowed for NetBeans buffers"
+#~ msgstr "Osittaiset kirjoitukset kielletty NetBeans-puskureissa"
+
+#~ msgid "NetBeans disallows writes of unmodified buffers"
+#~ msgstr "NetBeans ei salli kirjoittaa muokkaamattomiin puskureihin"
+
+#~ msgid "Reading from stdin..."
+#~ msgstr "Luetaan vakiosyรถtteestรค"
+
+#~ msgid "Vim: Reading from stdin...\n"
+#~ msgstr "Vim: Luetaan vakiosyรถtteestรค...\n"
+
+#~ msgid "is a device (disabled with 'opendevice' option)"
+#~ msgstr "on laite (ei kรคytรถssรค opendevice-asetuksen takia)"
+
+#~ msgid "Debug Line"
+#~ msgstr "Vianetsintรคrivi"
+
+#~ msgid "Input Line"
+#~ msgstr "Syรถterivi"
+
+#~ msgid "Expression"
+#~ msgstr "Ilmaus"
+
+#~ msgid "Search String"
+#~ msgstr "Hakujono"
+
+#~ msgid "Command Line"
+#~ msgstr "Komentorivi"
#~ msgid ""
-#~ "Sorry, this command is disabled: the Perl library could not be loaded."
-#~ msgstr "Sori, komento ei toimi, Perl kirjastoa ei voinut ladata."
+#~ "\n"
+#~ "# %s History (newest to oldest):\n"
+#~ msgstr ""
+#~ "\n"
+#~ "# %s Historia (uusimmasta alkaen):\n"
-#~ msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
-#~ msgstr "E299: Perl-suoritus kielletty hiekkalaatikossa ilman Safe-moduulia"
+#~ msgid "E196: No digraphs in this version"
+#~ msgstr "E196: Digraafeja ei ole tรคssรค versiossa"
-#~ msgid "Edit with &multiple Vims"
-#~ msgstr "&Muokkaa usealla Vimillไ"
+#~ msgid "E195: Cannot open viminfo file for reading"
+#~ msgstr "E195: Viminfoa ei voi avata lukemista varten"
-#~ msgid "Edit with single &Vim"
-#~ msgstr "Muokkaa yhdellไ &Vimillไ"
+#~ msgid "E809: #< is not available without the +eval feature"
+#~ msgstr "E809: #< ei ole kรคytรถssรค jollei +eval ole pรครคllรค"
-#~ msgid "Diff with Vim"
-#~ msgstr "Diffi Vimillไ"
+#~ msgid "Save Setup"
+#~ msgstr "Tallenna asetukset"
-#~ msgid "Edit with &Vim"
-#~ msgstr "Muokkaa &Vimillไ"
+#~ msgid "Save Session"
+#~ msgstr "Tallenna sessio"
-#~ msgid "Edit with existing Vim - "
-#~ msgstr "Muokkaa olemassaolevalla Vimillไ - "
+#~ msgid "Save View"
+#~ msgstr "Tallenna nรคkymรค"
-#~ msgid "Edits the selected file(s) with Vim"
-#~ msgstr "Muokkaa valittuja tiedostoja Vimillไ"
+#~ msgid "Save Redirection"
+#~ msgstr "Tallenna uudelleenosoitus"
-#~ msgid "Error creating process: Check if gvim is in your path!"
-#~ msgstr "Virhe prosessin kไynnistไmisessไ, varmista ettไ gvim on polulla"
+#~ msgid "E930: Cannot use :redir inside execute()"
+#~ msgstr "E930: Komentoa :redir ei voi kรคyttรครค funktion execute() sisรคllรค"
-#~ msgid "gvimext.dll error"
-#~ msgstr "gvimext.dll-virhe"
+#~ msgid "E466: :winpos requires two number arguments"
+#~ msgstr "E466: :winpos vaatii kaksi lukuargumenttia"
-#~ msgid "Path length too long!"
-#~ msgstr "Liian pitkไ polku"
+#~ msgid "E188: Obtaining window position not implemented for this platform"
+#~ msgstr "E188: Ikkunan sijainnin selvitys ei toimi tรคllรค alustalla"
-#~ msgid "E234: Unknown fontset: %s"
-#~ msgstr "E234: Tuntematon fontset: %s"
+#~ msgid "Window position: X %d, Y %d"
+#~ msgstr "Ikkunan sijainti: X %d, Y %d"
-#~ msgid "E235: Unknown font: %s"
-#~ msgstr "E235: Tuntematon fontti: %s"
+#~ msgid ""
+#~ "E747: Cannot change directory, buffer is modified (add ! to override)"
+#~ msgstr ""
+#~ "E747: Hakemistoa ei voida muuttaa, puskuria on muokattu (lisรครค "
+#~ "komentoon ! ohittaaksesi"
-#~ msgid "E236: Font \"%s\" is not fixed-width"
-#~ msgstr "E236: Fontti %s ei ole tasavไlinen"
+#~ msgid "Append File"
+#~ msgstr "Lisรครค tiedostoon"
-#~ msgid "E448: Could not load library function %s"
-#~ msgstr "E448: Ei voitu ladta kirjastofunktiota %s"
+#~ msgid "Edit File in new window"
+#~ msgstr "Muokkaa uudessa ikkunassa"
-#~ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
-#~ msgstr "E26: Hepreaa ei voi kไyttไไ, koska sitไ ei kไไnnetty mukaan\n"
+#~ msgid "unknown"
+#~ msgstr "tuntematon"
-#~ msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
-#~ msgstr "E27: Farsia ei voi kไyttไไ, koska sitไ ei kไไnnetty mukaan\n"
+#~ msgid "E172: Only one file name allowed"
+#~ msgstr "E172: Vain yksi tiedostonimi sallitaan"
-#~ msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
-#~ msgstr "E800: Arabiaa ei voi kไyttไไ, koska sitไ ei kไไnnetty mukaan\n"
+#~ msgid "Source Vim script"
+#~ msgstr "Lataa vim-skripti"
-#~ msgid "E247: no registered server named \"%s\""
-#~ msgstr "E247: palvelinta %s ei ole rekister๖itynไ"
+#~ msgid " (NOT FOUND)"
+#~ msgstr " (EI Lร–YTYNYT)"
-#~ msgid "E233: cannot open display"
-#~ msgstr "E233: nไytt๖ไ ei voi avata"
+#~ msgid ""
+#~ "\n"
+#~ "# Last Substitute String:\n"
+#~ "$"
+#~ msgstr ""
+#~ "\n"
+#~ "# Viimeisin korvausmerkkijono:\n"
+#~ "$"
-#~ msgid "E449: Invalid expression received"
-#~ msgstr "E449: Virheellinen ilmaus saatu"
+#~ msgid "Edit File"
+#~ msgstr "Muokkaa tiedostoa"
-#~ msgid "E463: Region is guarded, cannot modify"
-#~ msgstr "E463: Alue on suojattu, muuttaminen ei onnistu"
+#~ msgid "Save As"
+#~ msgstr "Tallenna nimellรค"
-#~ msgid "E744: NetBeans does not allow changes in read-only files"
-#~ msgstr "E744: NetBeans ei tue muutoksia kirjoitussuojattuihin tiedostoihin"
+#~ msgid ""
+#~ "\n"
+#~ "# Bar lines, copied verbatim:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "# Bar-rivit, kopiotu sellaisenaan:\n"
-#~ msgid "Need encryption key for \"%s\""
-#~ msgstr "Tarvitaan salausavain kohteelle %s "
+#~ msgid "Illegal starting char"
+#~ msgstr "Virheellinen aloitusmerkki"
-#~ msgid "writelines() requires list of strings"
-#~ msgstr "writelines()-komennolle pitไไ antaa merkkijonolista"
+#~ msgid "# Value of 'encoding' when this file was written\n"
+#~ msgstr "# encoding-muuttujan arvo tiedostoa kirjoitettaessa\n"
-#~ msgid "E264: Python: Error initialising I/O objects"
-#~ msgstr "E264: Python: Virhe IO-olioiden alustuksessa"
+#~ msgid ""
+#~ "# You may edit it if you're careful!\n"
+#~ "\n"
+#~ msgstr ""
+#~ "# Muokkaa varovasti!\n"
+#~ "\n"
-#~ msgid "no such buffer"
-#~ msgstr "puskuria ei ole"
+#~ msgid "# This viminfo file was generated by Vim %s.\n"
+#~ msgstr "# Vimin %s generoima viminfo-tiedosto.\n"
-#~ msgid "attempt to refer to deleted window"
-#~ msgstr "yritettiin viitata poistettuun ikkunaan"
+#~ msgid "E138: Can't write viminfo file %s!"
+#~ msgstr "E138: Viminfo-tiedoston kirjoittaminen ei onnistu %s"
-#~ msgid "readonly attribute"
-#~ msgstr "kirjoitussuojattu attribuutti"
+#~ msgid "E929: Too many viminfo temp files, like %s!"
+#~ msgstr "E929: liikaa viminfo-vรคliaikaistiedostoja, kuten %s."
-#~ msgid "cursor position outside buffer"
-#~ msgstr "kursorin sijainti puskurin ulkopuolella"
+#~ msgid "E136: viminfo: Too many errors, skipping rest of file"
+#~ msgstr "E136: viminfo: liikaa virheitรค, ohitetaan lopputiedosto"
-#~ msgid "<window object (deleted) at %p>"
-#~ msgstr "<ikkunaolio (poistettu) kohdassa %p>"
+#~ msgid "%sviminfo: %s in line: "
+#~ msgstr "%sviminfo: %s rivillรค: "
-#~ msgid "<window object (unknown) at %p>"
-#~ msgstr "<ikkunaolio (tuntematon) kohdassa %p>"
+#~ msgid "E258: Unable to send to client"
+#~ msgstr "E258: Asiakkaalle lรคhetys ei onnistunut"
-#~ msgid "<window %d>"
-#~ msgstr "<ikkuna %d>"
+#~ msgid "E277: Unable to read a server reply"
+#~ msgstr "E277: Palvelimen vastauksen lukeminen ei onnistunut"
-#~ msgid "no such window"
-#~ msgstr "ikkunaa ei ole"
+#~ msgid "E240: No connection to Vim server"
+#~ msgstr "E240: Ei yhteyttรค vim-palvelimeen"
-#~ msgid "attempt to refer to deleted buffer"
-#~ msgstr "yritettiin viitata poistettuun puskuriin"
+#~ msgid ""
+#~ "&OK\n"
+#~ "&Cancel"
+#~ msgstr ""
+#~ "&OK\n"
+#~ "&Peru"
+
+#~ msgid ""
+#~ "\n"
+#~ "# global variables:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "# globaalit muuttujat:\n"
+
+#~ msgid "E729: using Funcref as a String"
+#~ msgstr "E729: Funcref ei kรคy merkkijonosta"
+
+#~ msgid "E914: Using a Channel as a Float"
+#~ msgstr "E914: Kรคytettiin Channelia Floattina"
+
+#~ msgid "E911: Using a Job as a Float"
+#~ msgstr "E911: Job ei kรคy Floatista"
+
+#~ msgid "E913: Using a Channel as a Number"
+#~ msgstr "E913: Channel ei kรคy Numberista"
+
+#~ msgid "E910: Using a Job as a Number"
+#~ msgstr "E910: Job ei kรคy Numberista"
+
+#~ msgid "E703: Using a Funcref as a Number"
+#~ msgstr "E703: Funcref ei kรคy Numberista"
+
+#~ msgid "E724: variable nested too deep for displaying"
+#~ msgstr "E724: muuttuja on upotettu liian syvรคlle nรคytettรคvรคksi"
+
+#~ msgid "Patch file"
+#~ msgstr "Patch-tiedosto"
+
+#~ msgid "[crypted]"
+#~ msgstr "[salattu]"
+
+#~ msgid "Keys don't match!"
+#~ msgstr "Avaimet eivรคt tรคsmรครค!"
-# New Line eli uusi rivinvaihtomerkki (ei CR, LF tai CR LF)
-#~ msgid "[NL found]"
-#~ msgstr "[NL puuttuu]"
+#~ msgid "Enter same key again: "
+#~ msgstr "Anna sama avain uudestaan: "
-#~ msgid "Vim dialog..."
-#~ msgstr "Vim-ikkuna..."
+#~ msgid "Enter encryption key: "
+#~ msgstr "Anna salausavain: "
-#~ msgid "Font Selection"
-#~ msgstr "Fontin valinta"
+#~ msgid "Warning: Using a weak encryption method; see :help 'cm'"
+#~ msgstr "Varoitus: Kรคytetรครคn heikkoa salausmenetelmรครค, ks. :help 'cm'"
-#~ msgid "E569: maximum number of cscope connections reached"
-#~ msgstr "E569: enimmไismไไrไ cscope-yhteyksiไ otettu"
+#~ msgid "E821: File is encrypted with unknown method"
+#~ msgstr "E821: Tiedoston salaus on tuntematon"
+
+#~ msgid "E918: buffer must be loaded: %s"
+#~ msgstr "E918: puskuria ei voi ladata: %s"
+
+#~ msgid "E915: in_io buffer requires in_buf or in_name to be set"
+#~ msgstr "E915: in_io-puskurilla pitรครค olla in_buf tai in_name asetettu"
-#~ msgid "-name <name>\t\tUse resource as if vim was <name>"
-#~ msgstr "-name <nimi>\t\tKไytไ resurssia vim <nimenไ>"
+#~ msgid "E920: _io file requires _name to be set"
+#~ msgstr "E920: _io-tiedostolla pitรครค olla _name asetettu"
-#~ msgid "\t\t\t (Unimplemented)\n"
-#~ msgstr "\t\t\t (toteuttamatta)\n"
+#~ msgid "E906: not an open channel"
+#~ msgstr "E906: ei ole avoin kanava"
+
+#~ msgid ""
+#~ "E912: cannot use ch_evalexpr()/ch_sendexpr() with a raw or nl channel"
+#~ msgstr ""
+#~ "E912: ei voida kรคyttรครค funktioita ch_evalexpr(), ch_sendexpr() raa'an tai "
+#~ "nl-kanavan kanssa"
-#~ msgid "E290: over-the-spot style requires fontset"
-#~ msgstr "E290: over-the-spot-tyylissไ pitไไ olla fontset"
+#~ msgid "E917: Cannot use a callback with %s()"
+#~ msgstr "E917: Ei voitu kรคyttรครค callbackia %s()"
-#~ msgid "E291: Your GTK+ is older than 1.2.3. Status area disabled"
-#~ msgstr "E291: GTK+-versio vanhempi kuin 1.2.3: Tila-alue poistettu kไyt๖stไ"
+#~ msgid ""
+#~ "\n"
+#~ "# Buffer list:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "# Puskuriluettelo:\n"
-#~ msgid "E292: Input Method Server is not running"
-#~ msgstr "E292: Sy๖temetodipalvelin ei ole kไynnissไ"
+#~ msgid "E931: Buffer cannot be registered"
+#~ msgstr "E931: Puskuria ei voi rekisterรถidรค"
-#~ msgid "E396: containedin argument not accepted here"
-#~ msgstr "E396: containedin ei sovi tไhไn"
+#~ msgid "E819: Blowfish test failed"
+#~ msgstr "E819: Blowfish-testi epรคonnistui"
-#~ msgid "with GTK-GNOME GUI."
-#~ msgstr "GTK-Gnome-GUIlla."
+#~ msgid "E818: sha256 test failed"
+#~ msgstr "E818: sha256-testi epรคonnistui failed"
-#~ msgid "with GTK GUI."
-#~ msgstr "GTK-GUIlla."
+#~ msgid "E817: Blowfish big/little endian use wrong"
+#~ msgstr "E817: Blowfishin tavujรคrjestys vรครคrรค"
-#~ msgid "-V[N]\t\tVerbose level"
-#~ msgstr "-V[N]\t\tMonisanaisuustaso"
+#~ msgid "E820: sizeof(uint32_t) != 4"
+#~ msgstr "E820: sizeof(uint32_t) != 4"
-#~ msgid "...(truncated)"
-#~ msgstr "...(katkaistu)"
+#~ msgid "E831: bf_key_init() called with empty password"
+#~ msgstr "E831: bf_key_init() tyhjรคllรค salasanalla"
diff --git a/src/nvim/po/fr.po b/src/nvim/po/fr.po
index 41efd5c5e3..5c4c154654 100644
--- a/src/nvim/po/fr.po
+++ b/src/nvim/po/fr.po
@@ -1,224 +1,199 @@
+
# French Translation for Vim
#
# Do ":help uganda" in Vim to read copying and usage conditions.
# Do ":help credits" in Vim to see a list of people who contributed.
#
-# FIRST AUTHOR DindinX <David.Odin@bigfoot.com> 2000.
-# SECOND AUTHOR Adrien Beau <version.francaise@free.fr> 2002, 2003.
-# THIRD AUTHOR David Blanchet <david.blanchet@free.fr> 2006, 2008.
-# FOURTH AUTHOR Dominique Pell้ <dominique.pelle@gmail.com> 2008, 2015.
-#
-# Latest translation available at:
-# http://dominique.pelle.free.fr/vim-fr.php
+# FIRST AUTHOR DindinX <David.Odin@bigfoot.com> 2000.
+# SECOND AUTHOR Adrien Beau <version.francaise@free.fr> 2002, 2003.
+# THIRD AUTHOR David Blanchet <david.blanchet@free.fr> 2006, 2008.
+# FOURTH AUTHOR Dominique Pell้ <dominique.pelle@gmail.com> 2008, 2018.
#
msgid ""
msgstr ""
-"Project-Id-Version: Vim(Fran็ais)\n"
+"Project-Id-Version: Vim 8.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-07-30 17:54+0200\n"
-"PO-Revision-Date: 2015-07-30 18:00+0200\n"
+"POT-Creation-Date: 2018-09-01 14:20+0200\n"
+"PO-Revision-Date: 2018-09-01 17:15+0200\n"
"Last-Translator: Dominique Pell้ <dominique.pelle@gmail.com>\n"
-"Language-Team: \n"
+"Language-Team: French\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=ISO_8859-15\n"
+"Content-Type: text/plain; charset=ISO-8859-15\n"
"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: ../api/private/helpers.c:201
-#, fuzzy
-msgid "Unable to get option value"
-msgstr "impossible d'obtenir la valeur d'une option"
+msgid "E831: bf_key_init() called with empty password"
+msgstr "E831: bf_key_init() appel้e avec un mot de passe vide"
-#: ../api/private/helpers.c:204
-#, fuzzy
-msgid "internal error: unknown option type"
-msgstr "erreur interne : pas d'้l้ment de liste vim"
+msgid "E820: sizeof(uint32_t) != 4"
+msgstr "E820: sizeof(uint32_t) != 4"
+
+msgid "E817: Blowfish big/little endian use wrong"
+msgstr "E817: petit/gros boutisme incorrect dans blowfish"
+
+msgid "E818: sha256 test failed"
+msgstr "E818: le test de sha256 a ้chou้"
+
+msgid "E819: Blowfish test failed"
+msgstr "E819: le test de blowfish a ้chou้"
# DB - TODO : Trouver une traduction valable et attest้e pour "location".
-#: ../buffer.c:92
msgid "[Location List]"
msgstr "[Liste des emplacements]"
-#: ../buffer.c:93
msgid "[Quickfix List]"
msgstr "[Liste Quickfix]"
-#: ../buffer.c:94
msgid "E855: Autocommands caused command to abort"
msgstr "E855: Des autocommandes ont caus้ la terminaison de la commande"
# AB - Il faut respecter l'esprit plus que la lettre.
-#: ../buffer.c:135
msgid "E82: Cannot allocate any buffer, exiting..."
msgstr "E82: Aucun tampon ne peut ๊tre allou้, Vim doit s'arr๊ter"
# AB - La situation est probablement plus grave que la version anglaise ne le
# laisse entendre (voir l'aide en ligne). La version fran็aise est plus
# explicite.
-#: ../buffer.c:138
msgid "E83: Cannot allocate buffer, using other one..."
msgstr ""
"E83: L'allocation du tampon a ้chou้ : arr๊tez Vim, lib้rez de la m้moire"
-#: ../buffer.c:763
+msgid "E931: Buffer cannot be registered"
+msgstr "E931: Le tampon ne peut pas ๊tre enregistr้"
+
+msgid "E937: Attempt to delete a buffer that is in use"
+msgstr "E937: Tentative de suppression d'un tampon en cours d'utilisation"
+
msgid "E515: No buffers were unloaded"
msgstr "E515: Aucun tampon n'a ้t้ d้charg้"
-#: ../buffer.c:765
msgid "E516: No buffers were deleted"
msgstr "E516: Aucun tampon n'a ้t้ effac้"
-#: ../buffer.c:767
msgid "E517: No buffers were wiped out"
msgstr "E517: Aucun tampon n'a ้t้ d้truit"
-#: ../buffer.c:772
-msgid "1 buffer unloaded"
-msgstr "1 tampon a ้t้ d้charg้"
-
-#: ../buffer.c:774
#, c-format
-msgid "%d buffers unloaded"
-msgstr "%d tampons ont ้t้ d้charg้s"
-
-#: ../buffer.c:777
-msgid "1 buffer deleted"
-msgstr "1 tampon a ้t้ effac้"
+msgid "%d buffer unloaded"
+msgid_plural "%d buffers unloaded"
+msgstr[0] "%d tampon a ้t้ d้charg้"
+msgstr[1] "%d tampons ont ้t้ d้charg้s"
-#: ../buffer.c:779
#, c-format
-msgid "%d buffers deleted"
-msgstr "%d tampons ont ้t้ effac้s"
-
-#: ../buffer.c:782
-msgid "1 buffer wiped out"
-msgstr "1 tampon a ้t้ d้truit"
+msgid "%d buffer deleted"
+msgid_plural "%d buffers deleted"
+msgstr[0] "%d tampon a ้t้ effac้"
+msgstr[1] "%d tampons ont ้t้ effac้s"
-#: ../buffer.c:784
#, c-format
-msgid "%d buffers wiped out"
-msgstr "%d tampons ont ้t้ d้truits"
+msgid "%d buffer wiped out"
+msgid_plural "%d buffers wiped out"
+msgstr[0] "%d tampon a ้t้ d้truit"
+msgstr[1] "%d tampons ont ้t้ d้truits"
-#: ../buffer.c:806
msgid "E90: Cannot unload last buffer"
msgstr "E90: Impossible de d้charger le dernier tampon"
# AB - La version fran็aise est meilleure que la version anglaise.
-#: ../buffer.c:874
msgid "E84: No modified buffer found"
msgstr "E84: Aucun tampon n'est modifi้"
-#. back where we started, didn't find anything.
-#: ../buffer.c:903
msgid "E85: There is no listed buffer"
msgstr "E85: Aucun tampon n'est list้"
# AB - Je ne suis pas s๛r que l'on puisse obtenir ce message.
-#: ../buffer.c:915
msgid "E87: Cannot go beyond last buffer"
msgstr "E87: Impossible d'aller apr่s le dernier tampon"
# AB - Je ne suis pas s๛r que l'on puisse obtenir ce message.
-#: ../buffer.c:917
msgid "E88: Cannot go before first buffer"
msgstr "E88: Impossible d'aller avant le premier tampon"
-#: ../buffer.c:945
#, c-format
-msgid ""
-"E89: No write since last change for buffer %<PRId64> (add ! to override)"
+msgid "E89: No write since last change for buffer %ld (add ! to override)"
msgstr ""
-"E89: Le tampon %<PRId64> n'a pas ้t้ enregistr้ (ajoutez ! pour passer outre)"
+"E89: Le tampon %ld n'a pas ้t้ enregistr้ (ajoutez ! pour passer outre)"
+
+msgid "E948: Job still running (add ! to end the job)"
+msgstr "E948: Tโche en cours d'ex้cution (ajouter ! pour terminer la tโche)"
+
+msgid "E37: No write since last change (add ! to override)"
+msgstr "E37: Modifications non enregistr้es (ajoutez ! pour passer outre)"
+
+msgid "E948: Job still running"
+msgstr "E948: Tโche en cours d'ex้cution"
+
+msgid "E37: No write since last change"
+msgstr "E37: Modifications non enregistr้es"
-#. wrap around (may cause duplicates)
-#: ../buffer.c:1423
msgid "W14: Warning: List of file names overflow"
msgstr "W14: Alerte : La liste des noms de fichier d้borde"
# AB - Vu le code source, la version fran็aise est meilleure que la
# version anglaise. Ce message est similaire au message E86.
-#: ../buffer.c:1555 ../quickfix.c:3361
#, c-format
-msgid "E92: Buffer %<PRId64> not found"
-msgstr "E92: Le tampon %<PRId64> n'existe pas"
+msgid "E92: Buffer %ld not found"
+msgstr "E92: Le tampon %ld n'existe pas"
# AB - Il faut respecter l'esprit plus que la lettre.
-#: ../buffer.c:1798
#, c-format
msgid "E93: More than one match for %s"
msgstr "E93: Plusieurs tampons correspondent เ %s"
-#: ../buffer.c:1800
#, c-format
msgid "E94: No matching buffer for %s"
msgstr "E94: Aucun tampon ne correspond เ %s"
-#: ../buffer.c:2161
#, c-format
-msgid "line %<PRId64>"
-msgstr "ligne %<PRId64>"
+msgid "line %ld"
+msgstr "ligne %ld"
-#: ../buffer.c:2233
msgid "E95: Buffer with this name already exists"
msgstr "E95: Un tampon porte d้jเ ce nom"
-#: ../buffer.c:2498
msgid " [Modified]"
msgstr "[Modifi้]"
# AB - "[In้dit้]" est plus correct, mais sonne faux.
-#: ../buffer.c:2501
msgid "[Not edited]"
msgstr "[Non ้dit้]"
-#: ../buffer.c:2504
msgid "[New file]"
msgstr "[Nouveau fichier]"
-#: ../buffer.c:2505
msgid "[Read errors]"
msgstr "[Erreurs de lecture]"
-#: ../buffer.c:2506 ../buffer.c:3217 ../fileio.c:1807 ../screen.c:4895
msgid "[RO]"
msgstr "[RO]"
# AB - La version courte, "[RO]", devrait-elle ๊tre traduite par "[LS]" ?
# Il faudrait faire un sondage aupr่s des utilisateurs francophones.
-#: ../buffer.c:2507 ../fileio.c:1807
msgid "[readonly]"
msgstr "[lecture-seule]"
-#: ../buffer.c:2524
#, c-format
-msgid "1 line --%d%%--"
-msgstr "1 ligne --%d%%--"
-
-#: ../buffer.c:2526
-#, c-format
-msgid "%<PRId64> lines --%d%%--"
-msgstr "%<PRId64> lignes --%d%%--"
+msgid "%ld line --%d%%--"
+msgid_plural "%ld lines --%d%%--"
+msgstr[0] "%ld ligne --%d%%--"
+msgstr[1] "%ld lignes --%d%%--"
# AB - Faut-il remplacer "sur" par "de" ?
# DB - Mon avis : oui.
-#: ../buffer.c:2530
#, c-format
-msgid "line %<PRId64> of %<PRId64> --%d%%-- col "
-msgstr "ligne %<PRId64> sur %<PRId64> --%d%%-- col "
+msgid "line %ld of %ld --%d%%-- col "
+msgstr "ligne %ld sur %ld --%d%%-- col "
# DB - Je trouvais [Aucun fichier] (VO : [No file]) plus naturel
# lors du lancement de Vim en mode graphique (ce message
# appara๎t notamment dans le titre de la fen๊tre).
-#: ../buffer.c:2632 ../buffer.c:4292 ../memline.c:1554
msgid "[No Name]"
msgstr "[Aucun nom]"
-#. must be a help buffer
-#: ../buffer.c:2667
msgid "help"
msgstr "aide"
-#: ../buffer.c:3225 ../screen.c:4883
msgid "[Help]"
msgstr "[Aide]"
@@ -226,24 +201,19 @@ msgstr "[Aide]"
# traduction litt้rale et br่ve, mais qui risque fort d'๊tre mal comprise.
# J'ai finalement choisi d'utiliser une abr้viation, mais cela ne me
# satisfait pas.
-#: ../buffer.c:3254 ../screen.c:4887
msgid "[Preview]"
msgstr "[Pr้visu]"
-#: ../buffer.c:3528
msgid "All"
msgstr "Tout"
-#: ../buffer.c:3528
msgid "Bot"
msgstr "Bas"
# AB - Attention, on passe de trois เ quatre lettres.
-#: ../buffer.c:3531
msgid "Top"
msgstr "Haut"
-#: ../buffer.c:4244
msgid ""
"\n"
"# Buffer list:\n"
@@ -251,11 +221,15 @@ msgstr ""
"\n"
"# Liste des tampons :\n"
-#: ../buffer.c:4289
+msgid "E382: Cannot write, 'buftype' option is set"
+msgstr "E382: ษcriture impossible, l'option 'buftype' est activ้e"
+
+msgid "[Prompt]"
+msgstr "[Invite]"
+
msgid "[Scratch]"
msgstr "[Brouillon]"
-#: ../buffer.c:4529
msgid ""
"\n"
"--- Signs ---"
@@ -263,175 +237,219 @@ msgstr ""
"\n"
"--- Symboles ---"
-#: ../buffer.c:4538
#, c-format
msgid "Signs for %s:"
msgstr "Symboles dans %s :"
-#: ../buffer.c:4543
#, c-format
-msgid " line=%<PRId64> id=%d name=%s"
-msgstr " ligne=%<PRId64> id=%d nom=%s"
+msgid " line=%ld id=%d name=%s"
+msgstr " ligne=%ld id=%d nom=%s"
-#: ../cursor_shape.c:68
-msgid "E545: Missing colon"
-msgstr "E545: ':' manquant"
+msgid "E902: Cannot connect to port"
+msgstr "E902: Impossible de se connecter au port"
-#: ../cursor_shape.c:70 ../cursor_shape.c:94
-msgid "E546: Illegal mode"
-msgstr "E546: Mode non autoris้"
+msgid "E901: gethostbyname() in channel_open()"
+msgstr "E901: gethostbyname() dans channel_open()"
-#: ../cursor_shape.c:134
-msgid "E548: digit expected"
-msgstr "E548: chiffre attendu"
+msgid "E898: socket() in channel_open()"
+msgstr "E898: socket() dans channel_open()"
-#: ../cursor_shape.c:138
-msgid "E549: Illegal percentage"
-msgstr "E549: Pourcentage non autoris้"
+msgid "E903: received command with non-string argument"
+msgstr "E903: commande re็ue avec un argument qui n'est pas une cha๎ne"
+
+msgid "E904: last argument for expr/call must be a number"
+msgstr "E904: le dernier argument de expr/call doit ๊tre un nombre"
+
+msgid "E904: third argument for call must be a list"
+msgstr "E904: le troisi่me argument de \"call\" doit ๊tre une liste"
+
+#, c-format
+msgid "E905: received unknown command: %s"
+msgstr "E905: commande inconnue re็ue : %s"
+
+#, c-format
+msgid "E630: %s(): write while not connected"
+msgstr "E630: %s() : ้criture sans ๊tre connect้"
+
+#, c-format
+msgid "E631: %s(): write failed"
+msgstr "E631: %s() : erreur d'้criture"
+
+#, c-format
+msgid "E917: Cannot use a callback with %s()"
+msgstr "E917: Impossible d'utiliser un callback avec %s()"
+
+msgid "E912: cannot use ch_evalexpr()/ch_sendexpr() with a raw or nl channel"
+msgstr ""
+"E912: Impossible d'utiliser ch_evalexpr()/ch_sendexpr() avec un canal brut "
+"ou nl"
+
+msgid "E906: not an open channel"
+msgstr "E906: pas un canal ouvert"
+
+msgid "E920: _io file requires _name to be set"
+msgstr "E920: fichier _io n้cessite _name"
+
+msgid "E915: in_io buffer requires in_buf or in_name to be set"
+msgstr "E915: tampon in_io n้cessite in_buf ou in_name "
+
+#, c-format
+msgid "E918: buffer must be loaded: %s"
+msgstr "E918: le tampon doit ๊tre charg้ : %s"
+
+msgid "E821: File is encrypted with unknown method"
+msgstr "E821: Le fichier est chiffr้ avec une m้thode inconnue"
+
+msgid "Warning: Using a weak encryption method; see :help 'cm'"
+msgstr ""
+"Alerte : utilisation d'une m้thode de chiffrage faible ; consultez :help 'cm'"
+
+msgid "Enter encryption key: "
+msgstr "Tapez la cl้ de chiffrement : "
+
+msgid "Enter same key again: "
+msgstr "Tapez la cl้ เ nouveau : "
+
+msgid "Keys don't match!"
+msgstr "Les cl้s ne correspondent pas !"
+
+msgid "[crypted]"
+msgstr "[chiffr้]"
+
+#, c-format
+msgid "E720: Missing colon in Dictionary: %s"
+msgstr "E720: Il manque ':' dans le Dictionnaire %s"
+
+#, c-format
+msgid "E721: Duplicate key in Dictionary: \"%s\""
+msgstr "E721: Cl้ dupliqu้e dans le Dictionnaire : %s"
+
+#, c-format
+msgid "E722: Missing comma in Dictionary: %s"
+msgstr "E722: Il manque une virgule dans le Dictionnaire : %s"
+
+#, c-format
+msgid "E723: Missing end of Dictionary '}': %s"
+msgstr "E723: Il manque '}' เ la fin du Dictionnaire : %s"
+
+msgid "extend() argument"
+msgstr "argument de extend()"
-# AB - Je n'ai pas trouv้ de traduction satisfaisante au verbe "diff". Comme
-# Vim fait en pratique appel au programme "diff" pour evaluer les
-# diff้rences entre fichiers, "to diff" a ้t้ traduit par "utiliser diff"
-# et d'autres expressions appropri้es.
-#: ../diff.c:146
#, c-format
-msgid "E96: Can not diff more than %<PRId64> buffers"
-msgstr "E96: Impossible d'utiliser diff sur plus de %<PRId64> tampons"
+msgid "E737: Key already exists: %s"
+msgstr "E737: La cl้ existe d้jเ : %s"
+
+#, c-format
+msgid "E96: Cannot diff more than %ld buffers"
+msgstr "E96: Impossible d'utiliser diff sur plus de %ld tampons"
-#: ../diff.c:753
msgid "E810: Cannot read or write temp files"
msgstr "E810: Impossible de lire ou ้crire des fichiers temporaires"
# AB - La version fran็aise est meilleure que la version anglaise.
-#: ../diff.c:755
msgid "E97: Cannot create diffs"
msgstr "E97: diff ne fonctionne pas"
-#: ../diff.c:966
+msgid "Patch file"
+msgstr "Fichier rustine"
+
msgid "E816: Cannot read patch output"
msgstr "E816: Le fichier interm้diaire produit par patch n'a pu ๊tre lu"
-#: ../diff.c:1220
msgid "E98: Cannot read diff output"
msgstr "E98: Le fichier interm้diaire produit par diff n'a pu ๊tre lu"
-#: ../diff.c:2081
msgid "E99: Current buffer is not in diff mode"
msgstr "E99: Le tampon courant n'est pas en mode diff"
-#: ../diff.c:2100
msgid "E793: No other buffer in diff mode is modifiable"
msgstr "E793: Aucun autre tampon en mode diff n'est modifiable"
-#: ../diff.c:2102
msgid "E100: No other buffer in diff mode"
msgstr "E100: Aucun autre tampon n'est en mode diff"
# AB - La version fran็aise est meilleure que la version anglaise, mais elle
# peut ๊tre am้lior้e.
-#: ../diff.c:2112
msgid "E101: More than two buffers in diff mode, don't know which one to use"
msgstr "E101: Plus de deux tampons sont en mode diff, soyez plus pr้cis"
-#: ../diff.c:2141
#, c-format
msgid "E102: Can't find buffer \"%s\""
msgstr "E102: Le tampon %s est introuvable"
-#: ../diff.c:2152
#, c-format
msgid "E103: Buffer \"%s\" is not in diff mode"
msgstr "E103: Le tampon %s n'est pas en mode diff"
-#: ../diff.c:2193
msgid "E787: Buffer changed unexpectedly"
msgstr "E787: Le tampon a ้t้ modifi้ inopin้ment"
# AB - Je cherche une traduction plus concise pour "escape".
-#: ../digraph.c:1598
msgid "E104: Escape not allowed in digraph"
msgstr "E104: Un digraphe ne peut contenir le caract่re d'้chappement"
# AB - La version fran็aise est trop verbeuse.
-#: ../digraph.c:1760
msgid "E544: Keymap file not found"
msgstr "E544: Le fichier descripteur de clavier est introuvable"
# AB - La version fran็aise est meilleure que la version anglaise.
-#: ../digraph.c:1785
msgid "E105: Using :loadkeymap not in a sourced file"
msgstr "E105: :loadkeymap ne peut ๊tre utilis้ que dans un script Vim"
-#: ../digraph.c:1821
msgid "E791: Empty keymap entry"
msgstr "E791: Entr้e du descripteur de clavier (keymap) vide"
# AB - Remplacer "compl้tion" par "compl่tement" ? Voir l'้thymologie
# d'"accr้tion".
-#: ../edit.c:82
msgid " Keyword completion (^N^P)"
msgstr " Compl่tement de mot-cl้ (^N^P)"
# DB - todo : Faut-il une majuscule เ "mode" ?
-#. ctrl_x_mode == 0, ^P/^N compl.
-#: ../edit.c:83
msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
msgstr " mode ^X (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-#: ../edit.c:85
msgid " Whole line completion (^L^N^P)"
msgstr " Compl่tement de ligne enti่re (^L^N^P)"
-#: ../edit.c:86
msgid " File name completion (^F^N^P)"
msgstr " Compl่tement de nom de fichier (^F^N^P)"
-#: ../edit.c:87
msgid " Tag completion (^]^N^P)"
msgstr " Compl่tement de marqueur (^]^N^P)"
# AB - J'ai d๛ avoir une bonne raison de faire une version fran็aise aussi
# diff้rente de la version anglaise. Il me faut la retrouver.
# DB - TODO
-#: ../edit.c:88
msgid " Path pattern completion (^N^P)"
msgstr " Compl่tement global de mot-cl้ (^N^P)"
-#: ../edit.c:89
msgid " Definition completion (^D^N^P)"
msgstr " Compl่tement de d้finition (^D^N^P)"
# AB - Trouver une meilleure formulation que "selon le".
# DB : proposition : "avec"
-#: ../edit.c:91
msgid " Dictionary completion (^K^N^P)"
msgstr " Compl่tement avec le dictionnaire (^K^N^P)"
# AB - Trouver une meilleure formulation que "selon le".
-#: ../edit.c:92
msgid " Thesaurus completion (^T^N^P)"
msgstr " Compl่tement avec le th้saurus (^T^N^P)"
# AB - La version fran็aise est meilleure que la version anglaise.
# DB : Suggestion.
-#: ../edit.c:93
msgid " Command-line completion (^V^N^P)"
msgstr " Compl่tement de ligne de commande (^V^N^P)"
-#: ../edit.c:94
msgid " User defined completion (^U^N^P)"
msgstr " Compl่tement d้fini par l'utilisateur (^U^N^P)"
# DB : On doit pouvoir trouver nettement mieux que ็a.
-#: ../edit.c:95
msgid " Omni completion (^O^N^P)"
msgstr " Compl่tement selon le type de fichier (Omni) (^O^N^P)"
-#: ../edit.c:96
msgid " Spelling suggestion (s^N^P)"
msgstr " Suggestion d'orthographe (s^N^P)"
-#: ../edit.c:97
msgid " Keyword Local completion (^N^P)"
msgstr " Compl่tement local de mot-cl้ (^N/^P)"
@@ -439,290 +457,168 @@ msgstr " Compl่tement local de mot-cl้ (^N/^P)"
# Il faut ้viter de le faire trop long. Je pense que la version fran็aise
# est suffisamment compr้hensible dans le contexte dans lequel elle est
# affich้e.
-#: ../edit.c:100
msgid "Hit end of paragraph"
msgstr "Fin du paragraphe"
-#: ../edit.c:101
msgid "E839: Completion function changed window"
msgstr "E839: La fonction de compl่tement a chang้ la fen๊tre"
-#: ../edit.c:102
msgid "E840: Completion function deleted text"
msgstr "E840: La fonction de compl่tement a effac้ du texte"
-#: ../edit.c:1847
msgid "'dictionary' option is empty"
msgstr "L'option 'dictionary' est vide"
-#: ../edit.c:1848
msgid "'thesaurus' option is empty"
msgstr "L'option 'thesaurus' est vide"
-#: ../edit.c:2655
#, c-format
msgid "Scanning dictionary: %s"
msgstr "Examen du dictionnaire : %s"
-#: ../edit.c:3079
msgid " (insert) Scroll (^E/^Y)"
msgstr " (insertion) D้filement (^E/^Y)"
-#: ../edit.c:3081
msgid " (replace) Scroll (^E/^Y)"
msgstr " (remplacement) D้filement (^E/^Y)"
-#: ../edit.c:3587
#, c-format
msgid "Scanning: %s"
msgstr "Examen : %s"
-#: ../edit.c:3614
msgid "Scanning tags."
msgstr "Examen des marqueurs."
+msgid "match in file"
+msgstr "correspondance dans le fichier"
+
# AB - Cette cha๎ne de caract่res est ajout้e en d้but de ligne lorsqu'une
# op้ration de compl้tion est r้p้t้e (typiquement avec CTRL-X CTRL-N).
# Que ce soit en anglais ou en fran็ais, il y a un probl่me de majuscules.
# Bien qu'insatisfaisante, cette traduction semble optimale.
-#: ../edit.c:4519
msgid " Adding"
msgstr " Ajout"
-#. showmode might reset the internal line pointers, so it must
-#. * be called before line = ml_get(), or when this address is no
-#. * longer needed. -- Acevedo.
-#.
-#: ../edit.c:4562
msgid "-- Searching..."
msgstr "-- Recherche en cours..."
# AB - Ce texte s'ajoute เ la fin d'un des messages de compl้tion ci-dessus.
# AB - Faut-il utiliser "origine" ou "originel" au lieu d'"original" ?
# DB : Suggestion.
-#: ../edit.c:4618
msgid "Back at original"
msgstr "Retour au point de d้part"
# AB - Ce texte s'ajoute เ la fin d'un des messages de compl้tion ci-dessus.
-#: ../edit.c:4621
msgid "Word from other line"
msgstr "Mot d'une autre ligne"
# AB - Ce texte s'ajoute เ la fin d'un des messages de compl้tion ci-dessus.
-#: ../edit.c:4624
msgid "The only match"
msgstr "La seule correspondance"
# AB - Ce texte s'ajoute เ la fin d'un des messages de compl้tion ci-dessus.
# AB - Faut-il remplacer "sur" par "de" ?
# DB : Pour moi, non.
-#: ../edit.c:4680
#, c-format
msgid "match %d of %d"
msgstr "Correspondance %d sur %d"
# AB - Ce texte s'ajoute เ la fin d'un des messages de compl้tion ci-dessus.
# DB - todo : la VO n'a pas de majuscule.
-#: ../edit.c:4684
#, c-format
msgid "match %d"
msgstr "Correspondance %d"
-#: ../eval.c:137
msgid "E18: Unexpected characters in :let"
msgstr "E18: Caract่res inattendus avant '='"
-#: ../eval.c:138
-#, c-format
-msgid "E684: list index out of range: %<PRId64>"
-msgstr "E684: index de Liste hors limites : %<PRId64> au-delเ de la fin"
-
-#: ../eval.c:139
#, c-format
msgid "E121: Undefined variable: %s"
msgstr "E121: Variable non d้finie : %s"
-#: ../eval.c:140
msgid "E111: Missing ']'"
msgstr "E111: ']' manquant"
-#: ../eval.c:141
-#, c-format
-msgid "E686: Argument of %s must be a List"
-msgstr "E686: L'argument de %s doit ๊tre une Liste"
-
-#: ../eval.c:143
-#, c-format
-msgid "E712: Argument of %s must be a List or Dictionary"
-msgstr "E712: L'argument de %s doit ๊tre une Liste ou un Dictionnaire"
-
-#: ../eval.c:144
-msgid "E713: Cannot use empty key for Dictionary"
-msgstr "E713: Impossible d'utiliser une cl้ vide dans un Dictionnaire"
-
-#: ../eval.c:145
-msgid "E714: List required"
-msgstr "E714: Liste requise"
-
-#: ../eval.c:146
-msgid "E715: Dictionary required"
-msgstr "E715: Dictionnaire requis"
-
-# DB : Suggestion
-#: ../eval.c:147
-#, c-format
-msgid "E118: Too many arguments for function: %s"
-msgstr "E118: La fonction %s a re็u trop d'arguments"
-
-#: ../eval.c:148
-#, c-format
-msgid "E716: Key not present in Dictionary: %s"
-msgstr "E716: La cl้ %s n'existe pas dans le Dictionnaire"
-
-#: ../eval.c:150
-#, c-format
-msgid "E122: Function %s already exists, add ! to replace it"
-msgstr "E122: La fonction %s existe d้jเ (ajoutez ! pour la remplacer)"
-
-#: ../eval.c:151
-msgid "E717: Dictionary entry already exists"
-msgstr "E717: Une entr้e du Dictionnaire porte d้jเ ce nom"
-
-#: ../eval.c:152
-msgid "E718: Funcref required"
-msgstr "E718: R้f้rence de fonction (Funcref) requise"
-
-#: ../eval.c:153
msgid "E719: Cannot use [:] with a Dictionary"
msgstr "E719: Utilisation de [:] impossible avec un Dictionnaire"
-#: ../eval.c:154
#, c-format
msgid "E734: Wrong variable type for %s="
msgstr "E734: Type de variable erron้ avec %s="
-#: ../eval.c:155
-#, c-format
-msgid "E130: Unknown function: %s"
-msgstr "E130: Fonction inconnue : %s"
-
-#: ../eval.c:156
#, c-format
msgid "E461: Illegal variable name: %s"
msgstr "E461: Nom de variable invalide : %s"
-#: ../eval.c:157
msgid "E806: using Float as a String"
msgstr "E806: Utilisation d'un Flottant comme une Cha๎ne"
# DB - todo : trouver mieux que "destinations".
-#: ../eval.c:1830
msgid "E687: Less targets than List items"
msgstr "E687: Moins de destinations que d'้l้ments dans la Liste"
# DB - todo : trouver mieux que "destinations".
-#: ../eval.c:1834
msgid "E688: More targets than List items"
msgstr "E688: Plus de destinations que d'้l้ments dans la Liste"
-#: ../eval.c:1906
msgid "Double ; in list of variables"
msgstr "Double ; dans une liste de variables"
-#: ../eval.c:2078
#, c-format
msgid "E738: Can't list variables for %s"
msgstr "E738: Impossible de lister les variables de %s"
-#: ../eval.c:2391
msgid "E689: Can only index a List or Dictionary"
msgstr "E689: Seul une Liste ou un Dictionnaire peut ๊tre index้"
-#: ../eval.c:2396
msgid "E708: [:] must come last"
msgstr "E708: [:] ne peut ๊tre sp้cifi้ qu'en dernier"
-#: ../eval.c:2439
msgid "E709: [:] requires a List value"
-msgstr "E709: [:] requiert une Liste"
+msgstr "E709: [:] n้cessite une Liste"
-#: ../eval.c:2674
msgid "E710: List value has more items than target"
msgstr "E710: La Liste a plus d'้l้ments que la destination"
-#: ../eval.c:2678
msgid "E711: List value has not enough items"
msgstr "E711: La Liste n'a pas assez d'้l้ments"
-#: ../eval.c:2867
msgid "E690: Missing \"in\" after :for"
msgstr "E690: \"in\" manquant apr่s :for"
-#: ../eval.c:3063
-#, c-format
-msgid "E107: Missing parentheses: %s"
-msgstr "E107: Parenth่ses manquantes : %s"
-
-#: ../eval.c:3263
#, c-format
msgid "E108: No such variable: \"%s\""
msgstr "E108: Variable inexistante : %s"
-#: ../eval.c:3333
+#, c-format
+msgid "E940: Cannot lock or unlock variable %s"
+msgstr "E940: Impossible de (d้)verrouiller la variable %s"
+
msgid "E743: variable nested too deep for (un)lock"
msgstr "E743: variable trop imbriqu้e pour la (d้)verrouiller"
# AB - Je suis partag้ entre la concision d'une traduction assez litt้rale et
# la lourdeur d'une traduction plus correcte.
-#: ../eval.c:3630
msgid "E109: Missing ':' after '?'"
msgstr "E109: Il manque ':' apr่s '?'"
-#: ../eval.c:3893
-msgid "E691: Can only compare List with List"
-msgstr "E691: Une Liste ne peut ๊tre compar้e qu'avec une Liste"
-
-#: ../eval.c:3895
-msgid "E692: Invalid operation for Lists"
-msgstr "E692: Op้ration invalide avec les Listes"
-
-#: ../eval.c:3915
-msgid "E735: Can only compare Dictionary with Dictionary"
-msgstr "E735: Un Dictionnaire ne peut ๊tre compar้ qu'avec un Dictionnaire"
-
-#: ../eval.c:3917
-msgid "E736: Invalid operation for Dictionary"
-msgstr "E736: Op้ration invalide avec les Dictionnaires"
-
-# DB - todo : Traduction valable (et courte) pour Funcref ?
-#: ../eval.c:3932
-msgid "E693: Can only compare Funcref with Funcref"
-msgstr "E693: Une Funcref ne peut ๊tre compar้e qu'เ une Funcref"
-
-#: ../eval.c:3934
-msgid "E694: Invalid operation for Funcrefs"
-msgstr "E694: Op้ration invalide avec les Funcrefs"
-
-#: ../eval.c:4277
msgid "E804: Cannot use '%' with Float"
msgstr "E804: Impossible d'utiliser '%' avec un Flottant"
-#: ../eval.c:4478
msgid "E110: Missing ')'"
msgstr "E110: ')' manquant"
-#: ../eval.c:4609
msgid "E695: Cannot index a Funcref"
msgstr "E695: Impossible d'indexer une Funcref"
+msgid "E909: Cannot index a special variable"
+msgstr "E909: Impossible d'indexer une variable sp้ciale"
+
# AB - La version fran็aise est meilleure que la version anglaise.
-#: ../eval.c:4839
#, c-format
msgid "E112: Option name missing: %s"
msgstr "E112: Il manque un nom d'option apr่s %s"
-#: ../eval.c:4855
#, c-format
msgid "E113: Unknown option: %s"
msgstr "E113: Option inconnue : %s"
@@ -730,464 +626,335 @@ msgstr "E113: Option inconnue : %s"
# AB - La version fran็aise est meilleure que la version anglaise, qui est
# erron้e, d'ailleurs : il s'agit d'une "double quote" et non d'une
# "quote".
-#: ../eval.c:4904
#, c-format
msgid "E114: Missing quote: %s"
msgstr "E114: Il manque \" เ la fin de %s"
# AB - La version fran็aise est meilleure que la version anglaise.
-#: ../eval.c:5020
#, c-format
msgid "E115: Missing quote: %s"
msgstr "E115: Il manque ' เ la fin de %s"
-#: ../eval.c:5084
-#, c-format
-msgid "E696: Missing comma in List: %s"
-msgstr "E696: Il manque une virgule dans la Liste %s"
-
-#: ../eval.c:5091
-#, c-format
-msgid "E697: Missing end of List ']': %s"
-msgstr "E697: Il manque ']' เ la fin de la Liste %s"
-
-#: ../eval.c:5750
msgid "Not enough memory to set references, garbage collection aborted!"
msgstr ""
"Pas assez de m้moire pour les r้f้rences, arr๊t du ramassage de mi่tes !"
-#: ../eval.c:6475
-#, c-format
-msgid "E720: Missing colon in Dictionary: %s"
-msgstr "E720: Il manque ':' dans le Dictionnaire %s"
+msgid "E724: variable nested too deep for displaying"
+msgstr "E724: variable trop imbriqu้e pour ๊tre affich้e"
-#: ../eval.c:6499
-#, c-format
-msgid "E721: Duplicate key in Dictionary: \"%s\""
-msgstr "E721: Cl้ \"%s\" dupliqu้e dans le Dictionnaire"
+msgid "E805: Using a Float as a Number"
+msgstr "E805: Utilisation d'un Flottant comme un Nombre"
-#: ../eval.c:6517
-#, c-format
-msgid "E722: Missing comma in Dictionary: %s"
-msgstr "E722: Il manque une virgule dans le Dictionnaire %s"
+msgid "E703: Using a Funcref as a Number"
+msgstr "E703: Utilisation d'une Funcref comme un Nombre"
-#: ../eval.c:6524
-#, c-format
-msgid "E723: Missing end of Dictionary '}': %s"
-msgstr "E723: Il manque '}' เ la fin du Dictionnaire %s"
+msgid "E745: Using a List as a Number"
+msgstr "E745: Utilisation d'une Liste comme un Nombre"
-#: ../eval.c:6555
-msgid "E724: variable nested too deep for displaying"
-msgstr "E724: variable trop imbriqu้e pour ๊tre affich้e"
+msgid "E728: Using a Dictionary as a Number"
+msgstr "E728: Utilisation d'un Dictionnaire comme un Nombre"
+
+msgid "E910: Using a Job as a Number"
+msgstr "E910: Utilisation d'une Tโche comme un Nombre"
+
+msgid "E913: Using a Channel as a Number"
+msgstr "E913: Utilisation d'un Canal comme un Nombre"
+
+msgid "E891: Using a Funcref as a Float"
+msgstr "E891: Utilisation d'une Funcref comme un Flottant"
+
+msgid "E892: Using a String as a Float"
+msgstr "E892: Utilisation d'une Cha๎ne comme un Flottant"
+
+msgid "E893: Using a List as a Float"
+msgstr "E893: Utilisation d'une Liste comme un Flottant"
+
+msgid "E894: Using a Dictionary as a Float"
+msgstr "E894: Utilisation d'un Dictionnaire comme un Flottant"
+
+msgid "E907: Using a special value as a Float"
+msgstr "E907: Utilisation d'une valeur sp้ciale comme un Flottant"
+
+msgid "E911: Using a Job as a Float"
+msgstr "E911: Utilisation d'une Tโche comme un Flottant"
+
+msgid "E914: Using a Channel as a Float"
+msgstr "E914: Utilisation d'un Canal comme un Flottant"
+
+msgid "E729: using Funcref as a String"
+msgstr "E729: Utilisation d'une Funcref comme une Cha๎ne"
+
+msgid "E730: using List as a String"
+msgstr "E730: Utilisation d'une Liste comme une Cha๎ne"
+
+msgid "E731: using Dictionary as a String"
+msgstr "E731: Utilisation d'un Dictionnaire comme une Cha๎ne"
+
+msgid "E908: using an invalid value as a String"
+msgstr "E908: Utilisation d'une valeur invalide comme une Cha๎ne"
-#: ../eval.c:7188
#, c-format
-msgid "E740: Too many arguments for function %s"
-msgstr "E740: Trop d'arguments pour la fonction %s"
+msgid "E795: Cannot delete variable %s"
+msgstr "E795: Impossible de supprimer la variable %s"
-#: ../eval.c:7190
#, c-format
-msgid "E116: Invalid arguments for function %s"
-msgstr "E116: Arguments invalides pour la fonction %s"
+msgid "E704: Funcref variable name must start with a capital: %s"
+msgstr "E704: Le nom d'une Funcref doit commencer par une majuscule : %s"
-#: ../eval.c:7377
#, c-format
-msgid "E117: Unknown function: %s"
-msgstr "E117: Fonction inconnue : %s"
+msgid "E705: Variable name conflicts with existing function: %s"
+msgstr "E705: Le nom d'une variable entre en conflit avec la fonction %s"
-#: ../eval.c:7383
#, c-format
-msgid "E119: Not enough arguments for function: %s"
-msgstr "E119: La fonction %s n'a pas re็u assez d'arguments"
+msgid "E741: Value is locked: %s"
+msgstr "E741: La valeur de %s est verrouill้e"
+
+msgid "Unknown"
+msgstr "Inconnu"
-#: ../eval.c:7387
#, c-format
-msgid "E120: Using <SID> not in a script context: %s"
-msgstr "E120: <SID> utilis้ en dehors d'un script : %s"
+msgid "E742: Cannot change value of %s"
+msgstr "E742: Impossible de modifier la valeur de %s"
+
+msgid "E698: variable nested too deep for making a copy"
+msgstr "E698: variable trop imbriqu้e pour en faire une copie"
+
+# AB - La version fran็aise est capitalis้e pour ๊tre en accord avec les autres
+# commentaires enregistr้s dans le fichier viminfo.
+msgid ""
+"\n"
+"# global variables:\n"
+msgstr ""
+"\n"
+"# Variables globales:\n"
+
+# DB - Plus pr้cis ("la derni่re fois") ?
+msgid ""
+"\n"
+"\tLast set from "
+msgstr ""
+"\n"
+"\tModifi้ la derni่re fois dans "
+
+msgid "E691: Can only compare List with List"
+msgstr "E691: Une Liste ne peut ๊tre compar้e qu'avec une Liste"
+
+msgid "E692: Invalid operation for List"
+msgstr "E692: Op้ration invalide avec les Liste"
+
+msgid "E735: Can only compare Dictionary with Dictionary"
+msgstr "E735: Un Dictionnaire ne peut ๊tre compar้ qu'avec un Dictionnaire"
+
+msgid "E736: Invalid operation for Dictionary"
+msgstr "E736: Op้ration invalide avec les Dictionnaires"
+
+msgid "E694: Invalid operation for Funcrefs"
+msgstr "E694: Op้ration invalide avec les Funcrefs"
+
+msgid "map() argument"
+msgstr "argument de map()"
+
+msgid "filter() argument"
+msgstr "argument de filter()"
-#: ../eval.c:7391
#, c-format
-msgid "E725: Calling dict function without Dictionary: %s"
-msgstr "E725: Appel d'une fonction ซ dict ป sans Dictionnaire : %s"
+msgid "E686: Argument of %s must be a List"
+msgstr "E686: L'argument de %s doit ๊tre une Liste"
+
+msgid "E928: String required"
+msgstr "E928: Cha๎ne requis"
-#: ../eval.c:7453
msgid "E808: Number or Float required"
msgstr "E808: Nombre ou Flottant requis"
-#: ../eval.c:7503
msgid "add() argument"
msgstr "argument de add()"
-#: ../eval.c:7907
-msgid "E699: Too many arguments"
-msgstr "E699: Trop d'arguments"
-
-#: ../eval.c:8073
msgid "E785: complete() can only be used in Insert mode"
msgstr "E785: complete() n'est utilisable que dans le mode Insertion"
# AB - Texte par d้faut du bouton de la bo๎te de dialogue affich้e par la
# fonction confirm().
-#: ../eval.c:8156
msgid "&Ok"
msgstr "&Ok"
-#: ../eval.c:8692
-msgid "extend() argument"
-msgstr "argument de extend()"
-
-#: ../eval.c:9345
#, c-format
-msgid "E737: Key already exists: %s"
-msgstr "E737: un mappage existe d้jเ pour %s"
+msgid "+-%s%3ld line: "
+msgid_plural "+-%s%3ld lines: "
+msgstr[0] "+-%s%3ld ligne : "
+msgstr[1] "+-%s%3ld lignes : "
-#: ../eval.c:8915
-msgid "map() argument"
-msgstr "argument de map()"
-
-#: ../eval.c:8916
-msgid "filter() argument"
-msgstr "argument de filter()"
-
-#: ../eval.c:9229
-#, c-format
-msgid "+-%s%3ld lines: "
-msgstr "+-%s%3ld lignes : "
-
-#: ../eval.c:9291
#, c-format
msgid "E700: Unknown function: %s"
msgstr "E700: Fonction inconnue : %s"
+msgid "E922: expected a dict"
+msgstr "E922: dictionnaire attendu"
+
+msgid "E923: Second argument of function() must be a list or a dict"
+msgstr ""
+"E923: Le second argument de function() doit ๊tre une liste ou un dictionnaire"
+
+# AB - Textes des boutons de la bo๎te de dialogue affich้e par inputdialog().
+msgid ""
+"&OK\n"
+"&Cancel"
+msgstr ""
+"&Ok\n"
+"&Annuler"
+
# AB - La version fran็aise est meilleure que la version anglaise.
-#: ../eval.c:10729
msgid "called inputrestore() more often than inputsave()"
msgstr "inputrestore() a ้t้ appel้ plus de fois qu'inputsave()"
-#: ../eval.c:10771
msgid "insert() argument"
msgstr "argument de insert()"
-#: ../eval.c:10841
msgid "E786: Range not allowed"
msgstr "E786: Les plages ne sont pas autoris้es"
-#: ../eval.c:11140
+msgid "E916: not a valid job"
+msgstr "E916: tโche invalide"
+
msgid "E701: Invalid type for len()"
msgstr "E701: Type invalide avec len()"
-#: ../eval.c:11980
+msgid "E957: Invalid window number"
+msgstr "E957: num้ro de fen๊tre invalide"
+
+#, c-format
+msgid "E798: ID is reserved for \":match\": %ld"
+msgstr "E798: ID est r้serv้ pour \":match\": %ld"
+
msgid "E726: Stride is zero"
msgstr "E726: Le pas est nul"
-#: ../eval.c:11982
msgid "E727: Start past end"
msgstr "E727: D้but au-delเ de la fin"
-#: ../eval.c:12024 ../eval.c:15297
msgid "<empty>"
msgstr "<vide>"
-#: ../eval.c:12282
+msgid "E240: No connection to the X server"
+msgstr "E240: Pas de connexion au serveur X"
+
+# AB - La version fran็aise est meilleure que la version anglaise.
+#, c-format
+msgid "E241: Unable to send to %s"
+msgstr "E241: L'envoi au serveur %s a ้chou้"
+
+msgid "E277: Unable to read a server reply"
+msgstr "E277: Impossible de lire la r้ponse du serveur"
+
+msgid "E941: already started a server"
+msgstr "E941: serveur d้jเ d้marr้"
+
+msgid "E942: +clientserver feature not available"
+msgstr "E942: La fonctionnalit้ +clientserver n'est pas disponible"
+
msgid "remove() argument"
msgstr "argument de remove()"
-#: ../eval.c:12466
msgid "E655: Too many symbolic links (cycle?)"
msgstr "E655: Trop de liens symboliques (cycle ?)"
-#: ../eval.c:12593
msgid "reverse() argument"
msgstr "argument de reverse()"
-#: ../eval.c:13721
+# AB - La version fran็aise est meilleure que la version anglaise.
+msgid "E258: Unable to send to client"
+msgstr "E258: La r้ponse n'a pas pu ๊tre envoy้e au client"
+
+#, c-format
+msgid "E927: Invalid action: '%s'"
+msgstr "E927: Action invalide : ซ %s ป"
+
msgid "sort() argument"
msgstr "argument de sort()"
-#: ../eval.c:13721
-#, fuzzy
msgid "uniq() argument"
-msgstr "argument de add()"
+msgstr "argument de uniq()"
-#: ../eval.c:13776
msgid "E702: Sort compare function failed"
msgstr "E702: La fonction de comparaison de sort() a ้chou้"
-#: ../eval.c:13806
-#, fuzzy
msgid "E882: Uniq compare function failed"
-msgstr "E702: La fonction de comparaison de sort() a ้chou้"
+msgstr "E882: La fonction de comparaison de uniq() a ้chou้"
-#: ../eval.c:14085
msgid "(Invalid)"
msgstr "(Invalide)"
-#: ../eval.c:14590
-msgid "E677: Error writing temp file"
-msgstr "E677: Erreur lors de l'้criture du fichier temporaire"
-
-#: ../eval.c:16159
-msgid "E805: Using a Float as a Number"
-msgstr "E805: Utilisation d'un Flottant comme un Nombre"
-
-#: ../eval.c:16162
-msgid "E703: Using a Funcref as a Number"
-msgstr "E703: Utilisation d'une Funcref comme un Nombre"
-
-#: ../eval.c:16170
-msgid "E745: Using a List as a Number"
-msgstr "E745: Utilisation d'une Liste comme un Nombre"
-
-#: ../eval.c:16173
-msgid "E728: Using a Dictionary as a Number"
-msgstr "E728: Utilisation d'un Dictionnaire comme un Nombre"
-
-#: ../eval.c:16259
-msgid "E729: using Funcref as a String"
-msgstr "E729: Utilisation d'une Funcref comme une Cha๎ne"
-
-#: ../eval.c:16262
-msgid "E730: using List as a String"
-msgstr "E730: Utilisation d'une Liste comme une Cha๎ne"
-
-#: ../eval.c:16265
-msgid "E731: using Dictionary as a String"
-msgstr "E731: Utilisation d'un Dictionnaire comme une Cha๎ne"
-
-# DB : On doit pouvoir trouver nettement mieux que ็a.
-#: ../eval.c:16619
-#, c-format
-msgid "E706: Variable type mismatch for: %s"
-msgstr "E706: Type de variable incoh้rent pour %s"
-
-#: ../eval.c:16705
-#, c-format
-msgid "E795: Cannot delete variable %s"
-msgstr "E795: Impossible de supprimer la variable %s"
-
-#: ../eval.c:16724
-#, c-format
-msgid "E704: Funcref variable name must start with a capital: %s"
-msgstr "E704: Le nom d'une Funcref doit commencer par une majuscule : %s"
-
-#: ../eval.c:16732
-#, c-format
-msgid "E705: Variable name conflicts with existing function: %s"
-msgstr "E705: Le nom d'une variable entre en conflit avec la fonction %s"
-
-#: ../eval.c:16763
-#, c-format
-msgid "E741: Value is locked: %s"
-msgstr "E741: La valeur de %s est verrouill้e"
-
-#: ../eval.c:16764 ../eval.c:16769 ../message.c:1839
-msgid "Unknown"
-msgstr "Inconnu"
-
-#: ../eval.c:16768
-#, c-format
-msgid "E742: Cannot change value of %s"
-msgstr "E742: Impossible de modifier la valeur de %s"
-
-#: ../eval.c:16838
-msgid "E698: variable nested too deep for making a copy"
-msgstr "E698: variable trop imbriqu้e pour en faire une copie"
-
-#: ../eval.c:17249
-#, c-format
-msgid "E123: Undefined function: %s"
-msgstr "E123: Fonction non d้finie : %s"
-
-# AB - La version fran็aise est plus consistante que la version anglaise.
-# AB - Je suis partag้ entre la concision d'une traduction assez litt้rale et
-# la lourdeur d'une traduction plus correcte.
-#: ../eval.c:17260
#, c-format
-msgid "E124: Missing '(': %s"
-msgstr "E124: Il manque '(' apr่s %s"
-
-#: ../eval.c:17293
-msgid "E862: Cannot use g: here"
-msgstr "E862: Impossible d'utiliser g: ici"
-
-#: ../eval.c:17312
-#, c-format
-msgid "E125: Illegal argument: %s"
-msgstr "E125: Argument invalide : %s"
-
-#: ../eval.c:17323
-#, c-format
-msgid "E853: Duplicate argument name: %s"
-msgstr "E853: Nom d'argument dupliqu้ : %s"
-
-#: ../eval.c:17416
-msgid "E126: Missing :endfunction"
-msgstr "E126: Il manque :endfunction"
-
-#: ../eval.c:17537
-#, c-format
-msgid "E707: Function name conflicts with variable: %s"
-msgstr "E707: Le nom de fonction entre en conflit avec la variable : %s"
+msgid "E935: invalid submatch number: %d"
+msgstr "E935: num้ro de submatch invalide : %d"
-#: ../eval.c:17549
-#, c-format
-msgid "E127: Cannot redefine function %s: It is in use"
-msgstr "E127: Impossible de red้finir fonction %s : d้jเ utilis้e"
-
-# DB - Le contenu du "c-format" est le nom de la fonction.
-#: ../eval.c:17604
-#, c-format
-msgid "E746: Function name does not match script file name: %s"
-msgstr "E746: Le nom de la fonction %s ne correspond pas le nom du script"
-
-#: ../eval.c:17716
-msgid "E129: Function name required"
-msgstr "E129: Nom de fonction requis"
-
-#: ../eval.c:17824
-#, fuzzy, c-format
-msgid "E128: Function name must start with a capital or \"s:\": %s"
-msgstr "E128: La fonction %s ne commence pas par une majuscule ou contient ':'"
-
-#: ../eval.c:17833
-#, fuzzy, c-format
-msgid "E884: Function name cannot contain a colon: %s"
-msgstr "E128: La fonction %s ne commence pas par une majuscule ou contient ':'"
-
-# AB - Il est difficile de cr้er une version fran็aise qui fasse moins de 80
-# caract่res de long, nom de la fonction compris : "It is in use" est une
-# expression tr่s dense. Traductions possibles : "elle est utilis้e",
-# "elle s'ex้cute" ou "elle est occup้e".
-#: ../eval.c:18336
-#, c-format
-msgid "E131: Cannot delete function %s: It is in use"
-msgstr "E131: Impossible d'effacer %s : cette fonction est utilis้e"
-
-# AB - V้rifier dans la litt้rature technique s'il n'existe pas une meilleure
-# traduction pour "function call depth".
-#: ../eval.c:18441
-msgid "E132: Function call depth is higher than 'maxfuncdepth'"
-msgstr ""
-"E132: La profondeur d'appel de fonction est sup้rieure เ 'maxfuncdepth'"
-
-# AB - Ce texte fait partie d'un message de d้bogage.
-#: ../eval.c:18568
-#, c-format
-msgid "calling %s"
-msgstr "appel de %s"
+msgid "E677: Error writing temp file"
+msgstr "E677: Erreur lors de l'้criture du fichier temporaire"
-# AB - V้rifier.
-#: ../eval.c:18651
-#, c-format
-msgid "%s aborted"
-msgstr "%s annul้e"
+msgid "E921: Invalid callback argument"
+msgstr "E921: Argument de callback invalide"
-# AB - Ce texte fait partie d'un message de d้bogage.
-#: ../eval.c:18653
#, c-format
-msgid "%s returning #%<PRId64>"
-msgstr "%s a retourn้ #%<PRId64>"
+msgid "<%s>%s%s %d, Hex %02x, Oct %03o, Digr %s"
+msgstr "<%s>%s%s %d, Hexa %02x, Octal %03o, Digr %s"
-# AB - Ce texte fait partie d'un message de d้bogage.
-#: ../eval.c:18670
#, c-format
-msgid "%s returning %s"
-msgstr "%s a retourn้ \"%s\""
+msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
+msgstr "<%s>%s%s %d, Hexa %02x, Octal %03o"
-# AB - Ce texte fait partie d'un message de d้bogage.
-#: ../eval.c:18691 ../ex_cmds2.c:2695
#, c-format
-msgid "continuing in %s"
-msgstr "de retour dans %s"
-
-#: ../eval.c:18795
-msgid "E133: :return not inside a function"
-msgstr "E133: :return en dehors d'une fonction"
-
-# AB - La version fran็aise est capitalis้e pour ๊tre en accord avec les autres
-# commentaires enregistr้s dans le fichier viminfo.
-#: ../eval.c:19159
-msgid ""
-"\n"
-"# global variables:\n"
-msgstr ""
-"\n"
-"# Variables globales:\n"
-
-# DB - Plus pr้cis ("la derni่re fois") ?
-#: ../eval.c:19254
-msgid ""
-"\n"
-"\tLast set from "
-msgstr ""
-"\n"
-"\tModifi้ la derni่re fois dans "
+msgid "> %d, Hex %04x, Oct %o, Digr %s"
+msgstr "> %d, Hexa %04x, Octal %o, Digr %s"
-#: ../eval.c:19272
-msgid "No old files"
-msgstr "Aucun vieux fichier"
-
-#: ../ex_cmds.c:122
#, c-format
-msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
-msgstr "<%s>%s%s %d, Hexa %02x, Octal %03o"
+msgid "> %d, Hex %08x, Oct %o, Digr %s"
+msgstr "> %d, Hexa %08x, Octal %o, Digr %s"
-#: ../ex_cmds.c:145
#, c-format
msgid "> %d, Hex %04x, Octal %o"
msgstr "> %d, Hexa %04x, Octal %o"
-#: ../ex_cmds.c:146
#, c-format
msgid "> %d, Hex %08x, Octal %o"
msgstr "> %d, Hexa %08x, Octal %o"
# AB - La version anglaise est tr่s mauvaise, ce qui m'oblige a inventer une
# version fran็aise.
-#: ../ex_cmds.c:684
msgid "E134: Move lines into themselves"
msgstr "E134: La destination est dans la plage d'origine"
-#: ../ex_cmds.c:747
-msgid "1 line moved"
-msgstr "1 ligne d้plac้e"
-
-#: ../ex_cmds.c:749
#, c-format
-msgid "%<PRId64> lines moved"
-msgstr "%<PRId64> lignes d้plac้es"
+msgid "%ld line moved"
+msgid_plural "%ld lines moved"
+msgstr[0] "%ld ligne d้plac้e"
+msgstr[1] "%ld lignes d้plac้es"
-#: ../ex_cmds.c:1175
#, c-format
-msgid "%<PRId64> lines filtered"
-msgstr "%<PRId64> lignes filtr้es"
+msgid "%ld lines filtered"
+msgstr "%ld lignes filtr้es"
# AB - J'ai volontairement omis l'ast้risque initiale car je pense que le
# motif "Filter*" d้crit plus clairement les quatre autocommandes li้es
# au filtrage (FilterReadPre, FilterReadPost, FilterWritePre et
# FilterWritePost) que "*Filter*" que l'on confond avec une tentative de
# mise en valeur.
-#: ../ex_cmds.c:1194
msgid "E135: *Filter* Autocommands must not change current buffer"
msgstr ""
"E135: Les autocommandes Filter* ne doivent pas changer le tampon courant"
# AB - Il faut respecter l'esprit plus que la lettre. Dans le cas pr้sent,
# nettement plus.
-#: ../ex_cmds.c:1244
msgid "[No write since last change]\n"
msgstr "[Attention : tout n'est pas enregistr้]\n"
# AB - Le num้ro et le message d'erreur (%s ci-dessous) et le "num้ro" de ligne
# sont des cha๎nes de caract่res dont le contenu est เ la discr้tion de
# l'appelant de la fonction viminfo_error().
-#: ../ex_cmds.c:1424
#, c-format
msgid "%sviminfo: %s in line: "
msgstr "%sviminfo : %s เ la ligne "
# AB - La version fran็aise est meilleure que la version anglaise.
-#: ../ex_cmds.c:1431
msgid "E136: viminfo: Too many errors, skipping rest of file"
msgstr ""
"E136: Il y a trop d'erreurs ; interruption de la lecture du fichier viminfo"
@@ -1195,30 +962,25 @@ msgstr ""
# AB - Ce texte fait partie d'un message de d้bogage.
# DB - ... dont les valeurs possibles sont les messages
# qui suivent.
-#: ../ex_cmds.c:1458
#, c-format
msgid "Reading viminfo file \"%s\"%s%s%s"
msgstr "Lecture du fichier viminfo \"%s\"%s%s%s"
# AB - Ce texte fait partie d'un message de d้bogage.
# DB - Voir ci-dessus.
-#: ../ex_cmds.c:1460
msgid " info"
msgstr " info"
# AB - Ce texte fait partie d'un message de d้bogage.
# DB - Voir ci-dessus.
-#: ../ex_cmds.c:1461
msgid " marks"
msgstr " marques"
-#: ../ex_cmds.c:1462
msgid " oldfiles"
msgstr " vieux fichiers"
# AB - Ce texte fait partie d'un message de d้bogage.
# DB - Voir ci-dessus.
-#: ../ex_cmds.c:1463
msgid " FAILED"
msgstr " ษCHEC"
@@ -1226,34 +988,35 @@ msgstr " ษCHEC"
# ses droits d'acc่s.
# AB - Le mot "viminfo" a ้t้ retir้ pour que le message ne d้passe pas 80
# caract่res dans le cas courant o๙ %s = /home/12345678/.viminfo
-#. avoid a wait_return for this message, it's annoying
-#: ../ex_cmds.c:1541
#, c-format
msgid "E137: Viminfo file is not writable: %s"
msgstr "E137: L'้criture dans le fichier %s est interdite"
+#, c-format
+msgid "E929: Too many viminfo temp files, like %s!"
+msgstr "E929: Trop de fichiers temporaires viminfo, comme %s!"
+
# AB - Le point d'exclamation est superflu.
# AB - Le mot "viminfo" a ้t้ retir้ pour que le message ne d้passe pas 80
# caract่res dans le cas courant o๙ %s = /home/12345678/.viminfo
-#: ../ex_cmds.c:1626
#, c-format
msgid "E138: Can't write viminfo file %s!"
msgstr "E138: Impossible d'้crire le fichier %s"
# AB - Ce texte est un message de d้bogage.
-#: ../ex_cmds.c:1635
#, c-format
msgid "Writing viminfo file \"%s\""
msgstr "ษcriture du fichier viminfo \"%s\""
-#. Write the info:
-#: ../ex_cmds.c:1720
+#, c-format
+msgid "E886: Can't rename viminfo file to %s!"
+msgstr "E886: Impossible de renommer viminfo en %s"
+
#, c-format
msgid "# This viminfo file was generated by Vim %s.\n"
msgstr "# Ce fichier viminfo a ้t้ g้n้r้ par Vim %s.\n"
# AB - Les deux versions, bien que diff้rentes, se valent.
-#: ../ex_cmds.c:1722
msgid ""
"# You may edit it if you're careful!\n"
"\n"
@@ -1261,58 +1024,61 @@ msgstr ""
"# Vous pouvez l'้diter, mais soyez prudent.\n"
"\n"
-#: ../ex_cmds.c:1723
msgid "# Value of 'encoding' when this file was written\n"
msgstr "# 'encoding' dans lequel ce fichier a ้t้ ้crit\n"
# AB - Ce texte est pass้ en argument เ la fonction viminfo_error().
# AB - "ill้gal" est un terme trop fort เ mon go๛t.
-#: ../ex_cmds.c:1800
msgid "Illegal starting char"
msgstr "Caract่re initial non valide"
+msgid ""
+"\n"
+"# Bar lines, copied verbatim:\n"
+msgstr ""
+"\n"
+"# Lignes commen็ant par |, copi้es litt้ralement :\n"
+
+# AB - Ceci est un titre de bo๎te de dialogue. V้rifier que la version
+# fran็aise est correcte pour les trois r้f้rences ; j'ai un doute quant
+# เ la troisi่me.
+msgid "Save As"
+msgstr "Enregistrer sous - Vim"
+
# AB - Ceci est un contenu de bo๎te de dialogue (้ventuellement en mode texte).
# AB - La version fran็aise est meilleure que la version anglaise.
-#: ../ex_cmds.c:2162
msgid "Write partial file?"
msgstr "Perdre une partie du fichier ?"
# AB - La version fran็aise est nettement meilleure que la version anglaise.
-#: ../ex_cmds.c:2166
msgid "E140: Use ! to write partial buffer"
msgstr ""
"E140: Une partie du fichier serait perdue (ajoutez ! pour passer outre)"
-#: ../ex_cmds.c:2281
#, c-format
msgid "Overwrite existing file \"%s\"?"
msgstr "ษcraser le fichier %s existant ?"
-#: ../ex_cmds.c:2317
#, c-format
msgid "Swap file \"%s\" exists, overwrite anyway?"
msgstr "Le fichier d'้change \"%s\" existe d้jเ, l'้craser ?"
# DB - Un peu long เ mon avis.
-#: ../ex_cmds.c:2326
#, c-format
msgid "E768: Swap file exists: %s (:silent! overrides)"
msgstr "E768: Le fichier d'้change %s existe d้jเ (:silent! pour passer outre)"
-#: ../ex_cmds.c:2381
#, c-format
-msgid "E141: No file name for buffer %<PRId64>"
-msgstr "E141: Pas de nom de fichier pour le tampon %<PRId64>"
+msgid "E141: No file name for buffer %ld"
+msgstr "E141: Pas de nom de fichier pour le tampon %ld"
# AB - Il faut respecter l'esprit plus que la lettre.
-#: ../ex_cmds.c:2412
msgid "E142: File not written: Writing is disabled by 'write' option"
msgstr ""
"E142: L'option 'nowrite' est activ้e et emp๊che toute ้criture du fichier"
# AB - Ceci est un contenu de bo๎te de dialogue (้ventuellement en mode texte).
# AB - "activ้e pour" n'est pas une formulation tr่s heureuse.
-#: ../ex_cmds.c:2434
#, c-format
msgid ""
"'readonly' option is set for \"%s\".\n"
@@ -1321,7 +1087,6 @@ msgstr ""
"L'option 'readonly' est activ้e pour \"%s\".\n"
"Voulez-vous tout de m๊me enregistrer ?"
-#: ../ex_cmds.c:2439
#, c-format
msgid ""
"File permissions of \"%s\" are read-only.\n"
@@ -1332,94 +1097,84 @@ msgstr ""
"Il peut ๊tre possible de l'้crire tout de m๊me.\n"
"Tenter ?"
-#: ../ex_cmds.c:2451
#, c-format
msgid "E505: \"%s\" is read-only (add ! to override)"
msgstr "E505: \"%s\" est en lecture seule (ajoutez ! pour passer outre)"
+# AB - Ceci est un titre de bo๎te de dialogue.
+msgid "Edit File"
+msgstr "Ouvrir un fichier - Vim"
+
# AB - Il faut respecter l'esprit plus que la lettre.
# AB - J'h้site เ ajouter "เ sa cr้ation" apr่s le nom du tampon. Ce message
# devrait n'๊tre affich้ qu'apr่s une tentative d'ouverture de fichier,
# la version actuelle devrait donc suffire.
# DB - Suggestion : "nouveau tampon" ?
-#: ../ex_cmds.c:3120
#, c-format
msgid "E143: Autocommands unexpectedly deleted new buffer %s"
msgstr "E143: Une autocommande a effac้ le nouveau tampon %s"
-#: ../ex_cmds.c:3313
msgid "E144: non-numeric argument to :z"
msgstr "E144: L'argument de :z n'est pas num้rique"
# AB - La version fran็aise fera peut-๊tre mieux passer l'am่re pilule.
# La consultation de l'aide donnera l'explication compl่te เ ceux qui
# ne comprendraient pas เ quoi ce message est d๛.
-#: ../ex_cmds.c:3404
msgid "E145: Shell commands not allowed in rvim"
msgstr "E145: Les commandes externes sont indisponibles dans rvim"
-#: ../ex_cmds.c:3498
msgid "E146: Regular expressions can't be delimited by letters"
msgstr ""
"E146: Les expressions r้guli่res ne peuvent pas ๊tre d้limit้es par des "
"lettres"
-#: ../ex_cmds.c:3964
#, c-format
msgid "replace with %s (y/n/a/q/l/^E/^Y)?"
msgstr "remplacer par %s (y/n/a/q/l/^E/^Y)?"
-#: ../ex_cmds.c:4379
msgid "(Interrupted) "
msgstr "(Interrompu) "
-#: ../ex_cmds.c:4384
-msgid "1 match"
-msgstr "1 correspondance"
-
-#: ../ex_cmds.c:4384
-msgid "1 substitution"
-msgstr "1 substitution"
-
-#: ../ex_cmds.c:4387
#, c-format
-msgid "%<PRId64> matches"
-msgstr "%<PRId64> correspondances"
+msgid "%ld match on %ld line"
+msgid_plural "%ld matches on %ld line"
+msgstr[0] "%ld correspondance sur %ld ligne"
+msgstr[1] "%ld correspondances sur %ld ligne"
-#: ../ex_cmds.c:4388
#, c-format
-msgid "%<PRId64> substitutions"
-msgstr "%<PRId64> substitutions"
+msgid "%ld substitution on %ld line"
+msgid_plural "%ld substitutions on %ld line"
+msgstr[0] "%ld substitution sur %ld ligne"
+msgstr[1] "%ld substitutions sur %ld ligne"
-#: ../ex_cmds.c:4392
-msgid " on 1 line"
-msgstr " sur 1 ligne"
+#, c-format
+msgid "%ld match on %ld lines"
+msgid_plural "%ld matches on %ld lines"
+msgstr[0] "%ld correspondance sur %ld lignes"
+msgstr[1] "%ld correspondances sur %ld lignes"
-#: ../ex_cmds.c:4395
#, c-format
-msgid " on %<PRId64> lines"
-msgstr " sur %<PRId64> lignes"
+msgid "%ld substitution on %ld lines"
+msgid_plural "%ld substitutions on %ld lines"
+msgstr[0] "%ld substitution sur %ld lignes"
+msgstr[1] "%ld substitutions sur %ld lignes"
# AB - Il faut respecter l'esprit plus que la lettre.
# AB - Ce message devrait contenir une r้f้rence เ :vglobal.
-#: ../ex_cmds.c:4438
-msgid "E147: Cannot do :global recursive"
-msgstr "E147: :global ne peut pas ex้cuter :global"
+msgid "E147: Cannot do :global recursive with a range"
+msgstr "E147: :global ne peut pas ex้cuter :global avec une plage"
# AB - Ce message devrait contenir une r้f้rence เ :vglobal.
-#: ../ex_cmds.c:4467
msgid "E148: Regular expression missing from global"
msgstr "E148: :global doit ๊tre suivi par une expression r้guli่re"
# AB - Ce message est utilis้ lorsque :vglobal ne trouve rien. Lorsque :global
# ne trouve rien, c'est "Pattern not found: %s" / "Motif introuvable: %s"
# qui est utilis้.
-#: ../ex_cmds.c:4508
#, c-format
msgid "Pattern found in every line: %s"
msgstr "Motif trouv้ dans toutes les lignes : %s"
-#: ../ex_cmds.c:4510
#, c-format
msgid "Pattern not found: %s"
msgstr "Motif introuvable: %s"
@@ -1430,7 +1185,6 @@ msgstr "Motif introuvable: %s"
# เ internationalisation. J'attends que les deux autres messages soient
# traduisibles pour traduire celui-ci.
# DB - TODO : Qu'en est-il เ pr้sent ?
-#: ../ex_cmds.c:4587
msgid ""
"\n"
"# Last Substitute String:\n"
@@ -1441,43 +1195,33 @@ msgstr ""
"$"
# This message should *so* be E42!
-#: ../ex_cmds.c:4679
msgid "E478: Don't panic!"
msgstr "E478: Pas de panique !"
-#: ../ex_cmds.c:4717
#, c-format
msgid "E661: Sorry, no '%s' help for %s"
msgstr "E661: D้sol้, aucune aide en langue '%s' pour %s"
-#: ../ex_cmds.c:4719
#, c-format
msgid "E149: Sorry, no help for %s"
msgstr "E149: D้sol้, aucune aide pour %s"
-#: ../ex_cmds.c:4751
#, c-format
msgid "Sorry, help file \"%s\" not found"
msgstr "D้sol้, le fichier d'aide \"%s\" est introuvable"
-#: ../ex_cmds.c:5323
#, c-format
-msgid "E150: Not a directory: %s"
-msgstr "E150: %s n'est pas un r้pertoire"
+msgid "E151: No match: %s"
+msgstr "E151: Aucune correspondance : %s"
-# AB - La version anglaise est plus pr้cise, mais trop technique.
-#: ../ex_cmds.c:5446
#, c-format
msgid "E152: Cannot open %s for writing"
-msgstr "E152: Impossible d'้crire %s"
+msgstr "E152: Impossible d'ouvrir %s en ้criture"
-# AB - La version anglaise est plus pr้cise, mais trop technique.
-#: ../ex_cmds.c:5471
#, c-format
msgid "E153: Unable to open %s for reading"
-msgstr "E153: Impossible de lire %s"
+msgstr "E153: Impossible d'ouvrir %s en lecture"
-#: ../ex_cmds.c:5500
#, c-format
msgid "E670: Mix of help file encodings within a language: %s"
msgstr "E670: Encodages diff้rents dans les fichiers d'aide en langue %s"
@@ -1487,315 +1231,297 @@ msgstr "E670: Encodages diff้rents dans les fichiers d'aide en langue %s"
# traduction de 40 caract่res ou moins. Ce qui est loin d'๊tre le cas
# pr้sent.
# DB - Suggestion.
-#: ../ex_cmds.c:5565
#, c-format
msgid "E154: Duplicate tag \"%s\" in file %s/%s"
msgstr "E154: Marqueur \"%s\" dupliqu้ dans le fichier %s/%s"
+#, c-format
+msgid "E150: Not a directory: %s"
+msgstr "E150: %s n'est pas un r้pertoire"
+
# AB - Il faut respecter l'esprit plus que la lettre.
-#: ../ex_cmds.c:5687
#, c-format
msgid "E160: Unknown sign command: %s"
msgstr "E160: Commande inconnue : :sign %s"
# AB - La version fran็aise est meilleure que la version anglaise.
-#: ../ex_cmds.c:5704
msgid "E156: Missing sign name"
msgstr "E156: Il manque le nom du symbole"
-#: ../ex_cmds.c:5746
msgid "E612: Too many signs defined"
msgstr "E612: Trop de symboles sont d้finis"
# AB - Cette traduction ne me satisfait pas.
# DB - Suggestion.
-#: ../ex_cmds.c:5813
#, c-format
msgid "E239: Invalid sign text: %s"
msgstr "E239: Le texte du symbole est invalide : %s"
-#: ../ex_cmds.c:5844 ../ex_cmds.c:6035
#, c-format
msgid "E155: Unknown sign: %s"
msgstr "E155: Symbole inconnu : %s"
# AB - La version fran็aise est meilleure que la version anglaise.
-#: ../ex_cmds.c:5877
msgid "E159: Missing sign number"
msgstr "E159: Il manque l'ID du symbole"
# AB - Vu le code source, la version fran็aise est meilleure que la
# version anglaise. Ce message est similaire au message E102.
-#: ../ex_cmds.c:5971
#, c-format
msgid "E158: Invalid buffer name: %s"
msgstr "E158: Le tampon %s est introuvable"
+msgid "E934: Cannot jump to a buffer that does not have a name"
+msgstr "E934: Impossible de sauter เ un tampon sans nom"
+
# AB - Vu le code source, la version fran็aise est meilleure que la
# version anglaise.
-#: ../ex_cmds.c:6008
#, c-format
-msgid "E157: Invalid sign ID: %<PRId64>"
-msgstr "E157: Le symbole %<PRId64> est introuvable"
+msgid "E157: Invalid sign ID: %ld"
+msgstr "E157: Le symbole %ld est introuvable"
+
+#, c-format
+msgid "E885: Not possible to change sign %s"
+msgstr "E885: Impossible de changer le symbole %s"
+
+msgid " (NOT FOUND)"
+msgstr " (INTROUVABLE)"
-#: ../ex_cmds.c:6066
msgid " (not supported)"
msgstr " (non support้)"
-#: ../ex_cmds.c:6169
msgid "[Deleted]"
msgstr "[Effac้]"
+msgid "No old files"
+msgstr "Aucun vieux fichier"
+
# AB - La version fran็aise de la premi่re phrase ne me satisfait pas.
# DB - Suggestion.
-#: ../ex_cmds2.c:139
msgid "Entering Debug mode. Type \"cont\" to continue."
msgstr "Mode d้bogage activ้. Tapez \"cont\" pour continuer."
-#: ../ex_cmds2.c:143 ../ex_docmd.c:759
#, c-format
-msgid "line %<PRId64>: %s"
-msgstr "ligne %<PRId64> : %s"
+msgid "Oldval = \"%s\""
+msgstr "Ancienneval = \"%s\""
+
+#, c-format
+msgid "Newval = \"%s\""
+msgstr "Nouvelleval = \"%s\""
+
+#, c-format
+msgid "line %ld: %s"
+msgstr "ligne %ld : %s"
-#: ../ex_cmds2.c:145
#, c-format
msgid "cmd: %s"
msgstr "cmde : %s"
-#: ../ex_cmds2.c:322
+msgid "frame is zero"
+msgstr "le cadre de pile est z้ro"
+
#, c-format
-msgid "Breakpoint in \"%s%s\" line %<PRId64>"
-msgstr "Point d'arr๊t dans %s%s ligne %<PRId64>"
+msgid "frame at highest level: %d"
+msgstr "cadre de pile au niveau le plus haut : %d"
+
+#, c-format
+msgid "Breakpoint in \"%s%s\" line %ld"
+msgstr "Point d'arr๊t dans %s%s ligne %ld"
-#: ../ex_cmds2.c:581
#, c-format
msgid "E161: Breakpoint not found: %s"
msgstr "E161: Le point d'arr๊t %s est introuvable"
-#: ../ex_cmds2.c:611
msgid "No breakpoints defined"
msgstr "Aucun point d'arr๊t n'est d้fini"
# AB - Le deuxi่me %s est remplac้ par "func" ou "file" sans que l'on puisse
# traduire ces mots.
-#: ../ex_cmds2.c:617
#, c-format
-msgid "%3d %s %s line %<PRId64>"
-msgstr "%3d %s %s ligne %<PRId64>"
+msgid "%3d %s %s line %ld"
+msgstr "%3d %s %s ligne %ld"
+
+#, c-format
+msgid "%3d expr %s"
+msgstr "%3d expr %s"
-#: ../ex_cmds2.c:942
msgid "E750: First use \":profile start {fname}\""
msgstr "E750: Utilisez d'abord \":profile start {nomfichier}\""
# AB - "changes to" est redondant et a ้t้ omis de la version fran็aise.
-#: ../ex_cmds2.c:1269
#, c-format
msgid "Save changes to \"%s\"?"
msgstr "Enregistrer \"%s\" ?"
-# AB - Si les parenth่ses posent probl่me, il faudra remettre les guillemets
-# ci-dessus.
-#: ../ex_cmds2.c:1271 ../ex_docmd.c:8851
-msgid "Untitled"
-msgstr "(sans titre)"
+#, c-format
+msgid "E947: Job still running in buffer \"%s\""
+msgstr "E947: Tโche en cours d'ex้cution dans le buffer \"%s\""
# AB - Il faut respecter l'esprit plus que la lettre.
# AB - Ce message est similaire au message E89.
-#: ../ex_cmds2.c:1421
#, c-format
msgid "E162: No write since last change for buffer \"%s\""
msgstr "E162: Le tampon %s n'a pas ้t้ enregistr้"
-#: ../ex_cmds2.c:1480
msgid "Warning: Entered other buffer unexpectedly (check autocommands)"
-msgstr "Alerte : Entr้e inattendue dans un autre tampon (v้rifier autocmdes)"
+msgstr ""
+"Alerte : Entr้e inattendue dans un autre tampon (v้rifier autocommandes)"
-#: ../ex_cmds2.c:1826
msgid "E163: There is only one file to edit"
msgstr "E163: Il n'y a qu'un seul fichier เ ้diter"
-#: ../ex_cmds2.c:1828
msgid "E164: Cannot go before first file"
msgstr "E164: Impossible d'aller avant le premier fichier"
-#: ../ex_cmds2.c:1830
msgid "E165: Cannot go beyond last file"
msgstr "E165: Impossible d'aller au-delเ du dernier fichier"
-#: ../ex_cmds2.c:2175
#, c-format
msgid "E666: compiler not supported: %s"
msgstr "E666: Compilateur %s non support้"
-#: ../ex_cmds2.c:2257
#, c-format
msgid "Searching for \"%s\" in \"%s\""
msgstr "Recherche de \"%s\" dans \"%s\""
-#: ../ex_cmds2.c:2284
#, c-format
msgid "Searching for \"%s\""
msgstr "Recherche de \"%s\""
-#: ../ex_cmds2.c:2307
#, c-format
-msgid "not found in 'runtimepath': \"%s\""
-msgstr "introuvable dans 'runtimepath' : \"%s\""
+msgid "not found in '%s': \"%s\""
+msgstr "introuvable dans '%s' : \"%s\""
+
+#, c-format
+msgid "W20: Required python version 2.x not supported, ignoring file: %s"
+msgstr "W20: Python version 2.x non support้, fichier %s ignor้"
+
+#, c-format
+msgid "W21: Required python version 3.x not supported, ignoring file: %s"
+msgstr "W21: Python 3.x non support้, fichier %s ignor้"
+
+msgid "Source Vim script"
+msgstr "Sourcer un script - Vim"
-#: ../ex_cmds2.c:2472
#, c-format
msgid "Cannot source a directory: \"%s\""
msgstr "Impossible de sourcer un r้pertoire : \"%s\""
-#: ../ex_cmds2.c:2518
#, c-format
msgid "could not source \"%s\""
msgstr "impossible de sourcer \"%s\""
-#: ../ex_cmds2.c:2520
#, c-format
-msgid "line %<PRId64>: could not source \"%s\""
-msgstr "ligne %<PRId64> : impossible de sourcer \"%s\""
+msgid "line %ld: could not source \"%s\""
+msgstr "ligne %ld : impossible de sourcer \"%s\""
-#: ../ex_cmds2.c:2535
#, c-format
msgid "sourcing \"%s\""
msgstr "sourcement \"%s\""
-#: ../ex_cmds2.c:2537
#, c-format
-msgid "line %<PRId64>: sourcing \"%s\""
-msgstr "ligne %<PRId64> : sourcement de \"%s\""
+msgid "line %ld: sourcing \"%s\""
+msgstr "ligne %ld : sourcement de \"%s\""
-#: ../ex_cmds2.c:2693
#, c-format
msgid "finished sourcing %s"
msgstr "fin du sourcement de %s"
-#: ../ex_cmds2.c:2765
+# AB - Ce texte fait partie d'un message de d้bogage.
+#, c-format
+msgid "continuing in %s"
+msgstr "de retour dans %s"
+
msgid "modeline"
msgstr "ligne de mode"
-#: ../ex_cmds2.c:2767
msgid "--cmd argument"
msgstr "argument --cmd"
-#: ../ex_cmds2.c:2769
msgid "-c argument"
msgstr "argument -c"
-#: ../ex_cmds2.c:2771
msgid "environment variable"
msgstr "variable d'environnement"
-#: ../ex_cmds2.c:2773
msgid "error handler"
msgstr "gestionnaire d'erreur"
-#: ../ex_cmds2.c:3020
msgid "W15: Warning: Wrong line separator, ^M may be missing"
msgstr "W15: Alerte : S้parateur de ligne erron้, ^M possiblement manquant"
-#: ../ex_cmds2.c:3139
msgid "E167: :scriptencoding used outside of a sourced file"
msgstr "E167: :scriptencoding utilis้ en dehors d'un fichier sourc้"
-#: ../ex_cmds2.c:3166
msgid "E168: :finish used outside of a sourced file"
msgstr "E168: :finish utilis้ en dehors d'un fichier sourc้"
# DB - Le premier %s est, au choix : "time ", "ctype " ou "messages ",
# sans qu'il soit possible de les traduire.
-#: ../ex_cmds2.c:3389
#, c-format
msgid "Current %slanguage: \"%s\""
msgstr "Langue courante pour %s : \"%s\""
-#: ../ex_cmds2.c:3404
#, c-format
msgid "E197: Cannot set language to \"%s\""
msgstr "E197: Impossible de choisir la langue \"%s\""
-#. don't redisplay the window
-#. don't wait for return
-#: ../ex_docmd.c:387
msgid "Entering Ex mode. Type \"visual\" to go to Normal mode."
msgstr "Mode Ex activ้. Tapez \"visual\" pour passer en mode Normal."
-#: ../ex_docmd.c:428
msgid "E501: At end-of-file"
msgstr "E501: ภ la fin du fichier"
-#: ../ex_docmd.c:513
msgid "E169: Command too recursive"
msgstr "E169: Commande trop r้cursive"
-#: ../ex_docmd.c:1006
#, c-format
msgid "E605: Exception not caught: %s"
msgstr "E605: Exception non intercept้e : %s"
-#: ../ex_docmd.c:1085
msgid "End of sourced file"
msgstr "Fin du fichier sourc้"
-#: ../ex_docmd.c:1086
msgid "End of function"
msgstr "Fin de la fonction"
-#: ../ex_docmd.c:1628
msgid "E464: Ambiguous use of user-defined command"
msgstr "E464: Utilisation ambigu๋ d'une commande d้finie par l'utilisateur"
-#: ../ex_docmd.c:1638
msgid "E492: Not an editor command"
msgstr "E492: Commande inconnue"
-#: ../ex_docmd.c:1729
msgid "E493: Backwards range given"
msgstr "E493: La plage sp้cifi้e est invers้e"
-#: ../ex_docmd.c:1733
msgid "Backwards range given, OK to swap"
msgstr "La plage sp้cifi้e est invers้e, OK pour l'inverser"
-#. append
-#. typed wrong
-#: ../ex_docmd.c:1787
msgid "E494: Use w or w>>"
msgstr "E494: Utilisez w ou w>>"
-#: ../ex_docmd.c:3454
-msgid "E319: The command is not available in this version"
-msgstr "E319: D้sol้, cette commande n'est pas disponible dans cette version"
-
-#: ../ex_docmd.c:3752
-msgid "E172: Only one file name allowed"
-msgstr "E172: Un seul nom de fichier autoris้"
+msgid "E943: Command table needs to be updated, run 'make cmdidxs'"
+msgstr ""
+"E943: La table des commandes doit ๊tre mise เ jour, lancez 'make cmdidxs'"
-#: ../ex_docmd.c:4238
-msgid "1 more file to edit. Quit anyway?"
-msgstr "Encore 1 fichier เ ้diter. Quitter tout de m๊me ?"
+msgid "E319: Sorry, the command is not available in this version"
+msgstr "E319: D้sol้, cette commande n'est pas disponible dans cette version"
-#: ../ex_docmd.c:4242
#, c-format
-msgid "%d more files to edit. Quit anyway?"
-msgstr "Encore %d fichiers เ ้diter. Quitter tout de m๊me ?"
+msgid "%d more file to edit. Quit anyway?"
+msgid_plural "%d more files to edit. Quit anyway?"
+msgstr[0] "Encore %d fichier เ ้diter. Quitter tout de m๊me ?"
+msgstr[1] "Encore %d fichiers เ ้diter. Quitter tout de m๊me ?"
-#: ../ex_docmd.c:4248
-msgid "E173: 1 more file to edit"
-msgstr "E173: encore 1 fichier เ ้diter"
-
-#: ../ex_docmd.c:4250
#, c-format
-msgid "E173: %<PRId64> more files to edit"
-msgstr "E173: encore %<PRId64> fichiers เ ้diter"
+msgid "E173: %ld more file to edit"
+msgid_plural "E173: %ld more files to edit"
+msgstr[0] "E173: encore %ld fichier เ ้diter"
+msgstr[1] "E173: encore %ld fichiers เ ้diter"
-#: ../ex_docmd.c:4320
msgid "E174: Command already exists: add ! to replace it"
msgstr "E174: La commande existe d้jเ : ajoutez ! pour la red้finir"
-#: ../ex_docmd.c:4432
msgid ""
"\n"
" Name Args Address Complete Definition"
@@ -1803,356 +1529,312 @@ msgstr ""
"\n"
" Nom Args Adresse Complet. D้finition"
-#: ../ex_docmd.c:4516
msgid "No user-defined commands found"
msgstr "Aucune commande d้finie par l'utilisateur trouv้e"
-#: ../ex_docmd.c:4538
msgid "E175: No attribute specified"
msgstr "E175: Pas d'attribut sp้cifi้"
-#: ../ex_docmd.c:4583
msgid "E176: Invalid number of arguments"
msgstr "E176: Nombre d'arguments invalide"
-#: ../ex_docmd.c:4594
msgid "E177: Count cannot be specified twice"
msgstr "E177: Le quantificateur ne peut ๊tre sp้cifi้ deux fois"
-#: ../ex_docmd.c:4603
msgid "E178: Invalid default value for count"
msgstr "E178: La valeur par d้faut du quantificateur est invalide"
-#: ../ex_docmd.c:4625
msgid "E179: argument required for -complete"
msgstr "E179: argument requis avec -complete"
-#: ../ex_docmd.c:4933
msgid "E179: argument required for -addr"
msgstr "E179: argument requis avec -addr"
-#: ../ex_docmd.c:4635
#, c-format
msgid "E181: Invalid attribute: %s"
msgstr "E181: Attribut invalide : %s"
-#: ../ex_docmd.c:4678
msgid "E182: Invalid command name"
msgstr "E182: Nom de commande invalide"
-#: ../ex_docmd.c:4691
msgid "E183: User defined commands must start with an uppercase letter"
msgstr "E183: Les commandes utilisateur doivent commencer par une majuscule"
-#: ../ex_docmd.c:4696
msgid "E841: Reserved name, cannot be used for user defined command"
msgstr ""
"E841: Nom r้serv้, ne peux pas ๊tre utilis้ pour une commande utilisateur"
-#: ../ex_docmd.c:4751
#, c-format
msgid "E184: No such user-defined command: %s"
msgstr "E184: Aucune commande %s d้finie par l'utilisateur"
-#: ../ex_docmd.c:5516
#, c-format
msgid "E180: Invalid address type value: %s"
msgstr "E180: Valeur de type d'adresse invalide : %s"
-#: ../ex_docmd.c:5219
#, c-format
msgid "E180: Invalid complete value: %s"
msgstr "E180: Valeur invalide pour \"-complete=\" : %s"
-#: ../ex_docmd.c:5225
msgid "E468: Completion argument only allowed for custom completion"
msgstr "E468: Seul le compl่tement personnalis้ accepte un argument"
-#: ../ex_docmd.c:5231
msgid "E467: Custom completion requires a function argument"
-msgstr "E467: Le compl่tement personnalis้ requiert une fonction en argument"
+msgstr "E467: Le compl่tement personnalis้ n้cessite une fonction en argument"
+
+msgid "unknown"
+msgstr "inconnu"
-#: ../ex_docmd.c:5257
#, c-format
msgid "E185: Cannot find color scheme '%s'"
msgstr "E185: Impossible de trouver le jeu de couleurs '%s'"
-#: ../ex_docmd.c:5263
msgid "Greetings, Vim user!"
msgstr "Bienvenue, utilisateur de Vim !"
-#: ../ex_docmd.c:5431
msgid "E784: Cannot close last tab page"
msgstr "E784: Impossible de fermer le dernier onglet"
-#: ../ex_docmd.c:5462
msgid "Already only one tab page"
msgstr "Il ne reste d้jเ plus qu'un seul onglet"
-#: ../ex_docmd.c:6004
+msgid "Edit File in new tab page"
+msgstr "Ouvrir un fichier dans un nouvel onglet"
+
+msgid "Edit File in new window"
+msgstr "Ouvrir un fichier dans une nouvelle fen๊tre - Vim"
+
#, c-format
msgid "Tab page %d"
msgstr "Onglet %d"
-#: ../ex_docmd.c:6295
msgid "No swap file"
msgstr "Pas de fichier d'้change"
-#: ../ex_docmd.c:6478
+msgid "Append File"
+msgstr "Ajouter fichier"
+
msgid "E747: Cannot change directory, buffer is modified (add ! to override)"
msgstr ""
"E747: Tampon modifi้ : impossible de changer de r้pertoire (ajoutez ! pour "
"passer outre)"
-#: ../ex_docmd.c:6485
msgid "E186: No previous directory"
msgstr "E186: Pas de r้pertoire pr้c้dent"
-#: ../ex_docmd.c:6530
msgid "E187: Unknown"
msgstr "E187: Inconnu"
-#: ../ex_docmd.c:6610
msgid "E465: :winsize requires two number arguments"
-msgstr "E465: :winsize requiert deux arguments num้riques"
+msgstr "E465: :winsize n้cessite deux arguments num้riques"
+
+#, c-format
+msgid "Window position: X %d, Y %d"
+msgstr "Position de la fen๊tre : X %d, Y %d"
# DB : Suggestion, sans doute perfectible.
-#: ../ex_docmd.c:6655
msgid "E188: Obtaining window position not implemented for this platform"
msgstr ""
"E188: R้cup้rer la position de la fen๊tre non impl้ment้ dans cette version"
-#: ../ex_docmd.c:6662
msgid "E466: :winpos requires two number arguments"
-msgstr "E466: :winpos requiert deux arguments num้riques"
+msgstr "E466: :winpos n้cessite deux arguments num้riques"
+
+msgid "E930: Cannot use :redir inside execute()"
+msgstr "E930: Impossible d'utiliser :redir dans execute()"
+
+msgid "Save Redirection"
+msgstr "Enregistrer la redirection"
+
+msgid "Save View"
+msgstr "Enregistrer la vue - Vim"
+
+msgid "Save Session"
+msgstr "Enregistrer la session - Vim"
+
+msgid "Save Setup"
+msgstr "Enregistrer les r้glages - Vim"
-#: ../ex_docmd.c:7241
#, c-format
msgid "E739: Cannot create directory: %s"
msgstr "E739: Impossible de cr้er le r้pertoire \"%s\""
-#: ../ex_docmd.c:7268
#, c-format
msgid "E189: \"%s\" exists (add ! to override)"
msgstr "E189: \"%s\" existe (ajoutez ! pour passer outre)"
-#: ../ex_docmd.c:7273
#, c-format
msgid "E190: Cannot open \"%s\" for writing"
msgstr "E190: Impossible d'ouvrir \"%s\" pour y ้crire"
-#. set mark
-#: ../ex_docmd.c:7294
msgid "E191: Argument must be a letter or forward/backward quote"
msgstr "E191: L'argument doit ๊tre une lettre ou une (contre-)apostrophe"
-#: ../ex_docmd.c:7333
msgid "E192: Recursive use of :normal too deep"
msgstr "E192: Appel r้cursif de :normal trop important"
-#: ../ex_docmd.c:7807
+msgid "E809: #< is not available without the +eval feature"
+msgstr "E809: #< n'est pas disponible sans la fonctionnalit้ +eval"
+
msgid "E194: No alternate file name to substitute for '#'"
msgstr "E194: Aucun nom de fichier alternatif เ substituer เ '#'"
-#: ../ex_docmd.c:7841
msgid "E495: no autocommand file name to substitute for \"<afile>\""
msgstr "E495: Aucun nom de ficher d'autocommande เ substituer เ \"<afile>\""
-#: ../ex_docmd.c:7850
msgid "E496: no autocommand buffer number to substitute for \"<abuf>\""
msgstr "E496: Aucun num้ro de tampon d'autocommande เ substituer เ \"<abuf>\""
-#: ../ex_docmd.c:7861
msgid "E497: no autocommand match name to substitute for \"<amatch>\""
msgstr "E497: Aucune correspondance d'autocommande เ substituer เ \"<amatch>\""
-#: ../ex_docmd.c:7870
msgid "E498: no :source file name to substitute for \"<sfile>\""
msgstr "E498: Aucun nom de fichier :source เ substituer เ \"<sfile>\""
-#: ../ex_docmd.c:7876
msgid "E842: no line number to use for \"<slnum>\""
msgstr "E842: aucun num้ro de ligne เ utiliser pour \"<slnum>\""
-#: ../ex_docmd.c:7903
-#, c-format
+#, no-c-format
msgid "E499: Empty file name for '%' or '#', only works with \":p:h\""
msgstr "E499: Nom de fichier vide pour '%' ou '#', ne marche qu'avec \":p:h\""
-#: ../ex_docmd.c:7905
msgid "E500: Evaluates to an empty string"
msgstr "E500: ษvalu้ en une cha๎ne vide"
-#: ../ex_docmd.c:8838
msgid "E195: Cannot open viminfo file for reading"
msgstr "E195: Impossible d'ouvrir le viminfo en lecture"
-#: ../ex_eval.c:464
+# AB - Si les parenth่ses posent probl่me, il faudra remettre les guillemets
+# ci-dessus.
+msgid "Untitled"
+msgstr "(sans titre)"
+
+msgid "E196: No digraphs in this version"
+msgstr "E196: Pas de digraphes dans cette version"
+
msgid "E608: Cannot :throw exceptions with 'Vim' prefix"
msgstr "E608: Impossible d'้mettre des exceptions avec 'Vim' comme pr้fixe"
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:496
#, c-format
msgid "Exception thrown: %s"
msgstr "Exception ้mise : %s"
-#: ../ex_eval.c:545
#, c-format
msgid "Exception finished: %s"
msgstr "Exception termin้e : %s"
-#: ../ex_eval.c:546
#, c-format
msgid "Exception discarded: %s"
msgstr "Exception ้limin้e : %s"
-#: ../ex_eval.c:588 ../ex_eval.c:634
#, c-format
-msgid "%s, line %<PRId64>"
-msgstr "%s, ligne %<PRId64>"
+msgid "%s, line %ld"
+msgstr "%s, ligne %ld"
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:608
#, c-format
msgid "Exception caught: %s"
msgstr "Exception intercept้e : %s"
# DB - Le c-format est f้minin, singulier ou pluriel (cf. 3 messages plus bas).
-#: ../ex_eval.c:676
#, c-format
msgid "%s made pending"
msgstr "%s mise(s) en attente"
-#: ../ex_eval.c:679
#, c-format
msgid "%s resumed"
msgstr "%s r้-้mise(s)"
-#: ../ex_eval.c:683
#, c-format
msgid "%s discarded"
msgstr "%s ้limin้e(s)"
-#: ../ex_eval.c:708
msgid "Exception"
msgstr "Exception"
-#: ../ex_eval.c:713
msgid "Error and interrupt"
msgstr "Erreur et interruption"
-#: ../ex_eval.c:715
msgid "Error"
msgstr "Erreur"
-#. if (pending & CSTP_INTERRUPT)
-#: ../ex_eval.c:717
msgid "Interrupt"
msgstr "Interruption"
-#: ../ex_eval.c:795
msgid "E579: :if nesting too deep"
msgstr "E579: Imbrication de :if trop importante"
-#: ../ex_eval.c:830
msgid "E580: :endif without :if"
msgstr "E580: :endif sans :if"
-#: ../ex_eval.c:873
msgid "E581: :else without :if"
msgstr "E581: :else sans :if"
-#: ../ex_eval.c:876
msgid "E582: :elseif without :if"
msgstr "E582: :elseif sans :if"
-#: ../ex_eval.c:880
msgid "E583: multiple :else"
msgstr "E583: Il ne peut y avoir qu'un seul :else"
-#: ../ex_eval.c:883
msgid "E584: :elseif after :else"
msgstr "E584: :elseif apr่s :else"
-#: ../ex_eval.c:941
msgid "E585: :while/:for nesting too deep"
msgstr "E585: Imbrication de :while ou :for trop importante"
-#: ../ex_eval.c:1028
msgid "E586: :continue without :while or :for"
msgstr "E586: :continue sans :while ou :for"
-#: ../ex_eval.c:1061
msgid "E587: :break without :while or :for"
msgstr "E587: :break sans :while ou :for"
-#: ../ex_eval.c:1102
msgid "E732: Using :endfor with :while"
msgstr "E732: Utilisation de :endfor avec :while"
-#: ../ex_eval.c:1104
msgid "E733: Using :endwhile with :for"
msgstr "E733: Utilisation de :endwhile avec :for"
-#: ../ex_eval.c:1247
msgid "E601: :try nesting too deep"
msgstr "E601: Imbrication de :try trop importante"
-#: ../ex_eval.c:1317
msgid "E603: :catch without :try"
msgstr "E603: :catch sans :try"
-#. Give up for a ":catch" after ":finally" and ignore it.
-#. * Just parse.
-#: ../ex_eval.c:1332
msgid "E604: :catch after :finally"
msgstr "E604: :catch apr่s :finally"
-#: ../ex_eval.c:1451
msgid "E606: :finally without :try"
msgstr "E606: :finally sans :try"
-#. Give up for a multiple ":finally" and ignore it.
-#: ../ex_eval.c:1467
msgid "E607: multiple :finally"
msgstr "E607: Il ne peut y avoir qu'un seul :finally"
-#: ../ex_eval.c:1571
msgid "E602: :endtry without :try"
msgstr "E602: :endtry sans :try"
-#: ../ex_eval.c:2026
msgid "E193: :endfunction not inside a function"
msgstr "E193: :endfunction en dehors d'une fonction"
-#: ../ex_getln.c:1643
msgid "E788: Not allowed to edit another buffer now"
msgstr "E788: L'้dition d'un autre tampon n'est plus permise"
-#: ../ex_getln.c:1656
msgid "E811: Not allowed to change buffer information now"
msgstr ""
"E811: Changement des informations du tampon n'est pas permise maintenant"
# DB - TODO : Pas compris le message ni comment le d้clencher malgr้ une visite
# dans le code.
-#: ../ex_getln.c:3178
msgid "tagname"
msgstr "nom du marqueur"
# DB - TODO : Idem pr้c้dent.
-#: ../ex_getln.c:3181
msgid " kind file\n"
msgstr " type de fichier\n"
-#: ../ex_getln.c:4799
msgid "'history' option is zero"
msgstr "l'option 'history' vaut z้ro"
# DB - Messages et les suivants : fichier .viminfo.
# Pas de majuscule n้cessaire pour les messages d'apr่s.
-#: ../ex_getln.c:5046
#, c-format
msgid ""
"\n"
@@ -2161,311 +1843,224 @@ msgstr ""
"\n"
"# Historique %s (chronologie d้croissante) :\n"
-#: ../ex_getln.c:5047
msgid "Command Line"
msgstr "ligne de commande"
-#: ../ex_getln.c:5048
msgid "Search String"
msgstr "cha๎ne de recherche"
-#: ../ex_getln.c:5049
msgid "Expression"
msgstr "expression"
-#: ../ex_getln.c:5050
msgid "Input Line"
msgstr "ligne de saisie"
-#: ../ex_getln.c:5117
+msgid "Debug Line"
+msgstr "Ligne de d้bogage"
+
msgid "E198: cmd_pchar beyond the command length"
msgstr "E198: cmd_pchar au-delเ de la longueur de la commande"
-#: ../ex_getln.c:5279
msgid "E199: Active window or buffer deleted"
msgstr "E199: Fen๊tre ou tampon actif effac้"
-#: ../file_search.c:203
-msgid "E854: path too long for completion"
-msgstr "E854: chemin trop long pour compl่tement"
-
-#: ../file_search.c:446
-#, c-format
-msgid ""
-"E343: Invalid path: '**[number]' must be at the end of the path or be "
-"followed by '%s'."
-msgstr ""
-"E343: Chemin invalide : '**[nombre]' doit ๊tre เ la fin du chemin ou ๊tre "
-"suivi de '%s'."
-
-#: ../file_search.c:1505
-#, c-format
-msgid "E344: Can't find directory \"%s\" in cdpath"
-msgstr "E344: R้pertoire \"%s\" introuvable dans 'cdpath'"
-
-#: ../file_search.c:1508
-#, c-format
-msgid "E345: Can't find file \"%s\" in path"
-msgstr "E345: Fichier \"%s\" introuvable dans 'path'"
-
-#: ../file_search.c:1512
-#, c-format
-msgid "E346: No more directory \"%s\" found in cdpath"
-msgstr "E346: Plus de r้pertoire \"%s\" dans 'cdpath'"
-
-#: ../file_search.c:1515
-#, c-format
-msgid "E347: No more file \"%s\" found in path"
-msgstr "E347: Plus de fichier \"%s\" dans 'path'"
-
-#: ../fileio.c:137
msgid "E812: Autocommands changed buffer or buffer name"
msgstr "E812: Des autocommandes ont chang้ le tampon ou le nom du tampon"
-#: ../fileio.c:368
msgid "Illegal file name"
msgstr "Nom de fichier invalide"
-#: ../fileio.c:395 ../fileio.c:476 ../fileio.c:2543 ../fileio.c:2578
msgid "is a directory"
msgstr "est un r้pertoire"
-#: ../fileio.c:397
msgid "is not a file"
msgstr "n'est pas un fichier"
-#: ../fileio.c:508 ../fileio.c:3522
+msgid "is a device (disabled with 'opendevice' option)"
+msgstr "est un p้riph้rique (d้sactiv้ par l'option 'opendevice')"
+
msgid "[New File]"
msgstr "[Nouveau fichier]"
-#: ../fileio.c:511
msgid "[New DIRECTORY]"
msgstr "[Nouveau RษPERTOIRE]"
-#: ../fileio.c:529 ../fileio.c:532
msgid "[File too big]"
msgstr "[Fichier trop volumineux]"
-#: ../fileio.c:534
msgid "[Permission Denied]"
msgstr "[Permission refus้e]"
-#: ../fileio.c:653
msgid "E200: *ReadPre autocommands made the file unreadable"
msgstr "E200: Les autocommandes *ReadPre ont rendu le fichier illisible"
-#: ../fileio.c:655
msgid "E201: *ReadPre autocommands must not change current buffer"
msgstr ""
"E201: Autocommandes *ReadPre ne doivent pas modifier le contenu du tampon "
"courant"
-#: ../fileio.c:672
-msgid "Nvim: Reading from stdin...\n"
+msgid "Vim: Reading from stdin...\n"
msgstr "Vim : Lecture de stdin...\n"
-#. Re-opening the original file failed!
-#: ../fileio.c:909
+msgid "Reading from stdin..."
+msgstr "Lecture de stdin..."
+
msgid "E202: Conversion made file unreadable!"
msgstr "E202: La conversion a rendu le fichier illisible !"
-#. fifo or socket
-#: ../fileio.c:1782
-msgid "[fifo/socket]"
-msgstr "[fifo/socket]"
-
-#. fifo
-#: ../fileio.c:1788
msgid "[fifo]"
msgstr "[fifo]"
-#. or socket
-#: ../fileio.c:1794
msgid "[socket]"
msgstr "[socket]"
-#. or character special
-#: ../fileio.c:1801
msgid "[character special]"
msgstr "[caract่re sp้cial]"
-#: ../fileio.c:1815
msgid "[CR missing]"
msgstr "[CR manquant]"
-#: ../fileio.c:1819
msgid "[long lines split]"
msgstr "[lignes longues coup้es]"
-#: ../fileio.c:1823 ../fileio.c:3512
msgid "[NOT converted]"
msgstr "[NON converti]"
-#: ../fileio.c:1826 ../fileio.c:3515
msgid "[converted]"
msgstr "[converti]"
-#: ../fileio.c:1831
#, c-format
-msgid "[CONVERSION ERROR in line %<PRId64>]"
-msgstr "[ERREUR DE CONVERSION เ la ligne %<PRId64>]"
+msgid "[CONVERSION ERROR in line %ld]"
+msgstr "[ERREUR DE CONVERSION เ la ligne %ld]"
-#: ../fileio.c:1835
#, c-format
-msgid "[ILLEGAL BYTE in line %<PRId64>]"
-msgstr "[OCTET INVALIDE เ la ligne %<PRId64>]"
+msgid "[ILLEGAL BYTE in line %ld]"
+msgstr "[OCTET INVALIDE เ la ligne %ld]"
-#: ../fileio.c:1838
msgid "[READ ERRORS]"
msgstr "[ERREURS DE LECTURE]"
-#: ../fileio.c:2104
msgid "Can't find temp file for conversion"
msgstr "Impossible de g้n้rer un fichier temporaire pour la conversion"
-#: ../fileio.c:2110
msgid "Conversion with 'charconvert' failed"
msgstr "La conversion avec 'charconvert' a ้chou้"
# DB : Pas de majuscule ?
-#: ../fileio.c:2113
msgid "can't read output of 'charconvert'"
msgstr "Impossible de lire la sortie de 'charconvert'"
-#: ../fileio.c:2437
msgid "E676: No matching autocommands for acwrite buffer"
msgstr "E676: Pas d'autocommande correspondante pour le tampon acwrite"
-#: ../fileio.c:2466
msgid "E203: Autocommands deleted or unloaded buffer to be written"
msgstr "E203: Des autocommandes ont effac้ ou d้charg้ le tampon เ ้crire"
-#: ../fileio.c:2486
msgid "E204: Autocommand changed number of lines in unexpected way"
msgstr ""
"E204: L'autocommande a modifi้ le nombre de lignes de mani่re inattendue"
-#: ../fileio.c:2548 ../fileio.c:2565
+msgid "NetBeans disallows writes of unmodified buffers"
+msgstr "NetBeans interdit l'้criture des tampons non modifi้s"
+
+msgid "Partial writes disallowed for NetBeans buffers"
+msgstr "Netbeans interdit l'้criture partielle de ses tampons"
+
msgid "is not a file or writable device"
msgstr "n'est pas un fichier ou un p้riph้rique inscriptible"
-#: ../fileio.c:2601
+msgid "writing to device disabled with 'opendevice' option"
+msgstr "้criture vers un p้riph้rique d้sactiv้ par l'option 'opendevice'"
+
msgid "is read-only (add ! to override)"
msgstr "est en lecture seule (ajoutez ! pour passer outre)"
-#: ../fileio.c:2886
msgid "E506: Can't write to backup file (add ! to override)"
msgstr "E506: Impossible d'้crire la copie de secours (! pour passer outre)"
-#: ../fileio.c:2898
msgid "E507: Close error for backup file (add ! to override)"
msgstr "E507: Erreur de fermeture de la copie de secours (! pour passer outre)"
-#: ../fileio.c:2901
msgid "E508: Can't read file for backup (add ! to override)"
msgstr ""
"E508: Impossible de lire le fichier pour la copie de secours (ajoutez ! pour "
"passer outre)"
-#: ../fileio.c:2923
msgid "E509: Cannot create backup file (add ! to override)"
msgstr ""
"E509: Impossible de cr้er la copie de secours (ajoutez ! pour passer outre)"
-#: ../fileio.c:3008
msgid "E510: Can't make backup file (add ! to override)"
msgstr ""
"E510: Impossible de g้n้rer la copie de secours (ajoutez ! pour passer outre)"
-#. Can't write without a tempfile!
-#: ../fileio.c:3121
msgid "E214: Can't find temp file for writing"
msgstr "E214: Impossible de g้n้rer un fichier temporaire pour y ้crire"
-#: ../fileio.c:3134
msgid "E213: Cannot convert (add ! to write without conversion)"
msgstr "E213: Impossible de convertir (ajoutez ! pour ้crire sans convertir)"
-#: ../fileio.c:3169
msgid "E166: Can't open linked file for writing"
msgstr "E166: Impossible d'ouvrir le lien pour y ้crire"
-#: ../fileio.c:3173
msgid "E212: Can't open file for writing"
msgstr "E212: Impossible d'ouvrir le fichier pour y ้crire"
-#: ../fileio.c:3363
-msgid "E667: Fsync failed"
-msgstr "E667: Fsynch a ้chou้"
+msgid "E949: File changed while writing"
+msgstr "E949: Fichier modifi้ apr่s ้criture"
-#: ../fileio.c:3398
msgid "E512: Close failed"
msgstr "E512: Erreur de fermeture de fichier"
-#: ../fileio.c:3436
msgid "E513: write error, conversion failed (make 'fenc' empty to override)"
msgstr ""
"E513: Erreur d'้criture, ้chec de conversion (videz 'fenc' pour passer outre)"
-#: ../fileio.c:3441
#, c-format
msgid ""
-"E513: write error, conversion failed in line %<PRId64> (make 'fenc' empty to "
+"E513: write error, conversion failed in line %ld (make 'fenc' empty to "
"override)"
msgstr ""
-"E513: Erreur d'้criture, ้chec de conversion เ la ligne %<PRId64> (videz "
-"'fenc' pour passer outre)"
+"E513: Erreur d'้criture, ้chec de conversion เ la ligne %ld (videz 'fenc' "
+"pour passer outre)"
-#: ../fileio.c:3448
msgid "E514: write error (file system full?)"
msgstr "E514: erreur d'้criture (syst่me de fichiers plein ?)"
-#: ../fileio.c:3506
msgid " CONVERSION ERROR"
msgstr " ERREUR DE CONVERSION"
-#: ../fileio.c:3509
#, c-format
-msgid " in line %<PRId64>;"
-msgstr " เ la ligne %<PRId64>"
+msgid " in line %ld;"
+msgstr " เ la ligne %ld"
-#: ../fileio.c:3519
msgid "[Device]"
msgstr "[P้riph.]"
-#: ../fileio.c:3522
msgid "[New]"
msgstr "[Nouveau]"
-#: ../fileio.c:3535
msgid " [a]"
msgstr " [a]"
-#: ../fileio.c:3535
msgid " appended"
msgstr " ajout้(s)"
-#: ../fileio.c:3537
msgid " [w]"
msgstr " [e]"
-#: ../fileio.c:3537
msgid " written"
msgstr " ้crit(s)"
-#: ../fileio.c:3579
msgid "E205: Patchmode: can't save original file"
msgstr "E205: Patchmode : impossible d'enregistrer le fichier original"
-#: ../fileio.c:3602
msgid "E206: patchmode: can't touch empty original file"
msgstr "E206: patchmode : impossible de cr้er le fichier original vide"
-#: ../fileio.c:3616
msgid "E207: Can't delete backup file"
msgstr "E207: Impossible d'effacer la copie de secours"
-#: ../fileio.c:3672
msgid ""
"\n"
"WARNING: Original file may be lost or damaged\n"
@@ -2474,99 +2069,73 @@ msgstr ""
"ALERTE: Le fichier original est peut-๊tre perdu ou endommag้\n"
# DB - todo : un peu long...
-#: ../fileio.c:3675
msgid "don't quit the editor until the file is successfully written!"
msgstr ""
"ne quittez pas l'้diteur tant que le fichier n'est pas correctement "
"enregistr้ !"
-#: ../fileio.c:3795
msgid "[dos]"
msgstr "[dos]"
-#: ../fileio.c:3795
msgid "[dos format]"
msgstr "[format dos]"
-#: ../fileio.c:3801
msgid "[mac]"
msgstr "[mac]"
-#: ../fileio.c:3801
msgid "[mac format]"
msgstr "[format mac]"
-#: ../fileio.c:3807
msgid "[unix]"
msgstr "[unix]"
-#: ../fileio.c:3807
msgid "[unix format]"
msgstr "[format unix]"
-#: ../fileio.c:3831
-msgid "1 line, "
-msgstr "1 ligne, "
-
-#: ../fileio.c:3833
#, c-format
-msgid "%<PRId64> lines, "
-msgstr "%<PRId64> lignes, "
+msgid "%ld line, "
+msgid_plural "%ld lines, "
+msgstr[0] "%ld ligne, "
+msgstr[1] "%ld lignes, "
-#: ../fileio.c:3836
-msgid "1 character"
-msgstr "1 caract่re"
-
-#: ../fileio.c:3838
#, c-format
-msgid "%<PRId64> characters"
-msgstr "%<PRId64> caract่res"
+msgid "%lld character"
+msgid_plural "%lld characters"
+msgstr[0] "%lld caract่re"
+msgstr[1] "%lld caract่res"
-#: ../fileio.c:3849
msgid "[noeol]"
msgstr "[noeol]"
-#: ../fileio.c:3849
msgid "[Incomplete last line]"
msgstr "[Derni่re ligne incompl่te]"
-#. don't overwrite messages here
-#. must give this prompt
-#. don't use emsg() here, don't want to flush the buffers
-#: ../fileio.c:3865
msgid "WARNING: The file has been changed since reading it!!!"
msgstr "ALERTE : Le fichier a ้t้ modifi้ depuis que Vim l'a lu !"
-#: ../fileio.c:3867
msgid "Do you really want to write to it"
msgstr "Voulez-vous vraiment ้crire dedans"
-#: ../fileio.c:4648
#, c-format
msgid "E208: Error writing to \"%s\""
msgstr "E208: Erreur lors de l'้criture dans \"%s\""
-#: ../fileio.c:4655
#, c-format
msgid "E209: Error closing \"%s\""
msgstr "E209: Erreur lors de la fermeture de \"%s\""
-#: ../fileio.c:4657
#, c-format
msgid "E210: Error reading \"%s\""
msgstr "E210: Erreur lors de la lecture de \"%s\""
-#: ../fileio.c:4883
msgid "E246: FileChangedShell autocommand deleted buffer"
msgstr "E246: L'autocommande FileChangedShell a effac้ le tampon"
-#: ../fileio.c:4894
#, c-format
msgid "E211: File \"%s\" no longer available"
msgstr "E211: Le fichier \"%s\" n'est plus disponible"
# DB - todo : Suggestion. Bof bof, เ am้liorer.
-#: ../fileio.c:4906
#, c-format
msgid ""
"W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as "
@@ -2574,40 +2143,32 @@ msgid ""
msgstr ""
"W12: Alerte : Le fichier \"%s\" a ้t้ modifi้, ainsi que le tampon dans Vim"
-#: ../fileio.c:4907
msgid "See \":help W12\" for more info."
msgstr "Consultez \":help W12\" pour plus d'information."
-#: ../fileio.c:4910
#, c-format
msgid "W11: Warning: File \"%s\" has changed since editing started"
msgstr "W11: Alerte : Le fichier \"%s\" a chang้ depuis le d้but de l'้dition"
-#: ../fileio.c:4911
msgid "See \":help W11\" for more info."
msgstr "Consultez \":help W11\" pour plus d'information."
-#: ../fileio.c:4914
#, c-format
msgid "W16: Warning: Mode of file \"%s\" has changed since editing started"
msgstr ""
"W16: Alerte : Les permissions de \"%s\" ont chang้ depuis le d้but de "
"l'้dition"
-#: ../fileio.c:4915
msgid "See \":help W16\" for more info."
msgstr "Consultez \":help W16\" pour plus d'information."
-#: ../fileio.c:4927
#, c-format
msgid "W13: Warning: File \"%s\" has been created after editing started"
msgstr "W13: Alerte : Le fichier \"%s\" a ้t้ cr้้ apr่s le d้but de l'้dition"
-#: ../fileio.c:4947
msgid "Warning"
msgstr "Alerte"
-#: ../fileio.c:4948
msgid ""
"&OK\n"
"&Load File"
@@ -2615,830 +2176,618 @@ msgstr ""
"&Ok\n"
"&Charger le fichier"
-#: ../fileio.c:5065
#, c-format
msgid "E462: Could not prepare for reloading \"%s\""
msgstr "E462: Impossible de pr้parer le rechargement de \"%s\""
-#: ../fileio.c:5078
#, c-format
msgid "E321: Could not reload \"%s\""
msgstr "E321: Impossible de recharger \"%s\""
-#: ../fileio.c:5601
msgid "--Deleted--"
msgstr "--Effac้--"
-#: ../fileio.c:5732
#, c-format
msgid "auto-removing autocommand: %s <buffer=%d>"
msgstr "Autocommandes marqu้es pour auto-suppression : %s <tampon=%d>"
-#. the group doesn't exist
-#: ../fileio.c:5772
#, c-format
msgid "E367: No such group: \"%s\""
msgstr "E367: Aucun groupe \"%s\""
-#: ../fileio.c:5897
+msgid "E936: Cannot delete the current group"
+msgstr "E936: Impossible de supprimer le groupe courant"
+
+msgid "W19: Deleting augroup that is still in use"
+msgstr "W19: Effacement d'augroup toujours en usage"
+
#, c-format
msgid "E215: Illegal character after *: %s"
msgstr "E215: Caract่re non valide apr่s * : %s"
-#: ../fileio.c:5905
#, c-format
msgid "E216: No such event: %s"
msgstr "E216: Aucun ้v้nement %s"
-#: ../fileio.c:5907
#, c-format
msgid "E216: No such group or event: %s"
msgstr "E216: Aucun ้v้nement ou groupe %s"
-#. Highlight title
-#: ../fileio.c:6090
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
"--- Auto-commandes ---"
-#: ../fileio.c:6293
#, c-format
msgid "E680: <buffer=%d>: invalid buffer number "
msgstr "E680: <buffer=%d> : num้ro de tampon invalide"
-#: ../fileio.c:6370
msgid "E217: Can't execute autocommands for ALL events"
msgstr ""
"E217: Impossible d'ex้cuter les autocommandes pour TOUS les ้v้nements (ALL)"
-#: ../fileio.c:6393
msgid "No matching autocommands"
msgstr "Aucune autocommande correspondante"
-#: ../fileio.c:6831
msgid "E218: autocommand nesting too deep"
msgstr "E218: autocommandes trop imbriqu้es"
-#: ../fileio.c:7143
#, c-format
-msgid "%s Auto commands for \"%s\""
+msgid "%s Autocommands for \"%s\""
msgstr "Autocommandes %s pour \"%s\""
-#: ../fileio.c:7149
#, c-format
msgid "Executing %s"
msgstr "Ex้cution de %s"
-#: ../fileio.c:7211
#, c-format
msgid "autocommand %s"
msgstr "autocommande %s"
-#: ../fileio.c:7795
msgid "E219: Missing {."
msgstr "E219: { manquant."
-#: ../fileio.c:7797
msgid "E220: Missing }."
msgstr "E220: } manquant."
-#: ../fold.c:93
msgid "E490: No fold found"
msgstr "E490: Aucun repli trouv้"
-#: ../fold.c:544
msgid "E350: Cannot create fold with current 'foldmethod'"
msgstr "E350: Impossible de cr้er un repli avec la 'foldmethod'e actuelle"
-#: ../fold.c:546
msgid "E351: Cannot delete fold with current 'foldmethod'"
msgstr "E351: Impossible de supprimer un repli avec la 'foldmethod'e actuelle"
-#: ../fold.c:1784
#, c-format
-msgid "+--%3ld lines folded "
-msgstr "+--%3ld lignes repli้es "
+msgid "+--%3ld line folded "
+msgid_plural "+--%3ld lines folded "
+msgstr[0] "+--%3ld ligne d้plac้e "
+msgstr[1] "+--%3ld lignes d้plac้es "
-#. buffer has already been read
-#: ../getchar.c:273
msgid "E222: Add to read buffer"
msgstr "E222: Ajout au tampon de lecture"
-#: ../getchar.c:2040
msgid "E223: recursive mapping"
msgstr "E223: mappage r้cursif"
-#: ../getchar.c:2849
#, c-format
msgid "E224: global abbreviation already exists for %s"
msgstr "E224: une abr้viation globale existe d้jเ pour %s"
-#: ../getchar.c:2852
#, c-format
msgid "E225: global mapping already exists for %s"
msgstr "E225: un mappage global existe d้jเ pour %s"
-#: ../getchar.c:2952
#, c-format
msgid "E226: abbreviation already exists for %s"
msgstr "E226: une abr้viation existe d้jเ pour %s"
-#: ../getchar.c:2955
#, c-format
msgid "E227: mapping already exists for %s"
msgstr "E227: un mappage existe d้jเ pour %s"
-#: ../getchar.c:3008
msgid "No abbreviation found"
msgstr "Aucune abr้viation trouv้e"
-#: ../getchar.c:3010
msgid "No mapping found"
msgstr "Aucun mappage trouv้"
-#: ../getchar.c:3974
msgid "E228: makemap: Illegal mode"
msgstr "E228: makemap : mode invalide"
-# msgstr "--Pas de lignes dans le tampon--"
-# DB - todo : ou encore : msgstr "--Aucune ligne dans le tampon--"
-#. key value of 'cedit' option
-#. type of cmdline window or 0
-#. result of cmdline window or 0
-#: ../globals.h:924
-msgid "--No lines in buffer--"
-msgstr "--Le tampon est vide--"
-
-#.
-#. * The error messages that can be shared are included here.
-#. * Excluded are errors that are only used once and debugging messages.
-#.
-#: ../globals.h:996
-msgid "E470: Command aborted"
-msgstr "E470: Commande annul้e"
-
-#: ../globals.h:997
-msgid "E471: Argument required"
-msgstr "E471: Argument requis"
-
-#: ../globals.h:998
-msgid "E10: \\ should be followed by /, ? or &"
-msgstr "E10: \\ devrait ๊tre suivi de /, ? ou &"
-
-#: ../globals.h:1000
-msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
+msgid "E851: Failed to create a new process for the GUI"
msgstr ""
-"E11: Invalide dans la fen๊tre ligne-de-commande ; <CR> ex้cute, CTRL-C quitte"
+"E851: ษchec lors de la cr้ation d'un nouveau processus pour l'interface "
+"graphique"
-#: ../globals.h:1002
-msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
+msgid "E852: The child process failed to start the GUI"
msgstr ""
-"E12: commande non autoris้e depuis un exrc/vimrc dans r้pertoire courant ou "
-"une recherche de marqueur"
-
-#: ../globals.h:1003
-msgid "E171: Missing :endif"
-msgstr "E171: :endif manquant"
-
-#: ../globals.h:1004
-msgid "E600: Missing :endtry"
-msgstr "E600: :endtry manquant"
-
-#: ../globals.h:1005
-msgid "E170: Missing :endwhile"
-msgstr "E170: :endwhile manquant"
-
-#: ../globals.h:1006
-msgid "E170: Missing :endfor"
-msgstr "E170: :endfor manquant"
-
-#: ../globals.h:1007
-msgid "E588: :endwhile without :while"
-msgstr "E588: :endwhile sans :while"
-
-#: ../globals.h:1008
-msgid "E588: :endfor without :for"
-msgstr "E588: :endfor sans :for"
-
-#: ../globals.h:1009
-msgid "E13: File exists (add ! to override)"
-msgstr "E13: Le fichier existe d้jเ (ajoutez ! pour passer outre)"
-
-#: ../globals.h:1010
-msgid "E472: Command failed"
-msgstr "E472: La commande a ้chou้"
-
-#: ../globals.h:1011
-msgid "E473: Internal error"
-msgstr "E473: Erreur interne"
+"E852: Le processus fils n'a pas r้ussi เ d้marrer l'interface graphique"
-#: ../globals.h:1012
-msgid "Interrupted"
-msgstr "Interrompu"
-
-#: ../globals.h:1013
-msgid "E14: Invalid address"
-msgstr "E14: Adresse invalide"
-
-#: ../globals.h:1014
-msgid "E474: Invalid argument"
-msgstr "E474: Argument invalide"
+msgid "E229: Cannot start the GUI"
+msgstr "E229: Impossible de d้marrer l'interface graphique"
-#: ../globals.h:1015
#, c-format
-msgid "E475: Invalid argument: %s"
-msgstr "E475: Argument invalide : %s"
+msgid "E230: Cannot read from \"%s\""
+msgstr "E230: Impossible de lire \"%s\""
-#: ../globals.h:1016
-#, c-format
-msgid "E15: Invalid expression: %s"
-msgstr "E15: Expression invalide : %s"
+msgid "E665: Cannot start GUI, no valid font found"
+msgstr ""
+"E665: Impossible de d้marrer l'IHM graphique, aucune police valide trouv้e"
-#: ../globals.h:1017
-msgid "E16: Invalid range"
-msgstr "E16: Plage invalide"
+msgid "E231: 'guifontwide' invalid"
+msgstr "E231: 'guifontwide' est invalide"
-#: ../globals.h:1018
-msgid "E476: Invalid command"
-msgstr "E476: Commande invalide"
+msgid "E599: Value of 'imactivatekey' is invalid"
+msgstr "E599: Valeur de 'imactivatekey' invalide"
-#: ../globals.h:1019
#, c-format
-msgid "E17: \"%s\" is a directory"
-msgstr "E17: \"%s\" est un r้pertoire"
+msgid "E254: Cannot allocate color %s"
+msgstr "E254: Impossible d'allouer la couleur %s"
-#: ../globals.h:1020
-#, fuzzy
-msgid "E900: Invalid job id"
-msgstr "E49: Valeur de d้filement invalide"
+msgid "No match at cursor, finding next"
+msgstr "Aucune correspondance sous le curseur, recherche de la suivante"
-#: ../globals.h:1021
-msgid "E901: Job table is full"
-msgstr ""
+msgid "<cannot open> "
+msgstr "<impossible d'ouvrir> "
-#: ../globals.h:1022
#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
+msgid "E616: vim_SelFile: can't get font %s"
+msgstr "E616: vim_SelFile : impossible d'obtenir la police %s"
-#: ../globals.h:1024
-#, c-format
-msgid "E364: Library call failed for \"%s()\""
-msgstr "E364: L'appel เ la biblioth่que a ้chou้ pour \"%s()\""
+msgid "E614: vim_SelFile: can't return to current directory"
+msgstr "E614: vim_SelFile : impossible de revenir dans le r้pertoire courant"
-#: ../globals.h:1026
-msgid "E19: Mark has invalid line number"
-msgstr "E19: La marque a un num้ro de ligne invalide"
+msgid "Pathname:"
+msgstr "Chemin :"
-#: ../globals.h:1027
-msgid "E20: Mark not set"
-msgstr "E20: Marque non positionn้e"
+msgid "E615: vim_SelFile: can't get current directory"
+msgstr "E615: vim_SelFile : impossible d'obtenir le r้pertoire courant"
-#: ../globals.h:1029
-msgid "E21: Cannot make changes, 'modifiable' is off"
-msgstr "E21: Impossible de modifier, 'modifiable' est d้sactiv้"
+msgid "OK"
+msgstr "Ok"
-#: ../globals.h:1030
-msgid "E22: Scripts nested too deep"
-msgstr "E22: Trop de r้cursion dans les scripts"
+msgid "Cancel"
+msgstr "Annuler"
-#: ../globals.h:1031
-msgid "E23: No alternate file"
-msgstr "E23: Pas de fichier alternatif"
+msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
+msgstr "Widget scrollbar : Impossible d'obtenir la g้om้trie du pixmap 'thumb'"
-#: ../globals.h:1032
-msgid "E24: No such abbreviation"
-msgstr "E24: Cette abr้viation n'existe pas"
+msgid "Vim dialog"
+msgstr "Vim"
-#: ../globals.h:1033
-msgid "E477: No ! allowed"
-msgstr "E477: Le ! n'est pas autoris้"
+msgid "E232: Cannot create BalloonEval with both message and callback"
+msgstr "E232: Impossible de cr้er un BalloonEval avec message ET callback"
-#: ../globals.h:1035
-msgid "E25: Nvim does not have a built-in GUI"
-msgstr "E25: L'interface graphique n'a pas ้t้ compil้e dans cette version"
+msgid "_Cancel"
+msgstr "_Annuler"
-#: ../globals.h:1036
-#, c-format
-msgid "E28: No such highlight group name: %s"
-msgstr "E28: Aucun nom de groupe de surbrillance %s"
+msgid "_Save"
+msgstr "_Enregistrer"
-#: ../globals.h:1037
-msgid "E29: No inserted text yet"
-msgstr "E29: Pas encore de texte ins้r้"
+msgid "_Open"
+msgstr "_Ouvrir"
-#: ../globals.h:1038
-msgid "E30: No previous command line"
-msgstr "E30: Aucune ligne de commande pr้c้dente"
+msgid "_OK"
+msgstr "_Ok"
-#: ../globals.h:1039
-msgid "E31: No such mapping"
-msgstr "E31: Mappage inexistant"
+msgid ""
+"&Yes\n"
+"&No\n"
+"&Cancel"
+msgstr ""
+"&Oui\n"
+"&Non\n"
+"&Annuler"
-#: ../globals.h:1040
-msgid "E479: No match"
-msgstr "E479: Aucune correspondance"
+msgid "Yes"
+msgstr "Oui"
-#: ../globals.h:1041
-#, c-format
-msgid "E480: No match: %s"
-msgstr "E480: Aucune correspondance : %s"
+msgid "No"
+msgstr "Non"
-#: ../globals.h:1042
-msgid "E32: No file name"
-msgstr "E32: Aucun nom de fichier"
+# todo '_' is for hotkey, i guess?
+msgid "Input _Methods"
+msgstr "_M้thodes de saisie"
-#: ../globals.h:1044
-msgid "E33: No previous substitute regular expression"
-msgstr "E33: Aucune expression r้guli่re de substitution pr้c้dente"
+msgid "VIM - Search and Replace..."
+msgstr "Remplacer - Vim"
-#: ../globals.h:1045
-msgid "E34: No previous command"
-msgstr "E34: Aucune commande pr้c้dente"
+msgid "VIM - Search..."
+msgstr "Rechercher - Vim"
-#: ../globals.h:1046
-msgid "E35: No previous regular expression"
-msgstr "E35: Aucune expression r้guli่re pr้c้dente"
+msgid "Find what:"
+msgstr "Rechercher :"
-#: ../globals.h:1047
-msgid "E481: No range allowed"
-msgstr "E481: Les plages ne sont pas autoris้es"
+msgid "Replace with:"
+msgstr "Remplacer par :"
-#: ../globals.h:1048
-msgid "E36: Not enough room"
-msgstr "E36: Pas assez de place"
+msgid "Match whole word only"
+msgstr "Mots entiers seulement"
-#: ../globals.h:1049
-#, c-format
-msgid "E482: Can't create file %s"
-msgstr "E482: Impossible de cr้er le fichier %s"
+msgid "Match case"
+msgstr "Respecter la casse"
-#: ../globals.h:1050
-msgid "E483: Can't get temp file name"
-msgstr "E483: Impossible d'obtenir un nom de fichier temporaire"
+msgid "Direction"
+msgstr "Direction"
-#: ../globals.h:1051
-#, c-format
-msgid "E484: Can't open file %s"
-msgstr "E484: Impossible d'ouvrir le fichier \"%s\""
+msgid "Up"
+msgstr "Haut"
-#: ../globals.h:1052
-#, c-format
-msgid "E485: Can't read file %s"
-msgstr "E485: Impossible de lire le fichier %s"
+msgid "Down"
+msgstr "Bas"
-#: ../globals.h:1054
-msgid "E37: No write since last change (add ! to override)"
-msgstr "E37: Modifications non enregistr้es (ajoutez ! pour passer outre)"
+msgid "Find Next"
+msgstr "Suivant"
-# AB - Il faut respecter l'esprit plus que la lettre. Dans le cas pr้sent,
-# nettement plus.
-#: ../globals.h:1055
-#, fuzzy
-msgid "E37: No write since last change"
-msgstr "[Attention : tout n'est pas enregistr้]\n"
+msgid "Replace"
+msgstr "Remplacer"
-#: ../globals.h:1056
-msgid "E38: Null argument"
-msgstr "E38: Argument null"
+msgid "Replace All"
+msgstr "Remplacer tout"
-#: ../globals.h:1057
-msgid "E39: Number expected"
-msgstr "E39: Nombre attendu"
+msgid "_Close"
+msgstr "_Fermer"
-#: ../globals.h:1058
-#, c-format
-msgid "E40: Can't open errorfile %s"
-msgstr "E40: Impossible d'ouvrir le fichier d'erreurs %s"
+msgid "Vim: Received \"die\" request from session manager\n"
+msgstr "Vim : Une requ๊te \"die\" a ้t้ re็ue par le gestionnaire de session\n"
-#: ../globals.h:1059
-msgid "E41: Out of memory!"
-msgstr "E41: M้moire ้puis้e"
+msgid "Close tab"
+msgstr "Fermer l'onglet"
-#: ../globals.h:1060
-msgid "Pattern not found"
-msgstr "Motif introuvable"
+msgid "New tab"
+msgstr "Nouvel onglet"
-#: ../globals.h:1061
-#, c-format
-msgid "E486: Pattern not found: %s"
-msgstr "E486: Motif introuvable : %s"
+# DB - todo : un peu long. Cet entr้e de menu permet d'ouvrir un fichier
+# dans un nouvel onglet via le s้lecteur de fichiers graphique.
+msgid "Open Tab..."
+msgstr "Ouvrir dans un onglet..."
-#: ../globals.h:1062
-msgid "E487: Argument must be positive"
-msgstr "E487: L'argument doit ๊tre positif"
+msgid "Vim: Main window unexpectedly destroyed\n"
+msgstr "Vim : Fen๊tre principale d้truite inopin้ment\n"
-#: ../globals.h:1064
-msgid "E459: Cannot go back to previous directory"
-msgstr "E459: Impossible de retourner au r้pertoire pr้c้dent"
+msgid "&Filter"
+msgstr "&Filtrer"
-#: ../globals.h:1066
-msgid "E42: No Errors"
-msgstr "E42: Aucune erreur"
+msgid "&Cancel"
+msgstr "&Annuler"
-# DB - TODO : trouver une traduction valable et attest้e pour "location".
-#: ../globals.h:1067
-msgid "E776: No location list"
-msgstr "E776: Aucune liste d'emplacements"
+msgid "Directories"
+msgstr "R้pertoires"
-#: ../globals.h:1068
-msgid "E43: Damaged match string"
-msgstr "E43: La cha๎ne de recherche est endommag้e"
+msgid "Filter"
+msgstr "Filtre"
-#: ../globals.h:1069
-msgid "E44: Corrupted regexp program"
-msgstr "E44: L'automate de regexp est corrompu"
+msgid "&Help"
+msgstr "&Aide"
-#: ../globals.h:1071
-msgid "E45: 'readonly' option is set (add ! to override)"
-msgstr "E45: L'option 'readonly' est activ้e (ajoutez ! pour passer outre)"
+msgid "Files"
+msgstr "Fichiers"
-#: ../globals.h:1073
-#, c-format
-msgid "E46: Cannot change read-only variable \"%s\""
-msgstr "E46: La variable \"%s\" est en lecture seule"
+msgid "&OK"
+msgstr "&Ok"
-#: ../globals.h:1075
-#, c-format
-msgid "E794: Cannot set variable in the sandbox: \"%s\""
-msgstr ""
-"E794: Impossible de modifier une variable depuis le bac เ sable : \"%s\""
+msgid "Selection"
+msgstr "S้lection"
-#: ../globals.h:1076
-msgid "E47: Error while reading errorfile"
-msgstr "E47: Erreur lors de la lecture du fichier d'erreurs"
+msgid "Find &Next"
+msgstr "Suiva&nt"
-#: ../globals.h:1078
-msgid "E48: Not allowed in sandbox"
-msgstr "E48: Op้ration interdite dans le bac เ sable"
+msgid "&Replace"
+msgstr "&Remplacer"
-#: ../globals.h:1080
-msgid "E523: Not allowed here"
-msgstr "E523: Interdit เ cet endroit"
+msgid "Replace &All"
+msgstr "Rempl&acer tout"
-#: ../globals.h:1082
-msgid "E359: Screen mode setting not supported"
-msgstr "E359: Choix du mode d'้cran non support้"
+msgid "&Undo"
+msgstr "Ann&uler"
-#: ../globals.h:1083
-msgid "E49: Invalid scroll size"
-msgstr "E49: Valeur de d้filement invalide"
+msgid "Open tab..."
+msgstr "Ouvrir dans un onglet..."
-#: ../globals.h:1084
-msgid "E91: 'shell' option is empty"
-msgstr "E91: L'option 'shell' est vide"
+msgid "Find string"
+msgstr "Trouver une cha๎ne"
-#: ../globals.h:1085
-msgid "E255: Couldn't read in sign data!"
-msgstr "E255: Impossible de lire les donn้es du symbole !"
+msgid "Find & Replace"
+msgstr "Trouver & remplacer"
-#: ../globals.h:1086
-msgid "E72: Close error on swap file"
-msgstr "E72: Erreur lors de la fermeture du fichier d'้change"
+# DB - Traduction non indispensable puisque le code indique qu'il s'agit d'un
+# param้trage bidon afin de s้lectionner un r้pertoire plut๔t qu'un
+# fichier.
+msgid "Not Used"
+msgstr "Non utilis้"
-#: ../globals.h:1087
-msgid "E73: tag stack empty"
-msgstr "E73: La pile des marqueurs est vide"
+# DB - Traduction non indispensable puisque le code indique qu'il s'agit d'un
+# param้trage bidon afin de s้lectionner un r้pertoire plut๔t qu'un
+# fichier.
+msgid "Directory\t*.nothing\n"
+msgstr "R้pertoire\t*.rien\n"
-#: ../globals.h:1088
-msgid "E74: Command too complex"
-msgstr "E74: Commande trop complexe"
+#, c-format
+msgid "E671: Cannot find window title \"%s\""
+msgstr "E671: Titre de fen๊tre \"%s\" introuvable"
-#: ../globals.h:1089
-msgid "E75: Name too long"
-msgstr "E75: Nom trop long"
+#, c-format
+msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
+msgstr "E243: Argument non support้ : \"-%s\" ; Utilisez la version OLE."
-#: ../globals.h:1090
-msgid "E76: Too many ["
-msgstr "E76: Trop de ["
+msgid "E672: Unable to open window inside MDI application"
+msgstr "E672: Impossible d'ouvrir une fen๊tre dans une application MDI"
-#: ../globals.h:1091
-msgid "E77: Too many file names"
-msgstr "E77: Trop de noms de fichiers"
+# DB - todo : perfectible.
+msgid "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
+msgstr ""
+"Vim E458: Erreur d'allocation de couleurs, couleurs possiblement incorrectes"
-#: ../globals.h:1092
-msgid "E488: Trailing characters"
-msgstr "E488: Caract่res surnum้raires"
+# DB - todo : La VF est-elle compr้hensible ?
+#, c-format
+msgid "E250: Fonts for the following charsets are missing in fontset %s:"
+msgstr ""
+"E250: Des polices manquent dans %s pour les jeux de caract่res suivants :"
-#: ../globals.h:1093
-msgid "E78: Unknown mark"
-msgstr "E78: Marque inconnue"
+#, c-format
+msgid "E252: Fontset name: %s"
+msgstr "E252: Nom du jeu de polices : %s"
-#: ../globals.h:1094
-msgid "E79: Cannot expand wildcards"
-msgstr "E79: Impossible de d้velopper les m้tacaract่res"
+#, c-format
+msgid "Font '%s' is not fixed-width"
+msgstr "La police '%s' n'a pas une largeur fixe"
-#: ../globals.h:1096
-msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
-msgstr "E591: 'winheight' ne peut pas ๊tre plus petit que 'winminheight'"
+#, c-format
+msgid "E253: Fontset name: %s"
+msgstr "E253: Nom du jeu de polices : %s"
-#: ../globals.h:1098
-msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
-msgstr "E592: 'winwidth' ne peut pas ๊tre plus petit que 'winminwidth'"
+#, c-format
+msgid "Font0: %s"
+msgstr "Font0: %s"
-#: ../globals.h:1099
-msgid "E80: Error while writing"
-msgstr "E80: Erreur lors de l'้criture"
+#, c-format
+msgid "Font1: %s"
+msgstr "Font1: %s"
-#: ../globals.h:1100
-msgid "Zero count"
-msgstr "Le quantificateur est nul"
+#, c-format
+msgid "Font%ld width is not twice that of font0"
+msgstr "La largeur de Font%ld n'est pas le double de celle de Font0"
-#: ../globals.h:1101
-msgid "E81: Using <SID> not in a script context"
-msgstr "E81: <SID> utilis้ en dehors d'un script"
+#, c-format
+msgid "Font0 width: %ld"
+msgstr "Largeur de Font0 : %ld"
-#: ../globals.h:1102
#, c-format
-msgid "E685: Internal error: %s"
-msgstr "E685: Erreur interne : %s"
+msgid "Font1 width: %ld"
+msgstr "Largeur de Font1 : %ld"
-#: ../globals.h:1104
-msgid "E363: pattern uses more memory than 'maxmempattern'"
-msgstr "E363: le motif utilise plus de m้moire que 'maxmempattern'"
+# DB - todo : Pas certain de mon coup, ici...
+msgid "Invalid font specification"
+msgstr "La sp้cification de la police est invalide"
-#: ../globals.h:1105
-msgid "E749: empty buffer"
-msgstr "E749: tampon vide"
+msgid "&Dismiss"
+msgstr "Aban&donner"
-#: ../buffer.c:1587
-#, c-format
-msgid "E86: Buffer %<PRId64> does not exist"
-msgstr "E86: Le tampon %<PRId64> n'existe pas"
+# DB - todo : Pas certain de mon coup, ici...
+msgid "no specific match"
+msgstr "aucune correspondance particuli่re"
-#: ../globals.h:1108
-msgid "E682: Invalid search pattern or delimiter"
-msgstr "E682: D้limiteur ou motif de recherche invalide"
+msgid "Vim - Font Selector"
+msgstr "Choisir une police - Vim"
-#: ../globals.h:1109
-msgid "E139: File is loaded in another buffer"
-msgstr "E139: Le fichier est charg้ dans un autre tampon"
+msgid "Name:"
+msgstr "Nom :"
-#: ../globals.h:1110
-#, c-format
-msgid "E764: Option '%s' is not set"
-msgstr "E764: L'option '%s' n'est pas activ้e"
+msgid "Show size in Points"
+msgstr "Afficher la taille en Points"
-#: ../globals.h:1111
-msgid "E850: Invalid register name"
-msgstr "E850: Nom de registre invalide"
+msgid "Encoding:"
+msgstr "Encodage :"
-#: ../globals.h:1114
-msgid "search hit TOP, continuing at BOTTOM"
-msgstr "La recherche a atteint le HAUT, et continue en BAS"
+msgid "Font:"
+msgstr "Police :"
-#: ../globals.h:1115
-msgid "search hit BOTTOM, continuing at TOP"
-msgstr "La recherche a atteint le BAS, et continue en HAUT"
+msgid "Style:"
+msgstr "Style :"
+
+msgid "Size:"
+msgstr "Taille :"
+
+msgid "E256: Hangul automata ERROR"
+msgstr "E256: ERREUR dans l'automate Hangul"
-#: ../hardcopy.c:240
msgid "E550: Missing colon"
msgstr "E550: ':' manquant"
# DB - Il s'agit ici d'un probl่me lors du parsing d'une option dont le contenu
# est une liste d'้l้ments s้par้s par des virgules.
-#: ../hardcopy.c:252
msgid "E551: Illegal component"
msgstr "E551: ้l้ment invalide"
-#: ../hardcopy.c:259
msgid "E552: digit expected"
msgstr "E552: chiffre attendu"
-#: ../hardcopy.c:473
#, c-format
msgid "Page %d"
msgstr "Page %d"
-#: ../hardcopy.c:597
msgid "No text to be printed"
msgstr "Aucun texte เ imprimer"
-#: ../hardcopy.c:668
#, c-format
msgid "Printing page %d (%d%%)"
msgstr "Impression de la page %d (%d%%)"
-#: ../hardcopy.c:680
#, c-format
msgid " Copy %d of %d"
msgstr " Copie %d sur %d"
-#: ../hardcopy.c:733
#, c-format
msgid "Printed: %s"
msgstr "Imprim้ : %s"
-#: ../hardcopy.c:740
msgid "Printing aborted"
msgstr "Impression interrompue"
-#: ../hardcopy.c:1365
msgid "E455: Error writing to PostScript output file"
msgstr "E455: Erreur lors de l'้criture du fichier PostScript"
-#: ../hardcopy.c:1747
#, c-format
msgid "E624: Can't open file \"%s\""
msgstr "E624: Impossible d'ouvrir le fichier \"%s\""
-#: ../hardcopy.c:1756 ../hardcopy.c:2470
#, c-format
msgid "E457: Can't read PostScript resource file \"%s\""
msgstr "E457: Impossible de lire le fichier de ressource PostScript \"%s\""
-#: ../hardcopy.c:1772
#, c-format
msgid "E618: file \"%s\" is not a PostScript resource file"
msgstr "E618: \"%s\" n'est pas un fichier de ressource PostScript"
-#: ../hardcopy.c:1788 ../hardcopy.c:1805 ../hardcopy.c:1844
#, c-format
msgid "E619: file \"%s\" is not a supported PostScript resource file"
msgstr "E619: \"%s\" n'est pas un fichier de ressource PostScript support้"
-#: ../hardcopy.c:1856
#, c-format
msgid "E621: \"%s\" resource file has wrong version"
msgstr "E621: La version du fichier de ressource \"%s\" est erron้e"
-#: ../hardcopy.c:2225
msgid "E673: Incompatible multi-byte encoding and character set."
msgstr "E673: Jeu de caract่res et encodage multi-octets incompatibles"
-#: ../hardcopy.c:2238
msgid "E674: printmbcharset cannot be empty with multi-byte encoding."
msgstr ""
"E674: 'printmbcharset' ne peut pas ๊tre vide avec un encodage multi-octets"
-#: ../hardcopy.c:2254
msgid "E675: No default font specified for multi-byte printing."
msgstr "E675: Aucune police par d้faut pour l'impression multi-octets"
-#: ../hardcopy.c:2426
msgid "E324: Can't open PostScript output file"
msgstr "E324: Impossible d'ouvrir le fichier PostScript de sortie"
-#: ../hardcopy.c:2458
#, c-format
msgid "E456: Can't open file \"%s\""
msgstr "E456: Impossible d'ouvrir le fichier \"%s\""
-#: ../hardcopy.c:2583
msgid "E456: Can't find PostScript resource file \"prolog.ps\""
msgstr "E456: Le fichier de ressource PostScript \"prolog.ps\" est introuvable"
-#: ../hardcopy.c:2593
msgid "E456: Can't find PostScript resource file \"cidfont.ps\""
msgstr ""
"E456: Le fichier de ressource PostScript \"cidfont.ps\" est introuvable"
-#: ../hardcopy.c:2622 ../hardcopy.c:2639 ../hardcopy.c:2665
#, c-format
msgid "E456: Can't find PostScript resource file \"%s.ps\""
msgstr "E456: Le fichier de ressource PostScript \"%s.ps\" est introuvable"
-#: ../hardcopy.c:2654
#, c-format
msgid "E620: Unable to convert to print encoding \"%s\""
msgstr "E620: La conversion pour imprimer dans l'encodage \"%s\" a ้chou้"
-#: ../hardcopy.c:2877
msgid "Sending to printer..."
msgstr "Envoi เ l'imprimante..."
-#: ../hardcopy.c:2881
msgid "E365: Failed to print PostScript file"
msgstr "E365: L'impression du fichier PostScript a ้chou้"
-#: ../hardcopy.c:2883
msgid "Print job sent."
msgstr "Tโche d'impression envoy้e."
-#: ../if_cscope.c:85
msgid "Add a new database"
msgstr "Ajouter une base de donn้es"
-#: ../if_cscope.c:87
msgid "Query for a pattern"
msgstr "Rechercher un motif"
-#: ../if_cscope.c:89
msgid "Show this message"
msgstr "Afficher ce message"
-#: ../if_cscope.c:91
msgid "Kill a connection"
msgstr "Fermer une connexion"
-#: ../if_cscope.c:93
msgid "Reinit all connections"
msgstr "R้initialiser toutes les connexions"
-#: ../if_cscope.c:95
msgid "Show connections"
msgstr "Afficher les connexions"
-#: ../if_cscope.c:101
#, c-format
msgid "E560: Usage: cs[cope] %s"
msgstr "E560: Utilisation : cs[cope] %s"
-#: ../if_cscope.c:225
msgid "This cscope command does not support splitting the window.\n"
msgstr "Cette commande cscope ne supporte pas le partage de la fen๊tre.\n"
-#: ../if_cscope.c:266
msgid "E562: Usage: cstag <ident>"
msgstr "E562: Utilisation : cstag <ident>"
-#: ../if_cscope.c:313
msgid "E257: cstag: tag not found"
msgstr "E257: cstag : marqueur introuvable"
-#: ../if_cscope.c:461
#, c-format
msgid "E563: stat(%s) error: %d"
msgstr "E563: Erreur stat(%s) : %d"
-#: ../if_cscope.c:551
+msgid "E563: stat error"
+msgstr "E563: Erreur stat"
+
#, c-format
msgid "E564: %s is not a directory or a valid cscope database"
msgstr "E564: %s n'est pas un r้pertoire ou une base de donn้es cscope valide"
-#: ../if_cscope.c:566
#, c-format
msgid "Added cscope database %s"
msgstr "Base de donn้es cscope %s ajout้e"
-#: ../if_cscope.c:616
#, c-format
-msgid "E262: error reading cscope connection %<PRId64>"
-msgstr "E262: erreur lors de la lecture de la connexion cscope %<PRId64>"
+msgid "E262: error reading cscope connection %ld"
+msgstr "E262: erreur lors de la lecture de la connexion cscope %ld"
-#: ../if_cscope.c:711
msgid "E561: unknown cscope search type"
msgstr "E561: type de recherche cscope inconnu"
-#: ../if_cscope.c:752 ../if_cscope.c:789
msgid "E566: Could not create cscope pipes"
msgstr "E566: Impossible de cr้er les tuyaux (pipes) cscope"
-#: ../if_cscope.c:767
msgid "E622: Could not fork for cscope"
msgstr "E622: Impossible de forker pour cscope"
-#: ../if_cscope.c:849
-#, fuzzy
msgid "cs_create_connection setpgid failed"
-msgstr "exec de cs_create_connection a ้chou้"
+msgstr "cs_create_connection setpgid a ้chou้"
-#: ../if_cscope.c:853 ../if_cscope.c:889
msgid "cs_create_connection exec failed"
msgstr "exec de cs_create_connection a ้chou้"
-#: ../if_cscope.c:863 ../if_cscope.c:902
msgid "cs_create_connection: fdopen for to_fp failed"
msgstr "cs_create_connection : fdopen pour to_fp a ้chou้"
-#: ../if_cscope.c:865 ../if_cscope.c:906
msgid "cs_create_connection: fdopen for fr_fp failed"
msgstr "cs_create_connection : fdopen pour fr_fp a ้chou้"
-#: ../if_cscope.c:890
msgid "E623: Could not spawn cscope process"
msgstr "E623: Impossible d'engendrer le processus cscope"
-#: ../if_cscope.c:932
msgid "E567: no cscope connections"
msgstr "E567: Aucune connexion cscope"
-#: ../if_cscope.c:1009
#, c-format
msgid "E469: invalid cscopequickfix flag %c for %c"
msgstr "E469: Drapeau cscopequickfix %c invalide pour %c"
# DB - todo
-#: ../if_cscope.c:1058
#, c-format
msgid "E259: no matches found for cscope query %s of %s"
msgstr "E259: aucune correspondance trouv้e pour la requ๊te cscope %s de %s"
-#: ../if_cscope.c:1142
msgid "cscope commands:\n"
msgstr "commandes cscope :\n"
-#: ../if_cscope.c:1150
#, c-format
msgid "%-5s: %s%*s (Usage: %s)"
msgstr "%-5s: %s%*s (Utilisation : %s)"
-#: ../if_cscope.c:1155
msgid ""
"\n"
+" a: Find assignments to this symbol\n"
" c: Find functions calling this function\n"
" d: Find functions called by this function\n"
" e: Find this egrep pattern\n"
@@ -3449,6 +2798,7 @@ msgid ""
" t: Find this text string\n"
msgstr ""
"\n"
+" a: Trouver les affectations เ ce symbole\n"
" c: Trouver les fonctions appelant cette fonction\n"
" d: Trouver les fonctions appel้es par cette fonction\n"
" e: Trouver ce motif egrep\n"
@@ -3458,31 +2808,32 @@ msgstr ""
" s: Trouver ce symbole C\n"
" t: Trouver cette cha๎ne\n"
-#: ../if_cscope.c:1226
+#, c-format
+msgid "E625: cannot open cscope database: %s"
+msgstr "E625: impossible d'ouvrir la base de donn้es cscope %s"
+
+msgid "E626: cannot get cscope database information"
+msgstr ""
+"E626: impossible d'obtenir des informations sur la base de donn้es cscope"
+
msgid "E568: duplicate cscope database not added"
msgstr "E568: base de donn้es cscope redondante non ajout้e"
-#: ../if_cscope.c:1335
#, c-format
msgid "E261: cscope connection %s not found"
msgstr "E261: Connexion cscope %s introuvable"
-#: ../if_cscope.c:1364
#, c-format
msgid "cscope connection %s closed"
msgstr "connexion cscope %s ferm้e"
-#. should not reach here
-#: ../if_cscope.c:1486
msgid "E570: fatal error in cs_manage_matches"
msgstr "E570: erreur fatale dans cs_manage_matches"
-#: ../if_cscope.c:1693
#, c-format
msgid "Cscope tag: %s"
msgstr "Marqueur cscope : %s"
-#: ../if_cscope.c:1711
msgid ""
"\n"
" # line"
@@ -3491,87 +2842,304 @@ msgstr ""
" # ligne"
# DB - todo : Faut-il respecter l'alignement ici ?
-#: ../if_cscope.c:1713
msgid "filename / context / line\n"
msgstr "nom / contexte/ ligne\n"
-#: ../if_cscope.c:1809
#, c-format
msgid "E609: Cscope error: %s"
msgstr "E609: Erreur cscope : %s"
-#: ../if_cscope.c:2053
msgid "All cscope databases reset"
msgstr "Toutes les bases de donn้es cscope ont ้t้ r้initialis้es"
-#: ../if_cscope.c:2123
msgid "no cscope connections\n"
msgstr "aucune connexion cscope\n"
-#: ../if_cscope.c:2126
msgid " # pid database name prepend path\n"
msgstr " # pid nom de la base de donn้es chemin\n"
-#: ../main.c:144
+msgid "Lua library cannot be loaded."
+msgstr "La biblioth่que Lua n'a pas pu ๊tre charg้e."
+
+msgid "cannot save undo information"
+msgstr "impossible d'enregistrer les informations d'annulation"
+
+msgid ""
+"E815: Sorry, this command is disabled, the MzScheme libraries could not be "
+"loaded."
+msgstr ""
+"E815: D้sol้, cette commande est d้sactiv้e : les biblioth่ques MzScheme "
+"n'ont pas pu ๊tre charg้es."
+
+msgid ""
+"E895: Sorry, this command is disabled, the MzScheme's racket/base module "
+"could not be loaded."
+msgstr ""
+"E895: D้sol้, cette commande est d้sactiv้e : le module MzScheme racket/base "
+"ne peut pas ๊tre charg้."
+
+msgid "invalid expression"
+msgstr "expression invalide"
+
+msgid "expressions disabled at compile time"
+msgstr "expressions d้sactiv้es lors de la compilation"
+
+msgid "hidden option"
+msgstr "option cach้e"
+
+msgid "unknown option"
+msgstr "option inconnue"
+
+msgid "window index is out of range"
+msgstr "num้ro de fen๊tre hors limites"
+
+msgid "couldn't open buffer"
+msgstr "impossible d'ouvrir le tampon"
+
+msgid "cannot delete line"
+msgstr "impossible d'effacer la ligne"
+
+msgid "cannot replace line"
+msgstr "impossible de remplacer la ligne"
+
+msgid "cannot insert line"
+msgstr "impossible d'ins้rer la ligne"
+
+msgid "string cannot contain newlines"
+msgstr "une cha๎ne ne peut pas contenir de saut-de-ligne"
+
+msgid "error converting Scheme values to Vim"
+msgstr "erreur lors de la conversion d'une valeur de Scheme เ Vim"
+
+msgid "Vim error: ~a"
+msgstr "Erreur Vim : ~a"
+
+msgid "Vim error"
+msgstr "Erreur Vim"
+
+msgid "buffer is invalid"
+msgstr "tampon invalide"
+
+msgid "window is invalid"
+msgstr "fen๊tre invalide"
+
+msgid "linenr out of range"
+msgstr "num้ro de ligne hors limites"
+
+msgid "not allowed in the Vim sandbox"
+msgstr "non autoris้ dans le bac เ sable"
+
+msgid "E836: This Vim cannot execute :python after using :py3"
+msgstr "E836: Vim ne peut pas ex้cuter :python apr่s avoir utilis้ :py3"
+
+msgid ""
+"E263: Sorry, this command is disabled, the Python library could not be "
+"loaded."
+msgstr ""
+"E263: D้sol้, commande d้sactiv้e : la biblioth่que Python n'a pas pu ๊tre "
+"charg้e."
+
+msgid ""
+"E887: Sorry, this command is disabled, the Python's site module could not be "
+"loaded."
+msgstr ""
+"E887: D้sol้, commande d้sactiv้e : la biblioth่que Python n'a pas pu ๊tre "
+"charg้e."
+
+msgid "E659: Cannot invoke Python recursively"
+msgstr "E659: Impossible d'invoquer Python r้cursivement"
+
+msgid "E837: This Vim cannot execute :py3 after using :python"
+msgstr "E837: Vim ne peut pas ex้cuter :py3 apr่s avoir utilis้ :python"
+
+msgid "E265: $_ must be an instance of String"
+msgstr "E265: $_ doit ๊tre une instance de cha๎ne (String)"
+
+msgid ""
+"E266: Sorry, this command is disabled, the Ruby library could not be loaded."
+msgstr ""
+"E266: D้sol้, commande d้sactiv้e : la biblioth่que Ruby n'a pas pu ๊tre "
+"charg้e."
+
+msgid "E267: unexpected return"
+msgstr "E267: ซ return ป inattendu"
+
+msgid "E268: unexpected next"
+msgstr "E268: ซ next ป inattendu"
+
+msgid "E269: unexpected break"
+msgstr "E269: ซ break ป inattendu"
+
+msgid "E270: unexpected redo"
+msgstr "E270: ซ redo ป inattendu"
+
+msgid "E271: retry outside of rescue clause"
+msgstr "E271: ซ retry ป hors d'une clause ซ rescue ป"
+
+msgid "E272: unhandled exception"
+msgstr "E272: Exception non prise en charge"
+
+# DB - todo
+#, c-format
+msgid "E273: unknown longjmp status %d"
+msgstr "E273: contexte de longjmp inconnu : %d"
+
+msgid "invalid buffer number"
+msgstr "num้ro de tampon invalide"
+
+msgid "not implemented yet"
+msgstr "pas encore impl้ment้"
+
+# DB - TODO : le contexte est celui d'une annulation.
+msgid "cannot set line(s)"
+msgstr "Impossible de remettre la/les ligne(s)"
+
+msgid "invalid mark name"
+msgstr "nom de marque invalide"
+
+msgid "mark not set"
+msgstr "marque non positionn้e"
+
+#, c-format
+msgid "row %d column %d"
+msgstr "ligne %d colonne %d"
+
+msgid "cannot insert/append line"
+msgstr "Impossible d'ins้rer/ajouter de lignes"
+
+msgid "line number out of range"
+msgstr "num้ro de ligne hors limites"
+
+msgid "unknown flag: "
+msgstr "drapeau inconnu : "
+
+msgid "unknown vimOption"
+msgstr "vimOption inconnue"
+
+msgid "keyboard interrupt"
+msgstr "interruption clavier"
+
+msgid "vim error"
+msgstr "erreur Vim"
+
+msgid "cannot create buffer/window command: object is being deleted"
+msgstr ""
+"Impossible de cr้er commande de tampon/fen๊tre : objet en cours d'effacement"
+
+msgid ""
+"cannot register callback command: buffer/window is already being deleted"
+msgstr ""
+"Impossible d'inscrire la commande de rappel : tampon/fen๊tre en effacement"
+
+msgid ""
+"E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-dev@vim."
+"org"
+msgstr ""
+"E280: ERREUR FATALE TCL: reflist corrompue ?! Contactez vim-dev@vim.org, SVP."
+
+msgid "cannot register callback command: buffer/window reference not found"
+msgstr ""
+"Impossible d'inscrire la commande de rappel : r้f. tampon/fen๊tre introuvable"
+
+msgid ""
+"E571: Sorry, this command is disabled: the Tcl library could not be loaded."
+msgstr ""
+"E571: D้sol้, commande d้sactiv้e: la biblioth่que Tcl n'a pas pu ๊tre "
+"charg้e."
+
+#, c-format
+msgid "E572: exit code %d"
+msgstr "E572: code de sortie %d"
+
+msgid "cannot get line"
+msgstr "Impossible d'obtenir la ligne"
+
+msgid "Unable to register a command server name"
+msgstr "Impossible d'inscrire un nom de serveur de commande"
+
+msgid "E248: Failed to send command to the destination program"
+msgstr "E248: ษchec de l'envoi de la commande au programme cible"
+
+#, c-format
+msgid "E573: Invalid server id used: %s"
+msgstr "E573: Id utilis้ pour le serveur invalide : %s"
+
+msgid "E251: VIM instance registry property is badly formed. Deleted!"
+msgstr "E251: Entr้e registre de l'instance de Vim mal format้e. Suppression !"
+
+#, c-format
+msgid "E938: Duplicate key in JSON: \"%s\""
+msgstr "E938: Cl้ dupliqu้e dans le document JSON : \"%s\""
+
+#, c-format
+msgid "E696: Missing comma in List: %s"
+msgstr "E696: Il manque une virgule dans la Liste %s"
+
+#, c-format
+msgid "E697: Missing end of List ']': %s"
+msgstr "E697: Il manque ']' เ la fin de la Liste %s"
+
msgid "Unknown option argument"
msgstr "Option inconnue"
-#: ../main.c:146
msgid "Too many edit arguments"
msgstr "Trop d'arguments d'้dition"
-#: ../main.c:148
msgid "Argument missing after"
msgstr "Argument manquant apr่s"
-#: ../main.c:150
msgid "Garbage after option argument"
msgstr "arguments en trop apr่s l'option"
-#: ../main.c:152
msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"
msgstr "Trop d'arguments \"+command\", \"-c command\" ou \"--cmd command\""
-#: ../main.c:154
msgid "Invalid argument for"
msgstr "Argument invalide pour"
-#: ../main.c:294
#, c-format
msgid "%d files to edit\n"
msgstr "%d fichiers เ ้diter\n"
-#: ../main.c:1342
+msgid "netbeans is not supported with this GUI\n"
+msgstr "netbeans n'est pas support้ avec cette interface graphique\n"
+
+msgid "'-nb' cannot be used: not enabled at compile time\n"
+msgstr "'-nb' ne peut pas ๊tre utilis้ : d้sactiv้ เ la compilation\n"
+
+msgid "This Vim was not compiled with the diff feature."
+msgstr "Ce Vim n'a pas ้t้ compil้ avec la fonctionnalit้ diff"
+
msgid "Attempt to open script file again: \""
msgstr "Nouvelle tentative pour ouvrir le script : \""
-#: ../main.c:1350
msgid "Cannot open for reading: \""
msgstr "Impossible d'ouvrir en lecture : \""
-#: ../main.c:1393
msgid "Cannot open for script output: \""
msgstr "Impossible d'ouvrir pour la sortie script : \""
-#: ../main.c:1622
+msgid "Vim: Error: Failure to start gvim from NetBeans\n"
+msgstr "Vim : Erreur : Impossible de d้marrer gvim depuis NetBeans\n"
+
+msgid "Vim: Error: This version of Vim does not run in a Cygwin terminal\n"
+msgstr ""
+"Vim : Erreur : Cette version de Vim ne fonctionne pas dans un terminal "
+"Cygwin\n"
+
msgid "Vim: Warning: Output is not to a terminal\n"
msgstr "Vim : Alerte : La sortie ne s'effectue pas sur un terminal\n"
-#: ../main.c:1624
msgid "Vim: Warning: Input is not from a terminal\n"
msgstr "Vim : Alerte : L'entr้e ne se fait pas sur un terminal\n"
-#. just in case..
-#: ../main.c:1891
msgid "pre-vimrc command line"
msgstr "ligne de commande pre-vimrc"
-#: ../main.c:1964
#, c-format
msgid "E282: Cannot read from \"%s\""
msgstr "E282: Impossible de lire \"%s\""
-#: ../main.c:2149
msgid ""
"\n"
"More info with: \"vim -h\"\n"
@@ -3579,37 +3147,30 @@ msgstr ""
"\n"
"Plus d'info avec : \"vim -h\"\n"
-#: ../main.c:2178
msgid "[file ..] edit specified file(s)"
msgstr "[fichier ...] ouvrir le ou les fichiers sp้cifi้s"
-#: ../main.c:2179
msgid "- read text from stdin"
msgstr "- lire le texte เ partir de stdin"
-#: ../main.c:2180
msgid "-t tag edit file where tag is defined"
msgstr "-t marqueur ouvrir le fichier qui contient le marqueur"
-#: ../main.c:2181
msgid "-q [errorfile] edit file with first error"
msgstr "-q [fichErr] ouvrir เ l'endroit de la premi่re erreur"
-#: ../main.c:2187
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
-"utilisation :"
+"Utilisation :"
-#: ../main.c:2189
msgid " vim [arguments] "
msgstr " vim [args] "
-#: ../main.c:2193
msgid ""
"\n"
" or:"
@@ -3617,7 +3178,15 @@ msgstr ""
"\n"
" ou :"
-#: ../main.c:2196
+# DB - todo (VMS uniquement).
+msgid ""
+"\n"
+"Where case is ignored prepend / to make flag upper case"
+msgstr ""
+"\n"
+"pour lesquels la casse est indiff้rente (/ pour que le drapeau soit "
+"majuscule)"
+
msgid ""
"\n"
"\n"
@@ -3627,192 +3196,338 @@ msgstr ""
"\n"
"Arguments :\n"
-#: ../main.c:2197
msgid "--\t\t\tOnly file names after this"
msgstr "--\t\tSeuls des noms de fichier sont sp้cifi้s apr่s ceci"
-#: ../main.c:2199
msgid "--literal\t\tDon't expand wildcards"
msgstr "--literal\tNe pas d้velopper les m้tacaract่res"
-#: ../main.c:2201
+msgid "-register\t\tRegister this gvim for OLE"
+msgstr "-register\tInscrire ce gvim pour OLE"
+
+msgid "-unregister\t\tUnregister gvim for OLE"
+msgstr "-unregister\tD้sinscrire gvim de OLE"
+
+msgid "-g\t\t\tRun using GUI (like \"gvim\")"
+msgstr "-g\t\tLancer l'interface graphique (comme \"gvim\")"
+
+msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
+msgstr ""
+"-f, --nofork\tPremier-plan : ne pas d้tacher l'interface graphique du "
+"terminal"
+
msgid "-v\t\t\tVi mode (like \"vi\")"
msgstr "-v\t\tMode Vi (comme \"vi\")"
-#: ../main.c:2202
msgid "-e\t\t\tEx mode (like \"ex\")"
msgstr "-e\t\tMode Ex (comme \"ex\")"
-#: ../main.c:2203
msgid "-E\t\t\tImproved Ex mode"
msgstr "-E\t\t\tMode Ex am้lior้"
-#: ../main.c:2204
msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")"
msgstr "-s\t\tMode silencieux (batch) (seulement pour \"ex\")"
-#: ../main.c:2205
msgid "-d\t\t\tDiff mode (like \"vimdiff\")"
msgstr "-d\t\tMode diff (comme \"vimdiff\")"
-#: ../main.c:2206
msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
msgstr "-y\t\tMode facile (comme \"evim\", vim sans modes)"
-#: ../main.c:2207
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\tMode lecture seule (comme \"view\")"
-#: ../main.c:2208
msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
msgstr "-Z\t\tMode restreint (comme \"rvim\")"
-#: ../main.c:2209
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\tInterdire l'enregistrement des fichiers"
-#: ../main.c:2210
msgid "-M\t\t\tModifications in text not allowed"
msgstr "-M\t\tInterdire toute modification de texte"
-#: ../main.c:2211
msgid "-b\t\t\tBinary mode"
msgstr "-b\t\tMode binaire"
-#: ../main.c:2212
msgid "-l\t\t\tLisp mode"
msgstr "-l\t\tMode lisp"
-#: ../main.c:2213
msgid "-C\t\t\tCompatible with Vi: 'compatible'"
msgstr "-C\t\tCompatible avec Vi : 'compatible'"
-#: ../main.c:2214
msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'"
msgstr "-N\t\tPas totalement compatible avec Vi : 'nocompatible'"
-#: ../main.c:2215
msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]"
msgstr "-V[N][<fichier>]\tMode verbeux [niveau N] [dans <fichier>]"
-#: ../main.c:2216
msgid "-D\t\t\tDebugging mode"
msgstr "-D\t\tMode d้bogage"
-#: ../main.c:2217
msgid "-n\t\t\tNo swap file, use memory only"
msgstr "-n\t\tNe pas utiliser de fichier d'้change, seulement la m้moire"
-#: ../main.c:2218
msgid "-r\t\t\tList swap files and exit"
msgstr "-r\t\tLister les fichiers d'้change et quitter"
-#: ../main.c:2219
msgid "-r (with file name)\tRecover crashed session"
msgstr "-r <fichier>\tR้cup้rer une session plant้e"
-#: ../main.c:2220
msgid "-L\t\t\tSame as -r"
msgstr "-L\t\tComme -r"
-#: ../main.c:2221
-msgid "-A\t\t\tstart in Arabic mode"
+msgid "-f\t\t\tDon't use newcli to open window"
+msgstr "-f\t\tNe pas utiliser newcli pour l'ouverture des fen๊tres"
+
+msgid "-dev <device>\t\tUse <device> for I/O"
+msgstr "-dev <p้riph>\tUtiliser <p้riph้rique> pour les E/S"
+
+msgid "-A\t\t\tStart in Arabic mode"
msgstr "-A\t\tD้marrer en mode arabe"
-#: ../main.c:2222
msgid "-H\t\t\tStart in Hebrew mode"
msgstr "-H\t\tD้marrer en mode h้breu"
-#: ../main.c:2223
msgid "-F\t\t\tStart in Farsi mode"
msgstr "-F\t\tD้marrer en mode farsi"
-#: ../main.c:2224
msgid "-T <terminal>\tSet terminal type to <terminal>"
msgstr "-T <term>\tR้gler le type du terminal sur <terminal>"
-#: ../main.c:2225
+msgid "--not-a-term\t\tSkip warning for input/output not being a terminal"
+msgstr ""
+"--no-a-term\t\tAucun avertissement si l'entr้e/sortie n'est pas un terminal"
+
+msgid "--ttyfail\t\tExit if input or output is not a terminal"
+msgstr "--ttyfail\t\tQuitte si l'entr้e ou la sortie ne sont pas un terminal"
+
msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc"
msgstr "-u <vimrc>\tUtiliser <vimrc> au lieu du vimrc habituel"
-#: ../main.c:2226
+msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
+msgstr "-U <gvimrc>\tUtiliser <gvimrc> au lieu du gvimrc habituel"
+
msgid "--noplugin\t\tDon't load plugin scripts"
msgstr "--noplugin\tNe charger aucun greffon"
-#: ../main.c:2227
msgid "-p[N]\t\tOpen N tab pages (default: one for each file)"
msgstr "-p[N]\tOuvrir N onglets (d้faut : un pour chaque fichier)"
-#: ../main.c:2228
msgid "-o[N]\t\tOpen N windows (default: one for each file)"
msgstr "-o[N]\tOuvrir N fen๊tres (d้faut : une pour chaque fichier)"
-#: ../main.c:2229
msgid "-O[N]\t\tLike -o but split vertically"
msgstr "-O[N]\tComme -o, mais partager verticalement"
-#: ../main.c:2230
msgid "+\t\t\tStart at end of file"
msgstr "+\t\tOuvrir เ la fin du fichier"
-#: ../main.c:2231
msgid "+<lnum>\t\tStart at line <lnum>"
msgstr "+<numL>\tOuvrir le fichier เ la ligne <numL>"
-#: ../main.c:2232
msgid "--cmd <command>\tExecute <command> before loading any vimrc file"
msgstr "--cmd <cmde>\tEx้cuter <commande> avant de charger les fichiers vimrc"
-#: ../main.c:2233
msgid "-c <command>\t\tExecute <command> after loading the first file"
msgstr "-c <cmde>\tEx้cuter <commande> une fois le 1er fichier charg้"
-#: ../main.c:2235
msgid "-S <session>\t\tSource file <session> after loading the first file"
msgstr ""
"-S <session>\tSourcer le fichier <session> une fois le 1er fichier charg้"
-#: ../main.c:2236
msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>"
msgstr "-s <src>\tLire les commandes du mode Normal เ partir du fichier <src>"
-#: ../main.c:2237
msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>"
msgstr "-w <dest>\tAjouter toutes les commandes tap้es dans le fichier <dest>"
-#: ../main.c:2238
msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>"
msgstr "-W <dest>\tษcrire toutes les commandes tap้es dans le fichier <dest>"
-#: ../main.c:2240
+msgid "-x\t\t\tEdit encrypted files"
+msgstr "-x\t\t\tษditer des fichiers chiffr้s"
+
+msgid "-display <display>\tConnect vim to this particular X-server"
+msgstr "-display <display>\tConnecter Vim au serveur X sp้cifi้"
+
+msgid "-X\t\t\tDo not connect to X server"
+msgstr "-X\t\t\tNe pas se connecter เ un serveur X"
+
+msgid "--remote <files>\tEdit <files> in a Vim server if possible"
+msgstr "--remote <fich>\tษditer les <fichiers> dans un serveur Vim si possible"
+
+msgid "--remote-silent <files> Same, don't complain if there is no server"
+msgstr ""
+"--remote-silent ...\tPareil, mais pas d'erreur s'il n'y a aucun serveur"
+
+msgid ""
+"--remote-wait <files> As --remote but wait for files to have been edited"
+msgstr ""
+"--remote-wait <fich>\tComme --remote mais ne quitter qu'เ la fin de l'้dition"
+
+msgid ""
+"--remote-wait-silent <files> Same, don't complain if there is no server"
+msgstr ""
+"--remote-wait-silent\tPareil, mais pas d'erreur s'il n'y a aucun serveur"
+
+msgid ""
+"--remote-tab[-wait][-silent] <files> As --remote but use tab page per file"
+msgstr ""
+"--remote-tab[-wait][-silent] <fich>\tComme --remote mais ouvrir un onglet "
+"pour chaque fichier"
+
+msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
+msgstr "--remote-send <tche>\tEnvoyer <touches> เ un serveur Vim puis quitter"
+
+msgid "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
+msgstr ""
+"--remote-expr <expr>\tษvaluer <expr> dans un serveur Vim, afficher le "
+"r้sultat"
+
+msgid "--serverlist\t\tList available Vim server names and exit"
+msgstr ""
+"--serverlist\t\tLister les noms des serveurs Vim disponibles et quitter"
+
+msgid "--servername <name>\tSend to/become the Vim server <name>"
+msgstr "--servername <nom>\tEnvoyer au/devenir le serveur Vim nomm้ <nom>"
+
msgid "--startuptime <file>\tWrite startup timing messages to <file>"
msgstr ""
"--startuptime <fich>\tษcrire les messages d'horodatage au d้marrage dans "
"<fich>"
-#: ../main.c:2242
msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
msgstr "-i <viminfo>\t\tUtiliser <viminfo> au lieu du viminfo habituel"
-#: ../main.c:2243
+msgid "--clean\t\t'nocompatible', Vim defaults, no plugins, no viminfo"
+msgstr ""
+"--clean\t\t'nocompatible', r้glages par d้faut, aucun greffon ni viminfo"
+
msgid "-h or --help\tPrint Help (this message) and exit"
msgstr "-h ou --help\t\tAfficher l'aide (ce message) puis quitter"
-#: ../main.c:2244
msgid "--version\t\tPrint version information and exit"
msgstr "--version\t\tAfficher les informations de version et quitter"
-#: ../mark.c:676
+msgid ""
+"\n"
+"Arguments recognised by gvim (Motif version):\n"
+msgstr ""
+"\n"
+"Arguments reconnus par gvim (version Motif) :\n"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (neXtaw version):\n"
+msgstr ""
+"\n"
+"Arguments reconnus par gvim (version neXtaw) :\n"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (Athena version):\n"
+msgstr ""
+"\n"
+"Arguments reconnus par gvim (version Athena) :\n"
+
+msgid "-display <display>\tRun vim on <display>"
+msgstr "-display <้cran>\tLancer Vim sur ce <display>"
+
+msgid "-iconic\t\tStart vim iconified"
+msgstr "-iconic\t\tIconifier Vim au d้marrage"
+
+msgid "-background <color>\tUse <color> for the background (also: -bg)"
+msgstr ""
+"-background <coul>\tUtiliser <couleur> pour l'arri่re-plan\t (abrv : -bg)"
+
+msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
+msgstr ""
+"-foreground <coul>\tUtiliser <couleur> pour le texte normal\t (abrv : -fg)"
+
+msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
+msgstr "-font <fonte>\tUtiliser <fonte> pour le texte normal\t (abrv : -fn)"
+
+msgid "-boldfont <font>\tUse <font> for bold text"
+msgstr "-boldfont <fonte>\tUtiliser <fonte> pour le texte gras"
+
+msgid "-italicfont <font>\tUse <font> for italic text"
+msgstr "-italicfont <fonte>\tUtiliser <fonte> pour le texte italique"
+
+msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
+msgstr "-geometry <g้om>\tUtiliser cette <g้om้trie> initiale\t (abrv : -geom)"
+
+msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
+msgstr ""
+"-borderwidth <้pais>\tUtiliser cette <้paisseur> de bordure\t (abrv : -bw)"
+
+msgid "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
+msgstr ""
+"-scrollbarwidth <lg>\tUtiliser cette <largeur> de barre de d้fil. (abrv: -sw)"
+
+msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
+msgstr "-menuheight <haut>\tUtiliser cette <hauteur> de menu\t (abrv : -mh)"
+
+msgid "-reverse\t\tUse reverse video (also: -rv)"
+msgstr "-reverse\t\tUtiliser la vid้o inverse\t\t (abrv : -rv)"
+
+msgid "+reverse\t\tDon't use reverse video (also: +rv)"
+msgstr "+reverse\t\tNe pas utiliser de vid้o inverse\t (abrv : +rv)"
+
+msgid "-xrm <resource>\tSet the specified resource"
+msgstr "-xrm <ressource>\tConfigurer la <ressource> sp้cifi้e"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (GTK+ version):\n"
+msgstr ""
+"\n"
+"Arguments reconnus par gvim (version GTK+) :\n"
+
+msgid "-display <display>\tRun vim on <display> (also: --display)"
+msgstr ""
+"-display <display>\tLancer Vim sur ce <display>\t(้galement : --display)"
+
+msgid "--role <role>\tSet a unique role to identify the main window"
+msgstr "--role <r๔le>\tDonner un r๔le pour identifier la fen๊tre principale"
+
+msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
+msgstr "--socketid <xid>\tOuvrir Vim dans un autre widget GTK"
+
+msgid "--echo-wid\t\tMake gvim echo the Window ID on stdout"
+msgstr "--echo-wid\t\tGvim affiche l'ID de la fen๊tre sur stdout"
+
+msgid "-P <parent title>\tOpen Vim inside parent application"
+msgstr "-P <titre parent>\tOuvrir Vim dans une application parente"
+
+msgid "--windowid <HWND>\tOpen Vim inside another win32 widget"
+msgstr "--windowid <HWND>\tOuvrir Vim dans un autre widget win32"
+
+msgid "No display"
+msgstr "Aucun display"
+
+msgid ": Send failed.\n"
+msgstr " : L'envoi a ้chou้.\n"
+
+msgid ": Send failed. Trying to execute locally\n"
+msgstr " : L'envoi a ้chou้. Tentative d'ex้cution locale\n"
+
+#, c-format
+msgid "%d of %d edited"
+msgstr "%d ้dit้s sur %d"
+
+msgid "No display: Send expression failed.\n"
+msgstr "Aucun display : L'envoi de l'expression a ้chou้.\n"
+
+msgid ": Send expression failed.\n"
+msgstr " : L'envoi de l'expression a ้chou้.\n"
+
msgid "No marks set"
msgstr "Aucune marque positionn้e"
-#: ../mark.c:678
#, c-format
msgid "E283: No marks matching \"%s\""
msgstr "E283: Aucune marque ne correspond เ \"%s\""
-#. Highlight title
-#: ../mark.c:687
msgid ""
"\n"
"mark line col file/text"
@@ -3820,8 +3535,6 @@ msgstr ""
"\n"
"marq ligne col fichier/texte"
-#. Highlight title
-#: ../mark.c:789
msgid ""
"\n"
" jump line col file/text"
@@ -3829,8 +3542,6 @@ msgstr ""
"\n"
" saut ligne col fichier/texte"
-#. Highlight title
-#: ../mark.c:831
msgid ""
"\n"
"change line col text"
@@ -3838,7 +3549,6 @@ msgstr ""
"\n"
"modif ligne col fichier/texte"
-#: ../mark.c:1238
msgid ""
"\n"
"# File marks:\n"
@@ -3846,8 +3556,6 @@ msgstr ""
"\n"
"# Marques dans le fichier :\n"
-#. Write the jumplist with -'
-#: ../mark.c:1271
msgid ""
"\n"
"# Jumplist (newest first):\n"
@@ -3855,7 +3563,6 @@ msgstr ""
"\n"
"# Liste de sauts (le plus r้cent en premier) :\n"
-#: ../mark.c:1352
msgid ""
"\n"
"# History of marks within files (newest to oldest):\n"
@@ -3863,84 +3570,90 @@ msgstr ""
"\n"
"# Historique des marques dans les fichiers (les plus r้centes en premier) :\n"
-#: ../mark.c:1431
msgid "Missing '>'"
msgstr "'>' manquant"
-#: ../memfile.c:426
+msgid "E543: Not a valid codepage"
+msgstr "E543: Page de codes non valide"
+
+msgid "E284: Cannot set IC values"
+msgstr "E284: Impossible de r้gler les valeurs IC"
+
+msgid "E285: Failed to create input context"
+msgstr "E285: ษchec de la cr้ation du contexte de saisie"
+
+msgid "E286: Failed to open input method"
+msgstr "E286: ษchec de l'ouverture de la m้thode de saisie"
+
+msgid "E287: Warning: Could not set destroy callback to IM"
+msgstr ""
+"E287: Alerte : Impossible d'inscrire le callback de destruction dans la MS"
+
+msgid "E288: input method doesn't support any style"
+msgstr "E288: la m้thode de saisie ne supporte aucun style"
+
+msgid "E289: input method doesn't support my preedit type"
+msgstr ""
+"E289: le type de pr้้dition de Vim n'est pas support้ par la m้thode de "
+"saisie"
+
msgid "E293: block was not locked"
msgstr "E293: le bloc n'้tait pas verrouill้"
-#: ../memfile.c:799
msgid "E294: Seek error in swap file read"
msgstr "E294: Erreur de positionnement lors de la lecture du fichier d'้change"
-#: ../memfile.c:803
msgid "E295: Read error in swap file"
msgstr "E295: Erreur de lecture dans le fichier d'้change"
-#: ../memfile.c:849
msgid "E296: Seek error in swap file write"
msgstr "E296: Erreur de positionnement lors de l'้criture du fichier d'้change"
-#: ../memfile.c:865
msgid "E297: Write error in swap file"
msgstr "E297: Erreur d'้criture dans le fichier d'้change"
-#: ../memfile.c:1036
msgid "E300: Swap file already exists (symlink attack?)"
msgstr "E300: Le fichier d'้change existe d้jเ (attaque par symlink ?)"
-#: ../memline.c:318
msgid "E298: Didn't get block nr 0?"
msgstr "E298: Bloc nฐ0 non r้cup้r้ ?"
-#: ../memline.c:361
msgid "E298: Didn't get block nr 1?"
msgstr "E298: Bloc nฐ1 non r้cup้r้ ?"
-#: ../memline.c:377
msgid "E298: Didn't get block nr 2?"
msgstr "E298: Bloc nฐ2 non r้cup้r้ ?"
-#. could not (re)open the swap file, what can we do????
-#: ../memline.c:465
+msgid "E843: Error while updating swap file crypt"
+msgstr "E843: Erreur lors de la mise เ jour du fichier d'้change crypt้"
+
msgid "E301: Oops, lost the swap file!!!"
msgstr "E301: Oups, le fichier d'้change a disparu !"
-#: ../memline.c:477
msgid "E302: Could not rename swap file"
msgstr "E302: Impossible de renommer le fichier d'้change"
-#: ../memline.c:554
#, c-format
msgid "E303: Unable to open swap file for \"%s\", recovery impossible"
msgstr "E303: Impossible d'ouvrir fichier .swp pour \"%s\", r้cup. impossible"
-#: ../memline.c:666
msgid "E304: ml_upd_block0(): Didn't get block 0??"
msgstr "E304: ml_upd_block0() : bloc 0 non r้cup้r้ ?!"
-#. no swap files found
-#: ../memline.c:830
#, c-format
msgid "E305: No swap file found for %s"
msgstr "E305: Aucun fichier d'้change trouv้ pour %s"
-#: ../memline.c:839
msgid "Enter number of swap file to use (0 to quit): "
msgstr "Entrez le num้ro du fichier d'้change เ utiliser (0 pour quitter) : "
-#: ../memline.c:879
#, c-format
msgid "E306: Cannot open %s"
msgstr "E306: Impossible d'ouvrir %s"
-#: ../memline.c:897
msgid "Unable to read block 0 from "
msgstr "Impossible de lire le bloc 0 de "
-#: ../memline.c:900
msgid ""
"\n"
"Maybe no changes were made or Vim did not update the swap file."
@@ -3949,28 +3662,22 @@ msgstr ""
"Il est possible qu'aucune modification n'a ้t้ faite ou que Vim n'a pas mis "
"เ jour le fichier d'้change."
-#: ../memline.c:909
msgid " cannot be used with this version of Vim.\n"
msgstr " ne peut pas ๊tre utilis้ avec cette version de Vim.\n"
-#: ../memline.c:911
msgid "Use Vim version 3.0.\n"
msgstr "Utilisez Vim version 3.0.\n"
-#: ../memline.c:916
#, c-format
msgid "E307: %s does not look like a Vim swap file"
msgstr "E307: %s ne semble pas ๊tre un fichier d'้change de Vim"
-#: ../memline.c:922
msgid " cannot be used on this computer.\n"
msgstr " ne peut pas ๊tre utilis้ sur cet ordinateur.\n"
-#: ../memline.c:924
msgid "The file was created on "
msgstr "Le fichier a ้t้ cr้้ le "
-#: ../memline.c:928
msgid ""
",\n"
"or the file has been damaged."
@@ -3978,86 +3685,107 @@ msgstr ""
",\n"
"ou le fichier a ้t้ endommag้."
-#: ../memline.c:945
+#, c-format
+msgid ""
+"E833: %s is encrypted and this version of Vim does not support encryption"
+msgstr ""
+"E833: %s est chiffr้ et cette version de Vim ne supporte pas le chiffrement"
+
msgid " has been damaged (page size is smaller than minimum value).\n"
msgstr " a ้t้ endommag้ (taille de page inf้rieure เ la valeur minimale).\n"
-#: ../memline.c:974
#, c-format
msgid "Using swap file \"%s\""
msgstr "Utilisation du fichier d'้change \"%s\""
-#: ../memline.c:980
#, c-format
msgid "Original file \"%s\""
msgstr "Fichier original \"%s\""
-#: ../memline.c:995
msgid "E308: Warning: Original file may have been changed"
msgstr "E308: Alerte : Le fichier original a pu ๊tre modifi้"
-#: ../memline.c:1061
+#, c-format
+msgid "Swap file is encrypted: \"%s\""
+msgstr "Fichier d'้change chiffr้ : \"%s\""
+
+msgid ""
+"\n"
+"If you entered a new crypt key but did not write the text file,"
+msgstr ""
+"\n"
+"Si vous avez tap้ une nouvelle cl้ de chiffrement mais n'avez pas enregistr้ "
+"le fichier texte,"
+
+msgid ""
+"\n"
+"enter the new crypt key."
+msgstr ""
+"\n"
+"tapez la nouvelle cl้ de chiffrement."
+
+msgid ""
+"\n"
+"If you wrote the text file after changing the crypt key press enter"
+msgstr ""
+"\n"
+"Si vous avez ้crit le fichier texte apr่s avoir chang้ la cl้ de "
+"chiffrement, appuyez sur entr้e"
+
+msgid ""
+"\n"
+"to use the same key for text file and swap file"
+msgstr ""
+"\n"
+"afin d'utiliser la m๊me cl้ pour le fichier texte et le fichier d'้change"
+
#, c-format
msgid "E309: Unable to read block 1 from %s"
msgstr "E309: Impossible de lire le bloc 1 de %s"
-#: ../memline.c:1065
msgid "???MANY LINES MISSING"
msgstr "???DE NOMBREUSES LIGNES MANQUENT"
-#: ../memline.c:1076
msgid "???LINE COUNT WRONG"
msgstr "???NOMBRE DE LIGNES ERRONษ"
-#: ../memline.c:1082
msgid "???EMPTY BLOCK"
msgstr "???BLOC VIDE"
-#: ../memline.c:1103
msgid "???LINES MISSING"
msgstr "???LIGNES MANQUANTES"
-#: ../memline.c:1128
#, c-format
msgid "E310: Block 1 ID wrong (%s not a .swp file?)"
msgstr "E310: ID du bloc 1 erron้ (%s n'est pas un fichier d'้change ?)"
-#: ../memline.c:1133
msgid "???BLOCK MISSING"
msgstr "???BLOC MANQUANT"
-#: ../memline.c:1147
msgid "??? from here until ???END lines may be messed up"
msgstr "??? d'ici jusqu'เ ???FIN des lignes peuvent ๊tre corrompues"
-#: ../memline.c:1164
msgid "??? from here until ???END lines may have been inserted/deleted"
msgstr "??? d'ici jusqu'เ ???FIN des lignes ont pu ๊tre ins้r้es/effac้es"
-#: ../memline.c:1181
msgid "???END"
msgstr "???FIN"
-#: ../memline.c:1238
msgid "E311: Recovery Interrupted"
msgstr "E311: R้cup้ration interrompue"
-#: ../memline.c:1243
msgid ""
"E312: Errors detected while recovering; look for lines starting with ???"
msgstr ""
"E312: Erreurs lors de la r้cup้ration ; examinez les lignes commen็ant "
"par ???"
-#: ../memline.c:1245
msgid "See \":help E312\" for more information."
msgstr "Consultez \":help E312\" pour plus d'information."
-#: ../memline.c:1249
msgid "Recovery completed. You should check if everything is OK."
msgstr "R้cup้ration achev้e. V้rifiez que tout est correct."
-#: ../memline.c:1251
msgid ""
"\n"
"(You might want to write out this file under another name\n"
@@ -4065,17 +3793,14 @@ msgstr ""
"\n"
"(Vous voudrez peut-๊tre enregistrer ce fichier sous un autre nom\n"
-#: ../memline.c:1252
msgid "and run diff with the original file to check for changes)"
msgstr "et lancer diff avec le fichier original pour rep้rer les changements)"
-#: ../memline.c:1254
msgid "Recovery completed. Buffer contents equals file contents."
msgstr ""
"R้cup้ration achev้e. Le contenu du tampon est identique au contenu du "
"fichier."
-#: ../memline.c:1255
msgid ""
"\n"
"You may want to delete the .swp file now.\n"
@@ -4085,52 +3810,44 @@ msgstr ""
"Il est conseill้ d'effacer maintenant le fichier .swp.\n"
"\n"
-#. use msg() to start the scrolling properly
-#: ../memline.c:1327
+msgid "Using crypt key from swap file for the text file.\n"
+msgstr ""
+"Utilisation de la cl้ de chiffrement du fichier d'้change pour le fichier "
+"texte.\n"
+
msgid "Swap files found:"
msgstr "Fichiers d'้change trouv้s :"
-#: ../memline.c:1446
msgid " In current directory:\n"
msgstr " Dans le r้pertoire courant :\n"
-#: ../memline.c:1448
msgid " Using specified name:\n"
msgstr "Utilisant le nom indiqu้ :\n"
-#: ../memline.c:1450
msgid " In directory "
msgstr " Dans le r้pertoire "
-#: ../memline.c:1465
msgid " -- none --\n"
msgstr " -- aucun --\n"
-#: ../memline.c:1527
msgid " owned by: "
msgstr " propri้t้ de : "
-#: ../memline.c:1529
msgid " dated: "
msgstr " dat้ : "
-#: ../memline.c:1532 ../memline.c:3231
msgid " dated: "
msgstr " dat้ : "
-#: ../memline.c:1548
msgid " [from Vim version 3.0]"
msgstr " [de Vim version 3.0]"
-#: ../memline.c:1550
msgid " [does not look like a Vim swap file]"
msgstr " [ne semble pas ๊tre un fichier d'้change Vim]"
-#: ../memline.c:1552
msgid " file name: "
msgstr " nom de fichier : "
-#: ../memline.c:1558
msgid ""
"\n"
" modified: "
@@ -4138,15 +3855,12 @@ msgstr ""
"\n"
" modifi้ : "
-#: ../memline.c:1559
msgid "YES"
msgstr "OUI"
-#: ../memline.c:1559
msgid "no"
msgstr "non"
-#: ../memline.c:1562
msgid ""
"\n"
" user name: "
@@ -4154,11 +3868,9 @@ msgstr ""
"\n"
" nom d'utilisateur : "
-#: ../memline.c:1568
msgid " host name: "
msgstr " nom d'h๔te : "
-#: ../memline.c:1570
msgid ""
"\n"
" host name: "
@@ -4166,7 +3878,6 @@ msgstr ""
"\n"
" nom d'h๔te : "
-#: ../memline.c:1575
msgid ""
"\n"
" process ID: "
@@ -4174,11 +3885,16 @@ msgstr ""
"\n"
" processus nฐ : "
-#: ../memline.c:1579
msgid " (still running)"
msgstr " (en cours d'ex้cution)"
-#: ../memline.c:1586
+msgid ""
+"\n"
+" [not usable with this version of Vim]"
+msgstr ""
+"\n"
+" [inutilisable avec cette version de Vim]"
+
msgid ""
"\n"
" [not usable on this computer]"
@@ -4186,97 +3902,75 @@ msgstr ""
"\n"
" [inutilisable sur cet ordinateur]"
-#: ../memline.c:1590
msgid " [cannot be read]"
msgstr " [ne peut ๊tre lu]"
-#: ../memline.c:1593
msgid " [cannot be opened]"
msgstr " [ne peut ๊tre ouvert]"
-#: ../memline.c:1698
msgid "E313: Cannot preserve, there is no swap file"
msgstr "E313: Pr้servation impossible, il n'y a pas de fichier d'้change"
-#: ../memline.c:1747
msgid "File preserved"
msgstr "Fichier pr้serv้"
-#: ../memline.c:1749
msgid "E314: Preserve failed"
msgstr "E314: ษchec de la pr้servation"
-#: ../memline.c:1819
#, c-format
-msgid "E315: ml_get: invalid lnum: %<PRId64>"
-msgstr "E315: ml_get : num้ro de ligne invalide : %<PRId64>"
+msgid "E315: ml_get: invalid lnum: %ld"
+msgstr "E315: ml_get : num้ro de ligne invalide : %ld"
-#: ../memline.c:1851
#, c-format
-msgid "E316: ml_get: cannot find line %<PRId64>"
-msgstr "E316: ml_get : ligne %<PRId64> introuvable"
+msgid "E316: ml_get: cannot find line %ld"
+msgstr "E316: ml_get : ligne %ld introuvable"
-#: ../memline.c:2236
msgid "E317: pointer block id wrong 3"
msgstr "E317: mauvais id de pointeur de bloc 3"
-#: ../memline.c:2311
msgid "stack_idx should be 0"
msgstr "stack_idx devrait ๊tre 0"
-#: ../memline.c:2369
msgid "E318: Updated too many blocks?"
msgstr "E318: Trop de blocs mis เ jour ?"
-#: ../memline.c:2511
msgid "E317: pointer block id wrong 4"
msgstr "E317: mauvais id de pointeur de bloc 4"
-#: ../memline.c:2536
msgid "deleted block 1?"
msgstr "bloc 1 effac้ ?"
-#: ../memline.c:2707
#, c-format
-msgid "E320: Cannot find line %<PRId64>"
-msgstr "E320: Ligne %<PRId64> introuvable"
+msgid "E320: Cannot find line %ld"
+msgstr "E320: Ligne %ld introuvable"
-#: ../memline.c:2916
msgid "E317: pointer block id wrong"
msgstr "E317: mauvais id de pointeur de bloc"
-#: ../memline.c:2930
msgid "pe_line_count is zero"
msgstr "pe_line_count vaut z้ro"
-#: ../memline.c:2955
#, c-format
-msgid "E322: line number out of range: %<PRId64> past the end"
-msgstr "E322: num้ro de ligne hors limites : %<PRId64> au-delเ de la fin"
+msgid "E322: line number out of range: %ld past the end"
+msgstr "E322: num้ro de ligne hors limites : %ld au-delเ de la fin"
-#: ../memline.c:2959
#, c-format
-msgid "E323: line count wrong in block %<PRId64>"
-msgstr "E323: nombre de lignes erron้ dans le bloc %<PRId64>"
+msgid "E323: line count wrong in block %ld"
+msgstr "E323: nombre de lignes erron้ dans le bloc %ld"
-#: ../memline.c:2999
msgid "Stack size increases"
msgstr "La taille de la pile s'accro๎t"
-#: ../memline.c:3038
msgid "E317: pointer block id wrong 2"
msgstr "E317: mauvais id de pointeur de block 2"
-#: ../memline.c:3070
#, c-format
msgid "E773: Symlink loop for \"%s\""
msgstr "E773: cycle de liens symboliques avec \"%s\""
-#: ../memline.c:3221
msgid "E325: ATTENTION"
msgstr "E325: ATTENTION"
-#: ../memline.c:3222
msgid ""
"\n"
"Found a swap file by the name \""
@@ -4284,39 +3978,30 @@ msgstr ""
"\n"
"Trouv้ un fichier d'้change nomm้ \""
-#: ../memline.c:3226
msgid "While opening file \""
msgstr "Lors de l'ouverture du fichier \""
-#: ../memline.c:3239
msgid " NEWER than swap file!\n"
msgstr " PLUS RษCENT que le fichier d'้change !\n"
-#: ../memline.c:3244
msgid ""
"\n"
"(1) Another program may be editing the same file. If this is the case,\n"
" be careful not to end up with two different instances of the same\n"
-" file when making changes."
+" file when making changes. Quit, or continue with caution.\n"
msgstr ""
"\n"
"(1) Un autre programme est peut-๊tre en train d'้diter ce fichier.\n"
" Si c'est le cas, faites attention เ ne pas vous retrouver avec\n"
-" deux versions diff้rentes du m๊me fichier en faisant des modifications."
+" deux versions diff้rentes du m๊me fichier en faisant des modifications.\n"
+" Quitter ou continuer avec attention.\n"
-#: ../memline.c:3245
-msgid " Quit, or continue with caution.\n"
-msgstr " Quittez, ou continuez prudemment.\n"
-
-#: ../memline.c:3246
msgid "(2) An edit session for this file crashed.\n"
msgstr "(2) Une session d'้dition de ce fichier a plant้.\n"
-#: ../memline.c:3247
msgid " If this is the case, use \":recover\" or \"vim -r "
msgstr " Si c'est le cas, utilisez \":recover\" ou \"vim -r "
-#: ../memline.c:3249
msgid ""
"\"\n"
" to recover the changes (see \":help recovery\").\n"
@@ -4324,11 +4009,9 @@ msgstr ""
"\"\n"
" pour r้cup้rer le fichier (consultez \":help recovery\").\n"
-#: ../memline.c:3250
msgid " If you did this already, delete the swap file \""
msgstr " Si vous l'avez d้jเ fait, effacez le fichier d'้change \""
-#: ../memline.c:3252
msgid ""
"\"\n"
" to avoid this message.\n"
@@ -4336,23 +4019,18 @@ msgstr ""
"\"\n"
" pour ้viter ce message.\n"
-#: ../memline.c:3450 ../memline.c:3452
msgid "Swap file \""
msgstr "Le fichier d'้change \""
-#: ../memline.c:3451 ../memline.c:3455
msgid "\" already exists!"
msgstr "\" existe d้jเ !"
-#: ../memline.c:3457
msgid "VIM - ATTENTION"
msgstr "VIM - ATTENTION"
-#: ../memline.c:3459
msgid "Swap file already exists!"
msgstr "Un fichier d'้change existe d้jเ !"
-#: ../memline.c:3464
msgid ""
"&Open Read-Only\n"
"&Edit anyway\n"
@@ -4366,7 +4044,6 @@ msgstr ""
"&Quitter\n"
"&Abandonner"
-#: ../memline.c:3467
msgid ""
"&Open Read-Only\n"
"&Edit anyway\n"
@@ -4382,58 +4059,33 @@ msgstr ""
"&Quitter\n"
"&Abandonner"
-#.
-#. * Change the ".swp" extension to find another file that can be used.
-#. * First decrement the last char: ".swo", ".swn", etc.
-#. * If that still isn't enough decrement the last but one char: ".svz"
-#. * Can happen when editing many "No Name" buffers.
-#.
-#. ".s?a"
-#. ".saa": tried enough, give up
-#: ../memline.c:3528
msgid "E326: Too many swap files found"
msgstr "E326: Trop de fichiers d'้change trouv้s"
-#: ../memory.c:227
-#, c-format
-msgid "E342: Out of memory! (allocating %<PRIu64> bytes)"
-msgstr "E342: M้moire ้puis้e ! (allocation de %<PRIu64> octets)"
-
-#: ../menu.c:62
msgid "E327: Part of menu-item path is not sub-menu"
msgstr "E327: Une partie du chemin de l'้l้ment de menu n'est pas un sous-menu"
# DB - todo : J'h้site avec
# msgstr "E328: Le menu n'existe pas dans ce mode"
-#: ../menu.c:63
msgid "E328: Menu only exists in another mode"
msgstr "E328: Le menu n'existe que dans un autre mode"
-#: ../menu.c:64
#, c-format
msgid "E329: No menu \"%s\""
msgstr "E329: Aucun menu \"%s\""
-#. Only a mnemonic or accelerator is not valid.
-#: ../menu.c:329
msgid "E792: Empty menu name"
msgstr "E792: Nom de menu vide"
-#: ../menu.c:340
msgid "E330: Menu path must not lead to a sub-menu"
msgstr "E330: Le chemin de menu ne doit pas conduire เ un sous-menu"
-#: ../menu.c:365
msgid "E331: Must not add menu items directly to menu bar"
msgstr "E331: Ajout d'้l้ments de menu directement dans barre de menu interdit"
-#: ../menu.c:370
msgid "E332: Separator cannot be part of a menu path"
msgstr "E332: Un s้parateur ne peut faire partie d'un chemin de menu"
-#. Now we have found the matching menu, and we list the mappings
-#. Highlight title
-#: ../menu.c:762
msgid ""
"\n"
"--- Menus ---"
@@ -4441,75 +4093,62 @@ msgstr ""
"\n"
"--- Menus ---"
-#: ../menu.c:1313
+msgid "Tear off this menu"
+msgstr "D้tacher ce menu"
+
+#, c-format
+msgid "E335: Menu not defined for %s mode"
+msgstr "E335: Le menu n'est pas d้fini pour le mode %s"
+
msgid "E333: Menu path must lead to a menu item"
msgstr "E333: Le chemin du menu doit conduire เ un ้l้ment de menu"
-#: ../menu.c:1330
#, c-format
msgid "E334: Menu not found: %s"
msgstr "E334: Menu introuvable : %s"
-#: ../menu.c:1396
-#, c-format
-msgid "E335: Menu not defined for %s mode"
-msgstr "E335: Le menu n'est pas d้fini pour le mode %s"
-
-#: ../menu.c:1426
msgid "E336: Menu path must lead to a sub-menu"
msgstr "E336: Le chemin du menu doit conduire เ un sous-menu"
-#: ../menu.c:1447
msgid "E337: Menu not found - check menu names"
msgstr "E337: Menu introuvable - v้rifiez les noms des menus"
-#: ../message.c:423
#, c-format
msgid "Error detected while processing %s:"
msgstr "Erreur d้tect้e en traitant %s :"
-#: ../message.c:445
#, c-format
msgid "line %4ld:"
msgstr "ligne %4ld :"
-#: ../message.c:617
#, c-format
msgid "E354: Invalid register name: '%s'"
msgstr "E354: Nom de registre invalide : '%s'"
# DB - todo : mettre เ jour ?
-#: ../message.c:745
msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
msgstr "Maintenance des messages : Dominique Pell้ <dominique.pelle@gmail.com>"
-#: ../message.c:986
msgid "Interrupt: "
msgstr "Interruption : "
-#: ../message.c:988
msgid "Press ENTER or type command to continue"
msgstr "Appuyez sur ENTRษE ou tapez une commande pour continuer"
-#: ../message.c:1843
#, c-format
-msgid "%s line %<PRId64>"
-msgstr "%s, ligne %<PRId64>"
+msgid "%s line %ld"
+msgstr "%s, ligne %ld"
-#: ../message.c:2392
msgid "-- More --"
msgstr "-- Plus --"
-#: ../message.c:2398
msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "
msgstr ""
"ESPACE/d/j : ้cran/page/ligne vers le bas, b/u/k : vers le haut, q : quitter"
-#: ../message.c:3021 ../message.c:3031
msgid "Question"
msgstr "Question"
-#: ../message.c:3023
msgid ""
"&Yes\n"
"&No"
@@ -4517,17 +4156,6 @@ msgstr ""
"&Oui\n"
"&Non"
-#: ../message.c:3033
-msgid ""
-"&Yes\n"
-"&No\n"
-"&Cancel"
-msgstr ""
-"&Oui\n"
-"&Non\n"
-"&Annuler"
-
-#: ../message.c:3045
msgid ""
"&Yes\n"
"&No\n"
@@ -4541,176 +4169,244 @@ msgstr ""
"Tout aban&donner\n"
"&Annuler"
-#: ../message.c:3058
+# DB : Les trois messages qui suivent sont des titres de bo๎tes
+# de dialogue par d้faut.
+msgid "Select Directory dialog"
+msgstr "S้lecteur de r้pertoire"
+
+msgid "Save File dialog"
+msgstr "Enregistrer un fichier"
+
+msgid "Open File dialog"
+msgstr "Ouvrir un fichier"
+
+msgid "E338: Sorry, no file browser in console mode"
+msgstr "E338: D้sol้, pas de s้lecteur de fichiers en mode console"
+
msgid "E766: Insufficient arguments for printf()"
msgstr "E766: Pas assez d'arguments pour printf()"
-#: ../message.c:3119
msgid "E807: Expected Float argument for printf()"
msgstr "E807: printf() attend un argument de type Flottant"
-#: ../message.c:3873
msgid "E767: Too many arguments to printf()"
msgstr "E767: Trop d'arguments pour printf()"
-#: ../misc1.c:2256
msgid "W10: Warning: Changing a readonly file"
msgstr "W10: Alerte : Modification d'un fichier en lecture seule"
-#: ../misc1.c:2537
msgid "Type number and <Enter> or click with mouse (empty cancels): "
msgstr "Tapez un nombre et <Entr้e> ou cliquez avec la souris (rien annule) :"
-#: ../misc1.c:2539
msgid "Type number and <Enter> (empty cancels): "
msgstr "Tapez un nombre et <Entr้e> (rien annule) :"
-#: ../misc1.c:2585
-msgid "1 more line"
-msgstr "1 ligne en plus"
-
-#: ../misc1.c:2588
-msgid "1 line less"
-msgstr "1 ligne en moins"
-
-#: ../misc1.c:2593
#, c-format
-msgid "%<PRId64> more lines"
-msgstr "%<PRId64> lignes en plus"
+msgid "%ld more line"
+msgid_plural "%ld more lines"
+msgstr[0] "%ld ligne en plus"
+msgstr[1] "%ld lignes en plus"
-#: ../misc1.c:2596
#, c-format
-msgid "%<PRId64> fewer lines"
-msgstr "%<PRId64> lignes en moins"
+msgid "%ld line less"
+msgid_plural "%ld fewer lines"
+msgstr[0] "%ld ligne en moins"
+msgstr[1] "%ld lignes en moins"
-#: ../misc1.c:2599
msgid " (Interrupted)"
msgstr " (Interrompu)"
-#: ../misc1.c:2635
msgid "Beep!"
msgstr "Bip !"
-#: ../misc2.c:738
+msgid "ERROR: "
+msgstr "ERREUR : "
+
+#, c-format
+msgid ""
+"\n"
+"[bytes] total alloc-freed %lu-%lu, in use %lu, peak use %lu\n"
+msgstr ""
+"\n"
+"[octets] total allou้-lib้r้ %lu-%lu, utilis้ %lu, pic %lu\n"
+
+#, c-format
+msgid ""
+"[calls] total re/malloc()'s %lu, total free()'s %lu\n"
+"\n"
+msgstr ""
+"[appels] total re/malloc() %lu, total free() %lu\n"
+"\n"
+
+msgid "E340: Line is becoming too long"
+msgstr "E340: La ligne devient trop longue"
+
+#, c-format
+msgid "E341: Internal error: lalloc(%ld, )"
+msgstr "E341: Erreur interne : lalloc(%ld, )"
+
+#, c-format
+msgid "E342: Out of memory! (allocating %lu bytes)"
+msgstr "E342: M้moire ้puis้e ! (allocation de %lu octets)"
+
#, c-format
msgid "Calling shell to execute: \"%s\""
msgstr "Appel du shell pour ex้cuter : \"%s\""
-#: ../normal.c:183
+msgid "E545: Missing colon"
+msgstr "E545: ':' manquant"
+
+msgid "E546: Illegal mode"
+msgstr "E546: Mode non autoris้"
+
+msgid "E547: Illegal mouseshape"
+msgstr "E547: Forme de curseur invalide"
+
+msgid "E548: digit expected"
+msgstr "E548: chiffre attendu"
+
+msgid "E549: Illegal percentage"
+msgstr "E549: Pourcentage non autoris้"
+
+msgid "E854: path too long for completion"
+msgstr "E854: chemin trop long pour compl่tement"
+
+#, c-format
+msgid ""
+"E343: Invalid path: '**[number]' must be at the end of the path or be "
+"followed by '%s'."
+msgstr ""
+"E343: Chemin invalide : '**[nombre]' doit ๊tre เ la fin du chemin ou ๊tre "
+"suivi de '%s'."
+
+#, c-format
+msgid "E344: Can't find directory \"%s\" in cdpath"
+msgstr "E344: R้pertoire \"%s\" introuvable dans 'cdpath'"
+
+#, c-format
+msgid "E345: Can't find file \"%s\" in path"
+msgstr "E345: Fichier \"%s\" introuvable dans 'path'"
+
+#, c-format
+msgid "E346: No more directory \"%s\" found in cdpath"
+msgstr "E346: Plus de r้pertoire \"%s\" dans 'cdpath'"
+
+#, c-format
+msgid "E347: No more file \"%s\" found in path"
+msgstr "E347: Plus de fichier \"%s\" dans 'path'"
+
+#, c-format
+msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
+msgstr ""
+"E668: Mode d'acc่s incorrect au fichier d'infos de connexion NetBeans : \"%s"
+"\""
+
+#, c-format
+msgid "E658: NetBeans connection lost for buffer %ld"
+msgstr "E658: Connexion NetBeans perdue pour le tampon %ld"
+
+msgid "E838: netbeans is not supported with this GUI"
+msgstr "E838: netbeans n'est pas support้ avec cette interface graphique"
+
+msgid "E511: netbeans already connected"
+msgstr "E511: netbeans d้jเ connect้"
+
+#, c-format
+msgid "E505: %s is read-only (add ! to override)"
+msgstr "E505: %s est en lecture seule (ajoutez ! pour passer outre)"
+
msgid "E349: No identifier under cursor"
msgstr "E349: Aucun identifiant sous le curseur"
-#: ../normal.c:1866
msgid "E774: 'operatorfunc' is empty"
msgstr "E774: 'operatorfunc' est vide"
+msgid "E775: Eval feature not available"
+msgstr "E775: La fonctionnalit้ d'้valuation n'est pas disponible"
+
# DB : Il est ici question du mode Visuel.
-#: ../normal.c:2637
msgid "Warning: terminal cannot highlight"
msgstr "Alerte : le terminal ne peut pas surligner"
-#: ../normal.c:2807
msgid "E348: No string under cursor"
msgstr "E348: Aucune cha๎ne sous le curseur"
-#: ../normal.c:3937
msgid "E352: Cannot erase folds with current 'foldmethod'"
msgstr "E352: Impossible d'effacer des replis avec la 'foldmethod'e actuelle"
-#: ../normal.c:5897
msgid "E664: changelist is empty"
msgstr "E664: La liste des modifications (changelist) est vide"
-#: ../normal.c:5899
msgid "E662: At start of changelist"
msgstr "E662: Au d้but de la liste des modifications"
-#: ../normal.c:5901
msgid "E663: At end of changelist"
msgstr "E663: ภ la fin de la liste des modifications"
-#: ../normal.c:7053
-msgid "Type :quit<Enter> to exit Nvim"
-msgstr "tapez :q<Entr้e> pour quitter Vim"
-
-#: ../ops.c:248
-#, c-format
-msgid "1 line %sed 1 time"
-msgstr "1 ligne %s้e 1 fois"
-
-#: ../ops.c:250
-#, c-format
-msgid "1 line %sed %d times"
-msgstr "1 ligne %s้e %d fois"
+msgid "Type :qa! and press <Enter> to abandon all changes and exit Vim"
+msgstr ""
+"Tapez :qa! puis <Entr้e> pour abandonner tous les changements et quitter "
+"Vim"
-#: ../ops.c:253
#, c-format
-msgid "%<PRId64> lines %sed 1 time"
-msgstr "%<PRId64> lignes %s้es 1 fois"
+msgid "%ld line %sed %d time"
+msgid_plural "%ld line %sed %d times"
+msgstr[0] "%ld lignes %s้es %d fois"
+msgstr[1] "%ld lignes %s้es %d fois"
-#: ../ops.c:256
#, c-format
-msgid "%<PRId64> lines %sed %d times"
-msgstr "%<PRId64> lignes %s้es %d fois"
+msgid "%ld lines %sed %d time"
+msgid_plural "%ld lines %sed %d times"
+msgstr[0] "%ld lignes %s้es %d fois"
+msgstr[1] "%ld lignes %s้es %d fois"
-#: ../ops.c:592
#, c-format
-msgid "%<PRId64> lines to indent... "
-msgstr "%<PRId64> lignes เ indenter... "
-
-#: ../ops.c:634
-msgid "1 line indented "
-msgstr "1 ligne indent้e "
+msgid "%ld lines to indent... "
+msgstr "%ld lignes เ indenter... "
-#: ../ops.c:636
#, c-format
-msgid "%<PRId64> lines indented "
-msgstr "%<PRId64> lignes indent้es "
+msgid "%ld line indented "
+msgid_plural "%ld lines indented "
+msgstr[0] "%ld ligne indent้e "
+msgstr[1] "%ld lignes indent้es "
-#: ../ops.c:938
msgid "E748: No previously used register"
msgstr "E748: Aucun registre n'a ้t้ pr้c้demment utilis้"
# DB - Question O/N.
-#. must display the prompt
-#: ../ops.c:1433
msgid "cannot yank; delete anyway"
msgstr "impossible de r้aliser une copie ; effacer tout de m๊me"
-#: ../ops.c:1929
-msgid "1 line changed"
-msgstr "1 ligne modifi้e"
-
-#: ../ops.c:1931
#, c-format
-msgid "%<PRId64> lines changed"
-msgstr "%<PRId64> lignes modifi้es"
+msgid "%ld line changed"
+msgid_plural "%ld lines changed"
+msgstr[0] "%ld ligne modifi้e"
+msgstr[1] "%ld lignes modifi้es"
-#: ../ops.c:2521
-msgid "block of 1 line yanked"
-msgstr "bloc de 1 ligne copi้"
+#, c-format
+msgid "freeing %ld lines"
+msgstr "lib้ration de %ld lignes"
-#: ../ops.c:2523
-msgid "1 line yanked"
-msgstr "1 ligne copi้e"
+#, c-format
+msgid " into \"%c"
+msgstr " dans \"%c"
-#: ../ops.c:2525
#, c-format
-msgid "block of %<PRId64> lines yanked"
-msgstr "bloc de %<PRId64> lignes copi้"
+msgid "block of %ld line yanked%s"
+msgid_plural "block of %ld lines yanked%s"
+msgstr[0] "bloc de %ld ligne copi้%s"
+msgstr[1] "bloc de %ld lignes copi้%s"
-#: ../ops.c:2528
#, c-format
-msgid "%<PRId64> lines yanked"
-msgstr "%<PRId64> lignes copi้es"
+msgid "%ld line yanked%s"
+msgid_plural "%ld lines yanked%s"
+msgstr[0] "%ld ligne copi้e%s"
+msgstr[1] "%ld lignes copi้es%s"
-#: ../ops.c:2710
#, c-format
msgid "E353: Nothing in register %s"
msgstr "E353: Le registre %s est vide"
-#. Highlight title
-#: ../ops.c:3185
msgid ""
"\n"
"--- Registers ---"
@@ -4718,11 +4414,9 @@ msgstr ""
"\n"
"--- Registres ---"
-#: ../ops.c:4455
msgid "Illegal register name"
msgstr "Nom de registre invalide"
-#: ../ops.c:4533
msgid ""
"\n"
"# Registers:\n"
@@ -4730,202 +4424,195 @@ msgstr ""
"\n"
"# Registres :\n"
-#: ../ops.c:4575
#, c-format
msgid "E574: Unknown register type %d"
msgstr "E574: Type de registre %d inconnu"
-#: ../ops.c:5089
+msgid ""
+"E883: search pattern and expression register may not contain two or more "
+"lines"
+msgstr ""
+"E883: le motif de recherche et le registre d'expression ne peuvent pas "
+"contenir deux lignes ou plus"
+
#, c-format
-msgid "%<PRId64> Cols; "
-msgstr "%<PRId64> Colonnes ; "
+msgid "%ld Cols; "
+msgstr "%ld Colonnes ; "
-#: ../ops.c:5097
#, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Bytes"
+msgid "Selected %s%ld of %ld Lines; %lld of %lld Words; %lld of %lld Bytes"
msgstr ""
-"%s%<PRId64> sur %<PRId64> Lignes ; %<PRId64> sur %<PRId64> Mots ; %<PRId64> "
-"sur %<PRId64> Octets s้lectionn้s"
+"%s%ld sur %ld Lignes ; %lld sur %lld Mots ; %lld sur %lld Octets s้lectionn้s"
-#: ../ops.c:5105
#, c-format
msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Chars; %<PRId64> of %<PRId64> Bytes"
+"Selected %s%ld of %ld Lines; %lld of %lld Words; %lld of %lld Chars; %lld of "
+"%lld Bytes"
msgstr ""
-"%s%<PRId64> sur %<PRId64> Lignes ; %<PRId64> sur %<PRId64> Mots ; %<PRId64> "
-"sur %<PRId64> Caract่res ; %<PRId64> sur %<PRId64> octets s้lectionn้s"
+"%s%ld sur %ld Lignes ; %lld sur %lld Mots ; %lld sur %lld Caract่res ; %lld "
+"sur %lld octets s้lectionn้s"
-#: ../ops.c:5123
#, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Byte "
-"%<PRId64> of %<PRId64>"
+msgid "Col %s of %s; Line %ld of %ld; Word %lld of %lld; Byte %lld of %lld"
msgstr ""
-"Colonne %s sur %s ; Ligne %<PRId64> sur %<PRId64> ; Mot %<PRId64> sur "
-"%<PRId64> ; Octet %<PRId64> sur %<PRId64>"
+"Colonne %s sur %s ; Ligne %ld sur %ld ; Mot %lld sur %lld ; Octet %lld sur "
+"%lld"
-#: ../ops.c:5133
#, c-format
msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Char "
-"%<PRId64> of %<PRId64>; Byte %<PRId64> of %<PRId64>"
+"Col %s of %s; Line %ld of %ld; Word %lld of %lld; Char %lld of %lld; Byte "
+"%lld of %lld"
msgstr ""
-"Colonne %s sur %s ; Ligne %<PRId64> sur %<PRId64> ; Mot %<PRId64> sur "
-"%<PRId64> ; Caract่re %<PRId64> sur %<PRId64> ; Octet %<PRId64> sur %<PRId64>"
+"Colonne %s sur %s ; Ligne %ld sur %ld ; Mot %lld sur %lld ; Caract่re %lld "
+"sur %lld ; Octet %lld sur %lld"
-#: ../ops.c:5146
#, c-format
-msgid "(+%<PRId64> for BOM)"
-msgstr "(+%<PRId64> pour le BOM)"
-
-#: ../option.c:1238
-msgid "%<%f%h%m%=Page %N"
-msgstr "%<%f%h%m%=Page %N"
+msgid "(+%lld for BOM)"
+msgstr "(+%lld pour le BOM)"
-#: ../option.c:1574
msgid "Thanks for flying Vim"
msgstr "Merci d'avoir choisi Vim"
-#. found a mismatch: skip
-#: ../option.c:2698
msgid "E518: Unknown option"
msgstr "E518: Option inconnue"
-#: ../option.c:2709
msgid "E519: Option not supported"
msgstr "E519: Option non support้e"
-#: ../option.c:2740
msgid "E520: Not allowed in a modeline"
msgstr "E520: Non autoris้ dans une ligne de mode"
-#: ../option.c:2815
msgid "E846: Key code not set"
msgstr "E846: Le code de touche n'est pas configur้"
-#: ../option.c:2924
msgid "E521: Number required after ="
msgstr "E521: Nombre requis apr่s ="
-#: ../option.c:3226 ../option.c:3864
msgid "E522: Not found in termcap"
msgstr "E522: Introuvable dans termcap"
-#: ../option.c:3335
#, c-format
msgid "E539: Illegal character <%s>"
msgstr "E539: Caract่re <%s> invalide"
-#: ../option.c:2253
#, c-format
msgid "For option %s"
msgstr "Pour l'option %s"
-#: ../option.c:3862
msgid "E529: Cannot set 'term' to empty string"
msgstr "E529: 'term' ne doit pas ๊tre une cha๎ne vide"
-#: ../option.c:3885
+msgid "E530: Cannot change term in GUI"
+msgstr "E530: Impossible de modifier term dans l'interface graphique"
+
+msgid "E531: Use \":gui\" to start the GUI"
+msgstr "E531: Utilisez \":gui\" pour d้marrer l'interface graphique"
+
msgid "E589: 'backupext' and 'patchmode' are equal"
msgstr "E589: 'backupext' et 'patchmode' sont ้gaux"
-#: ../option.c:3964
msgid "E834: Conflicts with value of 'listchars'"
msgstr "E834: Conflits avec la valeur de 'listchars'"
-#: ../option.c:3966
msgid "E835: Conflicts with value of 'fillchars'"
msgstr "E835: Conflits avec la valeur de 'fillchars'"
-#: ../option.c:4163
+msgid "E617: Cannot be changed in the GTK+ 2 GUI"
+msgstr "E617: Non modifiable dans l'interface graphique GTK+ 2"
+
+#, c-format
+msgid "E950: Cannot convert between %s and %s"
+msgstr "E950: Impossible de convertir de %s เ %s"
+
msgid "E524: Missing colon"
msgstr "E524: ':' manquant"
-#: ../option.c:4165
msgid "E525: Zero length string"
msgstr "E525: Cha๎ne de longueur nulle"
-#: ../option.c:4220
#, c-format
msgid "E526: Missing number after <%s>"
msgstr "E526: Nombre manquant apr่s <%s>"
-#: ../option.c:4232
msgid "E527: Missing comma"
msgstr "E527: Virgule manquante"
-#: ../option.c:4239
msgid "E528: Must specify a ' value"
msgstr "E528: Une valeur ' doit ๊tre sp้cifi้e"
-#: ../option.c:4271
msgid "E595: contains unprintable or wide character"
msgstr "E595: contient des caract่res เ largeur double non-imprimables"
-#: ../option.c:4469
+msgid "E596: Invalid font(s)"
+msgstr "E596: Police(s) invalide(s)"
+
+msgid "E597: can't select fontset"
+msgstr "E597: Impossible de s้lectionner un jeu de polices"
+
+msgid "E598: Invalid fontset"
+msgstr "E598: Jeu de polices invalide"
+
+msgid "E533: can't select wide font"
+msgstr "E533: Impossible de s้lectionner une police เ largeur double"
+
+msgid "E534: Invalid wide font"
+msgstr "E534: Police เ largeur double invalide"
+
#, c-format
msgid "E535: Illegal character after <%c>"
msgstr "E535: Caract่re invalide apr่s <%c>"
-#: ../option.c:4534
msgid "E536: comma required"
msgstr "E536: virgule requise"
-#: ../option.c:4543
#, c-format
msgid "E537: 'commentstring' must be empty or contain %s"
msgstr "E537: 'commentstring' doit ๊tre vide ou contenir %s"
+msgid "E538: No mouse support"
+msgstr "E538: La souris n'est pas support้e"
+
# DB - Le code est sans ambigu๏t้ sur le caract่re manquant.
# ภ d้faut d'une traduction valable, au moins comprend-on
# ce qui se passe.
-#: ../option.c:4928
msgid "E540: Unclosed expression sequence"
msgstr "E540: '}' manquant"
-#: ../option.c:4932
msgid "E541: too many items"
msgstr "E541: trop d'้l้ments"
-#: ../option.c:4934
msgid "E542: unbalanced groups"
msgstr "E542: parenth่ses non ้quilibr้es"
-#: ../option.c:5148
+msgid "E946: Cannot make a terminal with running job modifiable"
+msgstr ""
+"E946: terminal avec tโche en cours d'ex้cution ne peut pas ๊tre modifiable"
+
msgid "E590: A preview window already exists"
msgstr "E590: Il existe d้jเ une fen๊tre de pr้visualisation"
-#: ../option.c:5311
msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'"
-msgstr "W17: L'arabe requiert l'UTF-8, tapez ':set encoding=utf-8'"
+msgstr "W17: L'arabe n้cessite l'UTF-8, tapez ':set encoding=utf-8'"
+
+msgid "E954: 24-bit colors are not supported on this environment"
+msgstr "E954: Couleurs en 24-bits non-support้es sur cet environnement."
-#: ../option.c:5623
#, c-format
msgid "E593: Need at least %d lines"
msgstr "E593: Au moins %d lignes sont n้cessaires"
-#: ../option.c:5631
#, c-format
msgid "E594: Need at least %d columns"
msgstr "E594: Au moins %d colonnes sont n้cessaires"
-#: ../option.c:6011
#, c-format
msgid "E355: Unknown option: %s"
msgstr "E355: Option inconnue : %s"
-#. There's another character after zeros or the string
-#. * is empty. In both cases, we are trying to set a
-#. * num option using a string.
-#: ../option.c:6037
#, c-format
msgid "E521: Number required: &%s = '%s'"
msgstr "E521: Nombre requis : &%s = '%s'"
-#: ../option.c:6149
msgid ""
"\n"
"--- Terminal codes ---"
@@ -4933,7 +4620,6 @@ msgstr ""
"\n"
"--- Codes de terminal ---"
-#: ../option.c:6151
msgid ""
"\n"
"--- Global option values ---"
@@ -4941,7 +4627,6 @@ msgstr ""
"\n"
"--- Valeur des options globales ---"
-#: ../option.c:6153
msgid ""
"\n"
"--- Local option values ---"
@@ -4949,7 +4634,6 @@ msgstr ""
"\n"
"--- Valeur des options locales ---"
-#: ../option.c:6155
msgid ""
"\n"
"--- Options ---"
@@ -4957,29 +4641,146 @@ msgstr ""
"\n"
"--- Options ---"
-#: ../option.c:6816
msgid "E356: get_varp ERROR"
msgstr "E356: ERREUR get_varp"
-#: ../option.c:7696
#, c-format
msgid "E357: 'langmap': Matching character missing for %s"
msgstr "E357: 'langmap' : Aucun caract่re correspondant pour %s"
-#: ../option.c:7715
#, c-format
msgid "E358: 'langmap': Extra characters after semicolon: %s"
msgstr "E358: 'langmap' : Caract่res surnum้raires apr่s point-virgule : %s"
-#: ../os/shell.c:194
+msgid "cannot open "
+msgstr "impossible d'ouvrir "
+
+msgid "VIM: Can't open window!\n"
+msgstr "VIM : Impossible d'ouvrir la fen๊tre !\n"
+
+msgid "Need Amigados version 2.04 or later\n"
+msgstr "Amigados version 2.04 ou ult้rieure est n้cessaire\n"
+
+#, c-format
+msgid "Need %s version %ld\n"
+msgstr "%s version %ld est n้cessaire\n"
+
+msgid "Cannot open NIL:\n"
+msgstr "Impossible d'ouvrir NIL :\n"
+
+msgid "Cannot create "
+msgstr "Impossible de cr้er "
+
+#, c-format
+msgid "Vim exiting with %d\n"
+msgstr "Vim quitte avec %d\n"
+
+msgid "cannot change console mode ?!\n"
+msgstr "Impossible de modifier le mode de la console ?!\n"
+
+msgid "mch_get_shellsize: not a console??\n"
+msgstr "mch_get_shellsize : pas une console ?!\n"
+
+msgid "E360: Cannot execute shell with -f option"
+msgstr "E360: Impossible d'ex้cuter un shell avec l'option -f"
+
+msgid "Cannot execute "
+msgstr "Impossible d'ex้cuter "
+
+msgid "shell "
+msgstr "le shell "
+
+msgid " returned\n"
+msgstr " a ้t้ retourn้\n"
+
+msgid "ANCHOR_BUF_SIZE too small."
+msgstr "ANCHOR_BUF_SIZE trop petit."
+
+msgid "I/O ERROR"
+msgstr "ERREUR d'E/S"
+
+msgid "Message"
+msgstr "Message"
+
+msgid "E237: Printer selection failed"
+msgstr "E237: La s้lection de l'imprimante a ้chou้"
+
+# DB - Contenu des c-formats : Imprimante puis Port.
+#, c-format
+msgid "to %s on %s"
+msgstr "vers %s sur %s"
+
+#, c-format
+msgid "E613: Unknown printer font: %s"
+msgstr "E613: Police d'imprimante inconnue : %s"
+
+#, c-format
+msgid "E238: Print error: %s"
+msgstr "E238: Erreur d'impression : %s"
+
+#, c-format
+msgid "Printing '%s'"
+msgstr "Impression de '%s'"
+
+#, c-format
+msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
+msgstr "E244: Jeu de caract่res \"%s\" invalide dans le nom de fonte \"%s\""
+
+#, c-format
+msgid "E244: Illegal quality name \"%s\" in font name \"%s\""
+msgstr "E244: Nom de qualit้ \"%s\" invalide dans le nom de fonte \"%s\""
+
+#, c-format
+msgid "E245: Illegal char '%c' in font name \"%s\""
+msgstr "E245: Caract่re '%c' invalide dans le nom de fonte \"%s\""
+
+#, c-format
+msgid "Opening the X display took %ld msec"
+msgstr "L'ouverture du display X a pris %ld ms"
+
msgid ""
"\n"
-"Cannot execute shell "
+"Vim: Got X error\n"
msgstr ""
"\n"
-"Impossible d'ex้cuter le shell "
+"Vim : R้ception d'une erreur X\n"
+
+msgid "Testing the X display failed"
+msgstr "Le test du display X a ้chou้"
+
+msgid "Opening the X display timed out"
+msgstr "L'ouverture du display X a d้pass้ le d้lai d'attente"
+
+msgid ""
+"\n"
+"Could not get security context for "
+msgstr ""
+"\n"
+"Impossible d'obtenir le contexte de s้curit้ pour "
+
+msgid ""
+"\n"
+"Could not set security context for "
+msgstr ""
+"\n"
+"Impossible de modifier le contexte de s้curit้ pour "
+
+#, c-format
+msgid "Could not set security context %s for %s"
+msgstr "Impossible d'initialiser le contexte de s้curit้ %s pour %s"
+
+#, c-format
+msgid "Could not get security context %s for %s. Removing it!"
+msgstr ""
+"Impossible d'obtenir le contexte de s้curit้ %s pour %s. Il sera supprim้ !"
+
+msgid ""
+"\n"
+"Cannot execute shell sh\n"
+msgstr ""
+"\n"
+"Impossible d'ex้cuter le shell sh\n"
-#: ../os/shell.c:439
msgid ""
"\n"
"shell returned "
@@ -4987,234 +4788,283 @@ msgstr ""
"\n"
"le shell a retourn้ "
-#: ../os_unix.c:465 ../os_unix.c:471
msgid ""
"\n"
-"Could not get security context for "
+"Cannot create pipes\n"
msgstr ""
"\n"
-"Impossible d'obtenir le contexte de s้curit้ pour "
+"Impossible de cr้er des tuyaux (pipes)\n"
-#: ../os_unix.c:479
msgid ""
"\n"
-"Could not set security context for "
+"Cannot fork\n"
msgstr ""
"\n"
-"Impossible de modifier le contexte de s้curit้ pour "
+"Impossible de forker\n"
+
+msgid ""
+"\n"
+"Cannot execute shell "
+msgstr ""
+"\n"
+"Impossible d'ex้cuter le shell "
+
+msgid ""
+"\n"
+"Command terminated\n"
+msgstr ""
+"\n"
+"Commande interrompue\n"
+
+msgid "XSMP lost ICE connection"
+msgstr "XSMP a perdu la connexion ICE"
-#: ../os_unix.c:1558 ../os_unix.c:1647
#, c-format
msgid "dlerror = \"%s\""
msgstr "dlerror = \"%s\""
-#: ../path.c:1449
+msgid "Opening the X display failed"
+msgstr "L'ouverture du display X a ้chou้"
+
+msgid "XSMP handling save-yourself request"
+msgstr "XSMP : prise en charge d'une requ๊te save-yourself"
+
+msgid "XSMP opening connection"
+msgstr "XSMP : ouverture de la connexion"
+
+msgid "XSMP ICE connection watch failed"
+msgstr "XSMP : ้chec de la surveillance de connexion ICE"
+
#, c-format
-msgid "E447: Can't find file \"%s\" in path"
-msgstr "E447: Le fichier \"%s\" est introuvable dans 'path'"
+msgid "XSMP SmcOpenConnection failed: %s"
+msgstr "XSMP : SmcOpenConnection a ้chou้ : %s"
+
+msgid "At line"
+msgstr "ภ la ligne"
+
+msgid "Could not load vim32.dll!"
+msgstr "Impossible de charger vim32.dll !"
+
+msgid "VIM Error"
+msgstr "Erreur VIM"
+
+msgid "Could not fix up function pointers to the DLL!"
+msgstr "Impossible d'initialiser les pointeurs de fonction vers la DLL !"
+
+# DB - Les ้v้nements en question sont ceux des messages qui suivent.
+#, c-format
+msgid "Vim: Caught %s event\n"
+msgstr "Vim : ษv้nement %s intercept้\n"
+
+msgid "close"
+msgstr "de fermeture"
+
+msgid "logoff"
+msgstr "de d้connexion"
+
+msgid "shutdown"
+msgstr "d'arr๊t"
+
+msgid "E371: Command not found"
+msgstr "E371: Commande introuvable"
+
+msgid ""
+"VIMRUN.EXE not found in your $PATH.\n"
+"External commands will not pause after completion.\n"
+"See :help win32-vimrun for more information."
+msgstr ""
+"VIMRUN.EXE est introuvable votre $PATH.\n"
+"Les commandes externes ne feront pas de pause une fois termin้es.\n"
+"Consultez :help win32-vimrun pour plus d'informations."
+
+msgid "Vim Warning"
+msgstr "Alerte Vim"
+
+#, c-format
+msgid "shell returned %d"
+msgstr "le shell a retourn้ %d"
+
+msgid "E926: Current location list was changed"
+msgstr "E926: La liste d'emplacements courante a chang้"
-#: ../quickfix.c:359
#, c-format
msgid "E372: Too many %%%c in format string"
msgstr "E372: Trop de %%%c dans la cha๎ne de format"
-#: ../quickfix.c:371
#, c-format
msgid "E373: Unexpected %%%c in format string"
msgstr "E373: %%%c inattendu dans la cha๎ne de format"
-#: ../quickfix.c:420
msgid "E374: Missing ] in format string"
msgstr "E374: ] manquant dans la cha๎ne de format"
-#: ../quickfix.c:431
#, c-format
msgid "E375: Unsupported %%%c in format string"
msgstr "E375: %%%c non support้ dans la cha๎ne de format"
-#: ../quickfix.c:448
#, c-format
msgid "E376: Invalid %%%c in format string prefix"
msgstr "E376: %%%c invalide dans le pr้fixe de la cha๎ne de format"
-#: ../quickfix.c:454
#, c-format
msgid "E377: Invalid %%%c in format string"
msgstr "E377: %%%c invalide dans la cha๎ne de format"
-#. nothing found
-#: ../quickfix.c:477
msgid "E378: 'errorformat' contains no pattern"
msgstr "E378: 'errorformat' ne contient aucun motif"
-#: ../quickfix.c:695
msgid "E379: Missing or empty directory name"
msgstr "E379: Nom de r้pertoire vide ou absent"
-#: ../quickfix.c:1305
msgid "E553: No more items"
msgstr "E553: Plus d'้l้ments"
-#: ../quickfix.c:1674
+msgid "E924: Current window was closed"
+msgstr "E924: La fen๊tre courante doit ๊tre ferm้e"
+
+msgid "E925: Current quickfix was changed"
+msgstr "E925: Le quickfix courant a chang้"
+
#, c-format
msgid "(%d of %d)%s%s: "
msgstr "(%d sur %d)%s%s : "
-#: ../quickfix.c:1676
msgid " (line deleted)"
msgstr " (ligne effac้e)"
-#: ../quickfix.c:1863
+#, c-format
+msgid "%serror list %d of %d; %d errors "
+msgstr "%sliste d'erreurs %d sur %d ; %d erreurs"
+
msgid "E380: At bottom of quickfix stack"
msgstr "E380: En bas de la pile quickfix"
-#: ../quickfix.c:1869
msgid "E381: At top of quickfix stack"
msgstr "E381: Au sommet de la pile quickfix"
-#: ../quickfix.c:1880
-#, c-format
-msgid "error list %d of %d; %d errors"
-msgstr "liste d'erreurs %d sur %d ; %d erreurs"
+msgid "No entries"
+msgstr "Aucune entr้e"
-#: ../quickfix.c:2427
-msgid "E382: Cannot write, 'buftype' option is set"
-msgstr "E382: ษcriture impossible, l'option 'buftype' est activ้e"
+msgid "Error file"
+msgstr "Fichier d'erreurs"
-#: ../quickfix.c:2812
msgid "E683: File name missing or invalid pattern"
msgstr "E683: Nom de fichier manquant ou motif invalide"
-#: ../quickfix.c:2911
#, c-format
msgid "Cannot open file \"%s\""
msgstr "Impossible d'ouvrir le fichier \"%s\""
-#: ../quickfix.c:3429
msgid "E681: Buffer is not loaded"
msgstr "E681: le tampon n'est pas charg้"
-#: ../quickfix.c:3487
msgid "E777: String or List expected"
msgstr "E777: Cha๎ne ou Liste attendue"
-#: ../regexp.c:359
#, c-format
msgid "E369: invalid item in %s%%[]"
msgstr "E369: ้l้ment invalide dans %s%%[]"
-#: ../regexp.c:374
#, c-format
msgid "E769: Missing ] after %s["
msgstr "E769: ']' manquant apr่s %s["
-#: ../regexp.c:375
+msgid "E944: Reverse range in character class"
+msgstr "E944: Classe de caract่res invers้e"
+
+msgid "E945: Range too large in character class"
+msgstr "E945: Plage de classe de caract่res trop large"
+
#, c-format
msgid "E53: Unmatched %s%%("
msgstr "E53: Pas de correspondance pour %s%%("
-#: ../regexp.c:376
#, c-format
msgid "E54: Unmatched %s("
msgstr "E54: %s( ouvrante non ferm้e"
-#: ../regexp.c:377
#, c-format
msgid "E55: Unmatched %s)"
msgstr "E55: %s) fermante non ouverte"
-#: ../regexp.c:378
msgid "E66: \\z( not allowed here"
msgstr "E66: \\z( n'est pas autoris้ ici"
-#: ../regexp.c:379
-msgid "E67: \\z1 et al. not allowed here"
+msgid "E67: \\z1 - \\z9 not allowed here"
msgstr "E67: \\z1 et co. ne sont pas autoris้s ici"
-#: ../regexp.c:380
#, c-format
msgid "E69: Missing ] after %s%%["
msgstr "E69: ']' manquant apr่s %s%%["
-#: ../regexp.c:381
#, c-format
msgid "E70: Empty %s%%[]"
msgstr "E70: %s%%[] vide"
-#: ../regexp.c:1209 ../regexp.c:1224
+msgid "E956: Cannot use pattern recursively"
+msgstr "E956: Impossible d'utiliser le motif r้cursivement"
+
+msgid "E65: Illegal back reference"
+msgstr "E65: post-r้f้rence invalide"
+
msgid "E339: Pattern too long"
msgstr "E339: Motif trop long"
-#: ../regexp.c:1371
msgid "E50: Too many \\z("
msgstr "E50: Trop de \\z("
-#: ../regexp.c:1378
#, c-format
msgid "E51: Too many %s("
msgstr "E51: Trop de %s("
-#: ../regexp.c:1427
msgid "E52: Unmatched \\z("
msgstr "E52: Pas de correspondance pour \\z("
-#: ../regexp.c:1637
#, c-format
msgid "E59: invalid character after %s@"
msgstr "E59: caract่re invalide apr่s %s@"
-#: ../regexp.c:1672
#, c-format
msgid "E60: Too many complex %s{...}s"
msgstr "E60: Trop de %s{...}s complexes"
-#: ../regexp.c:1687
#, c-format
msgid "E61: Nested %s*"
msgstr "E61: %s* imbriqu้s"
-#: ../regexp.c:1690
#, c-format
msgid "E62: Nested %s%c"
msgstr "E62: %s%c imbriqu้s"
-#: ../regexp.c:1800
msgid "E63: invalid use of \\_"
msgstr "E63: utilisation invalide de \\_"
-#: ../regexp.c:1850
#, c-format
msgid "E64: %s%c follows nothing"
msgstr "E64: %s%c ne suit aucun atome"
-#: ../regexp.c:1902
-msgid "E65: Illegal back reference"
-msgstr "E65: post-r้f้rence invalide"
-
-#: ../regexp.c:1943
msgid "E68: Invalid character after \\z"
msgstr "E68: Caract่re invalide apr่s \\z"
-#: ../regexp.c:2049 ../regexp_nfa.c:1296
#, c-format
msgid "E678: Invalid character after %s%%[dxouU]"
msgstr "E678: Caract่re invalide apr่s %s%%[dxouU]"
-#: ../regexp.c:2107
#, c-format
msgid "E71: Invalid character after %s%%"
msgstr "E71: Caract่re invalide apr่s %s%%"
-#: ../regexp.c:3017
#, c-format
msgid "E554: Syntax error in %s{...}"
msgstr "E554: Erreur de syntaxe dans %s{...}"
-#: ../regexp.c:3805
msgid "External submatches:\n"
msgstr "Sous-correspondances externes :\n"
-#: ../regexp.c:7022
+#, c-format
+msgid "E888: (NFA regexp) cannot repeat %s"
+msgstr "E888: (regexp NFA) %s ne peut pas ๊tre r้p้t้"
+
msgid ""
"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be "
"used "
@@ -5222,63 +5072,61 @@ msgstr ""
"E864: \\%#= peut ๊tre suivi uniquement de 0, 1 ou 2. Le moteur automatique "
"sera utilis้ "
-#: ../regexp_nfa.c:239
+msgid "Switching to backtracking RE engine for pattern: "
+msgstr "Moteur RE avec backtracking utilis้ pour le motif : "
+
msgid "E865: (NFA) Regexp end encountered prematurely"
msgstr "E865: (NFA) Fin de regexp rencontr้e pr้matur้ment"
-#: ../regexp_nfa.c:240
#, c-format
msgid "E866: (NFA regexp) Misplaced %c"
msgstr "E866: (regexp NFA) %c au mauvais endroit"
-#: ../regexp_nfa.c:242
-#, fuzzy, c-format
-msgid "E877: (NFA regexp) Invalid character class: %<PRId64>"
-msgstr "E877: (regexp NFA) Classe de caract่re invalide "
+#, c-format
+msgid "E877: (NFA regexp) Invalid character class: %ld"
+msgstr "E877: (regexp NFA) Classe de caract่re invalide : %ld"
-#: ../regexp_nfa.c:1261
#, c-format
msgid "E867: (NFA) Unknown operator '\\z%c'"
msgstr "E867: (NFA) Op้rateur inconnu '\\z%c'"
-#: ../regexp_nfa.c:1387
-#, fuzzy, c-format
+msgid "E951: \\% value too large"
+msgstr "E951: valeur \\% trop grande"
+
+#, c-format
msgid "E867: (NFA) Unknown operator '\\%%%c'"
-msgstr "E867: (NFA) Op้rateur inconnu '\\z%c'"
+msgstr "E867: (NFA) Op้rateur inconnu '\\%%%c'"
+
+msgid "E868: Error building NFA with equivalence class!"
+msgstr "E868: Erreur lors de la construction du NFA avec classe d'้quivalence"
-#: ../regexp_nfa.c:1802
#, c-format
msgid "E869: (NFA) Unknown operator '\\@%c'"
msgstr "E869: (NFA) Op้rateur inconnu '\\@%c'"
-#: ../regexp_nfa.c:1831
msgid "E870: (NFA regexp) Error reading repetition limits"
msgstr "E870: (regexp NFA) Erreur เ la lecture des limites de r้p้tition"
-#. Can't have a multi follow a multi.
-#: ../regexp_nfa.c:1895
-msgid "E871: (NFA regexp) Can't have a multi follow a multi !"
-msgstr "E871: (regexp NFA) Un multi ne peut pas suivre un multi !"
+msgid "E871: (NFA regexp) Can't have a multi follow a multi"
+msgstr "E871: (regexp NFA) Un multi ne peut pas suivre un multi"
-#. Too many `('
-#: ../regexp_nfa.c:2037
msgid "E872: (NFA regexp) Too many '('"
msgstr "E872: (regexp NFA) Trop de '('"
-#: ../regexp_nfa.c:2042
-#, fuzzy
msgid "E879: (NFA regexp) Too many \\z("
-msgstr "E872: (regexp NFA) Trop de '('"
+msgstr "E879: (regexp NFA) Trop de \\z("
-#: ../regexp_nfa.c:2066
msgid "E873: (NFA regexp) proper termination error"
msgstr "E873: (NFA regexp) erreur de terminaison"
-#: ../regexp_nfa.c:2599
-msgid "E874: (NFA) Could not pop the stack !"
+msgid "Could not open temporary log file for writing, displaying on stderr... "
+msgstr ""
+"Impossible d'ouvrir le fichier de log temporaire en ้criture, affichage sur "
+"stderr... "
+
+msgid "E874: (NFA) Could not pop the stack!"
msgstr "E874: (NFA) Impossible de d้piler !"
-#: ../regexp_nfa.c:3298
msgid ""
"E875: (NFA regexp) (While converting from postfix to NFA), too many states "
"left on stack"
@@ -5286,178 +5134,124 @@ msgstr ""
"E875: (regexp NFA) (lors de la conversion de postfix เ NFA), il reste trop "
"d'้tats sur la pile"
-#: ../regexp_nfa.c:3302
msgid "E876: (NFA regexp) Not enough space to store the whole NFA "
msgstr "E876: (regexp NFA) Pas assez de m้moire pour stocker le NFA"
-#: ../regexp_nfa.c:4571 ../regexp_nfa.c:4869
-msgid ""
-"Could not open temporary log file for writing, displaying on stderr ... "
+msgid "E878: (NFA) Could not allocate memory for branch traversal!"
msgstr ""
-"Impossible d'ouvrir le fichier de log temporaire en ้criture, affichage sur "
-"stderr ... "
-
-#: ../regexp_nfa.c:4840
-#, c-format
-msgid "(NFA) COULD NOT OPEN %s !"
-msgstr "(NFA) IMPOSSIBLE D'OUVRIR %s !"
-
-#: ../regexp_nfa.c:6049
-msgid "Could not open temporary log file for writing "
-msgstr "Impossible d'ouvrir le fichier de log en ้criture"
+"E878: (NFA) Impossible d'allouer la m้moire pour parcourir les branches !"
-#: ../screen.c:7435
msgid " VREPLACE"
msgstr " VREMPLACEMENT"
-#: ../screen.c:7437
msgid " REPLACE"
msgstr " REMPLACEMENT"
# DB - todo
-#: ../screen.c:7440
msgid " REVERSE"
msgstr " REVERSE"
-#: ../screen.c:7441
msgid " INSERT"
msgstr " INSERTION"
-#: ../screen.c:7443
msgid " (insert)"
msgstr " (insertion)"
-#: ../screen.c:7445
msgid " (replace)"
msgstr " (remplacement)"
-#: ../screen.c:7447
msgid " (vreplace)"
msgstr " (vremplacement)"
-#: ../screen.c:7449
msgid " Hebrew"
msgstr " h้breu"
-#: ../screen.c:7454
msgid " Arabic"
msgstr " arabe"
-#: ../screen.c:7456
-msgid " (lang)"
-msgstr " (langue)"
-
-#: ../screen.c:7459
msgid " (paste)"
msgstr " (collage)"
-#: ../screen.c:7469
msgid " VISUAL"
msgstr " VISUEL"
-#: ../screen.c:7470
msgid " VISUAL LINE"
msgstr " VISUEL LIGNE"
-#: ../screen.c:7471
msgid " VISUAL BLOCK"
msgstr " VISUEL BLOC"
-#: ../screen.c:7472
msgid " SELECT"
msgstr " SษLECTION"
-#: ../screen.c:7473
msgid " SELECT LINE"
msgstr " SษLECTION LIGNE"
-#: ../screen.c:7474
msgid " SELECT BLOCK"
msgstr " SษLECTION BLOC"
-#: ../screen.c:7486 ../screen.c:7541
msgid "recording"
msgstr "Enregistrement"
-#: ../search.c:487
#, c-format
msgid "E383: Invalid search string: %s"
msgstr "E383: Cha๎ne de recherche invalide : %s"
-#: ../search.c:832
#, c-format
msgid "E384: search hit TOP without match for: %s"
msgstr "E384: la recherche a atteint le HAUT sans trouver : %s"
-#: ../search.c:835
#, c-format
msgid "E385: search hit BOTTOM without match for: %s"
msgstr "E385: la recherche a atteint le BAS sans trouver : %s"
-#: ../search.c:1200
msgid "E386: Expected '?' or '/' after ';'"
msgstr "E386: '?' ou '/' attendu apr่s ';'"
-#: ../search.c:4085
msgid " (includes previously listed match)"
msgstr " (inclut des correspondances list้es pr้c้demment)"
-#. cursor at status line
-#: ../search.c:4104
msgid "--- Included files "
msgstr "--- Fichiers inclus "
-#: ../search.c:4106
msgid "not found "
msgstr "introuvables "
-#: ../search.c:4107
msgid "in path ---\n"
msgstr "dans le chemin ---\n"
-#: ../search.c:4168
msgid " (Already listed)"
msgstr " (D้jเ list้)"
-#: ../search.c:4170
msgid " NOT FOUND"
msgstr " INTROUVABLE"
-#: ../search.c:4211
#, c-format
msgid "Scanning included file: %s"
msgstr "Examen des fichiers inclus : %s"
-#: ../search.c:4216
#, c-format
msgid "Searching included file %s"
msgstr "Recherche du fichier inclus %s"
-#: ../search.c:4405
msgid "E387: Match is on current line"
msgstr "E387: La correspondance est sur la ligne courante"
-#: ../search.c:4517
msgid "All included files were found"
msgstr "Tous les fichiers inclus ont ้t้ trouv้s"
-#: ../search.c:4519
msgid "No included files"
msgstr "Aucun fichier inclus"
-#: ../search.c:4527
msgid "E388: Couldn't find definition"
msgstr "E388: Impossible de trouver la d้finition"
-#: ../search.c:4529
msgid "E389: Couldn't find pattern"
msgstr "E389: Impossible de trouver le motif"
-#: ../search.c:4668
msgid "Substitute "
msgstr "Substitue "
-#: ../search.c:4681
#, c-format
msgid ""
"\n"
@@ -5468,97 +5262,127 @@ msgstr ""
"# Dernier motif de recherche %s :\n"
"~"
-#: ../spell.c:951
-msgid "E759: Format error in spell file"
-msgstr "E759: Erreur de format du fichier orthographique"
+msgid "E756: Spell checking is not enabled"
+msgstr "E756: La v้rification orthographique n'est pas activ้e"
+
+#, c-format
+msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\""
+msgstr "Alerte : Liste de mots \"%s_%s.spl\" ou \"%s_ascii.spl\" introuvable"
+
+#, c-format
+msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
+msgstr "Alerte : Liste de mots \"%s.%s.spl\" ou \"%s.ascii.spl\" introuvable"
+
+msgid "E797: SpellFileMissing autocommand deleted buffer"
+msgstr "E797: L'autocommande SpellFileMissing a effac้ le tampon"
+
+#, c-format
+msgid "Warning: region %s not supported"
+msgstr "Alerte : r้gion %s non support้e"
+
+msgid "Sorry, no suggestions"
+msgstr "D้sol้, aucune suggestion"
+
+#, c-format
+msgid "Sorry, only %ld suggestions"
+msgstr "D้sol้, seulement %ld suggestions"
+
+#, c-format
+msgid "Change \"%.*s\" to:"
+msgstr "Remplacer \"%.*s\" par :"
+
+# DB - todo : l'int้r๊t de traduire ce message m'้chappe.
+#, c-format
+msgid " < \"%.*s\""
+msgstr " < \"%.*s\""
+
+msgid "E752: No previous spell replacement"
+msgstr "E752: Pas de suggestion orthographique pr้c้dente"
+
+#, c-format
+msgid "E753: Not found: %s"
+msgstr "E753: Introuvable : %s"
-#: ../spell.c:952
msgid "E758: Truncated spell file"
msgstr "E758: Fichier orthographique tronqu้"
-#: ../spell.c:953
#, c-format
msgid "Trailing text in %s line %d: %s"
msgstr "Texte en trop dans %s ligne %d : %s"
-#: ../spell.c:954
#, c-format
msgid "Affix name too long in %s line %d: %s"
msgstr "Nom d'affixe trop long dans %s ligne %d : %s"
-#: ../spell.c:955
msgid "E761: Format error in affix file FOL, LOW or UPP"
msgstr "E761: Erreur de format dans le fichier d'affixe FOL, LOW et UPP"
-#: ../spell.c:957
msgid "E762: Character in FOL, LOW or UPP is out of range"
msgstr "E762: Un caract่re dans FOL, LOW ou UPP est hors-limites"
-#: ../spell.c:958
msgid "Compressing word tree..."
msgstr "Compression de l'arbre des mots"
-#: ../spell.c:1951
-msgid "E756: Spell checking is not enabled"
-msgstr "E756: La v้rification orthographique n'est pas activ้e"
-
-#: ../spell.c:2249
-#, c-format
-msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
-msgstr "Alerte : Liste de mots \"%s.%s.spl\" ou \"%s.ascii.spl\" introuvable"
-
-#: ../spell.c:2473
#, c-format
msgid "Reading spell file \"%s\""
msgstr "Lecture du fichier orthographique \"%s\""
-#: ../spell.c:2496
msgid "E757: This does not look like a spell file"
msgstr "E757: Le fichier ne ressemble pas เ un fichier orthographique"
-#: ../spell.c:2501
msgid "E771: Old spell file, needs to be updated"
msgstr "E771: Fichier orthographique obsol่te, sa mise เ jour est n้cessaire"
-#: ../spell.c:2504
msgid "E772: Spell file is for newer version of Vim"
msgstr "E772: Le fichier est pr้vu pour une version de Vim plus r้cente"
-#: ../spell.c:2602
msgid "E770: Unsupported section in spell file"
msgstr "E770: Section non support้e dans le fichier orthographique"
-#: ../spell.c:3762
#, c-format
-msgid "Warning: region %s not supported"
-msgstr "Alerte : r้gion %s non support้e"
+msgid "E778: This does not look like a .sug file: %s"
+msgstr "E778: %s ne semble pas ๊tre un fichier .sug"
-#: ../spell.c:4550
#, c-format
-msgid "Reading affix file %s ..."
+msgid "E779: Old .sug file, needs to be updated: %s"
+msgstr "E779: Fichier de suggestions obsol่te, mise เ jour n้cessaire : %s"
+
+#, c-format
+msgid "E780: .sug file is for newer version of Vim: %s"
+msgstr "E780: Fichier .sug pr้vu pour une version de Vim plus r้cente : %s"
+
+#, c-format
+msgid "E781: .sug file doesn't match .spl file: %s"
+msgstr "E781: Le fichier .sug ne correspond pas au fichier .spl : %s"
+
+#, c-format
+msgid "E782: error while reading .sug file: %s"
+msgstr "E782: Erreur lors de la lecture de fichier de suggestions : %s"
+
+#, c-format
+msgid "Reading affix file %s..."
msgstr "Lecture du fichier d'affixes %s..."
-#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
#, c-format
msgid "Conversion failure for word in %s line %d: %s"
msgstr "ษchec de conversion du mot dans %s ligne %d : %s"
-#: ../spell.c:4630 ../spell.c:6170
#, c-format
msgid "Conversion in %s not supported: from %s to %s"
msgstr "La conversion dans %s non support้e : de %s vers %s"
-#: ../spell.c:4642
+#, c-format
+msgid "Conversion in %s not supported"
+msgstr "La conversion dans %s non support้e"
+
#, c-format
msgid "Invalid value for FLAG in %s line %d: %s"
msgstr "Valeur de FLAG invalide dans %s ligne %d : %s"
-#: ../spell.c:4655
#, c-format
msgid "FLAG after using flags in %s line %d: %s"
msgstr "FLAG trouv้ apr่s des drapeaux dans %s ligne %d : %s"
-#: ../spell.c:4723
#, c-format
msgid ""
"Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line "
@@ -5567,7 +5391,6 @@ msgstr ""
"D้finir COMPOUNDFORBIDFLAG apr่s des PFX peut donner des r้sultats erron้s "
"dans %s ligne %d"
-#: ../spell.c:4731
#, c-format
msgid ""
"Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line "
@@ -5576,45 +5399,37 @@ msgstr ""
"D้finir COMPOUNDPERMITFLAG apr่s des PFX peut donner des r้sultats erron้s "
"dans %s ligne %d"
-#: ../spell.c:4747
#, c-format
msgid "Wrong COMPOUNDRULES value in %s line %d: %s"
msgstr "Valeur de COMPOUNDRULES erron้e dans %s ligne %d : %s"
-#: ../spell.c:4771
#, c-format
msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s"
msgstr "Valeur de COMPOUNDWORDMAX erron้e dans %s ligne %d : %s"
-#: ../spell.c:4777
#, c-format
msgid "Wrong COMPOUNDMIN value in %s line %d: %s"
msgstr "Valeur de COMPOUNDMIN erron้e dans %s ligne %d : %s"
-#: ../spell.c:4783
#, c-format
msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s"
msgstr "Valeur de COMPOUNDSYLMAX erron้e dans %s ligne %d : %s"
-#: ../spell.c:4795
#, c-format
msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"
msgstr "Valeur de CHECKCOMPOUNDPATTERN erron้e dans %s ligne %d : %s"
# DB - TODO
-#: ../spell.c:4847
#, c-format
msgid "Different combining flag in continued affix block in %s line %d: %s"
msgstr ""
"Drapeaux de composition diff้rents dans un bloc d'affixes continu dans %s "
"ligne %d : %s"
-#: ../spell.c:4850
#, c-format
msgid "Duplicate affix in %s line %d: %s"
msgstr "Affixe dupliqu้ dans %s ligne %d : %s"
-#: ../spell.c:4871
#, c-format
msgid ""
"Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s "
@@ -5623,339 +5438,257 @@ msgstr ""
"Affixe aussi utilis้e pour BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/"
"NOSUGGEST dans %s ligne %d : %s"
-#: ../spell.c:4893
#, c-format
msgid "Expected Y or N in %s line %d: %s"
msgstr "Y ou N attendu dans %s ligne %d : %s"
# DB - todo (regexp impossible เ compiler...)
-#: ../spell.c:4968
#, c-format
msgid "Broken condition in %s line %d: %s"
msgstr "Condition non valide dans %s ligne %d : %s"
-#: ../spell.c:5091
#, c-format
msgid "Expected REP(SAL) count in %s line %d"
msgstr "Nombre de REP(SAL) attendu dans %s ligne %d"
-#: ../spell.c:5120
#, c-format
msgid "Expected MAP count in %s line %d"
msgstr "Nombre de MAP attendu dans %s ligne %d"
-#: ../spell.c:5132
#, c-format
msgid "Duplicate character in MAP in %s line %d"
msgstr "Caract่re dupliqu้ dans MAP dans %s ligne %d"
-#: ../spell.c:5176
#, c-format
msgid "Unrecognized or duplicate item in %s line %d: %s"
msgstr "ษl้ment non reconnu ou dupliqu้ dans %s ligne %d : %s"
-#: ../spell.c:5197
#, c-format
msgid "Missing FOL/LOW/UPP line in %s"
msgstr "Ligne FOL/LOW/UPP manquante dans %s"
-#: ../spell.c:5220
msgid "COMPOUNDSYLMAX used without SYLLABLE"
msgstr "Utilisation de COMPOUNDSYLMAX sans SYLLABLE"
-#: ../spell.c:5236
msgid "Too many postponed prefixes"
msgstr "Trop de pr้fixes report้s (PFXPOSTPONE)"
-#: ../spell.c:5238
msgid "Too many compound flags"
msgstr "Trop de drapeaux de composition"
-#: ../spell.c:5240
msgid "Too many postponed prefixes and/or compound flags"
msgstr "Trop de pr้fixes report้s et/ou de drapeaux de composition"
-#: ../spell.c:5250
#, c-format
msgid "Missing SOFO%s line in %s"
msgstr "Ligne SOFO%s manquante dans %s"
-#: ../spell.c:5253
#, c-format
msgid "Both SAL and SOFO lines in %s"
msgstr "Lignes SAL et lignes SOFO pr้sentes dans %s"
-#: ../spell.c:5331
#, c-format
msgid "Flag is not a number in %s line %d: %s"
msgstr "Le drapeau n'est pas un nombre dans %s ligne %d : %s"
-#: ../spell.c:5334
#, c-format
msgid "Illegal flag in %s line %d: %s"
msgstr "Drapeau non autoris้ dans %s ligne %d : %s"
-#: ../spell.c:5493 ../spell.c:5501
#, c-format
msgid "%s value differs from what is used in another .aff file"
msgstr "La valeur de %s est diff้rente de celle d'un autre fichier .aff"
-#: ../spell.c:5602
#, c-format
-msgid "Reading dictionary file %s ..."
+msgid "Reading dictionary file %s..."
msgstr "Lecture du fichier orthographique %s..."
-#: ../spell.c:5611
#, c-format
msgid "E760: No word count in %s"
msgstr "E760: Nombre de mots non indiqu้ dans %s"
-#: ../spell.c:5669
#, c-format
-msgid "line %6d, word %6d - %s"
-msgstr "ligne %6d, mot %6d - %s"
+msgid "line %6d, word %6ld - %s"
+msgstr "ligne %6d, mot %6ld - %s"
-#: ../spell.c:5691
#, c-format
msgid "Duplicate word in %s line %d: %s"
msgstr "Mot dupliqu้ dans %s ligne %d : %s"
-#: ../spell.c:5694
#, c-format
msgid "First duplicate word in %s line %d: %s"
msgstr "Premier mot dupliqu้ dans %s ligne %d : %s"
-#: ../spell.c:5746
#, c-format
msgid "%d duplicate word(s) in %s"
msgstr "%d mot(s) dupliqu้(s) dans %s"
-#: ../spell.c:5748
#, c-format
msgid "Ignored %d word(s) with non-ASCII characters in %s"
msgstr "%d mot(s) ignor้(s) avec des caract่res non-ASCII dans %s"
-#: ../spell.c:6115
#, c-format
-msgid "Reading word file %s ..."
+msgid "Reading word file %s..."
msgstr "Lecture de la liste de mots %s..."
-#: ../spell.c:6155
#, c-format
msgid "Duplicate /encoding= line ignored in %s line %d: %s"
msgstr "Ligne /encoding= en double ignor้e dans %s ligne %d : %s"
-#: ../spell.c:6159
#, c-format
msgid "/encoding= line after word ignored in %s line %d: %s"
msgstr "Ligne /encoding= apr่s des mots ignor้e dans %s ligne %d : %s"
-#: ../spell.c:6180
#, c-format
msgid "Duplicate /regions= line ignored in %s line %d: %s"
msgstr "Ligne /regions= en double ignor้e dans %s ligne %d : %s"
-#: ../spell.c:6185
#, c-format
msgid "Too many regions in %s line %d: %s"
msgstr "Trop de r้gions dans %s ligne %d : %s"
-#: ../spell.c:6198
#, c-format
msgid "/ line ignored in %s line %d: %s"
msgstr "Ligne / ignor้e dans %s ligne %d : %s"
-#: ../spell.c:6224
#, c-format
msgid "Invalid region nr in %s line %d: %s"
msgstr "Num้ro de r้gion invalide dans %s ligne %d : %s"
-#: ../spell.c:6230
#, c-format
msgid "Unrecognized flags in %s line %d: %s"
msgstr "Drapeaux non reconnus dans %s ligne %d : %s"
-#: ../spell.c:6257
#, c-format
msgid "Ignored %d words with non-ASCII characters"
msgstr "%d mot(s) ignor้(s) avec des caract่res non-ASCII"
-#: ../spell.c:6656
+msgid "E845: Insufficient memory, word list will be incomplete"
+msgstr "E845: m้moire insuffisante, liste de mots peut-๊tre incompl่te"
+
#, c-format
msgid "Compressed %d of %d nodes; %d (%d%%) remaining"
msgstr "%d noeuds compress้s sur %d ; %d (%d%%) restants "
-#: ../spell.c:7340
msgid "Reading back spell file..."
msgstr "Relecture du fichier orthographique"
-#. Go through the trie of good words, soundfold each word and add it to
-#. the soundfold trie.
-#: ../spell.c:7357
msgid "Performing soundfolding..."
msgstr "Analyse phon้tique en cours..."
-#: ../spell.c:7368
#, c-format
-msgid "Number of words after soundfolding: %<PRId64>"
-msgstr "Nombre de mots apr่s l'analyse phon้tique : %<PRId64>"
+msgid "Number of words after soundfolding: %ld"
+msgstr "Nombre de mots apr่s l'analyse phon้tique : %ld"
-#: ../spell.c:7476
#, c-format
msgid "Total number of words: %d"
msgstr "Nombre total de mots : %d"
-#: ../spell.c:7655
#, c-format
-msgid "Writing suggestion file %s ..."
+msgid "Writing suggestion file %s..."
msgstr "ษcriture du fichier de suggestions %s..."
-#: ../spell.c:7707 ../spell.c:7927
#, c-format
msgid "Estimated runtime memory use: %d bytes"
msgstr "Estimation de m้moire consomm้e : %d octets"
-#: ../spell.c:7820
msgid "E751: Output file name must not have region name"
msgstr "E751: Le nom du fichier ne doit pas contenir de nom de r้gion"
-#: ../spell.c:7822
-msgid "E754: Only up to 8 regions supported"
-msgstr "E754: 8 r้gions au maximum sont support้es"
+#, c-format
+msgid "E754: Only up to %ld regions supported"
+msgstr "E754: %ld r้gions au maximum support้es"
-#: ../spell.c:7846
#, c-format
msgid "E755: Invalid region in %s"
msgstr "E755: R้gion invalide dans %s"
-#: ../spell.c:7907
msgid "Warning: both compounding and NOBREAK specified"
msgstr "Alerte : la composition et NOBREAK sont tous les deux sp้cifi้s"
-#: ../spell.c:7920
#, c-format
-msgid "Writing spell file %s ..."
+msgid "Writing spell file %s..."
msgstr "ษcriture du fichier orthographique %s..."
-#: ../spell.c:7925
msgid "Done!"
msgstr "Termin้ !"
# DB - todo : perfectible.
-#: ../spell.c:8034
#, c-format
-msgid "E765: 'spellfile' does not have %<PRId64> entries"
-msgstr "E765: 'spellfile' n'a pas %<PRId64> entr้es"
+msgid "E765: 'spellfile' does not have %ld entries"
+msgstr "E765: 'spellfile' n'a pas %ld entr้es"
-#: ../spell.c:8074
-#, fuzzy, c-format
+#, c-format
msgid "Word '%.*s' removed from %s"
-msgstr "Mot retir้ de %s"
+msgstr "Mot '%.*s' retir้ de %s"
-#: ../spell.c:8117
-#, fuzzy, c-format
+#, c-format
msgid "Word '%.*s' added to %s"
-msgstr "Mot ajout้ dans %s"
+msgstr "Mot '%.*s' ajout้ dans %s"
-#: ../spell.c:8381
msgid "E763: Word characters differ between spell files"
msgstr ""
"E763: Les caract่res de mots diff่rent entre les fichiers orthographiques"
-#: ../spell.c:8684
-msgid "Sorry, no suggestions"
-msgstr "D้sol้, aucune suggestion"
+msgid "E783: duplicate char in MAP entry"
+msgstr "E783: caract่re dupliqu้ dans l'entr้e MAP"
-#: ../spell.c:8687
-#, c-format
-msgid "Sorry, only %<PRId64> suggestions"
-msgstr "D้sol้, seulement %<PRId64> suggestions"
+msgid "No Syntax items defined for this buffer"
+msgstr "Aucun ้l้ment de syntaxe d้fini pour ce tampon"
-#. for when 'cmdheight' > 1
-#. avoid more prompt
-#: ../spell.c:8704
-#, c-format
-msgid "Change \"%.*s\" to:"
-msgstr "Remplacer \"%.*s\" par :"
+msgid "'redrawtime' exceeded, syntax highlighting disabled"
+msgstr "'redrawtime' ้coul้, surbrillance de syntaxe d้sactiv้e"
-# DB - todo : l'int้r๊t de traduire ce message m'้chappe.
-#: ../spell.c:8737
-#, c-format
-msgid " < \"%.*s\""
-msgstr " < \"%.*s\""
-
-#: ../spell.c:8882
-msgid "E752: No previous spell replacement"
-msgstr "E752: Pas de suggestion orthographique pr้c้dente"
+msgid "syntax conceal on"
+msgstr "\"syntax conceal\" activ้e"
-#: ../spell.c:8925
-#, c-format
-msgid "E753: Not found: %s"
-msgstr "E753: Introuvable : %s"
+msgid "syntax conceal off"
+msgstr "\"syntax conceal\" d้sactiv้e"
-#: ../spell.c:9276
#, c-format
-msgid "E778: This does not look like a .sug file: %s"
-msgstr "E778: %s ne semble pas ๊tre un fichier .sug"
+msgid "E390: Illegal argument: %s"
+msgstr "E390: Argument invalide : %s"
-#: ../spell.c:9282
-#, c-format
-msgid "E779: Old .sug file, needs to be updated: %s"
-msgstr "E779: Fichier de suggestions obsol่te, mise เ jour n้cessaire : %s"
+msgid "syntax case ignore"
+msgstr "syntaxe ignore la casse"
-#: ../spell.c:9286
-#, c-format
-msgid "E780: .sug file is for newer version of Vim: %s"
-msgstr "E780: Fichier .sug pr้vu pour une version de Vim plus r้cente : %s"
+msgid "syntax case match"
+msgstr "syntaxe respecte la casse"
-#: ../spell.c:9295
-#, c-format
-msgid "E781: .sug file doesn't match .spl file: %s"
-msgstr "E781: Le fichier .sug ne correspond pas au fichier .spl : %s"
+msgid "syntax spell toplevel"
+msgstr "contr๔le orthographique dans le texte sans groupe syntaxique"
-#: ../spell.c:9305
-#, c-format
-msgid "E782: error while reading .sug file: %s"
-msgstr "E782: Erreur lors de la lecture de fichier de suggestions : %s"
+msgid "syntax spell notoplevel"
+msgstr "pas de contr๔le orthographique dans le texte sans groupe syntaxique"
-#. This should have been checked when generating the .spl
-#. file.
-#: ../spell.c:11575
-msgid "E783: duplicate char in MAP entry"
-msgstr "E783: caract่res dupliqu้ dans l'entr้e MAP"
+msgid "syntax spell default"
+msgstr ""
+"contr๔le orthographique dans le texte sans groupe syntaxique, sauf si @Spell/"
+"@NoSpell"
-#: ../syntax.c:266
-msgid "No Syntax items defined for this buffer"
-msgstr "Aucun ้l้ment de syntaxe d้fini pour ce tampon"
+msgid "syntax iskeyword "
+msgstr "syntaxe iskeyword "
-#: ../syntax.c:3083 ../syntax.c:3104 ../syntax.c:3127
-#, c-format
-msgid "E390: Illegal argument: %s"
-msgstr "E390: Argument invalide : %s"
+msgid "syntax iskeyword not set"
+msgstr "iskeyword n'est pas activ้"
-#: ../syntax.c:3299
#, c-format
msgid "E391: No such syntax cluster: %s"
msgstr "E391: Aucune grappe de syntaxe %s"
-#: ../syntax.c:3433
msgid "syncing on C-style comments"
msgstr "synchronisation sur les commentaires de type C"
-#: ../syntax.c:3439
msgid "no syncing"
msgstr "Aucune synchronisation"
# DB - Les deux messages qui suivent vont ensemble.
-#: ../syntax.c:3441
msgid "syncing starts "
msgstr "La synchronisation d้bute "
-#: ../syntax.c:3443 ../syntax.c:3506
msgid " lines before top line"
msgstr " lignes avant la ligne du haut"
-#: ../syntax.c:3448
msgid ""
"\n"
"--- Syntax sync items ---"
@@ -5963,7 +5696,6 @@ msgstr ""
"\n"
"--- ษl้ments de synchronisation syntaxique ---"
-#: ../syntax.c:3452
msgid ""
"\n"
"syncing on items"
@@ -5971,7 +5703,6 @@ msgstr ""
"\n"
"synchronisation sur ้l้ments"
-#: ../syntax.c:3457
msgid ""
"\n"
"--- Syntax items ---"
@@ -5979,275 +5710,218 @@ msgstr ""
"\n"
"--- ษl้ments de syntaxe ---"
-#: ../syntax.c:3475
#, c-format
msgid "E392: No such syntax cluster: %s"
msgstr "E392: Aucune grappe de syntaxe %s"
-#: ../syntax.c:3497
msgid "minimal "
msgstr "minimum "
-#: ../syntax.c:3503
msgid "maximal "
msgstr "maximum "
# DB - todo
-#: ../syntax.c:3513
msgid "; match "
msgstr "; correspond avec "
# DB - todo
-#: ../syntax.c:3515
msgid " line breaks"
msgstr " coupures de ligne"
-#: ../syntax.c:4076
msgid "E395: contains argument not accepted here"
msgstr "E395: L'argument ซ contains ป n'est pas accept้ ici"
-#: ../syntax.c:4096
msgid "E844: invalid cchar value"
msgstr "E844: valeur de cchar invalide"
-#: ../syntax.c:4107
msgid "E393: group[t]here not accepted here"
msgstr "E393: L'argument ซ group[t]here ป n'est pas accept้ ici"
-#: ../syntax.c:4126
#, c-format
msgid "E394: Didn't find region item for %s"
msgstr "E394: Aucun ้l้ment de type r้gion trouv้ pour %s"
-#: ../syntax.c:4188
msgid "E397: Filename required"
msgstr "E397: Nom de fichier requis"
-#: ../syntax.c:4221
msgid "E847: Too many syntax includes"
msgstr "E847: Trop d'inclusions de syntaxe"
-#: ../syntax.c:4303
#, c-format
msgid "E789: Missing ']': %s"
msgstr "E789: ']' manquant : %s"
-#: ../syntax.c:4531
+#, c-format
+msgid "E890: trailing char after ']': %s]%s"
+msgstr "E890: Caract่re surnum้raire apr่s ']': %s]%s"
+
#, c-format
msgid "E398: Missing '=': %s"
msgstr "E398: '=' manquant : %s"
-#: ../syntax.c:4666
#, c-format
msgid "E399: Not enough arguments: syntax region %s"
msgstr "E399: Pas assez d'arguments : syntax region %s"
-#: ../syntax.c:4870
msgid "E848: Too many syntax clusters"
msgstr "E848: Trop de grappes de syntaxe"
-#: ../syntax.c:4954
msgid "E400: No cluster specified"
msgstr "E400: Aucune grappe sp้cifi้e"
-#. end delimiter not found
-#: ../syntax.c:4986
#, c-format
msgid "E401: Pattern delimiter not found: %s"
msgstr "E401: D้limiteur de motif introuvable : %s"
-#: ../syntax.c:5049
#, c-format
msgid "E402: Garbage after pattern: %s"
msgstr "E402: caract่res en trop apr่s le motif : %s"
-#: ../syntax.c:5120
msgid "E403: syntax sync: line continuations pattern specified twice"
msgstr ""
"E403: synchro syntax : motif de continuation de ligne pr้sent deux fois"
-#: ../syntax.c:5169
#, c-format
msgid "E404: Illegal arguments: %s"
msgstr "E404: Arguments invalides : %s"
-#: ../syntax.c:5217
#, c-format
msgid "E405: Missing equal sign: %s"
msgstr "E405: '=' manquant : %s"
-#: ../syntax.c:5222
#, c-format
msgid "E406: Empty argument: %s"
msgstr "E406: Argument vide : %s"
-#: ../syntax.c:5240
#, c-format
msgid "E407: %s not allowed here"
msgstr "E407: %s n'est pas autoris้ ici"
-#: ../syntax.c:5246
#, c-format
msgid "E408: %s must be first in contains list"
msgstr "E408: %s doit ๊tre le premier ้l้ment d'une liste ซ contains ป"
-#: ../syntax.c:5304
#, c-format
msgid "E409: Unknown group name: %s"
msgstr "E409: Nom de groupe inconnu : %s"
-#: ../syntax.c:5512
#, c-format
msgid "E410: Invalid :syntax subcommand: %s"
msgstr "E410: Sous-commande de :syntax invalide : %s"
-#: ../syntax.c:5854
msgid ""
" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
msgstr ""
+" TOTAL NOMBRE MATCH PLUS LENT MOYEN NOM MOTIF"
-#: ../syntax.c:6146
msgid "E679: recursive loop loading syncolor.vim"
msgstr "E679: boucle r้cursive lors du chargement de syncolor.vim"
-#: ../syntax.c:6256
#, c-format
msgid "E411: highlight group not found: %s"
msgstr "E411: groupe de surbrillance introuvable : %s"
-#: ../syntax.c:6278
#, c-format
msgid "E412: Not enough arguments: \":highlight link %s\""
msgstr "E412: Trop peu d'arguments : \":highlight link %s\""
-#: ../syntax.c:6284
#, c-format
msgid "E413: Too many arguments: \":highlight link %s\""
msgstr "E413: Trop d'arguments : \":highlight link %s\""
-#: ../syntax.c:6302
msgid "E414: group has settings, highlight link ignored"
msgstr "E414: le groupe a d้jเ des attributs, lien de surbrillance ignor้"
-#: ../syntax.c:6367
#, c-format
msgid "E415: unexpected equal sign: %s"
msgstr "E415: signe ้gal inattendu : %s"
-#: ../syntax.c:6395
#, c-format
msgid "E416: missing equal sign: %s"
msgstr "E416: '=' manquant : %s"
-#: ../syntax.c:6418
#, c-format
msgid "E417: missing argument: %s"
msgstr "E417: argument manquant : %s"
-#: ../syntax.c:6446
#, c-format
msgid "E418: Illegal value: %s"
msgstr "E418: Valeur invalide : %s"
-#: ../syntax.c:6496
msgid "E419: FG color unknown"
msgstr "E419: Couleur de premier plan inconnue"
-#: ../syntax.c:6504
msgid "E420: BG color unknown"
msgstr "E420: Couleur d'arri่re-plan inconnue"
-#: ../syntax.c:6564
#, c-format
msgid "E421: Color name or number not recognized: %s"
msgstr "E421: Nom ou num้ro de couleur non reconnu : %s"
-#: ../syntax.c:6714
#, c-format
msgid "E422: terminal code too long: %s"
msgstr "E422: le code de terminal est trop long : %s"
-#: ../syntax.c:6753
#, c-format
msgid "E423: Illegal argument: %s"
msgstr "E423: Argument invalide : %s"
-#: ../syntax.c:6925
msgid "E424: Too many different highlighting attributes in use"
msgstr ""
"E424: Trop d'attributs de surbrillance diff้rents en cours d'utilisation"
-#: ../syntax.c:7427
msgid "E669: Unprintable character in group name"
msgstr "E669: Caract่re non-imprimable dans un nom de groupe"
-#: ../syntax.c:7434
msgid "W18: Invalid character in group name"
msgstr "W18: Caract่re invalide dans un nom de groupe"
-#: ../syntax.c:7448
msgid "E849: Too many highlight and syntax groups"
msgstr "E849: Trop de groupes de surbrillance et de syntaxe"
-#: ../tag.c:104
msgid "E555: at bottom of tag stack"
msgstr "E555: En bas de la pile de marqueurs"
-#: ../tag.c:105
msgid "E556: at top of tag stack"
msgstr "E556: Au sommet de la pile de marqueurs"
-#: ../tag.c:380
msgid "E425: Cannot go before first matching tag"
msgstr "E425: Impossible d'aller avant le premier marqueur correspondant"
-#: ../tag.c:504
#, c-format
msgid "E426: tag not found: %s"
msgstr "E426: Marqueur introuvable : %s"
-#: ../tag.c:528
msgid " # pri kind tag"
msgstr " # pri type marqueur"
-#: ../tag.c:531
msgid "file\n"
msgstr "fichier\n"
-#: ../tag.c:829
msgid "E427: There is only one matching tag"
msgstr "E427: Il n'y a qu'un marqueur correspondant"
-#: ../tag.c:831
msgid "E428: Cannot go beyond last matching tag"
msgstr "E428: Impossible d'aller au-delเ du dernier marqueur correspondant"
-#: ../tag.c:850
#, c-format
msgid "File \"%s\" does not exist"
msgstr "Le fichier \"%s\" n'existe pas"
-#. Give an indication of the number of matching tags
-#: ../tag.c:859
#, c-format
msgid "tag %d of %d%s"
msgstr "marqueur %d sur %d%s"
-#: ../tag.c:862
msgid " or more"
msgstr " ou plus"
-#: ../tag.c:864
msgid " Using tag with different case!"
msgstr " Utilisation d'un marqueur avec une casse diff้rente !"
-#: ../tag.c:909
#, c-format
msgid "E429: File \"%s\" does not exist"
msgstr "E429: Le fichier \"%s\" n'existe pas"
-#. Highlight title
-#: ../tag.c:960
msgid ""
"\n"
" # TO tag FROM line in file/text"
@@ -6255,80 +5929,65 @@ msgstr ""
"\n"
" # VERS marqueur DE ligne dans le fichier/texte"
-#: ../tag.c:1303
#, c-format
msgid "Searching tags file %s"
msgstr "Examen du fichier de marqueurs %s"
-#: ../tag.c:1545
+#, c-format
+msgid "E430: Tag file path truncated for %s\n"
+msgstr "E430: Chemin de fichiers de marqueurs tronqu้ pour %s\n"
+
msgid "Ignoring long line in tags file"
msgstr "Ignore longue ligne dans le fichier de marqueurs"
-#: ../tag.c:1915
#, c-format
msgid "E431: Format error in tags file \"%s\""
msgstr "E431: Erreur de format dans le fichier de marqueurs \"%s\""
-#: ../tag.c:1917
#, c-format
-msgid "Before byte %<PRId64>"
-msgstr "Avant l'octet %<PRId64>"
+msgid "Before byte %ld"
+msgstr "Avant l'octet %ld"
-#: ../tag.c:1929
#, c-format
msgid "E432: Tags file not sorted: %s"
msgstr "E432: Le fichier de marqueurs %s n'est pas ordonn้"
-#. never opened any tags file
-#: ../tag.c:1960
msgid "E433: No tags file"
msgstr "E433: Aucun fichier de marqueurs"
-#: ../tag.c:2536
msgid "E434: Can't find tag pattern"
msgstr "E434: Le motif de marqueur est introuvable"
-#: ../tag.c:2544
msgid "E435: Couldn't find tag, just guessing!"
msgstr "E435: Marqueur introuvable, tentative pour deviner !"
-#: ../tag.c:2797
#, c-format
msgid "Duplicate field name: %s"
msgstr "Nom de champ dupliqu้ : %s"
-#: ../term.c:1442
msgid "' not known. Available builtin terminals are:"
msgstr "' inconnu. Les terminaux int้gr้s sont :"
-#: ../term.c:1463
msgid "defaulting to '"
msgstr "utilisation par d้faut de '"
-#: ../term.c:1731
msgid "E557: Cannot open termcap file"
msgstr "E557: Impossible d'ouvrir le fichier termcap"
-#: ../term.c:1735
msgid "E558: Terminal entry not found in terminfo"
msgstr "E558: La description du terminal est introuvable dans terminfo"
-#: ../term.c:1737
msgid "E559: Terminal entry not found in termcap"
msgstr "E559: La description du terminal est introuvable dans termcap"
-#: ../term.c:1878
#, c-format
msgid "E436: No \"%s\" entry in termcap"
msgstr "E436: Aucune entr้e \"%s\" dans termcap"
# DB - todo : Comment am้liorer ?
-#: ../term.c:2249
msgid "E437: terminal capability \"cm\" required"
msgstr "E437: capacit้ de terminal \"cm\" requise"
-#. Highlight title
-#: ../term.c:4376
msgid ""
"\n"
"--- Terminal keys ---"
@@ -6336,174 +5995,391 @@ msgstr ""
"\n"
"--- Touches du terminal ---"
-#: ../ui.c:481
+msgid "Cannot open $VIMRUNTIME/rgb.txt"
+msgstr "Impossible d'ouvrir $VIMRUNTIME/rgb.txt"
+
+#, c-format
+msgid "Kill job in \"%s\"?"
+msgstr "Terminer la tโche d'ex้cution dans \"%s\"?"
+
+msgid "Terminal"
+msgstr "Terminal"
+
+msgid "Terminal-finished"
+msgstr "Terminal-fini"
+
+msgid "active"
+msgstr "actif"
+
+msgid "running"
+msgstr "en cours"
+
+msgid "finished"
+msgstr "fini"
+
+#, c-format
+msgid "E953: File exists: %s"
+msgstr "E953: Le fichier existe d้jเ : %s"
+
+msgid "E955: Not a terminal buffer"
+msgstr "E955: Ce n'est pas un buffer de terminal"
+
+msgid "new shell started\n"
+msgstr "nouveau shell d้marr้\n"
+
msgid "Vim: Error reading input, exiting...\n"
msgstr "Vim : Erreur lors de la lecture de l'entr้e, sortie...\n"
-#. This happens when the FileChangedRO autocommand changes the
-#. * file in a way it becomes shorter.
-#: ../undo.c:379
-#, fuzzy
+# DB - Message de d้bogage.
+msgid "Used CUT_BUFFER0 instead of empty selection"
+msgstr "CUT_BUFFER0 utilis้ plut๔t qu'une s้lection vide"
+
msgid "E881: Line count changed unexpectedly"
-msgstr "E834: Le nombre de lignes a ้t้ chang้ inopin้ment"
+msgstr "E881: Le nombre de lignes a ้t้ chang้ inopin้ment"
+
+# DB - Question O/N.
+msgid "No undo possible; continue anyway"
+msgstr "Annulation impossible ; continuer"
-#: ../undo.c:627
#, c-format
msgid "E828: Cannot open undo file for writing: %s"
msgstr "E828: Impossible d'ouvrir le fichier d'annulations en ้criture : %s"
-#: ../undo.c:717
#, c-format
msgid "E825: Corrupted undo file (%s): %s"
msgstr "E825: Fichier d'annulations corrompu (%s) : %s"
-#: ../undo.c:1039
msgid "Cannot write undo file in any directory in 'undodir'"
msgstr ""
"Impossible d'้crire le fichier d'annulations dans n'importe quel r้pertoire "
"de 'undodir'"
-#: ../undo.c:1074
#, c-format
msgid "Will not overwrite with undo file, cannot read: %s"
msgstr "Le fichier d'annulations ne sera pas ้cras้, impossible de lire : %s"
-#: ../undo.c:1092
#, c-format
msgid "Will not overwrite, this is not an undo file: %s"
msgstr "Fichier ne sera pas ้cras้, ce n'est pas un fichier d'annulations : %s"
-#: ../undo.c:1108
msgid "Skipping undo file write, nothing to undo"
msgstr "Le fichier d'annulations n'est pas ้crit, rien เ annuler"
-#: ../undo.c:1121
#, c-format
msgid "Writing undo file: %s"
msgstr "ษcriture du fichier d'annulations : %s"
-#: ../undo.c:1213
#, c-format
msgid "E829: write error in undo file: %s"
msgstr "E829: Erreur d'้criture dans le fichier d'annulations : %s"
-#: ../undo.c:1280
#, c-format
msgid "Not reading undo file, owner differs: %s"
msgstr "Le fichier d'annulations n'est pas lu, propri้taire diff้rent : %s"
-#: ../undo.c:1292
#, c-format
msgid "Reading undo file: %s"
msgstr "Lecture du fichier d'annulations : %s..."
-#: ../undo.c:1299
#, c-format
msgid "E822: Cannot open undo file for reading: %s"
msgstr "E822: Impossible d'ouvrir le fichier d'annulations en lecture : %s"
-#: ../undo.c:1308
#, c-format
msgid "E823: Not an undo file: %s"
msgstr "E823: Ce n'est pas un fichier d'annulations : %s"
-#: ../undo.c:1313
+#, c-format
+msgid "E832: Non-encrypted file has encrypted undo file: %s"
+msgstr "E832: Fichier non-chiffr้ a un fichier d'annulations chiffr้ : %s"
+
+#, c-format
+msgid "E826: Undo file decryption failed: %s"
+msgstr "E826: D้chiffrage du fichier d'annulation a ้chou้ : %s"
+
+#, c-format
+msgid "E827: Undo file is encrypted: %s"
+msgstr "E827: Le fichier d'annulations est chiffr้ : %s"
+
#, c-format
msgid "E824: Incompatible undo file: %s"
msgstr "E824: Fichier d'annulations incompatible : %s"
-#: ../undo.c:1328
msgid "File contents changed, cannot use undo info"
msgstr ""
"Le contenu du fichier a chang้, impossible d'utiliser les informations "
"d'annulation"
-#: ../undo.c:1497
#, c-format
msgid "Finished reading undo file %s"
msgstr "Fin de lecture du fichier d'annulations %s"
-#: ../undo.c:1586 ../undo.c:1812
msgid "Already at oldest change"
msgstr "D้jเ เ la modification la plus ancienne"
-#: ../undo.c:1597 ../undo.c:1814
msgid "Already at newest change"
msgstr "D้jเ เ la modification la plus r้cente"
-#: ../undo.c:1806
#, c-format
-msgid "E830: Undo number %<PRId64> not found"
-msgstr "E830: Annulation nฐ %<PRId64> introuvable"
+msgid "E830: Undo number %ld not found"
+msgstr "E830: Annulation nฐ %ld introuvable"
-#: ../undo.c:1979
msgid "E438: u_undo: line numbers wrong"
msgstr "E438: u_undo : num้ros de ligne erron้s"
-#: ../undo.c:2183
msgid "more line"
msgstr "ligne en plus"
-#: ../undo.c:2185
msgid "more lines"
msgstr "lignes en plus"
-#: ../undo.c:2187
msgid "line less"
msgstr "ligne en moins"
-#: ../undo.c:2189
msgid "fewer lines"
msgstr "lignes en moins"
-#: ../undo.c:2193
msgid "change"
msgstr "modification"
-#: ../undo.c:2195
msgid "changes"
msgstr "modifications"
-#: ../undo.c:2225
#, c-format
-msgid "%<PRId64> %s; %s #%<PRId64> %s"
-msgstr "%<PRId64> %s ; %s #%<PRId64> ; %s"
+msgid "%ld %s; %s #%ld %s"
+msgstr "%ld %s ; %s #%ld ; %s"
-#: ../undo.c:2228
msgid "before"
msgstr "avant"
-#: ../undo.c:2228
msgid "after"
msgstr "apr่s"
-#: ../undo.c:2325
msgid "Nothing to undo"
msgstr "Rien เ annuler"
# DB - Les deux premi่res colonnes sont align้es เ droite.
-#: ../undo.c:2330
msgid "number changes when saved"
msgstr "num้ro modif. instant enregistr้"
-#: ../undo.c:2360
#, c-format
-msgid "%<PRId64> seconds ago"
-msgstr "il y a %<PRId64> secondes"
+msgid "%ld second ago"
+msgid_plural "%ld seconds ago"
+msgstr[0] "il y a %ld seconde"
+msgstr[1] "il y a %ld secondes"
-#: ../undo.c:2372
msgid "E790: undojoin is not allowed after undo"
msgstr "E790: undojoin n'est pas autoris้ apr่s une annulation"
-#: ../undo.c:2466
msgid "E439: undo list corrupt"
msgstr "E439: la liste d'annulation est corrompue"
-#: ../undo.c:2495
msgid "E440: undo line missing"
msgstr "E440: ligne d'annulation manquante"
-#: ../version.c:600
+#, c-format
+msgid "E122: Function %s already exists, add ! to replace it"
+msgstr "E122: La fonction %s existe d้jเ (ajoutez ! pour la remplacer)"
+
+msgid "E717: Dictionary entry already exists"
+msgstr "E717: Une entr้e du Dictionnaire porte d้jเ ce nom"
+
+msgid "E718: Funcref required"
+msgstr "E718: R้f้rence de fonction (Funcref) requise"
+
+#, c-format
+msgid "E130: Unknown function: %s"
+msgstr "E130: Fonction inconnue : %s"
+
+#, c-format
+msgid "E125: Illegal argument: %s"
+msgstr "E125: Argument invalide : %s"
+
+#, c-format
+msgid "E853: Duplicate argument name: %s"
+msgstr "E853: Nom d'argument dupliqu้ : %s"
+
+#, c-format
+msgid "E740: Too many arguments for function %s"
+msgstr "E740: Trop d'arguments pour la fonction %s"
+
+#, c-format
+msgid "E116: Invalid arguments for function %s"
+msgstr "E116: Arguments invalides pour la fonction %s"
+
+# AB - V้rifier dans la litt้rature technique s'il n'existe pas une meilleure
+# traduction pour "function call depth".
+msgid "E132: Function call depth is higher than 'maxfuncdepth'"
+msgstr ""
+"E132: La profondeur d'appel de fonction est sup้rieure เ 'maxfuncdepth'"
+
+# AB - Ce texte fait partie d'un message de d้bogage.
+#, c-format
+msgid "calling %s"
+msgstr "appel de %s"
+
+# AB - V้rifier.
+#, c-format
+msgid "%s aborted"
+msgstr "%s annul้e"
+
+# AB - Ce texte fait partie d'un message de d้bogage.
+#, c-format
+msgid "%s returning #%ld"
+msgstr "%s a retourn้ #%ld"
+
+# AB - Ce texte fait partie d'un message de d้bogage.
+#, c-format
+msgid "%s returning %s"
+msgstr "%s a retourn้ \"%s\""
+
+msgid "E699: Too many arguments"
+msgstr "E699: Trop d'arguments"
+
+#, c-format
+msgid "E117: Unknown function: %s"
+msgstr "E117: Fonction inconnue : %s"
+
+#, c-format
+msgid "E933: Function was deleted: %s"
+msgstr "E933: La fonction a ้t้ effac้e: %s"
+
+#, c-format
+msgid "E119: Not enough arguments for function: %s"
+msgstr "E119: La fonction %s n'a pas re็u assez d'arguments"
+
+#, c-format
+msgid "E120: Using <SID> not in a script context: %s"
+msgstr "E120: <SID> utilis้ en dehors d'un script : %s"
+
+#, c-format
+msgid "E725: Calling dict function without Dictionary: %s"
+msgstr "E725: Appel d'une fonction ซ dict ป sans Dictionnaire : %s"
+
+msgid "E129: Function name required"
+msgstr "E129: Nom de fonction requis"
+
+#, c-format
+msgid "E128: Function name must start with a capital or \"s:\": %s"
+msgstr ""
+"E128: Le nom de la fonction doit commencer par une majuscule ou \"s:\": %s"
+
+#, c-format
+msgid "E884: Function name cannot contain a colon: %s"
+msgstr ""
+"E884: Le nom de la fonction ne peut pas contenir le caract่re deux-points : "
+"%s"
+
+#, c-format
+msgid "E123: Undefined function: %s"
+msgstr "E123: Fonction non d้finie : %s"
+
+# AB - La version fran็aise est plus consistante que la version anglaise.
+# AB - Je suis partag้ entre la concision d'une traduction assez litt้rale et
+# la lourdeur d'une traduction plus correcte.
+#, c-format
+msgid "E124: Missing '(': %s"
+msgstr "E124: Il manque '(' apr่s %s"
+
+msgid "E862: Cannot use g: here"
+msgstr "E862: Impossible d'utiliser g: ici"
+
+#, c-format
+msgid "E932: Closure function should not be at top level: %s"
+msgstr ""
+"E932: une fonction fermeture ne devrait pas ๊tre au niveau principal : %s"
+
+msgid "E126: Missing :endfunction"
+msgstr "E126: Il manque :endfunction"
+
+#, c-format
+msgid "W22: Text found after :endfunction: %s"
+msgstr "W22: Texte trouv้ apr่s :endfunction: %s"
+
+#, c-format
+msgid "E707: Function name conflicts with variable: %s"
+msgstr "E707: Le nom de fonction entre en conflit avec la variable : %s"
+
+#, c-format
+msgid "E127: Cannot redefine function %s: It is in use"
+msgstr "E127: Impossible de red้finir fonction %s : d้jเ utilis้e"
+
+# DB - Le contenu du "c-format" est le nom de la fonction.
+#, c-format
+msgid "E746: Function name does not match script file name: %s"
+msgstr "E746: Le nom de la fonction %s ne correspond pas le nom du script"
+
+# AB - Il est difficile de cr้er une version fran็aise qui fasse moins de 80
+# caract่res de long, nom de la fonction compris : "It is in use" est une
+# expression tr่s dense. Traductions possibles : "elle est utilis้e",
+# "elle s'ex้cute" ou "elle est occup้e".
+#, c-format
+msgid "E131: Cannot delete function %s: It is in use"
+msgstr "E131: Impossible d'effacer %s : cette fonction est utilis้e"
+
+msgid "E133: :return not inside a function"
+msgstr "E133: :return en dehors d'une fonction"
+
+#, c-format
+msgid "E107: Missing parentheses: %s"
+msgstr "E107: Parenth่ses manquantes : %s"
+
+#, c-format
+msgid "%s (%s, compiled %s)"
+msgstr "%s (%s, compil้ %s)"
+
+msgid ""
+"\n"
+"MS-Windows 64-bit GUI version"
+msgstr ""
+"\n"
+"Version graphique MS-Windows 64 bits"
+
+msgid ""
+"\n"
+"MS-Windows 32-bit GUI version"
+msgstr ""
+"\n"
+"Version graphique MS-Windows 32 bits"
+
+msgid " with OLE support"
+msgstr " supportant l'OLE"
+
+msgid ""
+"\n"
+"MS-Windows 64-bit console version"
+msgstr ""
+"\n"
+"Version console MS-Windows 64 bits"
+
+msgid ""
+"\n"
+"MS-Windows 32-bit console version"
+msgstr ""
+"\n"
+"Version console MS-Windows 32 bits"
+
+msgid ""
+"\n"
+"macOS version"
+msgstr ""
+"\n"
+"Version macOS"
+
+msgid ""
+"\n"
+"macOS version w/o darwin feat."
+msgstr ""
+"\n"
+"Version macOS sans fonctionalit้s darwin"
+
+msgid ""
+"\n"
+"OpenVMS version"
+msgstr ""
+"\n"
+"Version OpenVMS"
+
msgid ""
"\n"
"Included patches: "
@@ -6511,7 +6387,6 @@ msgstr ""
"\n"
"Rustines incluses : "
-#: ../version.c:627
msgid ""
"\n"
"Extra patches: "
@@ -6519,11 +6394,9 @@ msgstr ""
"\n"
"Rustines extra : "
-#: ../version.c:639 ../version.c:864
msgid "Modified by "
msgstr "Modifi้ par "
-#: ../version.c:646
msgid ""
"\n"
"Compiled "
@@ -6531,11 +6404,9 @@ msgstr ""
"\n"
"Compil้ "
-#: ../version.c:649
msgid "by "
msgstr "par "
-#: ../version.c:660
msgid ""
"\n"
"Huge version "
@@ -6543,1866 +6414,992 @@ msgstr ""
"\n"
"ษnorme version "
-#: ../version.c:661
+msgid ""
+"\n"
+"Big version "
+msgstr ""
+"\n"
+"Grosse version "
+
+msgid ""
+"\n"
+"Normal version "
+msgstr ""
+"\n"
+"Version normale "
+
+msgid ""
+"\n"
+"Small version "
+msgstr ""
+"\n"
+"Petite version "
+
+msgid ""
+"\n"
+"Tiny version "
+msgstr ""
+"\n"
+"Version minuscule "
+
msgid "without GUI."
msgstr "sans interface graphique."
-#: ../version.c:662
+msgid "with GTK3 GUI."
+msgstr "avec interface graphique GTK3."
+
+msgid "with GTK2-GNOME GUI."
+msgstr "avec interface graphique GTK2-GNOME."
+
+msgid "with GTK2 GUI."
+msgstr "avec interface graphique GTK2."
+
+msgid "with X11-Motif GUI."
+msgstr "avec interface graphique X11-Motif."
+
+msgid "with X11-neXtaw GUI."
+msgstr "avec interface graphique X11-neXtaw."
+
+msgid "with X11-Athena GUI."
+msgstr "avec interface graphique X11-Athena."
+
+msgid "with Photon GUI."
+msgstr "avec interface graphique Photon."
+
+msgid "with GUI."
+msgstr "avec une interface graphique."
+
+msgid "with Carbon GUI."
+msgstr "avec interface graphique Carbon."
+
+msgid "with Cocoa GUI."
+msgstr "avec interface graphique Cocoa."
+
msgid " Features included (+) or not (-):\n"
msgstr " Fonctionnalit้s incluses (+) ou non (-) :\n"
-#: ../version.c:667
msgid " system vimrc file: \""
msgstr " fichier vimrc syst่me : \""
-#: ../version.c:672
msgid " user vimrc file: \""
msgstr " fichier vimrc utilisateur : \""
-#: ../version.c:677
msgid " 2nd user vimrc file: \""
msgstr " 2me fichier vimrc utilisateur : \""
-#: ../version.c:682
msgid " 3rd user vimrc file: \""
msgstr " 3me fichier vimrc utilisateur : \""
-#: ../version.c:687
msgid " user exrc file: \""
msgstr " fichier exrc utilisateur : \""
-#: ../version.c:692
msgid " 2nd user exrc file: \""
msgstr " 2me fichier exrc utilisateur : \""
-#: ../version.c:699
+msgid " system gvimrc file: \""
+msgstr " fichier gvimrc syst่me : \""
+
+msgid " user gvimrc file: \""
+msgstr " fichier gvimrc utilisateur : \""
+
+msgid "2nd user gvimrc file: \""
+msgstr "2me fichier gvimrc utilisateur : \""
+
+msgid "3rd user gvimrc file: \""
+msgstr "3me fichier gvimrc utilisateur : \""
+
+msgid " defaults file: \""
+msgstr " fichier de valeurs par d้faut : \""
+
+msgid " system menu file: \""
+msgstr " fichier menu syst่me : \""
+
msgid " fall-back for $VIM: \""
msgstr " $VIM par d้faut : \""
-#: ../version.c:705
msgid " f-b for $VIMRUNTIME: \""
msgstr " $VIMRUNTIME par d้faut : \""
-#: ../version.c:709
msgid "Compilation: "
msgstr "Compilation : "
-#: ../version.c:712
+msgid "Compiler: "
+msgstr "Compilateur : "
+
msgid "Linking: "
msgstr "ษdition de liens : "
-#: ../version.c:717
msgid " DEBUG BUILD"
msgstr " VERSION DE DษBOGAGE"
-#: ../version.c:767
msgid "VIM - Vi IMproved"
msgstr "VIM - Vi Am้lior้"
-#: ../version.c:769
msgid "version "
msgstr "version "
-#: ../version.c:770
msgid "by Bram Moolenaar et al."
msgstr "par Bram Moolenaar et al."
-#: ../version.c:774
msgid "Vim is open source and freely distributable"
msgstr "Vim est un logiciel libre"
-#: ../version.c:776
msgid "Help poor children in Uganda!"
msgstr "Aidez les enfants pauvres d'Ouganda !"
-#: ../version.c:777
msgid "type :help iccf<Enter> for information "
msgstr "tapez :help iccf<Entr้e> pour plus d'informations "
-#: ../version.c:779
msgid "type :q<Enter> to exit "
msgstr "tapez :q<Entr้e> pour sortir du programme "
-#: ../version.c:780
msgid "type :help<Enter> or <F1> for on-line help"
msgstr "tapez :help<Entr้e> ou <F1> pour acc้der เ l'aide en ligne "
-#: ../version.c:781
-msgid "type :help version7<Enter> for version info"
-msgstr "tapez :help version7<Entr้e> pour lire les notes de mise เ jour"
+msgid "type :help version8<Enter> for version info"
+msgstr "tapez :help version8<Entr้e> pour lire les notes de mise เ jour"
# DB - Pour les trois messages qui suivent :
# :set cp
# :intro
-#: ../version.c:784
msgid "Running in Vi compatible mode"
msgstr "Compatibilit้ avec Vi activ้e"
-#: ../version.c:785
msgid "type :set nocp<Enter> for Vim defaults"
msgstr "tapez :set nocp<Entr้e> pour la d้sactiver"
-#: ../version.c:786
msgid "type :help cp-default<Enter> for info on this"
msgstr "tapez :help cp-default<Entr้e> pour plus d'info"
-#: ../version.c:827
+msgid "menu Help->Orphans for information "
+msgstr "menu Aide->Orphelins pour plus d'info"
+
+msgid "Running modeless, typed text is inserted"
+msgstr "Les modes sont d้sactiv้s, le texte saisi est ins้r้"
+
+msgid "menu Edit->Global Settings->Toggle Insert Mode "
+msgstr "menu ษdition->R้glages Globaux->Insertion Permanente"
+
+# DB - todo
+msgid " for two modes "
+msgstr " pour les modes "
+
+# DB - todo
+msgid "menu Edit->Global Settings->Toggle Vi Compatible"
+msgstr "menu ษdition->R้glages Globaux->Compatibilit้ Vi"
+
+# DB - todo
+msgid " for Vim defaults "
+msgstr " pour d้f. de Vim "
+
msgid "Sponsor Vim development!"
msgstr "Sponsorisez le d้veloppement de Vim !"
-#: ../version.c:828
msgid "Become a registered Vim user!"
msgstr "Devenez un utilisateur de Vim enregistr้ !"
-#: ../version.c:831
msgid "type :help sponsor<Enter> for information "
msgstr "tapez :help sponsor<Entr้e> pour plus d'informations "
-#: ../version.c:832
msgid "type :help register<Enter> for information "
msgstr "tapez :help register<Entr้e> pour plus d'informations "
-#: ../version.c:834
msgid "menu Help->Sponsor/Register for information "
msgstr "menu Aide->Sponsor/Enregistrement pour plus d'info"
-#: ../window.c:119
msgid "Already only one window"
msgstr "Il n'y a d้jเ plus qu'une fen๊tre"
-#: ../window.c:224
msgid "E441: There is no preview window"
msgstr "E441: Il n'y a pas de fen๊tre de pr้visualisation"
-#: ../window.c:559
msgid "E442: Can't split topleft and botright at the same time"
msgstr "E442: Impossible de partager topleft et botright en m๊me temps"
-#: ../window.c:1228
msgid "E443: Cannot rotate when another window is split"
msgstr "E443: Rotation impossible quand une autre fen๊tre est partag้e"
-#: ../window.c:1803
msgid "E444: Cannot close last window"
msgstr "E444: Impossible de fermer la derni่re fen๊tre"
-#: ../window.c:1810
msgid "E813: Cannot close autocmd window"
msgstr "E813: Impossible de fermer la fen๊tre des autocommandes"
-#: ../window.c:1814
msgid "E814: Cannot close window, only autocmd window would remain"
msgstr ""
"E814: Impossible de fermer la fen๊tre, seule la fen๊tre des autocommandes "
"resterait"
-#: ../window.c:2717
msgid "E445: Other window contains changes"
msgstr "E445: Les modifications de l'autre fen๊tre n'ont pas ้t้ enregistr้es"
-#: ../window.c:4805
msgid "E446: No file name under cursor"
msgstr "E446: Aucun nom de fichier sous le curseur"
-#~ msgid "E831: bf_key_init() called with empty password"
-#~ msgstr "E831: bf_key_init() appel้e avec un mot de passe vide"
-
-#~ msgid "E820: sizeof(uint32_t) != 4"
-#~ msgstr "E820: sizeof(uint32_t) != 4"
-
-#~ msgid "E817: Blowfish big/little endian use wrong"
-#~ msgstr "E817: petit/gros boutisme incorrect dans blowfish"
-
-#~ msgid "E818: sha256 test failed"
-#~ msgstr "E818: le test de sha256 a ้chou้"
-
-#~ msgid "E819: Blowfish test failed"
-#~ msgstr "E819: le test de blowfish a ้chou้"
-
-#~ msgid "Patch file"
-#~ msgstr "Fichier rustine"
-
-# AB - Textes des boutons de la bo๎te de dialogue affich้e par inputdialog().
-#~ msgid ""
-#~ "&OK\n"
-#~ "&Cancel"
-#~ msgstr ""
-#~ "&Ok\n"
-#~ "&Annuler"
-
-# AB - ภ mon avis, la version anglaise est erron้e.
-# DB : V้rifier
-#~ msgid "E240: No connection to Vim server"
-#~ msgstr "E240: Pas de connexion au serveur X"
-
-# AB - La version fran็aise est meilleure que la version anglaise.
-#~ msgid "E241: Unable to send to %s"
-#~ msgstr "E241: L'envoi au serveur %s เ ้chou้"
-
-#~ msgid "E277: Unable to read a server reply"
-#~ msgstr "E277: Impossible de lire la r้ponse du serveur"
-
-# AB - La version fran็aise est meilleure que la version anglaise.
-#~ msgid "E258: Unable to send to client"
-#~ msgstr "E258: La r้ponse n'a pas pu ๊tre envoy้e au client"
-
-# AB - Ceci est un titre de bo๎te de dialogue. V้rifier que la version
-# fran็aise est correcte pour les trois r้f้rences ; j'ai un doute quant
-# เ la troisi่me.
-#~ msgid "Save As"
-#~ msgstr "Enregistrer sous - Vim"
-
-# AB - Ceci est un titre de bo๎te de dialogue.
-#~ msgid "Edit File"
-#~ msgstr "Ouvrir un fichier - Vim"
-
-#~ msgid " (NOT FOUND)"
-#~ msgstr " (INTROUVABLE)"
-
-#~ msgid "Source Vim script"
-#~ msgstr "Sourcer un script - Vim"
-
-#~ msgid "unknown"
-#~ msgstr "inconnu"
-
-#~ msgid "Edit File in new window"
-#~ msgstr "Ouvrir un fichier dans une nouvelle fen๊tre - Vim"
-
-#~ msgid "Append File"
-#~ msgstr "Ajouter fichier"
-
-#~ msgid "Window position: X %d, Y %d"
-#~ msgstr "Position de la fen๊tre : X %d, Y %d"
-
-#~ msgid "Save Redirection"
-#~ msgstr "Enregistrer la redirection"
-
-#~ msgid "Save View"
-#~ msgstr "Enregistrer la vue - Vim"
-
-#~ msgid "Save Session"
-#~ msgstr "Enregistrer la session - Vim"
-
-#~ msgid "Save Setup"
-#~ msgstr "Enregistrer les r้glages - Vim"
-
-#~ msgid "E809: #< is not available without the +eval feature"
-#~ msgstr "E809: #< n'est pas disponible sans la fonctionnalit้ +eval"
-
-#~ msgid "E196: No digraphs in this version"
-#~ msgstr "E196: Pas de digraphes dans cette version"
-
-#~ msgid "is a device (disabled with 'opendevice' option)"
-#~ msgstr "est un p้riph้rique (d้sactiv้ par l'option 'opendevice')"
-
-#~ msgid "Reading from stdin..."
-#~ msgstr "Lecture de stdin..."
-
-#~ msgid "[crypted]"
-#~ msgstr "[chiffr้]"
-
-#~ msgid "E821: File is encrypted with unknown method"
-#~ msgstr "E821: Le fichier est chiffr้ avec une m้thode inconnue"
-
-#~ msgid "NetBeans disallows writes of unmodified buffers"
-#~ msgstr "NetBeans interdit l'้criture des tampons non modifi้s"
-
-#~ msgid "Partial writes disallowed for NetBeans buffers"
-#~ msgstr "Netbeans interdit l'้criture partielle de ses tampons"
-
-#~ msgid "writing to device disabled with 'opendevice' option"
-#~ msgstr "้criture vers un p้riph้rique d้sactiv้ par l'option 'opendevice'"
-
-#~ msgid "E460: The resource fork would be lost (add ! to override)"
-#~ msgstr ""
-#~ "E460: Les ressources partag้es seraient perdues (ajoutez ! pour passer "
-#~ "outre)"
-
-#~ msgid "E851: Failed to create a new process for the GUI"
-#~ msgstr ""
-#~ "E851: ษchec lors de la cr้ation d'un nouveau processus pour l'interface "
-#~ "graphique"
-
-#~ msgid "E852: The child process failed to start the GUI"
-#~ msgstr ""
-#~ "E852: Le processus fils n'a pas r้ussi เ d้marrer l'interface graphique"
-
-#~ msgid "E229: Cannot start the GUI"
-#~ msgstr "E229: Impossible de d้marrer l'interface graphique"
-
-#~ msgid "E230: Cannot read from \"%s\""
-#~ msgstr "E230: Impossible de lire \"%s\""
-
-#~ msgid "E665: Cannot start GUI, no valid font found"
-#~ msgstr ""
-#~ "E665: Impossible de d้marrer l'IHM graphique, aucune police valide trouv้e"
-
-#~ msgid "E231: 'guifontwide' invalid"
-#~ msgstr "E231: 'guifontwide' est invalide"
-
-#~ msgid "E599: Value of 'imactivatekey' is invalid"
-#~ msgstr "E599: Valeur de 'imactivatekey' invalide"
-
-#~ msgid "E254: Cannot allocate color %s"
-#~ msgstr "E254: Impossible d'allouer la couleur %s"
-
-#~ msgid "No match at cursor, finding next"
-#~ msgstr "Aucune correspondance sous le curseur, recherche de la suivante"
-
-#~ msgid "<cannot open> "
-#~ msgstr "<impossible d'ouvrir> "
-
-#~ msgid "E616: vim_SelFile: can't get font %s"
-#~ msgstr "E616: vim_SelFile : impossible d'obtenir la police %s"
-
-#~ msgid "E614: vim_SelFile: can't return to current directory"
-#~ msgstr ""
-#~ "E614: vim_SelFile : impossible de revenir dans le r้pertoire courant"
-
-#~ msgid "Pathname:"
-#~ msgstr "Chemin :"
-
-#~ msgid "E615: vim_SelFile: can't get current directory"
-#~ msgstr "E615: vim_SelFile : impossible d'obtenir le r้pertoire courant"
-
-#~ msgid "OK"
-#~ msgstr "Ok"
-
-#~ msgid "Cancel"
-#~ msgstr "Annuler"
-
-#~ msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
-#~ msgstr ""
-#~ "Widget scrollbar : Impossible d'obtenir la g้om้trie du pixmap 'thumb'"
-
-#~ msgid "Vim dialog"
-#~ msgstr "Vim"
-
-#~ msgid "E232: Cannot create BalloonEval with both message and callback"
-#~ msgstr "E232: Impossible de cr้er un BalloonEval avec message ET callback"
-
-# todo '_' is for hotkey, i guess?
-#~ msgid "Input _Methods"
-#~ msgstr "_M้thodes de saisie"
-
-#~ msgid "VIM - Search and Replace..."
-#~ msgstr "Remplacer - Vim"
-
-#~ msgid "VIM - Search..."
-#~ msgstr "Rechercher - Vim"
-
-#~ msgid "Find what:"
-#~ msgstr "Rechercher :"
-
-#~ msgid "Replace with:"
-#~ msgstr "Remplacer par :"
-
-#~ msgid "Match whole word only"
-#~ msgstr "Mots entiers seulement"
-
-#~ msgid "Match case"
-#~ msgstr "Respecter la casse"
-
-#~ msgid "Direction"
-#~ msgstr "Direction"
-
-#~ msgid "Up"
-#~ msgstr "Haut"
-
-#~ msgid "Down"
-#~ msgstr "Bas"
-
-#~ msgid "Find Next"
-#~ msgstr "Suivant"
-
-#~ msgid "Replace"
-#~ msgstr "Remplacer"
-
-#~ msgid "Replace All"
-#~ msgstr "Remplacer tout"
-
-#~ msgid "Vim: Received \"die\" request from session manager\n"
-#~ msgstr ""
-#~ "Vim : Une requ๊te \"die\" a ้t้ re็ue par le gestionnaire de session\n"
-
-#~ msgid "Close tab"
-#~ msgstr "Fermer l'onglet"
-
-#~ msgid "New tab"
-#~ msgstr "Nouvel onglet"
-
-# DB - todo : un peu long. Cet entr้e de menu permet d'ouvrir un fichier
-# dans un nouvel onglet via le s้lecteur de fichiers graphique.
-#~ msgid "Open Tab..."
-#~ msgstr "Ouvrir dans un onglet..."
-
-#~ msgid "Vim: Main window unexpectedly destroyed\n"
-#~ msgstr "Vim : Fen๊tre principale d้truite inopin้ment\n"
-
-#~ msgid "&Filter"
-#~ msgstr "&Filtrer"
-
-#~ msgid "&Cancel"
-#~ msgstr "&Annuler"
-
-#~ msgid "Directories"
-#~ msgstr "R้pertoires"
-
-#~ msgid "Filter"
-#~ msgstr "Filtre"
-
-#~ msgid "&Help"
-#~ msgstr "&Aide"
-
-#~ msgid "Files"
-#~ msgstr "Fichiers"
-
-#~ msgid "&OK"
-#~ msgstr "&Ok"
-
-#~ msgid "Selection"
-#~ msgstr "S้lection"
-
-#~ msgid "Find &Next"
-#~ msgstr "Suiva&nt"
-
-#~ msgid "&Replace"
-#~ msgstr "&Remplacer"
-
-#~ msgid "Replace &All"
-#~ msgstr "Rempl&acer tout"
-
-#~ msgid "&Undo"
-#~ msgstr "Ann&uler"
-
-#~ msgid "E671: Cannot find window title \"%s\""
-#~ msgstr "E671: Titre de fen๊tre \"%s\" introuvable"
-
-#~ msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
-#~ msgstr "E243: Argument non support้ : \"-%s\" ; Utilisez la version OLE."
-
-#~ msgid "E672: Unable to open window inside MDI application"
-#~ msgstr "E672: Impossible d'ouvrir une fen๊tre dans une application MDI"
-
-#~ msgid "Open tab..."
-#~ msgstr "Ouvrir dans un onglet..."
-
-#~ msgid "Find string (use '\\\\' to find a '\\')"
-#~ msgstr "Chercher une cha๎ne (utilisez '\\\\' pour chercher un '\\')"
-
-#~ msgid "Find & Replace (use '\\\\' to find a '\\')"
-#~ msgstr "Chercher et remplacer (utilisez '\\\\' pour trouver un '\\')"
-
-# DB - Traduction non indispensable puisque le code indique qu'il s'agit d'un
-# param้trage bidon afin de s้lectionner un r้pertoire plut๔t qu'un
-# fichier.
-#~ msgid "Not Used"
-#~ msgstr "Non utilis้"
-
-# DB - Traduction non indispensable puisque le code indique qu'il s'agit d'un
-# param้trage bidon afin de s้lectionner un r้pertoire plut๔t qu'un
-# fichier.
-#~ msgid "Directory\t*.nothing\n"
-#~ msgstr "R้pertoire\t*.rien\n"
-
-# DB - todo : perfectible.
-#~ msgid ""
-#~ "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
-#~ msgstr ""
-#~ "Vim E458: Erreur d'allocation de couleurs, couleurs possiblement "
-#~ "incorrectes"
-
-# DB - todo : La VF est-elle compr้hensible ?
-#~ msgid "E250: Fonts for the following charsets are missing in fontset %s:"
-#~ msgstr ""
-#~ "E250: Des polices manquent dans %s pour les jeux de caract่res suivants :"
-
-#~ msgid "E252: Fontset name: %s"
-#~ msgstr "E252: Nom du jeu de polices : %s"
-
-#~ msgid "Font '%s' is not fixed-width"
-#~ msgstr "La police '%s' n'a pas une largeur fixe"
-
-#~ msgid "E253: Fontset name: %s\n"
-#~ msgstr "E253: Nom du jeu de polices : %s\n"
-
-#~ msgid "Font0: %s\n"
-#~ msgstr "Font0: %s\n"
-
-#~ msgid "Font1: %s\n"
-#~ msgstr "Font1: %s\n"
-
-#~ msgid "Font%<PRId64> width is not twice that of font0\n"
-#~ msgstr "La largeur de Font%<PRId64> n'est pas le double de celle de Font0\n"
-
-#~ msgid "Font0 width: %<PRId64>\n"
-#~ msgstr "Largeur de Font0 : %<PRId64>\n"
-
-#~ msgid ""
-#~ "Font1 width: %<PRId64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "Largeur de Font1 : %<PRId64>\n"
-#~ "\n"
-
-# DB - todo : Pas certain de mon coup, ici...
-#~ msgid "Invalid font specification"
-#~ msgstr "La sp้cification de la police est invalide"
-
-#~ msgid "&Dismiss"
-#~ msgstr "Aban&donner"
-
-# DB - todo : Pas certain de mon coup, ici...
-#~ msgid "no specific match"
-#~ msgstr "aucune correspondance particuli่re"
-
-#~ msgid "Vim - Font Selector"
-#~ msgstr "Choisir une police - Vim"
-
-#~ msgid "Name:"
-#~ msgstr "Nom :"
-
-#~ msgid "Show size in Points"
-#~ msgstr "Afficher la taille en Points"
-
-#~ msgid "Encoding:"
-#~ msgstr "Encodage :"
-
-#~ msgid "Font:"
-#~ msgstr "Police :"
-
-#~ msgid "Style:"
-#~ msgstr "Style :"
-
-#~ msgid "Size:"
-#~ msgstr "Taille :"
-
-#~ msgid "E256: Hangul automata ERROR"
-#~ msgstr "E256: ERREUR dans l'automate Hangul"
-
-#~ msgid "E563: stat error"
-#~ msgstr "E563: Erreur stat"
-
-#~ msgid "E625: cannot open cscope database: %s"
-#~ msgstr "E625: impossible d'ouvrir la base de donn้es cscope %s"
-
-#~ msgid "E626: cannot get cscope database information"
-#~ msgstr ""
-#~ "E626: impossible d'obtenir des informations sur la base de donn้es cscope"
-
-#~ msgid "Lua library cannot be loaded."
-#~ msgstr "La biblioth่que Lua n'a pas pu ๊tre charg้e."
-
-#~ msgid "cannot save undo information"
-#~ msgstr "impossible d'enregistrer les informations d'annulation"
-
-#~ msgid ""
-#~ "E815: Sorry, this command is disabled, the MzScheme libraries could not "
-#~ "be loaded."
-#~ msgstr ""
-#~ "E815: D้sol้, cette commande est d้sactiv้e : les biblioth่ques MzScheme "
-#~ "n'ont pas pu ๊tre charg้es."
-
-#~ msgid "invalid expression"
-#~ msgstr "expression invalide"
-
-#~ msgid "expressions disabled at compile time"
-#~ msgstr "expressions d้sactiv้e lors de la compilation"
-
-#~ msgid "hidden option"
-#~ msgstr "option cach้e"
-
-#~ msgid "unknown option"
-#~ msgstr "option inconnue"
-
-#~ msgid "window index is out of range"
-#~ msgstr "num้ro de fen๊tre hors limites"
-
-#~ msgid "couldn't open buffer"
-#~ msgstr "impossible d'ouvrir le tampon"
-
-#~ msgid "cannot delete line"
-#~ msgstr "impossible d'effacer la ligne"
-
-#~ msgid "cannot replace line"
-#~ msgstr "impossible de remplacer la ligne"
-
-#~ msgid "cannot insert line"
-#~ msgstr "impossible d'ins้rer la ligne"
-
-#~ msgid "string cannot contain newlines"
-#~ msgstr "une cha๎ne ne peut pas contenir de saut-de-ligne"
-
-#~ msgid "error converting Scheme values to Vim"
-#~ msgstr "erreur lors de la conversion d'une valeur de Scheme เ Vim"
-
-#~ msgid "Vim error: ~a"
-#~ msgstr "Erreur Vim : ~a"
-
-#~ msgid "Vim error"
-#~ msgstr "Erreur Vim"
-
-#~ msgid "buffer is invalid"
-#~ msgstr "tampon invalide"
-
-#~ msgid "window is invalid"
-#~ msgstr "fen๊tre invalide"
-
-#~ msgid "linenr out of range"
-#~ msgstr "num้ro de ligne hors limites"
-
-#~ msgid "not allowed in the Vim sandbox"
-#~ msgstr "non autoris้ dans le bac เ sable"
-
-#~ msgid "E836: This Vim cannot execute :python after using :py3"
-#~ msgstr "E836: Vim ne peut pas ex้cuter :python apr่s avoir utilis้ :py3"
-
-#~ msgid ""
-#~ "E263: Sorry, this command is disabled, the Python library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E263: D้sol้, commande d้sactiv้e : la biblioth่que Python n'a pas pu "
-#~ "๊tre charg้e."
-
-#~ msgid "E659: Cannot invoke Python recursively"
-#~ msgstr "E659: Impossible d'invoquer Python r้cursivement"
-
-#~ msgid "E837: This Vim cannot execute :py3 after using :python"
-#~ msgstr "E837: Vim ne peut pas ex้cuter :py3 apr่s avoir utilis้ :python"
-
-#~ msgid "index must be int or slice"
-#~ msgstr "index doit ๊tre int ou slice"
-
-#~ msgid "E265: $_ must be an instance of String"
-#~ msgstr "E265: $_ doit ๊tre une instance de cha๎ne (String)"
-
-#~ msgid ""
-#~ "E266: Sorry, this command is disabled, the Ruby library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E266: D้sol้, commande d้sactiv้e : la biblioth่que Ruby n'a pas pu ๊tre "
-#~ "charg้e."
-
-#~ msgid "E267: unexpected return"
-#~ msgstr "E267: ซ return ป inattendu"
-
-#~ msgid "E268: unexpected next"
-#~ msgstr "E268: ซ next ป inattendu"
-
-#~ msgid "E269: unexpected break"
-#~ msgstr "E269: ซ break ป inattendu"
-
-#~ msgid "E270: unexpected redo"
-#~ msgstr "E270: ซ redo ป inattendu"
-
-#~ msgid "E271: retry outside of rescue clause"
-#~ msgstr "E271: ซ retry ป hors d'une clause ซ rescue ป"
-
-#~ msgid "E272: unhandled exception"
-#~ msgstr "E272: Exception non prise en charge"
-
-# DB - todo
-#~ msgid "E273: unknown longjmp status %d"
-#~ msgstr "E273: contexte de longjmp inconnu : %d"
-
-#~ msgid "Toggle implementation/definition"
-#~ msgstr "Basculer impl้mentation/d้finition"
-
-#~ msgid "Show base class of"
-#~ msgstr "Montrer la classe de base de"
-
-#~ msgid "Show overridden member function"
-#~ msgstr "Montrer les fonctions membres surcharg้es"
-
-#~ msgid "Retrieve from file"
-#~ msgstr "R้cup้rer du fichier"
-
-#~ msgid "Retrieve from project"
-#~ msgstr "R้cup้rer du projet"
-
-#~ msgid "Retrieve from all projects"
-#~ msgstr "R้cup้rer de tous les projets"
-
-#~ msgid "Retrieve"
-#~ msgstr "R้cup้rer"
-
-#~ msgid "Show source of"
-#~ msgstr "Montrer source de"
-
-#~ msgid "Find symbol"
-#~ msgstr "Trouver symbole"
-
-#~ msgid "Browse class"
-#~ msgstr "Parcourir classe"
-
-#~ msgid "Show class in hierarchy"
-#~ msgstr "Montrer classe dans hi้rarchie"
-
-#~ msgid "Show class in restricted hierarchy"
-#~ msgstr "Montrer classe dans hi้rarchie restreinte"
-
-# todo
-#~ msgid "Xref refers to"
-#~ msgstr "Xref r้f้rence"
-
-#~ msgid "Xref referred by"
-#~ msgstr "Xref est r้f้renc้ par"
-
-#~ msgid "Xref has a"
-#~ msgstr "Xref a un(e)"
-
-#~ msgid "Xref used by"
-#~ msgstr "Xref utilis้e par"
-
-#~ msgid "Show docu of"
-#~ msgstr "Montrer doc de"
-
-#~ msgid "Generate docu for"
-#~ msgstr "G้n้rer la doc de"
-
-#~ msgid ""
-#~ "Cannot connect to SNiFF+. Check environment (sniffemacs must be found in "
-#~ "$PATH).\n"
-#~ msgstr ""
-#~ "Connexion เ SNiFF+ impossible. V้rifiez l'environnement (sniffemacs doit "
-#~ "๊tre dans le $PATH).\n"
-
-#~ msgid "E274: Sniff: Error during read. Disconnected"
-#~ msgstr "E274: Sniff : Erreur de lecture. D้connexion"
-
-# DB - Les trois messages suivants vont ensembles.
-#~ msgid "SNiFF+ is currently "
-#~ msgstr "SNiFF+ est actuellement "
-
-#~ msgid "not "
-#~ msgstr "d้"
-
-#~ msgid "connected"
-#~ msgstr "connect้"
-
-#~ msgid "E275: Unknown SNiFF+ request: %s"
-#~ msgstr "E275: Requ๊te SNiFF+ inconnue : %s"
-
-#~ msgid "E276: Error connecting to SNiFF+"
-#~ msgstr "E276: Erreur lors de la connexion เ SNiFF+"
-
-#~ msgid "E278: SNiFF+ not connected"
-#~ msgstr "E278: SNiFF+ n'est pas connect้"
-
-#~ msgid "E279: Not a SNiFF+ buffer"
-#~ msgstr "E279: Ce tampon n'est pas un tampon SNiFF+"
-
-#~ msgid "Sniff: Error during write. Disconnected"
-#~ msgstr "Sniff : Erreur lors d'une ้criture. D้connexion"
-
-#~ msgid "invalid buffer number"
-#~ msgstr "num้ro de tampon invalide"
-
-#~ msgid "not implemented yet"
-#~ msgstr "pas encore impl้ment้"
+#, c-format
+msgid "E447: Can't find file \"%s\" in path"
+msgstr "E447: Le fichier \"%s\" est introuvable dans 'path'"
-# DB - TODO : le contexte est celui d'une annulation.
-#~ msgid "cannot set line(s)"
-#~ msgstr "Impossible de remettre la/les ligne(s)"
+#, c-format
+msgid "E799: Invalid ID: %ld (must be greater than or equal to 1)"
+msgstr "E799: ID invalide : %ld (doit ๊tre plus grand ou ้gal เ 1)"
-#~ msgid "invalid mark name"
-#~ msgstr "nom de marque invalide"
+#, c-format
+msgid "E801: ID already taken: %ld"
+msgstr "E801: ID d้jเ pris: %ld"
-#~ msgid "mark not set"
-#~ msgstr "marque non positionn้e"
+msgid "List or number required"
+msgstr "Liste ou nombre requis"
-#~ msgid "row %d column %d"
-#~ msgstr "ligne %d colonne %d"
+#, c-format
+msgid "E802: Invalid ID: %ld (must be greater than or equal to 1)"
+msgstr "E802: ID invalide : %ld (doit ๊tre plus grand ou ้gal เ 1)"
-#~ msgid "cannot insert/append line"
-#~ msgstr "Impossible d'ins้rer/ajouter de lignes"
+#, c-format
+msgid "E803: ID not found: %ld"
+msgstr "E803: ID introuvable : %ld"
-#~ msgid "line number out of range"
-#~ msgstr "num้ro de ligne hors limites"
+#, c-format
+msgid "E370: Could not load library %s"
+msgstr "E370: Impossible de charger la biblioth่que %s"
-#~ msgid "unknown flag: "
-#~ msgstr "drapeau inconnu : "
+msgid "Sorry, this command is disabled: the Perl library could not be loaded."
+msgstr ""
+"D้sol้, commande d้sactiv้e : la biblioth่que Perl n'a pas pu ๊tre charg้e."
-#~ msgid "unknown vimOption"
-#~ msgstr "vimOption inconnue"
+msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
+msgstr "E299: ษvaluation Perl interdite dans bac เ sable sans le module Safe"
-#~ msgid "keyboard interrupt"
-#~ msgstr "interruption clavier"
+msgid "Edit with &multiple Vims"
+msgstr "ษditer dans &plusieurs Vims"
-#~ msgid "vim error"
-#~ msgstr "erreur Vim"
+msgid "Edit with single &Vim"
+msgstr "ษditer dans un seul &Vim"
-#~ msgid "cannot create buffer/window command: object is being deleted"
-#~ msgstr ""
-#~ "Impossible de cr้er commande de tampon/fen๊tre : objet en cours "
-#~ "d'effacement"
+msgid "Diff with Vim"
+msgstr "&Comparer avec Vim"
-#~ msgid ""
-#~ "cannot register callback command: buffer/window is already being deleted"
-#~ msgstr ""
-#~ "Impossible d'inscrire la commande de rappel : tampon/fen๊tre en effacement"
+msgid "Edit with &Vim"
+msgstr "ษditer dans &Vim"
-#~ msgid ""
-#~ "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-"
-#~ "dev@vim.org"
-#~ msgstr ""
-#~ "E280: ERREUR FATALE TCL: reflist corrompue ?! Contactez vim-dev@vim.org, "
-#~ "SVP."
+msgid "Edit with existing Vim - "
+msgstr "ษditer dans le Vim existant - "
-#~ msgid "cannot register callback command: buffer/window reference not found"
-#~ msgstr ""
-#~ "Impossible d'inscrire la commande de rappel : r้f. tampon/fen๊tre "
-#~ "introuvable"
+msgid "Edits the selected file(s) with Vim"
+msgstr "ษdites le(s) fichier(s) s้lectionn้(s) avec Vim"
-#~ msgid ""
-#~ "E571: Sorry, this command is disabled: the Tcl library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E571: D้sol้, commande d้sactiv้e: la biblioth่que Tcl n'a pas pu ๊tre "
-#~ "charg้e."
+# DB - MessageBox win32, la longueur n'est pas un probl่me !
+msgid "Error creating process: Check if gvim is in your path!"
+msgstr ""
+"Erreur de cr้ation du processus : v้rifiez que gvim est bien dans votre "
+"chemin !"
-#~ msgid "E572: exit code %d"
-#~ msgstr "E572: code de sortie %d"
+msgid "gvimext.dll error"
+msgstr "Erreur de gvimext.dll"
-#~ msgid "cannot get line"
-#~ msgstr "Impossible d'obtenir la ligne"
+msgid "Path length too long!"
+msgstr "Le chemin est trop long !"
-#~ msgid "Unable to register a command server name"
-#~ msgstr "Impossible d'inscrire un nom de serveur de commande"
+# msgstr "--Pas de lignes dans le tampon--"
+# DB - todo : ou encore : msgstr "--Aucune ligne dans le tampon--"
+msgid "--No lines in buffer--"
+msgstr "--Le tampon est vide--"
-#~ msgid "E248: Failed to send command to the destination program"
-#~ msgstr "E248: ษchec de l'envoi de la commande au programme cible"
+msgid "E470: Command aborted"
+msgstr "E470: Commande annul้e"
-#~ msgid "E573: Invalid server id used: %s"
-#~ msgstr "E573: Id utilis้ pour le serveur invalide : %s"
+msgid "E471: Argument required"
+msgstr "E471: Argument requis"
-#~ msgid "E251: VIM instance registry property is badly formed. Deleted!"
-#~ msgstr ""
-#~ "E251: Entr้e registre de l'instance de Vim mal format้e. Suppression !"
+msgid "E10: \\ should be followed by /, ? or &"
+msgstr "E10: \\ devrait ๊tre suivi de /, ? ou &"
-#~ msgid "netbeans is not supported with this GUI\n"
-#~ msgstr "netbeans n'est pas support้ avec cette interface graphique\n"
+msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
+msgstr ""
+"E11: Invalide dans la fen๊tre ligne-de-commande ; <CR> ex้cute, CTRL-C quitte"
-#~ msgid "This Vim was not compiled with the diff feature."
-#~ msgstr "Ce Vim n'a pas ้t้ compil้ avec la fonctionnalit้ diff"
+msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
+msgstr ""
+"E12: commande non autoris้e depuis un exrc/vimrc dans r้pertoire courant ou "
+"une recherche de marqueur"
-#~ msgid "'-nb' cannot be used: not enabled at compile time\n"
-#~ msgstr "'-nb' ne peut pas ๊tre utilis้ : d้sactiv้ เ la compilation\n"
+msgid "E171: Missing :endif"
+msgstr "E171: :endif manquant"
-#~ msgid "Vim: Error: Failure to start gvim from NetBeans\n"
-#~ msgstr "Vim : Erreur : Impossible de d้marrer gvim depuis NetBeans\n"
+msgid "E600: Missing :endtry"
+msgstr "E600: :endtry manquant"
-# DB - todo (VMS uniquement).
-#~ msgid ""
-#~ "\n"
-#~ "Where case is ignored prepend / to make flag upper case"
-#~ msgstr ""
-#~ "\n"
-#~ "pour lesquels la casse est indiff้rente (/ pour que le drapeau soit "
-#~ "majuscule)"
-
-#~ msgid "-register\t\tRegister this gvim for OLE"
-#~ msgstr "-register\tInscrire ce gvim pour OLE"
-
-#~ msgid "-unregister\t\tUnregister gvim for OLE"
-#~ msgstr "-unregister\tD้sinscrire gvim de OLE"
-
-#~ msgid "-g\t\t\tRun using GUI (like \"gvim\")"
-#~ msgstr "-g\t\tLancer l'interface graphique (comme \"gvim\")"
-
-#~ msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
-#~ msgstr ""
-#~ "-f, --nofork\tPremier-plan : ne pas d้tacher l'interface graphique du "
-#~ "terminal"
-
-#~ msgid "-f\t\t\tDon't use newcli to open window"
-#~ msgstr "-f\t\tNe pas utiliser newcli pour l'ouverture des fen๊tres"
-
-#~ msgid "-dev <device>\t\tUse <device> for I/O"
-#~ msgstr "-dev <p้riph>\tUtiliser <p้riph้rique> pour les E/S"
-
-#~ msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
-#~ msgstr "-U <gvimrc>\tUtiliser <gvimrc> au lieu du gvimrc habituel"
-
-#~ msgid "-x\t\t\tEdit encrypted files"
-#~ msgstr "-x\t\t\tษditer des fichiers chiffr้s"
-
-#~ msgid "-display <display>\tConnect vim to this particular X-server"
-#~ msgstr "-display <display>\tConnecter Vim au serveur X sp้cifi้"
-
-#~ msgid "-X\t\t\tDo not connect to X server"
-#~ msgstr "-X\t\t\tNe pas se connecter เ un serveur X"
-
-#~ msgid "--remote <files>\tEdit <files> in a Vim server if possible"
-#~ msgstr ""
-#~ "--remote <fich>\tษditer les <fichiers> dans un serveur Vim si possible"
-
-#~ msgid "--remote-silent <files> Same, don't complain if there is no server"
-#~ msgstr ""
-#~ "--remote-silent ...\tPareil, mais pas d'erreur s'il n'y a aucun serveur"
-
-#~ msgid ""
-#~ "--remote-wait <files> As --remote but wait for files to have been edited"
-#~ msgstr ""
-#~ "--remote-wait <fich>\tComme --remote mais ne quitter qu'เ la fin de "
-#~ "l'้dition"
-
-#~ msgid ""
-#~ "--remote-wait-silent <files> Same, don't complain if there is no server"
-#~ msgstr ""
-#~ "--remote-wait-silent\tPareil, mais pas d'erreur s'il n'y a aucun serveur"
-
-#~ msgid ""
-#~ "--remote-tab[-wait][-silent] <files> As --remote but use tab page per "
-#~ "file"
-#~ msgstr ""
-#~ "--remote-tab[-wait][-silent] <fich>\tComme --remote mais ouvrir un onglet "
-#~ "pour chaque fichier"
-
-#~ msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
-#~ msgstr ""
-#~ "--remote-send <tche>\tEnvoyer <touches> เ un serveur Vim puis quitter"
-
-#~ msgid ""
-#~ "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
-#~ msgstr ""
-#~ "--remote-expr <expr>\tษvaluer <expr> dans un serveur Vim, afficher le "
-#~ "r้sultat"
-
-#~ msgid "--serverlist\t\tList available Vim server names and exit"
-#~ msgstr ""
-#~ "--serverlist\t\tLister les noms des serveurs Vim disponibles et quitter"
-
-#~ msgid "--servername <name>\tSend to/become the Vim server <name>"
-#~ msgstr "--servername <nom>\tEnvoyer au/devenir le serveur Vim nomm้ <nom>"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Motif version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Arguments reconnus par gvim (version Motif) :\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (neXtaw version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Arguments reconnus par gvim (version neXtaw) :\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Athena version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Arguments reconnus par gvim (version Athena) :\n"
+msgid "E170: Missing :endwhile"
+msgstr "E170: :endwhile manquant"
-#~ msgid "-display <display>\tRun vim on <display>"
-#~ msgstr "-display <้cran>\tLancer Vim sur ce <display>"
+msgid "E170: Missing :endfor"
+msgstr "E170: :endfor manquant"
-#~ msgid "-iconic\t\tStart vim iconified"
-#~ msgstr "-iconic\t\tIconifier Vim au d้marrage"
+msgid "E588: :endwhile without :while"
+msgstr "E588: :endwhile sans :while"
-#~ msgid "-background <color>\tUse <color> for the background (also: -bg)"
-#~ msgstr ""
-#~ "-background <coul>\tUtiliser <couleur> pour l'arri่re-plan\t (abrv : -"
-#~ "bg)"
+msgid "E588: :endfor without :for"
+msgstr "E588: :endfor sans :for"
-#~ msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
-#~ msgstr ""
-#~ "-foreground <coul>\tUtiliser <couleur> pour le texte normal\t (abrv : -"
-#~ "fg)"
+msgid "E13: File exists (add ! to override)"
+msgstr "E13: Le fichier existe d้jเ (ajoutez ! pour passer outre)"
-#~ msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
-#~ msgstr ""
-#~ "-font <fonte>\tUtiliser <fonte> pour le texte normal\t (abrv : -fn)"
+msgid "E472: Command failed"
+msgstr "E472: La commande a ้chou้"
-#~ msgid "-boldfont <font>\tUse <font> for bold text"
-#~ msgstr "-boldfont <fonte>\tUtiliser <fonte> pour le texte gras"
+#, c-format
+msgid "E234: Unknown fontset: %s"
+msgstr "E234: Jeu de police inconnu : %s"
-#~ msgid "-italicfont <font>\tUse <font> for italic text"
-#~ msgstr "-italicfont <fonte>\tUtiliser <fonte> pour le texte italique"
+#, c-format
+msgid "E235: Unknown font: %s"
+msgstr "E235: Police inconnue : %s"
-#~ msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
-#~ msgstr ""
-#~ "-geometry <g้om>\tUtiliser cette <g้om้trie> initiale\t (abrv : -geom)"
+#, c-format
+msgid "E236: Font \"%s\" is not fixed-width"
+msgstr "E236: La police \"%s\" n'a pas une chasse (largeur) fixe"
-#~ msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
-#~ msgstr ""
-#~ "-borderwidth <้pais>\tUtiliser cette <้paisseur> de bordure\t (abrv : -"
-#~ "bw)"
+msgid "E473: Internal error"
+msgstr "E473: Erreur interne"
-#~ msgid ""
-#~ "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
-#~ msgstr ""
-#~ "-scrollbarwidth <lg>\tUtiliser cette <largeur> de barre de d้fil. (abrv: -"
-#~ "sw)"
-
-#~ msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
-#~ msgstr ""
-#~ "-menuheight <haut>\tUtiliser cette <hauteur> de menu\t (abrv : -mh)"
-
-#~ msgid "-reverse\t\tUse reverse video (also: -rv)"
-#~ msgstr "-reverse\t\tUtiliser la vid้o inverse\t\t (abrv : -rv)"
-
-#~ msgid "+reverse\t\tDon't use reverse video (also: +rv)"
-#~ msgstr "+reverse\t\tNe pas utiliser de vid้o inverse\t (abrv : +rv)"
-
-#~ msgid "-xrm <resource>\tSet the specified resource"
-#~ msgstr "-xrm <ressource>\tConfigurer la <ressource> sp้cifi้e"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (GTK+ version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Arguments reconnus par gvim (version GTK+) :\n"
-
-#~ msgid "-display <display>\tRun vim on <display> (also: --display)"
-#~ msgstr ""
-#~ "-display <display>\tLancer Vim sur ce <display>\t(้galement : --display)"
-
-#~ msgid "--role <role>\tSet a unique role to identify the main window"
-#~ msgstr "--role <r๔le>\tDonner un r๔le pour identifier la fen๊tre principale"
-
-#~ msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
-#~ msgstr "--socketid <xid>\tOuvrir Vim dans un autre widget GTK"
-
-#~ msgid "--echo-wid\t\tMake gvim echo the Window ID on stdout"
-#~ msgstr "--echo-wid\t\tGvim affiche l'ID de la fen๊tre sur stdout"
-
-#~ msgid "-P <parent title>\tOpen Vim inside parent application"
-#~ msgstr "-P <titre parent>\tOuvrir Vim dans une application parente"
-
-#~ msgid "--windowid <HWND>\tOpen Vim inside another win32 widget"
-#~ msgstr "--windowid <HWND>\tOuvrir Vim dans un autre widget win32"
-
-#~ msgid "No display"
-#~ msgstr "Aucun display"
-
-#~ msgid ": Send failed.\n"
-#~ msgstr " : L'envoi a ้chou้.\n"
-
-#~ msgid ": Send failed. Trying to execute locally\n"
-#~ msgstr " : L'envoi a ้chou้. Tentative d'ex้cution locale\n"
-
-#~ msgid "%d of %d edited"
-#~ msgstr "%d ้dit้s sur %d"
-
-#~ msgid "No display: Send expression failed.\n"
-#~ msgstr "Aucun display : L'envoi de l'expression a ้chou้.\n"
-
-#~ msgid ": Send expression failed.\n"
-#~ msgstr " : L'envoi de l'expression a ้chou้.\n"
+#, c-format
+msgid "E685: Internal error: %s"
+msgstr "E685: Erreur interne : %s"
-#~ msgid "E543: Not a valid codepage"
-#~ msgstr "E543: Page de codes non valide"
+msgid "Interrupted"
+msgstr "Interrompu"
-#~ msgid "E284: Cannot set IC values"
-#~ msgstr "E284: Impossible de r้gler les valeurs IC"
-
-#~ msgid "E285: Failed to create input context"
-#~ msgstr "E285: ษchec de la cr้ation du contexte de saisie"
-
-#~ msgid "E286: Failed to open input method"
-#~ msgstr "E286: ษchec de l'ouverture de la m้thode de saisie"
+msgid "E14: Invalid address"
+msgstr "E14: Adresse invalide"
-#~ msgid "E287: Warning: Could not set destroy callback to IM"
-#~ msgstr ""
-#~ "E287: Alerte : Impossible d'inscrire la callback de destruction dans la MS"
+msgid "E474: Invalid argument"
+msgstr "E474: Argument invalide"
-#~ msgid "E288: input method doesn't support any style"
-#~ msgstr "E288: la m้thode de saisie ne supporte aucun style"
+#, c-format
+msgid "E475: Invalid argument: %s"
+msgstr "E475: Argument invalide : %s"
-#~ msgid "E289: input method doesn't support my preedit type"
-#~ msgstr ""
-#~ "E289: le type de pr้้dition de Vim n'est pas support้ par la m้thode de "
-#~ "saisie"
+#, c-format
+msgid "E475: Invalid value for argument %s"
+msgstr "E475: Valeur d'argument invalide : %s"
-#~ msgid "E843: Error while updating swap file crypt"
-#~ msgstr "E843: Erreur lors de la mise เ jour du fichier d'้change crypt้"
+#, c-format
+msgid "E475: Invalid value for argument %s: %s"
+msgstr "E475: Valeur d'argument invalide %s : %s"
-#~ msgid ""
-#~ "E833: %s is encrypted and this version of Vim does not support encryption"
-#~ msgstr ""
-#~ "E833: %s est chiffr้ et cette version de Vim ne supporte pas le "
-#~ "chiffrement"
-
-#~ msgid "Swap file is encrypted: \"%s\""
-#~ msgstr "Fichier d'้change chiffr้ : \"%s\""
+#, c-format
+msgid "E15: Invalid expression: %s"
+msgstr "E15: Expression invalide : %s"
-#~ msgid ""
-#~ "\n"
-#~ "If you entered a new crypt key but did not write the text file,"
-#~ msgstr ""
-#~ "\n"
-#~ "Si vous avez tap้ une nouvelle cl้ de chiffrement mais n'avez pas "
-#~ "enregistr้ le fichier texte,"
+msgid "E16: Invalid range"
+msgstr "E16: Plage invalide"
-#~ msgid ""
-#~ "\n"
-#~ "enter the new crypt key."
-#~ msgstr ""
-#~ "\n"
-#~ "tapez la nouvelle cl้ de chiffrement."
+msgid "E476: Invalid command"
+msgstr "E476: Commande invalide"
-#~ msgid ""
-#~ "\n"
-#~ "If you wrote the text file after changing the crypt key press enter"
-#~ msgstr ""
-#~ "\n"
-#~ "Si vous avez ้crit le fichier texte apr่s avoir chang้ la cl้ de "
-#~ "chiffrement, appuyez sur entr้e"
+#, c-format
+msgid "E17: \"%s\" is a directory"
+msgstr "E17: \"%s\" est un r้pertoire"
-#~ msgid ""
-#~ "\n"
-#~ "to use the same key for text file and swap file"
-#~ msgstr ""
-#~ "\n"
-#~ "afin d'utiliser la m๊me cl้ pour le fichier texte et le fichier d'้change"
+#, c-format
+msgid "E364: Library call failed for \"%s()\""
+msgstr "E364: L'appel เ la biblioth่que a ้chou้ pour \"%s()\""
-#~ msgid "Using crypt key from swap file for the text file.\n"
-#~ msgstr ""
-#~ "Utilisation de la cl้ de chiffrement du fichier d'้change pour le fichier "
-#~ "texte.\n"
+msgid "E667: Fsync failed"
+msgstr "E667: Fsynch a ้chou้"
-#~ msgid ""
-#~ "\n"
-#~ " [not usable with this version of Vim]"
-#~ msgstr ""
-#~ "\n"
-#~ " [inutilisable avec cette version de Vim]"
-
-#~ msgid "Tear off this menu"
-#~ msgstr "D้tacher ce menu"
+#, c-format
+msgid "E448: Could not load library function %s"
+msgstr "E448: Impossible de charger la fonction %s de la biblioth่que"
-# DB : Les trois messages qui suivent sont des titres de bo๎tes
-# de dialogue par d้faut.
-#~ msgid "Select Directory dialog"
-#~ msgstr "S้lecteur de r้pertoire"
+msgid "E19: Mark has invalid line number"
+msgstr "E19: La marque a un num้ro de ligne invalide"
-#~ msgid "Save File dialog"
-#~ msgstr "Enregistrer un fichier"
+msgid "E20: Mark not set"
+msgstr "E20: Marque non positionn้e"
-#~ msgid "Open File dialog"
-#~ msgstr "Ouvrir un fichier"
+msgid "E21: Cannot make changes, 'modifiable' is off"
+msgstr "E21: Impossible de modifier, 'modifiable' est d้sactiv้"
-#~ msgid "E338: Sorry, no file browser in console mode"
-#~ msgstr "E338: D้sol้, pas de s้lecteur de fichiers en mode console"
+msgid "E22: Scripts nested too deep"
+msgstr "E22: Trop de r้cursion dans les scripts"
-#~ msgid "ERROR: "
-#~ msgstr "ERREUR : "
+msgid "E23: No alternate file"
+msgstr "E23: Pas de fichier alternatif"
-#~ msgid ""
-#~ "\n"
-#~ "[bytes] total alloc-freed %<PRIu64>-%<PRIu64>, in use %<PRIu64>, peak use "
-#~ "%<PRIu64>\n"
-#~ msgstr ""
-#~ "\n"
-#~ "[octets] total allou้-lib้r้ %<PRIu64>-%<PRIu64>, utilis้ %<PRIu64>, pic "
-#~ "%<PRIu64>\n"
+msgid "E24: No such abbreviation"
+msgstr "E24: Cette abr้viation n'existe pas"
-#~ msgid ""
-#~ "[calls] total re/malloc()'s %<PRIu64>, total free()'s %<PRIu64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "[appels] total re/malloc() %<PRIu64>, total free() %<PRIu64>\n"
-#~ "\n"
+msgid "E477: No ! allowed"
+msgstr "E477: Le ! n'est pas autoris้"
-#~ msgid "E340: Line is becoming too long"
-#~ msgstr "E340: La ligne devient trop longue"
+msgid "E25: GUI cannot be used: Not enabled at compile time"
+msgstr "E25: L'interface graphique n'a pas ้t้ compil้e dans cette version"
-#~ msgid "E341: Internal error: lalloc(%<PRId64>, )"
-#~ msgstr "E341: Erreur interne : lalloc(%<PRId64>, )"
+msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
+msgstr "E26: Le support de l'h้breu n'a pas ้t้ compil้ dans cette version\n"
-#~ msgid "E547: Illegal mouseshape"
-#~ msgstr "E547: Forme de curseur invalide"
+msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
+msgstr "E27: Le support du farsi n'a pas ้t้ compil้ dans cette version\n"
-#~ msgid "Warning: Using a weak encryption method; see :help 'cm'"
-#~ msgstr ""
-#~ "Alerte : utilisation d'une m้thode de chiffrage faible ; consultez :help 'cm'"
+msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
+msgstr "E800: Le support de l'arabe n'a pas ้t้ compil้ dans cette version\n"
-#~ msgid "Enter encryption key: "
-#~ msgstr "Tapez la cl้ de chiffrement : "
+#, c-format
+msgid "E28: No such highlight group name: %s"
+msgstr "E28: Aucun nom de groupe de surbrillance %s"
-#~ msgid "Enter same key again: "
-#~ msgstr "Tapez la cl้ เ nouveau : "
+msgid "E29: No inserted text yet"
+msgstr "E29: Pas encore de texte ins้r้"
-#~ msgid "Keys don't match!"
-#~ msgstr "Les cl้s ne correspondent pas !"
+msgid "E30: No previous command line"
+msgstr "E30: Aucune ligne de commande pr้c้dente"
-#~ msgid "Cannot connect to Netbeans #2"
-#~ msgstr "Impossible de se connecter เ Netbeans nฐ2"
+msgid "E31: No such mapping"
+msgstr "E31: Mappage inexistant"
-#~ msgid "Cannot connect to Netbeans"
-#~ msgstr "Impossible de se connecter เ Netbeans"
+msgid "E479: No match"
+msgstr "E479: Aucune correspondance"
-#~ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
-#~ msgstr ""
-#~ "E668: Mode d'acc่s incorrect au fichier d'infos de connexion NetBeans : "
-#~ "\"%s\""
+#, c-format
+msgid "E480: No match: %s"
+msgstr "E480: Aucune correspondance : %s"
-# DB : message d'un appel เ perror().
-#~ msgid "read from Netbeans socket"
-#~ msgstr "read sur la socket Netbeans"
+msgid "E32: No file name"
+msgstr "E32: Aucun nom de fichier"
-#~ msgid "E658: NetBeans connection lost for buffer %<PRId64>"
-#~ msgstr "E658: Connexion NetBeans perdue pour le tampon %<PRId64>"
+msgid "E33: No previous substitute regular expression"
+msgstr "E33: Aucune expression r้guli่re de substitution pr้c้dente"
-#~ msgid "E838: netbeans is not supported with this GUI"
-#~ msgstr "E838: netbeans n'est pas support้ avec cette interface graphique"
+msgid "E34: No previous command"
+msgstr "E34: Aucune commande pr้c้dente"
-#~ msgid "E511: netbeans already connected"
-#~ msgstr "E511: netbeans d้jเ connect้"
+msgid "E35: No previous regular expression"
+msgstr "E35: Aucune expression r้guli่re pr้c้dente"
-#~ msgid "E505: %s is read-only (add ! to override)"
-#~ msgstr "E505: %s est en lecture seule (ajoutez ! pour passer outre)"
+msgid "E481: No range allowed"
+msgstr "E481: Les plages ne sont pas autoris้es"
-#~ msgid "E775: Eval feature not available"
-#~ msgstr "E775: La fonctionnalit้ d'้valuation n'est pas disponible"
+msgid "E36: Not enough room"
+msgstr "E36: Pas assez de place"
-#~ msgid "freeing %<PRId64> lines"
-#~ msgstr "lib้ration de %<PRId64> lignes"
+#, c-format
+msgid "E247: no registered server named \"%s\""
+msgstr "E247: aucun serveur nomm้ \"%s\" n'est enregistr้"
-#~ msgid "E530: Cannot change term in GUI"
-#~ msgstr "E530: Impossible de modifier term dans l'interface graphique"
+#, c-format
+msgid "E482: Can't create file %s"
+msgstr "E482: Impossible de cr้er le fichier %s"
-#~ msgid "E531: Use \":gui\" to start the GUI"
-#~ msgstr "E531: Utilisez \":gui\" pour d้marrer l'interface graphique"
+msgid "E483: Can't get temp file name"
+msgstr "E483: Impossible d'obtenir un nom de fichier temporaire"
-#~ msgid "E617: Cannot be changed in the GTK+ 2 GUI"
-#~ msgstr "E617: Non modifiable dans l'interface graphique GTK+ 2"
+#, c-format
+msgid "E484: Can't open file %s"
+msgstr "E484: Impossible d'ouvrir le fichier \"%s\""
-#~ msgid "E596: Invalid font(s)"
-#~ msgstr "E596: Police(s) invalide(s)"
+#, c-format
+msgid "E485: Can't read file %s"
+msgstr "E485: Impossible de lire le fichier %s"
-#~ msgid "E597: can't select fontset"
-#~ msgstr "E597: Impossible de s้lectionner un jeu de polices"
+msgid "E38: Null argument"
+msgstr "E38: Argument null"
-#~ msgid "E598: Invalid fontset"
-#~ msgstr "E598: Jeu de polices invalide"
+msgid "E39: Number expected"
+msgstr "E39: Nombre attendu"
-#~ msgid "E533: can't select wide font"
-#~ msgstr "E533: Impossible de s้lectionner une police เ largeur double"
+#, c-format
+msgid "E40: Can't open errorfile %s"
+msgstr "E40: Impossible d'ouvrir le fichier d'erreurs %s"
-#~ msgid "E534: Invalid wide font"
-#~ msgstr "E534: Police เ largeur double invalide"
+msgid "E233: cannot open display"
+msgstr "E233: ouverture du display impossible"
-#~ msgid "E538: No mouse support"
-#~ msgstr "E538: La souris n'est pas support้e"
+msgid "E41: Out of memory!"
+msgstr "E41: M้moire ้puis้e"
-#~ msgid "cannot open "
-#~ msgstr "impossible d'ouvrir "
+msgid "Pattern not found"
+msgstr "Motif introuvable"
-#~ msgid "VIM: Can't open window!\n"
-#~ msgstr "VIM : Impossible d'ouvrir la fen๊tre !\n"
+#, c-format
+msgid "E486: Pattern not found: %s"
+msgstr "E486: Motif introuvable : %s"
-#~ msgid "Need Amigados version 2.04 or later\n"
-#~ msgstr "Amigados version 2.04 ou ult้rieure est n้cessaire\n"
+msgid "E487: Argument must be positive"
+msgstr "E487: L'argument doit ๊tre positif"
-#~ msgid "Need %s version %<PRId64>\n"
-#~ msgstr "%s version %<PRId64> est n้cessaire\n"
+msgid "E459: Cannot go back to previous directory"
+msgstr "E459: Impossible de retourner au r้pertoire pr้c้dent"
-#~ msgid "Cannot open NIL:\n"
-#~ msgstr "Impossible d'ouvrir NIL :\n"
+msgid "E42: No Errors"
+msgstr "E42: Aucune erreur"
-#~ msgid "Cannot create "
-#~ msgstr "Impossible de cr้er "
+# DB - TODO : trouver une traduction valable et attest้e pour "location".
+msgid "E776: No location list"
+msgstr "E776: Aucune liste d'emplacements"
-#~ msgid "Vim exiting with %d\n"
-#~ msgstr "Vim quitte avec %d\n"
+msgid "E43: Damaged match string"
+msgstr "E43: La cha๎ne de recherche est endommag้e"
-#~ msgid "cannot change console mode ?!\n"
-#~ msgstr "Impossible de modifier le mode de la console ?!\n"
+msgid "E44: Corrupted regexp program"
+msgstr "E44: L'automate de regexp est corrompu"
-#~ msgid "mch_get_shellsize: not a console??\n"
-#~ msgstr "mch_get_shellsize : pas une console ?!\n"
+msgid "E45: 'readonly' option is set (add ! to override)"
+msgstr "E45: L'option 'readonly' est activ้e (ajoutez ! pour passer outre)"
-#~ msgid "E360: Cannot execute shell with -f option"
-#~ msgstr "E360: Impossible d'ex้cuter un shell avec l'option -f"
+#, c-format
+msgid "E46: Cannot change read-only variable \"%s\""
+msgstr "E46: La variable \"%s\" est en lecture seule"
-#~ msgid "Cannot execute "
-#~ msgstr "Impossible d'ex้cuter "
+#, c-format
+msgid "E794: Cannot set variable in the sandbox: \"%s\""
+msgstr ""
+"E794: Impossible de modifier une variable depuis le bac เ sable : \"%s\""
-#~ msgid "shell "
-#~ msgstr "le shell "
+msgid "E713: Cannot use empty key for Dictionary"
+msgstr "E713: Impossible d'utiliser une cl้ vide dans un Dictionnaire"
-#~ msgid " returned\n"
-#~ msgstr " a ้t้ retourn้\n"
+msgid "E715: Dictionary required"
+msgstr "E715: Dictionnaire requis"
-#~ msgid "ANCHOR_BUF_SIZE too small."
-#~ msgstr "ANCHOR_BUF_SIZE trop petit."
+#, c-format
+msgid "E684: list index out of range: %ld"
+msgstr "E684: index de Liste hors limites : %ld au-delเ de la fin"
-#~ msgid "I/O ERROR"
-#~ msgstr "ERREUR d'E/S"
+# DB : Suggestion
+#, c-format
+msgid "E118: Too many arguments for function: %s"
+msgstr "E118: La fonction %s a re็u trop d'arguments"
-#~ msgid "Message"
-#~ msgstr "Message"
+#, c-format
+msgid "E716: Key not present in Dictionary: %s"
+msgstr "E716: La cl้ %s n'existe pas dans le Dictionnaire"
-#~ msgid "'columns' is not 80, cannot execute external commands"
-#~ msgstr ""
-#~ "'columns' ne vaut pas 80, impossible d'ex้cuter des commandes externes"
+msgid "E714: List required"
+msgstr "E714: Liste requise"
-#~ msgid "E237: Printer selection failed"
-#~ msgstr "E237: La s้lection de l'imprimante a ้chou้"
+#, c-format
+msgid "E712: Argument of %s must be a List or Dictionary"
+msgstr "E712: L'argument de %s doit ๊tre une Liste ou un Dictionnaire"
-# DB - Contenu des c-formats : Imprimante puis Port.
-#~ msgid "to %s on %s"
-#~ msgstr "vers %s sur %s"
+msgid "E47: Error while reading errorfile"
+msgstr "E47: Erreur lors de la lecture du fichier d'erreurs"
-#~ msgid "E613: Unknown printer font: %s"
-#~ msgstr "E613: Police d'imprimante inconnue : %s"
+msgid "E48: Not allowed in sandbox"
+msgstr "E48: Op้ration interdite dans le bac เ sable"
-#~ msgid "E238: Print error: %s"
-#~ msgstr "E238: Erreur d'impression : %s"
+msgid "E523: Not allowed here"
+msgstr "E523: Interdit เ cet endroit"
-#~ msgid "Printing '%s'"
-#~ msgstr "Impression de '%s'"
+msgid "E359: Screen mode setting not supported"
+msgstr "E359: Choix du mode d'้cran non support้"
-#~ msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
-#~ msgstr "E244: Jeu de caract่res \"%s\" invalide dans le nom de fonte \"%s\""
+msgid "E49: Invalid scroll size"
+msgstr "E49: Valeur de d้filement invalide"
-#~ msgid "E245: Illegal char '%c' in font name \"%s\""
-#~ msgstr "E245: Caract่re '%c' invalide dans le nom de fonte \"%s\""
+msgid "E91: 'shell' option is empty"
+msgstr "E91: L'option 'shell' est vide"
-#~ msgid "Opening the X display took %<PRId64> msec"
-#~ msgstr "L'ouverture du display X a pris %<PRId64> ms"
+msgid "E255: Couldn't read in sign data!"
+msgstr "E255: Impossible de lire les donn้es du symbole !"
-#~ msgid ""
-#~ "\n"
-#~ "Vim: Got X error\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Vim : R้ception d'une erreur X\n"
+msgid "E72: Close error on swap file"
+msgstr "E72: Erreur lors de la fermeture du fichier d'้change"
-#~ msgid "Testing the X display failed"
-#~ msgstr "Le test du display X a ้chou้"
+msgid "E73: tag stack empty"
+msgstr "E73: La pile des marqueurs est vide"
-#~ msgid "Opening the X display timed out"
-#~ msgstr "L'ouverture du display X a d้pass้ le d้lai d'attente"
+msgid "E74: Command too complex"
+msgstr "E74: Commande trop complexe"
-#~ msgid ""
-#~ "\n"
-#~ "Cannot execute shell sh\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Impossible d'ex้cuter le shell sh\n"
+msgid "E75: Name too long"
+msgstr "E75: Nom trop long"
-#~ msgid ""
-#~ "\n"
-#~ "Cannot create pipes\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Impossible de cr้er des tuyaux (pipes)\n"
+msgid "E76: Too many ["
+msgstr "E76: Trop de ["
-#~ msgid ""
-#~ "\n"
-#~ "Cannot fork\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Impossible de forker\n"
+msgid "E77: Too many file names"
+msgstr "E77: Trop de noms de fichiers"
-#~ msgid ""
-#~ "\n"
-#~ "Command terminated\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Commande interrompue\n"
+msgid "E488: Trailing characters"
+msgstr "E488: Caract่res surnum้raires"
-#~ msgid "XSMP lost ICE connection"
-#~ msgstr "XSMP a perdu la connexion ICE"
+msgid "E78: Unknown mark"
+msgstr "E78: Marque inconnue"
-#~ msgid "Opening the X display failed"
-#~ msgstr "L'ouverture du display X a ้chou้"
+msgid "E79: Cannot expand wildcards"
+msgstr "E79: Impossible de d้velopper les m้tacaract่res"
-#~ msgid "XSMP handling save-yourself request"
-#~ msgstr "XSMP : prise en charge d'une requ๊te save-yourself"
+msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
+msgstr "E591: 'winheight' ne peut pas ๊tre plus petit que 'winminheight'"
-#~ msgid "XSMP opening connection"
-#~ msgstr "XSMP : ouverture de la connexion"
+msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
+msgstr "E592: 'winwidth' ne peut pas ๊tre plus petit que 'winminwidth'"
-#~ msgid "XSMP ICE connection watch failed"
-#~ msgstr "XSMP : ้chec de la surveillance de connexion ICE"
+msgid "E80: Error while writing"
+msgstr "E80: Erreur lors de l'้criture"
-#~ msgid "XSMP SmcOpenConnection failed: %s"
-#~ msgstr "XSMP : SmcOpenConnection a ้chou้ : %s"
+msgid "E939: Positive count required"
+msgstr "E939: Quantificateur positif requis"
-#~ msgid "At line"
-#~ msgstr "ภ la ligne"
+msgid "E81: Using <SID> not in a script context"
+msgstr "E81: <SID> utilis้ en dehors d'un script"
-#~ msgid "Could not load vim32.dll!"
-#~ msgstr "Impossible de charger vim32.dll !"
+msgid "E449: Invalid expression received"
+msgstr "E449: Expression invalide re็ue"
-#~ msgid "VIM Error"
-#~ msgstr "Erreur VIM"
+msgid "E463: Region is guarded, cannot modify"
+msgstr "E463: Cette zone est verrouill้e et ne peut pas ๊tre modifi้e"
-#~ msgid "Could not fix up function pointers to the DLL!"
-#~ msgstr "Impossible d'initialiser les pointeurs de fonction vers la DLL !"
+msgid "E744: NetBeans does not allow changes in read-only files"
+msgstr ""
+"E744: NetBeans n'autorise pas la modification des fichiers en lecture seule"
-#~ msgid "shell returned %d"
-#~ msgstr "le shell a retourn้ %d"
+msgid "E363: pattern uses more memory than 'maxmempattern'"
+msgstr "E363: le motif utilise plus de m้moire que 'maxmempattern'"
-# DB - Les ้v้nements en question sont ceux des messages qui suivent.
-#~ msgid "Vim: Caught %s event\n"
-#~ msgstr "Vim : ษv้nement %s intercept้\n"
+msgid "E749: empty buffer"
+msgstr "E749: tampon vide"
-#~ msgid "close"
-#~ msgstr "de fermeture"
+#, c-format
+msgid "E86: Buffer %ld does not exist"
+msgstr "E86: Le tampon %ld n'existe pas"
-#~ msgid "logoff"
-#~ msgstr "de d้connexion"
+msgid "E682: Invalid search pattern or delimiter"
+msgstr "E682: D้limiteur ou motif de recherche invalide"
-#~ msgid "shutdown"
-#~ msgstr "d'arr๊t"
+msgid "E139: File is loaded in another buffer"
+msgstr "E139: Le fichier est charg้ dans un autre tampon"
-#~ msgid "E371: Command not found"
-#~ msgstr "E371: Commande introuvable"
+#, c-format
+msgid "E764: Option '%s' is not set"
+msgstr "E764: L'option '%s' n'est pas activ้e"
-#~ msgid ""
-#~ "VIMRUN.EXE not found in your $PATH.\n"
-#~ "External commands will not pause after completion.\n"
-#~ "See :help win32-vimrun for more information."
-#~ msgstr ""
-#~ "VIMRUN.EXE est introuvable votre $PATH.\n"
-#~ "Les commandes externes ne feront pas de pause une fois termin้es.\n"
-#~ "Consultez :help win32-vimrun pour plus d'informations."
+msgid "E850: Invalid register name"
+msgstr "E850: Nom de registre invalide"
-#~ msgid "Vim Warning"
-#~ msgstr "Alerte Vim"
+#, c-format
+msgid "E919: Directory not found in '%s': \"%s\""
+msgstr "E919: R้pertoire introuvable dans '%s' : \"%s\""
-#~ msgid "Error file"
-#~ msgstr "Fichier d'erreurs"
+msgid "E952: Autocommand caused recursive behavior"
+msgstr "E952: Une autocommande a caus้ une r้cursivit้"
-#~ msgid "E868: Error building NFA with equivalence class!"
-#~ msgstr ""
-#~ "E868: Erreur lors de la construction du NFA avec classe d'้quivalence"
+msgid "search hit TOP, continuing at BOTTOM"
+msgstr "La recherche a atteint le HAUT, et continue en BAS"
-#~ msgid "E878: (NFA) Could not allocate memory for branch traversal!"
-#~ msgstr ""
-#~ "E878: (NFA) Impossible d'allouer la m้moire pour parcourir les branches!"
+msgid "search hit BOTTOM, continuing at TOP"
+msgstr "La recherche a atteint le BAS, et continue en HAUT"
-#~ msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\""
-#~ msgstr ""
-#~ "Alerte : Liste de mots \"%s_%s.spl\" ou \"%s_ascii.spl\" introuvable"
+#, c-format
+msgid "Need encryption key for \"%s\""
+msgstr "Besoin de la cl้ de chiffrement pour \"%s\""
-#~ msgid "Conversion in %s not supported"
-#~ msgstr "La conversion dans %s non support้e"
+msgid "empty keys are not allowed"
+msgstr "les cl้s vides ne sont pas autoris้es"
-#~ msgid "E845: Insufficient memory, word list will be incomplete"
-#~ msgstr "E845: m้moire insuffisante, liste de mots peut-๊tre incompl่te"
+msgid "dictionary is locked"
+msgstr "dictionnaire est verrouill้"
-#~ msgid "E430: Tag file path truncated for %s\n"
-#~ msgstr "E430: Chemin de fichiers de marqueurs tronqu้ pour %s\n"
+msgid "list is locked"
+msgstr "liste verrouill้e"
-#~ msgid "new shell started\n"
-#~ msgstr "nouveau shell d้marr้\n"
+#, c-format
+msgid "failed to add key '%s' to dictionary"
+msgstr "l'ajout de cl้ '%s' au dictionnaire a ้chou้"
-# DB - Message de d้bogage.
-#~ msgid "Used CUT_BUFFER0 instead of empty selection"
-#~ msgstr "CUT_BUFFER0 utilis้ plut๔t qu'une s้lection vide"
+#, c-format
+msgid "index must be int or slice, not %s"
+msgstr "index doit ๊tre int ou slice, et non %s"
-# DB - Question O/N.
-#~ msgid "No undo possible; continue anyway"
-#~ msgstr "Annulation impossible ; continuer"
-
-#~ msgid "E832: Non-encrypted file has encrypted undo file: %s"
-#~ msgstr "E832: Fichier non-chiffr้ a un fichier d'annulations chiffr้ : %s"
-
-#~ msgid "E826: Undo file decryption failed: %s"
-#~ msgstr "E826: D้chiffrage du fichier d'annulation a ้chou้ : %s"
-
-#~ msgid "E827: Undo file is encrypted: %s"
-#~ msgstr "E827: Le fichier d'annulations est chiffr้ : %s"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16/32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "Version graphique MS-Windows 16/32 bits"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "Version graphique MS-Windows 64 bits"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "Version graphique MS-Windows 32 bits"
-
-#~ msgid " in Win32s mode"
-#~ msgstr " lanc้e en mode Win32s"
-
-#~ msgid " with OLE support"
-#~ msgstr " supportant l'OLE"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "Version console MS-Windows 64 bits"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "Version console MS-Windows 32 bits"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16-bit version"
-#~ msgstr ""
-#~ "\n"
-#~ "Version MS-Windows 16 bits"
-
-#~ msgid ""
-#~ "\n"
-#~ "32-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "Version MS-DOS 32 bits"
-
-#~ msgid ""
-#~ "\n"
-#~ "16-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "Version MS-DOS 16 bits"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X (unix) version"
-#~ msgstr ""
-#~ "\n"
-#~ "Version MaxOS X (unix)"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X version"
-#~ msgstr ""
-#~ "\n"
-#~ "Version MacOS X"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "Version MacOS"
-
-#~ msgid ""
-#~ "\n"
-#~ "OpenVMS version"
-#~ msgstr ""
-#~ "\n"
-#~ "Version OpenVMS"
-
-#~ msgid ""
-#~ "\n"
-#~ "Big version "
-#~ msgstr ""
-#~ "\n"
-#~ "Grosse version "
-
-#~ msgid ""
-#~ "\n"
-#~ "Normal version "
-#~ msgstr ""
-#~ "\n"
-#~ "Version normale "
-
-#~ msgid ""
-#~ "\n"
-#~ "Small version "
-#~ msgstr ""
-#~ "\n"
-#~ "Petite version "
-
-#~ msgid ""
-#~ "\n"
-#~ "Tiny version "
-#~ msgstr ""
-#~ "\n"
-#~ "Version minuscule "
-
-#~ msgid "with GTK2-GNOME GUI."
-#~ msgstr "avec interface graphique GTK2-GNOME."
-
-#~ msgid "with GTK2 GUI."
-#~ msgstr "avec interface graphique GTK2."
-
-#~ msgid "with X11-Motif GUI."
-#~ msgstr "avec interface graphique X11-Motif."
-
-#~ msgid "with X11-neXtaw GUI."
-#~ msgstr "avec interface graphique X11-neXtaw."
-
-#~ msgid "with X11-Athena GUI."
-#~ msgstr "avec interface graphique X11-Athena."
-
-#~ msgid "with Photon GUI."
-#~ msgstr "avec interface graphique Photon."
-
-#~ msgid "with GUI."
-#~ msgstr "avec une interface graphique."
-
-#~ msgid "with Carbon GUI."
-#~ msgstr "avec interface graphique Carbon."
-
-#~ msgid "with Cocoa GUI."
-#~ msgstr "avec interface graphique Cocoa."
-
-#~ msgid "with (classic) GUI."
-#~ msgstr "avec interface graphique (classic)."
-
-#~ msgid " system gvimrc file: \""
-#~ msgstr " fichier gvimrc syst่me : \""
-
-#~ msgid " user gvimrc file: \""
-#~ msgstr " fichier gvimrc utilisateur : \""
-
-#~ msgid "2nd user gvimrc file: \""
-#~ msgstr "2me fichier gvimrc utilisateur : \""
-
-#~ msgid "3rd user gvimrc file: \""
-#~ msgstr "3me fichier gvimrc utilisateur : \""
-
-#~ msgid " system menu file: \""
-#~ msgstr " fichier menu syst่me : \""
-
-#~ msgid "Compiler: "
-#~ msgstr "Compilateur : "
+#, c-format
+msgid "expected str() or unicode() instance, but got %s"
+msgstr "attendu instance de str() ou unicode(), mais re็u %s"
-#~ msgid "menu Help->Orphans for information "
-#~ msgstr "menu Aide->Orphelins pour plus d'info"
+#, c-format
+msgid "expected bytes() or str() instance, but got %s"
+msgstr "attendu instance de bytes() ou str(), mais re็u %s"
-#~ msgid "Running modeless, typed text is inserted"
-#~ msgstr "Les modes sont d้sactiv้s, le texte saisi est ins้r้"
+#, c-format
+msgid ""
+"expected int(), long() or something supporting coercing to long(), but got %s"
+msgstr ""
+"attendu int(), long() ou quelque chose qui peut ๊tre transform้ en long(), "
+"mais re็u %s"
-#~ msgid "menu Edit->Global Settings->Toggle Insert Mode "
-#~ msgstr "menu ษdition->R้glages Globaux->Insertion Permanente"
+#, c-format
+msgid "expected int() or something supporting coercing to int(), but got %s"
+msgstr ""
+"attendu int() ou quelque chose qui peut ๊tre transform้ en int(), mais re็u "
+"%s"
-# DB - todo
-#~ msgid " for two modes "
-#~ msgstr " pour les modes "
+msgid "value is too large to fit into C int type"
+msgstr "valeur trop grande pour ๊tre stock้e dans le type C int"
-# DB - todo
-#~ msgid "menu Edit->Global Settings->Toggle Vi Compatible"
-#~ msgstr "menu ษdition->R้glages Globaux->Compatibilit้ Vi"
+msgid "value is too small to fit into C int type"
+msgstr "valeur trop petite pour ๊tre stock้e dans le type C int"
-# DB - todo
-#~ msgid " for Vim defaults "
-#~ msgstr " pour d้f. de Vim "
+msgid "number must be greater than zero"
+msgstr "le nombre doit ๊tre plus grand que z้ro"
-#~ msgid "WARNING: Windows 95/98/ME detected"
-#~ msgstr "ALERTE: Windows 95/98/ME d้tect้"
+msgid "number must be greater or equal to zero"
+msgstr "le nombre doit ๊tre plus grand ou ้gal เ z้ro"
-#~ msgid "type :help windows95<Enter> for info on this"
-#~ msgstr "tapez :help windows95<Entr้e> pour plus d'information"
+msgid "can't delete OutputObject attributes"
+msgstr "impossible d'effacer les attributs d'OutputObject"
-#~ msgid "E370: Could not load library %s"
-#~ msgstr "E370: Impossible de charger la biblioth่que %s"
+#, c-format
+msgid "invalid attribute: %s"
+msgstr "attribut invalide : %s"
-#~ msgid ""
-#~ "Sorry, this command is disabled: the Perl library could not be loaded."
-#~ msgstr ""
-#~ "D้sol้, commande d้sactiv้e : la biblioth่que Perl n'a pas pu ๊tre "
-#~ "charg้e."
+msgid "E264: Python: Error initialising I/O objects"
+msgstr "E264: Python : Erreur d'initialisation des objets d'E/S"
-#~ msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
-#~ msgstr ""
-#~ "E299: ษvaluation Perl interdite dans bac เ sable sans le module Safe"
+msgid "failed to change directory"
+msgstr "changement de r้pertoire a ้chou้"
-#~ msgid "Edit with &multiple Vims"
-#~ msgstr "ษditer dans &plusieurs Vims"
+#, c-format
+msgid "expected 3-tuple as imp.find_module() result, but got %s"
+msgstr "attendu un 3-tuple comme r้sultat de imp.find_module(), mais re็u %s"
-#~ msgid "Edit with single &Vim"
-#~ msgstr "ษditer dans un seul &Vim"
+#, c-format
+msgid "expected 3-tuple as imp.find_module() result, but got tuple of size %d"
+msgstr ""
+"attendu un 3-tuple comme r้sultat de imp.find_module(), mais re็u un tuple "
+"de taille %d"
-#~ msgid "Diff with Vim"
-#~ msgstr "&Comparer avec Vim"
+msgid "internal error: imp.find_module returned tuple with NULL"
+msgstr "erreur interne : imp.find_module a retourn้ un tuple contenant NULL"
-#~ msgid "Edit with &Vim"
-#~ msgstr "ษditer dans &Vim"
+msgid "cannot delete vim.Dictionary attributes"
+msgstr "impossible d'effacer les attributs de vim.Dictionary"
-#~ msgid "Edit with existing Vim - "
-#~ msgstr "ษditer dans le Vim existant - "
+msgid "cannot modify fixed dictionary"
+msgstr "impossible de modifier un dictionnaire fixe"
-#~ msgid "Edits the selected file(s) with Vim"
-#~ msgstr "ษdites le(s) fichier(s) s้lectionn้(s) avec Vim"
+#, c-format
+msgid "cannot set attribute %s"
+msgstr "impossible d'initialiser l'attribut %s"
-# DB - MessageBox win32, la longueur n'est pas un probl่me !
-#~ msgid "Error creating process: Check if gvim is in your path!"
-#~ msgstr ""
-#~ "Erreur de cr้ation du processus : v้rifiez que gvim est bien dans votre "
-#~ "chemin !"
+msgid "hashtab changed during iteration"
+msgstr "la table de hachage a ้t้ chang้e pendant une it้ration"
-#~ msgid "gvimext.dll error"
-#~ msgstr "Erreur de gvimext.dll"
+#, c-format
+msgid "expected sequence element of size 2, but got sequence of size %d"
+msgstr ""
+"attendu une s้quence d'้l้ments de taille 2, mais re็u une s้quence de "
+"taille %d"
-#~ msgid "Path length too long!"
-#~ msgstr "Le chemin est trop long !"
+msgid "list constructor does not accept keyword arguments"
+msgstr "le constructeur de liste n'accepte pas les arguments nomm้s"
-#~ msgid "E234: Unknown fontset: %s"
-#~ msgstr "E234: Jeu de police inconnu : %s"
+msgid "list index out of range"
+msgstr "index de liste hors limites"
-#~ msgid "E235: Unknown font: %s"
-#~ msgstr "E235: Police inconnue : %s"
+#, c-format
+msgid "internal error: failed to get vim list item %d"
+msgstr "erreur interne : acc่s เ un ้l้ment %d de liste a ้chou้"
-#~ msgid "E236: Font \"%s\" is not fixed-width"
-#~ msgstr "E236: La police \"%s\" n'a pas une chasse (largeur) fixe"
+msgid "slice step cannot be zero"
+msgstr "le pas du d้coupage en tranche ne peut pas ๊tre z้ro"
-#~ msgid "E448: Could not load library function %s"
-#~ msgstr "E448: Impossible de charger la fonction %s de la biblioth่que"
+#, c-format
+msgid "attempt to assign sequence of size greater than %d to extended slice"
+msgstr ""
+"tentative d'assigner une s้quence de taille plus grande que %d เ un "
+"d้coupage en tranche ้tendu "
-#~ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
-#~ msgstr ""
-#~ "E26: Le support de l'h้breu n'a pas ้t้ compil้ dans cette version\n"
+#, c-format
+msgid "internal error: no vim list item %d"
+msgstr "erreur interne : pas d'้l้ment %d de liste vim"
-#~ msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
-#~ msgstr "E27: Le support du farsi n'a pas ้t้ compil้ dans cette version\n"
+msgid "internal error: not enough list items"
+msgstr "erreur interne : pas assez d'้l้ments de liste"
-#~ msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
-#~ msgstr ""
-#~ "E800: Le support de l'arabe n'a pas ้t้ compil้ dans cette version\n"
+msgid "internal error: failed to add item to list"
+msgstr "erreur interne : ajout d'้l้ment เ la liste a ้chou้"
-#~ msgid "E247: no registered server named \"%s\""
-#~ msgstr "E247: aucun serveur nomm้ \"%s\" n'est enregistr้"
+#, c-format
+msgid "attempt to assign sequence of size %d to extended slice of size %d"
+msgstr ""
+"tentative d'assigner une s้quence de taille %d เ un d้coupage en tranche "
+"้tendu de taille %d"
-#~ msgid "E233: cannot open display"
-#~ msgstr "E233: ouverture du display impossible"
+msgid "failed to add item to list"
+msgstr "ajout เ la liste a ้chou้"
-#~ msgid "E449: Invalid expression received"
-#~ msgstr "E449: Expression invalide re็ue"
+msgid "cannot delete vim.List attributes"
+msgstr "impossible d'effacer les attributs de vim.List"
-#~ msgid "E463: Region is guarded, cannot modify"
-#~ msgstr "E463: Cette zone est verrouill้e et ne peut pas ๊tre modifi้e"
+msgid "cannot modify fixed list"
+msgstr "impossible de modifier une liste fixe"
-#~ msgid "E744: NetBeans does not allow changes in read-only files"
-#~ msgstr ""
-#~ "E744: NetBeans n'autorise pas la modification des fichiers en lecture "
-#~ "seule"
+#, c-format
+msgid "unnamed function %s does not exist"
+msgstr "la fonction sans nom %s n'existe pas"
-#~ msgid "Need encryption key for \"%s\""
-#~ msgstr "Besoin de la cl้ de chiffrement pour \"%s\""
+#, c-format
+msgid "function %s does not exist"
+msgstr "la fonction %s n'existe pas"
-#~ msgid "can't delete OutputObject attributes"
-#~ msgstr "impossible d'effacer les attributs d'OutputObject"
+#, c-format
+msgid "failed to run function %s"
+msgstr "ex้cution de la fonction %s a ้chou้"
-#~ msgid "invalid attribute"
-#~ msgstr "attribut invalide"
+msgid "unable to get option value"
+msgstr "impossible d'obtenir la valeur d'une option"
-#~ msgid "E264: Python: Error initialising I/O objects"
-#~ msgstr "E264: Python : Erreur d'initialisation des objets d'E/S"
+msgid "internal error: unknown option type"
+msgstr "erreur interne : type d'option inconnu"
-#~ msgid "empty keys are not allowed"
-#~ msgstr "les cl้s vides ne sont pas autoris้es"
+msgid "problem while switching windows"
+msgstr "probl่me lors du changement de fen๊tres"
-#~ msgid "Cannot modify fixed dictionary"
-#~ msgstr "Impossible de modifier un dictionnaire fixe"
+#, c-format
+msgid "unable to unset global option %s"
+msgstr "impossible de d้sactiver une option globale %s"
-#~ msgid "dict is locked"
-#~ msgstr "dictionnaire est verrouill้"
+#, c-format
+msgid "unable to unset option %s which does not have global value"
+msgstr "impossible de d้sactiver l'option %s qui n'a pas de valeur globale"
-#~ msgid "failed to add key to dictionary"
-#~ msgstr "l'ajout de cl้ au dictionnaire a ้chou้"
+msgid "attempt to refer to deleted tab page"
+msgstr "tentative de r้f้rencer un onglet effac้"
-#~ msgid "list index out of range"
-#~ msgstr "index de liste hors limites"
+msgid "no such tab page"
+msgstr "cet onglet n'existe pas"
-#~ msgid "internal error: failed to get vim list item"
-#~ msgstr "erreur interne : acc่s เ un ้l้ment de liste a ้chou้"
+msgid "attempt to refer to deleted window"
+msgstr "tentative de r้f้rencer une fen๊tre effac้e"
-#~ msgid "list is locked"
-#~ msgstr "liste verrouill้e"
+msgid "readonly attribute: buffer"
+msgstr "attribut en lecture seule : tampon"
-#~ msgid "Failed to add item to list"
-#~ msgstr "Ajout เ la liste a ้chou้"
+msgid "cursor position outside buffer"
+msgstr "curseur positionn้ en dehors du tampon"
-#~ msgid "internal error: failed to add item to list"
-#~ msgstr "erreur interne : ajout d'้l้ment เ la liste a ้chou้"
+msgid "no such window"
+msgstr "Cette fen๊tre n'existe pas"
-#~ msgid "cannot delete vim.dictionary attributes"
-#~ msgstr "impossible d'effacer les attributs de vim.dictionary"
+msgid "attempt to refer to deleted buffer"
+msgstr "tentative de r้f้rencer un tampon effac้"
-#~ msgid "cannot modify fixed list"
-#~ msgstr "impossible de modifier une liste fixe"
+msgid "failed to rename buffer"
+msgstr "impossible de renommer le tampon"
-#~ msgid "cannot set this attribute"
-#~ msgstr "impossible d'initialiser cet attribut"
+msgid "mark name must be a single character"
+msgstr "le nom de marque doit ๊tre un seul caract่re"
-#~ msgid "failed to run function"
-#~ msgstr "ex้cution de la fonction a ้chou้"
+#, c-format
+msgid "expected vim.Buffer object, but got %s"
+msgstr "attendu un objet vim.Buffer, mais re็u %s"
-#~ msgid "unable to unset global option"
-#~ msgstr "impossible de d้sactiver une option globale"
+#, c-format
+msgid "failed to switch to buffer %d"
+msgstr "impossible de se d้placer au tampon %d"
-#~ msgid "unable to unset option without global value"
-#~ msgstr "impossible de d้sactiver une option sans une valeur globale"
+#, c-format
+msgid "expected vim.Window object, but got %s"
+msgstr "attendu un objet vim.Window, mais re็u %s"
-#~ msgid "attempt to refer to deleted tab page"
-#~ msgstr "tentative de r้f้rencer un onglet effac้"
+msgid "failed to find window in the current tab page"
+msgstr "impossible de trouver une fen๊tre dans l'onglet courant"
-#~ msgid "no such tab page"
-#~ msgstr "cet onglet n'existe pas"
+msgid "did not switch to the specified window"
+msgstr "ne s'est pas d้plac้ เ la fen๊tre sp้cifi้e"
-#~ msgid "attempt to refer to deleted window"
-#~ msgstr "tentative de r้f้rencer une fen๊tre effac้e"
+#, c-format
+msgid "expected vim.TabPage object, but got %s"
+msgstr "attendu un objet vim.TabPage, mais re็u %s"
-#~ msgid "readonly attribute"
-#~ msgstr "attribut en lecture seule"
+msgid "did not switch to the specified tab page"
+msgstr "impossible de se d้placer เ l'onglet sp้cifi้"
-#~ msgid "cursor position outside buffer"
-#~ msgstr "curseur positionn้ en dehors du tampon"
+msgid "failed to run the code"
+msgstr "ex้cution du code a ้chou้"
-#~ msgid "no such window"
-#~ msgstr "Cette fen๊tre n'existe pas"
+msgid "E858: Eval did not return a valid python object"
+msgstr "E858: Eval n'a pas retourn้ un objet python valide"
-#~ msgid "attempt to refer to deleted buffer"
-#~ msgstr "tentative de r้f้rencer un tampon effac้"
+msgid "E859: Failed to convert returned python object to vim value"
+msgstr "E859: Conversion d'objet python เ une valeur de vim a ้chou้"
-#~ msgid "expected vim.buffer object"
-#~ msgstr "objet vim.buffer attendu"
+#, c-format
+msgid "unable to convert %s to vim dictionary"
+msgstr "impossible de convertir %s เ un dictionnaire vim"
-#~ msgid "failed to switch to given buffer"
-#~ msgstr "impossible de se d้placer au tampon donn้"
+#, c-format
+msgid "unable to convert %s to vim list"
+msgstr "impossible de convertir %s เ une liste de vim"
-#~ msgid "expected vim.window object"
-#~ msgstr "objet vim.window attendu"
+#, c-format
+msgid "unable to convert %s to vim structure"
+msgstr "impossible de convertir %s เ une structure de vim"
-#~ msgid "failed to find window in the current tab page"
-#~ msgstr "impossible de trouver une fen๊tre dans l'onglet courant"
+msgid "internal error: NULL reference passed"
+msgstr "erreur interne : r้f้rence NULL pass้e"
-#~ msgid "did not switch to the specified window"
-#~ msgstr "ne s'est pas d้plac้ เ la fen๊tre sp้cifi้e"
+msgid "internal error: invalid value type"
+msgstr "erreur interne : type de valeur invalide"
-#~ msgid "expected vim.tabpage object"
-#~ msgstr "objet vim.tabpage attendu"
+msgid ""
+"Failed to set path hook: sys.path_hooks is not a list\n"
+"You should now do the following:\n"
+"- append vim.path_hook to sys.path_hooks\n"
+"- append vim.VIM_SPECIAL_PATH to sys.path\n"
+msgstr ""
+"Impossible d'initialiser sys.path_hook qui n'est pas un liste\n"
+"Vous devez maintenant :\n"
+"- ajouter vim.path_hook เ sys.path_hooks\n"
+"- ajouter vim.VIM_SPECIAL_PATH เ sys.path\n"
-#~ msgid "did not switch to the specified tab page"
-#~ msgstr "impossible de se d้placer เ l'onglet sp้cifi้"
+msgid ""
+"Failed to set path: sys.path is not a list\n"
+"You should now append vim.VIM_SPECIAL_PATH to sys.path"
+msgstr ""
+"Impossible d'initialiser le chemin : sys.math n'est pas une liste\n"
+"Vous devez maintenant ajouter vim.VIM_SPECIAL_PATH เ sys.path"
-#~ msgid "failed to run the code"
-#~ msgstr "ex้cution du code a ้chou้"
+msgid ""
+"Vim macro files (*.vim)\t*.vim\n"
+"All Files (*.*)\t*.*\n"
+msgstr ""
+"Fichiers de macros Vim (*.vim)\t*.vim\n"
+"Tous les fichiers (*.*)\t*.*\n"
-#~ msgid "E858: Eval did not return a valid python object"
-#~ msgstr "E858: Eval n'a pas retourn้ un objet python valide"
+msgid "All Files (*.*)\t*.*\n"
+msgstr "Tous les fichiers (*.)\t*.*\n"
-#~ msgid "E859: Failed to convert returned python object to vim value"
-#~ msgstr "E859: Conversion d'objet python เ une valeur de vim a ้chou้"
+msgid ""
+"All Files (*.*)\t*.*\n"
+"C source (*.c, *.h)\t*.c;*.h\n"
+"C++ source (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
+"VB code (*.bas, *.frm)\t*.bas;*.frm\n"
+"Vim files (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
+msgstr ""
+"Tous les fichiers (*.*)\t*.*\n"
+"Source C (*.c, *.h)\t*.c;*.h\n"
+"Source C++ (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
+"Code VB (*.bas, *.frm)\t*.bas;*.frm\n"
+"Fichiers Vim (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
-#~ msgid "unable to convert to vim structure"
-#~ msgstr "conversion เ une structure vim impossible"
+msgid ""
+"Vim macro files (*.vim)\t*.vim\n"
+"All Files (*)\t*\n"
+msgstr ""
+"Fichiers de macros Vim (*.vim)\t*.vim\n"
+"Tous les fichiers (*)\t*\n"
-#~ msgid "NULL reference passed"
-#~ msgstr "r้f้rence NULL pass้e"
+msgid "All Files (*)\t*\n"
+msgstr "Tous les fichiers (*)\t*\n"
-#~ msgid "internal error: invalid value type"
-#~ msgstr "erreur interne : type de valeur invalide"
+msgid ""
+"All Files (*)\t*\n"
+"C source (*.c, *.h)\t*.c;*.h\n"
+"C++ source (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
+"Vim files (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
+msgstr ""
+"Tous les fichiers (*)\t*\n"
+"Source C (*.c, *.h)\t*.c;*.h\n"
+"Source C++ (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
+"Fichiers Vim (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
diff --git a/src/nvim/po/ga.po b/src/nvim/po/ga.po
index f7117c6e86..617b805eb8 100644
--- a/src/nvim/po/ga.po
+++ b/src/nvim/po/ga.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: vim 7.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-05-26 14:21+0200\n"
+"POT-Creation-Date: 2017-07-11 15:45-0500\n"
"PO-Revision-Date: 2010-04-14 10:01-0500\n"
"Last-Translator: Kevin Patrick Scannell <kscanne@gmail.com>\n"
"Language-Team: Irish <gaeilge-gnulinux@lists.sourceforge.net>\n"
@@ -14,208 +14,171 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :"
+"(n>6 && n<11) ? 3 : 4;\n"
-#: ../api/private/helpers.c:201
-#, fuzzy
-msgid "Unable to get option value"
-msgstr "Dramhaํl i ndiaidh arg๓inte rogha"
+msgid "E831: bf_key_init() called with empty password"
+msgstr "E831: cuireadh glaoch ar bf_key_init() le focal faire folamh"
-#: ../api/private/helpers.c:204
-msgid "internal error: unknown option type"
-msgstr ""
+msgid "E820: sizeof(uint32_t) != 4"
+msgstr "E820: sizeof(uint32_t) != 4"
+
+msgid "E817: Blowfish big/little endian use wrong"
+msgstr "E817: ฺsแid mhํcheart Blowfish m๓rcheannach/caolcheannach"
+
+msgid "E818: sha256 test failed"
+msgstr "E818: Theip ar thแstแil sha256"
+
+msgid "E819: Blowfish test failed"
+msgstr "E819: Theip ar thแstแil Blowfish"
-#: ../buffer.c:92
msgid "[Location List]"
msgstr "[Liosta Suํomh]"
-#: ../buffer.c:93
msgid "[Quickfix List]"
-msgstr "[Liosta Ceart๚chแn Tapa]"
+msgstr "[Liosta Mearcheart๚chแn]"
-#: ../buffer.c:94
-#, fuzzy
msgid "E855: Autocommands caused command to abort"
-msgstr "E812: Bhํ maolแn n๓ ainm maolแin athraithe ag orduithe uathoibrํocha"
+msgstr "E855: Tobscoireadh an t-ord๚ mar gheall ar uathorduithe"
-#: ../buffer.c:135
msgid "E82: Cannot allocate any buffer, exiting..."
msgstr "E82: Nํ f้idir maolแn a dhแileadh, ag scor..."
-#: ../buffer.c:138
msgid "E83: Cannot allocate buffer, using other one..."
msgstr "E83: Nํ f้idir maolแn a dhแileadh, ag ๚sแid cinn eile..."
-#: ../buffer.c:763
+msgid "E931: Buffer cannot be registered"
+msgstr "E931: Nํ f้idir an maolแn a chlแr๚"
+
+msgid "E937: Attempt to delete a buffer that is in use"
+msgstr "E937: Iarracht ar mhaolแn in ๚sแid a scriosadh"
+
msgid "E515: No buffers were unloaded"
msgstr "E515: Nํ raibh aon mhaolแn dํluchtaithe"
-#: ../buffer.c:765
msgid "E516: No buffers were deleted"
msgstr "E516: Nํ raibh aon mhaolแn scriosta"
-#: ../buffer.c:767
msgid "E517: No buffers were wiped out"
msgstr "E517: Nํ raibh aon mhaolแn bแnaithe"
-#: ../buffer.c:772
msgid "1 buffer unloaded"
msgstr "Bhํ maolแn amhแin dํluchtaithe"
-#: ../buffer.c:774
#, c-format
msgid "%d buffers unloaded"
msgstr "%d maolแn folmhaithe"
-#: ../buffer.c:777
msgid "1 buffer deleted"
msgstr "Bhํ maolแn amhแin scriosta"
-#: ../buffer.c:779
#, c-format
msgid "%d buffers deleted"
msgstr "%d maolแn scriosta"
-#: ../buffer.c:782
msgid "1 buffer wiped out"
msgstr "Bhํ maolแn amhแin bแnaithe"
-#: ../buffer.c:784
#, c-format
msgid "%d buffers wiped out"
msgstr "%d maolแn bแnaithe"
-#: ../buffer.c:806
msgid "E90: Cannot unload last buffer"
msgstr "E90: Nํ f้idir an maolแn deireanach a dhํlucht๚"
-#: ../buffer.c:874
msgid "E84: No modified buffer found"
msgstr "E84: Nํor aimsํodh maolแn mionathraithe"
#. back where we started, didn't find anything.
-#: ../buffer.c:903
msgid "E85: There is no listed buffer"
msgstr "E85: Nํl aon mhaolแn liostaithe ann"
-#: ../buffer.c:913
-#, c-format
-msgid "E86: Buffer %<PRId64> does not exist"
-msgstr "E86: Nํl a leith้id de mhaolแn %<PRId64>"
-
-#: ../buffer.c:915
msgid "E87: Cannot go beyond last buffer"
msgstr "E87: Nํ f้idir a dhul thar an maolแn deireanach"
-#: ../buffer.c:917
msgid "E88: Cannot go before first buffer"
msgstr "E88: Nํ f้idir a dhul roimh an ch้ad mhaolแn"
-#: ../buffer.c:945
#, c-format
-msgid ""
-"E89: No write since last change for buffer %<PRId64> (add ! to override)"
+msgid "E89: No write since last change for buffer %ld (add ! to override)"
msgstr ""
-"E89: Athraํodh maolแn %<PRId64> ach nach bhfuil s้ sแbhแilte ๓ shin (cuir ! "
-"leis an ord๚ chun sแr๚)"
+"E89: Athraํodh maolแn %ld ach nach bhfuil s้ sแbhแilte ๓ shin (cuir ! leis "
+"an ord๚ chun sแr๚)"
-#. wrap around (may cause duplicates)
-#: ../buffer.c:1423
msgid "W14: Warning: List of file names overflow"
msgstr "W14: Rabhadh: Liosta ainmneacha comhaid thar maoil"
-#: ../buffer.c:1555 ../quickfix.c:3361
#, c-format
-msgid "E92: Buffer %<PRId64> not found"
-msgstr "E92: Maolแn %<PRId64> gan aimsi๚"
+msgid "E92: Buffer %ld not found"
+msgstr "E92: Maolแn %ld gan aimsi๚"
-#: ../buffer.c:1798
#, c-format
msgid "E93: More than one match for %s"
msgstr "E93: Nํos m๓ nแ teaghrแn amhแin comhoiri๚naithe le %s"
-#: ../buffer.c:1800
#, c-format
msgid "E94: No matching buffer for %s"
msgstr "E94: Nํl aon mhaolแn comhoiri๚naithe le %s"
-#: ../buffer.c:2161
#, c-format
-msgid "line %<PRId64>"
-msgstr "lํne %<PRId64>:"
+msgid "line %ld"
+msgstr "lํne %ld:"
-#: ../buffer.c:2233
msgid "E95: Buffer with this name already exists"
msgstr "E95: Tแ maolแn ann leis an ainm seo cheana"
-#: ../buffer.c:2498
msgid " [Modified]"
msgstr " [Mionathraithe]"
-#: ../buffer.c:2501
msgid "[Not edited]"
msgstr "[Gan eagr๚]"
-#: ../buffer.c:2504
msgid "[New file]"
msgstr "[Comhad nua]"
-#: ../buffer.c:2505
msgid "[Read errors]"
msgstr "[Earrแidํ l้imh]"
-#: ../buffer.c:2506 ../buffer.c:3217 ../fileio.c:1807 ../screen.c:4895
msgid "[RO]"
msgstr "[L-A]"
-#: ../buffer.c:2507 ../fileio.c:1807
msgid "[readonly]"
msgstr "[inl้ite amhแin]"
-#: ../buffer.c:2524
#, c-format
msgid "1 line --%d%%--"
msgstr "1 lํne --%d%%--"
-#: ../buffer.c:2526
#, c-format
-msgid "%<PRId64> lines --%d%%--"
-msgstr "%<PRId64> lํne --%d%%--"
+msgid "%ld lines --%d%%--"
+msgstr "%ld lํne --%d%%--"
-#: ../buffer.c:2530
#, c-format
-msgid "line %<PRId64> of %<PRId64> --%d%%-- col "
-msgstr "lํne %<PRId64> de %<PRId64> --%d%%-- col "
+msgid "line %ld of %ld --%d%%-- col "
+msgstr "lํne %ld de %ld --%d%%-- col "
-#: ../buffer.c:2632 ../buffer.c:4292 ../memline.c:1554
msgid "[No Name]"
msgstr "[Gan Ainm]"
#. must be a help buffer
-#: ../buffer.c:2667
msgid "help"
msgstr "cabhair"
-#: ../buffer.c:3225 ../screen.c:4883
msgid "[Help]"
msgstr "[Cabhair]"
-#: ../buffer.c:3254 ../screen.c:4887
msgid "[Preview]"
msgstr "[R้amhamharc]"
-#: ../buffer.c:3528
msgid "All"
msgstr "Uile"
-#: ../buffer.c:3528
msgid "Bot"
msgstr "Bun"
-#: ../buffer.c:3531
msgid "Top"
msgstr "Barr"
-#: ../buffer.c:4244
msgid ""
"\n"
"# Buffer list:\n"
@@ -223,11 +186,9 @@ msgstr ""
"\n"
"# Liosta maolแin:\n"
-#: ../buffer.c:4289
msgid "[Scratch]"
msgstr "[Sealadach]"
-#: ../buffer.c:4529
msgid ""
"\n"
"--- Signs ---"
@@ -235,202 +196,240 @@ msgstr ""
"\n"
"--- Comharthaํ ---"
-#: ../buffer.c:4538
#, c-format
msgid "Signs for %s:"
msgstr "Comharthaํ do %s:"
-#: ../buffer.c:4543
#, c-format
-msgid " line=%<PRId64> id=%d name=%s"
-msgstr " lํne=%<PRId64> id=%d ainm=%s"
+msgid " line=%ld id=%d name=%s"
+msgstr " lํne=%ld id=%d ainm=%s"
-#: ../cursor_shape.c:68
-msgid "E545: Missing colon"
-msgstr "E545: Idirstad ar iarraidh"
+msgid "E902: Cannot connect to port"
+msgstr "E902: Nํ f้idir ceangal leis an bport"
-#: ../cursor_shape.c:70 ../cursor_shape.c:94
-msgid "E546: Illegal mode"
-msgstr "E546: M๓d neamhcheadaithe"
+msgid "E901: gethostbyname() in channel_open()"
+msgstr "E901: gethostbyname() in channel_open()"
-#: ../cursor_shape.c:134
-msgid "E548: digit expected"
-msgstr "E548: ag s๚il le digit"
+msgid "E898: socket() in channel_open()"
+msgstr "E898: socket() in channel_open()"
-#: ../cursor_shape.c:138
-msgid "E549: Illegal percentage"
-msgstr "E549: C้atadแn neamhcheadaithe"
+msgid "E903: received command with non-string argument"
+msgstr "E903: fuarthas ord๚ le harg๓int nach bhfuil ina theaghrแn"
+
+msgid "E904: last argument for expr/call must be a number"
+msgstr "E904: nํ m๓r don arg๓int dheireanach ar expr/call a bheith ina huimhir"
+
+msgid "E904: third argument for call must be a list"
+msgstr "E904: Caithfidh an trํ๚ arg๓int a bheith ina liosta"
+
+#, c-format
+msgid "E905: received unknown command: %s"
+msgstr "E905: fuarthas ord๚ anaithnid: %s"
+
+#, c-format
+msgid "E630: %s(): write while not connected"
+msgstr "E630: %s(): scrํobh gan ceangal a bheith ann"
+
+#, c-format
+msgid "E631: %s(): write failed"
+msgstr "E631: %s(): theip ar scrํobh"
-#: ../diff.c:146
#, c-format
-msgid "E96: Can not diff more than %<PRId64> buffers"
-msgstr "E96: Nํ f้idir diff a dh้anamh ar nํos m๓ nแ %<PRId64> maolแn"
+msgid "E917: Cannot use a callback with %s()"
+msgstr "E917: Nํ f้idir aisghlaoch a ๚sแid le %s()"
+
+msgid "E912: cannot use ch_evalexpr()/ch_sendexpr() with a raw or nl channel"
+msgstr ""
+"E912: nํ f้idir ch_evalexpr()/ch_sendexpr() a ๚sแid le cain้al raw n๓ nl"
+
+msgid "E906: not an open channel"
+msgstr "E906: nํ cain้al oscailte ้"
+
+msgid "E920: _io file requires _name to be set"
+msgstr "E920: caithfear _name a shocr๚ chun comhad _io a ๚sแid"
+
+msgid "E915: in_io buffer requires in_buf or in_name to be set"
+msgstr "E915: caithfear in_buf n๓ in_name a shocr๚ chun maolแn in_io a ๚sแid"
+
+#, c-format
+msgid "E918: buffer must be loaded: %s"
+msgstr "E918: nํ m๓r an maolแn a lucht๚: %s"
+
+msgid "E821: File is encrypted with unknown method"
+msgstr "E821: Comhad criptithe le modh anaithnid"
+
+msgid "Warning: Using a weak encryption method; see :help 'cm'"
+msgstr "Rabhadh: Cripti๚chแn lag; f้ach :help 'cm'"
+
+msgid "Enter encryption key: "
+msgstr "Iontrแil eochair chripti๚chแin: "
+
+msgid "Enter same key again: "
+msgstr "Iontrแil an eochair arํs: "
+
+msgid "Keys don't match!"
+msgstr "Nํl na heochracha comhoiri๚nach le ch้ile!"
+
+msgid "[crypted]"
+msgstr "[criptithe]"
+
+#, c-format
+msgid "E720: Missing colon in Dictionary: %s"
+msgstr "E720: Idirstad ar iarraidh i bhFocl๓ir: %s"
+
+#, c-format
+msgid "E721: Duplicate key in Dictionary: \"%s\""
+msgstr "E721: Eochair dh๚blach i bhFocl๓ir: \"%s\""
+
+#, c-format
+msgid "E722: Missing comma in Dictionary: %s"
+msgstr "E722: Cam๓g ar iarraidh i bhFocl๓ir: %s"
+
+#, c-format
+msgid "E723: Missing end of Dictionary '}': %s"
+msgstr "E723: '}' ar iarraidh ag deireadh focl๓ra: %s"
+
+msgid "extend() argument"
+msgstr "arg๓int extend()"
+
+#, c-format
+msgid "E737: Key already exists: %s"
+msgstr "E737: Tแ eochair ann cheana: %s"
+
+#, c-format
+msgid "E96: Cannot diff more than %ld buffers"
+msgstr "E96: Nํ f้idir diff a dh้anamh ar nํos m๓ nแ %ld maolแn"
-#: ../diff.c:753
msgid "E810: Cannot read or write temp files"
msgstr "E810: Nํ f้idir comhaid shealadacha a l้amh n๓ a scrํobh"
-#: ../diff.c:755
msgid "E97: Cannot create diffs"
msgstr "E97: Nํ f้idir diffeanna a chruth๚"
-#: ../diff.c:966
+msgid "Patch file"
+msgstr "Comhad paiste"
+
msgid "E816: Cannot read patch output"
msgstr "E816: Nํ f้idir aschur ๓ 'patch' a l้amh"
-#: ../diff.c:1220
msgid "E98: Cannot read diff output"
msgstr "E98: Nํ f้idir aschur ๓ 'diff' a l้amh"
-#: ../diff.c:2081
msgid "E99: Current buffer is not in diff mode"
msgstr "E99: Nํl an maolแn reatha sa mh๓d diff"
-#: ../diff.c:2100
msgid "E793: No other buffer in diff mode is modifiable"
msgstr "E793: Nํ f้idir aon mhaolแn eile a athr๚ sa mh๓d diff"
-#: ../diff.c:2102
msgid "E100: No other buffer in diff mode"
msgstr "E100: Nํl aon mhaolแn eile sa mh๓d diff"
-#: ../diff.c:2112
msgid "E101: More than two buffers in diff mode, don't know which one to use"
msgstr ""
"E101: Tแ nํos m๓ nแ dhแ mhaolแn sa mh๓d diff, nํl fhios agam c้ acu ba ch๓ir "
"a ๚sแid"
-#: ../diff.c:2141
#, c-format
msgid "E102: Can't find buffer \"%s\""
msgstr "E102: Tแ maolแn \"%s\" gan aimsi๚"
-#: ../diff.c:2152
#, c-format
msgid "E103: Buffer \"%s\" is not in diff mode"
msgstr "E103: Nํl maolแn \"%s\" i m๓d diff"
-#: ../diff.c:2193
msgid "E787: Buffer changed unexpectedly"
msgstr "E787: Athraํodh an maolแn gan choinne"
-#: ../digraph.c:1598
msgid "E104: Escape not allowed in digraph"
msgstr "E104: Nํ cheadaํtear carachtair ้al๚chแin i nd้ghraf"
-#: ../digraph.c:1760
msgid "E544: Keymap file not found"
msgstr "E544: Comhad eochairmhapแla gan aimsi๚"
-#: ../digraph.c:1785
msgid "E105: Using :loadkeymap not in a sourced file"
msgstr "E105: Ag ๚sแid :loadkeymap ach nํ comhad foinsithe ้ seo"
-#: ../digraph.c:1821
msgid "E791: Empty keymap entry"
msgstr "E791: Iontrแil fholamh eochairmhapแla"
-#: ../edit.c:82
msgid " Keyword completion (^N^P)"
msgstr " Comhlแn๚ lorgfhocal (^N^P)"
#. ctrl_x_mode == 0, ^P/^N compl.
-#: ../edit.c:83
msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
msgstr " m๓d ^X (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-#: ../edit.c:85
msgid " Whole line completion (^L^N^P)"
msgstr " Comhlแn๚ Lํnte Ina Iomlแn (^L^N^P)"
-#: ../edit.c:86
msgid " File name completion (^F^N^P)"
msgstr " Comhlแn๚ de na hainmneacha comhaid (^F^N^P)"
-#: ../edit.c:87
msgid " Tag completion (^]^N^P)"
msgstr " Comhlแn๚ clibeanna (^]/^N/^P)"
-#: ../edit.c:88
msgid " Path pattern completion (^N^P)"
msgstr " Comhlแn๚ Conaire (^N^P)"
-#: ../edit.c:89
msgid " Definition completion (^D^N^P)"
msgstr " Comhlแn๚ de na sainmhํnithe (^D^N^P)"
-#: ../edit.c:91
msgid " Dictionary completion (^K^N^P)"
msgstr " Comhlแn๚ focl๓ra (^K^N^P)"
-#: ../edit.c:92
msgid " Thesaurus completion (^T^N^P)"
msgstr " Comhlแn๚ teasแrais (^T^N^P)"
-#: ../edit.c:93
msgid " Command-line completion (^V^N^P)"
msgstr " Comhlแn๚ den lํne ordaithe (^V^N^P)"
-#: ../edit.c:94
msgid " User defined completion (^U^N^P)"
msgstr " Comhlแn๚ saincheaptha (^U^N^P)"
-#: ../edit.c:95
msgid " Omni completion (^O^N^P)"
msgstr " Comhlแn๚ Omni (^O^N^P)"
-#: ../edit.c:96
msgid " Spelling suggestion (s^N^P)"
msgstr " Moladh litrithe (s^N^P)"
-#: ../edit.c:97
msgid " Keyword Local completion (^N^P)"
msgstr " Comhlแn๚ logแnta lorgfhocal (^N^P)"
-#: ../edit.c:100
msgid "Hit end of paragraph"
msgstr "Sroicheadh crํoch an pharagraif"
-#: ../edit.c:101
-#, fuzzy
msgid "E839: Completion function changed window"
-msgstr "E813: Nํ f้idir fuinneog autocmd a dh๚nadh"
+msgstr "E839: D'athraigh an fheidhm chomhlแnaithe an fhuinneog"
-#: ../edit.c:102
msgid "E840: Completion function deleted text"
-msgstr ""
+msgstr "E840: Scrios an fheidhm chomhlแnaithe roinnt t้acs"
-#: ../edit.c:1847
msgid "'dictionary' option is empty"
msgstr "tแ an rogha 'dictionary' folamh"
-#: ../edit.c:1848
msgid "'thesaurus' option is empty"
msgstr "tแ an rogha 'thesaurus' folamh"
-#: ../edit.c:2655
#, c-format
msgid "Scanning dictionary: %s"
msgstr "Focl๓ir แ scanadh: %s"
-#: ../edit.c:3079
msgid " (insert) Scroll (^E/^Y)"
msgstr " (ionsแigh) Scrollaigh (^E/^Y)"
-#: ../edit.c:3081
msgid " (replace) Scroll (^E/^Y)"
msgstr " (ionadaigh) Scrollaigh (^E/^Y)"
-#: ../edit.c:3587
#, c-format
msgid "Scanning: %s"
msgstr "%s แ scanadh"
-#: ../edit.c:3614
msgid "Scanning tags."
msgstr "Clibeanna แ scanadh."
-#: ../edit.c:4519
+msgid "match in file"
+msgstr "meaitseแil sa chomhad"
+
msgid " Adding"
msgstr " M้ad๚"
@@ -438,702 +437,456 @@ msgstr " M้ad๚"
#. * be called before line = ml_get(), or when this address is no
#. * longer needed. -- Acevedo.
#.
-#: ../edit.c:4562
msgid "-- Searching..."
msgstr "-- Ag Cuardach..."
-#: ../edit.c:4618
msgid "Back at original"
msgstr "Ar ais ag an mbunแit"
-#: ../edit.c:4621
msgid "Word from other line"
msgstr "Focal as lํne eile"
-#: ../edit.c:4624
msgid "The only match"
msgstr "An t-aon teaghrแn amhแin comhoiri๚naithe"
-#: ../edit.c:4680
#, c-format
msgid "match %d of %d"
msgstr "comhoiri๚n๚ %d as %d"
-#: ../edit.c:4684
#, c-format
msgid "match %d"
msgstr "comhoiri๚n๚ %d"
-#: ../eval.c:137
+#. maximum nesting of lists and dicts
msgid "E18: Unexpected characters in :let"
msgstr "E18: Carachtair gan choinne i :let"
-#: ../eval.c:138
-#, c-format
-msgid "E684: list index out of range: %<PRId64>"
-msgstr "E684: inn้acs liosta as raon: %<PRId64>"
-
-#: ../eval.c:139
#, c-format
msgid "E121: Undefined variable: %s"
msgstr "E121: Athr๓g gan sainmhํni๚: %s"
-#: ../eval.c:140
msgid "E111: Missing ']'"
msgstr "E111: `]' ar iarraidh"
-#: ../eval.c:141
-#, c-format
-msgid "E686: Argument of %s must be a List"
-msgstr "E686: Caithfidh arg๓int de %s a bheith ina Liosta"
-
-#: ../eval.c:143
-#, c-format
-msgid "E712: Argument of %s must be a List or Dictionary"
-msgstr "E712: Caithfidh arg๓int de %s a bheith ina Liosta n๓ Focl๓ir"
-
-#: ../eval.c:144
-msgid "E713: Cannot use empty key for Dictionary"
-msgstr "E713: Nํ f้idir eochair fholamh a ๚sแid le Focl๓ir"
-
-#: ../eval.c:145
-msgid "E714: List required"
-msgstr "E714: Tแ gแ le liosta"
-
-#: ../eval.c:146
-msgid "E715: Dictionary required"
-msgstr "E715: Tแ gแ le focl๓ir"
-
-#: ../eval.c:147
-#, c-format
-msgid "E118: Too many arguments for function: %s"
-msgstr "E118: An iomarca arg๓intํ d'fheidhm: %s"
-
-#: ../eval.c:148
-#, c-format
-msgid "E716: Key not present in Dictionary: %s"
-msgstr "E716: Nํl an eochair seo san Fhocl๓ir: %s"
-
-#: ../eval.c:150
-#, c-format
-msgid "E122: Function %s already exists, add ! to replace it"
-msgstr "E122: Tแ feidhm %s ann cheana, cuir ! leis an ord๚ chun ้ a asแiti๚"
-
-#: ../eval.c:151
-msgid "E717: Dictionary entry already exists"
-msgstr "E717: Tแ an iontrแil focl๓ra seo ann cheana"
-
-#: ../eval.c:152
-msgid "E718: Funcref required"
-msgstr "E718: Tแ gแ le Funcref"
-
-#: ../eval.c:153
msgid "E719: Cannot use [:] with a Dictionary"
msgstr "E719: Nํ f้idir [:] a ๚sแid le focl๓ir"
-#: ../eval.c:154
#, c-format
msgid "E734: Wrong variable type for %s="
msgstr "E734: Cineแl mํcheart athr๓ige le haghaidh %s="
-#: ../eval.c:155
-#, c-format
-msgid "E130: Unknown function: %s"
-msgstr "E130: Feidhm anaithnid: %s"
-
-#: ../eval.c:156
#, c-format
msgid "E461: Illegal variable name: %s"
msgstr "E461: Ainm athr๓ige neamhcheadaithe: %s"
-#: ../eval.c:157
msgid "E806: using Float as a String"
msgstr "E806: Snแmhphointe แ ๚sแid mar Theaghrแn"
-#: ../eval.c:1830
msgid "E687: Less targets than List items"
msgstr "E687: Nํos l๚ spriocanna nแ mํreanna Liosta"
-#: ../eval.c:1834
msgid "E688: More targets than List items"
msgstr "E688: Nํos m๓ spriocanna nแ mํreanna Liosta"
-#: ../eval.c:1906
msgid "Double ; in list of variables"
msgstr "; d๚blach i liosta na n-athr๓g"
-#: ../eval.c:2078
#, c-format
msgid "E738: Can't list variables for %s"
msgstr "E738: Nํ f้idir athr๓ga do %s a thaispeแint"
-#: ../eval.c:2391
msgid "E689: Can only index a List or Dictionary"
msgstr "E689: Is f้idir Liosta n๓ Focl๓ir amhแin a inn้acs๚"
-#: ../eval.c:2396
msgid "E708: [:] must come last"
msgstr "E708: caithfidh [:] a bheith ar deireadh"
-#: ../eval.c:2439
msgid "E709: [:] requires a List value"
msgstr "E709: nํ folแir Liosta a thabhairt le [:]"
-#: ../eval.c:2674
msgid "E710: List value has more items than target"
msgstr "E710: Tแ nํos m๓ mํreanna ag an Liosta nแ an sprioc"
-#: ../eval.c:2678
msgid "E711: List value has not enough items"
msgstr "E711: Nํl go leor mํreanna ag an Liosta"
-#: ../eval.c:2867
msgid "E690: Missing \"in\" after :for"
msgstr "E690: \"in\" ar iarraidh i ndiaidh :for"
-#: ../eval.c:3063
-#, c-format
-msgid "E107: Missing parentheses: %s"
-msgstr "E107: L๚ibํnํ ar iarraidh: %s"
-
-#: ../eval.c:3263
#, c-format
msgid "E108: No such variable: \"%s\""
msgstr "E108: Nํl a leith้id d'athr๓g: \"%s\""
-#: ../eval.c:3333
+#. For historic reasons this error is not given for a list or dict.
+#. * E.g., the b: dict could be locked/unlocked.
+#, c-format
+msgid "E940: Cannot lock or unlock variable %s"
+msgstr "E940: Nํ f้idir athr๓g %s a ghlasแil n๓ a dhํghlasแil"
+
msgid "E743: variable nested too deep for (un)lock"
msgstr "E743: athr๓g neadaithe r๓dhomhain chun ํ a (dํ)ghlasแil"
-#: ../eval.c:3630
msgid "E109: Missing ':' after '?'"
msgstr "E109: ':' ar iarraidh i ndiaidh '?'"
-#: ../eval.c:3893
msgid "E691: Can only compare List with List"
msgstr "E691: Is f้idir Liosta a chur i gcomparแid le Liosta eile amhแin"
-#: ../eval.c:3895
-msgid "E692: Invalid operation for Lists"
+msgid "E692: Invalid operation for List"
msgstr "E692: Oibrํocht neamhbhailํ ar Liostaํ"
-#: ../eval.c:3915
msgid "E735: Can only compare Dictionary with Dictionary"
msgstr "E735: Is f้idir Focl๓ir a chur i gcomparแid le Focl๓ir eile amhแin"
-#: ../eval.c:3917
msgid "E736: Invalid operation for Dictionary"
msgstr "E736: Oibrํocht neamhbhailํ ar Fhocl๓ir"
-#: ../eval.c:3932
-msgid "E693: Can only compare Funcref with Funcref"
-msgstr "E693: Is f้idir Funcref a chur i gcomparแid le Funcref eile amhแin"
-
-#: ../eval.c:3934
msgid "E694: Invalid operation for Funcrefs"
msgstr "E694: Oibrํocht neamhbhailํ ar Funcref"
-#: ../eval.c:4277
msgid "E804: Cannot use '%' with Float"
msgstr "E804: Nํ f้idir '%' a ๚sแid le Snแmhphointe"
-#: ../eval.c:4478
msgid "E110: Missing ')'"
msgstr "E110: ')' ar iarraidh"
-#: ../eval.c:4609
msgid "E695: Cannot index a Funcref"
msgstr "E695: Nํ f้idir Funcref a inn้acs๚"
-#: ../eval.c:4839
+msgid "E909: Cannot index a special variable"
+msgstr "E909: Nํ f้idir athr๓g speisialta a inn้acs๚"
+
#, c-format
msgid "E112: Option name missing: %s"
msgstr "E112: Ainm rogha ar iarraidh: %s"
-#: ../eval.c:4855
#, c-format
msgid "E113: Unknown option: %s"
msgstr "E113: Rogha anaithnid: %s"
-#: ../eval.c:4904
#, c-format
msgid "E114: Missing quote: %s"
msgstr "E114: Comhartha athfhriotail ar iarraidh: %s"
-#: ../eval.c:5020
#, c-format
msgid "E115: Missing quote: %s"
msgstr "E115: Comhartha athfhriotail ar iarraidh: %s"
-#: ../eval.c:5084
-#, c-format
-msgid "E696: Missing comma in List: %s"
-msgstr "E696: Cam๓g ar iarraidh i Liosta: %s"
-
-#: ../eval.c:5091
-#, c-format
-msgid "E697: Missing end of List ']': %s"
-msgstr "E697: ']' ar iarraidh ag deireadh liosta: %s"
-
-#: ../eval.c:6475
-#, c-format
-msgid "E720: Missing colon in Dictionary: %s"
-msgstr "E720: Idirstad ar iarraidh i bhFocl๓ir: %s"
-
-#: ../eval.c:6499
-#, c-format
-msgid "E721: Duplicate key in Dictionary: \"%s\""
-msgstr "E721: Eochair dh๚blach i bhFocl๓ir: \"%s\""
-
-#: ../eval.c:6517
-#, c-format
-msgid "E722: Missing comma in Dictionary: %s"
-msgstr "E722: Cam๓g ar iarraidh i bhFocl๓ir: %s"
-
-#: ../eval.c:6524
-#, c-format
-msgid "E723: Missing end of Dictionary '}': %s"
-msgstr "E723: '}' ar iarraidh ag deireadh focl๓ra: %s"
+msgid "Not enough memory to set references, garbage collection aborted!"
+msgstr ""
+"Nํl go leor cuimhne ann le tagairtํ a shocr๚; baili๚ dramhaํola แ thobscor!"
-#: ../eval.c:6555
msgid "E724: variable nested too deep for displaying"
msgstr "E724: athr๓g neadaithe r๓dhomhain chun ํ a thaispeแint"
-#: ../eval.c:7188
-#, c-format
-msgid "E740: Too many arguments for function %s"
-msgstr "E740: An iomarca arg๓intํ d'fheidhm %s"
-
-#: ../eval.c:7190
-#, c-format
-msgid "E116: Invalid arguments for function %s"
-msgstr "E116: Arg๓intํ neamhbhailํ d'fheidhm %s"
-
-#: ../eval.c:7377
-#, c-format
-msgid "E117: Unknown function: %s"
-msgstr "E117: Feidhm anaithnid: %s"
-
-#: ../eval.c:7383
-#, c-format
-msgid "E119: Not enough arguments for function: %s"
-msgstr "E119: Nํl go leor feidhmeanna d'fheidhm: %s"
-
-#: ../eval.c:7387
-#, c-format
-msgid "E120: Using <SID> not in a script context: %s"
-msgstr "E120: <SID> แ ๚sแid ach gan a bheith i gcomhth้acs scripte: %s"
-
-#: ../eval.c:7391
-#, c-format
-msgid "E725: Calling dict function without Dictionary: %s"
-msgstr "E725: Feidhm 'dict' แ ghlao gan Focl๓ir: %s"
-
-#: ../eval.c:7453
-msgid "E808: Number or Float required"
-msgstr "E808: Uimhir n๓ Snแmhphointe de dhํth"
-
-#: ../eval.c:7503
-#, fuzzy
-msgid "add() argument"
-msgstr "arg๓int -c"
-
-#: ../eval.c:7907
-msgid "E699: Too many arguments"
-msgstr "E699: An iomarca arg๓intํ"
-
-#: ../eval.c:8073
-msgid "E785: complete() can only be used in Insert mode"
-msgstr "E785: is f้idir complete() a ๚sแid sa mh๓d Ionsแite amhแin"
-
-#: ../eval.c:8156
-msgid "&Ok"
-msgstr "&Ok"
-
-#: ../eval.c:8676
-#, c-format
-msgid "E737: Key already exists: %s"
-msgstr "E737: Tแ eochair ann cheana: %s"
-
-#: ../eval.c:8692
-#, fuzzy
-msgid "extend() argument"
-msgstr "arg๓int --cmd"
-
-#: ../eval.c:8915
-#, fuzzy
-msgid "map() argument"
-msgstr "arg๓int -c"
-
-#: ../eval.c:8916
-#, fuzzy
-msgid "filter() argument"
-msgstr "arg๓int -c"
-
-#: ../eval.c:9229
-#, c-format
-msgid "+-%s%3ld lines: "
-msgstr "+-%s%3ld lํne: "
-
-#: ../eval.c:9291
-#, c-format
-msgid "E700: Unknown function: %s"
-msgstr "E700: Feidhm anaithnid: %s"
-
-#: ../eval.c:10729
-msgid "called inputrestore() more often than inputsave()"
-msgstr "Glaodh inputrestore() nํos minice nแ inputsave()"
-
-#: ../eval.c:10771
-#, fuzzy
-msgid "insert() argument"
-msgstr "arg๓int -c"
-
-#: ../eval.c:10841
-msgid "E786: Range not allowed"
-msgstr "E786: Nํ cheadaํtear an raon"
-
-#: ../eval.c:11140
-msgid "E701: Invalid type for len()"
-msgstr "E701: Cineแl neamhbhailํ le haghaidh len()"
-
-#: ../eval.c:11980
-msgid "E726: Stride is zero"
-msgstr "E726: Is nialas ํ an ch้im"
-
-#: ../eval.c:11982
-msgid "E727: Start past end"
-msgstr "E727: Tosach thar dheireadh"
-
-#: ../eval.c:12024 ../eval.c:15297
-msgid "<empty>"
-msgstr "<folamh>"
-
-#: ../eval.c:12282
-#, fuzzy
-msgid "remove() argument"
-msgstr "arg๓int --cmd"
+msgid "E805: Using a Float as a Number"
+msgstr "E805: Snแmhphointe แ ๚sแid mar Uimhir"
-#: ../eval.c:12466
-msgid "E655: Too many symbolic links (cycle?)"
-msgstr "E655: An iomarca naisc shiombalacha (ciogal?)"
+msgid "E703: Using a Funcref as a Number"
+msgstr "E703: Funcref แ ๚sแid mar Uimhir"
-#: ../eval.c:12593
-#, fuzzy
-msgid "reverse() argument"
-msgstr "arg๓int -c"
+msgid "E745: Using a List as a Number"
+msgstr "E745: Liosta แ ๚sแid mar Uimhir"
-#: ../eval.c:13721
-#, fuzzy
-msgid "sort() argument"
-msgstr "arg๓int -c"
+msgid "E728: Using a Dictionary as a Number"
+msgstr "E728: Focl๓ir แ ๚sแid mar Uimhir"
-#: ../eval.c:13721
-#, fuzzy
-msgid "uniq() argument"
-msgstr "arg๓int -c"
+msgid "E910: Using a Job as a Number"
+msgstr "E910: Jab แ ๚sแid mar Uimhir"
-#: ../eval.c:13776
-msgid "E702: Sort compare function failed"
-msgstr "E702: Theip ar fheidhm chomparแide le linn s๓rtแla"
+msgid "E913: Using a Channel as a Number"
+msgstr "E913: Cain้al แ ๚sแid mar Uimhir"
-#: ../eval.c:13806
-#, fuzzy
-msgid "E882: Uniq compare function failed"
-msgstr "E702: Theip ar fheidhm chomparแide le linn s๓rtแla"
+msgid "E891: Using a Funcref as a Float"
+msgstr "E891: Funcref แ ๚sแid mar Shnแmhphointe"
-#: ../eval.c:14085
-msgid "(Invalid)"
-msgstr "(Neamhbhailํ)"
+msgid "E892: Using a String as a Float"
+msgstr "E892: Teaghrแn แ ๚sแid mar Shnแmhphointe"
-#: ../eval.c:14590
-msgid "E677: Error writing temp file"
-msgstr "E677: Earrแid agus comhad sealadach แ scrํobh"
+msgid "E893: Using a List as a Float"
+msgstr "E893: Liosta แ ๚sแid mar Shnแmhphointe"
-#: ../eval.c:16159
-msgid "E805: Using a Float as a Number"
-msgstr "E805: Snแmhphointe แ ๚sแid mar Uimhir"
+msgid "E894: Using a Dictionary as a Float"
+msgstr "E894: Focl๓ir แ ๚sแid mar Shnแmhphointe"
-#: ../eval.c:16162
-msgid "E703: Using a Funcref as a Number"
-msgstr "E703: Funcref แ ๚sแid mar Uimhir"
+msgid "E907: Using a special value as a Float"
+msgstr "E907: Luach speisialta แ ๚sแid mar Shnแmhphointe"
-#: ../eval.c:16170
-msgid "E745: Using a List as a Number"
-msgstr "E745: Liosta แ ๚sแid mar Uimhir"
+msgid "E911: Using a Job as a Float"
+msgstr "E911: Jab แ ๚sแid mar Shnแmhphointe"
-#: ../eval.c:16173
-msgid "E728: Using a Dictionary as a Number"
-msgstr "E728: Focl๓ir แ ๚sแid mar Uimhir"
+msgid "E914: Using a Channel as a Float"
+msgstr "E914: Cain้al แ ๚sแid mar Shnแmhphointe"
-#: ../eval.c:16259
msgid "E729: using Funcref as a String"
msgstr "E729: Funcref แ ๚sแid mar Theaghrแn"
-#: ../eval.c:16262
msgid "E730: using List as a String"
msgstr "E730: Liosta แ ๚sแid mar Theaghrแn"
-#: ../eval.c:16265
msgid "E731: using Dictionary as a String"
msgstr "E731: Focl๓ir แ ๚sแid mar Theaghrแn"
-#: ../eval.c:16619
-#, c-format
-msgid "E706: Variable type mismatch for: %s"
-msgstr "E706: Mํmheaitseแil idir cineแlacha athr๓ige: %s"
+msgid "E908: using an invalid value as a String"
+msgstr "E908: luach neamhbhailํ แ ๚sแid mar Theaghrแn"
-#: ../eval.c:16705
#, c-format
msgid "E795: Cannot delete variable %s"
msgstr "E795: Nํ f้idir athr๓g %s a scriosadh"
-#: ../eval.c:16724
#, c-format
msgid "E704: Funcref variable name must start with a capital: %s"
msgstr "E704: Caithfidh ceannlitir a bheith ar dt๚s ainm Funcref: %s"
-#: ../eval.c:16732
#, c-format
msgid "E705: Variable name conflicts with existing function: %s"
msgstr "E705: Tagann ainm athr๓ige salach ar fheidhm atแ ann cheana: %s"
-#: ../eval.c:16763
#, c-format
msgid "E741: Value is locked: %s"
msgstr "E741: Tแ an luach faoi ghlas: %s"
-#: ../eval.c:16764 ../eval.c:16769 ../message.c:1839
msgid "Unknown"
msgstr "Anaithnid"
-#: ../eval.c:16768
#, c-format
msgid "E742: Cannot change value of %s"
msgstr "E742: Nํ f้idir an luach de %s a athr๚"
-#: ../eval.c:16838
msgid "E698: variable nested too deep for making a copy"
msgstr "E698: athr๓g neadaithe r๓dhomhain chun ํ a ch๓ipeแil"
-#: ../eval.c:17249
-#, c-format
-msgid "E123: Undefined function: %s"
-msgstr "E123: Feidhm gan sainmhํni๚: %s"
+msgid ""
+"\n"
+"# global variables:\n"
+msgstr ""
+"\n"
+"# athr๓ga comhchoiteanna:\n"
-#: ../eval.c:17260
-#, c-format
-msgid "E124: Missing '(': %s"
-msgstr "E124: '(' ar iarraidh: %s"
+msgid ""
+"\n"
+"\tLast set from "
+msgstr ""
+"\n"
+"\tSocraithe is d้anaํ ๓ "
-#: ../eval.c:17293
-#, fuzzy
-msgid "E862: Cannot use g: here"
-msgstr "E284: Nํ f้idir luachanna IC a shocr๚"
+msgid "map() argument"
+msgstr "arg๓int map()"
+
+msgid "filter() argument"
+msgstr "arg๓int filter()"
-#: ../eval.c:17312
#, c-format
-msgid "E125: Illegal argument: %s"
-msgstr "E125: Arg๓int neamhcheadaithe: %s"
+msgid "E686: Argument of %s must be a List"
+msgstr "E686: Caithfidh arg๓int de %s a bheith ina Liosta"
-#: ../eval.c:17323
-#, fuzzy, c-format
-msgid "E853: Duplicate argument name: %s"
-msgstr "E125: Arg๓int neamhcheadaithe: %s"
+msgid "E928: String required"
+msgstr "E928: Teaghrแn de dhํth"
-#: ../eval.c:17416
-msgid "E126: Missing :endfunction"
-msgstr "E126: :endfunction ar iarraidh"
+msgid "E808: Number or Float required"
+msgstr "E808: Uimhir n๓ Snแmhphointe de dhํth"
-#: ../eval.c:17537
-#, c-format
-msgid "E707: Function name conflicts with variable: %s"
-msgstr "E707: Tagann ainm na feidhme salach ar athr๓g: %s"
+msgid "add() argument"
+msgstr "arg๓int add()"
-#: ../eval.c:17549
-#, c-format
-msgid "E127: Cannot redefine function %s: It is in use"
-msgstr ""
-"E127: Nํ f้idir sainmhํni๚ nua a dh้anamh ar fheidhm %s: In ๚sแid cheana"
+msgid "E785: complete() can only be used in Insert mode"
+msgstr "E785: is f้idir complete() a ๚sแid sa mh๓d Ionsแite amhแin"
+
+#.
+#. * Yes this is ugly, I don't particularly like it either. But doing it
+#. * this way has the compelling advantage that translations need not to
+#. * be touched at all. See below what 'ok' and 'ync' are used for.
+#.
+msgid "&Ok"
+msgstr "&Ok"
-#: ../eval.c:17604
#, c-format
-msgid "E746: Function name does not match script file name: %s"
-msgstr ""
-"E746: Nํl ainm na feidhme comhoiri๚nach le hainm comhaid na scripte: %s"
+msgid "E700: Unknown function: %s"
+msgstr "E700: Feidhm anaithnid: %s"
-#: ../eval.c:17716
-msgid "E129: Function name required"
-msgstr "E129: Tแ gแ le hainm feidhme"
+msgid "E922: expected a dict"
+msgstr "E922: bhํothas ag s๚il le focl๓ir"
-#: ../eval.c:17824
-#, fuzzy, c-format
-msgid "E128: Function name must start with a capital or \"s:\": %s"
+msgid "E923: Second argument of function() must be a list or a dict"
msgstr ""
-"E128: Caithfidh ceannlitir a bheith ar dt๚s ainm feidhme, n๓ idirstad a "
-"bheith ann: %s"
+"E923: Caithfidh an dara harg๓int de function() a bheith ina liosta n๓ ina "
+"focl๓ir"
-#: ../eval.c:17833
-#, fuzzy, c-format
-msgid "E884: Function name cannot contain a colon: %s"
+msgid ""
+"&OK\n"
+"&Cancel"
msgstr ""
-"E128: Caithfidh ceannlitir a bheith ar dt๚s ainm feidhme, n๓ idirstad a "
-"bheith ann: %s"
+"&OK\n"
+"&Cealaigh"
-#: ../eval.c:18336
-#, c-format
-msgid "E131: Cannot delete function %s: It is in use"
-msgstr "E131: Nํ f้idir feidhm %s a scriosadh: Tแ s้ in ๚sแid faoi lแthair"
+msgid "called inputrestore() more often than inputsave()"
+msgstr "Glaodh inputrestore() nํos minice nแ inputsave()"
-#: ../eval.c:18441
-msgid "E132: Function call depth is higher than 'maxfuncdepth'"
-msgstr "E132: Doimhneacht na nglaonna nํos m๓ nแ 'maxfuncdepth'"
+msgid "insert() argument"
+msgstr "arg๓int insert()"
-#: ../eval.c:18568
-#, c-format
-msgid "calling %s"
-msgstr "%s แ glao"
+msgid "E786: Range not allowed"
+msgstr "E786: Nํ cheadaํtear an raon"
-#: ../eval.c:18651
-#, c-format
-msgid "%s aborted"
-msgstr "%s tobscortha"
+msgid "E916: not a valid job"
+msgstr "E916: nํ jab bailํ ้"
+
+msgid "E701: Invalid type for len()"
+msgstr "E701: Cineแl neamhbhailํ le haghaidh len()"
-#: ../eval.c:18653
#, c-format
-msgid "%s returning #%<PRId64>"
-msgstr "%s ag aisfhilleadh #%<PRId64>"
+msgid "E798: ID is reserved for \":match\": %ld"
+msgstr "E798: Aitheantas in แirithe do \":match\": %ld"
+
+msgid "E726: Stride is zero"
+msgstr "E726: Is nialas ํ an ch้im"
+
+msgid "E727: Start past end"
+msgstr "E727: Tosach thar dheireadh"
+
+msgid "<empty>"
+msgstr "<folamh>"
+
+msgid "E240: No connection to the X server"
+msgstr "E240: Nํl aon cheangal leis an bhfreastalaํ X"
-#: ../eval.c:18670
#, c-format
-msgid "%s returning %s"
-msgstr "%s ag aisfhilleadh %s"
+msgid "E241: Unable to send to %s"
+msgstr "E241: Nํ f้idir aon rud a sheoladh chuig %s"
+
+msgid "E277: Unable to read a server reply"
+msgstr "E277: Nํ f้idir freagra ๓n fhreastalaํ a l้amh"
+
+msgid "E941: already started a server"
+msgstr "E941: tosaํodh freastalaํ cheana"
+
+msgid "E942: +clientserver feature not available"
+msgstr "E942: nํl an ghn้ +clientserver ar fแil"
+
+msgid "remove() argument"
+msgstr "arg๓int remove()"
+
+msgid "E655: Too many symbolic links (cycle?)"
+msgstr "E655: An iomarca naisc shiombalacha (ciogal?)"
+
+msgid "reverse() argument"
+msgstr "arg๓int reverse()"
+
+msgid "E258: Unable to send to client"
+msgstr "E258: Nํ f้idir aon rud a sheoladh chuig an chliant"
-#: ../eval.c:18691 ../ex_cmds2.c:2695
#, c-format
-msgid "continuing in %s"
-msgstr "ag lean๚int i %s"
+msgid "E927: Invalid action: '%s'"
+msgstr "E927: Gnํomh neamhbhailํ: '%s'"
-#: ../eval.c:18795
-msgid "E133: :return not inside a function"
-msgstr "E133: Caithfidh :return a bheith isteach i bhfeidhm"
+msgid "sort() argument"
+msgstr "arg๓int sort()"
-#: ../eval.c:19159
-msgid ""
-"\n"
-"# global variables:\n"
-msgstr ""
-"\n"
-"# athr๓ga comhchoiteanna:\n"
+msgid "uniq() argument"
+msgstr "arg๓int uniq()"
-#: ../eval.c:19254
-msgid ""
-"\n"
-"\tLast set from "
-msgstr ""
-"\n"
-"\tSocraithe is d้anaํ ๓ "
+msgid "E702: Sort compare function failed"
+msgstr "E702: Theip ar fheidhm chomparแide le linn s๓rtแla"
-#: ../eval.c:19272
-msgid "No old files"
-msgstr "Gan seanchomhaid"
+msgid "E882: Uniq compare function failed"
+msgstr "E882: Theip ar fheidhm chomparแide Uniq"
+
+msgid "(Invalid)"
+msgstr "(Neamhbhailํ)"
+
+#, c-format
+msgid "E935: invalid submatch number: %d"
+msgstr "E935: uimhir fho-mheaitseแla neamhbhailํ: %d"
+
+msgid "E677: Error writing temp file"
+msgstr "E677: Earrแid agus comhad sealadach แ scrํobh"
+
+msgid "E921: Invalid callback argument"
+msgstr "E921: Arg๓int neamhbhailํ ar aisghlaoch"
-#: ../ex_cmds.c:122
#, c-format
msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
msgstr "<%s>%s%s %d, Heics %02x, Ocht %03o"
-#: ../ex_cmds.c:145
#, c-format
msgid "> %d, Hex %04x, Octal %o"
msgstr "> %d, Heics %04x, Ocht %o"
-#: ../ex_cmds.c:146
#, c-format
msgid "> %d, Hex %08x, Octal %o"
msgstr "> %d, Heics %08x, Ocht %o"
-#: ../ex_cmds.c:684
msgid "E134: Move lines into themselves"
msgstr "E134: Bog lํnte isteach iontu f้in"
-#: ../ex_cmds.c:747
msgid "1 line moved"
msgstr "Bogadh lํne amhแin"
-#: ../ex_cmds.c:749
#, c-format
-msgid "%<PRId64> lines moved"
-msgstr "Bogadh %<PRId64> lํne"
+msgid "%ld lines moved"
+msgstr "Bogadh %ld lํne"
-#: ../ex_cmds.c:1175
#, c-format
-msgid "%<PRId64> lines filtered"
-msgstr "Scagadh %<PRId64> lํne"
+msgid "%ld lines filtered"
+msgstr "Scagadh %ld lํne"
-#: ../ex_cmds.c:1194
msgid "E135: *Filter* Autocommands must not change current buffer"
msgstr ""
"E135: Nํ cheadaํtear d'uathorduithe *scagaire* an maolแn reatha a athr๚"
-#: ../ex_cmds.c:1244
msgid "[No write since last change]\n"
msgstr "[Athraithe agus nach sแbhแilte ๓ shin]\n"
-#: ../ex_cmds.c:1424
#, c-format
msgid "%sviminfo: %s in line: "
msgstr "%sviminfo: %s i lํne: "
-#: ../ex_cmds.c:1431
msgid "E136: viminfo: Too many errors, skipping rest of file"
msgstr ""
"E136: viminfo: An iomarca earrแidํ, ag scipeแil an chuid eile den chomhad"
-#: ../ex_cmds.c:1458
#, c-format
msgid "Reading viminfo file \"%s\"%s%s%s"
msgstr "Comhad viminfo \"%s\"%s%s%s แ l้amh"
-#: ../ex_cmds.c:1460
msgid " info"
msgstr " eolas"
-#: ../ex_cmds.c:1461
msgid " marks"
msgstr " marcanna"
-#: ../ex_cmds.c:1462
msgid " oldfiles"
msgstr " seanchomhad"
-#: ../ex_cmds.c:1463
msgid " FAILED"
msgstr " TEIPTHE"
#. avoid a wait_return for this message, it's annoying
-#: ../ex_cmds.c:1541
#, c-format
msgid "E137: Viminfo file is not writable: %s"
msgstr "E137: Nํl an comhad Viminfo inscrํofa: %s"
-#: ../ex_cmds.c:1626
+#, c-format
+msgid "E929: Too many viminfo temp files, like %s!"
+msgstr "E929: An iomarca comhad sealadach viminfo, mar shampla %s!"
+
#, c-format
msgid "E138: Can't write viminfo file %s!"
msgstr "E138: Nํ f้idir comhad viminfo %s a scrํobh!"
-#: ../ex_cmds.c:1635
#, c-format
msgid "Writing viminfo file \"%s\""
msgstr "Comhad viminfo \"%s\" แ scrํobh"
+#, c-format
+msgid "E886: Can't rename viminfo file to %s!"
+msgstr "E886: Nํ f้idir ainm %s a chur ar an gcomhad viminfo!"
+
#. Write the info:
-#: ../ex_cmds.c:1720
#, c-format
msgid "# This viminfo file was generated by Vim %s.\n"
msgstr "# Chruthaigh Vim an comhad viminfo seo %s.\n"
-#: ../ex_cmds.c:1722
msgid ""
"# You may edit it if you're careful!\n"
"\n"
@@ -1141,47 +894,47 @@ msgstr ""
"# Is f้idir leat an comhad seo a chur in eagar ach bํ c๚ramach!\n"
"\n"
-#: ../ex_cmds.c:1723
msgid "# Value of 'encoding' when this file was written\n"
msgstr "# Luach 'encoding' agus an comhad seo แ scrํobh\n"
-#: ../ex_cmds.c:1800
msgid "Illegal starting char"
msgstr "Carachtar neamhcheadaithe tosaigh"
-#: ../ex_cmds.c:2162
+msgid ""
+"\n"
+"# Bar lines, copied verbatim:\n"
+msgstr ""
+"\n"
+"# Barralํnte, c๓ipeแilte focal ar fhocal:\n"
+
+msgid "Save As"
+msgstr "Sแbhแil Mar"
+
msgid "Write partial file?"
msgstr "Scrํobh comhad neamhiomlแn?"
-#: ../ex_cmds.c:2166
msgid "E140: Use ! to write partial buffer"
msgstr "E140: Bain ๚sแid as ! chun maolแn neamhiomlแn a scrํobh"
-#: ../ex_cmds.c:2281
#, c-format
msgid "Overwrite existing file \"%s\"?"
msgstr "Forscrํobh comhad \"%s\" atแ ann cheana?"
-#: ../ex_cmds.c:2317
#, c-format
msgid "Swap file \"%s\" exists, overwrite anyway?"
msgstr "Tแ comhad babhtแla \"%s\" ann cheana; forscrํobh mar sin f้in?"
-#: ../ex_cmds.c:2326
#, c-format
msgid "E768: Swap file exists: %s (:silent! overrides)"
msgstr "E768: Tแ comhad babhtแla ann cheana: %s (๚sแid :silent! chun sแr๚)"
-#: ../ex_cmds.c:2381
#, c-format
-msgid "E141: No file name for buffer %<PRId64>"
-msgstr "E141: Nํl aon ainm ar mhaolแn %<PRId64>"
+msgid "E141: No file name for buffer %ld"
+msgstr "E141: Nํl aon ainm ar mhaolแn %ld"
-#: ../ex_cmds.c:2412
msgid "E142: File not written: Writing is disabled by 'write' option"
msgstr "E142: Nํor scrํobhadh an comhad: dํchumasaithe leis an rogha 'write'"
-#: ../ex_cmds.c:2434
#, c-format
msgid ""
"'readonly' option is set for \"%s\".\n"
@@ -1190,7 +943,6 @@ msgstr ""
"tแ an rogha 'readonly' socraithe do \"%s\".\n"
"Ar mhaith leat ้ a scrํobh mar sin f้in?"
-#: ../ex_cmds.c:2439
#, c-format
msgid ""
"File permissions of \"%s\" are read-only.\n"
@@ -1201,85 +953,71 @@ msgstr ""
"Seans gurbh fh้idir scrํobh ann mar sin f้in.\n"
"An bhfuil fonn ort triail a bhaint as?"
-#: ../ex_cmds.c:2451
#, c-format
msgid "E505: \"%s\" is read-only (add ! to override)"
msgstr "E505: is inl้ite amhแin ้ \"%s\" (cuir ! leis an ord๚ chun sแr๚)"
-#: ../ex_cmds.c:3120
+msgid "Edit File"
+msgstr "Cuir Comhad in Eagar"
+
#, c-format
msgid "E143: Autocommands unexpectedly deleted new buffer %s"
msgstr "E143: Scrios na huathorduithe maolแn nua %s go tobann"
-#: ../ex_cmds.c:3313
msgid "E144: non-numeric argument to :z"
msgstr "E144: arg๓int neamhuimhri๚il chun :z"
-#: ../ex_cmds.c:3404
msgid "E145: Shell commands not allowed in rvim"
msgstr "E145: Nํ cheadaํtear orduithe blaoisce i rvim"
-#: ../ex_cmds.c:3498
msgid "E146: Regular expressions can't be delimited by letters"
msgstr ""
"E146: Nํ cheadaํtear litreacha mar theormharc๓irํ ar shloinn ionadaํochta"
-#: ../ex_cmds.c:3964
#, c-format
msgid "replace with %s (y/n/a/q/l/^E/^Y)?"
msgstr "cuir %s ina ionad (y/n/a/q/l/^E/^Y)?"
-#: ../ex_cmds.c:4379
msgid "(Interrupted) "
msgstr "(Idirbhriste) "
-#: ../ex_cmds.c:4384
msgid "1 match"
msgstr "1 rud comhoiri๚nach"
-#: ../ex_cmds.c:4384
msgid "1 substitution"
msgstr "1 ionadaํocht"
-#: ../ex_cmds.c:4387
#, c-format
-msgid "%<PRId64> matches"
-msgstr "%<PRId64> rud comhoiri๚nach"
+msgid "%ld matches"
+msgstr "%ld rud comhoiri๚nach"
-#: ../ex_cmds.c:4388
#, c-format
-msgid "%<PRId64> substitutions"
-msgstr "%<PRId64> ionadaํocht"
+msgid "%ld substitutions"
+msgstr "%ld ionadaํocht"
-#: ../ex_cmds.c:4392
msgid " on 1 line"
msgstr " ar lํne amhแin"
-#: ../ex_cmds.c:4395
#, c-format
-msgid " on %<PRId64> lines"
-msgstr " ar %<PRId64> lํne"
+msgid " on %ld lines"
+msgstr " ar %ld lํne"
-#: ../ex_cmds.c:4438
-msgid "E147: Cannot do :global recursive"
-msgstr "E147: Nํ cheadaํtear :global go hathch๚rsach"
+#. will increment global_busy to break out of the loop
+msgid "E147: Cannot do :global recursive with a range"
+msgstr "E147: Nํ cheadaํtear :global athch๚rsach le raon"
# should have ":"
-#: ../ex_cmds.c:4467
msgid "E148: Regular expression missing from global"
msgstr "E148: Slonn ionadaํochta ar iarraidh ๓ :global"
-#: ../ex_cmds.c:4508
#, c-format
msgid "Pattern found in every line: %s"
msgstr "Aimsํodh an patr๚n i ngach lํne: %s"
-#: ../ex_cmds.c:4510
-#, fuzzy, c-format
+#, c-format
msgid "Pattern not found: %s"
-msgstr "Patr๚n gan aimsi๚"
+msgstr "Patr๚n gan aimsi๚: %s"
-#: ../ex_cmds.c:4587
msgid ""
"\n"
"# Last Substitute String:\n"
@@ -1289,682 +1027,610 @@ msgstr ""
"# Teaghrแn Ionadach Is D้anaํ:\n"
"$"
-#: ../ex_cmds.c:4679
msgid "E478: Don't panic!"
msgstr "E478: Nแ t้igh i scaoll!"
-#: ../ex_cmds.c:4717
#, c-format
msgid "E661: Sorry, no '%s' help for %s"
msgstr "E661: Tแ br๓n orm, nํ aon chabhair '%s' do %s"
-#: ../ex_cmds.c:4719
#, c-format
msgid "E149: Sorry, no help for %s"
msgstr "E149: Tแ br๓n orm, nํl aon chabhair do %s"
-#: ../ex_cmds.c:4751
#, c-format
msgid "Sorry, help file \"%s\" not found"
msgstr "Tแ br๓n orm, comhad cabhrach \"%s\" gan aimsi๚"
-#: ../ex_cmds.c:5323
#, c-format
-msgid "E150: Not a directory: %s"
-msgstr "E150: Nํ comhadlann ้: %s"
+msgid "E151: No match: %s"
+msgstr "E151: Gan meaitseแil: %s"
-#: ../ex_cmds.c:5446
#, c-format
msgid "E152: Cannot open %s for writing"
msgstr "E152: Nํ f้idir %s a oscailt chun scrํobh ann"
-#: ../ex_cmds.c:5471
#, c-format
msgid "E153: Unable to open %s for reading"
msgstr "E153: Nํ f้idir %s a oscailt chun ้ a l้amh"
-#: ../ex_cmds.c:5500
#, c-format
msgid "E670: Mix of help file encodings within a language: %s"
msgstr "E670: Ionch๓duithe ้ags๚la do chomhaid chabhracha i dteanga aonair: %s"
-#: ../ex_cmds.c:5565
#, c-format
msgid "E154: Duplicate tag \"%s\" in file %s/%s"
msgstr "E154: Clib dh๚blach \"%s\" i gcomhad %s/%s"
-#: ../ex_cmds.c:5687
+#, c-format
+msgid "E150: Not a directory: %s"
+msgstr "E150: Nํ comhadlann ้: %s"
+
#, c-format
msgid "E160: Unknown sign command: %s"
msgstr "E160: Ord๚ anaithnid comhartha: %s"
-#: ../ex_cmds.c:5704
msgid "E156: Missing sign name"
msgstr "E156: Ainm comhartha ar iarraidh"
-#: ../ex_cmds.c:5746
msgid "E612: Too many signs defined"
msgstr "E612: An iomarca comharthaํ sainmhํnithe"
-#: ../ex_cmds.c:5813
#, c-format
msgid "E239: Invalid sign text: %s"
msgstr "E239: T้acs neamhbhailํ comhartha: %s"
-#: ../ex_cmds.c:5844 ../ex_cmds.c:6035
#, c-format
msgid "E155: Unknown sign: %s"
msgstr "E155: Comhartha anaithnid: %s"
-#: ../ex_cmds.c:5877
msgid "E159: Missing sign number"
msgstr "E159: Uimhir chomhartha ar iarraidh"
-#: ../ex_cmds.c:5971
#, c-format
msgid "E158: Invalid buffer name: %s"
msgstr "E158: Ainm maolแin neamhbhailํ: %s"
-#: ../ex_cmds.c:6008
+msgid "E934: Cannot jump to a buffer that does not have a name"
+msgstr "E934: Nํ f้idir l้im go maolแn gan ainm"
+
#, c-format
-msgid "E157: Invalid sign ID: %<PRId64>"
-msgstr "E157: ID neamhbhailํ comhartha: %<PRId64>"
+msgid "E157: Invalid sign ID: %ld"
+msgstr "E157: ID neamhbhailํ comhartha: %ld"
+
+#, c-format
+msgid "E885: Not possible to change sign %s"
+msgstr "E885: Nํ f้idir an comhartha a athr๚: %s"
+
+msgid " (NOT FOUND)"
+msgstr " (AR IARRAIDH)"
-#: ../ex_cmds.c:6066
msgid " (not supported)"
msgstr " (nํl an rogha seo ar fแil)"
-#: ../ex_cmds.c:6169
msgid "[Deleted]"
msgstr "[Scriosta]"
-#: ../ex_cmds2.c:139
+msgid "No old files"
+msgstr "Gan seanchomhaid"
+
msgid "Entering Debug mode. Type \"cont\" to continue."
msgstr "M๓d dํfhabhtaithe แ thos๚. Cl๓scrํobh \"cont\" chun lean๚int."
-#: ../ex_cmds2.c:143 ../ex_docmd.c:759
#, c-format
-msgid "line %<PRId64>: %s"
-msgstr "lํne %<PRId64>: %s"
+msgid "line %ld: %s"
+msgstr "lํne %ld: %s"
-#: ../ex_cmds2.c:145
#, c-format
msgid "cmd: %s"
msgstr "ord๚: %s"
-#: ../ex_cmds2.c:322
+msgid "frame is zero"
+msgstr "is nialas ้ an frแma"
+
#, c-format
-msgid "Breakpoint in \"%s%s\" line %<PRId64>"
-msgstr "Brisphointe i \"%s%s\" lํne %<PRId64>"
+msgid "frame at highest level: %d"
+msgstr "frแma ag an leibh้al is airde: %d"
+
+#, c-format
+msgid "Breakpoint in \"%s%s\" line %ld"
+msgstr "Brisphointe i \"%s%s\" lํne %ld"
-#: ../ex_cmds2.c:581
#, c-format
msgid "E161: Breakpoint not found: %s"
msgstr "E161: Brisphointe gan aimsi๚: %s"
-#: ../ex_cmds2.c:611
msgid "No breakpoints defined"
msgstr "Nํl aon bhrisphointe socraithe"
-#: ../ex_cmds2.c:617
#, c-format
-msgid "%3d %s %s line %<PRId64>"
-msgstr "%3d %s %s lํne %<PRId64>"
+msgid "%3d %s %s line %ld"
+msgstr "%3d %s %s lํne %ld"
-#: ../ex_cmds2.c:942
msgid "E750: First use \":profile start {fname}\""
msgstr "E750: ฺsแid \":profile start {ainm}\" ar dt๚s"
-#: ../ex_cmds2.c:1269
#, c-format
msgid "Save changes to \"%s\"?"
msgstr "Sแbhแil athruithe ar \"%s\"?"
-#: ../ex_cmds2.c:1271 ../ex_docmd.c:8851
msgid "Untitled"
msgstr "Gan Teideal"
-#: ../ex_cmds2.c:1421
#, c-format
msgid "E162: No write since last change for buffer \"%s\""
msgstr "E162: Athraํodh maolแn \"%s\" ach nach bhfuil s้ sแbhแilte ๓ shin"
-#: ../ex_cmds2.c:1480
msgid "Warning: Entered other buffer unexpectedly (check autocommands)"
msgstr "Rabhadh: Chuathas i maolแn eile go tobann (seiceแil na huathorduithe)"
-#: ../ex_cmds2.c:1826
msgid "E163: There is only one file to edit"
msgstr "E163: Nํl ach aon chomhad amhแin le cur in eagar"
-#: ../ex_cmds2.c:1828
msgid "E164: Cannot go before first file"
msgstr "E164: Nํ f้idir a dhul roimh an ch้ad chomhad"
-#: ../ex_cmds2.c:1830
msgid "E165: Cannot go beyond last file"
msgstr "E165: Nํ f้idir a dhul thar an gcomhad deireanach"
-#: ../ex_cmds2.c:2175
#, c-format
msgid "E666: compiler not supported: %s"
msgstr "E666: nํ ghlactar leis an tiomsaitheoir: %s"
-#: ../ex_cmds2.c:2257
#, c-format
msgid "Searching for \"%s\" in \"%s\""
msgstr "Ag d้anamh cuardach ar \"%s\" i \"%s\""
-#: ../ex_cmds2.c:2284
#, c-format
msgid "Searching for \"%s\""
msgstr "Ag d้anamh cuardach ar \"%s\""
-#: ../ex_cmds2.c:2307
#, c-format
-msgid "not found in 'runtimepath': \"%s\""
-msgstr "gan aimsi๚ i 'runtimepath': \"%s\""
+msgid "not found in '%s': \"%s\""
+msgstr "gan aimsi๚ in '%s': \"%s\""
+
+#, c-format
+msgid "W20: Required python version 2.x not supported, ignoring file: %s"
+msgstr "W20: Nํl leagan 2.x de Python ar fแil; ag d้anamh neamhaird de %s"
+
+#, c-format
+msgid "W21: Required python version 3.x not supported, ignoring file: %s"
+msgstr "W21: Nํl leagan 3.x de Python ar fแil; ag d้anamh neamhaird de %s"
+
+msgid "Source Vim script"
+msgstr "Foinsigh script Vim"
-#: ../ex_cmds2.c:2472
#, c-format
msgid "Cannot source a directory: \"%s\""
msgstr "Nํ f้idir comhadlann a l้amh: \"%s\""
-#: ../ex_cmds2.c:2518
#, c-format
msgid "could not source \"%s\""
msgstr "nํorbh fh้idir \"%s\" a l้amh"
-#: ../ex_cmds2.c:2520
#, c-format
-msgid "line %<PRId64>: could not source \"%s\""
-msgstr "lํne %<PRId64>: nํorbh fh้idir \"%s\" a fhoinsi๚"
+msgid "line %ld: could not source \"%s\""
+msgstr "lํne %ld: nํorbh fh้idir \"%s\" a fhoinsi๚"
-#: ../ex_cmds2.c:2535
#, c-format
msgid "sourcing \"%s\""
msgstr "\"%s\" แ fhoinsi๚"
-#: ../ex_cmds2.c:2537
#, c-format
-msgid "line %<PRId64>: sourcing \"%s\""
-msgstr "lํne %<PRId64>: \"%s\" แ fhoinsi๚"
+msgid "line %ld: sourcing \"%s\""
+msgstr "lํne %ld: \"%s\" แ fhoinsi๚"
-#: ../ex_cmds2.c:2693
#, c-format
msgid "finished sourcing %s"
msgstr "deireadh ag foinsi๚ %s"
-#: ../ex_cmds2.c:2765
+#, c-format
+msgid "continuing in %s"
+msgstr "ag lean๚int i %s"
+
msgid "modeline"
msgstr "m๓dlํne"
-#: ../ex_cmds2.c:2767
msgid "--cmd argument"
msgstr "arg๓int --cmd"
-#: ../ex_cmds2.c:2769
msgid "-c argument"
msgstr "arg๓int -c"
-#: ../ex_cmds2.c:2771
msgid "environment variable"
msgstr "athr๓g thimpeallachta"
-#: ../ex_cmds2.c:2773
msgid "error handler"
msgstr "lแimhseแlaํ earrแidํ"
-#: ../ex_cmds2.c:3020
msgid "W15: Warning: Wrong line separator, ^M may be missing"
msgstr ""
"W15: Rabhadh: Deighilteoir lํnte mํcheart, is f้idir go bhfuil ^M ar iarraidh"
-#: ../ex_cmds2.c:3139
msgid "E167: :scriptencoding used outside of a sourced file"
msgstr "E167: nํ ๚sแidtear :scriptencoding ach i gcomhad foinsithe"
-#: ../ex_cmds2.c:3166
msgid "E168: :finish used outside of a sourced file"
msgstr "E168: nํ ๚sแidtear :finish ach i gcomhaid foinsithe"
-#: ../ex_cmds2.c:3389
#, c-format
msgid "Current %slanguage: \"%s\""
msgstr "%sTeanga faoi lแthair: \"%s\""
-#: ../ex_cmds2.c:3404
#, c-format
msgid "E197: Cannot set language to \"%s\""
msgstr "E197: Nํ f้idir an teanga a shocr๚ mar \"%s\""
-#. don't redisplay the window
-#. don't wait for return
-#: ../ex_docmd.c:387
msgid "Entering Ex mode. Type \"visual\" to go to Normal mode."
msgstr "M๓d Ex แ thos๚. Cl๓scrํobh \"visual\" le haghaidh an ghnแthmh๓d."
# in FARF -KPS
-#: ../ex_docmd.c:428
msgid "E501: At end-of-file"
msgstr "E501: Ag an chomhadchrํoch"
-#: ../ex_docmd.c:513
msgid "E169: Command too recursive"
msgstr "E169: Ord๚ r๓-athch๚rsach"
-#: ../ex_docmd.c:1006
#, c-format
msgid "E605: Exception not caught: %s"
msgstr "E605: Eisceacht gan lแimhseแil: %s"
-#: ../ex_docmd.c:1085
msgid "End of sourced file"
msgstr "Crํoch chomhaid foinsithe"
-#: ../ex_docmd.c:1086
msgid "End of function"
msgstr "Crํoch fheidhme"
-#: ../ex_docmd.c:1628
msgid "E464: Ambiguous use of user-defined command"
msgstr "E464: ฺsแid athbhrํoch d'ord๚ saincheaptha"
-#: ../ex_docmd.c:1638
msgid "E492: Not an editor command"
msgstr "E492: Nํl ina ord๚ eagarth๓ra"
-#: ../ex_docmd.c:1729
msgid "E493: Backwards range given"
msgstr "E493: Raon droim ar ais"
-#: ../ex_docmd.c:1733
msgid "Backwards range given, OK to swap"
msgstr "Raon droim ar ais, babhtแil"
-#. append
-#. typed wrong
-#: ../ex_docmd.c:1787
msgid "E494: Use w or w>>"
msgstr "E494: Bain ๚sแid as w n๓ w>>"
-#: ../ex_docmd.c:3454
-msgid "E319: The command is not available in this version"
+msgid "E943: Command table needs to be updated, run 'make cmdidxs'"
+msgstr "E943: Caithfear tแbla na n-orduithe a nuashonr๚; rith 'make cmdidxs'"
+
+msgid "E319: Sorry, the command is not available in this version"
msgstr "E319: Tแ br๓n orm, nํl an t-ord๚ ar fแil sa leagan seo"
-#: ../ex_docmd.c:3752
msgid "E172: Only one file name allowed"
msgstr "E172: Nํ cheadaํtear ach aon ainm comhaid amhแin"
-#: ../ex_docmd.c:4238
msgid "1 more file to edit. Quit anyway?"
msgstr "1 comhad le cur in eagar f๓s. Scoir mar sin f้in?"
-#: ../ex_docmd.c:4242
#, c-format
msgid "%d more files to edit. Quit anyway?"
msgstr "%d comhad le cur in eagar f๓s. Scoir mar sin f้in?"
-#: ../ex_docmd.c:4248
msgid "E173: 1 more file to edit"
msgstr "E173: 1 chomhad le heagr๚ f๓s"
-#: ../ex_docmd.c:4250
#, c-format
-msgid "E173: %<PRId64> more files to edit"
-msgstr "E173: %<PRId64> comhad le cur in eagar"
+msgid "E173: %ld more files to edit"
+msgstr "E173: %ld comhad le cur in eagar"
-#: ../ex_docmd.c:4320
msgid "E174: Command already exists: add ! to replace it"
msgstr "E174: Tแ an t-ord๚ ann cheana: cuir ! leis chun sแr๚"
-#: ../ex_docmd.c:4432
msgid ""
"\n"
-" Name Args Range Complete Definition"
+" Name Args Address Complete Definition"
msgstr ""
"\n"
-" Ainm Arg Raon Iomlแn Sainmhํni๚"
+" Ainm Arg Seoladh Iomlแn Sainmhํni๚"
-#: ../ex_docmd.c:4516
msgid "No user-defined commands found"
msgstr "Nํl aon ord๚ aimsithe atแ sainithe ag an ๚sแideoir"
-#: ../ex_docmd.c:4538
msgid "E175: No attribute specified"
msgstr "E175: Nํl aon aitreab๚id sainithe"
-#: ../ex_docmd.c:4583
msgid "E176: Invalid number of arguments"
msgstr "E176: Tแ lํon na n-arg๓intํ mํcheart"
-#: ../ex_docmd.c:4594
msgid "E177: Count cannot be specified twice"
msgstr "E177: Nํ cheadaํtear an t-แireamh a bheith tugtha faoi dh๓"
-#: ../ex_docmd.c:4603
msgid "E178: Invalid default value for count"
msgstr "E178: Luach r้amhshocraithe neamhbhailํ ar แireamh"
-#: ../ex_docmd.c:4625
msgid "E179: argument required for -complete"
msgstr "E179: tแ gแ le harg๓int i ndiaidh -complete"
-#: ../ex_docmd.c:4635
+msgid "E179: argument required for -addr"
+msgstr "E179: tแ gแ le harg๓int i ndiaidh -addr"
+
#, c-format
msgid "E181: Invalid attribute: %s"
msgstr "E181: Aitreab๚id neamhbhailํ: %s"
-#: ../ex_docmd.c:4678
msgid "E182: Invalid command name"
msgstr "E182: Ainm neamhbhailํ ordaithe"
-#: ../ex_docmd.c:4691
msgid "E183: User defined commands must start with an uppercase letter"
msgstr ""
"E183: Caithfidh ceannlitir a bheith ar dt๚s orduithe atแ sainithe ag an "
"๚sแideoir"
-#: ../ex_docmd.c:4696
-#, fuzzy
msgid "E841: Reserved name, cannot be used for user defined command"
-msgstr "E464: ฺsแid athbhrํoch d'ord๚ saincheaptha"
+msgstr ""
+"E841: Ainm in แirithe, nํ f้idir ้ a chur ar ord๚ sainithe ag an ๚sแideoir"
-#: ../ex_docmd.c:4751
#, c-format
msgid "E184: No such user-defined command: %s"
msgstr "E184: Nํl a leith้id d'ord๚ saincheaptha: %s"
-#: ../ex_docmd.c:5219
+#, c-format
+msgid "E180: Invalid address type value: %s"
+msgstr "E180: Cineแl neamhbhailํ seolta: %s"
+
#, c-format
msgid "E180: Invalid complete value: %s"
msgstr "E180: Luach iomlแn neamhbhailํ: %s"
-#: ../ex_docmd.c:5225
msgid "E468: Completion argument only allowed for custom completion"
msgstr ""
"E468: Nํ cheadaํtear arg๓int chomhlแnaithe ach le comhlแn๚ saincheaptha"
-#: ../ex_docmd.c:5231
msgid "E467: Custom completion requires a function argument"
msgstr "E467: Tแ gแ le harg๓int fheidhme le comhlแn๚ saincheaptha"
-#: ../ex_docmd.c:5257
-#, fuzzy, c-format
+msgid "unknown"
+msgstr "anaithnid"
+
+#, c-format
msgid "E185: Cannot find color scheme '%s'"
-msgstr "E185: Sc้im dathanna %s gan aimsi๚"
+msgstr "E185: Sc้im dathanna '%s' gan aimsi๚"
-#: ../ex_docmd.c:5263
msgid "Greetings, Vim user!"
msgstr "Dia duit, a ๚sแideoir Vim!"
-#: ../ex_docmd.c:5431
msgid "E784: Cannot close last tab page"
-msgstr "E784: Nํ f้idir an leathanach cluaisํn deiridh a dh๚nadh"
+msgstr "E784: Nํ f้idir an leathanach cluaisํnํ deiridh a dh๚nadh"
-#: ../ex_docmd.c:5462
msgid "Already only one tab page"
-msgstr "Nํl ach leathanach cluaisํn amhแin cheana f้in"
+msgstr "Nํl ach leathanach cluaisํnํ amhแin cheana f้in"
+
+msgid "Edit File in new window"
+msgstr "Cuir comhad in eagar i bhfuinneog nua"
-#: ../ex_docmd.c:6004
#, c-format
msgid "Tab page %d"
msgstr "Leathanach cluaisํn %d"
-#: ../ex_docmd.c:6295
msgid "No swap file"
msgstr "Nํl aon chomhad babhtแla ann"
-#: ../ex_docmd.c:6478
+msgid "Append File"
+msgstr "Ceangail Comhad ag an Deireadh"
+
msgid "E747: Cannot change directory, buffer is modified (add ! to override)"
msgstr ""
"E747: Nํ f้idir an chomhadlann a athr๚, mionathraํodh an maolแn (cuir ! leis "
"an ord๚ chun sแr๚)"
-#: ../ex_docmd.c:6485
msgid "E186: No previous directory"
msgstr "E186: Nํl aon chomhadlann roimhe seo"
-#: ../ex_docmd.c:6530
msgid "E187: Unknown"
msgstr "E187: Anaithnid"
-#: ../ex_docmd.c:6610
msgid "E465: :winsize requires two number arguments"
msgstr "E465: nํ folแir dhแ arg๓int uimhri๚la le :winsize"
-#: ../ex_docmd.c:6655
+#, c-format
+msgid "Window position: X %d, Y %d"
+msgstr "Ionad na fuinneoige: X %d, Y %d"
+
msgid "E188: Obtaining window position not implemented for this platform"
-msgstr "E188: Nํ f้idir ionad na fuinneoige a fhแil amach ar an ch๓ras seo"
+msgstr "E188: Nํ f้idir ionad na fuinneoige a fhแil amach ar an gc๓ras seo"
-#: ../ex_docmd.c:6662
msgid "E466: :winpos requires two number arguments"
-msgstr "E466: nํ folแir dhแ arg๓int uimhri๚la le :winpos"
+msgstr "E466: dhแ arg๓int uimhri๚la de dhํth le :winpos"
+
+msgid "E930: Cannot use :redir inside execute()"
+msgstr "E930: Nํ f้idir :redir a ๚sแid laistigh de execute()"
+
+msgid "Save Redirection"
+msgstr "Sแbhแil Atreor๚"
+
+msgid "Save View"
+msgstr "Sแbhแil an tAmharc"
+
+msgid "Save Session"
+msgstr "Sแbhแil an Seisi๚n"
+
+msgid "Save Setup"
+msgstr "Sแbhแil an Socr๚"
-#: ../ex_docmd.c:7241
#, c-format
msgid "E739: Cannot create directory: %s"
msgstr "E739: Nํ f้idir comhadlann a chruth๚: %s"
-#: ../ex_docmd.c:7268
#, c-format
msgid "E189: \"%s\" exists (add ! to override)"
msgstr "E189: Tแ \"%s\" ann cheana (cuir ! leis an ord๚ chun sแr๚)"
-#: ../ex_docmd.c:7273
#, c-format
msgid "E190: Cannot open \"%s\" for writing"
msgstr "E190: Nํ f้idir \"%s\" a oscailt chun l้amh"
#. set mark
-#: ../ex_docmd.c:7294
msgid "E191: Argument must be a letter or forward/backward quote"
msgstr "E191: Caithfidh an arg๓int a bheith litir n๓ comhartha athfhriotal"
-#: ../ex_docmd.c:7333
msgid "E192: Recursive use of :normal too deep"
msgstr "E192: athch๚rsแil :normal r๓dhomhain"
-#: ../ex_docmd.c:7807
+msgid "E809: #< is not available without the +eval feature"
+msgstr "E809: nํl #< ar fแil gan ghn้ +eval"
+
msgid "E194: No alternate file name to substitute for '#'"
msgstr "E194: Nํl aon ainm comhaid a chur in ionad '#'"
-#: ../ex_docmd.c:7841
msgid "E495: no autocommand file name to substitute for \"<afile>\""
msgstr "E495: nํl aon ainm comhaid uathordaithe le cur in ionad \"<afile>\""
-#: ../ex_docmd.c:7850
msgid "E496: no autocommand buffer number to substitute for \"<abuf>\""
msgstr "E496: nํl aon uimhir mhaolแn uathordaithe le cur in ionad \"<abuf>\""
-#: ../ex_docmd.c:7861
msgid "E497: no autocommand match name to substitute for \"<amatch>\""
msgstr ""
"E497: nํl aon ainm meaitseแla uathordaithe le cur in ionad \"<amatch>\""
-#: ../ex_docmd.c:7870
msgid "E498: no :source file name to substitute for \"<sfile>\""
msgstr "E498: nํl aon ainm comhaid :source le cur in ionad \"<sfile>\""
-#: ../ex_docmd.c:7876
-#, fuzzy
msgid "E842: no line number to use for \"<slnum>\""
-msgstr "E498: nํl aon ainm comhaid :source le cur in ionad \"<sfile>\""
+msgstr "E842: nํl aon lํne-uimhir ar fแil le haghaidh \"<slnum>\""
-#: ../ex_docmd.c:7903
-#, fuzzy, c-format
+#, no-c-format
msgid "E499: Empty file name for '%' or '#', only works with \":p:h\""
msgstr ""
"E499: Ainm comhaid folamh le haghaidh '%' n๓ '#', oibreoidh s้ le \":p:h\" "
"amhแin"
-#: ../ex_docmd.c:7905
msgid "E500: Evaluates to an empty string"
msgstr "E500: Luachแiltear ้ seo mar theaghrแn folamh"
-#: ../ex_docmd.c:8838
msgid "E195: Cannot open viminfo file for reading"
msgstr "E195: Nํ f้idir an comhad viminfo a oscailt chun l้amh"
-#: ../ex_eval.c:464
+msgid "E196: No digraphs in this version"
+msgstr "E196: Nํ cheadaํtear d้ghraif sa leagan seo"
+
msgid "E608: Cannot :throw exceptions with 'Vim' prefix"
msgstr "E608: Nํ f้idir eisceachtaํ a :throw le r้imํr 'Vim'"
#. always scroll up, don't overwrite
-#: ../ex_eval.c:496
#, c-format
msgid "Exception thrown: %s"
msgstr "Gineadh eisceacht: %s"
-#: ../ex_eval.c:545
#, c-format
msgid "Exception finished: %s"
msgstr "Eisceacht curtha i gcrํch: %s"
-#: ../ex_eval.c:546
#, c-format
msgid "Exception discarded: %s"
msgstr "Eisceacht curtha i leataobh: %s"
-#: ../ex_eval.c:588 ../ex_eval.c:634
#, c-format
-msgid "%s, line %<PRId64>"
-msgstr "%s, lํne %<PRId64>"
+msgid "%s, line %ld"
+msgstr "%s, lํne %ld"
#. always scroll up, don't overwrite
-#: ../ex_eval.c:608
#, c-format
msgid "Exception caught: %s"
msgstr "Lแimhseแladh eisceacht: %s"
-#: ../ex_eval.c:676
#, c-format
msgid "%s made pending"
msgstr "%s ar feitheamh anois"
-#: ../ex_eval.c:679
#, c-format
msgid "%s resumed"
msgstr "atosaํodh %s"
-#: ../ex_eval.c:683
#, c-format
msgid "%s discarded"
msgstr "%s curtha i leataobh"
-#: ../ex_eval.c:708
msgid "Exception"
msgstr "Eisceacht"
-#: ../ex_eval.c:713
msgid "Error and interrupt"
msgstr "Earrแid agus idirbhriseadh"
-#: ../ex_eval.c:715
msgid "Error"
msgstr "Earrแid"
#. if (pending & CSTP_INTERRUPT)
-#: ../ex_eval.c:717
msgid "Interrupt"
msgstr "Idirbhriseadh"
-#: ../ex_eval.c:795
msgid "E579: :if nesting too deep"
msgstr "E579: :if neadaithe r๓dhomhain"
-#: ../ex_eval.c:830
msgid "E580: :endif without :if"
msgstr "E580: :endif gan :if"
-#: ../ex_eval.c:873
msgid "E581: :else without :if"
msgstr "E581: :else gan :if"
-#: ../ex_eval.c:876
msgid "E582: :elseif without :if"
msgstr "E582: :elseif gan :if"
-#: ../ex_eval.c:880
msgid "E583: multiple :else"
msgstr "E583: :else iomad๚la"
-#: ../ex_eval.c:883
msgid "E584: :elseif after :else"
msgstr "E584: :elseif i ndiaidh :else"
-#: ../ex_eval.c:941
msgid "E585: :while/:for nesting too deep"
msgstr "E585: :while/:for neadaithe r๓dhomhain"
-#: ../ex_eval.c:1028
msgid "E586: :continue without :while or :for"
msgstr "E586: :continue gan :while nแ :for"
-#: ../ex_eval.c:1061
msgid "E587: :break without :while or :for"
msgstr "E587: :break gan :while nแ :for"
-#: ../ex_eval.c:1102
msgid "E732: Using :endfor with :while"
msgstr "E732: :endfor แ ๚sแid le :while"
-#: ../ex_eval.c:1104
msgid "E733: Using :endwhile with :for"
msgstr "E733: :endwhile แ ๚sแid le :for"
-#: ../ex_eval.c:1247
msgid "E601: :try nesting too deep"
msgstr "E601: :try neadaithe r๓dhomhain"
-#: ../ex_eval.c:1317
msgid "E603: :catch without :try"
msgstr "E603: :catch gan :try"
#. Give up for a ":catch" after ":finally" and ignore it.
#. * Just parse.
-#: ../ex_eval.c:1332
msgid "E604: :catch after :finally"
msgstr "E604: :catch i ndiaidh :finally"
-#: ../ex_eval.c:1451
msgid "E606: :finally without :try"
msgstr "E606: :finally gan :try"
#. Give up for a multiple ":finally" and ignore it.
-#: ../ex_eval.c:1467
msgid "E607: multiple :finally"
msgstr "E607: :finally iomad๚la"
-#: ../ex_eval.c:1571
msgid "E602: :endtry without :try"
msgstr "E602: :endtry gan :try"
-#: ../ex_eval.c:2026
msgid "E193: :endfunction not inside a function"
msgstr "E193: Caithfidh :endfunction a bheith isteach i bhfeidhm"
-#: ../ex_getln.c:1643
msgid "E788: Not allowed to edit another buffer now"
msgstr "E788: Nํl cead agat maolแn eile a chur in eagar anois"
-#: ../ex_getln.c:1656
msgid "E811: Not allowed to change buffer information now"
msgstr "E811: Nํl cead agat faisn้is an mhaolแin a athr๚ anois"
-#: ../ex_getln.c:3178
msgid "tagname"
msgstr "clibainm"
-#: ../ex_getln.c:3181
msgid " kind file\n"
msgstr " cineแl comhaid\n"
-#: ../ex_getln.c:4799
msgid "'history' option is zero"
msgstr "tแ an rogha 'history' nialas"
-#: ../ex_getln.c:5046
#, c-format
msgid ""
"\n"
@@ -1975,310 +1641,230 @@ msgstr ""
# this gets plugged into the %s in the previous string,
# hence the colon
-#: ../ex_getln.c:5047
msgid "Command Line"
msgstr "Lํne na nOrduithe:"
-#: ../ex_getln.c:5048
msgid "Search String"
msgstr "Teaghrแn Cuardaigh"
-#: ../ex_getln.c:5049
msgid "Expression"
msgstr "Sloinn:"
-#: ../ex_getln.c:5050
msgid "Input Line"
msgstr "Lํne an Ionchuir:"
-#: ../ex_getln.c:5117
+msgid "Debug Line"
+msgstr "Lํne Dhํfhabhtaithe"
+
msgid "E198: cmd_pchar beyond the command length"
msgstr "E198: cmd_pchar os cionn fad an ordaithe"
-#: ../ex_getln.c:5279
msgid "E199: Active window or buffer deleted"
msgstr "E199: Scriosadh an fhuinneog reatha n๓ an maolแn reatha"
-#: ../file_search.c:203
-msgid "E854: path too long for completion"
-msgstr ""
-
-#: ../file_search.c:446
-#, c-format
-msgid ""
-"E343: Invalid path: '**[number]' must be at the end of the path or be "
-"followed by '%s'."
-msgstr ""
-"E343: Conair neamhbhailํ: nํ m๓r '**[uimhir]' a bheith ag deireadh na "
-"conaire, n๓ le '%s' ina dhiaidh."
-
-#: ../file_search.c:1505
-#, c-format
-msgid "E344: Can't find directory \"%s\" in cdpath"
-msgstr "E344: Nํ f้idir comhadlann \"%s\" a aimsi๚ sa cdpath"
-
-#: ../file_search.c:1508
-#, c-format
-msgid "E345: Can't find file \"%s\" in path"
-msgstr "E345: Nํ f้idir comhad \"%s\" a aimsi๚ sa chonair"
-
-#: ../file_search.c:1512
-#, c-format
-msgid "E346: No more directory \"%s\" found in cdpath"
-msgstr "E346: Nํl comhadlann \"%s\" sa cdpath a thuilleadh"
-
-#: ../file_search.c:1515
-#, c-format
-msgid "E347: No more file \"%s\" found in path"
-msgstr "E347: Nํl comhad \"%s\" sa chonair a thuilleadh"
-
-#: ../fileio.c:137
msgid "E812: Autocommands changed buffer or buffer name"
msgstr "E812: Bhํ maolแn n๓ ainm maolแin athraithe ag orduithe uathoibrํocha"
-#: ../fileio.c:368
msgid "Illegal file name"
msgstr "Ainm comhaid neamhcheadaithe"
-#: ../fileio.c:395 ../fileio.c:476 ../fileio.c:2543 ../fileio.c:2578
msgid "is a directory"
msgstr "is comhadlann ้"
-#: ../fileio.c:397
msgid "is not a file"
msgstr "nํ comhad ้"
-#: ../fileio.c:508 ../fileio.c:3522
+msgid "is a device (disabled with 'opendevice' option)"
+msgstr "is gl้as ้ seo (dํchumasaithe le rogha 'opendevice')"
+
msgid "[New File]"
msgstr "[Comhad Nua]"
-#: ../fileio.c:511
msgid "[New DIRECTORY]"
msgstr "[COMHADLANN nua]"
-#: ../fileio.c:529 ../fileio.c:532
msgid "[File too big]"
msgstr "[Comhad r๓mh๓r]"
-#: ../fileio.c:534
msgid "[Permission Denied]"
msgstr "[Cead Di๚ltaithe]"
-#: ../fileio.c:653
msgid "E200: *ReadPre autocommands made the file unreadable"
msgstr "E200: Rinne uathorduithe *ReadPre praiseach as an chomhad"
-#: ../fileio.c:655
msgid "E201: *ReadPre autocommands must not change current buffer"
msgstr "E201: Nํ cheadaํtear d'uathorduithe *ReadPre an maolแn reatha a athr๚"
-#: ../fileio.c:672
-msgid "Nvim: Reading from stdin...\n"
+msgid "Vim: Reading from stdin...\n"
msgstr "Vim: Ag l้amh ๓n ionchur caighdeแnach...\n"
+msgid "Reading from stdin..."
+msgstr "Ag l้amh ๓n ionchur caighdeแnach..."
+
#. Re-opening the original file failed!
-#: ../fileio.c:909
msgid "E202: Conversion made file unreadable!"
msgstr "E202: Comhad dol้ite i ndiaidh an tiontaithe!"
-#. fifo or socket
-#: ../fileio.c:1782
msgid "[fifo/socket]"
msgstr "[fifo/soic้ad]"
# `TITA' ?! -KPS
-#. fifo
-#: ../fileio.c:1788
msgid "[fifo]"
msgstr "[fifo]"
-#. or socket
-#: ../fileio.c:1794
msgid "[socket]"
msgstr "[soic้ad]"
-#. or character special
-#: ../fileio.c:1801
msgid "[character special]"
msgstr "[comhad speisialta den chineแl carachtar]"
-#: ../fileio.c:1815
msgid "[CR missing]"
msgstr "[CR ar iarraidh]"
-#: ../fileio.c:1819
msgid "[long lines split]"
msgstr "[lํnte fada deighilte]"
-#: ../fileio.c:1823 ../fileio.c:3512
msgid "[NOT converted]"
msgstr "[Nอ tiontaithe]"
-#: ../fileio.c:1826 ../fileio.c:3515
msgid "[converted]"
msgstr "[tiontaithe]"
-#: ../fileio.c:1831
#, c-format
-msgid "[CONVERSION ERROR in line %<PRId64>]"
-msgstr "[EARRมID TIONTAITHE i lํne %<PRId64>]"
+msgid "[CONVERSION ERROR in line %ld]"
+msgstr "[EARRมID TIONTAITHE i lํne %ld]"
-#: ../fileio.c:1835
#, c-format
-msgid "[ILLEGAL BYTE in line %<PRId64>]"
-msgstr "[BEART NEAMHCHEADAITHE i lํne %<PRId64>]"
+msgid "[ILLEGAL BYTE in line %ld]"
+msgstr "[BEART NEAMHCHEADAITHE i lํne %ld]"
-#: ../fileio.c:1838
msgid "[READ ERRORS]"
msgstr "[EARRมIDอ LษIMH]"
-#: ../fileio.c:2104
msgid "Can't find temp file for conversion"
msgstr "Nํ f้idir comhad sealadach a aimsi๚ le haghaidh tiontaithe"
-#: ../fileio.c:2110
msgid "Conversion with 'charconvert' failed"
msgstr "Theip ar thiont๚ le 'charconvert'"
-#: ../fileio.c:2113
msgid "can't read output of 'charconvert'"
msgstr "nํ f้idir an t-aschur ๓ 'charconvert' a l้amh"
-#: ../fileio.c:2437
msgid "E676: No matching autocommands for acwrite buffer"
msgstr "E676: Nํl aon uathord๚ comhoiri๚naithe le haghaidh maolแin acwrite"
-#: ../fileio.c:2466
msgid "E203: Autocommands deleted or unloaded buffer to be written"
msgstr "E203: Scrios n๓ dhํluchtaigh uathorduithe an maolแn le scrํobh"
-#: ../fileio.c:2486
msgid "E204: Autocommand changed number of lines in unexpected way"
msgstr "E204: D'athraigh uathord๚ lํon na lํnte gan choinne"
-#: ../fileio.c:2548 ../fileio.c:2565
+msgid "NetBeans disallows writes of unmodified buffers"
+msgstr "Nํ cheadaํonn NetBeans maolแin gan athr๚ a bheith scrํofa"
+
+msgid "Partial writes disallowed for NetBeans buffers"
+msgstr "Nํ cheadaํtear maolแin NetBeans a bheith scrํofa go neamhiomlแn"
+
msgid "is not a file or writable device"
msgstr "nํ comhad nแ gl้as inscrํofa แ"
-#: ../fileio.c:2601
+msgid "writing to device disabled with 'opendevice' option"
+msgstr "dํchumasaํodh scrํobh chuig gl้as le rogha 'opendevice'"
+
msgid "is read-only (add ! to override)"
msgstr "is inl้ite amhแin ้ (cuir ! leis an ord๚ chun sแr๚)"
-#: ../fileio.c:2886
msgid "E506: Can't write to backup file (add ! to override)"
msgstr ""
"E506: Nํ f้idir scrํobh a dh้anamh sa chomhad c๚ltaca (๚sแid ! chun sแr๚)"
-#: ../fileio.c:2898
msgid "E507: Close error for backup file (add ! to override)"
msgstr ""
"E507: Earrแid agus comhad c๚ltaca แ dh๚nadh (cuir ! leis an ord๚ chun sแr๚)"
-#: ../fileio.c:2901
msgid "E508: Can't read file for backup (add ! to override)"
msgstr ""
"E508: Nํ f้idir an comhad c๚ltaca a l้amh (cuir ! leis an ord๚ chun sแr๚)"
-#: ../fileio.c:2923
msgid "E509: Cannot create backup file (add ! to override)"
msgstr ""
"E509: Nํ f้idir comhad c๚ltaca a chruth๚ (cuir ! leis an ord๚ chun sแr๚)"
-#: ../fileio.c:3008
msgid "E510: Can't make backup file (add ! to override)"
msgstr ""
"E510: Nํ f้idir comhad c๚ltaca a chruth๚ (cuir ! leis an ord๚ chun sแr๚)"
-#. Can't write without a tempfile!
-#: ../fileio.c:3121
+msgid "E460: The resource fork would be lost (add ! to override)"
+msgstr "E460: Chaillfํ an forc acmhainne (cuir ! leis an ord๚ chun sแr๚)"
+
msgid "E214: Can't find temp file for writing"
msgstr "E214: Nํ f้idir comhad sealadach a aimsi๚ chun scrํobh ann"
-#: ../fileio.c:3134
msgid "E213: Cannot convert (add ! to write without conversion)"
msgstr "E213: Nํ f้idir tiont๚ (cuir ! leis an ord๚ chun scrํobh gan tiont๚)"
-#: ../fileio.c:3169
msgid "E166: Can't open linked file for writing"
msgstr "E166: Nํ f้idir comhad nasctha a oscailt chun scrํobh ann"
-#: ../fileio.c:3173
msgid "E212: Can't open file for writing"
msgstr "E212: Nํ f้idir comhad a oscailt chun scrํobh ann"
-#: ../fileio.c:3363
msgid "E667: Fsync failed"
msgstr "E667: Theip ar fsync"
-#: ../fileio.c:3398
msgid "E512: Close failed"
msgstr "E512: Theip ar d๚nadh"
-#: ../fileio.c:3436
msgid "E513: write error, conversion failed (make 'fenc' empty to override)"
msgstr ""
"E513: earrแid le linn scrํobh, theip ar thiont๚ (๚sแid 'fenc' folamh chun "
"sแr๚)"
-#: ../fileio.c:3441
#, c-format
msgid ""
-"E513: write error, conversion failed in line %<PRId64> (make 'fenc' empty to "
+"E513: write error, conversion failed in line %ld (make 'fenc' empty to "
"override)"
msgstr ""
-"E513: earrแid le linn scrํofa, theip ar thiont๚ ar lํne %<PRId64> (๚sแid "
-"'fenc' folamh le sแr๚)"
+"E513: earrแid le linn scrํofa, theip ar thiont๚ ar lํne %ld (๚sแid 'fenc' "
+"folamh le sแr๚)"
-#: ../fileio.c:3448
msgid "E514: write error (file system full?)"
msgstr "E514: earrแid le linn scrํofa (an bhfuil an c๓ras comhaid lแn?)"
-#: ../fileio.c:3506
msgid " CONVERSION ERROR"
msgstr " EARRมID TIONTAITHE"
-#: ../fileio.c:3509
#, c-format
-msgid " in line %<PRId64>;"
-msgstr " ar lํne %<PRId64>;"
+msgid " in line %ld;"
+msgstr " ar lํne %ld;"
-#: ../fileio.c:3519
msgid "[Device]"
msgstr "[Gl้as]"
-#: ../fileio.c:3522
msgid "[New]"
msgstr "[Nua]"
-#: ../fileio.c:3535
msgid " [a]"
msgstr " [a]"
-#: ../fileio.c:3535
msgid " appended"
msgstr " iarcheangailte"
-#: ../fileio.c:3537
msgid " [w]"
msgstr " [w]"
-#: ../fileio.c:3537
msgid " written"
msgstr " scrํofa"
-#: ../fileio.c:3579
msgid "E205: Patchmode: can't save original file"
msgstr "E205: Patchmode: nํ f้idir an comhad bun๚sach a shแbhแil"
-#: ../fileio.c:3602
msgid "E206: patchmode: can't touch empty original file"
msgstr "E206: patchmode: nํ f้idir an comhad bun๚sach folamh a theagmhแil"
-#: ../fileio.c:3616
msgid "E207: Can't delete backup file"
msgstr "E207: Nํ f้idir an comhad c๚ltaca a scriosadh"
-#: ../fileio.c:3672
msgid ""
"\n"
"WARNING: Original file may be lost or damaged\n"
@@ -2286,96 +1872,75 @@ msgstr ""
"\n"
"RABHADH: Is f้idir gur caillte n๓ loite an comhad bun๚sach\n"
-#: ../fileio.c:3675
msgid "don't quit the editor until the file is successfully written!"
msgstr "nแ scoir go dtํ go scrํobhfaํ an comhad!"
-#: ../fileio.c:3795
msgid "[dos]"
msgstr "[dos]"
-#: ../fileio.c:3795
msgid "[dos format]"
msgstr "[formแid dos]"
-#: ../fileio.c:3801
msgid "[mac]"
msgstr "[mac]"
-#: ../fileio.c:3801
msgid "[mac format]"
msgstr "[formแid mac]"
-#: ../fileio.c:3807
msgid "[unix]"
msgstr "[unix]"
-#: ../fileio.c:3807
msgid "[unix format]"
msgstr "[formแid unix]"
-#: ../fileio.c:3831
msgid "1 line, "
msgstr "1 lํne, "
-#: ../fileio.c:3833
#, c-format
-msgid "%<PRId64> lines, "
-msgstr "%<PRId64> lํne, "
+msgid "%ld lines, "
+msgstr "%ld lํne, "
-#: ../fileio.c:3836
msgid "1 character"
msgstr "1 carachtar"
-#: ../fileio.c:3838
#, c-format
-msgid "%<PRId64> characters"
-msgstr "%<PRId64> carachtar"
+msgid "%lld characters"
+msgstr "%lld carachtar"
-#: ../fileio.c:3849
msgid "[noeol]"
msgstr "[ganEOL]"
-#: ../fileio.c:3849
msgid "[Incomplete last line]"
msgstr "[Is neamhiomlแn an lํne dheireanach]"
#. don't overwrite messages here
#. must give this prompt
#. don't use emsg() here, don't want to flush the buffers
-#: ../fileio.c:3865
msgid "WARNING: The file has been changed since reading it!!!"
msgstr "RABHADH: Athraํodh an comhad ๓ l้adh ้!!!"
-#: ../fileio.c:3867
msgid "Do you really want to write to it"
msgstr "An bhfuil t๚ cinnte gur mhaith leat ้ a scrํobh"
-#: ../fileio.c:4648
#, c-format
msgid "E208: Error writing to \"%s\""
msgstr "E208: Earrแid agus \"%s\" แ scrํobh"
-#: ../fileio.c:4655
#, c-format
msgid "E209: Error closing \"%s\""
msgstr "E209: Earrแid agus \"%s\" แ dh๚nadh"
-#: ../fileio.c:4657
#, c-format
msgid "E210: Error reading \"%s\""
msgstr "E210: Earrแid agus \"%s\" แ l้amh"
-#: ../fileio.c:4883
msgid "E246: FileChangedShell autocommand deleted buffer"
msgstr "E246: Scrios uathord๚ FileChangedShell an maolแn"
-#: ../fileio.c:4894
#, c-format
msgid "E211: File \"%s\" no longer available"
msgstr "E211: Nํl comhad \"%s\" ar fแil feasta"
-#: ../fileio.c:4906
#, c-format
msgid ""
"W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as "
@@ -2383,39 +1948,31 @@ msgid ""
msgstr ""
"W12: Rabhadh: Athraํodh comhad \"%s\" agus athraํodh an maolแn i Vim fosta"
-#: ../fileio.c:4907
msgid "See \":help W12\" for more info."
msgstr "Bain triail as \":help W12\" chun tuilleadh eolais a fhแil."
-#: ../fileio.c:4910
#, c-format
msgid "W11: Warning: File \"%s\" has changed since editing started"
msgstr "W11: Rabhadh: Athraํodh comhad \"%s\" ๓ tosaํodh ้ a chur in eagar"
-#: ../fileio.c:4911
msgid "See \":help W11\" for more info."
msgstr "Bain triail as \":help W11\" chun tuilleadh eolais a fhแil."
-#: ../fileio.c:4914
#, c-format
msgid "W16: Warning: Mode of file \"%s\" has changed since editing started"
msgstr ""
"W16: Rabhadh: Athraํodh m๓d an chomhaid \"%s\" ๓ tosaํodh ้ a chur in eagar"
-#: ../fileio.c:4915
msgid "See \":help W16\" for more info."
msgstr "Bain triail as \":help W16\" chun tuilleadh eolais a fhแil."
-#: ../fileio.c:4927
#, c-format
msgid "W13: Warning: File \"%s\" has been created after editing started"
msgstr "W13: Rabhadh: Cruthaํodh comhad \"%s\" ๓ tosaํodh ้ a chur in eagar"
-#: ../fileio.c:4947
msgid "Warning"
msgstr "Rabhadh"
-#: ../fileio.c:4948
msgid ""
"&OK\n"
"&Load File"
@@ -2423,819 +1980,604 @@ msgstr ""
"&OK\n"
"&Luchtaigh Comhad"
-#: ../fileio.c:5065
#, c-format
msgid "E462: Could not prepare for reloading \"%s\""
msgstr "E462: Nํ f้idir \"%s\" a ullmh๚ le haghaidh athluchtaithe"
-#: ../fileio.c:5078
#, c-format
msgid "E321: Could not reload \"%s\""
msgstr "E321: Nํ f้idir \"%s\" a athlucht๚"
-#: ../fileio.c:5601
msgid "--Deleted--"
msgstr "--Scriosta--"
-#: ../fileio.c:5732
#, c-format
msgid "auto-removing autocommand: %s <buffer=%d>"
msgstr "uathord๚ แ bhaint go huathoibrํoch: %s <maolแn=%d>"
#. the group doesn't exist
-#: ../fileio.c:5772
#, c-format
msgid "E367: No such group: \"%s\""
msgstr "E367: Nํl a leith้id de ghr๚pa: \"%s\""
-#: ../fileio.c:5897
+msgid "E936: Cannot delete the current group"
+msgstr "E936: Nํ f้idir an gr๚pa reatha a scriosadh"
+
+msgid "W19: Deleting augroup that is still in use"
+msgstr "W19: Iarracht ar augroup atแ f๓s in ๚sแid a scriosadh"
+
#, c-format
msgid "E215: Illegal character after *: %s"
msgstr "E215: Carachtar neamhcheadaithe i ndiaidh *: %s"
-#: ../fileio.c:5905
#, c-format
msgid "E216: No such event: %s"
msgstr "E216: Nํl a leith้id de theagmhas: %s"
-#: ../fileio.c:5907
#, c-format
msgid "E216: No such group or event: %s"
msgstr "E216: Nํl a leith้id de ghr๚pa n๓ theagmhas: %s"
#. Highlight title
-#: ../fileio.c:6090
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
"--- Uathorduithe ---"
-#: ../fileio.c:6293
#, c-format
msgid "E680: <buffer=%d>: invalid buffer number "
msgstr "E680: <maolแn=%d>: uimhir neamhbhailํ mhaolแin "
-#: ../fileio.c:6370
msgid "E217: Can't execute autocommands for ALL events"
msgstr "E217: Nํ f้idir uathorduithe a rith i gcomhair teagmhas UILE"
-#: ../fileio.c:6393
msgid "No matching autocommands"
msgstr "Nํl aon uathord๚ comhoiri๚naithe"
-#: ../fileio.c:6831
msgid "E218: autocommand nesting too deep"
msgstr "E218: uathord๚ neadaithe r๓dhomhain"
-#: ../fileio.c:7143
#, c-format
-msgid "%s Auto commands for \"%s\""
+msgid "%s Autocommands for \"%s\""
msgstr "%s Uathorduithe do \"%s\""
-#: ../fileio.c:7149
#, c-format
msgid "Executing %s"
msgstr "%s แ rith"
-#: ../fileio.c:7211
#, c-format
msgid "autocommand %s"
msgstr "uathord๚ %s"
-#: ../fileio.c:7795
msgid "E219: Missing {."
msgstr "E219: { ar iarraidh."
-#: ../fileio.c:7797
msgid "E220: Missing }."
msgstr "E220: } ar iarraidh."
-#: ../fold.c:93
msgid "E490: No fold found"
msgstr "E490: Nํor aimsํodh aon fhilleadh"
-#: ../fold.c:544
msgid "E350: Cannot create fold with current 'foldmethod'"
msgstr "E350: Nํ f้idir filleadh a chruth๚ leis an 'foldmethod' reatha"
-#: ../fold.c:546
msgid "E351: Cannot delete fold with current 'foldmethod'"
msgstr "E351: Nํ f้idir filleadh a scriosadh leis an 'foldmethod' reatha"
-#: ../fold.c:1784
-#, c-format
-msgid "+--%3ld lines folded "
-msgstr "+--%3ld lํne fillte "
-
-#. buffer has already been read
-#: ../getchar.c:273
msgid "E222: Add to read buffer"
msgstr "E222: Cuir leis an maolแn l้ite"
-#: ../getchar.c:2040
msgid "E223: recursive mapping"
msgstr "E223: mapแil athch๚rsach"
-#: ../getchar.c:2849
#, c-format
msgid "E224: global abbreviation already exists for %s"
msgstr "E224: tแ giorr๚chแn comhchoiteann ann cheana le haghaidh %s"
-#: ../getchar.c:2852
#, c-format
msgid "E225: global mapping already exists for %s"
msgstr "E225: tแ mapแil chomhchoiteann ann cheana le haghaidh %s"
-#: ../getchar.c:2952
#, c-format
msgid "E226: abbreviation already exists for %s"
msgstr "E226: tแ giorr๚chแn ann cheana le haghaidh %s"
-#: ../getchar.c:2955
#, c-format
msgid "E227: mapping already exists for %s"
msgstr "E227: tแ mapแil ann cheana le haghaidh %s"
-#: ../getchar.c:3008
msgid "No abbreviation found"
msgstr "Nํor aimsํodh aon ghiorr๚chแn"
-#: ../getchar.c:3010
msgid "No mapping found"
msgstr "Nํor aimsํodh aon mhapแil"
-#: ../getchar.c:3974
msgid "E228: makemap: Illegal mode"
msgstr "E228: makemap: M๓d neamhcheadaithe"
-#. key value of 'cedit' option
-#. type of cmdline window or 0
-#. result of cmdline window or 0
-#: ../globals.h:924
-msgid "--No lines in buffer--"
-msgstr "--Tแ an maolแn folamh--"
+msgid "E851: Failed to create a new process for the GUI"
+msgstr "E851: Nํorbh fh้idir pr๓iseas nua a chruth๚ don GUI"
-#.
-#. * The error messages that can be shared are included here.
-#. * Excluded are errors that are only used once and debugging messages.
-#.
-#: ../globals.h:996
-msgid "E470: Command aborted"
-msgstr "E470: Ord๚ tobscortha"
+msgid "E852: The child process failed to start the GUI"
+msgstr "E852: Theip ar an macphr๓iseas an GUI a thos๚"
-#: ../globals.h:997
-msgid "E471: Argument required"
-msgstr "E471: Tแ gแ le harg๓int"
+msgid "E229: Cannot start the GUI"
+msgstr "E229: Nํ f้idir an GUI a chur ag obair"
-#: ../globals.h:998
-msgid "E10: \\ should be followed by /, ? or &"
-msgstr "E10: Ba ch๓ir /, ? n๓ & a chur i ndiaidh \\"
-
-#: ../globals.h:1000
-msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
-msgstr ""
-"E11: Neamhbhailํ i bhfuinneog lํne na n-orduithe; <CR>=rith, CTRL-C=scoir"
+#, c-format
+msgid "E230: Cannot read from \"%s\""
+msgstr "E230: Nํ f้idir l้amh ๓ \"%s\""
-#: ../globals.h:1002
-msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
+msgid "E665: Cannot start GUI, no valid font found"
msgstr ""
-"E12: Nํ cheadaํtear ord๚ ๓ exrc/vimrc sa chomhadlann reatha nแ ๓ chuardach "
-"clibe"
-
-#: ../globals.h:1003
-msgid "E171: Missing :endif"
-msgstr "E171: :endif ar iarraidh"
-
-#: ../globals.h:1004
-msgid "E600: Missing :endtry"
-msgstr "E600: :endtry ar iarraidh"
+"E665: Nํ f้idir an GUI a chur ag obair, nํl aon chl๓fhoireann bhailํ ann"
-#: ../globals.h:1005
-msgid "E170: Missing :endwhile"
-msgstr "E170: :endwhile ar iarraidh"
+msgid "E231: 'guifontwide' invalid"
+msgstr "E231: 'guifontwide' neamhbhailํ"
-#: ../globals.h:1006
-msgid "E170: Missing :endfor"
-msgstr "E170: :endfor ar iarraidh"
+msgid "E599: Value of 'imactivatekey' is invalid"
+msgstr "E599: Luach neamhbhailํ ar 'imactivatekey'"
-#: ../globals.h:1007
-msgid "E588: :endwhile without :while"
-msgstr "E588: :endwhile gan :while"
-
-#: ../globals.h:1008
-msgid "E588: :endfor without :for"
-msgstr "E588: :endfor gan :for"
-
-#: ../globals.h:1009
-msgid "E13: File exists (add ! to override)"
-msgstr "E13: Tแ comhad ann cheana (cuir ! leis an ord๚ chun forscrํobh)"
-
-#: ../globals.h:1010
-msgid "E472: Command failed"
-msgstr "E472: Theip ar ord๚"
-
-#: ../globals.h:1011
-msgid "E473: Internal error"
-msgstr "E473: Earrแid inmheแnach"
+#, c-format
+msgid "E254: Cannot allocate color %s"
+msgstr "E254: Nํ f้idir dath %s a dhแileadh"
-#: ../globals.h:1012
-msgid "Interrupted"
-msgstr "Idirbhriste"
+msgid "No match at cursor, finding next"
+msgstr "Nํl a leith้id ag an ch๚rs๓ir, ag cuardach ar an ch้ad cheann eile"
-#: ../globals.h:1013
-msgid "E14: Invalid address"
-msgstr "E14: Drochsheoladh"
+msgid "<cannot open> "
+msgstr "<nํ f้idir a oscailt> "
-#: ../globals.h:1014
-msgid "E474: Invalid argument"
-msgstr "E474: Arg๓int neamhbhailํ"
-
-#: ../globals.h:1015
#, c-format
-msgid "E475: Invalid argument: %s"
-msgstr "E475: Arg๓int neamhbhailํ: %s"
+msgid "E616: vim_SelFile: can't get font %s"
+msgstr "E616: vim_SelFile: nํl aon fhแil ar an chl๓fhoireann %s"
-#: ../globals.h:1016
-#, c-format
-msgid "E15: Invalid expression: %s"
-msgstr "E15: Slonn neamhbhailํ: %s"
+msgid "E614: vim_SelFile: can't return to current directory"
+msgstr "E614: vim_SelFile: nํ f้idir dul ar ais go dtํ an chomhadlann reatha"
-#: ../globals.h:1017
-msgid "E16: Invalid range"
-msgstr "E16: Raon neamhbhailํ"
-
-#: ../globals.h:1018
-msgid "E476: Invalid command"
-msgstr "E476: Ord๚ neamhbhailํ"
+msgid "Pathname:"
+msgstr "Conair:"
-#: ../globals.h:1019
-#, c-format
-msgid "E17: \"%s\" is a directory"
-msgstr "E17: is comhadlann \"%s\""
+msgid "E615: vim_SelFile: can't get current directory"
+msgstr "E615: vim_SelFile: nํl an chomhadlann reatha ar fแil"
-#: ../globals.h:1020
-#, fuzzy
-msgid "E900: Invalid job id"
-msgstr "E49: M้id neamhbhailํ scrollaithe"
+msgid "OK"
+msgstr "OK"
-#: ../globals.h:1021
-msgid "E901: Job table is full"
-msgstr ""
+msgid "Cancel"
+msgstr "Cealaigh"
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
+msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
msgstr ""
+"Giuirl้id Scrollbharra: Nํ f้idir c้imseata an mhapa picteilํnํ a fhแil."
-#: ../globals.h:1024
-#, c-format
-msgid "E364: Library call failed for \"%s()\""
-msgstr "E364: Theip ar ghlao leabharlainne \"%s()\""
-
-#: ../globals.h:1026
-msgid "E19: Mark has invalid line number"
-msgstr "E19: Tแ lํne-uimhir neamhbhailํ ag an mharc"
-
-#: ../globals.h:1027
-msgid "E20: Mark not set"
-msgstr "E20: Marc gan socr๚"
+msgid "Vim dialog"
+msgstr "Dial๓g Vim"
-#: ../globals.h:1029
-msgid "E21: Cannot make changes, 'modifiable' is off"
+msgid "E232: Cannot create BalloonEval with both message and callback"
msgstr ""
-"E21: Nํ f้idir athruithe a chur i bhfeidhm, nํl an bhratach 'modifiable' "
-"socraithe"
+"E232: Nํ f้idir BalloonEval a chruth๚ le teachtaireacht agus aisghlaoch araon"
-#: ../globals.h:1030
-msgid "E22: Scripts nested too deep"
-msgstr "E22: scripteanna neadaithe r๓dhomhain"
+msgid "_Cancel"
+msgstr "_Cealaigh"
-#: ../globals.h:1031
-msgid "E23: No alternate file"
-msgstr "E23: Nํl aon chomhad malartach"
+msgid "_Save"
+msgstr "_Sแbhแil"
-#: ../globals.h:1032
-msgid "E24: No such abbreviation"
-msgstr "E24: Nํl a leith้id de ghiorr๚chแn ann"
+msgid "_Open"
+msgstr "_Oscail"
-#: ../globals.h:1033
-msgid "E477: No ! allowed"
-msgstr "E477: Nํ cheadaํtear !"
-
-#: ../globals.h:1035
-msgid "E25: Nvim does not have a built-in GUI"
-msgstr "E25: Nํ f้idir an GUI a ๚sแid: Nํor cumasaํodh ้ ag am tiomsaithe"
+msgid "_OK"
+msgstr "_OK"
-#: ../globals.h:1036
-#, c-format
-msgid "E28: No such highlight group name: %s"
-msgstr "E28: Nํl a leith้id d'ainm gr๚pa aibhsithe: %s"
+msgid ""
+"&Yes\n"
+"&No\n"
+"&Cancel"
+msgstr ""
+"&Tแ\n"
+"&Nํl\n"
+"&Cealaigh"
-#: ../globals.h:1037
-msgid "E29: No inserted text yet"
-msgstr "E29: Nํl aon t้acs ionsแite go dtํ seo"
+msgid "Yes"
+msgstr "Tแ"
-#: ../globals.h:1038
-msgid "E30: No previous command line"
-msgstr "E30: Nํl aon lํne na n-orduithe roimhe seo"
+msgid "No"
+msgstr "Nํl"
-#: ../globals.h:1039
-msgid "E31: No such mapping"
-msgstr "E31: Nํl a leith้id de mhapแil"
+msgid "Input _Methods"
+msgstr "_Modhanna ionchuir"
-#: ../globals.h:1040
-msgid "E479: No match"
-msgstr "E479: Nํl aon rud comhoiri๚nach ann"
+# in OLT --KPS
+msgid "VIM - Search and Replace..."
+msgstr "VIM - Cuardaigh agus Athchuir..."
-#: ../globals.h:1041
-#, c-format
-msgid "E480: No match: %s"
-msgstr "E480: Nํl aon rud comhoiri๚nach ann: %s"
+msgid "VIM - Search..."
+msgstr "VIM - Cuardaigh..."
-#: ../globals.h:1042
-msgid "E32: No file name"
-msgstr "E32: Nํl aon ainm comhaid"
+msgid "Find what:"
+msgstr "Aimsigh:"
-#: ../globals.h:1044
-msgid "E33: No previous substitute regular expression"
-msgstr "E33: Nํl aon slonn ionadaํochta roimhe seo"
+msgid "Replace with:"
+msgstr "Le cur in ionad:"
-#: ../globals.h:1045
-msgid "E34: No previous command"
-msgstr "E34: Nํl aon ord๚ roimhe seo"
+#. whole word only button
+msgid "Match whole word only"
+msgstr "Focal iomlแn amhแin"
-#: ../globals.h:1046
-msgid "E35: No previous regular expression"
-msgstr "E35: Nํl aon slonn ionadaํochta roimhe seo"
+#. match case button
+msgid "Match case"
+msgstr "Meaitseแil an cแs"
-#: ../globals.h:1047
-msgid "E481: No range allowed"
-msgstr "E481: Nํ cheadaํtear raon"
+msgid "Direction"
+msgstr "Treo"
-#: ../globals.h:1048
-msgid "E36: Not enough room"
-msgstr "E36: Nํl slํ a dh๓thain ann"
+#. 'Up' and 'Down' buttons
+msgid "Up"
+msgstr "Suas"
-#: ../globals.h:1049
-#, c-format
-msgid "E482: Can't create file %s"
-msgstr "E482: Nํ f้idir comhad %s a chruth๚"
+msgid "Down"
+msgstr "Sํos"
-#: ../globals.h:1050
-msgid "E483: Can't get temp file name"
-msgstr "E483: Nํl aon fhแil ar ainm comhaid sealadach"
+msgid "Find Next"
+msgstr "An Ch้ad Cheann Eile"
-#: ../globals.h:1051
-#, c-format
-msgid "E484: Can't open file %s"
-msgstr "E484: Nํ f้idir comhad %s a oscailt"
+msgid "Replace"
+msgstr "Ionadaigh"
-#: ../globals.h:1052
-#, c-format
-msgid "E485: Can't read file %s"
-msgstr "E485: Nํ f้idir comhad %s a l้amh"
+msgid "Replace All"
+msgstr "Ionadaigh Uile"
-#: ../globals.h:1054
-msgid "E37: No write since last change (add ! to override)"
-msgstr "E37: Tแ athruithe ann gan sแbhแil (cuir ! leis an ord๚ chun sแr๚)"
+msgid "_Close"
+msgstr "_D๚n"
-#: ../globals.h:1055
-#, fuzzy
-msgid "E37: No write since last change"
-msgstr "[Athraithe agus nach sแbhแilte ๓ shin]\n"
+msgid "Vim: Received \"die\" request from session manager\n"
+msgstr "Vim: Fuarthas iarratas \"die\" ๓ bhainisteoir an tseisi๚in\n"
-#: ../globals.h:1056
-msgid "E38: Null argument"
-msgstr "E38: Arg๓int nialasach"
+msgid "Close tab"
+msgstr "D๚n cluaisํn"
-#: ../globals.h:1057
-msgid "E39: Number expected"
-msgstr "E39: Ag s๚il le huimhir"
+msgid "New tab"
+msgstr "Cluaisํn nua"
-#: ../globals.h:1058
-#, c-format
-msgid "E40: Can't open errorfile %s"
-msgstr "E40: Nํ f้idir an comhad earrแide %s a oscailt"
+msgid "Open Tab..."
+msgstr "Oscail Cluaisํn..."
-#: ../globals.h:1059
-msgid "E41: Out of memory!"
-msgstr "E41: Cuimhne ํdithe!"
+msgid "Vim: Main window unexpectedly destroyed\n"
+msgstr "Vim: Milleadh an prํomhfhuinneog gan choinne\n"
-#: ../globals.h:1060
-msgid "Pattern not found"
-msgstr "Patr๚n gan aimsi๚"
+msgid "&Filter"
+msgstr "&Scagaire"
-#: ../globals.h:1061
-#, c-format
-msgid "E486: Pattern not found: %s"
-msgstr "E486: Patr๚n gan aimsi๚: %s"
+msgid "&Cancel"
+msgstr "&Cealaigh"
-#: ../globals.h:1062
-msgid "E487: Argument must be positive"
-msgstr "E487: Nํ folแir arg๓int dheimhneach"
+msgid "Directories"
+msgstr "Comhadlanna"
-#: ../globals.h:1064
-msgid "E459: Cannot go back to previous directory"
-msgstr "E459: Nํ f้idir a fhilleadh ar an chomhadlann roimhe seo"
+msgid "Filter"
+msgstr "Scagaire"
-#: ../globals.h:1066
-msgid "E42: No Errors"
-msgstr "E42: Nํl Aon Earrแid Ann"
+msgid "&Help"
+msgstr "&Cabhair"
-#: ../globals.h:1067
-msgid "E776: No location list"
-msgstr "E776: Gan liosta suํomh"
+msgid "Files"
+msgstr "Comhaid"
-#: ../globals.h:1068
-msgid "E43: Damaged match string"
-msgstr "E43: Teaghrแn cuardaigh loite"
+msgid "&OK"
+msgstr "&OK"
-#: ../globals.h:1069
-msgid "E44: Corrupted regexp program"
-msgstr "E44: Clแr na sloinn ionadaํochta truaillithe"
+msgid "Selection"
+msgstr "Roghn๚"
-#: ../globals.h:1071
-msgid "E45: 'readonly' option is set (add ! to override)"
-msgstr "E45: tแ an rogha 'readonly' socraithe (cuir ! leis an ord๚ chun sแr๚)"
+msgid "Find &Next"
+msgstr "An Ch้ad Chea&nn Eile"
-#: ../globals.h:1073
-#, c-format
-msgid "E46: Cannot change read-only variable \"%s\""
-msgstr "E46: Nํ f้idir athr๓g inl้ite amhแin \"%s\" a athr๚"
+msgid "&Replace"
+msgstr "&Ionadaigh"
-#: ../globals.h:1075
-#, c-format
-msgid "E794: Cannot set variable in the sandbox: \"%s\""
-msgstr "E794: Nํ f้idir athr๓g a shocr๚ sa bhosca gainimh: \"%s\""
+msgid "Replace &All"
+msgstr "Ionadaigh &Uile"
-#: ../globals.h:1076
-msgid "E47: Error while reading errorfile"
-msgstr "E47: Earrแid agus comhad earrแide แ l้amh"
+msgid "&Undo"
+msgstr "&Cealaigh"
-#: ../globals.h:1078
-msgid "E48: Not allowed in sandbox"
-msgstr "E48: Nํ cheadaํtear ้ seo i mbosca gainimh"
+msgid "Open tab..."
+msgstr "Oscail cluaisํn..."
-#: ../globals.h:1080
-msgid "E523: Not allowed here"
-msgstr "E523: Nํ cheadaํtear ้ anseo"
+msgid "Find string (use '\\\\' to find a '\\')"
+msgstr "Aimsigh teaghrแn (bain ๚sแid as '\\\\' chun '\\' a aimsi๚)"
-#: ../globals.h:1082
-msgid "E359: Screen mode setting not supported"
-msgstr "E359: Nํ f้idir an m๓d scแileแin a shocr๚"
+msgid "Find & Replace (use '\\\\' to find a '\\')"
+msgstr "Aimsigh & Athchuir (๚sแid '\\\\' chun '\\' a aimsi๚)"
-#: ../globals.h:1083
-msgid "E49: Invalid scroll size"
-msgstr "E49: M้id neamhbhailํ scrollaithe"
+#. We fake this: Use a filter that doesn't select anything and a default
+#. * file name that won't be used.
+msgid "Not Used"
+msgstr "Gan ฺsแid"
-#: ../globals.h:1084
-msgid "E91: 'shell' option is empty"
-msgstr "E91: rogha 'shell' folamh"
+msgid "Directory\t*.nothing\n"
+msgstr "Comhadlann\t*.neamhnํ\n"
-#: ../globals.h:1085
-msgid "E255: Couldn't read in sign data!"
-msgstr "E255: Nํorbh fh้idir na sonraํ comhartha a l้amh!"
+#, c-format
+msgid "E671: Cannot find window title \"%s\""
+msgstr "E671: Nํ f้idir teideal na fuinneoige \"%s\" a aimsi๚"
-#: ../globals.h:1086
-msgid "E72: Close error on swap file"
-msgstr "E72: Earrแid agus comhad babhtแla แ dh๚nadh"
+#, c-format
+msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
+msgstr "E243: Arg๓int gan tacaํocht: \"-%s\"; Bain ๚sแid as an leagan OLE."
-#: ../globals.h:1087
-msgid "E73: tag stack empty"
-msgstr "E73: tแ cruach na gclibeanna folamh"
+msgid "E672: Unable to open window inside MDI application"
+msgstr "E672: Nํ f้idir fuinneog a oscailt isteach i bhfeidhmchlแr MDI"
-#: ../globals.h:1088
-msgid "E74: Command too complex"
-msgstr "E74: Ord๚ r๓chasta"
+msgid "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
+msgstr ""
+"Vim E458: Nํ f้idir iontrแil dathmhapแla a dhแileadh, is f้idir go mbeidh "
+"dathanna mํchearta ann"
-#: ../globals.h:1089
-msgid "E75: Name too long"
-msgstr "E75: Ainm r๓fhada"
+#, c-format
+msgid "E250: Fonts for the following charsets are missing in fontset %s:"
+msgstr ""
+"E250: Cl๓nna ar iarraidh le haghaidh na dtacar carachtar i dtacar cl๓ %s:"
-#: ../globals.h:1090
-msgid "E76: Too many ["
-msgstr "E76: an iomarca ["
+#, c-format
+msgid "E252: Fontset name: %s"
+msgstr "E252: Ainm an tacar cl๓: %s"
-#: ../globals.h:1091
-msgid "E77: Too many file names"
-msgstr "E77: An iomarca ainmneacha comhaid"
+#, c-format
+msgid "Font '%s' is not fixed-width"
+msgstr "Nํ cl๓ aonleithid ้ '%s'"
-#: ../globals.h:1092
-msgid "E488: Trailing characters"
-msgstr "E488: Carachtair chun deiridh"
+#, c-format
+msgid "E253: Fontset name: %s"
+msgstr "E253: Ainm an tacar cl๓: %s"
-#: ../globals.h:1093
-msgid "E78: Unknown mark"
-msgstr "E78: Marc anaithnid"
+#, c-format
+msgid "Font0: %s"
+msgstr "Cl๓0: %s"
-#: ../globals.h:1094
-msgid "E79: Cannot expand wildcards"
-msgstr "E79: Nํ f้idir saor๓ga a leathn๚"
+#, c-format
+msgid "Font1: %s"
+msgstr "Cl๓1: %s"
-#: ../globals.h:1096
-msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
-msgstr "E591: nํ cheadaํtear 'winheight' a bheith nํos l๚ nแ 'winminheight'"
+#, c-format
+msgid "Font%ld width is not twice that of font0"
+msgstr "Nํl Cl๓%ld nํos leithne faoi dh๓ nแ cl๓0"
-#: ../globals.h:1098
-msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
-msgstr "E592: nํ cheadaํtear 'winwidth' a bheith nํos l๚ nแ 'winminwidth'"
+#, c-format
+msgid "Font0 width: %ld"
+msgstr "Leithead Cl๓0: %ld"
-#: ../globals.h:1099
-msgid "E80: Error while writing"
-msgstr "E80: Earrแid agus แ scrํobh"
+#, c-format
+msgid "Font1 width: %ld"
+msgstr "Leithead cl๓1: %ld"
-#: ../globals.h:1100
-msgid "Zero count"
-msgstr "Nialas"
+msgid "Invalid font specification"
+msgstr "Sonr๚ neamhbhailํ cl๓"
-#: ../globals.h:1101
-msgid "E81: Using <SID> not in a script context"
-msgstr "E81: <SID> แ ๚sแid nach i gcomhth้acs scripte"
+msgid "&Dismiss"
+msgstr "&Ruaig"
-#: ../globals.h:1102
-#, c-format
-msgid "E685: Internal error: %s"
-msgstr "E685: Earrแid inmheแnach: %s"
+msgid "no specific match"
+msgstr "nํl a leith้id ann"
-#: ../globals.h:1104
-msgid "E363: pattern uses more memory than 'maxmempattern'"
-msgstr "E363: ๚sแideann an patr๚n nํos m๓ cuimhne nแ 'maxmempattern'"
+msgid "Vim - Font Selector"
+msgstr "Vim - Roghn๚ Cl๓"
-#: ../globals.h:1105
-msgid "E749: empty buffer"
-msgstr "E749: maolแn folamh"
+msgid "Name:"
+msgstr "Ainm:"
-#: ../globals.h:1108
-msgid "E682: Invalid search pattern or delimiter"
-msgstr "E682: Patr๚n n๓ teormharc๓ir neamhbhailํ cuardaigh"
+#. create toggle button
+msgid "Show size in Points"
+msgstr "Taispeแin m้id (Pointํ)"
-#: ../globals.h:1109
-msgid "E139: File is loaded in another buffer"
-msgstr "E139: Tแ an comhad luchtaithe i maolแn eile"
+msgid "Encoding:"
+msgstr "Ionch๓d๚:"
-#: ../globals.h:1110
-#, c-format
-msgid "E764: Option '%s' is not set"
-msgstr "E764: Rogha '%s' gan socr๚"
+msgid "Font:"
+msgstr "Cl๓:"
-#: ../globals.h:1111
-#, fuzzy
-msgid "E850: Invalid register name"
-msgstr "E354: Ainm neamhbhailํ tabhaill: '%s'"
+msgid "Style:"
+msgstr "Stํl:"
-#: ../globals.h:1114
-msgid "search hit TOP, continuing at BOTTOM"
-msgstr "Buaileadh an BARR le linn an chuardaigh, ag lean๚int ag an CHRอOCH"
+msgid "Size:"
+msgstr "M้id:"
-#: ../globals.h:1115
-msgid "search hit BOTTOM, continuing at TOP"
-msgstr "Buaileadh an BUN le linn an chuardaigh, ag lean๚int ag an BHARR"
+msgid "E256: Hangul automata ERROR"
+msgstr "E256: EARRมID leis na huathoibreแin Hangul"
-#: ../hardcopy.c:240
msgid "E550: Missing colon"
msgstr "E550: Idirstad ar iarraidh"
-#: ../hardcopy.c:252
msgid "E551: Illegal component"
msgstr "E551: Comhphแirt neamhcheadaithe"
-#: ../hardcopy.c:259
msgid "E552: digit expected"
msgstr "E552: ag s๚il le digit"
-#: ../hardcopy.c:473
#, c-format
msgid "Page %d"
msgstr "Leathanach %d"
-#: ../hardcopy.c:597
msgid "No text to be printed"
msgstr "Nํl aon t้acs le priontแil"
-#: ../hardcopy.c:668
#, c-format
msgid "Printing page %d (%d%%)"
msgstr "Leathanach %d (%d%%) แ phriontแil"
-#: ../hardcopy.c:680
#, c-format
msgid " Copy %d of %d"
msgstr " C๓ip %d de %d"
-#: ../hardcopy.c:733
#, c-format
msgid "Printed: %s"
msgstr "Priontแilte: %s"
-#: ../hardcopy.c:740
msgid "Printing aborted"
msgstr "Priontแil tobscortha"
-#: ../hardcopy.c:1365
msgid "E455: Error writing to PostScript output file"
msgstr "E455: Earrแid le linn scrํobh chuig aschomhad PostScript"
-#: ../hardcopy.c:1747
#, c-format
msgid "E624: Can't open file \"%s\""
msgstr "E624: Nํ f้idir an comhad \"%s\" a oscailt"
-#: ../hardcopy.c:1756 ../hardcopy.c:2470
#, c-format
msgid "E457: Can't read PostScript resource file \"%s\""
msgstr "E457: Nํ f้idir comhad acmhainne PostScript \"%s\" a l้amh"
-#: ../hardcopy.c:1772
#, c-format
msgid "E618: file \"%s\" is not a PostScript resource file"
msgstr "E618: Nํl comhad \"%s\" ina chomhad acmhainne PostScript"
-#: ../hardcopy.c:1788 ../hardcopy.c:1805 ../hardcopy.c:1844
#, c-format
msgid "E619: file \"%s\" is not a supported PostScript resource file"
msgstr "E619: Tแ \"%s\" ina chomhad acmhainne PostScript gan tac๚"
-#: ../hardcopy.c:1856
#, c-format
msgid "E621: \"%s\" resource file has wrong version"
msgstr "E621: Tแ an leagan mํcheart ar an gcomhad acmhainne \"%s\""
-#: ../hardcopy.c:2225
msgid "E673: Incompatible multi-byte encoding and character set."
msgstr "E673: Ionch๓d๚ agus tacar carachtar ilbhirt neamh-chomhoiri๚nach."
-#: ../hardcopy.c:2238
msgid "E674: printmbcharset cannot be empty with multi-byte encoding."
msgstr ""
"E674: nํ cheadaํtear printmbcharset a bheith folamh le hionch๓d๚ ilbhirt."
-#: ../hardcopy.c:2254
msgid "E675: No default font specified for multi-byte printing."
msgstr "E675: Nํor r้amhshocraํodh cl๓ le haghaidh priontแla ilbhirt."
-#: ../hardcopy.c:2426
msgid "E324: Can't open PostScript output file"
msgstr "E324: Nํ f้idir aschomhad PostScript a oscailt"
-#: ../hardcopy.c:2458
#, c-format
msgid "E456: Can't open file \"%s\""
msgstr "E456: Nํ f้idir an comhad \"%s\" a oscailt"
-#: ../hardcopy.c:2583
msgid "E456: Can't find PostScript resource file \"prolog.ps\""
msgstr "E456: Comhad acmhainne PostScript \"prolog.ps\" gan aimsi๚"
-#: ../hardcopy.c:2593
msgid "E456: Can't find PostScript resource file \"cidfont.ps\""
msgstr "E456: Comhad acmhainne PostScript \"cidfont.ps\" gan aimsi๚"
-#: ../hardcopy.c:2622 ../hardcopy.c:2639 ../hardcopy.c:2665
#, c-format
msgid "E456: Can't find PostScript resource file \"%s.ps\""
msgstr "E456: Comhad acmhainne PostScript \"%s.ps\" gan aimsi๚"
-#: ../hardcopy.c:2654
#, c-format
msgid "E620: Unable to convert to print encoding \"%s\""
msgstr "E620: Nํ f้idir an t-ionch๓d๚ priontแla \"%s\" a thiont๚"
-#: ../hardcopy.c:2877
msgid "Sending to printer..."
msgstr "ม sheoladh chuig an phrint้ir..."
-#: ../hardcopy.c:2881
msgid "E365: Failed to print PostScript file"
msgstr "E365: Theip ar phriontแil comhaid PostScript"
-#: ../hardcopy.c:2883
msgid "Print job sent."
msgstr "Seoladh jab priontแla."
-#: ../if_cscope.c:85
msgid "Add a new database"
msgstr "Bunachar sonraํ nua"
-#: ../if_cscope.c:87
msgid "Query for a pattern"
msgstr "Iarratas ar phatr๚n"
-#: ../if_cscope.c:89
msgid "Show this message"
msgstr "Taispeแin an teachtaireacht seo"
-#: ../if_cscope.c:91
msgid "Kill a connection"
msgstr "Maraigh nasc"
-#: ../if_cscope.c:93
msgid "Reinit all connections"
msgstr "At๚saigh gach nasc"
-#: ../if_cscope.c:95
msgid "Show connections"
msgstr "Taispeแin naisc"
-#: ../if_cscope.c:101
#, c-format
msgid "E560: Usage: cs[cope] %s"
msgstr "E560: ฺsแid: cs[cope] %s"
-#: ../if_cscope.c:225
msgid "This cscope command does not support splitting the window.\n"
msgstr "Nํ f้idir fuinneoga a scoilteadh leis an ord๚ seo `cscope'.\n"
-#: ../if_cscope.c:266
msgid "E562: Usage: cstag <ident>"
msgstr "E562: ฺsแid: cstag <ident>"
-#: ../if_cscope.c:313
msgid "E257: cstag: tag not found"
msgstr "E257: cstag: clib gan aimsi๚"
-#: ../if_cscope.c:461
#, c-format
msgid "E563: stat(%s) error: %d"
msgstr "E563: earrแid stat(%s): %d"
-#: ../if_cscope.c:551
+msgid "E563: stat error"
+msgstr "E563: earrแid stat"
+
#, c-format
msgid "E564: %s is not a directory or a valid cscope database"
msgstr "E564: Nํl %s ina comhadlann n๓ bunachar sonraํ cscope bailํ"
-#: ../if_cscope.c:566
#, c-format
msgid "Added cscope database %s"
msgstr "Bunachar sonraํ nua cscope: %s"
-#: ../if_cscope.c:616
#, c-format
-msgid "E262: error reading cscope connection %<PRId64>"
-msgstr "E262: earrแid agus an nasc cscope %<PRId64> แ l้amh"
+msgid "E262: error reading cscope connection %ld"
+msgstr "E262: earrแid agus an nasc cscope %ld แ l้amh"
-#: ../if_cscope.c:711
msgid "E561: unknown cscope search type"
msgstr "E561: cineแl anaithnid cuardaigh cscope"
-#: ../if_cscope.c:752 ../if_cscope.c:789
msgid "E566: Could not create cscope pipes"
msgstr "E566: Nํorbh fh้idir pํopaํ cscope a chruth๚"
-#: ../if_cscope.c:767
msgid "E622: Could not fork for cscope"
msgstr "E622: Nํorbh fh้idir forc a dh้anamh le haghaidh cscope"
-#: ../if_cscope.c:849
-#, fuzzy
msgid "cs_create_connection setpgid failed"
-msgstr "theip ar rith cs_create_connection"
+msgstr "theip ar setpgid do cs_create_connection"
-#: ../if_cscope.c:853 ../if_cscope.c:889
msgid "cs_create_connection exec failed"
msgstr "theip ar rith cs_create_connection"
-#: ../if_cscope.c:863 ../if_cscope.c:902
msgid "cs_create_connection: fdopen for to_fp failed"
msgstr "cs_create_connection: theip ar fdopen le haghaidh to_fp"
-#: ../if_cscope.c:865 ../if_cscope.c:906
msgid "cs_create_connection: fdopen for fr_fp failed"
msgstr "cs_create_connection: theip ar fdopen le haghaidh fr_fp"
-#: ../if_cscope.c:890
msgid "E623: Could not spawn cscope process"
msgstr "E623: Nํorbh fh้idir pr๓iseas cscope a sceitheadh"
-#: ../if_cscope.c:932
msgid "E567: no cscope connections"
msgstr "E567: nํl aon nasc cscope ann"
-#: ../if_cscope.c:1009
#, c-format
msgid "E469: invalid cscopequickfix flag %c for %c"
msgstr "E469: bratach neamhbhailํ cscopequickfix %c le haghaidh %c"
-#: ../if_cscope.c:1058
#, c-format
msgid "E259: no matches found for cscope query %s of %s"
msgstr ""
"E259: nํor aimsํodh aon rud comhoiri๚nach leis an iarratas cscope %s de %s"
-#: ../if_cscope.c:1142
msgid "cscope commands:\n"
msgstr "Orduithe cscope:\n"
-#: ../if_cscope.c:1150
#, c-format
msgid "%-5s: %s%*s (Usage: %s)"
msgstr "%-5s: %s%*s (ฺsแid: %s)"
-#: ../if_cscope.c:1155
-#, fuzzy
msgid ""
"\n"
+" a: Find assignments to this symbol\n"
" c: Find functions calling this function\n"
" d: Find functions called by this function\n"
" e: Find this egrep pattern\n"
@@ -3246,6 +2588,7 @@ msgid ""
" t: Find this text string\n"
msgstr ""
"\n"
+" a: Aimsigh rแitis sannachแin leis an tsiombail seo\n"
" c: Aimsigh feidhmeanna a chuireann glaoch ar an bhfeidhm seo\n"
" d: Aimsigh feidhmeanna a gcuireann an fheidhm seo glaoch orthu\n"
" e: Aimsigh an patr๚n egrep seo\n"
@@ -3253,33 +2596,34 @@ msgstr ""
" g: Aimsigh an sainmhํni๚ seo\n"
" i: Aimsigh comhaid a #include-แil an comhad seo\n"
" s: Aimsigh an tsiombail C seo\n"
-" t: Aimsigh sanntaํ do\n"
+" t: Aimsigh an teaghrแn t้acs seo\n"
+
+#, c-format
+msgid "E625: cannot open cscope database: %s"
+msgstr "E625: nํ f้idir bunachar sonraํ cscope a oscailt: %s"
+
+msgid "E626: cannot get cscope database information"
+msgstr "E626: nํ f้idir eolas a fhแil faoin bhunachar sonraํ cscope"
-#: ../if_cscope.c:1226
msgid "E568: duplicate cscope database not added"
msgstr "E568: nํor cuireadh bunachar sonraํ d๚blach cscope leis"
-#: ../if_cscope.c:1335
#, c-format
msgid "E261: cscope connection %s not found"
msgstr "E261: nasc cscope %s gan aimsi๚"
-#: ../if_cscope.c:1364
#, c-format
msgid "cscope connection %s closed"
msgstr "D๚nadh nasc cscope %s"
#. should not reach here
-#: ../if_cscope.c:1486
msgid "E570: fatal error in cs_manage_matches"
msgstr "E570: earrแid mharfach i cs_manage_matches"
-#: ../if_cscope.c:1693
#, c-format
msgid "Cscope tag: %s"
msgstr "Clib cscope: %s"
-#: ../if_cscope.c:1711
msgid ""
"\n"
" # line"
@@ -3287,88 +2631,306 @@ msgstr ""
"\n"
" # lํne"
-#: ../if_cscope.c:1713
msgid "filename / context / line\n"
msgstr "ainm comhaid / comhth้acs / lํne\n"
-#: ../if_cscope.c:1809
#, c-format
msgid "E609: Cscope error: %s"
msgstr "E609: Earrแid cscope: %s"
-#: ../if_cscope.c:2053
msgid "All cscope databases reset"
msgstr "Athshocraํodh gach bunachar sonraํ cscope"
-#: ../if_cscope.c:2123
msgid "no cscope connections\n"
msgstr "nํl aon nasc cscope\n"
-#: ../if_cscope.c:2126
msgid " # pid database name prepend path\n"
msgstr " # pid ainm bunachair conair thosaigh\n"
-#: ../main.c:144
+msgid "Lua library cannot be loaded."
+msgstr "Nํ f้idir an leabharlann Lua a lucht๚."
+
+msgid "cannot save undo information"
+msgstr "nํ f้idir eolas cealaithe a shแbhแil"
+
+msgid ""
+"E815: Sorry, this command is disabled, the MzScheme libraries could not be "
+"loaded."
+msgstr ""
+"E815: Tแ br๓n orm, bhํ an t-ord๚ seo dํchumasaithe, nํorbh fh้idir "
+"leabharlanna MzScheme a lucht๚."
+
+msgid ""
+"E895: Sorry, this command is disabled, the MzScheme's racket/base module "
+"could not be loaded."
+msgstr ""
+"E895: มr leithsc้al, tแ an t-ord๚ seo dํchumasaithe; nํorbh fh้idir mod๚l "
+"racket/base MzScheme a lucht๚."
+
+msgid "invalid expression"
+msgstr "slonn neamhbhailํ"
+
+msgid "expressions disabled at compile time"
+msgstr "dํchumasaํodh sloinn ag am an tiomsaithe"
+
+msgid "hidden option"
+msgstr "rogha fholaithe"
+
+msgid "unknown option"
+msgstr "rogha anaithnid"
+
+msgid "window index is out of range"
+msgstr "inn้acs fuinneoige as raon"
+
+msgid "couldn't open buffer"
+msgstr "nํ f้idir maolแn a oscailt"
+
+msgid "cannot delete line"
+msgstr "nํ f้idir an lํne a scriosadh"
+
+msgid "cannot replace line"
+msgstr "nํ f้idir an lํne a athchur"
+
+msgid "cannot insert line"
+msgstr "nํ f้idir lํne a ionsแ"
+
+msgid "string cannot contain newlines"
+msgstr "nํ cheadaํtear carachtair lํne nua sa teaghrแn"
+
+msgid "error converting Scheme values to Vim"
+msgstr "earrแid agus luach Scheme แ thiont๚ go Vim"
+
+msgid "Vim error: ~a"
+msgstr "earrแid Vim: ~a"
+
+msgid "Vim error"
+msgstr "earrแid Vim"
+
+msgid "buffer is invalid"
+msgstr "maolแn neamhbhailํ"
+
+msgid "window is invalid"
+msgstr "fuinneog neamhbhailํ"
+
+msgid "linenr out of range"
+msgstr "lํne-uimhir as raon"
+
+msgid "not allowed in the Vim sandbox"
+msgstr "nํ cheadaํtear ้ seo i mbosca gainimh Vim"
+
+msgid "E836: This Vim cannot execute :python after using :py3"
+msgstr ""
+"E836: Nํ f้idir leis an leagan seo de Vim :python a rith tar ้is :py3 a ๚sแid"
+
+msgid ""
+"E263: Sorry, this command is disabled, the Python library could not be "
+"loaded."
+msgstr ""
+"E263: Tแ br๓n orm, nํl an t-ord๚ seo le fแil, nํorbh fh้idir an leabharlann "
+"Python a lucht๚."
+
+msgid ""
+"E887: Sorry, this command is disabled, the Python's site module could not be "
+"loaded."
+msgstr ""
+"E887: มr leithsc้al, nํl an t-ord๚ seo le fแil, nํorbh fh้idir an mod๚l "
+"Python a lucht๚."
+
+msgid "E659: Cannot invoke Python recursively"
+msgstr "E659: Nํ f้idir Python a rith go hathch๚rsach"
+
+msgid "E837: This Vim cannot execute :py3 after using :python"
+msgstr ""
+"E837: Nํ f้idir leis an leagan seo de Vim :py3 a rith tar ้is :python a ๚sแid"
+
+msgid "E265: $_ must be an instance of String"
+msgstr "E265: caithfidh $_ a bheith cineแl Teaghrแin"
+
+msgid ""
+"E266: Sorry, this command is disabled, the Ruby library could not be loaded."
+msgstr ""
+"E266: Tแ br๓n orm, nํl an t-ord๚ seo le fแil, nํorbh fh้idir an leabharlann "
+"Ruby a lucht๚."
+
+msgid "E267: unexpected return"
+msgstr "E267: \"return\" gan choinne"
+
+msgid "E268: unexpected next"
+msgstr "E268: \"next\" gan choinne"
+
+msgid "E269: unexpected break"
+msgstr "E269: \"break\" gan choinne"
+
+msgid "E270: unexpected redo"
+msgstr "E270: \"redo\" gan choinne"
+
+msgid "E271: retry outside of rescue clause"
+msgstr "E271: \"retry\" taobh amuigh de chlแsal tarrthแla"
+
+msgid "E272: unhandled exception"
+msgstr "E272: eisceacht gan lแimhseแil"
+
+#, c-format
+msgid "E273: unknown longjmp status %d"
+msgstr "E273: stแdas anaithnid longjmp %d"
+
+msgid "invalid buffer number"
+msgstr "uimhir neamhbhailํ mhaolแin"
+
+msgid "not implemented yet"
+msgstr "nํl ar fแil"
+
+#. ???
+msgid "cannot set line(s)"
+msgstr "nํ f้idir lํn(t)e a shocr๚"
+
+msgid "invalid mark name"
+msgstr "ainm neamhbhailํ mairc"
+
+msgid "mark not set"
+msgstr "marc gan socr๚"
+
+#, c-format
+msgid "row %d column %d"
+msgstr "lํne %d col๚n %d"
+
+msgid "cannot insert/append line"
+msgstr "nํ f้idir lํne a ionsแ/iarcheangal"
+
+msgid "line number out of range"
+msgstr "lํne-uimhir as raon"
+
+msgid "unknown flag: "
+msgstr "bratach anaithnid: "
+
+msgid "unknown vimOption"
+msgstr "vimOption anaithnid"
+
+msgid "keyboard interrupt"
+msgstr "idirbhriseadh m้archlแir"
+
+msgid "vim error"
+msgstr "earrแid vim"
+
+msgid "cannot create buffer/window command: object is being deleted"
+msgstr "nํ f้idir ord๚ maolแin/fuinneoige a chruth๚: r้ad แ scriosadh"
+
+msgid ""
+"cannot register callback command: buffer/window is already being deleted"
+msgstr "nํ f้idir ord๚ aisghlaoch a chlแr๚: maolแn/fuinneog แ scriosadh cheana"
+
+#. This should never happen. Famous last word?
+msgid ""
+"E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-dev@vim."
+"org"
+msgstr ""
+"E280: EARRมID MHARFACH TCL: liosta truaillithe tagartha!? Seol tuairisc "
+"fhabht chuig <vim-dev@vim.org> le do thoil"
+
+msgid "cannot register callback command: buffer/window reference not found"
+msgstr ""
+"nํ f้idir ord๚ aisghlaoch a chlแr๚: tagairt mhaolแn/fhuinneoige gan aimsi๚"
+
+msgid ""
+"E571: Sorry, this command is disabled: the Tcl library could not be loaded."
+msgstr ""
+"E571: Tแ br๓n orm, nํl an t-ord๚ seo le fแil: nํorbh fh้idir an leabharlann "
+"Tcl a lucht๚."
+
+#, c-format
+msgid "E572: exit code %d"
+msgstr "E572: c๓d scortha %d"
+
+msgid "cannot get line"
+msgstr "nํ f้idir an lํne a fhแil"
+
+msgid "Unable to register a command server name"
+msgstr "Nํ f้idir ainm fhreastalaํ ordaithe a chlแr๚"
+
+msgid "E248: Failed to send command to the destination program"
+msgstr "E248: Theip ar sheoladh ord๚ chuig an sprioc-chlแr"
+
+#, c-format
+msgid "E573: Invalid server id used: %s"
+msgstr "E573: Aitheantas neamhbhailํ freastalaํ in ๚sแid: %s"
+
+msgid "E251: VIM instance registry property is badly formed. Deleted!"
+msgstr "E251: Airํ mํchumtha sa chlแrlann แisc VIM. Scriosta!"
+
+#, c-format
+msgid "E938: Duplicate key in JSON: \"%s\""
+msgstr "E938: Eochair dh๚blach in JSON: \"%s\""
+
+#, c-format
+msgid "E696: Missing comma in List: %s"
+msgstr "E696: Cam๓g ar iarraidh i Liosta: %s"
+
+#, c-format
+msgid "E697: Missing end of List ']': %s"
+msgstr "E697: ']' ar iarraidh ag deireadh liosta: %s"
+
msgid "Unknown option argument"
msgstr "Arg๓int anaithnid rogha"
-#: ../main.c:146
msgid "Too many edit arguments"
msgstr "An iomarca arg๓intํ eagarth๓ireachta"
-#: ../main.c:148
msgid "Argument missing after"
msgstr "Arg๓int ar iarraidh i ndiaidh"
-#: ../main.c:150
msgid "Garbage after option argument"
msgstr "Dramhaํl i ndiaidh arg๓inte rogha"
-#: ../main.c:152
msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"
msgstr ""
"An iomarca arg๓intํ den chineแl \"+ord๚\", \"-c ord๚\" n๓ \"--cmd ord๚\""
-#: ../main.c:154
msgid "Invalid argument for"
msgstr "Arg๓int neamhbhailํ do"
-#: ../main.c:294
#, c-format
msgid "%d files to edit\n"
msgstr "%d comhad le heagr๚\n"
-#: ../main.c:1342
+msgid "netbeans is not supported with this GUI\n"
+msgstr "Nํ thacaํtear le netbeans sa GUI seo\n"
+
+msgid "'-nb' cannot be used: not enabled at compile time\n"
+msgstr "Nํ f้idir '-nb' a ๚sแid: nํor cumasaํodh ้ ag am tiomsaithe\n"
+
+msgid "This Vim was not compiled with the diff feature."
+msgstr "Nํor tiomsaํodh an leagan Vim seo le `diff' ar fแil."
+
msgid "Attempt to open script file again: \""
msgstr "D้an iarracht ar oscailt na scripte arํs: \""
-#: ../main.c:1350
msgid "Cannot open for reading: \""
msgstr "Nํ f้idir ้ a oscailt chun l้amh: \""
-#: ../main.c:1393
msgid "Cannot open for script output: \""
msgstr "Nํ f้idir a oscailt le haghaidh an aschuir scripte: \""
-#: ../main.c:1622
+msgid "Vim: Error: Failure to start gvim from NetBeans\n"
+msgstr "Vim: Earrแid: Theip ar thos๚ gvim ๓ NetBeans\n"
+
+msgid "Vim: Error: This version of Vim does not run in a Cygwin terminal\n"
+msgstr ""
+"Vim: Earrแid: Nํ f้idir an leagan seo de Vim a rith i dteirmin้al Cygwin\n"
+
msgid "Vim: Warning: Output is not to a terminal\n"
msgstr "Vim: Rabhadh: Nํl an t-aschur ag dul chuig teirmin้al\n"
-#: ../main.c:1624
msgid "Vim: Warning: Input is not from a terminal\n"
msgstr "Vim: Rabhadh: Nํl an t-ionchur ag teacht ๓ theirmin้al\n"
#. just in case..
-#: ../main.c:1891
msgid "pre-vimrc command line"
msgstr "lํne na n-orduithe pre-vimrc"
-#: ../main.c:1964
#, c-format
msgid "E282: Cannot read from \"%s\""
msgstr "E282: Nํ f้idir l้amh ๓ \"%s\""
-#: ../main.c:2149
msgid ""
"\n"
"More info with: \"vim -h\"\n"
@@ -3376,37 +2938,30 @@ msgstr ""
"\n"
"Tuilleadh eolais: \"vim -h\"\n"
-#: ../main.c:2178
msgid "[file ..] edit specified file(s)"
msgstr "[comhad ..] cuir na comhaid ceaptha in eagar"
-#: ../main.c:2179
msgid "- read text from stdin"
msgstr "- scrํobh t้acs ๓ stdin"
-#: ../main.c:2180
msgid "-t tag edit file where tag is defined"
msgstr "-t tag cuir an comhad ina bhfuil an chlib in eagar"
-#: ../main.c:2181
msgid "-q [errorfile] edit file with first error"
msgstr "-q [comhadearr] cuir comhad leis an ch้ad earrแid in eagar"
-#: ../main.c:2187
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
"๚sแid:"
-#: ../main.c:2189
msgid " vim [arguments] "
msgstr " vim [arg๓intํ] "
-#: ../main.c:2193
msgid ""
"\n"
" or:"
@@ -3414,7 +2969,14 @@ msgstr ""
"\n"
" n๓:"
-#: ../main.c:2196
+msgid ""
+"\n"
+"Where case is ignored prepend / to make flag upper case"
+msgstr ""
+"\n"
+"Nuair nach cแsํogair ้, cuir '/' ag tosach na brataํ chun ํ a chur sa chแs "
+"uachtair"
+
msgid ""
"\n"
"\n"
@@ -3424,194 +2986,343 @@ msgstr ""
"\n"
"Arg๓intํ:\n"
-#: ../main.c:2197
msgid "--\t\t\tOnly file names after this"
msgstr "--\t\t\tNํ cheadaํtear ach ainmneacha comhaid i ndiaidh ้ seo"
-#: ../main.c:2199
msgid "--literal\t\tDon't expand wildcards"
msgstr "--literal\t\tNแ leathnaigh saor๓ga"
-#: ../main.c:2201
+msgid "-register\t\tRegister this gvim for OLE"
+msgstr "-register\t\tClแraigh an gvim seo le haghaidh OLE"
+
+msgid "-unregister\t\tUnregister gvim for OLE"
+msgstr "-unregister\t\tDํchlแraigh an gvim seo le haghaidh OLE"
+
+msgid "-g\t\t\tRun using GUI (like \"gvim\")"
+msgstr "-g\t\t\tRith agus ๚sแid an GUI (mar \"gvim\")"
+
+msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
+msgstr "-f n๓ --nofork\tTulra: Nแ d้an forc agus an GUI แ thos๚"
+
msgid "-v\t\t\tVi mode (like \"vi\")"
msgstr "-v\t\t\tM๓d Vi (mar \"vi\")"
-#: ../main.c:2202
msgid "-e\t\t\tEx mode (like \"ex\")"
msgstr "-e\t\t\tM๓d Ex (mar \"ex\")"
-#: ../main.c:2203
msgid "-E\t\t\tImproved Ex mode"
-msgstr ""
+msgstr "-E\t\t\tM๓d Ex feabhsaithe"
-#: ../main.c:2204
msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")"
msgstr "-s\t\t\tM๓d ci๚in (baiscphr๓iseแla) (do \"ex\" amhแin)"
-#: ../main.c:2205
msgid "-d\t\t\tDiff mode (like \"vimdiff\")"
msgstr "-d\t\t\tM๓d diff (mar \"vimdiff\")"
-#: ../main.c:2206
msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
msgstr "-y\t\t\tM๓d ้asca (mar \"evim\", gan mh๓id)"
-#: ../main.c:2207
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tM๓d inl้ite amhแin (mar \"view\")"
-#: ../main.c:2208
msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
msgstr "-Z\t\t\tM๓d srianta (mar \"rvim\")"
-#: ../main.c:2209
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tNํ cheadaํtear athruithe (.i. scrํobh na gcomhad)"
-#: ../main.c:2210
msgid "-M\t\t\tModifications in text not allowed"
msgstr "-M\t\t\tNํ cheadaํtear athruithe sa t้acs"
-#: ../main.c:2211
msgid "-b\t\t\tBinary mode"
msgstr "-b\t\t\tM๓d d้nแrtha"
-#: ../main.c:2212
msgid "-l\t\t\tLisp mode"
msgstr "-l\t\t\tM๓d Lisp"
-#: ../main.c:2213
msgid "-C\t\t\tCompatible with Vi: 'compatible'"
msgstr "-C\t\t\tComhoiri๚nach le Vi: 'compatible'"
-#: ../main.c:2214
msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'"
msgstr "-N\t\t\tNํ comhoiri๚naithe le Vi go hiomlแn: 'nocompatible'"
-#: ../main.c:2215
msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]"
msgstr ""
"-V[N][fname]\t\tBํ foclach [leibh้al N] [logแil teachtaireachtaํ i fname]"
-#: ../main.c:2216
msgid "-D\t\t\tDebugging mode"
msgstr "-D\t\t\tM๓d dํfhabhtaithe"
-#: ../main.c:2217
msgid "-n\t\t\tNo swap file, use memory only"
msgstr "-n\t\t\tNแ h๚sแid comhad babhtแla .i. nแ h๚sแid ach an chuimhne"
-#: ../main.c:2218
msgid "-r\t\t\tList swap files and exit"
msgstr "-r\t\t\tTaispeแin comhaid bhabhtแla agus scoir"
-#: ../main.c:2219
msgid "-r (with file name)\tRecover crashed session"
msgstr "-r (le hainm comhaid)\tAthshlแnaigh ๓ chliseadh"
-#: ../main.c:2220
msgid "-L\t\t\tSame as -r"
msgstr "-L\t\t\tAr comhbhrํ le -r"
-#: ../main.c:2221
-msgid "-A\t\t\tstart in Arabic mode"
-msgstr "-A\t\t\ttosaigh sa mh๓d Araibise"
+msgid "-f\t\t\tDon't use newcli to open window"
+msgstr "-f\t\t\tNแ h๚sแid newcli chun fuinneog a oscailt"
+
+msgid "-dev <device>\t\tUse <device> for I/O"
+msgstr "-dev <gl้as>\t\tBain ๚sแid as <gl้as> do I/A"
+
+msgid "-A\t\t\tStart in Arabic mode"
+msgstr "-A\t\t\tTosaigh sa mh๓d Araibise"
-#: ../main.c:2222
msgid "-H\t\t\tStart in Hebrew mode"
msgstr "-H\t\t\tTosaigh sa mh๓d Eabhraise"
-#: ../main.c:2223
msgid "-F\t\t\tStart in Farsi mode"
msgstr "-F\t\t\tTosaigh sa mh๓d Pheirsise"
-#: ../main.c:2224
msgid "-T <terminal>\tSet terminal type to <terminal>"
msgstr "-T <teirmin้al>\tSocraigh cineแl teirmin้al"
-#: ../main.c:2225
+msgid "--not-a-term\t\tSkip warning for input/output not being a terminal"
+msgstr ""
+"--not-a-term\t\tNแ bac le rabhadh faoi ionchur/aschur gan a bheith ๓n "
+"teirmin้al"
+
+msgid "--ttyfail\t\tExit if input or output is not a terminal"
+msgstr "--ttyfail\t\tScoir mura bhfuil ionchur agus aschur ina dteirmin้il"
+
msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc"
msgstr "-u <vimrc>\t\tฺsแid <vimrc> in ionad aon .vimrc"
-#: ../main.c:2226
+msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
+msgstr "-U <gvimrc>\t\tBain ๚sแid as <gvimrc> in ionad aon .gvimrc"
+
msgid "--noplugin\t\tDon't load plugin scripts"
msgstr "--noplugin\t\tNแ luchtaigh breiseแin"
-#: ../main.c:2227
msgid "-p[N]\t\tOpen N tab pages (default: one for each file)"
-msgstr "-p[N]\t\tOscail N leathanach cluaisํn (default: ceann do gach comhad)"
+msgstr "-p[N]\t\tOscail N leathanach cluaisํnํ (default: ceann do gach comhad)"
-#: ../main.c:2228
msgid "-o[N]\t\tOpen N windows (default: one for each file)"
msgstr "-o[N]\t\tOscail N fuinneog (r้amhshocr๚: ceann do gach comhad)"
-#: ../main.c:2229
msgid "-O[N]\t\tLike -o but split vertically"
msgstr "-O[N]\t\tMar -o, ach roinn go hingearach"
-#: ../main.c:2230
msgid "+\t\t\tStart at end of file"
msgstr "+\t\t\tTosaigh ag an chomhadchrํoch"
-#: ../main.c:2231
msgid "+<lnum>\t\tStart at line <lnum>"
msgstr "+<lnum>\t\tTosaigh ar lํne <lnum>"
-#: ../main.c:2232
msgid "--cmd <command>\tExecute <command> before loading any vimrc file"
msgstr "--cmd <ord๚>\tRith <ord๚> roimh aon chomhad vimrc a lucht๚"
-#: ../main.c:2233
msgid "-c <command>\t\tExecute <command> after loading the first file"
msgstr "-c <ord๚>\t\tRith <ord๚> i ndiaidh lucht๚ an ch้ad chomhad"
-#: ../main.c:2235
msgid "-S <session>\t\tSource file <session> after loading the first file"
msgstr ""
"-S <seisi๚n>\t\tL้igh comhad <seisi๚n> i ndiaidh an ch้ad chomhad แ l้amh"
-#: ../main.c:2236
msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>"
msgstr "-s <script>\tL้igh orduithe gnแthmh๓id ๓n chomhad <script>"
-#: ../main.c:2237
msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>"
msgstr ""
"-w <script>\tIarcheangail gach ord๚ iontrแilte leis an gcomhad <script>"
-#: ../main.c:2238
msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>"
msgstr "-W <aschur>\tScrํobh gach ord๚ cl๓scrํofa sa chomhad <aschur>"
-#: ../main.c:2240
+msgid "-x\t\t\tEdit encrypted files"
+msgstr "-x\t\t\tCuir comhaid chriptithe in eagar"
+
+msgid "-display <display>\tConnect vim to this particular X-server"
+msgstr "-display <freastalaํ>\tNasc vim leis an bhfreastalaํ-X seo"
+
+msgid "-X\t\t\tDo not connect to X server"
+msgstr "-X\t\t\tNแ naisc leis an bhfreastalaํ X"
+
+msgid "--remote <files>\tEdit <files> in a Vim server if possible"
+msgstr ""
+"--remote <comhaid>\tCuir <comhaid> in eagar le freastalaํ Vim mแs f้idir"
+
+msgid "--remote-silent <files> Same, don't complain if there is no server"
+msgstr ""
+"--remote-silent <comhaid> Mar an gc้anna, nแ d้an gearแn mura bhfuil "
+"freastalaํ ann"
+
+msgid ""
+"--remote-wait <files> As --remote but wait for files to have been edited"
+msgstr ""
+"--remote-wait <comhaid> Mar --remote ach fan leis na comhaid a bheith "
+"curtha in eagar"
+
+msgid ""
+"--remote-wait-silent <files> Same, don't complain if there is no server"
+msgstr ""
+"--remote-wait-silent <comhaid> Mar an gc้anna, nแ d้an gearแn mura bhfuil "
+"freastalaํ ann"
+
+msgid ""
+"--remote-tab[-wait][-silent] <files> As --remote but use tab page per file"
+msgstr ""
+"--remote-tab[-wait][-silent] <comhaid> Cos๚il le --remote ach oscail "
+"cluaisํn do gach comhad"
+
+msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
+msgstr ""
+"--remote-send <eochracha>\tSeol <eochracha> chuig freastalaํ Vim agus scoir"
+
+msgid "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
+msgstr ""
+"--remote-expr <slonn>\tLuachแil <slonn> le freastalaํ Vim agus taispeแin an "
+"toradh"
+
+msgid "--serverlist\t\tList available Vim server names and exit"
+msgstr "--serverlist\t\tTaispeแin freastalaithe Vim atแ ar fแil agus scoir"
+
+msgid "--servername <name>\tSend to/become the Vim server <name>"
+msgstr "--servername <ainm>\tSeol chuig/T้igh i do fhreastalaํ Vim <ainm>"
+
msgid "--startuptime <file>\tWrite startup timing messages to <file>"
msgstr ""
"--startuptime <comhad>\tScrํobh faisn้is maidir le tr้imhse tosaithe i "
"<comhad>"
-#: ../main.c:2242
msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
msgstr "-i <viminfo>\t\tฺsแid <viminfo> in ionad .viminfo"
-#: ../main.c:2243
msgid "-h or --help\tPrint Help (this message) and exit"
msgstr "-h n๓ --help\tTaispeแin an chabhair seo agus scoir"
-#: ../main.c:2244
msgid "--version\t\tPrint version information and exit"
msgstr "--version\t\tTaispeแin eolas faoin leagan agus scoir"
-#: ../mark.c:676
+msgid ""
+"\n"
+"Arguments recognised by gvim (Motif version):\n"
+msgstr ""
+"\n"
+"Arg๓intํ ar eolas do gvim (leagan Motif):\n"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (neXtaw version):\n"
+msgstr ""
+"\n"
+"Arg๓intํ ar eolas do gvim (leagan neXtaw):\n"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (Athena version):\n"
+msgstr ""
+"\n"
+"Arg๓intํ ar eolas do gvim (leagan Athena):\n"
+
+msgid "-display <display>\tRun vim on <display>"
+msgstr "-display <scแileแn>\tRith vim ar <scแileแn>"
+
+msgid "-iconic\t\tStart vim iconified"
+msgstr "-iconic\t\tTosaigh vim sa mh๓d ํoslaghdaithe"
+
+msgid "-background <color>\tUse <color> for the background (also: -bg)"
+msgstr "-background <dath>\tBain ๚sแid as <dath> don ch๚lra (-bg fosta)"
+
+msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
+msgstr "-foreground <dath>\tฺsแid <dath> le haghaidh gnแth-th้acs (fosta: -fg)"
+
+msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
+msgstr "-font <cl๓>\t\tฺsแid <cl๓> le haghaidh gnแth-th้acs (fosta: -fn)"
+
+msgid "-boldfont <font>\tUse <font> for bold text"
+msgstr "-boldfont <cl๓>\tBain ๚sแid as <cl๓> do chl๓ trom"
+
+msgid "-italicfont <font>\tUse <font> for italic text"
+msgstr "-italicfont <cl๓>\tฺsแid <cl๓> le haghaidh t้acs iodแlach"
+
+msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
+msgstr ""
+"-geometry <geoim>\tฺsแid <geoim> le haghaidh na c้imseatan tosaigh (fosta: -"
+"geom)"
+
+msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
+msgstr "-borderwidth <leithead>\tSocraigh <leithead> na himlํne (-bw fosta)"
+
+msgid "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
+msgstr ""
+"-scrollbarwidth <leithead> Socraigh leithead na scrollbharraํ a bheith "
+"<leithead> (fosta: -sw)"
+
+msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
+msgstr ""
+"-menuheight <airde>\tSocraigh airde an bharra roghchlแir a bheith <airde> "
+"(fosta: -mh)"
+
+msgid "-reverse\t\tUse reverse video (also: -rv)"
+msgstr "-reverse\t\tฺsแid fํs aisiompaithe (fosta: -rv)"
+
+msgid "+reverse\t\tDon't use reverse video (also: +rv)"
+msgstr "+reverse\t\tNแ h๚sแid fํs aisiompaithe (fosta: +rv)"
+
+msgid "-xrm <resource>\tSet the specified resource"
+msgstr "-xrm <acmhainn>\tSocraigh an acmhainn sainithe"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (GTK+ version):\n"
+msgstr ""
+"\n"
+"Arg๓intํ ar eolas do gvim (leagan GTK+):\n"
+
+msgid "-display <display>\tRun vim on <display> (also: --display)"
+msgstr "-display <scแileแn>\tRith vim ar <scแileแn> (fosta: --display)"
+
+msgid "--role <role>\tSet a unique role to identify the main window"
+msgstr "--role <r๓l>\tSocraigh r๓l saini๚il chun an phrํomhfhuinneog a aithint"
+
+msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
+msgstr "--socketid <xid>\tOscail Vim isteach i ngiuirl้id GTK eile"
+
+msgid "--echo-wid\t\tMake gvim echo the Window ID on stdout"
+msgstr "--echo-wid\t\tTaispeแnann gvim aitheantas na fuinneoige ar stdout"
+
+msgid "-P <parent title>\tOpen Vim inside parent application"
+msgstr "-P <mแthairchlแr>\tOscail Vim isteach sa mhแthairchlแr"
+
+msgid "--windowid <HWND>\tOpen Vim inside another win32 widget"
+msgstr "--windowid <HWND>\tOscail Vim isteach i ngiuirl้id win32 eile"
+
+msgid "No display"
+msgstr "Gan taispeแint"
+
+#. Failed to send, abort.
+msgid ": Send failed.\n"
+msgstr ": Theip ar seoladh.\n"
+
+#. Let vim start normally.
+msgid ": Send failed. Trying to execute locally\n"
+msgstr ": Theip ar seoladh. Ag baint triail as go logแnta\n"
+
+#, c-format
+msgid "%d of %d edited"
+msgstr "%d as %d d้anta"
+
+msgid "No display: Send expression failed.\n"
+msgstr "Gan taispeแint: Theip ar sheoladh sloinn.\n"
+
+msgid ": Send expression failed.\n"
+msgstr ": Theip ar sheoladh sloinn.\n"
+
msgid "No marks set"
msgstr "Nํl aon mharc socraithe"
-#: ../mark.c:678
#, c-format
msgid "E283: No marks matching \"%s\""
msgstr "E283: Nํl aon mharc comhoiri๚naithe le \"%s\""
#. Highlight title
-#: ../mark.c:687
msgid ""
"\n"
"mark line col file/text"
@@ -3620,7 +3331,6 @@ msgstr ""
"marc lํne col comhad/t้acs"
#. Highlight title
-#: ../mark.c:789
msgid ""
"\n"
" jump line col file/text"
@@ -3629,7 +3339,6 @@ msgstr ""
" l้im lํne col comhad/t้acs"
#. Highlight title
-#: ../mark.c:831
msgid ""
"\n"
"change line col text"
@@ -3637,7 +3346,6 @@ msgstr ""
"\n"
"athr๚ lํne col t้acs"
-#: ../mark.c:1238
msgid ""
"\n"
"# File marks:\n"
@@ -3646,7 +3354,6 @@ msgstr ""
"# Marcanna comhaid:\n"
#. Write the jumplist with -'
-#: ../mark.c:1271
msgid ""
"\n"
"# Jumplist (newest first):\n"
@@ -3654,7 +3361,6 @@ msgstr ""
"\n"
"# Liosta l้imeanna (is nuaํ i dtosach):\n"
-#: ../mark.c:1352
msgid ""
"\n"
"# History of marks within files (newest to oldest):\n"
@@ -3662,116 +3368,114 @@ msgstr ""
"\n"
"# Stair na marcanna i gcomhaid (is nuaํ ar dt๚s):\n"
-#: ../mark.c:1431
msgid "Missing '>'"
msgstr "`>' ar iarraidh"
-#: ../memfile.c:426
+msgid "E543: Not a valid codepage"
+msgstr "E543: Nํ c๓dleathanach bailํ ้"
+
+msgid "E284: Cannot set IC values"
+msgstr "E284: Nํ f้idir luachanna IC a shocr๚"
+
+msgid "E285: Failed to create input context"
+msgstr "E285: Theip ar chruth๚ comhth้acs ionchuir"
+
+msgid "E286: Failed to open input method"
+msgstr "E286: Theip ar oscailt mhodh ionchuir"
+
+msgid "E287: Warning: Could not set destroy callback to IM"
+msgstr "E287: Rabhadh: Nํorbh fh้idir aisghlaoch l้irscriosta a shocr๚ le IM"
+
+msgid "E288: input method doesn't support any style"
+msgstr "E288: Nํ thacaํonn an modh ionchuir aon stํl"
+
+msgid "E289: input method doesn't support my preedit type"
+msgstr "E289: nํ thacaํonn an modh ionchuir mo chineแl r้amheagair"
+
msgid "E293: block was not locked"
msgstr "E293: nํ raibh an bloc faoi ghlas"
-#: ../memfile.c:799
msgid "E294: Seek error in swap file read"
msgstr "E294: Earrแid chuardaigh agus comhad babhtแla แ l้amh"
-#: ../memfile.c:803
msgid "E295: Read error in swap file"
msgstr "E295: Earrแid sa l้amh i gcomhad babhtแla"
-#: ../memfile.c:849
msgid "E296: Seek error in swap file write"
msgstr "E296: Earrแid chuardaigh agus comhad babhtแla แ scrํobh"
-#: ../memfile.c:865
msgid "E297: Write error in swap file"
msgstr "E297: Earrแid sa scrํobh i gcomhad babhtแla"
-#: ../memfile.c:1036
msgid "E300: Swap file already exists (symlink attack?)"
msgstr "E300: Tแ comhad babhtแla ann cheana (ionsaํ le naisc shiombalacha?)"
-#: ../memline.c:318
msgid "E298: Didn't get block nr 0?"
msgstr "E298: Nํ bhfuarthas bloc 0?"
-#: ../memline.c:361
msgid "E298: Didn't get block nr 1?"
msgstr "E298: Nํ bhfuarthas bloc a haon?"
-#: ../memline.c:377
msgid "E298: Didn't get block nr 2?"
msgstr "E298: Nํ bhfuarthas bloc a d๓?"
+msgid "E843: Error while updating swap file crypt"
+msgstr "E843: Earrแid agus cripti๚ an chomhaid bhabhtแla แ nuashonr๚"
+
#. could not (re)open the swap file, what can we do????
-#: ../memline.c:465
msgid "E301: Oops, lost the swap file!!!"
msgstr "E301: ฺps, cailleadh an comhad babhtแla!!!"
-#: ../memline.c:477
msgid "E302: Could not rename swap file"
msgstr "E302: Nํorbh fh้idir an comhad babhtแla a athainmni๚"
-#: ../memline.c:554
#, c-format
msgid "E303: Unable to open swap file for \"%s\", recovery impossible"
msgstr ""
"E303: Nํ f้idir comhad babhtแla le haghaidh \"%s\" a oscailt, nํ f้idir "
"athshlแn๚"
-#: ../memline.c:666
msgid "E304: ml_upd_block0(): Didn't get block 0??"
msgstr "E304: ml_upd_block0(): Nํ bhfuarthas bloc 0??"
-#. no swap files found
-#: ../memline.c:830
#, c-format
msgid "E305: No swap file found for %s"
msgstr "E305: Nํor aimsํodh comhad babhtแla le haghaidh %s"
-#: ../memline.c:839
msgid "Enter number of swap file to use (0 to quit): "
msgstr "Iontrแil uimhir an chomhaid babhtแla le h๚sแid (0 = scoir): "
-#: ../memline.c:879
#, c-format
msgid "E306: Cannot open %s"
msgstr "E306: Nํ f้idir %s a oscailt"
-#: ../memline.c:897
msgid "Unable to read block 0 from "
msgstr "Nํ f้idir bloc 0 a l้amh ๓ "
-#: ../memline.c:900
msgid ""
"\n"
"Maybe no changes were made or Vim did not update the swap file."
msgstr ""
"\n"
-"B'fh้idir nach raibh aon athr๚ แ dh้anamh, n๓ tแ an comhad\n"
+"B'fh้idir nach raibh aon athr๚ แ dh้anamh, n๓ tแ an comhad "
"babhtแla as dแta."
-#: ../memline.c:909
msgid " cannot be used with this version of Vim.\n"
msgstr " nํl ar fแil leis an leagan seo de Vim.\n"
-#: ../memline.c:911
msgid "Use Vim version 3.0.\n"
msgstr "Bain ๚sแid as Vim, leagan 3.0.\n"
-#: ../memline.c:916
#, c-format
msgid "E307: %s does not look like a Vim swap file"
msgstr "E307: Nํl %s cos๚il le comhad babhtแla Vim"
-#: ../memline.c:922
msgid " cannot be used on this computer.\n"
msgstr " nํl ar fแil ar an rํomhaire seo.\n"
-#: ../memline.c:924
msgid "The file was created on "
msgstr "Cruthaํodh an comhad seo ar "
-#: ../memline.c:928
msgid ""
",\n"
"or the file has been damaged."
@@ -3779,86 +3483,107 @@ msgstr ""
",\n"
"is ้ sin n๓ rinneadh dochar don chomhad."
-#: ../memline.c:945
+#, c-format
+msgid ""
+"E833: %s is encrypted and this version of Vim does not support encryption"
+msgstr ""
+"E833: tแ %s criptithe agus nํ thacaํonn an leagan seo de Vim le cripti๚"
+
msgid " has been damaged (page size is smaller than minimum value).\n"
msgstr " rinneadh dochar d๓ (m้id an leathanaigh nํos l๚ nแ an ํosmh้id).\n"
-#: ../memline.c:974
#, c-format
msgid "Using swap file \"%s\""
msgstr "Comhad babhtแla \"%s\" แ ๚sแid"
-#: ../memline.c:980
#, c-format
msgid "Original file \"%s\""
msgstr "Comhad bun๚sach \"%s\""
-#: ../memline.c:995
msgid "E308: Warning: Original file may have been changed"
msgstr "E308: Rabhadh: Is f้idir gur athraํodh an comhad bun๚sach"
-#: ../memline.c:1061
+#, c-format
+msgid "Swap file is encrypted: \"%s\""
+msgstr "Tแ an comhad babhtแla criptithe: \"%s\""
+
+msgid ""
+"\n"
+"If you entered a new crypt key but did not write the text file,"
+msgstr ""
+"\n"
+"Mแ chuir t๚ eochair nua chripti๚chแin isteach, ach mura scrํobh t๚ an "
+"t้acschomhad,"
+
+msgid ""
+"\n"
+"enter the new crypt key."
+msgstr ""
+"\n"
+"cuir isteach an eochair nua chripti๚chแin."
+
+msgid ""
+"\n"
+"If you wrote the text file after changing the crypt key press enter"
+msgstr ""
+"\n"
+"Mแ scrํobh t๚ an t้acschomhad tar ้is duit an eochair chripti๚chแํn a athr๚, "
+"br๚igh Enter"
+
+msgid ""
+"\n"
+"to use the same key for text file and swap file"
+msgstr ""
+"\n"
+"chun an eochair ch้anna a ๚sแid don t้acschomhad agus an comhad babhtแla"
+
#, c-format
msgid "E309: Unable to read block 1 from %s"
msgstr "E309: Nํ f้idir bloc a haon a l้amh ๓ %s"
-#: ../memline.c:1065
msgid "???MANY LINES MISSING"
msgstr "???GO LEOR LอNTE AR IARRAIDH"
-#: ../memline.c:1076
msgid "???LINE COUNT WRONG"
msgstr "???LอON MอCHEART NA LอNTE"
-#: ../memline.c:1082
msgid "???EMPTY BLOCK"
msgstr "???BLOC FOLAMH"
-#: ../memline.c:1103
msgid "???LINES MISSING"
msgstr "???LอNTE AR IARRAIDH"
-#: ../memline.c:1128
#, c-format
msgid "E310: Block 1 ID wrong (%s not a .swp file?)"
msgstr "E310: Aitheantas mํcheart ar bhloc a haon (nํl %s ina chomhad .swp?)"
-#: ../memline.c:1133
msgid "???BLOCK MISSING"
msgstr "???BLOC AR IARRAIDH"
-#: ../memline.c:1147
msgid "??? from here until ???END lines may be messed up"
msgstr "??? is f้idir go ndearnadh praiseach de lํnte ๓ anseo go ???END"
-#: ../memline.c:1164
msgid "??? from here until ???END lines may have been inserted/deleted"
msgstr "??? is f้idir go bhfuil lํnte ionsแite/scriosta ๓ anseo go ???END"
-#: ../memline.c:1181
msgid "???END"
msgstr "???DEIREADH"
-#: ../memline.c:1238
msgid "E311: Recovery Interrupted"
msgstr "E311: Idirbhriseadh an t-athshlแn๚"
-#: ../memline.c:1243
msgid ""
"E312: Errors detected while recovering; look for lines starting with ???"
msgstr ""
"E312: Braitheadh earrแidํ le linn athshlแnaithe; f้ach ar na lํnte le ??? ar "
"tosach"
-#: ../memline.c:1245
msgid "See \":help E312\" for more information."
msgstr "Bain triail as \":help E312\" chun tuilleadh eolais a fhแil."
-#: ../memline.c:1249
msgid "Recovery completed. You should check if everything is OK."
msgstr "Athshlแnaํodh. Ba ch๓ir duit gach rud a sheiceแil uair amhแin eile."
-#: ../memline.c:1251
msgid ""
"\n"
"(You might want to write out this file under another name\n"
@@ -3866,73 +3591,61 @@ msgstr ""
"\n"
"(B'fh้idir gur mian leat an comhad seo a shแbhแil de r้ir ainm eile\n"
-#: ../memline.c:1252
-#, fuzzy
msgid "and run diff with the original file to check for changes)"
-msgstr ""
-"agus d้an comparแid leis an chomhad bhun๚sach (m.sh. le `diff') chun "
-"athruithe a scr๚d๚)\n"
+msgstr "agus d้an comparแid leis an mbunchomhad chun athruithe a lorg)"
-#: ../memline.c:1254
msgid "Recovery completed. Buffer contents equals file contents."
msgstr ""
+"Athshlแn๚ crํochnaithe. Is ionann an t-แbhar sa mhaolแn agus an t-แbhar sa "
+"chomhad."
-#: ../memline.c:1255
-#, fuzzy
msgid ""
"\n"
"You may want to delete the .swp file now.\n"
"\n"
msgstr ""
-"Scrios an comhad .swp tar ้is sin.\n"
"\n"
+"B'fh้idir gur mhaith leat an comhad .swp a scriosadh anois.\n"
+"\n"
+
+msgid "Using crypt key from swap file for the text file.\n"
+msgstr ""
+"Eochair chripti๚chแin ๓n gcomhad babhtแla แ h๚sแid ar an t้acschomhad.\n"
#. use msg() to start the scrolling properly
-#: ../memline.c:1327
msgid "Swap files found:"
msgstr "Comhaid bhabhtแla aimsithe:"
-#: ../memline.c:1446
msgid " In current directory:\n"
msgstr " Sa chomhadlann reatha:\n"
-#: ../memline.c:1448
msgid " Using specified name:\n"
msgstr " Ag baint ๚sแid as ainm socraithe:\n"
-#: ../memline.c:1450
msgid " In directory "
msgstr " Sa chomhadlann "
-#: ../memline.c:1465
msgid " -- none --\n"
msgstr " -- neamhnํ --\n"
-#: ../memline.c:1527
msgid " owned by: "
msgstr " ๚in้ir: "
-#: ../memline.c:1529
msgid " dated: "
msgstr " dแtaithe: "
-#: ../memline.c:1532 ../memline.c:3231
msgid " dated: "
msgstr " dแtaithe: "
-#: ../memline.c:1548
msgid " [from Vim version 3.0]"
msgstr " [๓ leagan 3.0 Vim]"
-#: ../memline.c:1550
msgid " [does not look like a Vim swap file]"
msgstr " [nํ cos๚il le comhad babhtแla Vim]"
-#: ../memline.c:1552
msgid " file name: "
msgstr " ainm comhaid: "
-#: ../memline.c:1558
msgid ""
"\n"
" modified: "
@@ -3940,15 +3653,12 @@ msgstr ""
"\n"
" mionathraithe: "
-#: ../memline.c:1559
msgid "YES"
msgstr "IS SEA"
-#: ../memline.c:1559
msgid "no"
msgstr "nํ hea"
-#: ../memline.c:1562
msgid ""
"\n"
" user name: "
@@ -3956,11 +3666,9 @@ msgstr ""
"\n"
" ๚sแideoir: "
-#: ../memline.c:1568
msgid " host name: "
msgstr " ainm an ๓strํomhaire: "
-#: ../memline.c:1570
msgid ""
"\n"
" host name: "
@@ -3968,7 +3676,6 @@ msgstr ""
"\n"
" ๓stainm: "
-#: ../memline.c:1575
msgid ""
"\n"
" process ID: "
@@ -3976,11 +3683,16 @@ msgstr ""
"\n"
" PID: "
-#: ../memline.c:1579
msgid " (still running)"
msgstr " (ag rith f๓s)"
-#: ../memline.c:1586
+msgid ""
+"\n"
+" [not usable with this version of Vim]"
+msgstr ""
+"\n"
+" [nํ in๚sแidte leis an leagan seo Vim]"
+
msgid ""
"\n"
" [not usable on this computer]"
@@ -3988,97 +3700,75 @@ msgstr ""
"\n"
" [nํ in๚sแidte ar an rํomhaire seo]"
-#: ../memline.c:1590
msgid " [cannot be read]"
msgstr " [nํ f้idir a l้amh]"
-#: ../memline.c:1593
msgid " [cannot be opened]"
msgstr " [nํ f้idir oscailt]"
-#: ../memline.c:1698
msgid "E313: Cannot preserve, there is no swap file"
msgstr "E313: Nํ f้idir ้ a chaomhn๚, nํl aon chomhad babhtแla ann"
-#: ../memline.c:1747
msgid "File preserved"
msgstr "Caomhnaํodh an comhad"
-#: ../memline.c:1749
msgid "E314: Preserve failed"
msgstr "E314: Theip ar chaomhn๚"
-#: ../memline.c:1819
#, c-format
-msgid "E315: ml_get: invalid lnum: %<PRId64>"
-msgstr "E315: ml_get: lnum neamhbhailํ: %<PRId64>"
+msgid "E315: ml_get: invalid lnum: %ld"
+msgstr "E315: ml_get: lnum neamhbhailํ: %ld"
-#: ../memline.c:1851
#, c-format
-msgid "E316: ml_get: cannot find line %<PRId64>"
-msgstr "E316: ml_get: lํne %<PRId64> gan aimsi๚"
+msgid "E316: ml_get: cannot find line %ld"
+msgstr "E316: ml_get: lํne %ld gan aimsi๚"
-#: ../memline.c:2236
msgid "E317: pointer block id wrong 3"
msgstr "E317: aitheantas mํcheart ar an mbloc pointeora 3"
-#: ../memline.c:2311
msgid "stack_idx should be 0"
msgstr "ba ch๓ir do stack_idx a bheith 0"
-#: ../memline.c:2369
msgid "E318: Updated too many blocks?"
msgstr "E318: An iomarca bloic nuashonraithe?"
-#: ../memline.c:2511
msgid "E317: pointer block id wrong 4"
msgstr "E317: aitheantas mํcheart ar an mbloc pointeora 4"
-#: ../memline.c:2536
msgid "deleted block 1?"
msgstr "bloc a haon scriosta?"
-#: ../memline.c:2707
#, c-format
-msgid "E320: Cannot find line %<PRId64>"
-msgstr "E320: Lํne %<PRId64> gan aimsi๚"
+msgid "E320: Cannot find line %ld"
+msgstr "E320: Lํne %ld gan aimsi๚"
-#: ../memline.c:2916
msgid "E317: pointer block id wrong"
msgstr "E317: aitheantas mํcheart ar an mbloc pointeora"
-#: ../memline.c:2930
msgid "pe_line_count is zero"
msgstr "is 0 pe_line_count\""
-#: ../memline.c:2955
#, c-format
-msgid "E322: line number out of range: %<PRId64> past the end"
-msgstr "E322: lํne-uimhir as raon: %<PRId64> thar dheireadh"
+msgid "E322: line number out of range: %ld past the end"
+msgstr "E322: lํne-uimhir as raon: %ld thar dheireadh"
-#: ../memline.c:2959
#, c-format
-msgid "E323: line count wrong in block %<PRId64>"
-msgstr "E323: lํon mํcheart na lํnte i mbloc %<PRId64>"
+msgid "E323: line count wrong in block %ld"
+msgstr "E323: lํon mํcheart na lํnte i mbloc %ld"
-#: ../memline.c:2999
msgid "Stack size increases"
msgstr "M้adaํonn an chruach"
-#: ../memline.c:3038
msgid "E317: pointer block id wrong 2"
msgstr "E317: aitheantas mํcheart ar an mbloc pointeora 2"
-#: ../memline.c:3070
#, c-format
msgid "E773: Symlink loop for \"%s\""
msgstr "E773: Ciogal i naisc shiombalacha le haghaidh \"%s\""
-#: ../memline.c:3221
msgid "E325: ATTENTION"
msgstr "E325: AIRE"
-#: ../memline.c:3222
msgid ""
"\n"
"Found a swap file by the name \""
@@ -4086,45 +3776,31 @@ msgstr ""
"\n"
"Fuarthas comhad babhtแla darbh ainm \""
-#: ../memline.c:3226
msgid "While opening file \""
msgstr "Agus an comhad seo แ oscailt: \""
-#: ../memline.c:3239
msgid " NEWER than swap file!\n"
msgstr " NอOS NUAอ nแ comhad babhtแla!\n"
-#: ../memline.c:3244
-#, fuzzy
+#. Some of these messages are long to allow translation to
+#. * other languages.
msgid ""
"\n"
"(1) Another program may be editing the same file. If this is the case,\n"
" be careful not to end up with two different instances of the same\n"
-" file when making changes."
+" file when making changes. Quit, or continue with caution.\n"
msgstr ""
"\n"
-"(1) Is f้idir go bhfuil clแr eile ag rochtain an comhad seo.\n"
-" Mแs ea, bํ c๚ramach nach bhfuil dhแ leagan den chomhad\n"
-" c้anna.\n"
-
-#: ../memline.c:3245
-#, fuzzy
-msgid " Quit, or continue with caution.\n"
-msgstr " Scoir, n๓ lean ar aghaidh go hairdeallach.\n"
+"(1) Seans go bhfuil an comhad seo แ chur in eagar ag clแr eile. Mแ tแ,\n"
+" bํ c๚ramach nach bhfuil dhแ leagan den chomhad c้anna agat nuair\n"
+" a athraํonn t๚ ้. Scoir anois, n๓ lean ort go faichilleach.\n"
-#: ../memline.c:3246
-#, fuzzy
msgid "(2) An edit session for this file crashed.\n"
-msgstr ""
-"\n"
-"(2) Rinne Vim thobscor agus an comhad seo\n"
-" idir lแmha agat.\n"
+msgstr "(2) Thuairteแil seisi๚n eagarth๓ireachta.\n"
-#: ../memline.c:3247
msgid " If this is the case, use \":recover\" or \"vim -r "
msgstr " Mแs amhlaidh, bain ๚sแid as \":recover\" n๓ \"vim -r "
-#: ../memline.c:3249
msgid ""
"\"\n"
" to recover the changes (see \":help recovery\").\n"
@@ -4132,11 +3808,9 @@ msgstr ""
"\"\n"
" chun na hathruithe a fhแil ar ais (f้ach \":help recovery\").\n"
-#: ../memline.c:3250
msgid " If you did this already, delete the swap file \""
msgstr " Mแ tแ s้ seo d้anta cheana agat, scrios an comhad babhtแla \""
-#: ../memline.c:3252
msgid ""
"\"\n"
" to avoid this message.\n"
@@ -4144,23 +3818,18 @@ msgstr ""
"\"\n"
" chun an teachtaireacht seo a sheachaint.\n"
-#: ../memline.c:3450 ../memline.c:3452
msgid "Swap file \""
msgstr "Comhad babhtแla \""
-#: ../memline.c:3451 ../memline.c:3455
msgid "\" already exists!"
msgstr "\" tแ s้ ann cheana!"
-#: ../memline.c:3457
msgid "VIM - ATTENTION"
msgstr "VIM - AIRE"
-#: ../memline.c:3459
msgid "Swap file already exists!"
msgstr "Tแ comhad babhtแla ann cheana!"
-#: ../memline.c:3464
msgid ""
"&Open Read-Only\n"
"&Edit anyway\n"
@@ -4174,7 +3843,6 @@ msgstr ""
"&Scoir\n"
"&Tobscoir"
-#: ../memline.c:3467
msgid ""
"&Open Read-Only\n"
"&Edit anyway\n"
@@ -4190,58 +3858,36 @@ msgstr ""
"&Scoir\n"
"&Tobscoir"
-#.
-#. * Change the ".swp" extension to find another file that can be used.
-#. * First decrement the last char: ".swo", ".swn", etc.
-#. * If that still isn't enough decrement the last but one char: ".svz"
-#. * Can happen when editing many "No Name" buffers.
-#.
-#. ".s?a"
-#. ".saa": tried enough, give up
-#: ../memline.c:3528
msgid "E326: Too many swap files found"
msgstr "E326: Aimsํodh an iomarca comhaid bhabhtแla"
-#: ../memory.c:227
-#, c-format
-msgid "E342: Out of memory! (allocating %<PRIu64> bytes)"
-msgstr "E342: Cuimhne ํdithe! (%<PRIu64> beart แ ndแileadh)"
-
-#: ../menu.c:62
msgid "E327: Part of menu-item path is not sub-menu"
msgstr "E327: Nํ fo-roghchlแr ํ pแirt de chonair roghchlแir"
-#: ../menu.c:63
msgid "E328: Menu only exists in another mode"
msgstr "E328: Nํl an roghchlแr ar fแil sa mh๓d seo"
-#: ../menu.c:64
#, c-format
msgid "E329: No menu \"%s\""
msgstr "E329: Nํl aon roghchlแr darbh ainm \"%s\""
#. Only a mnemonic or accelerator is not valid.
-#: ../menu.c:329
msgid "E792: Empty menu name"
msgstr "E792: Ainm folamh ar an roghchlแr"
-#: ../menu.c:340
msgid "E330: Menu path must not lead to a sub-menu"
msgstr "E330: Nํ cheadaํtear conair roghchlแir a threoraํonn go fo-roghchlแr"
-#: ../menu.c:365
msgid "E331: Must not add menu items directly to menu bar"
msgstr ""
"E331: Nํ cheadaํtear mํreanna roghchlแir a chur le barra roghchlแir go "
"dํreach"
-#: ../menu.c:370
msgid "E332: Separator cannot be part of a menu path"
msgstr "E332: Nํ cheadaํtear deighilteoir mar phแirt de chonair roghchlแir"
#. Now we have found the matching menu, and we list the mappings
#. Highlight title
-#: ../menu.c:762
msgid ""
"\n"
"--- Menus ---"
@@ -4249,74 +3895,61 @@ msgstr ""
"\n"
"--- Roghchlแir ---"
-#: ../menu.c:1313
+msgid "Tear off this menu"
+msgstr "Bain an roghchlแr seo"
+
msgid "E333: Menu path must lead to a menu item"
msgstr "E333: Nํ m๓r conair roghchlแir a threor๚ chun mํr roghchlแir"
-#: ../menu.c:1330
#, c-format
msgid "E334: Menu not found: %s"
msgstr "E334: Roghchlแr gan aimsi๚: %s"
-#: ../menu.c:1396
#, c-format
msgid "E335: Menu not defined for %s mode"
msgstr "E335: Nํl an roghchlแr ar fแil sa mh๓d %s"
-#: ../menu.c:1426
msgid "E336: Menu path must lead to a sub-menu"
msgstr "E336: Nํ m๓r conair roghchlแir a threor๚ chun fo-roghchlแr"
-#: ../menu.c:1447
msgid "E337: Menu not found - check menu names"
msgstr "E337: Roghchlแr gan aimsi๚ - deimhnigh ainmneacha na roghchlแr"
-#: ../message.c:423
#, c-format
msgid "Error detected while processing %s:"
msgstr "Earrแid agus %s แ phr๓iseแil:"
-#: ../message.c:445
#, c-format
msgid "line %4ld:"
msgstr "lํne %4ld:"
-#: ../message.c:617
#, c-format
msgid "E354: Invalid register name: '%s'"
msgstr "E354: Ainm neamhbhailํ tabhaill: '%s'"
-#: ../message.c:745
msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
msgstr ""
"Cothaitheoir na dteachtaireachtaํ: Kevin P. Scannell <scannell@slu.edu>"
-#: ../message.c:986
msgid "Interrupt: "
msgstr "Idirbhriseadh: "
-#: ../message.c:988
msgid "Press ENTER or type command to continue"
msgstr "Br๚igh ENTER n๓ iontrแil ord๚ le lean๚int"
-#: ../message.c:1843
#, c-format
-msgid "%s line %<PRId64>"
-msgstr "%s lํne %<PRId64>"
+msgid "%s line %ld"
+msgstr "%s lํne %ld"
-#: ../message.c:2392
msgid "-- More --"
msgstr "-- Tuilleadh --"
-#: ../message.c:2398
msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "
msgstr " SPมS/d/j: scแileแn/leathanach/lํne sํos, b/u/k: suas, q: scoir "
-#: ../message.c:3021 ../message.c:3031
msgid "Question"
msgstr "Ceist"
-#: ../message.c:3023
msgid ""
"&Yes\n"
"&No"
@@ -4324,17 +3957,6 @@ msgstr ""
"&Tแ\n"
"&Nํl"
-#: ../message.c:3033
-msgid ""
-"&Yes\n"
-"&No\n"
-"&Cancel"
-msgstr ""
-"&Tแ\n"
-"&Nํl\n"
-"&Cealaigh"
-
-#: ../message.c:3045
msgid ""
"&Yes\n"
"&No\n"
@@ -4348,180 +3970,251 @@ msgstr ""
"&Dealaigh Uile\n"
"&Cealaigh"
-#: ../message.c:3058
+msgid "Select Directory dialog"
+msgstr "Dial๓g `Roghnaigh Comhadlann'"
+
+msgid "Save File dialog"
+msgstr "Dial๓g `Sแbhแil Comhad'"
+
+msgid "Open File dialog"
+msgstr "Dial๓g `Oscail Comhad'"
+
+#. TODO: non-GUI file selector here
+msgid "E338: Sorry, no file browser in console mode"
+msgstr "E338: Nํl brabhsแlaํ comhaid ar fแil sa mh๓d cons๓il"
+
msgid "E766: Insufficient arguments for printf()"
msgstr "E766: Easpa arg๓intํ d'fheidhm printf()"
-#: ../message.c:3119
msgid "E807: Expected Float argument for printf()"
msgstr "E807: Bhํothas ag s๚il le harg๓int Snแmhphointe d'fheidhm printf()"
-#: ../message.c:3873
msgid "E767: Too many arguments to printf()"
msgstr "E767: An iomarca arg๓intํ d'fheidhm printf()"
-#: ../misc1.c:2256
msgid "W10: Warning: Changing a readonly file"
msgstr "W10: Rabhadh: Comhad inl้ite amhแin แ athr๚"
-#: ../misc1.c:2537
msgid "Type number and <Enter> or click with mouse (empty cancels): "
msgstr ""
"Cl๓scrํobh uimhir agus <Enter> n๓ cliceแil leis an luch (fแg folamh le "
"ceal๚): "
-#: ../misc1.c:2539
msgid "Type number and <Enter> (empty cancels): "
msgstr "Cl๓scrํobh uimhir agus <Enter> (fแg folamh le ceal๚): "
-#: ../misc1.c:2585
msgid "1 more line"
msgstr "1 lํne eile"
-#: ../misc1.c:2588
msgid "1 line less"
msgstr "1 lํne nํos l๚"
-#: ../misc1.c:2593
#, c-format
-msgid "%<PRId64> more lines"
-msgstr "%<PRId64> lํne eile"
+msgid "%ld more lines"
+msgstr "%ld lํne eile"
-#: ../misc1.c:2596
#, c-format
-msgid "%<PRId64> fewer lines"
-msgstr "%<PRId64> lํne nํos l๚"
+msgid "%ld fewer lines"
+msgstr "%ld lํne nํos l๚"
-#: ../misc1.c:2599
msgid " (Interrupted)"
msgstr " (Idirbhriste)"
-#: ../misc1.c:2635
msgid "Beep!"
msgstr "Bํp!"
-#: ../misc2.c:738
+msgid "ERROR: "
+msgstr "EARRมID: "
+
+#, c-format
+msgid ""
+"\n"
+"[bytes] total alloc-freed %lu-%lu, in use %lu, peak use %lu\n"
+msgstr ""
+"\n"
+"[beart] iomlแn dแilte-saor %lu-%lu, in ๚sแid %lu, buaic %lu\n"
+
+#, c-format
+msgid ""
+"[calls] total re/malloc()'s %lu, total free()'s %lu\n"
+"\n"
+msgstr ""
+"[glaonna] re/malloc(): %lu, free(): %lu\n"
+"\n"
+
+msgid "E340: Line is becoming too long"
+msgstr "E340: Tแ an lํne ag ้irํ r๓fhada"
+
+#, c-format
+msgid "E341: Internal error: lalloc(%ld, )"
+msgstr "E341: Earrแid inmheแnach: lalloc(%ld, )"
+
+#, c-format
+msgid "E342: Out of memory! (allocating %lu bytes)"
+msgstr "E342: Cuimhne ํdithe! (%lu beart แ ndแileadh)"
+
#, c-format
msgid "Calling shell to execute: \"%s\""
msgstr "An t-ord๚ seo แ rith leis an bhlaosc: \"%s\""
-#: ../normal.c:183
+msgid "E545: Missing colon"
+msgstr "E545: Idirstad ar iarraidh"
+
+msgid "E546: Illegal mode"
+msgstr "E546: M๓d neamhcheadaithe"
+
+msgid "E547: Illegal mouseshape"
+msgstr "E547: Cruth neamhcheadaithe luiche"
+
+msgid "E548: digit expected"
+msgstr "E548: ag s๚il le digit"
+
+msgid "E549: Illegal percentage"
+msgstr "E549: C้atadแn neamhcheadaithe"
+
+msgid "E854: path too long for completion"
+msgstr "E854: conair r๓fhada le comhlแn๚"
+
+#, c-format
+msgid ""
+"E343: Invalid path: '**[number]' must be at the end of the path or be "
+"followed by '%s'."
+msgstr ""
+"E343: Conair neamhbhailํ: nํ m๓r '**[uimhir]' a bheith ag deireadh na "
+"conaire, n๓ le '%s' ina dhiaidh."
+
+#, c-format
+msgid "E344: Can't find directory \"%s\" in cdpath"
+msgstr "E344: Nํ f้idir comhadlann \"%s\" a aimsi๚ sa cdpath"
+
+#, c-format
+msgid "E345: Can't find file \"%s\" in path"
+msgstr "E345: Nํ f้idir comhad \"%s\" a aimsi๚ sa chonair"
+
+#, c-format
+msgid "E346: No more directory \"%s\" found in cdpath"
+msgstr "E346: Nํl comhadlann \"%s\" sa cdpath a thuilleadh"
+
+#, c-format
+msgid "E347: No more file \"%s\" found in path"
+msgstr "E347: Nํl comhad \"%s\" sa chonair a thuilleadh"
+
+#, c-format
+msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
+msgstr "E668: M๓d mํcheart rochtana ar an chomhad eolas naisc NetBeans: \"%s\""
+
+#, c-format
+msgid "E658: NetBeans connection lost for buffer %ld"
+msgstr "E658: Cailleadh nasc NetBeans le haghaidh maolแin %ld"
+
+msgid "E838: netbeans is not supported with this GUI"
+msgstr "E838: Nํ thacaํtear le netbeans sa GUI seo"
+
+msgid "E511: netbeans already connected"
+msgstr "E511: Tแ netbeans ceangailte cheana"
+
+#, c-format
+msgid "E505: %s is read-only (add ! to override)"
+msgstr "E505: Tแ %s inl้ite amhแin (cuir ! leis chun sแr๚)"
+
msgid "E349: No identifier under cursor"
msgstr "E349: Nํl aitheant๓ir faoin ch๚rs๓ir"
-#: ../normal.c:1866
msgid "E774: 'operatorfunc' is empty"
msgstr "E774: 'operatorfunc' folamh"
-#: ../normal.c:2637
+msgid "E775: Eval feature not available"
+msgstr "E775: Nํl an ghn้ Eval le fแil"
+
msgid "Warning: terminal cannot highlight"
msgstr "Rabhadh: nํ f้idir leis an teirmin้al aibhsi๚"
-#: ../normal.c:2807
msgid "E348: No string under cursor"
msgstr "E348: Nํl teaghrแn faoin ch๚rs๓ir"
-#: ../normal.c:3937
msgid "E352: Cannot erase folds with current 'foldmethod'"
msgstr "E352: Nํ f้idir fillteacha a l้irscriosadh leis an 'foldmethod' reatha"
-#: ../normal.c:5897
msgid "E664: changelist is empty"
msgstr "E664: tแ liosta na n-athruithe folamh"
-#: ../normal.c:5899
msgid "E662: At start of changelist"
msgstr "E662: Ag tosach liosta na n-athruithe"
-#: ../normal.c:5901
msgid "E663: At end of changelist"
msgstr "E663: Ag deireadh liosta na n-athruithe"
-#: ../normal.c:7053
-msgid "Type :quit<Enter> to exit Nvim"
-msgstr "Cl๓scrํobh :quit<Enter> chun Vim a scor"
+msgid "Type :qa! and press <Enter> to abandon all changes and exit Vim"
+msgstr "Cl๓scrํobh :qa! agus br๚igh <Enter> le fแgแil ๓ Vim gan athruithe a shแbhแil"
# ouch - English -ed ?
-#: ../ops.c:248
#, c-format
msgid "1 line %sed 1 time"
msgstr "1 lํne %s uair amhแin"
# ouch - English -ed ?
-#: ../ops.c:250
#, c-format
msgid "1 line %sed %d times"
msgstr "1 lํne %s %d uair"
# ouch - English -ed ?
-#: ../ops.c:253
#, c-format
-msgid "%<PRId64> lines %sed 1 time"
-msgstr "%<PRId64> lํne %sed uair amhแin"
+msgid "%ld lines %sed 1 time"
+msgstr "%ld lํne %sed uair amhแin"
# ouch - English -ed ?
-#: ../ops.c:256
#, c-format
-msgid "%<PRId64> lines %sed %d times"
-msgstr "%<PRId64> lํne %sed %d uair"
+msgid "%ld lines %sed %d times"
+msgstr "%ld lํne %sed %d uair"
-#: ../ops.c:592
#, c-format
-msgid "%<PRId64> lines to indent... "
-msgstr "%<PRId64> lํne le heang๚... "
+msgid "%ld lines to indent... "
+msgstr "%ld lํne le heang๚... "
-#: ../ops.c:634
msgid "1 line indented "
msgstr "eangaํodh lํne amhแin "
-#: ../ops.c:636
#, c-format
-msgid "%<PRId64> lines indented "
-msgstr "%<PRId64> lํne eangaithe "
+msgid "%ld lines indented "
+msgstr "%ld lํne eangaithe "
-#: ../ops.c:938
msgid "E748: No previously used register"
msgstr "E748: Nํl aon tabhall ๚sแidte roimhe seo"
#. must display the prompt
-#: ../ops.c:1433
msgid "cannot yank; delete anyway"
msgstr "nํ f้idir a sracadh; scrios mar sin f้in"
-#: ../ops.c:1929
msgid "1 line changed"
msgstr "athraํodh lํne amhแin"
-#: ../ops.c:1931
#, c-format
-msgid "%<PRId64> lines changed"
-msgstr "athraํodh %<PRId64> lํne"
+msgid "%ld lines changed"
+msgstr "athraํodh %ld lํne"
+
+#, c-format
+msgid "freeing %ld lines"
+msgstr "%ld lํne แ saoradh"
-#: ../ops.c:2521
msgid "block of 1 line yanked"
msgstr "sracadh bloc de lํne amhแin"
-#: ../ops.c:2523
msgid "1 line yanked"
msgstr "sracadh lํne amhแin"
-#: ../ops.c:2525
#, c-format
-msgid "block of %<PRId64> lines yanked"
-msgstr "sracadh bloc de %<PRId64> lํne"
+msgid "block of %ld lines yanked"
+msgstr "sracadh bloc de %ld lํne"
-#: ../ops.c:2528
#, c-format
-msgid "%<PRId64> lines yanked"
-msgstr "%<PRId64> lํne sractha"
+msgid "%ld lines yanked"
+msgstr "%ld lํne sractha"
-#: ../ops.c:2710
#, c-format
msgid "E353: Nothing in register %s"
msgstr "E353: Tabhall folamh %s"
#. Highlight title
-#: ../ops.c:3185
msgid ""
"\n"
"--- Registers ---"
@@ -4529,11 +4222,9 @@ msgstr ""
"\n"
"--- Tabhaill ---"
-#: ../ops.c:4455
msgid "Illegal register name"
msgstr "Ainm neamhcheadaithe tabhaill"
-#: ../ops.c:4533
msgid ""
"\n"
"# Registers:\n"
@@ -4541,185 +4232,177 @@ msgstr ""
"\n"
"# Tabhaill:\n"
-#: ../ops.c:4575
#, c-format
msgid "E574: Unknown register type %d"
msgstr "E574: Cineแl anaithnid tabhaill %d"
-#: ../ops.c:5089
+msgid ""
+"E883: search pattern and expression register may not contain two or more "
+"lines"
+msgstr ""
+"E883: nํ cheadaํtear nํos m๓ nแ lํne amhแin i bpatr๚n cuardaigh nแ sa "
+"slonntabhall"
+
#, c-format
-msgid "%<PRId64> Cols; "
-msgstr "%<PRId64> Col๚n; "
+msgid "%ld Cols; "
+msgstr "%ld Col๚n; "
-#: ../ops.c:5097
#, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Bytes"
-msgstr ""
-"Roghnaํodh %s%<PRId64> as %<PRId64> Lํne; %<PRId64> as %<PRId64> Focal; "
-"%<PRId64> as %<PRId64> Beart"
+msgid "Selected %s%ld of %ld Lines; %lld of %lld Words; %lld of %lld Bytes"
+msgstr "Roghnaํodh %s%ld as %ld Lํne; %lld as %lld Focal; %lld as %lld Beart"
-#: ../ops.c:5105
#, c-format
msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Chars; %<PRId64> of %<PRId64> Bytes"
+"Selected %s%ld of %ld Lines; %lld of %lld Words; %lld of %lld Chars; %lld of "
+"%lld Bytes"
msgstr ""
-"Roghnaํodh %s%<PRId64> as %<PRId64> Lํne; %<PRId64> as %<PRId64> Focal; "
-"%<PRId64> as %<PRId64> Carachtar; %<PRId64> as %<PRId64> Beart"
+"Roghnaํodh %s%ld as %ld Lํne; %lld as %lld Focal; %lld as %lld Carachtar; "
+"%lld as %lld Beart"
-#: ../ops.c:5123
#, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Byte "
-"%<PRId64> of %<PRId64>"
-msgstr ""
-"Col %s as %s; Lํne %<PRId64> as %<PRId64>; Focal %<PRId64> as %<PRId64>; "
-"Beart %<PRId64> as %<PRId64>"
+msgid "Col %s of %s; Line %ld of %ld; Word %lld of %lld; Byte %lld of %lld"
+msgstr "Col %s as %s; Lํne %ld as %ld; Focal %lld as %lld; Beart %lld as %lld"
-#: ../ops.c:5133
#, c-format
msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Char "
-"%<PRId64> of %<PRId64>; Byte %<PRId64> of %<PRId64>"
+"Col %s of %s; Line %ld of %ld; Word %lld of %lld; Char %lld of %lld; Byte "
+"%lld of %lld"
msgstr ""
-"Col %s as %s; Lํne %<PRId64> as %<PRId64>; Focal %<PRId64> as %<PRId64>; "
-"Carachtar %<PRId64> as %<PRId64>; Beart %<PRId64> as %<PRId64>"
+"Col %s as %s; Lํne %ld as %ld; Focal %lld as %lld; Carachtar %lld as %lld; "
+"Beart %lld as %lld"
-#: ../ops.c:5146
#, c-format
-msgid "(+%<PRId64> for BOM)"
-msgstr "(+%<PRId64> do BOM)"
+msgid "(+%ld for BOM)"
+msgstr "(+%ld do BOM)"
-#: ../option.c:1238
msgid "%<%f%h%m%=Page %N"
msgstr "%<%f%h%m%=Leathanach %N"
-#: ../option.c:1574
msgid "Thanks for flying Vim"
msgstr "Go raibh mํle maith agat as Vim a ๚sแid"
-#. found a mismatch: skip
-#: ../option.c:2698
msgid "E518: Unknown option"
msgstr "E518: Rogha anaithnid"
-#: ../option.c:2709
msgid "E519: Option not supported"
msgstr "E519: Nํl an rogha seo ar fแil"
-#: ../option.c:2740
msgid "E520: Not allowed in a modeline"
msgstr "E520: Nํ cheadaithe i m๓dlํne"
-#: ../option.c:2815
msgid "E846: Key code not set"
-msgstr ""
+msgstr "E846: C๓d eochrach gan socr๚"
-#: ../option.c:2924
msgid "E521: Number required after ="
msgstr "E521: Tแ gแ le huimhir i ndiaidh ="
-#: ../option.c:3226 ../option.c:3864
msgid "E522: Not found in termcap"
msgstr "E522: Gan aimsi๚ sa termcap"
-#: ../option.c:3335
#, c-format
msgid "E539: Illegal character <%s>"
msgstr "E539: Carachtar neamhcheadaithe <%s>"
-#: ../option.c:3862
+#, c-format
+msgid "For option %s"
+msgstr "Le haghaidh rogha %s"
+
msgid "E529: Cannot set 'term' to empty string"
msgstr "E529: Nํ f้idir 'term' a shocr๚ mar theaghrแn folamh"
-#: ../option.c:3885
+msgid "E530: Cannot change term in GUI"
+msgstr "E530: Nํ f้idir 'term' a athr๚ sa GUI"
+
+msgid "E531: Use \":gui\" to start the GUI"
+msgstr "E531: ฺsแid \":gui\" chun an GUI a chur ag obair"
+
msgid "E589: 'backupext' and 'patchmode' are equal"
msgstr "E589: is ionann iad 'backupext' agus 'patchmode'"
-#: ../option.c:3964
msgid "E834: Conflicts with value of 'listchars'"
-msgstr ""
+msgstr "E834: Tagann s้ salach ar luach de 'listchars'"
-#: ../option.c:3966
msgid "E835: Conflicts with value of 'fillchars'"
-msgstr ""
+msgstr "E835: Tagann s้ salach ar luach de 'fillchars'"
+
+msgid "E617: Cannot be changed in the GTK+ 2 GUI"
+msgstr "E617: Nํ f้idir ้ a athr๚ sa GUI GTK+ 2"
-#: ../option.c:4163
msgid "E524: Missing colon"
msgstr "E524: Idirstad ar iarraidh"
-#: ../option.c:4165
msgid "E525: Zero length string"
msgstr "E525: Teaghrแn folamh"
-#: ../option.c:4220
#, c-format
msgid "E526: Missing number after <%s>"
msgstr "E526: Uimhir ar iarraidh i ndiaidh <%s>"
-#: ../option.c:4232
msgid "E527: Missing comma"
msgstr "E527: Cam๓g ar iarraidh"
-#: ../option.c:4239
msgid "E528: Must specify a ' value"
msgstr "E528: Caithfidh luach ' a shonr๚"
-#: ../option.c:4271
msgid "E595: contains unprintable or wide character"
msgstr "E595: tแ carachtar neamhghrafach n๓ leathan ann"
-#: ../option.c:4469
+msgid "E596: Invalid font(s)"
+msgstr "E596: Cl๓(nna) neamhbhailํ"
+
+msgid "E597: can't select fontset"
+msgstr "E597: nํ f้idir tacar cl๓ a roghn๚"
+
+msgid "E598: Invalid fontset"
+msgstr "E598: Tacar cl๓ neamhbhailํ"
+
+msgid "E533: can't select wide font"
+msgstr "E533: nํ f้idir cl๓ leathan a roghn๚"
+
+msgid "E534: Invalid wide font"
+msgstr "E534: Cl๓ leathan neamhbhailํ"
+
#, c-format
msgid "E535: Illegal character after <%c>"
msgstr "E535: Carachtar neamhbhailํ i ndiaidh <%c>"
-#: ../option.c:4534
msgid "E536: comma required"
msgstr "E536: tแ gแ le cam๓g"
-#: ../option.c:4543
#, c-format
msgid "E537: 'commentstring' must be empty or contain %s"
msgstr ""
"E537: nํ m๓r %s a bheith i 'commentstring', is ้ sin n๓ nํ m๓r d๓ a bheith "
"folamh"
-#: ../option.c:4928
+msgid "E538: No mouse support"
+msgstr "E538: Gan tacaํocht luiche"
+
msgid "E540: Unclosed expression sequence"
msgstr "E540: Seicheamh gan d๚nadh"
-#: ../option.c:4932
msgid "E541: too many items"
msgstr "E541: an iomarca mํreanna"
-#: ../option.c:4934
msgid "E542: unbalanced groups"
msgstr "E542: gr๚paํ neamhchothromaithe"
-#: ../option.c:5148
msgid "E590: A preview window already exists"
msgstr "E590: Tแ fuinneog r้amhamhairc ann cheana"
-#: ../option.c:5311
msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'"
msgstr ""
"W17: Tแ UTF-8 ag teastแil le haghaidh Araibise, socraigh ้ le ':set "
"encoding=utf-8'"
-#: ../option.c:5623
#, c-format
msgid "E593: Need at least %d lines"
msgstr "E593: Tแ gแ le %d lํne ar a laghad"
-#: ../option.c:5631
#, c-format
msgid "E594: Need at least %d columns"
msgstr "E594: Tแ gแ le %d col๚n ar a laghad"
-#: ../option.c:6011
#, c-format
msgid "E355: Unknown option: %s"
msgstr "E355: Rogha anaithnid: %s"
@@ -4727,12 +4410,10 @@ msgstr "E355: Rogha anaithnid: %s"
#. There's another character after zeros or the string
#. * is empty. In both cases, we are trying to set a
#. * num option using a string.
-#: ../option.c:6037
#, c-format
msgid "E521: Number required: &%s = '%s'"
msgstr "E521: Uimhir de dhํth: &%s = '%s'"
-#: ../option.c:6149
msgid ""
"\n"
"--- Terminal codes ---"
@@ -4740,7 +4421,6 @@ msgstr ""
"\n"
"--- C๓id teirmin้il ---"
-#: ../option.c:6151
msgid ""
"\n"
"--- Global option values ---"
@@ -4748,7 +4428,6 @@ msgstr ""
"\n"
"--- Luachanna na roghanna comhchoiteann ---"
-#: ../option.c:6153
msgid ""
"\n"
"--- Local option values ---"
@@ -4756,7 +4435,6 @@ msgstr ""
"\n"
"--- Luachanna na roghanna logแnta ---"
-#: ../option.c:6155
msgid ""
"\n"
"--- Options ---"
@@ -4764,29 +4442,148 @@ msgstr ""
"\n"
"--- Roghanna ---"
-#: ../option.c:6816
msgid "E356: get_varp ERROR"
msgstr "E356: EARRมID get_varp"
-#: ../option.c:7696
#, c-format
msgid "E357: 'langmap': Matching character missing for %s"
msgstr "E357: 'langmap': Carachtar comhoiri๚nach ar iarraidh le haghaidh %s"
-#: ../option.c:7715
#, c-format
msgid "E358: 'langmap': Extra characters after semicolon: %s"
msgstr "E358: 'langmap': Carachtair breise i ndiaidh an idirstad: %s"
-#: ../os/shell.c:194
+msgid "cannot open "
+msgstr "nํ f้idir a oscailt: "
+
+msgid "VIM: Can't open window!\n"
+msgstr "VIM: Nํ f้idir fuinneog a oscailt!\n"
+
+msgid "Need Amigados version 2.04 or later\n"
+msgstr "Tแ gแ le Amigados leagan 2.04 n๓ nํos d้anaํ\n"
+
+#, c-format
+msgid "Need %s version %ld\n"
+msgstr "Tแ gแ le %s, leagan %ld\n"
+
+msgid "Cannot open NIL:\n"
+msgstr "Nํ f้idir NIL a oscailt:\n"
+
+msgid "Cannot create "
+msgstr "Nํ f้idir a chruth๚: "
+
+#, c-format
+msgid "Vim exiting with %d\n"
+msgstr "Vim แ scor le stแdas %d\n"
+
+msgid "cannot change console mode ?!\n"
+msgstr "nํ f้idir m๓d cons๓il a athr๚ ?!\n"
+
+msgid "mch_get_shellsize: not a console??\n"
+msgstr "mch_get_shellsize: nํ cons๓l ้ seo??\n"
+
+#. if Vim opened a window: Executing a shell may cause crashes
+msgid "E360: Cannot execute shell with -f option"
+msgstr "E360: Nํ f้idir blaosc a rith le rogha -f"
+
+msgid "Cannot execute "
+msgstr "Nํ f้idir blaosc a rith: "
+
+msgid "shell "
+msgstr "blaosc "
+
+msgid " returned\n"
+msgstr " aisfhilleadh\n"
+
+msgid "ANCHOR_BUF_SIZE too small."
+msgstr "ANCHOR_BUF_SIZE r๓bheag."
+
+msgid "I/O ERROR"
+msgstr "EARRมID I/A"
+
+msgid "Message"
+msgstr "Teachtaireacht"
+
+msgid "E237: Printer selection failed"
+msgstr "E237: Theip ar roghn๚ print้ara"
+
+#, c-format
+msgid "to %s on %s"
+msgstr "go %s ar %s"
+
+#, c-format
+msgid "E613: Unknown printer font: %s"
+msgstr "E613: Cl๓fhoireann anaithnid print้ara: %s"
+
+#, c-format
+msgid "E238: Print error: %s"
+msgstr "E238: Earrแid phriontแla: %s"
+
+#, c-format
+msgid "Printing '%s'"
+msgstr "'%s' แ phriontแil"
+
+#, c-format
+msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
+msgstr ""
+"E244: Ainm neamhcheadaithe ar thacar carachtar \"%s\" mar phแirt d'ainm cl๓ "
+"\"%s\""
+
+#, c-format
+msgid "E244: Illegal quality name \"%s\" in font name \"%s\""
+msgstr "E244: Ainm neamhcheadaithe ar chแilํocht \"%s\" in ainm cl๓ \"%s\""
+
+#, c-format
+msgid "E245: Illegal char '%c' in font name \"%s\""
+msgstr "E245: Carachtar neamhcheadaithe '%c' mar phแirt d'ainm cl๓ \"%s\""
+
+#, c-format
+msgid "Opening the X display took %ld msec"
+msgstr "Th๓g %ld ms chun an scแileแn X a oscailt"
+
msgid ""
"\n"
-"Cannot execute shell "
+"Vim: Got X error\n"
msgstr ""
"\n"
-"Nํ f้idir blaosc a rith "
+"Vim: Fuarthas earrแid ๓ X\n"
+
+msgid "Testing the X display failed"
+msgstr "Theip ar thแstแil an scแileแin X"
+
+msgid "Opening the X display timed out"
+msgstr "Oscailt an scแileแin X thar am"
+
+msgid ""
+"\n"
+"Could not get security context for "
+msgstr ""
+"\n"
+"Nํorbh fh้idir comhth้acs slแndแla a fhแil le haghaidh "
+
+msgid ""
+"\n"
+"Could not set security context for "
+msgstr ""
+"\n"
+"Nํorbh fh้idir comhth้acs slแndแla a shocr๚ le haghaidh "
+
+#, c-format
+msgid "Could not set security context %s for %s"
+msgstr "Nํorbh fh้idir comhth้acs slแndแla %s a shocr๚ le haghaidh %s"
+
+#, c-format
+msgid "Could not get security context %s for %s. Removing it!"
+msgstr ""
+"Nํorbh fh้idir comhth้acs slแndแla %s a fhแil le haghaidh %s. ม bhaint!"
+
+msgid ""
+"\n"
+"Cannot execute shell sh\n"
+msgstr ""
+"\n"
+"Nํ f้idir an bhlaosc sh a rith\n"
-#: ../os/shell.c:439
msgid ""
"\n"
"shell returned "
@@ -4794,472 +4591,482 @@ msgstr ""
"\n"
"d'aisfhill an bhlaosc "
-#: ../os_unix.c:465 ../os_unix.c:471
msgid ""
"\n"
-"Could not get security context for "
+"Cannot create pipes\n"
msgstr ""
"\n"
-"Nํorbh fh้idir comhth้acs slแndแla a fhแil le haghaidh "
+"Nํ f้idir pํopaํ a chruth๚\n"
-#: ../os_unix.c:479
+# "fork" not in standard refs/corpus. Maybe want a "gabhl*" word instead? -KPS
msgid ""
"\n"
-"Could not set security context for "
+"Cannot fork\n"
msgstr ""
"\n"
-"Nํorbh fh้idir comhth้acs slแndแla a shocr๚ le haghaidh "
+"Nํ f้idir forc a dh้anamh\n"
+
+msgid ""
+"\n"
+"Cannot execute shell "
+msgstr ""
+"\n"
+"Nํ f้idir blaosc a rith "
+
+msgid ""
+"\n"
+"Command terminated\n"
+msgstr ""
+"\n"
+"Ord๚ crํochnaithe\n"
+
+msgid "XSMP lost ICE connection"
+msgstr "Chaill XSMP an nasc ICE"
-#: ../os_unix.c:1558 ../os_unix.c:1647
#, c-format
msgid "dlerror = \"%s\""
msgstr "dlerror = \"%s\""
-#: ../path.c:1449
+msgid "Opening the X display failed"
+msgstr "Theip ar oscailt an scแileแin X"
+
+msgid "XSMP handling save-yourself request"
+msgstr "Iarratas sแbhแil-do-f้in แ lแimhseแil ag XSMP"
+
+msgid "XSMP opening connection"
+msgstr "Nasc แ oscailt ag XSMP"
+
+msgid "XSMP ICE connection watch failed"
+msgstr "Theip ar fhaire nasc ICE XSMP"
+
#, c-format
-msgid "E447: Can't find file \"%s\" in path"
-msgstr "E447: Nํl aon fhแil ar chomhad \"%s\" sa chonair"
+msgid "XSMP SmcOpenConnection failed: %s"
+msgstr "Theip ar XSMP SmcOpenConnection: %s"
+
+msgid "At line"
+msgstr "Ag lํne"
+
+msgid "Could not load vim32.dll!"
+msgstr "Nํorbh fh้idir vim32.dll a lucht๚!"
+
+msgid "VIM Error"
+msgstr "Earrแid VIM"
+
+msgid "Could not fix up function pointers to the DLL!"
+msgstr "Nํorbh fh้idir pointeoirํ feidhme a ch๓iri๚ i gcomhair an DLL!"
+
+#, c-format
+msgid "Vim: Caught %s event\n"
+msgstr "Vim: Fuarthas teagmhas %s\n"
+
+msgid "close"
+msgstr "d๚n"
+
+msgid "logoff"
+msgstr "logแil amach"
+
+msgid "shutdown"
+msgstr "m๚chadh"
+
+msgid "E371: Command not found"
+msgstr "E371: Nํ bhfuarthas an t-ord๚"
+
+msgid ""
+"VIMRUN.EXE not found in your $PATH.\n"
+"External commands will not pause after completion.\n"
+"See :help win32-vimrun for more information."
+msgstr ""
+"Nํor aimsํodh VIMRUN.EXE i do $PATH.\n"
+"Nํ mhoilleoidh orduithe seachtracha agus iad curtha i gcrํch.\n"
+"F้ach ar :help win32-vimrun chun nํos m๓ eolas a fhแil."
+
+msgid "Vim Warning"
+msgstr "Rabhadh Vim"
+
+#, c-format
+msgid "shell returned %d"
+msgstr "d'aisfhill an bhlaosc %d"
-#: ../quickfix.c:359
#, c-format
msgid "E372: Too many %%%c in format string"
msgstr "E372: An iomarca %%%c i dteaghrแn formแide"
-#: ../quickfix.c:371
#, c-format
msgid "E373: Unexpected %%%c in format string"
msgstr "E373: %%%c gan choinne i dteaghrแn formแide"
-#: ../quickfix.c:420
msgid "E374: Missing ] in format string"
msgstr "E374: ] ar iarraidh i dteaghrแn formแide"
-#: ../quickfix.c:431
#, c-format
msgid "E375: Unsupported %%%c in format string"
msgstr "E375: %%%c gan tacaํocht i dteaghrแn formแide"
-#: ../quickfix.c:448
#, c-format
msgid "E376: Invalid %%%c in format string prefix"
msgstr "E376: %%%c neamhbhailํ i r้imํr an teaghrแin formแide"
-#: ../quickfix.c:454
#, c-format
msgid "E377: Invalid %%%c in format string"
msgstr "E377: %%%c neamhbhailํ i dteaghrแn formแide"
#. nothing found
-#: ../quickfix.c:477
msgid "E378: 'errorformat' contains no pattern"
msgstr "E378: Nํl aon phatr๚n i 'errorformat'"
-#: ../quickfix.c:695
msgid "E379: Missing or empty directory name"
msgstr "E379: Ainm comhadlainne ar iarraidh, n๓ folamh"
-#: ../quickfix.c:1305
msgid "E553: No more items"
msgstr "E553: Nํl aon mhํr eile"
-#: ../quickfix.c:1674
+msgid "E924: Current window was closed"
+msgstr "E924: D๚nadh an fhuinneog reatha"
+
+msgid "E925: Current quickfix was changed"
+msgstr "E925: Athraํodh an mearcheart๚chแn reatha"
+
+msgid "E926: Current location list was changed"
+msgstr "E926: Athraํodh an liosta suํomh reatha"
+
#, c-format
msgid "(%d of %d)%s%s: "
msgstr "(%d as %d)%s%s: "
-#: ../quickfix.c:1676
msgid " (line deleted)"
msgstr " (lํne scriosta)"
-#: ../quickfix.c:1863
+#, c-format
+msgid "%serror list %d of %d; %d errors "
+msgstr "%sliosta earrแidํ %d as %d; %d earrแid "
+
msgid "E380: At bottom of quickfix stack"
-msgstr "E380: In ํochtar na cruaiche quickfix"
+msgstr "E380: In ํochtar chruach na mearcheart๚chแn"
-#: ../quickfix.c:1869
msgid "E381: At top of quickfix stack"
-msgstr "E381: In uachtar na cruaiche quickfix"
+msgstr "E381: In uachtar chruach na mearcheart๚chแn"
-#: ../quickfix.c:1880
-#, c-format
-msgid "error list %d of %d; %d errors"
-msgstr "liosta earrแidํ %d as %d; %d earrแid"
+msgid "No entries"
+msgstr "Gan iontrแil"
-#: ../quickfix.c:2427
msgid "E382: Cannot write, 'buftype' option is set"
msgstr "E382: Nํ f้idir scrํobh, rogha 'buftype' socraithe"
-#: ../quickfix.c:2812
+msgid "Error file"
+msgstr "Comhad earrแide"
+
msgid "E683: File name missing or invalid pattern"
msgstr "E683: Ainm comhaid ar iarraidh, n๓ patr๚n neamhbhailํ"
-#: ../quickfix.c:2911
#, c-format
msgid "Cannot open file \"%s\""
msgstr "Nํ f้idir comhad \"%s\" a oscailt"
-#: ../quickfix.c:3429
msgid "E681: Buffer is not loaded"
msgstr "E681: Nํl an maolแn luchtaithe"
-#: ../quickfix.c:3487
msgid "E777: String or List expected"
msgstr "E777: Bhํothas ag s๚il le Teaghrแn n๓ Liosta"
-#: ../regexp.c:359
#, c-format
msgid "E369: invalid item in %s%%[]"
msgstr "E369: mํr neamhbhailํ i %s%%[]"
-#: ../regexp.c:374
#, c-format
msgid "E769: Missing ] after %s["
msgstr "E769: ] ar iarraidh i ndiaidh %s["
-#: ../regexp.c:375
+msgid "E944: Reverse range in character class"
+msgstr "E944: Raon aisiompaithe in aicme carachtar"
+
+msgid "E945: Range too large in character class"
+msgstr "E945: Raon r๓mh๓r in aicme carachtar"
+
#, c-format
msgid "E53: Unmatched %s%%("
msgstr "E53: %s%%( corr"
-#: ../regexp.c:376
#, c-format
msgid "E54: Unmatched %s("
msgstr "E54: %s( corr"
-#: ../regexp.c:377
#, c-format
msgid "E55: Unmatched %s)"
msgstr "E55: %s) corr"
-#: ../regexp.c:378
msgid "E66: \\z( not allowed here"
msgstr "E66: nํ cheadaํtear \\z( anseo"
-#: ../regexp.c:379
-msgid "E67: \\z1 et al. not allowed here"
-msgstr "E67: nํ cheadaํtear \\z1 et al. anseo"
+msgid "E67: \\z1 - \\z9 not allowed here"
+msgstr "E67: nํ cheadaํtear \\z1 - \\z9 anseo"
-#: ../regexp.c:380
#, c-format
msgid "E69: Missing ] after %s%%["
msgstr "E69: ] ar iarraidh i ndiaidh %s%%["
-#: ../regexp.c:381
#, c-format
msgid "E70: Empty %s%%[]"
msgstr "E70: %s%%[] folamh"
-#: ../regexp.c:1209 ../regexp.c:1224
+msgid "E65: Illegal back reference"
+msgstr "E65: C๚ltagairt neamhbhailํ"
+
msgid "E339: Pattern too long"
msgstr "E339: Slonn r๓fhada"
-#: ../regexp.c:1371
msgid "E50: Too many \\z("
msgstr "E50: an iomarca \\z("
-#: ../regexp.c:1378
#, c-format
msgid "E51: Too many %s("
msgstr "E51: an iomarca %s("
-#: ../regexp.c:1427
msgid "E52: Unmatched \\z("
msgstr "E52: \\z( corr"
-#: ../regexp.c:1637
#, c-format
msgid "E59: invalid character after %s@"
msgstr "E59: carachtar neamhbhailํ i ndiaidh %s@"
-#: ../regexp.c:1672
#, c-format
msgid "E60: Too many complex %s{...}s"
msgstr "E60: An iomarca %s{...} coimpl้ascach"
-#: ../regexp.c:1687
#, c-format
msgid "E61: Nested %s*"
msgstr "E61: %s* neadaithe"
-#: ../regexp.c:1690
#, c-format
msgid "E62: Nested %s%c"
msgstr "E62: %s%c neadaithe"
-#: ../regexp.c:1800
msgid "E63: invalid use of \\_"
msgstr "E63: ๚sแid neamhbhailํ de \\_"
-#: ../regexp.c:1850
#, c-format
msgid "E64: %s%c follows nothing"
msgstr "E64: nํl aon rud roimh %s%c"
-#: ../regexp.c:1902
-msgid "E65: Illegal back reference"
-msgstr "E65: C๚ltagairt neamhbhailํ"
-
-#: ../regexp.c:1943
msgid "E68: Invalid character after \\z"
msgstr "E68: Carachtar neamhbhailํ i ndiaidh \\z"
-#: ../regexp.c:2049 ../regexp_nfa.c:1296
#, c-format
msgid "E678: Invalid character after %s%%[dxouU]"
msgstr "E678: Carachtar neamhbhailํ i ndiaidh %s%%[dxouU]"
-#: ../regexp.c:2107
#, c-format
msgid "E71: Invalid character after %s%%"
msgstr "E71: Carachtar neamhbhailํ i ndiaidh %s%%"
-#: ../regexp.c:3017
#, c-format
msgid "E554: Syntax error in %s{...}"
msgstr "E554: Earrแid chomhr้ire i %s{...}"
-#: ../regexp.c:3805
msgid "External submatches:\n"
msgstr "Fo-mheaitseแil sheachtrach:\n"
-#: ../regexp.c:7022
+#, c-format
+msgid "E888: (NFA regexp) cannot repeat %s"
+msgstr "E888: (slonn NFA) nํ f้idir %s a athdh้anamh"
+
msgid ""
"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be "
"used "
msgstr ""
+"E864: Nํ cheadaํtear ach 0, 1, n๓ 2 tar ้is \\%#=. ฺsแidfear an t-inneall "
+"uathoibrํoch "
-#: ../regexp_nfa.c:239
-msgid "E865: (NFA) Regexp end encountered prematurely"
+msgid "Switching to backtracking RE engine for pattern: "
msgstr ""
+"Ag athr๚ go dtํ an t-inneall rianaithe siar le haghaidh an phatr๚in seo: "
+
+msgid "E865: (NFA) Regexp end encountered prematurely"
+msgstr "E865: (NFA) Thแngthas ar dheireadh an tsloinn gan s๚il leis"
-#: ../regexp_nfa.c:240
#, c-format
msgid "E866: (NFA regexp) Misplaced %c"
-msgstr ""
+msgstr "E866: (slonn NFA) %c as แit"
-#: ../regexp_nfa.c:242
#, c-format
-msgid "E877: (NFA regexp) Invalid character class: %<PRId64>"
-msgstr ""
+msgid "E877: (NFA regexp) Invalid character class: %ld"
+msgstr "E877: (slonn NFA) Aicme carachtar neamhbhailํ: %ld"
-#: ../regexp_nfa.c:1261
#, c-format
msgid "E867: (NFA) Unknown operator '\\z%c'"
-msgstr ""
+msgstr "E867: (NFA) Oibreoir anaithnid '\\z%c'"
-#: ../regexp_nfa.c:1387
#, c-format
msgid "E867: (NFA) Unknown operator '\\%%%c'"
-msgstr ""
+msgstr "E867: (NFA) Oibreoir anaithnid '\\%%%c'"
+
+#. should never happen
+msgid "E868: Error building NFA with equivalence class!"
+msgstr "E868: Earrแid agus NFA แ th๓gแil le haicme coibh้ise!"
-#: ../regexp_nfa.c:1802
#, c-format
msgid "E869: (NFA) Unknown operator '\\@%c'"
-msgstr ""
+msgstr "E869: (NFA) Oibreoir anaithnid '\\@%c'"
-#: ../regexp_nfa.c:1831
msgid "E870: (NFA regexp) Error reading repetition limits"
-msgstr ""
+msgstr "E870: (slonn NFA) Earrแid agus teorainneacha athdh้anta แ l้amh"
#. Can't have a multi follow a multi.
-#: ../regexp_nfa.c:1895
-msgid "E871: (NFA regexp) Can't have a multi follow a multi !"
-msgstr ""
+msgid "E871: (NFA regexp) Can't have a multi follow a multi"
+msgstr "E871: (slonn NFA) Nํ cheadaํtear ilchodach tar ้is ilchodach"
#. Too many `('
-#: ../regexp_nfa.c:2037
msgid "E872: (NFA regexp) Too many '('"
-msgstr ""
+msgstr "E872: (slonn NFA) An iomarca '('"
-#: ../regexp_nfa.c:2042
-#, fuzzy
msgid "E879: (NFA regexp) Too many \\z("
-msgstr "E50: an iomarca \\z("
+msgstr "E879: (slonn NFA) An iomarca \\z("
-#: ../regexp_nfa.c:2066
msgid "E873: (NFA regexp) proper termination error"
-msgstr ""
+msgstr "E873: (slonn NFA) crํochn๚ neamhoiri๚nach"
-#: ../regexp_nfa.c:2599
-msgid "E874: (NFA) Could not pop the stack !"
-msgstr ""
+msgid "E874: (NFA) Could not pop the stack!"
+msgstr "E874: (NFA) Nํorbh fh้idir an chruach a phlobadh!"
-#: ../regexp_nfa.c:3298
msgid ""
"E875: (NFA regexp) (While converting from postfix to NFA), too many states "
"left on stack"
msgstr ""
+"E875: (slonn NFA) (Le linn tiontaithe ๓ postfix go NFA), an iomarca "
+"staideanna fแgtha ar an gcruach"
-#: ../regexp_nfa.c:3302
msgid "E876: (NFA regexp) Not enough space to store the whole NFA "
+msgstr "E876: (slonn NFA) Nํl go leor spแis ann don NFA iomlแn "
+
+msgid "E878: (NFA) Could not allocate memory for branch traversal!"
msgstr ""
+"E878: (NFA) Nํorbh fh้idir cuimhne a leithdhแileadh leis an gcraobh a "
+"thrasnaํl!"
-#: ../regexp_nfa.c:4571 ../regexp_nfa.c:4869
msgid ""
-"Could not open temporary log file for writing, displaying on stderr ... "
+"Could not open temporary log file for writing, displaying on stderr... "
msgstr ""
+"Nํorbh fh้idir logchomhad sealadach a oscailt le scrํobh ann, แ thaispeแint "
+"ar stderr..."
-#: ../regexp_nfa.c:4840
#, c-format
msgid "(NFA) COULD NOT OPEN %s !"
-msgstr ""
+msgstr "(NFA) NอORBH FHษIDIR %s A OSCAILT!"
-#: ../regexp_nfa.c:6049
-#, fuzzy
msgid "Could not open temporary log file for writing "
-msgstr "E214: Nํ f้idir comhad sealadach a aimsi๚ chun scrํobh ann"
+msgstr "Nํorbh fh้idir logchomhad sealadach a oscailt le scrํobh ann "
-#: ../screen.c:7435
msgid " VREPLACE"
msgstr " V-IONADAIGH"
-#: ../screen.c:7437
msgid " REPLACE"
msgstr " ATHCHUR"
-#: ../screen.c:7440
msgid " REVERSE"
msgstr " TIONTฺ"
-#: ../screen.c:7441
msgid " INSERT"
msgstr " IONSม"
-#: ../screen.c:7443
msgid " (insert)"
msgstr " (ionsแigh)"
-#: ../screen.c:7445
msgid " (replace)"
msgstr " (ionadaigh)"
-#: ../screen.c:7447
msgid " (vreplace)"
msgstr " (v-ionadaigh)"
-#: ../screen.c:7449
msgid " Hebrew"
msgstr " Eabhrais"
-#: ../screen.c:7454
msgid " Arabic"
msgstr " Araibis"
-#: ../screen.c:7456
-msgid " (lang)"
-msgstr " (teanga)"
-
-#: ../screen.c:7459
msgid " (paste)"
msgstr " (greamaigh)"
-#: ../screen.c:7469
msgid " VISUAL"
msgstr " RADHARCACH"
-#: ../screen.c:7470
msgid " VISUAL LINE"
msgstr " LอNE RADHARCACH"
-#: ../screen.c:7471
msgid " VISUAL BLOCK"
msgstr " BLOC RADHARCACH"
-#: ../screen.c:7472
msgid " SELECT"
msgstr " ROGHNฺ"
-#: ../screen.c:7473
msgid " SELECT LINE"
msgstr " SELECT LINE"
-#: ../screen.c:7474
msgid " SELECT BLOCK"
msgstr " SELECT BLOCK"
-#: ../screen.c:7486 ../screen.c:7541
msgid "recording"
msgstr "แ thaifeadadh"
-#: ../search.c:487
#, c-format
msgid "E383: Invalid search string: %s"
msgstr "E383: Teaghrแn cuardaigh neamhbhailํ: %s"
-#: ../search.c:832
#, c-format
msgid "E384: search hit TOP without match for: %s"
msgstr "E384: bhuail an cuardach an BARR gan teaghrแn comhoiri๚nach le %s"
-#: ../search.c:835
#, c-format
msgid "E385: search hit BOTTOM without match for: %s"
msgstr "E385: bhuail an cuardach an BUN gan teaghrแn comhoiri๚nach le %s"
-#: ../search.c:1200
msgid "E386: Expected '?' or '/' after ';'"
msgstr "E386: Ag s๚il le '?' n๓ '/' i ndiaidh ';'"
-#: ../search.c:4085
msgid " (includes previously listed match)"
msgstr " (tแ an teaghrแn comhoiri๚naithe roimhe seo san แireamh)"
#. cursor at status line
-#: ../search.c:4104
msgid "--- Included files "
msgstr "--- Comhaid cheanntแisc "
-#: ../search.c:4106
msgid "not found "
msgstr "gan aimsi๚"
-#: ../search.c:4107
msgid "in path ---\n"
msgstr "i gconair ---\n"
-#: ../search.c:4168
msgid " (Already listed)"
msgstr " (Liostaithe cheana f้in)"
-#: ../search.c:4170
msgid " NOT FOUND"
msgstr " AR IARRAIDH"
-#: ../search.c:4211
#, c-format
msgid "Scanning included file: %s"
msgstr "Comhad ceanntแisc แ scanadh: %s"
-#: ../search.c:4216
#, c-format
msgid "Searching included file %s"
msgstr "Comhad ceanntแisc %s แ chuardach"
-#: ../search.c:4405
msgid "E387: Match is on current line"
msgstr "E387: Tแ an teaghrแn comhoiri๚naithe ar an lํne reatha"
-#: ../search.c:4517
msgid "All included files were found"
msgstr "Aimsํodh gach comhad ceanntแisc"
-#: ../search.c:4519
msgid "No included files"
msgstr "Gan comhaid cheanntแisc"
-#: ../search.c:4527
msgid "E388: Couldn't find definition"
msgstr "E388: Sainmhํni๚ gan aimsi๚"
-#: ../search.c:4529
msgid "E389: Couldn't find pattern"
msgstr "E389: Patr๚n gan aimsi๚"
-#: ../search.c:4668
msgid "Substitute "
msgstr "Ionad๚ "
# in .viminfo
-#: ../search.c:4681
#, c-format
msgid ""
"\n"
@@ -5270,98 +5077,130 @@ msgstr ""
"# %sPatr๚n Cuardaigh Is D้anaํ:\n"
"~"
-#: ../spell.c:951
-msgid "E759: Format error in spell file"
-msgstr "E759: Earrแid fhormแide i gcomhad litrithe"
+msgid "E756: Spell checking is not enabled"
+msgstr "E756: Nํl seiceแil litrithe cumasaithe"
+
+#, c-format
+msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\""
+msgstr ""
+"Rabhadh: Nํ f้idir liosta focal \"%s_%s.spl\" n๓ \"%s_ascii.spl\" a aimsi๚"
+
+#, c-format
+msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
+msgstr ""
+"Rabhadh: Nํ f้idir liosta focal \"%s.%s.spl\" n๓ \"%s.ascii.spl\" a aimsi๚"
+
+msgid "E797: SpellFileMissing autocommand deleted buffer"
+msgstr "E797: Scrios uathord๚ SpellFileMissing an maolแn"
+
+#, c-format
+msgid "Warning: region %s not supported"
+msgstr "Rabhadh: r้igi๚n %s gan tacaํocht"
+
+msgid "Sorry, no suggestions"
+msgstr "Tแ br๓n orm, nํl aon mholadh ann"
+
+#, c-format
+msgid "Sorry, only %ld suggestions"
+msgstr "Tแ br๓n orm, nํl ach %ld moladh ann"
+
+#. for when 'cmdheight' > 1
+#. avoid more prompt
+#, c-format
+msgid "Change \"%.*s\" to:"
+msgstr "Athraigh \"%.*s\" go:"
+
+#, c-format
+msgid " < \"%.*s\""
+msgstr " < \"%.*s\""
+
+msgid "E752: No previous spell replacement"
+msgstr "E752: Nํl aon ionadaํ litrithe roimhe seo"
+
+#, c-format
+msgid "E753: Not found: %s"
+msgstr "E753: Gan aimsi๚: %s"
-#: ../spell.c:952
msgid "E758: Truncated spell file"
msgstr "E758: Comhad teasctha litrithe"
-#: ../spell.c:953
#, c-format
msgid "Trailing text in %s line %d: %s"
msgstr "T้acs chun deiridh i %s lํne %d: %s"
-#: ../spell.c:954
#, c-format
msgid "Affix name too long in %s line %d: %s"
msgstr "Ainm foircinn r๓fhada i %s lํne %d: %s"
-#: ../spell.c:955
msgid "E761: Format error in affix file FOL, LOW or UPP"
msgstr "E761: Earrแid fhormแide i gcomhad foircinn FOL, LOW, n๓ UPP"
-#: ../spell.c:957
msgid "E762: Character in FOL, LOW or UPP is out of range"
msgstr "E762: Carachtar i FOL, LOW n๓ UPP as raon"
-#: ../spell.c:958
msgid "Compressing word tree..."
msgstr "Crann focal แ chomhbhr๚..."
-#: ../spell.c:1951
-msgid "E756: Spell checking is not enabled"
-msgstr "E756: Nํl seiceแil litrithe cumasaithe"
-
-#: ../spell.c:2249
-#, c-format
-msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
-msgstr ""
-"Rabhadh: Nํ f้idir liosta focal \"%s.%s.spl\" n๓ \"%s.ascii.spl\" a aimsi๚"
-
-#: ../spell.c:2473
#, c-format
msgid "Reading spell file \"%s\""
msgstr "Comhad litrithe \"%s\" แ l้amh"
-#: ../spell.c:2496
msgid "E757: This does not look like a spell file"
msgstr "E757: Nํl s้ cos๚il le comhad litrithe"
-#: ../spell.c:2501
msgid "E771: Old spell file, needs to be updated"
msgstr "E771: Seanchomhad litrithe, tแ gแ lena nuashonr๚"
-#: ../spell.c:2504
msgid "E772: Spell file is for newer version of Vim"
msgstr "E772: Oibrํonn an comhad litrithe le leagan nํos nuaํ de Vim"
-#: ../spell.c:2602
msgid "E770: Unsupported section in spell file"
msgstr "E770: Rannแn gan tacaํocht i gcomhad litrithe"
-#: ../spell.c:3762
#, c-format
-msgid "Warning: region %s not supported"
-msgstr "Rabhadh: r้igi๚n %s gan tacaํocht"
+msgid "E778: This does not look like a .sug file: %s"
+msgstr "E778: Nํl s้ cos๚il le comhad .sug: %s"
+
+#, c-format
+msgid "E779: Old .sug file, needs to be updated: %s"
+msgstr "E779: Seanchomhad .sug, tแ gแ lena nuashonr๚: %s"
+
+#, c-format
+msgid "E780: .sug file is for newer version of Vim: %s"
+msgstr "E780: Oibrํonn an comhad .sug le leagan nํos nuaํ de Vim: %s"
+
+#, c-format
+msgid "E781: .sug file doesn't match .spl file: %s"
+msgstr "E781: Nํl an comhad .sug comhoiri๚nach leis an gcomhad .spl: %s"
-#: ../spell.c:4550
#, c-format
-msgid "Reading affix file %s ..."
+msgid "E782: error while reading .sug file: %s"
+msgstr "E782: earrแid agus comhad .sug แ l้amh: %s"
+
+#, c-format
+msgid "Reading affix file %s..."
msgstr "Comhad foircinn %s แ l้amh..."
-#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
#, c-format
msgid "Conversion failure for word in %s line %d: %s"
msgstr "Theip ar thiont๚ focail i %s lํne %d: %s"
-#: ../spell.c:4630 ../spell.c:6170
#, c-format
msgid "Conversion in %s not supported: from %s to %s"
msgstr "Tiont๚ i %s gan tacaํocht: ๓ %s go %s"
-#: ../spell.c:4642
+#, c-format
+msgid "Conversion in %s not supported"
+msgstr "Tiont๚ i %s gan tacaํocht"
+
#, c-format
msgid "Invalid value for FLAG in %s line %d: %s"
msgstr "Luach neamhbhailํ ar FLAG i %s lํne %d: %s"
-#: ../spell.c:4655
#, c-format
msgid "FLAG after using flags in %s line %d: %s"
msgstr "FLAG i ndiaidh bratacha in ๚sแid i %s lํne %d: %s"
-#: ../spell.c:4723
#, c-format
msgid ""
"Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line "
@@ -5370,7 +5209,6 @@ msgstr ""
"Seans go bhfaighfidh t๚ torthaํ mํchearta mแ chuireann t๚ COMPOUNDFORBIDFLAG "
"tar ้is mํre PFX i %s lํne %d"
-#: ../spell.c:4731
#, c-format
msgid ""
"Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line "
@@ -5379,42 +5217,34 @@ msgstr ""
"Seans go bhfaighfidh t๚ torthaํ mํchearta mแ chuireann t๚ COMPOUNDPERMITFLAG "
"tar ้is mํre PFX i %s lํne %d"
-#: ../spell.c:4747
#, c-format
msgid "Wrong COMPOUNDRULES value in %s line %d: %s"
msgstr "Luach mํcheart ar COMPOUNDRULES i %s lํne %d: %s"
-#: ../spell.c:4771
#, c-format
msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s"
msgstr "Luach mํcheart ar COMPOUNDWORDMAX i %s lํne %d: %s"
-#: ../spell.c:4777
#, c-format
msgid "Wrong COMPOUNDMIN value in %s line %d: %s"
msgstr "Luach mํcheart ar COMPOUNDMIN i %s lํne %d: %s"
-#: ../spell.c:4783
#, c-format
msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s"
msgstr "Luach mํcheart ar COMPOUNDSYLMAX i %s lํne %d: %s"
-#: ../spell.c:4795
#, c-format
msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"
msgstr "Luach mํcheart ar CHECKCOMPOUNDPATTERN i %s lํne %d: %s"
-#: ../spell.c:4847
#, c-format
msgid "Different combining flag in continued affix block in %s line %d: %s"
msgstr "Bratach dhifri๚il cheangail i mbloc leanta foircinn i %s lํne %d: %s"
-#: ../spell.c:4850
#, c-format
msgid "Duplicate affix in %s line %d: %s"
msgstr "Clib dh๚blach i %s lํne %d: %s"
-#: ../spell.c:4871
#, c-format
msgid ""
"Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s "
@@ -5423,335 +5253,251 @@ msgstr ""
"Foirceann in ๚sแid le haghaidh BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/"
"NOSUGGEST freisin i %s lํne %d: %s"
-#: ../spell.c:4893
#, c-format
msgid "Expected Y or N in %s line %d: %s"
msgstr "Bhํothas ag s๚il le `Y' n๓ `N' i %s lํne %d: %s"
-#: ../spell.c:4968
#, c-format
msgid "Broken condition in %s line %d: %s"
msgstr "Coinnํoll briste i %s lํne %d: %s"
-#: ../spell.c:5091
#, c-format
msgid "Expected REP(SAL) count in %s line %d"
msgstr "Bhํothas ag s๚il le lํon na REP(SAL) i %s lํne %d"
-#: ../spell.c:5120
#, c-format
msgid "Expected MAP count in %s line %d"
msgstr "Bhํothas ag s๚il le lํon na MAP i %s lํne %d"
-#: ../spell.c:5132
#, c-format
msgid "Duplicate character in MAP in %s line %d"
msgstr "Carachtar d๚blach i MAP i %s lํne %d"
-#: ../spell.c:5176
#, c-format
msgid "Unrecognized or duplicate item in %s line %d: %s"
msgstr "Mํr anaithnid n๓ dh๚blach i %s lํne %d: %s"
-#: ../spell.c:5197
#, c-format
msgid "Missing FOL/LOW/UPP line in %s"
msgstr "Lํne FOL/LOW/UPP ar iarraidh i %s"
-#: ../spell.c:5220
msgid "COMPOUNDSYLMAX used without SYLLABLE"
msgstr "COMPOUNDSYLMAX in ๚sแid gan SYLLABLE"
-#: ../spell.c:5236
msgid "Too many postponed prefixes"
msgstr "An iomarca r้imํreanna curtha siar"
-#: ../spell.c:5238
msgid "Too many compound flags"
msgstr "An iomarca bratach comhfhocail"
-#: ../spell.c:5240
msgid "Too many postponed prefixes and/or compound flags"
msgstr "An iomarca r้imํreanna curtha siar agus/n๓ bratacha comhfhocal"
-#: ../spell.c:5250
#, c-format
msgid "Missing SOFO%s line in %s"
msgstr "Lํne SOFO%s ar iarraidh i %s"
-#: ../spell.c:5253
#, c-format
msgid "Both SAL and SOFO lines in %s"
msgstr "Lํnte SAL agus SOFO araon i %s"
-#: ../spell.c:5331
#, c-format
msgid "Flag is not a number in %s line %d: %s"
msgstr "Nํ uimhir ํ an bhratach i %s lํne %d: %s"
-#: ../spell.c:5334
#, c-format
msgid "Illegal flag in %s line %d: %s"
msgstr "Bratach neamhcheadaithe i %s lํne %d: %s"
-#: ../spell.c:5493 ../spell.c:5501
#, c-format
msgid "%s value differs from what is used in another .aff file"
msgstr "Tแ difear idir luach %s agus an luach i gcomhad .aff eile"
-#: ../spell.c:5602
#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "Focl๓ir %s แ l้amh ..."
+msgid "Reading dictionary file %s..."
+msgstr "Focl๓ir %s แ l้amh..."
-#: ../spell.c:5611
#, c-format
msgid "E760: No word count in %s"
msgstr "E760: Lํon na bhfocal ar iarraidh i %s"
-#: ../spell.c:5669
#, c-format
msgid "line %6d, word %6d - %s"
msgstr "lํne %6d, focal %6d - %s"
-#: ../spell.c:5691
#, c-format
msgid "Duplicate word in %s line %d: %s"
msgstr "Focal d๚blach i %s lํne %d: %s"
-#: ../spell.c:5694
#, c-format
msgid "First duplicate word in %s line %d: %s"
msgstr "An ch้ad fhocal d๚blach i %s lํne %d: %s"
-#: ../spell.c:5746
#, c-format
msgid "%d duplicate word(s) in %s"
msgstr "%d focal d๚blach i %s"
-#: ../spell.c:5748
#, c-format
msgid "Ignored %d word(s) with non-ASCII characters in %s"
msgstr "Rinneadh neamhshuim ar %d focal le carachtair neamh-ASCII i %s"
-#: ../spell.c:6115
#, c-format
-msgid "Reading word file %s ..."
-msgstr "Comhad focail %s แ l้amh ..."
+msgid "Reading word file %s..."
+msgstr "Comhad focail %s แ l้amh..."
-#: ../spell.c:6155
#, c-format
msgid "Duplicate /encoding= line ignored in %s line %d: %s"
msgstr "Rinneadh neamhshuim ar lํne dh๚blach `/encoding=' i %s lํne %d: %s"
-#: ../spell.c:6159
#, c-format
msgid "/encoding= line after word ignored in %s line %d: %s"
msgstr ""
"Rinneadh neamhshuim ar lํne `/encoding=' i ndiaidh focail i %s lํne %d: %s"
-#: ../spell.c:6180
#, c-format
msgid "Duplicate /regions= line ignored in %s line %d: %s"
msgstr "Rinneadh neamhshuim ar lํne `/regions=' i %s lํne %d: %s"
-#: ../spell.c:6185
#, c-format
msgid "Too many regions in %s line %d: %s"
msgstr "An iomarca r้igi๚n i %s lํne %d: %s"
-#: ../spell.c:6198
#, c-format
msgid "/ line ignored in %s line %d: %s"
msgstr "Rinneadh neamhshuim ar lํne `/' i %s lํne %d: %s"
-#: ../spell.c:6224
#, c-format
msgid "Invalid region nr in %s line %d: %s"
msgstr "Uimhir neamhbhailํ r้igi๚in i %s lํne %d: %s"
-#: ../spell.c:6230
#, c-format
msgid "Unrecognized flags in %s line %d: %s"
msgstr "Bratacha anaithnide i %s lํne %d: %s"
-#: ../spell.c:6257
#, c-format
msgid "Ignored %d words with non-ASCII characters"
msgstr "Rinneadh neamhshuim ar %d focal le carachtair neamh-ASCII"
-#: ../spell.c:6656
+msgid "E845: Insufficient memory, word list will be incomplete"
+msgstr "E845: Easpa cuimhne, beidh an liosta focal neamhiomlแn"
+
#, c-format
msgid "Compressed %d of %d nodes; %d (%d%%) remaining"
msgstr "Comhbhr๚dh %d as %d n๓d; %d (%d%%) fแgtha"
-#: ../spell.c:7340
msgid "Reading back spell file..."
msgstr "Comhad litrithe แ l้amh arํs..."
-#. Go through the trie of good words, soundfold each word and add it to
-#. the soundfold trie.
-#: ../spell.c:7357
+#.
+#. * Go through the trie of good words, soundfold each word and add it to
+#. * the soundfold trie.
+#.
msgid "Performing soundfolding..."
msgstr "Fuaimfhilleadh..."
-#: ../spell.c:7368
#, c-format
-msgid "Number of words after soundfolding: %<PRId64>"
-msgstr "Lํon na bhfocal tar ้is fuaimfhillte: %<PRId64>"
+msgid "Number of words after soundfolding: %ld"
+msgstr "Lํon na bhfocal tar ้is fuaimfhillte: %ld"
-#: ../spell.c:7476
#, c-format
msgid "Total number of words: %d"
msgstr "Lํon iomlแn na bhfocal: %d"
-#: ../spell.c:7655
#, c-format
-msgid "Writing suggestion file %s ..."
-msgstr "Comhad moltaํ %s แ scrํobh ..."
+msgid "Writing suggestion file %s..."
+msgstr "Comhad moltaํ %s แ scrํobh..."
-#: ../spell.c:7707 ../spell.c:7927
#, c-format
msgid "Estimated runtime memory use: %d bytes"
msgstr "Cuimhne measta a bheith in ๚sแid le linn rite: %d beart"
-#: ../spell.c:7820
msgid "E751: Output file name must not have region name"
msgstr "E751: Nํ cheadaํtear ainm r้igi๚in in ainm an aschomhaid"
-#: ../spell.c:7822
msgid "E754: Only up to 8 regions supported"
msgstr "E754: Nํ thacaํtear le nํos m๓ nแ 8 r้igi๚n"
-#: ../spell.c:7846
#, c-format
msgid "E755: Invalid region in %s"
msgstr "E755: R้igi๚n neamhbhailํ i %s"
-#: ../spell.c:7907
msgid "Warning: both compounding and NOBREAK specified"
msgstr "Rabhadh: sonraํodh comhfhocail agus NOBREAK araon"
-#: ../spell.c:7920
#, c-format
-msgid "Writing spell file %s ..."
-msgstr "Comhad litrithe %s แ scrํobh ..."
+msgid "Writing spell file %s..."
+msgstr "Comhad litrithe %s แ scrํobh..."
-#: ../spell.c:7925
msgid "Done!"
msgstr "Crํochnaithe!"
-#: ../spell.c:8034
#, c-format
-msgid "E765: 'spellfile' does not have %<PRId64> entries"
-msgstr "E765: nํl %<PRId64> iontrแil i 'spellfile'"
+msgid "E765: 'spellfile' does not have %ld entries"
+msgstr "E765: nํl %ld iontrแil i 'spellfile'"
-#: ../spell.c:8074
-#, fuzzy, c-format
+#, c-format
msgid "Word '%.*s' removed from %s"
-msgstr "Baineadh focal ๓ %s"
+msgstr "Baineadh focal '%.*s' ๓ %s"
-#: ../spell.c:8117
-#, fuzzy, c-format
+#, c-format
msgid "Word '%.*s' added to %s"
-msgstr "Cuireadh focal le %s"
+msgstr "Cuireadh focal '%.*s' le %s"
-#: ../spell.c:8381
msgid "E763: Word characters differ between spell files"
msgstr "E763: Tแ carachtair dhifri๚la fhocail sna comhaid litrithe"
-#: ../spell.c:8684
-msgid "Sorry, no suggestions"
-msgstr "Tแ br๓n orm, nํl aon mholadh ann"
-
-#: ../spell.c:8687
-#, c-format
-msgid "Sorry, only %<PRId64> suggestions"
-msgstr "Tแ br๓n orm, nํl ach %<PRId64> moladh ann"
-
-#. for when 'cmdheight' > 1
-#. avoid more prompt
-#: ../spell.c:8704
-#, c-format
-msgid "Change \"%.*s\" to:"
-msgstr "Athraigh \"%.*s\" go:"
-
-#: ../spell.c:8737
-#, c-format
-msgid " < \"%.*s\""
-msgstr " < \"%.*s\""
+#. This should have been checked when generating the .spl
+#. * file.
+msgid "E783: duplicate char in MAP entry"
+msgstr "E783: carachtar d๚blach in iontrแil MAP"
-#: ../spell.c:8882
-msgid "E752: No previous spell replacement"
-msgstr "E752: Nํl aon ionadaํ litrithe roimhe seo"
+msgid "No Syntax items defined for this buffer"
+msgstr "Nํl aon mhํr chomhr้ire sainmhํnithe le haghaidh an mhaolแin seo"
-#: ../spell.c:8925
-#, c-format
-msgid "E753: Not found: %s"
-msgstr "E753: Gan aimsi๚: %s"
+msgid "syntax conceal on"
+msgstr "syntax conceal on"
-#: ../spell.c:9276
-#, c-format
-msgid "E778: This does not look like a .sug file: %s"
-msgstr "E778: Nํl s้ cos๚il le comhad .sug: %s"
+msgid "syntax conceal off"
+msgstr "syntax conceal off"
-#: ../spell.c:9282
#, c-format
-msgid "E779: Old .sug file, needs to be updated: %s"
-msgstr "E779: Seanchomhad .sug, tแ gแ lena nuashonr๚: %s"
+msgid "E390: Illegal argument: %s"
+msgstr "E390: Arg๓int neamhcheadaithe: %s"
-#: ../spell.c:9286
-#, c-format
-msgid "E780: .sug file is for newer version of Vim: %s"
-msgstr "E780: Oibrํonn an comhad .sug le leagan nํos nuaํ de Vim: %s"
+msgid "syntax case ignore"
+msgstr "syntax case ignore"
-#: ../spell.c:9295
-#, c-format
-msgid "E781: .sug file doesn't match .spl file: %s"
-msgstr "E781: Nํl an comhad .sug comhoiri๚nach leis an gcomhad .spl: %s"
+msgid "syntax case match"
+msgstr "syntax case match"
-#: ../spell.c:9305
-#, c-format
-msgid "E782: error while reading .sug file: %s"
-msgstr "E782: earrแid agus comhad .sug แ l้amh: %s"
+msgid "syntax spell toplevel"
+msgstr "syntax spell toplevel"
-#. This should have been checked when generating the .spl
-#. file.
-#: ../spell.c:11575
-msgid "E783: duplicate char in MAP entry"
-msgstr "E783: carachtar d๚blach in iontrแil MAP"
+msgid "syntax spell notoplevel"
+msgstr "syntax spell notoplevel"
-#: ../syntax.c:266
-msgid "No Syntax items defined for this buffer"
-msgstr "Nํl aon mhํr chomhr้ire sainmhํnithe le haghaidh an mhaolแin seo"
+msgid "syntax spell default"
+msgstr "syntax spell default"
-#: ../syntax.c:3083 ../syntax.c:3104 ../syntax.c:3127
-#, c-format
-msgid "E390: Illegal argument: %s"
-msgstr "E390: Arg๓int neamhcheadaithe: %s"
+msgid "syntax iskeyword "
+msgstr "syntax iskeyword "
-#: ../syntax.c:3299
#, c-format
msgid "E391: No such syntax cluster: %s"
msgstr "E391: Nํl a leith้id de mhogall comhr้ire: %s"
-#: ../syntax.c:3433
msgid "syncing on C-style comments"
msgstr "ag sioncr๓n๚ ar n๓ta den n๓s C"
-#: ../syntax.c:3439
msgid "no syncing"
msgstr "gan sioncr๓n๚"
-#: ../syntax.c:3441
msgid "syncing starts "
msgstr "tosaํonn an sioncr๓n๚ "
-#: ../syntax.c:3443 ../syntax.c:3506
msgid " lines before top line"
msgstr " lํnte roimh an bharr"
-#: ../syntax.c:3448
msgid ""
"\n"
"--- Syntax sync items ---"
@@ -5759,7 +5505,6 @@ msgstr ""
"\n"
"--- Mํreanna Comhr้ire Sionc ---"
-#: ../syntax.c:3452
msgid ""
"\n"
"syncing on items"
@@ -5767,7 +5512,6 @@ msgstr ""
"\n"
"ag sioncr๓n๚ ar mhํreanna"
-#: ../syntax.c:3457
msgid ""
"\n"
"--- Syntax items ---"
@@ -5775,275 +5519,217 @@ msgstr ""
"\n"
"--- Mํreanna comhr้ire ---"
-#: ../syntax.c:3475
#, c-format
msgid "E392: No such syntax cluster: %s"
msgstr "E392: Nํl a leith้id de mhogall comhr้ire: %s"
-#: ../syntax.c:3497
msgid "minimal "
msgstr "ํosta "
-#: ../syntax.c:3503
msgid "maximal "
msgstr "uasta "
-#: ../syntax.c:3513
msgid "; match "
msgstr "; meaitseแil "
-#: ../syntax.c:3515
msgid " line breaks"
msgstr " bristeacha lํne"
-#: ../syntax.c:4076
msgid "E395: contains argument not accepted here"
msgstr "E395: tแ arg๓int ann nach nglactar leis anseo"
-#: ../syntax.c:4096
-#, fuzzy
msgid "E844: invalid cchar value"
-msgstr "E474: Arg๓int neamhbhailํ"
+msgstr "E844: luach neamhbhailํ cchar"
-#: ../syntax.c:4107
msgid "E393: group[t]here not accepted here"
msgstr "E393: nํ ghlactar le group[t]here anseo"
-#: ../syntax.c:4126
#, c-format
msgid "E394: Didn't find region item for %s"
msgstr "E394: Nํor aimsํodh mํr r้igi๚in le haghaidh %s"
-#: ../syntax.c:4188
msgid "E397: Filename required"
msgstr "E397: Tแ gแ le hainm comhaid"
-#: ../syntax.c:4221
-#, fuzzy
msgid "E847: Too many syntax includes"
-msgstr "E77: An iomarca ainmneacha comhaid"
+msgstr "E847: An iomarca comhad comhr้ire in ๚sแid"
-#: ../syntax.c:4303
#, c-format
msgid "E789: Missing ']': %s"
msgstr "E789: ']' ar iarraidh: %s"
-#: ../syntax.c:4531
+#, c-format
+msgid "E890: trailing char after ']': %s]%s"
+msgstr "E890: carachtar tar ้is ']': %s]%s"
+
#, c-format
msgid "E398: Missing '=': %s"
msgstr "E398: '=' ar iarraidh: %s"
-#: ../syntax.c:4666
#, c-format
msgid "E399: Not enough arguments: syntax region %s"
msgstr "E399: Nํl go leor arg๓intํ ann: r้igi๚n comhr้ire %s"
-#: ../syntax.c:4870
-#, fuzzy
msgid "E848: Too many syntax clusters"
-msgstr "E391: Nํl a leith้id de mhogall comhr้ire: %s"
+msgstr "E848: An iomarca mogall comhr้ire"
-#: ../syntax.c:4954
msgid "E400: No cluster specified"
msgstr "E400: Nํor sonraํodh mogall"
-#. end delimiter not found
-#: ../syntax.c:4986
#, c-format
msgid "E401: Pattern delimiter not found: %s"
msgstr "E401: Teormharc๓ir patr๚in gan aimsi๚: %s"
-#: ../syntax.c:5049
#, c-format
msgid "E402: Garbage after pattern: %s"
msgstr "E402: Dramhaํl i ndiaidh patr๚in: %s"
-#: ../syntax.c:5120
msgid "E403: syntax sync: line continuations pattern specified twice"
msgstr "E403: comhr้ir sionc: tugadh patr๚n lean๚int lํne faoi dh๓"
-#: ../syntax.c:5169
#, c-format
msgid "E404: Illegal arguments: %s"
msgstr "E404: Arg๓intํ neamhcheadaithe: %s"
-#: ../syntax.c:5217
#, c-format
msgid "E405: Missing equal sign: %s"
msgstr "E405: Sํn chothroime ar iarraidh: %s"
-#: ../syntax.c:5222
#, c-format
msgid "E406: Empty argument: %s"
msgstr "E406: Arg๓int fholamh: %s"
-#: ../syntax.c:5240
#, c-format
msgid "E407: %s not allowed here"
msgstr "E407: nํ cheadaํtear %s anseo"
-#: ../syntax.c:5246
#, c-format
msgid "E408: %s must be first in contains list"
msgstr "E408: nํ folแir %s a thabhairt ar dt๚s sa liosta `contains'"
-#: ../syntax.c:5304
#, c-format
msgid "E409: Unknown group name: %s"
msgstr "E409: Ainm anaithnid gr๚pa: %s"
-#: ../syntax.c:5512
#, c-format
msgid "E410: Invalid :syntax subcommand: %s"
msgstr "E410: Fo-ord๚ neamhbhailํ :syntax: %s"
-#: ../syntax.c:5854
msgid ""
" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
msgstr ""
+" IOMLมN LอON MEAITS IS MOILLE MEมN AINM PATRฺN"
-#: ../syntax.c:6146
msgid "E679: recursive loop loading syncolor.vim"
msgstr "E679: l๚b athch๚rsach agus syncolor.vim แ lucht๚"
-#: ../syntax.c:6256
#, c-format
msgid "E411: highlight group not found: %s"
msgstr "E411: Gr๚pa aibhsithe gan aimsi๚: %s"
-#: ../syntax.c:6278
#, c-format
msgid "E412: Not enough arguments: \":highlight link %s\""
msgstr "E412: Easpa arg๓intํ: \":highlight link %s\""
-#: ../syntax.c:6284
#, c-format
msgid "E413: Too many arguments: \":highlight link %s\""
msgstr "E413: An iomarca arg๓intํ: \":highlight link %s\""
-#: ../syntax.c:6302
msgid "E414: group has settings, highlight link ignored"
msgstr ""
"E414: tแ socruithe ag an ghr๚pa, ag d้anamh neamhshuim ar nasc aibhsithe"
-#: ../syntax.c:6367
#, c-format
msgid "E415: unexpected equal sign: %s"
msgstr "E415: sํn chothroime gan choinne: %s"
-#: ../syntax.c:6395
#, c-format
msgid "E416: missing equal sign: %s"
msgstr "E416: sํn chothroime ar iarraidh: %s"
-#: ../syntax.c:6418
#, c-format
msgid "E417: missing argument: %s"
msgstr "E417: arg๓int ar iarraidh: %s"
-#: ../syntax.c:6446
#, c-format
msgid "E418: Illegal value: %s"
msgstr "E418: Luach neamhcheadaithe: %s"
-#: ../syntax.c:6496
msgid "E419: FG color unknown"
msgstr "E419: Dath anaithnid an ch๚lra"
-#: ../syntax.c:6504
msgid "E420: BG color unknown"
msgstr "E420: Dath anaithnid an tulra"
-#: ../syntax.c:6564
#, c-format
msgid "E421: Color name or number not recognized: %s"
msgstr "E421: Nํor aithnํodh ainm/uimhir an datha: %s"
-#: ../syntax.c:6714
#, c-format
msgid "E422: terminal code too long: %s"
msgstr "E422: c๓d teirmin้il r๓fhada: %s"
-#: ../syntax.c:6753
#, c-format
msgid "E423: Illegal argument: %s"
msgstr "E423: Arg๓int neamhcheadaithe: %s"
-#: ../syntax.c:6925
msgid "E424: Too many different highlighting attributes in use"
msgstr "E424: An iomarca tr้ithe aibhsithe in ๚sแid"
-#: ../syntax.c:7427
msgid "E669: Unprintable character in group name"
msgstr "E669: Carachtar neamhghrafach in ainm gr๚pa"
-#: ../syntax.c:7434
msgid "W18: Invalid character in group name"
msgstr "W18: Carachtar neamhbhailํ in ainm gr๚pa"
-#: ../syntax.c:7448
msgid "E849: Too many highlight and syntax groups"
-msgstr ""
+msgstr "E849: An iomarca gr๚paํ aibhsithe agus comhr้ire"
-#: ../tag.c:104
msgid "E555: at bottom of tag stack"
msgstr "E555: in ํochtar na cruaiche clibeanna"
-#: ../tag.c:105
msgid "E556: at top of tag stack"
msgstr "E556: in uachtar na cruaiche clibeanna"
-#: ../tag.c:380
msgid "E425: Cannot go before first matching tag"
msgstr "E425: Nํ f้idir a dhul roimh an ch้ad chlib chomhoiri๚nach"
-#: ../tag.c:504
#, c-format
msgid "E426: tag not found: %s"
msgstr "E426: clib gan aimsi๚: %s"
-#: ../tag.c:528
msgid " # pri kind tag"
msgstr " # tos cin clib"
-#: ../tag.c:531
msgid "file\n"
msgstr "comhad\n"
-#: ../tag.c:829
msgid "E427: There is only one matching tag"
msgstr "E427: Tแ aon chlib chomhoiri๚nach amhแin"
-#: ../tag.c:831
msgid "E428: Cannot go beyond last matching tag"
msgstr "E428: Nํ f้idir a dhul thar an chlib chomhoiri๚nach deireanach"
-#: ../tag.c:850
#, c-format
msgid "File \"%s\" does not exist"
msgstr "Nํl a leith้id de chomhad \"%s\" ann"
#. Give an indication of the number of matching tags
-#: ../tag.c:859
#, c-format
msgid "tag %d of %d%s"
msgstr "clib %d as %d%s"
-#: ../tag.c:862
msgid " or more"
msgstr " n๓ os a chionn"
-#: ../tag.c:864
msgid " Using tag with different case!"
msgstr " Ag ๚sแid clib le cแs eile!"
-#: ../tag.c:909
#, c-format
msgid "E429: File \"%s\" does not exist"
msgstr "E429: Nํl a leith้id de chomhad \"%s\""
#. Highlight title
-#: ../tag.c:960
msgid ""
"\n"
" # TO tag FROM line in file/text"
@@ -6051,79 +5737,66 @@ msgstr ""
"\n"
" # Go clib ำ lํne i gcomhad/t้acs"
-#: ../tag.c:1303
#, c-format
msgid "Searching tags file %s"
msgstr "Comhad clibeanna %s แ chuardach"
-#: ../tag.c:1545
+#, c-format
+msgid "E430: Tag file path truncated for %s\n"
+msgstr "E430: Teascadh conair an chomhaid clibeanna le haghaidh %s\n"
+
msgid "Ignoring long line in tags file"
msgstr "Ag d้anamh neamhaird de lํne fhada sa chomhad clibeanna"
-#: ../tag.c:1915
#, c-format
msgid "E431: Format error in tags file \"%s\""
msgstr "E431: Earrแid fhormแide i gcomhad clibeanna \"%s\""
-#: ../tag.c:1917
#, c-format
-msgid "Before byte %<PRId64>"
-msgstr "Roimh bheart %<PRId64>"
+msgid "Before byte %ld"
+msgstr "Roimh bheart %ld"
-#: ../tag.c:1929
#, c-format
msgid "E432: Tags file not sorted: %s"
msgstr "E432: Comhad clibeanna gan s๓rtแil: %s"
#. never opened any tags file
-#: ../tag.c:1960
msgid "E433: No tags file"
msgstr "E433: Nํl aon chomhad clibeanna"
-#: ../tag.c:2536
msgid "E434: Can't find tag pattern"
msgstr "E434: Patr๚n clibe gan aimsi๚"
-#: ../tag.c:2544
msgid "E435: Couldn't find tag, just guessing!"
msgstr "E435: Clib gan aimsi๚, ag tabhairt buille faoi thuairim!"
-#: ../tag.c:2797
-#, fuzzy, c-format
+#, c-format
msgid "Duplicate field name: %s"
-msgstr "Clib dh๚blach i %s lํne %d: %s"
+msgstr "Ainm r้imse d๚bailte: %s"
-#: ../term.c:1442
msgid "' not known. Available builtin terminals are:"
msgstr "' anaithnid. Is iad seo na teirmin้il insuite:"
-#: ../term.c:1463
msgid "defaulting to '"
msgstr "r้amhshocr๚ = '"
-#: ../term.c:1731
msgid "E557: Cannot open termcap file"
msgstr "E557: Nํ f้idir an comhad termcap a oscailt"
-#: ../term.c:1735
msgid "E558: Terminal entry not found in terminfo"
msgstr "E558: Iontrแil teirmin้il gan aimsi๚ sa terminfo"
-#: ../term.c:1737
msgid "E559: Terminal entry not found in termcap"
msgstr "E559: Iontrแil teirmin้il gan aimsi๚ sa termcap"
-#: ../term.c:1878
#, c-format
msgid "E436: No \"%s\" entry in termcap"
msgstr "E436: Nํl aon iontrแil \"%s\" sa termcap"
-#: ../term.c:2249
msgid "E437: terminal capability \"cm\" required"
msgstr "E437: tแ gแ leis an chumas teirmin้il \"cm\""
#. Highlight title
-#: ../term.c:4376
msgid ""
"\n"
"--- Terminal keys ---"
@@ -6131,169 +5804,346 @@ msgstr ""
"\n"
"--- Eochracha teirmin้il ---"
-#: ../ui.c:481
+msgid "Cannot open $VIMRUNTIME/rgb.txt"
+msgstr "Nํ f้idir $VIMRUNTIME/rgb.txt a oscailt"
+
+msgid "new shell started\n"
+msgstr "tosaํodh blaosc nua\n"
+
msgid "Vim: Error reading input, exiting...\n"
msgstr "Vim: Earrแid agus an t-inchomhad แ l้amh; ag scor...\n"
+msgid "Used CUT_BUFFER0 instead of empty selection"
+msgstr "ฺsแideadh CUT_BUFFER0 in ionad roghn๚chแin folaimh"
+
#. This happens when the FileChangedRO autocommand changes the
#. * file in a way it becomes shorter.
-#: ../undo.c:379
-#, fuzzy
msgid "E881: Line count changed unexpectedly"
-msgstr "E787: Athraํodh an maolแn gan choinne"
+msgstr "E881: Athraํodh lํon na lํnte gan s๚il leis"
+
+#. must display the prompt
+msgid "No undo possible; continue anyway"
+msgstr "Nํ f้idir a cheal๚; lean ar aghaidh mar sin f้in"
-#: ../undo.c:627
-#, fuzzy, c-format
+#, c-format
msgid "E828: Cannot open undo file for writing: %s"
-msgstr "E212: Nํ f้idir comhad a oscailt chun scrํobh ann"
+msgstr "E828: Nํ f้idir comhad staire a oscailt le scrํobh ann: %s"
-#: ../undo.c:717
#, c-format
msgid "E825: Corrupted undo file (%s): %s"
-msgstr ""
+msgstr "E825: Comhad staire truaillithe (%s): %s"
-#: ../undo.c:1039
msgid "Cannot write undo file in any directory in 'undodir'"
-msgstr ""
+msgstr "Nํ f้idir comhad staire a shแbhแil in aon chomhadlann in 'undodir'"
-#: ../undo.c:1074
#, c-format
msgid "Will not overwrite with undo file, cannot read: %s"
-msgstr ""
+msgstr "Nํ forscrํobhfar le comhad staire, nํ f้idir ้ a l้amh: %s"
-#: ../undo.c:1092
#, c-format
msgid "Will not overwrite, this is not an undo file: %s"
-msgstr ""
+msgstr "Nํ forscrํobhfar ้, nํ comhad staire ้ seo: %s"
-#: ../undo.c:1108
msgid "Skipping undo file write, nothing to undo"
-msgstr ""
+msgstr "Nํ scrํobhfar an comhad staire, nํl aon stair ann"
-#: ../undo.c:1121
-#, fuzzy, c-format
+#, c-format
msgid "Writing undo file: %s"
-msgstr "Comhad viminfo \"%s\" แ scrํobh"
+msgstr "Comhad staire แ scrํobh: %s"
-#: ../undo.c:1213
-#, fuzzy, c-format
+#, c-format
msgid "E829: write error in undo file: %s"
-msgstr "E297: Earrแid sa scrํobh i gcomhad babhtแla"
+msgstr "E829: earrแid le linn scrํofa i gcomhad staire: %s"
-#: ../undo.c:1280
#, c-format
msgid "Not reading undo file, owner differs: %s"
-msgstr ""
+msgstr "Nํor l้adh an comhad staire; ๚in้ir difri๚il: %s"
-#: ../undo.c:1292
-#, fuzzy, c-format
+#, c-format
msgid "Reading undo file: %s"
-msgstr "Comhad focail %s แ l้amh ..."
+msgstr "Comhad staire แ l้amh: %s"
-#: ../undo.c:1299
-#, fuzzy, c-format
+#, c-format
msgid "E822: Cannot open undo file for reading: %s"
-msgstr "E195: Nํ f้idir an comhad viminfo a oscailt chun l้amh"
+msgstr "E822: Nํ f้idir an comhad staire a oscailt lena l้amh: %s"
-#: ../undo.c:1308
-#, fuzzy, c-format
+#, c-format
msgid "E823: Not an undo file: %s"
-msgstr "E753: Gan aimsi๚: %s"
+msgstr "E823: Nํ comhad staire ้: %s"
+
+#, c-format
+msgid "E832: Non-encrypted file has encrypted undo file: %s"
+msgstr "E832: Comhad neamhchriptithe le comhad staire criptithe: %s"
-#: ../undo.c:1313
-#, fuzzy, c-format
+#, c-format
+msgid "E826: Undo file decryption failed: %s"
+msgstr "E826: Nํorbh fh้idir an comhad staire a dhํchripti๚: %s"
+
+#, c-format
+msgid "E827: Undo file is encrypted: %s"
+msgstr "E827: Tแ an comhad staire criptithe: %s"
+
+#, c-format
msgid "E824: Incompatible undo file: %s"
-msgstr "E484: Nํ f้idir comhad %s a oscailt"
+msgstr "E824: Comhad staire neamh-chomhoiri๚nach: %s"
-#: ../undo.c:1328
msgid "File contents changed, cannot use undo info"
-msgstr ""
+msgstr "Athraํodh แbhar an chomhaid, nํ f้idir comhad staire a ๚sแid"
-#: ../undo.c:1497
-#, fuzzy, c-format
+#, c-format
msgid "Finished reading undo file %s"
-msgstr "deireadh ag foinsi๚ %s"
+msgstr "Comhad staire %s l้ite"
-#: ../undo.c:1586 ../undo.c:1812
msgid "Already at oldest change"
msgstr "Ag an athr๚ is sine cheana"
-#: ../undo.c:1597 ../undo.c:1814
msgid "Already at newest change"
msgstr "Ag an athr๚ is nuaํ cheana"
-#: ../undo.c:1806
-#, fuzzy, c-format
-msgid "E830: Undo number %<PRId64> not found"
-msgstr "Nํor aimsํodh ceal๚ uimhir a %<PRId64>"
+#, c-format
+msgid "E830: Undo number %ld not found"
+msgstr "E830: Mํr staire %ld gan aimsi๚"
-#: ../undo.c:1979
msgid "E438: u_undo: line numbers wrong"
msgstr "E438: u_undo: lํne-uimhreacha mํchearta"
-#: ../undo.c:2183
msgid "more line"
msgstr "lํne eile"
-#: ../undo.c:2185
msgid "more lines"
msgstr "lํne eile"
-#: ../undo.c:2187
msgid "line less"
msgstr "lํne nํos l๚"
-#: ../undo.c:2189
msgid "fewer lines"
msgstr "lํne nํos l๚"
-#: ../undo.c:2193
msgid "change"
msgstr "athr๚"
-#: ../undo.c:2195
msgid "changes"
msgstr "athr๚"
-#: ../undo.c:2225
#, c-format
-msgid "%<PRId64> %s; %s #%<PRId64> %s"
-msgstr "%<PRId64> %s; %s #%<PRId64> %s"
+msgid "%ld %s; %s #%ld %s"
+msgstr "%ld %s; %s #%ld %s"
-#: ../undo.c:2228
msgid "before"
msgstr "roimh"
-#: ../undo.c:2228
msgid "after"
msgstr "tar ้is"
-#: ../undo.c:2325
msgid "Nothing to undo"
msgstr "Nํl faic le ceal๚"
-#: ../undo.c:2330
msgid "number changes when saved"
-msgstr ""
+msgstr "athraํonn an uimhir ag am sแbhแla"
-#: ../undo.c:2360
#, c-format
-msgid "%<PRId64> seconds ago"
-msgstr "%<PRId64> soicind ๓ shin"
+msgid "%ld seconds ago"
+msgstr "%ld soicind ๓ shin"
-#: ../undo.c:2372
msgid "E790: undojoin is not allowed after undo"
msgstr "E790: nํ cheadaํtear \"undojoin\" tar ้is \"undo\""
-#: ../undo.c:2466
msgid "E439: undo list corrupt"
msgstr "E439: tแ an liosta cealaithe truaillithe"
-#: ../undo.c:2495
msgid "E440: undo line missing"
msgstr "E440: lํne chealaithe ar iarraidh"
-#: ../version.c:600
+#, c-format
+msgid "E122: Function %s already exists, add ! to replace it"
+msgstr "E122: Tแ feidhm %s ann cheana, cuir ! leis an ord๚ chun ้ a asแiti๚"
+
+msgid "E717: Dictionary entry already exists"
+msgstr "E717: Tแ an iontrแil focl๓ra seo ann cheana"
+
+msgid "E718: Funcref required"
+msgstr "E718: Tแ gแ le Funcref"
+
+#, c-format
+msgid "E130: Unknown function: %s"
+msgstr "E130: Feidhm anaithnid: %s"
+
+#, c-format
+msgid "E125: Illegal argument: %s"
+msgstr "E125: Arg๓int neamhcheadaithe: %s"
+
+#, c-format
+msgid "E853: Duplicate argument name: %s"
+msgstr "E853: Arg๓int dh๚bailte: %s"
+
+#, c-format
+msgid "E740: Too many arguments for function %s"
+msgstr "E740: An iomarca arg๓intํ d'fheidhm %s"
+
+#, c-format
+msgid "E116: Invalid arguments for function %s"
+msgstr "E116: Arg๓intํ neamhbhailํ d'fheidhm %s"
+
+msgid "E132: Function call depth is higher than 'maxfuncdepth'"
+msgstr "E132: Doimhneacht na nglaonna nํos m๓ nแ 'maxfuncdepth'"
+
+#, c-format
+msgid "calling %s"
+msgstr "%s แ glao"
+
+#, c-format
+msgid "%s aborted"
+msgstr "%s tobscortha"
+
+#, c-format
+msgid "%s returning #%ld"
+msgstr "%s ag aisfhilleadh #%ld"
+
+#, c-format
+msgid "%s returning %s"
+msgstr "%s ag aisfhilleadh %s"
+
+msgid "E699: Too many arguments"
+msgstr "E699: An iomarca arg๓intํ"
+
+#, c-format
+msgid "E117: Unknown function: %s"
+msgstr "E117: Feidhm anaithnid: %s"
+
+#, c-format
+msgid "E933: Function was deleted: %s"
+msgstr "E933: Scriosadh an fheidhm: %s"
+
+#, c-format
+msgid "E119: Not enough arguments for function: %s"
+msgstr "E119: Nํl go leor feidhmeanna d'fheidhm: %s"
+
+#, c-format
+msgid "E120: Using <SID> not in a script context: %s"
+msgstr "E120: <SID> แ ๚sแid ach gan a bheith i gcomhth้acs scripte: %s"
+
+#, c-format
+msgid "E725: Calling dict function without Dictionary: %s"
+msgstr "E725: Feidhm 'dict' แ ghlao gan Focl๓ir: %s"
+
+msgid "E129: Function name required"
+msgstr "E129: Tแ gแ le hainm feidhme"
+
+#, c-format
+msgid "E128: Function name must start with a capital or \"s:\": %s"
+msgstr ""
+"E128: Caithfidh ceannlitir a bheith ar dt๚s ainm feidhme, n๓ \"s:\": %s"
+
+#, c-format
+msgid "E884: Function name cannot contain a colon: %s"
+msgstr "E884: Nํ cheadaํtear idirstad in ainm feidhme: %s"
+
+#, c-format
+msgid "E123: Undefined function: %s"
+msgstr "E123: Feidhm gan sainmhํni๚: %s"
+
+#, c-format
+msgid "E124: Missing '(': %s"
+msgstr "E124: '(' ar iarraidh: %s"
+
+msgid "E862: Cannot use g: here"
+msgstr "E862: Nํ f้idir g: a ๚sแid anseo"
+
+#, c-format
+msgid "E932: Closure function should not be at top level: %s"
+msgstr "E932: Nํ m๓r don chlabhs๚r a bheith ag an mbarrleibh้al: %s"
+
+msgid "E126: Missing :endfunction"
+msgstr "E126: :endfunction ar iarraidh"
+
+#, c-format
+msgid "W22: Text found after :endfunction: %s"
+msgstr "W22: Aimsํodh t้acs tar ้is :endfunction: %s"
+
+#, c-format
+msgid "E707: Function name conflicts with variable: %s"
+msgstr "E707: Tagann ainm na feidhme salach ar athr๓g: %s"
+
+#, c-format
+msgid "E127: Cannot redefine function %s: It is in use"
+msgstr ""
+"E127: Nํ f้idir sainmhํni๚ nua a dh้anamh ar fheidhm %s: In ๚sแid cheana"
+
+#, c-format
+msgid "E746: Function name does not match script file name: %s"
+msgstr ""
+"E746: Nํl ainm na feidhme comhoiri๚nach le hainm comhaid na scripte: %s"
+
+#, c-format
+msgid "E131: Cannot delete function %s: It is in use"
+msgstr "E131: Nํ f้idir feidhm %s a scriosadh: Tแ s้ in ๚sแid faoi lแthair"
+
+msgid "E133: :return not inside a function"
+msgstr "E133: Caithfidh :return a bheith isteach i bhfeidhm"
+
+#, c-format
+msgid "E107: Missing parentheses: %s"
+msgstr "E107: L๚ibํnํ ar iarraidh: %s"
+
+msgid ""
+"\n"
+"MS-Windows 64-bit GUI version"
+msgstr ""
+"\n"
+"Leagan GUI 64 giotแn MS-Windows"
+
+msgid ""
+"\n"
+"MS-Windows 32-bit GUI version"
+msgstr ""
+"\n"
+"Leagan GUI 32 giotแn MS-Windows"
+
+msgid " with OLE support"
+msgstr " le tacaํocht OLE"
+
+msgid ""
+"\n"
+"MS-Windows 64-bit console version"
+msgstr ""
+"\n"
+"Leagan cons๓il 64 giotแn MS-Windows"
+
+msgid ""
+"\n"
+"MS-Windows 32-bit console version"
+msgstr ""
+"\n"
+"Leagan cons๓il 32 giotแn MS-Windows"
+
+msgid ""
+"\n"
+"MacOS X (unix) version"
+msgstr ""
+"\n"
+"Leagan MacOS X (unix)"
+
+msgid ""
+"\n"
+"MacOS X version"
+msgstr ""
+"\n"
+"Leagan MacOS X"
+
+msgid ""
+"\n"
+"MacOS version"
+msgstr ""
+"\n"
+"Leagan MacOS"
+
+msgid ""
+"\n"
+"OpenVMS version"
+msgstr ""
+"\n"
+"Leagan OpenVMS"
+
msgid ""
"\n"
"Included patches: "
@@ -6301,7 +6151,6 @@ msgstr ""
"\n"
"Paistํ san แireamh: "
-#: ../version.c:627
msgid ""
"\n"
"Extra patches: "
@@ -6309,11 +6158,9 @@ msgstr ""
"\n"
"Paistํ sa bhreis: "
-#: ../version.c:639 ../version.c:864
msgid "Modified by "
msgstr "Mionathraithe ag "
-#: ../version.c:646
msgid ""
"\n"
"Compiled "
@@ -6322,11 +6169,9 @@ msgstr ""
"Tiomsaithe "
# with "Tiomsaithe"
-#: ../version.c:649
msgid "by "
msgstr "ag "
-#: ../version.c:660
msgid ""
"\n"
"Huge version "
@@ -6334,656 +6179,974 @@ msgstr ""
"\n"
"Leagan ollmh๓r "
-#: ../version.c:661
+msgid ""
+"\n"
+"Big version "
+msgstr ""
+"\n"
+"Leagan m๓r "
+
+msgid ""
+"\n"
+"Normal version "
+msgstr ""
+"\n"
+"Leagan coitianta "
+
+msgid ""
+"\n"
+"Small version "
+msgstr ""
+"\n"
+"Leagan beag "
+
+msgid ""
+"\n"
+"Tiny version "
+msgstr ""
+"\n"
+"Leagan beag bํdeach "
+
msgid "without GUI."
msgstr "gan GUI."
-#: ../version.c:662
+msgid "with GTK3 GUI."
+msgstr "le GUI GTK3."
+
+msgid "with GTK2-GNOME GUI."
+msgstr "le GUI GTK2-GNOME."
+
+msgid "with GTK2 GUI."
+msgstr "le GUI GTK2."
+
+msgid "with X11-Motif GUI."
+msgstr "le GUI X11-Motif."
+
+msgid "with X11-neXtaw GUI."
+msgstr "le GUI X11-neXtaw."
+
+msgid "with X11-Athena GUI."
+msgstr "le GUI X11-Athena."
+
+msgid "with Photon GUI."
+msgstr "le GUI Photon."
+
+msgid "with GUI."
+msgstr "le GUI."
+
+msgid "with Carbon GUI."
+msgstr "le GUI Carbon."
+
+msgid "with Cocoa GUI."
+msgstr "le GUI Cocoa."
+
+msgid "with (classic) GUI."
+msgstr "le GUI (clasaiceach)."
+
msgid " Features included (+) or not (-):\n"
msgstr " Gn้ithe san แireamh (+) n๓ nach bhfuil (-):\n"
-#: ../version.c:667
msgid " system vimrc file: \""
msgstr " comhad vimrc an ch๓rais: \""
-#: ../version.c:672
msgid " user vimrc file: \""
msgstr " comhad vimrc ๚sแideora: \""
-#: ../version.c:677
msgid " 2nd user vimrc file: \""
msgstr " dara comhad vimrc ๚sแideora: \""
-#: ../version.c:682
msgid " 3rd user vimrc file: \""
msgstr " trํ๚ comhad vimrc ๚sแideora: \""
-#: ../version.c:687
msgid " user exrc file: \""
msgstr " comhad exrc ๚sแideora: \""
-#: ../version.c:692
msgid " 2nd user exrc file: \""
msgstr " dara comhad ๚sแideora exrc: \""
-#: ../version.c:699
+msgid " system gvimrc file: \""
+msgstr " comhad gvimrc c๓rais: \""
+
+msgid " user gvimrc file: \""
+msgstr " comhad gvimrc ๚sแideora: \""
+
+msgid "2nd user gvimrc file: \""
+msgstr "dara comhad gvimrc ๚sแideora: \""
+
+msgid "3rd user gvimrc file: \""
+msgstr "trํ๚ comhad gvimrc ๚sแideora: \""
+
+msgid " defaults file: \""
+msgstr " comhad na r้amhshocruithe: \""
+
+msgid " system menu file: \""
+msgstr " comhad roghchlแir an ch๓rais: \""
+
msgid " fall-back for $VIM: \""
msgstr " rogha thแnaisteach do $VIM: \""
-#: ../version.c:705
msgid " f-b for $VIMRUNTIME: \""
msgstr " f-b do $VIMRUNTIME: \""
-#: ../version.c:709
msgid "Compilation: "
msgstr "Tioms๚: "
-#: ../version.c:712
+msgid "Compiler: "
+msgstr "Tiomsaitheoir: "
+
msgid "Linking: "
msgstr "Nascแil: "
-#: ../version.c:717
msgid " DEBUG BUILD"
msgstr " LEAGAN DอFHABHTAITHE"
-#: ../version.c:767
msgid "VIM - Vi IMproved"
msgstr "VIM - Vi IMproved"
-#: ../version.c:769
msgid "version "
msgstr "leagan "
-#: ../version.c:770
msgid "by Bram Moolenaar et al."
msgstr "le Bram Moolenaar et al."
-#: ../version.c:774
msgid "Vim is open source and freely distributable"
msgstr "Is saorbhogearra ้ Vim"
-#: ../version.c:776
msgid "Help poor children in Uganda!"
msgstr "Tabhair cabhair do phแistํ bochta in Uganda!"
-#: ../version.c:777
msgid "type :help iccf<Enter> for information "
msgstr "cl๓scrํobh :help iccf<Enter> chun eolas a fhแil "
-#: ../version.c:779
msgid "type :q<Enter> to exit "
msgstr "cl๓scrํobh :q<Enter> chun scoir "
-#: ../version.c:780
msgid "type :help<Enter> or <F1> for on-line help"
msgstr "cl๓scrํobh :help<Enter> n๓ <F1> le haghaidh cabhrach ar lํne"
-#: ../version.c:781
-msgid "type :help version7<Enter> for version info"
-msgstr "cl๓scrํobh :help version7<Enter> le haghaidh eolais faoin leagan"
+msgid "type :help version8<Enter> for version info"
+msgstr "cl๓scrํobh :help version8<Enter> le haghaidh eolais faoin leagan"
-#: ../version.c:784
msgid "Running in Vi compatible mode"
msgstr "Sa mh๓d comhoiri๚nachta Vi"
-#: ../version.c:785
msgid "type :set nocp<Enter> for Vim defaults"
msgstr ""
"cl๓scrํobh :set nocp<Enter> chun na r้amhshocruithe Vim a thaispeแint"
-#: ../version.c:786
msgid "type :help cp-default<Enter> for info on this"
msgstr ""
"cl๓scrํobh :help cp-default<Enter> chun nํos m๓ eolas faoi seo a fhแil"
-#: ../version.c:827
+# don't see where to localize "Help->Orphans"? --kps
+msgid "menu Help->Orphans for information "
+msgstr "roghchlแr Help->Orphans chun eolas a fhแil "
+
+msgid "Running modeless, typed text is inserted"
+msgstr "ม rith gan mh๓id, ag ionsแ an t้acs atแ iontrแilte"
+
+# same problem --kps
+msgid "menu Edit->Global Settings->Toggle Insert Mode "
+msgstr "roghchlแr Edit->Global Settings->Toggle Insert Mode "
+
+msgid " for two modes "
+msgstr " do dhแ mh๓d "
+
+# same problem --kps
+msgid "menu Edit->Global Settings->Toggle Vi Compatible"
+msgstr "roghchlแr Edit->Global Settings->Toggle Vi Compatible"
+
+msgid " for Vim defaults "
+msgstr " le haghaidh r้amhshocruithe Vim "
+
msgid "Sponsor Vim development!"
msgstr "Bํ i d'urraitheoir Vim!"
-#: ../version.c:828
msgid "Become a registered Vim user!"
msgstr "Bํ i d'๚sแideoir clแraithe Vim!"
-#: ../version.c:831
msgid "type :help sponsor<Enter> for information "
msgstr "cl๓scrํobh :help sponsor<Enter> chun eolas a fhแil "
-#: ../version.c:832
msgid "type :help register<Enter> for information "
msgstr "cl๓scrํobh :help register<Enter> chun eolas a fhแil "
-#: ../version.c:834
msgid "menu Help->Sponsor/Register for information "
msgstr "roghchlแr Help->Sponsor/Register chun eolas a fhแil "
-#: ../window.c:119
msgid "Already only one window"
msgstr "Nํl ach aon fhuinneog amhแin ann cheana"
-#: ../window.c:224
msgid "E441: There is no preview window"
msgstr "E441: Nํl aon fhuinneog r้amhamhairc ann"
-#: ../window.c:559
msgid "E442: Can't split topleft and botright at the same time"
msgstr "E442: Nํ f้idir a scoilteadh topleft agus botright san am c้anna"
-#: ../window.c:1228
msgid "E443: Cannot rotate when another window is split"
msgstr "E443: Nํ f้idir rothl๚ nuair atแ fuinneog eile scoilte"
-#: ../window.c:1803
msgid "E444: Cannot close last window"
msgstr "E444: Nํ f้idir an fhuinneog dheiridh a dh๚nadh"
-#: ../window.c:1810
msgid "E813: Cannot close autocmd window"
msgstr "E813: Nํ f้idir fuinneog autocmd a dh๚nadh"
-#: ../window.c:1814
msgid "E814: Cannot close window, only autocmd window would remain"
msgstr ""
"E814: Nํ f้idir an fhuinneog a dh๚nadh, nํ bheadh ach fuinneog autocmd fแgtha"
-#: ../window.c:2717
msgid "E445: Other window contains changes"
msgstr "E445: Tแ athruithe ann san fhuinneog eile"
-#: ../window.c:4805
msgid "E446: No file name under cursor"
msgstr "E446: Nํl ainm comhaid faoin ch๚rs๓ir"
-#~ msgid "Patch file"
-#~ msgstr "Comhad paiste"
+#, c-format
+msgid "E447: Can't find file \"%s\" in path"
+msgstr "E447: Nํl aon fhแil ar chomhad \"%s\" sa chonair"
-#~ msgid ""
-#~ "&OK\n"
-#~ "&Cancel"
-#~ msgstr ""
-#~ "&OK\n"
-#~ "&Cealaigh"
+#, c-format
+msgid "E799: Invalid ID: %ld (must be greater than or equal to 1)"
+msgstr "E799: Aitheantas neamhbhailํ: %ld (nํ m๓r d๓ a bheith >= 1)"
-#~ msgid "E240: No connection to Vim server"
-#~ msgstr "E240: Nํl aon nasc le freastalaํ Vim"
+#, c-format
+msgid "E801: ID already taken: %ld"
+msgstr "E801: Aitheantas in ๚sแid cheana: %ld"
-#~ msgid "E241: Unable to send to %s"
-#~ msgstr "E241: Nํ f้idir aon rud a sheoladh chuig %s"
+msgid "List or number required"
+msgstr "Tแ gแ le liosta n๓ uimhir"
-#~ msgid "E277: Unable to read a server reply"
-#~ msgstr "E277: Nํ f้idir freagra ๓n fhreastalaํ a l้amh"
+#, c-format
+msgid "E802: Invalid ID: %ld (must be greater than or equal to 1)"
+msgstr "E802: Aitheantas neamhbhailํ: %ld (nํ m๓r d๓ a bheith >= 1)"
-#~ msgid "E258: Unable to send to client"
-#~ msgstr "E258: Nํ f้idir aon rud a sheoladh chuig an chliant"
+#, c-format
+msgid "E803: ID not found: %ld"
+msgstr "E803: Aitheantas gan aimsi๚: %ld"
-#~ msgid "Save As"
-#~ msgstr "Sแbhแil Mar"
+#, c-format
+msgid "E370: Could not load library %s"
+msgstr "E370: Nํorbh fh้idir an leabharlann %s a oscailt"
-#~ msgid "Edit File"
-#~ msgstr "Cuir Comhad in Eagar"
+msgid "Sorry, this command is disabled: the Perl library could not be loaded."
+msgstr ""
+"Tแ br๓n orm, nํl an t-ord๚ seo le fแil: nํorbh fh้idir an leabharlann Perl a "
+"lucht๚."
-#~ msgid " (NOT FOUND)"
-#~ msgstr " (AR IARRAIDH)"
+msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
+msgstr "E299: Nํ cheadaํtear luachแil Perl i mbosca gainimh gan an mod๚l Safe"
-#~ msgid "Source Vim script"
-#~ msgstr "Foinsigh script Vim"
+msgid "Edit with &multiple Vims"
+msgstr "Cuir in eagar le Vimeanna io&mad๚la"
-#~ msgid "Edit File in new window"
-#~ msgstr "Cuir comhad in eagar i bhfuinneog nua"
+msgid "Edit with single &Vim"
+msgstr "Cuir in eagar le &Vim aonair"
-#~ msgid "Append File"
-#~ msgstr "Cuir Comhad i nDeireadh"
+msgid "Diff with Vim"
+msgstr "Diff le Vim"
-#~ msgid "Window position: X %d, Y %d"
-#~ msgstr "Ionad na fuinneoige: X %d, Y %d"
+msgid "Edit with &Vim"
+msgstr "Cuir in Eagar le &Vim"
-#~ msgid "Save Redirection"
-#~ msgstr "Sแbhแil Atreor๚"
+#. Now concatenate
+msgid "Edit with existing Vim - "
+msgstr "Cuir in Eagar le Vim beo - "
-#~ msgid "Save View"
-#~ msgstr "Sแbhแil an tAmharc"
+msgid "Edits the selected file(s) with Vim"
+msgstr "Cuir an comhad roghnaithe in eagar le Vim"
-#~ msgid "Save Session"
-#~ msgstr "Sแbhแil an Seisi๚n"
+msgid "Error creating process: Check if gvim is in your path!"
+msgstr ""
+"Earrแid agus pr๓iseas แ chruth๚: Deimhnigh go bhfuil gvim i do chonair!"
-#~ msgid "Save Setup"
-#~ msgstr "Sแbhแil an Socr๚"
+msgid "gvimext.dll error"
+msgstr "earrแid gvimext.dll"
-#~ msgid "E809: #< is not available without the +eval feature"
-#~ msgstr "E809: nํl #< ar fแil gan ghn้ +eval"
+msgid "Path length too long!"
+msgstr "Conair r๓fhada!"
-#~ msgid "E196: No digraphs in this version"
-#~ msgstr "E196: Nํ cheadaํtear d้ghraif sa leagan seo"
+msgid "--No lines in buffer--"
+msgstr "--Tแ an maolแn folamh--"
-#~ msgid "is a device (disabled with 'opendevice' option)"
-#~ msgstr "is gl้as ้ seo (dํchumasaithe le rogha 'opendevice')"
+#.
+#. * The error messages that can be shared are included here.
+#. * Excluded are errors that are only used once and debugging messages.
+#.
+msgid "E470: Command aborted"
+msgstr "E470: Ord๚ tobscortha"
-#~ msgid "Reading from stdin..."
-#~ msgstr "Ag l้amh ๓n ionchur caighdeแnach..."
+msgid "E471: Argument required"
+msgstr "E471: Tแ gแ le harg๓int"
-#~ msgid "[crypted]"
-#~ msgstr "[criptithe]"
+msgid "E10: \\ should be followed by /, ? or &"
+msgstr "E10: Ba ch๓ir /, ? n๓ & a chur i ndiaidh \\"
-#~ msgid "NetBeans disallows writes of unmodified buffers"
-#~ msgstr "Nํ cheadaํonn NetBeans maolแin gan athr๚ a bheith scrํofa"
+msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
+msgstr ""
+"E11: Neamhbhailํ i bhfuinneog lํne na n-orduithe; <CR>=rith, CTRL-C=scoir"
-#~ msgid "Partial writes disallowed for NetBeans buffers"
-#~ msgstr "Nํ cheadaํtear maolแin NetBeans a bheith scrํofa go neamhiomlแn"
+msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
+msgstr ""
+"E12: Nํ cheadaํtear ord๚ ๓ exrc/vimrc sa chomhadlann reatha nแ ๓ chuardach "
+"clibe"
-#~ msgid "writing to device disabled with 'opendevice' option"
-#~ msgstr "dํchumasaํodh scrํobh chuig gl้as le rogha 'opendevice'"
+msgid "E171: Missing :endif"
+msgstr "E171: :endif ar iarraidh"
-#~ msgid "E460: The resource fork would be lost (add ! to override)"
-#~ msgstr "E460: Chaillfํ an forc acmhainne (cuir ! leis an ord๚ chun sแr๚)"
+msgid "E600: Missing :endtry"
+msgstr "E600: :endtry ar iarraidh"
-#~ msgid "E229: Cannot start the GUI"
-#~ msgstr "E229: Nํ f้idir an GUI a chur ag obair"
+msgid "E170: Missing :endwhile"
+msgstr "E170: :endwhile ar iarraidh"
-#~ msgid "E230: Cannot read from \"%s\""
-#~ msgstr "E230: Nํ f้idir l้amh ๓ \"%s\""
+msgid "E170: Missing :endfor"
+msgstr "E170: :endfor ar iarraidh"
-#~ msgid "E665: Cannot start GUI, no valid font found"
-#~ msgstr ""
-#~ "E665: Nํ f้idir an GUI a chur ag obair, nํl aon chl๓fhoireann bhailํ ann"
+msgid "E588: :endwhile without :while"
+msgstr "E588: :endwhile gan :while"
-#~ msgid "E231: 'guifontwide' invalid"
-#~ msgstr "E231: 'guifontwide' neamhbhailํ"
+msgid "E588: :endfor without :for"
+msgstr "E588: :endfor gan :for"
-#~ msgid "E599: Value of 'imactivatekey' is invalid"
-#~ msgstr "E599: Luach neamhbhailํ ar 'imactivatekey'"
+msgid "E13: File exists (add ! to override)"
+msgstr "E13: Tแ comhad ann cheana (cuir ! leis an ord๚ chun forscrํobh)"
-#~ msgid "E254: Cannot allocate color %s"
-#~ msgstr "E254: Nํ f้idir dath %s a dhแileadh"
+msgid "E472: Command failed"
+msgstr "E472: Theip ar ord๚"
-#~ msgid "No match at cursor, finding next"
-#~ msgstr "Nํl a leith้id ag an ch๚rs๓ir, ag cuardach ar an ch้ad cheann eile"
+#, c-format
+msgid "E234: Unknown fontset: %s"
+msgstr "E234: Tacar cl๓ anaithnid: %s"
-#~ msgid "<cannot open> "
-#~ msgstr "<nํ f้idir a oscailt> "
+#, c-format
+msgid "E235: Unknown font: %s"
+msgstr "E235: Cl๓fhoireann anaithnid: %s"
-#~ msgid "E616: vim_SelFile: can't get font %s"
-#~ msgstr "E616: vim_SelFile: nํl aon fhแil ar an chl๓fhoireann %s"
+#, c-format
+msgid "E236: Font \"%s\" is not fixed-width"
+msgstr "E236: Nํ cl๓ aonleithid ้ \"%s\""
-#~ msgid "E614: vim_SelFile: can't return to current directory"
-#~ msgstr ""
-#~ "E614: vim_SelFile: nํ f้idir dul ar ais go dtํ an chomhadlann reatha"
+msgid "E473: Internal error"
+msgstr "E473: Earrแid inmheแnach"
-#~ msgid "Pathname:"
-#~ msgstr "Conair:"
+#, c-format
+msgid "E685: Internal error: %s"
+msgstr "E685: Earrแid inmheแnach: %s"
-#~ msgid "E615: vim_SelFile: can't get current directory"
-#~ msgstr "E615: vim_SelFile: nํl an chomhadlann reatha ar fแil"
+msgid "Interrupted"
+msgstr "Idirbhriste"
-#~ msgid "OK"
-#~ msgstr "OK"
+msgid "E14: Invalid address"
+msgstr "E14: Drochsheoladh"
-#~ msgid "Cancel"
-#~ msgstr "Cealaigh"
+msgid "E474: Invalid argument"
+msgstr "E474: Arg๓int neamhbhailํ"
-#~ msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
-#~ msgstr ""
-#~ "Giuirl้id Scrollbharra: Nํ f้idir c้imseata an mhapa picteilํnํ a fhแil."
+#, c-format
+msgid "E475: Invalid argument: %s"
+msgstr "E475: Arg๓int neamhbhailํ: %s"
-#~ msgid "Vim dialog"
-#~ msgstr "Dial๓g Vim"
+#, c-format
+msgid "E15: Invalid expression: %s"
+msgstr "E15: Slonn neamhbhailํ: %s"
-#~ msgid "E232: Cannot create BalloonEval with both message and callback"
-#~ msgstr ""
-#~ "E232: Nํ f้idir BalloonEval a chruth๚ le teachtaireacht agus aisghlaoch "
-#~ "araon"
+msgid "E16: Invalid range"
+msgstr "E16: Raon neamhbhailํ"
-#~ msgid "Vim dialog..."
-#~ msgstr "Dial๓g Vim..."
+msgid "E476: Invalid command"
+msgstr "E476: Ord๚ neamhbhailํ"
-#~ msgid "Input _Methods"
-#~ msgstr "_Modhanna ionchuir"
+#, c-format
+msgid "E17: \"%s\" is a directory"
+msgstr "E17: is comhadlann \"%s\""
-# in OLT --KPS
-#~ msgid "VIM - Search and Replace..."
-#~ msgstr "VIM - Cuardaigh agus Athchuir..."
+#, c-format
+msgid "E364: Library call failed for \"%s()\""
+msgstr "E364: Theip ar ghlao leabharlainne \"%s()\""
-#~ msgid "VIM - Search..."
-#~ msgstr "VIM - Cuardaigh..."
+#, c-format
+msgid "E448: Could not load library function %s"
+msgstr "E448: Nํ f้idir feidhm %s leabharlainne a lucht๚"
-#~ msgid "Find what:"
-#~ msgstr "Aimsigh:"
+msgid "E19: Mark has invalid line number"
+msgstr "E19: Tแ lํne-uimhir neamhbhailํ ag an mharc"
-#~ msgid "Replace with:"
-#~ msgstr "Le cur in ionad:"
+msgid "E20: Mark not set"
+msgstr "E20: Marc gan socr๚"
-#~ msgid "Match whole word only"
-#~ msgstr "Focal iomlแn amhแin"
+msgid "E21: Cannot make changes, 'modifiable' is off"
+msgstr ""
+"E21: Nํ f้idir athruithe a chur i bhfeidhm, nํl an bhratach 'modifiable' "
+"socraithe"
-#~ msgid "Match case"
-#~ msgstr "Meaitseแil an cแs"
+msgid "E22: Scripts nested too deep"
+msgstr "E22: scripteanna neadaithe r๓dhomhain"
-#~ msgid "Direction"
-#~ msgstr "Treo"
+msgid "E23: No alternate file"
+msgstr "E23: Nํl aon chomhad malartach"
-#~ msgid "Up"
-#~ msgstr "Suas"
+msgid "E24: No such abbreviation"
+msgstr "E24: Nํl a leith้id de ghiorr๚chแn ann"
-#~ msgid "Down"
-#~ msgstr "Sํos"
+msgid "E477: No ! allowed"
+msgstr "E477: Nํ cheadaํtear !"
-#~ msgid "Find Next"
-#~ msgstr "An Ch้ad Cheann Eile"
+msgid "E25: GUI cannot be used: Not enabled at compile time"
+msgstr "E25: Nํ f้idir an GUI a ๚sแid: Nํor cumasaํodh ้ ag am tiomsaithe"
-#~ msgid "Replace"
-#~ msgstr "Ionadaigh"
+msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
+msgstr ""
+"E26: Nํl tacaํocht Eabhraise ar fแil: Nํor cumasaํodh ้ ag am tiomsaithe\n"
-#~ msgid "Replace All"
-#~ msgstr "Ionadaigh Uile"
+msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
+msgstr ""
+"E27: Nํl tacaํocht Pheirsise ar fแil: Nํor cumasaํodh ้ ag am tiomsaithe\n"
-#~ msgid "Vim: Received \"die\" request from session manager\n"
-#~ msgstr "Vim: Fuarthas iarratas \"die\" ๓ bhainisteoir an tseisi๚in\n"
+msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
+msgstr ""
+"E800: Nํl tacaํocht Araibise ar fแil: Nํor cumasaํodh ้ ag am tiomsaithe\n"
-#~ msgid "Close"
-#~ msgstr "D๚n"
+#, c-format
+msgid "E28: No such highlight group name: %s"
+msgstr "E28: Nํl a leith้id d'ainm gr๚pa aibhsithe: %s"
-#~ msgid "New tab"
-#~ msgstr "Cluaisํn nua"
+msgid "E29: No inserted text yet"
+msgstr "E29: Nํl aon t้acs ionsแite go dtํ seo"
-#~ msgid "Open Tab..."
-#~ msgstr "Oscail Cluaisํn..."
+msgid "E30: No previous command line"
+msgstr "E30: Nํl aon lํne na n-orduithe roimhe seo"
-#~ msgid "Vim: Main window unexpectedly destroyed\n"
-#~ msgstr "Vim: Milleadh an prํomhfhuinneog gan choinne\n"
+msgid "E31: No such mapping"
+msgstr "E31: Nํl a leith้id de mhapแil"
-#~ msgid "Font Selection"
-#~ msgstr "Roghn๚ Cl๓"
+msgid "E479: No match"
+msgstr "E479: Nํl aon rud comhoiri๚nach ann"
-#~ msgid "&Filter"
-#~ msgstr "&Scagaire"
+#, c-format
+msgid "E480: No match: %s"
+msgstr "E480: Nํl aon rud comhoiri๚nach ann: %s"
-#~ msgid "&Cancel"
-#~ msgstr "&Cealaigh"
+msgid "E32: No file name"
+msgstr "E32: Nํl aon ainm comhaid"
-#~ msgid "Directories"
-#~ msgstr "Comhadlanna"
+msgid "E33: No previous substitute regular expression"
+msgstr "E33: Nํl aon slonn ionadaํochta roimhe seo"
-#~ msgid "Filter"
-#~ msgstr "Scagaire"
+msgid "E34: No previous command"
+msgstr "E34: Nํl aon ord๚ roimhe seo"
-#~ msgid "&Help"
-#~ msgstr "&Cabhair"
+msgid "E35: No previous regular expression"
+msgstr "E35: Nํl aon slonn ionadaํochta roimhe seo"
-#~ msgid "Files"
-#~ msgstr "Comhaid"
+msgid "E481: No range allowed"
+msgstr "E481: Nํ cheadaํtear raon"
-#~ msgid "&OK"
-#~ msgstr "&OK"
+msgid "E36: Not enough room"
+msgstr "E36: Nํl slํ a dh๓thain ann"
-#~ msgid "Selection"
-#~ msgstr "Roghn๚"
+#, c-format
+msgid "E247: no registered server named \"%s\""
+msgstr "E247: nํl aon fhreastalaํ clแraithe leis an ainm \"%s\""
-#~ msgid "Find &Next"
-#~ msgstr "An Ch้ad Chea&nn Eile"
+#, c-format
+msgid "E482: Can't create file %s"
+msgstr "E482: Nํ f้idir comhad %s a chruth๚"
-#~ msgid "&Replace"
-#~ msgstr "&Ionadaigh"
+msgid "E483: Can't get temp file name"
+msgstr "E483: Nํl aon fhแil ar ainm comhaid sealadach"
-#~ msgid "Replace &All"
-#~ msgstr "Ionadaigh &Uile"
+#, c-format
+msgid "E484: Can't open file %s"
+msgstr "E484: Nํ f้idir comhad %s a oscailt"
-#~ msgid "&Undo"
-#~ msgstr "&Cealaigh"
+#, c-format
+msgid "E485: Can't read file %s"
+msgstr "E485: Nํ f้idir comhad %s a l้amh"
-#~ msgid "E671: Cannot find window title \"%s\""
-#~ msgstr "E671: Nํ f้idir teideal na fuinneoige \"%s\" a aimsi๚"
+msgid "E37: No write since last change (add ! to override)"
+msgstr "E37: Tแ athruithe ann gan sแbhแil (cuir ! leis an ord๚ chun sแr๚)"
-#~ msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
-#~ msgstr "E243: Arg๓int gan tacaํocht: \"-%s\"; Bain ๚sแid as an leagan OLE."
+msgid "E37: No write since last change"
+msgstr "E37: Gan scrํobh ๓n athr๚ is d้anaํ"
-#~ msgid "E672: Unable to open window inside MDI application"
-#~ msgstr "E672: Nํ f้idir fuinneog a oscailt isteach i bhfeidhmchlแr MDI"
+msgid "E38: Null argument"
+msgstr "E38: Arg๓int nialasach"
-#~ msgid "Close tab"
-#~ msgstr "D๚n cluaisํn"
+msgid "E39: Number expected"
+msgstr "E39: Ag s๚il le huimhir"
-#~ msgid "Open tab..."
-#~ msgstr "Oscail cluaisํn..."
+#, c-format
+msgid "E40: Can't open errorfile %s"
+msgstr "E40: Nํ f้idir an comhad earrแide %s a oscailt"
-#~ msgid "Find string (use '\\\\' to find a '\\')"
-#~ msgstr "Aimsigh teaghrแn (bain ๚sแid as '\\\\' chun '\\' a aimsi๚)"
+msgid "E233: cannot open display"
+msgstr "E233: nํ f้idir an scแileแn a oscailt"
-#~ msgid "Find & Replace (use '\\\\' to find a '\\')"
-#~ msgstr "Aimsigh & Athchuir (๚sแid '\\\\' chun '\\' a aimsi๚)"
+msgid "E41: Out of memory!"
+msgstr "E41: Cuimhne ํdithe!"
-#~ msgid "Not Used"
-#~ msgstr "Gan ฺsแid"
+msgid "Pattern not found"
+msgstr "Patr๚n gan aimsi๚"
-#~ msgid "Directory\t*.nothing\n"
-#~ msgstr "Comhadlann\t*.neamhnํ\n"
+#, c-format
+msgid "E486: Pattern not found: %s"
+msgstr "E486: Patr๚n gan aimsi๚: %s"
-#~ msgid ""
-#~ "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
-#~ msgstr ""
-#~ "Vim E458: Nํ f้idir iontrแil dathmhapแla a dhแileadh, is f้idir go mbeidh "
-#~ "dathanna mํchearta ann"
+msgid "E487: Argument must be positive"
+msgstr "E487: Arg๓int dheimhneach de dhํth"
-#~ msgid "E250: Fonts for the following charsets are missing in fontset %s:"
-#~ msgstr ""
-#~ "E250: Cl๓nna ar iarraidh le haghaidh na dtacar carachtar i dtacar cl๓ %s:"
+msgid "E459: Cannot go back to previous directory"
+msgstr "E459: Nํ f้idir a fhilleadh ar an chomhadlann roimhe seo"
-#~ msgid "E252: Fontset name: %s"
-#~ msgstr "E252: Ainm an tacar cl๓: %s"
+msgid "E42: No Errors"
+msgstr "E42: Nํl Aon Earrแid Ann"
-#~ msgid "Font '%s' is not fixed-width"
-#~ msgstr "Nํ cl๓ aonleithid ้ '%s'"
+msgid "E776: No location list"
+msgstr "E776: Gan liosta suํomh"
-#~ msgid "E253: Fontset name: %s\n"
-#~ msgstr "E253: Ainm an tacar cl๓: %s\n"
+msgid "E43: Damaged match string"
+msgstr "E43: Teaghrแn cuardaigh loite"
-#~ msgid "Font0: %s\n"
-#~ msgstr "Cl๓0: %s\n"
+msgid "E44: Corrupted regexp program"
+msgstr "E44: Clแr na sloinn ionadaํochta truaillithe"
-#~ msgid "Font1: %s\n"
-#~ msgstr "Cl๓1: %s\n"
+msgid "E45: 'readonly' option is set (add ! to override)"
+msgstr "E45: tแ an rogha 'readonly' socraithe (cuir ! leis an ord๚ chun sแr๚)"
-#~ msgid "Font%<PRId64> width is not twice that of font0\n"
-#~ msgstr "Nํl Cl๓%<PRId64> nํos leithne faoi dh๓ nแ cl๓0\n"
+#, c-format
+msgid "E46: Cannot change read-only variable \"%s\""
+msgstr "E46: Nํ f้idir athr๓g inl้ite amhแin \"%s\" a athr๚"
-#~ msgid "Font0 width: %<PRId64>\n"
-#~ msgstr "Leithead Cl๓0: %<PRId64>\n"
+#, c-format
+msgid "E794: Cannot set variable in the sandbox: \"%s\""
+msgstr "E794: Nํ f้idir athr๓g a shocr๚ sa bhosca gainimh: \"%s\""
-#~ msgid ""
-#~ "Font1 width: %<PRId64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "Leithead Cl๓1: %<PRId64>\n"
-#~ "\n"
+msgid "E713: Cannot use empty key for Dictionary"
+msgstr "E713: Nํ f้idir eochair fholamh a ๚sแid le Focl๓ir"
-#~ msgid "Invalid font specification"
-#~ msgstr "Sonr๚ neamhbhailํ cl๓"
+msgid "E715: Dictionary required"
+msgstr "E715: Tแ gแ le focl๓ir"
-#~ msgid "&Dismiss"
-#~ msgstr "&Ruaig"
+#, c-format
+msgid "E684: list index out of range: %ld"
+msgstr "E684: inn้acs liosta as raon: %ld"
-#~ msgid "no specific match"
-#~ msgstr "nํl a leith้id ann"
+#, c-format
+msgid "E118: Too many arguments for function: %s"
+msgstr "E118: An iomarca arg๓intํ d'fheidhm: %s"
-#~ msgid "Vim - Font Selector"
-#~ msgstr "Vim - Roghn๚ Cl๓"
+#, c-format
+msgid "E716: Key not present in Dictionary: %s"
+msgstr "E716: Nํl an eochair seo san Fhocl๓ir: %s"
-#~ msgid "Name:"
-#~ msgstr "Ainm:"
+msgid "E714: List required"
+msgstr "E714: Tแ gแ le liosta"
-#~ msgid "Show size in Points"
-#~ msgstr "Taispeแin m้id (Pointํ)"
+#, c-format
+msgid "E712: Argument of %s must be a List or Dictionary"
+msgstr "E712: Caithfidh arg๓int de %s a bheith ina Liosta n๓ Focl๓ir"
-#~ msgid "Encoding:"
-#~ msgstr "Ionch๓d๚:"
+msgid "E47: Error while reading errorfile"
+msgstr "E47: Earrแid agus comhad earrแide แ l้amh"
-#~ msgid "Font:"
-#~ msgstr "Cl๓:"
+msgid "E48: Not allowed in sandbox"
+msgstr "E48: Nํ cheadaํtear ้ seo i mbosca gainimh"
-#~ msgid "Style:"
-#~ msgstr "Stํl:"
+msgid "E523: Not allowed here"
+msgstr "E523: Nํ cheadaํtear ้ anseo"
-#~ msgid "Size:"
-#~ msgstr "M้id:"
+msgid "E359: Screen mode setting not supported"
+msgstr "E359: Nํ f้idir an m๓d scแileแin a shocr๚"
-#~ msgid "E256: Hangul automata ERROR"
-#~ msgstr "E256: EARRมID leis na huathoibreแin Hangul"
+msgid "E49: Invalid scroll size"
+msgstr "E49: M้id neamhbhailํ scrollaithe"
-#~ msgid "E563: stat error"
-#~ msgstr "E563: earrแid stat"
+msgid "E91: 'shell' option is empty"
+msgstr "E91: rogha 'shell' folamh"
-#~ msgid "E625: cannot open cscope database: %s"
-#~ msgstr "E625: nํ f้idir bunachar sonraํ cscope a oscailt: %s"
+msgid "E255: Couldn't read in sign data!"
+msgstr "E255: Nํorbh fh้idir na sonraํ comhartha a l้amh!"
-#~ msgid "E626: cannot get cscope database information"
-#~ msgstr "E626: nํ f้idir eolas a fhแil faoin bhunachar sonraํ cscope"
+msgid "E72: Close error on swap file"
+msgstr "E72: Earrแid agus comhad babhtแla แ dh๚nadh"
-#~ msgid ""
-#~ "E815: Sorry, this command is disabled, the MzScheme libraries could not "
-#~ "be loaded."
-#~ msgstr ""
-#~ "E815: Tแ br๓n orm, bhํ an t-ord๚ seo dํchumasaithe, nํorbh fh้idir "
-#~ "leabharlanna MzScheme a lucht๚."
+msgid "E73: tag stack empty"
+msgstr "E73: tแ cruach na gclibeanna folamh"
-#~ msgid "invalid expression"
-#~ msgstr "slonn neamhbhailํ"
+msgid "E74: Command too complex"
+msgstr "E74: Ord๚ r๓chasta"
-#~ msgid "expressions disabled at compile time"
-#~ msgstr "dํchumasaํodh sloinn ag am an tiomsaithe"
+msgid "E75: Name too long"
+msgstr "E75: Ainm r๓fhada"
-#~ msgid "hidden option"
-#~ msgstr "rogha fholaithe"
+msgid "E76: Too many ["
+msgstr "E76: an iomarca ["
-#~ msgid "unknown option"
-#~ msgstr "rogha anaithnid"
+msgid "E77: Too many file names"
+msgstr "E77: An iomarca ainmneacha comhaid"
-#~ msgid "window index is out of range"
-#~ msgstr "inn้acs fuinneoige as raon"
+msgid "E488: Trailing characters"
+msgstr "E488: Carachtair chun deiridh"
-#~ msgid "couldn't open buffer"
-#~ msgstr "nํ f้idir maolแn a oscailt"
+msgid "E78: Unknown mark"
+msgstr "E78: Marc anaithnid"
-#~ msgid "cannot save undo information"
-#~ msgstr "nํ f้idir eolas cealaithe a shแbhแil"
+msgid "E79: Cannot expand wildcards"
+msgstr "E79: Nํ f้idir saor๓ga a leathn๚"
-#~ msgid "cannot delete line"
-#~ msgstr "nํ f้idir an lํne a scriosadh"
+msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
+msgstr "E591: nํ cheadaํtear 'winheight' a bheith nํos l๚ nแ 'winminheight'"
-#~ msgid "cannot replace line"
-#~ msgstr "nํ f้idir an lํne a athchur"
+msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
+msgstr "E592: nํ cheadaํtear 'winwidth' a bheith nํos l๚ nแ 'winminwidth'"
-#~ msgid "cannot insert line"
-#~ msgstr "nํ f้idir lํne a ionsแ"
+msgid "E80: Error while writing"
+msgstr "E80: Earrแid agus แ scrํobh"
-#~ msgid "string cannot contain newlines"
-#~ msgstr "nํ cheadaํtear carachtair lํne nua sa teaghrแn"
+msgid "E939: Positive count required"
+msgstr "E939: Uimhir dheimhneach de dhํth"
-#~ msgid "Vim error: ~a"
-#~ msgstr "earrแid Vim: ~a"
+msgid "E81: Using <SID> not in a script context"
+msgstr "E81: <SID> แ ๚sแid nach i gcomhth้acs scripte"
-#~ msgid "Vim error"
-#~ msgstr "earrแid Vim"
+msgid "E449: Invalid expression received"
+msgstr "E449: Fuarthas slonn neamhbhailํ"
-#~ msgid "buffer is invalid"
-#~ msgstr "maolแn neamhbhailํ"
+msgid "E463: Region is guarded, cannot modify"
+msgstr "E463: R้igi๚n cosanta, nํ f้idir ้ a athr๚"
-#~ msgid "window is invalid"
-#~ msgstr "fuinneog neamhbhailํ"
+msgid "E744: NetBeans does not allow changes in read-only files"
+msgstr "E744: Nํ cheadaํonn NetBeans aon athr๚ i gcomhaid inl้ite amhแin"
-#~ msgid "linenr out of range"
-#~ msgstr "lํne-uimhir as raon"
+msgid "E363: pattern uses more memory than 'maxmempattern'"
+msgstr "E363: ๚sแideann an patr๚n nํos m๓ cuimhne nแ 'maxmempattern'"
-#~ msgid "not allowed in the Vim sandbox"
-#~ msgstr "nํ cheadaํtear ้ seo i mbosca gainimh Vim"
+msgid "E749: empty buffer"
+msgstr "E749: maolแn folamh"
-#~ msgid ""
-#~ "E263: Sorry, this command is disabled, the Python library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E263: Tแ br๓n orm, nํl an t-ord๚ seo le fแil, nํorbh fh้idir an "
-#~ "leabharlann Python a lucht๚."
+#, c-format
+msgid "E86: Buffer %ld does not exist"
+msgstr "E86: Nํl a leith้id de mhaolแn %ld"
-#~ msgid "E659: Cannot invoke Python recursively"
-#~ msgstr "E659: Nํ f้idir Python a rith go hathch๚rsach"
+msgid "E682: Invalid search pattern or delimiter"
+msgstr "E682: Patr๚n n๓ teormharc๓ir neamhbhailํ cuardaigh"
-#~ msgid "can't delete OutputObject attributes"
-#~ msgstr "nํ f้idir tr้ithe OutputObject a scriosadh"
+msgid "E139: File is loaded in another buffer"
+msgstr "E139: Tแ an comhad luchtaithe i maolแn eile"
-#~ msgid "softspace must be an integer"
-#~ msgstr "caithfidh softspace a bheith ina shlแnuimhir"
+#, c-format
+msgid "E764: Option '%s' is not set"
+msgstr "E764: Rogha '%s' gan socr๚"
-#~ msgid "invalid attribute"
-#~ msgstr "aitreab๚id neamhbhailํ"
+msgid "E850: Invalid register name"
+msgstr "E850: Ainm neamhbhailํ tabhaill"
-#~ msgid "writelines() requires list of strings"
-#~ msgstr "liosta teaghrแn ag teastแil ๓ writelines()"
+#, c-format
+msgid "E919: Directory not found in '%s': \"%s\""
+msgstr "E919: Comhadlann gan aimsi๚ in '%s': \"%s\""
-#~ msgid "E264: Python: Error initialising I/O objects"
-#~ msgstr "E264: Python: Earrแid agus r้ada I/A แ dt๚s๚"
+msgid "search hit TOP, continuing at BOTTOM"
+msgstr "Buaileadh an BARR le linn an chuardaigh, ag lean๚int ag an CHRอOCH"
-#~ msgid "attempt to refer to deleted buffer"
-#~ msgstr "rinneadh iarracht ar mhaolแn scriosta a rochtain"
+msgid "search hit BOTTOM, continuing at TOP"
+msgstr "Buaileadh an BUN le linn an chuardaigh, ag lean๚int ag an BHARR"
-#~ msgid "line number out of range"
-#~ msgstr "lํne-uimhir as raon"
+#, c-format
+msgid "Need encryption key for \"%s\""
+msgstr "Eochair chripti๚chแin le haghaidh \"%s\" de dhํth"
-#~ msgid "<buffer object (deleted) at %p>"
-#~ msgstr "<r้ad maolแin (scriosta) ag %p>"
+msgid "empty keys are not allowed"
+msgstr "nํ cheadaํtear eochracha folmha"
-#~ msgid "invalid mark name"
-#~ msgstr "ainm neamhbhailํ mairc"
+msgid "dictionary is locked"
+msgstr "tแ an focl๓ir faoi ghlas"
-#~ msgid "no such buffer"
-#~ msgstr "nํl a leith้id de mhaolแn ann"
+msgid "list is locked"
+msgstr "tแ an liosta faoi ghlas"
-#~ msgid "attempt to refer to deleted window"
-#~ msgstr "rinneadh iarracht ar fhuinneog scriosta a rochtain"
+#, c-format
+msgid "failed to add key '%s' to dictionary"
+msgstr "nํorbh fh้idir eochair '%s' a chur leis an bhfocl๓ir"
-#~ msgid "readonly attribute"
-#~ msgstr "tr้ith inl้ite amhแin"
+#, c-format
+msgid "index must be int or slice, not %s"
+msgstr "nํ m๓r don inn้acs a bheith ina shlแnuimhir n๓ ina shlisne, seachas %s"
-#~ msgid "cursor position outside buffer"
-#~ msgstr "c๚rs๓ir taobh amuigh den mhaolแn"
+#, c-format
+msgid "expected str() or unicode() instance, but got %s"
+msgstr "bhํothas ag s๚il le str() n๓ unicode(), ach fuarthas %s"
-#~ msgid "<window object (deleted) at %p>"
-#~ msgstr "<r้ad fuinneoige (scriosta) ag %p>"
+#, c-format
+msgid "expected bytes() or str() instance, but got %s"
+msgstr "bhํothas ag s๚il le bytes() n๓ str(), ach fuarthas %s"
-#~ msgid "<window object (unknown) at %p>"
-#~ msgstr "<r้ad fuinneoige (anaithnid) ag %p>"
+#, c-format
+msgid ""
+"expected int(), long() or something supporting coercing to long(), but got %s"
+msgstr ""
+"bhํothas ag s๚il le int(), long(), n๓ rud ้igin inathraithe ina long(), ach "
+"fuarthas %s"
-#~ msgid "<window %d>"
-#~ msgstr "<fuinneog %d>"
+#, c-format
+msgid "expected int() or something supporting coercing to int(), but got %s"
+msgstr ""
+"bhํothas ag s๚il le int() n๓ rud ้igin inathraithe ina int(), ach fuarthas %s"
-#~ msgid "no such window"
-#~ msgstr "nํl a leith้id d'fhuinneog ann"
+msgid "value is too large to fit into C int type"
+msgstr "tแ an luach nํos m๓ nแ athr๓g int sa teanga C"
-#~ msgid "E265: $_ must be an instance of String"
-#~ msgstr "E265: caithfidh $_ a bheith cineแl Teaghrแin"
+msgid "value is too small to fit into C int type"
+msgstr "tแ an luach nํos l๚ nแ athr๓g int sa teanga C"
-#~ msgid ""
-#~ "E266: Sorry, this command is disabled, the Ruby library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E266: Tแ br๓n orm, nํl an t-ord๚ seo le fแil, nํorbh fh้idir an "
-#~ "leabharlann Ruby a lucht๚."
+msgid "number must be greater than zero"
+msgstr "nํ m๓r don uimhir a bheith deimhneach"
+
+msgid "number must be greater or equal to zero"
+msgstr "nํ m๓r don uimhir a bheith >= 0"
+
+msgid "can't delete OutputObject attributes"
+msgstr "nํ f้idir tr้ithe OutputObject a scriosadh"
+
+#, c-format
+msgid "invalid attribute: %s"
+msgstr "aitreab๚id neamhbhailํ: %s"
+
+msgid "E264: Python: Error initialising I/O objects"
+msgstr "E264: Python: Earrแid agus r้ada I/A แ dt๚s๚"
+
+msgid "failed to change directory"
+msgstr "nํorbh fh้idir an chomhadlann a athr๚"
+
+#, c-format
+msgid "expected 3-tuple as imp.find_module() result, but got %s"
+msgstr ""
+"bhํothas ag s๚il le 3-chodach mar thoradh ar imp.find_module(), ach fuarthas "
+"%s"
+
+#, c-format
+msgid "expected 3-tuple as imp.find_module() result, but got tuple of size %d"
+msgstr ""
+"bhํothas ag s๚il le 3-chodach mar thoradh ar imp.find_module(), ach fuarthas "
+"%d-chodach"
+
+msgid "internal error: imp.find_module returned tuple with NULL"
+msgstr "earrแid inmheแnach: fuarthas codach NULL ar ais ๓ imp.find_module"
+
+msgid "cannot delete vim.Dictionary attributes"
+msgstr "nํ f้idir tr้ithe vim.Dictionary a scriosadh"
+
+msgid "cannot modify fixed dictionary"
+msgstr "nํ f้idir focl๓ir socraithe a athr๚"
+
+#, c-format
+msgid "cannot set attribute %s"
+msgstr "nํ f้idir tr้ith %s a shocr๚"
+
+msgid "hashtab changed during iteration"
+msgstr "athraํodh an haistแb le linn atriallta"
+
+#, c-format
+msgid "expected sequence element of size 2, but got sequence of size %d"
+msgstr "bhํothas ag s๚il le heilimint de mh้id 2, ach fuarthas m้id %d"
+
+msgid "list constructor does not accept keyword arguments"
+msgstr "nํ ghlacann cruthaitheoir an liosta le harg๓intํ eochairfhocail"
+
+msgid "list index out of range"
+msgstr "inn้acs liosta as raon"
+
+#. No more suitable format specifications in python-2.3
+#, c-format
+msgid "internal error: failed to get vim list item %d"
+msgstr "earrแid inmheแnach: nํl aon fhแil ar mhํr %d sa liosta vim"
+
+msgid "slice step cannot be zero"
+msgstr "nํ cheadaํtear slisne le c้im 0"
+
+#, c-format
+msgid "attempt to assign sequence of size greater than %d to extended slice"
+msgstr "iarracht ar sheicheamh nํos m๓ nแ %d a shannadh do shlisne fadaithe"
+
+#, c-format
+msgid "internal error: no vim list item %d"
+msgstr "earrแid inmheแnach: nํl aon mhํr %d sa liosta vim"
+
+msgid "internal error: not enough list items"
+msgstr "earrแid inmheแnach: nํl go leor mํreanna liosta ann"
+
+msgid "internal error: failed to add item to list"
+msgstr "earrแid inmheแnach: nํorbh fh้idir mํr a chur leis an liosta"
+
+#, c-format
+msgid "attempt to assign sequence of size %d to extended slice of size %d"
+msgstr "iarracht ar sheicheamh de mh้id %d a shannadh do shlisne de mh้id %d"
+
+msgid "failed to add item to list"
+msgstr "nํorbh fh้idir mํr a chur leis an liosta"
+
+msgid "cannot delete vim.List attributes"
+msgstr "nํ f้idir tr้ithe vim.List a scriosadh"
+
+msgid "cannot modify fixed list"
+msgstr "nํ f้idir liosta socraithe a athr๚"
+
+#, c-format
+msgid "unnamed function %s does not exist"
+msgstr "nํl feidhm %s gan ainm ann"
+
+#, c-format
+msgid "function %s does not exist"
+msgstr "nํl feidhm %s ann"
+
+#, c-format
+msgid "failed to run function %s"
+msgstr "nํorbh fh้idir feidhm %s a rith"
+
+msgid "unable to get option value"
+msgstr "nํ f้idir luach na rogha a fhแil"
+
+msgid "internal error: unknown option type"
+msgstr "earrแid inmheแnach: cineแl rogha anaithnid"
+
+msgid "problem while switching windows"
+msgstr "tharla earrแid agus an fhuinneog แ hathr๚"
+
+#, c-format
+msgid "unable to unset global option %s"
+msgstr "nํ f้idir rogha chomhchoiteann %s a dhํshocr๚"
+
+#, c-format
+msgid "unable to unset option %s which does not have global value"
+msgstr "nํ f้idir rogha %s gan luach comhchoiteann a dhํshocr๚"
+
+msgid "attempt to refer to deleted tab page"
+msgstr "tagairt d้anta do leathanach cluaisํnํ scriosta"
+
+msgid "no such tab page"
+msgstr "nํl a leith้id de leathanach cluaisํnํ ann"
+
+msgid "attempt to refer to deleted window"
+msgstr "rinneadh iarracht ar fhuinneog scriosta a rochtain"
+
+msgid "readonly attribute: buffer"
+msgstr "tr้ith inl้ite amhแin: maolแn"
+
+msgid "cursor position outside buffer"
+msgstr "c๚rs๓ir taobh amuigh den mhaolแn"
+
+msgid "no such window"
+msgstr "nํl a leith้id d'fhuinneog ann"
+
+msgid "attempt to refer to deleted buffer"
+msgstr "rinneadh iarracht ar mhaolแn scriosta a rochtain"
+
+msgid "failed to rename buffer"
+msgstr "nํorbh fh้idir ainm nua a chur ar an maolแn"
+
+msgid "mark name must be a single character"
+msgstr "nํ cheadaํtear ach carachtar amhแin in ainm an mhairc"
-#~ msgid "E267: unexpected return"
-#~ msgstr "E267: \"return\" gan choinne"
+#, c-format
+msgid "expected vim.Buffer object, but got %s"
+msgstr "bhํothas ag s๚il le r้ad vim.Buffer, ach fuarthas %s"
+
+#, c-format
+msgid "failed to switch to buffer %d"
+msgstr "nํorbh fh้idir athr๚ go dtํ maolแn a %d"
+
+#, c-format
+msgid "expected vim.Window object, but got %s"
+msgstr "bhํothas ag s๚il le r้ad vim.Window, ach fuarthas %s"
+
+msgid "failed to find window in the current tab page"
+msgstr "nํor aimsํodh fuinneog sa leathanach cluaisํnํ reatha"
+
+msgid "did not switch to the specified window"
+msgstr "nํor athraํodh go dtํ an fhuinneog roghnaithe"
+
+#, c-format
+msgid "expected vim.TabPage object, but got %s"
+msgstr "bhํothas ag s๚il le r้ad vim.TabPage, ach fuarthas %s"
+
+msgid "did not switch to the specified tab page"
+msgstr "nํor athraํodh go dtํ an leathanach cluaisํnํ roghnaithe"
+
+msgid "failed to run the code"
+msgstr "nํorbh fh้idir an c๓d a chur ar si๚l"
+
+msgid "E858: Eval did not return a valid python object"
+msgstr "E858: Nํ bhfuarthas r้ad bailํ python ar ais ๓ Eval"
+
+msgid "E859: Failed to convert returned python object to vim value"
+msgstr "E859: Nํorbh fh้idir luach vim a dh้anamh as an r้ad python"
+
+#, c-format
+msgid "unable to convert %s to vim dictionary"
+msgstr "nํ f้idir focl๓ir vim a dh้anamh as %s"
+
+#, c-format
+msgid "unable to convert %s to vim list"
+msgstr "nํ f้idir liosta vim a dh้anamh as %s"
+
+#, c-format
+msgid "unable to convert %s to vim structure"
+msgstr "nํ f้idir strucht๚r vim a dh้anamh as %s"
-#~ msgid "E268: unexpected next"
-#~ msgstr "E268: \"next\" gan choinne"
+msgid "internal error: NULL reference passed"
+msgstr "earrแid inmheแnach: tagairt NULL seolta"
-#~ msgid "E269: unexpected break"
-#~ msgstr "E269: \"break\" gan choinne"
+msgid "internal error: invalid value type"
+msgstr "earrแid inmheแnach: cineแl neamhbhailํ"
-#~ msgid "E270: unexpected redo"
-#~ msgstr "E270: \"redo\" gan choinne"
+msgid ""
+"Failed to set path hook: sys.path_hooks is not a list\n"
+"You should now do the following:\n"
+"- append vim.path_hook to sys.path_hooks\n"
+"- append vim.VIM_SPECIAL_PATH to sys.path\n"
+msgstr ""
+"Nํorbh fh้idir path_hook a shocr๚: nํ liosta ้ sys.path_hooks\n"
+"Ba ch๓ir duit na rudaํ seo a leanas a dh้anamh:\n"
+"- cuir vim.path_hook le deireadh sys.path_hooks\n"
+"- cuir vim.VIM_SPECIAL_PATH le deireadh sys.path\n"
+
+msgid ""
+"Failed to set path: sys.path is not a list\n"
+"You should now append vim.VIM_SPECIAL_PATH to sys.path"
+msgstr ""
+"Nํorbh fh้idir an chonair a shocr๚: nํ liosta ้ sys.path\n"
+"Ba ch๓ir duit vim.VIM_SPECIAL_PATH a cheangal le deireadh sys.path"
-#~ msgid "E271: retry outside of rescue clause"
-#~ msgstr "E271: \"retry\" taobh amuigh de chlแsal tarrthแla"
+#~ msgid "+-%s%3ld line: "
+#~ msgid_plural "+-%s%3ld lines: "
+#~ msgstr[0] "+-%s%3ld lํne: "
+#~ msgstr[1] "+-%s%3ld lํne: "
+#~ msgstr[2] "+-%s%3ld lํne: "
+#~ msgstr[3] "+-%s%3ld lํne: "
+#~ msgstr[4] "+-%s%3ld lํne: "
-#~ msgid "E272: unhandled exception"
-#~ msgstr "E272: eisceacht gan lแimhseแil"
+#~ msgid "+--%3ld line folded "
+#~ msgid_plural "+--%3ld lines folded "
+#~ msgstr[0] "+--%3ld lํne fillte "
+#~ msgstr[1] "+--%3ld lํne fillte "
+#~ msgstr[2] "+--%3ld lํne fillte "
+#~ msgstr[3] "+--%3ld lํne fillte "
+#~ msgstr[4] "+--%3ld lํne fillte "
-#~ msgid "E273: unknown longjmp status %d"
-#~ msgstr "E273: stแdas anaithnid longjmp %d"
+#~ msgid "Type :quit<Enter> to exit Vim"
+#~ msgstr "Cl๓scrํobh :quit<Enter> chun Vim a scor"
+
+#~ msgid "Zero count"
+#~ msgstr "Nialas"
+
+#~ msgid "E693: Can only compare Funcref with Funcref"
+#~ msgstr "E693: Is f้idir Funcref a chur i gcomparแid le Funcref eile amhแin"
+
+#~ msgid "E706: Variable type mismatch for: %s"
+#~ msgstr "E706: Mํmheaitseแil idir cineแlacha athr๓ige: %s"
+
+#~ msgid "%ld characters"
+#~ msgstr "%ld carachtar"
#~ msgid "Toggle implementation/definition"
#~ msgstr "Scorแnaigh feidhmi๚/sainmhํni๚"
@@ -7073,255 +7236,112 @@ msgstr "E446: Nํl ainm comhaid faoin ch๚rs๓ir"
#~ msgid "Sniff: Error during write. Disconnected"
#~ msgstr "Sniff: Earrแid sa scrํobh. Dํnasctha"
-#~ msgid "invalid buffer number"
-#~ msgstr "uimhir neamhbhailํ mhaolแin"
-
-#~ msgid "not implemented yet"
-#~ msgstr "nํl ar fแil"
-
-#~ msgid "cannot set line(s)"
-#~ msgstr "nํ f้idir lํn(t)e a shocr๚"
-
-#~ msgid "mark not set"
-#~ msgstr "marc gan socr๚"
-
-#~ msgid "row %d column %d"
-#~ msgstr "lํne %d col๚n %d"
-
-#~ msgid "cannot insert/append line"
-#~ msgstr "nํ f้idir lํne a ionsแ/iarcheangal"
-
-#~ msgid "unknown flag: "
-#~ msgstr "bratach anaithnid: "
-
-#~ msgid "unknown vimOption"
-#~ msgstr "vimOption anaithnid"
-
-#~ msgid "keyboard interrupt"
-#~ msgstr "idirbhriseadh m้archlแir"
-
-#~ msgid "vim error"
-#~ msgstr "earrแid vim"
-
-#~ msgid "cannot create buffer/window command: object is being deleted"
-#~ msgstr "nํ f้idir ord๚ maolแin/fuinneoige a chruth๚: r้ad แ scriosadh"
+#~ msgid " Quit, or continue with caution.\n"
+#~ msgstr " Scoir, n๓ lean ar aghaidh go hairdeallach.\n"
-#~ msgid ""
-#~ "cannot register callback command: buffer/window is already being deleted"
-#~ msgstr ""
-#~ "nํ f้idir ord๚ aisghlaoch a chlแr๚: maolแn/fuinneog แ scriosadh cheana"
-
-#~ msgid ""
-#~ "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-"
-#~ "dev@vim.org"
-#~ msgstr ""
-#~ "E280: EARRมID MHARFACH TCL: liosta truaillithe tagartha!? Seol tuairisc "
-#~ "fhabht chuig <vim-dev@vim.org> le do thoil"
-
-#~ msgid "cannot register callback command: buffer/window reference not found"
-#~ msgstr ""
-#~ "nํ f้idir ord๚ aisghlaoch a chlแr๚: tagairt mhaolแn/fhuinneoige gan aimsi๚"
-
-#~ msgid ""
-#~ "E571: Sorry, this command is disabled: the Tcl library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E571: Tแ br๓n orm, nํl an t-ord๚ seo le fแil: nํorbh fh้idir an "
-#~ "leabharlann Tcl a lucht๚."
-
-#~ msgid ""
-#~ "E281: TCL ERROR: exit code is not int!? Please report this to vim-dev@vim."
-#~ "org"
-#~ msgstr ""
-#~ "E281: EARRมID TCL: nํl an c๓d scortha ina shlแnuimhir!? Seol tuairisc "
-#~ "fhabht chuig <vim-dev@vim.org> le do thoil"
-
-#~ msgid "E572: exit code %d"
-#~ msgstr "E572: c๓d scortha %d"
+#~ msgid "Cannot connect to Netbeans #2"
+#~ msgstr "Nํ f้idir nascadh le Netbeans #2"
-#~ msgid "cannot get line"
-#~ msgstr "nํ f้idir an lํne a fhแil"
+#~ msgid "read from Netbeans socket"
+#~ msgstr "l้adh ๓ shoic้ad Netbeans"
-#~ msgid "Unable to register a command server name"
-#~ msgstr "Nํ f้idir ainm fhreastalaํ ordaithe a chlแr๚"
+#~ msgid "'columns' is not 80, cannot execute external commands"
+#~ msgstr "nํ 80 ้ 'columns', nํ f้idir orduithe seachtracha a rith"
-#~ msgid "E248: Failed to send command to the destination program"
-#~ msgstr "E248: Theip ar sheoladh ord๚ chuig an sprioc-chlแr"
+#~ msgid "Could not set security context "
+#~ msgstr "Nํorbh fh้idir comhth้acs slแndแla a shocr๚ "
-#~ msgid "E573: Invalid server id used: %s"
-#~ msgstr "E573: Aitheantas neamhbhailํ freastalaํ in ๚sแid: %s"
+#~ msgid " for "
+#~ msgstr " le haghaidh "
-#~ msgid "E251: VIM instance registry property is badly formed. Deleted!"
-#~ msgstr "E251: Airํ mํchumtha sa chlแrlann แisc VIM. Scriosta!"
+#~ msgid "Could not get security context "
+#~ msgstr "Nํorbh fh้idir comhth้acs slแndแla a fhแil "
-#~ msgid "This Vim was not compiled with the diff feature."
-#~ msgstr "Nํor tiomsaํodh an leagan Vim seo le `diff' ar fแil."
+#~ msgid ". Removing it!\n"
+#~ msgstr ". ม scriosadh!\n"
-#~ msgid "'-nb' cannot be used: not enabled at compile time\n"
-#~ msgstr "Nํ f้idir '-nb' a ๚sแid: nํor cumasaํodh ้ ag am tiomsaithe\n"
+#~ msgid " (lang)"
+#~ msgstr " (teanga)"
-#~ msgid "Vim: Error: Failure to start gvim from NetBeans\n"
-#~ msgstr "Vim: Earrแid: Theip ar thos๚ gvim ๓ NetBeans\n"
+#~ msgid "E759: Format error in spell file"
+#~ msgstr "E759: Earrแid fhormแide i gcomhad litrithe"
#~ msgid ""
#~ "\n"
-#~ "Where case is ignored prepend / to make flag upper case"
+#~ "MS-Windows 16/32-bit GUI version"
#~ msgstr ""
#~ "\n"
-#~ "Nuair nach cแsํogair ้, cuir '/' ag tosach na brataํ chun ํ a chur sa "
-#~ "chแs uachtair"
-
-#~ msgid "-register\t\tRegister this gvim for OLE"
-#~ msgstr "-register\t\tClแraigh an gvim seo le haghaidh OLE"
-
-#~ msgid "-unregister\t\tUnregister gvim for OLE"
-#~ msgstr "-unregister\t\tDํchlแraigh an gvim seo le haghaidh OLE"
-
-#~ msgid "-g\t\t\tRun using GUI (like \"gvim\")"
-#~ msgstr "-g\t\t\tRith agus ๚sแid an GUI (mar \"gvim\")"
-
-#~ msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
-#~ msgstr "-f n๓ --nofork\tTulra: Nแ d้an forc agus an GUI แ thos๚"
-
-#~ msgid "-f\t\t\tDon't use newcli to open window"
-#~ msgstr "-f\t\t\tNแ h๚sแid newcli chun fuinneog a oscailt"
-
-#~ msgid "-dev <device>\t\tUse <device> for I/O"
-#~ msgstr "-dev <gl้as>\t\tBain ๚sแid as <gl้as> do I/A"
-
-#~ msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
-#~ msgstr "-U <gvimrc>\t\tBain ๚sแid as <gvimrc> in ionad aon .gvimrc"
-
-#~ msgid "-x\t\t\tEdit encrypted files"
-#~ msgstr "-x\t\t\tCuir comhaid chriptithe in eagar"
-
-#~ msgid "-display <display>\tConnect vim to this particular X-server"
-#~ msgstr "-display <freastalaํ>\tNasc vim leis an bhfreastalaํ-X seo"
-
-#~ msgid "-X\t\t\tDo not connect to X server"
-#~ msgstr "-X\t\t\tNแ naisc leis an bhfreastalaํ X"
-
-#~ msgid "--remote <files>\tEdit <files> in a Vim server if possible"
-#~ msgstr ""
-#~ "--remote <comhaid>\tCuir <comhaid> in eagar le freastalaํ Vim mแs f้idir"
-
-#~ msgid "--remote-silent <files> Same, don't complain if there is no server"
-#~ msgstr ""
-#~ "--remote-silent <comhaid> Mar an gc้anna, nแ d้an gearแn mura bhfuil "
-#~ "freastalaํ ann"
-
-#~ msgid ""
-#~ "--remote-wait <files> As --remote but wait for files to have been edited"
-#~ msgstr ""
-#~ "--remote-wait <comhaid> Mar --remote ach fan leis na comhaid a bheith "
-#~ "curtha in eagar"
-
-#~ msgid ""
-#~ "--remote-wait-silent <files> Same, don't complain if there is no server"
-#~ msgstr ""
-#~ "--remote-wait-silent <comhaid> Mar an gc้anna, nแ d้an gearแn mura "
-#~ "bhfuil freastalaํ ann"
-
-#~ msgid ""
-#~ "--remote-tab[-wait][-silent] <files> As --remote but use tab page per "
-#~ "file"
-#~ msgstr ""
-#~ "--remote-tab[-wait][-silent] <comhaid> Cos๚il le --remote ach oscail "
-#~ "cluaisํn do gach comhad"
-
-#~ msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
-#~ msgstr ""
-#~ "--remote-send <eochracha>\tSeol <eochracha> chuig freastalaํ Vim agus "
-#~ "scoir"
-
-#~ msgid ""
-#~ "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
-#~ msgstr ""
-#~ "--remote-expr <slonn>\tLuachแil <slonn> le freastalaํ Vim agus taispeแin "
-#~ "an toradh"
-
-#~ msgid "--serverlist\t\tList available Vim server names and exit"
-#~ msgstr "--serverlist\t\tTaispeแin freastalaithe Vim atแ ar fแil agus scoir"
+#~ "Leagan GUI 16/32 giotแn MS-Windows"
-#~ msgid "--servername <name>\tSend to/become the Vim server <name>"
-#~ msgstr "--servername <ainm>\tSeol chuig/T้igh i do fhreastalaํ Vim <ainm>"
+#~ msgid " in Win32s mode"
+#~ msgstr " i m๓d Win32s"
#~ msgid ""
#~ "\n"
-#~ "Arguments recognised by gvim (Motif version):\n"
+#~ "MS-Windows 16-bit version"
#~ msgstr ""
#~ "\n"
-#~ "Arg๓intํ ar eolas do gvim (leagan Motif):\n"
+#~ "Leagan 16 giotแn MS-Windows"
#~ msgid ""
#~ "\n"
-#~ "Arguments recognised by gvim (neXtaw version):\n"
+#~ "32-bit MS-DOS version"
#~ msgstr ""
#~ "\n"
-#~ "Arg๓intํ ar eolas do gvim (leagan neXtaw):\n"
+#~ "Leagan 32 giotแn MS-DOS"
#~ msgid ""
#~ "\n"
-#~ "Arguments recognised by gvim (Athena version):\n"
+#~ "16-bit MS-DOS version"
#~ msgstr ""
#~ "\n"
-#~ "Arg๓intํ ar eolas do gvim (leagan Athena):\n"
+#~ "Leagan 16 giotแn MS-DOS"
-#~ msgid "-display <display>\tRun vim on <display>"
-#~ msgstr "-display <scแileแn>\tRith vim ar <scแileแn>"
+#~ msgid "WARNING: Windows 95/98/ME detected"
+#~ msgstr "RABHADH: Braitheadh Windows 95/98/ME"
-#~ msgid "-iconic\t\tStart vim iconified"
-#~ msgstr "-iconic\t\tTosaigh vim sa mh๓d ํoslaghdaithe"
+#~ msgid "type :help windows95<Enter> for info on this"
+#~ msgstr "cl๓scrํobh :help windows95<Enter> chun eolas a fhแil "
-#~ msgid "-name <name>\t\tUse resource as if vim was <name>"
-#~ msgstr "-name <ainm>\t\tฺsแid acmhainn mar a bheadh vim <ainm>"
+#~ msgid "function constructor does not accept keyword arguments"
+#~ msgstr "nํ ghlacann cruthaitheoir na feidhme le harg๓intํ eochairfhocail"
-#~ msgid "\t\t\t (Unimplemented)\n"
-#~ msgstr "\t\t\t (Nํl ar fแil)\n"
+#~ msgid "Vim dialog..."
+#~ msgstr "Dial๓g Vim..."
-#~ msgid "-background <color>\tUse <color> for the background (also: -bg)"
-#~ msgstr "-background <dath>\tBain ๚sแid as <dath> don ch๚lra (-bg fosta)"
+#~ msgid "Font Selection"
+#~ msgstr "Roghn๚ Cl๓"
-#~ msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
-#~ msgstr ""
-#~ "-foreground <dath>\tฺsแid <dath> le haghaidh gnแth-th้acs (fosta: -fg)"
+#~ msgid "softspace must be an integer"
+#~ msgstr "caithfidh softspace a bheith ina shlแnuimhir"
-#~ msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
-#~ msgstr "-font <cl๓>\t\tฺsแid <cl๓> le haghaidh gnแth-th้acs (fosta: -fn)"
+#~ msgid "writelines() requires list of strings"
+#~ msgstr "liosta teaghrแn ag teastแil ๓ writelines()"
-#~ msgid "-boldfont <font>\tUse <font> for bold text"
-#~ msgstr "-boldfont <cl๓>\tBain ๚sแid as <cl๓> do chl๓ trom"
+#~ msgid "<buffer object (deleted) at %p>"
+#~ msgstr "<r้ad maolแin (scriosta) ag %p>"
-#~ msgid "-italicfont <font>\tUse <font> for italic text"
-#~ msgstr "-italicfont <cl๓>\tฺsแid <cl๓> le haghaidh t้acs iodแlach"
+#~ msgid "<window object (deleted) at %p>"
+#~ msgstr "<r้ad fuinneoige (scriosta) ag %p>"
-#~ msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
-#~ msgstr ""
-#~ "-geometry <geoim>\tฺsแid <geoim> le haghaidh na c้imseatan tosaigh "
-#~ "(fosta: -geom)"
+#~ msgid "<window object (unknown) at %p>"
+#~ msgstr "<r้ad fuinneoige (anaithnid) ag %p>"
-#~ msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
-#~ msgstr "-borderwidth <leithead>\tSocraigh <leithead> na himlํne (-bw fosta)"
+#~ msgid "<window %d>"
+#~ msgstr "<fuinneog %d>"
#~ msgid ""
-#~ "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
-#~ msgstr ""
-#~ "-scrollbarwidth <leithead> Socraigh leithead na scrollbharraํ a bheith "
-#~ "<leithead> (fosta: -sw)"
-
-#~ msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
+#~ "E281: TCL ERROR: exit code is not int!? Please report this to vim-dev@vim."
+#~ "org"
#~ msgstr ""
-#~ "-menuheight <airde>\tSocraigh airde an bharra roghchlแir a bheith <airde> "
-#~ "(fosta: -mh)"
-
-#~ msgid "-reverse\t\tUse reverse video (also: -rv)"
-#~ msgstr "-reverse\t\tฺsแid fํs aisiompaithe (fosta: -rv)"
+#~ "E281: EARRมID TCL: nํl an c๓d scortha ina shlแnuimhir!? Seol tuairisc "
+#~ "fhabht chuig <vim-dev@vim.org> le do thoil"
-#~ msgid "+reverse\t\tDon't use reverse video (also: +rv)"
-#~ msgstr "+reverse\t\tNแ h๚sแid fํs aisiompaithe (fosta: +rv)"
+#~ msgid "-name <name>\t\tUse resource as if vim was <name>"
+#~ msgstr "-name <ainm>\t\tฺsแid acmhainn mar a bheadh vim <ainm>"
-#~ msgid "-xrm <resource>\tSet the specified resource"
-#~ msgstr "-xrm <acmhainn>\tSocraigh an acmhainn sainithe"
+#~ msgid "\t\t\t (Unimplemented)\n"
+#~ msgstr "\t\t\t (Nํl ar fแil)\n"
#~ msgid ""
#~ "\n"
@@ -7336,66 +7356,6 @@ msgstr "E446: Nํl ainm comhaid faoin ch๚rs๓ir"
#~ msgid "--rows <number>\tInitial height of window in rows"
#~ msgstr "--rows <uimhir>\tAirde fhuinneoige i dtosach (r๓nna)"
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (GTK+ version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Arg๓intํ ar eolas do gvim (leagan GTK+):\n"
-
-#~ msgid "-display <display>\tRun vim on <display> (also: --display)"
-#~ msgstr "-display <scแileแn>\tRith vim ar <scแileแn> (fosta: --display)"
-
-#~ msgid "--role <role>\tSet a unique role to identify the main window"
-#~ msgstr ""
-#~ "--role <r๓l>\tSocraigh r๓l saini๚il chun an phrํomhfhuinneog a aithint"
-
-#~ msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
-#~ msgstr "--socketid <xid>\tOscail Vim isteach i ngiuirl้id GTK eile"
-
-#~ msgid "-P <parent title>\tOpen Vim inside parent application"
-#~ msgstr "-P <mแthairchlแr>\tOscail Vim isteach sa mhแthairchlแr"
-
-#~ msgid "--windowid <HWND>\tOpen Vim inside another win32 widget"
-#~ msgstr "--windowid <HWND>\tOscail Vim isteach i ngiuirl้id win32 eile"
-
-#~ msgid "No display"
-#~ msgstr "Gan taispeแint"
-
-#~ msgid ": Send failed.\n"
-#~ msgstr ": Theip ar seoladh.\n"
-
-#~ msgid ": Send failed. Trying to execute locally\n"
-#~ msgstr ": Theip ar seoladh. Ag baint triail as go logแnta\n"
-
-#~ msgid "%d of %d edited"
-#~ msgstr "%d as %d d้anta"
-
-#~ msgid "No display: Send expression failed.\n"
-#~ msgstr "Gan taispeแint: Theip ar sheoladh sloinn.\n"
-
-#~ msgid ": Send expression failed.\n"
-#~ msgstr ": Theip ar sheoladh sloinn.\n"
-
-#~ msgid "E543: Not a valid codepage"
-#~ msgstr "E543: Nํ c๓dleathanach bailํ ้"
-
-#~ msgid "E285: Failed to create input context"
-#~ msgstr "E285: Theip ar chruth๚ comhth้acs ionchuir"
-
-#~ msgid "E286: Failed to open input method"
-#~ msgstr "E286: Theip ar oscailt mhodh ionchuir"
-
-#~ msgid "E287: Warning: Could not set destroy callback to IM"
-#~ msgstr ""
-#~ "E287: Rabhadh: Nํorbh fh้idir aisghlaoch l้irscriosta a shocr๚ le IM"
-
-#~ msgid "E288: input method doesn't support any style"
-#~ msgstr "E288: Nํ thacaํonn an modh ionchuir aon stํl"
-
-#~ msgid "E289: input method doesn't support my preedit type"
-#~ msgstr "E289: nํ thacaํonn an modh ionchuir mo chineแl r้amheagair"
-
#~ msgid "E290: over-the-spot style requires fontset"
#~ msgstr "E290: tacar cl๓ ag teastแil ๓ stํl thar-an-spota"
@@ -7407,197 +7367,15 @@ msgstr "E446: Nํl ainm comhaid faoin ch๚rs๓ir"
#~ msgid "E292: Input Method Server is not running"
#~ msgstr "E292: Nํl an Freastalaํ Mhodh Ionchuir ag rith"
-#~ msgid ""
-#~ "\n"
-#~ " [not usable with this version of Vim]"
-#~ msgstr ""
-#~ "\n"
-#~ " [nํ in๚sแidte leis an leagan seo Vim]"
-
-#~ msgid "Tear off this menu"
-#~ msgstr "Bain an roghchlแr seo"
-
-#~ msgid "Select Directory dialog"
-#~ msgstr "Dial๓g `Roghnaigh Comhadlann'"
-
-#~ msgid "Save File dialog"
-#~ msgstr "Dial๓g `Sแbhแil Comhad'"
-
-#~ msgid "Open File dialog"
-#~ msgstr "Dial๓g `Oscail Comhad'"
-
-#~ msgid "E338: Sorry, no file browser in console mode"
-#~ msgstr "E338: Nํl brabhsแlaํ comhaid ar fแil sa mh๓d cons๓il"
-
#~ msgid "Vim: preserving files...\n"
#~ msgstr "Vim: comhaid แ gcaomhn๚...\n"
#~ msgid "Vim: Finished.\n"
#~ msgstr "Vim: Crํochnaithe.\n"
-#~ msgid "ERROR: "
-#~ msgstr "EARRมID: "
-
-#~ msgid ""
-#~ "\n"
-#~ "[bytes] total alloc-freed %<PRIu64>-%<PRIu64>, in use %<PRIu64>, peak use "
-#~ "%<PRIu64>\n"
-#~ msgstr ""
-#~ "\n"
-#~ "[beart] iomlแn dแilte-saor %<PRIu64>-%<PRIu64>, in ๚sแid %<PRIu64>, buaic "
-#~ "%<PRIu64>\n"
-
-#~ msgid ""
-#~ "[calls] total re/malloc()'s %<PRIu64>, total free()'s %<PRIu64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "[glaonna] re/malloc(): %<PRIu64>, free(): %<PRIu64>\n"
-#~ "\n"
-
-#~ msgid "E340: Line is becoming too long"
-#~ msgstr "E340: Tแ an lํne ag ้irํ r๓fhada"
-
-#~ msgid "E341: Internal error: lalloc(%<PRId64>, )"
-#~ msgstr "E341: Earrแid inmheแnach: lalloc(%<PRId64>, )"
-
-#~ msgid "E547: Illegal mouseshape"
-#~ msgstr "E547: Cruth neamhcheadaithe luiche"
-
-#~ msgid "Enter encryption key: "
-#~ msgstr "Iontrแil eochair chripti๚chแin: "
-
-#~ msgid "Enter same key again: "
-#~ msgstr "Iontrแil an eochair arํs: "
-
-#~ msgid "Keys don't match!"
-#~ msgstr "Nํl na heochracha comhoiri๚nach le ch้ile!"
-
-#~ msgid "Cannot connect to Netbeans #2"
-#~ msgstr "Nํ f้idir nascadh le Netbeans #2"
-
-#~ msgid "Cannot connect to Netbeans"
-#~ msgstr "Nํ f้idir nascadh le Netbeans"
-
-#~ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
-#~ msgstr ""
-#~ "E668: M๓d mํcheart rochtana ar an chomhad eolas naisc NetBeans: \"%s\""
-
-#~ msgid "read from Netbeans socket"
-#~ msgstr "l้adh ๓ shoic้ad Netbeans"
-
-#~ msgid "E658: NetBeans connection lost for buffer %<PRId64>"
-#~ msgstr "E658: Cailleadh nasc NetBeans le haghaidh maolแin %<PRId64>"
-
#~ msgid "E505: "
#~ msgstr "E505: "
-#~ msgid "E775: Eval feature not available"
-#~ msgstr "E775: Nํl an ghn้ Eval le fแil"
-
-#~ msgid "freeing %<PRId64> lines"
-#~ msgstr "%<PRId64> lํne แ saoradh"
-
-#~ msgid "E530: Cannot change term in GUI"
-#~ msgstr "E530: Nํ f้idir 'term' a athr๚ sa GUI"
-
-#~ msgid "E531: Use \":gui\" to start the GUI"
-#~ msgstr "E531: ฺsแid \":gui\" chun an GUI a chur ag obair"
-
-#~ msgid "E617: Cannot be changed in the GTK+ 2 GUI"
-#~ msgstr "E617: Nํ f้idir ้ a athr๚ sa GUI GTK+ 2"
-
-#~ msgid "E596: Invalid font(s)"
-#~ msgstr "E596: Cl๓(nna) neamhbhailํ"
-
-#~ msgid "E597: can't select fontset"
-#~ msgstr "E597: nํ f้idir tacar cl๓ a roghn๚"
-
-#~ msgid "E598: Invalid fontset"
-#~ msgstr "E598: Tacar cl๓ neamhbhailํ"
-
-#~ msgid "E533: can't select wide font"
-#~ msgstr "E533: nํ f้idir cl๓ leathan a roghn๚"
-
-#~ msgid "E534: Invalid wide font"
-#~ msgstr "E534: Cl๓ leathan neamhbhailํ"
-
-#~ msgid "E538: No mouse support"
-#~ msgstr "E538: Gan tacaํocht luiche"
-
-#~ msgid "cannot open "
-#~ msgstr "nํ f้idir a oscailt: "
-
-#~ msgid "VIM: Can't open window!\n"
-#~ msgstr "VIM: Nํ f้idir fuinneog a oscailt!\n"
-
-#~ msgid "Need Amigados version 2.04 or later\n"
-#~ msgstr "Tแ gแ le Amigados leagan 2.04 n๓ nํos d้anaํ\n"
-
-#~ msgid "Need %s version %<PRId64>\n"
-#~ msgstr "Tแ gแ le %s, leagan %<PRId64>\n"
-
-#~ msgid "Cannot open NIL:\n"
-#~ msgstr "Nํ f้idir NIL a oscailt:\n"
-
-#~ msgid "Cannot create "
-#~ msgstr "Nํ f้idir a chruth๚: "
-
-#~ msgid "Vim exiting with %d\n"
-#~ msgstr "Vim แ scor le stแdas %d\n"
-
-#~ msgid "cannot change console mode ?!\n"
-#~ msgstr "nํ f้idir m๓d cons๓il a athr๚ ?!\n"
-
-#~ msgid "mch_get_shellsize: not a console??\n"
-#~ msgstr "mch_get_shellsize: nํ cons๓l ้ seo??\n"
-
-#~ msgid "E360: Cannot execute shell with -f option"
-#~ msgstr "E360: Nํ f้idir blaosc a rith le rogha -f"
-
-#~ msgid "Cannot execute "
-#~ msgstr "Nํ f้idir blaosc a rith: "
-
-#~ msgid "shell "
-#~ msgstr "blaosc "
-
-#~ msgid " returned\n"
-#~ msgstr " aisfhilleadh\n"
-
-#~ msgid "ANCHOR_BUF_SIZE too small."
-#~ msgstr "ANCHOR_BUF_SIZE r๓bheag."
-
-#~ msgid "I/O ERROR"
-#~ msgstr "EARRมID I/A"
-
-#~ msgid "Message"
-#~ msgstr "Teachtaireacht"
-
-#~ msgid "'columns' is not 80, cannot execute external commands"
-#~ msgstr "nํ 80 ้ 'columns', nํ f้idir orduithe seachtracha a rith"
-
-#~ msgid "E237: Printer selection failed"
-#~ msgstr "E237: Theip ar roghn๚ print้ara"
-
-#~ msgid "to %s on %s"
-#~ msgstr "go %s ar %s"
-
-#~ msgid "E613: Unknown printer font: %s"
-#~ msgstr "E613: Cl๓fhoireann anaithnid print้ara: %s"
-
-#~ msgid "E238: Print error: %s"
-#~ msgstr "E238: Earrแid phriontแla: %s"
-
-#~ msgid "Printing '%s'"
-#~ msgstr "'%s' แ phriontแil"
-
-#~ msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
-#~ msgstr ""
-#~ "E244: Ainm neamhcheadaithe ar thacar carachtar \"%s\" mar phแirt d'ainm "
-#~ "cl๓ \"%s\""
-
-#~ msgid "E245: Illegal char '%c' in font name \"%s\""
-#~ msgstr "E245: Carachtar neamhcheadaithe '%c' mar phแirt d'ainm cl๓ \"%s\""
-
#~ msgid "Vim: Double signal, exiting\n"
#~ msgstr "Vim: Comhartha d๚bailte, ag scor\n"
@@ -7607,419 +7385,23 @@ msgstr "E446: Nํl ainm comhaid faoin ch๚rs๓ir"
#~ msgid "Vim: Caught deadly signal\n"
#~ msgstr "Vim: Fuarthas comhartha marfach\n"
-#~ msgid "Opening the X display took %<PRId64> msec"
-#~ msgstr "Th๓g %<PRId64> ms chun an scแileแn X a oscailt"
-
-#~ msgid ""
-#~ "\n"
-#~ "Vim: Got X error\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Vim: Fuarthas earrแid ๓ X\n"
-
-#~ msgid "Testing the X display failed"
-#~ msgstr "Theip ar thแstแil an scแileแin X"
-
-#~ msgid "Opening the X display timed out"
-#~ msgstr "Oscailt an scแileแin X thar am"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot execute shell sh\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Nํ f้idir an bhlaosc sh a rith\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot create pipes\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Nํ f้idir pํopaํ a chruth๚\n"
-
-# "fork" not in standard refs/corpus. Maybe want a "gabhl*" word instead? -KPS
-#~ msgid ""
-#~ "\n"
-#~ "Cannot fork\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Nํ f้idir forc a dh้anamh\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Command terminated\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Ord๚ crํochnaithe\n"
-
-#~ msgid "XSMP lost ICE connection"
-#~ msgstr "Chaill XSMP an nasc ICE"
-
-#~ msgid "Opening the X display failed"
-#~ msgstr "Theip ar oscailt an scแileแin X"
-
-#~ msgid "XSMP handling save-yourself request"
-#~ msgstr "Iarratas sแbhแil-do-f้in แ lแimhseแil ag XSMP"
-
-#~ msgid "XSMP opening connection"
-#~ msgstr "Nasc แ oscailt ag XSMP"
-
-#~ msgid "XSMP ICE connection watch failed"
-#~ msgstr "Theip ar fhaire nasc ICE XSMP"
-
-#~ msgid "XSMP SmcOpenConnection failed: %s"
-#~ msgstr "Theip ar XSMP SmcOpenConnection: %s"
-
-#~ msgid "At line"
-#~ msgstr "Ag lํne"
-
-#~ msgid "Could not load vim32.dll!"
-#~ msgstr "Nํorbh fh้idir vim32.dll a lucht๚!"
-
-#~ msgid "VIM Error"
-#~ msgstr "Earrแid VIM"
-
-#~ msgid "Could not fix up function pointers to the DLL!"
-#~ msgstr "Nํorbh fh้idir pointeoirํ feidhme a ch๓iri๚ i gcomhair an DLL!"
-
-#~ msgid "shell returned %d"
-#~ msgstr "d'aisfhill an bhlaosc %d"
-
-#~ msgid "Vim: Caught %s event\n"
-#~ msgstr "Vim: Fuarthas teagmhas %s\n"
-
-#~ msgid "close"
-#~ msgstr "d๚n"
-
-#~ msgid "logoff"
-#~ msgstr "logแil amach"
-
-#~ msgid "shutdown"
-#~ msgstr "m๚chadh"
-
-#~ msgid "E371: Command not found"
-#~ msgstr "E371: Nํ bhfuarthas an t-ord๚"
-
-#~ msgid ""
-#~ "VIMRUN.EXE not found in your $PATH.\n"
-#~ "External commands will not pause after completion.\n"
-#~ "See :help win32-vimrun for more information."
-#~ msgstr ""
-#~ "Nํor aimsํodh VIMRUN.EXE i do $PATH.\n"
-#~ "Nํ mhoilleoidh orduithe seachtracha agus iad curtha i gcrํch.\n"
-#~ "F้ach ar :help win32-vimrun chun nํos m๓ eolas a fhแil."
-
-#~ msgid "Vim Warning"
-#~ msgstr "Rabhadh Vim"
-
-#~ msgid "Conversion in %s not supported"
-#~ msgstr "Tiont๚ i %s gan tacaํocht"
-
#~ msgid "E396: containedin argument not accepted here"
#~ msgstr "E396: nํ ghlactar leis an arg๓int containedin anseo"
-#~ msgid "E430: Tag file path truncated for %s\n"
-#~ msgstr "E430: Teascadh conair an chomhaid clibeanna le haghaidh %s\n"
-
-#~ msgid "new shell started\n"
-#~ msgstr "tosaํodh blaosc nua\n"
-
-#~ msgid "Used CUT_BUFFER0 instead of empty selection"
-#~ msgstr "ฺsแideadh CUT_BUFFER0 in ionad roghn๚chแin folaimh"
-
-#~ msgid "No undo possible; continue anyway"
-#~ msgstr "Nํ f้idir a cheal๚; lean ar aghaidh mar sin f้in"
-
# columns?
#~ msgid "number changes time"
#~ msgstr "uimhir athruithe am"
#~ msgid ""
#~ "\n"
-#~ "MS-Windows 16/32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "Leagan GUI 16/32 giotแn MS-Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "Leagan GUI 64 giotแn MS-Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "Leagan GUI 32 giotแn MS-Windows"
-
-#~ msgid " in Win32s mode"
-#~ msgstr " i m๓d Win32s"
-
-#~ msgid " with OLE support"
-#~ msgstr " le tacaํocht OLE"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "Leagan cons๓il 64 giotแn MS-Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "Leagan cons๓il 32 giotแn MS-Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16-bit version"
-#~ msgstr ""
-#~ "\n"
-#~ "Leagan 16 giotแn MS-Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "32-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "Leagan 32 giotแn MS-DOS"
-
-#~ msgid ""
-#~ "\n"
-#~ "16-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "Leagan 16 giotแn MS-DOS"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X (unix) version"
-#~ msgstr ""
-#~ "\n"
-#~ "Leagan MacOS X (unix)"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X version"
-#~ msgstr ""
-#~ "\n"
-#~ "Leagan MacOS X"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "Leagan MacOS"
-
-#~ msgid ""
-#~ "\n"
#~ "RISC OS version"
#~ msgstr ""
#~ "\n"
#~ "Leagan RISC OS"
-#~ msgid ""
-#~ "\n"
-#~ "OpenVMS version"
-#~ msgstr ""
-#~ "\n"
-#~ "Leagan OpenVMS"
-
-#~ msgid ""
-#~ "\n"
-#~ "Big version "
-#~ msgstr ""
-#~ "\n"
-#~ "Leagan m๓r "
-
-#~ msgid ""
-#~ "\n"
-#~ "Normal version "
-#~ msgstr ""
-#~ "\n"
-#~ "Leagan coitianta "
-
-#~ msgid ""
-#~ "\n"
-#~ "Small version "
-#~ msgstr ""
-#~ "\n"
-#~ "Leagan beag "
-
-#~ msgid ""
-#~ "\n"
-#~ "Tiny version "
-#~ msgstr ""
-#~ "\n"
-#~ "Leagan beag bํdeach "
-
-#~ msgid "with GTK2-GNOME GUI."
-#~ msgstr "le GUI GTK2-GNOME."
-
#~ msgid "with GTK-GNOME GUI."
#~ msgstr "le GUI GTK-GNOME."
-#~ msgid "with GTK2 GUI."
-#~ msgstr "le GUI GTK2."
-
-#~ msgid "with GTK GUI."
-#~ msgstr "le GUI GTK."
-
-#~ msgid "with X11-Motif GUI."
-#~ msgstr "le GUI X11-Motif."
-
-#~ msgid "with X11-neXtaw GUI."
-#~ msgstr "le GUI X11-neXtaw."
-
-#~ msgid "with X11-Athena GUI."
-#~ msgstr "le GUI X11-Athena."
-
-#~ msgid "with Photon GUI."
-#~ msgstr "le GUI Photon."
-
-#~ msgid "with GUI."
-#~ msgstr "le GUI."
-
-#~ msgid "with Carbon GUI."
-#~ msgstr "le GUI Carbon."
-
-#~ msgid "with Cocoa GUI."
-#~ msgstr "le GUI Cocoa."
-
-#~ msgid "with (classic) GUI."
-#~ msgstr "le GUI (clasaiceach)."
-
-#~ msgid " system gvimrc file: \""
-#~ msgstr " comhad gvimrc c๓rais: \""
-
-#~ msgid " user gvimrc file: \""
-#~ msgstr " comhad gvimrc ๚sแideora: \""
-
-#~ msgid "2nd user gvimrc file: \""
-#~ msgstr "dara comhad gvimrc ๚sแideora: \""
-
-#~ msgid "3rd user gvimrc file: \""
-#~ msgstr "trํ๚ comhad gvimrc ๚sแideora: \""
-
-#~ msgid " system menu file: \""
-#~ msgstr " comhad roghchlแir an ch๓rais: \""
-
-#~ msgid "Compiler: "
-#~ msgstr "Tiomsaitheoir: "
-
-# don't see where to localize "Help->Orphans"? --kps
-#~ msgid "menu Help->Orphans for information "
-#~ msgstr "roghchlแr Help->Orphans chun eolas a fhแil "
-
-#~ msgid "Running modeless, typed text is inserted"
-#~ msgstr "ม rith gan mh๓id, ag ionsแ an t้acs atแ iontrแilte"
-
-# same problem --kps
-#~ msgid "menu Edit->Global Settings->Toggle Insert Mode "
-#~ msgstr "roghchlแr Edit->Global Settings->Toggle Insert Mode "
-
-#~ msgid " for two modes "
-#~ msgstr " do dhแ mh๓d "
-
-# same problem --kps
-#~ msgid "menu Edit->Global Settings->Toggle Vi Compatible"
-#~ msgstr "roghchlแr Edit->Global Settings->Toggle Vi Compatible"
-
-#~ msgid " for Vim defaults "
-#~ msgstr " le haghaidh r้amhshocruithe Vim "
-
-#~ msgid "WARNING: Windows 95/98/ME detected"
-#~ msgstr "RABHADH: Braitheadh Windows 95/98/ME"
-
-#~ msgid "type :help windows95<Enter> for info on this"
-#~ msgstr "cl๓scrํobh :help windows95<Enter> chun eolas a fhแil "
-
-#~ msgid "E370: Could not load library %s"
-#~ msgstr "E370: Nํorbh fh้idir an leabharlann %s a oscailt"
-
-#~ msgid ""
-#~ "Sorry, this command is disabled: the Perl library could not be loaded."
-#~ msgstr ""
-#~ "Tแ br๓n orm, nํl an t-ord๚ seo le fแil: nํorbh fh้idir an leabharlann "
-#~ "Perl a lucht๚."
-
-#~ msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
-#~ msgstr ""
-#~ "E299: Nํ cheadaํtear luachแil Perl i mbosca gainimh gan an mod๚l Safe"
-
-#~ msgid "Edit with &multiple Vims"
-#~ msgstr "Cuir in eagar le Vimeanna io&mad๚la"
-
-#~ msgid "Edit with single &Vim"
-#~ msgstr "Cuir in eagar le &Vim aonair"
-
-#~ msgid "Diff with Vim"
-#~ msgstr "Diff le Vim"
-
-#~ msgid "Edit with &Vim"
-#~ msgstr "Cuir in Eagar le &Vim"
-
-#~ msgid "Edit with existing Vim - "
-#~ msgstr "Cuir in Eagar le Vim beo - "
-
-#~ msgid "Edits the selected file(s) with Vim"
-#~ msgstr "Cuir an comhad roghnaithe in eagar le Vim"
-
-#~ msgid "Error creating process: Check if gvim is in your path!"
-#~ msgstr ""
-#~ "Earrแid agus pr๓iseas แ chruth๚: Deimhnigh go bhfuil gvim i do chonair!"
-
-#~ msgid "gvimext.dll error"
-#~ msgstr "earrแid gvimext.dll"
-
-#~ msgid "Path length too long!"
-#~ msgstr "Conair r๓fhada!"
-
-#~ msgid "E234: Unknown fontset: %s"
-#~ msgstr "E234: Tacar cl๓ anaithnid: %s"
-
-#~ msgid "E235: Unknown font: %s"
-#~ msgstr "E235: Cl๓fhoireann anaithnid: %s"
-
-#~ msgid "E236: Font \"%s\" is not fixed-width"
-#~ msgstr "E236: Nํ cl๓ aonleithid ้ \"%s\""
-
-#~ msgid "E448: Could not load library function %s"
-#~ msgstr "E448: Nํ f้idir feidhm %s leabharlainne a lucht๚"
-
-#~ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
-#~ msgstr ""
-#~ "E26: Nํl tacaํocht Eabhraise ar fแil: Nํor cumasaํodh ้ ag am tiomsaithe\n"
-
-#~ msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
-#~ msgstr ""
-#~ "E27: Nํl tacaํocht Pheirsise ar fแil: Nํor cumasaํodh ้ ag am tiomsaithe\n"
-
-#~ msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
-#~ msgstr ""
-#~ "E800: Nํl tacaํocht Araibise ar fแil: Nํor cumasaํodh ้ ag am tiomsaithe\n"
-
-#~ msgid "E247: no registered server named \"%s\""
-#~ msgstr "E247: nํl aon fhreastalaํ clแraithe leis an ainm \"%s\""
-
-#~ msgid "E233: cannot open display"
-#~ msgstr "E233: nํ f้idir an scแileแn a oscailt"
-
-#~ msgid "E449: Invalid expression received"
-#~ msgstr "E449: Fuarthas slonn neamhbhailํ"
-
-#~ msgid "E463: Region is guarded, cannot modify"
-#~ msgstr "E463: R้igi๚n cosanta, nํ f้idir ้ a athr๚"
-
-#~ msgid "E744: NetBeans does not allow changes in read-only files"
-#~ msgstr "E744: Nํ cheadaํonn NetBeans aon athr๚ i gcomhaid inl้ite amhแin"
-
#~ msgid "E569: maximum number of cscope connections reached"
#~ msgstr "E569: nํ cheadaํtear nํos m๓ nแ an lํon uasta nasc cscope"
@@ -8080,8 +7462,8 @@ msgstr "E446: Nํl ainm comhaid faoin ch๚rs๓ir"
#~ msgstr ""
#~ "Nํ m๓r do charachtar a ๚sแidtear ar SLASH a bheith ASCII; i %s lํne %d: %s"
-#~ msgid "%<PRId64> changes"
-#~ msgstr "%<PRId64> athr๚"
+#~ msgid "%ld changes"
+#~ msgstr "%ld athr๚"
#~ msgid "with KDE GUI."
#~ msgstr "le GUI KDE."
diff --git a/src/nvim/po/it.po b/src/nvim/po/it.po
index 084102da60..9d5709e1ab 100644
--- a/src/nvim/po/it.po
+++ b/src/nvim/po/it.po
@@ -1,6 +1,8 @@
-# Italian Translation for Vim
+# Italian translation for Vim
#
-# FIRST AUTHOR Antonio Colombo <azc100@gmail.com>, 2000
+# Antonio Colombo <azc100@gmail.com>, 2000
+# Vlad Sandrini <vlad.gently@gmail.com>, 2002
+# Luciano Montanaro <mikelima@cirulla.net>, 2006
#
# Ogni commento ่ benvenuto...
# Every remark is very welcome...
@@ -11,7 +13,7 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: vim 7.4\n"
+"Project-Id-Version: vim 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-02-11 12:10+0100\n"
"PO-Revision-Date: 2016-02-11 14:42+0200\n"
@@ -884,7 +886,6 @@ msgstr "E730: uso di Lista come Stringa"
msgid "E731: using Dictionary as a String"
msgstr "E731: uso di Dizionario come Stringa"
-# nuovo
msgid "E908: using an invalid value as a String"
msgstr "E908: uso di un valore non valido come Stringa"
@@ -1402,6 +1403,45 @@ msgstr "com: %s"
msgid "frame is zero"
msgstr "al livello zero"
+msgid "E901: gethostbyname() in channel_open()"
+msgstr "E901: gethostbyname() in channel_open()"
+
+msgid "E898: socket() in channel_open()"
+msgstr "E898: socket() in channel_open()"
+
+msgid "E903: received command with non-string argument"
+msgstr "E903: il comando ricevuto non aveva come argomento una stringa"
+
+msgid "E904: last argument for expr/call must be a number"
+msgstr "E904: l'ultimo argomento per espressione/chiamata dev'essere numerico"
+
+msgid "E904: third argument for call must be a list"
+msgstr "E904: il terzo argomento della chiamata dev'essere una Lista"
+
+msgid "+-%s%3ld line: "
+msgid_plural "+-%s%3ld lines: "
+msgstr[0] "+-%s%3ld riga: "
+msgstr[1] "+-%s%3ld righe: "
+
+#, c-format
+msgid "E905: received unknown command: %s"
+msgstr "E905: recevuto comando non conosciuto: %s"
+
+#, c-format
+msgid "E630: %s(): write while not connected"
+msgstr "E630: %s(): scrittura in mancanza di connessione"
+
+#, c-format
+msgid "E631: %s(): write failed"
+msgstr "E631: %s(): scrittura non riuscita"
+
+msgid "Oldval = \"%s\""
+msgstr "Vecchioval = \"%s\""
+
+#, c-format
+msgid "Newval = \"%s\""
+msgstr "Nuovoval = \"%s\""
+
#, c-format
msgid "frame at highest level: %d"
msgstr "al livello pi๙ alto: %d"
@@ -2493,7 +2533,7 @@ msgid ""
"--- Auto-Commands ---"
msgstr ""
"\n"
-"--- Auto-Comandi ---"
+"--- Autocomandi ---"
#: ../fileio.c:6293
#, c-format
@@ -2541,7 +2581,7 @@ msgstr "E490: Non trovo alcuna piegatura"
#: ../fold.c:544
msgid "E350: Cannot create fold with current 'foldmethod'"
-msgstr "E350: Non posso create piegatura con il 'foldmethod' in uso"
+msgstr "E350: Non posso creare piegatura con il 'foldmethod' in uso"
#: ../fold.c:546
msgid "E351: Cannot delete fold with current 'foldmethod'"
@@ -2704,11 +2744,6 @@ msgstr "E900: 'Job id' non valido"
msgid "E901: Job table is full"
msgstr "E901: Job table piena"
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr "E902: \"%s\" non ่ un esegubile"
-
#: ../globals.h:1024
#, c-format
msgid "E364: Library call failed for \"%s()\""
@@ -3415,11 +3450,11 @@ msgstr "-q [errorfile] apri file col primo errore"
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
-" uso:"
+" Uso:"
#: ../main.c:2189
msgid " vim [arguments] "
@@ -4294,10 +4329,6 @@ msgstr "riga %4ld:"
msgid "E354: Invalid register name: '%s'"
msgstr "E354: Nome registro non valido: '%s'"
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr "Manutentore messaggi: Vlad Sandrini <marco@sandrini.biz>"
-
#: ../message.c:986
msgid "Interrupt: "
msgstr "Interruzione: "
@@ -4821,10 +4852,20 @@ msgstr ""
"\n"
"Non posso impostare il contesto di sicurezza per "
+msgid "E954: 24-bit colors are not supported on this environment"
+msgstr "E954: colori a 24-bit non supportati in questo ambiente"
+
+#, c-format
+msgid "E151: No match: %s"
+msgstr "E151: Nessuna corrispondenza: %s"
+
#, c-format
msgid "Could not set security context %s for %s"
msgstr "Non posso impostare il contesto di sicurezza %s per %s"
+msgid "E934: Cannot jump to a buffer that does not have a name"
+msgstr "E934: Impossibile passare a un buffer che non ha un nome"
+
#, c-format
msgid "Could not get security context %s for %s. Removing it!"
msgstr "Non posso ottenere il contesto di sicurezza %s per %s. Lo rimuovo!"
@@ -5126,9 +5167,9 @@ msgstr "E876: (NFA regexp) Non c'่ spazio per immagazzinare l'intero NFA "
#: ../regexp_nfa.c:4571 ../regexp_nfa.c:4869
msgid ""
-"Could not open temporary log file for writing, displaying on stderr ... "
+"Could not open temporary log file for writing, displaying on stderr... "
msgstr ""
-"Non posso aprire il file temporaneo per la scrittura, mostro su stderr ... "
+"Non posso aprire il file temporaneo per la scrittura, mostro su stderr... "
#: ../regexp_nfa.c:4840
#, c-format
@@ -5360,15 +5401,23 @@ msgstr "E772: Il file ortografico ่ per versioni di Vim pi๙ recenti"
msgid "E770: Unsupported section in spell file"
msgstr "E770: Sezione non supportata nel file ortografico"
-#: ../spell.c:3762
+msgid "E944: Reverse range in character class"
+msgstr "E944: Intervallo invertito nella classe di caratteri"
+
+msgid "E945: Range too large in character class"
+msgstr "E945: Intervallo troppo ampio nella classe di caratteri"
+
+msgid "E926: Current location list was changed"
+msgstr "E926: La lista delle locazioni corrente ่ stata cambiata"
+
#, c-format
-msgid "Warning: region %s not supported"
-msgstr "Avviso: regione %s non supportata"
+msgid "E779: Old .sug file, needs to be updated: %s"
+msgstr "E779: File .sug obsoleto, ่ necessario aggiornarlo: %s"
#: ../spell.c:4550
#, c-format
-msgid "Reading affix file %s ..."
-msgstr "Lettura file affissi %s ..."
+msgid "Reading affix file %s..."
+msgstr "Lettura file affissi %s..."
#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
#, c-format
@@ -5530,8 +5579,8 @@ msgstr "Il valore di %s ่ diverso da quello usato in un altro file .aff"
#: ../spell.c:5602
#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "Lettura file dizionario %s ..."
+msgid "Reading dictionary file %s..."
+msgstr "Lettura file dizionario %s..."
#: ../spell.c:5611
#, c-format
@@ -5565,8 +5614,8 @@ msgstr "%d parole con caratteri non-ASCII ignorate in %s"
#: ../spell.c:6115
#, c-format
-msgid "Reading word file %s ..."
-msgstr "Lettura file parole %s ..."
+msgid "Reading word file %s..."
+msgstr "Lettura file parole %s..."
#: ../spell.c:6155
#, c-format
@@ -5635,8 +5684,8 @@ msgstr "Conteggio totale delle parole: %d"
#: ../spell.c:7655
#, c-format
-msgid "Writing suggestion file %s ..."
-msgstr "Scrivo file di suggerimenti %s ..."
+msgid "Writing suggestion file %s..."
+msgstr "Scrivo file di suggerimenti %s..."
#: ../spell.c:7707 ../spell.c:7927
#, c-format
@@ -5662,8 +5711,8 @@ msgstr "Avviso: specificati sia composizione sia NOBREAK"
#: ../spell.c:7920
#, c-format
-msgid "Writing spell file %s ..."
-msgstr "Scrivo file ortografico %s ..."
+msgid "Writing spell file %s..."
+msgstr "Scrivo file ortografico %s..."
#: ../spell.c:7925
msgid "Done!"
@@ -5723,11 +5772,6 @@ msgstr "E753: Non trovato: %s"
msgid "E778: This does not look like a .sug file: %s"
msgstr "E778: Questo non sembra un file .sug: %s"
-#: ../spell.c:9282
-#, c-format
-msgid "E779: Old .sug file, needs to be updated: %s"
-msgstr "E779: File .sug obsoleto, ่ necessario aggiornarlo: %s"
-
#: ../spell.c:9286
#, c-format
msgid "E780: .sug file is for newer version of Vim: %s"
diff --git a/src/nvim/po/ja.euc-jp.po b/src/nvim/po/ja.euc-jp.po
index 85042e3506..dc3c4368ab 100644
--- a/src/nvim/po/ja.euc-jp.po
+++ b/src/nvim/po/ja.euc-jp.po
@@ -1,10 +1,11 @@
+
# Japanese translation for Vim
#
# Do ":help uganda" in Vim to read copying and usage conditions.
# Do ":help credits" in Vim to see a list of people who contributed.
#
-# Copyright (C) 2001-2016 MURAOKA Taro <koron.kaoriya@gmail.com>,
-# vim-jp (http://vim-jp.org/)
+# Copyright (C) 2001-2018 MURAOKA Taro <koron.kaoriya@gmail.com>,
+# vim-jp <http://vim-jp.org/>
#
# THIS FILE IS DISTRIBUTED UNDER THE VIM LICENSE.
#
@@ -12,215 +13,188 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Vim 7.4\n"
+"Project-Id-Version: Vim 8.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-02-01 09:02+0900\n"
-"PO-Revision-Date: 2016-02-01 09:08+0900\n"
+"POT-Creation-Date: 2018-07-18 00:43+0900\n"
+"PO-Revision-Date: 2017-05-18 00:45+0900\n"
"Last-Translator: MURAOKA Taro <koron.kaoriya@gmail.com>\n"
-"Language-Team: vim-jp (https://github.com/vim-jp/lang-ja)\n"
-"Language: Japanese\n"
+"Language-Team: Japanese <https://github.com/vim-jp/lang-ja>\n"
+"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=euc-jp\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
-#: ../api/private/helpers.c:201
-#, fuzzy
-msgid "Unable to get option value"
-msgstr "ฅชฅืฅทฅ็ฅ๓คฮรอคฯผ่ฦภควคญคคปค๓"
+msgid "E831: bf_key_init() called with empty password"
+msgstr "E831: bf_key_init() คฌถ๕ฅัฅนฅ๏กผฅษควธฦคำฝะคตค์คคทคฟ"
-#: ../api/private/helpers.c:204
-msgid "internal error: unknown option type"
-msgstr "ฦโษ๔ฅจฅ้กผ: ฬครฮคฮฅชฅืฅทฅ็ฅ๓ทฟควคน"
+msgid "E820: sizeof(uint32_t) != 4"
+msgstr "E820: sizeof(uint32_t) != 4"
+
+msgid "E817: Blowfish big/little endian use wrong"
+msgstr "E817: Blowfishฐลนๆคฮฅำฅรฅฐ/ฅ๊ฅศฅ๋ฅจฅ๓ฅวฅฃฅขฅ๓คฌดึฐใครคฦคคคคน"
+
+msgid "E818: sha256 test failed"
+msgstr "E818: sha256คฮฅฦฅนฅศคหผบวิคทคคทคฟ"
+
+msgid "E819: Blowfish test failed"
+msgstr "E819: Blowfishฐลนๆคฮฅฦฅนฅศคหผบวิคทคคทคฟ"
-#: ../buffer.c:92
msgid "[Location List]"
msgstr "[ฅํฅฑกผฅทฅ็ฅ๓ฅ๊ฅนฅศ]"
-#: ../buffer.c:93
msgid "[Quickfix List]"
msgstr "[Quickfixฅ๊ฅนฅศ]"
-#: ../buffer.c:94
msgid "E855: Autocommands caused command to abort"
msgstr "E855: autocommandคฌฅณฅฅ๓ฅษคฮฤไป฿ค๒ฐ๚คญตฏคณคทคคทคฟ"
-#: ../buffer.c:135
msgid "E82: Cannot allocate any buffer, exiting..."
-msgstr "E82: ฅะฅรฅีฅกค๒1คฤคโบ๎ภฎควคญคสคคคฮคว, ฝชฮปคทคคน..."
+msgstr "E82: ฅะฅรฅีฅกค๒1คฤคโบ๎ภฎควคญคสคคคฮควกขฝชฮปคทคคน..."
-#: ../buffer.c:138
msgid "E83: Cannot allocate buffer, using other one..."
-msgstr "E83: ฅะฅรฅีฅกค๒บ๎ภฎควคญคสคคคฮคว, ยพคฮค๒ปศอัคทคคน..."
+msgstr "E83: ฅะฅรฅีฅกค๒บ๎ภฎควคญคสคคคฮควกขยพคฮค๒ปศอัคทคคน..."
+
+msgid "E931: Buffer cannot be registered"
+msgstr "E931: ฅะฅรฅีฅกค๒ละฯฟควคญคคปค๓"
+
+msgid "E937: Attempt to delete a buffer that is in use"
+msgstr "E937: ปศอัรๆคฮฅะฅรฅีฅกค๒บ๏ฝคทค่คฆคศป๎ค฿คคทคฟ"
-#: ../buffer.c:763
msgid "E515: No buffers were unloaded"
msgstr "E515: ฒ๒สคตค์คฟฅะฅรฅีฅกคฯคขค๊คคปค๓"
-#: ../buffer.c:765
msgid "E516: No buffers were deleted"
msgstr "E516: บ๏ฝคตค์คฟฅะฅรฅีฅกคฯคขค๊คคปค๓"
-#: ../buffer.c:767
msgid "E517: No buffers were wiped out"
msgstr "E517: วหดคตค์คฟฅะฅรฅีฅกคฯคขค๊คคปค๓"
-#: ../buffer.c:772
msgid "1 buffer unloaded"
msgstr "1 ธฤคฮฅะฅรฅีฅกคฌฒ๒สคตค์คคทคฟ"
-#: ../buffer.c:774
#, c-format
msgid "%d buffers unloaded"
msgstr "%d ธฤคฮฅะฅรฅีฅกคฌฒ๒สคตค์คคทคฟ"
-#: ../buffer.c:777
msgid "1 buffer deleted"
msgstr "1 ธฤคฮฅะฅรฅีฅกคฌบ๏ฝคตค์คคทคฟ"
-#: ../buffer.c:779
#, c-format
msgid "%d buffers deleted"
msgstr "%d ธฤคฮฅะฅรฅีฅกคฌบ๏ฝคตค์คคทคฟ"
-#: ../buffer.c:782
msgid "1 buffer wiped out"
msgstr "1 ธฤคฮฅะฅรฅีฅกคฌวหดคตค์คคทคฟ"
-#: ../buffer.c:784
#, c-format
msgid "%d buffers wiped out"
msgstr "%d ธฤคฮฅะฅรฅีฅกคฌวหดคตค์คคทคฟ"
-#: ../buffer.c:806
msgid "E90: Cannot unload last buffer"
msgstr "E90: บวธๅคฮฅะฅรฅีฅกคฯฒ๒สควคญคคปค๓"
-#: ../buffer.c:874
msgid "E84: No modified buffer found"
msgstr "E84: สันนคตค์คฟฅะฅรฅีฅกคฯคขค๊คคปค๓"
-#. back where we started, didn't find anything.
-#: ../buffer.c:903
msgid "E85: There is no listed buffer"
msgstr "E85: ฅ๊ฅนฅศษฝผจคตค์ค๋ฅะฅรฅีฅกคฯคขค๊คคปค๓"
-#: ../buffer.c:913
-#, c-format
-msgid "E86: Buffer %<PRId64> does not exist"
-msgstr "E86: ฅะฅรฅีฅก %<PRId64> คฯคขค๊คคปค๓"
-
-#: ../buffer.c:915
msgid "E87: Cannot go beyond last buffer"
msgstr "E87: บวธๅคฮฅะฅรฅีฅกค๒ฑคจคฦฐฦฐคฯควคญคคปค๓"
-#: ../buffer.c:917
msgid "E88: Cannot go before first buffer"
msgstr "E88: บวฝ้คฮฅะฅรฅีฅกค่ค๊มฐคุคฯฐฦฐควคญคคปค๓"
-#: ../buffer.c:945
#, c-format
-msgid ""
-"E89: No write since last change for buffer %<PRId64> (add ! to override)"
-msgstr "E89: ฅะฅรฅีฅก %<PRId64> คฮสันนคฯสยธคตค์คฦคคคคปค๓ (! ควสันนค๒วหด)"
+msgid "E89: No write since last change for buffer %ld (add ! to override)"
+msgstr "E89: ฅะฅรฅีฅก %ld คฮสันนคฯสยธคตค์คฦคคคคปค๓ (! ควสันนค๒วหด)"
+
+msgid "E948: Job still running (add ! to end the job)"
+msgstr "E948: ฅธฅ็ฅึคฯคคภผยนิรๆควคน (! ค๒ฤษฒรควฅธฅ็ฅึค๒ฝชฮป)"
+
+msgid "E37: No write since last change (add ! to override)"
+msgstr "E37: บวธๅคฮสันนคฌสยธคตค์คฦคคคคปค๓ (! ค๒ฤษฒรควสันนค๒วหด)"
+
+msgid "E948: Job still running"
+msgstr "E948: ฅธฅ็ฅึคฯคคภผยนิรๆควคน"
+
+msgid "E37: No write since last change"
+msgstr "E37: บวธๅคฮสันนคฌสยธคตค์คฦคคคคปค๓"
-#. wrap around (may cause duplicates)
-#: ../buffer.c:1423
msgid "W14: Warning: List of file names overflow"
msgstr "W14: ทูน๐: ฅีฅกฅคฅ๋ฬพคฮฅ๊ฅนฅศคฌฤนฒแคฎคคน"
-#: ../buffer.c:1555 ../quickfix.c:3361
#, c-format
-msgid "E92: Buffer %<PRId64> not found"
-msgstr "E92: ฅะฅรฅีฅก %<PRId64> คฌธซคฤคซค๊คคปค๓"
+msgid "E92: Buffer %ld not found"
+msgstr "E92: ฅะฅรฅีฅก %ld คฌธซคฤคซค๊คคปค๓"
-#: ../buffer.c:1798
#, c-format
msgid "E93: More than one match for %s"
msgstr "E93: %s คหสฃฟ๔คฮณบล๖คฌคขค๊คคทคฟ"
-#: ../buffer.c:1800
#, c-format
msgid "E94: No matching buffer for %s"
msgstr "E94: %s คหณบล๖คนค๋ฅะฅรฅีฅกคฯคขค๊คคปค๓ควคทคฟ"
-#: ../buffer.c:2161
#, c-format
-msgid "line %<PRId64>"
-msgstr "นิ %<PRId64>"
+msgid "line %ld"
+msgstr "นิ %ld"
-#: ../buffer.c:2233
msgid "E95: Buffer with this name already exists"
msgstr "E95: คณคฮฬพมฐคฮฅะฅรฅีฅกคฯด๛คหคขค๊คคน"
-#: ../buffer.c:2498
msgid " [Modified]"
msgstr " [สันนคขค๊]"
-#: ../buffer.c:2501
msgid "[Not edited]"
msgstr "[ฬคสิฝธ]"
-#: ../buffer.c:2504
msgid "[New file]"
msgstr "[ฟทฅีฅกฅคฅ๋]"
-#: ../buffer.c:2505
msgid "[Read errors]"
msgstr "[ฦษนฅจฅ้กผ]"
-#: ../buffer.c:2506 ../buffer.c:3217 ../fileio.c:1807 ../screen.c:4895
msgid "[RO]"
msgstr "[ฦษภ์]"
-#: ../buffer.c:2507 ../fileio.c:1807
msgid "[readonly]"
msgstr "[ฦษนภ์อั]"
-#: ../buffer.c:2524
#, c-format
msgid "1 line --%d%%--"
msgstr "1 นิ --%d%%--"
-#: ../buffer.c:2526
#, c-format
-msgid "%<PRId64> lines --%d%%--"
-msgstr "%<PRId64> นิ --%d%%--"
+msgid "%ld lines --%d%%--"
+msgstr "%ld นิ --%d%%--"
-#: ../buffer.c:2530
#, c-format
-msgid "line %<PRId64> of %<PRId64> --%d%%-- col "
-msgstr "นิ %<PRId64> (มดยฮ %<PRId64>) --%d%%-- col "
+msgid "line %ld of %ld --%d%%-- col "
+msgstr "นิ %ld (มดยฮ %ld) --%d%%-- col "
-#: ../buffer.c:2632 ../buffer.c:4292 ../memline.c:1554
msgid "[No Name]"
msgstr "[ฬตฬพ]"
-#. must be a help buffer
-#: ../buffer.c:2667
msgid "help"
msgstr "ฅุฅ๋ฅื"
-#: ../buffer.c:3225 ../screen.c:4883
msgid "[Help]"
msgstr "[ฅุฅ๋ฅื]"
-#: ../buffer.c:3254 ../screen.c:4887
msgid "[Preview]"
msgstr "[ฅืฅ์ฅำฅๅกผ]"
-#: ../buffer.c:3528
msgid "All"
msgstr "มดคฦ"
-#: ../buffer.c:3528
msgid "Bot"
msgstr "ห๖ศ๘"
-#: ../buffer.c:3531
msgid "Top"
msgstr "ภ่ฦฌ"
-#: ../buffer.c:4244
msgid ""
"\n"
"# Buffer list:\n"
@@ -228,11 +202,15 @@ msgstr ""
"\n"
"# ฅะฅรฅีฅกฅ๊ฅนฅศ:\n"
-#: ../buffer.c:4289
+msgid "E382: Cannot write, 'buftype' option is set"
+msgstr "E382: 'buftype' ฅชฅืฅทฅ็ฅ๓คฌภ฿ฤ๊คตค์คฦคคค๋คฮควฝ๑นคแคคปค๓"
+
+msgid "[Prompt]"
+msgstr "[ฅืฅํฅ๓ฅืฅศ]"
+
msgid "[Scratch]"
msgstr "[ฒผฝ๑คญ]"
-#: ../buffer.c:4529
msgid ""
"\n"
"--- Signs ---"
@@ -240,634 +218,385 @@ msgstr ""
"\n"
"--- ฅตฅคฅ๓ ---"
-#: ../buffer.c:4538
#, c-format
msgid "Signs for %s:"
msgstr "%s คฮฅตฅคฅ๓:"
-#: ../buffer.c:4543
#, c-format
-msgid " line=%<PRId64> id=%d name=%s"
-msgstr " นิ=%<PRId64> ผฑสฬปา=%d ฬพมฐ=%s"
+msgid " line=%ld id=%d name=%s"
+msgstr " นิ=%ld ผฑสฬปา=%d ฬพมฐ=%s"
-#: ../cursor_shape.c:68
-msgid "E545: Missing colon"
-msgstr "E545: ฅณฅํฅ๓คฌคขค๊คคปค๓"
+msgid "E902: Cannot connect to port"
+msgstr "E902: ฅกผฅศคหภยณควคญคคปค๓"
-#: ../cursor_shape.c:70 ../cursor_shape.c:94
-msgid "E546: Illegal mode"
-msgstr "E546: ษิภตคสฅโกผฅษควคน"
+msgid "E901: gethostbyname() in channel_open()"
+msgstr "E901: channel_open() ฦโคฮ gethostbyname() คฌผบวิคทคคทคฟ"
-#: ../cursor_shape.c:134
-msgid "E548: digit expected"
-msgstr "E548: ฟ๔รอคฌษฌอืควคน"
+msgid "E898: socket() in channel_open()"
+msgstr "E898: channel_open() ฦโคฮ socket() คฌผบวิคทคคทคฟ"
-#: ../cursor_shape.c:138
-msgid "E549: Illegal percentage"
-msgstr "E549: ษิภตคสฅักผฅปฅ๓ฅฦกผฅธควคน"
+msgid "E903: received command with non-string argument"
+msgstr "E903: ศ๓สธป๚ฮ๓คฮฐ๚ฟ๔คฮฅณฅฅ๓ฅษค๒ผ๕ฟฎคทคคทคฟ"
+
+msgid "E904: last argument for expr/call must be a number"
+msgstr "E904: expr/call คฮบวธๅคฮฐ๚ฟ๔คฯฟ๔ป๚ควคสคฑค์คะคสค๊คคปค๓"
+
+msgid "E904: third argument for call must be a list"
+msgstr "E904: call คฮ3ศึฬคฮฐ๚ฟ๔คฯฅ๊ฅนฅศทฟควคสคฑค์คะคสค๊คคปค๓"
-#: ../diff.c:146
#, c-format
-msgid "E96: Can not diff more than %<PRId64> buffers"
-msgstr "E96: %<PRId64> ฐสพๅคฮฅะฅรฅีฅกคฯdiffควคญคคปค๓"
+msgid "E905: received unknown command: %s"
+msgstr "E905: ฬครฮคฮฅณฅฅ๓ฅษค๒ผ๕ฟฎคทคคทคฟ: %s"
+
+#, c-format
+msgid "E630: %s(): write while not connected"
+msgstr "E630: %s(): ศ๓ภยณพ๕ยึควฝ๑คญนค฿คคทคฟ"
+
+#, c-format
+msgid "E631: %s(): write failed"
+msgstr "E631: %s(): ฝ๑คญนค฿คหผบวิคทคคทคฟ"
+
+#, c-format
+msgid "E917: Cannot use a callback with %s()"
+msgstr "E917: %s() คหฅณกผฅ๋ฅะฅรฅฏคฯปศคจคคปค๓"
+
+msgid "E912: cannot use ch_evalexpr()/ch_sendexpr() with a raw or nl channel"
+msgstr ""
+"E912: raw คไ nl ฅโกผฅษคฮฅมฅใฅอฅ๋คห ch_evalexpr()/ch_sendexpr() คฯปศคจคคปค๓"
+
+msgid "E906: not an open channel"
+msgstr "E906: ณซคคคฦคคคสคคฅมฅใฅอฅ๋ควคน"
+
+msgid "E920: _io file requires _name to be set"
+msgstr "E920: _io ฅีฅกฅคฅ๋คฯ _name คฮภ฿ฤ๊คฌษฌอืควคน"
+
+msgid "E915: in_io buffer requires in_buf or in_name to be set"
+msgstr "E915: in_io ฅะฅรฅีฅกคฯ in_buf คซ in_name คฮภ฿ฤ๊คฌษฌอืควคน"
+
+#, c-format
+msgid "E918: buffer must be loaded: %s"
+msgstr "E918: ฅะฅรฅีฅกคฌฅํกผฅษคตค์คฦคสคฑค์คะคสค๊คคปค๓: %s"
+
+msgid "E821: File is encrypted with unknown method"
+msgstr "E821: ฅีฅกฅคฅ๋คฌฬครฮคฮสหกควฐลนๆฒฝคตค์คฦคคคคน"
+
+msgid "Warning: Using a weak encryption method; see :help 'cm'"
+msgstr "ทูน๐: ผๅคคฐลนๆสหกค๒ปศครคฦคคคคน; :help 'cm' ค๒ปฒพศคทคฦคฏคภคตคค"
+
+msgid "Enter encryption key: "
+msgstr "ฐลนๆฒฝอัคฮฅญกผค๒ฦฮฯคทคฦคฏคภคตคค: "
+
+msgid "Enter same key again: "
+msgstr "คโคฆฐ์ลูฦฑคธฅญกผค๒ฦฮฯคทคฦคฏคภคตคค: "
+
+msgid "Keys don't match!"
+msgstr "ฅญกผคฌฐ์รืคทคคปค๓"
+
+msgid "[crypted]"
+msgstr "[ฐลนๆฒฝ]"
+
+#, c-format
+msgid "E720: Missing colon in Dictionary: %s"
+msgstr "E720: ผญฝ๑ทฟคหฅณฅํฅ๓คฌคขค๊คคปค๓: %s"
+
+#, c-format
+msgid "E721: Duplicate key in Dictionary: \"%s\""
+msgstr "E721: ผญฝ๑ทฟคหฝลสฃฅญกผคฌคขค๊คคน: \"%s\""
+
+#, c-format
+msgid "E722: Missing comma in Dictionary: %s"
+msgstr "E722: ผญฝ๑ทฟคหฅซฅ๓ฅคฌคขค๊คคปค๓: %s"
+
+#, c-format
+msgid "E723: Missing end of Dictionary '}': %s"
+msgstr "E723: ผญฝ๑ทฟคฮบวธๅคห '}' คฌคขค๊คคปค๓: %s"
+
+msgid "extend() argument"
+msgstr "extend() คฮฐ๚ฟ๔"
+
+#, c-format
+msgid "E737: Key already exists: %s"
+msgstr "E737: ฅญกผคฯด๛คหยธบ฿คทคคน: %s"
+
+#, c-format
+msgid "E96: Cannot diff more than %ld buffers"
+msgstr "E96: %ld ฐสพๅคฮฅะฅรฅีฅกคฯdiffควคญคคปค๓"
-#: ../diff.c:753
msgid "E810: Cannot read or write temp files"
msgstr "E810: ฐ์ปฅีฅกฅคฅ๋คฮฦษนคโคทคฏคฯฝ๑นคฌควคญคคปค๓"
-#: ../diff.c:755
msgid "E97: Cannot create diffs"
msgstr "E97: บนสฌค๒บ๎ภฎควคญคคปค๓"
-#: ../diff.c:966
+msgid "Patch file"
+msgstr "ฅัฅรฅมฅีฅกฅคฅ๋"
+
msgid "E816: Cannot read patch output"
msgstr "E816: patchคฮฝะฮฯค๒ฦษนคแคคปค๓"
-#: ../diff.c:1220
msgid "E98: Cannot read diff output"
msgstr "E98: diffคฮฝะฮฯค๒ฦษนคแคคปค๓"
-#: ../diff.c:2081
msgid "E99: Current buffer is not in diff mode"
msgstr "E99: ธฝบ฿คฮฅะฅรฅีฅกคฯบนสฌฅโกผฅษควคฯคขค๊คคปค๓"
-#: ../diff.c:2100
msgid "E793: No other buffer in diff mode is modifiable"
msgstr "E793: บนสฌฅโกผฅษควคขค๋ยพคฮฅะฅรฅีฅกคฯสันนควคญคคปค๓"
-#: ../diff.c:2102
msgid "E100: No other buffer in diff mode"
msgstr "E100: บนสฌฅโกผฅษควคขค๋ยพคฮฅะฅรฅีฅกคฯคขค๊คคปค๓"
-#: ../diff.c:2112
msgid "E101: More than two buffers in diff mode, don't know which one to use"
msgstr ""
"E101: บนสฌฅโกผฅษคฮฅะฅรฅีฅกคฌ2ธฤฐสพๅคขค๋คฮควกขคษค์ค๒ปศคฆคซฦรฤ๊ควคญคคปค๓"
-#: ../diff.c:2141
#, c-format
msgid "E102: Can't find buffer \"%s\""
msgstr "E102: ฅะฅรฅีฅก \"%s\" คฌธซคฤคซค๊คคปค๓"
-#: ../diff.c:2152
#, c-format
msgid "E103: Buffer \"%s\" is not in diff mode"
msgstr "E103: ฅะฅรฅีฅก \"%s\" คฯบนสฌฅโกผฅษควคฯคขค๊คคปค๓"
-#: ../diff.c:2193
msgid "E787: Buffer changed unexpectedly"
msgstr "E787: อฝดคปคบฅะฅรฅีฅกคฌสันนสันนคตค์คคทคฟ"
-#: ../digraph.c:1598
msgid "E104: Escape not allowed in digraph"
msgstr "E104: น็ป๚คหEscapeคฯปศอัควคญคคปค๓"
-#: ../digraph.c:1760
msgid "E544: Keymap file not found"
msgstr "E544: ฅญกผฅฅรฅืฅีฅกฅคฅ๋คฌธซคฤคซค๊คคปค๓"
-#: ../digraph.c:1785
msgid "E105: Using :loadkeymap not in a sourced file"
msgstr "E105: :source ควผ่นคเฅีฅกฅคฅ๋ฐสณฐควคฯ :loadkeymap ค๒ปศคจคคปค๓"
-#: ../digraph.c:1821
msgid "E791: Empty keymap entry"
msgstr "E791: ถ๕คฮฅญกผฅฅรฅืฅจฅ๓ฅศฅ๊"
-#: ../edit.c:82
msgid " Keyword completion (^N^P)"
msgstr " ฅญกผฅ๏กผฅษสไดฐ (^N^P)"
-#. ctrl_x_mode == 0, ^P/^N compl.
-#: ../edit.c:83
msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
msgstr " ^X ฅโกผฅษ (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-#: ../edit.c:85
msgid " Whole line completion (^L^N^P)"
msgstr " นิ(มดยฮ)สไดฐ (^L^N^P)"
-#: ../edit.c:86
msgid " File name completion (^F^N^P)"
msgstr " ฅีฅกฅคฅ๋ฬพสไดฐ (^F^N^P)"
-#: ../edit.c:87
msgid " Tag completion (^]^N^P)"
msgstr " ฅฟฅฐสไดฐ (^]^N^P)"
-#: ../edit.c:88
msgid " Path pattern completion (^N^P)"
msgstr " ฅัฅนฅัฅฟกผฅ๓สไดฐ (^N^P)"
-#: ../edit.c:89
msgid " Definition completion (^D^N^P)"
msgstr " ฤ๊ตมสไดฐ (^D^N^P)"
-#: ../edit.c:91
msgid " Dictionary completion (^K^N^P)"
msgstr " ผญฝ๑สไดฐ (^K^N^P)"
-#: ../edit.c:92
msgid " Thesaurus completion (^T^N^P)"
msgstr " ฅทฅฝกผฅ้ฅนสไดฐ (^T^N^P)"
-#: ../edit.c:93
msgid " Command-line completion (^V^N^P)"
msgstr " ฅณฅฅ๓ฅษฅ้ฅคฅ๓สไดฐ (^V^N^P)"
-#: ../edit.c:94
msgid " User defined completion (^U^N^P)"
msgstr " ฅๆกผฅถกผฤ๊ตมสไดฐ (^U^N^P)"
-#: ../edit.c:95
msgid " Omni completion (^O^N^P)"
msgstr " ฅชฅเฅหสไดฐ (^O^N^P)"
-#: ../edit.c:96
msgid " Spelling suggestion (s^N^P)"
msgstr " ฤึค๊ฝคภตธ๕สไ (s^N^P)"
-#: ../edit.c:97
msgid " Keyword Local completion (^N^P)"
msgstr " ถษฝ๊ฅญกผฅ๏กผฅษสไดฐ (^N^P)"
-#: ../edit.c:100
msgid "Hit end of paragraph"
msgstr "รสอ๎คฮบวธๅคหฅาฅรฅศ"
-#: ../edit.c:101
msgid "E839: Completion function changed window"
msgstr "E839: สไดึดุฟ๔คฌฅฆฅฃฅ๓ฅษฅฆค๒สันนคทคคทคฟ"
-#: ../edit.c:102
msgid "E840: Completion function deleted text"
msgstr "E840: สไดฐดุฟ๔คฌฅฦฅญฅนฅศค๒บ๏ฝคทคคทคฟ"
-#: ../edit.c:1847
msgid "'dictionary' option is empty"
msgstr "'dictionary' ฅชฅืฅทฅ็ฅ๓คฌถ๕ควคน"
-#: ../edit.c:1848
msgid "'thesaurus' option is empty"
msgstr "'thesaurus' ฅชฅืฅทฅ็ฅ๓คฌถ๕ควคน"
-#: ../edit.c:2655
#, c-format
msgid "Scanning dictionary: %s"
msgstr "ผญฝ๑ค๒ฅนฅญฅใฅ๓รๆ: %s"
-#: ../edit.c:3079
msgid " (insert) Scroll (^E/^Y)"
msgstr " (มฦ) ฅนฅฏฅํกผฅ๋(^E/^Y)"
-#: ../edit.c:3081
msgid " (replace) Scroll (^E/^Y)"
msgstr " (รึดน) ฅนฅฏฅํกผฅ๋ (^E/^Y)"
-#: ../edit.c:3587
#, c-format
msgid "Scanning: %s"
msgstr "ฅนฅญฅใฅ๓รๆ: %s"
-#: ../edit.c:3614
msgid "Scanning tags."
msgstr "ฅฟฅฐค๒ฅนฅญฅใฅ๓รๆ."
-#: ../edit.c:4519
+msgid "match in file"
+msgstr "ฅีฅกฅคฅ๋ฦโคฮฅฅรฅม"
+
msgid " Adding"
msgstr " ฤษฒรรๆ"
-#. showmode might reset the internal line pointers, so it must
-#. * be called before line = ml_get(), or when this address is no
-#. * longer needed. -- Acevedo.
-#.
-#: ../edit.c:4562
msgid "-- Searching..."
msgstr "-- ธกบ๗รๆ..."
-#: ../edit.c:4618
msgid "Back at original"
msgstr "ปฯคแคหฬแค๋"
-#: ../edit.c:4621
msgid "Word from other line"
msgstr "ยพคฮนิคฮรฑธ์"
-#: ../edit.c:4624
msgid "The only match"
msgstr "อฃฐ์คฮณบล๖"
-#: ../edit.c:4680
#, c-format
msgid "match %d of %d"
msgstr "%d ศึฬคฮณบล๖ (มดณบล๖ %d ธฤรๆ)"
-#: ../edit.c:4684
#, c-format
msgid "match %d"
msgstr "%d ศึฬคฮณบล๖"
-#: ../eval.c:137
msgid "E18: Unexpected characters in :let"
msgstr "E18: อฝดคปคฬสธป๚คฌ :let คหคขค๊คคทคฟ"
-#: ../eval.c:138
-#, c-format
-msgid "E684: list index out of range: %<PRId64>"
-msgstr "E684: ฅ๊ฅนฅศคฮฅคฅ๓ฅวฅรฅฏฅนคฌศฯฐฯณฐควคน: %<PRId64>"
-
-#: ../eval.c:139
#, c-format
msgid "E121: Undefined variable: %s"
msgstr "E121: ฬคฤ๊ตมคฮสัฟ๔ควคน: %s"
-#: ../eval.c:140
msgid "E111: Missing ']'"
msgstr "E111: ']' คฌธซคฤคซค๊คคปค๓"
-#: ../eval.c:141
-#, c-format
-msgid "E686: Argument of %s must be a List"
-msgstr "E686: %s คฮฐ๚ฟ๔คฯฅ๊ฅนฅศทฟควคสคฑค์คะคสค๊คคปค๓"
-
-#: ../eval.c:143
-#, c-format
-msgid "E712: Argument of %s must be a List or Dictionary"
-msgstr "E712: %s คฮฐ๚ฟ๔คฯฅ๊ฅนฅศทฟคคฟคฯผญฝ๑ทฟควคสคฑค์คะคสค๊คคปค๓"
-
-#: ../eval.c:144
-msgid "E713: Cannot use empty key for Dictionary"
-msgstr "E713: ผญฝ๑ทฟคหถ๕คฮฅญกผค๒ปศคฆคณคศคฯควคญคคปค๓"
-
-#: ../eval.c:145
-msgid "E714: List required"
-msgstr "E714: ฅ๊ฅนฅศทฟคฌษฌอืควคน"
-
-#: ../eval.c:146
-msgid "E715: Dictionary required"
-msgstr "E715: ผญฝ๑ทฟคฌษฌอืควคน"
-
-#: ../eval.c:147
-#, c-format
-msgid "E118: Too many arguments for function: %s"
-msgstr "E118: ดุฟ๔คฮฐ๚ฟ๔คฌยฟฒแคฎคคน: %s"
-
-#: ../eval.c:148
-#, c-format
-msgid "E716: Key not present in Dictionary: %s"
-msgstr "E716: ผญฝ๑ทฟคหฅญกผคฌยธบ฿คทคคปค๓: %s"
-
-#: ../eval.c:150
-#, c-format
-msgid "E122: Function %s already exists, add ! to replace it"
-msgstr "E122: ดุฟ๔ %s คฯฤ๊ตมบัควคน, บฦฤ๊ตมคนค๋คหคฯ ! ค๒ฤษฒรคทคฦคฏคภคตคค"
-
-#: ../eval.c:151
-msgid "E717: Dictionary entry already exists"
-msgstr "E717: ผญฝ๑ทฟฦโคหฅจฅ๓ฅศฅ๊คฌด๛คหยธบ฿คทคคน"
-
-#: ../eval.c:152
-msgid "E718: Funcref required"
-msgstr "E718: ดุฟ๔ปฒพศทฟคฌอืตแคตค์คคน"
-
-#: ../eval.c:153
msgid "E719: Cannot use [:] with a Dictionary"
msgstr "E719: [:] ค๒ผญฝ๑ทฟคศมศค฿น็ค๏คปคฦคฯปศคจคคปค๓"
-#: ../eval.c:154
#, c-format
msgid "E734: Wrong variable type for %s="
msgstr "E734: ฐคสครคฟทฟคฮสัฟ๔ควคน %s="
-#: ../eval.c:155
-#, c-format
-msgid "E130: Unknown function: %s"
-msgstr "E130: ฬครฮคฮดุฟ๔ควคน: %s"
-
-#: ../eval.c:156
#, c-format
msgid "E461: Illegal variable name: %s"
msgstr "E461: ษิภตคสสัฟ๔ฬพควคน: %s"
-#: ../eval.c:157
msgid "E806: using Float as a String"
msgstr "E806: ษโฦฐพฎฟ๔ลภฟ๔ค๒สธป๚ฮ๓คศคทคฦฐทครคฦคคคคน"
-#: ../eval.c:1830
msgid "E687: Less targets than List items"
msgstr "E687: ฅฟกผฅฒฅรฅศคฌฅ๊ฅนฅศทฟฦโคฮอืมวค่ค๊คโพฏคสคคควคน"
-#: ../eval.c:1834
msgid "E688: More targets than List items"
msgstr "E688: ฅฟกผฅฒฅรฅศคฌฅ๊ฅนฅศทฟฦโคฮอืมวค่ค๊คโยฟคคควคน"
-#: ../eval.c:1906
msgid "Double ; in list of variables"
msgstr "ฅ๊ฅนฅศทฟคฮรอคห2คฤฐสพๅคฮ ; คฌธกฝะคตค์คคทคฟ"
-#: ../eval.c:2078
#, c-format
msgid "E738: Can't list variables for %s"
msgstr "E738: %s คฮรอค๒ฐ์อ๗ษฝผจควคญคคปค๓"
-#: ../eval.c:2391
msgid "E689: Can only index a List or Dictionary"
msgstr "E689: ฅ๊ฅนฅศทฟคศผญฝ๑ทฟฐสณฐคฯฅคฅ๓ฅวฅรฅฏฅนปุฤ๊ควคญคคปค๓"
-#: ../eval.c:2396
msgid "E708: [:] must come last"
msgstr "E708: [:] คฯบวธๅควคสคฑค์คะคคคฑคคปค๓"
-#: ../eval.c:2439
msgid "E709: [:] requires a List value"
msgstr "E709: [:] คหคฯฅ๊ฅนฅศทฟคฮรอคฌษฌอืควคน"
-#: ../eval.c:2674
msgid "E710: List value has more items than target"
msgstr "E710: ฅ๊ฅนฅศทฟสัฟ๔คหฅฟกผฅฒฅรฅศค่ค๊คโยฟคคอืมวคฌคขค๊คคน"
-#: ../eval.c:2678
msgid "E711: List value has not enough items"
msgstr "E711: ฅ๊ฅนฅศทฟสัฟ๔คหฝฝสฌคสฟ๔คฮอืมวคฌคขค๊คคปค๓"
-#
-#: ../eval.c:2867
msgid "E690: Missing \"in\" after :for"
msgstr "E690: :for คฮธๅคห \"in\" คฌคขค๊คคปค๓"
-#: ../eval.c:3063
-#, c-format
-msgid "E107: Missing parentheses: %s"
-msgstr "E107: ฅซฅรฅณ '(' คฌคขค๊คคปค๓: %s"
-
-#: ../eval.c:3263
#, c-format
msgid "E108: No such variable: \"%s\""
msgstr "E108: คฝคฮสัฟ๔คฯคขค๊คคปค๓: \"%s\""
-#: ../eval.c:3333
+#, c-format
+msgid "E940: Cannot lock or unlock variable %s"
+msgstr "E940: สัฟ๔ %s คฯฅํฅรฅฏคคฟคฯฅขฅ๓ฅํฅรฅฏควคญคคปค๓"
+
msgid "E743: variable nested too deep for (un)lock"
msgstr "E743: (ฅขฅ๓)ฅํฅรฅฏคนค๋คหคฯสัฟ๔คฮฦค์ปาคฌฟผฒแคฎคคน"
-#: ../eval.c:3630
msgid "E109: Missing ':' after '?'"
msgstr "E109: '?' คฮธๅคห ':' คฌคขค๊คคปค๓"
-#: ../eval.c:3893
-msgid "E691: Can only compare List with List"
-msgstr "E691: ฅ๊ฅนฅศทฟคฯฅ๊ฅนฅศทฟคศคทคซศๆณำควคญคคปค๓"
-
-#: ../eval.c:3895
-msgid "E692: Invalid operation for Lists"
-msgstr "E692: ฅ๊ฅนฅศทฟคหคฯฬตธ๚คสมเบ๎ควคน"
-
-#: ../eval.c:3915
-msgid "E735: Can only compare Dictionary with Dictionary"
-msgstr "E735: ผญฝ๑ทฟคฯผญฝ๑ทฟคศคทคซศๆณำควคญคคปค๓"
-
-#: ../eval.c:3917
-msgid "E736: Invalid operation for Dictionary"
-msgstr "E736: ผญฝ๑ทฟคหคฯฬตธ๚คสมเบ๎ควคน"
-
-#: ../eval.c:3932
-msgid "E693: Can only compare Funcref with Funcref"
-msgstr "E693: ดุฟ๔ปฒพศทฟคฯดุฟ๔ปฒพศทฟคศคทคซศๆณำควคญคคปค๓"
-
-#: ../eval.c:3934
-msgid "E694: Invalid operation for Funcrefs"
-msgstr "E694: ดุฟ๔ปฒพศทฟคหคฯฬตธ๚คสมเบ๎ควคน"
-
-#: ../eval.c:4277
msgid "E804: Cannot use '%' with Float"
msgstr "E804: '%' ค๒ษโฦฐพฎฟ๔ลภฟ๔คศมศค฿น็ค๏คปคฦคฯปศคจคคปค๓"
-#: ../eval.c:4478
msgid "E110: Missing ')'"
msgstr "E110: ')' คฌธซคฤคซค๊คคปค๓"
-#: ../eval.c:4609
msgid "E695: Cannot index a Funcref"
msgstr "E695: ดุฟ๔ปฒพศทฟคฯฅคฅ๓ฅวฅรฅฏฅนควคญคคปค๓"
-#: ../eval.c:4839
+msgid "E909: Cannot index a special variable"
+msgstr "E909: ฦรผ์สัฟ๔คฯฅคฅ๓ฅวฅรฅฏฅนควคญคคปค๓"
+
#, c-format
msgid "E112: Option name missing: %s"
msgstr "E112: ฅชฅืฅทฅ็ฅ๓ฬพคฌคขค๊คคปค๓: %s"
-#: ../eval.c:4855
#, c-format
msgid "E113: Unknown option: %s"
msgstr "E113: ฬครฮคฮฅชฅืฅทฅ็ฅ๓ควคน: %s"
-#: ../eval.c:4904
#, c-format
msgid "E114: Missing quote: %s"
msgstr "E114: ฐ๚อัษไ (\") คฌคขค๊คคปค๓: %s"
-#: ../eval.c:5020
#, c-format
msgid "E115: Missing quote: %s"
msgstr "E115: ฐ๚อัษไ (') คฌคขค๊คคปค๓: %s"
-#: ../eval.c:5084
-#, c-format
-msgid "E696: Missing comma in List: %s"
-msgstr "E696: ฅ๊ฅนฅศทฟคหฅซฅ๓ฅคฌคขค๊คคปค๓: %s"
-
-#: ../eval.c:5091
-#, c-format
-msgid "E697: Missing end of List ']': %s"
-msgstr "E697: ฅ๊ฅนฅศทฟคฮบวธๅคห ']' คฌคขค๊คคปค๓: %s"
-
-#: ../eval.c:5807
msgid "Not enough memory to set references, garbage collection aborted!"
msgstr ""
"ฅฌกผฅูฅรฅธฅณฅ์ฅฏฅทฅ็ฅ๓ค๒รๆป฿คทคคทคฟ! ปฒพศค๒บ๎ภฎคนค๋คฮคหฅแฅโฅ๊คฌษิยญคทคคทคฟ"
-#: ../eval.c:6475
-#, c-format
-msgid "E720: Missing colon in Dictionary: %s"
-msgstr "E720: ผญฝ๑ทฟคหฅณฅํฅ๓คฌคขค๊คคปค๓: %s"
-
-#: ../eval.c:6499
-#, c-format
-msgid "E721: Duplicate key in Dictionary: \"%s\""
-msgstr "E721: ผญฝ๑ทฟคหฝลสฃฅญกผคฌคขค๊คคน: \"%s\""
-
-#: ../eval.c:6517
-#, c-format
-msgid "E722: Missing comma in Dictionary: %s"
-msgstr "E722: ผญฝ๑ทฟคหฅซฅ๓ฅคฌคขค๊คคปค๓: %s"
-
-#: ../eval.c:6524
-#, c-format
-msgid "E723: Missing end of Dictionary '}': %s"
-msgstr "E723: ผญฝ๑ทฟคฮบวธๅคห '}' คฌคขค๊คคปค๓: %s"
-
-#: ../eval.c:6555
msgid "E724: variable nested too deep for displaying"
msgstr "E724: ษฝผจคนค๋คหคฯสัฟ๔คฮฦค์ปาคฌฟผฒแคฎคคน"
-#: ../eval.c:7188
-#, c-format
-msgid "E740: Too many arguments for function %s"
-msgstr "E740: ดุฟ๔คฮฐ๚ฟ๔คฌยฟฒแคฎคคน: %s"
-
-#: ../eval.c:7190
-#, c-format
-msgid "E116: Invalid arguments for function %s"
-msgstr "E116: ดุฟ๔คฮฬตธ๚คสฐ๚ฟ๔ควคน: %s"
-
-#: ../eval.c:7377
-#, c-format
-msgid "E117: Unknown function: %s"
-msgstr "E117: ฬครฮคฮดุฟ๔ควคน: %s"
-
-#: ../eval.c:7383
-#, c-format
-msgid "E119: Not enough arguments for function: %s"
-msgstr "E119: ดุฟ๔คฮฐ๚ฟ๔คฌยญค๊คคปค๓: %s"
-
-#: ../eval.c:7387
-#, c-format
-msgid "E120: Using <SID> not in a script context: %s"
-msgstr "E120: ฅนฅฏฅ๊ฅืฅศฐสณฐคว<SID>คฌปศค๏ค์คคทคฟ: %s"
-
-#: ../eval.c:7391
-#, c-format
-msgid "E725: Calling dict function without Dictionary: %s"
-msgstr "E725: ผญฝ๑อัดุฟ๔คฌธฦคะค์คคทคฟคฌผญฝ๑คฌคขค๊คคปค๓: %s"
-
-#: ../eval.c:7453
-msgid "E808: Number or Float required"
-msgstr "E808: ฟ๔รอคซษโฦฐพฎฟ๔ลภฟ๔คฌษฌอืควคน"
-
-#: ../eval.c:7503
-msgid "add() argument"
-msgstr "add() คฮฐ๚ฟ๔"
-
-#: ../eval.c:7907
-msgid "E699: Too many arguments"
-msgstr "E699: ฐ๚ฟ๔คฌยฟฒแคฎคคน"
-
-#: ../eval.c:8073
-msgid "E785: complete() can only be used in Insert mode"
-msgstr "E785: complete() คฯมฦฅโกผฅษควคทคซอ๘อัควคญคคปค๓"
-
-#: ../eval.c:8156
-msgid "&Ok"
-msgstr "&Ok"
-
-#: ../eval.c:8676
-#, c-format
-msgid "E737: Key already exists: %s"
-msgstr "E737: ฅญกผคฯด๛คหยธบ฿คทคคน: %s"
-
-#: ../eval.c:8692
-msgid "extend() argument"
-msgstr "extend() คฮฐ๚ฟ๔"
-
-#: ../eval.c:8915
-msgid "map() argument"
-msgstr "map() คฮฐ๚ฟ๔"
-
-#: ../eval.c:8916
-msgid "filter() argument"
-msgstr "filter() คฮฐ๚ฟ๔"
-
-#: ../eval.c:9229
-#, c-format
-msgid "+-%s%3ld lines: "
-msgstr "+-%s%3ld นิ: "
-
-#: ../eval.c:9291
-#, c-format
-msgid "E700: Unknown function: %s"
-msgstr "E700: ฬครฮคฮดุฟ๔ควคน: %s"
-
-#: ../eval.c:10729
-msgid "called inputrestore() more often than inputsave()"
-msgstr "inputrestore() คฌ inputsave() ค่ค๊คโยฟคฏธฦคะค์คคทคฟ"
-
-#: ../eval.c:10771
-msgid "insert() argument"
-msgstr "insert() คฮฐ๚ฟ๔"
-
-#: ../eval.c:10841
-msgid "E786: Range not allowed"
-msgstr "E786: ศฯฐฯปุฤ๊คฯต๖ฒฤคตค์คฦคคคคปค๓"
-
-#: ../eval.c:11140
-msgid "E701: Invalid type for len()"
-msgstr "E701: len() คหคฯฬตธ๚คสทฟควคน"
-
-#: ../eval.c:11980
-msgid "E726: Stride is zero"
-msgstr "E726: ฅนฅศฅ้ฅคฅษ(มฐฟสฮฬ)คฌ 0 ควคน"
-
-#: ../eval.c:11982
-msgid "E727: Start past end"
-msgstr "E727: ณซปฯฐฬรึคฌฝชฮปฐฬรึค๒ฑคจคคทคฟ"
-
-#: ../eval.c:12024 ../eval.c:15297
-msgid "<empty>"
-msgstr "<ถ๕>"
-
-#: ../eval.c:12282
-msgid "remove() argument"
-msgstr "remove() คฮฐ๚ฟ๔"
-
-# Added at 10-Mar-2004.
-#: ../eval.c:12466
-msgid "E655: Too many symbolic links (cycle?)"
-msgstr "E655: ฅทฅ๓ฅฅ๊ฅรฅฏฅ๊ฅ๓ฅฏคฌยฟฒแคฎคคน (ฝดฤคทคฦคคค๋ฒฤวฝภญคฌคขค๊คคน)"
-
-#: ../eval.c:12593
-msgid "reverse() argument"
-msgstr "reverse() คฮฐ๚ฟ๔"
-
-#: ../eval.c:13721
-msgid "sort() argument"
-msgstr "sort() คฮฐ๚ฟ๔"
-
-#: ../eval.c:13721
-msgid "uniq() argument"
-msgstr "uniq() คฮฐ๚ฟ๔"
-
-#: ../eval.c:13776
-msgid "E702: Sort compare function failed"
-msgstr "E702: ฅฝกผฅศคฮศๆณำดุฟ๔คฌผบวิคทคคทคฟ"
-
-#: ../eval.c:13806
-msgid "E882: Uniq compare function failed"
-msgstr "E882: Uniq คฮศๆณำดุฟ๔คฌผบวิคทคคทคฟ"
-
-#: ../eval.c:14085
-msgid "(Invalid)"
-msgstr "(ฬตธ๚)"
-
-#: ../eval.c:14590
-msgid "E677: Error writing temp file"
-msgstr "E677: ฐ์ปฅีฅกฅคฅ๋ฝ๑นรๆคหฅจฅ้กผคฌศฏภธคทคคทคฟ"
-
-#: ../eval.c:16159
msgid "E805: Using a Float as a Number"
msgstr "E805: ษโฦฐพฎฟ๔ลภฟ๔ค๒ฟ๔รอคศคทคฦฐทครคฦคคคคน"
-#: ../eval.c:16162
msgid "E703: Using a Funcref as a Number"
-msgstr "E703: ดุฟ๔ปฒพศทฟค๒ฟ๔รอคศคทคฦฐทครคฦคคคคนกฃ"
+msgstr "E703: ดุฟ๔ปฒพศทฟค๒ฟ๔รอคศคทคฦฐทครคฦคคคคน"
-#: ../eval.c:16170
msgid "E745: Using a List as a Number"
msgstr "E745: ฅ๊ฅนฅศทฟค๒ฟ๔รอคศคทคฦฐทครคฦคคคคน"
-#: ../eval.c:16173
msgid "E728: Using a Dictionary as a Number"
msgstr "E728: ผญฝ๑ทฟค๒ฟ๔รอคศคทคฦฐทครคฦคคคคน"
+msgid "E910: Using a Job as a Number"
+msgstr "E910: ฅธฅ็ฅึค๒ฟ๔รอคศคทคฦฐทครคฦคคคคน"
+
+msgid "E913: Using a Channel as a Number"
+msgstr "E913: ฅมฅใฅอฅ๋ค๒ฟ๔รอคศคทคฦฐทครคฦคคคคน"
+
msgid "E891: Using a Funcref as a Float"
-msgstr "E891: ดุฟ๔ปฒพศทฟค๒ษโฦฐพฎฟ๔ลภฟ๔คศคทคฦฐทครคฦคคคคนกฃ"
+msgstr "E891: ดุฟ๔ปฒพศทฟค๒ษโฦฐพฎฟ๔ลภฟ๔คศคทคฦฐทครคฦคคคคน"
msgid "E892: Using a String as a Float"
msgstr "E892: สธป๚ฮ๓ค๒ษโฦฐพฎฟ๔ลภฟ๔คศคทคฦฐทครคฦคคคคน"
@@ -878,265 +607,306 @@ msgstr "E893: ฅ๊ฅนฅศทฟค๒ษโฦฐพฎฟ๔ลภฟ๔คศคทคฦฐทครคฦคคคคน"
msgid "E894: Using a Dictionary as a Float"
msgstr "E894: ผญฝ๑ทฟค๒ษโฦฐพฎฟ๔ลภฟ๔คศคทคฦฐทครคฦคคคคน"
-#: ../eval.c:16259
+msgid "E907: Using a special value as a Float"
+msgstr "E907: ฦรผ์รอค๒ษโฦฐพฎฟ๔ลภฟ๔คศคทคฦฐทครคฦคคคคน"
+
+msgid "E911: Using a Job as a Float"
+msgstr "E911: ฅธฅ็ฅึค๒ษโฦฐพฎฟ๔ลภฟ๔คศคทคฦฐทครคฦคคคคน"
+
+msgid "E914: Using a Channel as a Float"
+msgstr "E914: ฅมฅใฅอฅ๋ค๒ษโฦฐพฎฟ๔ลภฟ๔คศคทคฦฐทครคฦคคคคน"
+
msgid "E729: using Funcref as a String"
msgstr "E729: ดุฟ๔ปฒพศทฟค๒สธป๚ฮ๓คศคทคฦฐทครคฦคคคคน"
-#: ../eval.c:16262
msgid "E730: using List as a String"
msgstr "E730: ฅ๊ฅนฅศทฟค๒สธป๚ฮ๓คศคทคฦฐทครคฦคคคคน"
-#: ../eval.c:16265
msgid "E731: using Dictionary as a String"
msgstr "E731: ผญฝ๑ทฟค๒สธป๚ฮ๓คศคทคฦฐทครคฦคคคคน"
-#: ../eval.c:16619
-#, c-format
-msgid "E706: Variable type mismatch for: %s"
-msgstr "E706: สัฟ๔คฮทฟคฌฐ์รืคทคคปค๓: %s"
+msgid "E908: using an invalid value as a String"
+msgstr "E908: ฬตธ๚คสรอค๒สธป๚ฮ๓คศคทคฦฐทครคฦคคคคน"
-#: ../eval.c:16705
#, c-format
msgid "E795: Cannot delete variable %s"
msgstr "E795: สัฟ๔ %s ค๒บ๏ฝควคญคคปค๓"
-#: ../eval.c:16724
#, c-format
msgid "E704: Funcref variable name must start with a capital: %s"
msgstr "E704: ดุฟ๔ปฒพศทฟสัฟ๔ฬพคฯย็สธป๚ควปฯคค้คสคฑค์คะคสค๊คคปค๓: %s"
-#: ../eval.c:16732
#, c-format
msgid "E705: Variable name conflicts with existing function: %s"
msgstr "E705: สัฟ๔ฬพคฌด๛ยธคฮดุฟ๔ฬพคศพืฦอคทคคน: %s"
-#: ../eval.c:16763
#, c-format
msgid "E741: Value is locked: %s"
msgstr "E741: รอคฌฅํฅรฅฏคตค์คฦคคคคน: %s"
-#: ../eval.c:16764 ../eval.c:16769 ../message.c:1839
msgid "Unknown"
msgstr "ษิฬภ"
-#: ../eval.c:16768
#, c-format
msgid "E742: Cannot change value of %s"
msgstr "E742: %s คฮรอค๒สันนควคญคคปค๓"
-#: ../eval.c:16838
msgid "E698: variable nested too deep for making a copy"
msgstr "E698: ฅณฅิกผค๒ผ่ค๋คหคฯสัฟ๔คฮฦค์ปาคฌฟผฒแคฎคคน"
-#: ../eval.c:17249
-#, c-format
-msgid "E123: Undefined function: %s"
-msgstr "E123: ฬคฤ๊ตมคฮดุฟ๔ควคน: %s"
+msgid ""
+"\n"
+"# global variables:\n"
+msgstr ""
+"\n"
+"# ฅฐฅํกผฅะฅ๋สัฟ๔:\n"
-#: ../eval.c:17260
-#, c-format
-msgid "E124: Missing '(': %s"
-msgstr "E124: '(' คฌคขค๊คคปค๓: %s"
+msgid ""
+"\n"
+"\tLast set from "
+msgstr ""
+"\n"
+"\tบวธๅคหฅปฅรฅศคทคฟฅนฅฏฅ๊ฅืฅศ: "
-#: ../eval.c:17293
-msgid "E862: Cannot use g: here"
-msgstr "E862: คณคณควคฯ g: คฯปศคจคคปค๓"
+msgid "E691: Can only compare List with List"
+msgstr "E691: ฅ๊ฅนฅศทฟคฯฅ๊ฅนฅศทฟคศคทคซศๆณำควคญคคปค๓"
-#: ../eval.c:17312
-#, c-format
-msgid "E125: Illegal argument: %s"
-msgstr "E125: ษิภตคสฐ๚ฟ๔ควคน: %s"
+msgid "E692: Invalid operation for List"
+msgstr "E692: ฅ๊ฅนฅศทฟคหคฯฬตธ๚คสมเบ๎ควคน"
-#: ../eval.c:17323
-#, c-format
-msgid "E853: Duplicate argument name: %s"
-msgstr "E853: ฐ๚ฟ๔ฬพคฌฝลสฃคทคฦคคคคน: %s"
+msgid "E735: Can only compare Dictionary with Dictionary"
+msgstr "E735: ผญฝ๑ทฟคฯผญฝ๑ทฟคศคทคซศๆณำควคญคคปค๓"
-#: ../eval.c:17416
-msgid "E126: Missing :endfunction"
-msgstr "E126: :endfunction คฌคขค๊คคปค๓"
+msgid "E736: Invalid operation for Dictionary"
+msgstr "E736: ผญฝ๑ทฟคหคฯฬตธ๚คสมเบ๎ควคน"
-#: ../eval.c:17537
-#, c-format
-msgid "E707: Function name conflicts with variable: %s"
-msgstr "E707: ดุฟ๔ฬพคฌสัฟ๔ฬพคศพืฦอคทคคน: %s"
+msgid "E694: Invalid operation for Funcrefs"
+msgstr "E694: ดุฟ๔ปฒพศทฟคหคฯฬตธ๚คสมเบ๎ควคน"
-#: ../eval.c:17549
-#, c-format
-msgid "E127: Cannot redefine function %s: It is in use"
-msgstr "E127: ดุฟ๔ %s ค๒บฦฤ๊ตมควคญคคปค๓: ปศอัรๆควคน"
+msgid "map() argument"
+msgstr "map() คฮฐ๚ฟ๔"
+
+msgid "filter() argument"
+msgstr "filter() คฮฐ๚ฟ๔"
-#: ../eval.c:17604
#, c-format
-msgid "E746: Function name does not match script file name: %s"
-msgstr "E746: ดุฟ๔ฬพคฌฅนฅฏฅ๊ฅืฅศคฮฅีฅกฅคฅ๋ฬพคศฐ์รืคทคคปค๓: %s"
+msgid "E686: Argument of %s must be a List"
+msgstr "E686: %s คฮฐ๚ฟ๔คฯฅ๊ฅนฅศทฟควคสคฑค์คะคสค๊คคปค๓"
-#: ../eval.c:17716
-msgid "E129: Function name required"
-msgstr "E129: ดุฟ๔ฬพคฌอืตแคตค์คคน"
+msgid "E928: String required"
+msgstr "E928: สธป๚ฮ๓คฌษฌอืควคน"
-#: ../eval.c:17824
-#, c-format
-msgid "E128: Function name must start with a capital or \"s:\": %s"
-msgstr "E128: ดุฟ๔ฬพคฯย็สธป๚คซ \"s:\" ควปฯคค้คสคฑค์คะคสค๊คคปค๓: %s"
+msgid "E808: Number or Float required"
+msgstr "E808: ฟ๔รอคซษโฦฐพฎฟ๔ลภฟ๔คฌษฌอืควคน"
-#: ../eval.c:17833
-#, c-format
-msgid "E884: Function name cannot contain a colon: %s"
-msgstr "E884: ดุฟ๔ฬพคหคฯฅณฅํฅ๓คฯดคแค้ค์คคปค๓: %s"
+msgid "add() argument"
+msgstr "add() คฮฐ๚ฟ๔"
-#: ../eval.c:18336
-#, c-format
-msgid "E131: Cannot delete function %s: It is in use"
-msgstr "E131: ดุฟ๔ %s ค๒บ๏ฝควคญคคปค๓: ปศอัรๆควคน"
+msgid "E785: complete() can only be used in Insert mode"
+msgstr "E785: complete() คฯมฦฅโกผฅษควคทคซอ๘อัควคญคคปค๓"
-#: ../eval.c:18441
-msgid "E132: Function call depth is higher than 'maxfuncdepth'"
-msgstr "E132: ดุฟ๔ธฦฝะคฮฦค์ปาฟ๔คฌ 'maxfuncdepth' ค๒ฤถคจคคทคฟ"
+msgid "&Ok"
+msgstr "&Ok"
-#: ../eval.c:18568
#, c-format
-msgid "calling %s"
-msgstr "%s ค๒ผยนิรๆควคน"
+msgid "+-%s%3ld line: "
+msgid_plural "+-%s%3ld lines: "
+msgstr[0] "+-%s%3ld นิ: "
-#: ../eval.c:18651
#, c-format
-msgid "%s aborted"
-msgstr "%s คฌรๆรวคตค์คคทคฟ"
+msgid "E700: Unknown function: %s"
+msgstr "E700: ฬครฮคฮดุฟ๔ควคน: %s"
+
+msgid "E922: expected a dict"
+msgstr "E922: ผญฝ๑คฌดยิคตค์คฦคคคคน"
+
+msgid "E923: Second argument of function() must be a list or a dict"
+msgstr "E923: function() คฮย่ 2 ฐ๚ฟ๔คฯฅ๊ฅนฅศทฟคคฟคฯผญฝ๑ทฟควคสคฑค์คะคสค๊คคปค๓"
+
+msgid ""
+"&OK\n"
+"&Cancel"
+msgstr ""
+"ท่ฤ๊(&O)\n"
+"ฅญฅใฅ๓ฅปฅ๋(&C)"
+
+msgid "called inputrestore() more often than inputsave()"
+msgstr "inputrestore() คฌ inputsave() ค่ค๊คโยฟคฏธฦคะค์คคทคฟ"
+
+msgid "insert() argument"
+msgstr "insert() คฮฐ๚ฟ๔"
+
+msgid "E786: Range not allowed"
+msgstr "E786: ศฯฐฯปุฤ๊คฯต๖ฒฤคตค์คฦคคคคปค๓"
+
+msgid "E916: not a valid job"
+msgstr "E916: อญธ๚คสฅธฅ็ฅึควคฯคขค๊คคปค๓"
+
+msgid "E701: Invalid type for len()"
+msgstr "E701: len() คหคฯฬตธ๚คสทฟควคน"
-#: ../eval.c:18653
#, c-format
-msgid "%s returning #%<PRId64>"
-msgstr "%s คฌ #%<PRId64> ค๒สึคทคคทคฟ"
+msgid "E798: ID is reserved for \":match\": %ld"
+msgstr "E798: ID คฯ \":match\" คฮคฟคแคหอฝฬ๓คตค์คฦคคคคน: %ld"
+
+msgid "E726: Stride is zero"
+msgstr "E726: ฅนฅศฅ้ฅคฅษ(มฐฟสฮฬ)คฌ 0 ควคน"
+
+msgid "E727: Start past end"
+msgstr "E727: ณซปฯฐฬรึคฌฝชฮปฐฬรึค๒ฑคจคคทคฟ"
+
+msgid "<empty>"
+msgstr "<ถ๕>"
+
+msgid "E240: No connection to the X server"
+msgstr "E240: X ฅตกผฅะกผคุคฮภยณคฌคขค๊คคปค๓"
-#: ../eval.c:18670
#, c-format
-msgid "%s returning %s"
-msgstr "%s คฌ %s ค๒สึคทคคทคฟ"
+msgid "E241: Unable to send to %s"
+msgstr "E241: %s คุม๗ค๋คณคศคฌควคญคคปค๓"
+
+msgid "E277: Unable to read a server reply"
+msgstr "E277: ฅตกผฅะกผคฮฑล๚คฌคขค๊คคปค๓"
+
+msgid "E941: already started a server"
+msgstr "E941: ฅตกผฅะกผคฯคนควคหณซปฯคทคฦคคคคน"
+
+msgid "E942: +clientserver feature not available"
+msgstr "E942: +clientserver ตกวฝคฌฬตธ๚คหคสครคฦคคคคน"
+
+msgid "remove() argument"
+msgstr "remove() คฮฐ๚ฟ๔"
+
+# Added at 10-Mar-2004.
+msgid "E655: Too many symbolic links (cycle?)"
+msgstr "E655: ฅทฅ๓ฅฅ๊ฅรฅฏฅ๊ฅ๓ฅฏคฌยฟฒแคฎคคน (ฝดฤคทคฦคคค๋ฒฤวฝภญคฌคขค๊คคน)"
+
+msgid "reverse() argument"
+msgstr "reverse() คฮฐ๚ฟ๔"
+
+msgid "E258: Unable to send to client"
+msgstr "E258: ฅฏฅ้ฅคฅขฅ๓ฅศคุม๗ค๋คณคศคฌควคญคคปค๓"
-#: ../eval.c:18691 ../ex_cmds2.c:2695
#, c-format
-msgid "continuing in %s"
-msgstr "%s คฮผยนิค๒ทัยณรๆควคน"
+msgid "E927: Invalid action: '%s'"
+msgstr "E927: ฬตธ๚คสมเบ๎ควคน: %s"
-#: ../eval.c:18795
-msgid "E133: :return not inside a function"
-msgstr "E133: ดุฟ๔ณฐคห :return คฌคขค๊คคทคฟ"
+msgid "sort() argument"
+msgstr "sort() คฮฐ๚ฟ๔"
-#: ../eval.c:19159
-msgid ""
-"\n"
-"# global variables:\n"
-msgstr ""
-"\n"
-"# ฅฐฅํกผฅะฅ๋สัฟ๔:\n"
+msgid "uniq() argument"
+msgstr "uniq() คฮฐ๚ฟ๔"
-#: ../eval.c:19254
-msgid ""
-"\n"
-"\tLast set from "
-msgstr ""
-"\n"
-"\tLast set from "
+msgid "E702: Sort compare function failed"
+msgstr "E702: ฅฝกผฅศคฮศๆณำดุฟ๔คฌผบวิคทคคทคฟ"
-#: ../eval.c:19272
-msgid "No old files"
-msgstr "ธลคคฅีฅกฅคฅ๋คฯคขค๊คคปค๓"
+msgid "E882: Uniq compare function failed"
+msgstr "E882: Uniq คฮศๆณำดุฟ๔คฌผบวิคทคคทคฟ"
+
+msgid "(Invalid)"
+msgstr "(ฬตธ๚)"
+
+#, c-format
+msgid "E935: invalid submatch number: %d"
+msgstr "E935: ฬตธ๚คสฅตฅึฅฅรฅมศึนๆ: %d"
+
+msgid "E677: Error writing temp file"
+msgstr "E677: ฐ์ปฅีฅกฅคฅ๋ฝ๑นรๆคหฅจฅ้กผคฌศฏภธคทคคทคฟ"
+
+msgid "E921: Invalid callback argument"
+msgstr "E921: ฬตธ๚คสฅณกผฅ๋ฅะฅรฅฏฐ๚ฟ๔ควคน"
+
+#, c-format
+msgid "<%s>%s%s %d, Hex %02x, Oct %03o, Digr %s"
+msgstr "<%s>%s%s %d, 16ฟสฟ๔ %02x, 8ฟสฟ๔ %03o, ฅภฅคฅฐฅ้ฅี %s"
-#: ../ex_cmds.c:122
#, c-format
msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
msgstr "<%s>%s%s %d, 16ฟสฟ๔ %02x, 8ฟสฟ๔ %03o"
-#: ../ex_cmds.c:145
+#, c-format
+msgid "> %d, Hex %04x, Oct %o, Digr %s"
+msgstr "> %d, 16ฟสฟ๔ %04x, 8ฟสฟ๔ %o, ฅภฅคฅฐฅ้ฅี %s"
+
+#, c-format
+msgid "> %d, Hex %08x, Oct %o, Digr %s"
+msgstr "> %d, 16ฟสฟ๔ %08x, 8ฟสฟ๔ %o, ฅภฅคฅฐฅ้ฅี %s"
+
#, c-format
msgid "> %d, Hex %04x, Octal %o"
msgstr "> %d, 16ฟสฟ๔ %04x, 8ฟสฟ๔ %o"
-#: ../ex_cmds.c:146
#, c-format
msgid "> %d, Hex %08x, Octal %o"
msgstr "> %d, 16ฟสฟ๔ %08x, 8ฟสฟ๔ %o"
-#: ../ex_cmds.c:684
msgid "E134: Move lines into themselves"
msgstr "E134: นิค๒คฝค์ผซฟศคหคฯฐฦฐควคญคคปค๓"
-#: ../ex_cmds.c:747
msgid "1 line moved"
msgstr "1 นิคฌฐฦฐคตค์คคทคฟ"
-#: ../ex_cmds.c:749
#, c-format
-msgid "%<PRId64> lines moved"
-msgstr "%<PRId64> นิคฌฐฦฐคตค์คคทคฟ"
+msgid "%ld lines moved"
+msgstr "%ld นิคฌฐฦฐคตค์คคทคฟ"
-#: ../ex_cmds.c:1175
#, c-format
-msgid "%<PRId64> lines filtered"
-msgstr "%<PRId64> นิคฌฅีฅฃฅ๋ฅฟฝ่อคตค์คคทคฟ"
+msgid "%ld lines filtered"
+msgstr "%ld นิคฌฅีฅฃฅ๋ฅฟฝ่อคตค์คคทคฟ"
-#: ../ex_cmds.c:1194
msgid "E135: *Filter* Autocommands must not change current buffer"
msgstr "E135: *ฅีฅฃฅ๋ฅฟ* autocommandคฯธฝบ฿คฮฅะฅรฅีฅกค๒สันนคทคฦคฯคคคฑคคปค๓"
-#: ../ex_cmds.c:1244
msgid "[No write since last change]\n"
msgstr "[บวธๅคฮสันนคฌสยธคตค์คฦคคคคปค๓]\n"
-#: ../ex_cmds.c:1424
#, c-format
msgid "%sviminfo: %s in line: "
msgstr "%sviminfo: %s นิฬ: "
-#: ../ex_cmds.c:1431
msgid "E136: viminfo: Too many errors, skipping rest of file"
-msgstr "E136: viminfo: ฅจฅ้กผคฌยฟฒแคฎค๋คฮคว, ฐสน฿คฯฅนฅญฅรฅืคทคคน"
+msgstr "E136: viminfo: ฅจฅ้กผคฌยฟฒแคฎค๋คฮควกขฐสน฿คฯฅนฅญฅรฅืคทคคน"
-#: ../ex_cmds.c:1458
#, c-format
msgid "Reading viminfo file \"%s\"%s%s%s"
msgstr "viminfoฅีฅกฅคฅ๋ \"%s\"%s%s%s ค๒ฦษนค฿รๆ"
-#: ../ex_cmds.c:1460
msgid " info"
msgstr " พ๐ส๓"
-#: ../ex_cmds.c:1461
msgid " marks"
msgstr " ฅกผฅฏ"
-#: ../ex_cmds.c:1462
msgid " oldfiles"
msgstr " ต์ฅีฅกฅคฅ๋ทฒ"
-#: ../ex_cmds.c:1463
msgid " FAILED"
msgstr " ผบวิ"
-#. avoid a wait_return for this message, it's annoying
-#: ../ex_cmds.c:1541
#, c-format
msgid "E137: Viminfo file is not writable: %s"
msgstr "E137: viminfoฅีฅกฅคฅ๋คฌฝ๑นค฿ควคญคคปค๓: %s"
-#: ../ex_cmds.c:1626
+#, c-format
+msgid "E929: Too many viminfo temp files, like %s!"
+msgstr "E929: ฐ์ปviminfoฅีฅกฅคฅ๋คฌยฟฒแคฎคคน! ฮใ: %s"
+
#, c-format
msgid "E138: Can't write viminfo file %s!"
msgstr "E138: viminfoฅีฅกฅคฅ๋ %s ค๒สยธควคญคคปค๓!"
-#: ../ex_cmds.c:1635
#, c-format
msgid "Writing viminfo file \"%s\""
msgstr "viminfoฅีฅกฅคฅ๋ \"%s\" ค๒ฝ๑นค฿รๆ"
-#. Write the info:
-#: ../ex_cmds.c:1720
+#, c-format
+msgid "E886: Can't rename viminfo file to %s!"
+msgstr "E886: viminfoฅีฅกฅคฅ๋ค๒ %s คุฬพมฐสันนควคญคคปค๓!"
+
#, c-format
msgid "# This viminfo file was generated by Vim %s.\n"
msgstr "# คณคฮ viminfo ฅีฅกฅคฅ๋คฯ Vim %s คหค่ครคฦภธภฎคตค์คคทคฟ.\n"
-#: ../ex_cmds.c:1722
msgid ""
"# You may edit it if you're careful!\n"
"\n"
@@ -1144,47 +914,47 @@ msgstr ""
"# สันนคนค๋บคหคฯฝฝสฌรํฐีคทคฦคฏคภคตคค!\n"
"\n"
-#: ../ex_cmds.c:1723
msgid "# Value of 'encoding' when this file was written\n"
msgstr "# คณคฮฅีฅกฅคฅ๋คฌฝ๑คซค์คฟปคฮ 'encoding' คฮรอ\n"
-#: ../ex_cmds.c:1800
msgid "Illegal starting char"
msgstr "ษิภตคสภ่ฦฌสธป๚ควคน"
-#: ../ex_cmds.c:2162
+msgid ""
+"\n"
+"# Bar lines, copied verbatim:\n"
+msgstr ""
+"\n"
+"# '|' ควปฯคค๋นิคฮกขสธป๚ฤฬค๊คฮฅณฅิกผ:\n"
+
+msgid "Save As"
+msgstr "สฬฬพควสยธ"
+
msgid "Write partial file?"
msgstr "ฅีฅกฅคฅ๋ค๒ษ๔สฌลชคหสยธคทคคนคซ?"
-#: ../ex_cmds.c:2166
msgid "E140: Use ! to write partial buffer"
msgstr "E140: ฅะฅรฅีฅกค๒ษ๔สฌลชคหสยธคนค๋คหคฯ ! ค๒ปศครคฦคฏคภคตคค"
-#: ../ex_cmds.c:2281
#, c-format
msgid "Overwrite existing file \"%s\"?"
msgstr "ด๛ยธคฮฅีฅกฅคฅ๋ \"%s\" ค๒พๅฝ๑คญคทคคนคซ?"
-#: ../ex_cmds.c:2317
#, c-format
msgid "Swap file \"%s\" exists, overwrite anyway?"
msgstr "ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋ \"%s\" คฌยธบ฿คทคคน. พๅฝ๑คญค๒ถฏภฉคทคคนคซ?"
-#: ../ex_cmds.c:2326
#, c-format
msgid "E768: Swap file exists: %s (:silent! overrides)"
msgstr "E768: ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คฌยธบ฿คทคคน: %s (:silent! ค๒ฤษฒรควพๅฝ๑)"
-#: ../ex_cmds.c:2381
#, c-format
-msgid "E141: No file name for buffer %<PRId64>"
-msgstr "E141: ฅะฅรฅีฅก %<PRId64> คหคฯฬพมฐคฌคขค๊คคปค๓"
+msgid "E141: No file name for buffer %ld"
+msgstr "E141: ฅะฅรฅีฅก %ld คหคฯฬพมฐคฌคขค๊คคปค๓"
-#: ../ex_cmds.c:2412
msgid "E142: File not written: Writing is disabled by 'write' option"
msgstr "E142: ฅีฅกฅคฅ๋คฯสยธคตค์คคปค๓ควคทคฟ: 'write' ฅชฅืฅทฅ็ฅ๓คหค่ค๊ฬตธ๚ควคน"
-#: ../ex_cmds.c:2434
#, c-format
msgid ""
"'readonly' option is set for \"%s\".\n"
@@ -1193,7 +963,6 @@ msgstr ""
"\"%s\" คหคฯ 'readonly' ฅชฅืฅทฅ็ฅ๓คฌภ฿ฤ๊คตค์คฦคคคคน.\n"
"พๅฝ๑คญถฏภฉค๒คทคคนคซ?"
-#: ../ex_cmds.c:2439
#, c-format
msgid ""
"File permissions of \"%s\" are read-only.\n"
@@ -1204,83 +973,68 @@ msgstr ""
"คฝค์ควคโถฒค้คฏฝ๑คญนคเคณคศคฯฒฤวฝควคน.\n"
"ทัยณคทคคนคซ?"
-#: ../ex_cmds.c:2451
#, c-format
msgid "E505: \"%s\" is read-only (add ! to override)"
msgstr "E505: \"%s\" คฯฦษนภ์อัควคน (ถฏภฉฝ๑นคหคฯ ! ค๒ฤษฒร)"
-#: ../ex_cmds.c:3120
+msgid "Edit File"
+msgstr "ฅีฅกฅคฅ๋ค๒สิฝธ"
+
#, c-format
msgid "E143: Autocommands unexpectedly deleted new buffer %s"
msgstr "E143: autocommandคฌอฝดคปคบฟทคทคคฅะฅรฅีฅก %s ค๒บ๏ฝคทคคทคฟ"
-#: ../ex_cmds.c:3313
msgid "E144: non-numeric argument to :z"
msgstr "E144: ฟ๔ควคฯคสคคฐ๚ฟ๔คฌ :z คหลฯคตค์คคทคฟ"
-#: ../ex_cmds.c:3404
msgid "E145: Shell commands not allowed in rvim"
msgstr "E145: rvimควคฯฅทฅงฅ๋ฅณฅฅ๓ฅษค๒ปศคจคคปค๓"
-#: ../ex_cmds.c:3498
msgid "E146: Regular expressions can't be delimited by letters"
msgstr "E146: ภตตฌษฝธฝคฯสธป๚ควถ่ภฺค๋คณคศคฌควคญคคปค๓"
-#: ../ex_cmds.c:3964
#, c-format
msgid "replace with %s (y/n/a/q/l/^E/^Y)?"
msgstr "%s คหรึดนคทคคนคซ? (y/n/a/q/l/^E/^Y)"
-#: ../ex_cmds.c:4379
msgid "(Interrupted) "
msgstr "(ณไนคค์คคทคฟ) "
-#: ../ex_cmds.c:4384
msgid "1 match"
msgstr "1 ฒีฝ๊ณบล๖คทคคทคฟ"
-#: ../ex_cmds.c:4384
msgid "1 substitution"
msgstr "1 ฒีฝ๊รึดนคทคคทคฟ"
-#: ../ex_cmds.c:4387
#, c-format
-msgid "%<PRId64> matches"
-msgstr "%<PRId64> ฒีฝ๊ณบล๖คทคคทคฟ"
+msgid "%ld matches"
+msgstr "%ld ฒีฝ๊ณบล๖คทคคทคฟ"
-#: ../ex_cmds.c:4388
#, c-format
-msgid "%<PRId64> substitutions"
-msgstr "%<PRId64> ฒีฝ๊รึดนคทคคทคฟ"
+msgid "%ld substitutions"
+msgstr "%ld ฒีฝ๊รึดนคทคคทคฟ"
-#: ../ex_cmds.c:4392
msgid " on 1 line"
msgstr " (ทื 1 นิฦโ)"
-#: ../ex_cmds.c:4395
#, c-format
-msgid " on %<PRId64> lines"
-msgstr " (ทื %<PRId64> นิฦโ)"
+msgid " on %ld lines"
+msgstr " (ทื %ld นิฦโ)"
-#: ../ex_cmds.c:4438
-msgid "E147: Cannot do :global recursive"
-msgstr "E147: :global ค๒บฦตขลชคหคฯปศคจคคปค๓"
+msgid "E147: Cannot do :global recursive with a range"
+msgstr "E147: :global ค๒ศฯฐฯษีคญควบฦตขลชคหคฯปศคจคคปค๓"
-#: ../ex_cmds.c:4467
msgid "E148: Regular expression missing from global"
msgstr "E148: globalฅณฅฅ๓ฅษคหภตตฌษฝธฝคฌปุฤ๊คตค์คฦคคคคปค๓"
-#: ../ex_cmds.c:4508
#, c-format
msgid "Pattern found in every line: %s"
msgstr "ฅัฅฟกผฅ๓คฌมดคฦคฮนิควธซคฤคซค๊คคทคฟ: %s"
-#: ../ex_cmds.c:4510
#, c-format
msgid "Pattern not found: %s"
msgstr "ฅัฅฟกผฅ๓คฯธซคฤคซค๊คคปค๓ควคทคฟ: %s"
-#: ../ex_cmds.c:4587
msgid ""
"\n"
"# Last Substitute String:\n"
@@ -1290,110 +1044,110 @@ msgstr ""
"# บวธๅคหรึดนคตค์คฟสธป๚ฮ๓:\n"
"$"
-#: ../ex_cmds.c:4679
msgid "E478: Don't panic!"
msgstr "E478: นฒคฦคสคคควคฏคภคตคค"
-#: ../ex_cmds.c:4717
#, c-format
msgid "E661: Sorry, no '%s' help for %s"
msgstr "E661: ปฤวฐควคนคฌ '%s' คฮฅุฅ๋ฅืคฌ %s คหคฯคขค๊คคปค๓"
-#: ../ex_cmds.c:4719
#, c-format
msgid "E149: Sorry, no help for %s"
msgstr "E149: ปฤวฐควคนคฌ %s คหคฯฅุฅ๋ฅืคฌคขค๊คคปค๓"
-#: ../ex_cmds.c:4751
#, c-format
msgid "Sorry, help file \"%s\" not found"
msgstr "ปฤวฐควคนคฌฅุฅ๋ฅืฅีฅกฅคฅ๋ \"%s\" คฌธซคฤคซค๊คคปค๓"
-#: ../ex_cmds.c:5323
#, c-format
-msgid "E150: Not a directory: %s"
-msgstr "E150: ฅวฅฃฅ์ฅฏฅศฅ๊ควคฯคขค๊คคปค๓: %s"
+msgid "E151: No match: %s"
+msgstr "E151: ฅฅรฅมคฯคขค๊คคปค๓: %s"
-#: ../ex_cmds.c:5446
#, c-format
msgid "E152: Cannot open %s for writing"
msgstr "E152: ฝ๑นค฿อัคห %s ค๒ณซคฑคคปค๓"
-#: ../ex_cmds.c:5471
#, c-format
msgid "E153: Unable to open %s for reading"
msgstr "E153: ฦษนอัคห %s ค๒ณซคฑคคปค๓"
# Added at 29-Apr-2004.
-#: ../ex_cmds.c:5500
#, c-format
msgid "E670: Mix of help file encodings within a language: %s"
msgstr "E670: 1คฤคฮธภธ์คฮฅุฅ๋ฅืฅีฅกฅคฅ๋คหสฃฟ๔คฮฅจฅ๓ฅณกผฅษคฌบฎบ฿คทคฦคคคคน: %s"
-#: ../ex_cmds.c:5565
#, c-format
msgid "E154: Duplicate tag \"%s\" in file %s/%s"
msgstr "E154: ฅฟฅฐ \"%s\" คฌฅีฅกฅคฅ๋ %s/%s คหฝลสฃคทคฦคคคคน"
-#: ../ex_cmds.c:5687
+#, c-format
+msgid "E150: Not a directory: %s"
+msgstr "E150: ฅวฅฃฅ์ฅฏฅศฅ๊ควคฯคขค๊คคปค๓: %s"
+
#, c-format
msgid "E160: Unknown sign command: %s"
msgstr "E160: ฬครฮคฮsignฅณฅฅ๓ฅษควคน: %s"
-#: ../ex_cmds.c:5704
msgid "E156: Missing sign name"
msgstr "E156: signฬพคฌคขค๊คคปค๓"
-#: ../ex_cmds.c:5746
msgid "E612: Too many signs defined"
msgstr "E612: signคฮฤ๊ตมคฌยฟฟ๔ธซคฤคซค๊คคทคฟ"
-#: ../ex_cmds.c:5813
#, c-format
msgid "E239: Invalid sign text: %s"
msgstr "E239: ฬตธ๚คสsignคฮฅฦฅญฅนฅศควคน: %s"
-#: ../ex_cmds.c:5844 ../ex_cmds.c:6035
#, c-format
msgid "E155: Unknown sign: %s"
msgstr "E155: ฬครฮคฮsignควคน: %s"
-#: ../ex_cmds.c:5877
msgid "E159: Missing sign number"
msgstr "E159: signคฮศึนๆคฌคขค๊คคปค๓"
-#: ../ex_cmds.c:5971
#, c-format
msgid "E158: Invalid buffer name: %s"
msgstr "E158: ฬตธ๚คสฅะฅรฅีฅกฬพควคน: %s"
-#: ../ex_cmds.c:6008
+msgid "E934: Cannot jump to a buffer that does not have a name"
+msgstr "E934: ฬพมฐคฮฬตคคฅะฅรฅีฅกคุคฯฅธฅใฅ๓ฅืควคญคคปค๓"
+
#, c-format
-msgid "E157: Invalid sign ID: %<PRId64>"
-msgstr "E157: ฬตธ๚คสsignผฑสฬปาควคน: %<PRId64>"
+msgid "E157: Invalid sign ID: %ld"
+msgstr "E157: ฬตธ๚คสsignผฑสฬปาควคน: %ld"
#, c-format
msgid "E885: Not possible to change sign %s"
msgstr "E885: สันนควคญคสคค sign ควคน: %s"
-#: ../ex_cmds.c:6066
+# Added at 27-Jan-2004.
+msgid " (NOT FOUND)"
+msgstr " (ธซคฤคซค๊คคปค๓)"
+
msgid " (not supported)"
msgstr " (ศ๓ฅตฅกผฅศ)"
-#: ../ex_cmds.c:6169
msgid "[Deleted]"
msgstr "[บ๏ฝบั]"
-#: ../ex_cmds2.c:139
+msgid "No old files"
+msgstr "ธลคคฅีฅกฅคฅ๋คฯคขค๊คคปค๓"
+
msgid "Entering Debug mode. Type \"cont\" to continue."
msgstr "ฅวฅะฅรฅฐฅโกผฅษคหฦค๊คคน. ยณคฑค๋คหคฯ \"cont\" คศฦฮฯคทคฦคฏคภคตคค."
-#: ../ex_cmds2.c:143 ../ex_docmd.c:759
#, c-format
-msgid "line %<PRId64>: %s"
-msgstr "นิ %<PRId64>: %s"
+msgid "Oldval = \"%s\""
+msgstr "ธลคครอ = \"%s\""
+
+#, c-format
+msgid "Newval = \"%s\""
+msgstr "ฟทคทคครอ = \"%s\""
+
+#, c-format
+msgid "line %ld: %s"
+msgstr "นิ %ld: %s"
-#: ../ex_cmds2.c:145
#, c-format
msgid "cmd: %s"
msgstr "ฅณฅฅ๓ฅษ: %s"
@@ -1405,232 +1159,199 @@ msgstr "ฅีฅ์กผฅเคฌ 0 ควคน"
msgid "frame at highest level: %d"
msgstr "บวนโฅ์ฅูฅ๋คฮฅีฅ์กผฅเ: %d"
-#: ../ex_cmds2.c:322
#, c-format
-msgid "Breakpoint in \"%s%s\" line %<PRId64>"
-msgstr "ฅึฅ์กผฅฏฅฅคฅ๓ฅศ \"%s%s\" นิ %<PRId64>"
+msgid "Breakpoint in \"%s%s\" line %ld"
+msgstr "ฅึฅ์กผฅฏฅฅคฅ๓ฅศ \"%s%s\" นิ %ld"
-#: ../ex_cmds2.c:581
#, c-format
msgid "E161: Breakpoint not found: %s"
msgstr "E161: ฅึฅ์กผฅฏฅฅคฅ๓ฅศคฌธซคฤคซค๊คคปค๓: %s"
-#: ../ex_cmds2.c:611
msgid "No breakpoints defined"
msgstr "ฅึฅ์กผฅฏฅฅคฅ๓ฅศคฌฤ๊ตมคตค์คฦคคคคปค๓"
-#: ../ex_cmds2.c:617
#, c-format
-msgid "%3d %s %s line %<PRId64>"
-msgstr "%3d %s %s นิ %<PRId64>"
+msgid "%3d %s %s line %ld"
+msgstr "%3d %s %s นิ %ld"
+
+#, c-format
+msgid "%3d expr %s"
+msgstr "%3d expr %s"
-#: ../ex_cmds2.c:942
msgid "E750: First use \":profile start {fname}\""
msgstr "E750: ฝ้คแคห \":profile start {fname}\" ค๒ผยนิคทคฦคฏคภคตคค"
-#: ../ex_cmds2.c:1269
#, c-format
msgid "Save changes to \"%s\"?"
msgstr "สันนค๒ \"%s\" คหสยธคทคคนคซ?"
-#: ../ex_cmds2.c:1271 ../ex_docmd.c:8851
-msgid "Untitled"
-msgstr "ฬตย๊"
+#, c-format
+msgid "E947: Job still running in buffer \"%s\""
+msgstr "E947: ฅธฅ็ฅึคฯฅะฅรฅีฅก \"%s\" ควคคภผยนิรๆควคน"
-#: ../ex_cmds2.c:1421
#, c-format
msgid "E162: No write since last change for buffer \"%s\""
msgstr "E162: ฅะฅรฅีฅก \"%s\" คฮสันนคฯสยธคตค์คฦคคคคปค๓"
-#: ../ex_cmds2.c:1480
msgid "Warning: Entered other buffer unexpectedly (check autocommands)"
msgstr "ทูน๐: อฝดคปคบยพฅะฅรฅีฅกคุฐฦฐคทคคทคฟ (autocommands ค๒ฤดคูคฦคฏคภคตคค)"
-#: ../ex_cmds2.c:1826
msgid "E163: There is only one file to edit"
msgstr "E163: สิฝธคนค๋ฅีฅกฅคฅ๋คฯ1คฤคทคซคขค๊คคปค๓"
-#: ../ex_cmds2.c:1828
msgid "E164: Cannot go before first file"
msgstr "E164: บวฝ้คฮฅีฅกฅคฅ๋ค่ค๊มฐคหคฯนิคฑคคปค๓"
-#: ../ex_cmds2.c:1830
msgid "E165: Cannot go beyond last file"
msgstr "E165: บวธๅคฮฅีฅกฅคฅ๋ค๒ฑคจคฦธๅคหคฯนิคฑคคปค๓"
-#: ../ex_cmds2.c:2175
#, c-format
msgid "E666: compiler not supported: %s"
msgstr "E666: คฝคฮฅณฅ๓ฅัฅคฅ้คหคฯยะฑคทคฦคคคคปค๓: %s"
-#: ../ex_cmds2.c:2257
#, c-format
msgid "Searching for \"%s\" in \"%s\""
msgstr "\"%s\" ค๒ \"%s\" คซค้ธกบ๗รๆ"
-#: ../ex_cmds2.c:2284
#, c-format
msgid "Searching for \"%s\""
msgstr "\"%s\" ค๒ธกบ๗รๆ"
-#: ../ex_cmds2.c:2307
#, c-format
-msgid "not found in 'runtimepath': \"%s\""
-msgstr "'runtimepath' คฮรๆคหคฯธซคฤคซค๊คคปค๓: \"%s\""
+msgid "not found in '%s': \"%s\""
+msgstr "'%s' คฮรๆคหคฯคขค๊คคปค๓: \"%s\""
+
+#, c-format
+msgid "W20: Required python version 2.x not supported, ignoring file: %s"
+msgstr "W20: อืตแคตค์คฟpython 2.xคฯยะฑคทคฦคคคคปค๓กขฅีฅกฅคฅ๋ค๒ฬตป๋คทคคน: %s"
+
+#, c-format
+msgid "W21: Required python version 3.x not supported, ignoring file: %s"
+msgstr "W21: อืตแคตค์คฟpython 3.xคฯยะฑคทคฦคคคคปค๓กขฅีฅกฅคฅ๋ค๒ฬตป๋คทคคน: %s"
+
+msgid "Source Vim script"
+msgstr "Vimฅนฅฏฅ๊ฅืฅศคฮผ่นค฿"
-#: ../ex_cmds2.c:2472
#, c-format
msgid "Cannot source a directory: \"%s\""
msgstr "ฅวฅฃฅ์ฅฏฅศฅ๊คฯผ่นคแคคปค๓: \"%s\""
-#: ../ex_cmds2.c:2518
#, c-format
msgid "could not source \"%s\""
msgstr "\"%s\" ค๒ผ่นคแคคปค๓"
-#: ../ex_cmds2.c:2520
#, c-format
-msgid "line %<PRId64>: could not source \"%s\""
-msgstr "นิ %<PRId64>: \"%s\" ค๒ผ่นคแคคปค๓"
+msgid "line %ld: could not source \"%s\""
+msgstr "นิ %ld: \"%s\" ค๒ผ่นคแคคปค๓"
-#: ../ex_cmds2.c:2535
#, c-format
msgid "sourcing \"%s\""
msgstr "\"%s\" ค๒ผ่นรๆ"
-#: ../ex_cmds2.c:2537
#, c-format
-msgid "line %<PRId64>: sourcing \"%s\""
-msgstr "นิ %<PRId64>: %s ค๒ผ่นรๆ"
+msgid "line %ld: sourcing \"%s\""
+msgstr "นิ %ld: %s ค๒ผ่นรๆ"
-#: ../ex_cmds2.c:2693
#, c-format
msgid "finished sourcing %s"
msgstr "%s คฮผ่นค๒ดฐฮป"
-#: ../ex_cmds2.c:2765
+#, c-format
+msgid "continuing in %s"
+msgstr "%s คฮผยนิค๒ทัยณรๆควคน"
+
msgid "modeline"
msgstr "ฅโกผฅษนิ"
-#: ../ex_cmds2.c:2767
msgid "--cmd argument"
msgstr "--cmd ฐ๚ฟ๔"
-#: ../ex_cmds2.c:2769
msgid "-c argument"
msgstr "-c ฐ๚ฟ๔"
-#: ../ex_cmds2.c:2771
msgid "environment variable"
msgstr "ดฤถญสัฟ๔"
-#: ../ex_cmds2.c:2773
msgid "error handler"
msgstr "ฅจฅ้กผฅฯฅ๓ฅษฅ้"
-#: ../ex_cmds2.c:3020
msgid "W15: Warning: Wrong line separator, ^M may be missing"
msgstr "W15: ทูน๐: นิถ่ภฺคฌษิภตควคน. ^M คฌคสคคคฮควคทค็คฆ"
-#: ../ex_cmds2.c:3139
msgid "E167: :scriptencoding used outside of a sourced file"
msgstr "E167: :scriptencoding คฌผ่นฅนฅฏฅ๊ฅืฅศฐสณฐควปศอัคตค์คคทคฟ"
-#: ../ex_cmds2.c:3166
msgid "E168: :finish used outside of a sourced file"
msgstr "E168: :finish คฌผ่นฅนฅฏฅ๊ฅืฅศฐสณฐควปศอัคตค์คคทคฟ"
-#: ../ex_cmds2.c:3389
#, c-format
msgid "Current %slanguage: \"%s\""
msgstr "ธฝบ฿คฮ %sธภธ์: \"%s\""
-#: ../ex_cmds2.c:3404
#, c-format
msgid "E197: Cannot set language to \"%s\""
msgstr "E197: ธภธ์ค๒ \"%s\" คหภ฿ฤ๊ควคญคคปค๓"
-#. don't redisplay the window
-#. don't wait for return
-#: ../ex_docmd.c:387
msgid "Entering Ex mode. Type \"visual\" to go to Normal mode."
msgstr ""
"Exฅโกผฅษคหฦค๊คคน. ฅฮกผฅฅ๋ฅโกผฅษคหฬแค๋คหคฯ\"visual\"คศฦฮฯคทคฦคฏคภคตคค."
-#: ../ex_docmd.c:428
msgid "E501: At end-of-file"
msgstr "E501: ฅีฅกฅคฅ๋คฮฝชฮปฐฬรึ"
-#: ../ex_docmd.c:513
msgid "E169: Command too recursive"
msgstr "E169: ฅณฅฅ๓ฅษคฌบฦตขลชฒแคฎคคน"
-#: ../ex_docmd.c:1006
#, c-format
msgid "E605: Exception not caught: %s"
msgstr "E605: ฮใณฐคฌสแยชคตค์คคปค๓ควคทคฟ: %s"
-#: ../ex_docmd.c:1085
msgid "End of sourced file"
msgstr "ผ่นฅีฅกฅคฅ๋คฮบวธๅควคน"
-#: ../ex_docmd.c:1086
msgid "End of function"
msgstr "ดุฟ๔คฮบวธๅควคน"
-#: ../ex_docmd.c:1628
msgid "E464: Ambiguous use of user-defined command"
msgstr "E464: ฅๆกผฅถกผฤ๊ตมฅณฅฅ๓ฅษคฮคขคคคคคคสปศอัควคน"
-#: ../ex_docmd.c:1638
msgid "E492: Not an editor command"
msgstr "E492: ฅจฅวฅฃฅฟคฮฅณฅฅ๓ฅษควคฯคขค๊คคปค๓"
-#: ../ex_docmd.c:1729
msgid "E493: Backwards range given"
msgstr "E493: ตีคตคคฮศฯฐฯคฌปุฤ๊คตค์คคทคฟ"
-#: ../ex_docmd.c:1733
msgid "Backwards range given, OK to swap"
-msgstr "ตีคตคคฮศฯฐฯคฌปุฤ๊คตค์คคทคฟ, ฦยุคจคคนคซ?"
+msgstr "ตีคตคคฮศฯฐฯคฌปุฤ๊คตค์คคทคฟกขฦยุคจคคนคซ?"
-#. append
-#. typed wrong
-#: ../ex_docmd.c:1787
msgid "E494: Use w or w>>"
msgstr "E494: w คโคทคฏคฯ w>> ค๒ปศอัคทคฦคฏคภคตคค"
-#: ../ex_docmd.c:3454
-msgid "E319: The command is not available in this version"
-msgstr "E319: คณคฮฅะกผฅธฅ็ฅ๓ควคฯคณคฮฅณฅฅ๓ฅษคฯอ๘อัควคญคคปค๓, คดคแค๓คสคตคค"
+msgid "E943: Command table needs to be updated, run 'make cmdidxs'"
+msgstr ""
+"E943: ฅณฅฅ๓ฅษฅฦกผฅึฅ๋ค๒นนฟทคนค๋ษฌอืคฌคขค๊คคนกข'make cmdidxs' ค๒ผยนิคทคฦคฏคภ"
+"คตคค"
-#: ../ex_docmd.c:3752
-msgid "E172: Only one file name allowed"
-msgstr "E172: ฅีฅกฅคฅ๋ฬพคฯ 1 คฤคหคทคฦคฏคภคตคค"
+msgid "E319: Sorry, the command is not available in this version"
+msgstr "E319: คณคฮฅะกผฅธฅ็ฅ๓ควคฯคณคฮฅณฅฅ๓ฅษคฯอ๘อัควคญคคปค๓กขคดคแค๓คสคตคค"
-#: ../ex_docmd.c:4238
msgid "1 more file to edit. Quit anyway?"
-msgstr "สิฝธคนคูคญฅีฅกฅคฅ๋คฌ 1 ธฤคขค๊คคนคฌ, ฝชฮปคทคคนคซ?"
+msgstr "สิฝธคนคูคญฅีฅกฅคฅ๋คฌ 1 ธฤคขค๊คคนคฌกขฝชฮปคทคคนคซ?"
-#: ../ex_docmd.c:4242
#, c-format
msgid "%d more files to edit. Quit anyway?"
-msgstr "สิฝธคนคูคญฅีฅกฅคฅ๋คฌคขคศ %d ธฤคขค๊คคนคฌ, ฝชฮปคทคคนคซ?"
+msgstr "สิฝธคนคูคญฅีฅกฅคฅ๋คฌคขคศ %d ธฤคขค๊คคนคฌกขฝชฮปคทคคนคซ?"
-#: ../ex_docmd.c:4248
msgid "E173: 1 more file to edit"
msgstr "E173: สิฝธคนคูคญฅีฅกฅคฅ๋คฌ 1 ธฤคขค๊คคน"
-#: ../ex_docmd.c:4250
#, c-format
-msgid "E173: %<PRId64> more files to edit"
-msgstr "E173: สิฝธคนคูคญฅีฅกฅคฅ๋คฌคขคศ %<PRId64> ธฤคขค๊คคน"
+msgid "E173: %ld more files to edit"
+msgstr "E173: สิฝธคนคูคญฅีฅกฅคฅ๋คฌคขคศ %ld ธฤคขค๊คคน"
-#: ../ex_docmd.c:4320
msgid "E174: Command already exists: add ! to replace it"
msgstr "E174: ฅณฅฅ๓ฅษคฌด๛คหคขค๊คคน: บฦฤ๊ตมคนค๋คหคฯ ! ค๒ฤษฒรคทคฦคฏคภคตคค"
-#: ../ex_docmd.c:4432
msgid ""
"\n"
" Name Args Address Complete Definition"
@@ -1638,51 +1359,40 @@ msgstr ""
"\n"
" ฬพมฐ ฐ๚ฟ๔ ฅขฅษฅ์ฅน สไดฐ ฤ๊ตม"
-#: ../ex_docmd.c:4516
msgid "No user-defined commands found"
msgstr "ฅๆกผฅถกผฤ๊ตมฅณฅฅ๓ฅษคฌธซคฤคซค๊คคปค๓ควคทคฟ"
-#: ../ex_docmd.c:4538
msgid "E175: No attribute specified"
msgstr "E175: ยฐภญคฯฤ๊ตมคตค์คฦคคคคปค๓"
-#: ../ex_docmd.c:4583
msgid "E176: Invalid number of arguments"
msgstr "E176: ฐ๚ฟ๔คฮฟ๔คฌฬตธ๚ควคน"
-#: ../ex_docmd.c:4594
msgid "E177: Count cannot be specified twice"
msgstr "E177: ฅซฅฆฅ๓ฅศค๒2ฝลปุฤ๊คนค๋คณคศคฯควคญคคปค๓"
-#: ../ex_docmd.c:4603
msgid "E178: Invalid default value for count"
msgstr "E178: ฅซฅฆฅ๓ฅศคฮพสฮฌรอคฌฬตธ๚ควคน"
-#: ../ex_docmd.c:4625
msgid "E179: argument required for -complete"
msgstr "E179: -complete คหคฯฐ๚ฟ๔คฌษฌอืควคน"
msgid "E179: argument required for -addr"
msgstr "E179: -addr คหคฯฐ๚ฟ๔คฌษฌอืควคน"
-#: ../ex_docmd.c:4635
#, c-format
msgid "E181: Invalid attribute: %s"
msgstr "E181: ฬตธ๚คสยฐภญควคน: %s"
-#: ../ex_docmd.c:4678
msgid "E182: Invalid command name"
msgstr "E182: ฬตธ๚คสฅณฅฅ๓ฅษฬพควคน"
-#: ../ex_docmd.c:4691
msgid "E183: User defined commands must start with an uppercase letter"
-msgstr "E183: ฅๆกผฅถฤ๊ตมฅณฅฅ๓ฅษคฯฑัย็สธป๚ควปฯคค้คสคฑค์คะคสค๊คคปค๓"
+msgstr "E183: ฅๆกผฅถกผฤ๊ตมฅณฅฅ๓ฅษคฯฑัย็สธป๚ควปฯคค้คสคฑค์คะคสค๊คคปค๓"
-#: ../ex_docmd.c:4696
msgid "E841: Reserved name, cannot be used for user defined command"
-msgstr "E841: อฝฬ๓ฬพคสคฮคว, ฅๆกผฅถกผฤ๊ตมฅณฅฅ๓ฅษคหอ๘อัควคญคคปค๓"
+msgstr "E841: อฝฬ๓ฬพคสคฮควกขฅๆกผฅถกผฤ๊ตมฅณฅฅ๓ฅษคหอ๘อัควคญคคปค๓"
-#: ../ex_docmd.c:4751
#, c-format
msgid "E184: No such user-defined command: %s"
msgstr "E184: คฝคฮฅๆกผฅถกผฤ๊ตมฅณฅฅ๓ฅษคฯคขค๊คคปค๓: %s"
@@ -1691,293 +1401,260 @@ msgstr "E184: คฝคฮฅๆกผฅถกผฤ๊ตมฅณฅฅ๓ฅษคฯคขค๊คคปค๓: %s"
msgid "E180: Invalid address type value: %s"
msgstr "E180: ฬตธ๚คสฅขฅษฅ์ฅนฅฟฅคฅืรอควคน: %s"
-#: ../ex_docmd.c:5219
#, c-format
msgid "E180: Invalid complete value: %s"
msgstr "E180: ฬตธ๚คสสไดฐปุฤ๊ควคน: %s"
-#: ../ex_docmd.c:5225
msgid "E468: Completion argument only allowed for custom completion"
msgstr "E468: สไดฐฐ๚ฟ๔คฯฅซฅนฅฟฅเสไดฐควคทคซปศอัควคญคคปค๓"
-#: ../ex_docmd.c:5231
msgid "E467: Custom completion requires a function argument"
msgstr "E467: ฅซฅนฅฟฅเสไดฐคหคฯฐ๚ฟ๔คศคทคฦดุฟ๔คฌษฌอืควคน"
-#: ../ex_docmd.c:5257
+msgid "unknown"
+msgstr "ษิฬภ"
+
#, c-format
msgid "E185: Cannot find color scheme '%s'"
msgstr "E185: ฅซฅ้กผฅนฅญกผฅเ '%s' คฌธซคฤคซค๊คคปค๓"
-#: ../ex_docmd.c:5263
msgid "Greetings, Vim user!"
msgstr "Vim ปศคคคตค๓กขคไคข!"
-#: ../ex_docmd.c:5431
msgid "E784: Cannot close last tab page"
msgstr "E784: บวธๅคฮฅฟฅึฅฺกผฅธค๒สฤคธค๋คณคศคฯควคญคคปค๓"
-#: ../ex_docmd.c:5462
msgid "Already only one tab page"
msgstr "ด๛คหฅฟฅึฅฺกผฅธคฯ1คฤคทคซคขค๊คคปค๓"
-#: ../ex_docmd.c:6004
+msgid "Edit File in new tab page"
+msgstr "ฟทคทคคฅฟฅึฅฺกผฅธควฅีฅกฅคฅ๋ค๒สิฝธคทคคน"
+
+msgid "Edit File in new window"
+msgstr "ฟทคทคคฅฆฅฃฅ๓ฅษฅฆควฅีฅกฅคฅ๋ค๒สิฝธคทคคน"
+
#, c-format
msgid "Tab page %d"
msgstr "ฅฟฅึฅฺกผฅธ %d"
-#: ../ex_docmd.c:6295
msgid "No swap file"
msgstr "ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คฌคขค๊คคปค๓"
-#: ../ex_docmd.c:6478
+msgid "Append File"
+msgstr "ฤษฒรฅีฅกฅคฅ๋"
+
msgid "E747: Cannot change directory, buffer is modified (add ! to override)"
msgstr ""
-"E747: ฅะฅรฅีฅกคฌฝคภตคตค์คฦคคค๋คฮคว, ฅวฅฃฅ์ฅฏฅศฅ๊ค๒สันนควคญคคปค๓ (! ค๒ฤษฒรคว"
+"E747: ฅะฅรฅีฅกคฌฝคภตคตค์คฦคคค๋คฮควกขฅวฅฃฅ์ฅฏฅศฅ๊ค๒สันนควคญคคปค๓ (! ค๒ฤษฒรคว"
"พๅฝ๑)"
-#: ../ex_docmd.c:6485
msgid "E186: No previous directory"
msgstr "E186: มฐคฮฅวฅฃฅ์ฅฏฅศฅ๊คฯคขค๊คคปค๓"
-#: ../ex_docmd.c:6530
msgid "E187: Unknown"
msgstr "E187: ฬครฮ"
-#: ../ex_docmd.c:6610
msgid "E465: :winsize requires two number arguments"
msgstr "E465: :winsize คหคฯ2คฤคฮฟ๔รอคฮฐ๚ฟ๔คฌษฌอืควคน"
-#: ../ex_docmd.c:6655
+#, c-format
+msgid "Window position: X %d, Y %d"
+msgstr "ฅฆฅฃฅ๓ฅษฅฆฐฬรึ: X %d, Y %d"
+
msgid "E188: Obtaining window position not implemented for this platform"
msgstr ""
"E188: คณคฮฅืฅ้ฅรฅศฅกผฅเคหคฯฅฆฅฃฅ๓ฅษฅฆฐฬรึคฮผ่ฦภตกวฝคฯผยม๕คตค์คฦคคคคปค๓"
-#: ../ex_docmd.c:6662
msgid "E466: :winpos requires two number arguments"
msgstr "E466: :winpos คหคฯ2คฤคฮฟ๔รอคฮฐ๚ฟ๔คฌษฌอืควคน"
-#: ../ex_docmd.c:7241
+msgid "E930: Cannot use :redir inside execute()"
+msgstr "E930: execute() คฮรๆควคฯ :redir คฯปศคจคคปค๓"
+
+msgid "Save Redirection"
+msgstr "ฅ๊ฅภฅคฅ์ฅฏฅศค๒สยธคทคคน"
+
+msgid "Save View"
+msgstr "ฅำฅๅกผค๒สยธคทคคน"
+
+msgid "Save Session"
+msgstr "ฅปฅรฅทฅ็ฅ๓พ๐ส๓ค๒สยธคทคคน"
+
+msgid "Save Setup"
+msgstr "ภ฿ฤ๊ค๒สยธคทคคน"
+
#, c-format
msgid "E739: Cannot create directory: %s"
msgstr "E739: ฅวฅฃฅ์ฅฏฅศฅ๊ค๒บ๎ภฎควคญคคปค๓: %s"
-#: ../ex_docmd.c:7268
#, c-format
msgid "E189: \"%s\" exists (add ! to override)"
msgstr "E189: \"%s\" คฌยธบ฿คทคคน (พๅฝ๑คนค๋คหคฯ ! ค๒ฤษฒรคทคฦคฏคภคตคค)"
-#: ../ex_docmd.c:7273
#, c-format
msgid "E190: Cannot open \"%s\" for writing"
msgstr "E190: \"%s\" ค๒ฝ๑นค฿อัคศคทคฦณซคฑคคปค๓"
-#. set mark
-#: ../ex_docmd.c:7294
msgid "E191: Argument must be a letter or forward/backward quote"
msgstr "E191: ฐ๚ฟ๔คฯ1สธป๚คฮฑัป๚คซฐ๚อัษไ (' คซ `) ควคสคฑค์คะคคคฑคคปค๓"
-#: ../ex_docmd.c:7333
msgid "E192: Recursive use of :normal too deep"
msgstr "E192: :normal คฮบฦตขอ๘อัคฌฟผคฏคสค๊ฒแคฎคคทคฟ"
-#: ../ex_docmd.c:7807
+msgid "E809: #< is not available without the +eval feature"
+msgstr "E809: #< คฯ +eval ตกวฝคฌฬตคคคศอ๘อัควคญคคปค๓"
+
msgid "E194: No alternate file name to substitute for '#'"
msgstr "E194: '#'ค๒รึคญดนคจค๋ษ๛ฅีฅกฅคฅ๋คฮฬพมฐคฌคขค๊คคปค๓"
-#: ../ex_docmd.c:7841
msgid "E495: no autocommand file name to substitute for \"<afile>\""
msgstr "E495: \"<afile>\"ค๒รึคญดนคจค๋autocommandคฮฅีฅกฅคฅ๋ฬพคฌคขค๊คคปค๓"
-#: ../ex_docmd.c:7850
msgid "E496: no autocommand buffer number to substitute for \"<abuf>\""
msgstr "E496: \"<abuf>\"ค๒รึคญดนคจค๋autocommandฅะฅรฅีฅกศึนๆคฌคขค๊คคปค๓"
-#: ../ex_docmd.c:7861
msgid "E497: no autocommand match name to substitute for \"<amatch>\""
msgstr "E497: \"<amatch>\"ค๒รึคญดนคจค๋autocommandคฮณบล๖ฬพคฌคขค๊คคปค๓"
-#: ../ex_docmd.c:7870
msgid "E498: no :source file name to substitute for \"<sfile>\""
msgstr "E498: \"<sfile>\"ค๒รึคญดนคจค๋ :source ยะพฅีฅกฅคฅ๋ฬพคฌคขค๊คคปค๓"
-#: ../ex_docmd.c:7876
msgid "E842: no line number to use for \"<slnum>\""
msgstr "E842: \"<slnum>\"ค๒รึคญดนคจค๋นิศึนๆคฌคขค๊คคปค๓"
-#: ../ex_docmd.c:7903
-#, fuzzy, c-format
+#, no-c-format
msgid "E499: Empty file name for '%' or '#', only works with \":p:h\""
msgstr ""
"E499: '%' คไ '#' คฌฬตฬพฅีฅกฅคฅ๋คสคฮคว \":p:h\" ค๒ศผค๏คสคคปศคคสคฯควคญคคปค๓"
-#: ../ex_docmd.c:7905
msgid "E500: Evaluates to an empty string"
msgstr "E500: ถ๕สธป๚ฮ๓คศคทคฦษพฒมคตค์คคทคฟ"
-#: ../ex_docmd.c:8838
msgid "E195: Cannot open viminfo file for reading"
msgstr "E195: viminfoฅีฅกฅคฅ๋ค๒ฦษนอัคศคทคฦณซคฑคคปค๓"
-#: ../ex_eval.c:464
+msgid "Untitled"
+msgstr "ฬตย๊"
+
+msgid "E196: No digraphs in this version"
+msgstr "E196: คณคฮฅะกผฅธฅ็ฅ๓คหน็ป๚คฯคขค๊คคปค๓"
+
msgid "E608: Cannot :throw exceptions with 'Vim' prefix"
msgstr "E608: 'Vim' ควปฯคค๋ฮใณฐคฯ :throw ควคญคคปค๓"
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:496
#, c-format
msgid "Exception thrown: %s"
msgstr "ฮใณฐคฌศฏภธคทคคทคฟ: %s"
-#: ../ex_eval.c:545
#, c-format
msgid "Exception finished: %s"
msgstr "ฮใณฐคฌผยซคทคคทคฟ: %s"
-#: ../ex_eval.c:546
#, c-format
msgid "Exception discarded: %s"
msgstr "ฮใณฐคฌวหดคตค์คคทคฟ: %s"
-#: ../ex_eval.c:588 ../ex_eval.c:634
#, c-format
-msgid "%s, line %<PRId64>"
-msgstr "%s, นิ %<PRId64>"
+msgid "%s, line %ld"
+msgstr "%s, นิ %ld"
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:608
#, c-format
msgid "Exception caught: %s"
msgstr "ฮใณฐคฌสแยชคตค์คคทคฟ: %s"
-#: ../ex_eval.c:676
#, c-format
msgid "%s made pending"
msgstr "%s คหค่ค๊ฬคท่ฤ๊พ๕ยึคฌภธคธคคทคฟ"
-#: ../ex_eval.c:679
#, c-format
msgid "%s resumed"
msgstr "%s คฌบฦณซคทคคทคฟ"
-#: ../ex_eval.c:683
#, c-format
msgid "%s discarded"
msgstr "%s คฌวหดคตค์คคทคฟ"
-#: ../ex_eval.c:708
msgid "Exception"
msgstr "ฮใณฐ"
-#: ../ex_eval.c:713
msgid "Error and interrupt"
msgstr "ฅจฅ้กผคศณไนค฿"
-#: ../ex_eval.c:715
msgid "Error"
msgstr "ฅจฅ้กผ"
-#. if (pending & CSTP_INTERRUPT)
-#: ../ex_eval.c:717
msgid "Interrupt"
msgstr "ณไนค฿"
-#: ../ex_eval.c:795
msgid "E579: :if nesting too deep"
msgstr "E579: :if คฮฦค์ปาคฌฟผฒแคฎคคน"
-#: ../ex_eval.c:830
msgid "E580: :endif without :if"
msgstr "E580: :if คฮคสคค :endif คฌคขค๊คคน"
-#: ../ex_eval.c:873
msgid "E581: :else without :if"
msgstr "E581: :if คฮคสคค :else คฌคขค๊คคน"
-#: ../ex_eval.c:876
msgid "E582: :elseif without :if"
msgstr "E582: :if คฮคสคค :elseif คฌคขค๊คคน"
-#: ../ex_eval.c:880
msgid "E583: multiple :else"
msgstr "E583: สฃฟ๔คฮ :else คฌคขค๊คคน"
-#: ../ex_eval.c:883
msgid "E584: :elseif after :else"
msgstr "E584: :else คฮธๅคห :elseif คฌคขค๊คคน"
-#: ../ex_eval.c:941
msgid "E585: :while/:for nesting too deep"
msgstr "E585: :while คไ :for คฮฦค์ปาคฌฟผฒแคฎคคน"
-#: ../ex_eval.c:1028
msgid "E586: :continue without :while or :for"
msgstr "E586: :while คไ :for คฮคสคค :continue คฌคขค๊คคน"
-#: ../ex_eval.c:1061
msgid "E587: :break without :while or :for"
msgstr "E587: :while คไ :for คฮคสคค :break คฌคขค๊คคน"
-#: ../ex_eval.c:1102
msgid "E732: Using :endfor with :while"
msgstr "E732: :endfor ค๒ :while คศมศค฿น็ค๏คปคฦคคคคน"
-#: ../ex_eval.c:1104
msgid "E733: Using :endwhile with :for"
msgstr "E733: :endwhile ค๒ :for คศมศค฿น็ค๏คปคฦคคคคน"
-#: ../ex_eval.c:1247
msgid "E601: :try nesting too deep"
msgstr "E601: :try คฮฦค์ปาคฌฟผฒแคฎคคน"
-#: ../ex_eval.c:1317
msgid "E603: :catch without :try"
msgstr "E603: :try คฮคสคค :catch คฌคขค๊คคน"
-#. Give up for a ":catch" after ":finally" and ignore it.
-#. * Just parse.
-#: ../ex_eval.c:1332
msgid "E604: :catch after :finally"
msgstr "E604: :finally คฮธๅคห :catch คฌคขค๊คคน"
-#: ../ex_eval.c:1451
msgid "E606: :finally without :try"
msgstr "E606: :try คฮคสคค :finally คฌคขค๊คคน"
-#. Give up for a multiple ":finally" and ignore it.
-#: ../ex_eval.c:1467
msgid "E607: multiple :finally"
msgstr "E607: สฃฟ๔คฮ :finally คฌคขค๊คคน"
-#: ../ex_eval.c:1571
msgid "E602: :endtry without :try"
msgstr "E602: :try คฮคสคค :endtry ควคน"
-#: ../ex_eval.c:2026
msgid "E193: :endfunction not inside a function"
msgstr "E193: ดุฟ๔คฮณฐคห :endfunction คฌคขค๊คคทคฟ"
-#: ../ex_getln.c:1643
msgid "E788: Not allowed to edit another buffer now"
msgstr "E788: ธฝบ฿คฯยพคฮฅะฅรฅีฅกค๒สิฝธคนค๋คณคศคฯต๖คตค์คคปค๓"
-#: ../ex_getln.c:1656
msgid "E811: Not allowed to change buffer information now"
msgstr "E811: ธฝบ฿คฯฅะฅรฅีฅกพ๐ส๓ค๒สันนคนค๋คณคศคฯต๖คตค์คคปค๓"
-#: ../ex_getln.c:3178
msgid "tagname"
msgstr "ฅฟฅฐฬพ"
-#: ../ex_getln.c:3181
msgid " kind file\n"
msgstr " ฅีฅกฅคฅ๋ผ๏ฮเ\n"
-#: ../ex_getln.c:4799
msgid "'history' option is zero"
msgstr "ฅชฅืฅทฅ็ฅ๓ 'history' คฌฅผฅํควคน"
-#: ../ex_getln.c:5046
#, c-format
msgid ""
"\n"
@@ -1986,303 +1663,220 @@ msgstr ""
"\n"
"# %s นเฬคฮอ๚ฮ๒ (ฟทคทคคคโคฮคซค้ธลคคคโคฮคุ):\n"
-#: ../ex_getln.c:5047
msgid "Command Line"
msgstr "ฅณฅฅ๓ฅษฅ้ฅคฅ๓"
-#: ../ex_getln.c:5048
msgid "Search String"
msgstr "ธกบ๗สธป๚ฮ๓"
-#: ../ex_getln.c:5049
msgid "Expression"
msgstr "ผฐ"
-#: ../ex_getln.c:5050
msgid "Input Line"
msgstr "ฦฮฯนิ"
-#: ../ex_getln.c:5117
+msgid "Debug Line"
+msgstr "ฅวฅะฅรฅฐนิ"
+
msgid "E198: cmd_pchar beyond the command length"
msgstr "E198: cmd_pchar คฌฅณฅฅ๓ฅษฤนค๒ฤถคจคคทคฟ"
-#: ../ex_getln.c:5279
msgid "E199: Active window or buffer deleted"
msgstr "E199: ฅขฅฏฅฦฅฃฅึคสฅฆฅฃฅ๓ฅษฅฆคซฅะฅรฅีฅกคฌบ๏ฝคตค์คคทคฟ"
-#: ../file_search.c:203
-msgid "E854: path too long for completion"
-msgstr "E854: ฅัฅนคฌฤนฒแคฎคฦสไดฐควคญคคปค๓"
-
-#: ../file_search.c:446
-#, c-format
-msgid ""
-"E343: Invalid path: '**[number]' must be at the end of the path or be "
-"followed by '%s'."
-msgstr ""
-"E343: ฬตธ๚คสฅัฅนควคน: '**[ฟ๔รอ]' คฯpathคฮบวธๅคซ '%s' คฌยณคคคฦคสคคคศคคคฑคคป"
-"ค๓."
-
-#: ../file_search.c:1505
-#, c-format
-msgid "E344: Can't find directory \"%s\" in cdpath"
-msgstr "E344: cdpathคหคฯ \"%s\" คศคคคฆฅีฅกฅคฅ๋คฌคขค๊คคปค๓"
-
-#: ../file_search.c:1508
-#, c-format
-msgid "E345: Can't find file \"%s\" in path"
-msgstr "E345: pathคหคฯ \"%s\" คศคคคฆฅีฅกฅคฅ๋คฌคขค๊คคปค๓"
-
-#: ../file_search.c:1512
-#, c-format
-msgid "E346: No more directory \"%s\" found in cdpath"
-msgstr "E346: cdpathคหคฯคณค์ฐสพๅ \"%s\" คศคคคฆฅีฅกฅคฅ๋คฌคขค๊คคปค๓"
-
-#: ../file_search.c:1515
-#, c-format
-msgid "E347: No more file \"%s\" found in path"
-msgstr "E347: ฅัฅนคหคฯคณค์ฐสพๅ \"%s\" คศคคคฆฅีฅกฅคฅ๋คฌคขค๊คคปค๓"
-
-#: ../fileio.c:137
msgid "E812: Autocommands changed buffer or buffer name"
msgstr "E812: autocommandคฌฅะฅรฅีฅกคซฅะฅรฅีฅกฬพค๒สันนคทคคทคฟ"
-#: ../fileio.c:368
msgid "Illegal file name"
msgstr "ษิภตคสฅีฅกฅคฅ๋ฬพ"
-#: ../fileio.c:395 ../fileio.c:476 ../fileio.c:2543 ../fileio.c:2578
msgid "is a directory"
msgstr "คฯฅวฅฃฅ์ฅฏฅศฅ๊ควคน"
-#: ../fileio.c:397
msgid "is not a file"
msgstr "คฯฅีฅกฅคฅ๋ควคฯคขค๊คคปค๓"
-#: ../fileio.c:508 ../fileio.c:3522
+msgid "is a device (disabled with 'opendevice' option)"
+msgstr "คฯฅวฅะฅคฅนควคน ('opendevice' ฅชฅืฅทฅ็ฅ๓ควฒ๓ศ๒ควคญคคน)"
+
msgid "[New File]"
msgstr "[ฟทฅีฅกฅคฅ๋]"
-#: ../fileio.c:511
msgid "[New DIRECTORY]"
msgstr "[ฟทตฌฅวฅฃฅ์ฅฏฅศฅ๊]"
-#: ../fileio.c:529 ../fileio.c:532
msgid "[File too big]"
msgstr "[ฅีฅกฅคฅ๋ฒแย็]"
-#: ../fileio.c:534
msgid "[Permission Denied]"
msgstr "[ธขธยคฌคขค๊คคปค๓]"
-#: ../fileio.c:653
msgid "E200: *ReadPre autocommands made the file unreadable"
msgstr "E200: *ReadPre autocommand คฌฅีฅกฅคฅ๋ค๒ฦษนษิฒฤคหคทคคทคฟ"
-#: ../fileio.c:655
msgid "E201: *ReadPre autocommands must not change current buffer"
msgstr "E201: *ReadPre autocommand คฯธฝบ฿คฮฅะฅรฅีฅกค๒สัคจค้ค์คคปค๓"
-#: ../fileio.c:672
-msgid "Nvim: Reading from stdin...\n"
+msgid "Vim: Reading from stdin...\n"
msgstr "Vim: ษธฝเฦฮฯคซค้ฦษนรๆ...\n"
-#. Re-opening the original file failed!
-#: ../fileio.c:909
+msgid "Reading from stdin..."
+msgstr "ษธฝเฦฮฯคซค้ฦษนค฿รๆ..."
+
msgid "E202: Conversion made file unreadable!"
msgstr "E202: สัดนคฌฅีฅกฅคฅ๋ค๒ฦษนษิฒฤคหคทคคทคฟ"
-#. fifo or socket
-#: ../fileio.c:1782
msgid "[fifo/socket]"
msgstr "[FIFO/ฅฝฅฑฅรฅศ]"
-#. fifo
-#: ../fileio.c:1788
msgid "[fifo]"
msgstr "[FIFO]"
-#. or socket
-#: ../fileio.c:1794
msgid "[socket]"
msgstr "[ฅฝฅฑฅรฅศ]"
-#. or character special
-#: ../fileio.c:1801
msgid "[character special]"
msgstr "[ฅญฅใฅ้ฅฏฅฟกฆฅวฅะฅคฅน]"
-#: ../fileio.c:1815
msgid "[CR missing]"
msgstr "[CRฬต]"
-#: ../fileio.c:1819
msgid "[long lines split]"
msgstr "[ฤนนิสฌณไ]"
-#: ../fileio.c:1823 ../fileio.c:3512
msgid "[NOT converted]"
msgstr "[ฬคสัดน]"
-#: ../fileio.c:1826 ../fileio.c:3515
msgid "[converted]"
msgstr "[สัดนบั]"
-#: ../fileio.c:1831
#, c-format
-msgid "[CONVERSION ERROR in line %<PRId64>]"
-msgstr "[%<PRId64> นิฬควสัดนฅจฅ้กผ]"
+msgid "[CONVERSION ERROR in line %ld]"
+msgstr "[%ld นิฬควสัดนฅจฅ้กผ]"
-#: ../fileio.c:1835
#, c-format
-msgid "[ILLEGAL BYTE in line %<PRId64>]"
-msgstr "[%<PRId64> นิฬคฮษิภตคสฅะฅคฅศ]"
+msgid "[ILLEGAL BYTE in line %ld]"
+msgstr "[%ld นิฬคฮษิภตคสฅะฅคฅศ]"
-#: ../fileio.c:1838
msgid "[READ ERRORS]"
msgstr "[ฦษนฅจฅ้กผ]"
-#: ../fileio.c:2104
msgid "Can't find temp file for conversion"
msgstr "สัดนคหษฌอืคสฐ์ปฅีฅกฅคฅ๋คฌธซคฤคซค๊คคปค๓"
-#: ../fileio.c:2110
msgid "Conversion with 'charconvert' failed"
msgstr "'charconvert' คหค่ค๋สัดนคฌผบวิคทคคทคฟ"
-#: ../fileio.c:2113
msgid "can't read output of 'charconvert'"
msgstr "'charconvert' คฮฝะฮฯค๒ฦษนคแคคปค๓ควคทคฟ"
-#: ../fileio.c:2437
msgid "E676: No matching autocommands for acwrite buffer"
msgstr "E676: acwriteฅะฅรฅีฅกคฮณบล๖คนค๋autocommandคฯยธบ฿คทคคปค๓"
-#: ../fileio.c:2466
msgid "E203: Autocommands deleted or unloaded buffer to be written"
msgstr "E203: สยธคนค๋ฅะฅรฅีฅกค๒autocommandคฌบ๏ฝคซฒ๒สคทคคทคฟ"
-#: ../fileio.c:2486
msgid "E204: Autocommand changed number of lines in unexpected way"
msgstr "E204: autocommandคฌอฝดคปคฬสหกควนิฟ๔ค๒สันนคทคคทคฟ"
-#: ../fileio.c:2548 ../fileio.c:2565
+# Added at 19-Jan-2004.
+msgid "NetBeans disallows writes of unmodified buffers"
+msgstr "NetBeansคฯฬคสันนคฮฅะฅรฅีฅกค๒พๅฝ๑คนค๋คณคศคฯต๖ฒฤคทคฦคคคคปค๓"
+
+msgid "Partial writes disallowed for NetBeans buffers"
+msgstr "NetBeansฅะฅรฅีฅกคฮฐ์ษ๔ค๒ฝ๑คญฝะคนคณคศคฯควคญคคปค๓"
+
msgid "is not a file or writable device"
msgstr "คฯฅีฅกฅคฅ๋ควคโฝ๑นค฿ฒฤวฝฅวฅะฅคฅนควคโคขค๊คคปค๓"
-#: ../fileio.c:2601
+msgid "writing to device disabled with 'opendevice' option"
+msgstr "'opendevice' ฅชฅืฅทฅ็ฅ๓คหค่ค๊ฅวฅะฅคฅนคุคฮฝ๑คญนค฿คฯควคญคคปค๓"
+
msgid "is read-only (add ! to override)"
msgstr "คฯฦษนภ์อัควคน (ถฏภฉฝ๑นคหคฯ ! ค๒ฤษฒร)"
-#: ../fileio.c:2886
msgid "E506: Can't write to backup file (add ! to override)"
msgstr "E506: ฅะฅรฅฏฅขฅรฅืฅีฅกฅคฅ๋ค๒สยธควคญคคปค๓ (! ค๒ฤษฒรควถฏภฉสยธ)"
-#: ../fileio.c:2898
msgid "E507: Close error for backup file (add ! to override)"
msgstr ""
"E507: ฅะฅรฅฏฅขฅรฅืฅีฅกฅคฅ๋ค๒สฤคธค๋บคหฅจฅ้กผคฌศฏภธคทคคทคฟ (! ค๒ฤษฒรควถฏภฉ)"
-#: ../fileio.c:2901
msgid "E508: Can't read file for backup (add ! to override)"
msgstr "E508: ฅะฅรฅฏฅขฅรฅือัฅีฅกฅคฅ๋ค๒ฦษนคแคคปค๓ (! ค๒ฤษฒรควถฏภฉฦษน)"
-#: ../fileio.c:2923
msgid "E509: Cannot create backup file (add ! to override)"
msgstr "E509: ฅะฅรฅฏฅขฅรฅืฅีฅกฅคฅ๋ค๒บ๎ค์คคปค๓ (! ค๒ฤษฒรควถฏภฉบ๎ภฎ)"
-#: ../fileio.c:3008
msgid "E510: Can't make backup file (add ! to override)"
msgstr "E510: ฅะฅรฅฏฅขฅรฅืฅีฅกฅคฅ๋ค๒บ๎ค์คคปค๓ (! ค๒ฤษฒรควถฏภฉบ๎ภฎ)"
-#. Can't write without a tempfile!
-#: ../fileio.c:3121
msgid "E214: Can't find temp file for writing"
msgstr "E214: สยธอัฐ์ปฅีฅกฅคฅ๋คฌธซคฤคซค๊คคปค๓"
-#: ../fileio.c:3134
msgid "E213: Cannot convert (add ! to write without conversion)"
msgstr "E213: สัดนควคญคคปค๓ (! ค๒ฤษฒรควสัดนคปคบคหสยธ)"
-#: ../fileio.c:3169
msgid "E166: Can't open linked file for writing"
msgstr "E166: ฅ๊ฅ๓ฅฏคตค์คฟฅีฅกฅคฅ๋คหฝ๑นคแคคปค๓"
-#: ../fileio.c:3173
msgid "E212: Can't open file for writing"
msgstr "E212: ฝ๑นค฿อัคหฅีฅกฅคฅ๋ค๒ณซคฑคคปค๓"
-#: ../fileio.c:3363
-msgid "E667: Fsync failed"
-msgstr "E667: fsync คหผบวิคทคคทคฟ"
+msgid "E949: File changed while writing"
+msgstr "E949: ฝ๑นค฿รๆคหฅีฅกฅคฅ๋คฌสันนคตค์คคทคฟ"
-#: ../fileio.c:3398
msgid "E512: Close failed"
msgstr "E512: สฤคธค๋คณคศคหผบวิ"
-#: ../fileio.c:3436
msgid "E513: write error, conversion failed (make 'fenc' empty to override)"
-msgstr "E513: ฝ๑นค฿ฅจฅ้กผ, สัดนผบวิ (พๅฝ๑คนค๋คหคฯ 'fenc' ค๒ถ๕คหคทคฦคฏคภคตคค)"
+msgstr "E513: ฝ๑นค฿ฅจฅ้กผกขสัดนผบวิ (พๅฝ๑คนค๋คหคฯ 'fenc' ค๒ถ๕คหคทคฦคฏคภคตคค)"
-#: ../fileio.c:3441
#, c-format
msgid ""
-"E513: write error, conversion failed in line %<PRId64> (make 'fenc' empty to "
+"E513: write error, conversion failed in line %ld (make 'fenc' empty to "
"override)"
msgstr ""
-"E513: ฝ๑นค฿ฅจฅ้กผ, สัดนผบวิ, นิฟ๔ %<PRId64> (พๅฝ๑คนค๋คหคฯ 'fenc' ค๒ถ๕คหคทคฦ"
-"คฏคภคตคค)"
+"E513: ฝ๑นค฿ฅจฅ้กผกขสัดนผบวิกขนิฟ๔ %ld (พๅฝ๑คนค๋คหคฯ 'fenc' ค๒ถ๕คหคทคฦคฏคภคต"
+"คค)"
-#: ../fileio.c:3448
msgid "E514: write error (file system full?)"
-msgstr "E514: ฝ๑นค฿ฅจฅ้กผ, (ฅีฅกฅคฅ๋ฅทฅนฅฦฅเคฌหวี?)"
+msgstr "E514: ฝ๑นค฿ฅจฅ้กผ (ฅีฅกฅคฅ๋ฅทฅนฅฦฅเคฌหวี?)"
-#: ../fileio.c:3506
msgid " CONVERSION ERROR"
msgstr " สัดนฅจฅ้กผ"
-#: ../fileio.c:3509
#, c-format
-msgid " in line %<PRId64>;"
-msgstr " นิ %<PRId64>;"
+msgid " in line %ld;"
+msgstr " นิ %ld;"
-#: ../fileio.c:3519
msgid "[Device]"
msgstr "[ฅวฅะฅคฅน]"
-#: ../fileio.c:3522
msgid "[New]"
msgstr "[ฟท]"
-#: ../fileio.c:3535
msgid " [a]"
msgstr " [a]"
-#: ../fileio.c:3535
msgid " appended"
msgstr " ฤษฒร"
-#: ../fileio.c:3537
msgid " [w]"
msgstr " [w]"
-#: ../fileio.c:3537
msgid " written"
msgstr " ฝ๑นค฿"
-#: ../fileio.c:3579
msgid "E205: Patchmode: can't save original file"
msgstr "E205: patchmode: ธถหฅีฅกฅคฅ๋ค๒สยธควคญคคปค๓"
-#: ../fileio.c:3602
msgid "E206: patchmode: can't touch empty original file"
msgstr "E206: patchmode: ถ๕คฮธถหฅีฅกฅคฅ๋ค๒touchควคญคคปค๓"
-#: ../fileio.c:3616
msgid "E207: Can't delete backup file"
msgstr "E207: ฅะฅรฅฏฅขฅรฅืฅีฅกฅคฅ๋ค๒พรคปคคปค๓"
-#: ../fileio.c:3672
msgid ""
"\n"
"WARNING: Original file may be lost or damaged\n"
@@ -2290,134 +1884,102 @@ msgstr ""
"\n"
"ทูน๐: ธถหฅีฅกฅคฅ๋คฌผบค๏ค์คฟคซสันนคตค์คคทคฟ\n"
-#: ../fileio.c:3675
msgid "don't quit the editor until the file is successfully written!"
msgstr "ฅีฅกฅคฅ๋คฮสยธคหภฎธ๙คนค๋คควฅจฅวฅฃฅฟค๒ฝชฮปคทคสคคควคฏคภคตคค!"
-#: ../fileio.c:3795
msgid "[dos]"
msgstr "[dos]"
-#: ../fileio.c:3795
msgid "[dos format]"
msgstr "[dosฅีฅฉกผฅฅรฅศ]"
-#: ../fileio.c:3801
msgid "[mac]"
msgstr "[mac]"
-#: ../fileio.c:3801
msgid "[mac format]"
msgstr "[macฅีฅฉกผฅฅรฅศ]"
-#: ../fileio.c:3807
msgid "[unix]"
msgstr "[unix]"
-#: ../fileio.c:3807
msgid "[unix format]"
msgstr "[unixฅีฅฉกผฅฅรฅศ]"
-#: ../fileio.c:3831
msgid "1 line, "
msgstr "1 นิ, "
-#: ../fileio.c:3833
#, c-format
-msgid "%<PRId64> lines, "
-msgstr "%<PRId64> นิ, "
+msgid "%ld lines, "
+msgstr "%ld นิ, "
-#: ../fileio.c:3836
msgid "1 character"
msgstr "1 สธป๚"
-#: ../fileio.c:3838
#, c-format
-msgid "%<PRId64> characters"
-msgstr "%<PRId64> สธป๚"
+msgid "%lld characters"
+msgstr "%lld สธป๚"
-#: ../fileio.c:3849
msgid "[noeol]"
msgstr "[noeol]"
-#: ../fileio.c:3849
msgid "[Incomplete last line]"
msgstr "[บวฝชนิคฌษิดฐมด]"
-#. don't overwrite messages here
-#. must give this prompt
-#. don't use emsg() here, don't want to flush the buffers
-#: ../fileio.c:3865
msgid "WARNING: The file has been changed since reading it!!!"
msgstr "ทูน๐: ฦษนค๓คภธๅคหฅีฅกฅคฅ๋คหสันนคฌคขค๊คคทคฟ!!!"
-#: ../fileio.c:3867
msgid "Do you really want to write to it"
msgstr "หล๖คหพๅฝ๑คญคทคคนคซ"
-#: ../fileio.c:4648
#, c-format
msgid "E208: Error writing to \"%s\""
msgstr "E208: \"%s\" ค๒ฝ๑นค฿รๆคฮฅจฅ้กผควคน"
-#: ../fileio.c:4655
#, c-format
msgid "E209: Error closing \"%s\""
msgstr "E209: \"%s\" ค๒สฤคธค๋ปคหฅจฅ้กผควคน"
-#: ../fileio.c:4657
#, c-format
msgid "E210: Error reading \"%s\""
msgstr "E210: \"%s\" ค๒ฦษนรๆคฮฅจฅ้กผควคน"
-#: ../fileio.c:4883
msgid "E246: FileChangedShell autocommand deleted buffer"
msgstr "E246: autocommand คฮ FileChangedShell คฌฅะฅรฅีฅกค๒บ๏ฝคทคคทคฟ"
-#: ../fileio.c:4894
#, c-format
msgid "E211: File \"%s\" no longer available"
msgstr "E211: ฅีฅกฅคฅ๋ \"%s\" คฯด๛คหยธบ฿คทคคปค๓"
-#: ../fileio.c:4906
#, c-format
msgid ""
"W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as "
"well"
msgstr "W12: ทูน๐: ฅีฅกฅคฅ๋ \"%s\" คฌสันนคตค์Vimคฮฅะฅรฅีฅกคโสันนคตค์คคทคฟ"
-#: ../fileio.c:4907
msgid "See \":help W12\" for more info."
msgstr "พบูคฯ \":help W12\" ค๒ปฒพศคทคฦคฏคภคตคค"
-#: ../fileio.c:4910
#, c-format
msgid "W11: Warning: File \"%s\" has changed since editing started"
msgstr "W11: ทูน๐: ฅีฅกฅคฅ๋ \"%s\" คฯสิฝธณซปฯธๅคหสันนคตค์คคทคฟ"
-#: ../fileio.c:4911
msgid "See \":help W11\" for more info."
msgstr "พบูคฯ \":help W11\" ค๒ปฒพศคทคฦคฏคภคตคค"
-#: ../fileio.c:4914
#, c-format
msgid "W16: Warning: Mode of file \"%s\" has changed since editing started"
msgstr "W16: ทูน๐: ฅีฅกฅคฅ๋ \"%s\" คฮฅโกผฅษคฌสิฝธณซปฯธๅคหสันนคตค์คคทคฟ"
-#: ../fileio.c:4915
msgid "See \":help W16\" for more info."
msgstr "พบูคฯ \":help W16\" ค๒ปฒพศคทคฦคฏคภคตคค"
-#: ../fileio.c:4927
#, c-format
msgid "W13: Warning: File \"%s\" has been created after editing started"
msgstr "W13: ทูน๐: ฅีฅกฅคฅ๋ \"%s\" คฯสิฝธณซปฯธๅคหบ๎ภฎคตค์คคทคฟ"
-#: ../fileio.c:4947
msgid "Warning"
msgstr "ทูน๐"
-#: ../fileio.c:4948
msgid ""
"&OK\n"
"&Load File"
@@ -2425,810 +1987,593 @@ msgstr ""
"&OK\n"
"ฅีฅกฅคฅ๋ฦษน(&L)"
-#: ../fileio.c:5065
#, c-format
msgid "E462: Could not prepare for reloading \"%s\""
msgstr "E462: \"%s\" ค๒ฅ๊ฅํกผฅษคนค๋ฝเศ๗คฌควคญคคปค๓ควคทคฟ"
-#: ../fileio.c:5078
#, c-format
msgid "E321: Could not reload \"%s\""
msgstr "E321: \"%s\" คฯฅ๊ฅํกผฅษควคญคคปค๓ควคทคฟ"
-#: ../fileio.c:5601
msgid "--Deleted--"
msgstr "--บ๏ฝบั--"
-#: ../fileio.c:5732
#, c-format
msgid "auto-removing autocommand: %s <buffer=%d>"
msgstr "autocommand: %s <ฅะฅรฅีฅก=%d> คฌผซฦฐลชคหบ๏ฝคตค์คคน"
-#. the group doesn't exist
-#: ../fileio.c:5772
#, c-format
msgid "E367: No such group: \"%s\""
msgstr "E367: คฝคฮฅฐฅ๋กผฅืคฯคขค๊คคปค๓: \"%s\""
-#: ../fileio.c:5897
+msgid "E936: Cannot delete the current group"
+msgstr "E936: ธฝบ฿คฮฅฐฅ๋กผฅืคฯบ๏ฝควคญคคปค๓"
+
+msgid "W19: Deleting augroup that is still in use"
+msgstr "W19: ปศอัรๆคฮ augroup ค๒พรคฝคฆคศคทคฦคคคคน"
+
#, c-format
msgid "E215: Illegal character after *: %s"
msgstr "E215: * คฮธๅคหษิภตคสสธป๚คฌคขค๊คคทคฟ: %s"
-#: ../fileio.c:5905
#, c-format
msgid "E216: No such event: %s"
msgstr "E216: คฝคฮค่คฆคสฅคฅูฅ๓ฅศคฯคขค๊คคปค๓: %s"
-#: ../fileio.c:5907
#, c-format
msgid "E216: No such group or event: %s"
msgstr "E216: คฝคฮค่คฆคสฅฐฅ๋กผฅืคโคทคฏคฯฅคฅูฅ๓ฅศคฯคขค๊คคปค๓: %s"
-#. Highlight title
-#: ../fileio.c:6090
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
-#: ../fileio.c:6293
#, c-format
msgid "E680: <buffer=%d>: invalid buffer number "
msgstr "E680: <ฅะฅรฅีฅก=%d>: ฬตธ๚คสฅะฅรฅีฅกศึนๆควคน "
-#: ../fileio.c:6370
msgid "E217: Can't execute autocommands for ALL events"
msgstr "E217: มดคฦคฮฅคฅูฅ๓ฅศคหยะคทคฦคฮautocommandคฯผยนิควคญคคปค๓"
-#: ../fileio.c:6393
msgid "No matching autocommands"
msgstr "ณบล๖คนค๋autocommandคฯยธบ฿คทคคปค๓"
-#: ../fileio.c:6831
msgid "E218: autocommand nesting too deep"
msgstr "E218: autocommandคฮฦค์ปาคฌฟผฒแคฎคคน"
-#: ../fileio.c:7143
#, c-format
-msgid "%s Auto commands for \"%s\""
-msgstr "%s Auto commands for \"%s\""
+msgid "%s Autocommands for \"%s\""
+msgstr "%s Autocommands for \"%s\""
-#: ../fileio.c:7149
#, c-format
msgid "Executing %s"
msgstr "%s ค๒ผยนิคทคฦคคคคน"
-#: ../fileio.c:7211
#, c-format
msgid "autocommand %s"
msgstr "autocommand %s"
-#: ../fileio.c:7795
msgid "E219: Missing {."
msgstr "E219: { คฌคขค๊คคปค๓."
-#: ../fileio.c:7797
msgid "E220: Missing }."
msgstr "E220: } คฌคขค๊คคปค๓."
-#: ../fold.c:93
msgid "E490: No fold found"
msgstr "E490: ภพ๖ค฿คฌคขค๊คคปค๓"
-#: ../fold.c:544
msgid "E350: Cannot create fold with current 'foldmethod'"
msgstr "E350: ธฝบ฿คฮ 'foldmethod' ควคฯภพ๖ค฿ค๒บ๎ภฎควคญคคปค๓"
-#: ../fold.c:546
msgid "E351: Cannot delete fold with current 'foldmethod'"
msgstr "E351: ธฝบ฿คฮ 'foldmethod' ควคฯภพ๖ค฿ค๒บ๏ฝควคญคคปค๓"
-#: ../fold.c:1784
#, c-format
-msgid "+--%3ld lines folded "
-msgstr "+--%3ld นิคฌภพ๖คค์คคทคฟ "
+msgid "+--%3ld line folded "
+msgid_plural "+--%3ld lines folded "
+msgstr[0] "+--%3ld นิคฌภพ๖คค์คคทคฟ"
-#. buffer has already been read
-#: ../getchar.c:273
msgid "E222: Add to read buffer"
msgstr "E222: ฦษนฅะฅรฅีฅกคุฤษฒร"
-#: ../getchar.c:2040
msgid "E223: recursive mapping"
msgstr "E223: บฦตขลชฅฅรฅิฅ๓ฅฐ"
-#: ../getchar.c:2849
#, c-format
msgid "E224: global abbreviation already exists for %s"
msgstr "E224: %s คศคคคฆฅฐฅํกผฅะฅ๋รปฝฬฦฮฯคฯด๛คหยธบ฿คทคคน"
-#: ../getchar.c:2852
#, c-format
msgid "E225: global mapping already exists for %s"
msgstr "E225: %s คศคคคฆฅฐฅํกผฅะฅ๋ฅฅรฅิฅ๓ฅฐคฯด๛คหยธบ฿คทคคน"
-#: ../getchar.c:2952
#, c-format
msgid "E226: abbreviation already exists for %s"
msgstr "E226: %s คศคคคฆรปฝฬฦฮฯคฯด๛คหยธบ฿คทคคน"
-#: ../getchar.c:2955
#, c-format
msgid "E227: mapping already exists for %s"
msgstr "E227: %s คศคคคฆฅฅรฅิฅ๓ฅฐคฯด๛คหยธบ฿คทคคน"
-#: ../getchar.c:3008
msgid "No abbreviation found"
msgstr "รปฝฬฦฮฯคฯธซคฤคซค๊คคปค๓ควคทคฟ"
-#: ../getchar.c:3010
msgid "No mapping found"
msgstr "ฅฅรฅิฅ๓ฅฐคฯธซคฤคซค๊คคปค๓ควคทคฟ"
-#: ../getchar.c:3974
msgid "E228: makemap: Illegal mode"
msgstr "E228: makemap: ษิภตคสฅโกผฅษ"
-#. key value of 'cedit' option
-#. type of cmdline window or 0
-#. result of cmdline window or 0
-#: ../globals.h:924
-msgid "--No lines in buffer--"
-msgstr "--ฅะฅรฅีฅกคหนิคฌคขค๊คคปค๓--"
-
-#.
-#. * The error messages that can be shared are included here.
-#. * Excluded are errors that are only used once and debugging messages.
-#.
-#: ../globals.h:996
-msgid "E470: Command aborted"
-msgstr "E470: ฅณฅฅ๓ฅษคฌรๆรวคตค์คคทคฟ"
-
-#: ../globals.h:997
-msgid "E471: Argument required"
-msgstr "E471: ฐ๚ฟ๔คฌษฌอืควคน"
+msgid "E851: Failed to create a new process for the GUI"
+msgstr "E851: GUIอัคฮฅืฅํฅปฅนคฮตฏฦฐคหผบวิคทคคทคฟ"
-#: ../globals.h:998
-msgid "E10: \\ should be followed by /, ? or &"
-msgstr "E10: \\ คฮธๅคฯ / คซ ? คซ & ควคสคฑค์คะคสค๊คคปค๓"
+msgid "E852: The child process failed to start the GUI"
+msgstr "E852: ปาฅืฅํฅปฅนคฌGUIคฮตฏฦฐคหผบวิคทคคทคฟ"
-#: ../globals.h:1000
-msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
-msgstr "E11: ฅณฅฅ๓ฅษฅ้ฅคฅ๓ควคฯฬตธ๚ควคน; <CR>ควผยนิ, CTRL-Cควคไคแค๋"
+msgid "E229: Cannot start the GUI"
+msgstr "E229: GUIค๒ณซปฯควคญคคปค๓"
-#: ../globals.h:1002
-msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
-msgstr ""
-"E12: ธฝบ฿คฮฅวฅฃฅ์ฅฏฅศฅ๊คไฅฟฅฐธกบ๗ควคฯexrc/vimrcคฮฅณฅฅ๓ฅษคฯต๖ฒฤคตค์คคปค๓"
+#, c-format
+msgid "E230: Cannot read from \"%s\""
+msgstr "E230: \"%s\"คซค้ฦษนคเคณคศคฌควคญคคปค๓"
-#: ../globals.h:1003
-msgid "E171: Missing :endif"
-msgstr "E171: :endif คฌคขค๊คคปค๓"
+msgid "E665: Cannot start GUI, no valid font found"
+msgstr "E665: อญธ๚คสฅีฅฉฅ๓ฅศคฌธซคฤคซค้คสคคคฮควกขGUIค๒ณซปฯควคญคคปค๓"
-#: ../globals.h:1004
-msgid "E600: Missing :endtry"
-msgstr "E600: :endtry คฌคขค๊คคปค๓"
+msgid "E231: 'guifontwide' invalid"
+msgstr "E231: 'guifontwide' คฌฬตธ๚ควคน"
-#: ../globals.h:1005
-msgid "E170: Missing :endwhile"
-msgstr "E170: :endwhile คฌคขค๊คคปค๓"
+msgid "E599: Value of 'imactivatekey' is invalid"
+msgstr "E599: 'imactivatekey' คหภ฿ฤ๊คตค์คฟรอคฌฬตธ๚ควคน"
-#: ../globals.h:1006
-msgid "E170: Missing :endfor"
-msgstr "E170: :endfor คฌคขค๊คคปค๓"
+#, c-format
+msgid "E254: Cannot allocate color %s"
+msgstr "E254: %s คฮฟงค๒ณไค๊ล๖คฦค้ค์คคปค๓"
-#: ../globals.h:1007
-msgid "E588: :endwhile without :while"
-msgstr "E588: :while คฮคสคค :endwhile คฌคขค๊คคน"
+msgid "No match at cursor, finding next"
+msgstr "ฅซกผฅฝฅ๋คฮฐฬรึคหฅฅรฅมคฯคขค๊คคปค๓กขผกค๒ธกบ๗คทคฦคคคคน"
-#: ../globals.h:1008
-msgid "E588: :endfor without :for"
-msgstr "E588: :endfor คฮคสคค :for คฌคขค๊คคน"
+msgid "<cannot open> "
+msgstr "<ณซคฑคคปค๓> "
-#: ../globals.h:1009
-msgid "E13: File exists (add ! to override)"
-msgstr "E13: ฅีฅกฅคฅ๋คฌยธบ฿คทคคน (! ค๒ฤษฒรควพๅฝ๑)"
+#, c-format
+msgid "E616: vim_SelFile: can't get font %s"
+msgstr "E616: vim_SelFile: ฅีฅฉฅ๓ฅศ %s ค๒ผ่ฦภควคญคคปค๓"
-#: ../globals.h:1010
-msgid "E472: Command failed"
-msgstr "E472: ฅณฅฅ๓ฅษคฌผบวิคทคคทคฟ"
+msgid "E614: vim_SelFile: can't return to current directory"
+msgstr "E614: vim_SelFile: ธฝบ฿คฮฅวฅฃฅ์ฅฏฅศฅ๊คหฬแค์คคปค๓"
-#: ../globals.h:1011
-msgid "E473: Internal error"
-msgstr "E473: ฦโษ๔ฅจฅ้กผควคน"
+msgid "Pathname:"
+msgstr "ฅัฅนฬพ:"
-#: ../globals.h:1012
-msgid "Interrupted"
-msgstr "ณไนคค์คคทคฟ"
+msgid "E615: vim_SelFile: can't get current directory"
+msgstr "E615: vim_SelFile: ธฝบ฿คฮฅวฅฃฅ์ฅฏฅศฅ๊ค๒ผ่ฦภควคญคคปค๓"
-#: ../globals.h:1013
-msgid "E14: Invalid address"
-msgstr "E14: ฬตธ๚คสฅขฅษฅ์ฅนควคน"
+msgid "OK"
+msgstr "OK"
-#: ../globals.h:1014
-msgid "E474: Invalid argument"
-msgstr "E474: ฬตธ๚คสฐ๚ฟ๔ควคน"
+msgid "Cancel"
+msgstr "ฅญฅใฅ๓ฅปฅ๋"
-#: ../globals.h:1015
-#, c-format
-msgid "E475: Invalid argument: %s"
-msgstr "E475: ฬตธ๚คสฐ๚ฟ๔ควคน: %s"
+msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
+msgstr "ฅนฅฏฅํกผฅ๋ฅะกผ: ฒ่มค๒ผ่ฦภควคญคคปค๓ควคทคฟ."
-#: ../globals.h:1016
-#, c-format
-msgid "E15: Invalid expression: %s"
-msgstr "E15: ฬตธ๚คสผฐควคน: %s"
+msgid "Vim dialog"
+msgstr "Vim ฅภฅคฅขฅํฅฐ"
-#: ../globals.h:1017
-msgid "E16: Invalid range"
-msgstr "E16: ฬตธ๚คสศฯฐฯควคน"
+msgid "E232: Cannot create BalloonEval with both message and callback"
+msgstr "E232: ฅแฅรฅปกผฅธคศฅณกผฅ๋ฅะฅรฅฏคฮคขค๋ BalloonEval ค๒บ๎ภฎควคญคคปค๓"
-#: ../globals.h:1018
-msgid "E476: Invalid command"
-msgstr "E476: ฬตธ๚คสฅณฅฅ๓ฅษควคน"
+msgid "_Cancel"
+msgstr "ฅญฅใฅ๓ฅปฅ๋(_C)"
-#: ../globals.h:1019
-#, c-format
-msgid "E17: \"%s\" is a directory"
-msgstr "E17: \"%s\" คฯฅวฅฃฅ์ฅฏฅศฅ๊ควคน"
+msgid "_Save"
+msgstr "สยธ(_S)"
-#: ../globals.h:1020
-#, fuzzy
-msgid "E900: Invalid job id"
-msgstr "E49: ฬตธ๚คสฅนฅฏฅํกผฅ๋ฮฬควคน"
+msgid "_Open"
+msgstr "ณซคฏ(_O)"
-#: ../globals.h:1021
-msgid "E901: Job table is full"
-msgstr ""
+msgid "_OK"
+msgstr "_OK"
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
+msgid ""
+"&Yes\n"
+"&No\n"
+"&Cancel"
msgstr ""
+"คฯคค(&Y)\n"
+"คคคคคจ(&N)\n"
+"ฅญฅใฅ๓ฅปฅ๋(&C)"
-#: ../globals.h:1024
-#, c-format
-msgid "E364: Library call failed for \"%s()\""
-msgstr "E364: \"%s\"() คฮฅ้ฅคฅึฅ้ฅ๊ธฦฝะคหผบวิคทคคทคฟ"
+msgid "Yes"
+msgstr "คฯคค"
-#: ../globals.h:1026
-msgid "E19: Mark has invalid line number"
-msgstr "E19: ฅกผฅฏคหฬตธ๚คสนิศึนๆคฌปุฤ๊คตค์คฦคคคคทคฟ"
+msgid "No"
+msgstr "คคคคคจ"
-#: ../globals.h:1027
-msgid "E20: Mark not set"
-msgstr "E20: ฅกผฅฏคฯภ฿ฤ๊คตค์คฦคคคคปค๓"
+msgid "Input _Methods"
+msgstr "ฅคฅ๓ฅืฅรฅศฅแฅฝฅรฅษ"
-#: ../globals.h:1029
-msgid "E21: Cannot make changes, 'modifiable' is off"
-msgstr "E21: 'modifiable' คฌฅชฅีคสคฮคว, สันนควคญคคปค๓"
+msgid "VIM - Search and Replace..."
+msgstr "VIM - ธกบ๗คศรึดน..."
-#: ../globals.h:1030
-msgid "E22: Scripts nested too deep"
-msgstr "E22: ฅนฅฏฅ๊ฅืฅศคฮฦค์ปาคฌฟผฒแคฎคคน"
-
-#: ../globals.h:1031
-msgid "E23: No alternate file"
-msgstr "E23: ษ๛ฅีฅกฅคฅ๋คฯคขค๊คคปค๓"
+msgid "VIM - Search..."
+msgstr "VIM - ธกบ๗..."
-#: ../globals.h:1032
-msgid "E24: No such abbreviation"
-msgstr "E24: คฝคฮค่คฆคสรปฝฬฦฮฯคฯคขค๊คคปค๓"
-
-#: ../globals.h:1033
-msgid "E477: No ! allowed"
-msgstr "E477: ! คฯต๖ฒฤคตค์คฦคคคคปค๓"
+msgid "Find what:"
+msgstr "ธกบ๗สธป๚ฮ๓:"
-#: ../globals.h:1035
-msgid "E25: Nvim does not have a built-in GUI"
-msgstr "E25: GUIคฯปศอัษิฒฤวฝควคน: ฅณฅ๓ฅัฅคฅ๋ปคหฬตธ๚คหคตค์คฦคคคคน"
+msgid "Replace with:"
+msgstr "รึดนสธป๚ฮ๓:"
-#: ../globals.h:1036
-#, c-format
-msgid "E28: No such highlight group name: %s"
-msgstr "E28: คฝคฮค่คฆคสฬพคฮฅฯฅคฅ้ฅคฅศฅฐฅ๋กผฅืคฯคขค๊คคปค๓: %s"
+msgid "Match whole word only"
+msgstr "ภตณฮคหณบล๖คนค๋คโคฮคภคฑ"
-#: ../globals.h:1037
-msgid "E29: No inserted text yet"
-msgstr "E29: คคภฅฦฅญฅนฅศคฌมฦคตค์คฦคคคคปค๓"
+msgid "Match case"
+msgstr "ย็สธป๚/พฎสธป๚ค๒ถ่สฬคนค๋"
-#: ../globals.h:1038
-msgid "E30: No previous command line"
-msgstr "E30: ฐสมฐคหฅณฅฅ๓ฅษนิคฌคขค๊คคปค๓"
+msgid "Direction"
+msgstr "สธ"
-#: ../globals.h:1039
-msgid "E31: No such mapping"
-msgstr "E31: คฝคฮค่คฆคสฅฅรฅิฅ๓ฅฐคฯคขค๊คคปค๓"
+msgid "Up"
+msgstr "พๅ"
-#: ../globals.h:1040
-msgid "E479: No match"
-msgstr "E479: ณบล๖คฯคขค๊คคปค๓"
+msgid "Down"
+msgstr "ฒผ"
-#: ../globals.h:1041
-#, c-format
-msgid "E480: No match: %s"
-msgstr "E480: ณบล๖คฯคขค๊คคปค๓: %s"
+msgid "Find Next"
+msgstr "ผกค๒ธกบ๗"
-#: ../globals.h:1042
-msgid "E32: No file name"
-msgstr "E32: ฅีฅกฅคฅ๋ฬพคฌคขค๊คคปค๓"
+msgid "Replace"
+msgstr "รึดน"
-#: ../globals.h:1044
-msgid "E33: No previous substitute regular expression"
-msgstr "E33: ภตตฌษฝธฝรึดนคฌคคภผยนิคตค์คฦคคคคปค๓"
+msgid "Replace All"
+msgstr "มดคฦรึดน"
-#: ../globals.h:1045
-msgid "E34: No previous command"
-msgstr "E34: ฅณฅฅ๓ฅษคฌคคภผยนิคตค์คฦคคคคปค๓"
+msgid "_Close"
+msgstr "สฤคธค๋(_C)"
-#: ../globals.h:1046
-msgid "E35: No previous regular expression"
-msgstr "E35: ภตตฌษฝธฝคฌคคภผยนิคตค์คฦคคคคปค๓"
+msgid "Vim: Received \"die\" request from session manager\n"
+msgstr "Vim: ฅปฅรฅทฅ็ฅ๓ฅฅอกผฅธฅใคซค้ \"die\" อืตแค๒ผ๕คฑผ่ค๊คคทคฟ\n"
-#: ../globals.h:1047
-msgid "E481: No range allowed"
-msgstr "E481: ศฯฐฯปุฤ๊คฯต๖ฒฤคตค์คฦคคคคปค๓"
+msgid "Close tab"
+msgstr "ฅฟฅึฅฺกผฅธค๒สฤคธค๋"
-#: ../globals.h:1048
-msgid "E36: Not enough room"
-msgstr "E36: ฅฆฅฃฅ๓ฅษฅฆคหฝฝสฌคสนโคตคโคทคฏคฯษคฌคขค๊คคปค๓"
+msgid "New tab"
+msgstr "ฟทตฌฅฟฅึฅฺกผฅธ"
-#: ../globals.h:1049
-#, c-format
-msgid "E482: Can't create file %s"
-msgstr "E482: ฅีฅกฅคฅ๋ %s ค๒บ๎ภฎควคญคคปค๓"
+msgid "Open Tab..."
+msgstr "ฅฟฅึฅฺกผฅธค๒ณซคฏ..."
-#: ../globals.h:1050
-msgid "E483: Can't get temp file name"
-msgstr "E483: ฐ์ปฅีฅกฅคฅ๋คฮฬพมฐค๒ผ่ฦภควคญคคปค๓"
+msgid "Vim: Main window unexpectedly destroyed\n"
+msgstr "Vim: ฅแฅคฅ๓ฅฆฅฃฅ๓ฅษฅฆคฌษิฐีคหวหฒ๕คตค์คคทคฟ\n"
-#: ../globals.h:1051
-#, c-format
-msgid "E484: Can't open file %s"
-msgstr "E484: ฅีฅกฅคฅ๋ \"%s\" ค๒ณซคฑคคปค๓"
+msgid "&Filter"
+msgstr "ฅีฅฃฅ๋ฅฟ(&F)"
-#: ../globals.h:1052
-#, c-format
-msgid "E485: Can't read file %s"
-msgstr "E485: ฅีฅกฅคฅ๋ %s ค๒ฦษนคแคคปค๓"
+msgid "&Cancel"
+msgstr "ฅญฅใฅ๓ฅปฅ๋(&C)"
-#: ../globals.h:1054
-msgid "E37: No write since last change (add ! to override)"
-msgstr "E37: บวธๅคฮสันนคฌสยธคตค์คฦคคคคปค๓ (! ค๒ฤษฒรควสันนค๒วหด)"
+msgid "Directories"
+msgstr "ฅวฅฃฅ์ฅฏฅศฅ๊"
-#: ../globals.h:1055
-msgid "E37: No write since last change"
-msgstr "E37: บวธๅคฮสันนคฌสยธคตค์คฦคคคคปค๓"
+msgid "Filter"
+msgstr "ฅีฅฃฅ๋ฅฟ"
-#: ../globals.h:1056
-msgid "E38: Null argument"
-msgstr "E38: ฐ๚ฟ๔คฌถ๕ควคน"
+msgid "&Help"
+msgstr "ฅุฅ๋ฅื(&H)"
-#: ../globals.h:1057
-msgid "E39: Number expected"
-msgstr "E39: ฟ๔รอคฌอืตแคตค์คฦคคคคน"
+msgid "Files"
+msgstr "ฅีฅกฅคฅ๋"
-#: ../globals.h:1058
-#, c-format
-msgid "E40: Can't open errorfile %s"
-msgstr "E40: ฅจฅ้กผฅีฅกฅคฅ๋ %s ค๒ณซคฑคคปค๓"
+msgid "&OK"
+msgstr "&OK"
-#: ../globals.h:1059
-msgid "E41: Out of memory!"
-msgstr "E41: ฅแฅโฅ๊คฌฟิคญฒฬคฦคคทคฟ!"
+msgid "Selection"
+msgstr "มชย๒"
-#: ../globals.h:1060
-msgid "Pattern not found"
-msgstr "ฅัฅฟกผฅ๓คฯธซคฤคซค๊คคปค๓ควคทคฟ"
+msgid "Find &Next"
+msgstr "ผกค๒ธกบ๗(&N)"
-#: ../globals.h:1061
-#, c-format
-msgid "E486: Pattern not found: %s"
-msgstr "E486: ฅัฅฟกผฅ๓คฯธซคฤคซค๊คคปค๓ควคทคฟ: %s"
+msgid "&Replace"
+msgstr "รึดน(&R)"
-#: ../globals.h:1062
-msgid "E487: Argument must be positive"
-msgstr "E487: ฐ๚ฟ๔คฯภตคฮรอควคสคฑค์คะคสค๊คคปค๓"
+msgid "Replace &All"
+msgstr "มดคฦรึดน(&A)"
-#: ../globals.h:1064
-msgid "E459: Cannot go back to previous directory"
-msgstr "E459: มฐคฮฅวฅฃฅ์ฅฏฅศฅ๊คหฬแค์คคปค๓"
+msgid "&Undo"
+msgstr "ฅขฅ๓ฅษฅฅ(&U)"
-#: ../globals.h:1066
-msgid "E42: No Errors"
-msgstr "E42: ฅจฅ้กผคฯคขค๊คคปค๓"
+msgid "Open tab..."
+msgstr "ฅฟฅึฅฺกผฅธค๒ณซคฏ"
-#: ../globals.h:1067
-msgid "E776: No location list"
-msgstr "E776: ฅํฅฑกผฅทฅ็ฅ๓ฅ๊ฅนฅศคฯคขค๊คคปค๓"
+msgid "Find string (use '\\\\' to find a '\\')"
+msgstr "ธกบ๗สธป๚ฮ๓ ('\\' ค๒ธกบ๗คนค๋คหคฯ '\\\\')"
-#: ../globals.h:1068
-msgid "E43: Damaged match string"
-msgstr "E43: ณบล๖สธป๚ฮ๓คฌวหยปคทคฦคคคคน"
+msgid "Find & Replace (use '\\\\' to find a '\\')"
+msgstr "ธกบ๗กฆรึดน ('\\' ค๒ธกบ๗คนค๋คหคฯ '\\\\')"
-#: ../globals.h:1069
-msgid "E44: Corrupted regexp program"
-msgstr "E44: ษิภตคสภตตฌษฝธฝฅืฅํฅฐฅ้ฅเควคน"
+msgid "Not Used"
+msgstr "ปศค๏ค์คคปค๓"
-#: ../globals.h:1071
-msgid "E45: 'readonly' option is set (add ! to override)"
-msgstr "E45: 'readonly' ฅชฅืฅทฅ็ฅ๓คฌภ฿ฤ๊คตค์คฦคคคคน (! ค๒ฤษฒรควพๅฝ๑คญ)"
+msgid "Directory\t*.nothing\n"
+msgstr "ฅวฅฃฅ์ฅฏฅศฅ๊\t*.nothing\n"
-#: ../globals.h:1073
#, c-format
-msgid "E46: Cannot change read-only variable \"%s\""
-msgstr "E46: ฦษผ่ภ์อัสัฟ๔ \"%s\" คหคฯรอค๒ภ฿ฤ๊ควคญคคปค๓"
+msgid "E671: Cannot find window title \"%s\""
+msgstr "E671: ฅฟฅคฅศฅ๋คฌ \"%s\" คฮฅฆฅฃฅ๓ฅษฅฆคฯธซคฤคซค๊คคปค๓"
-#: ../globals.h:1075
#, c-format
-msgid "E794: Cannot set variable in the sandbox: \"%s\""
-msgstr "E794: ฅตฅ๓ฅษฅฅรฅฏฅนควคฯสัฟ๔ \"%s\" คหรอค๒ภ฿ฤ๊ควคญคคปค๓"
+msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
+msgstr "E243: ฐ๚ฟ๔คฯฅตฅกผฅศคตค์คคปค๓: \"-%s\"; OLEศวค๒ปศอัคทคฦคฏคภคตคค."
-#: ../globals.h:1076
-msgid "E47: Error while reading errorfile"
-msgstr "E47: ฅจฅ้กผฅีฅกฅคฅ๋คฮฦษนรๆคหฅจฅ้กผคฌศฏภธคทคคทคฟ"
+msgid "E672: Unable to open window inside MDI application"
+msgstr "E672: MDIฅขฅืฅ๊คฮรๆควคฯฅฆฅฃฅ๓ฅษฅฆค๒ณซคฑคคปค๓"
-#: ../globals.h:1078
-msgid "E48: Not allowed in sandbox"
-msgstr "E48: ฅตฅ๓ฅษฅฅรฅฏฅนควคฯต๖คตค์คคปค๓"
+msgid "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
+msgstr "Vim E458: ฟงปุฤ๊คฌภตคทคฏคสคคคฮควฅจฅ๓ฅศฅ๊ค๒ณไค๊ล๖คฦค้ค์คคปค๓"
-#: ../globals.h:1080
-msgid "E523: Not allowed here"
-msgstr "E523: คณคณควคฯต๖ฒฤคตค์คคปค๓"
-
-#: ../globals.h:1082
-msgid "E359: Screen mode setting not supported"
-msgstr "E359: ฅนฅฏฅ๊กผฅ๓ฅโกผฅษคฮภ฿ฤ๊คหคฯยะฑคทคฦคคคคปค๓"
-
-#: ../globals.h:1083
-msgid "E49: Invalid scroll size"
-msgstr "E49: ฬตธ๚คสฅนฅฏฅํกผฅ๋ฮฬควคน"
-
-#: ../globals.h:1084
-msgid "E91: 'shell' option is empty"
-msgstr "E91: 'shell' ฅชฅืฅทฅ็ฅ๓คฌถ๕ควคน"
-
-#: ../globals.h:1085
-msgid "E255: Couldn't read in sign data!"
-msgstr "E255: sign คฮฅวกผฅฟค๒ฦษนคแคคปค๓ควคทคฟ"
-
-#: ../globals.h:1086
-msgid "E72: Close error on swap file"
-msgstr "E72: ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คฮฅฏฅํกผฅบปฅจฅ้กผควคน"
-
-#: ../globals.h:1087
-msgid "E73: tag stack empty"
-msgstr "E73: ฅฟฅฐฅนฅฟฅรฅฏคฌถ๕ควคน"
-
-#: ../globals.h:1088
-msgid "E74: Command too complex"
-msgstr "E74: ฅณฅฅ๓ฅษคฌสฃปจฒแคฎคคน"
-
-#: ../globals.h:1089
-msgid "E75: Name too long"
-msgstr "E75: ฬพมฐคฌฤนฒแคฎคคน"
+#, c-format
+msgid "E250: Fonts for the following charsets are missing in fontset %s:"
+msgstr "E250: ฐสฒผคฮสธป๚ฅปฅรฅศคฮฅีฅฉฅ๓ฅศคฌคขค๊คคปค๓ %s:"
-#: ../globals.h:1090
-msgid "E76: Too many ["
-msgstr "E76: [ คฌยฟฒแคฎคคน"
+#, c-format
+msgid "E252: Fontset name: %s"
+msgstr "E252: ฅีฅฉฅ๓ฅศฅปฅรฅศฬพ: %s"
-#: ../globals.h:1091
-msgid "E77: Too many file names"
-msgstr "E77: ฅีฅกฅคฅ๋ฬพคฌยฟฒแคฎคคน"
+#, c-format
+msgid "Font '%s' is not fixed-width"
+msgstr "ฅีฅฉฅ๓ฅศ '%s' คฯธวฤ๊ษควคฯคขค๊คคปค๓"
-#: ../globals.h:1092
-msgid "E488: Trailing characters"
-msgstr "E488: อพสฌคสสธป๚คฌธๅคํคหคขค๊คคน"
+#, c-format
+msgid "E253: Fontset name: %s"
+msgstr "E253: ฅีฅฉฅ๓ฅศฅปฅรฅศฬพ: %s"
-#: ../globals.h:1093
-msgid "E78: Unknown mark"
-msgstr "E78: ฬครฮคฮฅกผฅฏ"
+#, c-format
+msgid "Font0: %s"
+msgstr "ฅีฅฉฅ๓ฅศ0: %s"
-#: ../globals.h:1094
-msgid "E79: Cannot expand wildcards"
-msgstr "E79: ฅ๏ฅคฅ๋ฅษฅซกผฅษค๒ลธณซควคญคคปค๓"
+#, c-format
+msgid "Font1: %s"
+msgstr "ฅีฅฉฅ๓ฅศ1: %s"
-#: ../globals.h:1096
-msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
-msgstr "E591: 'winheight' คฯ 'winminheight' ค่ค๊พฎคตคฏควคญคคปค๓"
+#, c-format
+msgid "Font%ld width is not twice that of font0"
+msgstr "ฅีฅฉฅ๓ฅศ%ld คฮษคฌฅีฅฉฅ๓ฅศ0คฮ2วควคฯคขค๊คคปค๓"
-#: ../globals.h:1098
-msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
-msgstr "E592: 'winwidth' คฯ 'winminwidth' ค่ค๊พฎคตคฏควคญคคปค๓"
+#, c-format
+msgid "Font0 width: %ld"
+msgstr "ฅีฅฉฅ๓ฅศ0คฮษ: %ld"
-#: ../globals.h:1099
-msgid "E80: Error while writing"
-msgstr "E80: ฝ๑นค฿รๆคฮฅจฅ้กผ"
+#, c-format
+msgid "Font1 width: %ld"
+msgstr "ฅีฅฉฅ๓ฅศ1คฮษ: %ld"
-#: ../globals.h:1100
-msgid "Zero count"
-msgstr "ฅผฅํฅซฅฆฅ๓ฅศ"
+msgid "Invalid font specification"
+msgstr "ฬตธ๚คสฅีฅฉฅ๓ฅศปุฤ๊ควคน"
-#: ../globals.h:1101
-msgid "E81: Using <SID> not in a script context"
-msgstr "E81: ฅนฅฏฅ๊ฅืฅศฐสณฐคว<SID>คฌปศค๏ค์คคทคฟ"
+msgid "&Dismiss"
+msgstr "ตัฒผคนค๋(&D)"
-#: ../globals.h:1102
-#, c-format
-msgid "E685: Internal error: %s"
-msgstr "E685: ฦโษ๔ฅจฅ้กผควคน: %s"
+msgid "no specific match"
+msgstr "ฅฅรฅมคนค๋คโคฮคฌคขค๊คคปค๓"
-#: ../globals.h:1104
-msgid "E363: pattern uses more memory than 'maxmempattern'"
-msgstr "E363: ฅัฅฟกผฅ๓คฌ 'maxmempattern' ฐสพๅคฮฅแฅโฅ๊ค๒ปศอัคทคคน"
+msgid "Vim - Font Selector"
+msgstr "Vim - ฅีฅฉฅ๓ฅศมชย๒"
-#: ../globals.h:1105
-msgid "E749: empty buffer"
-msgstr "E749: ฅะฅรฅีฅกคฌถ๕ควคน"
+msgid "Name:"
+msgstr "ฬพมฐ:"
-#: ../globals.h:1108
-msgid "E682: Invalid search pattern or delimiter"
-msgstr "E682: ธกบ๗ฅัฅฟกผฅ๓คซถ่ภฺค๊ตญนๆคฌษิภตควคน"
+msgid "Show size in Points"
+msgstr "ฅตฅคฅบค๒ฅฅคฅ๓ฅศควษฝผจคนค๋"
-#: ../globals.h:1109
-msgid "E139: File is loaded in another buffer"
-msgstr "E139: ฦฑคธฬพมฐคฮฅีฅกฅคฅ๋คฌยพคฮฅะฅรฅีฅกควฦษนคค์คฦคคคคน"
+msgid "Encoding:"
+msgstr "ฅจฅ๓ฅณกผฅษ:"
-#: ../globals.h:1110
-#, c-format
-msgid "E764: Option '%s' is not set"
-msgstr "E764: ฅชฅืฅทฅ็ฅ๓ '%s' คฯภ฿ฤ๊คตค์คฦคคคคปค๓"
+msgid "Font:"
+msgstr "ฅีฅฉฅ๓ฅศ:"
-#: ../globals.h:1111
-msgid "E850: Invalid register name"
-msgstr "E850: ฬตธ๚คสฅ์ฅธฅนฅฟฬพควคน"
+msgid "Style:"
+msgstr "ฅนฅฟฅคฅ๋:"
-#: ../globals.h:1114
-msgid "search hit TOP, continuing at BOTTOM"
-msgstr "พๅคควธกบ๗คทคฟคฮควฒผคหฬแค๊คคน"
+msgid "Size:"
+msgstr "ฅตฅคฅบ:"
-#: ../globals.h:1115
-msgid "search hit BOTTOM, continuing at TOP"
-msgstr "ฒผคควธกบ๗คทคฟคฮควพๅคหฬแค๊คคน"
+msgid "E256: Hangul automata ERROR"
+msgstr "E256: ฅฯฅ๓ฅฐฅ๋ฅชกผฅศฅฅศฅ๓ฅจฅ้กผ"
-#: ../hardcopy.c:240
msgid "E550: Missing colon"
msgstr "E550: ฅณฅํฅ๓คฌคขค๊คคปค๓"
-#: ../hardcopy.c:252
msgid "E551: Illegal component"
msgstr "E551: ษิภตคสนฝสธอืมวควคน"
-#: ../hardcopy.c:259
msgid "E552: digit expected"
msgstr "E552: ฟ๔รอคฌษฌอืควคน"
-#: ../hardcopy.c:473
#, c-format
msgid "Page %d"
msgstr "%d ฅฺกผฅธ"
-#: ../hardcopy.c:597
msgid "No text to be printed"
msgstr "ฐ๕บคนค๋ฅฦฅญฅนฅศคฌคขค๊คคปค๓"
-#: ../hardcopy.c:668
#, c-format
msgid "Printing page %d (%d%%)"
msgstr "ฐ๕บรๆ: ฅฺกผฅธ %d (%d%%)"
-#: ../hardcopy.c:680
#, c-format
msgid " Copy %d of %d"
msgstr " ฅณฅิกผ %d (มด %d รๆ)"
-#: ../hardcopy.c:733
#, c-format
msgid "Printed: %s"
msgstr "ฐ๕บคทคคทคฟ: %s"
-#: ../hardcopy.c:740
msgid "Printing aborted"
msgstr "ฐ๕บคฌรๆป฿คตค์คคทคฟ"
-#: ../hardcopy.c:1365
msgid "E455: Error writing to PostScript output file"
msgstr "E455: PostScriptฝะฮฯฅีฅกฅคฅ๋คฮฝ๑นค฿ฅจฅ้กผควคน"
-#: ../hardcopy.c:1747
#, c-format
msgid "E624: Can't open file \"%s\""
msgstr "E624: ฅีฅกฅคฅ๋ \"%s\" ค๒ณซคฑคคปค๓"
-#: ../hardcopy.c:1756 ../hardcopy.c:2470
#, c-format
msgid "E457: Can't read PostScript resource file \"%s\""
msgstr "E457: PostScriptคฮฅ๊ฅฝกผฅนฅีฅกฅคฅ๋ \"%s\" ค๒ฦษนคแคคปค๓"
-#: ../hardcopy.c:1772
#, c-format
msgid "E618: file \"%s\" is not a PostScript resource file"
msgstr "E618: ฅีฅกฅคฅ๋ \"%s\" คฯ PostScript ฅ๊ฅฝกผฅนฅีฅกฅคฅ๋ควคฯคขค๊คคปค๓"
-#: ../hardcopy.c:1788 ../hardcopy.c:1805 ../hardcopy.c:1844
#, c-format
msgid "E619: file \"%s\" is not a supported PostScript resource file"
msgstr "E619: ฅีฅกฅคฅ๋ \"%s\" คฯยะฑคทคฦคคคสคค PostScript ฅ๊ฅฝกผฅนฅีฅกฅคฅ๋ควคน"
-#: ../hardcopy.c:1856
#, c-format
msgid "E621: \"%s\" resource file has wrong version"
msgstr "E621: ฅ๊ฅฝกผฅนฅีฅกฅคฅ๋ \"%s\" คฯฅะกผฅธฅ็ฅ๓คฌฐคสค๊คคน"
-#: ../hardcopy.c:2225
msgid "E673: Incompatible multi-byte encoding and character set."
msgstr "E673: ธ฿ดนภญคฮฬตคคฅฅ๋ฅมฅะฅคฅศฅจฅ๓ฅณกผฅวฅฃฅ๓ฅฐคศสธป๚ฅปฅรฅศควคน"
-#: ../hardcopy.c:2238
msgid "E674: printmbcharset cannot be empty with multi-byte encoding."
msgstr "E674: ฅฅ๋ฅมฅะฅคฅศฅจฅ๓ฅณกผฅวฅฃฅ๓ฅฐควคฯ printmbcharset ค๒ถ๕คหควคญคคปค๓"
-#: ../hardcopy.c:2254
msgid "E675: No default font specified for multi-byte printing."
msgstr ""
"E675: ฅฅ๋ฅมฅะฅคฅศสธป๚ค๒ฐ๕บคนค๋คฟคแคฮฅวฅีฅฉฅ๋ฅศฅีฅฉฅ๓ฅศคฌปุฤ๊คตค์คฦคคคคปค๓"
-#: ../hardcopy.c:2426
msgid "E324: Can't open PostScript output file"
msgstr "E324: PostScriptฝะฮฯอัคฮฅีฅกฅคฅ๋ค๒ณซคฑคคปค๓"
-#: ../hardcopy.c:2458
#, c-format
msgid "E456: Can't open file \"%s\""
msgstr "E456: ฅีฅกฅคฅ๋ \"%s\" ค๒ณซคฑคคปค๓"
-#: ../hardcopy.c:2583
msgid "E456: Can't find PostScript resource file \"prolog.ps\""
msgstr "E456: PostScriptคฮฅ๊ฅฝกผฅนฅีฅกฅคฅ๋ \"prolog.ps\" คฌธซคฤคซค๊คคปค๓"
-#: ../hardcopy.c:2593
msgid "E456: Can't find PostScript resource file \"cidfont.ps\""
msgstr "E456: PostScriptคฮฅ๊ฅฝกผฅนฅีฅกฅคฅ๋ \"cidfont.ps\" คฌธซคฤคซค๊คคปค๓"
-#: ../hardcopy.c:2622 ../hardcopy.c:2639 ../hardcopy.c:2665
#, c-format
msgid "E456: Can't find PostScript resource file \"%s.ps\""
msgstr "E456: PostScriptคฮฅ๊ฅฝกผฅนฅีฅกฅคฅ๋ \"%s.ps\" คฌธซคฤคซค๊คคปค๓"
-#: ../hardcopy.c:2654
#, c-format
msgid "E620: Unable to convert to print encoding \"%s\""
msgstr "E620: ฐ๕บฅจฅ๓ฅณกผฅษ \"%s\" คุสัดนควคญคคปค๓"
-#: ../hardcopy.c:2877
msgid "Sending to printer..."
msgstr "ฅืฅ๊ฅ๓ฅฟคหม๗ฟฎรๆ..."
-#: ../hardcopy.c:2881
msgid "E365: Failed to print PostScript file"
msgstr "E365: PostScriptฅีฅกฅคฅ๋คฮฐ๕บคหผบวิคทคคทคฟ"
-#: ../hardcopy.c:2883
msgid "Print job sent."
msgstr "ฐ๕บฅธฅ็ฅึค๒ม๗ฟฎคทคคทคฟ."
-#: ../if_cscope.c:85
msgid "Add a new database"
msgstr "ฟทฅวกผฅฟฅูกผฅนค๒ฤษฒร"
-#: ../if_cscope.c:87
msgid "Query for a pattern"
msgstr "ฅัฅฟกผฅ๓คฮฅฏฅจฅ๊กผค๒ฤษฒร"
-#: ../if_cscope.c:89
msgid "Show this message"
msgstr "คณคฮฅแฅรฅปกผฅธค๒ษฝผจคนค๋"
-#: ../if_cscope.c:91
msgid "Kill a connection"
msgstr "ภยณค๒ฝชฮปคนค๋"
-#: ../if_cscope.c:93
msgid "Reinit all connections"
msgstr "มดคฦคฮภยณค๒บฦฝ้ดฒฝคนค๋"
-#: ../if_cscope.c:95
msgid "Show connections"
msgstr "ภยณค๒ษฝผจคนค๋"
-#: ../if_cscope.c:101
#, c-format
msgid "E560: Usage: cs[cope] %s"
msgstr "E560: ปศอัสหก: cs[cope] %s"
-#: ../if_cscope.c:225
msgid "This cscope command does not support splitting the window.\n"
msgstr "คณคฮcscopeฅณฅฅ๓ฅษคฯสฌณไฅฆฅฃฅ๓ฅษฅฆควคฯฅตฅกผฅศคตค์คคปค๓.\n"
-#: ../if_cscope.c:266
msgid "E562: Usage: cstag <ident>"
msgstr "E562: ปศอัหก: cstag <ident>"
-#: ../if_cscope.c:313
msgid "E257: cstag: tag not found"
msgstr "E257: cstag: ฅฟฅฐคฌธซคฤคซค๊คคปค๓"
-#: ../if_cscope.c:461
#, c-format
msgid "E563: stat(%s) error: %d"
msgstr "E563: stat(%s) ฅจฅ้กผ: %d"
-#: ../if_cscope.c:551
+msgid "E563: stat error"
+msgstr "E563: stat ฅจฅ้กผ"
+
#, c-format
msgid "E564: %s is not a directory or a valid cscope database"
msgstr "E564: %s คฯฅวฅฃฅ์ฅฏฅศฅ๊ตฺคำอญธ๚คสcscopeคฮฅวกผฅฟฅูกผฅนควคฯคขค๊คคปค๓"
-#: ../if_cscope.c:566
#, c-format
msgid "Added cscope database %s"
msgstr "cscopeฅวกผฅฟฅูกผฅน %s ค๒ฤษฒร"
-#: ../if_cscope.c:616
#, c-format
-msgid "E262: error reading cscope connection %<PRId64>"
-msgstr "E262: cscopeคฮภยณ %<PRId64> ค๒ฦษนค฿รๆคฮฅจฅ้กผควคน"
+msgid "E262: error reading cscope connection %ld"
+msgstr "E262: cscopeคฮภยณ %ld ค๒ฦษนค฿รๆคฮฅจฅ้กผควคน"
-#: ../if_cscope.c:711
msgid "E561: unknown cscope search type"
msgstr "E561: ฬครฮคฮcscopeธกบ๗ทฟควคน"
-#: ../if_cscope.c:752 ../if_cscope.c:789
msgid "E566: Could not create cscope pipes"
msgstr "E566: cscopeฅัฅคฅืค๒บ๎ภฎควคญคคปค๓ควคทคฟ"
-#: ../if_cscope.c:767
msgid "E622: Could not fork for cscope"
msgstr "E622: cscopeคฮตฏฦฐฝเศ๗(fork)คหผบวิคทคคทคฟ"
-#: ../if_cscope.c:849
msgid "cs_create_connection setpgid failed"
msgstr "cs_create_connection คุคฮ setpgid คหผบวิคทคคทคฟ"
-#: ../if_cscope.c:853 ../if_cscope.c:889
msgid "cs_create_connection exec failed"
msgstr "cs_create_connection คฮผยนิคหผบวิคทคคทคฟ"
-#: ../if_cscope.c:863 ../if_cscope.c:902
msgid "cs_create_connection: fdopen for to_fp failed"
msgstr "cs_create_connection: to_fp คฮ fdopen คหผบวิคทคคทคฟ"
-#: ../if_cscope.c:865 ../if_cscope.c:906
msgid "cs_create_connection: fdopen for fr_fp failed"
msgstr "cs_create_connection: fr_fp คฮ fdopen คหผบวิคทคคทคฟ"
-#: ../if_cscope.c:890
msgid "E623: Could not spawn cscope process"
msgstr "E623: cscopeฅืฅํฅปฅนค๒ตฏฦฐควคญคคปค๓ควคทคฟ"
-#: ../if_cscope.c:932
msgid "E567: no cscope connections"
msgstr "E567: cscopeภยณคหผบวิคทคคทคฟ"
-#: ../if_cscope.c:1009
#, c-format
msgid "E469: invalid cscopequickfix flag %c for %c"
msgstr "E469: ฬตธ๚คส cscopequickfix ฅีฅ้ฅฐ %c คฮ %c ควคน"
-#: ../if_cscope.c:1058
#, c-format
msgid "E259: no matches found for cscope query %s of %s"
msgstr "E259: cscopeฅฏฅจฅ๊กผ %s of %s คหณบล๖คฌคขค๊คคปค๓ควคทคฟ"
-#: ../if_cscope.c:1142
msgid "cscope commands:\n"
msgstr "cscopeฅณฅฅ๓ฅษ:\n"
-#: ../if_cscope.c:1150
#, c-format
msgid "%-5s: %s%*s (Usage: %s)"
msgstr "%-5s: %s%*s (ปศอัหก: %s)"
-#: ../if_cscope.c:1155
msgid ""
"\n"
+" a: Find assignments to this symbol\n"
" c: Find functions calling this function\n"
" d: Find functions called by this function\n"
" e: Find this egrep pattern\n"
@@ -3239,6 +2584,7 @@ msgid ""
" t: Find this text string\n"
msgstr ""
"\n"
+" a: คณคฮฅทฅ๓ฅฅ๋คหยะคนค๋ยๅฦค๒รตคน\n"
" c: คณคฮดุฟ๔ค๒ธฦค๓ควคคค๋ดุฟ๔ค๒รตคน\n"
" d: คณคฮดุฟ๔คซค้ธฦค๓ควคคค๋ดุฟ๔ค๒รตคน\n"
" e: คณคฮegrepฅัฅฟกผฅ๓ค๒รตคน\n"
@@ -3248,31 +2594,31 @@ msgstr ""
" s: คณคฮCฅทฅ๓ฅฅ๋ค๒รตคน\n"
" t: คณคฮฅฦฅญฅนฅศสธป๚ฮ๓ค๒รตคน\n"
-#: ../if_cscope.c:1226
+#, c-format
+msgid "E625: cannot open cscope database: %s"
+msgstr "E625: cscopeฅวกผฅฟฅูกผฅน: %s ค๒ณซคฏคณคศคฌควคญคคปค๓"
+
+msgid "E626: cannot get cscope database information"
+msgstr "E626: cscopeฅวกผฅฟฅูกผฅนคฮพ๐ส๓ค๒ผ่ฦภควคญคคปค๓"
+
msgid "E568: duplicate cscope database not added"
msgstr "E568: ฝลสฃคนค๋cscopeฅวกผฅฟฅูกผฅนคฯฤษฒรคตค์คคปค๓ควคทคฟ"
-#: ../if_cscope.c:1335
#, c-format
msgid "E261: cscope connection %s not found"
msgstr "E261: cscopeภยณ %s คฌธซคฤคซค๊คคปค๓ควคทคฟ"
-#: ../if_cscope.c:1364
#, c-format
msgid "cscope connection %s closed"
msgstr "cscopeภยณ %s คฌสฤคธค้ค์คคทคฟ"
-#. should not reach here
-#: ../if_cscope.c:1486
msgid "E570: fatal error in cs_manage_matches"
msgstr "E570: cs_manage_matches ควรืฬฟลชคสฅจฅ้กผควคน"
-#: ../if_cscope.c:1693
#, c-format
msgid "Cscope tag: %s"
msgstr "Cscope ฅฟฅฐ: %s"
-#: ../if_cscope.c:1711
msgid ""
"\n"
" # line"
@@ -3280,87 +2626,314 @@ msgstr ""
"\n"
" # นิศึนๆ"
-#: ../if_cscope.c:1713
msgid "filename / context / line\n"
msgstr "ฅีฅกฅคฅ๋ฬพ / สธฬฎ / นิ\n"
-#: ../if_cscope.c:1809
#, c-format
msgid "E609: Cscope error: %s"
msgstr "E609: cscopeฅจฅ้กผ: %s"
-#: ../if_cscope.c:2053
msgid "All cscope databases reset"
msgstr "มดคฦคฮcscopeฅวกผฅฟฅูกผฅนค๒ฅ๊ฅปฅรฅศคทคคน"
-#: ../if_cscope.c:2123
msgid "no cscope connections\n"
msgstr "cscopeภยณคฌคขค๊คคปค๓\n"
-#: ../if_cscope.c:2126
msgid " # pid database name prepend path\n"
msgstr " # pid ฅวกผฅฟฅูกผฅนฬพ prepend ฅัฅน\n"
-#: ../main.c:144
+msgid "Lua library cannot be loaded."
+msgstr "Luaฅ้ฅคฅึฅ้ฅ๊ค๒ฅํกผฅษควคญคคปค๓."
+
+msgid "cannot save undo information"
+msgstr "ฅขฅ๓ฅษฅฅพ๐ส๓คฌสยธควคญคคปค๓"
+
+msgid ""
+"E815: Sorry, this command is disabled, the MzScheme libraries could not be "
+"loaded."
+msgstr "E815: คณคฮฅณฅฅ๓ฅษคฯฬตธ๚ควคน. MzScheme ฅ้ฅคฅึฅ้ฅ๊ค๒ฅํกผฅษควคญคคปค๓."
+
+msgid ""
+"E895: Sorry, this command is disabled, the MzScheme's racket/base module "
+"could not be loaded."
+msgstr ""
+"E895: คณคฮฅณฅฅ๓ฅษคฯฬตธ๚ควคนกขคดคแค๓คสคตคค. MzScheme คฮ racket/base ฅโฅธฅๅกผ"
+"ฅ๋คฌฅํกผฅษควคญคคปค๓ควคทคฟ."
+
+msgid "invalid expression"
+msgstr "ฬตธ๚คสผฐควคน"
+
+msgid "expressions disabled at compile time"
+msgstr "ผฐคฯฅณฅ๓ฅัฅคฅ๋ปคหฬตธ๚คหคตค์คฦคคคคน"
+
+msgid "hidden option"
+msgstr "ฑฃคทฅชฅืฅทฅ็ฅ๓"
+
+msgid "unknown option"
+msgstr "ฬครฮคฮฅชฅืฅทฅ็ฅ๓ควคน"
+
+msgid "window index is out of range"
+msgstr "ศฯฐฯณฐคฮฅฆฅฃฅ๓ฅษฅฆศึนๆควคน"
+
+msgid "couldn't open buffer"
+msgstr "ฅะฅรฅีฅกค๒ณซคฑคคปค๓"
+
+msgid "cannot delete line"
+msgstr "นิค๒พรคปคคปค๓"
+
+msgid "cannot replace line"
+msgstr "นิค๒รึดนควคญคคปค๓"
+
+msgid "cannot insert line"
+msgstr "นิค๒มฦควคญคคปค๓"
+
+msgid "string cannot contain newlines"
+msgstr "สธป๚ฮ๓คหคฯฒนิสธป๚ค๒ดคแค้ค์คคปค๓"
+
+msgid "error converting Scheme values to Vim"
+msgstr "SchemeรอคฮVimคุคฮสัดนฅจฅ้กผ"
+
+msgid "Vim error: ~a"
+msgstr "Vim ฅจฅ้กผ: ~a"
+
+msgid "Vim error"
+msgstr "Vim ฅจฅ้กผ"
+
+msgid "buffer is invalid"
+msgstr "ฅะฅรฅีฅกคฯฬตธ๚ควคน"
+
+msgid "window is invalid"
+msgstr "ฅฆฅฃฅ๓ฅษฅฆคฯฬตธ๚ควคน"
+
+msgid "linenr out of range"
+msgstr "ศฯฐฯณฐคฮนิศึนๆควคน"
+
+msgid "not allowed in the Vim sandbox"
+msgstr "ฅตฅ๓ฅษฅฅรฅฏฅนควคฯต๖คตค์คคปค๓"
+
+#, c-format
+msgid "E370: Could not load library %s"
+msgstr "E370: ฅ้ฅคฅึฅ้ฅ๊ %s ค๒ฅํกผฅษควคญคคปค๓ควคทคฟ"
+
+msgid "Sorry, this command is disabled: the Perl library could not be loaded."
+msgstr ""
+"คณคฮฅณฅฅ๓ฅษคฯฬตธ๚ควคนกขคดคแค๓คสคตคค: Perlฅ้ฅคฅึฅ้ฅ๊ค๒ฅํกผฅษควคญคคปค๓ควคทคฟ."
+
+msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
+msgstr ""
+"E299: ฅตฅ๓ฅษฅฅรฅฏฅนควคฯ Safe ฅโฅธฅๅกผฅ๋ค๒ปศอัคทคสคคPerlฅนฅฏฅ๊ฅืฅศคฯถุคธค้ค์"
+"คฦคคคคน"
+
+msgid "E836: This Vim cannot execute :python after using :py3"
+msgstr "E836: คณคฮVimควคฯ :py3 ค๒ปศครคฟธๅคห :python ค๒ปศคจคคปค๓"
+
+msgid ""
+"E263: Sorry, this command is disabled, the Python library could not be "
+"loaded."
+msgstr ""
+"E263: คณคฮฅณฅฅ๓ฅษคฯฬตธ๚ควคนกขคดคแค๓คสคตคค: Pythonฅ้ฅคฅึฅ้ฅ๊ค๒ฅํกผฅษควคญคคป"
+"ค๓ควคทคฟ."
+
+msgid ""
+"E887: Sorry, this command is disabled, the Python's site module could not be "
+"loaded."
+msgstr ""
+"E887: คณคฮฅณฅฅ๓ฅษคฯฬตธ๚ควคนกขคดคแค๓คสคตคค. Python คฮ site ฅโฅธฅๅกผฅ๋ค๒ฅํกผฅษ"
+"ควคญคคปค๓ควคทคฟ."
+
+# Added at 07-Feb-2004.
+msgid "E659: Cannot invoke Python recursively"
+msgstr "E659: Python ค๒บฦตขลชคหผยนิคนค๋คณคศคฯควคญคคปค๓"
+
+msgid "E837: This Vim cannot execute :py3 after using :python"
+msgstr "E837: คณคฮVimควคฯ :python ค๒ปศครคฟธๅคห :py3 ค๒ปศคจคคปค๓"
+
+msgid "E265: $_ must be an instance of String"
+msgstr "E265: $_ คฯสธป๚ฮ๓คฮฅคฅ๓ฅนฅฟฅ๓ฅนควคสคฑค์คะคสค๊คคปค๓"
+
+msgid ""
+"E266: Sorry, this command is disabled, the Ruby library could not be loaded."
+msgstr ""
+"E266: คณคฮฅณฅฅ๓ฅษคฯฬตธ๚ควคนกขคดคแค๓คสคตคค: Rubyฅ้ฅคฅึฅ้ฅ๊ค๒ฅํกผฅษควคญคคปค๓"
+"ควคทคฟ."
+
+msgid "E267: unexpected return"
+msgstr "E267: อฝดคปคฬ return ควคน"
+
+msgid "E268: unexpected next"
+msgstr "E268: อฝดคปคฬ next ควคน"
+
+msgid "E269: unexpected break"
+msgstr "E269: อฝดคปคฬ break ควคน"
+
+msgid "E270: unexpected redo"
+msgstr "E270: อฝดคปคฬ redo ควคน"
+
+msgid "E271: retry outside of rescue clause"
+msgstr "E271: rescue คฮณฐคฮ retry ควคน"
+
+msgid "E272: unhandled exception"
+msgstr "E272: ผ่ค๊ฐทค๏ค์คสคซครคฟฮใณฐคฌคขค๊คคน"
+
+#, c-format
+msgid "E273: unknown longjmp status %d"
+msgstr "E273: ฬครฮคฮlongjmpพ๕ยึ: %d"
+
+msgid "invalid buffer number"
+msgstr "ฬตธ๚คสฅะฅรฅีฅกศึนๆควคน"
+
+msgid "not implemented yet"
+msgstr "คคภผยม๕คตค์คฦคคคคปค๓"
+
+msgid "cannot set line(s)"
+msgstr "นิค๒ภ฿ฤ๊ควคญคคปค๓"
+
+msgid "invalid mark name"
+msgstr "ฬตธ๚คสฅกผฅฏฬพควคน"
+
+msgid "mark not set"
+msgstr "ฅกผฅฏคฯภ฿ฤ๊คตค์คฦคคคคปค๓"
+
+#, c-format
+msgid "row %d column %d"
+msgstr "นิ %d ฮ๓ %d"
+
+msgid "cannot insert/append line"
+msgstr "นิคฮมฦ/ฤษฒรค๒ควคญคคปค๓"
+
+msgid "line number out of range"
+msgstr "ศฯฐฯณฐคฮนิศึนๆควคน"
+
+msgid "unknown flag: "
+msgstr "ฬครฮคฮฅีฅ้ฅฐ: "
+
+msgid "unknown vimOption"
+msgstr "ฬครฮคฮ vimOption ควคน"
+
+msgid "keyboard interrupt"
+msgstr "ฅญกผฅกผฅษณไนค฿"
+
+msgid "vim error"
+msgstr "vim ฅจฅ้กผ"
+
+msgid "cannot create buffer/window command: object is being deleted"
+msgstr ""
+"ฅะฅรฅีฅก/ฅฆฅฃฅ๓ฅษฅฆบ๎ภฎฅณฅฅ๓ฅษค๒บ๎ภฎควคญคคปค๓: ฅชฅึฅธฅงฅฏฅศคฌพรต๎คตค์คฦคคค"
+"คทคฟ"
+
+msgid ""
+"cannot register callback command: buffer/window is already being deleted"
+msgstr ""
+"ฅณกผฅ๋ฅะฅรฅฏฅณฅฅ๓ฅษค๒ละฯฟควคญคคปค๓: ฅะฅรฅีฅก/ฅฆฅฃฅ๓ฅษฅฆคฌด๛คหพรต๎คตค์คคทคฟ"
+
+msgid ""
+"E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-dev@vim."
+"org"
+msgstr ""
+"E280: TCL รืฬฟลชฅจฅ้กผ: reflist ฑ๘ภ๗!? vim-dev@vim.org คหส๓น๐คทคฦคฏคภคตคค"
+
+msgid "cannot register callback command: buffer/window reference not found"
+msgstr ""
+"ฅณกผฅ๋ฅะฅรฅฏฅณฅฅ๓ฅษค๒ละฯฟควคญคคปค๓: ฅะฅรฅีฅก/ฅฆฅฃฅ๓ฅษฅฆคฮปฒพศคฌธซคฤคซค๊คคป"
+"ค๓"
+
+msgid ""
+"E571: Sorry, this command is disabled: the Tcl library could not be loaded."
+msgstr ""
+"E571: คณคฮฅณฅฅ๓ฅษคฯฬตธ๚ควคนกขคดคแค๓คสคตคค: Tclฅ้ฅคฅึฅ้ฅ๊ค๒ฅํกผฅษควคญคคปค๓คว"
+"คทคฟ."
+
+#, c-format
+msgid "E572: exit code %d"
+msgstr "E572: ฝชฮปฅณกผฅษ %d"
+
+msgid "cannot get line"
+msgstr "นิค๒ผ่ฦภควคญคคปค๓"
+
+msgid "Unable to register a command server name"
+msgstr "ฬฟฮแฅตกผฅะกผคฮฬพมฐค๒ละฯฟควคญคคปค๓"
+
+msgid "E248: Failed to send command to the destination program"
+msgstr "E248: ฬลชคฮฅืฅํฅฐฅ้ฅเคุคฮฅณฅฅ๓ฅษม๗ฟฎคหผบวิคทคคทคฟ"
+
+#, c-format
+msgid "E573: Invalid server id used: %s"
+msgstr "E573: ฬตธ๚คสฅตกผฅะกผIDคฌปศค๏ค์คคทคฟ: %s"
+
+msgid "E251: VIM instance registry property is badly formed. Deleted!"
+msgstr "E251: VIM ผยยฮคฮละฯฟฅืฅํฅัฅฦฅฃคฌษิภตควคน. พรต๎คทคคทคฟ!"
+
+#, c-format
+msgid "E938: Duplicate key in JSON: \"%s\""
+msgstr "E938: JSONคหฝลสฃฅญกผคฌคขค๊คคน: \"%s\""
+
+#, c-format
+msgid "E696: Missing comma in List: %s"
+msgstr "E696: ฅ๊ฅนฅศทฟคหฅซฅ๓ฅคฌคขค๊คคปค๓: %s"
+
+#, c-format
+msgid "E697: Missing end of List ']': %s"
+msgstr "E697: ฅ๊ฅนฅศทฟคฮบวธๅคห ']' คฌคขค๊คคปค๓: %s"
+
msgid "Unknown option argument"
msgstr "ฬครฮคฮฅชฅืฅทฅ็ฅ๓ฐ๚ฟ๔ควคน"
-#: ../main.c:146
msgid "Too many edit arguments"
msgstr "สิฝธฐ๚ฟ๔คฌยฟฒแคฎคคน"
-#: ../main.c:148
msgid "Argument missing after"
msgstr "ฐ๚ฟ๔คฌคขค๊คคปค๓"
-#: ../main.c:150
msgid "Garbage after option argument"
msgstr "ฅชฅืฅทฅ็ฅ๓ฐ๚ฟ๔คฮธๅคหฅดฅ฿คฌคขค๊คคน"
-#: ../main.c:152
msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"
msgstr "\"+command\", \"-c command\", \"--cmd command\" คฮฐ๚ฟ๔คฌยฟฒแคฎคคน"
-#: ../main.c:154
msgid "Invalid argument for"
msgstr "ฬตธ๚คสฐ๚ฟ๔ควคน: "
-#: ../main.c:294
#, c-format
msgid "%d files to edit\n"
msgstr "%d ธฤคฮฅีฅกฅคฅ๋คฌสิฝธค๒นตคจคฦคคคคน\n"
-#: ../main.c:1342
+msgid "netbeans is not supported with this GUI\n"
+msgstr "netbeans คฯคณคฮGUIควคฯอ๘อัควคญคคปค๓\n"
+
+msgid "'-nb' cannot be used: not enabled at compile time\n"
+msgstr "'-nb' ปศอัษิฒฤวฝควคน: ฅณฅ๓ฅัฅคฅ๋ปคหฬตธ๚คหคตค์คฦคคคคน\n"
+
+msgid "This Vim was not compiled with the diff feature."
+msgstr "คณคฮVimคหคฯdiffตกวฝคฌคขค๊คคปค๓(ฅณฅ๓ฅัฅคฅ๋ปภ฿ฤ๊)."
+
msgid "Attempt to open script file again: \""
-msgstr "ฅนฅฏฅ๊ฅืฅศฅีฅกฅคฅ๋ค๒บฦคำณซคคคฦค฿คคน: \""
+msgstr "ฅนฅฏฅ๊ฅืฅศฅีฅกฅคฅ๋ค๒บฦคำณซคณคฆคศคทคคทคฟ: \""
-#: ../main.c:1350
msgid "Cannot open for reading: \""
msgstr "ฦษนอัคศคทคฦณซคฑคคปค๓"
-#: ../main.c:1393
msgid "Cannot open for script output: \""
msgstr "ฅนฅฏฅ๊ฅืฅศฝะฮฯอัค๒ณซคฑคคปค๓"
-#: ../main.c:1622
+msgid "Vim: Error: Failure to start gvim from NetBeans\n"
+msgstr "Vim: ฅจฅ้กผ: NetBeansคซค้gvimค๒ฅนฅฟกผฅศควคญคคปค๓\n"
+
+msgid "Vim: Error: This version of Vim does not run in a Cygwin terminal\n"
+msgstr "Vim: ฅจฅ้กผ: คณคฮฅะกผฅธฅ็ฅ๓คฮVimคฯCygwinรผห๖ควคฯฦฐบ๎คทคคปค๓\n"
+
msgid "Vim: Warning: Output is not to a terminal\n"
msgstr "Vim: ทูน๐: รผห๖คุคฮฝะฮฯควคฯคขค๊คคปค๓\n"
-#: ../main.c:1624
msgid "Vim: Warning: Input is not from a terminal\n"
msgstr "Vim: ทูน๐: รผห๖คซค้คฮฦฮฯควคฯคขค๊คคปค๓\n"
-#. just in case..
-#: ../main.c:1891
msgid "pre-vimrc command line"
msgstr "vimrcมฐคฮฅณฅฅ๓ฅษฅ้ฅคฅ๓"
-#: ../main.c:1964
#, c-format
msgid "E282: Cannot read from \"%s\""
msgstr "E282: \"%s\"คซค้ฦษนคเคณคศคฌควคญคคปค๓"
-#: ../main.c:2149
msgid ""
"\n"
"More info with: \"vim -h\"\n"
@@ -3368,37 +2941,30 @@ msgstr ""
"\n"
"ค่ค๊พบูคสพ๐ส๓คฯ: \"vim -h\"\n"
-#: ../main.c:2178
msgid "[file ..] edit specified file(s)"
msgstr "[ฅีฅกฅคฅ๋..] คขค๋ฅีฅกฅคฅ๋ค๒สิฝธคนค๋"
-#: ../main.c:2179
msgid "- read text from stdin"
msgstr "- ษธฝเฦฮฯคซค้ฅฦฅญฅนฅศค๒ฦษนคเ"
-#: ../main.c:2180
msgid "-t tag edit file where tag is defined"
msgstr "-t ฅฟฅฐ ฅฟฅฐคฌฤ๊ตมคตค์คฟคศคณคํคซค้สิฝธคนค๋"
-#: ../main.c:2181
msgid "-q [errorfile] edit file with first error"
msgstr "-q [errorfile] บวฝ้คฮฅจฅ้กผควสิฝธคนค๋"
-#: ../main.c:2187
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
"ปศอัหก:"
-#: ../main.c:2189
msgid " vim [arguments] "
msgstr " vim [ฐ๚ฟ๔] "
-#: ../main.c:2193
msgid ""
"\n"
" or:"
@@ -3406,7 +2972,13 @@ msgstr ""
"\n"
" คโคทคฏคฯ:"
-#: ../main.c:2196
+msgid ""
+"\n"
+"Where case is ignored prepend / to make flag upper case"
+msgstr ""
+"\n"
+"ย็พฎสธป๚คฌฬตป๋คตค์ค๋พ์น็คฯย็สธป๚คหคนค๋คฟคแคห / ค๒มฐรึคทคฦคฏคภคตคค"
+
msgid ""
"\n"
"\n"
@@ -3416,189 +2988,322 @@ msgstr ""
"\n"
"ฐ๚ฟ๔:\n"
-#: ../main.c:2197
msgid "--\t\t\tOnly file names after this"
msgstr "--\t\t\tคณคฮคขคศคหคฯฅีฅกฅคฅ๋ฬพคภคฑ"
-#: ../main.c:2199
msgid "--literal\t\tDon't expand wildcards"
msgstr "--literal\t\tฅ๏ฅคฅ๋ฅษฅซกผฅษค๒ลธณซคทคสคค"
-#: ../main.c:2201
+msgid "-register\t\tRegister this gvim for OLE"
+msgstr "-register\t\tคณคฮgvimค๒OLEคศคทคฦละฯฟคนค๋"
+
+msgid "-unregister\t\tUnregister gvim for OLE"
+msgstr "-unregister\t\tgvimคฮOLEละฯฟค๒ฒ๒ฝคนค๋"
+
+msgid "-g\t\t\tRun using GUI (like \"gvim\")"
+msgstr "-g\t\t\tGUIควตฏฦฐคนค๋ (\"gvim\" คศฦฑคธ)"
+
+msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
+msgstr "-f or --nofork\tฅีฅฉฅขฅฐฅ้ฅฆฅ๓ฅษ: GUIค๒ปฯคแค๋คศคญคหforkคทคสคค"
+
msgid "-v\t\t\tVi mode (like \"vi\")"
msgstr "-v\t\t\tViฅโกผฅษ (\"vi\" คศฦฑคธ)"
-#: ../main.c:2202
msgid "-e\t\t\tEx mode (like \"ex\")"
msgstr "-e\t\t\tExฅโกผฅษ (\"ex\" คศฦฑคธ)"
-#: ../main.c:2203
msgid "-E\t\t\tImproved Ex mode"
msgstr "-E\t\t\tฒฮษExฅโกผฅษ"
-#: ../main.c:2204
msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")"
msgstr "-s\t\t\tฅตฅคฅ์ฅ๓ฅศ(ฅะฅรฅม)ฅโกผฅษ (\"ex\" ภ์อั)"
-#: ../main.c:2205
msgid "-d\t\t\tDiff mode (like \"vimdiff\")"
msgstr "-d\t\t\tบนสฌฅโกผฅษ (\"vidiff\" คศฦฑคธ)"
-#: ../main.c:2206
msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
-msgstr "-y\t\t\tฅคกผฅธกผฅโกผฅษ (\"evim\" คศฦฑคธ, ฅโกผฅษฬต)"
+msgstr "-y\t\t\tฅคกผฅธกผฅโกผฅษ (\"evim\" คศฦฑคธกขฅโกผฅษฬต)"
-#: ../main.c:2207
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tฦษนภ์อัฅโกผฅษ (\"view\" คศฦฑคธ)"
-#: ../main.c:2208
msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
msgstr "-Z\t\t\tภฉธยฅโกผฅษ (\"rvim\" คศฦฑคธ)"
-#: ../main.c:2209
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tสันน (ฅีฅกฅคฅ๋สยธป) ค๒ควคญคสคคค่คฆคหคนค๋"
-#: ../main.c:2210
msgid "-M\t\t\tModifications in text not allowed"
msgstr "-M\t\t\tฅฦฅญฅนฅศคฮสิฝธค๒นิคสคจคสคคค่คฆคหคนค๋"
-#: ../main.c:2211
msgid "-b\t\t\tBinary mode"
msgstr "-b\t\t\tฅะฅคฅสฅ๊ฅโกผฅษ"
-#: ../main.c:2212
msgid "-l\t\t\tLisp mode"
msgstr "-l\t\t\tLispฅโกผฅษ"
-#: ../main.c:2213
msgid "-C\t\t\tCompatible with Vi: 'compatible'"
msgstr "-C\t\t\tViธ฿ดนฅโกผฅษ: 'compatible'"
-#: ../main.c:2214
msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'"
msgstr "-N\t\t\tViศ๓ธ฿ดนฅโกผฅษ: 'nocompatible"
-#: ../main.c:2215
msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]"
msgstr "-V[N][fname]\t\tฅํฅฐฝะฮฯภ฿ฤ๊ [ฅ์ฅูฅ๋ N] [ฅํฅฐฅีฅกฅคฅ๋ฬพ fname]"
-#: ../main.c:2216
msgid "-D\t\t\tDebugging mode"
msgstr "-D\t\t\tฅวฅะฅรฅฐฅโกผฅษ"
-#: ../main.c:2217
msgid "-n\t\t\tNo swap file, use memory only"
msgstr "-n\t\t\tฅนฅ๏ฅรฅืฅีฅกฅคฅ๋ค๒ปศอัคปคบฅแฅโฅ๊คภคฑ"
-#: ../main.c:2218
msgid "-r\t\t\tList swap files and exit"
msgstr "-r\t\t\tฅนฅ๏ฅรฅืฅีฅกฅคฅ๋ค๒ฮ๓ต๓คทฝชฮป"
-#: ../main.c:2219
msgid "-r (with file name)\tRecover crashed session"
msgstr "-r (ฅีฅกฅคฅ๋ฬพ)\tฅฏฅ้ฅรฅทฅๅคทคฟฅปฅรฅทฅ็ฅ๓ค๒ษตข"
-#: ../main.c:2220
msgid "-L\t\t\tSame as -r"
msgstr "-L\t\t\t-rคศฦฑคธ"
-#: ../main.c:2221
-msgid "-A\t\t\tstart in Arabic mode"
+msgid "-f\t\t\tDon't use newcli to open window"
+msgstr "-f\t\t\tฅฆฅฃฅ๓ฅษฅฆค๒ณซคฏคฮคห newcli ค๒ปศอัคทคสคค"
+
+msgid "-dev <device>\t\tUse <device> for I/O"
+msgstr "-dev <device>\t\tI/Oคห <device> ค๒ปศอัคนค๋"
+
+msgid "-A\t\t\tStart in Arabic mode"
msgstr "-A\t\t\tฅขฅ้ฅำฅขธ์ฅโกผฅษควตฏฦฐคนค๋"
-#: ../main.c:2222
msgid "-H\t\t\tStart in Hebrew mode"
msgstr "-H\t\t\tฅุฅึฅ้ฅคธ์ฅโกผฅษควตฏฦฐคนค๋"
-#: ../main.c:2223
msgid "-F\t\t\tStart in Farsi mode"
msgstr "-F\t\t\tฅฺฅ๋ฅทฅขธ์ฅโกผฅษควตฏฦฐคนค๋"
-#: ../main.c:2224
msgid "-T <terminal>\tSet terminal type to <terminal>"
msgstr "-T <terminal>\tรผห๖ค๒ <terminal> คหภ฿ฤ๊คนค๋"
-#: ../main.c:2225
+msgid "--not-a-term\t\tSkip warning for input/output not being a terminal"
+msgstr "--not-a-term\t\tฦฝะฮฯคฌรผห๖ควคสคคคศคฮทูน๐ค๒ฅนฅญฅรฅืคนค๋"
+
+msgid "--ttyfail\t\tExit if input or output is not a terminal"
+msgstr "--ttyfail\t\tฦฝะฮฯคฌรผห๖ควคสคฑค์คะฝชฮปคนค๋"
+
msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc"
msgstr "-u <vimrc>\t\t.vimrcคฮยๅค๏ค๊คห <vimrc> ค๒ปศคฆ"
-#: ../main.c:2226
+msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
+msgstr "-U <gvimrc>\t\t.gvimrcคฮยๅค๏ค๊คห <gvimrc> ค๒ปศคฆ"
+
msgid "--noplugin\t\tDon't load plugin scripts"
msgstr "--noplugin\t\tฅืฅ้ฅฐฅคฅ๓ฅนฅฏฅ๊ฅืฅศค๒ฅํกผฅษคทคสคค"
-#: ../main.c:2227
msgid "-p[N]\t\tOpen N tab pages (default: one for each file)"
msgstr "-p[N]\t\tN ธฤฅฟฅึฅฺกผฅธค๒ณซคฏ(พสฮฌรอ: ฅีฅกฅคฅ๋คหคฤคญ1ธฤ)"
-#: ../main.c:2228
msgid "-o[N]\t\tOpen N windows (default: one for each file)"
msgstr "-o[N]\t\tN ธฤฅฆฅฃฅ๓ฅษฅฆค๒ณซคฏ(พสฮฌรอ: ฅีฅกฅคฅ๋คหคฤคญ1ธฤ)"
-#: ../main.c:2229
msgid "-O[N]\t\tLike -o but split vertically"
msgstr "-O[N]\t\t-oคศฦฑคธคภคฌฟโฤพสฌณไ"
-#: ../main.c:2230
msgid "+\t\t\tStart at end of file"
msgstr "+\t\t\tฅีฅกฅคฅ๋คฮบวธๅคซค้คฯคธคแค๋"
-#: ../main.c:2231
msgid "+<lnum>\t\tStart at line <lnum>"
msgstr "+<lnum>\t\t<lnum> นิคซค้คฯคธคแค๋"
-#: ../main.c:2232
msgid "--cmd <command>\tExecute <command> before loading any vimrc file"
msgstr "--cmd <command>\tvimrcค๒ฅํกผฅษคนค๋มฐคห <command> ค๒ผยนิคนค๋"
-#: ../main.c:2233
msgid "-c <command>\t\tExecute <command> after loading the first file"
msgstr "-c <command>\t\tบวฝ้คฮฅีฅกฅคฅ๋ค๒ฅํกผฅษธๅ <command> ค๒ผยนิคนค๋"
-#: ../main.c:2235
msgid "-S <session>\t\tSource file <session> after loading the first file"
msgstr "-S <session>\t\tบวฝ้คฮฅีฅกฅคฅ๋ค๒ฅํกผฅษธๅฅีฅกฅคฅ๋ <session> ค๒ผ่นคเ"
-#: ../main.c:2236
msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>"
msgstr "-s <scriptin>\tฅีฅกฅคฅ๋ <scriptin> คซค้ฅฮกผฅฅ๋ฅณฅฅ๓ฅษค๒ฦษนคเ"
-#: ../main.c:2237
msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>"
msgstr "-w <scriptout>\tฦฮฯคทคฟมดฅณฅฅ๓ฅษค๒ฅีฅกฅคฅ๋ <scriptout> คหฤษฒรคนค๋"
-#: ../main.c:2238
msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>"
msgstr "-W <scriptout>\tฦฮฯคทคฟมดฅณฅฅ๓ฅษค๒ฅีฅกฅคฅ๋ <scriptout> คหสยธคนค๋"
-#: ../main.c:2240
+msgid "-x\t\t\tEdit encrypted files"
+msgstr "-x\t\t\tฐลนๆฒฝคตค์คฟฅีฅกฅคฅ๋ค๒สิฝธคนค๋"
+
+msgid "-display <display>\tConnect vim to this particular X-server"
+msgstr "-display <display>\tvimค๒ปุฤ๊คทคฟ X ฅตกผฅะกผคหภยณคนค๋"
+
+msgid "-X\t\t\tDo not connect to X server"
+msgstr "-X\t\t\tXฅตกผฅะกผคหภยณคทคสคค"
+
+msgid "--remote <files>\tEdit <files> in a Vim server if possible"
+msgstr "--remote <files>\tฒฤวฝคสค้คะVimฅตกผฅะกผคว <files> ค๒สิฝธคนค๋"
+
+msgid "--remote-silent <files> Same, don't complain if there is no server"
+msgstr "--remote-silent <files> ฦฑพๅกขฅตกผฅะกผคฌฬตคฏคฦคโทูน๐สธค๒ฝะฮฯคทคสคค"
+
+msgid ""
+"--remote-wait <files> As --remote but wait for files to have been edited"
+msgstr "--remote-wait <files>\t--remoteธๅ ฅีฅกฅคฅ๋คฮสิฝธคฌฝชค๏ค๋คฮค๒ยิคฤ"
+
+msgid ""
+"--remote-wait-silent <files> Same, don't complain if there is no server"
+msgstr ""
+"--remote-wait-silent <files> ฦฑพๅกขฅตกผฅะกผคฌฬตคฏคฦคโทูน๐สธค๒ฝะฮฯคทคสคค"
+
+msgid ""
+"--remote-tab[-wait][-silent] <files> As --remote but use tab page per file"
+msgstr ""
+"--remote-tab[-wait][-silent] <files> --remoteควฅีฅกฅคฅ๋1คฤคหคฤคญ1คฤคฮฅฟฅึ"
+"ฅฺกผฅธค๒ณซคฏ"
+
+msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
+msgstr "--remote-send <keys>\tVimฅตกผฅะกผคห <keys> ค๒ม๗ฟฎคทคฦฝชฮปคนค๋"
+
+msgid "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
+msgstr "--remote-expr <expr>\tฅตกผฅะกผคว <expr> ค๒ผยนิคทคฦท๋ฒฬค๒ษฝผจคนค๋"
+
+msgid "--serverlist\t\tList available Vim server names and exit"
+msgstr "--serverlist\t\tVimฅตกผฅะกผฬพคฮฐ์อ๗ค๒ษฝผจคทคฦฝชฮปคนค๋"
+
+msgid "--servername <name>\tSend to/become the Vim server <name>"
+msgstr "--servername <name>\tVimฅตกผฅะกผ <name> คหม๗ฟฎ/ฬพมฐภ฿ฤ๊คนค๋"
+
msgid "--startuptime <file>\tWrite startup timing messages to <file>"
msgstr "--startuptime <file>\tตฏฦฐคหคซคซครคฟปดึคฮพบูค๒ <file> คุฝะฮฯคนค๋"
-#: ../main.c:2242
msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
msgstr "-i <viminfo>\t\t.viminfoคฮยๅค๏ค๊คห <viminfo> ค๒ปศคฆ"
-#: ../main.c:2243
+msgid "--clean\t\t'nocompatible', Vim defaults, no plugins, no viminfo"
+msgstr "--clean\t\t'nocompatible'กขVimคฮด๛ฤ๊กขฅืฅ้ฅฐฅคฅ๓คสคทกขviminfoคสคท"
+
msgid "-h or --help\tPrint Help (this message) and exit"
-msgstr "-h or --help\tฅุฅ๋ฅื(คณคฮฅแฅรฅปกผฅธ)ค๒ษฝผจคทฝชฮปคนค๋"
+msgstr "-h or --help\tฅุฅ๋ฅื(คณคฮฅแฅรฅปกผฅธ)ค๒ษฝผจคทฝชฮปคนค๋"
-#: ../main.c:2244
msgid "--version\t\tPrint version information and exit"
msgstr "--version\t\tฅะกผฅธฅ็ฅ๓พ๐ส๓ค๒ษฝผจคทฝชฮปคนค๋"
-#: ../mark.c:676
+msgid ""
+"\n"
+"Arguments recognised by gvim (Motif version):\n"
+msgstr ""
+"\n"
+"gvimคหค่ครคฦฒ๒ผแคตค์ค๋ฐ๚ฟ๔(Motifฅะกผฅธฅ็ฅ๓):\n"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (neXtaw version):\n"
+msgstr ""
+"\n"
+"gvimคหค่ครคฦฒ๒ผแคตค์ค๋ฐ๚ฟ๔(neXtawฅะกผฅธฅ็ฅ๓):\n"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (Athena version):\n"
+msgstr ""
+"\n"
+"gvimคหค่ครคฦฒ๒ผแคตค์ค๋ฐ๚ฟ๔(Athenaฅะกผฅธฅ็ฅ๓):\n"
+
+msgid "-display <display>\tRun vim on <display>"
+msgstr "-display <display>\t<display> ควvimค๒ผยนิคนค๋"
+
+msgid "-iconic\t\tStart vim iconified"
+msgstr "-iconic\t\tบวพฎฒฝคทคฟพ๕ยึควvimค๒ตฏฦฐคนค๋"
+
+msgid "-background <color>\tUse <color> for the background (also: -bg)"
+msgstr "-background <color>\tวุทสฟงคห <color> ค๒ปศคฆ(ฦฑตม: -bg)"
+
+msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
+msgstr "-foreground <color>\tมฐทสฟงคห <color> ค๒ปศคฆ(ฦฑตม: -fg)"
+
+msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
+msgstr "-font <font>\t\tฅฦฅญฅนฅศษฝผจคห <font> ค๒ปศคฆ(ฦฑตม: -fn)"
+
+msgid "-boldfont <font>\tUse <font> for bold text"
+msgstr "-boldfont <font>\tยภป๚คห <font> ค๒ปศคฆ"
+
+msgid "-italicfont <font>\tUse <font> for italic text"
+msgstr "-italicfont <for>\tผะยฮป๚คห <font> ค๒ปศคฆ"
+
+msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
+msgstr "-geometry <geom>\tฝ้ดวรึคห <geom> ค๒ปศคฆ(ฦฑตม: -geom)"
+
+msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
+msgstr "-borderwidth <width>\tถญณฆคฮษค๒ <width> คหคนค๋(ฦฑตม: -bw)"
+
+msgid "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
+msgstr ""
+"-scrollbarwidth <width> ฅนฅฏฅํกผฅ๋ฅะกผคฮษค๒ <width> คหคนค๋(ฦฑตม: -sw)"
+
+msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
+msgstr "-menuheight <height>\tฅแฅหฅๅกผฅะกผคฮนโคตค๒ <height> คหคนค๋(ฦฑตม: -mh)"
+
+msgid "-reverse\t\tUse reverse video (also: -rv)"
+msgstr "-reverse\t\tศฟลพฑวมค๒ปศอัคนค๋(ฦฑตม: -rv)"
+
+msgid "+reverse\t\tDon't use reverse video (also: +rv)"
+msgstr "+reverse\t\tศฟลพฑวมค๒ปศอัคทคสคค(ฦฑตม: +rv)"
+
+msgid "-xrm <resource>\tSet the specified resource"
+msgstr "-xrm <resource>\tฦรฤ๊คฮฅ๊ฅฝกผฅนค๒ปศอัคนค๋"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (GTK+ version):\n"
+msgstr ""
+"\n"
+"gvimคหค่ครคฦฒ๒ผแคตค์ค๋ฐ๚ฟ๔(GTK+ฅะกผฅธฅ็ฅ๓):\n"
+
+msgid "-display <display>\tRun vim on <display> (also: --display)"
+msgstr "-display <display>\t<display> ควvimค๒ผยนิคนค๋(ฦฑตม: --display)"
+
+msgid "--role <role>\tSet a unique role to identify the main window"
+msgstr "--role <role>\tฅแฅคฅ๓ฅฆฅฃฅ๓ฅษฅฆค๒ผฑสฬคนค๋ฐ์ฐีคสฬ๒ณไ(role)ค๒ภ฿ฤ๊คนค๋"
+
+msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
+msgstr "--socketid <xid>\tฐคสค๋GTK widgetควVimค๒ณซคฏ"
+
+msgid "--echo-wid\t\tMake gvim echo the Window ID on stdout"
+msgstr "--echo-wid\t\tฅฆฅฃฅ๓ฅษฅฆIDค๒ษธฝเฝะฮฯคหฝะฮฯคนค๋"
+
+msgid "-P <parent title>\tOpen Vim inside parent application"
+msgstr "-P <ฟฦคฮฅฟฅคฅศฅ๋>\tVimค๒ฟฦฅขฅืฅ๊ฅฑกผฅทฅ็ฅ๓คฮรๆควตฏฦฐคนค๋"
+
+msgid "--windowid <HWND>\tOpen Vim inside another win32 widget"
+msgstr "--windowid <HWND>\tฐคสค๋Win32 widgetคฮฦโษ๔คหVimค๒ณซคฏ"
+
+msgid "No display"
+msgstr "ฅวฅฃฅนฅืฅ์ฅคคฌธซคฤคซค๊คคปค๓"
+
+msgid ": Send failed.\n"
+msgstr ": ม๗ฟฎคหผบวิคทคคทคฟ.\n"
+
+msgid ": Send failed. Trying to execute locally\n"
+msgstr ": ม๗ฟฎคหผบวิคทคคทคฟ. ฅํกผฅซฅ๋ควคฮผยนิค๒ป๎ค฿คฦคคคคน\n"
+
+#, c-format
+msgid "%d of %d edited"
+msgstr "%d ธฤ (%d ธฤรๆ) คฮฅีฅกฅคฅ๋ค๒สิฝธคทคคทคฟ"
+
+msgid "No display: Send expression failed.\n"
+msgstr "ฅวฅฃฅนฅืฅ์ฅคคฌคขค๊คคปค๓: ผฐคฮม๗ฟฎคหผบวิคทคคทคฟ.\n"
+
+msgid ": Send expression failed.\n"
+msgstr ": ผฐคฮม๗ฟฎคหผบวิคทคคทคฟ.\n"
+
msgid "No marks set"
msgstr "ฅกผฅฏคฌภ฿ฤ๊คตค์คฦคคคคปค๓"
-#: ../mark.c:678
#, c-format
msgid "E283: No marks matching \"%s\""
msgstr "E283: \"%s\" คหณบล๖คนค๋ฅกผฅฏคฌคขค๊คคปค๓"
-#. Highlight title
-#: ../mark.c:687
msgid ""
"\n"
"mark line col file/text"
@@ -3606,8 +3311,6 @@ msgstr ""
"\n"
"mark นิ ฮ๓ ฅีฅกฅคฅ๋/ฅฦฅญฅนฅศ"
-#. Highlight title
-#: ../mark.c:789
msgid ""
"\n"
" jump line col file/text"
@@ -3615,8 +3318,6 @@ msgstr ""
"\n"
" jump นิ ฮ๓ ฅีฅกฅคฅ๋/ฅฦฅญฅนฅศ"
-#. Highlight title
-#: ../mark.c:831
msgid ""
"\n"
"change line col text"
@@ -3624,7 +3325,6 @@ msgstr ""
"\n"
"สันน นิ ฮ๓ ฅฦฅญฅนฅศ"
-#: ../mark.c:1238
msgid ""
"\n"
"# File marks:\n"
@@ -3632,8 +3332,6 @@ msgstr ""
"\n"
"# ฅีฅกฅคฅ๋ฅกผฅฏ:\n"
-#. Write the jumplist with -'
-#: ../mark.c:1271
msgid ""
"\n"
"# Jumplist (newest first):\n"
@@ -3641,7 +3339,6 @@ msgstr ""
"\n"
"# ฅธฅใฅ๓ฅืฅ๊ฅนฅศ (ฟทคทคคคโคฮคฌภ่):\n"
-#: ../mark.c:1352
msgid ""
"\n"
"# History of marks within files (newest to oldest):\n"
@@ -3649,84 +3346,87 @@ msgstr ""
"\n"
"# ฅีฅกฅคฅ๋ฦโฅกผฅฏคฮอ๚ฮ๒ (ฟทคทคคคโคฮคซค้ธลคคคโคฮ):\n"
-#: ../mark.c:1431
msgid "Missing '>'"
msgstr "'>' คฌธซคฤคซค๊คคปค๓"
-#: ../memfile.c:426
+msgid "E543: Not a valid codepage"
+msgstr "E543: ฬตธ๚คสฅณกผฅษฅฺกผฅธควคน"
+
+msgid "E284: Cannot set IC values"
+msgstr "E284: ICคฮรอค๒ภ฿ฤ๊ควคญคคปค๓"
+
+msgid "E285: Failed to create input context"
+msgstr "E285: ฅคฅ๓ฅืฅรฅศฅณฅ๓ฅฦฅญฅนฅศคฮบ๎ภฎคหผบวิคทคคทคฟ"
+
+msgid "E286: Failed to open input method"
+msgstr "E286: ฅคฅ๓ฅืฅรฅศฅแฅฝฅรฅษคฮฅชกผฅืฅ๓คหผบวิคทคคทคฟ"
+
+msgid "E287: Warning: Could not set destroy callback to IM"
+msgstr "E287: ทูน๐: IMคฮวหฒ๕ฅณกผฅ๋ฅะฅรฅฏค๒ภ฿ฤ๊ควคญคคปค๓ควคทคฟ"
+
+msgid "E288: input method doesn't support any style"
+msgstr "E288: ฅคฅ๓ฅืฅรฅศฅแฅฝฅรฅษคฯคษค๓คสฅนฅฟฅคฅ๋คโฅตฅกผฅศคทคคปค๓"
+
+msgid "E289: input method doesn't support my preedit type"
+msgstr "E289: ฅคฅ๓ฅืฅรฅศฅแฅฝฅรฅษคฯ my preedit type ค๒ฅตฅกผฅศคทคคปค๓"
+
msgid "E293: block was not locked"
msgstr "E293: ฅึฅํฅรฅฏคฌฅํฅรฅฏคตค์คฦคคคคปค๓"
-#: ../memfile.c:799
msgid "E294: Seek error in swap file read"
msgstr "E294: ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋ฦษนปคหฅทกผฅฏฅจฅ้กผควคน"
-#: ../memfile.c:803
msgid "E295: Read error in swap file"
msgstr "E295: ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คฮฦษนค฿ฅจฅ้กผควคน"
-#: ../memfile.c:849
msgid "E296: Seek error in swap file write"
msgstr "E296: ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋ฝ๑นค฿ปคหฅทกผฅฏฅจฅ้กผควคน"
-#: ../memfile.c:865
msgid "E297: Write error in swap file"
msgstr "E297: ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คฮฝ๑นค฿ฅจฅ้กผควคน"
-#: ../memfile.c:1036
msgid "E300: Swap file already exists (symlink attack?)"
msgstr "E300: ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คฌด๛คหยธบ฿คทคคน (symlinkคหค่ค๋นถทโ?)"
-#: ../memline.c:318
msgid "E298: Didn't get block nr 0?"
msgstr "E298: ฅึฅํฅรฅฏ 0 ค๒ผ่ฦภควคญคคปค๓?"
-#: ../memline.c:361
msgid "E298: Didn't get block nr 1?"
msgstr "E298: ฅึฅํฅรฅฏ 1 ค๒ผ่ฦภควคญคคปค๓?"
-#: ../memline.c:377
msgid "E298: Didn't get block nr 2?"
msgstr "E298: ฅึฅํฅรฅฏ 2 ค๒ผ่ฦภควคญคคปค๓?"
-#. could not (re)open the swap file, what can we do????
-#: ../memline.c:465
+msgid "E843: Error while updating swap file crypt"
+msgstr "E843: ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คฮฐลนๆค๒นนฟทรๆคหฅจฅ้กผคฌศฏภธคทคคทคฟ"
+
msgid "E301: Oops, lost the swap file!!!"
-msgstr "E301: คชครคศ, ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คฌผบค๏ค์คคทคฟ!!!"
+msgstr "E301: คชครคศกขฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คฌผบค๏ค์คคทคฟ!!!"
-#: ../memline.c:477
msgid "E302: Could not rename swap file"
msgstr "E302: ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คฮฬพมฐค๒สัคจค้ค์คคปค๓"
-#: ../memline.c:554
#, c-format
msgid "E303: Unable to open swap file for \"%s\", recovery impossible"
msgstr "E303: \"%s\" คฮฅนฅ๏ฅรฅืฅีฅกฅคฅ๋ค๒ณซคฑคสคคคฮควฅ๊ฅซฅะฅ๊คฯษิฒฤวฝควคน"
-#: ../memline.c:666
msgid "E304: ml_upd_block0(): Didn't get block 0??"
msgstr "E304: ml_upd_block0(): ฅึฅํฅรฅฏ 0 ค๒ผ่ฦภควคญคคปค๓ควคทคฟ??"
-#. no swap files found
-#: ../memline.c:830
#, c-format
msgid "E305: No swap file found for %s"
msgstr "E305: %s คหคฯฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คฌธซคฤคซค๊คคปค๓"
-#: ../memline.c:839
msgid "Enter number of swap file to use (0 to quit): "
msgstr "ปศอัคนค๋ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คฮศึนๆค๒ฦฮฯคทคฦคฏคภคตคค(0 ควฝชฮป): "
-#: ../memline.c:879
#, c-format
msgid "E306: Cannot open %s"
msgstr "E306: %s ค๒ณซคฑคคปค๓"
-#: ../memline.c:897
msgid "Unable to read block 0 from "
msgstr "ฅึฅํฅรฅฏ 0 ค๒ฦษนคแคคปค๓ "
-#: ../memline.c:900
msgid ""
"\n"
"Maybe no changes were made or Vim did not update the swap file."
@@ -3734,28 +3434,22 @@ msgstr ""
"\n"
"ถฒค้คฏสันนคฌคตค์คฦคคคสคคคซVimคฌฅนฅ๏ฅรฅืฅีฅกฅคฅ๋ค๒นนฟทคทคฦคคคคปค๓."
-#: ../memline.c:909
msgid " cannot be used with this version of Vim.\n"
msgstr " Vimคฮคณคฮฅะกผฅธฅ็ฅ๓ควคฯปศอัควคญคคปค๓.\n"
-#: ../memline.c:911
msgid "Use Vim version 3.0.\n"
msgstr "Vimคฮฅะกผฅธฅ็ฅ๓3.0ค๒ปศอัคทคฦคฏคภคตคค.\n"
-#: ../memline.c:916
#, c-format
msgid "E307: %s does not look like a Vim swap file"
msgstr "E307: %s คฯVimคฮฅนฅ๏ฅรฅืฅีฅกฅคฅ๋ควคฯคสคคค่คฆควคน"
-#: ../memline.c:922
msgid " cannot be used on this computer.\n"
msgstr " คณคฮฅณฅ๓ฅิฅๅกผฅฟควคฯปศอัควคญคคปค๓.\n"
-#: ../memline.c:924
msgid "The file was created on "
msgstr "คณคฮฅีฅกฅคฅ๋คฯผกคฮพ์ฝ๊ควบ๎ค้ค์คคทคฟ "
-#: ../memline.c:928
msgid ""
",\n"
"or the file has been damaged."
@@ -3763,101 +3457,117 @@ msgstr ""
",\n"
"คโคทคฏคฯฅีฅกฅคฅ๋คฌยปฝคทคฦคคคคน."
-#: ../memline.c:945
+#, c-format
+msgid ""
+"E833: %s is encrypted and this version of Vim does not support encryption"
+msgstr ""
+"E833: %s คฯคณคฮฅะกผฅธฅ็ฅ๓คฮVimควฅตฅกผฅศคทคฦคคคสคคทมผฐควฐลนๆฒฝคตค์คฦคคคคน"
+
msgid " has been damaged (page size is smaller than minimum value).\n"
msgstr " คฯยปฝคทคฦคคคคน (ฅฺกผฅธฅตฅคฅบคฌบวพฎรอค๒ฒผฒ๓ครคฦคคคคน).\n"
-#: ../memline.c:974
#, c-format
msgid "Using swap file \"%s\""
msgstr "ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋ \"%s\" ค๒ปศอัรๆ"
-#: ../memline.c:980
#, c-format
msgid "Original file \"%s\""
msgstr "ธถหฅีฅกฅคฅ๋ \"%s\""
-#: ../memline.c:995
msgid "E308: Warning: Original file may have been changed"
msgstr "E308: ทูน๐: ธถหฅีฅกฅคฅ๋คฌสันนคตค์คฦคคคคน"
-#: ../memline.c:1061
+#, c-format
+msgid "Swap file is encrypted: \"%s\""
+msgstr "ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คฯฐลนๆฒฝคตค์คฦคคคคน: \"%s\""
+
+msgid ""
+"\n"
+"If you entered a new crypt key but did not write the text file,"
+msgstr ""
+"\n"
+"ฟทคทคคฐลนๆฅญกผค๒ฦฮฯคทคฟคขคศคหฅฦฅญฅนฅศฅีฅกฅคฅ๋ค๒สยธคทคฦคคคสคคพ์น็คฯกข"
+
+msgid ""
+"\n"
+"enter the new crypt key."
+msgstr ""
+"\n"
+"ฟทคทคคฐลนๆฅญกผค๒ฦฮฯคทคฦคฏคภคตคค."
+
+msgid ""
+"\n"
+"If you wrote the text file after changing the crypt key press enter"
+msgstr ""
+"\n"
+"ฐลนๆฅญกผค๒สัคจคฟคขคศคหฅฦฅญฅนฅศฅีฅกฅคฅ๋ค๒สยธคทคฟพ์น็คฯกขฅฦฅญฅนฅศฅีฅกฅคฅ๋คศ"
+
+msgid ""
+"\n"
+"to use the same key for text file and swap file"
+msgstr ""
+"\n"
+"ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คหฦฑคธฐลนๆฅญกผค๒ปศคฆคฟคแคหenterคภคฑค๒ฒกคทคฦคฏคภคตคค."
+
#, c-format
msgid "E309: Unable to read block 1 from %s"
msgstr "E309: %s คซค้ฅึฅํฅรฅฏ 1 ค๒ฦษนคแคคปค๓"
-#: ../memline.c:1065
msgid "???MANY LINES MISSING"
msgstr "???ยฟคฏคฮนิคฌผบค๏ค์คฦคคคคน"
-#: ../memline.c:1076
msgid "???LINE COUNT WRONG"
msgstr "???นิฟ๔คฌดึฐใครคฦคคคคน"
-#: ../memline.c:1082
msgid "???EMPTY BLOCK"
msgstr "???ฅึฅํฅรฅฏคฌถ๕ควคน"
-#: ../memline.c:1103
msgid "???LINES MISSING"
msgstr "???นิคฌผบค๏ค์คฦคคคคน"
-#: ../memline.c:1128
#, c-format
msgid "E310: Block 1 ID wrong (%s not a .swp file?)"
msgstr "E310: ฅึฅํฅรฅฏ 1 คฮIDคฌดึฐใครคฦคคคคน(%s คฌ.swpฅีฅกฅคฅ๋ควคสคค?)"
-#: ../memline.c:1133
msgid "???BLOCK MISSING"
msgstr "???ฅึฅํฅรฅฏคฌคขค๊คคปค๓"
-#: ../memline.c:1147
msgid "??? from here until ???END lines may be messed up"
msgstr "??? คณคณคซค้ ???END คควคฮนิคฌวหฒ๕คตค์คฦคคค๋ค่คฆควคน"
-#: ../memline.c:1164
msgid "??? from here until ???END lines may have been inserted/deleted"
msgstr "??? คณคณคซค้ ???END คควคฮนิคฌมฦคซบ๏ฝคตค์คฟค่คฆควคน"
-#: ../memline.c:1181
msgid "???END"
msgstr "???END"
-#: ../memline.c:1238
msgid "E311: Recovery Interrupted"
msgstr "E311: ฅ๊ฅซฅะฅ๊คฌณไนคค์คคทคฟ"
-#: ../memline.c:1243
msgid ""
"E312: Errors detected while recovering; look for lines starting with ???"
msgstr ""
"E312: ฅ๊ฅซฅะฅ๊คฮบวรๆคหฅจฅ้กผคฌธกฝะคตค์คคทคฟ; ???ควปฯคค๋นิค๒ปฒพศคทคฦคฏคภคตคค"
-#: ../memline.c:1245
msgid "See \":help E312\" for more information."
msgstr "พบูคฯ \":help E312\" ค๒ปฒพศคทคฦคฏคภคตคค"
-#: ../memline.c:1249
msgid "Recovery completed. You should check if everything is OK."
msgstr "ฅ๊ฅซฅะฅ๊คฌฝชฮปคทคคทคฟ. มดคฦคฌภตคทคคคซฅมฅงฅรฅฏคทคฦคฏคภคตคค."
-#: ../memline.c:1251
msgid ""
"\n"
"(You might want to write out this file under another name\n"
msgstr ""
"\n"
-"(สันนค๒ฅมฅงฅรฅฏคนค๋คฟคแคห, คณคฮฅีฅกฅคฅ๋ค๒สฬคฮฬพมฐควสยธคทคฟพๅคว\n"
+"(สันนค๒ฅมฅงฅรฅฏคนค๋คฟคแคหกขคณคฮฅีฅกฅคฅ๋ค๒สฬคฮฬพมฐควสยธคทคฟพๅคว\n"
-#: ../memline.c:1252
msgid "and run diff with the original file to check for changes)"
msgstr "ธถหฅีฅกฅคฅ๋คศคฮ diff ค๒ผยนิคนค๋คศฮษคคควคทค็คฆ)"
-#: ../memline.c:1254
msgid "Recovery completed. Buffer contents equals file contents."
msgstr "ษธตดฐฮป. ฅะฅรฅีฅกคฮฦโอฦคฯฅีฅกฅคฅ๋คศฦฑคธคหคสค๊คคทคฟ."
-#: ../memline.c:1255
msgid ""
"\n"
"You may want to delete the .swp file now.\n"
@@ -3867,52 +3577,42 @@ msgstr ""
"ธตคฮ.swpฅีฅกฅคฅ๋คฯบ๏ฝคทคฦคโนฝคคคคปค๓\n"
"\n"
-#. use msg() to start the scrolling properly
-#: ../memline.c:1327
+msgid "Using crypt key from swap file for the text file.\n"
+msgstr "ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คซค้ผ่ฦภคทคฟฐลนๆฅญกผค๒ฅฦฅญฅนฅศฅีฅกฅคฅ๋คหปศคคคคน.\n"
+
msgid "Swap files found:"
msgstr "ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คฌสฃฟ๔ธซคฤคซค๊คคทคฟ:"
-#: ../memline.c:1446
msgid " In current directory:\n"
msgstr " ธฝบ฿คฮฅวฅฃฅ์ฅฏฅศฅ๊:\n"
-#: ../memline.c:1448
msgid " Using specified name:\n"
msgstr " ฐสฒผคฮฬพมฐค๒ปศอัรๆ:\n"
-#: ../memline.c:1450
msgid " In directory "
msgstr " ฅวฅฃฅ์ฅฏฅศฅ๊ "
-#: ../memline.c:1465
msgid " -- none --\n"
msgstr " -- คสคท --\n"
-#: ../memline.c:1527
msgid " owned by: "
msgstr " ฝ๊อญผิ: "
-#: ../memline.c:1529
msgid " dated: "
msgstr " ฦษี: "
-#: ../memline.c:1532 ../memline.c:3231
msgid " dated: "
msgstr " ฦษี: "
-#: ../memline.c:1548
msgid " [from Vim version 3.0]"
msgstr " [from Vim version 3.0]"
-#: ../memline.c:1550
msgid " [does not look like a Vim swap file]"
msgstr " [Vimคฮฅนฅ๏ฅรฅืฅีฅกฅคฅ๋ควคฯคสคคค่คฆควคน]"
-#: ../memline.c:1552
msgid " file name: "
msgstr " ฅีฅกฅคฅ๋ฬพ: "
-#: ../memline.c:1558
msgid ""
"\n"
" modified: "
@@ -3920,15 +3620,12 @@ msgstr ""
"\n"
" สันนพ๕ยึ: "
-#: ../memline.c:1559
msgid "YES"
msgstr "คขค๊"
-#: ../memline.c:1559
msgid "no"
msgstr "คสคท"
-#: ../memline.c:1562
msgid ""
"\n"
" user name: "
@@ -3936,11 +3633,9 @@ msgstr ""
"\n"
" ฅๆกผฅถกผฬพ: "
-#: ../memline.c:1568
msgid " host name: "
msgstr " ฅฅนฅศฬพ: "
-#: ../memline.c:1570
msgid ""
"\n"
" host name: "
@@ -3948,7 +3643,6 @@ msgstr ""
"\n"
" ฅฅนฅศฬพ: "
-#: ../memline.c:1575
msgid ""
"\n"
" process ID: "
@@ -3956,11 +3650,16 @@ msgstr ""
"\n"
" ฅืฅํฅปฅนID: "
-#: ../memline.c:1579
msgid " (still running)"
msgstr " (คคภผยนิรๆ)"
-#: ../memline.c:1586
+msgid ""
+"\n"
+" [not usable with this version of Vim]"
+msgstr ""
+"\n"
+" [คณคฮVimฅะกผฅธฅ็ฅ๓ควคฯปศอัควคญคคปค๓]"
+
msgid ""
"\n"
" [not usable on this computer]"
@@ -3968,97 +3667,75 @@ msgstr ""
"\n"
" [คณคฮฅณฅ๓ฅิฅๅกผฅฟควคฯปศอัควคญคคปค๓]"
-#: ../memline.c:1590
msgid " [cannot be read]"
msgstr " [ฦษนคแคคปค๓]"
-#: ../memline.c:1593
msgid " [cannot be opened]"
msgstr " [ณซคฑคคปค๓]"
-#: ../memline.c:1698
msgid "E313: Cannot preserve, there is no swap file"
msgstr "E313: ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คฌฬตคคคฮควฐปควคญคคปค๓"
-#: ../memline.c:1747
msgid "File preserved"
msgstr "ฅีฅกฅคฅ๋คฌฐปคตค์คคน"
-#: ../memline.c:1749
msgid "E314: Preserve failed"
msgstr "E314: ฐปคหผบวิคทคคทคฟ"
-#: ../memline.c:1819
#, c-format
-msgid "E315: ml_get: invalid lnum: %<PRId64>"
-msgstr "E315: ml_get: ฬตธ๚คสlnumควคน: %<PRId64>"
+msgid "E315: ml_get: invalid lnum: %ld"
+msgstr "E315: ml_get: ฬตธ๚คสlnumควคน: %ld"
-#: ../memline.c:1851
#, c-format
-msgid "E316: ml_get: cannot find line %<PRId64>"
-msgstr "E316: ml_get: นิ %<PRId64> ค๒ธซคฤคฑค้ค์คคปค๓"
+msgid "E316: ml_get: cannot find line %ld"
+msgstr "E316: ml_get: นิ %ld ค๒ธซคฤคฑค้ค์คคปค๓"
-#: ../memline.c:2236
msgid "E317: pointer block id wrong 3"
msgstr "E317: ฅฅคฅ๓ฅฟฅึฅํฅรฅฏคฮIDคฌดึฐใครคฦคคคคน 3"
-#: ../memline.c:2311
msgid "stack_idx should be 0"
msgstr "stack_idx คฯ 0 ควคขค๋คูคญควคน"
-#: ../memline.c:2369
msgid "E318: Updated too many blocks?"
msgstr "E318: นนฟทคตค์คฟฅึฅํฅรฅฏคฌยฟฒแคฎค๋คซคโ?"
-#: ../memline.c:2511
msgid "E317: pointer block id wrong 4"
msgstr "E317: ฅฅคฅ๓ฅฟฅึฅํฅรฅฏคฮIDคฌดึฐใครคฦคคคคน 4"
-#: ../memline.c:2536
msgid "deleted block 1?"
msgstr "ฅึฅํฅรฅฏ 1 คฯพรคตค์คฟ?"
-#: ../memline.c:2707
#, c-format
-msgid "E320: Cannot find line %<PRId64>"
-msgstr "E320: นิ %<PRId64> คฌธซคฤคซค๊คคปค๓"
+msgid "E320: Cannot find line %ld"
+msgstr "E320: นิ %ld คฌธซคฤคซค๊คคปค๓"
-#: ../memline.c:2916
msgid "E317: pointer block id wrong"
msgstr "E317: ฅฅคฅ๓ฅฟฅึฅํฅรฅฏคฮIDคฌดึฐใครคฦคคคคน"
-#: ../memline.c:2930
msgid "pe_line_count is zero"
msgstr "pe_line_count คฌฅผฅํควคน"
-#: ../memline.c:2955
#, c-format
-msgid "E322: line number out of range: %<PRId64> past the end"
-msgstr "E322: นิศึนๆคฌศฯฐฯณฐควคน: %<PRId64> ฤถคจคฦคคคคน"
+msgid "E322: line number out of range: %ld past the end"
+msgstr "E322: นิศึนๆคฌศฯฐฯณฐควคน: %ld ฤถคจคฦคคคคน"
-#: ../memline.c:2959
#, c-format
-msgid "E323: line count wrong in block %<PRId64>"
-msgstr "E323: ฅึฅํฅรฅฏ %<PRId64> คฮนิฅซฅฆฅ๓ฅศคฌดึฐใครคฦคคคคน"
+msgid "E323: line count wrong in block %ld"
+msgstr "E323: ฅึฅํฅรฅฏ %ld คฮนิฅซฅฆฅ๓ฅศคฌดึฐใครคฦคคคคน"
-#: ../memline.c:2999
msgid "Stack size increases"
msgstr "ฅนฅฟฅรฅฏฅตฅคฅบคฌมคจคคน"
-#: ../memline.c:3038
msgid "E317: pointer block id wrong 2"
msgstr "E317: ฅฅคฅ๓ฅฟฅึฅํฅรฅฏคฮIDคฌดึฐใครคฦคคคคน 2"
-#: ../memline.c:3070
#, c-format
msgid "E773: Symlink loop for \"%s\""
msgstr "E773: \"%s\" คฮฅทฅ๓ฅฅ๊ฅรฅฏฅ๊ฅ๓ฅฏคฌฅ๋กผฅืคหคสครคฦคคคคน"
-#: ../memline.c:3221
msgid "E325: ATTENTION"
msgstr "E325: รํฐี"
-#: ../memline.c:3222
msgid ""
"\n"
"Found a swap file by the name \""
@@ -4066,39 +3743,30 @@ msgstr ""
"\n"
"ผกคฮฬพมฐควฅนฅ๏ฅรฅืฅีฅกฅคฅ๋ค๒ธซคฤคฑคคทคฟ \""
-#: ../memline.c:3226
msgid "While opening file \""
msgstr "ผกคฮฅีฅกฅคฅ๋ค๒ณซคคคฦคคค๋บวรๆ \""
-#: ../memline.c:3239
msgid " NEWER than swap file!\n"
msgstr " ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋ค่ค๊คโฟทคทคคควคน!\n"
-#: ../memline.c:3244
msgid ""
"\n"
"(1) Another program may be editing the same file. If this is the case,\n"
" be careful not to end up with two different instances of the same\n"
-" file when making changes."
+" file when making changes. Quit, or continue with caution.\n"
msgstr ""
"\n"
"(1) สฬคฮฅืฅํฅฐฅ้ฅเคฌฦฑคธฅีฅกฅคฅ๋ค๒สิฝธคทคฦคคค๋คซคโคทค์คคปค๓.\n"
-" คณคฮพ์น็คหคฯ, สันนค๒คทคฦคทคคฆคศ1คฤคฮฅีฅกฅคฅ๋คหยะคทคฦฐคสค๋2คฤคฮ\n"
-" ฅคฅ๓ฅนฅฟฅ๓ฅนคฌควคญคฦคทคคฆคฮคว, คฝคฆคทคสคคค่คฆคหตคค๒คฤคฑคฦคฏคภคตคค."
+" คณคฮพ์น็คหคฯกขสันนค๒คทคฦคทคคฆคศ1คฤคฮฅีฅกฅคฅ๋คหยะคทคฦฐคสค๋2คฤคฮ\n"
+" ฅคฅ๓ฅนฅฟฅ๓ฅนคฌควคญคฦคทคคฆคฮควกขคฝคฆคทคสคคค่คฆคหตคค๒คฤคฑคฦคฏคภคตคค.\n"
+" ฝชฮปคนค๋คซกขรํฐีคทคสคฌค้ยณคฑคฦคฏคภคตคค.\n"
-#: ../memline.c:3245
-msgid " Quit, or continue with caution.\n"
-msgstr " ฝชฮปคนค๋คซ, รํฐีคทคสคฌค้ยณคฑคฦคฏคภคตคค.\n"
-
-#: ../memline.c:3246
msgid "(2) An edit session for this file crashed.\n"
msgstr "(2) คณคฮฅีฅกฅคฅ๋คฮสิฝธฅปฅรฅทฅ็ฅ๓คฌฅฏฅ้ฅรฅทฅๅคทคฟ.\n"
-#: ../memline.c:3247
msgid " If this is the case, use \":recover\" or \"vim -r "
msgstr " คณคฮพ์น็คหคฯ \":recover\" คซ \"vim -r "
-#: ../memline.c:3249
msgid ""
"\"\n"
" to recover the changes (see \":help recovery\").\n"
@@ -4106,11 +3774,9 @@ msgstr ""
"\"\n"
" ค๒ปศอัคทคฦสันนค๒ฅ๊ฅซฅะกผคทคคน(\":help recovery\" ค๒ปฒพศ).\n"
-#: ../memline.c:3250
msgid " If you did this already, delete the swap file \""
-msgstr " ด๛คหคณค์ค๒นิคสครคฟคฮคสค้คะ, ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋ \""
+msgstr " ด๛คหคณค์ค๒นิคสครคฟคฮคสค้คะกขฅนฅ๏ฅรฅืฅีฅกฅคฅ๋ \""
-#: ../memline.c:3252
msgid ""
"\"\n"
" to avoid this message.\n"
@@ -4118,23 +3784,18 @@ msgstr ""
"\"\n"
" ค๒พรคปคะคณคฮฅแฅรฅปกผฅธค๒ฒ๓ศ๒ควคญคคน.\n"
-#: ../memline.c:3450 ../memline.c:3452
msgid "Swap file \""
msgstr "ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋ \""
-#: ../memline.c:3451 ../memline.c:3455
msgid "\" already exists!"
msgstr "\" คฌด๛คหคขค๊คคน!"
-#: ../memline.c:3457
msgid "VIM - ATTENTION"
msgstr "VIM - รํฐี"
-#: ../memline.c:3459
msgid "Swap file already exists!"
msgstr "ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คฌด๛คหยธบ฿คทคคน!"
-#: ../memline.c:3464
msgid ""
"&Open Read-Only\n"
"&Edit anyway\n"
@@ -4148,7 +3809,6 @@ msgstr ""
"ฝชฮปคนค๋(&Q)\n"
"รๆป฿คนค๋(&A)"
-#: ../memline.c:3467
msgid ""
"&Open Read-Only\n"
"&Edit anyway\n"
@@ -4164,56 +3824,31 @@ msgstr ""
"ฝชฮปคนค๋(&Q)\n"
"รๆป฿คนค๋(&A)"
-#.
-#. * Change the ".swp" extension to find another file that can be used.
-#. * First decrement the last char: ".swo", ".swn", etc.
-#. * If that still isn't enough decrement the last but one char: ".svz"
-#. * Can happen when editing many "No Name" buffers.
-#.
-#. ".s?a"
-#. ".saa": tried enough, give up
-#: ../memline.c:3528
msgid "E326: Too many swap files found"
msgstr "E326: ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คฌยฟฟ๔ธซคฤคซค๊คคทคฟ"
-#: ../memory.c:227
-#, c-format
-msgid "E342: Out of memory! (allocating %<PRIu64> bytes)"
-msgstr "E342: ฅแฅโฅ๊คฌยญค๊คคปค๓! (%<PRIu64> ฅะฅคฅศค๒ณไล๖อืตแ)"
-
-#: ../menu.c:62
msgid "E327: Part of menu-item path is not sub-menu"
msgstr "E327: ฅแฅหฅๅกผฅขฅคฅฦฅเคฮฅัฅนคฮษ๔สฌคฌฅตฅึฅแฅหฅๅกผควคฯคขค๊คคปค๓"
-#: ../menu.c:63
msgid "E328: Menu only exists in another mode"
msgstr "E328: ฅแฅหฅๅกผคฯยพคฮฅโกผฅษคหคภคฑคขค๊คคน"
-#: ../menu.c:64
#, c-format
msgid "E329: No menu \"%s\""
msgstr "E329: \"%s\" คศคคคฆฅแฅหฅๅกผคฯคขค๊คคปค๓"
-#. Only a mnemonic or accelerator is not valid.
-#: ../menu.c:329
msgid "E792: Empty menu name"
msgstr "E792: ฅแฅหฅๅกผฬพคฌถ๕ควคน"
-#: ../menu.c:340
msgid "E330: Menu path must not lead to a sub-menu"
msgstr "E330: ฅแฅหฅๅกผฅัฅนคฯฅตฅึฅแฅหฅๅกผค๒ภธคธค๋คูคญควคฯคขค๊คคปค๓"
-#: ../menu.c:365
msgid "E331: Must not add menu items directly to menu bar"
msgstr "E331: ฅแฅหฅๅกผฅะกผคหคฯฤพภฅแฅหฅๅกผฅขฅคฅฦฅเค๒ฤษฒรควคญคคปค๓"
-#: ../menu.c:370
msgid "E332: Separator cannot be part of a menu path"
msgstr "E332: ถ่ภฺค๊คฯฅแฅหฅๅกผฅัฅนคฮฐ์ษ๔ควคฯคขค๊คคปค๓"
-#. Now we have found the matching menu, and we list the mappings
-#. Highlight title
-#: ../menu.c:762
msgid ""
"\n"
"--- Menus ---"
@@ -4221,73 +3856,60 @@ msgstr ""
"\n"
"--- ฅแฅหฅๅกผ ---"
-#: ../menu.c:1313
+msgid "Tear off this menu"
+msgstr "คณคฮฅแฅหฅๅกผค๒ภฺค๊ผ่ค๋"
+
+#, c-format
+msgid "E335: Menu not defined for %s mode"
+msgstr "E335: %s คหคฯฅแฅหฅๅกผคฌฤ๊ตมคตค์คฦคคคคปค๓"
+
msgid "E333: Menu path must lead to a menu item"
msgstr "E333: ฅแฅหฅๅกผฅัฅนคฯฅแฅหฅๅกผฅขฅคฅฦฅเค๒ภธคธคสคฑค์คะคคคฑคคปค๓"
-#: ../menu.c:1330
#, c-format
msgid "E334: Menu not found: %s"
msgstr "E334: ฅแฅหฅๅกผคฌธซคฤคซค๊คคปค๓: %s"
-#: ../menu.c:1396
-#, c-format
-msgid "E335: Menu not defined for %s mode"
-msgstr "E335: %s คหคฯฅแฅหฅๅกผคฌฤ๊ตมคตค์คฦคคคคปค๓"
-
-#: ../menu.c:1426
msgid "E336: Menu path must lead to a sub-menu"
msgstr "E336: ฅแฅหฅๅกผฅัฅนคฯฅตฅึฅแฅหฅๅกผค๒ภธคธคสคฑค์คะคคคฑคคปค๓"
-#: ../menu.c:1447
msgid "E337: Menu not found - check menu names"
msgstr "E337: ฅแฅหฅๅกผคฌธซคฤคซค๊คคปค๓ - ฅแฅหฅๅกผฬพค๒ณฮวงคทคฦคฏคภคตคค"
-#: ../message.c:423
#, c-format
msgid "Error detected while processing %s:"
msgstr "%s คฮฝ่อรๆคหฅจฅ้กผคฌธกฝะคตค์คคทคฟ:"
-#: ../message.c:445
#, c-format
msgid "line %4ld:"
msgstr "นิ %4ld:"
-#: ../message.c:617
#, c-format
msgid "E354: Invalid register name: '%s'"
msgstr "E354: ฬตธ๚คสฅ์ฅธฅนฅฟฬพ: '%s'"
-#: ../message.c:745
msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
msgstr "ฦหธ์ฅแฅรฅปกผฅธหฬ๕/ดฦฝค: ยผฒฌ ยภฯบ <koron.kaoriya@gmail.com>"
-#: ../message.c:986
msgid "Interrupt: "
msgstr "ณไนค฿: "
-#: ../message.c:988
msgid "Press ENTER or type command to continue"
msgstr "ยณคฑค๋คหคฯENTERค๒ฒกคนคซฅณฅฅ๓ฅษค๒ฦฮฯคทคฦคฏคภคตคค"
-#: ../message.c:1843
#, c-format
-msgid "%s line %<PRId64>"
-msgstr "%s นิ %<PRId64>"
+msgid "%s line %ld"
+msgstr "%s นิ %ld"
-#: ../message.c:2392
msgid "-- More --"
msgstr "-- ทัยณ --"
-#: ../message.c:2398
msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "
msgstr " SPACE/d/j: ฒ่ฬฬ/ฅฺกผฅธ/นิ ฒผ, b/u/k: พๅ, q: ฝชฮป "
-#: ../message.c:3021 ../message.c:3031
msgid "Question"
msgstr "ผมฬไ"
-#: ../message.c:3023
msgid ""
"&Yes\n"
"&No"
@@ -4295,17 +3917,6 @@ msgstr ""
"คฯคค(&Y)\n"
"คคคคคจ(&N)"
-#: ../message.c:3033
-msgid ""
-"&Yes\n"
-"&No\n"
-"&Cancel"
-msgstr ""
-"คฯคค(&Y)\n"
-"คคคคคจ(&N)\n"
-"ฅญฅใฅ๓ฅปฅ๋(&C)"
-
-#: ../message.c:3045
msgid ""
"&Yes\n"
"&No\n"
@@ -4319,175 +3930,252 @@ msgstr ""
"มดคฦสด(&D)\n"
"ฅญฅใฅ๓ฅปฅ๋(&C)"
-#: ../message.c:3058
+msgid "Select Directory dialog"
+msgstr "ฅวฅฃฅ์ฅฏฅศฅ๊มชย๒ฅภฅคฅขฅํฅฐ"
+
+msgid "Save File dialog"
+msgstr "ฅีฅกฅคฅ๋สยธฅภฅคฅขฅํฅฐ"
+
+msgid "Open File dialog"
+msgstr "ฅีฅกฅคฅ๋ฦษนฅภฅคฅขฅํฅฐ"
+
+msgid "E338: Sorry, no file browser in console mode"
+msgstr "E338: ฅณฅ๓ฅฝกผฅ๋ฅโกผฅษควคฯฅีฅกฅคฅ๋ฅึฅ้ฅฆฅถค๒ปศคจคคปค๓กขคดคแค๓คสคตคค"
+
msgid "E766: Insufficient arguments for printf()"
msgstr "E766: printf() คฮฐ๚ฟ๔คฌษิฝฝสฌควคน"
-#: ../message.c:3119
msgid "E807: Expected Float argument for printf()"
-msgstr "E807: printf() คฮฐ๚ฟ๔คหคฯษโฦฐพฏฟ๔ลภฟ๔คฌดยิคตค์คฦคคคคน"
+msgstr "E807: printf() คฮฐ๚ฟ๔คหคฯษโฦฐพฎฟ๔ลภฟ๔คฌดยิคตค์คฦคคคคน"
-#: ../message.c:3873
msgid "E767: Too many arguments to printf()"
msgstr "E767: printf() คฮฐ๚ฟ๔คฌยฟฒแคฎคคน"
-#: ../misc1.c:2256
msgid "W10: Warning: Changing a readonly file"
msgstr "W10: ทูน๐: ฦษนภ์อัฅีฅกฅคฅ๋ค๒สันนคทคคน"
-#: ../misc1.c:2537
msgid "Type number and <Enter> or click with mouse (empty cancels): "
msgstr ""
"ศึนๆคศ<Enter>ค๒ฦฮฯคนค๋คซฅฅฆฅนควฅฏฅ๊ฅรฅฏคทคฦคฏคภคตคค (ถ๕ควฅญฅใฅ๓ฅปฅ๋): "
-#: ../misc1.c:2539
msgid "Type number and <Enter> (empty cancels): "
msgstr "ศึนๆคศ<Enter>ค๒ฦฮฯคทคฦคฏคภคตคค (ถ๕ควฅญฅใฅ๓ฅปฅ๋): "
-#: ../misc1.c:2585
msgid "1 more line"
msgstr "1 นิ ฤษฒรคทคคทคฟ"
-#: ../misc1.c:2588
msgid "1 line less"
msgstr "1 นิ บ๏ฝคทคคทคฟ"
-#: ../misc1.c:2593
#, c-format
-msgid "%<PRId64> more lines"
-msgstr "%<PRId64> นิ ฤษฒรคทคคทคฟ"
+msgid "%ld more lines"
+msgstr "%ld นิ ฤษฒรคทคคทคฟ"
-#: ../misc1.c:2596
#, c-format
-msgid "%<PRId64> fewer lines"
-msgstr "%<PRId64> นิ บ๏ฝคทคคทคฟ"
+msgid "%ld fewer lines"
+msgstr "%ld นิ บ๏ฝคทคคทคฟ"
-#: ../misc1.c:2599
msgid " (Interrupted)"
msgstr " (ณไนคค์คคทคฟ)"
-#: ../misc1.c:2635
msgid "Beep!"
msgstr "ฅำกผฅร!"
-#: ../misc2.c:738
+msgid "ERROR: "
+msgstr "ฅจฅ้กผ: "
+
+#, c-format
+msgid ""
+"\n"
+"[bytes] total alloc-freed %lu-%lu, in use %lu, peak use %lu\n"
+msgstr ""
+"\n"
+"[ฅแฅโฅ๊(ฅะฅคฅศ)] มํณไล๖-ฒ๒สฮฬ %lu-%lu, ปศอัฮฬ %lu, ฅิกผฅฏป %lu\n"
+
+#, c-format
+msgid ""
+"[calls] total re/malloc()'s %lu, total free()'s %lu\n"
+"\n"
+msgstr ""
+"[ธฦฝะ] มํ re/malloc() ฒ๓ฟ๔ %lu, มํ free() ฒ๓ฟ๔ %lu\n"
+"\n"
+
+msgid "E340: Line is becoming too long"
+msgstr "E340: นิคฌฤนคฏคสค๊ฒแคฎคคทคฟ"
+
+#, c-format
+msgid "E341: Internal error: lalloc(%ld, )"
+msgstr "E341: ฦโษ๔ฅจฅ้กผ: lalloc(%ld,)"
+
+#, c-format
+msgid "E342: Out of memory! (allocating %lu bytes)"
+msgstr "E342: ฅแฅโฅ๊คฌยญค๊คคปค๓! (%lu ฅะฅคฅศค๒ณไล๖อืตแ)"
+
#, c-format
msgid "Calling shell to execute: \"%s\""
msgstr "ผยนิคฮคฟคแคหฅทฅงฅ๋ค๒ธฦฝะคทรๆ: \"%s\""
-#: ../normal.c:183
+msgid "E545: Missing colon"
+msgstr "E545: ฅณฅํฅ๓คฌคขค๊คคปค๓"
+
+msgid "E546: Illegal mode"
+msgstr "E546: ษิภตคสฅโกผฅษควคน"
+
+msgid "E547: Illegal mouseshape"
+msgstr "E547: ษิภตคส 'mouseshape' ควคน"
+
+msgid "E548: digit expected"
+msgstr "E548: ฟ๔รอคฌษฌอืควคน"
+
+msgid "E549: Illegal percentage"
+msgstr "E549: ษิภตคสฅักผฅปฅ๓ฅฦกผฅธควคน"
+
+msgid "E854: path too long for completion"
+msgstr "E854: ฅัฅนคฌฤนฒแคฎคฦสไดฐควคญคคปค๓"
+
+#, c-format
+msgid ""
+"E343: Invalid path: '**[number]' must be at the end of the path or be "
+"followed by '%s'."
+msgstr ""
+"E343: ฬตธ๚คสฅัฅนควคน: '**[ฟ๔รอ]' คฯpathคฮบวธๅคซ '%s' คฌยณคคคฦคสคคคศคคคฑคคป"
+"ค๓."
+
+#, c-format
+msgid "E344: Can't find directory \"%s\" in cdpath"
+msgstr "E344: cdpathคหคฯ \"%s\" คศคคคฆฅีฅกฅคฅ๋คฌคขค๊คคปค๓"
+
+#, c-format
+msgid "E345: Can't find file \"%s\" in path"
+msgstr "E345: pathคหคฯ \"%s\" คศคคคฆฅีฅกฅคฅ๋คฌคขค๊คคปค๓"
+
+#, c-format
+msgid "E346: No more directory \"%s\" found in cdpath"
+msgstr "E346: cdpathคหคฯคณค์ฐสพๅ \"%s\" คศคคคฆฅีฅกฅคฅ๋คฌคขค๊คคปค๓"
+
+#, c-format
+msgid "E347: No more file \"%s\" found in path"
+msgstr "E347: ฅัฅนคหคฯคณค์ฐสพๅ \"%s\" คศคคคฆฅีฅกฅคฅ๋คฌคขค๊คคปค๓"
+
+#, c-format
+msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
+msgstr ""
+"E668: NetBeansคฮภยณพ๐ส๓ฅีฅกฅคฅ๋คฮฅขฅฏฅปฅนฅโกผฅษคหฬไย๊คฌคขค๊คคน: \"%s\""
+
+#, c-format
+msgid "E658: NetBeans connection lost for buffer %ld"
+msgstr "E658: ฅะฅรฅีฅก %ld คฮ NetBeans ภยณคฌผบค๏ค์คคทคฟ"
+
+msgid "E838: netbeans is not supported with this GUI"
+msgstr "E838: NetBeansคฯคณคฮGUIคหคฯยะฑคทคฦคคคคปค๓"
+
+msgid "E511: netbeans already connected"
+msgstr "E511: NetBeansคฯด๛คหภยณคทคฦคคคคน"
+
+#, c-format
+msgid "E505: %s is read-only (add ! to override)"
+msgstr "E505: %s คฯฦษนภ์อัควคน (ถฏภฉฝ๑นคหคฯ ! ค๒ฤษฒร)"
+
msgid "E349: No identifier under cursor"
msgstr "E349: ฅซกผฅฝฅ๋คฮฐฬรึคหคฯผฑสฬปาคฌคขค๊คคปค๓"
-#: ../normal.c:1866
msgid "E774: 'operatorfunc' is empty"
msgstr "E774: 'operatorfunc' ฅชฅืฅทฅ็ฅ๓คฌถ๕ควคน"
-#: ../normal.c:2637
+msgid "E775: Eval feature not available"
+msgstr "E775: ผฐษพฒมตกวฝคฌฬตธ๚คหคสครคฦคคคคน"
+
msgid "Warning: terminal cannot highlight"
msgstr "ทูน๐: ปศอัคทคฦคคค๋รผห๖คฯฅฯฅคฅ้ฅคฅศควคญคคปค๓"
-#: ../normal.c:2807
msgid "E348: No string under cursor"
msgstr "E348: ฅซกผฅฝฅ๋คฮฐฬรึคหคฯสธป๚ฮ๓คฌคขค๊คคปค๓"
-#: ../normal.c:3937
msgid "E352: Cannot erase folds with current 'foldmethod'"
msgstr "E352: ธฝบ฿คฮ 'foldmethod' ควคฯภพ๖ค฿ค๒พรต๎ควคญคคปค๓"
-#: ../normal.c:5897
msgid "E664: changelist is empty"
msgstr "E664: สันนฅ๊ฅนฅศคฌถ๕ควคน"
-#: ../normal.c:5899
msgid "E662: At start of changelist"
msgstr "E662: สันนฅ๊ฅนฅศคฮภ่ฦฌ"
-#: ../normal.c:5901
msgid "E663: At end of changelist"
msgstr "E663: สันนฅ๊ฅนฅศคฮห๖ศ๘"
-#: ../normal.c:7053
-msgid "Type :quit<Enter> to exit Nvim"
-msgstr "Vimค๒ฝชฮปคนค๋คหคฯ :quit<Enter> คศฦฮฯคทคฦคฏคภคตคค"
+msgid "Type :qa! and press <Enter> to abandon all changes and exit Vim"
+msgstr ""
+"คนคูคฦคฮสันนค๒วหดคทกขVimค๒ฝชฮปคนค๋คหคฯ :qa! คศฦฮฯคท <Enter> ค๒ฒกคทคฦคฏคภ"
+"คตคค"
-#: ../ops.c:248
#, c-format
msgid "1 line %sed 1 time"
msgstr "1 นิคฌ %s คว 1 ฒ๓ฝ่อคตค์คคทคฟ"
-#: ../ops.c:250
#, c-format
msgid "1 line %sed %d times"
msgstr "1 นิคฌ %s คว %d ฒ๓ฝ่อคตค์คคทคฟ"
-#: ../ops.c:253
#, c-format
-msgid "%<PRId64> lines %sed 1 time"
-msgstr "%<PRId64> นิคฌ %s คว 1 ฒ๓ฝ่อคตค์คคทคฟ"
+msgid "%ld lines %sed 1 time"
+msgstr "%ld นิคฌ %s คว 1 ฒ๓ฝ่อคตค์คคทคฟ"
-#: ../ops.c:256
#, c-format
-msgid "%<PRId64> lines %sed %d times"
-msgstr "%<PRId64> นิคฌ %s คว %d ฒ๓ฝ่อคตค์คคทคฟ"
+msgid "%ld lines %sed %d times"
+msgstr "%ld นิคฌ %s คว %d ฒ๓ฝ่อคตค์คคทคฟ"
-#: ../ops.c:592
#, c-format
-msgid "%<PRId64> lines to indent... "
-msgstr "%<PRId64> นิคฌฅคฅ๓ฅวฅ๓ฅศคตค์คคน... "
+msgid "%ld lines to indent... "
+msgstr "%ld นิคฌฅคฅ๓ฅวฅ๓ฅศคตค์คคน... "
-#: ../ops.c:634
msgid "1 line indented "
msgstr "1 นิค๒ฅคฅ๓ฅวฅ๓ฅศคทคคทคฟ "
-#: ../ops.c:636
#, c-format
-msgid "%<PRId64> lines indented "
-msgstr "%<PRId64> นิค๒ฅคฅ๓ฅวฅ๓ฅศคทคคทคฟ "
+msgid "%ld lines indented "
+msgstr "%ld นิค๒ฅคฅ๓ฅวฅ๓ฅศคทคคทคฟ "
-#: ../ops.c:938
msgid "E748: No previously used register"
msgstr "E748: คคภฅ์ฅธฅนฅฟค๒ปศอัคทคฦคคคคปค๓"
-#. must display the prompt
-#: ../ops.c:1433
msgid "cannot yank; delete anyway"
msgstr "ฅไฅ๓ฅฏควคญคคปค๓; คศคหคซคฏพรต๎"
-#: ../ops.c:1929
msgid "1 line changed"
msgstr "1 นิคฌสันนคตค์คคทคฟ"
-#: ../ops.c:1931
#, c-format
-msgid "%<PRId64> lines changed"
-msgstr "%<PRId64> นิคฌสันนคตค์คคทคฟ"
+msgid "%ld lines changed"
+msgstr "%ld นิคฌสันนคตค์คคทคฟ"
-#: ../ops.c:2521
-msgid "block of 1 line yanked"
-msgstr "1 นิคฮฅึฅํฅรฅฏคฌฅไฅ๓ฅฏคตค์คคทคฟ"
+#, c-format
+msgid "freeing %ld lines"
+msgstr "%ld นิค๒ฒ๒สรๆ"
-#: ../ops.c:2523
-msgid "1 line yanked"
-msgstr "1 นิคฌฅไฅ๓ฅฏคตค์คคทคฟ"
+#, c-format
+msgid " into \"%c"
+msgstr " \"%c คห"
-#: ../ops.c:2525
#, c-format
-msgid "block of %<PRId64> lines yanked"
-msgstr "%<PRId64> นิคฮฅึฅํฅรฅฏคฌฅไฅ๓ฅฏคตค์คคทคฟ"
+msgid "block of 1 line yanked%s"
+msgstr "1 นิคฮฅึฅํฅรฅฏคฌ%sฅไฅ๓ฅฏคตค์คคทคฟ"
-#: ../ops.c:2528
#, c-format
-msgid "%<PRId64> lines yanked"
-msgstr "%<PRId64> นิคฌฅไฅ๓ฅฏคตค์คคทคฟ"
+msgid "1 line yanked%s"
+msgstr "1 นิคฌ%sฅไฅ๓ฅฏคตค์คคทคฟ"
+
+#, c-format
+msgid "block of %ld lines yanked%s"
+msgstr "%ld นิคฮฅึฅํฅรฅฏคฌ%sฅไฅ๓ฅฏคตค์คคทคฟ"
+
+#, c-format
+msgid "%ld lines yanked%s"
+msgstr "%ld นิคฌ%sฅไฅ๓ฅฏคตค์คคทคฟ"
-#: ../ops.c:2710
#, c-format
msgid "E353: Nothing in register %s"
msgstr "E353: ฅ์ฅธฅนฅฟ %s คหคฯฒฟคโคขค๊คคปค๓"
-#. Highlight title
-#: ../ops.c:3185
msgid ""
"\n"
"--- Registers ---"
@@ -4495,11 +4183,9 @@ msgstr ""
"\n"
"--- ฅ์ฅธฅนฅฟ ---"
-#: ../ops.c:4455
msgid "Illegal register name"
msgstr "ษิภตคสฅ์ฅธฅนฅฟฬพ"
-#: ../ops.c:4533
msgid ""
"\n"
"# Registers:\n"
@@ -4507,7 +4193,6 @@ msgstr ""
"\n"
"# ฅ์ฅธฅนฅฟ:\n"
-#: ../ops.c:4575
#, c-format
msgid "E574: Unknown register type %d"
msgstr "E574: ฬครฮคฮฅ์ฅธฅนฅฟทฟ %d ควคน"
@@ -4517,86 +4202,58 @@ msgid ""
"lines"
msgstr "E883: ธกบ๗ฅัฅฟกผฅ๓คศผฐฅ์ฅธฅนฅฟคหคฯ2นิฐสพๅค๒ดคแค้ค์คคปค๓"
-#: ../ops.c:5089
#, c-format
-msgid "%<PRId64> Cols; "
-msgstr "%<PRId64> ฮ๓; "
+msgid "%ld Cols; "
+msgstr "%ld ฮ๓; "
-#: ../ops.c:5097
#, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Bytes"
-msgstr ""
-"มชย๒ %s%<PRId64> / %<PRId64> นิ; %<PRId64> / %<PRId64> รฑธ์; %<PRId64> / "
-"%<PRId64> ฅะฅคฅศ"
+msgid "Selected %s%ld of %ld Lines; %lld of %lld Words; %lld of %lld Bytes"
+msgstr "มชย๒ %s%ld / %ld นิ; %lld / %lld รฑธ์; %lld / %lld ฅะฅคฅศ"
-#: ../ops.c:5105
#, c-format
msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Chars; %<PRId64> of %<PRId64> Bytes"
+"Selected %s%ld of %ld Lines; %lld of %lld Words; %lld of %lld Chars; %lld of "
+"%lld Bytes"
msgstr ""
-"มชย๒ %s%<PRId64> / %<PRId64> นิ; %<PRId64> / %<PRId64> รฑธ์; %<PRId64> / "
-"%<PRId64> สธป๚; %<PRId64> / %<PRId64> ฅะฅคฅศ"
+"มชย๒ %s%ld / %ld นิ; %lld / %lld รฑธ์; %lld / %lld สธป๚; %lld / %lld ฅะฅคฅศ"
-#: ../ops.c:5123
#, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Byte "
-"%<PRId64> of %<PRId64>"
-msgstr ""
-"ฮ๓ %s / %s; นิ %<PRId64> of %<PRId64>; รฑธ์ %<PRId64> / %<PRId64>; ฅะฅคฅศ "
-"%<PRId64> / %<PRId64>"
+msgid "Col %s of %s; Line %ld of %ld; Word %lld of %lld; Byte %lld of %lld"
+msgstr "ฮ๓ %s / %s; นิ %ld of %ld; รฑธ์ %lld / %lld; ฅะฅคฅศ %lld / %lld"
-#: ../ops.c:5133
#, c-format
msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Char "
-"%<PRId64> of %<PRId64>; Byte %<PRId64> of %<PRId64>"
+"Col %s of %s; Line %ld of %ld; Word %lld of %lld; Char %lld of %lld; Byte "
+"%lld of %lld"
msgstr ""
-"ฮ๓ %s / %s; นิ %<PRId64> / %<PRId64>; รฑธ์ %<PRId64> / %<PRId64>; สธป๚ "
-"%<PRId64> / %<PRId64>; ฅะฅคฅศ %<PRId64> of %<PRId64>"
+"ฮ๓ %s / %s; นิ %ld / %ld; รฑธ์ %lld / %lld; สธป๚ %lld / %lld; ฅะฅคฅศ %lld of "
+"%lld"
-#: ../ops.c:5146
#, c-format
-msgid "(+%<PRId64> for BOM)"
-msgstr "(+%<PRId64> for BOM)"
+msgid "(+%lld for BOM)"
+msgstr "(+%lld for BOM)"
-#: ../option.c:1238
-msgid "%<%f%h%m%=Page %N"
-msgstr "%<%f%h%m%=%N ฅฺกผฅธ"
-
-#: ../option.c:1574
msgid "Thanks for flying Vim"
msgstr "Vim ค๒ปศครคฦคฏค์คฦคขค๊คฌคศคฆ"
-#. found a mismatch: skip
-#: ../option.c:2698
msgid "E518: Unknown option"
msgstr "E518: ฬครฮคฮฅชฅืฅทฅ็ฅ๓ควคน"
-#: ../option.c:2709
msgid "E519: Option not supported"
msgstr "E519: ฅชฅืฅทฅ็ฅ๓คฯฅตฅกผฅศคตค์คฦคคคคปค๓"
-#: ../option.c:2740
msgid "E520: Not allowed in a modeline"
msgstr "E520: modeline ควคฯต๖ฒฤคตค์คคปค๓"
-#: ../option.c:2815
msgid "E846: Key code not set"
msgstr "E846: ฅญกผฅณกผฅษคฌภ฿ฤ๊คตค์คฦคคคคปค๓"
-#: ../option.c:2924
msgid "E521: Number required after ="
msgstr "E521: = คฮธๅคหคฯฟ๔ป๚คฌษฌอืควคน"
-#: ../option.c:3226 ../option.c:3864
msgid "E522: Not found in termcap"
msgstr "E522: termcap ฦโคหธซคฤคซค๊คคปค๓"
-#: ../option.c:3335
#, c-format
msgid "E539: Illegal character <%s>"
msgstr "E539: ษิภตคสสธป๚ควคน <%s>"
@@ -4605,106 +4262,117 @@ msgstr "E539: ษิภตคสสธป๚ควคน <%s>"
msgid "For option %s"
msgstr "ฅชฅืฅทฅ็ฅ๓: %s"
-#: ../option.c:3862
msgid "E529: Cannot set 'term' to empty string"
msgstr "E529: 'term' คหคฯถ๕สธป๚ฮ๓ค๒ภ฿ฤ๊ควคญคคปค๓"
-#: ../option.c:3885
+msgid "E530: Cannot change term in GUI"
+msgstr "E530: GUIควคฯ 'term' ค๒สันนควคญคคปค๓"
+
+msgid "E531: Use \":gui\" to start the GUI"
+msgstr "E531: GUIค๒ฅนฅฟกผฅศคนค๋คหคฯ \":gui\" ค๒ปศอัคทคฦคฏคภคตคค"
+
msgid "E589: 'backupext' and 'patchmode' are equal"
msgstr "E589: 'backupext' คศ 'patchmode' คฌฦฑคธควคน"
-#: ../option.c:3964
msgid "E834: Conflicts with value of 'listchars'"
msgstr "E834: 'listchars'คฮรอคหฬทฝโคฌคขค๊คคน"
-#: ../option.c:3966
msgid "E835: Conflicts with value of 'fillchars'"
msgstr "E835: 'fillchars'คฮรอคหฬทฝโคฌคขค๊คคน"
-#: ../option.c:4163
+msgid "E617: Cannot be changed in the GTK+ 2 GUI"
+msgstr "E617: GTK+2 GUIควคฯสันนควคญคคปค๓"
+
+#, c-format
+msgid "E950: Cannot convert between %s and %s"
+msgstr "E950: %s คศ %s คฮดึควสัดนควคญคคปค๓"
+
msgid "E524: Missing colon"
msgstr "E524: ฅณฅํฅ๓คฌคขค๊คคปค๓"
-#: ../option.c:4165
msgid "E525: Zero length string"
msgstr "E525: สธป๚ฮ๓คฮฤนคตคฌฅผฅํควคน"
-#: ../option.c:4220
#, c-format
msgid "E526: Missing number after <%s>"
msgstr "E526: <%s> คฮธๅคหฟ๔ป๚คฌคขค๊คคปค๓"
-#: ../option.c:4232
msgid "E527: Missing comma"
msgstr "E527: ฅซฅ๓ฅคฌคขค๊คคปค๓"
-#: ../option.c:4239
msgid "E528: Must specify a ' value"
msgstr "E528: ' คฮรอค๒ปุฤ๊คทคสคฑค์คะคสค๊คคปค๓"
-#: ../option.c:4271
msgid "E595: contains unprintable or wide character"
msgstr "E595: ษฝผจควคญคสคคสธป๚คซฅ๏ฅคฅษสธป๚ค๒ดค๓ควคคคคน"
-#: ../option.c:4469
+msgid "E596: Invalid font(s)"
+msgstr "E596: ฬตธ๚คสฅีฅฉฅ๓ฅศควคน"
+
+msgid "E597: can't select fontset"
+msgstr "E597: ฅีฅฉฅ๓ฅศฅปฅรฅศค๒มชย๒ควคญคคปค๓"
+
+msgid "E598: Invalid fontset"
+msgstr "E598: ฬตธ๚คสฅีฅฉฅ๓ฅศฅปฅรฅศควคน"
+
+msgid "E533: can't select wide font"
+msgstr "E533: ฅ๏ฅคฅษฅีฅฉฅ๓ฅศค๒มชย๒ควคญคคปค๓"
+
+msgid "E534: Invalid wide font"
+msgstr "E534: ฬตธ๚คสฅ๏ฅคฅษฅีฅฉฅ๓ฅศควคน"
+
#, c-format
msgid "E535: Illegal character after <%c>"
msgstr "E535: <%c> คฮธๅคหษิภตคสสธป๚คฌคขค๊คคน"
-#: ../option.c:4534
msgid "E536: comma required"
msgstr "E536: ฅซฅ๓ฅคฌษฌอืควคน"
-#: ../option.c:4543
#, c-format
msgid "E537: 'commentstring' must be empty or contain %s"
msgstr "E537: 'commentstring' คฯถ๕ควคขค๋คซ %s ค๒ดคเษฌอืคฌคขค๊คคน"
-#: ../option.c:4928
+msgid "E538: No mouse support"
+msgstr "E538: ฅฅฆฅนคฯฅตฅกผฅศคตค์คคปค๓"
+
msgid "E540: Unclosed expression sequence"
msgstr "E540: ผฐคฌฝชฮปคทคฦคคคคปค๓"
-#: ../option.c:4932
msgid "E541: too many items"
msgstr "E541: อืมวคฌยฟฒแคฎคคน"
-#: ../option.c:4934
msgid "E542: unbalanced groups"
msgstr "E542: ฅฐฅ๋กผฅืคฌฤเน็คคคคปค๓"
-#: ../option.c:5148
+msgid "E946: Cannot make a terminal with running job modifiable"
+msgstr "E946: ผยนิรๆคฮฅธฅ็ฅึคฌคขค๋รผห๖คฯสันนฒฤวฝคหควคญคคปค๓"
+
msgid "E590: A preview window already exists"
msgstr "E590: ฅืฅ์ฅำฅๅกผฅฆฅฃฅ๓ฅษฅฆคฌด๛คหยธบ฿คทคคน"
-#: ../option.c:5311
msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'"
msgstr ""
-"W17: ฅขฅ้ฅำฅขสธป๚คหคฯUTF-8คฌษฌอืคสคฮคว, ':set encoding=utf-8' คทคฦคฏคภคตคค"
+"W17: ฅขฅ้ฅำฅขสธป๚คหคฯUTF-8คฌษฌอืคสคฮควกข':set encoding=utf-8' คทคฦคฏคภคตคค"
+
+msgid "E954: 24-bit colors are not supported on this environment"
+msgstr "E954: 24bitฟงคฯคณคฮดฤถญควคฯฅตฅกผฅศคตค์คฦคคคคปค๓"
-#: ../option.c:5623
#, c-format
msgid "E593: Need at least %d lines"
msgstr "E593: บวฤใ %d คฮนิฟ๔คฌษฌอืควคน"
-#: ../option.c:5631
#, c-format
msgid "E594: Need at least %d columns"
msgstr "E594: บวฤใ %d คฮฅซฅ้ฅเษคฌษฌอืควคน"
-#: ../option.c:6011
#, c-format
msgid "E355: Unknown option: %s"
msgstr "E355: ฬครฮคฮฅชฅืฅทฅ็ฅ๓ควคน: %s"
-#. There's another character after zeros or the string
-#. * is empty. In both cases, we are trying to set a
-#. * num option using a string.
-#: ../option.c:6037
#, c-format
msgid "E521: Number required: &%s = '%s'"
msgstr "E521: ฟ๔ป๚คฌษฌอืควคน: &%s = '%s'"
-#: ../option.c:6149
msgid ""
"\n"
"--- Terminal codes ---"
@@ -4712,7 +4380,6 @@ msgstr ""
"\n"
"--- รผห๖ฅณกผฅษ ---"
-#: ../option.c:6151
msgid ""
"\n"
"--- Global option values ---"
@@ -4720,7 +4387,6 @@ msgstr ""
"\n"
"--- ฅฐฅํกผฅะฅ๋ฅชฅืฅทฅ็ฅ๓รอ ---"
-#: ../option.c:6153
msgid ""
"\n"
"--- Local option values ---"
@@ -4728,7 +4394,6 @@ msgstr ""
"\n"
"--- ฅํกผฅซฅ๋ฅชฅืฅทฅ็ฅ๓รอ ---"
-#: ../option.c:6155
msgid ""
"\n"
"--- Options ---"
@@ -4736,37 +4401,115 @@ msgstr ""
"\n"
"--- ฅชฅืฅทฅ็ฅ๓ ---"
-#: ../option.c:6816
msgid "E356: get_varp ERROR"
msgstr "E356: get_varp ฅจฅ้กผ"
-#: ../option.c:7696
#, c-format
msgid "E357: 'langmap': Matching character missing for %s"
msgstr "E357: 'langmap': %s คหยะฑคนค๋สธป๚คฌคขค๊คคปค๓"
-#: ../option.c:7715
#, c-format
msgid "E358: 'langmap': Extra characters after semicolon: %s"
msgstr "E358: 'langmap': ฅปฅ฿ฅณฅํฅ๓คฮธๅคหอพสฌคสสธป๚คฌคขค๊คคน: %s"
-#: ../os/shell.c:194
-msgid ""
-"\n"
-"Cannot execute shell "
-msgstr ""
-"\n"
-"ฅทฅงฅ๋ค๒ผยนิควคญคคปค๓ "
+msgid "cannot open "
+msgstr "ณซคฑคคปค๓ "
+
+msgid "VIM: Can't open window!\n"
+msgstr "VIM: ฅฆฅฃฅ๓ฅษฅฆค๒ณซคฑคคปค๓!\n"
+
+msgid "Need Amigados version 2.04 or later\n"
+msgstr "Amigadosคฮฅะกผฅธฅ็ฅ๓ 2.04คซคฝค์ฐสน฿คฌษฌอืควคน\n"
+
+#, c-format
+msgid "Need %s version %ld\n"
+msgstr "%s คฮฅะกผฅธฅ็ฅ๓ %ld คฌษฌอืควคน\n"
+
+msgid "Cannot open NIL:\n"
+msgstr "NILค๒ณซคฑคคปค๓:\n"
+
+msgid "Cannot create "
+msgstr "บ๎ภฎควคญคคปค๓ "
+
+#, c-format
+msgid "Vim exiting with %d\n"
+msgstr "Vimคฯ %d ควฝชฮปคทคคน\n"
+
+msgid "cannot change console mode ?!\n"
+msgstr "ฅณฅ๓ฅฝกผฅ๋ฅโกผฅษค๒สันนควคญคคปค๓?!\n"
+
+msgid "mch_get_shellsize: not a console??\n"
+msgstr "mch_get_shellsize: ฅณฅ๓ฅฝกผฅ๋ควคฯคสคค??\n"
+
+msgid "E360: Cannot execute shell with -f option"
+msgstr "E360: -f ฅชฅืฅทฅ็ฅ๓ควฅทฅงฅ๋ค๒ผยนิควคญคคปค๓"
+
+msgid "Cannot execute "
+msgstr "ผยนิควคญคคปค๓ "
+
+msgid "shell "
+msgstr "ฅทฅงฅ๋ "
+
+msgid " returned\n"
+msgstr " ฬแค๊คคทคฟ\n"
+
+msgid "ANCHOR_BUF_SIZE too small."
+msgstr "ANCHOR_BUF_SIZE คฌพฎคตฒแคฎคคน."
+
+msgid "I/O ERROR"
+msgstr "ฦฝะฮฯฅจฅ้กผ"
+
+msgid "Message"
+msgstr "ฅแฅรฅปกผฅธ"
+
+msgid "E237: Printer selection failed"
+msgstr "E237: ฅืฅ๊ฅ๓ฅฟคฮมชย๒คหผบวิคทคคทคฟ"
+
+#, c-format
+msgid "to %s on %s"
+msgstr "%s คุ (%s พๅคฮ)"
+
+#, c-format
+msgid "E613: Unknown printer font: %s"
+msgstr "E613: ฬครฮคฮฅืฅ๊ฅ๓ฅฟฅชฅืฅทฅ็ฅ๓ควคน: %s"
+
+#, c-format
+msgid "E238: Print error: %s"
+msgstr "E238: ฐ๕บฅจฅ้กผ: %s"
+
+#, c-format
+msgid "Printing '%s'"
+msgstr "ฐ๕บคทคฦคคคคน: '%s'"
+
+#, c-format
+msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
+msgstr "E244: สธป๚ฅปฅรฅศฬพ \"%s\" คฯษิภตควคน (ฅีฅฉฅ๓ฅศฬพ \"%s\")"
+
+#, c-format
+msgid "E244: Illegal quality name \"%s\" in font name \"%s\""
+msgstr "E244: ษสผมฬพ \"%s\" คฯษิภตควคน (ฅีฅฉฅ๓ฅศฬพ \"%s\")"
+
+#, c-format
+msgid "E245: Illegal char '%c' in font name \"%s\""
+msgstr "E245: '%c' คฯษิภตคสสธป๚ควคน (ฅีฅฉฅ๓ฅศฬพ \"%s\")"
+
+#, c-format
+msgid "Opening the X display took %ld msec"
+msgstr "Xฅตกผฅะกผคุคฮภยณคห %ld ฅ฿ฅ๊ษรคซคซค๊คคทคฟ"
-#: ../os/shell.c:439
msgid ""
"\n"
-"shell returned "
+"Vim: Got X error\n"
msgstr ""
"\n"
-"ฅทฅงฅ๋คฌรอค๒สึคทคคทคฟ "
+"Vim: X คฮฅจฅ้กผค๒ธกฝะคทคคทคฟr\n"
+
+msgid "Testing the X display failed"
+msgstr "X display คฮฅมฅงฅรฅฏคหผบวิคทคคทคฟ"
+
+msgid "Opening the X display timed out"
+msgstr "X display คฮ open คฌฅฟฅคฅเฅขฅฆฅศคทคคทคฟ"
-#: ../os_unix.c:465 ../os_unix.c:471
msgid ""
"\n"
"Could not get security context for "
@@ -4774,7 +4517,6 @@ msgstr ""
"\n"
"ฅปฅญฅๅฅ๊ฅฦฅฃฅณฅ๓ฅฦฅญฅนฅศค๒ผ่ฦภควคญคคปค๓ "
-#: ../os_unix.c:479
msgid ""
"\n"
"Could not set security context for "
@@ -4790,223 +4532,289 @@ msgstr "ฅปฅญฅๅฅ๊ฅฦฅฃฅณฅ๓ฅฦฅญฅนฅศ %s ค๒ %s คหภ฿ฤ๊ควคญคคปค๓"
msgid "Could not get security context %s for %s. Removing it!"
msgstr "ฅปฅญฅๅฅ๊ฅฦฅฃฅณฅ๓ฅฦฅญฅนฅศ %s ค๒ %s คซค้ผ่ฦภควคญคคปค๓. บ๏ฝคทคคน!"
-#: ../os_unix.c:1558 ../os_unix.c:1647
+msgid ""
+"\n"
+"Cannot execute shell sh\n"
+msgstr ""
+"\n"
+"sh ฅทฅงฅ๋ค๒ผยนิควคญคคปค๓\n"
+
+msgid ""
+"\n"
+"shell returned "
+msgstr ""
+"\n"
+"ฅทฅงฅ๋คฌรอค๒สึคทคคทคฟ "
+
+msgid ""
+"\n"
+"Cannot create pipes\n"
+msgstr ""
+"\n"
+"ฅัฅคฅืค๒บ๎ภฎควคญคคปค๓\n"
+
+msgid ""
+"\n"
+"Cannot fork\n"
+msgstr ""
+"\n"
+"fork ควคญคคปค๓\n"
+
+msgid ""
+"\n"
+"Cannot execute shell "
+msgstr ""
+"\n"
+"ฅทฅงฅ๋ค๒ผยนิควคญคคปค๓ "
+
+msgid ""
+"\n"
+"Command terminated\n"
+msgstr ""
+"\n"
+"ฅณฅฅ๓ฅษค๒รๆรวคทคคทคฟ\n"
+
+msgid "XSMP lost ICE connection"
+msgstr "XSMP คฌICEภยณค๒ผบคคคคทคฟ"
+
#, c-format
msgid "dlerror = \"%s\""
msgstr "dlerror = \"%s\""
-#: ../path.c:1449
+msgid "Opening the X display failed"
+msgstr "X display คฮ open คหผบวิคทคคทคฟ"
+
+msgid "XSMP handling save-yourself request"
+msgstr "XSMP คฌsave-yourselfอืตแค๒ฝ่อคทคฦคคคคน"
+
+msgid "XSMP opening connection"
+msgstr "XSMP คฌภยณค๒ณซปฯคทคฦคคคคน"
+
+msgid "XSMP ICE connection watch failed"
+msgstr "XSMP ICEภยณคฌผบวิคทคฟค่คฆควคน"
+
#, c-format
-msgid "E447: Can't find file \"%s\" in path"
-msgstr "E447: pathคหคฯ \"%s\" คศคคคฆฅีฅกฅคฅ๋คฌคขค๊คคปค๓"
+msgid "XSMP SmcOpenConnection failed: %s"
+msgstr "XSMP SmcOpenConnectionคฌผบวิคทคคทคฟ: %s"
+
+msgid "At line"
+msgstr "นิ"
+
+msgid "Could not load vim32.dll!"
+msgstr "vim32.dll ค๒ฅํกผฅษควคญคคปค๓ควคทคฟ"
+
+msgid "VIM Error"
+msgstr "VIMฅจฅ้กผ"
+
+msgid "Could not fix up function pointers to the DLL!"
+msgstr "DLLคซค้ดุฟ๔ฅฅคฅ๓ฅฟค๒ผ่ฦภควคญคคปค๓ควคทคฟ"
+
+#, c-format
+msgid "Vim: Caught %s event\n"
+msgstr "Vim: ฅคฅูฅ๓ฅศ %s ค๒ธกรฮ\n"
+
+msgid "close"
+msgstr "สฤคธค๋"
+
+msgid "logoff"
+msgstr "ฅํฅฐฅชฅี"
+
+msgid "shutdown"
+msgstr "ฅทฅใฅรฅศฅภฅฆฅ๓"
+
+msgid "E371: Command not found"
+msgstr "E371: ฅณฅฅ๓ฅษคฌคขค๊คคปค๓"
+
+msgid ""
+"VIMRUN.EXE not found in your $PATH.\n"
+"External commands will not pause after completion.\n"
+"See :help win32-vimrun for more information."
+msgstr ""
+"VIMRUN.EXEคฌ $PATH คฮรๆคหธซคฤคซค๊คคปค๓.\n"
+"ณฐษ๔ฅณฅฅ๓ฅษคฮฝชฮปธๅคหฐ์ปฤไป฿ค๒คทคคปค๓.\n"
+"พบูคฯ :help win32-vimrun ค๒ปฒพศคทคฦคฏคภคตคค."
+
+msgid "Vim Warning"
+msgstr "Vimคฮทูน๐"
+
+#, c-format
+msgid "shell returned %d"
+msgstr "ฅทฅงฅ๋คฌฅณกผฅษ %d ควฝชฮปคทคคทคฟ"
+
+msgid "E926: Current location list was changed"
+msgstr "E926: ธฝบ฿คฮฅํฅฑกผฅทฅ็ฅ๓ฅ๊ฅนฅศคฌสันนคตค์คคทคฟ"
-#: ../quickfix.c:359
#, c-format
msgid "E372: Too many %%%c in format string"
msgstr "E372: ฅีฅฉกผฅฅรฅศสธป๚ฮ๓คห %%%c คฌยฟฒแคฎคคน"
-#: ../quickfix.c:371
#, c-format
msgid "E373: Unexpected %%%c in format string"
msgstr "E373: ฅีฅฉกผฅฅรฅศสธป๚ฮ๓คหอฝดคปคฬ %%%c คฌคขค๊คคทคฟ"
-#: ../quickfix.c:420
msgid "E374: Missing ] in format string"
msgstr "E374: ฅีฅฉกผฅฅรฅศสธป๚ฮ๓คห ] คฌคขค๊คคปค๓"
-#: ../quickfix.c:431
#, c-format
msgid "E375: Unsupported %%%c in format string"
msgstr "E375: ฅีฅฉกผฅฅรฅศสธป๚ฮ๓ควคฯ %%%c คฯฅตฅกผฅศคตค์คคปค๓"
-#: ../quickfix.c:448
#, c-format
msgid "E376: Invalid %%%c in format string prefix"
msgstr "E376: ฅีฅฉกผฅฅรฅศสธป๚ฮ๓คฮมฐรึคหฬตธ๚คส %%%c คฌคขค๊คคน"
-#: ../quickfix.c:454
#, c-format
msgid "E377: Invalid %%%c in format string"
msgstr "E377: ฅีฅฉกผฅฅรฅศสธป๚ฮ๓คหฬตธ๚คส %%%c คฌคขค๊คคน"
-#. nothing found
-#: ../quickfix.c:477
msgid "E378: 'errorformat' contains no pattern"
msgstr "E378: 'errorformat' คหฅัฅฟกผฅ๓คฌปุฤ๊คตค์คฦคคคคปค๓"
-#: ../quickfix.c:695
msgid "E379: Missing or empty directory name"
msgstr "E379: ฅวฅฃฅ์ฅฏฅศฅ๊ฬพคฌฬตคคคซถ๕ควคน"
-#: ../quickfix.c:1305
msgid "E553: No more items"
msgstr "E553: อืมวคฌคโคฆคขค๊คคปค๓"
-#: ../quickfix.c:1674
+msgid "E924: Current window was closed"
+msgstr "E924: ธฝบ฿คฮฅฆฅฃฅ๓ฅษฅฆคฌสฤคธค้ค์คคทคฟ"
+
+msgid "E925: Current quickfix was changed"
+msgstr "E925: ธฝบ฿คฮ quickfix คฌสันนคตค์คคทคฟ"
+
#, c-format
msgid "(%d of %d)%s%s: "
msgstr "(%d of %d)%s%s: "
-#: ../quickfix.c:1676
msgid " (line deleted)"
msgstr " (นิคฌบ๏ฝคตค์คคทคฟ)"
-#: ../quickfix.c:1863
+#, c-format
+msgid "%serror list %d of %d; %d errors "
+msgstr "%s ฅจฅ้กผฐ์อ๗ %d of %d; %d ธฤฅจฅ้กผ"
+
msgid "E380: At bottom of quickfix stack"
msgstr "E380: quickfix ฅนฅฟฅรฅฏคฮห๖ศ๘ควคน"
-#: ../quickfix.c:1869
msgid "E381: At top of quickfix stack"
msgstr "E381: quickfix ฅนฅฟฅรฅฏคฮภ่ฦฌควคน"
-#: ../quickfix.c:1880
-#, c-format
-msgid "error list %d of %d; %d errors"
-msgstr "ฅจฅ้กผฐ์อ๗ %d of %d; %d ธฤฅจฅ้กผ"
+msgid "No entries"
+msgstr "ฅจฅ๓ฅศฅ๊คฌคขค๊คคปค๓"
-#: ../quickfix.c:2427
-msgid "E382: Cannot write, 'buftype' option is set"
-msgstr "E382: 'buftype' ฅชฅืฅทฅ็ฅ๓คฌภ฿ฤ๊คตค์คฦคคค๋คฮควฝ๑นค฿คคปค๓"
+msgid "Error file"
+msgstr "ฅจฅ้กผฅีฅกฅคฅ๋"
-#: ../quickfix.c:2812
msgid "E683: File name missing or invalid pattern"
msgstr "E683: ฅีฅกฅคฅ๋ฬพคฌฬตคคคซฬตธ๚คสฅัฅฟกผฅ๓ควคน"
-#: ../quickfix.c:2911
#, c-format
msgid "Cannot open file \"%s\""
msgstr "ฅีฅกฅคฅ๋ \"%s\" ค๒ณซคฑคคปค๓"
-#: ../quickfix.c:3429
msgid "E681: Buffer is not loaded"
msgstr "E681: ฅะฅรฅีฅกคฯฦษค฿นคค์คคปค๓ควคทคฟ"
-#: ../quickfix.c:3487
msgid "E777: String or List expected"
msgstr "E777: สธป๚ฮ๓คซฅ๊ฅนฅศคฌษฌอืควคน"
-#: ../regexp.c:359
#, c-format
msgid "E369: invalid item in %s%%[]"
msgstr "E369: ฬตธ๚คสนเฬควคน: %s%%[]"
-#
-#: ../regexp.c:374
#, c-format
msgid "E769: Missing ] after %s["
msgstr "E769: %s[ คฮธๅคห ] คฌคขค๊คคปค๓"
-#: ../regexp.c:375
+msgid "E944: Reverse range in character class"
+msgstr "E944: สธป๚ฅฏฅ้ฅนคฮศฯฐฯคฌตีควคน"
+
+msgid "E945: Range too large in character class"
+msgstr "E945: สธป๚ฅฏฅ้ฅนคฮศฯฐฯคฌย็คญคนคฎคคน"
+
#, c-format
msgid "E53: Unmatched %s%%("
msgstr "E53: %s%%( คฌฤเค๊น็ครคฦคคคคปค๓"
-#: ../regexp.c:376
#, c-format
msgid "E54: Unmatched %s("
msgstr "E54: %s( คฌฤเค๊น็ครคฦคคคคปค๓"
-#: ../regexp.c:377
#, c-format
msgid "E55: Unmatched %s)"
msgstr "E55: %s) คฌฤเค๊น็ครคฦคคคคปค๓"
-#
-#: ../regexp.c:378
msgid "E66: \\z( not allowed here"
msgstr "E66: \\z( คฯฅณฅณควคฯต๖ฒฤคตค์คฦคคคคปค๓"
-#
-#: ../regexp.c:379
-msgid "E67: \\z1 et al. not allowed here"
-msgstr "E67: \\z1 คฝคฮยพคฯฅณฅณควคฯต๖ฒฤคตค์คฦคคคคปค๓"
+msgid "E67: \\z1 - \\z9 not allowed here"
+msgstr "E67: \\z1 - \\z9 คฯฅณฅณควคฯต๖ฒฤคตค์คฦคคคคปค๓"
-#
-#: ../regexp.c:380
#, c-format
msgid "E69: Missing ] after %s%%["
msgstr "E69: %s%%[ คฮธๅคห ] คฌคขค๊คคปค๓"
-#: ../regexp.c:381
#, c-format
msgid "E70: Empty %s%%[]"
msgstr "E70: %s%%[] คฌถ๕ควคน"
-#: ../regexp.c:1209 ../regexp.c:1224
+msgid "E956: Cannot use pattern recursively"
+msgstr "E956: ฅัฅฟกผฅ๓ค๒บฦตขลชคหปศคฆคณคศคฯควคญคคปค๓"
+
+msgid "E65: Illegal back reference"
+msgstr "E65: ษิภตคสธๅสปฒพศควคน"
+
msgid "E339: Pattern too long"
msgstr "E339: ฅัฅฟกผฅ๓คฌฤนฒแคฎคคน"
-#: ../regexp.c:1371
msgid "E50: Too many \\z("
msgstr "E50: \\z( คฌยฟฒแคฎคคน"
-#: ../regexp.c:1378
#, c-format
msgid "E51: Too many %s("
msgstr "E51: %s( คฌยฟฒแคฎคคน"
-#: ../regexp.c:1427
msgid "E52: Unmatched \\z("
msgstr "E52: \\z( คฌฤเค๊น็ครคฦคคคคปค๓"
-#: ../regexp.c:1637
#, c-format
msgid "E59: invalid character after %s@"
msgstr "E59: %s@ คฮธๅคหษิภตคสสธป๚คฌคขค๊คคทคฟ"
-#: ../regexp.c:1672
#, c-format
msgid "E60: Too many complex %s{...}s"
msgstr "E60: สฃปจคส %s{...} คฌยฟฒแคฎคคน"
-#: ../regexp.c:1687
#, c-format
msgid "E61: Nested %s*"
msgstr "E61:%s* คฌฦค์ปาคหคสครคฦคคคคน"
-#: ../regexp.c:1690
#, c-format
msgid "E62: Nested %s%c"
msgstr "E62:%s%c คฌฦค์ปาคหคสครคฦคคคคน"
-#
-#: ../regexp.c:1800
msgid "E63: invalid use of \\_"
msgstr "E63: \\_ คฮฬตธ๚คสปศอัสหกควคน"
-#: ../regexp.c:1850
#, c-format
msgid "E64: %s%c follows nothing"
msgstr "E64:%s%c คฮธๅคหคสคหคโคขค๊คคปค๓"
-#
-#: ../regexp.c:1902
-msgid "E65: Illegal back reference"
-msgstr "E65: ษิภตคสธๅสปฒพศควคน"
-
-#
-#: ../regexp.c:1943
msgid "E68: Invalid character after \\z"
msgstr "E68: \\z คฮธๅคหษิภตคสสธป๚คฌคขค๊คคทคฟ"
-#
-#: ../regexp.c:2049 ../regexp_nfa.c:1296
#, c-format
msgid "E678: Invalid character after %s%%[dxouU]"
msgstr "E678: %s%%[dxouU] คฮธๅคหษิภตคสสธป๚คฌคขค๊คคทคฟ"
-#
-#: ../regexp.c:2107
#, c-format
msgid "E71: Invalid character after %s%%"
msgstr "E71: %s%% คฮธๅคหษิภตคสสธป๚คฌคขค๊คคทคฟ"
-#: ../regexp.c:3017
#, c-format
msgid "E554: Syntax error in %s{...}"
msgstr "E554: %s{...} ฦโคหสธหกฅจฅ้กผคฌคขค๊คคน"
-#: ../regexp.c:3805
msgid "External submatches:\n"
msgstr "ณฐษ๔คฮษ๔สฌณบล๖:\n"
@@ -5014,7 +4822,6 @@ msgstr "ณฐษ๔คฮษ๔สฌณบล๖:\n"
msgid "E888: (NFA regexp) cannot repeat %s"
msgstr "E888: (NFA ภตตฌษฝธฝ) ทซค๊สึคปคคปค๓ %s"
-#: ../regexp.c:7022
msgid ""
"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be "
"used "
@@ -5025,62 +4832,58 @@ msgstr ""
msgid "Switching to backtracking RE engine for pattern: "
msgstr "ผกคฮฅัฅฟกผฅ๓คหฅะฅรฅฏฅศฅ้ฅรฅญฅ๓ฅฐ RE ฅจฅ๓ฅธฅ๓ค๒ลฌอัคทคคน: "
-#: ../regexp_nfa.c:239
msgid "E865: (NFA) Regexp end encountered prematurely"
msgstr "E865: (NFA) ดยิค่ค๊มแคฏภตตฌษฝธฝคฮฝชรผคหลรฃคทคคทคฟ"
-#: ../regexp_nfa.c:240
#, c-format
msgid "E866: (NFA regexp) Misplaced %c"
msgstr "E866: (NFA ภตตฌษฝธฝ) ฐฬรึคฌธํครคฦคคคคน: %c"
-#: ../regexp_nfa.c:242
#, c-format
-msgid "E877: (NFA regexp) Invalid character class: %<PRId64>"
-msgstr "E877: (NFA ภตตฌษฝธฝ) ฬตธ๚คสสธป๚ฅฏฅ้ฅน: %<PRId64>"
+msgid "E877: (NFA regexp) Invalid character class: %ld"
+msgstr "E877: (NFA ภตตฌษฝธฝ) ฬตธ๚คสสธป๚ฅฏฅ้ฅน: %ld"
-#: ../regexp_nfa.c:1261
#, c-format
msgid "E867: (NFA) Unknown operator '\\z%c'"
msgstr "E867: (NFA) ฬครฮคฮฅชฅฺฅ์กผฅฟควคน: '\\z%c'"
-#: ../regexp_nfa.c:1387
+msgid "E951: \\% value too large"
+msgstr "E951: \\% รอคฌฤนฒแคฎคคน"
+
#, c-format
msgid "E867: (NFA) Unknown operator '\\%%%c'"
msgstr "E867: (NFA) ฬครฮคฮฅชฅฺฅ์กผฅฟควคน: '\\%%%c'"
-#: ../regexp_nfa.c:1802
+msgid "E868: Error building NFA with equivalence class!"
+msgstr "E868: ล๙ฒมฅฏฅ้ฅนค๒ดคเNFAนฝรคหผบวิคทคคทคฟ!"
+
#, c-format
msgid "E869: (NFA) Unknown operator '\\@%c'"
msgstr "E869: (NFA) ฬครฮคฮฅชฅฺฅ์กผฅฟควคน: '\\@%c'"
-#: ../regexp_nfa.c:1831
msgid "E870: (NFA regexp) Error reading repetition limits"
msgstr "E870: (NFA ภตตฌษฝธฝ) ทซค๊สึคทคฮภฉธยฒ๓ฟ๔ค๒ฦษนรๆคหฅจฅ้กผ"
-#. Can't have a multi follow a multi.
-#: ../regexp_nfa.c:1895
-msgid "E871: (NFA regexp) Can't have a multi follow a multi !"
-msgstr "E871: (NFA ภตตฌษฝธฝ) ทซค๊สึคท คฮธๅคห ทซค๊สึคท คฯควคญคคปค๓!"
+msgid "E871: (NFA regexp) Can't have a multi follow a multi"
+msgstr "E871: (NFA ภตตฌษฝธฝ) ทซค๊สึคท คฮธๅคห ทซค๊สึคท คฯควคญคคปค๓"
-#. Too many `('
-#: ../regexp_nfa.c:2037
msgid "E872: (NFA regexp) Too many '('"
msgstr "E872: (NFA ภตตฌษฝธฝ) '(' คฌยฟฒแคฎคคน"
-#: ../regexp_nfa.c:2042
msgid "E879: (NFA regexp) Too many \\z("
msgstr "E879: (NFA ภตตฌษฝธฝ) \\z( คฌยฟฒแคฎคคน"
-#: ../regexp_nfa.c:2066
msgid "E873: (NFA regexp) proper termination error"
msgstr "E873: (NFA ภตตฌษฝธฝ) ฝชรผตญนๆคฌคขค๊คคปค๓"
-#: ../regexp_nfa.c:2599
-msgid "E874: (NFA) Could not pop the stack !"
+msgid "Could not open temporary log file for writing, displaying on stderr... "
+msgstr ""
+"NFAภตตฌษฝธฝฅจฅ๓ฅธฅ๓อัคฮฅํฅฐฅีฅกฅคฅ๋ค๒ฝ๑นอัคศคทคฦณซคฑคคปค๓กฃฅํฅฐคฯษธฝเฅจฅ้กผ"
+"ฝะฮฯคหฝะฮฯคทคคนกฃ"
+
+msgid "E874: (NFA) Could not pop the stack!"
msgstr "E874: (NFA) ฅนฅฟฅรฅฏค๒ฅฅรฅืควคญคคปค๓!"
-#: ../regexp_nfa.c:3298
msgid ""
"E875: (NFA regexp) (While converting from postfix to NFA), too many states "
"left on stack"
@@ -5088,177 +4891,122 @@ msgstr ""
"E875: (NFA ภตตฌษฝธฝ) (ธๅรึสธป๚ฮ๓ค๒NFAคหสัดนรๆคห) ฅนฅฟฅรฅฏคหปฤคตค์คฟฅนฅฦกผฅศคฌ"
"ยฟฒแคฎคคน"
-#: ../regexp_nfa.c:3302
msgid "E876: (NFA regexp) Not enough space to store the whole NFA "
msgstr "E876: (NFA ภตตฌษฝธฝ) NFAมดยฮค๒สยธคนค๋คหคฯถ๕คญฅนฅฺกผฅนคฌยญค๊คคปค๓"
-#: ../regexp_nfa.c:4571 ../regexp_nfa.c:4869
-msgid ""
-"Could not open temporary log file for writing, displaying on stderr ... "
-msgstr ""
-"NFAภตตฌษฝธฝฅจฅ๓ฅธฅ๓อัคฮฅํฅฐฅีฅกฅคฅ๋ค๒ฝ๑นอัคศคทคฦณซคฑคคปค๓กฃฅํฅฐคฯษธฝเฝะฮฯคห"
-"ฝะฮฯคทคคนกฃ"
-
-#: ../regexp_nfa.c:4840
-#, c-format
-msgid "(NFA) COULD NOT OPEN %s !"
-msgstr "(NFA) ฅํฅฐฅีฅกฅคฅ๋ %s ค๒ณซคฑคคปค๓!"
-
-#: ../regexp_nfa.c:6049
-msgid "Could not open temporary log file for writing "
-msgstr "NFAภตตฌษฝธฝฅจฅ๓ฅธฅ๓อัคฮฅํฅฐฅีฅกฅคฅ๋ค๒ฝ๑นอัคศคทคฦณซคฑคคปค๓กฃ"
+msgid "E878: (NFA) Could not allocate memory for branch traversal!"
+msgstr "E878: (NFA) ธฝบ฿ฒฃรวรๆคฮฅึฅ้ฅ๓ฅมคหฝฝสฌคสฅแฅโฅ๊ค๒ณไค๊ล๖คฦค้ค์คคปค๓!"
-#: ../screen.c:7435
msgid " VREPLACE"
msgstr " ฒพมรึดน"
-#: ../screen.c:7437
msgid " REPLACE"
msgstr " รึดน"
-#: ../screen.c:7440
msgid " REVERSE"
msgstr " ศฟลพ"
-#: ../screen.c:7441
msgid " INSERT"
msgstr " มฦ"
-#: ../screen.c:7443
msgid " (insert)"
msgstr " (มฦ)"
-#: ../screen.c:7445
msgid " (replace)"
msgstr " (รึดน)"
-#: ../screen.c:7447
msgid " (vreplace)"
msgstr " (ฒพมรึดน)"
-#: ../screen.c:7449
msgid " Hebrew"
msgstr " ฅุฅึฅ้ฅค"
-#: ../screen.c:7454
msgid " Arabic"
msgstr " ฅขฅ้ฅำฅข"
-#: ../screen.c:7456
-msgid " (lang)"
-msgstr " (ธภธ์)"
-
-#: ../screen.c:7459
msgid " (paste)"
msgstr " (ลฝค๊ษีคฑ)"
-#: ../screen.c:7469
msgid " VISUAL"
msgstr " ฅำฅธฅๅฅขฅ๋"
-#: ../screen.c:7470
msgid " VISUAL LINE"
msgstr " ฅำฅธฅๅฅขฅ๋ นิ"
-#: ../screen.c:7471
msgid " VISUAL BLOCK"
msgstr " ฅำฅธฅๅฅขฅ๋ ถ๋ทม"
-#: ../screen.c:7472
msgid " SELECT"
msgstr " ฅปฅ์ฅฏฅศ"
-#: ../screen.c:7473
msgid " SELECT LINE"
msgstr " นิปุธมชย๒"
-#: ../screen.c:7474
msgid " SELECT BLOCK"
msgstr " ถ๋ทมมชย๒"
-#: ../screen.c:7486 ../screen.c:7541
msgid "recording"
msgstr "ตญฯฟรๆ"
-#: ../search.c:487
#, c-format
msgid "E383: Invalid search string: %s"
msgstr "E383: ฬตธ๚คสธกบ๗สธป๚ฮ๓ควคน: %s"
-#: ../search.c:832
#, c-format
msgid "E384: search hit TOP without match for: %s"
msgstr "E384: พๅคควธกบ๗คทคคทคฟคฌณบล๖ฒีฝ๊คฯคขค๊คคปค๓: %s"
-#: ../search.c:835
#, c-format
msgid "E385: search hit BOTTOM without match for: %s"
msgstr "E385: ฒผคควธกบ๗คทคคทคฟคฌณบล๖ฒีฝ๊คฯคขค๊คคปค๓: %s"
-#: ../search.c:1200
msgid "E386: Expected '?' or '/' after ';'"
msgstr "E386: ';' คฮคขคศคหคฯ '?' คซ '/' คฌดยิคตค์คฦคคค๋"
-#: ../search.c:4085
msgid " (includes previously listed match)"
msgstr " (มฐคหฮ๓ต๓คทคฟณบล๖ฒีฝ๊ค๒ดคเ)"
-#. cursor at status line
-#: ../search.c:4104
msgid "--- Included files "
msgstr "--- ฅคฅ๓ฅฏฅ๋กผฅษคตค์คฟฅีฅกฅคฅ๋ "
-#: ../search.c:4106
msgid "not found "
msgstr "ธซคฤคซค๊คคปค๓ "
-#: ../search.c:4107
msgid "in path ---\n"
msgstr "ฅัฅนคห ----\n"
-#: ../search.c:4168
msgid " (Already listed)"
msgstr " (ด๛คหฮ๓ต๓)"
-#: ../search.c:4170
msgid " NOT FOUND"
msgstr " ธซคฤคซค๊คคปค๓"
-#: ../search.c:4211
#, c-format
msgid "Scanning included file: %s"
msgstr "ฅคฅ๓ฅฏฅ๋กผฅษคตค์คฟฅีฅกฅคฅ๋ค๒ฅนฅญฅใฅ๓รๆ: %s"
-#: ../search.c:4216
#, c-format
msgid "Searching included file %s"
-msgstr "ฅคฅ๓ฅฏฅ๋กผฅษคตค์คฟฅีฅกฅคฅ๋ค๒ฅนฅญฅใฅ๓รๆ %s"
+msgstr "ฅคฅ๓ฅฏฅ๋กผฅษคตค์คฟฅีฅกฅคฅ๋ค๒ธกบ๗รๆ %s"
-#: ../search.c:4405
msgid "E387: Match is on current line"
msgstr "E387: ธฝบ฿นิคหณบล๖คฌคขค๊คคน"
-#: ../search.c:4517
msgid "All included files were found"
msgstr "มดคฦคฮฅคฅ๓ฅฏฅ๋กผฅษคตค์คฟฅีฅกฅคฅ๋คฌธซคฤคซค๊คคทคฟ"
-#: ../search.c:4519
msgid "No included files"
msgstr "ฅคฅ๓ฅฏฅ๋กผฅษฅีฅกฅคฅ๋คฯคขค๊คคปค๓"
-#: ../search.c:4527
msgid "E388: Couldn't find definition"
msgstr "E388: ฤ๊ตมค๒ธซคฤคฑค้ค์คคปค๓"
-#: ../search.c:4529
msgid "E389: Couldn't find pattern"
msgstr "E389: ฅัฅฟกผฅ๓ค๒ธซคฤคฑค้ค์คคปค๓"
-#: ../search.c:4668
msgid "Substitute "
msgstr "Substitute "
-#: ../search.c:4681
#, c-format
msgid ""
"\n"
@@ -5269,99 +5017,129 @@ msgstr ""
"# บวธๅคฮ %sธกบ๗ฅัฅฟกผฅ๓:\n"
"~"
-#: ../spell.c:951
-msgid "E759: Format error in spell file"
-msgstr "E759: ฅนฅฺฅ๋ฅีฅกฅคฅ๋คฮฝ๑ผฐฅจฅ้กผควคน"
+msgid "E756: Spell checking is not enabled"
+msgstr "E756: ฅนฅฺฅ๋ฅมฅงฅรฅฏคฯฬตธ๚ฒฝคตค์คฦคคคคน"
+
+#, c-format
+msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\""
+msgstr ""
+"ทูน๐: รฑธ์ฅ๊ฅนฅศ \"%s_%s.spl\" คชค่คำ \"%s_ascii.spl\" คฯธซคฤคซค๊คคปค๓"
+
+#, c-format
+msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
+msgstr ""
+"ทูน๐: รฑธ์ฅ๊ฅนฅศ \"%s.%s.spl\" คชค่คำ \"%s.ascii.spl\" คฯธซคฤคซค๊คคปค๓"
+
+msgid "E797: SpellFileMissing autocommand deleted buffer"
+msgstr "E797: autocommand คฮ SpellFileMissing คฌฅะฅรฅีฅกค๒บ๏ฝคทคคทคฟ"
+
+#, c-format
+msgid "Warning: region %s not supported"
+msgstr "ทูน๐9: %s คศคคคฆศฯฐฯคฯฅตฅกผฅศคตค์คฦคคคคปค๓"
+
+msgid "Sorry, no suggestions"
+msgstr "ปฤวฐควคนคฌกขฝคภตธ๕สไคฯคขค๊คคปค๓"
+
+#, c-format
+msgid "Sorry, only %ld suggestions"
+msgstr "ปฤวฐควคนคฌกขฝคภตธ๕สไคฯ %ld ธฤคทคซคขค๊คคปค๓"
+
+#, c-format
+msgid "Change \"%.*s\" to:"
+msgstr "\"%.*s\" ค๒ผกคุสัดน:"
+
+#, c-format
+msgid " < \"%.*s\""
+msgstr " < \"%.*s\""
+
+msgid "E752: No previous spell replacement"
+msgstr "E752: ฅนฅฺฅ๋รึดนคฌคคภผยนิคตค์คฦคคคคปค๓"
+
+#, c-format
+msgid "E753: Not found: %s"
+msgstr "E753: ธซคฤคซค๊คคปค๓: %s"
-#: ../spell.c:952
msgid "E758: Truncated spell file"
msgstr "E758: ฅนฅฺฅ๋ฅีฅกฅคฅ๋คฌภฺผ่ค้ค์คฦคคค๋ค่คฆควคน"
-#: ../spell.c:953
#, c-format
msgid "Trailing text in %s line %d: %s"
msgstr "%s (%d นิฬ) คหยณคฏฅฦฅญฅนฅศ: %s"
-#: ../spell.c:954
#, c-format
msgid "Affix name too long in %s line %d: %s"
msgstr "%s (%d นิฬ) คฮ affix ฬพคฌฤนฒแคฎคคน: %s"
-#: ../spell.c:955
msgid "E761: Format error in affix file FOL, LOW or UPP"
msgstr ""
"E761: affixฅีฅกฅคฅ๋คฮ FOL, LOW คโคทคฏคฯ UPP คฮฅีฅฉกผฅฅรฅศคหฅจฅ้กผคฌคขค๊คคน"
-#: ../spell.c:957
msgid "E762: Character in FOL, LOW or UPP is out of range"
msgstr "E762: FOL, LOW คโคทคฏคฯ UPP คฮสธป๚คฌศฯฐฯณฐควคน"
-#: ../spell.c:958
msgid "Compressing word tree..."
msgstr "รฑธ์ฅฤฅ๊กผค๒ฐตฝฬคทคฦคคคคน..."
-#: ../spell.c:1951
-msgid "E756: Spell checking is not enabled"
-msgstr "E756: ฅนฅฺฅ๋ฅมฅงฅรฅฏคฯฬตธ๚ฒฝคตค์คฦคคคคน"
-
-#: ../spell.c:2249
-#, c-format
-msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
-msgstr ""
-"ทูน๐: รฑธ์ฅ๊ฅนฅศ \"%s.%s.spl\" คชค่คำ \"%s.ascii.spl\" คฯธซคฤคซค๊คคปค๓"
-
-#: ../spell.c:2473
#, c-format
msgid "Reading spell file \"%s\""
msgstr "ฅนฅฺฅ๋ฅีฅกฅคฅ๋ \"%s\" ค๒ฦษนรๆ"
-#: ../spell.c:2496
msgid "E757: This does not look like a spell file"
msgstr "E757: ฅนฅฺฅ๋ฅีฅกฅคฅ๋ควคฯคสคคค่คฆควคน"
-#: ../spell.c:2501
msgid "E771: Old spell file, needs to be updated"
-msgstr "E771: ธลคคฅนฅฺฅ๋ฅีฅกฅคฅ๋คสคฮคว, ฅขฅรฅืฅวกผฅศคทคฦคฏคภคตคค"
+msgstr "E771: ธลคคฅนฅฺฅ๋ฅีฅกฅคฅ๋คสคฮควกขฅขฅรฅืฅวกผฅศคทคฦคฏคภคตคค"
-#: ../spell.c:2504
msgid "E772: Spell file is for newer version of Vim"
msgstr "E772: ค่ค๊ฟทคทคคฅะกผฅธฅ็ฅ๓คฮ Vim อัคฮฅนฅฺฅ๋ฅีฅกฅคฅ๋ควคน"
-#: ../spell.c:2602
msgid "E770: Unsupported section in spell file"
msgstr "E770: ฅนฅฺฅ๋ฅีฅกฅคฅ๋คหฅตฅกผฅศคทคฦคคคสคคฅปฅฏฅทฅ็ฅ๓คฌคขค๊คคน"
-#: ../spell.c:3762
#, c-format
-msgid "Warning: region %s not supported"
-msgstr "ทูน๐9: %s คศคคคฆศฯฐฯคฯฅตฅกผฅศคตค์คฦคคคคปค๓"
+msgid "E778: This does not look like a .sug file: %s"
+msgstr "E778: .sug ฅีฅกฅคฅ๋ควคฯคสคคค่คฆควคน: %s"
-#: ../spell.c:4550
#, c-format
-msgid "Reading affix file %s ..."
+msgid "E779: Old .sug file, needs to be updated: %s"
+msgstr "E779: ธลคค .sug ฅีฅกฅคฅ๋คสคฮควกขฅขฅรฅืฅวกผฅศคทคฦคฏคภคตคค: %s"
+
+#, c-format
+msgid "E780: .sug file is for newer version of Vim: %s"
+msgstr "E780: ค่ค๊ฟทคทคคฅะกผฅธฅ็ฅ๓คฮ Vim อัคฮ .sug ฅีฅกฅคฅ๋ควคน: %s"
+
+#, c-format
+msgid "E781: .sug file doesn't match .spl file: %s"
+msgstr "E781: .sug ฅีฅกฅคฅ๋คฌ .spl ฅีฅกฅคฅ๋คศฐ์รืคทคคปค๓: %s"
+
+#, c-format
+msgid "E782: error while reading .sug file: %s"
+msgstr "E782: .sug ฅีฅกฅคฅ๋คฮฦษนรๆคหฅจฅ้กผคฌศฏภธคทคคทคฟ: %s"
+
+#, c-format
+msgid "Reading affix file %s..."
msgstr "affix ฅีฅกฅคฅ๋ %s ค๒ฦษนรๆ..."
-#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
#, c-format
msgid "Conversion failure for word in %s line %d: %s"
msgstr "%s (%d นิฬ) คฮรฑธ์ค๒สัดนควคญคคปค๓ควคทคฟ: %s"
-#: ../spell.c:4630 ../spell.c:6170
#, c-format
msgid "Conversion in %s not supported: from %s to %s"
msgstr "%s ฦโคฮผกคฮสัดนคฯฅตฅกผฅศคตค์คฦคคคคปค๓: %s คซค้ %s คุ"
-#: ../spell.c:4642
+#, c-format
+msgid "Conversion in %s not supported"
+msgstr "%s ฦโคฮสัดนคฯฅตฅกผฅศคตค์คฦคคคคปค๓"
+
#, c-format
msgid "Invalid value for FLAG in %s line %d: %s"
msgstr "%s ฦโคฮ %d นิฬคฮ FLAG คหฬตธ๚คสรอคฌคขค๊คคน: %s"
-#: ../spell.c:4655
#, c-format
msgid "FLAG after using flags in %s line %d: %s"
msgstr "%s ฦโคฮ %d นิฬคหฅีฅ้ฅฐคฮฦ๓ฝลปศอัคฌคขค๊คคน: %s"
-#: ../spell.c:4723
#, c-format
msgid ""
"Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line "
@@ -5370,7 +5148,6 @@ msgstr ""
"%s คฮ %d นิฬคฮ PFX นเฬคฮธๅคฮ COMPOUNDFORBIDFLAG คฮฤ๊ตมคฯธํครคฟท๋ฒฬค๒ภธคธค๋"
"คณคศคฌคขค๊คคน"
-#: ../spell.c:4731
#, c-format
msgid ""
"Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line "
@@ -5379,43 +5156,35 @@ msgstr ""
"%s คฮ %d นิฬคฮ PFX นเฬคฮธๅคฮ COMPOUNDPERMITFLAG คฮฤ๊ตมคฯธํครคฟท๋ฒฬค๒ภธคธค๋"
"คณคศคฌคขค๊คคน"
-#: ../spell.c:4747
#, c-format
msgid "Wrong COMPOUNDRULES value in %s line %d: %s"
msgstr "COMPOUNDRULES คฮรอคหธํค๊คฌคขค๊คคน. ฅีฅกฅคฅ๋ %s คฮ %d นิฬ: %s"
-#: ../spell.c:4771
#, c-format
msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s"
msgstr "%s คฮ %d นิฬคฮ COMPOUNDWORDMAX คฮรอคหธํค๊คฌคขค๊คคน: %s"
-#: ../spell.c:4777
#, c-format
msgid "Wrong COMPOUNDMIN value in %s line %d: %s"
msgstr "%s คฮ %d นิฬคฮ COMPOUNDMIN คฮรอคหธํค๊คฌคขค๊คคน: %s"
-#: ../spell.c:4783
#, c-format
msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s"
msgstr "%s คฮ %d นิฬคฮ COMPOUNDSYLMAX คฮรอคหธํค๊คฌคขค๊คคน: %s"
-#: ../spell.c:4795
#, c-format
msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"
msgstr "%s คฮ %d นิฬคฮ CHECKCOMPOUNDPATTERN คฮรอคหธํค๊คฌคขค๊คคน: %s"
-#: ../spell.c:4847
#, c-format
msgid "Different combining flag in continued affix block in %s line %d: %s"
msgstr ""
"%s คฮ %d นิฬคฮ ฯขยณ affix ฅึฅํฅรฅฏคฮฅีฅ้ฅฐคฮมศน็คปคหฐใคคคฌคขค๊คคน: %s"
-#: ../spell.c:4850
#, c-format
msgid "Duplicate affix in %s line %d: %s"
msgstr "%s คฮ %d นิฬคห ฝลสฃคทคฟ affix ค๒ธกฝะคทคคทคฟ: %s"
-#: ../spell.c:4871
#, c-format
msgid ""
"Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s "
@@ -5424,337 +5193,245 @@ msgstr ""
"%s คฮ %d นิฬคฮ affix คฯ BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST "
"คหปศอัคทคฦคฏคภคตคค: %s"
-#: ../spell.c:4893
#, c-format
msgid "Expected Y or N in %s line %d: %s"
msgstr "%s คฮ %d นิฬควคฯ Y คซ N คฌษฌอืควคน: %s"
-#: ../spell.c:4968
#, c-format
msgid "Broken condition in %s line %d: %s"
msgstr "%s คฮ %d นิฬคฮ พ๒ท๏คฯฒ๕ค์คฦคคคคน: %s"
-#: ../spell.c:5091
#, c-format
msgid "Expected REP(SAL) count in %s line %d"
msgstr "%s คฮ %d นิฬคหคฯ REP(SAL) คฮฒ๓ฟ๔คฌษฌอืควคน"
-#: ../spell.c:5120
#, c-format
msgid "Expected MAP count in %s line %d"
msgstr "%s คฮ %d นิฬคหคฯ MAP คฮฒ๓ฟ๔คฌษฌอืควคน"
-#: ../spell.c:5132
#, c-format
msgid "Duplicate character in MAP in %s line %d"
msgstr "%s คฮ %d นิฬคฮ MAP คหฝลสฃคทคฟสธป๚คฌคขค๊คคน"
-#: ../spell.c:5176
#, c-format
msgid "Unrecognized or duplicate item in %s line %d: %s"
msgstr "%s คฮ %d นิฬคห วงผฑควคญคสคคคซฝลสฃคทคฟนเฬคฌคขค๊คคน: %s"
-#: ../spell.c:5197
#, c-format
msgid "Missing FOL/LOW/UPP line in %s"
msgstr "%s นิฬคห FOL/LOW/UPP คฌคขค๊คคปค๓"
-#: ../spell.c:5220
msgid "COMPOUNDSYLMAX used without SYLLABLE"
msgstr "SYLLABLE คฌปุฤ๊คตค์คสคค COMPOUNDSYLMAX"
-#: ../spell.c:5236
msgid "Too many postponed prefixes"
msgstr "รูฑไธๅรึปาคฌยฟฒแคฎคคน"
-#: ../spell.c:5238
msgid "Too many compound flags"
msgstr "สฃน็ฅีฅ้ฅฐคฌยฟฒแคฎคคน"
-#: ../spell.c:5240
msgid "Too many postponed prefixes and/or compound flags"
msgstr "รูฑไธๅรึปา คศ/คโคทคฏคฯ สฃน็ฅีฅ้ฅฐคฌยฟฒแคฎคคน"
-#: ../spell.c:5250
#, c-format
msgid "Missing SOFO%s line in %s"
msgstr "SOFO%s นิคฌ %s คหคขค๊คคปค๓"
-#: ../spell.c:5253
#, c-format
msgid "Both SAL and SOFO lines in %s"
msgstr "SALนิ คศ SOFOนิ คฌ %s ควฮพสปุฤ๊คตค์คฦคคคคน"
-#: ../spell.c:5331
#, c-format
msgid "Flag is not a number in %s line %d: %s"
msgstr "%s คฮ %d นิคฮ ฅีฅ้ฅฐคฌฟ๔รอควคฯคขค๊คคปค๓: %s"
-#: ../spell.c:5334
#, c-format
msgid "Illegal flag in %s line %d: %s"
msgstr "%s คฮ %d นิฬคฮ ฅีฅ้ฅฐคฌษิภตควคน: %s"
-#: ../spell.c:5493 ../spell.c:5501
#, c-format
msgid "%s value differs from what is used in another .aff file"
msgstr "รอ %s คฯยพคฮ .aff ฅีฅกฅคฅ๋ควปศอัคตค์คฟคฮคศฐคสค๊คคน"
-#: ../spell.c:5602
#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "ผญฝ๑ฅีฅกฅคฅ๋ %s ค๒ฅนฅญฅใฅ๓รๆ..."
+msgid "Reading dictionary file %s..."
+msgstr "ผญฝ๑ฅีฅกฅคฅ๋ %s ค๒ฦษนค฿รๆ..."
-#: ../spell.c:5611
#, c-format
msgid "E760: No word count in %s"
msgstr "E760: %s คหคฯรฑธ์ฟ๔คฌคขค๊คคปค๓"
-#: ../spell.c:5669
#, c-format
-msgid "line %6d, word %6d - %s"
-msgstr "นิ %6d, รฑธ์ %6d - %s"
+msgid "line %6d, word %6ld - %s"
+msgstr "นิ %6d, รฑธ์ %6ld - %s"
-#: ../spell.c:5691
#, c-format
msgid "Duplicate word in %s line %d: %s"
msgstr "%s คฮ %d นิฬคว ฝลสฃรฑธ์คฌธซคฤคซค๊คคทคฟ: %s"
-#: ../spell.c:5694
#, c-format
msgid "First duplicate word in %s line %d: %s"
msgstr "ฝลสฃคฮคฆคมบวฝ้คฮรฑธ์คฯ %s คฮ %d นิฬควคน: %s"
-#: ../spell.c:5746
#, c-format
msgid "%d duplicate word(s) in %s"
msgstr "%d ธฤคฮรฑธ์คฌธซคฤคซค๊คคทคฟ (%s ฦโ)"
-#: ../spell.c:5748
#, c-format
msgid "Ignored %d word(s) with non-ASCII characters in %s"
msgstr "ศ๓ASCIIสธป๚ค๒ดคเ %d ธฤคฮรฑธ์ค๒ฬตป๋คทคคทคฟ (%s ฦโ)"
-#: ../spell.c:6115
#, c-format
-msgid "Reading word file %s ..."
-msgstr "ษธฝเฦฮฯคซค้ฦษนค฿รๆ %s ..."
+msgid "Reading word file %s..."
+msgstr "รฑธ์ฅีฅกฅคฅ๋ %s ค๒ฦษนค฿รๆ..."
-#: ../spell.c:6155
#, c-format
msgid "Duplicate /encoding= line ignored in %s line %d: %s"
msgstr "%s คฮ %d นิฬคฮ ฝลสฃคทคฟ /encoding= นิค๒ฬตป๋คทคคทคฟ: %s"
-#: ../spell.c:6159
#, c-format
msgid "/encoding= line after word ignored in %s line %d: %s"
msgstr "%s คฮ %d นิฬคฮ รฑธ์คฮธๅคฮ /encoding= นิค๒ฬตป๋คทคคทคฟ: %s"
-#: ../spell.c:6180
#, c-format
msgid "Duplicate /regions= line ignored in %s line %d: %s"
msgstr "%s คฮ %d นิฬคฮ ฝลสฃคทคฟ /regions= นิค๒ฬตป๋คทคคทคฟ: %s"
-#: ../spell.c:6185
#, c-format
msgid "Too many regions in %s line %d: %s"
-msgstr "%s คฮ %d นิฬ, ศฯฐฯปุฤ๊คฌยฟฒแคฎคคน: %s"
+msgstr "%s คฮ %d นิฬกขศฯฐฯปุฤ๊คฌยฟฒแคฎคคน: %s"
-#: ../spell.c:6198
#, c-format
msgid "/ line ignored in %s line %d: %s"
msgstr "%s คฮ %d นิฬคฮ ฝลสฃคทคฟ / นิค๒ฬตป๋คทคคทคฟ: %s"
-#: ../spell.c:6224
#, c-format
msgid "Invalid region nr in %s line %d: %s"
msgstr "%s คฮ %d นิฬ ฬตธ๚คส nr ฮฮฐ่ควคน: %s"
-#: ../spell.c:6230
#, c-format
msgid "Unrecognized flags in %s line %d: %s"
msgstr "%s คฮ %d นิฬ วงผฑษิวฝคสฅีฅ้ฅฐควคน: %s"
-#: ../spell.c:6257
#, c-format
msgid "Ignored %d words with non-ASCII characters"
msgstr "ศ๓ASCIIสธป๚ค๒ดคเ %d ธฤคฮรฑธ์ค๒ฬตป๋คทคคทคฟ"
-#: ../spell.c:6656
+msgid "E845: Insufficient memory, word list will be incomplete"
+msgstr "E845: ฅแฅโฅ๊คฌยญค๊คสคคคฮควกขรฑธ์ฅ๊ฅนฅศคฯษิดฐมดควคน"
+
#, c-format
msgid "Compressed %d of %d nodes; %d (%d%%) remaining"
msgstr "ฅฮกผฅษ %d ธฤ(มด %d ธฤรๆ) ค๒ฐตฝฬคทคคทคฟ; ปฤค๊ %d (%d%%)"
-#: ../spell.c:7340
msgid "Reading back spell file..."
msgstr "ฅนฅฺฅ๋ฅีฅกฅคฅ๋ค๒ตีฦษนรๆ"
-#. Go through the trie of good words, soundfold each word and add it to
-#. the soundfold trie.
-#: ../spell.c:7357
msgid "Performing soundfolding..."
msgstr "ฒปภผพ๖นค฿ค๒ผยนิรๆ..."
-#: ../spell.c:7368
#, c-format
-msgid "Number of words after soundfolding: %<PRId64>"
-msgstr "ฒปภผพ๖นค฿ธๅคฮมํรฑธ์ฟ๔: %<PRId64>"
+msgid "Number of words after soundfolding: %ld"
+msgstr "ฒปภผพ๖นค฿ธๅคฮมํรฑธ์ฟ๔: %ld"
-#: ../spell.c:7476
#, c-format
msgid "Total number of words: %d"
msgstr "มํรฑธ์ฟ๔: %d"
-#: ../spell.c:7655
#, c-format
-msgid "Writing suggestion file %s ..."
+msgid "Writing suggestion file %s..."
msgstr "ฝคภตธ๕สไฅีฅกฅคฅ๋ \"%s\" ค๒ฝ๑นค฿รๆ..."
-#: ../spell.c:7707 ../spell.c:7927
#, c-format
msgid "Estimated runtime memory use: %d bytes"
msgstr "ฟไฤ๊ฅแฅโฅ๊ปศอัฮฬ: %d ฅะฅคฅศ"
-#: ../spell.c:7820
msgid "E751: Output file name must not have region name"
msgstr "E751: ฝะฮฯฅีฅกฅคฅ๋ฬพคหคฯศฯฐฯฬพค๒ดคแค้ค์คคปค๓"
-#: ../spell.c:7822
-msgid "E754: Only up to 8 regions supported"
-msgstr "E754: ศฯฐฯคฯ 8 ธฤคควคทคซฅตฅกผฅศคตค์คฦคคคคปค๓"
+#, c-format
+msgid "E754: Only up to %ld regions supported"
+msgstr "E754: ศฯฐฯคฯ %ld ธฤคควคทคซฅตฅกผฅศคตค์คฦคคคคปค๓"
-#: ../spell.c:7846
#, c-format
msgid "E755: Invalid region in %s"
msgstr "E755: ฬตธ๚คสศฯฐฯควคน: %s"
-#: ../spell.c:7907
msgid "Warning: both compounding and NOBREAK specified"
msgstr "ทูน๐: สฃน็ฅีฅ้ฅฐคศ NOBREAK คฌฮพสคศคโปุฤ๊คตค์คคทคฟ"
-#: ../spell.c:7920
#, c-format
-msgid "Writing spell file %s ..."
+msgid "Writing spell file %s..."
msgstr "ฅนฅฺฅ๋ฅีฅกฅคฅ๋ %s ค๒ฝ๑นค฿รๆ..."
-#: ../spell.c:7925
msgid "Done!"
msgstr "ผยนิคทคคทคฟ!"
-#: ../spell.c:8034
#, c-format
-msgid "E765: 'spellfile' does not have %<PRId64> entries"
-msgstr "E765: 'spellfile' คหคฯ %<PRId64> ธฤคฮฅจฅ๓ฅศฅ๊คฯคขค๊คคปค๓"
+msgid "E765: 'spellfile' does not have %ld entries"
+msgstr "E765: 'spellfile' คหคฯ %ld ธฤคฮฅจฅ๓ฅศฅ๊คฯคขค๊คคปค๓"
-#: ../spell.c:8074
#, c-format
msgid "Word '%.*s' removed from %s"
msgstr "รฑธ์ '%.*s' คฌ %s คซค้บ๏ฝคตค์คคทคฟ"
-#: ../spell.c:8117
#, c-format
msgid "Word '%.*s' added to %s"
msgstr "รฑธ์ '%.*s' คฌ %s คุฤษฒรคตค์คคทคฟ"
-#: ../spell.c:8381
msgid "E763: Word characters differ between spell files"
msgstr "E763: รฑธ์คฮสธป๚คฌฅนฅฺฅ๋ฅีฅกฅคฅ๋คศฐคสค๊คคน"
-#: ../spell.c:8684
-msgid "Sorry, no suggestions"
-msgstr "ปฤวฐควคนคฌ, ฝคภตธ๕สไคฯคขค๊คคปค๓"
-
-#: ../spell.c:8687
-#, c-format
-msgid "Sorry, only %<PRId64> suggestions"
-msgstr "ปฤวฐควคนคฌ, ฝคภตธ๕สไคฯ %<PRId64> ธฤคทคซคขค๊คคปค๓"
-
-#. for when 'cmdheight' > 1
-#. avoid more prompt
-#: ../spell.c:8704
-#, c-format
-msgid "Change \"%.*s\" to:"
-msgstr "\"%.*s\" ค๒ผกคุสัดน:"
-
-#: ../spell.c:8737
-#, c-format
-msgid " < \"%.*s\""
-msgstr " < \"%.*s\""
-
-#: ../spell.c:8882
-msgid "E752: No previous spell replacement"
-msgstr "E752: ฅนฅฺฅ๋รึดนคฌคคภผยนิคตค์คฦคคคคปค๓"
+msgid "E783: duplicate char in MAP entry"
+msgstr "E783: MAP ฅจฅ๓ฅศฅ๊คหฝลสฃสธป๚คฌยธบ฿คทคคน"
-#: ../spell.c:8925
-#, c-format
-msgid "E753: Not found: %s"
-msgstr "E753: ธซคฤคซค๊คคปค๓: %s"
+msgid "No Syntax items defined for this buffer"
+msgstr "คณคฮฅะฅรฅีฅกคหฤ๊ตมคตค์คฟนฝสธอืมวคฯคขค๊คคปค๓"
-#: ../spell.c:9276
-#, c-format
-msgid "E778: This does not look like a .sug file: %s"
-msgstr "E778: .sug ฅีฅกฅคฅ๋ควคฯคสคคค่คฆควคน: %s"
+msgid "syntax conceal on"
+msgstr "นฝสธคฮ conceal คฯธฝบ฿ on ควคน"
-#: ../spell.c:9282
-#, c-format
-msgid "E779: Old .sug file, needs to be updated: %s"
-msgstr "E779: ธลคค .sug ฅีฅกฅคฅ๋คสคฮคว, ฅขฅรฅืฅวกผฅศคทคฦคฏคภคตคค: %s"
+msgid "syntax conceal off"
+msgstr "นฝสธคฮ conceal คฯธฝบ฿ off ควคน"
-#: ../spell.c:9286
#, c-format
-msgid "E780: .sug file is for newer version of Vim: %s"
-msgstr "E780: ค่ค๊ฟทคทคคฅะกผฅธฅ็ฅ๓คฮ Vim อัคฮ .sug ฅีฅกฅคฅ๋ควคน: %s"
+msgid "E390: Illegal argument: %s"
+msgstr "E390: ษิภตคสฐ๚ฟ๔ควคน: %s"
-#: ../spell.c:9295
-#, c-format
-msgid "E781: .sug file doesn't match .spl file: %s"
-msgstr "E781: .sug ฅีฅกฅคฅ๋คฌ .spl ฅีฅกฅคฅ๋คศฐ์รืคทคคปค๓: %s"
+msgid "syntax case ignore"
+msgstr "นฝสธคฮย็สธป๚พฎสธป๚คฯธฝบ฿ ignore ควคน"
-#: ../spell.c:9305
-#, c-format
-msgid "E782: error while reading .sug file: %s"
-msgstr "E782: .sug ฅีฅกฅคฅ๋คฮฦษนรๆคหฅจฅ้กผคฌศฏภธคทคคทคฟ: %s"
+msgid "syntax case match"
+msgstr "นฝสธคฮย็สธป๚พฎสธป๚คฯธฝบ฿ match ควคน"
-#. This should have been checked when generating the .spl
-#. file.
-#: ../spell.c:11575
-msgid "E783: duplicate char in MAP entry"
-msgstr "E783: MAP ฅจฅ๓ฅศฅ๊คหฝลสฃสธป๚คฌยธบ฿คทคคน"
+msgid "syntax spell toplevel"
+msgstr "นฝสธคฮ spell คฯธฝบ฿ toplevel ควคน"
-#: ../syntax.c:266
-msgid "No Syntax items defined for this buffer"
-msgstr "คณคฮฅะฅรฅีฅกคหฤ๊ตมคตค์คฟนฝสธอืมวคฯคขค๊คคปค๓"
+msgid "syntax spell notoplevel"
+msgstr "นฝสธคฮ spell คฯธฝบ฿ notoplevel ควคน"
-#: ../syntax.c:3083 ../syntax.c:3104 ../syntax.c:3127
-#, c-format
-msgid "E390: Illegal argument: %s"
-msgstr "E390: ษิภตคสฐ๚ฟ๔ควคน: %s"
+msgid "syntax spell default"
+msgstr "นฝสธคฮ spell คฯธฝบ฿ default ควคน"
msgid "syntax iskeyword "
-msgstr "ฅทฅ๓ฅฟฅรฅฏฅนอั iskeyword "
+msgstr "นฝสธอั iskeyword "
-#: ../syntax.c:3299
#, c-format
msgid "E391: No such syntax cluster: %s"
msgstr "E391: คฝคฮค่คฆคสนฝสธฅฏฅ้ฅนฅฟคฯคขค๊คคปค๓: %s"
-#: ../syntax.c:3433
msgid "syncing on C-style comments"
msgstr "Cธภธ์ษ๗ฅณฅแฅ๓ฅศคซค้ฦฑดรๆ"
-#: ../syntax.c:3439
msgid "no syncing"
msgstr "ศ๓ฦฑด"
-#: ../syntax.c:3441
msgid "syncing starts "
msgstr "ฦฑดณซปฯ "
-#: ../syntax.c:3443 ../syntax.c:3506
msgid " lines before top line"
msgstr " นิมฐ(ฅศฅรฅืนิค่ค๊คโ)"
-#: ../syntax.c:3448
msgid ""
"\n"
"--- Syntax sync items ---"
@@ -5762,7 +5439,6 @@ msgstr ""
"\n"
"--- นฝสธฦฑดอืมว ---"
-#: ../syntax.c:3452
msgid ""
"\n"
"syncing on items"
@@ -5770,7 +5446,6 @@ msgstr ""
"\n"
"อืมวพๅควฦฑดรๆ"
-#: ../syntax.c:3457
msgid ""
"\n"
"--- Syntax items ---"
@@ -5778,53 +5453,41 @@ msgstr ""
"\n"
"--- นฝสธอืมว ---"
-#: ../syntax.c:3475
#, c-format
msgid "E392: No such syntax cluster: %s"
msgstr "E392: คฝคฮค่คฆคสนฝสธฅฏฅ้ฅนฅฟคฯคขค๊คคปค๓: %s"
-#: ../syntax.c:3497
msgid "minimal "
msgstr "minimal "
-#: ../syntax.c:3503
msgid "maximal "
msgstr "maximal "
-#: ../syntax.c:3513
msgid "; match "
msgstr "; ณบล๖ "
-#: ../syntax.c:3515
msgid " line breaks"
msgstr " ธฤคฮฒนิ"
-#: ../syntax.c:4076
msgid "E395: contains argument not accepted here"
msgstr "E395: คณคฮพ์ฝ๊ควคฯฐ๚ฟ๔containsคฯต๖ฒฤคตค์คฦคคคคปค๓"
-#: ../syntax.c:4096
msgid "E844: invalid cchar value"
msgstr "E844: ฬตธ๚คสccharคฮรอควคน"
-#: ../syntax.c:4107
msgid "E393: group[t]here not accepted here"
msgstr "E393: คณคณควคฯฅฐฅ๋กผฅืคฯต๖ฒฤคตค์คคปค๓"
-#: ../syntax.c:4126
#, c-format
msgid "E394: Didn't find region item for %s"
msgstr "E394: %s คฮศฯฐฯอืมวคฌธซคฤคซค๊คคปค๓"
-#: ../syntax.c:4188
msgid "E397: Filename required"
msgstr "E397: ฅีฅกฅคฅ๋ฬพคฌษฌอืควคน"
-#: ../syntax.c:4221
msgid "E847: Too many syntax includes"
msgstr "E847: นฝสธคฮผ่ค๊นค฿(include)คฌยฟฒแคฎคคน"
-#: ../syntax.c:4303
#, c-format
msgid "E789: Missing ']': %s"
msgstr "E789: ']' คฌคขค๊คคปค๓: %s"
@@ -5833,221 +5496,171 @@ msgstr "E789: ']' คฌคขค๊คคปค๓: %s"
msgid "E890: trailing char after ']': %s]%s"
msgstr "E890: ']' คฮธๅคํคหอพสฌคสสธป๚คฌคขค๊คคน: %s]%s"
-#: ../syntax.c:4531
#, c-format
msgid "E398: Missing '=': %s"
msgstr "E398: '=' คฌคขค๊คคปค๓: %s"
-#: ../syntax.c:4666
#, c-format
msgid "E399: Not enough arguments: syntax region %s"
msgstr "E399: ฐ๚ฟ๔คฌยญค๊คคปค๓: นฝสธศฯฐฯ %s"
-#: ../syntax.c:4870
msgid "E848: Too many syntax clusters"
msgstr "E848: นฝสธฅฏฅ้ฅนฅฟคฌยฟฒแคฎคคน"
-#: ../syntax.c:4954
msgid "E400: No cluster specified"
msgstr "E400: ฅฏฅ้ฅนฅฟคฌปุฤ๊คตค์คฦคคคคปค๓"
-#. end delimiter not found
-#: ../syntax.c:4986
#, c-format
msgid "E401: Pattern delimiter not found: %s"
msgstr "E401: ฅัฅฟกผฅ๓ถ่ภฺค๊คฌธซคฤคซค๊คคปค๓: %s"
-#: ../syntax.c:5049
#, c-format
msgid "E402: Garbage after pattern: %s"
msgstr "E402: ฅัฅฟกผฅ๓คฮคขคศคหฅดฅ฿คฌคขค๊คคน: %s"
-#: ../syntax.c:5120
msgid "E403: syntax sync: line continuations pattern specified twice"
msgstr "E403: นฝสธฦฑด: ฯขยณนิฅัฅฟกผฅ๓คฌ2ลูปุฤ๊คตค์คคทคฟ"
-#: ../syntax.c:5169
#, c-format
msgid "E404: Illegal arguments: %s"
msgstr "E404: ษิภตคสฐ๚ฟ๔ควคน: %s"
-#: ../syntax.c:5217
#, c-format
msgid "E405: Missing equal sign: %s"
msgstr "E405: ล๙นๆคฌคขค๊คคปค๓: %s"
-#: ../syntax.c:5222
#, c-format
msgid "E406: Empty argument: %s"
msgstr "E406: ถ๕คฮฐ๚ฟ๔: %s"
-#: ../syntax.c:5240
#, c-format
msgid "E407: %s not allowed here"
msgstr "E407: %s คฯฅณฅณควคฯต๖ฒฤคตค์คฦคคคคปค๓"
-#: ../syntax.c:5246
#, c-format
msgid "E408: %s must be first in contains list"
msgstr "E408: %s คฯฦโอฦฅ๊ฅนฅศคฮภ่ฦฌควคสคฑค์คะคสค้คสคค"
-#: ../syntax.c:5304
#, c-format
msgid "E409: Unknown group name: %s"
msgstr "E409: ฬครฮคฮฅฐฅ๋กผฅืฬพ: %s"
-#: ../syntax.c:5512
#, c-format
msgid "E410: Invalid :syntax subcommand: %s"
msgstr "E410: ฬตธ๚คส :syntax คฮฅตฅึฅณฅฅ๓ฅษ: %s"
-#: ../syntax.c:5854
msgid ""
" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
msgstr ""
" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
-#: ../syntax.c:6146
msgid "E679: recursive loop loading syncolor.vim"
msgstr "E679: syncolor.vim คฮบฦตขธฦคำฝะคทค๒ธกฝะคทคคทคฟ"
-#: ../syntax.c:6256
#, c-format
msgid "E411: highlight group not found: %s"
msgstr "E411: ฅฯฅคฅ้ฅคฅศฅฐฅ๋กผฅืคฌธซคฤคซค๊คคปค๓: %s"
-#: ../syntax.c:6278
#, c-format
msgid "E412: Not enough arguments: \":highlight link %s\""
msgstr "E412: ฐ๚ฟ๔คฌฝผสฌควคฯคสคค: \":highlight link %s\""
-#: ../syntax.c:6284
#, c-format
msgid "E413: Too many arguments: \":highlight link %s\""
msgstr "E413: ฐ๚ฟ๔คฌยฟฒแคฎคคน: \":highlight link %s\""
-#: ../syntax.c:6302
msgid "E414: group has settings, highlight link ignored"
msgstr "E414: ฅฐฅ๋กผฅืคฌภ฿ฤ๊คตค์คฦคคค๋คฮควฅฯฅคฅ้ฅคฅศฅ๊ฅ๓ฅฏคฯฬตป๋คตค์คคน"
-#: ../syntax.c:6367
#, c-format
msgid "E415: unexpected equal sign: %s"
msgstr "E415: อฝดคปคฬล๙นๆควคน: %s"
-#: ../syntax.c:6395
#, c-format
msgid "E416: missing equal sign: %s"
msgstr "E416: ล๙นๆคฌคขค๊คคปค๓: %s"
-#: ../syntax.c:6418
#, c-format
msgid "E417: missing argument: %s"
msgstr "E417: ฐ๚ฟ๔คฌคขค๊คคปค๓: %s"
-#: ../syntax.c:6446
#, c-format
msgid "E418: Illegal value: %s"
msgstr "E418: ษิภตคสรอควคน: %s"
-#: ../syntax.c:6496
msgid "E419: FG color unknown"
msgstr "E419: ฬครฮคฮมฐทสฟงควคน"
-#: ../syntax.c:6504
msgid "E420: BG color unknown"
msgstr "E420: ฬครฮคฮวุทสฟงควคน"
-#: ../syntax.c:6564
#, c-format
msgid "E421: Color name or number not recognized: %s"
msgstr "E421: ฅซฅ้กผฬพคไศึนๆค๒วงผฑควคญคคปค๓: %s"
-#: ../syntax.c:6714
#, c-format
msgid "E422: terminal code too long: %s"
msgstr "E422: ฝชรผฅณกผฅษคฌฤนฒแคฎคคน: %s"
-#: ../syntax.c:6753
#, c-format
msgid "E423: Illegal argument: %s"
msgstr "E423: ษิภตคสฐ๚ฟ๔ควคน: %s"
-#: ../syntax.c:6925
msgid "E424: Too many different highlighting attributes in use"
msgstr "E424: ยฟคฏคฮฐคสค๋ฅฯฅคฅ้ฅคฅศยฐภญคฌปศค๏ค์ฒแคฎคฦคคคคน"
-#: ../syntax.c:7427
msgid "E669: Unprintable character in group name"
msgstr "E669: ฅฐฅ๋กผฅืฬพคหฐ๕บษิฒฤวฝคสสธป๚คฌคขค๊คคน"
-#: ../syntax.c:7434
msgid "W18: Invalid character in group name"
msgstr "W18: ฅฐฅ๋กผฅืฬพคหษิภตคสสธป๚คฌคขค๊คคน"
-#: ../syntax.c:7448
msgid "E849: Too many highlight and syntax groups"
msgstr "E849: ฅฯฅคฅ้ฅคฅศคศนฝสธฅฐฅ๋กผฅืคฌยฟฒแคฎคคน"
-#: ../tag.c:104
msgid "E555: at bottom of tag stack"
msgstr "E555: ฅฟฅฐฅนฅฟฅรฅฏคฮห๖ศ๘ควคน"
-#: ../tag.c:105
msgid "E556: at top of tag stack"
msgstr "E556: ฅฟฅฐฅนฅฟฅรฅฏคฮภ่ฦฌควคน"
-#: ../tag.c:380
msgid "E425: Cannot go before first matching tag"
-msgstr "E425: บวฝ้คฮณบล๖ฅฟฅฐค๒ฤถคจคฦฬแค๋คณคศคฯควคญคคปค๓"
+msgstr "E425: บวฝ้คฮณบล๖ฅฟฅฐค๒ฑคจคฦฬแค๋คณคศคฯควคญคคปค๓"
-#: ../tag.c:504
#, c-format
msgid "E426: tag not found: %s"
msgstr "E426: ฅฟฅฐคฌธซคฤคซค๊คคปค๓: %s"
-#: ../tag.c:528
msgid " # pri kind tag"
msgstr " # pri kind tag"
-#: ../tag.c:531
msgid "file\n"
msgstr "ฅีฅกฅคฅ๋\n"
-#: ../tag.c:829
msgid "E427: There is only one matching tag"
msgstr "E427: ณบล๖ฅฟฅฐคฌ1คฤคภคฑคทคซคขค๊คคปค๓"
-#: ../tag.c:831
msgid "E428: Cannot go beyond last matching tag"
-msgstr "E428: บวธๅคหณบล๖คนค๋ฅฟฅฐค๒ฤถคจคฦฟสคเคณคศคฯควคญคคปค๓"
+msgstr "E428: บวธๅคฮณบล๖ฅฟฅฐค๒ฑคจคฦฟสคเคณคศคฯควคญคคปค๓"
-#: ../tag.c:850
#, c-format
msgid "File \"%s\" does not exist"
msgstr "ฅีฅกฅคฅ๋ \"%s\" คฌคขค๊คคปค๓"
-#. Give an indication of the number of matching tags
-#: ../tag.c:859
#, c-format
msgid "tag %d of %d%s"
msgstr "ฅฟฅฐ %d (มด%d%s)"
-#: ../tag.c:862
msgid " or more"
msgstr " คซคฝค์ฐสพๅ"
-#: ../tag.c:864
msgid " Using tag with different case!"
msgstr " ฅฟฅฐค๒ฐคสค๋caseควปศอัคทคคน!"
-#: ../tag.c:909
#, c-format
msgid "E429: File \"%s\" does not exist"
msgstr "E429: ฅีฅกฅคฅ๋ \"%s\" คฌคขค๊คคปค๓"
-#. Highlight title
-#: ../tag.c:960
msgid ""
"\n"
" # TO tag FROM line in file/text"
@@ -6055,79 +5668,64 @@ msgstr ""
"\n"
" # TO ฅฟฅฐ FROM นิ in file/text"
-#: ../tag.c:1303
#, c-format
msgid "Searching tags file %s"
msgstr "ฅฟฅฐฅีฅกฅคฅ๋ %s ค๒ธกบ๗รๆ"
-#: ../tag.c:1545
+#, c-format
+msgid "E430: Tag file path truncated for %s\n"
+msgstr "E430: ฅฟฅฐฅีฅกฅคฅ๋คฮฅัฅนคฌ %s คหภฺค๊ผฮคฦค้ค์คคทคฟ\n"
+
msgid "Ignoring long line in tags file"
msgstr "ฅฟฅฐฅีฅกฅคฅ๋ฦโคฮฤนคคนิค๒ฬตป๋คทคคน"
-#: ../tag.c:1915
#, c-format
msgid "E431: Format error in tags file \"%s\""
msgstr "E431: ฅฟฅฐฅีฅกฅคฅ๋ \"%s\" คฮฅีฅฉกผฅฅรฅศคหฅจฅ้กผคฌคขค๊คคน"
-#: ../tag.c:1917
#, c-format
-msgid "Before byte %<PRId64>"
-msgstr "ฤพมฐคฮ %<PRId64> ฅะฅคฅศ"
+msgid "Before byte %ld"
+msgstr "ฤพมฐคฮ %ld ฅะฅคฅศ"
-#: ../tag.c:1929
#, c-format
msgid "E432: Tags file not sorted: %s"
msgstr "E432: ฅฟฅฐฅีฅกฅคฅ๋คฌฅฝกผฅศคตค์คฦคคคคปค๓: %s"
-#. never opened any tags file
-#: ../tag.c:1960
msgid "E433: No tags file"
msgstr "E433: ฅฟฅฐฅีฅกฅคฅ๋คฌคขค๊คคปค๓"
-#: ../tag.c:2536
msgid "E434: Can't find tag pattern"
msgstr "E434: ฅฟฅฐฅัฅฟกผฅ๓ค๒ธซคฤคฑค้ค์คคปค๓"
-#: ../tag.c:2544
msgid "E435: Couldn't find tag, just guessing!"
msgstr "E435: ฅฟฅฐค๒ธซคฤคฑค้ค์คสคคคฮควรฑคหฟไยฌคทคคน!"
-#: ../tag.c:2797
#, c-format
msgid "Duplicate field name: %s"
msgstr "ฝลสฃคทคฟฅีฅฃกผฅ๋ฅษฬพ: %s"
-#: ../term.c:1442
msgid "' not known. Available builtin terminals are:"
msgstr "' คฯฬครฮควคน. ธฝนิคฮมศค฿นค฿รผห๖คฯผกคฮคศคชค๊ควคน:"
-#: ../term.c:1463
msgid "defaulting to '"
msgstr "พสฮฌรอค๒ผกคฮค่คฆคหภ฿ฤ๊คทคคน '"
-#: ../term.c:1731
msgid "E557: Cannot open termcap file"
msgstr "E557: termcapฅีฅกฅคฅ๋ค๒ณซคฑคคปค๓"
-#: ../term.c:1735
msgid "E558: Terminal entry not found in terminfo"
msgstr "E558: terminfoคหรผห๖ฅจฅ๓ฅศฅ๊ค๒ธซคฤคฑค้ค์คคปค๓"
-#: ../term.c:1737
msgid "E559: Terminal entry not found in termcap"
msgstr "E559: termcapคหรผห๖ฅจฅ๓ฅศฅ๊ค๒ธซคฤคฑค้ค์คคปค๓"
-#: ../term.c:1878
#, c-format
msgid "E436: No \"%s\" entry in termcap"
msgstr "E436: termcapคห \"%s\" คฮฅจฅ๓ฅศฅ๊คฌคขค๊คคปค๓"
-#: ../term.c:2249
msgid "E437: terminal capability \"cm\" required"
msgstr "E437: รผห๖คห \"cm\" ตกวฝคฌษฌอืควคน"
-#. Highlight title
-#: ../term.c:4376
msgid ""
"\n"
"--- Terminal keys ---"
@@ -6135,168 +5733,363 @@ msgstr ""
"\n"
"--- รผห๖ฅญกผ ---"
-#: ../ui.c:481
+msgid "Cannot open $VIMRUNTIME/rgb.txt"
+msgstr "$VIMRUNTIME/rgb.txtค๒ณซคฑคคปค๓"
+
+#, c-format
+msgid "Kill job in \"%s\"?"
+msgstr "\"%s\" ฦโคฮฅธฅ็ฅึค๒ฝชฮปคทคคนคซ?"
+
+msgid "Terminal"
+msgstr "รผห๖"
+
+msgid "Terminal-finished"
+msgstr "รผห๖ (ฝชฮป)"
+
+msgid "active"
+msgstr "ฅขฅฏฅฦฅฃฅึ"
+
+msgid "running"
+msgstr "ผยนิรๆ"
+
+msgid "finished"
+msgstr "ฝชฮป"
+
+#, c-format
+msgid "E953: File exists: %s"
+msgstr "E953: ฅีฅกฅคฅ๋คฯด๛คหยธบ฿คทคคน: %s"
+
+msgid "E955: Not a terminal buffer"
+msgstr "E955: รผห๖ฅะฅรฅีฅกควคฯคขค๊คคปค๓"
+
+msgid "new shell started\n"
+msgstr "ฟทคทคคฅทฅงฅ๋ค๒ตฏฦฐคทคคน\n"
+
msgid "Vim: Error reading input, exiting...\n"
msgstr "Vim: ฦฮฯค๒ฦษนค฿รๆคฮฅจฅ้กผคหค่ค๊ฝชฮปคทคคน...\n"
-#. This happens when the FileChangedRO autocommand changes the
-#. * file in a way it becomes shorter.
-#: ../undo.c:379
+msgid "Used CUT_BUFFER0 instead of empty selection"
+msgstr "ถ๕คฮมชย๒ฮฮฐ่คฮคซค๏ค๊คหCUT_BUFFER0คฌปศอัคตค์คคทคฟ"
+
msgid "E881: Line count changed unexpectedly"
msgstr "E881: อฝดคปคบนิฅซฅฆฅ๓ฅศคฌสัค๏ค๊คคทคฟ"
-#: ../undo.c:627
+msgid "No undo possible; continue anyway"
+msgstr "ฒฤวฝคสฅขฅ๓ฅษฅฅคฯคขค๊คคปค๓: คศค๊คขคจคบยณคฑคคน"
+
#, c-format
msgid "E828: Cannot open undo file for writing: %s"
msgstr "E828: ฝ๑นค฿อัคหฅขฅ๓ฅษฅฅฅีฅกฅคฅ๋ค๒ณซคฑคคปค๓: %s"
-#: ../undo.c:717
#, c-format
msgid "E825: Corrupted undo file (%s): %s"
msgstr "E825: ฅขฅ๓ฅษฅฅฅีฅกฅคฅ๋คฌฒ๕ค์คฦคคคคน (%s): %s"
-#: ../undo.c:1039
msgid "Cannot write undo file in any directory in 'undodir'"
msgstr "'undodir'คฮฅวฅฃฅ์ฅฏฅศฅ๊คหฅขฅ๓ฅษฅฅฅีฅกฅคฅ๋ค๒ฝ๑คญนคแคคปค๓"
-#: ../undo.c:1074
#, c-format
msgid "Will not overwrite with undo file, cannot read: %s"
msgstr "ฅขฅ๓ฅษฅฅฅีฅกฅคฅ๋คศคทคฦฦษค฿นคแคสคคคฮควพๅฝ๑คญคทคคปค๓: %s"
-#: ../undo.c:1092
#, c-format
msgid "Will not overwrite, this is not an undo file: %s"
msgstr "ฅขฅ๓ฅษฅฅฅีฅกฅคฅ๋ควคฯคสคคคฮควพๅฝ๑คญคทคคปค๓: %s"
-#: ../undo.c:1108
msgid "Skipping undo file write, nothing to undo"
msgstr "ยะพคฌคสคคคฮควฅขฅ๓ฅษฅฅฅีฅกฅคฅ๋คฮฝ๑คญนค฿ค๒ฅนฅญฅรฅืคทคคน"
-#: ../undo.c:1121
#, c-format
msgid "Writing undo file: %s"
msgstr "ฅขฅ๓ฅษฅฅฅีฅกฅคฅ๋ฝ๑คญนค฿รๆ: %s"
-#: ../undo.c:1213
#, c-format
msgid "E829: write error in undo file: %s"
msgstr "E829: ฅขฅ๓ฅษฅฅฅีฅกฅคฅ๋คฮฝ๑คญนค฿ฅจฅ้กผควคน: %s"
-#: ../undo.c:1280
#, c-format
msgid "Not reading undo file, owner differs: %s"
msgstr "ฅชกผฅสกผคฌฐคสค๋คฮควฅขฅ๓ฅษฅฅฅีฅกฅคฅ๋ค๒ฦษค฿นค฿คคปค๓: %s"
-#: ../undo.c:1292
#, c-format
msgid "Reading undo file: %s"
msgstr "ฅขฅ๓ฅษฅฅฅีฅกฅคฅ๋ฦษนรๆ: %s"
-#: ../undo.c:1299
#, c-format
msgid "E822: Cannot open undo file for reading: %s"
msgstr "E822: ฅขฅ๓ฅษฅฅฅีฅกฅคฅ๋ค๒ฦษนอัคศคทคฦณซคฑคคปค๓: %s"
-#: ../undo.c:1308
#, c-format
msgid "E823: Not an undo file: %s"
msgstr "E823: ฅขฅ๓ฅษฅฅฅีฅกฅคฅ๋ควคฯคขค๊คคปค๓: %s"
-#: ../undo.c:1313
+#, c-format
+msgid "E832: Non-encrypted file has encrypted undo file: %s"
+msgstr "E832: ศ๓ฐลนๆฒฝฅีฅกฅคฅ๋คฌฐลนๆฒฝคตค์คฟฅขฅ๓ฅษฅฅฅีฅกฅคฅ๋ค๒ปศครคฦคคน: %s"
+
+#, c-format
+msgid "E826: Undo file decryption failed: %s"
+msgstr "E826: ฐลนๆฒฝคตค์คฟฅขฅ๓ฅษฅฅฅีฅกฅคฅ๋คฮฒ๒ฦษคหผบวิคทคคทคฟ: %s"
+
+#, c-format
+msgid "E827: Undo file is encrypted: %s"
+msgstr "E827: ฅขฅ๓ฅษฅฅฅีฅกฅคฅ๋คฌฐลนๆฒฝคตค์คฦคคคคน: %s"
+
#, c-format
msgid "E824: Incompatible undo file: %s"
msgstr "E824: ธ฿ดนภญคฮฬตคคฅขฅ๓ฅษฅฅฅีฅกฅคฅ๋ควคน: %s"
-#: ../undo.c:1328
msgid "File contents changed, cannot use undo info"
msgstr "ฅีฅกฅคฅ๋คฮฦโอฦคฌสัค๏ครคฦคคค๋คฟคแกขฅขฅ๓ฅษฅฅพ๐ส๓ค๒อ๘อัควคญคคปค๓"
-#: ../undo.c:1497
#, c-format
msgid "Finished reading undo file %s"
msgstr "ฅขฅ๓ฅษฅฅฅีฅกฅคฅ๋ %s คฮผ่นค๒ดฐฮป"
-#: ../undo.c:1586 ../undo.c:1812
msgid "Already at oldest change"
msgstr "ด๛คหฐ์ศึธลคคสันนควคน"
-#: ../undo.c:1597 ../undo.c:1814
msgid "Already at newest change"
msgstr "ด๛คหฐ์ศึฟทคทคคสันนควคน"
-#: ../undo.c:1806
#, c-format
-msgid "E830: Undo number %<PRId64> not found"
-msgstr "E830: ฅขฅ๓ฅษฅฅศึนๆ %<PRId64> คฯธซคฤคซค๊คคปค๓"
+msgid "E830: Undo number %ld not found"
+msgstr "E830: ฅขฅ๓ฅษฅฅศึนๆ %ld คฯธซคฤคซค๊คคปค๓"
-#: ../undo.c:1979
msgid "E438: u_undo: line numbers wrong"
msgstr "E438: u_undo: นิศึนๆคฌดึฐใครคฦคคคคน"
-#: ../undo.c:2183
msgid "more line"
msgstr "นิ ฤษฒรคทคคทคฟ"
-#: ../undo.c:2185
msgid "more lines"
msgstr "นิ ฤษฒรคทคคทคฟ"
-#: ../undo.c:2187
msgid "line less"
msgstr "นิ บ๏ฝคทคคทคฟ"
-#: ../undo.c:2189
msgid "fewer lines"
msgstr "นิ บ๏ฝคทคคทคฟ"
-#: ../undo.c:2193
msgid "change"
msgstr "ฒีฝ๊สันนคทคคทคฟ"
-#: ../undo.c:2195
msgid "changes"
msgstr "ฒีฝ๊สันนคทคคทคฟ"
-#: ../undo.c:2225
#, c-format
-msgid "%<PRId64> %s; %s #%<PRId64> %s"
-msgstr "%<PRId64> %s; %s #%<PRId64> %s"
+msgid "%ld %s; %s #%ld %s"
+msgstr "%ld %s; %s #%ld %s"
-#: ../undo.c:2228
msgid "before"
msgstr "มฐส"
-#: ../undo.c:2228
msgid "after"
msgstr "ธๅส"
-#: ../undo.c:2325
msgid "Nothing to undo"
msgstr "ฅขฅ๓ฅษฅฅยะพคฌคขค๊คคปค๓"
-#: ../undo.c:2330
msgid "number changes when saved"
msgstr "ฤฬศึ สันนฟ๔ สันนปด สยธบั"
-#: ../undo.c:2360
#, c-format
-msgid "%<PRId64> seconds ago"
-msgstr "%<PRId64> ษรทะฒแคทคฦคคคคน"
+msgid "%ld seconds ago"
+msgstr "%ld ษรทะฒแคทคฦคคคคน"
-#: ../undo.c:2372
msgid "E790: undojoin is not allowed after undo"
msgstr "E790: undo คฮฤพธๅคห undojoin คฯควคญคคปค๓"
-#: ../undo.c:2466
msgid "E439: undo list corrupt"
msgstr "E439: ฅขฅ๓ฅษฅฅฅ๊ฅนฅศคฌฒ๕ค์คฦคคคคน"
-#: ../undo.c:2495
msgid "E440: undo line missing"
msgstr "E440: ฅขฅ๓ฅษฅฅนิคฌคขค๊คคปค๓"
-#: ../version.c:600
+#, c-format
+msgid "E122: Function %s already exists, add ! to replace it"
+msgstr "E122: ดุฟ๔ %s คฯฤ๊ตมบัควคนกขบฦฤ๊ตมคนค๋คหคฯ ! ค๒ฤษฒรคทคฦคฏคภคตคค"
+
+msgid "E717: Dictionary entry already exists"
+msgstr "E717: ผญฝ๑ทฟฦโคหฅจฅ๓ฅศฅ๊คฌด๛คหยธบ฿คทคคน"
+
+msgid "E718: Funcref required"
+msgstr "E718: ดุฟ๔ปฒพศทฟคฌอืตแคตค์คคน"
+
+#, c-format
+msgid "E130: Unknown function: %s"
+msgstr "E130: ฬครฮคฮดุฟ๔ควคน: %s"
+
+#, c-format
+msgid "E125: Illegal argument: %s"
+msgstr "E125: ษิภตคสฐ๚ฟ๔ควคน: %s"
+
+#, c-format
+msgid "E853: Duplicate argument name: %s"
+msgstr "E853: ฐ๚ฟ๔ฬพคฌฝลสฃคทคฦคคคคน: %s"
+
+#, c-format
+msgid "E740: Too many arguments for function %s"
+msgstr "E740: ดุฟ๔คฮฐ๚ฟ๔คฌยฟฒแคฎคคน: %s"
+
+#, c-format
+msgid "E116: Invalid arguments for function %s"
+msgstr "E116: ดุฟ๔คฮฬตธ๚คสฐ๚ฟ๔ควคน: %s"
+
+msgid "E132: Function call depth is higher than 'maxfuncdepth'"
+msgstr "E132: ดุฟ๔ธฦฝะคฮฦค์ปาฟ๔คฌ 'maxfuncdepth' ค๒ฤถคจคคทคฟ"
+
+#, c-format
+msgid "calling %s"
+msgstr "%s ค๒ผยนิรๆควคน"
+
+#, c-format
+msgid "%s aborted"
+msgstr "%s คฌรๆรวคตค์คคทคฟ"
+
+#, c-format
+msgid "%s returning #%ld"
+msgstr "%s คฌ #%ld ค๒สึคทคคทคฟ"
+
+#, c-format
+msgid "%s returning %s"
+msgstr "%s คฌ %s ค๒สึคทคคทคฟ"
+
+msgid "E699: Too many arguments"
+msgstr "E699: ฐ๚ฟ๔คฌยฟฒแคฎคคน"
+
+#, c-format
+msgid "E117: Unknown function: %s"
+msgstr "E117: ฬครฮคฮดุฟ๔ควคน: %s"
+
+#, c-format
+msgid "E933: Function was deleted: %s"
+msgstr "E933: ดุฟ๔คฯบ๏ฝคตค์คคทคฟ: %s"
+
+#, c-format
+msgid "E119: Not enough arguments for function: %s"
+msgstr "E119: ดุฟ๔คฮฐ๚ฟ๔คฌยญค๊คคปค๓: %s"
+
+#, c-format
+msgid "E120: Using <SID> not in a script context: %s"
+msgstr "E120: ฅนฅฏฅ๊ฅืฅศฐสณฐคว<SID>คฌปศค๏ค์คคทคฟ: %s"
+
+#, c-format
+msgid "E725: Calling dict function without Dictionary: %s"
+msgstr "E725: ผญฝ๑อัดุฟ๔คฌธฦคะค์คคทคฟคฌผญฝ๑คฌคขค๊คคปค๓: %s"
+
+msgid "E129: Function name required"
+msgstr "E129: ดุฟ๔ฬพคฌอืตแคตค์คคน"
+
+#, c-format
+msgid "E128: Function name must start with a capital or \"s:\": %s"
+msgstr "E128: ดุฟ๔ฬพคฯย็สธป๚คซ \"s:\" ควปฯคค้คสคฑค์คะคสค๊คคปค๓: %s"
+
+#, c-format
+msgid "E884: Function name cannot contain a colon: %s"
+msgstr "E884: ดุฟ๔ฬพคหคฯฅณฅํฅ๓คฯดคแค้ค์คคปค๓: %s"
+
+#, c-format
+msgid "E123: Undefined function: %s"
+msgstr "E123: ฬคฤ๊ตมคฮดุฟ๔ควคน: %s"
+
+#, c-format
+msgid "E124: Missing '(': %s"
+msgstr "E124: '(' คฌคขค๊คคปค๓: %s"
+
+msgid "E862: Cannot use g: here"
+msgstr "E862: คณคณควคฯ g: คฯปศคจคคปค๓"
+
+#, c-format
+msgid "E932: Closure function should not be at top level: %s"
+msgstr "E932: ฅฏฅํกผฅธฅใกผดุฟ๔คฯฅศฅรฅืฅ์ฅูฅ๋คหตญฝาควคญคคปค๓: %s"
+
+msgid "E126: Missing :endfunction"
+msgstr "E126: :endfunction คฌคขค๊คคปค๓"
+
+#, c-format
+msgid "W22: Text found after :endfunction: %s"
+msgstr "W22: :endfunction คฮธๅคหสธป๚คฌคขค๊คคน: %s"
+
+#, c-format
+msgid "E707: Function name conflicts with variable: %s"
+msgstr "E707: ดุฟ๔ฬพคฌสัฟ๔ฬพคศพืฦอคทคคน: %s"
+
+#, c-format
+msgid "E127: Cannot redefine function %s: It is in use"
+msgstr "E127: ดุฟ๔ %s ค๒บฦฤ๊ตมควคญคคปค๓: ปศอัรๆควคน"
+
+#, c-format
+msgid "E746: Function name does not match script file name: %s"
+msgstr "E746: ดุฟ๔ฬพคฌฅนฅฏฅ๊ฅืฅศคฮฅีฅกฅคฅ๋ฬพคศฐ์รืคทคคปค๓: %s"
+
+#, c-format
+msgid "E131: Cannot delete function %s: It is in use"
+msgstr "E131: ดุฟ๔ %s ค๒บ๏ฝควคญคคปค๓: ปศอัรๆควคน"
+
+msgid "E133: :return not inside a function"
+msgstr "E133: ดุฟ๔ณฐคห :return คฌคขค๊คคทคฟ"
+
+#, c-format
+msgid "E107: Missing parentheses: %s"
+msgstr "E107: ฅซฅรฅณ '(' คฌคขค๊คคปค๓: %s"
+
+#, c-format
+msgid "%s (%s, compiled %s)"
+msgstr "%s (%s, compiled %s)"
+
+msgid ""
+"\n"
+"MS-Windows 64-bit GUI version"
+msgstr ""
+"\n"
+"MS-Windows 64 ฅำฅรฅศ GUI ศว"
+
+msgid ""
+"\n"
+"MS-Windows 32-bit GUI version"
+msgstr ""
+"\n"
+"MS-Windows 32 ฅำฅรฅศ GUI ศว"
+
+msgid " with OLE support"
+msgstr " with OLE ฅตฅกผฅศ"
+
+msgid ""
+"\n"
+"MS-Windows 64-bit console version"
+msgstr ""
+"\n"
+"MS-Windows 64 ฅำฅรฅศ ฅณฅ๓ฅฝกผฅ๋ ศว"
+
+msgid ""
+"\n"
+"MS-Windows 32-bit console version"
+msgstr ""
+"\n"
+"MS-Windows 32 ฅำฅรฅศ ฅณฅ๓ฅฝกผฅ๋ ศว"
+
+msgid ""
+"\n"
+"macOS version"
+msgstr ""
+"\n"
+"macOS ศว"
+
+msgid ""
+"\n"
+"macOS version w/o darwin feat."
+msgstr ""
+"\n"
+"macOS ศว (darwin ฬตคท)"
+
+msgid ""
+"\n"
+"OpenVMS version"
+msgstr ""
+"\n"
+"OpenVMS ศว"
+
msgid ""
"\n"
"Included patches: "
@@ -6304,7 +6097,6 @@ msgstr ""
"\n"
"ลฌอับัฅัฅรฅม: "
-#: ../version.c:627
msgid ""
"\n"
"Extra patches: "
@@ -6312,11 +6104,9 @@ msgstr ""
"\n"
"ฤษฒรณศฤฅฅัฅรฅม: "
-#: ../version.c:639 ../version.c:864
msgid "Modified by "
msgstr "Modified by "
-#: ../version.c:646
msgid ""
"\n"
"Compiled "
@@ -6324,11 +6114,9 @@ msgstr ""
"\n"
"Compiled "
-#: ../version.c:649
msgid "by "
msgstr "by "
-#: ../version.c:660
msgid ""
"\n"
"Huge version "
@@ -6336,1886 +6124,950 @@ msgstr ""
"\n"
"Huge ศว "
-#: ../version.c:661
+msgid ""
+"\n"
+"Big version "
+msgstr ""
+"\n"
+"Big ศว "
+
+msgid ""
+"\n"
+"Normal version "
+msgstr ""
+"\n"
+"ฤฬพ๏ ศว "
+
+msgid ""
+"\n"
+"Small version "
+msgstr ""
+"\n"
+"Small ศว "
+
+msgid ""
+"\n"
+"Tiny version "
+msgstr ""
+"\n"
+"Tiny ศว "
+
msgid "without GUI."
msgstr "without GUI."
-#: ../version.c:662
+msgid "with GTK3 GUI."
+msgstr "with GTK3 GUI."
+
+msgid "with GTK2-GNOME GUI."
+msgstr "with GTK2-GNOME GUI."
+
+msgid "with GTK2 GUI."
+msgstr "with GTK2 GUI."
+
+msgid "with X11-Motif GUI."
+msgstr "with X11-Motif GUI."
+
+msgid "with X11-neXtaw GUI."
+msgstr "with X11-neXtaw GUI."
+
+msgid "with X11-Athena GUI."
+msgstr "with X11-Athena GUI."
+
+msgid "with Photon GUI."
+msgstr "with Photon GUI."
+
+msgid "with GUI."
+msgstr "with GUI."
+
+msgid "with Carbon GUI."
+msgstr "with Carbon GUI."
+
+msgid "with Cocoa GUI."
+msgstr "with Cocoa GUI."
+
msgid " Features included (+) or not (-):\n"
msgstr " ตกวฝคฮฐ์อ๗ อญธ๚(+)/ฬตธ๚(-)\n"
-#: ../version.c:667
msgid " system vimrc file: \""
msgstr " ฅทฅนฅฦฅเ vimrc: \""
-#: ../version.c:672
msgid " user vimrc file: \""
msgstr " ฅๆกผฅถกผ vimrc: \""
-#: ../version.c:677
msgid " 2nd user vimrc file: \""
msgstr " ย่2ฅๆกผฅถกผ vimrc: \""
-#: ../version.c:682
msgid " 3rd user vimrc file: \""
msgstr " ย่3ฅๆกผฅถกผ vimrc: \""
-#: ../version.c:687
msgid " user exrc file: \""
msgstr " ฅๆกผฅถกผ exrc: \""
-#: ../version.c:692
msgid " 2nd user exrc file: \""
msgstr " ย่2ฅๆกผฅถกผ exrc: \""
-#: ../version.c:699
+msgid " system gvimrc file: \""
+msgstr " ฅทฅนฅฦฅเ gvimrc: \""
+
+msgid " user gvimrc file: \""
+msgstr " ฅๆกผฅถกผ gvimrc: \""
+
+msgid "2nd user gvimrc file: \""
+msgstr " ย่2ฅๆกผฅถกผ gvimrc: \""
+
+msgid "3rd user gvimrc file: \""
+msgstr " ย่3ฅๆกผฅถกผ gvimrc: \""
+
+msgid " defaults file: \""
+msgstr " ฅวฅีฅฉฅ๋ฅศฅีฅกฅคฅ๋: \""
+
+msgid " system menu file: \""
+msgstr " ฅทฅนฅฦฅเฅแฅหฅๅกผ: \""
+
msgid " fall-back for $VIM: \""
msgstr " พสฮฌปคฮ $VIM: \""
-#: ../version.c:705
msgid " f-b for $VIMRUNTIME: \""
msgstr "พสฮฌปคฮ $VIMRUNTIME: \""
-#: ../version.c:709
msgid "Compilation: "
msgstr "ฅณฅ๓ฅัฅคฅ๋: "
-#: ../version.c:712
+msgid "Compiler: "
+msgstr "ฅณฅ๓ฅัฅคฅ้: "
+
msgid "Linking: "
msgstr "ฅ๊ฅ๓ฅฏ: "
-#: ../version.c:717
msgid " DEBUG BUILD"
msgstr "ฅวฅะฅรฅฐฅำฅ๋ฅษ"
-#: ../version.c:767
msgid "VIM - Vi IMproved"
msgstr "VIM - Vi IMproved"
-#: ../version.c:769
msgid "version "
msgstr "version "
-#: ../version.c:770
msgid "by Bram Moolenaar et al."
msgstr "by Bram Moolenaar ยพ."
-#: ../version.c:774
msgid "Vim is open source and freely distributable"
msgstr "Vim คฯฅชกผฅืฅ๓ฅฝกผฅนควคขค๊ผซอณคหวษฒฤวฝควคน"
-#: ../version.c:776
msgid "Help poor children in Uganda!"
msgstr "ฅฆฅฌฅ๓ฅภคฮทรคค์คสคคปาถกคฟคมคหฑ็ฝ๕ค๒!"
-#: ../version.c:777
msgid "type :help iccf<Enter> for information "
msgstr "พบูคสพ๐ส๓คฯ :help iccf<Enter> "
-#: ../version.c:779
msgid "type :q<Enter> to exit "
msgstr "ฝชฮปคนค๋คหคฯ :q<Enter> "
-#: ../version.c:780
msgid "type :help<Enter> or <F1> for on-line help"
msgstr "ฅชฅ๓ฅ้ฅคฅ๓ฅุฅ๋ฅืคฯ :help<Enter> คซ <F1> "
-#: ../version.c:781
-msgid "type :help version7<Enter> for version info"
-msgstr "ฅะกผฅธฅ็ฅ๓พ๐ส๓คฯ :help version7<Enter> "
+msgid "type :help version8<Enter> for version info"
+msgstr "ฅะกผฅธฅ็ฅ๓พ๐ส๓คฯ :help version8<Enter> "
-#: ../version.c:784
msgid "Running in Vi compatible mode"
msgstr "Viธ฿ดนฅโกผฅษควฦฐบ๎รๆ"
-#: ../version.c:785
msgid "type :set nocp<Enter> for Vim defaults"
msgstr "Vimฟไพฉรอคหคนค๋คหคฯ :set nocp<Enter> "
-#: ../version.c:786
msgid "type :help cp-default<Enter> for info on this"
msgstr "พบูคสพ๐ส๓คฯ :help cp-default<Enter>"
-#: ../version.c:827
+msgid "menu Help->Orphans for information "
+msgstr "พบูคฯฅแฅหฅๅกผคฮ ฅุฅ๋ฅื->ธษป๙ ค๒ปฒพศคทคฦฒผคตคค "
+
+msgid "Running modeless, typed text is inserted"
+msgstr "ฅโกผฅษฬตควผยนิรๆกฃฅฟฅคฅืคทคฟสธป๚คฌมฦคตค์คคน"
+
+msgid "menu Edit->Global Settings->Toggle Insert Mode "
+msgstr "ฅแฅหฅๅกผคฮ สิฝธ->มดยฮภ฿ฤ๊->มฦ(ฝ้ฟดผิ)ฅโกผฅษภฺยุ "
+
+msgid " for two modes "
+msgstr " ควฅโกผฅษอญคห "
+
+msgid "menu Edit->Global Settings->Toggle Vi Compatible"
+msgstr "ฅแฅหฅๅกผคฮ สิฝธ->มดยฮภ฿ฤ๊->Viธ฿ดนฅโกผฅษภฺยุ "
+
+msgid " for Vim defaults "
+msgstr " ควVimคศคทคฦฦฐบ๎ "
+
msgid "Sponsor Vim development!"
msgstr "Vimคฮณซศฏค๒ฑฑ็คทคฦคฏคภคตคค!"
-#: ../version.c:828
msgid "Become a registered Vim user!"
msgstr "Vimคฮละฯฟฅๆกผฅถกผคหคสครคฦคฏคภคตคค!"
-#: ../version.c:831
msgid "type :help sponsor<Enter> for information "
msgstr "พบูคสพ๐ส๓คฯ :help sponsor<Enter> "
-#: ../version.c:832
msgid "type :help register<Enter> for information "
msgstr "พบูคสพ๐ส๓คฯ :help register<Enter> "
-#: ../version.c:834
msgid "menu Help->Sponsor/Register for information "
msgstr "พบูคฯฅแฅหฅๅกผคฮ ฅุฅ๋ฅื->ฅนฅฅ๓ฅตกผ/ละฯฟ ค๒ปฒพศคทคฦฒผคตคค"
-#: ../window.c:119
msgid "Already only one window"
msgstr "ด๛คหฅฆฅฃฅ๓ฅษฅฆคฯ1คฤคทคซคขค๊คคปค๓"
-#: ../window.c:224
msgid "E441: There is no preview window"
msgstr "E441: ฅืฅ์ฅำฅๅกผฅฆฅฃฅ๓ฅษฅฆคฌคขค๊คคปค๓"
-#: ../window.c:559
msgid "E442: Can't split topleft and botright at the same time"
msgstr "E442: บธพๅคศฑฆฒผค๒ฦฑปคหสฌณไคนค๋คณคศคฯควคญคคปค๓"
-#: ../window.c:1228
msgid "E443: Cannot rotate when another window is split"
msgstr "E443: ยพคฮฅฆฅฃฅ๓ฅษฅฆคฌสฌณไคตค์คฦคคค๋ปคหคฯฝ็ฒ๓ควคญคคปค๓"
-#: ../window.c:1803
msgid "E444: Cannot close last window"
msgstr "E444: บวธๅคฮฅฆฅฃฅ๓ฅษฅฆค๒สฤคธค๋คณคศคฯควคญคคปค๓"
-#: ../window.c:1810
msgid "E813: Cannot close autocmd window"
msgstr "E813: autocmdฅฆฅฃฅ๓ฅษฅฆคฯสฤคธค้ค์คคปค๓"
-#: ../window.c:1814
msgid "E814: Cannot close window, only autocmd window would remain"
msgstr "E814: autocmdฅฆฅฃฅ๓ฅษฅฆคทคซปฤค้คสคคคฟคแกขฅฆฅฃฅ๓ฅษฅฆคฯสฤคธค้ค์คคปค๓"
-#: ../window.c:2717
msgid "E445: Other window contains changes"
msgstr "E445: ยพคฮฅฆฅฃฅ๓ฅษฅฆคหคฯสันนคฌคขค๊คคน"
-#: ../window.c:4805
msgid "E446: No file name under cursor"
msgstr "E446: ฅซกผฅฝฅ๋คฮฒผคหฅีฅกฅคฅ๋ฬพคฌคขค๊คคปค๓"
-msgid "List or number required"
-msgstr "ฅ๊ฅนฅศคซฟ๔รอคฌษฌอืควคน"
-
-#~ msgid "E831: bf_key_init() called with empty password"
-#~ msgstr "E831: bf_key_init() คฌถ๕ฅัฅนฅ๏กผฅษควธฦคำฝะคตค์คคทคฟ"
-
-#~ msgid "E820: sizeof(uint32_t) != 4"
-#~ msgstr "E820: sizeof(uint32_t) != 4"
-
-#~ msgid "E817: Blowfish big/little endian use wrong"
-#~ msgstr "E817: Blowfishฐลนๆคฮฅำฅรฅฐ/ฅ๊ฅศฅ๋ฅจฅ๓ฅวฅฃฅขฅ๓คฌดึฐใครคฦคคคคน"
-
-#~ msgid "E818: sha256 test failed"
-#~ msgstr "E818: sha256คฮฅฦฅนฅศคหผบวิคทคคทคฟ"
-
-#~ msgid "E819: Blowfish test failed"
-#~ msgstr "E819: Blowfishฐลนๆคฮฅฦฅนฅศคหผบวิคทคคทคฟ"
-
-#~ msgid "Patch file"
-#~ msgstr "ฅัฅรฅมฅีฅกฅคฅ๋"
-
-#~ msgid ""
-#~ "&OK\n"
-#~ "&Cancel"
-#~ msgstr ""
-#~ "ท่ฤ๊(&O)\n"
-#~ "ฅญฅใฅ๓ฅปฅ๋(&C)"
-
-#~ msgid "E240: No connection to Vim server"
-#~ msgstr "E240: Vim ฅตกผฅะคุคฮภยณคฌคขค๊คคปค๓"
-
-#~ msgid "E241: Unable to send to %s"
-#~ msgstr "E241: %s คุม๗ค๋คณคศคฌควคญคคปค๓"
-
-#~ msgid "E277: Unable to read a server reply"
-#~ msgstr "E277: ฅตกผฅะคฮฑล๚คฌคขค๊คคปค๓"
-
-#~ msgid "E258: Unable to send to client"
-#~ msgstr "E258: ฅฏฅ้ฅคฅขฅ๓ฅศคุม๗ค๋คณคศคฌควคญคคปค๓"
-
-#~ msgid "Save As"
-#~ msgstr "สฬฬพควสยธ"
-
-#~ msgid "Edit File"
-#~ msgstr "ฅีฅกฅคฅ๋ค๒สิฝธ"
-
-# Added at 27-Jan-2004.
-#~ msgid " (NOT FOUND)"
-#~ msgstr " (ธซคฤคซค๊คคปค๓)"
-
-#~ msgid "Source Vim script"
-#~ msgstr "Vimฅนฅฏฅ๊ฅืฅศคฮผ่นค฿"
-
-#~ msgid "unknown"
-#~ msgstr "ษิฬภ"
-
-#~ msgid "Edit File in new window"
-#~ msgstr "ฟทคทคคฅฆฅฃฅ๓ฅษฅฆควฅีฅกฅคฅ๋ค๒สิฝธคทคคน"
-
-#~ msgid "Append File"
-#~ msgstr "ฤษฒรฅีฅกฅคฅ๋"
-
-#~ msgid "Window position: X %d, Y %d"
-#~ msgstr "ฅฆฅฃฅ๓ฅษฅฆฐฬรึ: X %d, Y %d"
-
-#~ msgid "Save Redirection"
-#~ msgstr "ฅ๊ฅภฅคฅ์ฅฏฅศค๒สยธคทคคน"
-
-#~ msgid "Save View"
-#~ msgstr "ฅำฅๅกผค๒สยธคทคคน"
-
-#~ msgid "Save Session"
-#~ msgstr "ฅปฅรฅทฅ็ฅ๓พ๐ส๓ค๒สยธคทคคน"
-
-#~ msgid "Save Setup"
-#~ msgstr "ภ฿ฤ๊ค๒สยธคทคคน"
-
-#~ msgid "E809: #< is not available without the +eval feature"
-#~ msgstr "E809: #< คฯ +eval ตกวฝคฌฬตคคคศอ๘อัควคญคคปค๓"
-
-#~ msgid "E196: No digraphs in this version"
-#~ msgstr "E196: คณคฮฅะกผฅธฅ็ฅ๓คหน็ป๚คฯคขค๊คคปค๓"
-
-#~ msgid "is a device (disabled with 'opendevice' option)"
-#~ msgstr " คฯฅวฅะฅคฅนควคน ('opendevice' ฅชฅืฅทฅ็ฅ๓ควฒ๓ศ๒ควคญคคน)"
-
-#~ msgid "Reading from stdin..."
-#~ msgstr "ษธฝเฦฮฯคซค้ฦษนค฿รๆ..."
-
-#~ msgid "[blowfish]"
-#~ msgstr "[blowfishฐลนๆฒฝ]"
-
-#~ msgid "[crypted]"
-#~ msgstr "[ฐลนๆฒฝ]"
-
-#~ msgid "E821: File is encrypted with unknown method"
-#~ msgstr "E821: ฅีฅกฅคฅ๋คฌฬครฮคฮสหกควฐลนๆฒฝคตค์คฦคคคคน"
-
-# Added at 19-Jan-2004.
-#~ msgid "NetBeans disallows writes of unmodified buffers"
-#~ msgstr "NetBeansคฯฬคสันนคฮฅะฅรฅีฅกค๒พๅฝ๑คนค๋คณคศคฯต๖ฒฤคทคฦคคคคปค๓"
-
-#~ msgid "Partial writes disallowed for NetBeans buffers"
-#~ msgstr "NetBeansฅะฅรฅีฅกคฮฐ์ษ๔ค๒ฝ๑คญฝะคนคณคศคฯควคญคคปค๓"
-
-#~ msgid "writing to device disabled with 'opendevice' option"
-#~ msgstr "'opendevice' ฅชฅืฅทฅ็ฅ๓คหค่ค๊ฅวฅะฅคฅนคุคฮฝ๑คญนค฿คฯควคญคคปค๓"
-
-#~ msgid "E460: The resource fork would be lost (add ! to override)"
-#~ msgstr "E460: ฅ๊ฅฝกผฅนฅีฅฉกผฅฏคฌผบค๏ค์ค๋คซคโคทค์คคปค๓ (! ค๒ฤษฒรควถฏภฉ)"
-
-#~ msgid "E851: Failed to create a new process for the GUI"
-#~ msgstr "E851: GUIอัคฮฅืฅํฅปฅนคฮตฏฦฐคหผบวิคทคคทคฟ"
-
-#~ msgid "E852: The child process failed to start the GUI"
-#~ msgstr "E852: ปาฅืฅํฅปฅนคฌGUIคฮตฏฦฐคหผบวิคทคคทคฟ"
-
-#~ msgid "E229: Cannot start the GUI"
-#~ msgstr "E229: GUIค๒ณซปฯควคญคคปค๓"
-
-#~ msgid "E230: Cannot read from \"%s\""
-#~ msgstr "E230: \"%s\"คซค้ฦษนคเคณคศคฌควคญคคปค๓"
-
-#~ msgid "E665: Cannot start GUI, no valid font found"
-#~ msgstr "E665: อญธ๚คสฅีฅฉฅ๓ฅศคฌธซคฤคซค้คสคคคฮคว, GUIค๒ณซปฯควคญคคปค๓"
-
-#~ msgid "E231: 'guifontwide' invalid"
-#~ msgstr "E231: 'guifontwide' คฌฬตธ๚ควคน"
-
-#~ msgid "E599: Value of 'imactivatekey' is invalid"
-#~ msgstr "E599: 'imactivatekey' คหภ฿ฤ๊คตค์คฟรอคฌฬตธ๚ควคน"
-
-#~ msgid "E254: Cannot allocate color %s"
-#~ msgstr "E254: %s คฮฟงค๒ณไค๊ล๖คฦค้ค์คคปค๓"
-
-#~ msgid "No match at cursor, finding next"
-#~ msgstr "ฅซกผฅฝฅ๋คฮฐฬรึคหฅฅรฅมคฯคขค๊คคปค๓, ผกค๒ธกบ๗คทคฦคคคคน"
-
-#~ msgid "<cannot open> "
-#~ msgstr "<ณซคฑคคปค๓> "
-
-#~ msgid "E616: vim_SelFile: can't get font %s"
-#~ msgstr "E616: vim_SelFile: ฅีฅฉฅ๓ฅศ %s ค๒ผ่ฦภควคญคคปค๓"
-
-#~ msgid "E614: vim_SelFile: can't return to current directory"
-#~ msgstr "E614: vim_SelFile: ธฝบ฿คฮฅวฅฃฅ์ฅฏฅศฅ๊คหฬแค์คคปค๓"
-
-#~ msgid "Pathname:"
-#~ msgstr "ฅัฅนฬพ:"
-
-#~ msgid "E615: vim_SelFile: can't get current directory"
-#~ msgstr "E615: vim_SelFile: ธฝบ฿คฮฅวฅฃฅ์ฅฏฅศฅ๊ค๒ผ่ฦภควคญคคปค๓"
-
-#~ msgid "OK"
-#~ msgstr "OK"
-
-#~ msgid "Cancel"
-#~ msgstr "ฅญฅใฅ๓ฅปฅ๋"
-
-#~ msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
-#~ msgstr "ฅนฅฏฅํกผฅ๋ฅะกผ: ฒ่มค๒ผ่ฦภควคญคคปค๓ควคทคฟ."
-
-#~ msgid "Vim dialog"
-#~ msgstr "Vim ฅภฅคฅขฅํฅฐ"
-
-#~ msgid "E232: Cannot create BalloonEval with both message and callback"
-#~ msgstr "E232: ฅแฅรฅปกผฅธคศฅณกผฅ๋ฅะฅรฅฏคฮคขค๋ BalloonEval ค๒บ๎ภฎควคญคคปค๓"
-
-#~ msgid "Input _Methods"
-#~ msgstr "ฅคฅ๓ฅืฅรฅศฅแฅฝฅรฅษ"
-
-#~ msgid "VIM - Search and Replace..."
-#~ msgstr "VIM - ธกบ๗คศรึดน..."
-
-#~ msgid "VIM - Search..."
-#~ msgstr "VIM - ธกบ๗..."
-
-#~ msgid "Find what:"
-#~ msgstr "ธกบ๗สธป๚ฮ๓:"
-
-#~ msgid "Replace with:"
-#~ msgstr "รึดนสธป๚ฮ๓:"
-
-#~ msgid "Match whole word only"
-#~ msgstr "ภตณฮคหณบล๖คนค๋คโคฮคภคฑ"
-
-#~ msgid "Match case"
-#~ msgstr "ย็สธป๚/พฎสธป๚ค๒ถ่สฬคนค๋"
-
-#~ msgid "Direction"
-#~ msgstr "สธ"
-
-#~ msgid "Up"
-#~ msgstr "พๅ"
-
-#~ msgid "Down"
-#~ msgstr "ฒผ"
-
-#~ msgid "Find Next"
-#~ msgstr "ผกค๒ธกบ๗"
-
-#~ msgid "Replace"
-#~ msgstr "รึดน"
-
-#~ msgid "Replace All"
-#~ msgstr "มดคฦรึดน"
-
-#~ msgid "Vim: Received \"die\" request from session manager\n"
-#~ msgstr "Vim: ฅปฅรฅทฅ็ฅ๓ฅฅอกผฅธฅใคซค้ \"die\" อืตแค๒ผ๕คฑผ่ค๊คคทคฟ\n"
-
-#~ msgid "Close"
-#~ msgstr "สฤคธค๋"
-
-#~ msgid "New tab"
-#~ msgstr "ฟทตฌฅฟฅึฅฺกผฅธ"
-
-#~ msgid "Open Tab..."
-#~ msgstr "ฅฟฅึฅฺกผฅธค๒ณซคฏ..."
-
-#~ msgid "Vim: Main window unexpectedly destroyed\n"
-#~ msgstr "Vim: ฅแฅคฅ๓ฅฆฅฃฅ๓ฅษฅฆคฌษิฐีคหวหฒ๕คตค์คคทคฟ\n"
-
-#~ msgid "&Filter"
-#~ msgstr "ฅีฅฃฅ๋ฅฟ(&F)"
-
-#~ msgid "&Cancel"
-#~ msgstr "ฅญฅใฅ๓ฅปฅ๋(&C)"
-
-#~ msgid "Directories"
-#~ msgstr "ฅวฅฃฅ์ฅฏฅศฅ๊"
-
-#~ msgid "Filter"
-#~ msgstr "ฅีฅฃฅ๋ฅฟ"
-
-#~ msgid "&Help"
-#~ msgstr "ฅุฅ๋ฅื(&H)"
-
-#~ msgid "Files"
-#~ msgstr "ฅีฅกฅคฅ๋"
-
-#~ msgid "&OK"
-#~ msgstr "&OK"
-
-#~ msgid "Selection"
-#~ msgstr "มชย๒"
-
-#~ msgid "Find &Next"
-#~ msgstr "ผกค๒ธกบ๗(&N)"
-
-#~ msgid "&Replace"
-#~ msgstr "รึดน(&R)"
-
-#~ msgid "Replace &All"
-#~ msgstr "มดคฦรึดน(&A)"
-
-#~ msgid "&Undo"
-#~ msgstr "ฅขฅ๓ฅษฅฅ(&U)"
-
-#~ msgid "E671: Cannot find window title \"%s\""
-#~ msgstr "E671: ฅฟฅคฅศฅ๋คฌ \"%s\" คฮฅฆฅฃฅ๓ฅษฅฆคฯธซคฤคซค๊คคปค๓"
-
-#~ msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
-#~ msgstr "E243: ฐ๚ฟ๔คฯฅตฅกผฅศคตค์คคปค๓: \"-%s\"; OLEศวค๒ปศอัคทคฦคฏคภคตคค."
-
-#~ msgid "E672: Unable to open window inside MDI application"
-#~ msgstr "E672: MDIฅขฅืฅ๊คฮรๆควคฯฅฆฅฃฅ๓ฅษฅฆค๒ณซคฑคคปค๓"
-
-#~ msgid "Close tab"
-#~ msgstr "ฅฟฅึฅฺกผฅธค๒สฤคธค๋"
-
-#~ msgid "Open tab..."
-#~ msgstr "ฅฟฅึฅฺกผฅธค๒ณซคฏ"
-
-#~ msgid "Find string (use '\\\\' to find a '\\')"
-#~ msgstr "ธกบ๗สธป๚ฮ๓ ('\\' ค๒ธกบ๗คนค๋คหคฯ '\\\\')"
-
-#~ msgid "Find & Replace (use '\\\\' to find a '\\')"
-#~ msgstr "ธกบ๗กฆรึดน ('\\' ค๒ธกบ๗คนค๋คหคฯ '\\\\')"
-
-#~ msgid "Not Used"
-#~ msgstr "ปศค๏ค์คคปค๓"
-
-#~ msgid "Directory\t*.nothing\n"
-#~ msgstr "ฅวฅฃฅ์ฅฏฅศฅ๊\t*.nothing\n"
-
-#~ msgid ""
-#~ "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
-#~ msgstr "Vim E458: ฟงปุฤ๊คฌภตคทคฏคสคคคฮควฅจฅ๓ฅศฅ๊ค๒ณไค๊ล๖คฦค้ค์คคปค๓"
-
-#~ msgid "E250: Fonts for the following charsets are missing in fontset %s:"
-#~ msgstr "E250: ฐสฒผคฮสธป๚ฅปฅรฅศคฮฅีฅฉฅ๓ฅศคฌคขค๊คคปค๓ %s:"
-
-#~ msgid "E252: Fontset name: %s"
-#~ msgstr "E252: ฅีฅฉฅ๓ฅศฅปฅรฅศฬพ: %s"
-
-#~ msgid "Font '%s' is not fixed-width"
-#~ msgstr "ฅีฅฉฅ๓ฅศ '%s' คฯธวฤ๊ษควคฯคขค๊คคปค๓"
-
-#~ msgid "E253: Fontset name: %s"
-#~ msgstr "E253: ฅีฅฉฅ๓ฅศฅปฅรฅศฬพ: %s"
-
-#~ msgid "Font0: %s"
-#~ msgstr "ฅีฅฉฅ๓ฅศ0: %s"
-
-#~ msgid "Font1: %s"
-#~ msgstr "ฅีฅฉฅ๓ฅศ1: %s"
-
-#~ msgid "Font%<PRId64> width is not twice that of font0"
-#~ msgstr "ฅีฅฉฅ๓ฅศ%<PRId64> คฮษคฌฅีฅฉฅ๓ฅศ0คฮ2วควคฯคขค๊คคปค๓"
-
-#~ msgid "Font0 width: %<PRId64>"
-#~ msgstr "ฅีฅฉฅ๓ฅศ0คฮษ: %<PRId64>"
-
-#~ msgid "Font1 width: %<PRId64>"
-#~ msgstr "ฅีฅฉฅ๓ฅศ1คฮษ: %<PRId64>"
-
-#~ msgid "Invalid font specification"
-#~ msgstr "ฬตธ๚คสฅีฅฉฅ๓ฅศปุฤ๊ควคน"
-
-#~ msgid "&Dismiss"
-#~ msgstr "ตัฒผคนค๋(&D)"
-
-#~ msgid "no specific match"
-#~ msgstr "ฅฅรฅมคนค๋คโคฮคฌคขค๊คคปค๓"
-
-#~ msgid "Vim - Font Selector"
-#~ msgstr "Vim - ฅีฅฉฅ๓ฅศมชย๒"
-
-#~ msgid "Name:"
-#~ msgstr "ฬพมฐ:"
-
-#~ msgid "Show size in Points"
-#~ msgstr "ฅตฅคฅบค๒ฅฅคฅ๓ฅศควษฝผจคนค๋"
-
-#~ msgid "Encoding:"
-#~ msgstr "ฅจฅ๓ฅณกผฅษ:"
-
-#~ msgid "Font:"
-#~ msgstr "ฅีฅฉฅ๓ฅศ:"
-
-#~ msgid "Style:"
-#~ msgstr "ฅนฅฟฅคฅ๋:"
-
-#~ msgid "Size:"
-#~ msgstr "ฅตฅคฅบ:"
-
-#~ msgid "E256: Hangul automata ERROR"
-#~ msgstr "E256: ฅฯฅ๓ฅฐฅ๋ฅชกผฅศฅฅศฅ๓ฅจฅ้กผ"
-
-#~ msgid "E563: stat error"
-#~ msgstr "E563: stat ฅจฅ้กผ"
-
-#~ msgid "E625: cannot open cscope database: %s"
-#~ msgstr "E625: cscopeฅวกผฅฟฅูกผฅน: %s ค๒ณซคฏคณคศคฌควคญคคปค๓"
-
-#~ msgid "E626: cannot get cscope database information"
-#~ msgstr "E626: cscopeฅวกผฅฟฅูกผฅนคฮพ๐ส๓ค๒ผ่ฦภควคญคคปค๓"
-
-#~ msgid "Lua library cannot be loaded."
-#~ msgstr "Luaฅ้ฅคฅึฅ้ฅ๊ค๒ฅํกผฅษควคญคคปค๓."
-
-#~ msgid "cannot save undo information"
-#~ msgstr "ฅขฅ๓ฅษฅฅพ๐ส๓คฌสยธควคญคคปค๓"
-
-#~ msgid ""
-#~ "E815: Sorry, this command is disabled, the MzScheme libraries could not "
-#~ "be loaded."
-#~ msgstr ""
-#~ "E815: คณคฮฅณฅฅ๓ฅษคฯฬตธ๚ควคน. MzScheme ฅ้ฅคฅึฅ้ฅ๊ค๒ฅํกผฅษควคญคคปค๓."
-
-#~ msgid "invalid expression"
-#~ msgstr "ฬตธ๚คสผฐควคน"
-
-#~ msgid "expressions disabled at compile time"
-#~ msgstr "ผฐคฯฅณฅ๓ฅัฅคฅ๋ปคหฬตธ๚คหคตค์คฦคคคคน"
-
-#~ msgid "hidden option"
-#~ msgstr "ฑฃคทฅชฅืฅทฅ็ฅ๓"
-
-#~ msgid "unknown option"
-#~ msgstr "ฬครฮคฮฅชฅืฅทฅ็ฅ๓ควคน"
-
-#~ msgid "window index is out of range"
-#~ msgstr "ศฯฐฯณฐคฮฅฆฅฃฅ๓ฅษฅฆศึนๆควคน"
-
-#~ msgid "couldn't open buffer"
-#~ msgstr "ฅะฅรฅีฅกค๒ณซคฑคคปค๓"
-
-#~ msgid "cannot delete line"
-#~ msgstr "นิค๒พรคปคคปค๓"
-
-#~ msgid "cannot replace line"
-#~ msgstr "นิค๒รึดนควคญคคปค๓"
-
-#~ msgid "cannot insert line"
-#~ msgstr "นิค๒มฦควคญคคปค๓"
-
-#~ msgid "string cannot contain newlines"
-#~ msgstr "สธป๚ฮ๓คหคฯฒนิสธป๚ค๒ดคแค้ค์คคปค๓"
-
-#~ msgid "error converting Scheme values to Vim"
-#~ msgstr "SchemeรอคฮVimคุคฮสัดนฅจฅ้กผ"
-
-#~ msgid "Vim error: ~a"
-#~ msgstr "Vim ฅจฅ้กผ: ~a"
-
-#~ msgid "Vim error"
-#~ msgstr "Vim ฅจฅ้กผ"
-
-#~ msgid "buffer is invalid"
-#~ msgstr "ฅะฅรฅีฅกคฯฬตธ๚ควคน"
-
-#~ msgid "window is invalid"
-#~ msgstr "ฅฆฅฃฅ๓ฅษฅฆคฯฬตธ๚ควคน"
-
-#~ msgid "linenr out of range"
-#~ msgstr "ศฯฐฯณฐคฮนิศึนๆควคน"
-
-#~ msgid "not allowed in the Vim sandbox"
-#~ msgstr "ฅตฅ๓ฅษฅฅรฅฏฅนควคฯต๖คตค์คคปค๓"
-
-#~ msgid "E370: Could not load library %s"
-#~ msgstr "E370: ฅ้ฅคฅึฅ้ฅ๊ %s ค๒ฅํกผฅษควคญคคปค๓ควคทคฟ"
-
-#~ msgid ""
-#~ "Sorry, this command is disabled: the Perl library could not be loaded."
-#~ msgstr ""
-#~ "คณคฮฅณฅฅ๓ฅษคฯฬตธ๚ควคน, คดคแค๓คสคตคค: Perlฅ้ฅคฅึฅ้ฅ๊ค๒ฅํกผฅษควคญคคปค๓ควคท"
-#~ "คฟ."
-
-#~ msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
-#~ msgstr ""
-#~ "E299: ฅตฅ๓ฅษฅฅรฅฏฅนควคฯ Safe ฅโฅธฅๅกผฅ๋ค๒ปศอัคทคสคคPerlฅนฅฏฅ๊ฅืฅศคฯถุคธค้"
-#~ "ค์คฦคคคคน"
-
-#~ msgid "E836: This Vim cannot execute :python after using :py3"
-#~ msgstr "E836: คณคฮVimควคฯ :py3 ค๒ปศครคฟธๅคห :python ค๒ปศคจคคปค๓"
-
-#~ msgid ""
-#~ "E263: Sorry, this command is disabled, the Python library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E263: คณคฮฅณฅฅ๓ฅษคฯฬตธ๚ควคน,คดคแค๓คสคตคค: Pythonฅ้ฅคฅึฅ้ฅ๊ค๒ฅํกผฅษควคญค"
-#~ "คปค๓ควคทคฟ."
-
-# Added at 07-Feb-2004.
-#~ msgid "E659: Cannot invoke Python recursively"
-#~ msgstr "E659: Python ค๒บฦตขลชคหผยนิคนค๋คณคศคฯควคญคคปค๓"
-
-#~ msgid "E837: This Vim cannot execute :py3 after using :python"
-#~ msgstr "E837: คณคฮVimควคฯ :python ค๒ปศครคฟธๅคห :py3 ค๒ปศคจคคปค๓"
-
-#~ msgid "E265: $_ must be an instance of String"
-#~ msgstr "E265: $_ คฯสธป๚ฮ๓คฮฅคฅ๓ฅนฅฟฅ๓ฅนควคสคฑค์คะคสค๊คคปค๓"
-
-#~ msgid ""
-#~ "E266: Sorry, this command is disabled, the Ruby library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E266: คณคฮฅณฅฅ๓ฅษคฯฬตธ๚ควคน,คดคแค๓คสคตคค: Rubyฅ้ฅคฅึฅ้ฅ๊ค๒ฅํกผฅษควคญคคป"
-#~ "ค๓ควคทคฟ."
-
-#~ msgid "E267: unexpected return"
-#~ msgstr "E267: อฝดคปคฬ return ควคน"
-
-#~ msgid "E268: unexpected next"
-#~ msgstr "E268: อฝดคปคฬ next ควคน"
-
-#~ msgid "E269: unexpected break"
-#~ msgstr "E269: อฝดคปคฬ break ควคน"
-
-#~ msgid "E270: unexpected redo"
-#~ msgstr "E270: อฝดคปคฬ redo ควคน"
-
-#~ msgid "E271: retry outside of rescue clause"
-#~ msgstr "E271: rescue คฮณฐคฮ retry ควคน"
-
-#~ msgid "E272: unhandled exception"
-#~ msgstr "E272: ผ่ค๊ฐทค๏ค์คสคซครคฟฮใณฐคฌคขค๊คคน"
-
-#~ msgid "E273: unknown longjmp status %d"
-#~ msgstr "E273: ฬครฮคฮlongjmpพ๕ยึ: %d"
-
-#~ msgid "Toggle implementation/definition"
-#~ msgstr "ผยม๕คศฤ๊ตมค๒ภฺค๊ยุคจค๋"
-
-#~ msgid "Show base class of"
-#~ msgstr "ผกคฮฅฏฅ้ฅนคฮด๐ฤ์ค๒ษฝผจ"
-
-#~ msgid "Show overridden member function"
-#~ msgstr "ฅชกผฅะกผฅ้ฅคฅษคตค์คฟฅแฅ๓ฅะดุฟ๔ค๒ษฝผจ"
-
-#~ msgid "Retrieve from file"
-#~ msgstr "ฅีฅกฅคฅ๋คซค้ฒ๓ษคนค๋"
-
-#~ msgid "Retrieve from project"
-#~ msgstr "ฅืฅํฅธฅงฅฏฅศคซค้ฒ๓ษคนค๋"
-
-#~ msgid "Retrieve from all projects"
-#~ msgstr "มดคฦคฮฅืฅํฅธฅงฅฏฅศคซค้ฒ๓ษคนค๋"
-
-#~ msgid "Retrieve"
-#~ msgstr "ฒ๓ษ"
-
-#~ msgid "Show source of"
-#~ msgstr "ผกคฮฅฝกผฅนค๒ษฝผจคนค๋"
-
-#~ msgid "Find symbol"
-#~ msgstr "ธซคฤคฑคฟฅทฅ๓ฅฅ๋"
-
-#~ msgid "Browse class"
-#~ msgstr "ฅฏฅ้ฅนค๒ปฒพศ"
-
-#~ msgid "Show class in hierarchy"
-#~ msgstr "ณฌมุควฅฏฅ้ฅนค๒ษฝผจ"
-
-#~ msgid "Show class in restricted hierarchy"
-#~ msgstr "ธยฤ๊คตค์คฟณฌมุควฅฏฅ้ฅนค๒ษฝผจ"
-
-#~ msgid "Xref refers to"
-#~ msgstr "Xref คฮปฒพศภ่"
-
-#~ msgid "Xref referred by"
-#~ msgstr "Xref คฌปฒพศคตค์ค๋"
-
-#~ msgid "Xref has a"
-#~ msgstr "Xref คฌผกคฮคโคฮค๒คโครคฦคคคคน"
-
-#~ msgid "Xref used by"
-#~ msgstr "Xref คฌปศอัคตค์ค๋"
-
-#~ msgid "Show docu of"
-#~ msgstr "ผกคฮสธพฯค๒ษฝผจ"
-
-#~ msgid "Generate docu for"
-#~ msgstr "ผกคฮสธพฯค๒ภธภฎ"
-
-#~ msgid ""
-#~ "Cannot connect to SNiFF+. Check environment (sniffemacs must be found in "
-#~ "$PATH).\n"
-#~ msgstr ""
-#~ "SNiFF+คหภยณควคญคคปค๓. ดฤถญค๒ฅมฅงฅรฅฏคทคฦคฏคภคตคค(sniffemacs คฌ $PATH คห"
-#~ "คสคฑค์คะคสค๊คคปค๓).\n"
-
-#~ msgid "E274: Sniff: Error during read. Disconnected"
-#~ msgstr "E274: Sniff: ฦษนรๆคหฅจฅ้กผคฌศฏภธคทคคทคฟ. ภฺรวคทคคทคฟ"
-
-#~ msgid "SNiFF+ is currently "
-#~ msgstr "ธฝบ฿SNiFF+ คฮพ๕ยึคฯกึ"
-
-#~ msgid "not "
-#~ msgstr "ฬค"
-
-#~ msgid "connected"
-#~ msgstr "ภยณกืควคน"
-
-#~ msgid "E275: Unknown SNiFF+ request: %s"
-#~ msgstr "E275: ฬครฮคฮ SNiFF+ ฅ๊ฅฏฅจฅนฅศควคน: %s"
-
-#~ msgid "E276: Error connecting to SNiFF+"
-#~ msgstr "E276: SNiFF+ คุคฮภยณรๆคฮฅจฅ้กผควคน"
-
-#~ msgid "E278: SNiFF+ not connected"
-#~ msgstr "E278: SNiFF+ คหภยณคตค์คฦคคคคปค๓"
-
-#~ msgid "E279: Not a SNiFF+ buffer"
-#~ msgstr "E279: SNiFF+ ฅะฅรฅีฅกคฌคขค๊คคปค๓"
-
-#~ msgid "Sniff: Error during write. Disconnected"
-#~ msgstr "Sniff: ฝ๑นค฿รๆคหฅจฅ้กผคฌศฏภธคทคฟคฮควภฺรวคทคคทคฟ"
-
-#~ msgid "invalid buffer number"
-#~ msgstr "ฬตธ๚คสฅะฅรฅีฅกศึนๆควคน"
-
-#~ msgid "not implemented yet"
-#~ msgstr "คคภผยม๕คตค์คฦคคคคปค๓"
-
-#~ msgid "cannot set line(s)"
-#~ msgstr "นิค๒ภ฿ฤ๊ควคญคคปค๓"
-
-#~ msgid "invalid mark name"
-#~ msgstr "ฬตธ๚คสฅกผฅฏฬพควคน"
-
-#~ msgid "mark not set"
-#~ msgstr "ฅกผฅฏคฯภ฿ฤ๊คตค์คฦคคคคปค๓"
-
-#~ msgid "row %d column %d"
-#~ msgstr "นิ %d ฮ๓ %d"
-
-#~ msgid "cannot insert/append line"
-#~ msgstr "นิคฮมฦ/ฤษฒรค๒ควคญคคปค๓"
-
-#~ msgid "line number out of range"
-#~ msgstr "ศฯฐฯณฐคฮนิศึนๆควคน"
-
-#~ msgid "unknown flag: "
-#~ msgstr "ฬครฮคฮฅีฅ้ฅฐ: "
-
-#~ msgid "unknown vimOption"
-#~ msgstr "ฬครฮคฮ vimOption ควคน"
-
-#~ msgid "keyboard interrupt"
-#~ msgstr "ฅญกผฅกผฅษณไนค฿"
-
-#~ msgid "vim error"
-#~ msgstr "vim ฅจฅ้กผ"
-
-#~ msgid "cannot create buffer/window command: object is being deleted"
-#~ msgstr ""
-#~ "ฅะฅรฅีฅก/ฅฆฅฃฅ๓ฅษฅฆบ๎ภฎฅณฅฅ๓ฅษค๒บ๎ภฎควคญคคปค๓: ฅชฅึฅธฅงฅฏฅศคฌพรต๎คตค์คฦ"
-#~ "คคคคทคฟ"
-
-#~ msgid ""
-#~ "cannot register callback command: buffer/window is already being deleted"
-#~ msgstr ""
-#~ "ฅณกผฅ๋ฅะฅรฅฏฅณฅฅ๓ฅษค๒ละฯฟควคญคคปค๓: ฅะฅรฅีฅก/ฅฆฅฃฅ๓ฅษฅฆคฌด๛คหพรต๎คตค์ค"
-#~ "คทคฟ"
-
-#~ msgid ""
-#~ "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-"
-#~ "dev@vim.org"
-#~ msgstr ""
-#~ "E280: TCL รืฬฟลชฅจฅ้กผ: reflist ฑ๘ภ๗!? vim-dev@vim.org คหส๓น๐คทคฦคฏคภคตคค"
-
-#~ msgid "cannot register callback command: buffer/window reference not found"
-#~ msgstr ""
-#~ "ฅณกผฅ๋ฅะฅรฅฏฅณฅฅ๓ฅษค๒ละฯฟควคญคคปค๓: ฅะฅรฅีฅก/ฅฆฅฃฅ๓ฅษฅฆคฮปฒพศคฌธซคฤคซค๊"
-#~ "คคปค๓"
-
-#~ msgid ""
-#~ "E571: Sorry, this command is disabled: the Tcl library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E571: คณคฮฅณฅฅ๓ฅษคฯฬตธ๚ควคน,คดคแค๓คสคตคค: Tclฅ้ฅคฅึฅ้ฅ๊ค๒ฅํกผฅษควคญคคปค๓"
-#~ "ควคทคฟ."
-
-#~ msgid "E572: exit code %d"
-#~ msgstr "E572: ฝชฮปฅณกผฅษ %d"
-
-#~ msgid "cannot get line"
-#~ msgstr "นิค๒ผ่ฦภควคญคคปค๓"
-
-#~ msgid "Unable to register a command server name"
-#~ msgstr "ฬฟฮแฅตกผฅะคฮฬพมฐค๒ละฯฟควคญคคปค๓"
-
-#~ msgid "E248: Failed to send command to the destination program"
-#~ msgstr "E248: ฬลชคฮฅืฅํฅฐฅ้ฅเคุคฮฅณฅฅ๓ฅษม๗ฟฎคหผบวิคทคคทคฟ"
-
-#~ msgid "E573: Invalid server id used: %s"
-#~ msgstr "E573: ฬตธ๚คสฅตกผฅะIDคฌปศค๏ค์คคทคฟ: %s"
-
-#~ msgid "E251: VIM instance registry property is badly formed. Deleted!"
-#~ msgstr "E251: VIM ผยยฮคฮละฯฟฅืฅํฅัฅฦฅฃคฌษิภตควคน. พรต๎คทคคทคฟ!"
-
-#~ msgid "netbeans is not supported with this GUI\n"
-#~ msgstr "netbeans คฯคณคฮGUIควคฯอ๘อัควคญคคปค๓\n"
-
-#~ msgid "This Vim was not compiled with the diff feature."
-#~ msgstr "คณคฮVimคหคฯdiffตกวฝคฌคขค๊คคปค๓(ฅณฅ๓ฅัฅคฅ๋ปภ฿ฤ๊)."
-
-#~ msgid "'-nb' cannot be used: not enabled at compile time\n"
-#~ msgstr "'-nb' ปศอัษิฒฤวฝควคน: ฅณฅ๓ฅัฅคฅ๋ปคหฬตธ๚คหคตค์คฦคคคคน\n"
-
-#~ msgid "Vim: Error: Failure to start gvim from NetBeans\n"
-#~ msgstr "Vim: ฅจฅ้กผ: NetBeansคซค้gvimค๒ฅนฅฟกผฅศควคญคคปค๓\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Where case is ignored prepend / to make flag upper case"
-#~ msgstr ""
-#~ "\n"
-#~ "ย็พฎสธป๚คฌฬตป๋คตค์ค๋พ์น็คฯย็สธป๚คหคนค๋คฟคแคห / ค๒มฐรึคทคฦคฏคภคตคค"
-
-#~ msgid "-register\t\tRegister this gvim for OLE"
-#~ msgstr "-register\t\tคณคฮgvimค๒OLEคศคทคฦละฯฟคนค๋"
-
-#~ msgid "-unregister\t\tUnregister gvim for OLE"
-#~ msgstr "-unregister\t\tgvimคฮOLEละฯฟค๒ฒ๒ฝคนค๋"
-
-#~ msgid "-g\t\t\tRun using GUI (like \"gvim\")"
-#~ msgstr "-g\t\t\tGUIควตฏฦฐคนค๋ (\"gvim\" คศฦฑคธ)"
-
-#~ msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
-#~ msgstr "-f or --nofork\tฅีฅฉฅขฅฐฅ้ฅฆฅ๓ฅษ: GUIค๒ปฯคแค๋คศคญคหforkคทคสคค"
-
-#~ msgid "-f\t\t\tDon't use newcli to open window"
-#~ msgstr "-f\t\t\tฅฆฅฃฅ๓ฅษฅฆค๒ณซคฏคฮคห newcli ค๒ปศอัคทคสคค"
-
-#~ msgid "-dev <device>\t\tUse <device> for I/O"
-#~ msgstr "-dev <device>\t\tI/Oคห <device> ค๒ปศอัคนค๋"
-
-#~ msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
-#~ msgstr "-U <gvimrc>\t\t.gvimrcคฮยๅค๏ค๊คห <gvimrc> ค๒ปศคฆ"
-
-#~ msgid "-x\t\t\tEdit encrypted files"
-#~ msgstr "-x\t\t\tฐลนๆฒฝคตค์คฟฅีฅกฅคฅ๋ค๒สิฝธคนค๋"
-
-#~ msgid "-display <display>\tConnect vim to this particular X-server"
-#~ msgstr "-display <display>\tvimค๒ปุฤ๊คทคฟ X ฅตกผฅะคหภยณคนค๋"
-
-#~ msgid "-X\t\t\tDo not connect to X server"
-#~ msgstr "-X\t\t\tXฅตกผฅะคหภยณคทคสคค"
-
-#~ msgid "--remote <files>\tEdit <files> in a Vim server if possible"
-#~ msgstr "--remote <files>\tฒฤวฝคสค้คะVimฅตกผฅะคว <files> ค๒สิฝธคนค๋"
-
-#~ msgid "--remote-silent <files> Same, don't complain if there is no server"
-#~ msgstr "--remote-silent <files> ฦฑพๅ, ฅตกผฅะคฌฬตคฏคฦคโทูน๐สธค๒ฝะฮฯคทคสคค"
-
-#~ msgid ""
-#~ "--remote-wait <files> As --remote but wait for files to have been edited"
-#~ msgstr "--remote-wait <files>\t--remoteธๅ ฅีฅกฅคฅ๋คฮสิฝธคฌฝชค๏ค๋คฮค๒ยิคฤ"
-
-#~ msgid ""
-#~ "--remote-wait-silent <files> Same, don't complain if there is no server"
-#~ msgstr ""
-#~ "--remote-wait-silent <files> ฦฑพๅ, ฅตกผฅะคฌฬตคฏคฦคโทูน๐สธค๒ฝะฮฯคทคสคค"
-
-#~ msgid ""
-#~ "--remote-tab[-wait][-silent] <files> As --remote but use tab page per "
-#~ "file"
-#~ msgstr ""
-#~ "--remote-tab[-wait][-silent] <files> --remoteควฅีฅกฅคฅ๋1คฤคหคฤคญ1คฤคฮฅฟฅึ"
-#~ "ฅฺกผฅธค๒ณซคฏ"
-
-#~ msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
-#~ msgstr "--remote-send <keys>\tVimฅตกผฅะคห <keys> ค๒ม๗ฟฎคทคฦฝชฮปคนค๋"
-
-#~ msgid ""
-#~ "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
-#~ msgstr "--remote-expr <expr>\tฅตกผฅะคว <expr> ค๒ผยนิคทคฦท๋ฒฬค๒ษฝผจคนค๋"
-
-#~ msgid "--serverlist\t\tList available Vim server names and exit"
-#~ msgstr "--serverlist\t\tVimฅตกผฅะฬพคฮฐ์อ๗ค๒ษฝผจคทคฦฝชฮปคนค๋"
-
-#~ msgid "--servername <name>\tSend to/become the Vim server <name>"
-#~ msgstr "--servername <name>\tVimฅตกผฅะ <name> คหม๗ฟฎ/ฬพมฐภ฿ฤ๊คนค๋"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Motif version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvimคหค่ครคฦฒ๒ผแคตค์ค๋ฐ๚ฟ๔(Motifฅะกผฅธฅ็ฅ๓):\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (neXtaw version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvimคหค่ครคฦฒ๒ผแคตค์ค๋ฐ๚ฟ๔(neXtawฅะกผฅธฅ็ฅ๓):\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Athena version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvimคหค่ครคฦฒ๒ผแคตค์ค๋ฐ๚ฟ๔(Athenaฅะกผฅธฅ็ฅ๓):\n"
-
-#~ msgid "-display <display>\tRun vim on <display>"
-#~ msgstr "-display <display>\t<display> ควvimค๒ผยนิคนค๋"
-
-#~ msgid "-iconic\t\tStart vim iconified"
-#~ msgstr "-iconic\t\tบวพฎฒฝคทคฟพ๕ยึควvimค๒ตฏฦฐคนค๋"
-
-#~ msgid "-background <color>\tUse <color> for the background (also: -bg)"
-#~ msgstr "-background <color>\tวุทสฟงคห <color> ค๒ปศคฆ(ฦฑตม: -bg)"
-
-#~ msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
-#~ msgstr "-foreground <color>\tมฐทสฟงคห <color> ค๒ปศคฆ(ฦฑตม: -fg)"
-
-#~ msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
-#~ msgstr "-font <font>\t\tฅฦฅญฅนฅศษฝผจคห <font> ค๒ปศคฆ(ฦฑตม: -fn)"
-
-#~ msgid "-boldfont <font>\tUse <font> for bold text"
-#~ msgstr "-boldfont <font>\tยภป๚คห <font> ค๒ปศคฆ"
-
-#~ msgid "-italicfont <font>\tUse <font> for italic text"
-#~ msgstr "-italicfont <for>\tผะยฮป๚คห <font> ค๒ปศคฆ"
-
-#~ msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
-#~ msgstr "-geometry <geom>\tฝ้ดวรึคห <geom> ค๒ปศคฆ(ฦฑตม: -geom)"
-
-#~ msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
-#~ msgstr "-borderwidth <width>\tถญณฆคฮษค๒ <width> คหคนค๋(ฦฑตม: -bw)"
-
-#~ msgid ""
-#~ "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
-#~ msgstr ""
-#~ "-scrollbarwidth <width> ฅนฅฏฅํกผฅ๋ฅะกผคฮษค๒ <width> คหคนค๋(ฦฑตม: -sw)"
-
-#~ msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
-#~ msgstr ""
-#~ "-menuheight <height>\tฅแฅหฅๅกผฅะกผคฮนโคตค๒ <height> คหคนค๋(ฦฑตม: -mh)"
-
-#~ msgid "-reverse\t\tUse reverse video (also: -rv)"
-#~ msgstr "-reverse\t\tศฟลพฑวมค๒ปศอัคนค๋(ฦฑตม: -rv)"
-
-#~ msgid "+reverse\t\tDon't use reverse video (also: +rv)"
-#~ msgstr "+reverse\t\tศฟลพฑวมค๒ปศอัคทคสคค(ฦฑตม: +rv)"
-
-#~ msgid "-xrm <resource>\tSet the specified resource"
-#~ msgstr "-xrm <resource>\tฦรฤ๊คฮฅ๊ฅฝกผฅนค๒ปศอัคนค๋"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (GTK+ version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvimคหค่ครคฦฒ๒ผแคตค์ค๋ฐ๚ฟ๔(GTK+ฅะกผฅธฅ็ฅ๓):\n"
-
-#~ msgid "-display <display>\tRun vim on <display> (also: --display)"
-#~ msgstr "-display <display>\t<display> ควvimค๒ผยนิคนค๋(ฦฑตม: --display)"
-
-#~ msgid "--role <role>\tSet a unique role to identify the main window"
-#~ msgstr "--role <role>\tฅแฅคฅ๓ฅฆฅฃฅ๓ฅษฅฆค๒ผฑสฬคนค๋ฐ์ฐีคสฬ๒ณไ(role)ค๒ภ฿ฤ๊คนค๋"
-
-#~ msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
-#~ msgstr "--socketid <xid>\tฐคสค๋GTK widgetควVimค๒ณซคฏ"
-
-#~ msgid "--echo-wid\t\tMake gvim echo the Window ID on stdout"
-#~ msgstr "--echo-wid\t\tฅฆฅฃฅ๓ฅษฅฆIDค๒ษธฝเฝะฮฯคหฝะฮฯคนค๋"
-
-#~ msgid "-P <parent title>\tOpen Vim inside parent application"
-#~ msgstr "-P <ฟฦคฮฅฟฅคฅศฅ๋>\tVimค๒ฟฦฅขฅืฅ๊ฅฑกผฅทฅ็ฅ๓คฮรๆควตฏฦฐคนค๋"
-
-#~ msgid "--windowid <HWND>\tOpen Vim inside another win32 widget"
-#~ msgstr "--windowid <HWND>\tฐคสค๋Win32 widgetคฮฦโษ๔คหVimค๒ณซคฏ"
-
-#~ msgid "No display"
-#~ msgstr "ฅวฅฃฅนฅืฅ์ฅคคฌธซคฤคซค๊คคปค๓"
-
-#~ msgid ": Send failed.\n"
-#~ msgstr ": ม๗ฟฎคหผบวิคทคคทคฟ.\n"
-
-#~ msgid ": Send failed. Trying to execute locally\n"
-#~ msgstr ": ม๗ฟฎคหผบวิคทคคทคฟ. ฅํกผฅซฅ๋ควคฮผยนิค๒ป๎ค฿คฦคคคคน\n"
-
-#~ msgid "%d of %d edited"
-#~ msgstr "%d ธฤ (%d ธฤรๆ) คฮฅีฅกฅคฅ๋ค๒สิฝธคทคคทคฟ"
-
-#~ msgid "No display: Send expression failed.\n"
-#~ msgstr "ฅวฅฃฅนฅืฅ์ฅคคฌคขค๊คคปค๓: ผฐคฮม๗ฟฎคหผบวิคทคคทคฟ.\n"
-
-#~ msgid ": Send expression failed.\n"
-#~ msgstr ": ผฐคฮม๗ฟฎคหผบวิคทคคทคฟ.\n"
-
-#~ msgid "E543: Not a valid codepage"
-#~ msgstr "E543: ฬตธ๚คสฅณกผฅษฅฺกผฅธควคน"
-
-#~ msgid "E284: Cannot set IC values"
-#~ msgstr "E284: ICคฮรอค๒ภ฿ฤ๊ควคญคคปค๓"
+#, c-format
+msgid "E447: Can't find file \"%s\" in path"
+msgstr "E447: pathคหคฯ \"%s\" คศคคคฆฅีฅกฅคฅ๋คฌคขค๊คคปค๓"
-#~ msgid "E285: Failed to create input context"
-#~ msgstr "E285: ฅคฅ๓ฅืฅรฅศฅณฅ๓ฅฦฅญฅนฅศคฮบ๎ภฎคหผบวิคทคคทคฟ"
+#, c-format
+msgid "E799: Invalid ID: %ld (must be greater than or equal to 1)"
+msgstr "E799: ฬตธ๚คส ID: %ld (1 ฐสพๅควคสคฑค์คะคสค๊คคปค๓)"
-#~ msgid "E286: Failed to open input method"
-#~ msgstr "E286: ฅคฅ๓ฅืฅรฅศฅแฅฝฅรฅษคฮฅชกผฅืฅ๓คหผบวิคทคคทคฟ"
+#, c-format
+msgid "E801: ID already taken: %ld"
+msgstr "E801: ID คฯคนควคหอ๘อัรๆควคน: %ld"
-#~ msgid "E287: Warning: Could not set destroy callback to IM"
-#~ msgstr "E287: ทูน๐: IMคฮวหฒ๕ฅณกผฅ๋ฅะฅรฅฏค๒ภ฿ฤ๊ควคญคคปค๓ควคทคฟ"
+msgid "List or number required"
+msgstr "ฅ๊ฅนฅศคซฟ๔รอคฌษฌอืควคน"
-#~ msgid "E288: input method doesn't support any style"
-#~ msgstr "E288: ฅคฅ๓ฅืฅรฅศฅแฅฝฅรฅษคฯคษค๓คสฅนฅฟฅคฅ๋คโฅตฅกผฅศคทคคปค๓"
+#, c-format
+msgid "E802: Invalid ID: %ld (must be greater than or equal to 1)"
+msgstr "E802: ฬตธ๚คส ID: %ld (1 ฐสพๅควคสคฑค์คะคสค๊คคปค๓)"
-#~ msgid "E289: input method doesn't support my preedit type"
-#~ msgstr "E289: ฅคฅ๓ฅืฅรฅศฅแฅฝฅรฅษคฯ my preedit type ค๒ฅตฅกผฅศคทคคปค๓"
+#, c-format
+msgid "E803: ID not found: %ld"
+msgstr "E803: ID คฯคขค๊คคปค๓: %ld"
-#~ msgid "E843: Error while updating swap file crypt"
-#~ msgstr "E843: ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คฮฐลนๆค๒นนฟทรๆคหฅจฅ้กผคฌศฏภธคทคคทคฟ"
+msgid "Edit with &multiple Vims"
+msgstr "สฃฟ๔คฮVimควสิฝธคนค๋ (&M)"
-#~ msgid ""
-#~ "E833: %s is encrypted and this version of Vim does not support encryption"
-#~ msgstr ""
-#~ "E833: %s คฯคณคฮฅะกผฅธฅ็ฅ๓คฮVimควฅตฅกผฅศคทคฦคคคสคคทมผฐควฐลนๆฒฝคตค์คฦคคคคน"
+msgid "Edit with single &Vim"
+msgstr "1คฤคฮVimควสิฝธคนค๋ (&V)"
-#~ msgid "Swap file is encrypted: \"%s\""
-#~ msgstr "ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คฯฐลนๆฒฝคตค์คฦคคคคน: \"%s\""
+msgid "Diff with Vim"
+msgstr "Vimควบนสฌค๒ษฝผจคนค๋"
-#~ msgid ""
-#~ "\n"
-#~ "If you entered a new crypt key but did not write the text file,"
-#~ msgstr ""
-#~ "\n"
-#~ "ฟทคทคคฐลนๆฅญกผค๒ฦฮฯคทคฟคขคศคหฅฦฅญฅนฅศฅีฅกฅคฅ๋ค๒สยธคทคฦคคคสคคพ์น็คฯ,"
+msgid "Edit with &Vim"
+msgstr "Vimควสิฝธคนค๋ (&V)"
-#~ msgid ""
-#~ "\n"
-#~ "enter the new crypt key."
-#~ msgstr ""
-#~ "\n"
-#~ "ฟทคทคคฐลนๆฅญกผค๒ฦฮฯคทคฦคฏคภคตคค."
+msgid "Edit with existing Vim - "
+msgstr "ตฏฦฐบัคฮVimควสิฝธคนค๋ - "
-#~ msgid ""
-#~ "\n"
-#~ "If you wrote the text file after changing the crypt key press enter"
-#~ msgstr ""
-#~ "\n"
-#~ "ฐลนๆฅญกผค๒สัคจคฟคขคศคหฅฦฅญฅนฅศฅีฅกฅคฅ๋ค๒สยธคทคฟพ์น็คฯ, ฅฦฅญฅนฅศฅีฅกฅคฅ๋คศ"
+msgid "Edits the selected file(s) with Vim"
+msgstr "มชย๒คทคฟฅีฅกฅคฅ๋ค๒Vimควสิฝธคนค๋"
-#~ msgid ""
-#~ "\n"
-#~ "to use the same key for text file and swap file"
-#~ msgstr ""
-#~ "\n"
-#~ "ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คหฦฑคธฐลนๆฅญกผค๒ปศคฆคฟคแคหenterคภคฑค๒ฒกคทคฦคฏคภคตคค."
+msgid "Error creating process: Check if gvim is in your path!"
+msgstr "ฅืฅํฅปฅนคฮบ๎ภฎคหผบวิ: gvimคฌดฤถญสัฟ๔PATHพๅคหคขค๋คซณฮวงคทคฦคฏคภคตคค!"
-#~ msgid "Using crypt key from swap file for the text file.\n"
-#~ msgstr "ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คซค้ผ่ฦภคทคฟฐลนๆฅญกผค๒ฅฦฅญฅนฅศฅีฅกฅคฅ๋คหปศคคคคน.\n"
+msgid "gvimext.dll error"
+msgstr "gvimext.dll ฅจฅ้กผ"
-#~ msgid ""
-#~ "\n"
-#~ " [not usable with this version of Vim]"
-#~ msgstr ""
-#~ "\n"
-#~ " [คณคฮVimฅะกผฅธฅ็ฅ๓ควคฯปศอัควคญคคปค๓]"
+msgid "Path length too long!"
+msgstr "ฅัฅนคฌฤนฒแคฎคคน!"
-#~ msgid "Tear off this menu"
-#~ msgstr "คณคฮฅแฅหฅๅกผค๒ภฺค๊ผ่ค๋"
+msgid "--No lines in buffer--"
+msgstr "--ฅะฅรฅีฅกคหนิคฌคขค๊คคปค๓--"
-#~ msgid "Select Directory dialog"
-#~ msgstr "ฅวฅฃฅ์ฅฏฅศฅ๊มชย๒ฅภฅคฅขฅํฅฐ"
+msgid "E470: Command aborted"
+msgstr "E470: ฅณฅฅ๓ฅษคฌรๆรวคตค์คคทคฟ"
-#~ msgid "Save File dialog"
-#~ msgstr "ฅีฅกฅคฅ๋สยธฅภฅคฅขฅํฅฐ"
+msgid "E471: Argument required"
+msgstr "E471: ฐ๚ฟ๔คฌษฌอืควคน"
-#~ msgid "Open File dialog"
-#~ msgstr "ฅีฅกฅคฅ๋ฦษนฅภฅคฅขฅํฅฐ"
+msgid "E10: \\ should be followed by /, ? or &"
+msgstr "E10: \\ คฮธๅคฯ / คซ ? คซ & ควคสคฑค์คะคสค๊คคปค๓"
-#~ msgid "E338: Sorry, no file browser in console mode"
-#~ msgstr ""
-#~ "E338: ฅณฅ๓ฅฝกผฅ๋ฅโกผฅษควคฯฅีฅกฅคฅ๋ฅึฅ้ฅฆฅถค๒ปศคจคคปค๓, คดคแค๓คสคตคค"
+msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
+msgstr "E11: ฅณฅฅ๓ฅษฅ้ฅคฅ๓ควคฯฬตธ๚ควคน; <CR>ควผยนิ, CTRL-Cควคไคแค๋"
-#~ msgid "Vim: preserving files...\n"
-#~ msgstr "Vim: ฅีฅกฅคฅ๋ค๒สยธรๆ...\n"
+msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
+msgstr ""
+"E12: ธฝบ฿คฮฅวฅฃฅ์ฅฏฅศฅ๊คไฅฟฅฐธกบ๗ควคฯexrc/vimrcคฮฅณฅฅ๓ฅษคฯต๖ฒฤคตค์คคปค๓"
-#~ msgid "Vim: Finished.\n"
-#~ msgstr "Vim: ฝชฮปคทคคทคฟ.\n"
+msgid "E171: Missing :endif"
+msgstr "E171: :endif คฌคขค๊คคปค๓"
-#~ msgid "ERROR: "
-#~ msgstr "ฅจฅ้กผ: "
+msgid "E600: Missing :endtry"
+msgstr "E600: :endtry คฌคขค๊คคปค๓"
-#~ msgid ""
-#~ "\n"
-#~ "[bytes] total alloc-freed %<PRIu64>-%<PRIu64>, in use %<PRIu64>, peak use "
-#~ "%<PRIu64>\n"
-#~ msgstr ""
-#~ "\n"
-#~ "[ฅแฅโฅ๊(ฅะฅคฅศ)] มํณไล๖-ฒ๒สฮฬ %<PRIu64>-%<PRIu64>, ปศอัฮฬ %<PRIu64>, ฅิกผ"
-#~ "ฅฏป %<PRIu64>\n"
+msgid "E170: Missing :endwhile"
+msgstr "E170: :endwhile คฌคขค๊คคปค๓"
-#~ msgid ""
-#~ "[calls] total re/malloc()'s %<PRIu64>, total free()'s %<PRIu64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "[ธฦฝะ] มํ re/malloc() ฒ๓ฟ๔ %<PRIu64>, มํ free() ฒ๓ฟ๔ %<PRIu64>\n"
-#~ "\n"
+msgid "E170: Missing :endfor"
+msgstr "E170: :endfor คฌคขค๊คคปค๓"
-#~ msgid "E340: Line is becoming too long"
-#~ msgstr "E340: นิคฌฤนคฏคสค๊ฒแคฎคคทคฟ"
+msgid "E588: :endwhile without :while"
+msgstr "E588: :while คฮคสคค :endwhile คฌคขค๊คคน"
-#~ msgid "E341: Internal error: lalloc(%<PRId64>, )"
-#~ msgstr "E341: ฦโษ๔ฅจฅ้กผ: lalloc(%<PRId64>,)"
+msgid "E588: :endfor without :for"
+msgstr "E588: :endfor คฮคสคค :for คฌคขค๊คคน"
-#~ msgid "E547: Illegal mouseshape"
-#~ msgstr "E547: ษิภตคส 'mouseshape' ควคน"
+msgid "E13: File exists (add ! to override)"
+msgstr "E13: ฅีฅกฅคฅ๋คฌยธบ฿คทคคน (! ค๒ฤษฒรควพๅฝ๑)"
-#~ msgid "Enter encryption key: "
-#~ msgstr "ฐลนๆฒฝอัคฮฅญกผค๒ฦฮฯคทคฦคฏคภคตคค: "
+msgid "E472: Command failed"
+msgstr "E472: ฅณฅฅ๓ฅษคฌผบวิคทคคทคฟ"
-#~ msgid "Enter same key again: "
-#~ msgstr "คโคฆฐ์ลูฦฑคธฅญกผค๒ฦฮฯคทคฦคฏคภคตคค: "
+#, c-format
+msgid "E234: Unknown fontset: %s"
+msgstr "E234: ฬครฮคฮฅีฅฉฅ๓ฅศฅปฅรฅศ: %s"
-#~ msgid "Keys don't match!"
-#~ msgstr "ฅญกผคฌฐ์รืคทคคปค๓"
+#, c-format
+msgid "E235: Unknown font: %s"
+msgstr "E235: ฬครฮคฮฅีฅฉฅ๓ฅศ: %s"
-#~ msgid "Cannot connect to Netbeans #2"
-#~ msgstr "Netbeans #2 คหภยณควคญคคปค๓"
+#, c-format
+msgid "E236: Font \"%s\" is not fixed-width"
+msgstr "E236: ฅีฅฉฅ๓ฅศ \"%s\" คฯธวฤ๊ษควคฯคขค๊คคปค๓"
-#~ msgid "Cannot connect to Netbeans"
-#~ msgstr "Netbeans คหภยณควคญคคปค๓"
+msgid "E473: Internal error"
+msgstr "E473: ฦโษ๔ฅจฅ้กผควคน"
-#~ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
-#~ msgstr ""
-#~ "E668: NetBeansคฮภยณพ๐ส๓ฅีฅกฅคฅ๋คฮฅขฅฏฅปฅนฅโกผฅษคหฬไย๊คฌคขค๊คคน: \"%s\""
+#, c-format
+msgid "E685: Internal error: %s"
+msgstr "E685: ฦโษ๔ฅจฅ้กผควคน: %s"
-#~ msgid "read from Netbeans socket"
-#~ msgstr "Netbeans คฮฅฝฅฑฅรฅศค๒ฦษนค฿"
+msgid "Interrupted"
+msgstr "ณไนคค์คคทคฟ"
-#~ msgid "E658: NetBeans connection lost for buffer %<PRId64>"
-#~ msgstr "E658: ฅะฅรฅีฅก %<PRId64> คฮ NetBeans ภยณคฌผบค๏ค์คคทคฟ"
+msgid "E14: Invalid address"
+msgstr "E14: ฬตธ๚คสฅขฅษฅ์ฅนควคน"
-#~ msgid "E838: netbeans is not supported with this GUI"
-#~ msgstr "E838: NetBeansคฯคณคฮGUIคหคฯยะฑคทคฦคคคคปค๓"
+msgid "E474: Invalid argument"
+msgstr "E474: ฬตธ๚คสฐ๚ฟ๔ควคน"
-#~ msgid "E511: netbeans already connected"
-#~ msgstr "E511: NetBeansคฯด๛คหภยณคทคฦคคคคน"
+#, c-format
+msgid "E475: Invalid argument: %s"
+msgstr "E475: ฬตธ๚คสฐ๚ฟ๔ควคน: %s"
-#~ msgid "E505: %s is read-only (add ! to override)"
-#~ msgstr "E505: %s คฯฦษนภ์อัควคน (ถฏภฉฝ๑นคหคฯ ! ค๒ฤษฒร)"
+#, c-format
+msgid "E475: Invalid value for argument %s"
+msgstr "E475: ฐ๚ฟ๔ %s คหยะคทคฦฬตธ๚คสรอควคน"
-#~ msgid "E775: Eval feature not available"
-#~ msgstr "E775: ผฐษพฒมตกวฝคฌฬตธ๚คหคสครคฦคคคคน"
+#, c-format
+msgid "E475: Invalid value for argument %s: %s"
+msgstr "E475: ฐ๚ฟ๔ %s คหยะคทคฦฬตธ๚คสรอควคน: %s"
-#~ msgid "freeing %<PRId64> lines"
-#~ msgstr "%<PRId64> นิค๒ฒ๒สรๆ"
+#, c-format
+msgid "E15: Invalid expression: %s"
+msgstr "E15: ฬตธ๚คสผฐควคน: %s"
-#~ msgid "E530: Cannot change term in GUI"
-#~ msgstr "E530: GUIควคฯ 'term' ค๒สันนควคญคคปค๓"
+msgid "E16: Invalid range"
+msgstr "E16: ฬตธ๚คสศฯฐฯควคน"
-#~ msgid "E531: Use \":gui\" to start the GUI"
-#~ msgstr "E531: GUIค๒ฅนฅฟกผฅศคนค๋คหคฯ \":gui\" ค๒ปศอัคทคฦคฏคภคตคค"
+msgid "E476: Invalid command"
+msgstr "E476: ฬตธ๚คสฅณฅฅ๓ฅษควคน"
-#~ msgid "E617: Cannot be changed in the GTK+ 2 GUI"
-#~ msgstr "E617: GTK+2 GUIควคฯสันนควคญคคปค๓"
+#, c-format
+msgid "E17: \"%s\" is a directory"
+msgstr "E17: \"%s\" คฯฅวฅฃฅ์ฅฏฅศฅ๊ควคน"
-#~ msgid "E596: Invalid font(s)"
-#~ msgstr "E596: ฬตธ๚คสฅีฅฉฅ๓ฅศควคน"
+#, c-format
+msgid "E364: Library call failed for \"%s()\""
+msgstr "E364: \"%s\"() คฮฅ้ฅคฅึฅ้ฅ๊ธฦฝะคหผบวิคทคคทคฟ"
-#~ msgid "E597: can't select fontset"
-#~ msgstr "E597: ฅีฅฉฅ๓ฅศฅปฅรฅศค๒มชย๒ควคญคคปค๓"
+msgid "E667: Fsync failed"
+msgstr "E667: fsync คหผบวิคทคคทคฟ"
-#~ msgid "E598: Invalid fontset"
-#~ msgstr "E598: ฬตธ๚คสฅีฅฉฅ๓ฅศฅปฅรฅศควคน"
+#, c-format
+msgid "E448: Could not load library function %s"
+msgstr "E448: ฅ้ฅคฅึฅ้ฅ๊คฮดุฟ๔ %s ค๒ฅํกผฅษควคญคคปค๓ควคทคฟ"
-#~ msgid "E533: can't select wide font"
-#~ msgstr "E533: ฅ๏ฅคฅษฅีฅฉฅ๓ฅศค๒มชย๒ควคญคคปค๓"
+msgid "E19: Mark has invalid line number"
+msgstr "E19: ฅกผฅฏคหฬตธ๚คสนิศึนๆคฌปุฤ๊คตค์คฦคคคคทคฟ"
-#~ msgid "E534: Invalid wide font"
-#~ msgstr "E534: ฬตธ๚คสฅ๏ฅคฅษฅีฅฉฅ๓ฅศควคน"
+msgid "E20: Mark not set"
+msgstr "E20: ฅกผฅฏคฯภ฿ฤ๊คตค์คฦคคคคปค๓"
-#~ msgid "E538: No mouse support"
-#~ msgstr "E538: ฅฅฆฅนคฯฅตฅกผฅศคตค์คคปค๓"
+msgid "E21: Cannot make changes, 'modifiable' is off"
+msgstr "E21: 'modifiable' คฌฅชฅีคสคฮควกขสันนควคญคคปค๓"
-#~ msgid "cannot open "
-#~ msgstr "ณซคฑคคปค๓ "
+msgid "E22: Scripts nested too deep"
+msgstr "E22: ฅนฅฏฅ๊ฅืฅศคฮฦค์ปาคฌฟผฒแคฎคคน"
-#~ msgid "VIM: Can't open window!\n"
-#~ msgstr "VIM: ฅฆฅฃฅ๓ฅษฅฆค๒ณซคฑคคปค๓!\n"
+msgid "E23: No alternate file"
+msgstr "E23: ษ๛ฅีฅกฅคฅ๋คฯคขค๊คคปค๓"
-#~ msgid "Need Amigados version 2.04 or later\n"
-#~ msgstr "Amigadosคฮฅะกผฅธฅ็ฅ๓ 2.04คซคฝค์ฐสน฿คฌษฌอืควคน\n"
+msgid "E24: No such abbreviation"
+msgstr "E24: คฝคฮค่คฆคสรปฝฬฦฮฯคฯคขค๊คคปค๓"
-#~ msgid "Need %s version %<PRId64>\n"
-#~ msgstr "%s คฮฅะกผฅธฅ็ฅ๓ %<PRId64> คฌษฌอืควคน\n"
+msgid "E477: No ! allowed"
+msgstr "E477: ! คฯต๖ฒฤคตค์คฦคคคคปค๓"
-#~ msgid "Cannot open NIL:\n"
-#~ msgstr "NILค๒ณซคฑคคปค๓:\n"
+msgid "E25: GUI cannot be used: Not enabled at compile time"
+msgstr "E25: GUIคฯปศอัษิฒฤวฝควคน: ฅณฅ๓ฅัฅคฅ๋ปคหฬตธ๚คหคตค์คฦคคคคน"
-#~ msgid "Cannot create "
-#~ msgstr "บ๎ภฎควคญคคปค๓ "
+msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
+msgstr "E26: ฅุฅึฅ้ฅคธ์คฯปศอัษิฒฤวฝควคน: ฅณฅ๓ฅัฅคฅ๋ปคหฬตธ๚คหคตค์คฦคคคคน\n"
-#~ msgid "Vim exiting with %d\n"
-#~ msgstr "Vimคฯ %d ควฝชฮปคทคคน\n"
+msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
+msgstr "E27: ฅฺฅ๋ฅทฅขธ์คฯปศอัษิฒฤวฝควคน: ฅณฅ๓ฅัฅคฅ๋ปคหฬตธ๚คหคตค์คฦคคคคน\n"
-#~ msgid "cannot change console mode ?!\n"
-#~ msgstr "ฅณฅ๓ฅฝกผฅ๋ฅโกผฅษค๒สันนควคญคคปค๓?!\n"
+msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
+msgstr "E800: ฅขฅ้ฅำฅขธ์คฯปศอัษิฒฤวฝควคน: ฅณฅ๓ฅัฅคฅ๋ปคหฬตธ๚คหคตค์คฦคคคคน\n"
-#~ msgid "mch_get_shellsize: not a console??\n"
-#~ msgstr "mch_get_shellsize: ฅณฅ๓ฅฝกผฅ๋ควคฯคสคค??\n"
+#, c-format
+msgid "E28: No such highlight group name: %s"
+msgstr "E28: คฝคฮค่คฆคสฬพคฮฅฯฅคฅ้ฅคฅศฅฐฅ๋กผฅืคฯคขค๊คคปค๓: %s"
-#~ msgid "E360: Cannot execute shell with -f option"
-#~ msgstr "E360: -f ฅชฅืฅทฅ็ฅ๓ควฅทฅงฅ๋ค๒ผยนิควคญคคปค๓"
+msgid "E29: No inserted text yet"
+msgstr "E29: คคภฅฦฅญฅนฅศคฌมฦคตค์คฦคคคคปค๓"
-#~ msgid "Cannot execute "
-#~ msgstr "ผยนิควคญคคปค๓ "
+msgid "E30: No previous command line"
+msgstr "E30: ฐสมฐคหฅณฅฅ๓ฅษนิคฌคขค๊คคปค๓"
-#~ msgid "shell "
-#~ msgstr "ฅทฅงฅ๋ "
+msgid "E31: No such mapping"
+msgstr "E31: คฝคฮค่คฆคสฅฅรฅิฅ๓ฅฐคฯคขค๊คคปค๓"
-#~ msgid " returned\n"
-#~ msgstr " ฬแค๊คคทคฟ\n"
+msgid "E479: No match"
+msgstr "E479: ณบล๖คฯคขค๊คคปค๓"
-#~ msgid "ANCHOR_BUF_SIZE too small."
-#~ msgstr "ANCHOR_BUF_SIZE คฌพฎคตฒแคฎคคน."
+#, c-format
+msgid "E480: No match: %s"
+msgstr "E480: ณบล๖คฯคขค๊คคปค๓: %s"
-#~ msgid "I/O ERROR"
-#~ msgstr "ฦฝะฮฯฅจฅ้กผ"
+msgid "E32: No file name"
+msgstr "E32: ฅีฅกฅคฅ๋ฬพคฌคขค๊คคปค๓"
-#~ msgid "Message"
-#~ msgstr "ฅแฅรฅปกผฅธ"
+msgid "E33: No previous substitute regular expression"
+msgstr "E33: ภตตฌษฝธฝรึดนคฌคคภผยนิคตค์คฦคคคคปค๓"
-#~ msgid "'columns' is not 80, cannot execute external commands"
-#~ msgstr "'columns' คฌ80ควคฯคสคคคฟคแ, ณฐษ๔ฅณฅฅ๓ฅษค๒ผยนิควคญคคปค๓"
+msgid "E34: No previous command"
+msgstr "E34: ฅณฅฅ๓ฅษคฌคคภผยนิคตค์คฦคคคคปค๓"
-#~ msgid "E237: Printer selection failed"
-#~ msgstr "E237: ฅืฅ๊ฅ๓ฅฟคฮมชย๒คหผบวิคทคคทคฟ"
+msgid "E35: No previous regular expression"
+msgstr "E35: ภตตฌษฝธฝคฌคคภผยนิคตค์คฦคคคคปค๓"
-#~ msgid "to %s on %s"
-#~ msgstr "%s คุ (%s พๅคฮ)"
+msgid "E481: No range allowed"
+msgstr "E481: ศฯฐฯปุฤ๊คฯต๖ฒฤคตค์คฦคคคคปค๓"
-#~ msgid "E613: Unknown printer font: %s"
-#~ msgstr "E613: ฬครฮคฮฅืฅ๊ฅ๓ฅฟฅชฅืฅทฅ็ฅ๓ควคน: %s"
+msgid "E36: Not enough room"
+msgstr "E36: ฅฆฅฃฅ๓ฅษฅฆคหฝฝสฌคสนโคตคโคทคฏคฯษคฌคขค๊คคปค๓"
-#~ msgid "E238: Print error: %s"
-#~ msgstr "E238: ฐ๕บฅจฅ้กผ: %s"
+#, c-format
+msgid "E247: no registered server named \"%s\""
+msgstr "E247: %s คศคคคฆฬพมฐคฮละฯฟคตค์คฟฅตกผฅะกผคฯคขค๊คคปค๓"
-#~ msgid "Printing '%s'"
-#~ msgstr "ฐ๕บคทคฦคคคคน: '%s'"
+#, c-format
+msgid "E482: Can't create file %s"
+msgstr "E482: ฅีฅกฅคฅ๋ %s ค๒บ๎ภฎควคญคคปค๓"
-#~ msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
-#~ msgstr "E244: สธป๚ฅปฅรฅศฬพ \"%s\" คฯษิภตควคน (ฅีฅฉฅ๓ฅศฬพ \"%s\")"
+msgid "E483: Can't get temp file name"
+msgstr "E483: ฐ์ปฅีฅกฅคฅ๋คฮฬพมฐค๒ผ่ฦภควคญคคปค๓"
-#~ msgid "E245: Illegal char '%c' in font name \"%s\""
-#~ msgstr "E245: '%c' คฯษิภตคสสธป๚ควคน (ฅีฅฉฅ๓ฅศฬพ \"%s\")"
+#, c-format
+msgid "E484: Can't open file %s"
+msgstr "E484: ฅีฅกฅคฅ๋ \"%s\" ค๒ณซคฑคคปค๓"
-#~ msgid "Vim: Double signal, exiting\n"
-#~ msgstr "Vim: 2ฝลคฮฅทฅฐฅสฅ๋คฮคฟคแ, ฝชฮปคทคคน\n"
+#, c-format
+msgid "E485: Can't read file %s"
+msgstr "E485: ฅีฅกฅคฅ๋ %s ค๒ฦษนคแคคปค๓"
-#~ msgid "Vim: Caught deadly signal %s\n"
-#~ msgstr "Vim: รืฬฟลชฅทฅฐฅสฅ๋ %s ค๒ธกรฮคทคคทคฟ\n"
+msgid "E38: Null argument"
+msgstr "E38: ฐ๚ฟ๔คฌถ๕ควคน"
-#~ msgid "Vim: Caught deadly signal\n"
-#~ msgstr "Vim: รืฬฟลชฅทฅฐฅสฅ๋ค๒ธกรฮคทคคทคฟ\n"
+msgid "E39: Number expected"
+msgstr "E39: ฟ๔รอคฌอืตแคตค์คฦคคคคน"
-#~ msgid "Opening the X display took %<PRId64> msec"
-#~ msgstr "Xฅตกผฅะคุคฮภยณคห %<PRId64> ฅ฿ฅ๊ษรคซคซค๊คคทคฟ"
+#, c-format
+msgid "E40: Can't open errorfile %s"
+msgstr "E40: ฅจฅ้กผฅีฅกฅคฅ๋ %s ค๒ณซคฑคคปค๓"
-#~ msgid ""
-#~ "\n"
-#~ "Vim: Got X error\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Vim: X คฮฅจฅ้กผค๒ธกฝะคทคคทคฟr\n"
+msgid "E233: cannot open display"
+msgstr "E233: ฅวฅฃฅนฅืฅ์ฅคค๒ณซคฑคคปค๓"
-#~ msgid "Testing the X display failed"
-#~ msgstr "X display คฮฅมฅงฅรฅฏคหผบวิคทคคทคฟ"
+msgid "E41: Out of memory!"
+msgstr "E41: ฅแฅโฅ๊คฌฟิคญฒฬคฦคคทคฟ!"
-#~ msgid "Opening the X display timed out"
-#~ msgstr "X display คฮ open คฌฅฟฅคฅเฅขฅฆฅศคทคคทคฟ"
+msgid "Pattern not found"
+msgstr "ฅัฅฟกผฅ๓คฯธซคฤคซค๊คคปค๓ควคทคฟ"
-#~ msgid ""
-#~ "\n"
-#~ "Cannot execute shell sh\n"
-#~ msgstr ""
-#~ "\n"
-#~ "sh ฅทฅงฅ๋ค๒ผยนิควคญคคปค๓\n"
+#, c-format
+msgid "E486: Pattern not found: %s"
+msgstr "E486: ฅัฅฟกผฅ๓คฯธซคฤคซค๊คคปค๓ควคทคฟ: %s"
-#~ msgid ""
-#~ "\n"
-#~ "Cannot create pipes\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ฅัฅคฅืค๒บ๎ภฎควคญคคปค๓\n"
+msgid "E487: Argument must be positive"
+msgstr "E487: ฐ๚ฟ๔คฯภตคฮรอควคสคฑค์คะคสค๊คคปค๓"
-#~ msgid ""
-#~ "\n"
-#~ "Cannot fork\n"
-#~ msgstr ""
-#~ "\n"
-#~ "fork ควคญคคปค๓\n"
+msgid "E459: Cannot go back to previous directory"
+msgstr "E459: มฐคฮฅวฅฃฅ์ฅฏฅศฅ๊คหฬแค์คคปค๓"
-#~ msgid ""
-#~ "\n"
-#~ "Command terminated\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ฅณฅฅ๓ฅษค๒รๆรวคทคคทคฟ\n"
+msgid "E42: No Errors"
+msgstr "E42: ฅจฅ้กผคฯคขค๊คคปค๓"
-#~ msgid "XSMP lost ICE connection"
-#~ msgstr "XSMP คฌICEภยณค๒ผบคคคคทคฟ"
+msgid "E776: No location list"
+msgstr "E776: ฅํฅฑกผฅทฅ็ฅ๓ฅ๊ฅนฅศคฯคขค๊คคปค๓"
-#~ msgid "Opening the X display failed"
-#~ msgstr "X display คฮ open คหผบวิคทคคทคฟ"
+msgid "E43: Damaged match string"
+msgstr "E43: ณบล๖สธป๚ฮ๓คฌวหยปคทคฦคคคคน"
-#~ msgid "XSMP handling save-yourself request"
-#~ msgstr "XSMP คฌsave-yourselfอืตแค๒ฝ่อคทคฦคคคคน"
+msgid "E44: Corrupted regexp program"
+msgstr "E44: ษิภตคสภตตฌษฝธฝฅืฅํฅฐฅ้ฅเควคน"
-#~ msgid "XSMP opening connection"
-#~ msgstr "XSMP คฌภยณค๒ณซปฯคทคฦคคคคน"
+msgid "E45: 'readonly' option is set (add ! to override)"
+msgstr "E45: 'readonly' ฅชฅืฅทฅ็ฅ๓คฌภ฿ฤ๊คตค์คฦคคคคน (! ค๒ฤษฒรควพๅฝ๑คญ)"
-#~ msgid "XSMP ICE connection watch failed"
-#~ msgstr "XSMP ICEภยณคฌผบวิคทคฟค่คฆควคน"
+#, c-format
+msgid "E46: Cannot change read-only variable \"%s\""
+msgstr "E46: ฦษผ่ภ์อัสัฟ๔ \"%s\" คหคฯรอค๒ภ฿ฤ๊ควคญคคปค๓"
-#~ msgid "XSMP SmcOpenConnection failed: %s"
-#~ msgstr "XSMP SmcOpenConnectionคฌผบวิคทคคทคฟ: %s"
+#, c-format
+msgid "E794: Cannot set variable in the sandbox: \"%s\""
+msgstr "E794: ฅตฅ๓ฅษฅฅรฅฏฅนควคฯสัฟ๔ \"%s\" คหรอค๒ภ฿ฤ๊ควคญคคปค๓"
-#~ msgid "At line"
-#~ msgstr "นิ"
+msgid "E713: Cannot use empty key for Dictionary"
+msgstr "E713: ผญฝ๑ทฟคหถ๕คฮฅญกผค๒ปศคฆคณคศคฯควคญคคปค๓"
-#~ msgid "Could not load vim32.dll!"
-#~ msgstr "vim32.dll ค๒ฅํกผฅษควคญคคปค๓ควคทคฟ"
+msgid "E715: Dictionary required"
+msgstr "E715: ผญฝ๑ทฟคฌษฌอืควคน"
-#~ msgid "VIM Error"
-#~ msgstr "VIMฅจฅ้กผ"
+#, c-format
+msgid "E684: list index out of range: %ld"
+msgstr "E684: ฅ๊ฅนฅศคฮฅคฅ๓ฅวฅรฅฏฅนคฌศฯฐฯณฐควคน: %ld"
-#~ msgid "Could not fix up function pointers to the DLL!"
-#~ msgstr "DLLคซค้ดุฟ๔ฅฅคฅ๓ฅฟค๒ผ่ฦภควคญคคปค๓ควคทคฟ"
+#, c-format
+msgid "E118: Too many arguments for function: %s"
+msgstr "E118: ดุฟ๔คฮฐ๚ฟ๔คฌยฟฒแคฎคคน: %s"
-#~ msgid "shell returned %d"
-#~ msgstr "ฅทฅงฅ๋คฌฅณกผฅษ %d ควฝชฮปคทคคทคฟ"
+#, c-format
+msgid "E716: Key not present in Dictionary: %s"
+msgstr "E716: ผญฝ๑ทฟคหฅญกผคฌยธบ฿คทคคปค๓: %s"
-#~ msgid "Vim: Caught %s event\n"
-#~ msgstr "Vim: ฅคฅูฅ๓ฅศ %s ค๒ธกรฮ\n"
+msgid "E714: List required"
+msgstr "E714: ฅ๊ฅนฅศทฟคฌษฌอืควคน"
-#~ msgid "close"
-#~ msgstr "สฤคธค๋"
+#, c-format
+msgid "E712: Argument of %s must be a List or Dictionary"
+msgstr "E712: %s คฮฐ๚ฟ๔คฯฅ๊ฅนฅศทฟคคฟคฯผญฝ๑ทฟควคสคฑค์คะคสค๊คคปค๓"
-#~ msgid "logoff"
-#~ msgstr "ฅํฅฐฅชฅี"
+msgid "E47: Error while reading errorfile"
+msgstr "E47: ฅจฅ้กผฅีฅกฅคฅ๋คฮฦษนรๆคหฅจฅ้กผคฌศฏภธคทคคทคฟ"
-#~ msgid "shutdown"
-#~ msgstr "ฅทฅใฅรฅศฅภฅฆฅ๓"
+msgid "E48: Not allowed in sandbox"
+msgstr "E48: ฅตฅ๓ฅษฅฅรฅฏฅนควคฯต๖คตค์คคปค๓"
-#~ msgid "E371: Command not found"
-#~ msgstr "E371: ฅณฅฅ๓ฅษคฌคขค๊คคปค๓"
-
-#~ msgid ""
-#~ "VIMRUN.EXE not found in your $PATH.\n"
-#~ "External commands will not pause after completion.\n"
-#~ "See :help win32-vimrun for more information."
-#~ msgstr ""
-#~ "VIMRUN.EXEคฌ $PATH คฮรๆคหธซคฤคซค๊คคปค๓.\n"
-#~ "ณฐษ๔ฅณฅฅ๓ฅษคฮฝชฮปธๅคหฐ์ปฤไป฿ค๒คทคคปค๓.\n"
-#~ "พบูคฯ :help win32-vimrun ค๒ปฒพศคทคฦคฏคภคตคค."
-
-#~ msgid "Vim Warning"
-#~ msgstr "Vimคฮทูน๐"
-
-#~ msgid "Error file"
-#~ msgstr "ฅจฅ้กผฅีฅกฅคฅ๋"
-
-#~ msgid "E868: Error building NFA with equivalence class!"
-#~ msgstr "E868: ล๙ฒมฅฏฅ้ฅนค๒ดคเNFAนฝรคหผบวิคทคคทคฟ!"
-
-#~ msgid "E878: (NFA) Could not allocate memory for branch traversal!"
-#~ msgstr "E878: (NFA) ธฝบ฿ฒฃรวรๆคฮฅึฅ้ฅ๓ฅมคหฝฝสฌคสฅแฅโฅ๊ค๒ณไค๊ล๖คฦค้ค์คคปค๓!"
-
-#~ msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\""
-#~ msgstr ""
-#~ "ทูน๐: รฑธ์ฅ๊ฅนฅศ \"%s_%s.spl\" คชค่คำ \"%s_ascii.spl\" คฯธซคฤคซค๊คคปค๓"
-
-#~ msgid "Conversion in %s not supported"
-#~ msgstr "%s ฦโคฮสัดนคฯฅตฅกผฅศคตค์คฦคคคคปค๓"
-
-#~ msgid "E845: Insufficient memory, word list will be incomplete"
-#~ msgstr "E845: ฅแฅโฅ๊คฌยญค๊คสคคคฮควกขรฑธ์ฅ๊ฅนฅศคฯษิดฐมดควคน"
-
-#~ msgid "E430: Tag file path truncated for %s\n"
-#~ msgstr "E430: ฅฟฅฐฅีฅกฅคฅ๋คฮฅัฅนคฌ %s คหภฺค๊ผฮคฦค้ค์คคทคฟ\n"
-
-#~ msgid "new shell started\n"
-#~ msgstr "ฟทคทคคฅทฅงฅ๋ค๒ตฏฦฐคทคคน\n"
-
-#~ msgid "Used CUT_BUFFER0 instead of empty selection"
-#~ msgstr "ถ๕คฮมชย๒ฮฮฐ่คฮคซค๏ค๊คหCUT_BUFFER0คฌปศอัคตค์คคทคฟ"
-
-#~ msgid "No undo possible; continue anyway"
-#~ msgstr "ฒฤวฝคสฅขฅ๓ฅษฅฅคฯคขค๊คคปค๓: คศค๊คขคจคบยณคฑคคน"
-
-#~ msgid "E832: Non-encrypted file has encrypted undo file: %s"
-#~ msgstr ""
-#~ "E832: ศ๓ฐลนๆฒฝฅีฅกฅคฅ๋คฌฐลนๆฒฝคตค์คฟฅขฅ๓ฅษฅฅฅีฅกฅคฅ๋ค๒ปศครคฦคคน: %s"
-
-#~ msgid "E826: Undo file decryption failed: %s"
-#~ msgstr "E826: ฐลนๆฒฝคตค์คฟฅขฅ๓ฅษฅฅฅีฅกฅคฅ๋คฮฒ๒ฦษคหผบวิคทคคทคฟ: %s"
-
-#~ msgid "E827: Undo file is encrypted: %s"
-#~ msgstr "E827: ฅขฅ๓ฅษฅฅฅีฅกฅคฅ๋คฌฐลนๆฒฝคตค์คฦคคคคน: %s"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16/32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 16/32 ฅำฅรฅศ GUI ศว"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 64 ฅำฅรฅศ GUI ศว"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 32 ฅำฅรฅศ GUI ศว"
-
-#~ msgid " in Win32s mode"
-#~ msgstr " in Win32s ฅโกผฅษ"
-
-#~ msgid " with OLE support"
-#~ msgstr " with OLE ฅตฅกผฅศ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 64 ฅำฅรฅศ ฅณฅ๓ฅฝกผฅ๋ ศว"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 32 ฅำฅรฅศ ฅณฅ๓ฅฝกผฅ๋ ศว"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16-bit version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 16 ฅำฅรฅศ ศว"
-
-#~ msgid ""
-#~ "\n"
-#~ "32-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "32 ฅำฅรฅศ MS-DOS ศว"
-
-#~ msgid ""
-#~ "\n"
-#~ "16-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "16 ฅำฅรฅศ MS-DOS ศว"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X (unix) version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS X (unix) ศว"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS X ศว"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS ศว"
-
-#~ msgid ""
-#~ "\n"
-#~ "OpenVMS version"
-#~ msgstr ""
-#~ "\n"
-#~ "OpenVMS ศว"
-
-#~ msgid ""
-#~ "\n"
-#~ "Big version "
-#~ msgstr ""
-#~ "\n"
-#~ "Big ศว "
-
-#~ msgid ""
-#~ "\n"
-#~ "Normal version "
-#~ msgstr ""
-#~ "\n"
-#~ "ฤฬพ๏ ศว "
-
-#~ msgid ""
-#~ "\n"
-#~ "Small version "
-#~ msgstr ""
-#~ "\n"
-#~ "Small ศว "
-
-#~ msgid ""
-#~ "\n"
-#~ "Tiny version "
-#~ msgstr ""
-#~ "\n"
-#~ "Tiny ศว "
-
-#~ msgid "with GTK2-GNOME GUI."
-#~ msgstr "with GTK2-GNOME GUI."
+msgid "E523: Not allowed here"
+msgstr "E523: คณคณควคฯต๖ฒฤคตค์คคปค๓"
-#~ msgid "with GTK2 GUI."
-#~ msgstr "with GTK2 GUI."
+msgid "E359: Screen mode setting not supported"
+msgstr "E359: ฅนฅฏฅ๊กผฅ๓ฅโกผฅษคฮภ฿ฤ๊คหคฯยะฑคทคฦคคคคปค๓"
-#~ msgid "with X11-Motif GUI."
-#~ msgstr "with X11-Motif GUI."
+msgid "E49: Invalid scroll size"
+msgstr "E49: ฬตธ๚คสฅนฅฏฅํกผฅ๋ฮฬควคน"
-#~ msgid "with X11-neXtaw GUI."
-#~ msgstr "with X11-neXtaw GUI."
+msgid "E91: 'shell' option is empty"
+msgstr "E91: 'shell' ฅชฅืฅทฅ็ฅ๓คฌถ๕ควคน"
-#~ msgid "with X11-Athena GUI."
-#~ msgstr "with X11-Athena GUI."
+msgid "E255: Couldn't read in sign data!"
+msgstr "E255: sign คฮฅวกผฅฟค๒ฦษนคแคคปค๓ควคทคฟ"
-#~ msgid "with Photon GUI."
-#~ msgstr "with Photon GUI."
+msgid "E72: Close error on swap file"
+msgstr "E72: ฅนฅ๏ฅรฅืฅีฅกฅคฅ๋คฮฅฏฅํกผฅบปฅจฅ้กผควคน"
-#~ msgid "with GUI."
-#~ msgstr "with GUI."
+msgid "E73: tag stack empty"
+msgstr "E73: ฅฟฅฐฅนฅฟฅรฅฏคฌถ๕ควคน"
-#~ msgid "with Carbon GUI."
-#~ msgstr "with Carbon GUI."
+msgid "E74: Command too complex"
+msgstr "E74: ฅณฅฅ๓ฅษคฌสฃปจฒแคฎคคน"
-#~ msgid "with Cocoa GUI."
-#~ msgstr "with Cocoa GUI."
+msgid "E75: Name too long"
+msgstr "E75: ฬพมฐคฌฤนฒแคฎคคน"
-#~ msgid "with (classic) GUI."
-#~ msgstr "with (ฅฏฅ้ฅทฅรฅฏ) GUI."
+msgid "E76: Too many ["
+msgstr "E76: [ คฌยฟฒแคฎคคน"
-#~ msgid " system gvimrc file: \""
-#~ msgstr " ฅทฅนฅฦฅเ gvimrc: \""
+msgid "E77: Too many file names"
+msgstr "E77: ฅีฅกฅคฅ๋ฬพคฌยฟฒแคฎคคน"
-#~ msgid " user gvimrc file: \""
-#~ msgstr " ฅๆกผฅถ gvimrc: \""
+msgid "E488: Trailing characters"
+msgstr "E488: อพสฌคสสธป๚คฌธๅคํคหคขค๊คคน"
-#~ msgid "2nd user gvimrc file: \""
-#~ msgstr " ย่2ฅๆกผฅถ gvimrc: \""
+msgid "E78: Unknown mark"
+msgstr "E78: ฬครฮคฮฅกผฅฏ"
-#~ msgid "3rd user gvimrc file: \""
-#~ msgstr " ย่3ฅๆกผฅถ gvimrc: \""
+msgid "E79: Cannot expand wildcards"
+msgstr "E79: ฅ๏ฅคฅ๋ฅษฅซกผฅษค๒ลธณซควคญคคปค๓"
-#~ msgid " system menu file: \""
-#~ msgstr " ฅทฅนฅฦฅเฅแฅหฅๅกผ: \""
+msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
+msgstr "E591: 'winheight' คฯ 'winminheight' ค่ค๊พฎคตคฏควคญคคปค๓"
-#~ msgid "Compiler: "
-#~ msgstr "ฅณฅ๓ฅัฅคฅ้: "
+msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
+msgstr "E592: 'winwidth' คฯ 'winminwidth' ค่ค๊พฎคตคฏควคญคคปค๓"
-#~ msgid "menu Help->Orphans for information "
-#~ msgstr "พบูคฯฅแฅหฅๅกผคฮ ฅุฅ๋ฅืขชธษป๙ ค๒ปฒพศคทคฦฒผคตคค "
+msgid "E80: Error while writing"
+msgstr "E80: ฝ๑นค฿รๆคฮฅจฅ้กผ"
-#~ msgid "Running modeless, typed text is inserted"
-#~ msgstr "ฅโกผฅษฬตควผยนิรๆ, ฅฟฅคฅืคทคฟสธป๚คฌมฦคตค์คคน"
+msgid "E939: Positive count required"
+msgstr "E939: ภตคฮฅซฅฆฅ๓ฅศคฌษฌอืควคน"
-#~ msgid "menu Edit->Global Settings->Toggle Insert Mode "
-#~ msgstr "ฅแฅหฅๅกผคฮ สิฝธขชมดยฮภ฿ฤ๊ขชมฦ(ฝ้ฟดผิ)ฅโกผฅษภฺยุ "
+msgid "E81: Using <SID> not in a script context"
+msgstr "E81: ฅนฅฏฅ๊ฅืฅศฐสณฐคว<SID>คฌปศค๏ค์คคทคฟ"
-#~ msgid " for two modes "
-#~ msgstr " ควฅโกผฅษอญคห "
+msgid "E449: Invalid expression received"
+msgstr "E449: ฬตธ๚คสผฐค๒ผ๕คฑผ่ค๊คคทคฟ"
-#~ msgid "menu Edit->Global Settings->Toggle Vi Compatible"
-#~ msgstr "ฅแฅหฅๅกผคฮ สิฝธขชมดยฮภ฿ฤ๊ขชViธ฿ดนฅโกผฅษภฺยุ "
+msgid "E463: Region is guarded, cannot modify"
+msgstr "E463: ฮฮฐ่คฌสธ๎คตค์คฦคคค๋คฮควกขสันนควคญคคปค๓"
-#~ msgid " for Vim defaults "
-#~ msgstr " ควVimคศคทคฦฦฐบ๎ "
+msgid "E744: NetBeans does not allow changes in read-only files"
+msgstr "E744: NetBeans คฯฦษนภ์อัฅีฅกฅคฅ๋ค๒สันนคนค๋คณคศค๒ต๖คทคคปค๓"
-#~ msgid "WARNING: Windows 95/98/ME detected"
-#~ msgstr " ทูน๐: Windows 95/98/Me ค๒ธกฝะ "
+msgid "E363: pattern uses more memory than 'maxmempattern'"
+msgstr "E363: ฅัฅฟกผฅ๓คฌ 'maxmempattern' ฐสพๅคฮฅแฅโฅ๊ค๒ปศอัคทคคน"
-#~ msgid "type :help windows95<Enter> for info on this"
-#~ msgstr " พบูคสพ๐ส๓คฯ :help windows95<Enter> "
+msgid "E749: empty buffer"
+msgstr "E749: ฅะฅรฅีฅกคฌถ๕ควคน"
-#~ msgid "Edit with &multiple Vims"
-#~ msgstr "สฃฟ๔คฮVimควสิฝธคนค๋ (&M)"
+#, c-format
+msgid "E86: Buffer %ld does not exist"
+msgstr "E86: ฅะฅรฅีฅก %ld คฯคขค๊คคปค๓"
-#~ msgid "Edit with single &Vim"
-#~ msgstr "1คฤคฮVimควสิฝธคนค๋ (&V)"
+msgid "E682: Invalid search pattern or delimiter"
+msgstr "E682: ธกบ๗ฅัฅฟกผฅ๓คซถ่ภฺค๊ตญนๆคฌษิภตควคน"
-#~ msgid "Diff with Vim"
-#~ msgstr "Vimควบนสฌค๒ษฝผจคนค๋"
+msgid "E139: File is loaded in another buffer"
+msgstr "E139: ฦฑคธฬพมฐคฮฅีฅกฅคฅ๋คฌยพคฮฅะฅรฅีฅกควฦษนคค์คฦคคคคน"
-#~ msgid "Edit with &Vim"
-#~ msgstr "Vimควสิฝธคนค๋ (&V)"
+#, c-format
+msgid "E764: Option '%s' is not set"
+msgstr "E764: ฅชฅืฅทฅ็ฅ๓ '%s' คฯภ฿ฤ๊คตค์คฦคคคคปค๓"
-#~ msgid "Edit with existing Vim - "
-#~ msgstr "ตฏฦฐบัคฮVimควสิฝธคนค๋ - "
+msgid "E850: Invalid register name"
+msgstr "E850: ฬตธ๚คสฅ์ฅธฅนฅฟฬพควคน"
-#~ msgid "Edits the selected file(s) with Vim"
-#~ msgstr "มชย๒คทคฟฅีฅกฅคฅ๋ค๒Vimควสิฝธคนค๋"
+#, c-format
+msgid "E919: Directory not found in '%s': \"%s\""
+msgstr "E919: ฅวฅฃฅ์ฅฏฅศฅ๊คฌ '%s' คฮรๆคหคขค๊คคปค๓: \"%s\""
-#~ msgid "Error creating process: Check if gvim is in your path!"
-#~ msgstr "ฅืฅํฅปฅนคฮบ๎ภฎคหผบวิ: gvimคฌดฤถญสัฟ๔PATHพๅคหคขค๋คซณฮวงคทคฦคฏคภคตคค!"
+msgid "E952: Autocommand caused recursive behavior"
+msgstr "E952: Autocommandคฌบฦตขค๒ฐ๚คญตฏคณคทคคทคฟ"
-#~ msgid "gvimext.dll error"
-#~ msgstr "gvimext.dll ฅจฅ้กผ"
+msgid "search hit TOP, continuing at BOTTOM"
+msgstr "พๅคควธกบ๗คทคฟคฮควฒผคหฬแค๊คคน"
-#~ msgid "Path length too long!"
-#~ msgstr "ฅัฅนคฌฤนคนคฎคคน!"
+msgid "search hit BOTTOM, continuing at TOP"
+msgstr "ฒผคควธกบ๗คทคฟคฮควพๅคหฬแค๊คคน"
-#~ msgid "E234: Unknown fontset: %s"
-#~ msgstr "E234: ฬครฮคฮฅีฅฉฅ๓ฅศฅปฅรฅศ: %s"
+#, c-format
+msgid "Need encryption key for \"%s\""
+msgstr "ฐลนๆฅญกผคฌษฌอืควคน: \"%s\""
-#~ msgid "E235: Unknown font: %s"
-#~ msgstr "E235: ฬครฮคฮฅีฅฉฅ๓ฅศ: %s"
+msgid "empty keys are not allowed"
+msgstr "ถ๕คฮฅญกผคฯต๖ฒฤคตค์คฦคคคคปค๓"
-#~ msgid "E236: Font \"%s\" is not fixed-width"
-#~ msgstr "E236: ฅีฅฉฅ๓ฅศ \"%s\" คฯธวฤ๊ษควคฯคขค๊คคปค๓"
+msgid "dictionary is locked"
+msgstr "ผญฝ๑คฯฅํฅรฅฏคตค์คฦคคคคน"
-#~ msgid "E448: Could not load library function %s"
-#~ msgstr "E448: ฅ้ฅคฅึฅ้ฅ๊คฮดุฟ๔ %s ค๒ฅํกผฅษควคญคคปค๓ควคทคฟ"
+msgid "list is locked"
+msgstr "ฅ๊ฅนฅศคฯฅํฅรฅฏคตค์คฦคคคคน"
-#~ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
-#~ msgstr "E26: ฅุฅึฅ้ฅคธ์คฯปศอัษิฒฤวฝควคน: ฅณฅ๓ฅัฅคฅ๋ปคหฬตธ๚คหคตค์คฦคคคคน\n"
+#, c-format
+msgid "failed to add key '%s' to dictionary"
+msgstr "ผญฝ๑คหฅญกผ '%s' ค๒ฤษฒรคนค๋คฮคหผบวิคทคคทคฟ"
-#~ msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
-#~ msgstr "E27: ฅฺฅ๋ฅทฅขธ์คฯปศอัษิฒฤวฝควคน: ฅณฅ๓ฅัฅคฅ๋ปคหฬตธ๚คหคตค์คฦคคคคน\n"
+#, c-format
+msgid "index must be int or slice, not %s"
+msgstr "ฅคฅ๓ฅวฅรฅฏฅนคฯ %s ควคฯคสคฏภฐฟ๔คซฅนฅ้ฅคฅนคหคทคฦคฏคภคตคค"
-#~ msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
-#~ msgstr ""
-#~ "E800: ฅขฅ้ฅำฅขธ์คฯปศอัษิฒฤวฝควคน: ฅณฅ๓ฅัฅคฅ๋ปคหฬตธ๚คหคตค์คฦคคคคน\n"
+#, c-format
+msgid "expected str() or unicode() instance, but got %s"
+msgstr "str() คโคทคฏคฯ unicode() คฮฅคฅ๓ฅนฅฟฅ๓ฅนคฌดยิคตค์คฦคคค๋คฮคห %s ควคทคฟ"
-#~ msgid "E247: no registered server named \"%s\""
-#~ msgstr "E247: %s คศคคคฆฬพมฐคฮละฯฟคตค์คฟฅตกผฅะคฯคขค๊คคปค๓"
+#, c-format
+msgid "expected bytes() or str() instance, but got %s"
+msgstr "bytes() คโคทคฏคฯ str() คฮฅคฅ๓ฅนฅฟฅ๓ฅนคฌดยิคตค์คฦคคค๋คฮคห %s ควคทคฟ"
-#~ msgid "E233: cannot open display"
-#~ msgstr "E233: ฅวฅฃฅนฅืฅ์ฅคค๒ณซคฑคคปค๓"
+#, c-format
+msgid ""
+"expected int(), long() or something supporting coercing to long(), but got %s"
+msgstr "long() คซคฝค์คุสัดนฒฤวฝคสคโคฮคฌดยิคตค์คฦคคค๋คฮคห %s ควคทคฟ"
-#~ msgid "E449: Invalid expression received"
-#~ msgstr "E449: ฬตธ๚คสผฐค๒ผ๕คฑผ่ค๊คคทคฟ"
+#, c-format
+msgid "expected int() or something supporting coercing to int(), but got %s"
+msgstr "int() คซคฝค์คุสัดนฒฤวฝคสคโคฮคฌดยิคตค์คฦคคค๋คฮคห %s ควคทคฟ"
-#~ msgid "E463: Region is guarded, cannot modify"
-#~ msgstr "E463: ฮฮฐ่คฌสธ๎คตค์คฦคคค๋คฮคว, สันนควคญคคปค๓"
+msgid "value is too large to fit into C int type"
+msgstr "Cธภธ์คฮ int ทฟคศคทคฦคฯรอคฌย็คญฒแคฎคคน"
-#~ msgid "E744: NetBeans does not allow changes in read-only files"
-#~ msgstr "E744: NetBeans คฯฦษนภ์อัฅีฅกฅคฅ๋ค๒สันนคนค๋คณคศค๒ต๖คทคคปค๓"
+msgid "value is too small to fit into C int type"
+msgstr "Cธภธ์คฮ int ทฟคศคทคฦคฯรอคฌพฎคตฒแคฎคคน"
-#~ msgid "Need encryption key for \"%s\""
-#~ msgstr "ฐลนๆฅญกผคฌษฌอืควคน: \"%s\""
+msgid "number must be greater than zero"
+msgstr "ฟ๔รอคฯ 0 ค่ค๊ย็คญคฏคสคฑค์คะคสค๊คคปค๓"
-#~ msgid "empty keys are not allowed"
-#~ msgstr "ถ๕คฮฅญกผคฯต๖ฒฤคตค์คฦคคคคปค๓"
+msgid "number must be greater or equal to zero"
+msgstr "ฟ๔รอคฯ 0 คซคฝค์ฐสพๅควคสคฑค์คะคสค๊คคปค๓"
-#~ msgid "dictionary is locked"
-#~ msgstr "ผญฝ๑คฯฅํฅรฅฏคตค์คฦคคคคน"
+msgid "can't delete OutputObject attributes"
+msgstr "OutputObjectยฐภญค๒พรคปคคปค๓"
-#~ msgid "list is locked"
-#~ msgstr "ฅ๊ฅนฅศคฯฅํฅรฅฏคตค์คฦคคคคน"
+#, c-format
+msgid "invalid attribute: %s"
+msgstr "ฬตธ๚คสยฐภญควคน: %s"
-#~ msgid "failed to add key '%s' to dictionary"
-#~ msgstr "ผญฝ๑คหฅญกผ '%s' ค๒ฤษฒรคนค๋คฮคหผบวิคทคคทคฟ"
+msgid "E264: Python: Error initialising I/O objects"
+msgstr "E264: Python: I/Oฅชฅึฅธฅงฅฏฅศคฮฝ้ดฒฝฅจฅ้กผ"
-#~ msgid "index must be int or slice, not %s"
-#~ msgstr "ฅคฅ๓ฅวฅรฅฏฅนคฯ %s ควคฯคสคฏภฐฟ๔คซฅนฅ้ฅคฅนคหคทคฦคฏคภคตคค"
+msgid "failed to change directory"
+msgstr "ผญฝ๑คฮสันนคหผบวิคทคคทคฟ"
-#~ msgid "expected str() or unicode() instance, but got %s"
-#~ msgstr ""
-#~ "str() คโคทคฏคฯ unicode() คฮฅคฅ๓ฅนฅฟฅ๓ฅนคฌดยิคตค์คฦคคค๋คฮคห %s ควคทคฟ"
+#, c-format
+msgid "expected 3-tuple as imp.find_module() result, but got %s"
+msgstr "imp.find_module() คฌ %s ค๒สึคทคคทคฟ (ดยิรอ: 3 อืมวคฮฅฟฅืฅ๋)"
-#~ msgid "expected bytes() or str() instance, but got %s"
-#~ msgstr "bytes() คโคทคฏคฯ str() คฮฅคฅ๓ฅนฅฟฅ๓ฅนคฌดยิคตค์คฦคคค๋คฮคห %s ควคทคฟ"
+#, c-format
+msgid "expected 3-tuple as imp.find_module() result, but got tuple of size %d"
+msgstr "imp.find_module() คฌ %d อืมวคฮฅฟฅืฅ๋ค๒สึคทคคทคฟ (ดยิรอ: 3)"
-#~ msgid ""
-#~ "expected int(), long() or something supporting coercing to long(), but "
-#~ "got %s"
-#~ msgstr "long() คซคฝค์คุสัดนฒฤวฝคสคโคฮคฌดยิคตค์คฦคคค๋คฮคห %s ควคทคฟ"
+msgid "internal error: imp.find_module returned tuple with NULL"
+msgstr "ฦโษ๔ฅจฅ้กผ: imp.find_module คฌ NULL ค๒ดคเฅฟฅืฅ๋ค๒สึคทคคทคฟ"
-#~ msgid "expected int() or something supporting coercing to int(), but got %s"
-#~ msgstr "int() คซคฝค์คุสัดนฒฤวฝคสคโคฮคฌดยิคตค์คฦคคค๋คฮคห %s ควคทคฟ"
+msgid "cannot delete vim.Dictionary attributes"
+msgstr "vim.Dictionaryยฐภญคฯพรคปคคปค๓"
-#~ msgid "value is too large to fit into C int type"
-#~ msgstr "Cธภธ์คฮ int ทฟคศคทคฦคฯรอคฌย็คญฒแคฎคคน"
+msgid "cannot modify fixed dictionary"
+msgstr "ธวฤ๊คตค์คฟผญฝ๑คฯสันนควคญคคปค๓"
-#~ msgid "value is too small to fit into C int type"
-#~ msgstr "Cธภธ์คฮ int ทฟคศคทคฦคฯรอคฌพฎคตฒแคฎคคน"
+#, c-format
+msgid "cannot set attribute %s"
+msgstr "ยฐภญ %s คฯภ฿ฤ๊ควคญคคปค๓"
-#~ msgid "number must be greater then zero"
-#~ msgstr "ฟ๔รอคฯ 0 ค่ค๊ย็คญคฏคสคฑค์คะคสค๊คคปค๓"
+msgid "hashtab changed during iteration"
+msgstr "ฅคฅฦฅ์กผฅทฅ็ฅ๓รๆคห hashtab คฌสันนคตค์คคทคฟ"
-#~ msgid "number must be greater or equal to zero"
-#~ msgstr "ฟ๔รอคฯ 0 คซคฝค์ฐสพๅควคสคฑค์คะคสค๊คคปค๓"
+#, c-format
+msgid "expected sequence element of size 2, but got sequence of size %d"
+msgstr "ฅทกผฅฑฅ๓ฅนคฮอืมวฟ๔คหคฯ 2 คฌดยิคตค์คฦคคคคทคฟคฌ %d ควคทคฟ"
-#~ msgid "can't delete OutputObject attributes"
-#~ msgstr "OutputObjectยฐภญค๒พรคปคคปค๓"
+msgid "list constructor does not accept keyword arguments"
+msgstr "ฅ๊ฅนฅศคฮฅณฅ๓ฅนฅศฅ้ฅฏฅฟคฯฅญกผฅ๏กผฅษฐ๚ฟ๔ค๒ผ๕คฑษีคฑคคปค๓"
-#~ msgid "invalid attribute: %s"
-#~ msgstr "ฬตธ๚คสยฐภญควคน: %s"
+msgid "list index out of range"
+msgstr "ฅ๊ฅนฅศศฯฐฯณฐคฮฅคฅ๓ฅวฅรฅฏฅนควคน"
-#~ msgid "E264: Python: Error initialising I/O objects"
-#~ msgstr "E264: Python: I/Oฅชฅึฅธฅงฅฏฅศคฮฝ้ดฒฝฅจฅ้กผ"
+#, c-format
+msgid "internal error: failed to get vim list item %d"
+msgstr "ฦโษ๔ฅจฅ้กผ: vimคฮฅ๊ฅนฅศอืมว %d คฮผ่ฦภคหผบวิคทคคทคฟ"
-#~ msgid "failed to change directory"
-#~ msgstr "ผญฝ๑คฮสันนคหผบวิคทคคทคฟ"
+msgid "slice step cannot be zero"
+msgstr "ฅนฅ้ฅคฅนคฮฅนฅฦฅรฅืคห 0 คฯปุฤ๊ควคญคคปค๓"
-#~ msgid "expected 3-tuple as imp.find_module() result, but got %s"
-#~ msgstr "imp.find_module() คฌ %s ค๒สึคทคคทคฟ (ดยิรอ: 2 อืมวคฮฅฟฅืฅ๋)"
+#, c-format
+msgid "attempt to assign sequence of size greater than %d to extended slice"
+msgstr "ฤนคต %d คฮณศฤฅฅนฅ้ฅคฅนคหกขค่ค๊ฤนคคฅนฅ้ฅคฅนค๒ณไค๊ล๖คฦค่คฆคศคทคคทคฟ"
-#~ msgid ""
-#~ "expected 3-tuple as imp.find_module() result, but got tuple of size %d"
-#~ msgstr "impl.find_module() คฌ %d อืมวคฮฅฟฅืฅ๋ค๒สึคทคคทคฟ (ดยิรอ: 2)"
+#, c-format
+msgid "internal error: no vim list item %d"
+msgstr "ฦโษ๔ฅจฅ้กผ: vimคฮฅ๊ฅนฅศอืมว %d คฯคขค๊คคปค๓"
-#~ msgid "internal error: imp.find_module returned tuple with NULL"
-#~ msgstr "ฦโษ๔ฅจฅ้กผ: imp.find_module คฌ NULL ค๒ดคเฅฟฅืฅ๋ค๒สึคทคคทคฟ"
+msgid "internal error: not enough list items"
+msgstr "ฦโษ๔ฅจฅ้กผ: ฅ๊ฅนฅศคหฝฝสฌคสอืมวคฌคขค๊คคปค๓"
-#~ msgid "cannot delete vim.Dictionary attributes"
-#~ msgstr "vim.Dictionaryยฐภญคฯพรคปคคปค๓"
+msgid "internal error: failed to add item to list"
+msgstr "ฦโษ๔ฅจฅ้กผ: ฅ๊ฅนฅศคุคฮอืมวฤษฒรคหผบวิคทคคทคฟ"
-#~ msgid "cannot modify fixed dictionary"
-#~ msgstr "ธวฤ๊คตค์คฟผญฝ๑คฯสันนควคญคคปค๓"
+#, c-format
+msgid "attempt to assign sequence of size %d to extended slice of size %d"
+msgstr "ฤนคต %d คฮฅนฅ้ฅคฅนค๒ %d คฮณศฤฅฅนฅ้ฅคฅนคหณไค๊ล๖คฦค่คฆคศคทคคทคฟ"
-#~ msgid "cannot set attribute %s"
-#~ msgstr "ยฐภญ %s คฯภ฿ฤ๊ควคญคคปค๓"
+msgid "failed to add item to list"
+msgstr "ฅ๊ฅนฅศคุคฮอืมวฤษฒรคหผบวิคทคคทคฟ"
-#~ msgid "hashtab changed during iteration"
-#~ msgstr "ฅคฅฦฅ์กผฅทฅ็ฅ๓รๆคห hashtab คฌสันนคตค์คคทคฟ"
+msgid "cannot delete vim.List attributes"
+msgstr "vim.List ยฐภญคฯพรคปคคปค๓"
-#~ msgid "expected sequence element of size 2, but got sequence of size %d"
-#~ msgstr "ฅทกผฅฑฅ๓ฅนคฮอืมวฟ๔คหคฯ 2 คฌดยิคตค์คฦคคคคทคฟคฌ %d ควคทคฟ"
+msgid "cannot modify fixed list"
+msgstr "ธวฤ๊คตค์คฟฅ๊ฅนฅศคฯสันนควคญคคปค๓"
-#~ msgid "list constructor does not accept keyword arguments"
-#~ msgstr "ฅ๊ฅนฅศคฮฅณฅ๓ฅนฅศฅ้ฅฏฅฟคฯฅญกผฅ๏กผฅษฐ๚ฟ๔ค๒ผ๕คฑษีคฑคคปค๓"
+#, c-format
+msgid "unnamed function %s does not exist"
+msgstr "ฬตฬพดุฟ๔ %s คฯยธบ฿คทคคปค๓"
-#~ msgid "list index out of range"
-#~ msgstr "ฅ๊ฅนฅศศฯฐฯณฐคฮฅคฅ๓ฅวฅรฅฏฅนควคน"
+#, c-format
+msgid "function %s does not exist"
+msgstr "ดุฟ๔ %s คฌคขค๊คคปค๓"
-#~ msgid "internal error: failed to get vim list item %d"
-#~ msgstr "ฦโษ๔ฅจฅ้กผ: vimคฮฅ๊ฅนฅศอืมว %d คฮผ่ฦภคหผบวิคทคคทคฟ"
+#, c-format
+msgid "failed to run function %s"
+msgstr "ดุฟ๔ %s คฮผยนิคหผบวิคทคคทคฟ"
-#~ msgid "failed to add item to list"
-#~ msgstr "ฅ๊ฅนฅศคุคฮอืมวฤษฒรคหผบวิคทคคทคฟ"
+msgid "unable to get option value"
+msgstr "ฅชฅืฅทฅ็ฅ๓คฮรอคฯผ่ฦภควคญคคปค๓"
-#~ msgid "internal error: no vim list item %d"
-#~ msgstr "ฦโษ๔ฅจฅ้กผ: vimคฮฅ๊ฅนฅศอืมว %d คฯคขค๊คคปค๓"
+msgid "internal error: unknown option type"
+msgstr "ฦโษ๔ฅจฅ้กผ: ฬครฮคฮฅชฅืฅทฅ็ฅ๓ทฟควคน"
-#~ msgid "internal error: failed to add item to list"
-#~ msgstr "ฦโษ๔ฅจฅ้กผ: ฅ๊ฅนฅศคุคฮอืมวฤษฒรคหผบวิคทคคทคฟ"
+msgid "problem while switching windows"
+msgstr "ฅฆฅฃฅ๓ฅษฅฆค๒ภฺดนรๆคหฬไย๊คฌศฏภธคทคคทคฟ"
-#~ msgid "cannot delete vim.List attributes"
-#~ msgstr "vim.List ยฐภญคฯพรคปคคปค๓"
+#, c-format
+msgid "unable to unset global option %s"
+msgstr "ฅฐฅํกผฅะฅ๋ฅชฅืฅทฅ็ฅ๓ %s คฮภ฿ฤ๊ฒ๒ฝคฯควคญคคปค๓"
-#~ msgid "cannot modify fixed list"
-#~ msgstr "ธวฤ๊คตค์คฟฅ๊ฅนฅศคฯสันนควคญคคปค๓"
+#, c-format
+msgid "unable to unset option %s which does not have global value"
+msgstr "ฅฐฅํกผฅะฅ๋คสรอคฮฬตคคฅชฅืฅทฅ็ฅ๓ %s คฮภ฿ฤ๊ฒ๒ฝคฯควคญคคปค๓"
-#~ msgid "unnamed function %s does not exist"
-#~ msgstr "ฬตฬพดุฟ๔ %s คฯยธบ฿คทคคปค๓"
+msgid "attempt to refer to deleted tab page"
+msgstr "บ๏ฝคตค์คฟฅฟฅึค๒ปฒพศคทค่คฆคศคทคคทคฟ"
-#~ msgid "function %s does not exist"
-#~ msgstr "ดุฟ๔ %s คฌคขค๊คคปค๓"
+msgid "no such tab page"
+msgstr "คฝคฮค่คฆคสฅฟฅึฅฺกผฅธคฯคขค๊คคปค๓"
-#~ msgid "function constructor does not accept keyword arguments"
-#~ msgstr "ดุฟ๔คฮฅณฅ๓ฅนฅศฅ้ฅฏฅฟคฯฅญกผฅ๏กผฅษฐ๚ฟ๔ค๒ผ๕คฑษีคฑคคปค๓"
+msgid "attempt to refer to deleted window"
+msgstr "บ๏ฝคตค์คฟฅฆฅฃฅ๓ฅษฅฆค๒ปฒพศคทค่คฆคศคทคคทคฟ"
-#~ msgid "failed to run function %s"
-#~ msgstr "ดุฟ๔ %s คฮผยนิคหผบวิคทคคทคฟ"
+msgid "readonly attribute: buffer"
+msgstr "ฦษนภ์อัยฐภญ: ฅะฅรฅีฅกกผ"
-#~ msgid "problem while switching windows"
-#~ msgstr "ฅฆฅฃฅ๓ฅษฅฆค๒ภฺดนรๆคหฬไย๊คฌศฏภธคทคคทคฟ"
+msgid "cursor position outside buffer"
+msgstr "ฅซกผฅฝฅ๋ฐฬรึคฌฅะฅรฅีฅกคฮณฐยฆควคน"
-#~ msgid "unable to unset global option %s"
-#~ msgstr "ฅฐฅํกผฅะฅ๋ฅชฅืฅทฅ็ฅ๓ %s คฮภ฿ฤ๊ฒ๒ฝคฯควคญคคปค๓"
+msgid "no such window"
+msgstr "คฝคฮค่คฆคสฅฆฅฃฅ๓ฅษฅฆคฯคขค๊คคปค๓"
-#~ msgid "unable to unset option %s which does not have global value"
-#~ msgstr "ฅฐฅํกผฅะฅ๋คสรอคฮฬตคคฅชฅืฅทฅ็ฅ๓ %s คฮภ฿ฤ๊ฒ๒ฝคฯควคญคคปค๓"
+msgid "attempt to refer to deleted buffer"
+msgstr "บ๏ฝคตค์คฟฅะฅรฅีฅกค๒ปฒพศคทค่คฆคศคทคคทคฟ"
-#~ msgid "attempt to refer to deleted tab page"
-#~ msgstr "บ๏ฝคตค์คฟฅฟฅึค๒ปฒพศคทค่คฆคศคทคคทคฟ"
+msgid "failed to rename buffer"
+msgstr "ฅะฅรฅีฅกฬพคฮสันนคหผบวิคทคคทคฟ"
-#~ msgid "no such tab page"
-#~ msgstr "คฝคฮค่คฆคสฅฟฅึฅฺกผฅธคฯคขค๊คคปค๓"
+msgid "mark name must be a single character"
+msgstr "ฅกผฅฏฬพคฯ1สธป๚คฮฅขฅ๋ฅีฅกฅูฅรฅศควคสคฑค์คะคสค๊คคปค๓"
-#~ msgid "attempt to refer to deleted window"
-#~ msgstr "บ๏ฝคตค์คฟฅฆฅฃฅ๓ฅษฅฆค๒ปฒพศคทค่คฆคศคทคคทคฟ"
+#, c-format
+msgid "expected vim.Buffer object, but got %s"
+msgstr "vim.Bufferฅชฅึฅธฅงฅฏฅศคฌดยิคตค์คฦคคค๋คฮคห %s ควคทคฟ"
-#~ msgid "readonly attribute: buffer"
-#~ msgstr "ฦษนภ์อัยฐภญ: ฅะฅรฅีฅกกผ"
+#, c-format
+msgid "failed to switch to buffer %d"
+msgstr "ปุฤ๊คตค์คฟฅะฅรฅีฅก %d คุคฮภฺค๊ยุคจคหผบวิคทคคทคฟ"
-#~ msgid "cursor position outside buffer"
-#~ msgstr "ฅซกผฅฝฅ๋ฐฬรึคฌฅะฅรฅีฅกคฮณฐยฆควคน"
+#, c-format
+msgid "expected vim.Window object, but got %s"
+msgstr "vim.Windowฅชฅึฅธฅงฅฏฅศคฌดยิคตค์คฦคคค๋คฮคห %s ควคทคฟ"
-#~ msgid "no such window"
-#~ msgstr "คฝคฮค่คฆคสฅฆฅฃฅ๓ฅษฅฆคฯคขค๊คคปค๓"
+msgid "failed to find window in the current tab page"
+msgstr "ธฝบ฿คฮฅฟฅึคหคฯปุฤ๊คตค์คฟฅฆฅฃฅ๓ฅษฅฆคฌคขค๊คคปค๓ควคทคฟ"
-#~ msgid "attempt to refer to deleted buffer"
-#~ msgstr "บ๏ฝคตค์คฟฅะฅรฅีฅกค๒ปฒพศคทค่คฆคศคทคคทคฟ"
+msgid "did not switch to the specified window"
+msgstr "ปุฤ๊คตค์คฟฅฆฅฃฅ๓ฅษฅฆคหภฺค๊ยุคจคคปค๓ควคทคฟ"
-#~ msgid "failed to rename buffer"
-#~ msgstr "ฅะฅรฅีฅกฬพคฮสันนคหผบวิคทคคทคฟ"
+#, c-format
+msgid "expected vim.TabPage object, but got %s"
+msgstr "vim.TabPageฅชฅึฅธฅงฅฏฅศคฌดยิคตค์คฦคคค๋คฮคห %s ควคทคฟ"
-#~ msgid "mark name must be a single character"
-#~ msgstr "ฅกผฅฏฬพคฯ1สธป๚คฮฅขฅ๋ฅีฅกฅูฅรฅศควคสคฑค์คะคสค๊คคปค๓"
+msgid "did not switch to the specified tab page"
+msgstr "ปุฤ๊คตค์คฟฅฟฅึฅฺกผฅธคหภฺค๊ยุคจคคปค๓ควคทคฟ"
-#~ msgid "expected vim.Buffer object, but got %s"
-#~ msgstr "vim.Bufferฅชฅึฅธฅงฅฏฅศคฌดยิคตค์คฦคคค๋คฮคห %s ควคทคฟ"
+msgid "failed to run the code"
+msgstr "ฅณกผฅษคฮผยนิคหผบวิคทคคทคฟ"
-#~ msgid "failed to switch to buffer %d"
-#~ msgstr "ปุฤ๊คตค์คฟฅะฅรฅีฅก %d คุคฮภฺค๊ยุคจคหผบวิคทคคทคฟ"
+msgid "E858: Eval did not return a valid python object"
+msgstr "E858: ผฐษพฒมคฯอญธ๚คสpythonฅชฅึฅธฅงฅฏฅศค๒สึคทคคปค๓ควคทคฟ"
-#~ msgid "expected vim.Window object, but got %s"
-#~ msgstr "vim.Windowฅชฅึฅธฅงฅฏฅศคฌดยิคตค์คฦคคค๋คฮคห %s ควคทคฟ"
+msgid "E859: Failed to convert returned python object to vim value"
+msgstr "E859: สึคตค์คฟpythonฅชฅึฅธฅงฅฏฅศค๒vimคฮรอคหสัดนควคญคคปค๓ควคทคฟ"
-#~ msgid "failed to find window in the current tab page"
-#~ msgstr "ธฝบ฿คฮฅฟฅึคหคฯปุฤ๊คตค์คฟฅฆฅฃฅ๓ฅษฅฆคฌคขค๊คคปค๓ควคทคฟ"
+#, c-format
+msgid "unable to convert %s to vim dictionary"
+msgstr "%s vimคฮผญฝ๑ทฟคหสัดนควคญคคปค๓"
-#~ msgid "did not switch to the specified window"
-#~ msgstr "ปุฤ๊คตค์คฟฅฆฅฃฅ๓ฅษฅฆคหภฺค๊ยุคจคคปค๓ควคทคฟ"
+#, c-format
+msgid "unable to convert %s to vim list"
+msgstr "%s ค๒vimคฮฅ๊ฅนฅศคหสัดนควคญคคปค๓"
-#~ msgid "expected vim.TabPage object, but got %s"
-#~ msgstr "vim.TabPageฅชฅึฅธฅงฅฏฅศคฌดยิคตค์คฦคคค๋คฮคห %s ควคทคฟ"
+#, c-format
+msgid "unable to convert %s to vim structure"
+msgstr "%s ค๒vimคฮนฝยคยฮคหสัดนควคญคคปค๓"
-#~ msgid "did not switch to the specified tab page"
-#~ msgstr "ปุฤ๊คตค์คฟฅฟฅึฅฺกผฅธคหภฺค๊ยุคจคคปค๓ควคทคฟ"
+msgid "internal error: NULL reference passed"
+msgstr "ฦโษ๔ฅจฅ้กผ: NULLปฒพศคฌลฯคตค์คคทคฟ"
-#~ msgid "failed to run the code"
-#~ msgstr "ฅณกผฅษคฮผยนิคหผบวิคทคคทคฟ"
+msgid "internal error: invalid value type"
+msgstr "ฦโษ๔ฅจฅ้กผ: ฬตธ๚คสรอทฟควคน"
-#~ msgid "E858: Eval did not return a valid python object"
-#~ msgstr "E858: ผฐษพฒมคฯอญธ๚คสpythonฅชฅึฅธฅงฅฏฅศค๒สึคทคคปค๓ควคทคฟ"
+msgid ""
+"Failed to set path hook: sys.path_hooks is not a list\n"
+"You should now do the following:\n"
+"- append vim.path_hook to sys.path_hooks\n"
+"- append vim.VIM_SPECIAL_PATH to sys.path\n"
+msgstr ""
+"ฅัฅนฅีฅรฅฏคฮภ฿ฤ๊คหผบวิคทคคทคฟ: sys.path_hooks คฌฅ๊ฅนฅศควคฯคขค๊คคปค๓\n"
+"คนคฐคหฒผตญค๒ผยปคทคฦคฏคภคตคค:\n"
+"- vim.path_hooks ค๒ sys.path_hooks คุฤษฒร\n"
+"- vim.VIM_SPECIAL_PATH ค๒ sys.path คุฤษฒร\n"
-#~ msgid "E859: Failed to convert returned python object to vim value"
-#~ msgstr "E859: สึคตค์คฟpythonฅชฅึฅธฅงฅฏฅศค๒vimคฮรอคหสัดนควคญคคปค๓ควคทคฟ"
+msgid ""
+"Failed to set path: sys.path is not a list\n"
+"You should now append vim.VIM_SPECIAL_PATH to sys.path"
+msgstr ""
+"ฅัฅนคฮภ฿ฤ๊คหผบวิคทคคทคฟ: sys.path คฌฅ๊ฅนฅศควคฯคขค๊คคปค๓\n"
+"คนคฐคห vim.VIM_SPECIAL_PATH ค๒ sys.path คหฤษฒรคทคฦคฏคภคตคค"
-#~ msgid "unable to convert %s to vim dictionary"
-#~ msgstr "%s vimคฮผญฝ๑ทฟคหสัดนควคญคคปค๓"
+msgid ""
+"Vim macro files (*.vim)\t*.vim\n"
+"All Files (*.*)\t*.*\n"
+msgstr ""
+"Vimฅฅฏฅํฅีฅกฅคฅ๋ (*.vim)\t*.vim\n"
+"คนคูคฦคฮฅีฅกฅคฅ๋ (*.*)\t*.*\n"
-#~ msgid "unable to convert %s to vim structure"
-#~ msgstr "%s ค๒vimคฮนฝยคยฮคหสัดนควคญคคปค๓"
+msgid "All Files (*.*)\t*.*\n"
+msgstr "คนคูคฦคฮฅีฅกฅคฅ๋ (*.*)\t*.*\n"
-#~ msgid "internal error: NULL reference passed"
-#~ msgstr "ฦโษ๔ฅจฅ้กผ: NULLปฒพศคฌลฯคตค์คคทคฟ"
+msgid ""
+"All Files (*.*)\t*.*\n"
+"C source (*.c, *.h)\t*.c;*.h\n"
+"C++ source (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
+"VB code (*.bas, *.frm)\t*.bas;*.frm\n"
+"Vim files (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
+msgstr ""
+"คนคูคฦคฮฅีฅกฅคฅ๋ (*.*)\t*.*\n"
+"Cฅฝกผฅน (*.c, *.h)\t*.c;*.h\n"
+"C++ฅฝกผฅน (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
+"VBฅณกผฅษ (*.bas, *.frm)\t*.bas;*.frm\n"
+"Vimฅีฅกฅคฅ๋ (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
-#~ msgid "internal error: invalid value type"
-#~ msgstr "ฦโษ๔ฅจฅ้กผ: ฬตธ๚คสรอทฟควคน"
+msgid ""
+"Vim macro files (*.vim)\t*.vim\n"
+"All Files (*)\t*\n"
+msgstr ""
+"Vim ฅฅฏฅํฅีฅกฅคฅ๋ (*.vim)\t*.vim\n"
+"คนคูคฦคฮฅีฅกฅคฅ๋ (*)\t*\n"
-#~ msgid ""
-#~ "Failed to set path hook: sys.path_hooks is not a list\n"
-#~ "You should now do the following:\n"
-#~ "- append vim.path_hook to sys.path_hooks\n"
-#~ "- append vim.VIM_SPECIAL_PATH to sys.path\n"
-#~ msgstr ""
-#~ "ฅัฅนฅีฅรฅฏคฮภ฿ฤ๊คหผบวิคทคคทคฟ: sys.path_hooks คฌฅ๊ฅนฅศควคฯคขค๊คคปค๓\n"
-#~ "คนคฐคหฒผตญค๒ผยปคทคฦคฏคภคตคค:\n"
-#~ "- vim.path_hooks ค๒ sys.path_hooks คุฤษฒร\n"
-#~ "- vim.VIM_SPECIAL_PATH ค๒ sys.path คุฤษฒร\n"
+msgid "All Files (*)\t*\n"
+msgstr "คนคูคฦคฮฅีฅกฅคฅ๋ (*)\t*\n"
-#~ msgid ""
-#~ "Failed to set path: sys.path is not a list\n"
-#~ "You should now append vim.VIM_SPECIAL_PATH to sys.path"
-#~ msgstr ""
-#~ "ฅัฅนคฮภ฿ฤ๊คหผบวิคทคคทคฟ: sys.path คฌฅ๊ฅนฅศควคฯคขค๊คคปค๓\n"
-#~ "คนคฐคห vim.VIM_SPECIAL_PATH ค๒ sys.path คหฤษฒรคทคฦคฏคภคตคค"
+msgid ""
+"All Files (*)\t*\n"
+"C source (*.c, *.h)\t*.c;*.h\n"
+"C++ source (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
+"Vim files (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
+msgstr ""
+"คนคูคฦคฮฅีฅกฅคฅ๋ (*)\t*\n"
+"Cฅฝกผฅน (*.c, *.h)\t*.c;*.h\n"
+"C++ฅฝกผฅน (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
+"Vimฅีฅกฅคฅ๋ (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
diff --git a/src/nvim/po/ja.po b/src/nvim/po/ja.po
index 8a3fcb8f78..4c5661464a 100644
--- a/src/nvim/po/ja.po
+++ b/src/nvim/po/ja.po
@@ -1,10 +1,11 @@
+
# Japanese translation for Vim
#
# Do ":help uganda" in Vim to read copying and usage conditions.
# Do ":help credits" in Vim to see a list of people who contributed.
#
-# Copyright (C) 2001-2016 MURAOKA Taro <koron.kaoriya@gmail.com>,
-# vim-jp (http://vim-jp.org/)
+# Copyright (C) 2001-2018 MURAOKA Taro <koron.kaoriya@gmail.com>,
+# vim-jp <http://vim-jp.org/>
#
# THIS FILE IS DISTRIBUTED UNDER THE VIM LICENSE.
#
@@ -12,215 +13,188 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Vim 7.4\n"
+"Project-Id-Version: Vim 8.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-02-01 09:02+0900\n"
-"PO-Revision-Date: 2013-06-02-01 09:08+09n"
+"POT-Creation-Date: 2018-07-18 00:43+0900\n"
+"PO-Revision-Date: 2017-05-18 00:45+0900\n"
"Last-Translator: MURAOKA Taro <koron.kaoriya@gmail.com>\n"
-"Language-Team: vim-jp (https://github.com/vim-jp/lang-ja)\n"
-"Language: Japanese\n"
+"Language-Team: Japanese <https://github.com/vim-jp/lang-ja>\n"
+"Language: ja\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
-#: ../api/private/helpers.c:201
-#, fuzzy
-msgid "Unable to get option value"
-msgstr "ใ‚ชใƒ—ใ‚ทใƒงใƒณใฎๅ€คใฏๅ–ๅพ—ใงใใพใ›ใ‚“"
+msgid "E831: bf_key_init() called with empty password"
+msgstr "E831: bf_key_init() ใŒ็ฉบใƒ‘ใ‚นใƒฏใƒผใƒ‰ใงๅ‘ผใณๅ‡บใ•ใ‚Œใพใ—ใŸ"
-#: ../api/private/helpers.c:204
-msgid "internal error: unknown option type"
-msgstr "ๅ†…้ƒจใ‚จใƒฉใƒผ: ๆœช็Ÿฅใฎใ‚ชใƒ—ใ‚ทใƒงใƒณๅž‹ใงใ™"
+msgid "E820: sizeof(uint32_t) != 4"
+msgstr "E820: sizeof(uint32_t) != 4"
+
+msgid "E817: Blowfish big/little endian use wrong"
+msgstr "E817: Blowfishๆš—ๅทใฎใƒ“ใƒƒใ‚ฐ/ใƒชใƒˆใƒซใ‚จใƒณใƒ‡ใ‚ฃใ‚ขใƒณใŒ้–“้•ใฃใฆใ„ใพใ™"
+
+msgid "E818: sha256 test failed"
+msgstr "E818: sha256ใฎใƒ†ใ‚นใƒˆใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+
+msgid "E819: Blowfish test failed"
+msgstr "E819: Blowfishๆš—ๅทใฎใƒ†ใ‚นใƒˆใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-#: ../buffer.c:92
msgid "[Location List]"
msgstr "[ใƒญใ‚ฑใƒผใ‚ทใƒงใƒณใƒชใ‚นใƒˆ]"
-#: ../buffer.c:93
msgid "[Quickfix List]"
msgstr "[Quickfixใƒชใ‚นใƒˆ]"
-#: ../buffer.c:94
msgid "E855: Autocommands caused command to abort"
msgstr "E855: autocommandใŒใ‚ณใƒžใƒณใƒ‰ใฎๅœๆญขใ‚’ๅผ•ใ่ตทใ“ใ—ใพใ—ใŸ"
-#: ../buffer.c:135
msgid "E82: Cannot allocate any buffer, exiting..."
-msgstr "E82: ใƒใƒƒใƒ•ใ‚กใ‚’1ใคใ‚‚ไฝœๆˆใงใใชใ„ใฎใง, ็ต‚ไบ†ใ—ใพใ™..."
+msgstr "E82: ใƒใƒƒใƒ•ใ‚กใ‚’1ใคใ‚‚ไฝœๆˆใงใใชใ„ใฎใงใ€็ต‚ไบ†ใ—ใพใ™..."
-#: ../buffer.c:138
msgid "E83: Cannot allocate buffer, using other one..."
-msgstr "E83: ใƒใƒƒใƒ•ใ‚กใ‚’ไฝœๆˆใงใใชใ„ใฎใง, ไป–ใฎใ‚’ไฝฟ็”จใ—ใพใ™..."
+msgstr "E83: ใƒใƒƒใƒ•ใ‚กใ‚’ไฝœๆˆใงใใชใ„ใฎใงใ€ไป–ใฎใ‚’ไฝฟ็”จใ—ใพใ™..."
+
+msgid "E931: Buffer cannot be registered"
+msgstr "E931: ใƒใƒƒใƒ•ใ‚กใ‚’็™ป้Œฒใงใใพใ›ใ‚“"
+
+msgid "E937: Attempt to delete a buffer that is in use"
+msgstr "E937: ไฝฟ็”จไธญใฎใƒใƒƒใƒ•ใ‚กใ‚’ๅ‰Š้™คใ—ใ‚ˆใ†ใจ่ฉฆใฟใพใ—ใŸ"
-#: ../buffer.c:763
msgid "E515: No buffers were unloaded"
msgstr "E515: ่งฃๆ”พใ•ใ‚ŒใŸใƒใƒƒใƒ•ใ‚กใฏใ‚ใ‚Šใพใ›ใ‚“"
-#: ../buffer.c:765
msgid "E516: No buffers were deleted"
msgstr "E516: ๅ‰Š้™คใ•ใ‚ŒใŸใƒใƒƒใƒ•ใ‚กใฏใ‚ใ‚Šใพใ›ใ‚“"
-#: ../buffer.c:767
msgid "E517: No buffers were wiped out"
msgstr "E517: ็ ดๆฃ„ใ•ใ‚ŒใŸใƒใƒƒใƒ•ใ‚กใฏใ‚ใ‚Šใพใ›ใ‚“"
-#: ../buffer.c:772
msgid "1 buffer unloaded"
msgstr "1 ๅ€‹ใฎใƒใƒƒใƒ•ใ‚กใŒ่งฃๆ”พใ•ใ‚Œใพใ—ใŸ"
-#: ../buffer.c:774
#, c-format
msgid "%d buffers unloaded"
msgstr "%d ๅ€‹ใฎใƒใƒƒใƒ•ใ‚กใŒ่งฃๆ”พใ•ใ‚Œใพใ—ใŸ"
-#: ../buffer.c:777
msgid "1 buffer deleted"
msgstr "1 ๅ€‹ใฎใƒใƒƒใƒ•ใ‚กใŒๅ‰Š้™คใ•ใ‚Œใพใ—ใŸ"
-#: ../buffer.c:779
#, c-format
msgid "%d buffers deleted"
msgstr "%d ๅ€‹ใฎใƒใƒƒใƒ•ใ‚กใŒๅ‰Š้™คใ•ใ‚Œใพใ—ใŸ"
-#: ../buffer.c:782
msgid "1 buffer wiped out"
msgstr "1 ๅ€‹ใฎใƒใƒƒใƒ•ใ‚กใŒ็ ดๆฃ„ใ•ใ‚Œใพใ—ใŸ"
-#: ../buffer.c:784
#, c-format
msgid "%d buffers wiped out"
msgstr "%d ๅ€‹ใฎใƒใƒƒใƒ•ใ‚กใŒ็ ดๆฃ„ใ•ใ‚Œใพใ—ใŸ"
-#: ../buffer.c:806
msgid "E90: Cannot unload last buffer"
msgstr "E90: ๆœ€ๅพŒใฎใƒใƒƒใƒ•ใ‚กใฏ่งฃๆ”พใงใใพใ›ใ‚“"
-#: ../buffer.c:874
msgid "E84: No modified buffer found"
msgstr "E84: ๅค‰ๆ›ดใ•ใ‚ŒใŸใƒใƒƒใƒ•ใ‚กใฏใ‚ใ‚Šใพใ›ใ‚“"
-#. back where we started, didn't find anything.
-#: ../buffer.c:903
msgid "E85: There is no listed buffer"
msgstr "E85: ใƒชใ‚นใƒˆ่กจ็คบใ•ใ‚Œใ‚‹ใƒใƒƒใƒ•ใ‚กใฏใ‚ใ‚Šใพใ›ใ‚“"
-#: ../buffer.c:913
-#, c-format
-msgid "E86: Buffer %<PRId64> does not exist"
-msgstr "E86: ใƒใƒƒใƒ•ใ‚ก %<PRId64> ใฏใ‚ใ‚Šใพใ›ใ‚“"
-
-#: ../buffer.c:915
msgid "E87: Cannot go beyond last buffer"
msgstr "E87: ๆœ€ๅพŒใฎใƒใƒƒใƒ•ใ‚กใ‚’่ถŠใˆใฆ็งปๅ‹•ใฏใงใใพใ›ใ‚“"
-#: ../buffer.c:917
msgid "E88: Cannot go before first buffer"
msgstr "E88: ๆœ€ๅˆใฎใƒใƒƒใƒ•ใ‚กใ‚ˆใ‚Šๅ‰ใธใฏ็งปๅ‹•ใงใใพใ›ใ‚“"
-#: ../buffer.c:945
#, c-format
-msgid ""
-"E89: No write since last change for buffer %<PRId64> (add ! to override)"
-msgstr "E89: ใƒใƒƒใƒ•ใ‚ก %<PRId64> ใฎๅค‰ๆ›ดใฏไฟๅญ˜ใ•ใ‚Œใฆใ„ใพใ›ใ‚“ (! ใงๅค‰ๆ›ดใ‚’็ ดๆฃ„)"
+msgid "E89: No write since last change for buffer %ld (add ! to override)"
+msgstr "E89: ใƒใƒƒใƒ•ใ‚ก %ld ใฎๅค‰ๆ›ดใฏไฟๅญ˜ใ•ใ‚Œใฆใ„ใพใ›ใ‚“ (! ใงๅค‰ๆ›ดใ‚’็ ดๆฃ„)"
+
+msgid "E948: Job still running (add ! to end the job)"
+msgstr "E948: ใ‚ธใƒงใƒ–ใฏใพใ ๅฎŸ่กŒไธญใงใ™ (! ใ‚’่ฟฝๅŠ ใงใ‚ธใƒงใƒ–ใ‚’็ต‚ไบ†)"
+
+msgid "E37: No write since last change (add ! to override)"
+msgstr "E37: ๆœ€ๅพŒใฎๅค‰ๆ›ดใŒไฟๅญ˜ใ•ใ‚Œใฆใ„ใพใ›ใ‚“ (! ใ‚’่ฟฝๅŠ ใงๅค‰ๆ›ดใ‚’็ ดๆฃ„)"
+
+msgid "E948: Job still running"
+msgstr "E948: ใ‚ธใƒงใƒ–ใฏใพใ ๅฎŸ่กŒไธญใงใ™"
+
+msgid "E37: No write since last change"
+msgstr "E37: ๆœ€ๅพŒใฎๅค‰ๆ›ดใŒไฟๅญ˜ใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#. wrap around (may cause duplicates)
-#: ../buffer.c:1423
msgid "W14: Warning: List of file names overflow"
msgstr "W14: ่ญฆๅ‘Š: ใƒ•ใ‚กใ‚คใƒซๅใฎใƒชใ‚นใƒˆใŒ้•ท้ŽใŽใพใ™"
-#: ../buffer.c:1555 ../quickfix.c:3361
#, c-format
-msgid "E92: Buffer %<PRId64> not found"
-msgstr "E92: ใƒใƒƒใƒ•ใ‚ก %<PRId64> ใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
+msgid "E92: Buffer %ld not found"
+msgstr "E92: ใƒใƒƒใƒ•ใ‚ก %ld ใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-#: ../buffer.c:1798
#, c-format
msgid "E93: More than one match for %s"
msgstr "E93: %s ใซ่ค‡ๆ•ฐใฎ่ฉฒๅฝ“ใŒใ‚ใ‚Šใพใ—ใŸ"
-#: ../buffer.c:1800
#, c-format
msgid "E94: No matching buffer for %s"
msgstr "E94: %s ใซ่ฉฒๅฝ“ใ™ใ‚‹ใƒใƒƒใƒ•ใ‚กใฏใ‚ใ‚Šใพใ›ใ‚“ใงใ—ใŸ"
-#: ../buffer.c:2161
#, c-format
-msgid "line %<PRId64>"
-msgstr "่กŒ %<PRId64>"
+msgid "line %ld"
+msgstr "่กŒ %ld"
-#: ../buffer.c:2233
msgid "E95: Buffer with this name already exists"
msgstr "E95: ใ“ใฎๅๅ‰ใฎใƒใƒƒใƒ•ใ‚กใฏๆ—ขใซใ‚ใ‚Šใพใ™"
-#: ../buffer.c:2498
msgid " [Modified]"
msgstr " [ๅค‰ๆ›ดใ‚ใ‚Š]"
-#: ../buffer.c:2501
msgid "[Not edited]"
msgstr "[ๆœช็ทจ้›†]"
-#: ../buffer.c:2504
msgid "[New file]"
msgstr "[ๆ–ฐใƒ•ใ‚กใ‚คใƒซ]"
-#: ../buffer.c:2505
msgid "[Read errors]"
msgstr "[่ชญ่พผใ‚จใƒฉใƒผ]"
-#: ../buffer.c:2506 ../buffer.c:3217 ../fileio.c:1807 ../screen.c:4895
msgid "[RO]"
msgstr "[่ชญๅฐ‚]"
-#: ../buffer.c:2507 ../fileio.c:1807
msgid "[readonly]"
msgstr "[่ชญ่พผๅฐ‚็”จ]"
-#: ../buffer.c:2524
#, c-format
msgid "1 line --%d%%--"
msgstr "1 ่กŒ --%d%%--"
-#: ../buffer.c:2526
#, c-format
-msgid "%<PRId64> lines --%d%%--"
-msgstr "%<PRId64> ่กŒ --%d%%--"
+msgid "%ld lines --%d%%--"
+msgstr "%ld ่กŒ --%d%%--"
-#: ../buffer.c:2530
#, c-format
-msgid "line %<PRId64> of %<PRId64> --%d%%-- col "
-msgstr "่กŒ %<PRId64> (ๅ…จไฝ“ %<PRId64>) --%d%%-- col "
+msgid "line %ld of %ld --%d%%-- col "
+msgstr "่กŒ %ld (ๅ…จไฝ“ %ld) --%d%%-- col "
-#: ../buffer.c:2632 ../buffer.c:4292 ../memline.c:1554
msgid "[No Name]"
msgstr "[็„กๅ]"
-#. must be a help buffer
-#: ../buffer.c:2667
msgid "help"
msgstr "ใƒ˜ใƒซใƒ—"
-#: ../buffer.c:3225 ../screen.c:4883
msgid "[Help]"
msgstr "[ใƒ˜ใƒซใƒ—]"
-#: ../buffer.c:3254 ../screen.c:4887
msgid "[Preview]"
msgstr "[ใƒ—ใƒฌใƒ“ใƒฅใƒผ]"
-#: ../buffer.c:3528
msgid "All"
msgstr "ๅ…จใฆ"
-#: ../buffer.c:3528
msgid "Bot"
msgstr "ๆœซๅฐพ"
-#: ../buffer.c:3531
msgid "Top"
msgstr "ๅ…ˆ้ ญ"
-#: ../buffer.c:4244
msgid ""
"\n"
"# Buffer list:\n"
@@ -228,11 +202,15 @@ msgstr ""
"\n"
"# ใƒใƒƒใƒ•ใ‚กใƒชใ‚นใƒˆ:\n"
-#: ../buffer.c:4289
+msgid "E382: Cannot write, 'buftype' option is set"
+msgstr "E382: 'buftype' ใ‚ชใƒ—ใ‚ทใƒงใƒณใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใ‚‹ใฎใงๆ›ธ่พผใ‚ใพใ›ใ‚“"
+
+msgid "[Prompt]"
+msgstr "[ใƒ—ใƒญใƒณใƒ—ใƒˆ]"
+
msgid "[Scratch]"
msgstr "[ไธ‹ๆ›ธใ]"
-#: ../buffer.c:4529
msgid ""
"\n"
"--- Signs ---"
@@ -240,633 +218,385 @@ msgstr ""
"\n"
"--- ใ‚ตใ‚คใƒณ ---"
-#: ../buffer.c:4538
#, c-format
msgid "Signs for %s:"
msgstr "%s ใฎใ‚ตใ‚คใƒณ:"
-#: ../buffer.c:4543
#, c-format
-msgid " line=%<PRId64> id=%d name=%s"
-msgstr " ่กŒ=%<PRId64> ่ญ˜ๅˆฅๅญ=%d ๅๅ‰=%s"
+msgid " line=%ld id=%d name=%s"
+msgstr " ่กŒ=%ld ่ญ˜ๅˆฅๅญ=%d ๅๅ‰=%s"
-#: ../cursor_shape.c:68
-msgid "E545: Missing colon"
-msgstr "E545: ใ‚ณใƒญใƒณใŒใ‚ใ‚Šใพใ›ใ‚“"
+msgid "E902: Cannot connect to port"
+msgstr "E902: ใƒใƒผใƒˆใซๆŽฅ็ถšใงใใพใ›ใ‚“"
-#: ../cursor_shape.c:70 ../cursor_shape.c:94
-msgid "E546: Illegal mode"
-msgstr "E546: ไธๆญฃใชใƒขใƒผใƒ‰ใงใ™"
+msgid "E901: gethostbyname() in channel_open()"
+msgstr "E901: channel_open() ๅ†…ใฎ gethostbyname() ใŒๅคฑๆ•—ใ—ใพใ—ใŸ"
-#: ../cursor_shape.c:134
-msgid "E548: digit expected"
-msgstr "E548: ๆ•ฐๅ€คใŒๅฟ…่ฆใงใ™"
+msgid "E898: socket() in channel_open()"
+msgstr "E898: channel_open() ๅ†…ใฎ socket() ใŒๅคฑๆ•—ใ—ใพใ—ใŸ"
-#: ../cursor_shape.c:138
-msgid "E549: Illegal percentage"
-msgstr "E549: ไธๆญฃใชใƒ‘ใƒผใ‚ปใƒณใƒ†ใƒผใ‚ธใงใ™"
+msgid "E903: received command with non-string argument"
+msgstr "E903: ้žๆ–‡ๅญ—ๅˆ—ใฎๅผ•ๆ•ฐใฎใ‚ณใƒžใƒณใƒ‰ใ‚’ๅ—ไฟกใ—ใพใ—ใŸ"
+
+msgid "E904: last argument for expr/call must be a number"
+msgstr "E904: expr/call ใฎๆœ€ๅพŒใฎๅผ•ๆ•ฐใฏๆ•ฐๅญ—ใงใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“"
+
+msgid "E904: third argument for call must be a list"
+msgstr "E904: call ใฎ3็•ช็›ฎใฎๅผ•ๆ•ฐใฏใƒชใ‚นใƒˆๅž‹ใงใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“"
-#: ../diff.c:146
#, c-format
-msgid "E96: Can not diff more than %<PRId64> buffers"
-msgstr "E96: %<PRId64> ไปฅไธŠใฎใƒใƒƒใƒ•ใ‚กใฏdiffใงใใพใ›ใ‚“"
+msgid "E905: received unknown command: %s"
+msgstr "E905: ๆœช็Ÿฅใฎใ‚ณใƒžใƒณใƒ‰ใ‚’ๅ—ไฟกใ—ใพใ—ใŸ: %s"
+
+#, c-format
+msgid "E630: %s(): write while not connected"
+msgstr "E630: %s(): ้žๆŽฅ็ถš็Šถๆ…‹ใงๆ›ธใ่พผใฟใพใ—ใŸ"
+
+#, c-format
+msgid "E631: %s(): write failed"
+msgstr "E631: %s(): ๆ›ธใ่พผใฟใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+
+#, c-format
+msgid "E917: Cannot use a callback with %s()"
+msgstr "E917: %s() ใซใ‚ณใƒผใƒซใƒใƒƒใ‚ฏใฏไฝฟใˆใพใ›ใ‚“"
+
+msgid "E912: cannot use ch_evalexpr()/ch_sendexpr() with a raw or nl channel"
+msgstr ""
+"E912: raw ใ‚„ nl ใƒขใƒผใƒ‰ใฎใƒใƒฃใƒใƒซใซ ch_evalexpr()/ch_sendexpr() ใฏไฝฟใˆใพใ›ใ‚“"
+
+msgid "E906: not an open channel"
+msgstr "E906: ้–‹ใ„ใฆใ„ใชใ„ใƒใƒฃใƒใƒซใงใ™"
+
+msgid "E920: _io file requires _name to be set"
+msgstr "E920: _io ใƒ•ใ‚กใ‚คใƒซใฏ _name ใฎ่จญๅฎšใŒๅฟ…่ฆใงใ™"
+
+msgid "E915: in_io buffer requires in_buf or in_name to be set"
+msgstr "E915: in_io ใƒใƒƒใƒ•ใ‚กใฏ in_buf ใ‹ in_name ใฎ่จญๅฎšใŒๅฟ…่ฆใงใ™"
+
+#, c-format
+msgid "E918: buffer must be loaded: %s"
+msgstr "E918: ใƒใƒƒใƒ•ใ‚กใŒใƒญใƒผใƒ‰ใ•ใ‚Œใฆใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“: %s"
+
+msgid "E821: File is encrypted with unknown method"
+msgstr "E821: ใƒ•ใ‚กใ‚คใƒซใŒๆœช็Ÿฅใฎๆ–นๆณ•ใงๆš—ๅทๅŒ–ใ•ใ‚Œใฆใ„ใพใ™"
+
+msgid "Warning: Using a weak encryption method; see :help 'cm'"
+msgstr "่ญฆๅ‘Š: ๅผฑใ„ๆš—ๅทๆ–นๆณ•ใ‚’ไฝฟใฃใฆใ„ใพใ™; :help 'cm' ใ‚’ๅ‚็…งใ—ใฆใใ ใ•ใ„"
+
+msgid "Enter encryption key: "
+msgstr "ๆš—ๅทๅŒ–็”จใฎใ‚ญใƒผใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„: "
+
+msgid "Enter same key again: "
+msgstr "ใ‚‚ใ†ไธ€ๅบฆๅŒใ˜ใ‚ญใƒผใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„: "
+
+msgid "Keys don't match!"
+msgstr "ใ‚ญใƒผใŒไธ€่‡ดใ—ใพใ›ใ‚“"
+
+msgid "[crypted]"
+msgstr "[ๆš—ๅทๅŒ–]"
+
+#, c-format
+msgid "E720: Missing colon in Dictionary: %s"
+msgstr "E720: ่พžๆ›ธๅž‹ใซใ‚ณใƒญใƒณใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
+
+#, c-format
+msgid "E721: Duplicate key in Dictionary: \"%s\""
+msgstr "E721: ่พžๆ›ธๅž‹ใซ้‡่ค‡ใ‚ญใƒผใŒใ‚ใ‚Šใพใ™: \"%s\""
+
+#, c-format
+msgid "E722: Missing comma in Dictionary: %s"
+msgstr "E722: ่พžๆ›ธๅž‹ใซใ‚ซใƒณใƒžใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
+
+#, c-format
+msgid "E723: Missing end of Dictionary '}': %s"
+msgstr "E723: ่พžๆ›ธๅž‹ใฎๆœ€ๅพŒใซ '}' ใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
+
+msgid "extend() argument"
+msgstr "extend() ใฎๅผ•ๆ•ฐ"
+
+#, c-format
+msgid "E737: Key already exists: %s"
+msgstr "E737: ใ‚ญใƒผใฏๆ—ขใซๅญ˜ๅœจใ—ใพใ™: %s"
+
+#, c-format
+msgid "E96: Cannot diff more than %ld buffers"
+msgstr "E96: %ld ไปฅไธŠใฎใƒใƒƒใƒ•ใ‚กใฏdiffใงใใพใ›ใ‚“"
-#: ../diff.c:753
msgid "E810: Cannot read or write temp files"
msgstr "E810: ไธ€ๆ™‚ใƒ•ใ‚กใ‚คใƒซใฎ่ชญ่พผใ‚‚ใ—ใใฏๆ›ธ่พผใŒใงใใพใ›ใ‚“"
-#: ../diff.c:755
msgid "E97: Cannot create diffs"
msgstr "E97: ๅทฎๅˆ†ใ‚’ไฝœๆˆใงใใพใ›ใ‚“"
-#: ../diff.c:966
+msgid "Patch file"
+msgstr "ใƒ‘ใƒƒใƒใƒ•ใ‚กใ‚คใƒซ"
+
msgid "E816: Cannot read patch output"
msgstr "E816: patchใฎๅ‡บๅŠ›ใ‚’่ชญ่พผใ‚ใพใ›ใ‚“"
-#: ../diff.c:1220
msgid "E98: Cannot read diff output"
msgstr "E98: diffใฎๅ‡บๅŠ›ใ‚’่ชญ่พผใ‚ใพใ›ใ‚“"
-#: ../diff.c:2081
msgid "E99: Current buffer is not in diff mode"
msgstr "E99: ็พๅœจใฎใƒใƒƒใƒ•ใ‚กใฏๅทฎๅˆ†ใƒขใƒผใƒ‰ใงใฏใ‚ใ‚Šใพใ›ใ‚“"
-#: ../diff.c:2100
msgid "E793: No other buffer in diff mode is modifiable"
msgstr "E793: ๅทฎๅˆ†ใƒขใƒผใƒ‰ใงใ‚ใ‚‹ไป–ใฎใƒใƒƒใƒ•ใ‚กใฏๅค‰ๆ›ดใงใใพใ›ใ‚“"
-#: ../diff.c:2102
msgid "E100: No other buffer in diff mode"
msgstr "E100: ๅทฎๅˆ†ใƒขใƒผใƒ‰ใงใ‚ใ‚‹ไป–ใฎใƒใƒƒใƒ•ใ‚กใฏใ‚ใ‚Šใพใ›ใ‚“"
-#: ../diff.c:2112
msgid "E101: More than two buffers in diff mode, don't know which one to use"
msgstr ""
"E101: ๅทฎๅˆ†ใƒขใƒผใƒ‰ใฎใƒใƒƒใƒ•ใ‚กใŒ2ๅ€‹ไปฅไธŠใ‚ใ‚‹ใฎใงใ€ใฉใ‚Œใ‚’ไฝฟใ†ใ‹็‰นๅฎšใงใใพใ›ใ‚“"
-#: ../diff.c:2141
#, c-format
msgid "E102: Can't find buffer \"%s\""
msgstr "E102: ใƒใƒƒใƒ•ใ‚ก \"%s\" ใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-#: ../diff.c:2152
#, c-format
msgid "E103: Buffer \"%s\" is not in diff mode"
msgstr "E103: ใƒใƒƒใƒ•ใ‚ก \"%s\" ใฏๅทฎๅˆ†ใƒขใƒผใƒ‰ใงใฏใ‚ใ‚Šใพใ›ใ‚“"
-#: ../diff.c:2193
msgid "E787: Buffer changed unexpectedly"
msgstr "E787: ไบˆๆœŸใ›ใšใƒใƒƒใƒ•ใ‚กใŒๅค‰ๆ›ดๅค‰ๆ›ดใ•ใ‚Œใพใ—ใŸ"
-#: ../digraph.c:1598
msgid "E104: Escape not allowed in digraph"
msgstr "E104: ๅˆๅญ—ใซEscapeใฏไฝฟ็”จใงใใพใ›ใ‚“"
-#: ../digraph.c:1760
msgid "E544: Keymap file not found"
msgstr "E544: ใ‚ญใƒผใƒžใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-#: ../digraph.c:1785
msgid "E105: Using :loadkeymap not in a sourced file"
msgstr "E105: :source ใงๅ–่พผใ‚€ใƒ•ใ‚กใ‚คใƒซไปฅๅค–ใงใฏ :loadkeymap ใ‚’ไฝฟใˆใพใ›ใ‚“"
-#: ../digraph.c:1821
msgid "E791: Empty keymap entry"
msgstr "E791: ็ฉบใฎใ‚ญใƒผใƒžใƒƒใƒ—ใ‚จใƒณใƒˆใƒช"
-#: ../edit.c:82
msgid " Keyword completion (^N^P)"
msgstr " ใ‚ญใƒผใƒฏใƒผใƒ‰่ฃœๅฎŒ (^N^P)"
-#. ctrl_x_mode == 0, ^P/^N compl.
-#: ../edit.c:83
msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
msgstr " ^X ใƒขใƒผใƒ‰ (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-#: ../edit.c:85
msgid " Whole line completion (^L^N^P)"
msgstr " ่กŒ(ๅ…จไฝ“)่ฃœๅฎŒ (^L^N^P)"
-#: ../edit.c:86
msgid " File name completion (^F^N^P)"
msgstr " ใƒ•ใ‚กใ‚คใƒซๅ่ฃœๅฎŒ (^F^N^P)"
-#: ../edit.c:87
msgid " Tag completion (^]^N^P)"
msgstr " ใ‚ฟใ‚ฐ่ฃœๅฎŒ (^]^N^P)"
-#: ../edit.c:88
msgid " Path pattern completion (^N^P)"
msgstr " ใƒ‘ใ‚นใƒ‘ใ‚ฟใƒผใƒณ่ฃœๅฎŒ (^N^P)"
-#: ../edit.c:89
msgid " Definition completion (^D^N^P)"
msgstr " ๅฎš็พฉ่ฃœๅฎŒ (^D^N^P)"
-#: ../edit.c:91
msgid " Dictionary completion (^K^N^P)"
msgstr " ่พžๆ›ธ่ฃœๅฎŒ (^K^N^P)"
-#: ../edit.c:92
msgid " Thesaurus completion (^T^N^P)"
msgstr " ใ‚ทใ‚ฝใƒผใƒฉใ‚น่ฃœๅฎŒ (^T^N^P)"
-#: ../edit.c:93
msgid " Command-line completion (^V^N^P)"
msgstr " ใ‚ณใƒžใƒณใƒ‰ใƒฉใ‚คใƒณ่ฃœๅฎŒ (^V^N^P)"
-#: ../edit.c:94
msgid " User defined completion (^U^N^P)"
msgstr " ใƒฆใƒผใ‚ถใƒผๅฎš็พฉ่ฃœๅฎŒ (^U^N^P)"
-#: ../edit.c:95
msgid " Omni completion (^O^N^P)"
msgstr " ใ‚ชใƒ ใƒ‹่ฃœๅฎŒ (^O^N^P)"
-#: ../edit.c:96
msgid " Spelling suggestion (s^N^P)"
msgstr " ็ถดใ‚Šไฟฎๆญฃๅ€™่ฃœ (s^N^P)"
-#: ../edit.c:97
msgid " Keyword Local completion (^N^P)"
msgstr " ๅฑ€ๆ‰€ใ‚ญใƒผใƒฏใƒผใƒ‰่ฃœๅฎŒ (^N^P)"
-#: ../edit.c:100
msgid "Hit end of paragraph"
msgstr "ๆฎต่ฝใฎๆœ€ๅพŒใซใƒ’ใƒƒใƒˆ"
-#: ../edit.c:101
msgid "E839: Completion function changed window"
msgstr "E839: ่ฃœ้–“้–ขๆ•ฐใŒใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚’ๅค‰ๆ›ดใ—ใพใ—ใŸ"
-#: ../edit.c:102
msgid "E840: Completion function deleted text"
msgstr "E840: ่ฃœๅฎŒ้–ขๆ•ฐใŒใƒ†ใ‚ญใ‚นใƒˆใ‚’ๅ‰Š้™คใ—ใพใ—ใŸ"
-#: ../edit.c:1847
msgid "'dictionary' option is empty"
msgstr "'dictionary' ใ‚ชใƒ—ใ‚ทใƒงใƒณใŒ็ฉบใงใ™"
-#: ../edit.c:1848
msgid "'thesaurus' option is empty"
msgstr "'thesaurus' ใ‚ชใƒ—ใ‚ทใƒงใƒณใŒ็ฉบใงใ™"
-#: ../edit.c:2655
#, c-format
msgid "Scanning dictionary: %s"
msgstr "่พžๆ›ธใ‚’ใ‚นใ‚ญใƒฃใƒณไธญ: %s"
-#: ../edit.c:3079
msgid " (insert) Scroll (^E/^Y)"
msgstr " (ๆŒฟๅ…ฅ) ใ‚นใ‚ฏใƒญใƒผใƒซ(^E/^Y)"
-#: ../edit.c:3081
msgid " (replace) Scroll (^E/^Y)"
msgstr " (็ฝฎๆ›) ใ‚นใ‚ฏใƒญใƒผใƒซ (^E/^Y)"
-#: ../edit.c:3587
#, c-format
msgid "Scanning: %s"
msgstr "ใ‚นใ‚ญใƒฃใƒณไธญ: %s"
-#: ../edit.c:3614
msgid "Scanning tags."
msgstr "ใ‚ฟใ‚ฐใ‚’ใ‚นใ‚ญใƒฃใƒณไธญ."
-#: ../edit.c:4519
+msgid "match in file"
+msgstr "ใƒ•ใ‚กใ‚คใƒซๅ†…ใฎใƒžใƒƒใƒ"
+
msgid " Adding"
msgstr " ่ฟฝๅŠ ไธญ"
-#. showmode might reset the internal line pointers, so it must
-#. * be called before line = ml_get(), or when this address is no
-#. * longer needed. -- Acevedo.
-#.
-#: ../edit.c:4562
msgid "-- Searching..."
msgstr "-- ๆคœ็ดขไธญ..."
-#: ../edit.c:4618
msgid "Back at original"
msgstr "ๅง‹ใ‚ใซๆˆปใ‚‹"
-#: ../edit.c:4621
msgid "Word from other line"
msgstr "ไป–ใฎ่กŒใฎๅ˜่ชž"
-#: ../edit.c:4624
msgid "The only match"
msgstr "ๅ”ฏไธ€ใฎ่ฉฒๅฝ“"
-#: ../edit.c:4680
#, c-format
msgid "match %d of %d"
msgstr "%d ็•ช็›ฎใฎ่ฉฒๅฝ“ (ๅ…จ่ฉฒๅฝ“ %d ๅ€‹ไธญ)"
-#: ../edit.c:4684
#, c-format
msgid "match %d"
msgstr "%d ็•ช็›ฎใฎ่ฉฒๅฝ“"
-#: ../eval.c:137
msgid "E18: Unexpected characters in :let"
msgstr "E18: ไบˆๆœŸใ›ใฌๆ–‡ๅญ—ใŒ :let ใซใ‚ใ‚Šใพใ—ใŸ"
-#: ../eval.c:138
-#, c-format
-msgid "E684: list index out of range: %<PRId64>"
-msgstr "E684: ใƒชใ‚นใƒˆใฎใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใŒ็ฏ„ๅ›ฒๅค–ใงใ™: %<PRId64>"
-
-#: ../eval.c:139
#, c-format
msgid "E121: Undefined variable: %s"
msgstr "E121: ๆœชๅฎš็พฉใฎๅค‰ๆ•ฐใงใ™: %s"
-#: ../eval.c:140
msgid "E111: Missing ']'"
msgstr "E111: ']' ใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-#: ../eval.c:141
-#, c-format
-msgid "E686: Argument of %s must be a List"
-msgstr "E686: %s ใฎๅผ•ๆ•ฐใฏใƒชใ‚นใƒˆๅž‹ใงใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“"
-
-#: ../eval.c:143
-#, c-format
-msgid "E712: Argument of %s must be a List or Dictionary"
-msgstr "E712: %s ใฎๅผ•ๆ•ฐใฏใƒชใ‚นใƒˆๅž‹ใพใŸใฏ่พžๆ›ธๅž‹ใงใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“"
-
-#: ../eval.c:144
-msgid "E713: Cannot use empty key for Dictionary"
-msgstr "E713: ่พžๆ›ธๅž‹ใซ็ฉบใฎใ‚ญใƒผใ‚’ไฝฟใ†ใ“ใจใฏใงใใพใ›ใ‚“"
-
-#: ../eval.c:145
-msgid "E714: List required"
-msgstr "E714: ใƒชใ‚นใƒˆๅž‹ใŒๅฟ…่ฆใงใ™"
-
-#: ../eval.c:146
-msgid "E715: Dictionary required"
-msgstr "E715: ่พžๆ›ธๅž‹ใŒๅฟ…่ฆใงใ™"
-
-#: ../eval.c:147
-#, c-format
-msgid "E118: Too many arguments for function: %s"
-msgstr "E118: ้–ขๆ•ฐใฎๅผ•ๆ•ฐใŒๅคš้ŽใŽใพใ™: %s"
-
-#: ../eval.c:148
-#, c-format
-msgid "E716: Key not present in Dictionary: %s"
-msgstr "E716: ่พžๆ›ธๅž‹ใซใ‚ญใƒผใŒๅญ˜ๅœจใ—ใพใ›ใ‚“: %s"
-
-#: ../eval.c:150
-#, c-format
-msgid "E122: Function %s already exists, add ! to replace it"
-msgstr "E122: ้–ขๆ•ฐ %s ใฏๅฎš็พฉๆธˆใงใ™, ๅ†ๅฎš็พฉใ™ใ‚‹ใซใฏ ! ใ‚’่ฟฝๅŠ ใ—ใฆใใ ใ•ใ„"
-
-#: ../eval.c:151
-msgid "E717: Dictionary entry already exists"
-msgstr "E717: ่พžๆ›ธๅž‹ๅ†…ใซใ‚จใƒณใƒˆใƒชใŒๆ—ขใซๅญ˜ๅœจใ—ใพใ™"
-
-#: ../eval.c:152
-msgid "E718: Funcref required"
-msgstr "E718: ้–ขๆ•ฐๅ‚็…งๅž‹ใŒ่ฆๆฑ‚ใ•ใ‚Œใพใ™"
-
-#: ../eval.c:153
msgid "E719: Cannot use [:] with a Dictionary"
msgstr "E719: [:] ใ‚’่พžๆ›ธๅž‹ใจ็ต„ใฟๅˆใ‚ใ›ใฆใฏไฝฟใˆใพใ›ใ‚“"
-#: ../eval.c:154
#, c-format
msgid "E734: Wrong variable type for %s="
msgstr "E734: ็•ฐใชใฃใŸๅž‹ใฎๅค‰ๆ•ฐใงใ™ %s="
-#: ../eval.c:155
-#, c-format
-msgid "E130: Unknown function: %s"
-msgstr "E130: ๆœช็Ÿฅใฎ้–ขๆ•ฐใงใ™: %s"
-
-#: ../eval.c:156
#, c-format
msgid "E461: Illegal variable name: %s"
msgstr "E461: ไธๆญฃใชๅค‰ๆ•ฐๅใงใ™: %s"
-#: ../eval.c:157
msgid "E806: using Float as a String"
msgstr "E806: ๆตฎๅ‹•ๅฐๆ•ฐ็‚นๆ•ฐใ‚’ๆ–‡ๅญ—ๅˆ—ใจใ—ใฆๆ‰ฑใฃใฆใ„ใพใ™"
-#: ../eval.c:1830
msgid "E687: Less targets than List items"
msgstr "E687: ใ‚ฟใƒผใ‚ฒใƒƒใƒˆใŒใƒชใ‚นใƒˆๅž‹ๅ†…ใฎ่ฆ็ด ใ‚ˆใ‚Šใ‚‚ๅฐ‘ใชใ„ใงใ™"
-#: ../eval.c:1834
msgid "E688: More targets than List items"
msgstr "E688: ใ‚ฟใƒผใ‚ฒใƒƒใƒˆใŒใƒชใ‚นใƒˆๅž‹ๅ†…ใฎ่ฆ็ด ใ‚ˆใ‚Šใ‚‚ๅคšใ„ใงใ™"
-#: ../eval.c:1906
msgid "Double ; in list of variables"
msgstr "ใƒชใ‚นใƒˆๅž‹ใฎๅ€คใซ2ใคไปฅไธŠใฎ ; ใŒๆคœๅ‡บใ•ใ‚Œใพใ—ใŸ"
-#: ../eval.c:2078
#, c-format
msgid "E738: Can't list variables for %s"
msgstr "E738: %s ใฎๅ€คใ‚’ไธ€่ฆง่กจ็คบใงใใพใ›ใ‚“"
-#: ../eval.c:2391
msgid "E689: Can only index a List or Dictionary"
msgstr "E689: ใƒชใ‚นใƒˆๅž‹ใจ่พžๆ›ธๅž‹ไปฅๅค–ใฏใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นๆŒ‡ๅฎšใงใใพใ›ใ‚“"
-#: ../eval.c:2396
msgid "E708: [:] must come last"
msgstr "E708: [:] ใฏๆœ€ๅพŒใงใชใ‘ใ‚Œใฐใ„ใ‘ใพใ›ใ‚“"
-#: ../eval.c:2439
msgid "E709: [:] requires a List value"
msgstr "E709: [:] ใซใฏใƒชใ‚นใƒˆๅž‹ใฎๅ€คใŒๅฟ…่ฆใงใ™"
-#: ../eval.c:2674
msgid "E710: List value has more items than target"
msgstr "E710: ใƒชใ‚นใƒˆๅž‹ๅค‰ๆ•ฐใซใ‚ฟใƒผใ‚ฒใƒƒใƒˆใ‚ˆใ‚Šใ‚‚ๅคšใ„่ฆ็ด ใŒใ‚ใ‚Šใพใ™"
-#: ../eval.c:2678
msgid "E711: List value has not enough items"
msgstr "E711: ใƒชใ‚นใƒˆๅž‹ๅค‰ๆ•ฐใซๅๅˆ†ใชๆ•ฐใฎ่ฆ็ด ใŒใ‚ใ‚Šใพใ›ใ‚“"
-#
-#: ../eval.c:2867
msgid "E690: Missing \"in\" after :for"
msgstr "E690: :for ใฎๅพŒใซ \"in\" ใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../eval.c:3063
-#, c-format
-msgid "E107: Missing parentheses: %s"
-msgstr "E107: ใ‚ซใƒƒใ‚ณ '(' ใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
-
-#: ../eval.c:3263
#, c-format
msgid "E108: No such variable: \"%s\""
msgstr "E108: ใใฎๅค‰ๆ•ฐใฏใ‚ใ‚Šใพใ›ใ‚“: \"%s\""
-#: ../eval.c:3333
+#, c-format
+msgid "E940: Cannot lock or unlock variable %s"
+msgstr "E940: ๅค‰ๆ•ฐ %s ใฏใƒญใƒƒใ‚ฏใพใŸใฏใ‚ขใƒณใƒญใƒƒใ‚ฏใงใใพใ›ใ‚“"
+
msgid "E743: variable nested too deep for (un)lock"
msgstr "E743: (ใ‚ขใƒณ)ใƒญใƒƒใ‚ฏใ™ใ‚‹ใซใฏๅค‰ๆ•ฐใฎๅ…ฅใ‚ŒๅญใŒๆทฑ้ŽใŽใพใ™"
-#: ../eval.c:3630
msgid "E109: Missing ':' after '?'"
msgstr "E109: '?' ใฎๅพŒใซ ':' ใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../eval.c:3893
-msgid "E691: Can only compare List with List"
-msgstr "E691: ใƒชใ‚นใƒˆๅž‹ใฏใƒชใ‚นใƒˆๅž‹ใจใ—ใ‹ๆฏ”่ผƒใงใใพใ›ใ‚“"
-
-#: ../eval.c:3895
-msgid "E692: Invalid operation for Lists"
-msgstr "E692: ใƒชใ‚นใƒˆๅž‹ใซใฏ็„กๅŠนใชๆ“ไฝœใงใ™"
-
-#: ../eval.c:3915
-msgid "E735: Can only compare Dictionary with Dictionary"
-msgstr "E735: ่พžๆ›ธๅž‹ใฏ่พžๆ›ธๅž‹ใจใ—ใ‹ๆฏ”่ผƒใงใใพใ›ใ‚“"
-
-#: ../eval.c:3917
-msgid "E736: Invalid operation for Dictionary"
-msgstr "E736: ่พžๆ›ธๅž‹ใซใฏ็„กๅŠนใชๆ“ไฝœใงใ™"
-
-#: ../eval.c:3932
-msgid "E693: Can only compare Funcref with Funcref"
-msgstr "E693: ้–ขๆ•ฐๅ‚็…งๅž‹ใฏ้–ขๆ•ฐๅ‚็…งๅž‹ใจใ—ใ‹ๆฏ”่ผƒใงใใพใ›ใ‚“"
-
-#: ../eval.c:3934
-msgid "E694: Invalid operation for Funcrefs"
-msgstr "E694: ้–ขๆ•ฐๅ‚็…งๅž‹ใซใฏ็„กๅŠนใชๆ“ไฝœใงใ™"
-
-#: ../eval.c:4277
msgid "E804: Cannot use '%' with Float"
msgstr "E804: '%' ใ‚’ๆตฎๅ‹•ๅฐๆ•ฐ็‚นๆ•ฐใจ็ต„ใฟๅˆใ‚ใ›ใฆใฏไฝฟใˆใพใ›ใ‚“"
-#: ../eval.c:4478
msgid "E110: Missing ')'"
msgstr "E110: ')' ใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-#: ../eval.c:4609
msgid "E695: Cannot index a Funcref"
msgstr "E695: ้–ขๆ•ฐๅ‚็…งๅž‹ใฏใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใงใใพใ›ใ‚“"
-#: ../eval.c:4839
+msgid "E909: Cannot index a special variable"
+msgstr "E909: ็‰นๆฎŠๅค‰ๆ•ฐใฏใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใงใใพใ›ใ‚“"
+
#, c-format
msgid "E112: Option name missing: %s"
msgstr "E112: ใ‚ชใƒ—ใ‚ทใƒงใƒณๅใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
-#: ../eval.c:4855
#, c-format
msgid "E113: Unknown option: %s"
msgstr "E113: ๆœช็Ÿฅใฎใ‚ชใƒ—ใ‚ทใƒงใƒณใงใ™: %s"
-#: ../eval.c:4904
#, c-format
msgid "E114: Missing quote: %s"
msgstr "E114: ๅผ•็”จ็ฌฆ (\") ใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
-#: ../eval.c:5020
#, c-format
msgid "E115: Missing quote: %s"
msgstr "E115: ๅผ•็”จ็ฌฆ (') ใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
-#: ../eval.c:5084
-#, c-format
-msgid "E696: Missing comma in List: %s"
-msgstr "E696: ใƒชใ‚นใƒˆๅž‹ใซใ‚ซใƒณใƒžใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
-
-#: ../eval.c:5091
-#, c-format
-msgid "E697: Missing end of List ']': %s"
-msgstr "E697: ใƒชใ‚นใƒˆๅž‹ใฎๆœ€ๅพŒใซ ']' ใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
-
msgid "Not enough memory to set references, garbage collection aborted!"
msgstr ""
"ใ‚ฌใƒผใƒ™ใƒƒใ‚ธใ‚ณใƒฌใ‚ฏใ‚ทใƒงใƒณใ‚’ไธญๆญขใ—ใพใ—ใŸ! ๅ‚็…งใ‚’ไฝœๆˆใ™ใ‚‹ใฎใซใƒกใƒขใƒชใŒไธ่ถณใ—ใพใ—ใŸ"
-#: ../eval.c:6475
-#, c-format
-msgid "E720: Missing colon in Dictionary: %s"
-msgstr "E720: ่พžๆ›ธๅž‹ใซใ‚ณใƒญใƒณใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
-
-#: ../eval.c:6499
-#, c-format
-msgid "E721: Duplicate key in Dictionary: \"%s\""
-msgstr "E721: ่พžๆ›ธๅž‹ใซ้‡่ค‡ใ‚ญใƒผใŒใ‚ใ‚Šใพใ™: \"%s\""
-
-#: ../eval.c:6517
-#, c-format
-msgid "E722: Missing comma in Dictionary: %s"
-msgstr "E722: ่พžๆ›ธๅž‹ใซใ‚ซใƒณใƒžใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
-
-#: ../eval.c:6524
-#, c-format
-msgid "E723: Missing end of Dictionary '}': %s"
-msgstr "E723: ่พžๆ›ธๅž‹ใฎๆœ€ๅพŒใซ '}' ใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
-
-#: ../eval.c:6555
msgid "E724: variable nested too deep for displaying"
msgstr "E724: ่กจ็คบใ™ใ‚‹ใซใฏๅค‰ๆ•ฐใฎๅ…ฅใ‚ŒๅญใŒๆทฑ้ŽใŽใพใ™"
-#: ../eval.c:7188
-#, c-format
-msgid "E740: Too many arguments for function %s"
-msgstr "E740: ้–ขๆ•ฐใฎๅผ•ๆ•ฐใŒๅคš้ŽใŽใพใ™: %s"
-
-#: ../eval.c:7190
-#, c-format
-msgid "E116: Invalid arguments for function %s"
-msgstr "E116: ้–ขๆ•ฐใฎ็„กๅŠนใชๅผ•ๆ•ฐใงใ™: %s"
-
-#: ../eval.c:7377
-#, c-format
-msgid "E117: Unknown function: %s"
-msgstr "E117: ๆœช็Ÿฅใฎ้–ขๆ•ฐใงใ™: %s"
-
-#: ../eval.c:7383
-#, c-format
-msgid "E119: Not enough arguments for function: %s"
-msgstr "E119: ้–ขๆ•ฐใฎๅผ•ๆ•ฐใŒ่ถณใ‚Šใพใ›ใ‚“: %s"
-
-#: ../eval.c:7387
-#, c-format
-msgid "E120: Using <SID> not in a script context: %s"
-msgstr "E120: ใ‚นใ‚ฏใƒชใƒ—ใƒˆไปฅๅค–ใง<SID>ใŒไฝฟใ‚ใ‚Œใพใ—ใŸ: %s"
-
-#: ../eval.c:7391
-#, c-format
-msgid "E725: Calling dict function without Dictionary: %s"
-msgstr "E725: ่พžๆ›ธ็”จ้–ขๆ•ฐใŒๅ‘ผใฐใ‚Œใพใ—ใŸใŒ่พžๆ›ธใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
-
-#: ../eval.c:7453
-msgid "E808: Number or Float required"
-msgstr "E808: ๆ•ฐๅ€คใ‹ๆตฎๅ‹•ๅฐๆ•ฐ็‚นๆ•ฐใŒๅฟ…่ฆใงใ™"
-
-#: ../eval.c:7503
-msgid "add() argument"
-msgstr "add() ใฎๅผ•ๆ•ฐ"
-
-#: ../eval.c:7907
-msgid "E699: Too many arguments"
-msgstr "E699: ๅผ•ๆ•ฐใŒๅคš้ŽใŽใพใ™"
-
-#: ../eval.c:8073
-msgid "E785: complete() can only be used in Insert mode"
-msgstr "E785: complete() ใฏๆŒฟๅ…ฅใƒขใƒผใƒ‰ใงใ—ใ‹ๅˆฉ็”จใงใใพใ›ใ‚“"
-
-#: ../eval.c:8156
-msgid "&Ok"
-msgstr "&Ok"
-
-#: ../eval.c:8676
-#, c-format
-msgid "E737: Key already exists: %s"
-msgstr "E737: ใ‚ญใƒผใฏๆ—ขใซๅญ˜ๅœจใ—ใพใ™: %s"
-
-#: ../eval.c:8692
-msgid "extend() argument"
-msgstr "extend() ใฎๅผ•ๆ•ฐ"
-
-#: ../eval.c:8915
-msgid "map() argument"
-msgstr "map() ใฎๅผ•ๆ•ฐ"
-
-#: ../eval.c:8916
-msgid "filter() argument"
-msgstr "filter() ใฎๅผ•ๆ•ฐ"
-
-#: ../eval.c:9229
-#, c-format
-msgid "+-%s%3ld lines: "
-msgstr "+-%s%3ld ่กŒ: "
-
-#: ../eval.c:9291
-#, c-format
-msgid "E700: Unknown function: %s"
-msgstr "E700: ๆœช็Ÿฅใฎ้–ขๆ•ฐใงใ™: %s"
-
-#: ../eval.c:10729
-msgid "called inputrestore() more often than inputsave()"
-msgstr "inputrestore() ใŒ inputsave() ใ‚ˆใ‚Šใ‚‚ๅคšใๅ‘ผใฐใ‚Œใพใ—ใŸ"
-
-#: ../eval.c:10771
-msgid "insert() argument"
-msgstr "insert() ใฎๅผ•ๆ•ฐ"
-
-#: ../eval.c:10841
-msgid "E786: Range not allowed"
-msgstr "E786: ็ฏ„ๅ›ฒๆŒ‡ๅฎšใฏ่จฑๅฏใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-
-#: ../eval.c:11140
-msgid "E701: Invalid type for len()"
-msgstr "E701: len() ใซใฏ็„กๅŠนใชๅž‹ใงใ™"
-
-#: ../eval.c:11980
-msgid "E726: Stride is zero"
-msgstr "E726: ใ‚นใƒˆใƒฉใ‚คใƒ‰(ๅ‰้€ฒ้‡)ใŒ 0 ใงใ™"
-
-#: ../eval.c:11982
-msgid "E727: Start past end"
-msgstr "E727: ้–‹ๅง‹ไฝ็ฝฎใŒ็ต‚ไบ†ไฝ็ฝฎใ‚’่ถŠใˆใพใ—ใŸ"
-
-#: ../eval.c:12024 ../eval.c:15297
-msgid "<empty>"
-msgstr "<็ฉบ>"
-
-#: ../eval.c:12282
-msgid "remove() argument"
-msgstr "remove() ใฎๅผ•ๆ•ฐ"
-
-# Added at 10-Mar-2004.
-#: ../eval.c:12466
-msgid "E655: Too many symbolic links (cycle?)"
-msgstr "E655: ใ‚ทใƒณใƒœใƒชใƒƒใ‚ฏใƒชใƒณใ‚ฏใŒๅคš้ŽใŽใพใ™ (ๅพช็’ฐใ—ใฆใ„ใ‚‹ๅฏ่ƒฝๆ€งใŒใ‚ใ‚Šใพใ™)"
-
-#: ../eval.c:12593
-msgid "reverse() argument"
-msgstr "reverse() ใฎๅผ•ๆ•ฐ"
-
-#: ../eval.c:13721
-msgid "sort() argument"
-msgstr "sort() ใฎๅผ•ๆ•ฐ"
-
-#: ../eval.c:13721
-msgid "uniq() argument"
-msgstr "uniq() ใฎๅผ•ๆ•ฐ"
-
-#: ../eval.c:13776
-msgid "E702: Sort compare function failed"
-msgstr "E702: ใ‚ฝใƒผใƒˆใฎๆฏ”่ผƒ้–ขๆ•ฐใŒๅคฑๆ•—ใ—ใพใ—ใŸ"
-
-#: ../eval.c:13806
-msgid "E882: Uniq compare function failed"
-msgstr "E882: Uniq ใฎๆฏ”่ผƒ้–ขๆ•ฐใŒๅคฑๆ•—ใ—ใพใ—ใŸ"
-
-#: ../eval.c:14085
-msgid "(Invalid)"
-msgstr "(็„กๅŠน)"
-
-#: ../eval.c:14590
-msgid "E677: Error writing temp file"
-msgstr "E677: ไธ€ๆ™‚ใƒ•ใ‚กใ‚คใƒซๆ›ธ่พผไธญใซใ‚จใƒฉใƒผใŒ็™บ็”Ÿใ—ใพใ—ใŸ"
-
-#: ../eval.c:16159
msgid "E805: Using a Float as a Number"
msgstr "E805: ๆตฎๅ‹•ๅฐๆ•ฐ็‚นๆ•ฐใ‚’ๆ•ฐๅ€คใจใ—ใฆๆ‰ฑใฃใฆใ„ใพใ™"
-#: ../eval.c:16162
msgid "E703: Using a Funcref as a Number"
-msgstr "E703: ้–ขๆ•ฐๅ‚็…งๅž‹ใ‚’ๆ•ฐๅ€คใจใ—ใฆๆ‰ฑใฃใฆใ„ใพใ™ใ€‚"
+msgstr "E703: ้–ขๆ•ฐๅ‚็…งๅž‹ใ‚’ๆ•ฐๅ€คใจใ—ใฆๆ‰ฑใฃใฆใ„ใพใ™"
-#: ../eval.c:16170
msgid "E745: Using a List as a Number"
msgstr "E745: ใƒชใ‚นใƒˆๅž‹ใ‚’ๆ•ฐๅ€คใจใ—ใฆๆ‰ฑใฃใฆใ„ใพใ™"
-#: ../eval.c:16173
msgid "E728: Using a Dictionary as a Number"
msgstr "E728: ่พžๆ›ธๅž‹ใ‚’ๆ•ฐๅ€คใจใ—ใฆๆ‰ฑใฃใฆใ„ใพใ™"
+msgid "E910: Using a Job as a Number"
+msgstr "E910: ใ‚ธใƒงใƒ–ใ‚’ๆ•ฐๅ€คใจใ—ใฆๆ‰ฑใฃใฆใ„ใพใ™"
+
+msgid "E913: Using a Channel as a Number"
+msgstr "E913: ใƒใƒฃใƒใƒซใ‚’ๆ•ฐๅ€คใจใ—ใฆๆ‰ฑใฃใฆใ„ใพใ™"
+
msgid "E891: Using a Funcref as a Float"
-msgstr "E891: ้–ขๆ•ฐๅ‚็…งๅž‹ใ‚’ๆตฎๅ‹•ๅฐๆ•ฐ็‚นๆ•ฐใจใ—ใฆๆ‰ฑใฃใฆใ„ใพใ™ใ€‚"
+msgstr "E891: ้–ขๆ•ฐๅ‚็…งๅž‹ใ‚’ๆตฎๅ‹•ๅฐๆ•ฐ็‚นๆ•ฐใจใ—ใฆๆ‰ฑใฃใฆใ„ใพใ™"
msgid "E892: Using a String as a Float"
msgstr "E892: ๆ–‡ๅญ—ๅˆ—ใ‚’ๆตฎๅ‹•ๅฐๆ•ฐ็‚นๆ•ฐใจใ—ใฆๆ‰ฑใฃใฆใ„ใพใ™"
@@ -877,265 +607,306 @@ msgstr "E893: ใƒชใ‚นใƒˆๅž‹ใ‚’ๆตฎๅ‹•ๅฐๆ•ฐ็‚นๆ•ฐใจใ—ใฆๆ‰ฑใฃใฆใ„ใพใ™"
msgid "E894: Using a Dictionary as a Float"
msgstr "E894: ่พžๆ›ธๅž‹ใ‚’ๆตฎๅ‹•ๅฐๆ•ฐ็‚นๆ•ฐใจใ—ใฆๆ‰ฑใฃใฆใ„ใพใ™"
-#: ../eval.c:16259
+msgid "E907: Using a special value as a Float"
+msgstr "E907: ็‰นๆฎŠๅ€คใ‚’ๆตฎๅ‹•ๅฐๆ•ฐ็‚นๆ•ฐใจใ—ใฆๆ‰ฑใฃใฆใ„ใพใ™"
+
+msgid "E911: Using a Job as a Float"
+msgstr "E911: ใ‚ธใƒงใƒ–ใ‚’ๆตฎๅ‹•ๅฐๆ•ฐ็‚นๆ•ฐใจใ—ใฆๆ‰ฑใฃใฆใ„ใพใ™"
+
+msgid "E914: Using a Channel as a Float"
+msgstr "E914: ใƒใƒฃใƒใƒซใ‚’ๆตฎๅ‹•ๅฐๆ•ฐ็‚นๆ•ฐใจใ—ใฆๆ‰ฑใฃใฆใ„ใพใ™"
+
msgid "E729: using Funcref as a String"
msgstr "E729: ้–ขๆ•ฐๅ‚็…งๅž‹ใ‚’ๆ–‡ๅญ—ๅˆ—ใจใ—ใฆๆ‰ฑใฃใฆใ„ใพใ™"
-#: ../eval.c:16262
msgid "E730: using List as a String"
msgstr "E730: ใƒชใ‚นใƒˆๅž‹ใ‚’ๆ–‡ๅญ—ๅˆ—ใจใ—ใฆๆ‰ฑใฃใฆใ„ใพใ™"
-#: ../eval.c:16265
msgid "E731: using Dictionary as a String"
msgstr "E731: ่พžๆ›ธๅž‹ใ‚’ๆ–‡ๅญ—ๅˆ—ใจใ—ใฆๆ‰ฑใฃใฆใ„ใพใ™"
-#: ../eval.c:16619
-#, c-format
-msgid "E706: Variable type mismatch for: %s"
-msgstr "E706: ๅค‰ๆ•ฐใฎๅž‹ใŒไธ€่‡ดใ—ใพใ›ใ‚“: %s"
+msgid "E908: using an invalid value as a String"
+msgstr "E908: ็„กๅŠนใชๅ€คใ‚’ๆ–‡ๅญ—ๅˆ—ใจใ—ใฆๆ‰ฑใฃใฆใ„ใพใ™"
-#: ../eval.c:16705
#, c-format
msgid "E795: Cannot delete variable %s"
msgstr "E795: ๅค‰ๆ•ฐ %s ใ‚’ๅ‰Š้™คใงใใพใ›ใ‚“"
-#: ../eval.c:16724
#, c-format
msgid "E704: Funcref variable name must start with a capital: %s"
msgstr "E704: ้–ขๆ•ฐๅ‚็…งๅž‹ๅค‰ๆ•ฐๅใฏๅคงๆ–‡ๅญ—ใงๅง‹ใพใ‚‰ใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“: %s"
-#: ../eval.c:16732
#, c-format
msgid "E705: Variable name conflicts with existing function: %s"
msgstr "E705: ๅค‰ๆ•ฐๅใŒๆ—ขๅญ˜ใฎ้–ขๆ•ฐๅใจ่ก็ชใ—ใพใ™: %s"
-#: ../eval.c:16763
#, c-format
msgid "E741: Value is locked: %s"
msgstr "E741: ๅ€คใŒใƒญใƒƒใ‚ฏใ•ใ‚Œใฆใ„ใพใ™: %s"
-#: ../eval.c:16764 ../eval.c:16769 ../message.c:1839
msgid "Unknown"
msgstr "ไธๆ˜Ž"
-#: ../eval.c:16768
#, c-format
msgid "E742: Cannot change value of %s"
msgstr "E742: %s ใฎๅ€คใ‚’ๅค‰ๆ›ดใงใใพใ›ใ‚“"
-#: ../eval.c:16838
msgid "E698: variable nested too deep for making a copy"
msgstr "E698: ใ‚ณใƒ”ใƒผใ‚’ๅ–ใ‚‹ใซใฏๅค‰ๆ•ฐใฎๅ…ฅใ‚ŒๅญใŒๆทฑ้ŽใŽใพใ™"
-#: ../eval.c:17249
-#, c-format
-msgid "E123: Undefined function: %s"
-msgstr "E123: ๆœชๅฎš็พฉใฎ้–ขๆ•ฐใงใ™: %s"
+msgid ""
+"\n"
+"# global variables:\n"
+msgstr ""
+"\n"
+"# ใ‚ฐใƒญใƒผใƒใƒซๅค‰ๆ•ฐ:\n"
-#: ../eval.c:17260
-#, c-format
-msgid "E124: Missing '(': %s"
-msgstr "E124: '(' ใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
+msgid ""
+"\n"
+"\tLast set from "
+msgstr ""
+"\n"
+"\tๆœ€ๅพŒใซใ‚ปใƒƒใƒˆใ—ใŸใ‚นใ‚ฏใƒชใƒ—ใƒˆ: "
-#: ../eval.c:17293
-msgid "E862: Cannot use g: here"
-msgstr "E862: ใ“ใ“ใงใฏ g: ใฏไฝฟใˆใพใ›ใ‚“"
+msgid "E691: Can only compare List with List"
+msgstr "E691: ใƒชใ‚นใƒˆๅž‹ใฏใƒชใ‚นใƒˆๅž‹ใจใ—ใ‹ๆฏ”่ผƒใงใใพใ›ใ‚“"
-#: ../eval.c:17312
-#, c-format
-msgid "E125: Illegal argument: %s"
-msgstr "E125: ไธๆญฃใชๅผ•ๆ•ฐใงใ™: %s"
+msgid "E692: Invalid operation for List"
+msgstr "E692: ใƒชใ‚นใƒˆๅž‹ใซใฏ็„กๅŠนใชๆ“ไฝœใงใ™"
-#: ../eval.c:17323
-#, c-format
-msgid "E853: Duplicate argument name: %s"
-msgstr "E853: ๅผ•ๆ•ฐๅใŒ้‡่ค‡ใ—ใฆใ„ใพใ™: %s"
+msgid "E735: Can only compare Dictionary with Dictionary"
+msgstr "E735: ่พžๆ›ธๅž‹ใฏ่พžๆ›ธๅž‹ใจใ—ใ‹ๆฏ”่ผƒใงใใพใ›ใ‚“"
-#: ../eval.c:17416
-msgid "E126: Missing :endfunction"
-msgstr "E126: :endfunction ใŒใ‚ใ‚Šใพใ›ใ‚“"
+msgid "E736: Invalid operation for Dictionary"
+msgstr "E736: ่พžๆ›ธๅž‹ใซใฏ็„กๅŠนใชๆ“ไฝœใงใ™"
-#: ../eval.c:17537
-#, c-format
-msgid "E707: Function name conflicts with variable: %s"
-msgstr "E707: ้–ขๆ•ฐๅใŒๅค‰ๆ•ฐๅใจ่ก็ชใ—ใพใ™: %s"
+msgid "E694: Invalid operation for Funcrefs"
+msgstr "E694: ้–ขๆ•ฐๅ‚็…งๅž‹ใซใฏ็„กๅŠนใชๆ“ไฝœใงใ™"
-#: ../eval.c:17549
-#, c-format
-msgid "E127: Cannot redefine function %s: It is in use"
-msgstr "E127: ้–ขๆ•ฐ %s ใ‚’ๅ†ๅฎš็พฉใงใใพใ›ใ‚“: ไฝฟ็”จไธญใงใ™"
+msgid "map() argument"
+msgstr "map() ใฎๅผ•ๆ•ฐ"
+
+msgid "filter() argument"
+msgstr "filter() ใฎๅผ•ๆ•ฐ"
-#: ../eval.c:17604
#, c-format
-msgid "E746: Function name does not match script file name: %s"
-msgstr "E746: ้–ขๆ•ฐๅใŒใ‚นใ‚ฏใƒชใƒ—ใƒˆใฎใƒ•ใ‚กใ‚คใƒซๅใจไธ€่‡ดใ—ใพใ›ใ‚“: %s"
+msgid "E686: Argument of %s must be a List"
+msgstr "E686: %s ใฎๅผ•ๆ•ฐใฏใƒชใ‚นใƒˆๅž‹ใงใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“"
-#: ../eval.c:17716
-msgid "E129: Function name required"
-msgstr "E129: ้–ขๆ•ฐๅใŒ่ฆๆฑ‚ใ•ใ‚Œใพใ™"
+msgid "E928: String required"
+msgstr "E928: ๆ–‡ๅญ—ๅˆ—ใŒๅฟ…่ฆใงใ™"
-#: ../eval.c:17824
-#, c-format
-msgid "E128: Function name must start with a capital or \"s:\": %s"
-msgstr "E128: ้–ขๆ•ฐๅใฏๅคงๆ–‡ๅญ—ใ‹ \"s:\" ใงๅง‹ใพใ‚‰ใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“: %s"
+msgid "E808: Number or Float required"
+msgstr "E808: ๆ•ฐๅ€คใ‹ๆตฎๅ‹•ๅฐๆ•ฐ็‚นๆ•ฐใŒๅฟ…่ฆใงใ™"
-#: ../eval.c:17833
-#, c-format
-msgid "E884: Function name cannot contain a colon: %s"
-msgstr "E884: ้–ขๆ•ฐๅใซใฏใ‚ณใƒญใƒณใฏๅซใ‚ใ‚‰ใ‚Œใพใ›ใ‚“: %s"
+msgid "add() argument"
+msgstr "add() ใฎๅผ•ๆ•ฐ"
-#: ../eval.c:18336
-#, c-format
-msgid "E131: Cannot delete function %s: It is in use"
-msgstr "E131: ้–ขๆ•ฐ %s ใ‚’ๅ‰Š้™คใงใใพใ›ใ‚“: ไฝฟ็”จไธญใงใ™"
+msgid "E785: complete() can only be used in Insert mode"
+msgstr "E785: complete() ใฏๆŒฟๅ…ฅใƒขใƒผใƒ‰ใงใ—ใ‹ๅˆฉ็”จใงใใพใ›ใ‚“"
-#: ../eval.c:18441
-msgid "E132: Function call depth is higher than 'maxfuncdepth'"
-msgstr "E132: ้–ขๆ•ฐๅ‘ผๅ‡บใฎๅ…ฅใ‚Œๅญๆ•ฐใŒ 'maxfuncdepth' ใ‚’่ถ…ใˆใพใ—ใŸ"
+msgid "&Ok"
+msgstr "&Ok"
-#: ../eval.c:18568
#, c-format
-msgid "calling %s"
-msgstr "%s ใ‚’ๅฎŸ่กŒไธญใงใ™"
+msgid "+-%s%3ld line: "
+msgid_plural "+-%s%3ld lines: "
+msgstr[0] "+-%s%3ld ่กŒ: "
-#: ../eval.c:18651
#, c-format
-msgid "%s aborted"
-msgstr "%s ใŒไธญๆ–ญใ•ใ‚Œใพใ—ใŸ"
+msgid "E700: Unknown function: %s"
+msgstr "E700: ๆœช็Ÿฅใฎ้–ขๆ•ฐใงใ™: %s"
+
+msgid "E922: expected a dict"
+msgstr "E922: ่พžๆ›ธใŒๆœŸๅพ…ใ•ใ‚Œใฆใ„ใพใ™"
+
+msgid "E923: Second argument of function() must be a list or a dict"
+msgstr "E923: function() ใฎ็ฌฌ 2 ๅผ•ๆ•ฐใฏใƒชใ‚นใƒˆๅž‹ใพใŸใฏ่พžๆ›ธๅž‹ใงใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“"
+
+msgid ""
+"&OK\n"
+"&Cancel"
+msgstr ""
+"ๆฑบๅฎš(&O)\n"
+"ใ‚ญใƒฃใƒณใ‚ปใƒซ(&C)"
+
+msgid "called inputrestore() more often than inputsave()"
+msgstr "inputrestore() ใŒ inputsave() ใ‚ˆใ‚Šใ‚‚ๅคšใๅ‘ผใฐใ‚Œใพใ—ใŸ"
+
+msgid "insert() argument"
+msgstr "insert() ใฎๅผ•ๆ•ฐ"
+
+msgid "E786: Range not allowed"
+msgstr "E786: ็ฏ„ๅ›ฒๆŒ‡ๅฎšใฏ่จฑๅฏใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
+
+msgid "E916: not a valid job"
+msgstr "E916: ๆœ‰ๅŠนใชใ‚ธใƒงใƒ–ใงใฏใ‚ใ‚Šใพใ›ใ‚“"
+
+msgid "E701: Invalid type for len()"
+msgstr "E701: len() ใซใฏ็„กๅŠนใชๅž‹ใงใ™"
-#: ../eval.c:18653
#, c-format
-msgid "%s returning #%<PRId64>"
-msgstr "%s ใŒ #%<PRId64> ใ‚’่ฟ”ใ—ใพใ—ใŸ"
+msgid "E798: ID is reserved for \":match\": %ld"
+msgstr "E798: ID ใฏ \":match\" ใฎใŸใ‚ใซไบˆ็ด„ใ•ใ‚Œใฆใ„ใพใ™: %ld"
+
+msgid "E726: Stride is zero"
+msgstr "E726: ใ‚นใƒˆใƒฉใ‚คใƒ‰(ๅ‰้€ฒ้‡)ใŒ 0 ใงใ™"
+
+msgid "E727: Start past end"
+msgstr "E727: ้–‹ๅง‹ไฝ็ฝฎใŒ็ต‚ไบ†ไฝ็ฝฎใ‚’่ถŠใˆใพใ—ใŸ"
+
+msgid "<empty>"
+msgstr "<็ฉบ>"
+
+msgid "E240: No connection to the X server"
+msgstr "E240: X ใ‚ตใƒผใƒใƒผใธใฎๆŽฅ็ถšใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../eval.c:18670
#, c-format
-msgid "%s returning %s"
-msgstr "%s ใŒ %s ใ‚’่ฟ”ใ—ใพใ—ใŸ"
+msgid "E241: Unable to send to %s"
+msgstr "E241: %s ใธ้€ใ‚‹ใ“ใจใŒใงใใพใ›ใ‚“"
+
+msgid "E277: Unable to read a server reply"
+msgstr "E277: ใ‚ตใƒผใƒใƒผใฎๅฟœ็ญ”ใŒใ‚ใ‚Šใพใ›ใ‚“"
+
+msgid "E941: already started a server"
+msgstr "E941: ใ‚ตใƒผใƒใƒผใฏใ™ใงใซ้–‹ๅง‹ใ—ใฆใ„ใพใ™"
+
+msgid "E942: +clientserver feature not available"
+msgstr "E942: +clientserver ๆฉŸ่ƒฝใŒ็„กๅŠนใซใชใฃใฆใ„ใพใ™"
+
+msgid "remove() argument"
+msgstr "remove() ใฎๅผ•ๆ•ฐ"
+
+# Added at 10-Mar-2004.
+msgid "E655: Too many symbolic links (cycle?)"
+msgstr "E655: ใ‚ทใƒณใƒœใƒชใƒƒใ‚ฏใƒชใƒณใ‚ฏใŒๅคš้ŽใŽใพใ™ (ๅพช็’ฐใ—ใฆใ„ใ‚‹ๅฏ่ƒฝๆ€งใŒใ‚ใ‚Šใพใ™)"
+
+msgid "reverse() argument"
+msgstr "reverse() ใฎๅผ•ๆ•ฐ"
+
+msgid "E258: Unable to send to client"
+msgstr "E258: ใ‚ฏใƒฉใ‚คใ‚ขใƒณใƒˆใธ้€ใ‚‹ใ“ใจใŒใงใใพใ›ใ‚“"
-#: ../eval.c:18691 ../ex_cmds2.c:2695
#, c-format
-msgid "continuing in %s"
-msgstr "%s ใฎๅฎŸ่กŒใ‚’็ถ™็ถšไธญใงใ™"
+msgid "E927: Invalid action: '%s'"
+msgstr "E927: ็„กๅŠนใชๆ“ไฝœใงใ™: %s"
-#: ../eval.c:18795
-msgid "E133: :return not inside a function"
-msgstr "E133: ้–ขๆ•ฐๅค–ใซ :return ใŒใ‚ใ‚Šใพใ—ใŸ"
+msgid "sort() argument"
+msgstr "sort() ใฎๅผ•ๆ•ฐ"
-#: ../eval.c:19159
-msgid ""
-"\n"
-"# global variables:\n"
-msgstr ""
-"\n"
-"# ใ‚ฐใƒญใƒผใƒใƒซๅค‰ๆ•ฐ:\n"
+msgid "uniq() argument"
+msgstr "uniq() ใฎๅผ•ๆ•ฐ"
-#: ../eval.c:19254
-msgid ""
-"\n"
-"\tLast set from "
-msgstr ""
-"\n"
-"\tLast set from "
+msgid "E702: Sort compare function failed"
+msgstr "E702: ใ‚ฝใƒผใƒˆใฎๆฏ”่ผƒ้–ขๆ•ฐใŒๅคฑๆ•—ใ—ใพใ—ใŸ"
-#: ../eval.c:19272
-msgid "No old files"
-msgstr "ๅคใ„ใƒ•ใ‚กใ‚คใƒซใฏใ‚ใ‚Šใพใ›ใ‚“"
+msgid "E882: Uniq compare function failed"
+msgstr "E882: Uniq ใฎๆฏ”่ผƒ้–ขๆ•ฐใŒๅคฑๆ•—ใ—ใพใ—ใŸ"
+
+msgid "(Invalid)"
+msgstr "(็„กๅŠน)"
+
+#, c-format
+msgid "E935: invalid submatch number: %d"
+msgstr "E935: ็„กๅŠนใชใ‚ตใƒ–ใƒžใƒƒใƒ็•ชๅท: %d"
+
+msgid "E677: Error writing temp file"
+msgstr "E677: ไธ€ๆ™‚ใƒ•ใ‚กใ‚คใƒซๆ›ธ่พผไธญใซใ‚จใƒฉใƒผใŒ็™บ็”Ÿใ—ใพใ—ใŸ"
+
+msgid "E921: Invalid callback argument"
+msgstr "E921: ็„กๅŠนใชใ‚ณใƒผใƒซใƒใƒƒใ‚ฏๅผ•ๆ•ฐใงใ™"
+
+#, c-format
+msgid "<%s>%s%s %d, Hex %02x, Oct %03o, Digr %s"
+msgstr "<%s>%s%s %d, 16้€ฒๆ•ฐ %02x, 8้€ฒๆ•ฐ %03o, ใƒ€ใ‚คใ‚ฐใƒฉใƒ• %s"
-#: ../ex_cmds.c:122
#, c-format
msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
msgstr "<%s>%s%s %d, 16้€ฒๆ•ฐ %02x, 8้€ฒๆ•ฐ %03o"
-#: ../ex_cmds.c:145
+#, c-format
+msgid "> %d, Hex %04x, Oct %o, Digr %s"
+msgstr "> %d, 16้€ฒๆ•ฐ %04x, 8้€ฒๆ•ฐ %o, ใƒ€ใ‚คใ‚ฐใƒฉใƒ• %s"
+
+#, c-format
+msgid "> %d, Hex %08x, Oct %o, Digr %s"
+msgstr "> %d, 16้€ฒๆ•ฐ %08x, 8้€ฒๆ•ฐ %o, ใƒ€ใ‚คใ‚ฐใƒฉใƒ• %s"
+
#, c-format
msgid "> %d, Hex %04x, Octal %o"
msgstr "> %d, 16้€ฒๆ•ฐ %04x, 8้€ฒๆ•ฐ %o"
-#: ../ex_cmds.c:146
#, c-format
msgid "> %d, Hex %08x, Octal %o"
msgstr "> %d, 16้€ฒๆ•ฐ %08x, 8้€ฒๆ•ฐ %o"
-#: ../ex_cmds.c:684
msgid "E134: Move lines into themselves"
msgstr "E134: ่กŒใ‚’ใใ‚Œ่‡ช่บซใซใฏ็งปๅ‹•ใงใใพใ›ใ‚“"
-#: ../ex_cmds.c:747
msgid "1 line moved"
msgstr "1 ่กŒใŒ็งปๅ‹•ใ•ใ‚Œใพใ—ใŸ"
-#: ../ex_cmds.c:749
#, c-format
-msgid "%<PRId64> lines moved"
-msgstr "%<PRId64> ่กŒใŒ็งปๅ‹•ใ•ใ‚Œใพใ—ใŸ"
+msgid "%ld lines moved"
+msgstr "%ld ่กŒใŒ็งปๅ‹•ใ•ใ‚Œใพใ—ใŸ"
-#: ../ex_cmds.c:1175
#, c-format
-msgid "%<PRId64> lines filtered"
-msgstr "%<PRId64> ่กŒใŒใƒ•ใ‚ฃใƒซใ‚ฟๅ‡ฆ็†ใ•ใ‚Œใพใ—ใŸ"
+msgid "%ld lines filtered"
+msgstr "%ld ่กŒใŒใƒ•ใ‚ฃใƒซใ‚ฟๅ‡ฆ็†ใ•ใ‚Œใพใ—ใŸ"
-#: ../ex_cmds.c:1194
msgid "E135: *Filter* Autocommands must not change current buffer"
msgstr "E135: *ใƒ•ใ‚ฃใƒซใ‚ฟ* autocommandใฏ็พๅœจใฎใƒใƒƒใƒ•ใ‚กใ‚’ๅค‰ๆ›ดใ—ใฆใฏใ„ใ‘ใพใ›ใ‚“"
-#: ../ex_cmds.c:1244
msgid "[No write since last change]\n"
msgstr "[ๆœ€ๅพŒใฎๅค‰ๆ›ดใŒไฟๅญ˜ใ•ใ‚Œใฆใ„ใพใ›ใ‚“]\n"
-#: ../ex_cmds.c:1424
#, c-format
msgid "%sviminfo: %s in line: "
msgstr "%sviminfo: %s ่กŒ็›ฎ: "
-#: ../ex_cmds.c:1431
msgid "E136: viminfo: Too many errors, skipping rest of file"
-msgstr "E136: viminfo: ใ‚จใƒฉใƒผใŒๅคš้ŽใŽใ‚‹ใฎใง, ไปฅ้™ใฏใ‚นใ‚ญใƒƒใƒ—ใ—ใพใ™"
+msgstr "E136: viminfo: ใ‚จใƒฉใƒผใŒๅคš้ŽใŽใ‚‹ใฎใงใ€ไปฅ้™ใฏใ‚นใ‚ญใƒƒใƒ—ใ—ใพใ™"
-#: ../ex_cmds.c:1458
#, c-format
msgid "Reading viminfo file \"%s\"%s%s%s"
msgstr "viminfoใƒ•ใ‚กใ‚คใƒซ \"%s\"%s%s%s ใ‚’่ชญ่พผใฟไธญ"
-#: ../ex_cmds.c:1460
msgid " info"
msgstr " ๆƒ…ๅ ฑ"
-#: ../ex_cmds.c:1461
msgid " marks"
msgstr " ใƒžใƒผใ‚ฏ"
-#: ../ex_cmds.c:1462
msgid " oldfiles"
msgstr " ๆ—งใƒ•ใ‚กใ‚คใƒซ็พค"
-#: ../ex_cmds.c:1463
msgid " FAILED"
msgstr " ๅคฑๆ•—"
-#. avoid a wait_return for this message, it's annoying
-#: ../ex_cmds.c:1541
#, c-format
msgid "E137: Viminfo file is not writable: %s"
msgstr "E137: viminfoใƒ•ใ‚กใ‚คใƒซใŒๆ›ธ่พผใฟใงใใพใ›ใ‚“: %s"
-#: ../ex_cmds.c:1626
+#, c-format
+msgid "E929: Too many viminfo temp files, like %s!"
+msgstr "E929: ไธ€ๆ™‚viminfoใƒ•ใ‚กใ‚คใƒซใŒๅคš้ŽใŽใพใ™! ไพ‹: %s"
+
#, c-format
msgid "E138: Can't write viminfo file %s!"
msgstr "E138: viminfoใƒ•ใ‚กใ‚คใƒซ %s ใ‚’ไฟๅญ˜ใงใใพใ›ใ‚“!"
-#: ../ex_cmds.c:1635
#, c-format
msgid "Writing viminfo file \"%s\""
msgstr "viminfoใƒ•ใ‚กใ‚คใƒซ \"%s\" ใ‚’ๆ›ธ่พผใฟไธญ"
-#. Write the info:
-#: ../ex_cmds.c:1720
+#, c-format
+msgid "E886: Can't rename viminfo file to %s!"
+msgstr "E886: viminfoใƒ•ใ‚กใ‚คใƒซใ‚’ %s ใธๅๅ‰ๅค‰ๆ›ดใงใใพใ›ใ‚“!"
+
#, c-format
msgid "# This viminfo file was generated by Vim %s.\n"
msgstr "# ใ“ใฎ viminfo ใƒ•ใ‚กใ‚คใƒซใฏ Vim %s ใซใ‚ˆใฃใฆ็”Ÿๆˆใ•ใ‚Œใพใ—ใŸ.\n"
-#: ../ex_cmds.c:1722
msgid ""
"# You may edit it if you're careful!\n"
"\n"
@@ -1143,47 +914,47 @@ msgstr ""
"# ๅค‰ๆ›ดใ™ใ‚‹้š›ใซใฏๅๅˆ†ๆณจๆ„ใ—ใฆใใ ใ•ใ„!\n"
"\n"
-#: ../ex_cmds.c:1723
msgid "# Value of 'encoding' when this file was written\n"
msgstr "# ใ“ใฎใƒ•ใ‚กใ‚คใƒซใŒๆ›ธใ‹ใ‚ŒใŸๆ™‚ใฎ 'encoding' ใฎๅ€ค\n"
-#: ../ex_cmds.c:1800
msgid "Illegal starting char"
msgstr "ไธๆญฃใชๅ…ˆ้ ญๆ–‡ๅญ—ใงใ™"
-#: ../ex_cmds.c:2162
+msgid ""
+"\n"
+"# Bar lines, copied verbatim:\n"
+msgstr ""
+"\n"
+"# '|' ใงๅง‹ใพใ‚‹่กŒใฎใ€ๆ–‡ๅญ—้€šใ‚Šใฎใ‚ณใƒ”ใƒผ:\n"
+
+msgid "Save As"
+msgstr "ๅˆฅๅใงไฟๅญ˜"
+
msgid "Write partial file?"
msgstr "ใƒ•ใ‚กใ‚คใƒซใ‚’้ƒจๅˆ†็š„ใซไฟๅญ˜ใ—ใพใ™ใ‹?"
-#: ../ex_cmds.c:2166
msgid "E140: Use ! to write partial buffer"
msgstr "E140: ใƒใƒƒใƒ•ใ‚กใ‚’้ƒจๅˆ†็š„ใซไฟๅญ˜ใ™ใ‚‹ใซใฏ ! ใ‚’ไฝฟใฃใฆใใ ใ•ใ„"
-#: ../ex_cmds.c:2281
#, c-format
msgid "Overwrite existing file \"%s\"?"
msgstr "ๆ—ขๅญ˜ใฎใƒ•ใ‚กใ‚คใƒซ \"%s\" ใ‚’ไธŠๆ›ธใใ—ใพใ™ใ‹?"
-#: ../ex_cmds.c:2317
#, c-format
msgid "Swap file \"%s\" exists, overwrite anyway?"
msgstr "ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซ \"%s\" ใŒๅญ˜ๅœจใ—ใพใ™. ไธŠๆ›ธใใ‚’ๅผทๅˆถใ—ใพใ™ใ‹?"
-#: ../ex_cmds.c:2326
#, c-format
msgid "E768: Swap file exists: %s (:silent! overrides)"
msgstr "E768: ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใŒๅญ˜ๅœจใ—ใพใ™: %s (:silent! ใ‚’่ฟฝๅŠ ใงไธŠๆ›ธ)"
-#: ../ex_cmds.c:2381
#, c-format
-msgid "E141: No file name for buffer %<PRId64>"
-msgstr "E141: ใƒใƒƒใƒ•ใ‚ก %<PRId64> ใซใฏๅๅ‰ใŒใ‚ใ‚Šใพใ›ใ‚“"
+msgid "E141: No file name for buffer %ld"
+msgstr "E141: ใƒใƒƒใƒ•ใ‚ก %ld ใซใฏๅๅ‰ใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../ex_cmds.c:2412
msgid "E142: File not written: Writing is disabled by 'write' option"
msgstr "E142: ใƒ•ใ‚กใ‚คใƒซใฏไฟๅญ˜ใ•ใ‚Œใพใ›ใ‚“ใงใ—ใŸ: 'write' ใ‚ชใƒ—ใ‚ทใƒงใƒณใซใ‚ˆใ‚Š็„กๅŠนใงใ™"
-#: ../ex_cmds.c:2434
#, c-format
msgid ""
"'readonly' option is set for \"%s\".\n"
@@ -1192,7 +963,6 @@ msgstr ""
"\"%s\" ใซใฏ 'readonly' ใ‚ชใƒ—ใ‚ทใƒงใƒณใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใพใ™.\n"
"ไธŠๆ›ธใๅผทๅˆถใ‚’ใ—ใพใ™ใ‹?"
-#: ../ex_cmds.c:2439
#, c-format
msgid ""
"File permissions of \"%s\" are read-only.\n"
@@ -1203,83 +973,68 @@ msgstr ""
"ใใ‚Œใงใ‚‚ๆใ‚‰ใๆ›ธใ่พผใ‚€ใ“ใจใฏๅฏ่ƒฝใงใ™.\n"
"็ถ™็ถšใ—ใพใ™ใ‹?"
-#: ../ex_cmds.c:2451
#, c-format
msgid "E505: \"%s\" is read-only (add ! to override)"
msgstr "E505: \"%s\" ใฏ่ชญ่พผๅฐ‚็”จใงใ™ (ๅผทๅˆถๆ›ธ่พผใซใฏ ! ใ‚’่ฟฝๅŠ )"
-#: ../ex_cmds.c:3120
+msgid "Edit File"
+msgstr "ใƒ•ใ‚กใ‚คใƒซใ‚’็ทจ้›†"
+
#, c-format
msgid "E143: Autocommands unexpectedly deleted new buffer %s"
msgstr "E143: autocommandใŒไบˆๆœŸใ›ใšๆ–ฐใ—ใ„ใƒใƒƒใƒ•ใ‚ก %s ใ‚’ๅ‰Š้™คใ—ใพใ—ใŸ"
-#: ../ex_cmds.c:3313
msgid "E144: non-numeric argument to :z"
msgstr "E144: ๆ•ฐใงใฏใชใ„ๅผ•ๆ•ฐใŒ :z ใซๆธกใ•ใ‚Œใพใ—ใŸ"
-#: ../ex_cmds.c:3404
msgid "E145: Shell commands not allowed in rvim"
msgstr "E145: rvimใงใฏใ‚ทใ‚งใƒซใ‚ณใƒžใƒณใƒ‰ใ‚’ไฝฟใˆใพใ›ใ‚“"
-#: ../ex_cmds.c:3498
msgid "E146: Regular expressions can't be delimited by letters"
msgstr "E146: ๆญฃ่ฆ่กจ็พใฏๆ–‡ๅญ—ใงๅŒบๅˆ‡ใ‚‹ใ“ใจใŒใงใใพใ›ใ‚“"
-#: ../ex_cmds.c:3964
#, c-format
msgid "replace with %s (y/n/a/q/l/^E/^Y)?"
msgstr "%s ใซ็ฝฎๆ›ใ—ใพใ™ใ‹? (y/n/a/q/l/^E/^Y)"
-#: ../ex_cmds.c:4379
msgid "(Interrupted) "
msgstr "(ๅ‰ฒ่พผใพใ‚Œใพใ—ใŸ) "
-#: ../ex_cmds.c:4384
msgid "1 match"
msgstr "1 ็ฎ‡ๆ‰€่ฉฒๅฝ“ใ—ใพใ—ใŸ"
-#: ../ex_cmds.c:4384
msgid "1 substitution"
msgstr "1 ็ฎ‡ๆ‰€็ฝฎๆ›ใ—ใพใ—ใŸ"
-#: ../ex_cmds.c:4387
#, c-format
-msgid "%<PRId64> matches"
-msgstr "%<PRId64> ็ฎ‡ๆ‰€่ฉฒๅฝ“ใ—ใพใ—ใŸ"
+msgid "%ld matches"
+msgstr "%ld ็ฎ‡ๆ‰€่ฉฒๅฝ“ใ—ใพใ—ใŸ"
-#: ../ex_cmds.c:4388
#, c-format
-msgid "%<PRId64> substitutions"
-msgstr "%<PRId64> ็ฎ‡ๆ‰€็ฝฎๆ›ใ—ใพใ—ใŸ"
+msgid "%ld substitutions"
+msgstr "%ld ็ฎ‡ๆ‰€็ฝฎๆ›ใ—ใพใ—ใŸ"
-#: ../ex_cmds.c:4392
msgid " on 1 line"
msgstr " (่จˆ 1 ่กŒๅ†…)"
-#: ../ex_cmds.c:4395
#, c-format
-msgid " on %<PRId64> lines"
-msgstr " (่จˆ %<PRId64> ่กŒๅ†…)"
+msgid " on %ld lines"
+msgstr " (่จˆ %ld ่กŒๅ†…)"
-#: ../ex_cmds.c:4438
-msgid "E147: Cannot do :global recursive"
-msgstr "E147: :global ใ‚’ๅ†ๅธฐ็š„ใซใฏไฝฟใˆใพใ›ใ‚“"
+msgid "E147: Cannot do :global recursive with a range"
+msgstr "E147: :global ใ‚’็ฏ„ๅ›ฒไป˜ใใงๅ†ๅธฐ็š„ใซใฏไฝฟใˆใพใ›ใ‚“"
-#: ../ex_cmds.c:4467
msgid "E148: Regular expression missing from global"
msgstr "E148: globalใ‚ณใƒžใƒณใƒ‰ใซๆญฃ่ฆ่กจ็พใŒๆŒ‡ๅฎšใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#: ../ex_cmds.c:4508
#, c-format
msgid "Pattern found in every line: %s"
msgstr "ใƒ‘ใ‚ฟใƒผใƒณใŒๅ…จใฆใฎ่กŒใง่ฆ‹ใคใ‹ใ‚Šใพใ—ใŸ: %s"
-#: ../ex_cmds.c:4510
#, c-format
msgid "Pattern not found: %s"
msgstr "ใƒ‘ใ‚ฟใƒผใƒณใฏ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“ใงใ—ใŸ: %s"
-#: ../ex_cmds.c:4587
msgid ""
"\n"
"# Last Substitute String:\n"
@@ -1289,110 +1044,110 @@ msgstr ""
"# ๆœ€ๅพŒใซ็ฝฎๆ›ใ•ใ‚ŒใŸๆ–‡ๅญ—ๅˆ—:\n"
"$"
-#: ../ex_cmds.c:4679
msgid "E478: Don't panic!"
msgstr "E478: ๆ…Œใฆใชใ„ใงใใ ใ•ใ„"
-#: ../ex_cmds.c:4717
#, c-format
msgid "E661: Sorry, no '%s' help for %s"
msgstr "E661: ๆฎ‹ๅฟตใงใ™ใŒ '%s' ใฎใƒ˜ใƒซใƒ—ใŒ %s ใซใฏใ‚ใ‚Šใพใ›ใ‚“"
-#: ../ex_cmds.c:4719
#, c-format
msgid "E149: Sorry, no help for %s"
msgstr "E149: ๆฎ‹ๅฟตใงใ™ใŒ %s ใซใฏใƒ˜ใƒซใƒ—ใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../ex_cmds.c:4751
#, c-format
msgid "Sorry, help file \"%s\" not found"
msgstr "ๆฎ‹ๅฟตใงใ™ใŒใƒ˜ใƒซใƒ—ใƒ•ใ‚กใ‚คใƒซ \"%s\" ใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-#: ../ex_cmds.c:5323
#, c-format
-msgid "E150: Not a directory: %s"
-msgstr "E150: ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใงใฏใ‚ใ‚Šใพใ›ใ‚“: %s"
+msgid "E151: No match: %s"
+msgstr "E151: ใƒžใƒƒใƒใฏใ‚ใ‚Šใพใ›ใ‚“: %s"
-#: ../ex_cmds.c:5446
#, c-format
msgid "E152: Cannot open %s for writing"
msgstr "E152: ๆ›ธ่พผใฟ็”จใซ %s ใ‚’้–‹ใ‘ใพใ›ใ‚“"
-#: ../ex_cmds.c:5471
#, c-format
msgid "E153: Unable to open %s for reading"
msgstr "E153: ่ชญ่พผ็”จใซ %s ใ‚’้–‹ใ‘ใพใ›ใ‚“"
# Added at 29-Apr-2004.
-#: ../ex_cmds.c:5500
#, c-format
msgid "E670: Mix of help file encodings within a language: %s"
msgstr "E670: 1ใคใฎ่จ€่ชžใฎใƒ˜ใƒซใƒ—ใƒ•ใ‚กใ‚คใƒซใซ่ค‡ๆ•ฐใฎใ‚จใƒณใ‚ณใƒผใƒ‰ใŒๆททๅœจใ—ใฆใ„ใพใ™: %s"
-#: ../ex_cmds.c:5565
#, c-format
msgid "E154: Duplicate tag \"%s\" in file %s/%s"
msgstr "E154: ใ‚ฟใ‚ฐ \"%s\" ใŒใƒ•ใ‚กใ‚คใƒซ %s/%s ใซ้‡่ค‡ใ—ใฆใ„ใพใ™"
-#: ../ex_cmds.c:5687
+#, c-format
+msgid "E150: Not a directory: %s"
+msgstr "E150: ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใงใฏใ‚ใ‚Šใพใ›ใ‚“: %s"
+
#, c-format
msgid "E160: Unknown sign command: %s"
msgstr "E160: ๆœช็Ÿฅใฎsignใ‚ณใƒžใƒณใƒ‰ใงใ™: %s"
-#: ../ex_cmds.c:5704
msgid "E156: Missing sign name"
msgstr "E156: signๅใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../ex_cmds.c:5746
msgid "E612: Too many signs defined"
msgstr "E612: signใฎๅฎš็พฉใŒๅคšๆ•ฐ่ฆ‹ใคใ‹ใ‚Šใพใ—ใŸ"
-#: ../ex_cmds.c:5813
#, c-format
msgid "E239: Invalid sign text: %s"
msgstr "E239: ็„กๅŠนใชsignใฎใƒ†ใ‚ญใ‚นใƒˆใงใ™: %s"
-#: ../ex_cmds.c:5844 ../ex_cmds.c:6035
#, c-format
msgid "E155: Unknown sign: %s"
msgstr "E155: ๆœช็Ÿฅใฎsignใงใ™: %s"
-#: ../ex_cmds.c:5877
msgid "E159: Missing sign number"
msgstr "E159: signใฎ็•ชๅทใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../ex_cmds.c:5971
#, c-format
msgid "E158: Invalid buffer name: %s"
msgstr "E158: ็„กๅŠนใชใƒใƒƒใƒ•ใ‚กๅใงใ™: %s"
-#: ../ex_cmds.c:6008
+msgid "E934: Cannot jump to a buffer that does not have a name"
+msgstr "E934: ๅๅ‰ใฎ็„กใ„ใƒใƒƒใƒ•ใ‚กใธใฏใ‚ธใƒฃใƒณใƒ—ใงใใพใ›ใ‚“"
+
#, c-format
-msgid "E157: Invalid sign ID: %<PRId64>"
-msgstr "E157: ็„กๅŠนใชsign่ญ˜ๅˆฅๅญใงใ™: %<PRId64>"
+msgid "E157: Invalid sign ID: %ld"
+msgstr "E157: ็„กๅŠนใชsign่ญ˜ๅˆฅๅญใงใ™: %ld"
#, c-format
msgid "E885: Not possible to change sign %s"
msgstr "E885: ๅค‰ๆ›ดใงใใชใ„ sign ใงใ™: %s"
-#: ../ex_cmds.c:6066
+# Added at 27-Jan-2004.
+msgid " (NOT FOUND)"
+msgstr " (่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“)"
+
msgid " (not supported)"
msgstr " (้žใ‚ตใƒใƒผใƒˆ)"
-#: ../ex_cmds.c:6169
msgid "[Deleted]"
msgstr "[ๅ‰Š้™คๆธˆ]"
-#: ../ex_cmds2.c:139
+msgid "No old files"
+msgstr "ๅคใ„ใƒ•ใ‚กใ‚คใƒซใฏใ‚ใ‚Šใพใ›ใ‚“"
+
msgid "Entering Debug mode. Type \"cont\" to continue."
msgstr "ใƒ‡ใƒใƒƒใ‚ฐใƒขใƒผใƒ‰ใซๅ…ฅใ‚Šใพใ™. ็ถšใ‘ใ‚‹ใซใฏ \"cont\" ใจๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„."
-#: ../ex_cmds2.c:143 ../ex_docmd.c:759
#, c-format
-msgid "line %<PRId64>: %s"
-msgstr "่กŒ %<PRId64>: %s"
+msgid "Oldval = \"%s\""
+msgstr "ๅคใ„ๅ€ค = \"%s\""
+
+#, c-format
+msgid "Newval = \"%s\""
+msgstr "ๆ–ฐใ—ใ„ๅ€ค = \"%s\""
+
+#, c-format
+msgid "line %ld: %s"
+msgstr "่กŒ %ld: %s"
-#: ../ex_cmds2.c:145
#, c-format
msgid "cmd: %s"
msgstr "ใ‚ณใƒžใƒณใƒ‰: %s"
@@ -1404,232 +1159,199 @@ msgstr "ใƒ•ใƒฌใƒผใƒ ใŒ 0 ใงใ™"
msgid "frame at highest level: %d"
msgstr "ๆœ€้ซ˜ใƒฌใƒ™ใƒซใฎใƒ•ใƒฌใƒผใƒ : %d"
-#: ../ex_cmds2.c:322
#, c-format
-msgid "Breakpoint in \"%s%s\" line %<PRId64>"
-msgstr "ใƒ–ใƒฌใƒผใ‚ฏใƒใ‚คใƒณใƒˆ \"%s%s\" ่กŒ %<PRId64>"
+msgid "Breakpoint in \"%s%s\" line %ld"
+msgstr "ใƒ–ใƒฌใƒผใ‚ฏใƒใ‚คใƒณใƒˆ \"%s%s\" ่กŒ %ld"
-#: ../ex_cmds2.c:581
#, c-format
msgid "E161: Breakpoint not found: %s"
msgstr "E161: ใƒ–ใƒฌใƒผใ‚ฏใƒใ‚คใƒณใƒˆใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“: %s"
-#: ../ex_cmds2.c:611
msgid "No breakpoints defined"
msgstr "ใƒ–ใƒฌใƒผใ‚ฏใƒใ‚คใƒณใƒˆใŒๅฎš็พฉใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#: ../ex_cmds2.c:617
#, c-format
-msgid "%3d %s %s line %<PRId64>"
-msgstr "%3d %s %s ่กŒ %<PRId64>"
+msgid "%3d %s %s line %ld"
+msgstr "%3d %s %s ่กŒ %ld"
+
+#, c-format
+msgid "%3d expr %s"
+msgstr "%3d expr %s"
-#: ../ex_cmds2.c:942
msgid "E750: First use \":profile start {fname}\""
msgstr "E750: ๅˆใ‚ใซ \":profile start {fname}\" ใ‚’ๅฎŸ่กŒใ—ใฆใใ ใ•ใ„"
-#: ../ex_cmds2.c:1269
#, c-format
msgid "Save changes to \"%s\"?"
msgstr "ๅค‰ๆ›ดใ‚’ \"%s\" ใซไฟๅญ˜ใ—ใพใ™ใ‹?"
-#: ../ex_cmds2.c:1271 ../ex_docmd.c:8851
-msgid "Untitled"
-msgstr "็„ก้กŒ"
+#, c-format
+msgid "E947: Job still running in buffer \"%s\""
+msgstr "E947: ใ‚ธใƒงใƒ–ใฏใƒใƒƒใƒ•ใ‚ก \"%s\" ใงใพใ ๅฎŸ่กŒไธญใงใ™"
-#: ../ex_cmds2.c:1421
#, c-format
msgid "E162: No write since last change for buffer \"%s\""
msgstr "E162: ใƒใƒƒใƒ•ใ‚ก \"%s\" ใฎๅค‰ๆ›ดใฏไฟๅญ˜ใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#: ../ex_cmds2.c:1480
msgid "Warning: Entered other buffer unexpectedly (check autocommands)"
msgstr "่ญฆๅ‘Š: ไบˆๆœŸใ›ใšไป–ใƒใƒƒใƒ•ใ‚กใธ็งปๅ‹•ใ—ใพใ—ใŸ (autocommands ใ‚’่ชฟในใฆใใ ใ•ใ„)"
-#: ../ex_cmds2.c:1826
msgid "E163: There is only one file to edit"
msgstr "E163: ็ทจ้›†ใ™ใ‚‹ใƒ•ใ‚กใ‚คใƒซใฏ1ใคใ—ใ‹ใ‚ใ‚Šใพใ›ใ‚“"
-#: ../ex_cmds2.c:1828
msgid "E164: Cannot go before first file"
msgstr "E164: ๆœ€ๅˆใฎใƒ•ใ‚กใ‚คใƒซใ‚ˆใ‚Šๅ‰ใซใฏ่กŒใ‘ใพใ›ใ‚“"
-#: ../ex_cmds2.c:1830
msgid "E165: Cannot go beyond last file"
msgstr "E165: ๆœ€ๅพŒใฎใƒ•ใ‚กใ‚คใƒซใ‚’่ถŠใˆใฆๅพŒใซใฏ่กŒใ‘ใพใ›ใ‚“"
-#: ../ex_cmds2.c:2175
#, c-format
msgid "E666: compiler not supported: %s"
msgstr "E666: ใใฎใ‚ณใƒณใƒ‘ใ‚คใƒฉใซใฏๅฏพๅฟœใ—ใฆใ„ใพใ›ใ‚“: %s"
-#: ../ex_cmds2.c:2257
#, c-format
msgid "Searching for \"%s\" in \"%s\""
msgstr "\"%s\" ใ‚’ \"%s\" ใ‹ใ‚‰ๆคœ็ดขไธญ"
-#: ../ex_cmds2.c:2284
#, c-format
msgid "Searching for \"%s\""
msgstr "\"%s\" ใ‚’ๆคœ็ดขไธญ"
-#: ../ex_cmds2.c:2307
#, c-format
-msgid "not found in 'runtimepath': \"%s\""
-msgstr "'runtimepath' ใฎไธญใซใฏ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“: \"%s\""
+msgid "not found in '%s': \"%s\""
+msgstr "'%s' ใฎไธญใซใฏใ‚ใ‚Šใพใ›ใ‚“: \"%s\""
+
+#, c-format
+msgid "W20: Required python version 2.x not supported, ignoring file: %s"
+msgstr "W20: ่ฆๆฑ‚ใ•ใ‚ŒใŸpython 2.xใฏๅฏพๅฟœใ—ใฆใ„ใพใ›ใ‚“ใ€ใƒ•ใ‚กใ‚คใƒซใ‚’็„ก่ฆ–ใ—ใพใ™: %s"
+
+#, c-format
+msgid "W21: Required python version 3.x not supported, ignoring file: %s"
+msgstr "W21: ่ฆๆฑ‚ใ•ใ‚ŒใŸpython 3.xใฏๅฏพๅฟœใ—ใฆใ„ใพใ›ใ‚“ใ€ใƒ•ใ‚กใ‚คใƒซใ‚’็„ก่ฆ–ใ—ใพใ™: %s"
+
+msgid "Source Vim script"
+msgstr "Vimใ‚นใ‚ฏใƒชใƒ—ใƒˆใฎๅ–่พผใฟ"
-#: ../ex_cmds2.c:2472
#, c-format
msgid "Cannot source a directory: \"%s\""
msgstr "ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใฏๅ–่พผใ‚ใพใ›ใ‚“: \"%s\""
-#: ../ex_cmds2.c:2518
#, c-format
msgid "could not source \"%s\""
msgstr "\"%s\" ใ‚’ๅ–่พผใ‚ใพใ›ใ‚“"
-#: ../ex_cmds2.c:2520
#, c-format
-msgid "line %<PRId64>: could not source \"%s\""
-msgstr "่กŒ %<PRId64>: \"%s\" ใ‚’ๅ–่พผใ‚ใพใ›ใ‚“"
+msgid "line %ld: could not source \"%s\""
+msgstr "่กŒ %ld: \"%s\" ใ‚’ๅ–่พผใ‚ใพใ›ใ‚“"
-#: ../ex_cmds2.c:2535
#, c-format
msgid "sourcing \"%s\""
msgstr "\"%s\" ใ‚’ๅ–่พผไธญ"
-#: ../ex_cmds2.c:2537
#, c-format
-msgid "line %<PRId64>: sourcing \"%s\""
-msgstr "่กŒ %<PRId64>: %s ใ‚’ๅ–่พผไธญ"
+msgid "line %ld: sourcing \"%s\""
+msgstr "่กŒ %ld: %s ใ‚’ๅ–่พผไธญ"
-#: ../ex_cmds2.c:2693
#, c-format
msgid "finished sourcing %s"
msgstr "%s ใฎๅ–่พผใ‚’ๅฎŒไบ†"
-#: ../ex_cmds2.c:2765
+#, c-format
+msgid "continuing in %s"
+msgstr "%s ใฎๅฎŸ่กŒใ‚’็ถ™็ถšไธญใงใ™"
+
msgid "modeline"
msgstr "ใƒขใƒผใƒ‰่กŒ"
-#: ../ex_cmds2.c:2767
msgid "--cmd argument"
msgstr "--cmd ๅผ•ๆ•ฐ"
-#: ../ex_cmds2.c:2769
msgid "-c argument"
msgstr "-c ๅผ•ๆ•ฐ"
-#: ../ex_cmds2.c:2771
msgid "environment variable"
msgstr "็’ฐๅขƒๅค‰ๆ•ฐ"
-#: ../ex_cmds2.c:2773
msgid "error handler"
msgstr "ใ‚จใƒฉใƒผใƒใƒณใƒ‰ใƒฉ"
-#: ../ex_cmds2.c:3020
msgid "W15: Warning: Wrong line separator, ^M may be missing"
msgstr "W15: ่ญฆๅ‘Š: ่กŒๅŒบๅˆ‡ใŒไธๆญฃใงใ™. ^M ใŒใชใ„ใฎใงใ—ใ‚‡ใ†"
-#: ../ex_cmds2.c:3139
msgid "E167: :scriptencoding used outside of a sourced file"
msgstr "E167: :scriptencoding ใŒๅ–่พผใ‚นใ‚ฏใƒชใƒ—ใƒˆไปฅๅค–ใงไฝฟ็”จใ•ใ‚Œใพใ—ใŸ"
-#: ../ex_cmds2.c:3166
msgid "E168: :finish used outside of a sourced file"
msgstr "E168: :finish ใŒๅ–่พผใ‚นใ‚ฏใƒชใƒ—ใƒˆไปฅๅค–ใงไฝฟ็”จใ•ใ‚Œใพใ—ใŸ"
-#: ../ex_cmds2.c:3389
#, c-format
msgid "Current %slanguage: \"%s\""
msgstr "็พๅœจใฎ %s่จ€่ชž: \"%s\""
-#: ../ex_cmds2.c:3404
#, c-format
msgid "E197: Cannot set language to \"%s\""
msgstr "E197: ่จ€่ชžใ‚’ \"%s\" ใซ่จญๅฎšใงใใพใ›ใ‚“"
-#. don't redisplay the window
-#. don't wait for return
-#: ../ex_docmd.c:387
msgid "Entering Ex mode. Type \"visual\" to go to Normal mode."
msgstr ""
"Exใƒขใƒผใƒ‰ใซๅ…ฅใ‚Šใพใ™. ใƒŽใƒผใƒžใƒซใƒขใƒผใƒ‰ใซๆˆปใ‚‹ใซใฏ\"visual\"ใจๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„."
-#: ../ex_docmd.c:428
msgid "E501: At end-of-file"
msgstr "E501: ใƒ•ใ‚กใ‚คใƒซใฎ็ต‚ไบ†ไฝ็ฝฎ"
-#: ../ex_docmd.c:513
msgid "E169: Command too recursive"
msgstr "E169: ใ‚ณใƒžใƒณใƒ‰ใŒๅ†ๅธฐ็š„้ŽใŽใพใ™"
-#: ../ex_docmd.c:1006
#, c-format
msgid "E605: Exception not caught: %s"
msgstr "E605: ไพ‹ๅค–ใŒๆ•ๆ‰ใ•ใ‚Œใพใ›ใ‚“ใงใ—ใŸ: %s"
-#: ../ex_docmd.c:1085
msgid "End of sourced file"
msgstr "ๅ–่พผใƒ•ใ‚กใ‚คใƒซใฎๆœ€ๅพŒใงใ™"
-#: ../ex_docmd.c:1086
msgid "End of function"
msgstr "้–ขๆ•ฐใฎๆœ€ๅพŒใงใ™"
-#: ../ex_docmd.c:1628
msgid "E464: Ambiguous use of user-defined command"
msgstr "E464: ใƒฆใƒผใ‚ถใƒผๅฎš็พฉใ‚ณใƒžใƒณใƒ‰ใฎใ‚ใ„ใพใ„ใชไฝฟ็”จใงใ™"
-#: ../ex_docmd.c:1638
msgid "E492: Not an editor command"
msgstr "E492: ใ‚จใƒ‡ใ‚ฃใ‚ฟใฎใ‚ณใƒžใƒณใƒ‰ใงใฏใ‚ใ‚Šใพใ›ใ‚“"
-#: ../ex_docmd.c:1729
msgid "E493: Backwards range given"
msgstr "E493: ้€†ใ•ใพใฎ็ฏ„ๅ›ฒใŒๆŒ‡ๅฎšใ•ใ‚Œใพใ—ใŸ"
-#: ../ex_docmd.c:1733
msgid "Backwards range given, OK to swap"
-msgstr "้€†ใ•ใพใฎ็ฏ„ๅ›ฒใŒๆŒ‡ๅฎšใ•ใ‚Œใพใ—ใŸ, ๅ…ฅๆ›ฟใˆใพใ™ใ‹?"
+msgstr "้€†ใ•ใพใฎ็ฏ„ๅ›ฒใŒๆŒ‡ๅฎšใ•ใ‚Œใพใ—ใŸใ€ๅ…ฅๆ›ฟใˆใพใ™ใ‹?"
-#. append
-#. typed wrong
-#: ../ex_docmd.c:1787
msgid "E494: Use w or w>>"
msgstr "E494: w ใ‚‚ใ—ใใฏ w>> ใ‚’ไฝฟ็”จใ—ใฆใใ ใ•ใ„"
-#: ../ex_docmd.c:3454
-msgid "E319: The command is not available in this version"
-msgstr "E319: ใ“ใฎใƒใƒผใ‚ธใƒงใƒณใงใฏใ“ใฎใ‚ณใƒžใƒณใƒ‰ใฏๅˆฉ็”จใงใใพใ›ใ‚“, ใ”ใ‚ใ‚“ใชใ•ใ„"
+msgid "E943: Command table needs to be updated, run 'make cmdidxs'"
+msgstr ""
+"E943: ใ‚ณใƒžใƒณใƒ‰ใƒ†ใƒผใƒ–ใƒซใ‚’ๆ›ดๆ–ฐใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€'make cmdidxs' ใ‚’ๅฎŸ่กŒใ—ใฆใใ "
+"ใ•ใ„"
-#: ../ex_docmd.c:3752
-msgid "E172: Only one file name allowed"
-msgstr "E172: ใƒ•ใ‚กใ‚คใƒซๅใฏ 1 ใคใซใ—ใฆใใ ใ•ใ„"
+msgid "E319: Sorry, the command is not available in this version"
+msgstr "E319: ใ“ใฎใƒใƒผใ‚ธใƒงใƒณใงใฏใ“ใฎใ‚ณใƒžใƒณใƒ‰ใฏๅˆฉ็”จใงใใพใ›ใ‚“ใ€ใ”ใ‚ใ‚“ใชใ•ใ„"
-#: ../ex_docmd.c:4238
msgid "1 more file to edit. Quit anyway?"
-msgstr "็ทจ้›†ใ™ในใใƒ•ใ‚กใ‚คใƒซใŒ 1 ๅ€‹ใ‚ใ‚Šใพใ™ใŒ, ็ต‚ไบ†ใ—ใพใ™ใ‹?"
+msgstr "็ทจ้›†ใ™ในใใƒ•ใ‚กใ‚คใƒซใŒ 1 ๅ€‹ใ‚ใ‚Šใพใ™ใŒใ€็ต‚ไบ†ใ—ใพใ™ใ‹?"
-#: ../ex_docmd.c:4242
#, c-format
msgid "%d more files to edit. Quit anyway?"
-msgstr "็ทจ้›†ใ™ในใใƒ•ใ‚กใ‚คใƒซใŒใ‚ใจ %d ๅ€‹ใ‚ใ‚Šใพใ™ใŒ, ็ต‚ไบ†ใ—ใพใ™ใ‹?"
+msgstr "็ทจ้›†ใ™ในใใƒ•ใ‚กใ‚คใƒซใŒใ‚ใจ %d ๅ€‹ใ‚ใ‚Šใพใ™ใŒใ€็ต‚ไบ†ใ—ใพใ™ใ‹?"
-#: ../ex_docmd.c:4248
msgid "E173: 1 more file to edit"
msgstr "E173: ็ทจ้›†ใ™ในใใƒ•ใ‚กใ‚คใƒซใŒ 1 ๅ€‹ใ‚ใ‚Šใพใ™"
-#: ../ex_docmd.c:4250
#, c-format
-msgid "E173: %<PRId64> more files to edit"
-msgstr "E173: ็ทจ้›†ใ™ในใใƒ•ใ‚กใ‚คใƒซใŒใ‚ใจ %<PRId64> ๅ€‹ใ‚ใ‚Šใพใ™"
+msgid "E173: %ld more files to edit"
+msgstr "E173: ็ทจ้›†ใ™ในใใƒ•ใ‚กใ‚คใƒซใŒใ‚ใจ %ld ๅ€‹ใ‚ใ‚Šใพใ™"
-#: ../ex_docmd.c:4320
msgid "E174: Command already exists: add ! to replace it"
msgstr "E174: ใ‚ณใƒžใƒณใƒ‰ใŒๆ—ขใซใ‚ใ‚Šใพใ™: ๅ†ๅฎš็พฉใ™ใ‚‹ใซใฏ ! ใ‚’่ฟฝๅŠ ใ—ใฆใใ ใ•ใ„"
-#: ../ex_docmd.c:4432
msgid ""
"\n"
" Name Args Address Complete Definition"
@@ -1637,51 +1359,40 @@ msgstr ""
"\n"
" ๅๅ‰ ๅผ•ๆ•ฐ ใ‚ขใƒ‰ใƒฌใ‚น ่ฃœๅฎŒ ๅฎš็พฉ"
-#: ../ex_docmd.c:4516
msgid "No user-defined commands found"
msgstr "ใƒฆใƒผใ‚ถใƒผๅฎš็พฉใ‚ณใƒžใƒณใƒ‰ใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“ใงใ—ใŸ"
-#: ../ex_docmd.c:4538
msgid "E175: No attribute specified"
msgstr "E175: ๅฑžๆ€งใฏๅฎš็พฉใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#: ../ex_docmd.c:4583
msgid "E176: Invalid number of arguments"
msgstr "E176: ๅผ•ๆ•ฐใฎๆ•ฐใŒ็„กๅŠนใงใ™"
-#: ../ex_docmd.c:4594
msgid "E177: Count cannot be specified twice"
msgstr "E177: ใ‚ซใ‚ฆใƒณใƒˆใ‚’2้‡ๆŒ‡ๅฎšใ™ใ‚‹ใ“ใจใฏใงใใพใ›ใ‚“"
-#: ../ex_docmd.c:4603
msgid "E178: Invalid default value for count"
msgstr "E178: ใ‚ซใ‚ฆใƒณใƒˆใฎ็œ็•ฅๅ€คใŒ็„กๅŠนใงใ™"
-#: ../ex_docmd.c:4625
msgid "E179: argument required for -complete"
msgstr "E179: -complete ใซใฏๅผ•ๆ•ฐใŒๅฟ…่ฆใงใ™"
msgid "E179: argument required for -addr"
msgstr "E179: -addr ใซใฏๅผ•ๆ•ฐใŒๅฟ…่ฆใงใ™"
-#: ../ex_docmd.c:4635
#, c-format
msgid "E181: Invalid attribute: %s"
msgstr "E181: ็„กๅŠนใชๅฑžๆ€งใงใ™: %s"
-#: ../ex_docmd.c:4678
msgid "E182: Invalid command name"
msgstr "E182: ็„กๅŠนใชใ‚ณใƒžใƒณใƒ‰ๅใงใ™"
-#: ../ex_docmd.c:4691
msgid "E183: User defined commands must start with an uppercase letter"
msgstr "E183: ใƒฆใƒผใ‚ถใƒผๅฎš็พฉใ‚ณใƒžใƒณใƒ‰ใฏ่‹ฑๅคงๆ–‡ๅญ—ใงๅง‹ใพใ‚‰ใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“"
-#: ../ex_docmd.c:4696
msgid "E841: Reserved name, cannot be used for user defined command"
-msgstr "E841: ไบˆ็ด„ๅใชใฎใง, ใƒฆใƒผใ‚ถใƒผๅฎš็พฉใ‚ณใƒžใƒณใƒ‰ใซๅˆฉ็”จใงใใพใ›ใ‚“"
+msgstr "E841: ไบˆ็ด„ๅใชใฎใงใ€ใƒฆใƒผใ‚ถใƒผๅฎš็พฉใ‚ณใƒžใƒณใƒ‰ใซๅˆฉ็”จใงใใพใ›ใ‚“"
-#: ../ex_docmd.c:4751
#, c-format
msgid "E184: No such user-defined command: %s"
msgstr "E184: ใใฎใƒฆใƒผใ‚ถใƒผๅฎš็พฉใ‚ณใƒžใƒณใƒ‰ใฏใ‚ใ‚Šใพใ›ใ‚“: %s"
@@ -1690,293 +1401,260 @@ msgstr "E184: ใใฎใƒฆใƒผใ‚ถใƒผๅฎš็พฉใ‚ณใƒžใƒณใƒ‰ใฏใ‚ใ‚Šใพใ›ใ‚“: %s"
msgid "E180: Invalid address type value: %s"
msgstr "E180: ็„กๅŠนใชใ‚ขใƒ‰ใƒฌใ‚นใ‚ฟใ‚คใƒ—ๅ€คใงใ™: %s"
-#: ../ex_docmd.c:5219
#, c-format
msgid "E180: Invalid complete value: %s"
msgstr "E180: ็„กๅŠนใช่ฃœๅฎŒๆŒ‡ๅฎšใงใ™: %s"
-#: ../ex_docmd.c:5225
msgid "E468: Completion argument only allowed for custom completion"
msgstr "E468: ่ฃœๅฎŒๅผ•ๆ•ฐใฏใ‚ซใ‚นใ‚ฟใƒ ่ฃœๅฎŒใงใ—ใ‹ไฝฟ็”จใงใใพใ›ใ‚“"
-#: ../ex_docmd.c:5231
msgid "E467: Custom completion requires a function argument"
msgstr "E467: ใ‚ซใ‚นใ‚ฟใƒ ่ฃœๅฎŒใซใฏๅผ•ๆ•ฐใจใ—ใฆ้–ขๆ•ฐใŒๅฟ…่ฆใงใ™"
-#: ../ex_docmd.c:5257
+msgid "unknown"
+msgstr "ไธๆ˜Ž"
+
#, c-format
msgid "E185: Cannot find color scheme '%s'"
msgstr "E185: ใ‚ซใƒฉใƒผใ‚นใ‚ญใƒผใƒ  '%s' ใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-#: ../ex_docmd.c:5263
msgid "Greetings, Vim user!"
msgstr "Vim ไฝฟใ„ใ•ใ‚“ใ€ใ‚„ใ‚!"
-#: ../ex_docmd.c:5431
msgid "E784: Cannot close last tab page"
msgstr "E784: ๆœ€ๅพŒใฎใ‚ฟใƒ–ใƒšใƒผใ‚ธใ‚’้–‰ใ˜ใ‚‹ใ“ใจใฏใงใใพใ›ใ‚“"
-#: ../ex_docmd.c:5462
msgid "Already only one tab page"
msgstr "ๆ—ขใซใ‚ฟใƒ–ใƒšใƒผใ‚ธใฏ1ใคใ—ใ‹ใ‚ใ‚Šใพใ›ใ‚“"
-#: ../ex_docmd.c:6004
+msgid "Edit File in new tab page"
+msgstr "ๆ–ฐใ—ใ„ใ‚ฟใƒ–ใƒšใƒผใ‚ธใงใƒ•ใ‚กใ‚คใƒซใ‚’็ทจ้›†ใ—ใพใ™"
+
+msgid "Edit File in new window"
+msgstr "ๆ–ฐใ—ใ„ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใงใƒ•ใ‚กใ‚คใƒซใ‚’็ทจ้›†ใ—ใพใ™"
+
#, c-format
msgid "Tab page %d"
msgstr "ใ‚ฟใƒ–ใƒšใƒผใ‚ธ %d"
-#: ../ex_docmd.c:6295
msgid "No swap file"
msgstr "ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../ex_docmd.c:6478
+msgid "Append File"
+msgstr "่ฟฝๅŠ ใƒ•ใ‚กใ‚คใƒซ"
+
msgid "E747: Cannot change directory, buffer is modified (add ! to override)"
msgstr ""
-"E747: ใƒใƒƒใƒ•ใ‚กใŒไฟฎๆญฃใ•ใ‚Œใฆใ„ใ‚‹ใฎใง, ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใ‚’ๅค‰ๆ›ดใงใใพใ›ใ‚“ (! ใ‚’่ฟฝๅŠ ใง"
+"E747: ใƒใƒƒใƒ•ใ‚กใŒไฟฎๆญฃใ•ใ‚Œใฆใ„ใ‚‹ใฎใงใ€ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใ‚’ๅค‰ๆ›ดใงใใพใ›ใ‚“ (! ใ‚’่ฟฝๅŠ ใง"
"ไธŠๆ›ธ)"
-#: ../ex_docmd.c:6485
msgid "E186: No previous directory"
msgstr "E186: ๅ‰ใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใฏใ‚ใ‚Šใพใ›ใ‚“"
-#: ../ex_docmd.c:6530
msgid "E187: Unknown"
msgstr "E187: ๆœช็Ÿฅ"
-#: ../ex_docmd.c:6610
msgid "E465: :winsize requires two number arguments"
msgstr "E465: :winsize ใซใฏ2ใคใฎๆ•ฐๅ€คใฎๅผ•ๆ•ฐใŒๅฟ…่ฆใงใ™"
-#: ../ex_docmd.c:6655
+#, c-format
+msgid "Window position: X %d, Y %d"
+msgstr "ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆไฝ็ฝฎ: X %d, Y %d"
+
msgid "E188: Obtaining window position not implemented for this platform"
msgstr ""
"E188: ใ“ใฎใƒ—ใƒฉใƒƒใƒˆใƒ›ใƒผใƒ ใซใฏใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆไฝ็ฝฎใฎๅ–ๅพ—ๆฉŸ่ƒฝใฏๅฎŸ่ฃ…ใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#: ../ex_docmd.c:6662
msgid "E466: :winpos requires two number arguments"
msgstr "E466: :winpos ใซใฏ2ใคใฎๆ•ฐๅ€คใฎๅผ•ๆ•ฐใŒๅฟ…่ฆใงใ™"
-#: ../ex_docmd.c:7241
+msgid "E930: Cannot use :redir inside execute()"
+msgstr "E930: execute() ใฎไธญใงใฏ :redir ใฏไฝฟใˆใพใ›ใ‚“"
+
+msgid "Save Redirection"
+msgstr "ใƒชใƒ€ใ‚คใƒฌใ‚ฏใƒˆใ‚’ไฟๅญ˜ใ—ใพใ™"
+
+msgid "Save View"
+msgstr "ใƒ“ใƒฅใƒผใ‚’ไฟๅญ˜ใ—ใพใ™"
+
+msgid "Save Session"
+msgstr "ใ‚ปใƒƒใ‚ทใƒงใƒณๆƒ…ๅ ฑใ‚’ไฟๅญ˜ใ—ใพใ™"
+
+msgid "Save Setup"
+msgstr "่จญๅฎšใ‚’ไฟๅญ˜ใ—ใพใ™"
+
#, c-format
msgid "E739: Cannot create directory: %s"
msgstr "E739: ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใ‚’ไฝœๆˆใงใใพใ›ใ‚“: %s"
-#: ../ex_docmd.c:7268
#, c-format
msgid "E189: \"%s\" exists (add ! to override)"
msgstr "E189: \"%s\" ใŒๅญ˜ๅœจใ—ใพใ™ (ไธŠๆ›ธใ™ใ‚‹ใซใฏ ! ใ‚’่ฟฝๅŠ ใ—ใฆใใ ใ•ใ„)"
-#: ../ex_docmd.c:7273
#, c-format
msgid "E190: Cannot open \"%s\" for writing"
msgstr "E190: \"%s\" ใ‚’ๆ›ธ่พผใฟ็”จใจใ—ใฆ้–‹ใ‘ใพใ›ใ‚“"
-#. set mark
-#: ../ex_docmd.c:7294
msgid "E191: Argument must be a letter or forward/backward quote"
msgstr "E191: ๅผ•ๆ•ฐใฏ1ๆ–‡ๅญ—ใฎ่‹ฑๅญ—ใ‹ๅผ•็”จ็ฌฆ (' ใ‹ `) ใงใชใ‘ใ‚Œใฐใ„ใ‘ใพใ›ใ‚“"
-#: ../ex_docmd.c:7333
msgid "E192: Recursive use of :normal too deep"
msgstr "E192: :normal ใฎๅ†ๅธฐๅˆฉ็”จใŒๆทฑใใชใ‚Š้ŽใŽใพใ—ใŸ"
-#: ../ex_docmd.c:7807
+msgid "E809: #< is not available without the +eval feature"
+msgstr "E809: #< ใฏ +eval ๆฉŸ่ƒฝใŒ็„กใ„ใจๅˆฉ็”จใงใใพใ›ใ‚“"
+
msgid "E194: No alternate file name to substitute for '#'"
msgstr "E194: '#'ใ‚’็ฝฎใๆ›ใˆใ‚‹ๅ‰ฏใƒ•ใ‚กใ‚คใƒซใฎๅๅ‰ใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../ex_docmd.c:7841
msgid "E495: no autocommand file name to substitute for \"<afile>\""
msgstr "E495: \"<afile>\"ใ‚’็ฝฎใๆ›ใˆใ‚‹autocommandใฎใƒ•ใ‚กใ‚คใƒซๅใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../ex_docmd.c:7850
msgid "E496: no autocommand buffer number to substitute for \"<abuf>\""
msgstr "E496: \"<abuf>\"ใ‚’็ฝฎใๆ›ใˆใ‚‹autocommandใƒใƒƒใƒ•ใ‚ก็•ชๅทใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../ex_docmd.c:7861
msgid "E497: no autocommand match name to substitute for \"<amatch>\""
msgstr "E497: \"<amatch>\"ใ‚’็ฝฎใๆ›ใˆใ‚‹autocommandใฎ่ฉฒๅฝ“ๅใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../ex_docmd.c:7870
msgid "E498: no :source file name to substitute for \"<sfile>\""
msgstr "E498: \"<sfile>\"ใ‚’็ฝฎใๆ›ใˆใ‚‹ :source ๅฏพ่ฑกใƒ•ใ‚กใ‚คใƒซๅใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../ex_docmd.c:7876
msgid "E842: no line number to use for \"<slnum>\""
msgstr "E842: \"<slnum>\"ใ‚’็ฝฎใๆ›ใˆใ‚‹่กŒ็•ชๅทใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../ex_docmd.c:7903
-#, fuzzy, c-format
+#, no-c-format
msgid "E499: Empty file name for '%' or '#', only works with \":p:h\""
msgstr ""
"E499: '%' ใ‚„ '#' ใŒ็„กๅใƒ•ใ‚กใ‚คใƒซใชใฎใง \":p:h\" ใ‚’ไผดใ‚ใชใ„ไฝฟใ„ๆ–นใฏใงใใพใ›ใ‚“"
-#: ../ex_docmd.c:7905
msgid "E500: Evaluates to an empty string"
msgstr "E500: ็ฉบๆ–‡ๅญ—ๅˆ—ใจใ—ใฆ่ฉ•ไพกใ•ใ‚Œใพใ—ใŸ"
-#: ../ex_docmd.c:8838
msgid "E195: Cannot open viminfo file for reading"
msgstr "E195: viminfoใƒ•ใ‚กใ‚คใƒซใ‚’่ชญ่พผ็”จใจใ—ใฆ้–‹ใ‘ใพใ›ใ‚“"
-#: ../ex_eval.c:464
+msgid "Untitled"
+msgstr "็„ก้กŒ"
+
+msgid "E196: No digraphs in this version"
+msgstr "E196: ใ“ใฎใƒใƒผใ‚ธใƒงใƒณใซๅˆๅญ—ใฏใ‚ใ‚Šใพใ›ใ‚“"
+
msgid "E608: Cannot :throw exceptions with 'Vim' prefix"
msgstr "E608: 'Vim' ใงๅง‹ใพใ‚‹ไพ‹ๅค–ใฏ :throw ใงใใพใ›ใ‚“"
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:496
#, c-format
msgid "Exception thrown: %s"
msgstr "ไพ‹ๅค–ใŒ็™บ็”Ÿใ—ใพใ—ใŸ: %s"
-#: ../ex_eval.c:545
#, c-format
msgid "Exception finished: %s"
msgstr "ไพ‹ๅค–ใŒๅŽๆŸใ—ใพใ—ใŸ: %s"
-#: ../ex_eval.c:546
#, c-format
msgid "Exception discarded: %s"
msgstr "ไพ‹ๅค–ใŒ็ ดๆฃ„ใ•ใ‚Œใพใ—ใŸ: %s"
-#: ../ex_eval.c:588 ../ex_eval.c:634
#, c-format
-msgid "%s, line %<PRId64>"
-msgstr "%s, ่กŒ %<PRId64>"
+msgid "%s, line %ld"
+msgstr "%s, ่กŒ %ld"
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:608
#, c-format
msgid "Exception caught: %s"
msgstr "ไพ‹ๅค–ใŒๆ•ๆ‰ใ•ใ‚Œใพใ—ใŸ: %s"
-#: ../ex_eval.c:676
#, c-format
msgid "%s made pending"
msgstr "%s ใซใ‚ˆใ‚Šๆœชๆฑบๅฎš็Šถๆ…‹ใŒ็”Ÿใ˜ใพใ—ใŸ"
-#: ../ex_eval.c:679
#, c-format
msgid "%s resumed"
msgstr "%s ใŒๅ†้–‹ใ—ใพใ—ใŸ"
-#: ../ex_eval.c:683
#, c-format
msgid "%s discarded"
msgstr "%s ใŒ็ ดๆฃ„ใ•ใ‚Œใพใ—ใŸ"
-#: ../ex_eval.c:708
msgid "Exception"
msgstr "ไพ‹ๅค–"
-#: ../ex_eval.c:713
msgid "Error and interrupt"
msgstr "ใ‚จใƒฉใƒผใจๅ‰ฒ่พผใฟ"
-#: ../ex_eval.c:715
msgid "Error"
msgstr "ใ‚จใƒฉใƒผ"
-#. if (pending & CSTP_INTERRUPT)
-#: ../ex_eval.c:717
msgid "Interrupt"
msgstr "ๅ‰ฒ่พผใฟ"
-#: ../ex_eval.c:795
msgid "E579: :if nesting too deep"
msgstr "E579: :if ใฎๅ…ฅใ‚ŒๅญใŒๆทฑ้ŽใŽใพใ™"
-#: ../ex_eval.c:830
msgid "E580: :endif without :if"
msgstr "E580: :if ใฎใชใ„ :endif ใŒใ‚ใ‚Šใพใ™"
-#: ../ex_eval.c:873
msgid "E581: :else without :if"
msgstr "E581: :if ใฎใชใ„ :else ใŒใ‚ใ‚Šใพใ™"
-#: ../ex_eval.c:876
msgid "E582: :elseif without :if"
msgstr "E582: :if ใฎใชใ„ :elseif ใŒใ‚ใ‚Šใพใ™"
-#: ../ex_eval.c:880
msgid "E583: multiple :else"
msgstr "E583: ่ค‡ๆ•ฐใฎ :else ใŒใ‚ใ‚Šใพใ™"
-#: ../ex_eval.c:883
msgid "E584: :elseif after :else"
msgstr "E584: :else ใฎๅพŒใซ :elseif ใŒใ‚ใ‚Šใพใ™"
-#: ../ex_eval.c:941
msgid "E585: :while/:for nesting too deep"
msgstr "E585: :while ใ‚„ :for ใฎๅ…ฅใ‚ŒๅญใŒๆทฑ้ŽใŽใพใ™"
-#: ../ex_eval.c:1028
msgid "E586: :continue without :while or :for"
msgstr "E586: :while ใ‚„ :for ใฎใชใ„ :continue ใŒใ‚ใ‚Šใพใ™"
-#: ../ex_eval.c:1061
msgid "E587: :break without :while or :for"
msgstr "E587: :while ใ‚„ :for ใฎใชใ„ :break ใŒใ‚ใ‚Šใพใ™"
-#: ../ex_eval.c:1102
msgid "E732: Using :endfor with :while"
msgstr "E732: :endfor ใ‚’ :while ใจ็ต„ใฟๅˆใ‚ใ›ใฆใ„ใพใ™"
-#: ../ex_eval.c:1104
msgid "E733: Using :endwhile with :for"
msgstr "E733: :endwhile ใ‚’ :for ใจ็ต„ใฟๅˆใ‚ใ›ใฆใ„ใพใ™"
-#: ../ex_eval.c:1247
msgid "E601: :try nesting too deep"
msgstr "E601: :try ใฎๅ…ฅใ‚ŒๅญใŒๆทฑ้ŽใŽใพใ™"
-#: ../ex_eval.c:1317
msgid "E603: :catch without :try"
msgstr "E603: :try ใฎใชใ„ :catch ใŒใ‚ใ‚Šใพใ™"
-#. Give up for a ":catch" after ":finally" and ignore it.
-#. * Just parse.
-#: ../ex_eval.c:1332
msgid "E604: :catch after :finally"
msgstr "E604: :finally ใฎๅพŒใซ :catch ใŒใ‚ใ‚Šใพใ™"
-#: ../ex_eval.c:1451
msgid "E606: :finally without :try"
msgstr "E606: :try ใฎใชใ„ :finally ใŒใ‚ใ‚Šใพใ™"
-#. Give up for a multiple ":finally" and ignore it.
-#: ../ex_eval.c:1467
msgid "E607: multiple :finally"
msgstr "E607: ่ค‡ๆ•ฐใฎ :finally ใŒใ‚ใ‚Šใพใ™"
-#: ../ex_eval.c:1571
msgid "E602: :endtry without :try"
msgstr "E602: :try ใฎใชใ„ :endtry ใงใ™"
-#: ../ex_eval.c:2026
msgid "E193: :endfunction not inside a function"
msgstr "E193: ้–ขๆ•ฐใฎๅค–ใซ :endfunction ใŒใ‚ใ‚Šใพใ—ใŸ"
-#: ../ex_getln.c:1643
msgid "E788: Not allowed to edit another buffer now"
msgstr "E788: ็พๅœจใฏไป–ใฎใƒใƒƒใƒ•ใ‚กใ‚’็ทจ้›†ใ™ใ‚‹ใ“ใจใฏ่จฑใ•ใ‚Œใพใ›ใ‚“"
-#: ../ex_getln.c:1656
msgid "E811: Not allowed to change buffer information now"
msgstr "E811: ็พๅœจใฏใƒใƒƒใƒ•ใ‚กๆƒ…ๅ ฑใ‚’ๅค‰ๆ›ดใ™ใ‚‹ใ“ใจใฏ่จฑใ•ใ‚Œใพใ›ใ‚“"
-#: ../ex_getln.c:3178
msgid "tagname"
msgstr "ใ‚ฟใ‚ฐๅ"
-#: ../ex_getln.c:3181
msgid " kind file\n"
msgstr " ใƒ•ใ‚กใ‚คใƒซ็จฎ้กž\n"
-#: ../ex_getln.c:4799
msgid "'history' option is zero"
msgstr "ใ‚ชใƒ—ใ‚ทใƒงใƒณ 'history' ใŒใ‚ผใƒญใงใ™"
-#: ../ex_getln.c:5046
#, c-format
msgid ""
"\n"
@@ -1985,303 +1663,220 @@ msgstr ""
"\n"
"# %s ้ …็›ฎใฎๅฑฅๆญด (ๆ–ฐใ—ใ„ใ‚‚ใฎใ‹ใ‚‰ๅคใ„ใ‚‚ใฎใธ):\n"
-#: ../ex_getln.c:5047
msgid "Command Line"
msgstr "ใ‚ณใƒžใƒณใƒ‰ใƒฉใ‚คใƒณ"
-#: ../ex_getln.c:5048
msgid "Search String"
msgstr "ๆคœ็ดขๆ–‡ๅญ—ๅˆ—"
-#: ../ex_getln.c:5049
msgid "Expression"
msgstr "ๅผ"
-#: ../ex_getln.c:5050
msgid "Input Line"
msgstr "ๅ…ฅๅŠ›่กŒ"
-#: ../ex_getln.c:5117
+msgid "Debug Line"
+msgstr "ใƒ‡ใƒใƒƒใ‚ฐ่กŒ"
+
msgid "E198: cmd_pchar beyond the command length"
msgstr "E198: cmd_pchar ใŒใ‚ณใƒžใƒณใƒ‰้•ทใ‚’่ถ…ใˆใพใ—ใŸ"
-#: ../ex_getln.c:5279
msgid "E199: Active window or buffer deleted"
msgstr "E199: ใ‚ขใ‚ฏใƒ†ใ‚ฃใƒ–ใชใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‹ใƒใƒƒใƒ•ใ‚กใŒๅ‰Š้™คใ•ใ‚Œใพใ—ใŸ"
-#: ../file_search.c:203
-msgid "E854: path too long for completion"
-msgstr "E854: ใƒ‘ใ‚นใŒ้•ท้ŽใŽใฆ่ฃœๅฎŒใงใใพใ›ใ‚“"
-
-#: ../file_search.c:446
-#, c-format
-msgid ""
-"E343: Invalid path: '**[number]' must be at the end of the path or be "
-"followed by '%s'."
-msgstr ""
-"E343: ็„กๅŠนใชใƒ‘ใ‚นใงใ™: '**[ๆ•ฐๅ€ค]' ใฏpathใฎๆœ€ๅพŒใ‹ '%s' ใŒ็ถšใ„ใฆใชใ„ใจใ„ใ‘ใพใ›"
-"ใ‚“."
-
-#: ../file_search.c:1505
-#, c-format
-msgid "E344: Can't find directory \"%s\" in cdpath"
-msgstr "E344: cdpathใซใฏ \"%s\" ใจใ„ใ†ใƒ•ใ‚กใ‚คใƒซใŒใ‚ใ‚Šใพใ›ใ‚“"
-
-#: ../file_search.c:1508
-#, c-format
-msgid "E345: Can't find file \"%s\" in path"
-msgstr "E345: pathใซใฏ \"%s\" ใจใ„ใ†ใƒ•ใ‚กใ‚คใƒซใŒใ‚ใ‚Šใพใ›ใ‚“"
-
-#: ../file_search.c:1512
-#, c-format
-msgid "E346: No more directory \"%s\" found in cdpath"
-msgstr "E346: cdpathใซใฏใ“ใ‚ŒไปฅไธŠ \"%s\" ใจใ„ใ†ใƒ•ใ‚กใ‚คใƒซใŒใ‚ใ‚Šใพใ›ใ‚“"
-
-#: ../file_search.c:1515
-#, c-format
-msgid "E347: No more file \"%s\" found in path"
-msgstr "E347: ใƒ‘ใ‚นใซใฏใ“ใ‚ŒไปฅไธŠ \"%s\" ใจใ„ใ†ใƒ•ใ‚กใ‚คใƒซใŒใ‚ใ‚Šใพใ›ใ‚“"
-
-#: ../fileio.c:137
msgid "E812: Autocommands changed buffer or buffer name"
msgstr "E812: autocommandใŒใƒใƒƒใƒ•ใ‚กใ‹ใƒใƒƒใƒ•ใ‚กๅใ‚’ๅค‰ๆ›ดใ—ใพใ—ใŸ"
-#: ../fileio.c:368
msgid "Illegal file name"
msgstr "ไธๆญฃใชใƒ•ใ‚กใ‚คใƒซๅ"
-#: ../fileio.c:395 ../fileio.c:476 ../fileio.c:2543 ../fileio.c:2578
msgid "is a directory"
msgstr "ใฏใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใงใ™"
-#: ../fileio.c:397
msgid "is not a file"
msgstr "ใฏใƒ•ใ‚กใ‚คใƒซใงใฏใ‚ใ‚Šใพใ›ใ‚“"
-#: ../fileio.c:508 ../fileio.c:3522
+msgid "is a device (disabled with 'opendevice' option)"
+msgstr "ใฏใƒ‡ใƒใ‚คใ‚นใงใ™ ('opendevice' ใ‚ชใƒ—ใ‚ทใƒงใƒณใงๅ›ž้ฟใงใใพใ™)"
+
msgid "[New File]"
msgstr "[ๆ–ฐใƒ•ใ‚กใ‚คใƒซ]"
-#: ../fileio.c:511
msgid "[New DIRECTORY]"
msgstr "[ๆ–ฐ่ฆใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒช]"
-#: ../fileio.c:529 ../fileio.c:532
msgid "[File too big]"
msgstr "[ใƒ•ใ‚กใ‚คใƒซ้Žๅคง]"
-#: ../fileio.c:534
msgid "[Permission Denied]"
msgstr "[ๆจฉ้™ใŒใ‚ใ‚Šใพใ›ใ‚“]"
-#: ../fileio.c:653
msgid "E200: *ReadPre autocommands made the file unreadable"
msgstr "E200: *ReadPre autocommand ใŒใƒ•ใ‚กใ‚คใƒซใ‚’่ชญ่พผไธๅฏใซใ—ใพใ—ใŸ"
-#: ../fileio.c:655
msgid "E201: *ReadPre autocommands must not change current buffer"
msgstr "E201: *ReadPre autocommand ใฏ็พๅœจใฎใƒใƒƒใƒ•ใ‚กใ‚’ๅค‰ใˆใ‚‰ใ‚Œใพใ›ใ‚“"
-#: ../fileio.c:672
-msgid "Nvim: Reading from stdin...\n"
+msgid "Vim: Reading from stdin...\n"
msgstr "Vim: ๆจ™ๆบ–ๅ…ฅๅŠ›ใ‹ใ‚‰่ชญ่พผไธญ...\n"
-#. Re-opening the original file failed!
-#: ../fileio.c:909
+msgid "Reading from stdin..."
+msgstr "ๆจ™ๆบ–ๅ…ฅๅŠ›ใ‹ใ‚‰่ชญ่พผใฟไธญ..."
+
msgid "E202: Conversion made file unreadable!"
msgstr "E202: ๅค‰ๆ›ใŒใƒ•ใ‚กใ‚คใƒซใ‚’่ชญ่พผไธๅฏใซใ—ใพใ—ใŸ"
-#. fifo or socket
-#: ../fileio.c:1782
msgid "[fifo/socket]"
msgstr "[FIFO/ใ‚ฝใ‚ฑใƒƒใƒˆ]"
-#. fifo
-#: ../fileio.c:1788
msgid "[fifo]"
msgstr "[FIFO]"
-#. or socket
-#: ../fileio.c:1794
msgid "[socket]"
msgstr "[ใ‚ฝใ‚ฑใƒƒใƒˆ]"
-#. or character special
-#: ../fileio.c:1801
msgid "[character special]"
msgstr "[ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒปใƒ‡ใƒใ‚คใ‚น]"
-#: ../fileio.c:1815
msgid "[CR missing]"
msgstr "[CR็„ก]"
-#: ../fileio.c:1819
msgid "[long lines split]"
msgstr "[้•ท่กŒๅˆ†ๅ‰ฒ]"
-#: ../fileio.c:1823 ../fileio.c:3512
msgid "[NOT converted]"
msgstr "[ๆœชๅค‰ๆ›]"
-#: ../fileio.c:1826 ../fileio.c:3515
msgid "[converted]"
msgstr "[ๅค‰ๆ›ๆธˆ]"
-#: ../fileio.c:1831
#, c-format
-msgid "[CONVERSION ERROR in line %<PRId64>]"
-msgstr "[%<PRId64> ่กŒ็›ฎใงๅค‰ๆ›ใ‚จใƒฉใƒผ]"
+msgid "[CONVERSION ERROR in line %ld]"
+msgstr "[%ld ่กŒ็›ฎใงๅค‰ๆ›ใ‚จใƒฉใƒผ]"
-#: ../fileio.c:1835
#, c-format
-msgid "[ILLEGAL BYTE in line %<PRId64>]"
-msgstr "[%<PRId64> ่กŒ็›ฎใฎไธๆญฃใชใƒใ‚คใƒˆ]"
+msgid "[ILLEGAL BYTE in line %ld]"
+msgstr "[%ld ่กŒ็›ฎใฎไธๆญฃใชใƒใ‚คใƒˆ]"
-#: ../fileio.c:1838
msgid "[READ ERRORS]"
msgstr "[่ชญ่พผใ‚จใƒฉใƒผ]"
-#: ../fileio.c:2104
msgid "Can't find temp file for conversion"
msgstr "ๅค‰ๆ›ใซๅฟ…่ฆใชไธ€ๆ™‚ใƒ•ใ‚กใ‚คใƒซใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-#: ../fileio.c:2110
msgid "Conversion with 'charconvert' failed"
msgstr "'charconvert' ใซใ‚ˆใ‚‹ๅค‰ๆ›ใŒๅคฑๆ•—ใ—ใพใ—ใŸ"
-#: ../fileio.c:2113
msgid "can't read output of 'charconvert'"
msgstr "'charconvert' ใฎๅ‡บๅŠ›ใ‚’่ชญ่พผใ‚ใพใ›ใ‚“ใงใ—ใŸ"
-#: ../fileio.c:2437
msgid "E676: No matching autocommands for acwrite buffer"
msgstr "E676: acwriteใƒใƒƒใƒ•ใ‚กใฎ่ฉฒๅฝ“ใ™ใ‚‹autocommandใฏๅญ˜ๅœจใ—ใพใ›ใ‚“"
-#: ../fileio.c:2466
msgid "E203: Autocommands deleted or unloaded buffer to be written"
msgstr "E203: ไฟๅญ˜ใ™ใ‚‹ใƒใƒƒใƒ•ใ‚กใ‚’autocommandใŒๅ‰Š้™คใ‹่งฃๆ”พใ—ใพใ—ใŸ"
-#: ../fileio.c:2486
msgid "E204: Autocommand changed number of lines in unexpected way"
msgstr "E204: autocommandใŒไบˆๆœŸใ›ใฌๆ–นๆณ•ใง่กŒๆ•ฐใ‚’ๅค‰ๆ›ดใ—ใพใ—ใŸ"
-#: ../fileio.c:2548 ../fileio.c:2565
+# Added at 19-Jan-2004.
+msgid "NetBeans disallows writes of unmodified buffers"
+msgstr "NetBeansใฏๆœชๅค‰ๆ›ดใฎใƒใƒƒใƒ•ใ‚กใ‚’ไธŠๆ›ธใ™ใ‚‹ใ“ใจใฏ่จฑๅฏใ—ใฆใ„ใพใ›ใ‚“"
+
+msgid "Partial writes disallowed for NetBeans buffers"
+msgstr "NetBeansใƒใƒƒใƒ•ใ‚กใฎไธ€้ƒจใ‚’ๆ›ธใๅ‡บใ™ใ“ใจใฏใงใใพใ›ใ‚“"
+
msgid "is not a file or writable device"
msgstr "ใฏใƒ•ใ‚กใ‚คใƒซใงใ‚‚ๆ›ธ่พผใฟๅฏ่ƒฝใƒ‡ใƒใ‚คใ‚นใงใ‚‚ใ‚ใ‚Šใพใ›ใ‚“"
-#: ../fileio.c:2601
+msgid "writing to device disabled with 'opendevice' option"
+msgstr "'opendevice' ใ‚ชใƒ—ใ‚ทใƒงใƒณใซใ‚ˆใ‚Šใƒ‡ใƒใ‚คใ‚นใธใฎๆ›ธใ่พผใฟใฏใงใใพใ›ใ‚“"
+
msgid "is read-only (add ! to override)"
msgstr "ใฏ่ชญ่พผๅฐ‚็”จใงใ™ (ๅผทๅˆถๆ›ธ่พผใซใฏ ! ใ‚’่ฟฝๅŠ )"
-#: ../fileio.c:2886
msgid "E506: Can't write to backup file (add ! to override)"
msgstr "E506: ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใ‚’ไฟๅญ˜ใงใใพใ›ใ‚“ (! ใ‚’่ฟฝๅŠ ใงๅผทๅˆถไฟๅญ˜)"
-#: ../fileio.c:2898
msgid "E507: Close error for backup file (add ! to override)"
msgstr ""
"E507: ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใ‚’้–‰ใ˜ใ‚‹้š›ใซใ‚จใƒฉใƒผใŒ็™บ็”Ÿใ—ใพใ—ใŸ (! ใ‚’่ฟฝๅŠ ใงๅผทๅˆถ)"
-#: ../fileio.c:2901
msgid "E508: Can't read file for backup (add ! to override)"
msgstr "E508: ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—็”จใƒ•ใ‚กใ‚คใƒซใ‚’่ชญ่พผใ‚ใพใ›ใ‚“ (! ใ‚’่ฟฝๅŠ ใงๅผทๅˆถ่ชญ่พผ)"
-#: ../fileio.c:2923
msgid "E509: Cannot create backup file (add ! to override)"
msgstr "E509: ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใ‚’ไฝœใ‚Œใพใ›ใ‚“ (! ใ‚’่ฟฝๅŠ ใงๅผทๅˆถไฝœๆˆ)"
-#: ../fileio.c:3008
msgid "E510: Can't make backup file (add ! to override)"
msgstr "E510: ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใ‚’ไฝœใ‚Œใพใ›ใ‚“ (! ใ‚’่ฟฝๅŠ ใงๅผทๅˆถไฝœๆˆ)"
-#. Can't write without a tempfile!
-#: ../fileio.c:3121
msgid "E214: Can't find temp file for writing"
msgstr "E214: ไฟๅญ˜็”จไธ€ๆ™‚ใƒ•ใ‚กใ‚คใƒซใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-#: ../fileio.c:3134
msgid "E213: Cannot convert (add ! to write without conversion)"
msgstr "E213: ๅค‰ๆ›ใงใใพใ›ใ‚“ (! ใ‚’่ฟฝๅŠ ใงๅค‰ๆ›ใ›ใšใซไฟๅญ˜)"
-#: ../fileio.c:3169
msgid "E166: Can't open linked file for writing"
msgstr "E166: ใƒชใƒณใ‚ฏใ•ใ‚ŒใŸใƒ•ใ‚กใ‚คใƒซใซๆ›ธ่พผใ‚ใพใ›ใ‚“"
-#: ../fileio.c:3173
msgid "E212: Can't open file for writing"
msgstr "E212: ๆ›ธ่พผใฟ็”จใซใƒ•ใ‚กใ‚คใƒซใ‚’้–‹ใ‘ใพใ›ใ‚“"
-#: ../fileio.c:3363
-msgid "E667: Fsync failed"
-msgstr "E667: fsync ใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+msgid "E949: File changed while writing"
+msgstr "E949: ๆ›ธ่พผใฟไธญใซใƒ•ใ‚กใ‚คใƒซใŒๅค‰ๆ›ดใ•ใ‚Œใพใ—ใŸ"
-#: ../fileio.c:3398
msgid "E512: Close failed"
msgstr "E512: ้–‰ใ˜ใ‚‹ใ“ใจใซๅคฑๆ•—"
-#: ../fileio.c:3436
msgid "E513: write error, conversion failed (make 'fenc' empty to override)"
-msgstr "E513: ๆ›ธ่พผใฟใ‚จใƒฉใƒผ, ๅค‰ๆ›ๅคฑๆ•— (ไธŠๆ›ธใ™ใ‚‹ใซใฏ 'fenc' ใ‚’็ฉบใซใ—ใฆใใ ใ•ใ„)"
+msgstr "E513: ๆ›ธ่พผใฟใ‚จใƒฉใƒผใ€ๅค‰ๆ›ๅคฑๆ•— (ไธŠๆ›ธใ™ใ‚‹ใซใฏ 'fenc' ใ‚’็ฉบใซใ—ใฆใใ ใ•ใ„)"
-#: ../fileio.c:3441
#, c-format
msgid ""
-"E513: write error, conversion failed in line %<PRId64> (make 'fenc' empty to "
+"E513: write error, conversion failed in line %ld (make 'fenc' empty to "
"override)"
msgstr ""
-"E513: ๆ›ธ่พผใฟใ‚จใƒฉใƒผ, ๅค‰ๆ›ๅคฑๆ•—, ่กŒๆ•ฐ %<PRId64> (ไธŠๆ›ธใ™ใ‚‹ใซใฏ 'fenc' ใ‚’็ฉบใซใ—ใฆ"
-"ใใ ใ•ใ„)"
+"E513: ๆ›ธ่พผใฟใ‚จใƒฉใƒผใ€ๅค‰ๆ›ๅคฑๆ•—ใ€่กŒๆ•ฐ %ld (ไธŠๆ›ธใ™ใ‚‹ใซใฏ 'fenc' ใ‚’็ฉบใซใ—ใฆใใ ใ•"
+"ใ„)"
-#: ../fileio.c:3448
msgid "E514: write error (file system full?)"
-msgstr "E514: ๆ›ธ่พผใฟใ‚จใƒฉใƒผ, (ใƒ•ใ‚กใ‚คใƒซใ‚ทใ‚นใƒ†ใƒ ใŒๆบ€ๆฏ?)"
+msgstr "E514: ๆ›ธ่พผใฟใ‚จใƒฉใƒผ (ใƒ•ใ‚กใ‚คใƒซใ‚ทใ‚นใƒ†ใƒ ใŒๆบ€ๆฏ?)"
-#: ../fileio.c:3506
msgid " CONVERSION ERROR"
msgstr " ๅค‰ๆ›ใ‚จใƒฉใƒผ"
-#: ../fileio.c:3509
#, c-format
-msgid " in line %<PRId64>;"
-msgstr " ่กŒ %<PRId64>;"
+msgid " in line %ld;"
+msgstr " ่กŒ %ld;"
-#: ../fileio.c:3519
msgid "[Device]"
msgstr "[ใƒ‡ใƒใ‚คใ‚น]"
-#: ../fileio.c:3522
msgid "[New]"
msgstr "[ๆ–ฐ]"
-#: ../fileio.c:3535
msgid " [a]"
msgstr " [a]"
-#: ../fileio.c:3535
msgid " appended"
msgstr " ่ฟฝๅŠ "
-#: ../fileio.c:3537
msgid " [w]"
msgstr " [w]"
-#: ../fileio.c:3537
msgid " written"
msgstr " ๆ›ธ่พผใฟ"
-#: ../fileio.c:3579
msgid "E205: Patchmode: can't save original file"
msgstr "E205: patchmode: ๅŽŸๆœฌใƒ•ใ‚กใ‚คใƒซใ‚’ไฟๅญ˜ใงใใพใ›ใ‚“"
-#: ../fileio.c:3602
msgid "E206: patchmode: can't touch empty original file"
msgstr "E206: patchmode: ็ฉบใฎๅŽŸๆœฌใƒ•ใ‚กใ‚คใƒซใ‚’touchใงใใพใ›ใ‚“"
-#: ../fileio.c:3616
msgid "E207: Can't delete backup file"
msgstr "E207: ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใ‚’ๆถˆใ›ใพใ›ใ‚“"
-#: ../fileio.c:3672
msgid ""
"\n"
"WARNING: Original file may be lost or damaged\n"
@@ -2289,134 +1884,102 @@ msgstr ""
"\n"
"่ญฆๅ‘Š: ๅŽŸๆœฌใƒ•ใ‚กใ‚คใƒซใŒๅคฑใ‚ใ‚ŒใŸใ‹ๅค‰ๆ›ดใ•ใ‚Œใพใ—ใŸ\n"
-#: ../fileio.c:3675
msgid "don't quit the editor until the file is successfully written!"
msgstr "ใƒ•ใ‚กใ‚คใƒซใฎไฟๅญ˜ใซๆˆๅŠŸใ™ใ‚‹ใพใงใ‚จใƒ‡ใ‚ฃใ‚ฟใ‚’็ต‚ไบ†ใ—ใชใ„ใงใใ ใ•ใ„!"
-#: ../fileio.c:3795
msgid "[dos]"
msgstr "[dos]"
-#: ../fileio.c:3795
msgid "[dos format]"
msgstr "[dosใƒ•ใ‚ฉใƒผใƒžใƒƒใƒˆ]"
-#: ../fileio.c:3801
msgid "[mac]"
msgstr "[mac]"
-#: ../fileio.c:3801
msgid "[mac format]"
msgstr "[macใƒ•ใ‚ฉใƒผใƒžใƒƒใƒˆ]"
-#: ../fileio.c:3807
msgid "[unix]"
msgstr "[unix]"
-#: ../fileio.c:3807
msgid "[unix format]"
msgstr "[unixใƒ•ใ‚ฉใƒผใƒžใƒƒใƒˆ]"
-#: ../fileio.c:3831
msgid "1 line, "
msgstr "1 ่กŒ, "
-#: ../fileio.c:3833
#, c-format
-msgid "%<PRId64> lines, "
-msgstr "%<PRId64> ่กŒ, "
+msgid "%ld lines, "
+msgstr "%ld ่กŒ, "
-#: ../fileio.c:3836
msgid "1 character"
msgstr "1 ๆ–‡ๅญ—"
-#: ../fileio.c:3838
#, c-format
-msgid "%<PRId64> characters"
-msgstr "%<PRId64> ๆ–‡ๅญ—"
+msgid "%lld characters"
+msgstr "%lld ๆ–‡ๅญ—"
-#: ../fileio.c:3849
msgid "[noeol]"
msgstr "[noeol]"
-#: ../fileio.c:3849
msgid "[Incomplete last line]"
msgstr "[ๆœ€็ต‚่กŒใŒไธๅฎŒๅ…จ]"
-#. don't overwrite messages here
-#. must give this prompt
-#. don't use emsg() here, don't want to flush the buffers
-#: ../fileio.c:3865
msgid "WARNING: The file has been changed since reading it!!!"
msgstr "่ญฆๅ‘Š: ่ชญ่พผใ‚“ใ ๅพŒใซใƒ•ใ‚กใ‚คใƒซใซๅค‰ๆ›ดใŒใ‚ใ‚Šใพใ—ใŸ!!!"
-#: ../fileio.c:3867
msgid "Do you really want to write to it"
msgstr "ๆœฌๅฝ“ใซไธŠๆ›ธใใ—ใพใ™ใ‹"
-#: ../fileio.c:4648
#, c-format
msgid "E208: Error writing to \"%s\""
msgstr "E208: \"%s\" ใ‚’ๆ›ธ่พผใฟไธญใฎใ‚จใƒฉใƒผใงใ™"
-#: ../fileio.c:4655
#, c-format
msgid "E209: Error closing \"%s\""
msgstr "E209: \"%s\" ใ‚’้–‰ใ˜ใ‚‹ๆ™‚ใซใ‚จใƒฉใƒผใงใ™"
-#: ../fileio.c:4657
#, c-format
msgid "E210: Error reading \"%s\""
msgstr "E210: \"%s\" ใ‚’่ชญ่พผไธญใฎใ‚จใƒฉใƒผใงใ™"
-#: ../fileio.c:4883
msgid "E246: FileChangedShell autocommand deleted buffer"
msgstr "E246: autocommand ใฎ FileChangedShell ใŒใƒใƒƒใƒ•ใ‚กใ‚’ๅ‰Š้™คใ—ใพใ—ใŸ"
-#: ../fileio.c:4894
#, c-format
msgid "E211: File \"%s\" no longer available"
msgstr "E211: ใƒ•ใ‚กใ‚คใƒซ \"%s\" ใฏๆ—ขใซๅญ˜ๅœจใ—ใพใ›ใ‚“"
-#: ../fileio.c:4906
#, c-format
msgid ""
"W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as "
"well"
msgstr "W12: ่ญฆๅ‘Š: ใƒ•ใ‚กใ‚คใƒซ \"%s\" ใŒๅค‰ๆ›ดใ•ใ‚ŒVimใฎใƒใƒƒใƒ•ใ‚กใ‚‚ๅค‰ๆ›ดใ•ใ‚Œใพใ—ใŸ"
-#: ../fileio.c:4907
msgid "See \":help W12\" for more info."
msgstr "่ฉณ็ดฐใฏ \":help W12\" ใ‚’ๅ‚็…งใ—ใฆใใ ใ•ใ„"
-#: ../fileio.c:4910
#, c-format
msgid "W11: Warning: File \"%s\" has changed since editing started"
msgstr "W11: ่ญฆๅ‘Š: ใƒ•ใ‚กใ‚คใƒซ \"%s\" ใฏ็ทจ้›†้–‹ๅง‹ๅพŒใซๅค‰ๆ›ดใ•ใ‚Œใพใ—ใŸ"
-#: ../fileio.c:4911
msgid "See \":help W11\" for more info."
msgstr "่ฉณ็ดฐใฏ \":help W11\" ใ‚’ๅ‚็…งใ—ใฆใใ ใ•ใ„"
-#: ../fileio.c:4914
#, c-format
msgid "W16: Warning: Mode of file \"%s\" has changed since editing started"
msgstr "W16: ่ญฆๅ‘Š: ใƒ•ใ‚กใ‚คใƒซ \"%s\" ใฎใƒขใƒผใƒ‰ใŒ็ทจ้›†้–‹ๅง‹ๅพŒใซๅค‰ๆ›ดใ•ใ‚Œใพใ—ใŸ"
-#: ../fileio.c:4915
msgid "See \":help W16\" for more info."
msgstr "่ฉณ็ดฐใฏ \":help W16\" ใ‚’ๅ‚็…งใ—ใฆใใ ใ•ใ„"
-#: ../fileio.c:4927
#, c-format
msgid "W13: Warning: File \"%s\" has been created after editing started"
msgstr "W13: ่ญฆๅ‘Š: ใƒ•ใ‚กใ‚คใƒซ \"%s\" ใฏ็ทจ้›†้–‹ๅง‹ๅพŒใซไฝœๆˆใ•ใ‚Œใพใ—ใŸ"
-#: ../fileio.c:4947
msgid "Warning"
msgstr "่ญฆๅ‘Š"
-#: ../fileio.c:4948
msgid ""
"&OK\n"
"&Load File"
@@ -2424,810 +1987,593 @@ msgstr ""
"&OK\n"
"ใƒ•ใ‚กใ‚คใƒซ่ชญ่พผ(&L)"
-#: ../fileio.c:5065
#, c-format
msgid "E462: Could not prepare for reloading \"%s\""
msgstr "E462: \"%s\" ใ‚’ใƒชใƒญใƒผใƒ‰ใ™ใ‚‹ๆบ–ๅ‚™ใŒใงใใพใ›ใ‚“ใงใ—ใŸ"
-#: ../fileio.c:5078
#, c-format
msgid "E321: Could not reload \"%s\""
msgstr "E321: \"%s\" ใฏใƒชใƒญใƒผใƒ‰ใงใใพใ›ใ‚“ใงใ—ใŸ"
-#: ../fileio.c:5601
msgid "--Deleted--"
msgstr "--ๅ‰Š้™คๆธˆ--"
-#: ../fileio.c:5732
#, c-format
msgid "auto-removing autocommand: %s <buffer=%d>"
msgstr "autocommand: %s <ใƒใƒƒใƒ•ใ‚ก=%d> ใŒ่‡ชๅ‹•็š„ใซๅ‰Š้™คใ•ใ‚Œใพใ™"
-#. the group doesn't exist
-#: ../fileio.c:5772
#, c-format
msgid "E367: No such group: \"%s\""
msgstr "E367: ใใฎใ‚ฐใƒซใƒผใƒ—ใฏใ‚ใ‚Šใพใ›ใ‚“: \"%s\""
-#: ../fileio.c:5897
+msgid "E936: Cannot delete the current group"
+msgstr "E936: ็พๅœจใฎใ‚ฐใƒซใƒผใƒ—ใฏๅ‰Š้™คใงใใพใ›ใ‚“"
+
+msgid "W19: Deleting augroup that is still in use"
+msgstr "W19: ไฝฟ็”จไธญใฎ augroup ใ‚’ๆถˆใใ†ใจใ—ใฆใ„ใพใ™"
+
#, c-format
msgid "E215: Illegal character after *: %s"
msgstr "E215: * ใฎๅพŒใซไธๆญฃใชๆ–‡ๅญ—ใŒใ‚ใ‚Šใพใ—ใŸ: %s"
-#: ../fileio.c:5905
#, c-format
msgid "E216: No such event: %s"
msgstr "E216: ใใฎใ‚ˆใ†ใชใ‚คใƒ™ใƒณใƒˆใฏใ‚ใ‚Šใพใ›ใ‚“: %s"
-#: ../fileio.c:5907
#, c-format
msgid "E216: No such group or event: %s"
msgstr "E216: ใใฎใ‚ˆใ†ใชใ‚ฐใƒซใƒผใƒ—ใ‚‚ใ—ใใฏใ‚คใƒ™ใƒณใƒˆใฏใ‚ใ‚Šใพใ›ใ‚“: %s"
-#. Highlight title
-#: ../fileio.c:6090
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
-#: ../fileio.c:6293
#, c-format
msgid "E680: <buffer=%d>: invalid buffer number "
msgstr "E680: <ใƒใƒƒใƒ•ใ‚ก=%d>: ็„กๅŠนใชใƒใƒƒใƒ•ใ‚ก็•ชๅทใงใ™ "
-#: ../fileio.c:6370
msgid "E217: Can't execute autocommands for ALL events"
msgstr "E217: ๅ…จใฆใฎใ‚คใƒ™ใƒณใƒˆใซๅฏพใ—ใฆใฎautocommandใฏๅฎŸ่กŒใงใใพใ›ใ‚“"
-#: ../fileio.c:6393
msgid "No matching autocommands"
msgstr "่ฉฒๅฝ“ใ™ใ‚‹autocommandใฏๅญ˜ๅœจใ—ใพใ›ใ‚“"
-#: ../fileio.c:6831
msgid "E218: autocommand nesting too deep"
msgstr "E218: autocommandใฎๅ…ฅใ‚ŒๅญใŒๆทฑ้ŽใŽใพใ™"
-#: ../fileio.c:7143
#, c-format
-msgid "%s Auto commands for \"%s\""
-msgstr "%s Auto commands for \"%s\""
+msgid "%s Autocommands for \"%s\""
+msgstr "%s Autocommands for \"%s\""
-#: ../fileio.c:7149
#, c-format
msgid "Executing %s"
msgstr "%s ใ‚’ๅฎŸ่กŒใ—ใฆใ„ใพใ™"
-#: ../fileio.c:7211
#, c-format
msgid "autocommand %s"
msgstr "autocommand %s"
-#: ../fileio.c:7795
msgid "E219: Missing {."
msgstr "E219: { ใŒใ‚ใ‚Šใพใ›ใ‚“."
-#: ../fileio.c:7797
msgid "E220: Missing }."
msgstr "E220: } ใŒใ‚ใ‚Šใพใ›ใ‚“."
-#: ../fold.c:93
msgid "E490: No fold found"
msgstr "E490: ๆŠ˜็•ณใฟใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../fold.c:544
msgid "E350: Cannot create fold with current 'foldmethod'"
msgstr "E350: ็พๅœจใฎ 'foldmethod' ใงใฏๆŠ˜็•ณใฟใ‚’ไฝœๆˆใงใใพใ›ใ‚“"
-#: ../fold.c:546
msgid "E351: Cannot delete fold with current 'foldmethod'"
msgstr "E351: ็พๅœจใฎ 'foldmethod' ใงใฏๆŠ˜็•ณใฟใ‚’ๅ‰Š้™คใงใใพใ›ใ‚“"
-#: ../fold.c:1784
#, c-format
-msgid "+--%3ld lines folded "
-msgstr "+--%3ld ่กŒใŒๆŠ˜็•ณใพใ‚Œใพใ—ใŸ "
+msgid "+--%3ld line folded "
+msgid_plural "+--%3ld lines folded "
+msgstr[0] "+--%3ld ่กŒใŒๆŠ˜็•ณใพใ‚Œใพใ—ใŸ"
-#. buffer has already been read
-#: ../getchar.c:273
msgid "E222: Add to read buffer"
msgstr "E222: ่ชญ่พผใƒใƒƒใƒ•ใ‚กใธ่ฟฝๅŠ "
-#: ../getchar.c:2040
msgid "E223: recursive mapping"
msgstr "E223: ๅ†ๅธฐ็š„ใƒžใƒƒใƒ”ใƒณใ‚ฐ"
-#: ../getchar.c:2849
#, c-format
msgid "E224: global abbreviation already exists for %s"
msgstr "E224: %s ใจใ„ใ†ใ‚ฐใƒญใƒผใƒใƒซ็Ÿญ็ธฎๅ…ฅๅŠ›ใฏๆ—ขใซๅญ˜ๅœจใ—ใพใ™"
-#: ../getchar.c:2852
#, c-format
msgid "E225: global mapping already exists for %s"
msgstr "E225: %s ใจใ„ใ†ใ‚ฐใƒญใƒผใƒใƒซใƒžใƒƒใƒ”ใƒณใ‚ฐใฏๆ—ขใซๅญ˜ๅœจใ—ใพใ™"
-#: ../getchar.c:2952
#, c-format
msgid "E226: abbreviation already exists for %s"
msgstr "E226: %s ใจใ„ใ†็Ÿญ็ธฎๅ…ฅๅŠ›ใฏๆ—ขใซๅญ˜ๅœจใ—ใพใ™"
-#: ../getchar.c:2955
#, c-format
msgid "E227: mapping already exists for %s"
msgstr "E227: %s ใจใ„ใ†ใƒžใƒƒใƒ”ใƒณใ‚ฐใฏๆ—ขใซๅญ˜ๅœจใ—ใพใ™"
-#: ../getchar.c:3008
msgid "No abbreviation found"
msgstr "็Ÿญ็ธฎๅ…ฅๅŠ›ใฏ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“ใงใ—ใŸ"
-#: ../getchar.c:3010
msgid "No mapping found"
msgstr "ใƒžใƒƒใƒ”ใƒณใ‚ฐใฏ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“ใงใ—ใŸ"
-#: ../getchar.c:3974
msgid "E228: makemap: Illegal mode"
msgstr "E228: makemap: ไธๆญฃใชใƒขใƒผใƒ‰"
-#. key value of 'cedit' option
-#. type of cmdline window or 0
-#. result of cmdline window or 0
-#: ../globals.h:924
-msgid "--No lines in buffer--"
-msgstr "--ใƒใƒƒใƒ•ใ‚กใซ่กŒใŒใ‚ใ‚Šใพใ›ใ‚“--"
-
-#.
-#. * The error messages that can be shared are included here.
-#. * Excluded are errors that are only used once and debugging messages.
-#.
-#: ../globals.h:996
-msgid "E470: Command aborted"
-msgstr "E470: ใ‚ณใƒžใƒณใƒ‰ใŒไธญๆ–ญใ•ใ‚Œใพใ—ใŸ"
-
-#: ../globals.h:997
-msgid "E471: Argument required"
-msgstr "E471: ๅผ•ๆ•ฐใŒๅฟ…่ฆใงใ™"
+msgid "E851: Failed to create a new process for the GUI"
+msgstr "E851: GUI็”จใฎใƒ—ใƒญใ‚ปใ‚นใฎ่ตทๅ‹•ใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-#: ../globals.h:998
-msgid "E10: \\ should be followed by /, ? or &"
-msgstr "E10: \\ ใฎๅพŒใฏ / ใ‹ ? ใ‹ & ใงใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“"
+msgid "E852: The child process failed to start the GUI"
+msgstr "E852: ๅญใƒ—ใƒญใ‚ปใ‚นใŒGUIใฎ่ตทๅ‹•ใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-#: ../globals.h:1000
-msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
-msgstr "E11: ใ‚ณใƒžใƒณใƒ‰ใƒฉใ‚คใƒณใงใฏ็„กๅŠนใงใ™; <CR>ใงๅฎŸ่กŒ, CTRL-Cใงใ‚„ใ‚ใ‚‹"
+msgid "E229: Cannot start the GUI"
+msgstr "E229: GUIใ‚’้–‹ๅง‹ใงใใพใ›ใ‚“"
-#: ../globals.h:1002
-msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
-msgstr ""
-"E12: ็พๅœจใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใ‚„ใ‚ฟใ‚ฐๆคœ็ดขใงใฏexrc/vimrcใฎใ‚ณใƒžใƒณใƒ‰ใฏ่จฑๅฏใ•ใ‚Œใพใ›ใ‚“"
+#, c-format
+msgid "E230: Cannot read from \"%s\""
+msgstr "E230: \"%s\"ใ‹ใ‚‰่ชญ่พผใ‚€ใ“ใจใŒใงใใพใ›ใ‚“"
-#: ../globals.h:1003
-msgid "E171: Missing :endif"
-msgstr "E171: :endif ใŒใ‚ใ‚Šใพใ›ใ‚“"
+msgid "E665: Cannot start GUI, no valid font found"
+msgstr "E665: ๆœ‰ๅŠนใชใƒ•ใ‚ฉใƒณใƒˆใŒ่ฆ‹ใคใ‹ใ‚‰ใชใ„ใฎใงใ€GUIใ‚’้–‹ๅง‹ใงใใพใ›ใ‚“"
-#: ../globals.h:1004
-msgid "E600: Missing :endtry"
-msgstr "E600: :endtry ใŒใ‚ใ‚Šใพใ›ใ‚“"
+msgid "E231: 'guifontwide' invalid"
+msgstr "E231: 'guifontwide' ใŒ็„กๅŠนใงใ™"
-#: ../globals.h:1005
-msgid "E170: Missing :endwhile"
-msgstr "E170: :endwhile ใŒใ‚ใ‚Šใพใ›ใ‚“"
+msgid "E599: Value of 'imactivatekey' is invalid"
+msgstr "E599: 'imactivatekey' ใซ่จญๅฎšใ•ใ‚ŒใŸๅ€คใŒ็„กๅŠนใงใ™"
-#: ../globals.h:1006
-msgid "E170: Missing :endfor"
-msgstr "E170: :endfor ใŒใ‚ใ‚Šใพใ›ใ‚“"
+#, c-format
+msgid "E254: Cannot allocate color %s"
+msgstr "E254: %s ใฎ่‰ฒใ‚’ๅ‰ฒใ‚Šๅฝ“ใฆใ‚‰ใ‚Œใพใ›ใ‚“"
-#: ../globals.h:1007
-msgid "E588: :endwhile without :while"
-msgstr "E588: :while ใฎใชใ„ :endwhile ใŒใ‚ใ‚Šใพใ™"
+msgid "No match at cursor, finding next"
+msgstr "ใ‚ซใƒผใ‚ฝใƒซใฎไฝ็ฝฎใซใƒžใƒƒใƒใฏใ‚ใ‚Šใพใ›ใ‚“ใ€ๆฌกใ‚’ๆคœ็ดขใ—ใฆใ„ใพใ™"
-#: ../globals.h:1008
-msgid "E588: :endfor without :for"
-msgstr "E588: :endfor ใฎใชใ„ :for ใŒใ‚ใ‚Šใพใ™"
+msgid "<cannot open> "
+msgstr "<้–‹ใ‘ใพใ›ใ‚“> "
-#: ../globals.h:1009
-msgid "E13: File exists (add ! to override)"
-msgstr "E13: ใƒ•ใ‚กใ‚คใƒซใŒๅญ˜ๅœจใ—ใพใ™ (! ใ‚’่ฟฝๅŠ ใงไธŠๆ›ธ)"
+#, c-format
+msgid "E616: vim_SelFile: can't get font %s"
+msgstr "E616: vim_SelFile: ใƒ•ใ‚ฉใƒณใƒˆ %s ใ‚’ๅ–ๅพ—ใงใใพใ›ใ‚“"
-#: ../globals.h:1010
-msgid "E472: Command failed"
-msgstr "E472: ใ‚ณใƒžใƒณใƒ‰ใŒๅคฑๆ•—ใ—ใพใ—ใŸ"
+msgid "E614: vim_SelFile: can't return to current directory"
+msgstr "E614: vim_SelFile: ็พๅœจใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใซๆˆปใ‚Œใพใ›ใ‚“"
-#: ../globals.h:1011
-msgid "E473: Internal error"
-msgstr "E473: ๅ†…้ƒจใ‚จใƒฉใƒผใงใ™"
+msgid "Pathname:"
+msgstr "ใƒ‘ใ‚นๅ:"
-#: ../globals.h:1012
-msgid "Interrupted"
-msgstr "ๅ‰ฒ่พผใพใ‚Œใพใ—ใŸ"
+msgid "E615: vim_SelFile: can't get current directory"
+msgstr "E615: vim_SelFile: ็พๅœจใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใ‚’ๅ–ๅพ—ใงใใพใ›ใ‚“"
-#: ../globals.h:1013
-msgid "E14: Invalid address"
-msgstr "E14: ็„กๅŠนใชใ‚ขใƒ‰ใƒฌใ‚นใงใ™"
+msgid "OK"
+msgstr "OK"
-#: ../globals.h:1014
-msgid "E474: Invalid argument"
-msgstr "E474: ็„กๅŠนใชๅผ•ๆ•ฐใงใ™"
+msgid "Cancel"
+msgstr "ใ‚ญใƒฃใƒณใ‚ปใƒซ"
-#: ../globals.h:1015
-#, c-format
-msgid "E475: Invalid argument: %s"
-msgstr "E475: ็„กๅŠนใชๅผ•ๆ•ฐใงใ™: %s"
+msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
+msgstr "ใ‚นใ‚ฏใƒญใƒผใƒซใƒใƒผ: ็”ปๅƒใ‚’ๅ–ๅพ—ใงใใพใ›ใ‚“ใงใ—ใŸ."
-#: ../globals.h:1016
-#, c-format
-msgid "E15: Invalid expression: %s"
-msgstr "E15: ็„กๅŠนใชๅผใงใ™: %s"
+msgid "Vim dialog"
+msgstr "Vim ใƒ€ใ‚คใ‚ขใƒญใ‚ฐ"
-#: ../globals.h:1017
-msgid "E16: Invalid range"
-msgstr "E16: ็„กๅŠนใช็ฏ„ๅ›ฒใงใ™"
+msgid "E232: Cannot create BalloonEval with both message and callback"
+msgstr "E232: ใƒกใƒƒใ‚ปใƒผใ‚ธใจใ‚ณใƒผใƒซใƒใƒƒใ‚ฏใฎใ‚ใ‚‹ BalloonEval ใ‚’ไฝœๆˆใงใใพใ›ใ‚“"
-#: ../globals.h:1018
-msgid "E476: Invalid command"
-msgstr "E476: ็„กๅŠนใชใ‚ณใƒžใƒณใƒ‰ใงใ™"
+msgid "_Cancel"
+msgstr "ใ‚ญใƒฃใƒณใ‚ปใƒซ(_C)"
-#: ../globals.h:1019
-#, c-format
-msgid "E17: \"%s\" is a directory"
-msgstr "E17: \"%s\" ใฏใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใงใ™"
+msgid "_Save"
+msgstr "ไฟๅญ˜(_S)"
-#: ../globals.h:1020
-#, fuzzy
-msgid "E900: Invalid job id"
-msgstr "E49: ็„กๅŠนใชใ‚นใ‚ฏใƒญใƒผใƒซ้‡ใงใ™"
+msgid "_Open"
+msgstr "้–‹ใ(_O)"
-#: ../globals.h:1021
-msgid "E901: Job table is full"
-msgstr ""
+msgid "_OK"
+msgstr "_OK"
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
+msgid ""
+"&Yes\n"
+"&No\n"
+"&Cancel"
msgstr ""
+"ใฏใ„(&Y)\n"
+"ใ„ใ„ใˆ(&N)\n"
+"ใ‚ญใƒฃใƒณใ‚ปใƒซ(&C)"
-#: ../globals.h:1024
-#, c-format
-msgid "E364: Library call failed for \"%s()\""
-msgstr "E364: \"%s\"() ใฎใƒฉใ‚คใƒ–ใƒฉใƒชๅ‘ผๅ‡บใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+msgid "Yes"
+msgstr "ใฏใ„"
-#: ../globals.h:1026
-msgid "E19: Mark has invalid line number"
-msgstr "E19: ใƒžใƒผใ‚ฏใซ็„กๅŠนใช่กŒ็•ชๅทใŒๆŒ‡ๅฎšใ•ใ‚Œใฆใ„ใพใ—ใŸ"
+msgid "No"
+msgstr "ใ„ใ„ใˆ"
-#: ../globals.h:1027
-msgid "E20: Mark not set"
-msgstr "E20: ใƒžใƒผใ‚ฏใฏ่จญๅฎšใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
+msgid "Input _Methods"
+msgstr "ใ‚คใƒณใƒ—ใƒƒใƒˆใƒกใ‚ฝใƒƒใƒ‰"
-#: ../globals.h:1029
-msgid "E21: Cannot make changes, 'modifiable' is off"
-msgstr "E21: 'modifiable' ใŒใ‚ชใƒ•ใชใฎใง, ๅค‰ๆ›ดใงใใพใ›ใ‚“"
+msgid "VIM - Search and Replace..."
+msgstr "VIM - ๆคœ็ดขใจ็ฝฎๆ›..."
-#: ../globals.h:1030
-msgid "E22: Scripts nested too deep"
-msgstr "E22: ใ‚นใ‚ฏใƒชใƒ—ใƒˆใฎๅ…ฅใ‚ŒๅญใŒๆทฑ้ŽใŽใพใ™"
-
-#: ../globals.h:1031
-msgid "E23: No alternate file"
-msgstr "E23: ๅ‰ฏใƒ•ใ‚กใ‚คใƒซใฏใ‚ใ‚Šใพใ›ใ‚“"
+msgid "VIM - Search..."
+msgstr "VIM - ๆคœ็ดข..."
-#: ../globals.h:1032
-msgid "E24: No such abbreviation"
-msgstr "E24: ใใฎใ‚ˆใ†ใช็Ÿญ็ธฎๅ…ฅๅŠ›ใฏใ‚ใ‚Šใพใ›ใ‚“"
-
-#: ../globals.h:1033
-msgid "E477: No ! allowed"
-msgstr "E477: ! ใฏ่จฑๅฏใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
+msgid "Find what:"
+msgstr "ๆคœ็ดขๆ–‡ๅญ—ๅˆ—:"
-#: ../globals.h:1035
-msgid "E25: Nvim does not have a built-in GUI"
-msgstr "E25: GUIใฏไฝฟ็”จไธๅฏ่ƒฝใงใ™: ใ‚ณใƒณใƒ‘ใ‚คใƒซๆ™‚ใซ็„กๅŠนใซใ•ใ‚Œใฆใ„ใพใ™"
+msgid "Replace with:"
+msgstr "็ฝฎๆ›ๆ–‡ๅญ—ๅˆ—:"
-#: ../globals.h:1036
-#, c-format
-msgid "E28: No such highlight group name: %s"
-msgstr "E28: ใใฎใ‚ˆใ†ใชๅใฎใƒใ‚คใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ใฏใ‚ใ‚Šใพใ›ใ‚“: %s"
+msgid "Match whole word only"
+msgstr "ๆญฃ็ขบใซ่ฉฒๅฝ“ใ™ใ‚‹ใ‚‚ใฎใ ใ‘"
-#: ../globals.h:1037
-msgid "E29: No inserted text yet"
-msgstr "E29: ใพใ ใƒ†ใ‚ญใ‚นใƒˆใŒๆŒฟๅ…ฅใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
+msgid "Match case"
+msgstr "ๅคงๆ–‡ๅญ—/ๅฐๆ–‡ๅญ—ใ‚’ๅŒบๅˆฅใ™ใ‚‹"
-#: ../globals.h:1038
-msgid "E30: No previous command line"
-msgstr "E30: ไปฅๅ‰ใซใ‚ณใƒžใƒณใƒ‰่กŒใŒใ‚ใ‚Šใพใ›ใ‚“"
+msgid "Direction"
+msgstr "ๆ–นๅ‘"
-#: ../globals.h:1039
-msgid "E31: No such mapping"
-msgstr "E31: ใใฎใ‚ˆใ†ใชใƒžใƒƒใƒ”ใƒณใ‚ฐใฏใ‚ใ‚Šใพใ›ใ‚“"
+msgid "Up"
+msgstr "ไธŠ"
-#: ../globals.h:1040
-msgid "E479: No match"
-msgstr "E479: ่ฉฒๅฝ“ใฏใ‚ใ‚Šใพใ›ใ‚“"
+msgid "Down"
+msgstr "ไธ‹"
-#: ../globals.h:1041
-#, c-format
-msgid "E480: No match: %s"
-msgstr "E480: ่ฉฒๅฝ“ใฏใ‚ใ‚Šใพใ›ใ‚“: %s"
+msgid "Find Next"
+msgstr "ๆฌกใ‚’ๆคœ็ดข"
-#: ../globals.h:1042
-msgid "E32: No file name"
-msgstr "E32: ใƒ•ใ‚กใ‚คใƒซๅใŒใ‚ใ‚Šใพใ›ใ‚“"
+msgid "Replace"
+msgstr "็ฝฎๆ›"
-#: ../globals.h:1044
-msgid "E33: No previous substitute regular expression"
-msgstr "E33: ๆญฃ่ฆ่กจ็พ็ฝฎๆ›ใŒใพใ ๅฎŸ่กŒใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
+msgid "Replace All"
+msgstr "ๅ…จใฆ็ฝฎๆ›"
-#: ../globals.h:1045
-msgid "E34: No previous command"
-msgstr "E34: ใ‚ณใƒžใƒณใƒ‰ใŒใพใ ๅฎŸ่กŒใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
+msgid "_Close"
+msgstr "้–‰ใ˜ใ‚‹(_C)"
-#: ../globals.h:1046
-msgid "E35: No previous regular expression"
-msgstr "E35: ๆญฃ่ฆ่กจ็พใŒใพใ ๅฎŸ่กŒใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
+msgid "Vim: Received \"die\" request from session manager\n"
+msgstr "Vim: ใ‚ปใƒƒใ‚ทใƒงใƒณใƒžใƒใƒผใ‚ธใƒฃใ‹ใ‚‰ \"die\" ่ฆๆฑ‚ใ‚’ๅ—ใ‘ๅ–ใ‚Šใพใ—ใŸ\n"
-#: ../globals.h:1047
-msgid "E481: No range allowed"
-msgstr "E481: ็ฏ„ๅ›ฒๆŒ‡ๅฎšใฏ่จฑๅฏใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
+msgid "Close tab"
+msgstr "ใ‚ฟใƒ–ใƒšใƒผใ‚ธใ‚’้–‰ใ˜ใ‚‹"
-#: ../globals.h:1048
-msgid "E36: Not enough room"
-msgstr "E36: ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใซๅๅˆ†ใช้ซ˜ใ•ใ‚‚ใ—ใใฏๅน…ใŒใ‚ใ‚Šใพใ›ใ‚“"
+msgid "New tab"
+msgstr "ๆ–ฐ่ฆใ‚ฟใƒ–ใƒšใƒผใ‚ธ"
-#: ../globals.h:1049
-#, c-format
-msgid "E482: Can't create file %s"
-msgstr "E482: ใƒ•ใ‚กใ‚คใƒซ %s ใ‚’ไฝœๆˆใงใใพใ›ใ‚“"
+msgid "Open Tab..."
+msgstr "ใ‚ฟใƒ–ใƒšใƒผใ‚ธใ‚’้–‹ใ..."
-#: ../globals.h:1050
-msgid "E483: Can't get temp file name"
-msgstr "E483: ไธ€ๆ™‚ใƒ•ใ‚กใ‚คใƒซใฎๅๅ‰ใ‚’ๅ–ๅพ—ใงใใพใ›ใ‚“"
+msgid "Vim: Main window unexpectedly destroyed\n"
+msgstr "Vim: ใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใŒไธๆ„ใซ็ ดๅฃŠใ•ใ‚Œใพใ—ใŸ\n"
-#: ../globals.h:1051
-#, c-format
-msgid "E484: Can't open file %s"
-msgstr "E484: ใƒ•ใ‚กใ‚คใƒซ \"%s\" ใ‚’้–‹ใ‘ใพใ›ใ‚“"
+msgid "&Filter"
+msgstr "ใƒ•ใ‚ฃใƒซใ‚ฟ(&F)"
-#: ../globals.h:1052
-#, c-format
-msgid "E485: Can't read file %s"
-msgstr "E485: ใƒ•ใ‚กใ‚คใƒซ %s ใ‚’่ชญ่พผใ‚ใพใ›ใ‚“"
+msgid "&Cancel"
+msgstr "ใ‚ญใƒฃใƒณใ‚ปใƒซ(&C)"
-#: ../globals.h:1054
-msgid "E37: No write since last change (add ! to override)"
-msgstr "E37: ๆœ€ๅพŒใฎๅค‰ๆ›ดใŒไฟๅญ˜ใ•ใ‚Œใฆใ„ใพใ›ใ‚“ (! ใ‚’่ฟฝๅŠ ใงๅค‰ๆ›ดใ‚’็ ดๆฃ„)"
+msgid "Directories"
+msgstr "ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒช"
-#: ../globals.h:1055
-msgid "E37: No write since last change"
-msgstr "E37: ๆœ€ๅพŒใฎๅค‰ๆ›ดใŒไฟๅญ˜ใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
+msgid "Filter"
+msgstr "ใƒ•ใ‚ฃใƒซใ‚ฟ"
-#: ../globals.h:1056
-msgid "E38: Null argument"
-msgstr "E38: ๅผ•ๆ•ฐใŒ็ฉบใงใ™"
+msgid "&Help"
+msgstr "ใƒ˜ใƒซใƒ—(&H)"
-#: ../globals.h:1057
-msgid "E39: Number expected"
-msgstr "E39: ๆ•ฐๅ€คใŒ่ฆๆฑ‚ใ•ใ‚Œใฆใ„ใพใ™"
+msgid "Files"
+msgstr "ใƒ•ใ‚กใ‚คใƒซ"
-#: ../globals.h:1058
-#, c-format
-msgid "E40: Can't open errorfile %s"
-msgstr "E40: ใ‚จใƒฉใƒผใƒ•ใ‚กใ‚คใƒซ %s ใ‚’้–‹ใ‘ใพใ›ใ‚“"
+msgid "&OK"
+msgstr "&OK"
-#: ../globals.h:1059
-msgid "E41: Out of memory!"
-msgstr "E41: ใƒกใƒขใƒชใŒๅฐฝใๆžœใฆใพใ—ใŸ!"
+msgid "Selection"
+msgstr "้ธๆŠž"
-#: ../globals.h:1060
-msgid "Pattern not found"
-msgstr "ใƒ‘ใ‚ฟใƒผใƒณใฏ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“ใงใ—ใŸ"
+msgid "Find &Next"
+msgstr "ๆฌกใ‚’ๆคœ็ดข(&N)"
-#: ../globals.h:1061
-#, c-format
-msgid "E486: Pattern not found: %s"
-msgstr "E486: ใƒ‘ใ‚ฟใƒผใƒณใฏ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“ใงใ—ใŸ: %s"
+msgid "&Replace"
+msgstr "็ฝฎๆ›(&R)"
-#: ../globals.h:1062
-msgid "E487: Argument must be positive"
-msgstr "E487: ๅผ•ๆ•ฐใฏๆญฃใฎๅ€คใงใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“"
+msgid "Replace &All"
+msgstr "ๅ…จใฆ็ฝฎๆ›(&A)"
-#: ../globals.h:1064
-msgid "E459: Cannot go back to previous directory"
-msgstr "E459: ๅ‰ใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใซๆˆปใ‚Œใพใ›ใ‚“"
+msgid "&Undo"
+msgstr "ใ‚ขใƒณใƒ‰ใ‚ฅ(&U)"
-#: ../globals.h:1066
-msgid "E42: No Errors"
-msgstr "E42: ใ‚จใƒฉใƒผใฏใ‚ใ‚Šใพใ›ใ‚“"
+msgid "Open tab..."
+msgstr "ใ‚ฟใƒ–ใƒšใƒผใ‚ธใ‚’้–‹ใ"
-#: ../globals.h:1067
-msgid "E776: No location list"
-msgstr "E776: ใƒญใ‚ฑใƒผใ‚ทใƒงใƒณใƒชใ‚นใƒˆใฏใ‚ใ‚Šใพใ›ใ‚“"
+msgid "Find string (use '\\\\' to find a '\\')"
+msgstr "ๆคœ็ดขๆ–‡ๅญ—ๅˆ— ('\\' ใ‚’ๆคœ็ดขใ™ใ‚‹ใซใฏ '\\\\')"
-#: ../globals.h:1068
-msgid "E43: Damaged match string"
-msgstr "E43: ่ฉฒๅฝ“ๆ–‡ๅญ—ๅˆ—ใŒ็ ดๆใ—ใฆใ„ใพใ™"
+msgid "Find & Replace (use '\\\\' to find a '\\')"
+msgstr "ๆคœ็ดขใƒป็ฝฎๆ› ('\\' ใ‚’ๆคœ็ดขใ™ใ‚‹ใซใฏ '\\\\')"
-#: ../globals.h:1069
-msgid "E44: Corrupted regexp program"
-msgstr "E44: ไธๆญฃใชๆญฃ่ฆ่กจ็พใƒ—ใƒญใ‚ฐใƒฉใƒ ใงใ™"
+msgid "Not Used"
+msgstr "ไฝฟใ‚ใ‚Œใพใ›ใ‚“"
-#: ../globals.h:1071
-msgid "E45: 'readonly' option is set (add ! to override)"
-msgstr "E45: 'readonly' ใ‚ชใƒ—ใ‚ทใƒงใƒณใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใพใ™ (! ใ‚’่ฟฝๅŠ ใงไธŠๆ›ธใ)"
+msgid "Directory\t*.nothing\n"
+msgstr "ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒช\t*.nothing\n"
-#: ../globals.h:1073
#, c-format
-msgid "E46: Cannot change read-only variable \"%s\""
-msgstr "E46: ่ชญๅ–ๅฐ‚็”จๅค‰ๆ•ฐ \"%s\" ใซใฏๅ€คใ‚’่จญๅฎšใงใใพใ›ใ‚“"
+msgid "E671: Cannot find window title \"%s\""
+msgstr "E671: ใ‚ฟใ‚คใƒˆใƒซใŒ \"%s\" ใฎใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฏ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-#: ../globals.h:1075
#, c-format
-msgid "E794: Cannot set variable in the sandbox: \"%s\""
-msgstr "E794: ใ‚ตใƒณใƒ‰ใƒœใƒƒใ‚ฏใ‚นใงใฏๅค‰ๆ•ฐ \"%s\" ใซๅ€คใ‚’่จญๅฎšใงใใพใ›ใ‚“"
+msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
+msgstr "E243: ๅผ•ๆ•ฐใฏใ‚ตใƒใƒผใƒˆใ•ใ‚Œใพใ›ใ‚“: \"-%s\"; OLE็‰ˆใ‚’ไฝฟ็”จใ—ใฆใใ ใ•ใ„."
-#: ../globals.h:1076
-msgid "E47: Error while reading errorfile"
-msgstr "E47: ใ‚จใƒฉใƒผใƒ•ใ‚กใ‚คใƒซใฎ่ชญ่พผไธญใซใ‚จใƒฉใƒผใŒ็™บ็”Ÿใ—ใพใ—ใŸ"
+msgid "E672: Unable to open window inside MDI application"
+msgstr "E672: MDIใ‚ขใƒ—ใƒชใฎไธญใงใฏใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚’้–‹ใ‘ใพใ›ใ‚“"
-#: ../globals.h:1078
-msgid "E48: Not allowed in sandbox"
-msgstr "E48: ใ‚ตใƒณใƒ‰ใƒœใƒƒใ‚ฏใ‚นใงใฏ่จฑใ•ใ‚Œใพใ›ใ‚“"
+msgid "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
+msgstr "Vim E458: ่‰ฒๆŒ‡ๅฎšใŒๆญฃใ—ใใชใ„ใฎใงใ‚จใƒณใƒˆใƒชใ‚’ๅ‰ฒใ‚Šๅฝ“ใฆใ‚‰ใ‚Œใพใ›ใ‚“"
-#: ../globals.h:1080
-msgid "E523: Not allowed here"
-msgstr "E523: ใ“ใ“ใงใฏ่จฑๅฏใ•ใ‚Œใพใ›ใ‚“"
-
-#: ../globals.h:1082
-msgid "E359: Screen mode setting not supported"
-msgstr "E359: ใ‚นใ‚ฏใƒชใƒผใƒณใƒขใƒผใƒ‰ใฎ่จญๅฎšใซใฏๅฏพๅฟœใ—ใฆใ„ใพใ›ใ‚“"
-
-#: ../globals.h:1083
-msgid "E49: Invalid scroll size"
-msgstr "E49: ็„กๅŠนใชใ‚นใ‚ฏใƒญใƒผใƒซ้‡ใงใ™"
-
-#: ../globals.h:1084
-msgid "E91: 'shell' option is empty"
-msgstr "E91: 'shell' ใ‚ชใƒ—ใ‚ทใƒงใƒณใŒ็ฉบใงใ™"
-
-#: ../globals.h:1085
-msgid "E255: Couldn't read in sign data!"
-msgstr "E255: sign ใฎใƒ‡ใƒผใ‚ฟใ‚’่ชญ่พผใ‚ใพใ›ใ‚“ใงใ—ใŸ"
-
-#: ../globals.h:1086
-msgid "E72: Close error on swap file"
-msgstr "E72: ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใฎใ‚ฏใƒญใƒผใ‚บๆ™‚ใ‚จใƒฉใƒผใงใ™"
-
-#: ../globals.h:1087
-msgid "E73: tag stack empty"
-msgstr "E73: ใ‚ฟใ‚ฐใ‚นใ‚ฟใƒƒใ‚ฏใŒ็ฉบใงใ™"
-
-#: ../globals.h:1088
-msgid "E74: Command too complex"
-msgstr "E74: ใ‚ณใƒžใƒณใƒ‰ใŒ่ค‡้›‘้ŽใŽใพใ™"
-
-#: ../globals.h:1089
-msgid "E75: Name too long"
-msgstr "E75: ๅๅ‰ใŒ้•ท้ŽใŽใพใ™"
+#, c-format
+msgid "E250: Fonts for the following charsets are missing in fontset %s:"
+msgstr "E250: ไปฅไธ‹ใฎๆ–‡ๅญ—ใ‚ปใƒƒใƒˆใฎใƒ•ใ‚ฉใƒณใƒˆใŒใ‚ใ‚Šใพใ›ใ‚“ %s:"
-#: ../globals.h:1090
-msgid "E76: Too many ["
-msgstr "E76: [ ใŒๅคš้ŽใŽใพใ™"
+#, c-format
+msgid "E252: Fontset name: %s"
+msgstr "E252: ใƒ•ใ‚ฉใƒณใƒˆใ‚ปใƒƒใƒˆๅ: %s"
-#: ../globals.h:1091
-msgid "E77: Too many file names"
-msgstr "E77: ใƒ•ใ‚กใ‚คใƒซๅใŒๅคš้ŽใŽใพใ™"
+#, c-format
+msgid "Font '%s' is not fixed-width"
+msgstr "ใƒ•ใ‚ฉใƒณใƒˆ '%s' ใฏๅ›บๅฎšๅน…ใงใฏใ‚ใ‚Šใพใ›ใ‚“"
-#: ../globals.h:1092
-msgid "E488: Trailing characters"
-msgstr "E488: ไฝ™ๅˆ†ใชๆ–‡ๅญ—ใŒๅพŒใ‚ใซใ‚ใ‚Šใพใ™"
+#, c-format
+msgid "E253: Fontset name: %s"
+msgstr "E253: ใƒ•ใ‚ฉใƒณใƒˆใ‚ปใƒƒใƒˆๅ: %s"
-#: ../globals.h:1093
-msgid "E78: Unknown mark"
-msgstr "E78: ๆœช็Ÿฅใฎใƒžใƒผใ‚ฏ"
+#, c-format
+msgid "Font0: %s"
+msgstr "ใƒ•ใ‚ฉใƒณใƒˆ0: %s"
-#: ../globals.h:1094
-msgid "E79: Cannot expand wildcards"
-msgstr "E79: ใƒฏใ‚คใƒซใƒ‰ใ‚ซใƒผใƒ‰ใ‚’ๅฑ•้–‹ใงใใพใ›ใ‚“"
+#, c-format
+msgid "Font1: %s"
+msgstr "ใƒ•ใ‚ฉใƒณใƒˆ1: %s"
-#: ../globals.h:1096
-msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
-msgstr "E591: 'winheight' ใฏ 'winminheight' ใ‚ˆใ‚Šๅฐใ•ใใงใใพใ›ใ‚“"
+#, c-format
+msgid "Font%ld width is not twice that of font0"
+msgstr "ใƒ•ใ‚ฉใƒณใƒˆ%ld ใฎๅน…ใŒใƒ•ใ‚ฉใƒณใƒˆ0ใฎ2ๅ€ใงใฏใ‚ใ‚Šใพใ›ใ‚“"
-#: ../globals.h:1098
-msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
-msgstr "E592: 'winwidth' ใฏ 'winminwidth' ใ‚ˆใ‚Šๅฐใ•ใใงใใพใ›ใ‚“"
+#, c-format
+msgid "Font0 width: %ld"
+msgstr "ใƒ•ใ‚ฉใƒณใƒˆ0ใฎๅน…: %ld"
-#: ../globals.h:1099
-msgid "E80: Error while writing"
-msgstr "E80: ๆ›ธ่พผใฟไธญใฎใ‚จใƒฉใƒผ"
+#, c-format
+msgid "Font1 width: %ld"
+msgstr "ใƒ•ใ‚ฉใƒณใƒˆ1ใฎๅน…: %ld"
-#: ../globals.h:1100
-msgid "Zero count"
-msgstr "ใ‚ผใƒญใ‚ซใ‚ฆใƒณใƒˆ"
+msgid "Invalid font specification"
+msgstr "็„กๅŠนใชใƒ•ใ‚ฉใƒณใƒˆๆŒ‡ๅฎšใงใ™"
-#: ../globals.h:1101
-msgid "E81: Using <SID> not in a script context"
-msgstr "E81: ใ‚นใ‚ฏใƒชใƒ—ใƒˆไปฅๅค–ใง<SID>ใŒไฝฟใ‚ใ‚Œใพใ—ใŸ"
+msgid "&Dismiss"
+msgstr "ๅดไธ‹ใ™ใ‚‹(&D)"
-#: ../globals.h:1102
-#, c-format
-msgid "E685: Internal error: %s"
-msgstr "E685: ๅ†…้ƒจใ‚จใƒฉใƒผใงใ™: %s"
+msgid "no specific match"
+msgstr "ใƒžใƒƒใƒใ™ใ‚‹ใ‚‚ใฎใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../globals.h:1104
-msgid "E363: pattern uses more memory than 'maxmempattern'"
-msgstr "E363: ใƒ‘ใ‚ฟใƒผใƒณใŒ 'maxmempattern' ไปฅไธŠใฎใƒกใƒขใƒชใ‚’ไฝฟ็”จใ—ใพใ™"
+msgid "Vim - Font Selector"
+msgstr "Vim - ใƒ•ใ‚ฉใƒณใƒˆ้ธๆŠž"
-#: ../globals.h:1105
-msgid "E749: empty buffer"
-msgstr "E749: ใƒใƒƒใƒ•ใ‚กใŒ็ฉบใงใ™"
+msgid "Name:"
+msgstr "ๅๅ‰:"
-#: ../globals.h:1108
-msgid "E682: Invalid search pattern or delimiter"
-msgstr "E682: ๆคœ็ดขใƒ‘ใ‚ฟใƒผใƒณใ‹ๅŒบๅˆ‡ใ‚Š่จ˜ๅทใŒไธๆญฃใงใ™"
+msgid "Show size in Points"
+msgstr "ใ‚ตใ‚คใ‚บใ‚’ใƒใ‚คใƒณใƒˆใง่กจ็คบใ™ใ‚‹"
-#: ../globals.h:1109
-msgid "E139: File is loaded in another buffer"
-msgstr "E139: ๅŒใ˜ๅๅ‰ใฎใƒ•ใ‚กใ‚คใƒซใŒไป–ใฎใƒใƒƒใƒ•ใ‚กใง่ชญ่พผใพใ‚Œใฆใ„ใพใ™"
+msgid "Encoding:"
+msgstr "ใ‚จใƒณใ‚ณใƒผใƒ‰:"
-#: ../globals.h:1110
-#, c-format
-msgid "E764: Option '%s' is not set"
-msgstr "E764: ใ‚ชใƒ—ใ‚ทใƒงใƒณ '%s' ใฏ่จญๅฎšใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
+msgid "Font:"
+msgstr "ใƒ•ใ‚ฉใƒณใƒˆ:"
-#: ../globals.h:1111
-msgid "E850: Invalid register name"
-msgstr "E850: ็„กๅŠนใชใƒฌใ‚ธใ‚นใ‚ฟๅใงใ™"
+msgid "Style:"
+msgstr "ใ‚นใ‚ฟใ‚คใƒซ:"
-#: ../globals.h:1114
-msgid "search hit TOP, continuing at BOTTOM"
-msgstr "ไธŠใพใงๆคœ็ดขใ—ใŸใฎใงไธ‹ใซๆˆปใ‚Šใพใ™"
+msgid "Size:"
+msgstr "ใ‚ตใ‚คใ‚บ:"
-#: ../globals.h:1115
-msgid "search hit BOTTOM, continuing at TOP"
-msgstr "ไธ‹ใพใงๆคœ็ดขใ—ใŸใฎใงไธŠใซๆˆปใ‚Šใพใ™"
+msgid "E256: Hangul automata ERROR"
+msgstr "E256: ใƒใƒณใ‚ฐใƒซใ‚ชใƒผใƒˆใƒžใƒˆใƒณใ‚จใƒฉใƒผ"
-#: ../hardcopy.c:240
msgid "E550: Missing colon"
msgstr "E550: ใ‚ณใƒญใƒณใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../hardcopy.c:252
msgid "E551: Illegal component"
msgstr "E551: ไธๆญฃใชๆง‹ๆ–‡่ฆ็ด ใงใ™"
-#: ../hardcopy.c:259
msgid "E552: digit expected"
msgstr "E552: ๆ•ฐๅ€คใŒๅฟ…่ฆใงใ™"
-#: ../hardcopy.c:473
#, c-format
msgid "Page %d"
msgstr "%d ใƒšใƒผใ‚ธ"
-#: ../hardcopy.c:597
msgid "No text to be printed"
msgstr "ๅฐๅˆทใ™ใ‚‹ใƒ†ใ‚ญใ‚นใƒˆใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../hardcopy.c:668
#, c-format
msgid "Printing page %d (%d%%)"
msgstr "ๅฐๅˆทไธญ: ใƒšใƒผใ‚ธ %d (%d%%)"
-#: ../hardcopy.c:680
#, c-format
msgid " Copy %d of %d"
msgstr " ใ‚ณใƒ”ใƒผ %d (ๅ…จ %d ไธญ)"
-#: ../hardcopy.c:733
#, c-format
msgid "Printed: %s"
msgstr "ๅฐๅˆทใ—ใพใ—ใŸ: %s"
-#: ../hardcopy.c:740
msgid "Printing aborted"
msgstr "ๅฐๅˆทใŒไธญๆญขใ•ใ‚Œใพใ—ใŸ"
-#: ../hardcopy.c:1365
msgid "E455: Error writing to PostScript output file"
msgstr "E455: PostScriptๅ‡บๅŠ›ใƒ•ใ‚กใ‚คใƒซใฎๆ›ธ่พผใฟใ‚จใƒฉใƒผใงใ™"
-#: ../hardcopy.c:1747
#, c-format
msgid "E624: Can't open file \"%s\""
msgstr "E624: ใƒ•ใ‚กใ‚คใƒซ \"%s\" ใ‚’้–‹ใ‘ใพใ›ใ‚“"
-#: ../hardcopy.c:1756 ../hardcopy.c:2470
#, c-format
msgid "E457: Can't read PostScript resource file \"%s\""
msgstr "E457: PostScriptใฎใƒชใ‚ฝใƒผใ‚นใƒ•ใ‚กใ‚คใƒซ \"%s\" ใ‚’่ชญ่พผใ‚ใพใ›ใ‚“"
-#: ../hardcopy.c:1772
#, c-format
msgid "E618: file \"%s\" is not a PostScript resource file"
msgstr "E618: ใƒ•ใ‚กใ‚คใƒซ \"%s\" ใฏ PostScript ใƒชใ‚ฝใƒผใ‚นใƒ•ใ‚กใ‚คใƒซใงใฏใ‚ใ‚Šใพใ›ใ‚“"
-#: ../hardcopy.c:1788 ../hardcopy.c:1805 ../hardcopy.c:1844
#, c-format
msgid "E619: file \"%s\" is not a supported PostScript resource file"
msgstr "E619: ใƒ•ใ‚กใ‚คใƒซ \"%s\" ใฏๅฏพๅฟœใ—ใฆใ„ใชใ„ PostScript ใƒชใ‚ฝใƒผใ‚นใƒ•ใ‚กใ‚คใƒซใงใ™"
-#: ../hardcopy.c:1856
#, c-format
msgid "E621: \"%s\" resource file has wrong version"
msgstr "E621: ใƒชใ‚ฝใƒผใ‚นใƒ•ใ‚กใ‚คใƒซ \"%s\" ใฏใƒใƒผใ‚ธใƒงใƒณใŒ็•ฐใชใ‚Šใพใ™"
-#: ../hardcopy.c:2225
msgid "E673: Incompatible multi-byte encoding and character set."
msgstr "E673: ไบ’ๆ›ๆ€งใฎ็„กใ„ใƒžใƒซใƒใƒใ‚คใƒˆใ‚จใƒณใ‚ณใƒผใƒ‡ใ‚ฃใƒณใ‚ฐใจๆ–‡ๅญ—ใ‚ปใƒƒใƒˆใงใ™"
-#: ../hardcopy.c:2238
msgid "E674: printmbcharset cannot be empty with multi-byte encoding."
msgstr "E674: ใƒžใƒซใƒใƒใ‚คใƒˆใ‚จใƒณใ‚ณใƒผใƒ‡ใ‚ฃใƒณใ‚ฐใงใฏ printmbcharset ใ‚’็ฉบใซใงใใพใ›ใ‚“"
-#: ../hardcopy.c:2254
msgid "E675: No default font specified for multi-byte printing."
msgstr ""
"E675: ใƒžใƒซใƒใƒใ‚คใƒˆๆ–‡ๅญ—ใ‚’ๅฐๅˆทใ™ใ‚‹ใŸใ‚ใฎใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใƒ•ใ‚ฉใƒณใƒˆใŒๆŒ‡ๅฎšใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#: ../hardcopy.c:2426
msgid "E324: Can't open PostScript output file"
msgstr "E324: PostScriptๅ‡บๅŠ›็”จใฎใƒ•ใ‚กใ‚คใƒซใ‚’้–‹ใ‘ใพใ›ใ‚“"
-#: ../hardcopy.c:2458
#, c-format
msgid "E456: Can't open file \"%s\""
msgstr "E456: ใƒ•ใ‚กใ‚คใƒซ \"%s\" ใ‚’้–‹ใ‘ใพใ›ใ‚“"
-#: ../hardcopy.c:2583
msgid "E456: Can't find PostScript resource file \"prolog.ps\""
msgstr "E456: PostScriptใฎใƒชใ‚ฝใƒผใ‚นใƒ•ใ‚กใ‚คใƒซ \"prolog.ps\" ใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-#: ../hardcopy.c:2593
msgid "E456: Can't find PostScript resource file \"cidfont.ps\""
msgstr "E456: PostScriptใฎใƒชใ‚ฝใƒผใ‚นใƒ•ใ‚กใ‚คใƒซ \"cidfont.ps\" ใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-#: ../hardcopy.c:2622 ../hardcopy.c:2639 ../hardcopy.c:2665
#, c-format
msgid "E456: Can't find PostScript resource file \"%s.ps\""
msgstr "E456: PostScriptใฎใƒชใ‚ฝใƒผใ‚นใƒ•ใ‚กใ‚คใƒซ \"%s.ps\" ใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-#: ../hardcopy.c:2654
#, c-format
msgid "E620: Unable to convert to print encoding \"%s\""
msgstr "E620: ๅฐๅˆทใ‚จใƒณใ‚ณใƒผใƒ‰ \"%s\" ใธๅค‰ๆ›ใงใใพใ›ใ‚“"
-#: ../hardcopy.c:2877
msgid "Sending to printer..."
msgstr "ใƒ—ใƒชใƒณใ‚ฟใซ้€ไฟกไธญ..."
-#: ../hardcopy.c:2881
msgid "E365: Failed to print PostScript file"
msgstr "E365: PostScriptใƒ•ใ‚กใ‚คใƒซใฎๅฐๅˆทใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-#: ../hardcopy.c:2883
msgid "Print job sent."
msgstr "ๅฐๅˆทใ‚ธใƒงใƒ–ใ‚’้€ไฟกใ—ใพใ—ใŸ."
-#: ../if_cscope.c:85
msgid "Add a new database"
msgstr "ๆ–ฐใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚นใ‚’่ฟฝๅŠ "
-#: ../if_cscope.c:87
msgid "Query for a pattern"
msgstr "ใƒ‘ใ‚ฟใƒผใƒณใฎใ‚ฏใ‚จใƒชใƒผใ‚’่ฟฝๅŠ "
-#: ../if_cscope.c:89
msgid "Show this message"
msgstr "ใ“ใฎใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’่กจ็คบใ™ใ‚‹"
-#: ../if_cscope.c:91
msgid "Kill a connection"
msgstr "ๆŽฅ็ถšใ‚’็ต‚ไบ†ใ™ใ‚‹"
-#: ../if_cscope.c:93
msgid "Reinit all connections"
msgstr "ๅ…จใฆใฎๆŽฅ็ถšใ‚’ๅ†ๅˆๆœŸๅŒ–ใ™ใ‚‹"
-#: ../if_cscope.c:95
msgid "Show connections"
msgstr "ๆŽฅ็ถšใ‚’่กจ็คบใ™ใ‚‹"
-#: ../if_cscope.c:101
#, c-format
msgid "E560: Usage: cs[cope] %s"
msgstr "E560: ไฝฟ็”จๆ–นๆณ•: cs[cope] %s"
-#: ../if_cscope.c:225
msgid "This cscope command does not support splitting the window.\n"
msgstr "ใ“ใฎcscopeใ‚ณใƒžใƒณใƒ‰ใฏๅˆ†ๅ‰ฒใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใงใฏใ‚ตใƒใƒผใƒˆใ•ใ‚Œใพใ›ใ‚“.\n"
-#: ../if_cscope.c:266
msgid "E562: Usage: cstag <ident>"
msgstr "E562: ไฝฟ็”จๆณ•: cstag <ident>"
-#: ../if_cscope.c:313
msgid "E257: cstag: tag not found"
msgstr "E257: cstag: ใ‚ฟใ‚ฐใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-#: ../if_cscope.c:461
#, c-format
msgid "E563: stat(%s) error: %d"
msgstr "E563: stat(%s) ใ‚จใƒฉใƒผ: %d"
-#: ../if_cscope.c:551
+msgid "E563: stat error"
+msgstr "E563: stat ใ‚จใƒฉใƒผ"
+
#, c-format
msgid "E564: %s is not a directory or a valid cscope database"
msgstr "E564: %s ใฏใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชๅŠใณๆœ‰ๅŠนใชcscopeใฎใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚นใงใฏใ‚ใ‚Šใพใ›ใ‚“"
-#: ../if_cscope.c:566
#, c-format
msgid "Added cscope database %s"
msgstr "cscopeใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚น %s ใ‚’่ฟฝๅŠ "
-#: ../if_cscope.c:616
#, c-format
-msgid "E262: error reading cscope connection %<PRId64>"
-msgstr "E262: cscopeใฎๆŽฅ็ถš %<PRId64> ใ‚’่ชญ่พผใฟไธญใฎใ‚จใƒฉใƒผใงใ™"
+msgid "E262: error reading cscope connection %ld"
+msgstr "E262: cscopeใฎๆŽฅ็ถš %ld ใ‚’่ชญ่พผใฟไธญใฎใ‚จใƒฉใƒผใงใ™"
-#: ../if_cscope.c:711
msgid "E561: unknown cscope search type"
msgstr "E561: ๆœช็Ÿฅใฎcscopeๆคœ็ดขๅž‹ใงใ™"
-#: ../if_cscope.c:752 ../if_cscope.c:789
msgid "E566: Could not create cscope pipes"
msgstr "E566: cscopeใƒ‘ใ‚คใƒ—ใ‚’ไฝœๆˆใงใใพใ›ใ‚“ใงใ—ใŸ"
-#: ../if_cscope.c:767
msgid "E622: Could not fork for cscope"
msgstr "E622: cscopeใฎ่ตทๅ‹•ๆบ–ๅ‚™(fork)ใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-#: ../if_cscope.c:849
msgid "cs_create_connection setpgid failed"
msgstr "cs_create_connection ใธใฎ setpgid ใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-#: ../if_cscope.c:853 ../if_cscope.c:889
msgid "cs_create_connection exec failed"
msgstr "cs_create_connection ใฎๅฎŸ่กŒใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-#: ../if_cscope.c:863 ../if_cscope.c:902
msgid "cs_create_connection: fdopen for to_fp failed"
msgstr "cs_create_connection: to_fp ใฎ fdopen ใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-#: ../if_cscope.c:865 ../if_cscope.c:906
msgid "cs_create_connection: fdopen for fr_fp failed"
msgstr "cs_create_connection: fr_fp ใฎ fdopen ใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-#: ../if_cscope.c:890
msgid "E623: Could not spawn cscope process"
msgstr "E623: cscopeใƒ—ใƒญใ‚ปใ‚นใ‚’่ตทๅ‹•ใงใใพใ›ใ‚“ใงใ—ใŸ"
-#: ../if_cscope.c:932
msgid "E567: no cscope connections"
msgstr "E567: cscopeๆŽฅ็ถšใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-#: ../if_cscope.c:1009
#, c-format
msgid "E469: invalid cscopequickfix flag %c for %c"
msgstr "E469: ็„กๅŠนใช cscopequickfix ใƒ•ใƒฉใ‚ฐ %c ใฎ %c ใงใ™"
-#: ../if_cscope.c:1058
#, c-format
msgid "E259: no matches found for cscope query %s of %s"
msgstr "E259: cscopeใ‚ฏใ‚จใƒชใƒผ %s of %s ใซ่ฉฒๅฝ“ใŒใ‚ใ‚Šใพใ›ใ‚“ใงใ—ใŸ"
-#: ../if_cscope.c:1142
msgid "cscope commands:\n"
msgstr "cscopeใ‚ณใƒžใƒณใƒ‰:\n"
-#: ../if_cscope.c:1150
#, c-format
msgid "%-5s: %s%*s (Usage: %s)"
msgstr "%-5s: %s%*s (ไฝฟ็”จๆณ•: %s)"
-#: ../if_cscope.c:1155
msgid ""
"\n"
+" a: Find assignments to this symbol\n"
" c: Find functions calling this function\n"
" d: Find functions called by this function\n"
" e: Find this egrep pattern\n"
@@ -3238,6 +2584,7 @@ msgid ""
" t: Find this text string\n"
msgstr ""
"\n"
+" a: ใ“ใฎใ‚ทใƒณใƒœใƒซใซๅฏพใ™ใ‚‹ไปฃๅ…ฅใ‚’ๆŽขใ™\n"
" c: ใ“ใฎ้–ขๆ•ฐใ‚’ๅ‘ผใ‚“ใงใ„ใ‚‹้–ขๆ•ฐใ‚’ๆŽขใ™\n"
" d: ใ“ใฎ้–ขๆ•ฐใ‹ใ‚‰ๅ‘ผใ‚“ใงใ„ใ‚‹้–ขๆ•ฐใ‚’ๆŽขใ™\n"
" e: ใ“ใฎegrepใƒ‘ใ‚ฟใƒผใƒณใ‚’ๆŽขใ™\n"
@@ -3247,31 +2594,31 @@ msgstr ""
" s: ใ“ใฎCใ‚ทใƒณใƒœใƒซใ‚’ๆŽขใ™\n"
" t: ใ“ใฎใƒ†ใ‚ญใ‚นใƒˆๆ–‡ๅญ—ๅˆ—ใ‚’ๆŽขใ™\n"
-#: ../if_cscope.c:1226
+#, c-format
+msgid "E625: cannot open cscope database: %s"
+msgstr "E625: cscopeใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚น: %s ใ‚’้–‹ใใ“ใจใŒใงใใพใ›ใ‚“"
+
+msgid "E626: cannot get cscope database information"
+msgstr "E626: cscopeใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚นใฎๆƒ…ๅ ฑใ‚’ๅ–ๅพ—ใงใใพใ›ใ‚“"
+
msgid "E568: duplicate cscope database not added"
msgstr "E568: ้‡่ค‡ใ™ใ‚‹cscopeใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚นใฏ่ฟฝๅŠ ใ•ใ‚Œใพใ›ใ‚“ใงใ—ใŸ"
-#: ../if_cscope.c:1335
#, c-format
msgid "E261: cscope connection %s not found"
msgstr "E261: cscopeๆŽฅ็ถš %s ใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“ใงใ—ใŸ"
-#: ../if_cscope.c:1364
#, c-format
msgid "cscope connection %s closed"
msgstr "cscopeๆŽฅ็ถš %s ใŒ้–‰ใ˜ใ‚‰ใ‚Œใพใ—ใŸ"
-#. should not reach here
-#: ../if_cscope.c:1486
msgid "E570: fatal error in cs_manage_matches"
msgstr "E570: cs_manage_matches ใง่‡ดๅ‘ฝ็š„ใชใ‚จใƒฉใƒผใงใ™"
-#: ../if_cscope.c:1693
#, c-format
msgid "Cscope tag: %s"
msgstr "Cscope ใ‚ฟใ‚ฐ: %s"
-#: ../if_cscope.c:1711
msgid ""
"\n"
" # line"
@@ -3279,87 +2626,314 @@ msgstr ""
"\n"
" # ่กŒ็•ชๅท"
-#: ../if_cscope.c:1713
msgid "filename / context / line\n"
msgstr "ใƒ•ใ‚กใ‚คใƒซๅ / ๆ–‡่„ˆ / ่กŒ\n"
-#: ../if_cscope.c:1809
#, c-format
msgid "E609: Cscope error: %s"
msgstr "E609: cscopeใ‚จใƒฉใƒผ: %s"
-#: ../if_cscope.c:2053
msgid "All cscope databases reset"
msgstr "ๅ…จใฆใฎcscopeใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚นใ‚’ใƒชใ‚ปใƒƒใƒˆใ—ใพใ™"
-#: ../if_cscope.c:2123
msgid "no cscope connections\n"
msgstr "cscopeๆŽฅ็ถšใŒใ‚ใ‚Šใพใ›ใ‚“\n"
-#: ../if_cscope.c:2126
msgid " # pid database name prepend path\n"
msgstr " # pid ใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚นๅ prepend ใƒ‘ใ‚น\n"
-#: ../main.c:144
+msgid "Lua library cannot be loaded."
+msgstr "Luaใƒฉใ‚คใƒ–ใƒฉใƒชใ‚’ใƒญใƒผใƒ‰ใงใใพใ›ใ‚“."
+
+msgid "cannot save undo information"
+msgstr "ใ‚ขใƒณใƒ‰ใ‚ฅๆƒ…ๅ ฑใŒไฟๅญ˜ใงใใพใ›ใ‚“"
+
+msgid ""
+"E815: Sorry, this command is disabled, the MzScheme libraries could not be "
+"loaded."
+msgstr "E815: ใ“ใฎใ‚ณใƒžใƒณใƒ‰ใฏ็„กๅŠนใงใ™. MzScheme ใƒฉใ‚คใƒ–ใƒฉใƒชใ‚’ใƒญใƒผใƒ‰ใงใใพใ›ใ‚“."
+
+msgid ""
+"E895: Sorry, this command is disabled, the MzScheme's racket/base module "
+"could not be loaded."
+msgstr ""
+"E895: ใ“ใฎใ‚ณใƒžใƒณใƒ‰ใฏ็„กๅŠนใงใ™ใ€ใ”ใ‚ใ‚“ใชใ•ใ„. MzScheme ใฎ racket/base ใƒขใ‚ธใƒฅใƒผ"
+"ใƒซใŒใƒญใƒผใƒ‰ใงใใพใ›ใ‚“ใงใ—ใŸ."
+
+msgid "invalid expression"
+msgstr "็„กๅŠนใชๅผใงใ™"
+
+msgid "expressions disabled at compile time"
+msgstr "ๅผใฏใ‚ณใƒณใƒ‘ใ‚คใƒซๆ™‚ใซ็„กๅŠนใซใ•ใ‚Œใฆใ„ใพใ™"
+
+msgid "hidden option"
+msgstr "้š ใ—ใ‚ชใƒ—ใ‚ทใƒงใƒณ"
+
+msgid "unknown option"
+msgstr "ๆœช็Ÿฅใฎใ‚ชใƒ—ใ‚ทใƒงใƒณใงใ™"
+
+msgid "window index is out of range"
+msgstr "็ฏ„ๅ›ฒๅค–ใฎใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆ็•ชๅทใงใ™"
+
+msgid "couldn't open buffer"
+msgstr "ใƒใƒƒใƒ•ใ‚กใ‚’้–‹ใ‘ใพใ›ใ‚“"
+
+msgid "cannot delete line"
+msgstr "่กŒใ‚’ๆถˆใ›ใพใ›ใ‚“"
+
+msgid "cannot replace line"
+msgstr "่กŒใ‚’็ฝฎๆ›ใงใใพใ›ใ‚“"
+
+msgid "cannot insert line"
+msgstr "่กŒใ‚’ๆŒฟๅ…ฅใงใใพใ›ใ‚“"
+
+msgid "string cannot contain newlines"
+msgstr "ๆ–‡ๅญ—ๅˆ—ใซใฏๆ”น่กŒๆ–‡ๅญ—ใ‚’ๅซใ‚ใ‚‰ใ‚Œใพใ›ใ‚“"
+
+msgid "error converting Scheme values to Vim"
+msgstr "Schemeๅ€คใฎVimใธใฎๅค‰ๆ›ใ‚จใƒฉใƒผ"
+
+msgid "Vim error: ~a"
+msgstr "Vim ใ‚จใƒฉใƒผ: ~a"
+
+msgid "Vim error"
+msgstr "Vim ใ‚จใƒฉใƒผ"
+
+msgid "buffer is invalid"
+msgstr "ใƒใƒƒใƒ•ใ‚กใฏ็„กๅŠนใงใ™"
+
+msgid "window is invalid"
+msgstr "ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฏ็„กๅŠนใงใ™"
+
+msgid "linenr out of range"
+msgstr "็ฏ„ๅ›ฒๅค–ใฎ่กŒ็•ชๅทใงใ™"
+
+msgid "not allowed in the Vim sandbox"
+msgstr "ใ‚ตใƒณใƒ‰ใƒœใƒƒใ‚ฏใ‚นใงใฏ่จฑใ•ใ‚Œใพใ›ใ‚“"
+
+#, c-format
+msgid "E370: Could not load library %s"
+msgstr "E370: ใƒฉใ‚คใƒ–ใƒฉใƒช %s ใ‚’ใƒญใƒผใƒ‰ใงใใพใ›ใ‚“ใงใ—ใŸ"
+
+msgid "Sorry, this command is disabled: the Perl library could not be loaded."
+msgstr ""
+"ใ“ใฎใ‚ณใƒžใƒณใƒ‰ใฏ็„กๅŠนใงใ™ใ€ใ”ใ‚ใ‚“ใชใ•ใ„: Perlใƒฉใ‚คใƒ–ใƒฉใƒชใ‚’ใƒญใƒผใƒ‰ใงใใพใ›ใ‚“ใงใ—ใŸ."
+
+msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
+msgstr ""
+"E299: ใ‚ตใƒณใƒ‰ใƒœใƒƒใ‚ฏใ‚นใงใฏ Safe ใƒขใ‚ธใƒฅใƒผใƒซใ‚’ไฝฟ็”จใ—ใชใ„Perlใ‚นใ‚ฏใƒชใƒ—ใƒˆใฏ็ฆใ˜ใ‚‰ใ‚Œ"
+"ใฆใ„ใพใ™"
+
+msgid "E836: This Vim cannot execute :python after using :py3"
+msgstr "E836: ใ“ใฎVimใงใฏ :py3 ใ‚’ไฝฟใฃใŸๅพŒใซ :python ใ‚’ไฝฟใˆใพใ›ใ‚“"
+
+msgid ""
+"E263: Sorry, this command is disabled, the Python library could not be "
+"loaded."
+msgstr ""
+"E263: ใ“ใฎใ‚ณใƒžใƒณใƒ‰ใฏ็„กๅŠนใงใ™ใ€ใ”ใ‚ใ‚“ใชใ•ใ„: Pythonใƒฉใ‚คใƒ–ใƒฉใƒชใ‚’ใƒญใƒผใƒ‰ใงใใพใ›"
+"ใ‚“ใงใ—ใŸ."
+
+msgid ""
+"E887: Sorry, this command is disabled, the Python's site module could not be "
+"loaded."
+msgstr ""
+"E887: ใ“ใฎใ‚ณใƒžใƒณใƒ‰ใฏ็„กๅŠนใงใ™ใ€ใ”ใ‚ใ‚“ใชใ•ใ„. Python ใฎ site ใƒขใ‚ธใƒฅใƒผใƒซใ‚’ใƒญใƒผใƒ‰"
+"ใงใใพใ›ใ‚“ใงใ—ใŸ."
+
+# Added at 07-Feb-2004.
+msgid "E659: Cannot invoke Python recursively"
+msgstr "E659: Python ใ‚’ๅ†ๅธฐ็š„ใซๅฎŸ่กŒใ™ใ‚‹ใ“ใจใฏใงใใพใ›ใ‚“"
+
+msgid "E837: This Vim cannot execute :py3 after using :python"
+msgstr "E837: ใ“ใฎVimใงใฏ :python ใ‚’ไฝฟใฃใŸๅพŒใซ :py3 ใ‚’ไฝฟใˆใพใ›ใ‚“"
+
+msgid "E265: $_ must be an instance of String"
+msgstr "E265: $_ ใฏๆ–‡ๅญ—ๅˆ—ใฎใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใงใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“"
+
+msgid ""
+"E266: Sorry, this command is disabled, the Ruby library could not be loaded."
+msgstr ""
+"E266: ใ“ใฎใ‚ณใƒžใƒณใƒ‰ใฏ็„กๅŠนใงใ™ใ€ใ”ใ‚ใ‚“ใชใ•ใ„: Rubyใƒฉใ‚คใƒ–ใƒฉใƒชใ‚’ใƒญใƒผใƒ‰ใงใใพใ›ใ‚“"
+"ใงใ—ใŸ."
+
+msgid "E267: unexpected return"
+msgstr "E267: ไบˆๆœŸใ›ใฌ return ใงใ™"
+
+msgid "E268: unexpected next"
+msgstr "E268: ไบˆๆœŸใ›ใฌ next ใงใ™"
+
+msgid "E269: unexpected break"
+msgstr "E269: ไบˆๆœŸใ›ใฌ break ใงใ™"
+
+msgid "E270: unexpected redo"
+msgstr "E270: ไบˆๆœŸใ›ใฌ redo ใงใ™"
+
+msgid "E271: retry outside of rescue clause"
+msgstr "E271: rescue ใฎๅค–ใฎ retry ใงใ™"
+
+msgid "E272: unhandled exception"
+msgstr "E272: ๅ–ใ‚Šๆ‰ฑใ‚ใ‚Œใชใ‹ใฃใŸไพ‹ๅค–ใŒใ‚ใ‚Šใพใ™"
+
+#, c-format
+msgid "E273: unknown longjmp status %d"
+msgstr "E273: ๆœช็Ÿฅใฎlongjmp็Šถๆ…‹: %d"
+
+msgid "invalid buffer number"
+msgstr "็„กๅŠนใชใƒใƒƒใƒ•ใ‚ก็•ชๅทใงใ™"
+
+msgid "not implemented yet"
+msgstr "ใพใ ๅฎŸ่ฃ…ใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
+
+msgid "cannot set line(s)"
+msgstr "่กŒใ‚’่จญๅฎšใงใใพใ›ใ‚“"
+
+msgid "invalid mark name"
+msgstr "็„กๅŠนใชใƒžใƒผใ‚ฏๅใงใ™"
+
+msgid "mark not set"
+msgstr "ใƒžใƒผใ‚ฏใฏ่จญๅฎšใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
+
+#, c-format
+msgid "row %d column %d"
+msgstr "่กŒ %d ๅˆ— %d"
+
+msgid "cannot insert/append line"
+msgstr "่กŒใฎๆŒฟๅ…ฅ/่ฟฝๅŠ ใ‚’ใงใใพใ›ใ‚“"
+
+msgid "line number out of range"
+msgstr "็ฏ„ๅ›ฒๅค–ใฎ่กŒ็•ชๅทใงใ™"
+
+msgid "unknown flag: "
+msgstr "ๆœช็Ÿฅใฎใƒ•ใƒฉใ‚ฐ: "
+
+msgid "unknown vimOption"
+msgstr "ๆœช็Ÿฅใฎ vimOption ใงใ™"
+
+msgid "keyboard interrupt"
+msgstr "ใ‚ญใƒผใƒœใƒผใƒ‰ๅ‰ฒ่พผใฟ"
+
+msgid "vim error"
+msgstr "vim ใ‚จใƒฉใƒผ"
+
+msgid "cannot create buffer/window command: object is being deleted"
+msgstr ""
+"ใƒใƒƒใƒ•ใ‚ก/ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆไฝœๆˆใ‚ณใƒžใƒณใƒ‰ใ‚’ไฝœๆˆใงใใพใ›ใ‚“: ใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใŒๆถˆๅŽปใ•ใ‚Œใฆใ„ใพ"
+"ใ—ใŸ"
+
+msgid ""
+"cannot register callback command: buffer/window is already being deleted"
+msgstr ""
+"ใ‚ณใƒผใƒซใƒใƒƒใ‚ฏใ‚ณใƒžใƒณใƒ‰ใ‚’็™ป้Œฒใงใใพใ›ใ‚“: ใƒใƒƒใƒ•ใ‚ก/ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใŒๆ—ขใซๆถˆๅŽปใ•ใ‚Œใพใ—ใŸ"
+
+msgid ""
+"E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-dev@vim."
+"org"
+msgstr ""
+"E280: TCL ่‡ดๅ‘ฝ็š„ใ‚จใƒฉใƒผ: reflist ๆฑšๆŸ“!? vim-dev@vim.org ใซๅ ฑๅ‘Šใ—ใฆใใ ใ•ใ„"
+
+msgid "cannot register callback command: buffer/window reference not found"
+msgstr ""
+"ใ‚ณใƒผใƒซใƒใƒƒใ‚ฏใ‚ณใƒžใƒณใƒ‰ใ‚’็™ป้Œฒใงใใพใ›ใ‚“: ใƒใƒƒใƒ•ใ‚ก/ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฎๅ‚็…งใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›"
+"ใ‚“"
+
+msgid ""
+"E571: Sorry, this command is disabled: the Tcl library could not be loaded."
+msgstr ""
+"E571: ใ“ใฎใ‚ณใƒžใƒณใƒ‰ใฏ็„กๅŠนใงใ™ใ€ใ”ใ‚ใ‚“ใชใ•ใ„: Tclใƒฉใ‚คใƒ–ใƒฉใƒชใ‚’ใƒญใƒผใƒ‰ใงใใพใ›ใ‚“ใง"
+"ใ—ใŸ."
+
+#, c-format
+msgid "E572: exit code %d"
+msgstr "E572: ็ต‚ไบ†ใ‚ณใƒผใƒ‰ %d"
+
+msgid "cannot get line"
+msgstr "่กŒใ‚’ๅ–ๅพ—ใงใใพใ›ใ‚“"
+
+msgid "Unable to register a command server name"
+msgstr "ๅ‘ฝไปคใ‚ตใƒผใƒใƒผใฎๅๅ‰ใ‚’็™ป้Œฒใงใใพใ›ใ‚“"
+
+msgid "E248: Failed to send command to the destination program"
+msgstr "E248: ็›ฎ็š„ใฎใƒ—ใƒญใ‚ฐใƒฉใƒ ใธใฎใ‚ณใƒžใƒณใƒ‰้€ไฟกใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+
+#, c-format
+msgid "E573: Invalid server id used: %s"
+msgstr "E573: ็„กๅŠนใชใ‚ตใƒผใƒใƒผIDใŒไฝฟใ‚ใ‚Œใพใ—ใŸ: %s"
+
+msgid "E251: VIM instance registry property is badly formed. Deleted!"
+msgstr "E251: VIM ๅฎŸไฝ“ใฎ็™ป้Œฒใƒ—ใƒญใƒ‘ใƒ†ใ‚ฃใŒไธๆญฃใงใ™. ๆถˆๅŽปใ—ใพใ—ใŸ!"
+
+#, c-format
+msgid "E938: Duplicate key in JSON: \"%s\""
+msgstr "E938: JSONใซ้‡่ค‡ใ‚ญใƒผใŒใ‚ใ‚Šใพใ™: \"%s\""
+
+#, c-format
+msgid "E696: Missing comma in List: %s"
+msgstr "E696: ใƒชใ‚นใƒˆๅž‹ใซใ‚ซใƒณใƒžใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
+
+#, c-format
+msgid "E697: Missing end of List ']': %s"
+msgstr "E697: ใƒชใ‚นใƒˆๅž‹ใฎๆœ€ๅพŒใซ ']' ใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
+
msgid "Unknown option argument"
msgstr "ๆœช็Ÿฅใฎใ‚ชใƒ—ใ‚ทใƒงใƒณๅผ•ๆ•ฐใงใ™"
-#: ../main.c:146
msgid "Too many edit arguments"
msgstr "็ทจ้›†ๅผ•ๆ•ฐใŒๅคš้ŽใŽใพใ™"
-#: ../main.c:148
msgid "Argument missing after"
msgstr "ๅผ•ๆ•ฐใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../main.c:150
msgid "Garbage after option argument"
msgstr "ใ‚ชใƒ—ใ‚ทใƒงใƒณๅผ•ๆ•ฐใฎๅพŒใซใ‚ดใƒŸใŒใ‚ใ‚Šใพใ™"
-#: ../main.c:152
msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"
msgstr "\"+command\", \"-c command\", \"--cmd command\" ใฎๅผ•ๆ•ฐใŒๅคš้ŽใŽใพใ™"
-#: ../main.c:154
msgid "Invalid argument for"
msgstr "็„กๅŠนใชๅผ•ๆ•ฐใงใ™: "
-#: ../main.c:294
#, c-format
msgid "%d files to edit\n"
msgstr "%d ๅ€‹ใฎใƒ•ใ‚กใ‚คใƒซใŒ็ทจ้›†ใ‚’ๆŽงใˆใฆใ„ใพใ™\n"
-#: ../main.c:1342
+msgid "netbeans is not supported with this GUI\n"
+msgstr "netbeans ใฏใ“ใฎGUIใงใฏๅˆฉ็”จใงใใพใ›ใ‚“\n"
+
+msgid "'-nb' cannot be used: not enabled at compile time\n"
+msgstr "'-nb' ไฝฟ็”จไธๅฏ่ƒฝใงใ™: ใ‚ณใƒณใƒ‘ใ‚คใƒซๆ™‚ใซ็„กๅŠนใซใ•ใ‚Œใฆใ„ใพใ™\n"
+
+msgid "This Vim was not compiled with the diff feature."
+msgstr "ใ“ใฎVimใซใฏdiffๆฉŸ่ƒฝใŒใ‚ใ‚Šใพใ›ใ‚“(ใ‚ณใƒณใƒ‘ใ‚คใƒซๆ™‚่จญๅฎš)."
+
msgid "Attempt to open script file again: \""
-msgstr "ใ‚นใ‚ฏใƒชใƒ—ใƒˆใƒ•ใ‚กใ‚คใƒซใ‚’ๅ†ใณ้–‹ใ„ใฆใฟใพใ™: \""
+msgstr "ใ‚นใ‚ฏใƒชใƒ—ใƒˆใƒ•ใ‚กใ‚คใƒซใ‚’ๅ†ใณ้–‹ใ“ใ†ใจใ—ใพใ—ใŸ: \""
-#: ../main.c:1350
msgid "Cannot open for reading: \""
msgstr "่ชญ่พผ็”จใจใ—ใฆ้–‹ใ‘ใพใ›ใ‚“"
-#: ../main.c:1393
msgid "Cannot open for script output: \""
msgstr "ใ‚นใ‚ฏใƒชใƒ—ใƒˆๅ‡บๅŠ›็”จใ‚’้–‹ใ‘ใพใ›ใ‚“"
-#: ../main.c:1622
+msgid "Vim: Error: Failure to start gvim from NetBeans\n"
+msgstr "Vim: ใ‚จใƒฉใƒผ: NetBeansใ‹ใ‚‰gvimใ‚’ใ‚นใ‚ฟใƒผใƒˆใงใใพใ›ใ‚“\n"
+
+msgid "Vim: Error: This version of Vim does not run in a Cygwin terminal\n"
+msgstr "Vim: ใ‚จใƒฉใƒผ: ใ“ใฎใƒใƒผใ‚ธใƒงใƒณใฎVimใฏCygwin็ซฏๆœซใงใฏๅ‹•ไฝœใ—ใพใ›ใ‚“\n"
+
msgid "Vim: Warning: Output is not to a terminal\n"
msgstr "Vim: ่ญฆๅ‘Š: ็ซฏๆœซใธใฎๅ‡บๅŠ›ใงใฏใ‚ใ‚Šใพใ›ใ‚“\n"
-#: ../main.c:1624
msgid "Vim: Warning: Input is not from a terminal\n"
msgstr "Vim: ่ญฆๅ‘Š: ็ซฏๆœซใ‹ใ‚‰ใฎๅ…ฅๅŠ›ใงใฏใ‚ใ‚Šใพใ›ใ‚“\n"
-#. just in case..
-#: ../main.c:1891
msgid "pre-vimrc command line"
msgstr "vimrcๅ‰ใฎใ‚ณใƒžใƒณใƒ‰ใƒฉใ‚คใƒณ"
-#: ../main.c:1964
#, c-format
msgid "E282: Cannot read from \"%s\""
msgstr "E282: \"%s\"ใ‹ใ‚‰่ชญ่พผใ‚€ใ“ใจใŒใงใใพใ›ใ‚“"
-#: ../main.c:2149
msgid ""
"\n"
"More info with: \"vim -h\"\n"
@@ -3367,37 +2941,30 @@ msgstr ""
"\n"
"ใ‚ˆใ‚Š่ฉณ็ดฐใชๆƒ…ๅ ฑใฏ: \"vim -h\"\n"
-#: ../main.c:2178
msgid "[file ..] edit specified file(s)"
msgstr "[ใƒ•ใ‚กใ‚คใƒซ..] ใ‚ใ‚‹ใƒ•ใ‚กใ‚คใƒซใ‚’็ทจ้›†ใ™ใ‚‹"
-#: ../main.c:2179
msgid "- read text from stdin"
msgstr "- ๆจ™ๆบ–ๅ…ฅๅŠ›ใ‹ใ‚‰ใƒ†ใ‚ญใ‚นใƒˆใ‚’่ชญ่พผใ‚€"
-#: ../main.c:2180
msgid "-t tag edit file where tag is defined"
msgstr "-t ใ‚ฟใ‚ฐ ใ‚ฟใ‚ฐใŒๅฎš็พฉใ•ใ‚ŒใŸใจใ“ใ‚ใ‹ใ‚‰็ทจ้›†ใ™ใ‚‹"
-#: ../main.c:2181
msgid "-q [errorfile] edit file with first error"
msgstr "-q [errorfile] ๆœ€ๅˆใฎใ‚จใƒฉใƒผใง็ทจ้›†ใ™ใ‚‹"
-#: ../main.c:2187
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
"ไฝฟ็”จๆณ•:"
-#: ../main.c:2189
msgid " vim [arguments] "
msgstr " vim [ๅผ•ๆ•ฐ] "
-#: ../main.c:2193
msgid ""
"\n"
" or:"
@@ -3405,7 +2972,13 @@ msgstr ""
"\n"
" ใ‚‚ใ—ใใฏ:"
-#: ../main.c:2196
+msgid ""
+"\n"
+"Where case is ignored prepend / to make flag upper case"
+msgstr ""
+"\n"
+"ๅคงๅฐๆ–‡ๅญ—ใŒ็„ก่ฆ–ใ•ใ‚Œใ‚‹ๅ ดๅˆใฏๅคงๆ–‡ๅญ—ใซใ™ใ‚‹ใŸใ‚ใซ / ใ‚’ๅ‰็ฝฎใ—ใฆใใ ใ•ใ„"
+
msgid ""
"\n"
"\n"
@@ -3415,189 +2988,322 @@ msgstr ""
"\n"
"ๅผ•ๆ•ฐ:\n"
-#: ../main.c:2197
msgid "--\t\t\tOnly file names after this"
msgstr "--\t\t\tใ“ใฎใ‚ใจใซใฏใƒ•ใ‚กใ‚คใƒซๅใ ใ‘"
-#: ../main.c:2199
msgid "--literal\t\tDon't expand wildcards"
msgstr "--literal\t\tใƒฏใ‚คใƒซใƒ‰ใ‚ซใƒผใƒ‰ใ‚’ๅฑ•้–‹ใ—ใชใ„"
-#: ../main.c:2201
+msgid "-register\t\tRegister this gvim for OLE"
+msgstr "-register\t\tใ“ใฎgvimใ‚’OLEใจใ—ใฆ็™ป้Œฒใ™ใ‚‹"
+
+msgid "-unregister\t\tUnregister gvim for OLE"
+msgstr "-unregister\t\tgvimใฎOLE็™ป้Œฒใ‚’่งฃ้™คใ™ใ‚‹"
+
+msgid "-g\t\t\tRun using GUI (like \"gvim\")"
+msgstr "-g\t\t\tGUIใง่ตทๅ‹•ใ™ใ‚‹ (\"gvim\" ใจๅŒใ˜)"
+
+msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
+msgstr "-f or --nofork\tใƒ•ใ‚ฉใ‚ขใ‚ฐใƒฉใ‚ฆใƒณใƒ‰: GUIใ‚’ๅง‹ใ‚ใ‚‹ใจใใซforkใ—ใชใ„"
+
msgid "-v\t\t\tVi mode (like \"vi\")"
msgstr "-v\t\t\tViใƒขใƒผใƒ‰ (\"vi\" ใจๅŒใ˜)"
-#: ../main.c:2202
msgid "-e\t\t\tEx mode (like \"ex\")"
msgstr "-e\t\t\tExใƒขใƒผใƒ‰ (\"ex\" ใจๅŒใ˜)"
-#: ../main.c:2203
msgid "-E\t\t\tImproved Ex mode"
msgstr "-E\t\t\tๆ”น่‰ฏExใƒขใƒผใƒ‰"
-#: ../main.c:2204
msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")"
msgstr "-s\t\t\tใ‚ตใ‚คใƒฌใƒณใƒˆ(ใƒใƒƒใƒ)ใƒขใƒผใƒ‰ (\"ex\" ๅฐ‚็”จ)"
-#: ../main.c:2205
msgid "-d\t\t\tDiff mode (like \"vimdiff\")"
msgstr "-d\t\t\tๅทฎๅˆ†ใƒขใƒผใƒ‰ (\"vidiff\" ใจๅŒใ˜)"
-#: ../main.c:2206
msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
-msgstr "-y\t\t\tใ‚คใƒผใ‚ธใƒผใƒขใƒผใƒ‰ (\"evim\" ใจๅŒใ˜, ใƒขใƒผใƒ‰็„ก)"
+msgstr "-y\t\t\tใ‚คใƒผใ‚ธใƒผใƒขใƒผใƒ‰ (\"evim\" ใจๅŒใ˜ใ€ใƒขใƒผใƒ‰็„ก)"
-#: ../main.c:2207
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\t่ชญ่พผๅฐ‚็”จใƒขใƒผใƒ‰ (\"view\" ใจๅŒใ˜)"
-#: ../main.c:2208
msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
msgstr "-Z\t\t\tๅˆถ้™ใƒขใƒผใƒ‰ (\"rvim\" ใจๅŒใ˜)"
-#: ../main.c:2209
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tๅค‰ๆ›ด (ใƒ•ใ‚กใ‚คใƒซไฟๅญ˜ๆ™‚) ใ‚’ใงใใชใ„ใ‚ˆใ†ใซใ™ใ‚‹"
-#: ../main.c:2210
msgid "-M\t\t\tModifications in text not allowed"
msgstr "-M\t\t\tใƒ†ใ‚ญใ‚นใƒˆใฎ็ทจ้›†ใ‚’่กŒใชใˆใชใ„ใ‚ˆใ†ใซใ™ใ‚‹"
-#: ../main.c:2211
msgid "-b\t\t\tBinary mode"
msgstr "-b\t\t\tใƒใ‚คใƒŠใƒชใƒขใƒผใƒ‰"
-#: ../main.c:2212
msgid "-l\t\t\tLisp mode"
msgstr "-l\t\t\tLispใƒขใƒผใƒ‰"
-#: ../main.c:2213
msgid "-C\t\t\tCompatible with Vi: 'compatible'"
msgstr "-C\t\t\tViไบ’ๆ›ใƒขใƒผใƒ‰: 'compatible'"
-#: ../main.c:2214
msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'"
msgstr "-N\t\t\tVi้žไบ’ๆ›ใƒขใƒผใƒ‰: 'nocompatible"
-#: ../main.c:2215
msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]"
msgstr "-V[N][fname]\t\tใƒญใ‚ฐๅ‡บๅŠ›่จญๅฎš [ใƒฌใƒ™ใƒซ N] [ใƒญใ‚ฐใƒ•ใ‚กใ‚คใƒซๅ fname]"
-#: ../main.c:2216
msgid "-D\t\t\tDebugging mode"
msgstr "-D\t\t\tใƒ‡ใƒใƒƒใ‚ฐใƒขใƒผใƒ‰"
-#: ../main.c:2217
msgid "-n\t\t\tNo swap file, use memory only"
msgstr "-n\t\t\tใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใ‚’ไฝฟ็”จใ›ใšใƒกใƒขใƒชใ ใ‘"
-#: ../main.c:2218
msgid "-r\t\t\tList swap files and exit"
msgstr "-r\t\t\tใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใ‚’ๅˆ—ๆŒ™ใ—็ต‚ไบ†"
-#: ../main.c:2219
msgid "-r (with file name)\tRecover crashed session"
msgstr "-r (ใƒ•ใ‚กใ‚คใƒซๅ)\tใ‚ฏใƒฉใƒƒใ‚ทใƒฅใ—ใŸใ‚ปใƒƒใ‚ทใƒงใƒณใ‚’ๅพฉๅธฐ"
-#: ../main.c:2220
msgid "-L\t\t\tSame as -r"
msgstr "-L\t\t\t-rใจๅŒใ˜"
-#: ../main.c:2221
-msgid "-A\t\t\tstart in Arabic mode"
+msgid "-f\t\t\tDon't use newcli to open window"
+msgstr "-f\t\t\tใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚’้–‹ใใฎใซ newcli ใ‚’ไฝฟ็”จใ—ใชใ„"
+
+msgid "-dev <device>\t\tUse <device> for I/O"
+msgstr "-dev <device>\t\tI/Oใซ <device> ใ‚’ไฝฟ็”จใ™ใ‚‹"
+
+msgid "-A\t\t\tStart in Arabic mode"
msgstr "-A\t\t\tใ‚ขใƒฉใƒ“ใ‚ข่ชžใƒขใƒผใƒ‰ใง่ตทๅ‹•ใ™ใ‚‹"
-#: ../main.c:2222
msgid "-H\t\t\tStart in Hebrew mode"
msgstr "-H\t\t\tใƒ˜ใƒ–ใƒฉใ‚ค่ชžใƒขใƒผใƒ‰ใง่ตทๅ‹•ใ™ใ‚‹"
-#: ../main.c:2223
msgid "-F\t\t\tStart in Farsi mode"
msgstr "-F\t\t\tใƒšใƒซใ‚ทใ‚ข่ชžใƒขใƒผใƒ‰ใง่ตทๅ‹•ใ™ใ‚‹"
-#: ../main.c:2224
msgid "-T <terminal>\tSet terminal type to <terminal>"
msgstr "-T <terminal>\t็ซฏๆœซใ‚’ <terminal> ใซ่จญๅฎšใ™ใ‚‹"
-#: ../main.c:2225
+msgid "--not-a-term\t\tSkip warning for input/output not being a terminal"
+msgstr "--not-a-term\t\tๅ…ฅๅ‡บๅŠ›ใŒ็ซฏๆœซใงใชใ„ใจใฎ่ญฆๅ‘Šใ‚’ใ‚นใ‚ญใƒƒใƒ—ใ™ใ‚‹"
+
+msgid "--ttyfail\t\tExit if input or output is not a terminal"
+msgstr "--ttyfail\t\tๅ…ฅๅ‡บๅŠ›ใŒ็ซฏๆœซใงใชใ‘ใ‚Œใฐ็ต‚ไบ†ใ™ใ‚‹"
+
msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc"
msgstr "-u <vimrc>\t\t.vimrcใฎไปฃใ‚ใ‚Šใซ <vimrc> ใ‚’ไฝฟใ†"
-#: ../main.c:2226
+msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
+msgstr "-U <gvimrc>\t\t.gvimrcใฎไปฃใ‚ใ‚Šใซ <gvimrc> ใ‚’ไฝฟใ†"
+
msgid "--noplugin\t\tDon't load plugin scripts"
msgstr "--noplugin\t\tใƒ—ใƒฉใ‚ฐใ‚คใƒณใ‚นใ‚ฏใƒชใƒ—ใƒˆใ‚’ใƒญใƒผใƒ‰ใ—ใชใ„"
-#: ../main.c:2227
msgid "-p[N]\t\tOpen N tab pages (default: one for each file)"
msgstr "-p[N]\t\tN ๅ€‹ใ‚ฟใƒ–ใƒšใƒผใ‚ธใ‚’้–‹ใ(็œ็•ฅๅ€ค: ใƒ•ใ‚กใ‚คใƒซใซใคใ1ๅ€‹)"
-#: ../main.c:2228
msgid "-o[N]\t\tOpen N windows (default: one for each file)"
msgstr "-o[N]\t\tN ๅ€‹ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚’้–‹ใ(็œ็•ฅๅ€ค: ใƒ•ใ‚กใ‚คใƒซใซใคใ1ๅ€‹)"
-#: ../main.c:2229
msgid "-O[N]\t\tLike -o but split vertically"
msgstr "-O[N]\t\t-oใจๅŒใ˜ใ ใŒๅž‚็›ดๅˆ†ๅ‰ฒ"
-#: ../main.c:2230
msgid "+\t\t\tStart at end of file"
msgstr "+\t\t\tใƒ•ใ‚กใ‚คใƒซใฎๆœ€ๅพŒใ‹ใ‚‰ใฏใ˜ใ‚ใ‚‹"
-#: ../main.c:2231
msgid "+<lnum>\t\tStart at line <lnum>"
msgstr "+<lnum>\t\t<lnum> ่กŒใ‹ใ‚‰ใฏใ˜ใ‚ใ‚‹"
-#: ../main.c:2232
msgid "--cmd <command>\tExecute <command> before loading any vimrc file"
msgstr "--cmd <command>\tvimrcใ‚’ใƒญใƒผใƒ‰ใ™ใ‚‹ๅ‰ใซ <command> ใ‚’ๅฎŸ่กŒใ™ใ‚‹"
-#: ../main.c:2233
msgid "-c <command>\t\tExecute <command> after loading the first file"
msgstr "-c <command>\t\tๆœ€ๅˆใฎใƒ•ใ‚กใ‚คใƒซใ‚’ใƒญใƒผใƒ‰ๅพŒ <command> ใ‚’ๅฎŸ่กŒใ™ใ‚‹"
-#: ../main.c:2235
msgid "-S <session>\t\tSource file <session> after loading the first file"
msgstr "-S <session>\t\tๆœ€ๅˆใฎใƒ•ใ‚กใ‚คใƒซใ‚’ใƒญใƒผใƒ‰ๅพŒใƒ•ใ‚กใ‚คใƒซ <session> ใ‚’ๅ–่พผใ‚€"
-#: ../main.c:2236
msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>"
msgstr "-s <scriptin>\tใƒ•ใ‚กใ‚คใƒซ <scriptin> ใ‹ใ‚‰ใƒŽใƒผใƒžใƒซใ‚ณใƒžใƒณใƒ‰ใ‚’่ชญ่พผใ‚€"
-#: ../main.c:2237
msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>"
msgstr "-w <scriptout>\tๅ…ฅๅŠ›ใ—ใŸๅ…จใ‚ณใƒžใƒณใƒ‰ใ‚’ใƒ•ใ‚กใ‚คใƒซ <scriptout> ใซ่ฟฝๅŠ ใ™ใ‚‹"
-#: ../main.c:2238
msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>"
msgstr "-W <scriptout>\tๅ…ฅๅŠ›ใ—ใŸๅ…จใ‚ณใƒžใƒณใƒ‰ใ‚’ใƒ•ใ‚กใ‚คใƒซ <scriptout> ใซไฟๅญ˜ใ™ใ‚‹"
-#: ../main.c:2240
+msgid "-x\t\t\tEdit encrypted files"
+msgstr "-x\t\t\tๆš—ๅทๅŒ–ใ•ใ‚ŒใŸใƒ•ใ‚กใ‚คใƒซใ‚’็ทจ้›†ใ™ใ‚‹"
+
+msgid "-display <display>\tConnect vim to this particular X-server"
+msgstr "-display <display>\tvimใ‚’ๆŒ‡ๅฎšใ—ใŸ X ใ‚ตใƒผใƒใƒผใซๆŽฅ็ถšใ™ใ‚‹"
+
+msgid "-X\t\t\tDo not connect to X server"
+msgstr "-X\t\t\tXใ‚ตใƒผใƒใƒผใซๆŽฅ็ถšใ—ใชใ„"
+
+msgid "--remote <files>\tEdit <files> in a Vim server if possible"
+msgstr "--remote <files>\tๅฏ่ƒฝใชใ‚‰ใฐVimใ‚ตใƒผใƒใƒผใง <files> ใ‚’็ทจ้›†ใ™ใ‚‹"
+
+msgid "--remote-silent <files> Same, don't complain if there is no server"
+msgstr "--remote-silent <files> ๅŒไธŠใ€ใ‚ตใƒผใƒใƒผใŒ็„กใใฆใ‚‚่ญฆๅ‘Šๆ–‡ใ‚’ๅ‡บๅŠ›ใ—ใชใ„"
+
+msgid ""
+"--remote-wait <files> As --remote but wait for files to have been edited"
+msgstr "--remote-wait <files>\t--remoteๅพŒ ใƒ•ใ‚กใ‚คใƒซใฎ็ทจ้›†ใŒ็ต‚ใ‚ใ‚‹ใฎใ‚’ๅพ…ใค"
+
+msgid ""
+"--remote-wait-silent <files> Same, don't complain if there is no server"
+msgstr ""
+"--remote-wait-silent <files> ๅŒไธŠใ€ใ‚ตใƒผใƒใƒผใŒ็„กใใฆใ‚‚่ญฆๅ‘Šๆ–‡ใ‚’ๅ‡บๅŠ›ใ—ใชใ„"
+
+msgid ""
+"--remote-tab[-wait][-silent] <files> As --remote but use tab page per file"
+msgstr ""
+"--remote-tab[-wait][-silent] <files> --remoteใงใƒ•ใ‚กใ‚คใƒซ1ใคใซใคใ1ใคใฎใ‚ฟใƒ–"
+"ใƒšใƒผใ‚ธใ‚’้–‹ใ"
+
+msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
+msgstr "--remote-send <keys>\tVimใ‚ตใƒผใƒใƒผใซ <keys> ใ‚’้€ไฟกใ—ใฆ็ต‚ไบ†ใ™ใ‚‹"
+
+msgid "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
+msgstr "--remote-expr <expr>\tใ‚ตใƒผใƒใƒผใง <expr> ใ‚’ๅฎŸ่กŒใ—ใฆ็ตๆžœใ‚’่กจ็คบใ™ใ‚‹"
+
+msgid "--serverlist\t\tList available Vim server names and exit"
+msgstr "--serverlist\t\tVimใ‚ตใƒผใƒใƒผๅใฎไธ€่ฆงใ‚’่กจ็คบใ—ใฆ็ต‚ไบ†ใ™ใ‚‹"
+
+msgid "--servername <name>\tSend to/become the Vim server <name>"
+msgstr "--servername <name>\tVimใ‚ตใƒผใƒใƒผ <name> ใซ้€ไฟก/ๅๅ‰่จญๅฎšใ™ใ‚‹"
+
msgid "--startuptime <file>\tWrite startup timing messages to <file>"
msgstr "--startuptime <file>\t่ตทๅ‹•ใซใ‹ใ‹ใฃใŸๆ™‚้–“ใฎ่ฉณ็ดฐใ‚’ <file> ใธๅ‡บๅŠ›ใ™ใ‚‹"
-#: ../main.c:2242
msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
msgstr "-i <viminfo>\t\t.viminfoใฎไปฃใ‚ใ‚Šใซ <viminfo> ใ‚’ไฝฟใ†"
-#: ../main.c:2243
+msgid "--clean\t\t'nocompatible', Vim defaults, no plugins, no viminfo"
+msgstr "--clean\t\t'nocompatible'ใ€Vimใฎๆ—ขๅฎšใ€ใƒ—ใƒฉใ‚ฐใ‚คใƒณใชใ—ใ€viminfoใชใ—"
+
msgid "-h or --help\tPrint Help (this message) and exit"
-msgstr "-h or --help\tใƒ˜ใƒซใƒ—(ใ“ใฎใƒกใƒƒใ‚ปใƒผใ‚ธ)ใ‚’่กจ็คบใ—็ต‚ไบ†ใ™ใ‚‹"
+msgstr "-h or --help\tใƒ˜ใƒซใƒ—(ใ“ใฎใƒกใƒƒใ‚ปใƒผใ‚ธ)ใ‚’่กจ็คบใ—็ต‚ไบ†ใ™ใ‚‹"
-#: ../main.c:2244
msgid "--version\t\tPrint version information and exit"
msgstr "--version\t\tใƒใƒผใ‚ธใƒงใƒณๆƒ…ๅ ฑใ‚’่กจ็คบใ—็ต‚ไบ†ใ™ใ‚‹"
-#: ../mark.c:676
+msgid ""
+"\n"
+"Arguments recognised by gvim (Motif version):\n"
+msgstr ""
+"\n"
+"gvimใซใ‚ˆใฃใฆ่งฃ้‡ˆใ•ใ‚Œใ‚‹ๅผ•ๆ•ฐ(Motifใƒใƒผใ‚ธใƒงใƒณ):\n"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (neXtaw version):\n"
+msgstr ""
+"\n"
+"gvimใซใ‚ˆใฃใฆ่งฃ้‡ˆใ•ใ‚Œใ‚‹ๅผ•ๆ•ฐ(neXtawใƒใƒผใ‚ธใƒงใƒณ):\n"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (Athena version):\n"
+msgstr ""
+"\n"
+"gvimใซใ‚ˆใฃใฆ่งฃ้‡ˆใ•ใ‚Œใ‚‹ๅผ•ๆ•ฐ(Athenaใƒใƒผใ‚ธใƒงใƒณ):\n"
+
+msgid "-display <display>\tRun vim on <display>"
+msgstr "-display <display>\t<display> ใงvimใ‚’ๅฎŸ่กŒใ™ใ‚‹"
+
+msgid "-iconic\t\tStart vim iconified"
+msgstr "-iconic\t\tๆœ€ๅฐๅŒ–ใ—ใŸ็Šถๆ…‹ใงvimใ‚’่ตทๅ‹•ใ™ใ‚‹"
+
+msgid "-background <color>\tUse <color> for the background (also: -bg)"
+msgstr "-background <color>\t่ƒŒๆ™ฏ่‰ฒใซ <color> ใ‚’ไฝฟใ†(ๅŒ็พฉ: -bg)"
+
+msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
+msgstr "-foreground <color>\tๅ‰ๆ™ฏ่‰ฒใซ <color> ใ‚’ไฝฟใ†(ๅŒ็พฉ: -fg)"
+
+msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
+msgstr "-font <font>\t\tใƒ†ใ‚ญใ‚นใƒˆ่กจ็คบใซ <font> ใ‚’ไฝฟใ†(ๅŒ็พฉ: -fn)"
+
+msgid "-boldfont <font>\tUse <font> for bold text"
+msgstr "-boldfont <font>\tๅคชๅญ—ใซ <font> ใ‚’ไฝฟใ†"
+
+msgid "-italicfont <font>\tUse <font> for italic text"
+msgstr "-italicfont <for>\tๆ–œไฝ“ๅญ—ใซ <font> ใ‚’ไฝฟใ†"
+
+msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
+msgstr "-geometry <geom>\tๅˆๆœŸ้…็ฝฎใซ <geom> ใ‚’ไฝฟใ†(ๅŒ็พฉ: -geom)"
+
+msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
+msgstr "-borderwidth <width>\tๅขƒ็•Œใฎๅน…ใ‚’ <width> ใซใ™ใ‚‹(ๅŒ็พฉ: -bw)"
+
+msgid "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
+msgstr ""
+"-scrollbarwidth <width> ใ‚นใ‚ฏใƒญใƒผใƒซใƒใƒผใฎๅน…ใ‚’ <width> ใซใ™ใ‚‹(ๅŒ็พฉ: -sw)"
+
+msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
+msgstr "-menuheight <height>\tใƒกใƒ‹ใƒฅใƒผใƒใƒผใฎ้ซ˜ใ•ใ‚’ <height> ใซใ™ใ‚‹(ๅŒ็พฉ: -mh)"
+
+msgid "-reverse\t\tUse reverse video (also: -rv)"
+msgstr "-reverse\t\tๅ่ปขๆ˜ ๅƒใ‚’ไฝฟ็”จใ™ใ‚‹(ๅŒ็พฉ: -rv)"
+
+msgid "+reverse\t\tDon't use reverse video (also: +rv)"
+msgstr "+reverse\t\tๅ่ปขๆ˜ ๅƒใ‚’ไฝฟ็”จใ—ใชใ„(ๅŒ็พฉ: +rv)"
+
+msgid "-xrm <resource>\tSet the specified resource"
+msgstr "-xrm <resource>\t็‰นๅฎšใฎใƒชใ‚ฝใƒผใ‚นใ‚’ไฝฟ็”จใ™ใ‚‹"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (GTK+ version):\n"
+msgstr ""
+"\n"
+"gvimใซใ‚ˆใฃใฆ่งฃ้‡ˆใ•ใ‚Œใ‚‹ๅผ•ๆ•ฐ(GTK+ใƒใƒผใ‚ธใƒงใƒณ):\n"
+
+msgid "-display <display>\tRun vim on <display> (also: --display)"
+msgstr "-display <display>\t<display> ใงvimใ‚’ๅฎŸ่กŒใ™ใ‚‹(ๅŒ็พฉ: --display)"
+
+msgid "--role <role>\tSet a unique role to identify the main window"
+msgstr "--role <role>\tใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚’่ญ˜ๅˆฅใ™ใ‚‹ไธ€ๆ„ใชๅฝนๅ‰ฒ(role)ใ‚’่จญๅฎšใ™ใ‚‹"
+
+msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
+msgstr "--socketid <xid>\t็•ฐใชใ‚‹GTK widgetใงVimใ‚’้–‹ใ"
+
+msgid "--echo-wid\t\tMake gvim echo the Window ID on stdout"
+msgstr "--echo-wid\t\tใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆIDใ‚’ๆจ™ๆบ–ๅ‡บๅŠ›ใซๅ‡บๅŠ›ใ™ใ‚‹"
+
+msgid "-P <parent title>\tOpen Vim inside parent application"
+msgstr "-P <่ฆชใฎใ‚ฟใ‚คใƒˆใƒซ>\tVimใ‚’่ฆชใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใฎไธญใง่ตทๅ‹•ใ™ใ‚‹"
+
+msgid "--windowid <HWND>\tOpen Vim inside another win32 widget"
+msgstr "--windowid <HWND>\t็•ฐใชใ‚‹Win32 widgetใฎๅ†…้ƒจใซVimใ‚’้–‹ใ"
+
+msgid "No display"
+msgstr "ใƒ‡ใ‚ฃใ‚นใƒ—ใƒฌใ‚คใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
+
+msgid ": Send failed.\n"
+msgstr ": ้€ไฟกใซๅคฑๆ•—ใ—ใพใ—ใŸ.\n"
+
+msgid ": Send failed. Trying to execute locally\n"
+msgstr ": ้€ไฟกใซๅคฑๆ•—ใ—ใพใ—ใŸ. ใƒญใƒผใ‚ซใƒซใงใฎๅฎŸ่กŒใ‚’่ฉฆใฟใฆใ„ใพใ™\n"
+
+#, c-format
+msgid "%d of %d edited"
+msgstr "%d ๅ€‹ (%d ๅ€‹ไธญ) ใฎใƒ•ใ‚กใ‚คใƒซใ‚’็ทจ้›†ใ—ใพใ—ใŸ"
+
+msgid "No display: Send expression failed.\n"
+msgstr "ใƒ‡ใ‚ฃใ‚นใƒ—ใƒฌใ‚คใŒใ‚ใ‚Šใพใ›ใ‚“: ๅผใฎ้€ไฟกใซๅคฑๆ•—ใ—ใพใ—ใŸ.\n"
+
+msgid ": Send expression failed.\n"
+msgstr ": ๅผใฎ้€ไฟกใซๅคฑๆ•—ใ—ใพใ—ใŸ.\n"
+
msgid "No marks set"
msgstr "ใƒžใƒผใ‚ฏใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#: ../mark.c:678
#, c-format
msgid "E283: No marks matching \"%s\""
msgstr "E283: \"%s\" ใซ่ฉฒๅฝ“ใ™ใ‚‹ใƒžใƒผใ‚ฏใŒใ‚ใ‚Šใพใ›ใ‚“"
-#. Highlight title
-#: ../mark.c:687
msgid ""
"\n"
"mark line col file/text"
@@ -3605,8 +3311,6 @@ msgstr ""
"\n"
"mark ่กŒ ๅˆ— ใƒ•ใ‚กใ‚คใƒซ/ใƒ†ใ‚ญใ‚นใƒˆ"
-#. Highlight title
-#: ../mark.c:789
msgid ""
"\n"
" jump line col file/text"
@@ -3614,8 +3318,6 @@ msgstr ""
"\n"
" jump ่กŒ ๅˆ— ใƒ•ใ‚กใ‚คใƒซ/ใƒ†ใ‚ญใ‚นใƒˆ"
-#. Highlight title
-#: ../mark.c:831
msgid ""
"\n"
"change line col text"
@@ -3623,7 +3325,6 @@ msgstr ""
"\n"
"ๅค‰ๆ›ด ่กŒ ๅˆ— ใƒ†ใ‚ญใ‚นใƒˆ"
-#: ../mark.c:1238
msgid ""
"\n"
"# File marks:\n"
@@ -3631,8 +3332,6 @@ msgstr ""
"\n"
"# ใƒ•ใ‚กใ‚คใƒซใƒžใƒผใ‚ฏ:\n"
-#. Write the jumplist with -'
-#: ../mark.c:1271
msgid ""
"\n"
"# Jumplist (newest first):\n"
@@ -3640,7 +3339,6 @@ msgstr ""
"\n"
"# ใ‚ธใƒฃใƒณใƒ—ใƒชใ‚นใƒˆ (ๆ–ฐใ—ใ„ใ‚‚ใฎใŒๅ…ˆ):\n"
-#: ../mark.c:1352
msgid ""
"\n"
"# History of marks within files (newest to oldest):\n"
@@ -3648,84 +3346,87 @@ msgstr ""
"\n"
"# ใƒ•ใ‚กใ‚คใƒซๅ†…ใƒžใƒผใ‚ฏใฎๅฑฅๆญด (ๆ–ฐใ—ใ„ใ‚‚ใฎใ‹ใ‚‰ๅคใ„ใ‚‚ใฎ):\n"
-#: ../mark.c:1431
msgid "Missing '>'"
msgstr "'>' ใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-#: ../memfile.c:426
+msgid "E543: Not a valid codepage"
+msgstr "E543: ็„กๅŠนใชใ‚ณใƒผใƒ‰ใƒšใƒผใ‚ธใงใ™"
+
+msgid "E284: Cannot set IC values"
+msgstr "E284: ICใฎๅ€คใ‚’่จญๅฎšใงใใพใ›ใ‚“"
+
+msgid "E285: Failed to create input context"
+msgstr "E285: ใ‚คใƒณใƒ—ใƒƒใƒˆใ‚ณใƒณใƒ†ใ‚ญใ‚นใƒˆใฎไฝœๆˆใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+
+msgid "E286: Failed to open input method"
+msgstr "E286: ใ‚คใƒณใƒ—ใƒƒใƒˆใƒกใ‚ฝใƒƒใƒ‰ใฎใ‚ชใƒผใƒ—ใƒณใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+
+msgid "E287: Warning: Could not set destroy callback to IM"
+msgstr "E287: ่ญฆๅ‘Š: IMใฎ็ ดๅฃŠใ‚ณใƒผใƒซใƒใƒƒใ‚ฏใ‚’่จญๅฎšใงใใพใ›ใ‚“ใงใ—ใŸ"
+
+msgid "E288: input method doesn't support any style"
+msgstr "E288: ใ‚คใƒณใƒ—ใƒƒใƒˆใƒกใ‚ฝใƒƒใƒ‰ใฏใฉใ‚“ใชใ‚นใ‚ฟใ‚คใƒซใ‚‚ใ‚ตใƒใƒผใƒˆใ—ใพใ›ใ‚“"
+
+msgid "E289: input method doesn't support my preedit type"
+msgstr "E289: ใ‚คใƒณใƒ—ใƒƒใƒˆใƒกใ‚ฝใƒƒใƒ‰ใฏ my preedit type ใ‚’ใ‚ตใƒใƒผใƒˆใ—ใพใ›ใ‚“"
+
msgid "E293: block was not locked"
msgstr "E293: ใƒ–ใƒญใƒƒใ‚ฏใŒใƒญใƒƒใ‚ฏใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#: ../memfile.c:799
msgid "E294: Seek error in swap file read"
msgstr "E294: ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซ่ชญ่พผๆ™‚ใซใ‚ทใƒผใ‚ฏใ‚จใƒฉใƒผใงใ™"
-#: ../memfile.c:803
msgid "E295: Read error in swap file"
msgstr "E295: ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใฎ่ชญ่พผใฟใ‚จใƒฉใƒผใงใ™"
-#: ../memfile.c:849
msgid "E296: Seek error in swap file write"
msgstr "E296: ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซๆ›ธ่พผใฟๆ™‚ใซใ‚ทใƒผใ‚ฏใ‚จใƒฉใƒผใงใ™"
-#: ../memfile.c:865
msgid "E297: Write error in swap file"
msgstr "E297: ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใฎๆ›ธ่พผใฟใ‚จใƒฉใƒผใงใ™"
-#: ../memfile.c:1036
msgid "E300: Swap file already exists (symlink attack?)"
msgstr "E300: ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใŒๆ—ขใซๅญ˜ๅœจใ—ใพใ™ (symlinkใซใ‚ˆใ‚‹ๆ”ปๆ’ƒ?)"
-#: ../memline.c:318
msgid "E298: Didn't get block nr 0?"
msgstr "E298: ใƒ–ใƒญใƒƒใ‚ฏ 0 ใ‚’ๅ–ๅพ—ใงใใพใ›ใ‚“?"
-#: ../memline.c:361
msgid "E298: Didn't get block nr 1?"
msgstr "E298: ใƒ–ใƒญใƒƒใ‚ฏ 1 ใ‚’ๅ–ๅพ—ใงใใพใ›ใ‚“?"
-#: ../memline.c:377
msgid "E298: Didn't get block nr 2?"
msgstr "E298: ใƒ–ใƒญใƒƒใ‚ฏ 2 ใ‚’ๅ–ๅพ—ใงใใพใ›ใ‚“?"
-#. could not (re)open the swap file, what can we do????
-#: ../memline.c:465
+msgid "E843: Error while updating swap file crypt"
+msgstr "E843: ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใฎๆš—ๅทใ‚’ๆ›ดๆ–ฐไธญใซใ‚จใƒฉใƒผใŒ็™บ็”Ÿใ—ใพใ—ใŸ"
+
msgid "E301: Oops, lost the swap file!!!"
-msgstr "E301: ใŠใฃใจ, ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใŒๅคฑใ‚ใ‚Œใพใ—ใŸ!!!"
+msgstr "E301: ใŠใฃใจใ€ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใŒๅคฑใ‚ใ‚Œใพใ—ใŸ!!!"
-#: ../memline.c:477
msgid "E302: Could not rename swap file"
msgstr "E302: ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใฎๅๅ‰ใ‚’ๅค‰ใˆใ‚‰ใ‚Œใพใ›ใ‚“"
-#: ../memline.c:554
#, c-format
msgid "E303: Unable to open swap file for \"%s\", recovery impossible"
msgstr "E303: \"%s\" ใฎใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใ‚’้–‹ใ‘ใชใ„ใฎใงใƒชใ‚ซใƒใƒชใฏไธๅฏ่ƒฝใงใ™"
-#: ../memline.c:666
msgid "E304: ml_upd_block0(): Didn't get block 0??"
msgstr "E304: ml_upd_block0(): ใƒ–ใƒญใƒƒใ‚ฏ 0 ใ‚’ๅ–ๅพ—ใงใใพใ›ใ‚“ใงใ—ใŸ??"
-#. no swap files found
-#: ../memline.c:830
#, c-format
msgid "E305: No swap file found for %s"
msgstr "E305: %s ใซใฏใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-#: ../memline.c:839
msgid "Enter number of swap file to use (0 to quit): "
msgstr "ไฝฟ็”จใ™ใ‚‹ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใฎ็•ชๅทใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„(0 ใง็ต‚ไบ†): "
-#: ../memline.c:879
#, c-format
msgid "E306: Cannot open %s"
msgstr "E306: %s ใ‚’้–‹ใ‘ใพใ›ใ‚“"
-#: ../memline.c:897
msgid "Unable to read block 0 from "
msgstr "ใƒ–ใƒญใƒƒใ‚ฏ 0 ใ‚’่ชญ่พผใ‚ใพใ›ใ‚“ "
-#: ../memline.c:900
msgid ""
"\n"
"Maybe no changes were made or Vim did not update the swap file."
@@ -3733,28 +3434,22 @@ msgstr ""
"\n"
"ๆใ‚‰ใๅค‰ๆ›ดใŒใ•ใ‚Œใฆใ„ใชใ„ใ‹VimใŒใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใ‚’ๆ›ดๆ–ฐใ—ใฆใ„ใพใ›ใ‚“."
-#: ../memline.c:909
msgid " cannot be used with this version of Vim.\n"
msgstr " Vimใฎใ“ใฎใƒใƒผใ‚ธใƒงใƒณใงใฏไฝฟ็”จใงใใพใ›ใ‚“.\n"
-#: ../memline.c:911
msgid "Use Vim version 3.0.\n"
msgstr "Vimใฎใƒใƒผใ‚ธใƒงใƒณ3.0ใ‚’ไฝฟ็”จใ—ใฆใใ ใ•ใ„.\n"
-#: ../memline.c:916
#, c-format
msgid "E307: %s does not look like a Vim swap file"
msgstr "E307: %s ใฏVimใฎใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใงใฏใชใ„ใ‚ˆใ†ใงใ™"
-#: ../memline.c:922
msgid " cannot be used on this computer.\n"
msgstr " ใ“ใฎใ‚ณใƒณใƒ”ใƒฅใƒผใ‚ฟใงใฏไฝฟ็”จใงใใพใ›ใ‚“.\n"
-#: ../memline.c:924
msgid "The file was created on "
msgstr "ใ“ใฎใƒ•ใ‚กใ‚คใƒซใฏๆฌกใฎๅ ดๆ‰€ใงไฝœใ‚‰ใ‚Œใพใ—ใŸ "
-#: ../memline.c:928
msgid ""
",\n"
"or the file has been damaged."
@@ -3762,101 +3457,117 @@ msgstr ""
",\n"
"ใ‚‚ใ—ใใฏใƒ•ใ‚กใ‚คใƒซใŒๆๅ‚ทใ—ใฆใ„ใพใ™."
-#: ../memline.c:945
+#, c-format
+msgid ""
+"E833: %s is encrypted and this version of Vim does not support encryption"
+msgstr ""
+"E833: %s ใฏใ“ใฎใƒใƒผใ‚ธใƒงใƒณใฎVimใงใ‚ตใƒใƒผใƒˆใ—ใฆใ„ใชใ„ๅฝขๅผใงๆš—ๅทๅŒ–ใ•ใ‚Œใฆใ„ใพใ™"
+
msgid " has been damaged (page size is smaller than minimum value).\n"
msgstr " ใฏๆๅ‚ทใ—ใฆใ„ใพใ™ (ใƒšใƒผใ‚ธใ‚ตใ‚คใ‚บใŒๆœ€ๅฐๅ€คใ‚’ไธ‹ๅ›žใฃใฆใ„ใพใ™).\n"
-#: ../memline.c:974
#, c-format
msgid "Using swap file \"%s\""
msgstr "ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซ \"%s\" ใ‚’ไฝฟ็”จไธญ"
-#: ../memline.c:980
#, c-format
msgid "Original file \"%s\""
msgstr "ๅŽŸๆœฌใƒ•ใ‚กใ‚คใƒซ \"%s\""
-#: ../memline.c:995
msgid "E308: Warning: Original file may have been changed"
msgstr "E308: ่ญฆๅ‘Š: ๅŽŸๆœฌใƒ•ใ‚กใ‚คใƒซใŒๅค‰ๆ›ดใ•ใ‚Œใฆใ„ใพใ™"
-#: ../memline.c:1061
+#, c-format
+msgid "Swap file is encrypted: \"%s\""
+msgstr "ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใฏๆš—ๅทๅŒ–ใ•ใ‚Œใฆใ„ใพใ™: \"%s\""
+
+msgid ""
+"\n"
+"If you entered a new crypt key but did not write the text file,"
+msgstr ""
+"\n"
+"ๆ–ฐใ—ใ„ๆš—ๅทใ‚ญใƒผใ‚’ๅ…ฅๅŠ›ใ—ใŸใ‚ใจใซใƒ†ใ‚ญใ‚นใƒˆใƒ•ใ‚กใ‚คใƒซใ‚’ไฟๅญ˜ใ—ใฆใ„ใชใ„ๅ ดๅˆใฏใ€"
+
+msgid ""
+"\n"
+"enter the new crypt key."
+msgstr ""
+"\n"
+"ๆ–ฐใ—ใ„ๆš—ๅทใ‚ญใƒผใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„."
+
+msgid ""
+"\n"
+"If you wrote the text file after changing the crypt key press enter"
+msgstr ""
+"\n"
+"ๆš—ๅทใ‚ญใƒผใ‚’ๅค‰ใˆใŸใ‚ใจใซใƒ†ใ‚ญใ‚นใƒˆใƒ•ใ‚กใ‚คใƒซใ‚’ไฟๅญ˜ใ—ใŸๅ ดๅˆใฏใ€ใƒ†ใ‚ญใ‚นใƒˆใƒ•ใ‚กใ‚คใƒซใจ"
+
+msgid ""
+"\n"
+"to use the same key for text file and swap file"
+msgstr ""
+"\n"
+"ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใซๅŒใ˜ๆš—ๅทใ‚ญใƒผใ‚’ไฝฟใ†ใŸใ‚ใซenterใ ใ‘ใ‚’ๆŠผใ—ใฆใใ ใ•ใ„."
+
#, c-format
msgid "E309: Unable to read block 1 from %s"
msgstr "E309: %s ใ‹ใ‚‰ใƒ–ใƒญใƒƒใ‚ฏ 1 ใ‚’่ชญ่พผใ‚ใพใ›ใ‚“"
-#: ../memline.c:1065
msgid "???MANY LINES MISSING"
msgstr "???ๅคšใใฎ่กŒใŒๅคฑใ‚ใ‚Œใฆใ„ใพใ™"
-#: ../memline.c:1076
msgid "???LINE COUNT WRONG"
msgstr "???่กŒๆ•ฐใŒ้–“้•ใฃใฆใ„ใพใ™"
-#: ../memline.c:1082
msgid "???EMPTY BLOCK"
msgstr "???ใƒ–ใƒญใƒƒใ‚ฏใŒ็ฉบใงใ™"
-#: ../memline.c:1103
msgid "???LINES MISSING"
msgstr "???่กŒใŒๅคฑใ‚ใ‚Œใฆใ„ใพใ™"
-#: ../memline.c:1128
#, c-format
msgid "E310: Block 1 ID wrong (%s not a .swp file?)"
msgstr "E310: ใƒ–ใƒญใƒƒใ‚ฏ 1 ใฎIDใŒ้–“้•ใฃใฆใ„ใพใ™(%s ใŒ.swpใƒ•ใ‚กใ‚คใƒซใงใชใ„?)"
-#: ../memline.c:1133
msgid "???BLOCK MISSING"
msgstr "???ใƒ–ใƒญใƒƒใ‚ฏใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../memline.c:1147
msgid "??? from here until ???END lines may be messed up"
msgstr "??? ใ“ใ“ใ‹ใ‚‰ ???END ใพใงใฎ่กŒใŒ็ ดๅฃŠใ•ใ‚Œใฆใ„ใ‚‹ใ‚ˆใ†ใงใ™"
-#: ../memline.c:1164
msgid "??? from here until ???END lines may have been inserted/deleted"
msgstr "??? ใ“ใ“ใ‹ใ‚‰ ???END ใพใงใฎ่กŒใŒๆŒฟๅ…ฅใ‹ๅ‰Š้™คใ•ใ‚ŒใŸใ‚ˆใ†ใงใ™"
-#: ../memline.c:1181
msgid "???END"
msgstr "???END"
-#: ../memline.c:1238
msgid "E311: Recovery Interrupted"
msgstr "E311: ใƒชใ‚ซใƒใƒชใŒๅ‰ฒ่พผใพใ‚Œใพใ—ใŸ"
-#: ../memline.c:1243
msgid ""
"E312: Errors detected while recovering; look for lines starting with ???"
msgstr ""
"E312: ใƒชใ‚ซใƒใƒชใฎๆœ€ไธญใซใ‚จใƒฉใƒผใŒๆคœๅ‡บใ•ใ‚Œใพใ—ใŸ; ???ใงๅง‹ใพใ‚‹่กŒใ‚’ๅ‚็…งใ—ใฆใใ ใ•ใ„"
-#: ../memline.c:1245
msgid "See \":help E312\" for more information."
msgstr "่ฉณ็ดฐใฏ \":help E312\" ใ‚’ๅ‚็…งใ—ใฆใใ ใ•ใ„"
-#: ../memline.c:1249
msgid "Recovery completed. You should check if everything is OK."
msgstr "ใƒชใ‚ซใƒใƒชใŒ็ต‚ไบ†ใ—ใพใ—ใŸ. ๅ…จใฆใŒๆญฃใ—ใ„ใ‹ใƒใ‚งใƒƒใ‚ฏใ—ใฆใใ ใ•ใ„."
-#: ../memline.c:1251
msgid ""
"\n"
"(You might want to write out this file under another name\n"
msgstr ""
"\n"
-"(ๅค‰ๆ›ดใ‚’ใƒใ‚งใƒƒใ‚ฏใ™ใ‚‹ใŸใ‚ใซ, ใ“ใฎใƒ•ใ‚กใ‚คใƒซใ‚’ๅˆฅใฎๅๅ‰ใงไฟๅญ˜ใ—ใŸไธŠใง\n"
+"(ๅค‰ๆ›ดใ‚’ใƒใ‚งใƒƒใ‚ฏใ™ใ‚‹ใŸใ‚ใซใ€ใ“ใฎใƒ•ใ‚กใ‚คใƒซใ‚’ๅˆฅใฎๅๅ‰ใงไฟๅญ˜ใ—ใŸไธŠใง\n"
-#: ../memline.c:1252
msgid "and run diff with the original file to check for changes)"
msgstr "ๅŽŸๆœฌใƒ•ใ‚กใ‚คใƒซใจใฎ diff ใ‚’ๅฎŸ่กŒใ™ใ‚‹ใจ่‰ฏใ„ใงใ—ใ‚‡ใ†)"
-#: ../memline.c:1254
msgid "Recovery completed. Buffer contents equals file contents."
msgstr "ๅพฉๅ…ƒๅฎŒไบ†. ใƒใƒƒใƒ•ใ‚กใฎๅ†…ๅฎนใฏใƒ•ใ‚กใ‚คใƒซใจๅŒใ˜ใซใชใ‚Šใพใ—ใŸ."
-#: ../memline.c:1255
msgid ""
"\n"
"You may want to delete the .swp file now.\n"
@@ -3866,52 +3577,42 @@ msgstr ""
"ๅ…ƒใฎ.swpใƒ•ใ‚กใ‚คใƒซใฏๅ‰Š้™คใ—ใฆใ‚‚ๆง‹ใ„ใพใ›ใ‚“\n"
"\n"
-#. use msg() to start the scrolling properly
-#: ../memline.c:1327
+msgid "Using crypt key from swap file for the text file.\n"
+msgstr "ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใ‹ใ‚‰ๅ–ๅพ—ใ—ใŸๆš—ๅทใ‚ญใƒผใ‚’ใƒ†ใ‚ญใ‚นใƒˆใƒ•ใ‚กใ‚คใƒซใซไฝฟใ„ใพใ™.\n"
+
msgid "Swap files found:"
msgstr "ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใŒ่ค‡ๆ•ฐ่ฆ‹ใคใ‹ใ‚Šใพใ—ใŸ:"
-#: ../memline.c:1446
msgid " In current directory:\n"
msgstr " ็พๅœจใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒช:\n"
-#: ../memline.c:1448
msgid " Using specified name:\n"
msgstr " ไปฅไธ‹ใฎๅๅ‰ใ‚’ไฝฟ็”จไธญ:\n"
-#: ../memline.c:1450
msgid " In directory "
msgstr " ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒช "
-#: ../memline.c:1465
msgid " -- none --\n"
msgstr " -- ใชใ— --\n"
-#: ../memline.c:1527
msgid " owned by: "
msgstr " ๆ‰€ๆœ‰่€…: "
-#: ../memline.c:1529
msgid " dated: "
msgstr " ๆ—ฅไป˜: "
-#: ../memline.c:1532 ../memline.c:3231
msgid " dated: "
msgstr " ๆ—ฅไป˜: "
-#: ../memline.c:1548
msgid " [from Vim version 3.0]"
msgstr " [from Vim version 3.0]"
-#: ../memline.c:1550
msgid " [does not look like a Vim swap file]"
msgstr " [Vimใฎใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใงใฏใชใ„ใ‚ˆใ†ใงใ™]"
-#: ../memline.c:1552
msgid " file name: "
msgstr " ใƒ•ใ‚กใ‚คใƒซๅ: "
-#: ../memline.c:1558
msgid ""
"\n"
" modified: "
@@ -3919,15 +3620,12 @@ msgstr ""
"\n"
" ๅค‰ๆ›ด็Šถๆ…‹: "
-#: ../memline.c:1559
msgid "YES"
msgstr "ใ‚ใ‚Š"
-#: ../memline.c:1559
msgid "no"
msgstr "ใชใ—"
-#: ../memline.c:1562
msgid ""
"\n"
" user name: "
@@ -3935,11 +3633,9 @@ msgstr ""
"\n"
" ใƒฆใƒผใ‚ถใƒผๅ: "
-#: ../memline.c:1568
msgid " host name: "
msgstr " ใƒ›ใ‚นใƒˆๅ: "
-#: ../memline.c:1570
msgid ""
"\n"
" host name: "
@@ -3947,7 +3643,6 @@ msgstr ""
"\n"
" ใƒ›ใ‚นใƒˆๅ: "
-#: ../memline.c:1575
msgid ""
"\n"
" process ID: "
@@ -3955,11 +3650,16 @@ msgstr ""
"\n"
" ใƒ—ใƒญใ‚ปใ‚นID: "
-#: ../memline.c:1579
msgid " (still running)"
msgstr " (ใพใ ๅฎŸ่กŒไธญ)"
-#: ../memline.c:1586
+msgid ""
+"\n"
+" [not usable with this version of Vim]"
+msgstr ""
+"\n"
+" [ใ“ใฎVimใƒใƒผใ‚ธใƒงใƒณใงใฏไฝฟ็”จใงใใพใ›ใ‚“]"
+
msgid ""
"\n"
" [not usable on this computer]"
@@ -3967,97 +3667,75 @@ msgstr ""
"\n"
" [ใ“ใฎใ‚ณใƒณใƒ”ใƒฅใƒผใ‚ฟใงใฏไฝฟ็”จใงใใพใ›ใ‚“]"
-#: ../memline.c:1590
msgid " [cannot be read]"
msgstr " [่ชญ่พผใ‚ใพใ›ใ‚“]"
-#: ../memline.c:1593
msgid " [cannot be opened]"
msgstr " [้–‹ใ‘ใพใ›ใ‚“]"
-#: ../memline.c:1698
msgid "E313: Cannot preserve, there is no swap file"
msgstr "E313: ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใŒ็„กใ„ใฎใง็ถญๆŒใงใใพใ›ใ‚“"
-#: ../memline.c:1747
msgid "File preserved"
msgstr "ใƒ•ใ‚กใ‚คใƒซใŒ็ถญๆŒใ•ใ‚Œใพใ™"
-#: ../memline.c:1749
msgid "E314: Preserve failed"
msgstr "E314: ็ถญๆŒใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-#: ../memline.c:1819
#, c-format
-msgid "E315: ml_get: invalid lnum: %<PRId64>"
-msgstr "E315: ml_get: ็„กๅŠนใชlnumใงใ™: %<PRId64>"
+msgid "E315: ml_get: invalid lnum: %ld"
+msgstr "E315: ml_get: ็„กๅŠนใชlnumใงใ™: %ld"
-#: ../memline.c:1851
#, c-format
-msgid "E316: ml_get: cannot find line %<PRId64>"
-msgstr "E316: ml_get: ่กŒ %<PRId64> ใ‚’่ฆ‹ใคใ‘ใ‚‰ใ‚Œใพใ›ใ‚“"
+msgid "E316: ml_get: cannot find line %ld"
+msgstr "E316: ml_get: ่กŒ %ld ใ‚’่ฆ‹ใคใ‘ใ‚‰ใ‚Œใพใ›ใ‚“"
-#: ../memline.c:2236
msgid "E317: pointer block id wrong 3"
msgstr "E317: ใƒใ‚คใƒณใ‚ฟใƒ–ใƒญใƒƒใ‚ฏใฎIDใŒ้–“้•ใฃใฆใ„ใพใ™ 3"
-#: ../memline.c:2311
msgid "stack_idx should be 0"
msgstr "stack_idx ใฏ 0 ใงใ‚ใ‚‹ในใใงใ™"
-#: ../memline.c:2369
msgid "E318: Updated too many blocks?"
msgstr "E318: ๆ›ดๆ–ฐใ•ใ‚ŒใŸใƒ–ใƒญใƒƒใ‚ฏใŒๅคš้ŽใŽใ‚‹ใ‹ใ‚‚?"
-#: ../memline.c:2511
msgid "E317: pointer block id wrong 4"
msgstr "E317: ใƒใ‚คใƒณใ‚ฟใƒ–ใƒญใƒƒใ‚ฏใฎIDใŒ้–“้•ใฃใฆใ„ใพใ™ 4"
-#: ../memline.c:2536
msgid "deleted block 1?"
msgstr "ใƒ–ใƒญใƒƒใ‚ฏ 1 ใฏๆถˆใ•ใ‚ŒใŸ?"
-#: ../memline.c:2707
#, c-format
-msgid "E320: Cannot find line %<PRId64>"
-msgstr "E320: ่กŒ %<PRId64> ใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
+msgid "E320: Cannot find line %ld"
+msgstr "E320: ่กŒ %ld ใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-#: ../memline.c:2916
msgid "E317: pointer block id wrong"
msgstr "E317: ใƒใ‚คใƒณใ‚ฟใƒ–ใƒญใƒƒใ‚ฏใฎIDใŒ้–“้•ใฃใฆใ„ใพใ™"
-#: ../memline.c:2930
msgid "pe_line_count is zero"
msgstr "pe_line_count ใŒใ‚ผใƒญใงใ™"
-#: ../memline.c:2955
#, c-format
-msgid "E322: line number out of range: %<PRId64> past the end"
-msgstr "E322: ่กŒ็•ชๅทใŒ็ฏ„ๅ›ฒๅค–ใงใ™: %<PRId64> ่ถ…ใˆใฆใ„ใพใ™"
+msgid "E322: line number out of range: %ld past the end"
+msgstr "E322: ่กŒ็•ชๅทใŒ็ฏ„ๅ›ฒๅค–ใงใ™: %ld ่ถ…ใˆใฆใ„ใพใ™"
-#: ../memline.c:2959
#, c-format
-msgid "E323: line count wrong in block %<PRId64>"
-msgstr "E323: ใƒ–ใƒญใƒƒใ‚ฏ %<PRId64> ใฎ่กŒใ‚ซใ‚ฆใƒณใƒˆใŒ้–“้•ใฃใฆใ„ใพใ™"
+msgid "E323: line count wrong in block %ld"
+msgstr "E323: ใƒ–ใƒญใƒƒใ‚ฏ %ld ใฎ่กŒใ‚ซใ‚ฆใƒณใƒˆใŒ้–“้•ใฃใฆใ„ใพใ™"
-#: ../memline.c:2999
msgid "Stack size increases"
msgstr "ใ‚นใ‚ฟใƒƒใ‚ฏใ‚ตใ‚คใ‚บใŒๅข—ใˆใพใ™"
-#: ../memline.c:3038
msgid "E317: pointer block id wrong 2"
msgstr "E317: ใƒใ‚คใƒณใ‚ฟใƒ–ใƒญใƒƒใ‚ฏใฎIDใŒ้–“้•ใฃใฆใ„ใพใ™ 2"
-#: ../memline.c:3070
#, c-format
msgid "E773: Symlink loop for \"%s\""
msgstr "E773: \"%s\" ใฎใ‚ทใƒณใƒœใƒชใƒƒใ‚ฏใƒชใƒณใ‚ฏใŒใƒซใƒผใƒ—ใซใชใฃใฆใ„ใพใ™"
-#: ../memline.c:3221
msgid "E325: ATTENTION"
msgstr "E325: ๆณจๆ„"
-#: ../memline.c:3222
msgid ""
"\n"
"Found a swap file by the name \""
@@ -4065,39 +3743,30 @@ msgstr ""
"\n"
"ๆฌกใฎๅๅ‰ใงใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใ‚’่ฆ‹ใคใ‘ใพใ—ใŸ \""
-#: ../memline.c:3226
msgid "While opening file \""
msgstr "ๆฌกใฎใƒ•ใ‚กใ‚คใƒซใ‚’้–‹ใ„ใฆใ„ใ‚‹ๆœ€ไธญ \""
-#: ../memline.c:3239
msgid " NEWER than swap file!\n"
msgstr " ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใ‚ˆใ‚Šใ‚‚ๆ–ฐใ—ใ„ใงใ™!\n"
-#: ../memline.c:3244
msgid ""
"\n"
"(1) Another program may be editing the same file. If this is the case,\n"
" be careful not to end up with two different instances of the same\n"
-" file when making changes."
+" file when making changes. Quit, or continue with caution.\n"
msgstr ""
"\n"
"(1) ๅˆฅใฎใƒ—ใƒญใ‚ฐใƒฉใƒ ใŒๅŒใ˜ใƒ•ใ‚กใ‚คใƒซใ‚’็ทจ้›†ใ—ใฆใ„ใ‚‹ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“.\n"
-" ใ“ใฎๅ ดๅˆใซใฏ, ๅค‰ๆ›ดใ‚’ใ—ใฆใ—ใพใ†ใจ1ใคใฎใƒ•ใ‚กใ‚คใƒซใซๅฏพใ—ใฆ็•ฐใชใ‚‹2ใคใฎ\n"
-" ใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใŒใงใใฆใ—ใพใ†ใฎใง, ใใ†ใ—ใชใ„ใ‚ˆใ†ใซๆฐ—ใ‚’ใคใ‘ใฆใใ ใ•ใ„."
+" ใ“ใฎๅ ดๅˆใซใฏใ€ๅค‰ๆ›ดใ‚’ใ—ใฆใ—ใพใ†ใจ1ใคใฎใƒ•ใ‚กใ‚คใƒซใซๅฏพใ—ใฆ็•ฐใชใ‚‹2ใคใฎ\n"
+" ใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใŒใงใใฆใ—ใพใ†ใฎใงใ€ใใ†ใ—ใชใ„ใ‚ˆใ†ใซๆฐ—ใ‚’ใคใ‘ใฆใใ ใ•ใ„.\n"
+" ็ต‚ไบ†ใ™ใ‚‹ใ‹ใ€ๆณจๆ„ใ—ใชใŒใ‚‰็ถšใ‘ใฆใใ ใ•ใ„.\n"
-#: ../memline.c:3245
-msgid " Quit, or continue with caution.\n"
-msgstr " ็ต‚ไบ†ใ™ใ‚‹ใ‹, ๆณจๆ„ใ—ใชใŒใ‚‰็ถšใ‘ใฆใใ ใ•ใ„.\n"
-
-#: ../memline.c:3246
msgid "(2) An edit session for this file crashed.\n"
msgstr "(2) ใ“ใฎใƒ•ใ‚กใ‚คใƒซใฎ็ทจ้›†ใ‚ปใƒƒใ‚ทใƒงใƒณใŒใ‚ฏใƒฉใƒƒใ‚ทใƒฅใ—ใŸ.\n"
-#: ../memline.c:3247
msgid " If this is the case, use \":recover\" or \"vim -r "
msgstr " ใ“ใฎๅ ดๅˆใซใฏ \":recover\" ใ‹ \"vim -r "
-#: ../memline.c:3249
msgid ""
"\"\n"
" to recover the changes (see \":help recovery\").\n"
@@ -4105,11 +3774,9 @@ msgstr ""
"\"\n"
" ใ‚’ไฝฟ็”จใ—ใฆๅค‰ๆ›ดใ‚’ใƒชใ‚ซใƒใƒผใ—ใพใ™(\":help recovery\" ใ‚’ๅ‚็…ง).\n"
-#: ../memline.c:3250
msgid " If you did this already, delete the swap file \""
-msgstr " ๆ—ขใซใ“ใ‚Œใ‚’่กŒใชใฃใŸใฎใชใ‚‰ใฐ, ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซ \""
+msgstr " ๆ—ขใซใ“ใ‚Œใ‚’่กŒใชใฃใŸใฎใชใ‚‰ใฐใ€ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซ \""
-#: ../memline.c:3252
msgid ""
"\"\n"
" to avoid this message.\n"
@@ -4117,23 +3784,18 @@ msgstr ""
"\"\n"
" ใ‚’ๆถˆใ›ใฐใ“ใฎใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ๅ›ž้ฟใงใใพใ™.\n"
-#: ../memline.c:3450 ../memline.c:3452
msgid "Swap file \""
msgstr "ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซ \""
-#: ../memline.c:3451 ../memline.c:3455
msgid "\" already exists!"
msgstr "\" ใŒๆ—ขใซใ‚ใ‚Šใพใ™!"
-#: ../memline.c:3457
msgid "VIM - ATTENTION"
msgstr "VIM - ๆณจๆ„"
-#: ../memline.c:3459
msgid "Swap file already exists!"
msgstr "ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใŒๆ—ขใซๅญ˜ๅœจใ—ใพใ™!"
-#: ../memline.c:3464
msgid ""
"&Open Read-Only\n"
"&Edit anyway\n"
@@ -4147,7 +3809,6 @@ msgstr ""
"็ต‚ไบ†ใ™ใ‚‹(&Q)\n"
"ไธญๆญขใ™ใ‚‹(&A)"
-#: ../memline.c:3467
msgid ""
"&Open Read-Only\n"
"&Edit anyway\n"
@@ -4163,56 +3824,31 @@ msgstr ""
"็ต‚ไบ†ใ™ใ‚‹(&Q)\n"
"ไธญๆญขใ™ใ‚‹(&A)"
-#.
-#. * Change the ".swp" extension to find another file that can be used.
-#. * First decrement the last char: ".swo", ".swn", etc.
-#. * If that still isn't enough decrement the last but one char: ".svz"
-#. * Can happen when editing many "No Name" buffers.
-#.
-#. ".s?a"
-#. ".saa": tried enough, give up
-#: ../memline.c:3528
msgid "E326: Too many swap files found"
msgstr "E326: ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใŒๅคšๆ•ฐ่ฆ‹ใคใ‹ใ‚Šใพใ—ใŸ"
-#: ../memory.c:227
-#, c-format
-msgid "E342: Out of memory! (allocating %<PRIu64> bytes)"
-msgstr "E342: ใƒกใƒขใƒชใŒ่ถณใ‚Šใพใ›ใ‚“! (%<PRIu64> ใƒใ‚คใƒˆใ‚’ๅ‰ฒๅฝ“่ฆๆฑ‚)"
-
-#: ../menu.c:62
msgid "E327: Part of menu-item path is not sub-menu"
msgstr "E327: ใƒกใƒ‹ใƒฅใƒผใ‚ขใ‚คใƒ†ใƒ ใฎใƒ‘ใ‚นใฎ้ƒจๅˆ†ใŒใ‚ตใƒ–ใƒกใƒ‹ใƒฅใƒผใงใฏใ‚ใ‚Šใพใ›ใ‚“"
-#: ../menu.c:63
msgid "E328: Menu only exists in another mode"
msgstr "E328: ใƒกใƒ‹ใƒฅใƒผใฏไป–ใฎใƒขใƒผใƒ‰ใซใ ใ‘ใ‚ใ‚Šใพใ™"
-#: ../menu.c:64
#, c-format
msgid "E329: No menu \"%s\""
msgstr "E329: \"%s\" ใจใ„ใ†ใƒกใƒ‹ใƒฅใƒผใฏใ‚ใ‚Šใพใ›ใ‚“"
-#. Only a mnemonic or accelerator is not valid.
-#: ../menu.c:329
msgid "E792: Empty menu name"
msgstr "E792: ใƒกใƒ‹ใƒฅใƒผๅใŒ็ฉบใงใ™"
-#: ../menu.c:340
msgid "E330: Menu path must not lead to a sub-menu"
msgstr "E330: ใƒกใƒ‹ใƒฅใƒผใƒ‘ใ‚นใฏใ‚ตใƒ–ใƒกใƒ‹ใƒฅใƒผใ‚’็”Ÿใ˜ใ‚‹ในใใงใฏใ‚ใ‚Šใพใ›ใ‚“"
-#: ../menu.c:365
msgid "E331: Must not add menu items directly to menu bar"
msgstr "E331: ใƒกใƒ‹ใƒฅใƒผใƒใƒผใซใฏ็›ดๆŽฅใƒกใƒ‹ใƒฅใƒผใ‚ขใ‚คใƒ†ใƒ ใ‚’่ฟฝๅŠ ใงใใพใ›ใ‚“"
-#: ../menu.c:370
msgid "E332: Separator cannot be part of a menu path"
msgstr "E332: ๅŒบๅˆ‡ใ‚Šใฏใƒกใƒ‹ใƒฅใƒผใƒ‘ใ‚นใฎไธ€้ƒจใงใฏใ‚ใ‚Šใพใ›ใ‚“"
-#. Now we have found the matching menu, and we list the mappings
-#. Highlight title
-#: ../menu.c:762
msgid ""
"\n"
"--- Menus ---"
@@ -4220,73 +3856,60 @@ msgstr ""
"\n"
"--- ใƒกใƒ‹ใƒฅใƒผ ---"
-#: ../menu.c:1313
+msgid "Tear off this menu"
+msgstr "ใ“ใฎใƒกใƒ‹ใƒฅใƒผใ‚’ๅˆ‡ใ‚Šๅ–ใ‚‹"
+
+#, c-format
+msgid "E335: Menu not defined for %s mode"
+msgstr "E335: %s ใซใฏใƒกใƒ‹ใƒฅใƒผใŒๅฎš็พฉใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
+
msgid "E333: Menu path must lead to a menu item"
msgstr "E333: ใƒกใƒ‹ใƒฅใƒผใƒ‘ใ‚นใฏใƒกใƒ‹ใƒฅใƒผใ‚ขใ‚คใƒ†ใƒ ใ‚’็”Ÿใ˜ใชใ‘ใ‚Œใฐใ„ใ‘ใพใ›ใ‚“"
-#: ../menu.c:1330
#, c-format
msgid "E334: Menu not found: %s"
msgstr "E334: ใƒกใƒ‹ใƒฅใƒผใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“: %s"
-#: ../menu.c:1396
-#, c-format
-msgid "E335: Menu not defined for %s mode"
-msgstr "E335: %s ใซใฏใƒกใƒ‹ใƒฅใƒผใŒๅฎš็พฉใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-
-#: ../menu.c:1426
msgid "E336: Menu path must lead to a sub-menu"
msgstr "E336: ใƒกใƒ‹ใƒฅใƒผใƒ‘ใ‚นใฏใ‚ตใƒ–ใƒกใƒ‹ใƒฅใƒผใ‚’็”Ÿใ˜ใชใ‘ใ‚Œใฐใ„ใ‘ใพใ›ใ‚“"
-#: ../menu.c:1447
msgid "E337: Menu not found - check menu names"
msgstr "E337: ใƒกใƒ‹ใƒฅใƒผใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“ - ใƒกใƒ‹ใƒฅใƒผๅใ‚’็ขบ่ชใ—ใฆใใ ใ•ใ„"
-#: ../message.c:423
#, c-format
msgid "Error detected while processing %s:"
msgstr "%s ใฎๅ‡ฆ็†ไธญใซใ‚จใƒฉใƒผใŒๆคœๅ‡บใ•ใ‚Œใพใ—ใŸ:"
-#: ../message.c:445
#, c-format
msgid "line %4ld:"
msgstr "่กŒ %4ld:"
-#: ../message.c:617
#, c-format
msgid "E354: Invalid register name: '%s'"
msgstr "E354: ็„กๅŠนใชใƒฌใ‚ธใ‚นใ‚ฟๅ: '%s'"
-#: ../message.c:745
msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
msgstr "ๆ—ฅๆœฌ่ชžใƒกใƒƒใ‚ปใƒผใ‚ธ็ฟป่จณ/็›ฃไฟฎ: ๆ‘ๅฒก ๅคช้ƒŽ <koron.kaoriya@gmail.com>"
-#: ../message.c:986
msgid "Interrupt: "
msgstr "ๅ‰ฒ่พผใฟ: "
-#: ../message.c:988
msgid "Press ENTER or type command to continue"
msgstr "็ถšใ‘ใ‚‹ใซใฏENTERใ‚’ๆŠผใ™ใ‹ใ‚ณใƒžใƒณใƒ‰ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„"
-#: ../message.c:1843
#, c-format
-msgid "%s line %<PRId64>"
-msgstr "%s ่กŒ %<PRId64>"
+msgid "%s line %ld"
+msgstr "%s ่กŒ %ld"
-#: ../message.c:2392
msgid "-- More --"
msgstr "-- ็ถ™็ถš --"
-#: ../message.c:2398
msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "
msgstr " SPACE/d/j: ็”ป้ข/ใƒšใƒผใ‚ธ/่กŒ ไธ‹, b/u/k: ไธŠ, q: ็ต‚ไบ† "
-#: ../message.c:3021 ../message.c:3031
msgid "Question"
msgstr "่ณชๅ•"
-#: ../message.c:3023
msgid ""
"&Yes\n"
"&No"
@@ -4294,17 +3917,6 @@ msgstr ""
"ใฏใ„(&Y)\n"
"ใ„ใ„ใˆ(&N)"
-#: ../message.c:3033
-msgid ""
-"&Yes\n"
-"&No\n"
-"&Cancel"
-msgstr ""
-"ใฏใ„(&Y)\n"
-"ใ„ใ„ใˆ(&N)\n"
-"ใ‚ญใƒฃใƒณใ‚ปใƒซ(&C)"
-
-#: ../message.c:3045
msgid ""
"&Yes\n"
"&No\n"
@@ -4318,175 +3930,252 @@ msgstr ""
"ๅ…จใฆๆ”พๆฃ„(&D)\n"
"ใ‚ญใƒฃใƒณใ‚ปใƒซ(&C)"
-#: ../message.c:3058
+msgid "Select Directory dialog"
+msgstr "ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒช้ธๆŠžใƒ€ใ‚คใ‚ขใƒญใ‚ฐ"
+
+msgid "Save File dialog"
+msgstr "ใƒ•ใ‚กใ‚คใƒซไฟๅญ˜ใƒ€ใ‚คใ‚ขใƒญใ‚ฐ"
+
+msgid "Open File dialog"
+msgstr "ใƒ•ใ‚กใ‚คใƒซ่ชญ่พผใƒ€ใ‚คใ‚ขใƒญใ‚ฐ"
+
+msgid "E338: Sorry, no file browser in console mode"
+msgstr "E338: ใ‚ณใƒณใ‚ฝใƒผใƒซใƒขใƒผใƒ‰ใงใฏใƒ•ใ‚กใ‚คใƒซใƒ–ใƒฉใ‚ฆใ‚ถใ‚’ไฝฟใˆใพใ›ใ‚“ใ€ใ”ใ‚ใ‚“ใชใ•ใ„"
+
msgid "E766: Insufficient arguments for printf()"
msgstr "E766: printf() ใฎๅผ•ๆ•ฐใŒไธๅๅˆ†ใงใ™"
-#: ../message.c:3119
msgid "E807: Expected Float argument for printf()"
-msgstr "E807: printf() ใฎๅผ•ๆ•ฐใซใฏๆตฎๅ‹•ๅฐ‘ๆ•ฐ็‚นๆ•ฐใŒๆœŸๅพ…ใ•ใ‚Œใฆใ„ใพใ™"
+msgstr "E807: printf() ใฎๅผ•ๆ•ฐใซใฏๆตฎๅ‹•ๅฐๆ•ฐ็‚นๆ•ฐใŒๆœŸๅพ…ใ•ใ‚Œใฆใ„ใพใ™"
-#: ../message.c:3873
msgid "E767: Too many arguments to printf()"
msgstr "E767: printf() ใฎๅผ•ๆ•ฐใŒๅคš้ŽใŽใพใ™"
-#: ../misc1.c:2256
msgid "W10: Warning: Changing a readonly file"
msgstr "W10: ่ญฆๅ‘Š: ่ชญ่พผๅฐ‚็”จใƒ•ใ‚กใ‚คใƒซใ‚’ๅค‰ๆ›ดใ—ใพใ™"
-#: ../misc1.c:2537
msgid "Type number and <Enter> or click with mouse (empty cancels): "
msgstr ""
"็•ชๅทใจ<Enter>ใ‚’ๅ…ฅๅŠ›ใ™ใ‚‹ใ‹ใƒžใ‚ฆใ‚นใงใ‚ฏใƒชใƒƒใ‚ฏใ—ใฆใใ ใ•ใ„ (็ฉบใงใ‚ญใƒฃใƒณใ‚ปใƒซ): "
-#: ../misc1.c:2539
msgid "Type number and <Enter> (empty cancels): "
msgstr "็•ชๅทใจ<Enter>ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„ (็ฉบใงใ‚ญใƒฃใƒณใ‚ปใƒซ): "
-#: ../misc1.c:2585
msgid "1 more line"
msgstr "1 ่กŒ ่ฟฝๅŠ ใ—ใพใ—ใŸ"
-#: ../misc1.c:2588
msgid "1 line less"
msgstr "1 ่กŒ ๅ‰Š้™คใ—ใพใ—ใŸ"
-#: ../misc1.c:2593
#, c-format
-msgid "%<PRId64> more lines"
-msgstr "%<PRId64> ่กŒ ่ฟฝๅŠ ใ—ใพใ—ใŸ"
+msgid "%ld more lines"
+msgstr "%ld ่กŒ ่ฟฝๅŠ ใ—ใพใ—ใŸ"
-#: ../misc1.c:2596
#, c-format
-msgid "%<PRId64> fewer lines"
-msgstr "%<PRId64> ่กŒ ๅ‰Š้™คใ—ใพใ—ใŸ"
+msgid "%ld fewer lines"
+msgstr "%ld ่กŒ ๅ‰Š้™คใ—ใพใ—ใŸ"
-#: ../misc1.c:2599
msgid " (Interrupted)"
msgstr " (ๅ‰ฒ่พผใพใ‚Œใพใ—ใŸ)"
-#: ../misc1.c:2635
msgid "Beep!"
msgstr "ใƒ“ใƒผใƒƒ!"
-#: ../misc2.c:738
+msgid "ERROR: "
+msgstr "ใ‚จใƒฉใƒผ: "
+
+#, c-format
+msgid ""
+"\n"
+"[bytes] total alloc-freed %lu-%lu, in use %lu, peak use %lu\n"
+msgstr ""
+"\n"
+"[ใƒกใƒขใƒช(ใƒใ‚คใƒˆ)] ็ทๅ‰ฒๅฝ“-่งฃๆ”พ้‡ %lu-%lu, ไฝฟ็”จ้‡ %lu, ใƒ”ใƒผใ‚ฏๆ™‚ %lu\n"
+
+#, c-format
+msgid ""
+"[calls] total re/malloc()'s %lu, total free()'s %lu\n"
+"\n"
+msgstr ""
+"[ๅ‘ผๅ‡บ] ็ท re/malloc() ๅ›žๆ•ฐ %lu, ็ท free() ๅ›žๆ•ฐ %lu\n"
+"\n"
+
+msgid "E340: Line is becoming too long"
+msgstr "E340: ่กŒใŒ้•ทใใชใ‚Š้ŽใŽใพใ—ใŸ"
+
+#, c-format
+msgid "E341: Internal error: lalloc(%ld, )"
+msgstr "E341: ๅ†…้ƒจใ‚จใƒฉใƒผ: lalloc(%ld,)"
+
+#, c-format
+msgid "E342: Out of memory! (allocating %lu bytes)"
+msgstr "E342: ใƒกใƒขใƒชใŒ่ถณใ‚Šใพใ›ใ‚“! (%lu ใƒใ‚คใƒˆใ‚’ๅ‰ฒๅฝ“่ฆๆฑ‚)"
+
#, c-format
msgid "Calling shell to execute: \"%s\""
msgstr "ๅฎŸ่กŒใฎใŸใ‚ใซใ‚ทใ‚งใƒซใ‚’ๅ‘ผๅ‡บใ—ไธญ: \"%s\""
-#: ../normal.c:183
+msgid "E545: Missing colon"
+msgstr "E545: ใ‚ณใƒญใƒณใŒใ‚ใ‚Šใพใ›ใ‚“"
+
+msgid "E546: Illegal mode"
+msgstr "E546: ไธๆญฃใชใƒขใƒผใƒ‰ใงใ™"
+
+msgid "E547: Illegal mouseshape"
+msgstr "E547: ไธๆญฃใช 'mouseshape' ใงใ™"
+
+msgid "E548: digit expected"
+msgstr "E548: ๆ•ฐๅ€คใŒๅฟ…่ฆใงใ™"
+
+msgid "E549: Illegal percentage"
+msgstr "E549: ไธๆญฃใชใƒ‘ใƒผใ‚ปใƒณใƒ†ใƒผใ‚ธใงใ™"
+
+msgid "E854: path too long for completion"
+msgstr "E854: ใƒ‘ใ‚นใŒ้•ท้ŽใŽใฆ่ฃœๅฎŒใงใใพใ›ใ‚“"
+
+#, c-format
+msgid ""
+"E343: Invalid path: '**[number]' must be at the end of the path or be "
+"followed by '%s'."
+msgstr ""
+"E343: ็„กๅŠนใชใƒ‘ใ‚นใงใ™: '**[ๆ•ฐๅ€ค]' ใฏpathใฎๆœ€ๅพŒใ‹ '%s' ใŒ็ถšใ„ใฆใชใ„ใจใ„ใ‘ใพใ›"
+"ใ‚“."
+
+#, c-format
+msgid "E344: Can't find directory \"%s\" in cdpath"
+msgstr "E344: cdpathใซใฏ \"%s\" ใจใ„ใ†ใƒ•ใ‚กใ‚คใƒซใŒใ‚ใ‚Šใพใ›ใ‚“"
+
+#, c-format
+msgid "E345: Can't find file \"%s\" in path"
+msgstr "E345: pathใซใฏ \"%s\" ใจใ„ใ†ใƒ•ใ‚กใ‚คใƒซใŒใ‚ใ‚Šใพใ›ใ‚“"
+
+#, c-format
+msgid "E346: No more directory \"%s\" found in cdpath"
+msgstr "E346: cdpathใซใฏใ“ใ‚ŒไปฅไธŠ \"%s\" ใจใ„ใ†ใƒ•ใ‚กใ‚คใƒซใŒใ‚ใ‚Šใพใ›ใ‚“"
+
+#, c-format
+msgid "E347: No more file \"%s\" found in path"
+msgstr "E347: ใƒ‘ใ‚นใซใฏใ“ใ‚ŒไปฅไธŠ \"%s\" ใจใ„ใ†ใƒ•ใ‚กใ‚คใƒซใŒใ‚ใ‚Šใพใ›ใ‚“"
+
+#, c-format
+msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
+msgstr ""
+"E668: NetBeansใฎๆŽฅ็ถšๆƒ…ๅ ฑใƒ•ใ‚กใ‚คใƒซใฎใ‚ขใ‚ฏใ‚ปใ‚นใƒขใƒผใƒ‰ใซๅ•้กŒใŒใ‚ใ‚Šใพใ™: \"%s\""
+
+#, c-format
+msgid "E658: NetBeans connection lost for buffer %ld"
+msgstr "E658: ใƒใƒƒใƒ•ใ‚ก %ld ใฎ NetBeans ๆŽฅ็ถšใŒๅคฑใ‚ใ‚Œใพใ—ใŸ"
+
+msgid "E838: netbeans is not supported with this GUI"
+msgstr "E838: NetBeansใฏใ“ใฎGUIใซใฏๅฏพๅฟœใ—ใฆใ„ใพใ›ใ‚“"
+
+msgid "E511: netbeans already connected"
+msgstr "E511: NetBeansใฏๆ—ขใซๆŽฅ็ถšใ—ใฆใ„ใพใ™"
+
+#, c-format
+msgid "E505: %s is read-only (add ! to override)"
+msgstr "E505: %s ใฏ่ชญ่พผๅฐ‚็”จใงใ™ (ๅผทๅˆถๆ›ธ่พผใซใฏ ! ใ‚’่ฟฝๅŠ )"
+
msgid "E349: No identifier under cursor"
msgstr "E349: ใ‚ซใƒผใ‚ฝใƒซใฎไฝ็ฝฎใซใฏ่ญ˜ๅˆฅๅญใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../normal.c:1866
msgid "E774: 'operatorfunc' is empty"
msgstr "E774: 'operatorfunc' ใ‚ชใƒ—ใ‚ทใƒงใƒณใŒ็ฉบใงใ™"
-#: ../normal.c:2637
+msgid "E775: Eval feature not available"
+msgstr "E775: ๅผ่ฉ•ไพกๆฉŸ่ƒฝใŒ็„กๅŠนใซใชใฃใฆใ„ใพใ™"
+
msgid "Warning: terminal cannot highlight"
msgstr "่ญฆๅ‘Š: ไฝฟ็”จใ—ใฆใ„ใ‚‹็ซฏๆœซใฏใƒใ‚คใƒฉใ‚คใƒˆใงใใพใ›ใ‚“"
-#: ../normal.c:2807
msgid "E348: No string under cursor"
msgstr "E348: ใ‚ซใƒผใ‚ฝใƒซใฎไฝ็ฝฎใซใฏๆ–‡ๅญ—ๅˆ—ใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../normal.c:3937
msgid "E352: Cannot erase folds with current 'foldmethod'"
msgstr "E352: ็พๅœจใฎ 'foldmethod' ใงใฏๆŠ˜็•ณใฟใ‚’ๆถˆๅŽปใงใใพใ›ใ‚“"
-#: ../normal.c:5897
msgid "E664: changelist is empty"
msgstr "E664: ๅค‰ๆ›ดใƒชใ‚นใƒˆใŒ็ฉบใงใ™"
-#: ../normal.c:5899
msgid "E662: At start of changelist"
msgstr "E662: ๅค‰ๆ›ดใƒชใ‚นใƒˆใฎๅ…ˆ้ ญ"
-#: ../normal.c:5901
msgid "E663: At end of changelist"
msgstr "E663: ๅค‰ๆ›ดใƒชใ‚นใƒˆใฎๆœซๅฐพ"
-#: ../normal.c:7053
-msgid "Type :quit<Enter> to exit Nvim"
-msgstr "Vimใ‚’็ต‚ไบ†ใ™ใ‚‹ใซใฏ :quit<Enter> ใจๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„"
+msgid "Type :qa! and press <Enter> to abandon all changes and exit Vim"
+msgstr ""
+"ใ™ในใฆใฎๅค‰ๆ›ดใ‚’็ ดๆฃ„ใ—ใ€Vimใ‚’็ต‚ไบ†ใ™ใ‚‹ใซใฏ :qa! ใจๅ…ฅๅŠ›ใ— <Enter> ใ‚’ๆŠผใ—ใฆใใ "
+"ใ•ใ„"
-#: ../ops.c:248
#, c-format
msgid "1 line %sed 1 time"
msgstr "1 ่กŒใŒ %s ใง 1 ๅ›žๅ‡ฆ็†ใ•ใ‚Œใพใ—ใŸ"
-#: ../ops.c:250
#, c-format
msgid "1 line %sed %d times"
msgstr "1 ่กŒใŒ %s ใง %d ๅ›žๅ‡ฆ็†ใ•ใ‚Œใพใ—ใŸ"
-#: ../ops.c:253
#, c-format
-msgid "%<PRId64> lines %sed 1 time"
-msgstr "%<PRId64> ่กŒใŒ %s ใง 1 ๅ›žๅ‡ฆ็†ใ•ใ‚Œใพใ—ใŸ"
+msgid "%ld lines %sed 1 time"
+msgstr "%ld ่กŒใŒ %s ใง 1 ๅ›žๅ‡ฆ็†ใ•ใ‚Œใพใ—ใŸ"
-#: ../ops.c:256
#, c-format
-msgid "%<PRId64> lines %sed %d times"
-msgstr "%<PRId64> ่กŒใŒ %s ใง %d ๅ›žๅ‡ฆ็†ใ•ใ‚Œใพใ—ใŸ"
+msgid "%ld lines %sed %d times"
+msgstr "%ld ่กŒใŒ %s ใง %d ๅ›žๅ‡ฆ็†ใ•ใ‚Œใพใ—ใŸ"
-#: ../ops.c:592
#, c-format
-msgid "%<PRId64> lines to indent... "
-msgstr "%<PRId64> ่กŒใŒใ‚คใƒณใƒ‡ใƒณใƒˆใ•ใ‚Œใพใ™... "
+msgid "%ld lines to indent... "
+msgstr "%ld ่กŒใŒใ‚คใƒณใƒ‡ใƒณใƒˆใ•ใ‚Œใพใ™... "
-#: ../ops.c:634
msgid "1 line indented "
msgstr "1 ่กŒใ‚’ใ‚คใƒณใƒ‡ใƒณใƒˆใ—ใพใ—ใŸ "
-#: ../ops.c:636
#, c-format
-msgid "%<PRId64> lines indented "
-msgstr "%<PRId64> ่กŒใ‚’ใ‚คใƒณใƒ‡ใƒณใƒˆใ—ใพใ—ใŸ "
+msgid "%ld lines indented "
+msgstr "%ld ่กŒใ‚’ใ‚คใƒณใƒ‡ใƒณใƒˆใ—ใพใ—ใŸ "
-#: ../ops.c:938
msgid "E748: No previously used register"
msgstr "E748: ใพใ ใƒฌใ‚ธใ‚นใ‚ฟใ‚’ไฝฟ็”จใ—ใฆใ„ใพใ›ใ‚“"
-#. must display the prompt
-#: ../ops.c:1433
msgid "cannot yank; delete anyway"
msgstr "ใƒคใƒณใ‚ฏใงใใพใ›ใ‚“; ใจใซใ‹ใๆถˆๅŽป"
-#: ../ops.c:1929
msgid "1 line changed"
msgstr "1 ่กŒใŒๅค‰ๆ›ดใ•ใ‚Œใพใ—ใŸ"
-#: ../ops.c:1931
#, c-format
-msgid "%<PRId64> lines changed"
-msgstr "%<PRId64> ่กŒใŒๅค‰ๆ›ดใ•ใ‚Œใพใ—ใŸ"
+msgid "%ld lines changed"
+msgstr "%ld ่กŒใŒๅค‰ๆ›ดใ•ใ‚Œใพใ—ใŸ"
-#: ../ops.c:2521
-msgid "block of 1 line yanked"
-msgstr "1 ่กŒใฎใƒ–ใƒญใƒƒใ‚ฏใŒใƒคใƒณใ‚ฏใ•ใ‚Œใพใ—ใŸ"
+#, c-format
+msgid "freeing %ld lines"
+msgstr "%ld ่กŒใ‚’่งฃๆ”พไธญ"
-#: ../ops.c:2523
-msgid "1 line yanked"
-msgstr "1 ่กŒใŒใƒคใƒณใ‚ฏใ•ใ‚Œใพใ—ใŸ"
+#, c-format
+msgid " into \"%c"
+msgstr " \"%c ใซ"
-#: ../ops.c:2525
#, c-format
-msgid "block of %<PRId64> lines yanked"
-msgstr "%<PRId64> ่กŒใฎใƒ–ใƒญใƒƒใ‚ฏใŒใƒคใƒณใ‚ฏใ•ใ‚Œใพใ—ใŸ"
+msgid "block of 1 line yanked%s"
+msgstr "1 ่กŒใฎใƒ–ใƒญใƒƒใ‚ฏใŒ%sใƒคใƒณใ‚ฏใ•ใ‚Œใพใ—ใŸ"
-#: ../ops.c:2528
#, c-format
-msgid "%<PRId64> lines yanked"
-msgstr "%<PRId64> ่กŒใŒใƒคใƒณใ‚ฏใ•ใ‚Œใพใ—ใŸ"
+msgid "1 line yanked%s"
+msgstr "1 ่กŒใŒ%sใƒคใƒณใ‚ฏใ•ใ‚Œใพใ—ใŸ"
+
+#, c-format
+msgid "block of %ld lines yanked%s"
+msgstr "%ld ่กŒใฎใƒ–ใƒญใƒƒใ‚ฏใŒ%sใƒคใƒณใ‚ฏใ•ใ‚Œใพใ—ใŸ"
+
+#, c-format
+msgid "%ld lines yanked%s"
+msgstr "%ld ่กŒใŒ%sใƒคใƒณใ‚ฏใ•ใ‚Œใพใ—ใŸ"
-#: ../ops.c:2710
#, c-format
msgid "E353: Nothing in register %s"
msgstr "E353: ใƒฌใ‚ธใ‚นใ‚ฟ %s ใซใฏไฝ•ใ‚‚ใ‚ใ‚Šใพใ›ใ‚“"
-#. Highlight title
-#: ../ops.c:3185
msgid ""
"\n"
"--- Registers ---"
@@ -4494,11 +4183,9 @@ msgstr ""
"\n"
"--- ใƒฌใ‚ธใ‚นใ‚ฟ ---"
-#: ../ops.c:4455
msgid "Illegal register name"
msgstr "ไธๆญฃใชใƒฌใ‚ธใ‚นใ‚ฟๅ"
-#: ../ops.c:4533
msgid ""
"\n"
"# Registers:\n"
@@ -4506,7 +4193,6 @@ msgstr ""
"\n"
"# ใƒฌใ‚ธใ‚นใ‚ฟ:\n"
-#: ../ops.c:4575
#, c-format
msgid "E574: Unknown register type %d"
msgstr "E574: ๆœช็Ÿฅใฎใƒฌใ‚ธใ‚นใ‚ฟๅž‹ %d ใงใ™"
@@ -4516,86 +4202,58 @@ msgid ""
"lines"
msgstr "E883: ๆคœ็ดขใƒ‘ใ‚ฟใƒผใƒณใจๅผใƒฌใ‚ธใ‚นใ‚ฟใซใฏ2่กŒไปฅไธŠใ‚’ๅซใ‚ใ‚‰ใ‚Œใพใ›ใ‚“"
-#: ../ops.c:5089
#, c-format
-msgid "%<PRId64> Cols; "
-msgstr "%<PRId64> ๅˆ—; "
+msgid "%ld Cols; "
+msgstr "%ld ๅˆ—; "
-#: ../ops.c:5097
#, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Bytes"
-msgstr ""
-"้ธๆŠž %s%<PRId64> / %<PRId64> ่กŒ; %<PRId64> / %<PRId64> ๅ˜่ชž; %<PRId64> / "
-"%<PRId64> ใƒใ‚คใƒˆ"
+msgid "Selected %s%ld of %ld Lines; %lld of %lld Words; %lld of %lld Bytes"
+msgstr "้ธๆŠž %s%ld / %ld ่กŒ; %lld / %lld ๅ˜่ชž; %lld / %lld ใƒใ‚คใƒˆ"
-#: ../ops.c:5105
#, c-format
msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Chars; %<PRId64> of %<PRId64> Bytes"
+"Selected %s%ld of %ld Lines; %lld of %lld Words; %lld of %lld Chars; %lld of "
+"%lld Bytes"
msgstr ""
-"้ธๆŠž %s%<PRId64> / %<PRId64> ่กŒ; %<PRId64> / %<PRId64> ๅ˜่ชž; %<PRId64> / "
-"%<PRId64> ๆ–‡ๅญ—; %<PRId64> / %<PRId64> ใƒใ‚คใƒˆ"
+"้ธๆŠž %s%ld / %ld ่กŒ; %lld / %lld ๅ˜่ชž; %lld / %lld ๆ–‡ๅญ—; %lld / %lld ใƒใ‚คใƒˆ"
-#: ../ops.c:5123
#, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Byte "
-"%<PRId64> of %<PRId64>"
-msgstr ""
-"ๅˆ— %s / %s; ่กŒ %<PRId64> of %<PRId64>; ๅ˜่ชž %<PRId64> / %<PRId64>; ใƒใ‚คใƒˆ "
-"%<PRId64> / %<PRId64>"
+msgid "Col %s of %s; Line %ld of %ld; Word %lld of %lld; Byte %lld of %lld"
+msgstr "ๅˆ— %s / %s; ่กŒ %ld of %ld; ๅ˜่ชž %lld / %lld; ใƒใ‚คใƒˆ %lld / %lld"
-#: ../ops.c:5133
#, c-format
msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Char "
-"%<PRId64> of %<PRId64>; Byte %<PRId64> of %<PRId64>"
+"Col %s of %s; Line %ld of %ld; Word %lld of %lld; Char %lld of %lld; Byte "
+"%lld of %lld"
msgstr ""
-"ๅˆ— %s / %s; ่กŒ %<PRId64> / %<PRId64>; ๅ˜่ชž %<PRId64> / %<PRId64>; ๆ–‡ๅญ— "
-"%<PRId64> / %<PRId64>; ใƒใ‚คใƒˆ %<PRId64> of %<PRId64>"
+"ๅˆ— %s / %s; ่กŒ %ld / %ld; ๅ˜่ชž %lld / %lld; ๆ–‡ๅญ— %lld / %lld; ใƒใ‚คใƒˆ %lld of "
+"%lld"
-#: ../ops.c:5146
#, c-format
-msgid "(+%<PRId64> for BOM)"
-msgstr "(+%<PRId64> for BOM)"
+msgid "(+%lld for BOM)"
+msgstr "(+%lld for BOM)"
-#: ../option.c:1238
-msgid "%<%f%h%m%=Page %N"
-msgstr "%<%f%h%m%=%N ใƒšใƒผใ‚ธ"
-
-#: ../option.c:1574
msgid "Thanks for flying Vim"
msgstr "Vim ใ‚’ไฝฟใฃใฆใใ‚Œใฆใ‚ใ‚ŠใŒใจใ†"
-#. found a mismatch: skip
-#: ../option.c:2698
msgid "E518: Unknown option"
msgstr "E518: ๆœช็Ÿฅใฎใ‚ชใƒ—ใ‚ทใƒงใƒณใงใ™"
-#: ../option.c:2709
msgid "E519: Option not supported"
msgstr "E519: ใ‚ชใƒ—ใ‚ทใƒงใƒณใฏใ‚ตใƒใƒผใƒˆใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#: ../option.c:2740
msgid "E520: Not allowed in a modeline"
msgstr "E520: modeline ใงใฏ่จฑๅฏใ•ใ‚Œใพใ›ใ‚“"
-#: ../option.c:2815
msgid "E846: Key code not set"
msgstr "E846: ใ‚ญใƒผใ‚ณใƒผใƒ‰ใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#: ../option.c:2924
msgid "E521: Number required after ="
msgstr "E521: = ใฎๅพŒใซใฏๆ•ฐๅญ—ใŒๅฟ…่ฆใงใ™"
-#: ../option.c:3226 ../option.c:3864
msgid "E522: Not found in termcap"
msgstr "E522: termcap ๅ†…ใซ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-#: ../option.c:3335
#, c-format
msgid "E539: Illegal character <%s>"
msgstr "E539: ไธๆญฃใชๆ–‡ๅญ—ใงใ™ <%s>"
@@ -4604,106 +4262,117 @@ msgstr "E539: ไธๆญฃใชๆ–‡ๅญ—ใงใ™ <%s>"
msgid "For option %s"
msgstr "ใ‚ชใƒ—ใ‚ทใƒงใƒณ: %s"
-#: ../option.c:3862
msgid "E529: Cannot set 'term' to empty string"
msgstr "E529: 'term' ใซใฏ็ฉบๆ–‡ๅญ—ๅˆ—ใ‚’่จญๅฎšใงใใพใ›ใ‚“"
-#: ../option.c:3885
+msgid "E530: Cannot change term in GUI"
+msgstr "E530: GUIใงใฏ 'term' ใ‚’ๅค‰ๆ›ดใงใใพใ›ใ‚“"
+
+msgid "E531: Use \":gui\" to start the GUI"
+msgstr "E531: GUIใ‚’ใ‚นใ‚ฟใƒผใƒˆใ™ใ‚‹ใซใฏ \":gui\" ใ‚’ไฝฟ็”จใ—ใฆใใ ใ•ใ„"
+
msgid "E589: 'backupext' and 'patchmode' are equal"
msgstr "E589: 'backupext' ใจ 'patchmode' ใŒๅŒใ˜ใงใ™"
-#: ../option.c:3964
msgid "E834: Conflicts with value of 'listchars'"
msgstr "E834: 'listchars'ใฎๅ€คใซ็Ÿ›็›พใŒใ‚ใ‚Šใพใ™"
-#: ../option.c:3966
msgid "E835: Conflicts with value of 'fillchars'"
msgstr "E835: 'fillchars'ใฎๅ€คใซ็Ÿ›็›พใŒใ‚ใ‚Šใพใ™"
-#: ../option.c:4163
+msgid "E617: Cannot be changed in the GTK+ 2 GUI"
+msgstr "E617: GTK+2 GUIใงใฏๅค‰ๆ›ดใงใใพใ›ใ‚“"
+
+#, c-format
+msgid "E950: Cannot convert between %s and %s"
+msgstr "E950: %s ใจ %s ใฎ้–“ใงๅค‰ๆ›ใงใใพใ›ใ‚“"
+
msgid "E524: Missing colon"
msgstr "E524: ใ‚ณใƒญใƒณใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../option.c:4165
msgid "E525: Zero length string"
msgstr "E525: ๆ–‡ๅญ—ๅˆ—ใฎ้•ทใ•ใŒใ‚ผใƒญใงใ™"
-#: ../option.c:4220
#, c-format
msgid "E526: Missing number after <%s>"
msgstr "E526: <%s> ใฎๅพŒใซๆ•ฐๅญ—ใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../option.c:4232
msgid "E527: Missing comma"
msgstr "E527: ใ‚ซใƒณใƒžใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../option.c:4239
msgid "E528: Must specify a ' value"
msgstr "E528: ' ใฎๅ€คใ‚’ๆŒ‡ๅฎšใ—ใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“"
-#: ../option.c:4271
msgid "E595: contains unprintable or wide character"
msgstr "E595: ่กจ็คบใงใใชใ„ๆ–‡ๅญ—ใ‹ใƒฏใ‚คใƒ‰ๆ–‡ๅญ—ใ‚’ๅซใ‚“ใงใ„ใพใ™"
-#: ../option.c:4469
+msgid "E596: Invalid font(s)"
+msgstr "E596: ็„กๅŠนใชใƒ•ใ‚ฉใƒณใƒˆใงใ™"
+
+msgid "E597: can't select fontset"
+msgstr "E597: ใƒ•ใ‚ฉใƒณใƒˆใ‚ปใƒƒใƒˆใ‚’้ธๆŠžใงใใพใ›ใ‚“"
+
+msgid "E598: Invalid fontset"
+msgstr "E598: ็„กๅŠนใชใƒ•ใ‚ฉใƒณใƒˆใ‚ปใƒƒใƒˆใงใ™"
+
+msgid "E533: can't select wide font"
+msgstr "E533: ใƒฏใ‚คใƒ‰ใƒ•ใ‚ฉใƒณใƒˆใ‚’้ธๆŠžใงใใพใ›ใ‚“"
+
+msgid "E534: Invalid wide font"
+msgstr "E534: ็„กๅŠนใชใƒฏใ‚คใƒ‰ใƒ•ใ‚ฉใƒณใƒˆใงใ™"
+
#, c-format
msgid "E535: Illegal character after <%c>"
msgstr "E535: <%c> ใฎๅพŒใซไธๆญฃใชๆ–‡ๅญ—ใŒใ‚ใ‚Šใพใ™"
-#: ../option.c:4534
msgid "E536: comma required"
msgstr "E536: ใ‚ซใƒณใƒžใŒๅฟ…่ฆใงใ™"
-#: ../option.c:4543
#, c-format
msgid "E537: 'commentstring' must be empty or contain %s"
msgstr "E537: 'commentstring' ใฏ็ฉบใงใ‚ใ‚‹ใ‹ %s ใ‚’ๅซใ‚€ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™"
-#: ../option.c:4928
+msgid "E538: No mouse support"
+msgstr "E538: ใƒžใ‚ฆใ‚นใฏใ‚ตใƒใƒผใƒˆใ•ใ‚Œใพใ›ใ‚“"
+
msgid "E540: Unclosed expression sequence"
msgstr "E540: ๅผใŒ็ต‚ไบ†ใ—ใฆใ„ใพใ›ใ‚“"
-#: ../option.c:4932
msgid "E541: too many items"
msgstr "E541: ่ฆ็ด ใŒๅคš้ŽใŽใพใ™"
-#: ../option.c:4934
msgid "E542: unbalanced groups"
msgstr "E542: ใ‚ฐใƒซใƒผใƒ—ใŒ้‡ฃๅˆใ„ใพใ›ใ‚“"
-#: ../option.c:5148
+msgid "E946: Cannot make a terminal with running job modifiable"
+msgstr "E946: ๅฎŸ่กŒไธญใฎใ‚ธใƒงใƒ–ใŒใ‚ใ‚‹็ซฏๆœซใฏๅค‰ๆ›ดๅฏ่ƒฝใซใงใใพใ›ใ‚“"
+
msgid "E590: A preview window already exists"
msgstr "E590: ใƒ—ใƒฌใƒ“ใƒฅใƒผใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใŒๆ—ขใซๅญ˜ๅœจใ—ใพใ™"
-#: ../option.c:5311
msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'"
msgstr ""
-"W17: ใ‚ขใƒฉใƒ“ใ‚ขๆ–‡ๅญ—ใซใฏUTF-8ใŒๅฟ…่ฆใชใฎใง, ':set encoding=utf-8' ใ—ใฆใใ ใ•ใ„"
+"W17: ใ‚ขใƒฉใƒ“ใ‚ขๆ–‡ๅญ—ใซใฏUTF-8ใŒๅฟ…่ฆใชใฎใงใ€':set encoding=utf-8' ใ—ใฆใใ ใ•ใ„"
+
+msgid "E954: 24-bit colors are not supported on this environment"
+msgstr "E954: 24bit่‰ฒใฏใ“ใฎ็’ฐๅขƒใงใฏใ‚ตใƒใƒผใƒˆใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#: ../option.c:5623
#, c-format
msgid "E593: Need at least %d lines"
msgstr "E593: ๆœ€ไฝŽ %d ใฎ่กŒๆ•ฐใŒๅฟ…่ฆใงใ™"
-#: ../option.c:5631
#, c-format
msgid "E594: Need at least %d columns"
msgstr "E594: ๆœ€ไฝŽ %d ใฎใ‚ซใƒฉใƒ ๅน…ใŒๅฟ…่ฆใงใ™"
-#: ../option.c:6011
#, c-format
msgid "E355: Unknown option: %s"
msgstr "E355: ๆœช็Ÿฅใฎใ‚ชใƒ—ใ‚ทใƒงใƒณใงใ™: %s"
-#. There's another character after zeros or the string
-#. * is empty. In both cases, we are trying to set a
-#. * num option using a string.
-#: ../option.c:6037
#, c-format
msgid "E521: Number required: &%s = '%s'"
msgstr "E521: ๆ•ฐๅญ—ใŒๅฟ…่ฆใงใ™: &%s = '%s'"
-#: ../option.c:6149
msgid ""
"\n"
"--- Terminal codes ---"
@@ -4711,7 +4380,6 @@ msgstr ""
"\n"
"--- ็ซฏๆœซใ‚ณใƒผใƒ‰ ---"
-#: ../option.c:6151
msgid ""
"\n"
"--- Global option values ---"
@@ -4719,7 +4387,6 @@ msgstr ""
"\n"
"--- ใ‚ฐใƒญใƒผใƒใƒซใ‚ชใƒ—ใ‚ทใƒงใƒณๅ€ค ---"
-#: ../option.c:6153
msgid ""
"\n"
"--- Local option values ---"
@@ -4727,7 +4394,6 @@ msgstr ""
"\n"
"--- ใƒญใƒผใ‚ซใƒซใ‚ชใƒ—ใ‚ทใƒงใƒณๅ€ค ---"
-#: ../option.c:6155
msgid ""
"\n"
"--- Options ---"
@@ -4735,37 +4401,115 @@ msgstr ""
"\n"
"--- ใ‚ชใƒ—ใ‚ทใƒงใƒณ ---"
-#: ../option.c:6816
msgid "E356: get_varp ERROR"
msgstr "E356: get_varp ใ‚จใƒฉใƒผ"
-#: ../option.c:7696
#, c-format
msgid "E357: 'langmap': Matching character missing for %s"
msgstr "E357: 'langmap': %s ใซๅฏพๅฟœใ™ใ‚‹ๆ–‡ๅญ—ใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../option.c:7715
#, c-format
msgid "E358: 'langmap': Extra characters after semicolon: %s"
msgstr "E358: 'langmap': ใ‚ปใƒŸใ‚ณใƒญใƒณใฎๅพŒใซไฝ™ๅˆ†ใชๆ–‡ๅญ—ใŒใ‚ใ‚Šใพใ™: %s"
-#: ../os/shell.c:194
-msgid ""
-"\n"
-"Cannot execute shell "
-msgstr ""
-"\n"
-"ใ‚ทใ‚งใƒซใ‚’ๅฎŸ่กŒใงใใพใ›ใ‚“ "
+msgid "cannot open "
+msgstr "้–‹ใ‘ใพใ›ใ‚“ "
+
+msgid "VIM: Can't open window!\n"
+msgstr "VIM: ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚’้–‹ใ‘ใพใ›ใ‚“!\n"
+
+msgid "Need Amigados version 2.04 or later\n"
+msgstr "Amigadosใฎใƒใƒผใ‚ธใƒงใƒณ 2.04ใ‹ใใ‚Œไปฅ้™ใŒๅฟ…่ฆใงใ™\n"
+
+#, c-format
+msgid "Need %s version %ld\n"
+msgstr "%s ใฎใƒใƒผใ‚ธใƒงใƒณ %ld ใŒๅฟ…่ฆใงใ™\n"
+
+msgid "Cannot open NIL:\n"
+msgstr "NILใ‚’้–‹ใ‘ใพใ›ใ‚“:\n"
+
+msgid "Cannot create "
+msgstr "ไฝœๆˆใงใใพใ›ใ‚“ "
+
+#, c-format
+msgid "Vim exiting with %d\n"
+msgstr "Vimใฏ %d ใง็ต‚ไบ†ใ—ใพใ™\n"
+
+msgid "cannot change console mode ?!\n"
+msgstr "ใ‚ณใƒณใ‚ฝใƒผใƒซใƒขใƒผใƒ‰ใ‚’ๅค‰ๆ›ดใงใใพใ›ใ‚“?!\n"
+
+msgid "mch_get_shellsize: not a console??\n"
+msgstr "mch_get_shellsize: ใ‚ณใƒณใ‚ฝใƒผใƒซใงใฏใชใ„??\n"
+
+msgid "E360: Cannot execute shell with -f option"
+msgstr "E360: -f ใ‚ชใƒ—ใ‚ทใƒงใƒณใงใ‚ทใ‚งใƒซใ‚’ๅฎŸ่กŒใงใใพใ›ใ‚“"
+
+msgid "Cannot execute "
+msgstr "ๅฎŸ่กŒใงใใพใ›ใ‚“ "
+
+msgid "shell "
+msgstr "ใ‚ทใ‚งใƒซ "
+
+msgid " returned\n"
+msgstr " ๆˆปใ‚Šใพใ—ใŸ\n"
+
+msgid "ANCHOR_BUF_SIZE too small."
+msgstr "ANCHOR_BUF_SIZE ใŒๅฐใ•้ŽใŽใพใ™."
+
+msgid "I/O ERROR"
+msgstr "ๅ…ฅๅ‡บๅŠ›ใ‚จใƒฉใƒผ"
+
+msgid "Message"
+msgstr "ใƒกใƒƒใ‚ปใƒผใ‚ธ"
+
+msgid "E237: Printer selection failed"
+msgstr "E237: ใƒ—ใƒชใƒณใ‚ฟใฎ้ธๆŠžใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+
+#, c-format
+msgid "to %s on %s"
+msgstr "%s ใธ (%s ไธŠใฎ)"
+
+#, c-format
+msgid "E613: Unknown printer font: %s"
+msgstr "E613: ๆœช็Ÿฅใฎใƒ—ใƒชใƒณใ‚ฟใ‚ชใƒ—ใ‚ทใƒงใƒณใงใ™: %s"
+
+#, c-format
+msgid "E238: Print error: %s"
+msgstr "E238: ๅฐๅˆทใ‚จใƒฉใƒผ: %s"
+
+#, c-format
+msgid "Printing '%s'"
+msgstr "ๅฐๅˆทใ—ใฆใ„ใพใ™: '%s'"
+
+#, c-format
+msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
+msgstr "E244: ๆ–‡ๅญ—ใ‚ปใƒƒใƒˆๅ \"%s\" ใฏไธๆญฃใงใ™ (ใƒ•ใ‚ฉใƒณใƒˆๅ \"%s\")"
+
+#, c-format
+msgid "E244: Illegal quality name \"%s\" in font name \"%s\""
+msgstr "E244: ๅ“่ณชๅ \"%s\" ใฏไธๆญฃใงใ™ (ใƒ•ใ‚ฉใƒณใƒˆๅ \"%s\")"
+
+#, c-format
+msgid "E245: Illegal char '%c' in font name \"%s\""
+msgstr "E245: '%c' ใฏไธๆญฃใชๆ–‡ๅญ—ใงใ™ (ใƒ•ใ‚ฉใƒณใƒˆๅ \"%s\")"
+
+#, c-format
+msgid "Opening the X display took %ld msec"
+msgstr "Xใ‚ตใƒผใƒใƒผใธใฎๆŽฅ็ถšใซ %ld ใƒŸใƒช็ง’ใ‹ใ‹ใ‚Šใพใ—ใŸ"
-#: ../os/shell.c:439
msgid ""
"\n"
-"shell returned "
+"Vim: Got X error\n"
msgstr ""
"\n"
-"ใ‚ทใ‚งใƒซใŒๅ€คใ‚’่ฟ”ใ—ใพใ—ใŸ "
+"Vim: X ใฎใ‚จใƒฉใƒผใ‚’ๆคœๅ‡บใ—ใพใ—ใŸr\n"
+
+msgid "Testing the X display failed"
+msgstr "X display ใฎใƒใ‚งใƒƒใ‚ฏใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+
+msgid "Opening the X display timed out"
+msgstr "X display ใฎ open ใŒใ‚ฟใ‚คใƒ ใ‚ขใ‚ฆใƒˆใ—ใพใ—ใŸ"
-#: ../os_unix.c:465 ../os_unix.c:471
msgid ""
"\n"
"Could not get security context for "
@@ -4773,7 +4517,6 @@ msgstr ""
"\n"
"ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใ‚ณใƒณใƒ†ใ‚ญใ‚นใƒˆใ‚’ๅ–ๅพ—ใงใใพใ›ใ‚“ "
-#: ../os_unix.c:479
msgid ""
"\n"
"Could not set security context for "
@@ -4789,223 +4532,289 @@ msgstr "ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใ‚ณใƒณใƒ†ใ‚ญใ‚นใƒˆ %s ใ‚’ %s ใซ่จญๅฎšใงใใพใ›ใ‚“"
msgid "Could not get security context %s for %s. Removing it!"
msgstr "ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใ‚ณใƒณใƒ†ใ‚ญใ‚นใƒˆ %s ใ‚’ %s ใ‹ใ‚‰ๅ–ๅพ—ใงใใพใ›ใ‚“. ๅ‰Š้™คใ—ใพใ™!"
-#: ../os_unix.c:1558 ../os_unix.c:1647
+msgid ""
+"\n"
+"Cannot execute shell sh\n"
+msgstr ""
+"\n"
+"sh ใ‚ทใ‚งใƒซใ‚’ๅฎŸ่กŒใงใใพใ›ใ‚“\n"
+
+msgid ""
+"\n"
+"shell returned "
+msgstr ""
+"\n"
+"ใ‚ทใ‚งใƒซใŒๅ€คใ‚’่ฟ”ใ—ใพใ—ใŸ "
+
+msgid ""
+"\n"
+"Cannot create pipes\n"
+msgstr ""
+"\n"
+"ใƒ‘ใ‚คใƒ—ใ‚’ไฝœๆˆใงใใพใ›ใ‚“\n"
+
+msgid ""
+"\n"
+"Cannot fork\n"
+msgstr ""
+"\n"
+"fork ใงใใพใ›ใ‚“\n"
+
+msgid ""
+"\n"
+"Cannot execute shell "
+msgstr ""
+"\n"
+"ใ‚ทใ‚งใƒซใ‚’ๅฎŸ่กŒใงใใพใ›ใ‚“ "
+
+msgid ""
+"\n"
+"Command terminated\n"
+msgstr ""
+"\n"
+"ใ‚ณใƒžใƒณใƒ‰ใ‚’ไธญๆ–ญใ—ใพใ—ใŸ\n"
+
+msgid "XSMP lost ICE connection"
+msgstr "XSMP ใŒICEๆŽฅ็ถšใ‚’ๅคฑใ„ใพใ—ใŸ"
+
#, c-format
msgid "dlerror = \"%s\""
msgstr "dlerror = \"%s\""
-#: ../path.c:1449
+msgid "Opening the X display failed"
+msgstr "X display ใฎ open ใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+
+msgid "XSMP handling save-yourself request"
+msgstr "XSMP ใŒsave-yourself่ฆๆฑ‚ใ‚’ๅ‡ฆ็†ใ—ใฆใ„ใพใ™"
+
+msgid "XSMP opening connection"
+msgstr "XSMP ใŒๆŽฅ็ถšใ‚’้–‹ๅง‹ใ—ใฆใ„ใพใ™"
+
+msgid "XSMP ICE connection watch failed"
+msgstr "XSMP ICEๆŽฅ็ถšใŒๅคฑๆ•—ใ—ใŸใ‚ˆใ†ใงใ™"
+
#, c-format
-msgid "E447: Can't find file \"%s\" in path"
-msgstr "E447: pathใซใฏ \"%s\" ใจใ„ใ†ใƒ•ใ‚กใ‚คใƒซใŒใ‚ใ‚Šใพใ›ใ‚“"
+msgid "XSMP SmcOpenConnection failed: %s"
+msgstr "XSMP SmcOpenConnectionใŒๅคฑๆ•—ใ—ใพใ—ใŸ: %s"
+
+msgid "At line"
+msgstr "่กŒ"
+
+msgid "Could not load vim32.dll!"
+msgstr "vim32.dll ใ‚’ใƒญใƒผใƒ‰ใงใใพใ›ใ‚“ใงใ—ใŸ"
+
+msgid "VIM Error"
+msgstr "VIMใ‚จใƒฉใƒผ"
+
+msgid "Could not fix up function pointers to the DLL!"
+msgstr "DLLใ‹ใ‚‰้–ขๆ•ฐใƒใ‚คใƒณใ‚ฟใ‚’ๅ–ๅพ—ใงใใพใ›ใ‚“ใงใ—ใŸ"
+
+#, c-format
+msgid "Vim: Caught %s event\n"
+msgstr "Vim: ใ‚คใƒ™ใƒณใƒˆ %s ใ‚’ๆคœ็Ÿฅ\n"
+
+msgid "close"
+msgstr "้–‰ใ˜ใ‚‹"
+
+msgid "logoff"
+msgstr "ใƒญใ‚ฐใ‚ชใƒ•"
+
+msgid "shutdown"
+msgstr "ใ‚ทใƒฃใƒƒใƒˆใƒ€ใ‚ฆใƒณ"
+
+msgid "E371: Command not found"
+msgstr "E371: ใ‚ณใƒžใƒณใƒ‰ใŒใ‚ใ‚Šใพใ›ใ‚“"
+
+msgid ""
+"VIMRUN.EXE not found in your $PATH.\n"
+"External commands will not pause after completion.\n"
+"See :help win32-vimrun for more information."
+msgstr ""
+"VIMRUN.EXEใŒ $PATH ใฎไธญใซ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“.\n"
+"ๅค–้ƒจใ‚ณใƒžใƒณใƒ‰ใฎ็ต‚ไบ†ๅพŒใซไธ€ๆ™‚ๅœๆญขใ‚’ใ—ใพใ›ใ‚“.\n"
+"่ฉณ็ดฐใฏ :help win32-vimrun ใ‚’ๅ‚็…งใ—ใฆใใ ใ•ใ„."
+
+msgid "Vim Warning"
+msgstr "Vimใฎ่ญฆๅ‘Š"
+
+#, c-format
+msgid "shell returned %d"
+msgstr "ใ‚ทใ‚งใƒซใŒใ‚ณใƒผใƒ‰ %d ใง็ต‚ไบ†ใ—ใพใ—ใŸ"
+
+msgid "E926: Current location list was changed"
+msgstr "E926: ็พๅœจใฎใƒญใ‚ฑใƒผใ‚ทใƒงใƒณใƒชใ‚นใƒˆใŒๅค‰ๆ›ดใ•ใ‚Œใพใ—ใŸ"
-#: ../quickfix.c:359
#, c-format
msgid "E372: Too many %%%c in format string"
msgstr "E372: ใƒ•ใ‚ฉใƒผใƒžใƒƒใƒˆๆ–‡ๅญ—ๅˆ—ใซ %%%c ใŒๅคš้ŽใŽใพใ™"
-#: ../quickfix.c:371
#, c-format
msgid "E373: Unexpected %%%c in format string"
msgstr "E373: ใƒ•ใ‚ฉใƒผใƒžใƒƒใƒˆๆ–‡ๅญ—ๅˆ—ใซไบˆๆœŸใ›ใฌ %%%c ใŒใ‚ใ‚Šใพใ—ใŸ"
-#: ../quickfix.c:420
msgid "E374: Missing ] in format string"
msgstr "E374: ใƒ•ใ‚ฉใƒผใƒžใƒƒใƒˆๆ–‡ๅญ—ๅˆ—ใซ ] ใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../quickfix.c:431
#, c-format
msgid "E375: Unsupported %%%c in format string"
msgstr "E375: ใƒ•ใ‚ฉใƒผใƒžใƒƒใƒˆๆ–‡ๅญ—ๅˆ—ใงใฏ %%%c ใฏใ‚ตใƒใƒผใƒˆใ•ใ‚Œใพใ›ใ‚“"
-#: ../quickfix.c:448
#, c-format
msgid "E376: Invalid %%%c in format string prefix"
msgstr "E376: ใƒ•ใ‚ฉใƒผใƒžใƒƒใƒˆๆ–‡ๅญ—ๅˆ—ใฎๅ‰็ฝฎใซ็„กๅŠนใช %%%c ใŒใ‚ใ‚Šใพใ™"
-#: ../quickfix.c:454
#, c-format
msgid "E377: Invalid %%%c in format string"
msgstr "E377: ใƒ•ใ‚ฉใƒผใƒžใƒƒใƒˆๆ–‡ๅญ—ๅˆ—ใซ็„กๅŠนใช %%%c ใŒใ‚ใ‚Šใพใ™"
-#. nothing found
-#: ../quickfix.c:477
msgid "E378: 'errorformat' contains no pattern"
msgstr "E378: 'errorformat' ใซใƒ‘ใ‚ฟใƒผใƒณใŒๆŒ‡ๅฎšใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#: ../quickfix.c:695
msgid "E379: Missing or empty directory name"
msgstr "E379: ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชๅใŒ็„กใ„ใ‹็ฉบใงใ™"
-#: ../quickfix.c:1305
msgid "E553: No more items"
msgstr "E553: ่ฆ็ด ใŒใ‚‚ใ†ใ‚ใ‚Šใพใ›ใ‚“"
-#: ../quickfix.c:1674
+msgid "E924: Current window was closed"
+msgstr "E924: ็พๅœจใฎใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใŒ้–‰ใ˜ใ‚‰ใ‚Œใพใ—ใŸ"
+
+msgid "E925: Current quickfix was changed"
+msgstr "E925: ็พๅœจใฎ quickfix ใŒๅค‰ๆ›ดใ•ใ‚Œใพใ—ใŸ"
+
#, c-format
msgid "(%d of %d)%s%s: "
msgstr "(%d of %d)%s%s: "
-#: ../quickfix.c:1676
msgid " (line deleted)"
msgstr " (่กŒใŒๅ‰Š้™คใ•ใ‚Œใพใ—ใŸ)"
-#: ../quickfix.c:1863
+#, c-format
+msgid "%serror list %d of %d; %d errors "
+msgstr "%s ใ‚จใƒฉใƒผไธ€่ฆง %d of %d; %d ๅ€‹ใ‚จใƒฉใƒผ"
+
msgid "E380: At bottom of quickfix stack"
msgstr "E380: quickfix ใ‚นใ‚ฟใƒƒใ‚ฏใฎๆœซๅฐพใงใ™"
-#: ../quickfix.c:1869
msgid "E381: At top of quickfix stack"
msgstr "E381: quickfix ใ‚นใ‚ฟใƒƒใ‚ฏใฎๅ…ˆ้ ญใงใ™"
-#: ../quickfix.c:1880
-#, c-format
-msgid "error list %d of %d; %d errors"
-msgstr "ใ‚จใƒฉใƒผไธ€่ฆง %d of %d; %d ๅ€‹ใ‚จใƒฉใƒผ"
+msgid "No entries"
+msgstr "ใ‚จใƒณใƒˆใƒชใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../quickfix.c:2427
-msgid "E382: Cannot write, 'buftype' option is set"
-msgstr "E382: 'buftype' ใ‚ชใƒ—ใ‚ทใƒงใƒณใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใ‚‹ใฎใงๆ›ธ่พผใฟใพใ›ใ‚“"
+msgid "Error file"
+msgstr "ใ‚จใƒฉใƒผใƒ•ใ‚กใ‚คใƒซ"
-#: ../quickfix.c:2812
msgid "E683: File name missing or invalid pattern"
msgstr "E683: ใƒ•ใ‚กใ‚คใƒซๅใŒ็„กใ„ใ‹็„กๅŠนใชใƒ‘ใ‚ฟใƒผใƒณใงใ™"
-#: ../quickfix.c:2911
#, c-format
msgid "Cannot open file \"%s\""
msgstr "ใƒ•ใ‚กใ‚คใƒซ \"%s\" ใ‚’้–‹ใ‘ใพใ›ใ‚“"
-#: ../quickfix.c:3429
msgid "E681: Buffer is not loaded"
msgstr "E681: ใƒใƒƒใƒ•ใ‚กใฏ่ชญใฟ่พผใพใ‚Œใพใ›ใ‚“ใงใ—ใŸ"
-#: ../quickfix.c:3487
msgid "E777: String or List expected"
msgstr "E777: ๆ–‡ๅญ—ๅˆ—ใ‹ใƒชใ‚นใƒˆใŒๅฟ…่ฆใงใ™"
-#: ../regexp.c:359
#, c-format
msgid "E369: invalid item in %s%%[]"
msgstr "E369: ็„กๅŠนใช้ …็›ฎใงใ™: %s%%[]"
-#
-#: ../regexp.c:374
#, c-format
msgid "E769: Missing ] after %s["
msgstr "E769: %s[ ใฎๅพŒใซ ] ใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../regexp.c:375
+msgid "E944: Reverse range in character class"
+msgstr "E944: ๆ–‡ๅญ—ใ‚ฏใƒฉใ‚นใฎ็ฏ„ๅ›ฒใŒ้€†ใงใ™"
+
+msgid "E945: Range too large in character class"
+msgstr "E945: ๆ–‡ๅญ—ใ‚ฏใƒฉใ‚นใฎ็ฏ„ๅ›ฒใŒๅคงใใ™ใŽใพใ™"
+
#, c-format
msgid "E53: Unmatched %s%%("
msgstr "E53: %s%%( ใŒ้‡ฃใ‚Šๅˆใฃใฆใ„ใพใ›ใ‚“"
-#: ../regexp.c:376
#, c-format
msgid "E54: Unmatched %s("
msgstr "E54: %s( ใŒ้‡ฃใ‚Šๅˆใฃใฆใ„ใพใ›ใ‚“"
-#: ../regexp.c:377
#, c-format
msgid "E55: Unmatched %s)"
msgstr "E55: %s) ใŒ้‡ฃใ‚Šๅˆใฃใฆใ„ใพใ›ใ‚“"
-#
-#: ../regexp.c:378
msgid "E66: \\z( not allowed here"
msgstr "E66: \\z( ใฏใ‚ณใ‚ณใงใฏ่จฑๅฏใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#
-#: ../regexp.c:379
-msgid "E67: \\z1 et al. not allowed here"
-msgstr "E67: \\z1 ใใฎไป–ใฏใ‚ณใ‚ณใงใฏ่จฑๅฏใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
+msgid "E67: \\z1 - \\z9 not allowed here"
+msgstr "E67: \\z1 - \\z9 ใฏใ‚ณใ‚ณใงใฏ่จฑๅฏใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#
-#: ../regexp.c:380
#, c-format
msgid "E69: Missing ] after %s%%["
msgstr "E69: %s%%[ ใฎๅพŒใซ ] ใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../regexp.c:381
#, c-format
msgid "E70: Empty %s%%[]"
msgstr "E70: %s%%[] ใŒ็ฉบใงใ™"
-#: ../regexp.c:1209 ../regexp.c:1224
+msgid "E956: Cannot use pattern recursively"
+msgstr "E956: ใƒ‘ใ‚ฟใƒผใƒณใ‚’ๅ†ๅธฐ็š„ใซไฝฟใ†ใ“ใจใฏใงใใพใ›ใ‚“"
+
+msgid "E65: Illegal back reference"
+msgstr "E65: ไธๆญฃใชๅพŒๆ–นๅ‚็…งใงใ™"
+
msgid "E339: Pattern too long"
msgstr "E339: ใƒ‘ใ‚ฟใƒผใƒณใŒ้•ท้ŽใŽใพใ™"
-#: ../regexp.c:1371
msgid "E50: Too many \\z("
msgstr "E50: \\z( ใŒๅคš้ŽใŽใพใ™"
-#: ../regexp.c:1378
#, c-format
msgid "E51: Too many %s("
msgstr "E51: %s( ใŒๅคš้ŽใŽใพใ™"
-#: ../regexp.c:1427
msgid "E52: Unmatched \\z("
msgstr "E52: \\z( ใŒ้‡ฃใ‚Šๅˆใฃใฆใ„ใพใ›ใ‚“"
-#: ../regexp.c:1637
#, c-format
msgid "E59: invalid character after %s@"
msgstr "E59: %s@ ใฎๅพŒใซไธๆญฃใชๆ–‡ๅญ—ใŒใ‚ใ‚Šใพใ—ใŸ"
-#: ../regexp.c:1672
#, c-format
msgid "E60: Too many complex %s{...}s"
msgstr "E60: ่ค‡้›‘ใช %s{...} ใŒๅคš้ŽใŽใพใ™"
-#: ../regexp.c:1687
#, c-format
msgid "E61: Nested %s*"
msgstr "E61:%s* ใŒๅ…ฅใ‚Œๅญใซใชใฃใฆใ„ใพใ™"
-#: ../regexp.c:1690
#, c-format
msgid "E62: Nested %s%c"
msgstr "E62:%s%c ใŒๅ…ฅใ‚Œๅญใซใชใฃใฆใ„ใพใ™"
-#
-#: ../regexp.c:1800
msgid "E63: invalid use of \\_"
msgstr "E63: \\_ ใฎ็„กๅŠนใชไฝฟ็”จๆ–นๆณ•ใงใ™"
-#: ../regexp.c:1850
#, c-format
msgid "E64: %s%c follows nothing"
msgstr "E64:%s%c ใฎๅพŒใซใชใซใ‚‚ใ‚ใ‚Šใพใ›ใ‚“"
-#
-#: ../regexp.c:1902
-msgid "E65: Illegal back reference"
-msgstr "E65: ไธๆญฃใชๅพŒๆ–นๅ‚็…งใงใ™"
-
-#
-#: ../regexp.c:1943
msgid "E68: Invalid character after \\z"
msgstr "E68: \\z ใฎๅพŒใซไธๆญฃใชๆ–‡ๅญ—ใŒใ‚ใ‚Šใพใ—ใŸ"
-#
-#: ../regexp.c:2049 ../regexp_nfa.c:1296
#, c-format
msgid "E678: Invalid character after %s%%[dxouU]"
msgstr "E678: %s%%[dxouU] ใฎๅพŒใซไธๆญฃใชๆ–‡ๅญ—ใŒใ‚ใ‚Šใพใ—ใŸ"
-#
-#: ../regexp.c:2107
#, c-format
msgid "E71: Invalid character after %s%%"
msgstr "E71: %s%% ใฎๅพŒใซไธๆญฃใชๆ–‡ๅญ—ใŒใ‚ใ‚Šใพใ—ใŸ"
-#: ../regexp.c:3017
#, c-format
msgid "E554: Syntax error in %s{...}"
msgstr "E554: %s{...} ๅ†…ใซๆ–‡ๆณ•ใ‚จใƒฉใƒผใŒใ‚ใ‚Šใพใ™"
-#: ../regexp.c:3805
msgid "External submatches:\n"
msgstr "ๅค–้ƒจใฎ้ƒจๅˆ†่ฉฒๅฝ“:\n"
@@ -5013,7 +4822,6 @@ msgstr "ๅค–้ƒจใฎ้ƒจๅˆ†่ฉฒๅฝ“:\n"
msgid "E888: (NFA regexp) cannot repeat %s"
msgstr "E888: (NFA ๆญฃ่ฆ่กจ็พ) ็นฐใ‚Š่ฟ”ใ›ใพใ›ใ‚“ %s"
-#: ../regexp.c:7022
msgid ""
"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be "
"used "
@@ -5024,62 +4832,58 @@ msgstr ""
msgid "Switching to backtracking RE engine for pattern: "
msgstr "ๆฌกใฎใƒ‘ใ‚ฟใƒผใƒณใซใƒใƒƒใ‚ฏใƒˆใƒฉใƒƒใ‚ญใƒณใ‚ฐ RE ใ‚จใƒณใ‚ธใƒณใ‚’้ฉ็”จใ—ใพใ™: "
-#: ../regexp_nfa.c:239
msgid "E865: (NFA) Regexp end encountered prematurely"
msgstr "E865: (NFA) ๆœŸๅพ…ใ‚ˆใ‚Šๆ—ฉใๆญฃ่ฆ่กจ็พใฎ็ต‚็ซฏใซๅˆฐ้”ใ—ใพใ—ใŸ"
-#: ../regexp_nfa.c:240
#, c-format
msgid "E866: (NFA regexp) Misplaced %c"
msgstr "E866: (NFA ๆญฃ่ฆ่กจ็พ) ไฝ็ฝฎใŒ่ชคใฃใฆใ„ใพใ™: %c"
-#: ../regexp_nfa.c:242
#, c-format
-msgid "E877: (NFA regexp) Invalid character class: %<PRId64>"
-msgstr "E877: (NFA ๆญฃ่ฆ่กจ็พ) ็„กๅŠนใชๆ–‡ๅญ—ใ‚ฏใƒฉใ‚น: %<PRId64>"
+msgid "E877: (NFA regexp) Invalid character class: %ld"
+msgstr "E877: (NFA ๆญฃ่ฆ่กจ็พ) ็„กๅŠนใชๆ–‡ๅญ—ใ‚ฏใƒฉใ‚น: %ld"
-#: ../regexp_nfa.c:1261
#, c-format
msgid "E867: (NFA) Unknown operator '\\z%c'"
msgstr "E867: (NFA) ๆœช็Ÿฅใฎใ‚ชใƒšใƒฌใƒผใ‚ฟใงใ™: '\\z%c'"
-#: ../regexp_nfa.c:1387
+msgid "E951: \\% value too large"
+msgstr "E951: \\% ๅ€คใŒ้•ท้ŽใŽใพใ™"
+
#, c-format
msgid "E867: (NFA) Unknown operator '\\%%%c'"
msgstr "E867: (NFA) ๆœช็Ÿฅใฎใ‚ชใƒšใƒฌใƒผใ‚ฟใงใ™: '\\%%%c'"
-#: ../regexp_nfa.c:1802
+msgid "E868: Error building NFA with equivalence class!"
+msgstr "E868: ็ญ‰ไพกใ‚ฏใƒฉใ‚นใ‚’ๅซใ‚€NFAๆง‹็ฏ‰ใซๅคฑๆ•—ใ—ใพใ—ใŸ!"
+
#, c-format
msgid "E869: (NFA) Unknown operator '\\@%c'"
msgstr "E869: (NFA) ๆœช็Ÿฅใฎใ‚ชใƒšใƒฌใƒผใ‚ฟใงใ™: '\\@%c'"
-#: ../regexp_nfa.c:1831
msgid "E870: (NFA regexp) Error reading repetition limits"
msgstr "E870: (NFA ๆญฃ่ฆ่กจ็พ) ็นฐใ‚Š่ฟ”ใ—ใฎๅˆถ้™ๅ›žๆ•ฐใ‚’่ชญ่พผไธญใซใ‚จใƒฉใƒผ"
-#. Can't have a multi follow a multi.
-#: ../regexp_nfa.c:1895
-msgid "E871: (NFA regexp) Can't have a multi follow a multi !"
-msgstr "E871: (NFA ๆญฃ่ฆ่กจ็พ) ็นฐใ‚Š่ฟ”ใ— ใฎๅพŒใซ ็นฐใ‚Š่ฟ”ใ— ใฏใงใใพใ›ใ‚“!"
+msgid "E871: (NFA regexp) Can't have a multi follow a multi"
+msgstr "E871: (NFA ๆญฃ่ฆ่กจ็พ) ็นฐใ‚Š่ฟ”ใ— ใฎๅพŒใซ ็นฐใ‚Š่ฟ”ใ— ใฏใงใใพใ›ใ‚“"
-#. Too many `('
-#: ../regexp_nfa.c:2037
msgid "E872: (NFA regexp) Too many '('"
msgstr "E872: (NFA ๆญฃ่ฆ่กจ็พ) '(' ใŒๅคš้ŽใŽใพใ™"
-#: ../regexp_nfa.c:2042
msgid "E879: (NFA regexp) Too many \\z("
msgstr "E879: (NFA ๆญฃ่ฆ่กจ็พ) \\z( ใŒๅคš้ŽใŽใพใ™"
-#: ../regexp_nfa.c:2066
msgid "E873: (NFA regexp) proper termination error"
msgstr "E873: (NFA ๆญฃ่ฆ่กจ็พ) ็ต‚็ซฏ่จ˜ๅทใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../regexp_nfa.c:2599
-msgid "E874: (NFA) Could not pop the stack !"
+msgid "Could not open temporary log file for writing, displaying on stderr... "
+msgstr ""
+"NFAๆญฃ่ฆ่กจ็พใ‚จใƒณใ‚ธใƒณ็”จใฎใƒญใ‚ฐใƒ•ใ‚กใ‚คใƒซใ‚’ๆ›ธ่พผ็”จใจใ—ใฆ้–‹ใ‘ใพใ›ใ‚“ใ€‚ใƒญใ‚ฐใฏๆจ™ๆบ–ใ‚จใƒฉใƒผ"
+"ๅ‡บๅŠ›ใซๅ‡บๅŠ›ใ—ใพใ™ใ€‚"
+
+msgid "E874: (NFA) Could not pop the stack!"
msgstr "E874: (NFA) ใ‚นใ‚ฟใƒƒใ‚ฏใ‚’ใƒใƒƒใƒ—ใงใใพใ›ใ‚“!"
-#: ../regexp_nfa.c:3298
msgid ""
"E875: (NFA regexp) (While converting from postfix to NFA), too many states "
"left on stack"
@@ -5087,177 +4891,122 @@ msgstr ""
"E875: (NFA ๆญฃ่ฆ่กจ็พ) (ๅพŒ็ฝฎๆ–‡ๅญ—ๅˆ—ใ‚’NFAใซๅค‰ๆ›ไธญใซ) ใ‚นใ‚ฟใƒƒใ‚ฏใซๆฎ‹ใ•ใ‚ŒใŸใ‚นใƒ†ใƒผใƒˆใŒ"
"ๅคš้ŽใŽใพใ™"
-#: ../regexp_nfa.c:3302
msgid "E876: (NFA regexp) Not enough space to store the whole NFA "
msgstr "E876: (NFA ๆญฃ่ฆ่กจ็พ) NFAๅ…จไฝ“ใ‚’ไฟๅญ˜ใ™ใ‚‹ใซใฏ็ฉบใใ‚นใƒšใƒผใ‚นใŒ่ถณใ‚Šใพใ›ใ‚“"
-#: ../regexp_nfa.c:4571 ../regexp_nfa.c:4869
-msgid ""
-"Could not open temporary log file for writing, displaying on stderr ... "
-msgstr ""
-"NFAๆญฃ่ฆ่กจ็พใ‚จใƒณใ‚ธใƒณ็”จใฎใƒญใ‚ฐใƒ•ใ‚กใ‚คใƒซใ‚’ๆ›ธ่พผ็”จใจใ—ใฆ้–‹ใ‘ใพใ›ใ‚“ใ€‚ใƒญใ‚ฐใฏๆจ™ๆบ–ๅ‡บๅŠ›ใซ"
-"ๅ‡บๅŠ›ใ—ใพใ™ใ€‚"
-
-#: ../regexp_nfa.c:4840
-#, c-format
-msgid "(NFA) COULD NOT OPEN %s !"
-msgstr "(NFA) ใƒญใ‚ฐใƒ•ใ‚กใ‚คใƒซ %s ใ‚’้–‹ใ‘ใพใ›ใ‚“!"
-
-#: ../regexp_nfa.c:6049
-msgid "Could not open temporary log file for writing "
-msgstr "NFAๆญฃ่ฆ่กจ็พใ‚จใƒณใ‚ธใƒณ็”จใฎใƒญใ‚ฐใƒ•ใ‚กใ‚คใƒซใ‚’ๆ›ธ่พผ็”จใจใ—ใฆ้–‹ใ‘ใพใ›ใ‚“ใ€‚"
+msgid "E878: (NFA) Could not allocate memory for branch traversal!"
+msgstr "E878: (NFA) ็พๅœจๆจชๆ–ญไธญใฎใƒ–ใƒฉใƒณใƒใซๅๅˆ†ใชใƒกใƒขใƒชใ‚’ๅ‰ฒใ‚Šๅฝ“ใฆใ‚‰ใ‚Œใพใ›ใ‚“!"
-#: ../screen.c:7435
msgid " VREPLACE"
msgstr " ไปฎๆƒณ็ฝฎๆ›"
-#: ../screen.c:7437
msgid " REPLACE"
msgstr " ็ฝฎๆ›"
-#: ../screen.c:7440
msgid " REVERSE"
msgstr " ๅ่ปข"
-#: ../screen.c:7441
msgid " INSERT"
msgstr " ๆŒฟๅ…ฅ"
-#: ../screen.c:7443
msgid " (insert)"
msgstr " (ๆŒฟๅ…ฅ)"
-#: ../screen.c:7445
msgid " (replace)"
msgstr " (็ฝฎๆ›)"
-#: ../screen.c:7447
msgid " (vreplace)"
msgstr " (ไปฎๆƒณ็ฝฎๆ›)"
-#: ../screen.c:7449
msgid " Hebrew"
msgstr " ใƒ˜ใƒ–ใƒฉใ‚ค"
-#: ../screen.c:7454
msgid " Arabic"
msgstr " ใ‚ขใƒฉใƒ“ใ‚ข"
-#: ../screen.c:7456
-msgid " (lang)"
-msgstr " (่จ€่ชž)"
-
-#: ../screen.c:7459
msgid " (paste)"
msgstr " (่ฒผใ‚Šไป˜ใ‘)"
-#: ../screen.c:7469
msgid " VISUAL"
msgstr " ใƒ“ใ‚ธใƒฅใ‚ขใƒซ"
-#: ../screen.c:7470
msgid " VISUAL LINE"
msgstr " ใƒ“ใ‚ธใƒฅใ‚ขใƒซ ่กŒ"
-#: ../screen.c:7471
msgid " VISUAL BLOCK"
msgstr " ใƒ“ใ‚ธใƒฅใ‚ขใƒซ ็Ÿฉๅฝข"
-#: ../screen.c:7472
msgid " SELECT"
msgstr " ใ‚ปใƒฌใ‚ฏใƒˆ"
-#: ../screen.c:7473
msgid " SELECT LINE"
msgstr " ่กŒๆŒ‡ๅ‘้ธๆŠž"
-#: ../screen.c:7474
msgid " SELECT BLOCK"
msgstr " ็Ÿฉๅฝข้ธๆŠž"
-#: ../screen.c:7486 ../screen.c:7541
msgid "recording"
msgstr "่จ˜้Œฒไธญ"
-#: ../search.c:487
#, c-format
msgid "E383: Invalid search string: %s"
msgstr "E383: ็„กๅŠนใชๆคœ็ดขๆ–‡ๅญ—ๅˆ—ใงใ™: %s"
-#: ../search.c:832
#, c-format
msgid "E384: search hit TOP without match for: %s"
msgstr "E384: ไธŠใพใงๆคœ็ดขใ—ใพใ—ใŸใŒ่ฉฒๅฝ“็ฎ‡ๆ‰€ใฏใ‚ใ‚Šใพใ›ใ‚“: %s"
-#: ../search.c:835
#, c-format
msgid "E385: search hit BOTTOM without match for: %s"
msgstr "E385: ไธ‹ใพใงๆคœ็ดขใ—ใพใ—ใŸใŒ่ฉฒๅฝ“็ฎ‡ๆ‰€ใฏใ‚ใ‚Šใพใ›ใ‚“: %s"
-#: ../search.c:1200
msgid "E386: Expected '?' or '/' after ';'"
msgstr "E386: ';' ใฎใ‚ใจใซใฏ '?' ใ‹ '/' ใŒๆœŸๅพ…ใ•ใ‚Œใฆใ„ใ‚‹"
-#: ../search.c:4085
msgid " (includes previously listed match)"
msgstr " (ๅ‰ใซๅˆ—ๆŒ™ใ—ใŸ่ฉฒๅฝ“็ฎ‡ๆ‰€ใ‚’ๅซใ‚€)"
-#. cursor at status line
-#: ../search.c:4104
msgid "--- Included files "
msgstr "--- ใ‚คใƒณใ‚ฏใƒซใƒผใƒ‰ใ•ใ‚ŒใŸใƒ•ใ‚กใ‚คใƒซ "
-#: ../search.c:4106
msgid "not found "
msgstr "่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“ "
-#: ../search.c:4107
msgid "in path ---\n"
msgstr "ใƒ‘ใ‚นใซ ----\n"
-#: ../search.c:4168
msgid " (Already listed)"
msgstr " (ๆ—ขใซๅˆ—ๆŒ™)"
-#: ../search.c:4170
msgid " NOT FOUND"
msgstr " ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-#: ../search.c:4211
#, c-format
msgid "Scanning included file: %s"
msgstr "ใ‚คใƒณใ‚ฏใƒซใƒผใƒ‰ใ•ใ‚ŒใŸใƒ•ใ‚กใ‚คใƒซใ‚’ใ‚นใ‚ญใƒฃใƒณไธญ: %s"
-#: ../search.c:4216
#, c-format
msgid "Searching included file %s"
-msgstr "ใ‚คใƒณใ‚ฏใƒซใƒผใƒ‰ใ•ใ‚ŒใŸใƒ•ใ‚กใ‚คใƒซใ‚’ใ‚นใ‚ญใƒฃใƒณไธญ %s"
+msgstr "ใ‚คใƒณใ‚ฏใƒซใƒผใƒ‰ใ•ใ‚ŒใŸใƒ•ใ‚กใ‚คใƒซใ‚’ๆคœ็ดขไธญ %s"
-#: ../search.c:4405
msgid "E387: Match is on current line"
msgstr "E387: ็พๅœจ่กŒใซ่ฉฒๅฝ“ใŒใ‚ใ‚Šใพใ™"
-#: ../search.c:4517
msgid "All included files were found"
msgstr "ๅ…จใฆใฎใ‚คใƒณใ‚ฏใƒซใƒผใƒ‰ใ•ใ‚ŒใŸใƒ•ใ‚กใ‚คใƒซใŒ่ฆ‹ใคใ‹ใ‚Šใพใ—ใŸ"
-#: ../search.c:4519
msgid "No included files"
msgstr "ใ‚คใƒณใ‚ฏใƒซใƒผใƒ‰ใƒ•ใ‚กใ‚คใƒซใฏใ‚ใ‚Šใพใ›ใ‚“"
-#: ../search.c:4527
msgid "E388: Couldn't find definition"
msgstr "E388: ๅฎš็พฉใ‚’่ฆ‹ใคใ‘ใ‚‰ใ‚Œใพใ›ใ‚“"
-#: ../search.c:4529
msgid "E389: Couldn't find pattern"
msgstr "E389: ใƒ‘ใ‚ฟใƒผใƒณใ‚’่ฆ‹ใคใ‘ใ‚‰ใ‚Œใพใ›ใ‚“"
-#: ../search.c:4668
msgid "Substitute "
msgstr "Substitute "
-#: ../search.c:4681
#, c-format
msgid ""
"\n"
@@ -5268,99 +5017,129 @@ msgstr ""
"# ๆœ€ๅพŒใฎ %sๆคœ็ดขใƒ‘ใ‚ฟใƒผใƒณ:\n"
"~"
-#: ../spell.c:951
-msgid "E759: Format error in spell file"
-msgstr "E759: ใ‚นใƒšใƒซใƒ•ใ‚กใ‚คใƒซใฎๆ›ธๅผใ‚จใƒฉใƒผใงใ™"
+msgid "E756: Spell checking is not enabled"
+msgstr "E756: ใ‚นใƒšใƒซใƒใ‚งใƒƒใ‚ฏใฏ็„กๅŠนๅŒ–ใ•ใ‚Œใฆใ„ใพใ™"
+
+#, c-format
+msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\""
+msgstr ""
+"่ญฆๅ‘Š: ๅ˜่ชžใƒชใ‚นใƒˆ \"%s_%s.spl\" ใŠใ‚ˆใณ \"%s_ascii.spl\" ใฏ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
+
+#, c-format
+msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
+msgstr ""
+"่ญฆๅ‘Š: ๅ˜่ชžใƒชใ‚นใƒˆ \"%s.%s.spl\" ใŠใ‚ˆใณ \"%s.ascii.spl\" ใฏ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
+
+msgid "E797: SpellFileMissing autocommand deleted buffer"
+msgstr "E797: autocommand ใฎ SpellFileMissing ใŒใƒใƒƒใƒ•ใ‚กใ‚’ๅ‰Š้™คใ—ใพใ—ใŸ"
+
+#, c-format
+msgid "Warning: region %s not supported"
+msgstr "่ญฆๅ‘Š9: %s ใจใ„ใ†็ฏ„ๅ›ฒใฏใ‚ตใƒใƒผใƒˆใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
+
+msgid "Sorry, no suggestions"
+msgstr "ๆฎ‹ๅฟตใงใ™ใŒใ€ไฟฎๆญฃๅ€™่ฃœใฏใ‚ใ‚Šใพใ›ใ‚“"
+
+#, c-format
+msgid "Sorry, only %ld suggestions"
+msgstr "ๆฎ‹ๅฟตใงใ™ใŒใ€ไฟฎๆญฃๅ€™่ฃœใฏ %ld ๅ€‹ใ—ใ‹ใ‚ใ‚Šใพใ›ใ‚“"
+
+#, c-format
+msgid "Change \"%.*s\" to:"
+msgstr "\"%.*s\" ใ‚’ๆฌกใธๅค‰ๆ›:"
+
+#, c-format
+msgid " < \"%.*s\""
+msgstr " < \"%.*s\""
+
+msgid "E752: No previous spell replacement"
+msgstr "E752: ใ‚นใƒšใƒซ็ฝฎๆ›ใŒใพใ ๅฎŸ่กŒใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
+
+#, c-format
+msgid "E753: Not found: %s"
+msgstr "E753: ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“: %s"
-#: ../spell.c:952
msgid "E758: Truncated spell file"
msgstr "E758: ใ‚นใƒšใƒซใƒ•ใ‚กใ‚คใƒซใŒๅˆ‡ๅ–ใ‚‰ใ‚Œใฆใ„ใ‚‹ใ‚ˆใ†ใงใ™"
-#: ../spell.c:953
#, c-format
msgid "Trailing text in %s line %d: %s"
msgstr "%s (%d ่กŒ็›ฎ) ใซ็ถšใใƒ†ใ‚ญใ‚นใƒˆ: %s"
-#: ../spell.c:954
#, c-format
msgid "Affix name too long in %s line %d: %s"
msgstr "%s (%d ่กŒ็›ฎ) ใฎ affix ๅใŒ้•ท้ŽใŽใพใ™: %s"
-#: ../spell.c:955
msgid "E761: Format error in affix file FOL, LOW or UPP"
msgstr ""
"E761: affixใƒ•ใ‚กใ‚คใƒซใฎ FOL, LOW ใ‚‚ใ—ใใฏ UPP ใฎใƒ•ใ‚ฉใƒผใƒžใƒƒใƒˆใซใ‚จใƒฉใƒผใŒใ‚ใ‚Šใพใ™"
-#: ../spell.c:957
msgid "E762: Character in FOL, LOW or UPP is out of range"
msgstr "E762: FOL, LOW ใ‚‚ใ—ใใฏ UPP ใฎๆ–‡ๅญ—ใŒ็ฏ„ๅ›ฒๅค–ใงใ™"
-#: ../spell.c:958
msgid "Compressing word tree..."
msgstr "ๅ˜่ชžใƒ„ใƒชใƒผใ‚’ๅœง็ธฎใ—ใฆใ„ใพใ™..."
-#: ../spell.c:1951
-msgid "E756: Spell checking is not enabled"
-msgstr "E756: ใ‚นใƒšใƒซใƒใ‚งใƒƒใ‚ฏใฏ็„กๅŠนๅŒ–ใ•ใ‚Œใฆใ„ใพใ™"
-
-#: ../spell.c:2249
-#, c-format
-msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
-msgstr ""
-"่ญฆๅ‘Š: ๅ˜่ชžใƒชใ‚นใƒˆ \"%s.%s.spl\" ใŠใ‚ˆใณ \"%s.ascii.spl\" ใฏ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-
-#: ../spell.c:2473
#, c-format
msgid "Reading spell file \"%s\""
msgstr "ใ‚นใƒšใƒซใƒ•ใ‚กใ‚คใƒซ \"%s\" ใ‚’่ชญ่พผไธญ"
-#: ../spell.c:2496
msgid "E757: This does not look like a spell file"
msgstr "E757: ใ‚นใƒšใƒซใƒ•ใ‚กใ‚คใƒซใงใฏใชใ„ใ‚ˆใ†ใงใ™"
-#: ../spell.c:2501
msgid "E771: Old spell file, needs to be updated"
-msgstr "E771: ๅคใ„ใ‚นใƒšใƒซใƒ•ใ‚กใ‚คใƒซใชใฎใง, ใ‚ขใƒƒใƒ—ใƒ‡ใƒผใƒˆใ—ใฆใใ ใ•ใ„"
+msgstr "E771: ๅคใ„ใ‚นใƒšใƒซใƒ•ใ‚กใ‚คใƒซใชใฎใงใ€ใ‚ขใƒƒใƒ—ใƒ‡ใƒผใƒˆใ—ใฆใใ ใ•ใ„"
-#: ../spell.c:2504
msgid "E772: Spell file is for newer version of Vim"
msgstr "E772: ใ‚ˆใ‚Šๆ–ฐใ—ใ„ใƒใƒผใ‚ธใƒงใƒณใฎ Vim ็”จใฎใ‚นใƒšใƒซใƒ•ใ‚กใ‚คใƒซใงใ™"
-#: ../spell.c:2602
msgid "E770: Unsupported section in spell file"
msgstr "E770: ใ‚นใƒšใƒซใƒ•ใ‚กใ‚คใƒซใซใ‚ตใƒใƒผใƒˆใ—ใฆใ„ใชใ„ใ‚ปใ‚ฏใ‚ทใƒงใƒณใŒใ‚ใ‚Šใพใ™"
-#: ../spell.c:3762
#, c-format
-msgid "Warning: region %s not supported"
-msgstr "่ญฆๅ‘Š9: %s ใจใ„ใ†็ฏ„ๅ›ฒใฏใ‚ตใƒใƒผใƒˆใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
+msgid "E778: This does not look like a .sug file: %s"
+msgstr "E778: .sug ใƒ•ใ‚กใ‚คใƒซใงใฏใชใ„ใ‚ˆใ†ใงใ™: %s"
-#: ../spell.c:4550
#, c-format
-msgid "Reading affix file %s ..."
+msgid "E779: Old .sug file, needs to be updated: %s"
+msgstr "E779: ๅคใ„ .sug ใƒ•ใ‚กใ‚คใƒซใชใฎใงใ€ใ‚ขใƒƒใƒ—ใƒ‡ใƒผใƒˆใ—ใฆใใ ใ•ใ„: %s"
+
+#, c-format
+msgid "E780: .sug file is for newer version of Vim: %s"
+msgstr "E780: ใ‚ˆใ‚Šๆ–ฐใ—ใ„ใƒใƒผใ‚ธใƒงใƒณใฎ Vim ็”จใฎ .sug ใƒ•ใ‚กใ‚คใƒซใงใ™: %s"
+
+#, c-format
+msgid "E781: .sug file doesn't match .spl file: %s"
+msgstr "E781: .sug ใƒ•ใ‚กใ‚คใƒซใŒ .spl ใƒ•ใ‚กใ‚คใƒซใจไธ€่‡ดใ—ใพใ›ใ‚“: %s"
+
+#, c-format
+msgid "E782: error while reading .sug file: %s"
+msgstr "E782: .sug ใƒ•ใ‚กใ‚คใƒซใฎ่ชญ่พผไธญใซใ‚จใƒฉใƒผใŒ็™บ็”Ÿใ—ใพใ—ใŸ: %s"
+
+#, c-format
+msgid "Reading affix file %s..."
msgstr "affix ใƒ•ใ‚กใ‚คใƒซ %s ใ‚’่ชญ่พผไธญ..."
-#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
#, c-format
msgid "Conversion failure for word in %s line %d: %s"
msgstr "%s (%d ่กŒ็›ฎ) ใฎๅ˜่ชžใ‚’ๅค‰ๆ›ใงใใพใ›ใ‚“ใงใ—ใŸ: %s"
-#: ../spell.c:4630 ../spell.c:6170
#, c-format
msgid "Conversion in %s not supported: from %s to %s"
msgstr "%s ๅ†…ใฎๆฌกใฎๅค‰ๆ›ใฏใ‚ตใƒใƒผใƒˆใ•ใ‚Œใฆใ„ใพใ›ใ‚“: %s ใ‹ใ‚‰ %s ใธ"
-#: ../spell.c:4642
+#, c-format
+msgid "Conversion in %s not supported"
+msgstr "%s ๅ†…ใฎๅค‰ๆ›ใฏใ‚ตใƒใƒผใƒˆใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
+
#, c-format
msgid "Invalid value for FLAG in %s line %d: %s"
msgstr "%s ๅ†…ใฎ %d ่กŒ็›ฎใฎ FLAG ใซ็„กๅŠนใชๅ€คใŒใ‚ใ‚Šใพใ™: %s"
-#: ../spell.c:4655
#, c-format
msgid "FLAG after using flags in %s line %d: %s"
msgstr "%s ๅ†…ใฎ %d ่กŒ็›ฎใซใƒ•ใƒฉใ‚ฐใฎไบŒ้‡ไฝฟ็”จใŒใ‚ใ‚Šใพใ™: %s"
-#: ../spell.c:4723
#, c-format
msgid ""
"Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line "
@@ -5369,7 +5148,6 @@ msgstr ""
"%s ใฎ %d ่กŒ็›ฎใฎ PFX ้ …็›ฎใฎๅพŒใฎ COMPOUNDFORBIDFLAG ใฎๅฎš็พฉใฏ่ชคใฃใŸ็ตๆžœใ‚’็”Ÿใ˜ใ‚‹"
"ใ“ใจใŒใ‚ใ‚Šใพใ™"
-#: ../spell.c:4731
#, c-format
msgid ""
"Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line "
@@ -5378,43 +5156,35 @@ msgstr ""
"%s ใฎ %d ่กŒ็›ฎใฎ PFX ้ …็›ฎใฎๅพŒใฎ COMPOUNDPERMITFLAG ใฎๅฎš็พฉใฏ่ชคใฃใŸ็ตๆžœใ‚’็”Ÿใ˜ใ‚‹"
"ใ“ใจใŒใ‚ใ‚Šใพใ™"
-#: ../spell.c:4747
#, c-format
msgid "Wrong COMPOUNDRULES value in %s line %d: %s"
msgstr "COMPOUNDRULES ใฎๅ€คใซ่ชคใ‚ŠใŒใ‚ใ‚Šใพใ™. ใƒ•ใ‚กใ‚คใƒซ %s ใฎ %d ่กŒ็›ฎ: %s"
-#: ../spell.c:4771
#, c-format
msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s"
msgstr "%s ใฎ %d ่กŒ็›ฎใฎ COMPOUNDWORDMAX ใฎๅ€คใซ่ชคใ‚ŠใŒใ‚ใ‚Šใพใ™: %s"
-#: ../spell.c:4777
#, c-format
msgid "Wrong COMPOUNDMIN value in %s line %d: %s"
msgstr "%s ใฎ %d ่กŒ็›ฎใฎ COMPOUNDMIN ใฎๅ€คใซ่ชคใ‚ŠใŒใ‚ใ‚Šใพใ™: %s"
-#: ../spell.c:4783
#, c-format
msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s"
msgstr "%s ใฎ %d ่กŒ็›ฎใฎ COMPOUNDSYLMAX ใฎๅ€คใซ่ชคใ‚ŠใŒใ‚ใ‚Šใพใ™: %s"
-#: ../spell.c:4795
#, c-format
msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"
msgstr "%s ใฎ %d ่กŒ็›ฎใฎ CHECKCOMPOUNDPATTERN ใฎๅ€คใซ่ชคใ‚ŠใŒใ‚ใ‚Šใพใ™: %s"
-#: ../spell.c:4847
#, c-format
msgid "Different combining flag in continued affix block in %s line %d: %s"
msgstr ""
"%s ใฎ %d ่กŒ็›ฎใฎ ้€ฃ็ถš affix ใƒ–ใƒญใƒƒใ‚ฏใฎใƒ•ใƒฉใ‚ฐใฎ็ต„ๅˆใ›ใซ้•ใ„ใŒใ‚ใ‚Šใพใ™: %s"
-#: ../spell.c:4850
#, c-format
msgid "Duplicate affix in %s line %d: %s"
msgstr "%s ใฎ %d ่กŒ็›ฎใซ ้‡่ค‡ใ—ใŸ affix ใ‚’ๆคœๅ‡บใ—ใพใ—ใŸ: %s"
-#: ../spell.c:4871
#, c-format
msgid ""
"Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s "
@@ -5423,337 +5193,245 @@ msgstr ""
"%s ใฎ %d ่กŒ็›ฎใฎ affix ใฏ BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST "
"ใซไฝฟ็”จใ—ใฆใใ ใ•ใ„: %s"
-#: ../spell.c:4893
#, c-format
msgid "Expected Y or N in %s line %d: %s"
msgstr "%s ใฎ %d ่กŒ็›ฎใงใฏ Y ใ‹ N ใŒๅฟ…่ฆใงใ™: %s"
-#: ../spell.c:4968
#, c-format
msgid "Broken condition in %s line %d: %s"
msgstr "%s ใฎ %d ่กŒ็›ฎใฎ ๆกไปถใฏๅฃŠใ‚Œใฆใ„ใพใ™: %s"
-#: ../spell.c:5091
#, c-format
msgid "Expected REP(SAL) count in %s line %d"
msgstr "%s ใฎ %d ่กŒ็›ฎใซใฏ REP(SAL) ใฎๅ›žๆ•ฐใŒๅฟ…่ฆใงใ™"
-#: ../spell.c:5120
#, c-format
msgid "Expected MAP count in %s line %d"
msgstr "%s ใฎ %d ่กŒ็›ฎใซใฏ MAP ใฎๅ›žๆ•ฐใŒๅฟ…่ฆใงใ™"
-#: ../spell.c:5132
#, c-format
msgid "Duplicate character in MAP in %s line %d"
msgstr "%s ใฎ %d ่กŒ็›ฎใฎ MAP ใซ้‡่ค‡ใ—ใŸๆ–‡ๅญ—ใŒใ‚ใ‚Šใพใ™"
-#: ../spell.c:5176
#, c-format
msgid "Unrecognized or duplicate item in %s line %d: %s"
msgstr "%s ใฎ %d ่กŒ็›ฎใซ ่ช่ญ˜ใงใใชใ„ใ‹้‡่ค‡ใ—ใŸ้ …็›ฎใŒใ‚ใ‚Šใพใ™: %s"
-#: ../spell.c:5197
#, c-format
msgid "Missing FOL/LOW/UPP line in %s"
msgstr "%s ่กŒ็›ฎใซ FOL/LOW/UPP ใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../spell.c:5220
msgid "COMPOUNDSYLMAX used without SYLLABLE"
msgstr "SYLLABLE ใŒๆŒ‡ๅฎšใ•ใ‚Œใชใ„ COMPOUNDSYLMAX"
-#: ../spell.c:5236
msgid "Too many postponed prefixes"
msgstr "้…ๅปถๅพŒ็ฝฎๅญใŒๅคš้ŽใŽใพใ™"
-#: ../spell.c:5238
msgid "Too many compound flags"
msgstr "่ค‡ๅˆใƒ•ใƒฉใ‚ฐใŒๅคš้ŽใŽใพใ™"
-#: ../spell.c:5240
msgid "Too many postponed prefixes and/or compound flags"
msgstr "้…ๅปถๅพŒ็ฝฎๅญ ใจ/ใ‚‚ใ—ใใฏ ่ค‡ๅˆใƒ•ใƒฉใ‚ฐใŒๅคš้ŽใŽใพใ™"
-#: ../spell.c:5250
#, c-format
msgid "Missing SOFO%s line in %s"
msgstr "SOFO%s ่กŒใŒ %s ใซใ‚ใ‚Šใพใ›ใ‚“"
-#: ../spell.c:5253
#, c-format
msgid "Both SAL and SOFO lines in %s"
msgstr "SAL่กŒ ใจ SOFO่กŒ ใŒ %s ใงไธกๆ–นๆŒ‡ๅฎšใ•ใ‚Œใฆใ„ใพใ™"
-#: ../spell.c:5331
#, c-format
msgid "Flag is not a number in %s line %d: %s"
msgstr "%s ใฎ %d ่กŒใฎ ใƒ•ใƒฉใ‚ฐใŒๆ•ฐๅ€คใงใฏใ‚ใ‚Šใพใ›ใ‚“: %s"
-#: ../spell.c:5334
#, c-format
msgid "Illegal flag in %s line %d: %s"
msgstr "%s ใฎ %d ่กŒ็›ฎใฎ ใƒ•ใƒฉใ‚ฐใŒไธๆญฃใงใ™: %s"
-#: ../spell.c:5493 ../spell.c:5501
#, c-format
msgid "%s value differs from what is used in another .aff file"
msgstr "ๅ€ค %s ใฏไป–ใฎ .aff ใƒ•ใ‚กใ‚คใƒซใงไฝฟ็”จใ•ใ‚ŒใŸใฎใจ็•ฐใชใ‚Šใพใ™"
-#: ../spell.c:5602
#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "่พžๆ›ธใƒ•ใ‚กใ‚คใƒซ %s ใ‚’ใ‚นใ‚ญใƒฃใƒณไธญ..."
+msgid "Reading dictionary file %s..."
+msgstr "่พžๆ›ธใƒ•ใ‚กใ‚คใƒซ %s ใ‚’่ชญ่พผใฟไธญ..."
-#: ../spell.c:5611
#, c-format
msgid "E760: No word count in %s"
msgstr "E760: %s ใซใฏๅ˜่ชžๆ•ฐใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../spell.c:5669
#, c-format
-msgid "line %6d, word %6d - %s"
-msgstr "่กŒ %6d, ๅ˜่ชž %6d - %s"
+msgid "line %6d, word %6ld - %s"
+msgstr "่กŒ %6d, ๅ˜่ชž %6ld - %s"
-#: ../spell.c:5691
#, c-format
msgid "Duplicate word in %s line %d: %s"
msgstr "%s ใฎ %d ่กŒ็›ฎใง ้‡่ค‡ๅ˜่ชžใŒ่ฆ‹ใคใ‹ใ‚Šใพใ—ใŸ: %s"
-#: ../spell.c:5694
#, c-format
msgid "First duplicate word in %s line %d: %s"
msgstr "้‡่ค‡ใฎใ†ใกๆœ€ๅˆใฎๅ˜่ชžใฏ %s ใฎ %d ่กŒ็›ฎใงใ™: %s"
-#: ../spell.c:5746
#, c-format
msgid "%d duplicate word(s) in %s"
msgstr "%d ๅ€‹ใฎๅ˜่ชžใŒ่ฆ‹ใคใ‹ใ‚Šใพใ—ใŸ (%s ๅ†…)"
-#: ../spell.c:5748
#, c-format
msgid "Ignored %d word(s) with non-ASCII characters in %s"
msgstr "้žASCIIๆ–‡ๅญ—ใ‚’ๅซใ‚€ %d ๅ€‹ใฎๅ˜่ชžใ‚’็„ก่ฆ–ใ—ใพใ—ใŸ (%s ๅ†…)"
-#: ../spell.c:6115
#, c-format
-msgid "Reading word file %s ..."
-msgstr "ๆจ™ๆบ–ๅ…ฅๅŠ›ใ‹ใ‚‰่ชญ่พผใฟไธญ %s ..."
+msgid "Reading word file %s..."
+msgstr "ๅ˜่ชžใƒ•ใ‚กใ‚คใƒซ %s ใ‚’่ชญ่พผใฟไธญ..."
-#: ../spell.c:6155
#, c-format
msgid "Duplicate /encoding= line ignored in %s line %d: %s"
msgstr "%s ใฎ %d ่กŒ็›ฎใฎ ้‡่ค‡ใ—ใŸ /encoding= ่กŒใ‚’็„ก่ฆ–ใ—ใพใ—ใŸ: %s"
-#: ../spell.c:6159
#, c-format
msgid "/encoding= line after word ignored in %s line %d: %s"
msgstr "%s ใฎ %d ่กŒ็›ฎใฎ ๅ˜่ชžใฎๅพŒใฎ /encoding= ่กŒใ‚’็„ก่ฆ–ใ—ใพใ—ใŸ: %s"
-#: ../spell.c:6180
#, c-format
msgid "Duplicate /regions= line ignored in %s line %d: %s"
msgstr "%s ใฎ %d ่กŒ็›ฎใฎ ้‡่ค‡ใ—ใŸ /regions= ่กŒใ‚’็„ก่ฆ–ใ—ใพใ—ใŸ: %s"
-#: ../spell.c:6185
#, c-format
msgid "Too many regions in %s line %d: %s"
-msgstr "%s ใฎ %d ่กŒ็›ฎ, ็ฏ„ๅ›ฒๆŒ‡ๅฎšใŒๅคš้ŽใŽใพใ™: %s"
+msgstr "%s ใฎ %d ่กŒ็›ฎใ€็ฏ„ๅ›ฒๆŒ‡ๅฎšใŒๅคš้ŽใŽใพใ™: %s"
-#: ../spell.c:6198
#, c-format
msgid "/ line ignored in %s line %d: %s"
msgstr "%s ใฎ %d ่กŒ็›ฎใฎ ้‡่ค‡ใ—ใŸ / ่กŒใ‚’็„ก่ฆ–ใ—ใพใ—ใŸ: %s"
-#: ../spell.c:6224
#, c-format
msgid "Invalid region nr in %s line %d: %s"
msgstr "%s ใฎ %d ่กŒ็›ฎ ็„กๅŠนใช nr ้ ˜ๅŸŸใงใ™: %s"
-#: ../spell.c:6230
#, c-format
msgid "Unrecognized flags in %s line %d: %s"
msgstr "%s ใฎ %d ่กŒ็›ฎ ่ช่ญ˜ไธ่ƒฝใชใƒ•ใƒฉใ‚ฐใงใ™: %s"
-#: ../spell.c:6257
#, c-format
msgid "Ignored %d words with non-ASCII characters"
msgstr "้žASCIIๆ–‡ๅญ—ใ‚’ๅซใ‚€ %d ๅ€‹ใฎๅ˜่ชžใ‚’็„ก่ฆ–ใ—ใพใ—ใŸ"
-#: ../spell.c:6656
+msgid "E845: Insufficient memory, word list will be incomplete"
+msgstr "E845: ใƒกใƒขใƒชใŒ่ถณใ‚Šใชใ„ใฎใงใ€ๅ˜่ชžใƒชใ‚นใƒˆใฏไธๅฎŒๅ…จใงใ™"
+
#, c-format
msgid "Compressed %d of %d nodes; %d (%d%%) remaining"
msgstr "ใƒŽใƒผใƒ‰ %d ๅ€‹(ๅ…จ %d ๅ€‹ไธญ) ใ‚’ๅœง็ธฎใ—ใพใ—ใŸ; ๆฎ‹ใ‚Š %d (%d%%)"
-#: ../spell.c:7340
msgid "Reading back spell file..."
msgstr "ใ‚นใƒšใƒซใƒ•ใ‚กใ‚คใƒซใ‚’้€†่ชญ่พผไธญ"
-#. Go through the trie of good words, soundfold each word and add it to
-#. the soundfold trie.
-#: ../spell.c:7357
msgid "Performing soundfolding..."
msgstr "้Ÿณๅฃฐ็•ณ่พผใฟใ‚’ๅฎŸ่กŒไธญ..."
-#: ../spell.c:7368
#, c-format
-msgid "Number of words after soundfolding: %<PRId64>"
-msgstr "้Ÿณๅฃฐ็•ณ่พผใฟๅพŒใฎ็ทๅ˜่ชžๆ•ฐ: %<PRId64>"
+msgid "Number of words after soundfolding: %ld"
+msgstr "้Ÿณๅฃฐ็•ณ่พผใฟๅพŒใฎ็ทๅ˜่ชžๆ•ฐ: %ld"
-#: ../spell.c:7476
#, c-format
msgid "Total number of words: %d"
msgstr "็ทๅ˜่ชžๆ•ฐ: %d"
-#: ../spell.c:7655
#, c-format
-msgid "Writing suggestion file %s ..."
+msgid "Writing suggestion file %s..."
msgstr "ไฟฎๆญฃๅ€™่ฃœใƒ•ใ‚กใ‚คใƒซ \"%s\" ใ‚’ๆ›ธ่พผใฟไธญ..."
-#: ../spell.c:7707 ../spell.c:7927
#, c-format
msgid "Estimated runtime memory use: %d bytes"
msgstr "ๆŽจๅฎšใƒกใƒขใƒชไฝฟ็”จ้‡: %d ใƒใ‚คใƒˆ"
-#: ../spell.c:7820
msgid "E751: Output file name must not have region name"
msgstr "E751: ๅ‡บๅŠ›ใƒ•ใ‚กใ‚คใƒซๅใซใฏ็ฏ„ๅ›ฒๅใ‚’ๅซใ‚ใ‚‰ใ‚Œใพใ›ใ‚“"
-#: ../spell.c:7822
-msgid "E754: Only up to 8 regions supported"
-msgstr "E754: ็ฏ„ๅ›ฒใฏ 8 ๅ€‹ใพใงใ—ใ‹ใ‚ตใƒใƒผใƒˆใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
+#, c-format
+msgid "E754: Only up to %ld regions supported"
+msgstr "E754: ็ฏ„ๅ›ฒใฏ %ld ๅ€‹ใพใงใ—ใ‹ใ‚ตใƒใƒผใƒˆใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#: ../spell.c:7846
#, c-format
msgid "E755: Invalid region in %s"
msgstr "E755: ็„กๅŠนใช็ฏ„ๅ›ฒใงใ™: %s"
-#: ../spell.c:7907
msgid "Warning: both compounding and NOBREAK specified"
msgstr "่ญฆๅ‘Š: ่ค‡ๅˆใƒ•ใƒฉใ‚ฐใจ NOBREAK ใŒไธกๆ–นใจใ‚‚ๆŒ‡ๅฎšใ•ใ‚Œใพใ—ใŸ"
-#: ../spell.c:7920
#, c-format
-msgid "Writing spell file %s ..."
+msgid "Writing spell file %s..."
msgstr "ใ‚นใƒšใƒซใƒ•ใ‚กใ‚คใƒซ %s ใ‚’ๆ›ธ่พผใฟไธญ..."
-#: ../spell.c:7925
msgid "Done!"
msgstr "ๅฎŸ่กŒใ—ใพใ—ใŸ!"
-#: ../spell.c:8034
#, c-format
-msgid "E765: 'spellfile' does not have %<PRId64> entries"
-msgstr "E765: 'spellfile' ใซใฏ %<PRId64> ๅ€‹ใฎใ‚จใƒณใƒˆใƒชใฏใ‚ใ‚Šใพใ›ใ‚“"
+msgid "E765: 'spellfile' does not have %ld entries"
+msgstr "E765: 'spellfile' ใซใฏ %ld ๅ€‹ใฎใ‚จใƒณใƒˆใƒชใฏใ‚ใ‚Šใพใ›ใ‚“"
-#: ../spell.c:8074
#, c-format
msgid "Word '%.*s' removed from %s"
msgstr "ๅ˜่ชž '%.*s' ใŒ %s ใ‹ใ‚‰ๅ‰Š้™คใ•ใ‚Œใพใ—ใŸ"
-#: ../spell.c:8117
#, c-format
msgid "Word '%.*s' added to %s"
-msgstr "%s ใซๅ˜่ชžใŒ่ฟฝๅŠ ใ•ใ‚Œใพใ—ใŸ"
+msgstr "ๅ˜่ชž '%.*s' ใŒ %s ใธ่ฟฝๅŠ ใ•ใ‚Œใพใ—ใŸ"
-#: ../spell.c:8381
msgid "E763: Word characters differ between spell files"
msgstr "E763: ๅ˜่ชžใฎๆ–‡ๅญ—ใŒใ‚นใƒšใƒซใƒ•ใ‚กใ‚คใƒซใจ็•ฐใชใ‚Šใพใ™"
-#: ../spell.c:8684
-msgid "Sorry, no suggestions"
-msgstr "ๆฎ‹ๅฟตใงใ™ใŒ, ไฟฎๆญฃๅ€™่ฃœใฏใ‚ใ‚Šใพใ›ใ‚“"
-
-#: ../spell.c:8687
-#, c-format
-msgid "Sorry, only %<PRId64> suggestions"
-msgstr "ๆฎ‹ๅฟตใงใ™ใŒ, ไฟฎๆญฃๅ€™่ฃœใฏ %<PRId64> ๅ€‹ใ—ใ‹ใ‚ใ‚Šใพใ›ใ‚“"
-
-#. for when 'cmdheight' > 1
-#. avoid more prompt
-#: ../spell.c:8704
-#, c-format
-msgid "Change \"%.*s\" to:"
-msgstr "\"%.*s\" ใ‚’ๆฌกใธๅค‰ๆ›:"
-
-#: ../spell.c:8737
-#, c-format
-msgid " < \"%.*s\""
-msgstr " < \"%.*s\""
-
-#: ../spell.c:8882
-msgid "E752: No previous spell replacement"
-msgstr "E752: ใ‚นใƒšใƒซ็ฝฎๆ›ใŒใพใ ๅฎŸ่กŒใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
+msgid "E783: duplicate char in MAP entry"
+msgstr "E783: MAP ใ‚จใƒณใƒˆใƒชใซ้‡่ค‡ๆ–‡ๅญ—ใŒๅญ˜ๅœจใ—ใพใ™"
-#: ../spell.c:8925
-#, c-format
-msgid "E753: Not found: %s"
-msgstr "E753: ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“: %s"
+msgid "No Syntax items defined for this buffer"
+msgstr "ใ“ใฎใƒใƒƒใƒ•ใ‚กใซๅฎš็พฉใ•ใ‚ŒใŸๆง‹ๆ–‡่ฆ็ด ใฏใ‚ใ‚Šใพใ›ใ‚“"
-#: ../spell.c:9276
-#, c-format
-msgid "E778: This does not look like a .sug file: %s"
-msgstr "E778: .sug ใƒ•ใ‚กใ‚คใƒซใงใฏใชใ„ใ‚ˆใ†ใงใ™: %s"
+msgid "syntax conceal on"
+msgstr "ๆง‹ๆ–‡ใฎ conceal ใฏ็พๅœจ on ใงใ™"
-#: ../spell.c:9282
-#, c-format
-msgid "E779: Old .sug file, needs to be updated: %s"
-msgstr "E779: ๅคใ„ .sug ใƒ•ใ‚กใ‚คใƒซใชใฎใง, ใ‚ขใƒƒใƒ—ใƒ‡ใƒผใƒˆใ—ใฆใใ ใ•ใ„: %s"
+msgid "syntax conceal off"
+msgstr "ๆง‹ๆ–‡ใฎ conceal ใฏ็พๅœจ off ใงใ™"
-#: ../spell.c:9286
#, c-format
-msgid "E780: .sug file is for newer version of Vim: %s"
-msgstr "E780: ใ‚ˆใ‚Šๆ–ฐใ—ใ„ใƒใƒผใ‚ธใƒงใƒณใฎ Vim ็”จใฎ .sug ใƒ•ใ‚กใ‚คใƒซใงใ™: %s"
+msgid "E390: Illegal argument: %s"
+msgstr "E390: ไธๆญฃใชๅผ•ๆ•ฐใงใ™: %s"
-#: ../spell.c:9295
-#, c-format
-msgid "E781: .sug file doesn't match .spl file: %s"
-msgstr "E781: .sug ใƒ•ใ‚กใ‚คใƒซใŒ .spl ใƒ•ใ‚กใ‚คใƒซใจไธ€่‡ดใ—ใพใ›ใ‚“: %s"
+msgid "syntax case ignore"
+msgstr "ๆง‹ๆ–‡ใฎๅคงๆ–‡ๅญ—ๅฐๆ–‡ๅญ—ใฏ็พๅœจ ignore ใงใ™"
-#: ../spell.c:9305
-#, c-format
-msgid "E782: error while reading .sug file: %s"
-msgstr "E782: .sug ใƒ•ใ‚กใ‚คใƒซใฎ่ชญ่พผไธญใซใ‚จใƒฉใƒผใŒ็™บ็”Ÿใ—ใพใ—ใŸ: %s"
+msgid "syntax case match"
+msgstr "ๆง‹ๆ–‡ใฎๅคงๆ–‡ๅญ—ๅฐๆ–‡ๅญ—ใฏ็พๅœจ match ใงใ™"
-#. This should have been checked when generating the .spl
-#. file.
-#: ../spell.c:11575
-msgid "E783: duplicate char in MAP entry"
-msgstr "E783: MAP ใ‚จใƒณใƒˆใƒชใซ้‡่ค‡ๆ–‡ๅญ—ใŒๅญ˜ๅœจใ—ใพใ™"
+msgid "syntax spell toplevel"
+msgstr "ๆง‹ๆ–‡ใฎ spell ใฏ็พๅœจ toplevel ใงใ™"
-#: ../syntax.c:266
-msgid "No Syntax items defined for this buffer"
-msgstr "ใ“ใฎใƒใƒƒใƒ•ใ‚กใซๅฎš็พฉใ•ใ‚ŒใŸๆง‹ๆ–‡่ฆ็ด ใฏใ‚ใ‚Šใพใ›ใ‚“"
+msgid "syntax spell notoplevel"
+msgstr "ๆง‹ๆ–‡ใฎ spell ใฏ็พๅœจ notoplevel ใงใ™"
-#: ../syntax.c:3083 ../syntax.c:3104 ../syntax.c:3127
-#, c-format
-msgid "E390: Illegal argument: %s"
-msgstr "E390: ไธๆญฃใชๅผ•ๆ•ฐใงใ™: %s"
+msgid "syntax spell default"
+msgstr "ๆง‹ๆ–‡ใฎ spell ใฏ็พๅœจ default ใงใ™"
msgid "syntax iskeyword "
-msgstr "ใ‚ทใƒณใ‚ฟใƒƒใ‚ฏใ‚น็”จ iskeyword "
+msgstr "ๆง‹ๆ–‡็”จ iskeyword "
-#: ../syntax.c:3299
#, c-format
msgid "E391: No such syntax cluster: %s"
msgstr "E391: ใใฎใ‚ˆใ†ใชๆง‹ๆ–‡ใ‚ฏใƒฉใ‚นใ‚ฟใฏใ‚ใ‚Šใพใ›ใ‚“: %s"
-#: ../syntax.c:3433
msgid "syncing on C-style comments"
msgstr "C่จ€่ชž้ขจใ‚ณใƒกใƒณใƒˆใ‹ใ‚‰ๅŒๆœŸไธญ"
-#: ../syntax.c:3439
msgid "no syncing"
msgstr "้žๅŒๆœŸ"
-#: ../syntax.c:3441
msgid "syncing starts "
msgstr "ๅŒๆœŸ้–‹ๅง‹ "
-#: ../syntax.c:3443 ../syntax.c:3506
msgid " lines before top line"
msgstr " ่กŒๅ‰(ใƒˆใƒƒใƒ—่กŒใ‚ˆใ‚Šใ‚‚)"
-#: ../syntax.c:3448
msgid ""
"\n"
"--- Syntax sync items ---"
@@ -5761,7 +5439,6 @@ msgstr ""
"\n"
"--- ๆง‹ๆ–‡ๅŒๆœŸ่ฆ็ด  ---"
-#: ../syntax.c:3452
msgid ""
"\n"
"syncing on items"
@@ -5769,7 +5446,6 @@ msgstr ""
"\n"
"่ฆ็ด ไธŠใงๅŒๆœŸไธญ"
-#: ../syntax.c:3457
msgid ""
"\n"
"--- Syntax items ---"
@@ -5777,53 +5453,41 @@ msgstr ""
"\n"
"--- ๆง‹ๆ–‡่ฆ็ด  ---"
-#: ../syntax.c:3475
#, c-format
msgid "E392: No such syntax cluster: %s"
msgstr "E392: ใใฎใ‚ˆใ†ใชๆง‹ๆ–‡ใ‚ฏใƒฉใ‚นใ‚ฟใฏใ‚ใ‚Šใพใ›ใ‚“: %s"
-#: ../syntax.c:3497
msgid "minimal "
msgstr "minimal "
-#: ../syntax.c:3503
msgid "maximal "
msgstr "maximal "
-#: ../syntax.c:3513
msgid "; match "
msgstr "; ่ฉฒๅฝ“ "
-#: ../syntax.c:3515
msgid " line breaks"
msgstr " ๅ€‹ใฎๆ”น่กŒ"
-#: ../syntax.c:4076
msgid "E395: contains argument not accepted here"
msgstr "E395: ใ“ใฎๅ ดๆ‰€ใงใฏๅผ•ๆ•ฐcontainsใฏ่จฑๅฏใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#: ../syntax.c:4096
msgid "E844: invalid cchar value"
msgstr "E844: ็„กๅŠนใชccharใฎๅ€คใงใ™"
-#: ../syntax.c:4107
msgid "E393: group[t]here not accepted here"
msgstr "E393: ใ“ใ“ใงใฏใ‚ฐใƒซใƒผใƒ—ใฏ่จฑๅฏใ•ใ‚Œใพใ›ใ‚“"
-#: ../syntax.c:4126
#, c-format
msgid "E394: Didn't find region item for %s"
msgstr "E394: %s ใฎ็ฏ„ๅ›ฒ่ฆ็ด ใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-#: ../syntax.c:4188
msgid "E397: Filename required"
msgstr "E397: ใƒ•ใ‚กใ‚คใƒซๅใŒๅฟ…่ฆใงใ™"
-#: ../syntax.c:4221
msgid "E847: Too many syntax includes"
msgstr "E847: ๆง‹ๆ–‡ใฎๅ–ใ‚Š่พผใฟ(include)ใŒๅคš้ŽใŽใพใ™"
-#: ../syntax.c:4303
#, c-format
msgid "E789: Missing ']': %s"
msgstr "E789: ']' ใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
@@ -5832,221 +5496,171 @@ msgstr "E789: ']' ใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
msgid "E890: trailing char after ']': %s]%s"
msgstr "E890: ']' ใฎๅพŒใ‚ใซไฝ™ๅˆ†ใชๆ–‡ๅญ—ใŒใ‚ใ‚Šใพใ™: %s]%s"
-#: ../syntax.c:4531
#, c-format
msgid "E398: Missing '=': %s"
msgstr "E398: '=' ใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
-#: ../syntax.c:4666
#, c-format
msgid "E399: Not enough arguments: syntax region %s"
msgstr "E399: ๅผ•ๆ•ฐใŒ่ถณใ‚Šใพใ›ใ‚“: ๆง‹ๆ–‡็ฏ„ๅ›ฒ %s"
-#: ../syntax.c:4870
msgid "E848: Too many syntax clusters"
msgstr "E848: ๆง‹ๆ–‡ใ‚ฏใƒฉใ‚นใ‚ฟใŒๅคš้ŽใŽใพใ™"
-#: ../syntax.c:4954
msgid "E400: No cluster specified"
msgstr "E400: ใ‚ฏใƒฉใ‚นใ‚ฟใŒๆŒ‡ๅฎšใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#. end delimiter not found
-#: ../syntax.c:4986
#, c-format
msgid "E401: Pattern delimiter not found: %s"
msgstr "E401: ใƒ‘ใ‚ฟใƒผใƒณๅŒบๅˆ‡ใ‚ŠใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“: %s"
-#: ../syntax.c:5049
#, c-format
msgid "E402: Garbage after pattern: %s"
msgstr "E402: ใƒ‘ใ‚ฟใƒผใƒณใฎใ‚ใจใซใ‚ดใƒŸใŒใ‚ใ‚Šใพใ™: %s"
-#: ../syntax.c:5120
msgid "E403: syntax sync: line continuations pattern specified twice"
msgstr "E403: ๆง‹ๆ–‡ๅŒๆœŸ: ้€ฃ็ถš่กŒใƒ‘ใ‚ฟใƒผใƒณใŒ2ๅบฆๆŒ‡ๅฎšใ•ใ‚Œใพใ—ใŸ"
-#: ../syntax.c:5169
#, c-format
msgid "E404: Illegal arguments: %s"
msgstr "E404: ไธๆญฃใชๅผ•ๆ•ฐใงใ™: %s"
-#: ../syntax.c:5217
#, c-format
msgid "E405: Missing equal sign: %s"
msgstr "E405: ็ญ‰ๅทใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
-#: ../syntax.c:5222
#, c-format
msgid "E406: Empty argument: %s"
msgstr "E406: ็ฉบใฎๅผ•ๆ•ฐ: %s"
-#: ../syntax.c:5240
#, c-format
msgid "E407: %s not allowed here"
msgstr "E407: %s ใฏใ‚ณใ‚ณใงใฏ่จฑๅฏใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#: ../syntax.c:5246
#, c-format
msgid "E408: %s must be first in contains list"
msgstr "E408: %s ใฏๅ†…ๅฎนใƒชใ‚นใƒˆใฎๅ…ˆ้ ญใงใชใ‘ใ‚Œใฐใชใ‚‰ใชใ„"
-#: ../syntax.c:5304
#, c-format
msgid "E409: Unknown group name: %s"
msgstr "E409: ๆœช็Ÿฅใฎใ‚ฐใƒซใƒผใƒ—ๅ: %s"
-#: ../syntax.c:5512
#, c-format
msgid "E410: Invalid :syntax subcommand: %s"
msgstr "E410: ็„กๅŠนใช :syntax ใฎใ‚ตใƒ–ใ‚ณใƒžใƒณใƒ‰: %s"
-#: ../syntax.c:5854
msgid ""
" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
msgstr ""
" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
-#: ../syntax.c:6146
msgid "E679: recursive loop loading syncolor.vim"
msgstr "E679: syncolor.vim ใฎๅ†ๅธฐๅ‘ผใณๅ‡บใ—ใ‚’ๆคœๅ‡บใ—ใพใ—ใŸ"
-#: ../syntax.c:6256
#, c-format
msgid "E411: highlight group not found: %s"
msgstr "E411: ใƒใ‚คใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“: %s"
-#: ../syntax.c:6278
#, c-format
msgid "E412: Not enough arguments: \":highlight link %s\""
msgstr "E412: ๅผ•ๆ•ฐใŒๅ……ๅˆ†ใงใฏใชใ„: \":highlight link %s\""
-#: ../syntax.c:6284
#, c-format
msgid "E413: Too many arguments: \":highlight link %s\""
msgstr "E413: ๅผ•ๆ•ฐใŒๅคš้ŽใŽใพใ™: \":highlight link %s\""
-#: ../syntax.c:6302
msgid "E414: group has settings, highlight link ignored"
msgstr "E414: ใ‚ฐใƒซใƒผใƒ—ใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใ‚‹ใฎใงใƒใ‚คใƒฉใ‚คใƒˆใƒชใƒณใ‚ฏใฏ็„ก่ฆ–ใ•ใ‚Œใพใ™"
-#: ../syntax.c:6367
#, c-format
msgid "E415: unexpected equal sign: %s"
msgstr "E415: ไบˆๆœŸใ›ใฌ็ญ‰ๅทใงใ™: %s"
-#: ../syntax.c:6395
#, c-format
msgid "E416: missing equal sign: %s"
msgstr "E416: ็ญ‰ๅทใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
-#: ../syntax.c:6418
#, c-format
msgid "E417: missing argument: %s"
msgstr "E417: ๅผ•ๆ•ฐใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
-#: ../syntax.c:6446
#, c-format
msgid "E418: Illegal value: %s"
msgstr "E418: ไธๆญฃใชๅ€คใงใ™: %s"
-#: ../syntax.c:6496
msgid "E419: FG color unknown"
msgstr "E419: ๆœช็Ÿฅใฎๅ‰ๆ™ฏ่‰ฒใงใ™"
-#: ../syntax.c:6504
msgid "E420: BG color unknown"
msgstr "E420: ๆœช็Ÿฅใฎ่ƒŒๆ™ฏ่‰ฒใงใ™"
-#: ../syntax.c:6564
#, c-format
msgid "E421: Color name or number not recognized: %s"
msgstr "E421: ใ‚ซใƒฉใƒผๅใ‚„็•ชๅทใ‚’่ช่ญ˜ใงใใพใ›ใ‚“: %s"
-#: ../syntax.c:6714
#, c-format
msgid "E422: terminal code too long: %s"
msgstr "E422: ็ต‚็ซฏใ‚ณใƒผใƒ‰ใŒ้•ท้ŽใŽใพใ™: %s"
-#: ../syntax.c:6753
#, c-format
msgid "E423: Illegal argument: %s"
msgstr "E423: ไธๆญฃใชๅผ•ๆ•ฐใงใ™: %s"
-#: ../syntax.c:6925
msgid "E424: Too many different highlighting attributes in use"
msgstr "E424: ๅคšใใฎ็•ฐใชใ‚‹ใƒใ‚คใƒฉใ‚คใƒˆๅฑžๆ€งใŒไฝฟใ‚ใ‚Œ้ŽใŽใฆใ„ใพใ™"
-#: ../syntax.c:7427
msgid "E669: Unprintable character in group name"
msgstr "E669: ใ‚ฐใƒซใƒผใƒ—ๅใซๅฐๅˆทไธๅฏ่ƒฝใชๆ–‡ๅญ—ใŒใ‚ใ‚Šใพใ™"
-#: ../syntax.c:7434
msgid "W18: Invalid character in group name"
msgstr "W18: ใ‚ฐใƒซใƒผใƒ—ๅใซไธๆญฃใชๆ–‡ๅญ—ใŒใ‚ใ‚Šใพใ™"
-#: ../syntax.c:7448
msgid "E849: Too many highlight and syntax groups"
msgstr "E849: ใƒใ‚คใƒฉใ‚คใƒˆใจๆง‹ๆ–‡ใ‚ฐใƒซใƒผใƒ—ใŒๅคš้ŽใŽใพใ™"
-#: ../tag.c:104
msgid "E555: at bottom of tag stack"
msgstr "E555: ใ‚ฟใ‚ฐใ‚นใ‚ฟใƒƒใ‚ฏใฎๆœซๅฐพใงใ™"
-#: ../tag.c:105
msgid "E556: at top of tag stack"
msgstr "E556: ใ‚ฟใ‚ฐใ‚นใ‚ฟใƒƒใ‚ฏใฎๅ…ˆ้ ญใงใ™"
-#: ../tag.c:380
msgid "E425: Cannot go before first matching tag"
-msgstr "E425: ๆœ€ๅˆใฎ่ฉฒๅฝ“ใ‚ฟใ‚ฐใ‚’่ถ…ใˆใฆๆˆปใ‚‹ใ“ใจใฏใงใใพใ›ใ‚“"
+msgstr "E425: ๆœ€ๅˆใฎ่ฉฒๅฝ“ใ‚ฟใ‚ฐใ‚’่ถŠใˆใฆๆˆปใ‚‹ใ“ใจใฏใงใใพใ›ใ‚“"
-#: ../tag.c:504
#, c-format
msgid "E426: tag not found: %s"
msgstr "E426: ใ‚ฟใ‚ฐใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“: %s"
-#: ../tag.c:528
msgid " # pri kind tag"
msgstr " # pri kind tag"
-#: ../tag.c:531
msgid "file\n"
msgstr "ใƒ•ใ‚กใ‚คใƒซ\n"
-#: ../tag.c:829
msgid "E427: There is only one matching tag"
msgstr "E427: ่ฉฒๅฝ“ใ‚ฟใ‚ฐใŒ1ใคใ ใ‘ใ—ใ‹ใ‚ใ‚Šใพใ›ใ‚“"
-#: ../tag.c:831
msgid "E428: Cannot go beyond last matching tag"
-msgstr "E428: ๆœ€ๅพŒใซ่ฉฒๅฝ“ใ™ใ‚‹ใ‚ฟใ‚ฐใ‚’่ถ…ใˆใฆ้€ฒใ‚€ใ“ใจใฏใงใใพใ›ใ‚“"
+msgstr "E428: ๆœ€ๅพŒใฎ่ฉฒๅฝ“ใ‚ฟใ‚ฐใ‚’่ถŠใˆใฆ้€ฒใ‚€ใ“ใจใฏใงใใพใ›ใ‚“"
-#: ../tag.c:850
#, c-format
msgid "File \"%s\" does not exist"
msgstr "ใƒ•ใ‚กใ‚คใƒซ \"%s\" ใŒใ‚ใ‚Šใพใ›ใ‚“"
-#. Give an indication of the number of matching tags
-#: ../tag.c:859
#, c-format
msgid "tag %d of %d%s"
msgstr "ใ‚ฟใ‚ฐ %d (ๅ…จ%d%s)"
-#: ../tag.c:862
msgid " or more"
msgstr " ใ‹ใใ‚ŒไปฅไธŠ"
-#: ../tag.c:864
msgid " Using tag with different case!"
msgstr " ใ‚ฟใ‚ฐใ‚’็•ฐใชใ‚‹caseใงไฝฟ็”จใ—ใพใ™!"
-#: ../tag.c:909
#, c-format
msgid "E429: File \"%s\" does not exist"
msgstr "E429: ใƒ•ใ‚กใ‚คใƒซ \"%s\" ใŒใ‚ใ‚Šใพใ›ใ‚“"
-#. Highlight title
-#: ../tag.c:960
msgid ""
"\n"
" # TO tag FROM line in file/text"
@@ -6054,79 +5668,64 @@ msgstr ""
"\n"
" # TO ใ‚ฟใ‚ฐ FROM ่กŒ in file/text"
-#: ../tag.c:1303
#, c-format
msgid "Searching tags file %s"
msgstr "ใ‚ฟใ‚ฐใƒ•ใ‚กใ‚คใƒซ %s ใ‚’ๆคœ็ดขไธญ"
-#: ../tag.c:1545
+#, c-format
+msgid "E430: Tag file path truncated for %s\n"
+msgstr "E430: ใ‚ฟใ‚ฐใƒ•ใ‚กใ‚คใƒซใฎใƒ‘ใ‚นใŒ %s ใซๅˆ‡ใ‚Šๆจใฆใ‚‰ใ‚Œใพใ—ใŸ\n"
+
msgid "Ignoring long line in tags file"
msgstr "ใ‚ฟใ‚ฐใƒ•ใ‚กใ‚คใƒซๅ†…ใฎ้•ทใ„่กŒใ‚’็„ก่ฆ–ใ—ใพใ™"
-#: ../tag.c:1915
#, c-format
msgid "E431: Format error in tags file \"%s\""
msgstr "E431: ใ‚ฟใ‚ฐใƒ•ใ‚กใ‚คใƒซ \"%s\" ใฎใƒ•ใ‚ฉใƒผใƒžใƒƒใƒˆใซใ‚จใƒฉใƒผใŒใ‚ใ‚Šใพใ™"
-#: ../tag.c:1917
#, c-format
-msgid "Before byte %<PRId64>"
-msgstr "็›ดๅ‰ใฎ %<PRId64> ใƒใ‚คใƒˆ"
+msgid "Before byte %ld"
+msgstr "็›ดๅ‰ใฎ %ld ใƒใ‚คใƒˆ"
-#: ../tag.c:1929
#, c-format
msgid "E432: Tags file not sorted: %s"
msgstr "E432: ใ‚ฟใ‚ฐใƒ•ใ‚กใ‚คใƒซใŒใ‚ฝใƒผใƒˆใ•ใ‚Œใฆใ„ใพใ›ใ‚“: %s"
-#. never opened any tags file
-#: ../tag.c:1960
msgid "E433: No tags file"
msgstr "E433: ใ‚ฟใ‚ฐใƒ•ใ‚กใ‚คใƒซใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../tag.c:2536
msgid "E434: Can't find tag pattern"
msgstr "E434: ใ‚ฟใ‚ฐใƒ‘ใ‚ฟใƒผใƒณใ‚’่ฆ‹ใคใ‘ใ‚‰ใ‚Œใพใ›ใ‚“"
-#: ../tag.c:2544
msgid "E435: Couldn't find tag, just guessing!"
msgstr "E435: ใ‚ฟใ‚ฐใ‚’่ฆ‹ใคใ‘ใ‚‰ใ‚Œใชใ„ใฎใงๅ˜ใซๆŽจๆธฌใ—ใพใ™!"
-#: ../tag.c:2797
#, c-format
msgid "Duplicate field name: %s"
msgstr "้‡่ค‡ใ—ใŸใƒ•ใ‚ฃใƒผใƒซใƒ‰ๅ: %s"
-#: ../term.c:1442
msgid "' not known. Available builtin terminals are:"
msgstr "' ใฏๆœช็Ÿฅใงใ™. ็พ่กŒใฎ็ต„ใฟ่พผใฟ็ซฏๆœซใฏๆฌกใฎใจใŠใ‚Šใงใ™:"
-#: ../term.c:1463
msgid "defaulting to '"
msgstr "็œ็•ฅๅ€คใ‚’ๆฌกใฎใ‚ˆใ†ใซ่จญๅฎšใ—ใพใ™ '"
-#: ../term.c:1731
msgid "E557: Cannot open termcap file"
msgstr "E557: termcapใƒ•ใ‚กใ‚คใƒซใ‚’้–‹ใ‘ใพใ›ใ‚“"
-#: ../term.c:1735
msgid "E558: Terminal entry not found in terminfo"
msgstr "E558: terminfoใซ็ซฏๆœซใ‚จใƒณใƒˆใƒชใ‚’่ฆ‹ใคใ‘ใ‚‰ใ‚Œใพใ›ใ‚“"
-#: ../term.c:1737
msgid "E559: Terminal entry not found in termcap"
msgstr "E559: termcapใซ็ซฏๆœซใ‚จใƒณใƒˆใƒชใ‚’่ฆ‹ใคใ‘ใ‚‰ใ‚Œใพใ›ใ‚“"
-#: ../term.c:1878
#, c-format
msgid "E436: No \"%s\" entry in termcap"
msgstr "E436: termcapใซ \"%s\" ใฎใ‚จใƒณใƒˆใƒชใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../term.c:2249
msgid "E437: terminal capability \"cm\" required"
msgstr "E437: ็ซฏๆœซใซ \"cm\" ๆฉŸ่ƒฝใŒๅฟ…่ฆใงใ™"
-#. Highlight title
-#: ../term.c:4376
msgid ""
"\n"
"--- Terminal keys ---"
@@ -6134,168 +5733,363 @@ msgstr ""
"\n"
"--- ็ซฏๆœซใ‚ญใƒผ ---"
-#: ../ui.c:481
+msgid "Cannot open $VIMRUNTIME/rgb.txt"
+msgstr "$VIMRUNTIME/rgb.txtใ‚’้–‹ใ‘ใพใ›ใ‚“"
+
+#, c-format
+msgid "Kill job in \"%s\"?"
+msgstr "\"%s\" ๅ†…ใฎใ‚ธใƒงใƒ–ใ‚’็ต‚ไบ†ใ—ใพใ™ใ‹?"
+
+msgid "Terminal"
+msgstr "็ซฏๆœซ"
+
+msgid "Terminal-finished"
+msgstr "็ซฏๆœซ (็ต‚ไบ†)"
+
+msgid "active"
+msgstr "ใ‚ขใ‚ฏใƒ†ใ‚ฃใƒ–"
+
+msgid "running"
+msgstr "ๅฎŸ่กŒไธญ"
+
+msgid "finished"
+msgstr "็ต‚ไบ†"
+
+#, c-format
+msgid "E953: File exists: %s"
+msgstr "E953: ใƒ•ใ‚กใ‚คใƒซใฏๆ—ขใซๅญ˜ๅœจใ—ใพใ™: %s"
+
+msgid "E955: Not a terminal buffer"
+msgstr "E955: ็ซฏๆœซใƒใƒƒใƒ•ใ‚กใงใฏใ‚ใ‚Šใพใ›ใ‚“"
+
+msgid "new shell started\n"
+msgstr "ๆ–ฐใ—ใ„ใ‚ทใ‚งใƒซใ‚’่ตทๅ‹•ใ—ใพใ™\n"
+
msgid "Vim: Error reading input, exiting...\n"
msgstr "Vim: ๅ…ฅๅŠ›ใ‚’่ชญ่พผใฟไธญใฎใ‚จใƒฉใƒผใซใ‚ˆใ‚Š็ต‚ไบ†ใ—ใพใ™...\n"
-#. This happens when the FileChangedRO autocommand changes the
-#. * file in a way it becomes shorter.
-#: ../undo.c:379
+msgid "Used CUT_BUFFER0 instead of empty selection"
+msgstr "็ฉบใฎ้ธๆŠž้ ˜ๅŸŸใฎใ‹ใ‚ใ‚ŠใซCUT_BUFFER0ใŒไฝฟ็”จใ•ใ‚Œใพใ—ใŸ"
+
msgid "E881: Line count changed unexpectedly"
msgstr "E881: ไบˆๆœŸใ›ใš่กŒใ‚ซใ‚ฆใƒณใƒˆใŒๅค‰ใ‚ใ‚Šใพใ—ใŸ"
-#: ../undo.c:627
+msgid "No undo possible; continue anyway"
+msgstr "ๅฏ่ƒฝใชใ‚ขใƒณใƒ‰ใ‚ฅใฏใ‚ใ‚Šใพใ›ใ‚“: ใจใ‚Šใ‚ใˆใš็ถšใ‘ใพใ™"
+
#, c-format
msgid "E828: Cannot open undo file for writing: %s"
msgstr "E828: ๆ›ธ่พผใฟ็”จใซใ‚ขใƒณใƒ‰ใ‚ฅใƒ•ใ‚กใ‚คใƒซใ‚’้–‹ใ‘ใพใ›ใ‚“: %s"
-#: ../undo.c:717
#, c-format
msgid "E825: Corrupted undo file (%s): %s"
msgstr "E825: ใ‚ขใƒณใƒ‰ใ‚ฅใƒ•ใ‚กใ‚คใƒซใŒๅฃŠใ‚Œใฆใ„ใพใ™ (%s): %s"
-#: ../undo.c:1039
msgid "Cannot write undo file in any directory in 'undodir'"
msgstr "'undodir'ใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใซใ‚ขใƒณใƒ‰ใ‚ฅใƒ•ใ‚กใ‚คใƒซใ‚’ๆ›ธใ่พผใ‚ใพใ›ใ‚“"
-#: ../undo.c:1074
#, c-format
msgid "Will not overwrite with undo file, cannot read: %s"
msgstr "ใ‚ขใƒณใƒ‰ใ‚ฅใƒ•ใ‚กใ‚คใƒซใจใ—ใฆ่ชญใฟ่พผใ‚ใชใ„ใฎใงไธŠๆ›ธใใ—ใพใ›ใ‚“: %s"
-#: ../undo.c:1092
#, c-format
msgid "Will not overwrite, this is not an undo file: %s"
msgstr "ใ‚ขใƒณใƒ‰ใ‚ฅใƒ•ใ‚กใ‚คใƒซใงใฏใชใ„ใฎใงไธŠๆ›ธใใ—ใพใ›ใ‚“: %s"
-#: ../undo.c:1108
msgid "Skipping undo file write, nothing to undo"
msgstr "ๅฏพ่ฑกใŒใชใ„ใฎใงใ‚ขใƒณใƒ‰ใ‚ฅใƒ•ใ‚กใ‚คใƒซใฎๆ›ธใ่พผใฟใ‚’ใ‚นใ‚ญใƒƒใƒ—ใ—ใพใ™"
-#: ../undo.c:1121
#, c-format
msgid "Writing undo file: %s"
msgstr "ใ‚ขใƒณใƒ‰ใ‚ฅใƒ•ใ‚กใ‚คใƒซๆ›ธใ่พผใฟไธญ: %s"
-#: ../undo.c:1213
#, c-format
msgid "E829: write error in undo file: %s"
msgstr "E829: ใ‚ขใƒณใƒ‰ใ‚ฅใƒ•ใ‚กใ‚คใƒซใฎๆ›ธใ่พผใฟใ‚จใƒฉใƒผใงใ™: %s"
-#: ../undo.c:1280
#, c-format
msgid "Not reading undo file, owner differs: %s"
msgstr "ใ‚ชใƒผใƒŠใƒผใŒ็•ฐใชใ‚‹ใฎใงใ‚ขใƒณใƒ‰ใ‚ฅใƒ•ใ‚กใ‚คใƒซใ‚’่ชญใฟ่พผใฟใพใ›ใ‚“: %s"
-#: ../undo.c:1292
#, c-format
msgid "Reading undo file: %s"
msgstr "ใ‚ขใƒณใƒ‰ใ‚ฅใƒ•ใ‚กใ‚คใƒซ่ชญ่พผไธญ: %s"
-#: ../undo.c:1299
#, c-format
msgid "E822: Cannot open undo file for reading: %s"
msgstr "E822: ใ‚ขใƒณใƒ‰ใ‚ฅใƒ•ใ‚กใ‚คใƒซใ‚’่ชญ่พผ็”จใจใ—ใฆ้–‹ใ‘ใพใ›ใ‚“: %s"
-#: ../undo.c:1308
#, c-format
msgid "E823: Not an undo file: %s"
msgstr "E823: ใ‚ขใƒณใƒ‰ใ‚ฅใƒ•ใ‚กใ‚คใƒซใงใฏใ‚ใ‚Šใพใ›ใ‚“: %s"
-#: ../undo.c:1313
+#, c-format
+msgid "E832: Non-encrypted file has encrypted undo file: %s"
+msgstr "E832: ้žๆš—ๅทๅŒ–ใƒ•ใ‚กใ‚คใƒซใŒๆš—ๅทๅŒ–ใ•ใ‚ŒใŸใ‚ขใƒณใƒ‰ใ‚ฅใƒ•ใ‚กใ‚คใƒซใ‚’ไฝฟใฃใฆใพใ™: %s"
+
+#, c-format
+msgid "E826: Undo file decryption failed: %s"
+msgstr "E826: ๆš—ๅทๅŒ–ใ•ใ‚ŒใŸใ‚ขใƒณใƒ‰ใ‚ฅใƒ•ใ‚กใ‚คใƒซใฎ่งฃ่ชญใซๅคฑๆ•—ใ—ใพใ—ใŸ: %s"
+
+#, c-format
+msgid "E827: Undo file is encrypted: %s"
+msgstr "E827: ใ‚ขใƒณใƒ‰ใ‚ฅใƒ•ใ‚กใ‚คใƒซใŒๆš—ๅทๅŒ–ใ•ใ‚Œใฆใ„ใพใ™: %s"
+
#, c-format
msgid "E824: Incompatible undo file: %s"
msgstr "E824: ไบ’ๆ›ๆ€งใฎ็„กใ„ใ‚ขใƒณใƒ‰ใ‚ฅใƒ•ใ‚กใ‚คใƒซใงใ™: %s"
-#: ../undo.c:1328
msgid "File contents changed, cannot use undo info"
msgstr "ใƒ•ใ‚กใ‚คใƒซใฎๅ†…ๅฎนใŒๅค‰ใ‚ใฃใฆใ„ใ‚‹ใŸใ‚ใ€ใ‚ขใƒณใƒ‰ใ‚ฅๆƒ…ๅ ฑใ‚’ๅˆฉ็”จใงใใพใ›ใ‚“"
-#: ../undo.c:1497
#, c-format
msgid "Finished reading undo file %s"
msgstr "ใ‚ขใƒณใƒ‰ใ‚ฅใƒ•ใ‚กใ‚คใƒซ %s ใฎๅ–่พผใ‚’ๅฎŒไบ†"
-#: ../undo.c:1586 ../undo.c:1812
msgid "Already at oldest change"
msgstr "ๆ—ขใซไธ€็•ชๅคใ„ๅค‰ๆ›ดใงใ™"
-#: ../undo.c:1597 ../undo.c:1814
msgid "Already at newest change"
msgstr "ๆ—ขใซไธ€็•ชๆ–ฐใ—ใ„ๅค‰ๆ›ดใงใ™"
-#: ../undo.c:1806
#, c-format
-msgid "E830: Undo number %<PRId64> not found"
-msgstr "E830: ใ‚ขใƒณใƒ‰ใ‚ฅ็•ชๅท %<PRId64> ใฏ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
+msgid "E830: Undo number %ld not found"
+msgstr "E830: ใ‚ขใƒณใƒ‰ใ‚ฅ็•ชๅท %ld ใฏ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-#: ../undo.c:1979
msgid "E438: u_undo: line numbers wrong"
msgstr "E438: u_undo: ่กŒ็•ชๅทใŒ้–“้•ใฃใฆใ„ใพใ™"
-#: ../undo.c:2183
msgid "more line"
msgstr "่กŒ ่ฟฝๅŠ ใ—ใพใ—ใŸ"
-#: ../undo.c:2185
msgid "more lines"
msgstr "่กŒ ่ฟฝๅŠ ใ—ใพใ—ใŸ"
-#: ../undo.c:2187
msgid "line less"
msgstr "่กŒ ๅ‰Š้™คใ—ใพใ—ใŸ"
-#: ../undo.c:2189
msgid "fewer lines"
msgstr "่กŒ ๅ‰Š้™คใ—ใพใ—ใŸ"
-#: ../undo.c:2193
msgid "change"
msgstr "็ฎ‡ๆ‰€ๅค‰ๆ›ดใ—ใพใ—ใŸ"
-#: ../undo.c:2195
msgid "changes"
msgstr "็ฎ‡ๆ‰€ๅค‰ๆ›ดใ—ใพใ—ใŸ"
-#: ../undo.c:2225
#, c-format
-msgid "%<PRId64> %s; %s #%<PRId64> %s"
-msgstr "%<PRId64> %s; %s #%<PRId64> %s"
+msgid "%ld %s; %s #%ld %s"
+msgstr "%ld %s; %s #%ld %s"
-#: ../undo.c:2228
msgid "before"
msgstr "ๅ‰ๆ–น"
-#: ../undo.c:2228
msgid "after"
msgstr "ๅพŒๆ–น"
-#: ../undo.c:2325
msgid "Nothing to undo"
msgstr "ใ‚ขใƒณใƒ‰ใ‚ฅๅฏพ่ฑกใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../undo.c:2330
msgid "number changes when saved"
msgstr "้€š็•ช ๅค‰ๆ›ดๆ•ฐ ๅค‰ๆ›ดๆ™‚ๆœŸ ไฟๅญ˜ๆธˆ"
-#: ../undo.c:2360
#, c-format
-msgid "%<PRId64> seconds ago"
-msgstr "%<PRId64> ็ง’็ตŒ้Žใ—ใฆใ„ใพใ™"
+msgid "%ld seconds ago"
+msgstr "%ld ็ง’็ตŒ้Žใ—ใฆใ„ใพใ™"
-#: ../undo.c:2372
msgid "E790: undojoin is not allowed after undo"
msgstr "E790: undo ใฎ็›ดๅพŒใซ undojoin ใฏใงใใพใ›ใ‚“"
-#: ../undo.c:2466
msgid "E439: undo list corrupt"
msgstr "E439: ใ‚ขใƒณใƒ‰ใ‚ฅใƒชใ‚นใƒˆใŒๅฃŠใ‚Œใฆใ„ใพใ™"
-#: ../undo.c:2495
msgid "E440: undo line missing"
msgstr "E440: ใ‚ขใƒณใƒ‰ใ‚ฅ่กŒใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../version.c:600
+#, c-format
+msgid "E122: Function %s already exists, add ! to replace it"
+msgstr "E122: ้–ขๆ•ฐ %s ใฏๅฎš็พฉๆธˆใงใ™ใ€ๅ†ๅฎš็พฉใ™ใ‚‹ใซใฏ ! ใ‚’่ฟฝๅŠ ใ—ใฆใใ ใ•ใ„"
+
+msgid "E717: Dictionary entry already exists"
+msgstr "E717: ่พžๆ›ธๅž‹ๅ†…ใซใ‚จใƒณใƒˆใƒชใŒๆ—ขใซๅญ˜ๅœจใ—ใพใ™"
+
+msgid "E718: Funcref required"
+msgstr "E718: ้–ขๆ•ฐๅ‚็…งๅž‹ใŒ่ฆๆฑ‚ใ•ใ‚Œใพใ™"
+
+#, c-format
+msgid "E130: Unknown function: %s"
+msgstr "E130: ๆœช็Ÿฅใฎ้–ขๆ•ฐใงใ™: %s"
+
+#, c-format
+msgid "E125: Illegal argument: %s"
+msgstr "E125: ไธๆญฃใชๅผ•ๆ•ฐใงใ™: %s"
+
+#, c-format
+msgid "E853: Duplicate argument name: %s"
+msgstr "E853: ๅผ•ๆ•ฐๅใŒ้‡่ค‡ใ—ใฆใ„ใพใ™: %s"
+
+#, c-format
+msgid "E740: Too many arguments for function %s"
+msgstr "E740: ้–ขๆ•ฐใฎๅผ•ๆ•ฐใŒๅคš้ŽใŽใพใ™: %s"
+
+#, c-format
+msgid "E116: Invalid arguments for function %s"
+msgstr "E116: ้–ขๆ•ฐใฎ็„กๅŠนใชๅผ•ๆ•ฐใงใ™: %s"
+
+msgid "E132: Function call depth is higher than 'maxfuncdepth'"
+msgstr "E132: ้–ขๆ•ฐๅ‘ผๅ‡บใฎๅ…ฅใ‚Œๅญๆ•ฐใŒ 'maxfuncdepth' ใ‚’่ถ…ใˆใพใ—ใŸ"
+
+#, c-format
+msgid "calling %s"
+msgstr "%s ใ‚’ๅฎŸ่กŒไธญใงใ™"
+
+#, c-format
+msgid "%s aborted"
+msgstr "%s ใŒไธญๆ–ญใ•ใ‚Œใพใ—ใŸ"
+
+#, c-format
+msgid "%s returning #%ld"
+msgstr "%s ใŒ #%ld ใ‚’่ฟ”ใ—ใพใ—ใŸ"
+
+#, c-format
+msgid "%s returning %s"
+msgstr "%s ใŒ %s ใ‚’่ฟ”ใ—ใพใ—ใŸ"
+
+msgid "E699: Too many arguments"
+msgstr "E699: ๅผ•ๆ•ฐใŒๅคš้ŽใŽใพใ™"
+
+#, c-format
+msgid "E117: Unknown function: %s"
+msgstr "E117: ๆœช็Ÿฅใฎ้–ขๆ•ฐใงใ™: %s"
+
+#, c-format
+msgid "E933: Function was deleted: %s"
+msgstr "E933: ้–ขๆ•ฐใฏๅ‰Š้™คใ•ใ‚Œใพใ—ใŸ: %s"
+
+#, c-format
+msgid "E119: Not enough arguments for function: %s"
+msgstr "E119: ้–ขๆ•ฐใฎๅผ•ๆ•ฐใŒ่ถณใ‚Šใพใ›ใ‚“: %s"
+
+#, c-format
+msgid "E120: Using <SID> not in a script context: %s"
+msgstr "E120: ใ‚นใ‚ฏใƒชใƒ—ใƒˆไปฅๅค–ใง<SID>ใŒไฝฟใ‚ใ‚Œใพใ—ใŸ: %s"
+
+#, c-format
+msgid "E725: Calling dict function without Dictionary: %s"
+msgstr "E725: ่พžๆ›ธ็”จ้–ขๆ•ฐใŒๅ‘ผใฐใ‚Œใพใ—ใŸใŒ่พžๆ›ธใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
+
+msgid "E129: Function name required"
+msgstr "E129: ้–ขๆ•ฐๅใŒ่ฆๆฑ‚ใ•ใ‚Œใพใ™"
+
+#, c-format
+msgid "E128: Function name must start with a capital or \"s:\": %s"
+msgstr "E128: ้–ขๆ•ฐๅใฏๅคงๆ–‡ๅญ—ใ‹ \"s:\" ใงๅง‹ใพใ‚‰ใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“: %s"
+
+#, c-format
+msgid "E884: Function name cannot contain a colon: %s"
+msgstr "E884: ้–ขๆ•ฐๅใซใฏใ‚ณใƒญใƒณใฏๅซใ‚ใ‚‰ใ‚Œใพใ›ใ‚“: %s"
+
+#, c-format
+msgid "E123: Undefined function: %s"
+msgstr "E123: ๆœชๅฎš็พฉใฎ้–ขๆ•ฐใงใ™: %s"
+
+#, c-format
+msgid "E124: Missing '(': %s"
+msgstr "E124: '(' ใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
+
+msgid "E862: Cannot use g: here"
+msgstr "E862: ใ“ใ“ใงใฏ g: ใฏไฝฟใˆใพใ›ใ‚“"
+
+#, c-format
+msgid "E932: Closure function should not be at top level: %s"
+msgstr "E932: ใ‚ฏใƒญใƒผใ‚ธใƒฃใƒผ้–ขๆ•ฐใฏใƒˆใƒƒใƒ—ใƒฌใƒ™ใƒซใซ่จ˜่ฟฐใงใใพใ›ใ‚“: %s"
+
+msgid "E126: Missing :endfunction"
+msgstr "E126: :endfunction ใŒใ‚ใ‚Šใพใ›ใ‚“"
+
+#, c-format
+msgid "W22: Text found after :endfunction: %s"
+msgstr "W22: :endfunction ใฎๅพŒใซๆ–‡ๅญ—ใŒใ‚ใ‚Šใพใ™: %s"
+
+#, c-format
+msgid "E707: Function name conflicts with variable: %s"
+msgstr "E707: ้–ขๆ•ฐๅใŒๅค‰ๆ•ฐๅใจ่ก็ชใ—ใพใ™: %s"
+
+#, c-format
+msgid "E127: Cannot redefine function %s: It is in use"
+msgstr "E127: ้–ขๆ•ฐ %s ใ‚’ๅ†ๅฎš็พฉใงใใพใ›ใ‚“: ไฝฟ็”จไธญใงใ™"
+
+#, c-format
+msgid "E746: Function name does not match script file name: %s"
+msgstr "E746: ้–ขๆ•ฐๅใŒใ‚นใ‚ฏใƒชใƒ—ใƒˆใฎใƒ•ใ‚กใ‚คใƒซๅใจไธ€่‡ดใ—ใพใ›ใ‚“: %s"
+
+#, c-format
+msgid "E131: Cannot delete function %s: It is in use"
+msgstr "E131: ้–ขๆ•ฐ %s ใ‚’ๅ‰Š้™คใงใใพใ›ใ‚“: ไฝฟ็”จไธญใงใ™"
+
+msgid "E133: :return not inside a function"
+msgstr "E133: ้–ขๆ•ฐๅค–ใซ :return ใŒใ‚ใ‚Šใพใ—ใŸ"
+
+#, c-format
+msgid "E107: Missing parentheses: %s"
+msgstr "E107: ใ‚ซใƒƒใ‚ณ '(' ใŒใ‚ใ‚Šใพใ›ใ‚“: %s"
+
+#, c-format
+msgid "%s (%s, compiled %s)"
+msgstr "%s (%s, compiled %s)"
+
+msgid ""
+"\n"
+"MS-Windows 64-bit GUI version"
+msgstr ""
+"\n"
+"MS-Windows 64 ใƒ“ใƒƒใƒˆ GUI ็‰ˆ"
+
+msgid ""
+"\n"
+"MS-Windows 32-bit GUI version"
+msgstr ""
+"\n"
+"MS-Windows 32 ใƒ“ใƒƒใƒˆ GUI ็‰ˆ"
+
+msgid " with OLE support"
+msgstr " with OLE ใ‚ตใƒใƒผใƒˆ"
+
+msgid ""
+"\n"
+"MS-Windows 64-bit console version"
+msgstr ""
+"\n"
+"MS-Windows 64 ใƒ“ใƒƒใƒˆ ใ‚ณใƒณใ‚ฝใƒผใƒซ ็‰ˆ"
+
+msgid ""
+"\n"
+"MS-Windows 32-bit console version"
+msgstr ""
+"\n"
+"MS-Windows 32 ใƒ“ใƒƒใƒˆ ใ‚ณใƒณใ‚ฝใƒผใƒซ ็‰ˆ"
+
+msgid ""
+"\n"
+"macOS version"
+msgstr ""
+"\n"
+"macOS ็‰ˆ"
+
+msgid ""
+"\n"
+"macOS version w/o darwin feat."
+msgstr ""
+"\n"
+"macOS ็‰ˆ (darwin ็„กใ—)"
+
+msgid ""
+"\n"
+"OpenVMS version"
+msgstr ""
+"\n"
+"OpenVMS ็‰ˆ"
+
msgid ""
"\n"
"Included patches: "
@@ -6303,7 +6097,6 @@ msgstr ""
"\n"
"้ฉ็”จๆธˆใƒ‘ใƒƒใƒ: "
-#: ../version.c:627
msgid ""
"\n"
"Extra patches: "
@@ -6311,11 +6104,9 @@ msgstr ""
"\n"
"่ฟฝๅŠ ๆ‹กๅผตใƒ‘ใƒƒใƒ: "
-#: ../version.c:639 ../version.c:864
msgid "Modified by "
msgstr "Modified by "
-#: ../version.c:646
msgid ""
"\n"
"Compiled "
@@ -6323,11 +6114,9 @@ msgstr ""
"\n"
"Compiled "
-#: ../version.c:649
msgid "by "
msgstr "by "
-#: ../version.c:660
msgid ""
"\n"
"Huge version "
@@ -6335,1886 +6124,950 @@ msgstr ""
"\n"
"Huge ็‰ˆ "
-#: ../version.c:661
+msgid ""
+"\n"
+"Big version "
+msgstr ""
+"\n"
+"Big ็‰ˆ "
+
+msgid ""
+"\n"
+"Normal version "
+msgstr ""
+"\n"
+"้€šๅธธ ็‰ˆ "
+
+msgid ""
+"\n"
+"Small version "
+msgstr ""
+"\n"
+"Small ็‰ˆ "
+
+msgid ""
+"\n"
+"Tiny version "
+msgstr ""
+"\n"
+"Tiny ็‰ˆ "
+
msgid "without GUI."
msgstr "without GUI."
-#: ../version.c:662
+msgid "with GTK3 GUI."
+msgstr "with GTK3 GUI."
+
+msgid "with GTK2-GNOME GUI."
+msgstr "with GTK2-GNOME GUI."
+
+msgid "with GTK2 GUI."
+msgstr "with GTK2 GUI."
+
+msgid "with X11-Motif GUI."
+msgstr "with X11-Motif GUI."
+
+msgid "with X11-neXtaw GUI."
+msgstr "with X11-neXtaw GUI."
+
+msgid "with X11-Athena GUI."
+msgstr "with X11-Athena GUI."
+
+msgid "with Photon GUI."
+msgstr "with Photon GUI."
+
+msgid "with GUI."
+msgstr "with GUI."
+
+msgid "with Carbon GUI."
+msgstr "with Carbon GUI."
+
+msgid "with Cocoa GUI."
+msgstr "with Cocoa GUI."
+
msgid " Features included (+) or not (-):\n"
msgstr " ๆฉŸ่ƒฝใฎไธ€่ฆง ๆœ‰ๅŠน(+)/็„กๅŠน(-)\n"
-#: ../version.c:667
msgid " system vimrc file: \""
msgstr " ใ‚ทใ‚นใƒ†ใƒ  vimrc: \""
-#: ../version.c:672
msgid " user vimrc file: \""
msgstr " ใƒฆใƒผใ‚ถใƒผ vimrc: \""
-#: ../version.c:677
msgid " 2nd user vimrc file: \""
msgstr " ็ฌฌ2ใƒฆใƒผใ‚ถใƒผ vimrc: \""
-#: ../version.c:682
msgid " 3rd user vimrc file: \""
msgstr " ็ฌฌ3ใƒฆใƒผใ‚ถใƒผ vimrc: \""
-#: ../version.c:687
msgid " user exrc file: \""
msgstr " ใƒฆใƒผใ‚ถใƒผ exrc: \""
-#: ../version.c:692
msgid " 2nd user exrc file: \""
msgstr " ็ฌฌ2ใƒฆใƒผใ‚ถใƒผ exrc: \""
-#: ../version.c:699
+msgid " system gvimrc file: \""
+msgstr " ใ‚ทใ‚นใƒ†ใƒ  gvimrc: \""
+
+msgid " user gvimrc file: \""
+msgstr " ใƒฆใƒผใ‚ถใƒผ gvimrc: \""
+
+msgid "2nd user gvimrc file: \""
+msgstr " ็ฌฌ2ใƒฆใƒผใ‚ถใƒผ gvimrc: \""
+
+msgid "3rd user gvimrc file: \""
+msgstr " ็ฌฌ3ใƒฆใƒผใ‚ถใƒผ gvimrc: \""
+
+msgid " defaults file: \""
+msgstr " ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใƒ•ใ‚กใ‚คใƒซ: \""
+
+msgid " system menu file: \""
+msgstr " ใ‚ทใ‚นใƒ†ใƒ ใƒกใƒ‹ใƒฅใƒผ: \""
+
msgid " fall-back for $VIM: \""
msgstr " ็œ็•ฅๆ™‚ใฎ $VIM: \""
-#: ../version.c:705
msgid " f-b for $VIMRUNTIME: \""
msgstr "็œ็•ฅๆ™‚ใฎ $VIMRUNTIME: \""
-#: ../version.c:709
msgid "Compilation: "
msgstr "ใ‚ณใƒณใƒ‘ใ‚คใƒซ: "
-#: ../version.c:712
+msgid "Compiler: "
+msgstr "ใ‚ณใƒณใƒ‘ใ‚คใƒฉ: "
+
msgid "Linking: "
msgstr "ใƒชใƒณใ‚ฏ: "
-#: ../version.c:717
msgid " DEBUG BUILD"
msgstr "ใƒ‡ใƒใƒƒใ‚ฐใƒ“ใƒซใƒ‰"
-#: ../version.c:767
msgid "VIM - Vi IMproved"
msgstr "VIM - Vi IMproved"
-#: ../version.c:769
msgid "version "
msgstr "version "
-#: ../version.c:770
msgid "by Bram Moolenaar et al."
msgstr "by Bram Moolenaar ไป–."
-#: ../version.c:774
msgid "Vim is open source and freely distributable"
msgstr "Vim ใฏใ‚ชใƒผใƒ—ใƒณใ‚ฝใƒผใ‚นใงใ‚ใ‚Š่‡ช็”ฑใซ้…ๅธƒๅฏ่ƒฝใงใ™"
-#: ../version.c:776
msgid "Help poor children in Uganda!"
msgstr "ใ‚ฆใ‚ฌใƒณใƒ€ใฎๆตใพใ‚Œใชใ„ๅญไพ›ใŸใกใซๆดๅŠฉใ‚’!"
-#: ../version.c:777
msgid "type :help iccf<Enter> for information "
msgstr "่ฉณ็ดฐใชๆƒ…ๅ ฑใฏ :help iccf<Enter> "
-#: ../version.c:779
msgid "type :q<Enter> to exit "
msgstr "็ต‚ไบ†ใ™ใ‚‹ใซใฏ :q<Enter> "
-#: ../version.c:780
msgid "type :help<Enter> or <F1> for on-line help"
msgstr "ใ‚ชใƒณใƒฉใ‚คใƒณใƒ˜ใƒซใƒ—ใฏ :help<Enter> ใ‹ <F1> "
-#: ../version.c:781
-msgid "type :help version7<Enter> for version info"
-msgstr "ใƒใƒผใ‚ธใƒงใƒณๆƒ…ๅ ฑใฏ :help version7<Enter> "
+msgid "type :help version8<Enter> for version info"
+msgstr "ใƒใƒผใ‚ธใƒงใƒณๆƒ…ๅ ฑใฏ :help version8<Enter> "
-#: ../version.c:784
msgid "Running in Vi compatible mode"
msgstr "Viไบ’ๆ›ใƒขใƒผใƒ‰ใงๅ‹•ไฝœไธญ"
-#: ../version.c:785
msgid "type :set nocp<Enter> for Vim defaults"
msgstr "VimๆŽจๅฅจๅ€คใซใ™ใ‚‹ใซใฏ :set nocp<Enter> "
-#: ../version.c:786
msgid "type :help cp-default<Enter> for info on this"
msgstr "่ฉณ็ดฐใชๆƒ…ๅ ฑใฏ :help cp-default<Enter>"
-#: ../version.c:827
+msgid "menu Help->Orphans for information "
+msgstr "่ฉณ็ดฐใฏใƒกใƒ‹ใƒฅใƒผใฎ ใƒ˜ใƒซใƒ—->ๅญคๅ… ใ‚’ๅ‚็…งใ—ใฆไธ‹ใ•ใ„ "
+
+msgid "Running modeless, typed text is inserted"
+msgstr "ใƒขใƒผใƒ‰็„กใงๅฎŸ่กŒไธญใ€‚ใ‚ฟใ‚คใƒ—ใ—ใŸๆ–‡ๅญ—ใŒๆŒฟๅ…ฅใ•ใ‚Œใพใ™"
+
+msgid "menu Edit->Global Settings->Toggle Insert Mode "
+msgstr "ใƒกใƒ‹ใƒฅใƒผใฎ ็ทจ้›†->ๅ…จไฝ“่จญๅฎš->ๆŒฟๅ…ฅ(ๅˆๅฟƒ่€…)ใƒขใƒผใƒ‰ๅˆ‡ๆ›ฟ "
+
+msgid " for two modes "
+msgstr " ใงใƒขใƒผใƒ‰ๆœ‰ใซ "
+
+msgid "menu Edit->Global Settings->Toggle Vi Compatible"
+msgstr "ใƒกใƒ‹ใƒฅใƒผใฎ ็ทจ้›†->ๅ…จไฝ“่จญๅฎš->Viไบ’ๆ›ใƒขใƒผใƒ‰ๅˆ‡ๆ›ฟ "
+
+msgid " for Vim defaults "
+msgstr " ใงVimใจใ—ใฆๅ‹•ไฝœ "
+
msgid "Sponsor Vim development!"
msgstr "Vimใฎ้–‹็™บใ‚’ๅฟœๆดใ—ใฆใใ ใ•ใ„!"
-#: ../version.c:828
msgid "Become a registered Vim user!"
msgstr "Vimใฎ็™ป้Œฒใƒฆใƒผใ‚ถใƒผใซใชใฃใฆใใ ใ•ใ„!"
-#: ../version.c:831
msgid "type :help sponsor<Enter> for information "
msgstr "่ฉณ็ดฐใชๆƒ…ๅ ฑใฏ :help sponsor<Enter> "
-#: ../version.c:832
msgid "type :help register<Enter> for information "
msgstr "่ฉณ็ดฐใชๆƒ…ๅ ฑใฏ :help register<Enter> "
-#: ../version.c:834
msgid "menu Help->Sponsor/Register for information "
msgstr "่ฉณ็ดฐใฏใƒกใƒ‹ใƒฅใƒผใฎ ใƒ˜ใƒซใƒ—->ใ‚นใƒใƒณใ‚ตใƒผ/็™ป้Œฒ ใ‚’ๅ‚็…งใ—ใฆไธ‹ใ•ใ„"
-#: ../window.c:119
msgid "Already only one window"
msgstr "ๆ—ขใซใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฏ1ใคใ—ใ‹ใ‚ใ‚Šใพใ›ใ‚“"
-#: ../window.c:224
msgid "E441: There is no preview window"
msgstr "E441: ใƒ—ใƒฌใƒ“ใƒฅใƒผใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใŒใ‚ใ‚Šใพใ›ใ‚“"
-#: ../window.c:559
msgid "E442: Can't split topleft and botright at the same time"
msgstr "E442: ๅทฆไธŠใจๅณไธ‹ใ‚’ๅŒๆ™‚ใซๅˆ†ๅ‰ฒใ™ใ‚‹ใ“ใจใฏใงใใพใ›ใ‚“"
-#: ../window.c:1228
msgid "E443: Cannot rotate when another window is split"
msgstr "E443: ไป–ใฎใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใŒๅˆ†ๅ‰ฒใ•ใ‚Œใฆใ„ใ‚‹ๆ™‚ใซใฏ้ †ๅ›žใงใใพใ›ใ‚“"
-#: ../window.c:1803
msgid "E444: Cannot close last window"
msgstr "E444: ๆœ€ๅพŒใฎใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚’้–‰ใ˜ใ‚‹ใ“ใจใฏใงใใพใ›ใ‚“"
-#: ../window.c:1810
msgid "E813: Cannot close autocmd window"
msgstr "E813: autocmdใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฏ้–‰ใ˜ใ‚‰ใ‚Œใพใ›ใ‚“"
-#: ../window.c:1814
msgid "E814: Cannot close window, only autocmd window would remain"
msgstr "E814: autocmdใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ—ใ‹ๆฎ‹ใ‚‰ใชใ„ใŸใ‚ใ€ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฏ้–‰ใ˜ใ‚‰ใ‚Œใพใ›ใ‚“"
-#: ../window.c:2717
msgid "E445: Other window contains changes"
msgstr "E445: ไป–ใฎใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใซใฏๅค‰ๆ›ดใŒใ‚ใ‚Šใพใ™"
-#: ../window.c:4805
msgid "E446: No file name under cursor"
msgstr "E446: ใ‚ซใƒผใ‚ฝใƒซใฎไธ‹ใซใƒ•ใ‚กใ‚คใƒซๅใŒใ‚ใ‚Šใพใ›ใ‚“"
-msgid "List or number required"
-msgstr "ใƒชใ‚นใƒˆใ‹ๆ•ฐๅ€คใŒๅฟ…่ฆใงใ™"
-
-#~ msgid "E831: bf_key_init() called with empty password"
-#~ msgstr "E831: bf_key_init() ใŒ็ฉบใƒ‘ใ‚นใƒฏใƒผใƒ‰ใงๅ‘ผใณๅ‡บใ•ใ‚Œใพใ—ใŸ"
-
-#~ msgid "E820: sizeof(uint32_t) != 4"
-#~ msgstr "E820: sizeof(uint32_t) != 4"
-
-#~ msgid "E817: Blowfish big/little endian use wrong"
-#~ msgstr "E817: Blowfishๆš—ๅทใฎใƒ“ใƒƒใ‚ฐ/ใƒชใƒˆใƒซใ‚จใƒณใƒ‡ใ‚ฃใ‚ขใƒณใŒ้–“้•ใฃใฆใ„ใพใ™"
-
-#~ msgid "E818: sha256 test failed"
-#~ msgstr "E818: sha256ใฎใƒ†ใ‚นใƒˆใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-
-#~ msgid "E819: Blowfish test failed"
-#~ msgstr "E819: Blowfishๆš—ๅทใฎใƒ†ใ‚นใƒˆใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-
-#~ msgid "Patch file"
-#~ msgstr "ใƒ‘ใƒƒใƒใƒ•ใ‚กใ‚คใƒซ"
-
-#~ msgid ""
-#~ "&OK\n"
-#~ "&Cancel"
-#~ msgstr ""
-#~ "ๆฑบๅฎš(&O)\n"
-#~ "ใ‚ญใƒฃใƒณใ‚ปใƒซ(&C)"
-
-#~ msgid "E240: No connection to Vim server"
-#~ msgstr "E240: Vim ใ‚ตใƒผใƒใธใฎๆŽฅ็ถšใŒใ‚ใ‚Šใพใ›ใ‚“"
-
-#~ msgid "E241: Unable to send to %s"
-#~ msgstr "E241: %s ใธ้€ใ‚‹ใ“ใจใŒใงใใพใ›ใ‚“"
-
-#~ msgid "E277: Unable to read a server reply"
-#~ msgstr "E277: ใ‚ตใƒผใƒใฎๅฟœ็ญ”ใŒใ‚ใ‚Šใพใ›ใ‚“"
-
-#~ msgid "E258: Unable to send to client"
-#~ msgstr "E258: ใ‚ฏใƒฉใ‚คใ‚ขใƒณใƒˆใธ้€ใ‚‹ใ“ใจใŒใงใใพใ›ใ‚“"
-
-#~ msgid "Save As"
-#~ msgstr "ๅˆฅๅใงไฟๅญ˜"
-
-#~ msgid "Edit File"
-#~ msgstr "ใƒ•ใ‚กใ‚คใƒซใ‚’็ทจ้›†"
-
-# Added at 27-Jan-2004.
-#~ msgid " (NOT FOUND)"
-#~ msgstr " (่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“)"
-
-#~ msgid "Source Vim script"
-#~ msgstr "Vimใ‚นใ‚ฏใƒชใƒ—ใƒˆใฎๅ–่พผใฟ"
-
-#~ msgid "unknown"
-#~ msgstr "ไธๆ˜Ž"
-
-#~ msgid "Edit File in new window"
-#~ msgstr "ๆ–ฐใ—ใ„ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใงใƒ•ใ‚กใ‚คใƒซใ‚’็ทจ้›†ใ—ใพใ™"
-
-#~ msgid "Append File"
-#~ msgstr "่ฟฝๅŠ ใƒ•ใ‚กใ‚คใƒซ"
-
-#~ msgid "Window position: X %d, Y %d"
-#~ msgstr "ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆไฝ็ฝฎ: X %d, Y %d"
-
-#~ msgid "Save Redirection"
-#~ msgstr "ใƒชใƒ€ใ‚คใƒฌใ‚ฏใƒˆใ‚’ไฟๅญ˜ใ—ใพใ™"
-
-#~ msgid "Save View"
-#~ msgstr "ใƒ“ใƒฅใƒผใ‚’ไฟๅญ˜ใ—ใพใ™"
-
-#~ msgid "Save Session"
-#~ msgstr "ใ‚ปใƒƒใ‚ทใƒงใƒณๆƒ…ๅ ฑใ‚’ไฟๅญ˜ใ—ใพใ™"
-
-#~ msgid "Save Setup"
-#~ msgstr "่จญๅฎšใ‚’ไฟๅญ˜ใ—ใพใ™"
-
-#~ msgid "E809: #< is not available without the +eval feature"
-#~ msgstr "E809: #< ใฏ +eval ๆฉŸ่ƒฝใŒ็„กใ„ใจๅˆฉ็”จใงใใพใ›ใ‚“"
-
-#~ msgid "E196: No digraphs in this version"
-#~ msgstr "E196: ใ“ใฎใƒใƒผใ‚ธใƒงใƒณใซๅˆๅญ—ใฏใ‚ใ‚Šใพใ›ใ‚“"
-
-#~ msgid "is a device (disabled with 'opendevice' option)"
-#~ msgstr " ใฏใƒ‡ใƒใ‚คใ‚นใงใ™ ('opendevice' ใ‚ชใƒ—ใ‚ทใƒงใƒณใงๅ›ž้ฟใงใใพใ™)"
-
-#~ msgid "Reading from stdin..."
-#~ msgstr "ๆจ™ๆบ–ๅ…ฅๅŠ›ใ‹ใ‚‰่ชญ่พผใฟไธญ..."
-
-#~ msgid "[blowfish]"
-#~ msgstr "[blowfishๆš—ๅทๅŒ–]"
-
-#~ msgid "[crypted]"
-#~ msgstr "[ๆš—ๅทๅŒ–]"
-
-#~ msgid "E821: File is encrypted with unknown method"
-#~ msgstr "E821: ใƒ•ใ‚กใ‚คใƒซใŒๆœช็Ÿฅใฎๆ–นๆณ•ใงๆš—ๅทๅŒ–ใ•ใ‚Œใฆใ„ใพใ™"
-
-# Added at 19-Jan-2004.
-#~ msgid "NetBeans disallows writes of unmodified buffers"
-#~ msgstr "NetBeansใฏๆœชๅค‰ๆ›ดใฎใƒใƒƒใƒ•ใ‚กใ‚’ไธŠๆ›ธใ™ใ‚‹ใ“ใจใฏ่จฑๅฏใ—ใฆใ„ใพใ›ใ‚“"
-
-#~ msgid "Partial writes disallowed for NetBeans buffers"
-#~ msgstr "NetBeansใƒใƒƒใƒ•ใ‚กใฎไธ€้ƒจใ‚’ๆ›ธใๅ‡บใ™ใ“ใจใฏใงใใพใ›ใ‚“"
-
-#~ msgid "writing to device disabled with 'opendevice' option"
-#~ msgstr "'opendevice' ใ‚ชใƒ—ใ‚ทใƒงใƒณใซใ‚ˆใ‚Šใƒ‡ใƒใ‚คใ‚นใธใฎๆ›ธใ่พผใฟใฏใงใใพใ›ใ‚“"
-
-#~ msgid "E460: The resource fork would be lost (add ! to override)"
-#~ msgstr "E460: ใƒชใ‚ฝใƒผใ‚นใƒ•ใ‚ฉใƒผใ‚ฏใŒๅคฑใ‚ใ‚Œใ‚‹ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ (! ใ‚’่ฟฝๅŠ ใงๅผทๅˆถ)"
-
-#~ msgid "E851: Failed to create a new process for the GUI"
-#~ msgstr "E851: GUI็”จใฎใƒ—ใƒญใ‚ปใ‚นใฎ่ตทๅ‹•ใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-
-#~ msgid "E852: The child process failed to start the GUI"
-#~ msgstr "E852: ๅญใƒ—ใƒญใ‚ปใ‚นใŒGUIใฎ่ตทๅ‹•ใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-
-#~ msgid "E229: Cannot start the GUI"
-#~ msgstr "E229: GUIใ‚’้–‹ๅง‹ใงใใพใ›ใ‚“"
-
-#~ msgid "E230: Cannot read from \"%s\""
-#~ msgstr "E230: \"%s\"ใ‹ใ‚‰่ชญ่พผใ‚€ใ“ใจใŒใงใใพใ›ใ‚“"
-
-#~ msgid "E665: Cannot start GUI, no valid font found"
-#~ msgstr "E665: ๆœ‰ๅŠนใชใƒ•ใ‚ฉใƒณใƒˆใŒ่ฆ‹ใคใ‹ใ‚‰ใชใ„ใฎใง, GUIใ‚’้–‹ๅง‹ใงใใพใ›ใ‚“"
-
-#~ msgid "E231: 'guifontwide' invalid"
-#~ msgstr "E231: 'guifontwide' ใŒ็„กๅŠนใงใ™"
-
-#~ msgid "E599: Value of 'imactivatekey' is invalid"
-#~ msgstr "E599: 'imactivatekey' ใซ่จญๅฎšใ•ใ‚ŒใŸๅ€คใŒ็„กๅŠนใงใ™"
-
-#~ msgid "E254: Cannot allocate color %s"
-#~ msgstr "E254: %s ใฎ่‰ฒใ‚’ๅ‰ฒใ‚Šๅฝ“ใฆใ‚‰ใ‚Œใพใ›ใ‚“"
-
-#~ msgid "No match at cursor, finding next"
-#~ msgstr "ใ‚ซใƒผใ‚ฝใƒซใฎไฝ็ฝฎใซใƒžใƒƒใƒใฏใ‚ใ‚Šใพใ›ใ‚“, ๆฌกใ‚’ๆคœ็ดขใ—ใฆใ„ใพใ™"
-
-#~ msgid "<cannot open> "
-#~ msgstr "<้–‹ใ‘ใพใ›ใ‚“> "
-
-#~ msgid "E616: vim_SelFile: can't get font %s"
-#~ msgstr "E616: vim_SelFile: ใƒ•ใ‚ฉใƒณใƒˆ %s ใ‚’ๅ–ๅพ—ใงใใพใ›ใ‚“"
-
-#~ msgid "E614: vim_SelFile: can't return to current directory"
-#~ msgstr "E614: vim_SelFile: ็พๅœจใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใซๆˆปใ‚Œใพใ›ใ‚“"
-
-#~ msgid "Pathname:"
-#~ msgstr "ใƒ‘ใ‚นๅ:"
-
-#~ msgid "E615: vim_SelFile: can't get current directory"
-#~ msgstr "E615: vim_SelFile: ็พๅœจใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใ‚’ๅ–ๅพ—ใงใใพใ›ใ‚“"
-
-#~ msgid "OK"
-#~ msgstr "OK"
-
-#~ msgid "Cancel"
-#~ msgstr "ใ‚ญใƒฃใƒณใ‚ปใƒซ"
-
-#~ msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
-#~ msgstr "ใ‚นใ‚ฏใƒญใƒผใƒซใƒใƒผ: ็”ปๅƒใ‚’ๅ–ๅพ—ใงใใพใ›ใ‚“ใงใ—ใŸ."
-
-#~ msgid "Vim dialog"
-#~ msgstr "Vim ใƒ€ใ‚คใ‚ขใƒญใ‚ฐ"
-
-#~ msgid "E232: Cannot create BalloonEval with both message and callback"
-#~ msgstr "E232: ใƒกใƒƒใ‚ปใƒผใ‚ธใจใ‚ณใƒผใƒซใƒใƒƒใ‚ฏใฎใ‚ใ‚‹ BalloonEval ใ‚’ไฝœๆˆใงใใพใ›ใ‚“"
-
-#~ msgid "Input _Methods"
-#~ msgstr "ใ‚คใƒณใƒ—ใƒƒใƒˆใƒกใ‚ฝใƒƒใƒ‰"
-
-#~ msgid "VIM - Search and Replace..."
-#~ msgstr "VIM - ๆคœ็ดขใจ็ฝฎๆ›..."
-
-#~ msgid "VIM - Search..."
-#~ msgstr "VIM - ๆคœ็ดข..."
-
-#~ msgid "Find what:"
-#~ msgstr "ๆคœ็ดขๆ–‡ๅญ—ๅˆ—:"
-
-#~ msgid "Replace with:"
-#~ msgstr "็ฝฎๆ›ๆ–‡ๅญ—ๅˆ—:"
-
-#~ msgid "Match whole word only"
-#~ msgstr "ๆญฃ็ขบใซ่ฉฒๅฝ“ใ™ใ‚‹ใ‚‚ใฎใ ใ‘"
-
-#~ msgid "Match case"
-#~ msgstr "ๅคงๆ–‡ๅญ—/ๅฐๆ–‡ๅญ—ใ‚’ๅŒบๅˆฅใ™ใ‚‹"
-
-#~ msgid "Direction"
-#~ msgstr "ๆ–นๅ‘"
-
-#~ msgid "Up"
-#~ msgstr "ไธŠ"
-
-#~ msgid "Down"
-#~ msgstr "ไธ‹"
-
-#~ msgid "Find Next"
-#~ msgstr "ๆฌกใ‚’ๆคœ็ดข"
-
-#~ msgid "Replace"
-#~ msgstr "็ฝฎๆ›"
-
-#~ msgid "Replace All"
-#~ msgstr "ๅ…จใฆ็ฝฎๆ›"
-
-#~ msgid "Vim: Received \"die\" request from session manager\n"
-#~ msgstr "Vim: ใ‚ปใƒƒใ‚ทใƒงใƒณใƒžใƒใƒผใ‚ธใƒฃใ‹ใ‚‰ \"die\" ่ฆๆฑ‚ใ‚’ๅ—ใ‘ๅ–ใ‚Šใพใ—ใŸ\n"
-
-#~ msgid "Close"
-#~ msgstr "้–‰ใ˜ใ‚‹"
-
-#~ msgid "New tab"
-#~ msgstr "ๆ–ฐ่ฆใ‚ฟใƒ–ใƒšใƒผใ‚ธ"
-
-#~ msgid "Open Tab..."
-#~ msgstr "ใ‚ฟใƒ–ใƒšใƒผใ‚ธใ‚’้–‹ใ..."
-
-#~ msgid "Vim: Main window unexpectedly destroyed\n"
-#~ msgstr "Vim: ใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใŒไธๆ„ใซ็ ดๅฃŠใ•ใ‚Œใพใ—ใŸ\n"
-
-#~ msgid "&Filter"
-#~ msgstr "ใƒ•ใ‚ฃใƒซใ‚ฟ(&F)"
-
-#~ msgid "&Cancel"
-#~ msgstr "ใ‚ญใƒฃใƒณใ‚ปใƒซ(&C)"
-
-#~ msgid "Directories"
-#~ msgstr "ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒช"
-
-#~ msgid "Filter"
-#~ msgstr "ใƒ•ใ‚ฃใƒซใ‚ฟ"
-
-#~ msgid "&Help"
-#~ msgstr "ใƒ˜ใƒซใƒ—(&H)"
-
-#~ msgid "Files"
-#~ msgstr "ใƒ•ใ‚กใ‚คใƒซ"
-
-#~ msgid "&OK"
-#~ msgstr "&OK"
-
-#~ msgid "Selection"
-#~ msgstr "้ธๆŠž"
-
-#~ msgid "Find &Next"
-#~ msgstr "ๆฌกใ‚’ๆคœ็ดข(&N)"
-
-#~ msgid "&Replace"
-#~ msgstr "็ฝฎๆ›(&R)"
-
-#~ msgid "Replace &All"
-#~ msgstr "ๅ…จใฆ็ฝฎๆ›(&A)"
-
-#~ msgid "&Undo"
-#~ msgstr "ใ‚ขใƒณใƒ‰ใ‚ฅ(&U)"
-
-#~ msgid "E671: Cannot find window title \"%s\""
-#~ msgstr "E671: ใ‚ฟใ‚คใƒˆใƒซใŒ \"%s\" ใฎใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฏ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-
-#~ msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
-#~ msgstr "E243: ๅผ•ๆ•ฐใฏใ‚ตใƒใƒผใƒˆใ•ใ‚Œใพใ›ใ‚“: \"-%s\"; OLE็‰ˆใ‚’ไฝฟ็”จใ—ใฆใใ ใ•ใ„."
-
-#~ msgid "E672: Unable to open window inside MDI application"
-#~ msgstr "E672: MDIใ‚ขใƒ—ใƒชใฎไธญใงใฏใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚’้–‹ใ‘ใพใ›ใ‚“"
-
-#~ msgid "Close tab"
-#~ msgstr "ใ‚ฟใƒ–ใƒšใƒผใ‚ธใ‚’้–‰ใ˜ใ‚‹"
-
-#~ msgid "Open tab..."
-#~ msgstr "ใ‚ฟใƒ–ใƒšใƒผใ‚ธใ‚’้–‹ใ"
-
-#~ msgid "Find string (use '\\\\' to find a '\\')"
-#~ msgstr "ๆคœ็ดขๆ–‡ๅญ—ๅˆ— ('\\' ใ‚’ๆคœ็ดขใ™ใ‚‹ใซใฏ '\\\\')"
-
-#~ msgid "Find & Replace (use '\\\\' to find a '\\')"
-#~ msgstr "ๆคœ็ดขใƒป็ฝฎๆ› ('\\' ใ‚’ๆคœ็ดขใ™ใ‚‹ใซใฏ '\\\\')"
-
-#~ msgid "Not Used"
-#~ msgstr "ไฝฟใ‚ใ‚Œใพใ›ใ‚“"
-
-#~ msgid "Directory\t*.nothing\n"
-#~ msgstr "ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒช\t*.nothing\n"
-
-#~ msgid ""
-#~ "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
-#~ msgstr "Vim E458: ่‰ฒๆŒ‡ๅฎšใŒๆญฃใ—ใใชใ„ใฎใงใ‚จใƒณใƒˆใƒชใ‚’ๅ‰ฒใ‚Šๅฝ“ใฆใ‚‰ใ‚Œใพใ›ใ‚“"
-
-#~ msgid "E250: Fonts for the following charsets are missing in fontset %s:"
-#~ msgstr "E250: ไปฅไธ‹ใฎๆ–‡ๅญ—ใ‚ปใƒƒใƒˆใฎใƒ•ใ‚ฉใƒณใƒˆใŒใ‚ใ‚Šใพใ›ใ‚“ %s:"
-
-#~ msgid "E252: Fontset name: %s"
-#~ msgstr "E252: ใƒ•ใ‚ฉใƒณใƒˆใ‚ปใƒƒใƒˆๅ: %s"
-
-#~ msgid "Font '%s' is not fixed-width"
-#~ msgstr "ใƒ•ใ‚ฉใƒณใƒˆ '%s' ใฏๅ›บๅฎšๅน…ใงใฏใ‚ใ‚Šใพใ›ใ‚“"
-
-#~ msgid "E253: Fontset name: %s"
-#~ msgstr "E253: ใƒ•ใ‚ฉใƒณใƒˆใ‚ปใƒƒใƒˆๅ: %s"
-
-#~ msgid "Font0: %s"
-#~ msgstr "ใƒ•ใ‚ฉใƒณใƒˆ0: %s"
-
-#~ msgid "Font1: %s"
-#~ msgstr "ใƒ•ใ‚ฉใƒณใƒˆ1: %s"
-
-#~ msgid "Font%<PRId64> width is not twice that of font0"
-#~ msgstr "ใƒ•ใ‚ฉใƒณใƒˆ%<PRId64> ใฎๅน…ใŒใƒ•ใ‚ฉใƒณใƒˆ0ใฎ2ๅ€ใงใฏใ‚ใ‚Šใพใ›ใ‚“"
-
-#~ msgid "Font0 width: %<PRId64>"
-#~ msgstr "ใƒ•ใ‚ฉใƒณใƒˆ0ใฎๅน…: %<PRId64>"
-
-#~ msgid "Font1 width: %<PRId64>"
-#~ msgstr "ใƒ•ใ‚ฉใƒณใƒˆ1ใฎๅน…: %<PRId64>"
-
-#~ msgid "Invalid font specification"
-#~ msgstr "็„กๅŠนใชใƒ•ใ‚ฉใƒณใƒˆๆŒ‡ๅฎšใงใ™"
-
-#~ msgid "&Dismiss"
-#~ msgstr "ๅดไธ‹ใ™ใ‚‹(&D)"
-
-#~ msgid "no specific match"
-#~ msgstr "ใƒžใƒƒใƒใ™ใ‚‹ใ‚‚ใฎใŒใ‚ใ‚Šใพใ›ใ‚“"
-
-#~ msgid "Vim - Font Selector"
-#~ msgstr "Vim - ใƒ•ใ‚ฉใƒณใƒˆ้ธๆŠž"
-
-#~ msgid "Name:"
-#~ msgstr "ๅๅ‰:"
-
-#~ msgid "Show size in Points"
-#~ msgstr "ใ‚ตใ‚คใ‚บใ‚’ใƒใ‚คใƒณใƒˆใง่กจ็คบใ™ใ‚‹"
-
-#~ msgid "Encoding:"
-#~ msgstr "ใ‚จใƒณใ‚ณใƒผใƒ‰:"
-
-#~ msgid "Font:"
-#~ msgstr "ใƒ•ใ‚ฉใƒณใƒˆ:"
-
-#~ msgid "Style:"
-#~ msgstr "ใ‚นใ‚ฟใ‚คใƒซ:"
-
-#~ msgid "Size:"
-#~ msgstr "ใ‚ตใ‚คใ‚บ:"
-
-#~ msgid "E256: Hangul automata ERROR"
-#~ msgstr "E256: ใƒใƒณใ‚ฐใƒซใ‚ชใƒผใƒˆใƒžใƒˆใƒณใ‚จใƒฉใƒผ"
-
-#~ msgid "E563: stat error"
-#~ msgstr "E563: stat ใ‚จใƒฉใƒผ"
-
-#~ msgid "E625: cannot open cscope database: %s"
-#~ msgstr "E625: cscopeใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚น: %s ใ‚’้–‹ใใ“ใจใŒใงใใพใ›ใ‚“"
-
-#~ msgid "E626: cannot get cscope database information"
-#~ msgstr "E626: cscopeใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚นใฎๆƒ…ๅ ฑใ‚’ๅ–ๅพ—ใงใใพใ›ใ‚“"
-
-#~ msgid "Lua library cannot be loaded."
-#~ msgstr "Luaใƒฉใ‚คใƒ–ใƒฉใƒชใ‚’ใƒญใƒผใƒ‰ใงใใพใ›ใ‚“."
-
-#~ msgid "cannot save undo information"
-#~ msgstr "ใ‚ขใƒณใƒ‰ใ‚ฅๆƒ…ๅ ฑใŒไฟๅญ˜ใงใใพใ›ใ‚“"
-
-#~ msgid ""
-#~ "E815: Sorry, this command is disabled, the MzScheme libraries could not "
-#~ "be loaded."
-#~ msgstr ""
-#~ "E815: ใ“ใฎใ‚ณใƒžใƒณใƒ‰ใฏ็„กๅŠนใงใ™. MzScheme ใƒฉใ‚คใƒ–ใƒฉใƒชใ‚’ใƒญใƒผใƒ‰ใงใใพใ›ใ‚“."
-
-#~ msgid "invalid expression"
-#~ msgstr "็„กๅŠนใชๅผใงใ™"
-
-#~ msgid "expressions disabled at compile time"
-#~ msgstr "ๅผใฏใ‚ณใƒณใƒ‘ใ‚คใƒซๆ™‚ใซ็„กๅŠนใซใ•ใ‚Œใฆใ„ใพใ™"
-
-#~ msgid "hidden option"
-#~ msgstr "้š ใ—ใ‚ชใƒ—ใ‚ทใƒงใƒณ"
-
-#~ msgid "unknown option"
-#~ msgstr "ๆœช็Ÿฅใฎใ‚ชใƒ—ใ‚ทใƒงใƒณใงใ™"
-
-#~ msgid "window index is out of range"
-#~ msgstr "็ฏ„ๅ›ฒๅค–ใฎใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆ็•ชๅทใงใ™"
-
-#~ msgid "couldn't open buffer"
-#~ msgstr "ใƒใƒƒใƒ•ใ‚กใ‚’้–‹ใ‘ใพใ›ใ‚“"
-
-#~ msgid "cannot delete line"
-#~ msgstr "่กŒใ‚’ๆถˆใ›ใพใ›ใ‚“"
-
-#~ msgid "cannot replace line"
-#~ msgstr "่กŒใ‚’็ฝฎๆ›ใงใใพใ›ใ‚“"
-
-#~ msgid "cannot insert line"
-#~ msgstr "่กŒใ‚’ๆŒฟๅ…ฅใงใใพใ›ใ‚“"
-
-#~ msgid "string cannot contain newlines"
-#~ msgstr "ๆ–‡ๅญ—ๅˆ—ใซใฏๆ”น่กŒๆ–‡ๅญ—ใ‚’ๅซใ‚ใ‚‰ใ‚Œใพใ›ใ‚“"
-
-#~ msgid "error converting Scheme values to Vim"
-#~ msgstr "Schemeๅ€คใฎVimใธใฎๅค‰ๆ›ใ‚จใƒฉใƒผ"
-
-#~ msgid "Vim error: ~a"
-#~ msgstr "Vim ใ‚จใƒฉใƒผ: ~a"
-
-#~ msgid "Vim error"
-#~ msgstr "Vim ใ‚จใƒฉใƒผ"
-
-#~ msgid "buffer is invalid"
-#~ msgstr "ใƒใƒƒใƒ•ใ‚กใฏ็„กๅŠนใงใ™"
-
-#~ msgid "window is invalid"
-#~ msgstr "ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฏ็„กๅŠนใงใ™"
-
-#~ msgid "linenr out of range"
-#~ msgstr "็ฏ„ๅ›ฒๅค–ใฎ่กŒ็•ชๅทใงใ™"
-
-#~ msgid "not allowed in the Vim sandbox"
-#~ msgstr "ใ‚ตใƒณใƒ‰ใƒœใƒƒใ‚ฏใ‚นใงใฏ่จฑใ•ใ‚Œใพใ›ใ‚“"
-
-#~ msgid "E370: Could not load library %s"
-#~ msgstr "E370: ใƒฉใ‚คใƒ–ใƒฉใƒช %s ใ‚’ใƒญใƒผใƒ‰ใงใใพใ›ใ‚“ใงใ—ใŸ"
-
-#~ msgid ""
-#~ "Sorry, this command is disabled: the Perl library could not be loaded."
-#~ msgstr ""
-#~ "ใ“ใฎใ‚ณใƒžใƒณใƒ‰ใฏ็„กๅŠนใงใ™, ใ”ใ‚ใ‚“ใชใ•ใ„: Perlใƒฉใ‚คใƒ–ใƒฉใƒชใ‚’ใƒญใƒผใƒ‰ใงใใพใ›ใ‚“ใงใ—"
-#~ "ใŸ."
-
-#~ msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
-#~ msgstr ""
-#~ "E299: ใ‚ตใƒณใƒ‰ใƒœใƒƒใ‚ฏใ‚นใงใฏ Safe ใƒขใ‚ธใƒฅใƒผใƒซใ‚’ไฝฟ็”จใ—ใชใ„Perlใ‚นใ‚ฏใƒชใƒ—ใƒˆใฏ็ฆใ˜ใ‚‰"
-#~ "ใ‚Œใฆใ„ใพใ™"
-
-#~ msgid "E836: This Vim cannot execute :python after using :py3"
-#~ msgstr "E836: ใ“ใฎVimใงใฏ :py3 ใ‚’ไฝฟใฃใŸๅพŒใซ :python ใ‚’ไฝฟใˆใพใ›ใ‚“"
-
-#~ msgid ""
-#~ "E263: Sorry, this command is disabled, the Python library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E263: ใ“ใฎใ‚ณใƒžใƒณใƒ‰ใฏ็„กๅŠนใงใ™,ใ”ใ‚ใ‚“ใชใ•ใ„: Pythonใƒฉใ‚คใƒ–ใƒฉใƒชใ‚’ใƒญใƒผใƒ‰ใงใใพ"
-#~ "ใ›ใ‚“ใงใ—ใŸ."
-
-# Added at 07-Feb-2004.
-#~ msgid "E659: Cannot invoke Python recursively"
-#~ msgstr "E659: Python ใ‚’ๅ†ๅธฐ็š„ใซๅฎŸ่กŒใ™ใ‚‹ใ“ใจใฏใงใใพใ›ใ‚“"
-
-#~ msgid "E837: This Vim cannot execute :py3 after using :python"
-#~ msgstr "E837: ใ“ใฎVimใงใฏ :python ใ‚’ไฝฟใฃใŸๅพŒใซ :py3 ใ‚’ไฝฟใˆใพใ›ใ‚“"
-
-#~ msgid "E265: $_ must be an instance of String"
-#~ msgstr "E265: $_ ใฏๆ–‡ๅญ—ๅˆ—ใฎใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใงใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“"
-
-#~ msgid ""
-#~ "E266: Sorry, this command is disabled, the Ruby library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E266: ใ“ใฎใ‚ณใƒžใƒณใƒ‰ใฏ็„กๅŠนใงใ™,ใ”ใ‚ใ‚“ใชใ•ใ„: Rubyใƒฉใ‚คใƒ–ใƒฉใƒชใ‚’ใƒญใƒผใƒ‰ใงใใพใ›"
-#~ "ใ‚“ใงใ—ใŸ."
-
-#~ msgid "E267: unexpected return"
-#~ msgstr "E267: ไบˆๆœŸใ›ใฌ return ใงใ™"
-
-#~ msgid "E268: unexpected next"
-#~ msgstr "E268: ไบˆๆœŸใ›ใฌ next ใงใ™"
-
-#~ msgid "E269: unexpected break"
-#~ msgstr "E269: ไบˆๆœŸใ›ใฌ break ใงใ™"
-
-#~ msgid "E270: unexpected redo"
-#~ msgstr "E270: ไบˆๆœŸใ›ใฌ redo ใงใ™"
-
-#~ msgid "E271: retry outside of rescue clause"
-#~ msgstr "E271: rescue ใฎๅค–ใฎ retry ใงใ™"
-
-#~ msgid "E272: unhandled exception"
-#~ msgstr "E272: ๅ–ใ‚Šๆ‰ฑใ‚ใ‚Œใชใ‹ใฃใŸไพ‹ๅค–ใŒใ‚ใ‚Šใพใ™"
-
-#~ msgid "E273: unknown longjmp status %d"
-#~ msgstr "E273: ๆœช็Ÿฅใฎlongjmp็Šถๆ…‹: %d"
-
-#~ msgid "Toggle implementation/definition"
-#~ msgstr "ๅฎŸ่ฃ…ใจๅฎš็พฉใ‚’ๅˆ‡ใ‚Šๆ›ฟใˆใ‚‹"
-
-#~ msgid "Show base class of"
-#~ msgstr "ๆฌกใฎใ‚ฏใƒฉใ‚นใฎๅŸบๅบ•ใ‚’่กจ็คบ"
-
-#~ msgid "Show overridden member function"
-#~ msgstr "ใ‚ชใƒผใƒใƒผใƒฉใ‚คใƒ‰ใ•ใ‚ŒใŸใƒกใƒณใƒ้–ขๆ•ฐใ‚’่กจ็คบ"
-
-#~ msgid "Retrieve from file"
-#~ msgstr "ใƒ•ใ‚กใ‚คใƒซใ‹ใ‚‰ๅ›žๅพฉใ™ใ‚‹"
-
-#~ msgid "Retrieve from project"
-#~ msgstr "ใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใ‹ใ‚‰ๅ›žๅพฉใ™ใ‚‹"
-
-#~ msgid "Retrieve from all projects"
-#~ msgstr "ๅ…จใฆใฎใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใ‹ใ‚‰ๅ›žๅพฉใ™ใ‚‹"
-
-#~ msgid "Retrieve"
-#~ msgstr "ๅ›žๅพฉ"
-
-#~ msgid "Show source of"
-#~ msgstr "ๆฌกใฎใ‚ฝใƒผใ‚นใ‚’่กจ็คบใ™ใ‚‹"
-
-#~ msgid "Find symbol"
-#~ msgstr "่ฆ‹ใคใ‘ใŸใ‚ทใƒณใƒœใƒซ"
-
-#~ msgid "Browse class"
-#~ msgstr "ใ‚ฏใƒฉใ‚นใ‚’ๅ‚็…ง"
-
-#~ msgid "Show class in hierarchy"
-#~ msgstr "้šŽๅฑคใงใ‚ฏใƒฉใ‚นใ‚’่กจ็คบ"
-
-#~ msgid "Show class in restricted hierarchy"
-#~ msgstr "้™ๅฎšใ•ใ‚ŒใŸ้šŽๅฑคใงใ‚ฏใƒฉใ‚นใ‚’่กจ็คบ"
-
-#~ msgid "Xref refers to"
-#~ msgstr "Xref ใฎๅ‚็…งๅ…ˆ"
-
-#~ msgid "Xref referred by"
-#~ msgstr "Xref ใŒๅ‚็…งใ•ใ‚Œใ‚‹"
-
-#~ msgid "Xref has a"
-#~ msgstr "Xref ใŒๆฌกใฎใ‚‚ใฎใ‚’ใ‚‚ใฃใฆใ„ใพใ™"
-
-#~ msgid "Xref used by"
-#~ msgstr "Xref ใŒไฝฟ็”จใ•ใ‚Œใ‚‹"
-
-#~ msgid "Show docu of"
-#~ msgstr "ๆฌกใฎๆ–‡็ซ ใ‚’่กจ็คบ"
-
-#~ msgid "Generate docu for"
-#~ msgstr "ๆฌกใฎๆ–‡็ซ ใ‚’็”Ÿๆˆ"
-
-#~ msgid ""
-#~ "Cannot connect to SNiFF+. Check environment (sniffemacs must be found in "
-#~ "$PATH).\n"
-#~ msgstr ""
-#~ "SNiFF+ใซๆŽฅ็ถšใงใใพใ›ใ‚“. ็’ฐๅขƒใ‚’ใƒใ‚งใƒƒใ‚ฏใ—ใฆใใ ใ•ใ„(sniffemacs ใŒ $PATH ใซ"
-#~ "ใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“).\n"
-
-#~ msgid "E274: Sniff: Error during read. Disconnected"
-#~ msgstr "E274: Sniff: ่ชญ่พผไธญใซใ‚จใƒฉใƒผใŒ็™บ็”Ÿใ—ใพใ—ใŸ. ๅˆ‡ๆ–ญใ—ใพใ—ใŸ"
-
-#~ msgid "SNiFF+ is currently "
-#~ msgstr "็พๅœจSNiFF+ ใฎ็Šถๆ…‹ใฏใ€Œ"
-
-#~ msgid "not "
-#~ msgstr "ๆœช"
-
-#~ msgid "connected"
-#~ msgstr "ๆŽฅ็ถšใ€ใงใ™"
-
-#~ msgid "E275: Unknown SNiFF+ request: %s"
-#~ msgstr "E275: ๆœช็Ÿฅใฎ SNiFF+ ใƒชใ‚ฏใ‚จใ‚นใƒˆใงใ™: %s"
-
-#~ msgid "E276: Error connecting to SNiFF+"
-#~ msgstr "E276: SNiFF+ ใธใฎๆŽฅ็ถšไธญใฎใ‚จใƒฉใƒผใงใ™"
-
-#~ msgid "E278: SNiFF+ not connected"
-#~ msgstr "E278: SNiFF+ ใซๆŽฅ็ถšใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-
-#~ msgid "E279: Not a SNiFF+ buffer"
-#~ msgstr "E279: SNiFF+ ใƒใƒƒใƒ•ใ‚กใŒใ‚ใ‚Šใพใ›ใ‚“"
-
-#~ msgid "Sniff: Error during write. Disconnected"
-#~ msgstr "Sniff: ๆ›ธ่พผใฟไธญใซใ‚จใƒฉใƒผใŒ็™บ็”Ÿใ—ใŸใฎใงๅˆ‡ๆ–ญใ—ใพใ—ใŸ"
-
-#~ msgid "invalid buffer number"
-#~ msgstr "็„กๅŠนใชใƒใƒƒใƒ•ใ‚ก็•ชๅทใงใ™"
-
-#~ msgid "not implemented yet"
-#~ msgstr "ใพใ ๅฎŸ่ฃ…ใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-
-#~ msgid "cannot set line(s)"
-#~ msgstr "่กŒใ‚’่จญๅฎšใงใใพใ›ใ‚“"
-
-#~ msgid "invalid mark name"
-#~ msgstr "็„กๅŠนใชใƒžใƒผใ‚ฏๅใงใ™"
-
-#~ msgid "mark not set"
-#~ msgstr "ใƒžใƒผใ‚ฏใฏ่จญๅฎšใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-
-#~ msgid "row %d column %d"
-#~ msgstr "่กŒ %d ๅˆ— %d"
-
-#~ msgid "cannot insert/append line"
-#~ msgstr "่กŒใฎๆŒฟๅ…ฅ/่ฟฝๅŠ ใ‚’ใงใใพใ›ใ‚“"
-
-#~ msgid "line number out of range"
-#~ msgstr "็ฏ„ๅ›ฒๅค–ใฎ่กŒ็•ชๅทใงใ™"
-
-#~ msgid "unknown flag: "
-#~ msgstr "ๆœช็Ÿฅใฎใƒ•ใƒฉใ‚ฐ: "
-
-#~ msgid "unknown vimOption"
-#~ msgstr "ๆœช็Ÿฅใฎ vimOption ใงใ™"
-
-#~ msgid "keyboard interrupt"
-#~ msgstr "ใ‚ญใƒผใƒœใƒผใƒ‰ๅ‰ฒ่พผใฟ"
-
-#~ msgid "vim error"
-#~ msgstr "vim ใ‚จใƒฉใƒผ"
-
-#~ msgid "cannot create buffer/window command: object is being deleted"
-#~ msgstr ""
-#~ "ใƒใƒƒใƒ•ใ‚ก/ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆไฝœๆˆใ‚ณใƒžใƒณใƒ‰ใ‚’ไฝœๆˆใงใใพใ›ใ‚“: ใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใŒๆถˆๅŽปใ•ใ‚Œใฆ"
-#~ "ใ„ใพใ—ใŸ"
-
-#~ msgid ""
-#~ "cannot register callback command: buffer/window is already being deleted"
-#~ msgstr ""
-#~ "ใ‚ณใƒผใƒซใƒใƒƒใ‚ฏใ‚ณใƒžใƒณใƒ‰ใ‚’็™ป้Œฒใงใใพใ›ใ‚“: ใƒใƒƒใƒ•ใ‚ก/ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใŒๆ—ขใซๆถˆๅŽปใ•ใ‚Œใพ"
-#~ "ใ—ใŸ"
-
-#~ msgid ""
-#~ "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-"
-#~ "dev@vim.org"
-#~ msgstr ""
-#~ "E280: TCL ่‡ดๅ‘ฝ็š„ใ‚จใƒฉใƒผ: reflist ๆฑšๆŸ“!? vim-dev@vim.org ใซๅ ฑๅ‘Šใ—ใฆใใ ใ•ใ„"
-
-#~ msgid "cannot register callback command: buffer/window reference not found"
-#~ msgstr ""
-#~ "ใ‚ณใƒผใƒซใƒใƒƒใ‚ฏใ‚ณใƒžใƒณใƒ‰ใ‚’็™ป้Œฒใงใใพใ›ใ‚“: ใƒใƒƒใƒ•ใ‚ก/ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฎๅ‚็…งใŒ่ฆ‹ใคใ‹ใ‚Š"
-#~ "ใพใ›ใ‚“"
-
-#~ msgid ""
-#~ "E571: Sorry, this command is disabled: the Tcl library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E571: ใ“ใฎใ‚ณใƒžใƒณใƒ‰ใฏ็„กๅŠนใงใ™,ใ”ใ‚ใ‚“ใชใ•ใ„: Tclใƒฉใ‚คใƒ–ใƒฉใƒชใ‚’ใƒญใƒผใƒ‰ใงใใพใ›ใ‚“"
-#~ "ใงใ—ใŸ."
-
-#~ msgid "E572: exit code %d"
-#~ msgstr "E572: ็ต‚ไบ†ใ‚ณใƒผใƒ‰ %d"
-
-#~ msgid "cannot get line"
-#~ msgstr "่กŒใ‚’ๅ–ๅพ—ใงใใพใ›ใ‚“"
-
-#~ msgid "Unable to register a command server name"
-#~ msgstr "ๅ‘ฝไปคใ‚ตใƒผใƒใฎๅๅ‰ใ‚’็™ป้Œฒใงใใพใ›ใ‚“"
-
-#~ msgid "E248: Failed to send command to the destination program"
-#~ msgstr "E248: ็›ฎ็š„ใฎใƒ—ใƒญใ‚ฐใƒฉใƒ ใธใฎใ‚ณใƒžใƒณใƒ‰้€ไฟกใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-
-#~ msgid "E573: Invalid server id used: %s"
-#~ msgstr "E573: ็„กๅŠนใชใ‚ตใƒผใƒIDใŒไฝฟใ‚ใ‚Œใพใ—ใŸ: %s"
-
-#~ msgid "E251: VIM instance registry property is badly formed. Deleted!"
-#~ msgstr "E251: VIM ๅฎŸไฝ“ใฎ็™ป้Œฒใƒ—ใƒญใƒ‘ใƒ†ใ‚ฃใŒไธๆญฃใงใ™. ๆถˆๅŽปใ—ใพใ—ใŸ!"
-
-#~ msgid "netbeans is not supported with this GUI\n"
-#~ msgstr "netbeans ใฏใ“ใฎGUIใงใฏๅˆฉ็”จใงใใพใ›ใ‚“\n"
-
-#~ msgid "This Vim was not compiled with the diff feature."
-#~ msgstr "ใ“ใฎVimใซใฏdiffๆฉŸ่ƒฝใŒใ‚ใ‚Šใพใ›ใ‚“(ใ‚ณใƒณใƒ‘ใ‚คใƒซๆ™‚่จญๅฎš)."
-
-#~ msgid "'-nb' cannot be used: not enabled at compile time\n"
-#~ msgstr "'-nb' ไฝฟ็”จไธๅฏ่ƒฝใงใ™: ใ‚ณใƒณใƒ‘ใ‚คใƒซๆ™‚ใซ็„กๅŠนใซใ•ใ‚Œใฆใ„ใพใ™\n"
-
-#~ msgid "Vim: Error: Failure to start gvim from NetBeans\n"
-#~ msgstr "Vim: ใ‚จใƒฉใƒผ: NetBeansใ‹ใ‚‰gvimใ‚’ใ‚นใ‚ฟใƒผใƒˆใงใใพใ›ใ‚“\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Where case is ignored prepend / to make flag upper case"
-#~ msgstr ""
-#~ "\n"
-#~ "ๅคงๅฐๆ–‡ๅญ—ใŒ็„ก่ฆ–ใ•ใ‚Œใ‚‹ๅ ดๅˆใฏๅคงๆ–‡ๅญ—ใซใ™ใ‚‹ใŸใ‚ใซ / ใ‚’ๅ‰็ฝฎใ—ใฆใใ ใ•ใ„"
-
-#~ msgid "-register\t\tRegister this gvim for OLE"
-#~ msgstr "-register\t\tใ“ใฎgvimใ‚’OLEใจใ—ใฆ็™ป้Œฒใ™ใ‚‹"
-
-#~ msgid "-unregister\t\tUnregister gvim for OLE"
-#~ msgstr "-unregister\t\tgvimใฎOLE็™ป้Œฒใ‚’่งฃ้™คใ™ใ‚‹"
-
-#~ msgid "-g\t\t\tRun using GUI (like \"gvim\")"
-#~ msgstr "-g\t\t\tGUIใง่ตทๅ‹•ใ™ใ‚‹ (\"gvim\" ใจๅŒใ˜)"
-
-#~ msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
-#~ msgstr "-f or --nofork\tใƒ•ใ‚ฉใ‚ขใ‚ฐใƒฉใ‚ฆใƒณใƒ‰: GUIใ‚’ๅง‹ใ‚ใ‚‹ใจใใซforkใ—ใชใ„"
-
-#~ msgid "-f\t\t\tDon't use newcli to open window"
-#~ msgstr "-f\t\t\tใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚’้–‹ใใฎใซ newcli ใ‚’ไฝฟ็”จใ—ใชใ„"
-
-#~ msgid "-dev <device>\t\tUse <device> for I/O"
-#~ msgstr "-dev <device>\t\tI/Oใซ <device> ใ‚’ไฝฟ็”จใ™ใ‚‹"
-
-#~ msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
-#~ msgstr "-U <gvimrc>\t\t.gvimrcใฎไปฃใ‚ใ‚Šใซ <gvimrc> ใ‚’ไฝฟใ†"
-
-#~ msgid "-x\t\t\tEdit encrypted files"
-#~ msgstr "-x\t\t\tๆš—ๅทๅŒ–ใ•ใ‚ŒใŸใƒ•ใ‚กใ‚คใƒซใ‚’็ทจ้›†ใ™ใ‚‹"
-
-#~ msgid "-display <display>\tConnect vim to this particular X-server"
-#~ msgstr "-display <display>\tvimใ‚’ๆŒ‡ๅฎšใ—ใŸ X ใ‚ตใƒผใƒใซๆŽฅ็ถšใ™ใ‚‹"
-
-#~ msgid "-X\t\t\tDo not connect to X server"
-#~ msgstr "-X\t\t\tXใ‚ตใƒผใƒใซๆŽฅ็ถšใ—ใชใ„"
-
-#~ msgid "--remote <files>\tEdit <files> in a Vim server if possible"
-#~ msgstr "--remote <files>\tๅฏ่ƒฝใชใ‚‰ใฐVimใ‚ตใƒผใƒใง <files> ใ‚’็ทจ้›†ใ™ใ‚‹"
-
-#~ msgid "--remote-silent <files> Same, don't complain if there is no server"
-#~ msgstr "--remote-silent <files> ๅŒไธŠ, ใ‚ตใƒผใƒใŒ็„กใใฆใ‚‚่ญฆๅ‘Šๆ–‡ใ‚’ๅ‡บๅŠ›ใ—ใชใ„"
-
-#~ msgid ""
-#~ "--remote-wait <files> As --remote but wait for files to have been edited"
-#~ msgstr "--remote-wait <files>\t--remoteๅพŒ ใƒ•ใ‚กใ‚คใƒซใฎ็ทจ้›†ใŒ็ต‚ใ‚ใ‚‹ใฎใ‚’ๅพ…ใค"
-
-#~ msgid ""
-#~ "--remote-wait-silent <files> Same, don't complain if there is no server"
-#~ msgstr ""
-#~ "--remote-wait-silent <files> ๅŒไธŠ, ใ‚ตใƒผใƒใŒ็„กใใฆใ‚‚่ญฆๅ‘Šๆ–‡ใ‚’ๅ‡บๅŠ›ใ—ใชใ„"
-
-#~ msgid ""
-#~ "--remote-tab[-wait][-silent] <files> As --remote but use tab page per "
-#~ "file"
-#~ msgstr ""
-#~ "--remote-tab[-wait][-silent] <files> --remoteใงใƒ•ใ‚กใ‚คใƒซ1ใคใซใคใ1ใคใฎใ‚ฟใƒ–"
-#~ "ใƒšใƒผใ‚ธใ‚’้–‹ใ"
-
-#~ msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
-#~ msgstr "--remote-send <keys>\tVimใ‚ตใƒผใƒใซ <keys> ใ‚’้€ไฟกใ—ใฆ็ต‚ไบ†ใ™ใ‚‹"
-
-#~ msgid ""
-#~ "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
-#~ msgstr "--remote-expr <expr>\tใ‚ตใƒผใƒใง <expr> ใ‚’ๅฎŸ่กŒใ—ใฆ็ตๆžœใ‚’่กจ็คบใ™ใ‚‹"
-
-#~ msgid "--serverlist\t\tList available Vim server names and exit"
-#~ msgstr "--serverlist\t\tVimใ‚ตใƒผใƒๅใฎไธ€่ฆงใ‚’่กจ็คบใ—ใฆ็ต‚ไบ†ใ™ใ‚‹"
-
-#~ msgid "--servername <name>\tSend to/become the Vim server <name>"
-#~ msgstr "--servername <name>\tVimใ‚ตใƒผใƒ <name> ใซ้€ไฟก/ๅๅ‰่จญๅฎšใ™ใ‚‹"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Motif version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvimใซใ‚ˆใฃใฆ่งฃ้‡ˆใ•ใ‚Œใ‚‹ๅผ•ๆ•ฐ(Motifใƒใƒผใ‚ธใƒงใƒณ):\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (neXtaw version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvimใซใ‚ˆใฃใฆ่งฃ้‡ˆใ•ใ‚Œใ‚‹ๅผ•ๆ•ฐ(neXtawใƒใƒผใ‚ธใƒงใƒณ):\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Athena version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvimใซใ‚ˆใฃใฆ่งฃ้‡ˆใ•ใ‚Œใ‚‹ๅผ•ๆ•ฐ(Athenaใƒใƒผใ‚ธใƒงใƒณ):\n"
-
-#~ msgid "-display <display>\tRun vim on <display>"
-#~ msgstr "-display <display>\t<display> ใงvimใ‚’ๅฎŸ่กŒใ™ใ‚‹"
-
-#~ msgid "-iconic\t\tStart vim iconified"
-#~ msgstr "-iconic\t\tๆœ€ๅฐๅŒ–ใ—ใŸ็Šถๆ…‹ใงvimใ‚’่ตทๅ‹•ใ™ใ‚‹"
-
-#~ msgid "-background <color>\tUse <color> for the background (also: -bg)"
-#~ msgstr "-background <color>\t่ƒŒๆ™ฏ่‰ฒใซ <color> ใ‚’ไฝฟใ†(ๅŒ็พฉ: -bg)"
-
-#~ msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
-#~ msgstr "-foreground <color>\tๅ‰ๆ™ฏ่‰ฒใซ <color> ใ‚’ไฝฟใ†(ๅŒ็พฉ: -fg)"
-
-#~ msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
-#~ msgstr "-font <font>\t\tใƒ†ใ‚ญใ‚นใƒˆ่กจ็คบใซ <font> ใ‚’ไฝฟใ†(ๅŒ็พฉ: -fn)"
-
-#~ msgid "-boldfont <font>\tUse <font> for bold text"
-#~ msgstr "-boldfont <font>\tๅคชๅญ—ใซ <font> ใ‚’ไฝฟใ†"
-
-#~ msgid "-italicfont <font>\tUse <font> for italic text"
-#~ msgstr "-italicfont <for>\tๆ–œไฝ“ๅญ—ใซ <font> ใ‚’ไฝฟใ†"
-
-#~ msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
-#~ msgstr "-geometry <geom>\tๅˆๆœŸ้…็ฝฎใซ <geom> ใ‚’ไฝฟใ†(ๅŒ็พฉ: -geom)"
-
-#~ msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
-#~ msgstr "-borderwidth <width>\tๅขƒ็•Œใฎๅน…ใ‚’ <width> ใซใ™ใ‚‹(ๅŒ็พฉ: -bw)"
-
-#~ msgid ""
-#~ "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
-#~ msgstr ""
-#~ "-scrollbarwidth <width> ใ‚นใ‚ฏใƒญใƒผใƒซใƒใƒผใฎๅน…ใ‚’ <width> ใซใ™ใ‚‹(ๅŒ็พฉ: -sw)"
-
-#~ msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
-#~ msgstr ""
-#~ "-menuheight <height>\tใƒกใƒ‹ใƒฅใƒผใƒใƒผใฎ้ซ˜ใ•ใ‚’ <height> ใซใ™ใ‚‹(ๅŒ็พฉ: -mh)"
-
-#~ msgid "-reverse\t\tUse reverse video (also: -rv)"
-#~ msgstr "-reverse\t\tๅ่ปขๆ˜ ๅƒใ‚’ไฝฟ็”จใ™ใ‚‹(ๅŒ็พฉ: -rv)"
-
-#~ msgid "+reverse\t\tDon't use reverse video (also: +rv)"
-#~ msgstr "+reverse\t\tๅ่ปขๆ˜ ๅƒใ‚’ไฝฟ็”จใ—ใชใ„(ๅŒ็พฉ: +rv)"
-
-#~ msgid "-xrm <resource>\tSet the specified resource"
-#~ msgstr "-xrm <resource>\t็‰นๅฎšใฎใƒชใ‚ฝใƒผใ‚นใ‚’ไฝฟ็”จใ™ใ‚‹"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (GTK+ version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvimใซใ‚ˆใฃใฆ่งฃ้‡ˆใ•ใ‚Œใ‚‹ๅผ•ๆ•ฐ(GTK+ใƒใƒผใ‚ธใƒงใƒณ):\n"
-
-#~ msgid "-display <display>\tRun vim on <display> (also: --display)"
-#~ msgstr "-display <display>\t<display> ใงvimใ‚’ๅฎŸ่กŒใ™ใ‚‹(ๅŒ็พฉ: --display)"
-
-#~ msgid "--role <role>\tSet a unique role to identify the main window"
-#~ msgstr "--role <role>\tใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚’่ญ˜ๅˆฅใ™ใ‚‹ไธ€ๆ„ใชๅฝนๅ‰ฒ(role)ใ‚’่จญๅฎšใ™ใ‚‹"
-
-#~ msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
-#~ msgstr "--socketid <xid>\t็•ฐใชใ‚‹GTK widgetใงVimใ‚’้–‹ใ"
-
-#~ msgid "--echo-wid\t\tMake gvim echo the Window ID on stdout"
-#~ msgstr "--echo-wid\t\tใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆIDใ‚’ๆจ™ๆบ–ๅ‡บๅŠ›ใซๅ‡บๅŠ›ใ™ใ‚‹"
-
-#~ msgid "-P <parent title>\tOpen Vim inside parent application"
-#~ msgstr "-P <่ฆชใฎใ‚ฟใ‚คใƒˆใƒซ>\tVimใ‚’่ฆชใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใฎไธญใง่ตทๅ‹•ใ™ใ‚‹"
-
-#~ msgid "--windowid <HWND>\tOpen Vim inside another win32 widget"
-#~ msgstr "--windowid <HWND>\t็•ฐใชใ‚‹Win32 widgetใฎๅ†…้ƒจใซVimใ‚’้–‹ใ"
-
-#~ msgid "No display"
-#~ msgstr "ใƒ‡ใ‚ฃใ‚นใƒ—ใƒฌใ‚คใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-
-#~ msgid ": Send failed.\n"
-#~ msgstr ": ้€ไฟกใซๅคฑๆ•—ใ—ใพใ—ใŸ.\n"
-
-#~ msgid ": Send failed. Trying to execute locally\n"
-#~ msgstr ": ้€ไฟกใซๅคฑๆ•—ใ—ใพใ—ใŸ. ใƒญใƒผใ‚ซใƒซใงใฎๅฎŸ่กŒใ‚’่ฉฆใฟใฆใ„ใพใ™\n"
-
-#~ msgid "%d of %d edited"
-#~ msgstr "%d ๅ€‹ (%d ๅ€‹ไธญ) ใฎใƒ•ใ‚กใ‚คใƒซใ‚’็ทจ้›†ใ—ใพใ—ใŸ"
-
-#~ msgid "No display: Send expression failed.\n"
-#~ msgstr "ใƒ‡ใ‚ฃใ‚นใƒ—ใƒฌใ‚คใŒใ‚ใ‚Šใพใ›ใ‚“: ๅผใฎ้€ไฟกใซๅคฑๆ•—ใ—ใพใ—ใŸ.\n"
-
-#~ msgid ": Send expression failed.\n"
-#~ msgstr ": ๅผใฎ้€ไฟกใซๅคฑๆ•—ใ—ใพใ—ใŸ.\n"
-
-#~ msgid "E543: Not a valid codepage"
-#~ msgstr "E543: ็„กๅŠนใชใ‚ณใƒผใƒ‰ใƒšใƒผใ‚ธใงใ™"
-
-#~ msgid "E284: Cannot set IC values"
-#~ msgstr "E284: ICใฎๅ€คใ‚’่จญๅฎšใงใใพใ›ใ‚“"
+#, c-format
+msgid "E447: Can't find file \"%s\" in path"
+msgstr "E447: pathใซใฏ \"%s\" ใจใ„ใ†ใƒ•ใ‚กใ‚คใƒซใŒใ‚ใ‚Šใพใ›ใ‚“"
-#~ msgid "E285: Failed to create input context"
-#~ msgstr "E285: ใ‚คใƒณใƒ—ใƒƒใƒˆใ‚ณใƒณใƒ†ใ‚ญใ‚นใƒˆใฎไฝœๆˆใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+#, c-format
+msgid "E799: Invalid ID: %ld (must be greater than or equal to 1)"
+msgstr "E799: ็„กๅŠนใช ID: %ld (1 ไปฅไธŠใงใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“)"
-#~ msgid "E286: Failed to open input method"
-#~ msgstr "E286: ใ‚คใƒณใƒ—ใƒƒใƒˆใƒกใ‚ฝใƒƒใƒ‰ใฎใ‚ชใƒผใƒ—ใƒณใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+#, c-format
+msgid "E801: ID already taken: %ld"
+msgstr "E801: ID ใฏใ™ใงใซๅˆฉ็”จไธญใงใ™: %ld"
-#~ msgid "E287: Warning: Could not set destroy callback to IM"
-#~ msgstr "E287: ่ญฆๅ‘Š: IMใฎ็ ดๅฃŠใ‚ณใƒผใƒซใƒใƒƒใ‚ฏใ‚’่จญๅฎšใงใใพใ›ใ‚“ใงใ—ใŸ"
+msgid "List or number required"
+msgstr "ใƒชใ‚นใƒˆใ‹ๆ•ฐๅ€คใŒๅฟ…่ฆใงใ™"
-#~ msgid "E288: input method doesn't support any style"
-#~ msgstr "E288: ใ‚คใƒณใƒ—ใƒƒใƒˆใƒกใ‚ฝใƒƒใƒ‰ใฏใฉใ‚“ใชใ‚นใ‚ฟใ‚คใƒซใ‚‚ใ‚ตใƒใƒผใƒˆใ—ใพใ›ใ‚“"
+#, c-format
+msgid "E802: Invalid ID: %ld (must be greater than or equal to 1)"
+msgstr "E802: ็„กๅŠนใช ID: %ld (1 ไปฅไธŠใงใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“)"
-#~ msgid "E289: input method doesn't support my preedit type"
-#~ msgstr "E289: ใ‚คใƒณใƒ—ใƒƒใƒˆใƒกใ‚ฝใƒƒใƒ‰ใฏ my preedit type ใ‚’ใ‚ตใƒใƒผใƒˆใ—ใพใ›ใ‚“"
+#, c-format
+msgid "E803: ID not found: %ld"
+msgstr "E803: ID ใฏใ‚ใ‚Šใพใ›ใ‚“: %ld"
-#~ msgid "E843: Error while updating swap file crypt"
-#~ msgstr "E843: ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใฎๆš—ๅทใ‚’ๆ›ดๆ–ฐไธญใซใ‚จใƒฉใƒผใŒ็™บ็”Ÿใ—ใพใ—ใŸ"
+msgid "Edit with &multiple Vims"
+msgstr "่ค‡ๆ•ฐใฎVimใง็ทจ้›†ใ™ใ‚‹ (&M)"
-#~ msgid ""
-#~ "E833: %s is encrypted and this version of Vim does not support encryption"
-#~ msgstr ""
-#~ "E833: %s ใฏใ“ใฎใƒใƒผใ‚ธใƒงใƒณใฎVimใงใ‚ตใƒใƒผใƒˆใ—ใฆใ„ใชใ„ๅฝขๅผใงๆš—ๅทๅŒ–ใ•ใ‚Œใฆใ„ใพใ™"
+msgid "Edit with single &Vim"
+msgstr "1ใคใฎVimใง็ทจ้›†ใ™ใ‚‹ (&V)"
-#~ msgid "Swap file is encrypted: \"%s\""
-#~ msgstr "ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใฏๆš—ๅทๅŒ–ใ•ใ‚Œใฆใ„ใพใ™: \"%s\""
+msgid "Diff with Vim"
+msgstr "Vimใงๅทฎๅˆ†ใ‚’่กจ็คบใ™ใ‚‹"
-#~ msgid ""
-#~ "\n"
-#~ "If you entered a new crypt key but did not write the text file,"
-#~ msgstr ""
-#~ "\n"
-#~ "ๆ–ฐใ—ใ„ๆš—ๅทใ‚ญใƒผใ‚’ๅ…ฅๅŠ›ใ—ใŸใ‚ใจใซใƒ†ใ‚ญใ‚นใƒˆใƒ•ใ‚กใ‚คใƒซใ‚’ไฟๅญ˜ใ—ใฆใ„ใชใ„ๅ ดๅˆใฏ,"
+msgid "Edit with &Vim"
+msgstr "Vimใง็ทจ้›†ใ™ใ‚‹ (&V)"
-#~ msgid ""
-#~ "\n"
-#~ "enter the new crypt key."
-#~ msgstr ""
-#~ "\n"
-#~ "ๆ–ฐใ—ใ„ๆš—ๅทใ‚ญใƒผใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„."
+msgid "Edit with existing Vim - "
+msgstr "่ตทๅ‹•ๆธˆใฎVimใง็ทจ้›†ใ™ใ‚‹ - "
-#~ msgid ""
-#~ "\n"
-#~ "If you wrote the text file after changing the crypt key press enter"
-#~ msgstr ""
-#~ "\n"
-#~ "ๆš—ๅทใ‚ญใƒผใ‚’ๅค‰ใˆใŸใ‚ใจใซใƒ†ใ‚ญใ‚นใƒˆใƒ•ใ‚กใ‚คใƒซใ‚’ไฟๅญ˜ใ—ใŸๅ ดๅˆใฏ, ใƒ†ใ‚ญใ‚นใƒˆใƒ•ใ‚กใ‚คใƒซใจ"
+msgid "Edits the selected file(s) with Vim"
+msgstr "้ธๆŠžใ—ใŸใƒ•ใ‚กใ‚คใƒซใ‚’Vimใง็ทจ้›†ใ™ใ‚‹"
-#~ msgid ""
-#~ "\n"
-#~ "to use the same key for text file and swap file"
-#~ msgstr ""
-#~ "\n"
-#~ "ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใซๅŒใ˜ๆš—ๅทใ‚ญใƒผใ‚’ไฝฟใ†ใŸใ‚ใซenterใ ใ‘ใ‚’ๆŠผใ—ใฆใใ ใ•ใ„."
+msgid "Error creating process: Check if gvim is in your path!"
+msgstr "ใƒ—ใƒญใ‚ปใ‚นใฎไฝœๆˆใซๅคฑๆ•—: gvimใŒ็’ฐๅขƒๅค‰ๆ•ฐPATHไธŠใซใ‚ใ‚‹ใ‹็ขบ่ชใ—ใฆใใ ใ•ใ„!"
-#~ msgid "Using crypt key from swap file for the text file.\n"
-#~ msgstr "ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใ‹ใ‚‰ๅ–ๅพ—ใ—ใŸๆš—ๅทใ‚ญใƒผใ‚’ใƒ†ใ‚ญใ‚นใƒˆใƒ•ใ‚กใ‚คใƒซใซไฝฟใ„ใพใ™.\n"
+msgid "gvimext.dll error"
+msgstr "gvimext.dll ใ‚จใƒฉใƒผ"
-#~ msgid ""
-#~ "\n"
-#~ " [not usable with this version of Vim]"
-#~ msgstr ""
-#~ "\n"
-#~ " [ใ“ใฎVimใƒใƒผใ‚ธใƒงใƒณใงใฏไฝฟ็”จใงใใพใ›ใ‚“]"
+msgid "Path length too long!"
+msgstr "ใƒ‘ใ‚นใŒ้•ท้ŽใŽใพใ™!"
-#~ msgid "Tear off this menu"
-#~ msgstr "ใ“ใฎใƒกใƒ‹ใƒฅใƒผใ‚’ๅˆ‡ใ‚Šๅ–ใ‚‹"
+msgid "--No lines in buffer--"
+msgstr "--ใƒใƒƒใƒ•ใ‚กใซ่กŒใŒใ‚ใ‚Šใพใ›ใ‚“--"
-#~ msgid "Select Directory dialog"
-#~ msgstr "ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒช้ธๆŠžใƒ€ใ‚คใ‚ขใƒญใ‚ฐ"
+msgid "E470: Command aborted"
+msgstr "E470: ใ‚ณใƒžใƒณใƒ‰ใŒไธญๆ–ญใ•ใ‚Œใพใ—ใŸ"
-#~ msgid "Save File dialog"
-#~ msgstr "ใƒ•ใ‚กใ‚คใƒซไฟๅญ˜ใƒ€ใ‚คใ‚ขใƒญใ‚ฐ"
+msgid "E471: Argument required"
+msgstr "E471: ๅผ•ๆ•ฐใŒๅฟ…่ฆใงใ™"
-#~ msgid "Open File dialog"
-#~ msgstr "ใƒ•ใ‚กใ‚คใƒซ่ชญ่พผใƒ€ใ‚คใ‚ขใƒญใ‚ฐ"
+msgid "E10: \\ should be followed by /, ? or &"
+msgstr "E10: \\ ใฎๅพŒใฏ / ใ‹ ? ใ‹ & ใงใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“"
-#~ msgid "E338: Sorry, no file browser in console mode"
-#~ msgstr ""
-#~ "E338: ใ‚ณใƒณใ‚ฝใƒผใƒซใƒขใƒผใƒ‰ใงใฏใƒ•ใ‚กใ‚คใƒซใƒ–ใƒฉใ‚ฆใ‚ถใ‚’ไฝฟใˆใพใ›ใ‚“, ใ”ใ‚ใ‚“ใชใ•ใ„"
+msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
+msgstr "E11: ใ‚ณใƒžใƒณใƒ‰ใƒฉใ‚คใƒณใงใฏ็„กๅŠนใงใ™; <CR>ใงๅฎŸ่กŒ, CTRL-Cใงใ‚„ใ‚ใ‚‹"
-#~ msgid "Vim: preserving files...\n"
-#~ msgstr "Vim: ใƒ•ใ‚กใ‚คใƒซใ‚’ไฟๅญ˜ไธญ...\n"
+msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
+msgstr ""
+"E12: ็พๅœจใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใ‚„ใ‚ฟใ‚ฐๆคœ็ดขใงใฏexrc/vimrcใฎใ‚ณใƒžใƒณใƒ‰ใฏ่จฑๅฏใ•ใ‚Œใพใ›ใ‚“"
-#~ msgid "Vim: Finished.\n"
-#~ msgstr "Vim: ็ต‚ไบ†ใ—ใพใ—ใŸ.\n"
+msgid "E171: Missing :endif"
+msgstr "E171: :endif ใŒใ‚ใ‚Šใพใ›ใ‚“"
-#~ msgid "ERROR: "
-#~ msgstr "ใ‚จใƒฉใƒผ: "
+msgid "E600: Missing :endtry"
+msgstr "E600: :endtry ใŒใ‚ใ‚Šใพใ›ใ‚“"
-#~ msgid ""
-#~ "\n"
-#~ "[bytes] total alloc-freed %<PRIu64>-%<PRIu64>, in use %<PRIu64>, peak use "
-#~ "%<PRIu64>\n"
-#~ msgstr ""
-#~ "\n"
-#~ "[ใƒกใƒขใƒช(ใƒใ‚คใƒˆ)] ็ทๅ‰ฒๅฝ“-่งฃๆ”พ้‡ %<PRIu64>-%<PRIu64>, ไฝฟ็”จ้‡ %<PRIu64>, ใƒ”ใƒผ"
-#~ "ใ‚ฏๆ™‚ %<PRIu64>\n"
+msgid "E170: Missing :endwhile"
+msgstr "E170: :endwhile ใŒใ‚ใ‚Šใพใ›ใ‚“"
-#~ msgid ""
-#~ "[calls] total re/malloc()'s %<PRIu64>, total free()'s %<PRIu64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "[ๅ‘ผๅ‡บ] ็ท re/malloc() ๅ›žๆ•ฐ %<PRIu64>, ็ท free() ๅ›žๆ•ฐ %<PRIu64>\n"
-#~ "\n"
+msgid "E170: Missing :endfor"
+msgstr "E170: :endfor ใŒใ‚ใ‚Šใพใ›ใ‚“"
-#~ msgid "E340: Line is becoming too long"
-#~ msgstr "E340: ่กŒใŒ้•ทใใชใ‚Š้ŽใŽใพใ—ใŸ"
+msgid "E588: :endwhile without :while"
+msgstr "E588: :while ใฎใชใ„ :endwhile ใŒใ‚ใ‚Šใพใ™"
-#~ msgid "E341: Internal error: lalloc(%<PRId64>, )"
-#~ msgstr "E341: ๅ†…้ƒจใ‚จใƒฉใƒผ: lalloc(%<PRId64>,)"
+msgid "E588: :endfor without :for"
+msgstr "E588: :endfor ใฎใชใ„ :for ใŒใ‚ใ‚Šใพใ™"
-#~ msgid "E547: Illegal mouseshape"
-#~ msgstr "E547: ไธๆญฃใช 'mouseshape' ใงใ™"
+msgid "E13: File exists (add ! to override)"
+msgstr "E13: ใƒ•ใ‚กใ‚คใƒซใŒๅญ˜ๅœจใ—ใพใ™ (! ใ‚’่ฟฝๅŠ ใงไธŠๆ›ธ)"
-#~ msgid "Enter encryption key: "
-#~ msgstr "ๆš—ๅทๅŒ–็”จใฎใ‚ญใƒผใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„: "
+msgid "E472: Command failed"
+msgstr "E472: ใ‚ณใƒžใƒณใƒ‰ใŒๅคฑๆ•—ใ—ใพใ—ใŸ"
-#~ msgid "Enter same key again: "
-#~ msgstr "ใ‚‚ใ†ไธ€ๅบฆๅŒใ˜ใ‚ญใƒผใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„: "
+#, c-format
+msgid "E234: Unknown fontset: %s"
+msgstr "E234: ๆœช็Ÿฅใฎใƒ•ใ‚ฉใƒณใƒˆใ‚ปใƒƒใƒˆ: %s"
-#~ msgid "Keys don't match!"
-#~ msgstr "ใ‚ญใƒผใŒไธ€่‡ดใ—ใพใ›ใ‚“"
+#, c-format
+msgid "E235: Unknown font: %s"
+msgstr "E235: ๆœช็Ÿฅใฎใƒ•ใ‚ฉใƒณใƒˆ: %s"
-#~ msgid "Cannot connect to Netbeans #2"
-#~ msgstr "Netbeans #2 ใซๆŽฅ็ถšใงใใพใ›ใ‚“"
+#, c-format
+msgid "E236: Font \"%s\" is not fixed-width"
+msgstr "E236: ใƒ•ใ‚ฉใƒณใƒˆ \"%s\" ใฏๅ›บๅฎšๅน…ใงใฏใ‚ใ‚Šใพใ›ใ‚“"
-#~ msgid "Cannot connect to Netbeans"
-#~ msgstr "Netbeans ใซๆŽฅ็ถšใงใใพใ›ใ‚“"
+msgid "E473: Internal error"
+msgstr "E473: ๅ†…้ƒจใ‚จใƒฉใƒผใงใ™"
-#~ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
-#~ msgstr ""
-#~ "E668: NetBeansใฎๆŽฅ็ถšๆƒ…ๅ ฑใƒ•ใ‚กใ‚คใƒซใฎใ‚ขใ‚ฏใ‚ปใ‚นใƒขใƒผใƒ‰ใซๅ•้กŒใŒใ‚ใ‚Šใพใ™: \"%s\""
+#, c-format
+msgid "E685: Internal error: %s"
+msgstr "E685: ๅ†…้ƒจใ‚จใƒฉใƒผใงใ™: %s"
-#~ msgid "read from Netbeans socket"
-#~ msgstr "Netbeans ใฎใ‚ฝใ‚ฑใƒƒใƒˆใ‚’่ชญ่พผใฟ"
+msgid "Interrupted"
+msgstr "ๅ‰ฒ่พผใพใ‚Œใพใ—ใŸ"
-#~ msgid "E658: NetBeans connection lost for buffer %<PRId64>"
-#~ msgstr "E658: ใƒใƒƒใƒ•ใ‚ก %<PRId64> ใฎ NetBeans ๆŽฅ็ถšใŒๅคฑใ‚ใ‚Œใพใ—ใŸ"
+msgid "E14: Invalid address"
+msgstr "E14: ็„กๅŠนใชใ‚ขใƒ‰ใƒฌใ‚นใงใ™"
-#~ msgid "E838: netbeans is not supported with this GUI"
-#~ msgstr "E838: NetBeansใฏใ“ใฎGUIใซใฏๅฏพๅฟœใ—ใฆใ„ใพใ›ใ‚“"
+msgid "E474: Invalid argument"
+msgstr "E474: ็„กๅŠนใชๅผ•ๆ•ฐใงใ™"
-#~ msgid "E511: netbeans already connected"
-#~ msgstr "E511: NetBeansใฏๆ—ขใซๆŽฅ็ถšใ—ใฆใ„ใพใ™"
+#, c-format
+msgid "E475: Invalid argument: %s"
+msgstr "E475: ็„กๅŠนใชๅผ•ๆ•ฐใงใ™: %s"
-#~ msgid "E505: %s is read-only (add ! to override)"
-#~ msgstr "E505: %s ใฏ่ชญ่พผๅฐ‚็”จใงใ™ (ๅผทๅˆถๆ›ธ่พผใซใฏ ! ใ‚’่ฟฝๅŠ )"
+#, c-format
+msgid "E475: Invalid value for argument %s"
+msgstr "E475: ๅผ•ๆ•ฐ %s ใซๅฏพใ—ใฆ็„กๅŠนใชๅ€คใงใ™"
-#~ msgid "E775: Eval feature not available"
-#~ msgstr "E775: ๅผ่ฉ•ไพกๆฉŸ่ƒฝใŒ็„กๅŠนใซใชใฃใฆใ„ใพใ™"
+#, c-format
+msgid "E475: Invalid value for argument %s: %s"
+msgstr "E475: ๅผ•ๆ•ฐ %s ใซๅฏพใ—ใฆ็„กๅŠนใชๅ€คใงใ™: %s"
-#~ msgid "freeing %<PRId64> lines"
-#~ msgstr "%<PRId64> ่กŒใ‚’่งฃๆ”พไธญ"
+#, c-format
+msgid "E15: Invalid expression: %s"
+msgstr "E15: ็„กๅŠนใชๅผใงใ™: %s"
-#~ msgid "E530: Cannot change term in GUI"
-#~ msgstr "E530: GUIใงใฏ 'term' ใ‚’ๅค‰ๆ›ดใงใใพใ›ใ‚“"
+msgid "E16: Invalid range"
+msgstr "E16: ็„กๅŠนใช็ฏ„ๅ›ฒใงใ™"
-#~ msgid "E531: Use \":gui\" to start the GUI"
-#~ msgstr "E531: GUIใ‚’ใ‚นใ‚ฟใƒผใƒˆใ™ใ‚‹ใซใฏ \":gui\" ใ‚’ไฝฟ็”จใ—ใฆใใ ใ•ใ„"
+msgid "E476: Invalid command"
+msgstr "E476: ็„กๅŠนใชใ‚ณใƒžใƒณใƒ‰ใงใ™"
-#~ msgid "E617: Cannot be changed in the GTK+ 2 GUI"
-#~ msgstr "E617: GTK+2 GUIใงใฏๅค‰ๆ›ดใงใใพใ›ใ‚“"
+#, c-format
+msgid "E17: \"%s\" is a directory"
+msgstr "E17: \"%s\" ใฏใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใงใ™"
-#~ msgid "E596: Invalid font(s)"
-#~ msgstr "E596: ็„กๅŠนใชใƒ•ใ‚ฉใƒณใƒˆใงใ™"
+#, c-format
+msgid "E364: Library call failed for \"%s()\""
+msgstr "E364: \"%s\"() ใฎใƒฉใ‚คใƒ–ใƒฉใƒชๅ‘ผๅ‡บใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-#~ msgid "E597: can't select fontset"
-#~ msgstr "E597: ใƒ•ใ‚ฉใƒณใƒˆใ‚ปใƒƒใƒˆใ‚’้ธๆŠžใงใใพใ›ใ‚“"
+msgid "E667: Fsync failed"
+msgstr "E667: fsync ใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-#~ msgid "E598: Invalid fontset"
-#~ msgstr "E598: ็„กๅŠนใชใƒ•ใ‚ฉใƒณใƒˆใ‚ปใƒƒใƒˆใงใ™"
+#, c-format
+msgid "E448: Could not load library function %s"
+msgstr "E448: ใƒฉใ‚คใƒ–ใƒฉใƒชใฎ้–ขๆ•ฐ %s ใ‚’ใƒญใƒผใƒ‰ใงใใพใ›ใ‚“ใงใ—ใŸ"
-#~ msgid "E533: can't select wide font"
-#~ msgstr "E533: ใƒฏใ‚คใƒ‰ใƒ•ใ‚ฉใƒณใƒˆใ‚’้ธๆŠžใงใใพใ›ใ‚“"
+msgid "E19: Mark has invalid line number"
+msgstr "E19: ใƒžใƒผใ‚ฏใซ็„กๅŠนใช่กŒ็•ชๅทใŒๆŒ‡ๅฎšใ•ใ‚Œใฆใ„ใพใ—ใŸ"
-#~ msgid "E534: Invalid wide font"
-#~ msgstr "E534: ็„กๅŠนใชใƒฏใ‚คใƒ‰ใƒ•ใ‚ฉใƒณใƒˆใงใ™"
+msgid "E20: Mark not set"
+msgstr "E20: ใƒžใƒผใ‚ฏใฏ่จญๅฎšใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#~ msgid "E538: No mouse support"
-#~ msgstr "E538: ใƒžใ‚ฆใ‚นใฏใ‚ตใƒใƒผใƒˆใ•ใ‚Œใพใ›ใ‚“"
+msgid "E21: Cannot make changes, 'modifiable' is off"
+msgstr "E21: 'modifiable' ใŒใ‚ชใƒ•ใชใฎใงใ€ๅค‰ๆ›ดใงใใพใ›ใ‚“"
-#~ msgid "cannot open "
-#~ msgstr "้–‹ใ‘ใพใ›ใ‚“ "
+msgid "E22: Scripts nested too deep"
+msgstr "E22: ใ‚นใ‚ฏใƒชใƒ—ใƒˆใฎๅ…ฅใ‚ŒๅญใŒๆทฑ้ŽใŽใพใ™"
-#~ msgid "VIM: Can't open window!\n"
-#~ msgstr "VIM: ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚’้–‹ใ‘ใพใ›ใ‚“!\n"
+msgid "E23: No alternate file"
+msgstr "E23: ๅ‰ฏใƒ•ใ‚กใ‚คใƒซใฏใ‚ใ‚Šใพใ›ใ‚“"
-#~ msgid "Need Amigados version 2.04 or later\n"
-#~ msgstr "Amigadosใฎใƒใƒผใ‚ธใƒงใƒณ 2.04ใ‹ใใ‚Œไปฅ้™ใŒๅฟ…่ฆใงใ™\n"
+msgid "E24: No such abbreviation"
+msgstr "E24: ใใฎใ‚ˆใ†ใช็Ÿญ็ธฎๅ…ฅๅŠ›ใฏใ‚ใ‚Šใพใ›ใ‚“"
-#~ msgid "Need %s version %<PRId64>\n"
-#~ msgstr "%s ใฎใƒใƒผใ‚ธใƒงใƒณ %<PRId64> ใŒๅฟ…่ฆใงใ™\n"
+msgid "E477: No ! allowed"
+msgstr "E477: ! ใฏ่จฑๅฏใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#~ msgid "Cannot open NIL:\n"
-#~ msgstr "NILใ‚’้–‹ใ‘ใพใ›ใ‚“:\n"
+msgid "E25: GUI cannot be used: Not enabled at compile time"
+msgstr "E25: GUIใฏไฝฟ็”จไธๅฏ่ƒฝใงใ™: ใ‚ณใƒณใƒ‘ใ‚คใƒซๆ™‚ใซ็„กๅŠนใซใ•ใ‚Œใฆใ„ใพใ™"
-#~ msgid "Cannot create "
-#~ msgstr "ไฝœๆˆใงใใพใ›ใ‚“ "
+msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
+msgstr "E26: ใƒ˜ใƒ–ใƒฉใ‚ค่ชžใฏไฝฟ็”จไธๅฏ่ƒฝใงใ™: ใ‚ณใƒณใƒ‘ใ‚คใƒซๆ™‚ใซ็„กๅŠนใซใ•ใ‚Œใฆใ„ใพใ™\n"
-#~ msgid "Vim exiting with %d\n"
-#~ msgstr "Vimใฏ %d ใง็ต‚ไบ†ใ—ใพใ™\n"
+msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
+msgstr "E27: ใƒšใƒซใ‚ทใ‚ข่ชžใฏไฝฟ็”จไธๅฏ่ƒฝใงใ™: ใ‚ณใƒณใƒ‘ใ‚คใƒซๆ™‚ใซ็„กๅŠนใซใ•ใ‚Œใฆใ„ใพใ™\n"
-#~ msgid "cannot change console mode ?!\n"
-#~ msgstr "ใ‚ณใƒณใ‚ฝใƒผใƒซใƒขใƒผใƒ‰ใ‚’ๅค‰ๆ›ดใงใใพใ›ใ‚“?!\n"
+msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
+msgstr "E800: ใ‚ขใƒฉใƒ“ใ‚ข่ชžใฏไฝฟ็”จไธๅฏ่ƒฝใงใ™: ใ‚ณใƒณใƒ‘ใ‚คใƒซๆ™‚ใซ็„กๅŠนใซใ•ใ‚Œใฆใ„ใพใ™\n"
-#~ msgid "mch_get_shellsize: not a console??\n"
-#~ msgstr "mch_get_shellsize: ใ‚ณใƒณใ‚ฝใƒผใƒซใงใฏใชใ„??\n"
+#, c-format
+msgid "E28: No such highlight group name: %s"
+msgstr "E28: ใใฎใ‚ˆใ†ใชๅใฎใƒใ‚คใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ใฏใ‚ใ‚Šใพใ›ใ‚“: %s"
-#~ msgid "E360: Cannot execute shell with -f option"
-#~ msgstr "E360: -f ใ‚ชใƒ—ใ‚ทใƒงใƒณใงใ‚ทใ‚งใƒซใ‚’ๅฎŸ่กŒใงใใพใ›ใ‚“"
+msgid "E29: No inserted text yet"
+msgstr "E29: ใพใ ใƒ†ใ‚ญใ‚นใƒˆใŒๆŒฟๅ…ฅใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#~ msgid "Cannot execute "
-#~ msgstr "ๅฎŸ่กŒใงใใพใ›ใ‚“ "
+msgid "E30: No previous command line"
+msgstr "E30: ไปฅๅ‰ใซใ‚ณใƒžใƒณใƒ‰่กŒใŒใ‚ใ‚Šใพใ›ใ‚“"
-#~ msgid "shell "
-#~ msgstr "ใ‚ทใ‚งใƒซ "
+msgid "E31: No such mapping"
+msgstr "E31: ใใฎใ‚ˆใ†ใชใƒžใƒƒใƒ”ใƒณใ‚ฐใฏใ‚ใ‚Šใพใ›ใ‚“"
-#~ msgid " returned\n"
-#~ msgstr " ๆˆปใ‚Šใพใ—ใŸ\n"
+msgid "E479: No match"
+msgstr "E479: ่ฉฒๅฝ“ใฏใ‚ใ‚Šใพใ›ใ‚“"
-#~ msgid "ANCHOR_BUF_SIZE too small."
-#~ msgstr "ANCHOR_BUF_SIZE ใŒๅฐใ•้ŽใŽใพใ™."
+#, c-format
+msgid "E480: No match: %s"
+msgstr "E480: ่ฉฒๅฝ“ใฏใ‚ใ‚Šใพใ›ใ‚“: %s"
-#~ msgid "I/O ERROR"
-#~ msgstr "ๅ…ฅๅ‡บๅŠ›ใ‚จใƒฉใƒผ"
+msgid "E32: No file name"
+msgstr "E32: ใƒ•ใ‚กใ‚คใƒซๅใŒใ‚ใ‚Šใพใ›ใ‚“"
-#~ msgid "Message"
-#~ msgstr "ใƒกใƒƒใ‚ปใƒผใ‚ธ"
+msgid "E33: No previous substitute regular expression"
+msgstr "E33: ๆญฃ่ฆ่กจ็พ็ฝฎๆ›ใŒใพใ ๅฎŸ่กŒใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#~ msgid "'columns' is not 80, cannot execute external commands"
-#~ msgstr "'columns' ใŒ80ใงใฏใชใ„ใŸใ‚, ๅค–้ƒจใ‚ณใƒžใƒณใƒ‰ใ‚’ๅฎŸ่กŒใงใใพใ›ใ‚“"
+msgid "E34: No previous command"
+msgstr "E34: ใ‚ณใƒžใƒณใƒ‰ใŒใพใ ๅฎŸ่กŒใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#~ msgid "E237: Printer selection failed"
-#~ msgstr "E237: ใƒ—ใƒชใƒณใ‚ฟใฎ้ธๆŠžใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+msgid "E35: No previous regular expression"
+msgstr "E35: ๆญฃ่ฆ่กจ็พใŒใพใ ๅฎŸ่กŒใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#~ msgid "to %s on %s"
-#~ msgstr "%s ใธ (%s ไธŠใฎ)"
+msgid "E481: No range allowed"
+msgstr "E481: ็ฏ„ๅ›ฒๆŒ‡ๅฎšใฏ่จฑๅฏใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#~ msgid "E613: Unknown printer font: %s"
-#~ msgstr "E613: ๆœช็Ÿฅใฎใƒ—ใƒชใƒณใ‚ฟใ‚ชใƒ—ใ‚ทใƒงใƒณใงใ™: %s"
+msgid "E36: Not enough room"
+msgstr "E36: ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใซๅๅˆ†ใช้ซ˜ใ•ใ‚‚ใ—ใใฏๅน…ใŒใ‚ใ‚Šใพใ›ใ‚“"
-#~ msgid "E238: Print error: %s"
-#~ msgstr "E238: ๅฐๅˆทใ‚จใƒฉใƒผ: %s"
+#, c-format
+msgid "E247: no registered server named \"%s\""
+msgstr "E247: %s ใจใ„ใ†ๅๅ‰ใฎ็™ป้Œฒใ•ใ‚ŒใŸใ‚ตใƒผใƒใƒผใฏใ‚ใ‚Šใพใ›ใ‚“"
-#~ msgid "Printing '%s'"
-#~ msgstr "ๅฐๅˆทใ—ใฆใ„ใพใ™: '%s'"
+#, c-format
+msgid "E482: Can't create file %s"
+msgstr "E482: ใƒ•ใ‚กใ‚คใƒซ %s ใ‚’ไฝœๆˆใงใใพใ›ใ‚“"
-#~ msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
-#~ msgstr "E244: ๆ–‡ๅญ—ใ‚ปใƒƒใƒˆๅ \"%s\" ใฏไธๆญฃใงใ™ (ใƒ•ใ‚ฉใƒณใƒˆๅ \"%s\")"
+msgid "E483: Can't get temp file name"
+msgstr "E483: ไธ€ๆ™‚ใƒ•ใ‚กใ‚คใƒซใฎๅๅ‰ใ‚’ๅ–ๅพ—ใงใใพใ›ใ‚“"
-#~ msgid "E245: Illegal char '%c' in font name \"%s\""
-#~ msgstr "E245: '%c' ใฏไธๆญฃใชๆ–‡ๅญ—ใงใ™ (ใƒ•ใ‚ฉใƒณใƒˆๅ \"%s\")"
+#, c-format
+msgid "E484: Can't open file %s"
+msgstr "E484: ใƒ•ใ‚กใ‚คใƒซ \"%s\" ใ‚’้–‹ใ‘ใพใ›ใ‚“"
-#~ msgid "Vim: Double signal, exiting\n"
-#~ msgstr "Vim: 2้‡ใฎใ‚ทใ‚ฐใƒŠใƒซใฎใŸใ‚, ็ต‚ไบ†ใ—ใพใ™\n"
+#, c-format
+msgid "E485: Can't read file %s"
+msgstr "E485: ใƒ•ใ‚กใ‚คใƒซ %s ใ‚’่ชญ่พผใ‚ใพใ›ใ‚“"
-#~ msgid "Vim: Caught deadly signal %s\n"
-#~ msgstr "Vim: ่‡ดๅ‘ฝ็š„ใ‚ทใ‚ฐใƒŠใƒซ %s ใ‚’ๆคœ็Ÿฅใ—ใพใ—ใŸ\n"
+msgid "E38: Null argument"
+msgstr "E38: ๅผ•ๆ•ฐใŒ็ฉบใงใ™"
-#~ msgid "Vim: Caught deadly signal\n"
-#~ msgstr "Vim: ่‡ดๅ‘ฝ็š„ใ‚ทใ‚ฐใƒŠใƒซใ‚’ๆคœ็Ÿฅใ—ใพใ—ใŸ\n"
+msgid "E39: Number expected"
+msgstr "E39: ๆ•ฐๅ€คใŒ่ฆๆฑ‚ใ•ใ‚Œใฆใ„ใพใ™"
-#~ msgid "Opening the X display took %<PRId64> msec"
-#~ msgstr "Xใ‚ตใƒผใƒใธใฎๆŽฅ็ถšใซ %<PRId64> ใƒŸใƒช็ง’ใ‹ใ‹ใ‚Šใพใ—ใŸ"
+#, c-format
+msgid "E40: Can't open errorfile %s"
+msgstr "E40: ใ‚จใƒฉใƒผใƒ•ใ‚กใ‚คใƒซ %s ใ‚’้–‹ใ‘ใพใ›ใ‚“"
-#~ msgid ""
-#~ "\n"
-#~ "Vim: Got X error\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Vim: X ใฎใ‚จใƒฉใƒผใ‚’ๆคœๅ‡บใ—ใพใ—ใŸr\n"
+msgid "E233: cannot open display"
+msgstr "E233: ใƒ‡ใ‚ฃใ‚นใƒ—ใƒฌใ‚คใ‚’้–‹ใ‘ใพใ›ใ‚“"
-#~ msgid "Testing the X display failed"
-#~ msgstr "X display ใฎใƒใ‚งใƒƒใ‚ฏใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+msgid "E41: Out of memory!"
+msgstr "E41: ใƒกใƒขใƒชใŒๅฐฝใๆžœใฆใพใ—ใŸ!"
-#~ msgid "Opening the X display timed out"
-#~ msgstr "X display ใฎ open ใŒใ‚ฟใ‚คใƒ ใ‚ขใ‚ฆใƒˆใ—ใพใ—ใŸ"
+msgid "Pattern not found"
+msgstr "ใƒ‘ใ‚ฟใƒผใƒณใฏ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“ใงใ—ใŸ"
-#~ msgid ""
-#~ "\n"
-#~ "Cannot execute shell sh\n"
-#~ msgstr ""
-#~ "\n"
-#~ "sh ใ‚ทใ‚งใƒซใ‚’ๅฎŸ่กŒใงใใพใ›ใ‚“\n"
+#, c-format
+msgid "E486: Pattern not found: %s"
+msgstr "E486: ใƒ‘ใ‚ฟใƒผใƒณใฏ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“ใงใ—ใŸ: %s"
-#~ msgid ""
-#~ "\n"
-#~ "Cannot create pipes\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ใƒ‘ใ‚คใƒ—ใ‚’ไฝœๆˆใงใใพใ›ใ‚“\n"
+msgid "E487: Argument must be positive"
+msgstr "E487: ๅผ•ๆ•ฐใฏๆญฃใฎๅ€คใงใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“"
-#~ msgid ""
-#~ "\n"
-#~ "Cannot fork\n"
-#~ msgstr ""
-#~ "\n"
-#~ "fork ใงใใพใ›ใ‚“\n"
+msgid "E459: Cannot go back to previous directory"
+msgstr "E459: ๅ‰ใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใซๆˆปใ‚Œใพใ›ใ‚“"
-#~ msgid ""
-#~ "\n"
-#~ "Command terminated\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ใ‚ณใƒžใƒณใƒ‰ใ‚’ไธญๆ–ญใ—ใพใ—ใŸ\n"
+msgid "E42: No Errors"
+msgstr "E42: ใ‚จใƒฉใƒผใฏใ‚ใ‚Šใพใ›ใ‚“"
-#~ msgid "XSMP lost ICE connection"
-#~ msgstr "XSMP ใŒICEๆŽฅ็ถšใ‚’ๅคฑใ„ใพใ—ใŸ"
+msgid "E776: No location list"
+msgstr "E776: ใƒญใ‚ฑใƒผใ‚ทใƒงใƒณใƒชใ‚นใƒˆใฏใ‚ใ‚Šใพใ›ใ‚“"
-#~ msgid "Opening the X display failed"
-#~ msgstr "X display ใฎ open ใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+msgid "E43: Damaged match string"
+msgstr "E43: ่ฉฒๅฝ“ๆ–‡ๅญ—ๅˆ—ใŒ็ ดๆใ—ใฆใ„ใพใ™"
-#~ msgid "XSMP handling save-yourself request"
-#~ msgstr "XSMP ใŒsave-yourself่ฆๆฑ‚ใ‚’ๅ‡ฆ็†ใ—ใฆใ„ใพใ™"
+msgid "E44: Corrupted regexp program"
+msgstr "E44: ไธๆญฃใชๆญฃ่ฆ่กจ็พใƒ—ใƒญใ‚ฐใƒฉใƒ ใงใ™"
-#~ msgid "XSMP opening connection"
-#~ msgstr "XSMP ใŒๆŽฅ็ถšใ‚’้–‹ๅง‹ใ—ใฆใ„ใพใ™"
+msgid "E45: 'readonly' option is set (add ! to override)"
+msgstr "E45: 'readonly' ใ‚ชใƒ—ใ‚ทใƒงใƒณใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใพใ™ (! ใ‚’่ฟฝๅŠ ใงไธŠๆ›ธใ)"
-#~ msgid "XSMP ICE connection watch failed"
-#~ msgstr "XSMP ICEๆŽฅ็ถšใŒๅคฑๆ•—ใ—ใŸใ‚ˆใ†ใงใ™"
+#, c-format
+msgid "E46: Cannot change read-only variable \"%s\""
+msgstr "E46: ่ชญๅ–ๅฐ‚็”จๅค‰ๆ•ฐ \"%s\" ใซใฏๅ€คใ‚’่จญๅฎšใงใใพใ›ใ‚“"
-#~ msgid "XSMP SmcOpenConnection failed: %s"
-#~ msgstr "XSMP SmcOpenConnectionใŒๅคฑๆ•—ใ—ใพใ—ใŸ: %s"
+#, c-format
+msgid "E794: Cannot set variable in the sandbox: \"%s\""
+msgstr "E794: ใ‚ตใƒณใƒ‰ใƒœใƒƒใ‚ฏใ‚นใงใฏๅค‰ๆ•ฐ \"%s\" ใซๅ€คใ‚’่จญๅฎšใงใใพใ›ใ‚“"
-#~ msgid "At line"
-#~ msgstr "่กŒ"
+msgid "E713: Cannot use empty key for Dictionary"
+msgstr "E713: ่พžๆ›ธๅž‹ใซ็ฉบใฎใ‚ญใƒผใ‚’ไฝฟใ†ใ“ใจใฏใงใใพใ›ใ‚“"
-#~ msgid "Could not load vim32.dll!"
-#~ msgstr "vim32.dll ใ‚’ใƒญใƒผใƒ‰ใงใใพใ›ใ‚“ใงใ—ใŸ"
+msgid "E715: Dictionary required"
+msgstr "E715: ่พžๆ›ธๅž‹ใŒๅฟ…่ฆใงใ™"
-#~ msgid "VIM Error"
-#~ msgstr "VIMใ‚จใƒฉใƒผ"
+#, c-format
+msgid "E684: list index out of range: %ld"
+msgstr "E684: ใƒชใ‚นใƒˆใฎใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใŒ็ฏ„ๅ›ฒๅค–ใงใ™: %ld"
-#~ msgid "Could not fix up function pointers to the DLL!"
-#~ msgstr "DLLใ‹ใ‚‰้–ขๆ•ฐใƒใ‚คใƒณใ‚ฟใ‚’ๅ–ๅพ—ใงใใพใ›ใ‚“ใงใ—ใŸ"
+#, c-format
+msgid "E118: Too many arguments for function: %s"
+msgstr "E118: ้–ขๆ•ฐใฎๅผ•ๆ•ฐใŒๅคš้ŽใŽใพใ™: %s"
-#~ msgid "shell returned %d"
-#~ msgstr "ใ‚ทใ‚งใƒซใŒใ‚ณใƒผใƒ‰ %d ใง็ต‚ไบ†ใ—ใพใ—ใŸ"
+#, c-format
+msgid "E716: Key not present in Dictionary: %s"
+msgstr "E716: ่พžๆ›ธๅž‹ใซใ‚ญใƒผใŒๅญ˜ๅœจใ—ใพใ›ใ‚“: %s"
-#~ msgid "Vim: Caught %s event\n"
-#~ msgstr "Vim: ใ‚คใƒ™ใƒณใƒˆ %s ใ‚’ๆคœ็Ÿฅ\n"
+msgid "E714: List required"
+msgstr "E714: ใƒชใ‚นใƒˆๅž‹ใŒๅฟ…่ฆใงใ™"
-#~ msgid "close"
-#~ msgstr "้–‰ใ˜ใ‚‹"
+#, c-format
+msgid "E712: Argument of %s must be a List or Dictionary"
+msgstr "E712: %s ใฎๅผ•ๆ•ฐใฏใƒชใ‚นใƒˆๅž‹ใพใŸใฏ่พžๆ›ธๅž‹ใงใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“"
-#~ msgid "logoff"
-#~ msgstr "ใƒญใ‚ฐใ‚ชใƒ•"
+msgid "E47: Error while reading errorfile"
+msgstr "E47: ใ‚จใƒฉใƒผใƒ•ใ‚กใ‚คใƒซใฎ่ชญ่พผไธญใซใ‚จใƒฉใƒผใŒ็™บ็”Ÿใ—ใพใ—ใŸ"
-#~ msgid "shutdown"
-#~ msgstr "ใ‚ทใƒฃใƒƒใƒˆใƒ€ใ‚ฆใƒณ"
+msgid "E48: Not allowed in sandbox"
+msgstr "E48: ใ‚ตใƒณใƒ‰ใƒœใƒƒใ‚ฏใ‚นใงใฏ่จฑใ•ใ‚Œใพใ›ใ‚“"
-#~ msgid "E371: Command not found"
-#~ msgstr "E371: ใ‚ณใƒžใƒณใƒ‰ใŒใ‚ใ‚Šใพใ›ใ‚“"
-
-#~ msgid ""
-#~ "VIMRUN.EXE not found in your $PATH.\n"
-#~ "External commands will not pause after completion.\n"
-#~ "See :help win32-vimrun for more information."
-#~ msgstr ""
-#~ "VIMRUN.EXEใŒ $PATH ใฎไธญใซ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“.\n"
-#~ "ๅค–้ƒจใ‚ณใƒžใƒณใƒ‰ใฎ็ต‚ไบ†ๅพŒใซไธ€ๆ™‚ๅœๆญขใ‚’ใ—ใพใ›ใ‚“.\n"
-#~ "่ฉณ็ดฐใฏ :help win32-vimrun ใ‚’ๅ‚็…งใ—ใฆใใ ใ•ใ„."
-
-#~ msgid "Vim Warning"
-#~ msgstr "Vimใฎ่ญฆๅ‘Š"
-
-#~ msgid "Error file"
-#~ msgstr "ใ‚จใƒฉใƒผใƒ•ใ‚กใ‚คใƒซ"
-
-#~ msgid "E868: Error building NFA with equivalence class!"
-#~ msgstr "E868: ็ญ‰ไพกใ‚ฏใƒฉใ‚นใ‚’ๅซใ‚€NFAๆง‹็ฏ‰ใซๅคฑๆ•—ใ—ใพใ—ใŸ!"
-
-#~ msgid "E878: (NFA) Could not allocate memory for branch traversal!"
-#~ msgstr "E878: (NFA) ็พๅœจๆจชๆ–ญไธญใฎใƒ–ใƒฉใƒณใƒใซๅๅˆ†ใชใƒกใƒขใƒชใ‚’ๅ‰ฒใ‚Šๅฝ“ใฆใ‚‰ใ‚Œใพใ›ใ‚“!"
-
-#~ msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\""
-#~ msgstr ""
-#~ "่ญฆๅ‘Š: ๅ˜่ชžใƒชใ‚นใƒˆ \"%s_%s.spl\" ใŠใ‚ˆใณ \"%s_ascii.spl\" ใฏ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“"
-
-#~ msgid "Conversion in %s not supported"
-#~ msgstr "%s ๅ†…ใฎๅค‰ๆ›ใฏใ‚ตใƒใƒผใƒˆใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-
-#~ msgid "E845: Insufficient memory, word list will be incomplete"
-#~ msgstr "E845: ใƒกใƒขใƒชใŒ่ถณใ‚Šใชใ„ใฎใงใ€ๅ˜่ชžใƒชใ‚นใƒˆใฏไธๅฎŒๅ…จใงใ™"
-
-#~ msgid "E430: Tag file path truncated for %s\n"
-#~ msgstr "E430: ใ‚ฟใ‚ฐใƒ•ใ‚กใ‚คใƒซใฎใƒ‘ใ‚นใŒ %s ใซๅˆ‡ใ‚Šๆจใฆใ‚‰ใ‚Œใพใ—ใŸ\n"
-
-#~ msgid "new shell started\n"
-#~ msgstr "ๆ–ฐใ—ใ„ใ‚ทใ‚งใƒซใ‚’่ตทๅ‹•ใ—ใพใ™\n"
-
-#~ msgid "Used CUT_BUFFER0 instead of empty selection"
-#~ msgstr "็ฉบใฎ้ธๆŠž้ ˜ๅŸŸใฎใ‹ใ‚ใ‚ŠใซCUT_BUFFER0ใŒไฝฟ็”จใ•ใ‚Œใพใ—ใŸ"
-
-#~ msgid "No undo possible; continue anyway"
-#~ msgstr "ๅฏ่ƒฝใชใ‚ขใƒณใƒ‰ใ‚ฅใฏใ‚ใ‚Šใพใ›ใ‚“: ใจใ‚Šใ‚ใˆใš็ถšใ‘ใพใ™"
-
-#~ msgid "E832: Non-encrypted file has encrypted undo file: %s"
-#~ msgstr ""
-#~ "E832: ้žๆš—ๅทๅŒ–ใƒ•ใ‚กใ‚คใƒซใŒๆš—ๅทๅŒ–ใ•ใ‚ŒใŸใ‚ขใƒณใƒ‰ใ‚ฅใƒ•ใ‚กใ‚คใƒซใ‚’ไฝฟใฃใฆใพใ™: %s"
-
-#~ msgid "E826: Undo file decryption failed: %s"
-#~ msgstr "E826: ๆš—ๅทๅŒ–ใ•ใ‚ŒใŸใ‚ขใƒณใƒ‰ใ‚ฅใƒ•ใ‚กใ‚คใƒซใฎ่งฃ่ชญใซๅคฑๆ•—ใ—ใพใ—ใŸ: %s"
-
-#~ msgid "E827: Undo file is encrypted: %s"
-#~ msgstr "E827: ใ‚ขใƒณใƒ‰ใ‚ฅใƒ•ใ‚กใ‚คใƒซใŒๆš—ๅทๅŒ–ใ•ใ‚Œใฆใ„ใพใ™: %s"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16/32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 16/32 ใƒ“ใƒƒใƒˆ GUI ็‰ˆ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 64 ใƒ“ใƒƒใƒˆ GUI ็‰ˆ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 32 ใƒ“ใƒƒใƒˆ GUI ็‰ˆ"
-
-#~ msgid " in Win32s mode"
-#~ msgstr " in Win32s ใƒขใƒผใƒ‰"
-
-#~ msgid " with OLE support"
-#~ msgstr " with OLE ใ‚ตใƒใƒผใƒˆ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 64 ใƒ“ใƒƒใƒˆ ใ‚ณใƒณใ‚ฝใƒผใƒซ ็‰ˆ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 32 ใƒ“ใƒƒใƒˆ ใ‚ณใƒณใ‚ฝใƒผใƒซ ็‰ˆ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16-bit version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 16 ใƒ“ใƒƒใƒˆ ็‰ˆ"
-
-#~ msgid ""
-#~ "\n"
-#~ "32-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "32 ใƒ“ใƒƒใƒˆ MS-DOS ็‰ˆ"
-
-#~ msgid ""
-#~ "\n"
-#~ "16-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "16 ใƒ“ใƒƒใƒˆ MS-DOS ็‰ˆ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X (unix) version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS X (unix) ็‰ˆ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS X ็‰ˆ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS ็‰ˆ"
-
-#~ msgid ""
-#~ "\n"
-#~ "OpenVMS version"
-#~ msgstr ""
-#~ "\n"
-#~ "OpenVMS ็‰ˆ"
-
-#~ msgid ""
-#~ "\n"
-#~ "Big version "
-#~ msgstr ""
-#~ "\n"
-#~ "Big ็‰ˆ "
-
-#~ msgid ""
-#~ "\n"
-#~ "Normal version "
-#~ msgstr ""
-#~ "\n"
-#~ "้€šๅธธ ็‰ˆ "
-
-#~ msgid ""
-#~ "\n"
-#~ "Small version "
-#~ msgstr ""
-#~ "\n"
-#~ "Small ็‰ˆ "
-
-#~ msgid ""
-#~ "\n"
-#~ "Tiny version "
-#~ msgstr ""
-#~ "\n"
-#~ "Tiny ็‰ˆ "
-
-#~ msgid "with GTK2-GNOME GUI."
-#~ msgstr "with GTK2-GNOME GUI."
+msgid "E523: Not allowed here"
+msgstr "E523: ใ“ใ“ใงใฏ่จฑๅฏใ•ใ‚Œใพใ›ใ‚“"
-#~ msgid "with GTK2 GUI."
-#~ msgstr "with GTK2 GUI."
+msgid "E359: Screen mode setting not supported"
+msgstr "E359: ใ‚นใ‚ฏใƒชใƒผใƒณใƒขใƒผใƒ‰ใฎ่จญๅฎšใซใฏๅฏพๅฟœใ—ใฆใ„ใพใ›ใ‚“"
-#~ msgid "with X11-Motif GUI."
-#~ msgstr "with X11-Motif GUI."
+msgid "E49: Invalid scroll size"
+msgstr "E49: ็„กๅŠนใชใ‚นใ‚ฏใƒญใƒผใƒซ้‡ใงใ™"
-#~ msgid "with X11-neXtaw GUI."
-#~ msgstr "with X11-neXtaw GUI."
+msgid "E91: 'shell' option is empty"
+msgstr "E91: 'shell' ใ‚ชใƒ—ใ‚ทใƒงใƒณใŒ็ฉบใงใ™"
-#~ msgid "with X11-Athena GUI."
-#~ msgstr "with X11-Athena GUI."
+msgid "E255: Couldn't read in sign data!"
+msgstr "E255: sign ใฎใƒ‡ใƒผใ‚ฟใ‚’่ชญ่พผใ‚ใพใ›ใ‚“ใงใ—ใŸ"
-#~ msgid "with Photon GUI."
-#~ msgstr "with Photon GUI."
+msgid "E72: Close error on swap file"
+msgstr "E72: ใ‚นใƒฏใƒƒใƒ—ใƒ•ใ‚กใ‚คใƒซใฎใ‚ฏใƒญใƒผใ‚บๆ™‚ใ‚จใƒฉใƒผใงใ™"
-#~ msgid "with GUI."
-#~ msgstr "with GUI."
+msgid "E73: tag stack empty"
+msgstr "E73: ใ‚ฟใ‚ฐใ‚นใ‚ฟใƒƒใ‚ฏใŒ็ฉบใงใ™"
-#~ msgid "with Carbon GUI."
-#~ msgstr "with Carbon GUI."
+msgid "E74: Command too complex"
+msgstr "E74: ใ‚ณใƒžใƒณใƒ‰ใŒ่ค‡้›‘้ŽใŽใพใ™"
-#~ msgid "with Cocoa GUI."
-#~ msgstr "with Cocoa GUI."
+msgid "E75: Name too long"
+msgstr "E75: ๅๅ‰ใŒ้•ท้ŽใŽใพใ™"
-#~ msgid "with (classic) GUI."
-#~ msgstr "with (ใ‚ฏใƒฉใ‚ทใƒƒใ‚ฏ) GUI."
+msgid "E76: Too many ["
+msgstr "E76: [ ใŒๅคš้ŽใŽใพใ™"
-#~ msgid " system gvimrc file: \""
-#~ msgstr " ใ‚ทใ‚นใƒ†ใƒ  gvimrc: \""
+msgid "E77: Too many file names"
+msgstr "E77: ใƒ•ใ‚กใ‚คใƒซๅใŒๅคš้ŽใŽใพใ™"
-#~ msgid " user gvimrc file: \""
-#~ msgstr " ใƒฆใƒผใ‚ถ gvimrc: \""
+msgid "E488: Trailing characters"
+msgstr "E488: ไฝ™ๅˆ†ใชๆ–‡ๅญ—ใŒๅพŒใ‚ใซใ‚ใ‚Šใพใ™"
-#~ msgid "2nd user gvimrc file: \""
-#~ msgstr " ็ฌฌ2ใƒฆใƒผใ‚ถ gvimrc: \""
+msgid "E78: Unknown mark"
+msgstr "E78: ๆœช็Ÿฅใฎใƒžใƒผใ‚ฏ"
-#~ msgid "3rd user gvimrc file: \""
-#~ msgstr " ็ฌฌ3ใƒฆใƒผใ‚ถ gvimrc: \""
+msgid "E79: Cannot expand wildcards"
+msgstr "E79: ใƒฏใ‚คใƒซใƒ‰ใ‚ซใƒผใƒ‰ใ‚’ๅฑ•้–‹ใงใใพใ›ใ‚“"
-#~ msgid " system menu file: \""
-#~ msgstr " ใ‚ทใ‚นใƒ†ใƒ ใƒกใƒ‹ใƒฅใƒผ: \""
+msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
+msgstr "E591: 'winheight' ใฏ 'winminheight' ใ‚ˆใ‚Šๅฐใ•ใใงใใพใ›ใ‚“"
-#~ msgid "Compiler: "
-#~ msgstr "ใ‚ณใƒณใƒ‘ใ‚คใƒฉ: "
+msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
+msgstr "E592: 'winwidth' ใฏ 'winminwidth' ใ‚ˆใ‚Šๅฐใ•ใใงใใพใ›ใ‚“"
-#~ msgid "menu Help->Orphans for information "
-#~ msgstr "่ฉณ็ดฐใฏใƒกใƒ‹ใƒฅใƒผใฎ ใƒ˜ใƒซใƒ—โ†’ๅญคๅ… ใ‚’ๅ‚็…งใ—ใฆไธ‹ใ•ใ„ "
+msgid "E80: Error while writing"
+msgstr "E80: ๆ›ธ่พผใฟไธญใฎใ‚จใƒฉใƒผ"
-#~ msgid "Running modeless, typed text is inserted"
-#~ msgstr "ใƒขใƒผใƒ‰็„กใงๅฎŸ่กŒไธญ, ใ‚ฟใ‚คใƒ—ใ—ใŸๆ–‡ๅญ—ใŒๆŒฟๅ…ฅใ•ใ‚Œใพใ™"
+msgid "E939: Positive count required"
+msgstr "E939: ๆญฃใฎใ‚ซใ‚ฆใƒณใƒˆใŒๅฟ…่ฆใงใ™"
-#~ msgid "menu Edit->Global Settings->Toggle Insert Mode "
-#~ msgstr "ใƒกใƒ‹ใƒฅใƒผใฎ ็ทจ้›†โ†’ๅ…จไฝ“่จญๅฎšโ†’ๆŒฟๅ…ฅ(ๅˆๅฟƒ่€…)ใƒขใƒผใƒ‰ๅˆ‡ๆ›ฟ "
+msgid "E81: Using <SID> not in a script context"
+msgstr "E81: ใ‚นใ‚ฏใƒชใƒ—ใƒˆไปฅๅค–ใง<SID>ใŒไฝฟใ‚ใ‚Œใพใ—ใŸ"
-#~ msgid " for two modes "
-#~ msgstr " ใงใƒขใƒผใƒ‰ๆœ‰ใซ "
+msgid "E449: Invalid expression received"
+msgstr "E449: ็„กๅŠนใชๅผใ‚’ๅ—ใ‘ๅ–ใ‚Šใพใ—ใŸ"
-#~ msgid "menu Edit->Global Settings->Toggle Vi Compatible"
-#~ msgstr "ใƒกใƒ‹ใƒฅใƒผใฎ ็ทจ้›†โ†’ๅ…จไฝ“่จญๅฎšโ†’Viไบ’ๆ›ใƒขใƒผใƒ‰ๅˆ‡ๆ›ฟ "
+msgid "E463: Region is guarded, cannot modify"
+msgstr "E463: ้ ˜ๅŸŸใŒไฟ่ญทใ•ใ‚Œใฆใ„ใ‚‹ใฎใงใ€ๅค‰ๆ›ดใงใใพใ›ใ‚“"
-#~ msgid " for Vim defaults "
-#~ msgstr " ใงVimใจใ—ใฆๅ‹•ไฝœ "
+msgid "E744: NetBeans does not allow changes in read-only files"
+msgstr "E744: NetBeans ใฏ่ชญ่พผๅฐ‚็”จใƒ•ใ‚กใ‚คใƒซใ‚’ๅค‰ๆ›ดใ™ใ‚‹ใ“ใจใ‚’่จฑใ—ใพใ›ใ‚“"
-#~ msgid "WARNING: Windows 95/98/ME detected"
-#~ msgstr " ่ญฆๅ‘Š: Windows 95/98/Me ใ‚’ๆคœๅ‡บ "
+msgid "E363: pattern uses more memory than 'maxmempattern'"
+msgstr "E363: ใƒ‘ใ‚ฟใƒผใƒณใŒ 'maxmempattern' ไปฅไธŠใฎใƒกใƒขใƒชใ‚’ไฝฟ็”จใ—ใพใ™"
-#~ msgid "type :help windows95<Enter> for info on this"
-#~ msgstr " ่ฉณ็ดฐใชๆƒ…ๅ ฑใฏ :help windows95<Enter> "
+msgid "E749: empty buffer"
+msgstr "E749: ใƒใƒƒใƒ•ใ‚กใŒ็ฉบใงใ™"
-#~ msgid "Edit with &multiple Vims"
-#~ msgstr "่ค‡ๆ•ฐใฎVimใง็ทจ้›†ใ™ใ‚‹ (&M)"
+#, c-format
+msgid "E86: Buffer %ld does not exist"
+msgstr "E86: ใƒใƒƒใƒ•ใ‚ก %ld ใฏใ‚ใ‚Šใพใ›ใ‚“"
-#~ msgid "Edit with single &Vim"
-#~ msgstr "1ใคใฎVimใง็ทจ้›†ใ™ใ‚‹ (&V)"
+msgid "E682: Invalid search pattern or delimiter"
+msgstr "E682: ๆคœ็ดขใƒ‘ใ‚ฟใƒผใƒณใ‹ๅŒบๅˆ‡ใ‚Š่จ˜ๅทใŒไธๆญฃใงใ™"
-#~ msgid "Diff with Vim"
-#~ msgstr "Vimใงๅทฎๅˆ†ใ‚’่กจ็คบใ™ใ‚‹"
+msgid "E139: File is loaded in another buffer"
+msgstr "E139: ๅŒใ˜ๅๅ‰ใฎใƒ•ใ‚กใ‚คใƒซใŒไป–ใฎใƒใƒƒใƒ•ใ‚กใง่ชญ่พผใพใ‚Œใฆใ„ใพใ™"
-#~ msgid "Edit with &Vim"
-#~ msgstr "Vimใง็ทจ้›†ใ™ใ‚‹ (&V)"
+#, c-format
+msgid "E764: Option '%s' is not set"
+msgstr "E764: ใ‚ชใƒ—ใ‚ทใƒงใƒณ '%s' ใฏ่จญๅฎšใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#~ msgid "Edit with existing Vim - "
-#~ msgstr "่ตทๅ‹•ๆธˆใฎVimใง็ทจ้›†ใ™ใ‚‹ - "
+msgid "E850: Invalid register name"
+msgstr "E850: ็„กๅŠนใชใƒฌใ‚ธใ‚นใ‚ฟๅใงใ™"
-#~ msgid "Edits the selected file(s) with Vim"
-#~ msgstr "้ธๆŠžใ—ใŸใƒ•ใ‚กใ‚คใƒซใ‚’Vimใง็ทจ้›†ใ™ใ‚‹"
+#, c-format
+msgid "E919: Directory not found in '%s': \"%s\""
+msgstr "E919: ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใŒ '%s' ใฎไธญใซใ‚ใ‚Šใพใ›ใ‚“: \"%s\""
-#~ msgid "Error creating process: Check if gvim is in your path!"
-#~ msgstr "ใƒ—ใƒญใ‚ปใ‚นใฎไฝœๆˆใซๅคฑๆ•—: gvimใŒ็’ฐๅขƒๅค‰ๆ•ฐPATHไธŠใซใ‚ใ‚‹ใ‹็ขบ่ชใ—ใฆใใ ใ•ใ„!"
+msgid "E952: Autocommand caused recursive behavior"
+msgstr "E952: AutocommandใŒๅ†ๅธฐใ‚’ๅผ•ใ่ตทใ“ใ—ใพใ—ใŸ"
-#~ msgid "gvimext.dll error"
-#~ msgstr "gvimext.dll ใ‚จใƒฉใƒผ"
+msgid "search hit TOP, continuing at BOTTOM"
+msgstr "ไธŠใพใงๆคœ็ดขใ—ใŸใฎใงไธ‹ใซๆˆปใ‚Šใพใ™"
-#~ msgid "Path length too long!"
-#~ msgstr "ใƒ‘ใ‚นใŒ้•ทใ™ใŽใพใ™!"
+msgid "search hit BOTTOM, continuing at TOP"
+msgstr "ไธ‹ใพใงๆคœ็ดขใ—ใŸใฎใงไธŠใซๆˆปใ‚Šใพใ™"
-#~ msgid "E234: Unknown fontset: %s"
-#~ msgstr "E234: ๆœช็Ÿฅใฎใƒ•ใ‚ฉใƒณใƒˆใ‚ปใƒƒใƒˆ: %s"
+#, c-format
+msgid "Need encryption key for \"%s\""
+msgstr "ๆš—ๅทใ‚ญใƒผใŒๅฟ…่ฆใงใ™: \"%s\""
-#~ msgid "E235: Unknown font: %s"
-#~ msgstr "E235: ๆœช็Ÿฅใฎใƒ•ใ‚ฉใƒณใƒˆ: %s"
+msgid "empty keys are not allowed"
+msgstr "็ฉบใฎใ‚ญใƒผใฏ่จฑๅฏใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
-#~ msgid "E236: Font \"%s\" is not fixed-width"
-#~ msgstr "E236: ใƒ•ใ‚ฉใƒณใƒˆ \"%s\" ใฏๅ›บๅฎšๅน…ใงใฏใ‚ใ‚Šใพใ›ใ‚“"
+msgid "dictionary is locked"
+msgstr "่พžๆ›ธใฏใƒญใƒƒใ‚ฏใ•ใ‚Œใฆใ„ใพใ™"
-#~ msgid "E448: Could not load library function %s"
-#~ msgstr "E448: ใƒฉใ‚คใƒ–ใƒฉใƒชใฎ้–ขๆ•ฐ %s ใ‚’ใƒญใƒผใƒ‰ใงใใพใ›ใ‚“ใงใ—ใŸ"
+msgid "list is locked"
+msgstr "ใƒชใ‚นใƒˆใฏใƒญใƒƒใ‚ฏใ•ใ‚Œใฆใ„ใพใ™"
-#~ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
-#~ msgstr "E26: ใƒ˜ใƒ–ใƒฉใ‚ค่ชžใฏไฝฟ็”จไธๅฏ่ƒฝใงใ™: ใ‚ณใƒณใƒ‘ใ‚คใƒซๆ™‚ใซ็„กๅŠนใซใ•ใ‚Œใฆใ„ใพใ™\n"
+#, c-format
+msgid "failed to add key '%s' to dictionary"
+msgstr "่พžๆ›ธใซใ‚ญใƒผ '%s' ใ‚’่ฟฝๅŠ ใ™ใ‚‹ใฎใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-#~ msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
-#~ msgstr "E27: ใƒšใƒซใ‚ทใ‚ข่ชžใฏไฝฟ็”จไธๅฏ่ƒฝใงใ™: ใ‚ณใƒณใƒ‘ใ‚คใƒซๆ™‚ใซ็„กๅŠนใซใ•ใ‚Œใฆใ„ใพใ™\n"
+#, c-format
+msgid "index must be int or slice, not %s"
+msgstr "ใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใฏ %s ใงใฏใชใๆ•ดๆ•ฐใ‹ใ‚นใƒฉใ‚คใ‚นใซใ—ใฆใใ ใ•ใ„"
-#~ msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
-#~ msgstr ""
-#~ "E800: ใ‚ขใƒฉใƒ“ใ‚ข่ชžใฏไฝฟ็”จไธๅฏ่ƒฝใงใ™: ใ‚ณใƒณใƒ‘ใ‚คใƒซๆ™‚ใซ็„กๅŠนใซใ•ใ‚Œใฆใ„ใพใ™\n"
+#, c-format
+msgid "expected str() or unicode() instance, but got %s"
+msgstr "str() ใ‚‚ใ—ใใฏ unicode() ใฎใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใŒๆœŸๅพ…ใ•ใ‚Œใฆใ„ใ‚‹ใฎใซ %s ใงใ—ใŸ"
-#~ msgid "E247: no registered server named \"%s\""
-#~ msgstr "E247: %s ใจใ„ใ†ๅๅ‰ใฎ็™ป้Œฒใ•ใ‚ŒใŸใ‚ตใƒผใƒใฏใ‚ใ‚Šใพใ›ใ‚“"
+#, c-format
+msgid "expected bytes() or str() instance, but got %s"
+msgstr "bytes() ใ‚‚ใ—ใใฏ str() ใฎใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใŒๆœŸๅพ…ใ•ใ‚Œใฆใ„ใ‚‹ใฎใซ %s ใงใ—ใŸ"
-#~ msgid "E233: cannot open display"
-#~ msgstr "E233: ใƒ‡ใ‚ฃใ‚นใƒ—ใƒฌใ‚คใ‚’้–‹ใ‘ใพใ›ใ‚“"
+#, c-format
+msgid ""
+"expected int(), long() or something supporting coercing to long(), but got %s"
+msgstr "long() ใ‹ใใ‚Œใธๅค‰ๆ›ๅฏ่ƒฝใชใ‚‚ใฎใŒๆœŸๅพ…ใ•ใ‚Œใฆใ„ใ‚‹ใฎใซ %s ใงใ—ใŸ"
-#~ msgid "E449: Invalid expression received"
-#~ msgstr "E449: ็„กๅŠนใชๅผใ‚’ๅ—ใ‘ๅ–ใ‚Šใพใ—ใŸ"
+#, c-format
+msgid "expected int() or something supporting coercing to int(), but got %s"
+msgstr "int() ใ‹ใใ‚Œใธๅค‰ๆ›ๅฏ่ƒฝใชใ‚‚ใฎใŒๆœŸๅพ…ใ•ใ‚Œใฆใ„ใ‚‹ใฎใซ %s ใงใ—ใŸ"
-#~ msgid "E463: Region is guarded, cannot modify"
-#~ msgstr "E463: ้ ˜ๅŸŸใŒไฟ่ญทใ•ใ‚Œใฆใ„ใ‚‹ใฎใง, ๅค‰ๆ›ดใงใใพใ›ใ‚“"
+msgid "value is too large to fit into C int type"
+msgstr "C่จ€่ชžใฎ int ๅž‹ใจใ—ใฆใฏๅ€คใŒๅคงใ้ŽใŽใพใ™"
-#~ msgid "E744: NetBeans does not allow changes in read-only files"
-#~ msgstr "E744: NetBeans ใฏ่ชญ่พผๅฐ‚็”จใƒ•ใ‚กใ‚คใƒซใ‚’ๅค‰ๆ›ดใ™ใ‚‹ใ“ใจใ‚’่จฑใ—ใพใ›ใ‚“"
+msgid "value is too small to fit into C int type"
+msgstr "C่จ€่ชžใฎ int ๅž‹ใจใ—ใฆใฏๅ€คใŒๅฐใ•้ŽใŽใพใ™"
-#~ msgid "Need encryption key for \"%s\""
-#~ msgstr "ๆš—ๅทใ‚ญใƒผใŒๅฟ…่ฆใงใ™: \"%s\""
+msgid "number must be greater than zero"
+msgstr "ๆ•ฐๅ€คใฏ 0 ใ‚ˆใ‚Šๅคงใใใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“"
-#~ msgid "empty keys are not allowed"
-#~ msgstr "็ฉบใฎใ‚ญใƒผใฏ่จฑๅฏใ•ใ‚Œใฆใ„ใพใ›ใ‚“"
+msgid "number must be greater or equal to zero"
+msgstr "ๆ•ฐๅ€คใฏ 0 ใ‹ใใ‚ŒไปฅไธŠใงใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“"
-#~ msgid "dictionary is locked"
-#~ msgstr "่พžๆ›ธใฏใƒญใƒƒใ‚ฏใ•ใ‚Œใฆใ„ใพใ™"
+msgid "can't delete OutputObject attributes"
+msgstr "OutputObjectๅฑžๆ€งใ‚’ๆถˆใ›ใพใ›ใ‚“"
-#~ msgid "list is locked"
-#~ msgstr "ใƒชใ‚นใƒˆใฏใƒญใƒƒใ‚ฏใ•ใ‚Œใฆใ„ใพใ™"
+#, c-format
+msgid "invalid attribute: %s"
+msgstr "็„กๅŠนใชๅฑžๆ€งใงใ™: %s"
-#~ msgid "failed to add key '%s' to dictionary"
-#~ msgstr "่พžๆ›ธใซใ‚ญใƒผ '%s' ใ‚’่ฟฝๅŠ ใ™ใ‚‹ใฎใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+msgid "E264: Python: Error initialising I/O objects"
+msgstr "E264: Python: I/Oใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใฎๅˆๆœŸๅŒ–ใ‚จใƒฉใƒผ"
-#~ msgid "index must be int or slice, not %s"
-#~ msgstr "ใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใฏ %s ใงใฏใชใๆ•ดๆ•ฐใ‹ใ‚นใƒฉใ‚คใ‚นใซใ—ใฆใใ ใ•ใ„"
+msgid "failed to change directory"
+msgstr "่พžๆ›ธใฎๅค‰ๆ›ดใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-#~ msgid "expected str() or unicode() instance, but got %s"
-#~ msgstr ""
-#~ "str() ใ‚‚ใ—ใใฏ unicode() ใฎใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใŒๆœŸๅพ…ใ•ใ‚Œใฆใ„ใ‚‹ใฎใซ %s ใงใ—ใŸ"
+#, c-format
+msgid "expected 3-tuple as imp.find_module() result, but got %s"
+msgstr "imp.find_module() ใŒ %s ใ‚’่ฟ”ใ—ใพใ—ใŸ (ๆœŸๅพ…ๅ€ค: 3 ่ฆ็ด ใฎใ‚ฟใƒ—ใƒซ)"
-#~ msgid "expected bytes() or str() instance, but got %s"
-#~ msgstr "bytes() ใ‚‚ใ—ใใฏ str() ใฎใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใŒๆœŸๅพ…ใ•ใ‚Œใฆใ„ใ‚‹ใฎใซ %s ใงใ—ใŸ"
+#, c-format
+msgid "expected 3-tuple as imp.find_module() result, but got tuple of size %d"
+msgstr "imp.find_module() ใŒ %d ่ฆ็ด ใฎใ‚ฟใƒ—ใƒซใ‚’่ฟ”ใ—ใพใ—ใŸ (ๆœŸๅพ…ๅ€ค: 3)"
-#~ msgid ""
-#~ "expected int(), long() or something supporting coercing to long(), but "
-#~ "got %s"
-#~ msgstr "long() ใ‹ใใ‚Œใธๅค‰ๆ›ๅฏ่ƒฝใชใ‚‚ใฎใŒๆœŸๅพ…ใ•ใ‚Œใฆใ„ใ‚‹ใฎใซ %s ใงใ—ใŸ"
+msgid "internal error: imp.find_module returned tuple with NULL"
+msgstr "ๅ†…้ƒจใ‚จใƒฉใƒผ: imp.find_module ใŒ NULL ใ‚’ๅซใ‚€ใ‚ฟใƒ—ใƒซใ‚’่ฟ”ใ—ใพใ—ใŸ"
-#~ msgid "expected int() or something supporting coercing to int(), but got %s"
-#~ msgstr "int() ใ‹ใใ‚Œใธๅค‰ๆ›ๅฏ่ƒฝใชใ‚‚ใฎใŒๆœŸๅพ…ใ•ใ‚Œใฆใ„ใ‚‹ใฎใซ %s ใงใ—ใŸ"
+msgid "cannot delete vim.Dictionary attributes"
+msgstr "vim.Dictionaryๅฑžๆ€งใฏๆถˆใ›ใพใ›ใ‚“"
-#~ msgid "value is too large to fit into C int type"
-#~ msgstr "C่จ€่ชžใฎ int ๅž‹ใจใ—ใฆใฏๅ€คใŒๅคงใ้ŽใŽใพใ™"
+msgid "cannot modify fixed dictionary"
+msgstr "ๅ›บๅฎšใ•ใ‚ŒใŸ่พžๆ›ธใฏๅค‰ๆ›ดใงใใพใ›ใ‚“"
-#~ msgid "value is too small to fit into C int type"
-#~ msgstr "C่จ€่ชžใฎ int ๅž‹ใจใ—ใฆใฏๅ€คใŒๅฐใ•้ŽใŽใพใ™"
+#, c-format
+msgid "cannot set attribute %s"
+msgstr "ๅฑžๆ€ง %s ใฏ่จญๅฎšใงใใพใ›ใ‚“"
-#~ msgid "number must be greater then zero"
-#~ msgstr "ๆ•ฐๅ€คใฏ 0 ใ‚ˆใ‚Šๅคงใใใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“"
+msgid "hashtab changed during iteration"
+msgstr "ใ‚คใƒ†ใƒฌใƒผใ‚ทใƒงใƒณไธญใซ hashtab ใŒๅค‰ๆ›ดใ•ใ‚Œใพใ—ใŸ"
-#~ msgid "number must be greater or equal to zero"
-#~ msgstr "ๆ•ฐๅ€คใฏ 0 ใ‹ใใ‚ŒไปฅไธŠใงใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“"
+#, c-format
+msgid "expected sequence element of size 2, but got sequence of size %d"
+msgstr "ใ‚ทใƒผใ‚ฑใƒณใ‚นใฎ่ฆ็ด ๆ•ฐใซใฏ 2 ใŒๆœŸๅพ…ใ•ใ‚Œใฆใ„ใพใ—ใŸใŒ %d ใงใ—ใŸ"
-#~ msgid "can't delete OutputObject attributes"
-#~ msgstr "OutputObjectๅฑžๆ€งใ‚’ๆถˆใ›ใพใ›ใ‚“"
+msgid "list constructor does not accept keyword arguments"
+msgstr "ใƒชใ‚นใƒˆใฎใ‚ณใƒณใ‚นใƒˆใƒฉใ‚ฏใ‚ฟใฏใ‚ญใƒผใƒฏใƒผใƒ‰ๅผ•ๆ•ฐใ‚’ๅ—ใ‘ไป˜ใ‘ใพใ›ใ‚“"
-#~ msgid "invalid attribute: %s"
-#~ msgstr "็„กๅŠนใชๅฑžๆ€งใงใ™: %s"
+msgid "list index out of range"
+msgstr "ใƒชใ‚นใƒˆ็ฏ„ๅ›ฒๅค–ใฎใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใงใ™"
-#~ msgid "E264: Python: Error initialising I/O objects"
-#~ msgstr "E264: Python: I/Oใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใฎๅˆๆœŸๅŒ–ใ‚จใƒฉใƒผ"
+#, c-format
+msgid "internal error: failed to get vim list item %d"
+msgstr "ๅ†…้ƒจใ‚จใƒฉใƒผ: vimใฎใƒชใ‚นใƒˆ่ฆ็ด  %d ใฎๅ–ๅพ—ใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-#~ msgid "failed to change directory"
-#~ msgstr "่พžๆ›ธใฎๅค‰ๆ›ดใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+msgid "slice step cannot be zero"
+msgstr "ใ‚นใƒฉใ‚คใ‚นใฎใ‚นใƒ†ใƒƒใƒ—ใซ 0 ใฏๆŒ‡ๅฎšใงใใพใ›ใ‚“"
-#~ msgid "expected 3-tuple as imp.find_module() result, but got %s"
-#~ msgstr "imp.find_module() ใŒ %s ใ‚’่ฟ”ใ—ใพใ—ใŸ (ๆœŸๅพ…ๅ€ค: 2 ่ฆ็ด ใฎใ‚ฟใƒ—ใƒซ)"
+#, c-format
+msgid "attempt to assign sequence of size greater than %d to extended slice"
+msgstr "้•ทใ• %d ใฎๆ‹กๅผตใ‚นใƒฉใ‚คใ‚นใซใ€ใ‚ˆใ‚Š้•ทใ„ใ‚นใƒฉใ‚คใ‚นใ‚’ๅ‰ฒใ‚Šๅฝ“ใฆใ‚ˆใ†ใจใ—ใพใ—ใŸ"
-#~ msgid ""
-#~ "expected 3-tuple as imp.find_module() result, but got tuple of size %d"
-#~ msgstr "impl.find_module() ใŒ %d ่ฆ็ด ใฎใ‚ฟใƒ—ใƒซใ‚’่ฟ”ใ—ใพใ—ใŸ (ๆœŸๅพ…ๅ€ค: 2)"
+#, c-format
+msgid "internal error: no vim list item %d"
+msgstr "ๅ†…้ƒจใ‚จใƒฉใƒผ: vimใฎใƒชใ‚นใƒˆ่ฆ็ด  %d ใฏใ‚ใ‚Šใพใ›ใ‚“"
-#~ msgid "internal error: imp.find_module returned tuple with NULL"
-#~ msgstr "ๅ†…้ƒจใ‚จใƒฉใƒผ: imp.find_module ใŒ NULL ใ‚’ๅซใ‚€ใ‚ฟใƒ—ใƒซใ‚’่ฟ”ใ—ใพใ—ใŸ"
+msgid "internal error: not enough list items"
+msgstr "ๅ†…้ƒจใ‚จใƒฉใƒผ: ใƒชใ‚นใƒˆใซๅๅˆ†ใช่ฆ็ด ใŒใ‚ใ‚Šใพใ›ใ‚“"
-#~ msgid "cannot delete vim.Dictionary attributes"
-#~ msgstr "vim.Dictionaryๅฑžๆ€งใฏๆถˆใ›ใพใ›ใ‚“"
+msgid "internal error: failed to add item to list"
+msgstr "ๅ†…้ƒจใ‚จใƒฉใƒผ: ใƒชใ‚นใƒˆใธใฎ่ฆ็ด ่ฟฝๅŠ ใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-#~ msgid "cannot modify fixed dictionary"
-#~ msgstr "ๅ›บๅฎšใ•ใ‚ŒใŸ่พžๆ›ธใฏๅค‰ๆ›ดใงใใพใ›ใ‚“"
+#, c-format
+msgid "attempt to assign sequence of size %d to extended slice of size %d"
+msgstr "้•ทใ• %d ใฎใ‚นใƒฉใ‚คใ‚นใ‚’ %d ใฎๆ‹กๅผตใ‚นใƒฉใ‚คใ‚นใซๅ‰ฒใ‚Šๅฝ“ใฆใ‚ˆใ†ใจใ—ใพใ—ใŸ"
-#~ msgid "cannot set attribute %s"
-#~ msgstr "ๅฑžๆ€ง %s ใฏ่จญๅฎšใงใใพใ›ใ‚“"
+msgid "failed to add item to list"
+msgstr "ใƒชใ‚นใƒˆใธใฎ่ฆ็ด ่ฟฝๅŠ ใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-#~ msgid "hashtab changed during iteration"
-#~ msgstr "ใ‚คใƒ†ใƒฌใƒผใ‚ทใƒงใƒณไธญใซ hashtab ใŒๅค‰ๆ›ดใ•ใ‚Œใพใ—ใŸ"
+msgid "cannot delete vim.List attributes"
+msgstr "vim.List ๅฑžๆ€งใฏๆถˆใ›ใพใ›ใ‚“"
-#~ msgid "expected sequence element of size 2, but got sequence of size %d"
-#~ msgstr "ใ‚ทใƒผใ‚ฑใƒณใ‚นใฎ่ฆ็ด ๆ•ฐใซใฏ 2 ใŒๆœŸๅพ…ใ•ใ‚Œใฆใ„ใพใ—ใŸใŒ %d ใงใ—ใŸ"
+msgid "cannot modify fixed list"
+msgstr "ๅ›บๅฎšใ•ใ‚ŒใŸใƒชใ‚นใƒˆใฏๅค‰ๆ›ดใงใใพใ›ใ‚“"
-#~ msgid "list constructor does not accept keyword arguments"
-#~ msgstr "ใƒชใ‚นใƒˆใฎใ‚ณใƒณใ‚นใƒˆใƒฉใ‚ฏใ‚ฟใฏใ‚ญใƒผใƒฏใƒผใƒ‰ๅผ•ๆ•ฐใ‚’ๅ—ใ‘ไป˜ใ‘ใพใ›ใ‚“"
+#, c-format
+msgid "unnamed function %s does not exist"
+msgstr "็„กๅ้–ขๆ•ฐ %s ใฏๅญ˜ๅœจใ—ใพใ›ใ‚“"
-#~ msgid "list index out of range"
-#~ msgstr "ใƒชใ‚นใƒˆ็ฏ„ๅ›ฒๅค–ใฎใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใงใ™"
+#, c-format
+msgid "function %s does not exist"
+msgstr "้–ขๆ•ฐ %s ใŒใ‚ใ‚Šใพใ›ใ‚“"
-#~ msgid "internal error: failed to get vim list item %d"
-#~ msgstr "ๅ†…้ƒจใ‚จใƒฉใƒผ: vimใฎใƒชใ‚นใƒˆ่ฆ็ด  %d ใฎๅ–ๅพ—ใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+#, c-format
+msgid "failed to run function %s"
+msgstr "้–ขๆ•ฐ %s ใฎๅฎŸ่กŒใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-#~ msgid "failed to add item to list"
-#~ msgstr "ใƒชใ‚นใƒˆใธใฎ่ฆ็ด ่ฟฝๅŠ ใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+msgid "unable to get option value"
+msgstr "ใ‚ชใƒ—ใ‚ทใƒงใƒณใฎๅ€คใฏๅ–ๅพ—ใงใใพใ›ใ‚“"
-#~ msgid "internal error: no vim list item %d"
-#~ msgstr "ๅ†…้ƒจใ‚จใƒฉใƒผ: vimใฎใƒชใ‚นใƒˆ่ฆ็ด  %d ใฏใ‚ใ‚Šใพใ›ใ‚“"
+msgid "internal error: unknown option type"
+msgstr "ๅ†…้ƒจใ‚จใƒฉใƒผ: ๆœช็Ÿฅใฎใ‚ชใƒ—ใ‚ทใƒงใƒณๅž‹ใงใ™"
-#~ msgid "internal error: failed to add item to list"
-#~ msgstr "ๅ†…้ƒจใ‚จใƒฉใƒผ: ใƒชใ‚นใƒˆใธใฎ่ฆ็ด ่ฟฝๅŠ ใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+msgid "problem while switching windows"
+msgstr "ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚’ๅˆ‡ๆ›ไธญใซๅ•้กŒใŒ็™บ็”Ÿใ—ใพใ—ใŸ"
-#~ msgid "cannot delete vim.List attributes"
-#~ msgstr "vim.List ๅฑžๆ€งใฏๆถˆใ›ใพใ›ใ‚“"
+#, c-format
+msgid "unable to unset global option %s"
+msgstr "ใ‚ฐใƒญใƒผใƒใƒซใ‚ชใƒ—ใ‚ทใƒงใƒณ %s ใฎ่จญๅฎš่งฃ้™คใฏใงใใพใ›ใ‚“"
-#~ msgid "cannot modify fixed list"
-#~ msgstr "ๅ›บๅฎšใ•ใ‚ŒใŸใƒชใ‚นใƒˆใฏๅค‰ๆ›ดใงใใพใ›ใ‚“"
+#, c-format
+msgid "unable to unset option %s which does not have global value"
+msgstr "ใ‚ฐใƒญใƒผใƒใƒซใชๅ€คใฎ็„กใ„ใ‚ชใƒ—ใ‚ทใƒงใƒณ %s ใฎ่จญๅฎš่งฃ้™คใฏใงใใพใ›ใ‚“"
-#~ msgid "unnamed function %s does not exist"
-#~ msgstr "็„กๅ้–ขๆ•ฐ %s ใฏๅญ˜ๅœจใ—ใพใ›ใ‚“"
+msgid "attempt to refer to deleted tab page"
+msgstr "ๅ‰Š้™คใ•ใ‚ŒใŸใ‚ฟใƒ–ใ‚’ๅ‚็…งใ—ใ‚ˆใ†ใจใ—ใพใ—ใŸ"
-#~ msgid "function %s does not exist"
-#~ msgstr "้–ขๆ•ฐ %s ใŒใ‚ใ‚Šใพใ›ใ‚“"
+msgid "no such tab page"
+msgstr "ใใฎใ‚ˆใ†ใชใ‚ฟใƒ–ใƒšใƒผใ‚ธใฏใ‚ใ‚Šใพใ›ใ‚“"
-#~ msgid "function constructor does not accept keyword arguments"
-#~ msgstr "้–ขๆ•ฐใฎใ‚ณใƒณใ‚นใƒˆใƒฉใ‚ฏใ‚ฟใฏใ‚ญใƒผใƒฏใƒผใƒ‰ๅผ•ๆ•ฐใ‚’ๅ—ใ‘ไป˜ใ‘ใพใ›ใ‚“"
+msgid "attempt to refer to deleted window"
+msgstr "ๅ‰Š้™คใ•ใ‚ŒใŸใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚’ๅ‚็…งใ—ใ‚ˆใ†ใจใ—ใพใ—ใŸ"
-#~ msgid "failed to run function %s"
-#~ msgstr "้–ขๆ•ฐ %s ใฎๅฎŸ่กŒใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+msgid "readonly attribute: buffer"
+msgstr "่ชญ่พผๅฐ‚็”จๅฑžๆ€ง: ใƒใƒƒใƒ•ใ‚กใƒผ"
-#~ msgid "problem while switching windows"
-#~ msgstr "ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚’ๅˆ‡ๆ›ไธญใซๅ•้กŒใŒ็™บ็”Ÿใ—ใพใ—ใŸ"
+msgid "cursor position outside buffer"
+msgstr "ใ‚ซใƒผใ‚ฝใƒซไฝ็ฝฎใŒใƒใƒƒใƒ•ใ‚กใฎๅค–ๅดใงใ™"
-#~ msgid "unable to unset global option %s"
-#~ msgstr "ใ‚ฐใƒญใƒผใƒใƒซใ‚ชใƒ—ใ‚ทใƒงใƒณ %s ใฎ่จญๅฎš่งฃ้™คใฏใงใใพใ›ใ‚“"
+msgid "no such window"
+msgstr "ใใฎใ‚ˆใ†ใชใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฏใ‚ใ‚Šใพใ›ใ‚“"
-#~ msgid "unable to unset option %s which does not have global value"
-#~ msgstr "ใ‚ฐใƒญใƒผใƒใƒซใชๅ€คใฎ็„กใ„ใ‚ชใƒ—ใ‚ทใƒงใƒณ %s ใฎ่จญๅฎš่งฃ้™คใฏใงใใพใ›ใ‚“"
+msgid "attempt to refer to deleted buffer"
+msgstr "ๅ‰Š้™คใ•ใ‚ŒใŸใƒใƒƒใƒ•ใ‚กใ‚’ๅ‚็…งใ—ใ‚ˆใ†ใจใ—ใพใ—ใŸ"
-#~ msgid "attempt to refer to deleted tab page"
-#~ msgstr "ๅ‰Š้™คใ•ใ‚ŒใŸใ‚ฟใƒ–ใ‚’ๅ‚็…งใ—ใ‚ˆใ†ใจใ—ใพใ—ใŸ"
+msgid "failed to rename buffer"
+msgstr "ใƒใƒƒใƒ•ใ‚กๅใฎๅค‰ๆ›ดใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-#~ msgid "no such tab page"
-#~ msgstr "ใใฎใ‚ˆใ†ใชใ‚ฟใƒ–ใƒšใƒผใ‚ธใฏใ‚ใ‚Šใพใ›ใ‚“"
+msgid "mark name must be a single character"
+msgstr "ใƒžใƒผใ‚ฏๅใฏ1ๆ–‡ๅญ—ใฎใ‚ขใƒซใƒ•ใ‚กใƒ™ใƒƒใƒˆใงใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“"
-#~ msgid "attempt to refer to deleted window"
-#~ msgstr "ๅ‰Š้™คใ•ใ‚ŒใŸใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚’ๅ‚็…งใ—ใ‚ˆใ†ใจใ—ใพใ—ใŸ"
+#, c-format
+msgid "expected vim.Buffer object, but got %s"
+msgstr "vim.Bufferใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใŒๆœŸๅพ…ใ•ใ‚Œใฆใ„ใ‚‹ใฎใซ %s ใงใ—ใŸ"
-#~ msgid "readonly attribute: buffer"
-#~ msgstr "่ชญ่พผๅฐ‚็”จๅฑžๆ€ง: ใƒใƒƒใƒ•ใ‚กใƒผ"
+#, c-format
+msgid "failed to switch to buffer %d"
+msgstr "ๆŒ‡ๅฎšใ•ใ‚ŒใŸใƒใƒƒใƒ•ใ‚ก %d ใธใฎๅˆ‡ใ‚Šๆ›ฟใˆใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-#~ msgid "cursor position outside buffer"
-#~ msgstr "ใ‚ซใƒผใ‚ฝใƒซไฝ็ฝฎใŒใƒใƒƒใƒ•ใ‚กใฎๅค–ๅดใงใ™"
+#, c-format
+msgid "expected vim.Window object, but got %s"
+msgstr "vim.Windowใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใŒๆœŸๅพ…ใ•ใ‚Œใฆใ„ใ‚‹ใฎใซ %s ใงใ—ใŸ"
-#~ msgid "no such window"
-#~ msgstr "ใใฎใ‚ˆใ†ใชใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฏใ‚ใ‚Šใพใ›ใ‚“"
+msgid "failed to find window in the current tab page"
+msgstr "็พๅœจใฎใ‚ฟใƒ–ใซใฏๆŒ‡ๅฎšใ•ใ‚ŒใŸใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใŒใ‚ใ‚Šใพใ›ใ‚“ใงใ—ใŸ"
-#~ msgid "attempt to refer to deleted buffer"
-#~ msgstr "ๅ‰Š้™คใ•ใ‚ŒใŸใƒใƒƒใƒ•ใ‚กใ‚’ๅ‚็…งใ—ใ‚ˆใ†ใจใ—ใพใ—ใŸ"
+msgid "did not switch to the specified window"
+msgstr "ๆŒ‡ๅฎšใ•ใ‚ŒใŸใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใซๅˆ‡ใ‚Šๆ›ฟใˆใพใ›ใ‚“ใงใ—ใŸ"
-#~ msgid "failed to rename buffer"
-#~ msgstr "ใƒใƒƒใƒ•ใ‚กๅใฎๅค‰ๆ›ดใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+#, c-format
+msgid "expected vim.TabPage object, but got %s"
+msgstr "vim.TabPageใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใŒๆœŸๅพ…ใ•ใ‚Œใฆใ„ใ‚‹ใฎใซ %s ใงใ—ใŸ"
-#~ msgid "mark name must be a single character"
-#~ msgstr "ใƒžใƒผใ‚ฏๅใฏ1ๆ–‡ๅญ—ใฎใ‚ขใƒซใƒ•ใ‚กใƒ™ใƒƒใƒˆใงใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“"
+msgid "did not switch to the specified tab page"
+msgstr "ๆŒ‡ๅฎšใ•ใ‚ŒใŸใ‚ฟใƒ–ใƒšใƒผใ‚ธใซๅˆ‡ใ‚Šๆ›ฟใˆใพใ›ใ‚“ใงใ—ใŸ"
-#~ msgid "expected vim.Buffer object, but got %s"
-#~ msgstr "vim.Bufferใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใŒๆœŸๅพ…ใ•ใ‚Œใฆใ„ใ‚‹ใฎใซ %s ใงใ—ใŸ"
+msgid "failed to run the code"
+msgstr "ใ‚ณใƒผใƒ‰ใฎๅฎŸ่กŒใซๅคฑๆ•—ใ—ใพใ—ใŸ"
-#~ msgid "failed to switch to buffer %d"
-#~ msgstr "ๆŒ‡ๅฎšใ•ใ‚ŒใŸใƒใƒƒใƒ•ใ‚ก %d ใธใฎๅˆ‡ใ‚Šๆ›ฟใˆใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+msgid "E858: Eval did not return a valid python object"
+msgstr "E858: ๅผ่ฉ•ไพกใฏๆœ‰ๅŠนใชpythonใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ‚’่ฟ”ใ—ใพใ›ใ‚“ใงใ—ใŸ"
-#~ msgid "expected vim.Window object, but got %s"
-#~ msgstr "vim.Windowใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใŒๆœŸๅพ…ใ•ใ‚Œใฆใ„ใ‚‹ใฎใซ %s ใงใ—ใŸ"
+msgid "E859: Failed to convert returned python object to vim value"
+msgstr "E859: ่ฟ”ใ•ใ‚ŒใŸpythonใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ‚’vimใฎๅ€คใซๅค‰ๆ›ใงใใพใ›ใ‚“ใงใ—ใŸ"
-#~ msgid "failed to find window in the current tab page"
-#~ msgstr "็พๅœจใฎใ‚ฟใƒ–ใซใฏๆŒ‡ๅฎšใ•ใ‚ŒใŸใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใŒใ‚ใ‚Šใพใ›ใ‚“ใงใ—ใŸ"
+#, c-format
+msgid "unable to convert %s to vim dictionary"
+msgstr "%s vimใฎ่พžๆ›ธๅž‹ใซๅค‰ๆ›ใงใใพใ›ใ‚“"
-#~ msgid "did not switch to the specified window"
-#~ msgstr "ๆŒ‡ๅฎšใ•ใ‚ŒใŸใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใซๅˆ‡ใ‚Šๆ›ฟใˆใพใ›ใ‚“ใงใ—ใŸ"
+#, c-format
+msgid "unable to convert %s to vim list"
+msgstr "%s ใ‚’vimใฎใƒชใ‚นใƒˆใซๅค‰ๆ›ใงใใพใ›ใ‚“"
-#~ msgid "expected vim.TabPage object, but got %s"
-#~ msgstr "vim.TabPageใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใŒๆœŸๅพ…ใ•ใ‚Œใฆใ„ใ‚‹ใฎใซ %s ใงใ—ใŸ"
+#, c-format
+msgid "unable to convert %s to vim structure"
+msgstr "%s ใ‚’vimใฎๆง‹้€ ไฝ“ใซๅค‰ๆ›ใงใใพใ›ใ‚“"
-#~ msgid "did not switch to the specified tab page"
-#~ msgstr "ๆŒ‡ๅฎšใ•ใ‚ŒใŸใ‚ฟใƒ–ใƒšใƒผใ‚ธใซๅˆ‡ใ‚Šๆ›ฟใˆใพใ›ใ‚“ใงใ—ใŸ"
+msgid "internal error: NULL reference passed"
+msgstr "ๅ†…้ƒจใ‚จใƒฉใƒผ: NULLๅ‚็…งใŒๆธกใ•ใ‚Œใพใ—ใŸ"
-#~ msgid "failed to run the code"
-#~ msgstr "ใ‚ณใƒผใƒ‰ใฎๅฎŸ่กŒใซๅคฑๆ•—ใ—ใพใ—ใŸ"
+msgid "internal error: invalid value type"
+msgstr "ๅ†…้ƒจใ‚จใƒฉใƒผ: ็„กๅŠนใชๅ€คๅž‹ใงใ™"
-#~ msgid "E858: Eval did not return a valid python object"
-#~ msgstr "E858: ๅผ่ฉ•ไพกใฏๆœ‰ๅŠนใชpythonใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ‚’่ฟ”ใ—ใพใ›ใ‚“ใงใ—ใŸ"
+msgid ""
+"Failed to set path hook: sys.path_hooks is not a list\n"
+"You should now do the following:\n"
+"- append vim.path_hook to sys.path_hooks\n"
+"- append vim.VIM_SPECIAL_PATH to sys.path\n"
+msgstr ""
+"ใƒ‘ใ‚นใƒ•ใƒƒใ‚ฏใฎ่จญๅฎšใซๅคฑๆ•—ใ—ใพใ—ใŸ: sys.path_hooks ใŒใƒชใ‚นใƒˆใงใฏใ‚ใ‚Šใพใ›ใ‚“\n"
+"ใ™ใใซไธ‹่จ˜ใ‚’ๅฎŸๆ–ฝใ—ใฆใใ ใ•ใ„:\n"
+"- vim.path_hooks ใ‚’ sys.path_hooks ใธ่ฟฝๅŠ \n"
+"- vim.VIM_SPECIAL_PATH ใ‚’ sys.path ใธ่ฟฝๅŠ \n"
-#~ msgid "E859: Failed to convert returned python object to vim value"
-#~ msgstr "E859: ่ฟ”ใ•ใ‚ŒใŸpythonใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ‚’vimใฎๅ€คใซๅค‰ๆ›ใงใใพใ›ใ‚“ใงใ—ใŸ"
+msgid ""
+"Failed to set path: sys.path is not a list\n"
+"You should now append vim.VIM_SPECIAL_PATH to sys.path"
+msgstr ""
+"ใƒ‘ใ‚นใฎ่จญๅฎšใซๅคฑๆ•—ใ—ใพใ—ใŸ: sys.path ใŒใƒชใ‚นใƒˆใงใฏใ‚ใ‚Šใพใ›ใ‚“\n"
+"ใ™ใใซ vim.VIM_SPECIAL_PATH ใ‚’ sys.path ใซ่ฟฝๅŠ ใ—ใฆใใ ใ•ใ„"
-#~ msgid "unable to convert %s to vim dictionary"
-#~ msgstr "%s vimใฎ่พžๆ›ธๅž‹ใซๅค‰ๆ›ใงใใพใ›ใ‚“"
+msgid ""
+"Vim macro files (*.vim)\t*.vim\n"
+"All Files (*.*)\t*.*\n"
+msgstr ""
+"Vimใƒžใ‚ฏใƒญใƒ•ใ‚กใ‚คใƒซ (*.vim)\t*.vim\n"
+"ใ™ในใฆใฎใƒ•ใ‚กใ‚คใƒซ (*.*)\t*.*\n"
-#~ msgid "unable to convert %s to vim structure"
-#~ msgstr "%s ใ‚’vimใฎๆง‹้€ ไฝ“ใซๅค‰ๆ›ใงใใพใ›ใ‚“"
+msgid "All Files (*.*)\t*.*\n"
+msgstr "ใ™ในใฆใฎใƒ•ใ‚กใ‚คใƒซ (*.*)\t*.*\n"
-#~ msgid "internal error: NULL reference passed"
-#~ msgstr "ๅ†…้ƒจใ‚จใƒฉใƒผ: NULLๅ‚็…งใŒๆธกใ•ใ‚Œใพใ—ใŸ"
+msgid ""
+"All Files (*.*)\t*.*\n"
+"C source (*.c, *.h)\t*.c;*.h\n"
+"C++ source (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
+"VB code (*.bas, *.frm)\t*.bas;*.frm\n"
+"Vim files (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
+msgstr ""
+"ใ™ในใฆใฎใƒ•ใ‚กใ‚คใƒซ (*.*)\t*.*\n"
+"Cใ‚ฝใƒผใ‚น (*.c, *.h)\t*.c;*.h\n"
+"C++ใ‚ฝใƒผใ‚น (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
+"VBใ‚ณใƒผใƒ‰ (*.bas, *.frm)\t*.bas;*.frm\n"
+"Vimใƒ•ใ‚กใ‚คใƒซ (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
-#~ msgid "internal error: invalid value type"
-#~ msgstr "ๅ†…้ƒจใ‚จใƒฉใƒผ: ็„กๅŠนใชๅ€คๅž‹ใงใ™"
+msgid ""
+"Vim macro files (*.vim)\t*.vim\n"
+"All Files (*)\t*\n"
+msgstr ""
+"Vim ใƒžใ‚ฏใƒญใƒ•ใ‚กใ‚คใƒซ (*.vim)\t*.vim\n"
+"ใ™ในใฆใฎใƒ•ใ‚กใ‚คใƒซ (*)\t*\n"
-#~ msgid ""
-#~ "Failed to set path hook: sys.path_hooks is not a list\n"
-#~ "You should now do the following:\n"
-#~ "- append vim.path_hook to sys.path_hooks\n"
-#~ "- append vim.VIM_SPECIAL_PATH to sys.path\n"
-#~ msgstr ""
-#~ "ใƒ‘ใ‚นใƒ•ใƒƒใ‚ฏใฎ่จญๅฎšใซๅคฑๆ•—ใ—ใพใ—ใŸ: sys.path_hooks ใŒใƒชใ‚นใƒˆใงใฏใ‚ใ‚Šใพใ›ใ‚“\n"
-#~ "ใ™ใใซไธ‹่จ˜ใ‚’ๅฎŸๆ–ฝใ—ใฆใใ ใ•ใ„:\n"
-#~ "- vim.path_hooks ใ‚’ sys.path_hooks ใธ่ฟฝๅŠ \n"
-#~ "- vim.VIM_SPECIAL_PATH ใ‚’ sys.path ใธ่ฟฝๅŠ \n"
+msgid "All Files (*)\t*\n"
+msgstr "ใ™ในใฆใฎใƒ•ใ‚กใ‚คใƒซ (*)\t*\n"
-#~ msgid ""
-#~ "Failed to set path: sys.path is not a list\n"
-#~ "You should now append vim.VIM_SPECIAL_PATH to sys.path"
-#~ msgstr ""
-#~ "ใƒ‘ใ‚นใฎ่จญๅฎšใซๅคฑๆ•—ใ—ใพใ—ใŸ: sys.path ใŒใƒชใ‚นใƒˆใงใฏใ‚ใ‚Šใพใ›ใ‚“\n"
-#~ "ใ™ใใซ vim.VIM_SPECIAL_PATH ใ‚’ sys.path ใซ่ฟฝๅŠ ใ—ใฆใใ ใ•ใ„"
+msgid ""
+"All Files (*)\t*\n"
+"C source (*.c, *.h)\t*.c;*.h\n"
+"C++ source (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
+"Vim files (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
+msgstr ""
+"ใ™ในใฆใฎใƒ•ใ‚กใ‚คใƒซ (*)\t*\n"
+"Cใ‚ฝใƒผใ‚น (*.c, *.h)\t*.c;*.h\n"
+"C++ใ‚ฝใƒผใ‚น (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
+"Vimใƒ•ใ‚กใ‚คใƒซ (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
diff --git a/src/nvim/po/ja.sjis.po b/src/nvim/po/ja.sjis.po
deleted file mode 100644
index 16a5d2ce36..0000000000
--- a/src/nvim/po/ja.sjis.po
+++ /dev/null
@@ -1,8223 +0,0 @@
-# Japanese translation for Vim
-#
-# Do ":help uganda" in Vim to read copying and usage conditions.
-# Do ":help credits" in Vim to see a list of people who contributed.
-#
-# Copyright (C) 2001-2016 MURAOKA Taro <koron.kaoriya@gmail.com>,
-# vim-jp (http://vim-jp.org/)
-#
-# THIS FILE IS DISTRIBUTED UNDER THE VIM LICENSE.
-#
-# Original translations.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: Vim 7.4\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-02-01 09:02+0900\n"
-"PO-Revision-Date: 2016-02-01 09:08+0900\n"
-"Last-Translator: MURAOKA Taro <koron.kaoriya@gmail.com>\n"
-"Language-Team: vim-jpj (https://github.com/vim-jp/lang-ja)\n"
-"Language: Japanese\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=cp932\n"
-"Content-Transfer-Encoding: 8-bit\n"
-
-#: ../api/private/helpers.c:201
-#, fuzzy
-msgid "Unable to get option value"
-msgstr "ƒIƒvƒVƒ‡ƒ“‚ฬ’l‚อŽๆ“พ‚ล‚ซ‚‚น‚๑"
-
-#: ../api/private/helpers.c:204
-msgid "internal error: unknown option type"
-msgstr "“เ•”ƒGƒ‰[: –ข’m‚ฬƒIƒvƒVƒ‡ƒ“Œ^‚ล‚ท"
-
-#: ../buffer.c:92
-msgid "[Location List]"
-msgstr "[ƒƒP[ƒVƒ‡ƒ“ƒŠƒXƒg]"
-
-#: ../buffer.c:93
-msgid "[Quickfix List]"
-msgstr "[QuickfixƒŠƒXƒg]"
-
-#: ../buffer.c:94
-msgid "E855: Autocommands caused command to abort"
-msgstr "E855: autocommand‚ชƒRƒ}ƒ“ƒh‚ฬ’โŽ~‚๐ˆ๘‚ซ‹N‚ฑ‚ต‚‚ต‚ฝ"
-
-#: ../buffer.c:135
-msgid "E82: Cannot allocate any buffer, exiting..."
-msgstr "E82: ƒoƒbƒtƒ@‚๐1‚ย‚เ์ฌ‚ล‚ซ‚ศ‚ข‚ฬ‚ล, I—น‚ต‚‚ท..."
-
-#: ../buffer.c:138
-msgid "E83: Cannot allocate buffer, using other one..."
-msgstr "E83: ƒoƒbƒtƒ@‚๐์ฌ‚ล‚ซ‚ศ‚ข‚ฬ‚ล, ‘ผ‚ฬ‚๐Žg—p‚ต‚‚ท..."
-
-#: ../buffer.c:763
-msgid "E515: No buffers were unloaded"
-msgstr "E515: ‰๐•๚‚ณ‚๊‚ฝƒoƒbƒtƒ@‚อ‚ ‚่‚‚น‚๑"
-
-#: ../buffer.c:765
-msgid "E516: No buffers were deleted"
-msgstr "E516: ํœ‚ณ‚๊‚ฝƒoƒbƒtƒ@‚อ‚ ‚่‚‚น‚๑"
-
-#: ../buffer.c:767
-msgid "E517: No buffers were wiped out"
-msgstr "E517: ”jŠ‚ณ‚๊‚ฝƒoƒbƒtƒ@‚อ‚ ‚่‚‚น‚๑"
-
-#: ../buffer.c:772
-msgid "1 buffer unloaded"
-msgstr "1 Œย‚ฬƒoƒbƒtƒ@‚ช‰๐•๚‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../buffer.c:774
-#, c-format
-msgid "%d buffers unloaded"
-msgstr "%d Œย‚ฬƒoƒbƒtƒ@‚ช‰๐•๚‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../buffer.c:777
-msgid "1 buffer deleted"
-msgstr "1 Œย‚ฬƒoƒbƒtƒ@‚ชํœ‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../buffer.c:779
-#, c-format
-msgid "%d buffers deleted"
-msgstr "%d Œย‚ฬƒoƒbƒtƒ@‚ชํœ‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../buffer.c:782
-msgid "1 buffer wiped out"
-msgstr "1 Œย‚ฬƒoƒbƒtƒ@‚ช”jŠ‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../buffer.c:784
-#, c-format
-msgid "%d buffers wiped out"
-msgstr "%d Œย‚ฬƒoƒbƒtƒ@‚ช”jŠ‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../buffer.c:806
-msgid "E90: Cannot unload last buffer"
-msgstr "E90: ลŒใ‚ฬƒoƒbƒtƒ@‚อ‰๐•๚‚ล‚ซ‚‚น‚๑"
-
-#: ../buffer.c:874
-msgid "E84: No modified buffer found"
-msgstr "E84: •ฯX‚ณ‚๊‚ฝƒoƒbƒtƒ@‚อ‚ ‚่‚‚น‚๑"
-
-#. back where we started, didn't find anything.
-#: ../buffer.c:903
-msgid "E85: There is no listed buffer"
-msgstr "E85: ƒŠƒXƒg•\\Žฆ‚ณ‚๊‚้ƒoƒbƒtƒ@‚อ‚ ‚่‚‚น‚๑"
-
-#: ../buffer.c:913
-#, c-format
-msgid "E86: Buffer %<PRId64> does not exist"
-msgstr "E86: ƒoƒbƒtƒ@ %<PRId64> ‚อ‚ ‚่‚‚น‚๑"
-
-#: ../buffer.c:915
-msgid "E87: Cannot go beyond last buffer"
-msgstr "E87: ลŒใ‚ฬƒoƒbƒtƒ@‚๐‰z‚ฆ‚ฤˆฺ“ฎ‚อ‚ล‚ซ‚‚น‚๑"
-
-#: ../buffer.c:917
-msgid "E88: Cannot go before first buffer"
-msgstr "E88: ล‰‚ฬƒoƒbƒtƒ@‚ๆ‚่‘O‚ึ‚อˆฺ“ฎ‚ล‚ซ‚‚น‚๑"
-
-#: ../buffer.c:945
-#, c-format
-msgid ""
-"E89: No write since last change for buffer %<PRId64> (add ! to override)"
-msgstr "E89: ƒoƒbƒtƒ@ %<PRId64> ‚ฬ•ฯX‚อ•‘ถ‚ณ‚๊‚ฤ‚ข‚‚น‚๑ (! ‚ล•ฯX‚๐”jŠ)"
-
-#. wrap around (may cause duplicates)
-#: ../buffer.c:1423
-msgid "W14: Warning: List of file names overflow"
-msgstr "W14: Œx: ƒtƒ@ƒCƒ‹–ผ‚ฬƒŠƒXƒg‚ช’ท‰฿‚ฌ‚‚ท"
-
-#: ../buffer.c:1555 ../quickfix.c:3361
-#, c-format
-msgid "E92: Buffer %<PRId64> not found"
-msgstr "E92: ƒoƒbƒtƒ@ %<PRId64> ‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#: ../buffer.c:1798
-#, c-format
-msgid "E93: More than one match for %s"
-msgstr "E93: %s ‚ษ•ก”‚ฬŠY“–‚ช‚ ‚่‚‚ต‚ฝ"
-
-#: ../buffer.c:1800
-#, c-format
-msgid "E94: No matching buffer for %s"
-msgstr "E94: %s ‚ษŠY“–‚ท‚้ƒoƒbƒtƒ@‚อ‚ ‚่‚‚น‚๑‚ล‚ต‚ฝ"
-
-#: ../buffer.c:2161
-#, c-format
-msgid "line %<PRId64>"
-msgstr "s %<PRId64>"
-
-#: ../buffer.c:2233
-msgid "E95: Buffer with this name already exists"
-msgstr "E95: ‚ฑ‚ฬ–ผ‘O‚ฬƒoƒbƒtƒ@‚อŠ๙‚ษ‚ ‚่‚‚ท"
-
-#: ../buffer.c:2498
-msgid " [Modified]"
-msgstr " [•ฯX‚ ‚่]"
-
-#: ../buffer.c:2501
-msgid "[Not edited]"
-msgstr "[–ข•าW]"
-
-#: ../buffer.c:2504
-msgid "[New file]"
-msgstr "[Vƒtƒ@ƒCƒ‹]"
-
-#: ../buffer.c:2505
-msgid "[Read errors]"
-msgstr "[“วžƒGƒ‰[]"
-
-#: ../buffer.c:2506 ../buffer.c:3217 ../fileio.c:1807 ../screen.c:4895
-msgid "[RO]"
-msgstr "[“ว๊]"
-
-#: ../buffer.c:2507 ../fileio.c:1807
-msgid "[readonly]"
-msgstr "[“วž๊—p]"
-
-#: ../buffer.c:2524
-#, c-format
-msgid "1 line --%d%%--"
-msgstr "1 s --%d%%--"
-
-#: ../buffer.c:2526
-#, c-format
-msgid "%<PRId64> lines --%d%%--"
-msgstr "%<PRId64> s --%d%%--"
-
-#: ../buffer.c:2530
-#, c-format
-msgid "line %<PRId64> of %<PRId64> --%d%%-- col "
-msgstr "s %<PRId64> (‘S‘ฬ %<PRId64>) --%d%%-- col "
-
-#: ../buffer.c:2632 ../buffer.c:4292 ../memline.c:1554
-msgid "[No Name]"
-msgstr "[–ณ–ผ]"
-
-#. must be a help buffer
-#: ../buffer.c:2667
-msgid "help"
-msgstr "ƒwƒ‹ƒv"
-
-#: ../buffer.c:3225 ../screen.c:4883
-msgid "[Help]"
-msgstr "[ƒwƒ‹ƒv]"
-
-#: ../buffer.c:3254 ../screen.c:4887
-msgid "[Preview]"
-msgstr "[ƒvƒŒƒrƒ…[]"
-
-#: ../buffer.c:3528
-msgid "All"
-msgstr "‘S‚ฤ"
-
-#: ../buffer.c:3528
-msgid "Bot"
-msgstr "––”๖"
-
-#: ../buffer.c:3531
-msgid "Top"
-msgstr "ๆ“ช"
-
-#: ../buffer.c:4244
-msgid ""
-"\n"
-"# Buffer list:\n"
-msgstr ""
-"\n"
-"# ƒoƒbƒtƒ@ƒŠƒXƒg:\n"
-
-#: ../buffer.c:4289
-msgid "[Scratch]"
-msgstr "[‰บ‘‚ซ]"
-
-#: ../buffer.c:4529
-msgid ""
-"\n"
-"--- Signs ---"
-msgstr ""
-"\n"
-"--- ƒTƒCƒ“ ---"
-
-#: ../buffer.c:4538
-#, c-format
-msgid "Signs for %s:"
-msgstr "%s ‚ฬƒTƒCƒ“:"
-
-#: ../buffer.c:4543
-#, c-format
-msgid " line=%<PRId64> id=%d name=%s"
-msgstr " s=%<PRId64> Žฏ•สŽq=%d –ผ‘O=%s"
-
-#: ../cursor_shape.c:68
-msgid "E545: Missing colon"
-msgstr "E545: ƒRƒƒ“‚ช‚ ‚่‚‚น‚๑"
-
-#: ../cursor_shape.c:70 ../cursor_shape.c:94
-msgid "E546: Illegal mode"
-msgstr "E546: •sณ‚ศƒ‚[ƒh‚ล‚ท"
-
-#: ../cursor_shape.c:134
-msgid "E548: digit expected"
-msgstr "E548: ”’l‚ช•K—v‚ล‚ท"
-
-#: ../cursor_shape.c:138
-msgid "E549: Illegal percentage"
-msgstr "E549: •sณ‚ศƒp[ƒZƒ“ƒe[ƒW‚ล‚ท"
-
-#: ../diff.c:146
-#, c-format
-msgid "E96: Can not diff more than %<PRId64> buffers"
-msgstr "E96: %<PRId64> ˆศใ‚ฬƒoƒbƒtƒ@‚อdiff‚ล‚ซ‚‚น‚๑"
-
-#: ../diff.c:753
-msgid "E810: Cannot read or write temp files"
-msgstr "E810: ˆ๊Žžƒtƒ@ƒCƒ‹‚ฬ“วž‚เ‚ต‚ญ‚อ‘ž‚ช‚ล‚ซ‚‚น‚๑"
-
-#: ../diff.c:755
-msgid "E97: Cannot create diffs"
-msgstr "E97: ท•ช‚๐์ฌ‚ล‚ซ‚‚น‚๑"
-
-#: ../diff.c:966
-msgid "E816: Cannot read patch output"
-msgstr "E816: patch‚ฬo—อ‚๐“วž‚฿‚‚น‚๑"
-
-#: ../diff.c:1220
-msgid "E98: Cannot read diff output"
-msgstr "E98: diff‚ฬo—อ‚๐“วž‚฿‚‚น‚๑"
-
-#: ../diff.c:2081
-msgid "E99: Current buffer is not in diff mode"
-msgstr "E99: Œป‚ฬƒoƒbƒtƒ@‚อท•ชƒ‚[ƒh‚ล‚อ‚ ‚่‚‚น‚๑"
-
-#: ../diff.c:2100
-msgid "E793: No other buffer in diff mode is modifiable"
-msgstr "E793: ท•ชƒ‚[ƒh‚ล‚ ‚้‘ผ‚ฬƒoƒbƒtƒ@‚อ•ฯX‚ล‚ซ‚‚น‚๑"
-
-#: ../diff.c:2102
-msgid "E100: No other buffer in diff mode"
-msgstr "E100: ท•ชƒ‚[ƒh‚ล‚ ‚้‘ผ‚ฬƒoƒbƒtƒ@‚อ‚ ‚่‚‚น‚๑"
-
-#: ../diff.c:2112
-msgid "E101: More than two buffers in diff mode, don't know which one to use"
-msgstr ""
-"E101: ท•ชƒ‚[ƒh‚ฬƒoƒbƒtƒ@‚ช2Œยˆศใ‚ ‚้‚ฬ‚ลA‚ว‚๊‚๐Žg‚ค‚ฉ“ม’่‚ล‚ซ‚‚น‚๑"
-
-#: ../diff.c:2141
-#, c-format
-msgid "E102: Can't find buffer \"%s\""
-msgstr "E102: ƒoƒbƒtƒ@ \"%s\" ‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#: ../diff.c:2152
-#, c-format
-msgid "E103: Buffer \"%s\" is not in diff mode"
-msgstr "E103: ƒoƒbƒtƒ@ \"%s\" ‚อท•ชƒ‚[ƒh‚ล‚อ‚ ‚่‚‚น‚๑"
-
-#: ../diff.c:2193
-msgid "E787: Buffer changed unexpectedly"
-msgstr "E787: —\\Š๚‚น‚ธƒoƒbƒtƒ@‚ช•ฯX•ฯX‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../digraph.c:1598
-msgid "E104: Escape not allowed in digraph"
-msgstr "E104: ‡Žš‚ษEscape‚อŽg—p‚ล‚ซ‚‚น‚๑"
-
-#: ../digraph.c:1760
-msgid "E544: Keymap file not found"
-msgstr "E544: ƒL[ƒ}ƒbƒvƒtƒ@ƒCƒ‹‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#: ../digraph.c:1785
-msgid "E105: Using :loadkeymap not in a sourced file"
-msgstr "E105: :source ‚ลŽๆž‚ƒtƒ@ƒCƒ‹ˆศŠO‚ล‚อ :loadkeymap ‚๐Žg‚ฆ‚‚น‚๑"
-
-#: ../digraph.c:1821
-msgid "E791: Empty keymap entry"
-msgstr "E791: ‹๓‚ฬƒL[ƒ}ƒbƒvƒGƒ“ƒgƒŠ"
-
-#: ../edit.c:82
-msgid " Keyword completion (^N^P)"
-msgstr " ƒL[ƒ[ƒh•โŠฎ (^N^P)"
-
-#. ctrl_x_mode == 0, ^P/^N compl.
-#: ../edit.c:83
-msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-msgstr " ^X ƒ‚[ƒh (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-
-#: ../edit.c:85
-msgid " Whole line completion (^L^N^P)"
-msgstr " s(‘S‘ฬ)•โŠฎ (^L^N^P)"
-
-#: ../edit.c:86
-msgid " File name completion (^F^N^P)"
-msgstr " ƒtƒ@ƒCƒ‹–ผ•โŠฎ (^F^N^P)"
-
-#: ../edit.c:87
-msgid " Tag completion (^]^N^P)"
-msgstr " ƒ^ƒO•โŠฎ (^]^N^P)"
-
-#: ../edit.c:88
-msgid " Path pattern completion (^N^P)"
-msgstr " ƒpƒXƒpƒ^[ƒ“•โŠฎ (^N^P)"
-
-#: ../edit.c:89
-msgid " Definition completion (^D^N^P)"
-msgstr " ’่‹`•โŠฎ (^D^N^P)"
-
-#: ../edit.c:91
-msgid " Dictionary completion (^K^N^P)"
-msgstr " Žซ‘•โŠฎ (^K^N^P)"
-
-#: ../edit.c:92
-msgid " Thesaurus completion (^T^N^P)"
-msgstr " ƒVƒ\\[ƒ‰ƒX•โŠฎ (^T^N^P)"
-
-#: ../edit.c:93
-msgid " Command-line completion (^V^N^P)"
-msgstr " ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“•โŠฎ (^V^N^P)"
-
-#: ../edit.c:94
-msgid " User defined completion (^U^N^P)"
-msgstr " ƒ†[ƒU[’่‹`•โŠฎ (^U^N^P)"
-
-#: ../edit.c:95
-msgid " Omni completion (^O^N^P)"
-msgstr " ƒIƒ€ƒj•โŠฎ (^O^N^P)"
-
-#: ../edit.c:96
-msgid " Spelling suggestion (s^N^P)"
-msgstr " ’ิ‚่CณŒ๓•โ (s^N^P)"
-
-#: ../edit.c:97
-msgid " Keyword Local completion (^N^P)"
-msgstr " ‹วŠƒL[ƒ[ƒh•โŠฎ (^N^P)"
-
-#: ../edit.c:100
-msgid "Hit end of paragraph"
-msgstr "’i—Ž‚ฬลŒใ‚ษƒqƒbƒg"
-
-#: ../edit.c:101
-msgid "E839: Completion function changed window"
-msgstr "E839: •โŠิŠึ”‚ชƒEƒBƒ“ƒhƒE‚๐•ฯX‚ต‚‚ต‚ฝ"
-
-#: ../edit.c:102
-msgid "E840: Completion function deleted text"
-msgstr "E840: •โŠฎŠึ”‚ชƒeƒLƒXƒg‚๐ํœ‚ต‚‚ต‚ฝ"
-
-#: ../edit.c:1847
-msgid "'dictionary' option is empty"
-msgstr "'dictionary' ƒIƒvƒVƒ‡ƒ“‚ช‹๓‚ล‚ท"
-
-#: ../edit.c:1848
-msgid "'thesaurus' option is empty"
-msgstr "'thesaurus' ƒIƒvƒVƒ‡ƒ“‚ช‹๓‚ล‚ท"
-
-#: ../edit.c:2655
-#, c-format
-msgid "Scanning dictionary: %s"
-msgstr "Žซ‘‚๐ƒXƒLƒƒƒ“’†: %s"
-
-#: ../edit.c:3079
-msgid " (insert) Scroll (^E/^Y)"
-msgstr " (‘}“) ƒXƒNƒ[ƒ‹(^E/^Y)"
-
-#: ../edit.c:3081
-msgid " (replace) Scroll (^E/^Y)"
-msgstr " (’uŠท) ƒXƒNƒ[ƒ‹ (^E/^Y)"
-
-#: ../edit.c:3587
-#, c-format
-msgid "Scanning: %s"
-msgstr "ƒXƒLƒƒƒ“’†: %s"
-
-#: ../edit.c:3614
-msgid "Scanning tags."
-msgstr "ƒ^ƒO‚๐ƒXƒLƒƒƒ“’†."
-
-#: ../edit.c:4519
-msgid " Adding"
-msgstr " ’ว‰ม’†"
-
-#. showmode might reset the internal line pointers, so it must
-#. * be called before line = ml_get(), or when this address is no
-#. * longer needed. -- Acevedo.
-#.
-#: ../edit.c:4562
-msgid "-- Searching..."
-msgstr "-- ŒŸ๕’†..."
-
-#: ../edit.c:4618
-msgid "Back at original"
-msgstr "Žn‚฿‚ษ–฿‚้"
-
-#: ../edit.c:4621
-msgid "Word from other line"
-msgstr "‘ผ‚ฬs‚ฬ’PŒ๊"
-
-#: ../edit.c:4624
-msgid "The only match"
-msgstr "—Bˆ๊‚ฬŠY“–"
-
-#: ../edit.c:4680
-#, c-format
-msgid "match %d of %d"
-msgstr "%d ”ิ–ฺ‚ฬŠY“– (‘SŠY“– %d Œย’†)"
-
-#: ../edit.c:4684
-#, c-format
-msgid "match %d"
-msgstr "%d ”ิ–ฺ‚ฬŠY“–"
-
-#: ../eval.c:137
-msgid "E18: Unexpected characters in :let"
-msgstr "E18: —\\Š๚‚น‚ส•ถŽš‚ช :let ‚ษ‚ ‚่‚‚ต‚ฝ"
-
-#: ../eval.c:138
-#, c-format
-msgid "E684: list index out of range: %<PRId64>"
-msgstr "E684: ƒŠƒXƒg‚ฬƒCƒ“ƒfƒbƒNƒX‚ช”อˆอŠO‚ล‚ท: %<PRId64>"
-
-#: ../eval.c:139
-#, c-format
-msgid "E121: Undefined variable: %s"
-msgstr "E121: –ข’่‹`‚ฬ•ฯ”‚ล‚ท: %s"
-
-#: ../eval.c:140
-msgid "E111: Missing ']'"
-msgstr "E111: ']' ‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#: ../eval.c:141
-#, c-format
-msgid "E686: Argument of %s must be a List"
-msgstr "E686: %s ‚ฬˆ๘”‚อƒŠƒXƒgŒ^‚ล‚ศ‚ฏ‚๊‚ฮ‚ศ‚่‚‚น‚๑"
-
-#: ../eval.c:143
-#, c-format
-msgid "E712: Argument of %s must be a List or Dictionary"
-msgstr "E712: %s ‚ฬˆ๘”‚อƒŠƒXƒgŒ^‚‚ฝ‚อŽซ‘Œ^‚ล‚ศ‚ฏ‚๊‚ฮ‚ศ‚่‚‚น‚๑"
-
-#: ../eval.c:144
-msgid "E713: Cannot use empty key for Dictionary"
-msgstr "E713: Žซ‘Œ^‚ษ‹๓‚ฬƒL[‚๐Žg‚ค‚ฑ‚ฦ‚อ‚ล‚ซ‚‚น‚๑"
-
-#: ../eval.c:145
-msgid "E714: List required"
-msgstr "E714: ƒŠƒXƒgŒ^‚ช•K—v‚ล‚ท"
-
-#: ../eval.c:146
-msgid "E715: Dictionary required"
-msgstr "E715: Žซ‘Œ^‚ช•K—v‚ล‚ท"
-
-#: ../eval.c:147
-#, c-format
-msgid "E118: Too many arguments for function: %s"
-msgstr "E118: Šึ”‚ฬˆ๘”‚ช‘ฝ‰฿‚ฌ‚‚ท: %s"
-
-#: ../eval.c:148
-#, c-format
-msgid "E716: Key not present in Dictionary: %s"
-msgstr "E716: Žซ‘Œ^‚ษƒL[‚ช‘ถ‚ต‚‚น‚๑: %s"
-
-#: ../eval.c:150
-#, c-format
-msgid "E122: Function %s already exists, add ! to replace it"
-msgstr "E122: Šึ” %s ‚อ’่‹`ฯ‚ล‚ท, ฤ’่‹`‚ท‚้‚ษ‚อ ! ‚๐’ว‰ม‚ต‚ฤ‚ญ‚พ‚ณ‚ข"
-
-#: ../eval.c:151
-msgid "E717: Dictionary entry already exists"
-msgstr "E717: Žซ‘Œ^“เ‚ษƒGƒ“ƒgƒŠ‚ชŠ๙‚ษ‘ถ‚ต‚‚ท"
-
-#: ../eval.c:152
-msgid "E718: Funcref required"
-msgstr "E718: Šึ”ŽQฦŒ^‚ช—v‹‚ณ‚๊‚‚ท"
-
-#: ../eval.c:153
-msgid "E719: Cannot use [:] with a Dictionary"
-msgstr "E719: [:] ‚๐Žซ‘Œ^‚ฦ‘g‚‡‚ํ‚น‚ฤ‚อŽg‚ฆ‚‚น‚๑"
-
-#: ../eval.c:154
-#, c-format
-msgid "E734: Wrong variable type for %s="
-msgstr "E734: ˆู‚ศ‚ม‚ฝŒ^‚ฬ•ฯ”‚ล‚ท %s="
-
-#: ../eval.c:155
-#, c-format
-msgid "E130: Unknown function: %s"
-msgstr "E130: –ข’m‚ฬŠึ”‚ล‚ท: %s"
-
-#: ../eval.c:156
-#, c-format
-msgid "E461: Illegal variable name: %s"
-msgstr "E461: •sณ‚ศ•ฯ”–ผ‚ล‚ท: %s"
-
-#: ../eval.c:157
-msgid "E806: using Float as a String"
-msgstr "E806: •‚“ฎฌ”“_”‚๐•ถŽš—๑‚ฦ‚ต‚ฤˆต‚ม‚ฤ‚ข‚‚ท"
-
-#: ../eval.c:1830
-msgid "E687: Less targets than List items"
-msgstr "E687: ƒ^[ƒQƒbƒg‚ชƒŠƒXƒgŒ^“เ‚ฬ—v‘f‚ๆ‚่‚เญ‚ศ‚ข‚ล‚ท"
-
-#: ../eval.c:1834
-msgid "E688: More targets than List items"
-msgstr "E688: ƒ^[ƒQƒbƒg‚ชƒŠƒXƒgŒ^“เ‚ฬ—v‘f‚ๆ‚่‚เ‘ฝ‚ข‚ล‚ท"
-
-#: ../eval.c:1906
-msgid "Double ; in list of variables"
-msgstr "ƒŠƒXƒgŒ^‚ฬ’l‚ษ2‚ยˆศใ‚ฬ ; ‚ชŒŸo‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../eval.c:2078
-#, c-format
-msgid "E738: Can't list variables for %s"
-msgstr "E738: %s ‚ฬ’l‚๐ˆ๊——•\\Žฆ‚ล‚ซ‚‚น‚๑"
-
-#: ../eval.c:2391
-msgid "E689: Can only index a List or Dictionary"
-msgstr "E689: ƒŠƒXƒgŒ^‚ฦŽซ‘Œ^ˆศŠO‚อƒCƒ“ƒfƒbƒNƒXŽw’่‚ล‚ซ‚‚น‚๑"
-
-#: ../eval.c:2396
-msgid "E708: [:] must come last"
-msgstr "E708: [:] ‚อลŒใ‚ล‚ศ‚ฏ‚๊‚ฮ‚ข‚ฏ‚‚น‚๑"
-
-#: ../eval.c:2439
-msgid "E709: [:] requires a List value"
-msgstr "E709: [:] ‚ษ‚อƒŠƒXƒgŒ^‚ฬ’l‚ช•K—v‚ล‚ท"
-
-#: ../eval.c:2674
-msgid "E710: List value has more items than target"
-msgstr "E710: ƒŠƒXƒgŒ^•ฯ”‚ษƒ^[ƒQƒbƒg‚ๆ‚่‚เ‘ฝ‚ข—v‘f‚ช‚ ‚่‚‚ท"
-
-#: ../eval.c:2678
-msgid "E711: List value has not enough items"
-msgstr "E711: ƒŠƒXƒgŒ^•ฯ”‚ษ\\•ช‚ศ”‚ฬ—v‘f‚ช‚ ‚่‚‚น‚๑"
-
-#
-#: ../eval.c:2867
-msgid "E690: Missing \"in\" after :for"
-msgstr "E690: :for ‚ฬŒใ‚ษ \"in\" ‚ช‚ ‚่‚‚น‚๑"
-
-#: ../eval.c:3063
-#, c-format
-msgid "E107: Missing parentheses: %s"
-msgstr "E107: ƒJƒbƒR '(' ‚ช‚ ‚่‚‚น‚๑: %s"
-
-#: ../eval.c:3263
-#, c-format
-msgid "E108: No such variable: \"%s\""
-msgstr "E108: ‚ป‚ฬ•ฯ”‚อ‚ ‚่‚‚น‚๑: \"%s\""
-
-#: ../eval.c:3333
-msgid "E743: variable nested too deep for (un)lock"
-msgstr "E743: (ƒAƒ“)ƒƒbƒN‚ท‚้‚ษ‚อ•ฯ”‚ฬ“‚๊Žq‚ช[‰฿‚ฌ‚‚ท"
-
-#: ../eval.c:3630
-msgid "E109: Missing ':' after '?'"
-msgstr "E109: '?' ‚ฬŒใ‚ษ ':' ‚ช‚ ‚่‚‚น‚๑"
-
-#: ../eval.c:3893
-msgid "E691: Can only compare List with List"
-msgstr "E691: ƒŠƒXƒgŒ^‚อƒŠƒXƒgŒ^‚ฦ‚ต‚ฉ”ไŠr‚ล‚ซ‚‚น‚๑"
-
-#: ../eval.c:3895
-msgid "E692: Invalid operation for Lists"
-msgstr "E692: ƒŠƒXƒgŒ^‚ษ‚อ–ณŒ๘‚ศ‘€์‚ล‚ท"
-
-#: ../eval.c:3915
-msgid "E735: Can only compare Dictionary with Dictionary"
-msgstr "E735: Žซ‘Œ^‚อŽซ‘Œ^‚ฦ‚ต‚ฉ”ไŠr‚ล‚ซ‚‚น‚๑"
-
-#: ../eval.c:3917
-msgid "E736: Invalid operation for Dictionary"
-msgstr "E736: Žซ‘Œ^‚ษ‚อ–ณŒ๘‚ศ‘€์‚ล‚ท"
-
-#: ../eval.c:3932
-msgid "E693: Can only compare Funcref with Funcref"
-msgstr "E693: Šึ”ŽQฦŒ^‚อŠึ”ŽQฦŒ^‚ฦ‚ต‚ฉ”ไŠr‚ล‚ซ‚‚น‚๑"
-
-#: ../eval.c:3934
-msgid "E694: Invalid operation for Funcrefs"
-msgstr "E694: Šึ”ŽQฦŒ^‚ษ‚อ–ณŒ๘‚ศ‘€์‚ล‚ท"
-
-#: ../eval.c:4277
-msgid "E804: Cannot use '%' with Float"
-msgstr "E804: '%' ‚๐•‚“ฎฌ”“_”‚ฦ‘g‚‡‚ํ‚น‚ฤ‚อŽg‚ฆ‚‚น‚๑"
-
-#: ../eval.c:4478
-msgid "E110: Missing ')'"
-msgstr "E110: ')' ‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#: ../eval.c:4609
-msgid "E695: Cannot index a Funcref"
-msgstr "E695: Šึ”ŽQฦŒ^‚อƒCƒ“ƒfƒbƒNƒX‚ล‚ซ‚‚น‚๑"
-
-#: ../eval.c:4839
-#, c-format
-msgid "E112: Option name missing: %s"
-msgstr "E112: ƒIƒvƒVƒ‡ƒ“–ผ‚ช‚ ‚่‚‚น‚๑: %s"
-
-#: ../eval.c:4855
-#, c-format
-msgid "E113: Unknown option: %s"
-msgstr "E113: –ข’m‚ฬƒIƒvƒVƒ‡ƒ“‚ล‚ท: %s"
-
-#: ../eval.c:4904
-#, c-format
-msgid "E114: Missing quote: %s"
-msgstr "E114: ˆ๘—p•„ (\") ‚ช‚ ‚่‚‚น‚๑: %s"
-
-#: ../eval.c:5020
-#, c-format
-msgid "E115: Missing quote: %s"
-msgstr "E115: ˆ๘—p•„ (') ‚ช‚ ‚่‚‚น‚๑: %s"
-
-#: ../eval.c:5084
-#, c-format
-msgid "E696: Missing comma in List: %s"
-msgstr "E696: ƒŠƒXƒgŒ^‚ษƒJƒ“ƒ}‚ช‚ ‚่‚‚น‚๑: %s"
-
-#: ../eval.c:5091
-#, c-format
-msgid "E697: Missing end of List ']': %s"
-msgstr "E697: ƒŠƒXƒgŒ^‚ฬลŒใ‚ษ ']' ‚ช‚ ‚่‚‚น‚๑: %s"
-
-msgid "Not enough memory to set references, garbage collection aborted!"
-msgstr ""
-"ƒK[ƒxƒbƒWƒRƒŒƒNƒVƒ‡ƒ“‚๐’†Ž~‚ต‚‚ต‚ฝ! ŽQฦ‚๐์ฌ‚ท‚้‚ฬ‚ษƒƒ‚ƒŠ‚ช•s‘ซ‚ต‚‚ต‚ฝ"
-
-#: ../eval.c:6475
-#, c-format
-msgid "E720: Missing colon in Dictionary: %s"
-msgstr "E720: Žซ‘Œ^‚ษƒRƒƒ“‚ช‚ ‚่‚‚น‚๑: %s"
-
-#: ../eval.c:6499
-#, c-format
-msgid "E721: Duplicate key in Dictionary: \"%s\""
-msgstr "E721: Žซ‘Œ^‚ษd•กƒL[‚ช‚ ‚่‚‚ท: \"%s\""
-
-#: ../eval.c:6517
-#, c-format
-msgid "E722: Missing comma in Dictionary: %s"
-msgstr "E722: Žซ‘Œ^‚ษƒJƒ“ƒ}‚ช‚ ‚่‚‚น‚๑: %s"
-
-#: ../eval.c:6524
-#, c-format
-msgid "E723: Missing end of Dictionary '}': %s"
-msgstr "E723: Žซ‘Œ^‚ฬลŒใ‚ษ '}' ‚ช‚ ‚่‚‚น‚๑: %s"
-
-#: ../eval.c:6555
-msgid "E724: variable nested too deep for displaying"
-msgstr "E724: •\\Žฆ‚ท‚้‚ษ‚อ•ฯ”‚ฬ“‚๊Žq‚ช[‰฿‚ฌ‚‚ท"
-
-#: ../eval.c:7188
-#, c-format
-msgid "E740: Too many arguments for function %s"
-msgstr "E740: Šึ”‚ฬˆ๘”‚ช‘ฝ‰฿‚ฌ‚‚ท: %s"
-
-#: ../eval.c:7190
-#, c-format
-msgid "E116: Invalid arguments for function %s"
-msgstr "E116: Šึ”‚ฬ–ณŒ๘‚ศˆ๘”‚ล‚ท: %s"
-
-#: ../eval.c:7377
-#, c-format
-msgid "E117: Unknown function: %s"
-msgstr "E117: –ข’m‚ฬŠึ”‚ล‚ท: %s"
-
-#: ../eval.c:7383
-#, c-format
-msgid "E119: Not enough arguments for function: %s"
-msgstr "E119: Šึ”‚ฬˆ๘”‚ช‘ซ‚่‚‚น‚๑: %s"
-
-#: ../eval.c:7387
-#, c-format
-msgid "E120: Using <SID> not in a script context: %s"
-msgstr "E120: ƒXƒNƒŠƒvƒgˆศŠO‚ล<SID>‚ชŽg‚ํ‚๊‚‚ต‚ฝ: %s"
-
-#: ../eval.c:7391
-#, c-format
-msgid "E725: Calling dict function without Dictionary: %s"
-msgstr "E725: Žซ‘—pŠึ”‚ชŒฤ‚ฮ‚๊‚‚ต‚ฝ‚ชŽซ‘‚ช‚ ‚่‚‚น‚๑: %s"
-
-#: ../eval.c:7453
-msgid "E808: Number or Float required"
-msgstr "E808: ”’l‚ฉ•‚“ฎฌ”“_”‚ช•K—v‚ล‚ท"
-
-#: ../eval.c:7503
-msgid "add() argument"
-msgstr "add() ‚ฬˆ๘”"
-
-#: ../eval.c:7907
-msgid "E699: Too many arguments"
-msgstr "E699: ˆ๘”‚ช‘ฝ‰฿‚ฌ‚‚ท"
-
-#: ../eval.c:8073
-msgid "E785: complete() can only be used in Insert mode"
-msgstr "E785: complete() ‚อ‘}“ƒ‚[ƒh‚ล‚ต‚ฉ—˜—p‚ล‚ซ‚‚น‚๑"
-
-#: ../eval.c:8156
-msgid "&Ok"
-msgstr "&Ok"
-
-#: ../eval.c:8676
-#, c-format
-msgid "E737: Key already exists: %s"
-msgstr "E737: ƒL[‚อŠ๙‚ษ‘ถ‚ต‚‚ท: %s"
-
-#: ../eval.c:8692
-msgid "extend() argument"
-msgstr "extend() ‚ฬˆ๘”"
-
-#: ../eval.c:8915
-msgid "map() argument"
-msgstr "map() ‚ฬˆ๘”"
-
-#: ../eval.c:8916
-msgid "filter() argument"
-msgstr "filter() ‚ฬˆ๘”"
-
-#: ../eval.c:9229
-#, c-format
-msgid "+-%s%3ld lines: "
-msgstr "+-%s%3ld s: "
-
-#: ../eval.c:9291
-#, c-format
-msgid "E700: Unknown function: %s"
-msgstr "E700: –ข’m‚ฬŠึ”‚ล‚ท: %s"
-
-#: ../eval.c:10729
-msgid "called inputrestore() more often than inputsave()"
-msgstr "inputrestore() ‚ช inputsave() ‚ๆ‚่‚เ‘ฝ‚ญŒฤ‚ฮ‚๊‚‚ต‚ฝ"
-
-#: ../eval.c:10771
-msgid "insert() argument"
-msgstr "insert() ‚ฬˆ๘”"
-
-#: ../eval.c:10841
-msgid "E786: Range not allowed"
-msgstr "E786: ”อˆอŽw’่‚อ‹–‰ย‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../eval.c:11140
-msgid "E701: Invalid type for len()"
-msgstr "E701: len() ‚ษ‚อ–ณŒ๘‚ศŒ^‚ล‚ท"
-
-#: ../eval.c:11980
-msgid "E726: Stride is zero"
-msgstr "E726: ƒXƒgƒ‰ƒCƒh(‘Oi—ส)‚ช 0 ‚ล‚ท"
-
-#: ../eval.c:11982
-msgid "E727: Start past end"
-msgstr "E727: ŠJŽnˆส’u‚ชI—นˆส’u‚๐‰z‚ฆ‚‚ต‚ฝ"
-
-#: ../eval.c:12024 ../eval.c:15297
-msgid "<empty>"
-msgstr "<‹๓>"
-
-#: ../eval.c:12282
-msgid "remove() argument"
-msgstr "remove() ‚ฬˆ๘”"
-
-# Added at 10-Mar-2004.
-#: ../eval.c:12466
-msgid "E655: Too many symbolic links (cycle?)"
-msgstr "E655: ƒVƒ“ƒ{ƒŠƒbƒNƒŠƒ“ƒN‚ช‘ฝ‰฿‚ฌ‚‚ท (zŠย‚ต‚ฤ‚ข‚้‰ย”\\ซ‚ช‚ ‚่‚‚ท)"
-
-#: ../eval.c:12593
-msgid "reverse() argument"
-msgstr "reverse() ‚ฬˆ๘”"
-
-#: ../eval.c:13721
-msgid "sort() argument"
-msgstr "sort() ‚ฬˆ๘”"
-
-#: ../eval.c:13721
-msgid "uniq() argument"
-msgstr "uniq() ‚ฬˆ๘”"
-
-#: ../eval.c:13776
-msgid "E702: Sort compare function failed"
-msgstr "E702: ƒ\\[ƒg‚ฬ”ไŠrŠึ”‚ชŽธ”s‚ต‚‚ต‚ฝ"
-
-#: ../eval.c:13806
-msgid "E882: Uniq compare function failed"
-msgstr "E882: Uniq ‚ฬ”ไŠrŠึ”‚ชŽธ”s‚ต‚‚ต‚ฝ"
-
-#: ../eval.c:14085
-msgid "(Invalid)"
-msgstr "(–ณŒ๘)"
-
-#: ../eval.c:14590
-msgid "E677: Error writing temp file"
-msgstr "E677: ˆ๊Žžƒtƒ@ƒCƒ‹‘ž’†‚ษƒGƒ‰[‚ช”ญถ‚ต‚‚ต‚ฝ"
-
-#: ../eval.c:16159
-msgid "E805: Using a Float as a Number"
-msgstr "E805: •‚“ฎฌ”“_”‚๐”’l‚ฦ‚ต‚ฤˆต‚ม‚ฤ‚ข‚‚ท"
-
-#: ../eval.c:16162
-msgid "E703: Using a Funcref as a Number"
-msgstr "E703: Šึ”ŽQฦŒ^‚๐”’l‚ฦ‚ต‚ฤˆต‚ม‚ฤ‚ข‚‚ทB"
-
-#: ../eval.c:16170
-msgid "E745: Using a List as a Number"
-msgstr "E745: ƒŠƒXƒgŒ^‚๐”’l‚ฦ‚ต‚ฤˆต‚ม‚ฤ‚ข‚‚ท"
-
-#: ../eval.c:16173
-msgid "E728: Using a Dictionary as a Number"
-msgstr "E728: Žซ‘Œ^‚๐”’l‚ฦ‚ต‚ฤˆต‚ม‚ฤ‚ข‚‚ท"
-
-msgid "E891: Using a Funcref as a Float"
-msgstr "E891: Šึ”ŽQฦŒ^‚๐•‚“ฎฌ”“_”‚ฦ‚ต‚ฤˆต‚ม‚ฤ‚ข‚‚ทB"
-
-msgid "E892: Using a String as a Float"
-msgstr "E892: •ถŽš—๑‚๐•‚“ฎฌ”“_”‚ฦ‚ต‚ฤˆต‚ม‚ฤ‚ข‚‚ท"
-
-msgid "E893: Using a List as a Float"
-msgstr "E893: ƒŠƒXƒgŒ^‚๐•‚“ฎฌ”“_”‚ฦ‚ต‚ฤˆต‚ม‚ฤ‚ข‚‚ท"
-
-msgid "E894: Using a Dictionary as a Float"
-msgstr "E894: Žซ‘Œ^‚๐•‚“ฎฌ”“_”‚ฦ‚ต‚ฤˆต‚ม‚ฤ‚ข‚‚ท"
-
-#: ../eval.c:16259
-msgid "E729: using Funcref as a String"
-msgstr "E729: Šึ”ŽQฦŒ^‚๐•ถŽš—๑‚ฦ‚ต‚ฤˆต‚ม‚ฤ‚ข‚‚ท"
-
-#: ../eval.c:16262
-msgid "E730: using List as a String"
-msgstr "E730: ƒŠƒXƒgŒ^‚๐•ถŽš—๑‚ฦ‚ต‚ฤˆต‚ม‚ฤ‚ข‚‚ท"
-
-#: ../eval.c:16265
-msgid "E731: using Dictionary as a String"
-msgstr "E731: Žซ‘Œ^‚๐•ถŽš—๑‚ฦ‚ต‚ฤˆต‚ม‚ฤ‚ข‚‚ท"
-
-#: ../eval.c:16619
-#, c-format
-msgid "E706: Variable type mismatch for: %s"
-msgstr "E706: •ฯ”‚ฬŒ^‚ชˆ๊’v‚ต‚‚น‚๑: %s"
-
-#: ../eval.c:16705
-#, c-format
-msgid "E795: Cannot delete variable %s"
-msgstr "E795: •ฯ” %s ‚๐ํœ‚ล‚ซ‚‚น‚๑"
-
-#: ../eval.c:16724
-#, c-format
-msgid "E704: Funcref variable name must start with a capital: %s"
-msgstr "E704: Šึ”ŽQฦŒ^•ฯ”–ผ‚อ‘ๅ•ถŽš‚ลŽn‚‚็‚ศ‚ฏ‚๊‚ฮ‚ศ‚่‚‚น‚๑: %s"
-
-#: ../eval.c:16732
-#, c-format
-msgid "E705: Variable name conflicts with existing function: %s"
-msgstr "E705: •ฯ”–ผ‚ชŠ๙‘ถ‚ฬŠึ”–ผ‚ฦี“ห‚ต‚‚ท: %s"
-
-#: ../eval.c:16763
-#, c-format
-msgid "E741: Value is locked: %s"
-msgstr "E741: ’l‚ชƒƒbƒN‚ณ‚๊‚ฤ‚ข‚‚ท: %s"
-
-#: ../eval.c:16764 ../eval.c:16769 ../message.c:1839
-msgid "Unknown"
-msgstr "•s–พ"
-
-#: ../eval.c:16768
-#, c-format
-msgid "E742: Cannot change value of %s"
-msgstr "E742: %s ‚ฬ’l‚๐•ฯX‚ล‚ซ‚‚น‚๑"
-
-#: ../eval.c:16838
-msgid "E698: variable nested too deep for making a copy"
-msgstr "E698: ƒRƒs[‚๐Žๆ‚้‚ษ‚อ•ฯ”‚ฬ“‚๊Žq‚ช[‰฿‚ฌ‚‚ท"
-
-#: ../eval.c:17249
-#, c-format
-msgid "E123: Undefined function: %s"
-msgstr "E123: –ข’่‹`‚ฬŠึ”‚ล‚ท: %s"
-
-#: ../eval.c:17260
-#, c-format
-msgid "E124: Missing '(': %s"
-msgstr "E124: '(' ‚ช‚ ‚่‚‚น‚๑: %s"
-
-#: ../eval.c:17293
-msgid "E862: Cannot use g: here"
-msgstr "E862: ‚ฑ‚ฑ‚ล‚อ g: ‚อŽg‚ฆ‚‚น‚๑"
-
-#: ../eval.c:17312
-#, c-format
-msgid "E125: Illegal argument: %s"
-msgstr "E125: •sณ‚ศˆ๘”‚ล‚ท: %s"
-
-#: ../eval.c:17323
-#, c-format
-msgid "E853: Duplicate argument name: %s"
-msgstr "E853: ˆ๘”–ผ‚ชd•ก‚ต‚ฤ‚ข‚‚ท: %s"
-
-#: ../eval.c:17416
-msgid "E126: Missing :endfunction"
-msgstr "E126: :endfunction ‚ช‚ ‚่‚‚น‚๑"
-
-#: ../eval.c:17537
-#, c-format
-msgid "E707: Function name conflicts with variable: %s"
-msgstr "E707: Šึ”–ผ‚ช•ฯ”–ผ‚ฦี“ห‚ต‚‚ท: %s"
-
-#: ../eval.c:17549
-#, c-format
-msgid "E127: Cannot redefine function %s: It is in use"
-msgstr "E127: Šึ” %s ‚๐ฤ’่‹`‚ล‚ซ‚‚น‚๑: Žg—p’†‚ล‚ท"
-
-#: ../eval.c:17604
-#, c-format
-msgid "E746: Function name does not match script file name: %s"
-msgstr "E746: Šึ”–ผ‚ชƒXƒNƒŠƒvƒg‚ฬƒtƒ@ƒCƒ‹–ผ‚ฦˆ๊’v‚ต‚‚น‚๑: %s"
-
-#: ../eval.c:17716
-msgid "E129: Function name required"
-msgstr "E129: Šึ”–ผ‚ช—v‹‚ณ‚๊‚‚ท"
-
-#: ../eval.c:17824
-#, c-format
-msgid "E128: Function name must start with a capital or \"s:\": %s"
-msgstr "E128: Šึ”–ผ‚อ‘ๅ•ถŽš‚ฉ \"s:\" ‚ลŽn‚‚็‚ศ‚ฏ‚๊‚ฮ‚ศ‚่‚‚น‚๑: %s"
-
-#: ../eval.c:17833
-#, c-format
-msgid "E884: Function name cannot contain a colon: %s"
-msgstr "E884: Šึ”–ผ‚ษ‚อƒRƒƒ“‚อŠ‚฿‚็‚๊‚‚น‚๑: %s"
-
-#: ../eval.c:18336
-#, c-format
-msgid "E131: Cannot delete function %s: It is in use"
-msgstr "E131: Šึ” %s ‚๐ํœ‚ล‚ซ‚‚น‚๑: Žg—p’†‚ล‚ท"
-
-#: ../eval.c:18441
-msgid "E132: Function call depth is higher than 'maxfuncdepth'"
-msgstr "E132: Šึ”Œฤo‚ฬ“‚๊Žq”‚ช 'maxfuncdepth' ‚๐’ด‚ฆ‚‚ต‚ฝ"
-
-#: ../eval.c:18568
-#, c-format
-msgid "calling %s"
-msgstr "%s ‚๐Žภs’†‚ล‚ท"
-
-#: ../eval.c:18651
-#, c-format
-msgid "%s aborted"
-msgstr "%s ‚ช’†’f‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../eval.c:18653
-#, c-format
-msgid "%s returning #%<PRId64>"
-msgstr "%s ‚ช #%<PRId64> ‚๐•ิ‚ต‚‚ต‚ฝ"
-
-#: ../eval.c:18670
-#, c-format
-msgid "%s returning %s"
-msgstr "%s ‚ช %s ‚๐•ิ‚ต‚‚ต‚ฝ"
-
-#: ../eval.c:18691 ../ex_cmds2.c:2695
-#, c-format
-msgid "continuing in %s"
-msgstr "%s ‚ฬŽภs‚๐Œp‘ฑ’†‚ล‚ท"
-
-#: ../eval.c:18795
-msgid "E133: :return not inside a function"
-msgstr "E133: Šึ”ŠO‚ษ :return ‚ช‚ ‚่‚‚ต‚ฝ"
-
-#: ../eval.c:19159
-msgid ""
-"\n"
-"# global variables:\n"
-msgstr ""
-"\n"
-"# ƒOƒ[ƒoƒ‹•ฯ”:\n"
-
-#: ../eval.c:19254
-msgid ""
-"\n"
-"\tLast set from "
-msgstr ""
-"\n"
-"\tLast set from "
-
-#: ../eval.c:19272
-msgid "No old files"
-msgstr "Œร‚ขƒtƒ@ƒCƒ‹‚อ‚ ‚่‚‚น‚๑"
-
-#: ../ex_cmds.c:122
-#, c-format
-msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
-msgstr "<%s>%s%s %d, 16i” %02x, 8i” %03o"
-
-#: ../ex_cmds.c:145
-#, c-format
-msgid "> %d, Hex %04x, Octal %o"
-msgstr "> %d, 16i” %04x, 8i” %o"
-
-#: ../ex_cmds.c:146
-#, c-format
-msgid "> %d, Hex %08x, Octal %o"
-msgstr "> %d, 16i” %08x, 8i” %o"
-
-#: ../ex_cmds.c:684
-msgid "E134: Move lines into themselves"
-msgstr "E134: s‚๐‚ป‚๊Žฉg‚ษ‚อˆฺ“ฎ‚ล‚ซ‚‚น‚๑"
-
-#: ../ex_cmds.c:747
-msgid "1 line moved"
-msgstr "1 s‚ชˆฺ“ฎ‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../ex_cmds.c:749
-#, c-format
-msgid "%<PRId64> lines moved"
-msgstr "%<PRId64> s‚ชˆฺ“ฎ‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../ex_cmds.c:1175
-#, c-format
-msgid "%<PRId64> lines filtered"
-msgstr "%<PRId64> s‚ชƒtƒBƒ‹ƒ^ˆ—‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../ex_cmds.c:1194
-msgid "E135: *Filter* Autocommands must not change current buffer"
-msgstr "E135: *ƒtƒBƒ‹ƒ^* autocommand‚อŒป‚ฬƒoƒbƒtƒ@‚๐•ฯX‚ต‚ฤ‚อ‚ข‚ฏ‚‚น‚๑"
-
-#: ../ex_cmds.c:1244
-msgid "[No write since last change]\n"
-msgstr "[ลŒใ‚ฬ•ฯX‚ช•‘ถ‚ณ‚๊‚ฤ‚ข‚‚น‚๑]\n"
-
-#: ../ex_cmds.c:1424
-#, c-format
-msgid "%sviminfo: %s in line: "
-msgstr "%sviminfo: %s s–ฺ: "
-
-#: ../ex_cmds.c:1431
-msgid "E136: viminfo: Too many errors, skipping rest of file"
-msgstr "E136: viminfo: ƒGƒ‰[‚ช‘ฝ‰฿‚ฌ‚้‚ฬ‚ล, ˆศ~‚อƒXƒLƒbƒv‚ต‚‚ท"
-
-#: ../ex_cmds.c:1458
-#, c-format
-msgid "Reading viminfo file \"%s\"%s%s%s"
-msgstr "viminfoƒtƒ@ƒCƒ‹ \"%s\"%s%s%s ‚๐“วž‚’†"
-
-#: ../ex_cmds.c:1460
-msgid " info"
-msgstr " ๎•๑"
-
-#: ../ex_cmds.c:1461
-msgid " marks"
-msgstr " ƒ}[ƒN"
-
-#: ../ex_cmds.c:1462
-msgid " oldfiles"
-msgstr " ‹Œƒtƒ@ƒCƒ‹ŒQ"
-
-#: ../ex_cmds.c:1463
-msgid " FAILED"
-msgstr " Žธ”s"
-
-#. avoid a wait_return for this message, it's annoying
-#: ../ex_cmds.c:1541
-#, c-format
-msgid "E137: Viminfo file is not writable: %s"
-msgstr "E137: viminfoƒtƒ@ƒCƒ‹‚ช‘ž‚‚ล‚ซ‚‚น‚๑: %s"
-
-#: ../ex_cmds.c:1626
-#, c-format
-msgid "E138: Can't write viminfo file %s!"
-msgstr "E138: viminfoƒtƒ@ƒCƒ‹ %s ‚๐•‘ถ‚ล‚ซ‚‚น‚๑!"
-
-#: ../ex_cmds.c:1635
-#, c-format
-msgid "Writing viminfo file \"%s\""
-msgstr "viminfoƒtƒ@ƒCƒ‹ \"%s\" ‚๐‘ž‚’†"
-
-#. Write the info:
-#: ../ex_cmds.c:1720
-#, c-format
-msgid "# This viminfo file was generated by Vim %s.\n"
-msgstr "# ‚ฑ‚ฬ viminfo ƒtƒ@ƒCƒ‹‚อ Vim %s ‚ษ‚ๆ‚ม‚ฤถฌ‚ณ‚๊‚‚ต‚ฝ.\n"
-
-#: ../ex_cmds.c:1722
-msgid ""
-"# You may edit it if you're careful!\n"
-"\n"
-msgstr ""
-"# •ฯX‚ท‚้‚ษ‚อ\\•ช’ˆำ‚ต‚ฤ‚ญ‚พ‚ณ‚ข!\n"
-"\n"
-
-#: ../ex_cmds.c:1723
-msgid "# Value of 'encoding' when this file was written\n"
-msgstr "# ‚ฑ‚ฬƒtƒ@ƒCƒ‹‚ช‘‚ฉ‚๊‚ฝŽž‚ฬ 'encoding' ‚ฬ’l\n"
-
-#: ../ex_cmds.c:1800
-msgid "Illegal starting char"
-msgstr "•sณ‚ศๆ“ช•ถŽš‚ล‚ท"
-
-#: ../ex_cmds.c:2162
-msgid "Write partial file?"
-msgstr "ƒtƒ@ƒCƒ‹‚๐•”•ช“I‚ษ•‘ถ‚ต‚‚ท‚ฉ?"
-
-#: ../ex_cmds.c:2166
-msgid "E140: Use ! to write partial buffer"
-msgstr "E140: ƒoƒbƒtƒ@‚๐•”•ช“I‚ษ•‘ถ‚ท‚้‚ษ‚อ ! ‚๐Žg‚ม‚ฤ‚ญ‚พ‚ณ‚ข"
-
-#: ../ex_cmds.c:2281
-#, c-format
-msgid "Overwrite existing file \"%s\"?"
-msgstr "Š๙‘ถ‚ฬƒtƒ@ƒCƒ‹ \"%s\" ‚๐ใ‘‚ซ‚ต‚‚ท‚ฉ?"
-
-#: ../ex_cmds.c:2317
-#, c-format
-msgid "Swap file \"%s\" exists, overwrite anyway?"
-msgstr "ƒXƒƒbƒvƒtƒ@ƒCƒ‹ \"%s\" ‚ช‘ถ‚ต‚‚ท. ใ‘‚ซ‚๐‹ญง‚ต‚‚ท‚ฉ?"
-
-#: ../ex_cmds.c:2326
-#, c-format
-msgid "E768: Swap file exists: %s (:silent! overrides)"
-msgstr "E768: ƒXƒƒbƒvƒtƒ@ƒCƒ‹‚ช‘ถ‚ต‚‚ท: %s (:silent! ‚๐’ว‰ม‚ลใ‘)"
-
-#: ../ex_cmds.c:2381
-#, c-format
-msgid "E141: No file name for buffer %<PRId64>"
-msgstr "E141: ƒoƒbƒtƒ@ %<PRId64> ‚ษ‚อ–ผ‘O‚ช‚ ‚่‚‚น‚๑"
-
-#: ../ex_cmds.c:2412
-msgid "E142: File not written: Writing is disabled by 'write' option"
-msgstr "E142: ƒtƒ@ƒCƒ‹‚อ•‘ถ‚ณ‚๊‚‚น‚๑‚ล‚ต‚ฝ: 'write' ƒIƒvƒVƒ‡ƒ“‚ษ‚ๆ‚่–ณŒ๘‚ล‚ท"
-
-#: ../ex_cmds.c:2434
-#, c-format
-msgid ""
-"'readonly' option is set for \"%s\".\n"
-"Do you wish to write anyway?"
-msgstr ""
-"\"%s\" ‚ษ‚อ 'readonly' ƒIƒvƒVƒ‡ƒ“‚ช’่‚ณ‚๊‚ฤ‚ข‚‚ท.\n"
-"ใ‘‚ซ‹ญง‚๐‚ต‚‚ท‚ฉ?"
-
-#: ../ex_cmds.c:2439
-#, c-format
-msgid ""
-"File permissions of \"%s\" are read-only.\n"
-"It may still be possible to write it.\n"
-"Do you wish to try?"
-msgstr ""
-"ƒtƒ@ƒCƒ‹ \"%s\" ‚ฬƒp[ƒ~ƒbƒVƒ‡ƒ“‚ช“วž๊—p‚ล‚ท.\n"
-"‚ป‚๊‚ล‚เ‹ฐ‚็‚ญ‘‚ซž‚‚ฑ‚ฦ‚อ‰ย”\\‚ล‚ท.\n"
-"Œp‘ฑ‚ต‚‚ท‚ฉ?"
-
-#: ../ex_cmds.c:2451
-#, c-format
-msgid "E505: \"%s\" is read-only (add ! to override)"
-msgstr "E505: \"%s\" ‚อ“วž๊—p‚ล‚ท (‹ญง‘ž‚ษ‚อ ! ‚๐’ว‰ม)"
-
-#: ../ex_cmds.c:3120
-#, c-format
-msgid "E143: Autocommands unexpectedly deleted new buffer %s"
-msgstr "E143: autocommand‚ช—\\Š๚‚น‚ธV‚ต‚ขƒoƒbƒtƒ@ %s ‚๐ํœ‚ต‚‚ต‚ฝ"
-
-#: ../ex_cmds.c:3313
-msgid "E144: non-numeric argument to :z"
-msgstr "E144: ”‚ล‚อ‚ศ‚ขˆ๘”‚ช :z ‚ษ“n‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../ex_cmds.c:3404
-msgid "E145: Shell commands not allowed in rvim"
-msgstr "E145: rvim‚ล‚อƒVƒFƒ‹ƒRƒ}ƒ“ƒh‚๐Žg‚ฆ‚‚น‚๑"
-
-#: ../ex_cmds.c:3498
-msgid "E146: Regular expressions can't be delimited by letters"
-msgstr "E146: ณ‹K•\\Œป‚อ•ถŽš‚ล‹ๆุ‚้‚ฑ‚ฦ‚ช‚ล‚ซ‚‚น‚๑"
-
-#: ../ex_cmds.c:3964
-#, c-format
-msgid "replace with %s (y/n/a/q/l/^E/^Y)?"
-msgstr "%s ‚ษ’uŠท‚ต‚‚ท‚ฉ? (y/n/a/q/l/^E/^Y)"
-
-#: ../ex_cmds.c:4379
-msgid "(Interrupted) "
-msgstr "(Š„ž‚‚๊‚‚ต‚ฝ) "
-
-#: ../ex_cmds.c:4384
-msgid "1 match"
-msgstr "1 ‰ำŠŠY“–‚ต‚‚ต‚ฝ"
-
-#: ../ex_cmds.c:4384
-msgid "1 substitution"
-msgstr "1 ‰ำŠ’uŠท‚ต‚‚ต‚ฝ"
-
-#: ../ex_cmds.c:4387
-#, c-format
-msgid "%<PRId64> matches"
-msgstr "%<PRId64> ‰ำŠŠY“–‚ต‚‚ต‚ฝ"
-
-#: ../ex_cmds.c:4388
-#, c-format
-msgid "%<PRId64> substitutions"
-msgstr "%<PRId64> ‰ำŠ’uŠท‚ต‚‚ต‚ฝ"
-
-#: ../ex_cmds.c:4392
-msgid " on 1 line"
-msgstr " (Œv 1 s“เ)"
-
-#: ../ex_cmds.c:4395
-#, c-format
-msgid " on %<PRId64> lines"
-msgstr " (Œv %<PRId64> s“เ)"
-
-#: ../ex_cmds.c:4438
-msgid "E147: Cannot do :global recursive"
-msgstr "E147: :global ‚๐ฤ‹A“I‚ษ‚อŽg‚ฆ‚‚น‚๑"
-
-#: ../ex_cmds.c:4467
-msgid "E148: Regular expression missing from global"
-msgstr "E148: globalƒRƒ}ƒ“ƒh‚ษณ‹K•\\Œป‚ชŽw’่‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../ex_cmds.c:4508
-#, c-format
-msgid "Pattern found in every line: %s"
-msgstr "ƒpƒ^[ƒ“‚ช‘S‚ฤ‚ฬs‚ลŒฉ‚ย‚ฉ‚่‚‚ต‚ฝ: %s"
-
-#: ../ex_cmds.c:4510
-#, c-format
-msgid "Pattern not found: %s"
-msgstr "ƒpƒ^[ƒ“‚อŒฉ‚ย‚ฉ‚่‚‚น‚๑‚ล‚ต‚ฝ: %s"
-
-#: ../ex_cmds.c:4587
-msgid ""
-"\n"
-"# Last Substitute String:\n"
-"$"
-msgstr ""
-"\n"
-"# ลŒใ‚ษ’uŠท‚ณ‚๊‚ฝ•ถŽš—๑:\n"
-"$"
-
-#: ../ex_cmds.c:4679
-msgid "E478: Don't panic!"
-msgstr "E478: Q‚ฤ‚ศ‚ข‚ล‚ญ‚พ‚ณ‚ข"
-
-#: ../ex_cmds.c:4717
-#, c-format
-msgid "E661: Sorry, no '%s' help for %s"
-msgstr "E661: Žc”O‚ล‚ท‚ช '%s' ‚ฬƒwƒ‹ƒv‚ช %s ‚ษ‚อ‚ ‚่‚‚น‚๑"
-
-#: ../ex_cmds.c:4719
-#, c-format
-msgid "E149: Sorry, no help for %s"
-msgstr "E149: Žc”O‚ล‚ท‚ช %s ‚ษ‚อƒwƒ‹ƒv‚ช‚ ‚่‚‚น‚๑"
-
-#: ../ex_cmds.c:4751
-#, c-format
-msgid "Sorry, help file \"%s\" not found"
-msgstr "Žc”O‚ล‚ท‚ชƒwƒ‹ƒvƒtƒ@ƒCƒ‹ \"%s\" ‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#: ../ex_cmds.c:5323
-#, c-format
-msgid "E150: Not a directory: %s"
-msgstr "E150: ƒfƒBƒŒƒNƒgƒŠ‚ล‚อ‚ ‚่‚‚น‚๑: %s"
-
-#: ../ex_cmds.c:5446
-#, c-format
-msgid "E152: Cannot open %s for writing"
-msgstr "E152: ‘ž‚—p‚ษ %s ‚๐ŠJ‚ฏ‚‚น‚๑"
-
-#: ../ex_cmds.c:5471
-#, c-format
-msgid "E153: Unable to open %s for reading"
-msgstr "E153: “วž—p‚ษ %s ‚๐ŠJ‚ฏ‚‚น‚๑"
-
-# Added at 29-Apr-2004.
-#: ../ex_cmds.c:5500
-#, c-format
-msgid "E670: Mix of help file encodings within a language: %s"
-msgstr "E670: 1‚ย‚ฬŒพŒ๊‚ฬƒwƒ‹ƒvƒtƒ@ƒCƒ‹‚ษ•ก”‚ฬƒGƒ“ƒR[ƒh‚ชฌ‚ต‚ฤ‚ข‚‚ท: %s"
-
-#: ../ex_cmds.c:5565
-#, c-format
-msgid "E154: Duplicate tag \"%s\" in file %s/%s"
-msgstr "E154: ƒ^ƒO \"%s\" ‚ชƒtƒ@ƒCƒ‹ %s/%s ‚ษd•ก‚ต‚ฤ‚ข‚‚ท"
-
-#: ../ex_cmds.c:5687
-#, c-format
-msgid "E160: Unknown sign command: %s"
-msgstr "E160: –ข’m‚ฬsignƒRƒ}ƒ“ƒh‚ล‚ท: %s"
-
-#: ../ex_cmds.c:5704
-msgid "E156: Missing sign name"
-msgstr "E156: sign–ผ‚ช‚ ‚่‚‚น‚๑"
-
-#: ../ex_cmds.c:5746
-msgid "E612: Too many signs defined"
-msgstr "E612: sign‚ฬ’่‹`‚ช‘ฝ”Œฉ‚ย‚ฉ‚่‚‚ต‚ฝ"
-
-#: ../ex_cmds.c:5813
-#, c-format
-msgid "E239: Invalid sign text: %s"
-msgstr "E239: –ณŒ๘‚ศsign‚ฬƒeƒLƒXƒg‚ล‚ท: %s"
-
-#: ../ex_cmds.c:5844 ../ex_cmds.c:6035
-#, c-format
-msgid "E155: Unknown sign: %s"
-msgstr "E155: –ข’m‚ฬsign‚ล‚ท: %s"
-
-#: ../ex_cmds.c:5877
-msgid "E159: Missing sign number"
-msgstr "E159: sign‚ฬ”ิ†‚ช‚ ‚่‚‚น‚๑"
-
-#: ../ex_cmds.c:5971
-#, c-format
-msgid "E158: Invalid buffer name: %s"
-msgstr "E158: –ณŒ๘‚ศƒoƒbƒtƒ@–ผ‚ล‚ท: %s"
-
-#: ../ex_cmds.c:6008
-#, c-format
-msgid "E157: Invalid sign ID: %<PRId64>"
-msgstr "E157: –ณŒ๘‚ศsignŽฏ•สŽq‚ล‚ท: %<PRId64>"
-
-#, c-format
-msgid "E885: Not possible to change sign %s"
-msgstr "E885: •ฯX‚ล‚ซ‚ศ‚ข sign ‚ล‚ท: %s"
-
-#: ../ex_cmds.c:6066
-msgid " (not supported)"
-msgstr " (”๑ƒTƒ|[ƒg)"
-
-#: ../ex_cmds.c:6169
-msgid "[Deleted]"
-msgstr "[ํœฯ]"
-
-#: ../ex_cmds2.c:139
-msgid "Entering Debug mode. Type \"cont\" to continue."
-msgstr "ƒfƒoƒbƒOƒ‚[ƒh‚ษ“‚่‚‚ท. ‘ฑ‚ฏ‚้‚ษ‚อ \"cont\" ‚ฦ“—อ‚ต‚ฤ‚ญ‚พ‚ณ‚ข."
-
-#: ../ex_cmds2.c:143 ../ex_docmd.c:759
-#, c-format
-msgid "line %<PRId64>: %s"
-msgstr "s %<PRId64>: %s"
-
-#: ../ex_cmds2.c:145
-#, c-format
-msgid "cmd: %s"
-msgstr "ƒRƒ}ƒ“ƒh: %s"
-
-msgid "frame is zero"
-msgstr "ƒtƒŒ[ƒ€‚ช 0 ‚ล‚ท"
-
-#, c-format
-msgid "frame at highest level: %d"
-msgstr "ล‚ƒŒƒxƒ‹‚ฬƒtƒŒ[ƒ€: %d"
-
-#: ../ex_cmds2.c:322
-#, c-format
-msgid "Breakpoint in \"%s%s\" line %<PRId64>"
-msgstr "ƒuƒŒ[ƒNƒ|ƒCƒ“ƒg \"%s%s\" s %<PRId64>"
-
-#: ../ex_cmds2.c:581
-#, c-format
-msgid "E161: Breakpoint not found: %s"
-msgstr "E161: ƒuƒŒ[ƒNƒ|ƒCƒ“ƒg‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑: %s"
-
-#: ../ex_cmds2.c:611
-msgid "No breakpoints defined"
-msgstr "ƒuƒŒ[ƒNƒ|ƒCƒ“ƒg‚ช’่‹`‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../ex_cmds2.c:617
-#, c-format
-msgid "%3d %s %s line %<PRId64>"
-msgstr "%3d %s %s s %<PRId64>"
-
-#: ../ex_cmds2.c:942
-msgid "E750: First use \":profile start {fname}\""
-msgstr "E750: ‰‚฿‚ษ \":profile start {fname}\" ‚๐Žภs‚ต‚ฤ‚ญ‚พ‚ณ‚ข"
-
-#: ../ex_cmds2.c:1269
-#, c-format
-msgid "Save changes to \"%s\"?"
-msgstr "•ฯX‚๐ \"%s\" ‚ษ•‘ถ‚ต‚‚ท‚ฉ?"
-
-#: ../ex_cmds2.c:1271 ../ex_docmd.c:8851
-msgid "Untitled"
-msgstr "–ณ‘่"
-
-#: ../ex_cmds2.c:1421
-#, c-format
-msgid "E162: No write since last change for buffer \"%s\""
-msgstr "E162: ƒoƒbƒtƒ@ \"%s\" ‚ฬ•ฯX‚อ•‘ถ‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../ex_cmds2.c:1480
-msgid "Warning: Entered other buffer unexpectedly (check autocommands)"
-msgstr "Œx: —\\Š๚‚น‚ธ‘ผƒoƒbƒtƒ@‚ึˆฺ“ฎ‚ต‚‚ต‚ฝ (autocommands ‚๐’ฒ‚ื‚ฤ‚ญ‚พ‚ณ‚ข)"
-
-#: ../ex_cmds2.c:1826
-msgid "E163: There is only one file to edit"
-msgstr "E163: •าW‚ท‚้ƒtƒ@ƒCƒ‹‚อ1‚ย‚ต‚ฉ‚ ‚่‚‚น‚๑"
-
-#: ../ex_cmds2.c:1828
-msgid "E164: Cannot go before first file"
-msgstr "E164: ล‰‚ฬƒtƒ@ƒCƒ‹‚ๆ‚่‘O‚ษ‚อs‚ฏ‚‚น‚๑"
-
-#: ../ex_cmds2.c:1830
-msgid "E165: Cannot go beyond last file"
-msgstr "E165: ลŒใ‚ฬƒtƒ@ƒCƒ‹‚๐‰z‚ฆ‚ฤŒใ‚ษ‚อs‚ฏ‚‚น‚๑"
-
-#: ../ex_cmds2.c:2175
-#, c-format
-msgid "E666: compiler not supported: %s"
-msgstr "E666: ‚ป‚ฬƒRƒ“ƒpƒCƒ‰‚ษ‚อ‘ฮ‰ž‚ต‚ฤ‚ข‚‚น‚๑: %s"
-
-#: ../ex_cmds2.c:2257
-#, c-format
-msgid "Searching for \"%s\" in \"%s\""
-msgstr "\"%s\" ‚๐ \"%s\" ‚ฉ‚็ŒŸ๕’†"
-
-#: ../ex_cmds2.c:2284
-#, c-format
-msgid "Searching for \"%s\""
-msgstr "\"%s\" ‚๐ŒŸ๕’†"
-
-#: ../ex_cmds2.c:2307
-#, c-format
-msgid "not found in 'runtimepath': \"%s\""
-msgstr "'runtimepath' ‚ฬ’†‚ษ‚อŒฉ‚ย‚ฉ‚่‚‚น‚๑: \"%s\""
-
-#: ../ex_cmds2.c:2472
-#, c-format
-msgid "Cannot source a directory: \"%s\""
-msgstr "ƒfƒBƒŒƒNƒgƒŠ‚อŽๆž‚฿‚‚น‚๑: \"%s\""
-
-#: ../ex_cmds2.c:2518
-#, c-format
-msgid "could not source \"%s\""
-msgstr "\"%s\" ‚๐Žๆž‚฿‚‚น‚๑"
-
-#: ../ex_cmds2.c:2520
-#, c-format
-msgid "line %<PRId64>: could not source \"%s\""
-msgstr "s %<PRId64>: \"%s\" ‚๐Žๆž‚฿‚‚น‚๑"
-
-#: ../ex_cmds2.c:2535
-#, c-format
-msgid "sourcing \"%s\""
-msgstr "\"%s\" ‚๐Žๆž’†"
-
-#: ../ex_cmds2.c:2537
-#, c-format
-msgid "line %<PRId64>: sourcing \"%s\""
-msgstr "s %<PRId64>: %s ‚๐Žๆž’†"
-
-#: ../ex_cmds2.c:2693
-#, c-format
-msgid "finished sourcing %s"
-msgstr "%s ‚ฬŽๆž‚๐Šฎ—น"
-
-#: ../ex_cmds2.c:2765
-msgid "modeline"
-msgstr "ƒ‚[ƒhs"
-
-#: ../ex_cmds2.c:2767
-msgid "--cmd argument"
-msgstr "--cmd ˆ๘”"
-
-#: ../ex_cmds2.c:2769
-msgid "-c argument"
-msgstr "-c ˆ๘”"
-
-#: ../ex_cmds2.c:2771
-msgid "environment variable"
-msgstr "Šย‹ซ•ฯ”"
-
-#: ../ex_cmds2.c:2773
-msgid "error handler"
-msgstr "ƒGƒ‰[ƒnƒ“ƒhƒ‰"
-
-#: ../ex_cmds2.c:3020
-msgid "W15: Warning: Wrong line separator, ^M may be missing"
-msgstr "W15: Œx: s‹ๆุ‚ช•sณ‚ล‚ท. ^M ‚ช‚ศ‚ข‚ฬ‚ล‚ต‚ๅ‚ค"
-
-#: ../ex_cmds2.c:3139
-msgid "E167: :scriptencoding used outside of a sourced file"
-msgstr "E167: :scriptencoding ‚ชŽๆžƒXƒNƒŠƒvƒgˆศŠO‚ลŽg—p‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../ex_cmds2.c:3166
-msgid "E168: :finish used outside of a sourced file"
-msgstr "E168: :finish ‚ชŽๆžƒXƒNƒŠƒvƒgˆศŠO‚ลŽg—p‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../ex_cmds2.c:3389
-#, c-format
-msgid "Current %slanguage: \"%s\""
-msgstr "Œป‚ฬ %sŒพŒ๊: \"%s\""
-
-#: ../ex_cmds2.c:3404
-#, c-format
-msgid "E197: Cannot set language to \"%s\""
-msgstr "E197: ŒพŒ๊‚๐ \"%s\" ‚ษ’่‚ล‚ซ‚‚น‚๑"
-
-#. don't redisplay the window
-#. don't wait for return
-#: ../ex_docmd.c:387
-msgid "Entering Ex mode. Type \"visual\" to go to Normal mode."
-msgstr ""
-"Exƒ‚[ƒh‚ษ“‚่‚‚ท. ƒm[ƒ}ƒ‹ƒ‚[ƒh‚ษ–฿‚้‚ษ‚อ\"visual\"‚ฦ“—อ‚ต‚ฤ‚ญ‚พ‚ณ‚ข."
-
-#: ../ex_docmd.c:428
-msgid "E501: At end-of-file"
-msgstr "E501: ƒtƒ@ƒCƒ‹‚ฬI—นˆส’u"
-
-#: ../ex_docmd.c:513
-msgid "E169: Command too recursive"
-msgstr "E169: ƒRƒ}ƒ“ƒh‚ชฤ‹A“I‰฿‚ฌ‚‚ท"
-
-#: ../ex_docmd.c:1006
-#, c-format
-msgid "E605: Exception not caught: %s"
-msgstr "E605: —แŠO‚ช•฿‘จ‚ณ‚๊‚‚น‚๑‚ล‚ต‚ฝ: %s"
-
-#: ../ex_docmd.c:1085
-msgid "End of sourced file"
-msgstr "Žๆžƒtƒ@ƒCƒ‹‚ฬลŒใ‚ล‚ท"
-
-#: ../ex_docmd.c:1086
-msgid "End of function"
-msgstr "Šึ”‚ฬลŒใ‚ล‚ท"
-
-#: ../ex_docmd.c:1628
-msgid "E464: Ambiguous use of user-defined command"
-msgstr "E464: ƒ†[ƒU[’่‹`ƒRƒ}ƒ“ƒh‚ฬ‚ ‚ข‚‚ข‚ศŽg—p‚ล‚ท"
-
-#: ../ex_docmd.c:1638
-msgid "E492: Not an editor command"
-msgstr "E492: ƒGƒfƒBƒ^‚ฬƒRƒ}ƒ“ƒh‚ล‚อ‚ ‚่‚‚น‚๑"
-
-#: ../ex_docmd.c:1729
-msgid "E493: Backwards range given"
-msgstr "E493: ‹t‚ณ‚‚ฬ”อˆอ‚ชŽw’่‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../ex_docmd.c:1733
-msgid "Backwards range given, OK to swap"
-msgstr "‹t‚ณ‚‚ฬ”อˆอ‚ชŽw’่‚ณ‚๊‚‚ต‚ฝ, “‘ึ‚ฆ‚‚ท‚ฉ?"
-
-#. append
-#. typed wrong
-#: ../ex_docmd.c:1787
-msgid "E494: Use w or w>>"
-msgstr "E494: w ‚เ‚ต‚ญ‚อ w>> ‚๐Žg—p‚ต‚ฤ‚ญ‚พ‚ณ‚ข"
-
-#: ../ex_docmd.c:3454
-msgid "E319: The command is not available in this version"
-msgstr "E319: ‚ฑ‚ฬƒo[ƒWƒ‡ƒ“‚ล‚อ‚ฑ‚ฬƒRƒ}ƒ“ƒh‚อ—˜—p‚ล‚ซ‚‚น‚๑, ‚ฒ‚฿‚๑‚ศ‚ณ‚ข"
-
-#: ../ex_docmd.c:3752
-msgid "E172: Only one file name allowed"
-msgstr "E172: ƒtƒ@ƒCƒ‹–ผ‚อ 1 ‚ย‚ษ‚ต‚ฤ‚ญ‚พ‚ณ‚ข"
-
-#: ../ex_docmd.c:4238
-msgid "1 more file to edit. Quit anyway?"
-msgstr "•าW‚ท‚ื‚ซƒtƒ@ƒCƒ‹‚ช 1 Œย‚ ‚่‚‚ท‚ช, I—น‚ต‚‚ท‚ฉ?"
-
-#: ../ex_docmd.c:4242
-#, c-format
-msgid "%d more files to edit. Quit anyway?"
-msgstr "•าW‚ท‚ื‚ซƒtƒ@ƒCƒ‹‚ช‚ ‚ฦ %d Œย‚ ‚่‚‚ท‚ช, I—น‚ต‚‚ท‚ฉ?"
-
-#: ../ex_docmd.c:4248
-msgid "E173: 1 more file to edit"
-msgstr "E173: •าW‚ท‚ื‚ซƒtƒ@ƒCƒ‹‚ช 1 Œย‚ ‚่‚‚ท"
-
-#: ../ex_docmd.c:4250
-#, c-format
-msgid "E173: %<PRId64> more files to edit"
-msgstr "E173: •าW‚ท‚ื‚ซƒtƒ@ƒCƒ‹‚ช‚ ‚ฦ %<PRId64> Œย‚ ‚่‚‚ท"
-
-#: ../ex_docmd.c:4320
-msgid "E174: Command already exists: add ! to replace it"
-msgstr "E174: ƒRƒ}ƒ“ƒh‚ชŠ๙‚ษ‚ ‚่‚‚ท: ฤ’่‹`‚ท‚้‚ษ‚อ ! ‚๐’ว‰ม‚ต‚ฤ‚ญ‚พ‚ณ‚ข"
-
-#: ../ex_docmd.c:4432
-msgid ""
-"\n"
-" Name Args Address Complete Definition"
-msgstr ""
-"\n"
-" –ผ‘O ˆ๘” ƒAƒhƒŒƒX •โŠฎ ’่‹`"
-
-#: ../ex_docmd.c:4516
-msgid "No user-defined commands found"
-msgstr "ƒ†[ƒU[’่‹`ƒRƒ}ƒ“ƒh‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑‚ล‚ต‚ฝ"
-
-#: ../ex_docmd.c:4538
-msgid "E175: No attribute specified"
-msgstr "E175: ‘ฎซ‚อ’่‹`‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../ex_docmd.c:4583
-msgid "E176: Invalid number of arguments"
-msgstr "E176: ˆ๘”‚ฬ”‚ช–ณŒ๘‚ล‚ท"
-
-#: ../ex_docmd.c:4594
-msgid "E177: Count cannot be specified twice"
-msgstr "E177: ƒJƒEƒ“ƒg‚๐2dŽw’่‚ท‚้‚ฑ‚ฦ‚อ‚ล‚ซ‚‚น‚๑"
-
-#: ../ex_docmd.c:4603
-msgid "E178: Invalid default value for count"
-msgstr "E178: ƒJƒEƒ“ƒg‚ฬศ—ช’l‚ช–ณŒ๘‚ล‚ท"
-
-#: ../ex_docmd.c:4625
-msgid "E179: argument required for -complete"
-msgstr "E179: -complete ‚ษ‚อˆ๘”‚ช•K—v‚ล‚ท"
-
-msgid "E179: argument required for -addr"
-msgstr "E179: -addr ‚ษ‚อˆ๘”‚ช•K—v‚ล‚ท"
-
-#: ../ex_docmd.c:4635
-#, c-format
-msgid "E181: Invalid attribute: %s"
-msgstr "E181: –ณŒ๘‚ศ‘ฎซ‚ล‚ท: %s"
-
-#: ../ex_docmd.c:4678
-msgid "E182: Invalid command name"
-msgstr "E182: –ณŒ๘‚ศƒRƒ}ƒ“ƒh–ผ‚ล‚ท"
-
-#: ../ex_docmd.c:4691
-msgid "E183: User defined commands must start with an uppercase letter"
-msgstr "E183: ƒ†[ƒU[’่‹`ƒRƒ}ƒ“ƒh‚อ‰p‘ๅ•ถŽš‚ลŽn‚‚็‚ศ‚ฏ‚๊‚ฮ‚ศ‚่‚‚น‚๑"
-
-#: ../ex_docmd.c:4696
-msgid "E841: Reserved name, cannot be used for user defined command"
-msgstr "E841: —\\–๑–ผ‚ศ‚ฬ‚ล, ƒ†[ƒU[’่‹`ƒRƒ}ƒ“ƒh‚ษ—˜—p‚ล‚ซ‚‚น‚๑"
-
-#: ../ex_docmd.c:4751
-#, c-format
-msgid "E184: No such user-defined command: %s"
-msgstr "E184: ‚ป‚ฬƒ†[ƒU[’่‹`ƒRƒ}ƒ“ƒh‚อ‚ ‚่‚‚น‚๑: %s"
-
-#, c-format
-msgid "E180: Invalid address type value: %s"
-msgstr "E180: –ณŒ๘‚ศƒAƒhƒŒƒXƒ^ƒCƒv’l‚ล‚ท: %s"
-
-#: ../ex_docmd.c:5219
-#, c-format
-msgid "E180: Invalid complete value: %s"
-msgstr "E180: –ณŒ๘‚ศ•โŠฎŽw’่‚ล‚ท: %s"
-
-#: ../ex_docmd.c:5225
-msgid "E468: Completion argument only allowed for custom completion"
-msgstr "E468: •โŠฎˆ๘”‚อƒJƒXƒ^ƒ€•โŠฎ‚ล‚ต‚ฉŽg—p‚ล‚ซ‚‚น‚๑"
-
-#: ../ex_docmd.c:5231
-msgid "E467: Custom completion requires a function argument"
-msgstr "E467: ƒJƒXƒ^ƒ€•โŠฎ‚ษ‚อˆ๘”‚ฦ‚ต‚ฤŠึ”‚ช•K—v‚ล‚ท"
-
-#: ../ex_docmd.c:5257
-#, c-format
-msgid "E185: Cannot find color scheme '%s'"
-msgstr "E185: ƒJƒ‰[ƒXƒL[ƒ€ '%s' ‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#: ../ex_docmd.c:5263
-msgid "Greetings, Vim user!"
-msgstr "Vim Žg‚ข‚ณ‚๑A‚โ‚ !"
-
-#: ../ex_docmd.c:5431
-msgid "E784: Cannot close last tab page"
-msgstr "E784: ลŒใ‚ฬƒ^ƒuƒy[ƒW‚๐•ย‚ถ‚้‚ฑ‚ฦ‚อ‚ล‚ซ‚‚น‚๑"
-
-#: ../ex_docmd.c:5462
-msgid "Already only one tab page"
-msgstr "Š๙‚ษƒ^ƒuƒy[ƒW‚อ1‚ย‚ต‚ฉ‚ ‚่‚‚น‚๑"
-
-#: ../ex_docmd.c:6004
-#, c-format
-msgid "Tab page %d"
-msgstr "ƒ^ƒuƒy[ƒW %d"
-
-#: ../ex_docmd.c:6295
-msgid "No swap file"
-msgstr "ƒXƒƒbƒvƒtƒ@ƒCƒ‹‚ช‚ ‚่‚‚น‚๑"
-
-#: ../ex_docmd.c:6478
-msgid "E747: Cannot change directory, buffer is modified (add ! to override)"
-msgstr ""
-"E747: ƒoƒbƒtƒ@‚ชCณ‚ณ‚๊‚ฤ‚ข‚้‚ฬ‚ล, ƒfƒBƒŒƒNƒgƒŠ‚๐•ฯX‚ล‚ซ‚‚น‚๑ (! ‚๐’ว‰ม‚ล"
-"ใ‘)"
-
-#: ../ex_docmd.c:6485
-msgid "E186: No previous directory"
-msgstr "E186: ‘O‚ฬƒfƒBƒŒƒNƒgƒŠ‚อ‚ ‚่‚‚น‚๑"
-
-#: ../ex_docmd.c:6530
-msgid "E187: Unknown"
-msgstr "E187: –ข’m"
-
-#: ../ex_docmd.c:6610
-msgid "E465: :winsize requires two number arguments"
-msgstr "E465: :winsize ‚ษ‚อ2‚ย‚ฬ”’l‚ฬˆ๘”‚ช•K—v‚ล‚ท"
-
-#: ../ex_docmd.c:6655
-msgid "E188: Obtaining window position not implemented for this platform"
-msgstr ""
-"E188: ‚ฑ‚ฬƒvƒ‰ƒbƒgƒz[ƒ€‚ษ‚อƒEƒBƒ“ƒhƒEˆส’u‚ฬŽๆ“พ‹@”\\‚อŽภ‘•‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../ex_docmd.c:6662
-msgid "E466: :winpos requires two number arguments"
-msgstr "E466: :winpos ‚ษ‚อ2‚ย‚ฬ”’l‚ฬˆ๘”‚ช•K—v‚ล‚ท"
-
-#: ../ex_docmd.c:7241
-#, c-format
-msgid "E739: Cannot create directory: %s"
-msgstr "E739: ƒfƒBƒŒƒNƒgƒŠ‚๐์ฌ‚ล‚ซ‚‚น‚๑: %s"
-
-#: ../ex_docmd.c:7268
-#, c-format
-msgid "E189: \"%s\" exists (add ! to override)"
-msgstr "E189: \"%s\" ‚ช‘ถ‚ต‚‚ท (ใ‘‚ท‚้‚ษ‚อ ! ‚๐’ว‰ม‚ต‚ฤ‚ญ‚พ‚ณ‚ข)"
-
-#: ../ex_docmd.c:7273
-#, c-format
-msgid "E190: Cannot open \"%s\" for writing"
-msgstr "E190: \"%s\" ‚๐‘ž‚—p‚ฦ‚ต‚ฤŠJ‚ฏ‚‚น‚๑"
-
-#. set mark
-#: ../ex_docmd.c:7294
-msgid "E191: Argument must be a letter or forward/backward quote"
-msgstr "E191: ˆ๘”‚อ1•ถŽš‚ฬ‰pŽš‚ฉˆ๘—p•„ (' ‚ฉ `) ‚ล‚ศ‚ฏ‚๊‚ฮ‚ข‚ฏ‚‚น‚๑"
-
-#: ../ex_docmd.c:7333
-msgid "E192: Recursive use of :normal too deep"
-msgstr "E192: :normal ‚ฬฤ‹A—˜—p‚ช[‚ญ‚ศ‚่‰฿‚ฌ‚‚ต‚ฝ"
-
-#: ../ex_docmd.c:7807
-msgid "E194: No alternate file name to substitute for '#'"
-msgstr "E194: '#'‚๐’u‚ซŠท‚ฆ‚้•›ƒtƒ@ƒCƒ‹‚ฬ–ผ‘O‚ช‚ ‚่‚‚น‚๑"
-
-#: ../ex_docmd.c:7841
-msgid "E495: no autocommand file name to substitute for \"<afile>\""
-msgstr "E495: \"<afile>\"‚๐’u‚ซŠท‚ฆ‚้autocommand‚ฬƒtƒ@ƒCƒ‹–ผ‚ช‚ ‚่‚‚น‚๑"
-
-#: ../ex_docmd.c:7850
-msgid "E496: no autocommand buffer number to substitute for \"<abuf>\""
-msgstr "E496: \"<abuf>\"‚๐’u‚ซŠท‚ฆ‚้autocommandƒoƒbƒtƒ@”ิ†‚ช‚ ‚่‚‚น‚๑"
-
-#: ../ex_docmd.c:7861
-msgid "E497: no autocommand match name to substitute for \"<amatch>\""
-msgstr "E497: \"<amatch>\"‚๐’u‚ซŠท‚ฆ‚้autocommand‚ฬŠY“––ผ‚ช‚ ‚่‚‚น‚๑"
-
-#: ../ex_docmd.c:7870
-msgid "E498: no :source file name to substitute for \"<sfile>\""
-msgstr "E498: \"<sfile>\"‚๐’u‚ซŠท‚ฆ‚้ :source ‘ฮƒtƒ@ƒCƒ‹–ผ‚ช‚ ‚่‚‚น‚๑"
-
-#: ../ex_docmd.c:7876
-msgid "E842: no line number to use for \"<slnum>\""
-msgstr "E842: \"<slnum>\"‚๐’u‚ซŠท‚ฆ‚้s”ิ†‚ช‚ ‚่‚‚น‚๑"
-
-#: ../ex_docmd.c:7903
-#, fuzzy, c-format
-msgid "E499: Empty file name for '%' or '#', only works with \":p:h\""
-msgstr ""
-"E499: '%' ‚โ '#' ‚ช–ณ–ผƒtƒ@ƒCƒ‹‚ศ‚ฬ‚ล \":p:h\" ‚๐”บ‚ํ‚ศ‚ขŽg‚ข•๛‚อ‚ล‚ซ‚‚น‚๑"
-
-#: ../ex_docmd.c:7905
-msgid "E500: Evaluates to an empty string"
-msgstr "E500: ‹๓•ถŽš—๑‚ฦ‚ต‚ฤ•]‰ฟ‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../ex_docmd.c:8838
-msgid "E195: Cannot open viminfo file for reading"
-msgstr "E195: viminfoƒtƒ@ƒCƒ‹‚๐“วž—p‚ฦ‚ต‚ฤŠJ‚ฏ‚‚น‚๑"
-
-#: ../ex_eval.c:464
-msgid "E608: Cannot :throw exceptions with 'Vim' prefix"
-msgstr "E608: 'Vim' ‚ลŽn‚‚้—แŠO‚อ :throw ‚ล‚ซ‚‚น‚๑"
-
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:496
-#, c-format
-msgid "Exception thrown: %s"
-msgstr "—แŠO‚ช”ญถ‚ต‚‚ต‚ฝ: %s"
-
-#: ../ex_eval.c:545
-#, c-format
-msgid "Exception finished: %s"
-msgstr "—แŠO‚ชŽ๛‘ฉ‚ต‚‚ต‚ฝ: %s"
-
-#: ../ex_eval.c:546
-#, c-format
-msgid "Exception discarded: %s"
-msgstr "—แŠO‚ช”jŠ‚ณ‚๊‚‚ต‚ฝ: %s"
-
-#: ../ex_eval.c:588 ../ex_eval.c:634
-#, c-format
-msgid "%s, line %<PRId64>"
-msgstr "%s, s %<PRId64>"
-
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:608
-#, c-format
-msgid "Exception caught: %s"
-msgstr "—แŠO‚ช•฿‘จ‚ณ‚๊‚‚ต‚ฝ: %s"
-
-#: ../ex_eval.c:676
-#, c-format
-msgid "%s made pending"
-msgstr "%s ‚ษ‚ๆ‚่–ขŒˆ’่๓‘ิ‚ชถ‚ถ‚‚ต‚ฝ"
-
-#: ../ex_eval.c:679
-#, c-format
-msgid "%s resumed"
-msgstr "%s ‚ชฤŠJ‚ต‚‚ต‚ฝ"
-
-#: ../ex_eval.c:683
-#, c-format
-msgid "%s discarded"
-msgstr "%s ‚ช”jŠ‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../ex_eval.c:708
-msgid "Exception"
-msgstr "—แŠO"
-
-#: ../ex_eval.c:713
-msgid "Error and interrupt"
-msgstr "ƒGƒ‰[‚ฦŠ„ž‚"
-
-#: ../ex_eval.c:715
-msgid "Error"
-msgstr "ƒGƒ‰["
-
-#. if (pending & CSTP_INTERRUPT)
-#: ../ex_eval.c:717
-msgid "Interrupt"
-msgstr "Š„ž‚"
-
-#: ../ex_eval.c:795
-msgid "E579: :if nesting too deep"
-msgstr "E579: :if ‚ฬ“‚๊Žq‚ช[‰฿‚ฌ‚‚ท"
-
-#: ../ex_eval.c:830
-msgid "E580: :endif without :if"
-msgstr "E580: :if ‚ฬ‚ศ‚ข :endif ‚ช‚ ‚่‚‚ท"
-
-#: ../ex_eval.c:873
-msgid "E581: :else without :if"
-msgstr "E581: :if ‚ฬ‚ศ‚ข :else ‚ช‚ ‚่‚‚ท"
-
-#: ../ex_eval.c:876
-msgid "E582: :elseif without :if"
-msgstr "E582: :if ‚ฬ‚ศ‚ข :elseif ‚ช‚ ‚่‚‚ท"
-
-#: ../ex_eval.c:880
-msgid "E583: multiple :else"
-msgstr "E583: •ก”‚ฬ :else ‚ช‚ ‚่‚‚ท"
-
-#: ../ex_eval.c:883
-msgid "E584: :elseif after :else"
-msgstr "E584: :else ‚ฬŒใ‚ษ :elseif ‚ช‚ ‚่‚‚ท"
-
-#: ../ex_eval.c:941
-msgid "E585: :while/:for nesting too deep"
-msgstr "E585: :while ‚โ :for ‚ฬ“‚๊Žq‚ช[‰฿‚ฌ‚‚ท"
-
-#: ../ex_eval.c:1028
-msgid "E586: :continue without :while or :for"
-msgstr "E586: :while ‚โ :for ‚ฬ‚ศ‚ข :continue ‚ช‚ ‚่‚‚ท"
-
-#: ../ex_eval.c:1061
-msgid "E587: :break without :while or :for"
-msgstr "E587: :while ‚โ :for ‚ฬ‚ศ‚ข :break ‚ช‚ ‚่‚‚ท"
-
-#: ../ex_eval.c:1102
-msgid "E732: Using :endfor with :while"
-msgstr "E732: :endfor ‚๐ :while ‚ฦ‘g‚‡‚ํ‚น‚ฤ‚ข‚‚ท"
-
-#: ../ex_eval.c:1104
-msgid "E733: Using :endwhile with :for"
-msgstr "E733: :endwhile ‚๐ :for ‚ฦ‘g‚‡‚ํ‚น‚ฤ‚ข‚‚ท"
-
-#: ../ex_eval.c:1247
-msgid "E601: :try nesting too deep"
-msgstr "E601: :try ‚ฬ“‚๊Žq‚ช[‰฿‚ฌ‚‚ท"
-
-#: ../ex_eval.c:1317
-msgid "E603: :catch without :try"
-msgstr "E603: :try ‚ฬ‚ศ‚ข :catch ‚ช‚ ‚่‚‚ท"
-
-#. Give up for a ":catch" after ":finally" and ignore it.
-#. * Just parse.
-#: ../ex_eval.c:1332
-msgid "E604: :catch after :finally"
-msgstr "E604: :finally ‚ฬŒใ‚ษ :catch ‚ช‚ ‚่‚‚ท"
-
-#: ../ex_eval.c:1451
-msgid "E606: :finally without :try"
-msgstr "E606: :try ‚ฬ‚ศ‚ข :finally ‚ช‚ ‚่‚‚ท"
-
-#. Give up for a multiple ":finally" and ignore it.
-#: ../ex_eval.c:1467
-msgid "E607: multiple :finally"
-msgstr "E607: •ก”‚ฬ :finally ‚ช‚ ‚่‚‚ท"
-
-#: ../ex_eval.c:1571
-msgid "E602: :endtry without :try"
-msgstr "E602: :try ‚ฬ‚ศ‚ข :endtry ‚ล‚ท"
-
-#: ../ex_eval.c:2026
-msgid "E193: :endfunction not inside a function"
-msgstr "E193: Šึ”‚ฬŠO‚ษ :endfunction ‚ช‚ ‚่‚‚ต‚ฝ"
-
-#: ../ex_getln.c:1643
-msgid "E788: Not allowed to edit another buffer now"
-msgstr "E788: Œป‚อ‘ผ‚ฬƒoƒbƒtƒ@‚๐•าW‚ท‚้‚ฑ‚ฦ‚อ‹–‚ณ‚๊‚‚น‚๑"
-
-#: ../ex_getln.c:1656
-msgid "E811: Not allowed to change buffer information now"
-msgstr "E811: Œป‚อƒoƒbƒtƒ@๎•๑‚๐•ฯX‚ท‚้‚ฑ‚ฦ‚อ‹–‚ณ‚๊‚‚น‚๑"
-
-#: ../ex_getln.c:3178
-msgid "tagname"
-msgstr "ƒ^ƒO–ผ"
-
-#: ../ex_getln.c:3181
-msgid " kind file\n"
-msgstr " ƒtƒ@ƒCƒ‹Žํ—\n"
-
-#: ../ex_getln.c:4799
-msgid "'history' option is zero"
-msgstr "ƒIƒvƒVƒ‡ƒ“ 'history' ‚ชƒ[ƒ‚ล‚ท"
-
-#: ../ex_getln.c:5046
-#, c-format
-msgid ""
-"\n"
-"# %s History (newest to oldest):\n"
-msgstr ""
-"\n"
-"# %s €–ฺ‚ฬ—š—๐ (V‚ต‚ข‚เ‚ฬ‚ฉ‚็Œร‚ข‚เ‚ฬ‚ึ):\n"
-
-#: ../ex_getln.c:5047
-msgid "Command Line"
-msgstr "ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“"
-
-#: ../ex_getln.c:5048
-msgid "Search String"
-msgstr "ŒŸ๕•ถŽš—๑"
-
-#: ../ex_getln.c:5049
-msgid "Expression"
-msgstr "Žฎ"
-
-#: ../ex_getln.c:5050
-msgid "Input Line"
-msgstr "“—อs"
-
-#: ../ex_getln.c:5117
-msgid "E198: cmd_pchar beyond the command length"
-msgstr "E198: cmd_pchar ‚ชƒRƒ}ƒ“ƒh’ท‚๐’ด‚ฆ‚‚ต‚ฝ"
-
-#: ../ex_getln.c:5279
-msgid "E199: Active window or buffer deleted"
-msgstr "E199: ƒAƒNƒeƒBƒu‚ศƒEƒBƒ“ƒhƒE‚ฉƒoƒbƒtƒ@‚ชํœ‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../file_search.c:203
-msgid "E854: path too long for completion"
-msgstr "E854: ƒpƒX‚ช’ท‰฿‚ฌ‚ฤ•โŠฎ‚ล‚ซ‚‚น‚๑"
-
-#: ../file_search.c:446
-#, c-format
-msgid ""
-"E343: Invalid path: '**[number]' must be at the end of the path or be "
-"followed by '%s'."
-msgstr ""
-"E343: –ณŒ๘‚ศƒpƒX‚ล‚ท: '**[”’l]' ‚อpath‚ฬลŒใ‚ฉ '%s' ‚ช‘ฑ‚ข‚ฤ‚ศ‚ข‚ฦ‚ข‚ฏ‚‚น"
-"‚๑."
-
-#: ../file_search.c:1505
-#, c-format
-msgid "E344: Can't find directory \"%s\" in cdpath"
-msgstr "E344: cdpath‚ษ‚อ \"%s\" ‚ฦ‚ข‚คƒtƒ@ƒCƒ‹‚ช‚ ‚่‚‚น‚๑"
-
-#: ../file_search.c:1508
-#, c-format
-msgid "E345: Can't find file \"%s\" in path"
-msgstr "E345: path‚ษ‚อ \"%s\" ‚ฦ‚ข‚คƒtƒ@ƒCƒ‹‚ช‚ ‚่‚‚น‚๑"
-
-#: ../file_search.c:1512
-#, c-format
-msgid "E346: No more directory \"%s\" found in cdpath"
-msgstr "E346: cdpath‚ษ‚อ‚ฑ‚๊ˆศใ \"%s\" ‚ฦ‚ข‚คƒtƒ@ƒCƒ‹‚ช‚ ‚่‚‚น‚๑"
-
-#: ../file_search.c:1515
-#, c-format
-msgid "E347: No more file \"%s\" found in path"
-msgstr "E347: ƒpƒX‚ษ‚อ‚ฑ‚๊ˆศใ \"%s\" ‚ฦ‚ข‚คƒtƒ@ƒCƒ‹‚ช‚ ‚่‚‚น‚๑"
-
-#: ../fileio.c:137
-msgid "E812: Autocommands changed buffer or buffer name"
-msgstr "E812: autocommand‚ชƒoƒbƒtƒ@‚ฉƒoƒbƒtƒ@–ผ‚๐•ฯX‚ต‚‚ต‚ฝ"
-
-#: ../fileio.c:368
-msgid "Illegal file name"
-msgstr "•sณ‚ศƒtƒ@ƒCƒ‹–ผ"
-
-#: ../fileio.c:395 ../fileio.c:476 ../fileio.c:2543 ../fileio.c:2578
-msgid "is a directory"
-msgstr "‚อƒfƒBƒŒƒNƒgƒŠ‚ล‚ท"
-
-#: ../fileio.c:397
-msgid "is not a file"
-msgstr "‚อƒtƒ@ƒCƒ‹‚ล‚อ‚ ‚่‚‚น‚๑"
-
-#: ../fileio.c:508 ../fileio.c:3522
-msgid "[New File]"
-msgstr "[Vƒtƒ@ƒCƒ‹]"
-
-#: ../fileio.c:511
-msgid "[New DIRECTORY]"
-msgstr "[V‹KƒfƒBƒŒƒNƒgƒŠ]"
-
-#: ../fileio.c:529 ../fileio.c:532
-msgid "[File too big]"
-msgstr "[ƒtƒ@ƒCƒ‹‰฿‘ๅ]"
-
-#: ../fileio.c:534
-msgid "[Permission Denied]"
-msgstr "[Œ Œภ‚ช‚ ‚่‚‚น‚๑]"
-
-#: ../fileio.c:653
-msgid "E200: *ReadPre autocommands made the file unreadable"
-msgstr "E200: *ReadPre autocommand ‚ชƒtƒ@ƒCƒ‹‚๐“วž•s‰ย‚ษ‚ต‚‚ต‚ฝ"
-
-#: ../fileio.c:655
-msgid "E201: *ReadPre autocommands must not change current buffer"
-msgstr "E201: *ReadPre autocommand ‚อŒป‚ฬƒoƒbƒtƒ@‚๐•ฯ‚ฆ‚็‚๊‚‚น‚๑"
-
-#: ../fileio.c:672
-msgid "Nvim: Reading from stdin...\n"
-msgstr "Vim: •W€“—อ‚ฉ‚็“วž’†...\n"
-
-#. Re-opening the original file failed!
-#: ../fileio.c:909
-msgid "E202: Conversion made file unreadable!"
-msgstr "E202: •ฯŠท‚ชƒtƒ@ƒCƒ‹‚๐“วž•s‰ย‚ษ‚ต‚‚ต‚ฝ"
-
-#. fifo or socket
-#: ../fileio.c:1782
-msgid "[fifo/socket]"
-msgstr "[FIFO/ƒ\\ƒPƒbƒg]"
-
-#. fifo
-#: ../fileio.c:1788
-msgid "[fifo]"
-msgstr "[FIFO]"
-
-#. or socket
-#: ../fileio.c:1794
-msgid "[socket]"
-msgstr "[ƒ\\ƒPƒbƒg]"
-
-#. or character special
-#: ../fileio.c:1801
-msgid "[character special]"
-msgstr "[ƒLƒƒƒ‰ƒNƒ^EƒfƒoƒCƒX]"
-
-#: ../fileio.c:1815
-msgid "[CR missing]"
-msgstr "[CR–ณ]"
-
-#: ../fileio.c:1819
-msgid "[long lines split]"
-msgstr "[’ทs•ชŠ„]"
-
-#: ../fileio.c:1823 ../fileio.c:3512
-msgid "[NOT converted]"
-msgstr "[–ข•ฯŠท]"
-
-#: ../fileio.c:1826 ../fileio.c:3515
-msgid "[converted]"
-msgstr "[•ฯŠทฯ]"
-
-#: ../fileio.c:1831
-#, c-format
-msgid "[CONVERSION ERROR in line %<PRId64>]"
-msgstr "[%<PRId64> s–ฺ‚ล•ฯŠทƒGƒ‰[]"
-
-#: ../fileio.c:1835
-#, c-format
-msgid "[ILLEGAL BYTE in line %<PRId64>]"
-msgstr "[%<PRId64> s–ฺ‚ฬ•sณ‚ศƒoƒCƒg]"
-
-#: ../fileio.c:1838
-msgid "[READ ERRORS]"
-msgstr "[“วžƒGƒ‰[]"
-
-#: ../fileio.c:2104
-msgid "Can't find temp file for conversion"
-msgstr "•ฯŠท‚ษ•K—v‚ศˆ๊Žžƒtƒ@ƒCƒ‹‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#: ../fileio.c:2110
-msgid "Conversion with 'charconvert' failed"
-msgstr "'charconvert' ‚ษ‚ๆ‚้•ฯŠท‚ชŽธ”s‚ต‚‚ต‚ฝ"
-
-#: ../fileio.c:2113
-msgid "can't read output of 'charconvert'"
-msgstr "'charconvert' ‚ฬo—อ‚๐“วž‚฿‚‚น‚๑‚ล‚ต‚ฝ"
-
-#: ../fileio.c:2437
-msgid "E676: No matching autocommands for acwrite buffer"
-msgstr "E676: acwriteƒoƒbƒtƒ@‚ฬŠY“–‚ท‚้autocommand‚อ‘ถ‚ต‚‚น‚๑"
-
-#: ../fileio.c:2466
-msgid "E203: Autocommands deleted or unloaded buffer to be written"
-msgstr "E203: •‘ถ‚ท‚้ƒoƒbƒtƒ@‚๐autocommand‚ชํœ‚ฉ‰๐•๚‚ต‚‚ต‚ฝ"
-
-#: ../fileio.c:2486
-msgid "E204: Autocommand changed number of lines in unexpected way"
-msgstr "E204: autocommand‚ช—\\Š๚‚น‚ส•๛–@‚ลs”‚๐•ฯX‚ต‚‚ต‚ฝ"
-
-#: ../fileio.c:2548 ../fileio.c:2565
-msgid "is not a file or writable device"
-msgstr "‚อƒtƒ@ƒCƒ‹‚ล‚เ‘ž‚‰ย”\\ƒfƒoƒCƒX‚ล‚เ‚ ‚่‚‚น‚๑"
-
-#: ../fileio.c:2601
-msgid "is read-only (add ! to override)"
-msgstr "‚อ“วž๊—p‚ล‚ท (‹ญง‘ž‚ษ‚อ ! ‚๐’ว‰ม)"
-
-#: ../fileio.c:2886
-msgid "E506: Can't write to backup file (add ! to override)"
-msgstr "E506: ƒoƒbƒNƒAƒbƒvƒtƒ@ƒCƒ‹‚๐•‘ถ‚ล‚ซ‚‚น‚๑ (! ‚๐’ว‰ม‚ล‹ญง•‘ถ)"
-
-#: ../fileio.c:2898
-msgid "E507: Close error for backup file (add ! to override)"
-msgstr ""
-"E507: ƒoƒbƒNƒAƒbƒvƒtƒ@ƒCƒ‹‚๐•ย‚ถ‚้‚ษƒGƒ‰[‚ช”ญถ‚ต‚‚ต‚ฝ (! ‚๐’ว‰ม‚ล‹ญง)"
-
-#: ../fileio.c:2901
-msgid "E508: Can't read file for backup (add ! to override)"
-msgstr "E508: ƒoƒbƒNƒAƒbƒv—pƒtƒ@ƒCƒ‹‚๐“วž‚฿‚‚น‚๑ (! ‚๐’ว‰ม‚ล‹ญง“วž)"
-
-#: ../fileio.c:2923
-msgid "E509: Cannot create backup file (add ! to override)"
-msgstr "E509: ƒoƒbƒNƒAƒbƒvƒtƒ@ƒCƒ‹‚๐์‚๊‚‚น‚๑ (! ‚๐’ว‰ม‚ล‹ญง์ฌ)"
-
-#: ../fileio.c:3008
-msgid "E510: Can't make backup file (add ! to override)"
-msgstr "E510: ƒoƒbƒNƒAƒbƒvƒtƒ@ƒCƒ‹‚๐์‚๊‚‚น‚๑ (! ‚๐’ว‰ม‚ล‹ญง์ฌ)"
-
-#. Can't write without a tempfile!
-#: ../fileio.c:3121
-msgid "E214: Can't find temp file for writing"
-msgstr "E214: •‘ถ—pˆ๊Žžƒtƒ@ƒCƒ‹‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#: ../fileio.c:3134
-msgid "E213: Cannot convert (add ! to write without conversion)"
-msgstr "E213: •ฯŠท‚ล‚ซ‚‚น‚๑ (! ‚๐’ว‰ม‚ล•ฯŠท‚น‚ธ‚ษ•‘ถ)"
-
-#: ../fileio.c:3169
-msgid "E166: Can't open linked file for writing"
-msgstr "E166: ƒŠƒ“ƒN‚ณ‚๊‚ฝƒtƒ@ƒCƒ‹‚ษ‘ž‚฿‚‚น‚๑"
-
-#: ../fileio.c:3173
-msgid "E212: Can't open file for writing"
-msgstr "E212: ‘ž‚—p‚ษƒtƒ@ƒCƒ‹‚๐ŠJ‚ฏ‚‚น‚๑"
-
-#: ../fileio.c:3363
-msgid "E667: Fsync failed"
-msgstr "E667: fsync ‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#: ../fileio.c:3398
-msgid "E512: Close failed"
-msgstr "E512: •ย‚ถ‚้‚ฑ‚ฦ‚ษŽธ”s"
-
-#: ../fileio.c:3436
-msgid "E513: write error, conversion failed (make 'fenc' empty to override)"
-msgstr "E513: ‘ž‚ƒGƒ‰[, •ฯŠทŽธ”s (ใ‘‚ท‚้‚ษ‚อ 'fenc' ‚๐‹๓‚ษ‚ต‚ฤ‚ญ‚พ‚ณ‚ข)"
-
-#: ../fileio.c:3441
-#, c-format
-msgid ""
-"E513: write error, conversion failed in line %<PRId64> (make 'fenc' empty to "
-"override)"
-msgstr ""
-"E513: ‘ž‚ƒGƒ‰[, •ฯŠทŽธ”s, s” %<PRId64> (ใ‘‚ท‚้‚ษ‚อ 'fenc' ‚๐‹๓‚ษ‚ต‚ฤ"
-"‚ญ‚พ‚ณ‚ข)"
-
-#: ../fileio.c:3448
-msgid "E514: write error (file system full?)"
-msgstr "E514: ‘ž‚ƒGƒ‰[, (ƒtƒ@ƒCƒ‹ƒVƒXƒeƒ€‚ช–ž”t?)"
-
-#: ../fileio.c:3506
-msgid " CONVERSION ERROR"
-msgstr " •ฯŠทƒGƒ‰["
-
-#: ../fileio.c:3509
-#, c-format
-msgid " in line %<PRId64>;"
-msgstr " s %<PRId64>;"
-
-#: ../fileio.c:3519
-msgid "[Device]"
-msgstr "[ƒfƒoƒCƒX]"
-
-#: ../fileio.c:3522
-msgid "[New]"
-msgstr "[V]"
-
-#: ../fileio.c:3535
-msgid " [a]"
-msgstr " [a]"
-
-#: ../fileio.c:3535
-msgid " appended"
-msgstr " ’ว‰ม"
-
-#: ../fileio.c:3537
-msgid " [w]"
-msgstr " [w]"
-
-#: ../fileio.c:3537
-msgid " written"
-msgstr " ‘ž‚"
-
-#: ../fileio.c:3579
-msgid "E205: Patchmode: can't save original file"
-msgstr "E205: patchmode: Œด–{ƒtƒ@ƒCƒ‹‚๐•‘ถ‚ล‚ซ‚‚น‚๑"
-
-#: ../fileio.c:3602
-msgid "E206: patchmode: can't touch empty original file"
-msgstr "E206: patchmode: ‹๓‚ฬŒด–{ƒtƒ@ƒCƒ‹‚๐touch‚ล‚ซ‚‚น‚๑"
-
-#: ../fileio.c:3616
-msgid "E207: Can't delete backup file"
-msgstr "E207: ƒoƒbƒNƒAƒbƒvƒtƒ@ƒCƒ‹‚๐ม‚น‚‚น‚๑"
-
-#: ../fileio.c:3672
-msgid ""
-"\n"
-"WARNING: Original file may be lost or damaged\n"
-msgstr ""
-"\n"
-"Œx: Œด–{ƒtƒ@ƒCƒ‹‚ชŽธ‚ํ‚๊‚ฝ‚ฉ•ฯX‚ณ‚๊‚‚ต‚ฝ\n"
-
-#: ../fileio.c:3675
-msgid "don't quit the editor until the file is successfully written!"
-msgstr "ƒtƒ@ƒCƒ‹‚ฬ•‘ถ‚ษฌŒ๗‚ท‚้‚‚ลƒGƒfƒBƒ^‚๐I—น‚ต‚ศ‚ข‚ล‚ญ‚พ‚ณ‚ข!"
-
-#: ../fileio.c:3795
-msgid "[dos]"
-msgstr "[dos]"
-
-#: ../fileio.c:3795
-msgid "[dos format]"
-msgstr "[dosƒtƒH[ƒ}ƒbƒg]"
-
-#: ../fileio.c:3801
-msgid "[mac]"
-msgstr "[mac]"
-
-#: ../fileio.c:3801
-msgid "[mac format]"
-msgstr "[macƒtƒH[ƒ}ƒbƒg]"
-
-#: ../fileio.c:3807
-msgid "[unix]"
-msgstr "[unix]"
-
-#: ../fileio.c:3807
-msgid "[unix format]"
-msgstr "[unixƒtƒH[ƒ}ƒbƒg]"
-
-#: ../fileio.c:3831
-msgid "1 line, "
-msgstr "1 s, "
-
-#: ../fileio.c:3833
-#, c-format
-msgid "%<PRId64> lines, "
-msgstr "%<PRId64> s, "
-
-#: ../fileio.c:3836
-msgid "1 character"
-msgstr "1 •ถŽš"
-
-#: ../fileio.c:3838
-#, c-format
-msgid "%<PRId64> characters"
-msgstr "%<PRId64> •ถŽš"
-
-#: ../fileio.c:3849
-msgid "[noeol]"
-msgstr "[noeol]"
-
-#: ../fileio.c:3849
-msgid "[Incomplete last line]"
-msgstr "[ลIs‚ช•sŠฎ‘S]"
-
-#. don't overwrite messages here
-#. must give this prompt
-#. don't use emsg() here, don't want to flush the buffers
-#: ../fileio.c:3865
-msgid "WARNING: The file has been changed since reading it!!!"
-msgstr "Œx: “วž‚๑‚พŒใ‚ษƒtƒ@ƒCƒ‹‚ษ•ฯX‚ช‚ ‚่‚‚ต‚ฝ!!!"
-
-#: ../fileio.c:3867
-msgid "Do you really want to write to it"
-msgstr "–{“–‚ษใ‘‚ซ‚ต‚‚ท‚ฉ"
-
-#: ../fileio.c:4648
-#, c-format
-msgid "E208: Error writing to \"%s\""
-msgstr "E208: \"%s\" ‚๐‘ž‚’†‚ฬƒGƒ‰[‚ล‚ท"
-
-#: ../fileio.c:4655
-#, c-format
-msgid "E209: Error closing \"%s\""
-msgstr "E209: \"%s\" ‚๐•ย‚ถ‚้Žž‚ษƒGƒ‰[‚ล‚ท"
-
-#: ../fileio.c:4657
-#, c-format
-msgid "E210: Error reading \"%s\""
-msgstr "E210: \"%s\" ‚๐“วž’†‚ฬƒGƒ‰[‚ล‚ท"
-
-#: ../fileio.c:4883
-msgid "E246: FileChangedShell autocommand deleted buffer"
-msgstr "E246: autocommand ‚ฬ FileChangedShell ‚ชƒoƒbƒtƒ@‚๐ํœ‚ต‚‚ต‚ฝ"
-
-#: ../fileio.c:4894
-#, c-format
-msgid "E211: File \"%s\" no longer available"
-msgstr "E211: ƒtƒ@ƒCƒ‹ \"%s\" ‚อŠ๙‚ษ‘ถ‚ต‚‚น‚๑"
-
-#: ../fileio.c:4906
-#, c-format
-msgid ""
-"W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as "
-"well"
-msgstr "W12: Œx: ƒtƒ@ƒCƒ‹ \"%s\" ‚ช•ฯX‚ณ‚๊Vim‚ฬƒoƒbƒtƒ@‚เ•ฯX‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../fileio.c:4907
-msgid "See \":help W12\" for more info."
-msgstr "ฺื‚อ \":help W12\" ‚๐ŽQฦ‚ต‚ฤ‚ญ‚พ‚ณ‚ข"
-
-#: ../fileio.c:4910
-#, c-format
-msgid "W11: Warning: File \"%s\" has changed since editing started"
-msgstr "W11: Œx: ƒtƒ@ƒCƒ‹ \"%s\" ‚อ•าWŠJŽnŒใ‚ษ•ฯX‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../fileio.c:4911
-msgid "See \":help W11\" for more info."
-msgstr "ฺื‚อ \":help W11\" ‚๐ŽQฦ‚ต‚ฤ‚ญ‚พ‚ณ‚ข"
-
-#: ../fileio.c:4914
-#, c-format
-msgid "W16: Warning: Mode of file \"%s\" has changed since editing started"
-msgstr "W16: Œx: ƒtƒ@ƒCƒ‹ \"%s\" ‚ฬƒ‚[ƒh‚ช•าWŠJŽnŒใ‚ษ•ฯX‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../fileio.c:4915
-msgid "See \":help W16\" for more info."
-msgstr "ฺื‚อ \":help W16\" ‚๐ŽQฦ‚ต‚ฤ‚ญ‚พ‚ณ‚ข"
-
-#: ../fileio.c:4927
-#, c-format
-msgid "W13: Warning: File \"%s\" has been created after editing started"
-msgstr "W13: Œx: ƒtƒ@ƒCƒ‹ \"%s\" ‚อ•าWŠJŽnŒใ‚ษ์ฌ‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../fileio.c:4947
-msgid "Warning"
-msgstr "Œx"
-
-#: ../fileio.c:4948
-msgid ""
-"&OK\n"
-"&Load File"
-msgstr ""
-"&OK\n"
-"ƒtƒ@ƒCƒ‹“วž(&L)"
-
-#: ../fileio.c:5065
-#, c-format
-msgid "E462: Could not prepare for reloading \"%s\""
-msgstr "E462: \"%s\" ‚๐ƒŠƒ[ƒh‚ท‚้€”๕‚ช‚ล‚ซ‚‚น‚๑‚ล‚ต‚ฝ"
-
-#: ../fileio.c:5078
-#, c-format
-msgid "E321: Could not reload \"%s\""
-msgstr "E321: \"%s\" ‚อƒŠƒ[ƒh‚ล‚ซ‚‚น‚๑‚ล‚ต‚ฝ"
-
-#: ../fileio.c:5601
-msgid "--Deleted--"
-msgstr "--ํœฯ--"
-
-#: ../fileio.c:5732
-#, c-format
-msgid "auto-removing autocommand: %s <buffer=%d>"
-msgstr "autocommand: %s <ƒoƒbƒtƒ@=%d> ‚ชŽฉ“ฎ“I‚ษํœ‚ณ‚๊‚‚ท"
-
-#. the group doesn't exist
-#: ../fileio.c:5772
-#, c-format
-msgid "E367: No such group: \"%s\""
-msgstr "E367: ‚ป‚ฬƒOƒ‹[ƒv‚อ‚ ‚่‚‚น‚๑: \"%s\""
-
-#: ../fileio.c:5897
-#, c-format
-msgid "E215: Illegal character after *: %s"
-msgstr "E215: * ‚ฬŒใ‚ษ•sณ‚ศ•ถŽš‚ช‚ ‚่‚‚ต‚ฝ: %s"
-
-#: ../fileio.c:5905
-#, c-format
-msgid "E216: No such event: %s"
-msgstr "E216: ‚ป‚ฬ‚ๆ‚ค‚ศƒCƒxƒ“ƒg‚อ‚ ‚่‚‚น‚๑: %s"
-
-#: ../fileio.c:5907
-#, c-format
-msgid "E216: No such group or event: %s"
-msgstr "E216: ‚ป‚ฬ‚ๆ‚ค‚ศƒOƒ‹[ƒv‚เ‚ต‚ญ‚อƒCƒxƒ“ƒg‚อ‚ ‚่‚‚น‚๑: %s"
-
-#. Highlight title
-#: ../fileio.c:6090
-msgid ""
-"\n"
-"--- Auto-Commands ---"
-msgstr ""
-"\n"
-"--- Auto-Commands ---"
-
-#: ../fileio.c:6293
-#, c-format
-msgid "E680: <buffer=%d>: invalid buffer number "
-msgstr "E680: <ƒoƒbƒtƒ@=%d>: –ณŒ๘‚ศƒoƒbƒtƒ@”ิ†‚ล‚ท "
-
-#: ../fileio.c:6370
-msgid "E217: Can't execute autocommands for ALL events"
-msgstr "E217: ‘S‚ฤ‚ฬƒCƒxƒ“ƒg‚ษ‘ฮ‚ต‚ฤ‚ฬautocommand‚อŽภs‚ล‚ซ‚‚น‚๑"
-
-#: ../fileio.c:6393
-msgid "No matching autocommands"
-msgstr "ŠY“–‚ท‚้autocommand‚อ‘ถ‚ต‚‚น‚๑"
-
-#: ../fileio.c:6831
-msgid "E218: autocommand nesting too deep"
-msgstr "E218: autocommand‚ฬ“‚๊Žq‚ช[‰฿‚ฌ‚‚ท"
-
-#: ../fileio.c:7143
-#, c-format
-msgid "%s Auto commands for \"%s\""
-msgstr "%s Auto commands for \"%s\""
-
-#: ../fileio.c:7149
-#, c-format
-msgid "Executing %s"
-msgstr "%s ‚๐Žภs‚ต‚ฤ‚ข‚‚ท"
-
-#: ../fileio.c:7211
-#, c-format
-msgid "autocommand %s"
-msgstr "autocommand %s"
-
-#: ../fileio.c:7795
-msgid "E219: Missing {."
-msgstr "E219: { ‚ช‚ ‚่‚‚น‚๑."
-
-#: ../fileio.c:7797
-msgid "E220: Missing }."
-msgstr "E220: } ‚ช‚ ‚่‚‚น‚๑."
-
-#: ../fold.c:93
-msgid "E490: No fold found"
-msgstr "E490: ๔‚‚ช‚ ‚่‚‚น‚๑"
-
-#: ../fold.c:544
-msgid "E350: Cannot create fold with current 'foldmethod'"
-msgstr "E350: Œป‚ฬ 'foldmethod' ‚ล‚อ๔‚‚๐์ฌ‚ล‚ซ‚‚น‚๑"
-
-#: ../fold.c:546
-msgid "E351: Cannot delete fold with current 'foldmethod'"
-msgstr "E351: Œป‚ฬ 'foldmethod' ‚ล‚อ๔‚‚๐ํœ‚ล‚ซ‚‚น‚๑"
-
-#: ../fold.c:1784
-#, c-format
-msgid "+--%3ld lines folded "
-msgstr "+--%3ld s‚ช๔‚‚๊‚‚ต‚ฝ "
-
-#. buffer has already been read
-#: ../getchar.c:273
-msgid "E222: Add to read buffer"
-msgstr "E222: “วžƒoƒbƒtƒ@‚ึ’ว‰ม"
-
-#: ../getchar.c:2040
-msgid "E223: recursive mapping"
-msgstr "E223: ฤ‹A“Iƒ}ƒbƒsƒ“ƒO"
-
-#: ../getchar.c:2849
-#, c-format
-msgid "E224: global abbreviation already exists for %s"
-msgstr "E224: %s ‚ฦ‚ข‚คƒOƒ[ƒoƒ‹’Zk“—อ‚อŠ๙‚ษ‘ถ‚ต‚‚ท"
-
-#: ../getchar.c:2852
-#, c-format
-msgid "E225: global mapping already exists for %s"
-msgstr "E225: %s ‚ฦ‚ข‚คƒOƒ[ƒoƒ‹ƒ}ƒbƒsƒ“ƒO‚อŠ๙‚ษ‘ถ‚ต‚‚ท"
-
-#: ../getchar.c:2952
-#, c-format
-msgid "E226: abbreviation already exists for %s"
-msgstr "E226: %s ‚ฦ‚ข‚ค’Zk“—อ‚อŠ๙‚ษ‘ถ‚ต‚‚ท"
-
-#: ../getchar.c:2955
-#, c-format
-msgid "E227: mapping already exists for %s"
-msgstr "E227: %s ‚ฦ‚ข‚คƒ}ƒbƒsƒ“ƒO‚อŠ๙‚ษ‘ถ‚ต‚‚ท"
-
-#: ../getchar.c:3008
-msgid "No abbreviation found"
-msgstr "’Zk“—อ‚อŒฉ‚ย‚ฉ‚่‚‚น‚๑‚ล‚ต‚ฝ"
-
-#: ../getchar.c:3010
-msgid "No mapping found"
-msgstr "ƒ}ƒbƒsƒ“ƒO‚อŒฉ‚ย‚ฉ‚่‚‚น‚๑‚ล‚ต‚ฝ"
-
-#: ../getchar.c:3974
-msgid "E228: makemap: Illegal mode"
-msgstr "E228: makemap: •sณ‚ศƒ‚[ƒh"
-
-#. key value of 'cedit' option
-#. type of cmdline window or 0
-#. result of cmdline window or 0
-#: ../globals.h:924
-msgid "--No lines in buffer--"
-msgstr "--ƒoƒbƒtƒ@‚ษs‚ช‚ ‚่‚‚น‚๑--"
-
-#.
-#. * The error messages that can be shared are included here.
-#. * Excluded are errors that are only used once and debugging messages.
-#.
-#: ../globals.h:996
-msgid "E470: Command aborted"
-msgstr "E470: ƒRƒ}ƒ“ƒh‚ช’†’f‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../globals.h:997
-msgid "E471: Argument required"
-msgstr "E471: ˆ๘”‚ช•K—v‚ล‚ท"
-
-#: ../globals.h:998
-msgid "E10: \\ should be followed by /, ? or &"
-msgstr "E10: \\ ‚ฬŒใ‚อ / ‚ฉ ? ‚ฉ & ‚ล‚ศ‚ฏ‚๊‚ฮ‚ศ‚่‚‚น‚๑"
-
-#: ../globals.h:1000
-msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
-msgstr "E11: ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“‚ล‚อ–ณŒ๘‚ล‚ท; <CR>‚ลŽภs, CTRL-C‚ล‚โ‚฿‚้"
-
-#: ../globals.h:1002
-msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
-msgstr ""
-"E12: Œป‚ฬƒfƒBƒŒƒNƒgƒŠ‚โƒ^ƒOŒŸ๕‚ล‚อexrc/vimrc‚ฬƒRƒ}ƒ“ƒh‚อ‹–‰ย‚ณ‚๊‚‚น‚๑"
-
-#: ../globals.h:1003
-msgid "E171: Missing :endif"
-msgstr "E171: :endif ‚ช‚ ‚่‚‚น‚๑"
-
-#: ../globals.h:1004
-msgid "E600: Missing :endtry"
-msgstr "E600: :endtry ‚ช‚ ‚่‚‚น‚๑"
-
-#: ../globals.h:1005
-msgid "E170: Missing :endwhile"
-msgstr "E170: :endwhile ‚ช‚ ‚่‚‚น‚๑"
-
-#: ../globals.h:1006
-msgid "E170: Missing :endfor"
-msgstr "E170: :endfor ‚ช‚ ‚่‚‚น‚๑"
-
-#: ../globals.h:1007
-msgid "E588: :endwhile without :while"
-msgstr "E588: :while ‚ฬ‚ศ‚ข :endwhile ‚ช‚ ‚่‚‚ท"
-
-#: ../globals.h:1008
-msgid "E588: :endfor without :for"
-msgstr "E588: :endfor ‚ฬ‚ศ‚ข :for ‚ช‚ ‚่‚‚ท"
-
-#: ../globals.h:1009
-msgid "E13: File exists (add ! to override)"
-msgstr "E13: ƒtƒ@ƒCƒ‹‚ช‘ถ‚ต‚‚ท (! ‚๐’ว‰ม‚ลใ‘)"
-
-#: ../globals.h:1010
-msgid "E472: Command failed"
-msgstr "E472: ƒRƒ}ƒ“ƒh‚ชŽธ”s‚ต‚‚ต‚ฝ"
-
-#: ../globals.h:1011
-msgid "E473: Internal error"
-msgstr "E473: “เ•”ƒGƒ‰[‚ล‚ท"
-
-#: ../globals.h:1012
-msgid "Interrupted"
-msgstr "Š„ž‚‚๊‚‚ต‚ฝ"
-
-#: ../globals.h:1013
-msgid "E14: Invalid address"
-msgstr "E14: –ณŒ๘‚ศƒAƒhƒŒƒX‚ล‚ท"
-
-#: ../globals.h:1014
-msgid "E474: Invalid argument"
-msgstr "E474: –ณŒ๘‚ศˆ๘”‚ล‚ท"
-
-#: ../globals.h:1015
-#, c-format
-msgid "E475: Invalid argument: %s"
-msgstr "E475: –ณŒ๘‚ศˆ๘”‚ล‚ท: %s"
-
-#: ../globals.h:1016
-#, c-format
-msgid "E15: Invalid expression: %s"
-msgstr "E15: –ณŒ๘‚ศŽฎ‚ล‚ท: %s"
-
-#: ../globals.h:1017
-msgid "E16: Invalid range"
-msgstr "E16: –ณŒ๘‚ศ”อˆอ‚ล‚ท"
-
-#: ../globals.h:1018
-msgid "E476: Invalid command"
-msgstr "E476: –ณŒ๘‚ศƒRƒ}ƒ“ƒh‚ล‚ท"
-
-#: ../globals.h:1019
-#, c-format
-msgid "E17: \"%s\" is a directory"
-msgstr "E17: \"%s\" ‚อƒfƒBƒŒƒNƒgƒŠ‚ล‚ท"
-
-#: ../globals.h:1020
-#, fuzzy
-msgid "E900: Invalid job id"
-msgstr "E49: –ณŒ๘‚ศƒXƒNƒ[ƒ‹—ส‚ล‚ท"
-
-#: ../globals.h:1021
-msgid "E901: Job table is full"
-msgstr ""
-
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
-#: ../globals.h:1024
-#, c-format
-msgid "E364: Library call failed for \"%s()\""
-msgstr "E364: \"%s\"() ‚ฬƒ‰ƒCƒuƒ‰ƒŠŒฤo‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#: ../globals.h:1026
-msgid "E19: Mark has invalid line number"
-msgstr "E19: ƒ}[ƒN‚ษ–ณŒ๘‚ศs”ิ†‚ชŽw’่‚ณ‚๊‚ฤ‚ข‚‚ต‚ฝ"
-
-#: ../globals.h:1027
-msgid "E20: Mark not set"
-msgstr "E20: ƒ}[ƒN‚อ’่‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../globals.h:1029
-msgid "E21: Cannot make changes, 'modifiable' is off"
-msgstr "E21: 'modifiable' ‚ชƒIƒt‚ศ‚ฬ‚ล, •ฯX‚ล‚ซ‚‚น‚๑"
-
-#: ../globals.h:1030
-msgid "E22: Scripts nested too deep"
-msgstr "E22: ƒXƒNƒŠƒvƒg‚ฬ“‚๊Žq‚ช[‰฿‚ฌ‚‚ท"
-
-#: ../globals.h:1031
-msgid "E23: No alternate file"
-msgstr "E23: •›ƒtƒ@ƒCƒ‹‚อ‚ ‚่‚‚น‚๑"
-
-#: ../globals.h:1032
-msgid "E24: No such abbreviation"
-msgstr "E24: ‚ป‚ฬ‚ๆ‚ค‚ศ’Zk“—อ‚อ‚ ‚่‚‚น‚๑"
-
-#: ../globals.h:1033
-msgid "E477: No ! allowed"
-msgstr "E477: ! ‚อ‹–‰ย‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../globals.h:1035
-msgid "E25: Nvim does not have a built-in GUI"
-msgstr "E25: GUI‚อŽg—p•s‰ย”\\‚ล‚ท: ƒRƒ“ƒpƒCƒ‹Žž‚ษ–ณŒ๘‚ษ‚ณ‚๊‚ฤ‚ข‚‚ท"
-
-#: ../globals.h:1036
-#, c-format
-msgid "E28: No such highlight group name: %s"
-msgstr "E28: ‚ป‚ฬ‚ๆ‚ค‚ศ–ผ‚ฬƒnƒCƒ‰ƒCƒgƒOƒ‹[ƒv‚อ‚ ‚่‚‚น‚๑: %s"
-
-#: ../globals.h:1037
-msgid "E29: No inserted text yet"
-msgstr "E29: ‚‚พƒeƒLƒXƒg‚ช‘}“‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../globals.h:1038
-msgid "E30: No previous command line"
-msgstr "E30: ˆศ‘O‚ษƒRƒ}ƒ“ƒhs‚ช‚ ‚่‚‚น‚๑"
-
-#: ../globals.h:1039
-msgid "E31: No such mapping"
-msgstr "E31: ‚ป‚ฬ‚ๆ‚ค‚ศƒ}ƒbƒsƒ“ƒO‚อ‚ ‚่‚‚น‚๑"
-
-#: ../globals.h:1040
-msgid "E479: No match"
-msgstr "E479: ŠY“–‚อ‚ ‚่‚‚น‚๑"
-
-#: ../globals.h:1041
-#, c-format
-msgid "E480: No match: %s"
-msgstr "E480: ŠY“–‚อ‚ ‚่‚‚น‚๑: %s"
-
-#: ../globals.h:1042
-msgid "E32: No file name"
-msgstr "E32: ƒtƒ@ƒCƒ‹–ผ‚ช‚ ‚่‚‚น‚๑"
-
-#: ../globals.h:1044
-msgid "E33: No previous substitute regular expression"
-msgstr "E33: ณ‹K•\\Œป’uŠท‚ช‚‚พŽภs‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../globals.h:1045
-msgid "E34: No previous command"
-msgstr "E34: ƒRƒ}ƒ“ƒh‚ช‚‚พŽภs‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../globals.h:1046
-msgid "E35: No previous regular expression"
-msgstr "E35: ณ‹K•\\Œป‚ช‚‚พŽภs‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../globals.h:1047
-msgid "E481: No range allowed"
-msgstr "E481: ”อˆอŽw’่‚อ‹–‰ย‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../globals.h:1048
-msgid "E36: Not enough room"
-msgstr "E36: ƒEƒBƒ“ƒhƒE‚ษ\\•ช‚ศ‚‚ณ‚เ‚ต‚ญ‚อ•‚ช‚ ‚่‚‚น‚๑"
-
-#: ../globals.h:1049
-#, c-format
-msgid "E482: Can't create file %s"
-msgstr "E482: ƒtƒ@ƒCƒ‹ %s ‚๐์ฌ‚ล‚ซ‚‚น‚๑"
-
-#: ../globals.h:1050
-msgid "E483: Can't get temp file name"
-msgstr "E483: ˆ๊Žžƒtƒ@ƒCƒ‹‚ฬ–ผ‘O‚๐Žๆ“พ‚ล‚ซ‚‚น‚๑"
-
-#: ../globals.h:1051
-#, c-format
-msgid "E484: Can't open file %s"
-msgstr "E484: ƒtƒ@ƒCƒ‹ \"%s\" ‚๐ŠJ‚ฏ‚‚น‚๑"
-
-#: ../globals.h:1052
-#, c-format
-msgid "E485: Can't read file %s"
-msgstr "E485: ƒtƒ@ƒCƒ‹ %s ‚๐“วž‚฿‚‚น‚๑"
-
-#: ../globals.h:1054
-msgid "E37: No write since last change (add ! to override)"
-msgstr "E37: ลŒใ‚ฬ•ฯX‚ช•‘ถ‚ณ‚๊‚ฤ‚ข‚‚น‚๑ (! ‚๐’ว‰ม‚ล•ฯX‚๐”jŠ)"
-
-#: ../globals.h:1055
-msgid "E37: No write since last change"
-msgstr "E37: ลŒใ‚ฬ•ฯX‚ช•‘ถ‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../globals.h:1056
-msgid "E38: Null argument"
-msgstr "E38: ˆ๘”‚ช‹๓‚ล‚ท"
-
-#: ../globals.h:1057
-msgid "E39: Number expected"
-msgstr "E39: ”’l‚ช—v‹‚ณ‚๊‚ฤ‚ข‚‚ท"
-
-#: ../globals.h:1058
-#, c-format
-msgid "E40: Can't open errorfile %s"
-msgstr "E40: ƒGƒ‰[ƒtƒ@ƒCƒ‹ %s ‚๐ŠJ‚ฏ‚‚น‚๑"
-
-#: ../globals.h:1059
-msgid "E41: Out of memory!"
-msgstr "E41: ƒƒ‚ƒŠ‚ชs‚ซ‰ส‚ฤ‚‚ต‚ฝ!"
-
-#: ../globals.h:1060
-msgid "Pattern not found"
-msgstr "ƒpƒ^[ƒ“‚อŒฉ‚ย‚ฉ‚่‚‚น‚๑‚ล‚ต‚ฝ"
-
-#: ../globals.h:1061
-#, c-format
-msgid "E486: Pattern not found: %s"
-msgstr "E486: ƒpƒ^[ƒ“‚อŒฉ‚ย‚ฉ‚่‚‚น‚๑‚ล‚ต‚ฝ: %s"
-
-#: ../globals.h:1062
-msgid "E487: Argument must be positive"
-msgstr "E487: ˆ๘”‚อณ‚ฬ’l‚ล‚ศ‚ฏ‚๊‚ฮ‚ศ‚่‚‚น‚๑"
-
-#: ../globals.h:1064
-msgid "E459: Cannot go back to previous directory"
-msgstr "E459: ‘O‚ฬƒfƒBƒŒƒNƒgƒŠ‚ษ–฿‚๊‚‚น‚๑"
-
-#: ../globals.h:1066
-msgid "E42: No Errors"
-msgstr "E42: ƒGƒ‰[‚อ‚ ‚่‚‚น‚๑"
-
-#: ../globals.h:1067
-msgid "E776: No location list"
-msgstr "E776: ƒƒP[ƒVƒ‡ƒ“ƒŠƒXƒg‚อ‚ ‚่‚‚น‚๑"
-
-#: ../globals.h:1068
-msgid "E43: Damaged match string"
-msgstr "E43: ŠY“–•ถŽš—๑‚ช”j‘น‚ต‚ฤ‚ข‚‚ท"
-
-#: ../globals.h:1069
-msgid "E44: Corrupted regexp program"
-msgstr "E44: •sณ‚ศณ‹K•\\ŒปƒvƒƒOƒ‰ƒ€‚ล‚ท"
-
-#: ../globals.h:1071
-msgid "E45: 'readonly' option is set (add ! to override)"
-msgstr "E45: 'readonly' ƒIƒvƒVƒ‡ƒ“‚ช’่‚ณ‚๊‚ฤ‚ข‚‚ท (! ‚๐’ว‰ม‚ลใ‘‚ซ)"
-
-#: ../globals.h:1073
-#, c-format
-msgid "E46: Cannot change read-only variable \"%s\""
-msgstr "E46: “วŽๆ๊—p•ฯ” \"%s\" ‚ษ‚อ’l‚๐’่‚ล‚ซ‚‚น‚๑"
-
-#: ../globals.h:1075
-#, c-format
-msgid "E794: Cannot set variable in the sandbox: \"%s\""
-msgstr "E794: ƒTƒ“ƒhƒ{ƒbƒNƒX‚ล‚อ•ฯ” \"%s\" ‚ษ’l‚๐’่‚ล‚ซ‚‚น‚๑"
-
-#: ../globals.h:1076
-msgid "E47: Error while reading errorfile"
-msgstr "E47: ƒGƒ‰[ƒtƒ@ƒCƒ‹‚ฬ“วž’†‚ษƒGƒ‰[‚ช”ญถ‚ต‚‚ต‚ฝ"
-
-#: ../globals.h:1078
-msgid "E48: Not allowed in sandbox"
-msgstr "E48: ƒTƒ“ƒhƒ{ƒbƒNƒX‚ล‚อ‹–‚ณ‚๊‚‚น‚๑"
-
-#: ../globals.h:1080
-msgid "E523: Not allowed here"
-msgstr "E523: ‚ฑ‚ฑ‚ล‚อ‹–‰ย‚ณ‚๊‚‚น‚๑"
-
-#: ../globals.h:1082
-msgid "E359: Screen mode setting not supported"
-msgstr "E359: ƒXƒNƒŠ[ƒ“ƒ‚[ƒh‚ฬ’่‚ษ‚อ‘ฮ‰ž‚ต‚ฤ‚ข‚‚น‚๑"
-
-#: ../globals.h:1083
-msgid "E49: Invalid scroll size"
-msgstr "E49: –ณŒ๘‚ศƒXƒNƒ[ƒ‹—ส‚ล‚ท"
-
-#: ../globals.h:1084
-msgid "E91: 'shell' option is empty"
-msgstr "E91: 'shell' ƒIƒvƒVƒ‡ƒ“‚ช‹๓‚ล‚ท"
-
-#: ../globals.h:1085
-msgid "E255: Couldn't read in sign data!"
-msgstr "E255: sign ‚ฬƒf[ƒ^‚๐“วž‚฿‚‚น‚๑‚ล‚ต‚ฝ"
-
-#: ../globals.h:1086
-msgid "E72: Close error on swap file"
-msgstr "E72: ƒXƒƒbƒvƒtƒ@ƒCƒ‹‚ฬƒNƒ[ƒYŽžƒGƒ‰[‚ล‚ท"
-
-#: ../globals.h:1087
-msgid "E73: tag stack empty"
-msgstr "E73: ƒ^ƒOƒXƒ^ƒbƒN‚ช‹๓‚ล‚ท"
-
-#: ../globals.h:1088
-msgid "E74: Command too complex"
-msgstr "E74: ƒRƒ}ƒ“ƒh‚ช•กŽG‰฿‚ฌ‚‚ท"
-
-#: ../globals.h:1089
-msgid "E75: Name too long"
-msgstr "E75: –ผ‘O‚ช’ท‰฿‚ฌ‚‚ท"
-
-#: ../globals.h:1090
-msgid "E76: Too many ["
-msgstr "E76: [ ‚ช‘ฝ‰฿‚ฌ‚‚ท"
-
-#: ../globals.h:1091
-msgid "E77: Too many file names"
-msgstr "E77: ƒtƒ@ƒCƒ‹–ผ‚ช‘ฝ‰฿‚ฌ‚‚ท"
-
-#: ../globals.h:1092
-msgid "E488: Trailing characters"
-msgstr "E488: —]•ช‚ศ•ถŽš‚ชŒใ‚๋‚ษ‚ ‚่‚‚ท"
-
-#: ../globals.h:1093
-msgid "E78: Unknown mark"
-msgstr "E78: –ข’m‚ฬƒ}[ƒN"
-
-#: ../globals.h:1094
-msgid "E79: Cannot expand wildcards"
-msgstr "E79: ƒƒCƒ‹ƒhƒJ[ƒh‚๐“WŠJ‚ล‚ซ‚‚น‚๑"
-
-#: ../globals.h:1096
-msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
-msgstr "E591: 'winheight' ‚อ 'winminheight' ‚ๆ‚่ฌ‚ณ‚ญ‚ล‚ซ‚‚น‚๑"
-
-#: ../globals.h:1098
-msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
-msgstr "E592: 'winwidth' ‚อ 'winminwidth' ‚ๆ‚่ฌ‚ณ‚ญ‚ล‚ซ‚‚น‚๑"
-
-#: ../globals.h:1099
-msgid "E80: Error while writing"
-msgstr "E80: ‘ž‚’†‚ฬƒGƒ‰["
-
-#: ../globals.h:1100
-msgid "Zero count"
-msgstr "ƒ[ƒƒJƒEƒ“ƒg"
-
-#: ../globals.h:1101
-msgid "E81: Using <SID> not in a script context"
-msgstr "E81: ƒXƒNƒŠƒvƒgˆศŠO‚ล<SID>‚ชŽg‚ํ‚๊‚‚ต‚ฝ"
-
-#: ../globals.h:1102
-#, c-format
-msgid "E685: Internal error: %s"
-msgstr "E685: “เ•”ƒGƒ‰[‚ล‚ท: %s"
-
-#: ../globals.h:1104
-msgid "E363: pattern uses more memory than 'maxmempattern'"
-msgstr "E363: ƒpƒ^[ƒ“‚ช 'maxmempattern' ˆศใ‚ฬƒƒ‚ƒŠ‚๐Žg—p‚ต‚‚ท"
-
-#: ../globals.h:1105
-msgid "E749: empty buffer"
-msgstr "E749: ƒoƒbƒtƒ@‚ช‹๓‚ล‚ท"
-
-#, c-format
-msgid "E86: Buffer %ld does not exist"
-msgstr "E86: ƒoƒbƒtƒ@ %ld ‚อ‚ ‚่‚‚น‚๑"
-
-#: ../globals.h:1108
-msgid "E682: Invalid search pattern or delimiter"
-msgstr "E682: ŒŸ๕ƒpƒ^[ƒ“‚ฉ‹ๆุ‚่‹L†‚ช•sณ‚ล‚ท"
-
-#: ../globals.h:1109
-msgid "E139: File is loaded in another buffer"
-msgstr "E139: “ฏ‚ถ–ผ‘O‚ฬƒtƒ@ƒCƒ‹‚ช‘ผ‚ฬƒoƒbƒtƒ@‚ล“วž‚‚๊‚ฤ‚ข‚‚ท"
-
-#: ../globals.h:1110
-#, c-format
-msgid "E764: Option '%s' is not set"
-msgstr "E764: ƒIƒvƒVƒ‡ƒ“ '%s' ‚อ’่‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../globals.h:1111
-msgid "E850: Invalid register name"
-msgstr "E850: –ณŒ๘‚ศƒŒƒWƒXƒ^–ผ‚ล‚ท"
-
-#: ../globals.h:1114
-msgid "search hit TOP, continuing at BOTTOM"
-msgstr "ใ‚‚ลŒŸ๕‚ต‚ฝ‚ฬ‚ล‰บ‚ษ–฿‚่‚‚ท"
-
-#: ../globals.h:1115
-msgid "search hit BOTTOM, continuing at TOP"
-msgstr "‰บ‚‚ลŒŸ๕‚ต‚ฝ‚ฬ‚ลใ‚ษ–฿‚่‚‚ท"
-
-#: ../hardcopy.c:240
-msgid "E550: Missing colon"
-msgstr "E550: ƒRƒƒ“‚ช‚ ‚่‚‚น‚๑"
-
-#: ../hardcopy.c:252
-msgid "E551: Illegal component"
-msgstr "E551: •sณ‚ศ\\•ถ—v‘f‚ล‚ท"
-
-#: ../hardcopy.c:259
-msgid "E552: digit expected"
-msgstr "E552: ”’l‚ช•K—v‚ล‚ท"
-
-#: ../hardcopy.c:473
-#, c-format
-msgid "Page %d"
-msgstr "%d ƒy[ƒW"
-
-#: ../hardcopy.c:597
-msgid "No text to be printed"
-msgstr "ˆ๓‚ท‚้ƒeƒLƒXƒg‚ช‚ ‚่‚‚น‚๑"
-
-#: ../hardcopy.c:668
-#, c-format
-msgid "Printing page %d (%d%%)"
-msgstr "ˆ๓’†: ƒy[ƒW %d (%d%%)"
-
-#: ../hardcopy.c:680
-#, c-format
-msgid " Copy %d of %d"
-msgstr " ƒRƒs[ %d (‘S %d ’†)"
-
-#: ../hardcopy.c:733
-#, c-format
-msgid "Printed: %s"
-msgstr "ˆ๓‚ต‚‚ต‚ฝ: %s"
-
-#: ../hardcopy.c:740
-msgid "Printing aborted"
-msgstr "ˆ๓‚ช’†Ž~‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../hardcopy.c:1365
-msgid "E455: Error writing to PostScript output file"
-msgstr "E455: PostScripto—อƒtƒ@ƒCƒ‹‚ฬ‘ž‚ƒGƒ‰[‚ล‚ท"
-
-#: ../hardcopy.c:1747
-#, c-format
-msgid "E624: Can't open file \"%s\""
-msgstr "E624: ƒtƒ@ƒCƒ‹ \"%s\" ‚๐ŠJ‚ฏ‚‚น‚๑"
-
-#: ../hardcopy.c:1756 ../hardcopy.c:2470
-#, c-format
-msgid "E457: Can't read PostScript resource file \"%s\""
-msgstr "E457: PostScript‚ฬƒŠƒ\\[ƒXƒtƒ@ƒCƒ‹ \"%s\" ‚๐“วž‚฿‚‚น‚๑"
-
-#: ../hardcopy.c:1772
-#, c-format
-msgid "E618: file \"%s\" is not a PostScript resource file"
-msgstr "E618: ƒtƒ@ƒCƒ‹ \"%s\" ‚อ PostScript ƒŠƒ\\[ƒXƒtƒ@ƒCƒ‹‚ล‚อ‚ ‚่‚‚น‚๑"
-
-#: ../hardcopy.c:1788 ../hardcopy.c:1805 ../hardcopy.c:1844
-#, c-format
-msgid "E619: file \"%s\" is not a supported PostScript resource file"
-msgstr "E619: ƒtƒ@ƒCƒ‹ \"%s\" ‚อ‘ฮ‰ž‚ต‚ฤ‚ข‚ศ‚ข PostScript ƒŠƒ\\[ƒXƒtƒ@ƒCƒ‹‚ล‚ท"
-
-#: ../hardcopy.c:1856
-#, c-format
-msgid "E621: \"%s\" resource file has wrong version"
-msgstr "E621: ƒŠƒ\\[ƒXƒtƒ@ƒCƒ‹ \"%s\" ‚อƒo[ƒWƒ‡ƒ“‚ชˆู‚ศ‚่‚‚ท"
-
-#: ../hardcopy.c:2225
-msgid "E673: Incompatible multi-byte encoding and character set."
-msgstr "E673: ŒŠทซ‚ฬ–ณ‚ขƒ}ƒ‹ƒ`ƒoƒCƒgƒGƒ“ƒR[ƒfƒBƒ“ƒO‚ฦ•ถŽšƒZƒbƒg‚ล‚ท"
-
-#: ../hardcopy.c:2238
-msgid "E674: printmbcharset cannot be empty with multi-byte encoding."
-msgstr "E674: ƒ}ƒ‹ƒ`ƒoƒCƒgƒGƒ“ƒR[ƒfƒBƒ“ƒO‚ล‚อ printmbcharset ‚๐‹๓‚ษ‚ล‚ซ‚‚น‚๑"
-
-#: ../hardcopy.c:2254
-msgid "E675: No default font specified for multi-byte printing."
-msgstr ""
-"E675: ƒ}ƒ‹ƒ`ƒoƒCƒg•ถŽš‚๐ˆ๓‚ท‚้‚ฝ‚฿‚ฬƒfƒtƒHƒ‹ƒgƒtƒHƒ“ƒg‚ชŽw’่‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../hardcopy.c:2426
-msgid "E324: Can't open PostScript output file"
-msgstr "E324: PostScripto—อ—p‚ฬƒtƒ@ƒCƒ‹‚๐ŠJ‚ฏ‚‚น‚๑"
-
-#: ../hardcopy.c:2458
-#, c-format
-msgid "E456: Can't open file \"%s\""
-msgstr "E456: ƒtƒ@ƒCƒ‹ \"%s\" ‚๐ŠJ‚ฏ‚‚น‚๑"
-
-#: ../hardcopy.c:2583
-msgid "E456: Can't find PostScript resource file \"prolog.ps\""
-msgstr "E456: PostScript‚ฬƒŠƒ\\[ƒXƒtƒ@ƒCƒ‹ \"prolog.ps\" ‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#: ../hardcopy.c:2593
-msgid "E456: Can't find PostScript resource file \"cidfont.ps\""
-msgstr "E456: PostScript‚ฬƒŠƒ\\[ƒXƒtƒ@ƒCƒ‹ \"cidfont.ps\" ‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#: ../hardcopy.c:2622 ../hardcopy.c:2639 ../hardcopy.c:2665
-#, c-format
-msgid "E456: Can't find PostScript resource file \"%s.ps\""
-msgstr "E456: PostScript‚ฬƒŠƒ\\[ƒXƒtƒ@ƒCƒ‹ \"%s.ps\" ‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#: ../hardcopy.c:2654
-#, c-format
-msgid "E620: Unable to convert to print encoding \"%s\""
-msgstr "E620: ˆ๓ƒGƒ“ƒR[ƒh \"%s\" ‚ึ•ฯŠท‚ล‚ซ‚‚น‚๑"
-
-#: ../hardcopy.c:2877
-msgid "Sending to printer..."
-msgstr "ƒvƒŠƒ“ƒ^‚ษ‘—M’†..."
-
-#: ../hardcopy.c:2881
-msgid "E365: Failed to print PostScript file"
-msgstr "E365: PostScriptƒtƒ@ƒCƒ‹‚ฬˆ๓‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#: ../hardcopy.c:2883
-msgid "Print job sent."
-msgstr "ˆ๓ƒWƒ‡ƒu‚๐‘—M‚ต‚‚ต‚ฝ."
-
-#: ../if_cscope.c:85
-msgid "Add a new database"
-msgstr "Vƒf[ƒ^ƒx[ƒX‚๐’ว‰ม"
-
-#: ../if_cscope.c:87
-msgid "Query for a pattern"
-msgstr "ƒpƒ^[ƒ“‚ฬƒNƒGƒŠ[‚๐’ว‰ม"
-
-#: ../if_cscope.c:89
-msgid "Show this message"
-msgstr "‚ฑ‚ฬƒƒbƒZ[ƒW‚๐•\\Žฆ‚ท‚้"
-
-#: ../if_cscope.c:91
-msgid "Kill a connection"
-msgstr "ฺ‘ฑ‚๐I—น‚ท‚้"
-
-#: ../if_cscope.c:93
-msgid "Reinit all connections"
-msgstr "‘S‚ฤ‚ฬฺ‘ฑ‚๐ฤ‰Š๚‰ป‚ท‚้"
-
-#: ../if_cscope.c:95
-msgid "Show connections"
-msgstr "ฺ‘ฑ‚๐•\\Žฆ‚ท‚้"
-
-#: ../if_cscope.c:101
-#, c-format
-msgid "E560: Usage: cs[cope] %s"
-msgstr "E560: Žg—p•๛–@: cs[cope] %s"
-
-#: ../if_cscope.c:225
-msgid "This cscope command does not support splitting the window.\n"
-msgstr "‚ฑ‚ฬcscopeƒRƒ}ƒ“ƒh‚อ•ชŠ„ƒEƒBƒ“ƒhƒE‚ล‚อƒTƒ|[ƒg‚ณ‚๊‚‚น‚๑.\n"
-
-#: ../if_cscope.c:266
-msgid "E562: Usage: cstag <ident>"
-msgstr "E562: Žg—p–@: cstag <ident>"
-
-#: ../if_cscope.c:313
-msgid "E257: cstag: tag not found"
-msgstr "E257: cstag: ƒ^ƒO‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#: ../if_cscope.c:461
-#, c-format
-msgid "E563: stat(%s) error: %d"
-msgstr "E563: stat(%s) ƒGƒ‰[: %d"
-
-#: ../if_cscope.c:551
-#, c-format
-msgid "E564: %s is not a directory or a valid cscope database"
-msgstr "E564: %s ‚อƒfƒBƒŒƒNƒgƒŠ‹y‚ั—LŒ๘‚ศcscope‚ฬƒf[ƒ^ƒx[ƒX‚ล‚อ‚ ‚่‚‚น‚๑"
-
-#: ../if_cscope.c:566
-#, c-format
-msgid "Added cscope database %s"
-msgstr "cscopeƒf[ƒ^ƒx[ƒX %s ‚๐’ว‰ม"
-
-#: ../if_cscope.c:616
-#, c-format
-msgid "E262: error reading cscope connection %<PRId64>"
-msgstr "E262: cscope‚ฬฺ‘ฑ %<PRId64> ‚๐“วž‚’†‚ฬƒGƒ‰[‚ล‚ท"
-
-#: ../if_cscope.c:711
-msgid "E561: unknown cscope search type"
-msgstr "E561: –ข’m‚ฬcscopeŒŸ๕Œ^‚ล‚ท"
-
-#: ../if_cscope.c:752 ../if_cscope.c:789
-msgid "E566: Could not create cscope pipes"
-msgstr "E566: cscopeƒpƒCƒv‚๐์ฌ‚ล‚ซ‚‚น‚๑‚ล‚ต‚ฝ"
-
-#: ../if_cscope.c:767
-msgid "E622: Could not fork for cscope"
-msgstr "E622: cscope‚ฬ‹N“ฎ€”๕(fork)‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#: ../if_cscope.c:849
-msgid "cs_create_connection setpgid failed"
-msgstr "cs_create_connection ‚ึ‚ฬ setpgid ‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#: ../if_cscope.c:853 ../if_cscope.c:889
-msgid "cs_create_connection exec failed"
-msgstr "cs_create_connection ‚ฬŽภs‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#: ../if_cscope.c:863 ../if_cscope.c:902
-msgid "cs_create_connection: fdopen for to_fp failed"
-msgstr "cs_create_connection: to_fp ‚ฬ fdopen ‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#: ../if_cscope.c:865 ../if_cscope.c:906
-msgid "cs_create_connection: fdopen for fr_fp failed"
-msgstr "cs_create_connection: fr_fp ‚ฬ fdopen ‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#: ../if_cscope.c:890
-msgid "E623: Could not spawn cscope process"
-msgstr "E623: cscopeƒvƒƒZƒX‚๐‹N“ฎ‚ล‚ซ‚‚น‚๑‚ล‚ต‚ฝ"
-
-#: ../if_cscope.c:932
-msgid "E567: no cscope connections"
-msgstr "E567: cscopeฺ‘ฑ‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#: ../if_cscope.c:1009
-#, c-format
-msgid "E469: invalid cscopequickfix flag %c for %c"
-msgstr "E469: –ณŒ๘‚ศ cscopequickfix ƒtƒ‰ƒO %c ‚ฬ %c ‚ล‚ท"
-
-#: ../if_cscope.c:1058
-#, c-format
-msgid "E259: no matches found for cscope query %s of %s"
-msgstr "E259: cscopeƒNƒGƒŠ[ %s of %s ‚ษŠY“–‚ช‚ ‚่‚‚น‚๑‚ล‚ต‚ฝ"
-
-#: ../if_cscope.c:1142
-msgid "cscope commands:\n"
-msgstr "cscopeƒRƒ}ƒ“ƒh:\n"
-
-#: ../if_cscope.c:1150
-#, c-format
-msgid "%-5s: %s%*s (Usage: %s)"
-msgstr "%-5s: %s%*s (Žg—p–@: %s)"
-
-#: ../if_cscope.c:1155
-msgid ""
-"\n"
-" c: Find functions calling this function\n"
-" d: Find functions called by this function\n"
-" e: Find this egrep pattern\n"
-" f: Find this file\n"
-" g: Find this definition\n"
-" i: Find files #including this file\n"
-" s: Find this C symbol\n"
-" t: Find this text string\n"
-msgstr ""
-"\n"
-" c: ‚ฑ‚ฬŠึ”‚๐Œฤ‚๑‚ล‚ข‚้Šึ”‚๐’T‚ท\n"
-" d: ‚ฑ‚ฬŠึ”‚ฉ‚็Œฤ‚๑‚ล‚ข‚้Šึ”‚๐’T‚ท\n"
-" e: ‚ฑ‚ฬegrepƒpƒ^[ƒ“‚๐’T‚ท\n"
-" f: ‚ฑ‚ฬƒtƒ@ƒCƒ‹‚๐’T‚ท\n"
-" g: ‚ฑ‚ฬ’่‹`‚๐’T‚ท\n"
-" i: ‚ฑ‚ฬƒtƒ@ƒCƒ‹‚๐#include‚ต‚ฤ‚ข‚้ƒtƒ@ƒCƒ‹‚๐’T‚ท\n"
-" s: ‚ฑ‚ฬCƒVƒ“ƒ{ƒ‹‚๐’T‚ท\n"
-" t: ‚ฑ‚ฬƒeƒLƒXƒg•ถŽš—๑‚๐’T‚ท\n"
-
-#: ../if_cscope.c:1226
-msgid "E568: duplicate cscope database not added"
-msgstr "E568: d•ก‚ท‚้cscopeƒf[ƒ^ƒx[ƒX‚อ’ว‰ม‚ณ‚๊‚‚น‚๑‚ล‚ต‚ฝ"
-
-#: ../if_cscope.c:1335
-#, c-format
-msgid "E261: cscope connection %s not found"
-msgstr "E261: cscopeฺ‘ฑ %s ‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑‚ล‚ต‚ฝ"
-
-#: ../if_cscope.c:1364
-#, c-format
-msgid "cscope connection %s closed"
-msgstr "cscopeฺ‘ฑ %s ‚ช•ย‚ถ‚็‚๊‚‚ต‚ฝ"
-
-#. should not reach here
-#: ../if_cscope.c:1486
-msgid "E570: fatal error in cs_manage_matches"
-msgstr "E570: cs_manage_matches ‚ล’v–ฝ“I‚ศƒGƒ‰[‚ล‚ท"
-
-#: ../if_cscope.c:1693
-#, c-format
-msgid "Cscope tag: %s"
-msgstr "Cscope ƒ^ƒO: %s"
-
-#: ../if_cscope.c:1711
-msgid ""
-"\n"
-" # line"
-msgstr ""
-"\n"
-" # s”ิ†"
-
-#: ../if_cscope.c:1713
-msgid "filename / context / line\n"
-msgstr "ƒtƒ@ƒCƒ‹–ผ / •ถ–ฌ / s\n"
-
-#: ../if_cscope.c:1809
-#, c-format
-msgid "E609: Cscope error: %s"
-msgstr "E609: cscopeƒGƒ‰[: %s"
-
-#: ../if_cscope.c:2053
-msgid "All cscope databases reset"
-msgstr "‘S‚ฤ‚ฬcscopeƒf[ƒ^ƒx[ƒX‚๐ƒŠƒZƒbƒg‚ต‚‚ท"
-
-#: ../if_cscope.c:2123
-msgid "no cscope connections\n"
-msgstr "cscopeฺ‘ฑ‚ช‚ ‚่‚‚น‚๑\n"
-
-#: ../if_cscope.c:2126
-msgid " # pid database name prepend path\n"
-msgstr " # pid ƒf[ƒ^ƒx[ƒX–ผ prepend ƒpƒX\n"
-
-#: ../main.c:144
-msgid "Unknown option argument"
-msgstr "–ข’m‚ฬƒIƒvƒVƒ‡ƒ“ˆ๘”‚ล‚ท"
-
-#: ../main.c:146
-msgid "Too many edit arguments"
-msgstr "•าWˆ๘”‚ช‘ฝ‰฿‚ฌ‚‚ท"
-
-#: ../main.c:148
-msgid "Argument missing after"
-msgstr "ˆ๘”‚ช‚ ‚่‚‚น‚๑"
-
-#: ../main.c:150
-msgid "Garbage after option argument"
-msgstr "ƒIƒvƒVƒ‡ƒ“ˆ๘”‚ฬŒใ‚ษƒSƒ~‚ช‚ ‚่‚‚ท"
-
-#: ../main.c:152
-msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"
-msgstr "\"+command\", \"-c command\", \"--cmd command\" ‚ฬˆ๘”‚ช‘ฝ‰฿‚ฌ‚‚ท"
-
-#: ../main.c:154
-msgid "Invalid argument for"
-msgstr "–ณŒ๘‚ศˆ๘”‚ล‚ท: "
-
-#: ../main.c:294
-#, c-format
-msgid "%d files to edit\n"
-msgstr "%d Œย‚ฬƒtƒ@ƒCƒ‹‚ช•าW‚๐T‚ฆ‚ฤ‚ข‚‚ท\n"
-
-#: ../main.c:1342
-msgid "Attempt to open script file again: \""
-msgstr "ƒXƒNƒŠƒvƒgƒtƒ@ƒCƒ‹‚๐ฤ‚ัŠJ‚ข‚ฤ‚‚‚ท: \""
-
-#: ../main.c:1350
-msgid "Cannot open for reading: \""
-msgstr "“วž—p‚ฦ‚ต‚ฤŠJ‚ฏ‚‚น‚๑"
-
-#: ../main.c:1393
-msgid "Cannot open for script output: \""
-msgstr "ƒXƒNƒŠƒvƒgo—อ—p‚๐ŠJ‚ฏ‚‚น‚๑"
-
-#: ../main.c:1622
-msgid "Vim: Warning: Output is not to a terminal\n"
-msgstr "Vim: Œx: ’[––‚ึ‚ฬo—อ‚ล‚อ‚ ‚่‚‚น‚๑\n"
-
-#: ../main.c:1624
-msgid "Vim: Warning: Input is not from a terminal\n"
-msgstr "Vim: Œx: ’[––‚ฉ‚็‚ฬ“—อ‚ล‚อ‚ ‚่‚‚น‚๑\n"
-
-#. just in case..
-#: ../main.c:1891
-msgid "pre-vimrc command line"
-msgstr "vimrc‘O‚ฬƒRƒ}ƒ“ƒhƒ‰ƒCƒ“"
-
-#: ../main.c:1964
-#, c-format
-msgid "E282: Cannot read from \"%s\""
-msgstr "E282: \"%s\"‚ฉ‚็“วž‚‚ฑ‚ฦ‚ช‚ล‚ซ‚‚น‚๑"
-
-#: ../main.c:2149
-msgid ""
-"\n"
-"More info with: \"vim -h\"\n"
-msgstr ""
-"\n"
-"‚ๆ‚่ฺื‚ศ๎•๑‚อ: \"vim -h\"\n"
-
-#: ../main.c:2178
-msgid "[file ..] edit specified file(s)"
-msgstr "[ƒtƒ@ƒCƒ‹..] ‚ ‚้ƒtƒ@ƒCƒ‹‚๐•าW‚ท‚้"
-
-#: ../main.c:2179
-msgid "- read text from stdin"
-msgstr "- •W€“—อ‚ฉ‚็ƒeƒLƒXƒg‚๐“วž‚"
-
-#: ../main.c:2180
-msgid "-t tag edit file where tag is defined"
-msgstr "-t ƒ^ƒO ƒ^ƒO‚ช’่‹`‚ณ‚๊‚ฝ‚ฦ‚ฑ‚๋‚ฉ‚็•าW‚ท‚้"
-
-#: ../main.c:2181
-msgid "-q [errorfile] edit file with first error"
-msgstr "-q [errorfile] ล‰‚ฬƒGƒ‰[‚ล•าW‚ท‚้"
-
-#: ../main.c:2187
-msgid ""
-"\n"
-"\n"
-"usage:"
-msgstr ""
-"\n"
-"\n"
-"Žg—p–@:"
-
-#: ../main.c:2189
-msgid " vim [arguments] "
-msgstr " vim [ˆ๘”] "
-
-#: ../main.c:2193
-msgid ""
-"\n"
-" or:"
-msgstr ""
-"\n"
-" ‚เ‚ต‚ญ‚อ:"
-
-#: ../main.c:2196
-msgid ""
-"\n"
-"\n"
-"Arguments:\n"
-msgstr ""
-"\n"
-"\n"
-"ˆ๘”:\n"
-
-#: ../main.c:2197
-msgid "--\t\t\tOnly file names after this"
-msgstr "--\t\t\t‚ฑ‚ฬ‚ ‚ฦ‚ษ‚อƒtƒ@ƒCƒ‹–ผ‚พ‚ฏ"
-
-#: ../main.c:2199
-msgid "--literal\t\tDon't expand wildcards"
-msgstr "--literal\t\tƒƒCƒ‹ƒhƒJ[ƒh‚๐“WŠJ‚ต‚ศ‚ข"
-
-#: ../main.c:2201
-msgid "-v\t\t\tVi mode (like \"vi\")"
-msgstr "-v\t\t\tViƒ‚[ƒh (\"vi\" ‚ฦ“ฏ‚ถ)"
-
-#: ../main.c:2202
-msgid "-e\t\t\tEx mode (like \"ex\")"
-msgstr "-e\t\t\tExƒ‚[ƒh (\"ex\" ‚ฦ“ฏ‚ถ)"
-
-#: ../main.c:2203
-msgid "-E\t\t\tImproved Ex mode"
-msgstr "-E\t\t\t‰—วExƒ‚[ƒh"
-
-#: ../main.c:2204
-msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")"
-msgstr "-s\t\t\tƒTƒCƒŒƒ“ƒg(ƒoƒbƒ`)ƒ‚[ƒh (\"ex\" ๊—p)"
-
-#: ../main.c:2205
-msgid "-d\t\t\tDiff mode (like \"vimdiff\")"
-msgstr "-d\t\t\tท•ชƒ‚[ƒh (\"vidiff\" ‚ฦ“ฏ‚ถ)"
-
-#: ../main.c:2206
-msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
-msgstr "-y\t\t\tƒC[ƒW[ƒ‚[ƒh (\"evim\" ‚ฦ“ฏ‚ถ, ƒ‚[ƒh–ณ)"
-
-#: ../main.c:2207
-msgid "-R\t\t\tReadonly mode (like \"view\")"
-msgstr "-R\t\t\t“วž๊—pƒ‚[ƒh (\"view\" ‚ฦ“ฏ‚ถ)"
-
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tงŒภƒ‚[ƒh (\"rvim\" ‚ฦ“ฏ‚ถ)"
-
-#: ../main.c:2209
-msgid "-m\t\t\tModifications (writing files) not allowed"
-msgstr "-m\t\t\t•ฯX (ƒtƒ@ƒCƒ‹•‘ถŽž) ‚๐‚ล‚ซ‚ศ‚ข‚ๆ‚ค‚ษ‚ท‚้"
-
-#: ../main.c:2210
-msgid "-M\t\t\tModifications in text not allowed"
-msgstr "-M\t\t\tƒeƒLƒXƒg‚ฬ•าW‚๐s‚ศ‚ฆ‚ศ‚ข‚ๆ‚ค‚ษ‚ท‚้"
-
-#: ../main.c:2211
-msgid "-b\t\t\tBinary mode"
-msgstr "-b\t\t\tƒoƒCƒiƒŠƒ‚[ƒh"
-
-#: ../main.c:2212
-msgid "-l\t\t\tLisp mode"
-msgstr "-l\t\t\tLispƒ‚[ƒh"
-
-#: ../main.c:2213
-msgid "-C\t\t\tCompatible with Vi: 'compatible'"
-msgstr "-C\t\t\tViŒŠทƒ‚[ƒh: 'compatible'"
-
-#: ../main.c:2214
-msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'"
-msgstr "-N\t\t\tVi”๑ŒŠทƒ‚[ƒh: 'nocompatible"
-
-#: ../main.c:2215
-msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]"
-msgstr "-V[N][fname]\t\tƒƒOo—อ’่ [ƒŒƒxƒ‹ N] [ƒƒOƒtƒ@ƒCƒ‹–ผ fname]"
-
-#: ../main.c:2216
-msgid "-D\t\t\tDebugging mode"
-msgstr "-D\t\t\tƒfƒoƒbƒOƒ‚[ƒh"
-
-#: ../main.c:2217
-msgid "-n\t\t\tNo swap file, use memory only"
-msgstr "-n\t\t\tƒXƒƒbƒvƒtƒ@ƒCƒ‹‚๐Žg—p‚น‚ธƒƒ‚ƒŠ‚พ‚ฏ"
-
-#: ../main.c:2218
-msgid "-r\t\t\tList swap files and exit"
-msgstr "-r\t\t\tƒXƒƒbƒvƒtƒ@ƒCƒ‹‚๐—๑‹“‚ตI—น"
-
-#: ../main.c:2219
-msgid "-r (with file name)\tRecover crashed session"
-msgstr "-r (ƒtƒ@ƒCƒ‹–ผ)\tƒNƒ‰ƒbƒVƒ…‚ต‚ฝƒZƒbƒVƒ‡ƒ“‚๐•œ‹A"
-
-#: ../main.c:2220
-msgid "-L\t\t\tSame as -r"
-msgstr "-L\t\t\t-r‚ฦ“ฏ‚ถ"
-
-#: ../main.c:2221
-msgid "-A\t\t\tstart in Arabic mode"
-msgstr "-A\t\t\tƒAƒ‰ƒrƒAŒ๊ƒ‚[ƒh‚ล‹N“ฎ‚ท‚้"
-
-#: ../main.c:2222
-msgid "-H\t\t\tStart in Hebrew mode"
-msgstr "-H\t\t\tƒwƒuƒ‰ƒCŒ๊ƒ‚[ƒh‚ล‹N“ฎ‚ท‚้"
-
-#: ../main.c:2223
-msgid "-F\t\t\tStart in Farsi mode"
-msgstr "-F\t\t\tƒyƒ‹ƒVƒAŒ๊ƒ‚[ƒh‚ล‹N“ฎ‚ท‚้"
-
-#: ../main.c:2224
-msgid "-T <terminal>\tSet terminal type to <terminal>"
-msgstr "-T <terminal>\t’[––‚๐ <terminal> ‚ษ’่‚ท‚้"
-
-#: ../main.c:2225
-msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc"
-msgstr "-u <vimrc>\t\t.vimrc‚ฬ‘ใ‚ํ‚่‚ษ <vimrc> ‚๐Žg‚ค"
-
-#: ../main.c:2226
-msgid "--noplugin\t\tDon't load plugin scripts"
-msgstr "--noplugin\t\tƒvƒ‰ƒOƒCƒ“ƒXƒNƒŠƒvƒg‚๐ƒ[ƒh‚ต‚ศ‚ข"
-
-#: ../main.c:2227
-msgid "-p[N]\t\tOpen N tab pages (default: one for each file)"
-msgstr "-p[N]\t\tN Œยƒ^ƒuƒy[ƒW‚๐ŠJ‚ญ(ศ—ช’l: ƒtƒ@ƒCƒ‹‚ษ‚ย‚ซ1Œย)"
-
-#: ../main.c:2228
-msgid "-o[N]\t\tOpen N windows (default: one for each file)"
-msgstr "-o[N]\t\tN ŒยƒEƒBƒ“ƒhƒE‚๐ŠJ‚ญ(ศ—ช’l: ƒtƒ@ƒCƒ‹‚ษ‚ย‚ซ1Œย)"
-
-#: ../main.c:2229
-msgid "-O[N]\t\tLike -o but split vertically"
-msgstr "-O[N]\t\t-o‚ฦ“ฏ‚ถ‚พ‚ช‚’ผ•ชŠ„"
-
-#: ../main.c:2230
-msgid "+\t\t\tStart at end of file"
-msgstr "+\t\t\tƒtƒ@ƒCƒ‹‚ฬลŒใ‚ฉ‚็‚อ‚ถ‚฿‚้"
-
-#: ../main.c:2231
-msgid "+<lnum>\t\tStart at line <lnum>"
-msgstr "+<lnum>\t\t<lnum> s‚ฉ‚็‚อ‚ถ‚฿‚้"
-
-#: ../main.c:2232
-msgid "--cmd <command>\tExecute <command> before loading any vimrc file"
-msgstr "--cmd <command>\tvimrc‚๐ƒ[ƒh‚ท‚้‘O‚ษ <command> ‚๐Žภs‚ท‚้"
-
-#: ../main.c:2233
-msgid "-c <command>\t\tExecute <command> after loading the first file"
-msgstr "-c <command>\t\tล‰‚ฬƒtƒ@ƒCƒ‹‚๐ƒ[ƒhŒใ <command> ‚๐Žภs‚ท‚้"
-
-#: ../main.c:2235
-msgid "-S <session>\t\tSource file <session> after loading the first file"
-msgstr "-S <session>\t\tล‰‚ฬƒtƒ@ƒCƒ‹‚๐ƒ[ƒhŒใƒtƒ@ƒCƒ‹ <session> ‚๐Žๆž‚"
-
-#: ../main.c:2236
-msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>"
-msgstr "-s <scriptin>\tƒtƒ@ƒCƒ‹ <scriptin> ‚ฉ‚็ƒm[ƒ}ƒ‹ƒRƒ}ƒ“ƒh‚๐“วž‚"
-
-#: ../main.c:2237
-msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>"
-msgstr "-w <scriptout>\t“—อ‚ต‚ฝ‘SƒRƒ}ƒ“ƒh‚๐ƒtƒ@ƒCƒ‹ <scriptout> ‚ษ’ว‰ม‚ท‚้"
-
-#: ../main.c:2238
-msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>"
-msgstr "-W <scriptout>\t“—อ‚ต‚ฝ‘SƒRƒ}ƒ“ƒh‚๐ƒtƒ@ƒCƒ‹ <scriptout> ‚ษ•‘ถ‚ท‚้"
-
-#: ../main.c:2240
-msgid "--startuptime <file>\tWrite startup timing messages to <file>"
-msgstr "--startuptime <file>\t‹N“ฎ‚ษ‚ฉ‚ฉ‚ม‚ฝŽžŠิ‚ฬฺื‚๐ <file> ‚ึo—อ‚ท‚้"
-
-#: ../main.c:2242
-msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
-msgstr "-i <viminfo>\t\t.viminfo‚ฬ‘ใ‚ํ‚่‚ษ <viminfo> ‚๐Žg‚ค"
-
-#: ../main.c:2243
-msgid "-h or --help\tPrint Help (this message) and exit"
-msgstr "-h or --help\tƒwƒ‹ƒv(‚ฑ‚ฬƒƒbƒZ[ƒW)‚๐•\\Žฆ‚ตI—น‚ท‚้"
-
-#: ../main.c:2244
-msgid "--version\t\tPrint version information and exit"
-msgstr "--version\t\tƒo[ƒWƒ‡ƒ“๎•๑‚๐•\\Žฆ‚ตI—น‚ท‚้"
-
-#: ../mark.c:676
-msgid "No marks set"
-msgstr "ƒ}[ƒN‚ช’่‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../mark.c:678
-#, c-format
-msgid "E283: No marks matching \"%s\""
-msgstr "E283: \"%s\" ‚ษŠY“–‚ท‚้ƒ}[ƒN‚ช‚ ‚่‚‚น‚๑"
-
-#. Highlight title
-#: ../mark.c:687
-msgid ""
-"\n"
-"mark line col file/text"
-msgstr ""
-"\n"
-"mark s —๑ ƒtƒ@ƒCƒ‹/ƒeƒLƒXƒg"
-
-#. Highlight title
-#: ../mark.c:789
-msgid ""
-"\n"
-" jump line col file/text"
-msgstr ""
-"\n"
-" jump s —๑ ƒtƒ@ƒCƒ‹/ƒeƒLƒXƒg"
-
-#. Highlight title
-#: ../mark.c:831
-msgid ""
-"\n"
-"change line col text"
-msgstr ""
-"\n"
-"•ฯX s —๑ ƒeƒLƒXƒg"
-
-#: ../mark.c:1238
-msgid ""
-"\n"
-"# File marks:\n"
-msgstr ""
-"\n"
-"# ƒtƒ@ƒCƒ‹ƒ}[ƒN:\n"
-
-#. Write the jumplist with -'
-#: ../mark.c:1271
-msgid ""
-"\n"
-"# Jumplist (newest first):\n"
-msgstr ""
-"\n"
-"# ƒWƒƒƒ“ƒvƒŠƒXƒg (V‚ต‚ข‚เ‚ฬ‚ชๆ):\n"
-
-#: ../mark.c:1352
-msgid ""
-"\n"
-"# History of marks within files (newest to oldest):\n"
-msgstr ""
-"\n"
-"# ƒtƒ@ƒCƒ‹“เƒ}[ƒN‚ฬ—š—๐ (V‚ต‚ข‚เ‚ฬ‚ฉ‚็Œร‚ข‚เ‚ฬ):\n"
-
-#: ../mark.c:1431
-msgid "Missing '>'"
-msgstr "'>' ‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#: ../memfile.c:426
-msgid "E293: block was not locked"
-msgstr "E293: ƒuƒƒbƒN‚ชƒƒbƒN‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../memfile.c:799
-msgid "E294: Seek error in swap file read"
-msgstr "E294: ƒXƒƒbƒvƒtƒ@ƒCƒ‹“วžŽž‚ษƒV[ƒNƒGƒ‰[‚ล‚ท"
-
-#: ../memfile.c:803
-msgid "E295: Read error in swap file"
-msgstr "E295: ƒXƒƒbƒvƒtƒ@ƒCƒ‹‚ฬ“วž‚ƒGƒ‰[‚ล‚ท"
-
-#: ../memfile.c:849
-msgid "E296: Seek error in swap file write"
-msgstr "E296: ƒXƒƒbƒvƒtƒ@ƒCƒ‹‘ž‚Žž‚ษƒV[ƒNƒGƒ‰[‚ล‚ท"
-
-#: ../memfile.c:865
-msgid "E297: Write error in swap file"
-msgstr "E297: ƒXƒƒbƒvƒtƒ@ƒCƒ‹‚ฬ‘ž‚ƒGƒ‰[‚ล‚ท"
-
-#: ../memfile.c:1036
-msgid "E300: Swap file already exists (symlink attack?)"
-msgstr "E300: ƒXƒƒbƒvƒtƒ@ƒCƒ‹‚ชŠ๙‚ษ‘ถ‚ต‚‚ท (symlink‚ษ‚ๆ‚้UŒ‚?)"
-
-#: ../memline.c:318
-msgid "E298: Didn't get block nr 0?"
-msgstr "E298: ƒuƒƒbƒN 0 ‚๐Žๆ“พ‚ล‚ซ‚‚น‚๑?"
-
-#: ../memline.c:361
-msgid "E298: Didn't get block nr 1?"
-msgstr "E298: ƒuƒƒbƒN 1 ‚๐Žๆ“พ‚ล‚ซ‚‚น‚๑?"
-
-#: ../memline.c:377
-msgid "E298: Didn't get block nr 2?"
-msgstr "E298: ƒuƒƒbƒN 2 ‚๐Žๆ“พ‚ล‚ซ‚‚น‚๑?"
-
-#. could not (re)open the swap file, what can we do????
-#: ../memline.c:465
-msgid "E301: Oops, lost the swap file!!!"
-msgstr "E301: ‚จ‚ม‚ฦ, ƒXƒƒbƒvƒtƒ@ƒCƒ‹‚ชŽธ‚ํ‚๊‚‚ต‚ฝ!!!"
-
-#: ../memline.c:477
-msgid "E302: Could not rename swap file"
-msgstr "E302: ƒXƒƒbƒvƒtƒ@ƒCƒ‹‚ฬ–ผ‘O‚๐•ฯ‚ฆ‚็‚๊‚‚น‚๑"
-
-#: ../memline.c:554
-#, c-format
-msgid "E303: Unable to open swap file for \"%s\", recovery impossible"
-msgstr "E303: \"%s\" ‚ฬƒXƒƒbƒvƒtƒ@ƒCƒ‹‚๐ŠJ‚ฏ‚ศ‚ข‚ฬ‚ลƒŠƒJƒoƒŠ‚อ•s‰ย”\\‚ล‚ท"
-
-#: ../memline.c:666
-msgid "E304: ml_upd_block0(): Didn't get block 0??"
-msgstr "E304: ml_upd_block0(): ƒuƒƒbƒN 0 ‚๐Žๆ“พ‚ล‚ซ‚‚น‚๑‚ล‚ต‚ฝ??"
-
-#. no swap files found
-#: ../memline.c:830
-#, c-format
-msgid "E305: No swap file found for %s"
-msgstr "E305: %s ‚ษ‚อƒXƒƒbƒvƒtƒ@ƒCƒ‹‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#: ../memline.c:839
-msgid "Enter number of swap file to use (0 to quit): "
-msgstr "Žg—p‚ท‚้ƒXƒƒbƒvƒtƒ@ƒCƒ‹‚ฬ”ิ†‚๐“—อ‚ต‚ฤ‚ญ‚พ‚ณ‚ข(0 ‚ลI—น): "
-
-#: ../memline.c:879
-#, c-format
-msgid "E306: Cannot open %s"
-msgstr "E306: %s ‚๐ŠJ‚ฏ‚‚น‚๑"
-
-#: ../memline.c:897
-msgid "Unable to read block 0 from "
-msgstr "ƒuƒƒbƒN 0 ‚๐“วž‚฿‚‚น‚๑ "
-
-#: ../memline.c:900
-msgid ""
-"\n"
-"Maybe no changes were made or Vim did not update the swap file."
-msgstr ""
-"\n"
-"‹ฐ‚็‚ญ•ฯX‚ช‚ณ‚๊‚ฤ‚ข‚ศ‚ข‚ฉVim‚ชƒXƒƒbƒvƒtƒ@ƒCƒ‹‚๐XV‚ต‚ฤ‚ข‚‚น‚๑."
-
-#: ../memline.c:909
-msgid " cannot be used with this version of Vim.\n"
-msgstr " Vim‚ฬ‚ฑ‚ฬƒo[ƒWƒ‡ƒ“‚ล‚อŽg—p‚ล‚ซ‚‚น‚๑.\n"
-
-#: ../memline.c:911
-msgid "Use Vim version 3.0.\n"
-msgstr "Vim‚ฬƒo[ƒWƒ‡ƒ“3.0‚๐Žg—p‚ต‚ฤ‚ญ‚พ‚ณ‚ข.\n"
-
-#: ../memline.c:916
-#, c-format
-msgid "E307: %s does not look like a Vim swap file"
-msgstr "E307: %s ‚อVim‚ฬƒXƒƒbƒvƒtƒ@ƒCƒ‹‚ล‚อ‚ศ‚ข‚ๆ‚ค‚ล‚ท"
-
-#: ../memline.c:922
-msgid " cannot be used on this computer.\n"
-msgstr " ‚ฑ‚ฬƒRƒ“ƒsƒ…[ƒ^‚ล‚อŽg—p‚ล‚ซ‚‚น‚๑.\n"
-
-#: ../memline.c:924
-msgid "The file was created on "
-msgstr "‚ฑ‚ฬƒtƒ@ƒCƒ‹‚อŽŸ‚ฬ๊Š‚ล์‚็‚๊‚‚ต‚ฝ "
-
-#: ../memline.c:928
-msgid ""
-",\n"
-"or the file has been damaged."
-msgstr ""
-",\n"
-"‚เ‚ต‚ญ‚อƒtƒ@ƒCƒ‹‚ช‘น‚ต‚ฤ‚ข‚‚ท."
-
-#: ../memline.c:945
-msgid " has been damaged (page size is smaller than minimum value).\n"
-msgstr " ‚อ‘น‚ต‚ฤ‚ข‚‚ท (ƒy[ƒWƒTƒCƒY‚ชลฌ’l‚๐‰บ‰๑‚ม‚ฤ‚ข‚‚ท).\n"
-
-#: ../memline.c:974
-#, c-format
-msgid "Using swap file \"%s\""
-msgstr "ƒXƒƒbƒvƒtƒ@ƒCƒ‹ \"%s\" ‚๐Žg—p’†"
-
-#: ../memline.c:980
-#, c-format
-msgid "Original file \"%s\""
-msgstr "Œด–{ƒtƒ@ƒCƒ‹ \"%s\""
-
-#: ../memline.c:995
-msgid "E308: Warning: Original file may have been changed"
-msgstr "E308: Œx: Œด–{ƒtƒ@ƒCƒ‹‚ช•ฯX‚ณ‚๊‚ฤ‚ข‚‚ท"
-
-#: ../memline.c:1061
-#, c-format
-msgid "E309: Unable to read block 1 from %s"
-msgstr "E309: %s ‚ฉ‚็ƒuƒƒbƒN 1 ‚๐“วž‚฿‚‚น‚๑"
-
-#: ../memline.c:1065
-msgid "???MANY LINES MISSING"
-msgstr "???‘ฝ‚ญ‚ฬs‚ชŽธ‚ํ‚๊‚ฤ‚ข‚‚ท"
-
-#: ../memline.c:1076
-msgid "???LINE COUNT WRONG"
-msgstr "???s”‚ชŠิˆแ‚ม‚ฤ‚ข‚‚ท"
-
-#: ../memline.c:1082
-msgid "???EMPTY BLOCK"
-msgstr "???ƒuƒƒbƒN‚ช‹๓‚ล‚ท"
-
-#: ../memline.c:1103
-msgid "???LINES MISSING"
-msgstr "???s‚ชŽธ‚ํ‚๊‚ฤ‚ข‚‚ท"
-
-#: ../memline.c:1128
-#, c-format
-msgid "E310: Block 1 ID wrong (%s not a .swp file?)"
-msgstr "E310: ƒuƒƒbƒN 1 ‚ฬID‚ชŠิˆแ‚ม‚ฤ‚ข‚‚ท(%s ‚ช.swpƒtƒ@ƒCƒ‹‚ล‚ศ‚ข?)"
-
-#: ../memline.c:1133
-msgid "???BLOCK MISSING"
-msgstr "???ƒuƒƒbƒN‚ช‚ ‚่‚‚น‚๑"
-
-#: ../memline.c:1147
-msgid "??? from here until ???END lines may be messed up"
-msgstr "??? ‚ฑ‚ฑ‚ฉ‚็ ???END ‚‚ล‚ฬs‚ช”j‰๓‚ณ‚๊‚ฤ‚ข‚้‚ๆ‚ค‚ล‚ท"
-
-#: ../memline.c:1164
-msgid "??? from here until ???END lines may have been inserted/deleted"
-msgstr "??? ‚ฑ‚ฑ‚ฉ‚็ ???END ‚‚ล‚ฬs‚ช‘}“‚ฉํœ‚ณ‚๊‚ฝ‚ๆ‚ค‚ล‚ท"
-
-#: ../memline.c:1181
-msgid "???END"
-msgstr "???END"
-
-#: ../memline.c:1238
-msgid "E311: Recovery Interrupted"
-msgstr "E311: ƒŠƒJƒoƒŠ‚ชŠ„ž‚‚๊‚‚ต‚ฝ"
-
-#: ../memline.c:1243
-msgid ""
-"E312: Errors detected while recovering; look for lines starting with ???"
-msgstr ""
-"E312: ƒŠƒJƒoƒŠ‚ฬล’†‚ษƒGƒ‰[‚ชŒŸo‚ณ‚๊‚‚ต‚ฝ; ???‚ลŽn‚‚้s‚๐ŽQฦ‚ต‚ฤ‚ญ‚พ‚ณ‚ข"
-
-#: ../memline.c:1245
-msgid "See \":help E312\" for more information."
-msgstr "ฺื‚อ \":help E312\" ‚๐ŽQฦ‚ต‚ฤ‚ญ‚พ‚ณ‚ข"
-
-#: ../memline.c:1249
-msgid "Recovery completed. You should check if everything is OK."
-msgstr "ƒŠƒJƒoƒŠ‚ชI—น‚ต‚‚ต‚ฝ. ‘S‚ฤ‚ชณ‚ต‚ข‚ฉƒ`ƒFƒbƒN‚ต‚ฤ‚ญ‚พ‚ณ‚ข."
-
-#: ../memline.c:1251
-msgid ""
-"\n"
-"(You might want to write out this file under another name\n"
-msgstr ""
-"\n"
-"(•ฯX‚๐ƒ`ƒFƒbƒN‚ท‚้‚ฝ‚฿‚ษ, ‚ฑ‚ฬƒtƒ@ƒCƒ‹‚๐•ส‚ฬ–ผ‘O‚ล•‘ถ‚ต‚ฝใ‚ล\n"
-
-#: ../memline.c:1252
-msgid "and run diff with the original file to check for changes)"
-msgstr "Œด–{ƒtƒ@ƒCƒ‹‚ฦ‚ฬ diff ‚๐Žภs‚ท‚้‚ฦ—ว‚ข‚ล‚ต‚ๅ‚ค)"
-
-#: ../memline.c:1254
-msgid "Recovery completed. Buffer contents equals file contents."
-msgstr "•œŒณŠฎ—น. ƒoƒbƒtƒ@‚ฬ“เ—e‚อƒtƒ@ƒCƒ‹‚ฦ“ฏ‚ถ‚ษ‚ศ‚่‚‚ต‚ฝ."
-
-#: ../memline.c:1255
-msgid ""
-"\n"
-"You may want to delete the .swp file now.\n"
-"\n"
-msgstr ""
-"\n"
-"Œณ‚ฬ.swpƒtƒ@ƒCƒ‹‚อํœ‚ต‚ฤ‚เ\\‚ข‚‚น‚๑\n"
-"\n"
-
-#. use msg() to start the scrolling properly
-#: ../memline.c:1327
-msgid "Swap files found:"
-msgstr "ƒXƒƒbƒvƒtƒ@ƒCƒ‹‚ช•ก”Œฉ‚ย‚ฉ‚่‚‚ต‚ฝ:"
-
-#: ../memline.c:1446
-msgid " In current directory:\n"
-msgstr " Œป‚ฬƒfƒBƒŒƒNƒgƒŠ:\n"
-
-#: ../memline.c:1448
-msgid " Using specified name:\n"
-msgstr " ˆศ‰บ‚ฬ–ผ‘O‚๐Žg—p’†:\n"
-
-#: ../memline.c:1450
-msgid " In directory "
-msgstr " ƒfƒBƒŒƒNƒgƒŠ "
-
-#: ../memline.c:1465
-msgid " -- none --\n"
-msgstr " -- ‚ศ‚ต --\n"
-
-#: ../memline.c:1527
-msgid " owned by: "
-msgstr " Š—LŽา: "
-
-#: ../memline.c:1529
-msgid " dated: "
-msgstr " “๚•t: "
-
-#: ../memline.c:1532 ../memline.c:3231
-msgid " dated: "
-msgstr " “๚•t: "
-
-#: ../memline.c:1548
-msgid " [from Vim version 3.0]"
-msgstr " [from Vim version 3.0]"
-
-#: ../memline.c:1550
-msgid " [does not look like a Vim swap file]"
-msgstr " [Vim‚ฬƒXƒƒbƒvƒtƒ@ƒCƒ‹‚ล‚อ‚ศ‚ข‚ๆ‚ค‚ล‚ท]"
-
-#: ../memline.c:1552
-msgid " file name: "
-msgstr " ƒtƒ@ƒCƒ‹–ผ: "
-
-#: ../memline.c:1558
-msgid ""
-"\n"
-" modified: "
-msgstr ""
-"\n"
-" •ฯX๓‘ิ: "
-
-#: ../memline.c:1559
-msgid "YES"
-msgstr "‚ ‚่"
-
-#: ../memline.c:1559
-msgid "no"
-msgstr "‚ศ‚ต"
-
-#: ../memline.c:1562
-msgid ""
-"\n"
-" user name: "
-msgstr ""
-"\n"
-" ƒ†[ƒU[–ผ: "
-
-#: ../memline.c:1568
-msgid " host name: "
-msgstr " ƒzƒXƒg–ผ: "
-
-#: ../memline.c:1570
-msgid ""
-"\n"
-" host name: "
-msgstr ""
-"\n"
-" ƒzƒXƒg–ผ: "
-
-#: ../memline.c:1575
-msgid ""
-"\n"
-" process ID: "
-msgstr ""
-"\n"
-" ƒvƒƒZƒXID: "
-
-#: ../memline.c:1579
-msgid " (still running)"
-msgstr " (‚‚พŽภs’†)"
-
-#: ../memline.c:1586
-msgid ""
-"\n"
-" [not usable on this computer]"
-msgstr ""
-"\n"
-" [‚ฑ‚ฬƒRƒ“ƒsƒ…[ƒ^‚ล‚อŽg—p‚ล‚ซ‚‚น‚๑]"
-
-#: ../memline.c:1590
-msgid " [cannot be read]"
-msgstr " [“วž‚฿‚‚น‚๑]"
-
-#: ../memline.c:1593
-msgid " [cannot be opened]"
-msgstr " [ŠJ‚ฏ‚‚น‚๑]"
-
-#: ../memline.c:1698
-msgid "E313: Cannot preserve, there is no swap file"
-msgstr "E313: ƒXƒƒbƒvƒtƒ@ƒCƒ‹‚ช–ณ‚ข‚ฬ‚ลˆŽ‚ล‚ซ‚‚น‚๑"
-
-#: ../memline.c:1747
-msgid "File preserved"
-msgstr "ƒtƒ@ƒCƒ‹‚ชˆŽ‚ณ‚๊‚‚ท"
-
-#: ../memline.c:1749
-msgid "E314: Preserve failed"
-msgstr "E314: ˆŽ‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#: ../memline.c:1819
-#, c-format
-msgid "E315: ml_get: invalid lnum: %<PRId64>"
-msgstr "E315: ml_get: –ณŒ๘‚ศlnum‚ล‚ท: %<PRId64>"
-
-#: ../memline.c:1851
-#, c-format
-msgid "E316: ml_get: cannot find line %<PRId64>"
-msgstr "E316: ml_get: s %<PRId64> ‚๐Œฉ‚ย‚ฏ‚็‚๊‚‚น‚๑"
-
-#: ../memline.c:2236
-msgid "E317: pointer block id wrong 3"
-msgstr "E317: ƒ|ƒCƒ“ƒ^ƒuƒƒbƒN‚ฬID‚ชŠิˆแ‚ม‚ฤ‚ข‚‚ท 3"
-
-#: ../memline.c:2311
-msgid "stack_idx should be 0"
-msgstr "stack_idx ‚อ 0 ‚ล‚ ‚้‚ื‚ซ‚ล‚ท"
-
-#: ../memline.c:2369
-msgid "E318: Updated too many blocks?"
-msgstr "E318: XV‚ณ‚๊‚ฝƒuƒƒbƒN‚ช‘ฝ‰฿‚ฌ‚้‚ฉ‚เ?"
-
-#: ../memline.c:2511
-msgid "E317: pointer block id wrong 4"
-msgstr "E317: ƒ|ƒCƒ“ƒ^ƒuƒƒbƒN‚ฬID‚ชŠิˆแ‚ม‚ฤ‚ข‚‚ท 4"
-
-#: ../memline.c:2536
-msgid "deleted block 1?"
-msgstr "ƒuƒƒbƒN 1 ‚อม‚ณ‚๊‚ฝ?"
-
-#: ../memline.c:2707
-#, c-format
-msgid "E320: Cannot find line %<PRId64>"
-msgstr "E320: s %<PRId64> ‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#: ../memline.c:2916
-msgid "E317: pointer block id wrong"
-msgstr "E317: ƒ|ƒCƒ“ƒ^ƒuƒƒbƒN‚ฬID‚ชŠิˆแ‚ม‚ฤ‚ข‚‚ท"
-
-#: ../memline.c:2930
-msgid "pe_line_count is zero"
-msgstr "pe_line_count ‚ชƒ[ƒ‚ล‚ท"
-
-#: ../memline.c:2955
-#, c-format
-msgid "E322: line number out of range: %<PRId64> past the end"
-msgstr "E322: s”ิ†‚ช”อˆอŠO‚ล‚ท: %<PRId64> ’ด‚ฆ‚ฤ‚ข‚‚ท"
-
-#: ../memline.c:2959
-#, c-format
-msgid "E323: line count wrong in block %<PRId64>"
-msgstr "E323: ƒuƒƒbƒN %<PRId64> ‚ฬsƒJƒEƒ“ƒg‚ชŠิˆแ‚ม‚ฤ‚ข‚‚ท"
-
-#: ../memline.c:2999
-msgid "Stack size increases"
-msgstr "ƒXƒ^ƒbƒNƒTƒCƒY‚ช‘‚ฆ‚‚ท"
-
-#: ../memline.c:3038
-msgid "E317: pointer block id wrong 2"
-msgstr "E317: ƒ|ƒCƒ“ƒ^ƒuƒƒbƒN‚ฬID‚ชŠิˆแ‚ม‚ฤ‚ข‚‚ท 2"
-
-#: ../memline.c:3070
-#, c-format
-msgid "E773: Symlink loop for \"%s\""
-msgstr "E773: \"%s\" ‚ฬƒVƒ“ƒ{ƒŠƒbƒNƒŠƒ“ƒN‚ชƒ‹[ƒv‚ษ‚ศ‚ม‚ฤ‚ข‚‚ท"
-
-#: ../memline.c:3221
-msgid "E325: ATTENTION"
-msgstr "E325: ’ˆำ"
-
-#: ../memline.c:3222
-msgid ""
-"\n"
-"Found a swap file by the name \""
-msgstr ""
-"\n"
-"ŽŸ‚ฬ–ผ‘O‚ลƒXƒƒbƒvƒtƒ@ƒCƒ‹‚๐Œฉ‚ย‚ฏ‚‚ต‚ฝ \""
-
-#: ../memline.c:3226
-msgid "While opening file \""
-msgstr "ŽŸ‚ฬƒtƒ@ƒCƒ‹‚๐ŠJ‚ข‚ฤ‚ข‚้ล’† \""
-
-#: ../memline.c:3239
-msgid " NEWER than swap file!\n"
-msgstr " ƒXƒƒbƒvƒtƒ@ƒCƒ‹‚ๆ‚่‚เV‚ต‚ข‚ล‚ท!\n"
-
-#: ../memline.c:3244
-msgid ""
-"\n"
-"(1) Another program may be editing the same file. If this is the case,\n"
-" be careful not to end up with two different instances of the same\n"
-" file when making changes."
-msgstr ""
-"\n"
-"(1) •ส‚ฬƒvƒƒOƒ‰ƒ€‚ช“ฏ‚ถƒtƒ@ƒCƒ‹‚๐•าW‚ต‚ฤ‚ข‚้‚ฉ‚เ‚ต‚๊‚‚น‚๑.\n"
-" ‚ฑ‚ฬ๊‡‚ษ‚อ, •ฯX‚๐‚ต‚ฤ‚ต‚‚ค‚ฦ1‚ย‚ฬƒtƒ@ƒCƒ‹‚ษ‘ฮ‚ต‚ฤˆู‚ศ‚้2‚ย‚ฬ\n"
-" ƒCƒ“ƒXƒ^ƒ“ƒX‚ช‚ล‚ซ‚ฤ‚ต‚‚ค‚ฬ‚ล, ‚ป‚ค‚ต‚ศ‚ข‚ๆ‚ค‚ษ‹C‚๐‚ย‚ฏ‚ฤ‚ญ‚พ‚ณ‚ข."
-
-#: ../memline.c:3245
-msgid " Quit, or continue with caution.\n"
-msgstr " I—น‚ท‚้‚ฉ, ’ˆำ‚ต‚ศ‚ช‚็‘ฑ‚ฏ‚ฤ‚ญ‚พ‚ณ‚ข.\n"
-
-#: ../memline.c:3246
-msgid "(2) An edit session for this file crashed.\n"
-msgstr "(2) ‚ฑ‚ฬƒtƒ@ƒCƒ‹‚ฬ•าWƒZƒbƒVƒ‡ƒ“‚ชƒNƒ‰ƒbƒVƒ…‚ต‚ฝ.\n"
-
-#: ../memline.c:3247
-msgid " If this is the case, use \":recover\" or \"vim -r "
-msgstr " ‚ฑ‚ฬ๊‡‚ษ‚อ \":recover\" ‚ฉ \"vim -r "
-
-#: ../memline.c:3249
-msgid ""
-"\"\n"
-" to recover the changes (see \":help recovery\").\n"
-msgstr ""
-"\"\n"
-" ‚๐Žg—p‚ต‚ฤ•ฯX‚๐ƒŠƒJƒo[‚ต‚‚ท(\":help recovery\" ‚๐ŽQฦ).\n"
-
-#: ../memline.c:3250
-msgid " If you did this already, delete the swap file \""
-msgstr " Š๙‚ษ‚ฑ‚๊‚๐s‚ศ‚ม‚ฝ‚ฬ‚ศ‚็‚ฮ, ƒXƒƒbƒvƒtƒ@ƒCƒ‹ \""
-
-#: ../memline.c:3252
-msgid ""
-"\"\n"
-" to avoid this message.\n"
-msgstr ""
-"\"\n"
-" ‚๐ม‚น‚ฮ‚ฑ‚ฬƒƒbƒZ[ƒW‚๐‰๑”๐‚ล‚ซ‚‚ท.\n"
-
-#: ../memline.c:3450 ../memline.c:3452
-msgid "Swap file \""
-msgstr "ƒXƒƒbƒvƒtƒ@ƒCƒ‹ \""
-
-#: ../memline.c:3451 ../memline.c:3455
-msgid "\" already exists!"
-msgstr "\" ‚ชŠ๙‚ษ‚ ‚่‚‚ท!"
-
-#: ../memline.c:3457
-msgid "VIM - ATTENTION"
-msgstr "VIM - ’ˆำ"
-
-#: ../memline.c:3459
-msgid "Swap file already exists!"
-msgstr "ƒXƒƒbƒvƒtƒ@ƒCƒ‹‚ชŠ๙‚ษ‘ถ‚ต‚‚ท!"
-
-#: ../memline.c:3464
-msgid ""
-"&Open Read-Only\n"
-"&Edit anyway\n"
-"&Recover\n"
-"&Quit\n"
-"&Abort"
-msgstr ""
-"“วž๊—p‚ลŠJ‚ญ(&O)\n"
-"‚ฦ‚ษ‚ฉ‚ญ•าW‚ท‚้(&E)\n"
-"•œŠˆ‚ณ‚น‚้(&R)\n"
-"I—น‚ท‚้(&Q)\n"
-"’†Ž~‚ท‚้(&A)"
-
-#: ../memline.c:3467
-msgid ""
-"&Open Read-Only\n"
-"&Edit anyway\n"
-"&Recover\n"
-"&Delete it\n"
-"&Quit\n"
-"&Abort"
-msgstr ""
-"“วž๊—p‚ลŠJ‚ญ(&O)\n"
-"‚ฦ‚ษ‚ฉ‚ญ•าW‚ท‚้(&E)\n"
-"•œŠˆ‚ณ‚น‚้(&R)\n"
-"ํœ‚ท‚้(&D)\n"
-"I—น‚ท‚้(&Q)\n"
-"’†Ž~‚ท‚้(&A)"
-
-#.
-#. * Change the ".swp" extension to find another file that can be used.
-#. * First decrement the last char: ".swo", ".swn", etc.
-#. * If that still isn't enough decrement the last but one char: ".svz"
-#. * Can happen when editing many "No Name" buffers.
-#.
-#. ".s?a"
-#. ".saa": tried enough, give up
-#: ../memline.c:3528
-msgid "E326: Too many swap files found"
-msgstr "E326: ƒXƒƒbƒvƒtƒ@ƒCƒ‹‚ช‘ฝ”Œฉ‚ย‚ฉ‚่‚‚ต‚ฝ"
-
-#: ../memory.c:227
-#, c-format
-msgid "E342: Out of memory! (allocating %<PRIu64> bytes)"
-msgstr "E342: ƒƒ‚ƒŠ‚ช‘ซ‚่‚‚น‚๑! (%<PRIu64> ƒoƒCƒg‚๐Š„“–—v‹)"
-
-#: ../menu.c:62
-msgid "E327: Part of menu-item path is not sub-menu"
-msgstr "E327: ƒƒjƒ…[ƒAƒCƒeƒ€‚ฬƒpƒX‚ฬ•”•ช‚ชƒTƒuƒƒjƒ…[‚ล‚อ‚ ‚่‚‚น‚๑"
-
-#: ../menu.c:63
-msgid "E328: Menu only exists in another mode"
-msgstr "E328: ƒƒjƒ…[‚อ‘ผ‚ฬƒ‚[ƒh‚ษ‚พ‚ฏ‚ ‚่‚‚ท"
-
-#: ../menu.c:64
-#, c-format
-msgid "E329: No menu \"%s\""
-msgstr "E329: \"%s\" ‚ฦ‚ข‚คƒƒjƒ…[‚อ‚ ‚่‚‚น‚๑"
-
-#. Only a mnemonic or accelerator is not valid.
-#: ../menu.c:329
-msgid "E792: Empty menu name"
-msgstr "E792: ƒƒjƒ…[–ผ‚ช‹๓‚ล‚ท"
-
-#: ../menu.c:340
-msgid "E330: Menu path must not lead to a sub-menu"
-msgstr "E330: ƒƒjƒ…[ƒpƒX‚อƒTƒuƒƒjƒ…[‚๐ถ‚ถ‚้‚ื‚ซ‚ล‚อ‚ ‚่‚‚น‚๑"
-
-#: ../menu.c:365
-msgid "E331: Must not add menu items directly to menu bar"
-msgstr "E331: ƒƒjƒ…[ƒo[‚ษ‚อ’ผฺƒƒjƒ…[ƒAƒCƒeƒ€‚๐’ว‰ม‚ล‚ซ‚‚น‚๑"
-
-#: ../menu.c:370
-msgid "E332: Separator cannot be part of a menu path"
-msgstr "E332: ‹ๆุ‚่‚อƒƒjƒ…[ƒpƒX‚ฬˆ๊•”‚ล‚อ‚ ‚่‚‚น‚๑"
-
-#. Now we have found the matching menu, and we list the mappings
-#. Highlight title
-#: ../menu.c:762
-msgid ""
-"\n"
-"--- Menus ---"
-msgstr ""
-"\n"
-"--- ƒƒjƒ…[ ---"
-
-#: ../menu.c:1313
-msgid "E333: Menu path must lead to a menu item"
-msgstr "E333: ƒƒjƒ…[ƒpƒX‚อƒƒjƒ…[ƒAƒCƒeƒ€‚๐ถ‚ถ‚ศ‚ฏ‚๊‚ฮ‚ข‚ฏ‚‚น‚๑"
-
-#: ../menu.c:1330
-#, c-format
-msgid "E334: Menu not found: %s"
-msgstr "E334: ƒƒjƒ…[‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑: %s"
-
-#: ../menu.c:1396
-#, c-format
-msgid "E335: Menu not defined for %s mode"
-msgstr "E335: %s ‚ษ‚อƒƒjƒ…[‚ช’่‹`‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../menu.c:1426
-msgid "E336: Menu path must lead to a sub-menu"
-msgstr "E336: ƒƒjƒ…[ƒpƒX‚อƒTƒuƒƒjƒ…[‚๐ถ‚ถ‚ศ‚ฏ‚๊‚ฮ‚ข‚ฏ‚‚น‚๑"
-
-#: ../menu.c:1447
-msgid "E337: Menu not found - check menu names"
-msgstr "E337: ƒƒjƒ…[‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑ - ƒƒjƒ…[–ผ‚๐Šm”F‚ต‚ฤ‚ญ‚พ‚ณ‚ข"
-
-#: ../message.c:423
-#, c-format
-msgid "Error detected while processing %s:"
-msgstr "%s ‚ฬˆ—’†‚ษƒGƒ‰[‚ชŒŸo‚ณ‚๊‚‚ต‚ฝ:"
-
-#: ../message.c:445
-#, c-format
-msgid "line %4ld:"
-msgstr "s %4ld:"
-
-#: ../message.c:617
-#, c-format
-msgid "E354: Invalid register name: '%s'"
-msgstr "E354: –ณŒ๘‚ศƒŒƒWƒXƒ^–ผ: '%s'"
-
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr "“๚–{Œ๊ƒƒbƒZ[ƒW–|–๓/ŠฤC: ‘บ‰ช ‘พ˜Y <koron.kaoriya@gmail.com>"
-
-#: ../message.c:986
-msgid "Interrupt: "
-msgstr "Š„ž‚: "
-
-#: ../message.c:988
-msgid "Press ENTER or type command to continue"
-msgstr "‘ฑ‚ฏ‚้‚ษ‚อENTER‚๐‰Ÿ‚ท‚ฉƒRƒ}ƒ“ƒh‚๐“—อ‚ต‚ฤ‚ญ‚พ‚ณ‚ข"
-
-#: ../message.c:1843
-#, c-format
-msgid "%s line %<PRId64>"
-msgstr "%s s %<PRId64>"
-
-#: ../message.c:2392
-msgid "-- More --"
-msgstr "-- Œp‘ฑ --"
-
-#: ../message.c:2398
-msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "
-msgstr " SPACE/d/j: ‰ๆ–ส/ƒy[ƒW/s ‰บ, b/u/k: ใ, q: I—น "
-
-#: ../message.c:3021 ../message.c:3031
-msgid "Question"
-msgstr "Žฟ–โ"
-
-#: ../message.c:3023
-msgid ""
-"&Yes\n"
-"&No"
-msgstr ""
-"‚อ‚ข(&Y)\n"
-"‚ข‚ข‚ฆ(&N)"
-
-#: ../message.c:3033
-msgid ""
-"&Yes\n"
-"&No\n"
-"&Cancel"
-msgstr ""
-"‚อ‚ข(&Y)\n"
-"‚ข‚ข‚ฆ(&N)\n"
-"ƒLƒƒƒ“ƒZƒ‹(&C)"
-
-#: ../message.c:3045
-msgid ""
-"&Yes\n"
-"&No\n"
-"Save &All\n"
-"&Discard All\n"
-"&Cancel"
-msgstr ""
-"‚อ‚ข(&Y)\n"
-"‚ข‚ข‚ฆ(&N)\n"
-"‘S‚ฤ•‘ถ(&A)\n"
-"‘S‚ฤ•๚Š(&D)\n"
-"ƒLƒƒƒ“ƒZƒ‹(&C)"
-
-#: ../message.c:3058
-msgid "E766: Insufficient arguments for printf()"
-msgstr "E766: printf() ‚ฬˆ๘”‚ช•s\\•ช‚ล‚ท"
-
-#: ../message.c:3119
-msgid "E807: Expected Float argument for printf()"
-msgstr "E807: printf() ‚ฬˆ๘”‚ษ‚อ•‚“ฎญ”“_”‚ชŠ๚‘า‚ณ‚๊‚ฤ‚ข‚‚ท"
-
-#: ../message.c:3873
-msgid "E767: Too many arguments to printf()"
-msgstr "E767: printf() ‚ฬˆ๘”‚ช‘ฝ‰฿‚ฌ‚‚ท"
-
-#: ../misc1.c:2256
-msgid "W10: Warning: Changing a readonly file"
-msgstr "W10: Œx: “วž๊—pƒtƒ@ƒCƒ‹‚๐•ฯX‚ต‚‚ท"
-
-#: ../misc1.c:2537
-msgid "Type number and <Enter> or click with mouse (empty cancels): "
-msgstr ""
-"”ิ†‚ฦ<Enter>‚๐“—อ‚ท‚้‚ฉƒ}ƒEƒX‚ลƒNƒŠƒbƒN‚ต‚ฤ‚ญ‚พ‚ณ‚ข (‹๓‚ลƒLƒƒƒ“ƒZƒ‹): "
-
-#: ../misc1.c:2539
-msgid "Type number and <Enter> (empty cancels): "
-msgstr "”ิ†‚ฦ<Enter>‚๐“—อ‚ต‚ฤ‚ญ‚พ‚ณ‚ข (‹๓‚ลƒLƒƒƒ“ƒZƒ‹): "
-
-#: ../misc1.c:2585
-msgid "1 more line"
-msgstr "1 s ’ว‰ม‚ต‚‚ต‚ฝ"
-
-#: ../misc1.c:2588
-msgid "1 line less"
-msgstr "1 s ํœ‚ต‚‚ต‚ฝ"
-
-#: ../misc1.c:2593
-#, c-format
-msgid "%<PRId64> more lines"
-msgstr "%<PRId64> s ’ว‰ม‚ต‚‚ต‚ฝ"
-
-#: ../misc1.c:2596
-#, c-format
-msgid "%<PRId64> fewer lines"
-msgstr "%<PRId64> s ํœ‚ต‚‚ต‚ฝ"
-
-#: ../misc1.c:2599
-msgid " (Interrupted)"
-msgstr " (Š„ž‚‚๊‚‚ต‚ฝ)"
-
-#: ../misc1.c:2635
-msgid "Beep!"
-msgstr "ƒr[ƒb!"
-
-#: ../misc2.c:738
-#, c-format
-msgid "Calling shell to execute: \"%s\""
-msgstr "Žภs‚ฬ‚ฝ‚฿‚ษƒVƒFƒ‹‚๐Œฤo‚ต’†: \"%s\""
-
-#: ../normal.c:183
-msgid "E349: No identifier under cursor"
-msgstr "E349: ƒJ[ƒ\\ƒ‹‚ฬˆส’u‚ษ‚อŽฏ•สŽq‚ช‚ ‚่‚‚น‚๑"
-
-#: ../normal.c:1866
-msgid "E774: 'operatorfunc' is empty"
-msgstr "E774: 'operatorfunc' ƒIƒvƒVƒ‡ƒ“‚ช‹๓‚ล‚ท"
-
-#: ../normal.c:2637
-msgid "Warning: terminal cannot highlight"
-msgstr "Œx: Žg—p‚ต‚ฤ‚ข‚้’[––‚อƒnƒCƒ‰ƒCƒg‚ล‚ซ‚‚น‚๑"
-
-#: ../normal.c:2807
-msgid "E348: No string under cursor"
-msgstr "E348: ƒJ[ƒ\\ƒ‹‚ฬˆส’u‚ษ‚อ•ถŽš—๑‚ช‚ ‚่‚‚น‚๑"
-
-#: ../normal.c:3937
-msgid "E352: Cannot erase folds with current 'foldmethod'"
-msgstr "E352: Œป‚ฬ 'foldmethod' ‚ล‚อ๔‚‚๐ม‹Ž‚ล‚ซ‚‚น‚๑"
-
-#: ../normal.c:5897
-msgid "E664: changelist is empty"
-msgstr "E664: •ฯXƒŠƒXƒg‚ช‹๓‚ล‚ท"
-
-#: ../normal.c:5899
-msgid "E662: At start of changelist"
-msgstr "E662: •ฯXƒŠƒXƒg‚ฬๆ“ช"
-
-#: ../normal.c:5901
-msgid "E663: At end of changelist"
-msgstr "E663: •ฯXƒŠƒXƒg‚ฬ––”๖"
-
-#: ../normal.c:7053
-msgid "Type :quit<Enter> to exit Nvim"
-msgstr "Vim‚๐I—น‚ท‚้‚ษ‚อ :quit<Enter> ‚ฦ“—อ‚ต‚ฤ‚ญ‚พ‚ณ‚ข"
-
-#: ../ops.c:248
-#, c-format
-msgid "1 line %sed 1 time"
-msgstr "1 s‚ช %s ‚ล 1 ‰๑ˆ—‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../ops.c:250
-#, c-format
-msgid "1 line %sed %d times"
-msgstr "1 s‚ช %s ‚ล %d ‰๑ˆ—‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../ops.c:253
-#, c-format
-msgid "%<PRId64> lines %sed 1 time"
-msgstr "%<PRId64> s‚ช %s ‚ล 1 ‰๑ˆ—‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../ops.c:256
-#, c-format
-msgid "%<PRId64> lines %sed %d times"
-msgstr "%<PRId64> s‚ช %s ‚ล %d ‰๑ˆ—‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../ops.c:592
-#, c-format
-msgid "%<PRId64> lines to indent... "
-msgstr "%<PRId64> s‚ชƒCƒ“ƒfƒ“ƒg‚ณ‚๊‚‚ท... "
-
-#: ../ops.c:634
-msgid "1 line indented "
-msgstr "1 s‚๐ƒCƒ“ƒfƒ“ƒg‚ต‚‚ต‚ฝ "
-
-#: ../ops.c:636
-#, c-format
-msgid "%<PRId64> lines indented "
-msgstr "%<PRId64> s‚๐ƒCƒ“ƒfƒ“ƒg‚ต‚‚ต‚ฝ "
-
-#: ../ops.c:938
-msgid "E748: No previously used register"
-msgstr "E748: ‚‚พƒŒƒWƒXƒ^‚๐Žg—p‚ต‚ฤ‚ข‚‚น‚๑"
-
-#. must display the prompt
-#: ../ops.c:1433
-msgid "cannot yank; delete anyway"
-msgstr "ƒ„ƒ“ƒN‚ล‚ซ‚‚น‚๑; ‚ฦ‚ษ‚ฉ‚ญม‹Ž"
-
-#: ../ops.c:1929
-msgid "1 line changed"
-msgstr "1 s‚ช•ฯX‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../ops.c:1931
-#, c-format
-msgid "%<PRId64> lines changed"
-msgstr "%<PRId64> s‚ช•ฯX‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../ops.c:2521
-msgid "block of 1 line yanked"
-msgstr "1 s‚ฬƒuƒƒbƒN‚ชƒ„ƒ“ƒN‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../ops.c:2523
-msgid "1 line yanked"
-msgstr "1 s‚ชƒ„ƒ“ƒN‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../ops.c:2525
-#, c-format
-msgid "block of %<PRId64> lines yanked"
-msgstr "%<PRId64> s‚ฬƒuƒƒbƒN‚ชƒ„ƒ“ƒN‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../ops.c:2528
-#, c-format
-msgid "%<PRId64> lines yanked"
-msgstr "%<PRId64> s‚ชƒ„ƒ“ƒN‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../ops.c:2710
-#, c-format
-msgid "E353: Nothing in register %s"
-msgstr "E353: ƒŒƒWƒXƒ^ %s ‚ษ‚อ‰ฝ‚เ‚ ‚่‚‚น‚๑"
-
-#. Highlight title
-#: ../ops.c:3185
-msgid ""
-"\n"
-"--- Registers ---"
-msgstr ""
-"\n"
-"--- ƒŒƒWƒXƒ^ ---"
-
-#: ../ops.c:4455
-msgid "Illegal register name"
-msgstr "•sณ‚ศƒŒƒWƒXƒ^–ผ"
-
-#: ../ops.c:4533
-msgid ""
-"\n"
-"# Registers:\n"
-msgstr ""
-"\n"
-"# ƒŒƒWƒXƒ^:\n"
-
-#: ../ops.c:4575
-#, c-format
-msgid "E574: Unknown register type %d"
-msgstr "E574: –ข’m‚ฬƒŒƒWƒXƒ^Œ^ %d ‚ล‚ท"
-
-msgid ""
-"E883: search pattern and expression register may not contain two or more "
-"lines"
-msgstr "E883: ŒŸ๕ƒpƒ^[ƒ“‚ฦŽฎƒŒƒWƒXƒ^‚ษ‚อ2sˆศใ‚๐Š‚฿‚็‚๊‚‚น‚๑"
-
-#: ../ops.c:5089
-#, c-format
-msgid "%<PRId64> Cols; "
-msgstr "%<PRId64> —๑; "
-
-#: ../ops.c:5097
-#, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Bytes"
-msgstr ""
-"‘I‘๐ %s%<PRId64> / %<PRId64> s; %<PRId64> / %<PRId64> ’PŒ๊; %<PRId64> / "
-"%<PRId64> ƒoƒCƒg"
-
-#: ../ops.c:5105
-#, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Chars; %<PRId64> of %<PRId64> Bytes"
-msgstr ""
-"‘I‘๐ %s%<PRId64> / %<PRId64> s; %<PRId64> / %<PRId64> ’PŒ๊; %<PRId64> / "
-"%<PRId64> •ถŽš; %<PRId64> / %<PRId64> ƒoƒCƒg"
-
-#: ../ops.c:5123
-#, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Byte "
-"%<PRId64> of %<PRId64>"
-msgstr ""
-"—๑ %s / %s; s %<PRId64> of %<PRId64>; ’PŒ๊ %<PRId64> / %<PRId64>; ƒoƒCƒg "
-"%<PRId64> / %<PRId64>"
-
-#: ../ops.c:5133
-#, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Char "
-"%<PRId64> of %<PRId64>; Byte %<PRId64> of %<PRId64>"
-msgstr ""
-"—๑ %s / %s; s %<PRId64> / %<PRId64>; ’PŒ๊ %<PRId64> / %<PRId64>; •ถŽš "
-"%<PRId64> / %<PRId64>; ƒoƒCƒg %<PRId64> of %<PRId64>"
-
-#: ../ops.c:5146
-#, c-format
-msgid "(+%<PRId64> for BOM)"
-msgstr "(+%<PRId64> for BOM)"
-
-#: ../option.c:1238
-msgid "%<%f%h%m%=Page %N"
-msgstr "%<%f%h%m%=%N ƒy[ƒW"
-
-#: ../option.c:1574
-msgid "Thanks for flying Vim"
-msgstr "Vim ‚๐Žg‚ม‚ฤ‚ญ‚๊‚ฤ‚ ‚่‚ช‚ฦ‚ค"
-
-#. found a mismatch: skip
-#: ../option.c:2698
-msgid "E518: Unknown option"
-msgstr "E518: –ข’m‚ฬƒIƒvƒVƒ‡ƒ“‚ล‚ท"
-
-#: ../option.c:2709
-msgid "E519: Option not supported"
-msgstr "E519: ƒIƒvƒVƒ‡ƒ“‚อƒTƒ|[ƒg‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../option.c:2740
-msgid "E520: Not allowed in a modeline"
-msgstr "E520: modeline ‚ล‚อ‹–‰ย‚ณ‚๊‚‚น‚๑"
-
-#: ../option.c:2815
-msgid "E846: Key code not set"
-msgstr "E846: ƒL[ƒR[ƒh‚ช’่‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../option.c:2924
-msgid "E521: Number required after ="
-msgstr "E521: = ‚ฬŒใ‚ษ‚อ”Žš‚ช•K—v‚ล‚ท"
-
-#: ../option.c:3226 ../option.c:3864
-msgid "E522: Not found in termcap"
-msgstr "E522: termcap “เ‚ษŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#: ../option.c:3335
-#, c-format
-msgid "E539: Illegal character <%s>"
-msgstr "E539: •sณ‚ศ•ถŽš‚ล‚ท <%s>"
-
-#, c-format
-msgid "For option %s"
-msgstr "ƒIƒvƒVƒ‡ƒ“: %s"
-
-#: ../option.c:3862
-msgid "E529: Cannot set 'term' to empty string"
-msgstr "E529: 'term' ‚ษ‚อ‹๓•ถŽš—๑‚๐’่‚ล‚ซ‚‚น‚๑"
-
-#: ../option.c:3885
-msgid "E589: 'backupext' and 'patchmode' are equal"
-msgstr "E589: 'backupext' ‚ฦ 'patchmode' ‚ช“ฏ‚ถ‚ล‚ท"
-
-#: ../option.c:3964
-msgid "E834: Conflicts with value of 'listchars'"
-msgstr "E834: 'listchars'‚ฬ’l‚ษ–ต‚‚ช‚ ‚่‚‚ท"
-
-#: ../option.c:3966
-msgid "E835: Conflicts with value of 'fillchars'"
-msgstr "E835: 'fillchars'‚ฬ’l‚ษ–ต‚‚ช‚ ‚่‚‚ท"
-
-#: ../option.c:4163
-msgid "E524: Missing colon"
-msgstr "E524: ƒRƒƒ“‚ช‚ ‚่‚‚น‚๑"
-
-#: ../option.c:4165
-msgid "E525: Zero length string"
-msgstr "E525: •ถŽš—๑‚ฬ’ท‚ณ‚ชƒ[ƒ‚ล‚ท"
-
-#: ../option.c:4220
-#, c-format
-msgid "E526: Missing number after <%s>"
-msgstr "E526: <%s> ‚ฬŒใ‚ษ”Žš‚ช‚ ‚่‚‚น‚๑"
-
-#: ../option.c:4232
-msgid "E527: Missing comma"
-msgstr "E527: ƒJƒ“ƒ}‚ช‚ ‚่‚‚น‚๑"
-
-#: ../option.c:4239
-msgid "E528: Must specify a ' value"
-msgstr "E528: ' ‚ฬ’l‚๐Žw’่‚ต‚ศ‚ฏ‚๊‚ฮ‚ศ‚่‚‚น‚๑"
-
-#: ../option.c:4271
-msgid "E595: contains unprintable or wide character"
-msgstr "E595: •\\Žฆ‚ล‚ซ‚ศ‚ข•ถŽš‚ฉƒƒCƒh•ถŽš‚๐Š‚๑‚ล‚ข‚‚ท"
-
-#: ../option.c:4469
-#, c-format
-msgid "E535: Illegal character after <%c>"
-msgstr "E535: <%c> ‚ฬŒใ‚ษ•sณ‚ศ•ถŽš‚ช‚ ‚่‚‚ท"
-
-#: ../option.c:4534
-msgid "E536: comma required"
-msgstr "E536: ƒJƒ“ƒ}‚ช•K—v‚ล‚ท"
-
-#: ../option.c:4543
-#, c-format
-msgid "E537: 'commentstring' must be empty or contain %s"
-msgstr "E537: 'commentstring' ‚อ‹๓‚ล‚ ‚้‚ฉ %s ‚๐Š‚•K—v‚ช‚ ‚่‚‚ท"
-
-#: ../option.c:4928
-msgid "E540: Unclosed expression sequence"
-msgstr "E540: Žฎ‚ชI—น‚ต‚ฤ‚ข‚‚น‚๑"
-
-#: ../option.c:4932
-msgid "E541: too many items"
-msgstr "E541: —v‘f‚ช‘ฝ‰฿‚ฌ‚‚ท"
-
-#: ../option.c:4934
-msgid "E542: unbalanced groups"
-msgstr "E542: ƒOƒ‹[ƒv‚ช’‡‚ข‚‚น‚๑"
-
-#: ../option.c:5148
-msgid "E590: A preview window already exists"
-msgstr "E590: ƒvƒŒƒrƒ…[ƒEƒBƒ“ƒhƒE‚ชŠ๙‚ษ‘ถ‚ต‚‚ท"
-
-#: ../option.c:5311
-msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'"
-msgstr ""
-"W17: ƒAƒ‰ƒrƒA•ถŽš‚ษ‚อUTF-8‚ช•K—v‚ศ‚ฬ‚ล, ':set encoding=utf-8' ‚ต‚ฤ‚ญ‚พ‚ณ‚ข"
-
-#: ../option.c:5623
-#, c-format
-msgid "E593: Need at least %d lines"
-msgstr "E593: ล’แ %d ‚ฬs”‚ช•K—v‚ล‚ท"
-
-#: ../option.c:5631
-#, c-format
-msgid "E594: Need at least %d columns"
-msgstr "E594: ล’แ %d ‚ฬƒJƒ‰ƒ€•‚ช•K—v‚ล‚ท"
-
-#: ../option.c:6011
-#, c-format
-msgid "E355: Unknown option: %s"
-msgstr "E355: –ข’m‚ฬƒIƒvƒVƒ‡ƒ“‚ล‚ท: %s"
-
-#. There's another character after zeros or the string
-#. * is empty. In both cases, we are trying to set a
-#. * num option using a string.
-#: ../option.c:6037
-#, c-format
-msgid "E521: Number required: &%s = '%s'"
-msgstr "E521: ”Žš‚ช•K—v‚ล‚ท: &%s = '%s'"
-
-#: ../option.c:6149
-msgid ""
-"\n"
-"--- Terminal codes ---"
-msgstr ""
-"\n"
-"--- ’[––ƒR[ƒh ---"
-
-#: ../option.c:6151
-msgid ""
-"\n"
-"--- Global option values ---"
-msgstr ""
-"\n"
-"--- ƒOƒ[ƒoƒ‹ƒIƒvƒVƒ‡ƒ“’l ---"
-
-#: ../option.c:6153
-msgid ""
-"\n"
-"--- Local option values ---"
-msgstr ""
-"\n"
-"--- ƒ[ƒJƒ‹ƒIƒvƒVƒ‡ƒ“’l ---"
-
-#: ../option.c:6155
-msgid ""
-"\n"
-"--- Options ---"
-msgstr ""
-"\n"
-"--- ƒIƒvƒVƒ‡ƒ“ ---"
-
-#: ../option.c:6816
-msgid "E356: get_varp ERROR"
-msgstr "E356: get_varp ƒGƒ‰["
-
-#: ../option.c:7696
-#, c-format
-msgid "E357: 'langmap': Matching character missing for %s"
-msgstr "E357: 'langmap': %s ‚ษ‘ฮ‰ž‚ท‚้•ถŽš‚ช‚ ‚่‚‚น‚๑"
-
-#: ../option.c:7715
-#, c-format
-msgid "E358: 'langmap': Extra characters after semicolon: %s"
-msgstr "E358: 'langmap': ƒZƒ~ƒRƒƒ“‚ฬŒใ‚ษ—]•ช‚ศ•ถŽš‚ช‚ ‚่‚‚ท: %s"
-
-#: ../os/shell.c:194
-msgid ""
-"\n"
-"Cannot execute shell "
-msgstr ""
-"\n"
-"ƒVƒFƒ‹‚๐Žภs‚ล‚ซ‚‚น‚๑ "
-
-#: ../os/shell.c:439
-msgid ""
-"\n"
-"shell returned "
-msgstr ""
-"\n"
-"ƒVƒFƒ‹‚ช’l‚๐•ิ‚ต‚‚ต‚ฝ "
-
-#: ../os_unix.c:465 ../os_unix.c:471
-msgid ""
-"\n"
-"Could not get security context for "
-msgstr ""
-"\n"
-"ƒZƒLƒ…ƒŠƒeƒBƒRƒ“ƒeƒLƒXƒg‚๐Žๆ“พ‚ล‚ซ‚‚น‚๑ "
-
-#: ../os_unix.c:479
-msgid ""
-"\n"
-"Could not set security context for "
-msgstr ""
-"\n"
-"ƒZƒLƒ…ƒŠƒeƒBƒRƒ“ƒeƒLƒXƒg‚๐’่‚ล‚ซ‚‚น‚๑ "
-
-#, c-format
-msgid "Could not set security context %s for %s"
-msgstr "ƒZƒLƒ…ƒŠƒeƒBƒRƒ“ƒeƒLƒXƒg %s ‚๐ %s ‚ษ’่‚ล‚ซ‚‚น‚๑"
-
-#, c-format
-msgid "Could not get security context %s for %s. Removing it!"
-msgstr "ƒZƒLƒ…ƒŠƒeƒBƒRƒ“ƒeƒLƒXƒg %s ‚๐ %s ‚ฉ‚็Žๆ“พ‚ล‚ซ‚‚น‚๑. ํœ‚ต‚‚ท!"
-
-#: ../os_unix.c:1558 ../os_unix.c:1647
-#, c-format
-msgid "dlerror = \"%s\""
-msgstr "dlerror = \"%s\""
-
-#: ../path.c:1449
-#, c-format
-msgid "E447: Can't find file \"%s\" in path"
-msgstr "E447: path‚ษ‚อ \"%s\" ‚ฦ‚ข‚คƒtƒ@ƒCƒ‹‚ช‚ ‚่‚‚น‚๑"
-
-#: ../quickfix.c:359
-#, c-format
-msgid "E372: Too many %%%c in format string"
-msgstr "E372: ƒtƒH[ƒ}ƒbƒg•ถŽš—๑‚ษ %%%c ‚ช‘ฝ‰฿‚ฌ‚‚ท"
-
-#: ../quickfix.c:371
-#, c-format
-msgid "E373: Unexpected %%%c in format string"
-msgstr "E373: ƒtƒH[ƒ}ƒbƒg•ถŽš—๑‚ษ—\\Š๚‚น‚ส %%%c ‚ช‚ ‚่‚‚ต‚ฝ"
-
-#: ../quickfix.c:420
-msgid "E374: Missing ] in format string"
-msgstr "E374: ƒtƒH[ƒ}ƒbƒg•ถŽš—๑‚ษ ] ‚ช‚ ‚่‚‚น‚๑"
-
-#: ../quickfix.c:431
-#, c-format
-msgid "E375: Unsupported %%%c in format string"
-msgstr "E375: ƒtƒH[ƒ}ƒbƒg•ถŽš—๑‚ล‚อ %%%c ‚อƒTƒ|[ƒg‚ณ‚๊‚‚น‚๑"
-
-#: ../quickfix.c:448
-#, c-format
-msgid "E376: Invalid %%%c in format string prefix"
-msgstr "E376: ƒtƒH[ƒ}ƒbƒg•ถŽš—๑‚ฬ‘O’u‚ษ–ณŒ๘‚ศ %%%c ‚ช‚ ‚่‚‚ท"
-
-#: ../quickfix.c:454
-#, c-format
-msgid "E377: Invalid %%%c in format string"
-msgstr "E377: ƒtƒH[ƒ}ƒbƒg•ถŽš—๑‚ษ–ณŒ๘‚ศ %%%c ‚ช‚ ‚่‚‚ท"
-
-#. nothing found
-#: ../quickfix.c:477
-msgid "E378: 'errorformat' contains no pattern"
-msgstr "E378: 'errorformat' ‚ษƒpƒ^[ƒ“‚ชŽw’่‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../quickfix.c:695
-msgid "E379: Missing or empty directory name"
-msgstr "E379: ƒfƒBƒŒƒNƒgƒŠ–ผ‚ช–ณ‚ข‚ฉ‹๓‚ล‚ท"
-
-#: ../quickfix.c:1305
-msgid "E553: No more items"
-msgstr "E553: —v‘f‚ช‚เ‚ค‚ ‚่‚‚น‚๑"
-
-#: ../quickfix.c:1674
-#, c-format
-msgid "(%d of %d)%s%s: "
-msgstr "(%d of %d)%s%s: "
-
-#: ../quickfix.c:1676
-msgid " (line deleted)"
-msgstr " (s‚ชํœ‚ณ‚๊‚‚ต‚ฝ)"
-
-#: ../quickfix.c:1863
-msgid "E380: At bottom of quickfix stack"
-msgstr "E380: quickfix ƒXƒ^ƒbƒN‚ฬ––”๖‚ล‚ท"
-
-#: ../quickfix.c:1869
-msgid "E381: At top of quickfix stack"
-msgstr "E381: quickfix ƒXƒ^ƒbƒN‚ฬๆ“ช‚ล‚ท"
-
-#: ../quickfix.c:1880
-#, c-format
-msgid "error list %d of %d; %d errors"
-msgstr "ƒGƒ‰[ˆ๊—— %d of %d; %d ŒยƒGƒ‰["
-
-#: ../quickfix.c:2427
-msgid "E382: Cannot write, 'buftype' option is set"
-msgstr "E382: 'buftype' ƒIƒvƒVƒ‡ƒ“‚ช’่‚ณ‚๊‚ฤ‚ข‚้‚ฬ‚ล‘ž‚‚‚น‚๑"
-
-#: ../quickfix.c:2812
-msgid "E683: File name missing or invalid pattern"
-msgstr "E683: ƒtƒ@ƒCƒ‹–ผ‚ช–ณ‚ข‚ฉ–ณŒ๘‚ศƒpƒ^[ƒ“‚ล‚ท"
-
-#: ../quickfix.c:2911
-#, c-format
-msgid "Cannot open file \"%s\""
-msgstr "ƒtƒ@ƒCƒ‹ \"%s\" ‚๐ŠJ‚ฏ‚‚น‚๑"
-
-#: ../quickfix.c:3429
-msgid "E681: Buffer is not loaded"
-msgstr "E681: ƒoƒbƒtƒ@‚อ“ว‚ž‚‚๊‚‚น‚๑‚ล‚ต‚ฝ"
-
-#: ../quickfix.c:3487
-msgid "E777: String or List expected"
-msgstr "E777: •ถŽš—๑‚ฉƒŠƒXƒg‚ช•K—v‚ล‚ท"
-
-#: ../regexp.c:359
-#, c-format
-msgid "E369: invalid item in %s%%[]"
-msgstr "E369: –ณŒ๘‚ศ€–ฺ‚ล‚ท: %s%%[]"
-
-#
-#: ../regexp.c:374
-#, c-format
-msgid "E769: Missing ] after %s["
-msgstr "E769: %s[ ‚ฬŒใ‚ษ ] ‚ช‚ ‚่‚‚น‚๑"
-
-#: ../regexp.c:375
-#, c-format
-msgid "E53: Unmatched %s%%("
-msgstr "E53: %s%%( ‚ช’‚่‡‚ม‚ฤ‚ข‚‚น‚๑"
-
-#: ../regexp.c:376
-#, c-format
-msgid "E54: Unmatched %s("
-msgstr "E54: %s( ‚ช’‚่‡‚ม‚ฤ‚ข‚‚น‚๑"
-
-#: ../regexp.c:377
-#, c-format
-msgid "E55: Unmatched %s)"
-msgstr "E55: %s) ‚ช’‚่‡‚ม‚ฤ‚ข‚‚น‚๑"
-
-#
-#: ../regexp.c:378
-msgid "E66: \\z( not allowed here"
-msgstr "E66: \\z( ‚อƒRƒR‚ล‚อ‹–‰ย‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#
-#: ../regexp.c:379
-msgid "E67: \\z1 et al. not allowed here"
-msgstr "E67: \\z1 ‚ป‚ฬ‘ผ‚อƒRƒR‚ล‚อ‹–‰ย‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#
-#: ../regexp.c:380
-#, c-format
-msgid "E69: Missing ] after %s%%["
-msgstr "E69: %s%%[ ‚ฬŒใ‚ษ ] ‚ช‚ ‚่‚‚น‚๑"
-
-#: ../regexp.c:381
-#, c-format
-msgid "E70: Empty %s%%[]"
-msgstr "E70: %s%%[] ‚ช‹๓‚ล‚ท"
-
-#: ../regexp.c:1209 ../regexp.c:1224
-msgid "E339: Pattern too long"
-msgstr "E339: ƒpƒ^[ƒ“‚ช’ท‰฿‚ฌ‚‚ท"
-
-#: ../regexp.c:1371
-msgid "E50: Too many \\z("
-msgstr "E50: \\z( ‚ช‘ฝ‰฿‚ฌ‚‚ท"
-
-#: ../regexp.c:1378
-#, c-format
-msgid "E51: Too many %s("
-msgstr "E51: %s( ‚ช‘ฝ‰฿‚ฌ‚‚ท"
-
-#: ../regexp.c:1427
-msgid "E52: Unmatched \\z("
-msgstr "E52: \\z( ‚ช’‚่‡‚ม‚ฤ‚ข‚‚น‚๑"
-
-#: ../regexp.c:1637
-#, c-format
-msgid "E59: invalid character after %s@"
-msgstr "E59: %s@ ‚ฬŒใ‚ษ•sณ‚ศ•ถŽš‚ช‚ ‚่‚‚ต‚ฝ"
-
-#: ../regexp.c:1672
-#, c-format
-msgid "E60: Too many complex %s{...}s"
-msgstr "E60: •กŽG‚ศ %s{...} ‚ช‘ฝ‰฿‚ฌ‚‚ท"
-
-#: ../regexp.c:1687
-#, c-format
-msgid "E61: Nested %s*"
-msgstr "E61:%s* ‚ช“‚๊Žq‚ษ‚ศ‚ม‚ฤ‚ข‚‚ท"
-
-#: ../regexp.c:1690
-#, c-format
-msgid "E62: Nested %s%c"
-msgstr "E62:%s%c ‚ช“‚๊Žq‚ษ‚ศ‚ม‚ฤ‚ข‚‚ท"
-
-#
-#: ../regexp.c:1800
-msgid "E63: invalid use of \\_"
-msgstr "E63: \\_ ‚ฬ–ณŒ๘‚ศŽg—p•๛–@‚ล‚ท"
-
-#: ../regexp.c:1850
-#, c-format
-msgid "E64: %s%c follows nothing"
-msgstr "E64:%s%c ‚ฬŒใ‚ษ‚ศ‚ษ‚เ‚ ‚่‚‚น‚๑"
-
-#
-#: ../regexp.c:1902
-msgid "E65: Illegal back reference"
-msgstr "E65: •sณ‚ศŒใ•๛ŽQฦ‚ล‚ท"
-
-#
-#: ../regexp.c:1943
-msgid "E68: Invalid character after \\z"
-msgstr "E68: \\z ‚ฬŒใ‚ษ•sณ‚ศ•ถŽš‚ช‚ ‚่‚‚ต‚ฝ"
-
-#
-#: ../regexp.c:2049 ../regexp_nfa.c:1296
-#, c-format
-msgid "E678: Invalid character after %s%%[dxouU]"
-msgstr "E678: %s%%[dxouU] ‚ฬŒใ‚ษ•sณ‚ศ•ถŽš‚ช‚ ‚่‚‚ต‚ฝ"
-
-#
-#: ../regexp.c:2107
-#, c-format
-msgid "E71: Invalid character after %s%%"
-msgstr "E71: %s%% ‚ฬŒใ‚ษ•sณ‚ศ•ถŽš‚ช‚ ‚่‚‚ต‚ฝ"
-
-#: ../regexp.c:3017
-#, c-format
-msgid "E554: Syntax error in %s{...}"
-msgstr "E554: %s{...} “เ‚ษ•ถ–@ƒGƒ‰[‚ช‚ ‚่‚‚ท"
-
-#: ../regexp.c:3805
-msgid "External submatches:\n"
-msgstr "ŠO•”‚ฬ•”•ชŠY“–:\n"
-
-#, c-format
-msgid "E888: (NFA regexp) cannot repeat %s"
-msgstr "E888: (NFA ณ‹K•\\Œป) ŒJ‚่•ิ‚น‚‚น‚๑ %s"
-
-#: ../regexp.c:7022
-msgid ""
-"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be "
-"used "
-msgstr ""
-"E864: \\%#= ‚ษ‚อ 0, 1 ‚เ‚ต‚ญ‚อ 2 ‚ฬ‚‚ช‘ฑ‚ฏ‚็‚๊‚‚ทBณ‹K•\\ŒปƒGƒ“ƒWƒ“‚อŽฉ“ฎ‘I"
-"‘๐‚ณ‚๊‚‚ทB"
-
-msgid "Switching to backtracking RE engine for pattern: "
-msgstr "ŽŸ‚ฬƒpƒ^[ƒ“‚ษƒoƒbƒNƒgƒ‰ƒbƒLƒ“ƒO RE ƒGƒ“ƒWƒ“‚๐“K—p‚ต‚‚ท: "
-
-msgid "E865: (NFA) Regexp end encountered prematurely"
-msgstr "E865: (NFA) Š๚‘า‚ๆ‚่‘‚ญณ‹K•\\Œป‚ฬI’[‚ษ“ž’B‚ต‚‚ต‚ฝ"
-
-#: ../regexp_nfa.c:240
-#, c-format
-msgid "E866: (NFA regexp) Misplaced %c"
-msgstr "E866: (NFA ณ‹K•\\Œป) ˆส’u‚ชŒ๋‚ม‚ฤ‚ข‚‚ท: %c"
-
-#: ../regexp_nfa.c:242
-#, c-format
-msgid "E877: (NFA regexp) Invalid character class: %<PRId64>"
-msgstr "E877: (NFA ณ‹K•\\Œป) –ณŒ๘‚ศ•ถŽšƒNƒ‰ƒX: %<PRId64>"
-
-#: ../regexp_nfa.c:1261
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\z%c'"
-msgstr "E867: (NFA) –ข’m‚ฬƒIƒyƒŒ[ƒ^‚ล‚ท: '\\z%c'"
-
-#: ../regexp_nfa.c:1387
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\%%%c'"
-msgstr "E867: (NFA) –ข’m‚ฬƒIƒyƒŒ[ƒ^‚ล‚ท: '\\%%%c'"
-
-#: ../regexp_nfa.c:1802
-#, c-format
-msgid "E869: (NFA) Unknown operator '\\@%c'"
-msgstr "E869: (NFA) –ข’m‚ฬƒIƒyƒŒ[ƒ^‚ล‚ท: '\\@%c'"
-
-#: ../regexp_nfa.c:1831
-msgid "E870: (NFA regexp) Error reading repetition limits"
-msgstr "E870: (NFA ณ‹K•\\Œป) ŒJ‚่•ิ‚ต‚ฬงŒภ‰๑”‚๐“วž’†‚ษƒGƒ‰["
-
-#. Can't have a multi follow a multi.
-#: ../regexp_nfa.c:1895
-msgid "E871: (NFA regexp) Can't have a multi follow a multi !"
-msgstr "E871: (NFA ณ‹K•\\Œป) ŒJ‚่•ิ‚ต ‚ฬŒใ‚ษ ŒJ‚่•ิ‚ต ‚อ‚ล‚ซ‚‚น‚๑!"
-
-#. Too many `('
-#: ../regexp_nfa.c:2037
-msgid "E872: (NFA regexp) Too many '('"
-msgstr "E872: (NFA ณ‹K•\\Œป) '(' ‚ช‘ฝ‰฿‚ฌ‚‚ท"
-
-#: ../regexp_nfa.c:2042
-msgid "E879: (NFA regexp) Too many \\z("
-msgstr "E879: (NFA ณ‹K•\\Œป) \\z( ‚ช‘ฝ‰฿‚ฌ‚‚ท"
-
-#: ../regexp_nfa.c:2066
-msgid "E873: (NFA regexp) proper termination error"
-msgstr "E873: (NFA ณ‹K•\\Œป) I’[‹L†‚ช‚ ‚่‚‚น‚๑"
-
-#: ../regexp_nfa.c:2599
-msgid "E874: (NFA) Could not pop the stack !"
-msgstr "E874: (NFA) ƒXƒ^ƒbƒN‚๐ƒ|ƒbƒv‚ล‚ซ‚‚น‚๑!"
-
-#: ../regexp_nfa.c:3298
-msgid ""
-"E875: (NFA regexp) (While converting from postfix to NFA), too many states "
-"left on stack"
-msgstr ""
-"E875: (NFA ณ‹K•\\Œป) (Œใ’u•ถŽš—๑‚๐NFA‚ษ•ฯŠท’†‚ษ) ƒXƒ^ƒbƒN‚ษŽc‚ณ‚๊‚ฝƒXƒe[ƒg‚ช"
-"‘ฝ‰฿‚ฌ‚‚ท"
-
-#: ../regexp_nfa.c:3302
-msgid "E876: (NFA regexp) Not enough space to store the whole NFA "
-msgstr "E876: (NFA ณ‹K•\\Œป) NFA‘S‘ฬ‚๐•‘ถ‚ท‚้‚ษ‚อ‹๓‚ซƒXƒy[ƒX‚ช‘ซ‚่‚‚น‚๑"
-
-#: ../regexp_nfa.c:4571 ../regexp_nfa.c:4869
-msgid ""
-"Could not open temporary log file for writing, displaying on stderr ... "
-msgstr ""
-"NFAณ‹K•\\ŒปƒGƒ“ƒWƒ“—p‚ฬƒƒOƒtƒ@ƒCƒ‹‚๐‘ž—p‚ฦ‚ต‚ฤŠJ‚ฏ‚‚น‚๑BƒƒO‚อ•W€o—อ‚ษ"
-"o—อ‚ต‚‚ทB"
-
-#: ../regexp_nfa.c:4840
-#, c-format
-msgid "(NFA) COULD NOT OPEN %s !"
-msgstr "(NFA) ƒƒOƒtƒ@ƒCƒ‹ %s ‚๐ŠJ‚ฏ‚‚น‚๑!"
-
-#: ../regexp_nfa.c:6049
-msgid "Could not open temporary log file for writing "
-msgstr "NFAณ‹K•\\ŒปƒGƒ“ƒWƒ“—p‚ฬƒƒOƒtƒ@ƒCƒ‹‚๐‘ž—p‚ฦ‚ต‚ฤŠJ‚ฏ‚‚น‚๑B"
-
-#: ../screen.c:7435
-msgid " VREPLACE"
-msgstr " ‰ผ‘z’uŠท"
-
-#: ../screen.c:7437
-msgid " REPLACE"
-msgstr " ’uŠท"
-
-#: ../screen.c:7440
-msgid " REVERSE"
-msgstr " ”ฝ“]"
-
-#: ../screen.c:7441
-msgid " INSERT"
-msgstr " ‘}“"
-
-#: ../screen.c:7443
-msgid " (insert)"
-msgstr " (‘}“)"
-
-#: ../screen.c:7445
-msgid " (replace)"
-msgstr " (’uŠท)"
-
-#: ../screen.c:7447
-msgid " (vreplace)"
-msgstr " (‰ผ‘z’uŠท)"
-
-#: ../screen.c:7449
-msgid " Hebrew"
-msgstr " ƒwƒuƒ‰ƒC"
-
-#: ../screen.c:7454
-msgid " Arabic"
-msgstr " ƒAƒ‰ƒrƒA"
-
-#: ../screen.c:7456
-msgid " (lang)"
-msgstr " (ŒพŒ๊)"
-
-#: ../screen.c:7459
-msgid " (paste)"
-msgstr " (“\\‚่•t‚ฏ)"
-
-#: ../screen.c:7469
-msgid " VISUAL"
-msgstr " ƒrƒWƒ…ƒAƒ‹"
-
-#: ../screen.c:7470
-msgid " VISUAL LINE"
-msgstr " ƒrƒWƒ…ƒAƒ‹ s"
-
-#: ../screen.c:7471
-msgid " VISUAL BLOCK"
-msgstr " ƒrƒWƒ…ƒAƒ‹ ‹้Œ`"
-
-#: ../screen.c:7472
-msgid " SELECT"
-msgstr " ƒZƒŒƒNƒg"
-
-#: ../screen.c:7473
-msgid " SELECT LINE"
-msgstr " sŽwŒ‘I‘๐"
-
-#: ../screen.c:7474
-msgid " SELECT BLOCK"
-msgstr " ‹้Œ`‘I‘๐"
-
-#: ../screen.c:7486 ../screen.c:7541
-msgid "recording"
-msgstr "‹L˜^’†"
-
-#: ../search.c:487
-#, c-format
-msgid "E383: Invalid search string: %s"
-msgstr "E383: –ณŒ๘‚ศŒŸ๕•ถŽš—๑‚ล‚ท: %s"
-
-#: ../search.c:832
-#, c-format
-msgid "E384: search hit TOP without match for: %s"
-msgstr "E384: ใ‚‚ลŒŸ๕‚ต‚‚ต‚ฝ‚ชŠY“–‰ำŠ‚อ‚ ‚่‚‚น‚๑: %s"
-
-#: ../search.c:835
-#, c-format
-msgid "E385: search hit BOTTOM without match for: %s"
-msgstr "E385: ‰บ‚‚ลŒŸ๕‚ต‚‚ต‚ฝ‚ชŠY“–‰ำŠ‚อ‚ ‚่‚‚น‚๑: %s"
-
-#: ../search.c:1200
-msgid "E386: Expected '?' or '/' after ';'"
-msgstr "E386: ';' ‚ฬ‚ ‚ฦ‚ษ‚อ '?' ‚ฉ '/' ‚ชŠ๚‘า‚ณ‚๊‚ฤ‚ข‚้"
-
-#: ../search.c:4085
-msgid " (includes previously listed match)"
-msgstr " (‘O‚ษ—๑‹“‚ต‚ฝŠY“–‰ำŠ‚๐Š‚)"
-
-#. cursor at status line
-#: ../search.c:4104
-msgid "--- Included files "
-msgstr "--- ƒCƒ“ƒNƒ‹[ƒh‚ณ‚๊‚ฝƒtƒ@ƒCƒ‹ "
-
-#: ../search.c:4106
-msgid "not found "
-msgstr "Œฉ‚ย‚ฉ‚่‚‚น‚๑ "
-
-#: ../search.c:4107
-msgid "in path ---\n"
-msgstr "ƒpƒX‚ษ ----\n"
-
-#: ../search.c:4168
-msgid " (Already listed)"
-msgstr " (Š๙‚ษ—๑‹“)"
-
-#: ../search.c:4170
-msgid " NOT FOUND"
-msgstr " Œฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#: ../search.c:4211
-#, c-format
-msgid "Scanning included file: %s"
-msgstr "ƒCƒ“ƒNƒ‹[ƒh‚ณ‚๊‚ฝƒtƒ@ƒCƒ‹‚๐ƒXƒLƒƒƒ“’†: %s"
-
-#: ../search.c:4216
-#, c-format
-msgid "Searching included file %s"
-msgstr "ƒCƒ“ƒNƒ‹[ƒh‚ณ‚๊‚ฝƒtƒ@ƒCƒ‹‚๐ƒXƒLƒƒƒ“’† %s"
-
-#: ../search.c:4405
-msgid "E387: Match is on current line"
-msgstr "E387: Œปs‚ษŠY“–‚ช‚ ‚่‚‚ท"
-
-#: ../search.c:4517
-msgid "All included files were found"
-msgstr "‘S‚ฤ‚ฬƒCƒ“ƒNƒ‹[ƒh‚ณ‚๊‚ฝƒtƒ@ƒCƒ‹‚ชŒฉ‚ย‚ฉ‚่‚‚ต‚ฝ"
-
-#: ../search.c:4519
-msgid "No included files"
-msgstr "ƒCƒ“ƒNƒ‹[ƒhƒtƒ@ƒCƒ‹‚อ‚ ‚่‚‚น‚๑"
-
-#: ../search.c:4527
-msgid "E388: Couldn't find definition"
-msgstr "E388: ’่‹`‚๐Œฉ‚ย‚ฏ‚็‚๊‚‚น‚๑"
-
-#: ../search.c:4529
-msgid "E389: Couldn't find pattern"
-msgstr "E389: ƒpƒ^[ƒ“‚๐Œฉ‚ย‚ฏ‚็‚๊‚‚น‚๑"
-
-#: ../search.c:4668
-msgid "Substitute "
-msgstr "Substitute "
-
-#: ../search.c:4681
-#, c-format
-msgid ""
-"\n"
-"# Last %sSearch Pattern:\n"
-"~"
-msgstr ""
-"\n"
-"# ลŒใ‚ฬ %sŒŸ๕ƒpƒ^[ƒ“:\n"
-"~"
-
-#: ../spell.c:951
-msgid "E759: Format error in spell file"
-msgstr "E759: ƒXƒyƒ‹ƒtƒ@ƒCƒ‹‚ฬ‘ŽฎƒGƒ‰[‚ล‚ท"
-
-#: ../spell.c:952
-msgid "E758: Truncated spell file"
-msgstr "E758: ƒXƒyƒ‹ƒtƒ@ƒCƒ‹‚ชุŽๆ‚็‚๊‚ฤ‚ข‚้‚ๆ‚ค‚ล‚ท"
-
-#: ../spell.c:953
-#, c-format
-msgid "Trailing text in %s line %d: %s"
-msgstr "%s (%d s–ฺ) ‚ษ‘ฑ‚ญƒeƒLƒXƒg: %s"
-
-#: ../spell.c:954
-#, c-format
-msgid "Affix name too long in %s line %d: %s"
-msgstr "%s (%d s–ฺ) ‚ฬ affix –ผ‚ช’ท‰฿‚ฌ‚‚ท: %s"
-
-#: ../spell.c:955
-msgid "E761: Format error in affix file FOL, LOW or UPP"
-msgstr ""
-"E761: affixƒtƒ@ƒCƒ‹‚ฬ FOL, LOW ‚เ‚ต‚ญ‚อ UPP ‚ฬƒtƒH[ƒ}ƒbƒg‚ษƒGƒ‰[‚ช‚ ‚่‚‚ท"
-
-#: ../spell.c:957
-msgid "E762: Character in FOL, LOW or UPP is out of range"
-msgstr "E762: FOL, LOW ‚เ‚ต‚ญ‚อ UPP ‚ฬ•ถŽš‚ช”อˆอŠO‚ล‚ท"
-
-#: ../spell.c:958
-msgid "Compressing word tree..."
-msgstr "’PŒ๊ƒcƒŠ[‚๐ˆณk‚ต‚ฤ‚ข‚‚ท..."
-
-#: ../spell.c:1951
-msgid "E756: Spell checking is not enabled"
-msgstr "E756: ƒXƒyƒ‹ƒ`ƒFƒbƒN‚อ–ณŒ๘‰ป‚ณ‚๊‚ฤ‚ข‚‚ท"
-
-#: ../spell.c:2249
-#, c-format
-msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
-msgstr ""
-"Œx: ’PŒ๊ƒŠƒXƒg \"%s.%s.spl\" ‚จ‚ๆ‚ั \"%s.ascii.spl\" ‚อŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#: ../spell.c:2473
-#, c-format
-msgid "Reading spell file \"%s\""
-msgstr "ƒXƒyƒ‹ƒtƒ@ƒCƒ‹ \"%s\" ‚๐“วž’†"
-
-#: ../spell.c:2496
-msgid "E757: This does not look like a spell file"
-msgstr "E757: ƒXƒyƒ‹ƒtƒ@ƒCƒ‹‚ล‚อ‚ศ‚ข‚ๆ‚ค‚ล‚ท"
-
-#: ../spell.c:2501
-msgid "E771: Old spell file, needs to be updated"
-msgstr "E771: Œร‚ขƒXƒyƒ‹ƒtƒ@ƒCƒ‹‚ศ‚ฬ‚ล, ƒAƒbƒvƒf[ƒg‚ต‚ฤ‚ญ‚พ‚ณ‚ข"
-
-#: ../spell.c:2504
-msgid "E772: Spell file is for newer version of Vim"
-msgstr "E772: ‚ๆ‚่V‚ต‚ขƒo[ƒWƒ‡ƒ“‚ฬ Vim —p‚ฬƒXƒyƒ‹ƒtƒ@ƒCƒ‹‚ล‚ท"
-
-#: ../spell.c:2602
-msgid "E770: Unsupported section in spell file"
-msgstr "E770: ƒXƒyƒ‹ƒtƒ@ƒCƒ‹‚ษƒTƒ|[ƒg‚ต‚ฤ‚ข‚ศ‚ขƒZƒNƒVƒ‡ƒ“‚ช‚ ‚่‚‚ท"
-
-#: ../spell.c:3762
-#, c-format
-msgid "Warning: region %s not supported"
-msgstr "Œx9: %s ‚ฦ‚ข‚ค”อˆอ‚อƒTƒ|[ƒg‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../spell.c:4550
-#, c-format
-msgid "Reading affix file %s ..."
-msgstr "affix ƒtƒ@ƒCƒ‹ %s ‚๐“วž’†..."
-
-#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
-#, c-format
-msgid "Conversion failure for word in %s line %d: %s"
-msgstr "%s (%d s–ฺ) ‚ฬ’PŒ๊‚๐•ฯŠท‚ล‚ซ‚‚น‚๑‚ล‚ต‚ฝ: %s"
-
-#: ../spell.c:4630 ../spell.c:6170
-#, c-format
-msgid "Conversion in %s not supported: from %s to %s"
-msgstr "%s “เ‚ฬŽŸ‚ฬ•ฯŠท‚อƒTƒ|[ƒg‚ณ‚๊‚ฤ‚ข‚‚น‚๑: %s ‚ฉ‚็ %s ‚ึ"
-
-#: ../spell.c:4642
-#, c-format
-msgid "Invalid value for FLAG in %s line %d: %s"
-msgstr "%s “เ‚ฬ %d s–ฺ‚ฬ FLAG ‚ษ–ณŒ๘‚ศ’l‚ช‚ ‚่‚‚ท: %s"
-
-#: ../spell.c:4655
-#, c-format
-msgid "FLAG after using flags in %s line %d: %s"
-msgstr "%s “เ‚ฬ %d s–ฺ‚ษƒtƒ‰ƒO‚ฬ“๑dŽg—p‚ช‚ ‚่‚‚ท: %s"
-
-#: ../spell.c:4723
-#, c-format
-msgid ""
-"Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line "
-"%d"
-msgstr ""
-"%s ‚ฬ %d s–ฺ‚ฬ PFX €–ฺ‚ฬŒใ‚ฬ COMPOUNDFORBIDFLAG ‚ฬ’่‹`‚อŒ๋‚ม‚ฝŒ‹‰ส‚๐ถ‚ถ‚้"
-"‚ฑ‚ฦ‚ช‚ ‚่‚‚ท"
-
-#: ../spell.c:4731
-#, c-format
-msgid ""
-"Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line "
-"%d"
-msgstr ""
-"%s ‚ฬ %d s–ฺ‚ฬ PFX €–ฺ‚ฬŒใ‚ฬ COMPOUNDPERMITFLAG ‚ฬ’่‹`‚อŒ๋‚ม‚ฝŒ‹‰ส‚๐ถ‚ถ‚้"
-"‚ฑ‚ฦ‚ช‚ ‚่‚‚ท"
-
-#: ../spell.c:4747
-#, c-format
-msgid "Wrong COMPOUNDRULES value in %s line %d: %s"
-msgstr "COMPOUNDRULES ‚ฬ’l‚ษŒ๋‚่‚ช‚ ‚่‚‚ท. ƒtƒ@ƒCƒ‹ %s ‚ฬ %d s–ฺ: %s"
-
-#: ../spell.c:4771
-#, c-format
-msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s"
-msgstr "%s ‚ฬ %d s–ฺ‚ฬ COMPOUNDWORDMAX ‚ฬ’l‚ษŒ๋‚่‚ช‚ ‚่‚‚ท: %s"
-
-#: ../spell.c:4777
-#, c-format
-msgid "Wrong COMPOUNDMIN value in %s line %d: %s"
-msgstr "%s ‚ฬ %d s–ฺ‚ฬ COMPOUNDMIN ‚ฬ’l‚ษŒ๋‚่‚ช‚ ‚่‚‚ท: %s"
-
-#: ../spell.c:4783
-#, c-format
-msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s"
-msgstr "%s ‚ฬ %d s–ฺ‚ฬ COMPOUNDSYLMAX ‚ฬ’l‚ษŒ๋‚่‚ช‚ ‚่‚‚ท: %s"
-
-#: ../spell.c:4795
-#, c-format
-msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"
-msgstr "%s ‚ฬ %d s–ฺ‚ฬ CHECKCOMPOUNDPATTERN ‚ฬ’l‚ษŒ๋‚่‚ช‚ ‚่‚‚ท: %s"
-
-#: ../spell.c:4847
-#, c-format
-msgid "Different combining flag in continued affix block in %s line %d: %s"
-msgstr ""
-"%s ‚ฬ %d s–ฺ‚ฬ ˜A‘ฑ affix ƒuƒƒbƒN‚ฬƒtƒ‰ƒO‚ฬ‘g‡‚น‚ษˆแ‚ข‚ช‚ ‚่‚‚ท: %s"
-
-#: ../spell.c:4850
-#, c-format
-msgid "Duplicate affix in %s line %d: %s"
-msgstr "%s ‚ฬ %d s–ฺ‚ษ d•ก‚ต‚ฝ affix ‚๐ŒŸo‚ต‚‚ต‚ฝ: %s"
-
-#: ../spell.c:4871
-#, c-format
-msgid ""
-"Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s "
-"line %d: %s"
-msgstr ""
-"%s ‚ฬ %d s–ฺ‚ฬ affix ‚อ BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST "
-"‚ษŽg—p‚ต‚ฤ‚ญ‚พ‚ณ‚ข: %s"
-
-#: ../spell.c:4893
-#, c-format
-msgid "Expected Y or N in %s line %d: %s"
-msgstr "%s ‚ฬ %d s–ฺ‚ล‚อ Y ‚ฉ N ‚ช•K—v‚ล‚ท: %s"
-
-#: ../spell.c:4968
-#, c-format
-msgid "Broken condition in %s line %d: %s"
-msgstr "%s ‚ฬ %d s–ฺ‚ฬ ๐Œ‚อ‰๓‚๊‚ฤ‚ข‚‚ท: %s"
-
-#: ../spell.c:5091
-#, c-format
-msgid "Expected REP(SAL) count in %s line %d"
-msgstr "%s ‚ฬ %d s–ฺ‚ษ‚อ REP(SAL) ‚ฬ‰๑”‚ช•K—v‚ล‚ท"
-
-#: ../spell.c:5120
-#, c-format
-msgid "Expected MAP count in %s line %d"
-msgstr "%s ‚ฬ %d s–ฺ‚ษ‚อ MAP ‚ฬ‰๑”‚ช•K—v‚ล‚ท"
-
-#: ../spell.c:5132
-#, c-format
-msgid "Duplicate character in MAP in %s line %d"
-msgstr "%s ‚ฬ %d s–ฺ‚ฬ MAP ‚ษd•ก‚ต‚ฝ•ถŽš‚ช‚ ‚่‚‚ท"
-
-#: ../spell.c:5176
-#, c-format
-msgid "Unrecognized or duplicate item in %s line %d: %s"
-msgstr "%s ‚ฬ %d s–ฺ‚ษ ”FŽฏ‚ล‚ซ‚ศ‚ข‚ฉd•ก‚ต‚ฝ€–ฺ‚ช‚ ‚่‚‚ท: %s"
-
-#: ../spell.c:5197
-#, c-format
-msgid "Missing FOL/LOW/UPP line in %s"
-msgstr "%s s–ฺ‚ษ FOL/LOW/UPP ‚ช‚ ‚่‚‚น‚๑"
-
-#: ../spell.c:5220
-msgid "COMPOUNDSYLMAX used without SYLLABLE"
-msgstr "SYLLABLE ‚ชŽw’่‚ณ‚๊‚ศ‚ข COMPOUNDSYLMAX"
-
-#: ../spell.c:5236
-msgid "Too many postponed prefixes"
-msgstr "’x‰„Œใ’uŽq‚ช‘ฝ‰฿‚ฌ‚‚ท"
-
-#: ../spell.c:5238
-msgid "Too many compound flags"
-msgstr "•ก‡ƒtƒ‰ƒO‚ช‘ฝ‰฿‚ฌ‚‚ท"
-
-#: ../spell.c:5240
-msgid "Too many postponed prefixes and/or compound flags"
-msgstr "’x‰„Œใ’uŽq ‚ฦ/‚เ‚ต‚ญ‚อ •ก‡ƒtƒ‰ƒO‚ช‘ฝ‰฿‚ฌ‚‚ท"
-
-#: ../spell.c:5250
-#, c-format
-msgid "Missing SOFO%s line in %s"
-msgstr "SOFO%s s‚ช %s ‚ษ‚ ‚่‚‚น‚๑"
-
-#: ../spell.c:5253
-#, c-format
-msgid "Both SAL and SOFO lines in %s"
-msgstr "SALs ‚ฦ SOFOs ‚ช %s ‚ล—ผ•๛Žw’่‚ณ‚๊‚ฤ‚ข‚‚ท"
-
-#: ../spell.c:5331
-#, c-format
-msgid "Flag is not a number in %s line %d: %s"
-msgstr "%s ‚ฬ %d s‚ฬ ƒtƒ‰ƒO‚ช”’l‚ล‚อ‚ ‚่‚‚น‚๑: %s"
-
-#: ../spell.c:5334
-#, c-format
-msgid "Illegal flag in %s line %d: %s"
-msgstr "%s ‚ฬ %d s–ฺ‚ฬ ƒtƒ‰ƒO‚ช•sณ‚ล‚ท: %s"
-
-#: ../spell.c:5493 ../spell.c:5501
-#, c-format
-msgid "%s value differs from what is used in another .aff file"
-msgstr "’l %s ‚อ‘ผ‚ฬ .aff ƒtƒ@ƒCƒ‹‚ลŽg—p‚ณ‚๊‚ฝ‚ฬ‚ฦˆู‚ศ‚่‚‚ท"
-
-#: ../spell.c:5602
-#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "Žซ‘ƒtƒ@ƒCƒ‹ %s ‚๐ƒXƒLƒƒƒ“’†..."
-
-#: ../spell.c:5611
-#, c-format
-msgid "E760: No word count in %s"
-msgstr "E760: %s ‚ษ‚อ’PŒ๊”‚ช‚ ‚่‚‚น‚๑"
-
-#: ../spell.c:5669
-#, c-format
-msgid "line %6d, word %6d - %s"
-msgstr "s %6d, ’PŒ๊ %6d - %s"
-
-#: ../spell.c:5691
-#, c-format
-msgid "Duplicate word in %s line %d: %s"
-msgstr "%s ‚ฬ %d s–ฺ‚ล d•ก’PŒ๊‚ชŒฉ‚ย‚ฉ‚่‚‚ต‚ฝ: %s"
-
-#: ../spell.c:5694
-#, c-format
-msgid "First duplicate word in %s line %d: %s"
-msgstr "d•ก‚ฬ‚ค‚ฟล‰‚ฬ’PŒ๊‚อ %s ‚ฬ %d s–ฺ‚ล‚ท: %s"
-
-#: ../spell.c:5746
-#, c-format
-msgid "%d duplicate word(s) in %s"
-msgstr "%d Œย‚ฬ’PŒ๊‚ชŒฉ‚ย‚ฉ‚่‚‚ต‚ฝ (%s “เ)"
-
-#: ../spell.c:5748
-#, c-format
-msgid "Ignored %d word(s) with non-ASCII characters in %s"
-msgstr "”๑ASCII•ถŽš‚๐Š‚ %d Œย‚ฬ’PŒ๊‚๐–ณŽ‹‚ต‚‚ต‚ฝ (%s “เ)"
-
-#: ../spell.c:6115
-#, c-format
-msgid "Reading word file %s ..."
-msgstr "•W€“—อ‚ฉ‚็“วž‚’† %s ..."
-
-#: ../spell.c:6155
-#, c-format
-msgid "Duplicate /encoding= line ignored in %s line %d: %s"
-msgstr "%s ‚ฬ %d s–ฺ‚ฬ d•ก‚ต‚ฝ /encoding= s‚๐–ณŽ‹‚ต‚‚ต‚ฝ: %s"
-
-#: ../spell.c:6159
-#, c-format
-msgid "/encoding= line after word ignored in %s line %d: %s"
-msgstr "%s ‚ฬ %d s–ฺ‚ฬ ’PŒ๊‚ฬŒใ‚ฬ /encoding= s‚๐–ณŽ‹‚ต‚‚ต‚ฝ: %s"
-
-#: ../spell.c:6180
-#, c-format
-msgid "Duplicate /regions= line ignored in %s line %d: %s"
-msgstr "%s ‚ฬ %d s–ฺ‚ฬ d•ก‚ต‚ฝ /regions= s‚๐–ณŽ‹‚ต‚‚ต‚ฝ: %s"
-
-#: ../spell.c:6185
-#, c-format
-msgid "Too many regions in %s line %d: %s"
-msgstr "%s ‚ฬ %d s–ฺ, ”อˆอŽw’่‚ช‘ฝ‰฿‚ฌ‚‚ท: %s"
-
-#: ../spell.c:6198
-#, c-format
-msgid "/ line ignored in %s line %d: %s"
-msgstr "%s ‚ฬ %d s–ฺ‚ฬ d•ก‚ต‚ฝ / s‚๐–ณŽ‹‚ต‚‚ต‚ฝ: %s"
-
-#: ../spell.c:6224
-#, c-format
-msgid "Invalid region nr in %s line %d: %s"
-msgstr "%s ‚ฬ %d s–ฺ –ณŒ๘‚ศ nr —ฬˆๆ‚ล‚ท: %s"
-
-#: ../spell.c:6230
-#, c-format
-msgid "Unrecognized flags in %s line %d: %s"
-msgstr "%s ‚ฬ %d s–ฺ ”FŽฏ•s”\\‚ศƒtƒ‰ƒO‚ล‚ท: %s"
-
-#: ../spell.c:6257
-#, c-format
-msgid "Ignored %d words with non-ASCII characters"
-msgstr "”๑ASCII•ถŽš‚๐Š‚ %d Œย‚ฬ’PŒ๊‚๐–ณŽ‹‚ต‚‚ต‚ฝ"
-
-#: ../spell.c:6656
-#, c-format
-msgid "Compressed %d of %d nodes; %d (%d%%) remaining"
-msgstr "ƒm[ƒh %d Œย(‘S %d Œย’†) ‚๐ˆณk‚ต‚‚ต‚ฝ; Žc‚่ %d (%d%%)"
-
-#: ../spell.c:7340
-msgid "Reading back spell file..."
-msgstr "ƒXƒyƒ‹ƒtƒ@ƒCƒ‹‚๐‹t“วž’†"
-
-#. Go through the trie of good words, soundfold each word and add it to
-#. the soundfold trie.
-#: ../spell.c:7357
-msgid "Performing soundfolding..."
-msgstr "‰นบ๔ž‚‚๐Žภs’†..."
-
-#: ../spell.c:7368
-#, c-format
-msgid "Number of words after soundfolding: %<PRId64>"
-msgstr "‰นบ๔ž‚Œใ‚ฬ‘’PŒ๊”: %<PRId64>"
-
-#: ../spell.c:7476
-#, c-format
-msgid "Total number of words: %d"
-msgstr "‘’PŒ๊”: %d"
-
-#: ../spell.c:7655
-#, c-format
-msgid "Writing suggestion file %s ..."
-msgstr "CณŒ๓•โƒtƒ@ƒCƒ‹ \"%s\" ‚๐‘ž‚’†..."
-
-#: ../spell.c:7707 ../spell.c:7927
-#, c-format
-msgid "Estimated runtime memory use: %d bytes"
-msgstr "„’่ƒƒ‚ƒŠŽg—p—ส: %d ƒoƒCƒg"
-
-#: ../spell.c:7820
-msgid "E751: Output file name must not have region name"
-msgstr "E751: o—อƒtƒ@ƒCƒ‹–ผ‚ษ‚อ”อˆอ–ผ‚๐Š‚฿‚็‚๊‚‚น‚๑"
-
-#: ../spell.c:7822
-msgid "E754: Only up to 8 regions supported"
-msgstr "E754: ”อˆอ‚อ 8 Œย‚‚ล‚ต‚ฉƒTƒ|[ƒg‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../spell.c:7846
-#, c-format
-msgid "E755: Invalid region in %s"
-msgstr "E755: –ณŒ๘‚ศ”อˆอ‚ล‚ท: %s"
-
-#: ../spell.c:7907
-msgid "Warning: both compounding and NOBREAK specified"
-msgstr "Œx: •ก‡ƒtƒ‰ƒO‚ฦ NOBREAK ‚ช—ผ•๛‚ฦ‚เŽw’่‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../spell.c:7920
-#, c-format
-msgid "Writing spell file %s ..."
-msgstr "ƒXƒyƒ‹ƒtƒ@ƒCƒ‹ %s ‚๐‘ž‚’†..."
-
-#: ../spell.c:7925
-msgid "Done!"
-msgstr "Žภs‚ต‚‚ต‚ฝ!"
-
-#: ../spell.c:8034
-#, c-format
-msgid "E765: 'spellfile' does not have %<PRId64> entries"
-msgstr "E765: 'spellfile' ‚ษ‚อ %<PRId64> Œย‚ฬƒGƒ“ƒgƒŠ‚อ‚ ‚่‚‚น‚๑"
-
-#: ../spell.c:8074
-#, c-format
-msgid "Word '%.*s' removed from %s"
-msgstr "’PŒ๊ '%.*s' ‚ช %s ‚ฉ‚็ํœ‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../spell.c:8117
-#, c-format
-msgid "Word '%.*s' added to %s"
-msgstr "’PŒ๊ '%.*s' ‚ช %s ‚ึ’ว‰ม‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../spell.c:8381
-msgid "E763: Word characters differ between spell files"
-msgstr "E763: ’PŒ๊‚ฬ•ถŽš‚ชƒXƒyƒ‹ƒtƒ@ƒCƒ‹‚ฦˆู‚ศ‚่‚‚ท"
-
-#: ../spell.c:8684
-msgid "Sorry, no suggestions"
-msgstr "Žc”O‚ล‚ท‚ช, CณŒ๓•โ‚อ‚ ‚่‚‚น‚๑"
-
-#: ../spell.c:8687
-#, c-format
-msgid "Sorry, only %<PRId64> suggestions"
-msgstr "Žc”O‚ล‚ท‚ช, CณŒ๓•โ‚อ %<PRId64> Œย‚ต‚ฉ‚ ‚่‚‚น‚๑"
-
-#. for when 'cmdheight' > 1
-#. avoid more prompt
-#: ../spell.c:8704
-#, c-format
-msgid "Change \"%.*s\" to:"
-msgstr "\"%.*s\" ‚๐ŽŸ‚ึ•ฯŠท:"
-
-#: ../spell.c:8737
-#, c-format
-msgid " < \"%.*s\""
-msgstr " < \"%.*s\""
-
-#: ../spell.c:8882
-msgid "E752: No previous spell replacement"
-msgstr "E752: ƒXƒyƒ‹’uŠท‚ช‚‚พŽภs‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../spell.c:8925
-#, c-format
-msgid "E753: Not found: %s"
-msgstr "E753: Œฉ‚ย‚ฉ‚่‚‚น‚๑: %s"
-
-#: ../spell.c:9276
-#, c-format
-msgid "E778: This does not look like a .sug file: %s"
-msgstr "E778: .sug ƒtƒ@ƒCƒ‹‚ล‚อ‚ศ‚ข‚ๆ‚ค‚ล‚ท: %s"
-
-#: ../spell.c:9282
-#, c-format
-msgid "E779: Old .sug file, needs to be updated: %s"
-msgstr "E779: Œร‚ข .sug ƒtƒ@ƒCƒ‹‚ศ‚ฬ‚ล, ƒAƒbƒvƒf[ƒg‚ต‚ฤ‚ญ‚พ‚ณ‚ข: %s"
-
-#: ../spell.c:9286
-#, c-format
-msgid "E780: .sug file is for newer version of Vim: %s"
-msgstr "E780: ‚ๆ‚่V‚ต‚ขƒo[ƒWƒ‡ƒ“‚ฬ Vim —p‚ฬ .sug ƒtƒ@ƒCƒ‹‚ล‚ท: %s"
-
-#: ../spell.c:9295
-#, c-format
-msgid "E781: .sug file doesn't match .spl file: %s"
-msgstr "E781: .sug ƒtƒ@ƒCƒ‹‚ช .spl ƒtƒ@ƒCƒ‹‚ฦˆ๊’v‚ต‚‚น‚๑: %s"
-
-#: ../spell.c:9305
-#, c-format
-msgid "E782: error while reading .sug file: %s"
-msgstr "E782: .sug ƒtƒ@ƒCƒ‹‚ฬ“วž’†‚ษƒGƒ‰[‚ช”ญถ‚ต‚‚ต‚ฝ: %s"
-
-#. This should have been checked when generating the .spl
-#. file.
-#: ../spell.c:11575
-msgid "E783: duplicate char in MAP entry"
-msgstr "E783: MAP ƒGƒ“ƒgƒŠ‚ษd•ก•ถŽš‚ช‘ถ‚ต‚‚ท"
-
-#: ../syntax.c:266
-msgid "No Syntax items defined for this buffer"
-msgstr "‚ฑ‚ฬƒoƒbƒtƒ@‚ษ’่‹`‚ณ‚๊‚ฝ\\•ถ—v‘f‚อ‚ ‚่‚‚น‚๑"
-
-#: ../syntax.c:3083 ../syntax.c:3104 ../syntax.c:3127
-#, c-format
-msgid "E390: Illegal argument: %s"
-msgstr "E390: •sณ‚ศˆ๘”‚ล‚ท: %s"
-
-msgid "syntax iskeyword "
-msgstr "ƒVƒ“ƒ^ƒbƒNƒX—p iskeyword "
-
-#: ../syntax.c:3299
-#, c-format
-msgid "E391: No such syntax cluster: %s"
-msgstr "E391: ‚ป‚ฬ‚ๆ‚ค‚ศ\\•ถƒNƒ‰ƒXƒ^‚อ‚ ‚่‚‚น‚๑: %s"
-
-#: ../syntax.c:3433
-msgid "syncing on C-style comments"
-msgstr "CŒพŒ๊•—ƒRƒƒ“ƒg‚ฉ‚็“ฏŠ๚’†"
-
-#: ../syntax.c:3439
-msgid "no syncing"
-msgstr "”๑“ฏŠ๚"
-
-#: ../syntax.c:3441
-msgid "syncing starts "
-msgstr "“ฏŠ๚ŠJŽn "
-
-#: ../syntax.c:3443 ../syntax.c:3506
-msgid " lines before top line"
-msgstr " s‘O(ƒgƒbƒvs‚ๆ‚่‚เ)"
-
-#: ../syntax.c:3448
-msgid ""
-"\n"
-"--- Syntax sync items ---"
-msgstr ""
-"\n"
-"--- \\•ถ“ฏŠ๚—v‘f ---"
-
-#: ../syntax.c:3452
-msgid ""
-"\n"
-"syncing on items"
-msgstr ""
-"\n"
-"—v‘fใ‚ล“ฏŠ๚’†"
-
-#: ../syntax.c:3457
-msgid ""
-"\n"
-"--- Syntax items ---"
-msgstr ""
-"\n"
-"--- \\•ถ—v‘f ---"
-
-#: ../syntax.c:3475
-#, c-format
-msgid "E392: No such syntax cluster: %s"
-msgstr "E392: ‚ป‚ฬ‚ๆ‚ค‚ศ\\•ถƒNƒ‰ƒXƒ^‚อ‚ ‚่‚‚น‚๑: %s"
-
-#: ../syntax.c:3497
-msgid "minimal "
-msgstr "minimal "
-
-#: ../syntax.c:3503
-msgid "maximal "
-msgstr "maximal "
-
-#: ../syntax.c:3513
-msgid "; match "
-msgstr "; ŠY“– "
-
-#: ../syntax.c:3515
-msgid " line breaks"
-msgstr " Œย‚ฬ‰s"
-
-#: ../syntax.c:4076
-msgid "E395: contains argument not accepted here"
-msgstr "E395: ‚ฑ‚ฬ๊Š‚ล‚อˆ๘”contains‚อ‹–‰ย‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../syntax.c:4096
-msgid "E844: invalid cchar value"
-msgstr "E844: –ณŒ๘‚ศcchar‚ฬ’l‚ล‚ท"
-
-#: ../syntax.c:4107
-msgid "E393: group[t]here not accepted here"
-msgstr "E393: ‚ฑ‚ฑ‚ล‚อƒOƒ‹[ƒv‚อ‹–‰ย‚ณ‚๊‚‚น‚๑"
-
-#: ../syntax.c:4126
-#, c-format
-msgid "E394: Didn't find region item for %s"
-msgstr "E394: %s ‚ฬ”อˆอ—v‘f‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#: ../syntax.c:4188
-msgid "E397: Filename required"
-msgstr "E397: ƒtƒ@ƒCƒ‹–ผ‚ช•K—v‚ล‚ท"
-
-#: ../syntax.c:4221
-msgid "E847: Too many syntax includes"
-msgstr "E847: \\•ถ‚ฬŽๆ‚่ž‚(include)‚ช‘ฝ‰฿‚ฌ‚‚ท"
-
-#: ../syntax.c:4303
-#, c-format
-msgid "E789: Missing ']': %s"
-msgstr "E789: ']' ‚ช‚ ‚่‚‚น‚๑: %s"
-
-#, c-format
-msgid "E890: trailing char after ']': %s]%s"
-msgstr "E890: ']' ‚ฬŒใ‚๋‚ษ—]•ช‚ศ•ถŽš‚ช‚ ‚่‚‚ท: %s]%s"
-
-#: ../syntax.c:4531
-#, c-format
-msgid "E398: Missing '=': %s"
-msgstr "E398: '=' ‚ช‚ ‚่‚‚น‚๑: %s"
-
-#: ../syntax.c:4666
-#, c-format
-msgid "E399: Not enough arguments: syntax region %s"
-msgstr "E399: ˆ๘”‚ช‘ซ‚่‚‚น‚๑: \\•ถ”อˆอ %s"
-
-#: ../syntax.c:4870
-msgid "E848: Too many syntax clusters"
-msgstr "E848: \\•ถƒNƒ‰ƒXƒ^‚ช‘ฝ‰฿‚ฌ‚‚ท"
-
-#: ../syntax.c:4954
-msgid "E400: No cluster specified"
-msgstr "E400: ƒNƒ‰ƒXƒ^‚ชŽw’่‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#. end delimiter not found
-#: ../syntax.c:4986
-#, c-format
-msgid "E401: Pattern delimiter not found: %s"
-msgstr "E401: ƒpƒ^[ƒ“‹ๆุ‚่‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑: %s"
-
-#: ../syntax.c:5049
-#, c-format
-msgid "E402: Garbage after pattern: %s"
-msgstr "E402: ƒpƒ^[ƒ“‚ฬ‚ ‚ฦ‚ษƒSƒ~‚ช‚ ‚่‚‚ท: %s"
-
-#: ../syntax.c:5120
-msgid "E403: syntax sync: line continuations pattern specified twice"
-msgstr "E403: \\•ถ“ฏŠ๚: ˜A‘ฑsƒpƒ^[ƒ“‚ช2“xŽw’่‚ณ‚๊‚‚ต‚ฝ"
-
-#: ../syntax.c:5169
-#, c-format
-msgid "E404: Illegal arguments: %s"
-msgstr "E404: •sณ‚ศˆ๘”‚ล‚ท: %s"
-
-#: ../syntax.c:5217
-#, c-format
-msgid "E405: Missing equal sign: %s"
-msgstr "E405: “™†‚ช‚ ‚่‚‚น‚๑: %s"
-
-#: ../syntax.c:5222
-#, c-format
-msgid "E406: Empty argument: %s"
-msgstr "E406: ‹๓‚ฬˆ๘”: %s"
-
-#: ../syntax.c:5240
-#, c-format
-msgid "E407: %s not allowed here"
-msgstr "E407: %s ‚อƒRƒR‚ล‚อ‹–‰ย‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#: ../syntax.c:5246
-#, c-format
-msgid "E408: %s must be first in contains list"
-msgstr "E408: %s ‚อ“เ—eƒŠƒXƒg‚ฬๆ“ช‚ล‚ศ‚ฏ‚๊‚ฮ‚ศ‚็‚ศ‚ข"
-
-#: ../syntax.c:5304
-#, c-format
-msgid "E409: Unknown group name: %s"
-msgstr "E409: –ข’m‚ฬƒOƒ‹[ƒv–ผ: %s"
-
-#: ../syntax.c:5512
-#, c-format
-msgid "E410: Invalid :syntax subcommand: %s"
-msgstr "E410: –ณŒ๘‚ศ :syntax ‚ฬƒTƒuƒRƒ}ƒ“ƒh: %s"
-
-#: ../syntax.c:5854
-msgid ""
-" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
-msgstr ""
-" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
-
-#: ../syntax.c:6146
-msgid "E679: recursive loop loading syncolor.vim"
-msgstr "E679: syncolor.vim ‚ฬฤ‹AŒฤ‚ัo‚ต‚๐ŒŸo‚ต‚‚ต‚ฝ"
-
-#: ../syntax.c:6256
-#, c-format
-msgid "E411: highlight group not found: %s"
-msgstr "E411: ƒnƒCƒ‰ƒCƒgƒOƒ‹[ƒv‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑: %s"
-
-#: ../syntax.c:6278
-#, c-format
-msgid "E412: Not enough arguments: \":highlight link %s\""
-msgstr "E412: ˆ๘”‚ช[•ช‚ล‚อ‚ศ‚ข: \":highlight link %s\""
-
-#: ../syntax.c:6284
-#, c-format
-msgid "E413: Too many arguments: \":highlight link %s\""
-msgstr "E413: ˆ๘”‚ช‘ฝ‰฿‚ฌ‚‚ท: \":highlight link %s\""
-
-#: ../syntax.c:6302
-msgid "E414: group has settings, highlight link ignored"
-msgstr "E414: ƒOƒ‹[ƒv‚ช’่‚ณ‚๊‚ฤ‚ข‚้‚ฬ‚ลƒnƒCƒ‰ƒCƒgƒŠƒ“ƒN‚อ–ณŽ‹‚ณ‚๊‚‚ท"
-
-#: ../syntax.c:6367
-#, c-format
-msgid "E415: unexpected equal sign: %s"
-msgstr "E415: —\\Š๚‚น‚ส“™†‚ล‚ท: %s"
-
-#: ../syntax.c:6395
-#, c-format
-msgid "E416: missing equal sign: %s"
-msgstr "E416: “™†‚ช‚ ‚่‚‚น‚๑: %s"
-
-#: ../syntax.c:6418
-#, c-format
-msgid "E417: missing argument: %s"
-msgstr "E417: ˆ๘”‚ช‚ ‚่‚‚น‚๑: %s"
-
-#: ../syntax.c:6446
-#, c-format
-msgid "E418: Illegal value: %s"
-msgstr "E418: •sณ‚ศ’l‚ล‚ท: %s"
-
-#: ../syntax.c:6496
-msgid "E419: FG color unknown"
-msgstr "E419: –ข’m‚ฬ‘OŒiF‚ล‚ท"
-
-#: ../syntax.c:6504
-msgid "E420: BG color unknown"
-msgstr "E420: –ข’m‚ฬ”wŒiF‚ล‚ท"
-
-#: ../syntax.c:6564
-#, c-format
-msgid "E421: Color name or number not recognized: %s"
-msgstr "E421: ƒJƒ‰[–ผ‚โ”ิ†‚๐”FŽฏ‚ล‚ซ‚‚น‚๑: %s"
-
-#: ../syntax.c:6714
-#, c-format
-msgid "E422: terminal code too long: %s"
-msgstr "E422: I’[ƒR[ƒh‚ช’ท‰฿‚ฌ‚‚ท: %s"
-
-#: ../syntax.c:6753
-#, c-format
-msgid "E423: Illegal argument: %s"
-msgstr "E423: •sณ‚ศˆ๘”‚ล‚ท: %s"
-
-#: ../syntax.c:6925
-msgid "E424: Too many different highlighting attributes in use"
-msgstr "E424: ‘ฝ‚ญ‚ฬˆู‚ศ‚้ƒnƒCƒ‰ƒCƒg‘ฎซ‚ชŽg‚ํ‚๊‰฿‚ฌ‚ฤ‚ข‚‚ท"
-
-#: ../syntax.c:7427
-msgid "E669: Unprintable character in group name"
-msgstr "E669: ƒOƒ‹[ƒv–ผ‚ษˆ๓•s‰ย”\\‚ศ•ถŽš‚ช‚ ‚่‚‚ท"
-
-#: ../syntax.c:7434
-msgid "W18: Invalid character in group name"
-msgstr "W18: ƒOƒ‹[ƒv–ผ‚ษ•sณ‚ศ•ถŽš‚ช‚ ‚่‚‚ท"
-
-#: ../syntax.c:7448
-msgid "E849: Too many highlight and syntax groups"
-msgstr "E849: ƒnƒCƒ‰ƒCƒg‚ฦ\\•ถƒOƒ‹[ƒv‚ช‘ฝ‰฿‚ฌ‚‚ท"
-
-#: ../tag.c:104
-msgid "E555: at bottom of tag stack"
-msgstr "E555: ƒ^ƒOƒXƒ^ƒbƒN‚ฬ––”๖‚ล‚ท"
-
-#: ../tag.c:105
-msgid "E556: at top of tag stack"
-msgstr "E556: ƒ^ƒOƒXƒ^ƒbƒN‚ฬๆ“ช‚ล‚ท"
-
-#: ../tag.c:380
-msgid "E425: Cannot go before first matching tag"
-msgstr "E425: ล‰‚ฬŠY“–ƒ^ƒO‚๐’ด‚ฆ‚ฤ–฿‚้‚ฑ‚ฦ‚อ‚ล‚ซ‚‚น‚๑"
-
-#: ../tag.c:504
-#, c-format
-msgid "E426: tag not found: %s"
-msgstr "E426: ƒ^ƒO‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑: %s"
-
-#: ../tag.c:528
-msgid " # pri kind tag"
-msgstr " # pri kind tag"
-
-#: ../tag.c:531
-msgid "file\n"
-msgstr "ƒtƒ@ƒCƒ‹\n"
-
-#: ../tag.c:829
-msgid "E427: There is only one matching tag"
-msgstr "E427: ŠY“–ƒ^ƒO‚ช1‚ย‚พ‚ฏ‚ต‚ฉ‚ ‚่‚‚น‚๑"
-
-#: ../tag.c:831
-msgid "E428: Cannot go beyond last matching tag"
-msgstr "E428: ลŒใ‚ษŠY“–‚ท‚้ƒ^ƒO‚๐’ด‚ฆ‚ฤi‚‚ฑ‚ฦ‚อ‚ล‚ซ‚‚น‚๑"
-
-#: ../tag.c:850
-#, c-format
-msgid "File \"%s\" does not exist"
-msgstr "ƒtƒ@ƒCƒ‹ \"%s\" ‚ช‚ ‚่‚‚น‚๑"
-
-#. Give an indication of the number of matching tags
-#: ../tag.c:859
-#, c-format
-msgid "tag %d of %d%s"
-msgstr "ƒ^ƒO %d (‘S%d%s)"
-
-#: ../tag.c:862
-msgid " or more"
-msgstr " ‚ฉ‚ป‚๊ˆศใ"
-
-#: ../tag.c:864
-msgid " Using tag with different case!"
-msgstr " ƒ^ƒO‚๐ˆู‚ศ‚้case‚ลŽg—p‚ต‚‚ท!"
-
-#: ../tag.c:909
-#, c-format
-msgid "E429: File \"%s\" does not exist"
-msgstr "E429: ƒtƒ@ƒCƒ‹ \"%s\" ‚ช‚ ‚่‚‚น‚๑"
-
-#. Highlight title
-#: ../tag.c:960
-msgid ""
-"\n"
-" # TO tag FROM line in file/text"
-msgstr ""
-"\n"
-" # TO ƒ^ƒO FROM s in file/text"
-
-#: ../tag.c:1303
-#, c-format
-msgid "Searching tags file %s"
-msgstr "ƒ^ƒOƒtƒ@ƒCƒ‹ %s ‚๐ŒŸ๕’†"
-
-#: ../tag.c:1545
-msgid "Ignoring long line in tags file"
-msgstr "ƒ^ƒOƒtƒ@ƒCƒ‹“เ‚ฬ’ท‚ขs‚๐–ณŽ‹‚ต‚‚ท"
-
-#: ../tag.c:1915
-#, c-format
-msgid "E431: Format error in tags file \"%s\""
-msgstr "E431: ƒ^ƒOƒtƒ@ƒCƒ‹ \"%s\" ‚ฬƒtƒH[ƒ}ƒbƒg‚ษƒGƒ‰[‚ช‚ ‚่‚‚ท"
-
-#: ../tag.c:1917
-#, c-format
-msgid "Before byte %<PRId64>"
-msgstr "’ผ‘O‚ฬ %<PRId64> ƒoƒCƒg"
-
-#: ../tag.c:1929
-#, c-format
-msgid "E432: Tags file not sorted: %s"
-msgstr "E432: ƒ^ƒOƒtƒ@ƒCƒ‹‚ชƒ\\[ƒg‚ณ‚๊‚ฤ‚ข‚‚น‚๑: %s"
-
-#. never opened any tags file
-#: ../tag.c:1960
-msgid "E433: No tags file"
-msgstr "E433: ƒ^ƒOƒtƒ@ƒCƒ‹‚ช‚ ‚่‚‚น‚๑"
-
-#: ../tag.c:2536
-msgid "E434: Can't find tag pattern"
-msgstr "E434: ƒ^ƒOƒpƒ^[ƒ“‚๐Œฉ‚ย‚ฏ‚็‚๊‚‚น‚๑"
-
-#: ../tag.c:2544
-msgid "E435: Couldn't find tag, just guessing!"
-msgstr "E435: ƒ^ƒO‚๐Œฉ‚ย‚ฏ‚็‚๊‚ศ‚ข‚ฬ‚ล’P‚ษ„‘ช‚ต‚‚ท!"
-
-#: ../tag.c:2797
-#, c-format
-msgid "Duplicate field name: %s"
-msgstr "d•ก‚ต‚ฝƒtƒB[ƒ‹ƒh–ผ: %s"
-
-#: ../term.c:1442
-msgid "' not known. Available builtin terminals are:"
-msgstr "' ‚อ–ข’m‚ล‚ท. Œปs‚ฬ‘g‚ž‚’[––‚อŽŸ‚ฬ‚ฦ‚จ‚่‚ล‚ท:"
-
-#: ../term.c:1463
-msgid "defaulting to '"
-msgstr "ศ—ช’l‚๐ŽŸ‚ฬ‚ๆ‚ค‚ษ’่‚ต‚‚ท '"
-
-#: ../term.c:1731
-msgid "E557: Cannot open termcap file"
-msgstr "E557: termcapƒtƒ@ƒCƒ‹‚๐ŠJ‚ฏ‚‚น‚๑"
-
-#: ../term.c:1735
-msgid "E558: Terminal entry not found in terminfo"
-msgstr "E558: terminfo‚ษ’[––ƒGƒ“ƒgƒŠ‚๐Œฉ‚ย‚ฏ‚็‚๊‚‚น‚๑"
-
-#: ../term.c:1737
-msgid "E559: Terminal entry not found in termcap"
-msgstr "E559: termcap‚ษ’[––ƒGƒ“ƒgƒŠ‚๐Œฉ‚ย‚ฏ‚็‚๊‚‚น‚๑"
-
-#: ../term.c:1878
-#, c-format
-msgid "E436: No \"%s\" entry in termcap"
-msgstr "E436: termcap‚ษ \"%s\" ‚ฬƒGƒ“ƒgƒŠ‚ช‚ ‚่‚‚น‚๑"
-
-#: ../term.c:2249
-msgid "E437: terminal capability \"cm\" required"
-msgstr "E437: ’[––‚ษ \"cm\" ‹@”\\‚ช•K—v‚ล‚ท"
-
-#. Highlight title
-#: ../term.c:4376
-msgid ""
-"\n"
-"--- Terminal keys ---"
-msgstr ""
-"\n"
-"--- ’[––ƒL[ ---"
-
-#: ../ui.c:481
-msgid "Vim: Error reading input, exiting...\n"
-msgstr "Vim: “—อ‚๐“วž‚’†‚ฬƒGƒ‰[‚ษ‚ๆ‚่I—น‚ต‚‚ท...\n"
-
-#. This happens when the FileChangedRO autocommand changes the
-#. * file in a way it becomes shorter.
-#: ../undo.c:379
-msgid "E881: Line count changed unexpectedly"
-msgstr "E881: —\\Š๚‚น‚ธsƒJƒEƒ“ƒg‚ช•ฯ‚ํ‚่‚‚ต‚ฝ"
-
-#: ../undo.c:627
-#, c-format
-msgid "E828: Cannot open undo file for writing: %s"
-msgstr "E828: ‘ž‚—p‚ษƒAƒ“ƒhƒDƒtƒ@ƒCƒ‹‚๐ŠJ‚ฏ‚‚น‚๑: %s"
-
-#: ../undo.c:717
-#, c-format
-msgid "E825: Corrupted undo file (%s): %s"
-msgstr "E825: ƒAƒ“ƒhƒDƒtƒ@ƒCƒ‹‚ช‰๓‚๊‚ฤ‚ข‚‚ท (%s): %s"
-
-#: ../undo.c:1039
-msgid "Cannot write undo file in any directory in 'undodir'"
-msgstr "'undodir'‚ฬƒfƒBƒŒƒNƒgƒŠ‚ษƒAƒ“ƒhƒDƒtƒ@ƒCƒ‹‚๐‘‚ซž‚฿‚‚น‚๑"
-
-#: ../undo.c:1074
-#, c-format
-msgid "Will not overwrite with undo file, cannot read: %s"
-msgstr "ƒAƒ“ƒhƒDƒtƒ@ƒCƒ‹‚ฦ‚ต‚ฤ“ว‚ž‚฿‚ศ‚ข‚ฬ‚ลใ‘‚ซ‚ต‚‚น‚๑: %s"
-
-#: ../undo.c:1092
-#, c-format
-msgid "Will not overwrite, this is not an undo file: %s"
-msgstr "ƒAƒ“ƒhƒDƒtƒ@ƒCƒ‹‚ล‚อ‚ศ‚ข‚ฬ‚ลใ‘‚ซ‚ต‚‚น‚๑: %s"
-
-#: ../undo.c:1108
-msgid "Skipping undo file write, nothing to undo"
-msgstr "‘ฮ‚ช‚ศ‚ข‚ฬ‚ลƒAƒ“ƒhƒDƒtƒ@ƒCƒ‹‚ฬ‘‚ซž‚‚๐ƒXƒLƒbƒv‚ต‚‚ท"
-
-#: ../undo.c:1121
-#, c-format
-msgid "Writing undo file: %s"
-msgstr "ƒAƒ“ƒhƒDƒtƒ@ƒCƒ‹‘‚ซž‚’†: %s"
-
-#: ../undo.c:1213
-#, c-format
-msgid "E829: write error in undo file: %s"
-msgstr "E829: ƒAƒ“ƒhƒDƒtƒ@ƒCƒ‹‚ฬ‘‚ซž‚ƒGƒ‰[‚ล‚ท: %s"
-
-#: ../undo.c:1280
-#, c-format
-msgid "Not reading undo file, owner differs: %s"
-msgstr "ƒI[ƒi[‚ชˆู‚ศ‚้‚ฬ‚ลƒAƒ“ƒhƒDƒtƒ@ƒCƒ‹‚๐“ว‚ž‚‚‚น‚๑: %s"
-
-#: ../undo.c:1292
-#, c-format
-msgid "Reading undo file: %s"
-msgstr "ƒAƒ“ƒhƒDƒtƒ@ƒCƒ‹“วž’†: %s"
-
-#: ../undo.c:1299
-#, c-format
-msgid "E822: Cannot open undo file for reading: %s"
-msgstr "E822: ƒAƒ“ƒhƒDƒtƒ@ƒCƒ‹‚๐“วž—p‚ฦ‚ต‚ฤŠJ‚ฏ‚‚น‚๑: %s"
-
-#: ../undo.c:1308
-#, c-format
-msgid "E823: Not an undo file: %s"
-msgstr "E823: ƒAƒ“ƒhƒDƒtƒ@ƒCƒ‹‚ล‚อ‚ ‚่‚‚น‚๑: %s"
-
-#: ../undo.c:1313
-#, c-format
-msgid "E824: Incompatible undo file: %s"
-msgstr "E824: ŒŠทซ‚ฬ–ณ‚ขƒAƒ“ƒhƒDƒtƒ@ƒCƒ‹‚ล‚ท: %s"
-
-#: ../undo.c:1328
-msgid "File contents changed, cannot use undo info"
-msgstr "ƒtƒ@ƒCƒ‹‚ฬ“เ—e‚ช•ฯ‚ํ‚ม‚ฤ‚ข‚้‚ฝ‚฿AƒAƒ“ƒhƒD๎•๑‚๐—˜—p‚ล‚ซ‚‚น‚๑"
-
-#: ../undo.c:1497
-#, c-format
-msgid "Finished reading undo file %s"
-msgstr "ƒAƒ“ƒhƒDƒtƒ@ƒCƒ‹ %s ‚ฬŽๆž‚๐Šฎ—น"
-
-#: ../undo.c:1586 ../undo.c:1812
-msgid "Already at oldest change"
-msgstr "Š๙‚ษˆ๊”ิŒร‚ข•ฯX‚ล‚ท"
-
-#: ../undo.c:1597 ../undo.c:1814
-msgid "Already at newest change"
-msgstr "Š๙‚ษˆ๊”ิV‚ต‚ข•ฯX‚ล‚ท"
-
-#: ../undo.c:1806
-#, c-format
-msgid "E830: Undo number %<PRId64> not found"
-msgstr "E830: ƒAƒ“ƒhƒD”ิ† %<PRId64> ‚อŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#: ../undo.c:1979
-msgid "E438: u_undo: line numbers wrong"
-msgstr "E438: u_undo: s”ิ†‚ชŠิˆแ‚ม‚ฤ‚ข‚‚ท"
-
-#: ../undo.c:2183
-msgid "more line"
-msgstr "s ’ว‰ม‚ต‚‚ต‚ฝ"
-
-#: ../undo.c:2185
-msgid "more lines"
-msgstr "s ’ว‰ม‚ต‚‚ต‚ฝ"
-
-#: ../undo.c:2187
-msgid "line less"
-msgstr "s ํœ‚ต‚‚ต‚ฝ"
-
-#: ../undo.c:2189
-msgid "fewer lines"
-msgstr "s ํœ‚ต‚‚ต‚ฝ"
-
-#: ../undo.c:2193
-msgid "change"
-msgstr "‰ำŠ•ฯX‚ต‚‚ต‚ฝ"
-
-#: ../undo.c:2195
-msgid "changes"
-msgstr "‰ำŠ•ฯX‚ต‚‚ต‚ฝ"
-
-#: ../undo.c:2225
-#, c-format
-msgid "%<PRId64> %s; %s #%<PRId64> %s"
-msgstr "%<PRId64> %s; %s #%<PRId64> %s"
-
-#: ../undo.c:2228
-msgid "before"
-msgstr "‘O•๛"
-
-#: ../undo.c:2228
-msgid "after"
-msgstr "Œใ•๛"
-
-#: ../undo.c:2325
-msgid "Nothing to undo"
-msgstr "ƒAƒ“ƒhƒD‘ฮ‚ช‚ ‚่‚‚น‚๑"
-
-#: ../undo.c:2330
-msgid "number changes when saved"
-msgstr "’ส”ิ •ฯX” •ฯXŽžŠ๚ •‘ถฯ"
-
-#: ../undo.c:2360
-#, c-format
-msgid "%<PRId64> seconds ago"
-msgstr "%<PRId64> •bŒo‰฿‚ต‚ฤ‚ข‚‚ท"
-
-#: ../undo.c:2372
-msgid "E790: undojoin is not allowed after undo"
-msgstr "E790: undo ‚ฬ’ผŒใ‚ษ undojoin ‚อ‚ล‚ซ‚‚น‚๑"
-
-#: ../undo.c:2466
-msgid "E439: undo list corrupt"
-msgstr "E439: ƒAƒ“ƒhƒDƒŠƒXƒg‚ช‰๓‚๊‚ฤ‚ข‚‚ท"
-
-#: ../undo.c:2495
-msgid "E440: undo line missing"
-msgstr "E440: ƒAƒ“ƒhƒDs‚ช‚ ‚่‚‚น‚๑"
-
-#: ../version.c:600
-msgid ""
-"\n"
-"Included patches: "
-msgstr ""
-"\n"
-"“K—pฯƒpƒbƒ`: "
-
-#: ../version.c:627
-msgid ""
-"\n"
-"Extra patches: "
-msgstr ""
-"\n"
-"’ว‰มŠg’ฃƒpƒbƒ`: "
-
-#: ../version.c:639 ../version.c:864
-msgid "Modified by "
-msgstr "Modified by "
-
-#: ../version.c:646
-msgid ""
-"\n"
-"Compiled "
-msgstr ""
-"\n"
-"Compiled "
-
-#: ../version.c:649
-msgid "by "
-msgstr "by "
-
-#: ../version.c:660
-msgid ""
-"\n"
-"Huge version "
-msgstr ""
-"\n"
-"Huge ”ล "
-
-#: ../version.c:661
-msgid "without GUI."
-msgstr "without GUI."
-
-#: ../version.c:662
-msgid " Features included (+) or not (-):\n"
-msgstr " ‹@”\\‚ฬˆ๊—— —LŒ๘(+)/–ณŒ๘(-)\n"
-
-#: ../version.c:667
-msgid " system vimrc file: \""
-msgstr " ƒVƒXƒeƒ€ vimrc: \""
-
-#: ../version.c:672
-msgid " user vimrc file: \""
-msgstr " ƒ†[ƒU[ vimrc: \""
-
-#: ../version.c:677
-msgid " 2nd user vimrc file: \""
-msgstr " ‘ๆ2ƒ†[ƒU[ vimrc: \""
-
-#: ../version.c:682
-msgid " 3rd user vimrc file: \""
-msgstr " ‘ๆ3ƒ†[ƒU[ vimrc: \""
-
-#: ../version.c:687
-msgid " user exrc file: \""
-msgstr " ƒ†[ƒU[ exrc: \""
-
-#: ../version.c:692
-msgid " 2nd user exrc file: \""
-msgstr " ‘ๆ2ƒ†[ƒU[ exrc: \""
-
-#: ../version.c:699
-msgid " fall-back for $VIM: \""
-msgstr " ศ—ชŽž‚ฬ $VIM: \""
-
-#: ../version.c:705
-msgid " f-b for $VIMRUNTIME: \""
-msgstr "ศ—ชŽž‚ฬ $VIMRUNTIME: \""
-
-#: ../version.c:709
-msgid "Compilation: "
-msgstr "ƒRƒ“ƒpƒCƒ‹: "
-
-#: ../version.c:712
-msgid "Linking: "
-msgstr "ƒŠƒ“ƒN: "
-
-#: ../version.c:717
-msgid " DEBUG BUILD"
-msgstr "ƒfƒoƒbƒOƒrƒ‹ƒh"
-
-#: ../version.c:767
-msgid "VIM - Vi IMproved"
-msgstr "VIM - Vi IMproved"
-
-#: ../version.c:769
-msgid "version "
-msgstr "version "
-
-#: ../version.c:770
-msgid "by Bram Moolenaar et al."
-msgstr "by Bram Moolenaar ‘ผ."
-
-#: ../version.c:774
-msgid "Vim is open source and freely distributable"
-msgstr "Vim ‚อƒI[ƒvƒ“ƒ\\[ƒX‚ล‚ ‚่Žฉ—R‚ษ”z•z‰ย”\\‚ล‚ท"
-
-#: ../version.c:776
-msgid "Help poor children in Uganda!"
-msgstr "ƒEƒKƒ“ƒ_‚ฬŒb‚‚๊‚ศ‚ขŽq‹Ÿ‚ฝ‚ฟ‚ษ‰‡•‚๐!"
-
-#: ../version.c:777
-msgid "type :help iccf<Enter> for information "
-msgstr "ฺื‚ศ๎•๑‚อ :help iccf<Enter> "
-
-#: ../version.c:779
-msgid "type :q<Enter> to exit "
-msgstr "I—น‚ท‚้‚ษ‚อ :q<Enter> "
-
-#: ../version.c:780
-msgid "type :help<Enter> or <F1> for on-line help"
-msgstr "ƒIƒ“ƒ‰ƒCƒ“ƒwƒ‹ƒv‚อ :help<Enter> ‚ฉ <F1> "
-
-#: ../version.c:781
-msgid "type :help version7<Enter> for version info"
-msgstr "ƒo[ƒWƒ‡ƒ“๎•๑‚อ :help version7<Enter> "
-
-#: ../version.c:784
-msgid "Running in Vi compatible mode"
-msgstr "ViŒŠทƒ‚[ƒh‚ล“ฎ์’†"
-
-#: ../version.c:785
-msgid "type :set nocp<Enter> for Vim defaults"
-msgstr "Vim„ง’l‚ษ‚ท‚้‚ษ‚อ :set nocp<Enter> "
-
-#: ../version.c:786
-msgid "type :help cp-default<Enter> for info on this"
-msgstr "ฺื‚ศ๎•๑‚อ :help cp-default<Enter>"
-
-#: ../version.c:827
-msgid "Sponsor Vim development!"
-msgstr "Vim‚ฬŠJ”ญ‚๐‰ž‰‡‚ต‚ฤ‚ญ‚พ‚ณ‚ข!"
-
-#: ../version.c:828
-msgid "Become a registered Vim user!"
-msgstr "Vim‚ฬ“o˜^ƒ†[ƒU[‚ษ‚ศ‚ม‚ฤ‚ญ‚พ‚ณ‚ข!"
-
-#: ../version.c:831
-msgid "type :help sponsor<Enter> for information "
-msgstr "ฺื‚ศ๎•๑‚อ :help sponsor<Enter> "
-
-#: ../version.c:832
-msgid "type :help register<Enter> for information "
-msgstr "ฺื‚ศ๎•๑‚อ :help register<Enter> "
-
-#: ../version.c:834
-msgid "menu Help->Sponsor/Register for information "
-msgstr "ฺื‚อƒƒjƒ…[‚ฬ ƒwƒ‹ƒv->ƒXƒ|ƒ“ƒT[/“o˜^ ‚๐ŽQฦ‚ต‚ฤ‰บ‚ณ‚ข"
-
-#: ../window.c:119
-msgid "Already only one window"
-msgstr "Š๙‚ษƒEƒBƒ“ƒhƒE‚อ1‚ย‚ต‚ฉ‚ ‚่‚‚น‚๑"
-
-#: ../window.c:224
-msgid "E441: There is no preview window"
-msgstr "E441: ƒvƒŒƒrƒ…[ƒEƒBƒ“ƒhƒE‚ช‚ ‚่‚‚น‚๑"
-
-#: ../window.c:559
-msgid "E442: Can't split topleft and botright at the same time"
-msgstr "E442: ถใ‚ฦ‰E‰บ‚๐“ฏŽž‚ษ•ชŠ„‚ท‚้‚ฑ‚ฦ‚อ‚ล‚ซ‚‚น‚๑"
-
-#: ../window.c:1228
-msgid "E443: Cannot rotate when another window is split"
-msgstr "E443: ‘ผ‚ฬƒEƒBƒ“ƒhƒE‚ช•ชŠ„‚ณ‚๊‚ฤ‚ข‚้Žž‚ษ‚อ‡‰๑‚ล‚ซ‚‚น‚๑"
-
-#: ../window.c:1803
-msgid "E444: Cannot close last window"
-msgstr "E444: ลŒใ‚ฬƒEƒBƒ“ƒhƒE‚๐•ย‚ถ‚้‚ฑ‚ฦ‚อ‚ล‚ซ‚‚น‚๑"
-
-#: ../window.c:1810
-msgid "E813: Cannot close autocmd window"
-msgstr "E813: autocmdƒEƒBƒ“ƒhƒE‚อ•ย‚ถ‚็‚๊‚‚น‚๑"
-
-#: ../window.c:1814
-msgid "E814: Cannot close window, only autocmd window would remain"
-msgstr "E814: autocmdƒEƒBƒ“ƒhƒE‚ต‚ฉŽc‚็‚ศ‚ข‚ฝ‚฿AƒEƒBƒ“ƒhƒE‚อ•ย‚ถ‚็‚๊‚‚น‚๑"
-
-#: ../window.c:2717
-msgid "E445: Other window contains changes"
-msgstr "E445: ‘ผ‚ฬƒEƒBƒ“ƒhƒE‚ษ‚อ•ฯX‚ช‚ ‚่‚‚ท"
-
-#: ../window.c:4805
-msgid "E446: No file name under cursor"
-msgstr "E446: ƒJ[ƒ\\ƒ‹‚ฬ‰บ‚ษƒtƒ@ƒCƒ‹–ผ‚ช‚ ‚่‚‚น‚๑"
-
-msgid "List or number required"
-msgstr "ƒŠƒXƒg‚ฉ”’l‚ช•K—v‚ล‚ท"
-
-#~ msgid "E831: bf_key_init() called with empty password"
-#~ msgstr "E831: bf_key_init() ‚ช‹๓ƒpƒXƒ[ƒh‚ลŒฤ‚ัo‚ณ‚๊‚‚ต‚ฝ"
-
-#~ msgid "E820: sizeof(uint32_t) != 4"
-#~ msgstr "E820: sizeof(uint32_t) != 4"
-
-#~ msgid "E817: Blowfish big/little endian use wrong"
-#~ msgstr "E817: Blowfishˆร†‚ฬƒrƒbƒO/ƒŠƒgƒ‹ƒGƒ“ƒfƒBƒAƒ“‚ชŠิˆแ‚ม‚ฤ‚ข‚‚ท"
-
-#~ msgid "E818: sha256 test failed"
-#~ msgstr "E818: sha256‚ฬƒeƒXƒg‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#~ msgid "E819: Blowfish test failed"
-#~ msgstr "E819: Blowfishˆร†‚ฬƒeƒXƒg‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#~ msgid "Patch file"
-#~ msgstr "ƒpƒbƒ`ƒtƒ@ƒCƒ‹"
-
-#~ msgid ""
-#~ "&OK\n"
-#~ "&Cancel"
-#~ msgstr ""
-#~ "Œˆ’่(&O)\n"
-#~ "ƒLƒƒƒ“ƒZƒ‹(&C)"
-
-#~ msgid "E240: No connection to Vim server"
-#~ msgstr "E240: Vim ƒT[ƒo‚ึ‚ฬฺ‘ฑ‚ช‚ ‚่‚‚น‚๑"
-
-#~ msgid "E241: Unable to send to %s"
-#~ msgstr "E241: %s ‚ึ‘—‚้‚ฑ‚ฦ‚ช‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "E277: Unable to read a server reply"
-#~ msgstr "E277: ƒT[ƒo‚ฬ‰ž“š‚ช‚ ‚่‚‚น‚๑"
-
-#~ msgid "E258: Unable to send to client"
-#~ msgstr "E258: ƒNƒ‰ƒCƒAƒ“ƒg‚ึ‘—‚้‚ฑ‚ฦ‚ช‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "Save As"
-#~ msgstr "•ส–ผ‚ล•‘ถ"
-
-#~ msgid "Edit File"
-#~ msgstr "ƒtƒ@ƒCƒ‹‚๐•าW"
-
-# Added at 27-Jan-2004.
-#~ msgid " (NOT FOUND)"
-#~ msgstr " (Œฉ‚ย‚ฉ‚่‚‚น‚๑)"
-
-#~ msgid "Source Vim script"
-#~ msgstr "VimƒXƒNƒŠƒvƒg‚ฬŽๆž‚"
-
-#~ msgid "unknown"
-#~ msgstr "•s–พ"
-
-#~ msgid "Edit File in new window"
-#~ msgstr "V‚ต‚ขƒEƒBƒ“ƒhƒE‚ลƒtƒ@ƒCƒ‹‚๐•าW‚ต‚‚ท"
-
-#~ msgid "Append File"
-#~ msgstr "’ว‰มƒtƒ@ƒCƒ‹"
-
-#~ msgid "Window position: X %d, Y %d"
-#~ msgstr "ƒEƒBƒ“ƒhƒEˆส’u: X %d, Y %d"
-
-#~ msgid "Save Redirection"
-#~ msgstr "ƒŠƒ_ƒCƒŒƒNƒg‚๐•‘ถ‚ต‚‚ท"
-
-#~ msgid "Save View"
-#~ msgstr "ƒrƒ…[‚๐•‘ถ‚ต‚‚ท"
-
-#~ msgid "Save Session"
-#~ msgstr "ƒZƒbƒVƒ‡ƒ“๎•๑‚๐•‘ถ‚ต‚‚ท"
-
-#~ msgid "Save Setup"
-#~ msgstr "’่‚๐•‘ถ‚ต‚‚ท"
-
-#~ msgid "E809: #< is not available without the +eval feature"
-#~ msgstr "E809: #< ‚อ +eval ‹@”\\‚ช–ณ‚ข‚ฦ—˜—p‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "E196: No digraphs in this version"
-#~ msgstr "E196: ‚ฑ‚ฬƒo[ƒWƒ‡ƒ“‚ษ‡Žš‚อ‚ ‚่‚‚น‚๑"
-
-#~ msgid "is a device (disabled with 'opendevice' option)"
-#~ msgstr " ‚อƒfƒoƒCƒX‚ล‚ท ('opendevice' ƒIƒvƒVƒ‡ƒ“‚ล‰๑”๐‚ล‚ซ‚‚ท)"
-
-#~ msgid "Reading from stdin..."
-#~ msgstr "•W€“—อ‚ฉ‚็“วž‚’†..."
-
-#~ msgid "[blowfish]"
-#~ msgstr "[blowfishˆร†‰ป]"
-
-#~ msgid "[crypted]"
-#~ msgstr "[ˆร†‰ป]"
-
-#~ msgid "E821: File is encrypted with unknown method"
-#~ msgstr "E821: ƒtƒ@ƒCƒ‹‚ช–ข’m‚ฬ•๛–@‚ลˆร†‰ป‚ณ‚๊‚ฤ‚ข‚‚ท"
-
-# Added at 19-Jan-2004.
-#~ msgid "NetBeans disallows writes of unmodified buffers"
-#~ msgstr "NetBeans‚อ–ข•ฯX‚ฬƒoƒbƒtƒ@‚๐ใ‘‚ท‚้‚ฑ‚ฦ‚อ‹–‰ย‚ต‚ฤ‚ข‚‚น‚๑"
-
-#~ msgid "Partial writes disallowed for NetBeans buffers"
-#~ msgstr "NetBeansƒoƒbƒtƒ@‚ฬˆ๊•”‚๐‘‚ซo‚ท‚ฑ‚ฦ‚อ‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "writing to device disabled with 'opendevice' option"
-#~ msgstr "'opendevice' ƒIƒvƒVƒ‡ƒ“‚ษ‚ๆ‚่ƒfƒoƒCƒX‚ึ‚ฬ‘‚ซž‚‚อ‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "E460: The resource fork would be lost (add ! to override)"
-#~ msgstr "E460: ƒŠƒ\\[ƒXƒtƒH[ƒN‚ชŽธ‚ํ‚๊‚้‚ฉ‚เ‚ต‚๊‚‚น‚๑ (! ‚๐’ว‰ม‚ล‹ญง)"
-
-#~ msgid "E851: Failed to create a new process for the GUI"
-#~ msgstr "E851: GUI—p‚ฬƒvƒƒZƒX‚ฬ‹N“ฎ‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#~ msgid "E852: The child process failed to start the GUI"
-#~ msgstr "E852: ŽqƒvƒƒZƒX‚ชGUI‚ฬ‹N“ฎ‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#~ msgid "E229: Cannot start the GUI"
-#~ msgstr "E229: GUI‚๐ŠJŽn‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "E230: Cannot read from \"%s\""
-#~ msgstr "E230: \"%s\"‚ฉ‚็“วž‚‚ฑ‚ฦ‚ช‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "E665: Cannot start GUI, no valid font found"
-#~ msgstr "E665: —LŒ๘‚ศƒtƒHƒ“ƒg‚ชŒฉ‚ย‚ฉ‚็‚ศ‚ข‚ฬ‚ล, GUI‚๐ŠJŽn‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "E231: 'guifontwide' invalid"
-#~ msgstr "E231: 'guifontwide' ‚ช–ณŒ๘‚ล‚ท"
-
-#~ msgid "E599: Value of 'imactivatekey' is invalid"
-#~ msgstr "E599: 'imactivatekey' ‚ษ’่‚ณ‚๊‚ฝ’l‚ช–ณŒ๘‚ล‚ท"
-
-#~ msgid "E254: Cannot allocate color %s"
-#~ msgstr "E254: %s ‚ฬF‚๐Š„‚่“–‚ฤ‚็‚๊‚‚น‚๑"
-
-#~ msgid "No match at cursor, finding next"
-#~ msgstr "ƒJ[ƒ\\ƒ‹‚ฬˆส’u‚ษƒ}ƒbƒ`‚อ‚ ‚่‚‚น‚๑, ŽŸ‚๐ŒŸ๕‚ต‚ฤ‚ข‚‚ท"
-
-#~ msgid "<cannot open> "
-#~ msgstr "<ŠJ‚ฏ‚‚น‚๑> "
-
-#~ msgid "E616: vim_SelFile: can't get font %s"
-#~ msgstr "E616: vim_SelFile: ƒtƒHƒ“ƒg %s ‚๐Žๆ“พ‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "E614: vim_SelFile: can't return to current directory"
-#~ msgstr "E614: vim_SelFile: Œป‚ฬƒfƒBƒŒƒNƒgƒŠ‚ษ–฿‚๊‚‚น‚๑"
-
-#~ msgid "Pathname:"
-#~ msgstr "ƒpƒX–ผ:"
-
-#~ msgid "E615: vim_SelFile: can't get current directory"
-#~ msgstr "E615: vim_SelFile: Œป‚ฬƒfƒBƒŒƒNƒgƒŠ‚๐Žๆ“พ‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "OK"
-#~ msgstr "OK"
-
-#~ msgid "Cancel"
-#~ msgstr "ƒLƒƒƒ“ƒZƒ‹"
-
-#~ msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
-#~ msgstr "ƒXƒNƒ[ƒ‹ƒo[: ‰ๆ‘œ‚๐Žๆ“พ‚ล‚ซ‚‚น‚๑‚ล‚ต‚ฝ."
-
-#~ msgid "Vim dialog"
-#~ msgstr "Vim ƒ_ƒCƒAƒƒO"
-
-#~ msgid "E232: Cannot create BalloonEval with both message and callback"
-#~ msgstr "E232: ƒƒbƒZ[ƒW‚ฦƒR[ƒ‹ƒoƒbƒN‚ฬ‚ ‚้ BalloonEval ‚๐์ฌ‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "Input _Methods"
-#~ msgstr "ƒCƒ“ƒvƒbƒgƒƒ\\ƒbƒh"
-
-#~ msgid "VIM - Search and Replace..."
-#~ msgstr "VIM - ŒŸ๕‚ฦ’uŠท..."
-
-#~ msgid "VIM - Search..."
-#~ msgstr "VIM - ŒŸ๕..."
-
-#~ msgid "Find what:"
-#~ msgstr "ŒŸ๕•ถŽš—๑:"
-
-#~ msgid "Replace with:"
-#~ msgstr "’uŠท•ถŽš—๑:"
-
-#~ msgid "Match whole word only"
-#~ msgstr "ณŠm‚ษŠY“–‚ท‚้‚เ‚ฬ‚พ‚ฏ"
-
-#~ msgid "Match case"
-#~ msgstr "‘ๅ•ถŽš/ฌ•ถŽš‚๐‹ๆ•ส‚ท‚้"
-
-#~ msgid "Direction"
-#~ msgstr "•๛Œ"
-
-#~ msgid "Up"
-#~ msgstr "ใ"
-
-#~ msgid "Down"
-#~ msgstr "‰บ"
-
-#~ msgid "Find Next"
-#~ msgstr "ŽŸ‚๐ŒŸ๕"
-
-#~ msgid "Replace"
-#~ msgstr "’uŠท"
-
-#~ msgid "Replace All"
-#~ msgstr "‘S‚ฤ’uŠท"
-
-#~ msgid "Vim: Received \"die\" request from session manager\n"
-#~ msgstr "Vim: ƒZƒbƒVƒ‡ƒ“ƒ}ƒl[ƒWƒƒ‚ฉ‚็ \"die\" —v‹‚๐Ž๓‚ฏŽๆ‚่‚‚ต‚ฝ\n"
-
-#~ msgid "Close"
-#~ msgstr "•ย‚ถ‚้"
-
-#~ msgid "New tab"
-#~ msgstr "V‹Kƒ^ƒuƒy[ƒW"
-
-#~ msgid "Open Tab..."
-#~ msgstr "ƒ^ƒuƒy[ƒW‚๐ŠJ‚ญ..."
-
-#~ msgid "Vim: Main window unexpectedly destroyed\n"
-#~ msgstr "Vim: ƒƒCƒ“ƒEƒBƒ“ƒhƒE‚ช•sˆำ‚ษ”j‰๓‚ณ‚๊‚‚ต‚ฝ\n"
-
-#~ msgid "&Filter"
-#~ msgstr "ƒtƒBƒ‹ƒ^(&F)"
-
-#~ msgid "&Cancel"
-#~ msgstr "ƒLƒƒƒ“ƒZƒ‹(&C)"
-
-#~ msgid "Directories"
-#~ msgstr "ƒfƒBƒŒƒNƒgƒŠ"
-
-#~ msgid "Filter"
-#~ msgstr "ƒtƒBƒ‹ƒ^"
-
-#~ msgid "&Help"
-#~ msgstr "ƒwƒ‹ƒv(&H)"
-
-#~ msgid "Files"
-#~ msgstr "ƒtƒ@ƒCƒ‹"
-
-#~ msgid "&OK"
-#~ msgstr "&OK"
-
-#~ msgid "Selection"
-#~ msgstr "‘I‘๐"
-
-#~ msgid "Find &Next"
-#~ msgstr "ŽŸ‚๐ŒŸ๕(&N)"
-
-#~ msgid "&Replace"
-#~ msgstr "’uŠท(&R)"
-
-#~ msgid "Replace &All"
-#~ msgstr "‘S‚ฤ’uŠท(&A)"
-
-#~ msgid "&Undo"
-#~ msgstr "ƒAƒ“ƒhƒD(&U)"
-
-#~ msgid "E671: Cannot find window title \"%s\""
-#~ msgstr "E671: ƒ^ƒCƒgƒ‹‚ช \"%s\" ‚ฬƒEƒBƒ“ƒhƒE‚อŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#~ msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
-#~ msgstr "E243: ˆ๘”‚อƒTƒ|[ƒg‚ณ‚๊‚‚น‚๑: \"-%s\"; OLE”ล‚๐Žg—p‚ต‚ฤ‚ญ‚พ‚ณ‚ข."
-
-#~ msgid "E672: Unable to open window inside MDI application"
-#~ msgstr "E672: MDIƒAƒvƒŠ‚ฬ’†‚ล‚อƒEƒBƒ“ƒhƒE‚๐ŠJ‚ฏ‚‚น‚๑"
-
-#~ msgid "Close tab"
-#~ msgstr "ƒ^ƒuƒy[ƒW‚๐•ย‚ถ‚้"
-
-#~ msgid "Open tab..."
-#~ msgstr "ƒ^ƒuƒy[ƒW‚๐ŠJ‚ญ"
-
-#~ msgid "Find string (use '\\\\' to find a '\\')"
-#~ msgstr "ŒŸ๕•ถŽš—๑ ('\\' ‚๐ŒŸ๕‚ท‚้‚ษ‚อ '\\\\')"
-
-#~ msgid "Find & Replace (use '\\\\' to find a '\\')"
-#~ msgstr "ŒŸ๕E’uŠท ('\\' ‚๐ŒŸ๕‚ท‚้‚ษ‚อ '\\\\')"
-
-#~ msgid "Not Used"
-#~ msgstr "Žg‚ํ‚๊‚‚น‚๑"
-
-#~ msgid "Directory\t*.nothing\n"
-#~ msgstr "ƒfƒBƒŒƒNƒgƒŠ\t*.nothing\n"
-
-#~ msgid ""
-#~ "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
-#~ msgstr "Vim E458: FŽw’่‚ชณ‚ต‚ญ‚ศ‚ข‚ฬ‚ลƒGƒ“ƒgƒŠ‚๐Š„‚่“–‚ฤ‚็‚๊‚‚น‚๑"
-
-#~ msgid "E250: Fonts for the following charsets are missing in fontset %s:"
-#~ msgstr "E250: ˆศ‰บ‚ฬ•ถŽšƒZƒbƒg‚ฬƒtƒHƒ“ƒg‚ช‚ ‚่‚‚น‚๑ %s:"
-
-#~ msgid "E252: Fontset name: %s"
-#~ msgstr "E252: ƒtƒHƒ“ƒgƒZƒbƒg–ผ: %s"
-
-#~ msgid "Font '%s' is not fixed-width"
-#~ msgstr "ƒtƒHƒ“ƒg '%s' ‚อŒล’่•‚ล‚อ‚ ‚่‚‚น‚๑"
-
-#~ msgid "E253: Fontset name: %s"
-#~ msgstr "E253: ƒtƒHƒ“ƒgƒZƒbƒg–ผ: %s"
-
-#~ msgid "Font0: %s"
-#~ msgstr "ƒtƒHƒ“ƒg0: %s"
-
-#~ msgid "Font1: %s"
-#~ msgstr "ƒtƒHƒ“ƒg1: %s"
-
-#~ msgid "Font%<PRId64> width is not twice that of font0"
-#~ msgstr "ƒtƒHƒ“ƒg%<PRId64> ‚ฬ•‚ชƒtƒHƒ“ƒg0‚ฬ2”{‚ล‚อ‚ ‚่‚‚น‚๑"
-
-#~ msgid "Font0 width: %<PRId64>"
-#~ msgstr "ƒtƒHƒ“ƒg0‚ฬ•: %<PRId64>"
-
-#~ msgid "Font1 width: %<PRId64>"
-#~ msgstr "ƒtƒHƒ“ƒg1‚ฬ•: %<PRId64>"
-
-#~ msgid "Invalid font specification"
-#~ msgstr "–ณŒ๘‚ศƒtƒHƒ“ƒgŽw’่‚ล‚ท"
-
-#~ msgid "&Dismiss"
-#~ msgstr "‹p‰บ‚ท‚้(&D)"
-
-#~ msgid "no specific match"
-#~ msgstr "ƒ}ƒbƒ`‚ท‚้‚เ‚ฬ‚ช‚ ‚่‚‚น‚๑"
-
-#~ msgid "Vim - Font Selector"
-#~ msgstr "Vim - ƒtƒHƒ“ƒg‘I‘๐"
-
-#~ msgid "Name:"
-#~ msgstr "–ผ‘O:"
-
-#~ msgid "Show size in Points"
-#~ msgstr "ƒTƒCƒY‚๐ƒ|ƒCƒ“ƒg‚ล•\\Žฆ‚ท‚้"
-
-#~ msgid "Encoding:"
-#~ msgstr "ƒGƒ“ƒR[ƒh:"
-
-#~ msgid "Font:"
-#~ msgstr "ƒtƒHƒ“ƒg:"
-
-#~ msgid "Style:"
-#~ msgstr "ƒXƒ^ƒCƒ‹:"
-
-#~ msgid "Size:"
-#~ msgstr "ƒTƒCƒY:"
-
-#~ msgid "E256: Hangul automata ERROR"
-#~ msgstr "E256: ƒnƒ“ƒOƒ‹ƒI[ƒgƒ}ƒgƒ“ƒGƒ‰["
-
-#~ msgid "E563: stat error"
-#~ msgstr "E563: stat ƒGƒ‰["
-
-#~ msgid "E625: cannot open cscope database: %s"
-#~ msgstr "E625: cscopeƒf[ƒ^ƒx[ƒX: %s ‚๐ŠJ‚ญ‚ฑ‚ฦ‚ช‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "E626: cannot get cscope database information"
-#~ msgstr "E626: cscopeƒf[ƒ^ƒx[ƒX‚ฬ๎•๑‚๐Žๆ“พ‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "Lua library cannot be loaded."
-#~ msgstr "Luaƒ‰ƒCƒuƒ‰ƒŠ‚๐ƒ[ƒh‚ล‚ซ‚‚น‚๑."
-
-#~ msgid "cannot save undo information"
-#~ msgstr "ƒAƒ“ƒhƒD๎•๑‚ช•‘ถ‚ล‚ซ‚‚น‚๑"
-
-#~ msgid ""
-#~ "E815: Sorry, this command is disabled, the MzScheme libraries could not "
-#~ "be loaded."
-#~ msgstr ""
-#~ "E815: ‚ฑ‚ฬƒRƒ}ƒ“ƒh‚อ–ณŒ๘‚ล‚ท. MzScheme ƒ‰ƒCƒuƒ‰ƒŠ‚๐ƒ[ƒh‚ล‚ซ‚‚น‚๑."
-
-#~ msgid "invalid expression"
-#~ msgstr "–ณŒ๘‚ศŽฎ‚ล‚ท"
-
-#~ msgid "expressions disabled at compile time"
-#~ msgstr "Žฎ‚อƒRƒ“ƒpƒCƒ‹Žž‚ษ–ณŒ๘‚ษ‚ณ‚๊‚ฤ‚ข‚‚ท"
-
-#~ msgid "hidden option"
-#~ msgstr "‰B‚ตƒIƒvƒVƒ‡ƒ“"
-
-#~ msgid "unknown option"
-#~ msgstr "–ข’m‚ฬƒIƒvƒVƒ‡ƒ“‚ล‚ท"
-
-#~ msgid "window index is out of range"
-#~ msgstr "”อˆอŠO‚ฬƒEƒBƒ“ƒhƒE”ิ†‚ล‚ท"
-
-#~ msgid "couldn't open buffer"
-#~ msgstr "ƒoƒbƒtƒ@‚๐ŠJ‚ฏ‚‚น‚๑"
-
-#~ msgid "cannot delete line"
-#~ msgstr "s‚๐ม‚น‚‚น‚๑"
-
-#~ msgid "cannot replace line"
-#~ msgstr "s‚๐’uŠท‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "cannot insert line"
-#~ msgstr "s‚๐‘}“‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "string cannot contain newlines"
-#~ msgstr "•ถŽš—๑‚ษ‚อ‰s•ถŽš‚๐Š‚฿‚็‚๊‚‚น‚๑"
-
-#~ msgid "error converting Scheme values to Vim"
-#~ msgstr "Scheme’l‚ฬVim‚ึ‚ฬ•ฯŠทƒGƒ‰["
-
-#~ msgid "Vim error: ~a"
-#~ msgstr "Vim ƒGƒ‰[: ~a"
-
-#~ msgid "Vim error"
-#~ msgstr "Vim ƒGƒ‰["
-
-#~ msgid "buffer is invalid"
-#~ msgstr "ƒoƒbƒtƒ@‚อ–ณŒ๘‚ล‚ท"
-
-#~ msgid "window is invalid"
-#~ msgstr "ƒEƒBƒ“ƒhƒE‚อ–ณŒ๘‚ล‚ท"
-
-#~ msgid "linenr out of range"
-#~ msgstr "”อˆอŠO‚ฬs”ิ†‚ล‚ท"
-
-#~ msgid "not allowed in the Vim sandbox"
-#~ msgstr "ƒTƒ“ƒhƒ{ƒbƒNƒX‚ล‚อ‹–‚ณ‚๊‚‚น‚๑"
-
-#~ msgid "E370: Could not load library %s"
-#~ msgstr "E370: ƒ‰ƒCƒuƒ‰ƒŠ %s ‚๐ƒ[ƒh‚ล‚ซ‚‚น‚๑‚ล‚ต‚ฝ"
-
-#~ msgid ""
-#~ "Sorry, this command is disabled: the Perl library could not be loaded."
-#~ msgstr ""
-#~ "‚ฑ‚ฬƒRƒ}ƒ“ƒh‚อ–ณŒ๘‚ล‚ท, ‚ฒ‚฿‚๑‚ศ‚ณ‚ข: Perlƒ‰ƒCƒuƒ‰ƒŠ‚๐ƒ[ƒh‚ล‚ซ‚‚น‚๑‚ล‚ต"
-#~ "‚ฝ."
-
-#~ msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
-#~ msgstr ""
-#~ "E299: ƒTƒ“ƒhƒ{ƒbƒNƒX‚ล‚อ Safe ƒ‚ƒWƒ…[ƒ‹‚๐Žg—p‚ต‚ศ‚ขPerlƒXƒNƒŠƒvƒg‚อ‹ึ‚ถ‚็"
-#~ "‚๊‚ฤ‚ข‚‚ท"
-
-#~ msgid "E836: This Vim cannot execute :python after using :py3"
-#~ msgstr "E836: ‚ฑ‚ฬVim‚ล‚อ :py3 ‚๐Žg‚ม‚ฝŒใ‚ษ :python ‚๐Žg‚ฆ‚‚น‚๑"
-
-#~ msgid ""
-#~ "E263: Sorry, this command is disabled, the Python library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E263: ‚ฑ‚ฬƒRƒ}ƒ“ƒh‚อ–ณŒ๘‚ล‚ท,‚ฒ‚฿‚๑‚ศ‚ณ‚ข: Pythonƒ‰ƒCƒuƒ‰ƒŠ‚๐ƒ[ƒh‚ล‚ซ‚"
-#~ "‚น‚๑‚ล‚ต‚ฝ."
-
-# Added at 07-Feb-2004.
-#~ msgid "E659: Cannot invoke Python recursively"
-#~ msgstr "E659: Python ‚๐ฤ‹A“I‚ษŽภs‚ท‚้‚ฑ‚ฦ‚อ‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "E837: This Vim cannot execute :py3 after using :python"
-#~ msgstr "E837: ‚ฑ‚ฬVim‚ล‚อ :python ‚๐Žg‚ม‚ฝŒใ‚ษ :py3 ‚๐Žg‚ฆ‚‚น‚๑"
-
-#~ msgid "E265: $_ must be an instance of String"
-#~ msgstr "E265: $_ ‚อ•ถŽš—๑‚ฬƒCƒ“ƒXƒ^ƒ“ƒX‚ล‚ศ‚ฏ‚๊‚ฮ‚ศ‚่‚‚น‚๑"
-
-#~ msgid ""
-#~ "E266: Sorry, this command is disabled, the Ruby library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E266: ‚ฑ‚ฬƒRƒ}ƒ“ƒh‚อ–ณŒ๘‚ล‚ท,‚ฒ‚฿‚๑‚ศ‚ณ‚ข: Rubyƒ‰ƒCƒuƒ‰ƒŠ‚๐ƒ[ƒh‚ล‚ซ‚‚น"
-#~ "‚๑‚ล‚ต‚ฝ."
-
-#~ msgid "E267: unexpected return"
-#~ msgstr "E267: —\\Š๚‚น‚ส return ‚ล‚ท"
-
-#~ msgid "E268: unexpected next"
-#~ msgstr "E268: —\\Š๚‚น‚ส next ‚ล‚ท"
-
-#~ msgid "E269: unexpected break"
-#~ msgstr "E269: —\\Š๚‚น‚ส break ‚ล‚ท"
-
-#~ msgid "E270: unexpected redo"
-#~ msgstr "E270: —\\Š๚‚น‚ส redo ‚ล‚ท"
-
-#~ msgid "E271: retry outside of rescue clause"
-#~ msgstr "E271: rescue ‚ฬŠO‚ฬ retry ‚ล‚ท"
-
-#~ msgid "E272: unhandled exception"
-#~ msgstr "E272: Žๆ‚่ˆต‚ํ‚๊‚ศ‚ฉ‚ม‚ฝ—แŠO‚ช‚ ‚่‚‚ท"
-
-#~ msgid "E273: unknown longjmp status %d"
-#~ msgstr "E273: –ข’m‚ฬlongjmp๓‘ิ: %d"
-
-#~ msgid "Toggle implementation/definition"
-#~ msgstr "Žภ‘•‚ฦ’่‹`‚๐ุ‚่‘ึ‚ฆ‚้"
-
-#~ msgid "Show base class of"
-#~ msgstr "ŽŸ‚ฬƒNƒ‰ƒX‚ฬŠ๎’๊‚๐•\\Žฆ"
-
-#~ msgid "Show overridden member function"
-#~ msgstr "ƒI[ƒo[ƒ‰ƒCƒh‚ณ‚๊‚ฝƒƒ“ƒoŠึ”‚๐•\\Žฆ"
-
-#~ msgid "Retrieve from file"
-#~ msgstr "ƒtƒ@ƒCƒ‹‚ฉ‚็‰๑•œ‚ท‚้"
-
-#~ msgid "Retrieve from project"
-#~ msgstr "ƒvƒƒWƒFƒNƒg‚ฉ‚็‰๑•œ‚ท‚้"
-
-#~ msgid "Retrieve from all projects"
-#~ msgstr "‘S‚ฤ‚ฬƒvƒƒWƒFƒNƒg‚ฉ‚็‰๑•œ‚ท‚้"
-
-#~ msgid "Retrieve"
-#~ msgstr "‰๑•œ"
-
-#~ msgid "Show source of"
-#~ msgstr "ŽŸ‚ฬƒ\\[ƒX‚๐•\\Žฆ‚ท‚้"
-
-#~ msgid "Find symbol"
-#~ msgstr "Œฉ‚ย‚ฏ‚ฝƒVƒ“ƒ{ƒ‹"
-
-#~ msgid "Browse class"
-#~ msgstr "ƒNƒ‰ƒX‚๐ŽQฦ"
-
-#~ msgid "Show class in hierarchy"
-#~ msgstr "ŠK‘w‚ลƒNƒ‰ƒX‚๐•\\Žฆ"
-
-#~ msgid "Show class in restricted hierarchy"
-#~ msgstr "Œภ’่‚ณ‚๊‚ฝŠK‘w‚ลƒNƒ‰ƒX‚๐•\\Žฆ"
-
-#~ msgid "Xref refers to"
-#~ msgstr "Xref ‚ฬŽQฦๆ"
-
-#~ msgid "Xref referred by"
-#~ msgstr "Xref ‚ชŽQฦ‚ณ‚๊‚้"
-
-#~ msgid "Xref has a"
-#~ msgstr "Xref ‚ชŽŸ‚ฬ‚เ‚ฬ‚๐‚เ‚ม‚ฤ‚ข‚‚ท"
-
-#~ msgid "Xref used by"
-#~ msgstr "Xref ‚ชŽg—p‚ณ‚๊‚้"
-
-#~ msgid "Show docu of"
-#~ msgstr "ŽŸ‚ฬ•ถอ‚๐•\\Žฆ"
-
-#~ msgid "Generate docu for"
-#~ msgstr "ŽŸ‚ฬ•ถอ‚๐ถฌ"
-
-#~ msgid ""
-#~ "Cannot connect to SNiFF+. Check environment (sniffemacs must be found in "
-#~ "$PATH).\n"
-#~ msgstr ""
-#~ "SNiFF+‚ษฺ‘ฑ‚ล‚ซ‚‚น‚๑. Šย‹ซ‚๐ƒ`ƒFƒbƒN‚ต‚ฤ‚ญ‚พ‚ณ‚ข(sniffemacs ‚ช $PATH ‚ษ"
-#~ "‚ศ‚ฏ‚๊‚ฮ‚ศ‚่‚‚น‚๑).\n"
-
-#~ msgid "E274: Sniff: Error during read. Disconnected"
-#~ msgstr "E274: Sniff: “วž’†‚ษƒGƒ‰[‚ช”ญถ‚ต‚‚ต‚ฝ. ุ’f‚ต‚‚ต‚ฝ"
-
-#~ msgid "SNiFF+ is currently "
-#~ msgstr "ŒปSNiFF+ ‚ฬ๓‘ิ‚อu"
-
-#~ msgid "not "
-#~ msgstr "–ข"
-
-#~ msgid "connected"
-#~ msgstr "ฺ‘ฑv‚ล‚ท"
-
-#~ msgid "E275: Unknown SNiFF+ request: %s"
-#~ msgstr "E275: –ข’m‚ฬ SNiFF+ ƒŠƒNƒGƒXƒg‚ล‚ท: %s"
-
-#~ msgid "E276: Error connecting to SNiFF+"
-#~ msgstr "E276: SNiFF+ ‚ึ‚ฬฺ‘ฑ’†‚ฬƒGƒ‰[‚ล‚ท"
-
-#~ msgid "E278: SNiFF+ not connected"
-#~ msgstr "E278: SNiFF+ ‚ษฺ‘ฑ‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#~ msgid "E279: Not a SNiFF+ buffer"
-#~ msgstr "E279: SNiFF+ ƒoƒbƒtƒ@‚ช‚ ‚่‚‚น‚๑"
-
-#~ msgid "Sniff: Error during write. Disconnected"
-#~ msgstr "Sniff: ‘ž‚’†‚ษƒGƒ‰[‚ช”ญถ‚ต‚ฝ‚ฬ‚ลุ’f‚ต‚‚ต‚ฝ"
-
-#~ msgid "invalid buffer number"
-#~ msgstr "–ณŒ๘‚ศƒoƒbƒtƒ@”ิ†‚ล‚ท"
-
-#~ msgid "not implemented yet"
-#~ msgstr "‚‚พŽภ‘•‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#~ msgid "cannot set line(s)"
-#~ msgstr "s‚๐’่‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "invalid mark name"
-#~ msgstr "–ณŒ๘‚ศƒ}[ƒN–ผ‚ล‚ท"
-
-#~ msgid "mark not set"
-#~ msgstr "ƒ}[ƒN‚อ’่‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#~ msgid "row %d column %d"
-#~ msgstr "s %d —๑ %d"
-
-#~ msgid "cannot insert/append line"
-#~ msgstr "s‚ฬ‘}“/’ว‰ม‚๐‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "line number out of range"
-#~ msgstr "”อˆอŠO‚ฬs”ิ†‚ล‚ท"
-
-#~ msgid "unknown flag: "
-#~ msgstr "–ข’m‚ฬƒtƒ‰ƒO: "
-
-#~ msgid "unknown vimOption"
-#~ msgstr "–ข’m‚ฬ vimOption ‚ล‚ท"
-
-#~ msgid "keyboard interrupt"
-#~ msgstr "ƒL[ƒ{[ƒhŠ„ž‚"
-
-#~ msgid "vim error"
-#~ msgstr "vim ƒGƒ‰["
-
-#~ msgid "cannot create buffer/window command: object is being deleted"
-#~ msgstr ""
-#~ "ƒoƒbƒtƒ@/ƒEƒBƒ“ƒhƒE์ฌƒRƒ}ƒ“ƒh‚๐์ฌ‚ล‚ซ‚‚น‚๑: ƒIƒuƒWƒFƒNƒg‚ชม‹Ž‚ณ‚๊‚ฤ"
-#~ "‚ข‚‚ต‚ฝ"
-
-#~ msgid ""
-#~ "cannot register callback command: buffer/window is already being deleted"
-#~ msgstr ""
-#~ "ƒR[ƒ‹ƒoƒbƒNƒRƒ}ƒ“ƒh‚๐“o˜^‚ล‚ซ‚‚น‚๑: ƒoƒbƒtƒ@/ƒEƒBƒ“ƒhƒE‚ชŠ๙‚ษม‹Ž‚ณ‚๊‚"
-#~ "‚ต‚ฝ"
-
-#~ msgid ""
-#~ "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-"
-#~ "dev@vim.org"
-#~ msgstr ""
-#~ "E280: TCL ’v–ฝ“IƒGƒ‰[: reflist ‰˜๕!? vim-dev@vim.org ‚ษ•๑‚ต‚ฤ‚ญ‚พ‚ณ‚ข"
-
-#~ msgid "cannot register callback command: buffer/window reference not found"
-#~ msgstr ""
-#~ "ƒR[ƒ‹ƒoƒbƒNƒRƒ}ƒ“ƒh‚๐“o˜^‚ล‚ซ‚‚น‚๑: ƒoƒbƒtƒ@/ƒEƒBƒ“ƒhƒE‚ฬŽQฦ‚ชŒฉ‚ย‚ฉ‚่"
-#~ "‚‚น‚๑"
-
-#~ msgid ""
-#~ "E571: Sorry, this command is disabled: the Tcl library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E571: ‚ฑ‚ฬƒRƒ}ƒ“ƒh‚อ–ณŒ๘‚ล‚ท,‚ฒ‚฿‚๑‚ศ‚ณ‚ข: Tclƒ‰ƒCƒuƒ‰ƒŠ‚๐ƒ[ƒh‚ล‚ซ‚‚น‚๑"
-#~ "‚ล‚ต‚ฝ."
-
-#~ msgid "E572: exit code %d"
-#~ msgstr "E572: I—นƒR[ƒh %d"
-
-#~ msgid "cannot get line"
-#~ msgstr "s‚๐Žๆ“พ‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "Unable to register a command server name"
-#~ msgstr "–ฝ—฿ƒT[ƒo‚ฬ–ผ‘O‚๐“o˜^‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "E248: Failed to send command to the destination program"
-#~ msgstr "E248: –ฺ“I‚ฬƒvƒƒOƒ‰ƒ€‚ึ‚ฬƒRƒ}ƒ“ƒh‘—M‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#~ msgid "E573: Invalid server id used: %s"
-#~ msgstr "E573: –ณŒ๘‚ศƒT[ƒoID‚ชŽg‚ํ‚๊‚‚ต‚ฝ: %s"
-
-#~ msgid "E251: VIM instance registry property is badly formed. Deleted!"
-#~ msgstr "E251: VIM Žภ‘ฬ‚ฬ“o˜^ƒvƒƒpƒeƒB‚ช•sณ‚ล‚ท. ม‹Ž‚ต‚‚ต‚ฝ!"
-
-#~ msgid "netbeans is not supported with this GUI\n"
-#~ msgstr "netbeans ‚อ‚ฑ‚ฬGUI‚ล‚อ—˜—p‚ล‚ซ‚‚น‚๑\n"
-
-#~ msgid "This Vim was not compiled with the diff feature."
-#~ msgstr "‚ฑ‚ฬVim‚ษ‚อdiff‹@”\\‚ช‚ ‚่‚‚น‚๑(ƒRƒ“ƒpƒCƒ‹Žž’่)."
-
-#~ msgid "'-nb' cannot be used: not enabled at compile time\n"
-#~ msgstr "'-nb' Žg—p•s‰ย”\\‚ล‚ท: ƒRƒ“ƒpƒCƒ‹Žž‚ษ–ณŒ๘‚ษ‚ณ‚๊‚ฤ‚ข‚‚ท\n"
-
-#~ msgid "Vim: Error: Failure to start gvim from NetBeans\n"
-#~ msgstr "Vim: ƒGƒ‰[: NetBeans‚ฉ‚็gvim‚๐ƒXƒ^[ƒg‚ล‚ซ‚‚น‚๑\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Where case is ignored prepend / to make flag upper case"
-#~ msgstr ""
-#~ "\n"
-#~ "‘ๅฌ•ถŽš‚ช–ณŽ‹‚ณ‚๊‚้๊‡‚อ‘ๅ•ถŽš‚ษ‚ท‚้‚ฝ‚฿‚ษ / ‚๐‘O’u‚ต‚ฤ‚ญ‚พ‚ณ‚ข"
-
-#~ msgid "-register\t\tRegister this gvim for OLE"
-#~ msgstr "-register\t\t‚ฑ‚ฬgvim‚๐OLE‚ฦ‚ต‚ฤ“o˜^‚ท‚้"
-
-#~ msgid "-unregister\t\tUnregister gvim for OLE"
-#~ msgstr "-unregister\t\tgvim‚ฬOLE“o˜^‚๐‰๐œ‚ท‚้"
-
-#~ msgid "-g\t\t\tRun using GUI (like \"gvim\")"
-#~ msgstr "-g\t\t\tGUI‚ล‹N“ฎ‚ท‚้ (\"gvim\" ‚ฦ“ฏ‚ถ)"
-
-#~ msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
-#~ msgstr "-f or --nofork\tƒtƒHƒAƒOƒ‰ƒEƒ“ƒh: GUI‚๐Žn‚฿‚้‚ฦ‚ซ‚ษfork‚ต‚ศ‚ข"
-
-#~ msgid "-f\t\t\tDon't use newcli to open window"
-#~ msgstr "-f\t\t\tƒEƒBƒ“ƒhƒE‚๐ŠJ‚ญ‚ฬ‚ษ newcli ‚๐Žg—p‚ต‚ศ‚ข"
-
-#~ msgid "-dev <device>\t\tUse <device> for I/O"
-#~ msgstr "-dev <device>\t\tI/O‚ษ <device> ‚๐Žg—p‚ท‚้"
-
-#~ msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
-#~ msgstr "-U <gvimrc>\t\t.gvimrc‚ฬ‘ใ‚ํ‚่‚ษ <gvimrc> ‚๐Žg‚ค"
-
-#~ msgid "-x\t\t\tEdit encrypted files"
-#~ msgstr "-x\t\t\tˆร†‰ป‚ณ‚๊‚ฝƒtƒ@ƒCƒ‹‚๐•าW‚ท‚้"
-
-#~ msgid "-display <display>\tConnect vim to this particular X-server"
-#~ msgstr "-display <display>\tvim‚๐Žw’่‚ต‚ฝ X ƒT[ƒo‚ษฺ‘ฑ‚ท‚้"
-
-#~ msgid "-X\t\t\tDo not connect to X server"
-#~ msgstr "-X\t\t\tXƒT[ƒo‚ษฺ‘ฑ‚ต‚ศ‚ข"
-
-#~ msgid "--remote <files>\tEdit <files> in a Vim server if possible"
-#~ msgstr "--remote <files>\t‰ย”\\‚ศ‚็‚ฮVimƒT[ƒo‚ล <files> ‚๐•าW‚ท‚้"
-
-#~ msgid "--remote-silent <files> Same, don't complain if there is no server"
-#~ msgstr "--remote-silent <files> “ฏใ, ƒT[ƒo‚ช–ณ‚ญ‚ฤ‚เŒx•ถ‚๐o—อ‚ต‚ศ‚ข"
-
-#~ msgid ""
-#~ "--remote-wait <files> As --remote but wait for files to have been edited"
-#~ msgstr "--remote-wait <files>\t--remoteŒใ ƒtƒ@ƒCƒ‹‚ฬ•าW‚ชI‚ํ‚้‚ฬ‚๐‘า‚ย"
-
-#~ msgid ""
-#~ "--remote-wait-silent <files> Same, don't complain if there is no server"
-#~ msgstr ""
-#~ "--remote-wait-silent <files> “ฏใ, ƒT[ƒo‚ช–ณ‚ญ‚ฤ‚เŒx•ถ‚๐o—อ‚ต‚ศ‚ข"
-
-#~ msgid ""
-#~ "--remote-tab[-wait][-silent] <files> As --remote but use tab page per "
-#~ "file"
-#~ msgstr ""
-#~ "--remote-tab[-wait][-silent] <files> --remote‚ลƒtƒ@ƒCƒ‹1‚ย‚ษ‚ย‚ซ1‚ย‚ฬƒ^ƒu"
-#~ "ƒy[ƒW‚๐ŠJ‚ญ"
-
-#~ msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
-#~ msgstr "--remote-send <keys>\tVimƒT[ƒo‚ษ <keys> ‚๐‘—M‚ต‚ฤI—น‚ท‚้"
-
-#~ msgid ""
-#~ "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
-#~ msgstr "--remote-expr <expr>\tƒT[ƒo‚ล <expr> ‚๐Žภs‚ต‚ฤŒ‹‰ส‚๐•\\Žฆ‚ท‚้"
-
-#~ msgid "--serverlist\t\tList available Vim server names and exit"
-#~ msgstr "--serverlist\t\tVimƒT[ƒo–ผ‚ฬˆ๊——‚๐•\\Žฆ‚ต‚ฤI—น‚ท‚้"
-
-#~ msgid "--servername <name>\tSend to/become the Vim server <name>"
-#~ msgstr "--servername <name>\tVimƒT[ƒo <name> ‚ษ‘—M/–ผ‘O’่‚ท‚้"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Motif version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvim‚ษ‚ๆ‚ม‚ฤ‰๐Ž฿‚ณ‚๊‚้ˆ๘”(Motifƒo[ƒWƒ‡ƒ“):\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (neXtaw version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvim‚ษ‚ๆ‚ม‚ฤ‰๐Ž฿‚ณ‚๊‚้ˆ๘”(neXtawƒo[ƒWƒ‡ƒ“):\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Athena version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvim‚ษ‚ๆ‚ม‚ฤ‰๐Ž฿‚ณ‚๊‚้ˆ๘”(Athenaƒo[ƒWƒ‡ƒ“):\n"
-
-#~ msgid "-display <display>\tRun vim on <display>"
-#~ msgstr "-display <display>\t<display> ‚ลvim‚๐Žภs‚ท‚้"
-
-#~ msgid "-iconic\t\tStart vim iconified"
-#~ msgstr "-iconic\t\tลฌ‰ป‚ต‚ฝ๓‘ิ‚ลvim‚๐‹N“ฎ‚ท‚้"
-
-#~ msgid "-background <color>\tUse <color> for the background (also: -bg)"
-#~ msgstr "-background <color>\t”wŒiF‚ษ <color> ‚๐Žg‚ค(“ฏ‹`: -bg)"
-
-#~ msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
-#~ msgstr "-foreground <color>\t‘OŒiF‚ษ <color> ‚๐Žg‚ค(“ฏ‹`: -fg)"
-
-#~ msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
-#~ msgstr "-font <font>\t\tƒeƒLƒXƒg•\\Žฆ‚ษ <font> ‚๐Žg‚ค(“ฏ‹`: -fn)"
-
-#~ msgid "-boldfont <font>\tUse <font> for bold text"
-#~ msgstr "-boldfont <font>\t‘พŽš‚ษ <font> ‚๐Žg‚ค"
-
-#~ msgid "-italicfont <font>\tUse <font> for italic text"
-#~ msgstr "-italicfont <for>\tŽฮ‘ฬŽš‚ษ <font> ‚๐Žg‚ค"
-
-#~ msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
-#~ msgstr "-geometry <geom>\t‰Š๚”z’u‚ษ <geom> ‚๐Žg‚ค(“ฏ‹`: -geom)"
-
-#~ msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
-#~ msgstr "-borderwidth <width>\t‹ซŠE‚ฬ•‚๐ <width> ‚ษ‚ท‚้(“ฏ‹`: -bw)"
-
-#~ msgid ""
-#~ "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
-#~ msgstr ""
-#~ "-scrollbarwidth <width> ƒXƒNƒ[ƒ‹ƒo[‚ฬ•‚๐ <width> ‚ษ‚ท‚้(“ฏ‹`: -sw)"
-
-#~ msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
-#~ msgstr ""
-#~ "-menuheight <height>\tƒƒjƒ…[ƒo[‚ฬ‚‚ณ‚๐ <height> ‚ษ‚ท‚้(“ฏ‹`: -mh)"
-
-#~ msgid "-reverse\t\tUse reverse video (also: -rv)"
-#~ msgstr "-reverse\t\t”ฝ“]‰f‘œ‚๐Žg—p‚ท‚้(“ฏ‹`: -rv)"
-
-#~ msgid "+reverse\t\tDon't use reverse video (also: +rv)"
-#~ msgstr "+reverse\t\t”ฝ“]‰f‘œ‚๐Žg—p‚ต‚ศ‚ข(“ฏ‹`: +rv)"
-
-#~ msgid "-xrm <resource>\tSet the specified resource"
-#~ msgstr "-xrm <resource>\t“ม’่‚ฬƒŠƒ\\[ƒX‚๐Žg—p‚ท‚้"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (GTK+ version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvim‚ษ‚ๆ‚ม‚ฤ‰๐Ž฿‚ณ‚๊‚้ˆ๘”(GTK+ƒo[ƒWƒ‡ƒ“):\n"
-
-#~ msgid "-display <display>\tRun vim on <display> (also: --display)"
-#~ msgstr "-display <display>\t<display> ‚ลvim‚๐Žภs‚ท‚้(“ฏ‹`: --display)"
-
-#~ msgid "--role <role>\tSet a unique role to identify the main window"
-#~ msgstr "--role <role>\tƒƒCƒ“ƒEƒBƒ“ƒhƒE‚๐Žฏ•ส‚ท‚้ˆ๊ˆำ‚ศ–๐Š„(role)‚๐’่‚ท‚้"
-
-#~ msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
-#~ msgstr "--socketid <xid>\tˆู‚ศ‚้GTK widget‚ลVim‚๐ŠJ‚ญ"
-
-#~ msgid "--echo-wid\t\tMake gvim echo the Window ID on stdout"
-#~ msgstr "--echo-wid\t\tƒEƒBƒ“ƒhƒEID‚๐•W€o—อ‚ษo—อ‚ท‚้"
-
-#~ msgid "-P <parent title>\tOpen Vim inside parent application"
-#~ msgstr "-P <e‚ฬƒ^ƒCƒgƒ‹>\tVim‚๐eƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚ฬ’†‚ล‹N“ฎ‚ท‚้"
-
-#~ msgid "--windowid <HWND>\tOpen Vim inside another win32 widget"
-#~ msgstr "--windowid <HWND>\tˆู‚ศ‚้Win32 widget‚ฬ“เ•”‚ษVim‚๐ŠJ‚ญ"
-
-#~ msgid "No display"
-#~ msgstr "ƒfƒBƒXƒvƒŒƒC‚ชŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#~ msgid ": Send failed.\n"
-#~ msgstr ": ‘—M‚ษŽธ”s‚ต‚‚ต‚ฝ.\n"
-
-#~ msgid ": Send failed. Trying to execute locally\n"
-#~ msgstr ": ‘—M‚ษŽธ”s‚ต‚‚ต‚ฝ. ƒ[ƒJƒ‹‚ล‚ฬŽภs‚๐ŽŽ‚‚ฤ‚ข‚‚ท\n"
-
-#~ msgid "%d of %d edited"
-#~ msgstr "%d Œย (%d Œย’†) ‚ฬƒtƒ@ƒCƒ‹‚๐•าW‚ต‚‚ต‚ฝ"
-
-#~ msgid "No display: Send expression failed.\n"
-#~ msgstr "ƒfƒBƒXƒvƒŒƒC‚ช‚ ‚่‚‚น‚๑: Žฎ‚ฬ‘—M‚ษŽธ”s‚ต‚‚ต‚ฝ.\n"
-
-#~ msgid ": Send expression failed.\n"
-#~ msgstr ": Žฎ‚ฬ‘—M‚ษŽธ”s‚ต‚‚ต‚ฝ.\n"
-
-#~ msgid "E543: Not a valid codepage"
-#~ msgstr "E543: –ณŒ๘‚ศƒR[ƒhƒy[ƒW‚ล‚ท"
-
-#~ msgid "E284: Cannot set IC values"
-#~ msgstr "E284: IC‚ฬ’l‚๐’่‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "E285: Failed to create input context"
-#~ msgstr "E285: ƒCƒ“ƒvƒbƒgƒRƒ“ƒeƒLƒXƒg‚ฬ์ฌ‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#~ msgid "E286: Failed to open input method"
-#~ msgstr "E286: ƒCƒ“ƒvƒbƒgƒƒ\\ƒbƒh‚ฬƒI[ƒvƒ“‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#~ msgid "E287: Warning: Could not set destroy callback to IM"
-#~ msgstr "E287: Œx: IM‚ฬ”j‰๓ƒR[ƒ‹ƒoƒbƒN‚๐’่‚ล‚ซ‚‚น‚๑‚ล‚ต‚ฝ"
-
-#~ msgid "E288: input method doesn't support any style"
-#~ msgstr "E288: ƒCƒ“ƒvƒbƒgƒƒ\\ƒbƒh‚อ‚ว‚๑‚ศƒXƒ^ƒCƒ‹‚เƒTƒ|[ƒg‚ต‚‚น‚๑"
-
-#~ msgid "E289: input method doesn't support my preedit type"
-#~ msgstr "E289: ƒCƒ“ƒvƒbƒgƒƒ\\ƒbƒh‚อ my preedit type ‚๐ƒTƒ|[ƒg‚ต‚‚น‚๑"
-
-#~ msgid "E843: Error while updating swap file crypt"
-#~ msgstr "E843: ƒXƒƒbƒvƒtƒ@ƒCƒ‹‚ฬˆร†‚๐XV’†‚ษƒGƒ‰[‚ช”ญถ‚ต‚‚ต‚ฝ"
-
-#~ msgid ""
-#~ "E833: %s is encrypted and this version of Vim does not support encryption"
-#~ msgstr ""
-#~ "E833: %s ‚อ‚ฑ‚ฬƒo[ƒWƒ‡ƒ“‚ฬVim‚ลƒTƒ|[ƒg‚ต‚ฤ‚ข‚ศ‚ขŒ`Žฎ‚ลˆร†‰ป‚ณ‚๊‚ฤ‚ข‚‚ท"
-
-#~ msgid "Swap file is encrypted: \"%s\""
-#~ msgstr "ƒXƒƒbƒvƒtƒ@ƒCƒ‹‚อˆร†‰ป‚ณ‚๊‚ฤ‚ข‚‚ท: \"%s\""
-
-#~ msgid ""
-#~ "\n"
-#~ "If you entered a new crypt key but did not write the text file,"
-#~ msgstr ""
-#~ "\n"
-#~ "V‚ต‚ขˆร†ƒL[‚๐“—อ‚ต‚ฝ‚ ‚ฦ‚ษƒeƒLƒXƒgƒtƒ@ƒCƒ‹‚๐•‘ถ‚ต‚ฤ‚ข‚ศ‚ข๊‡‚อ,"
-
-#~ msgid ""
-#~ "\n"
-#~ "enter the new crypt key."
-#~ msgstr ""
-#~ "\n"
-#~ "V‚ต‚ขˆร†ƒL[‚๐“—อ‚ต‚ฤ‚ญ‚พ‚ณ‚ข."
-
-#~ msgid ""
-#~ "\n"
-#~ "If you wrote the text file after changing the crypt key press enter"
-#~ msgstr ""
-#~ "\n"
-#~ "ˆร†ƒL[‚๐•ฯ‚ฆ‚ฝ‚ ‚ฦ‚ษƒeƒLƒXƒgƒtƒ@ƒCƒ‹‚๐•‘ถ‚ต‚ฝ๊‡‚อ, ƒeƒLƒXƒgƒtƒ@ƒCƒ‹‚ฦ"
-
-#~ msgid ""
-#~ "\n"
-#~ "to use the same key for text file and swap file"
-#~ msgstr ""
-#~ "\n"
-#~ "ƒXƒƒbƒvƒtƒ@ƒCƒ‹‚ษ“ฏ‚ถˆร†ƒL[‚๐Žg‚ค‚ฝ‚฿‚ษenter‚พ‚ฏ‚๐‰Ÿ‚ต‚ฤ‚ญ‚พ‚ณ‚ข."
-
-#~ msgid "Using crypt key from swap file for the text file.\n"
-#~ msgstr "ƒXƒƒbƒvƒtƒ@ƒCƒ‹‚ฉ‚็Žๆ“พ‚ต‚ฝˆร†ƒL[‚๐ƒeƒLƒXƒgƒtƒ@ƒCƒ‹‚ษŽg‚ข‚‚ท.\n"
-
-#~ msgid ""
-#~ "\n"
-#~ " [not usable with this version of Vim]"
-#~ msgstr ""
-#~ "\n"
-#~ " [‚ฑ‚ฬVimƒo[ƒWƒ‡ƒ“‚ล‚อŽg—p‚ล‚ซ‚‚น‚๑]"
-
-#~ msgid "Tear off this menu"
-#~ msgstr "‚ฑ‚ฬƒƒjƒ…[‚๐ุ‚่Žๆ‚้"
-
-#~ msgid "Select Directory dialog"
-#~ msgstr "ƒfƒBƒŒƒNƒgƒŠ‘I‘๐ƒ_ƒCƒAƒƒO"
-
-#~ msgid "Save File dialog"
-#~ msgstr "ƒtƒ@ƒCƒ‹•‘ถƒ_ƒCƒAƒƒO"
-
-#~ msgid "Open File dialog"
-#~ msgstr "ƒtƒ@ƒCƒ‹“วžƒ_ƒCƒAƒƒO"
-
-#~ msgid "E338: Sorry, no file browser in console mode"
-#~ msgstr ""
-#~ "E338: ƒRƒ“ƒ\\[ƒ‹ƒ‚[ƒh‚ล‚อƒtƒ@ƒCƒ‹ƒuƒ‰ƒEƒU‚๐Žg‚ฆ‚‚น‚๑, ‚ฒ‚฿‚๑‚ศ‚ณ‚ข"
-
-#~ msgid "Vim: preserving files...\n"
-#~ msgstr "Vim: ƒtƒ@ƒCƒ‹‚๐•‘ถ’†...\n"
-
-#~ msgid "Vim: Finished.\n"
-#~ msgstr "Vim: I—น‚ต‚‚ต‚ฝ.\n"
-
-#~ msgid "ERROR: "
-#~ msgstr "ƒGƒ‰[: "
-
-#~ msgid ""
-#~ "\n"
-#~ "[bytes] total alloc-freed %<PRIu64>-%<PRIu64>, in use %<PRIu64>, peak use "
-#~ "%<PRIu64>\n"
-#~ msgstr ""
-#~ "\n"
-#~ "[ƒƒ‚ƒŠ(ƒoƒCƒg)] ‘Š„“–-‰๐•๚—ส %<PRIu64>-%<PRIu64>, Žg—p—ส %<PRIu64>, ƒs["
-#~ "ƒNŽž %<PRIu64>\n"
-
-#~ msgid ""
-#~ "[calls] total re/malloc()'s %<PRIu64>, total free()'s %<PRIu64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "[Œฤo] ‘ re/malloc() ‰๑” %<PRIu64>, ‘ free() ‰๑” %<PRIu64>\n"
-#~ "\n"
-
-#~ msgid "E340: Line is becoming too long"
-#~ msgstr "E340: s‚ช’ท‚ญ‚ศ‚่‰฿‚ฌ‚‚ต‚ฝ"
-
-#~ msgid "E341: Internal error: lalloc(%<PRId64>, )"
-#~ msgstr "E341: “เ•”ƒGƒ‰[: lalloc(%<PRId64>,)"
-
-#~ msgid "E547: Illegal mouseshape"
-#~ msgstr "E547: •sณ‚ศ 'mouseshape' ‚ล‚ท"
-
-#~ msgid "Enter encryption key: "
-#~ msgstr "ˆร†‰ป—p‚ฬƒL[‚๐“—อ‚ต‚ฤ‚ญ‚พ‚ณ‚ข: "
-
-#~ msgid "Enter same key again: "
-#~ msgstr "‚เ‚คˆ๊“x“ฏ‚ถƒL[‚๐“—อ‚ต‚ฤ‚ญ‚พ‚ณ‚ข: "
-
-#~ msgid "Keys don't match!"
-#~ msgstr "ƒL[‚ชˆ๊’v‚ต‚‚น‚๑"
-
-#~ msgid "Cannot connect to Netbeans #2"
-#~ msgstr "Netbeans #2 ‚ษฺ‘ฑ‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "Cannot connect to Netbeans"
-#~ msgstr "Netbeans ‚ษฺ‘ฑ‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
-#~ msgstr ""
-#~ "E668: NetBeans‚ฬฺ‘ฑ๎•๑ƒtƒ@ƒCƒ‹‚ฬƒAƒNƒZƒXƒ‚[ƒh‚ษ–โ‘่‚ช‚ ‚่‚‚ท: \"%s\""
-
-#~ msgid "read from Netbeans socket"
-#~ msgstr "Netbeans ‚ฬƒ\\ƒPƒbƒg‚๐“วž‚"
-
-#~ msgid "E658: NetBeans connection lost for buffer %<PRId64>"
-#~ msgstr "E658: ƒoƒbƒtƒ@ %<PRId64> ‚ฬ NetBeans ฺ‘ฑ‚ชŽธ‚ํ‚๊‚‚ต‚ฝ"
-
-#~ msgid "E838: netbeans is not supported with this GUI"
-#~ msgstr "E838: NetBeans‚อ‚ฑ‚ฬGUI‚ษ‚อ‘ฮ‰ž‚ต‚ฤ‚ข‚‚น‚๑"
-
-#~ msgid "E511: netbeans already connected"
-#~ msgstr "E511: NetBeans‚อŠ๙‚ษฺ‘ฑ‚ต‚ฤ‚ข‚‚ท"
-
-#~ msgid "E505: %s is read-only (add ! to override)"
-#~ msgstr "E505: %s ‚อ“วž๊—p‚ล‚ท (‹ญง‘ž‚ษ‚อ ! ‚๐’ว‰ม)"
-
-#~ msgid "E775: Eval feature not available"
-#~ msgstr "E775: Žฎ•]‰ฟ‹@”\\‚ช–ณŒ๘‚ษ‚ศ‚ม‚ฤ‚ข‚‚ท"
-
-#~ msgid "freeing %<PRId64> lines"
-#~ msgstr "%<PRId64> s‚๐‰๐•๚’†"
-
-#~ msgid "E530: Cannot change term in GUI"
-#~ msgstr "E530: GUI‚ล‚อ 'term' ‚๐•ฯX‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "E531: Use \":gui\" to start the GUI"
-#~ msgstr "E531: GUI‚๐ƒXƒ^[ƒg‚ท‚้‚ษ‚อ \":gui\" ‚๐Žg—p‚ต‚ฤ‚ญ‚พ‚ณ‚ข"
-
-#~ msgid "E617: Cannot be changed in the GTK+ 2 GUI"
-#~ msgstr "E617: GTK+2 GUI‚ล‚อ•ฯX‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "E596: Invalid font(s)"
-#~ msgstr "E596: –ณŒ๘‚ศƒtƒHƒ“ƒg‚ล‚ท"
-
-#~ msgid "E597: can't select fontset"
-#~ msgstr "E597: ƒtƒHƒ“ƒgƒZƒbƒg‚๐‘I‘๐‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "E598: Invalid fontset"
-#~ msgstr "E598: –ณŒ๘‚ศƒtƒHƒ“ƒgƒZƒbƒg‚ล‚ท"
-
-#~ msgid "E533: can't select wide font"
-#~ msgstr "E533: ƒƒCƒhƒtƒHƒ“ƒg‚๐‘I‘๐‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "E534: Invalid wide font"
-#~ msgstr "E534: –ณŒ๘‚ศƒƒCƒhƒtƒHƒ“ƒg‚ล‚ท"
-
-#~ msgid "E538: No mouse support"
-#~ msgstr "E538: ƒ}ƒEƒX‚อƒTƒ|[ƒg‚ณ‚๊‚‚น‚๑"
-
-#~ msgid "cannot open "
-#~ msgstr "ŠJ‚ฏ‚‚น‚๑ "
-
-#~ msgid "VIM: Can't open window!\n"
-#~ msgstr "VIM: ƒEƒBƒ“ƒhƒE‚๐ŠJ‚ฏ‚‚น‚๑!\n"
-
-#~ msgid "Need Amigados version 2.04 or later\n"
-#~ msgstr "Amigados‚ฬƒo[ƒWƒ‡ƒ“ 2.04‚ฉ‚ป‚๊ˆศ~‚ช•K—v‚ล‚ท\n"
-
-#~ msgid "Need %s version %<PRId64>\n"
-#~ msgstr "%s ‚ฬƒo[ƒWƒ‡ƒ“ %<PRId64> ‚ช•K—v‚ล‚ท\n"
-
-#~ msgid "Cannot open NIL:\n"
-#~ msgstr "NIL‚๐ŠJ‚ฏ‚‚น‚๑:\n"
-
-#~ msgid "Cannot create "
-#~ msgstr "์ฌ‚ล‚ซ‚‚น‚๑ "
-
-#~ msgid "Vim exiting with %d\n"
-#~ msgstr "Vim‚อ %d ‚ลI—น‚ต‚‚ท\n"
-
-#~ msgid "cannot change console mode ?!\n"
-#~ msgstr "ƒRƒ“ƒ\\[ƒ‹ƒ‚[ƒh‚๐•ฯX‚ล‚ซ‚‚น‚๑?!\n"
-
-#~ msgid "mch_get_shellsize: not a console??\n"
-#~ msgstr "mch_get_shellsize: ƒRƒ“ƒ\\[ƒ‹‚ล‚อ‚ศ‚ข??\n"
-
-#~ msgid "E360: Cannot execute shell with -f option"
-#~ msgstr "E360: -f ƒIƒvƒVƒ‡ƒ“‚ลƒVƒFƒ‹‚๐Žภs‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "Cannot execute "
-#~ msgstr "Žภs‚ล‚ซ‚‚น‚๑ "
-
-#~ msgid "shell "
-#~ msgstr "ƒVƒFƒ‹ "
-
-#~ msgid " returned\n"
-#~ msgstr " –฿‚่‚‚ต‚ฝ\n"
-
-#~ msgid "ANCHOR_BUF_SIZE too small."
-#~ msgstr "ANCHOR_BUF_SIZE ‚ชฌ‚ณ‰฿‚ฌ‚‚ท."
-
-#~ msgid "I/O ERROR"
-#~ msgstr "“o—อƒGƒ‰["
-
-#~ msgid "Message"
-#~ msgstr "ƒƒbƒZ[ƒW"
-
-#~ msgid "'columns' is not 80, cannot execute external commands"
-#~ msgstr "'columns' ‚ช80‚ล‚อ‚ศ‚ข‚ฝ‚฿, ŠO•”ƒRƒ}ƒ“ƒh‚๐Žภs‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "E237: Printer selection failed"
-#~ msgstr "E237: ƒvƒŠƒ“ƒ^‚ฬ‘I‘๐‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#~ msgid "to %s on %s"
-#~ msgstr "%s ‚ึ (%s ใ‚ฬ)"
-
-#~ msgid "E613: Unknown printer font: %s"
-#~ msgstr "E613: –ข’m‚ฬƒvƒŠƒ“ƒ^ƒIƒvƒVƒ‡ƒ“‚ล‚ท: %s"
-
-#~ msgid "E238: Print error: %s"
-#~ msgstr "E238: ˆ๓ƒGƒ‰[: %s"
-
-#~ msgid "Printing '%s'"
-#~ msgstr "ˆ๓‚ต‚ฤ‚ข‚‚ท: '%s'"
-
-#~ msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
-#~ msgstr "E244: •ถŽšƒZƒbƒg–ผ \"%s\" ‚อ•sณ‚ล‚ท (ƒtƒHƒ“ƒg–ผ \"%s\")"
-
-#~ msgid "E245: Illegal char '%c' in font name \"%s\""
-#~ msgstr "E245: '%c' ‚อ•sณ‚ศ•ถŽš‚ล‚ท (ƒtƒHƒ“ƒg–ผ \"%s\")"
-
-#~ msgid "Vim: Double signal, exiting\n"
-#~ msgstr "Vim: 2d‚ฬƒVƒOƒiƒ‹‚ฬ‚ฝ‚฿, I—น‚ต‚‚ท\n"
-
-#~ msgid "Vim: Caught deadly signal %s\n"
-#~ msgstr "Vim: ’v–ฝ“IƒVƒOƒiƒ‹ %s ‚๐ŒŸ’m‚ต‚‚ต‚ฝ\n"
-
-#~ msgid "Vim: Caught deadly signal\n"
-#~ msgstr "Vim: ’v–ฝ“IƒVƒOƒiƒ‹‚๐ŒŸ’m‚ต‚‚ต‚ฝ\n"
-
-#~ msgid "Opening the X display took %<PRId64> msec"
-#~ msgstr "XƒT[ƒo‚ึ‚ฬฺ‘ฑ‚ษ %<PRId64> ƒ~ƒŠ•b‚ฉ‚ฉ‚่‚‚ต‚ฝ"
-
-#~ msgid ""
-#~ "\n"
-#~ "Vim: Got X error\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Vim: X ‚ฬƒGƒ‰[‚๐ŒŸo‚ต‚‚ต‚ฝr\n"
-
-#~ msgid "Testing the X display failed"
-#~ msgstr "X display ‚ฬƒ`ƒFƒbƒN‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#~ msgid "Opening the X display timed out"
-#~ msgstr "X display ‚ฬ open ‚ชƒ^ƒCƒ€ƒAƒEƒg‚ต‚‚ต‚ฝ"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot execute shell sh\n"
-#~ msgstr ""
-#~ "\n"
-#~ "sh ƒVƒFƒ‹‚๐Žภs‚ล‚ซ‚‚น‚๑\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot create pipes\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ƒpƒCƒv‚๐์ฌ‚ล‚ซ‚‚น‚๑\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot fork\n"
-#~ msgstr ""
-#~ "\n"
-#~ "fork ‚ล‚ซ‚‚น‚๑\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Command terminated\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ƒRƒ}ƒ“ƒh‚๐’†’f‚ต‚‚ต‚ฝ\n"
-
-#~ msgid "XSMP lost ICE connection"
-#~ msgstr "XSMP ‚ชICEฺ‘ฑ‚๐Žธ‚ข‚‚ต‚ฝ"
-
-#~ msgid "Opening the X display failed"
-#~ msgstr "X display ‚ฬ open ‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#~ msgid "XSMP handling save-yourself request"
-#~ msgstr "XSMP ‚ชsave-yourself—v‹‚๐ˆ—‚ต‚ฤ‚ข‚‚ท"
-
-#~ msgid "XSMP opening connection"
-#~ msgstr "XSMP ‚ชฺ‘ฑ‚๐ŠJŽn‚ต‚ฤ‚ข‚‚ท"
-
-#~ msgid "XSMP ICE connection watch failed"
-#~ msgstr "XSMP ICEฺ‘ฑ‚ชŽธ”s‚ต‚ฝ‚ๆ‚ค‚ล‚ท"
-
-#~ msgid "XSMP SmcOpenConnection failed: %s"
-#~ msgstr "XSMP SmcOpenConnection‚ชŽธ”s‚ต‚‚ต‚ฝ: %s"
-
-#~ msgid "At line"
-#~ msgstr "s"
-
-#~ msgid "Could not load vim32.dll!"
-#~ msgstr "vim32.dll ‚๐ƒ[ƒh‚ล‚ซ‚‚น‚๑‚ล‚ต‚ฝ"
-
-#~ msgid "VIM Error"
-#~ msgstr "VIMƒGƒ‰["
-
-#~ msgid "Could not fix up function pointers to the DLL!"
-#~ msgstr "DLL‚ฉ‚็Šึ”ƒ|ƒCƒ“ƒ^‚๐Žๆ“พ‚ล‚ซ‚‚น‚๑‚ล‚ต‚ฝ"
-
-#~ msgid "shell returned %d"
-#~ msgstr "ƒVƒFƒ‹‚ชƒR[ƒh %d ‚ลI—น‚ต‚‚ต‚ฝ"
-
-#~ msgid "Vim: Caught %s event\n"
-#~ msgstr "Vim: ƒCƒxƒ“ƒg %s ‚๐ŒŸ’m\n"
-
-#~ msgid "close"
-#~ msgstr "•ย‚ถ‚้"
-
-#~ msgid "logoff"
-#~ msgstr "ƒƒOƒIƒt"
-
-#~ msgid "shutdown"
-#~ msgstr "ƒVƒƒƒbƒgƒ_ƒEƒ“"
-
-#~ msgid "E371: Command not found"
-#~ msgstr "E371: ƒRƒ}ƒ“ƒh‚ช‚ ‚่‚‚น‚๑"
-
-#~ msgid ""
-#~ "VIMRUN.EXE not found in your $PATH.\n"
-#~ "External commands will not pause after completion.\n"
-#~ "See :help win32-vimrun for more information."
-#~ msgstr ""
-#~ "VIMRUN.EXE‚ช $PATH ‚ฬ’†‚ษŒฉ‚ย‚ฉ‚่‚‚น‚๑.\n"
-#~ "ŠO•”ƒRƒ}ƒ“ƒh‚ฬI—นŒใ‚ษˆ๊Žž’โŽ~‚๐‚ต‚‚น‚๑.\n"
-#~ "ฺื‚อ :help win32-vimrun ‚๐ŽQฦ‚ต‚ฤ‚ญ‚พ‚ณ‚ข."
-
-#~ msgid "Vim Warning"
-#~ msgstr "Vim‚ฬŒx"
-
-#~ msgid "Error file"
-#~ msgstr "ƒGƒ‰[ƒtƒ@ƒCƒ‹"
-
-#~ msgid "E868: Error building NFA with equivalence class!"
-#~ msgstr "E868: “™‰ฟƒNƒ‰ƒX‚๐Š‚NFA\\’z‚ษŽธ”s‚ต‚‚ต‚ฝ!"
-
-#~ msgid "E878: (NFA) Could not allocate memory for branch traversal!"
-#~ msgstr "E878: (NFA) Œป‰ก’f’†‚ฬƒuƒ‰ƒ“ƒ`‚ษ\\•ช‚ศƒƒ‚ƒŠ‚๐Š„‚่“–‚ฤ‚็‚๊‚‚น‚๑!"
-
-#~ msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\""
-#~ msgstr ""
-#~ "Œx: ’PŒ๊ƒŠƒXƒg \"%s_%s.spl\" ‚จ‚ๆ‚ั \"%s_ascii.spl\" ‚อŒฉ‚ย‚ฉ‚่‚‚น‚๑"
-
-#~ msgid "Conversion in %s not supported"
-#~ msgstr "%s “เ‚ฬ•ฯŠท‚อƒTƒ|[ƒg‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#~ msgid "E845: Insufficient memory, word list will be incomplete"
-#~ msgstr "E845: ƒƒ‚ƒŠ‚ช‘ซ‚่‚ศ‚ข‚ฬ‚ลA’PŒ๊ƒŠƒXƒg‚อ•sŠฎ‘S‚ล‚ท"
-
-#~ msgid "E430: Tag file path truncated for %s\n"
-#~ msgstr "E430: ƒ^ƒOƒtƒ@ƒCƒ‹‚ฬƒpƒX‚ช %s ‚ษุ‚่Žฬ‚ฤ‚็‚๊‚‚ต‚ฝ\n"
-
-#~ msgid "new shell started\n"
-#~ msgstr "V‚ต‚ขƒVƒFƒ‹‚๐‹N“ฎ‚ต‚‚ท\n"
-
-#~ msgid "Used CUT_BUFFER0 instead of empty selection"
-#~ msgstr "‹๓‚ฬ‘I‘๐—ฬˆๆ‚ฬ‚ฉ‚ํ‚่‚ษCUT_BUFFER0‚ชŽg—p‚ณ‚๊‚‚ต‚ฝ"
-
-#~ msgid "No undo possible; continue anyway"
-#~ msgstr "‰ย”\\‚ศƒAƒ“ƒhƒD‚อ‚ ‚่‚‚น‚๑: ‚ฦ‚่‚ ‚ฆ‚ธ‘ฑ‚ฏ‚‚ท"
-
-#~ msgid "E832: Non-encrypted file has encrypted undo file: %s"
-#~ msgstr ""
-#~ "E832: ”๑ˆร†‰ปƒtƒ@ƒCƒ‹‚ชˆร†‰ป‚ณ‚๊‚ฝƒAƒ“ƒhƒDƒtƒ@ƒCƒ‹‚๐Žg‚ม‚ฤ‚‚ท: %s"
-
-#~ msgid "E826: Undo file decryption failed: %s"
-#~ msgstr "E826: ˆร†‰ป‚ณ‚๊‚ฝƒAƒ“ƒhƒDƒtƒ@ƒCƒ‹‚ฬ‰๐“ว‚ษŽธ”s‚ต‚‚ต‚ฝ: %s"
-
-#~ msgid "E827: Undo file is encrypted: %s"
-#~ msgstr "E827: ƒAƒ“ƒhƒDƒtƒ@ƒCƒ‹‚ชˆร†‰ป‚ณ‚๊‚ฤ‚ข‚‚ท: %s"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16/32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 16/32 ƒrƒbƒg GUI ”ล"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 64 ƒrƒbƒg GUI ”ล"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 32 ƒrƒbƒg GUI ”ล"
-
-#~ msgid " in Win32s mode"
-#~ msgstr " in Win32s ƒ‚[ƒh"
-
-#~ msgid " with OLE support"
-#~ msgstr " with OLE ƒTƒ|[ƒg"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 64 ƒrƒbƒg ƒRƒ“ƒ\\[ƒ‹ ”ล"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 32 ƒrƒbƒg ƒRƒ“ƒ\\[ƒ‹ ”ล"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16-bit version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 16 ƒrƒbƒg ”ล"
-
-#~ msgid ""
-#~ "\n"
-#~ "32-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "32 ƒrƒbƒg MS-DOS ”ล"
-
-#~ msgid ""
-#~ "\n"
-#~ "16-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "16 ƒrƒbƒg MS-DOS ”ล"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X (unix) version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS X (unix) ”ล"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS X ”ล"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS ”ล"
-
-#~ msgid ""
-#~ "\n"
-#~ "OpenVMS version"
-#~ msgstr ""
-#~ "\n"
-#~ "OpenVMS ”ล"
-
-#~ msgid ""
-#~ "\n"
-#~ "Big version "
-#~ msgstr ""
-#~ "\n"
-#~ "Big ”ล "
-
-#~ msgid ""
-#~ "\n"
-#~ "Normal version "
-#~ msgstr ""
-#~ "\n"
-#~ "’สํ ”ล "
-
-#~ msgid ""
-#~ "\n"
-#~ "Small version "
-#~ msgstr ""
-#~ "\n"
-#~ "Small ”ล "
-
-#~ msgid ""
-#~ "\n"
-#~ "Tiny version "
-#~ msgstr ""
-#~ "\n"
-#~ "Tiny ”ล "
-
-#~ msgid "with GTK2-GNOME GUI."
-#~ msgstr "with GTK2-GNOME GUI."
-
-#~ msgid "with GTK2 GUI."
-#~ msgstr "with GTK2 GUI."
-
-#~ msgid "with X11-Motif GUI."
-#~ msgstr "with X11-Motif GUI."
-
-#~ msgid "with X11-neXtaw GUI."
-#~ msgstr "with X11-neXtaw GUI."
-
-#~ msgid "with X11-Athena GUI."
-#~ msgstr "with X11-Athena GUI."
-
-#~ msgid "with Photon GUI."
-#~ msgstr "with Photon GUI."
-
-#~ msgid "with GUI."
-#~ msgstr "with GUI."
-
-#~ msgid "with Carbon GUI."
-#~ msgstr "with Carbon GUI."
-
-#~ msgid "with Cocoa GUI."
-#~ msgstr "with Cocoa GUI."
-
-#~ msgid "with (classic) GUI."
-#~ msgstr "with (ƒNƒ‰ƒVƒbƒN) GUI."
-
-#~ msgid " system gvimrc file: \""
-#~ msgstr " ƒVƒXƒeƒ€ gvimrc: \""
-
-#~ msgid " user gvimrc file: \""
-#~ msgstr " ƒ†[ƒU gvimrc: \""
-
-#~ msgid "2nd user gvimrc file: \""
-#~ msgstr " ‘ๆ2ƒ†[ƒU gvimrc: \""
-
-#~ msgid "3rd user gvimrc file: \""
-#~ msgstr " ‘ๆ3ƒ†[ƒU gvimrc: \""
-
-#~ msgid " system menu file: \""
-#~ msgstr " ƒVƒXƒeƒ€ƒƒjƒ…[: \""
-
-#~ msgid "Compiler: "
-#~ msgstr "ƒRƒ“ƒpƒCƒ‰: "
-
-#~ msgid "menu Help->Orphans for information "
-#~ msgstr "ฺื‚อƒƒjƒ…[‚ฬ ƒwƒ‹ƒvจŒวŽ™ ‚๐ŽQฦ‚ต‚ฤ‰บ‚ณ‚ข "
-
-#~ msgid "Running modeless, typed text is inserted"
-#~ msgstr "ƒ‚[ƒh–ณ‚ลŽภs’†, ƒ^ƒCƒv‚ต‚ฝ•ถŽš‚ช‘}“‚ณ‚๊‚‚ท"
-
-#~ msgid "menu Edit->Global Settings->Toggle Insert Mode "
-#~ msgstr "ƒƒjƒ…[‚ฬ •าWจ‘S‘ฬ’่จ‘}“(‰SŽา)ƒ‚[ƒhุ‘ึ "
-
-#~ msgid " for two modes "
-#~ msgstr " ‚ลƒ‚[ƒh—L‚ษ "
-
-#~ msgid "menu Edit->Global Settings->Toggle Vi Compatible"
-#~ msgstr "ƒƒjƒ…[‚ฬ •าWจ‘S‘ฬ’่จViŒŠทƒ‚[ƒhุ‘ึ "
-
-#~ msgid " for Vim defaults "
-#~ msgstr " ‚ลVim‚ฦ‚ต‚ฤ“ฎ์ "
-
-#~ msgid "WARNING: Windows 95/98/ME detected"
-#~ msgstr " Œx: Windows 95/98/Me ‚๐ŒŸo "
-
-#~ msgid "type :help windows95<Enter> for info on this"
-#~ msgstr " ฺื‚ศ๎•๑‚อ :help windows95<Enter> "
-
-#~ msgid "Edit with &multiple Vims"
-#~ msgstr "•ก”‚ฬVim‚ล•าW‚ท‚้ (&M)"
-
-#~ msgid "Edit with single &Vim"
-#~ msgstr "1‚ย‚ฬVim‚ล•าW‚ท‚้ (&V)"
-
-#~ msgid "Diff with Vim"
-#~ msgstr "Vim‚ลท•ช‚๐•\\Žฆ‚ท‚้"
-
-#~ msgid "Edit with &Vim"
-#~ msgstr "Vim‚ล•าW‚ท‚้ (&V)"
-
-#~ msgid "Edit with existing Vim - "
-#~ msgstr "‹N“ฎฯ‚ฬVim‚ล•าW‚ท‚้ - "
-
-#~ msgid "Edits the selected file(s) with Vim"
-#~ msgstr "‘I‘๐‚ต‚ฝƒtƒ@ƒCƒ‹‚๐Vim‚ล•าW‚ท‚้"
-
-#~ msgid "Error creating process: Check if gvim is in your path!"
-#~ msgstr "ƒvƒƒZƒX‚ฬ์ฌ‚ษŽธ”s: gvim‚ชŠย‹ซ•ฯ”PATHใ‚ษ‚ ‚้‚ฉŠm”F‚ต‚ฤ‚ญ‚พ‚ณ‚ข!"
-
-#~ msgid "gvimext.dll error"
-#~ msgstr "gvimext.dll ƒGƒ‰["
-
-#~ msgid "Path length too long!"
-#~ msgstr "ƒpƒX‚ช’ท‚ท‚ฌ‚‚ท!"
-
-#~ msgid "E234: Unknown fontset: %s"
-#~ msgstr "E234: –ข’m‚ฬƒtƒHƒ“ƒgƒZƒbƒg: %s"
-
-#~ msgid "E235: Unknown font: %s"
-#~ msgstr "E235: –ข’m‚ฬƒtƒHƒ“ƒg: %s"
-
-#~ msgid "E236: Font \"%s\" is not fixed-width"
-#~ msgstr "E236: ƒtƒHƒ“ƒg \"%s\" ‚อŒล’่•‚ล‚อ‚ ‚่‚‚น‚๑"
-
-#~ msgid "E448: Could not load library function %s"
-#~ msgstr "E448: ƒ‰ƒCƒuƒ‰ƒŠ‚ฬŠึ” %s ‚๐ƒ[ƒh‚ล‚ซ‚‚น‚๑‚ล‚ต‚ฝ"
-
-#~ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
-#~ msgstr "E26: ƒwƒuƒ‰ƒCŒ๊‚อŽg—p•s‰ย”\\‚ล‚ท: ƒRƒ“ƒpƒCƒ‹Žž‚ษ–ณŒ๘‚ษ‚ณ‚๊‚ฤ‚ข‚‚ท\n"
-
-#~ msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
-#~ msgstr "E27: ƒyƒ‹ƒVƒAŒ๊‚อŽg—p•s‰ย”\\‚ล‚ท: ƒRƒ“ƒpƒCƒ‹Žž‚ษ–ณŒ๘‚ษ‚ณ‚๊‚ฤ‚ข‚‚ท\n"
-
-#~ msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
-#~ msgstr ""
-#~ "E800: ƒAƒ‰ƒrƒAŒ๊‚อŽg—p•s‰ย”\\‚ล‚ท: ƒRƒ“ƒpƒCƒ‹Žž‚ษ–ณŒ๘‚ษ‚ณ‚๊‚ฤ‚ข‚‚ท\n"
-
-#~ msgid "E247: no registered server named \"%s\""
-#~ msgstr "E247: %s ‚ฦ‚ข‚ค–ผ‘O‚ฬ“o˜^‚ณ‚๊‚ฝƒT[ƒo‚อ‚ ‚่‚‚น‚๑"
-
-#~ msgid "E233: cannot open display"
-#~ msgstr "E233: ƒfƒBƒXƒvƒŒƒC‚๐ŠJ‚ฏ‚‚น‚๑"
-
-#~ msgid "E449: Invalid expression received"
-#~ msgstr "E449: –ณŒ๘‚ศŽฎ‚๐Ž๓‚ฏŽๆ‚่‚‚ต‚ฝ"
-
-#~ msgid "E463: Region is guarded, cannot modify"
-#~ msgstr "E463: —ฬˆๆ‚ช•Œ์‚ณ‚๊‚ฤ‚ข‚้‚ฬ‚ล, •ฯX‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "E744: NetBeans does not allow changes in read-only files"
-#~ msgstr "E744: NetBeans ‚อ“วž๊—pƒtƒ@ƒCƒ‹‚๐•ฯX‚ท‚้‚ฑ‚ฦ‚๐‹–‚ต‚‚น‚๑"
-
-#~ msgid "Need encryption key for \"%s\""
-#~ msgstr "ˆร†ƒL[‚ช•K—v‚ล‚ท: \"%s\""
-
-#~ msgid "empty keys are not allowed"
-#~ msgstr "‹๓‚ฬƒL[‚อ‹–‰ย‚ณ‚๊‚ฤ‚ข‚‚น‚๑"
-
-#~ msgid "dictionary is locked"
-#~ msgstr "Žซ‘‚อƒƒbƒN‚ณ‚๊‚ฤ‚ข‚‚ท"
-
-#~ msgid "list is locked"
-#~ msgstr "ƒŠƒXƒg‚อƒƒbƒN‚ณ‚๊‚ฤ‚ข‚‚ท"
-
-#~ msgid "failed to add key '%s' to dictionary"
-#~ msgstr "Žซ‘‚ษƒL[ '%s' ‚๐’ว‰ม‚ท‚้‚ฬ‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#~ msgid "index must be int or slice, not %s"
-#~ msgstr "ƒCƒ“ƒfƒbƒNƒX‚อ %s ‚ล‚อ‚ศ‚ญฎ”‚ฉƒXƒ‰ƒCƒX‚ษ‚ต‚ฤ‚ญ‚พ‚ณ‚ข"
-
-#~ msgid "expected str() or unicode() instance, but got %s"
-#~ msgstr ""
-#~ "str() ‚เ‚ต‚ญ‚อ unicode() ‚ฬƒCƒ“ƒXƒ^ƒ“ƒX‚ชŠ๚‘า‚ณ‚๊‚ฤ‚ข‚้‚ฬ‚ษ %s ‚ล‚ต‚ฝ"
-
-#~ msgid "expected bytes() or str() instance, but got %s"
-#~ msgstr "bytes() ‚เ‚ต‚ญ‚อ str() ‚ฬƒCƒ“ƒXƒ^ƒ“ƒX‚ชŠ๚‘า‚ณ‚๊‚ฤ‚ข‚้‚ฬ‚ษ %s ‚ล‚ต‚ฝ"
-
-#~ msgid ""
-#~ "expected int(), long() or something supporting coercing to long(), but "
-#~ "got %s"
-#~ msgstr "long() ‚ฉ‚ป‚๊‚ึ•ฯŠท‰ย”\\‚ศ‚เ‚ฬ‚ชŠ๚‘า‚ณ‚๊‚ฤ‚ข‚้‚ฬ‚ษ %s ‚ล‚ต‚ฝ"
-
-#~ msgid "expected int() or something supporting coercing to int(), but got %s"
-#~ msgstr "int() ‚ฉ‚ป‚๊‚ึ•ฯŠท‰ย”\\‚ศ‚เ‚ฬ‚ชŠ๚‘า‚ณ‚๊‚ฤ‚ข‚้‚ฬ‚ษ %s ‚ล‚ต‚ฝ"
-
-#~ msgid "value is too large to fit into C int type"
-#~ msgstr "CŒพŒ๊‚ฬ int Œ^‚ฦ‚ต‚ฤ‚อ’l‚ช‘ๅ‚ซ‰฿‚ฌ‚‚ท"
-
-#~ msgid "value is too small to fit into C int type"
-#~ msgstr "CŒพŒ๊‚ฬ int Œ^‚ฦ‚ต‚ฤ‚อ’l‚ชฌ‚ณ‰฿‚ฌ‚‚ท"
-
-#~ msgid "number must be greater then zero"
-#~ msgstr "”’l‚อ 0 ‚ๆ‚่‘ๅ‚ซ‚ญ‚ศ‚ฏ‚๊‚ฮ‚ศ‚่‚‚น‚๑"
-
-#~ msgid "number must be greater or equal to zero"
-#~ msgstr "”’l‚อ 0 ‚ฉ‚ป‚๊ˆศใ‚ล‚ศ‚ฏ‚๊‚ฮ‚ศ‚่‚‚น‚๑"
-
-#~ msgid "can't delete OutputObject attributes"
-#~ msgstr "OutputObject‘ฎซ‚๐ม‚น‚‚น‚๑"
-
-#~ msgid "invalid attribute: %s"
-#~ msgstr "–ณŒ๘‚ศ‘ฎซ‚ล‚ท: %s"
-
-#~ msgid "E264: Python: Error initialising I/O objects"
-#~ msgstr "E264: Python: I/OƒIƒuƒWƒFƒNƒg‚ฬ‰Š๚‰ปƒGƒ‰["
-
-#~ msgid "failed to change directory"
-#~ msgstr "Žซ‘‚ฬ•ฯX‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#~ msgid "expected 3-tuple as imp.find_module() result, but got %s"
-#~ msgstr "imp.find_module() ‚ช %s ‚๐•ิ‚ต‚‚ต‚ฝ (Š๚‘า’l: 2 —v‘f‚ฬƒ^ƒvƒ‹)"
-
-#~ msgid ""
-#~ "expected 3-tuple as imp.find_module() result, but got tuple of size %d"
-#~ msgstr "impl.find_module() ‚ช %d —v‘f‚ฬƒ^ƒvƒ‹‚๐•ิ‚ต‚‚ต‚ฝ (Š๚‘า’l: 2)"
-
-#~ msgid "internal error: imp.find_module returned tuple with NULL"
-#~ msgstr "“เ•”ƒGƒ‰[: imp.find_module ‚ช NULL ‚๐Š‚ƒ^ƒvƒ‹‚๐•ิ‚ต‚‚ต‚ฝ"
-
-#~ msgid "cannot delete vim.Dictionary attributes"
-#~ msgstr "vim.Dictionary‘ฎซ‚อม‚น‚‚น‚๑"
-
-#~ msgid "cannot modify fixed dictionary"
-#~ msgstr "Œล’่‚ณ‚๊‚ฝŽซ‘‚อ•ฯX‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "cannot set attribute %s"
-#~ msgstr "‘ฎซ %s ‚อ’่‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "hashtab changed during iteration"
-#~ msgstr "ƒCƒeƒŒ[ƒVƒ‡ƒ“’†‚ษ hashtab ‚ช•ฯX‚ณ‚๊‚‚ต‚ฝ"
-
-#~ msgid "expected sequence element of size 2, but got sequence of size %d"
-#~ msgstr "ƒV[ƒPƒ“ƒX‚ฬ—v‘f”‚ษ‚อ 2 ‚ชŠ๚‘า‚ณ‚๊‚ฤ‚ข‚‚ต‚ฝ‚ช %d ‚ล‚ต‚ฝ"
-
-#~ msgid "list constructor does not accept keyword arguments"
-#~ msgstr "ƒŠƒXƒg‚ฬƒRƒ“ƒXƒgƒ‰ƒNƒ^‚อƒL[ƒ[ƒhˆ๘”‚๐Ž๓‚ฏ•t‚ฏ‚‚น‚๑"
-
-#~ msgid "list index out of range"
-#~ msgstr "ƒŠƒXƒg”อˆอŠO‚ฬƒCƒ“ƒfƒbƒNƒX‚ล‚ท"
-
-#~ msgid "internal error: failed to get vim list item %d"
-#~ msgstr "“เ•”ƒGƒ‰[: vim‚ฬƒŠƒXƒg—v‘f %d ‚ฬŽๆ“พ‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#~ msgid "failed to add item to list"
-#~ msgstr "ƒŠƒXƒg‚ึ‚ฬ—v‘f’ว‰ม‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#~ msgid "internal error: no vim list item %d"
-#~ msgstr "“เ•”ƒGƒ‰[: vim‚ฬƒŠƒXƒg—v‘f %d ‚อ‚ ‚่‚‚น‚๑"
-
-#~ msgid "internal error: failed to add item to list"
-#~ msgstr "“เ•”ƒGƒ‰[: ƒŠƒXƒg‚ึ‚ฬ—v‘f’ว‰ม‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#~ msgid "cannot delete vim.List attributes"
-#~ msgstr "vim.List ‘ฎซ‚อม‚น‚‚น‚๑"
-
-#~ msgid "cannot modify fixed list"
-#~ msgstr "Œล’่‚ณ‚๊‚ฝƒŠƒXƒg‚อ•ฯX‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "unnamed function %s does not exist"
-#~ msgstr "–ณ–ผŠึ” %s ‚อ‘ถ‚ต‚‚น‚๑"
-
-#~ msgid "function %s does not exist"
-#~ msgstr "Šึ” %s ‚ช‚ ‚่‚‚น‚๑"
-
-#~ msgid "function constructor does not accept keyword arguments"
-#~ msgstr "Šึ”‚ฬƒRƒ“ƒXƒgƒ‰ƒNƒ^‚อƒL[ƒ[ƒhˆ๘”‚๐Ž๓‚ฏ•t‚ฏ‚‚น‚๑"
-
-#~ msgid "failed to run function %s"
-#~ msgstr "Šึ” %s ‚ฬŽภs‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#~ msgid "problem while switching windows"
-#~ msgstr "ƒEƒBƒ“ƒhƒE‚๐ุŠท’†‚ษ–โ‘่‚ช”ญถ‚ต‚‚ต‚ฝ"
-
-#~ msgid "unable to unset global option %s"
-#~ msgstr "ƒOƒ[ƒoƒ‹ƒIƒvƒVƒ‡ƒ“ %s ‚ฬ’่‰๐œ‚อ‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "unable to unset option %s which does not have global value"
-#~ msgstr "ƒOƒ[ƒoƒ‹‚ศ’l‚ฬ–ณ‚ขƒIƒvƒVƒ‡ƒ“ %s ‚ฬ’่‰๐œ‚อ‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "attempt to refer to deleted tab page"
-#~ msgstr "ํœ‚ณ‚๊‚ฝƒ^ƒu‚๐ŽQฦ‚ต‚ๆ‚ค‚ฦ‚ต‚‚ต‚ฝ"
-
-#~ msgid "no such tab page"
-#~ msgstr "‚ป‚ฬ‚ๆ‚ค‚ศƒ^ƒuƒy[ƒW‚อ‚ ‚่‚‚น‚๑"
-
-#~ msgid "attempt to refer to deleted window"
-#~ msgstr "ํœ‚ณ‚๊‚ฝƒEƒBƒ“ƒhƒE‚๐ŽQฦ‚ต‚ๆ‚ค‚ฦ‚ต‚‚ต‚ฝ"
-
-#~ msgid "readonly attribute: buffer"
-#~ msgstr "“วž๊—p‘ฎซ: ƒoƒbƒtƒ@["
-
-#~ msgid "cursor position outside buffer"
-#~ msgstr "ƒJ[ƒ\\ƒ‹ˆส’u‚ชƒoƒbƒtƒ@‚ฬŠO‘ค‚ล‚ท"
-
-#~ msgid "no such window"
-#~ msgstr "‚ป‚ฬ‚ๆ‚ค‚ศƒEƒBƒ“ƒhƒE‚อ‚ ‚่‚‚น‚๑"
-
-#~ msgid "attempt to refer to deleted buffer"
-#~ msgstr "ํœ‚ณ‚๊‚ฝƒoƒbƒtƒ@‚๐ŽQฦ‚ต‚ๆ‚ค‚ฦ‚ต‚‚ต‚ฝ"
-
-#~ msgid "failed to rename buffer"
-#~ msgstr "ƒoƒbƒtƒ@–ผ‚ฬ•ฯX‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#~ msgid "mark name must be a single character"
-#~ msgstr "ƒ}[ƒN–ผ‚อ1•ถŽš‚ฬƒAƒ‹ƒtƒ@ƒxƒbƒg‚ล‚ศ‚ฏ‚๊‚ฮ‚ศ‚่‚‚น‚๑"
-
-#~ msgid "expected vim.Buffer object, but got %s"
-#~ msgstr "vim.BufferƒIƒuƒWƒFƒNƒg‚ชŠ๚‘า‚ณ‚๊‚ฤ‚ข‚้‚ฬ‚ษ %s ‚ล‚ต‚ฝ"
-
-#~ msgid "failed to switch to buffer %d"
-#~ msgstr "Žw’่‚ณ‚๊‚ฝƒoƒbƒtƒ@ %d ‚ึ‚ฬุ‚่‘ึ‚ฆ‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#~ msgid "expected vim.Window object, but got %s"
-#~ msgstr "vim.WindowƒIƒuƒWƒFƒNƒg‚ชŠ๚‘า‚ณ‚๊‚ฤ‚ข‚้‚ฬ‚ษ %s ‚ล‚ต‚ฝ"
-
-#~ msgid "failed to find window in the current tab page"
-#~ msgstr "Œป‚ฬƒ^ƒu‚ษ‚อŽw’่‚ณ‚๊‚ฝƒEƒBƒ“ƒhƒE‚ช‚ ‚่‚‚น‚๑‚ล‚ต‚ฝ"
-
-#~ msgid "did not switch to the specified window"
-#~ msgstr "Žw’่‚ณ‚๊‚ฝƒEƒBƒ“ƒhƒE‚ษุ‚่‘ึ‚ฆ‚‚น‚๑‚ล‚ต‚ฝ"
-
-#~ msgid "expected vim.TabPage object, but got %s"
-#~ msgstr "vim.TabPageƒIƒuƒWƒFƒNƒg‚ชŠ๚‘า‚ณ‚๊‚ฤ‚ข‚้‚ฬ‚ษ %s ‚ล‚ต‚ฝ"
-
-#~ msgid "did not switch to the specified tab page"
-#~ msgstr "Žw’่‚ณ‚๊‚ฝƒ^ƒuƒy[ƒW‚ษุ‚่‘ึ‚ฆ‚‚น‚๑‚ล‚ต‚ฝ"
-
-#~ msgid "failed to run the code"
-#~ msgstr "ƒR[ƒh‚ฬŽภs‚ษŽธ”s‚ต‚‚ต‚ฝ"
-
-#~ msgid "E858: Eval did not return a valid python object"
-#~ msgstr "E858: Žฎ•]‰ฟ‚อ—LŒ๘‚ศpythonƒIƒuƒWƒFƒNƒg‚๐•ิ‚ต‚‚น‚๑‚ล‚ต‚ฝ"
-
-#~ msgid "E859: Failed to convert returned python object to vim value"
-#~ msgstr "E859: •ิ‚ณ‚๊‚ฝpythonƒIƒuƒWƒFƒNƒg‚๐vim‚ฬ’l‚ษ•ฯŠท‚ล‚ซ‚‚น‚๑‚ล‚ต‚ฝ"
-
-#~ msgid "unable to convert %s to vim dictionary"
-#~ msgstr "%s vim‚ฬŽซ‘Œ^‚ษ•ฯŠท‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "unable to convert %s to vim structure"
-#~ msgstr "%s ‚๐vim‚ฬ\\‘ข‘ฬ‚ษ•ฯŠท‚ล‚ซ‚‚น‚๑"
-
-#~ msgid "internal error: NULL reference passed"
-#~ msgstr "“เ•”ƒGƒ‰[: NULLŽQฦ‚ช“n‚ณ‚๊‚‚ต‚ฝ"
-
-#~ msgid "internal error: invalid value type"
-#~ msgstr "“เ•”ƒGƒ‰[: –ณŒ๘‚ศ’lŒ^‚ล‚ท"
-
-#~ msgid ""
-#~ "Failed to set path hook: sys.path_hooks is not a list\n"
-#~ "You should now do the following:\n"
-#~ "- append vim.path_hook to sys.path_hooks\n"
-#~ "- append vim.VIM_SPECIAL_PATH to sys.path\n"
-#~ msgstr ""
-#~ "ƒpƒXƒtƒbƒN‚ฬ’่‚ษŽธ”s‚ต‚‚ต‚ฝ: sys.path_hooks ‚ชƒŠƒXƒg‚ล‚อ‚ ‚่‚‚น‚๑\n"
-#~ "‚ท‚ฎ‚ษ‰บ‹L‚๐ŽภŽ{‚ต‚ฤ‚ญ‚พ‚ณ‚ข:\n"
-#~ "- vim.path_hooks ‚๐ sys.path_hooks ‚ึ’ว‰ม\n"
-#~ "- vim.VIM_SPECIAL_PATH ‚๐ sys.path ‚ึ’ว‰ม\n"
-
-#~ msgid ""
-#~ "Failed to set path: sys.path is not a list\n"
-#~ "You should now append vim.VIM_SPECIAL_PATH to sys.path"
-#~ msgstr ""
-#~ "ƒpƒX‚ฬ’่‚ษŽธ”s‚ต‚‚ต‚ฝ: sys.path ‚ชƒŠƒXƒg‚ล‚อ‚ ‚่‚‚น‚๑\n"
-#~ "‚ท‚ฎ‚ษ vim.VIM_SPECIAL_PATH ‚๐ sys.path ‚ษ’ว‰ม‚ต‚ฤ‚ญ‚พ‚ณ‚ข"
diff --git a/src/nvim/po/ko.UTF-8.po b/src/nvim/po/ko.UTF-8.po
index 149286eda8..e90081bcfd 100644
--- a/src/nvim/po/ko.UTF-8.po
+++ b/src/nvim/po/ko.UTF-8.po
@@ -1111,6 +1111,10 @@ msgstr "E137: Viminfo ํŒŒ์ผ์˜ ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค: %s"
#: ../ex_cmds.c:1626
#, c-format
+msgid "E929: Too many viminfo temp files, like %s!"
+msgstr "E929: ๋„ˆ๋ฌด ๋งŽ์€ viminfo ์ž„์‹œ ํŒŒ์ผ๋“ค, ๊ฐ€๋ น %s!"
+
+#, c-format
msgid "E138: Can't write viminfo file %s!"
msgstr "E138: Viminfo ํŒŒ์ผ %s์„(๋ฅผ) ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!"
@@ -1119,6 +1123,10 @@ msgstr "E138: Viminfo ํŒŒ์ผ %s์„(๋ฅผ) ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!"
msgid "Writing viminfo file \"%s\""
msgstr "Viminfo ํŒŒ์ผ \"%s\"์„(๋ฅผ) ์“ฐ๋Š” ์ค‘"
+#, c-format
+msgid "E886: Can't rename viminfo file to %s!"
+msgstr "E886: viminfo ํŒŒ์ผ๋ช…์„ %s(์œผ)๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!"
+
#. Write the info:
#: ../ex_cmds.c:1720
#, c-format
@@ -1300,8 +1308,8 @@ msgstr "๋ฏธ์•ˆํ•ฉ๋‹ˆ๋‹ค, ๋„์›€๋ง ํŒŒ์ผ \"%s\"์„(๋ฅผ) ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค
#: ../ex_cmds.c:5323
#, c-format
-msgid "E150: Not a directory: %s"
-msgstr "E150: ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์•„๋‹˜: %s"
+msgid "E151: No match: %s"
+msgstr "E151: ๋งž์ง€ ์•Š์Œ: %s"
#: ../ex_cmds.c:5446
#, c-format
@@ -1325,6 +1333,10 @@ msgstr "E154: \"%s\" ํƒœ๊ทธ๊ฐ€ %s/%s ํŒŒ์ผ์—์„œ ์ค‘๋ณต๋˜์—ˆ์Šต๋‹ˆ๋‹ค"
#: ../ex_cmds.c:5687
#, c-format
+msgid "E150: Not a directory: %s"
+msgstr "E150: ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์•„๋‹˜: %s"
+
+#, c-format
msgid "E160: Unknown sign command: %s"
msgstr "E160: ๋ชจ๋ฅด๋Š” sign ๋ช…๋ น: %s"
@@ -1452,8 +1464,16 @@ msgstr "\"%s\"์„(๋ฅผ) ์ฐพ๋Š” ์ค‘"
#: ../ex_cmds2.c:2307
#, c-format
-msgid "not found in 'runtimepath': \"%s\""
-msgstr "'runtimepath'์—์„œ ์ฐพ์„ ์ˆ˜ ์—†์Œ: \"%s\""
+msgid "not found in '%s': \"%s\""
+msgstr "'%s'์—์„œ ์ฐพ์„ ์ˆ˜ ์—†์Œ: \"%s\""
+
+#, c-format
+msgid "W20: Required python version 2.x not supported, ignoring file: %s"
+msgstr "W20: ์š”๊ตฌ๋˜๋Š” ํŒŒ์ด์„  ๋ฒ„์ ผ 2.x๋Š” ์ง€์›๋˜์ง€ ์•Š์Œ, ํŒŒ์ผ์„ ๋ฌด์‹œ: %s"
+
+#, c-format
+msgid "W21: Required python version 3.x not supported, ignoring file: %s"
+msgstr "W21: ์š”๊ตฌ๋˜๋Š” ํŒŒ์ด์„  ๋ฒ„์ ผ 3.x๋Š” ์ง€์›๋˜์ง€ ์•Š์Œ, ํŒŒ์ผ์„ ๋ฌด์‹œ: %s"
#: ../ex_cmds2.c:2472
#, c-format
@@ -1609,10 +1629,10 @@ msgstr "E174: ๋ช…๋ น์ด ์ด๋ฏธ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค: ๋ฐ”๊พธ๋ ค๋ฉด !์„ ๋”ํ•˜์„ธ์š”"
#: ../ex_docmd.c:4432
msgid ""
"\n"
-" Name Args Range Complete Definition"
+" Name Args Address Complete Definition"
msgstr ""
"\n"
-" ์ด๋ฆ„ ์ธ์ž ๋ฒ”์œ„ ์™„์„ฑ ์ •์˜"
+" ์ด๋ฆ„ ์ธ์ž ์ฃผ์†Œ ์™„์„ฑ ์ •์˜"
#: ../ex_docmd.c:4516
msgid "No user-defined commands found"
@@ -1662,6 +1682,10 @@ msgstr "E184: ๊ทธ๋Ÿฐ ์‚ฌ์šฉ์ž ์ •์˜ ๋ช…๋ น ์—†์Œ: %s"
#: ../ex_docmd.c:5219
#, c-format
+msgid "E180: Invalid address type value: %s"
+msgstr "E180: ์ž˜๋ชป๋œ ์ฃผ์†Œ ํ˜•์‹ ๊ฐ’: %s"
+
+#, c-format
msgid "E180: Invalid complete value: %s"
msgstr "E180: ์ž˜๋ชป๋œ ๋๋‚ด๊ธฐ ๊ฐ’: %s"
@@ -1953,7 +1977,7 @@ msgstr ""
#: ../ex_getln.c:5047
msgid "Command Line"
-msgstr "๋ช…๋ น ์ค„"
+msgstr "๋ช…๋ น ํ–‰"
#: ../ex_getln.c:5048
msgid "Search String"
@@ -1965,7 +1989,10 @@ msgstr "ํ‘œํ˜„"
#: ../ex_getln.c:5050
msgid "Input Line"
-msgstr "์ž…๋ ฅ ์ค„"
+msgstr "์ž…๋ ฅ ํ–‰"
+
+msgid "Debug Line"
+msgstr "๋””๋ฒ„๊ทธ ํ–‰"
#: ../ex_getln.c:5117
msgid "E198: cmd_pchar beyond the command length"
@@ -2433,7 +2460,7 @@ msgstr "E216: ๊ทธ๋Ÿฐ ๊ทธ๋ฃน์ด๋‚˜ ์ด๋ฒคํŠธ ์—†์Œ: %s"
#: ../fileio.c:6090
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
"--- ์ž๋™-๋ช…๋ น ---"
@@ -2648,11 +2675,6 @@ msgstr "E49: ์Šคํฌ๋กค ํฌ๊ธฐ๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค"
msgid "E901: Job table is full"
msgstr ""
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
#: ../globals.h:1024
#, c-format
msgid "E364: Library call failed for \"%s()\""
@@ -3195,6 +3217,7 @@ msgstr "%-5s: %s%*s (์‚ฌ์šฉ๋ฒ•: %s)"
#: ../if_cscope.c:1155
msgid ""
"\n"
+" a: Find assignments to this symbol\n"
" c: Find functions calling this function\n"
" d: Find functions called by this function\n"
" e: Find this egrep pattern\n"
@@ -3205,13 +3228,14 @@ msgid ""
" t: Find this text string\n"
msgstr ""
"\n"
+" a: ์ด ๊ธฐํ˜ธ์— ๋Œ€ํ•œ ํ• ๋‹น ์ฐพ๊ธฐ\n"
" c: ์ด ํ•จ์ˆ˜๋ฅผ ๋ถ€๋ฅด๋Š” ํ•จ์ˆ˜๋“ค ์ฐพ๊ธฐ\n"
" d: ์ด ํ•จ์ˆ˜์— ์˜ํ•ด ๋ถˆ๋ ค์ง€๋Š” ํ•จ์ˆ˜๋“ค ์ฐพ๊ธฐ\n"
" e: ์ด egrep ํŒจํ„ด ์ฐพ๊ธฐ\n"
" f: ์ด ํŒŒ์ผ ์ฐพ๊ธฐ\n"
" g: ์ด ์ •์˜ ์ฐพ๊ธฐ\n"
-" i: ์ด ํŒŒ์ผ์„ ํฌํ•จํ•˜๋Š” ํŒŒ์ผ๋“ค ์ฐพ๊ธฐ\n"
-" s: ์ด C ์‹ฌ๋ณผ ์ฐพ๊ธฐ\n"
+" i: ์ด ํŒŒ์ผ์„ #includeํ•˜๋Š” ํŒŒ์ผ๋“ค ์ฐพ๊ธฐ\n"
+" s: ์ด C ๊ธฐํ˜ธ ์ฐพ๊ธฐ\n"
" t: ์ด ๋ฌธ์ž์—ด ์ฐพ๊ธฐ\n"
#: ../if_cscope.c:1226
@@ -3354,7 +3378,7 @@ msgstr "-q [์—๋ŸฌํŒŒ์ผ] ์ฒซ ๋ฒˆ์งธ ์—๋Ÿฌ๊ฐ€ ๋‚œ ํŒŒ์ผ ๊ณ ์น˜๊ธฐ"
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
@@ -4224,10 +4248,6 @@ msgstr "%4ld ์ค„:"
msgid "E354: Invalid register name: '%s'"
msgstr "E354: ์ž˜๋ชป๋œ ๋ ˆ์ง€์Šคํ„ฐ ์ด๋ฆ„: '%s'"
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr "๋ฉ”์‹œ์ง€ ๊ด€๋ฆฌ์ž: Bram Moolenaar <Bram@vim.org>"
-
#: ../message.c:986
msgid "Interrupt: "
msgstr "์ค‘๋‹จ: "
@@ -4749,6 +4769,13 @@ msgstr "E447: path์—์„œ \"%s\" ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"
#: ../quickfix.c:359
#, c-format
+msgid "shell returned %d"
+msgstr "์‰˜์ด %d์„(๋ฅผ) ๋Œ๋ ค์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค"
+
+msgid "E926: Current location list was changed"
+msgstr "E926: ํ˜„์žฌ์˜ location list๊ฐ€ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค"
+
+#, c-format
msgid "E372: Too many %%%c in format string"
msgstr "E372: ํ˜•์‹ ๋ฌธ์ž์—ด์— %%%c์ด(๊ฐ€) ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค"
@@ -5256,14 +5283,9 @@ msgstr "E772: Spell ํŒŒ์ผ์ด ์ƒˆ ๋ฒ„์ ผ์˜ Vim์šฉ์ž…๋‹ˆ๋‹ค"
msgid "E770: Unsupported section in spell file"
msgstr "E770: spell ํŒŒ์ผ์— ์ง€์›๋˜์ง€ ์•Š๋Š” ์„น์…˜"
-#: ../spell.c:3762
-#, c-format
-msgid "Warning: region %s not supported"
-msgstr "๊ฒฝ๊ณ : %s ์˜์—ญ์€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค"
-
#: ../spell.c:4550
#, c-format
-msgid "Reading affix file %s ..."
+msgid "Reading affix file %s..."
msgstr "affix ํŒŒ์ผ %s ์ฝ๋Š” ์ค‘"
#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
@@ -5426,7 +5448,7 @@ msgstr "%s ๊ฐ’์ด ๋‹ค๋ฅธ .aff ํŒŒ์ผ์—์„œ ์‚ฌ์šฉ๋œ ๊ฒƒ๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค"
#: ../spell.c:5602
#, c-format
-msgid "Reading dictionary file %s ..."
+msgid "Reading dictionary file %s..."
msgstr "์‚ฌ์ „ ํŒŒ์ผ %s ์ฝ๋Š” ์ค‘ ..."
#: ../spell.c:5611
@@ -5436,8 +5458,8 @@ msgstr "E760: %s์— ๋‹จ์–ด ์นด์šดํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค"
#: ../spell.c:5669
#, c-format
-msgid "line %6d, word %6d - %s"
-msgstr "๋ผ์ธ %6d, ๋‹จ์–ด %6d - %s"
+msgid "line %6d, word %6ld - %s"
+msgstr "๋ผ์ธ %6d, ๋‹จ์–ด %6ld - %s"
#: ../spell.c:5691
#, c-format
@@ -5461,7 +5483,7 @@ msgstr "๋ฌด์‹œ๋œ %d๊ฐœ์˜ ์•„์Šคํ‚ค๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๋‹จ์–ด๊ฐ€ %s์— ์žˆ์Šต๋‹
#: ../spell.c:6115
#, c-format
-msgid "Reading word file %s ..."
+msgid "Reading word file %s..."
msgstr "๋‹จ์–ด ํŒŒ์ผ %s ์ฝ๋Š” ์ค‘ ..."
#: ../spell.c:6155
@@ -5531,7 +5553,7 @@ msgstr "์ด ๋‹จ์–ด ์ˆ˜: %d"
#: ../spell.c:7655
#, c-format
-msgid "Writing suggestion file %s ..."
+msgid "Writing suggestion file %s..."
msgstr "%s ์ œ์•ˆ ํŒŒ์ผ์„ ์“ฐ๋Š” ์ค‘ ..."
#: ../spell.c:7707 ../spell.c:7927
@@ -5558,7 +5580,7 @@ msgstr "๊ฒฝ๊ณ : compound์™€ NOBREAK ๋‘˜ ๋‹ค ๋ช…์‹œ๋จ"
#: ../spell.c:7920
#, c-format
-msgid "Writing spell file %s ..."
+msgid "Writing spell file %s..."
msgstr "spell ํŒŒ์ผ %s ์“ฐ๋Š” ์ค‘ ..."
#: ../spell.c:7925
@@ -6321,7 +6343,7 @@ msgstr "by Bram Moolenaar et al."
#: ../version.c:774
msgid "Vim is open source and freely distributable"
-msgstr "๋น”์€ ์†Œ์Šค๊ฐ€ ์—ด๋ ค ์žˆ๊ณ  ๊ณต์งœ๋กœ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค"
+msgstr "๋น”์€ ๋ˆ„๊ตฌ๋‚˜ ์†Œ์Šค๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ณ  ๊ณต์งœ๋กœ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค"
#: ../version.c:776
msgid "Help poor children in Uganda!"
@@ -7487,9 +7509,6 @@ msgstr "E446: ์ปค์„œ ๋ฐ‘์— ํŒŒ์ผ ์ด๋ฆ„์ด ์—†์Šต๋‹ˆ๋‹ค"
#~ msgid "Could not fix up function pointers to the DLL!"
#~ msgstr "ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋ฅผ DLL๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!"
-#~ msgid "shell returned %d"
-#~ msgstr "์‰˜์ด %d์„(๋ฅผ) ๋Œ๋ ค์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค"
-
#~ msgid "Vim: Caught %s event\n"
#~ msgstr "๋น”: %s ์ด๋ฒคํŠธ๋ฅผ ์žก์•˜์Šต๋‹ˆ๋‹ค\n"
diff --git a/src/nvim/po/ko.po b/src/nvim/po/ko.po
deleted file mode 100644
index b6aaf37bbb..0000000000
--- a/src/nvim/po/ko.po
+++ /dev/null
@@ -1,7858 +0,0 @@
-# Korean translation for Vim
-#
-# FIRST AUTHOR SungHyun Nam <goweol@gmail.com>, 2000-2011
-#
-# Generated from ko.UTF-8, DO NOT EDIT.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: vim 7.3\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-05-26 14:21+0200\n"
-"PO-Revision-Date: 2010-02-18 09:49+0900\n"
-"Last-Translator: SungHyun Nam <goweol@gmail.com>\n"
-"Language-Team: GTP Korean <gnome-kr-translation@gnome.or.kr>\n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=euc-kr\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: ../api/private/helpers.c:201
-#, fuzzy
-msgid "Unable to get option value"
-msgstr "ฟษผว ภฮภฺ ตฺฟก พฒทนฑโ ฐช"
-
-#: ../api/private/helpers.c:204
-msgid "internal error: unknown option type"
-msgstr ""
-
-#: ../buffer.c:92
-msgid "[Location List]"
-msgstr "[ภงฤก ธ๑ทฯ]"
-
-#: ../buffer.c:93
-msgid "[Quickfix List]"
-msgstr "[Quickfix ธ๑ทฯ]"
-
-#: ../buffer.c:94
-#, fuzzy
-msgid "E855: Autocommands caused command to abort"
-msgstr "E812: Autocommandฐก น๖ฦณช น๖ฦภฬธงภป นูฒูพ๚ฝภดฯดู"
-
-#: ../buffer.c:135
-msgid "E82: Cannot allocate any buffer, exiting..."
-msgstr "E82: น๖ฦธฆ วาด็วา ผ๖ พ๘พ๎ผญ ณกณภดฯดู..."
-
-#: ../buffer.c:138
-msgid "E83: Cannot allocate buffer, using other one..."
-msgstr "E83: น๖ฦธฆ วาด็วา ผ๖ พ๘พ๎ผญ ดูธฅ ฐษ ป็ฟ๋วีดฯดู..."
-
-#: ../buffer.c:763
-msgid "E515: No buffers were unloaded"
-msgstr "E515: ณปทมม๘ น๖ฦฐก พ๘ฝภดฯดู"
-
-#: ../buffer.c:765
-msgid "E516: No buffers were deleted"
-msgstr "E516: ม๖ฟ๖ม๘ น๖ฦฐก พ๘ฝภดฯดู"
-
-#: ../buffer.c:767
-msgid "E517: No buffers were wiped out"
-msgstr "E517: ฟฯภศ๗ ม๖ฟ๖ม๘ น๖ฦฐก พ๘ฝภดฯดู"
-
-#: ../buffer.c:772
-msgid "1 buffer unloaded"
-msgstr "น๖ฦ วั ฐณฐก ณปทมมณฝภดฯดู"
-
-#: ../buffer.c:774
-#, c-format
-msgid "%d buffers unloaded"
-msgstr "น๖ฦ %d ฐณฐก ณปทมมณฝภดฯดู"
-
-#: ../buffer.c:777
-msgid "1 buffer deleted"
-msgstr "น๖ฦ วั ฐณฐก ม๖ฟ๖มณฝภดฯดู"
-
-#: ../buffer.c:779
-#, c-format
-msgid "%d buffers deleted"
-msgstr "น๖ฦ %d ฐณฐก ม๖ฟ๖มณฝภดฯดู"
-
-#: ../buffer.c:782
-msgid "1 buffer wiped out"
-msgstr "น๖ฦ วั ฐณฐก ฟฯภศ๗ ม๖ฟ๖มณฝภดฯดู"
-
-#: ../buffer.c:784
-#, c-format
-msgid "%d buffers wiped out"
-msgstr "น๖ฦ %dฐณฐก ฟฯภศ๗ ม๖ฟ๖มณฝภดฯดู"
-
-#: ../buffer.c:806
-msgid "E90: Cannot unload last buffer"
-msgstr "E90: ธถม๖ธท น๖ฦธฆ ณปธฑ ผ๖ พ๘ฝภดฯดู"
-
-#: ../buffer.c:874
-msgid "E84: No modified buffer found"
-msgstr "E84: นูฒ๏ น๖ฦธฆ รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#. back where we started, didn't find anything.
-#: ../buffer.c:903
-msgid "E85: There is no listed buffer"
-msgstr "E85: ณชฟญตศ น๖ฦฐก พ๘ฝภดฯดู"
-
-#: ../buffer.c:913
-#, c-format
-msgid "E86: Buffer %<PRId64> does not exist"
-msgstr "E86: น๖ฦ %<PRId64>ภฬ(ฐก) มธภ็วฯม๖ พสฝภดฯดู"
-
-#: ../buffer.c:915
-msgid "E87: Cannot go beyond last buffer"
-msgstr "E87: ธถม๖ธท น๖ฦภิดฯดู"
-
-#: ../buffer.c:917
-msgid "E88: Cannot go before first buffer"
-msgstr "E88: รน น๘ยฐ น๖ฦภิดฯดู"
-
-#: ../buffer.c:945
-#, c-format
-msgid ""
-"E89: No write since last change for buffer %<PRId64> (add ! to override)"
-msgstr ""
-"E89: น๖ฦ %<PRId64>ภป(ธฆ) ธถม๖ธทภธทฮ ฐํฤฃ ตฺ ภ๚ภๅวฯม๖ พสพาฝภดฯดู (ตคพ๎พฒทม"
-"ธ้ ! ด๕วฯฑโ)"
-
-#. wrap around (may cause duplicates)
-#: ../buffer.c:1423
-msgid "W14: Warning: List of file names overflow"
-msgstr "W14: ฐๆฐํ: ฦฤภฯ ภฬธง ธ๑ทฯภฬ ณัรฦฝภดฯดู"
-
-#: ../buffer.c:1555 ../quickfix.c:3361
-#, c-format
-msgid "E92: Buffer %<PRId64> not found"
-msgstr "E92: น๖ฦ %<PRId64>ภป(ธฆ) รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../buffer.c:1798
-#, c-format
-msgid "E93: More than one match for %s"
-msgstr "E93: %sภป(ธฆ) วฯณช ภฬป๓ รฃพาฝภดฯดู"
-
-#: ../buffer.c:1800
-#, c-format
-msgid "E94: No matching buffer for %s"
-msgstr "E94: %sฟอ ธยดย น๖ฦฐก พ๘ฝภดฯดู"
-
-#: ../buffer.c:2161
-#, c-format
-msgid "line %<PRId64>"
-msgstr "%<PRId64> มู"
-
-#: ../buffer.c:2233
-msgid "E95: Buffer with this name already exists"
-msgstr "E95: ภฬ ภฬธงภป ฐกม๘ น๖ฦฐก ภฬนฬ ภึฝภดฯดู"
-
-#: ../buffer.c:2498
-msgid " [Modified]"
-msgstr " [นูฒ๑]"
-
-#: ../buffer.c:2501
-msgid "[Not edited]"
-msgstr "[ฐํฤกม๖ พสพาภฝ]"
-
-#: ../buffer.c:2504
-msgid "[New file]"
-msgstr "[ป๕ ฦฤภฯ]"
-
-#: ../buffer.c:2505
-msgid "[Read errors]"
-msgstr "[ภะฑโ ฟกทฏ]"
-
-#: ../buffer.c:2506 ../buffer.c:3217 ../fileio.c:1807 ../screen.c:4895
-msgid "[RO]"
-msgstr "[ภะฑโ ภฟ๋]"
-
-#: ../buffer.c:2507 ../fileio.c:1807
-msgid "[readonly]"
-msgstr "[ภะฑโ ภฟ๋]"
-
-#: ../buffer.c:2524
-#, c-format
-msgid "1 line --%d%%--"
-msgstr "1 มู --%d%%--"
-
-#: ../buffer.c:2526
-#, c-format
-msgid "%<PRId64> lines --%d%%--"
-msgstr "%<PRId64> มู --%d%%--"
-
-#: ../buffer.c:2530
-#, c-format
-msgid "line %<PRId64> of %<PRId64> --%d%%-- col "
-msgstr "%<PRId64> / %<PRId64> มู --%d%%-- ฤญ "
-
-#: ../buffer.c:2632 ../buffer.c:4292 ../memline.c:1554
-msgid "[No Name]"
-msgstr "[ภฬธง พ๘ภฝ]"
-
-#. must be a help buffer
-#: ../buffer.c:2667
-msgid "help"
-msgstr "ตตฟ๒ธป"
-
-#: ../buffer.c:3225 ../screen.c:4883
-msgid "[Help]"
-msgstr "[ตตฟ๒ธป]"
-
-#: ../buffer.c:3254 ../screen.c:4887
-msgid "[Preview]"
-msgstr "[นฬธฎ บธฑโ]"
-
-#: ../buffer.c:3528
-msgid "All"
-msgstr "ธ๐ตฮ"
-
-#: ../buffer.c:3528
-msgid "Bot"
-msgstr "นูดฺ"
-
-#: ../buffer.c:3531
-msgid "Top"
-msgstr "ฒภด๋ฑโ"
-
-#: ../buffer.c:4244
-msgid ""
-"\n"
-"# Buffer list:\n"
-msgstr ""
-"\n"
-"# น๖ฦ ธ๑ทฯ:\n"
-
-#: ../buffer.c:4289
-msgid "[Scratch]"
-msgstr "[Scratch]"
-
-#: ../buffer.c:4529
-msgid ""
-"\n"
-"--- Signs ---"
-msgstr ""
-"\n"
-"--- ฑโศฃ ---"
-
-#: ../buffer.c:4538
-#, c-format
-msgid "Signs for %s:"
-msgstr "%sฟก ด๋วั ฑโศฃ:"
-
-#: ../buffer.c:4543
-#, c-format
-msgid " line=%<PRId64> id=%d name=%s"
-msgstr " มู=%<PRId64> id=%d ภฬธง=%s"
-
-#: ../cursor_shape.c:68
-msgid "E545: Missing colon"
-msgstr "E545: ฤทะภฬ พ๘ฝภดฯดู"
-
-#: ../cursor_shape.c:70 ../cursor_shape.c:94
-msgid "E546: Illegal mode"
-msgstr "E546: ภฬป๓วั ธ๐ตๅ"
-
-#: ../cursor_shape.c:134
-msgid "E548: digit expected"
-msgstr "E548: ผภฺฐก วสฟไวีดฯดู"
-
-#: ../cursor_shape.c:138
-msgid "E549: Illegal percentage"
-msgstr "E549: ภฬป๓วั น้บะภฒ"
-
-#: ../diff.c:146
-#, c-format
-msgid "E96: Can not diff more than %<PRId64> buffers"
-msgstr "E96: %<PRId64>ฐณ ภฬป๓ภว น๖ฦฟก ด๋วุผญดย diffธฆ วา ผ๖ พ๘ฝภดฯดู"
-
-#: ../diff.c:753
-msgid "E810: Cannot read or write temp files"
-msgstr "E810: ภำฝร ฦฤภฯภป ภะฐลณช พต ผ๖ พ๘ฝภดฯดู"
-
-#: ../diff.c:755
-msgid "E97: Cannot create diffs"
-msgstr "E97: diffธฆ ธธต้ ผ๖ พ๘ฝภดฯดู"
-
-#: ../diff.c:966
-msgid "E816: Cannot read patch output"
-msgstr "E816: patch ฐแฐ๚ธฆ ภะภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../diff.c:1220
-msgid "E98: Cannot read diff output"
-msgstr "E98: diff รโทยภป ภะภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../diff.c:2081
-msgid "E99: Current buffer is not in diff mode"
-msgstr "E99: ว๖ภ็ น๖ฦดย diff ป๓ลยฐก พฦดีดฯดู"
-
-#: ../diff.c:2100
-msgid "E793: No other buffer in diff mode is modifiable"
-msgstr "E793: ผ๖มค ฐกดษวั diff ป๓ลย น๖ฦดย พ๘ฝภดฯดู"
-
-#: ../diff.c:2102
-msgid "E100: No other buffer in diff mode"
-msgstr "E100: ดูธฅ น๖ฦม฿ฟก diff ป๓ลยภฮ ฐิ พ๘ฝภดฯดู"
-
-#: ../diff.c:2112
-msgid "E101: More than two buffers in diff mode, don't know which one to use"
-msgstr ""
-"E101: ตฮฐณ ภฬป๓ภว น๖ฦฐก diff ป๓ลยฟฉผญ พ๎ถฒ ฐอภป ฝแพ฿วา ม๖ พห ผ๖ พ๘ฝภดฯดู"
-
-#: ../diff.c:2141
-#, c-format
-msgid "E102: Can't find buffer \"%s\""
-msgstr "E102: \"%s\" น๖ฦธฆ รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../diff.c:2152
-#, c-format
-msgid "E103: Buffer \"%s\" is not in diff mode"
-msgstr "E103: \"%s\" น๖ฦดย diff ป๓ลยฐก พฦดีดฯดู"
-
-#: ../diff.c:2193
-msgid "E787: Buffer changed unexpectedly"
-msgstr "E787: น๖ฦฐก ธ๐ธฃดย ป็ภฬฟก นูฒ๎พ๚ฝภดฯดู"
-
-#: ../digraph.c:1598
-msgid "E104: Escape not allowed in digraph"
-msgstr "E104: digraphฟกดย Escapeภป พต ผ๖ พ๘ฝภดฯดู"
-
-#: ../digraph.c:1760
-msgid "E544: Keymap file not found"
-msgstr "E544: ลฐธส ฦฤภฯภป รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../digraph.c:1785
-msgid "E105: Using :loadkeymap not in a sourced file"
-msgstr "E105: บาทฏต้ภฮ ฦฤภฯฟกผญ :loadkeymapภป ป็ฟ๋วฯม๖ พสพาฝภดฯดู"
-
-#: ../digraph.c:1821
-msgid "E791: Empty keymap entry"
-msgstr "E791: ลฐธส ฟฃฦฎธฎฐก บ๑พ๎ภึภฝ"
-
-#: ../edit.c:82
-msgid " Keyword completion (^N^P)"
-msgstr " ณนธป ฟฯผบ (^N^P)"
-
-#. ctrl_x_mode == 0, ^P/^N compl.
-#: ../edit.c:83
-msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-msgstr " ^X ธ๐ตๅ (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-
-#: ../edit.c:85
-msgid " Whole line completion (^L^N^P)"
-msgstr " ภรผ มู ฟฯผบ (^L^N^P)"
-
-#: ../edit.c:86
-msgid " File name completion (^F^N^P)"
-msgstr " ฦฤภฯ ภฬธง ฟฯผบ (^F^N^P)"
-
-#: ../edit.c:87
-msgid " Tag completion (^]^N^P)"
-msgstr " ลยฑื ฟฯผบ (^]^N^P)"
-
-#: ../edit.c:88
-msgid " Path pattern completion (^N^P)"
-msgstr " ฐๆทฮ ฦะลฯ ฟฯผบ (^N^P)"
-
-#: ../edit.c:89
-msgid " Definition completion (^D^N^P)"
-msgstr " มคภว ฟฯผบ (^D^N^P)"
-
-#: ../edit.c:91
-msgid " Dictionary completion (^K^N^P)"
-msgstr " Dictionary ฟฯผบ (^K^N^P)"
-
-#: ../edit.c:92
-msgid " Thesaurus completion (^T^N^P)"
-msgstr " น้ฐ๚ป็ภ ฟฯผบ (^T^N^P)"
-
-#: ../edit.c:93
-msgid " Command-line completion (^V^N^P)"
-msgstr " ธํทษวเ ฟฯผบ (^V^N^P)"
-
-#: ../edit.c:94
-msgid " User defined completion (^U^N^P)"
-msgstr " ป็ฟ๋ภฺ มคภว ฟฯผบ (^U^N^P)"
-
-#: ../edit.c:95
-msgid " Omni completion (^O^N^P)"
-msgstr " Omni ฟฯผบ (^O^N^P)"
-
-#: ../edit.c:96
-msgid " Spelling suggestion (s^N^P)"
-msgstr " ดพ๎ มฆพศ (s^N^P)"
-
-#: ../edit.c:97
-msgid " Keyword Local completion (^N^P)"
-msgstr " ณนธป ทฮฤร ฟฯผบ (^N^P)"
-
-#: ../edit.c:100
-msgid "Hit end of paragraph"
-msgstr "ดถ๔ภว ธถม๖ธท ธธณฒ"
-
-#: ../edit.c:101
-msgid "E839: Completion function changed window"
-msgstr "E839: Completion ฑโดษภฬ รขภป นูฒูพ๚ฝภดฯดู"
-
-#: ../edit.c:102
-msgid "E840: Completion function deleted text"
-msgstr "E840: Completion ฑโดษภฬ นฎภฺฟญภป ม๖ฟฝภดฯดู"
-
-#: ../edit.c:1847
-msgid "'dictionary' option is empty"
-msgstr "'dictionary' ฟษผวภฬ บ๑พ๚ฝภดฯดู"
-
-#: ../edit.c:1848
-msgid "'thesaurus' option is empty"
-msgstr "'thesaurus' ฟษผวภฬ บ๑พ๚ฝภดฯดู"
-
-#: ../edit.c:2655
-#, c-format
-msgid "Scanning dictionary: %s"
-msgstr "ป็ภ รฃดย ม฿: %s"
-
-#: ../edit.c:3079
-msgid " (insert) Scroll (^E/^Y)"
-msgstr " (ณขฟ๖ณึฑโ) ฝบลฉทั (^E/^Y)"
-
-#: ../edit.c:3081
-msgid " (replace) Scroll (^E/^Y)"
-msgstr " (นูฒ) ฝบลฉทั (^E/^Y)"
-
-#: ../edit.c:3587
-#, c-format
-msgid "Scanning: %s"
-msgstr "รฃดย ม฿: %s"
-
-#: ../edit.c:3614
-msgid "Scanning tags."
-msgstr "ลยฑื รฃดย ม฿."
-
-#: ../edit.c:4519
-msgid " Adding"
-msgstr " ด๕วฯฑโ"
-
-#. showmode might reset the internal line pointers, so it must
-#. * be called before line = ml_get(), or when this address is no
-#. * longer needed. -- Acevedo.
-#.
-#: ../edit.c:4562
-msgid "-- Searching..."
-msgstr "-- รฃดย ม฿..."
-
-#: ../edit.c:4618
-msgid "Back at original"
-msgstr "ฟ๘ทกด๋ทฮ บนฑธ"
-
-#: ../edit.c:4621
-msgid "Word from other line"
-msgstr "ดูธฅ มูฟก ณนธป"
-
-#: ../edit.c:4624
-msgid "The only match"
-msgstr "The only match"
-
-#: ../edit.c:4680
-#, c-format
-msgid "match %d of %d"
-msgstr "match %d of %d"
-
-#: ../edit.c:4684
-#, c-format
-msgid "match %d"
-msgstr "match %d"
-
-#: ../eval.c:137
-msgid "E18: Unexpected characters in :let"
-msgstr "E18: ':let'ฟก ธ๐ธฃดย ฑภฺ"
-
-#: ../eval.c:138
-#, c-format
-msgid "E684: list index out of range: %<PRId64>"
-msgstr "E684: ธ๑ทฯ น๘ศฃฐก นภงธฆ นพ๎ณฒ: %<PRId64>"
-
-#: ../eval.c:139
-#, c-format
-msgid "E121: Undefined variable: %s"
-msgstr "E121: มคภว พศ ตศ บฏผ๖: %s"
-
-#: ../eval.c:140
-msgid "E111: Missing ']'"
-msgstr "E111: ']'ภฬ พ๘ฝภดฯดู"
-
-#: ../eval.c:141
-#, c-format
-msgid "E686: Argument of %s must be a List"
-msgstr "E686: %s ภฮภฺดย Listภฬพ๎พ฿ วีดฯดู"
-
-#: ../eval.c:143
-#, c-format
-msgid "E712: Argument of %s must be a List or Dictionary"
-msgstr "E712: %s ภฮภฺดย List ศคภบ Dictionaryฟฉพ฿ วีดฯดู"
-
-#: ../eval.c:144
-msgid "E713: Cannot use empty key for Dictionary"
-msgstr "E713: Dictionaryฟก บ๓ ลฐธฆ พต ผ๖ พ๘ฝภดฯดู"
-
-#: ../eval.c:145
-msgid "E714: List required"
-msgstr "E714: Listฐก วสฟไวีดฯดู"
-
-#: ../eval.c:146
-msgid "E715: Dictionary required"
-msgstr "E715: Dictionaryฐก วสฟไวีดฯดู"
-
-#: ../eval.c:147
-#, c-format
-msgid "E118: Too many arguments for function: %s"
-msgstr "E118: วิผ๖ฟก ณสนซ ธนภบ ภฮภฺ ณัฑ่: %s"
-
-#: ../eval.c:148
-#, c-format
-msgid "E716: Key not present in Dictionary: %s"
-msgstr "E716: Dictionaryฟก ลฐฐก พ๘ภฝ: %s"
-
-#: ../eval.c:150
-#, c-format
-msgid "E122: Function %s already exists, add ! to replace it"
-msgstr "E122: วิผ๖ %sภฬ(ฐก) ภฬนฬ ภึฝภดฯดู, นูฒูทมธ้ !ภป ด๕วฯผผฟไ"
-
-#: ../eval.c:151
-msgid "E717: Dictionary entry already exists"
-msgstr "E717: ภฬนฬ Dictionary วืธ๑ภฬ ภึฝภดฯดู"
-
-#: ../eval.c:152
-msgid "E718: Funcref required"
-msgstr "E718: Funcrefฐก วสฟไวีดฯดู"
-
-#: ../eval.c:153
-msgid "E719: Cannot use [:] with a Dictionary"
-msgstr "E719: Dictionaryฟก [:]ภป ป็ฟ๋วา ผ๖ พ๘ฝภดฯดู"
-
-#: ../eval.c:154
-#, c-format
-msgid "E734: Wrong variable type for %s="
-msgstr "E734: %s=ฟก ด๋วั ภ฿ธ๘ตศ บฏผ๖ว"
-
-#: ../eval.c:155
-#, c-format
-msgid "E130: Unknown function: %s"
-msgstr "E130: ธ๐ธฃดย วิผ๖: %s"
-
-#: ../eval.c:156
-#, c-format
-msgid "E461: Illegal variable name: %s"
-msgstr "E461: บ๑มคป๓ภ๛ภฮ บฏผ๖ ธํ: %s"
-
-#: ../eval.c:157
-msgid "E806: using Float as a String"
-msgstr "E806: Floatธฆ Stringภธทฮ ป็ฟ๋"
-
-#: ../eval.c:1830
-msgid "E687: Less targets than List items"
-msgstr "E687: List วืธ๑บธดู ภ๛ภบ ด๋ป๓"
-
-#: ../eval.c:1834
-msgid "E688: More targets than List items"
-msgstr "E688: List วืธ๑บธดู ธนภบ ด๋ป๓"
-
-#: ../eval.c:1906
-msgid "Double ; in list of variables"
-msgstr "บฏผ๖ ธ๑ทฯฟก ม฿บนตศ ;"
-
-#: ../eval.c:2078
-#, c-format
-msgid "E738: Can't list variables for %s"
-msgstr "E738: %s บฏผ๖ ธ๑ทฯภป ณชฟญวา ผ๖ พ๘ฝภดฯดู"
-
-#: ../eval.c:2391
-msgid "E689: Can only index a List or Dictionary"
-msgstr "E689: Listณช Dictionaryธธ ป๖ภฮวา ผ๖ ภึฝภดฯดู"
-
-#: ../eval.c:2396
-msgid "E708: [:] must come last"
-msgstr "E708: [:]ภบ ธถม๖ธทฟก ภงฤกวุพ฿ วีดฯดู"
-
-#: ../eval.c:2439
-msgid "E709: [:] requires a List value"
-msgstr "E709: [:]ภบ List ฐชภฬ วสฟไวีดฯดู"
-
-#: ../eval.c:2674
-msgid "E710: List value has more items than target"
-msgstr "E710: List ฐชภฬ ด๋ป๓บธดู ธนภบ วืธ๑ภป ฐกม๖ฐํ ภึฝภดฯดู"
-
-#: ../eval.c:2678
-msgid "E711: List value has not enough items"
-msgstr "E711: List ฐชภฬ รๆบะวั วืธ๑ภป ฐกม๖ฐํ ภึม๖ พสฝภดฯดู"
-
-#: ../eval.c:2867
-msgid "E690: Missing \"in\" after :for"
-msgstr "E690: :for ตฺฟก \"in\"ฐก พ๘ฝภดฯดู"
-
-#: ../eval.c:3063
-#, c-format
-msgid "E107: Missing parentheses: %s"
-msgstr "E107: ฐศฃ พ๘ภฝ: %s"
-
-#: ../eval.c:3263
-#, c-format
-msgid "E108: No such variable: \"%s\""
-msgstr "E108: ภฬทฑ บฏผ๖ พ๘ภฝ: \"%s\""
-
-#: ../eval.c:3333
-msgid "E743: variable nested too deep for (un)lock"
-msgstr "E743: ภแฑ(วุมฆ)วฯฑโฟก บฏผ๖ฐก ณสนซ ฑํภฬ ม฿รธตวพ๚ฝภดฯดู"
-
-#: ../eval.c:3630
-msgid "E109: Missing ':' after '?'"
-msgstr "E109: '?' ตฺฟก ':'ภฬ พ๘ฝภดฯดู"
-
-#: ../eval.c:3893
-msgid "E691: Can only compare List with List"
-msgstr "E691: Listดย Listฟอธธ บ๑ฑณวา ผ๖ ภึฝภดฯดู"
-
-#: ../eval.c:3895
-msgid "E692: Invalid operation for Lists"
-msgstr "E692: Listฟก ด๋วั ภ฿ธ๘ตศ ตฟภ"
-
-#: ../eval.c:3915
-msgid "E735: Can only compare Dictionary with Dictionary"
-msgstr "E735: Dictionaryดย Dictionaryฟอธธ บ๑ฑณวา ผ๖ ภึฝภดฯดู"
-
-#: ../eval.c:3917
-msgid "E736: Invalid operation for Dictionary"
-msgstr "E736: Dictionaryฟก ด๋วั ภ฿ธ๘ตศ ตฟภ"
-
-#: ../eval.c:3932
-msgid "E693: Can only compare Funcref with Funcref"
-msgstr "E693: Funcrefดย Funcrefฟอธธ บ๑ฑณวา ผ๖ ภึฝภดฯดู"
-
-#: ../eval.c:3934
-msgid "E694: Invalid operation for Funcrefs"
-msgstr "E694: Funcrefsฟก ด๋วั ภ฿ธ๘ตศ ตฟภ"
-
-#: ../eval.c:4277
-msgid "E804: Cannot use '%' with Float"
-msgstr "E804: Floatฟก '%'ดย ป็ฟ๋วา ผ๖ พ๘ฝภดฯดู"
-
-#: ../eval.c:4478
-msgid "E110: Missing ')'"
-msgstr "E110: ')'ฐก พ๘ฝภดฯดู"
-
-#: ../eval.c:4609
-msgid "E695: Cannot index a Funcref"
-msgstr "E695: Funcrefธฆ ป๖ภฮวา ผ๖ พ๘ฝภดฯดู"
-
-#: ../eval.c:4839
-#, c-format
-msgid "E112: Option name missing: %s"
-msgstr "E112: ฟษผว ภฬธง พ๘ภฝ: %s"
-
-#: ../eval.c:4855
-#, c-format
-msgid "E113: Unknown option: %s"
-msgstr "E113: ธ๐ธฃดย ฟษผว: %s"
-
-#: ../eval.c:4904
-#, c-format
-msgid "E114: Missing quote: %s"
-msgstr "E114: ต๛ฟศวฅ พ๘ภฝ: %s"
-
-#: ../eval.c:5020
-#, c-format
-msgid "E115: Missing quote: %s"
-msgstr "E115: ต๛ฟศวฅ พ๘ภฝ: %s"
-
-#: ../eval.c:5084
-#, c-format
-msgid "E696: Missing comma in List: %s"
-msgstr "E696: Listฟก ฤธถ ดฉถ๔: %s"
-
-#: ../eval.c:5091
-#, c-format
-msgid "E697: Missing end of List ']': %s"
-msgstr "E697: List ณกฟก ']' ดฉถ๔: %s"
-
-#: ../eval.c:6475
-#, c-format
-msgid "E720: Missing colon in Dictionary: %s"
-msgstr "E720: Dictionaryฟก ฤทะ ดฉถ๔: %s"
-
-#: ../eval.c:6499
-#, c-format
-msgid "E721: Duplicate key in Dictionary: \"%s\""
-msgstr "E721: Dictionaryฟก ม฿บนตศ ลฐ: \"%s\""
-
-#: ../eval.c:6517
-#, c-format
-msgid "E722: Missing comma in Dictionary: %s"
-msgstr "E722: Dictionaryฟก ฤธถ ดฉถ๔: %s"
-
-#: ../eval.c:6524
-#, c-format
-msgid "E723: Missing end of Dictionary '}': %s"
-msgstr "E723: Dictionary ณกฟก '}' ดฉถ๔: %s"
-
-#: ../eval.c:6555
-msgid "E724: variable nested too deep for displaying"
-msgstr "E724: บฏผ๖ฐก วฅฝรวฯฑโฟก ณสนซ ฑํภฬ ม฿รธตวพ๚ฝภดฯดู"
-
-#: ../eval.c:7188
-#, c-format
-msgid "E740: Too many arguments for function %s"
-msgstr "E740: วิผ๖ %sฟก ณสนซ ธนภบ ภฮภฺฐก ภดตวพ๚ฝภดฯดู"
-
-#: ../eval.c:7190
-#, c-format
-msgid "E116: Invalid arguments for function %s"
-msgstr "E116: วิผ๖ %s(ภธ)ทฮ ภ฿ธ๘ตศ ภฮภฺฐก ณัฐมณฝภดฯดู"
-
-#: ../eval.c:7377
-#, c-format
-msgid "E117: Unknown function: %s"
-msgstr "E117: ธ๐ธฃดย วิผ๖: %s"
-
-#: ../eval.c:7383
-#, c-format
-msgid "E119: Not enough arguments for function: %s"
-msgstr "E119: วิผ๖ฟก ภ๛ภบ ภฮภฺ ณัฑ่: %s"
-
-#: ../eval.c:7387
-#, c-format
-msgid "E120: Using <SID> not in a script context: %s"
-msgstr "E120: ฝบลฉธณฦฎ ฤลุฝบฦฎ นฟกผญ <SID> ป็ฟ๋: %s"
-
-#: ../eval.c:7391
-#, c-format
-msgid "E725: Calling dict function without Dictionary: %s"
-msgstr "E725: Dictionaryพ๘ภฬ ป็ภวิผ๖ฐก บาทมม: %s"
-
-#: ../eval.c:7453
-msgid "E808: Number or Float required"
-msgstr "E808: Number ศคภบ Floatฐก วสฟไวีดฯดู"
-
-#: ../eval.c:7503
-#, fuzzy
-msgid "add() argument"
-msgstr "-c ภฮภฺ"
-
-#: ../eval.c:7907
-msgid "E699: Too many arguments"
-msgstr "E699: ณสนซ ธนภบ ภฮภฺ"
-
-#: ../eval.c:8073
-msgid "E785: complete() can only be used in Insert mode"
-msgstr "E785: complete()ภบ ภิทย ธ๐ตๅฟกผญธธ ป็ฟ๋ตษ ผ๖ ภึฝภดฯดู"
-
-#: ../eval.c:8156
-msgid "&Ok"
-msgstr "ศฎภฮ(&O)"
-
-#: ../eval.c:8676
-#, c-format
-msgid "E737: Key already exists: %s"
-msgstr "E737: ลฐฐก ภฬนฬ มธภ็วิ: %s"
-
-#: ../eval.c:8692
-#, fuzzy
-msgid "extend() argument"
-msgstr "--cmd ภฮภฺ"
-
-#: ../eval.c:8915
-#, fuzzy
-msgid "map() argument"
-msgstr "-c ภฮภฺ"
-
-#: ../eval.c:8916
-#, fuzzy
-msgid "filter() argument"
-msgstr "-c ภฮภฺ"
-
-#: ../eval.c:9229
-#, c-format
-msgid "+-%s%3ld lines: "
-msgstr "+-%s%3ld มู: "
-
-#: ../eval.c:9291
-#, c-format
-msgid "E700: Unknown function: %s"
-msgstr "E700: ธ๐ธฃดย วิผ๖: %s"
-
-#: ../eval.c:10729
-msgid "called inputrestore() more often than inputsave()"
-msgstr "inputrestore()ฐก inputsave()บธดู ธนภฬ บาทมมณฝภดฯดู"
-
-#: ../eval.c:10771
-#, fuzzy
-msgid "insert() argument"
-msgstr "-c ภฮภฺ"
-
-#: ../eval.c:10841
-msgid "E786: Range not allowed"
-msgstr "E786: นภงฐก วใฟ๋ตวม๖ พสฝภดฯดู"
-
-#: ../eval.c:11140
-msgid "E701: Invalid type for len()"
-msgstr "E701: len()ฟก ภ฿ธ๘ตศ ว"
-
-#: ../eval.c:11980
-msgid "E726: Stride is zero"
-msgstr "E726: Strideฐก 0"
-
-#: ../eval.c:11982
-msgid "E727: Start past end"
-msgstr "E727: ฝรภภงฤกฐก ณกภป ม๖ณชฤง"
-
-#: ../eval.c:12024 ../eval.c:15297
-msgid "<empty>"
-msgstr "<บ๑พ๎ภึภฝ>"
-
-#: ../eval.c:12282
-#, fuzzy
-msgid "remove() argument"
-msgstr "--cmd ภฮภฺ"
-
-#: ../eval.c:12466
-msgid "E655: Too many symbolic links (cycle?)"
-msgstr "E655: ณสนซ ธนภบ ฝษบผธฏ ธตลฉ (นบนผ๘ศฏ?)"
-
-#: ../eval.c:12593
-#, fuzzy
-msgid "reverse() argument"
-msgstr "-c ภฮภฺ"
-
-#: ../eval.c:13721
-#, fuzzy
-msgid "sort() argument"
-msgstr "-c ภฮภฺ"
-
-#: ../eval.c:13721
-#, fuzzy
-msgid "uniq() argument"
-msgstr "-c ภฮภฺ"
-
-#: ../eval.c:13776
-msgid "E702: Sort compare function failed"
-msgstr "E702: มคทฤ บ๑ฑณ ฑโดษภฬ ฝวฦะว฿ฝภดฯดู"
-
-#: ../eval.c:13806
-#, fuzzy
-msgid "E882: Uniq compare function failed"
-msgstr "E702: มคทฤ บ๑ฑณ ฑโดษภฬ ฝวฦะว฿ฝภดฯดู"
-
-#: ../eval.c:14085
-msgid "(Invalid)"
-msgstr "(ภ฿ธ๘ตวพ๚ฝภดฯดู)"
-
-#: ../eval.c:14590
-msgid "E677: Error writing temp file"
-msgstr "E677: ภำฝร ฦฤภฯ พฒฑโ ฟกทฏ"
-
-#: ../eval.c:16159
-msgid "E805: Using a Float as a Number"
-msgstr "E805: Floatธฆ Numberทฮ ป็ฟ๋"
-
-#: ../eval.c:16162
-msgid "E703: Using a Funcref as a Number"
-msgstr "E703: Funcrefธฆ Numberทฮ ป็ฟ๋"
-
-#: ../eval.c:16170
-msgid "E745: Using a List as a Number"
-msgstr "E745: Listธฆ Numberทฮ ป็ฟ๋"
-
-#: ../eval.c:16173
-msgid "E728: Using a Dictionary as a Number"
-msgstr "E728: Dictionaryธฆ Numberทฮ ป็ฟ๋"
-
-#: ../eval.c:16259
-msgid "E729: using Funcref as a String"
-msgstr "E729: Funcrefธฆ Stringภธทฮ ป็ฟ๋"
-
-#: ../eval.c:16262
-msgid "E730: using List as a String"
-msgstr "E730: Listธฆ Stringภธทฮ ป็ฟ๋"
-
-#: ../eval.c:16265
-msgid "E731: using Dictionary as a String"
-msgstr "E731: Dictionaryธฆ Stringภธทฮ ป็ฟ๋"
-
-#: ../eval.c:16619
-#, c-format
-msgid "E706: Variable type mismatch for: %s"
-msgstr "E706: บฏผ๖ ว ดูธง: %s"
-
-#: ../eval.c:16705
-#, c-format
-msgid "E795: Cannot delete variable %s"
-msgstr "E795: บฏผ๖ %sธฆ ป่มฆวา ผ๖ พ๘ฝภดฯดู"
-
-#: ../eval.c:16724
-#, c-format
-msgid "E704: Funcref variable name must start with a capital: %s"
-msgstr "E704: Funcref บฏผ๖ธํภบ ด๋นฎภฺทฮ ฝรภวุพ฿ วิ: %s"
-
-#: ../eval.c:16732
-#, c-format
-msgid "E705: Variable name conflicts with existing function: %s"
-msgstr "E705: บฏผ๖ธํภฬ ภฬนฬ ภึดย วิผ๖ธํฐ๚ รๆตน: %s"
-
-#: ../eval.c:16763
-#, c-format
-msgid "E741: Value is locked: %s"
-msgstr "E741: ฐชภฬ ภแฐภึภฝ: %s"
-
-#: ../eval.c:16764 ../eval.c:16769 ../message.c:1839
-msgid "Unknown"
-msgstr "ธ๐ธง"
-
-#: ../eval.c:16768
-#, c-format
-msgid "E742: Cannot change value of %s"
-msgstr "E742: %s ฐชภป นูฒ ผ๖ พ๘ฝภดฯดู"
-
-#: ../eval.c:16838
-msgid "E698: variable nested too deep for making a copy"
-msgstr "E698: บนป็วฯฑโฟก บฏผ๖ฐก ณสนซ ฑํฐิ ม฿รธตวพ๚ฝภดฯดู"
-
-#: ../eval.c:17249
-#, c-format
-msgid "E123: Undefined function: %s"
-msgstr "E123: มคภว พศ ตศ วิผ๖: %s"
-
-#: ../eval.c:17260
-#, c-format
-msgid "E124: Missing '(': %s"
-msgstr "E124: '('ฐก พ๘ภฝ: %s"
-
-#: ../eval.c:17293
-#, fuzzy
-msgid "E862: Cannot use g: here"
-msgstr "E284: IC ฐชภป ผณมควา ผ๖ พ๘ฝภดฯดู"
-
-#: ../eval.c:17312
-#, c-format
-msgid "E125: Illegal argument: %s"
-msgstr "E125: ภ฿ธ๘ตศ ภฮภฺ: %s"
-
-#: ../eval.c:17323
-#, fuzzy, c-format
-msgid "E853: Duplicate argument name: %s"
-msgstr "ม฿บนตศ วสตๅ ธํ: %s"
-
-#: ../eval.c:17416
-msgid "E126: Missing :endfunction"
-msgstr "E126: :endfunctionภฬ พ๘ฝภดฯดู"
-
-#: ../eval.c:17537
-#, c-format
-msgid "E707: Function name conflicts with variable: %s"
-msgstr "E707: วิผ๖ธํภฬ บฏผ๖ธํฐ๚ รๆตน: %s"
-
-#: ../eval.c:17549
-#, c-format
-msgid "E127: Cannot redefine function %s: It is in use"
-msgstr "E127: วิผ๖ %sภป(ธฆ) ดูฝร มคภววา ผ๖ พ๘ฝภดฯดู: ป็ฟ๋ม฿ภิดฯดู"
-
-#: ../eval.c:17604
-#, c-format
-msgid "E746: Function name does not match script file name: %s"
-msgstr "E746: วิผ๖ธํภฬ ฝบลฉธณฦฎ ฦฤภฯธํฐ๚ ดูธง: %s"
-
-#: ../eval.c:17716
-msgid "E129: Function name required"
-msgstr "E129: วิผ๖ ภฬธงภฬ วสฟไวีดฯดู"
-
-#: ../eval.c:17824
-#, fuzzy, c-format
-msgid "E128: Function name must start with a capital or \"s:\": %s"
-msgstr "E128: วิผ๖ ภฬธงภบ ด๋นฎภฺทฮ ฝรภวฯฐลณช ฤทะภป ฦ๗วิวุพ฿ วิ: %s"
-
-#: ../eval.c:17833
-#, fuzzy, c-format
-msgid "E884: Function name cannot contain a colon: %s"
-msgstr "E128: วิผ๖ ภฬธงภบ ด๋นฎภฺทฮ ฝรภวฯฐลณช ฤทะภป ฦ๗วิวุพ฿ วิ: %s"
-
-#: ../eval.c:18336
-#, c-format
-msgid "E131: Cannot delete function %s: It is in use"
-msgstr "E131: วิผ๖ %sภป(ธฆ) ม๖ฟ๏ ผ๖ พ๘ฝภดฯดู: ป็ฟ๋ม฿ภิดฯดู"
-
-#: ../eval.c:18441
-msgid "E132: Function call depth is higher than 'maxfuncdepth'"
-msgstr "E132: วิผ๖ธฆ บฮธฅ ฑํภฬฐก 'maxfuncdepth'บธดู ลฎดฯดู"
-
-#: ../eval.c:18568
-#, c-format
-msgid "calling %s"
-msgstr "%s บฮธฃดย ม฿"
-
-#: ../eval.c:18651
-#, c-format
-msgid "%s aborted"
-msgstr "%sภฬ(ฐก) ม฿ม๖ตวพ๚ฝภดฯดู"
-
-#: ../eval.c:18653
-#, c-format
-msgid "%s returning #%<PRId64>"
-msgstr "%sภฬ(ฐก) #%<PRId64>ภป(ธฆ) ตนทมมึพ๚ฝภดฯดู"
-
-#: ../eval.c:18670
-#, c-format
-msgid "%s returning %s"
-msgstr "%sภฬ(ฐก) %sภป(ธฆ) ตนทมมึพ๚ฝภดฯดู"
-
-#: ../eval.c:18691 ../ex_cmds2.c:2695
-#, c-format
-msgid "continuing in %s"
-msgstr "%sฟกผญ ฐ่ผำ"
-
-#: ../eval.c:18795
-msgid "E133: :return not inside a function"
-msgstr "E133: :returnภฬ วิผ๖ พศฟก ภึม๖ พสฝภดฯดู"
-
-#: ../eval.c:19159
-msgid ""
-"\n"
-"# global variables:\n"
-msgstr ""
-"\n"
-"# ภฟช บฏผ๖:\n"
-
-#: ../eval.c:19254
-msgid ""
-"\n"
-"\tLast set from "
-msgstr ""
-"\n"
-"\tLast set from "
-
-#: ../eval.c:19272
-msgid "No old files"
-msgstr "old ฦฤภฯภฬ พ๘ฝภดฯดู"
-
-#: ../ex_cmds.c:122
-#, c-format
-msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
-msgstr "<%s>%s%s %d, ฝสภฐม๘ %02x, ฦศม๘ %03o"
-
-#: ../ex_cmds.c:145
-#, c-format
-msgid "> %d, Hex %04x, Octal %o"
-msgstr "> %d, ฝสภฐม๘ %04x, ฦศม๘ %o"
-
-#: ../ex_cmds.c:146
-#, c-format
-msgid "> %d, Hex %08x, Octal %o"
-msgstr "> %d, ฝสภฐม๘ %08x, ฦศม๘ %o"
-
-#: ../ex_cmds.c:684
-msgid "E134: Move lines into themselves"
-msgstr "E134: มูภป ฑื ภฺฝลภธทฮ ภฬตฟวฯทมฐํ ว฿ฝภดฯดู"
-
-#: ../ex_cmds.c:747
-msgid "1 line moved"
-msgstr "1 มู ฟลฐมณฝภดฯดู"
-
-#: ../ex_cmds.c:749
-#, c-format
-msgid "%<PRId64> lines moved"
-msgstr "%<PRId64> มู ฟลฐมณฝภดฯดู"
-
-#: ../ex_cmds.c:1175
-#, c-format
-msgid "%<PRId64> lines filtered"
-msgstr "%<PRId64> มูภป ฐษทถฝภดฯดู"
-
-#: ../ex_cmds.c:1194
-msgid "E135: *Filter* Autocommands must not change current buffer"
-msgstr "E135: *Filter* ภฺตฟธํทษภบ ว๖ภ็ น๖ฦธฆ นูฒูพ๎ผญดย พศ ตหดฯดู"
-
-#: ../ex_cmds.c:1244
-msgid "[No write since last change]\n"
-msgstr "[ธถม๖ธทภธทฮ ฐํฤฃ ตฺ ภ๚ภๅ พศ วิ]\n"
-
-#: ../ex_cmds.c:1424
-#, c-format
-msgid "%sviminfo: %s in line: "
-msgstr "%sviminfo: มูฟก %s: "
-
-#: ../ex_cmds.c:1431
-msgid "E136: viminfo: Too many errors, skipping rest of file"
-msgstr "E136: viminfo: ณสนซ ธนภบ ฟกทฏ, ณชธำม๖ ฐวณสถ"
-
-#: ../ex_cmds.c:1458
-#, c-format
-msgid "Reading viminfo file \"%s\"%s%s%s"
-msgstr "viminfo ฦฤภฯ \"%s\"%s%s%sภป(ธฆ) ภะดย ม฿"
-
-#: ../ex_cmds.c:1460
-msgid " info"
-msgstr " ภฮฦ๗"
-
-#: ../ex_cmds.c:1461
-msgid " marks"
-msgstr " ธถลฉ"
-
-#: ../ex_cmds.c:1462
-msgid " oldfiles"
-msgstr ""
-
-#: ../ex_cmds.c:1463
-msgid " FAILED"
-msgstr " ฝวฦะ"
-
-#. avoid a wait_return for this message, it's annoying
-#: ../ex_cmds.c:1541
-#, c-format
-msgid "E137: Viminfo file is not writable: %s"
-msgstr "E137: Viminfo ฦฤภฯภว พฒฑโ ฑววัภฬ พ๘ฝภดฯดู: %s"
-
-#: ../ex_cmds.c:1626
-#, c-format
-msgid "E138: Can't write viminfo file %s!"
-msgstr "E138: Viminfo ฦฤภฯ %sภป(ธฆ) พต ผ๖ พ๘ฝภดฯดู!"
-
-#: ../ex_cmds.c:1635
-#, c-format
-msgid "Writing viminfo file \"%s\""
-msgstr "Viminfo ฦฤภฯ \"%s\"ภป(ธฆ) พฒดย ม฿"
-
-#. Write the info:
-#: ../ex_cmds.c:1720
-#, c-format
-msgid "# This viminfo file was generated by Vim %s.\n"
-msgstr "# ภฬ viminfo ฦฤภฯภบ บ๖ภฬ ธธต็ ฐอภิดฯดู Vim %s.\n"
-
-#: ../ex_cmds.c:1722
-msgid ""
-"# You may edit it if you're careful!\n"
-"\n"
-msgstr ""
-"# มถฝษธธ วัดูธ้ ฐํฤฅ ผ๖ตต ภึฝภดฯดู!\n"
-"\n"
-
-#: ../ex_cmds.c:1723
-msgid "# Value of 'encoding' when this file was written\n"
-msgstr "# ภฬ ฦฤภฯภฬ ภ๚ภๅตวพ๚ภป ถงภว 'encoding'ภว ฐช\n"
-
-#: ../ex_cmds.c:1800
-msgid "Illegal starting char"
-msgstr "ภฬป๓วั ฝรภ ฑภฺ"
-
-#: ../ex_cmds.c:2162
-msgid "Write partial file?"
-msgstr "ฦฤภฯ ภฯบฮธธ ภ๚ภๅวาฑ๎ฟไ?"
-
-#: ../ex_cmds.c:2166
-msgid "E140: Use ! to write partial buffer"
-msgstr "E140: น๖ฦ ภฯบฮธธ พฒทมธ้ !ภป ป็ฟ๋วฯฝสฝรฟภ"
-
-#: ../ex_cmds.c:2281
-#, c-format
-msgid "Overwrite existing file \"%s\"?"
-msgstr "ภฬนฬ ภึดย \"%s\" ฦฤภฯภป ตคพ๎พตฑ๎ฟไ?"
-
-#: ../ex_cmds.c:2317
-#, c-format
-msgid "Swap file \"%s\" exists, overwrite anyway?"
-msgstr "ฝบฟา ฦฤภฯ \"%s\"ฐก ภึฝภดฯดู, ตคพ๎พตฑ๎ฟไ?"
-
-#: ../ex_cmds.c:2326
-#, c-format
-msgid "E768: Swap file exists: %s (:silent! overrides)"
-msgstr "E768: ฝบฟา ฦฤภฯ ภึภฝ: %s (ตคพ๎พฒทมธ้ :silent! ป็ฟ๋)"
-
-#: ../ex_cmds.c:2381
-#, c-format
-msgid "E141: No file name for buffer %<PRId64>"
-msgstr "E141: น๖ฦ %<PRId64>ภว ฦฤภฯ ภฬธงภฬ พ๘ฝภดฯดู"
-
-#: ../ex_cmds.c:2412
-msgid "E142: File not written: Writing is disabled by 'write' option"
-msgstr "E142: ฦฤภฯภฬ ฝแม๖ม๖ พสภฝ: 'write' ฟษผวฟก ภววุ พต ผ๖ฐก พ๘ฝภดฯดู"
-
-#: ../ex_cmds.c:2434
-#, c-format
-msgid ""
-"'readonly' option is set for \"%s\".\n"
-"Do you wish to write anyway?"
-msgstr ""
-"'readonly' ฟษผวภฬ \"%s\"ฟก ด๋วุ ผณมคตวพ๎ ภึฝภดฯดู.\n"
-"ฑืทกตต พฒฑโธฆ ฟ๘วฯฝสดฯฑ๎?"
-
-#: ../ex_cmds.c:2439
-#, c-format
-msgid ""
-"File permissions of \"%s\" are read-only.\n"
-"It may still be possible to write it.\n"
-"Do you wish to try?"
-msgstr ""
-"ฦฤภฯ \"%s\"ฐก ภะฑโภฟ๋ภิดฯดู.\n"
-"ฑืทกตต พฒฑโฐก ฐกดษวา ม๖ตต ธ๐ธจดฯดู.\n"
-"วั น๘ ฝแ บผฑ๎ฟไ?"
-
-#: ../ex_cmds.c:2451
-#, c-format
-msgid "E505: \"%s\" is read-only (add ! to override)"
-msgstr "E505: \"%s\"ดย ภะฑโ ภฟ๋ภิดฯดู (ตคพ๎พฒทมธ้ ! ด๕วฯฑโ)"
-
-#: ../ex_cmds.c:3120
-#, c-format
-msgid "E143: Autocommands unexpectedly deleted new buffer %s"
-msgstr "E143: Autocommandฐก ถๆ นฟก ป๕ น๖ฦ %sภป(ธฆ) ม๖ฟฝภดฯดู"
-
-#: ../ex_cmds.c:3313
-msgid "E144: non-numeric argument to :z"
-msgstr "E144: ผภฺฐก พฦดั ภฮภฺฐก :zฟก มึพ๎มณฝภดฯดู"
-
-#: ../ex_cmds.c:3404
-msgid "E145: Shell commands not allowed in rvim"
-msgstr "E145: rvimฟกผญดย ฝฉ ธํทษภป ป็ฟ๋วา ผ๖ พ๘ฝภดฯดู"
-
-#: ../ex_cmds.c:3498
-msgid "E146: Regular expressions can't be delimited by letters"
-msgstr "E146: มคฑิวฅว๖ฝฤภบ ฑภฺทฮ ฑธบะตษ ผ๖ พ๘ฝภดฯดู"
-
-#: ../ex_cmds.c:3964
-#, c-format
-msgid "replace with %s (y/n/a/q/l/^E/^Y)?"
-msgstr "%s(ภธ)ทฮ นูฒ (y/n/a/q/l/^E/^Y)?"
-
-#: ../ex_cmds.c:4379
-msgid "(Interrupted) "
-msgstr "(ม฿ดตวพ๚ฝภดฯดู) "
-
-#: ../ex_cmds.c:4384
-msgid "1 match"
-msgstr "1ฐณ รฃพฦม"
-
-#: ../ex_cmds.c:4384
-msgid "1 substitution"
-msgstr "1ฐณ นูฒๅภฝ"
-
-#: ../ex_cmds.c:4387
-#, c-format
-msgid "%<PRId64> matches"
-msgstr "%<PRId64>ฐณ รฃพฦม"
-
-#: ../ex_cmds.c:4388
-#, c-format
-msgid "%<PRId64> substitutions"
-msgstr "%<PRId64>ฐณ นูฒๅภฝ"
-
-#: ../ex_cmds.c:4392
-msgid " on 1 line"
-msgstr " วั มูฟกผญ"
-
-#: ../ex_cmds.c:4395
-#, c-format
-msgid " on %<PRId64> lines"
-msgstr " %<PRId64> มูฟกผญ"
-
-#: ../ex_cmds.c:4438
-msgid "E147: Cannot do :global recursive"
-msgstr "E147: :globalภบ ภ็ฑอ ศฃรโ ตษ ผ๖ พ๘ฝภดฯดู"
-
-#: ../ex_cmds.c:4467
-msgid "E148: Regular expression missing from global"
-msgstr "E148: globalฟกผญ มคฑิวฅว๖ฝฤภฬ บมณฝภดฯดู"
-
-#: ../ex_cmds.c:4508
-#, c-format
-msgid "Pattern found in every line: %s"
-msgstr "ฟฉทฏ มูฟกผญ ฦะลฯภป รฃพาฝภดฯดู: %s"
-
-#: ../ex_cmds.c:4510
-#, fuzzy, c-format
-msgid "Pattern not found: %s"
-msgstr "ฦะลฯภป รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../ex_cmds.c:4587
-msgid ""
-"\n"
-"# Last Substitute String:\n"
-"$"
-msgstr ""
-"\n"
-"# ธถม๖ธทภธทฮ นูฒ นฎภฺฟญ:\n"
-"$"
-
-#: ../ex_cmds.c:4679
-msgid "E478: Don't panic!"
-msgstr "E478: ด็ศฒวฯม๖ ธถฝสฝรฟภ!"
-
-#: ../ex_cmds.c:4717
-#, c-format
-msgid "E661: Sorry, no '%s' help for %s"
-msgstr "E661: นฬพศวีดฯดู, ตตฟ๒ธป '%s'ภฬ(ฐก) %sฟก ด๋วุ พ๘ฝภดฯดู"
-
-#: ../ex_cmds.c:4719
-#, c-format
-msgid "E149: Sorry, no help for %s"
-msgstr "E149: นฬพศวีดฯดู, %sฟก ด๋วั ตตฟ๒ธปภฬ พ๘ฝภดฯดู"
-
-#: ../ex_cmds.c:4751
-#, c-format
-msgid "Sorry, help file \"%s\" not found"
-msgstr "นฬพศวีดฯดู, ตตฟ๒ธป ฦฤภฯ \"%s\"ภป(ธฆ) รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../ex_cmds.c:5323
-#, c-format
-msgid "E150: Not a directory: %s"
-msgstr "E150: ต๐ทบลไธฎฐก พฦดิ: %s"
-
-#: ../ex_cmds.c:5446
-#, c-format
-msgid "E152: Cannot open %s for writing"
-msgstr "E152: พฒฑโ ภงวั %sภป(ธฆ) ฟญ ผ๖ พ๘ฝภดฯดู"
-
-#: ../ex_cmds.c:5471
-#, c-format
-msgid "E153: Unable to open %s for reading"
-msgstr "E153: ภะฑโ ภงวั %sภป(ธฆ) ฟญ ผ๖ พ๘ฝภดฯดู"
-
-#: ../ex_cmds.c:5500
-#, c-format
-msgid "E670: Mix of help file encodings within a language: %s"
-msgstr "E670: วั พ๐พ๎ณปฟกผญ ฟฉทฏ ภฮฤฺต๙ ป็ฟ๋: %s"
-
-#: ../ex_cmds.c:5565
-#, c-format
-msgid "E154: Duplicate tag \"%s\" in file %s/%s"
-msgstr "E154: \"%s\" ลยฑืฐก %s/%s ฦฤภฯฟกผญ ม฿บนตวพ๚ฝภดฯดู"
-
-#: ../ex_cmds.c:5687
-#, c-format
-msgid "E160: Unknown sign command: %s"
-msgstr "E160: ธ๐ธฃดย sign ธํทษ: %s"
-
-#: ../ex_cmds.c:5704
-msgid "E156: Missing sign name"
-msgstr "E156: sign ภฬธงภฬ พ๘ฝภดฯดู"
-
-#: ../ex_cmds.c:5746
-msgid "E612: Too many signs defined"
-msgstr "E612: ณสนซ ธนภบ signภฬ มคภวตวพ๎ ภึฝภดฯดู"
-
-#: ../ex_cmds.c:5813
-#, c-format
-msgid "E239: Invalid sign text: %s"
-msgstr "E239: ภ฿ธ๘ตศ sign ลุฝบฦฎ: %s"
-
-#: ../ex_cmds.c:5844 ../ex_cmds.c:6035
-#, c-format
-msgid "E155: Unknown sign: %s"
-msgstr "E155: ธ๐ธฃดย sign: %s"
-
-#: ../ex_cmds.c:5877
-msgid "E159: Missing sign number"
-msgstr "E159: sign น๘ศฃฐก พ๘ฝภดฯดู"
-
-#: ../ex_cmds.c:5971
-#, c-format
-msgid "E158: Invalid buffer name: %s"
-msgstr "E158: ภ฿ธ๘ตศ น๖ฦ ภฬธง: %s"
-
-#: ../ex_cmds.c:6008
-#, c-format
-msgid "E157: Invalid sign ID: %<PRId64>"
-msgstr "E157: ภ฿ธ๘ตศ sign ID: %<PRId64>"
-
-#: ../ex_cmds.c:6066
-msgid " (not supported)"
-msgstr " (ม๖ฟ๘ตวม๖ พสภฝ)"
-
-#: ../ex_cmds.c:6169
-msgid "[Deleted]"
-msgstr "[ม๖ฟ๖มณฝภดฯดู]"
-
-#: ../ex_cmds2.c:139
-msgid "Entering Debug mode. Type \"cont\" to continue."
-msgstr "ต๐น๖ฑื ป๓ลยทฮ ต้พ๎ฐจ. ฐ่ผำวฯทมธ้ \"cont\"ธฆ ภิทยวฯฝสฝรฟภ."
-
-#: ../ex_cmds2.c:143 ../ex_docmd.c:759
-#, c-format
-msgid "line %<PRId64>: %s"
-msgstr "%<PRId64> มู: %s"
-
-#: ../ex_cmds2.c:145
-#, c-format
-msgid "cmd: %s"
-msgstr "ธํทษ: %s"
-
-#: ../ex_cmds2.c:322
-#, c-format
-msgid "Breakpoint in \"%s%s\" line %<PRId64>"
-msgstr "ม฿ม๖มก: \"%s%s\" %<PRId64> มู"
-
-#: ../ex_cmds2.c:581
-#, c-format
-msgid "E161: Breakpoint not found: %s"
-msgstr "E161: ม฿ม๖มกภป รฃภป ผ๖ พ๘ฝภดฯดู: %s"
-
-#: ../ex_cmds2.c:611
-msgid "No breakpoints defined"
-msgstr "ม฿ม๖มกภฬ มคภวตวพ๎ ภึม๖ พสฝภดฯดู"
-
-#: ../ex_cmds2.c:617
-#, c-format
-msgid "%3d %s %s line %<PRId64>"
-msgstr "%3d %s %s %<PRId64> มู"
-
-#: ../ex_cmds2.c:942
-msgid "E750: First use \":profile start {fname}\""
-msgstr "E750: ธีภ๚ \":profile start {fname}\"ภป ป็ฟ๋วฯผผฟไ"
-
-#: ../ex_cmds2.c:1269
-#, c-format
-msgid "Save changes to \"%s\"?"
-msgstr "\"%s\"ฟก นูฒ๏ ณปฟ๋ภป ภ๚ภๅวาฑ๎ฟไ?"
-
-#: ../ex_cmds2.c:1271 ../ex_docmd.c:8851
-msgid "Untitled"
-msgstr "มฆธ๑ พ๘ภฝ"
-
-#: ../ex_cmds2.c:1421
-#, c-format
-msgid "E162: No write since last change for buffer \"%s\""
-msgstr "E162: น๖ฦ \"%s\"ฟก ณชม฿ฟก นูฒ๏ ณปฟ๋ภฬ ฝแม๖ม๖ พสพาฝภดฯดู"
-
-#: ../ex_cmds2.c:1480
-msgid "Warning: Entered other buffer unexpectedly (check autocommands)"
-msgstr "ฐๆฐํ: ถๆ นฟก ดูธฅ น๖ฦทฮ ต้พ๎ฐฌฝภดฯดู (autocommandธฆ ศฎภฮวฯฝสฝรฟภ)"
-
-#: ../ex_cmds2.c:1826
-msgid "E163: There is only one file to edit"
-msgstr "E163: ฐํฤฅ ฦฤภฯภฬ วฯณช นฟก พ๘ฝภดฯดู"
-
-#: ../ex_cmds2.c:1828
-msgid "E164: Cannot go before first file"
-msgstr "E164: รน น๘ยฐ ฦฤภฯ ภฬภภธทฮดย ฐฅ ผ๖ พ๘ฝภดฯดู"
-
-#: ../ex_cmds2.c:1830
-msgid "E165: Cannot go beyond last file"
-msgstr "E165: ธถม๖ธท ฦฤภฯ ตฺทฮดย ฐฅ ผ๖ พ๘ฝภดฯดู"
-
-#: ../ex_cmds2.c:2175
-#, c-format
-msgid "E666: compiler not supported: %s"
-msgstr "E666: ฤฤฦฤภฯทฏฐก ม๖ฟ๘ตวม๖ พสภฝ: %s"
-
-#: ../ex_cmds2.c:2257
-#, c-format
-msgid "Searching for \"%s\" in \"%s\""
-msgstr "\"%s\"ภป(ธฆ) \"%s\"ฟกผญ รฃดย ม฿"
-
-#: ../ex_cmds2.c:2284
-#, c-format
-msgid "Searching for \"%s\""
-msgstr "\"%s\"ภป(ธฆ) รฃดย ม฿"
-
-#: ../ex_cmds2.c:2307
-#, c-format
-msgid "not found in 'runtimepath': \"%s\""
-msgstr "'runtimepath'ฟกผญ รฃภป ผ๖ พ๘ภฝ: \"%s\""
-
-#: ../ex_cmds2.c:2472
-#, c-format
-msgid "Cannot source a directory: \"%s\""
-msgstr "ต๐ทบลไธฎดย sourceวา ผ๖ พ๘ภฝ: \"%s\""
-
-#: ../ex_cmds2.c:2518
-#, c-format
-msgid "could not source \"%s\""
-msgstr "\"%s\"ภป(ธฆ) บาทฏ ต้ภฯ ผ๖ พ๘ฝภดฯดู"
-
-#: ../ex_cmds2.c:2520
-#, c-format
-msgid "line %<PRId64>: could not source \"%s\""
-msgstr "%<PRId64> มู: \"%s\"ภป(ธฆ) บาทฏ ต้ภฯ ผ๖ พ๘ฝภดฯดู"
-
-#: ../ex_cmds2.c:2535
-#, c-format
-msgid "sourcing \"%s\""
-msgstr "\"%s\"ภป(ธฆ) บาทฏต้ภฬดย ม฿"
-
-#: ../ex_cmds2.c:2537
-#, c-format
-msgid "line %<PRId64>: sourcing \"%s\""
-msgstr "%<PRId64> มู: \"%s\" บาทฏต้ภฬดย ม฿"
-
-#: ../ex_cmds2.c:2693
-#, c-format
-msgid "finished sourcing %s"
-msgstr "%s บาทฏต้ภฬฑโ ณก"
-
-#: ../ex_cmds2.c:2765
-msgid "modeline"
-msgstr ""
-
-#: ../ex_cmds2.c:2767
-msgid "--cmd argument"
-msgstr "--cmd ภฮภฺ"
-
-#: ../ex_cmds2.c:2769
-msgid "-c argument"
-msgstr "-c ภฮภฺ"
-
-#: ../ex_cmds2.c:2771
-msgid "environment variable"
-msgstr "ศฏฐๆ บฏผ๖"
-
-#: ../ex_cmds2.c:2773
-msgid "error handler"
-msgstr "ฟกทฏ วฺต้ทฏ"
-
-#: ../ex_cmds2.c:3020
-msgid "W15: Warning: Wrong line separator, ^M may be missing"
-msgstr "W15: ฐๆฐํ: ภ฿ธ๘ตศ มู ฑธบะภฺ. ^Mภฬ พ๘ดย ฐอ ฐฐฝภดฯดู"
-
-#: ../ex_cmds2.c:3139
-msgid "E167: :scriptencoding used outside of a sourced file"
-msgstr "E167: :scriptencodingภฬ บาทฏต้ภฮ ฦฤภฯ นฟกผญ ป็ฟ๋ตวพ๚ฝภดฯดู"
-
-#: ../ex_cmds2.c:3166
-msgid "E168: :finish used outside of a sourced file"
-msgstr "E168: :finishฐก บาทฏต้ภฮ ฦฤภฯ นฟกผญ ป็ฟ๋ตวพ๚ฝภดฯดู"
-
-#: ../ex_cmds2.c:3389
-#, c-format
-msgid "Current %slanguage: \"%s\""
-msgstr "ว๖ภ็ %sพ๐พ๎: \"%s\""
-
-#: ../ex_cmds2.c:3404
-#, c-format
-msgid "E197: Cannot set language to \"%s\""
-msgstr "E197: พ๐พ๎ธฆ \"%s\"(ภธ)ทฮ ผณมควา ผ๖ พ๘ฝภดฯดู"
-
-#. don't redisplay the window
-#. don't wait for return
-#: ../ex_docmd.c:387
-msgid "Entering Ex mode. Type \"visual\" to go to Normal mode."
-msgstr "Ex ป๓ลยทฮ ภศฏ. Normal ป๓ลยทฮ ฐกทมธ้ \"visual\"ภป ภิทยวฯฝสฝรฟภ."
-
-#: ../ex_docmd.c:428
-msgid "E501: At end-of-file"
-msgstr "E501: ฦฤภฯภว ธถม๖ธทภิดฯดู"
-
-#: ../ex_docmd.c:513
-msgid "E169: Command too recursive"
-msgstr "E169: ธํทษภฬ ณสนซ ธนภฬ ดูฝร นบนตวพ๚ฝภดฯดู"
-
-#: ../ex_docmd.c:1006
-#, c-format
-msgid "E605: Exception not caught: %s"
-msgstr "E605: ฟนฟฐก น฿ปวฯม๖ พสพาฝภดฯดู: %s"
-
-#: ../ex_docmd.c:1085
-msgid "End of sourced file"
-msgstr "บาทฏต้ภฮ ฦฤภฯภว ธถม๖ธท"
-
-#: ../ex_docmd.c:1086
-msgid "End of function"
-msgstr "วิผ๖ภว ธถม๖ธท"
-
-#: ../ex_docmd.c:1628
-msgid "E464: Ambiguous use of user-defined command"
-msgstr "E464: ป็ฟ๋ภฺ มคภว ธํทษภป ธ๐ศฃวฯฐิ ป็ฟ๋วฯฐํ ภึฝภดฯดู"
-
-#: ../ex_docmd.c:1638
-msgid "E492: Not an editor command"
-msgstr "E492: ฦํมฑโ ธํทษภฬ พฦดีดฯดู"
-
-#: ../ex_docmd.c:1729
-msgid "E493: Backwards range given"
-msgstr "E493: นด๋ ฟตฟชภฬ มึพ๎มณฝภดฯดู"
-
-#: ../ex_docmd.c:1733
-msgid "Backwards range given, OK to swap"
-msgstr "นด๋ ฟตฟชภฬ มึพ๎มณฝภดฯดู, ตฺมภปฑ๎ฟไ"
-
-#. append
-#. typed wrong
-#: ../ex_docmd.c:1787
-msgid "E494: Use w or w>>"
-msgstr "E494: wณช w>>ธฆ ป็ฟ๋วฯฝสฝรฟภ"
-
-#: ../ex_docmd.c:3454
-msgid "E319: The command is not available in this version"
-msgstr "E319: นฬพศวีดฯดู, ฑื ธํทษภบ ว๖ภ็ ฦวฟกผญ ป็ฟ๋วา ผ๖ พ๘ฝภดฯดู"
-
-#: ../ex_docmd.c:3752
-msgid "E172: Only one file name allowed"
-msgstr "E172: ฟภทฮม๖ วฯณชภว ฦฤภฯ ภฬธงธธ ป็ฟ๋ ฐกดษวีดฯดู"
-
-#: ../ex_docmd.c:4238
-msgid "1 more file to edit. Quit anyway?"
-msgstr "ฐํฤฅ ฦฤภฯภฬ วั ฐณ ด๕ ภึฝภดฯดู. ฑืทกตต ณกณพฑ๎ฟไ?"
-
-#: ../ex_docmd.c:4242
-#, c-format
-msgid "%d more files to edit. Quit anyway?"
-msgstr "ฐํฤฅ ฦฤภฯภฬ %d ฐณ ด๕ ภึฝภดฯดู. ฑืทกตต ณกณพฑ๎ฟไ?"
-
-#: ../ex_docmd.c:4248
-msgid "E173: 1 more file to edit"
-msgstr "E173: ฐํฤฅ ฦฤภฯภฬ วั ฐณ ด๕ ภึฝภดฯดู"
-
-#: ../ex_docmd.c:4250
-#, c-format
-msgid "E173: %<PRId64> more files to edit"
-msgstr "E173: ฐํฤฅ ฦฤภฯภฬ %<PRId64> ฐณ ด๕ ภึฝภดฯดู"
-
-#: ../ex_docmd.c:4320
-msgid "E174: Command already exists: add ! to replace it"
-msgstr "E174: ธํทษภฬ ภฬนฬ มธภ็วีดฯดู: นูฒูทมธ้ !ภป ด๕วฯผผฟไ"
-
-#: ../ex_docmd.c:4432
-msgid ""
-"\n"
-" Name Args Range Complete Definition"
-msgstr ""
-"\n"
-" ภฬธง ภฮภฺ นภง ฟฯผบ มคภว"
-
-#: ../ex_docmd.c:4516
-msgid "No user-defined commands found"
-msgstr "ป็ฟ๋ภฺ มคภว ธํทษภป รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../ex_docmd.c:4538
-msgid "E175: No attribute specified"
-msgstr "E175: ธํฝรตศ ผำผบภฬ พ๘ฝภดฯดู"
-
-#: ../ex_docmd.c:4583
-msgid "E176: Invalid number of arguments"
-msgstr "E176: ภ฿ธ๘ตศ ภฮภฺ ฐนผ๖"
-
-#: ../ex_docmd.c:4594
-msgid "E177: Count cannot be specified twice"
-msgstr "E177: ฤซฟ๎ฦฎดย ตฮ น๘ ภฬป๓ ธํฝรตษ ผ๖ พ๘ฝภดฯดู"
-
-#: ../ex_docmd.c:4603
-msgid "E178: Invalid default value for count"
-msgstr "E178: ภ฿ธ๘ตศ ฑโบป ฤซฟ๎ฦฎ ฐช"
-
-#: ../ex_docmd.c:4625
-msgid "E179: argument required for -complete"
-msgstr "E179: -completeฟก ภฮภฺฐก วสฟไวีดฯดู"
-
-#: ../ex_docmd.c:4635
-#, c-format
-msgid "E181: Invalid attribute: %s"
-msgstr "E181: ภ฿ธ๘ตศ ผำผบ: %s"
-
-#: ../ex_docmd.c:4678
-msgid "E182: Invalid command name"
-msgstr "E182: ภ฿ธ๘ตศ ธํทษ ภฬธง"
-
-#: ../ex_docmd.c:4691
-msgid "E183: User defined commands must start with an uppercase letter"
-msgstr "E183: ป็ฟ๋ภฺ มคภว ธํทษภบ ด๋นฎภฺทฮ ฝรภวุพ฿ วีดฯดู"
-
-#: ../ex_docmd.c:4696
-msgid "E841: Reserved name, cannot be used for user defined command"
-msgstr "E841: ฟนพเตศ ภฬธง, ป็ฟ๋ภฺ มคภว ธํทษภธทฮ ป็ฟ๋ตษ ผ๖ พ๘ฝภดฯดู"
-
-#: ../ex_docmd.c:4751
-#, c-format
-msgid "E184: No such user-defined command: %s"
-msgstr "E184: ฑืทฑ ป็ฟ๋ภฺ มคภว ธํทษ พ๘ภฝ: %s"
-
-#: ../ex_docmd.c:5219
-#, c-format
-msgid "E180: Invalid complete value: %s"
-msgstr "E180: ภ฿ธ๘ตศ ณกณปฑโ ฐช: %s"
-
-#: ../ex_docmd.c:5225
-msgid "E468: Completion argument only allowed for custom completion"
-msgstr "E468: ฟฯผบ ภฮภฺดย ป็ฟ๋ภฺ ฟฯผบฟกผญธธ วใฟ๋ตหดฯดู"
-
-#: ../ex_docmd.c:5231
-msgid "E467: Custom completion requires a function argument"
-msgstr "E467: ป็ฟ๋ภฺ ฟฯผบภบ วิผ๖ ภฮภฺฐก วสฟไวีดฯดู"
-
-#: ../ex_docmd.c:5257
-#, fuzzy, c-format
-msgid "E185: Cannot find color scheme '%s'"
-msgstr "E185: ป๖ ฝบลด %sภป(ธฆ) รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../ex_docmd.c:5263
-msgid "Greetings, Vim user!"
-msgstr "บ๖ ป็ฟ๋ภฺดิ, ศฏฟตวีดฯดู!"
-
-#: ../ex_docmd.c:5431
-msgid "E784: Cannot close last tab page"
-msgstr "E784: ธถม๖ธท ลวภป ดภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../ex_docmd.c:5462
-msgid "Already only one tab page"
-msgstr "ภฬนฬ วฯณชภว ลวธธ ภึฝภดฯดู"
-
-#: ../ex_docmd.c:6004
-#, c-format
-msgid "Tab page %d"
-msgstr "ลว ฦไภฬม๖ %d"
-
-#: ../ex_docmd.c:6295
-msgid "No swap file"
-msgstr "ฝบฟา ฦฤภฯภฬ พ๘ฝภดฯดู"
-
-#: ../ex_docmd.c:6478
-msgid "E747: Cannot change directory, buffer is modified (add ! to override)"
-msgstr "E747: ต๐ทบลไธฎธฆ นูฒ ผ๖ พ๘ดย ตฅ, น๖ฦดย ผ๖มคตส (ตคพ๎พฒทมธ้ ! ด๕วฯฑโ)"
-
-#: ../ex_docmd.c:6485
-msgid "E186: No previous directory"
-msgstr "E186: ภฬภ ต๐ทบลไธฎฐก พ๘ฝภดฯดู"
-
-#: ../ex_docmd.c:6530
-msgid "E187: Unknown"
-msgstr "E187: ธ๐ธง"
-
-#: ../ex_docmd.c:6610
-msgid "E465: :winsize requires two number arguments"
-msgstr "E465: :winsizeดย ตฮฐณภว ภฮภฺฐก วสฟไวีดฯดู"
-
-#: ../ex_docmd.c:6655
-msgid "E188: Obtaining window position not implemented for this platform"
-msgstr "E188: ภฬ วรทงฦ๛ฟก ด๋วั รข ภงฤก พ๒ดย ฑโดษภป ฑธว๖ตวม๖ พสพาฝภดฯดู"
-
-#: ../ex_docmd.c:6662
-msgid "E466: :winpos requires two number arguments"
-msgstr "E466: :winposฟกดย ตฮฐณภว ภฮภฺฐก วสฟไวีดฯดู"
-
-#: ../ex_docmd.c:7241
-#, c-format
-msgid "E739: Cannot create directory: %s"
-msgstr "E739: ต๐ทบลไธฎ ปผบ ฝวฦะ: %s"
-
-#: ../ex_docmd.c:7268
-#, c-format
-msgid "E189: \"%s\" exists (add ! to override)"
-msgstr "E189: \"%s\"ภฬ(ฐก) มธภ็วีดฯดู (ตคพ๎พฒทมธ้ ! ด๕วฯฑโ)"
-
-#: ../ex_docmd.c:7273
-#, c-format
-msgid "E190: Cannot open \"%s\" for writing"
-msgstr "E190: พฒฑโ ภงวั \"%s\"ภป(ธฆ) ฟญ ผ๖ พ๘ฝภดฯดู"
-
-#. set mark
-#: ../ex_docmd.c:7294
-msgid "E191: Argument must be a letter or forward/backward quote"
-msgstr "E191: ภฮภฺดย ฑภฺณช พี/ตฺ ภฮฟ๋ บฮศฃฟฉพ฿ วีดฯดู"
-
-#: ../ex_docmd.c:7333
-msgid "E192: Recursive use of :normal too deep"
-msgstr "E192: :normalภว ภ็ฑอ ศฃรโภฬ ณสนซ ธนภฬ ปฐๅฝภดฯดู"
-
-#: ../ex_docmd.c:7807
-msgid "E194: No alternate file name to substitute for '#'"
-msgstr "E194: '#'ฟก ด๋วุ ฤกศฏวา ฑณรผ ฦฤภฯ ภฬธงภฬ พ๘ฝภดฯดู"
-
-#: ../ex_docmd.c:7841
-msgid "E495: no autocommand file name to substitute for \"<afile>\""
-msgstr "E495: \"<afile>\"ฟก ด๋วุ ฤกศฏวา ภฺตฟธํทษ ฦฤภฯ ภฬธงภฬ พ๘ฝภดฯดู"
-
-#: ../ex_docmd.c:7850
-msgid "E496: no autocommand buffer number to substitute for \"<abuf>\""
-msgstr "E496: \"<abuf>\"ฟก ด๋วุ ฤกศฏวา ภฺตฟธํทษ น๖ฦ น๘ศฃฐก พ๘ฝภดฯดู"
-
-#: ../ex_docmd.c:7861
-msgid "E497: no autocommand match name to substitute for \"<amatch>\""
-msgstr "E497: \"<amatch>\"ฟก ด๋วุ ฤกศฏวา ภฺตฟธํทษ ธลฤก ภฬธงภฬ พ๘ฝภดฯดู"
-
-#: ../ex_docmd.c:7870
-msgid "E498: no :source file name to substitute for \"<sfile>\""
-msgstr "E498: \"<sfile>\"ฟก ด๋วุ ฤกศฏวา :source ฦฤภฯ ภฬธงภฬ พ๘ฝภดฯดู"
-
-#: ../ex_docmd.c:7876
-msgid "E842: no line number to use for \"<slnum>\""
-msgstr "E842: \"<slnum>\"ฟก ป็ฟ๋ตษ มู น๘ศฃฐก พ๘ฝภดฯดู"
-
-#: ../ex_docmd.c:7903
-#, fuzzy, c-format
-msgid "E499: Empty file name for '%' or '#', only works with \":p:h\""
-msgstr "E499: '%'ณช '#'ฟก ด๋วั บ๓ ฦฤภฯ ภฬธง, ฟภทฮม๖ \":p:h\"ฟอธธ ตฟภวีดฯดู"
-
-#: ../ex_docmd.c:7905
-msgid "E500: Evaluates to an empty string"
-msgstr "E500: บ๓ นฎภฺฟญฟกผญ ฐชภป ฑธวฯทมฐํ วีดฯดู"
-
-#: ../ex_docmd.c:8838
-msgid "E195: Cannot open viminfo file for reading"
-msgstr "E195: ภะภป viminfo ฦฤภฯภป ฟญ ผ๖ พ๘ฝภดฯดู"
-
-#: ../ex_eval.c:464
-msgid "E608: Cannot :throw exceptions with 'Vim' prefix"
-msgstr "E608: 'Vim' มขตฮป็ทฮ ฟนฟธฆ :throwวา ผ๖ พ๘ฝภดฯดู"
-
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:496
-#, c-format
-msgid "Exception thrown: %s"
-msgstr "ฟนฟ thrown: %s"
-
-#: ../ex_eval.c:545
-#, c-format
-msgid "Exception finished: %s"
-msgstr "ฟนฟ มพทแตส: %s"
-
-#: ../ex_eval.c:546
-#, c-format
-msgid "Exception discarded: %s"
-msgstr "ฟนฟ น๖ทมม: %s"
-
-#: ../ex_eval.c:588 ../ex_eval.c:634
-#, c-format
-msgid "%s, line %<PRId64>"
-msgstr "%s, %<PRId64> มู"
-
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:608
-#, c-format
-msgid "Exception caught: %s"
-msgstr "ฟนฟ น฿ป: %s"
-
-#: ../ex_eval.c:676
-#, c-format
-msgid "%s made pending"
-msgstr "%sภฬ(ฐก) pending ตวพ๚ฝภดฯดู"
-
-#: ../ex_eval.c:679
-#, c-format
-msgid "%s resumed"
-msgstr "%sภฬ(ฐก) ภ็ฐณ ตวพ๚ฝภดฯดู"
-
-#: ../ex_eval.c:683
-#, c-format
-msgid "%s discarded"
-msgstr "%sภฬ(ฐก) น๖ทมมณฝภดฯดู"
-
-#: ../ex_eval.c:708
-msgid "Exception"
-msgstr "ฟนฟ"
-
-#: ../ex_eval.c:713
-msgid "Error and interrupt"
-msgstr "ฟกทฏฟอ ภฮลอทดฦฎ"
-
-#: ../ex_eval.c:715
-msgid "Error"
-msgstr "ฟกทฏ"
-
-#. if (pending & CSTP_INTERRUPT)
-#: ../ex_eval.c:717
-msgid "Interrupt"
-msgstr "ภฮลอทดฦฎ"
-
-#: ../ex_eval.c:795
-msgid "E579: :if nesting too deep"
-msgstr "E579: :ifฐก ณสนซ ฑํฐิ ม฿รธตวพ๚ฝภดฯดู"
-
-#: ../ex_eval.c:830
-msgid "E580: :endif without :if"
-msgstr "E580: :ifพ๘ภฬ :endifฐก ภึฝภดฯดู"
-
-#: ../ex_eval.c:873
-msgid "E581: :else without :if"
-msgstr "E581: :ifพ๘ภฬ :elseฐก ภึฝภดฯดู"
-
-#: ../ex_eval.c:876
-msgid "E582: :elseif without :if"
-msgstr "E582: :ifพ๘ภฬ :elseifฐก ภึฝภดฯดู"
-
-#: ../ex_eval.c:880
-msgid "E583: multiple :else"
-msgstr "E583: ฟฉทฏฐณภว :elseฐก ภึฝภดฯดู"
-
-#: ../ex_eval.c:883
-msgid "E584: :elseif after :else"
-msgstr "E584: :else ตฺฟก :elseifฐก ภึฝภดฯดู"
-
-#: ../ex_eval.c:941
-msgid "E585: :while/:for nesting too deep"
-msgstr "E585: :while/:forฐก ณสนซ ฑํฐิ ม฿รธตวพ๚ฝภดฯดู"
-
-#: ../ex_eval.c:1028
-msgid "E586: :continue without :while or :for"
-msgstr "E586: :while ศคภบ :forพ๘ภฬ :continueฐก ภึฝภดฯดู"
-
-#: ../ex_eval.c:1061
-msgid "E587: :break without :while or :for"
-msgstr "E587: :while ศคภบ :forพ๘ภฬ :breakฐก ภึฝภดฯดู"
-
-#: ../ex_eval.c:1102
-msgid "E732: Using :endfor with :while"
-msgstr "E732: :whileฟก :endforฐก ป็ฟ๋ตวพ๚ฝภดฯดู"
-
-#: ../ex_eval.c:1104
-msgid "E733: Using :endwhile with :for"
-msgstr "E733: :forฟก :endwhileภฬ ป็ฟ๋ตวพ๚ฝภดฯดู"
-
-#: ../ex_eval.c:1247
-msgid "E601: :try nesting too deep"
-msgstr "E601: :tryฐก ณสนซ ฑํฐิ ม฿รธตวพ๚ฝภดฯดู"
-
-#: ../ex_eval.c:1317
-msgid "E603: :catch without :try"
-msgstr "E603: :tryพ๘ภฬ :catchฐก ภึฝภดฯดู"
-
-#. Give up for a ":catch" after ":finally" and ignore it.
-#. * Just parse.
-#: ../ex_eval.c:1332
-msgid "E604: :catch after :finally"
-msgstr "E604: :finally ตฺฟก :catchฐก ภึฝภดฯดู"
-
-#: ../ex_eval.c:1451
-msgid "E606: :finally without :try"
-msgstr "E606: :tryพ๘ภฬ :finallyฐก ภึฝภดฯดู"
-
-#. Give up for a multiple ":finally" and ignore it.
-#: ../ex_eval.c:1467
-msgid "E607: multiple :finally"
-msgstr "E607: ฟฉทฏฐณภว :finallyฐก ภึฝภดฯดู"
-
-#: ../ex_eval.c:1571
-msgid "E602: :endtry without :try"
-msgstr "E602: :tryพ๘ภฬ :endtryฐก ภึฝภดฯดู"
-
-#: ../ex_eval.c:2026
-msgid "E193: :endfunction not inside a function"
-msgstr "E193: :endfunctionภฬ function ณปฟก พ๘ฝภดฯดู"
-
-#: ../ex_getln.c:1643
-msgid "E788: Not allowed to edit another buffer now"
-msgstr "E788: ม๖ฑภบ ดูธฅ น๖ฦธฆ ฦํมวา ผ๖ พ๘ฝภดฯดู"
-
-#: ../ex_getln.c:1656
-msgid "E811: Not allowed to change buffer information now"
-msgstr "E811: ม๖ฑภบ น๖ฦ มคบธธฆ นูฒ ผ๖ พ๘ฝภดฯดู"
-
-#: ../ex_getln.c:3178
-msgid "tagname"
-msgstr "ลยฑืภฬธง"
-
-#: ../ex_getln.c:3181
-msgid " kind file\n"
-msgstr " kind file\n"
-
-#: ../ex_getln.c:4799
-msgid "'history' option is zero"
-msgstr "'history' ฟษผวภฬ 0ภิดฯดู"
-
-#: ../ex_getln.c:5046
-#, c-format
-msgid ""
-"\n"
-"# %s History (newest to oldest):\n"
-msgstr ""
-"\n"
-"# %s ศ๗ฝบลไธฎ (ป๕ฐอบฮลอ ฟภทกตศ ฐอ ผ๘):\n"
-
-#: ../ex_getln.c:5047
-msgid "Command Line"
-msgstr "ธํทษ มู"
-
-#: ../ex_getln.c:5048
-msgid "Search String"
-msgstr "รฃภป นฎภฺฟญ"
-
-#: ../ex_getln.c:5049
-msgid "Expression"
-msgstr "วฅว๖"
-
-#: ../ex_getln.c:5050
-msgid "Input Line"
-msgstr "ภิทย มู"
-
-#: ../ex_getln.c:5117
-msgid "E198: cmd_pchar beyond the command length"
-msgstr "E198: cmd_pcharฐก ธํทษ ฑๆภฬธฆ นพ๎ณตฝภดฯดู"
-
-#: ../ex_getln.c:5279
-msgid "E199: Active window or buffer deleted"
-msgstr "E199: ศฐผบตศ รขภฬณช น๖ฦฐก ม๖ฟ๖มณฝภดฯดู"
-
-#: ../file_search.c:203
-msgid "E854: path too long for completion"
-msgstr ""
-
-#: ../file_search.c:446
-#, c-format
-msgid ""
-"E343: Invalid path: '**[number]' must be at the end of the path or be "
-"followed by '%s'."
-msgstr ""
-"E343: ภ฿ธ๘ตศ ฐๆทฮ: '**[น๘ศฃ]'ดย ฐๆทฮภว ธถม๖ธทฟก ภงฤกวฯฐลณช '%s' ตฺฟก ภึพ๎พ฿ "
-"วีดฯดู."
-
-#: ../file_search.c:1505
-#, c-format
-msgid "E344: Can't find directory \"%s\" in cdpath"
-msgstr "E344: cdpathฟกผญ \"%s\" ต๐ทบลไธฎธฆ รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../file_search.c:1508
-#, c-format
-msgid "E345: Can't find file \"%s\" in path"
-msgstr "E345: pathฟกผญ \"%s\" ฦฤภฯภป รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../file_search.c:1512
-#, c-format
-msgid "E346: No more directory \"%s\" found in cdpath"
-msgstr "E346: cdpathฟกผญ ด๕ ภฬป๓ภว \"%s\" ต๐ทบลไธฎธฆ รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../file_search.c:1515
-#, c-format
-msgid "E347: No more file \"%s\" found in path"
-msgstr "E347: pathฟกผญ ด๕ ภฬป๓ภว \"%s\" ฦฤภฯภป รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../fileio.c:137
-msgid "E812: Autocommands changed buffer or buffer name"
-msgstr "E812: Autocommandฐก น๖ฦณช น๖ฦภฬธงภป นูฒูพ๚ฝภดฯดู"
-
-#: ../fileio.c:368
-msgid "Illegal file name"
-msgstr "ภ฿ธ๘ตศ ฦฤภฯ ภฬธง"
-
-#: ../fileio.c:395 ../fileio.c:476 ../fileio.c:2543 ../fileio.c:2578
-msgid "is a directory"
-msgstr "ภบ(ดย) ต๐ทบลไธฎภิดฯดู"
-
-#: ../fileio.c:397
-msgid "is not a file"
-msgstr "ภบ(ดย) ฦฤภฯภฬ พฦดีดฯดู"
-
-#: ../fileio.c:508 ../fileio.c:3522
-msgid "[New File]"
-msgstr "[ป๕ ฦฤภฯ]"
-
-#: ../fileio.c:511
-msgid "[New DIRECTORY]"
-msgstr "[ป๕ ต๐ทบลไธฎ]"
-
-#: ../fileio.c:529 ../fileio.c:532
-msgid "[File too big]"
-msgstr "[ฦฤภฯภฬ ณสนซ ลญ]"
-
-#: ../fileio.c:534
-msgid "[Permission Denied]"
-msgstr "[วใฟ๋ พศ ตหดฯดู]"
-
-#: ../fileio.c:653
-msgid "E200: *ReadPre autocommands made the file unreadable"
-msgstr "E200: *ReadPre ภฺตฟธํทษภฬ ฦฤภฯภป ภะม๖ ธ๘วฯฐิ ธธต้พ๚ฝภดฯดู"
-
-#: ../fileio.c:655
-msgid "E201: *ReadPre autocommands must not change current buffer"
-msgstr "E201: *ReadPre ภฺตฟธํทษภบ ว๖ภ็ น๖ฦธฆ นูฒูธ้ พศ ตหดฯดู"
-
-#: ../fileio.c:672
-msgid "Nvim: Reading from stdin...\n"
-msgstr "บ๖: วฅมุภิทยฟกผญ ภะดย ม฿...\n"
-
-#. Re-opening the original file failed!
-#: ../fileio.c:909
-msgid "E202: Conversion made file unreadable!"
-msgstr "E202: บฏศฏตศ ฦฤภฯภป ภะภป ผ๖ฐก พ๘ฝภดฯดู!"
-
-#. fifo or socket
-#: ../fileio.c:1782
-msgid "[fifo/socket]"
-msgstr "[ววฦ๗/ผาฤฯ]"
-
-#. fifo
-#: ../fileio.c:1788
-msgid "[fifo]"
-msgstr "[ววฦ๗]"
-
-#. or socket
-#: ../fileio.c:1794
-msgid "[socket]"
-msgstr "[ผาฤฯ]"
-
-#. or character special
-#: ../fileio.c:1801
-msgid "[character special]"
-msgstr ""
-
-#: ../fileio.c:1815
-msgid "[CR missing]"
-msgstr "[CR พ๘ภฝ]"
-
-#: ../fileio.c:1819
-msgid "[long lines split]"
-msgstr "[ฑไ มู ภ฿ธฒ]"
-
-#: ../fileio.c:1823 ../fileio.c:3512
-msgid "[NOT converted]"
-msgstr "[บฏศฏ พศ ตหดฯดู]"
-
-#: ../fileio.c:1826 ../fileio.c:3515
-msgid "[converted]"
-msgstr "[บฏศฏ ตวพ๚ฝภดฯดู]"
-
-#: ../fileio.c:1831
-#, c-format
-msgid "[CONVERSION ERROR in line %<PRId64>]"
-msgstr "[%<PRId64> มูฟกผญ บฏศฏ ฟกทฏ]"
-
-#: ../fileio.c:1835
-#, c-format
-msgid "[ILLEGAL BYTE in line %<PRId64>]"
-msgstr "[%<PRId64> มูฟก ภ฿ธ๘ตศ นูภฬฦฎ]"
-
-#: ../fileio.c:1838
-msgid "[READ ERRORS]"
-msgstr "[ภะฑโ ฟกทฏ]"
-
-#: ../fileio.c:2104
-msgid "Can't find temp file for conversion"
-msgstr "บฏศฏวฯฑโ ภงวั ภำฝร ฦฤภฯภป รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../fileio.c:2110
-msgid "Conversion with 'charconvert' failed"
-msgstr "'charconvert'ธฆ ป็ฟ๋วั บฏศฏภฬ ฝวฦะว฿ฝภดฯดู"
-
-#: ../fileio.c:2113
-msgid "can't read output of 'charconvert'"
-msgstr "'charconvert'ภว รโทยฐแฐ๚ธฆ ภะภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../fileio.c:2437
-msgid "E676: No matching autocommands for acwrite buffer"
-msgstr "E676: acwrite น๖ฦฟก ด๋วั autocommandธฆ รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../fileio.c:2466
-msgid "E203: Autocommands deleted or unloaded buffer to be written"
-msgstr "E203: พต น๖ฦธฆ ภฺตฟธํทษภฬ ม๖ฟ์ฐลณช ดพาฝภดฯดู"
-
-#: ../fileio.c:2486
-msgid "E204: Autocommand changed number of lines in unexpected way"
-msgstr "E204: Autocommandฐก ภ฿ธ๘ตศ นๆนภธทฮ มูภป นูฒูพ๚ฝภดฯดู"
-
-#: ../fileio.c:2548 ../fileio.c:2565
-msgid "is not a file or writable device"
-msgstr "ฦฤภฯ ศคภบ พต ผ๖ ภึดย ภๅฤกฐก พฦดีดฯดู"
-
-#: ../fileio.c:2601
-msgid "is read-only (add ! to override)"
-msgstr "ภะฑโ ภฟ๋ภิดฯดู (ตคพ๎พฒทมธ้ ! ด๕วฯฑโ)"
-
-#: ../fileio.c:2886
-msgid "E506: Can't write to backup file (add ! to override)"
-msgstr "E506: น้พ๗ฦฤภฯภป พต ผ๖ พ๘ฝภดฯดู (ตคพ๎พฒทมธ้ ! ด๕วฯฑโ)"
-
-#: ../fileio.c:2898
-msgid "E507: Close error for backup file (add ! to override)"
-msgstr "E507: น้พ๗ฦฤภฯ ดฑโ ฟกทฏ (ตคพ๎พฒทมธ้ ! ด๕วฯฑโ)"
-
-#: ../fileio.c:2901
-msgid "E508: Can't read file for backup (add ! to override)"
-msgstr "E508: น้พ๗วา ฦฤภฯภป ภะภป ผ๖ พ๘ฝภดฯดู (ตคพ๎พฒทมธ้ ! ด๕วฯฑโ)"
-
-#: ../fileio.c:2923
-msgid "E509: Cannot create backup file (add ! to override)"
-msgstr "E509: น้พ๗ฦฤภฯภป ธธต้ ผ๖ พ๘ฝภดฯดู (ตคพ๎พฒทมธ้ ! ด๕วฯฑโ)"
-
-#: ../fileio.c:3008
-msgid "E510: Can't make backup file (add ! to override)"
-msgstr "E510: น้พ๗ฦฤภฯภป ธธต้ ผ๖ พ๘ฝภดฯดู (ตคพ๎พฒทมธ้ ! ด๕วฯฑโ)"
-
-#. Can't write without a tempfile!
-#: ../fileio.c:3121
-msgid "E214: Can't find temp file for writing"
-msgstr "E214: พต ภำฝร ฦฤภฯภป รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../fileio.c:3134
-msgid "E213: Cannot convert (add ! to write without conversion)"
-msgstr "E213: บฏศฏวา ผ๖ พ๘ฝภดฯดู (บฏศฏ พ๘ภฬ ภ๚ภๅวฯทมธ้ ! ด๕วฯฑโ)"
-
-#: ../fileio.c:3169
-msgid "E166: Can't open linked file for writing"
-msgstr "E166: พต ฟฌฐแตศ ฦฤภฯภป ฟญ ผ๖ พ๘ฝภดฯดู"
-
-#: ../fileio.c:3173
-msgid "E212: Can't open file for writing"
-msgstr "E212: พต ฦฤภฯภป ฟญ ผ๖ พ๘ฝภดฯดู"
-
-#: ../fileio.c:3363
-msgid "E667: Fsync failed"
-msgstr "E667: Fsyncฐก ฝวฦะว฿ฝภดฯดู"
-
-#: ../fileio.c:3398
-msgid "E512: Close failed"
-msgstr "E512: ดฑโฐก ฝวฦะว฿ฝภดฯดู"
-
-#: ../fileio.c:3436
-msgid "E513: write error, conversion failed (make 'fenc' empty to override)"
-msgstr "E513: พฒฑโ ฟกทฏ, บฏศฏ ฝวฦะ (นซฝรวฯทมธ้ 'fenc'ธฆ บ๑ฟ์ธ้ ตส)"
-
-#: ../fileio.c:3441
-#, c-format
-msgid ""
-"E513: write error, conversion failed in line %<PRId64> (make 'fenc' empty to "
-"override)"
-msgstr ""
-"E513: พฒฑโ ฟกทฏ, %<PRId64> มูฟกผญ บฏศฏ ฝวฦะ (นซฝรวฯทมธ้ 'fenc'ธฆ บ๑ฟ์ธ้ ตส)"
-
-#: ../fileio.c:3448
-msgid "E514: write error (file system full?)"
-msgstr "E514: พฒฑโ ฟกทฏ (ฦฤภฯ ฝรฝบลภฬ ฒหรกณชฟไ?)"
-
-#: ../fileio.c:3506
-msgid " CONVERSION ERROR"
-msgstr " บฏศฏ ฟกทฏ"
-
-#: ../fileio.c:3509
-#, c-format
-msgid " in line %<PRId64>;"
-msgstr "%<PRId64> มูฟกผญ;"
-
-#: ../fileio.c:3519
-msgid "[Device]"
-msgstr "[ภๅฤก]"
-
-#: ../fileio.c:3522
-msgid "[New]"
-msgstr "[ป๕ทฮฟ๎]"
-
-#: ../fileio.c:3535
-msgid " [a]"
-msgstr " [a]"
-
-#: ../fileio.c:3535
-msgid " appended"
-msgstr " ด๕ว฿ฝภดฯดู"
-
-#: ../fileio.c:3537
-msgid " [w]"
-msgstr " [w]"
-
-#: ../fileio.c:3537
-msgid " written"
-msgstr " ภ๚ภๅ ว฿ฝภดฯดู"
-
-#: ../fileio.c:3579
-msgid "E205: Patchmode: can't save original file"
-msgstr "E205: ฦะฤก ป๓ลย: ฟ๘ทก ฦฤภฯภป ภ๚ภๅวา ผ๖ พ๘ฝภดฯดู"
-
-#: ../fileio.c:3602
-msgid "E206: patchmode: can't touch empty original file"
-msgstr "E206: ฦะฤก ป๓ลย: บ๓ ฟ๘ทก ฦฤภฯภป ธธต้ ผ๖ พ๘ฝภดฯดู"
-
-#: ../fileio.c:3616
-msgid "E207: Can't delete backup file"
-msgstr "E207: น้พ๗ ฦฤภฯภป ม๖ฟ๏ ผ๖ พ๘ฝภดฯดู"
-
-#: ../fileio.c:3672
-msgid ""
-"\n"
-"WARNING: Original file may be lost or damaged\n"
-msgstr ""
-"\n"
-"ฐๆฐํ: ฟ๘ทก ฦฤภฯภฬ พ๘พ๎มณฐลณช ฑ๚มณภป ผ๖ ภึฝภดฯดู\n"
-
-#: ../fileio.c:3675
-msgid "don't quit the editor until the file is successfully written!"
-msgstr "ฦฤภฯภฬ ผบฐ๘ภ๛ภธทฮ ภ๚ภๅตษ ถงฑ๎ม๖ ฦํมฑโธฆ ณกณปม๖ ธถฝสฝรฟภ!"
-
-#: ../fileio.c:3795
-msgid "[dos]"
-msgstr "[ตตฝบ]"
-
-#: ../fileio.c:3795
-msgid "[dos format]"
-msgstr "[ตตฝบ วฝฤ]"
-
-#: ../fileio.c:3801
-msgid "[mac]"
-msgstr "[ธฦ]"
-
-#: ../fileio.c:3801
-msgid "[mac format]"
-msgstr "[ธฦ วฝฤ]"
-
-#: ../fileio.c:3807
-msgid "[unix]"
-msgstr "[ภฏดะฝบ]"
-
-#: ../fileio.c:3807
-msgid "[unix format]"
-msgstr "[ภฏดะฝบ วฝฤ]"
-
-#: ../fileio.c:3831
-msgid "1 line, "
-msgstr "1 มู, "
-
-#: ../fileio.c:3833
-#, c-format
-msgid "%<PRId64> lines, "
-msgstr "%<PRId64> มู, "
-
-#: ../fileio.c:3836
-msgid "1 character"
-msgstr "1 ฑภฺ"
-
-#: ../fileio.c:3838
-#, c-format
-msgid "%<PRId64> characters"
-msgstr "%<PRId64> ฑภฺ"
-
-#: ../fileio.c:3849
-msgid "[noeol]"
-msgstr "[noeol]"
-
-#: ../fileio.c:3849
-msgid "[Incomplete last line]"
-msgstr "[บาฟฯภวั ธถม๖ธท มู]"
-
-#. don't overwrite messages here
-#. must give this prompt
-#. don't use emsg() here, don't want to flush the buffers
-#: ../fileio.c:3865
-msgid "WARNING: The file has been changed since reading it!!!"
-msgstr "ฐๆฐํ: ฦฤภฯภฬ ภะภบ ตฺฟก นูฒ๎พ๚ฝภดฯดู!!!"
-
-#: ../fileio.c:3867
-msgid "Do you really want to write to it"
-msgstr "มคธปทฮ พฒฑโธฆ ฟ๘วฯฝสดฯฑ๎"
-
-#: ../fileio.c:4648
-#, c-format
-msgid "E208: Error writing to \"%s\""
-msgstr "E208: \"%s\"ฟก พฒฑโ ฟกทฏ"
-
-#: ../fileio.c:4655
-#, c-format
-msgid "E209: Error closing \"%s\""
-msgstr "E209: \"%s\" ดฑโ ฟกทฏ"
-
-#: ../fileio.c:4657
-#, c-format
-msgid "E210: Error reading \"%s\""
-msgstr "E210: \"%s\" ภะฑโ ฟกทฏ"
-
-#: ../fileio.c:4883
-msgid "E246: FileChangedShell autocommand deleted buffer"
-msgstr "E246: FileChangedShell ภฺตฟธํทษภฬ น๖ฦธฆ ม๖ฟฝภดฯดู"
-
-#: ../fileio.c:4894
-#, c-format
-msgid "E211: File \"%s\" no longer available"
-msgstr "E211: ฦฤภฯ \"%s\"ภป(ธฆ) ด๕ ภฬป๓ ป็ฟ๋วา ผ๖ พ๘ฝภดฯดู"
-
-#: ../fileio.c:4906
-#, c-format
-msgid ""
-"W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as "
-"well"
-msgstr ""
-"W12: ฐๆฐํ: ฦฤภฯ \"%s\"ภฬ(ฐก) นูฒ๎พ๚ฐํ ธถย๙ฐกม๖ทฮ บ๖ภว น๖ฦตต นูฒ๎พ๚ฝภดฯดู"
-
-#: ../fileio.c:4907
-msgid "See \":help W12\" for more info."
-msgstr "ด๕ ธนภบ มคบธธฆ บธทมธ้ \":help W12\"ภป ภิทยวฯผผฟไ."
-
-#: ../fileio.c:4910
-#, c-format
-msgid "W11: Warning: File \"%s\" has changed since editing started"
-msgstr "W11: ฐๆฐํ: ฦฤภฯ \"%s\"ภฬ(ฐก) ฐํฤกฑโ ฝรภวั ตฺฟก นูฒ๎พ๚ฝภดฯดู"
-
-#: ../fileio.c:4911
-msgid "See \":help W11\" for more info."
-msgstr "ด๕ ธนภบ มคบธธฆ บธทมธ้ \":help W11\"ภป ภิทยวฯผผฟไ."
-
-#: ../fileio.c:4914
-#, c-format
-msgid "W16: Warning: Mode of file \"%s\" has changed since editing started"
-msgstr "W16: ฐๆฐํ: ฦฤภฯ \"%s\"ภว ป๓ลยฐก ฐํฤกฑโ ฝรภวั ตฺฟก นูฒ๎พ๚ฝภดฯดู"
-
-#: ../fileio.c:4915
-msgid "See \":help W16\" for more info."
-msgstr "ด๕ ธนภบ มคบธธฆ บธทมธ้ \":help W16\"ภป ภิทยวฯผผฟไ."
-
-#: ../fileio.c:4927
-#, c-format
-msgid "W13: Warning: File \"%s\" has been created after editing started"
-msgstr "W13: ฐๆฐํ: ฦฤภฯ \"%s\"ภฬ(ฐก) ฐํฤกฑโ ฝรภวั ตฺฟก ธธต้พ๚ฝภดฯดู"
-
-#: ../fileio.c:4947
-msgid "Warning"
-msgstr "ฐๆฐํ"
-
-#: ../fileio.c:4948
-msgid ""
-"&OK\n"
-"&Load File"
-msgstr ""
-"ศฎภฮ(&O)\n"
-"ฦฤภฯ บาทฏฟภฑโ(&L)"
-
-#: ../fileio.c:5065
-#, c-format
-msgid "E462: Could not prepare for reloading \"%s\""
-msgstr "E462: \"%s\"ภว ภ็ทฮตๅธฆ มุบ๑วา ผ๖ พ๘ฝภดฯดู"
-
-#: ../fileio.c:5078
-#, c-format
-msgid "E321: Could not reload \"%s\""
-msgstr "E321: \"%s\"ภป(ธฆ) ดูฝร ทฮตๅวา ผ๖ พ๘ฝภดฯดู"
-
-#: ../fileio.c:5601
-msgid "--Deleted--"
-msgstr "--ม๖ฟ๖ม--"
-
-#: ../fileio.c:5732
-#, c-format
-msgid "auto-removing autocommand: %s <buffer=%d>"
-msgstr "autocommand ภฺตฟป่มฆ: %s <buffer=%d>"
-
-#. the group doesn't exist
-#: ../fileio.c:5772
-#, c-format
-msgid "E367: No such group: \"%s\""
-msgstr "E367: ภฬทฑ ฑืท์ พ๘ภฝ: \"%s\""
-
-#: ../fileio.c:5897
-#, c-format
-msgid "E215: Illegal character after *: %s"
-msgstr "E215: * ตฺฟก ภฬป๓วั ฑภฺ: %s"
-
-#: ../fileio.c:5905
-#, c-format
-msgid "E216: No such event: %s"
-msgstr "E216: ฑืทฑ ภฬบฅฦฎ พ๘ภฝ: %s"
-
-#: ../fileio.c:5907
-#, c-format
-msgid "E216: No such group or event: %s"
-msgstr "E216: ฑืทฑ ฑืท์ภฬณช ภฬบฅฦฎ พ๘ภฝ: %s"
-
-#. Highlight title
-#: ../fileio.c:6090
-msgid ""
-"\n"
-"--- Auto-Commands ---"
-msgstr ""
-"\n"
-"--- ภฺตฟ-ธํทษ ---"
-
-#: ../fileio.c:6293
-#, c-format
-msgid "E680: <buffer=%d>: invalid buffer number "
-msgstr "E680: <buffer=%d>: ภ฿ธ๘ตศ น๖ฦ น๘ศฃ"
-
-#: ../fileio.c:6370
-msgid "E217: Can't execute autocommands for ALL events"
-msgstr "E217: ALL ภฬบฅฦฎฟก ด๋วุ ภฺตฟธํทษภป ฝววเวา ผ๖ พ๘ฝภดฯดู"
-
-#: ../fileio.c:6393
-msgid "No matching autocommands"
-msgstr "ธยดย ภฺตฟธํทษภฬ พ๘ฝภดฯดู"
-
-#: ../fileio.c:6831
-msgid "E218: autocommand nesting too deep"
-msgstr "E218: ภฺตฟธํทษภฬ ณสนซ ฑํฐิ ม฿รธตวพ๚ฝภดฯดู"
-
-#: ../fileio.c:7143
-#, c-format
-msgid "%s Auto commands for \"%s\""
-msgstr ""
-
-#: ../fileio.c:7149
-#, c-format
-msgid "Executing %s"
-msgstr "%s ฝววเม฿"
-
-#: ../fileio.c:7211
-#, c-format
-msgid "autocommand %s"
-msgstr "ภฺตฟธํทษ %s"
-
-#: ../fileio.c:7795
-msgid "E219: Missing {."
-msgstr "E219: {ฐก พ๘ฝภดฯดู."
-
-#: ../fileio.c:7797
-msgid "E220: Missing }."
-msgstr "E220: }ฐก พ๘ฝภดฯดู."
-
-#: ../fold.c:93
-msgid "E490: No fold found"
-msgstr "E490: foldฐก พ๘ฝภดฯดู"
-
-#: ../fold.c:544
-msgid "E350: Cannot create fold with current 'foldmethod'"
-msgstr "E350: ว๖ภ็ภว 'foldmethod'ภธทฮ มขฑโธฆ ธธต้ ผ๖ พ๘ฝภดฯดู"
-
-#: ../fold.c:546
-msgid "E351: Cannot delete fold with current 'foldmethod'"
-msgstr "E351: ว๖ภ็ภว 'foldmethod'ภธทฮ มขฑโธฆ ม๖ฟ๏ ผ๖ พ๘ฝภดฯดู"
-
-#: ../fold.c:1784
-#, c-format
-msgid "+--%3ld lines folded "
-msgstr "+--%3ld มู มขศ๛ "
-
-#. buffer has already been read
-#: ../getchar.c:273
-msgid "E222: Add to read buffer"
-msgstr "E222: ภะว๔ม๘ น๖ฦฟก ด๕วฯฑโ"
-
-#: ../getchar.c:2040
-msgid "E223: recursive mapping"
-msgstr "E223: ภ็ฑอ ธสวฮ"
-
-#: ../getchar.c:2849
-#, c-format
-msgid "E224: global abbreviation already exists for %s"
-msgstr "E224: %s ภฟช พเพ๎ฐก ภฬนฬ มธภ็วีดฯดู"
-
-#: ../getchar.c:2852
-#, c-format
-msgid "E225: global mapping already exists for %s"
-msgstr "E225: %s ภฟช ธลวฮภฬ ภฬนฬ มธภ็วีดฯดู"
-
-#: ../getchar.c:2952
-#, c-format
-msgid "E226: abbreviation already exists for %s"
-msgstr "E226: %s พเพ๎ฐก ภฬนฬ มธภ็วีดฯดู"
-
-#: ../getchar.c:2955
-#, c-format
-msgid "E227: mapping already exists for %s"
-msgstr "E227: %s ธลวฮภฬ ภฬนฬ มธภ็วีดฯดู"
-
-#: ../getchar.c:3008
-msgid "No abbreviation found"
-msgstr "พเพ๎ธฆ รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../getchar.c:3010
-msgid "No mapping found"
-msgstr "ธสวฮภป รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../getchar.c:3974
-msgid "E228: makemap: Illegal mode"
-msgstr "E228: makemap: ภฬป๓วั ป๓ลย"
-
-#. key value of 'cedit' option
-#. type of cmdline window or 0
-#. result of cmdline window or 0
-#: ../globals.h:924
-msgid "--No lines in buffer--"
-msgstr "--น๖ฦฟก มู พ๘ภฝ--"
-
-#.
-#. * The error messages that can be shared are included here.
-#. * Excluded are errors that are only used once and debugging messages.
-#.
-#: ../globals.h:996
-msgid "E470: Command aborted"
-msgstr "E470: ธํทษภฬ ม฿ม๖ตวพ๚ฝภดฯดู"
-
-#: ../globals.h:997
-msgid "E471: Argument required"
-msgstr "E471: ภฮภฺฐก วสฟไวีดฯดู"
-
-#: ../globals.h:998
-msgid "E10: \\ should be followed by /, ? or &"
-msgstr "E10: /, ? ศคภบ &ดย \\ ตฺฟก ฟอพ฿ วีดฯดู"
-
-#: ../globals.h:1000
-msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
-msgstr "E11: ธํทษมู รขฟก ภ฿ธ๘ตส; <CR> ฝววเ, CTRL-C ณกณปฑโ"
-
-#: ../globals.h:1002
-msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
-msgstr ""
-"E12: ว๖ภ็ ต๐ทบลไธฎ ถวดย ลยฑื รฃฑโฟกผญ exrc/vimrcฟกผญภว ธํทษภบ วใฟ๋ พศ ตหดฯดู"
-
-#: ../globals.h:1003
-msgid "E171: Missing :endif"
-msgstr "E171: :endifฐก พ๘ฝภดฯดู"
-
-#: ../globals.h:1004
-msgid "E600: Missing :endtry"
-msgstr "E600: :endtryฐก พ๘ฝภดฯดู"
-
-#: ../globals.h:1005
-msgid "E170: Missing :endwhile"
-msgstr "E170: :endwhileภฬ พ๘ฝภดฯดู"
-
-#: ../globals.h:1006
-msgid "E170: Missing :endfor"
-msgstr "E170: :endfor ดฉถ๔"
-
-#: ../globals.h:1007
-msgid "E588: :endwhile without :while"
-msgstr "E588: :whileพ๘ภฬ :endwhileภฬ ภึฝภดฯดู"
-
-#: ../globals.h:1008
-msgid "E588: :endfor without :for"
-msgstr "E588: :for พ๘ดย :endfor"
-
-#: ../globals.h:1009
-msgid "E13: File exists (add ! to override)"
-msgstr "E13: ฦฤภฯภฬ ภึฝภดฯดู (ตคพ๎พฒทมธ้ ! ป็ฟ๋)"
-
-#: ../globals.h:1010
-msgid "E472: Command failed"
-msgstr "E472: ธํทษภฬ ฝวฦะว฿ฝภดฯดู"
-
-#: ../globals.h:1011
-msgid "E473: Internal error"
-msgstr "E473: ณปบฮ ฟกทฏ"
-
-#: ../globals.h:1012
-msgid "Interrupted"
-msgstr "ม฿ดตวพ๚ฝภดฯดู"
-
-#: ../globals.h:1013
-msgid "E14: Invalid address"
-msgstr "E14: ภ฿ธ๘ตศ มึผา"
-
-#: ../globals.h:1014
-msgid "E474: Invalid argument"
-msgstr "E474: ภ฿ธ๘ตศ ภฮภฺ"
-
-#: ../globals.h:1015
-#, c-format
-msgid "E475: Invalid argument: %s"
-msgstr "E475: ภ฿ธ๘ตศ ภฮภฺ: %s"
-
-#: ../globals.h:1016
-#, c-format
-msgid "E15: Invalid expression: %s"
-msgstr "E15: ภ฿ธ๘ตศ วฅว๖ฝฤ: %s"
-
-#: ../globals.h:1017
-msgid "E16: Invalid range"
-msgstr "E16: ภ฿ธ๘ตศ นภง"
-
-#: ../globals.h:1018
-msgid "E476: Invalid command"
-msgstr "E476: ภ฿ธ๘ตศ ธํทษ"
-
-#: ../globals.h:1019
-#, c-format
-msgid "E17: \"%s\" is a directory"
-msgstr "E17: \"%s\"ภบ(ดย) ต๐ทบลไธฎภิดฯดู"
-
-#: ../globals.h:1020
-#, fuzzy
-msgid "E900: Invalid job id"
-msgstr "E49: ฝบลฉทั ลฉฑโฐก ภ฿ธ๘ตวพ๚ฝภดฯดู"
-
-#: ../globals.h:1021
-msgid "E901: Job table is full"
-msgstr ""
-
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
-#: ../globals.h:1024
-#, c-format
-msgid "E364: Library call failed for \"%s()\""
-msgstr "E364: ถ๓ภฬบ๊ทฏธฎ \"%s()\" บฮธฃฑโ ฝวฦะ"
-
-#: ../globals.h:1026
-msgid "E19: Mark has invalid line number"
-msgstr "E19: ธถลฉฐก ภ฿ธ๘ตศ มู น๘ศฃธฆ ฐกม๖ฐํ ภึฝภดฯดู"
-
-#: ../globals.h:1027
-msgid "E20: Mark not set"
-msgstr "E20: ธถลฉฐก ผณมคตวพ๎ ภึม๖ พสฝภดฯดู"
-
-#: ../globals.h:1029
-msgid "E21: Cannot make changes, 'modifiable' is off"
-msgstr "E21: นูฒ ผ๖ พ๘ภฝ, 'modifiable'ภฬ ฒจมฎภึฝภดฯดู"
-
-#: ../globals.h:1030
-msgid "E22: Scripts nested too deep"
-msgstr "E22: ฝบลฉธณฦฎฐก ณสนซ ฑํฐิ ม฿รธตวพ๚ฝภดฯดู"
-
-#: ../globals.h:1031
-msgid "E23: No alternate file"
-msgstr "E23: ดูธฅ ฦฤภฯภฬ พ๘ฝภดฯดู"
-
-#: ../globals.h:1032
-msgid "E24: No such abbreviation"
-msgstr "E24: ฑืทฑ พเพ๎ดย พ๘ฝภดฯดู"
-
-#: ../globals.h:1033
-msgid "E477: No ! allowed"
-msgstr "E477: !ภบ วใฟ๋ตวม๖ พสฝภดฯดู"
-
-#: ../globals.h:1035
-msgid "E25: Nvim does not have a built-in GUI"
-msgstr "E25: GUIดย ป็ฟ๋วา ผ๖ พ๘ฝภดฯดู: ฤฤฦฤภฯ ถง ฦ๗วิตวม๖ พสพาฝภดฯดู"
-
-#: ../globals.h:1036
-#, c-format
-msgid "E28: No such highlight group name: %s"
-msgstr "E28: ภฬทฑ วฯภฬถ๓ภฬฦฎ ฑืท์ ภฬธงภบ พ๘ฝภดฯดู: %s"
-
-#: ../globals.h:1037
-msgid "E29: No inserted text yet"
-msgstr "E29: ภิทยตศ ลุฝบฦฎฐก พฦม๗ พ๘ฝภดฯดู"
-
-#: ../globals.h:1038
-msgid "E30: No previous command line"
-msgstr "E30: ภฬภ ธํทษ มูภฬ พ๘ฝภดฯดู"
-
-#: ../globals.h:1039
-msgid "E31: No such mapping"
-msgstr "E31: ฑืทฑ ธสวฮภฬ พ๘ฝภดฯดู"
-
-#: ../globals.h:1040
-msgid "E479: No match"
-msgstr "E479: ธยม๖ พสฝภดฯดู"
-
-#: ../globals.h:1041
-#, c-format
-msgid "E480: No match: %s"
-msgstr "E480: ธยม๖ พสภฝ: %s"
-
-#: ../globals.h:1042
-msgid "E32: No file name"
-msgstr "E32: ฦฤภฯ ภฬธงภฬ พ๘ฝภดฯดู"
-
-#: ../globals.h:1044
-msgid "E33: No previous substitute regular expression"
-msgstr "E33: ภฬภ นูฒูฑโ มคฑิ วฅว๖ฝฤภฬ พ๘ฝภดฯดู"
-
-#: ../globals.h:1045
-msgid "E34: No previous command"
-msgstr "E34: ภฬภ ธํทษภฬ พ๘ฝภดฯดู"
-
-#: ../globals.h:1046
-msgid "E35: No previous regular expression"
-msgstr "E35: ภฬภ มคฑิวฅว๖ฝฤภฬ พ๘ฝภดฯดู"
-
-#: ../globals.h:1047
-msgid "E481: No range allowed"
-msgstr "E481: นภงดย วใฟ๋ตวม๖ พสฝภดฯดู"
-
-#: ../globals.h:1048
-msgid "E36: Not enough room"
-msgstr "E36: บ๓ ฐ๘ฐฃภฬ รๆบะวฯม๖ พสฝภดฯดู"
-
-#: ../globals.h:1049
-#, c-format
-msgid "E482: Can't create file %s"
-msgstr "E482: %s ฦฤภฯภป ธธต้ ผ๖ พ๘ฝภดฯดู"
-
-#: ../globals.h:1050
-msgid "E483: Can't get temp file name"
-msgstr "E483: ภำฝร ฦฤภฯ ภฬธงภป พ๒ภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../globals.h:1051
-#, c-format
-msgid "E484: Can't open file %s"
-msgstr "E484: %s ฦฤภฯภป ฟญ ผ๖ พ๘ฝภดฯดู"
-
-#: ../globals.h:1052
-#, c-format
-msgid "E485: Can't read file %s"
-msgstr "E485: %s ฦฤภฯภป ภะภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../globals.h:1054
-msgid "E37: No write since last change (add ! to override)"
-msgstr "E37: ธถม๖ธทภธทฮ ฐํฤฃ ตฺ ภ๚ภๅตวม๖ พสพาฝภดฯดู (นซฝรวฯทมธ้ ! ด๕วฯฑโ)"
-
-#: ../globals.h:1055
-#, fuzzy
-msgid "E37: No write since last change"
-msgstr "[ธถม๖ธทภธทฮ ฐํฤฃ ตฺ ภ๚ภๅ พศ วิ]\n"
-
-#: ../globals.h:1056
-msgid "E38: Null argument"
-msgstr "E38: ณฮ ภฮภฺ"
-
-#: ../globals.h:1057
-msgid "E39: Number expected"
-msgstr "E39: ผภฺฐก วสฟไวีดฯดู"
-
-#: ../globals.h:1058
-#, c-format
-msgid "E40: Can't open errorfile %s"
-msgstr "E40: ฟกทฏฦฤภฯ %sภป(ธฆ) ฟญ ผ๖ พ๘ฝภดฯดู"
-
-#: ../globals.h:1059
-msgid "E41: Out of memory!"
-msgstr "E41: ธธ๐ธฎฐก นูดฺณตฝภดฯดู!"
-
-#: ../globals.h:1060
-msgid "Pattern not found"
-msgstr "ฦะลฯภป รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../globals.h:1061
-#, c-format
-msgid "E486: Pattern not found: %s"
-msgstr "E486: ฦะลฯภป รฃภป ผ๖ พ๘ฝภดฯดู: %s"
-
-#: ../globals.h:1062
-msgid "E487: Argument must be positive"
-msgstr "E487: ภฮภฺดย พ็ผ๖ภฬพ๎พ฿ วีดฯดู"
-
-#: ../globals.h:1064
-msgid "E459: Cannot go back to previous directory"
-msgstr "E459: ภฬภ ต๐ทบลไธฎทฮ ฐฅ ผ๖ พ๘ฝภดฯดู"
-
-#: ../globals.h:1066
-msgid "E42: No Errors"
-msgstr "E42: ฟกทฏ พ๘ภฝ"
-
-#: ../globals.h:1067
-msgid "E776: No location list"
-msgstr "E776: ภงฤก ธ๑ทฯ พ๘ภฝ"
-
-#: ../globals.h:1068
-msgid "E43: Damaged match string"
-msgstr "E43: ฑ๚ม๘ ธยดย นฎภฺฟญ"
-
-#: ../globals.h:1069
-msgid "E44: Corrupted regexp program"
-msgstr "E44: ฑ๚ม๘ มคฑิวฅว๖ฝฤ วมทฮฑืทฅ"
-
-#: ../globals.h:1071
-msgid "E45: 'readonly' option is set (add ! to override)"
-msgstr "E45: 'readonly' ฟษผวภฬ ผณมคตวพ๎ ภึฝภดฯดู (ตคพ๎พฒทมธ้ ! ด๕วฯฑโ)"
-
-#: ../globals.h:1073
-#, c-format
-msgid "E46: Cannot change read-only variable \"%s\""
-msgstr "E46: ภะฑโ ภฟ๋ บฏผ๖ \"%s\"ภป(ธฆ) นูฒ ผ๖ พ๘ฝภดฯดู"
-
-#: ../globals.h:1075
-#, c-format
-msgid "E794: Cannot set variable in the sandbox: \"%s\""
-msgstr "E794: sandbox พศฟกผญดย บฏผ๖ธฆ ผณมควา ผ๖ พ๘ภฝ: \"%s\""
-
-#: ../globals.h:1076
-msgid "E47: Error while reading errorfile"
-msgstr "E47: ฟกทฏฦฤภฯ ภะดย ตตม฿ฟก ฟกทฏ"
-
-#: ../globals.h:1078
-msgid "E48: Not allowed in sandbox"
-msgstr "E48: sandboxฟกผญดย วใฟ๋ตวม๖ พสฝภดฯดู"
-
-#: ../globals.h:1080
-msgid "E523: Not allowed here"
-msgstr "E523: ฟฉฑโฟกผญ วใฟ๋ตวม๖ พสฝภดฯดู"
-
-#: ../globals.h:1082
-msgid "E359: Screen mode setting not supported"
-msgstr "E359: ฝบลฉธฐ ป๓ลย ผณมคภบ ม๖ฟ๘ตวม๖ พสฝภดฯดู"
-
-#: ../globals.h:1083
-msgid "E49: Invalid scroll size"
-msgstr "E49: ฝบลฉทั ลฉฑโฐก ภ฿ธ๘ตวพ๚ฝภดฯดู"
-
-#: ../globals.h:1084
-msgid "E91: 'shell' option is empty"
-msgstr "E91: 'shell' ฟษผวภฬ บ๑พ๚ฝภดฯดู"
-
-#: ../globals.h:1085
-msgid "E255: Couldn't read in sign data!"
-msgstr "E255: sign ภฺทแธฆ ภะภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../globals.h:1086
-msgid "E72: Close error on swap file"
-msgstr "E72: ฝบฟา ฦฤภฯภป ดภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../globals.h:1087
-msgid "E73: tag stack empty"
-msgstr "E73: ลยฑื ฝบลรภฬ บ๑พ๚ฝภดฯดู"
-
-#: ../globals.h:1088
-msgid "E74: Command too complex"
-msgstr "E74: ธํทษภฬ ณสนซ บนภโวีดฯดู"
-
-#: ../globals.h:1089
-msgid "E75: Name too long"
-msgstr "E75: ภฬธงภฬ ณสนซ ฑ้ดฯดู"
-
-#: ../globals.h:1090
-msgid "E76: Too many ["
-msgstr "E76: [ฐก ณสนซ ธนฝภดฯดู"
-
-#: ../globals.h:1091
-msgid "E77: Too many file names"
-msgstr "E77: ฦฤภฯ ภฬธงภฬ ณสนซ ธนฝภดฯดู"
-
-#: ../globals.h:1092
-msgid "E488: Trailing characters"
-msgstr "E488: ณกฟก นฎภฺฐก ด๕ ภึฝภดฯดู"
-
-#: ../globals.h:1093
-msgid "E78: Unknown mark"
-msgstr "E78: ธ๐ธฃดย ธถลฉ"
-
-#: ../globals.h:1094
-msgid "E79: Cannot expand wildcards"
-msgstr "E79: ธธดษ ฑภฺธฆ ศฎภๅวา ผ๖ พ๘ฝภดฯดู"
-
-#: ../globals.h:1096
-msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
-msgstr "E591: 'winheight'ดย 'winminheight'บธดู ฤฟพ฿ วีดฯดู"
-
-#: ../globals.h:1098
-msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
-msgstr "E592: 'winwidth'ดย 'winminwidth'บธดู ฤฟพ฿ วีดฯดู"
-
-#: ../globals.h:1099
-msgid "E80: Error while writing"
-msgstr "E80: พฒดย ม฿ฟก ฟกทฏ"
-
-#: ../globals.h:1100
-msgid "Zero count"
-msgstr "Zero count"
-
-#: ../globals.h:1101
-msgid "E81: Using <SID> not in a script context"
-msgstr "E81: ฝบลฉธณฦฎ ฤลุฝบฦฎ นฟกผญ <SID> ป็ฟ๋"
-
-#: ../globals.h:1102
-#, c-format
-msgid "E685: Internal error: %s"
-msgstr "E685: ณปบฮ ฟกทฏ: %s"
-
-#: ../globals.h:1104
-msgid "E363: pattern uses more memory than 'maxmempattern'"
-msgstr "E363: ฦะลฯภฬ 'maxmempattern'บธดู ธนภบ ธธ๐ธฎธฆ ป็ฟ๋วีดฯดู"
-
-#: ../globals.h:1105
-msgid "E749: empty buffer"
-msgstr "E749: บ๓ น๖ฦ"
-
-#: ../globals.h:1108
-msgid "E682: Invalid search pattern or delimiter"
-msgstr "E682: ภ฿ธ๘ตศ รฃฑโ ฦะลฯ ศคภบ ฑธบะภฺ"
-
-#: ../globals.h:1109
-msgid "E139: File is loaded in another buffer"
-msgstr "E139: ฦฤภฯภฬ ดูธฅ น๖ฦฟก ทฮต๙ตวพ๎ ภึฝภดฯดู"
-
-#: ../globals.h:1110
-#, c-format
-msgid "E764: Option '%s' is not set"
-msgstr "E764: ฟษผว '%s'ภฬ(ฐก) ผณมคตวพ๎ ภึม๖ พสฝภดฯดู"
-
-#: ../globals.h:1111
-#, fuzzy
-msgid "E850: Invalid register name"
-msgstr "E354: ภ฿ธ๘ตศ ทนม๖ฝบลอ ภฬธง: '%s'"
-
-#: ../globals.h:1114
-msgid "search hit TOP, continuing at BOTTOM"
-msgstr "รณภฝฑ๎ม๖ รฃพาภฝ, ณกฟกผญ ฐ่ผำ"
-
-#: ../globals.h:1115
-msgid "search hit BOTTOM, continuing at TOP"
-msgstr "ณกฑ๎ม๖ รฃพาภฝ, รณภฝบฮลอ ฐ่ผำ"
-
-#: ../hardcopy.c:240
-msgid "E550: Missing colon"
-msgstr "E550: ฤทะภฬ พ๘ฝภดฯดู"
-
-#: ../hardcopy.c:252
-msgid "E551: Illegal component"
-msgstr "E551: ภฬป๓วั ฤฤฦ๗ณอฦฎ"
-
-#: ../hardcopy.c:259
-msgid "E552: digit expected"
-msgstr "E552: ผภฺฐก วสฟไวีดฯดู"
-
-#: ../hardcopy.c:473
-#, c-format
-msgid "Page %d"
-msgstr "ฦไภฬม๖ %d"
-
-#: ../hardcopy.c:597
-msgid "No text to be printed"
-msgstr "ภฮผโตษ ลุฝบฦฎฐก พ๘ฝภดฯดู"
-
-#: ../hardcopy.c:668
-#, c-format
-msgid "Printing page %d (%d%%)"
-msgstr "ฦไภฬม๖ %d ภฮผโม฿ (%d%%)"
-
-#: ../hardcopy.c:680
-#, c-format
-msgid " Copy %d of %d"
-msgstr " บนป็ %d / %d"
-
-#: ../hardcopy.c:733
-#, c-format
-msgid "Printed: %s"
-msgstr "ภฮผโตส: %s"
-
-#: ../hardcopy.c:740
-msgid "Printing aborted"
-msgstr "ภฮผโฐก ร๋ผาตวพ๚ฝภดฯดู."
-
-#: ../hardcopy.c:1365
-msgid "E455: Error writing to PostScript output file"
-msgstr "E455: ฦ๗ฝบฦฎฝบลฉธณฦฎ รโทยฦฤภฯฟก พต ผ๖ พ๘ฝภดฯดู."
-
-#: ../hardcopy.c:1747
-#, c-format
-msgid "E624: Can't open file \"%s\""
-msgstr "E624: \"%s\" ฦฤภฯภป ฟญ ผ๖ พ๘ฝภดฯดู"
-
-#: ../hardcopy.c:1756 ../hardcopy.c:2470
-#, c-format
-msgid "E457: Can't read PostScript resource file \"%s\""
-msgstr "E457: ฦ๗ฝบฦฎฝบลฉธณฦฎ ธฎผาฝบ ฦฤภฯ \"%s\"ภป(ธฆ) ภะภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../hardcopy.c:1772
-#, c-format
-msgid "E618: file \"%s\" is not a PostScript resource file"
-msgstr "E618: ฦฤภฯ \"%s\"ภบ(ดย) ฦ๗ฝบฦฎฝบลฉธณฦฎ ธฎผาฝบ ฦฤภฯภฬ พฦดีดฯดู"
-
-#: ../hardcopy.c:1788 ../hardcopy.c:1805 ../hardcopy.c:1844
-#, c-format
-msgid "E619: file \"%s\" is not a supported PostScript resource file"
-msgstr "E619: ฦฤภฯ \"%s\"ภบ(ดย) ม๖ฟ๘ตวดย ฦ๗ฝบฦฎฝบลฉธณฦฎ ธฎผาฝบ ฦฤภฯภฬ พฦดีดฯดู"
-
-#: ../hardcopy.c:1856
-#, c-format
-msgid "E621: \"%s\" resource file has wrong version"
-msgstr "E621: \"%s\" ธฎผาฝบ ฦฤภฯภบ น๖ภภฬ ภ฿ธ๘ตวพ๚ฝภดฯดู"
-
-#: ../hardcopy.c:2225
-msgid "E673: Incompatible multi-byte encoding and character set."
-msgstr "E673: ศฃศฏตวม๖ พสดย ดูม฿นฎภฺ ภฮฤฺต๙ฐ๚ นฎภฺผย."
-
-#: ../hardcopy.c:2238
-msgid "E674: printmbcharset cannot be empty with multi-byte encoding."
-msgstr "E674: printmbcharsetดย ดูม฿นฎภฺ ภฮฤฺต๙ฟกผญ นตๅฝร ผณมคตวพ๎พ฿ วีดฯดู."
-
-#: ../hardcopy.c:2254
-msgid "E675: No default font specified for multi-byte printing."
-msgstr "E675: ดูม฿นฎภฺ ภฮผโธฆ ภงวั ฑฒรภฬ ผณมคตวพ๎ ภึม๖ พสฝภดฯดู"
-
-#: ../hardcopy.c:2426
-msgid "E324: Can't open PostScript output file"
-msgstr "E324: ฦ๗ฝบฦฎฝบลฉธณฦฎ รโทยฦฤภฯภป ฟญ ผ๖ พ๘ฝภดฯดู"
-
-#: ../hardcopy.c:2458
-#, c-format
-msgid "E456: Can't open file \"%s\""
-msgstr "E456: \"%s\" ฦฤภฯภป ฟญ ผ๖ พ๘ฝภดฯดู"
-
-#: ../hardcopy.c:2583
-msgid "E456: Can't find PostScript resource file \"prolog.ps\""
-msgstr "E456: ฦ๗ฝบฦฎฝบลฉธณฦฎ ธฎผาฝบ ฦฤภฯ \"prolog.ps\"ธฆ รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../hardcopy.c:2593
-msgid "E456: Can't find PostScript resource file \"cidfont.ps\""
-msgstr "E456: ฦ๗ฝบฦฎฝบลฉธณฦฎ ธฎผาฝบ ฦฤภฯ \"cidfont.ps\"ธฆ รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../hardcopy.c:2622 ../hardcopy.c:2639 ../hardcopy.c:2665
-#, c-format
-msgid "E456: Can't find PostScript resource file \"%s.ps\""
-msgstr "E456: ฦ๗ฝบฦฎฝบลฉธณฦฎ ธฎผาฝบ ฦฤภฯ \"%s.ps\"ธฆ รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../hardcopy.c:2654
-#, c-format
-msgid "E620: Unable to convert to print encoding \"%s\""
-msgstr "E620: \"%s\" ภฮผโ ภฮฤฺต๙ภธทฮ บฏศฏวา ผ๖ พ๘ฝภดฯดู"
-
-#: ../hardcopy.c:2877
-msgid "Sending to printer..."
-msgstr "วมธฐลอทฮ บธณปดย ม฿..."
-
-#: ../hardcopy.c:2881
-msgid "E365: Failed to print PostScript file"
-msgstr "E365: ฦ๗ฝบฦฎฝบลฉธณฦฎ ฦฤภฯภป ภฮผโวา ผ๖ พ๘ฝภดฯดู"
-
-#: ../hardcopy.c:2883
-msgid "Print job sent."
-msgstr "ภฮผโภพ๗ภฬ ณกณตฝภดฯดู."
-
-#: ../if_cscope.c:85
-msgid "Add a new database"
-msgstr "ป๕ ตฅภฬลอบฃภฬฝบ ด๕วฯฑโ"
-
-#: ../if_cscope.c:87
-msgid "Query for a pattern"
-msgstr ""
-
-#: ../if_cscope.c:89
-msgid "Show this message"
-msgstr "ภฬ ธฝรม๖ บธภฬฑโ"
-
-#: ../if_cscope.c:91
-msgid "Kill a connection"
-msgstr "ฟฌฐแ ฒ๗ฑโ"
-
-#: ../if_cscope.c:93
-msgid "Reinit all connections"
-msgstr "ธ๐ต็ ฟฌฐแ ดูฝร รสฑโศญ"
-
-#: ../if_cscope.c:95
-msgid "Show connections"
-msgstr "ฟฌฐแ บธฟฉมึฑโ"
-
-#: ../if_cscope.c:101
-#, c-format
-msgid "E560: Usage: cs[cope] %s"
-msgstr "E560: ป็ฟ๋น: cs[cope] %s"
-
-#: ../if_cscope.c:225
-msgid "This cscope command does not support splitting the window.\n"
-msgstr "ภฬ cscope ธํทษภบ รข ณชดฉฑโธฆ ม๖ฟ๘วฯม๖ พสฝภดฯดู.\n"
-
-#: ../if_cscope.c:266
-msgid "E562: Usage: cstag <ident>"
-msgstr "E562: ป็ฟ๋น: cstag <ident>"
-
-#: ../if_cscope.c:313
-msgid "E257: cstag: tag not found"
-msgstr "E257: cstag: ลยฑืธฆ รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../if_cscope.c:461
-#, c-format
-msgid "E563: stat(%s) error: %d"
-msgstr "E563: stat(%s) ฟกทฏ: %d"
-
-#: ../if_cscope.c:551
-#, c-format
-msgid "E564: %s is not a directory or a valid cscope database"
-msgstr "E564: %sภบ(ดย) ต๐ทบลไธฎตต ศคภบ cscope ตฅภฬลอบฃภฬฝบฐก พฦดีดฯดู"
-
-#: ../if_cscope.c:566
-#, c-format
-msgid "Added cscope database %s"
-msgstr "cscope ตฅภฬลอบฃภฬฝบ %sฟก ด๕ว฿ฝภดฯดู."
-
-#: ../if_cscope.c:616
-#, c-format
-msgid "E262: error reading cscope connection %<PRId64>"
-msgstr "E262: cscope ฟฌฐแ %<PRId64> ภะฑโ ฟกทฏ"
-
-#: ../if_cscope.c:711
-msgid "E561: unknown cscope search type"
-msgstr "E561: ธ๐ธฃดย cscope รฃฑโ วฝฤ"
-
-#: ../if_cscope.c:752 ../if_cscope.c:789
-msgid "E566: Could not create cscope pipes"
-msgstr "E566: cscope ฦฤภฬวมธฆ ธธต้ ผ๖ พ๘ฝภดฯดู"
-
-#: ../if_cscope.c:767
-msgid "E622: Could not fork for cscope"
-msgstr "E622: cscopeธฆ forkวา ผ๖ พ๘ฝภดฯดู"
-
-#: ../if_cscope.c:849
-#, fuzzy
-msgid "cs_create_connection setpgid failed"
-msgstr "cs_create_connection ฝววเภฬ ฝวฦะว฿ฝภดฯดู"
-
-#: ../if_cscope.c:853 ../if_cscope.c:889
-msgid "cs_create_connection exec failed"
-msgstr "cs_create_connection ฝววเภฬ ฝวฦะว฿ฝภดฯดู"
-
-#: ../if_cscope.c:863 ../if_cscope.c:902
-msgid "cs_create_connection: fdopen for to_fp failed"
-msgstr "cs_create_connection: to_fpฟก ด๋วั fdopen ฝวฦะ"
-
-#: ../if_cscope.c:865 ../if_cscope.c:906
-msgid "cs_create_connection: fdopen for fr_fp failed"
-msgstr "cs_create_connection: fr_fpฟก ด๋วั fdopen ฝวฦะ"
-
-#: ../if_cscope.c:890
-msgid "E623: Could not spawn cscope process"
-msgstr "E623: cscope วมทฮผผฝบธฆ spawnวา ผ๖ พ๘ฝภดฯดู"
-
-#: ../if_cscope.c:932
-msgid "E567: no cscope connections"
-msgstr "E567: cscope ฟฌฐแภฬ พ๘ฝภดฯดู"
-
-#: ../if_cscope.c:1009
-#, c-format
-msgid "E469: invalid cscopequickfix flag %c for %c"
-msgstr ""
-
-#: ../if_cscope.c:1058
-#, c-format
-msgid "E259: no matches found for cscope query %s of %s"
-msgstr ""
-
-#: ../if_cscope.c:1142
-msgid "cscope commands:\n"
-msgstr "cscope ธํทษ:\n"
-
-#: ../if_cscope.c:1150
-#, c-format
-msgid "%-5s: %s%*s (Usage: %s)"
-msgstr "%-5s: %s%*s (ป็ฟ๋น: %s)"
-
-#: ../if_cscope.c:1155
-msgid ""
-"\n"
-" c: Find functions calling this function\n"
-" d: Find functions called by this function\n"
-" e: Find this egrep pattern\n"
-" f: Find this file\n"
-" g: Find this definition\n"
-" i: Find files #including this file\n"
-" s: Find this C symbol\n"
-" t: Find this text string\n"
-msgstr ""
-"\n"
-" c: ภฬ วิผ๖ธฆ บฮธฃดย วิผ๖ต้ รฃฑโ\n"
-" d: ภฬ วิผ๖ฟก ภววุ บาทมม๖ดย วิผ๖ต้ รฃฑโ\n"
-" e: ภฬ egrep ฦะลฯ รฃฑโ\n"
-" f: ภฬ ฦฤภฯ รฃฑโ\n"
-" g: ภฬ มคภว รฃฑโ\n"
-" i: ภฬ ฦฤภฯภป ฦ๗วิวฯดย ฦฤภฯต้ รฃฑโ\n"
-" s: ภฬ C ฝษบผ รฃฑโ\n"
-" t: ภฬ นฎภฺฟญ รฃฑโ\n"
-
-#: ../if_cscope.c:1226
-msgid "E568: duplicate cscope database not added"
-msgstr "E568: ม฿บนตศ cscope ตฅภฬลอบฃภฬฝบดย ด๕วุม๖ม๖ พสพาฝภดฯดู"
-
-#: ../if_cscope.c:1335
-#, c-format
-msgid "E261: cscope connection %s not found"
-msgstr "E261: cscope ฟฌฐแ %sภป(ธฆ) รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../if_cscope.c:1364
-#, c-format
-msgid "cscope connection %s closed"
-msgstr "cscope ฟฌฐแ %sภฬ(ฐก) ดว๛ฝภดฯดู"
-
-#. should not reach here
-#: ../if_cscope.c:1486
-msgid "E570: fatal error in cs_manage_matches"
-msgstr "E570: cs_manage_matchesฟก ฝษฐขวั ฟกทฏ"
-
-#: ../if_cscope.c:1693
-#, c-format
-msgid "Cscope tag: %s"
-msgstr "Cscope ลยฑื: %s"
-
-#: ../if_cscope.c:1711
-msgid ""
-"\n"
-" # line"
-msgstr ""
-"\n"
-" # มู"
-
-#: ../if_cscope.c:1713
-msgid "filename / context / line\n"
-msgstr "ฦฤภฯ ภฬธง / ฤลุฝบฦฎ / มู\n"
-
-#: ../if_cscope.c:1809
-#, c-format
-msgid "E609: Cscope error: %s"
-msgstr "E609: Cscope ฟกทฏ: %s"
-
-#: ../if_cscope.c:2053
-msgid "All cscope databases reset"
-msgstr "ธ๐ต็ cscope ตฅภฬลอบฃภฬฝบ ธฎผย"
-
-#: ../if_cscope.c:2123
-msgid "no cscope connections\n"
-msgstr "cscope ฟฌฐแภฬ พ๘ฝภดฯดู\n"
-
-#: ../if_cscope.c:2126
-msgid " # pid database name prepend path\n"
-msgstr " # pid ตฅภฬลอบฃภฬฝบ ภฬธง prepend path\n"
-
-#: ../main.c:144
-msgid "Unknown option argument"
-msgstr "ธ๐ธฃดย ฟษผว ภฮภฺ"
-
-#: ../main.c:146
-msgid "Too many edit arguments"
-msgstr "ณสนซ ธนภบ ฦํม ภฮภฺ"
-
-#: ../main.c:148
-msgid "Argument missing after"
-msgstr "ตฺฟก ภฮภฺฐก พ๘ภฝ"
-
-#: ../main.c:150
-msgid "Garbage after option argument"
-msgstr "ฟษผว ภฮภฺ ตฺฟก พฒทนฑโ ฐช"
-
-#: ../main.c:152
-msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"
-msgstr "ณสนซ ธนภบ \"+command\" \"-c command\" ศคภบ \"--cmd command\" ภฮภฺ"
-
-#: ../main.c:154
-msgid "Invalid argument for"
-msgstr ""
-
-#: ../main.c:294
-#, c-format
-msgid "%d files to edit\n"
-msgstr "%d ฦฤภฯภป ฐํฤกฑโ\n"
-
-#: ../main.c:1342
-msgid "Attempt to open script file again: \""
-msgstr "ฝบลฉธณฦฎ ฦฤภฯภป ดูฝร ฟญทมฐํ ฝรตต: \""
-
-#: ../main.c:1350
-msgid "Cannot open for reading: \""
-msgstr "ภะฑโ ภงวุ ฟญ ผ๖ พ๘ภฝ: \""
-
-#: ../main.c:1393
-msgid "Cannot open for script output: \""
-msgstr "ฝบลฉธณฦฎ รโทยภป ฟญ ผ๖ พ๘ภฝ: \""
-
-#: ../main.c:1622
-msgid "Vim: Warning: Output is not to a terminal\n"
-msgstr "บ๖: ฐๆฐํ: ลอนฬณฮทฮ รโทยวา ผ๖ พ๘ฝภดฯดู\n"
-
-#: ../main.c:1624
-msgid "Vim: Warning: Input is not from a terminal\n"
-msgstr "บ๖: ฐๆฐํ: ลอนฬณฮทฮ บฮลอ ภิทยนภป ผ๖ พ๘ฝภดฯดู\n"
-
-#. just in case..
-#: ../main.c:1891
-msgid "pre-vimrc command line"
-msgstr "pre-vimrc ธํทษ วเ"
-
-#: ../main.c:1964
-#, c-format
-msgid "E282: Cannot read from \"%s\""
-msgstr "E282: \"%s\"ฟกผญ ภะภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../main.c:2149
-msgid ""
-"\n"
-"More info with: \"vim -h\"\n"
-msgstr ""
-"\n"
-"ด๕ ธนภบ มคบธธฆ ฟ๘วฯฝรธ้: \"vim -h\"\n"
-
-#: ../main.c:2178
-msgid "[file ..] edit specified file(s)"
-msgstr "[ฦฤภฯ ..] มึพ๎ม๘ ฦฤภฯ ฐํฤกฑโ"
-
-#: ../main.c:2179
-msgid "- read text from stdin"
-msgstr "- วฅมุภิทยฟกผญ ลุฝบฦฎ ภะฑโ"
-
-#: ../main.c:2180
-msgid "-t tag edit file where tag is defined"
-msgstr "-t tag ลยฑืฐก มคภวตศ ภงฤกฟกผญ ฦฤภฯ ฐํฤกฑโ"
-
-#: ../main.c:2181
-msgid "-q [errorfile] edit file with first error"
-msgstr "-q [ฟกทฏฦฤภฯ] รน น๘ยฐ ฟกทฏฐก ณญ ฦฤภฯ ฐํฤกฑโ"
-
-#: ../main.c:2187
-msgid ""
-"\n"
-"\n"
-"usage:"
-msgstr ""
-"\n"
-"\n"
-"ป็ฟ๋น:"
-
-#: ../main.c:2189
-msgid " vim [arguments] "
-msgstr " vim [ภฮภฺ] "
-
-#: ../main.c:2193
-msgid ""
-"\n"
-" or:"
-msgstr ""
-"\n"
-" ศคภบ:"
-
-#: ../main.c:2196
-msgid ""
-"\n"
-"\n"
-"Arguments:\n"
-msgstr ""
-"\n"
-"\n"
-"ภฮภฺ:\n"
-
-#: ../main.c:2197
-msgid "--\t\t\tOnly file names after this"
-msgstr "--\t\t\tภฬ ตฺฟกดย ฦฤภฯ ภฬธงธธ"
-
-#: ../main.c:2199
-msgid "--literal\t\tDon't expand wildcards"
-msgstr "--literal\t\tฟอภฯตๅฤซตๅธฆ ศฎภๅวฯม๖ พสภฝ"
-
-#: ../main.c:2201
-msgid "-v\t\t\tVi mode (like \"vi\")"
-msgstr "-v\t\t\tVi ป๓ลย (\"vi\"ฟอ ฐฐภฝ)"
-
-#: ../main.c:2202
-msgid "-e\t\t\tEx mode (like \"ex\")"
-msgstr "-e\t\t\tEx ป๓ลย (\"ex\"ฟอ ฐฐภฝ)"
-
-#: ../main.c:2203
-msgid "-E\t\t\tImproved Ex mode"
-msgstr ""
-
-#: ../main.c:2204
-msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")"
-msgstr "-s\t\t\tมถฟ๋วั (น่ฤก) ป๓ลย (\"ex\"ธธ)"
-
-#: ../main.c:2205
-msgid "-d\t\t\tDiff mode (like \"vimdiff\")"
-msgstr "-d\t\t\tDiff ป๓ลย (\"vimdiff\"ฟอ ฐฐภฝ)"
-
-#: ../main.c:2206
-msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
-msgstr "-y\t\t\tฝฌฟ๎ ป๓ลย (\"evim\"ฐ๚ ฐฐภฝ, modeless)"
-
-#: ../main.c:2207
-msgid "-R\t\t\tReadonly mode (like \"view\")"
-msgstr "-R\t\t\tภะฑโ ภฟ๋ ป๓ลย (\"view\"ฟอ ฐฐภฝ)"
-
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tมฆวัตศ ป๓ลย (\"rvim\"ฐ๚ ฐฐภฝ)"
-
-#: ../main.c:2209
-msgid "-m\t\t\tModifications (writing files) not allowed"
-msgstr "-m\t\t\tผ๖มค(ฦฤภฯ พฒฑโ)ภฬ วใฟ๋ตวม๖ พสภฝ"
-
-#: ../main.c:2210
-msgid "-M\t\t\tModifications in text not allowed"
-msgstr "-M\t\t\tลุฝบฦฎ ผ๖มคภฬ วใฟ๋ตวม๖ พสภฝ"
-
-#: ../main.c:2211
-msgid "-b\t\t\tBinary mode"
-msgstr "-b\t\t\tภฬม๘ ป๓ลย"
-
-#: ../main.c:2212
-msgid "-l\t\t\tLisp mode"
-msgstr "-l\t\t\tธฎฝบวม ป๓ลย"
-
-#: ../main.c:2213
-msgid "-C\t\t\tCompatible with Vi: 'compatible'"
-msgstr "-C\t\t\tVi ศฃศฏ: 'compatible'"
-
-#: ../main.c:2214
-msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'"
-msgstr "-N\t\t\tViฟอ ศฃศฏตวม๖ พสภฝ: 'nocompatible'"
-
-#: ../main.c:2215
-msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]"
-msgstr ""
-
-#: ../main.c:2216
-msgid "-D\t\t\tDebugging mode"
-msgstr "-D\t\t\tต๐น๖ฑ๋ ป๓ลย"
-
-#: ../main.c:2217
-msgid "-n\t\t\tNo swap file, use memory only"
-msgstr "-n\t\t\tฝบฟา ฦฤภฯ พ๘ภฬ ธธ๐ธฎธธ ป็ฟ๋"
-
-#: ../main.c:2218
-msgid "-r\t\t\tList swap files and exit"
-msgstr "-r\t\t\tฝบฟา ฦฤภฯ ธ๑ทฯภป วฅฝรวั ตฺ ณกณปฑโ"
-
-#: ../main.c:2219
-msgid "-r (with file name)\tRecover crashed session"
-msgstr "-r (ฦฤภฯ ภฬธงฐ๚ วิฒฒ)\tฦฤผีตวพ๚ด๘ ผผผว บนฑธ"
-
-#: ../main.c:2220
-msgid "-L\t\t\tSame as -r"
-msgstr "-L\t\t\t-rฐ๚ ฐฐภฝ"
-
-#: ../main.c:2221
-msgid "-A\t\t\tstart in Arabic mode"
-msgstr "-A\t\t\tArabic ธ๐ตๅทฮ ฝรภ"
-
-#: ../main.c:2222
-msgid "-H\t\t\tStart in Hebrew mode"
-msgstr "-H\t\t\tHebrew ธ๐ตๅทฮ ฝรภ"
-
-#: ../main.c:2223
-msgid "-F\t\t\tStart in Farsi mode"
-msgstr "-F\t\t\tFarsi ธ๐ตๅทฮ ฝรภ"
-
-#: ../main.c:2224
-msgid "-T <terminal>\tSet terminal type to <terminal>"
-msgstr "-T <terminal>\tลอนฬณฮ มพท๙ธฆ <terminal>ทฮ ผณมค"
-
-#: ../main.c:2225
-msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc"
-msgstr "-u <vimrc>\t\t.vimrc ด๋ฝล <vimrc>ธฆ ป็ฟ๋"
-
-#: ../main.c:2226
-msgid "--noplugin\t\tDon't load plugin scripts"
-msgstr "--noplugin\t\tวรทฏฑืภฮ ฝบลฉธณฦฎธฆ บาทฏต้ภฬม๖ พสภฝ"
-
-#: ../main.c:2227
-msgid "-p[N]\t\tOpen N tab pages (default: one for each file)"
-msgstr "-p[N]\t\tNฐณภว ลว ฟญฑโ (ฑโบป: ฦฤภฯบฐทฮ วฯณช)"
-
-#: ../main.c:2228
-msgid "-o[N]\t\tOpen N windows (default: one for each file)"
-msgstr "-o[N]\t\tNฐณภว รข ฟญฑโ (ฑโบป: ฦฤภฯบฐทฮ วฯณช)"
-
-#: ../main.c:2229
-msgid "-O[N]\t\tLike -o but split vertically"
-msgstr "-O[N]\t\t-oฟอ ฐฐม๖ธธ รขภป ผ๖ม๗ภธทฮ ณชดฉฑโ"
-
-#: ../main.c:2230
-msgid "+\t\t\tStart at end of file"
-msgstr "+\t\t\tฦฤภฯ ธถม๖ธทฟกผญ ฝรภ"
-
-#: ../main.c:2231
-msgid "+<lnum>\t\tStart at line <lnum>"
-msgstr "+<lnum>\t\t<lnum> มูฟกผญ ฝรภ"
-
-#: ../main.c:2232
-msgid "--cmd <command>\tExecute <command> before loading any vimrc file"
-msgstr "--cmd <ธํทษ>\tvimrc ฦฤภฯภป ภะฑโ ภฟก <ธํทษ>ภป ฝววเ"
-
-#: ../main.c:2233
-msgid "-c <command>\t\tExecute <command> after loading the first file"
-msgstr "-c <ธํทษ>\t\tรนยฐ ฦฤภฯภป ภะภบ ตฺ <ธํทษ>ภป ฝววเ"
-
-#: ../main.c:2235
-msgid "-S <session>\t\tSource file <session> after loading the first file"
-msgstr "-S <ผผผว>\t\tรนยฐ ฦฤภฯภป ภะภบ ตฺ <ผผผว> ฦฤภฯ บาทฏ ต้ภฬฑโ"
-
-#: ../main.c:2236
-msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>"
-msgstr "-s <scriptin>\t<scriptin> ฦฤภฯฟกผญ Normal ป๓ลย ธํทษ ภะฑโ"
-
-#: ../main.c:2237
-msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>"
-msgstr "-w <scriptout>\tธ๐ต็ ภิทยตศ ธํทษภป <scriptout> ฦฤภฯฟก ร฿ฐก"
-
-#: ../main.c:2238
-msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>"
-msgstr "-W <scriptout>\tธ๐ต็ ภิทยตศ ธํทษภป <scriptout> ฦฤภฯฟก ภ๚ภๅ"
-
-#: ../main.c:2240
-msgid "--startuptime <file>\tWrite startup timing messages to <file>"
-msgstr "--startuptime <file>\tstartup timing ธฝรม๖ธฆ <file>ฟก ภ๚ภๅ"
-
-#: ../main.c:2242
-msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
-msgstr "-i <viminfo>\t\t.viminfo ด๋ฝล <viminfo>ธฆ ป็ฟ๋"
-
-#: ../main.c:2243
-msgid "-h or --help\tPrint Help (this message) and exit"
-msgstr "-h ศคภบ --help\tตตฟ๒ธป(ภฬ ธฝรม๖)ภป รโทยวั ตฺ ณกณปฑโ"
-
-#: ../main.c:2244
-msgid "--version\t\tPrint version information and exit"
-msgstr "--version\t\tฦว มคบธธฆ รโทยวั ตฺ ณกณปฑโ"
-
-#: ../mark.c:676
-msgid "No marks set"
-msgstr "ผณมคตศ ธถลฉฐก พ๘ฝภดฯดู"
-
-#: ../mark.c:678
-#, c-format
-msgid "E283: No marks matching \"%s\""
-msgstr "E283: \"%s\"ฟก ธยดย ธถลฉฐก พ๘ฝภดฯดู"
-
-#. Highlight title
-#: ../mark.c:687
-msgid ""
-"\n"
-"mark line col file/text"
-msgstr ""
-"\n"
-"ธถลฉ ถ๓ภฮ col ฦฤภฯ/ลุฝบฦฎ"
-
-#. Highlight title
-#: ../mark.c:789
-msgid ""
-"\n"
-" jump line col file/text"
-msgstr ""
-"\n"
-" มกวม ถ๓ภฮ col ฦฤภฯ/ลุฝบฦฎ"
-
-#. Highlight title
-#: ../mark.c:831
-msgid ""
-"\n"
-"change line col text"
-msgstr ""
-
-#: ../mark.c:1238
-msgid ""
-"\n"
-"# File marks:\n"
-msgstr ""
-"\n"
-"# ฦฤภฯ ธถลฉ:\n"
-
-#. Write the jumplist with -'
-#: ../mark.c:1271
-msgid ""
-"\n"
-"# Jumplist (newest first):\n"
-msgstr ""
-"\n"
-"# มกวมธ๑ทฯ (ป๕ฐอภฬ ธีภ๚):\n"
-
-#: ../mark.c:1352
-msgid ""
-"\n"
-"# History of marks within files (newest to oldest):\n"
-msgstr ""
-"\n"
-"# ฦฤภฯณปภว ธถลฉ ศ๗ฝบลไธฎ (ป๕ฐอบฮลอ ฟภทกตศ ผ๘):\n"
-
-#: ../mark.c:1431
-msgid "Missing '>'"
-msgstr "'>'ภฬ พ๘ฝภดฯดู"
-
-#: ../memfile.c:426
-msgid "E293: block was not locked"
-msgstr "E293: ฑธฟชภฬ ภแฑลม๖ม๖ พสพาฝภดฯดู"
-
-#: ../memfile.c:799
-msgid "E294: Seek error in swap file read"
-msgstr "E294: ฝบฟา ฦฤภฯภป ภะฑโ ภงวุ ฦฏมค ภงฤกทฮ ฐฅ ผ๖ พ๘ฝภดฯดู"
-
-#: ../memfile.c:803
-msgid "E295: Read error in swap file"
-msgstr "E295: ฝบฟา ฦฤภฯภป ภะภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../memfile.c:849
-msgid "E296: Seek error in swap file write"
-msgstr "E296: ฝบฟา ฦฤภฯภป พฒฑโ ภงวุ ฦฏมค ภงฤกทฮ ฐฅ ผ๖ พ๘ฝภดฯดู"
-
-#: ../memfile.c:865
-msgid "E297: Write error in swap file"
-msgstr "E297: ฝบฟา ฦฤภฯภป พต ผ๖ พ๘ฝภดฯดู"
-
-#: ../memfile.c:1036
-msgid "E300: Swap file already exists (symlink attack?)"
-msgstr "E300: ฝบฟา ฦฤภฯภฬ ภฬนฬ มธภ็วีดฯดู (symlink ฐ๘ฐ?)"
-
-#: ../memline.c:318
-msgid "E298: Didn't get block nr 0?"
-msgstr "E298: ฑธฟช น๘ศฃ 0ภป พ๒ม๖ ธ๘ว฿ณชฟไ?"
-
-#: ../memline.c:361
-msgid "E298: Didn't get block nr 1?"
-msgstr "E298: ฑธฟช น๘ศฃ 1ภป พ๒ม๖ ธ๘ว฿ณชฟไ?"
-
-#: ../memline.c:377
-msgid "E298: Didn't get block nr 2?"
-msgstr "E298: ฑธฟช น๘ศฃ 2ธฆ พ๒ม๖ ธ๘ว฿ณชฟไ?"
-
-#. could not (re)open the swap file, what can we do????
-#: ../memline.c:465
-msgid "E301: Oops, lost the swap file!!!"
-msgstr "E301: ภธภน, ฝบฟา ฦฤภฯภป ภาพ๎น๖ทศฝภดฯดู!!!"
-
-#: ../memline.c:477
-msgid "E302: Could not rename swap file"
-msgstr "E302: ฝบฟา ฦฤภฯ ภฬธงภป นูฒ ผ๖ พ๘ฝภดฯดู"
-
-#: ../memline.c:554
-#, c-format
-msgid "E303: Unable to open swap file for \"%s\", recovery impossible"
-msgstr "E303: \"%s\"ภว ฝบฟา ฦฤภฯภป ฟญ ผ๖ พ๘พ๎ผญ บนฑธดย บาฐกดษวีดฯดู"
-
-#: ../memline.c:666
-msgid "E304: ml_upd_block0(): Didn't get block 0??"
-msgstr "E304: ml_upd_block0(): ฑธฟช 0ภป พ๒ม๖ ธ๘ว฿ณชฟไ??"
-
-#. no swap files found
-#: ../memline.c:830
-#, c-format
-msgid "E305: No swap file found for %s"
-msgstr "E305: %sภว ฝบฟา ฦฤภฯภป รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../memline.c:839
-msgid "Enter number of swap file to use (0 to quit): "
-msgstr "ป็ฟ๋วา ฝบฟา ฦฤภฯ น๘ศฃธฆ ภิทยวฯฝสฝรฟภ (0ภบ ณกณปฑโ): "
-
-#: ../memline.c:879
-#, c-format
-msgid "E306: Cannot open %s"
-msgstr "E306: %sภป(ธฆ) ฟญ ผ๖ พ๘ฝภดฯดู"
-
-#: ../memline.c:897
-msgid "Unable to read block 0 from "
-msgstr "Unable to read block 0 from "
-
-#: ../memline.c:900
-msgid ""
-"\n"
-"Maybe no changes were made or Vim did not update the swap file."
-msgstr ""
-"\n"
-"พ๎ถฒ ผ๖มคตต พ๘พ๚ฐลณช บ๖ภฬ ฝบฟา ฦฤภฯภป ฐปฝลวฯม๖ พสภบ ฐอ ฐฐฝภดฯดู."
-
-#: ../memline.c:909
-msgid " cannot be used with this version of Vim.\n"
-msgstr " cannot be used with this version of Vim.\n"
-
-#: ../memline.c:911
-msgid "Use Vim version 3.0.\n"
-msgstr "บ๖ 3.0 ฦวภป ป็ฟ๋วฯฝสฝรฟภ.\n"
-
-#: ../memline.c:916
-#, c-format
-msgid "E307: %s does not look like a Vim swap file"
-msgstr "E307: %sภบ(ดย) บ๖ ฝบฟา ฦฤภฯภฬ พฦดั ฐอ ฐฐฝภดฯดู"
-
-#: ../memline.c:922
-msgid " cannot be used on this computer.\n"
-msgstr " ภฬ ฤฤวปลอฟกผญดย ป็ฟ๋ตษ ผ๖ พ๘ฝภดฯดู.\n"
-
-#: ../memline.c:924
-msgid "The file was created on "
-msgstr ""
-
-#: ../memline.c:928
-msgid ""
-",\n"
-"or the file has been damaged."
-msgstr ""
-
-#: ../memline.c:945
-msgid " has been damaged (page size is smaller than minimum value).\n"
-msgstr ""
-
-#: ../memline.c:974
-#, c-format
-msgid "Using swap file \"%s\""
-msgstr "ฝบฟา ฦฤภฯ \"%s\"ภป(ธฆ) ป็ฟ๋วีดฯดู"
-
-#: ../memline.c:980
-#, c-format
-msgid "Original file \"%s\""
-msgstr "ฟ๘ทก ฦฤภฯ \"%s\""
-
-#: ../memline.c:995
-msgid "E308: Warning: Original file may have been changed"
-msgstr "E308: ฐๆฐํ: ฟ๘ทก ฦฤภฯภฬ นูฒ๎พ๚ฝภดฯดู"
-
-#: ../memline.c:1061
-#, c-format
-msgid "E309: Unable to read block 1 from %s"
-msgstr "E309: %sภว ฑธฟช 1ภป ภะภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../memline.c:1065
-msgid "???MANY LINES MISSING"
-msgstr "???ธนภบ มูภป ภาพ๎น๖ธฒ"
-
-#: ../memline.c:1076
-msgid "???LINE COUNT WRONG"
-msgstr "???มู น๘ศฃฐก ภ฿ธ๘ตวพ๚ฝภดฯดู"
-
-#: ../memline.c:1082
-msgid "???EMPTY BLOCK"
-msgstr "???บ๓ ฑธฟช"
-
-#: ../memline.c:1103
-msgid "???LINES MISSING"
-msgstr "???มูภป ภาพ๎น๖ธฒ"
-
-#: ../memline.c:1128
-#, c-format
-msgid "E310: Block 1 ID wrong (%s not a .swp file?)"
-msgstr "E310: ฑธฟช 1ภว IDฐก ภ฿ธ๘ตวพ๚ฝภดฯดู (%sภฬ(ฐก) .swp ฦฤภฯภฬ พฦดัฐก?)"
-
-#: ../memline.c:1133
-msgid "???BLOCK MISSING"
-msgstr "???ฑธฟช ภาพ๎น๖ธฒ"
-
-#: ../memline.c:1147
-msgid "??? from here until ???END lines may be messed up"
-msgstr "??? ฟฉฑโบฮลอ ???ณกฑ๎ม๖ภว มูภฬ ผฏฟดฝภดฯดู"
-
-#: ../memline.c:1164
-msgid "??? from here until ???END lines may have been inserted/deleted"
-msgstr "??? ฟฉฑโบฮลอ ???ณกฑ๎ม๖ภว มูภฬ ณขฟ๖ม๖ฐลณช ม๖ฟ๖มฎ น๖ธฐ ฐอ ฐฐฝภดฯดู"
-
-#: ../memline.c:1181
-msgid "???END"
-msgstr "???ณก"
-
-#: ../memline.c:1238
-msgid "E311: Recovery Interrupted"
-msgstr "E311: บนฑธ ม฿ดตวพ๚ฝภดฯดู"
-
-#: ../memline.c:1243
-msgid ""
-"E312: Errors detected while recovering; look for lines starting with ???"
-msgstr "E312: บนฑธ ตตม฿ ฟกทฏ ปฐๅฝภดฯดู; ???ทฮ ฝรภวฯดย มูภป รฃพฦบธฝสฝรฟภ"
-
-#: ../memline.c:1245
-msgid "See \":help E312\" for more information."
-msgstr "ด๕ ธนภบ มคบธธฆ บธทมธ้ \":help E312\"ธฆ ภิทยวฯผผฟไ."
-
-#: ../memline.c:1249
-msgid "Recovery completed. You should check if everything is OK."
-msgstr "บนฑธฐก ณกณตฝภดฯดู. ธ๐ต็ ฐิ มคป๓ภฮ ม๖ ศฎภฮวุ บธผลพ฿ธธ วีดฯดู."
-
-#: ../memline.c:1251
-msgid ""
-"\n"
-"(You might want to write out this file under another name\n"
-msgstr ""
-"\n"
-"(พ๎ยผธ้ ดูธฅ ภฬธงภธทฮ ภ๚ภๅวฯฐํ ฝอภธฝว ม๖ตต ธ๐ธฃฐฺฝภดฯดู\n"
-
-#: ../memline.c:1252
-msgid "and run diff with the original file to check for changes)"
-msgstr "ฑืธฎฐํ นูฒ๏ ณปฟ๋ภป ศฎภฮวฯทมธ้ ฟ๘ทก ฦฤภฯฟก ด๋วุ diffธฆ ฝววเวฯผผฟไ)"
-
-#: ../memline.c:1254
-msgid "Recovery completed. Buffer contents equals file contents."
-msgstr "บนฑธฐก ณกณตฝภดฯดู. น๖ฦภว ณปฟ๋ภฬ ฦฤภฯ ณปฟ๋ฐ๚ ฐฐฝภดฯดู."
-
-#: ../memline.c:1255
-msgid ""
-"\n"
-"You may want to delete the .swp file now.\n"
-"\n"
-msgstr ""
-"\n"
-"ภฬมฆ .swp ฦฤภฯภป ม๖ฟ์ผลตต ตหดฯดู.\n"
-"\n"
-
-#. use msg() to start the scrolling properly
-#: ../memline.c:1327
-msgid "Swap files found:"
-msgstr "ฝบฟา ฦฤภฯภป รฃพาภฝ:"
-
-#: ../memline.c:1446
-msgid " In current directory:\n"
-msgstr " ว๖ภ็ ต๐ทบลไธฎฟก:\n"
-
-#: ../memline.c:1448
-msgid " Using specified name:\n"
-msgstr " ธํฝรตศ ภฬธงภป ป็ฟ๋:\n"
-
-#: ../memline.c:1450
-msgid " In directory "
-msgstr " In directory "
-
-#: ../memline.c:1465
-msgid " -- none --\n"
-msgstr " -- พ๘ภฝ --\n"
-
-#: ../memline.c:1527
-msgid " owned by: "
-msgstr " ผาภฏภฺ: "
-
-#: ../memline.c:1529
-msgid " dated: "
-msgstr " ณฏยฅ: "
-
-#: ../memline.c:1532 ../memline.c:3231
-msgid " dated: "
-msgstr " ณฏยฅ: "
-
-#: ../memline.c:1548
-msgid " [from Vim version 3.0]"
-msgstr " [บ๖ 3.0 ฦวภว ฐอ]"
-
-#: ../memline.c:1550
-msgid " [does not look like a Vim swap file]"
-msgstr " [บ๖ ฝบฟา ฦฤภฯทฮ บธภฬม๖ พสฝภดฯดู]"
-
-#: ../memline.c:1552
-msgid " file name: "
-msgstr " ฦฤภฯ ภฬธง: "
-
-#: ../memline.c:1558
-msgid ""
-"\n"
-" modified: "
-msgstr ""
-"\n"
-" ผ๖มค: "
-
-#: ../memline.c:1559
-msgid "YES"
-msgstr "ฟน"
-
-#: ../memline.c:1559
-msgid "no"
-msgstr "พฦดฯฟภ"
-
-#: ../memline.c:1562
-msgid ""
-"\n"
-" user name: "
-msgstr ""
-"\n"
-" ป็ฟ๋ภฺ ภฬธง: "
-
-#: ../memline.c:1568
-msgid " host name: "
-msgstr " ศฃฝบฦฎ ภฬธง: "
-
-#: ../memline.c:1570
-msgid ""
-"\n"
-" host name: "
-msgstr ""
-"\n"
-" ศฃฝบฦฎ ภฬธง: "
-
-#: ../memline.c:1575
-msgid ""
-"\n"
-" process ID: "
-msgstr ""
-"\n"
-" วมทฮผผฝบ ID: "
-
-#: ../memline.c:1579
-msgid " (still running)"
-msgstr " (พฦม๗ ฝววเม฿)"
-
-#: ../memline.c:1586
-msgid ""
-"\n"
-" [not usable on this computer]"
-msgstr ""
-"\n"
-" [ภฬ ฤฤวปลอฟกผญดย ป็ฟ๋วา ผ๖ พ๘ภฝ]"
-
-#: ../memline.c:1590
-msgid " [cannot be read]"
-msgstr " [ภะภป ผ๖ พ๘ภฝ]"
-
-#: ../memline.c:1593
-msgid " [cannot be opened]"
-msgstr " [ฟญ ผ๖ พ๘ภฝ]"
-
-#: ../memline.c:1698
-msgid "E313: Cannot preserve, there is no swap file"
-msgstr "E313: บธมธวา ผ๖ พ๘ฝภดฯดู, ฝบฟา ฦฤภฯภฬ พ๘ฝภดฯดู"
-
-#: ../memline.c:1747
-msgid "File preserved"
-msgstr "ฦฤภฯภฬ บธมธตวพ๚ฝภดฯดู"
-
-#: ../memline.c:1749
-msgid "E314: Preserve failed"
-msgstr "E314: ฦฤภฯ บธมธภป ฝวฦะว฿ฝภดฯดู"
-
-#: ../memline.c:1819
-#, c-format
-msgid "E315: ml_get: invalid lnum: %<PRId64>"
-msgstr "E315: ml_get: ภ฿ธ๘ตศ lnum: %<PRId64>"
-
-#: ../memline.c:1851
-#, c-format
-msgid "E316: ml_get: cannot find line %<PRId64>"
-msgstr "E316: ml_get: %<PRId64> มูภป รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../memline.c:2236
-msgid "E317: pointer block id wrong 3"
-msgstr "E317: ภ฿ธ๘ตศ ฦ๗ภฮลอ ฑธฟช id 3"
-
-#: ../memline.c:2311
-msgid "stack_idx should be 0"
-msgstr "stack_idxดย 0ฟฉพ฿ธธ วีดฯดู"
-
-#: ../memline.c:2369
-msgid "E318: Updated too many blocks?"
-msgstr "E318: ณสนซ ธนภบ ฑธฟชภฬ ฐปฝลตวพ๚ณชฟไ?"
-
-#: ../memline.c:2511
-msgid "E317: pointer block id wrong 4"
-msgstr "E317: ภ฿ธ๘ตศ ฦ๗ภฮลอ ฑธฟช id 4"
-
-#: ../memline.c:2536
-msgid "deleted block 1?"
-msgstr "ฑธฟช 1ภฬ ม๖ฟ๖มณณชฟไ?"
-
-#: ../memline.c:2707
-#, c-format
-msgid "E320: Cannot find line %<PRId64>"
-msgstr "E320: %<PRId64> มูภป รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../memline.c:2916
-msgid "E317: pointer block id wrong"
-msgstr "E317: ภ฿ธ๘ตศ ฦ๗ภฮลอ ฑธฟช id"
-
-#: ../memline.c:2930
-msgid "pe_line_count is zero"
-msgstr "pe_line_countฐก 0ภิดฯดู"
-
-#: ../memline.c:2955
-#, c-format
-msgid "E322: line number out of range: %<PRId64> past the end"
-msgstr "E322: มู น๘ศฃฐก นภงธฆ นพ๎ณตฝภดฯดู: ธถม๖ธทฟกผญ %<PRId64> ธธลญ"
-
-#: ../memline.c:2959
-#, c-format
-msgid "E323: line count wrong in block %<PRId64>"
-msgstr "E323: ฑธฟช %<PRId64>ภว มู ฐนผ๖ฐก ฦฒทศฝภดฯดู"
-
-#: ../memline.c:2999
-msgid "Stack size increases"
-msgstr "ฝบลร ลฉฑโ ม๕ฐก"
-
-#: ../memline.c:3038
-msgid "E317: pointer block id wrong 2"
-msgstr "E317: ภ฿ธ๘ตศ ฦ๗ภฮลอ ฑธฟช id 2"
-
-#: ../memline.c:3070
-#, c-format
-msgid "E773: Symlink loop for \"%s\""
-msgstr ""
-
-#: ../memline.c:3221
-msgid "E325: ATTENTION"
-msgstr "E325: มึธ๑"
-
-#: ../memline.c:3222
-msgid ""
-"\n"
-"Found a swap file by the name \""
-msgstr ""
-"\n"
-"Found a swap file by the name \""
-
-#: ../memline.c:3226
-msgid "While opening file \""
-msgstr "While opening file \""
-
-#: ../memline.c:3239
-msgid " NEWER than swap file!\n"
-msgstr " NEWER than swap file!\n"
-
-#: ../memline.c:3244
-#, fuzzy
-msgid ""
-"\n"
-"(1) Another program may be editing the same file. If this is the case,\n"
-" be careful not to end up with two different instances of the same\n"
-" file when making changes."
-msgstr ""
-"\n"
-"(1) ดูธฅ วมทฮฑืทฅภฬ ฐฐภบ ฦฤภฯภป ฐํฤกฐํ ภึดยม฿ภฯ ผ๖ ภึฝภดฯดู.\n"
-" ธธพเ ฑืทธดูธ้ ฐฐภบ ฦฤภฯภป ตฮ ฐณภว วมทฮฑืทฅฟกผญ ฐํฤกม๖\n"
-" พสตตทฯ มถฝษวฯฝรฑโ นูถ๘ดฯดู.\n"
-
-#: ../memline.c:3245
-#, fuzzy
-msgid " Quit, or continue with caution.\n"
-msgstr " ณกณปฐลณช ภงว่ภป ฐจผ๖วฯฝรทมธ้ ฐ่ผำวฯฝสฝรฟภ.\n"
-
-#: ../memline.c:3246
-#, fuzzy
-msgid "(2) An edit session for this file crashed.\n"
-msgstr ""
-"\n"
-"(2) ฦฤภฯภป ฐํฤกดูฐก มืพ๚พ๚ฝภดฯดู.\n"
-
-#: ../memline.c:3247
-msgid " If this is the case, use \":recover\" or \"vim -r "
-msgstr " ธธพเ ฑืทธดูธ้ \":recover\" ศคภบ \"vim -r "
-
-#: ../memline.c:3249
-msgid ""
-"\"\n"
-" to recover the changes (see \":help recovery\").\n"
-msgstr ""
-"\"\n"
-" ภป ป็ฟ๋วฯฟฉ บนฑธวฯฝสฝรฟภ (\":help recovery\" ยฐํ).\n"
-
-#: ../memline.c:3250
-msgid " If you did this already, delete the swap file \""
-msgstr " ภฬนฬ บนฑธวฯผฬพ๚ดูธ้ ฝบฟาฦฤภฯ \""
-
-#: ../memline.c:3252
-msgid ""
-"\"\n"
-" to avoid this message.\n"
-msgstr ""
-"\"\n"
-" ภป(ธฆ) ม๖ฟ์ผลพ฿ ภฬ ธฝรม๖ฐก ป็ถ๓มดฯดู.\n"
-
-#: ../memline.c:3450 ../memline.c:3452
-msgid "Swap file \""
-msgstr "ฝบฟา ฦฤภฯ \""
-
-#: ../memline.c:3451 ../memline.c:3455
-msgid "\" already exists!"
-msgstr "\"ภฬ ภฬนฬ มธภ็วีดฯดู!"
-
-#: ../memline.c:3457
-msgid "VIM - ATTENTION"
-msgstr "บ๖ - มึธ๑"
-
-#: ../memline.c:3459
-msgid "Swap file already exists!"
-msgstr "ฝบฟา ฦฤภฯภฬ ภฬนฬ มธภ็วีดฯดู!"
-
-#: ../memline.c:3464
-msgid ""
-"&Open Read-Only\n"
-"&Edit anyway\n"
-"&Recover\n"
-"&Quit\n"
-"&Abort"
-msgstr ""
-"ภะฑโ ภฟ๋ภธทฮ ฟญฑโ(&O)\n"
-"ฑืณษ ฐํฤกฑโ(&E)\n"
-"บนฑธ(&R)\n"
-"ณกณปฑโ(&Q)\n"
-"น๖ธฎฑโ(&A)"
-
-#: ../memline.c:3467
-msgid ""
-"&Open Read-Only\n"
-"&Edit anyway\n"
-"&Recover\n"
-"&Delete it\n"
-"&Quit\n"
-"&Abort"
-msgstr ""
-"ภะฑโ ภฟ๋ภธทฮ ฟญฑโ(&O)\n"
-"นซมถฐว ฦํม(&E)\n"
-"บนฑธ(&R)\n"
-"ป่มฆ(&D)\n"
-"ณกณปฑโ(&Q)\n"
-"น๖ธฎฑโ(&A)"
-
-#.
-#. * Change the ".swp" extension to find another file that can be used.
-#. * First decrement the last char: ".swo", ".swn", etc.
-#. * If that still isn't enough decrement the last but one char: ".svz"
-#. * Can happen when editing many "No Name" buffers.
-#.
-#. ".s?a"
-#. ".saa": tried enough, give up
-#: ../memline.c:3528
-msgid "E326: Too many swap files found"
-msgstr "E326: ณสนซ ธนภบ ฝบฟา ฦฤภฯภฬ น฿ฐ฿ตวพ๚ฝภดฯดู"
-
-#: ../memory.c:227
-#, c-format
-msgid "E342: Out of memory! (allocating %<PRIu64> bytes)"
-msgstr "E342: ธธ๐ธฎ บฮมท! (%<PRIu64> นูภฬฦฎธฆ วาด็)"
-
-#: ../menu.c:62
-msgid "E327: Part of menu-item path is not sub-menu"
-msgstr "E327: ธดบ วืธ๑ ฐๆทฮภว บฮบะภฬ วฯภง ธดบฐก พฦดีดฯดู"
-
-#: ../menu.c:63
-msgid "E328: Menu only exists in another mode"
-msgstr "E328: ธดบฐก ดูธฅ ธ๐ตๅฟกผญธธ มธภ็วีดฯดู"
-
-#: ../menu.c:64
-#, c-format
-msgid "E329: No menu \"%s\""
-msgstr "E329: \"%s\" ธดบ พ๘ภฝ"
-
-#. Only a mnemonic or accelerator is not valid.
-#: ../menu.c:329
-msgid "E792: Empty menu name"
-msgstr "E792: ธดบ ภฬธง พ๘ภฝ"
-
-#: ../menu.c:340
-msgid "E330: Menu path must not lead to a sub-menu"
-msgstr "E330: วฯภง ธดบ พีฟกดย ธดบ ฐๆทฮฐก บูภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../menu.c:365
-msgid "E331: Must not add menu items directly to menu bar"
-msgstr "E331: ธดบนูฟก ฐ๐นูทฮ ธดบ วืธ๑ภป ด๕วา ผ๖ดย พ๘ฝภดฯดู"
-
-#: ../menu.c:370
-msgid "E332: Separator cannot be part of a menu path"
-msgstr "E332: ฑธบะภฺดย ธดบ ฐๆทฮภว บฮบะภฬ ตษ ผ๖ พ๘ฝภดฯดู"
-
-#. Now we have found the matching menu, and we list the mappings
-#. Highlight title
-#: ../menu.c:762
-msgid ""
-"\n"
-"--- Menus ---"
-msgstr ""
-"\n"
-"--- ธดบ ---"
-
-#: ../menu.c:1313
-msgid "E333: Menu path must lead to a menu item"
-msgstr "E333: ธดบ วืธ๑ พีฟกดย ธดบ ฐๆทฮฐก ภึพ๎พ฿ วีดฯดู"
-
-#: ../menu.c:1330
-#, c-format
-msgid "E334: Menu not found: %s"
-msgstr "E334: ธดบธฆ รฃภป ผ๖ พ๘ฝภดฯดู: %s"
-
-#: ../menu.c:1396
-#, c-format
-msgid "E335: Menu not defined for %s mode"
-msgstr "E335: %s ธ๐ตๅฟก ด๋วั ธดบฐก มคภวตวพ๎ ภึม๖ พสฝภดฯดู"
-
-#: ../menu.c:1426
-msgid "E336: Menu path must lead to a sub-menu"
-msgstr "E336: วฯภง ธดบ พีฟก ธดบ ฐๆทฮฐก ภึพ๎พ฿ วีดฯดู"
-
-#: ../menu.c:1447
-msgid "E337: Menu not found - check menu names"
-msgstr "E337: ธดบธฆ รฃภป ผ๖ พ๘ภฝ - ธดบ ภฬธงภป ศฎภฮวฯฝสฝรฟภ"
-
-#: ../message.c:423
-#, c-format
-msgid "Error detected while processing %s:"
-msgstr "%s ผ๖วเม฿ ฟกทฏ น฿ฐ฿:"
-
-#: ../message.c:445
-#, c-format
-msgid "line %4ld:"
-msgstr "%4ld มู:"
-
-#: ../message.c:617
-#, c-format
-msgid "E354: Invalid register name: '%s'"
-msgstr "E354: ภ฿ธ๘ตศ ทนม๖ฝบลอ ภฬธง: '%s'"
-
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr "ธฝรม๖ ฐธฎภฺ: Bram Moolenaar <Bram@vim.org>"
-
-#: ../message.c:986
-msgid "Interrupt: "
-msgstr "ม฿ด: "
-
-#: ../message.c:988
-msgid "Press ENTER or type command to continue"
-msgstr "ฐ่ผำวฯทมธ้ ฟฃลอ ศคภบ ธํทษภป ภิทยวฯฝสฝรฟภ"
-
-#: ../message.c:1843
-#, c-format
-msgid "%s line %<PRId64>"
-msgstr "%s มู %<PRId64>"
-
-#: ../message.c:2392
-msgid "-- More --"
-msgstr "-- ด๕ --"
-
-#: ../message.c:2398
-msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "
-msgstr " SPACE/d/j: ศญธ้/ฦไภฬม๖/ถ๓ภฮ พฦทกทฮ, b/u/k: ภงทฮ, q: มพทแ "
-
-#: ../message.c:3021 ../message.c:3031
-msgid "Question"
-msgstr "ม๚นฎ"
-
-#: ../message.c:3023
-msgid ""
-"&Yes\n"
-"&No"
-msgstr ""
-"ฟน(&Y)\n"
-"พฦดฯฟภ(&N)"
-
-#: ../message.c:3033
-msgid ""
-"&Yes\n"
-"&No\n"
-"&Cancel"
-msgstr ""
-"ฟน(&Y)\n"
-"พฦดฯฟภ(&N)\n"
-"ร๋ผา(&C)"
-
-#: ../message.c:3045
-msgid ""
-"&Yes\n"
-"&No\n"
-"Save &All\n"
-"&Discard All\n"
-"&Cancel"
-msgstr ""
-"ฟน(&Y)\n"
-"พฦดฯฟภ(&N)\n"
-"ธ๐ตฮ ภ๚ภๅ(&A)\n"
-"ธ๐ตฮ น๖ธฒ(&D)\n"
-"ร๋ผา(&C)"
-
-#: ../message.c:3058
-msgid "E766: Insufficient arguments for printf()"
-msgstr "E766: printf()ฟก ณัพ๎ฟย ภฮภฺ ฐนผ๖ฐก บฮมท"
-
-#: ../message.c:3119
-msgid "E807: Expected Float argument for printf()"
-msgstr "E807: printf()ฟก ฟนป๓ธ๘วั Float ภฮภฺ"
-
-#: ../message.c:3873
-msgid "E767: Too many arguments to printf()"
-msgstr "E767: printf()ฟก ณสนซ ธนภบ ภฮภฺ ณัพ๎ฟศ"
-
-#: ../misc1.c:2256
-msgid "W10: Warning: Changing a readonly file"
-msgstr "W10: ฐๆฐํ: ภะฑโ ภฟ๋ ฦฤภฯภป ฐํฤกฐํ ภึฝภดฯดู"
-
-#: ../misc1.c:2537
-msgid "Type number and <Enter> or click with mouse (empty cancels): "
-msgstr "ผภฺ ภิทยศฤ <ฟฃลอ>ณช ธถฟ์ฝบ ลฌธฏ (ผภฺพ๘ภธธ้ ร๋ผา): "
-
-#: ../misc1.c:2539
-msgid "Type number and <Enter> (empty cancels): "
-msgstr "ผภฺ ภิทยศฤ <ฟฃลอ> (ผภฺพ๘ภธธ้ ร๋ผา): "
-
-#: ../misc1.c:2585
-msgid "1 more line"
-msgstr "วั มู ภฬป๓"
-
-#: ../misc1.c:2588
-msgid "1 line less"
-msgstr "วั มู ภฬวฯ"
-
-#: ../misc1.c:2593
-#, c-format
-msgid "%<PRId64> more lines"
-msgstr "%<PRId64> บธดู ธนภบ มู"
-
-#: ../misc1.c:2596
-#, c-format
-msgid "%<PRId64> fewer lines"
-msgstr "%<PRId64> บธดู ภ๛ภบ มู"
-
-#: ../misc1.c:2599
-msgid " (Interrupted)"
-msgstr " (ม฿ดตวพ๚ฝภดฯดู)"
-
-#: ../misc1.c:2635
-msgid "Beep!"
-msgstr "ปเ!"
-
-#: ../misc2.c:738
-#, c-format
-msgid "Calling shell to execute: \"%s\""
-msgstr "ฝววเวฯทมฐํ ฝฉ บฮธง: \"%s\""
-
-#: ../normal.c:183
-msgid "E349: No identifier under cursor"
-msgstr "E349: ฤฟผญ นุฟก ฝฤบฐภฺฐก พ๘ฝภดฯดู"
-
-#: ../normal.c:1866
-msgid "E774: 'operatorfunc' is empty"
-msgstr "E774: 'operatorfunc'ฐก บ๑พ๎ภึฝภดฯดู"
-
-#: ../normal.c:2637
-msgid "Warning: terminal cannot highlight"
-msgstr "ฐๆฐํ: ลอนฬณฮภฬ บ๑ม๊พ๓ ป๓ลยธฆ วฅฝรวา ผ๖ พ๘ฝภดฯดู"
-
-#: ../normal.c:2807
-msgid "E348: No string under cursor"
-msgstr "E348: ฤฟผญ นุฟก นฎภฺฟญภฬ พ๘ฝภดฯดู"
-
-#: ../normal.c:3937
-msgid "E352: Cannot erase folds with current 'foldmethod'"
-msgstr "E352: ว๖ภ็ภว 'foldmethod'ภธทฮ มขฑโธฆ ม๖ฟ๏ ผ๖ พ๘ฝภดฯดู"
-
-#: ../normal.c:5897
-msgid "E664: changelist is empty"
-msgstr "E664: changelistฐก บ๑พ๚ฝภดฯดู"
-
-#: ../normal.c:5899
-msgid "E662: At start of changelist"
-msgstr ""
-
-#: ../normal.c:5901
-msgid "E663: At end of changelist"
-msgstr ""
-
-#: ../normal.c:7053
-msgid "Type :quit<Enter> to exit Nvim"
-msgstr "VIMภป ธถฤกทมธ้ :quit<Enter> ภิทย"
-
-#: ../ops.c:248
-#, c-format
-msgid "1 line %sed 1 time"
-msgstr "1 line %sed 1 time"
-
-#: ../ops.c:250
-#, c-format
-msgid "1 line %sed %d times"
-msgstr "1 line %sed %d times"
-
-#: ../ops.c:253
-#, c-format
-msgid "%<PRId64> lines %sed 1 time"
-msgstr "%<PRId64> lines %sed 1 time"
-
-#: ../ops.c:256
-#, c-format
-msgid "%<PRId64> lines %sed %d times"
-msgstr "%<PRId64> lines %sed %d times"
-
-#: ../ops.c:592
-#, c-format
-msgid "%<PRId64> lines to indent... "
-msgstr "%<PRId64> lines to indent... "
-
-#: ../ops.c:634
-msgid "1 line indented "
-msgstr "1 line indented "
-
-#: ../ops.c:636
-#, c-format
-msgid "%<PRId64> lines indented "
-msgstr "%<PRId64> lines indented "
-
-#: ../ops.c:938
-msgid "E748: No previously used register"
-msgstr ""
-
-#. must display the prompt
-#: ../ops.c:1433
-msgid "cannot yank; delete anyway"
-msgstr "cannot yank; delete anyway"
-
-#: ../ops.c:1929
-msgid "1 line changed"
-msgstr "1 line changed"
-
-#: ../ops.c:1931
-#, c-format
-msgid "%<PRId64> lines changed"
-msgstr "%<PRId64> lines changed"
-
-#: ../ops.c:2521
-msgid "block of 1 line yanked"
-msgstr "block of 1 line yanked"
-
-#: ../ops.c:2523
-msgid "1 line yanked"
-msgstr "1 line yanked"
-
-#: ../ops.c:2525
-#, c-format
-msgid "block of %<PRId64> lines yanked"
-msgstr "block of %<PRId64> lines yanked"
-
-#: ../ops.c:2528
-#, c-format
-msgid "%<PRId64> lines yanked"
-msgstr "%<PRId64> lines yanked"
-
-#: ../ops.c:2710
-#, c-format
-msgid "E353: Nothing in register %s"
-msgstr "E353: %s ทนม๖ฝบลอฟก พฦนซ ฐอตต พ๘ฝภดฯดู"
-
-#. Highlight title
-#: ../ops.c:3185
-msgid ""
-"\n"
-"--- Registers ---"
-msgstr ""
-"\n"
-"--- ทนม๖ฝบลอ ---"
-
-#: ../ops.c:4455
-msgid "Illegal register name"
-msgstr "ภฬป๓วั ทนม๖ฝบลอ ภฬธง"
-
-#: ../ops.c:4533
-msgid ""
-"\n"
-"# Registers:\n"
-msgstr ""
-"\n"
-"# ทนม๖ฝบลอ:\n"
-
-#: ../ops.c:4575
-#, c-format
-msgid "E574: Unknown register type %d"
-msgstr "E574: ธ๐ธฃดย ทนม๖ฝบลอ วฝฤ %d"
-
-#: ../ops.c:5089
-#, c-format
-msgid "%<PRId64> Cols; "
-msgstr "%<PRId64> ฟญ; "
-
-#: ../ops.c:5097
-#, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Bytes"
-msgstr ""
-"Selected %s%<PRId64> of %<PRId64> ถ๓ภฮ; %<PRId64> of %<PRId64> ดพ๎; "
-"%<PRId64> of %<PRId64> นูภฬฦฎ"
-
-#: ../ops.c:5105
-#, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Chars; %<PRId64> of %<PRId64> Bytes"
-msgstr ""
-"Selected %s%<PRId64> of %<PRId64> ถ๓ภฮ; %<PRId64> of %<PRId64> ดพ๎; "
-"%<PRId64> of %<PRId64> นฎภฺ; %<PRId64> of %<PRId64> นูภฬฦฎ"
-
-#: ../ops.c:5123
-#, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Byte "
-"%<PRId64> of %<PRId64>"
-msgstr ""
-"Col %s of %s; ถ๓ภฮ %<PRId64> of %<PRId64>; ดพ๎ %<PRId64> of %<PRId64>; นูภฬ"
-"ฦฎ %<PRId64> of %<PRId64>"
-
-#: ../ops.c:5133
-#, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Char "
-"%<PRId64> of %<PRId64>; Byte %<PRId64> of %<PRId64>"
-msgstr ""
-"Col %s of %s; ถ๓ภฮ %<PRId64> of %<PRId64>; ดพ๎ %<PRId64> of %<PRId64>; นฎภฺ "
-"%<PRId64> of %<PRId64>; นูภฬฦฎ %<PRId64> of %<PRId64>"
-
-#: ../ops.c:5146
-#, c-format
-msgid "(+%<PRId64> for BOM)"
-msgstr "(+%<PRId64> for BOM)"
-
-#: ../option.c:1238
-msgid "%<%f%h%m%=Page %N"
-msgstr "%<%f%h%m%=ฦไภฬม๖ %N"
-
-#: ../option.c:1574
-msgid "Thanks for flying Vim"
-msgstr "บ๖ภป ณฏฐิ วุ มึผลผญ ฐํธฟฝภดฯดู"
-
-#. found a mismatch: skip
-#: ../option.c:2698
-msgid "E518: Unknown option"
-msgstr "E518: ธ๐ธฃดย ฟษผว"
-
-#: ../option.c:2709
-msgid "E519: Option not supported"
-msgstr "E519: ม๖ฟ๘ตวม๖ พสดย ฟษผวภิดฯดู"
-
-#: ../option.c:2740
-msgid "E520: Not allowed in a modeline"
-msgstr "E520: ธ๐ตๅถ๓ภฮฟกผญ ป็ฟ๋ตษ ผ๖ พ๘ฝภดฯดู"
-
-#: ../option.c:2815
-msgid "E846: Key code not set"
-msgstr ""
-
-#: ../option.c:2924
-msgid "E521: Number required after ="
-msgstr "E521: = ตฺฟก ผภฺฐก วสฟไวีดฯดู"
-
-#: ../option.c:3226 ../option.c:3864
-msgid "E522: Not found in termcap"
-msgstr "E522: termcapฟกผญ รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../option.c:3335
-#, c-format
-msgid "E539: Illegal character <%s>"
-msgstr "E539: ภฬป๓วั ฑภฺ <%s>"
-
-#: ../option.c:3862
-msgid "E529: Cannot set 'term' to empty string"
-msgstr "E529: 'term'ภป บ๓ นฎภฺฟญทฮ ผณมควา ผ๖ พ๘ฝภดฯดู"
-
-#: ../option.c:3885
-msgid "E589: 'backupext' and 'patchmode' are equal"
-msgstr "E589: 'backupext'ฟอ 'patchmode'ฐก ตฟภฯวีดฯดู"
-
-#: ../option.c:3964
-msgid "E834: Conflicts with value of 'listchars'"
-msgstr "E834: 'listchars' ฐชฐ๚ รๆตนภฬ น฿ปวีดฯดู"
-
-#: ../option.c:3966
-msgid "E835: Conflicts with value of 'fillchars'"
-msgstr "E835: 'fillchars' ฐชฐ๚ รๆตนภฬ น฿ปวีดฯดู"
-
-#: ../option.c:4163
-msgid "E524: Missing colon"
-msgstr "E524: ฤทะภฬ พ๘ฝภดฯดู"
-
-#: ../option.c:4165
-msgid "E525: Zero length string"
-msgstr "E525: บ๓ นฎภฺฟญภิดฯดู"
-
-#: ../option.c:4220
-#, c-format
-msgid "E526: Missing number after <%s>"
-msgstr "E526: <%s> ตฺฟก ผภฺฐก พ๘ฝภดฯดู"
-
-#: ../option.c:4232
-msgid "E527: Missing comma"
-msgstr "E527: ฤธถฐก พ๘ฝภดฯดู"
-
-#: ../option.c:4239
-msgid "E528: Must specify a ' value"
-msgstr "E528: ' ฐชภป ธํฝรวุ มึผลพ฿ วีดฯดู"
-
-#: ../option.c:4271
-msgid "E595: contains unprintable or wide character"
-msgstr "E595: รโทยวา ผ๖ พ๘ดย, ศคภบ ฟอภฬตๅ นฎภฺธฆ ฦ๗วิวฯฐํ ภึฝภดฯดู"
-
-#: ../option.c:4469
-#, c-format
-msgid "E535: Illegal character after <%c>"
-msgstr "E535: <%c> ตฺฟก ภฬป๓วั ฑภฺ"
-
-#: ../option.c:4534
-msgid "E536: comma required"
-msgstr "E536: ฤธถฐก วสฟไวีดฯดู"
-
-#: ../option.c:4543
-#, c-format
-msgid "E537: 'commentstring' must be empty or contain %s"
-msgstr "E537: 'commentstring'ภบ บ๑ฐลณช %sภป(ธฆ) ฦ๗วิวุพ฿ วีดฯดู"
-
-#: ../option.c:4928
-msgid "E540: Unclosed expression sequence"
-msgstr "E540: ดศ๗ม๖ พสภบ วฅว๖ฝฤ น่ฟญ"
-
-#: ../option.c:4932
-msgid "E541: too many items"
-msgstr "E541: ณสนซ ธนภบ วืธ๑"
-
-#: ../option.c:4934
-msgid "E542: unbalanced groups"
-msgstr "E542: ฑีวภฬ พศ ภโศ๙ ฑืท์"
-
-#: ../option.c:5148
-msgid "E590: A preview window already exists"
-msgstr "E590: นฬธฎ บธฑโ รขภฬ ภฬนฬ มธภ็วีดฯดู"
-
-#: ../option.c:5311
-msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'"
-msgstr "W17: Arabicภบ UTF-8 ภฮฤฺต๙ วสฟไ, ':set encoding=utf-8' วฯผผฟไ"
-
-#: ../option.c:5623
-#, c-format
-msgid "E593: Need at least %d lines"
-msgstr "E593: ภ๛พ๎ตต %d มูภฬ วสฟไวีดฯดู"
-
-#: ../option.c:5631
-#, c-format
-msgid "E594: Need at least %d columns"
-msgstr "E594: ภ๛พ๎ตต %d ฤญภฬ วสฟไวีดฯดู"
-
-#: ../option.c:6011
-#, c-format
-msgid "E355: Unknown option: %s"
-msgstr "E355: ธ๐ธฃดย ฟษผว: %s"
-
-#. There's another character after zeros or the string
-#. * is empty. In both cases, we are trying to set a
-#. * num option using a string.
-#: ../option.c:6037
-#, c-format
-msgid "E521: Number required: &%s = '%s'"
-msgstr "E521: ผภฺฐก วสฟไ: &%s = '%s'"
-
-#: ../option.c:6149
-msgid ""
-"\n"
-"--- Terminal codes ---"
-msgstr ""
-"\n"
-"--- ลอนฬณฮ ฤฺตๅ ---"
-
-#: ../option.c:6151
-msgid ""
-"\n"
-"--- Global option values ---"
-msgstr ""
-"\n"
-"--- ภฟช ฟษผว ฐช ---"
-
-#: ../option.c:6153
-msgid ""
-"\n"
-"--- Local option values ---"
-msgstr ""
-"\n"
-"--- ม๖ฟช ฟษผว ฐช ---"
-
-#: ../option.c:6155
-msgid ""
-"\n"
-"--- Options ---"
-msgstr ""
-"\n"
-"--- ฟษผว ---"
-
-#: ../option.c:6816
-msgid "E356: get_varp ERROR"
-msgstr "E356: get_varp ฟกทฏ"
-
-#: ../option.c:7696
-#, c-format
-msgid "E357: 'langmap': Matching character missing for %s"
-msgstr "E357: 'langmap': %sฟก ด๋วั ธยดย ฑภฺฐก พ๘ฝภดฯดู"
-
-#: ../option.c:7715
-#, c-format
-msgid "E358: 'langmap': Extra characters after semicolon: %s"
-msgstr "E358: 'langmap': ผผนฬฤทะ ตฺฟก ฑภฺฐก ด๕ ภึภฝ: %s"
-
-#: ../os/shell.c:194
-msgid ""
-"\n"
-"Cannot execute shell "
-msgstr ""
-"\n"
-"Cannot execute shell "
-
-#: ../os/shell.c:439
-msgid ""
-"\n"
-"shell returned "
-msgstr ""
-"\n"
-"shell returned "
-
-#: ../os_unix.c:465 ../os_unix.c:471
-msgid ""
-"\n"
-"Could not get security context for "
-msgstr ""
-"\n"
-"Could not get security context for "
-
-#: ../os_unix.c:479
-msgid ""
-"\n"
-"Could not set security context for "
-msgstr ""
-"\n"
-"Could not set security context for "
-
-#: ../os_unix.c:1558 ../os_unix.c:1647
-#, c-format
-msgid "dlerror = \"%s\""
-msgstr "dlerror = \"%s\""
-
-#: ../path.c:1449
-#, c-format
-msgid "E447: Can't find file \"%s\" in path"
-msgstr "E447: pathฟกผญ \"%s\" ฦฤภฯภป รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../quickfix.c:359
-#, c-format
-msgid "E372: Too many %%%c in format string"
-msgstr "E372: วฝฤ นฎภฺฟญฟก %%%cภฬ(ฐก) ณสนซ ธนฝภดฯดู"
-
-#: ../quickfix.c:371
-#, c-format
-msgid "E373: Unexpected %%%c in format string"
-msgstr "E373: วฝฤ นฎภฺฟญฟก %%%cภฬ(ฐก) ภ฿ธ๘ตวพ๚ฝภดฯดู"
-
-#: ../quickfix.c:420
-msgid "E374: Missing ] in format string"
-msgstr "E374: วฝฤ นฎภฺฟญฟก ]ฐก พ๘ฝภดฯดู"
-
-#: ../quickfix.c:431
-#, c-format
-msgid "E375: Unsupported %%%c in format string"
-msgstr "E375: วฝฤ นฎภฺฟญฟก ม๖ฟ๘ตวม๖ พสดย %%%cภฬ(ฐก) ภึฝภดฯดู"
-
-#: ../quickfix.c:448
-#, c-format
-msgid "E376: Invalid %%%c in format string prefix"
-msgstr "E376: วฝฤ นฎภฺฟญ ผญตฮฟก ภ฿ธ๘ตศ %%%cภฬ(ฐก) ภึฝภดฯดู"
-
-#: ../quickfix.c:454
-#, c-format
-msgid "E377: Invalid %%%c in format string"
-msgstr "E377: วฝฤ นฎภฺฟญฟก ภ฿ธ๘ตศ %%%cภฬ(ฐก) ภึฝภดฯดู"
-
-#. nothing found
-#: ../quickfix.c:477
-msgid "E378: 'errorformat' contains no pattern"
-msgstr "E378: 'errorformat'ภฬ พ๎ถฒ ฦะลฯตต ฦ๗วิวฯฐํ ภึม๖ พสฝภดฯดู"
-
-#: ../quickfix.c:695
-msgid "E379: Missing or empty directory name"
-msgstr "E379: บมณฐลณช บ๓ ต๐ทบลไธฎ ภฬธง"
-
-#: ../quickfix.c:1305
-msgid "E553: No more items"
-msgstr "E553: ด๕ ภฬป๓ภว วืธ๑ภฬ พ๘ฝภดฯดู"
-
-#: ../quickfix.c:1674
-#, c-format
-msgid "(%d of %d)%s%s: "
-msgstr "(%d of %d)%s%s: "
-
-#: ../quickfix.c:1676
-msgid " (line deleted)"
-msgstr " (มูภป ม๖ฟภฝ)"
-
-#: ../quickfix.c:1863
-msgid "E380: At bottom of quickfix stack"
-msgstr "E380: ฤวศฝบ ฝบลรภว นูดฺภิดฯดู"
-
-#: ../quickfix.c:1869
-msgid "E381: At top of quickfix stack"
-msgstr "E381: ฤวศฝบ ฝบลรภว ฒภด๋ฑโภิดฯดู"
-
-#: ../quickfix.c:1880
-#, c-format
-msgid "error list %d of %d; %d errors"
-msgstr "error list %d of %d; %d errors"
-
-#: ../quickfix.c:2427
-msgid "E382: Cannot write, 'buftype' option is set"
-msgstr "E382: พต ผ๖ พ๘ภฝ, 'buftype' ฟษผวภฬ ผณมคตวพ๎ ภึฝภดฯดู"
-
-#: ../quickfix.c:2812
-msgid "E683: File name missing or invalid pattern"
-msgstr "E683: ฦฤภฯธํ ดฉถ๔ ศคภบ ภ฿ธ๘ตศ ฦะลฯ"
-
-#: ../quickfix.c:2911
-#, c-format
-msgid "Cannot open file \"%s\""
-msgstr "\"%s\" ฦฤภฯภป ฟญ ผ๖ พ๘ฝภดฯดู"
-
-#: ../quickfix.c:3429
-msgid "E681: Buffer is not loaded"
-msgstr "E681: น๖ฦฐก ทฮตๅตวม๖ พสพาฝภดฯดู"
-
-#: ../quickfix.c:3487
-msgid "E777: String or List expected"
-msgstr "E777: Stringภฬณช Listฐก ภึพ๎พ฿ วิ"
-
-#: ../regexp.c:359
-#, c-format
-msgid "E369: invalid item in %s%%[]"
-msgstr "E369: %s%%[]ฟก ภ฿ธ๘ตศ วืธ๑"
-
-#: ../regexp.c:374
-#, c-format
-msgid "E769: Missing ] after %s["
-msgstr "E769: %s[ ตฺฟก ]ฐก พ๘ฝภดฯดู"
-
-#: ../regexp.c:375
-#, c-format
-msgid "E53: Unmatched %s%%("
-msgstr "E53: ธยม๖ พสดย %s%%("
-
-#: ../regexp.c:376
-#, c-format
-msgid "E54: Unmatched %s("
-msgstr "E54: ธยม๖ พสดย %s("
-
-#: ../regexp.c:377
-#, c-format
-msgid "E55: Unmatched %s)"
-msgstr "E55: ธยม๖ พสดย %s)"
-
-#: ../regexp.c:378
-msgid "E66: \\z( not allowed here"
-msgstr "E66: \\z(ดย ฟฉฑโฟกผญ วใฟ๋ตวม๖ พสฝภดฯดู"
-
-#: ../regexp.c:379
-msgid "E67: \\z1 et al. not allowed here"
-msgstr "E67: \\z1 ต๎ภบ ฟฉฑโฟกผญ วใฟ๋ตวม๖ พสฝภดฯดู"
-
-#: ../regexp.c:380
-#, c-format
-msgid "E69: Missing ] after %s%%["
-msgstr "E69: %s%%[ ตฺฟก ]ฐก พ๘ฝภดฯดู"
-
-#: ../regexp.c:381
-#, c-format
-msgid "E70: Empty %s%%[]"
-msgstr "E70: บ๓ %s%%[]"
-
-#: ../regexp.c:1209 ../regexp.c:1224
-msgid "E339: Pattern too long"
-msgstr "E339: ฦะลฯภฬ ณสนซ ฑ้ดฯดู"
-
-#: ../regexp.c:1371
-msgid "E50: Too many \\z("
-msgstr "E50: \\z(ฐก ณสนซ ธนฝภดฯดู"
-
-#: ../regexp.c:1378
-#, c-format
-msgid "E51: Too many %s("
-msgstr "E51: %s(ฐก ณสนซ ธนฝภดฯดู"
-
-#: ../regexp.c:1427
-msgid "E52: Unmatched \\z("
-msgstr "E52: ธยม๖ พสดย \\z("
-
-#: ../regexp.c:1637
-#, c-format
-msgid "E59: invalid character after %s@"
-msgstr "E59: %s@ ตฺฟก ภ฿ธ๘ตศ นฎภฺ"
-
-#: ../regexp.c:1672
-#, c-format
-msgid "E60: Too many complex %s{...}s"
-msgstr "E60: %s{...}sฐก ณสนซ ธนภฝ"
-
-#: ../regexp.c:1687
-#, c-format
-msgid "E61: Nested %s*"
-msgstr "E61: Nested %s*"
-
-#: ../regexp.c:1690
-#, c-format
-msgid "E62: Nested %s%c"
-msgstr "E62: Nested %s%c"
-
-#: ../regexp.c:1800
-msgid "E63: invalid use of \\_"
-msgstr "E63: \\_ธฆ ภ฿ ธ๘ ป็ฟ๋"
-
-#: ../regexp.c:1850
-#, c-format
-msgid "E64: %s%c follows nothing"
-msgstr "E64: %s%c ตฺฟก พฦนซฐอตต พ๘ฝภดฯดู"
-
-#: ../regexp.c:1902
-msgid "E65: Illegal back reference"
-msgstr "E65: ภฬป๓วั ศฤภง ยมถ"
-
-#: ../regexp.c:1943
-msgid "E68: Invalid character after \\z"
-msgstr "E68: \\z ตฺฟก ภฬป๓วั นฎภฺ"
-
-#: ../regexp.c:2049 ../regexp_nfa.c:1296
-#, c-format
-msgid "E678: Invalid character after %s%%[dxouU]"
-msgstr "E678: %s%%[dxouU] ตฺฟก ภฬป๓วั นฎภฺ"
-
-#: ../regexp.c:2107
-#, c-format
-msgid "E71: Invalid character after %s%%"
-msgstr "E71: %s%% ตฺฟก ภฬป๓วั นฎภฺ"
-
-#: ../regexp.c:3017
-#, c-format
-msgid "E554: Syntax error in %s{...}"
-msgstr "E554: %s{...}ฟก ฑธนฎ ฟกทฏ"
-
-#: ../regexp.c:3805
-msgid "External submatches:\n"
-msgstr "ฟบฮ submatches:\n"
-
-#: ../regexp.c:7022
-msgid ""
-"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be "
-"used "
-msgstr ""
-
-#: ../regexp_nfa.c:239
-msgid "E865: (NFA) Regexp end encountered prematurely"
-msgstr ""
-
-#: ../regexp_nfa.c:240
-#, c-format
-msgid "E866: (NFA regexp) Misplaced %c"
-msgstr ""
-
-#: ../regexp_nfa.c:242
-#, c-format
-msgid "E877: (NFA regexp) Invalid character class: %<PRId64>"
-msgstr ""
-
-#: ../regexp_nfa.c:1261
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\z%c'"
-msgstr ""
-
-#: ../regexp_nfa.c:1387
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\%%%c'"
-msgstr ""
-
-#: ../regexp_nfa.c:1802
-#, c-format
-msgid "E869: (NFA) Unknown operator '\\@%c'"
-msgstr ""
-
-#: ../regexp_nfa.c:1831
-msgid "E870: (NFA regexp) Error reading repetition limits"
-msgstr ""
-
-#. Can't have a multi follow a multi.
-#: ../regexp_nfa.c:1895
-msgid "E871: (NFA regexp) Can't have a multi follow a multi !"
-msgstr ""
-
-#. Too many `('
-#: ../regexp_nfa.c:2037
-msgid "E872: (NFA regexp) Too many '('"
-msgstr ""
-
-#: ../regexp_nfa.c:2042
-#, fuzzy
-msgid "E879: (NFA regexp) Too many \\z("
-msgstr "E50: \\z(ฐก ณสนซ ธนฝภดฯดู"
-
-#: ../regexp_nfa.c:2066
-msgid "E873: (NFA regexp) proper termination error"
-msgstr ""
-
-#: ../regexp_nfa.c:2599
-msgid "E874: (NFA) Could not pop the stack !"
-msgstr ""
-
-#: ../regexp_nfa.c:3298
-msgid ""
-"E875: (NFA regexp) (While converting from postfix to NFA), too many states "
-"left on stack"
-msgstr ""
-
-#: ../regexp_nfa.c:3302
-msgid "E876: (NFA regexp) Not enough space to store the whole NFA "
-msgstr ""
-
-#: ../regexp_nfa.c:4571 ../regexp_nfa.c:4869
-msgid ""
-"Could not open temporary log file for writing, displaying on stderr ... "
-msgstr ""
-
-#: ../regexp_nfa.c:4840
-#, c-format
-msgid "(NFA) COULD NOT OPEN %s !"
-msgstr ""
-
-#: ../regexp_nfa.c:6049
-#, fuzzy
-msgid "Could not open temporary log file for writing "
-msgstr "E828: พฒฑโ ภงวุ undoภป ฟญ ผ๖ พ๘ฝภดฯดู: %s"
-
-#: ../screen.c:7435
-msgid " VREPLACE"
-msgstr " ผฑลรฤกศฏ"
-
-#: ../screen.c:7437
-msgid " REPLACE"
-msgstr " นูฒูฑโ"
-
-#: ../screen.c:7440
-msgid " REVERSE"
-msgstr " นด๋"
-
-#: ../screen.c:7441
-msgid " INSERT"
-msgstr " ณขฟ๖ณึฑโ"
-
-#: ../screen.c:7443
-msgid " (insert)"
-msgstr " (ณขฟ๖ณึฑโ)"
-
-#: ../screen.c:7445
-msgid " (replace)"
-msgstr " (นูฒูฑโ)"
-
-#: ../screen.c:7447
-msgid " (vreplace)"
-msgstr " (ผฑลรฤกศฏ)"
-
-#: ../screen.c:7449
-msgid " Hebrew"
-msgstr " ว์บ๊ท็"
-
-#: ../screen.c:7454
-msgid " Arabic"
-msgstr " พฦถ๓บ๑พฦ"
-
-#: ../screen.c:7456
-msgid " (lang)"
-msgstr " (พ๐พ๎)"
-
-#: ../screen.c:7459
-msgid " (paste)"
-msgstr " (บูภฬฑโ)"
-
-#: ../screen.c:7469
-msgid " VISUAL"
-msgstr " บ๑มึพ๓"
-
-#: ../screen.c:7470
-msgid " VISUAL LINE"
-msgstr " บ๑มึพ๓ ถ๓ภฮ"
-
-#: ../screen.c:7471
-msgid " VISUAL BLOCK"
-msgstr " บ๑มึพ๓ บํทฯ"
-
-#: ../screen.c:7472
-msgid " SELECT"
-msgstr " ฐํธฃฑโ"
-
-#: ../screen.c:7473
-msgid " SELECT LINE"
-msgstr " ถ๓ภฮ ฐํธฃฑโ"
-
-#: ../screen.c:7474
-msgid " SELECT BLOCK"
-msgstr " บํทฯ ฐํธฃฑโ"
-
-#: ../screen.c:7486 ../screen.c:7541
-msgid "recording"
-msgstr "ฑโทฯม฿"
-
-#: ../search.c:487
-#, c-format
-msgid "E383: Invalid search string: %s"
-msgstr "E383: ภ฿ธ๘ตศ รฃฑโ นฎภฺฟญ: %s"
-
-#: ../search.c:832
-#, c-format
-msgid "E384: search hit TOP without match for: %s"
-msgstr "E384: รณภฝฑ๎ม๖ ธยดย นฎภฺฟญภฬ พ๘ฝภดฯดู: %s"
-
-#: ../search.c:835
-#, c-format
-msgid "E385: search hit BOTTOM without match for: %s"
-msgstr "E385: ณกฑ๎ม๖ ธยดย นฎภฺฟญภฬ พ๘ฝภดฯดู: %s"
-
-#: ../search.c:1200
-msgid "E386: Expected '?' or '/' after ';'"
-msgstr "E386: ';' ตฺฟกดย '?'ณช '/'ฐก ฟอพ฿ วีดฯดู"
-
-#: ../search.c:4085
-msgid " (includes previously listed match)"
-msgstr " (ภฬภฟก ธยพาด๘ ธ๑ทฯ ฦ๗วิ)"
-
-#. cursor at status line
-#: ../search.c:4104
-msgid "--- Included files "
-msgstr "--- Included files "
-
-#: ../search.c:4106
-msgid "not found "
-msgstr "not found "
-
-#: ../search.c:4107
-msgid "in path ---\n"
-msgstr "in path ---\n"
-
-#: ../search.c:4168
-msgid " (Already listed)"
-msgstr " (Already listed)"
-
-#: ../search.c:4170
-msgid " NOT FOUND"
-msgstr " ธ๘ รฃพาภฝ"
-
-#: ../search.c:4211
-#, c-format
-msgid "Scanning included file: %s"
-msgstr "ฦ๗วิตศ ฦฤภฯ รฃดย ม฿: %s"
-
-#: ../search.c:4216
-#, c-format
-msgid "Searching included file %s"
-msgstr "ฦ๗วิตศ ฦฤภฯ %s รฃดย ม฿"
-
-#: ../search.c:4405
-msgid "E387: Match is on current line"
-msgstr "E387: ธยดย ฐิ ว๖ภ็ มูฟก ภึฝภดฯดู"
-
-#: ../search.c:4517
-msgid "All included files were found"
-msgstr "ธ๐ต็ ฦ๗วิตศ ฦฤภฯภป รฃพาฝภดฯดู"
-
-#: ../search.c:4519
-msgid "No included files"
-msgstr "ฦ๗วิตศ ฦฤภฯภฬ พ๘ฝภดฯดู"
-
-#: ../search.c:4527
-msgid "E388: Couldn't find definition"
-msgstr "E388: มคภวธฆ รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../search.c:4529
-msgid "E389: Couldn't find pattern"
-msgstr "E389: ฦะลฯภป รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../search.c:4668
-msgid "Substitute "
-msgstr "Substitute "
-
-#: ../search.c:4681
-#, c-format
-msgid ""
-"\n"
-"# Last %sSearch Pattern:\n"
-"~"
-msgstr ""
-"\n"
-"# Last %sSearch Pattern:\n"
-"~"
-
-#: ../spell.c:951
-msgid "E759: Format error in spell file"
-msgstr "E759: spell ฦฤภฯ วฝฤ ฟกทฏ"
-
-#: ../spell.c:952
-msgid "E758: Truncated spell file"
-msgstr "E758: ภ฿ธฐ spell ฦฤภฯ"
-
-#: ../spell.c:953
-#, c-format
-msgid "Trailing text in %s line %d: %s"
-msgstr "Trailing text in %s line %d: %s"
-
-#: ../spell.c:954
-#, c-format
-msgid "Affix name too long in %s line %d: %s"
-msgstr "Affix name too long in %s line %d: %s"
-
-#: ../spell.c:955
-msgid "E761: Format error in affix file FOL, LOW or UPP"
-msgstr "E761: affix ฦฤภฯ FOL, LOW ศคภบ UPPฟก วฝฤ ฟกทฏ"
-
-#: ../spell.c:957
-msgid "E762: Character in FOL, LOW or UPP is out of range"
-msgstr "E762: FOL, LOW ศคภบ UPPภว นฎภฺฐก นภงธฆ นพ๎ณฒ"
-
-#: ../spell.c:958
-msgid "Compressing word tree..."
-msgstr "ดพ๎ ฦฎธฎ พะรเม฿..."
-
-#: ../spell.c:1951
-msgid "E756: Spell checking is not enabled"
-msgstr "E756: ธยรใน ฐหป็ฐก ศฐผบศญตวพ๎ ภึม๖ พสฝภดฯดู"
-
-#: ../spell.c:2249
-#, c-format
-msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
-msgstr "ฐๆฐํ: ดพ๎ ธ๑ทฯ \"%s.%s.spl\" ศคภบ \"%s.ascii.spl\"ภป รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../spell.c:2473
-#, c-format
-msgid "Reading spell file \"%s\""
-msgstr "spell ฦฤภฯ \"%s\"ภป(ธฆ) ภะฐํ ภึฝภดฯดู"
-
-#: ../spell.c:2496
-msgid "E757: This does not look like a spell file"
-msgstr "E757: spell ฦฤภฯภฬ พฦดั ฐอ ฐฐฝภดฯดู"
-
-#: ../spell.c:2501
-msgid "E771: Old spell file, needs to be updated"
-msgstr "E771: ฟภทกตศ spell ฦฤภฯ, ฐปฝลภฬ วสฟไวีดฯดู"
-
-#: ../spell.c:2504
-msgid "E772: Spell file is for newer version of Vim"
-msgstr "E772: Spell ฦฤภฯภฬ ป๕ น๖มฏภว Vimฟ๋ภิดฯดู"
-
-#: ../spell.c:2602
-msgid "E770: Unsupported section in spell file"
-msgstr "E770: spell ฦฤภฯฟก ม๖ฟ๘ตวม๖ พสดย ผฝผว"
-
-#: ../spell.c:3762
-#, c-format
-msgid "Warning: region %s not supported"
-msgstr "ฐๆฐํ: %s ฟตฟชภบ ม๖ฟ๘ตวม๖ พสฝภดฯดู"
-
-#: ../spell.c:4550
-#, c-format
-msgid "Reading affix file %s ..."
-msgstr "affix ฦฤภฯ %s ภะดย ม฿"
-
-#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
-#, c-format
-msgid "Conversion failure for word in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dฟก ภึดย ดพ๎ บฏศฏ ฝวฦะ: %s"
-
-#: ../spell.c:4630 ../spell.c:6170
-#, c-format
-msgid "Conversion in %s not supported: from %s to %s"
-msgstr "%sภว บฏศฏภฬ ม๖ฟ๘ตวม๖ พสฝภดฯดู: %sฟกผญ %sทฮ"
-
-#: ../spell.c:4642
-#, c-format
-msgid "Invalid value for FLAG in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dฟก FLAGฟก ด๋วั ภ฿ธ๘ตศ ฐช: %s"
-
-#: ../spell.c:4655
-#, c-format
-msgid "FLAG after using flags in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dฟก วรทกฑืฐก ป็ฟ๋ตศ ศฤ FLAG: %s"
-
-#: ../spell.c:4723
-#, c-format
-msgid ""
-"Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line "
-"%d"
-msgstr ""
-"%s ถ๓ภฮ %dฟก PFX ตฺฟก COMPOUNDFORBIDFLAGภป มคภววั ฐอภบ ภ฿ธ๘ตศ ฐแฐ๚ธฆ รสทกวา "
-"ผ๖ ภึฝภดฯดู"
-
-#: ../spell.c:4731
-#, c-format
-msgid ""
-"Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line "
-"%d"
-msgstr ""
-"%s ถ๓ภฮ %dฟก PFX ตฺฟก COMPOUNDPERMITFLAGภป มคภววั ฐอภบ ภ฿ธ๘ตศ ฐแฐ๚ธฆ รสทกวา "
-"ผ๖ ภึฝภดฯดู"
-
-#: ../spell.c:4747
-#, c-format
-msgid "Wrong COMPOUNDRULES value in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dฟก ภ฿ธ๘ตศ COMPOUNDRULES ฐช: %s"
-
-#: ../spell.c:4771
-#, c-format
-msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dฟก ภ฿ธ๘ตศ COMPOUNDWORDMAX ฐช: %s"
-
-#: ../spell.c:4777
-#, c-format
-msgid "Wrong COMPOUNDMIN value in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dฟก ภ฿ธ๘ตศ COMPOUNDMIN ฐช: %s"
-
-#: ../spell.c:4783
-#, c-format
-msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dฟก ภ฿ธ๘ตศ COMPOUNDSYLMAX ฐช: %s"
-
-#: ../spell.c:4795
-#, c-format
-msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dฟก ภ฿ธ๘ตศ CHECKCOMPOUNDPATTERN ฐช: %s"
-
-#: ../spell.c:4847
-#, c-format
-msgid "Different combining flag in continued affix block in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dฟก ฟฌผำตศ affix บํทฯฟก ดูธฅ ฐแวี วรทกฑื: %s"
-
-#: ../spell.c:4850
-#, c-format
-msgid "Duplicate affix in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dฟก ม฿บนตศ affix: %s"
-
-#: ../spell.c:4871
-#, c-format
-msgid ""
-"Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s "
-"line %d: %s"
-msgstr ""
-"%s ถ๓ภฮ %dฟก BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGESTฟก ด๋วุผญตต "
-"affixฐก ป็ฟ๋ตส: %s"
-
-#: ../spell.c:4893
-#, c-format
-msgid "Expected Y or N in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dฟก Yณช Nภฬ ฑโด๋ตส: %s"
-
-#: ../spell.c:4968
-#, c-format
-msgid "Broken condition in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dฐก ธมฐกม๘ ป๓ลย: %s"
-
-#: ../spell.c:5091
-#, c-format
-msgid "Expected REP(SAL) count in %s line %d"
-msgstr "%s ถ๓ภฮ %dฟก REP(SAL) ฤซฟ๎ฦฎฐก ฑโด๋ตส"
-
-#: ../spell.c:5120
-#, c-format
-msgid "Expected MAP count in %s line %d"
-msgstr "%s ถ๓ภฮ %dฟก MAP ฤซฟ๎ฦฎฐก ฑโด๋ตส"
-
-#: ../spell.c:5132
-#, c-format
-msgid "Duplicate character in MAP in %s line %d"
-msgstr "%s ถ๓ภฮ %dภว MAPฟก ม฿บนตศ นฎภฺ"
-
-#: ../spell.c:5176
-#, c-format
-msgid "Unrecognized or duplicate item in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dฟก ธ๐ธฃดย ศคภบ ม฿บนตศ วืธ๑: %s"
-
-#: ../spell.c:5197
-#, c-format
-msgid "Missing FOL/LOW/UPP line in %s"
-msgstr "%sฟก FOL/LOW/UPPภฬ ดฉถ๔ตศ ถ๓ภฮ"
-
-#: ../spell.c:5220
-msgid "COMPOUNDSYLMAX used without SYLLABLE"
-msgstr "COMPOUNDSYLMAXภฬ SYLLABLEพ๘ภฬ ป็ฟ๋ตส"
-
-#: ../spell.c:5236
-msgid "Too many postponed prefixes"
-msgstr "postponed มขตฮป็ฐก ณสนซ ธนฝภดฯดู"
-
-#: ../spell.c:5238
-msgid "Too many compound flags"
-msgstr "compound วรทกฑืฐก ณสนซ ธนฝภดฯดู"
-
-#: ../spell.c:5240
-msgid "Too many postponed prefixes and/or compound flags"
-msgstr "postponed มขตฮป็ฟอ(ณช) compound วรทกฑืฐก ณสนซ ธนฝภดฯดู"
-
-#: ../spell.c:5250
-#, c-format
-msgid "Missing SOFO%s line in %s"
-msgstr "SOFO%sฐก ดฉถ๔ตศ ถ๓ภฮภฬ %sฟก ภึฝภดฯดู"
-
-#: ../spell.c:5253
-#, c-format
-msgid "Both SAL and SOFO lines in %s"
-msgstr "%sฟก SALฐ๚ SOFO ถ๓ภฮภฬ ตั ดู ภึฝภดฯดู"
-
-#: ../spell.c:5331
-#, c-format
-msgid "Flag is not a number in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dฟก ผภฺฐก พฦดั วรทกฑื: %s"
-
-#: ../spell.c:5334
-#, c-format
-msgid "Illegal flag in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dฟก ภ฿ธ๘ตศ วรทกฑื: %s"
-
-#: ../spell.c:5493 ../spell.c:5501
-#, c-format
-msgid "%s value differs from what is used in another .aff file"
-msgstr "%s ฐชภฬ ดูธฅ .aff ฦฤภฯฟกผญ ป็ฟ๋ตศ ฐอฐ๚ ดูธจดฯดู"
-
-#: ../spell.c:5602
-#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "ป็ภ ฦฤภฯ %s ภะดย ม฿ ..."
-
-#: ../spell.c:5611
-#, c-format
-msgid "E760: No word count in %s"
-msgstr "E760: %sฟก ดพ๎ ฤซฟ๎ฦฎฐก พ๘ฝภดฯดู"
-
-#: ../spell.c:5669
-#, c-format
-msgid "line %6d, word %6d - %s"
-msgstr "ถ๓ภฮ %6d, ดพ๎ %6d - %s"
-
-#: ../spell.c:5691
-#, c-format
-msgid "Duplicate word in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dฟก ม฿บนตศ ดพ๎: %s"
-
-#: ../spell.c:5694
-#, c-format
-msgid "First duplicate word in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dฟก รณภฝ ม฿บนตศ ดพ๎: %s"
-
-#: ../spell.c:5746
-#, c-format
-msgid "%d duplicate word(s) in %s"
-msgstr "%dฐณภว ม฿บนตศ ดพ๎ฐก %sฟก ภึฝภดฯดู"
-
-#: ../spell.c:5748
-#, c-format
-msgid "Ignored %d word(s) with non-ASCII characters in %s"
-msgstr "นซฝรตศ %dฐณภว พฦฝบลฐนฎภฺฟญภฬ พฦดั ดพ๎ฐก %sฟก ภึฝภดฯดู"
-
-#: ../spell.c:6115
-#, c-format
-msgid "Reading word file %s ..."
-msgstr "ดพ๎ ฦฤภฯ %s ภะดย ม฿ ..."
-
-#: ../spell.c:6155
-#, c-format
-msgid "Duplicate /encoding= line ignored in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dภว ม฿บนตศ /encoding= ถ๓ภฮ นซฝรตส: %s"
-
-#: ../spell.c:6159
-#, c-format
-msgid "/encoding= line after word ignored in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dภว ดพ๎ ตฺภว /encoding= ถ๓ภฮ นซฝรตส: %s"
-
-#: ../spell.c:6180
-#, c-format
-msgid "Duplicate /regions= line ignored in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dภว ม฿บนตศ /regions= ถ๓ภฮ นซฝรตส: %s"
-
-#: ../spell.c:6185
-#, c-format
-msgid "Too many regions in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dฟก ณสนซ ธนภบ ฟตฟช: %s"
-
-#: ../spell.c:6198
-#, c-format
-msgid "/ line ignored in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dภว / ถ๓ภฮ นซฝรตส: %s"
-
-#: ../spell.c:6224
-#, c-format
-msgid "Invalid region nr in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dฟก ภ฿ธ๘ตศ ฟตฟช น๘ศฃ: %s"
-
-#: ../spell.c:6230
-#, c-format
-msgid "Unrecognized flags in %s line %d: %s"
-msgstr "%s ถ๓ภฮ %dฟก ธ๐ธฃดย วรทกฑื: %s"
-
-#: ../spell.c:6257
-#, c-format
-msgid "Ignored %d words with non-ASCII characters"
-msgstr "พฦฝบลฐ นฎภฺฟญภฬ พฦดั %dฐณภว ดพ๎ฐก นซฝรตวพ๚ฝภดฯดู"
-
-#: ../spell.c:6656
-#, c-format
-msgid "Compressed %d of %d nodes; %d (%d%%) remaining"
-msgstr "%d/%d ณ๋ตๅฐก พะรเตส; %d (%d%%)ฐก ณฒภฝ"
-
-#: ../spell.c:7340
-msgid "Reading back spell file..."
-msgstr "ธยรใน ฦฤภฯภป ภะดย ม฿..."
-
-#. Go through the trie of good words, soundfold each word and add it to
-#. the soundfold trie.
-#: ../spell.c:7357
-msgid "Performing soundfolding..."
-msgstr "soundfold ผ๖วเม฿..."
-
-#: ../spell.c:7368
-#, c-format
-msgid "Number of words after soundfolding: %<PRId64>"
-msgstr "soundfold ผ๖วเ ศฤภว ดพ๎ ผ๖: %<PRId64>"
-
-#: ../spell.c:7476
-#, c-format
-msgid "Total number of words: %d"
-msgstr "รั ดพ๎ ผ๖: %d"
-
-#: ../spell.c:7655
-#, c-format
-msgid "Writing suggestion file %s ..."
-msgstr "%s มฆพศ ฦฤภฯภป พฒดย ม฿ ..."
-
-#: ../spell.c:7707 ../spell.c:7927
-#, c-format
-msgid "Estimated runtime memory use: %d bytes"
-msgstr "ร฿มคตศ ทฑลธภำ ธธ๐ธฎ ป็ฟ๋ทฎ: %d นูภฬฦฎ"
-
-#: ../spell.c:7820
-msgid "E751: Output file name must not have region name"
-msgstr "E751: ปผบ ฦฤภฯธํภบ ฟตฟช ภฬธงฐ๚ ดถ๓พ฿ วีดฯดู"
-
-#: ../spell.c:7822
-msgid "E754: Only up to 8 regions supported"
-msgstr "E754: รึด๋ 8ฐณภว ฟตฟชภฬ ม๖ฟ๘ตหดฯดู"
-
-#: ../spell.c:7846
-#, c-format
-msgid "E755: Invalid region in %s"
-msgstr "E755: %sฟก ภ฿ธ๘ตศ ฟตฟช"
-
-#: ../spell.c:7907
-msgid "Warning: both compounding and NOBREAK specified"
-msgstr "ฐๆฐํ: compoundฟอ NOBREAK ตั ดู ธํฝรตส"
-
-#: ../spell.c:7920
-#, c-format
-msgid "Writing spell file %s ..."
-msgstr "spell ฦฤภฯ %s พฒดย ม฿ ..."
-
-#: ../spell.c:7925
-msgid "Done!"
-msgstr "ณก!"
-
-#: ../spell.c:8034
-#, c-format
-msgid "E765: 'spellfile' does not have %<PRId64> entries"
-msgstr "E765: 'spellfile'ฟก %<PRId64> วืธ๑ภฬ พ๘ฝภดฯดู"
-
-#: ../spell.c:8074
-#, fuzzy, c-format
-msgid "Word '%.*s' removed from %s"
-msgstr "%sฟกผญ ดพ๎ ป่มฆตส"
-
-#: ../spell.c:8117
-#, fuzzy, c-format
-msgid "Word '%.*s' added to %s"
-msgstr "%sฟก ดพ๎ ร฿ฐกตส"
-
-#: ../spell.c:8381
-msgid "E763: Word characters differ between spell files"
-msgstr "E763: ดพ๎ฐก spell ฦฤภฯ ฐฃฟก ดูธจดฯดู"
-
-#: ../spell.c:8684
-msgid "Sorry, no suggestions"
-msgstr "มหผ, มฆพศวา ฐิ พ๘ฝภดฯดู"
-
-#: ../spell.c:8687
-#, c-format
-msgid "Sorry, only %<PRId64> suggestions"
-msgstr "มหผ, %<PRId64>ฐณธธ มฆพศ"
-
-#. for when 'cmdheight' > 1
-#. avoid more prompt
-#: ../spell.c:8704
-#, c-format
-msgid "Change \"%.*s\" to:"
-msgstr "Change \"%.*s\" to:"
-
-#: ../spell.c:8737
-#, c-format
-msgid " < \"%.*s\""
-msgstr " < \"%.*s\""
-
-#: ../spell.c:8882
-msgid "E752: No previous spell replacement"
-msgstr "E752: รถภฺฐก นูฒ๏ภ๛ภฬ พ๘ฝภดฯดู"
-
-#: ../spell.c:8925
-#, c-format
-msgid "E753: Not found: %s"
-msgstr "E753: รฃภป ผ๖ พ๘ภฝ: %s"
-
-#: ../spell.c:9276
-#, c-format
-msgid "E778: This does not look like a .sug file: %s"
-msgstr "E778: .sug ฦฤภฯภฬ พฦดั ฐอ ฐฐภฝ: %s"
-
-#: ../spell.c:9282
-#, c-format
-msgid "E779: Old .sug file, needs to be updated: %s"
-msgstr "E779: ฟภทกตศ .sug ฦฤภฯ, ฐปฝล วสฟไ: %s"
-
-#: ../spell.c:9286
-#, c-format
-msgid "E780: .sug file is for newer version of Vim: %s"
-msgstr "E780: .sug ฦฤภฯภฬ ป๕ น๖มฏภว Vimฟ๋ภำ: %s"
-
-#: ../spell.c:9295
-#, c-format
-msgid "E781: .sug file doesn't match .spl file: %s"
-msgstr "E781: .sug ฦฤภฯภฬ .spl ฦฤภฯฐ๚ ธยม๖ พสภฝ: %s"
-
-#: ../spell.c:9305
-#, c-format
-msgid "E782: error while reading .sug file: %s"
-msgstr "E782: .sug ฦฤภฯ ภะฑโ ฟกทฏ: %s"
-
-#. This should have been checked when generating the .spl
-#. file.
-#: ../spell.c:11575
-msgid "E783: duplicate char in MAP entry"
-msgstr "E783: MAP วืธ๑ฟก ม฿บนตศ นฎภฺ"
-
-#: ../syntax.c:266
-msgid "No Syntax items defined for this buffer"
-msgstr "ภฬ น๖ฦฟก ด๋วุ มคภวตศ ฑธนฎ วืธ๑ภฬ พ๘ฝภดฯดู"
-
-#: ../syntax.c:3083 ../syntax.c:3104 ../syntax.c:3127
-#, c-format
-msgid "E390: Illegal argument: %s"
-msgstr "E390: ภ฿ธ๘ตศ ภฮภฺ: %s"
-
-#: ../syntax.c:3299
-#, c-format
-msgid "E391: No such syntax cluster: %s"
-msgstr "E391: ภฬทฑ ฑธนฎ ลฌทฏฝบลอดย พ๘ฝภดฯดู: %s"
-
-#: ../syntax.c:3433
-msgid "syncing on C-style comments"
-msgstr "C-วฝฤ มึผฎนฎฟก ตฟฑโธยรใ"
-
-#: ../syntax.c:3439
-msgid "no syncing"
-msgstr "ตฟฑโธยรใ พ๘ภฝ"
-
-#: ../syntax.c:3441
-msgid "syncing starts "
-msgstr "syncing starts "
-
-#: ../syntax.c:3443 ../syntax.c:3506
-msgid " lines before top line"
-msgstr " lines before top line"
-
-#: ../syntax.c:3448
-msgid ""
-"\n"
-"--- Syntax sync items ---"
-msgstr ""
-"\n"
-"--- Syntax sync วืธ๑ต้ ---"
-
-#: ../syntax.c:3452
-msgid ""
-"\n"
-"syncing on items"
-msgstr ""
-"\n"
-"syncing on items"
-
-#: ../syntax.c:3457
-msgid ""
-"\n"
-"--- Syntax items ---"
-msgstr ""
-"\n"
-"--- Syntax วืธ๑ ---"
-
-#: ../syntax.c:3475
-#, c-format
-msgid "E392: No such syntax cluster: %s"
-msgstr "E392: ภฬทฑ ฑธนฎ ลฌทฏฝบลอดย พ๘ฝภดฯดู: %s"
-
-#: ../syntax.c:3497
-msgid "minimal "
-msgstr "minimal "
-
-#: ../syntax.c:3503
-msgid "maximal "
-msgstr "maximal "
-
-#: ../syntax.c:3513
-msgid "; match "
-msgstr "; match "
-
-#: ../syntax.c:3515
-msgid " line breaks"
-msgstr " line breaks"
-
-#: ../syntax.c:4076
-msgid "E395: contains argument not accepted here"
-msgstr "E395: contains ภฮภฺดย ฟฉฑโฟก พต ผ๖ พ๘ฝภดฯดู"
-
-#: ../syntax.c:4096
-msgid "E844: invalid cchar value"
-msgstr "E844: ภ฿ธ๘ตศ cchar ฐช"
-
-#: ../syntax.c:4107
-msgid "E393: group[t]here not accepted here"
-msgstr "E393: group[t]hereดย ฟฉฑโฟกผญ ป็ฟ๋ตษ ผ๖ พ๘ฝภดฯดู"
-
-#: ../syntax.c:4126
-#, c-format
-msgid "E394: Didn't find region item for %s"
-msgstr "E394: %sฟก ด๋วั region วืธ๑ภป รฃม๖ ธ๘ว฿ฝภดฯดู"
-
-#: ../syntax.c:4188
-msgid "E397: Filename required"
-msgstr "E397: ฦฤภฯภฬธงภฬ วสฟไวีดฯดู"
-
-#: ../syntax.c:4221
-#, fuzzy
-msgid "E847: Too many syntax includes"
-msgstr "E77: ฦฤภฯ ภฬธงภฬ ณสนซ ธนฝภดฯดู"
-
-#: ../syntax.c:4303
-#, c-format
-msgid "E789: Missing ']': %s"
-msgstr "E789: ']' ดฉถ๔: %s"
-
-#: ../syntax.c:4531
-#, c-format
-msgid "E398: Missing '=': %s"
-msgstr "E398: '=' ดฉถ๔: %s"
-
-#: ../syntax.c:4666
-#, c-format
-msgid "E399: Not enough arguments: syntax region %s"
-msgstr "E399: รๆบะฤก พสภบ ภฮภฺ: ฑธนฎ ฟตฟช %s"
-
-#: ../syntax.c:4870
-#, fuzzy
-msgid "E848: Too many syntax clusters"
-msgstr "E391: ภฬทฑ ฑธนฎ ลฌทฏฝบลอดย พ๘ฝภดฯดู: %s"
-
-#: ../syntax.c:4954
-msgid "E400: No cluster specified"
-msgstr "E400: ลฌทฏฝบลอฐก ธํฝรตวม๖ พสพาฝภดฯดู"
-
-#. end delimiter not found
-#: ../syntax.c:4986
-#, c-format
-msgid "E401: Pattern delimiter not found: %s"
-msgstr "E401: ฦะลฯ ฑธบะภฺธฆ รฃภป ผ๖ พ๘ฝภดฯดู: %s"
-
-#: ../syntax.c:5049
-#, c-format
-msgid "E402: Garbage after pattern: %s"
-msgstr "E402: ฦะลฯ ตฺฟก พฒทนฑโ: %s"
-
-#: ../syntax.c:5120
-msgid "E403: syntax sync: line continuations pattern specified twice"
-msgstr "E403: syntax sync: มู ฟฌผำ ฦะลฯภฬ ตฮ น๘ ป็ฟ๋ตวพ๚ฝภดฯดู"
-
-#: ../syntax.c:5169
-#, c-format
-msgid "E404: Illegal arguments: %s"
-msgstr "E404: บ๑มคป๓ภ๛ภฮ ภฮภฺ: %s"
-
-#: ../syntax.c:5217
-#, c-format
-msgid "E405: Missing equal sign: %s"
-msgstr "E405: ภฬฤ๗ ฑโศฃฐก บมณภฝ: %s"
-
-#: ../syntax.c:5222
-#, c-format
-msgid "E406: Empty argument: %s"
-msgstr "E406: บ๓ ภฮภฺ: %s"
-
-#: ../syntax.c:5240
-#, c-format
-msgid "E407: %s not allowed here"
-msgstr "E407: %sภบ(ดย) ฟฉฑโฟกผญ วใฟ๋ตวม๖ พสฝภดฯดู"
-
-#: ../syntax.c:5246
-#, c-format
-msgid "E408: %s must be first in contains list"
-msgstr "E408: %sภบ(ดย) contains ธ๑ทฯภว รน น๘ยฐฟฉพ฿ วีดฯดู"
-
-#: ../syntax.c:5304
-#, c-format
-msgid "E409: Unknown group name: %s"
-msgstr "E409: ธ๐ธฃดย ฑืท์ ภฬธง: %s"
-
-#: ../syntax.c:5512
-#, c-format
-msgid "E410: Invalid :syntax subcommand: %s"
-msgstr "E410: ภ฿ธ๘ตศ :syntax วฯภง ธํทษ: %s"
-
-#: ../syntax.c:5854
-msgid ""
-" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
-msgstr ""
-
-#: ../syntax.c:6146
-msgid "E679: recursive loop loading syncolor.vim"
-msgstr "E679: syncolor.vim นบน ทฮต๙"
-
-#: ../syntax.c:6256
-#, c-format
-msgid "E411: highlight group not found: %s"
-msgstr "E411: วฯภฬถ๓ภฬฦฎ ฑืท์ภป รฃภป ผ๖ พ๘ฝภดฯดู: %s"
-
-#: ../syntax.c:6278
-#, c-format
-msgid "E412: Not enough arguments: \":highlight link %s\""
-msgstr "E412: รๆบะฤก พสภบ ภฮภฺ: \":highlight link %s\""
-
-#: ../syntax.c:6284
-#, c-format
-msgid "E413: Too many arguments: \":highlight link %s\""
-msgstr "E413: ณสนซ ธนภบ ภฮภฺ: \":highlight link %s\""
-
-#: ../syntax.c:6302
-msgid "E414: group has settings, highlight link ignored"
-msgstr "E414: groupภฬ ผณมคฐชภฬ ภึฝภดฯดู, highlight link นซฝรตส"
-
-#: ../syntax.c:6367
-#, c-format
-msgid "E415: unexpected equal sign: %s"
-msgstr "E415: ถๆนภว ภฬฤ๗ ฑโศฃ: %s"
-
-#: ../syntax.c:6395
-#, c-format
-msgid "E416: missing equal sign: %s"
-msgstr "E416: ภฬฤ๗ ฑโศฃฐก บมณภฝ: %s"
-
-#: ../syntax.c:6418
-#, c-format
-msgid "E417: missing argument: %s"
-msgstr "E417: ภฮภฺฐก บมณภฝ: %s"
-
-#: ../syntax.c:6446
-#, c-format
-msgid "E418: Illegal value: %s"
-msgstr "E418: บ๑มคป๓ภ๛ภฮ ฐช: %s"
-
-#: ../syntax.c:6496
-msgid "E419: FG color unknown"
-msgstr "E419: ธ๐ธฃดย FG ป๖ป๓"
-
-#: ../syntax.c:6504
-msgid "E420: BG color unknown"
-msgstr "E420: ธ๐ธฃดย BG ป๖ป๓"
-
-#: ../syntax.c:6564
-#, c-format
-msgid "E421: Color name or number not recognized: %s"
-msgstr "E421: ป๖ ภฬธงภฬณช ผภฺธฆ ภฮฝฤวา ผ๖ พ๘ภฝ: %s"
-
-#: ../syntax.c:6714
-#, c-format
-msgid "E422: terminal code too long: %s"
-msgstr "E422: ลอนฬณฮ ฤฺตๅฐก ณสนซ ฑ่: %s"
-
-#: ../syntax.c:6753
-#, c-format
-msgid "E423: Illegal argument: %s"
-msgstr "E423: ภ฿ธ๘ตศ ภฮภฺ: %s"
-
-#: ../syntax.c:6925
-msgid "E424: Too many different highlighting attributes in use"
-msgstr "E424: ณสนซ ธนภบ ดูธฅ วฯภฬถ๓ภฬฦฎ ผำผบภฬ ป็ฟ๋ตวฐํ ภึฝภดฯดู"
-
-#: ../syntax.c:7427
-msgid "E669: Unprintable character in group name"
-msgstr "E669: ฑืท์ ภฬธงฟก รโทยวา ผ๖ พ๘ดย นฎภฺฐก ภึฝภดฯดู"
-
-#: ../syntax.c:7434
-msgid "W18: Invalid character in group name"
-msgstr "W18: ฑืท์ ภฬธงฟก ภฬป๓วั นฎภฺ"
-
-#: ../syntax.c:7448
-msgid "E849: Too many highlight and syntax groups"
-msgstr ""
-
-#: ../tag.c:104
-msgid "E555: at bottom of tag stack"
-msgstr "E555: ลยฑื ฝบลรภว ณกภิดฯดู"
-
-#: ../tag.c:105
-msgid "E556: at top of tag stack"
-msgstr "E556: ลยฑื ฝบลรภว รณภฝภิดฯดู"
-
-#: ../tag.c:380
-msgid "E425: Cannot go before first matching tag"
-msgstr "E425: รน น๘ยฐ ธยดย ลยฑื ภฬภภธทฮดย ฐฅ ผ๖ พ๘ฝภดฯดู"
-
-#: ../tag.c:504
-#, c-format
-msgid "E426: tag not found: %s"
-msgstr "E426: ลยฑืธฆ รฃภป ผ๖ พ๘ภฝ: %s"
-
-#: ../tag.c:528
-msgid " # pri kind tag"
-msgstr " # pri kind tag"
-
-#: ../tag.c:531
-msgid "file\n"
-msgstr "ฦฤภฯ\n"
-
-#: ../tag.c:829
-msgid "E427: There is only one matching tag"
-msgstr "E427: ธยดย ลยฑืฐก วฯณช นฟก พ๘ฝภดฯดู"
-
-#: ../tag.c:831
-msgid "E428: Cannot go beyond last matching tag"
-msgstr "E428: ธถม๖ธท ธยดย ลยฑื ตฺทฮดย ฐฅ ผ๖ พ๘ฝภดฯดู"
-
-#: ../tag.c:850
-#, c-format
-msgid "File \"%s\" does not exist"
-msgstr "ฦฤภฯ \"%s\"ภฬ(ฐก) มธภ็วฯม๖ พสฝภดฯดู"
-
-#. Give an indication of the number of matching tags
-#: ../tag.c:859
-#, c-format
-msgid "tag %d of %d%s"
-msgstr "tag %d of %d%s"
-
-#: ../tag.c:862
-msgid " or more"
-msgstr " or more"
-
-#: ../tag.c:864
-msgid " Using tag with different case!"
-msgstr " Using tag with different case!"
-
-#: ../tag.c:909
-#, c-format
-msgid "E429: File \"%s\" does not exist"
-msgstr "E429: ฦฤภฯ \"%s\"ภฬ(ฐก) มธภ็วฯม๖ พสฝภดฯดู"
-
-#. Highlight title
-#: ../tag.c:960
-msgid ""
-"\n"
-" # TO tag FROM line in file/text"
-msgstr ""
-"\n"
-" # TO tag FROM line in file/text"
-
-#: ../tag.c:1303
-#, c-format
-msgid "Searching tags file %s"
-msgstr "ลยฑื ฦฤภฯ %s รฃดย ม฿"
-
-#: ../tag.c:1545
-msgid "Ignoring long line in tags file"
-msgstr "ลยฑื ฦฤภฯภว ณสนซ ฑไ ถ๓ภฮภป นซฝรวีดฯดู"
-
-#: ../tag.c:1915
-#, c-format
-msgid "E431: Format error in tags file \"%s\""
-msgstr "E431: ลยฑื ฦฤภฯ \"%s\"ฟก วฝฤ ฟกทฏฐก ภึฝภดฯดู"
-
-#: ../tag.c:1917
-#, c-format
-msgid "Before byte %<PRId64>"
-msgstr "Before byte %<PRId64>"
-
-#: ../tag.c:1929
-#, c-format
-msgid "E432: Tags file not sorted: %s"
-msgstr "E432: ลยฑื ฦฤภฯภฬ มคทฤตวพ๎ ภึม๖ พสภฝ: %s"
-
-#. never opened any tags file
-#: ../tag.c:1960
-msgid "E433: No tags file"
-msgstr "E433: ลยฑื ฦฤภฯภฬ พ๘ฝภดฯดู"
-
-#: ../tag.c:2536
-msgid "E434: Can't find tag pattern"
-msgstr "E434: ลยฑื ฦะลฯภป รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../tag.c:2544
-msgid "E435: Couldn't find tag, just guessing!"
-msgstr "E435: ลยฑืธฆ รฃภป ผ๖ พ๘ม๖ธธ ภฬฐล ฐฐฝภดฯดู!"
-
-#: ../tag.c:2797
-#, c-format
-msgid "Duplicate field name: %s"
-msgstr "ม฿บนตศ วสตๅ ธํ: %s"
-
-#: ../term.c:1442
-msgid "' not known. Available builtin terminals are:"
-msgstr "' not known. Available builtin terminals are:"
-
-#: ../term.c:1463
-msgid "defaulting to '"
-msgstr "defaulting to '"
-
-#: ../term.c:1731
-msgid "E557: Cannot open termcap file"
-msgstr "E557: termcap ฦฤภฯภป ฟญ ผ๖ พ๘ฝภดฯดู"
-
-#: ../term.c:1735
-msgid "E558: Terminal entry not found in terminfo"
-msgstr "E558: ลอนฬณฮ วืธ๑ภป terminfoฟกผญ รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../term.c:1737
-msgid "E559: Terminal entry not found in termcap"
-msgstr "E559: ลอนฬณฮ วืธ๑ภป termcapฟกผญ รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../term.c:1878
-#, c-format
-msgid "E436: No \"%s\" entry in termcap"
-msgstr "E436: termcapฟก \"%s\" วืธ๑ภฬ พ๘ฝภดฯดู"
-
-#: ../term.c:2249
-msgid "E437: terminal capability \"cm\" required"
-msgstr "E437: ลอนฬณฮภฬ \"cm\" ฑโดษภป ม๖ฟ๘วุพ฿ วีดฯดู"
-
-#. Highlight title
-#: ../term.c:4376
-msgid ""
-"\n"
-"--- Terminal keys ---"
-msgstr ""
-"\n"
-"--- ลอนฬณฮ ลฐ ---"
-
-#: ../ui.c:481
-msgid "Vim: Error reading input, exiting...\n"
-msgstr "บ๖: ภิทย ภะดย ม฿ ฟกทฏ, ณกณปดยม฿...\n"
-
-#. This happens when the FileChangedRO autocommand changes the
-#. * file in a way it becomes shorter.
-#: ../undo.c:379
-#, fuzzy
-msgid "E881: Line count changed unexpectedly"
-msgstr "E834: มู ฐนผ๖ฐก ธ๐ธฃดย ป็ภฬฟก นูฒ๎พ๚ฝภดฯดู"
-
-#: ../undo.c:627
-#, c-format
-msgid "E828: Cannot open undo file for writing: %s"
-msgstr "E828: พฒฑโ ภงวุ undoภป ฟญ ผ๖ พ๘ฝภดฯดู: %s"
-
-#: ../undo.c:717
-#, c-format
-msgid "E825: Corrupted undo file (%s): %s"
-msgstr "E825: ฑ๚ม๘ undo ฦฤภฯ (%s): %s"
-
-#: ../undo.c:1039
-msgid "Cannot write undo file in any directory in 'undodir'"
-msgstr "'undodir'ฟก ภึดย พ๎ถฒ ต๐ทบลไธฎฟกตต undo ฦฤภฯภป พต ผ๖ พ๘ฝภดฯดู"
-
-#: ../undo.c:1074
-#, c-format
-msgid "Will not overwrite with undo file, cannot read: %s"
-msgstr "ภะภป ผ๖ฐก พ๘พ๎ผญ undo ฦฤภฯฟก ตคพ๎พต ผ๖ พ๘ฝภดฯดู: %s"
-
-#: ../undo.c:1092
-#, c-format
-msgid "Will not overwrite, this is not an undo file: %s"
-msgstr "undo ฦฤภฯภฬ พฦดฯพ๎ผญ ตคพ๎พต ผ๖ พ๘ฝภดฯดู: %s"
-
-#: ../undo.c:1108
-msgid "Skipping undo file write, nothing to undo"
-msgstr "undoวา ณปฟ๋ภฬ พ๘พ๎ผญ undo ฦฤภฯ ภ๚ภๅภป ฐวณสถดฯดู"
-
-#: ../undo.c:1121
-#, c-format
-msgid "Writing undo file: %s"
-msgstr "undo ฦฤภฯ พฒดย ม฿: %s"
-
-#: ../undo.c:1213
-#, c-format
-msgid "E829: write error in undo file: %s"
-msgstr "E829: undo ฦฤภฯ พฒฑโ ฟกทฏ: %s"
-
-#: ../undo.c:1280
-#, c-format
-msgid "Not reading undo file, owner differs: %s"
-msgstr "ผาภฏภฺฐก ดถ๓ผญ undo ฦฤภฯภป ภะม๖ พสฝภดฯดู: %s"
-
-#: ../undo.c:1292
-#, c-format
-msgid "Reading undo file: %s"
-msgstr "undo ฦฤภฯ ภะดย ม฿: %s"
-
-#: ../undo.c:1299
-#, c-format
-msgid "E822: Cannot open undo file for reading: %s"
-msgstr "E822: ภะฑโ ภงวุ undo ฦฤภฯภป ฟญ ผ๖ พ๘ฝภดฯดู: %s"
-
-#: ../undo.c:1308
-#, c-format
-msgid "E823: Not an undo file: %s"
-msgstr "E823: undo ฦฤภฯภฬ พฦดีดฯดู: %s"
-
-#: ../undo.c:1313
-#, c-format
-msgid "E824: Incompatible undo file: %s"
-msgstr "E824: ศฃศฏตวม๖ พสดย undo ฦฤภฯ: %s"
-
-#: ../undo.c:1328
-msgid "File contents changed, cannot use undo info"
-msgstr "ฦฤภฯ ณปฟ๋ภฬ นูฒ๎พ๎ผญ, undo มคบธธฆ ป็ฟ๋วา ผ๖ พ๘ฝภดฯดู"
-
-#: ../undo.c:1497
-#, c-format
-msgid "Finished reading undo file %s"
-msgstr "undo ฦฤภฯ %sภป(ธฆ) ภะพ๎ต้ฟดฝภดฯดู"
-
-#: ../undo.c:1586 ../undo.c:1812
-msgid "Already at oldest change"
-msgstr "ด๕ ภฬป๓ภว ผ๖มคภฬ พ๘พ๚ฝภดฯดู"
-
-#: ../undo.c:1597 ../undo.c:1814
-msgid "Already at newest change"
-msgstr "ด๕ ภฬป๓ภว ผ๖มคภบ พ๘พ๚ฝภดฯดู"
-
-#: ../undo.c:1806
-#, c-format
-msgid "E830: Undo number %<PRId64> not found"
-msgstr "E830: Undo น๘ศฃ %<PRId64>ธฆ รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../undo.c:1979
-msgid "E438: u_undo: line numbers wrong"
-msgstr "E438: u_undo: ภ฿ธ๘ตศ มู น๘ศฃ"
-
-#: ../undo.c:2183
-msgid "more line"
-msgstr "more line"
-
-#: ../undo.c:2185
-msgid "more lines"
-msgstr "more lines"
-
-#: ../undo.c:2187
-msgid "line less"
-msgstr "line less"
-
-#: ../undo.c:2189
-msgid "fewer lines"
-msgstr "fewer lines"
-
-#: ../undo.c:2193
-msgid "change"
-msgstr "change"
-
-#: ../undo.c:2195
-msgid "changes"
-msgstr "changes"
-
-#: ../undo.c:2225
-#, c-format
-msgid "%<PRId64> %s; %s #%<PRId64> %s"
-msgstr "%<PRId64> %s; %s #%<PRId64> %s"
-
-#: ../undo.c:2228
-msgid "before"
-msgstr "before"
-
-#: ../undo.c:2228
-msgid "after"
-msgstr "after"
-
-#: ../undo.c:2325
-msgid "Nothing to undo"
-msgstr "ร๋ผาวา ฐิ พ๘ฝภดฯดู"
-
-#: ../undo.c:2330
-msgid "number changes when saved"
-msgstr ""
-
-#: ../undo.c:2360
-#, c-format
-msgid "%<PRId64> seconds ago"
-msgstr "%<PRId64> seconds ago"
-
-#: ../undo.c:2372
-msgid "E790: undojoin is not allowed after undo"
-msgstr "E790: undo ตฺฟก undojoinภบ วา ผ๖ พ๘ฝภดฯดู"
-
-#: ../undo.c:2466
-msgid "E439: undo list corrupt"
-msgstr "E439: undo ธ๑ทฯภฬ ฑ๚มณฝภดฯดู"
-
-#: ../undo.c:2495
-msgid "E440: undo line missing"
-msgstr "E440: undo มูภฬ พ๘ฝภดฯดู"
-
-#: ../version.c:600
-msgid ""
-"\n"
-"Included patches: "
-msgstr ""
-"\n"
-"ฦ๗วิตศ ฦะฤก: "
-
-#: ../version.c:627
-msgid ""
-"\n"
-"Extra patches: "
-msgstr ""
-"\n"
-"บฐตตภว ฦะฤก: "
-
-#: ../version.c:639 ../version.c:864
-msgid "Modified by "
-msgstr "Modified by "
-
-#: ../version.c:646
-msgid ""
-"\n"
-"Compiled "
-msgstr ""
-"\n"
-"Compiled "
-
-#: ../version.c:649
-msgid "by "
-msgstr "by "
-
-#: ../version.c:660
-msgid ""
-"\n"
-"Huge version "
-msgstr ""
-"\n"
-"Huge น๖มฏ "
-
-#: ../version.c:661
-msgid "without GUI."
-msgstr "GUI พ๘ภฝ."
-
-#: ../version.c:662
-msgid " Features included (+) or not (-):\n"
-msgstr " ฑโดษ (+: ฦ๗วิตส, -: ฦ๗วิ พศ ตส):\n"
-
-#: ../version.c:667
-msgid " system vimrc file: \""
-msgstr " ฝรฝบล vimrc ฦฤภฯ: \""
-
-#: ../version.c:672
-msgid " user vimrc file: \""
-msgstr " ป็ฟ๋ภฺ vimrc ฦฤภฯ: \""
-
-#: ../version.c:677
-msgid " 2nd user vimrc file: \""
-msgstr " ป็ฟ๋ภฺ ตฮ น๘ยฐ vimrc ฦฤภฯ: \""
-
-#: ../version.c:682
-msgid " 3rd user vimrc file: \""
-msgstr " ป็ฟ๋ภฺ ผผ น๘ยฐ vimrc ฦฤภฯ: \""
-
-#: ../version.c:687
-msgid " user exrc file: \""
-msgstr " ป็ฟ๋ภฺ exrc ฦฤภฯ: \""
-
-#: ../version.c:692
-msgid " 2nd user exrc file: \""
-msgstr " ป็ฟ๋ภฺ ตฮ น๘ยฐ exrc ฦฤภฯ: \""
-
-#: ../version.c:699
-msgid " fall-back for $VIM: \""
-msgstr " fall-back for $VIM: \""
-
-#: ../version.c:705
-msgid " f-b for $VIMRUNTIME: \""
-msgstr " f-b for $VIMRUNTIME: \""
-
-#: ../version.c:709
-msgid "Compilation: "
-msgstr "ฤฤฦฤภฯ: "
-
-#: ../version.c:712
-msgid "Linking: "
-msgstr "ธตลฉ: "
-
-#: ../version.c:717
-msgid " DEBUG BUILD"
-msgstr " ต๐น๖ฑื บ๔ตๅ"
-
-#: ../version.c:767
-msgid "VIM - Vi IMproved"
-msgstr "บ๖ - วโป๓ตศ Vi"
-
-#: ../version.c:769
-msgid "version "
-msgstr "ฦว "
-
-#: ../version.c:770
-msgid "by Bram Moolenaar et al."
-msgstr "by Bram Moolenaar et al."
-
-#: ../version.c:774
-msgid "Vim is open source and freely distributable"
-msgstr "บ๖ภบ ผาฝบฐก ฟญทม ภึฐํ ฐ๘ยฅทฮ น่ฦ๗ตหดฯดู"
-
-#: ../version.c:776
-msgid "Help poor children in Uganda!"
-msgstr "ฟ์ฐฃดูฟก ป็ดย ฐกณญวั พฦภฬธฆ ตตฟอมึผผฟไ!"
-
-#: ../version.c:777
-msgid "type :help iccf<Enter> for information "
-msgstr "ภฬฟก ด๋วั มคบธธฆ บธทมธ้ :help iccf<ฟฃลอ> ภิทย"
-
-#: ../version.c:779
-msgid "type :q<Enter> to exit "
-msgstr "ณกณปทมธ้ :q<ฟฃลอ> ภิทย"
-
-#: ../version.c:780
-msgid "type :help<Enter> or <F1> for on-line help"
-msgstr "ฟยถ๓ภฮ ตตฟ๒ธปภป บธทมธ้ :help<ฟฃลอ> ถวดย <F1> ภิทย"
-
-#: ../version.c:781
-msgid "type :help version7<Enter> for version info"
-msgstr "ฦว มคบธธฆ บธทมธ้ :help version7<ฟฃลอ> ภิทย"
-
-#: ../version.c:784
-msgid "Running in Vi compatible mode"
-msgstr "Vi ศฃศฏ ป๓ลยทฮ ฝววเม฿ภิดฯดู"
-
-#: ../version.c:785
-msgid "type :set nocp<Enter> for Vim defaults"
-msgstr "บ๖ ฑโบปฐชภป ป็ฟ๋วฯทมธ้ :set nocp<ฟฃลอ> ภิทย"
-
-#: ../version.c:786
-msgid "type :help cp-default<Enter> for info on this"
-msgstr "ภฬฟก ด๋วั มคบธธฆ บธทมธ้ :help cp-default<ฟฃลอ> ภิทย"
-
-#: ../version.c:827
-msgid "Sponsor Vim development!"
-msgstr "บ๖ ฐณน฿ภป ศฤฟ๘วุ มึผผฟไ!"
-
-#: ../version.c:828
-msgid "Become a registered Vim user!"
-msgstr "บ๖ ป็ฟ๋ภฺทฮ ต๎ทฯวฯผผฟไ!"
-
-#: ../version.c:831
-msgid "type :help sponsor<Enter> for information "
-msgstr "ภฬฟก ด๋วั มคบธธฆ บธทมธ้ :help sponsor<ฟฃลอ> ภิทย"
-
-#: ../version.c:832
-msgid "type :help register<Enter> for information "
-msgstr "ภฬฟก ด๋วั มคบธธฆ บธทมธ้ :help register<ฟฃลอ> ภิทย"
-
-#: ../version.c:834
-msgid "menu Help->Sponsor/Register for information "
-msgstr "ภฬฟก ด๋วั มคบธธฆ บธทมธ้ ธดบ ตตฟ๒ธป->Sponsor/Register"
-
-#: ../window.c:119
-msgid "Already only one window"
-msgstr "ภฬนฬ วฯณชภว รขธธ ภึฝภดฯดู"
-
-#: ../window.c:224
-msgid "E441: There is no preview window"
-msgstr "E441: นฬธฎ บธฑโ รขภฬ พ๘ฝภดฯดู"
-
-#: ../window.c:559
-msgid "E442: Can't split topleft and botright at the same time"
-msgstr "E442: ภง ฟยสฐ๚ พฦทก ฟภธฅยสภป ตฟฝรฟก ณชดญ ผ๖ พ๘ฝภดฯดู"
-
-#: ../window.c:1228
-msgid "E443: Cannot rotate when another window is split"
-msgstr "E443: ดูธฅ รขภฬ ณชดฒมณภป ถงฟกดย ศธภวา ผ๖ พ๘ฝภดฯดู"
-
-#: ../window.c:1803
-msgid "E444: Cannot close last window"
-msgstr "E444: ธถม๖ธท รขภป ดภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../window.c:1810
-msgid "E813: Cannot close autocmd window"
-msgstr "E813: autocmd รขภป ดภป ผ๖ พ๘ฝภดฯดู"
-
-#: ../window.c:1814
-msgid "E814: Cannot close window, only autocmd window would remain"
-msgstr "E814: รขภป ดภป ผ๖ พ๘ภฝ, autocmd รขธธ ณฒภฝ"
-
-#: ../window.c:2717
-msgid "E445: Other window contains changes"
-msgstr "E445: ดูธฅ รขภฬ นูฒ๎พ๚ฝภดฯดู"
-
-#: ../window.c:4805
-msgid "E446: No file name under cursor"
-msgstr "E446: ฤฟผญ นุฟก ฦฤภฯ ภฬธงภฬ พ๘ฝภดฯดู"
-
-#~ msgid "E831: bf_key_init() called with empty password"
-#~ msgstr "E831: บ๓ บ๑นะน๘ศฃทฮ bf_key_init() วิผ๖ฐก บาทมมณฝภดฯดู"
-
-#~ msgid "E820: sizeof(uint32_t) != 4"
-#~ msgstr "E820: sizeof(uint32_t) != 4"
-
-#~ msgid "E817: Blowfish big/little endian use wrong"
-#~ msgstr "E817: Blowfish big/little endian use wrong"
-
-#~ msgid "E818: sha256 test failed"
-#~ msgstr "E818: sha256 ฝรว่ภฬ ฝวฦะว฿ฝภดฯดู."
-
-#~ msgid "E819: Blowfish test failed"
-#~ msgstr "E819: Blowfish ฝรว่ภฬ ฝวฦะว฿ฝภดฯดู."
-
-#~ msgid "Patch file"
-#~ msgstr "ฦะลฐ ฦฤภฯ"
-
-#~ msgid ""
-#~ "&OK\n"
-#~ "&Cancel"
-#~ msgstr ""
-#~ "ศฎภฮ(&O)\n"
-#~ "ร๋ผา(&C)"
-
-#~ msgid "E240: No connection to Vim server"
-#~ msgstr "E240: Vim ผญน๖ฟก ฟฌฐแตวพ๎ ภึม๖ พสฝภดฯดู"
-
-#~ msgid "E241: Unable to send to %s"
-#~ msgstr "E241: %s(ภธ)ทฮ บธณพ ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "E277: Unable to read a server reply"
-#~ msgstr "E277: ผญน๖ภว ภภดไภป ภะภป ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "E258: Unable to send to client"
-#~ msgstr "E258: ลฌถ๓ภฬพ๐ฦฎทฮ บธณพ ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "Save As"
-#~ msgstr "ดูธฅ ภฬธงภธทฮ ภ๚ภๅ"
-
-#~ msgid "Edit File"
-#~ msgstr "ฦฤภฯ ฐํฤกฑโ"
-
-#~ msgid " (NOT FOUND)"
-#~ msgstr " (ธ๘ รฃพาภฝ)"
-
-#~ msgid "Source Vim script"
-#~ msgstr "บ๖ ฝบลฉธณฦฎ ทฮตๅ"
-
-#~ msgid "unknown"
-#~ msgstr "ธ๐ธง"
-
-#~ msgid "Edit File in new window"
-#~ msgstr "ป๕ รขฟกผญ ฦฤภฯ ฐํฤกฑโ"
-
-#~ msgid "Append File"
-#~ msgstr "ฦฤภฯ ร฿ฐก"
-
-#~ msgid "Window position: X %d, Y %d"
-#~ msgstr "รข ภงฤก: X %d, Y %d"
-
-#~ msgid "Save Redirection"
-#~ msgstr "ธฎต๐ทบผว ภ๚ภๅ"
-
-#~ msgid "Save View"
-#~ msgstr "บธฑโ ภ๚ภๅ"
-
-#~ msgid "Save Session"
-#~ msgstr "ผผผว ภ๚ภๅ"
-
-#~ msgid "Save Setup"
-#~ msgstr "ผณมค ภ๚ภๅ"
-
-#~ msgid "E809: #< is not available without the +eval feature"
-#~ msgstr "E809: #<ดย +eval ฑโดษภฬ ฦ๗วิตวพ๎พ฿ ป็ฟ๋วา ผ๖ ภึฝภดฯดู"
-
-#~ msgid "E196: No digraphs in this version"
-#~ msgstr "E196: ภฬ ฦวฟกดย digraphฐก พ๘ฝภดฯดู"
-
-#~ msgid "is a device (disabled with 'opendevice' option)"
-#~ msgstr "ภบ(ดย) ภๅฤกฐก พฦดีดฯดู ('opendevice' ฟษผวภธทฮ ธทศ๛)"
-
-#~ msgid "Reading from stdin..."
-#~ msgstr "วฅมุภิทยฟกผญ ภะดย ม฿..."
-
-#~ msgid "[crypted]"
-#~ msgstr "[พฯศฃศญ ตวพ๚ฝภดฯดู]"
-
-#~ msgid "E821: File is encrypted with unknown method"
-#~ msgstr "E821: ฦฤภฯภฬ ธ๐ธฃดย นๆนภธทฮ พฯศฃศญตวพ๎ ภึฝภดฯดู"
-
-#~ msgid "NetBeans disallows writes of unmodified buffers"
-#~ msgstr "NetBeansฟกผญดย นูฒ๎ม๖ พสภบ น๖ฦธฆ พต ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "Partial writes disallowed for NetBeans buffers"
-#~ msgstr "NetBeans น๖ฦฟก ด๋วุผญดย บฮบะ ภ๚ภๅภป วา ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "writing to device disabled with 'opendevice' option"
-#~ msgstr "ภๅฤก พฒฑโฐก 'opendevice' ฟษผวภธทฮ ธทศ๛"
-
-#~ msgid "E460: The resource fork would be lost (add ! to override)"
-#~ msgstr "E460: The resource fork will be lost (ตคพ๎พฒทมธ้ ! ด๕วฯฑโ)"
-
-#~ msgid "E229: Cannot start the GUI"
-#~ msgstr "E229: GUIธฆ ฝรภวา ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "E230: Cannot read from \"%s\""
-#~ msgstr "E230: \"%s\"ฟกผญ ภะภป ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "E665: Cannot start GUI, no valid font found"
-#~ msgstr "E665: พตธธวั ฑฒรภป รฃภป ผ๖ พ๘พ๎ผญ GUIธฆ ฝววเวา ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "E231: 'guifontwide' invalid"
-#~ msgstr "E231: 'guifontwide'ฐก ภฬป๓วีดฯดู"
-
-#~ msgid "E599: Value of 'imactivatekey' is invalid"
-#~ msgstr "E599: 'imactivatekey' ฐชภฬ ภฬป๓วีดฯดู"
-
-#~ msgid "E254: Cannot allocate color %s"
-#~ msgstr "E254: ป๖ %sภป(ธฆ) วาด็วา ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "<cannot open> "
-#~ msgstr "<ฟญ ผ๖ พ๘ภฝ> "
-
-#~ msgid "E616: vim_SelFile: can't get font %s"
-#~ msgstr "E616: vim_SelFile: ฑฒร %sภป(ธฆ) พ๒ภป ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "E614: vim_SelFile: can't return to current directory"
-#~ msgstr "E614: vim_SelFile: ว๖ภ็ ต๐ทบลไธฎทฮ ตนพฦฐฅ ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "Pathname:"
-#~ msgstr "ฐๆทฮ ภฬธง:"
-
-#~ msgid "E615: vim_SelFile: can't get current directory"
-#~ msgstr "E615: vim_SelFile: ว๖ภ็ ต๐ทบลไธฎธฆ พ๒ภป ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "OK"
-#~ msgstr "ศฎภฮ"
-
-#~ msgid "Cancel"
-#~ msgstr "ร๋ผา"
-
-#~ msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
-#~ msgstr "ฝบลฉทันู ภงมฌ: ฝๆ วศฝบธสภว ม๖ฟภนฬฦฎธฎธฆ พ๒ภป ผ๖ พ๘ฝภดฯดู."
-
-#~ msgid "Vim dialog"
-#~ msgstr "บ๖ ด๋ศญป๓ภฺ"
-
-#~ msgid "E232: Cannot create BalloonEval with both message and callback"
-#~ msgstr ""
-#~ "E232: ธฝรม๖ฟอ ฤน้ ธ๐ตฮธฆ ป็ฟ๋วุผญดย BalloonEvalภป ธธต้ ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "Input _Methods"
-#~ msgstr "ภิทย นๆน(_M)"
-
-#~ msgid "VIM - Search and Replace..."
-#~ msgstr "บ๖ - รฃพฦผญ นูฒูฑโ..."
-
-#~ msgid "VIM - Search..."
-#~ msgstr "บ๖ - รฃฑโ..."
-
-#~ msgid "Find what:"
-#~ msgstr "นซพ๓ รฃภปฑ๎ฟไ:"
-
-#~ msgid "Replace with:"
-#~ msgstr "นูฒ นฎภฺฟญ:"
-
-#~ msgid "Match whole word only"
-#~ msgstr "ถศฐฐภบ ณนธปธธ"
-
-#~ msgid "Direction"
-#~ msgstr "นๆวโ"
-
-#~ msgid "Up"
-#~ msgstr "ภงทฮ"
-
-#~ msgid "Down"
-#~ msgstr "พฦทกทฮ"
-
-#~ msgid "Find Next"
-#~ msgstr "ดูภฝ รฃฑโ"
-
-#~ msgid "Replace"
-#~ msgstr "นูฒูฑโ"
-
-#~ msgid "Replace All"
-#~ msgstr "ธ๐ตฮ นูฒูฑโ"
-
-#~ msgid "Vim: Received \"die\" request from session manager\n"
-#~ msgstr "บ๖: ผผผว ฐธฎภฺทฮบฮลอ \"die\" ฟไรปภป นพาฝภดฯดู\n"
-
-#~ msgid "Close"
-#~ msgstr "ดฑโ"
-
-#~ msgid "New tab"
-#~ msgstr "ป๕ ลว"
-
-#~ msgid "Open Tab..."
-#~ msgstr "ลว ฟญฑโ..."
-
-#~ msgid "Vim: Main window unexpectedly destroyed\n"
-#~ msgstr "บ๖: ธภฮ รขภฬ มืฐิ ตษ ฐอภิดฯดู\n"
-
-#~ msgid "&Filter"
-#~ msgstr "ฐลธฃฐณ(&F)"
-
-#~ msgid "&Cancel"
-#~ msgstr "ร๋ผา(&C)"
-
-#~ msgid "Directories"
-#~ msgstr "ต๐ทบลไธฎ"
-
-#~ msgid "Filter"
-#~ msgstr "ฐลธฃฐณ"
-
-#~ msgid "&Help"
-#~ msgstr "ตตฟ๒ธป(&H)"
-
-#~ msgid "Files"
-#~ msgstr "ฦฤภฯ"
-
-#~ msgid "&OK"
-#~ msgstr "ศฎภฮ(&O)"
-
-#~ msgid "Selection"
-#~ msgstr "ฐํธฃฑโ"
-
-#~ msgid "Find &Next"
-#~ msgstr "ดูภฝ รฃฑโ(&N)"
-
-#~ msgid "&Replace"
-#~ msgstr "นูฒูฑโ(&R)"
-
-#~ msgid "Replace &All"
-#~ msgstr "ธ๐ตฮ นูฒูฑโ(&A)"
-
-#~ msgid "&Undo"
-#~ msgstr "ร๋ผา(&U)"
-
-#~ msgid "E671: Cannot find window title \"%s\""
-#~ msgstr "E671: รข มฆธ๑ \"%s\"ภป(ธฆ) รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
-#~ msgstr "E243: ม๖ฟ๘ตวม๖ พสดย ภฮภฺ: \"-%s\": OLE ฦวภป ป็ฟ๋วฯฝสฝรฟภ."
-
-#~ msgid "E672: Unable to open window inside MDI application"
-#~ msgstr "E672: MDI ภภฟ๋วมทฮฑืทฅ พศฟกผญ รขภป ฟญ ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "Close tab"
-#~ msgstr "ลว ดฑโ"
-
-#~ msgid "Open tab..."
-#~ msgstr "ลว ฟญฑโ..."
-
-#~ msgid "Find string (use '\\\\' to find a '\\')"
-#~ msgstr "นฎภฺฟญ รฃฑโ ('\\'ธฆ รฃภธทมธ้ '\\\\' ป็ฟ๋)"
-
-#~ msgid "Find & Replace (use '\\\\' to find a '\\')"
-#~ msgstr "นฎภฺฟญ รฃพฦ นูฒูฑโ ('\\'ธฆ รฃภธทมธ้ '\\\\' ป็ฟ๋)"
-
-#~ msgid "Not Used"
-#~ msgstr "ป็ฟ๋ พสตส"
-
-#~ msgid "Directory\t*.nothing\n"
-#~ msgstr "ต๐ทบลไธฎ\t*.nothing\n"
-
-#~ msgid ""
-#~ "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
-#~ msgstr ""
-#~ "บ๖ E458: ป๖ป๓ธส ฟฃฦฎธฎธฆ วาด็วา ผ๖ พ๘ฝภดฯดู, ธ๎ธ๎ ป๖ภฬ ภ฿ธ๘ตษ ผ๖ ภึฝภดฯดู"
-
-#~ msgid "E250: Fonts for the following charsets are missing in fontset %s:"
-#~ msgstr "E250: ดูภฝ ฑภฺผยภว ฑฒรภฬ ฑฒรผย %sฟก พ๘ฝภดฯดู:"
-
-#~ msgid "E252: Fontset name: %s"
-#~ msgstr "E252: ฑฒรผย ภฬธง: %s"
-
-#~ msgid "Font '%s' is not fixed-width"
-#~ msgstr "ฑฒร '%s'ภบ(ดย) ฐํมคณะภฬฐก พฦดีดฯดู"
-
-#~ msgid "E253: Fontset name: %s\n"
-#~ msgstr "E253: ฑฒรผย ภฬธง: %s\n"
-
-#~ msgid "Font0: %s\n"
-#~ msgstr "ฑฒร0: %s\n"
-
-#~ msgid "Font1: %s\n"
-#~ msgstr "ฑฒร1: %s\n"
-
-#~ msgid "Font%<PRId64> width is not twice that of font0\n"
-#~ msgstr "ฑฒร%<PRId64> ณสบ๑ฐก ฑฒร0ภว ตฮน่ฐก พฦดีดฯดู\n"
-
-#~ msgid "Font0 width: %<PRId64>\n"
-#~ msgstr "ฑฒร0 ณสบ๑: %<PRId64>\n"
-
-#~ msgid ""
-#~ "Font1 width: %<PRId64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "ฑฒร1 ณสบ๑: %<PRId64>\n"
-#~ "\n"
-
-#~ msgid "Vim - Font Selector"
-#~ msgstr "Vim - ฑฒร ผฑลรฑโ"
-
-#~ msgid "Name:"
-#~ msgstr "ภฬธง:"
-
-#~ msgid "Encoding:"
-#~ msgstr "ภฮฤฺต๙:"
-
-#~ msgid "Font:"
-#~ msgstr "ฑฒร:"
-
-#~ msgid "Style:"
-#~ msgstr "ฝบลธภฯ:"
-
-#~ msgid "Size:"
-#~ msgstr "ลฉฑโ:"
-
-#~ msgid "E256: Hangul automata ERROR"
-#~ msgstr "E256: วัฑ ฟภลไธถลธ ฟกทฏ"
-
-#~ msgid "E563: stat error"
-#~ msgstr "E563: stat ฟกทฏ"
-
-#~ msgid "E625: cannot open cscope database: %s"
-#~ msgstr "E625: cscope ตฅภฬลอบฃภฬฝบธฆ ฟญ ผ๖ พ๘ภฝ: %s"
-
-#~ msgid "E626: cannot get cscope database information"
-#~ msgstr "E626: cscope ตฅภฬลอบฃภฬฝบ มคบธธฆ พ๒ภป ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "cannot save undo information"
-#~ msgstr "undo มคบธธฆ ภ๚ภๅวา ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid ""
-#~ "E815: Sorry, this command is disabled, the MzScheme libraries could not "
-#~ "be loaded."
-#~ msgstr ""
-#~ "E815: นฬพศวีดฯดู, ภฬ ธํทษภบ ป็ฟ๋วา ผ๖ พ๘ฝภดฯดู, MzScheme ถ๓ภฬบ๊ทฏธฎธฆ ทฮต๙"
-#~ "วา ผ๖ พ๘ฝภดฯดู."
-
-#~ msgid "invalid expression"
-#~ msgstr "ภ฿ธ๘ตศ วฅว๖ฝฤ"
-
-#~ msgid "expressions disabled at compile time"
-#~ msgstr "วฅว๖ฝฤภป ม๖ฟ๘วฯม๖ พสตตทฯ ฤฤฦฤภฯ ตวพ๚ฝภดฯดู"
-
-#~ msgid "unknown option"
-#~ msgstr "ธ๐ธฃดย ฟษผว"
-
-#~ msgid "window index is out of range"
-#~ msgstr "รข น๘ศฃฐก นภงธฆ นพ๎ณตฝภดฯดู"
-
-#~ msgid "couldn't open buffer"
-#~ msgstr "น๖ฦธฆ ฟญ ผ๖ พ๘พ๚ฝภดฯดู"
-
-#~ msgid "cannot delete line"
-#~ msgstr "มูภป ม๖ฟ๏ ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "cannot replace line"
-#~ msgstr "มูภป นูฒ ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "cannot insert line"
-#~ msgstr "มูภป ณขฟ๖ณึภป ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "string cannot contain newlines"
-#~ msgstr "นฎภฺฟญภบ newlineภป ฦ๗วิวา ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "Vim error: ~a"
-#~ msgstr "Vim ฟกทฏ: ~a"
-
-#~ msgid "Vim error"
-#~ msgstr "Vim ฟกทฏ"
-
-#~ msgid "buffer is invalid"
-#~ msgstr "น๖ฦฐก ภฬป๓วีดฯดู"
-
-#~ msgid "window is invalid"
-#~ msgstr "รขภฬ ภฬป๓วีดฯดู"
-
-#~ msgid "linenr out of range"
-#~ msgstr "มู น๘ศฃฐก นภงธฆ นพ๎ณตฝภดฯดู"
-
-#~ msgid "not allowed in the Vim sandbox"
-#~ msgstr "Vim sandboxฟกผญดย วใฟ๋ตวม๖ พสฝภดฯดู"
-
-#~ msgid "E836: This Vim cannot execute :python after using :py3"
-#~ msgstr "E836: ภฬ Vimภบ :py3ภป ป็ฟ๋วั ศฤฟก :pythonภป ป็ฟ๋วา ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid ""
-#~ "E263: Sorry, this command is disabled, the Python library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E263: นฬพศวีดฯดู, ภฬ ธํทษภบ ป็ฟ๋วา ผ๖ พ๘ฝภดฯดู, ฦฤภฬฝใ ถ๓ภฬบ๊ทฏธฎธฆ ทฮต๙"
-#~ "วา ผ๖ พ๘ฝภดฯดู."
-
-#~ msgid "E659: Cannot invoke Python recursively"
-#~ msgstr "E659: Pythonภป ภ็ฑอศฃรโวา ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "can't delete OutputObject attributes"
-#~ msgstr "OutputObject ผำผบภป ม๖ฟ๏ ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "softspace must be an integer"
-#~ msgstr "softspaceดย มคผ๖ฟฉพ฿ธธ วีดฯดู"
-
-#~ msgid "invalid attribute"
-#~ msgstr "ภ฿ธ๘ตศ ผำผบ"
-
-#~ msgid "<buffer object (deleted) at %p>"
-#~ msgstr "<%pฟก น๖ฦ ฐดรผ (ป่มฆตส)>"
-
-#~ msgid "E837: This Vim cannot execute :py3 after using :python"
-#~ msgstr "E837: ภฬ Vimภบ :pythonภป ป็ฟ๋วั ศฤฟก :py3ภป ป็ฟ๋วา ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid ""
-#~ "E266: Sorry, this command is disabled, the Ruby library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E266: นฬพศวีดฯดู, ภฬ ธํทษภบ ป็ฟ๋วา ผ๖ พ๘ฝภดฯดู, ท็บ๑ ถ๓ภฬบ๊ทฏธฎธฆ ทฮต๙วา "
-#~ "ผ๖ พ๘ฝภดฯดู."
-
-#~ msgid "E267: unexpected return"
-#~ msgstr "E267: ถๆนภว return"
-
-#~ msgid "E268: unexpected next"
-#~ msgstr "E268: ถๆนภว next"
-
-#~ msgid "E269: unexpected break"
-#~ msgstr "E269: ถๆนภว break"
-
-#~ msgid "E270: unexpected redo"
-#~ msgstr "E270: ถๆนภว redo"
-
-#~ msgid "E272: unhandled exception"
-#~ msgstr "E272: รณธฎพสตศ ฟนฟ"
-
-#~ msgid "E273: unknown longjmp status %d"
-#~ msgstr "E273: ธ๐ธฃดย longjmp ป๓ลย %d"
-
-#~ msgid "Toggle implementation/definition"
-#~ msgstr "ลไฑ ฑธว๖/มคภว"
-
-#~ msgid "Show base class of"
-#~ msgstr "...ภว ฑโบป ลฌทกฝบ บธฟฉมึฑโ"
-
-#~ msgid ""
-#~ "Cannot connect to SNiFF+. Check environment (sniffemacs must be found in "
-#~ "$PATH).\n"
-#~ msgstr ""
-#~ "SNiFF+ทฮ ฟฌฐแวา ผ๖ พ๘ฝภดฯดู. ศฏฐๆภป ศฎภฮวฯฝสฝรฟภ (sniffemacsฐก $PATHฟกผญ "
-#~ "รฃพฦมฎพ฿ วีดฯดู).\n"
-
-#~ msgid "E274: Sniff: Error during read. Disconnected"
-#~ msgstr "E274: Sniff: ภะดย ม฿ ฟกทฏ. ฒ๗ฑ่"
-
-#~ msgid "SNiFF+ is currently "
-#~ msgstr "SNiFF+ is currently "
-
-#~ msgid "not "
-#~ msgstr "not "
-
-#~ msgid "connected"
-#~ msgstr "connected"
-
-#~ msgid "E275: Unknown SNiFF+ request: %s"
-#~ msgstr "E275: ธ๐ธฃดย SNiFF+ ฟไรป: %s"
-
-#~ msgid "E276: Error connecting to SNiFF+"
-#~ msgstr "E276: SNiFF+ฟก ฟฌฐแ ฟกทฏ"
-
-#~ msgid "E278: SNiFF+ not connected"
-#~ msgstr "E278: SniFF+ฐก ฟฌฐแตวม๖ พสพาฝภดฯดู"
-
-#~ msgid "E279: Not a SNiFF+ buffer"
-#~ msgstr "E279: SniFF+ น๖ฦฐก พฦดีดฯดู"
-
-#~ msgid "Sniff: Error during write. Disconnected"
-#~ msgstr "Sniff: พฒดย ตตม฿ ฟกทฏ. ฒ๗ฐๅฝภดฯดู"
-
-#~ msgid "invalid buffer number"
-#~ msgstr "ภ฿ธ๘ตศ น๖ฦ น๘ศฃ"
-
-#~ msgid "not implemented yet"
-#~ msgstr "พฦม๗ ฑธว๖ตวม๖ พสพาฝภดฯดู"
-
-#~ msgid "cannot set line(s)"
-#~ msgstr "มูภป ผณมควา ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "invalid mark name"
-#~ msgstr "ภ฿ธ๘ตศ ธถลฉ ภฬธง"
-
-#~ msgid "mark not set"
-#~ msgstr "ธถลฉฐก ผณมคตวม๖ พสพาฝภดฯดู"
-
-#~ msgid "row %d column %d"
-#~ msgstr "วเ %d ฟญ %d"
-
-#~ msgid "cannot insert/append line"
-#~ msgstr "มูภป ณขฟ๖ณึฐลณช ด๕วา ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "line number out of range"
-#~ msgstr "มู น๘ศฃฐก นภงธฆ นพ๎ณตฝภดฯดู"
-
-#~ msgid "unknown flag: "
-#~ msgstr "ธ๐ธฃดย วรทกฑื: "
-
-#~ msgid "unknown vimOption"
-#~ msgstr "ธ๐ธฃดย บ๖ ฟษผว"
-
-#~ msgid "keyboard interrupt"
-#~ msgstr "ลฐบธตๅ ภฮลอทดฦฎ"
-
-#~ msgid "vim error"
-#~ msgstr "บ๖ ฟกทฏ"
-
-#~ msgid "cannot create buffer/window command: object is being deleted"
-#~ msgstr "น๖ฦ/รข ธํทษภป ธธต้ ผ๖ พ๘ฝภดฯดู: ฐดรผฐก ม๖ฟ๖มดฯดู"
-
-#~ msgid ""
-#~ "cannot register callback command: buffer/window is already being deleted"
-#~ msgstr "ฤน้ ธํทษภป ต๎ทฯวา ผ๖ พ๘ฝภดฯดู: น๖ฦ/รขภฬ ภฬนฬ ม๖ฟ๖มณฝภดฯดู"
-
-#~ msgid ""
-#~ "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-"
-#~ "dev@vim.org"
-#~ msgstr ""
-#~ "E280: TCL ฝษฐขวั ฟกทฏ: reflistฐก ฑ๚มณณช!? ภฬ นฎมฆธฆ vim-dev@vim.orgทฮ พหทม"
-#~ "มึฝสฝรฟภ"
-
-#~ msgid "cannot register callback command: buffer/window reference not found"
-#~ msgstr "ฤน้ ธํทษภป ต๎ทฯวา ผ๖ พ๘ฝภดฯดู: น๖ฦ/รข ยมถธฆ รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid ""
-#~ "E571: Sorry, this command is disabled: the Tcl library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E571: นฬพศวีดฯดู, ภฬ ธํทษภบ ป็ฟ๋วา ผ๖ พ๘ฝภดฯดู, Tcl ถ๓ภฬบ๊ทฏธฎธฆ ทฮต๙วา "
-#~ "ผ๖ พ๘ฝภดฯดู."
-
-#~ msgid ""
-#~ "E281: TCL ERROR: exit code is not int!? Please report this to vim-dev@vim."
-#~ "org"
-#~ msgstr ""
-#~ "E281: TCL ฟกทฏ: ณกณปฑโ ฤฺตๅฐก มคผ๖ฐก พฦดัฐก!? ภฬ นฎมฆธฆ vim-dev@vim.orgทฮ "
-#~ "พหทมมึฝสฝรฟภ"
-
-#~ msgid "E572: exit code %d"
-#~ msgstr "E572: มพทแ ฤฺตๅ %d"
-
-#~ msgid "cannot get line"
-#~ msgstr "มูภป พ๒ภป ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "Unable to register a command server name"
-#~ msgstr "ธํทษ ผญน๖ ภฬธงภป ต๎ทฯวา ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "E248: Failed to send command to the destination program"
-#~ msgstr "E248: ด๋ป๓วมทฮฑืทฅภธทฮ ธํทษ บธณปฑโฐก ฝวฦะว฿ฝภดฯดู"
-
-#~ msgid "E573: Invalid server id used: %s"
-#~ msgstr "E573: ภ฿ธ๘ตศ ผญน๖ id ป็ฟ๋ตส: %s"
-
-#~ msgid "E251: VIM instance registry property is badly formed. Deleted!"
-#~ msgstr "E251: บ๖ ภฮฝบลฯฝบ ทนม๖ฝบฦฎธฎ ผำผบภฬ ภ฿ธ๘ตวพ๎ ภึฝภดฯดู. ม๖ฟฝภดฯดู!"
-
-#~ msgid "netbeans is not supported with this GUI\n"
-#~ msgstr "ภฬ GUIดย netbeansธฆ ม๖ฟ๘วฯม๖ พสฝภดฯดู\n"
-
-#~ msgid "This Vim was not compiled with the diff feature."
-#~ msgstr "ภฬ บ๖ภบ diff ฑโดษ พ๘ภฬ ฤฤฦฤภฯ ตวพ๚ฝภดฯดู."
-
-#~ msgid "'-nb' cannot be used: not enabled at compile time\n"
-#~ msgstr "'-nb'ดย ป็ฟ๋วา ผ๖ พ๘ภฝ: ฤฤฦฤภฯวา ถง ฦ๗วิตวม๖ พสภฝ\n"
-
-#~ msgid "Vim: Error: Failure to start gvim from NetBeans\n"
-#~ msgstr "Vim: ฟกทฏ: NetBeansฟกผญ gvim ฝรภ ฝวฦะ\n"
-
-#~ msgid "-register\t\tRegister this gvim for OLE"
-#~ msgstr "-register\t\tภฬ gvim OLEฟก ต๎ทฯ"
-
-#~ msgid "-unregister\t\tUnregister gvim for OLE"
-#~ msgstr "-unregister\t\tgvimภป OLEฟกผญ ต๎ทฯร๋ผา"
-
-#~ msgid "-g\t\t\tRun using GUI (like \"gvim\")"
-#~ msgstr "-g\t\t\tGUIทฮ ฝววเ (\"gvim\"ฐ๚ ฐฐภฝ)"
-
-#~ msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
-#~ msgstr "-f ศคภบ --nofork\tฦ๗ฑืถ๓ฟ๎ตๅ: GUIทฮ ฝรภวา ถง forkวฯม๖ ธป ฐอ"
-
-#~ msgid "-f\t\t\tDon't use newcli to open window"
-#~ msgstr "-f\t\t\tรขภป ฟญ ถง newcli ป็ฟ๋วฯม๖ พสภฝ"
-
-#~ msgid "-dev <device>\t\tUse <device> for I/O"
-#~ msgstr "-dev <ภๅฤก>\t\tI/Oฟก <ภๅฤก> ป็ฟ๋"
-
-#~ msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
-#~ msgstr "-U <gvimrc>\t\t.gvimrc ด๋ฝล <gvimrc>ธฆ ป็ฟ๋"
-
-#~ msgid "-x\t\t\tEdit encrypted files"
-#~ msgstr "-x\t\t\tพฯศฃศญตศ ฦฤภฯ ฐํฤกฑโ"
-
-#~ msgid "-display <display>\tConnect vim to this particular X-server"
-#~ msgstr "-display <display>\tบ๖ภป ฦฏมค X-ผญน๖ฟอ ฟฌฐแ"
-
-#~ msgid "-X\t\t\tDo not connect to X server"
-#~ msgstr "-X\t\t\tX ผญน๖ฟก ฟฌฐแวฯม๖ พสภฝ"
-
-#~ msgid "--remote <files>\tEdit <files> in a Vim server if possible"
-#~ msgstr "--remote <files>\tฐกดษวฯธ้ บ๖ ผญน๖ฟกผญ <files> ฦํม"
-
-#~ msgid "--remote-silent <files> Same, don't complain if there is no server"
-#~ msgstr "--remote-silent <files> ฐฐภฝ, ผญน๖ฐก พ๘ดูฐํ บาฦ๒วฯม๖ พสภฝ"
-
-#~ msgid ""
-#~ "--remote-wait <files> As --remote but wait for files to have been edited"
-#~ msgstr "--remote-wait <files> --remoteฟอ ฐฐม๖ธธ ดู ฐํฤฅ ถงฑ๎ม๖ ฑโดูธณดฯดู"
-
-#~ msgid ""
-#~ "--remote-wait-silent <files> Same, don't complain if there is no server"
-#~ msgstr "--remote-wait-silent <files> ฐฐภฝ, ผญน๖ฐก พ๘ดูฐํ บาฦ๒วฯม๖ พสภฝ"
-
-#~ msgid ""
-#~ "--remote-tab[-wait][-silent] <files> As --remote but use tab page per "
-#~ "file"
-#~ msgstr ""
-#~ "--remote-tab[-wait][-silent] <files> --remoteฟอ ฐฐม๖ธธ ฦฤภฯบฐทฮ ลว ฦไภฬ"
-#~ "ม๖ ป็ฟ๋"
-
-#~ msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
-#~ msgstr "--remote-send <keys>\tบ๖ ผญน๖ทฮ <keys>ธฆ บธณปฐํ ณกณปฑโ"
-
-#~ msgid ""
-#~ "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
-#~ msgstr "--remote-expr <expr>\tบ๖ ผญน๖ฟกผญ <expr> ฝววเวฯฐํ ฐแฐ๚ รโทย"
-
-#~ msgid "--serverlist\t\tList available Vim server names and exit"
-#~ msgstr "--serverlist\t\tป็ฟ๋ ฐกดษวั บ๖ ผญน๖ ภฬธงภป วฅฝรวฯฐํ ณกณปฑโ"
-
-#~ msgid "--servername <name>\tSend to/become the Vim server <name>"
-#~ msgstr "--servername <name>\tบ๖ ผญน๖ <name>ภฬ ตวฐลณช ผญน๖ทฮ บธณปฑโ"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Motif version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvimภฬ พหฐํ ภึดย ภฮภฺ (ธ๐ฦผวม ฦว):\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (neXtaw version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvimภฬ พหฐํ ภึดย ภฮภฺ (neXtaw ฦว):\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Athena version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvimภฬ พหฐํ ภึดย ภฮภฺ (พฦลืณช ฦว):\n"
-
-#~ msgid "-display <display>\tRun vim on <display>"
-#~ msgstr "-display <display>\tบ๖ภป <display>ฟกผญ ฝววเ"
-
-#~ msgid "-iconic\t\tStart vim iconified"
-#~ msgstr "-iconic\t\tพฦภฬฤ ป๓ลยทฮ บ๖ ฝรภ"
-
-#~ msgid "-background <color>\tUse <color> for the background (also: -bg)"
-#~ msgstr "-background <color>\tนูลม ป๖ภธทฮ <color> ป็ฟ๋ (also: -bg)"
-
-#~ msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
-#~ msgstr "-foreground <color>\tภฯน ป๖ฟก <color> ป็ฟ๋ (also: -fg)"
-
-#~ msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
-#~ msgstr "-font <font>\t\tภฯน ลุฝบฦฎฟก <font> ป็ฟ๋ (also: -fn)"
-
-#~ msgid "-boldfont <font>\tUse <font> for bold text"
-#~ msgstr "-boldfont <font>\tฑฝภบ ลุฝบฦฎฟก <font> ป็ฟ๋"
-
-#~ msgid "-italicfont <font>\tUse <font> for italic text"
-#~ msgstr "-italicfont <font>\tฑโฟ๏ภำ ลุฝบฦฎฟก <font> ป็ฟ๋"
-
-#~ msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
-#~ msgstr "-geometry <geom>\tรสฑโ ม๖ฟภนฬฦฎธฎฟก <geom> ป็ฟ๋ (also: -geom)"
-
-#~ msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
-#~ msgstr "-borderwidth <width>\tฐกภๅภฺธฎ ณะภฬฟก <width> ป็ฟ๋ (also: -bw)"
-
-#~ msgid ""
-#~ "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
-#~ msgstr "-scrollbarwidth <width> ฝบลฉทันู ณะภฬฟก <width> ป็ฟ๋ (also: -sw)"
-
-#~ msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
-#~ msgstr "-menuheight <height>\tธดบนู ณ๔ภฬฟก <height> ป็ฟ๋ (also: -mh)"
-
-#~ msgid "-reverse\t\tUse reverse video (also: -rv)"
-#~ msgstr "-reverse\t\tนภ บ๑ต๐ฟภ ป็ฟ๋ (also: -rv)"
-
-#~ msgid "+reverse\t\tDon't use reverse video (also: +rv)"
-#~ msgstr "+reverse\t\tนภ บ๑ต๐ฟภ ป็ฟ๋ พศ วิ (also: +rv)"
-
-#~ msgid "-xrm <resource>\tSet the specified resource"
-#~ msgstr "-xrm <resource>\tธํฝรตศ ธฎผาฝบ ผณมค"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (RISC OS version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvimภฬ พหฐํภึดย ภฮภฺ (RISC OS ฦว):\n"
-
-#~ msgid "--columns <number>\tInitial width of window in columns"
-#~ msgstr "--columns <ผภฺ>\tฤญฟกผญ รข รสฑโ ณสบ๑"
-
-#~ msgid "--rows <number>\tInitial height of window in rows"
-#~ msgstr "--rows <ผภฺ>\tมูฟกผญ รข รสฑโ ณ๔ภฬ"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (GTK+ version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvimภฬ พหฐํภึดย ภฮภฺ (GTK+ ฦว):\n"
-
-#~ msgid "-display <display>\tRun vim on <display> (also: --display)"
-#~ msgstr "-display <display>\tบ๖ภป <display>ฟกผญ ฝววเ (also: --display)"
-
-#~ msgid "--role <role>\tSet a unique role to identify the main window"
-#~ msgstr "--role <role>\tธภฮ รข ฑธบะภป ภงวุ ภฏภฯวั ฟชวา ผณมค"
-
-#~ msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
-#~ msgstr "--socketid <xid>\tบ๖ภป ดูธฅ GTK ภงมฌ พศฟกผญ ฟญภฝ"
-
-#~ msgid "-P <parent title>\tOpen Vim inside parent application"
-#~ msgstr "-P <parent title>\tVimภป บฮธ๐ ภภฟ๋ วมทฮฑืทฅ ณปฟกผญ ฟญฑโ"
-
-#~ msgid "--windowid <HWND>\tOpen Vim inside another win32 widget"
-#~ msgstr "--windowid <HWND>\tดูธฅ win32 ภงมฌ พศฟกผญ Vim ฟญฑโ"
-
-#~ msgid "No display"
-#~ msgstr "ต๐ฝบวรทนภฬฐก พ๘ฝภดฯดู"
-
-#~ msgid ": Send failed.\n"
-#~ msgstr ": บธณปฑโฐก ฝวฦะวฯฟดฝภดฯดู.\n"
-
-#~ msgid ": Send failed. Trying to execute locally\n"
-#~ msgstr ": บธณปฑโ ฝวฦะ. ทฮฤรฟกผญ ฝววเตหดฯดู\n"
-
-#~ msgid "No display: Send expression failed.\n"
-#~ msgstr "ต๐ฝบวรทนภฬ พ๘ภฝ: วฅว๖ฝฤ บธณปฑโฐก ฝวฦะว฿ฝภดฯดู.\n"
-
-#~ msgid ": Send expression failed.\n"
-#~ msgstr ": วฅว๖ฝฤ บธณปฑโฐก ฝวฦะว฿ฝภดฯดู.\n"
-
-#~ msgid "E543: Not a valid codepage"
-#~ msgstr "E543: มคป๓ภ๛ภฮ ฤฺตๅฦไภฬม๖ฐก พฦดีดฯดู"
-
-#~ msgid "E285: Failed to create input context"
-#~ msgstr "E285: ภิทย ฤลุฝบฦฎธฆ ธธต้ ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "E286: Failed to open input method"
-#~ msgstr "E286: ภิทย นๆฝฤภป ฟญดูฐก ฝวฦะว฿ฝภดฯดู"
-
-#~ msgid "E287: Warning: Could not set destroy callback to IM"
-#~ msgstr "E287: ฐๆฐํ: IMฟก ฦฤฑซ ฤน้ภป ผณมควา ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "E288: input method doesn't support any style"
-#~ msgstr "E288: ภิทย นๆฝฤภฬ พ๎ถฒ วฝฤตต ม๖ฟ๘วฯม๖ พสฝภดฯดู"
-
-#~ msgid "E289: input method doesn't support my preedit type"
-#~ msgstr "E289: ภิทย นๆฝฤภฬ ณป preedit วฝฤภป ม๖ฟ๘วฯม๖ พสฝภดฯดู"
-
-#~ msgid "E843: Error while updating swap file crypt"
-#~ msgstr "E843: ฝบฟา ฦฤภฯภป พฯศฃศญวา ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid ""
-#~ "E833: %s is encrypted and this version of Vim does not support encryption"
-#~ msgstr ""
-#~ "E833: %sภฬ(ฐก) พฯศฃศญตวพ๎ ภึดย ตฅ, ภฬ Vimภบ พฯศฃศญธฆ ม๖ฟ๘วฯม๖ พสฝภดฯดู"
-
-#~ msgid "Swap file is encrypted: \"%s\""
-#~ msgstr "ฝบฟา ฦฤภฯภฬ พฯศฃศญตส: \"%s\""
-
-#~ msgid ""
-#~ "\n"
-#~ "If you entered a new crypt key but did not write the text file,"
-#~ msgstr ""
-#~ "\n"
-#~ "ป๕ทฮฟ๎ พฯศฃ ลฐธฆ ภิทยว฿ดย ตฅ, ฦฤภฯภป ภ๚ภๅวฯม๖ พสพาพ๚ดูธ้,"
-
-#~ msgid ""
-#~ "\n"
-#~ "enter the new crypt key."
-#~ msgstr ""
-#~ "\n"
-#~ "ป๕ทฮฟ๎ พฯศฃ ลฐธฆ ภิทยวฯผผฟไ."
-
-#~ msgid ""
-#~ "\n"
-#~ "If you wrote the text file after changing the crypt key press enter"
-#~ msgstr ""
-#~ "\n"
-#~ "พฯศฃ ลฐธฆ นูฒ ศฤฟก ฦฤภฯภป ภ๚ภๅว฿พ๚ดูธ้ ฐฐภบ ลฐทฮ ลุฝบฦฎ ฦฤภฯฐ๚"
-
-#~ msgid ""
-#~ "\n"
-#~ "to use the same key for text file and swap file"
-#~ msgstr ""
-#~ "\n"
-#~ "ฝบฟาฦฤภฯภป ภ๚ภๅวฯทมธ้ ฟฃลอธฆ ดฉธฃผผฟไ"
-
-#~ msgid "Using crypt key from swap file for the text file.\n"
-#~ msgstr "ลุฝบฦฎ ฦฤภฯฟก ฝบฟาฦฤภฯฟกผญ ฐกมฎฟย พฯศฃ ลฐธฆ ป็ฟ๋วีดฯดู.\n"
-
-#~ msgid ""
-#~ "\n"
-#~ " [not usable with this version of Vim]"
-#~ msgstr ""
-#~ "\n"
-#~ " [บ๖ ภฬน๘ ฦวฟกผญดย ป็ฟ๋วา ผ๖ พ๘ภฝ]"
-
-#~ msgid "Tear off this menu"
-#~ msgstr "ภฬ ธดบธฆ ถผพ๎ณฟ"
-
-#~ msgid "Select Directory dialog"
-#~ msgstr "ต๐ทบลไธฎ ผฑลร ด๋ศญป๓ภฺ"
-
-#~ msgid "Save File dialog"
-#~ msgstr "ฦฤภฯ ภ๚ภๅ ด๋ศญป๓ภฺ"
-
-#~ msgid "Open File dialog"
-#~ msgstr "ฦฤภฯ ฟญฑโ ด๋ศญป๓ภฺ"
-
-#~ msgid "E338: Sorry, no file browser in console mode"
-#~ msgstr "E338: นฬพศวีดฯดู, ฤผึ ป๓ลยฟกดย ฦฤภฯ บ๊ถ๓ฟ์ภ๚ฐก พ๘ฝภดฯดู"
-
-#~ msgid "Vim: preserving files...\n"
-#~ msgstr "บ๖: ฦฤภฯ บธมธม฿...\n"
-
-#~ msgid "Vim: Finished.\n"
-#~ msgstr "บ๖: ฒ๘ณตฝภดฯดู.\n"
-
-#~ msgid "ERROR: "
-#~ msgstr "ฟกทฏ: "
-
-#~ msgid "E340: Line is becoming too long"
-#~ msgstr "E340: มูภฬ ณสนซ ฑๆพ๎มณฝภดฯดู"
-
-#~ msgid "E341: Internal error: lalloc(%<PRId64>, )"
-#~ msgstr "E341: ณปบฮ ฟกทฏ: lalloc(%<PRId64>, )"
-
-#~ msgid "E547: Illegal mouseshape"
-#~ msgstr "E547: ภฬป๓วั ธถฟ์ฝบธ๐พ็"
-
-#~ msgid "Enter encryption key: "
-#~ msgstr "พฯศฃ ลฐ ภิทย: "
-
-#~ msgid "Enter same key again: "
-#~ msgstr "ฐฐภบ ลฐธฆ ดูฝร ภิทย: "
-
-#~ msgid "Keys don't match!"
-#~ msgstr "ลฐฐก ธยม๖ พสฝภดฯดู!"
-
-#~ msgid "Cannot connect to Netbeans #2"
-#~ msgstr "Netbeans #2ฟก ฟฌฐแวา ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "Cannot connect to Netbeans"
-#~ msgstr "Netbeansฟก ฟฌฐแวา ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
-#~ msgstr "E668: NetBeans ฟฌฐแ มคบธ ฦฤภฯภฬ มขฑู ธ๐ตๅฐก ภ฿ธ๘ตส: \"%s\""
-
-#~ msgid "read from Netbeans socket"
-#~ msgstr "Netbeans ผาฤฯฟกผญ ภะฑโ"
-
-#~ msgid "E658: NetBeans connection lost for buffer %<PRId64>"
-#~ msgstr "E658: น๖ฦ %<PRId64>ฟก ด๋วั NetBeans ฟฌฐแภป ภาพ๎น๖ทศฝภดฯดู"
-
-#~ msgid "E838: netbeans is not supported with this GUI"
-#~ msgstr "E838: ภฬ GUIดย netbeansธฆ ม๖ฟ๘วฯม๖ พสฝภดฯดู"
-
-#~ msgid "E511: netbeans already connected"
-#~ msgstr "E511: netbeansฐก ภฬนฬ ฟฌฐแตวพ๎ ภึฝภดฯดู"
-
-#~ msgid "E505: "
-#~ msgstr "E505: "
-
-#~ msgid "E775: Eval feature not available"
-#~ msgstr "E775: Eval ฑโดษภฬ บมฎภึฝภดฯดู"
-
-#~ msgid "freeing %<PRId64> lines"
-#~ msgstr "freeing %<PRId64> lines"
-
-#~ msgid "E530: Cannot change term in GUI"
-#~ msgstr "E530: GUIฟกผญดย termภป นูฒ ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "E531: Use \":gui\" to start the GUI"
-#~ msgstr "E531: GUIธฆ ฝรภวฯทมธ้ \":gui\"ธฆ ป็ฟ๋วฯฝสฝรฟภ"
-
-#~ msgid "E617: Cannot be changed in the GTK+ 2 GUI"
-#~ msgstr "E617: GTK+ 2 GUIฟกผญดย นูฒ๐ ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "E596: Invalid font(s)"
-#~ msgstr "E596: ภ฿ธ๘ตศ ฑฒร(ต้)"
-
-#~ msgid "E597: can't select fontset"
-#~ msgstr "E597: ฑฒรผยภป ฐํธฆ ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "E598: Invalid fontset"
-#~ msgstr "E598: ภ฿ธ๘ตศ ฑฒรผย"
-
-#~ msgid "E533: can't select wide font"
-#~ msgstr "E533: ฟอภฬตๅ ฑฒรภป ฐํธฆ ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "E534: Invalid wide font"
-#~ msgstr "E534: ภ฿ธ๘ตศ ฟอภฬตๅ ฑฒร"
-
-#~ msgid "E538: No mouse support"
-#~ msgstr "E538: ธถฟ์ฝบธฆ ม๖ฟ๘วฯม๖ พสฝภดฯดู"
-
-#~ msgid "cannot open "
-#~ msgstr "cannot open "
-
-#~ msgid "VIM: Can't open window!\n"
-#~ msgstr "บ๖: รขภป ฟญ ผ๖ พ๘ฝภดฯดู!\n"
-
-#~ msgid "Need Amigados version 2.04 or later\n"
-#~ msgstr "พฦนฬฐกตตฝบ 2.04ณช ด๕ ณ๔ภบ ฦวภฬ วสฟไวีดฯดู\n"
-
-#~ msgid "Need %s version %<PRId64>\n"
-#~ msgstr "Need %s version %<PRId64>\n"
-
-#~ msgid "Cannot open NIL:\n"
-#~ msgstr "NILภป ฟญ ผ๖ พ๘ภฝ:\n"
-
-#~ msgid "Cannot create "
-#~ msgstr "Cannot create "
-
-#~ msgid "Vim exiting with %d\n"
-#~ msgstr "บ๖ภฬ %d ฐชภธทฮ ณกณภดฯดู\n"
-
-#~ msgid "cannot change console mode ?!\n"
-#~ msgstr "ฤผึ ป๓ลยธฆ นูฒ ผ๖ พ๘ฝภดฯดู ?!\n"
-
-#~ msgid "mch_get_shellsize: not a console??\n"
-#~ msgstr "mch_get_shellsize: ฤผึภฬ พฦดัฐก??\n"
-
-#~ msgid "E360: Cannot execute shell with -f option"
-#~ msgstr "E360: -f ฟษผวภฬ ป็ฟ๋ตศ ฐๆฟ์ ฝฉภป ฝววเวา ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "Cannot execute "
-#~ msgstr "Cannot execute "
-
-#~ msgid "shell "
-#~ msgstr "shell "
-
-#~ msgid " returned\n"
-#~ msgstr " returned\n"
-
-#~ msgid "ANCHOR_BUF_SIZE too small."
-#~ msgstr "ANCHOR_BUF_SIZEฐก ณสนซ ภฝภดฯดู."
-
-#~ msgid "I/O ERROR"
-#~ msgstr "I/O ฟกทฏ"
-
-#~ msgid "Message"
-#~ msgstr "ธฝรม๖"
-
-#~ msgid "'columns' is not 80, cannot execute external commands"
-#~ msgstr "'columns'ภฬ 80ภฬ พฦดฯพ๎ผญ, ฟบฮ ธํทษภป ฝววเวา ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "E237: Printer selection failed"
-#~ msgstr "E237: วมธฐลอธฆ ฐํธฃม๖ ธ๘ว฿ฝภดฯดู"
-
-#~ msgid "to %s on %s"
-#~ msgstr "to %s on %s"
-
-#~ msgid "E613: Unknown printer font: %s"
-#~ msgstr "E613: ธ๐ธฃดย วมธฐลอ ฑฒร: %s"
-
-#~ msgid "E238: Print error: %s"
-#~ msgstr "E238: ภฮผโ ฟกทฏ: %s"
-
-#~ msgid "Printing '%s'"
-#~ msgstr "'%s' ภฮผโม฿"
-
-#~ msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
-#~ msgstr "E244: ภ฿ธ๘ตศ ฑภฺผย ภฬธง \"%s\"ภฬ(ฐก) ฑฒร ภฬธง \"%s\"ฟก ภึฝภดฯดู"
-
-#~ msgid "E245: Illegal char '%c' in font name \"%s\""
-#~ msgstr "E245: ภ฿ธ๘ตศ ฑภฺ '%c'ภฬ(ฐก) ฑฒร ภฬธง \"%s\"ฟก ภึฝภดฯดู"
-
-#~ msgid "Vim: Double signal, exiting\n"
-#~ msgstr "บ๖: ฐฐภบ ฝรฑืณฮ ตฮ น๘, ณกณภดฯดู\n"
-
-#~ msgid "Vim: Caught deadly signal %s\n"
-#~ msgstr "บ๖: %s ฝรฑืณฮภป ภโพาฝภดฯดู\n"
-
-#~ msgid "Vim: Caught deadly signal\n"
-#~ msgstr "บ๖: มืภป ฝรฑืณฮภป ภโพาฝภดฯดู\n"
-
-#~ msgid "Opening the X display took %<PRId64> msec"
-#~ msgstr "X ต๐ฝบวรทนภฬธฆ ฟฉดย ตฅ %<PRId64> msecภฬ ฐษทศฝภดฯดู"
-
-#~ msgid ""
-#~ "\n"
-#~ "Vim: Got X error\n"
-#~ msgstr ""
-#~ "\n"
-#~ "บ๖: X ฟกทฏฐก ปฐๅฝภดฯดู\n"
-
-#~ msgid "Testing the X display failed"
-#~ msgstr "X ต๐ฝบวรทนภฬ ฝรว่ภฬ ฝวฦะว฿ฝภดฯดู"
-
-#~ msgid "Opening the X display timed out"
-#~ msgstr "X ต๐ฝบวรทนภฬธฆ ฟญดูฐก ฝรฐฃภฬ รสฐ๚ตวพ๚ฝภดฯดู"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot execute shell sh\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ฝฉ shธฆ ฝววเวา ผ๖ พ๘ฝภดฯดู\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot create pipes\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ฦฤภฬวมธฆ ธธต้ ผ๖ พ๘ฝภดฯดู\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot fork\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ภฺฝฤ วมทฮผผฝบธฆ ธธต้ ผ๖ พ๘ฝภดฯดู\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Command terminated\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ธํทษภฬ ณกธถรฤมณฝภดฯดู\n"
-
-#~ msgid "XSMP lost ICE connection"
-#~ msgstr "XSMPฐก ICE ฟฌฐแภป ภาพ๎น๖ทศฝภดฯดู"
-
-#~ msgid "Opening the X display failed"
-#~ msgstr "X ต๐ฝบวรทนภฬ ฟญฑโฐก ฝวฦะว฿ฝภดฯดู"
-
-#~ msgid "XSMP handling save-yourself request"
-#~ msgstr "XSMPฐก save-yourself ฟไรปภป ฝววเวฯฐํ ภึฝภดฯดู"
-
-#~ msgid "XSMP opening connection"
-#~ msgstr "XSMPฐก ฟฌฐแภป ฟฉดย ม฿ภิดฯดู"
-
-#~ msgid "XSMP ICE connection watch failed"
-#~ msgstr "XSMPฐก ICE ฟฌฐแ ฐจฝรธฆ ฝวฦะว฿ฝภดฯดู"
-
-#~ msgid "XSMP SmcOpenConnection failed: %s"
-#~ msgstr "XSMP SmcOpenConnection ฝวฦะ: %s"
-
-#~ msgid "At line"
-#~ msgstr "At line"
-
-#~ msgid "Could not load vim32.dll!"
-#~ msgstr "vim32.dllภป บาทฏ ต้ภฯ ผ๖ พ๘ฝภดฯดู!"
-
-#~ msgid "VIM Error"
-#~ msgstr "บ๖ ฟกทฏ"
-
-#~ msgid "Could not fix up function pointers to the DLL!"
-#~ msgstr "วิผ๖ ฦ๗ภฮลอธฆ DLLทฮ นูฒ ผ๖ พ๘ฝภดฯดู!"
-
-#~ msgid "shell returned %d"
-#~ msgstr "ฝฉภฬ %dภป(ธฆ) ตนทมมึพ๚ฝภดฯดู"
-
-#~ msgid "Vim: Caught %s event\n"
-#~ msgstr "บ๖: %s ภฬบฅฦฎธฆ ภโพาฝภดฯดู\n"
-
-#~ msgid "close"
-#~ msgstr "ดฑโ"
-
-#~ msgid "logoff"
-#~ msgstr "ทฮฑืพฦฟ๔"
-
-#~ msgid "shutdown"
-#~ msgstr "ผหดูฟ๎"
-
-#~ msgid "E371: Command not found"
-#~ msgstr "E371: ธํทษภป รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid ""
-#~ "VIMRUN.EXE not found in your $PATH.\n"
-#~ "External commands will not pause after completion.\n"
-#~ "See :help win32-vimrun for more information."
-#~ msgstr ""
-#~ "VIMRUN.EXEธฆ $PATHฟกผญ รฃภป ผ๖ พ๘ฝภดฯดู.\n"
-#~ "ฟบฮ ธํทษภฬ ณกณญ ตฺ ธุรโ ผ๖ พ๘ฝภดฯดู.\n"
-#~ "ดู ธนภบ มคบธธฆ บธฝรทมธ้ :help win32-vimrunภป บธฝสฝรฟภ."
-
-#~ msgid "Vim Warning"
-#~ msgstr "บ๖ ฐๆฐํ"
-
-#~ msgid "Error file"
-#~ msgstr "ฟกทฏ ฦฤภฯ"
-
-#~ msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\""
-#~ msgstr ""
-#~ "ฐๆฐํ: ดพ๎ ธ๑ทฯ \"%s_%s.spl\" ศคภบ \"%s_ascii.spl\"ภป รฃภป ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "Conversion in %s not supported"
-#~ msgstr "%sภว บฏศฏภฬ ม๖ฟ๘ตวม๖ พสฝภดฯดู"
-
-#~ msgid "E430: Tag file path truncated for %s\n"
-#~ msgstr "E430: %sฟก ด๋วั ลยฑื ฦฤภฯ ฐๆทฮฐก ภ฿ทศฝภดฯดู\n"
-
-#~ msgid "new shell started\n"
-#~ msgstr "ป๕ ฝฉภฬ ฝรภตวพ๚ฝภดฯดู\n"
-
-#~ msgid "Used CUT_BUFFER0 instead of empty selection"
-#~ msgstr "บ๓ ฐํธฃฑโ ด๋ฝล CUT_BUFFER0ภป ป็ฟ๋ว฿ฝภดฯดู"
-
-#~ msgid "No undo possible; continue anyway"
-#~ msgstr "ร๋ผา บาฐกดษ; พ๎ยทต็ ฐ่ผำวีดฯดู"
-
-#~ msgid "E832: Non-encrypted file has encrypted undo file: %s"
-#~ msgstr ""
-#~ "E832: พฯศฃศญตวม๖ พสภบ ฦฤภฯภฬ พฯศฃศญตศ undo ฦฤภฯภป ฐกม๖ฐํ ภึฝภดฯดู: %s"
-
-#~ msgid "E826: Undo file decryption failed: %s"
-#~ msgstr "E826: Undo ฦฤภฯภป วุตถวา ผ๖ พ๘ฝภดฯดู: %s"
-
-#~ msgid "E827: Undo file is encrypted: %s"
-#~ msgstr "E827: Undo ฦฤภฯภฬ พฯศฃศญตวพ๚ฝภดฯดู: %s"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16/32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 16/32 บ๑ฦฎ GUI ฦว"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 64บ๑ฦฎ GUI น๖มฏ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 32บ๑ฦฎ GUI น๖มฏ"
-
-#~ msgid " in Win32s mode"
-#~ msgstr " Win32s ป๓ลย"
-
-#~ msgid " with OLE support"
-#~ msgstr " OLE ม๖ฟ๘"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 64บ๑ฦฎ ฤผึ น๖มฏ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 32บ๑ฦฎ ฤผึ น๖มฏ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16-bit version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 16บ๑ฦฎ น๖มฏ"
-
-#~ msgid ""
-#~ "\n"
-#~ "32-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "32บ๑ฦฎ MS-DOS น๖มฏ"
-
-#~ msgid ""
-#~ "\n"
-#~ "16-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "16บ๑ฦฎ MS-DOS น๖มฏ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X (unix) version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS X (ภฏดะฝบ) น๖มฏ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS X น๖มฏ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS น๖มฏ"
-
-#~ msgid ""
-#~ "\n"
-#~ "RISC OS version"
-#~ msgstr ""
-#~ "\n"
-#~ "RISC OS น๖มฏ"
-
-#~ msgid ""
-#~ "\n"
-#~ "OpenVMS version"
-#~ msgstr ""
-#~ "\n"
-#~ "OpenVMS น๖มฏ"
-
-#~ msgid ""
-#~ "\n"
-#~ "Big version "
-#~ msgstr ""
-#~ "\n"
-#~ "Big น๖มฏ "
-
-#~ msgid ""
-#~ "\n"
-#~ "Normal version "
-#~ msgstr ""
-#~ "\n"
-#~ "Normal น๖มฏ "
-
-#~ msgid ""
-#~ "\n"
-#~ "Small version "
-#~ msgstr ""
-#~ "\n"
-#~ "Small น๖มฏ "
-
-#~ msgid ""
-#~ "\n"
-#~ "Tiny version "
-#~ msgstr ""
-#~ "\n"
-#~ "Tiny น๖มฏ "
-
-#~ msgid "with GTK2-GNOME GUI."
-#~ msgstr "GTK2-GNOME GUI."
-
-#~ msgid "with GTK2 GUI."
-#~ msgstr "GTK2 GUI."
-
-#~ msgid "with X11-Motif GUI."
-#~ msgstr "X11-Motif GUI."
-
-#~ msgid "with X11-neXtaw GUI."
-#~ msgstr "X11-neXtaw GUI."
-
-#~ msgid "with X11-Athena GUI."
-#~ msgstr "X11-Athena GUI."
-
-#~ msgid "with Photon GUI."
-#~ msgstr "Photon GUI."
-
-#~ msgid "with GUI."
-#~ msgstr "GUI."
-
-#~ msgid "with Carbon GUI."
-#~ msgstr "Carbon GUI."
-
-#~ msgid "with Cocoa GUI."
-#~ msgstr "Cocoa GUI."
-
-#~ msgid "with (classic) GUI."
-#~ msgstr "(ลฌทกฝฤ) GUI."
-
-#~ msgid " system gvimrc file: \""
-#~ msgstr " ฝรฝบล gvimrc ฦฤภฯ: \""
-
-#~ msgid " user gvimrc file: \""
-#~ msgstr " ป็ฟ๋ภฺ gvimrc ฦฤภฯ: \""
-
-#~ msgid "2nd user gvimrc file: \""
-#~ msgstr "ป็ฟ๋ภฺ ตฮ น๘ยฐ gvimrc ฦฤภฯ: \""
-
-#~ msgid "3rd user gvimrc file: \""
-#~ msgstr "ป็ฟ๋ภฺ ผผ น๘ยฐ gvimrc ฦฤภฯ: \""
-
-#~ msgid " system menu file: \""
-#~ msgstr " ฝรฝบล ธดบ ฦฤภฯ: \""
-
-#~ msgid "Compiler: "
-#~ msgstr "ฤฤฦฤภฯทฏ: "
-
-#~ msgid "menu Help->Orphans for information "
-#~ msgstr "ภฬฟก ด๋วั มคบธธฆ บธทมธ้ ธดบฟกผญ ตตฟ๒ธป->ฐํพฦ ผฑลร"
-
-#~ msgid "Running modeless, typed text is inserted"
-#~ msgstr "ธ๐ตๅพ๘ภฬ ผ๖วเม฿ภฬธ็, ภิทยตศ นฎภฺดย ป๐ภิตหดฯดู"
-
-#~ msgid "menu Edit->Global Settings->Toggle Insert Mode "
-#~ msgstr "ธดบฟกผญ ฦํม->ภฟช ผณมค->ป๐ภิ ธ๐ตๅ ลไฑภป ผฑลรวฯฝรธ้ "
-
-#~ msgid " for two modes "
-#~ msgstr " ตฮ ธ๐ตๅธฆ ป็ฟ๋วา ผ๖ ภึฝภดฯดู "
-
-#~ msgid "menu Edit->Global Settings->Toggle Vi Compatible"
-#~ msgstr "ธดบฟกผญ ฦํม->ภฟช ผณมค->Vi ศฃศฏ ลไฑภป ผฑลรวฯฝรธ้ "
-
-#~ msgid " for Vim defaults "
-#~ msgstr " Vimภฬ ฑโบปฐชภธทฮ ตฟภวีดฯดู "
-
-#~ msgid "WARNING: Windows 95/98/ME detected"
-#~ msgstr "ฐๆฐํ: ภฉตตฟ์ม๎ 95/98/MEธฆ รฃพาภฝ"
-
-#~ msgid "type :help windows95<Enter> for info on this"
-#~ msgstr "ภฬฟก ด๋วั มคบธธฆ บธทมธ้ :help windows95<ฟฃลอ> ภิทย"
-
-#~ msgid "E370: Could not load library %s"
-#~ msgstr "E370: %s ถ๓ภฬบ๊ทฏธฎธฆ ทฮตๅวา ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid ""
-#~ "Sorry, this command is disabled: the Perl library could not be loaded."
-#~ msgstr ""
-#~ "นฬพศวีดฯดู, ภฬ ธํทษภบ ป็ฟ๋วา ผ๖ พ๘ฝภดฯดู, Perl ถ๓ภฬบ๊ทฏธฎธฆ ทฮต๙วา ผ๖ พ๘ฝภ"
-#~ "ดฯดู."
-
-#~ msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
-#~ msgstr "E299: Safe ธ๐ตโพ๘ภฬดย sandboxฟกผญ Perl evaluationภฬ มฆวัตหดฯดู"
-
-#~ msgid "Edit with &multiple Vims"
-#~ msgstr "ฟฉทฏ บ๖ภธทฮ ฦํม(&M)"
-
-#~ msgid "Edit with single &Vim"
-#~ msgstr "วฯณชภว บ๖ภธทฮธธ ฦํม(&V)"
-
-#~ msgid "Diff with Vim"
-#~ msgstr "บ๖ภธทฮ Diff"
-
-#~ msgid "Edit with &Vim"
-#~ msgstr "บ๖ภธทฮ ฦํม(&V)"
-
-#~ msgid "Edit with existing Vim - "
-#~ msgstr "วฯณชภว บ๖ภธทฮธธ ฦํม - "
-
-#~ msgid "Edits the selected file(s) with Vim"
-#~ msgstr "ผฑลรตศ ฦฤภฯ(ต้)ภป บ๖ภธทฮ ฦํม"
-
-#~ msgid "Error creating process: Check if gvim is in your path!"
-#~ msgstr "วมทฮผผฝบ ปผบ ฟกทฏ: gvimภฬ pathฟก ภึดย ม๖ ศฎภฮวฯผผฟไ!"
-
-#~ msgid "gvimext.dll error"
-#~ msgstr "gvimext.dll ฟกทฏ"
-
-#~ msgid "Path length too long!"
-#~ msgstr "ฐๆทฮฐก ณสนซ ฑ้ดฯดู"
-
-#~ msgid "E234: Unknown fontset: %s"
-#~ msgstr "E234: ธ๐ธฃดย ฑฒรผย: %s"
-
-#~ msgid "E235: Unknown font: %s"
-#~ msgstr "E235: ธ๐ธฃดย ฑฒร: %s"
-
-#~ msgid "E236: Font \"%s\" is not fixed-width"
-#~ msgstr "E236: ฑฒร \"%s\"ภบ(ดย) ฐํมคณะภฬฐก พฦดีดฯดู"
-
-#~ msgid "E448: Could not load library function %s"
-#~ msgstr "E448: %s ถ๓ภฬบ๊ทฏธฎ วิผ๖ธฆ ทฮตๅวา ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
-#~ msgstr "E26: Hebrewดย ป็ฟ๋วา ผ๖ พ๘ฝภดฯดู: ฤฤฦฤภฯ ถง ฦ๗วิตวม๖ พสพาฝภดฯดู\n"
-
-#~ msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
-#~ msgstr "E27: Farsiดย ป็ฟ๋วา ผ๖ พ๘ฝภดฯดู: ฤฤฦฤภฯ ถง ฦ๗วิตวม๖ พสพาฝภดฯดู\n"
-
-#~ msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
-#~ msgstr "E800: Arabicภบ ป็ฟ๋วา ผ๖ พ๘ฝภดฯดู: ฤฤฦฤภฯ ถง ฦ๗วิตวม๖ พสพาฝภดฯดู\n"
-
-#~ msgid "E247: no registered server named \"%s\""
-#~ msgstr "E247: \"%s\"ภบ(ดย) ต๎ทฯตศ ผญน๖ธํภฬ พฦดีดฯดู"
-
-#~ msgid "E233: cannot open display"
-#~ msgstr "E233: ต๐ฝบวรทนภฬธฆ ฟญ ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "E449: Invalid expression received"
-#~ msgstr "E449: ภ฿ธ๘ตศ วฅว๖ฝฤภฬ นพฦมณฝภดฯดู"
-
-#~ msgid "E463: Region is guarded, cannot modify"
-#~ msgstr "E463: ฟตฟชภฬ บธศฃตวฐํ ภึพ๎ผญ ผ๖มควา ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "E744: NetBeans does not allow changes in read-only files"
-#~ msgstr "E744: NetBeansดย ภะฑโ ภฟ๋ ฦฤภฯภป นูฒ ผ๖ พ๘ฝภดฯดู"
-
-#~ msgid "Need encryption key for \"%s\""
-#~ msgstr "\"%s\"ฟก ด๋วั พฯศฃ ลฐฐก วสฟไวีดฯดู"
-
-#~ msgid "writelines() requires list of strings"
-#~ msgstr "writelines()ดย นฎภฺฟญ ธ๑ทฯภฬ วสฟไวีดฯดู"
-
-#~ msgid "E264: Python: Error initialising I/O objects"
-#~ msgstr "E264: ฦฤภฬฝใ: I/O ฐดรผ รสฑโศญม฿ ฟกทฏฐก ปฐๅฝภดฯดู"
-
-#~ msgid "no such buffer"
-#~ msgstr "ฑืทฑ น๖ฦดย พ๘ฝภดฯดู"
-
-#~ msgid "attempt to refer to deleted window"
-#~ msgstr "ม๖ฟ๖ม๘ รขภป ยมถวฯทมฐํ วฯฟดฝภดฯดู"
-
-#~ msgid "readonly attribute"
-#~ msgstr "ภะฑโ ภฟ๋ ผำผบ"
-
-#~ msgid "cursor position outside buffer"
-#~ msgstr "ฦผญ ภงฤกฐก น๖ฦ นฟก ภึฝภดฯดู"
-
-#~ msgid "<window object (deleted) at %p>"
-#~ msgstr "<%pฟก รข ฐดรผ (ป่มฆตส)>"
-
-#~ msgid "<window object (unknown) at %p>"
-#~ msgstr "<%pฟก รข ฐดรผ (ธ๐ธง)>"
-
-#~ msgid "<window %d>"
-#~ msgstr "<รข %d>"
-
-#~ msgid "no such window"
-#~ msgstr "ฑืทฑ รขภบ พ๘ฝภดฯดู"
-
-#~ msgid "attempt to refer to deleted buffer"
-#~ msgstr "ม๖ฟ๖ม๘ น๖ฦธฆ ยมถวฯทมฐํ วฯฟดฝภดฯดู"
diff --git a/src/nvim/po/nb.po b/src/nvim/po/nb.po
index ce635e098c..b99e8ce465 100644
--- a/src/nvim/po/nb.po
+++ b/src/nvim/po/nb.po
@@ -2483,7 +2483,7 @@ msgstr "E216: Gruppen eller handlingen finnes ikke: %s"
#: ../fileio.c:6090
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
"--- Autokommandoer ---"
@@ -2507,7 +2507,7 @@ msgstr "E218: N๘sting av autokommandoer for dyp"
#: ../fileio.c:7143
#, c-format
-msgid "%s Auto commands for \"%s\""
+msgid "%s Autocommands for \"%s\""
msgstr "%s Autokommandoer for \"%s\""
#: ../fileio.c:7149
@@ -2699,11 +2699,6 @@ msgstr "E49: Ugyldig \"scroll\"-verdi"
msgid "E901: Job table is full"
msgstr ""
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
#: ../globals.h:1024
#, c-format
msgid "E364: Library call failed for \"%s()\""
@@ -3397,7 +3392,7 @@ msgstr "-q [feilfil] rediger fil med f๘rste feil"
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
@@ -4275,11 +4270,6 @@ msgstr "linje %4ld:"
msgid "E354: Invalid register name: '%s'"
msgstr "E354: Ugyldig registernavn: '%s'"
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr ""
-"Vedlikeholder for norsk oversettelse: ุyvind A. Holm <sunny@sunbase.org>"
-
#: ../message.c:986
msgid "Interrupt: "
msgstr "Avbryt: "
@@ -5312,8 +5302,8 @@ msgstr "Advarsel: Region %s ikke st๘ttet"
#: ../spell.c:4550
#, c-format
-msgid "Reading affix file %s ..."
-msgstr "Leser affiksfil %s ..."
+msgid "Reading affix file %s..."
+msgstr "Leser affiksfil %s..."
#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
#, c-format
@@ -5472,8 +5462,8 @@ msgstr "%s-verdi er forskjellig fra det som er bruk i en annen .aff-fil"
#: ../spell.c:5602
#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "Leser ordlistefil %s ..."
+msgid "Reading dictionary file %s..."
+msgstr "Leser ordlistefil %s..."
#: ../spell.c:5611
#, c-format
@@ -5507,8 +5497,8 @@ msgstr "Ignorerte %d ord med ikke-ASCII-tegn i %s"
#: ../spell.c:6115
#, c-format
-msgid "Reading word file %s ..."
-msgstr "Leser ordfil %s ..."
+msgid "Reading word file %s..."
+msgstr "Leser ordfil %s..."
#: ../spell.c:6155
#, c-format
@@ -5578,8 +5568,8 @@ msgstr "Totalt antall ord: %d"
#: ../spell.c:7655
#, c-format
-msgid "Writing suggestion file %s ..."
-msgstr "Skriver forslagsfil %s ..."
+msgid "Writing suggestion file %s..."
+msgstr "Skriver forslagsfil %s..."
#: ../spell.c:7707 ../spell.c:7927
#, c-format
@@ -5605,8 +5595,8 @@ msgstr ""
#: ../spell.c:7920
#, c-format
-msgid "Writing spell file %s ..."
-msgstr "Lagrer stavefil %s ..."
+msgid "Writing spell file %s..."
+msgstr "Lagrer stavefil %s..."
#: ../spell.c:7925
msgid "Done!"
diff --git a/src/nvim/po/nl.po b/src/nvim/po/nl.po
index ea609c0f69..56bcd94e79 100644
--- a/src/nvim/po/nl.po
+++ b/src/nvim/po/nl.po
@@ -2471,10 +2471,10 @@ msgstr "E216: onbekende groep of 'event': %s"
#: ../fileio.c:6090
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
#: ../fileio.c:6293
#, c-format
@@ -2495,8 +2495,8 @@ msgstr "E218: hierarchie van aanroepen autocommands te diep"
#: ../fileio.c:7143
#, c-format
-msgid "%s Auto commands for \"%s\""
-msgstr "%s 'Auto commands' voor \"%s\""
+msgid "%s Autocommands for \"%s\""
+msgstr "%s 'Autocommands' voor \"%s\""
#: ../fileio.c:7149
#, c-format
@@ -2685,11 +2685,6 @@ msgstr "E49: ongeldige scroll-grootte"
msgid "E901: Job table is full"
msgstr ""
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
#: ../globals.h:1024
#, c-format
msgid "E364: Library call failed for \"%s()\""
@@ -3394,7 +3389,7 @@ msgstr "-q [foutbestand] bewerk bestand dat eerste fout bevat"
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
@@ -4282,10 +4277,6 @@ msgstr "regel %4ld:"
msgid "E354: Invalid register name: '%s'"
msgstr ""
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr "Vertaald door: Erwin Poeze <erwin.poeze@gmail.com>"
-
#: ../message.c:986
msgid "Interrupt: "
msgstr ""
diff --git a/src/nvim/po/no.po b/src/nvim/po/no.po
index ce635e098c..b99e8ce465 100644
--- a/src/nvim/po/no.po
+++ b/src/nvim/po/no.po
@@ -2483,7 +2483,7 @@ msgstr "E216: Gruppen eller handlingen finnes ikke: %s"
#: ../fileio.c:6090
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
"--- Autokommandoer ---"
@@ -2507,7 +2507,7 @@ msgstr "E218: N๘sting av autokommandoer for dyp"
#: ../fileio.c:7143
#, c-format
-msgid "%s Auto commands for \"%s\""
+msgid "%s Autocommands for \"%s\""
msgstr "%s Autokommandoer for \"%s\""
#: ../fileio.c:7149
@@ -2699,11 +2699,6 @@ msgstr "E49: Ugyldig \"scroll\"-verdi"
msgid "E901: Job table is full"
msgstr ""
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
#: ../globals.h:1024
#, c-format
msgid "E364: Library call failed for \"%s()\""
@@ -3397,7 +3392,7 @@ msgstr "-q [feilfil] rediger fil med f๘rste feil"
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
@@ -4275,11 +4270,6 @@ msgstr "linje %4ld:"
msgid "E354: Invalid register name: '%s'"
msgstr "E354: Ugyldig registernavn: '%s'"
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr ""
-"Vedlikeholder for norsk oversettelse: ุyvind A. Holm <sunny@sunbase.org>"
-
#: ../message.c:986
msgid "Interrupt: "
msgstr "Avbryt: "
@@ -5312,8 +5302,8 @@ msgstr "Advarsel: Region %s ikke st๘ttet"
#: ../spell.c:4550
#, c-format
-msgid "Reading affix file %s ..."
-msgstr "Leser affiksfil %s ..."
+msgid "Reading affix file %s..."
+msgstr "Leser affiksfil %s..."
#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
#, c-format
@@ -5472,8 +5462,8 @@ msgstr "%s-verdi er forskjellig fra det som er bruk i en annen .aff-fil"
#: ../spell.c:5602
#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "Leser ordlistefil %s ..."
+msgid "Reading dictionary file %s..."
+msgstr "Leser ordlistefil %s..."
#: ../spell.c:5611
#, c-format
@@ -5507,8 +5497,8 @@ msgstr "Ignorerte %d ord med ikke-ASCII-tegn i %s"
#: ../spell.c:6115
#, c-format
-msgid "Reading word file %s ..."
-msgstr "Leser ordfil %s ..."
+msgid "Reading word file %s..."
+msgstr "Leser ordfil %s..."
#: ../spell.c:6155
#, c-format
@@ -5578,8 +5568,8 @@ msgstr "Totalt antall ord: %d"
#: ../spell.c:7655
#, c-format
-msgid "Writing suggestion file %s ..."
-msgstr "Skriver forslagsfil %s ..."
+msgid "Writing suggestion file %s..."
+msgstr "Skriver forslagsfil %s..."
#: ../spell.c:7707 ../spell.c:7927
#, c-format
@@ -5605,8 +5595,8 @@ msgstr ""
#: ../spell.c:7920
#, c-format
-msgid "Writing spell file %s ..."
-msgstr "Lagrer stavefil %s ..."
+msgid "Writing spell file %s..."
+msgstr "Lagrer stavefil %s..."
#: ../spell.c:7925
msgid "Done!"
diff --git a/src/nvim/po/pl.UTF-8.po b/src/nvim/po/pl.UTF-8.po
index 68cb9e72d5..a348bf6203 100644
--- a/src/nvim/po/pl.UTF-8.po
+++ b/src/nvim/po/pl.UTF-8.po
@@ -1,5 +1,4 @@
-# translation of pl.po to Polish
-# Polish Translation for Vim
+# Polish translation for Vim
#
# updated 2013 for vim-7.4
#
@@ -14,7 +13,7 @@ msgstr ""
"Last-Translator: Mikolaj Machowski <mikmach@wp.pl>\n"
"Language: pl\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
+"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Lokalize 1.0\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
@@ -2441,7 +2440,7 @@ msgstr "E216: Nie ma takiej grupy lub wydarzenia: %s"
#: ../fileio.c:6090
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
"--- Autokomendy ---"
@@ -2465,7 +2464,7 @@ msgstr "E218: zbyt gล‚ฤ™bokie zagnieลผdลผenie autokomend"
#: ../fileio.c:7143
#, c-format
-msgid "%s Auto commands for \"%s\""
+msgid "%s Autocommands for \"%s\""
msgstr "%s Autokomend dla \"%s\""
#: ../fileio.c:7149
@@ -2658,11 +2657,6 @@ msgstr "E49: Niewล‚aล›ciwa wielkoล›ฤ‡ przewiniฤ™cia"
msgid "E901: Job table is full"
msgstr ""
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
#: ../globals.h:1024
#, c-format
msgid "E364: Library call failed for \"%s()\""
@@ -3363,7 +3357,7 @@ msgstr "-q [errorfile] edytuj plik, zawierajฤ…cy pierwszy bล‚ฤ…d"
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
@@ -3555,7 +3549,7 @@ msgstr ""
#: ../main.c:2240
msgid "--startuptime <file>\tWrite startup timing messages to <file>"
msgstr ""
-"--startuptime <plik>\n"
+"--startuptime <plik> "
"Zapisz wiadomoล›ci o dล‚ugoล›ci startu do <plik>"
#: ../main.c:2242
@@ -4243,10 +4237,6 @@ msgstr "wiersz %4ld:"
msgid "E354: Invalid register name: '%s'"
msgstr "E354: Niewล‚aล›ciwa nazwa rejestru: '%s'"
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr "Opiekun komunikatรณw: Mikoล‚aj Machowski <mikmach@wp.pl>"
-
#: ../message.c:986
msgid "Interrupt: "
msgstr "Przerwanie: "
@@ -5288,8 +5278,8 @@ msgstr "Ostrzeลผenie: region %s nie jest wspierany"
#: ../spell.c:4550
#, c-format
-msgid "Reading affix file %s ..."
-msgstr "Czytam plik afiksรณw %s ..."
+msgid "Reading affix file %s..."
+msgstr "Czytam plik afiksรณw %s..."
#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
#, c-format
@@ -5451,8 +5441,8 @@ msgstr "Wartoล›ฤ‡ %s rรณลผni siฤ™ od tej uลผytej w innym pliku .aff"
#: ../spell.c:5602
#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "Czytam plik sล‚ownika %s ..."
+msgid "Reading dictionary file %s..."
+msgstr "Czytam plik sล‚ownika %s..."
#: ../spell.c:5611
#, c-format
@@ -5489,8 +5479,8 @@ msgstr "Zignorowaล‚em %d sล‚รณw ze znakami nie ASCII w %s"
#: ../spell.c:6115
#, c-format
-msgid "Reading word file %s ..."
-msgstr "Odczytujฤ™ plik wyrazรณw %s ..."
+msgid "Reading word file %s..."
+msgstr "Odczytujฤ™ plik wyrazรณw %s..."
#: ../spell.c:6155
#, c-format
@@ -5559,8 +5549,8 @@ msgstr "Caล‚kowita liczba sล‚รณw: %d"
#: ../spell.c:7655
#, c-format
-msgid "Writing suggestion file %s ..."
-msgstr "Zapisujฤ™ plik sugestii %s ..."
+msgid "Writing suggestion file %s..."
+msgstr "Zapisujฤ™ plik sugestii %s..."
#: ../spell.c:7707 ../spell.c:7927
#, c-format
@@ -5586,8 +5576,8 @@ msgstr "Ostrzeลผenie: okreล›lono zarรณwno zล‚oลผenia jak i NOBREAK"
#: ../spell.c:7920
#, c-format
-msgid "Writing spell file %s ..."
-msgstr "Zapisujฤ™ plik sprawdzania pisowni %s ..."
+msgid "Writing spell file %s..."
+msgstr "Zapisujฤ™ plik sprawdzania pisowni %s..."
#: ../spell.c:7925
msgid "Done!"
diff --git a/src/nvim/po/pl.cp1250.po b/src/nvim/po/pl.cp1250.po
deleted file mode 100644
index 3fcdbfb87d..0000000000
--- a/src/nvim/po/pl.cp1250.po
+++ /dev/null
@@ -1,8264 +0,0 @@
-# translation of pl.po to Polish
-# Polish Translation for Vim
-#
-# updated 2013 for vim-7.4
-#
-# FIRST AUTHOR Marcin Dalecki <martin@dalecki.de>, 2000.
-# Mikolaj Machowski <mikmach@wp.pl>, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2013.
-msgid ""
-msgstr ""
-"Project-Id-Version: pl\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-05-26 14:21+0200\n"
-"PO-Revision-Date: 2010-08-10 18:15+0200\n"
-"Last-Translator: Mikolaj Machowski <mikmach@wp.pl>\n"
-"Language: pl\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=cp1250\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 1.0\n"
-"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
-"|| n%100>=20) ? 1 : 2);\n"
-
-#: ../api/private/helpers.c:201
-#, fuzzy
-msgid "Unable to get option value"
-msgstr "nie mog๊ pobraๆ wartoœci opcji"
-
-#: ../api/private/helpers.c:204
-msgid "internal error: unknown option type"
-msgstr "bณนd wewn๊trzny: nieznany typ opcji"
-
-#: ../buffer.c:92
-msgid "[Location List]"
-msgstr "[Lista lokacji]"
-
-#: ../buffer.c:93
-msgid "[Quickfix List]"
-msgstr "[Lista quickfix]"
-
-#: ../buffer.c:94
-msgid "E855: Autocommands caused command to abort"
-msgstr "E855: Autokomendy spowodowaณy porzucenie komendy"
-
-#: ../buffer.c:135
-msgid "E82: Cannot allocate any buffer, exiting..."
-msgstr "E82: Nie mog๊ zarezerwowaๆ bufora; zako๑czenie..."
-
-#: ../buffer.c:138
-msgid "E83: Cannot allocate buffer, using other one..."
-msgstr "E83: Nie mog๊ zarezerwowaๆ bufora; uฟywam innego..."
-
-#: ../buffer.c:763
-msgid "E515: No buffers were unloaded"
-msgstr "E515: Nie wyณadowano ฟadnego bufora"
-
-#: ../buffer.c:765
-msgid "E516: No buffers were deleted"
-msgstr "E516: Nie skasowano ฟadnego bufora"
-
-#: ../buffer.c:767
-msgid "E517: No buffers were wiped out"
-msgstr "E517: Nie wyrzucono ฟadnego bufora"
-
-#: ../buffer.c:772
-msgid "1 buffer unloaded"
-msgstr "1 bufor wyณadowany"
-
-#: ../buffer.c:774
-#, c-format
-msgid "%d buffers unloaded"
-msgstr "wyณadowano %d bufor๓w"
-
-#: ../buffer.c:777
-msgid "1 buffer deleted"
-msgstr "1 bufor skasowany"
-
-#: ../buffer.c:779
-#, c-format
-msgid "%d buffers deleted"
-msgstr "%d bufor๓w skasowano"
-
-#: ../buffer.c:782
-msgid "1 buffer wiped out"
-msgstr "wyrzucono 1 bufor "
-
-#: ../buffer.c:784
-#, c-format
-msgid "%d buffers wiped out"
-msgstr "wyrzucono %d bufor๓w"
-
-#: ../buffer.c:806
-msgid "E90: Cannot unload last buffer"
-msgstr "E90: Nie mog๊ wyณadowaๆ ostatniego bufora"
-
-#: ../buffer.c:874
-msgid "E84: No modified buffer found"
-msgstr "E84: Nie znaleziono zmienionych bufor๓w"
-
-#. back where we started, didn't find anything.
-#: ../buffer.c:903
-msgid "E85: There is no listed buffer"
-msgstr "E85: Nie ma wylistowanych bufor๓w"
-
-#: ../buffer.c:913
-#, c-format
-msgid "E86: Buffer %<PRId64> does not exist"
-msgstr "E86: Bufor \"%<PRId64>\" nie istnieje"
-
-#: ../buffer.c:915
-msgid "E87: Cannot go beyond last buffer"
-msgstr "E87: Nie mog๊ przejœๆ poza ostatni bufor"
-
-#: ../buffer.c:917
-msgid "E88: Cannot go before first buffer"
-msgstr "E88: Nie mog๊ przejœๆ przed pierwszy bufor"
-
-#: ../buffer.c:945
-#, c-format
-msgid ""
-"E89: No write since last change for buffer %<PRId64> (add ! to override)"
-msgstr "E89: Nie zapisano zmian w buforze %<PRId64> (wymuœ przez !)"
-
-#. wrap around (may cause duplicates)
-#: ../buffer.c:1423
-msgid "W14: Warning: List of file names overflow"
-msgstr "W14: OSTRZEฏENIE: Przepeณnienie listy nazw plik๓w"
-
-#: ../buffer.c:1555 ../quickfix.c:3361
-#, c-format
-msgid "E92: Buffer %<PRId64> not found"
-msgstr "E92: Nie znaleziono bufora %<PRId64>"
-
-#: ../buffer.c:1798
-#, c-format
-msgid "E93: More than one match for %s"
-msgstr "E93: Wielokrotne dopasowania dla %s"
-
-#: ../buffer.c:1800
-#, c-format
-msgid "E94: No matching buffer for %s"
-msgstr "E94: ฏaden bufor nie pasuje do %s"
-
-#: ../buffer.c:2161
-#, c-format
-msgid "line %<PRId64>"
-msgstr "wiersz %<PRId64>"
-
-#: ../buffer.c:2233
-msgid "E95: Buffer with this name already exists"
-msgstr "E95: Bufor o tej nazwie juฟ istnieje"
-
-#: ../buffer.c:2498
-msgid " [Modified]"
-msgstr " [Zmieniony]"
-
-#: ../buffer.c:2501
-msgid "[Not edited]"
-msgstr "[Nie edytowany]"
-
-#: ../buffer.c:2504
-msgid "[New file]"
-msgstr "[Nowy Plik]"
-
-#: ../buffer.c:2505
-msgid "[Read errors]"
-msgstr "[Bณนd odczytu]"
-
-#: ../buffer.c:2506 ../buffer.c:3217 ../fileio.c:1807 ../screen.c:4895
-msgid "[RO]"
-msgstr "[RO]"
-
-#: ../buffer.c:2507 ../fileio.c:1807
-msgid "[readonly]"
-msgstr "[tylko odczyt]"
-
-#: ../buffer.c:2524
-#, c-format
-msgid "1 line --%d%%--"
-msgstr "1 wiersz --%d%%--"
-
-#: ../buffer.c:2526
-#, c-format
-msgid "%<PRId64> lines --%d%%--"
-msgstr "%<PRId64> wiersze --%d%%--"
-
-#: ../buffer.c:2530
-#, c-format
-msgid "line %<PRId64> of %<PRId64> --%d%%-- col "
-msgstr "wiersz %<PRId64> z %<PRId64> --%d%%-- kol "
-
-#: ../buffer.c:2632 ../buffer.c:4292 ../memline.c:1554
-msgid "[No Name]"
-msgstr "[Bez nazwy]"
-
-#. must be a help buffer
-#: ../buffer.c:2667
-msgid "help"
-msgstr "pomoc"
-
-#: ../buffer.c:3225 ../screen.c:4883
-msgid "[Help]"
-msgstr "[Pomoc]"
-
-#: ../buffer.c:3254 ../screen.c:4887
-msgid "[Preview]"
-msgstr "[Podglนd]"
-
-#: ../buffer.c:3528
-msgid "All"
-msgstr "Wszystko"
-
-#: ../buffer.c:3528
-msgid "Bot"
-msgstr "D๓ณ"
-
-#: ../buffer.c:3531
-msgid "Top"
-msgstr "G๓ra"
-
-#: ../buffer.c:4244
-msgid ""
-"\n"
-"# Buffer list:\n"
-msgstr ""
-"\n"
-"# Lista bufor๓w:\n"
-
-#: ../buffer.c:4289
-msgid "[Scratch]"
-msgstr "[Notka]"
-
-#: ../buffer.c:4529
-msgid ""
-"\n"
-"--- Signs ---"
-msgstr ""
-"\n"
-"--- Znaki ---"
-
-#: ../buffer.c:4538
-#, c-format
-msgid "Signs for %s:"
-msgstr "Znaki dla %s:"
-
-#: ../buffer.c:4543
-#, c-format
-msgid " line=%<PRId64> id=%d name=%s"
-msgstr " wiersz=%<PRId64> id=%d nazwa=%s"
-
-#: ../cursor_shape.c:68
-msgid "E545: Missing colon"
-msgstr "E545: Brak dwukropka"
-
-#: ../cursor_shape.c:70 ../cursor_shape.c:94
-msgid "E546: Illegal mode"
-msgstr "E546: Niedozwolony tryb"
-
-#: ../cursor_shape.c:134
-msgid "E548: digit expected"
-msgstr "E548: oczekiwaณem na cyfr๊"
-
-#: ../cursor_shape.c:138
-msgid "E549: Illegal percentage"
-msgstr "E549: Niedozwolony procent"
-
-#: ../diff.c:146
-#, c-format
-msgid "E96: Can not diff more than %<PRId64> buffers"
-msgstr "E96: Nie mog๊ zr๓ฟnicowaๆ wi๊cej niฟ %<PRId64> bufor๓w"
-
-#: ../diff.c:753
-msgid "E810: Cannot read or write temp files"
-msgstr "E810: Nie mog๊ otworzyๆ lub zapisaๆ plik๓w tymczasowych"
-
-#: ../diff.c:755
-msgid "E97: Cannot create diffs"
-msgstr "E97: Nie mog๊ stworzyๆ r๓ฟnic"
-
-#: ../diff.c:966
-msgid "E816: Cannot read patch output"
-msgstr "E816: Nie mog๊ odczytaๆ wyjœcia pliku ณaty"
-
-#: ../diff.c:1220
-msgid "E98: Cannot read diff output"
-msgstr "E98: Nie mog๊ wczytaๆ wyjœcia r๓ฟnicy"
-
-#: ../diff.c:2081
-msgid "E99: Current buffer is not in diff mode"
-msgstr "E99: Bieฟนcy bufor nie jest w trybie r๓ฟnic"
-
-#: ../diff.c:2100
-msgid "E793: No other buffer in diff mode is modifiable"
-msgstr "E793: ฏaden inny bufor w trybie diff nie jest modyfikowalny"
-
-#: ../diff.c:2102
-msgid "E100: No other buffer in diff mode"
-msgstr "E100: Brak innego bufora w trybie r๓ฟnic"
-
-#: ../diff.c:2112
-msgid "E101: More than two buffers in diff mode, don't know which one to use"
-msgstr ""
-"E101: Wi๊cej niฟ jeden bufor w trybie r๓ฟnicowania, nie wiem kt๓rego uฟyๆ"
-
-#: ../diff.c:2141
-#, c-format
-msgid "E102: Can't find buffer \"%s\""
-msgstr "E102: Nie mog๊ znaleŸๆ bufora \"%s\""
-
-#: ../diff.c:2152
-#, c-format
-msgid "E103: Buffer \"%s\" is not in diff mode"
-msgstr "E103: Bufor \"%s\" nie jest w trybie r๓ฟnicowania"
-
-#: ../diff.c:2193
-msgid "E787: Buffer changed unexpectedly"
-msgstr "E787: Nieoczekiwana zmiana bufora"
-
-#: ../digraph.c:1598
-msgid "E104: Escape not allowed in digraph"
-msgstr "E104: Escape jest niedozwolone w dwugrafie"
-
-#: ../digraph.c:1760
-msgid "E544: Keymap file not found"
-msgstr "E544: Nie znaleziono pliku rozkณadu klawiszy"
-
-#: ../digraph.c:1785
-msgid "E105: Using :loadkeymap not in a sourced file"
-msgstr "E105: Zastosowano :loadkeymap w niewczytanym pliku"
-
-#: ../digraph.c:1821
-msgid "E791: Empty keymap entry"
-msgstr "E791: Pusty wpis keymap"
-
-#: ../edit.c:82
-msgid " Keyword completion (^N^P)"
-msgstr " Dopeณnianie sณ๓w kluczowych (^N^P)"
-
-#. ctrl_x_mode == 0, ^P/^N compl.
-#: ../edit.c:83
-msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-msgstr " ^X tryb (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-
-#: ../edit.c:85
-msgid " Whole line completion (^L^N^P)"
-msgstr " Dopeณnianie peณnych wierszy (^L^N^P)"
-
-#: ../edit.c:86
-msgid " File name completion (^F^N^P)"
-msgstr " Dopeณnianie nazw plik๓w (^F^N^P)"
-
-#: ../edit.c:87
-msgid " Tag completion (^]^N^P)"
-msgstr " Dopeณnianie znacznik๓w (^]^N^P)"
-
-#: ../edit.c:88
-msgid " Path pattern completion (^N^P)"
-msgstr " Dopeณnianie wzorc๓w trop๓w (^N^P)"
-
-#: ../edit.c:89
-msgid " Definition completion (^D^N^P)"
-msgstr " Dopeณnianie definicji (^D^N^P)"
-
-#: ../edit.c:91
-msgid " Dictionary completion (^K^N^P)"
-msgstr " Dopeณnianie ze sณownik๓w (^K^N^P)"
-
-#: ../edit.c:92
-msgid " Thesaurus completion (^T^N^P)"
-msgstr " Dopeณnianie z tezaurusa (^T^N^P)"
-
-#: ../edit.c:93
-msgid " Command-line completion (^V^N^P)"
-msgstr " Dopeณnianie wiersza polece๑ (^V^N^P)"
-
-#: ../edit.c:94
-msgid " User defined completion (^U^N^P)"
-msgstr "Dopeณnianie zdefiniowane przez uฟytkownika (^U^N^P)"
-
-#: ../edit.c:95
-msgid " Omni completion (^O^N^P)"
-msgstr " Omni uzupeณnianie (^O^N^P)"
-
-#: ../edit.c:96
-msgid " Spelling suggestion (s^N^P)"
-msgstr "Propozycja pisowni (^L^N^P)"
-
-#: ../edit.c:97
-msgid " Keyword Local completion (^N^P)"
-msgstr " Lokalne dopeณnianie sณ๓w kluczowych (^N^P)"
-
-#: ../edit.c:100
-msgid "Hit end of paragraph"
-msgstr "Dobiณem do ko๑ca akapitu"
-
-#: ../edit.c:101
-msgid "E839: Completion function changed window"
-msgstr "E839: Funkcja uzupeณniania zmieniณa okno"
-
-#: ../edit.c:102
-msgid "E840: Completion function deleted text"
-msgstr "E840: Funkcja uzupeณnania usun๊ณa tekst"
-
-#: ../edit.c:1847
-msgid "'dictionary' option is empty"
-msgstr "opcja 'dictionary' jest pusta"
-
-#: ../edit.c:1848
-msgid "'thesaurus' option is empty"
-msgstr "opcja 'thesaurus' jest pusta"
-
-#: ../edit.c:2655
-#, c-format
-msgid "Scanning dictionary: %s"
-msgstr "Przeglนdam sณownik: %s"
-
-#: ../edit.c:3079
-msgid " (insert) Scroll (^E/^Y)"
-msgstr " (wprowadzanie) Przewijanie (^E/^Y)"
-
-#: ../edit.c:3081
-msgid " (replace) Scroll (^E/^Y)"
-msgstr " (zamiana) Przewijanie (^E/^Y)"
-
-#: ../edit.c:3587
-#, c-format
-msgid "Scanning: %s"
-msgstr "Przeglนdam: %s"
-
-#: ../edit.c:3614
-msgid "Scanning tags."
-msgstr "Przeglนdam znaczniki."
-
-#: ../edit.c:4519
-msgid " Adding"
-msgstr " Dodaj๊"
-
-#. showmode might reset the internal line pointers, so it must
-#. * be called before line = ml_get(), or when this address is no
-#. * longer needed. -- Acevedo.
-#.
-#: ../edit.c:4562
-msgid "-- Searching..."
-msgstr "-- Szukam..."
-
-#: ../edit.c:4618
-msgid "Back at original"
-msgstr "Z powrotem na pierwotnym"
-
-#: ../edit.c:4621
-msgid "Word from other line"
-msgstr "Wyraz z innego wiersza"
-
-#: ../edit.c:4624
-msgid "The only match"
-msgstr "Jedyne dopasowanie"
-
-#: ../edit.c:4680
-#, c-format
-msgid "match %d of %d"
-msgstr "pasuje %d z %d"
-
-#: ../edit.c:4684
-#, c-format
-msgid "match %d"
-msgstr "pasuje %d"
-
-#: ../eval.c:137
-msgid "E18: Unexpected characters in :let"
-msgstr "E18: Nieoczekiwane znaki w :let"
-
-#: ../eval.c:138
-#, c-format
-msgid "E684: list index out of range: %<PRId64>"
-msgstr "E684: Indeks listy poza zakresem: %<PRId64>"
-
-#: ../eval.c:139
-#, c-format
-msgid "E121: Undefined variable: %s"
-msgstr "E121: Nieokreœlona zmienna: %s"
-
-#: ../eval.c:140
-msgid "E111: Missing ']'"
-msgstr "E111: Brak ']'"
-
-#: ../eval.c:141
-#, c-format
-msgid "E686: Argument of %s must be a List"
-msgstr "E686: Argument %s musi byๆ Listน"
-
-#: ../eval.c:143
-#, c-format
-msgid "E712: Argument of %s must be a List or Dictionary"
-msgstr "E712: Argument %s musi byๆ Listน lub Sณownikiem"
-
-#: ../eval.c:144
-msgid "E713: Cannot use empty key for Dictionary"
-msgstr "E713: Nie moฟna uฟyๆ pustego klucza dla Sณownika"
-
-#: ../eval.c:145
-msgid "E714: List required"
-msgstr "E714: wymagana Lista"
-
-#: ../eval.c:146
-msgid "E715: Dictionary required"
-msgstr "E715: wymagany Sณownik"
-
-#: ../eval.c:147
-#, c-format
-msgid "E118: Too many arguments for function: %s"
-msgstr "E118: Zbyt wiele argument๓w dla funkcji: %s"
-
-#: ../eval.c:148
-#, c-format
-msgid "E716: Key not present in Dictionary: %s"
-msgstr "E716: Klucz nie istnieje w Sณowniku: %s"
-
-#: ../eval.c:150
-#, c-format
-msgid "E122: Function %s already exists, add ! to replace it"
-msgstr "E122: Funkcja %s juฟ istnieje; aby jน zamieniๆ uฟyj !"
-
-#: ../eval.c:151
-msgid "E717: Dictionary entry already exists"
-msgstr "E717: istnieje juฟ taki element Sณownika"
-
-#: ../eval.c:152
-msgid "E718: Funcref required"
-msgstr "E718: wymagana Funcref"
-
-#: ../eval.c:153
-msgid "E719: Cannot use [:] with a Dictionary"
-msgstr "E719: Nie moฟna uฟyๆ [:] przy Sณowniku"
-
-#: ../eval.c:154
-#, c-format
-msgid "E734: Wrong variable type for %s="
-msgstr "E734: Zณy typ zmiennej dla %s="
-
-#: ../eval.c:155
-#, c-format
-msgid "E130: Unknown function: %s"
-msgstr "E130: Nieznana funkcja: %s"
-
-#: ../eval.c:156
-#, c-format
-msgid "E461: Illegal variable name: %s"
-msgstr "E461: Niedozwolona nazwa zmiennej: %s"
-
-#: ../eval.c:157
-msgid "E806: using Float as a String"
-msgstr "E806: Uฟycie Zmiennoprzecinkowej jako ฃa๑cucha"
-
-#: ../eval.c:1830
-msgid "E687: Less targets than List items"
-msgstr "E687: Mniej cel๓w niฟ element๓w Listy"
-
-#: ../eval.c:1834
-msgid "E688: More targets than List items"
-msgstr "E688: Wi๊cej cel๓w niฟ element๓w Listy"
-
-#: ../eval.c:1906
-msgid "Double ; in list of variables"
-msgstr "Podw๓jny ; w liœcie zmiennych"
-
-#: ../eval.c:2078
-#, c-format
-msgid "E738: Can't list variables for %s"
-msgstr "E738: Nie mog๊ wypisaๆ zmiennych dla %s"
-
-#: ../eval.c:2391
-msgid "E689: Can only index a List or Dictionary"
-msgstr "E689: Indeks moฟe istnieๆ tylko dla Listy lub Sณownika"
-
-#: ../eval.c:2396
-msgid "E708: [:] must come last"
-msgstr "E708: [:] musi byๆ ostatnie"
-
-#: ../eval.c:2439
-msgid "E709: [:] requires a List value"
-msgstr "E709: [:] wymaga wartoœci listy"
-
-#: ../eval.c:2674
-msgid "E710: List value has more items than target"
-msgstr "E710: Lista ma wi๊cej element๓w niฟ cel"
-
-#: ../eval.c:2678
-msgid "E711: List value has not enough items"
-msgstr "E711: Lista nie ma wystarczajนcej iloœci element๓w"
-
-#: ../eval.c:2867
-msgid "E690: Missing \"in\" after :for"
-msgstr "E690: Brak \"in\" po :for"
-
-#: ../eval.c:3063
-#, c-format
-msgid "E107: Missing parentheses: %s"
-msgstr "E107: Brak nawias๓w: %s"
-
-#: ../eval.c:3263
-#, c-format
-msgid "E108: No such variable: \"%s\""
-msgstr "E108: Nie istnieje zmienna: \"%s\""
-
-#: ../eval.c:3333
-msgid "E743: variable nested too deep for (un)lock"
-msgstr "E743: zmienna zagnieฟdฟona zbyt gณ๊boko dla (un)lock"
-
-#: ../eval.c:3630
-msgid "E109: Missing ':' after '?'"
-msgstr "E109: Brak ':' po '?'"
-
-#: ../eval.c:3893
-msgid "E691: Can only compare List with List"
-msgstr "E691: List๊ mog๊ por๓wnaๆ tylko z Listน"
-
-#: ../eval.c:3895
-msgid "E692: Invalid operation for Lists"
-msgstr "E692: Nieprawidณowa operacja dla Listy"
-
-#: ../eval.c:3915
-msgid "E735: Can only compare Dictionary with Dictionary"
-msgstr "E735: Sณownik mog๊ por๓wnaๆ tylko ze Sณownikiem"
-
-#: ../eval.c:3917
-msgid "E736: Invalid operation for Dictionary"
-msgstr "E736: Nieprawidณowa operacja dla Sณownika"
-
-#: ../eval.c:3932
-msgid "E693: Can only compare Funcref with Funcref"
-msgstr "E693: Funcref mog๊ por๓wnaๆ tylko z Funcref"
-
-#: ../eval.c:3934
-msgid "E694: Invalid operation for Funcrefs"
-msgstr "E694: Nieprawidณowa operacja dla Funcref"
-
-#: ../eval.c:4277
-msgid "E804: Cannot use '%' with Float"
-msgstr "E804: Nie mog๊ uฟyๆ '%' w Zmiennoprzecinkowej"
-
-#: ../eval.c:4478
-msgid "E110: Missing ')'"
-msgstr "E110: Brak ')'"
-
-#: ../eval.c:4609
-msgid "E695: Cannot index a Funcref"
-msgstr "E695: Nie moฟna zindeksowaๆ Funcref"
-
-#: ../eval.c:4839
-#, c-format
-msgid "E112: Option name missing: %s"
-msgstr "E112: Brak nazwy opcji: %s"
-
-#: ../eval.c:4855
-#, c-format
-msgid "E113: Unknown option: %s"
-msgstr "E113: Nieznana opcja: %s"
-
-#: ../eval.c:4904
-#, c-format
-msgid "E114: Missing quote: %s"
-msgstr "E114: Brak cudzysณowu: %s"
-
-#: ../eval.c:5020
-#, c-format
-msgid "E115: Missing quote: %s"
-msgstr "E115: Brak cudzysณowu: %s"
-
-#: ../eval.c:5084
-#, c-format
-msgid "E696: Missing comma in List: %s"
-msgstr "E696: Brakujนcy przecinek w Liœcie: '%s"
-
-#: ../eval.c:5091
-#, c-format
-msgid "E697: Missing end of List ']': %s"
-msgstr "E697: Brak zako๑czenia Listy ']': %s"
-
-#: ../eval.c:6475
-#, c-format
-msgid "E720: Missing colon in Dictionary: %s"
-msgstr "E720: Brak dwukropka w Sณowniku: %s"
-
-#: ../eval.c:6499
-#, c-format
-msgid "E721: Duplicate key in Dictionary: \"%s\""
-msgstr "E721: Powt๓rzony klucz w Sณowniku: \"%s\""
-
-#: ../eval.c:6517
-#, c-format
-msgid "E722: Missing comma in Dictionary: %s"
-msgstr "E722: Brakujนcy przecinek w Sณowniku: %s"
-
-#: ../eval.c:6524
-#, c-format
-msgid "E723: Missing end of Dictionary '}': %s"
-msgstr "E723: Brak ko๑ca w Sณowniku '}': %s"
-
-#: ../eval.c:6555
-msgid "E724: variable nested too deep for displaying"
-msgstr "E724: Zmienna zagnieฟdฟona zbyt gณ๊boko by pokazaๆ"
-
-#: ../eval.c:7188
-#, c-format
-msgid "E740: Too many arguments for function %s"
-msgstr "E740: Zbyt wiele argument๓w dla funkcji %s"
-
-#: ../eval.c:7190
-#, c-format
-msgid "E116: Invalid arguments for function %s"
-msgstr "E116: Zbyt wiele argument๓w dla funkcji %s"
-
-#: ../eval.c:7377
-#, c-format
-msgid "E117: Unknown function: %s"
-msgstr "E117: Nieznana funkcja: %s"
-
-#: ../eval.c:7383
-#, c-format
-msgid "E119: Not enough arguments for function: %s"
-msgstr "E119: Za maณo argument๓w dla funkcji: %s"
-
-#: ../eval.c:7387
-#, c-format
-msgid "E120: Using <SID> not in a script context: %s"
-msgstr "E120: Uฟycie <SID> poza kontekstem skryptu: %s"
-
-#: ../eval.c:7391
-#, c-format
-msgid "E725: Calling dict function without Dictionary: %s"
-msgstr "E725: Wywoณanie funkcji \"dict\" bez Sณownika: %s"
-
-#: ../eval.c:7453
-msgid "E808: Number or Float required"
-msgstr "E808: Wymagana Liczba lub Zmiennoprzecinkowa"
-
-#: ../eval.c:7503
-msgid "add() argument"
-msgstr "argument add()"
-
-#: ../eval.c:7907
-msgid "E699: Too many arguments"
-msgstr "E699: Za duฟo argument๓w"
-
-#: ../eval.c:8073
-msgid "E785: complete() can only be used in Insert mode"
-msgstr "E785: complete() moฟe byๆ uฟyte tylko w trybie Wprowadzania"
-
-#: ../eval.c:8156
-msgid "&Ok"
-msgstr "&Ok"
-
-#: ../eval.c:8676
-#, c-format
-msgid "E737: Key already exists: %s"
-msgstr "E737: Klucz juฟ istnieje: %s"
-
-#: ../eval.c:8692
-msgid "extend() argument"
-msgstr "argument extend()"
-
-#: ../eval.c:8915
-msgid "map() argument"
-msgstr "argument map()"
-
-#: ../eval.c:8916
-msgid "filter() argument"
-msgstr "argument filter()"
-
-#: ../eval.c:9229
-#, c-format
-msgid "+-%s%3ld lines: "
-msgstr "+-%s%3ld wierszy: "
-
-#: ../eval.c:9291
-#, c-format
-msgid "E700: Unknown function: %s"
-msgstr "E700: Nieznana funkcja: %s"
-
-#: ../eval.c:10729
-msgid "called inputrestore() more often than inputsave()"
-msgstr "wywoณano inputrestore() wi๊cej razy niฟ inputsave()"
-
-#: ../eval.c:10771
-msgid "insert() argument"
-msgstr "argument insert()"
-
-#: ../eval.c:10841
-msgid "E786: Range not allowed"
-msgstr "E786: Zakres niedozwolony"
-
-#: ../eval.c:11140
-msgid "E701: Invalid type for len()"
-msgstr "E701: Nieprawidณowy typ dla len()"
-
-#: ../eval.c:11980
-msgid "E726: Stride is zero"
-msgstr "E726: Skok to zero"
-
-#: ../eval.c:11982
-msgid "E727: Start past end"
-msgstr "E727: Poczนtek po ko๑cu"
-
-#: ../eval.c:12024 ../eval.c:15297
-msgid "<empty>"
-msgstr "<pusty>"
-
-#: ../eval.c:12282
-msgid "remove() argument"
-msgstr "argument remove()"
-
-#: ../eval.c:12466
-msgid "E655: Too many symbolic links (cycle?)"
-msgstr "E655: Za duฟo dowiนza๑ symbolicznych (p๊tla?)"
-
-#: ../eval.c:12593
-msgid "reverse() argument"
-msgstr "argument reverse()"
-
-#: ../eval.c:13721
-msgid "sort() argument"
-msgstr "argument sort()"
-
-#: ../eval.c:13721
-#, fuzzy
-msgid "uniq() argument"
-msgstr "argument add()"
-
-#: ../eval.c:13776
-msgid "E702: Sort compare function failed"
-msgstr "E702: Funkcja por๓wnywania w sort nie powiodณa si๊"
-
-#: ../eval.c:13806
-#, fuzzy
-msgid "E882: Uniq compare function failed"
-msgstr "E702: Funkcja por๓wnywania w sort nie powiodณa si๊"
-
-#: ../eval.c:14085
-msgid "(Invalid)"
-msgstr "(Niewณaœciwe)"
-
-#: ../eval.c:14590
-msgid "E677: Error writing temp file"
-msgstr "E677: Bณนd zapisywania pliku tymczasowego"
-
-#: ../eval.c:16159
-msgid "E805: Using a Float as a Number"
-msgstr "E805: Uฟycie Zmiennoprzecinkowej jako Liczby"
-
-#: ../eval.c:16162
-msgid "E703: Using a Funcref as a Number"
-msgstr "E703: Uฟycie Funcref jako Liczby"
-
-#: ../eval.c:16170
-msgid "E745: Using a List as a Number"
-msgstr "E745: Uฟycie Listy jako Liczby"
-
-#: ../eval.c:16173
-msgid "E728: Using a Dictionary as a Number"
-msgstr "E728: Uฟycie Sณownika jako Liczby"
-
-#: ../eval.c:16259
-msgid "E729: using Funcref as a String"
-msgstr "E729: Uฟycie Funcref jako ฃa๑cucha"
-
-#: ../eval.c:16262
-msgid "E730: using List as a String"
-msgstr "E730: Uฟycie Listy jako ฃa๑cucha"
-
-#: ../eval.c:16265
-msgid "E731: using Dictionary as a String"
-msgstr "E731: Uฟycie Sณownika jako ฃa๑cucha"
-
-#: ../eval.c:16619
-#, c-format
-msgid "E706: Variable type mismatch for: %s"
-msgstr "E706: Nieprawidณowy typ zmiennej dla: %s"
-
-#: ../eval.c:16705
-#, c-format
-msgid "E795: Cannot delete variable %s"
-msgstr "E795: Nie mog๊ usunนๆ zmiennej %s"
-
-#: ../eval.c:16724
-#, c-format
-msgid "E704: Funcref variable name must start with a capital: %s"
-msgstr "E704: Nazwa Funcref musi si๊ zaczynaๆ wielkน literน: %s"
-
-#: ../eval.c:16732
-#, c-format
-msgid "E705: Variable name conflicts with existing function: %s"
-msgstr "E705: Nazwa zmiennej jest w konflikcie z istniejนcน funkcjน: %s"
-
-#: ../eval.c:16763
-#, c-format
-msgid "E741: Value is locked: %s"
-msgstr "E741: Wartoœๆ jest zablokowana: %s"
-
-#: ../eval.c:16764 ../eval.c:16769 ../message.c:1839
-msgid "Unknown"
-msgstr "Nieznane"
-
-#: ../eval.c:16768
-#, c-format
-msgid "E742: Cannot change value of %s"
-msgstr "E742: Nie mog๊ zmieniๆ wartoœci %s"
-
-#: ../eval.c:16838
-msgid "E698: variable nested too deep for making a copy"
-msgstr "E698: Zmienna zagnieฟdฟona zbyt gณ๊boko by zrobiๆ kopi๊"
-
-#: ../eval.c:17249
-#, c-format
-msgid "E123: Undefined function: %s"
-msgstr "E123: Nieznana funkcja: %s"
-
-#: ../eval.c:17260
-#, c-format
-msgid "E124: Missing '(': %s"
-msgstr "E124: Brak '(': %s"
-
-#: ../eval.c:17293
-msgid "E862: Cannot use g: here"
-msgstr "E862: Nie moฟna tutaj uฟyๆ g:"
-
-#: ../eval.c:17312
-#, c-format
-msgid "E125: Illegal argument: %s"
-msgstr "E125: Niedozwolony argument: %s"
-
-#: ../eval.c:17323
-#, c-format
-msgid "E853: Duplicate argument name: %s"
-msgstr "E853: Powt๓rzona nazwa argumentu: %s"
-
-#: ../eval.c:17416
-msgid "E126: Missing :endfunction"
-msgstr "E126: Brak :endfunction"
-
-#: ../eval.c:17537
-#, c-format
-msgid "E707: Function name conflicts with variable: %s"
-msgstr "E707: Nazwa funkcji jest w konflikcie ze zmiennน: %s"
-
-#: ../eval.c:17549
-#, c-format
-msgid "E127: Cannot redefine function %s: It is in use"
-msgstr "E127: Nie mog๊ redefiniowaๆ funkcji %s: jest w uฟyciu"
-
-#: ../eval.c:17604
-#, c-format
-msgid "E746: Function name does not match script file name: %s"
-msgstr "E746: Nazwa funkcji nie pasuje do nazwy skryptu: %s"
-
-#: ../eval.c:17716
-msgid "E129: Function name required"
-msgstr "E129: Wymagana jest nazwa funkcji"
-
-#: ../eval.c:17824
-#, fuzzy, c-format
-msgid "E128: Function name must start with a capital or \"s:\": %s"
-msgstr ""
-"E128: Nazwa funkcji musi rozpoczynaๆ si๊ wielkน literน lub zawieraๆ "
-"dwukropek: %s"
-
-#: ../eval.c:17833
-#, fuzzy, c-format
-msgid "E884: Function name cannot contain a colon: %s"
-msgstr ""
-"E128: Nazwa funkcji musi rozpoczynaๆ si๊ wielkน literน lub zawieraๆ "
-"dwukropek: %s"
-
-#: ../eval.c:18336
-#, c-format
-msgid "E131: Cannot delete function %s: It is in use"
-msgstr "E131: Nie mog๊ skasowaๆ funkcji %s: jest w uฟyciu"
-
-#: ../eval.c:18441
-msgid "E132: Function call depth is higher than 'maxfuncdepth'"
-msgstr "E132: Zagnieฟdฟenie wywoณa๑ funkcji ponad 'maxfuncdepth'"
-
-#: ../eval.c:18568
-#, c-format
-msgid "calling %s"
-msgstr "wywoณuj๊ %s"
-
-#: ../eval.c:18651
-#, c-format
-msgid "%s aborted"
-msgstr "porzucono %s"
-
-#: ../eval.c:18653
-#, c-format
-msgid "%s returning #%<PRId64>"
-msgstr "%s zwraca #%<PRId64>"
-
-#: ../eval.c:18670
-#, c-format
-msgid "%s returning %s"
-msgstr "%s zwraca %s"
-
-#: ../eval.c:18691 ../ex_cmds2.c:2695
-#, c-format
-msgid "continuing in %s"
-msgstr "kontynuacja w %s"
-
-#: ../eval.c:18795
-msgid "E133: :return not inside a function"
-msgstr "E133: :return poza funkcjน"
-
-#: ../eval.c:19159
-msgid ""
-"\n"
-"# global variables:\n"
-msgstr ""
-"\n"
-"# zmienne globalne:\n"
-
-#: ../eval.c:19254
-msgid ""
-"\n"
-"\tLast set from "
-msgstr ""
-"\n"
-"\tOstatnie ustawienie przez "
-
-#: ../eval.c:19272
-msgid "No old files"
-msgstr "Brak starych plik๓w"
-
-#: ../ex_cmds.c:122
-#, c-format
-msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
-msgstr "<%s>%s%s %d, Hex %02x, Oktal %03o"
-
-#: ../ex_cmds.c:145
-#, c-format
-msgid "> %d, Hex %04x, Octal %o"
-msgstr "> %d, Hex %04x, Oktal %o"
-
-#: ../ex_cmds.c:146
-#, c-format
-msgid "> %d, Hex %08x, Octal %o"
-msgstr "> %d, Hex %08x, Oktal %o"
-
-#: ../ex_cmds.c:684
-msgid "E134: Move lines into themselves"
-msgstr "E134: Przeniesienie wierszy na siebie samych"
-
-#: ../ex_cmds.c:747
-msgid "1 line moved"
-msgstr "1 wiersz przeniesiony"
-
-#: ../ex_cmds.c:749
-#, c-format
-msgid "%<PRId64> lines moved"
-msgstr "%<PRId64> wiersze przeniesione"
-
-#: ../ex_cmds.c:1175
-#, c-format
-msgid "%<PRId64> lines filtered"
-msgstr "%<PRId64> wierszy przefiltrowanych"
-
-#: ../ex_cmds.c:1194
-msgid "E135: *Filter* Autocommands must not change current buffer"
-msgstr "E135: Autokomendy *Filter* nie mogน zmieniaๆ bieฟนcego bufora"
-
-#: ../ex_cmds.c:1244
-msgid "[No write since last change]\n"
-msgstr "[Brak zapisu od czasu ostatniej zmiany]\n"
-
-#: ../ex_cmds.c:1424
-#, c-format
-msgid "%sviminfo: %s in line: "
-msgstr "%sviminfo: %s w wierszu: "
-
-#: ../ex_cmds.c:1431
-msgid "E136: viminfo: Too many errors, skipping rest of file"
-msgstr "E136: viminfo: Zbyt wiele bณ๊d๓w; pomijam reszt๊ pliku"
-
-#: ../ex_cmds.c:1458
-#, c-format
-msgid "Reading viminfo file \"%s\"%s%s%s"
-msgstr "Wczytuj๊ plik viminfo \"%s\"%s%s%s"
-
-#: ../ex_cmds.c:1460
-msgid " info"
-msgstr " informacja"
-
-#: ../ex_cmds.c:1461
-msgid " marks"
-msgstr " zakณadki"
-
-#: ../ex_cmds.c:1462
-msgid " oldfiles"
-msgstr " stare pliki"
-
-#: ../ex_cmds.c:1463
-msgid " FAILED"
-msgstr " NIE POWIODฃO SIส"
-
-#. avoid a wait_return for this message, it's annoying
-#: ../ex_cmds.c:1541
-#, c-format
-msgid "E137: Viminfo file is not writable: %s"
-msgstr "E137: Plik viminfo jest niezapisywalny: %s"
-
-#: ../ex_cmds.c:1626
-#, c-format
-msgid "E138: Can't write viminfo file %s!"
-msgstr "E138: Nie mog๊ zapisaๆ pliku viminfo %s!"
-
-#: ../ex_cmds.c:1635
-#, c-format
-msgid "Writing viminfo file \"%s\""
-msgstr "Zapisuj๊ plik viminfo \"%s\""
-
-#. Write the info:
-#: ../ex_cmds.c:1720
-#, c-format
-msgid "# This viminfo file was generated by Vim %s.\n"
-msgstr "# Ten plik viminfo zostaณ wygenerowany przez Vima %s.\n"
-
-#: ../ex_cmds.c:1722
-msgid ""
-"# You may edit it if you're careful!\n"
-"\n"
-msgstr ""
-"# Moฟesz go ostroฟnie edytowaๆ!\n"
-"\n"
-
-#: ../ex_cmds.c:1723
-msgid "# Value of 'encoding' when this file was written\n"
-msgstr "# Wartoœๆ 'encoding' w czasie zapisu tego pliku\n"
-
-#: ../ex_cmds.c:1800
-msgid "Illegal starting char"
-msgstr "Niedopuszczalny poczนtkowy znak"
-
-#: ../ex_cmds.c:2162
-msgid "Write partial file?"
-msgstr "Zapisaๆ cz๊œciowo plik?"
-
-#: ../ex_cmds.c:2166
-msgid "E140: Use ! to write partial buffer"
-msgstr "E140: Stosuj ! do zapisania cz๊œciowo bufora"
-
-#: ../ex_cmds.c:2281
-#, c-format
-msgid "Overwrite existing file \"%s\"?"
-msgstr "Nadpisaๆ istniejนcy plik \"%s\"?"
-
-#: ../ex_cmds.c:2317
-#, c-format
-msgid "Swap file \"%s\" exists, overwrite anyway?"
-msgstr "Plik wymiany \"%s\" istnieje, czy go nadpisaๆ?"
-
-#: ../ex_cmds.c:2326
-#, c-format
-msgid "E768: Swap file exists: %s (:silent! overrides)"
-msgstr "E768: Plik wymiany istnieje: %s (wymuœ poprzez :silent!)"
-
-#: ../ex_cmds.c:2381
-#, c-format
-msgid "E141: No file name for buffer %<PRId64>"
-msgstr "E141: Brak nazwy pliku dla bufora %<PRId64>"
-
-#: ../ex_cmds.c:2412
-msgid "E142: File not written: Writing is disabled by 'write' option"
-msgstr "E142: Plik niezapisany: Zapis jest wyณนczony opcjน 'write'"
-
-#: ../ex_cmds.c:2434
-#, c-format
-msgid ""
-"'readonly' option is set for \"%s\".\n"
-"Do you wish to write anyway?"
-msgstr ""
-"opcja 'readonly' nastawiona dla \"%s\".\n"
-"Czy chcesz go pomimo tego zapisaๆ?"
-
-#: ../ex_cmds.c:2439
-#, c-format
-msgid ""
-"File permissions of \"%s\" are read-only.\n"
-"It may still be possible to write it.\n"
-"Do you wish to try?"
-msgstr ""
-"Prawa pliku \"%s\" sน tylko do odczytu.\n"
-"Mimo to byๆ moฟe uda si๊ zmieniๆ ten plik.\n"
-"Chcesz spr๓bowaๆ?"
-
-#: ../ex_cmds.c:2451
-#, c-format
-msgid "E505: \"%s\" is read-only (add ! to override)"
-msgstr "E505: \"%s\" jest tylko do odczytu (dodaj ! aby wymusiๆ)"
-
-#: ../ex_cmds.c:3120
-#, c-format
-msgid "E143: Autocommands unexpectedly deleted new buffer %s"
-msgstr "E143: Autokomendy nieoczekiwanie skasowaณy nowy bufor %s"
-
-#: ../ex_cmds.c:3313
-msgid "E144: non-numeric argument to :z"
-msgstr "E144: nienumeryczny argument dla :z"
-
-#: ../ex_cmds.c:3404
-msgid "E145: Shell commands not allowed in rvim"
-msgstr "E145: Komendy powณoki sน niedozwolone w rvim"
-
-#: ../ex_cmds.c:3498
-msgid "E146: Regular expressions can't be delimited by letters"
-msgstr "E146: Wzorce regularne nie mogน byๆ rozgraniczane literami"
-
-#: ../ex_cmds.c:3964
-#, c-format
-msgid "replace with %s (y/n/a/q/l/^E/^Y)?"
-msgstr "zamie๑ na %s (y/n/a/q/l/^E/^Y)?"
-
-#: ../ex_cmds.c:4379
-msgid "(Interrupted) "
-msgstr "(Przerwane) "
-
-#: ../ex_cmds.c:4384
-msgid "1 match"
-msgstr "1 pasuje"
-
-#: ../ex_cmds.c:4384
-msgid "1 substitution"
-msgstr "1 podstawienie "
-
-#: ../ex_cmds.c:4387
-#, c-format
-msgid "%<PRId64> matches"
-msgstr "%<PRId64> dopasowa๑"
-
-#: ../ex_cmds.c:4388
-#, c-format
-msgid "%<PRId64> substitutions"
-msgstr "%<PRId64> podstawie๑"
-
-#: ../ex_cmds.c:4392
-msgid " on 1 line"
-msgstr " w 1 wierszu"
-
-#: ../ex_cmds.c:4395
-#, c-format
-msgid " on %<PRId64> lines"
-msgstr " w %<PRId64> wierszach"
-
-#: ../ex_cmds.c:4438
-msgid "E147: Cannot do :global recursive"
-msgstr "E147: Nie mog๊ wykonaๆ :global rekursywnie"
-
-#: ../ex_cmds.c:4467
-msgid "E148: Regular expression missing from global"
-msgstr "E148: Brak wzorca regularnego w :global"
-
-# c-format
-#: ../ex_cmds.c:4508
-#, c-format
-msgid "Pattern found in every line: %s"
-msgstr "Wzorzec znaleziono w kaฟdym wierszu: %s"
-
-#: ../ex_cmds.c:4510
-#, c-format
-msgid "Pattern not found: %s"
-msgstr "Nie znaleziono wzorca: %s"
-
-#: ../ex_cmds.c:4587
-msgid ""
-"\n"
-"# Last Substitute String:\n"
-"$"
-msgstr ""
-"\n"
-"# Ostatni podstawiany ciนg:\n"
-"$"
-
-#: ../ex_cmds.c:4679
-msgid "E478: Don't panic!"
-msgstr "E478: Nie panikuj!"
-
-#: ../ex_cmds.c:4717
-#, c-format
-msgid "E661: Sorry, no '%s' help for %s"
-msgstr "E661: Przykro mi, brak '%s' pomocy dla %s"
-
-#: ../ex_cmds.c:4719
-#, c-format
-msgid "E149: Sorry, no help for %s"
-msgstr "E149: Przykro mi, ale brak pomocy o %s"
-
-#: ../ex_cmds.c:4751
-#, c-format
-msgid "Sorry, help file \"%s\" not found"
-msgstr "Przykro mi, nie ma pliku pomocy \"%s\""
-
-#: ../ex_cmds.c:5323
-#, c-format
-msgid "E150: Not a directory: %s"
-msgstr "E150: Nie jest katalogiem: %s"
-
-#: ../ex_cmds.c:5446
-#, c-format
-msgid "E152: Cannot open %s for writing"
-msgstr "E152: Nie mog๊ otworzyๆ %s do zapisu"
-
-#: ../ex_cmds.c:5471
-#, c-format
-msgid "E153: Unable to open %s for reading"
-msgstr "E153: Nie mog๊ otworzyๆ %s do odczytu"
-
-#: ../ex_cmds.c:5500
-#, c-format
-msgid "E670: Mix of help file encodings within a language: %s"
-msgstr "E670: Mieszanka kodowa๑ w pliku pomocy w ramach j๊zyka: %s"
-
-#: ../ex_cmds.c:5565
-#, c-format
-msgid "E154: Duplicate tag \"%s\" in file %s/%s"
-msgstr "E154: Powt๓rzony znacznik \"%s\" w pliku %s/%s"
-
-#: ../ex_cmds.c:5687
-#, c-format
-msgid "E160: Unknown sign command: %s"
-msgstr "E160: Nieznana komenda znaku: %s"
-
-#: ../ex_cmds.c:5704
-msgid "E156: Missing sign name"
-msgstr "E156: Brak nazwy znaku"
-
-#: ../ex_cmds.c:5746
-msgid "E612: Too many signs defined"
-msgstr "E612: Zbyt wiele nazw znak๓w"
-
-#: ../ex_cmds.c:5813
-#, c-format
-msgid "E239: Invalid sign text: %s"
-msgstr "E239: Niewณaœciwy tekst znaku: %s"
-
-#: ../ex_cmds.c:5844 ../ex_cmds.c:6035
-#, c-format
-msgid "E155: Unknown sign: %s"
-msgstr "E155: Nieznany znak: %s"
-
-#: ../ex_cmds.c:5877
-msgid "E159: Missing sign number"
-msgstr "E159: Brak numeru znaku"
-
-#: ../ex_cmds.c:5971
-#, c-format
-msgid "E158: Invalid buffer name: %s"
-msgstr "E158: Niewณaœciwa nazwa bufora: %s"
-
-#: ../ex_cmds.c:6008
-#, c-format
-msgid "E157: Invalid sign ID: %<PRId64>"
-msgstr "E157: Niewณaœciwe ID znaku: %<PRId64>"
-
-#: ../ex_cmds.c:6066
-msgid " (not supported)"
-msgstr "(nie wspomagane)"
-
-#: ../ex_cmds.c:6169
-msgid "[Deleted]"
-msgstr "[Skasowano]"
-
-#: ../ex_cmds2.c:139
-msgid "Entering Debug mode. Type \"cont\" to continue."
-msgstr "Wchodz๊ w tryb odpluskwiania. WprowadŸ \"cont\" aby kontynuowaๆ."
-
-#: ../ex_cmds2.c:143 ../ex_docmd.c:759
-#, c-format
-msgid "line %<PRId64>: %s"
-msgstr "wiersz %<PRId64>: %s"
-
-#: ../ex_cmds2.c:145
-#, c-format
-msgid "cmd: %s"
-msgstr "cmd: %s"
-
-#: ../ex_cmds2.c:322
-#, c-format
-msgid "Breakpoint in \"%s%s\" line %<PRId64>"
-msgstr "Punkt kontrolny w \"%s%s\" wiersz %<PRId64>"
-
-#: ../ex_cmds2.c:581
-#, c-format
-msgid "E161: Breakpoint not found: %s"
-msgstr "E161: Nie znaleziono punktu kontrolnego: %s"
-
-#: ../ex_cmds2.c:611
-msgid "No breakpoints defined"
-msgstr "Nie okreœlono ฟadnych punkt๓w kontrolnych"
-
-#: ../ex_cmds2.c:617
-#, c-format
-msgid "%3d %s %s line %<PRId64>"
-msgstr "%3d %s %s wiersz %<PRId64>"
-
-#: ../ex_cmds2.c:942
-msgid "E750: First use \":profile start {fname}\""
-msgstr "E750: Pierwsze uฟycie \":profile start {fname}\""
-
-#: ../ex_cmds2.c:1269
-#, c-format
-msgid "Save changes to \"%s\"?"
-msgstr "Zachowaๆ zmiany w \"%s\"?"
-
-#: ../ex_cmds2.c:1271 ../ex_docmd.c:8851
-msgid "Untitled"
-msgstr "Bez Tytuณu"
-
-#: ../ex_cmds2.c:1421
-#, c-format
-msgid "E162: No write since last change for buffer \"%s\""
-msgstr "E162: Nie zapisano zmian w buforze \"%s\""
-
-#: ../ex_cmds2.c:1480
-msgid "Warning: Entered other buffer unexpectedly (check autocommands)"
-msgstr "OSTRZEฏENIE: Nieoczekiwane wejœcie w inny bufor (sprawdŸ autokomendy)"
-
-#: ../ex_cmds2.c:1826
-msgid "E163: There is only one file to edit"
-msgstr "E163: Tylko jeden plik w edycji"
-
-#: ../ex_cmds2.c:1828
-msgid "E164: Cannot go before first file"
-msgstr "E164: Nie moฟna przejœๆ przed pierwszy plik"
-
-#: ../ex_cmds2.c:1830
-msgid "E165: Cannot go beyond last file"
-msgstr "E165: Nie moฟna przejœๆ za ostatni plik"
-
-#: ../ex_cmds2.c:2175
-#, c-format
-msgid "E666: compiler not supported: %s"
-msgstr "E666: nie wspierany kompilator: %s"
-
-#: ../ex_cmds2.c:2257
-#, c-format
-msgid "Searching for \"%s\" in \"%s\""
-msgstr "Szukanie \"%s\" w \"%s\""
-
-#: ../ex_cmds2.c:2284
-#, c-format
-msgid "Searching for \"%s\""
-msgstr "Szukanie \"%s\""
-
-#: ../ex_cmds2.c:2307
-#, c-format
-msgid "not found in 'runtimepath': \"%s\""
-msgstr "nie znaleziono w 'runtimepath': \"%s\""
-
-#: ../ex_cmds2.c:2472
-#, c-format
-msgid "Cannot source a directory: \"%s\""
-msgstr "Nie moฟna wczytaๆ katalogu: \"%s\""
-
-#: ../ex_cmds2.c:2518
-#, c-format
-msgid "could not source \"%s\""
-msgstr "nie mogณem wczytaๆ \"%s\""
-
-#: ../ex_cmds2.c:2520
-#, c-format
-msgid "line %<PRId64>: could not source \"%s\""
-msgstr "wiersz: %<PRId64> nie mogณem wczytaๆ \"%s\""
-
-#: ../ex_cmds2.c:2535
-#, c-format
-msgid "sourcing \"%s\""
-msgstr "wczytywanie \"%s\""
-
-#: ../ex_cmds2.c:2537
-#, c-format
-msgid "line %<PRId64>: sourcing \"%s\""
-msgstr "wiersz %<PRId64>: wczytywanie \"%s\""
-
-#: ../ex_cmds2.c:2693
-#, c-format
-msgid "finished sourcing %s"
-msgstr "sko๑czono wczytywanie %s"
-
-#: ../ex_cmds2.c:2765
-msgid "modeline"
-msgstr "modeline"
-
-#: ../ex_cmds2.c:2767
-msgid "--cmd argument"
-msgstr "--cmd argument"
-
-#: ../ex_cmds2.c:2769
-msgid "-c argument"
-msgstr "-c argument"
-
-#: ../ex_cmds2.c:2771
-msgid "environment variable"
-msgstr "zmienna œrodowiskowa"
-
-#: ../ex_cmds2.c:2773
-msgid "error handler"
-msgstr "obsณuga bณ๊du"
-
-#: ../ex_cmds2.c:3020
-msgid "W15: Warning: Wrong line separator, ^M may be missing"
-msgstr "W15: OSTRZEฏENIE: Niewณaœciwy separator wierszy, pewnie brak ^M"
-
-#: ../ex_cmds2.c:3139
-msgid "E167: :scriptencoding used outside of a sourced file"
-msgstr "E167: uฟyto :scriptencoding poza wczytywanym plikiem"
-
-#: ../ex_cmds2.c:3166
-msgid "E168: :finish used outside of a sourced file"
-msgstr "E168: uฟyto :finish poza wczytywanym plikiem"
-
-#: ../ex_cmds2.c:3389
-#, c-format
-msgid "Current %slanguage: \"%s\""
-msgstr "Bieฟนcy %sj๊zyk: \"%s\""
-
-#: ../ex_cmds2.c:3404
-#, c-format
-msgid "E197: Cannot set language to \"%s\""
-msgstr "E197: Nie mog๊ ustawiๆ j๊zyka na \"%s\""
-
-#. don't redisplay the window
-#. don't wait for return
-#: ../ex_docmd.c:387
-msgid "Entering Ex mode. Type \"visual\" to go to Normal mode."
-msgstr "Wchodz๊ w tryb Ex. WprowadŸ \"visual\" aby przejœๆ do trybu Normal."
-
-#: ../ex_docmd.c:428
-msgid "E501: At end-of-file"
-msgstr "E501: Na ko๑cu pliku"
-
-#: ../ex_docmd.c:513
-msgid "E169: Command too recursive"
-msgstr "E169: Komenda zbyt rekursywna"
-
-#: ../ex_docmd.c:1006
-#, c-format
-msgid "E605: Exception not caught: %s"
-msgstr "E605: Nie znaleziono wyjนtku: %s"
-
-#: ../ex_docmd.c:1085
-msgid "End of sourced file"
-msgstr "Koniec wczytywanego pliku"
-
-#: ../ex_docmd.c:1086
-msgid "End of function"
-msgstr "Koniec funkcji"
-
-#: ../ex_docmd.c:1628
-msgid "E464: Ambiguous use of user-defined command"
-msgstr ""
-"E464: Niejednoznaczne zastosowanie komendy zdefiniowanej przez uฟytkownika"
-
-#: ../ex_docmd.c:1638
-msgid "E492: Not an editor command"
-msgstr "E492: Nie jest komendน edytora"
-
-#: ../ex_docmd.c:1729
-msgid "E493: Backwards range given"
-msgstr "E493: Dano wsteczny zakres"
-
-#: ../ex_docmd.c:1733
-msgid "Backwards range given, OK to swap"
-msgstr "Dano wsteczny zakres; zamiana jest moฟliwa"
-
-#. append
-#. typed wrong
-#: ../ex_docmd.c:1787
-msgid "E494: Use w or w>>"
-msgstr "E494: Stosuj w lub w>>"
-
-#: ../ex_docmd.c:3454
-msgid "E319: The command is not available in this version"
-msgstr "E319: Przykro mi, ale ta komenda nie jest dost๊pna w tej wersji"
-
-#: ../ex_docmd.c:3752
-msgid "E172: Only one file name allowed"
-msgstr "E172: Tylko pojedyncza nazwa pliku dozwolona"
-
-#: ../ex_docmd.c:4238
-msgid "1 more file to edit. Quit anyway?"
-msgstr "1 wi๊cej plik do edycji. Mimo to wyjœๆ?"
-
-#: ../ex_docmd.c:4242
-#, c-format
-msgid "%d more files to edit. Quit anyway?"
-msgstr "jeszcze %d plik๓w do edycji. Mimo to wyjœๆ?"
-
-#: ../ex_docmd.c:4248
-msgid "E173: 1 more file to edit"
-msgstr "E173: 1 wi๊cej plik do edycji"
-
-#: ../ex_docmd.c:4250
-#, c-format
-msgid "E173: %<PRId64> more files to edit"
-msgstr "E173: jeszcze %<PRId64> plik๓w do edycji"
-
-#: ../ex_docmd.c:4320
-msgid "E174: Command already exists: add ! to replace it"
-msgstr "E174: Komenda juฟ istnieje; aby jน przedefiniowaๆ stosuj !"
-
-#: ../ex_docmd.c:4432
-msgid ""
-"\n"
-" Name Args Range Complete Definition"
-msgstr ""
-"\n"
-" Nazwa Arg. Zak. Gotowoœๆ Definicja"
-
-#: ../ex_docmd.c:4516
-msgid "No user-defined commands found"
-msgstr "Nie znaleziono komend zdefiniowanych przez uฟytkownika"
-
-#: ../ex_docmd.c:4538
-msgid "E175: No attribute specified"
-msgstr "E175: Nie okreœlono atrybutu"
-
-#: ../ex_docmd.c:4583
-msgid "E176: Invalid number of arguments"
-msgstr "E176: Niewณaœciwa iloœๆ argument๓w"
-
-#: ../ex_docmd.c:4594
-msgid "E177: Count cannot be specified twice"
-msgstr "E177: Mnoฟnik nie moฟe byๆ podany dwukrotnie"
-
-#: ../ex_docmd.c:4603
-msgid "E178: Invalid default value for count"
-msgstr "E178: Niewณaœciwa domyœlna wartoœๆ mnoฟnika"
-
-#: ../ex_docmd.c:4625
-msgid "E179: argument required for -complete"
-msgstr "E179: -complete wymaga argumentu"
-
-#: ../ex_docmd.c:4635
-#, c-format
-msgid "E181: Invalid attribute: %s"
-msgstr "E181: Niewณaœciwy atrybut: %s"
-
-#: ../ex_docmd.c:4678
-msgid "E182: Invalid command name"
-msgstr "E182: Niewณaœciwa nazwa komendy"
-
-#: ../ex_docmd.c:4691
-msgid "E183: User defined commands must start with an uppercase letter"
-msgstr ""
-"E183: Komendy zdefiniowane przez uฟytkownika muszน rozpoczynaๆ si๊ duฟน "
-"literน"
-
-#: ../ex_docmd.c:4696
-msgid "E841: Reserved name, cannot be used for user defined command"
-msgstr "E841: Nazwa zastrzeฟona, nie moฟna jej uฟyๆ w komendzie uฟytkownika"
-
-#: ../ex_docmd.c:4751
-#, c-format
-msgid "E184: No such user-defined command: %s"
-msgstr "E184: Nie ma takiej komendy uฟytkownika: %s"
-
-#: ../ex_docmd.c:5219
-#, c-format
-msgid "E180: Invalid complete value: %s"
-msgstr "E180: Niewณaœciwa wartoœๆ dopeณniania: %s"
-
-#: ../ex_docmd.c:5225
-msgid "E468: Completion argument only allowed for custom completion"
-msgstr ""
-"E468: Argument depeณniania dozwolony wyณนcznie dla dopeณniania uฟytkownika"
-
-#: ../ex_docmd.c:5231
-msgid "E467: Custom completion requires a function argument"
-msgstr "E467: Dopeณnianie uฟytkownika wymaga funkcji jako argumentu"
-
-#: ../ex_docmd.c:5257
-#, c-format
-msgid "E185: Cannot find color scheme '%s'"
-msgstr "E185: Nie mog๊ znaleŸๆ zestawu kolor๓w '%s'"
-
-#: ../ex_docmd.c:5263
-msgid "Greetings, Vim user!"
-msgstr "Witaj uฟytkowniku Vima!"
-
-#: ../ex_docmd.c:5431
-msgid "E784: Cannot close last tab page"
-msgstr "E784: Nie mog๊ zamknนๆ ostatniej karty"
-
-#: ../ex_docmd.c:5462
-msgid "Already only one tab page"
-msgstr "Jest juฟ tylko jedna karta"
-
-#: ../ex_docmd.c:6004
-#, c-format
-msgid "Tab page %d"
-msgstr "Karta %d"
-
-#: ../ex_docmd.c:6295
-msgid "No swap file"
-msgstr "Brak pliku wymiany"
-
-#: ../ex_docmd.c:6478
-msgid "E747: Cannot change directory, buffer is modified (add ! to override)"
-msgstr ""
-"E747: Nie mog๊ zmieniๆ katalogu, bufor zostaณ zmodyfikowany (dodaj ! aby "
-"wymusiๆ)"
-
-#: ../ex_docmd.c:6485
-msgid "E186: No previous directory"
-msgstr "E186: Nie ma poprzedniego katalogu"
-
-#: ../ex_docmd.c:6530
-msgid "E187: Unknown"
-msgstr "E187: Nieznany"
-
-#: ../ex_docmd.c:6610
-msgid "E465: :winsize requires two number arguments"
-msgstr "E465: :winsize wymaga dw๓ch argument๓w numerycznych"
-
-#: ../ex_docmd.c:6655
-msgid "E188: Obtaining window position not implemented for this platform"
-msgstr ""
-"E188: Pozyskiwanie pozycji okna nie jest zaimplementowane dla tego systemu"
-
-#: ../ex_docmd.c:6662
-msgid "E466: :winpos requires two number arguments"
-msgstr "E466: :winpos wymaga dw๓ch argument๓w numerycznych"
-
-#: ../ex_docmd.c:7241
-#, c-format
-msgid "E739: Cannot create directory: %s"
-msgstr "E739: Nie mog๊ utworzyๆ katalogu: %s"
-
-#: ../ex_docmd.c:7268
-#, c-format
-msgid "E189: \"%s\" exists (add ! to override)"
-msgstr "E189: \"%s\" istnieje (wymuœ poprzez !)"
-
-#: ../ex_docmd.c:7273
-#, c-format
-msgid "E190: Cannot open \"%s\" for writing"
-msgstr "E190: Nie mog๊ otworzyๆ \"%s\" do zapisu"
-
-#. set mark
-#: ../ex_docmd.c:7294
-msgid "E191: Argument must be a letter or forward/backward quote"
-msgstr "E191: Argument musi byๆ literน albo cudzysณowem w prz๓d/tyณ"
-
-#: ../ex_docmd.c:7333
-msgid "E192: Recursive use of :normal too deep"
-msgstr "E192: Rekursywne zastosowanie :normal za gณ๊bokie"
-
-#: ../ex_docmd.c:7807
-msgid "E194: No alternate file name to substitute for '#'"
-msgstr "E194: Brak nazwy zamiennego pliku do podstawienia pod '#'"
-
-#: ../ex_docmd.c:7841
-msgid "E495: no autocommand file name to substitute for \"<afile>\""
-msgstr "E495: brak nazwy pliku autokomend do podstawienia pod \"<afile>\""
-
-#: ../ex_docmd.c:7850
-msgid "E496: no autocommand buffer number to substitute for \"<abuf>\""
-msgstr "E496: brak numeru bufora autokomend do podstawienia pod \"<abuf>\""
-
-#: ../ex_docmd.c:7861
-msgid "E497: no autocommand match name to substitute for \"<amatch>\""
-msgstr "E497: brak nazwy dopasowania autokomend pod \"<amatch>\""
-
-#: ../ex_docmd.c:7870
-msgid "E498: no :source file name to substitute for \"<sfile>\""
-msgstr "E498: brak nazwy pliku :source do postawienia pod \"<sfile>\""
-
-#: ../ex_docmd.c:7876
-msgid "E842: no line number to use for \"<slnum>\""
-msgstr "E842: brak numeru linii by uฟyๆ z \"<slnum>\""
-
-#: ../ex_docmd.c:7903
-#, fuzzy, c-format
-msgid "E499: Empty file name for '%' or '#', only works with \":p:h\""
-msgstr "E499: Pusta nazwa pliku dla '%' lub '#', dziaณa tylko z \":p:h\""
-
-#: ../ex_docmd.c:7905
-msgid "E500: Evaluates to an empty string"
-msgstr "E500: Wynikiem jest pusty ciนg"
-
-#: ../ex_docmd.c:8838
-msgid "E195: Cannot open viminfo file for reading"
-msgstr "E195: Nie mog๊ otworzyๆ pliku viminfo do odczytu"
-
-#: ../ex_eval.c:464
-msgid "E608: Cannot :throw exceptions with 'Vim' prefix"
-msgstr "E608: Nie moฟna ':throw' wyjนtk๓w z prefiksem 'Vim'"
-
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:496
-#, c-format
-msgid "Exception thrown: %s"
-msgstr "Wyjนtek: %s"
-
-#: ../ex_eval.c:545
-#, c-format
-msgid "Exception finished: %s"
-msgstr "Wyjนtek zako๑czony: %s"
-
-#: ../ex_eval.c:546
-#, c-format
-msgid "Exception discarded: %s"
-msgstr "Wyjนtek odrzucony: %s"
-
-#: ../ex_eval.c:588 ../ex_eval.c:634
-#, c-format
-msgid "%s, line %<PRId64>"
-msgstr "%s, wiersz %<PRId64>"
-
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:608
-#, c-format
-msgid "Exception caught: %s"
-msgstr "Wyjนtek przechwycony: %s"
-
-#: ../ex_eval.c:676
-#, c-format
-msgid "%s made pending"
-msgstr "%s zostaณ zawieszony"
-
-#: ../ex_eval.c:679
-#, c-format
-msgid "%s resumed"
-msgstr "%s przywr๓cony"
-
-#: ../ex_eval.c:683
-#, c-format
-msgid "%s discarded"
-msgstr "%s odrzucony"
-
-#: ../ex_eval.c:708
-msgid "Exception"
-msgstr "Wyjนtek"
-
-#: ../ex_eval.c:713
-msgid "Error and interrupt"
-msgstr "Bณนd i przerwanie"
-
-#: ../ex_eval.c:715
-msgid "Error"
-msgstr "Bณนd"
-
-#. if (pending & CSTP_INTERRUPT)
-#: ../ex_eval.c:717
-msgid "Interrupt"
-msgstr "Przerwanie"
-
-#: ../ex_eval.c:795
-msgid "E579: :if nesting too deep"
-msgstr "E579: zbyt gณ๊bokie zagnieฟdฟenie :if"
-
-#: ../ex_eval.c:830
-msgid "E580: :endif without :if"
-msgstr "E580: :endif bez :if"
-
-#: ../ex_eval.c:873
-msgid "E581: :else without :if"
-msgstr "E581: :else bez :if"
-
-#: ../ex_eval.c:876
-msgid "E582: :elseif without :if"
-msgstr "E582: :elseif bez :if"
-
-#: ../ex_eval.c:880
-msgid "E583: multiple :else"
-msgstr "E583: wielokrotne :else"
-
-#: ../ex_eval.c:883
-msgid "E584: :elseif after :else"
-msgstr "E584: :elseif po :else"
-
-#: ../ex_eval.c:941
-msgid "E585: :while/:for nesting too deep"
-msgstr "E585: zbyt gณ๊bokie zagnieฟdฟenie :while/:for"
-
-#: ../ex_eval.c:1028
-msgid "E586: :continue without :while or :for"
-msgstr "E586: :continue bez :while lub :for"
-
-#: ../ex_eval.c:1061
-msgid "E587: :break without :while or :for"
-msgstr "E587: :break bez :while lub :for"
-
-#: ../ex_eval.c:1102
-msgid "E732: Using :endfor with :while"
-msgstr "E732: Uฟycie :endfor z :while"
-
-#: ../ex_eval.c:1104
-msgid "E733: Using :endwhile with :for"
-msgstr "E733: Uฟycie :endwhile z :for"
-
-#: ../ex_eval.c:1247
-msgid "E601: :try nesting too deep"
-msgstr "E601: zbyt gณ๊bokie zagnieฟdฟenie :try"
-
-#: ../ex_eval.c:1317
-msgid "E603: :catch without :try"
-msgstr "E603: :catch bez :try"
-
-#. Give up for a ":catch" after ":finally" and ignore it.
-#. * Just parse.
-#: ../ex_eval.c:1332
-msgid "E604: :catch after :finally"
-msgstr "E604: :catch za :finally"
-
-#: ../ex_eval.c:1451
-msgid "E606: :finally without :try"
-msgstr "E606: :finally bez :try"
-
-#. Give up for a multiple ":finally" and ignore it.
-#: ../ex_eval.c:1467
-msgid "E607: multiple :finally"
-msgstr "E607: wielokrotne :finally"
-
-#: ../ex_eval.c:1571
-msgid "E602: :endtry without :try"
-msgstr "E602: :endtry bez :try"
-
-#: ../ex_eval.c:2026
-msgid "E193: :endfunction not inside a function"
-msgstr "E193: :endfunction poza funkcjน"
-
-#: ../ex_getln.c:1643
-msgid "E788: Not allowed to edit another buffer now"
-msgstr "E788: Nie moฟna teraz edytowaๆ innego bufora"
-
-#: ../ex_getln.c:1656
-msgid "E811: Not allowed to change buffer information now"
-msgstr "E811: Nie moฟna teraz zmieniaๆ informacji o buforze"
-
-#: ../ex_getln.c:3178
-msgid "tagname"
-msgstr "nazwa znacznika"
-
-#: ../ex_getln.c:3181
-msgid " kind file\n"
-msgstr " pokrewny plik\n"
-
-#: ../ex_getln.c:4799
-msgid "'history' option is zero"
-msgstr "opcja 'history' jest zerowa"
-
-#: ../ex_getln.c:5046
-#, c-format
-msgid ""
-"\n"
-"# %s History (newest to oldest):\n"
-msgstr ""
-"\n"
-"# %s Historia (od najnowszych po najstarsze):\n"
-
-#: ../ex_getln.c:5047
-msgid "Command Line"
-msgstr "Wiersz polece๑"
-
-#: ../ex_getln.c:5048
-msgid "Search String"
-msgstr "Szukany ciนg"
-
-#: ../ex_getln.c:5049
-msgid "Expression"
-msgstr "Wyraฟenie"
-
-#: ../ex_getln.c:5050
-msgid "Input Line"
-msgstr "Wiersz wprowadze๑"
-
-#: ../ex_getln.c:5117
-msgid "E198: cmd_pchar beyond the command length"
-msgstr "E198: cmd_pchar przekracza dณugoœๆ polecenia"
-
-#: ../ex_getln.c:5279
-msgid "E199: Active window or buffer deleted"
-msgstr "E199: Aktywny widok lub bufor skasowany"
-
-#: ../file_search.c:203
-msgid "E854: path too long for completion"
-msgstr "E854: œcieฟka za dณuga by uzupeณniๆ"
-
-#: ../file_search.c:446
-#, c-format
-msgid ""
-"E343: Invalid path: '**[number]' must be at the end of the path or be "
-"followed by '%s'."
-msgstr ""
-"E343: Niewณaœciwy trop: '**[numer]' musi byๆ na ko๑cu tropu lub po nim musi "
-"byๆ '%s'."
-
-#: ../file_search.c:1505
-#, c-format
-msgid "E344: Can't find directory \"%s\" in cdpath"
-msgstr "E344: Nie mog๊ znaleŸๆ katalogu \"%s\" w cdpath"
-
-#: ../file_search.c:1508
-#, c-format
-msgid "E345: Can't find file \"%s\" in path"
-msgstr "E345: Nie mog๊ znaleŸๆ pliku \"%s\" w tropie"
-
-#: ../file_search.c:1512
-#, c-format
-msgid "E346: No more directory \"%s\" found in cdpath"
-msgstr "E346: Katalogu \"%s\" nie ma wi๊cej w cdpath"
-
-#: ../file_search.c:1515
-#, c-format
-msgid "E347: No more file \"%s\" found in path"
-msgstr "E347: Pliku \"%s\" nie ma wi๊cej w tropie"
-
-#: ../fileio.c:137
-msgid "E812: Autocommands changed buffer or buffer name"
-msgstr "E812: Autokomendy zmieniณy bufor lub jego nazw๊"
-
-#: ../fileio.c:368
-msgid "Illegal file name"
-msgstr "Niedopuszczalna nazwa pliku"
-
-#: ../fileio.c:395 ../fileio.c:476 ../fileio.c:2543 ../fileio.c:2578
-msgid "is a directory"
-msgstr "jest katalogiem"
-
-#: ../fileio.c:397
-msgid "is not a file"
-msgstr "nie jest plikiem"
-
-#: ../fileio.c:508 ../fileio.c:3522
-msgid "[New File]"
-msgstr "[Nowy Plik]"
-
-#: ../fileio.c:511
-msgid "[New DIRECTORY]"
-msgstr "[Nowy KATALOG]"
-
-#: ../fileio.c:529 ../fileio.c:532
-msgid "[File too big]"
-msgstr "[Za duฟy plik]"
-
-#: ../fileio.c:534
-msgid "[Permission Denied]"
-msgstr "[Nie dozwolono]"
-
-#: ../fileio.c:653
-msgid "E200: *ReadPre autocommands made the file unreadable"
-msgstr "E200: Autokomendy *ReadPre zrobiณy plik nieodczytywalnym"
-
-#: ../fileio.c:655
-msgid "E201: *ReadPre autocommands must not change current buffer"
-msgstr "E201: Autokomendy *ReadPre nie mogน zmieniaๆ bieฟนcego bufora"
-
-#: ../fileio.c:672
-msgid "Nvim: Reading from stdin...\n"
-msgstr "Vim: Wczytywanie ze stdin...\n"
-
-#. Re-opening the original file failed!
-#: ../fileio.c:909
-msgid "E202: Conversion made file unreadable!"
-msgstr "E202: Nie moฟna otworzyๆ pliku utworzonego przez przemian๊!"
-
-#. fifo or socket
-#: ../fileio.c:1782
-msgid "[fifo/socket]"
-msgstr "[fifo/socket]"
-
-#. fifo
-#: ../fileio.c:1788
-msgid "[fifo]"
-msgstr "[fifo]"
-
-#. or socket
-#: ../fileio.c:1794
-msgid "[socket]"
-msgstr "[socket]"
-
-#. or character special
-#: ../fileio.c:1801
-msgid "[character special]"
-msgstr "[specjalny znak]"
-
-#: ../fileio.c:1815
-msgid "[CR missing]"
-msgstr "[brak CR]'"
-
-#: ../fileio.c:1819
-msgid "[long lines split]"
-msgstr "[dณugie wiersze rozdzielane]"
-
-#: ../fileio.c:1823 ../fileio.c:3512
-msgid "[NOT converted]"
-msgstr "[NIE przemienione]"
-
-#: ../fileio.c:1826 ../fileio.c:3515
-msgid "[converted]"
-msgstr "[przemienione]"
-
-#: ../fileio.c:1831
-#, c-format
-msgid "[CONVERSION ERROR in line %<PRId64>]"
-msgstr "[BฃฅD W PRZEMIANIE w linii %<PRId64>]"
-
-#: ../fileio.c:1835
-#, c-format
-msgid "[ILLEGAL BYTE in line %<PRId64>]"
-msgstr "[NIEDOZWOLONY BAJT w wierszu %<PRId64>]"
-
-#: ../fileio.c:1838
-msgid "[READ ERRORS]"
-msgstr "[BฃสDY W ODCZYCIE]"
-
-#: ../fileio.c:2104
-msgid "Can't find temp file for conversion"
-msgstr "Nie mog๊ znaleŸๆ pliku tymczasowego w celu przemiany"
-
-#: ../fileio.c:2110
-msgid "Conversion with 'charconvert' failed"
-msgstr "Nieudana przemiana z 'charconvert'"
-
-#: ../fileio.c:2113
-msgid "can't read output of 'charconvert'"
-msgstr "nie mog๊ odczytaๆ wyjœcia z 'charconvert'"
-
-#: ../fileio.c:2437
-msgid "E676: No matching autocommands for acwrite buffer"
-msgstr "E676: Brak pasujนcych autokomend dla bufora acwrite"
-
-#: ../fileio.c:2466
-msgid "E203: Autocommands deleted or unloaded buffer to be written"
-msgstr ""
-"E203: Autokomendy skasowaณy lub wyณadowaณy bufor przeznaczony do zapisu"
-
-#: ../fileio.c:2486
-msgid "E204: Autocommand changed number of lines in unexpected way"
-msgstr "E204: Autokomenda zmieniณa liczb๊ wierszy w nieoczekiwany spos๓b"
-
-#: ../fileio.c:2548 ../fileio.c:2565
-msgid "is not a file or writable device"
-msgstr "nie jest plikiem lub zapisywalnym przyrzนdem"
-
-#: ../fileio.c:2601
-msgid "is read-only (add ! to override)"
-msgstr "jest tylko do odczytu (wymuœ poprzez !)"
-
-#: ../fileio.c:2886
-msgid "E506: Can't write to backup file (add ! to override)"
-msgstr "E506: Nie mog๊ zapisaๆ do pliku zabezpieczenia (wymuœ przez !)"
-
-#: ../fileio.c:2898
-msgid "E507: Close error for backup file (add ! to override)"
-msgstr "E507: Bณนd podczas zamykania pliku zabezpieczenia (wymuœ przez !)"
-
-#: ../fileio.c:2901
-msgid "E508: Can't read file for backup (add ! to override)"
-msgstr "E508: Nie mog๊ odczytaๆ pliku w celu zabezpieczenia (wymuœ przez !)"
-
-#: ../fileio.c:2923
-msgid "E509: Cannot create backup file (add ! to override)"
-msgstr "E509: Nie mog๊ stworzyๆ pliku zabezpieczenia (wymuœ przez !)"
-
-#: ../fileio.c:3008
-msgid "E510: Can't make backup file (add ! to override)"
-msgstr "E510: Nie mog๊ zrobiๆ pliku zabezpieczenia (wymuœ przez !)"
-
-#. Can't write without a tempfile!
-#: ../fileio.c:3121
-msgid "E214: Can't find temp file for writing"
-msgstr "E214: Nie mog๊ znaleŸๆ pliku tymczasowego do zapisania"
-
-#: ../fileio.c:3134
-msgid "E213: Cannot convert (add ! to write without conversion)"
-msgstr "E213: Nie mog๊ przemieniๆ (uฟyj ! by zapisaๆ bez przemiany)"
-
-#: ../fileio.c:3169
-msgid "E166: Can't open linked file for writing"
-msgstr "E166: Nie mog๊ otworzyๆ podณนczonego pliku do zapisu"
-
-#: ../fileio.c:3173
-msgid "E212: Can't open file for writing"
-msgstr "E212: Nie mog๊ otworzyๆ pliku do zapisu"
-
-#: ../fileio.c:3363
-msgid "E667: Fsync failed"
-msgstr "E667: Fsync nie powi๓dณ si๊"
-
-#: ../fileio.c:3398
-msgid "E512: Close failed"
-msgstr "E512: Zamkni๊cie si๊ nie powiodณo"
-
-#: ../fileio.c:3436
-msgid "E513: write error, conversion failed (make 'fenc' empty to override)"
-msgstr ""
-"E513: Bณนd zapisu, przemiana si๊ nie powiodณa (opr๓ฟnij 'fenc' aby wymusiๆ)"
-
-#: ../fileio.c:3441
-#, c-format
-msgid ""
-"E513: write error, conversion failed in line %<PRId64> (make 'fenc' empty to "
-"override)"
-msgstr ""
-"E513: Bณนd zapisu, przemiana si๊ nie powiodณa w wierszu %<PRId64> (opr๓ฟnij "
-"'fenc' by wymusiๆ)"
-
-#: ../fileio.c:3448
-msgid "E514: write error (file system full?)"
-msgstr "E514: bณนd w zapisie (moฟe system plik๓w jest przepeณniony?)"
-
-#: ../fileio.c:3506
-msgid " CONVERSION ERROR"
-msgstr " BฃฅD W PRZEMIANIE"
-
-#: ../fileio.c:3509
-#, c-format
-msgid " in line %<PRId64>;"
-msgstr " w wierszu %<PRId64>;"
-
-#: ../fileio.c:3519
-msgid "[Device]"
-msgstr "[Urzนdzenie]"
-
-#: ../fileio.c:3522
-msgid "[New]"
-msgstr "[Nowy]"
-
-#: ../fileio.c:3535
-msgid " [a]"
-msgstr " [a]"
-
-#: ../fileio.c:3535
-msgid " appended"
-msgstr " doณนczono"
-
-#: ../fileio.c:3537
-msgid " [w]"
-msgstr " [w]"
-
-#: ../fileio.c:3537
-msgid " written"
-msgstr " zapisano"
-
-#: ../fileio.c:3579
-msgid "E205: Patchmode: can't save original file"
-msgstr "E205: Patchmode: nie mog๊ zapisaๆ oryginalnego pliku"
-
-#: ../fileio.c:3602
-msgid "E206: patchmode: can't touch empty original file"
-msgstr "E206: patchmode: nie mog๊ stworzyๆ pustego oryginalnego pliku"
-
-#: ../fileio.c:3616
-msgid "E207: Can't delete backup file"
-msgstr "E207: Nie mog๊ skasowaๆ pliku zabezpieczenia"
-
-#: ../fileio.c:3672
-msgid ""
-"\n"
-"WARNING: Original file may be lost or damaged\n"
-msgstr ""
-"\n"
-"OSTRZEฏENIE: Oryginalny plik moฟe zostaๆ utracony lub uszkodzony\n"
-
-#: ../fileio.c:3675
-msgid "don't quit the editor until the file is successfully written!"
-msgstr "nie wychodŸ edytora, dop๓ki plik nie zostaณ poprawnie zapisany!"
-
-#: ../fileio.c:3795
-msgid "[dos]"
-msgstr "[dos]"
-
-#: ../fileio.c:3795
-msgid "[dos format]"
-msgstr "[format dos-a]"
-
-#: ../fileio.c:3801
-msgid "[mac]"
-msgstr "[mac]"
-
-#: ../fileio.c:3801
-msgid "[mac format]"
-msgstr "[format maca]"
-
-#: ../fileio.c:3807
-msgid "[unix]"
-msgstr "[unix]"
-
-#: ../fileio.c:3807
-msgid "[unix format]"
-msgstr "[format unixa]"
-
-#: ../fileio.c:3831
-msgid "1 line, "
-msgstr "1 wiersz, "
-
-#: ../fileio.c:3833
-#, c-format
-msgid "%<PRId64> lines, "
-msgstr "%<PRId64> wierszy, "
-
-#: ../fileio.c:3836
-msgid "1 character"
-msgstr "1 znak"
-
-#: ../fileio.c:3838
-#, c-format
-msgid "%<PRId64> characters"
-msgstr "%<PRId64> znak๓w"
-
-#: ../fileio.c:3849
-msgid "[noeol]"
-msgstr "[noeol]"
-
-#: ../fileio.c:3849
-msgid "[Incomplete last line]"
-msgstr "[Niekompletny ostatni wiersz]"
-
-#. don't overwrite messages here
-#. must give this prompt
-#. don't use emsg() here, don't want to flush the buffers
-#: ../fileio.c:3865
-msgid "WARNING: The file has been changed since reading it!!!"
-msgstr "OSTRZEฏENIE: Plik zmieniณ si๊ od czasu ostatniego odczytu!!!"
-
-#: ../fileio.c:3867
-msgid "Do you really want to write to it"
-msgstr "Czy naprawd๊ chcesz go zapisaๆ"
-
-#: ../fileio.c:4648
-#, c-format
-msgid "E208: Error writing to \"%s\""
-msgstr "E208: Bณนd zapisywania do \"%s\""
-
-#: ../fileio.c:4655
-#, c-format
-msgid "E209: Error closing \"%s\""
-msgstr "E209: Bณนd w trakcie zamykania \"%s\""
-
-#: ../fileio.c:4657
-#, c-format
-msgid "E210: Error reading \"%s\""
-msgstr "E210: Bณนd odczytu \"%s\""
-
-#: ../fileio.c:4883
-msgid "E246: FileChangedShell autocommand deleted buffer"
-msgstr "E246: Autokomenda FileChangedShell skasowaณa bufor"
-
-#: ../fileio.c:4894
-#, c-format
-msgid "E211: File \"%s\" no longer available"
-msgstr "E211: Plik \"%s\" nie jest dณuฟej dost๊pny"
-
-#: ../fileio.c:4906
-#, c-format
-msgid ""
-"W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as "
-"well"
-msgstr ""
-"W12: OSTRZEฏENIE: Plik \"%s\" zmieniณ si๊ od czasu rozpocz๊cia edycji, bufor "
-"w Vimie r๓wnieฟ zostaณ zmieniony"
-
-#: ../fileio.c:4907
-msgid "See \":help W12\" for more info."
-msgstr "Zobacz \":help W12\" dla dalszych informacji."
-
-#: ../fileio.c:4910
-#, c-format
-msgid "W11: Warning: File \"%s\" has changed since editing started"
-msgstr "W11: OSTRZEฏENIE: Plik \"%s\" zmieniณ si๊ od czasu rozpocz๊cia edycji"
-
-#: ../fileio.c:4911
-msgid "See \":help W11\" for more info."
-msgstr "Zobacz \":help W11\" dla dalszych informacji."
-
-#: ../fileio.c:4914
-#, c-format
-msgid "W16: Warning: Mode of file \"%s\" has changed since editing started"
-msgstr ""
-"W16: OSTRZEฏENIE: Tryb pliku \"%s\" zmieniณ si๊ od czasu rozpocz๊cia edycji"
-
-#: ../fileio.c:4915
-msgid "See \":help W16\" for more info."
-msgstr "Zobacz \":help W16\" dla dalszych informacji."
-
-#: ../fileio.c:4927
-#, c-format
-msgid "W13: Warning: File \"%s\" has been created after editing started"
-msgstr "W13: OSTRZEฏENIE: Plik \"%s\" zostaณ stworzony po rozpocz๊ciu edycji"
-
-#: ../fileio.c:4947
-msgid "Warning"
-msgstr "OSTRZEฏENIE"
-
-#: ../fileio.c:4948
-msgid ""
-"&OK\n"
-"&Load File"
-msgstr ""
-"&OK\n"
-"&Zaณaduj Plik"
-
-#: ../fileio.c:5065
-#, c-format
-msgid "E462: Could not prepare for reloading \"%s\""
-msgstr "E462: Nie moฟna przygotowaๆ przeณadowania \"%s\""
-
-#: ../fileio.c:5078
-#, c-format
-msgid "E321: Could not reload \"%s\""
-msgstr "E321: Nie moฟna przeณadowaๆ \"%s\""
-
-#: ../fileio.c:5601
-msgid "--Deleted--"
-msgstr "--Skasowano--"
-
-#: ../fileio.c:5732
-#, c-format
-msgid "auto-removing autocommand: %s <buffer=%d>"
-msgstr "auto-usuwanie autokomendy: %s <buffer=%d>"
-
-#. the group doesn't exist
-#: ../fileio.c:5772
-#, c-format
-msgid "E367: No such group: \"%s\""
-msgstr "E367: Nie ma takiej grupy: \"%s\""
-
-#: ../fileio.c:5897
-#, c-format
-msgid "E215: Illegal character after *: %s"
-msgstr "E215: Niedopuszczalny znak po *: %s"
-
-#: ../fileio.c:5905
-#, c-format
-msgid "E216: No such event: %s"
-msgstr "E216: Nie ma takiego wydarzenia: %s"
-
-#: ../fileio.c:5907
-#, c-format
-msgid "E216: No such group or event: %s"
-msgstr "E216: Nie ma takiej grupy lub wydarzenia: %s"
-
-#. Highlight title
-#: ../fileio.c:6090
-msgid ""
-"\n"
-"--- Auto-Commands ---"
-msgstr ""
-"\n"
-"--- Autokomendy ---"
-
-#: ../fileio.c:6293
-#, c-format
-msgid "E680: <buffer=%d>: invalid buffer number "
-msgstr "E680: <buffer=%d>: niewณaœciwy numer bufora"
-
-#: ../fileio.c:6370
-msgid "E217: Can't execute autocommands for ALL events"
-msgstr "E217: Nie moฟna wykonywaๆ autokomend dla wydarze๑ ALL"
-
-#: ../fileio.c:6393
-msgid "No matching autocommands"
-msgstr "Brak pasujนcych autokomend"
-
-#: ../fileio.c:6831
-msgid "E218: autocommand nesting too deep"
-msgstr "E218: zbyt gณ๊bokie zagnieฟdฟenie autokomend"
-
-#: ../fileio.c:7143
-#, c-format
-msgid "%s Auto commands for \"%s\""
-msgstr "%s Autokomend dla \"%s\""
-
-#: ../fileio.c:7149
-#, c-format
-msgid "Executing %s"
-msgstr "Wykonuj๊ %s"
-
-#: ../fileio.c:7211
-#, c-format
-msgid "autocommand %s"
-msgstr "autokomenda %s"
-
-#: ../fileio.c:7795
-msgid "E219: Missing {."
-msgstr "E219: Brak {."
-
-#: ../fileio.c:7797
-msgid "E220: Missing }."
-msgstr "E220: Brak }."
-
-#: ../fold.c:93
-msgid "E490: No fold found"
-msgstr "E490: Nie znaleziono zwini๊cia"
-
-#: ../fold.c:544
-msgid "E350: Cannot create fold with current 'foldmethod'"
-msgstr "E350: Nie moฟna utworzyๆ zwini๊cia przy bieฟนcej 'foldmethod'"
-
-#: ../fold.c:546
-msgid "E351: Cannot delete fold with current 'foldmethod'"
-msgstr "E351: Nie moฟna skasowaๆ zwini๊cia przy bieฟนcej 'foldmethod'"
-
-#: ../fold.c:1784
-#, c-format
-msgid "+--%3ld lines folded "
-msgstr "+--%3ld wierszy zwini๊to "
-
-#. buffer has already been read
-#: ../getchar.c:273
-msgid "E222: Add to read buffer"
-msgstr "E222: Dodaj do bufora odczytu"
-
-#: ../getchar.c:2040
-msgid "E223: recursive mapping"
-msgstr "E223: rekursywne przyporzนdkowanie"
-
-#: ../getchar.c:2849
-#, c-format
-msgid "E224: global abbreviation already exists for %s"
-msgstr "E224: istnieje juฟ globalny skr๓t dla %s"
-
-#: ../getchar.c:2852
-#, c-format
-msgid "E225: global mapping already exists for %s"
-msgstr "E225: istnieje juฟ globalne przyporzนdkowanie dla %s"
-
-#: ../getchar.c:2952
-#, c-format
-msgid "E226: abbreviation already exists for %s"
-msgstr "E226: istnieje juฟ skr๓t dla %s"
-
-#: ../getchar.c:2955
-#, c-format
-msgid "E227: mapping already exists for %s"
-msgstr "E227: istnieje juฟ przyporzนdkowanie dla %s"
-
-#: ../getchar.c:3008
-msgid "No abbreviation found"
-msgstr "Nie znaleziono skr๓tu"
-
-#: ../getchar.c:3010
-msgid "No mapping found"
-msgstr "Nie znaleziono przyporzนdkowania"
-
-#: ../getchar.c:3974
-msgid "E228: makemap: Illegal mode"
-msgstr "E228: makemap: Niedopuszczalny tryb"
-
-#. key value of 'cedit' option
-#. type of cmdline window or 0
-#. result of cmdline window or 0
-#: ../globals.h:924
-msgid "--No lines in buffer--"
-msgstr "--Brak wierszy w buforze--"
-
-#.
-#. * The error messages that can be shared are included here.
-#. * Excluded are errors that are only used once and debugging messages.
-#.
-#: ../globals.h:996
-msgid "E470: Command aborted"
-msgstr "E470: Przerwanie komendy"
-
-#: ../globals.h:997
-msgid "E471: Argument required"
-msgstr "E471: wymagany argument"
-
-#: ../globals.h:998
-msgid "E10: \\ should be followed by /, ? or &"
-msgstr "E10: po \\ powinno byๆ /, ? lub &"
-
-#: ../globals.h:1000
-msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
-msgstr ""
-"E11: Niedozwolone w oknie wiersza polece๑; <CR> wykonuje, CTRL-C opuszcza"
-
-#: ../globals.h:1002
-msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
-msgstr ""
-"E12: Komenda niedozwolona z exrc/vimrc w bieฟนcym szukaniu katalogu lub "
-"znacznika"
-
-#: ../globals.h:1003
-msgid "E171: Missing :endif"
-msgstr "E171: Brak :endif"
-
-#: ../globals.h:1004
-msgid "E600: Missing :endtry"
-msgstr "E600: Brak :endtry"
-
-#: ../globals.h:1005
-msgid "E170: Missing :endwhile"
-msgstr "E170: Brak :endwhile"
-
-#: ../globals.h:1006
-msgid "E170: Missing :endfor"
-msgstr "E170: Brak :endfor"
-
-#: ../globals.h:1007
-msgid "E588: :endwhile without :while"
-msgstr "E588: :endwhile bez :while"
-
-#: ../globals.h:1008
-msgid "E588: :endfor without :for"
-msgstr "E588: :endfor bez :for"
-
-#: ../globals.h:1009
-msgid "E13: File exists (add ! to override)"
-msgstr "E13: Plik istnieje (wymuœ poprzez !)"
-
-#: ../globals.h:1010
-msgid "E472: Command failed"
-msgstr "E472: Komenda nie powiodณa si๊"
-
-#: ../globals.h:1011
-msgid "E473: Internal error"
-msgstr "E473: Bณนd wewn๊trzny"
-
-#: ../globals.h:1012
-msgid "Interrupted"
-msgstr "Przerwane"
-
-#: ../globals.h:1013
-msgid "E14: Invalid address"
-msgstr "E14: Niewณaœciwy adres"
-
-#: ../globals.h:1014
-msgid "E474: Invalid argument"
-msgstr "E474: Niewณaœciwy argument"
-
-#: ../globals.h:1015
-#, c-format
-msgid "E475: Invalid argument: %s"
-msgstr "E475: Niewณaœciwy argument: %s"
-
-#: ../globals.h:1016
-#, c-format
-msgid "E15: Invalid expression: %s"
-msgstr "E15: Niewณaœciwe wyraฟenie: %s"
-
-#: ../globals.h:1017
-msgid "E16: Invalid range"
-msgstr "E16: Niewณaœciwy zakres"
-
-#: ../globals.h:1018
-msgid "E476: Invalid command"
-msgstr "E476: Niewณaœciwa komenda"
-
-#: ../globals.h:1019
-#, c-format
-msgid "E17: \"%s\" is a directory"
-msgstr "E17: \"%s\" jest katalogiem"
-
-#: ../globals.h:1020
-#, fuzzy
-msgid "E900: Invalid job id"
-msgstr "E49: Niewณaœciwa wielkoœๆ przewini๊cia"
-
-#: ../globals.h:1021
-msgid "E901: Job table is full"
-msgstr ""
-
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
-#: ../globals.h:1024
-#, c-format
-msgid "E364: Library call failed for \"%s()\""
-msgstr "E364: Wywoณanie z biblioteki nie powiodณo si๊ dla \"%s()\""
-
-#: ../globals.h:1026
-msgid "E19: Mark has invalid line number"
-msgstr "E19: Zakณadka ma niewณaœciwy numer wiersza"
-
-#: ../globals.h:1027
-msgid "E20: Mark not set"
-msgstr "E20: Zakณadka nienastawiona"
-
-#: ../globals.h:1029
-msgid "E21: Cannot make changes, 'modifiable' is off"
-msgstr "E21: Nie mog๊ wykonaๆ zmian, 'modifiable' jest wyณนczone"
-
-#: ../globals.h:1030
-msgid "E22: Scripts nested too deep"
-msgstr "E22: Zbyt gณ๊bokie zagnieฟdฟenie skrypt๓w"
-
-#: ../globals.h:1031
-msgid "E23: No alternate file"
-msgstr "E23: Brak pliku zamiany"
-
-#: ../globals.h:1032
-msgid "E24: No such abbreviation"
-msgstr "E24: Nie ma takiego skr๓tu"
-
-#: ../globals.h:1033
-msgid "E477: No ! allowed"
-msgstr "E477: Niedozwolone !"
-
-#: ../globals.h:1035
-msgid "E25: Nvim does not have a built-in GUI"
-msgstr "E25: GUI nie moฟe byๆ uฟyte: Nie wณนczono podczas kompilacji"
-
-#: ../globals.h:1036
-#, c-format
-msgid "E28: No such highlight group name: %s"
-msgstr "E28: Brak takiej nazwy grupy podœwietlania: %s"
-
-#: ../globals.h:1037
-msgid "E29: No inserted text yet"
-msgstr "E29: Nie wprowadzono jeszcze ฟadnego tekstu"
-
-#: ../globals.h:1038
-msgid "E30: No previous command line"
-msgstr "E30: Nie ma poprzedniego wiersza polece๑"
-
-#: ../globals.h:1039
-msgid "E31: No such mapping"
-msgstr "E31: Nie ma takiego przyporzนdkowania"
-
-#: ../globals.h:1040
-msgid "E479: No match"
-msgstr "E479: Brak dopasowa๑"
-
-#: ../globals.h:1041
-#, c-format
-msgid "E480: No match: %s"
-msgstr "E480: Brak dopasowa๑: %s"
-
-#: ../globals.h:1042
-msgid "E32: No file name"
-msgstr "E32: Brak nazwy pliku"
-
-#: ../globals.h:1044
-msgid "E33: No previous substitute regular expression"
-msgstr "E33: Brak poprzedniego podstawieniowego wyraฟenia regularnego"
-
-#: ../globals.h:1045
-msgid "E34: No previous command"
-msgstr "E34: Brak poprzedniej komendy"
-
-#: ../globals.h:1046
-msgid "E35: No previous regular expression"
-msgstr "E35: Brak poprzedniego wyraฟenia regularnego"
-
-#: ../globals.h:1047
-msgid "E481: No range allowed"
-msgstr "E481: Zakres niedozwolony"
-
-#: ../globals.h:1048
-msgid "E36: Not enough room"
-msgstr "E36: Brak miejsca"
-
-#: ../globals.h:1049
-#, c-format
-msgid "E482: Can't create file %s"
-msgstr "E482: Nie mog๊ stworzyๆ pliku %s"
-
-#: ../globals.h:1050
-msgid "E483: Can't get temp file name"
-msgstr "E483: Nie mog๊ pobraๆ nazwy pliku tymczasowego"
-
-#: ../globals.h:1051
-#, c-format
-msgid "E484: Can't open file %s"
-msgstr "E484: Nie mog๊ otworzyๆ pliku %s"
-
-#: ../globals.h:1052
-#, c-format
-msgid "E485: Can't read file %s"
-msgstr "E485: Nie mog๊ odczytaๆ pliku %s"
-
-#: ../globals.h:1054
-msgid "E37: No write since last change (add ! to override)"
-msgstr "E37: Nie zapisano od ostatniej zmiany (wymuœ przez !)"
-
-#: ../globals.h:1055
-#, fuzzy
-msgid "E37: No write since last change"
-msgstr "[Brak zapisu od czasu ostatniej zmiany]\n"
-
-#: ../globals.h:1056
-msgid "E38: Null argument"
-msgstr "E38: Zerowy argument"
-
-#: ../globals.h:1057
-msgid "E39: Number expected"
-msgstr "E39: Oczekuj๊ liczby"
-
-#: ../globals.h:1058
-#, c-format
-msgid "E40: Can't open errorfile %s"
-msgstr "E40: Nie mog๊ otworzyๆ pliku bณ๊d๓w %s"
-
-#: ../globals.h:1059
-msgid "E41: Out of memory!"
-msgstr "E41: Pami๊ๆ wyczerpana!"
-
-#: ../globals.h:1060
-msgid "Pattern not found"
-msgstr "Nie znaleziono wzorca"
-
-#: ../globals.h:1061
-#, c-format
-msgid "E486: Pattern not found: %s"
-msgstr "E486: Nie znaleziono wzorca: %s"
-
-#: ../globals.h:1062
-msgid "E487: Argument must be positive"
-msgstr "E487: Argument musi byๆ dodatni"
-
-#: ../globals.h:1064
-msgid "E459: Cannot go back to previous directory"
-msgstr "E459: Nie moฟna przejœๆ do poprzedniego katalogu"
-
-#: ../globals.h:1066
-msgid "E42: No Errors"
-msgstr "E42: Brak Bณ๊d๓w"
-
-#: ../globals.h:1067
-msgid "E776: No location list"
-msgstr "E776: Brak listy lokacji"
-
-#: ../globals.h:1068
-msgid "E43: Damaged match string"
-msgstr "E43: Popsuty ciนg wzorca"
-
-#: ../globals.h:1069
-msgid "E44: Corrupted regexp program"
-msgstr "E44: Zepsuty program wyraฟe๑ regularnych"
-
-#: ../globals.h:1071
-msgid "E45: 'readonly' option is set (add ! to override)"
-msgstr "E45: opcja 'readonly' jest ustawiona (wymuœ poprzez !)"
-
-#: ../globals.h:1073
-#, c-format
-msgid "E46: Cannot change read-only variable \"%s\""
-msgstr "E46: Nie mog๊ zmieniๆ zmiennej tylko do odczytu \"%s\""
-
-#: ../globals.h:1075
-#, c-format
-msgid "E794: Cannot set variable in the sandbox: \"%s\""
-msgstr "E794: Nie mog๊ ustawiๆ zmiennej w piaskownicy: \"%s\""
-
-#: ../globals.h:1076
-msgid "E47: Error while reading errorfile"
-msgstr "E47: Bณนd w trakcie czytania pliku bณ๊d๓w"
-
-#: ../globals.h:1078
-msgid "E48: Not allowed in sandbox"
-msgstr "E48: Niedozwolone w piaskownicy"
-
-#: ../globals.h:1080
-msgid "E523: Not allowed here"
-msgstr "E523: Niedozwolone w tym miejscu"
-
-#: ../globals.h:1082
-msgid "E359: Screen mode setting not supported"
-msgstr "E359: Ustawianie trybu ekranu niewspomagane"
-
-#: ../globals.h:1083
-msgid "E49: Invalid scroll size"
-msgstr "E49: Niewณaœciwa wielkoœๆ przewini๊cia"
-
-#: ../globals.h:1084
-msgid "E91: 'shell' option is empty"
-msgstr "E91: opcja 'shell' jest pusta"
-
-#: ../globals.h:1085
-msgid "E255: Couldn't read in sign data!"
-msgstr "E255: Nie mogณem wczytaๆ danych znaku!"
-
-#: ../globals.h:1086
-msgid "E72: Close error on swap file"
-msgstr "E72: Bณนd podczas zamykania pliku wymiany"
-
-#: ../globals.h:1087
-msgid "E73: tag stack empty"
-msgstr "E73: stos znacznik๓w jest pusty"
-
-#: ../globals.h:1088
-msgid "E74: Command too complex"
-msgstr "E74: Komenda jest zbyt skomplikowana"
-
-#: ../globals.h:1089
-msgid "E75: Name too long"
-msgstr "E75: Zbyt dณuga nazwa"
-
-#: ../globals.h:1090
-msgid "E76: Too many ["
-msgstr "E76: Zbyt wiele ["
-
-#: ../globals.h:1091
-msgid "E77: Too many file names"
-msgstr "E77: Zbyt wiele nazw plik๓w"
-
-#: ../globals.h:1092
-msgid "E488: Trailing characters"
-msgstr "E488: Nadst๊pne znaczki"
-
-#: ../globals.h:1093
-msgid "E78: Unknown mark"
-msgstr "E78: Nieznana zakณadka"
-
-#: ../globals.h:1094
-msgid "E79: Cannot expand wildcards"
-msgstr "E79: Nie mogน rozwinนๆ znak๓w wieloznacznych"
-
-#: ../globals.h:1096
-msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
-msgstr "E591: 'winheight' nie moฟe byๆ mniejsze niฟ 'winminheight'"
-
-#: ../globals.h:1098
-msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
-msgstr "E592: 'winwidth' nie moฟe byๆ mniejsze niฟ 'winminwidth'"
-
-#: ../globals.h:1099
-msgid "E80: Error while writing"
-msgstr "E80: Bณนd w trakcie zapisu"
-
-#: ../globals.h:1100
-msgid "Zero count"
-msgstr "Zerowy licznik"
-
-#: ../globals.h:1101
-msgid "E81: Using <SID> not in a script context"
-msgstr "E81: Uฟycie <SID> poza kontekstem skryptu"
-
-#: ../globals.h:1102
-#, c-format
-msgid "E685: Internal error: %s"
-msgstr "E685: Bณนd wewn๊trzny: %s"
-
-#: ../globals.h:1104
-msgid "E363: pattern uses more memory than 'maxmempattern'"
-msgstr "E363: Wzorzec uฟywa wi๊cej pami๊ci niฟ 'maxmempattern'"
-
-#: ../globals.h:1105
-msgid "E749: empty buffer"
-msgstr "E749: pusty bufor"
-
-#: ../globals.h:1108
-msgid "E682: Invalid search pattern or delimiter"
-msgstr "E682: Niewณaœciwy wzorzec wyszukiwania lub delimiter"
-
-#: ../globals.h:1109
-msgid "E139: File is loaded in another buffer"
-msgstr "E139: Plik jest zaณadowany w innym buforze"
-
-#: ../globals.h:1110
-#, c-format
-msgid "E764: Option '%s' is not set"
-msgstr "E764: Nie ustawiono opcji '%s'"
-
-#: ../globals.h:1111
-msgid "E850: Invalid register name"
-msgstr "E850: Niewณaœciwa nazwa rejestru"
-
-#: ../globals.h:1114
-msgid "search hit TOP, continuing at BOTTOM"
-msgstr "szukanie dobiณo GำRY; kontynuacja od KOัCA"
-
-#: ../globals.h:1115
-msgid "search hit BOTTOM, continuing at TOP"
-msgstr "szukanie dobiณo KOัCA; kontynuacja od GำRY"
-
-#: ../hardcopy.c:240
-msgid "E550: Missing colon"
-msgstr "E550: Brak dwukropka"
-
-#: ../hardcopy.c:252
-msgid "E551: Illegal component"
-msgstr "E551: Niedozwolona cz๊œๆ"
-
-#: ../hardcopy.c:259
-msgid "E552: digit expected"
-msgstr "E552: oczekiwaณem na cyfr๊"
-
-#: ../hardcopy.c:473
-#, c-format
-msgid "Page %d"
-msgstr "Strona %d"
-
-#: ../hardcopy.c:597
-msgid "No text to be printed"
-msgstr "Brak tekstu do drukowania"
-
-#: ../hardcopy.c:668
-#, c-format
-msgid "Printing page %d (%d%%)"
-msgstr "Drukuj๊ stron๊ %d (%d%%)"
-
-#: ../hardcopy.c:680
-#, c-format
-msgid " Copy %d of %d"
-msgstr " Kopia %d z %d"
-
-#: ../hardcopy.c:733
-#, c-format
-msgid "Printed: %s"
-msgstr "Wydrukowano: %s"
-
-#: ../hardcopy.c:740
-msgid "Printing aborted"
-msgstr "Drukowanie odwoณane"
-
-#: ../hardcopy.c:1365
-msgid "E455: Error writing to PostScript output file"
-msgstr "E455: Nie moฟna zapisaๆ do wyjœciowego pliku PostScriptu"
-
-#: ../hardcopy.c:1747
-#, c-format
-msgid "E624: Can't open file \"%s\""
-msgstr "E624: Nie mog๊ otworzyๆ pliku \"%s\""
-
-#: ../hardcopy.c:1756 ../hardcopy.c:2470
-#, c-format
-msgid "E457: Can't read PostScript resource file \"%s\""
-msgstr "E457: Nie moฟna odczytaๆ pliku zasob๓w PostScriptu \"%s\""
-
-#: ../hardcopy.c:1772
-#, c-format
-msgid "E618: file \"%s\" is not a PostScript resource file"
-msgstr "E618: plik \"%s\" nie jest plikiem zasob๓w PostScriptu"
-
-#: ../hardcopy.c:1788 ../hardcopy.c:1805 ../hardcopy.c:1844
-#, c-format
-msgid "E619: file \"%s\" is not a supported PostScript resource file"
-msgstr "E619: plik \"%s\" nie jest wspieranym plikiem zasob๓w PostScriptu"
-
-#: ../hardcopy.c:1856
-#, c-format
-msgid "E621: \"%s\" resource file has wrong version"
-msgstr "E621: \"%s\" nieprawidณowa wersja pliku zasob๓w"
-
-#: ../hardcopy.c:2225
-msgid "E673: Incompatible multi-byte encoding and character set."
-msgstr "E673: Niekompatybilne kodowanie wielobajtowe i zestaw znak๓w."
-
-#: ../hardcopy.c:2238
-msgid "E674: printmbcharset cannot be empty with multi-byte encoding."
-msgstr "E674: printmbcharset nie moฟe byๆ pusty przy kodowaniu wielobajtowym."
-
-#: ../hardcopy.c:2254
-msgid "E675: No default font specified for multi-byte printing."
-msgstr "E675: Nie okreœlono domyœlnej czcionki dla drukowania wielobajtowego."
-
-#: ../hardcopy.c:2426
-msgid "E324: Can't open PostScript output file"
-msgstr "E324: Nie moฟna otworzyๆ pliku PostScript do wyjœcia"
-
-#: ../hardcopy.c:2458
-#, c-format
-msgid "E456: Can't open file \"%s\""
-msgstr "E456: Nie mog๊ otworzyๆ pliku \"%s\""
-
-#: ../hardcopy.c:2583
-msgid "E456: Can't find PostScript resource file \"prolog.ps\""
-msgstr "E456: Nie moฟna znaleŸๆ pliku zasob๓w PostScriptu \"prolog.ps\""
-
-#: ../hardcopy.c:2593
-msgid "E456: Can't find PostScript resource file \"cidfont.ps\""
-msgstr "E456: Nie moฟna znaleŸๆ pliku zasob๓w PostScriptu \"cidfont.ps\""
-
-#: ../hardcopy.c:2622 ../hardcopy.c:2639 ../hardcopy.c:2665
-#, c-format
-msgid "E456: Can't find PostScript resource file \"%s.ps\""
-msgstr "E456: Nie moฟna znaleŸๆ pliku zasob๓w PostScriptu \"%s.ps\""
-
-#: ../hardcopy.c:2654
-#, c-format
-msgid "E620: Unable to convert to print encoding \"%s\""
-msgstr "E620: Nie moฟna przekonwertowaๆ by drukowaๆ kodowanie \"%s\""
-
-#: ../hardcopy.c:2877
-msgid "Sending to printer..."
-msgstr "Przesyณam do drukarki..."
-
-#: ../hardcopy.c:2881
-msgid "E365: Failed to print PostScript file"
-msgstr "E365: Drukowanie pliku PostScript nie powiodณo si๊"
-
-#: ../hardcopy.c:2883
-msgid "Print job sent."
-msgstr "Zadanie drukowanie przesณane."
-
-#: ../if_cscope.c:85
-msgid "Add a new database"
-msgstr "Dodaj nowน baz๊ danych"
-
-#: ../if_cscope.c:87
-msgid "Query for a pattern"
-msgstr "Zapytane o wzorzec"
-
-#: ../if_cscope.c:89
-msgid "Show this message"
-msgstr "Pokaฟ ten komunikat"
-
-#: ../if_cscope.c:91
-msgid "Kill a connection"
-msgstr "Zabij poณนczenie"
-
-#: ../if_cscope.c:93
-msgid "Reinit all connections"
-msgstr "Pon๓w wszelkie poณนczenia"
-
-#: ../if_cscope.c:95
-msgid "Show connections"
-msgstr "Pokaฟ poณนczenia"
-
-#: ../if_cscope.c:101
-#, c-format
-msgid "E560: Usage: cs[cope] %s"
-msgstr "E560: Zastosowanie: cs[cope] %s"
-
-#: ../if_cscope.c:225
-msgid "This cscope command does not support splitting the window.\n"
-msgstr "Ta komenda cscope nie wspomaga podzielenia okna.\n"
-
-#: ../if_cscope.c:266
-msgid "E562: Usage: cstag <ident>"
-msgstr "E562: Zastosowanie: cstag <ident>"
-
-#: ../if_cscope.c:313
-msgid "E257: cstag: tag not found"
-msgstr "E257: cstag: nie znaleziono znacznika"
-
-#: ../if_cscope.c:461
-#, c-format
-msgid "E563: stat(%s) error: %d"
-msgstr "E563: stat(%s) bณนd: %d"
-
-#: ../if_cscope.c:551
-#, c-format
-msgid "E564: %s is not a directory or a valid cscope database"
-msgstr "E564: %s nie jest katalogiem lub poprawnน bazน danych cscope"
-
-#: ../if_cscope.c:566
-#, c-format
-msgid "Added cscope database %s"
-msgstr "Dodano baz๊ danych cscope %s"
-
-#: ../if_cscope.c:616
-#, c-format
-msgid "E262: error reading cscope connection %<PRId64>"
-msgstr "E262: bณนd odczytu poณนczenia z cscope %<PRId64>"
-
-#: ../if_cscope.c:711
-msgid "E561: unknown cscope search type"
-msgstr "E561: nieznany typ szukania cscope"
-
-#: ../if_cscope.c:752 ../if_cscope.c:789
-msgid "E566: Could not create cscope pipes"
-msgstr "E566: Nie mogณem stworzyๆ potoku do cscope"
-
-#: ../if_cscope.c:767
-msgid "E622: Could not fork for cscope"
-msgstr "E622: Nie mogณem utworzyๆ rozwidlenia dla cscope"
-
-#: ../if_cscope.c:849
-msgid "cs_create_connection setpgid failed"
-msgstr "nie powiodณo si๊ setpgid cs_create_connection"
-
-#: ../if_cscope.c:853 ../if_cscope.c:889
-msgid "cs_create_connection exec failed"
-msgstr "wykonanie cs_create_connection nie powiodณo si๊"
-
-#: ../if_cscope.c:863 ../if_cscope.c:902
-msgid "cs_create_connection: fdopen for to_fp failed"
-msgstr "cs_create_connection: fdopen dla to_fp nie powiodณo si๊"
-
-#: ../if_cscope.c:865 ../if_cscope.c:906
-msgid "cs_create_connection: fdopen for fr_fp failed"
-msgstr "cs_create_connection: fdopen dla fr_fp nie powiodณo si๊"
-
-#: ../if_cscope.c:890
-msgid "E623: Could not spawn cscope process"
-msgstr "E623: Nie mogณem stworzyๆ procesu cscope"
-
-#: ../if_cscope.c:932
-msgid "E567: no cscope connections"
-msgstr "E567: brak poณนczenia z cscope"
-
-#: ../if_cscope.c:1009
-#, c-format
-msgid "E469: invalid cscopequickfix flag %c for %c"
-msgstr "E469: nieprawidณowa flaga cscopequickfix %c dla %c"
-
-#: ../if_cscope.c:1058
-#, c-format
-msgid "E259: no matches found for cscope query %s of %s"
-msgstr "E259: brak dopasowa๑ dla zapytania cscope %s o %s"
-
-#: ../if_cscope.c:1142
-msgid "cscope commands:\n"
-msgstr "komendy cscope:\n"
-
-#: ../if_cscope.c:1150
-#, c-format
-msgid "%-5s: %s%*s (Usage: %s)"
-msgstr "%-5s: %s%*s (Uฟycie: %s)"
-
-#: ../if_cscope.c:1155
-msgid ""
-"\n"
-" c: Find functions calling this function\n"
-" d: Find functions called by this function\n"
-" e: Find this egrep pattern\n"
-" f: Find this file\n"
-" g: Find this definition\n"
-" i: Find files #including this file\n"
-" s: Find this C symbol\n"
-" t: Find this text string\n"
-msgstr ""
-"\n"
-" c: znajdŸ funkcje wywoณujนce t๊ funkcj๊\n"
-" d: znajdŸ funkcje wywoณywane przez t๊ funkcj๊\n"
-" e: znajdŸ ten wzorzec egrep\n"
-" f: znajdŸ ten plik\n"
-" g: znajdŸ t๊ definicj๊\n"
-" i: znajdŸ pliki wณนczajนce (#include) ten plik\n"
-" s: znajdŸ ten symbol C\n"
-" t: znajdŸ ten ณa๑cuch znak๓w\n"
-
-#: ../if_cscope.c:1226
-msgid "E568: duplicate cscope database not added"
-msgstr "E568: nie dodano duplikatu bazy danych cscope"
-
-#: ../if_cscope.c:1335
-#, c-format
-msgid "E261: cscope connection %s not found"
-msgstr "E261: nie ma poณนczenia %s z cscope"
-
-#: ../if_cscope.c:1364
-#, c-format
-msgid "cscope connection %s closed"
-msgstr "poณนczenie %s z cscope zostaณo zamkni๊te"
-
-#. should not reach here
-#: ../if_cscope.c:1486
-msgid "E570: fatal error in cs_manage_matches"
-msgstr "E570: bณนd krytyczny w cs_manage_matches"
-
-#: ../if_cscope.c:1693
-#, c-format
-msgid "Cscope tag: %s"
-msgstr "Znacznik cscope: %s"
-
-#: ../if_cscope.c:1711
-msgid ""
-"\n"
-" # line"
-msgstr ""
-"\n"
-" # wiersz"
-
-#: ../if_cscope.c:1713
-msgid "filename / context / line\n"
-msgstr "nazwa pliku / kontekst / wiersz\n"
-
-#: ../if_cscope.c:1809
-#, c-format
-msgid "E609: Cscope error: %s"
-msgstr "E609: Bณนd cscope: %s"
-
-#: ../if_cscope.c:2053
-msgid "All cscope databases reset"
-msgstr "Wszystkie bazy danych cscope przeณadowano"
-
-#: ../if_cscope.c:2123
-msgid "no cscope connections\n"
-msgstr "brak poณนcze๑ z cscope\n"
-
-#: ../if_cscope.c:2126
-msgid " # pid database name prepend path\n"
-msgstr " # pid nazwa bazy danych przedsionek tropu\n"
-
-#: ../main.c:144
-msgid "Unknown option argument"
-msgstr "Nieznany argument opcji"
-
-#: ../main.c:146
-msgid "Too many edit arguments"
-msgstr "Zbyt wiele argument๓w"
-
-#: ../main.c:148
-msgid "Argument missing after"
-msgstr "Brak argumentu po"
-
-#: ../main.c:150
-msgid "Garbage after option argument"
-msgstr "Œmiecie po argumencie opcji"
-
-#: ../main.c:152
-msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"
-msgstr ""
-"Zbyt wiele argument๓w \"+komenda\", \"-c komenda\" lub \"--cmd komenda\""
-
-#: ../main.c:154
-msgid "Invalid argument for"
-msgstr "Niewณaœciwy argument dla"
-
-#: ../main.c:294
-#, c-format
-msgid "%d files to edit\n"
-msgstr "%d plik๓w do edycji\n"
-
-#: ../main.c:1342
-msgid "Attempt to open script file again: \""
-msgstr "Pr๓ba ponownego otworzenia pliku skryptu: \""
-
-#: ../main.c:1350
-msgid "Cannot open for reading: \""
-msgstr "Nie mog๊ otworzyๆ do odczytu: \""
-
-#: ../main.c:1393
-msgid "Cannot open for script output: \""
-msgstr "Nie mog๊ otworzyๆ dla wyjœcia skryptu: \""
-
-#: ../main.c:1622
-msgid "Vim: Warning: Output is not to a terminal\n"
-msgstr "Vim: OSTRZEฏENIE: Wyjœcie nie jest terminalem\n"
-
-#: ../main.c:1624
-msgid "Vim: Warning: Input is not from a terminal\n"
-msgstr "Vim: OSTRZEฏENIE: Wejœcie nie pochodzi z terminala\n"
-
-#. just in case..
-#: ../main.c:1891
-msgid "pre-vimrc command line"
-msgstr "linia polece๑ pre-vimrc"
-
-#: ../main.c:1964
-#, c-format
-msgid "E282: Cannot read from \"%s\""
-msgstr "E282: Nie mog๊ czytaๆ z \"%s\""
-
-#: ../main.c:2149
-msgid ""
-"\n"
-"More info with: \"vim -h\"\n"
-msgstr ""
-"\n"
-"Dalsze informacje poprzez: \"vim -h\"\n"
-
-#: ../main.c:2178
-msgid "[file ..] edit specified file(s)"
-msgstr "[plik ..] edytuj zadane pliki"
-
-#: ../main.c:2179
-msgid "- read text from stdin"
-msgstr "- czytaj tekst ze stdin"
-
-#: ../main.c:2180
-msgid "-t tag edit file where tag is defined"
-msgstr "-t znacznik edytuj plik, w kt๓rym dany znacznik jest zdefiniowany"
-
-#: ../main.c:2181
-msgid "-q [errorfile] edit file with first error"
-msgstr "-q [errorfile] edytuj plik, zawierajนcy pierwszy bณนd"
-
-#: ../main.c:2187
-msgid ""
-"\n"
-"\n"
-"usage:"
-msgstr ""
-"\n"
-"\n"
-"uฟycie:"
-
-#: ../main.c:2189
-msgid " vim [arguments] "
-msgstr " vim [argumenty]"
-
-#: ../main.c:2193
-msgid ""
-"\n"
-" or:"
-msgstr ""
-"\n"
-" lub:"
-
-#: ../main.c:2196
-msgid ""
-"\n"
-"\n"
-"Arguments:\n"
-msgstr ""
-"\n"
-"\n"
-"Argumenty:\n"
-
-#: ../main.c:2197
-msgid "--\t\t\tOnly file names after this"
-msgstr "--\t\t\tTylko nazwy plik๓w po tym"
-
-#: ../main.c:2199
-msgid "--literal\t\tDon't expand wildcards"
-msgstr "--literal\t\tNie rozwijaj znak๓w specjalnych"
-
-#: ../main.c:2201
-msgid "-v\t\t\tVi mode (like \"vi\")"
-msgstr "-v\t\t\tTryb vi (jak \"vi\")"
-
-#: ../main.c:2202
-msgid "-e\t\t\tEx mode (like \"ex\")"
-msgstr "-e\t\t\tTryb ex (jak \"ex\")"
-
-#: ../main.c:2203
-msgid "-E\t\t\tImproved Ex mode"
-msgstr "-E\t\t\tUsprawniony tryb Ex"
-
-#: ../main.c:2204
-msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")"
-msgstr "-s\t\t\tCichy tryb (tณa) (tylko dla \"ex\")"
-
-#: ../main.c:2205
-msgid "-d\t\t\tDiff mode (like \"vimdiff\")"
-msgstr "-d\t\t\tTryb r๓ฟnic (jak \"vimdiff\")"
-
-#: ../main.c:2206
-msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
-msgstr "-y\t\t\tTryb ณatwy (jak \"evim\", bez tryb๓w)"
-
-#: ../main.c:2207
-msgid "-R\t\t\tReadonly mode (like \"view\")"
-msgstr "-R\t\t\tTryb wyณนcznie do odczytu (jak \"view\")"
-
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tTryb ograniczenia (jak \"rvim\")"
-
-#: ../main.c:2209
-msgid "-m\t\t\tModifications (writing files) not allowed"
-msgstr "-m\t\t\tModyfikacje (zapisywanie plik๓w) niedozwolone"
-
-#: ../main.c:2210
-msgid "-M\t\t\tModifications in text not allowed"
-msgstr "-M\t\t\tZakaz modyfikacji tekstu"
-
-#: ../main.c:2211
-msgid "-b\t\t\tBinary mode"
-msgstr "-b\t\t\tTryb binarny"
-
-#: ../main.c:2212
-msgid "-l\t\t\tLisp mode"
-msgstr "-l\t\t\tTryb lisp"
-
-#: ../main.c:2213
-msgid "-C\t\t\tCompatible with Vi: 'compatible'"
-msgstr "-C\t\t\tBนdŸ zgodny z Vi: 'compatible'"
-
-#: ../main.c:2214
-msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'"
-msgstr "-N\t\t\tBนdŸ niezupeณnie zgodny z Vi: 'nocompatible'"
-
-#: ../main.c:2215
-msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]"
-msgstr "-V[N][nazwap]\t\tGadatliwy [poziom N] [zapisuj wiadomoœci do nazwap]"
-
-#: ../main.c:2216
-msgid "-D\t\t\tDebugging mode"
-msgstr "-D\t\t\tTryb odpluskwiania"
-
-#: ../main.c:2217
-msgid "-n\t\t\tNo swap file, use memory only"
-msgstr "-n\t\t\tZamiast pliku wymiany, uฟywaj tylko pami๊ci"
-
-#: ../main.c:2218
-msgid "-r\t\t\tList swap files and exit"
-msgstr "-r\t\t\tWylicz pliki wymiany i zako๑cz"
-
-#: ../main.c:2219
-msgid "-r (with file name)\tRecover crashed session"
-msgstr "-r (z nazwน pliku)\tOdtw๓rz zaณamanน sesj๊"
-
-#: ../main.c:2220
-msgid "-L\t\t\tSame as -r"
-msgstr "-L\t\t\tToฟsame z -r"
-
-#: ../main.c:2221
-msgid "-A\t\t\tstart in Arabic mode"
-msgstr "-A\t\t\trozpocznij w trybie arabskim"
-
-#: ../main.c:2222
-msgid "-H\t\t\tStart in Hebrew mode"
-msgstr "-H\t\t\trozpocznij w trybie hebrajskim"
-
-#: ../main.c:2223
-msgid "-F\t\t\tStart in Farsi mode"
-msgstr "-F\t\t\trozpocznij w trybie farsi"
-
-#: ../main.c:2224
-msgid "-T <terminal>\tSet terminal type to <terminal>"
-msgstr "-T <terminal>\tUstaw typ terminala na <terminal>"
-
-#: ../main.c:2225
-msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc"
-msgstr "-u <vimrc>\t\tUฟyj <vimrc> zamiast jakiegokolwiek .vimrc"
-
-#: ../main.c:2226
-msgid "--noplugin\t\tDon't load plugin scripts"
-msgstr "--noplugin\t\tNie ณaduj skrypt๓w wtyczek"
-
-#: ../main.c:2227
-msgid "-p[N]\t\tOpen N tab pages (default: one for each file)"
-msgstr "-p[N]\t\tOtw๓rz N kart (domyœlnie: po jednej dla kaฟdego pliku)"
-
-#: ../main.c:2228
-msgid "-o[N]\t\tOpen N windows (default: one for each file)"
-msgstr "-o[N]\t\tOtw๓rz N okien (domyœlnie: po jednym dla kaฟdego pliku)"
-
-#: ../main.c:2229
-msgid "-O[N]\t\tLike -o but split vertically"
-msgstr "-O[N]\t\ttak samo jak -o tylko dziel okno pionowo"
-
-#: ../main.c:2230
-msgid "+\t\t\tStart at end of file"
-msgstr "+\t\t\tZacznij na ko๑cu pliku"
-
-#: ../main.c:2231
-msgid "+<lnum>\t\tStart at line <lnum>"
-msgstr "+<lnum>\t\tZacznij w wierszu <lnum>"
-
-#: ../main.c:2232
-msgid "--cmd <command>\tExecute <command> before loading any vimrc file"
-msgstr ""
-"-cmd <command>\t\tWykonaj komend๊ <command> przed zaณadowaniem "
-"jakiegokolwiek pliku vimrc"
-
-#: ../main.c:2233
-msgid "-c <command>\t\tExecute <command> after loading the first file"
-msgstr ""
-"-c <command>\t\tWykonaj komend๊ <command> po zaณadowaniu pierwszego pliku"
-
-#: ../main.c:2235
-msgid "-S <session>\t\tSource file <session> after loading the first file"
-msgstr "-S <sesja>\t\tWczytaj plik <sesja> po zaณadowaniu pierwszego pliku"
-
-#: ../main.c:2236
-msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>"
-msgstr "-s <scriptin>\tWczytuj komendy trybu normalnego z pliku <scriptin>"
-
-#: ../main.c:2237
-msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>"
-msgstr ""
-"-w <scriptout>\tDoณนcz wszystkie wprowadzane komendy do pliku <scriptout>"
-
-#: ../main.c:2238
-msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>"
-msgstr ""
-"-W <scriptout>\tZapisuj wszystkie wprowadzane komendy do pliku <scriptout>"
-
-#: ../main.c:2240
-msgid "--startuptime <file>\tWrite startup timing messages to <file>"
-msgstr ""
-"--startuptime <plik>\n"
-"Zapisz wiadomoœci o dณugoœci startu do <plik>"
-
-#: ../main.c:2242
-msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
-msgstr "-i <viminfo>\t\tUฟywaj <viminfo> zamiast .viminfo"
-
-#: ../main.c:2243
-msgid "-h or --help\tPrint Help (this message) and exit"
-msgstr "-h lub --help\twyœwietl Pomoc (czyli t๊ wiadomoœๆ) i zako๑cz"
-
-#: ../main.c:2244
-msgid "--version\t\tPrint version information and exit"
-msgstr "--version\t\twyœwietl informacj๊ o wersji i zako๑cz"
-
-#: ../mark.c:676
-msgid "No marks set"
-msgstr "Brak zakณadek"
-
-#: ../mark.c:678
-#, c-format
-msgid "E283: No marks matching \"%s\""
-msgstr "E283: ฏadna zakณadka nie pasuje do \"%s\""
-
-#. Highlight title
-#: ../mark.c:687
-msgid ""
-"\n"
-"mark line col file/text"
-msgstr ""
-"\n"
-"zakณ. wiersz kol plik/tekst"
-
-#. Highlight title
-#: ../mark.c:789
-msgid ""
-"\n"
-" jump line col file/text"
-msgstr ""
-"\n"
-" skok wiersz kol plik/tekst"
-
-#. Highlight title
-#: ../mark.c:831
-msgid ""
-"\n"
-"change line col text"
-msgstr ""
-"\n"
-"zmie๑ wrsz. kol tekst"
-
-#: ../mark.c:1238
-msgid ""
-"\n"
-"# File marks:\n"
-msgstr ""
-"\n"
-"# Zakณadki w plikach:\n"
-
-#. Write the jumplist with -'
-#: ../mark.c:1271
-msgid ""
-"\n"
-"# Jumplist (newest first):\n"
-msgstr ""
-"\n"
-"# Lista odniesie๑ (poczนwszy od najnowszych):\n"
-
-#: ../mark.c:1352
-msgid ""
-"\n"
-"# History of marks within files (newest to oldest):\n"
-msgstr ""
-"\n"
-"# Historia zakณadek w plikach (od najnowszych po najstarsze):\n"
-
-#: ../mark.c:1431
-msgid "Missing '>'"
-msgstr "Brak '>'"
-
-#: ../memfile.c:426
-msgid "E293: block was not locked"
-msgstr "E293: blok nie byณ zablokowany"
-
-#: ../memfile.c:799
-msgid "E294: Seek error in swap file read"
-msgstr "E294: Bณนd w trakcie czytania pliku wymiany"
-
-#: ../memfile.c:803
-msgid "E295: Read error in swap file"
-msgstr "E295: Bณนd odczytu pliku wymiany"
-
-#: ../memfile.c:849
-msgid "E296: Seek error in swap file write"
-msgstr "E296: Bณนd szukania w pliku wymiany"
-
-#: ../memfile.c:865
-msgid "E297: Write error in swap file"
-msgstr "E297: Bณนd zapisu w pliku wymiany"
-
-#: ../memfile.c:1036
-msgid "E300: Swap file already exists (symlink attack?)"
-msgstr "E300: Plik wymiany juฟ istnieje (atak symlink?)"
-
-#: ../memline.c:318
-msgid "E298: Didn't get block nr 0?"
-msgstr "E298: Nie otrzymaณem bloku nr 0?"
-
-#: ../memline.c:361
-msgid "E298: Didn't get block nr 1?"
-msgstr "E298: Nie otrzymaณem bloku nr 1?"
-
-#: ../memline.c:377
-msgid "E298: Didn't get block nr 2?"
-msgstr "E298: Nie otrzymaณem bloku nr 2?"
-
-#. could not (re)open the swap file, what can we do????
-#: ../memline.c:465
-msgid "E301: Oops, lost the swap file!!!"
-msgstr "E301: Ojej, zgubiณem plik wymiany!!!"
-
-#: ../memline.c:477
-msgid "E302: Could not rename swap file"
-msgstr "E302: Nie mogณem zmieniๆ nazwy pliku wymiany"
-
-#: ../memline.c:554
-#, c-format
-msgid "E303: Unable to open swap file for \"%s\", recovery impossible"
-msgstr ""
-"E303: Nie mog๊ otworzyๆ pliku wymiany dla \"%s\"; odtworzenie niemoฟliwe"
-
-#: ../memline.c:666
-msgid "E304: ml_upd_block0(): Didn't get block 0??"
-msgstr "E304: ml_upd_block(): Nie otrzymaณem bloku 0??"
-
-#. no swap files found
-#: ../memline.c:830
-#, c-format
-msgid "E305: No swap file found for %s"
-msgstr "E305: Nie znaleziono pliku wymiany dla %s"
-
-#: ../memline.c:839
-msgid "Enter number of swap file to use (0 to quit): "
-msgstr "WprowadŸ numer pliku wymiany, kt๓rego uฟyๆ (0 by wyjœๆ): "
-
-#: ../memline.c:879
-#, c-format
-msgid "E306: Cannot open %s"
-msgstr "E306: Nie mog๊ otworzyๆ %s"
-
-#: ../memline.c:897
-msgid "Unable to read block 0 from "
-msgstr "Nie mog๊ odczytaๆ bloku 0 z "
-
-#: ../memline.c:900
-msgid ""
-"\n"
-"Maybe no changes were made or Vim did not update the swap file."
-msgstr ""
-"\n"
-"Moฟe nie wykonano zmian albo Vim nie zaktualizowaณ pliku wymiany."
-
-#: ../memline.c:909
-msgid " cannot be used with this version of Vim.\n"
-msgstr " nie moฟe byๆ stosowany z tน wersjน Vima.\n"
-
-#: ../memline.c:911
-msgid "Use Vim version 3.0.\n"
-msgstr "Uฟyj Vima w wersji 3.0.\n"
-
-#: ../memline.c:916
-#, c-format
-msgid "E307: %s does not look like a Vim swap file"
-msgstr "E307: %s nie wyglนda na plik wymiany Vima"
-
-#: ../memline.c:922
-msgid " cannot be used on this computer.\n"
-msgstr " nie moฟe byๆ stosowany na tym komputerze.\n"
-
-#: ../memline.c:924
-msgid "The file was created on "
-msgstr "Ten plik zostaณ stworzony na "
-
-#: ../memline.c:928
-msgid ""
-",\n"
-"or the file has been damaged."
-msgstr ""
-",\n"
-"lub plik zostaณ uszkodzony."
-
-#: ../memline.c:945
-msgid " has been damaged (page size is smaller than minimum value).\n"
-msgstr ""
-" zostaณ uszkodzony (wielkoœๆ strony jest mniejsza niฟ najmniejsza wartoœๆ).\n"
-
-#: ../memline.c:974
-#, c-format
-msgid "Using swap file \"%s\""
-msgstr "Uฟywam pliku wymiany \"%s\""
-
-#: ../memline.c:980
-#, c-format
-msgid "Original file \"%s\""
-msgstr "Oryginalny plik \"%s\""
-
-#: ../memline.c:995
-msgid "E308: Warning: Original file may have been changed"
-msgstr "E308: OSTRZEฏENIE: Oryginalny plik m๓gณ byๆ zmieniony"
-
-#: ../memline.c:1061
-#, c-format
-msgid "E309: Unable to read block 1 from %s"
-msgstr "E309: Nie mog๊ odczytaๆ bloku 1 z %s"
-
-#: ../memline.c:1065
-msgid "???MANY LINES MISSING"
-msgstr "???BRAKUJE WIELU WIERSZY"
-
-#: ../memline.c:1076
-msgid "???LINE COUNT WRONG"
-msgstr "???LICZNIK WIERSZY NIEZGODNY"
-
-#: ../memline.c:1082
-msgid "???EMPTY BLOCK"
-msgstr "???PUSTY BLOK"
-
-#: ../memline.c:1103
-msgid "???LINES MISSING"
-msgstr "???BRAKUJE WIERSZY"
-
-#: ../memline.c:1128
-#, c-format
-msgid "E310: Block 1 ID wrong (%s not a .swp file?)"
-msgstr "E310: Niewณaœciwe ID bloku 1 (moฟe %s nie jest plikiem .swp?)"
-
-#: ../memline.c:1133
-msgid "???BLOCK MISSING"
-msgstr "???BRAK BLOKU"
-
-#: ../memline.c:1147
-msgid "??? from here until ???END lines may be messed up"
-msgstr "??? od tego miejsca po ???KONIEC wiersze mogน byๆ pomieszane"
-
-#: ../memline.c:1164
-msgid "??? from here until ???END lines may have been inserted/deleted"
-msgstr "??? od tego miejsca po ???KONIEC wiersze mogน byๆ wณoฟone/skasowane"
-
-#: ../memline.c:1181
-msgid "???END"
-msgstr "???KONIEC"
-
-#: ../memline.c:1238
-msgid "E311: Recovery Interrupted"
-msgstr "E311: Przerwanie odtwarzania"
-
-#: ../memline.c:1243
-msgid ""
-"E312: Errors detected while recovering; look for lines starting with ???"
-msgstr "E312: Wykryto bณ๊dy podczas odtwarzania; od kt๓rych wierszy zaczนๆ ???"
-
-#: ../memline.c:1245
-msgid "See \":help E312\" for more information."
-msgstr "Zobacz \":help E312\" dla dalszych informacji."
-
-#: ../memline.c:1249
-msgid "Recovery completed. You should check if everything is OK."
-msgstr ""
-"Odtwarzanie zako๑czono. Powinieneœ sprawdziๆ czy wszystko jest w porzนdku."
-
-#: ../memline.c:1251
-msgid ""
-"\n"
-"(You might want to write out this file under another name\n"
-msgstr ""
-"\n"
-"(Moฟesz chcieๆ zapisaๆ ten plik pod innน nazwน\n"
-
-#: ../memline.c:1252
-msgid "and run diff with the original file to check for changes)"
-msgstr "i wykonaๆ diff z oryginalnym plikiem aby sprawdziๆ zmiany)"
-
-#: ../memline.c:1254
-msgid "Recovery completed. Buffer contents equals file contents."
-msgstr "Odzyskiwanie zako๑czone. Zawartoœๆ bufora jest r๓wna zawartoœci pliku."
-
-#: ../memline.c:1255
-msgid ""
-"\n"
-"You may want to delete the .swp file now.\n"
-"\n"
-msgstr ""
-"\n"
-"Moฟesz teraz chcieๆ usunนๆ plik .swp.\n"
-"\n"
-
-#. use msg() to start the scrolling properly
-#: ../memline.c:1327
-msgid "Swap files found:"
-msgstr "Znalezione pliki wymiany:"
-
-#: ../memline.c:1446
-msgid " In current directory:\n"
-msgstr " W bieฟนcym katalogu:\n"
-
-#: ../memline.c:1448
-msgid " Using specified name:\n"
-msgstr " Uฟywam podanej nazwy:\n"
-
-#: ../memline.c:1450
-msgid " In directory "
-msgstr " W katalogu "
-
-#: ../memline.c:1465
-msgid " -- none --\n"
-msgstr " -- ฟaden --\n"
-
-#: ../memline.c:1527
-msgid " owned by: "
-msgstr " posiadany przez: "
-
-#: ../memline.c:1529
-msgid " dated: "
-msgstr " data: "
-
-#: ../memline.c:1532 ../memline.c:3231
-msgid " dated: "
-msgstr " data: "
-
-#: ../memline.c:1548
-msgid " [from Vim version 3.0]"
-msgstr " [po Vimie wersja 3.0]"
-
-#: ../memline.c:1550
-msgid " [does not look like a Vim swap file]"
-msgstr " [nie wyglนda na plik wymiany Vima]"
-
-#: ../memline.c:1552
-msgid " file name: "
-msgstr " nazwa pliku: "
-
-#: ../memline.c:1558
-msgid ""
-"\n"
-" modified: "
-msgstr ""
-"\n"
-" zmieniono: "
-
-#: ../memline.c:1559
-msgid "YES"
-msgstr "TAK"
-
-#: ../memline.c:1559
-msgid "no"
-msgstr "nie"
-
-#: ../memline.c:1562
-msgid ""
-"\n"
-" user name: "
-msgstr ""
-"\n"
-" uฟytkownik: "
-
-#: ../memline.c:1568
-msgid " host name: "
-msgstr " nazwa hosta: "
-
-#: ../memline.c:1570
-msgid ""
-"\n"
-" host name: "
-msgstr ""
-"\n"
-" nazwa hosta: "
-
-#: ../memline.c:1575
-msgid ""
-"\n"
-" process ID: "
-msgstr ""
-"\n"
-" ID procesu: "
-
-#: ../memline.c:1579
-msgid " (still running)"
-msgstr " (dalej dziaณa)"
-
-#: ../memline.c:1586
-msgid ""
-"\n"
-" [not usable on this computer]"
-msgstr ""
-"\n"
-" [nie do uฟytku na tym komputerze]"
-
-#: ../memline.c:1590
-msgid " [cannot be read]"
-msgstr " [nieodczytywalny]"
-
-#: ../memline.c:1593
-msgid " [cannot be opened]"
-msgstr " [nieotwieralny]"
-
-#: ../memline.c:1698
-msgid "E313: Cannot preserve, there is no swap file"
-msgstr "E313: Nie mog๊ zabezpieczyๆ, bo brak pliku wymiany"
-
-#: ../memline.c:1747
-msgid "File preserved"
-msgstr "Plik zabezpieczono"
-
-#: ../memline.c:1749
-msgid "E314: Preserve failed"
-msgstr "E314: Nieudane zabezpieczenie"
-
-#: ../memline.c:1819
-#, c-format
-msgid "E315: ml_get: invalid lnum: %<PRId64>"
-msgstr "E315: ml_get: niewณaœciwy lnum: %<PRId64>"
-
-#: ../memline.c:1851
-#, c-format
-msgid "E316: ml_get: cannot find line %<PRId64>"
-msgstr "E316: ml_get: nie znaleziono wiersza %<PRId64>"
-
-#: ../memline.c:2236
-msgid "E317: pointer block id wrong 3"
-msgstr "E317: niepoprawne id wskaŸnika bloku 3"
-
-#: ../memline.c:2311
-msgid "stack_idx should be 0"
-msgstr "stack_idx powinien byๆ 0"
-
-#: ../memline.c:2369
-msgid "E318: Updated too many blocks?"
-msgstr "E318: Zaktualizowano zbyt wiele blok๓w?"
-
-#: ../memline.c:2511
-msgid "E317: pointer block id wrong 4"
-msgstr "E317: niepoprawne id wskaŸnika bloku 4"
-
-#: ../memline.c:2536
-msgid "deleted block 1?"
-msgstr "blok nr 1 skasowany?"
-
-#: ../memline.c:2707
-#, c-format
-msgid "E320: Cannot find line %<PRId64>"
-msgstr "E320: Nie mog๊ znaleŸๆ wiersza %<PRId64>"
-
-#: ../memline.c:2916
-msgid "E317: pointer block id wrong"
-msgstr "E317: niepoprawne id bloku odniesienia"
-
-#: ../memline.c:2930
-msgid "pe_line_count is zero"
-msgstr "pe_line_count wynosi zero"
-
-#: ../memline.c:2955
-#, c-format
-msgid "E322: line number out of range: %<PRId64> past the end"
-msgstr "E322: numer wiersza poza zakresem: %<PRId64> jest poza ko๑cem"
-
-#: ../memline.c:2959
-#, c-format
-msgid "E323: line count wrong in block %<PRId64>"
-msgstr "E323: liczba wierszy niepoprawna w bloku %<PRId64>"
-
-#: ../memline.c:2999
-msgid "Stack size increases"
-msgstr "Wielkoœๆ stosu wzrasta"
-
-#: ../memline.c:3038
-msgid "E317: pointer block id wrong 2"
-msgstr "E317: niepoprawne id bloku odniesienia 2"
-
-#: ../memline.c:3070
-#, c-format
-msgid "E773: Symlink loop for \"%s\""
-msgstr "E773: P๊tla dowiนza๑ dla \"%s\""
-
-#: ../memline.c:3221
-msgid "E325: ATTENTION"
-msgstr "E325: UWAGA"
-
-#: ../memline.c:3222
-msgid ""
-"\n"
-"Found a swap file by the name \""
-msgstr ""
-"\n"
-"Znalazณem plik wymiany o nazwie \""
-
-#: ../memline.c:3226
-msgid "While opening file \""
-msgstr "Podczas otwierania pliku \""
-
-#: ../memline.c:3239
-msgid " NEWER than swap file!\n"
-msgstr " NOWSZE od pliku wymiany!\n"
-
-#: ../memline.c:3244
-#, fuzzy
-msgid ""
-"\n"
-"(1) Another program may be editing the same file. If this is the case,\n"
-" be careful not to end up with two different instances of the same\n"
-" file when making changes."
-msgstr ""
-"\n"
-"(1) Pewnie inny program obrabia ten sam plik.\n"
-" Jeœli tak, bนdŸ ostroฟny, aby nie sko๑czyๆ z dwoma\n"
-" r๓ฟnymi wersjami tego samego pliku po zmianach.\n"
-
-#: ../memline.c:3245
-msgid " Quit, or continue with caution.\n"
-msgstr " Zako๑cz lub ostroฟnie kontynuuj.\n"
-
-#: ../memline.c:3246
-msgid "(2) An edit session for this file crashed.\n"
-msgstr "(2) Sesja edycji dla pliku zaณamaณa si๊.\n"
-
-#: ../memline.c:3247
-msgid " If this is the case, use \":recover\" or \"vim -r "
-msgstr " Jeœli tak, to uฟyj \":recover\" lub \"vim -r "
-
-#: ../memline.c:3249
-msgid ""
-"\"\n"
-" to recover the changes (see \":help recovery\").\n"
-msgstr ""
-"\"\n"
-" aby odzyskaๆ zmiany (zobacz \":help recovery)\").\n"
-
-#: ../memline.c:3250
-msgid " If you did this already, delete the swap file \""
-msgstr " Jeœli juฟ to zrobiณeœ, usu๑ plik wymiany \""
-
-#: ../memline.c:3252
-msgid ""
-"\"\n"
-" to avoid this message.\n"
-msgstr ""
-"\"\n"
-" aby uniknนๆ tej wiadomoœci.\n"
-
-#: ../memline.c:3450 ../memline.c:3452
-msgid "Swap file \""
-msgstr "Plik wymiany \""
-
-#: ../memline.c:3451 ../memline.c:3455
-msgid "\" already exists!"
-msgstr "\" juฟ istnieje!"
-
-#: ../memline.c:3457
-msgid "VIM - ATTENTION"
-msgstr "VIM - UWAGA"
-
-#: ../memline.c:3459
-msgid "Swap file already exists!"
-msgstr "Plik wymiany juฟ istnieje!"
-
-#: ../memline.c:3464
-msgid ""
-"&Open Read-Only\n"
-"&Edit anyway\n"
-"&Recover\n"
-"&Quit\n"
-"&Abort"
-msgstr ""
-"&Otw๓rz Read-Only\n"
-"&Edytuj pomimo\n"
-"O&dtw๓rz\n"
-"&Zako๑cz\n"
-"&Porzuๆ"
-
-#: ../memline.c:3467
-msgid ""
-"&Open Read-Only\n"
-"&Edit anyway\n"
-"&Recover\n"
-"&Delete it\n"
-"&Quit\n"
-"&Abort"
-msgstr ""
-"&Otw๓rz Read-Only\n"
-"&Edytuj pomimo\n"
-"O&dtw๓rz\n"
-"&Usu๑\n"
-"&Zako๑cz\n"
-"&Porzuๆ"
-
-#.
-#. * Change the ".swp" extension to find another file that can be used.
-#. * First decrement the last char: ".swo", ".swn", etc.
-#. * If that still isn't enough decrement the last but one char: ".svz"
-#. * Can happen when editing many "No Name" buffers.
-#.
-#. ".s?a"
-#. ".saa": tried enough, give up
-#: ../memline.c:3528
-msgid "E326: Too many swap files found"
-msgstr "E326: Znaleziono zbyt wiele plik๓w wymiany"
-
-#: ../memory.c:227
-#, c-format
-msgid "E342: Out of memory! (allocating %<PRIu64> bytes)"
-msgstr "E342: Brak pami๊ci! (rezerwacja %<PRIu64> bajt๓w)"
-
-#: ../menu.c:62
-msgid "E327: Part of menu-item path is not sub-menu"
-msgstr "E327: Cz๊œๆ tropu punktu menu nie okreœla podmenu"
-
-#: ../menu.c:63
-msgid "E328: Menu only exists in another mode"
-msgstr "E328: Menu istnieje tylko w innym trybie"
-
-#: ../menu.c:64
-#, c-format
-msgid "E329: No menu \"%s\""
-msgstr "E329: Nie ma menu \"%s\""
-
-#. Only a mnemonic or accelerator is not valid.
-#: ../menu.c:329
-msgid "E792: Empty menu name"
-msgstr "E792: Pusta nazwa menu"
-
-#: ../menu.c:340
-msgid "E330: Menu path must not lead to a sub-menu"
-msgstr "E330: Trop menu nie moฟe prowadziๆ do podmenu"
-
-#: ../menu.c:365
-msgid "E331: Must not add menu items directly to menu bar"
-msgstr "E331: Nie wolno dodawaๆ punkt๓w menu wprost do paska menu"
-
-#: ../menu.c:370
-msgid "E332: Separator cannot be part of a menu path"
-msgstr "E332: Separator nie moฟe byๆ cz๊œciน tropu menu"
-
-#. Now we have found the matching menu, and we list the mappings
-#. Highlight title
-#: ../menu.c:762
-msgid ""
-"\n"
-"--- Menus ---"
-msgstr ""
-"\n"
-"--- Menu ---"
-
-#: ../menu.c:1313
-msgid "E333: Menu path must lead to a menu item"
-msgstr "E333: Trop menu musi prowadziๆ do punktu menu"
-
-#: ../menu.c:1330
-#, c-format
-msgid "E334: Menu not found: %s"
-msgstr "E334: Nie znaleziono menu: %s"
-
-#: ../menu.c:1396
-#, c-format
-msgid "E335: Menu not defined for %s mode"
-msgstr "E335: Menu nie jest zdefiniowane dla trybu %s"
-
-#: ../menu.c:1426
-msgid "E336: Menu path must lead to a sub-menu"
-msgstr "E336: Trop menu musi prowadziๆ do podmenu"
-
-#: ../menu.c:1447
-msgid "E337: Menu not found - check menu names"
-msgstr "E337: Nie znaleziono menu - sprawdŸ nazwy menu"
-
-#: ../message.c:423
-#, c-format
-msgid "Error detected while processing %s:"
-msgstr "Wykryto bณนd podczas przetwarzania %s:"
-
-#: ../message.c:445
-#, c-format
-msgid "line %4ld:"
-msgstr "wiersz %4ld:"
-
-#: ../message.c:617
-#, c-format
-msgid "E354: Invalid register name: '%s'"
-msgstr "E354: Niewณaœciwa nazwa rejestru: '%s'"
-
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr "Opiekun komunikat๓w: Mikoณaj Machowski <mikmach@wp.pl>"
-
-#: ../message.c:986
-msgid "Interrupt: "
-msgstr "Przerwanie: "
-
-#: ../message.c:988
-msgid "Press ENTER or type command to continue"
-msgstr "Naciœnij ENTER lub wprowadŸ komend๊ aby kontynuowaๆ"
-
-#: ../message.c:1843
-#, c-format
-msgid "%s line %<PRId64>"
-msgstr "%s wiersz %<PRId64>"
-
-#: ../message.c:2392
-msgid "-- More --"
-msgstr "-- Wi๊cej --"
-
-#: ../message.c:2398
-msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "
-msgstr " SPACE/d/j: ekran/strona/wiersz w d๓ณ, b/u/k: do g๓ry, q: zako๑cz"
-
-#: ../message.c:3021 ../message.c:3031
-msgid "Question"
-msgstr "Pytanie"
-
-#: ../message.c:3023
-msgid ""
-"&Yes\n"
-"&No"
-msgstr ""
-"&Tak\n"
-"&Nie"
-
-#: ../message.c:3033
-msgid ""
-"&Yes\n"
-"&No\n"
-"&Cancel"
-msgstr ""
-"&Tak\n"
-"&Nie\n"
-"&Zako๑cz"
-
-#: ../message.c:3045
-msgid ""
-"&Yes\n"
-"&No\n"
-"Save &All\n"
-"&Discard All\n"
-"&Cancel"
-msgstr ""
-"&Tak\n"
-"&Nie\n"
-"Zapisz &wszystkie\n"
-"&Odrzuๆ wszystkie\n"
-"&Zako๑cz"
-
-#: ../message.c:3058
-msgid "E766: Insufficient arguments for printf()"
-msgstr "E766: Za maณo argument๓w dla printf()"
-
-#: ../message.c:3119
-msgid "E807: Expected Float argument for printf()"
-msgstr "E807: Spodziewany argument Zmiennoprzecinkowy w printf()"
-
-#: ../message.c:3873
-msgid "E767: Too many arguments to printf()"
-msgstr "E767: Za duฟo argument๓w dla printf()"
-
-#: ../misc1.c:2256
-msgid "W10: Warning: Changing a readonly file"
-msgstr "W10: OSTRZEฏENIE: Zmiany w pliku tylko do odczytu"
-
-#: ../misc1.c:2537
-msgid "Type number and <Enter> or click with mouse (empty cancels): "
-msgstr "Wpisz numer i <Enter> lub wybierz myszน (pusta wartoœๆ anuluje): "
-
-#: ../misc1.c:2539
-msgid "Type number and <Enter> (empty cancels): "
-msgstr "Wpisz numer i <Enter> (puste anuluje): "
-
-#: ../misc1.c:2585
-msgid "1 more line"
-msgstr "1 wiersz wi๊cej"
-
-#: ../misc1.c:2588
-msgid "1 line less"
-msgstr "1 wiersz mniej"
-
-#: ../misc1.c:2593
-#, c-format
-msgid "%<PRId64> more lines"
-msgstr "dodano %<PRId64> wierszy"
-
-#: ../misc1.c:2596
-#, c-format
-msgid "%<PRId64> fewer lines"
-msgstr "usuni๊to %<PRId64> wierszy"
-
-#: ../misc1.c:2599
-msgid " (Interrupted)"
-msgstr " (Przerwane)"
-
-#: ../misc1.c:2635
-msgid "Beep!"
-msgstr "Biiip!"
-
-#: ../misc2.c:738
-#, c-format
-msgid "Calling shell to execute: \"%s\""
-msgstr "Wywoณuj๊ powณok๊ do wykonania: \"%s\""
-
-#: ../normal.c:183
-msgid "E349: No identifier under cursor"
-msgstr "E349: Brak identyfikatora pod kursorem"
-
-#: ../normal.c:1866
-msgid "E774: 'operatorfunc' is empty"
-msgstr "E774: 'operatorfunc' jest pusta"
-
-#: ../normal.c:2637
-msgid "Warning: terminal cannot highlight"
-msgstr "OSTRZEฏENIE: terminal nie wykonuje podœwietlania"
-
-#: ../normal.c:2807
-msgid "E348: No string under cursor"
-msgstr "E348: Brak ciนgu pod kursorem"
-
-#: ../normal.c:3937
-msgid "E352: Cannot erase folds with current 'foldmethod'"
-msgstr "E352: Nie mog๊ skasowaๆ zwini๊cia z bieฟนcน 'foldmethod'"
-
-#: ../normal.c:5897
-msgid "E664: changelist is empty"
-msgstr "E664: lista zmian (changelist) jest pusta"
-
-#: ../normal.c:5899
-msgid "E662: At start of changelist"
-msgstr "E662: Na poczนtku listy zmian"
-
-#: ../normal.c:5901
-msgid "E663: At end of changelist"
-msgstr "E663: Na ko๑cu listy zmian"
-
-#: ../normal.c:7053
-msgid "Type :quit<Enter> to exit Nvim"
-msgstr "wprowadŸ :quit<Enter> zako๑czenie programu"
-
-#: ../ops.c:248
-#, c-format
-msgid "1 line %sed 1 time"
-msgstr "1 wiersz %sed 1 raz"
-
-#: ../ops.c:250
-#, c-format
-msgid "1 line %sed %d times"
-msgstr "1 wiersz %sed %d razy"
-
-#: ../ops.c:253
-#, c-format
-msgid "%<PRId64> lines %sed 1 time"
-msgstr "%<PRId64> wierszy %sed 1 raz"
-
-#: ../ops.c:256
-#, c-format
-msgid "%<PRId64> lines %sed %d times"
-msgstr "%<PRId64> wierszy %sed %d razy"
-
-#: ../ops.c:592
-#, c-format
-msgid "%<PRId64> lines to indent... "
-msgstr "%<PRId64> wierszy do wci๊cia... "
-
-#: ../ops.c:634
-msgid "1 line indented "
-msgstr "1 wiersz wci๊ty "
-
-#: ../ops.c:636
-#, c-format
-msgid "%<PRId64> lines indented "
-msgstr "%<PRId64> wierszy wci๊tych "
-
-#: ../ops.c:938
-msgid "E748: No previously used register"
-msgstr "E748: Brak poprzednio uฟytego rejestru"
-
-#. must display the prompt
-#: ../ops.c:1433
-msgid "cannot yank; delete anyway"
-msgstr "nie mog๊ skopiowaๆ, mimo to kasuj๊"
-
-#: ../ops.c:1929
-msgid "1 line changed"
-msgstr "1 wiersz zmieniono"
-
-#: ../ops.c:1931
-#, c-format
-msgid "%<PRId64> lines changed"
-msgstr "%<PRId64> wierszy zmieniono"
-
-#: ../ops.c:2521
-msgid "block of 1 line yanked"
-msgstr "skopiowano blok 1 wiersza"
-
-#: ../ops.c:2523
-msgid "1 line yanked"
-msgstr "1 wiersz skopiowano"
-
-#: ../ops.c:2525
-#, c-format
-msgid "block of %<PRId64> lines yanked"
-msgstr "%<PRId64> wierszy skopiowanych"
-
-#: ../ops.c:2528
-#, c-format
-msgid "%<PRId64> lines yanked"
-msgstr "%<PRId64> wierszy skopiowanych"
-
-#: ../ops.c:2710
-#, c-format
-msgid "E353: Nothing in register %s"
-msgstr "E353: Pusty rejestr %s"
-
-#. Highlight title
-#: ../ops.c:3185
-msgid ""
-"\n"
-"--- Registers ---"
-msgstr ""
-"\n"
-"--- Rejestry ---"
-
-#: ../ops.c:4455
-msgid "Illegal register name"
-msgstr "Niedozwolona nazwa rejestru"
-
-#: ../ops.c:4533
-msgid ""
-"\n"
-"# Registers:\n"
-msgstr ""
-"\n"
-"# Rejestry:\n"
-
-#: ../ops.c:4575
-#, c-format
-msgid "E574: Unknown register type %d"
-msgstr "E574: Nieznany typ rejestru %d"
-
-#: ../ops.c:5089
-#, c-format
-msgid "%<PRId64> Cols; "
-msgstr "%<PRId64> Kolumn; "
-
-#: ../ops.c:5097
-#, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Bytes"
-msgstr ""
-"Wybrano %s%<PRId64> z %<PRId64> Wierszy; %<PRId64> z %<PRId64> Sณ๓w; "
-"%<PRId64> z %<PRId64> Bajt๓w"
-
-#: ../ops.c:5105
-#, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Chars; %<PRId64> of %<PRId64> Bytes"
-msgstr ""
-"Wybrano %s%<PRId64> z %<PRId64> Wierszy; %<PRId64> z %<PRId64> Sณ๓w; "
-"%<PRId64> z %<PRId64> Znak๓w; %<PRId64> z %<PRId64> Bajt๓w"
-
-#: ../ops.c:5123
-#, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Byte "
-"%<PRId64> of %<PRId64>"
-msgstr ""
-"Kol %s z %s; Wiersz %<PRId64> z %<PRId64>; Sณowo %<PRId64> z %<PRId64>; Bajt "
-"%<PRId64> z %<PRId64>"
-
-#: ../ops.c:5133
-#, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Char "
-"%<PRId64> of %<PRId64>; Byte %<PRId64> of %<PRId64>"
-msgstr ""
-"Kol %s z %s; Wiersz %<PRId64> z %<PRId64>; Sณowo %<PRId64> z %<PRId64>; Znak "
-"%<PRId64> z %<PRId64>; Bajt %<PRId64> z %<PRId64>"
-
-#: ../ops.c:5146
-#, c-format
-msgid "(+%<PRId64> for BOM)"
-msgstr "(+%<PRId64> dla BOM)"
-
-#: ../option.c:1238
-msgid "%<%f%h%m%=Page %N"
-msgstr "%<%f%h%m%=Strona %N"
-
-#: ../option.c:1574
-msgid "Thanks for flying Vim"
-msgstr "Dzi๊ki za lot Vimem"
-
-#. found a mismatch: skip
-#: ../option.c:2698
-msgid "E518: Unknown option"
-msgstr "E518: Nieznana opcja"
-
-#: ../option.c:2709
-msgid "E519: Option not supported"
-msgstr "E519: Opcja nie jest wspomagana"
-
-#: ../option.c:2740
-msgid "E520: Not allowed in a modeline"
-msgstr "E520: Niedozwolone w modeline"
-
-#: ../option.c:2815
-msgid "E846: Key code not set"
-msgstr "E846: Kod klucza nie jest ustawiony"
-
-#: ../option.c:2924
-msgid "E521: Number required after ="
-msgstr "E521: Po = wymagany jest numer"
-
-#: ../option.c:3226 ../option.c:3864
-msgid "E522: Not found in termcap"
-msgstr "E522: Nie znaleziono w termcap"
-
-#: ../option.c:3335
-#, c-format
-msgid "E539: Illegal character <%s>"
-msgstr "E539: Niedozwolony znak <%s>"
-
-#: ../option.c:3862
-msgid "E529: Cannot set 'term' to empty string"
-msgstr "E529: Nie mog๊ ustawiๆ 'term' na pusty ciนg"
-
-#: ../option.c:3885
-msgid "E589: 'backupext' and 'patchmode' are equal"
-msgstr "E589: 'backupext' i 'patchmode' sน toฟsame"
-
-#: ../option.c:3964
-msgid "E834: Conflicts with value of 'listchars'"
-msgstr "E834: Konflikty wartoœci 'listchars'"
-
-#: ../option.c:3966
-msgid "E835: Conflicts with value of 'fillchars'"
-msgstr "E835: Konflikty wartoœci 'fillchars'"
-
-#: ../option.c:4163
-msgid "E524: Missing colon"
-msgstr "E524: Brak dwukropka"
-
-#: ../option.c:4165
-msgid "E525: Zero length string"
-msgstr "E525: Ciนg o zerowej dณugoœci"
-
-#: ../option.c:4220
-#, c-format
-msgid "E526: Missing number after <%s>"
-msgstr "E526: Brak numeru po <%s>"
-
-#: ../option.c:4232
-msgid "E527: Missing comma"
-msgstr "E527: Brak przecinka"
-
-#: ../option.c:4239
-msgid "E528: Must specify a ' value"
-msgstr "E528: Musi okreœlaๆ wartoœๆ '"
-
-#: ../option.c:4271
-msgid "E595: contains unprintable or wide character"
-msgstr "E595: zawiera niewyœwietlalny lub szeroki znak"
-
-#: ../option.c:4469
-#, c-format
-msgid "E535: Illegal character after <%c>"
-msgstr "E535: Niedozwolony znak po <%c>"
-
-#: ../option.c:4534
-msgid "E536: comma required"
-msgstr "E536: wymagany przecinek"
-
-#: ../option.c:4543
-#, c-format
-msgid "E537: 'commentstring' must be empty or contain %s"
-msgstr "E537: 'commentstring' musi byๆ pusty lub zawieraๆ %s"
-
-#: ../option.c:4928
-msgid "E540: Unclosed expression sequence"
-msgstr "E540: Niedomkni๊ty ciนg wyraฟe๑"
-
-#: ../option.c:4932
-msgid "E541: too many items"
-msgstr "E541: zbyt wiele element๓w"
-
-#: ../option.c:4934
-msgid "E542: unbalanced groups"
-msgstr "E542: niezbalansowane grupy"
-
-#: ../option.c:5148
-msgid "E590: A preview window already exists"
-msgstr "E590: okno podglนdu juฟ istnieje"
-
-#: ../option.c:5311
-msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'"
-msgstr "W17: Arabski wymaga UTF-8, zr๓b ':set encoding=utf-8'"
-
-#: ../option.c:5623
-#, c-format
-msgid "E593: Need at least %d lines"
-msgstr "E593: Potrzebuj๊ przynajmniej %d wierszy"
-
-#: ../option.c:5631
-#, c-format
-msgid "E594: Need at least %d columns"
-msgstr "E594: Potrzebuj๊ przynajmniej %d kolumn"
-
-#: ../option.c:6011
-#, c-format
-msgid "E355: Unknown option: %s"
-msgstr "E355: Nieznana opcja: %s"
-
-#. There's another character after zeros or the string
-#. * is empty. In both cases, we are trying to set a
-#. * num option using a string.
-#: ../option.c:6037
-#, c-format
-msgid "E521: Number required: &%s = '%s'"
-msgstr "E521: Wymagana Liczba: &%s = '%s'"
-
-#: ../option.c:6149
-msgid ""
-"\n"
-"--- Terminal codes ---"
-msgstr ""
-"\n"
-"--- Kody terminala ---"
-
-#: ../option.c:6151
-msgid ""
-"\n"
-"--- Global option values ---"
-msgstr ""
-"\n"
-"--- Globalne wartoœci opcji ---"
-
-#: ../option.c:6153
-msgid ""
-"\n"
-"--- Local option values ---"
-msgstr ""
-"\n"
-"--- Lokalne wartoœci opcji ---"
-
-#: ../option.c:6155
-msgid ""
-"\n"
-"--- Options ---"
-msgstr ""
-"\n"
-"--- Opcje ---"
-
-#: ../option.c:6816
-msgid "E356: get_varp ERROR"
-msgstr "E356: BฃฅD get_varp"
-
-#: ../option.c:7696
-#, c-format
-msgid "E357: 'langmap': Matching character missing for %s"
-msgstr "E357: 'langmap': Brak pasujนcego znaku dla %s"
-
-#: ../option.c:7715
-#, c-format
-msgid "E358: 'langmap': Extra characters after semicolon: %s"
-msgstr "E358: 'langmap': Dodatkowe znaki po œredniku: %s"
-
-#: ../os/shell.c:194
-msgid ""
-"\n"
-"Cannot execute shell "
-msgstr ""
-"\n"
-"Nie mog๊ wykonaๆ powณoki "
-
-#: ../os/shell.c:439
-msgid ""
-"\n"
-"shell returned "
-msgstr ""
-"\n"
-"powณoka zwr๓ciณa "
-
-#: ../os_unix.c:465 ../os_unix.c:471
-msgid ""
-"\n"
-"Could not get security context for "
-msgstr ""
-"\n"
-"Nie mog๊ uzyskaๆ kontekstu bezpiecze๑stwa dla"
-
-#: ../os_unix.c:479
-msgid ""
-"\n"
-"Could not set security context for "
-msgstr ""
-"\n"
-"Nie moฟna uzyskaๆ kontekstu bezpiecze๑stwa dla"
-
-#: ../os_unix.c:1558 ../os_unix.c:1647
-#, c-format
-msgid "dlerror = \"%s\""
-msgstr "dlerror = \"%s\""
-
-#: ../path.c:1449
-#, c-format
-msgid "E447: Can't find file \"%s\" in path"
-msgstr "E447: Nie mog๊ znaleŸๆ pliku \"%s\" w tropie"
-
-#: ../quickfix.c:359
-#, c-format
-msgid "E372: Too many %%%c in format string"
-msgstr "E372: Zbyt wiele %%%c w ciนgu formatujนcym"
-
-#: ../quickfix.c:371
-#, c-format
-msgid "E373: Unexpected %%%c in format string"
-msgstr "E373: Nieoczekiwane %%%c w ciนgu formatujนcym"
-
-#: ../quickfix.c:420
-msgid "E374: Missing ] in format string"
-msgstr "E374: Brak ] w ciนgu formatujนcym"
-
-#: ../quickfix.c:431
-#, c-format
-msgid "E375: Unsupported %%%c in format string"
-msgstr "E375: Niewspomagane %%%c w ciนgu formatujนcym"
-
-#: ../quickfix.c:448
-#, c-format
-msgid "E376: Invalid %%%c in format string prefix"
-msgstr "E376: Niepoprawne %%%c w prefiksie ciนgu formatujนcego"
-
-#: ../quickfix.c:454
-#, c-format
-msgid "E377: Invalid %%%c in format string"
-msgstr "E377: Niepoprawne %%%c w ciนgu formatujนcym"
-
-#. nothing found
-#: ../quickfix.c:477
-msgid "E378: 'errorformat' contains no pattern"
-msgstr "E378: 'errorformat' nie zawiera wzorca"
-
-#: ../quickfix.c:695
-msgid "E379: Missing or empty directory name"
-msgstr "E379: Pusta nazwa katalogu lub jej brak"
-
-#: ../quickfix.c:1305
-msgid "E553: No more items"
-msgstr "E553: Nie ma wi๊cej element๓w"
-
-#: ../quickfix.c:1674
-#, c-format
-msgid "(%d of %d)%s%s: "
-msgstr "(%d z %d)%s%s: "
-
-#: ../quickfix.c:1676
-msgid " (line deleted)"
-msgstr " (wiersz skasowany)"
-
-#: ../quickfix.c:1863
-msgid "E380: At bottom of quickfix stack"
-msgstr "E380: Na dole stosu quickfix"
-
-#: ../quickfix.c:1869
-msgid "E381: At top of quickfix stack"
-msgstr "E381: Na g๓rze stosu quickfix"
-
-#: ../quickfix.c:1880
-#, c-format
-msgid "error list %d of %d; %d errors"
-msgstr "lista bณ๊d๓w %d z %d; %d bณ๊d๓w"
-
-#: ../quickfix.c:2427
-msgid "E382: Cannot write, 'buftype' option is set"
-msgstr "E382: Nie mog๊ zapisaๆ, opcja 'buftype' jest ustawiona"
-
-#: ../quickfix.c:2812
-msgid "E683: File name missing or invalid pattern"
-msgstr "E683: Brak nazwy pliku lub niewณaœciwa œcieฟka"
-
-#: ../quickfix.c:2911
-#, c-format
-msgid "Cannot open file \"%s\""
-msgstr "Nie mog๊ otworzyๆ pliku \"%s\""
-
-#: ../quickfix.c:3429
-msgid "E681: Buffer is not loaded"
-msgstr "E681: Bufor nie jest zaณadowany"
-
-#: ../quickfix.c:3487
-msgid "E777: String or List expected"
-msgstr "E777: Oczekiwaณem na ณa๑cuch lub list๊"
-
-#: ../regexp.c:359
-#, c-format
-msgid "E369: invalid item in %s%%[]"
-msgstr "E369: Niewณaœciwy element w %s%%[]"
-
-#: ../regexp.c:374
-#, c-format
-msgid "E769: Missing ] after %s["
-msgstr "E769: Brak ] po %s["
-
-#: ../regexp.c:375
-#, c-format
-msgid "E53: Unmatched %s%%("
-msgstr "E53: Niesparowany %s%%("
-
-#: ../regexp.c:376
-#, c-format
-msgid "E54: Unmatched %s("
-msgstr "E54: Niesparowany %s("
-
-#: ../regexp.c:377
-#, c-format
-msgid "E55: Unmatched %s)"
-msgstr "E55: Niesparowany %s)"
-
-#: ../regexp.c:378
-msgid "E66: \\z( not allowed here"
-msgstr "E66: \\z( jest niedozwolone w tym miejscu"
-
-#: ../regexp.c:379
-msgid "E67: \\z1 et al. not allowed here"
-msgstr "E67: \\z1 i podobne sน niedozwolone w tym miejscu"
-
-#: ../regexp.c:380
-#, c-format
-msgid "E69: Missing ] after %s%%["
-msgstr "E69: Brak ] po %s%%["
-
-#: ../regexp.c:381
-#, c-format
-msgid "E70: Empty %s%%[]"
-msgstr "E70: Pusty %s%%[]"
-
-#: ../regexp.c:1209 ../regexp.c:1224
-msgid "E339: Pattern too long"
-msgstr "E339: Zbyt dณugi wzorzec"
-
-#: ../regexp.c:1371
-msgid "E50: Too many \\z("
-msgstr "E50: Zbyt wiele \\z("
-
-#: ../regexp.c:1378
-#, c-format
-msgid "E51: Too many %s("
-msgstr "E51: Zbyt wiele %s("
-
-#: ../regexp.c:1427
-msgid "E52: Unmatched \\z("
-msgstr "E52: Niesparowany \\z("
-
-#: ../regexp.c:1637
-#, c-format
-msgid "E59: invalid character after %s@"
-msgstr "E59: niedozwolony znak po %s@"
-
-#: ../regexp.c:1672
-#, c-format
-msgid "E60: Too many complex %s{...}s"
-msgstr "E60: Zbyt wiele zณoฟonych %s{...}"
-
-#: ../regexp.c:1687
-#, c-format
-msgid "E61: Nested %s*"
-msgstr "E61: Zagnieฟdฟone %s*"
-
-#: ../regexp.c:1690
-#, c-format
-msgid "E62: Nested %s%c"
-msgstr "E62: Zagnieฟdฟone %s%c"
-
-#: ../regexp.c:1800
-msgid "E63: invalid use of \\_"
-msgstr "E63: Niedozwolone uฟycie \\_"
-
-#: ../regexp.c:1850
-#, c-format
-msgid "E64: %s%c follows nothing"
-msgstr "E64: %s%c po niczym"
-
-#: ../regexp.c:1902
-msgid "E65: Illegal back reference"
-msgstr "E65: Niewณaœciwe odwoณanie wsteczne"
-
-#: ../regexp.c:1943
-msgid "E68: Invalid character after \\z"
-msgstr "E68: niedopuszczalny znak po \\z"
-
-#: ../regexp.c:2049 ../regexp_nfa.c:1296
-#, c-format
-msgid "E678: Invalid character after %s%%[dxouU]"
-msgstr "E678: Niedozwolony znak po %s%%[dxouU]"
-
-#: ../regexp.c:2107
-#, c-format
-msgid "E71: Invalid character after %s%%"
-msgstr "E71: Niedozwolony znak po %s%%"
-
-#: ../regexp.c:3017
-#, c-format
-msgid "E554: Syntax error in %s{...}"
-msgstr "E554: Bณนd skณadni w %s{...}"
-
-#: ../regexp.c:3805
-msgid "External submatches:\n"
-msgstr "Zewn๊trzne poddopasowania:\n"
-
-#: ../regexp.c:7022
-msgid ""
-"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be "
-"used "
-msgstr ""
-"E:864: \\%#= moฟe byๆ tylko przed 0, 1 lub 2. Zostanie uฟyty silnik "
-"automatyczny"
-
-#: ../regexp_nfa.c:239
-msgid "E865: (NFA) Regexp end encountered prematurely"
-msgstr "E865: (NFA) przedwczesny koniec wyraฟenia regularnego"
-
-#: ../regexp_nfa.c:240
-#, c-format
-msgid "E866: (NFA regexp) Misplaced %c"
-msgstr "E866: (wyraฟenie regularne NFA) Niepoprawnie umieszczone %c"
-
-#: ../regexp_nfa.c:242
-#, c-format
-msgid "E877: (NFA regexp) Invalid character class: %<PRId64>"
-msgstr ""
-
-#: ../regexp_nfa.c:1261
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\z%c'"
-msgstr "E867: (NFA) Nieznany operator '\\z%c'"
-
-#: ../regexp_nfa.c:1387
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\%%%c'"
-msgstr "E867: (NFA) Nieznany operator '\\%%%c'"
-
-#: ../regexp_nfa.c:1802
-#, c-format
-msgid "E869: (NFA) Unknown operator '\\@%c'"
-msgstr "E869: (NFA) Nieznany operator '\\@%c'"
-
-#: ../regexp_nfa.c:1831
-msgid "E870: (NFA regexp) Error reading repetition limits"
-msgstr ""
-"E870: (wyraฟenie regularne NFA) Bณนd przy odczytywaniu limit๓w powt๓rze๑"
-
-#. Can't have a multi follow a multi.
-#: ../regexp_nfa.c:1895
-msgid "E871: (NFA regexp) Can't have a multi follow a multi !"
-msgstr ""
-"E871: (wyraฟenie regularne NFA) wielokrotne nie moฟe byๆ po wielokrotnym!"
-
-#. Too many `('
-#: ../regexp_nfa.c:2037
-msgid "E872: (NFA regexp) Too many '('"
-msgstr "E872: (wyraฟenie regularne NFA) Zbyt duฟo '('"
-
-#: ../regexp_nfa.c:2042
-msgid "E879: (NFA regexp) Too many \\z("
-msgstr "E879: (wyraฟenie regularne NFA) Za duฟo \\z("
-
-#: ../regexp_nfa.c:2066
-msgid "E873: (NFA regexp) proper termination error"
-msgstr "E873: (wyraฟenie regularne NFA) bณนd poprawnego zako๑czenia"
-
-#: ../regexp_nfa.c:2599
-msgid "E874: (NFA) Could not pop the stack !"
-msgstr "E874: (NFA) Nie moฟna zdjนๆ elementu ze stosu!"
-
-#: ../regexp_nfa.c:3298
-msgid ""
-"E875: (NFA regexp) (While converting from postfix to NFA), too many states "
-"left on stack"
-msgstr ""
-"E875: (wyraฟenie regularne NFA) (w trakcie konwersji postfix do NFA), za "
-"wiele stan๓w na stosie"
-
-#: ../regexp_nfa.c:3302
-msgid "E876: (NFA regexp) Not enough space to store the whole NFA "
-msgstr "E876: (wyraฟenie regularne NFA) Nie ma miejsca na caณe NFA "
-
-#: ../regexp_nfa.c:4571 ../regexp_nfa.c:4869
-msgid ""
-"Could not open temporary log file for writing, displaying on stderr ... "
-msgstr ""
-"Nie moฟna otworzyๆ do zapisu tymczasowego pliku, pokazuj๊ na stderr... "
-
-#: ../regexp_nfa.c:4840
-#, c-format
-msgid "(NFA) COULD NOT OPEN %s !"
-msgstr "(NFA) NIE MOฏNA OTWORZYฦ %s !"
-
-#: ../regexp_nfa.c:6049
-msgid "Could not open temporary log file for writing "
-msgstr "Nie moฟna otworzyๆ do zapisu tymczasowego pliku logowania"
-
-#: ../screen.c:7435
-msgid " VREPLACE"
-msgstr " V-ZAMIANA"
-
-#: ../screen.c:7437
-msgid " REPLACE"
-msgstr " ZAMIANA"
-
-#: ../screen.c:7440
-msgid " REVERSE"
-msgstr " NEGATYW"
-
-#: ../screen.c:7441
-msgid " INSERT"
-msgstr " WPROWADZANIE"
-
-#: ../screen.c:7443
-msgid " (insert)"
-msgstr " (wprowadzanie)"
-
-#: ../screen.c:7445
-msgid " (replace)"
-msgstr " (zamiana)"
-
-#: ../screen.c:7447
-msgid " (vreplace)"
-msgstr " (v-zamiana)"
-
-#: ../screen.c:7449
-msgid " Hebrew"
-msgstr " Hebrajski"
-
-#: ../screen.c:7454
-msgid " Arabic"
-msgstr " Arabski"
-
-#: ../screen.c:7456
-msgid " (lang)"
-msgstr " (j๊zyk)"
-
-#: ../screen.c:7459
-msgid " (paste)"
-msgstr " (wklejanie)"
-
-#: ../screen.c:7469
-msgid " VISUAL"
-msgstr " WIZUALNY"
-
-#: ../screen.c:7470
-msgid " VISUAL LINE"
-msgstr " WIZUALNY LINIOWY"
-
-#: ../screen.c:7471
-msgid " VISUAL BLOCK"
-msgstr " WIZUALNY BLOKOWY"
-
-#: ../screen.c:7472
-msgid " SELECT"
-msgstr " ZAZNACZANIE"
-
-#: ../screen.c:7473
-msgid " SELECT LINE"
-msgstr " ZAZNACZANIE LINIOWE"
-
-#: ../screen.c:7474
-msgid " SELECT BLOCK"
-msgstr " ZAZNACZANIE BLOKOWE"
-
-#: ../screen.c:7486 ../screen.c:7541
-msgid "recording"
-msgstr "zapis"
-
-#: ../search.c:487
-#, c-format
-msgid "E383: Invalid search string: %s"
-msgstr "E383: Niewณaœciwy ciนg do szukania: %s"
-
-#: ../search.c:832
-#, c-format
-msgid "E384: search hit TOP without match for: %s"
-msgstr "E384: szukanie dobiณo GำRY bez znalezienia: %s"
-
-#: ../search.c:835
-#, c-format
-msgid "E385: search hit BOTTOM without match for: %s"
-msgstr "E385: szukanie dobiณo KOัCA bez znalezienia : %s"
-
-#: ../search.c:1200
-msgid "E386: Expected '?' or '/' after ';'"
-msgstr "E386: Oczekuj๊ '?' lub '/' po ';'"
-
-#: ../search.c:4085
-msgid " (includes previously listed match)"
-msgstr " (zawiera poprzednio wymienione dopasowanie)"
-
-#. cursor at status line
-#: ../search.c:4104
-msgid "--- Included files "
-msgstr "--- Zawarte pliki "
-
-#: ../search.c:4106
-msgid "not found "
-msgstr "nie znaleziono"
-
-#: ../search.c:4107
-msgid "in path ---\n"
-msgstr "w tropie ---\n"
-
-#: ../search.c:4168
-msgid " (Already listed)"
-msgstr " (Juฟ wymienione)"
-
-#: ../search.c:4170
-msgid " NOT FOUND"
-msgstr " NIE ZNALEZIONO"
-
-#: ../search.c:4211
-#, c-format
-msgid "Scanning included file: %s"
-msgstr "Przeglนd wณนczonego pliku: %s"
-
-#: ../search.c:4216
-#, c-format
-msgid "Searching included file %s"
-msgstr "Przeszukiwanie wณนczonego pliku %s"
-
-#: ../search.c:4405
-msgid "E387: Match is on current line"
-msgstr "E387: Wzorzec pasuje w bieฟนcym wierszu"
-
-#: ../search.c:4517
-msgid "All included files were found"
-msgstr "Wszelkie wณนczane pliki odnaleziono"
-
-#: ../search.c:4519
-msgid "No included files"
-msgstr "Brak wณนczanych plik๓w"
-
-#: ../search.c:4527
-msgid "E388: Couldn't find definition"
-msgstr "E388: Nie znalazณem definicji"
-
-#: ../search.c:4529
-msgid "E389: Couldn't find pattern"
-msgstr "E389: Nie znalazณem wzorca"
-
-#: ../search.c:4668
-msgid "Substitute "
-msgstr "Podstawienie "
-
-#: ../search.c:4681
-#, c-format
-msgid ""
-"\n"
-"# Last %sSearch Pattern:\n"
-"~"
-msgstr ""
-"\n"
-"# Ostatni %sWyszukiwany wzorzec:\n"
-"~"
-
-#: ../spell.c:951
-msgid "E759: Format error in spell file"
-msgstr "E759: Nieprawidณowy format pliku sprawdzania pisowni"
-
-#: ../spell.c:952
-msgid "E758: Truncated spell file"
-msgstr "E758: Obci๊ty plik sprawdzania pisowni"
-
-#: ../spell.c:953
-#, c-format
-msgid "Trailing text in %s line %d: %s"
-msgstr "Zb๊dny tekst w %s wiersz %d: %s"
-
-#: ../spell.c:954
-#, c-format
-msgid "Affix name too long in %s line %d: %s"
-msgstr "Za dณuga nazwa afiksu w %s wiersz %d: %s"
-
-#: ../spell.c:955
-msgid "E761: Format error in affix file FOL, LOW or UPP"
-msgstr "E761: Bณนd formatu w pliku afiks๓w FOL, LOW lub UPP"
-
-#: ../spell.c:957
-msgid "E762: Character in FOL, LOW or UPP is out of range"
-msgstr "E762: Znak w FOL, LOW lub UPP jest poza zasi๊giem"
-
-#: ../spell.c:958
-msgid "Compressing word tree..."
-msgstr "Kompresja drzewa sณ๓w..."
-
-#: ../spell.c:1951
-msgid "E756: Spell checking is not enabled"
-msgstr "E756: Sprawdzanie pisowni nie jest wณนczone"
-
-#: ../spell.c:2249
-#, c-format
-msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
-msgstr ""
-"Ostrzeฟenie: Nie mog๊ znaleŸๆ listy sณ๓w \"%s.%s.spl\" lub \"%s.ascii.spl\""
-
-#: ../spell.c:2473
-#, c-format
-msgid "Reading spell file \"%s\""
-msgstr "Odczytuj๊ plik sprawdzania pisowni \"%s\""
-
-#: ../spell.c:2496
-msgid "E757: This does not look like a spell file"
-msgstr "E757: To nie wyglนda na plik sprawdzania pisowni"
-
-#: ../spell.c:2501
-msgid "E771: Old spell file, needs to be updated"
-msgstr "E771: Stary plik sprawdzania pisowni, wymagane uaktualnienie"
-
-#: ../spell.c:2504
-msgid "E772: Spell file is for newer version of Vim"
-msgstr "E772: Plik sprawdzania pisowni dla nowszej wersji Vima"
-
-#: ../spell.c:2602
-msgid "E770: Unsupported section in spell file"
-msgstr "E770: Niewspierana sekcja w pliku sprawdzania pisowni"
-
-#: ../spell.c:3762
-#, c-format
-msgid "Warning: region %s not supported"
-msgstr "Ostrzeฟenie: region %s nie jest wspierany"
-
-#: ../spell.c:4550
-#, c-format
-msgid "Reading affix file %s ..."
-msgstr "Czytam plik afiks๓w %s ..."
-
-#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
-#, c-format
-msgid "Conversion failure for word in %s line %d: %s"
-msgstr "Konwersja nie powiodณa si๊ dla wyrazu w %s wierszu %d: %s"
-
-#: ../spell.c:4630 ../spell.c:6170
-#, c-format
-msgid "Conversion in %s not supported: from %s to %s"
-msgstr "Konwersja w %s nie jest wspierana: od %s do %s"
-
-#: ../spell.c:4642
-#, c-format
-msgid "Invalid value for FLAG in %s line %d: %s"
-msgstr "Nieprawidณowa wartoœๆ FLAG w %s wierz %d: %s"
-
-#: ../spell.c:4655
-#, c-format
-msgid "FLAG after using flags in %s line %d: %s"
-msgstr "FLAG po uฟyciu flag w %s wiersz %d: %s"
-
-#: ../spell.c:4723
-#, c-format
-msgid ""
-"Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line "
-"%d"
-msgstr ""
-"Definiowanie COMPOUNDFORBIDFLAG po PFX moฟe skutkowaๆ zณym wynikiem w %s "
-"wiersz %d"
-
-#: ../spell.c:4731
-#, c-format
-msgid ""
-"Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line "
-"%d"
-msgstr ""
-"Definiowanie COMPOUNDPERMITFLAG po PFX moฟe skutkowaๆ zณym wynikiem w %s "
-"wiersz %d"
-
-#: ../spell.c:4747
-#, c-format
-msgid "Wrong COMPOUNDRULES value in %s line %d: %s"
-msgstr "Zณa wartoœๆ COMPOUNDRULES w %s wiersz %d: %s"
-
-#: ../spell.c:4771
-#, c-format
-msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s"
-msgstr "Zณa wartoœๆ COMPOUNDWORDMAX w %s wiersz %d: %s"
-
-#: ../spell.c:4777
-#, c-format
-msgid "Wrong COMPOUNDMIN value in %s line %d: %s"
-msgstr "Zณa wartoœๆ COMPOUNDMIM w %s wiersz %d: %s"
-
-#: ../spell.c:4783
-#, c-format
-msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s"
-msgstr "Zณa wartoœๆ COMPOUNDSYLMAX w %s wiersz %d: %s"
-
-#: ../spell.c:4795
-#, c-format
-msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"
-msgstr "Zณa wartoœๆ CHECKCOMPOUNDPATTERN w %s wiersz %d: %s"
-
-#: ../spell.c:4847
-#, c-format
-msgid "Different combining flag in continued affix block in %s line %d: %s"
-msgstr "R๓ฟne flagi zณoฟe๑ w kontynuowanym bloku afiksu w %s wiersz %d: %s"
-
-#: ../spell.c:4850
-#, c-format
-msgid "Duplicate affix in %s line %d: %s"
-msgstr "Powt๓rzony afiks w %s wiersz %d: %s"
-
-#: ../spell.c:4871
-#, c-format
-msgid ""
-"Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s "
-"line %d: %s"
-msgstr ""
-"Afiks uฟyty takฟe dla BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST w "
-"%s wiersz %d: %s"
-
-#: ../spell.c:4893
-#, c-format
-msgid "Expected Y or N in %s line %d: %s"
-msgstr "Oczekiwano Y lub N w %s wierszu %d: %s"
-
-#: ../spell.c:4968
-#, c-format
-msgid "Broken condition in %s line %d: %s"
-msgstr "Bณ๊dny warunek w %s wiersz %d: %s"
-
-#: ../spell.c:5091
-#, c-format
-msgid "Expected REP(SAL) count in %s line %d"
-msgstr "Oczekiwano iloœci REP(SAL) w %s wierszu %d"
-
-#: ../spell.c:5120
-#, c-format
-msgid "Expected MAP count in %s line %d"
-msgstr "Oczekiwano iloœci MAP w %s wierszu %d"
-
-#: ../spell.c:5132
-#, c-format
-msgid "Duplicate character in MAP in %s line %d"
-msgstr "Powt๓rzony znak w MAP w %s wierszu %d"
-
-#: ../spell.c:5176
-#, c-format
-msgid "Unrecognized or duplicate item in %s line %d: %s"
-msgstr "Nieznany lub powt๓rzony element w %s wierszu %d: %s"
-
-#: ../spell.c:5197
-#, c-format
-msgid "Missing FOL/LOW/UPP line in %s"
-msgstr "Brak wiersza FOL/LOW/UPP w %s"
-
-#: ../spell.c:5220
-msgid "COMPOUNDSYLMAX used without SYLLABLE"
-msgstr "COMPOUNDSYLMAX uฟyty bez SYLLABLE"
-
-#: ../spell.c:5236
-msgid "Too many postponed prefixes"
-msgstr "Zbyt wiele op๓Ÿnionych prefiks๓w"
-
-#: ../spell.c:5238
-msgid "Too many compound flags"
-msgstr "Zbyt wiele flag zณoฟe๑"
-
-#: ../spell.c:5240
-msgid "Too many postponed prefixes and/or compound flags"
-msgstr "Zbyt wiele op๓Ÿnionych prefiks๓w i/lub flag zณoฟe๑"
-
-#: ../spell.c:5250
-#, c-format
-msgid "Missing SOFO%s line in %s"
-msgstr "Brak wiersza SOFO%s wiersz w %s"
-
-#: ../spell.c:5253
-#, c-format
-msgid "Both SAL and SOFO lines in %s"
-msgstr "Wiersze SAL i SOFO w %s"
-
-#: ../spell.c:5331
-#, c-format
-msgid "Flag is not a number in %s line %d: %s"
-msgstr "Flaga nie jest liczbน w %s wiersz %d: %s"
-
-#: ../spell.c:5334
-#, c-format
-msgid "Illegal flag in %s line %d: %s"
-msgstr "Nieprawidณowa flaga w %s wiersz %d: %s"
-
-#: ../spell.c:5493 ../spell.c:5501
-#, c-format
-msgid "%s value differs from what is used in another .aff file"
-msgstr "Wartoœๆ %s r๓ฟni si๊ od tej uฟytej w innym pliku .aff"
-
-#: ../spell.c:5602
-#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "Czytam plik sณownika %s ..."
-
-#: ../spell.c:5611
-#, c-format
-msgid "E760: No word count in %s"
-msgstr "E760: Brak iloœci sณ๓w w %s"
-
-#: ../spell.c:5669
-#, c-format
-msgid "line %6d, word %6d - %s"
-msgstr "wiersz %6d, sณowo %6d - %s"
-
-# c-format
-#: ../spell.c:5691
-#, c-format
-msgid "Duplicate word in %s line %d: %s"
-msgstr "Powt๓rzony wyraz w %s wierszu %d: %s"
-
-# c-format
-#: ../spell.c:5694
-#, c-format
-msgid "First duplicate word in %s line %d: %s"
-msgstr "Pierwszy powt๓rzony wyraz w %s wiersz %d: %s"
-
-# c-format
-#: ../spell.c:5746
-#, c-format
-msgid "%d duplicate word(s) in %s"
-msgstr "%d powt๓rzony(ch) wyraz(๓w) w %s"
-
-#: ../spell.c:5748
-#, c-format
-msgid "Ignored %d word(s) with non-ASCII characters in %s"
-msgstr "Zignorowaณem %d sณ๓w ze znakami nie ASCII w %s"
-
-#: ../spell.c:6115
-#, c-format
-msgid "Reading word file %s ..."
-msgstr "Odczytuj๊ plik wyraz๓w %s ..."
-
-#: ../spell.c:6155
-#, c-format
-msgid "Duplicate /encoding= line ignored in %s line %d: %s"
-msgstr "Zignorowano powt๓rzony wiersz /encoding= w %s wierszu %d: %s"
-
-#: ../spell.c:6159
-#, c-format
-msgid "/encoding= line after word ignored in %s line %d: %s"
-msgstr "Zignorowano wiersz /encoding= po wyrazie w %s wierszu %d: %s"
-
-#: ../spell.c:6180
-#, c-format
-msgid "Duplicate /regions= line ignored in %s line %d: %s"
-msgstr "Powt๓rzony wiersz /regions= zignorowano w %s wierszu %d: %s"
-
-#: ../spell.c:6185
-#, c-format
-msgid "Too many regions in %s line %d: %s"
-msgstr "Za duฟo region๓w w %s wiersz %d: %s"
-
-#: ../spell.c:6198
-#, c-format
-msgid "/ line ignored in %s line %d: %s"
-msgstr "wiersz / zignorowano w %s wierszu %d: %s"
-
-#: ../spell.c:6224
-#, c-format
-msgid "Invalid region nr in %s line %d: %s"
-msgstr "Nieprawidณowy numer regionu w %s wierszu %d: %s"
-
-#: ../spell.c:6230
-#, c-format
-msgid "Unrecognized flags in %s line %d: %s"
-msgstr "Nieznane flagi w %s wiersz %d: %s"
-
-#: ../spell.c:6257
-#, c-format
-msgid "Ignored %d words with non-ASCII characters"
-msgstr "Zignorowaณem %d sณ๓w ze znakami nie ASCII"
-
-#: ../spell.c:6656
-#, c-format
-msgid "Compressed %d of %d nodes; %d (%d%%) remaining"
-msgstr "Skompresowano %d z %d w๊zณ๓w; pozostaje %d (%d%%)"
-
-#: ../spell.c:7340
-msgid "Reading back spell file..."
-msgstr "Odczytuj๊ plik sprawdzania pisowni..."
-
-#. Go through the trie of good words, soundfold each word and add it to
-#. the soundfold trie.
-#: ../spell.c:7357
-msgid "Performing soundfolding..."
-msgstr "Wykonuj๊ kompresj๊ dŸwi๊kowน..."
-
-#: ../spell.c:7368
-#, c-format
-msgid "Number of words after soundfolding: %<PRId64>"
-msgstr "Liczba sณ๓w po kompresji dŸwi๊kowej: %<PRId64>"
-
-#: ../spell.c:7476
-#, c-format
-msgid "Total number of words: %d"
-msgstr "Caณkowita liczba sณ๓w: %d"
-
-#: ../spell.c:7655
-#, c-format
-msgid "Writing suggestion file %s ..."
-msgstr "Zapisuj๊ plik sugestii %s ..."
-
-#: ../spell.c:7707 ../spell.c:7927
-#, c-format
-msgid "Estimated runtime memory use: %d bytes"
-msgstr "Oczekiwane zuฟycie pami๊ci: %d bajt๓w"
-
-#: ../spell.c:7820
-msgid "E751: Output file name must not have region name"
-msgstr "E751: Nazwa pliku wynikowego nie moฟe byๆ nazwน regionu"
-
-#: ../spell.c:7822
-msgid "E754: Only up to 8 regions supported"
-msgstr "E754: Wspieram tylko 8 region๓w"
-
-#: ../spell.c:7846
-#, c-format
-msgid "E755: Invalid region in %s"
-msgstr "E755: Nieprawidณowy region w %s"
-
-#: ../spell.c:7907
-msgid "Warning: both compounding and NOBREAK specified"
-msgstr "Ostrzeฟenie: okreœlono zar๓wno zณoฟenia jak i NOBREAK"
-
-#: ../spell.c:7920
-#, c-format
-msgid "Writing spell file %s ..."
-msgstr "Zapisuj๊ plik sprawdzania pisowni %s ..."
-
-#: ../spell.c:7925
-msgid "Done!"
-msgstr "Zrobione!"
-
-#: ../spell.c:8034
-#, c-format
-msgid "E765: 'spellfile' does not have %<PRId64> entries"
-msgstr "E765: 'spellfile' nie posiada wpis๓w %<PRId64>"
-
-#: ../spell.c:8074
-#, fuzzy, c-format
-msgid "Word '%.*s' removed from %s"
-msgstr "Usuni๊to sณowo z %s"
-
-#: ../spell.c:8117
-#, fuzzy, c-format
-msgid "Word '%.*s' added to %s"
-msgstr "Dodano sณowo do %s"
-
-#: ../spell.c:8381
-msgid "E763: Word characters differ between spell files"
-msgstr "E763: Znaki wyraz๓w r๓ฟniน si๊ mi๊dzy plikami sprawdzania pisowni"
-
-#: ../spell.c:8684
-msgid "Sorry, no suggestions"
-msgstr "Przykro mi, brak podpowiedzi"
-
-#: ../spell.c:8687
-#, c-format
-msgid "Sorry, only %<PRId64> suggestions"
-msgstr "Przykro mi, tylko %<PRId64> podpowiedzi"
-
-#. for when 'cmdheight' > 1
-#. avoid more prompt
-#: ../spell.c:8704
-#, c-format
-msgid "Change \"%.*s\" to:"
-msgstr "Zmie๑ \"%.*s\" na:"
-
-#: ../spell.c:8737
-#, c-format
-msgid " < \"%.*s\""
-msgstr " < \"%.*s\""
-
-#: ../spell.c:8882
-msgid "E752: No previous spell replacement"
-msgstr "E752: Brak poprzednich podmian sprawdzania pisowni"
-
-#: ../spell.c:8925
-#, c-format
-msgid "E753: Not found: %s"
-msgstr "E753: Nie znaleziono: %s"
-
-#: ../spell.c:9276
-#, c-format
-msgid "E778: This does not look like a .sug file: %s"
-msgstr "E778: Ten plik nie wyglนda na plik .sug: %s"
-
-#: ../spell.c:9282
-#, c-format
-msgid "E779: Old .sug file, needs to be updated: %s"
-msgstr "E779: Stary plik .sug, konieczne jest uaktualnienie: %s"
-
-#: ../spell.c:9286
-#, c-format
-msgid "E780: .sug file is for newer version of Vim: %s"
-msgstr "E780: Plik .sug dla nowszej wersji Vima: %s"
-
-#: ../spell.c:9295
-#, c-format
-msgid "E781: .sug file doesn't match .spl file: %s"
-msgstr "E781: Plik .sug nie pasuje do pliku .spl: %s"
-
-#: ../spell.c:9305
-#, c-format
-msgid "E782: error while reading .sug file: %s"
-msgstr "E782: Bณนd w czasie odczytu pliku .sug: %s"
-
-#. This should have been checked when generating the .spl
-#. file.
-#: ../spell.c:11575
-msgid "E783: duplicate char in MAP entry"
-msgstr "E783: Podwojony znak we wpisie MAP"
-
-#: ../syntax.c:266
-msgid "No Syntax items defined for this buffer"
-msgstr "Brak element๓w skณadni okreœlonych dla tego bufora"
-
-#: ../syntax.c:3083 ../syntax.c:3104 ../syntax.c:3127
-#, c-format
-msgid "E390: Illegal argument: %s"
-msgstr "E390: Niedozwolony argument: %s"
-
-#: ../syntax.c:3299
-#, c-format
-msgid "E391: No such syntax cluster: %s"
-msgstr "E391: Nie ma takiego klastra skณadni: %s"
-
-#: ../syntax.c:3433
-msgid "syncing on C-style comments"
-msgstr "synchronizacja komentarzy w stylu C"
-
-#: ../syntax.c:3439
-msgid "no syncing"
-msgstr "brak synchronizacji"
-
-#: ../syntax.c:3441
-msgid "syncing starts "
-msgstr "poczนtek synchronizacji"
-
-#: ../syntax.c:3443 ../syntax.c:3506
-msgid " lines before top line"
-msgstr " wierszy przed g๓rnน liniน"
-
-#: ../syntax.c:3448
-msgid ""
-"\n"
-"--- Syntax sync items ---"
-msgstr ""
-"\n"
-"--- Elementy synchronizacji skณadni ---"
-
-#: ../syntax.c:3452
-msgid ""
-"\n"
-"syncing on items"
-msgstr ""
-"\n"
-"synchronizuj๊ na elementach"
-
-#: ../syntax.c:3457
-msgid ""
-"\n"
-"--- Syntax items ---"
-msgstr ""
-"\n"
-"--- Elementy skณadni ---"
-
-#: ../syntax.c:3475
-#, c-format
-msgid "E392: No such syntax cluster: %s"
-msgstr "E392: Nie ma takiego klastra skณadni: %s"
-
-#: ../syntax.c:3497
-msgid "minimal "
-msgstr "minimalnie "
-
-#: ../syntax.c:3503
-msgid "maximal "
-msgstr "maksymalnie "
-
-#: ../syntax.c:3513
-msgid "; match "
-msgstr "; pasuje "
-
-#: ../syntax.c:3515
-msgid " line breaks"
-msgstr "znak๓w nowego wiersza"
-
-#: ../syntax.c:4076
-msgid "E395: contains argument not accepted here"
-msgstr "E395: argument contains niedozwolony w tym miejscu"
-
-#: ../syntax.c:4096
-msgid "E844: invalid cchar value"
-msgstr "E844: Niewณaœciwa wartoœๆ cchar"
-
-#: ../syntax.c:4107
-msgid "E393: group[t]here not accepted here"
-msgstr "E393: group[t]here niedozwolone w tym miejscu"
-
-#: ../syntax.c:4126
-#, c-format
-msgid "E394: Didn't find region item for %s"
-msgstr "E394: Nie znalazณem element๓w regionu dla %s"
-
-#: ../syntax.c:4188
-msgid "E397: Filename required"
-msgstr "E397: Wymagana nazwa pliku"
-
-#: ../syntax.c:4221
-msgid "E847: Too many syntax includes"
-msgstr "E847: Za duฟo wณนczonych skณadni"
-
-#: ../syntax.c:4303
-#, c-format
-msgid "E789: Missing ']': %s"
-msgstr "E789: Brak ']': %s"
-
-#: ../syntax.c:4531
-#, c-format
-msgid "E398: Missing '=': %s"
-msgstr "E398: Brak '=': %s"
-
-#: ../syntax.c:4666
-#, c-format
-msgid "E399: Not enough arguments: syntax region %s"
-msgstr "E399: Za maณo argument๓w: syntax region %s"
-
-#: ../syntax.c:4870
-msgid "E848: Too many syntax clusters"
-msgstr "E848: Za duฟo klastr๓w skณadni"
-
-#: ../syntax.c:4954
-msgid "E400: No cluster specified"
-msgstr "E400: Brak specyfikacji klastra"
-
-#. end delimiter not found
-#: ../syntax.c:4986
-#, c-format
-msgid "E401: Pattern delimiter not found: %s"
-msgstr "E401: Brak ogranicznika wzorca: %s"
-
-#: ../syntax.c:5049
-#, c-format
-msgid "E402: Garbage after pattern: %s"
-msgstr "E402: Œmieci po wzorcu: %s"
-
-#: ../syntax.c:5120
-msgid "E403: syntax sync: line continuations pattern specified twice"
-msgstr "E403: syntax sync: wielokrotnie podane wzorce kontynuacji wiersza"
-
-#: ../syntax.c:5169
-#, c-format
-msgid "E404: Illegal arguments: %s"
-msgstr "E404: Niedozwolone argumenty: %s"
-
-#: ../syntax.c:5217
-#, c-format
-msgid "E405: Missing equal sign: %s"
-msgstr "E405: Brak znaku r๓wnoœci: %s"
-
-#: ../syntax.c:5222
-#, c-format
-msgid "E406: Empty argument: %s"
-msgstr "E406: Pusty argument: %s"
-
-#: ../syntax.c:5240
-#, c-format
-msgid "E407: %s not allowed here"
-msgstr "E407: %s jest niedozwolone w tym miejscu"
-
-#: ../syntax.c:5246
-#, c-format
-msgid "E408: %s must be first in contains list"
-msgstr "E408: %s musi byๆ pierwsze w liœcie contains"
-
-#: ../syntax.c:5304
-#, c-format
-msgid "E409: Unknown group name: %s"
-msgstr "E409: Nieznana nazwa grupy: %s"
-
-#: ../syntax.c:5512
-#, c-format
-msgid "E410: Invalid :syntax subcommand: %s"
-msgstr "E410: Niewณaœciwa podkomenda :syntax : %s"
-
-#: ../syntax.c:5854
-msgid ""
-" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
-msgstr ""
-" WSZYTKO ILOŒฦ PASUJE NAJWOLN. ŒREDNIO NAZWA WZORZEC"
-
-#: ../syntax.c:6146
-msgid "E679: recursive loop loading syncolor.vim"
-msgstr "E679: rekursywna p๊tla wczytujนca syncolor.vim"
-
-#: ../syntax.c:6256
-#, c-format
-msgid "E411: highlight group not found: %s"
-msgstr "E411: nie znaleziono grupy podœwietlania: %s"
-
-#: ../syntax.c:6278
-#, c-format
-msgid "E412: Not enough arguments: \":highlight link %s\""
-msgstr "E412: Zbyt maณo argument๓w: \":highlight link %s\""
-
-#: ../syntax.c:6284
-#, c-format
-msgid "E413: Too many arguments: \":highlight link %s\""
-msgstr "E413: Zbyt wiele argument๓w: \":highlight link %s\""
-
-#: ../syntax.c:6302
-msgid "E414: group has settings, highlight link ignored"
-msgstr "E414: grupa ma ustawienia; zignorowane podณนczenie podœwietlania"
-
-#: ../syntax.c:6367
-#, c-format
-msgid "E415: unexpected equal sign: %s"
-msgstr "E415: nieoczekiwany znak r๓wnoœci: %s"
-
-#: ../syntax.c:6395
-#, c-format
-msgid "E416: missing equal sign: %s"
-msgstr "E416: brak znaku r๓wnoœci: %s"
-
-#: ../syntax.c:6418
-#, c-format
-msgid "E417: missing argument: %s"
-msgstr "E417: brak argumentu: %s"
-
-#: ../syntax.c:6446
-#, c-format
-msgid "E418: Illegal value: %s"
-msgstr "E418: Niedozwolona wartoœๆ: %s"
-
-#: ../syntax.c:6496
-msgid "E419: FG color unknown"
-msgstr "E419: Kolor FG nieznany"
-
-#: ../syntax.c:6504
-msgid "E420: BG color unknown"
-msgstr "E420: Kolor BG nieznany"
-
-#: ../syntax.c:6564
-#, c-format
-msgid "E421: Color name or number not recognized: %s"
-msgstr "E421: Nazwa lub liczba koloru nierozpoznana: %s"
-
-#: ../syntax.c:6714
-#, c-format
-msgid "E422: terminal code too long: %s"
-msgstr "E422: za dณugi kod terminala: %s"
-
-#: ../syntax.c:6753
-#, c-format
-msgid "E423: Illegal argument: %s"
-msgstr "E423: Niedozwolony argument: %s"
-
-#: ../syntax.c:6925
-msgid "E424: Too many different highlighting attributes in use"
-msgstr "E424: Zbyt wiele r๓ฟnych atrybut๓w podkreœlania w uฟyciu"
-
-#: ../syntax.c:7427
-msgid "E669: Unprintable character in group name"
-msgstr "E669: Niedrukowalny znak w nazwie grupy"
-
-#: ../syntax.c:7434
-msgid "W18: Invalid character in group name"
-msgstr "W18: nieprawidณowy znak w nazwie grupy"
-
-#: ../syntax.c:7448
-msgid "E849: Too many highlight and syntax groups"
-msgstr "E849: Za duฟo grup podœwietlania i skณadni"
-
-#: ../tag.c:104
-msgid "E555: at bottom of tag stack"
-msgstr "E555: na dole stosu znacznik๓w"
-
-#: ../tag.c:105
-msgid "E556: at top of tag stack"
-msgstr "E556: na g๓rze stosu znacznik๓w"
-
-#: ../tag.c:380
-msgid "E425: Cannot go before first matching tag"
-msgstr "E425: Nie moฟna przejœๆ przed pierwszy pasujนcy znacznik"
-
-#: ../tag.c:504
-#, c-format
-msgid "E426: tag not found: %s"
-msgstr "E426: nie znaleziono znacznika: %s"
-
-#: ../tag.c:528
-msgid " # pri kind tag"
-msgstr " # pri rodzaj znacznik"
-
-#: ../tag.c:531
-msgid "file\n"
-msgstr "plik\n"
-
-#: ../tag.c:829
-msgid "E427: There is only one matching tag"
-msgstr "E427: Pasuje tylko jeden znacznik"
-
-#: ../tag.c:831
-msgid "E428: Cannot go beyond last matching tag"
-msgstr "E428: Nie moฟna przejœๆ za ostatni pasujนcy znacznik"
-
-#: ../tag.c:850
-#, c-format
-msgid "File \"%s\" does not exist"
-msgstr "Plik \"%s\" nie istnieje"
-
-#. Give an indication of the number of matching tags
-#: ../tag.c:859
-#, c-format
-msgid "tag %d of %d%s"
-msgstr "znacznik %d z %d%s"
-
-#: ../tag.c:862
-msgid " or more"
-msgstr " lub wi๊cej"
-
-#: ../tag.c:864
-msgid " Using tag with different case!"
-msgstr " Uฟywam znacznika o odmiennej wielkoœci liter!"
-
-#: ../tag.c:909
-#, c-format
-msgid "E429: File \"%s\" does not exist"
-msgstr "E429: Plik \"%s\" nie istnieje"
-
-#. Highlight title
-#: ../tag.c:960
-msgid ""
-"\n"
-" # TO tag FROM line in file/text"
-msgstr ""
-"\n"
-" # DO znacznik OD wiersza w pliku/tekœcie"
-
-#: ../tag.c:1303
-#, c-format
-msgid "Searching tags file %s"
-msgstr "Szukam w pliku znacznik๓w %s"
-
-#: ../tag.c:1545
-msgid "Ignoring long line in tags file"
-msgstr "Ignoruj๊ dณugie wiersze w pliku znacznik๓w"
-
-#: ../tag.c:1915
-#, c-format
-msgid "E431: Format error in tags file \"%s\""
-msgstr "E431: Bณนd formatu w pliku znacznik๓w \"%s\""
-
-#: ../tag.c:1917
-#, c-format
-msgid "Before byte %<PRId64>"
-msgstr "Przed bajtem %<PRId64>"
-
-#: ../tag.c:1929
-#, c-format
-msgid "E432: Tags file not sorted: %s"
-msgstr "E432: Plik znacznik๓w nieuporzนdkowany: %s"
-
-#. never opened any tags file
-#: ../tag.c:1960
-msgid "E433: No tags file"
-msgstr "E433: Brak pliku znacznik๓w"
-
-#: ../tag.c:2536
-msgid "E434: Can't find tag pattern"
-msgstr "E434: Nie mog๊ znaleŸๆ wzorca znacznika"
-
-#: ../tag.c:2544
-msgid "E435: Couldn't find tag, just guessing!"
-msgstr "E435: Nie znalazณem znacznika - tylko zgaduj๊!"
-
-#: ../tag.c:2797
-#, c-format
-msgid "Duplicate field name: %s"
-msgstr "Powt๓rzona nazwa pola: %s"
-
-#: ../term.c:1442
-msgid "' not known. Available builtin terminals are:"
-msgstr "' nieznany. Moฟliwe typy wbudowanych terminali:"
-
-#: ../term.c:1463
-msgid "defaulting to '"
-msgstr "domyœlnie jest '"
-
-#: ../term.c:1731
-msgid "E557: Cannot open termcap file"
-msgstr "E557: Nie mog๊ otworzyๆ pliku termcap"
-
-#: ../term.c:1735
-msgid "E558: Terminal entry not found in terminfo"
-msgstr "E558: Nie ma opisu takiego terminala w terminfo"
-
-#: ../term.c:1737
-msgid "E559: Terminal entry not found in termcap"
-msgstr "E559: Nie ma opisu takiego terminala w termcap"
-
-#: ../term.c:1878
-#, c-format
-msgid "E436: No \"%s\" entry in termcap"
-msgstr "E436: Brak opisu \"%s\" w termcap"
-
-#: ../term.c:2249
-msgid "E437: terminal capability \"cm\" required"
-msgstr "E437: wymagana zdolnoœๆ \"cm\" terminala"
-
-#. Highlight title
-#: ../term.c:4376
-msgid ""
-"\n"
-"--- Terminal keys ---"
-msgstr ""
-"\n"
-"--- Klawisze terminala ---"
-
-#: ../ui.c:481
-msgid "Vim: Error reading input, exiting...\n"
-msgstr "Vim: Bณนd podczas wczytywania wejœcia, ko๑cz๊...\n"
-
-#. This happens when the FileChangedRO autocommand changes the
-#. * file in a way it becomes shorter.
-#: ../undo.c:379
-#, fuzzy
-msgid "E881: Line count changed unexpectedly"
-msgstr "E834: Niespodziewana zmiana iloœci linii"
-
-#: ../undo.c:627
-#, c-format
-msgid "E828: Cannot open undo file for writing: %s"
-msgstr "E828: Nie mog๊ otworzyๆ do zapisu pliku undo: %s"
-
-#: ../undo.c:717
-#, c-format
-msgid "E825: Corrupted undo file (%s): %s"
-msgstr "E825: Uszkodzony plik undo (%s): %s"
-
-#: ../undo.c:1039
-msgid "Cannot write undo file in any directory in 'undodir'"
-msgstr "Nie moฟna zapisaๆ pliku undo w ฟadnym katalogu z 'undodir'"
-
-#: ../undo.c:1074
-#, c-format
-msgid "Will not overwrite with undo file, cannot read: %s"
-msgstr "Nie nadpisz๊ plikiem undo, nie mog๊ odczytaๆ: %s"
-
-#: ../undo.c:1092
-#, c-format
-msgid "Will not overwrite, this is not an undo file: %s"
-msgstr "Nie nadpisz๊, to nie jest plik undo: %s"
-
-#: ../undo.c:1108
-msgid "Skipping undo file write, nothing to undo"
-msgstr "Pomijam zapis pliku undo, nic do cofni๊cia"
-
-#: ../undo.c:1121
-#, c-format
-msgid "Writing undo file: %s"
-msgstr "Zapisuj๊ plik undo: %s"
-
-#: ../undo.c:1213
-#, c-format
-msgid "E829: write error in undo file: %s"
-msgstr "E829: Bณนd zapisu w pliku undo: %s"
-
-#: ../undo.c:1280
-#, c-format
-msgid "Not reading undo file, owner differs: %s"
-msgstr "Nie wczytuj๊ pliku undo, inny wณaœciciel: %s"
-
-#: ../undo.c:1292
-#, c-format
-msgid "Reading undo file: %s"
-msgstr "Wczytuj๊ plik undo: %s"
-
-#: ../undo.c:1299
-#, c-format
-msgid "E822: Cannot open undo file for reading: %s"
-msgstr "E822: Nie mog๊ otworzyๆ pliku undo do odczytu: %s"
-
-#: ../undo.c:1308
-#, c-format
-msgid "E823: Not an undo file: %s"
-msgstr "E823: To nie jest plik undo: %s"
-
-#: ../undo.c:1313
-#, c-format
-msgid "E824: Incompatible undo file: %s"
-msgstr "E824: Niekompatybilny plik undo: %s"
-
-#: ../undo.c:1328
-msgid "File contents changed, cannot use undo info"
-msgstr "Zawartoœๆ pliku si๊ zmieniณa, nie mog๊ uฟyๆ pliku undo"
-
-#: ../undo.c:1497
-#, c-format
-msgid "Finished reading undo file %s"
-msgstr "Sko๑czono wczytywanie pliku undo %s"
-
-#: ../undo.c:1586 ../undo.c:1812
-msgid "Already at oldest change"
-msgstr "Juฟ w miejscu ostatniej zmiany"
-
-#: ../undo.c:1597 ../undo.c:1814
-msgid "Already at newest change"
-msgstr "Juฟ w miejscu najnowszej zmiany"
-
-#: ../undo.c:1806
-#, c-format
-msgid "E830: Undo number %<PRId64> not found"
-msgstr "E830: Nie znaleziono numeru cofni๊cia %<PRId64>"
-
-#: ../undo.c:1979
-msgid "E438: u_undo: line numbers wrong"
-msgstr "E438: u_undo: niewณaœciwe numery wierszy"
-
-#: ../undo.c:2183
-msgid "more line"
-msgstr "1 wiersz wi๊cej"
-
-#: ../undo.c:2185
-msgid "more lines"
-msgstr "wi๊cej wierszy"
-
-#: ../undo.c:2187
-msgid "line less"
-msgstr "1 wiersz mniej"
-
-#: ../undo.c:2189
-msgid "fewer lines"
-msgstr "mniej wierszy"
-
-#: ../undo.c:2193
-msgid "change"
-msgstr "1 zmiana"
-
-#: ../undo.c:2195
-msgid "changes"
-msgstr "zmiany"
-
-#: ../undo.c:2225
-#, c-format
-msgid "%<PRId64> %s; %s #%<PRId64> %s"
-msgstr "%<PRId64> %s; %s #%<PRId64> %s"
-
-#: ../undo.c:2228
-msgid "before"
-msgstr "przed"
-
-#: ../undo.c:2228
-msgid "after"
-msgstr "za"
-
-#: ../undo.c:2325
-msgid "Nothing to undo"
-msgstr "Nie ma zmian do cofni๊cia"
-
-#: ../undo.c:2330
-msgid "number changes when saved"
-msgstr "liczba zmiany kiedy zapisano"
-
-#: ../undo.c:2360
-#, c-format
-msgid "%<PRId64> seconds ago"
-msgstr "%<PRId64> sekund temu"
-
-#: ../undo.c:2372
-msgid "E790: undojoin is not allowed after undo"
-msgstr "E790: undojoin nie jest dozwolone po undo"
-
-#: ../undo.c:2466
-msgid "E439: undo list corrupt"
-msgstr "E439: uszkodzona lista cofania"
-
-#: ../undo.c:2495
-msgid "E440: undo line missing"
-msgstr "E440: brak wiersza cofania"
-
-#: ../version.c:600
-msgid ""
-"\n"
-"Included patches: "
-msgstr ""
-"\n"
-"Zadane ณaty: "
-
-#: ../version.c:627
-msgid ""
-"\n"
-"Extra patches: "
-msgstr ""
-"\n"
-"Ekstra ณaty: "
-
-#: ../version.c:639 ../version.c:864
-msgid "Modified by "
-msgstr "Zmieniony przez "
-
-#: ../version.c:646
-msgid ""
-"\n"
-"Compiled "
-msgstr ""
-"\n"
-"Skompilowany "
-
-#: ../version.c:649
-msgid "by "
-msgstr "przez "
-
-#: ../version.c:660
-msgid ""
-"\n"
-"Huge version "
-msgstr ""
-"\n"
-"Olbrzymia wersja "
-
-#: ../version.c:661
-msgid "without GUI."
-msgstr "bez GUI."
-
-#: ../version.c:662
-msgid " Features included (+) or not (-):\n"
-msgstr " Opcje wณนczone (+) lub nie (-):\n"
-
-#: ../version.c:667
-msgid " system vimrc file: \""
-msgstr " vimrc systemu: \""
-
-#: ../version.c:672
-msgid " user vimrc file: \""
-msgstr " vimrc uฟytkownika: \""
-
-#: ../version.c:677
-msgid " 2nd user vimrc file: \""
-msgstr " 2-gi plik vimrc uฟytkownika: \""
-
-#: ../version.c:682
-msgid " 3rd user vimrc file: \""
-msgstr " 3-ci plik vimrc uฟytkownika: \""
-
-#: ../version.c:687
-msgid " user exrc file: \""
-msgstr " exrc uฟytkownika: \""
-
-#: ../version.c:692
-msgid " 2nd user exrc file: \""
-msgstr " 2-gi plik exrc uฟytkownika: \""
-
-#: ../version.c:699
-msgid " fall-back for $VIM: \""
-msgstr " odwet dla $VIM-a: \""
-
-#: ../version.c:705
-msgid " f-b for $VIMRUNTIME: \""
-msgstr "f-b dla $VIMRUNTIME: \""
-
-#: ../version.c:709
-msgid "Compilation: "
-msgstr "Kompilacja: "
-
-#: ../version.c:712
-msgid "Linking: "
-msgstr "Konsolidacja: "
-
-#: ../version.c:717
-msgid " DEBUG BUILD"
-msgstr " KOMPILACJA DEBUG"
-
-#: ../version.c:767
-msgid "VIM - Vi IMproved"
-msgstr "VIM - Vi rozbudowany"
-
-#: ../version.c:769
-msgid "version "
-msgstr "wersja "
-
-#: ../version.c:770
-msgid "by Bram Moolenaar et al."
-msgstr "Autor: Bram Moolenaar i Inni."
-
-#: ../version.c:774
-msgid "Vim is open source and freely distributable"
-msgstr "Vim jest open source i rozprowadzany darmowo"
-
-#: ../version.c:776
-msgid "Help poor children in Uganda!"
-msgstr "Pom๓ฟ biednym dzieciom w Ugandzie!"
-
-#: ../version.c:777
-msgid "type :help iccf<Enter> for information "
-msgstr "wprowadŸ :help iccf<Enter> dla informacji o tym "
-
-#: ../version.c:779
-msgid "type :q<Enter> to exit "
-msgstr "wprowadŸ :q<Enter> zako๑czenie programu "
-
-#: ../version.c:780
-msgid "type :help<Enter> or <F1> for on-line help"
-msgstr "wprowadŸ :help<Enter> lub <F1> pomoc na bieฟนco "
-
-#: ../version.c:781
-msgid "type :help version7<Enter> for version info"
-msgstr "wprowadŸ :help version7<Enter> dla informacji o wersji"
-
-#: ../version.c:784
-msgid "Running in Vi compatible mode"
-msgstr "Dziaณam w trybie zgodnoœci z Vi"
-
-#: ../version.c:785
-msgid "type :set nocp<Enter> for Vim defaults"
-msgstr "wprowadŸ :set nocp<Enter> wartoœci domyœlne Vim-a"
-
-#: ../version.c:786
-msgid "type :help cp-default<Enter> for info on this"
-msgstr "wprowadŸ :help cp-default<Enter> dla informacji to tym "
-
-#: ../version.c:827
-msgid "Sponsor Vim development!"
-msgstr "Sponsoruj rozw๓j Vima!"
-
-#: ../version.c:828
-msgid "Become a registered Vim user!"
-msgstr "Zosta๑ zarejestrowanym uฟytkownikiem Vima!"
-
-#: ../version.c:831
-msgid "type :help sponsor<Enter> for information "
-msgstr "wprowadŸ :help sponsor<Enter> dla informacji"
-
-#: ../version.c:832
-msgid "type :help register<Enter> for information "
-msgstr "wprowadŸ :help register<Enter> dla informacji"
-
-#: ../version.c:834
-msgid "menu Help->Sponsor/Register for information "
-msgstr "menu Pomoc->Sponsoruj/Zarejestruj si๊ dla informacji"
-
-#: ../window.c:119
-msgid "Already only one window"
-msgstr "Juฟ jest tylko jeden widok"
-
-#: ../window.c:224
-msgid "E441: There is no preview window"
-msgstr "E441: Nie ma okna podglนdu"
-
-#: ../window.c:559
-msgid "E442: Can't split topleft and botright at the same time"
-msgstr "E442: Nie mog๊ rozdzieliๆ lewo-g๓rnego i prawo-dolnego jednoczeœnie"
-
-#: ../window.c:1228
-msgid "E443: Cannot rotate when another window is split"
-msgstr "E443: Nie mog๊ przekr๊ciๆ, gdy inne okno jest rozdzielone"
-
-#: ../window.c:1803
-msgid "E444: Cannot close last window"
-msgstr "E444: Nie mog๊ zamknนๆ ostatniego okna"
-
-#: ../window.c:1810
-msgid "E813: Cannot close autocmd window"
-msgstr "E813: Nie moฟna zamknนๆ okna autocmd"
-
-#: ../window.c:1814
-msgid "E814: Cannot close window, only autocmd window would remain"
-msgstr "E814: Nie moฟna zamknนๆ okna, zostaณoby tylko okno autocmd"
-
-#: ../window.c:2717
-msgid "E445: Other window contains changes"
-msgstr "E445: Inne okno zawiera zmiany"
-
-#: ../window.c:4805
-msgid "E446: No file name under cursor"
-msgstr "E446: Brak nazwy pliku pod kursorem"
-
-#~ msgid "E831: bf_key_init() called with empty password"
-#~ msgstr "E831: bf_key_init() wywoณany z pustym hasณem"
-
-#~ msgid "E820: sizeof(uint32_t) != 4"
-#~ msgstr "E820: sizeof(uint32_t) != 4"
-
-#~ msgid "E817: Blowfish big/little endian use wrong"
-#~ msgstr "E817: Blowfish uฟywa bณ๊dnej kolejnoœci bajt๓w"
-
-#~ msgid "E818: sha256 test failed"
-#~ msgstr "E818: test sha256 nie powi๓dณ si๊"
-
-#~ msgid "E819: Blowfish test failed"
-#~ msgstr "E819: test Blowfisha nie powi๓dณ si๊"
-
-#~ msgid "Patch file"
-#~ msgstr "Plik ณata"
-
-#~ msgid ""
-#~ "&OK\n"
-#~ "&Cancel"
-#~ msgstr ""
-#~ "&OK\n"
-#~ "&Zako๑cz"
-
-#~ msgid "E240: No connection to Vim server"
-#~ msgstr "E240: Brak poณนczenia z serwerem Vim"
-
-#~ msgid "E241: Unable to send to %s"
-#~ msgstr "E241: Nie mog๊ wysณaๆ do %s"
-
-#~ msgid "E277: Unable to read a server reply"
-#~ msgstr "E277: Nie mog๊ czytaๆ odpowiedzi serwera"
-
-#~ msgid "E258: Unable to send to client"
-#~ msgstr "E258: Nie mog๊ wysณaๆ do klienta"
-
-#~ msgid "Save As"
-#~ msgstr "Zapisz jako"
-
-#~ msgid "Source Vim script"
-#~ msgstr "Wczytaj skrypt Vima"
-
-#~ msgid "Edit File"
-#~ msgstr "Edytuj Plik"
-
-#~ msgid " (NOT FOUND)"
-#~ msgstr " (NIE ZNALEZIONO)"
-
-#~ msgid "unknown"
-#~ msgstr "nieznany"
-
-#~ msgid "Edit File in new window"
-#~ msgstr "Edytuj plik w nowym oknie"
-
-#~ msgid "Append File"
-#~ msgstr "Doณนcz plik"
-
-#~ msgid "Window position: X %d, Y %d"
-#~ msgstr "Pozycja okna: X %d, Y %d"
-
-#~ msgid "Save Redirection"
-#~ msgstr "Zapisz przekierowanie"
-
-#~ msgid "Save View"
-#~ msgstr "Zapisz widok"
-
-#~ msgid "Save Session"
-#~ msgstr "Zapisz sesj๊"
-
-#~ msgid "Save Setup"
-#~ msgstr "Zapisz ustawienia"
-
-#~ msgid "E809: #< is not available without the +eval feature"
-#~ msgstr "E809: #< nie jest dost๊pne bez wณaœciwoœci +eval"
-
-#~ msgid "E196: No digraphs in this version"
-#~ msgstr "E196: Brak dwugraf๓w w tej wersji"
-
-#~ msgid "is a device (disabled with 'opendevice' option)"
-#~ msgstr "jest urzนdzeniem (wyณนczonym w opcji 'opendevice')"
-
-#~ msgid "Reading from stdin..."
-#~ msgstr "Wczytywanie ze stdin..."
-
-#~ msgid "[blowfish]"
-#~ msgstr "[blowfish]"
-
-#~ msgid "[crypted]"
-#~ msgstr "[zakodowane]"
-
-#~ msgid "E821: File is encrypted with unknown method"
-#~ msgstr "E821: Plik zaszyfrowano w nieznany spos๓b"
-
-#~ msgid "NetBeans disallows writes of unmodified buffers"
-#~ msgstr "NetBeans nie pozwala na zapis niezmodyfikowanych bufor๓w"
-
-#~ msgid "Partial writes disallowed for NetBeans buffers"
-#~ msgstr "Cz๊œciowy zapis niemoฟliwy dla bufor๓w NetBeans"
-
-#~ msgid "writing to device disabled with 'opendevice' option"
-#~ msgstr "zapisywanie do urzนdzenia wyณนczone w opcji 'opendevice'"
-
-#~ msgid "E460: The resource fork would be lost (add ! to override)"
-#~ msgstr "E460: Rozdziaณ zasob๓w zostanie utracony (wymuœ przez !)"
-
-#~ msgid "<cannot open> "
-#~ msgstr "<nie mog๊ otworzyๆ> "
-
-#~ msgid "E616: vim_SelFile: can't get font %s"
-#~ msgstr "E616: vim_SelFile: nie mog๊ otrzymaๆ czcionki %s"
-
-#~ msgid "E614: vim_SelFile: can't return to current directory"
-#~ msgstr "E614: vim_SelFile: nie mog๊ powr๓ciๆ do bieฟนcego katalogu"
-
-#~ msgid "Pathname:"
-#~ msgstr "Trop:"
-
-#~ msgid "E615: vim_SelFile: can't get current directory"
-#~ msgstr "E615: vim_SelFile: nie mog๊ otrzymaๆ bieฟนcego katalogu"
-
-#~ msgid "OK"
-#~ msgstr "OK"
-
-#~ msgid "Cancel"
-#~ msgstr "Zako๑cz"
-
-#~ msgid "Vim dialog"
-#~ msgstr "VIM - Dialog"
-
-#~ msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
-#~ msgstr ""
-#~ "Scrollbar Widget: Nie mogณem otrzymaๆ rozmiar๓w rysunku na przycisku."
-
-#~ msgid "E232: Cannot create BalloonEval with both message and callback"
-#~ msgstr "E232: Nie mog๊ stworzyๆ BalloonEval z powiadomieniem i wywoณaniem"
-
-#~ msgid "E851: Failed to create a new process for the GUI"
-#~ msgstr "E851: Nie mogณem stworzyๆ nowego procesu dla GUI"
-
-#~ msgid "E852: The child process failed to start the GUI"
-#~ msgstr "E852: Proces potomny nie m๓gณ uruchomiๆ GUI"
-
-#~ msgid "E229: Cannot start the GUI"
-#~ msgstr "E229: Nie mog๊ odpaliๆ GUI"
-
-#~ msgid "E230: Cannot read from \"%s\""
-#~ msgstr "E230: Nie mog๊ czytaๆ z \"%s\""
-
-#~ msgid "E665: Cannot start GUI, no valid font found"
-#~ msgstr "E665: Nie moฟna uruchomiๆ GUI, brak prawidณowej czcionki"
-
-#~ msgid "E231: 'guifontwide' invalid"
-#~ msgstr "E231: Niewณaœciwe 'guifontwide'"
-
-#~ msgid "E599: Value of 'imactivatekey' is invalid"
-#~ msgstr "E599: Nieprawidณowa wartoœๆ 'imactivatekey'"
-
-#~ msgid "E254: Cannot allocate color %s"
-#~ msgstr "E254: Nie mog๊ zarezerwowaๆ koloru %s"
-
-#~ msgid "No match at cursor, finding next"
-#~ msgstr "Brak dopasowania przy kursorze, szukam dalej"
-
-#~ msgid "Input _Methods"
-#~ msgstr "Input _Methods"
-
-#~ msgid "VIM - Search and Replace..."
-#~ msgstr "VIM - Szukaj i Zamie๑..."
-
-#~ msgid "VIM - Search..."
-#~ msgstr "VIM - Szukaj..."
-
-#~ msgid "Find what:"
-#~ msgstr "ZnajdŸ:"
-
-#~ msgid "Replace with:"
-#~ msgstr "Zamie๑ na:"
-
-#~ msgid "Match whole word only"
-#~ msgstr "Dopasuj tylko caณe wyrazy"
-
-#~ msgid "Match case"
-#~ msgstr "Dopasuj wielkoœๆ liter"
-
-#~ msgid "Direction"
-#~ msgstr "Kierunek"
-
-#~ msgid "Up"
-#~ msgstr "W g๓r๊"
-
-#~ msgid "Down"
-#~ msgstr "W d๓ณ"
-
-#~ msgid "Find Next"
-#~ msgstr "ZnajdŸ nast๊pne"
-
-#~ msgid "Replace"
-#~ msgstr "Zamie๑"
-
-#~ msgid "Replace All"
-#~ msgstr "Zamie๑ wszystkie"
-
-#~ msgid "Vim: Received \"die\" request from session manager\n"
-#~ msgstr "Vim: otrzymano ฟนdanie \"die\" od menedฟera sesji\n"
-
-#~ msgid "Close"
-#~ msgstr "Zamknij"
-
-#~ msgid "New tab"
-#~ msgstr "Nowa karta"
-
-#~ msgid "Open Tab..."
-#~ msgstr "Otw๓rz kart๊..."
-
-#~ msgid "Vim: Main window unexpectedly destroyed\n"
-#~ msgstr "Vim: Gณ๓wne okno nieoczekiwanie zniszczone\n"
-
-#~ msgid "&Filter"
-#~ msgstr "&Filtr"
-
-#~ msgid "&Cancel"
-#~ msgstr "&Anuluj"
-
-#~ msgid "Directories"
-#~ msgstr "Katalogi"
-
-#~ msgid "Filter"
-#~ msgstr "Filtr"
-
-#~ msgid "&Help"
-#~ msgstr "&Pomoc"
-
-#~ msgid "Files"
-#~ msgstr "Pliki"
-
-#~ msgid "&OK"
-#~ msgstr "&OK"
-
-#~ msgid "Selection"
-#~ msgstr "Wyb๓r"
-
-#~ msgid "Find &Next"
-#~ msgstr "ZnajdŸ &nast๊pne"
-
-#~ msgid "&Replace"
-#~ msgstr "&Zamie๑"
-
-#~ msgid "Replace &All"
-#~ msgstr "Zamie๑ &wszystko"
-
-#~ msgid "&Undo"
-#~ msgstr "&Cofnij"
-
-#~ msgid "E671: Cannot find window title \"%s\""
-#~ msgstr "E671: Nie mog๊ znaleŸๆ tytuณu okna \"%s\""
-
-#~ msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
-#~ msgstr "E243: Argument nie jest wspomagany: \"-%s\"; Uฟywaj wersji OLE."
-
-#~ msgid "E672: Unable to open window inside MDI application"
-#~ msgstr "E672: Nie moฟna otworzyๆ okna wewnนtrz aplikacji MDI"
-
-#~ msgid "Close tab"
-#~ msgstr "Zamknij kart๊"
-
-#~ msgid "Open tab..."
-#~ msgstr "Otw๓rz kart๊..."
-
-#~ msgid "Find string (use '\\\\' to find a '\\')"
-#~ msgstr "ZnajdŸ ciนg (uฟyj '\\\\' do szukania '\\')"
-
-#~ msgid "Find & Replace (use '\\\\' to find a '\\')"
-#~ msgstr "Szukanie i Zamiana (uฟyj '\\\\' do szukania '\\')"
-
-#~ msgid "Not Used"
-#~ msgstr "Nie uฟywany"
-
-#~ msgid "Directory\t*.nothing\n"
-#~ msgstr "Katalog\t*.nic\n"
-
-#~ msgid ""
-#~ "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
-#~ msgstr ""
-#~ "Vim E458: Nie mog๊ zarezerwowaๆ mapy kolor๓w, pewne kolory mogน byๆ "
-#~ "nieprawidณowe"
-
-#~ msgid "E250: Fonts for the following charsets are missing in fontset %s:"
-#~ msgstr ""
-#~ "E250: Brak czcionek dla nast๊pujนcych zestaw๓w znak๓w w zestawie czcionek "
-#~ "%s:"
-
-#~ msgid "E252: Fontset name: %s"
-#~ msgstr "E252: Nazwa zestawu czcionek: %s"
-
-#~ msgid "Font '%s' is not fixed-width"
-#~ msgstr "Czcionka '%s' nie posiada znak๓w jednolitej szerokoœci"
-
-#~ msgid "E253: Fontset name: %s"
-#~ msgstr "E253: Nazwa zestawu czcionek: %s"
-
-#~ msgid "Font0: %s"
-#~ msgstr "Font0: %s"
-
-#~ msgid "Font1: %s"
-#~ msgstr "Font1: %s"
-
-#~ msgid "Font%<PRId64> width is not twice that of font0"
-#~ msgstr "Szerokoœๆ font%<PRId64> nie jest podw๓jnน szerokoœciน font0"
-
-#~ msgid "Font0 width: %<PRId64>"
-#~ msgstr "Szerokoœๆ font0: %<PRId64>"
-
-#~ msgid "Font1 width: %<PRId64>"
-#~ msgstr "Szerokoœๆ font1: %<PRId64>"
-
-#~ msgid "Invalid font specification"
-#~ msgstr "Nieprawidณowy opis czcionki"
-
-#~ msgid "&Dismiss"
-#~ msgstr "&Anuluj"
-
-#~ msgid "no specific match"
-#~ msgstr "brak okreœlonego dopasowania"
-
-#~ msgid "Vim - Font Selector"
-#~ msgstr "Vim - wyb๓r czcionki"
-
-#~ msgid "Name:"
-#~ msgstr "Nazwa:"
-
-#~ msgid "Show size in Points"
-#~ msgstr "Pokaฟ wielkoœๆ w punktach"
-
-#~ msgid "Encoding:"
-#~ msgstr "Kodowanie:"
-
-#~ msgid "Font:"
-#~ msgstr "Czcionka:"
-
-#~ msgid "Style:"
-#~ msgstr "Styl:"
-
-#~ msgid "Size:"
-#~ msgstr "Wielkoœๆ:"
-
-#~ msgid "E256: Hangul automata ERROR"
-#~ msgstr "E256: BฃฅD w automacie Hangul"
-
-#~ msgid "E563: stat error"
-#~ msgstr "E563: bณนd stat"
-
-#~ msgid "E625: cannot open cscope database: %s"
-#~ msgstr "E625: nie mog๊ otworzyๆ bazy danych cscope: %s"
-
-#~ msgid "E626: cannot get cscope database information"
-#~ msgstr "E626: nie mog๊ uzyskaๆ informacji z bazy danych cscope"
-
-#~ msgid "Lua library cannot be loaded."
-#~ msgstr "Nie moฟna wczytaๆ biblioteki Lua."
-
-#~ msgid "cannot save undo information"
-#~ msgstr "nie mog๊ zachowaๆ informacji cofania"
-
-#~ msgid ""
-#~ "E815: Sorry, this command is disabled, the MzScheme libraries could not "
-#~ "be loaded."
-#~ msgstr ""
-#~ "E815: Przykro mi, ta komenda jest wyณนczona, biblioteka MzScheme nie moฟe "
-#~ "byๆ zaณadowana."
-
-#~ msgid "invalid expression"
-#~ msgstr "niepoprawne wyraฟenie"
-
-#~ msgid "expressions disabled at compile time"
-#~ msgstr "wyraฟenia wyณนczone podczas kompilacji"
-
-#~ msgid "hidden option"
-#~ msgstr "ukryta opcja"
-
-#~ msgid "unknown option"
-#~ msgstr "nieznana opcja"
-
-#~ msgid "window index is out of range"
-#~ msgstr "indeks okna poza zakresem"
-
-#~ msgid "couldn't open buffer"
-#~ msgstr "nie mog๊ otworzyๆ bufora"
-
-#~ msgid "cannot delete line"
-#~ msgstr "nie mog๊ skasowaๆ wiersza"
-
-#~ msgid "cannot replace line"
-#~ msgstr "nie mog๊ zamieniๆ wiersza"
-
-#~ msgid "cannot insert line"
-#~ msgstr "nie mog๊ wprowadziๆ wiersza"
-
-#~ msgid "string cannot contain newlines"
-#~ msgstr "ciนg nie moฟe zawieraๆ znak๓w nowego wiersza"
-
-#~ msgid "error converting Scheme values to Vim"
-#~ msgstr "bณนd przy konwersji wartoœci Scheme do Vima"
-
-#~ msgid "Vim error: ~a"
-#~ msgstr "Bณนd vima: ~a"
-
-#~ msgid "Vim error"
-#~ msgstr "Bณนd Vima"
-
-#~ msgid "buffer is invalid"
-#~ msgstr "bufor jest niewaฟny"
-
-#~ msgid "window is invalid"
-#~ msgstr "okno jest niewaฟne"
-
-#~ msgid "linenr out of range"
-#~ msgstr "numer wiersza poza zakresem"
-
-#~ msgid "not allowed in the Vim sandbox"
-#~ msgstr "Niedozwolone w piaskownicy Vima"
-
-#~ msgid "E837: This Vim cannot execute :py3 after using :python"
-#~ msgstr "E837: Python: nie moฟna uฟywaๆ :py i :py3 w czasie jednej sesji"
-
-#~ msgid ""
-#~ "E263: Sorry, this command is disabled, the Python library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E263: Przykro mi, ta komenda jest wyณนczona, bo nie moฟna zaณadowaๆ "
-#~ "biblioteki Pythona"
-
-#~ msgid "E836: This Vim cannot execute :python after using :py3"
-#~ msgstr "E836: Python: nie moฟna uฟywaๆ :py i :py3 w czasie jednej sesji"
-
-#~ msgid "E659: Cannot invoke Python recursively"
-#~ msgstr "E659: Nie moฟna wywoณaๆ Pythona rekursywnie"
-
-#~ msgid "E265: $_ must be an instance of String"
-#~ msgstr "E265: $_ musi byๆ reprezentacjน ฃa๑cucha"
-
-#~ msgid ""
-#~ "E266: Sorry, this command is disabled, the Ruby library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E266: Przykro mi, ta komenda jest wyณนczona, bo nie moฟna zaณadowaๆ "
-#~ "biblioteki Ruby."
-
-#~ msgid "E267: unexpected return"
-#~ msgstr "E267: nieoczekiwany return"
-
-#~ msgid "E268: unexpected next"
-#~ msgstr "E268: nieoczekiwany next"
-
-#~ msgid "E269: unexpected break"
-#~ msgstr "E269: nieoczekiwany break"
-
-#~ msgid "E270: unexpected redo"
-#~ msgstr "E270: nieoczekiwane redo"
-
-#~ msgid "E271: retry outside of rescue clause"
-#~ msgstr "E271: ponowna pr๓ba poza klauzulน ratunku"
-
-#~ msgid "E272: unhandled exception"
-#~ msgstr "E272: nieobsณugiwany wyjนtek"
-
-#~ msgid "E273: unknown longjmp status %d"
-#~ msgstr "E273: Nieznany status longjmp %d"
-
-#~ msgid "Toggle implementation/definition"
-#~ msgstr "Przeณนcz mi๊dzy implementacjน/okreœleniem"
-
-#~ msgid "Show base class of"
-#~ msgstr "Pokaฟ baz๊ klasy"
-
-#~ msgid "Show overridden member function"
-#~ msgstr "Pokaฟ przepisanน funkcj๊ czณonowน"
-
-#~ msgid "Retrieve from file"
-#~ msgstr "Pobieraj z pliku"
-
-#~ msgid "Retrieve from project"
-#~ msgstr "Pobieraj z projektu"
-
-#~ msgid "Retrieve from all projects"
-#~ msgstr "Pobieraj z wszystkich projekt๓w"
-
-#~ msgid "Retrieve"
-#~ msgstr "Pobierz"
-
-#~ msgid "Show source of"
-#~ msgstr "Pokaฟ Ÿr๓dณo dla"
-
-#~ msgid "Find symbol"
-#~ msgstr "ZnajdŸ symbol"
-
-#~ msgid "Browse class"
-#~ msgstr "Przejrzyj klas๊"
-
-#~ msgid "Show class in hierarchy"
-#~ msgstr "Pokaฟ klas๊ w hierarchii"
-
-#~ msgid "Show class in restricted hierarchy"
-#~ msgstr "Pokaฟ klas๊ w ograniczonej hierarchii"
-
-#~ msgid "Xref refers to"
-#~ msgstr "Xref odnosi si๊ do"
-
-#~ msgid "Xref referred by"
-#~ msgstr "Xref ma odniesienia od"
-
-#~ msgid "Xref has a"
-#~ msgstr "Xref ma"
-
-#~ msgid "Xref used by"
-#~ msgstr "Xref uฟyte przez"
-
-#~ msgid "Show docu of"
-#~ msgstr "Pokaฟ dokumentacj๊ dla"
-
-#~ msgid "Generate docu for"
-#~ msgstr "Utw๓rz dokumentacj๊ dla"
-
-#~ msgid ""
-#~ "Cannot connect to SNiFF+. Check environment (sniffemacs must be found in "
-#~ "$PATH).\n"
-#~ msgstr ""
-#~ "Nie mog๊ podณนczyๆ do SNiFF+. SprawdŸ œrodowisko (sniffemacs musi byๆ "
-#~ "odnaleziony w $PATH).\n"
-
-#~ msgid "E274: Sniff: Error during read. Disconnected"
-#~ msgstr "E274: Sniff: Bณนd podczas czytania. Rozณนczenie"
-
-#~ msgid "SNiFF+ is currently "
-#~ msgstr "SNiFF+ jest obecnie "
-
-#~ msgid "not "
-#~ msgstr "nie "
-
-#~ msgid "connected"
-#~ msgstr "podณนczony"
-
-#~ msgid "E275: Unknown SNiFF+ request: %s"
-#~ msgstr "E275: Nieznane zapytanie SNiFF+: %s"
-
-#~ msgid "E276: Error connecting to SNiFF+"
-#~ msgstr "E276: Bณนd w trakcie podณนczania do SNiFF+"
-
-#~ msgid "E278: SNiFF+ not connected"
-#~ msgstr "E278: SNiFF+ niepodณนczony"
-
-#~ msgid "E279: Not a SNiFF+ buffer"
-#~ msgstr "E279: Nie jest buforem SNiFF+"
-
-#~ msgid "Sniff: Error during write. Disconnected"
-#~ msgstr "Sniff: Bณนd w trakcie zapisu. Rozณนczony"
-
-#~ msgid "invalid buffer number"
-#~ msgstr "niewณaœciwy numer bufora"
-
-#~ msgid "not implemented yet"
-#~ msgstr "obecnie nie zaimplementowano"
-
-#~ msgid "cannot set line(s)"
-#~ msgstr "nie mog๊ ustawiๆ wiersza(y)"
-
-#~ msgid "invalid mark name"
-#~ msgstr "niepoprawna nazwa zakณadki"
-
-#~ msgid "mark not set"
-#~ msgstr "zakณadka nie ustawiona"
-
-#~ msgid "row %d column %d"
-#~ msgstr "wiersz %d kolumna %d"
-
-#~ msgid "cannot insert/append line"
-#~ msgstr "nie mog๊ wprowadziๆ/doณนczyๆ wiersza"
-
-#~ msgid "line number out of range"
-#~ msgstr "numer wiersza poza zakresem"
-
-#~ msgid "unknown flag: "
-#~ msgstr "nieznana flaga: "
-
-#~ msgid "unknown vimOption"
-#~ msgstr "nieznane vimOption"
-
-#~ msgid "keyboard interrupt"
-#~ msgstr "przerwanie klawiatury"
-
-#~ msgid "vim error"
-#~ msgstr "bณนd vima"
-
-#~ msgid "cannot create buffer/window command: object is being deleted"
-#~ msgstr "nie mog๊ stworzyๆ bufora/okna komendy: obiekt jest kasowany"
-
-#~ msgid ""
-#~ "cannot register callback command: buffer/window is already being deleted"
-#~ msgstr ""
-#~ "nie mog๊ zarejestrowaๆ wstecznego wywoณania komendy: bufor/okno juฟ "
-#~ "zostaณa skasowana"
-
-#~ msgid ""
-#~ "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-"
-#~ "dev@vim.org"
-#~ msgstr ""
-#~ "E280: TCL FATALNY BฃฅD: reflist zepsuta!? Prosz๊ zณoฟyๆ raport o tym na "
-#~ "vim-dev@vim.org"
-
-#~ msgid "cannot register callback command: buffer/window reference not found"
-#~ msgstr ""
-#~ "nie mog๊ zarejestrowaๆ wstecznego wywoณania komendy: brak odniesienia do "
-#~ "bufora/okna"
-
-#~ msgid ""
-#~ "E571: Sorry, this command is disabled: the Tcl library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E571: Przykro mi, ta komenda jest wyณนczona, bo nie moฟna zaณadowaๆ "
-#~ "biblioteki Tcl."
-
-#~ msgid "E572: exit code %d"
-#~ msgstr "E572: kod wyjœcia %d"
-
-#~ msgid "cannot get line"
-#~ msgstr "nie mog๊ dostaๆ wiersza"
-
-#~ msgid "Unable to register a command server name"
-#~ msgstr "Nie mog๊ zarejestrowaๆ nazwy serwera komend"
-
-#~ msgid "E248: Failed to send command to the destination program"
-#~ msgstr "E248: Wysณanie komendy do programu docelowego nie powiodณo si๊"
-
-#~ msgid "E573: Invalid server id used: %s"
-#~ msgstr "E573: Uฟyto niewณaœciwego id serwera: %s"
-
-#~ msgid "E251: VIM instance registry property is badly formed. Deleted!"
-#~ msgstr ""
-#~ "E251: wcielenia instancji rejestru Vima jest Ÿle sformowane. Skasowano!"
-
-#~ msgid "netbeans is not supported with this GUI\n"
-#~ msgstr "netbeans nie sน obsณugiwane przez to GUI\n"
-
-#~ msgid "This Vim was not compiled with the diff feature."
-#~ msgstr "Ta wersja Vima nie byณa skompilowanego z opcjน r๓ฟnic (diff)."
-
-#~ msgid "'-nb' cannot be used: not enabled at compile time\n"
-#~ msgstr "'-nb' - nie moฟe byๆ uฟyte: nie wณนczone przy kompilacji\n"
-
-#~ msgid "Vim: Error: Failure to start gvim from NetBeans\n"
-#~ msgstr "Vim: Bณนd: Nie moฟna uruchomiๆ gvim z NetBeans\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Where case is ignored prepend / to make flag upper case"
-#~ msgstr ""
-#~ "\n"
-#~ "gdzie wielkoœๆ znak๓w jest ignorowana dodaj na poczนtku / by flaga byณa "
-#~ "wielkน literน"
-
-#~ msgid "-register\t\tRegister this gvim for OLE"
-#~ msgstr "-register\t\tZarejestruj tego gvima w OLE"
-
-#~ msgid "-unregister\t\tUnregister gvim for OLE"
-#~ msgstr "-unregister\t\tWyrejestruj gvima z OLE"
-
-#~ msgid "-g\t\t\tRun using GUI (like \"gvim\")"
-#~ msgstr "-g\t\t\tStartuj w GUI (tak jak \"gvim\")"
-
-#~ msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
-#~ msgstr "-f lub --nofork\tPierwszy plan: Nie wydzielaj przy odpalaniu GUI"
-
-#~ msgid "-f\t\t\tDon't use newcli to open window"
-#~ msgstr "-f\t\t\tNie stosuj newcli do otwierania okien"
-
-#~ msgid "-dev <device>\t\tUse <device> for I/O"
-#~ msgstr "-dev <device>\t\tUฟywaj <device> do I/O"
-
-#~ msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
-#~ msgstr "-U <gvimrc>\t\tUฟyj <gvimrc> zamiast jakiegokolwiek .gvimrc"
-
-#~ msgid "-x\t\t\tEdit encrypted files"
-#~ msgstr "-x\t\t\tEdytuj zakodowane pliki"
-
-#~ msgid "-display <display>\tConnect vim to this particular X-server"
-#~ msgstr "-display <display>\tPodณนcz vima to danego X-serwera"
-
-#~ msgid "-X\t\t\tDo not connect to X server"
-#~ msgstr "-X\t\t\tNie ณนcz z serwerem X"
-
-#~ msgid "--remote <files>\tEdit <files> in a Vim server if possible"
-#~ msgstr "--remote <pliki>\tEdytuj pliki w serwerze Vima jeœli moฟliwe"
-
-#~ msgid "--remote-silent <files> Same, don't complain if there is no server"
-#~ msgstr "--remote-silent <pliki> To samo, nie narzekaj jeœli nie ma serwera"
-
-#~ msgid ""
-#~ "--remote-wait <files> As --remote but wait for files to have been edited"
-#~ msgstr ""
-#~ "--remote-wait <pliki>\tTak jak --remote, lecz czekaj na pliki przed edycjน"
-
-#~ msgid ""
-#~ "--remote-wait-silent <files> Same, don't complain if there is no server"
-#~ msgstr ""
-#~ "--remote-wait-silent <pliki> To samo, nie narzekaj jeœli nie ma serwera"
-
-#~ msgid ""
-#~ "--remote-tab[-wait][-silent] <files> As --remote but use tab page per "
-#~ "file"
-#~ msgstr ""
-#~ "--remote-tab[-wait][-silent] <pliki> tak jak --remote ale uฟywa jednej "
-#~ "karty na plik"
-
-#~ msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
-#~ msgstr ""
-#~ "--remote-send <klawisze>\tWyœlij <klawisze> do serwera Vima i zako๑cz"
-
-#~ msgid ""
-#~ "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
-#~ msgstr "--remote-expr <wyr>\tWykonaj <wyraฟenie> w serwerze i wypisz wynik"
-
-#~ msgid "--serverlist\t\tList available Vim server names and exit"
-#~ msgstr "--serverlist\t\tWymie๑ nazwy dost๊pnych serwer๓w Vima i zako๑cz"
-
-#~ msgid "--servername <name>\tSend to/become the Vim server <name>"
-#~ msgstr "--servername <nazwa>\t\tOdsyณaj do/sta๑ si๊ serwerem Vim <nazwa>"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Motif version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Argumenty rozpoznawane przez gvim (wersja Motif):\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (neXtaw version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Argumenty rozpoznawane przez gvim (wersja neXtaw):\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Athena version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Argumenty rozpoznawane przez gvim (wersja Athena):\n"
-
-#~ msgid "-display <display>\tRun vim on <display>"
-#~ msgstr "-display <display>\tZaณaduj vim na <display>"
-
-#~ msgid "-iconic\t\tStart vim iconified"
-#~ msgstr "-iconic\t\tZacznij Vim jako ikon๊"
-
-#~ msgid "-background <color>\tUse <color> for the background (also: -bg)"
-#~ msgstr "-background <kolor>\tUฟywaj <kolor> dla tณa (r๓wnieฟ: -bg)"
-
-#~ msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
-#~ msgstr ""
-#~ "-foreground <kolor>\tUฟywaj <kolor> dla normalnego tekstu (r๓wnieฟ: -fg)"
-
-#~ msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
-#~ msgstr "-font <font>\t\tUฟywaj <font> dla normalnego tekstu (r๓wnieฟ: -fn)"
-
-#~ msgid "-boldfont <font>\tUse <font> for bold text"
-#~ msgstr "-boldfont <font>\tUฟywaj <font> dla wytณuszczonego tekstu"
-
-#~ msgid "-italicfont <font>\tUse <font> for italic text"
-#~ msgstr "-italicfont <font>\tUฟywaj <font> dla pochyณego"
-
-#~ msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
-#~ msgstr ""
-#~ "-geometry <geom>\tUฟywaj <geom> dla poczนtkowych rozmiar๓w (r๓wnieฟ: -"
-#~ "geom)"
-
-#~ msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
-#~ msgstr "-borderwidth <szer>\tUฟyj ramki o gruboœci <szer> (r๓wnieฟ: -bw)"
-
-#~ msgid ""
-#~ "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
-#~ msgstr ""
-#~ "-scrollbarwidth <szer> Uฟywaj przewijacza o szerokoœci <szer> (r๓wnieฟ: -"
-#~ "sw)"
-
-#~ msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
-#~ msgstr ""
-#~ "-menuheight <height>\tStosuj belk๊ menu o wysokoœci <height> (r๓wnieฟ: -"
-#~ "mh)"
-
-#~ msgid "-reverse\t\tUse reverse video (also: -rv)"
-#~ msgstr "-reverse\t\tStosuj negatyw kolor๓w (r๓wnieฟ: -rv)"
-
-#~ msgid "+reverse\t\tDon't use reverse video (also: +rv)"
-#~ msgstr "+reverse\t\tNie stosuj negatywu kolor๓w (r๓wnieฟ: +rv)"
-
-#~ msgid "-xrm <resource>\tSet the specified resource"
-#~ msgstr "-xrm <resource>\tUstaw okreœlony zas๓b"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (GTK+ version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Argumenty rozpoznawane przez gvim (wersja GTK+):\n"
-
-#~ msgid "-display <display>\tRun vim on <display> (also: --display)"
-#~ msgstr "-display <display>\tZastartuj vim na <display> (r๓wnieฟ: --display)"
-
-#~ msgid "--role <role>\tSet a unique role to identify the main window"
-#~ msgstr "--role <role>\tUstaw unikatowน rol๊ do identyfikacji gณ๓wnego okna"
-
-#~ msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
-#~ msgstr "--socketid <xid>\tOtw๓rz Vim wewnนtrz innego widgetu GTK"
-
-#~ msgid "--echo-wid\t\tMake gvim echo the Window ID on stdout"
-#~ msgstr "-echo-wid\t\tGvim wypisze Window ID na wyjœcie standardowe"
-
-#~ msgid "-P <parent title>\tOpen Vim inside parent application"
-#~ msgstr "-P <tytuณ rodzica>\tOtw๓rz Vima wewnนtrz rodzicielskiej aplikacji"
-
-#~ msgid "--windowid <HWND>\tOpen Vim inside another win32 widget"
-#~ msgstr "--windowid <HWND>\tOtw๓rz Vima wewnนtrz innego elementu win32"
-
-#~ msgid "No display"
-#~ msgstr "Brak display"
-
-#~ msgid ": Send failed.\n"
-#~ msgstr ": Wysณanie nie powiodณo si๊.\n"
-
-#~ msgid ": Send failed. Trying to execute locally\n"
-#~ msgstr ": Wysณanie nie powiodณo si๊. Pr๓buj๊ wykonaๆ na miejscu\n"
-
-#~ msgid "%d of %d edited"
-#~ msgstr "otworzono %d z %d"
-
-#~ msgid "No display: Send expression failed.\n"
-#~ msgstr "Brak terminala: Wysณanie wyraฟenia nie powiodณo si๊.\n"
-
-#~ msgid ": Send expression failed.\n"
-#~ msgstr ": Wysณanie wyraฟenia nie powiodณo si๊.\n"
-
-#~ msgid "E543: Not a valid codepage"
-#~ msgstr "E543: To nie jest waฟna strona kodowa"
-
-#~ msgid "E284: Cannot set IC values"
-#~ msgstr "E284: Nie mog๊ nastawiๆ wartoœci IC"
-
-#~ msgid "E285: Failed to create input context"
-#~ msgstr "E285: Nie mogณem stworzyๆ kontekstu wprowadze๑"
-
-#~ msgid "E286: Failed to open input method"
-#~ msgstr "E286: Nie mogณem otworzyๆ sposobu wprowadze๑"
-
-#~ msgid "E287: Warning: Could not set destroy callback to IM"
-#~ msgstr "E287: OSTRZEฏENIE: Nie mogณem zlikwidowaๆ wywoณania dla IM"
-
-#~ msgid "E288: input method doesn't support any style"
-#~ msgstr "E288: metoda wprowadze๑ nie wspomaga ฟadnego stylu"
-
-#~ msgid "E289: input method doesn't support my preedit type"
-#~ msgstr "E289: metoda wprowadze๑ nie wspomaga mojego typu preedit"
-
-#~ msgid "E843: Error while updating swap file crypt"
-#~ msgstr "E843: Bณนd w czasie uaktualniania szyfrowania pliku wymiany"
-
-#~ msgid ""
-#~ "E833: %s is encrypted and this version of Vim does not support encryption"
-#~ msgstr "E833: %s jest zaszyfrowany a ta wersja Vima nie wspiera szyfrowania"
-
-#~ msgid "Swap file is encrypted: \"%s\""
-#~ msgstr "Zaszyfrowany plik wymiany: \"%s\""
-
-#~ msgid ""
-#~ "\n"
-#~ "If you entered a new crypt key but did not write the text file,"
-#~ msgstr ""
-#~ "\n"
-#~ "Jeœli podano nowy klucz szyfrujนcy, ale nie zapisano pliku tekstowego,"
-
-#~ msgid ""
-#~ "\n"
-#~ "enter the new crypt key."
-#~ msgstr ""
-#~ "\n"
-#~ "wprowadŸ nowy klucz szyfrujนcy."
-
-#~ msgid ""
-#~ "\n"
-#~ "If you wrote the text file after changing the crypt key press enter"
-#~ msgstr ""
-#~ "\n"
-#~ "Jeœli zapisano plik tekstowy po zmianie klucza szyfrujนcego wciœnij Enter"
-
-#~ msgid ""
-#~ "\n"
-#~ "to use the same key for text file and swap file"
-#~ msgstr ""
-#~ "\n"
-#~ "aby uฟyๆ tego samego klucza dla pliku tekstowego i wymiany"
-
-#~ msgid "Using crypt key from swap file for the text file.\n"
-#~ msgstr "Uฟywam klucza szyfrujนcego z pliku wymiany do pliku tekstowego.\n"
-
-#~ msgid ""
-#~ "\n"
-#~ " [not usable with this version of Vim]"
-#~ msgstr ""
-#~ "\n"
-#~ " [nie nadaje si๊ dla tej wersji Vima]"
-
-#~ msgid "Tear off this menu"
-#~ msgstr "Oderwij to menu"
-
-#~ msgid "Select Directory dialog"
-#~ msgstr "Dialog wyboru katalogu"
-
-#~ msgid "Save File dialog"
-#~ msgstr "Dialog zapisywania pliku"
-
-#~ msgid "Open File dialog"
-#~ msgstr "Dialog otwierania pliku"
-
-#~ msgid "E338: Sorry, no file browser in console mode"
-#~ msgstr "E338: Przykro mi, nie ma przeglนdarki plik๓w w trybie konsoli"
-
-#~ msgid "Vim: preserving files...\n"
-#~ msgstr "Vim: zachowuj๊ plik...\n"
-
-#~ msgid "Vim: Finished.\n"
-#~ msgstr "Vim: Zako๑czono.\n"
-
-#~ msgid "ERROR: "
-#~ msgstr "BฃฅD: "
-
-#~ msgid ""
-#~ "\n"
-#~ "[bytes] total alloc-freed %<PRIu64>-%<PRIu64>, in use %<PRIu64>, peak use "
-#~ "%<PRIu64>\n"
-#~ msgstr ""
-#~ "\n"
-#~ "[bajt๓w] totalne alokacje-zwolnienia %<PRIu64>-%<PRIu64>, w uฟytku "
-#~ "%<PRIu64>, maksymalne uฟycie %<PRIu64>\n"
-
-#~ msgid ""
-#~ "[calls] total re/malloc()'s %<PRIu64>, total free()'s %<PRIu64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "[wywoณania] wszystkich re/malloc()-๓w %<PRIu64>, wszystkich free()-๓w "
-#~ "%<PRIu64>\n"
-#~ "\n"
-
-#~ msgid "E340: Line is becoming too long"
-#~ msgstr "E340: Wiersz staje si๊ zbyt dณugi"
-
-#~ msgid "E341: Internal error: lalloc(%<PRId64>, )"
-#~ msgstr "E341: Wewn๊trzny bณนd: lalloc(%<PRId64>, )"
-
-#~ msgid "E547: Illegal mouseshape"
-#~ msgstr "E547: Niedozwolony obrys myszki"
-
-#~ msgid "Enter encryption key: "
-#~ msgstr "WprowadŸ klucz do odkodowania: "
-
-#~ msgid "Enter same key again: "
-#~ msgstr "WprowadŸ ponownie ten sam klucz: "
-
-#~ msgid "Keys don't match!"
-#~ msgstr "Klucze nie pasujน do siebie!"
-
-#~ msgid "Cannot connect to Netbeans #2"
-#~ msgstr "Nie moฟna poณนczyๆ z Netbeans #2"
-
-#~ msgid "Cannot connect to Netbeans"
-#~ msgstr "Nie moฟna poณนczyๆ z Netbeans"
-
-#~ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
-#~ msgstr "E668: Bณ๊dny tryb dost๊pu pliku info poณนczenia NetBeans: \"%s\""
-
-#~ msgid "read from Netbeans socket"
-#~ msgstr "odczyt z gniazda Netbeans"
-
-#~ msgid "E658: NetBeans connection lost for buffer %<PRId64>"
-#~ msgstr "E658: Bufor %<PRId64> utraciณ poณนczenie z NetBeans"
-
-#~ msgid "E838: netbeans is not supported with this GUI"
-#~ msgstr "E838: netbeans nie sน obsณugiwane przez to GUI"
-
-#~ msgid "E511: netbeans already connected"
-#~ msgstr "E511: netbeans juฟ podณนczone"
-
-#~ msgid "E505: %s is read-only (add ! to override)"
-#~ msgstr "E505: %s jest tylko do odczytu (dodaj ! aby wymusiๆ)"
-
-#~ msgid "E775: Eval feature not available"
-#~ msgstr "E775: Funkcjonalnoœๆ eval nie jest dost๊pna"
-
-#~ msgid "freeing %<PRId64> lines"
-#~ msgstr "zwalniam %<PRId64> wierszy"
-
-#~ msgid "E530: Cannot change term in GUI"
-#~ msgstr "E530: Nie mog๊ zmieniๆ term w GUI"
-
-#~ msgid "E531: Use \":gui\" to start the GUI"
-#~ msgstr "E531: Uฟyj \":gui\" do odpalenia GUI"
-
-#~ msgid "E617: Cannot be changed in the GTK+ 2 GUI"
-#~ msgstr "E617: Nie mog๊ zmieniๆ w GTK+2 GUI"
-
-#~ msgid "E596: Invalid font(s)"
-#~ msgstr "E596: Niedozwolona czcionka/ki"
-
-#~ msgid "E597: can't select fontset"
-#~ msgstr "E597: nie mog๊ wybraๆ zestawu czcionek"
-
-#~ msgid "E598: Invalid fontset"
-#~ msgstr "E598: Niedozwolony zestaw czcionek"
-
-#~ msgid "E533: can't select wide font"
-#~ msgstr "E533: nie mog๊ wybraๆ szerokiej czcionki"
-
-#~ msgid "E534: Invalid wide font"
-#~ msgstr "E534: Niedozwolona szeroka czcionka"
-
-#~ msgid "E538: No mouse support"
-#~ msgstr "E538: Brak wspomagania myszki"
-
-#~ msgid "cannot open "
-#~ msgstr "nie mog๊ otworzyๆ "
-
-#~ msgid "VIM: Can't open window!\n"
-#~ msgstr "VIM: Nie mog๊ otworzyๆ okna!\n"
-
-#~ msgid "Need Amigados version 2.04 or later\n"
-#~ msgstr "Potrzebuj๊ Amigados w wersji 2.04 lub p๓Ÿniejszน\n"
-
-#~ msgid "Need %s version %<PRId64>\n"
-#~ msgstr "Potrzebuj๊ %s w wersji %<PRId64>\n"
-
-#~ msgid "Cannot open NIL:\n"
-#~ msgstr "Nie mog๊ otworzyๆ NIL:\n"
-
-#~ msgid "Cannot create "
-#~ msgstr "Nie mog๊ stworzyๆ "
-
-#~ msgid "Vim exiting with %d\n"
-#~ msgstr "Vim ko๑czy prac๊ z %d\n"
-
-#~ msgid "cannot change console mode ?!\n"
-#~ msgstr "nie mog๊ zmieniๆ trybu konsoli ?!\n"
-
-#~ msgid "mch_get_shellsize: not a console??\n"
-#~ msgstr "mch_get_shellsize: nie jest konsolน??\n"
-
-#~ msgid "E360: Cannot execute shell with -f option"
-#~ msgstr "E360: Nie mog๊ wykonaๆ powณoki z opcjน -f"
-
-#~ msgid "Cannot execute "
-#~ msgstr "Nie mog๊ wykonaๆ "
-
-#~ msgid "shell "
-#~ msgstr "powณoka "
-
-#~ msgid " returned\n"
-#~ msgstr " zwr๓ciณ\n"
-
-#~ msgid "ANCHOR_BUF_SIZE too small."
-#~ msgstr "ANCHOR_BUF_SIZE zbyt niskie."
-
-#~ msgid "I/O ERROR"
-#~ msgstr "BฃฅD I/O"
-
-#~ msgid "Message"
-#~ msgstr "Wiadomoœๆ"
-
-#~ msgid "'columns' is not 80, cannot execute external commands"
-#~ msgstr "'columns' nie wynosi 80, nie mog๊ wykonaๆ zewn๊trznych komend"
-
-#~ msgid "E237: Printer selection failed"
-#~ msgstr "E237: Wyb๓r drukarki nie powi๓dณ si๊"
-
-#~ msgid "to %s on %s"
-#~ msgstr "do %s z %s"
-
-#~ msgid "E613: Unknown printer font: %s"
-#~ msgstr "E613: Nieznana czcionka drukarki: %s"
-
-#~ msgid "E238: Print error: %s"
-#~ msgstr "E238: Bณนd drukarki: %s"
-
-#~ msgid "Printing '%s'"
-#~ msgstr "Wydrukowano '%s'"
-
-#~ msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
-#~ msgstr ""
-#~ "E244: Niedozwolona nazwa zestawu znak๓w \"%s\" w nazwie czcionki \"%s\""
-
-#~ msgid "E245: Illegal char '%c' in font name \"%s\""
-#~ msgstr "E245: Niedozwolony znak '%c' w nazwie czcionki \"%s\""
-
-#~ msgid "Vim: Double signal, exiting\n"
-#~ msgstr "Vim: Podw๓jny sygnaณ, wychodz๊\n"
-
-#~ msgid "Vim: Caught deadly signal %s\n"
-#~ msgstr "Vim: Zaณapaณ œmiertelny sygnaณ %s\n"
-
-#~ msgid "Vim: Caught deadly signal\n"
-#~ msgstr "Vim: Zaณapaณ œmiertelny sygnaณ\n"
-
-#~ msgid "Opening the X display took %<PRId64> msec"
-#~ msgstr "Otwieranie ekranu X trwaณo %<PRId64> msec"
-
-#~ msgid ""
-#~ "\n"
-#~ "Vim: Got X error\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Vim: Dostaณ bณนd X\n"
-
-#~ msgid "Testing the X display failed"
-#~ msgstr "Test ekranu X nie powi๓dณ si๊"
-
-#~ msgid "Opening the X display timed out"
-#~ msgstr "Pr๓ba otwarcia ekranu X trwaณa zbyt dณugo"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot execute shell sh\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Nie mog๊ wykonaๆ powณoki sh\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot create pipes\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Nie mog๊ stworzyๆ potok๓w\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot fork\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Nie mog๊ rozdzieliๆ si๊\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Command terminated\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Komenda zako๑czona\n"
-
-#~ msgid "XSMP lost ICE connection"
-#~ msgstr "XSMP straciณ poณนczenie ICE"
-
-#~ msgid "Opening the X display failed"
-#~ msgstr "Otwarcie ekranu X nie powiodณo si๊"
-
-#~ msgid "XSMP handling save-yourself request"
-#~ msgstr "XSMP obsณuguje ฟนdanie samozapisu"
-
-#~ msgid "XSMP opening connection"
-#~ msgstr "XSMP otwiera poณนczenie"
-
-#~ msgid "XSMP ICE connection watch failed"
-#~ msgstr "Obserwacja poณนczenia XSMP ICE nie powiodณa si๊"
-
-#~ msgid "XSMP SmcOpenConnection failed: %s"
-#~ msgstr "XSMP SmcOpenConnection nie powiodณo si๊: %s"
-
-#~ msgid "At line"
-#~ msgstr "W wierszu"
-
-#~ msgid "Could not load vim32.dll!"
-#~ msgstr "Nie mog๊ zaณadowaๆ vim32.dll!"
-
-#~ msgid "VIM Error"
-#~ msgstr "Bณนd VIM"
-
-#~ msgid "Could not fix up function pointers to the DLL!"
-#~ msgstr "Nie zdoณaณem poprawiๆ wskaŸnik๓w funkcji w DLL!"
-
-#~ msgid "shell returned %d"
-#~ msgstr "powณoka zwr๓ciณa %d"
-
-#~ msgid "Vim: Caught %s event\n"
-#~ msgstr "Vim: Zaณapaณ wydarzenie %s\n"
-
-#~ msgid "close"
-#~ msgstr "zamknij"
-
-#~ msgid "logoff"
-#~ msgstr "wyloguj"
-
-#~ msgid "shutdown"
-#~ msgstr "zako๑cz"
-
-#~ msgid "E371: Command not found"
-#~ msgstr "E371: Nie znaleziono komendy"
-
-#~ msgid ""
-#~ "VIMRUN.EXE not found in your $PATH.\n"
-#~ "External commands will not pause after completion.\n"
-#~ "See :help win32-vimrun for more information."
-#~ msgstr ""
-#~ "VIMRUN.EXE nie znaleziono w twoim $PATH.\n"
-#~ "Zewn๊trzne komendy nie b๊dน wstrzymane po wykonaniu.\n"
-#~ "Zobacz :help wim32-vimrun aby otrzymaๆ wi๊cej informacji."
-
-#~ msgid "Vim Warning"
-#~ msgstr "Vim Ostrzeฟenie"
-
-#~ msgid "Error file"
-#~ msgstr "Plik bณ๊du"
-
-#~ msgid "E868: Error building NFA with equivalence class!"
-#~ msgstr "E868: Bณนd przy budowwaniu NFA z klasน ekwiwalencji"
-
-#~ msgid "E878: (NFA) Could not allocate memory for branch traversal!"
-#~ msgstr ""
-#~ "E878: (NFA) Nie moฟna przydzieliๆ pami๊ci do przejœcia przez gaณ๊zie!"
-
-#~ msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\""
-#~ msgstr ""
-#~ "Ostrzeฟenie: Nie mog๊ znaleŸๆ listy sณ๓w \"%s_%s.spl\" lub \"%s_ascii.spl"
-#~ "\""
-
-#~ msgid "Conversion in %s not supported"
-#~ msgstr "Konwersja w %s nie jest wspierana"
-
-#~ msgid "E845: Insufficient memory, word list will be incomplete"
-#~ msgstr ""
-#~ "E845: Nie wystarczajนca iloœๆ pami๊ci, lista sณ๓w b๊dzie niekompletna"
-
-#~ msgid "E430: Tag file path truncated for %s\n"
-#~ msgstr "E430: Trop szukania pliku znacznik๓w obci๊ty dla %s\n"
-
-#~ msgid "new shell started\n"
-#~ msgstr "uruchomiono nowน powณok๊\n"
-
-#~ msgid "Used CUT_BUFFER0 instead of empty selection"
-#~ msgstr "Uฟywam CUT_BUFFER0 zamiast pustego wyboru"
-
-#~ msgid "No undo possible; continue anyway"
-#~ msgstr "Cofni๊cie niemoฟliwe; mimo to kontynuuj๊"
-
-#~ msgid "E832: Non-encrypted file has encrypted undo file: %s"
-#~ msgstr "E832: Nie zaszyfrowany plik ma zaszyfrowany plik undo: %s"
-
-#~ msgid "E826: Undo file decryption failed: %s"
-#~ msgstr "E826: Nie powiodณo si๊ odszyfrowywanie pliku undo: %s"
-
-#~ msgid "E827: Undo file is encrypted: %s"
-#~ msgstr "E827: Plik undo jest zaszyfrowany: %s"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16/32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "16/32-bit wersja GUI dla MS-Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "64 bitowa wersja GUI dla MS-Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "32 bitowa wersja GUI dla MS-Windows"
-
-#~ msgid " in Win32s mode"
-#~ msgstr " w trybie Win32s"
-
-#~ msgid " with OLE support"
-#~ msgstr " ze wspomaganiem OLE"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "32 bitowa wersja na konsol๊ dla MS-Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "32 bitowa wersja na konsol๊ dla MS-Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16-bit version"
-#~ msgstr ""
-#~ "\n"
-#~ "16 bitowa wersja dla MS-Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "32-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "32 bitowa wersja dla MS-DOS"
-
-#~ msgid ""
-#~ "\n"
-#~ "16-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "16 bitowa wersja dla MS-DOS"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X (unix) version"
-#~ msgstr ""
-#~ "\n"
-#~ "wersja dla MacOS X (unix)"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X version"
-#~ msgstr ""
-#~ "\n"
-#~ "wersja dla MacOS X"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "wersja dla MacOS"
-
-#~ msgid ""
-#~ "\n"
-#~ "OpenVMS version"
-#~ msgstr ""
-#~ "\n"
-#~ "wersja dla OpenVMS"
-
-#~ msgid ""
-#~ "\n"
-#~ "Big version "
-#~ msgstr ""
-#~ "\n"
-#~ "Duฟa wersja "
-
-#~ msgid ""
-#~ "\n"
-#~ "Normal version "
-#~ msgstr ""
-#~ "\n"
-#~ "Normalna wersja "
-
-#~ msgid ""
-#~ "\n"
-#~ "Small version "
-#~ msgstr ""
-#~ "\n"
-#~ "Maณa wersja "
-
-#~ msgid ""
-#~ "\n"
-#~ "Tiny version "
-#~ msgstr ""
-#~ "\n"
-#~ "Malutka wersja "
-
-#~ msgid "with GTK2-GNOME GUI."
-#~ msgstr "z GTK2-GNOME GUI."
-
-#~ msgid "with GTK2 GUI."
-#~ msgstr "z GTK2 GUI."
-
-#~ msgid "with X11-Motif GUI."
-#~ msgstr "z X11-Motif GUI."
-
-#~ msgid "with X11-neXtaw GUI."
-#~ msgstr "z X11-neXtaw GUI."
-
-#~ msgid "with X11-Athena GUI."
-#~ msgstr "z X11-Athena GUI."
-
-#~ msgid "with Photon GUI."
-#~ msgstr "z Photon GUI."
-
-#~ msgid "with GUI."
-#~ msgstr "z GUI."
-
-#~ msgid "with Carbon GUI."
-#~ msgstr "z Carbon GUI."
-
-#~ msgid "with Cocoa GUI."
-#~ msgstr "z Cocoa GUI."
-
-#~ msgid "with (classic) GUI."
-#~ msgstr "z (klasycznym) GUI."
-
-#~ msgid " system gvimrc file: \""
-#~ msgstr " gvimrc systemu: \""
-
-#~ msgid " user gvimrc file: \""
-#~ msgstr " gvimrc uฟytkownika: \""
-
-#~ msgid "2nd user gvimrc file: \""
-#~ msgstr "2-gi plik gvimrc uฟytkownika: \""
-
-#~ msgid "3rd user gvimrc file: \""
-#~ msgstr "3-ci plik gvimrc uฟytkownika: \""
-
-#~ msgid " system menu file: \""
-#~ msgstr " systemowy plik menu: \""
-
-#~ msgid "Compiler: "
-#~ msgstr "Kompilator: "
-
-#~ msgid "menu Help->Orphans for information "
-#~ msgstr "menu Pomoc->Sieroty dla informacji to tym "
-
-#~ msgid "Running modeless, typed text is inserted"
-#~ msgstr "Uruchomiony bez tryb๓w, wpisany tekst jest wprowadzany"
-
-#~ msgid "menu Edit->Global Settings->Toggle Insert Mode "
-#~ msgstr "menu Edytuj->Ustawienia globalne->Tryb wstawiania"
-
-#~ msgid " for two modes "
-#~ msgstr " dla dw๓ch tryb๓w "
-
-#~ msgid "menu Edit->Global Settings->Toggle Vi Compatible"
-#~ msgstr "menu Edytuj->Ustawienia globalne->Kompatybilnoœๆ z Vi"
-
-#~ msgid " for Vim defaults "
-#~ msgstr " dla domyœlnych ustawie๑ Vima "
-
-#~ msgid "WARNING: Windows 95/98/ME detected"
-#~ msgstr "OSTRZEฏENIE: wykryto Windows 95/98/ME"
-
-#~ msgid "type :help windows95<Enter> for info on this"
-#~ msgstr "wprowadŸ :help windows95<Enter> dla informacji to tym "
-
-#~ msgid "E370: Could not load library %s"
-#~ msgstr "E370: Nie mogณem zaณadowaๆ biblioteki %s"
-
-#~ msgid ""
-#~ "Sorry, this command is disabled: the Perl library could not be loaded."
-#~ msgstr ""
-#~ "Przykro mi, ta komenda jest wyณนczona: nie mogณem zaณadowaๆ biblioteki "
-#~ "Perla."
-
-#~ msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
-#~ msgstr "E299: wyliczenie Perla zabronione w piaskownicy bez moduณu Safe"
-
-#~ msgid "Edit with &multiple Vims"
-#~ msgstr "Edytuj w &wielu Vimach"
-
-#~ msgid "Edit with single &Vim"
-#~ msgstr "Edytuj w pojedynczym &Vimie"
-
-#~ msgid "Diff with Vim"
-#~ msgstr "Diff z Vimem"
-
-#~ msgid "Edit with &Vim"
-#~ msgstr "Edytuj w &Vimie"
-
-#~ msgid "Edit with existing Vim - "
-#~ msgstr "Edytuj z istniejนcym Vimem - "
-
-#~ msgid "Edits the selected file(s) with Vim"
-#~ msgstr "Edytuj wybrane pliki w Vimie"
-
-#~ msgid "Error creating process: Check if gvim is in your path!"
-#~ msgstr "Bณนd tworzenia procesu: SprawdŸ czy gvim jest w twojej œcieฟce!"
-
-#~ msgid "gvimext.dll error"
-#~ msgstr "bณนd gvimext.dll"
-
-#~ msgid "Path length too long!"
-#~ msgstr "Za dณuga œcieฟka!"
-
-#~ msgid "E234: Unknown fontset: %s"
-#~ msgstr "E234: Nieznany zestaw czcionek: %s"
-
-#~ msgid "E235: Unknown font: %s"
-#~ msgstr "E235: Nieznana czcionka: %s"
-
-#~ msgid "E236: Font \"%s\" is not fixed-width"
-#~ msgstr "E236: Czcionka \"%s\" nie ma staณej szerokoœci znak๓w"
-
-#~ msgid "E448: Could not load library function %s"
-#~ msgstr "E448: Nie moฟna zaณadowaๆ funkcji biblioteki %s"
-
-#~ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
-#~ msgstr ""
-#~ "E26: Hebrajski nie moฟe byๆ uฟyty: Nie wณนczono podczas kompilacji\n"
-
-#~ msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
-#~ msgstr "E27: Farsi nie moฟe byๆ uฟyty: Nie wณนczono podczas kompilacji\n"
-
-#~ msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
-#~ msgstr "E800: Arabski nie moฟe byๆ uฟyty: Nie wณนczono podczas kompilacji\n"
-
-#~ msgid "E247: no registered server named \"%s\""
-#~ msgstr "E247: brak zarejestrowanego serwera o nazwie \"%s\""
-
-#~ msgid "E233: cannot open display"
-#~ msgstr "E233: nie mog๊ otworzyๆ ekranu"
-
-#~ msgid "E449: Invalid expression received"
-#~ msgstr "E449: Odebraณem niewณaœciwe wyraฟenie"
-
-#~ msgid "E463: Region is guarded, cannot modify"
-#~ msgstr "E463: Region jest chroniony, nie mog๊ zmieniๆ"
-
-#~ msgid "E744: NetBeans does not allow changes in read-only files"
-#~ msgstr "E744: NetBeans nie zezwala na zmiany w plikach tylko do odczytu"
-
-#~ msgid "Need encryption key for \"%s\""
-#~ msgstr "Potrzebuj๊ klucza szyfrowania dla \"%s\""
-
-#~ msgid "empty keys are not allowed"
-#~ msgstr "puste klucze nie sน dozwolone"
-
-#~ msgid "dictionary is locked"
-#~ msgstr "sณownik jest zablokowany"
-
-#~ msgid "list is locked"
-#~ msgstr "lista jest zablokowana"
-
-#~ msgid "failed to add key '%s' to dictionary"
-#~ msgstr "nie powiodณo si๊ dodanie klucza '%s' do sณownika"
-
-#~ msgid "index must be int or slice, not %s"
-#~ msgstr "indeks musi byๆ liczbน lub wycinkiem, nie %s"
-
-#~ msgid "expected str() or unicode() instance, but got %s"
-#~ msgstr "czekaณem na str() lub unicode(), a dostaณem %s"
-
-#~ msgid "expected bytes() or str() instance, but got %s"
-#~ msgstr "czekaณem na bytes() lub str(), a dostaณem %s"
-
-#~ msgid ""
-#~ "expected int(), long() or something supporting coercing to long(), but "
-#~ "got %s"
-#~ msgstr ""
-#~ "czekaณem na int(), long() lub coœ co moฟna zmieniๆ na long(), ale "
-#~ "dostaณem %s"
-
-#~ msgid "expected int() or something supporting coercing to int(), but got %s"
-#~ msgstr ""
-#~ "czekaณem na int() lub coœ co moฟna zmieniๆ na int(), ale dostaณem %s"
-
-#~ msgid "value is too large to fit into C int type"
-#~ msgstr "wartoœๆ zbyt duฟa by zmieœciณa si๊ w typie int C"
-
-#~ msgid "value is too small to fit into C int type"
-#~ msgstr "wartoœๆ jest zbyt maณa by zmieœciณa si๊ w typie int C"
-
-#~ msgid "number must be greater then zero"
-#~ msgstr "liczba musi byๆ wi๊ksza niฟ zero"
-
-#~ msgid "number must be greater or equal to zero"
-#~ msgstr "liczba musi byๆ wi๊ksza lub mniejsza niฟ zero"
-
-#~ msgid "can't delete OutputObject attributes"
-#~ msgstr "nie mog๊ skasowaๆ atrybut๓w OutputObject"
-
-#~ msgid "invalid attribute: %s"
-#~ msgstr "niepoprawny atrybut: %s"
-
-#~ msgid "E264: Python: Error initialising I/O objects"
-#~ msgstr "E264: Python: Bณนd w uruchomieniu obiekt๓w I/O"
-
-#~ msgid "failed to change directory"
-#~ msgstr "nie powiodณa si๊ zmiana katalogu"
-
-#~ msgid "expected 3-tuple as imp.find_module() result, but got %s"
-#~ msgstr "czekaณem na 3-krotk๊ jako wynik imp.find_module(), a dostaณem %s"
-
-#~ msgid ""
-#~ "expected 3-tuple as imp.find_module() result, but got tuple of size %d"
-#~ msgstr ""
-#~ "czekaณem na 3-krotk๊ jako wynik imp.find_module(), a dostaณem krotk๊ o "
-#~ "wielkoœci %d"
-
-#~ msgid "internal error: imp.find_module returned tuple with NULL"
-#~ msgstr "wewn๊trzny bณนd: imp.find_module zwr๓ciณ krotk๊ z NULL"
-
-#~ msgid "cannot delete vim.Dictionary attributes"
-#~ msgstr "nie mog๊ usunนๆ atrybut๓w vim.Dictionary"
-
-#~ msgid "cannot modify fixed dictionary"
-#~ msgstr "nie mog๊ zmieniๆ zablokowanego sณownika"
-
-#~ msgid "cannot set attribute %s"
-#~ msgstr "nie mog๊ ustawiๆ atrybutu %s"
-
-#~ msgid "hashtab changed during iteration"
-#~ msgstr "hashtab zmieniณ si๊ w czasie iteracji"
-
-#~ msgid "expected sequence element of size 2, but got sequence of size %d"
-#~ msgstr ""
-#~ "czekaณem na element sekwencyjny od dณugoœci 2, a dostaณem sekwencj๊ o "
-#~ "dณugoœci %d"
-
-#~ msgid "list constructor does not accept keyword arguments"
-#~ msgstr "konstruktor listy nie akceptuje sณ๓w kluczowych jako argument๓w"
-
-#~ msgid "list index out of range"
-#~ msgstr "indeks listy poza zakresem"
-
-#~ msgid "internal error: failed to get vim list item %d"
-#~ msgstr "bณนd wewn๊trzny: nie powiodณo si๊ pobranie z listy Vima elementu %d"
-
-#~ msgid "failed to add item to list"
-#~ msgstr "nie powiodณo si๊ dodanie elementu do listy"
-
-#~ msgid "internal error: no vim list item %d"
-#~ msgstr "bณนd wewn๊trzny: w liœcie Vima brak elementu %d"
-
-#~ msgid "internal error: failed to add item to list"
-#~ msgstr "bณนd wewn๊trzny: nie powiodณo si๊ dodanie elementu do listy"
-
-#~ msgid "cannot delete vim.List attributes"
-#~ msgstr "nie mog๊ usunนๆ atrybut๓w vim.List"
-
-#~ msgid "cannot modify fixed list"
-#~ msgstr "nie mog๊ zmieniๆ zablokowanej listy"
-
-#~ msgid "unnamed function %s does not exist"
-#~ msgstr "nie nazwana funkcja %s nie istnieje"
-
-#~ msgid "function %s does not exist"
-#~ msgstr "funkcja %s nie istnieje"
-
-#~ msgid "function constructor does not accept keyword arguments"
-#~ msgstr "konstruktor funkcji nie akceptuje sณ๓w kluczowych jako argument๓w"
-
-#~ msgid "failed to run function %s"
-#~ msgstr "nie mog๊ uruchomiๆ funkcji %s"
-
-#~ msgid "problem while switching windows"
-#~ msgstr "wystนpiณ problem w czasie zmiany okien"
-
-#~ msgid "unable to unset global option %s"
-#~ msgstr "nie mog๊ wyzerowaๆ opcji globalnej %s"
-
-#~ msgid "unable to unset option %s which does not have global value"
-#~ msgstr "nie mog๊ wyzerowaๆ opcji %s, kt๓ra nie ma wartoœci globalnej"
-
-#~ msgid "attempt to refer to deleted tab page"
-#~ msgstr "pr๓ba odniesienia do skasowanej karty"
-
-#~ msgid "no such tab page"
-#~ msgstr "nie ma takiej karty"
-
-#~ msgid "attempt to refer to deleted window"
-#~ msgstr "pr๓ba odniesienia do skasowanego okna"
-
-#~ msgid "readonly attribute: buffer"
-#~ msgstr "atrybut tylko do odczytu: bufor"
-
-#~ msgid "cursor position outside buffer"
-#~ msgstr "pozycja kursora poza buforem"
-
-#~ msgid "no such window"
-#~ msgstr "nie ma takiego okna"
-
-#~ msgid "attempt to refer to deleted buffer"
-#~ msgstr "pr๓ba odniesienia do skasowanego bufora"
-
-#~ msgid "failed to rename buffer"
-#~ msgstr "nie powiodณa si๊ zmiana nazwy bufora"
-
-#~ msgid "mark name must be a single character"
-#~ msgstr "nazwa zakณadki musi byๆ pojedynczym znakiem"
-
-#~ msgid "expected vim.Buffer object, but got %s"
-#~ msgstr "oczekiwaณem na obiekt vim.Buffer, a dostaณem %s"
-
-#~ msgid "failed to switch to buffer %d"
-#~ msgstr "nie przeszedณem do bufora %d"
-
-#~ msgid "expected vim.Window object, but got %s"
-#~ msgstr "oczekiwaณem na obiekt vim.Window, a dostaณem %s"
-
-#~ msgid "failed to find window in the current tab page"
-#~ msgstr "nie znaleziono okna na bieฟนcej karcie"
-
-#~ msgid "did not switch to the specified window"
-#~ msgstr "nie przeszedณem do okreœlonego okna"
-
-#~ msgid "expected vim.TabPage object, but got %s"
-#~ msgstr "oczekiwaณem na obiekt vim.TabPage, a dostaณem %s"
-
-#~ msgid "did not switch to the specified tab page"
-#~ msgstr "nie przeszedณem do okreœlonej karty"
-
-#~ msgid "failed to run the code"
-#~ msgstr "uruchomienie kodu si๊ nie powiodณo"
-
-#~ msgid "E858: Eval did not return a valid python object"
-#~ msgstr "E858: eval nie zwr๓ciณo odpowiedniego obiektu pythona"
-
-#~ msgid "E859: Failed to convert returned python object to vim value"
-#~ msgstr "E859: Nie powiodณa si๊ konwersja obiektu pythona do wartoœci Vima"
-
-#~ msgid "unable to convert %s to vim dictionary"
-#~ msgstr "nie moฟna konwertowaๆ %s do sณownika Vima"
-
-#~ msgid "unable to convert %s to vim structure"
-#~ msgstr "nie moฟna konwertowaๆ %s do struktury Vima"
-
-#~ msgid "internal error: NULL reference passed"
-#~ msgstr "bณนd wewn๊trzny: przekazano referencj๊ NULL"
-
-#~ msgid "internal error: invalid value type"
-#~ msgstr "bณนd wewn๊trzny: bณ๊dny typ wartoœci"
-
-#~ msgid ""
-#~ "Failed to set path hook: sys.path_hooks is not a list\n"
-#~ "You should now do the following:\n"
-#~ "- append vim.path_hook to sys.path_hooks\n"
-#~ "- append vim.VIM_SPECIAL_PATH to sys.path\n"
-#~ msgstr ""
-#~ "Nie mog๊ ustawiๆ haka œcieฟki: sys.path_hooks nie jest listน\n"
-#~ "Powinieneœ teraz wykonaๆ nast๊pujนce czynnoœci:\n"
-#~ "- dodaๆ vim.path_hook do sys.path_hooks\n"
-#~ "- dodaๆ vim.VIM_SPECIAL_PATH do sys.path\n"
-
-#~ msgid ""
-#~ "Failed to set path: sys.path is not a list\n"
-#~ "You should now append vim.VIM_SPECIAL_PATH to sys.path"
-#~ msgstr ""
-#~ "Nie mog๊ ustawiๆ œcieฟki: sys.path nie jest listน\n"
-#~ "Powinno si๊ teraz dodaๆ vim.VIM_SPECIAL_PATH do sys.path"
-
-#~ msgid "softspace must be an integer"
-#~ msgstr "softspace musi byๆ liczbน caณkowitน"
-
-#~ msgid "<buffer object (deleted) at %p>"
-#~ msgstr "<obiekt bufora (skasowany) w %p>"
-
-#~ msgid ""
-#~ "E281: TCL ERROR: exit code is not int!? Please report this to vim-dev@vim."
-#~ "org"
-#~ msgstr ""
-#~ "E281: BฃฅD TCL: kod zako๑czeniowy nie jest caณkowity!? Prosz๊ zณoฟyๆ "
-#~ "raport o tym na vim-dev@vim.org"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (RISC OS version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Argumenty rozpoznawane przez gvim (wersja RISC OS):\n"
-
-#~ msgid "--columns <number>\tInitial width of window in columns"
-#~ msgstr "--columns <number>\tPoczนtkowa szerokoœๆ okna w kolumnach"
-
-#~ msgid "--rows <number>\tInitial height of window in rows"
-#~ msgstr "--rows <number>\tPoczนtkowa wysokoœๆ okna w wierszach"
-
-#~ msgid "E505: "
-#~ msgstr "E505: "
-
-#~ msgid ""
-#~ "\n"
-#~ "RISC OS version"
-#~ msgstr ""
-#~ "\n"
-#~ "wersja dla RISC OS"
-
-#~ msgid "writelines() requires list of strings"
-#~ msgstr "writelines() wymaga listy ciนg๓w"
-
-#~ msgid "<window object (deleted) at %p>"
-#~ msgstr "<obiekt okna (skasowany) w %p>"
-
-#~ msgid "<window object (unknown) at %p>"
-#~ msgstr "<obiekt okna (nieznany) w %p>"
-
-#~ msgid "<window %d>"
-#~ msgstr "<okno %d>"
-
-#~ msgid "-name <name>\t\tUse resource as if vim was <name>"
-#~ msgstr "-name <nazwa>\t\tUฟywaj zasob๓w tak jak by Vim byณ <nazwa>"
-
-#~ msgid "\t\t\t (Unimplemented)\n"
-#~ msgstr "\t\t\t (Niezaimplementowane)\n"
-
-#~ msgid "E396: containedin argument not accepted here"
-#~ msgstr "E396: argument containedin niedozwolony w tym miejscu"
-
-#~ msgid "Vim dialog..."
-#~ msgstr "Dialog Vima..."
-
-#~ msgid "Font Selection"
-#~ msgstr "Wyb๓r czcionki"
-
-#~ msgid "E290: over-the-spot style requires fontset"
-#~ msgstr "E290: styl nadpunktowy wymaga +fontset"
-
-#~ msgid "E291: Your GTK+ is older than 1.2.3. Status area disabled"
-#~ msgstr "E291: Tw๓j GTK+ jest starszy niฟ 1.2.3. Pole statusu wyณนczono"
-
-#~ msgid "E292: Input Method Server is not running"
-#~ msgstr "E292: Serwer metod wprowadze๑ nie jest uruchomiony"
-
-#~ msgid "with GTK-GNOME GUI."
-#~ msgstr "z GTK-GNOME GUI."
-
-#~ msgid "with GTK GUI."
-#~ msgstr "z GTK GUI."
-
-#~ msgid "[NL found]"
-#~ msgstr "[znaleziono NL]"
-
-#~ msgid "E569: maximum number of cscope connections reached"
-#~ msgstr "E569: wyczerpano maksymalnน liczb๊ poณนcze๑ cscope"
diff --git a/src/nvim/po/pl.po b/src/nvim/po/pl.po
deleted file mode 100644
index 2a2d12daac..0000000000
--- a/src/nvim/po/pl.po
+++ /dev/null
@@ -1,8264 +0,0 @@
-# translation of pl.po to Polish
-# Polish Translation for Vim
-#
-# updated 2013 for vim-7.4
-#
-# FIRST AUTHOR Marcin Dalecki <martin@dalecki.de>, 2000.
-# Mikolaj Machowski <mikmach@wp.pl>, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2013.
-msgid ""
-msgstr ""
-"Project-Id-Version: pl\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-05-26 14:21+0200\n"
-"PO-Revision-Date: 2010-08-10 18:15+0200\n"
-"Last-Translator: Mikolaj Machowski <mikmach@wp.pl>\n"
-"Language: pl\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=ISO-8859-2\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 1.0\n"
-"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
-"|| n%100>=20) ? 1 : 2);\n"
-
-#: ../api/private/helpers.c:201
-#, fuzzy
-msgid "Unable to get option value"
-msgstr "nie mog๊ pobraๆ wartoถci opcji"
-
-#: ../api/private/helpers.c:204
-msgid "internal error: unknown option type"
-msgstr "bณฑd wewn๊trzny: nieznany typ opcji"
-
-#: ../buffer.c:92
-msgid "[Location List]"
-msgstr "[Lista lokacji]"
-
-#: ../buffer.c:93
-msgid "[Quickfix List]"
-msgstr "[Lista quickfix]"
-
-#: ../buffer.c:94
-msgid "E855: Autocommands caused command to abort"
-msgstr "E855: Autokomendy spowodowaณy porzucenie komendy"
-
-#: ../buffer.c:135
-msgid "E82: Cannot allocate any buffer, exiting..."
-msgstr "E82: Nie mog๊ zarezerwowaๆ bufora; zako๑czenie..."
-
-#: ../buffer.c:138
-msgid "E83: Cannot allocate buffer, using other one..."
-msgstr "E83: Nie mog๊ zarezerwowaๆ bufora; uฟywam innego..."
-
-#: ../buffer.c:763
-msgid "E515: No buffers were unloaded"
-msgstr "E515: Nie wyณadowano ฟadnego bufora"
-
-#: ../buffer.c:765
-msgid "E516: No buffers were deleted"
-msgstr "E516: Nie skasowano ฟadnego bufora"
-
-#: ../buffer.c:767
-msgid "E517: No buffers were wiped out"
-msgstr "E517: Nie wyrzucono ฟadnego bufora"
-
-#: ../buffer.c:772
-msgid "1 buffer unloaded"
-msgstr "1 bufor wyณadowany"
-
-#: ../buffer.c:774
-#, c-format
-msgid "%d buffers unloaded"
-msgstr "wyณadowano %d bufor๓w"
-
-#: ../buffer.c:777
-msgid "1 buffer deleted"
-msgstr "1 bufor skasowany"
-
-#: ../buffer.c:779
-#, c-format
-msgid "%d buffers deleted"
-msgstr "%d bufor๓w skasowano"
-
-#: ../buffer.c:782
-msgid "1 buffer wiped out"
-msgstr "wyrzucono 1 bufor "
-
-#: ../buffer.c:784
-#, c-format
-msgid "%d buffers wiped out"
-msgstr "wyrzucono %d bufor๓w"
-
-#: ../buffer.c:806
-msgid "E90: Cannot unload last buffer"
-msgstr "E90: Nie mog๊ wyณadowaๆ ostatniego bufora"
-
-#: ../buffer.c:874
-msgid "E84: No modified buffer found"
-msgstr "E84: Nie znaleziono zmienionych bufor๓w"
-
-#. back where we started, didn't find anything.
-#: ../buffer.c:903
-msgid "E85: There is no listed buffer"
-msgstr "E85: Nie ma wylistowanych bufor๓w"
-
-#: ../buffer.c:913
-#, c-format
-msgid "E86: Buffer %<PRId64> does not exist"
-msgstr "E86: Bufor \"%<PRId64>\" nie istnieje"
-
-#: ../buffer.c:915
-msgid "E87: Cannot go beyond last buffer"
-msgstr "E87: Nie mog๊ przejถๆ poza ostatni bufor"
-
-#: ../buffer.c:917
-msgid "E88: Cannot go before first buffer"
-msgstr "E88: Nie mog๊ przejถๆ przed pierwszy bufor"
-
-#: ../buffer.c:945
-#, c-format
-msgid ""
-"E89: No write since last change for buffer %<PRId64> (add ! to override)"
-msgstr "E89: Nie zapisano zmian w buforze %<PRId64> (wymuถ przez !)"
-
-#. wrap around (may cause duplicates)
-#: ../buffer.c:1423
-msgid "W14: Warning: List of file names overflow"
-msgstr "W14: OSTRZEฏENIE: Przepeณnienie listy nazw plik๓w"
-
-#: ../buffer.c:1555 ../quickfix.c:3361
-#, c-format
-msgid "E92: Buffer %<PRId64> not found"
-msgstr "E92: Nie znaleziono bufora %<PRId64>"
-
-#: ../buffer.c:1798
-#, c-format
-msgid "E93: More than one match for %s"
-msgstr "E93: Wielokrotne dopasowania dla %s"
-
-#: ../buffer.c:1800
-#, c-format
-msgid "E94: No matching buffer for %s"
-msgstr "E94: ฏaden bufor nie pasuje do %s"
-
-#: ../buffer.c:2161
-#, c-format
-msgid "line %<PRId64>"
-msgstr "wiersz %<PRId64>"
-
-#: ../buffer.c:2233
-msgid "E95: Buffer with this name already exists"
-msgstr "E95: Bufor o tej nazwie juฟ istnieje"
-
-#: ../buffer.c:2498
-msgid " [Modified]"
-msgstr " [Zmieniony]"
-
-#: ../buffer.c:2501
-msgid "[Not edited]"
-msgstr "[Nie edytowany]"
-
-#: ../buffer.c:2504
-msgid "[New file]"
-msgstr "[Nowy Plik]"
-
-#: ../buffer.c:2505
-msgid "[Read errors]"
-msgstr "[Bณฑd odczytu]"
-
-#: ../buffer.c:2506 ../buffer.c:3217 ../fileio.c:1807 ../screen.c:4895
-msgid "[RO]"
-msgstr "[RO]"
-
-#: ../buffer.c:2507 ../fileio.c:1807
-msgid "[readonly]"
-msgstr "[tylko odczyt]"
-
-#: ../buffer.c:2524
-#, c-format
-msgid "1 line --%d%%--"
-msgstr "1 wiersz --%d%%--"
-
-#: ../buffer.c:2526
-#, c-format
-msgid "%<PRId64> lines --%d%%--"
-msgstr "%<PRId64> wiersze --%d%%--"
-
-#: ../buffer.c:2530
-#, c-format
-msgid "line %<PRId64> of %<PRId64> --%d%%-- col "
-msgstr "wiersz %<PRId64> z %<PRId64> --%d%%-- kol "
-
-#: ../buffer.c:2632 ../buffer.c:4292 ../memline.c:1554
-msgid "[No Name]"
-msgstr "[Bez nazwy]"
-
-#. must be a help buffer
-#: ../buffer.c:2667
-msgid "help"
-msgstr "pomoc"
-
-#: ../buffer.c:3225 ../screen.c:4883
-msgid "[Help]"
-msgstr "[Pomoc]"
-
-#: ../buffer.c:3254 ../screen.c:4887
-msgid "[Preview]"
-msgstr "[Podglฑd]"
-
-#: ../buffer.c:3528
-msgid "All"
-msgstr "Wszystko"
-
-#: ../buffer.c:3528
-msgid "Bot"
-msgstr "D๓ณ"
-
-#: ../buffer.c:3531
-msgid "Top"
-msgstr "G๓ra"
-
-#: ../buffer.c:4244
-msgid ""
-"\n"
-"# Buffer list:\n"
-msgstr ""
-"\n"
-"# Lista bufor๓w:\n"
-
-#: ../buffer.c:4289
-msgid "[Scratch]"
-msgstr "[Notka]"
-
-#: ../buffer.c:4529
-msgid ""
-"\n"
-"--- Signs ---"
-msgstr ""
-"\n"
-"--- Znaki ---"
-
-#: ../buffer.c:4538
-#, c-format
-msgid "Signs for %s:"
-msgstr "Znaki dla %s:"
-
-#: ../buffer.c:4543
-#, c-format
-msgid " line=%<PRId64> id=%d name=%s"
-msgstr " wiersz=%<PRId64> id=%d nazwa=%s"
-
-#: ../cursor_shape.c:68
-msgid "E545: Missing colon"
-msgstr "E545: Brak dwukropka"
-
-#: ../cursor_shape.c:70 ../cursor_shape.c:94
-msgid "E546: Illegal mode"
-msgstr "E546: Niedozwolony tryb"
-
-#: ../cursor_shape.c:134
-msgid "E548: digit expected"
-msgstr "E548: oczekiwaณem na cyfr๊"
-
-#: ../cursor_shape.c:138
-msgid "E549: Illegal percentage"
-msgstr "E549: Niedozwolony procent"
-
-#: ../diff.c:146
-#, c-format
-msgid "E96: Can not diff more than %<PRId64> buffers"
-msgstr "E96: Nie mog๊ zr๓ฟnicowaๆ wi๊cej niฟ %<PRId64> bufor๓w"
-
-#: ../diff.c:753
-msgid "E810: Cannot read or write temp files"
-msgstr "E810: Nie mog๊ otworzyๆ lub zapisaๆ plik๓w tymczasowych"
-
-#: ../diff.c:755
-msgid "E97: Cannot create diffs"
-msgstr "E97: Nie mog๊ stworzyๆ r๓ฟnic"
-
-#: ../diff.c:966
-msgid "E816: Cannot read patch output"
-msgstr "E816: Nie mog๊ odczytaๆ wyjถcia pliku ณaty"
-
-#: ../diff.c:1220
-msgid "E98: Cannot read diff output"
-msgstr "E98: Nie mog๊ wczytaๆ wyjถcia r๓ฟnicy"
-
-#: ../diff.c:2081
-msgid "E99: Current buffer is not in diff mode"
-msgstr "E99: Bieฟฑcy bufor nie jest w trybie r๓ฟnic"
-
-#: ../diff.c:2100
-msgid "E793: No other buffer in diff mode is modifiable"
-msgstr "E793: ฏaden inny bufor w trybie diff nie jest modyfikowalny"
-
-#: ../diff.c:2102
-msgid "E100: No other buffer in diff mode"
-msgstr "E100: Brak innego bufora w trybie r๓ฟnic"
-
-#: ../diff.c:2112
-msgid "E101: More than two buffers in diff mode, don't know which one to use"
-msgstr ""
-"E101: Wi๊cej niฟ jeden bufor w trybie r๓ฟnicowania, nie wiem kt๓rego uฟyๆ"
-
-#: ../diff.c:2141
-#, c-format
-msgid "E102: Can't find buffer \"%s\""
-msgstr "E102: Nie mog๊ znaleผๆ bufora \"%s\""
-
-#: ../diff.c:2152
-#, c-format
-msgid "E103: Buffer \"%s\" is not in diff mode"
-msgstr "E103: Bufor \"%s\" nie jest w trybie r๓ฟnicowania"
-
-#: ../diff.c:2193
-msgid "E787: Buffer changed unexpectedly"
-msgstr "E787: Nieoczekiwana zmiana bufora"
-
-#: ../digraph.c:1598
-msgid "E104: Escape not allowed in digraph"
-msgstr "E104: Escape jest niedozwolone w dwugrafie"
-
-#: ../digraph.c:1760
-msgid "E544: Keymap file not found"
-msgstr "E544: Nie znaleziono pliku rozkณadu klawiszy"
-
-#: ../digraph.c:1785
-msgid "E105: Using :loadkeymap not in a sourced file"
-msgstr "E105: Zastosowano :loadkeymap w niewczytanym pliku"
-
-#: ../digraph.c:1821
-msgid "E791: Empty keymap entry"
-msgstr "E791: Pusty wpis keymap"
-
-#: ../edit.c:82
-msgid " Keyword completion (^N^P)"
-msgstr " Dopeณnianie sณ๓w kluczowych (^N^P)"
-
-#. ctrl_x_mode == 0, ^P/^N compl.
-#: ../edit.c:83
-msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-msgstr " ^X tryb (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-
-#: ../edit.c:85
-msgid " Whole line completion (^L^N^P)"
-msgstr " Dopeณnianie peณnych wierszy (^L^N^P)"
-
-#: ../edit.c:86
-msgid " File name completion (^F^N^P)"
-msgstr " Dopeณnianie nazw plik๓w (^F^N^P)"
-
-#: ../edit.c:87
-msgid " Tag completion (^]^N^P)"
-msgstr " Dopeณnianie znacznik๓w (^]^N^P)"
-
-#: ../edit.c:88
-msgid " Path pattern completion (^N^P)"
-msgstr " Dopeณnianie wzorc๓w trop๓w (^N^P)"
-
-#: ../edit.c:89
-msgid " Definition completion (^D^N^P)"
-msgstr " Dopeณnianie definicji (^D^N^P)"
-
-#: ../edit.c:91
-msgid " Dictionary completion (^K^N^P)"
-msgstr " Dopeณnianie ze sณownik๓w (^K^N^P)"
-
-#: ../edit.c:92
-msgid " Thesaurus completion (^T^N^P)"
-msgstr " Dopeณnianie z tezaurusa (^T^N^P)"
-
-#: ../edit.c:93
-msgid " Command-line completion (^V^N^P)"
-msgstr " Dopeณnianie wiersza polece๑ (^V^N^P)"
-
-#: ../edit.c:94
-msgid " User defined completion (^U^N^P)"
-msgstr "Dopeณnianie zdefiniowane przez uฟytkownika (^U^N^P)"
-
-#: ../edit.c:95
-msgid " Omni completion (^O^N^P)"
-msgstr " Omni uzupeณnianie (^O^N^P)"
-
-#: ../edit.c:96
-msgid " Spelling suggestion (s^N^P)"
-msgstr "Propozycja pisowni (^L^N^P)"
-
-#: ../edit.c:97
-msgid " Keyword Local completion (^N^P)"
-msgstr " Lokalne dopeณnianie sณ๓w kluczowych (^N^P)"
-
-#: ../edit.c:100
-msgid "Hit end of paragraph"
-msgstr "Dobiณem do ko๑ca akapitu"
-
-#: ../edit.c:101
-msgid "E839: Completion function changed window"
-msgstr "E839: Funkcja uzupeณniania zmieniณa okno"
-
-#: ../edit.c:102
-msgid "E840: Completion function deleted text"
-msgstr "E840: Funkcja uzupeณnania usun๊ณa tekst"
-
-#: ../edit.c:1847
-msgid "'dictionary' option is empty"
-msgstr "opcja 'dictionary' jest pusta"
-
-#: ../edit.c:1848
-msgid "'thesaurus' option is empty"
-msgstr "opcja 'thesaurus' jest pusta"
-
-#: ../edit.c:2655
-#, c-format
-msgid "Scanning dictionary: %s"
-msgstr "Przeglฑdam sณownik: %s"
-
-#: ../edit.c:3079
-msgid " (insert) Scroll (^E/^Y)"
-msgstr " (wprowadzanie) Przewijanie (^E/^Y)"
-
-#: ../edit.c:3081
-msgid " (replace) Scroll (^E/^Y)"
-msgstr " (zamiana) Przewijanie (^E/^Y)"
-
-#: ../edit.c:3587
-#, c-format
-msgid "Scanning: %s"
-msgstr "Przeglฑdam: %s"
-
-#: ../edit.c:3614
-msgid "Scanning tags."
-msgstr "Przeglฑdam znaczniki."
-
-#: ../edit.c:4519
-msgid " Adding"
-msgstr " Dodaj๊"
-
-#. showmode might reset the internal line pointers, so it must
-#. * be called before line = ml_get(), or when this address is no
-#. * longer needed. -- Acevedo.
-#.
-#: ../edit.c:4562
-msgid "-- Searching..."
-msgstr "-- Szukam..."
-
-#: ../edit.c:4618
-msgid "Back at original"
-msgstr "Z powrotem na pierwotnym"
-
-#: ../edit.c:4621
-msgid "Word from other line"
-msgstr "Wyraz z innego wiersza"
-
-#: ../edit.c:4624
-msgid "The only match"
-msgstr "Jedyne dopasowanie"
-
-#: ../edit.c:4680
-#, c-format
-msgid "match %d of %d"
-msgstr "pasuje %d z %d"
-
-#: ../edit.c:4684
-#, c-format
-msgid "match %d"
-msgstr "pasuje %d"
-
-#: ../eval.c:137
-msgid "E18: Unexpected characters in :let"
-msgstr "E18: Nieoczekiwane znaki w :let"
-
-#: ../eval.c:138
-#, c-format
-msgid "E684: list index out of range: %<PRId64>"
-msgstr "E684: Indeks listy poza zakresem: %<PRId64>"
-
-#: ../eval.c:139
-#, c-format
-msgid "E121: Undefined variable: %s"
-msgstr "E121: Nieokreถlona zmienna: %s"
-
-#: ../eval.c:140
-msgid "E111: Missing ']'"
-msgstr "E111: Brak ']'"
-
-#: ../eval.c:141
-#, c-format
-msgid "E686: Argument of %s must be a List"
-msgstr "E686: Argument %s musi byๆ Listฑ"
-
-#: ../eval.c:143
-#, c-format
-msgid "E712: Argument of %s must be a List or Dictionary"
-msgstr "E712: Argument %s musi byๆ Listฑ lub Sณownikiem"
-
-#: ../eval.c:144
-msgid "E713: Cannot use empty key for Dictionary"
-msgstr "E713: Nie moฟna uฟyๆ pustego klucza dla Sณownika"
-
-#: ../eval.c:145
-msgid "E714: List required"
-msgstr "E714: wymagana Lista"
-
-#: ../eval.c:146
-msgid "E715: Dictionary required"
-msgstr "E715: wymagany Sณownik"
-
-#: ../eval.c:147
-#, c-format
-msgid "E118: Too many arguments for function: %s"
-msgstr "E118: Zbyt wiele argument๓w dla funkcji: %s"
-
-#: ../eval.c:148
-#, c-format
-msgid "E716: Key not present in Dictionary: %s"
-msgstr "E716: Klucz nie istnieje w Sณowniku: %s"
-
-#: ../eval.c:150
-#, c-format
-msgid "E122: Function %s already exists, add ! to replace it"
-msgstr "E122: Funkcja %s juฟ istnieje; aby jฑ zamieniๆ uฟyj !"
-
-#: ../eval.c:151
-msgid "E717: Dictionary entry already exists"
-msgstr "E717: istnieje juฟ taki element Sณownika"
-
-#: ../eval.c:152
-msgid "E718: Funcref required"
-msgstr "E718: wymagana Funcref"
-
-#: ../eval.c:153
-msgid "E719: Cannot use [:] with a Dictionary"
-msgstr "E719: Nie moฟna uฟyๆ [:] przy Sณowniku"
-
-#: ../eval.c:154
-#, c-format
-msgid "E734: Wrong variable type for %s="
-msgstr "E734: Zณy typ zmiennej dla %s="
-
-#: ../eval.c:155
-#, c-format
-msgid "E130: Unknown function: %s"
-msgstr "E130: Nieznana funkcja: %s"
-
-#: ../eval.c:156
-#, c-format
-msgid "E461: Illegal variable name: %s"
-msgstr "E461: Niedozwolona nazwa zmiennej: %s"
-
-#: ../eval.c:157
-msgid "E806: using Float as a String"
-msgstr "E806: Uฟycie Zmiennoprzecinkowej jako ฃa๑cucha"
-
-#: ../eval.c:1830
-msgid "E687: Less targets than List items"
-msgstr "E687: Mniej cel๓w niฟ element๓w Listy"
-
-#: ../eval.c:1834
-msgid "E688: More targets than List items"
-msgstr "E688: Wi๊cej cel๓w niฟ element๓w Listy"
-
-#: ../eval.c:1906
-msgid "Double ; in list of variables"
-msgstr "Podw๓jny ; w liถcie zmiennych"
-
-#: ../eval.c:2078
-#, c-format
-msgid "E738: Can't list variables for %s"
-msgstr "E738: Nie mog๊ wypisaๆ zmiennych dla %s"
-
-#: ../eval.c:2391
-msgid "E689: Can only index a List or Dictionary"
-msgstr "E689: Indeks moฟe istnieๆ tylko dla Listy lub Sณownika"
-
-#: ../eval.c:2396
-msgid "E708: [:] must come last"
-msgstr "E708: [:] musi byๆ ostatnie"
-
-#: ../eval.c:2439
-msgid "E709: [:] requires a List value"
-msgstr "E709: [:] wymaga wartoถci listy"
-
-#: ../eval.c:2674
-msgid "E710: List value has more items than target"
-msgstr "E710: Lista ma wi๊cej element๓w niฟ cel"
-
-#: ../eval.c:2678
-msgid "E711: List value has not enough items"
-msgstr "E711: Lista nie ma wystarczajฑcej iloถci element๓w"
-
-#: ../eval.c:2867
-msgid "E690: Missing \"in\" after :for"
-msgstr "E690: Brak \"in\" po :for"
-
-#: ../eval.c:3063
-#, c-format
-msgid "E107: Missing parentheses: %s"
-msgstr "E107: Brak nawias๓w: %s"
-
-#: ../eval.c:3263
-#, c-format
-msgid "E108: No such variable: \"%s\""
-msgstr "E108: Nie istnieje zmienna: \"%s\""
-
-#: ../eval.c:3333
-msgid "E743: variable nested too deep for (un)lock"
-msgstr "E743: zmienna zagnieฟdฟona zbyt gณ๊boko dla (un)lock"
-
-#: ../eval.c:3630
-msgid "E109: Missing ':' after '?'"
-msgstr "E109: Brak ':' po '?'"
-
-#: ../eval.c:3893
-msgid "E691: Can only compare List with List"
-msgstr "E691: List๊ mog๊ por๓wnaๆ tylko z Listฑ"
-
-#: ../eval.c:3895
-msgid "E692: Invalid operation for Lists"
-msgstr "E692: Nieprawidณowa operacja dla Listy"
-
-#: ../eval.c:3915
-msgid "E735: Can only compare Dictionary with Dictionary"
-msgstr "E735: Sณownik mog๊ por๓wnaๆ tylko ze Sณownikiem"
-
-#: ../eval.c:3917
-msgid "E736: Invalid operation for Dictionary"
-msgstr "E736: Nieprawidณowa operacja dla Sณownika"
-
-#: ../eval.c:3932
-msgid "E693: Can only compare Funcref with Funcref"
-msgstr "E693: Funcref mog๊ por๓wnaๆ tylko z Funcref"
-
-#: ../eval.c:3934
-msgid "E694: Invalid operation for Funcrefs"
-msgstr "E694: Nieprawidณowa operacja dla Funcref"
-
-#: ../eval.c:4277
-msgid "E804: Cannot use '%' with Float"
-msgstr "E804: Nie mog๊ uฟyๆ '%' w Zmiennoprzecinkowej"
-
-#: ../eval.c:4478
-msgid "E110: Missing ')'"
-msgstr "E110: Brak ')'"
-
-#: ../eval.c:4609
-msgid "E695: Cannot index a Funcref"
-msgstr "E695: Nie moฟna zindeksowaๆ Funcref"
-
-#: ../eval.c:4839
-#, c-format
-msgid "E112: Option name missing: %s"
-msgstr "E112: Brak nazwy opcji: %s"
-
-#: ../eval.c:4855
-#, c-format
-msgid "E113: Unknown option: %s"
-msgstr "E113: Nieznana opcja: %s"
-
-#: ../eval.c:4904
-#, c-format
-msgid "E114: Missing quote: %s"
-msgstr "E114: Brak cudzysณowu: %s"
-
-#: ../eval.c:5020
-#, c-format
-msgid "E115: Missing quote: %s"
-msgstr "E115: Brak cudzysณowu: %s"
-
-#: ../eval.c:5084
-#, c-format
-msgid "E696: Missing comma in List: %s"
-msgstr "E696: Brakujฑcy przecinek w Liถcie: '%s"
-
-#: ../eval.c:5091
-#, c-format
-msgid "E697: Missing end of List ']': %s"
-msgstr "E697: Brak zako๑czenia Listy ']': %s"
-
-#: ../eval.c:6475
-#, c-format
-msgid "E720: Missing colon in Dictionary: %s"
-msgstr "E720: Brak dwukropka w Sณowniku: %s"
-
-#: ../eval.c:6499
-#, c-format
-msgid "E721: Duplicate key in Dictionary: \"%s\""
-msgstr "E721: Powt๓rzony klucz w Sณowniku: \"%s\""
-
-#: ../eval.c:6517
-#, c-format
-msgid "E722: Missing comma in Dictionary: %s"
-msgstr "E722: Brakujฑcy przecinek w Sณowniku: %s"
-
-#: ../eval.c:6524
-#, c-format
-msgid "E723: Missing end of Dictionary '}': %s"
-msgstr "E723: Brak ko๑ca w Sณowniku '}': %s"
-
-#: ../eval.c:6555
-msgid "E724: variable nested too deep for displaying"
-msgstr "E724: Zmienna zagnieฟdฟona zbyt gณ๊boko by pokazaๆ"
-
-#: ../eval.c:7188
-#, c-format
-msgid "E740: Too many arguments for function %s"
-msgstr "E740: Zbyt wiele argument๓w dla funkcji %s"
-
-#: ../eval.c:7190
-#, c-format
-msgid "E116: Invalid arguments for function %s"
-msgstr "E116: Zbyt wiele argument๓w dla funkcji %s"
-
-#: ../eval.c:7377
-#, c-format
-msgid "E117: Unknown function: %s"
-msgstr "E117: Nieznana funkcja: %s"
-
-#: ../eval.c:7383
-#, c-format
-msgid "E119: Not enough arguments for function: %s"
-msgstr "E119: Za maณo argument๓w dla funkcji: %s"
-
-#: ../eval.c:7387
-#, c-format
-msgid "E120: Using <SID> not in a script context: %s"
-msgstr "E120: Uฟycie <SID> poza kontekstem skryptu: %s"
-
-#: ../eval.c:7391
-#, c-format
-msgid "E725: Calling dict function without Dictionary: %s"
-msgstr "E725: Wywoณanie funkcji \"dict\" bez Sณownika: %s"
-
-#: ../eval.c:7453
-msgid "E808: Number or Float required"
-msgstr "E808: Wymagana Liczba lub Zmiennoprzecinkowa"
-
-#: ../eval.c:7503
-msgid "add() argument"
-msgstr "argument add()"
-
-#: ../eval.c:7907
-msgid "E699: Too many arguments"
-msgstr "E699: Za duฟo argument๓w"
-
-#: ../eval.c:8073
-msgid "E785: complete() can only be used in Insert mode"
-msgstr "E785: complete() moฟe byๆ uฟyte tylko w trybie Wprowadzania"
-
-#: ../eval.c:8156
-msgid "&Ok"
-msgstr "&Ok"
-
-#: ../eval.c:8676
-#, c-format
-msgid "E737: Key already exists: %s"
-msgstr "E737: Klucz juฟ istnieje: %s"
-
-#: ../eval.c:8692
-msgid "extend() argument"
-msgstr "argument extend()"
-
-#: ../eval.c:8915
-msgid "map() argument"
-msgstr "argument map()"
-
-#: ../eval.c:8916
-msgid "filter() argument"
-msgstr "argument filter()"
-
-#: ../eval.c:9229
-#, c-format
-msgid "+-%s%3ld lines: "
-msgstr "+-%s%3ld wierszy: "
-
-#: ../eval.c:9291
-#, c-format
-msgid "E700: Unknown function: %s"
-msgstr "E700: Nieznana funkcja: %s"
-
-#: ../eval.c:10729
-msgid "called inputrestore() more often than inputsave()"
-msgstr "wywoณano inputrestore() wi๊cej razy niฟ inputsave()"
-
-#: ../eval.c:10771
-msgid "insert() argument"
-msgstr "argument insert()"
-
-#: ../eval.c:10841
-msgid "E786: Range not allowed"
-msgstr "E786: Zakres niedozwolony"
-
-#: ../eval.c:11140
-msgid "E701: Invalid type for len()"
-msgstr "E701: Nieprawidณowy typ dla len()"
-
-#: ../eval.c:11980
-msgid "E726: Stride is zero"
-msgstr "E726: Skok to zero"
-
-#: ../eval.c:11982
-msgid "E727: Start past end"
-msgstr "E727: Poczฑtek po ko๑cu"
-
-#: ../eval.c:12024 ../eval.c:15297
-msgid "<empty>"
-msgstr "<pusty>"
-
-#: ../eval.c:12282
-msgid "remove() argument"
-msgstr "argument remove()"
-
-#: ../eval.c:12466
-msgid "E655: Too many symbolic links (cycle?)"
-msgstr "E655: Za duฟo dowiฑza๑ symbolicznych (p๊tla?)"
-
-#: ../eval.c:12593
-msgid "reverse() argument"
-msgstr "argument reverse()"
-
-#: ../eval.c:13721
-msgid "sort() argument"
-msgstr "argument sort()"
-
-#: ../eval.c:13721
-#, fuzzy
-msgid "uniq() argument"
-msgstr "argument add()"
-
-#: ../eval.c:13776
-msgid "E702: Sort compare function failed"
-msgstr "E702: Funkcja por๓wnywania w sort nie powiodณa si๊"
-
-#: ../eval.c:13806
-#, fuzzy
-msgid "E882: Uniq compare function failed"
-msgstr "E702: Funkcja por๓wnywania w sort nie powiodณa si๊"
-
-#: ../eval.c:14085
-msgid "(Invalid)"
-msgstr "(Niewณaถciwe)"
-
-#: ../eval.c:14590
-msgid "E677: Error writing temp file"
-msgstr "E677: Bณฑd zapisywania pliku tymczasowego"
-
-#: ../eval.c:16159
-msgid "E805: Using a Float as a Number"
-msgstr "E805: Uฟycie Zmiennoprzecinkowej jako Liczby"
-
-#: ../eval.c:16162
-msgid "E703: Using a Funcref as a Number"
-msgstr "E703: Uฟycie Funcref jako Liczby"
-
-#: ../eval.c:16170
-msgid "E745: Using a List as a Number"
-msgstr "E745: Uฟycie Listy jako Liczby"
-
-#: ../eval.c:16173
-msgid "E728: Using a Dictionary as a Number"
-msgstr "E728: Uฟycie Sณownika jako Liczby"
-
-#: ../eval.c:16259
-msgid "E729: using Funcref as a String"
-msgstr "E729: Uฟycie Funcref jako ฃa๑cucha"
-
-#: ../eval.c:16262
-msgid "E730: using List as a String"
-msgstr "E730: Uฟycie Listy jako ฃa๑cucha"
-
-#: ../eval.c:16265
-msgid "E731: using Dictionary as a String"
-msgstr "E731: Uฟycie Sณownika jako ฃa๑cucha"
-
-#: ../eval.c:16619
-#, c-format
-msgid "E706: Variable type mismatch for: %s"
-msgstr "E706: Nieprawidณowy typ zmiennej dla: %s"
-
-#: ../eval.c:16705
-#, c-format
-msgid "E795: Cannot delete variable %s"
-msgstr "E795: Nie mog๊ usunฑๆ zmiennej %s"
-
-#: ../eval.c:16724
-#, c-format
-msgid "E704: Funcref variable name must start with a capital: %s"
-msgstr "E704: Nazwa Funcref musi si๊ zaczynaๆ wielkฑ literฑ: %s"
-
-#: ../eval.c:16732
-#, c-format
-msgid "E705: Variable name conflicts with existing function: %s"
-msgstr "E705: Nazwa zmiennej jest w konflikcie z istniejฑcฑ funkcjฑ: %s"
-
-#: ../eval.c:16763
-#, c-format
-msgid "E741: Value is locked: %s"
-msgstr "E741: Wartoถๆ jest zablokowana: %s"
-
-#: ../eval.c:16764 ../eval.c:16769 ../message.c:1839
-msgid "Unknown"
-msgstr "Nieznane"
-
-#: ../eval.c:16768
-#, c-format
-msgid "E742: Cannot change value of %s"
-msgstr "E742: Nie mog๊ zmieniๆ wartoถci %s"
-
-#: ../eval.c:16838
-msgid "E698: variable nested too deep for making a copy"
-msgstr "E698: Zmienna zagnieฟdฟona zbyt gณ๊boko by zrobiๆ kopi๊"
-
-#: ../eval.c:17249
-#, c-format
-msgid "E123: Undefined function: %s"
-msgstr "E123: Nieznana funkcja: %s"
-
-#: ../eval.c:17260
-#, c-format
-msgid "E124: Missing '(': %s"
-msgstr "E124: Brak '(': %s"
-
-#: ../eval.c:17293
-msgid "E862: Cannot use g: here"
-msgstr "E862: Nie moฟna tutaj uฟyๆ g:"
-
-#: ../eval.c:17312
-#, c-format
-msgid "E125: Illegal argument: %s"
-msgstr "E125: Niedozwolony argument: %s"
-
-#: ../eval.c:17323
-#, c-format
-msgid "E853: Duplicate argument name: %s"
-msgstr "E853: Powt๓rzona nazwa argumentu: %s"
-
-#: ../eval.c:17416
-msgid "E126: Missing :endfunction"
-msgstr "E126: Brak :endfunction"
-
-#: ../eval.c:17537
-#, c-format
-msgid "E707: Function name conflicts with variable: %s"
-msgstr "E707: Nazwa funkcji jest w konflikcie ze zmiennฑ: %s"
-
-#: ../eval.c:17549
-#, c-format
-msgid "E127: Cannot redefine function %s: It is in use"
-msgstr "E127: Nie mog๊ redefiniowaๆ funkcji %s: jest w uฟyciu"
-
-#: ../eval.c:17604
-#, c-format
-msgid "E746: Function name does not match script file name: %s"
-msgstr "E746: Nazwa funkcji nie pasuje do nazwy skryptu: %s"
-
-#: ../eval.c:17716
-msgid "E129: Function name required"
-msgstr "E129: Wymagana jest nazwa funkcji"
-
-#: ../eval.c:17824
-#, fuzzy, c-format
-msgid "E128: Function name must start with a capital or \"s:\": %s"
-msgstr ""
-"E128: Nazwa funkcji musi rozpoczynaๆ si๊ wielkฑ literฑ lub zawieraๆ "
-"dwukropek: %s"
-
-#: ../eval.c:17833
-#, fuzzy, c-format
-msgid "E884: Function name cannot contain a colon: %s"
-msgstr ""
-"E128: Nazwa funkcji musi rozpoczynaๆ si๊ wielkฑ literฑ lub zawieraๆ "
-"dwukropek: %s"
-
-#: ../eval.c:18336
-#, c-format
-msgid "E131: Cannot delete function %s: It is in use"
-msgstr "E131: Nie mog๊ skasowaๆ funkcji %s: jest w uฟyciu"
-
-#: ../eval.c:18441
-msgid "E132: Function call depth is higher than 'maxfuncdepth'"
-msgstr "E132: Zagnieฟdฟenie wywoณa๑ funkcji ponad 'maxfuncdepth'"
-
-#: ../eval.c:18568
-#, c-format
-msgid "calling %s"
-msgstr "wywoณuj๊ %s"
-
-#: ../eval.c:18651
-#, c-format
-msgid "%s aborted"
-msgstr "porzucono %s"
-
-#: ../eval.c:18653
-#, c-format
-msgid "%s returning #%<PRId64>"
-msgstr "%s zwraca #%<PRId64>"
-
-#: ../eval.c:18670
-#, c-format
-msgid "%s returning %s"
-msgstr "%s zwraca %s"
-
-#: ../eval.c:18691 ../ex_cmds2.c:2695
-#, c-format
-msgid "continuing in %s"
-msgstr "kontynuacja w %s"
-
-#: ../eval.c:18795
-msgid "E133: :return not inside a function"
-msgstr "E133: :return poza funkcjฑ"
-
-#: ../eval.c:19159
-msgid ""
-"\n"
-"# global variables:\n"
-msgstr ""
-"\n"
-"# zmienne globalne:\n"
-
-#: ../eval.c:19254
-msgid ""
-"\n"
-"\tLast set from "
-msgstr ""
-"\n"
-"\tOstatnie ustawienie przez "
-
-#: ../eval.c:19272
-msgid "No old files"
-msgstr "Brak starych plik๓w"
-
-#: ../ex_cmds.c:122
-#, c-format
-msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
-msgstr "<%s>%s%s %d, Hex %02x, Oktal %03o"
-
-#: ../ex_cmds.c:145
-#, c-format
-msgid "> %d, Hex %04x, Octal %o"
-msgstr "> %d, Hex %04x, Oktal %o"
-
-#: ../ex_cmds.c:146
-#, c-format
-msgid "> %d, Hex %08x, Octal %o"
-msgstr "> %d, Hex %08x, Oktal %o"
-
-#: ../ex_cmds.c:684
-msgid "E134: Move lines into themselves"
-msgstr "E134: Przeniesienie wierszy na siebie samych"
-
-#: ../ex_cmds.c:747
-msgid "1 line moved"
-msgstr "1 wiersz przeniesiony"
-
-#: ../ex_cmds.c:749
-#, c-format
-msgid "%<PRId64> lines moved"
-msgstr "%<PRId64> wiersze przeniesione"
-
-#: ../ex_cmds.c:1175
-#, c-format
-msgid "%<PRId64> lines filtered"
-msgstr "%<PRId64> wierszy przefiltrowanych"
-
-#: ../ex_cmds.c:1194
-msgid "E135: *Filter* Autocommands must not change current buffer"
-msgstr "E135: Autokomendy *Filter* nie mogฑ zmieniaๆ bieฟฑcego bufora"
-
-#: ../ex_cmds.c:1244
-msgid "[No write since last change]\n"
-msgstr "[Brak zapisu od czasu ostatniej zmiany]\n"
-
-#: ../ex_cmds.c:1424
-#, c-format
-msgid "%sviminfo: %s in line: "
-msgstr "%sviminfo: %s w wierszu: "
-
-#: ../ex_cmds.c:1431
-msgid "E136: viminfo: Too many errors, skipping rest of file"
-msgstr "E136: viminfo: Zbyt wiele bณ๊d๓w; pomijam reszt๊ pliku"
-
-#: ../ex_cmds.c:1458
-#, c-format
-msgid "Reading viminfo file \"%s\"%s%s%s"
-msgstr "Wczytuj๊ plik viminfo \"%s\"%s%s%s"
-
-#: ../ex_cmds.c:1460
-msgid " info"
-msgstr " informacja"
-
-#: ../ex_cmds.c:1461
-msgid " marks"
-msgstr " zakณadki"
-
-#: ../ex_cmds.c:1462
-msgid " oldfiles"
-msgstr " stare pliki"
-
-#: ../ex_cmds.c:1463
-msgid " FAILED"
-msgstr " NIE POWIODฃO SIส"
-
-#. avoid a wait_return for this message, it's annoying
-#: ../ex_cmds.c:1541
-#, c-format
-msgid "E137: Viminfo file is not writable: %s"
-msgstr "E137: Plik viminfo jest niezapisywalny: %s"
-
-#: ../ex_cmds.c:1626
-#, c-format
-msgid "E138: Can't write viminfo file %s!"
-msgstr "E138: Nie mog๊ zapisaๆ pliku viminfo %s!"
-
-#: ../ex_cmds.c:1635
-#, c-format
-msgid "Writing viminfo file \"%s\""
-msgstr "Zapisuj๊ plik viminfo \"%s\""
-
-#. Write the info:
-#: ../ex_cmds.c:1720
-#, c-format
-msgid "# This viminfo file was generated by Vim %s.\n"
-msgstr "# Ten plik viminfo zostaณ wygenerowany przez Vima %s.\n"
-
-#: ../ex_cmds.c:1722
-msgid ""
-"# You may edit it if you're careful!\n"
-"\n"
-msgstr ""
-"# Moฟesz go ostroฟnie edytowaๆ!\n"
-"\n"
-
-#: ../ex_cmds.c:1723
-msgid "# Value of 'encoding' when this file was written\n"
-msgstr "# Wartoถๆ 'encoding' w czasie zapisu tego pliku\n"
-
-#: ../ex_cmds.c:1800
-msgid "Illegal starting char"
-msgstr "Niedopuszczalny poczฑtkowy znak"
-
-#: ../ex_cmds.c:2162
-msgid "Write partial file?"
-msgstr "Zapisaๆ cz๊ถciowo plik?"
-
-#: ../ex_cmds.c:2166
-msgid "E140: Use ! to write partial buffer"
-msgstr "E140: Stosuj ! do zapisania cz๊ถciowo bufora"
-
-#: ../ex_cmds.c:2281
-#, c-format
-msgid "Overwrite existing file \"%s\"?"
-msgstr "Nadpisaๆ istniejฑcy plik \"%s\"?"
-
-#: ../ex_cmds.c:2317
-#, c-format
-msgid "Swap file \"%s\" exists, overwrite anyway?"
-msgstr "Plik wymiany \"%s\" istnieje, czy go nadpisaๆ?"
-
-#: ../ex_cmds.c:2326
-#, c-format
-msgid "E768: Swap file exists: %s (:silent! overrides)"
-msgstr "E768: Plik wymiany istnieje: %s (wymuถ poprzez :silent!)"
-
-#: ../ex_cmds.c:2381
-#, c-format
-msgid "E141: No file name for buffer %<PRId64>"
-msgstr "E141: Brak nazwy pliku dla bufora %<PRId64>"
-
-#: ../ex_cmds.c:2412
-msgid "E142: File not written: Writing is disabled by 'write' option"
-msgstr "E142: Plik niezapisany: Zapis jest wyณฑczony opcjฑ 'write'"
-
-#: ../ex_cmds.c:2434
-#, c-format
-msgid ""
-"'readonly' option is set for \"%s\".\n"
-"Do you wish to write anyway?"
-msgstr ""
-"opcja 'readonly' nastawiona dla \"%s\".\n"
-"Czy chcesz go pomimo tego zapisaๆ?"
-
-#: ../ex_cmds.c:2439
-#, c-format
-msgid ""
-"File permissions of \"%s\" are read-only.\n"
-"It may still be possible to write it.\n"
-"Do you wish to try?"
-msgstr ""
-"Prawa pliku \"%s\" sฑ tylko do odczytu.\n"
-"Mimo to byๆ moฟe uda si๊ zmieniๆ ten plik.\n"
-"Chcesz spr๓bowaๆ?"
-
-#: ../ex_cmds.c:2451
-#, c-format
-msgid "E505: \"%s\" is read-only (add ! to override)"
-msgstr "E505: \"%s\" jest tylko do odczytu (dodaj ! aby wymusiๆ)"
-
-#: ../ex_cmds.c:3120
-#, c-format
-msgid "E143: Autocommands unexpectedly deleted new buffer %s"
-msgstr "E143: Autokomendy nieoczekiwanie skasowaณy nowy bufor %s"
-
-#: ../ex_cmds.c:3313
-msgid "E144: non-numeric argument to :z"
-msgstr "E144: nienumeryczny argument dla :z"
-
-#: ../ex_cmds.c:3404
-msgid "E145: Shell commands not allowed in rvim"
-msgstr "E145: Komendy powณoki sฑ niedozwolone w rvim"
-
-#: ../ex_cmds.c:3498
-msgid "E146: Regular expressions can't be delimited by letters"
-msgstr "E146: Wzorce regularne nie mogฑ byๆ rozgraniczane literami"
-
-#: ../ex_cmds.c:3964
-#, c-format
-msgid "replace with %s (y/n/a/q/l/^E/^Y)?"
-msgstr "zamie๑ na %s (y/n/a/q/l/^E/^Y)?"
-
-#: ../ex_cmds.c:4379
-msgid "(Interrupted) "
-msgstr "(Przerwane) "
-
-#: ../ex_cmds.c:4384
-msgid "1 match"
-msgstr "1 pasuje"
-
-#: ../ex_cmds.c:4384
-msgid "1 substitution"
-msgstr "1 podstawienie "
-
-#: ../ex_cmds.c:4387
-#, c-format
-msgid "%<PRId64> matches"
-msgstr "%<PRId64> dopasowa๑"
-
-#: ../ex_cmds.c:4388
-#, c-format
-msgid "%<PRId64> substitutions"
-msgstr "%<PRId64> podstawie๑"
-
-#: ../ex_cmds.c:4392
-msgid " on 1 line"
-msgstr " w 1 wierszu"
-
-#: ../ex_cmds.c:4395
-#, c-format
-msgid " on %<PRId64> lines"
-msgstr " w %<PRId64> wierszach"
-
-#: ../ex_cmds.c:4438
-msgid "E147: Cannot do :global recursive"
-msgstr "E147: Nie mog๊ wykonaๆ :global rekursywnie"
-
-#: ../ex_cmds.c:4467
-msgid "E148: Regular expression missing from global"
-msgstr "E148: Brak wzorca regularnego w :global"
-
-# c-format
-#: ../ex_cmds.c:4508
-#, c-format
-msgid "Pattern found in every line: %s"
-msgstr "Wzorzec znaleziono w kaฟdym wierszu: %s"
-
-#: ../ex_cmds.c:4510
-#, c-format
-msgid "Pattern not found: %s"
-msgstr "Nie znaleziono wzorca: %s"
-
-#: ../ex_cmds.c:4587
-msgid ""
-"\n"
-"# Last Substitute String:\n"
-"$"
-msgstr ""
-"\n"
-"# Ostatni podstawiany ciฑg:\n"
-"$"
-
-#: ../ex_cmds.c:4679
-msgid "E478: Don't panic!"
-msgstr "E478: Nie panikuj!"
-
-#: ../ex_cmds.c:4717
-#, c-format
-msgid "E661: Sorry, no '%s' help for %s"
-msgstr "E661: Przykro mi, brak '%s' pomocy dla %s"
-
-#: ../ex_cmds.c:4719
-#, c-format
-msgid "E149: Sorry, no help for %s"
-msgstr "E149: Przykro mi, ale brak pomocy o %s"
-
-#: ../ex_cmds.c:4751
-#, c-format
-msgid "Sorry, help file \"%s\" not found"
-msgstr "Przykro mi, nie ma pliku pomocy \"%s\""
-
-#: ../ex_cmds.c:5323
-#, c-format
-msgid "E150: Not a directory: %s"
-msgstr "E150: Nie jest katalogiem: %s"
-
-#: ../ex_cmds.c:5446
-#, c-format
-msgid "E152: Cannot open %s for writing"
-msgstr "E152: Nie mog๊ otworzyๆ %s do zapisu"
-
-#: ../ex_cmds.c:5471
-#, c-format
-msgid "E153: Unable to open %s for reading"
-msgstr "E153: Nie mog๊ otworzyๆ %s do odczytu"
-
-#: ../ex_cmds.c:5500
-#, c-format
-msgid "E670: Mix of help file encodings within a language: %s"
-msgstr "E670: Mieszanka kodowa๑ w pliku pomocy w ramach j๊zyka: %s"
-
-#: ../ex_cmds.c:5565
-#, c-format
-msgid "E154: Duplicate tag \"%s\" in file %s/%s"
-msgstr "E154: Powt๓rzony znacznik \"%s\" w pliku %s/%s"
-
-#: ../ex_cmds.c:5687
-#, c-format
-msgid "E160: Unknown sign command: %s"
-msgstr "E160: Nieznana komenda znaku: %s"
-
-#: ../ex_cmds.c:5704
-msgid "E156: Missing sign name"
-msgstr "E156: Brak nazwy znaku"
-
-#: ../ex_cmds.c:5746
-msgid "E612: Too many signs defined"
-msgstr "E612: Zbyt wiele nazw znak๓w"
-
-#: ../ex_cmds.c:5813
-#, c-format
-msgid "E239: Invalid sign text: %s"
-msgstr "E239: Niewณaถciwy tekst znaku: %s"
-
-#: ../ex_cmds.c:5844 ../ex_cmds.c:6035
-#, c-format
-msgid "E155: Unknown sign: %s"
-msgstr "E155: Nieznany znak: %s"
-
-#: ../ex_cmds.c:5877
-msgid "E159: Missing sign number"
-msgstr "E159: Brak numeru znaku"
-
-#: ../ex_cmds.c:5971
-#, c-format
-msgid "E158: Invalid buffer name: %s"
-msgstr "E158: Niewณaถciwa nazwa bufora: %s"
-
-#: ../ex_cmds.c:6008
-#, c-format
-msgid "E157: Invalid sign ID: %<PRId64>"
-msgstr "E157: Niewณaถciwe ID znaku: %<PRId64>"
-
-#: ../ex_cmds.c:6066
-msgid " (not supported)"
-msgstr "(nie wspomagane)"
-
-#: ../ex_cmds.c:6169
-msgid "[Deleted]"
-msgstr "[Skasowano]"
-
-#: ../ex_cmds2.c:139
-msgid "Entering Debug mode. Type \"cont\" to continue."
-msgstr "Wchodz๊ w tryb odpluskwiania. Wprowadผ \"cont\" aby kontynuowaๆ."
-
-#: ../ex_cmds2.c:143 ../ex_docmd.c:759
-#, c-format
-msgid "line %<PRId64>: %s"
-msgstr "wiersz %<PRId64>: %s"
-
-#: ../ex_cmds2.c:145
-#, c-format
-msgid "cmd: %s"
-msgstr "cmd: %s"
-
-#: ../ex_cmds2.c:322
-#, c-format
-msgid "Breakpoint in \"%s%s\" line %<PRId64>"
-msgstr "Punkt kontrolny w \"%s%s\" wiersz %<PRId64>"
-
-#: ../ex_cmds2.c:581
-#, c-format
-msgid "E161: Breakpoint not found: %s"
-msgstr "E161: Nie znaleziono punktu kontrolnego: %s"
-
-#: ../ex_cmds2.c:611
-msgid "No breakpoints defined"
-msgstr "Nie okreถlono ฟadnych punkt๓w kontrolnych"
-
-#: ../ex_cmds2.c:617
-#, c-format
-msgid "%3d %s %s line %<PRId64>"
-msgstr "%3d %s %s wiersz %<PRId64>"
-
-#: ../ex_cmds2.c:942
-msgid "E750: First use \":profile start {fname}\""
-msgstr "E750: Pierwsze uฟycie \":profile start {fname}\""
-
-#: ../ex_cmds2.c:1269
-#, c-format
-msgid "Save changes to \"%s\"?"
-msgstr "Zachowaๆ zmiany w \"%s\"?"
-
-#: ../ex_cmds2.c:1271 ../ex_docmd.c:8851
-msgid "Untitled"
-msgstr "Bez Tytuณu"
-
-#: ../ex_cmds2.c:1421
-#, c-format
-msgid "E162: No write since last change for buffer \"%s\""
-msgstr "E162: Nie zapisano zmian w buforze \"%s\""
-
-#: ../ex_cmds2.c:1480
-msgid "Warning: Entered other buffer unexpectedly (check autocommands)"
-msgstr "OSTRZEฏENIE: Nieoczekiwane wejถcie w inny bufor (sprawdผ autokomendy)"
-
-#: ../ex_cmds2.c:1826
-msgid "E163: There is only one file to edit"
-msgstr "E163: Tylko jeden plik w edycji"
-
-#: ../ex_cmds2.c:1828
-msgid "E164: Cannot go before first file"
-msgstr "E164: Nie moฟna przejถๆ przed pierwszy plik"
-
-#: ../ex_cmds2.c:1830
-msgid "E165: Cannot go beyond last file"
-msgstr "E165: Nie moฟna przejถๆ za ostatni plik"
-
-#: ../ex_cmds2.c:2175
-#, c-format
-msgid "E666: compiler not supported: %s"
-msgstr "E666: nie wspierany kompilator: %s"
-
-#: ../ex_cmds2.c:2257
-#, c-format
-msgid "Searching for \"%s\" in \"%s\""
-msgstr "Szukanie \"%s\" w \"%s\""
-
-#: ../ex_cmds2.c:2284
-#, c-format
-msgid "Searching for \"%s\""
-msgstr "Szukanie \"%s\""
-
-#: ../ex_cmds2.c:2307
-#, c-format
-msgid "not found in 'runtimepath': \"%s\""
-msgstr "nie znaleziono w 'runtimepath': \"%s\""
-
-#: ../ex_cmds2.c:2472
-#, c-format
-msgid "Cannot source a directory: \"%s\""
-msgstr "Nie moฟna wczytaๆ katalogu: \"%s\""
-
-#: ../ex_cmds2.c:2518
-#, c-format
-msgid "could not source \"%s\""
-msgstr "nie mogณem wczytaๆ \"%s\""
-
-#: ../ex_cmds2.c:2520
-#, c-format
-msgid "line %<PRId64>: could not source \"%s\""
-msgstr "wiersz: %<PRId64> nie mogณem wczytaๆ \"%s\""
-
-#: ../ex_cmds2.c:2535
-#, c-format
-msgid "sourcing \"%s\""
-msgstr "wczytywanie \"%s\""
-
-#: ../ex_cmds2.c:2537
-#, c-format
-msgid "line %<PRId64>: sourcing \"%s\""
-msgstr "wiersz %<PRId64>: wczytywanie \"%s\""
-
-#: ../ex_cmds2.c:2693
-#, c-format
-msgid "finished sourcing %s"
-msgstr "sko๑czono wczytywanie %s"
-
-#: ../ex_cmds2.c:2765
-msgid "modeline"
-msgstr "modeline"
-
-#: ../ex_cmds2.c:2767
-msgid "--cmd argument"
-msgstr "--cmd argument"
-
-#: ../ex_cmds2.c:2769
-msgid "-c argument"
-msgstr "-c argument"
-
-#: ../ex_cmds2.c:2771
-msgid "environment variable"
-msgstr "zmienna ถrodowiskowa"
-
-#: ../ex_cmds2.c:2773
-msgid "error handler"
-msgstr "obsณuga bณ๊du"
-
-#: ../ex_cmds2.c:3020
-msgid "W15: Warning: Wrong line separator, ^M may be missing"
-msgstr "W15: OSTRZEฏENIE: Niewณaถciwy separator wierszy, pewnie brak ^M"
-
-#: ../ex_cmds2.c:3139
-msgid "E167: :scriptencoding used outside of a sourced file"
-msgstr "E167: uฟyto :scriptencoding poza wczytywanym plikiem"
-
-#: ../ex_cmds2.c:3166
-msgid "E168: :finish used outside of a sourced file"
-msgstr "E168: uฟyto :finish poza wczytywanym plikiem"
-
-#: ../ex_cmds2.c:3389
-#, c-format
-msgid "Current %slanguage: \"%s\""
-msgstr "Bieฟฑcy %sj๊zyk: \"%s\""
-
-#: ../ex_cmds2.c:3404
-#, c-format
-msgid "E197: Cannot set language to \"%s\""
-msgstr "E197: Nie mog๊ ustawiๆ j๊zyka na \"%s\""
-
-#. don't redisplay the window
-#. don't wait for return
-#: ../ex_docmd.c:387
-msgid "Entering Ex mode. Type \"visual\" to go to Normal mode."
-msgstr "Wchodz๊ w tryb Ex. Wprowadผ \"visual\" aby przejถๆ do trybu Normal."
-
-#: ../ex_docmd.c:428
-msgid "E501: At end-of-file"
-msgstr "E501: Na ko๑cu pliku"
-
-#: ../ex_docmd.c:513
-msgid "E169: Command too recursive"
-msgstr "E169: Komenda zbyt rekursywna"
-
-#: ../ex_docmd.c:1006
-#, c-format
-msgid "E605: Exception not caught: %s"
-msgstr "E605: Nie znaleziono wyjฑtku: %s"
-
-#: ../ex_docmd.c:1085
-msgid "End of sourced file"
-msgstr "Koniec wczytywanego pliku"
-
-#: ../ex_docmd.c:1086
-msgid "End of function"
-msgstr "Koniec funkcji"
-
-#: ../ex_docmd.c:1628
-msgid "E464: Ambiguous use of user-defined command"
-msgstr ""
-"E464: Niejednoznaczne zastosowanie komendy zdefiniowanej przez uฟytkownika"
-
-#: ../ex_docmd.c:1638
-msgid "E492: Not an editor command"
-msgstr "E492: Nie jest komendฑ edytora"
-
-#: ../ex_docmd.c:1729
-msgid "E493: Backwards range given"
-msgstr "E493: Dano wsteczny zakres"
-
-#: ../ex_docmd.c:1733
-msgid "Backwards range given, OK to swap"
-msgstr "Dano wsteczny zakres; zamiana jest moฟliwa"
-
-#. append
-#. typed wrong
-#: ../ex_docmd.c:1787
-msgid "E494: Use w or w>>"
-msgstr "E494: Stosuj w lub w>>"
-
-#: ../ex_docmd.c:3454
-msgid "E319: The command is not available in this version"
-msgstr "E319: Przykro mi, ale ta komenda nie jest dost๊pna w tej wersji"
-
-#: ../ex_docmd.c:3752
-msgid "E172: Only one file name allowed"
-msgstr "E172: Tylko pojedyncza nazwa pliku dozwolona"
-
-#: ../ex_docmd.c:4238
-msgid "1 more file to edit. Quit anyway?"
-msgstr "1 wi๊cej plik do edycji. Mimo to wyjถๆ?"
-
-#: ../ex_docmd.c:4242
-#, c-format
-msgid "%d more files to edit. Quit anyway?"
-msgstr "jeszcze %d plik๓w do edycji. Mimo to wyjถๆ?"
-
-#: ../ex_docmd.c:4248
-msgid "E173: 1 more file to edit"
-msgstr "E173: 1 wi๊cej plik do edycji"
-
-#: ../ex_docmd.c:4250
-#, c-format
-msgid "E173: %<PRId64> more files to edit"
-msgstr "E173: jeszcze %<PRId64> plik๓w do edycji"
-
-#: ../ex_docmd.c:4320
-msgid "E174: Command already exists: add ! to replace it"
-msgstr "E174: Komenda juฟ istnieje; aby jฑ przedefiniowaๆ stosuj !"
-
-#: ../ex_docmd.c:4432
-msgid ""
-"\n"
-" Name Args Range Complete Definition"
-msgstr ""
-"\n"
-" Nazwa Arg. Zak. Gotowoถๆ Definicja"
-
-#: ../ex_docmd.c:4516
-msgid "No user-defined commands found"
-msgstr "Nie znaleziono komend zdefiniowanych przez uฟytkownika"
-
-#: ../ex_docmd.c:4538
-msgid "E175: No attribute specified"
-msgstr "E175: Nie okreถlono atrybutu"
-
-#: ../ex_docmd.c:4583
-msgid "E176: Invalid number of arguments"
-msgstr "E176: Niewณaถciwa iloถๆ argument๓w"
-
-#: ../ex_docmd.c:4594
-msgid "E177: Count cannot be specified twice"
-msgstr "E177: Mnoฟnik nie moฟe byๆ podany dwukrotnie"
-
-#: ../ex_docmd.c:4603
-msgid "E178: Invalid default value for count"
-msgstr "E178: Niewณaถciwa domyถlna wartoถๆ mnoฟnika"
-
-#: ../ex_docmd.c:4625
-msgid "E179: argument required for -complete"
-msgstr "E179: -complete wymaga argumentu"
-
-#: ../ex_docmd.c:4635
-#, c-format
-msgid "E181: Invalid attribute: %s"
-msgstr "E181: Niewณaถciwy atrybut: %s"
-
-#: ../ex_docmd.c:4678
-msgid "E182: Invalid command name"
-msgstr "E182: Niewณaถciwa nazwa komendy"
-
-#: ../ex_docmd.c:4691
-msgid "E183: User defined commands must start with an uppercase letter"
-msgstr ""
-"E183: Komendy zdefiniowane przez uฟytkownika muszฑ rozpoczynaๆ si๊ duฟฑ "
-"literฑ"
-
-#: ../ex_docmd.c:4696
-msgid "E841: Reserved name, cannot be used for user defined command"
-msgstr "E841: Nazwa zastrzeฟona, nie moฟna jej uฟyๆ w komendzie uฟytkownika"
-
-#: ../ex_docmd.c:4751
-#, c-format
-msgid "E184: No such user-defined command: %s"
-msgstr "E184: Nie ma takiej komendy uฟytkownika: %s"
-
-#: ../ex_docmd.c:5219
-#, c-format
-msgid "E180: Invalid complete value: %s"
-msgstr "E180: Niewณaถciwa wartoถๆ dopeณniania: %s"
-
-#: ../ex_docmd.c:5225
-msgid "E468: Completion argument only allowed for custom completion"
-msgstr ""
-"E468: Argument depeณniania dozwolony wyณฑcznie dla dopeณniania uฟytkownika"
-
-#: ../ex_docmd.c:5231
-msgid "E467: Custom completion requires a function argument"
-msgstr "E467: Dopeณnianie uฟytkownika wymaga funkcji jako argumentu"
-
-#: ../ex_docmd.c:5257
-#, c-format
-msgid "E185: Cannot find color scheme '%s'"
-msgstr "E185: Nie mog๊ znaleผๆ zestawu kolor๓w '%s'"
-
-#: ../ex_docmd.c:5263
-msgid "Greetings, Vim user!"
-msgstr "Witaj uฟytkowniku Vima!"
-
-#: ../ex_docmd.c:5431
-msgid "E784: Cannot close last tab page"
-msgstr "E784: Nie mog๊ zamknฑๆ ostatniej karty"
-
-#: ../ex_docmd.c:5462
-msgid "Already only one tab page"
-msgstr "Jest juฟ tylko jedna karta"
-
-#: ../ex_docmd.c:6004
-#, c-format
-msgid "Tab page %d"
-msgstr "Karta %d"
-
-#: ../ex_docmd.c:6295
-msgid "No swap file"
-msgstr "Brak pliku wymiany"
-
-#: ../ex_docmd.c:6478
-msgid "E747: Cannot change directory, buffer is modified (add ! to override)"
-msgstr ""
-"E747: Nie mog๊ zmieniๆ katalogu, bufor zostaณ zmodyfikowany (dodaj ! aby "
-"wymusiๆ)"
-
-#: ../ex_docmd.c:6485
-msgid "E186: No previous directory"
-msgstr "E186: Nie ma poprzedniego katalogu"
-
-#: ../ex_docmd.c:6530
-msgid "E187: Unknown"
-msgstr "E187: Nieznany"
-
-#: ../ex_docmd.c:6610
-msgid "E465: :winsize requires two number arguments"
-msgstr "E465: :winsize wymaga dw๓ch argument๓w numerycznych"
-
-#: ../ex_docmd.c:6655
-msgid "E188: Obtaining window position not implemented for this platform"
-msgstr ""
-"E188: Pozyskiwanie pozycji okna nie jest zaimplementowane dla tego systemu"
-
-#: ../ex_docmd.c:6662
-msgid "E466: :winpos requires two number arguments"
-msgstr "E466: :winpos wymaga dw๓ch argument๓w numerycznych"
-
-#: ../ex_docmd.c:7241
-#, c-format
-msgid "E739: Cannot create directory: %s"
-msgstr "E739: Nie mog๊ utworzyๆ katalogu: %s"
-
-#: ../ex_docmd.c:7268
-#, c-format
-msgid "E189: \"%s\" exists (add ! to override)"
-msgstr "E189: \"%s\" istnieje (wymuถ poprzez !)"
-
-#: ../ex_docmd.c:7273
-#, c-format
-msgid "E190: Cannot open \"%s\" for writing"
-msgstr "E190: Nie mog๊ otworzyๆ \"%s\" do zapisu"
-
-#. set mark
-#: ../ex_docmd.c:7294
-msgid "E191: Argument must be a letter or forward/backward quote"
-msgstr "E191: Argument musi byๆ literฑ albo cudzysณowem w prz๓d/tyณ"
-
-#: ../ex_docmd.c:7333
-msgid "E192: Recursive use of :normal too deep"
-msgstr "E192: Rekursywne zastosowanie :normal za gณ๊bokie"
-
-#: ../ex_docmd.c:7807
-msgid "E194: No alternate file name to substitute for '#'"
-msgstr "E194: Brak nazwy zamiennego pliku do podstawienia pod '#'"
-
-#: ../ex_docmd.c:7841
-msgid "E495: no autocommand file name to substitute for \"<afile>\""
-msgstr "E495: brak nazwy pliku autokomend do podstawienia pod \"<afile>\""
-
-#: ../ex_docmd.c:7850
-msgid "E496: no autocommand buffer number to substitute for \"<abuf>\""
-msgstr "E496: brak numeru bufora autokomend do podstawienia pod \"<abuf>\""
-
-#: ../ex_docmd.c:7861
-msgid "E497: no autocommand match name to substitute for \"<amatch>\""
-msgstr "E497: brak nazwy dopasowania autokomend pod \"<amatch>\""
-
-#: ../ex_docmd.c:7870
-msgid "E498: no :source file name to substitute for \"<sfile>\""
-msgstr "E498: brak nazwy pliku :source do postawienia pod \"<sfile>\""
-
-#: ../ex_docmd.c:7876
-msgid "E842: no line number to use for \"<slnum>\""
-msgstr "E842: brak numeru linii by uฟyๆ z \"<slnum>\""
-
-#: ../ex_docmd.c:7903
-#, fuzzy, c-format
-msgid "E499: Empty file name for '%' or '#', only works with \":p:h\""
-msgstr "E499: Pusta nazwa pliku dla '%' lub '#', dziaณa tylko z \":p:h\""
-
-#: ../ex_docmd.c:7905
-msgid "E500: Evaluates to an empty string"
-msgstr "E500: Wynikiem jest pusty ciฑg"
-
-#: ../ex_docmd.c:8838
-msgid "E195: Cannot open viminfo file for reading"
-msgstr "E195: Nie mog๊ otworzyๆ pliku viminfo do odczytu"
-
-#: ../ex_eval.c:464
-msgid "E608: Cannot :throw exceptions with 'Vim' prefix"
-msgstr "E608: Nie moฟna ':throw' wyjฑtk๓w z prefiksem 'Vim'"
-
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:496
-#, c-format
-msgid "Exception thrown: %s"
-msgstr "Wyjฑtek: %s"
-
-#: ../ex_eval.c:545
-#, c-format
-msgid "Exception finished: %s"
-msgstr "Wyjฑtek zako๑czony: %s"
-
-#: ../ex_eval.c:546
-#, c-format
-msgid "Exception discarded: %s"
-msgstr "Wyjฑtek odrzucony: %s"
-
-#: ../ex_eval.c:588 ../ex_eval.c:634
-#, c-format
-msgid "%s, line %<PRId64>"
-msgstr "%s, wiersz %<PRId64>"
-
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:608
-#, c-format
-msgid "Exception caught: %s"
-msgstr "Wyjฑtek przechwycony: %s"
-
-#: ../ex_eval.c:676
-#, c-format
-msgid "%s made pending"
-msgstr "%s zostaณ zawieszony"
-
-#: ../ex_eval.c:679
-#, c-format
-msgid "%s resumed"
-msgstr "%s przywr๓cony"
-
-#: ../ex_eval.c:683
-#, c-format
-msgid "%s discarded"
-msgstr "%s odrzucony"
-
-#: ../ex_eval.c:708
-msgid "Exception"
-msgstr "Wyjฑtek"
-
-#: ../ex_eval.c:713
-msgid "Error and interrupt"
-msgstr "Bณฑd i przerwanie"
-
-#: ../ex_eval.c:715
-msgid "Error"
-msgstr "Bณฑd"
-
-#. if (pending & CSTP_INTERRUPT)
-#: ../ex_eval.c:717
-msgid "Interrupt"
-msgstr "Przerwanie"
-
-#: ../ex_eval.c:795
-msgid "E579: :if nesting too deep"
-msgstr "E579: zbyt gณ๊bokie zagnieฟdฟenie :if"
-
-#: ../ex_eval.c:830
-msgid "E580: :endif without :if"
-msgstr "E580: :endif bez :if"
-
-#: ../ex_eval.c:873
-msgid "E581: :else without :if"
-msgstr "E581: :else bez :if"
-
-#: ../ex_eval.c:876
-msgid "E582: :elseif without :if"
-msgstr "E582: :elseif bez :if"
-
-#: ../ex_eval.c:880
-msgid "E583: multiple :else"
-msgstr "E583: wielokrotne :else"
-
-#: ../ex_eval.c:883
-msgid "E584: :elseif after :else"
-msgstr "E584: :elseif po :else"
-
-#: ../ex_eval.c:941
-msgid "E585: :while/:for nesting too deep"
-msgstr "E585: zbyt gณ๊bokie zagnieฟdฟenie :while/:for"
-
-#: ../ex_eval.c:1028
-msgid "E586: :continue without :while or :for"
-msgstr "E586: :continue bez :while lub :for"
-
-#: ../ex_eval.c:1061
-msgid "E587: :break without :while or :for"
-msgstr "E587: :break bez :while lub :for"
-
-#: ../ex_eval.c:1102
-msgid "E732: Using :endfor with :while"
-msgstr "E732: Uฟycie :endfor z :while"
-
-#: ../ex_eval.c:1104
-msgid "E733: Using :endwhile with :for"
-msgstr "E733: Uฟycie :endwhile z :for"
-
-#: ../ex_eval.c:1247
-msgid "E601: :try nesting too deep"
-msgstr "E601: zbyt gณ๊bokie zagnieฟdฟenie :try"
-
-#: ../ex_eval.c:1317
-msgid "E603: :catch without :try"
-msgstr "E603: :catch bez :try"
-
-#. Give up for a ":catch" after ":finally" and ignore it.
-#. * Just parse.
-#: ../ex_eval.c:1332
-msgid "E604: :catch after :finally"
-msgstr "E604: :catch za :finally"
-
-#: ../ex_eval.c:1451
-msgid "E606: :finally without :try"
-msgstr "E606: :finally bez :try"
-
-#. Give up for a multiple ":finally" and ignore it.
-#: ../ex_eval.c:1467
-msgid "E607: multiple :finally"
-msgstr "E607: wielokrotne :finally"
-
-#: ../ex_eval.c:1571
-msgid "E602: :endtry without :try"
-msgstr "E602: :endtry bez :try"
-
-#: ../ex_eval.c:2026
-msgid "E193: :endfunction not inside a function"
-msgstr "E193: :endfunction poza funkcjฑ"
-
-#: ../ex_getln.c:1643
-msgid "E788: Not allowed to edit another buffer now"
-msgstr "E788: Nie moฟna teraz edytowaๆ innego bufora"
-
-#: ../ex_getln.c:1656
-msgid "E811: Not allowed to change buffer information now"
-msgstr "E811: Nie moฟna teraz zmieniaๆ informacji o buforze"
-
-#: ../ex_getln.c:3178
-msgid "tagname"
-msgstr "nazwa znacznika"
-
-#: ../ex_getln.c:3181
-msgid " kind file\n"
-msgstr " pokrewny plik\n"
-
-#: ../ex_getln.c:4799
-msgid "'history' option is zero"
-msgstr "opcja 'history' jest zerowa"
-
-#: ../ex_getln.c:5046
-#, c-format
-msgid ""
-"\n"
-"# %s History (newest to oldest):\n"
-msgstr ""
-"\n"
-"# %s Historia (od najnowszych po najstarsze):\n"
-
-#: ../ex_getln.c:5047
-msgid "Command Line"
-msgstr "Wiersz polece๑"
-
-#: ../ex_getln.c:5048
-msgid "Search String"
-msgstr "Szukany ciฑg"
-
-#: ../ex_getln.c:5049
-msgid "Expression"
-msgstr "Wyraฟenie"
-
-#: ../ex_getln.c:5050
-msgid "Input Line"
-msgstr "Wiersz wprowadze๑"
-
-#: ../ex_getln.c:5117
-msgid "E198: cmd_pchar beyond the command length"
-msgstr "E198: cmd_pchar przekracza dณugoถๆ polecenia"
-
-#: ../ex_getln.c:5279
-msgid "E199: Active window or buffer deleted"
-msgstr "E199: Aktywny widok lub bufor skasowany"
-
-#: ../file_search.c:203
-msgid "E854: path too long for completion"
-msgstr "E854: ถcieฟka za dณuga by uzupeณniๆ"
-
-#: ../file_search.c:446
-#, c-format
-msgid ""
-"E343: Invalid path: '**[number]' must be at the end of the path or be "
-"followed by '%s'."
-msgstr ""
-"E343: Niewณaถciwy trop: '**[numer]' musi byๆ na ko๑cu tropu lub po nim musi "
-"byๆ '%s'."
-
-#: ../file_search.c:1505
-#, c-format
-msgid "E344: Can't find directory \"%s\" in cdpath"
-msgstr "E344: Nie mog๊ znaleผๆ katalogu \"%s\" w cdpath"
-
-#: ../file_search.c:1508
-#, c-format
-msgid "E345: Can't find file \"%s\" in path"
-msgstr "E345: Nie mog๊ znaleผๆ pliku \"%s\" w tropie"
-
-#: ../file_search.c:1512
-#, c-format
-msgid "E346: No more directory \"%s\" found in cdpath"
-msgstr "E346: Katalogu \"%s\" nie ma wi๊cej w cdpath"
-
-#: ../file_search.c:1515
-#, c-format
-msgid "E347: No more file \"%s\" found in path"
-msgstr "E347: Pliku \"%s\" nie ma wi๊cej w tropie"
-
-#: ../fileio.c:137
-msgid "E812: Autocommands changed buffer or buffer name"
-msgstr "E812: Autokomendy zmieniณy bufor lub jego nazw๊"
-
-#: ../fileio.c:368
-msgid "Illegal file name"
-msgstr "Niedopuszczalna nazwa pliku"
-
-#: ../fileio.c:395 ../fileio.c:476 ../fileio.c:2543 ../fileio.c:2578
-msgid "is a directory"
-msgstr "jest katalogiem"
-
-#: ../fileio.c:397
-msgid "is not a file"
-msgstr "nie jest plikiem"
-
-#: ../fileio.c:508 ../fileio.c:3522
-msgid "[New File]"
-msgstr "[Nowy Plik]"
-
-#: ../fileio.c:511
-msgid "[New DIRECTORY]"
-msgstr "[Nowy KATALOG]"
-
-#: ../fileio.c:529 ../fileio.c:532
-msgid "[File too big]"
-msgstr "[Za duฟy plik]"
-
-#: ../fileio.c:534
-msgid "[Permission Denied]"
-msgstr "[Nie dozwolono]"
-
-#: ../fileio.c:653
-msgid "E200: *ReadPre autocommands made the file unreadable"
-msgstr "E200: Autokomendy *ReadPre zrobiณy plik nieodczytywalnym"
-
-#: ../fileio.c:655
-msgid "E201: *ReadPre autocommands must not change current buffer"
-msgstr "E201: Autokomendy *ReadPre nie mogฑ zmieniaๆ bieฟฑcego bufora"
-
-#: ../fileio.c:672
-msgid "Nvim: Reading from stdin...\n"
-msgstr "Vim: Wczytywanie ze stdin...\n"
-
-#. Re-opening the original file failed!
-#: ../fileio.c:909
-msgid "E202: Conversion made file unreadable!"
-msgstr "E202: Nie moฟna otworzyๆ pliku utworzonego przez przemian๊!"
-
-#. fifo or socket
-#: ../fileio.c:1782
-msgid "[fifo/socket]"
-msgstr "[fifo/socket]"
-
-#. fifo
-#: ../fileio.c:1788
-msgid "[fifo]"
-msgstr "[fifo]"
-
-#. or socket
-#: ../fileio.c:1794
-msgid "[socket]"
-msgstr "[socket]"
-
-#. or character special
-#: ../fileio.c:1801
-msgid "[character special]"
-msgstr "[specjalny znak]"
-
-#: ../fileio.c:1815
-msgid "[CR missing]"
-msgstr "[brak CR]'"
-
-#: ../fileio.c:1819
-msgid "[long lines split]"
-msgstr "[dณugie wiersze rozdzielane]"
-
-#: ../fileio.c:1823 ../fileio.c:3512
-msgid "[NOT converted]"
-msgstr "[NIE przemienione]"
-
-#: ../fileio.c:1826 ../fileio.c:3515
-msgid "[converted]"
-msgstr "[przemienione]"
-
-#: ../fileio.c:1831
-#, c-format
-msgid "[CONVERSION ERROR in line %<PRId64>]"
-msgstr "[BฃกD W PRZEMIANIE w linii %<PRId64>]"
-
-#: ../fileio.c:1835
-#, c-format
-msgid "[ILLEGAL BYTE in line %<PRId64>]"
-msgstr "[NIEDOZWOLONY BAJT w wierszu %<PRId64>]"
-
-#: ../fileio.c:1838
-msgid "[READ ERRORS]"
-msgstr "[BฃสDY W ODCZYCIE]"
-
-#: ../fileio.c:2104
-msgid "Can't find temp file for conversion"
-msgstr "Nie mog๊ znaleผๆ pliku tymczasowego w celu przemiany"
-
-#: ../fileio.c:2110
-msgid "Conversion with 'charconvert' failed"
-msgstr "Nieudana przemiana z 'charconvert'"
-
-#: ../fileio.c:2113
-msgid "can't read output of 'charconvert'"
-msgstr "nie mog๊ odczytaๆ wyjถcia z 'charconvert'"
-
-#: ../fileio.c:2437
-msgid "E676: No matching autocommands for acwrite buffer"
-msgstr "E676: Brak pasujฑcych autokomend dla bufora acwrite"
-
-#: ../fileio.c:2466
-msgid "E203: Autocommands deleted or unloaded buffer to be written"
-msgstr ""
-"E203: Autokomendy skasowaณy lub wyณadowaณy bufor przeznaczony do zapisu"
-
-#: ../fileio.c:2486
-msgid "E204: Autocommand changed number of lines in unexpected way"
-msgstr "E204: Autokomenda zmieniณa liczb๊ wierszy w nieoczekiwany spos๓b"
-
-#: ../fileio.c:2548 ../fileio.c:2565
-msgid "is not a file or writable device"
-msgstr "nie jest plikiem lub zapisywalnym przyrzฑdem"
-
-#: ../fileio.c:2601
-msgid "is read-only (add ! to override)"
-msgstr "jest tylko do odczytu (wymuถ poprzez !)"
-
-#: ../fileio.c:2886
-msgid "E506: Can't write to backup file (add ! to override)"
-msgstr "E506: Nie mog๊ zapisaๆ do pliku zabezpieczenia (wymuถ przez !)"
-
-#: ../fileio.c:2898
-msgid "E507: Close error for backup file (add ! to override)"
-msgstr "E507: Bณฑd podczas zamykania pliku zabezpieczenia (wymuถ przez !)"
-
-#: ../fileio.c:2901
-msgid "E508: Can't read file for backup (add ! to override)"
-msgstr "E508: Nie mog๊ odczytaๆ pliku w celu zabezpieczenia (wymuถ przez !)"
-
-#: ../fileio.c:2923
-msgid "E509: Cannot create backup file (add ! to override)"
-msgstr "E509: Nie mog๊ stworzyๆ pliku zabezpieczenia (wymuถ przez !)"
-
-#: ../fileio.c:3008
-msgid "E510: Can't make backup file (add ! to override)"
-msgstr "E510: Nie mog๊ zrobiๆ pliku zabezpieczenia (wymuถ przez !)"
-
-#. Can't write without a tempfile!
-#: ../fileio.c:3121
-msgid "E214: Can't find temp file for writing"
-msgstr "E214: Nie mog๊ znaleผๆ pliku tymczasowego do zapisania"
-
-#: ../fileio.c:3134
-msgid "E213: Cannot convert (add ! to write without conversion)"
-msgstr "E213: Nie mog๊ przemieniๆ (uฟyj ! by zapisaๆ bez przemiany)"
-
-#: ../fileio.c:3169
-msgid "E166: Can't open linked file for writing"
-msgstr "E166: Nie mog๊ otworzyๆ podณฑczonego pliku do zapisu"
-
-#: ../fileio.c:3173
-msgid "E212: Can't open file for writing"
-msgstr "E212: Nie mog๊ otworzyๆ pliku do zapisu"
-
-#: ../fileio.c:3363
-msgid "E667: Fsync failed"
-msgstr "E667: Fsync nie powi๓dณ si๊"
-
-#: ../fileio.c:3398
-msgid "E512: Close failed"
-msgstr "E512: Zamkni๊cie si๊ nie powiodณo"
-
-#: ../fileio.c:3436
-msgid "E513: write error, conversion failed (make 'fenc' empty to override)"
-msgstr ""
-"E513: Bณฑd zapisu, przemiana si๊ nie powiodณa (opr๓ฟnij 'fenc' aby wymusiๆ)"
-
-#: ../fileio.c:3441
-#, c-format
-msgid ""
-"E513: write error, conversion failed in line %<PRId64> (make 'fenc' empty to "
-"override)"
-msgstr ""
-"E513: Bณฑd zapisu, przemiana si๊ nie powiodณa w wierszu %<PRId64> (opr๓ฟnij "
-"'fenc' by wymusiๆ)"
-
-#: ../fileio.c:3448
-msgid "E514: write error (file system full?)"
-msgstr "E514: bณฑd w zapisie (moฟe system plik๓w jest przepeณniony?)"
-
-#: ../fileio.c:3506
-msgid " CONVERSION ERROR"
-msgstr " BฃกD W PRZEMIANIE"
-
-#: ../fileio.c:3509
-#, c-format
-msgid " in line %<PRId64>;"
-msgstr " w wierszu %<PRId64>;"
-
-#: ../fileio.c:3519
-msgid "[Device]"
-msgstr "[Urzฑdzenie]"
-
-#: ../fileio.c:3522
-msgid "[New]"
-msgstr "[Nowy]"
-
-#: ../fileio.c:3535
-msgid " [a]"
-msgstr " [a]"
-
-#: ../fileio.c:3535
-msgid " appended"
-msgstr " doณฑczono"
-
-#: ../fileio.c:3537
-msgid " [w]"
-msgstr " [w]"
-
-#: ../fileio.c:3537
-msgid " written"
-msgstr " zapisano"
-
-#: ../fileio.c:3579
-msgid "E205: Patchmode: can't save original file"
-msgstr "E205: Patchmode: nie mog๊ zapisaๆ oryginalnego pliku"
-
-#: ../fileio.c:3602
-msgid "E206: patchmode: can't touch empty original file"
-msgstr "E206: patchmode: nie mog๊ stworzyๆ pustego oryginalnego pliku"
-
-#: ../fileio.c:3616
-msgid "E207: Can't delete backup file"
-msgstr "E207: Nie mog๊ skasowaๆ pliku zabezpieczenia"
-
-#: ../fileio.c:3672
-msgid ""
-"\n"
-"WARNING: Original file may be lost or damaged\n"
-msgstr ""
-"\n"
-"OSTRZEฏENIE: Oryginalny plik moฟe zostaๆ utracony lub uszkodzony\n"
-
-#: ../fileio.c:3675
-msgid "don't quit the editor until the file is successfully written!"
-msgstr "nie wychodผ edytora, dop๓ki plik nie zostaณ poprawnie zapisany!"
-
-#: ../fileio.c:3795
-msgid "[dos]"
-msgstr "[dos]"
-
-#: ../fileio.c:3795
-msgid "[dos format]"
-msgstr "[format dos-a]"
-
-#: ../fileio.c:3801
-msgid "[mac]"
-msgstr "[mac]"
-
-#: ../fileio.c:3801
-msgid "[mac format]"
-msgstr "[format maca]"
-
-#: ../fileio.c:3807
-msgid "[unix]"
-msgstr "[unix]"
-
-#: ../fileio.c:3807
-msgid "[unix format]"
-msgstr "[format unixa]"
-
-#: ../fileio.c:3831
-msgid "1 line, "
-msgstr "1 wiersz, "
-
-#: ../fileio.c:3833
-#, c-format
-msgid "%<PRId64> lines, "
-msgstr "%<PRId64> wierszy, "
-
-#: ../fileio.c:3836
-msgid "1 character"
-msgstr "1 znak"
-
-#: ../fileio.c:3838
-#, c-format
-msgid "%<PRId64> characters"
-msgstr "%<PRId64> znak๓w"
-
-#: ../fileio.c:3849
-msgid "[noeol]"
-msgstr "[noeol]"
-
-#: ../fileio.c:3849
-msgid "[Incomplete last line]"
-msgstr "[Niekompletny ostatni wiersz]"
-
-#. don't overwrite messages here
-#. must give this prompt
-#. don't use emsg() here, don't want to flush the buffers
-#: ../fileio.c:3865
-msgid "WARNING: The file has been changed since reading it!!!"
-msgstr "OSTRZEฏENIE: Plik zmieniณ si๊ od czasu ostatniego odczytu!!!"
-
-#: ../fileio.c:3867
-msgid "Do you really want to write to it"
-msgstr "Czy naprawd๊ chcesz go zapisaๆ"
-
-#: ../fileio.c:4648
-#, c-format
-msgid "E208: Error writing to \"%s\""
-msgstr "E208: Bณฑd zapisywania do \"%s\""
-
-#: ../fileio.c:4655
-#, c-format
-msgid "E209: Error closing \"%s\""
-msgstr "E209: Bณฑd w trakcie zamykania \"%s\""
-
-#: ../fileio.c:4657
-#, c-format
-msgid "E210: Error reading \"%s\""
-msgstr "E210: Bณฑd odczytu \"%s\""
-
-#: ../fileio.c:4883
-msgid "E246: FileChangedShell autocommand deleted buffer"
-msgstr "E246: Autokomenda FileChangedShell skasowaณa bufor"
-
-#: ../fileio.c:4894
-#, c-format
-msgid "E211: File \"%s\" no longer available"
-msgstr "E211: Plik \"%s\" nie jest dณuฟej dost๊pny"
-
-#: ../fileio.c:4906
-#, c-format
-msgid ""
-"W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as "
-"well"
-msgstr ""
-"W12: OSTRZEฏENIE: Plik \"%s\" zmieniณ si๊ od czasu rozpocz๊cia edycji, bufor "
-"w Vimie r๓wnieฟ zostaณ zmieniony"
-
-#: ../fileio.c:4907
-msgid "See \":help W12\" for more info."
-msgstr "Zobacz \":help W12\" dla dalszych informacji."
-
-#: ../fileio.c:4910
-#, c-format
-msgid "W11: Warning: File \"%s\" has changed since editing started"
-msgstr "W11: OSTRZEฏENIE: Plik \"%s\" zmieniณ si๊ od czasu rozpocz๊cia edycji"
-
-#: ../fileio.c:4911
-msgid "See \":help W11\" for more info."
-msgstr "Zobacz \":help W11\" dla dalszych informacji."
-
-#: ../fileio.c:4914
-#, c-format
-msgid "W16: Warning: Mode of file \"%s\" has changed since editing started"
-msgstr ""
-"W16: OSTRZEฏENIE: Tryb pliku \"%s\" zmieniณ si๊ od czasu rozpocz๊cia edycji"
-
-#: ../fileio.c:4915
-msgid "See \":help W16\" for more info."
-msgstr "Zobacz \":help W16\" dla dalszych informacji."
-
-#: ../fileio.c:4927
-#, c-format
-msgid "W13: Warning: File \"%s\" has been created after editing started"
-msgstr "W13: OSTRZEฏENIE: Plik \"%s\" zostaณ stworzony po rozpocz๊ciu edycji"
-
-#: ../fileio.c:4947
-msgid "Warning"
-msgstr "OSTRZEฏENIE"
-
-#: ../fileio.c:4948
-msgid ""
-"&OK\n"
-"&Load File"
-msgstr ""
-"&OK\n"
-"&Zaณaduj Plik"
-
-#: ../fileio.c:5065
-#, c-format
-msgid "E462: Could not prepare for reloading \"%s\""
-msgstr "E462: Nie moฟna przygotowaๆ przeณadowania \"%s\""
-
-#: ../fileio.c:5078
-#, c-format
-msgid "E321: Could not reload \"%s\""
-msgstr "E321: Nie moฟna przeณadowaๆ \"%s\""
-
-#: ../fileio.c:5601
-msgid "--Deleted--"
-msgstr "--Skasowano--"
-
-#: ../fileio.c:5732
-#, c-format
-msgid "auto-removing autocommand: %s <buffer=%d>"
-msgstr "auto-usuwanie autokomendy: %s <buffer=%d>"
-
-#. the group doesn't exist
-#: ../fileio.c:5772
-#, c-format
-msgid "E367: No such group: \"%s\""
-msgstr "E367: Nie ma takiej grupy: \"%s\""
-
-#: ../fileio.c:5897
-#, c-format
-msgid "E215: Illegal character after *: %s"
-msgstr "E215: Niedopuszczalny znak po *: %s"
-
-#: ../fileio.c:5905
-#, c-format
-msgid "E216: No such event: %s"
-msgstr "E216: Nie ma takiego wydarzenia: %s"
-
-#: ../fileio.c:5907
-#, c-format
-msgid "E216: No such group or event: %s"
-msgstr "E216: Nie ma takiej grupy lub wydarzenia: %s"
-
-#. Highlight title
-#: ../fileio.c:6090
-msgid ""
-"\n"
-"--- Auto-Commands ---"
-msgstr ""
-"\n"
-"--- Autokomendy ---"
-
-#: ../fileio.c:6293
-#, c-format
-msgid "E680: <buffer=%d>: invalid buffer number "
-msgstr "E680: <buffer=%d>: niewณaถciwy numer bufora"
-
-#: ../fileio.c:6370
-msgid "E217: Can't execute autocommands for ALL events"
-msgstr "E217: Nie moฟna wykonywaๆ autokomend dla wydarze๑ ALL"
-
-#: ../fileio.c:6393
-msgid "No matching autocommands"
-msgstr "Brak pasujฑcych autokomend"
-
-#: ../fileio.c:6831
-msgid "E218: autocommand nesting too deep"
-msgstr "E218: zbyt gณ๊bokie zagnieฟdฟenie autokomend"
-
-#: ../fileio.c:7143
-#, c-format
-msgid "%s Auto commands for \"%s\""
-msgstr "%s Autokomend dla \"%s\""
-
-#: ../fileio.c:7149
-#, c-format
-msgid "Executing %s"
-msgstr "Wykonuj๊ %s"
-
-#: ../fileio.c:7211
-#, c-format
-msgid "autocommand %s"
-msgstr "autokomenda %s"
-
-#: ../fileio.c:7795
-msgid "E219: Missing {."
-msgstr "E219: Brak {."
-
-#: ../fileio.c:7797
-msgid "E220: Missing }."
-msgstr "E220: Brak }."
-
-#: ../fold.c:93
-msgid "E490: No fold found"
-msgstr "E490: Nie znaleziono zwini๊cia"
-
-#: ../fold.c:544
-msgid "E350: Cannot create fold with current 'foldmethod'"
-msgstr "E350: Nie moฟna utworzyๆ zwini๊cia przy bieฟฑcej 'foldmethod'"
-
-#: ../fold.c:546
-msgid "E351: Cannot delete fold with current 'foldmethod'"
-msgstr "E351: Nie moฟna skasowaๆ zwini๊cia przy bieฟฑcej 'foldmethod'"
-
-#: ../fold.c:1784
-#, c-format
-msgid "+--%3ld lines folded "
-msgstr "+--%3ld wierszy zwini๊to "
-
-#. buffer has already been read
-#: ../getchar.c:273
-msgid "E222: Add to read buffer"
-msgstr "E222: Dodaj do bufora odczytu"
-
-#: ../getchar.c:2040
-msgid "E223: recursive mapping"
-msgstr "E223: rekursywne przyporzฑdkowanie"
-
-#: ../getchar.c:2849
-#, c-format
-msgid "E224: global abbreviation already exists for %s"
-msgstr "E224: istnieje juฟ globalny skr๓t dla %s"
-
-#: ../getchar.c:2852
-#, c-format
-msgid "E225: global mapping already exists for %s"
-msgstr "E225: istnieje juฟ globalne przyporzฑdkowanie dla %s"
-
-#: ../getchar.c:2952
-#, c-format
-msgid "E226: abbreviation already exists for %s"
-msgstr "E226: istnieje juฟ skr๓t dla %s"
-
-#: ../getchar.c:2955
-#, c-format
-msgid "E227: mapping already exists for %s"
-msgstr "E227: istnieje juฟ przyporzฑdkowanie dla %s"
-
-#: ../getchar.c:3008
-msgid "No abbreviation found"
-msgstr "Nie znaleziono skr๓tu"
-
-#: ../getchar.c:3010
-msgid "No mapping found"
-msgstr "Nie znaleziono przyporzฑdkowania"
-
-#: ../getchar.c:3974
-msgid "E228: makemap: Illegal mode"
-msgstr "E228: makemap: Niedopuszczalny tryb"
-
-#. key value of 'cedit' option
-#. type of cmdline window or 0
-#. result of cmdline window or 0
-#: ../globals.h:924
-msgid "--No lines in buffer--"
-msgstr "--Brak wierszy w buforze--"
-
-#.
-#. * The error messages that can be shared are included here.
-#. * Excluded are errors that are only used once and debugging messages.
-#.
-#: ../globals.h:996
-msgid "E470: Command aborted"
-msgstr "E470: Przerwanie komendy"
-
-#: ../globals.h:997
-msgid "E471: Argument required"
-msgstr "E471: wymagany argument"
-
-#: ../globals.h:998
-msgid "E10: \\ should be followed by /, ? or &"
-msgstr "E10: po \\ powinno byๆ /, ? lub &"
-
-#: ../globals.h:1000
-msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
-msgstr ""
-"E11: Niedozwolone w oknie wiersza polece๑; <CR> wykonuje, CTRL-C opuszcza"
-
-#: ../globals.h:1002
-msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
-msgstr ""
-"E12: Komenda niedozwolona z exrc/vimrc w bieฟฑcym szukaniu katalogu lub "
-"znacznika"
-
-#: ../globals.h:1003
-msgid "E171: Missing :endif"
-msgstr "E171: Brak :endif"
-
-#: ../globals.h:1004
-msgid "E600: Missing :endtry"
-msgstr "E600: Brak :endtry"
-
-#: ../globals.h:1005
-msgid "E170: Missing :endwhile"
-msgstr "E170: Brak :endwhile"
-
-#: ../globals.h:1006
-msgid "E170: Missing :endfor"
-msgstr "E170: Brak :endfor"
-
-#: ../globals.h:1007
-msgid "E588: :endwhile without :while"
-msgstr "E588: :endwhile bez :while"
-
-#: ../globals.h:1008
-msgid "E588: :endfor without :for"
-msgstr "E588: :endfor bez :for"
-
-#: ../globals.h:1009
-msgid "E13: File exists (add ! to override)"
-msgstr "E13: Plik istnieje (wymuถ poprzez !)"
-
-#: ../globals.h:1010
-msgid "E472: Command failed"
-msgstr "E472: Komenda nie powiodณa si๊"
-
-#: ../globals.h:1011
-msgid "E473: Internal error"
-msgstr "E473: Bณฑd wewn๊trzny"
-
-#: ../globals.h:1012
-msgid "Interrupted"
-msgstr "Przerwane"
-
-#: ../globals.h:1013
-msgid "E14: Invalid address"
-msgstr "E14: Niewณaถciwy adres"
-
-#: ../globals.h:1014
-msgid "E474: Invalid argument"
-msgstr "E474: Niewณaถciwy argument"
-
-#: ../globals.h:1015
-#, c-format
-msgid "E475: Invalid argument: %s"
-msgstr "E475: Niewณaถciwy argument: %s"
-
-#: ../globals.h:1016
-#, c-format
-msgid "E15: Invalid expression: %s"
-msgstr "E15: Niewณaถciwe wyraฟenie: %s"
-
-#: ../globals.h:1017
-msgid "E16: Invalid range"
-msgstr "E16: Niewณaถciwy zakres"
-
-#: ../globals.h:1018
-msgid "E476: Invalid command"
-msgstr "E476: Niewณaถciwa komenda"
-
-#: ../globals.h:1019
-#, c-format
-msgid "E17: \"%s\" is a directory"
-msgstr "E17: \"%s\" jest katalogiem"
-
-#: ../globals.h:1020
-#, fuzzy
-msgid "E900: Invalid job id"
-msgstr "E49: Niewณaถciwa wielkoถๆ przewini๊cia"
-
-#: ../globals.h:1021
-msgid "E901: Job table is full"
-msgstr ""
-
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
-#: ../globals.h:1024
-#, c-format
-msgid "E364: Library call failed for \"%s()\""
-msgstr "E364: Wywoณanie z biblioteki nie powiodณo si๊ dla \"%s()\""
-
-#: ../globals.h:1026
-msgid "E19: Mark has invalid line number"
-msgstr "E19: Zakณadka ma niewณaถciwy numer wiersza"
-
-#: ../globals.h:1027
-msgid "E20: Mark not set"
-msgstr "E20: Zakณadka nienastawiona"
-
-#: ../globals.h:1029
-msgid "E21: Cannot make changes, 'modifiable' is off"
-msgstr "E21: Nie mog๊ wykonaๆ zmian, 'modifiable' jest wyณฑczone"
-
-#: ../globals.h:1030
-msgid "E22: Scripts nested too deep"
-msgstr "E22: Zbyt gณ๊bokie zagnieฟdฟenie skrypt๓w"
-
-#: ../globals.h:1031
-msgid "E23: No alternate file"
-msgstr "E23: Brak pliku zamiany"
-
-#: ../globals.h:1032
-msgid "E24: No such abbreviation"
-msgstr "E24: Nie ma takiego skr๓tu"
-
-#: ../globals.h:1033
-msgid "E477: No ! allowed"
-msgstr "E477: Niedozwolone !"
-
-#: ../globals.h:1035
-msgid "E25: Nvim does not have a built-in GUI"
-msgstr "E25: GUI nie moฟe byๆ uฟyte: Nie wณฑczono podczas kompilacji"
-
-#: ../globals.h:1036
-#, c-format
-msgid "E28: No such highlight group name: %s"
-msgstr "E28: Brak takiej nazwy grupy podถwietlania: %s"
-
-#: ../globals.h:1037
-msgid "E29: No inserted text yet"
-msgstr "E29: Nie wprowadzono jeszcze ฟadnego tekstu"
-
-#: ../globals.h:1038
-msgid "E30: No previous command line"
-msgstr "E30: Nie ma poprzedniego wiersza polece๑"
-
-#: ../globals.h:1039
-msgid "E31: No such mapping"
-msgstr "E31: Nie ma takiego przyporzฑdkowania"
-
-#: ../globals.h:1040
-msgid "E479: No match"
-msgstr "E479: Brak dopasowa๑"
-
-#: ../globals.h:1041
-#, c-format
-msgid "E480: No match: %s"
-msgstr "E480: Brak dopasowa๑: %s"
-
-#: ../globals.h:1042
-msgid "E32: No file name"
-msgstr "E32: Brak nazwy pliku"
-
-#: ../globals.h:1044
-msgid "E33: No previous substitute regular expression"
-msgstr "E33: Brak poprzedniego podstawieniowego wyraฟenia regularnego"
-
-#: ../globals.h:1045
-msgid "E34: No previous command"
-msgstr "E34: Brak poprzedniej komendy"
-
-#: ../globals.h:1046
-msgid "E35: No previous regular expression"
-msgstr "E35: Brak poprzedniego wyraฟenia regularnego"
-
-#: ../globals.h:1047
-msgid "E481: No range allowed"
-msgstr "E481: Zakres niedozwolony"
-
-#: ../globals.h:1048
-msgid "E36: Not enough room"
-msgstr "E36: Brak miejsca"
-
-#: ../globals.h:1049
-#, c-format
-msgid "E482: Can't create file %s"
-msgstr "E482: Nie mog๊ stworzyๆ pliku %s"
-
-#: ../globals.h:1050
-msgid "E483: Can't get temp file name"
-msgstr "E483: Nie mog๊ pobraๆ nazwy pliku tymczasowego"
-
-#: ../globals.h:1051
-#, c-format
-msgid "E484: Can't open file %s"
-msgstr "E484: Nie mog๊ otworzyๆ pliku %s"
-
-#: ../globals.h:1052
-#, c-format
-msgid "E485: Can't read file %s"
-msgstr "E485: Nie mog๊ odczytaๆ pliku %s"
-
-#: ../globals.h:1054
-msgid "E37: No write since last change (add ! to override)"
-msgstr "E37: Nie zapisano od ostatniej zmiany (wymuถ przez !)"
-
-#: ../globals.h:1055
-#, fuzzy
-msgid "E37: No write since last change"
-msgstr "[Brak zapisu od czasu ostatniej zmiany]\n"
-
-#: ../globals.h:1056
-msgid "E38: Null argument"
-msgstr "E38: Zerowy argument"
-
-#: ../globals.h:1057
-msgid "E39: Number expected"
-msgstr "E39: Oczekuj๊ liczby"
-
-#: ../globals.h:1058
-#, c-format
-msgid "E40: Can't open errorfile %s"
-msgstr "E40: Nie mog๊ otworzyๆ pliku bณ๊d๓w %s"
-
-#: ../globals.h:1059
-msgid "E41: Out of memory!"
-msgstr "E41: Pami๊ๆ wyczerpana!"
-
-#: ../globals.h:1060
-msgid "Pattern not found"
-msgstr "Nie znaleziono wzorca"
-
-#: ../globals.h:1061
-#, c-format
-msgid "E486: Pattern not found: %s"
-msgstr "E486: Nie znaleziono wzorca: %s"
-
-#: ../globals.h:1062
-msgid "E487: Argument must be positive"
-msgstr "E487: Argument musi byๆ dodatni"
-
-#: ../globals.h:1064
-msgid "E459: Cannot go back to previous directory"
-msgstr "E459: Nie moฟna przejถๆ do poprzedniego katalogu"
-
-#: ../globals.h:1066
-msgid "E42: No Errors"
-msgstr "E42: Brak Bณ๊d๓w"
-
-#: ../globals.h:1067
-msgid "E776: No location list"
-msgstr "E776: Brak listy lokacji"
-
-#: ../globals.h:1068
-msgid "E43: Damaged match string"
-msgstr "E43: Popsuty ciฑg wzorca"
-
-#: ../globals.h:1069
-msgid "E44: Corrupted regexp program"
-msgstr "E44: Zepsuty program wyraฟe๑ regularnych"
-
-#: ../globals.h:1071
-msgid "E45: 'readonly' option is set (add ! to override)"
-msgstr "E45: opcja 'readonly' jest ustawiona (wymuถ poprzez !)"
-
-#: ../globals.h:1073
-#, c-format
-msgid "E46: Cannot change read-only variable \"%s\""
-msgstr "E46: Nie mog๊ zmieniๆ zmiennej tylko do odczytu \"%s\""
-
-#: ../globals.h:1075
-#, c-format
-msgid "E794: Cannot set variable in the sandbox: \"%s\""
-msgstr "E794: Nie mog๊ ustawiๆ zmiennej w piaskownicy: \"%s\""
-
-#: ../globals.h:1076
-msgid "E47: Error while reading errorfile"
-msgstr "E47: Bณฑd w trakcie czytania pliku bณ๊d๓w"
-
-#: ../globals.h:1078
-msgid "E48: Not allowed in sandbox"
-msgstr "E48: Niedozwolone w piaskownicy"
-
-#: ../globals.h:1080
-msgid "E523: Not allowed here"
-msgstr "E523: Niedozwolone w tym miejscu"
-
-#: ../globals.h:1082
-msgid "E359: Screen mode setting not supported"
-msgstr "E359: Ustawianie trybu ekranu niewspomagane"
-
-#: ../globals.h:1083
-msgid "E49: Invalid scroll size"
-msgstr "E49: Niewณaถciwa wielkoถๆ przewini๊cia"
-
-#: ../globals.h:1084
-msgid "E91: 'shell' option is empty"
-msgstr "E91: opcja 'shell' jest pusta"
-
-#: ../globals.h:1085
-msgid "E255: Couldn't read in sign data!"
-msgstr "E255: Nie mogณem wczytaๆ danych znaku!"
-
-#: ../globals.h:1086
-msgid "E72: Close error on swap file"
-msgstr "E72: Bณฑd podczas zamykania pliku wymiany"
-
-#: ../globals.h:1087
-msgid "E73: tag stack empty"
-msgstr "E73: stos znacznik๓w jest pusty"
-
-#: ../globals.h:1088
-msgid "E74: Command too complex"
-msgstr "E74: Komenda jest zbyt skomplikowana"
-
-#: ../globals.h:1089
-msgid "E75: Name too long"
-msgstr "E75: Zbyt dณuga nazwa"
-
-#: ../globals.h:1090
-msgid "E76: Too many ["
-msgstr "E76: Zbyt wiele ["
-
-#: ../globals.h:1091
-msgid "E77: Too many file names"
-msgstr "E77: Zbyt wiele nazw plik๓w"
-
-#: ../globals.h:1092
-msgid "E488: Trailing characters"
-msgstr "E488: Nadst๊pne znaczki"
-
-#: ../globals.h:1093
-msgid "E78: Unknown mark"
-msgstr "E78: Nieznana zakณadka"
-
-#: ../globals.h:1094
-msgid "E79: Cannot expand wildcards"
-msgstr "E79: Nie mogฑ rozwinฑๆ znak๓w wieloznacznych"
-
-#: ../globals.h:1096
-msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
-msgstr "E591: 'winheight' nie moฟe byๆ mniejsze niฟ 'winminheight'"
-
-#: ../globals.h:1098
-msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
-msgstr "E592: 'winwidth' nie moฟe byๆ mniejsze niฟ 'winminwidth'"
-
-#: ../globals.h:1099
-msgid "E80: Error while writing"
-msgstr "E80: Bณฑd w trakcie zapisu"
-
-#: ../globals.h:1100
-msgid "Zero count"
-msgstr "Zerowy licznik"
-
-#: ../globals.h:1101
-msgid "E81: Using <SID> not in a script context"
-msgstr "E81: Uฟycie <SID> poza kontekstem skryptu"
-
-#: ../globals.h:1102
-#, c-format
-msgid "E685: Internal error: %s"
-msgstr "E685: Bณฑd wewn๊trzny: %s"
-
-#: ../globals.h:1104
-msgid "E363: pattern uses more memory than 'maxmempattern'"
-msgstr "E363: Wzorzec uฟywa wi๊cej pami๊ci niฟ 'maxmempattern'"
-
-#: ../globals.h:1105
-msgid "E749: empty buffer"
-msgstr "E749: pusty bufor"
-
-#: ../globals.h:1108
-msgid "E682: Invalid search pattern or delimiter"
-msgstr "E682: Niewณaถciwy wzorzec wyszukiwania lub delimiter"
-
-#: ../globals.h:1109
-msgid "E139: File is loaded in another buffer"
-msgstr "E139: Plik jest zaณadowany w innym buforze"
-
-#: ../globals.h:1110
-#, c-format
-msgid "E764: Option '%s' is not set"
-msgstr "E764: Nie ustawiono opcji '%s'"
-
-#: ../globals.h:1111
-msgid "E850: Invalid register name"
-msgstr "E850: Niewณaถciwa nazwa rejestru"
-
-#: ../globals.h:1114
-msgid "search hit TOP, continuing at BOTTOM"
-msgstr "szukanie dobiณo GำRY; kontynuacja od KOัCA"
-
-#: ../globals.h:1115
-msgid "search hit BOTTOM, continuing at TOP"
-msgstr "szukanie dobiณo KOัCA; kontynuacja od GำRY"
-
-#: ../hardcopy.c:240
-msgid "E550: Missing colon"
-msgstr "E550: Brak dwukropka"
-
-#: ../hardcopy.c:252
-msgid "E551: Illegal component"
-msgstr "E551: Niedozwolona cz๊ถๆ"
-
-#: ../hardcopy.c:259
-msgid "E552: digit expected"
-msgstr "E552: oczekiwaณem na cyfr๊"
-
-#: ../hardcopy.c:473
-#, c-format
-msgid "Page %d"
-msgstr "Strona %d"
-
-#: ../hardcopy.c:597
-msgid "No text to be printed"
-msgstr "Brak tekstu do drukowania"
-
-#: ../hardcopy.c:668
-#, c-format
-msgid "Printing page %d (%d%%)"
-msgstr "Drukuj๊ stron๊ %d (%d%%)"
-
-#: ../hardcopy.c:680
-#, c-format
-msgid " Copy %d of %d"
-msgstr " Kopia %d z %d"
-
-#: ../hardcopy.c:733
-#, c-format
-msgid "Printed: %s"
-msgstr "Wydrukowano: %s"
-
-#: ../hardcopy.c:740
-msgid "Printing aborted"
-msgstr "Drukowanie odwoณane"
-
-#: ../hardcopy.c:1365
-msgid "E455: Error writing to PostScript output file"
-msgstr "E455: Nie moฟna zapisaๆ do wyjถciowego pliku PostScriptu"
-
-#: ../hardcopy.c:1747
-#, c-format
-msgid "E624: Can't open file \"%s\""
-msgstr "E624: Nie mog๊ otworzyๆ pliku \"%s\""
-
-#: ../hardcopy.c:1756 ../hardcopy.c:2470
-#, c-format
-msgid "E457: Can't read PostScript resource file \"%s\""
-msgstr "E457: Nie moฟna odczytaๆ pliku zasob๓w PostScriptu \"%s\""
-
-#: ../hardcopy.c:1772
-#, c-format
-msgid "E618: file \"%s\" is not a PostScript resource file"
-msgstr "E618: plik \"%s\" nie jest plikiem zasob๓w PostScriptu"
-
-#: ../hardcopy.c:1788 ../hardcopy.c:1805 ../hardcopy.c:1844
-#, c-format
-msgid "E619: file \"%s\" is not a supported PostScript resource file"
-msgstr "E619: plik \"%s\" nie jest wspieranym plikiem zasob๓w PostScriptu"
-
-#: ../hardcopy.c:1856
-#, c-format
-msgid "E621: \"%s\" resource file has wrong version"
-msgstr "E621: \"%s\" nieprawidณowa wersja pliku zasob๓w"
-
-#: ../hardcopy.c:2225
-msgid "E673: Incompatible multi-byte encoding and character set."
-msgstr "E673: Niekompatybilne kodowanie wielobajtowe i zestaw znak๓w."
-
-#: ../hardcopy.c:2238
-msgid "E674: printmbcharset cannot be empty with multi-byte encoding."
-msgstr "E674: printmbcharset nie moฟe byๆ pusty przy kodowaniu wielobajtowym."
-
-#: ../hardcopy.c:2254
-msgid "E675: No default font specified for multi-byte printing."
-msgstr "E675: Nie okreถlono domyถlnej czcionki dla drukowania wielobajtowego."
-
-#: ../hardcopy.c:2426
-msgid "E324: Can't open PostScript output file"
-msgstr "E324: Nie moฟna otworzyๆ pliku PostScript do wyjถcia"
-
-#: ../hardcopy.c:2458
-#, c-format
-msgid "E456: Can't open file \"%s\""
-msgstr "E456: Nie mog๊ otworzyๆ pliku \"%s\""
-
-#: ../hardcopy.c:2583
-msgid "E456: Can't find PostScript resource file \"prolog.ps\""
-msgstr "E456: Nie moฟna znaleผๆ pliku zasob๓w PostScriptu \"prolog.ps\""
-
-#: ../hardcopy.c:2593
-msgid "E456: Can't find PostScript resource file \"cidfont.ps\""
-msgstr "E456: Nie moฟna znaleผๆ pliku zasob๓w PostScriptu \"cidfont.ps\""
-
-#: ../hardcopy.c:2622 ../hardcopy.c:2639 ../hardcopy.c:2665
-#, c-format
-msgid "E456: Can't find PostScript resource file \"%s.ps\""
-msgstr "E456: Nie moฟna znaleผๆ pliku zasob๓w PostScriptu \"%s.ps\""
-
-#: ../hardcopy.c:2654
-#, c-format
-msgid "E620: Unable to convert to print encoding \"%s\""
-msgstr "E620: Nie moฟna przekonwertowaๆ by drukowaๆ kodowanie \"%s\""
-
-#: ../hardcopy.c:2877
-msgid "Sending to printer..."
-msgstr "Przesyณam do drukarki..."
-
-#: ../hardcopy.c:2881
-msgid "E365: Failed to print PostScript file"
-msgstr "E365: Drukowanie pliku PostScript nie powiodณo si๊"
-
-#: ../hardcopy.c:2883
-msgid "Print job sent."
-msgstr "Zadanie drukowanie przesณane."
-
-#: ../if_cscope.c:85
-msgid "Add a new database"
-msgstr "Dodaj nowฑ baz๊ danych"
-
-#: ../if_cscope.c:87
-msgid "Query for a pattern"
-msgstr "Zapytane o wzorzec"
-
-#: ../if_cscope.c:89
-msgid "Show this message"
-msgstr "Pokaฟ ten komunikat"
-
-#: ../if_cscope.c:91
-msgid "Kill a connection"
-msgstr "Zabij poณฑczenie"
-
-#: ../if_cscope.c:93
-msgid "Reinit all connections"
-msgstr "Pon๓w wszelkie poณฑczenia"
-
-#: ../if_cscope.c:95
-msgid "Show connections"
-msgstr "Pokaฟ poณฑczenia"
-
-#: ../if_cscope.c:101
-#, c-format
-msgid "E560: Usage: cs[cope] %s"
-msgstr "E560: Zastosowanie: cs[cope] %s"
-
-#: ../if_cscope.c:225
-msgid "This cscope command does not support splitting the window.\n"
-msgstr "Ta komenda cscope nie wspomaga podzielenia okna.\n"
-
-#: ../if_cscope.c:266
-msgid "E562: Usage: cstag <ident>"
-msgstr "E562: Zastosowanie: cstag <ident>"
-
-#: ../if_cscope.c:313
-msgid "E257: cstag: tag not found"
-msgstr "E257: cstag: nie znaleziono znacznika"
-
-#: ../if_cscope.c:461
-#, c-format
-msgid "E563: stat(%s) error: %d"
-msgstr "E563: stat(%s) bณฑd: %d"
-
-#: ../if_cscope.c:551
-#, c-format
-msgid "E564: %s is not a directory or a valid cscope database"
-msgstr "E564: %s nie jest katalogiem lub poprawnฑ bazฑ danych cscope"
-
-#: ../if_cscope.c:566
-#, c-format
-msgid "Added cscope database %s"
-msgstr "Dodano baz๊ danych cscope %s"
-
-#: ../if_cscope.c:616
-#, c-format
-msgid "E262: error reading cscope connection %<PRId64>"
-msgstr "E262: bณฑd odczytu poณฑczenia z cscope %<PRId64>"
-
-#: ../if_cscope.c:711
-msgid "E561: unknown cscope search type"
-msgstr "E561: nieznany typ szukania cscope"
-
-#: ../if_cscope.c:752 ../if_cscope.c:789
-msgid "E566: Could not create cscope pipes"
-msgstr "E566: Nie mogณem stworzyๆ potoku do cscope"
-
-#: ../if_cscope.c:767
-msgid "E622: Could not fork for cscope"
-msgstr "E622: Nie mogณem utworzyๆ rozwidlenia dla cscope"
-
-#: ../if_cscope.c:849
-msgid "cs_create_connection setpgid failed"
-msgstr "nie powiodณo si๊ setpgid cs_create_connection"
-
-#: ../if_cscope.c:853 ../if_cscope.c:889
-msgid "cs_create_connection exec failed"
-msgstr "wykonanie cs_create_connection nie powiodณo si๊"
-
-#: ../if_cscope.c:863 ../if_cscope.c:902
-msgid "cs_create_connection: fdopen for to_fp failed"
-msgstr "cs_create_connection: fdopen dla to_fp nie powiodณo si๊"
-
-#: ../if_cscope.c:865 ../if_cscope.c:906
-msgid "cs_create_connection: fdopen for fr_fp failed"
-msgstr "cs_create_connection: fdopen dla fr_fp nie powiodณo si๊"
-
-#: ../if_cscope.c:890
-msgid "E623: Could not spawn cscope process"
-msgstr "E623: Nie mogณem stworzyๆ procesu cscope"
-
-#: ../if_cscope.c:932
-msgid "E567: no cscope connections"
-msgstr "E567: brak poณฑczenia z cscope"
-
-#: ../if_cscope.c:1009
-#, c-format
-msgid "E469: invalid cscopequickfix flag %c for %c"
-msgstr "E469: nieprawidณowa flaga cscopequickfix %c dla %c"
-
-#: ../if_cscope.c:1058
-#, c-format
-msgid "E259: no matches found for cscope query %s of %s"
-msgstr "E259: brak dopasowa๑ dla zapytania cscope %s o %s"
-
-#: ../if_cscope.c:1142
-msgid "cscope commands:\n"
-msgstr "komendy cscope:\n"
-
-#: ../if_cscope.c:1150
-#, c-format
-msgid "%-5s: %s%*s (Usage: %s)"
-msgstr "%-5s: %s%*s (Uฟycie: %s)"
-
-#: ../if_cscope.c:1155
-msgid ""
-"\n"
-" c: Find functions calling this function\n"
-" d: Find functions called by this function\n"
-" e: Find this egrep pattern\n"
-" f: Find this file\n"
-" g: Find this definition\n"
-" i: Find files #including this file\n"
-" s: Find this C symbol\n"
-" t: Find this text string\n"
-msgstr ""
-"\n"
-" c: znajdผ funkcje wywoณujฑce t๊ funkcj๊\n"
-" d: znajdผ funkcje wywoณywane przez t๊ funkcj๊\n"
-" e: znajdผ ten wzorzec egrep\n"
-" f: znajdผ ten plik\n"
-" g: znajdผ t๊ definicj๊\n"
-" i: znajdผ pliki wณฑczajฑce (#include) ten plik\n"
-" s: znajdผ ten symbol C\n"
-" t: znajdผ ten ณa๑cuch znak๓w\n"
-
-#: ../if_cscope.c:1226
-msgid "E568: duplicate cscope database not added"
-msgstr "E568: nie dodano duplikatu bazy danych cscope"
-
-#: ../if_cscope.c:1335
-#, c-format
-msgid "E261: cscope connection %s not found"
-msgstr "E261: nie ma poณฑczenia %s z cscope"
-
-#: ../if_cscope.c:1364
-#, c-format
-msgid "cscope connection %s closed"
-msgstr "poณฑczenie %s z cscope zostaณo zamkni๊te"
-
-#. should not reach here
-#: ../if_cscope.c:1486
-msgid "E570: fatal error in cs_manage_matches"
-msgstr "E570: bณฑd krytyczny w cs_manage_matches"
-
-#: ../if_cscope.c:1693
-#, c-format
-msgid "Cscope tag: %s"
-msgstr "Znacznik cscope: %s"
-
-#: ../if_cscope.c:1711
-msgid ""
-"\n"
-" # line"
-msgstr ""
-"\n"
-" # wiersz"
-
-#: ../if_cscope.c:1713
-msgid "filename / context / line\n"
-msgstr "nazwa pliku / kontekst / wiersz\n"
-
-#: ../if_cscope.c:1809
-#, c-format
-msgid "E609: Cscope error: %s"
-msgstr "E609: Bณฑd cscope: %s"
-
-#: ../if_cscope.c:2053
-msgid "All cscope databases reset"
-msgstr "Wszystkie bazy danych cscope przeณadowano"
-
-#: ../if_cscope.c:2123
-msgid "no cscope connections\n"
-msgstr "brak poณฑcze๑ z cscope\n"
-
-#: ../if_cscope.c:2126
-msgid " # pid database name prepend path\n"
-msgstr " # pid nazwa bazy danych przedsionek tropu\n"
-
-#: ../main.c:144
-msgid "Unknown option argument"
-msgstr "Nieznany argument opcji"
-
-#: ../main.c:146
-msgid "Too many edit arguments"
-msgstr "Zbyt wiele argument๓w"
-
-#: ../main.c:148
-msgid "Argument missing after"
-msgstr "Brak argumentu po"
-
-#: ../main.c:150
-msgid "Garbage after option argument"
-msgstr "ฆmiecie po argumencie opcji"
-
-#: ../main.c:152
-msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"
-msgstr ""
-"Zbyt wiele argument๓w \"+komenda\", \"-c komenda\" lub \"--cmd komenda\""
-
-#: ../main.c:154
-msgid "Invalid argument for"
-msgstr "Niewณaถciwy argument dla"
-
-#: ../main.c:294
-#, c-format
-msgid "%d files to edit\n"
-msgstr "%d plik๓w do edycji\n"
-
-#: ../main.c:1342
-msgid "Attempt to open script file again: \""
-msgstr "Pr๓ba ponownego otworzenia pliku skryptu: \""
-
-#: ../main.c:1350
-msgid "Cannot open for reading: \""
-msgstr "Nie mog๊ otworzyๆ do odczytu: \""
-
-#: ../main.c:1393
-msgid "Cannot open for script output: \""
-msgstr "Nie mog๊ otworzyๆ dla wyjถcia skryptu: \""
-
-#: ../main.c:1622
-msgid "Vim: Warning: Output is not to a terminal\n"
-msgstr "Vim: OSTRZEฏENIE: Wyjถcie nie jest terminalem\n"
-
-#: ../main.c:1624
-msgid "Vim: Warning: Input is not from a terminal\n"
-msgstr "Vim: OSTRZEฏENIE: Wejถcie nie pochodzi z terminala\n"
-
-#. just in case..
-#: ../main.c:1891
-msgid "pre-vimrc command line"
-msgstr "linia polece๑ pre-vimrc"
-
-#: ../main.c:1964
-#, c-format
-msgid "E282: Cannot read from \"%s\""
-msgstr "E282: Nie mog๊ czytaๆ z \"%s\""
-
-#: ../main.c:2149
-msgid ""
-"\n"
-"More info with: \"vim -h\"\n"
-msgstr ""
-"\n"
-"Dalsze informacje poprzez: \"vim -h\"\n"
-
-#: ../main.c:2178
-msgid "[file ..] edit specified file(s)"
-msgstr "[plik ..] edytuj zadane pliki"
-
-#: ../main.c:2179
-msgid "- read text from stdin"
-msgstr "- czytaj tekst ze stdin"
-
-#: ../main.c:2180
-msgid "-t tag edit file where tag is defined"
-msgstr "-t znacznik edytuj plik, w kt๓rym dany znacznik jest zdefiniowany"
-
-#: ../main.c:2181
-msgid "-q [errorfile] edit file with first error"
-msgstr "-q [errorfile] edytuj plik, zawierajฑcy pierwszy bณฑd"
-
-#: ../main.c:2187
-msgid ""
-"\n"
-"\n"
-"usage:"
-msgstr ""
-"\n"
-"\n"
-"uฟycie:"
-
-#: ../main.c:2189
-msgid " vim [arguments] "
-msgstr " vim [argumenty]"
-
-#: ../main.c:2193
-msgid ""
-"\n"
-" or:"
-msgstr ""
-"\n"
-" lub:"
-
-#: ../main.c:2196
-msgid ""
-"\n"
-"\n"
-"Arguments:\n"
-msgstr ""
-"\n"
-"\n"
-"Argumenty:\n"
-
-#: ../main.c:2197
-msgid "--\t\t\tOnly file names after this"
-msgstr "--\t\t\tTylko nazwy plik๓w po tym"
-
-#: ../main.c:2199
-msgid "--literal\t\tDon't expand wildcards"
-msgstr "--literal\t\tNie rozwijaj znak๓w specjalnych"
-
-#: ../main.c:2201
-msgid "-v\t\t\tVi mode (like \"vi\")"
-msgstr "-v\t\t\tTryb vi (jak \"vi\")"
-
-#: ../main.c:2202
-msgid "-e\t\t\tEx mode (like \"ex\")"
-msgstr "-e\t\t\tTryb ex (jak \"ex\")"
-
-#: ../main.c:2203
-msgid "-E\t\t\tImproved Ex mode"
-msgstr "-E\t\t\tUsprawniony tryb Ex"
-
-#: ../main.c:2204
-msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")"
-msgstr "-s\t\t\tCichy tryb (tณa) (tylko dla \"ex\")"
-
-#: ../main.c:2205
-msgid "-d\t\t\tDiff mode (like \"vimdiff\")"
-msgstr "-d\t\t\tTryb r๓ฟnic (jak \"vimdiff\")"
-
-#: ../main.c:2206
-msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
-msgstr "-y\t\t\tTryb ณatwy (jak \"evim\", bez tryb๓w)"
-
-#: ../main.c:2207
-msgid "-R\t\t\tReadonly mode (like \"view\")"
-msgstr "-R\t\t\tTryb wyณฑcznie do odczytu (jak \"view\")"
-
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tTryb ograniczenia (jak \"rvim\")"
-
-#: ../main.c:2209
-msgid "-m\t\t\tModifications (writing files) not allowed"
-msgstr "-m\t\t\tModyfikacje (zapisywanie plik๓w) niedozwolone"
-
-#: ../main.c:2210
-msgid "-M\t\t\tModifications in text not allowed"
-msgstr "-M\t\t\tZakaz modyfikacji tekstu"
-
-#: ../main.c:2211
-msgid "-b\t\t\tBinary mode"
-msgstr "-b\t\t\tTryb binarny"
-
-#: ../main.c:2212
-msgid "-l\t\t\tLisp mode"
-msgstr "-l\t\t\tTryb lisp"
-
-#: ../main.c:2213
-msgid "-C\t\t\tCompatible with Vi: 'compatible'"
-msgstr "-C\t\t\tBฑdผ zgodny z Vi: 'compatible'"
-
-#: ../main.c:2214
-msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'"
-msgstr "-N\t\t\tBฑdผ niezupeณnie zgodny z Vi: 'nocompatible'"
-
-#: ../main.c:2215
-msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]"
-msgstr "-V[N][nazwap]\t\tGadatliwy [poziom N] [zapisuj wiadomoถci do nazwap]"
-
-#: ../main.c:2216
-msgid "-D\t\t\tDebugging mode"
-msgstr "-D\t\t\tTryb odpluskwiania"
-
-#: ../main.c:2217
-msgid "-n\t\t\tNo swap file, use memory only"
-msgstr "-n\t\t\tZamiast pliku wymiany, uฟywaj tylko pami๊ci"
-
-#: ../main.c:2218
-msgid "-r\t\t\tList swap files and exit"
-msgstr "-r\t\t\tWylicz pliki wymiany i zako๑cz"
-
-#: ../main.c:2219
-msgid "-r (with file name)\tRecover crashed session"
-msgstr "-r (z nazwฑ pliku)\tOdtw๓rz zaณamanฑ sesj๊"
-
-#: ../main.c:2220
-msgid "-L\t\t\tSame as -r"
-msgstr "-L\t\t\tToฟsame z -r"
-
-#: ../main.c:2221
-msgid "-A\t\t\tstart in Arabic mode"
-msgstr "-A\t\t\trozpocznij w trybie arabskim"
-
-#: ../main.c:2222
-msgid "-H\t\t\tStart in Hebrew mode"
-msgstr "-H\t\t\trozpocznij w trybie hebrajskim"
-
-#: ../main.c:2223
-msgid "-F\t\t\tStart in Farsi mode"
-msgstr "-F\t\t\trozpocznij w trybie farsi"
-
-#: ../main.c:2224
-msgid "-T <terminal>\tSet terminal type to <terminal>"
-msgstr "-T <terminal>\tUstaw typ terminala na <terminal>"
-
-#: ../main.c:2225
-msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc"
-msgstr "-u <vimrc>\t\tUฟyj <vimrc> zamiast jakiegokolwiek .vimrc"
-
-#: ../main.c:2226
-msgid "--noplugin\t\tDon't load plugin scripts"
-msgstr "--noplugin\t\tNie ณaduj skrypt๓w wtyczek"
-
-#: ../main.c:2227
-msgid "-p[N]\t\tOpen N tab pages (default: one for each file)"
-msgstr "-p[N]\t\tOtw๓rz N kart (domyถlnie: po jednej dla kaฟdego pliku)"
-
-#: ../main.c:2228
-msgid "-o[N]\t\tOpen N windows (default: one for each file)"
-msgstr "-o[N]\t\tOtw๓rz N okien (domyถlnie: po jednym dla kaฟdego pliku)"
-
-#: ../main.c:2229
-msgid "-O[N]\t\tLike -o but split vertically"
-msgstr "-O[N]\t\ttak samo jak -o tylko dziel okno pionowo"
-
-#: ../main.c:2230
-msgid "+\t\t\tStart at end of file"
-msgstr "+\t\t\tZacznij na ko๑cu pliku"
-
-#: ../main.c:2231
-msgid "+<lnum>\t\tStart at line <lnum>"
-msgstr "+<lnum>\t\tZacznij w wierszu <lnum>"
-
-#: ../main.c:2232
-msgid "--cmd <command>\tExecute <command> before loading any vimrc file"
-msgstr ""
-"-cmd <command>\t\tWykonaj komend๊ <command> przed zaณadowaniem "
-"jakiegokolwiek pliku vimrc"
-
-#: ../main.c:2233
-msgid "-c <command>\t\tExecute <command> after loading the first file"
-msgstr ""
-"-c <command>\t\tWykonaj komend๊ <command> po zaณadowaniu pierwszego pliku"
-
-#: ../main.c:2235
-msgid "-S <session>\t\tSource file <session> after loading the first file"
-msgstr "-S <sesja>\t\tWczytaj plik <sesja> po zaณadowaniu pierwszego pliku"
-
-#: ../main.c:2236
-msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>"
-msgstr "-s <scriptin>\tWczytuj komendy trybu normalnego z pliku <scriptin>"
-
-#: ../main.c:2237
-msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>"
-msgstr ""
-"-w <scriptout>\tDoณฑcz wszystkie wprowadzane komendy do pliku <scriptout>"
-
-#: ../main.c:2238
-msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>"
-msgstr ""
-"-W <scriptout>\tZapisuj wszystkie wprowadzane komendy do pliku <scriptout>"
-
-#: ../main.c:2240
-msgid "--startuptime <file>\tWrite startup timing messages to <file>"
-msgstr ""
-"--startuptime <plik>\n"
-"Zapisz wiadomoถci o dณugoถci startu do <plik>"
-
-#: ../main.c:2242
-msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
-msgstr "-i <viminfo>\t\tUฟywaj <viminfo> zamiast .viminfo"
-
-#: ../main.c:2243
-msgid "-h or --help\tPrint Help (this message) and exit"
-msgstr "-h lub --help\twyถwietl Pomoc (czyli t๊ wiadomoถๆ) i zako๑cz"
-
-#: ../main.c:2244
-msgid "--version\t\tPrint version information and exit"
-msgstr "--version\t\twyถwietl informacj๊ o wersji i zako๑cz"
-
-#: ../mark.c:676
-msgid "No marks set"
-msgstr "Brak zakณadek"
-
-#: ../mark.c:678
-#, c-format
-msgid "E283: No marks matching \"%s\""
-msgstr "E283: ฏadna zakณadka nie pasuje do \"%s\""
-
-#. Highlight title
-#: ../mark.c:687
-msgid ""
-"\n"
-"mark line col file/text"
-msgstr ""
-"\n"
-"zakณ. wiersz kol plik/tekst"
-
-#. Highlight title
-#: ../mark.c:789
-msgid ""
-"\n"
-" jump line col file/text"
-msgstr ""
-"\n"
-" skok wiersz kol plik/tekst"
-
-#. Highlight title
-#: ../mark.c:831
-msgid ""
-"\n"
-"change line col text"
-msgstr ""
-"\n"
-"zmie๑ wrsz. kol tekst"
-
-#: ../mark.c:1238
-msgid ""
-"\n"
-"# File marks:\n"
-msgstr ""
-"\n"
-"# Zakณadki w plikach:\n"
-
-#. Write the jumplist with -'
-#: ../mark.c:1271
-msgid ""
-"\n"
-"# Jumplist (newest first):\n"
-msgstr ""
-"\n"
-"# Lista odniesie๑ (poczฑwszy od najnowszych):\n"
-
-#: ../mark.c:1352
-msgid ""
-"\n"
-"# History of marks within files (newest to oldest):\n"
-msgstr ""
-"\n"
-"# Historia zakณadek w plikach (od najnowszych po najstarsze):\n"
-
-#: ../mark.c:1431
-msgid "Missing '>'"
-msgstr "Brak '>'"
-
-#: ../memfile.c:426
-msgid "E293: block was not locked"
-msgstr "E293: blok nie byณ zablokowany"
-
-#: ../memfile.c:799
-msgid "E294: Seek error in swap file read"
-msgstr "E294: Bณฑd w trakcie czytania pliku wymiany"
-
-#: ../memfile.c:803
-msgid "E295: Read error in swap file"
-msgstr "E295: Bณฑd odczytu pliku wymiany"
-
-#: ../memfile.c:849
-msgid "E296: Seek error in swap file write"
-msgstr "E296: Bณฑd szukania w pliku wymiany"
-
-#: ../memfile.c:865
-msgid "E297: Write error in swap file"
-msgstr "E297: Bณฑd zapisu w pliku wymiany"
-
-#: ../memfile.c:1036
-msgid "E300: Swap file already exists (symlink attack?)"
-msgstr "E300: Plik wymiany juฟ istnieje (atak symlink?)"
-
-#: ../memline.c:318
-msgid "E298: Didn't get block nr 0?"
-msgstr "E298: Nie otrzymaณem bloku nr 0?"
-
-#: ../memline.c:361
-msgid "E298: Didn't get block nr 1?"
-msgstr "E298: Nie otrzymaณem bloku nr 1?"
-
-#: ../memline.c:377
-msgid "E298: Didn't get block nr 2?"
-msgstr "E298: Nie otrzymaณem bloku nr 2?"
-
-#. could not (re)open the swap file, what can we do????
-#: ../memline.c:465
-msgid "E301: Oops, lost the swap file!!!"
-msgstr "E301: Ojej, zgubiณem plik wymiany!!!"
-
-#: ../memline.c:477
-msgid "E302: Could not rename swap file"
-msgstr "E302: Nie mogณem zmieniๆ nazwy pliku wymiany"
-
-#: ../memline.c:554
-#, c-format
-msgid "E303: Unable to open swap file for \"%s\", recovery impossible"
-msgstr ""
-"E303: Nie mog๊ otworzyๆ pliku wymiany dla \"%s\"; odtworzenie niemoฟliwe"
-
-#: ../memline.c:666
-msgid "E304: ml_upd_block0(): Didn't get block 0??"
-msgstr "E304: ml_upd_block(): Nie otrzymaณem bloku 0??"
-
-#. no swap files found
-#: ../memline.c:830
-#, c-format
-msgid "E305: No swap file found for %s"
-msgstr "E305: Nie znaleziono pliku wymiany dla %s"
-
-#: ../memline.c:839
-msgid "Enter number of swap file to use (0 to quit): "
-msgstr "Wprowadผ numer pliku wymiany, kt๓rego uฟyๆ (0 by wyjถๆ): "
-
-#: ../memline.c:879
-#, c-format
-msgid "E306: Cannot open %s"
-msgstr "E306: Nie mog๊ otworzyๆ %s"
-
-#: ../memline.c:897
-msgid "Unable to read block 0 from "
-msgstr "Nie mog๊ odczytaๆ bloku 0 z "
-
-#: ../memline.c:900
-msgid ""
-"\n"
-"Maybe no changes were made or Vim did not update the swap file."
-msgstr ""
-"\n"
-"Moฟe nie wykonano zmian albo Vim nie zaktualizowaณ pliku wymiany."
-
-#: ../memline.c:909
-msgid " cannot be used with this version of Vim.\n"
-msgstr " nie moฟe byๆ stosowany z tฑ wersjฑ Vima.\n"
-
-#: ../memline.c:911
-msgid "Use Vim version 3.0.\n"
-msgstr "Uฟyj Vima w wersji 3.0.\n"
-
-#: ../memline.c:916
-#, c-format
-msgid "E307: %s does not look like a Vim swap file"
-msgstr "E307: %s nie wyglฑda na plik wymiany Vima"
-
-#: ../memline.c:922
-msgid " cannot be used on this computer.\n"
-msgstr " nie moฟe byๆ stosowany na tym komputerze.\n"
-
-#: ../memline.c:924
-msgid "The file was created on "
-msgstr "Ten plik zostaณ stworzony na "
-
-#: ../memline.c:928
-msgid ""
-",\n"
-"or the file has been damaged."
-msgstr ""
-",\n"
-"lub plik zostaณ uszkodzony."
-
-#: ../memline.c:945
-msgid " has been damaged (page size is smaller than minimum value).\n"
-msgstr ""
-" zostaณ uszkodzony (wielkoถๆ strony jest mniejsza niฟ najmniejsza wartoถๆ).\n"
-
-#: ../memline.c:974
-#, c-format
-msgid "Using swap file \"%s\""
-msgstr "Uฟywam pliku wymiany \"%s\""
-
-#: ../memline.c:980
-#, c-format
-msgid "Original file \"%s\""
-msgstr "Oryginalny plik \"%s\""
-
-#: ../memline.c:995
-msgid "E308: Warning: Original file may have been changed"
-msgstr "E308: OSTRZEฏENIE: Oryginalny plik m๓gณ byๆ zmieniony"
-
-#: ../memline.c:1061
-#, c-format
-msgid "E309: Unable to read block 1 from %s"
-msgstr "E309: Nie mog๊ odczytaๆ bloku 1 z %s"
-
-#: ../memline.c:1065
-msgid "???MANY LINES MISSING"
-msgstr "???BRAKUJE WIELU WIERSZY"
-
-#: ../memline.c:1076
-msgid "???LINE COUNT WRONG"
-msgstr "???LICZNIK WIERSZY NIEZGODNY"
-
-#: ../memline.c:1082
-msgid "???EMPTY BLOCK"
-msgstr "???PUSTY BLOK"
-
-#: ../memline.c:1103
-msgid "???LINES MISSING"
-msgstr "???BRAKUJE WIERSZY"
-
-#: ../memline.c:1128
-#, c-format
-msgid "E310: Block 1 ID wrong (%s not a .swp file?)"
-msgstr "E310: Niewณaถciwe ID bloku 1 (moฟe %s nie jest plikiem .swp?)"
-
-#: ../memline.c:1133
-msgid "???BLOCK MISSING"
-msgstr "???BRAK BLOKU"
-
-#: ../memline.c:1147
-msgid "??? from here until ???END lines may be messed up"
-msgstr "??? od tego miejsca po ???KONIEC wiersze mogฑ byๆ pomieszane"
-
-#: ../memline.c:1164
-msgid "??? from here until ???END lines may have been inserted/deleted"
-msgstr "??? od tego miejsca po ???KONIEC wiersze mogฑ byๆ wณoฟone/skasowane"
-
-#: ../memline.c:1181
-msgid "???END"
-msgstr "???KONIEC"
-
-#: ../memline.c:1238
-msgid "E311: Recovery Interrupted"
-msgstr "E311: Przerwanie odtwarzania"
-
-#: ../memline.c:1243
-msgid ""
-"E312: Errors detected while recovering; look for lines starting with ???"
-msgstr "E312: Wykryto bณ๊dy podczas odtwarzania; od kt๓rych wierszy zaczฑๆ ???"
-
-#: ../memline.c:1245
-msgid "See \":help E312\" for more information."
-msgstr "Zobacz \":help E312\" dla dalszych informacji."
-
-#: ../memline.c:1249
-msgid "Recovery completed. You should check if everything is OK."
-msgstr ""
-"Odtwarzanie zako๑czono. Powinieneถ sprawdziๆ czy wszystko jest w porzฑdku."
-
-#: ../memline.c:1251
-msgid ""
-"\n"
-"(You might want to write out this file under another name\n"
-msgstr ""
-"\n"
-"(Moฟesz chcieๆ zapisaๆ ten plik pod innฑ nazwฑ\n"
-
-#: ../memline.c:1252
-msgid "and run diff with the original file to check for changes)"
-msgstr "i wykonaๆ diff z oryginalnym plikiem aby sprawdziๆ zmiany)"
-
-#: ../memline.c:1254
-msgid "Recovery completed. Buffer contents equals file contents."
-msgstr "Odzyskiwanie zako๑czone. Zawartoถๆ bufora jest r๓wna zawartoถci pliku."
-
-#: ../memline.c:1255
-msgid ""
-"\n"
-"You may want to delete the .swp file now.\n"
-"\n"
-msgstr ""
-"\n"
-"Moฟesz teraz chcieๆ usunฑๆ plik .swp.\n"
-"\n"
-
-#. use msg() to start the scrolling properly
-#: ../memline.c:1327
-msgid "Swap files found:"
-msgstr "Znalezione pliki wymiany:"
-
-#: ../memline.c:1446
-msgid " In current directory:\n"
-msgstr " W bieฟฑcym katalogu:\n"
-
-#: ../memline.c:1448
-msgid " Using specified name:\n"
-msgstr " Uฟywam podanej nazwy:\n"
-
-#: ../memline.c:1450
-msgid " In directory "
-msgstr " W katalogu "
-
-#: ../memline.c:1465
-msgid " -- none --\n"
-msgstr " -- ฟaden --\n"
-
-#: ../memline.c:1527
-msgid " owned by: "
-msgstr " posiadany przez: "
-
-#: ../memline.c:1529
-msgid " dated: "
-msgstr " data: "
-
-#: ../memline.c:1532 ../memline.c:3231
-msgid " dated: "
-msgstr " data: "
-
-#: ../memline.c:1548
-msgid " [from Vim version 3.0]"
-msgstr " [po Vimie wersja 3.0]"
-
-#: ../memline.c:1550
-msgid " [does not look like a Vim swap file]"
-msgstr " [nie wyglฑda na plik wymiany Vima]"
-
-#: ../memline.c:1552
-msgid " file name: "
-msgstr " nazwa pliku: "
-
-#: ../memline.c:1558
-msgid ""
-"\n"
-" modified: "
-msgstr ""
-"\n"
-" zmieniono: "
-
-#: ../memline.c:1559
-msgid "YES"
-msgstr "TAK"
-
-#: ../memline.c:1559
-msgid "no"
-msgstr "nie"
-
-#: ../memline.c:1562
-msgid ""
-"\n"
-" user name: "
-msgstr ""
-"\n"
-" uฟytkownik: "
-
-#: ../memline.c:1568
-msgid " host name: "
-msgstr " nazwa hosta: "
-
-#: ../memline.c:1570
-msgid ""
-"\n"
-" host name: "
-msgstr ""
-"\n"
-" nazwa hosta: "
-
-#: ../memline.c:1575
-msgid ""
-"\n"
-" process ID: "
-msgstr ""
-"\n"
-" ID procesu: "
-
-#: ../memline.c:1579
-msgid " (still running)"
-msgstr " (dalej dziaณa)"
-
-#: ../memline.c:1586
-msgid ""
-"\n"
-" [not usable on this computer]"
-msgstr ""
-"\n"
-" [nie do uฟytku na tym komputerze]"
-
-#: ../memline.c:1590
-msgid " [cannot be read]"
-msgstr " [nieodczytywalny]"
-
-#: ../memline.c:1593
-msgid " [cannot be opened]"
-msgstr " [nieotwieralny]"
-
-#: ../memline.c:1698
-msgid "E313: Cannot preserve, there is no swap file"
-msgstr "E313: Nie mog๊ zabezpieczyๆ, bo brak pliku wymiany"
-
-#: ../memline.c:1747
-msgid "File preserved"
-msgstr "Plik zabezpieczono"
-
-#: ../memline.c:1749
-msgid "E314: Preserve failed"
-msgstr "E314: Nieudane zabezpieczenie"
-
-#: ../memline.c:1819
-#, c-format
-msgid "E315: ml_get: invalid lnum: %<PRId64>"
-msgstr "E315: ml_get: niewณaถciwy lnum: %<PRId64>"
-
-#: ../memline.c:1851
-#, c-format
-msgid "E316: ml_get: cannot find line %<PRId64>"
-msgstr "E316: ml_get: nie znaleziono wiersza %<PRId64>"
-
-#: ../memline.c:2236
-msgid "E317: pointer block id wrong 3"
-msgstr "E317: niepoprawne id wskaผnika bloku 3"
-
-#: ../memline.c:2311
-msgid "stack_idx should be 0"
-msgstr "stack_idx powinien byๆ 0"
-
-#: ../memline.c:2369
-msgid "E318: Updated too many blocks?"
-msgstr "E318: Zaktualizowano zbyt wiele blok๓w?"
-
-#: ../memline.c:2511
-msgid "E317: pointer block id wrong 4"
-msgstr "E317: niepoprawne id wskaผnika bloku 4"
-
-#: ../memline.c:2536
-msgid "deleted block 1?"
-msgstr "blok nr 1 skasowany?"
-
-#: ../memline.c:2707
-#, c-format
-msgid "E320: Cannot find line %<PRId64>"
-msgstr "E320: Nie mog๊ znaleผๆ wiersza %<PRId64>"
-
-#: ../memline.c:2916
-msgid "E317: pointer block id wrong"
-msgstr "E317: niepoprawne id bloku odniesienia"
-
-#: ../memline.c:2930
-msgid "pe_line_count is zero"
-msgstr "pe_line_count wynosi zero"
-
-#: ../memline.c:2955
-#, c-format
-msgid "E322: line number out of range: %<PRId64> past the end"
-msgstr "E322: numer wiersza poza zakresem: %<PRId64> jest poza ko๑cem"
-
-#: ../memline.c:2959
-#, c-format
-msgid "E323: line count wrong in block %<PRId64>"
-msgstr "E323: liczba wierszy niepoprawna w bloku %<PRId64>"
-
-#: ../memline.c:2999
-msgid "Stack size increases"
-msgstr "Wielkoถๆ stosu wzrasta"
-
-#: ../memline.c:3038
-msgid "E317: pointer block id wrong 2"
-msgstr "E317: niepoprawne id bloku odniesienia 2"
-
-#: ../memline.c:3070
-#, c-format
-msgid "E773: Symlink loop for \"%s\""
-msgstr "E773: P๊tla dowiฑza๑ dla \"%s\""
-
-#: ../memline.c:3221
-msgid "E325: ATTENTION"
-msgstr "E325: UWAGA"
-
-#: ../memline.c:3222
-msgid ""
-"\n"
-"Found a swap file by the name \""
-msgstr ""
-"\n"
-"Znalazณem plik wymiany o nazwie \""
-
-#: ../memline.c:3226
-msgid "While opening file \""
-msgstr "Podczas otwierania pliku \""
-
-#: ../memline.c:3239
-msgid " NEWER than swap file!\n"
-msgstr " NOWSZE od pliku wymiany!\n"
-
-#: ../memline.c:3244
-#, fuzzy
-msgid ""
-"\n"
-"(1) Another program may be editing the same file. If this is the case,\n"
-" be careful not to end up with two different instances of the same\n"
-" file when making changes."
-msgstr ""
-"\n"
-"(1) Pewnie inny program obrabia ten sam plik.\n"
-" Jeถli tak, bฑdผ ostroฟny, aby nie sko๑czyๆ z dwoma\n"
-" r๓ฟnymi wersjami tego samego pliku po zmianach.\n"
-
-#: ../memline.c:3245
-msgid " Quit, or continue with caution.\n"
-msgstr " Zako๑cz lub ostroฟnie kontynuuj.\n"
-
-#: ../memline.c:3246
-msgid "(2) An edit session for this file crashed.\n"
-msgstr "(2) Sesja edycji dla pliku zaณamaณa si๊.\n"
-
-#: ../memline.c:3247
-msgid " If this is the case, use \":recover\" or \"vim -r "
-msgstr " Jeถli tak, to uฟyj \":recover\" lub \"vim -r "
-
-#: ../memline.c:3249
-msgid ""
-"\"\n"
-" to recover the changes (see \":help recovery\").\n"
-msgstr ""
-"\"\n"
-" aby odzyskaๆ zmiany (zobacz \":help recovery)\").\n"
-
-#: ../memline.c:3250
-msgid " If you did this already, delete the swap file \""
-msgstr " Jeถli juฟ to zrobiณeถ, usu๑ plik wymiany \""
-
-#: ../memline.c:3252
-msgid ""
-"\"\n"
-" to avoid this message.\n"
-msgstr ""
-"\"\n"
-" aby uniknฑๆ tej wiadomoถci.\n"
-
-#: ../memline.c:3450 ../memline.c:3452
-msgid "Swap file \""
-msgstr "Plik wymiany \""
-
-#: ../memline.c:3451 ../memline.c:3455
-msgid "\" already exists!"
-msgstr "\" juฟ istnieje!"
-
-#: ../memline.c:3457
-msgid "VIM - ATTENTION"
-msgstr "VIM - UWAGA"
-
-#: ../memline.c:3459
-msgid "Swap file already exists!"
-msgstr "Plik wymiany juฟ istnieje!"
-
-#: ../memline.c:3464
-msgid ""
-"&Open Read-Only\n"
-"&Edit anyway\n"
-"&Recover\n"
-"&Quit\n"
-"&Abort"
-msgstr ""
-"&Otw๓rz Read-Only\n"
-"&Edytuj pomimo\n"
-"O&dtw๓rz\n"
-"&Zako๑cz\n"
-"&Porzuๆ"
-
-#: ../memline.c:3467
-msgid ""
-"&Open Read-Only\n"
-"&Edit anyway\n"
-"&Recover\n"
-"&Delete it\n"
-"&Quit\n"
-"&Abort"
-msgstr ""
-"&Otw๓rz Read-Only\n"
-"&Edytuj pomimo\n"
-"O&dtw๓rz\n"
-"&Usu๑\n"
-"&Zako๑cz\n"
-"&Porzuๆ"
-
-#.
-#. * Change the ".swp" extension to find another file that can be used.
-#. * First decrement the last char: ".swo", ".swn", etc.
-#. * If that still isn't enough decrement the last but one char: ".svz"
-#. * Can happen when editing many "No Name" buffers.
-#.
-#. ".s?a"
-#. ".saa": tried enough, give up
-#: ../memline.c:3528
-msgid "E326: Too many swap files found"
-msgstr "E326: Znaleziono zbyt wiele plik๓w wymiany"
-
-#: ../memory.c:227
-#, c-format
-msgid "E342: Out of memory! (allocating %<PRIu64> bytes)"
-msgstr "E342: Brak pami๊ci! (rezerwacja %<PRIu64> bajt๓w)"
-
-#: ../menu.c:62
-msgid "E327: Part of menu-item path is not sub-menu"
-msgstr "E327: Cz๊ถๆ tropu punktu menu nie okreถla podmenu"
-
-#: ../menu.c:63
-msgid "E328: Menu only exists in another mode"
-msgstr "E328: Menu istnieje tylko w innym trybie"
-
-#: ../menu.c:64
-#, c-format
-msgid "E329: No menu \"%s\""
-msgstr "E329: Nie ma menu \"%s\""
-
-#. Only a mnemonic or accelerator is not valid.
-#: ../menu.c:329
-msgid "E792: Empty menu name"
-msgstr "E792: Pusta nazwa menu"
-
-#: ../menu.c:340
-msgid "E330: Menu path must not lead to a sub-menu"
-msgstr "E330: Trop menu nie moฟe prowadziๆ do podmenu"
-
-#: ../menu.c:365
-msgid "E331: Must not add menu items directly to menu bar"
-msgstr "E331: Nie wolno dodawaๆ punkt๓w menu wprost do paska menu"
-
-#: ../menu.c:370
-msgid "E332: Separator cannot be part of a menu path"
-msgstr "E332: Separator nie moฟe byๆ cz๊ถciฑ tropu menu"
-
-#. Now we have found the matching menu, and we list the mappings
-#. Highlight title
-#: ../menu.c:762
-msgid ""
-"\n"
-"--- Menus ---"
-msgstr ""
-"\n"
-"--- Menu ---"
-
-#: ../menu.c:1313
-msgid "E333: Menu path must lead to a menu item"
-msgstr "E333: Trop menu musi prowadziๆ do punktu menu"
-
-#: ../menu.c:1330
-#, c-format
-msgid "E334: Menu not found: %s"
-msgstr "E334: Nie znaleziono menu: %s"
-
-#: ../menu.c:1396
-#, c-format
-msgid "E335: Menu not defined for %s mode"
-msgstr "E335: Menu nie jest zdefiniowane dla trybu %s"
-
-#: ../menu.c:1426
-msgid "E336: Menu path must lead to a sub-menu"
-msgstr "E336: Trop menu musi prowadziๆ do podmenu"
-
-#: ../menu.c:1447
-msgid "E337: Menu not found - check menu names"
-msgstr "E337: Nie znaleziono menu - sprawdผ nazwy menu"
-
-#: ../message.c:423
-#, c-format
-msgid "Error detected while processing %s:"
-msgstr "Wykryto bณฑd podczas przetwarzania %s:"
-
-#: ../message.c:445
-#, c-format
-msgid "line %4ld:"
-msgstr "wiersz %4ld:"
-
-#: ../message.c:617
-#, c-format
-msgid "E354: Invalid register name: '%s'"
-msgstr "E354: Niewณaถciwa nazwa rejestru: '%s'"
-
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr "Opiekun komunikat๓w: Mikoณaj Machowski <mikmach@wp.pl>"
-
-#: ../message.c:986
-msgid "Interrupt: "
-msgstr "Przerwanie: "
-
-#: ../message.c:988
-msgid "Press ENTER or type command to continue"
-msgstr "Naciถnij ENTER lub wprowadผ komend๊ aby kontynuowaๆ"
-
-#: ../message.c:1843
-#, c-format
-msgid "%s line %<PRId64>"
-msgstr "%s wiersz %<PRId64>"
-
-#: ../message.c:2392
-msgid "-- More --"
-msgstr "-- Wi๊cej --"
-
-#: ../message.c:2398
-msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "
-msgstr " SPACE/d/j: ekran/strona/wiersz w d๓ณ, b/u/k: do g๓ry, q: zako๑cz"
-
-#: ../message.c:3021 ../message.c:3031
-msgid "Question"
-msgstr "Pytanie"
-
-#: ../message.c:3023
-msgid ""
-"&Yes\n"
-"&No"
-msgstr ""
-"&Tak\n"
-"&Nie"
-
-#: ../message.c:3033
-msgid ""
-"&Yes\n"
-"&No\n"
-"&Cancel"
-msgstr ""
-"&Tak\n"
-"&Nie\n"
-"&Zako๑cz"
-
-#: ../message.c:3045
-msgid ""
-"&Yes\n"
-"&No\n"
-"Save &All\n"
-"&Discard All\n"
-"&Cancel"
-msgstr ""
-"&Tak\n"
-"&Nie\n"
-"Zapisz &wszystkie\n"
-"&Odrzuๆ wszystkie\n"
-"&Zako๑cz"
-
-#: ../message.c:3058
-msgid "E766: Insufficient arguments for printf()"
-msgstr "E766: Za maณo argument๓w dla printf()"
-
-#: ../message.c:3119
-msgid "E807: Expected Float argument for printf()"
-msgstr "E807: Spodziewany argument Zmiennoprzecinkowy w printf()"
-
-#: ../message.c:3873
-msgid "E767: Too many arguments to printf()"
-msgstr "E767: Za duฟo argument๓w dla printf()"
-
-#: ../misc1.c:2256
-msgid "W10: Warning: Changing a readonly file"
-msgstr "W10: OSTRZEฏENIE: Zmiany w pliku tylko do odczytu"
-
-#: ../misc1.c:2537
-msgid "Type number and <Enter> or click with mouse (empty cancels): "
-msgstr "Wpisz numer i <Enter> lub wybierz myszฑ (pusta wartoถๆ anuluje): "
-
-#: ../misc1.c:2539
-msgid "Type number and <Enter> (empty cancels): "
-msgstr "Wpisz numer i <Enter> (puste anuluje): "
-
-#: ../misc1.c:2585
-msgid "1 more line"
-msgstr "1 wiersz wi๊cej"
-
-#: ../misc1.c:2588
-msgid "1 line less"
-msgstr "1 wiersz mniej"
-
-#: ../misc1.c:2593
-#, c-format
-msgid "%<PRId64> more lines"
-msgstr "dodano %<PRId64> wierszy"
-
-#: ../misc1.c:2596
-#, c-format
-msgid "%<PRId64> fewer lines"
-msgstr "usuni๊to %<PRId64> wierszy"
-
-#: ../misc1.c:2599
-msgid " (Interrupted)"
-msgstr " (Przerwane)"
-
-#: ../misc1.c:2635
-msgid "Beep!"
-msgstr "Biiip!"
-
-#: ../misc2.c:738
-#, c-format
-msgid "Calling shell to execute: \"%s\""
-msgstr "Wywoณuj๊ powณok๊ do wykonania: \"%s\""
-
-#: ../normal.c:183
-msgid "E349: No identifier under cursor"
-msgstr "E349: Brak identyfikatora pod kursorem"
-
-#: ../normal.c:1866
-msgid "E774: 'operatorfunc' is empty"
-msgstr "E774: 'operatorfunc' jest pusta"
-
-#: ../normal.c:2637
-msgid "Warning: terminal cannot highlight"
-msgstr "OSTRZEฏENIE: terminal nie wykonuje podถwietlania"
-
-#: ../normal.c:2807
-msgid "E348: No string under cursor"
-msgstr "E348: Brak ciฑgu pod kursorem"
-
-#: ../normal.c:3937
-msgid "E352: Cannot erase folds with current 'foldmethod'"
-msgstr "E352: Nie mog๊ skasowaๆ zwini๊cia z bieฟฑcฑ 'foldmethod'"
-
-#: ../normal.c:5897
-msgid "E664: changelist is empty"
-msgstr "E664: lista zmian (changelist) jest pusta"
-
-#: ../normal.c:5899
-msgid "E662: At start of changelist"
-msgstr "E662: Na poczฑtku listy zmian"
-
-#: ../normal.c:5901
-msgid "E663: At end of changelist"
-msgstr "E663: Na ko๑cu listy zmian"
-
-#: ../normal.c:7053
-msgid "Type :quit<Enter> to exit Nvim"
-msgstr "wprowadผ :quit<Enter> zako๑czenie programu"
-
-#: ../ops.c:248
-#, c-format
-msgid "1 line %sed 1 time"
-msgstr "1 wiersz %sed 1 raz"
-
-#: ../ops.c:250
-#, c-format
-msgid "1 line %sed %d times"
-msgstr "1 wiersz %sed %d razy"
-
-#: ../ops.c:253
-#, c-format
-msgid "%<PRId64> lines %sed 1 time"
-msgstr "%<PRId64> wierszy %sed 1 raz"
-
-#: ../ops.c:256
-#, c-format
-msgid "%<PRId64> lines %sed %d times"
-msgstr "%<PRId64> wierszy %sed %d razy"
-
-#: ../ops.c:592
-#, c-format
-msgid "%<PRId64> lines to indent... "
-msgstr "%<PRId64> wierszy do wci๊cia... "
-
-#: ../ops.c:634
-msgid "1 line indented "
-msgstr "1 wiersz wci๊ty "
-
-#: ../ops.c:636
-#, c-format
-msgid "%<PRId64> lines indented "
-msgstr "%<PRId64> wierszy wci๊tych "
-
-#: ../ops.c:938
-msgid "E748: No previously used register"
-msgstr "E748: Brak poprzednio uฟytego rejestru"
-
-#. must display the prompt
-#: ../ops.c:1433
-msgid "cannot yank; delete anyway"
-msgstr "nie mog๊ skopiowaๆ, mimo to kasuj๊"
-
-#: ../ops.c:1929
-msgid "1 line changed"
-msgstr "1 wiersz zmieniono"
-
-#: ../ops.c:1931
-#, c-format
-msgid "%<PRId64> lines changed"
-msgstr "%<PRId64> wierszy zmieniono"
-
-#: ../ops.c:2521
-msgid "block of 1 line yanked"
-msgstr "skopiowano blok 1 wiersza"
-
-#: ../ops.c:2523
-msgid "1 line yanked"
-msgstr "1 wiersz skopiowano"
-
-#: ../ops.c:2525
-#, c-format
-msgid "block of %<PRId64> lines yanked"
-msgstr "%<PRId64> wierszy skopiowanych"
-
-#: ../ops.c:2528
-#, c-format
-msgid "%<PRId64> lines yanked"
-msgstr "%<PRId64> wierszy skopiowanych"
-
-#: ../ops.c:2710
-#, c-format
-msgid "E353: Nothing in register %s"
-msgstr "E353: Pusty rejestr %s"
-
-#. Highlight title
-#: ../ops.c:3185
-msgid ""
-"\n"
-"--- Registers ---"
-msgstr ""
-"\n"
-"--- Rejestry ---"
-
-#: ../ops.c:4455
-msgid "Illegal register name"
-msgstr "Niedozwolona nazwa rejestru"
-
-#: ../ops.c:4533
-msgid ""
-"\n"
-"# Registers:\n"
-msgstr ""
-"\n"
-"# Rejestry:\n"
-
-#: ../ops.c:4575
-#, c-format
-msgid "E574: Unknown register type %d"
-msgstr "E574: Nieznany typ rejestru %d"
-
-#: ../ops.c:5089
-#, c-format
-msgid "%<PRId64> Cols; "
-msgstr "%<PRId64> Kolumn; "
-
-#: ../ops.c:5097
-#, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Bytes"
-msgstr ""
-"Wybrano %s%<PRId64> z %<PRId64> Wierszy; %<PRId64> z %<PRId64> Sณ๓w; "
-"%<PRId64> z %<PRId64> Bajt๓w"
-
-#: ../ops.c:5105
-#, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Chars; %<PRId64> of %<PRId64> Bytes"
-msgstr ""
-"Wybrano %s%<PRId64> z %<PRId64> Wierszy; %<PRId64> z %<PRId64> Sณ๓w; "
-"%<PRId64> z %<PRId64> Znak๓w; %<PRId64> z %<PRId64> Bajt๓w"
-
-#: ../ops.c:5123
-#, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Byte "
-"%<PRId64> of %<PRId64>"
-msgstr ""
-"Kol %s z %s; Wiersz %<PRId64> z %<PRId64>; Sณowo %<PRId64> z %<PRId64>; Bajt "
-"%<PRId64> z %<PRId64>"
-
-#: ../ops.c:5133
-#, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Char "
-"%<PRId64> of %<PRId64>; Byte %<PRId64> of %<PRId64>"
-msgstr ""
-"Kol %s z %s; Wiersz %<PRId64> z %<PRId64>; Sณowo %<PRId64> z %<PRId64>; Znak "
-"%<PRId64> z %<PRId64>; Bajt %<PRId64> z %<PRId64>"
-
-#: ../ops.c:5146
-#, c-format
-msgid "(+%<PRId64> for BOM)"
-msgstr "(+%<PRId64> dla BOM)"
-
-#: ../option.c:1238
-msgid "%<%f%h%m%=Page %N"
-msgstr "%<%f%h%m%=Strona %N"
-
-#: ../option.c:1574
-msgid "Thanks for flying Vim"
-msgstr "Dzi๊ki za lot Vimem"
-
-#. found a mismatch: skip
-#: ../option.c:2698
-msgid "E518: Unknown option"
-msgstr "E518: Nieznana opcja"
-
-#: ../option.c:2709
-msgid "E519: Option not supported"
-msgstr "E519: Opcja nie jest wspomagana"
-
-#: ../option.c:2740
-msgid "E520: Not allowed in a modeline"
-msgstr "E520: Niedozwolone w modeline"
-
-#: ../option.c:2815
-msgid "E846: Key code not set"
-msgstr "E846: Kod klucza nie jest ustawiony"
-
-#: ../option.c:2924
-msgid "E521: Number required after ="
-msgstr "E521: Po = wymagany jest numer"
-
-#: ../option.c:3226 ../option.c:3864
-msgid "E522: Not found in termcap"
-msgstr "E522: Nie znaleziono w termcap"
-
-#: ../option.c:3335
-#, c-format
-msgid "E539: Illegal character <%s>"
-msgstr "E539: Niedozwolony znak <%s>"
-
-#: ../option.c:3862
-msgid "E529: Cannot set 'term' to empty string"
-msgstr "E529: Nie mog๊ ustawiๆ 'term' na pusty ciฑg"
-
-#: ../option.c:3885
-msgid "E589: 'backupext' and 'patchmode' are equal"
-msgstr "E589: 'backupext' i 'patchmode' sฑ toฟsame"
-
-#: ../option.c:3964
-msgid "E834: Conflicts with value of 'listchars'"
-msgstr "E834: Konflikty wartoถci 'listchars'"
-
-#: ../option.c:3966
-msgid "E835: Conflicts with value of 'fillchars'"
-msgstr "E835: Konflikty wartoถci 'fillchars'"
-
-#: ../option.c:4163
-msgid "E524: Missing colon"
-msgstr "E524: Brak dwukropka"
-
-#: ../option.c:4165
-msgid "E525: Zero length string"
-msgstr "E525: Ciฑg o zerowej dณugoถci"
-
-#: ../option.c:4220
-#, c-format
-msgid "E526: Missing number after <%s>"
-msgstr "E526: Brak numeru po <%s>"
-
-#: ../option.c:4232
-msgid "E527: Missing comma"
-msgstr "E527: Brak przecinka"
-
-#: ../option.c:4239
-msgid "E528: Must specify a ' value"
-msgstr "E528: Musi okreถlaๆ wartoถๆ '"
-
-#: ../option.c:4271
-msgid "E595: contains unprintable or wide character"
-msgstr "E595: zawiera niewyถwietlalny lub szeroki znak"
-
-#: ../option.c:4469
-#, c-format
-msgid "E535: Illegal character after <%c>"
-msgstr "E535: Niedozwolony znak po <%c>"
-
-#: ../option.c:4534
-msgid "E536: comma required"
-msgstr "E536: wymagany przecinek"
-
-#: ../option.c:4543
-#, c-format
-msgid "E537: 'commentstring' must be empty or contain %s"
-msgstr "E537: 'commentstring' musi byๆ pusty lub zawieraๆ %s"
-
-#: ../option.c:4928
-msgid "E540: Unclosed expression sequence"
-msgstr "E540: Niedomkni๊ty ciฑg wyraฟe๑"
-
-#: ../option.c:4932
-msgid "E541: too many items"
-msgstr "E541: zbyt wiele element๓w"
-
-#: ../option.c:4934
-msgid "E542: unbalanced groups"
-msgstr "E542: niezbalansowane grupy"
-
-#: ../option.c:5148
-msgid "E590: A preview window already exists"
-msgstr "E590: okno podglฑdu juฟ istnieje"
-
-#: ../option.c:5311
-msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'"
-msgstr "W17: Arabski wymaga UTF-8, zr๓b ':set encoding=utf-8'"
-
-#: ../option.c:5623
-#, c-format
-msgid "E593: Need at least %d lines"
-msgstr "E593: Potrzebuj๊ przynajmniej %d wierszy"
-
-#: ../option.c:5631
-#, c-format
-msgid "E594: Need at least %d columns"
-msgstr "E594: Potrzebuj๊ przynajmniej %d kolumn"
-
-#: ../option.c:6011
-#, c-format
-msgid "E355: Unknown option: %s"
-msgstr "E355: Nieznana opcja: %s"
-
-#. There's another character after zeros or the string
-#. * is empty. In both cases, we are trying to set a
-#. * num option using a string.
-#: ../option.c:6037
-#, c-format
-msgid "E521: Number required: &%s = '%s'"
-msgstr "E521: Wymagana Liczba: &%s = '%s'"
-
-#: ../option.c:6149
-msgid ""
-"\n"
-"--- Terminal codes ---"
-msgstr ""
-"\n"
-"--- Kody terminala ---"
-
-#: ../option.c:6151
-msgid ""
-"\n"
-"--- Global option values ---"
-msgstr ""
-"\n"
-"--- Globalne wartoถci opcji ---"
-
-#: ../option.c:6153
-msgid ""
-"\n"
-"--- Local option values ---"
-msgstr ""
-"\n"
-"--- Lokalne wartoถci opcji ---"
-
-#: ../option.c:6155
-msgid ""
-"\n"
-"--- Options ---"
-msgstr ""
-"\n"
-"--- Opcje ---"
-
-#: ../option.c:6816
-msgid "E356: get_varp ERROR"
-msgstr "E356: BฃกD get_varp"
-
-#: ../option.c:7696
-#, c-format
-msgid "E357: 'langmap': Matching character missing for %s"
-msgstr "E357: 'langmap': Brak pasujฑcego znaku dla %s"
-
-#: ../option.c:7715
-#, c-format
-msgid "E358: 'langmap': Extra characters after semicolon: %s"
-msgstr "E358: 'langmap': Dodatkowe znaki po ถredniku: %s"
-
-#: ../os/shell.c:194
-msgid ""
-"\n"
-"Cannot execute shell "
-msgstr ""
-"\n"
-"Nie mog๊ wykonaๆ powณoki "
-
-#: ../os/shell.c:439
-msgid ""
-"\n"
-"shell returned "
-msgstr ""
-"\n"
-"powณoka zwr๓ciณa "
-
-#: ../os_unix.c:465 ../os_unix.c:471
-msgid ""
-"\n"
-"Could not get security context for "
-msgstr ""
-"\n"
-"Nie mog๊ uzyskaๆ kontekstu bezpiecze๑stwa dla"
-
-#: ../os_unix.c:479
-msgid ""
-"\n"
-"Could not set security context for "
-msgstr ""
-"\n"
-"Nie moฟna uzyskaๆ kontekstu bezpiecze๑stwa dla"
-
-#: ../os_unix.c:1558 ../os_unix.c:1647
-#, c-format
-msgid "dlerror = \"%s\""
-msgstr "dlerror = \"%s\""
-
-#: ../path.c:1449
-#, c-format
-msgid "E447: Can't find file \"%s\" in path"
-msgstr "E447: Nie mog๊ znaleผๆ pliku \"%s\" w tropie"
-
-#: ../quickfix.c:359
-#, c-format
-msgid "E372: Too many %%%c in format string"
-msgstr "E372: Zbyt wiele %%%c w ciฑgu formatujฑcym"
-
-#: ../quickfix.c:371
-#, c-format
-msgid "E373: Unexpected %%%c in format string"
-msgstr "E373: Nieoczekiwane %%%c w ciฑgu formatujฑcym"
-
-#: ../quickfix.c:420
-msgid "E374: Missing ] in format string"
-msgstr "E374: Brak ] w ciฑgu formatujฑcym"
-
-#: ../quickfix.c:431
-#, c-format
-msgid "E375: Unsupported %%%c in format string"
-msgstr "E375: Niewspomagane %%%c w ciฑgu formatujฑcym"
-
-#: ../quickfix.c:448
-#, c-format
-msgid "E376: Invalid %%%c in format string prefix"
-msgstr "E376: Niepoprawne %%%c w prefiksie ciฑgu formatujฑcego"
-
-#: ../quickfix.c:454
-#, c-format
-msgid "E377: Invalid %%%c in format string"
-msgstr "E377: Niepoprawne %%%c w ciฑgu formatujฑcym"
-
-#. nothing found
-#: ../quickfix.c:477
-msgid "E378: 'errorformat' contains no pattern"
-msgstr "E378: 'errorformat' nie zawiera wzorca"
-
-#: ../quickfix.c:695
-msgid "E379: Missing or empty directory name"
-msgstr "E379: Pusta nazwa katalogu lub jej brak"
-
-#: ../quickfix.c:1305
-msgid "E553: No more items"
-msgstr "E553: Nie ma wi๊cej element๓w"
-
-#: ../quickfix.c:1674
-#, c-format
-msgid "(%d of %d)%s%s: "
-msgstr "(%d z %d)%s%s: "
-
-#: ../quickfix.c:1676
-msgid " (line deleted)"
-msgstr " (wiersz skasowany)"
-
-#: ../quickfix.c:1863
-msgid "E380: At bottom of quickfix stack"
-msgstr "E380: Na dole stosu quickfix"
-
-#: ../quickfix.c:1869
-msgid "E381: At top of quickfix stack"
-msgstr "E381: Na g๓rze stosu quickfix"
-
-#: ../quickfix.c:1880
-#, c-format
-msgid "error list %d of %d; %d errors"
-msgstr "lista bณ๊d๓w %d z %d; %d bณ๊d๓w"
-
-#: ../quickfix.c:2427
-msgid "E382: Cannot write, 'buftype' option is set"
-msgstr "E382: Nie mog๊ zapisaๆ, opcja 'buftype' jest ustawiona"
-
-#: ../quickfix.c:2812
-msgid "E683: File name missing or invalid pattern"
-msgstr "E683: Brak nazwy pliku lub niewณaถciwa ถcieฟka"
-
-#: ../quickfix.c:2911
-#, c-format
-msgid "Cannot open file \"%s\""
-msgstr "Nie mog๊ otworzyๆ pliku \"%s\""
-
-#: ../quickfix.c:3429
-msgid "E681: Buffer is not loaded"
-msgstr "E681: Bufor nie jest zaณadowany"
-
-#: ../quickfix.c:3487
-msgid "E777: String or List expected"
-msgstr "E777: Oczekiwaณem na ณa๑cuch lub list๊"
-
-#: ../regexp.c:359
-#, c-format
-msgid "E369: invalid item in %s%%[]"
-msgstr "E369: Niewณaถciwy element w %s%%[]"
-
-#: ../regexp.c:374
-#, c-format
-msgid "E769: Missing ] after %s["
-msgstr "E769: Brak ] po %s["
-
-#: ../regexp.c:375
-#, c-format
-msgid "E53: Unmatched %s%%("
-msgstr "E53: Niesparowany %s%%("
-
-#: ../regexp.c:376
-#, c-format
-msgid "E54: Unmatched %s("
-msgstr "E54: Niesparowany %s("
-
-#: ../regexp.c:377
-#, c-format
-msgid "E55: Unmatched %s)"
-msgstr "E55: Niesparowany %s)"
-
-#: ../regexp.c:378
-msgid "E66: \\z( not allowed here"
-msgstr "E66: \\z( jest niedozwolone w tym miejscu"
-
-#: ../regexp.c:379
-msgid "E67: \\z1 et al. not allowed here"
-msgstr "E67: \\z1 i podobne sฑ niedozwolone w tym miejscu"
-
-#: ../regexp.c:380
-#, c-format
-msgid "E69: Missing ] after %s%%["
-msgstr "E69: Brak ] po %s%%["
-
-#: ../regexp.c:381
-#, c-format
-msgid "E70: Empty %s%%[]"
-msgstr "E70: Pusty %s%%[]"
-
-#: ../regexp.c:1209 ../regexp.c:1224
-msgid "E339: Pattern too long"
-msgstr "E339: Zbyt dณugi wzorzec"
-
-#: ../regexp.c:1371
-msgid "E50: Too many \\z("
-msgstr "E50: Zbyt wiele \\z("
-
-#: ../regexp.c:1378
-#, c-format
-msgid "E51: Too many %s("
-msgstr "E51: Zbyt wiele %s("
-
-#: ../regexp.c:1427
-msgid "E52: Unmatched \\z("
-msgstr "E52: Niesparowany \\z("
-
-#: ../regexp.c:1637
-#, c-format
-msgid "E59: invalid character after %s@"
-msgstr "E59: niedozwolony znak po %s@"
-
-#: ../regexp.c:1672
-#, c-format
-msgid "E60: Too many complex %s{...}s"
-msgstr "E60: Zbyt wiele zณoฟonych %s{...}"
-
-#: ../regexp.c:1687
-#, c-format
-msgid "E61: Nested %s*"
-msgstr "E61: Zagnieฟdฟone %s*"
-
-#: ../regexp.c:1690
-#, c-format
-msgid "E62: Nested %s%c"
-msgstr "E62: Zagnieฟdฟone %s%c"
-
-#: ../regexp.c:1800
-msgid "E63: invalid use of \\_"
-msgstr "E63: Niedozwolone uฟycie \\_"
-
-#: ../regexp.c:1850
-#, c-format
-msgid "E64: %s%c follows nothing"
-msgstr "E64: %s%c po niczym"
-
-#: ../regexp.c:1902
-msgid "E65: Illegal back reference"
-msgstr "E65: Niewณaถciwe odwoณanie wsteczne"
-
-#: ../regexp.c:1943
-msgid "E68: Invalid character after \\z"
-msgstr "E68: niedopuszczalny znak po \\z"
-
-#: ../regexp.c:2049 ../regexp_nfa.c:1296
-#, c-format
-msgid "E678: Invalid character after %s%%[dxouU]"
-msgstr "E678: Niedozwolony znak po %s%%[dxouU]"
-
-#: ../regexp.c:2107
-#, c-format
-msgid "E71: Invalid character after %s%%"
-msgstr "E71: Niedozwolony znak po %s%%"
-
-#: ../regexp.c:3017
-#, c-format
-msgid "E554: Syntax error in %s{...}"
-msgstr "E554: Bณฑd skณadni w %s{...}"
-
-#: ../regexp.c:3805
-msgid "External submatches:\n"
-msgstr "Zewn๊trzne poddopasowania:\n"
-
-#: ../regexp.c:7022
-msgid ""
-"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be "
-"used "
-msgstr ""
-"E:864: \\%#= moฟe byๆ tylko przed 0, 1 lub 2. Zostanie uฟyty silnik "
-"automatyczny"
-
-#: ../regexp_nfa.c:239
-msgid "E865: (NFA) Regexp end encountered prematurely"
-msgstr "E865: (NFA) przedwczesny koniec wyraฟenia regularnego"
-
-#: ../regexp_nfa.c:240
-#, c-format
-msgid "E866: (NFA regexp) Misplaced %c"
-msgstr "E866: (wyraฟenie regularne NFA) Niepoprawnie umieszczone %c"
-
-#: ../regexp_nfa.c:242
-#, c-format
-msgid "E877: (NFA regexp) Invalid character class: %<PRId64>"
-msgstr ""
-
-#: ../regexp_nfa.c:1261
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\z%c'"
-msgstr "E867: (NFA) Nieznany operator '\\z%c'"
-
-#: ../regexp_nfa.c:1387
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\%%%c'"
-msgstr "E867: (NFA) Nieznany operator '\\%%%c'"
-
-#: ../regexp_nfa.c:1802
-#, c-format
-msgid "E869: (NFA) Unknown operator '\\@%c'"
-msgstr "E869: (NFA) Nieznany operator '\\@%c'"
-
-#: ../regexp_nfa.c:1831
-msgid "E870: (NFA regexp) Error reading repetition limits"
-msgstr ""
-"E870: (wyraฟenie regularne NFA) Bณฑd przy odczytywaniu limit๓w powt๓rze๑"
-
-#. Can't have a multi follow a multi.
-#: ../regexp_nfa.c:1895
-msgid "E871: (NFA regexp) Can't have a multi follow a multi !"
-msgstr ""
-"E871: (wyraฟenie regularne NFA) wielokrotne nie moฟe byๆ po wielokrotnym!"
-
-#. Too many `('
-#: ../regexp_nfa.c:2037
-msgid "E872: (NFA regexp) Too many '('"
-msgstr "E872: (wyraฟenie regularne NFA) Zbyt duฟo '('"
-
-#: ../regexp_nfa.c:2042
-msgid "E879: (NFA regexp) Too many \\z("
-msgstr "E879: (wyraฟenie regularne NFA) Za duฟo \\z("
-
-#: ../regexp_nfa.c:2066
-msgid "E873: (NFA regexp) proper termination error"
-msgstr "E873: (wyraฟenie regularne NFA) bณฑd poprawnego zako๑czenia"
-
-#: ../regexp_nfa.c:2599
-msgid "E874: (NFA) Could not pop the stack !"
-msgstr "E874: (NFA) Nie moฟna zdjฑๆ elementu ze stosu!"
-
-#: ../regexp_nfa.c:3298
-msgid ""
-"E875: (NFA regexp) (While converting from postfix to NFA), too many states "
-"left on stack"
-msgstr ""
-"E875: (wyraฟenie regularne NFA) (w trakcie konwersji postfix do NFA), za "
-"wiele stan๓w na stosie"
-
-#: ../regexp_nfa.c:3302
-msgid "E876: (NFA regexp) Not enough space to store the whole NFA "
-msgstr "E876: (wyraฟenie regularne NFA) Nie ma miejsca na caณe NFA "
-
-#: ../regexp_nfa.c:4571 ../regexp_nfa.c:4869
-msgid ""
-"Could not open temporary log file for writing, displaying on stderr ... "
-msgstr ""
-"Nie moฟna otworzyๆ do zapisu tymczasowego pliku, pokazuj๊ na stderr... "
-
-#: ../regexp_nfa.c:4840
-#, c-format
-msgid "(NFA) COULD NOT OPEN %s !"
-msgstr "(NFA) NIE MOฏNA OTWORZYฦ %s !"
-
-#: ../regexp_nfa.c:6049
-msgid "Could not open temporary log file for writing "
-msgstr "Nie moฟna otworzyๆ do zapisu tymczasowego pliku logowania"
-
-#: ../screen.c:7435
-msgid " VREPLACE"
-msgstr " V-ZAMIANA"
-
-#: ../screen.c:7437
-msgid " REPLACE"
-msgstr " ZAMIANA"
-
-#: ../screen.c:7440
-msgid " REVERSE"
-msgstr " NEGATYW"
-
-#: ../screen.c:7441
-msgid " INSERT"
-msgstr " WPROWADZANIE"
-
-#: ../screen.c:7443
-msgid " (insert)"
-msgstr " (wprowadzanie)"
-
-#: ../screen.c:7445
-msgid " (replace)"
-msgstr " (zamiana)"
-
-#: ../screen.c:7447
-msgid " (vreplace)"
-msgstr " (v-zamiana)"
-
-#: ../screen.c:7449
-msgid " Hebrew"
-msgstr " Hebrajski"
-
-#: ../screen.c:7454
-msgid " Arabic"
-msgstr " Arabski"
-
-#: ../screen.c:7456
-msgid " (lang)"
-msgstr " (j๊zyk)"
-
-#: ../screen.c:7459
-msgid " (paste)"
-msgstr " (wklejanie)"
-
-#: ../screen.c:7469
-msgid " VISUAL"
-msgstr " WIZUALNY"
-
-#: ../screen.c:7470
-msgid " VISUAL LINE"
-msgstr " WIZUALNY LINIOWY"
-
-#: ../screen.c:7471
-msgid " VISUAL BLOCK"
-msgstr " WIZUALNY BLOKOWY"
-
-#: ../screen.c:7472
-msgid " SELECT"
-msgstr " ZAZNACZANIE"
-
-#: ../screen.c:7473
-msgid " SELECT LINE"
-msgstr " ZAZNACZANIE LINIOWE"
-
-#: ../screen.c:7474
-msgid " SELECT BLOCK"
-msgstr " ZAZNACZANIE BLOKOWE"
-
-#: ../screen.c:7486 ../screen.c:7541
-msgid "recording"
-msgstr "zapis"
-
-#: ../search.c:487
-#, c-format
-msgid "E383: Invalid search string: %s"
-msgstr "E383: Niewณaถciwy ciฑg do szukania: %s"
-
-#: ../search.c:832
-#, c-format
-msgid "E384: search hit TOP without match for: %s"
-msgstr "E384: szukanie dobiณo GำRY bez znalezienia: %s"
-
-#: ../search.c:835
-#, c-format
-msgid "E385: search hit BOTTOM without match for: %s"
-msgstr "E385: szukanie dobiณo KOัCA bez znalezienia : %s"
-
-#: ../search.c:1200
-msgid "E386: Expected '?' or '/' after ';'"
-msgstr "E386: Oczekuj๊ '?' lub '/' po ';'"
-
-#: ../search.c:4085
-msgid " (includes previously listed match)"
-msgstr " (zawiera poprzednio wymienione dopasowanie)"
-
-#. cursor at status line
-#: ../search.c:4104
-msgid "--- Included files "
-msgstr "--- Zawarte pliki "
-
-#: ../search.c:4106
-msgid "not found "
-msgstr "nie znaleziono"
-
-#: ../search.c:4107
-msgid "in path ---\n"
-msgstr "w tropie ---\n"
-
-#: ../search.c:4168
-msgid " (Already listed)"
-msgstr " (Juฟ wymienione)"
-
-#: ../search.c:4170
-msgid " NOT FOUND"
-msgstr " NIE ZNALEZIONO"
-
-#: ../search.c:4211
-#, c-format
-msgid "Scanning included file: %s"
-msgstr "Przeglฑd wณฑczonego pliku: %s"
-
-#: ../search.c:4216
-#, c-format
-msgid "Searching included file %s"
-msgstr "Przeszukiwanie wณฑczonego pliku %s"
-
-#: ../search.c:4405
-msgid "E387: Match is on current line"
-msgstr "E387: Wzorzec pasuje w bieฟฑcym wierszu"
-
-#: ../search.c:4517
-msgid "All included files were found"
-msgstr "Wszelkie wณฑczane pliki odnaleziono"
-
-#: ../search.c:4519
-msgid "No included files"
-msgstr "Brak wณฑczanych plik๓w"
-
-#: ../search.c:4527
-msgid "E388: Couldn't find definition"
-msgstr "E388: Nie znalazณem definicji"
-
-#: ../search.c:4529
-msgid "E389: Couldn't find pattern"
-msgstr "E389: Nie znalazณem wzorca"
-
-#: ../search.c:4668
-msgid "Substitute "
-msgstr "Podstawienie "
-
-#: ../search.c:4681
-#, c-format
-msgid ""
-"\n"
-"# Last %sSearch Pattern:\n"
-"~"
-msgstr ""
-"\n"
-"# Ostatni %sWyszukiwany wzorzec:\n"
-"~"
-
-#: ../spell.c:951
-msgid "E759: Format error in spell file"
-msgstr "E759: Nieprawidณowy format pliku sprawdzania pisowni"
-
-#: ../spell.c:952
-msgid "E758: Truncated spell file"
-msgstr "E758: Obci๊ty plik sprawdzania pisowni"
-
-#: ../spell.c:953
-#, c-format
-msgid "Trailing text in %s line %d: %s"
-msgstr "Zb๊dny tekst w %s wiersz %d: %s"
-
-#: ../spell.c:954
-#, c-format
-msgid "Affix name too long in %s line %d: %s"
-msgstr "Za dณuga nazwa afiksu w %s wiersz %d: %s"
-
-#: ../spell.c:955
-msgid "E761: Format error in affix file FOL, LOW or UPP"
-msgstr "E761: Bณฑd formatu w pliku afiks๓w FOL, LOW lub UPP"
-
-#: ../spell.c:957
-msgid "E762: Character in FOL, LOW or UPP is out of range"
-msgstr "E762: Znak w FOL, LOW lub UPP jest poza zasi๊giem"
-
-#: ../spell.c:958
-msgid "Compressing word tree..."
-msgstr "Kompresja drzewa sณ๓w..."
-
-#: ../spell.c:1951
-msgid "E756: Spell checking is not enabled"
-msgstr "E756: Sprawdzanie pisowni nie jest wณฑczone"
-
-#: ../spell.c:2249
-#, c-format
-msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
-msgstr ""
-"Ostrzeฟenie: Nie mog๊ znaleผๆ listy sณ๓w \"%s.%s.spl\" lub \"%s.ascii.spl\""
-
-#: ../spell.c:2473
-#, c-format
-msgid "Reading spell file \"%s\""
-msgstr "Odczytuj๊ plik sprawdzania pisowni \"%s\""
-
-#: ../spell.c:2496
-msgid "E757: This does not look like a spell file"
-msgstr "E757: To nie wyglฑda na plik sprawdzania pisowni"
-
-#: ../spell.c:2501
-msgid "E771: Old spell file, needs to be updated"
-msgstr "E771: Stary plik sprawdzania pisowni, wymagane uaktualnienie"
-
-#: ../spell.c:2504
-msgid "E772: Spell file is for newer version of Vim"
-msgstr "E772: Plik sprawdzania pisowni dla nowszej wersji Vima"
-
-#: ../spell.c:2602
-msgid "E770: Unsupported section in spell file"
-msgstr "E770: Niewspierana sekcja w pliku sprawdzania pisowni"
-
-#: ../spell.c:3762
-#, c-format
-msgid "Warning: region %s not supported"
-msgstr "Ostrzeฟenie: region %s nie jest wspierany"
-
-#: ../spell.c:4550
-#, c-format
-msgid "Reading affix file %s ..."
-msgstr "Czytam plik afiks๓w %s ..."
-
-#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
-#, c-format
-msgid "Conversion failure for word in %s line %d: %s"
-msgstr "Konwersja nie powiodณa si๊ dla wyrazu w %s wierszu %d: %s"
-
-#: ../spell.c:4630 ../spell.c:6170
-#, c-format
-msgid "Conversion in %s not supported: from %s to %s"
-msgstr "Konwersja w %s nie jest wspierana: od %s do %s"
-
-#: ../spell.c:4642
-#, c-format
-msgid "Invalid value for FLAG in %s line %d: %s"
-msgstr "Nieprawidณowa wartoถๆ FLAG w %s wierz %d: %s"
-
-#: ../spell.c:4655
-#, c-format
-msgid "FLAG after using flags in %s line %d: %s"
-msgstr "FLAG po uฟyciu flag w %s wiersz %d: %s"
-
-#: ../spell.c:4723
-#, c-format
-msgid ""
-"Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line "
-"%d"
-msgstr ""
-"Definiowanie COMPOUNDFORBIDFLAG po PFX moฟe skutkowaๆ zณym wynikiem w %s "
-"wiersz %d"
-
-#: ../spell.c:4731
-#, c-format
-msgid ""
-"Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line "
-"%d"
-msgstr ""
-"Definiowanie COMPOUNDPERMITFLAG po PFX moฟe skutkowaๆ zณym wynikiem w %s "
-"wiersz %d"
-
-#: ../spell.c:4747
-#, c-format
-msgid "Wrong COMPOUNDRULES value in %s line %d: %s"
-msgstr "Zณa wartoถๆ COMPOUNDRULES w %s wiersz %d: %s"
-
-#: ../spell.c:4771
-#, c-format
-msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s"
-msgstr "Zณa wartoถๆ COMPOUNDWORDMAX w %s wiersz %d: %s"
-
-#: ../spell.c:4777
-#, c-format
-msgid "Wrong COMPOUNDMIN value in %s line %d: %s"
-msgstr "Zณa wartoถๆ COMPOUNDMIM w %s wiersz %d: %s"
-
-#: ../spell.c:4783
-#, c-format
-msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s"
-msgstr "Zณa wartoถๆ COMPOUNDSYLMAX w %s wiersz %d: %s"
-
-#: ../spell.c:4795
-#, c-format
-msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"
-msgstr "Zณa wartoถๆ CHECKCOMPOUNDPATTERN w %s wiersz %d: %s"
-
-#: ../spell.c:4847
-#, c-format
-msgid "Different combining flag in continued affix block in %s line %d: %s"
-msgstr "R๓ฟne flagi zณoฟe๑ w kontynuowanym bloku afiksu w %s wiersz %d: %s"
-
-#: ../spell.c:4850
-#, c-format
-msgid "Duplicate affix in %s line %d: %s"
-msgstr "Powt๓rzony afiks w %s wiersz %d: %s"
-
-#: ../spell.c:4871
-#, c-format
-msgid ""
-"Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s "
-"line %d: %s"
-msgstr ""
-"Afiks uฟyty takฟe dla BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST w "
-"%s wiersz %d: %s"
-
-#: ../spell.c:4893
-#, c-format
-msgid "Expected Y or N in %s line %d: %s"
-msgstr "Oczekiwano Y lub N w %s wierszu %d: %s"
-
-#: ../spell.c:4968
-#, c-format
-msgid "Broken condition in %s line %d: %s"
-msgstr "Bณ๊dny warunek w %s wiersz %d: %s"
-
-#: ../spell.c:5091
-#, c-format
-msgid "Expected REP(SAL) count in %s line %d"
-msgstr "Oczekiwano iloถci REP(SAL) w %s wierszu %d"
-
-#: ../spell.c:5120
-#, c-format
-msgid "Expected MAP count in %s line %d"
-msgstr "Oczekiwano iloถci MAP w %s wierszu %d"
-
-#: ../spell.c:5132
-#, c-format
-msgid "Duplicate character in MAP in %s line %d"
-msgstr "Powt๓rzony znak w MAP w %s wierszu %d"
-
-#: ../spell.c:5176
-#, c-format
-msgid "Unrecognized or duplicate item in %s line %d: %s"
-msgstr "Nieznany lub powt๓rzony element w %s wierszu %d: %s"
-
-#: ../spell.c:5197
-#, c-format
-msgid "Missing FOL/LOW/UPP line in %s"
-msgstr "Brak wiersza FOL/LOW/UPP w %s"
-
-#: ../spell.c:5220
-msgid "COMPOUNDSYLMAX used without SYLLABLE"
-msgstr "COMPOUNDSYLMAX uฟyty bez SYLLABLE"
-
-#: ../spell.c:5236
-msgid "Too many postponed prefixes"
-msgstr "Zbyt wiele op๓ผnionych prefiks๓w"
-
-#: ../spell.c:5238
-msgid "Too many compound flags"
-msgstr "Zbyt wiele flag zณoฟe๑"
-
-#: ../spell.c:5240
-msgid "Too many postponed prefixes and/or compound flags"
-msgstr "Zbyt wiele op๓ผnionych prefiks๓w i/lub flag zณoฟe๑"
-
-#: ../spell.c:5250
-#, c-format
-msgid "Missing SOFO%s line in %s"
-msgstr "Brak wiersza SOFO%s wiersz w %s"
-
-#: ../spell.c:5253
-#, c-format
-msgid "Both SAL and SOFO lines in %s"
-msgstr "Wiersze SAL i SOFO w %s"
-
-#: ../spell.c:5331
-#, c-format
-msgid "Flag is not a number in %s line %d: %s"
-msgstr "Flaga nie jest liczbฑ w %s wiersz %d: %s"
-
-#: ../spell.c:5334
-#, c-format
-msgid "Illegal flag in %s line %d: %s"
-msgstr "Nieprawidณowa flaga w %s wiersz %d: %s"
-
-#: ../spell.c:5493 ../spell.c:5501
-#, c-format
-msgid "%s value differs from what is used in another .aff file"
-msgstr "Wartoถๆ %s r๓ฟni si๊ od tej uฟytej w innym pliku .aff"
-
-#: ../spell.c:5602
-#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "Czytam plik sณownika %s ..."
-
-#: ../spell.c:5611
-#, c-format
-msgid "E760: No word count in %s"
-msgstr "E760: Brak iloถci sณ๓w w %s"
-
-#: ../spell.c:5669
-#, c-format
-msgid "line %6d, word %6d - %s"
-msgstr "wiersz %6d, sณowo %6d - %s"
-
-# c-format
-#: ../spell.c:5691
-#, c-format
-msgid "Duplicate word in %s line %d: %s"
-msgstr "Powt๓rzony wyraz w %s wierszu %d: %s"
-
-# c-format
-#: ../spell.c:5694
-#, c-format
-msgid "First duplicate word in %s line %d: %s"
-msgstr "Pierwszy powt๓rzony wyraz w %s wiersz %d: %s"
-
-# c-format
-#: ../spell.c:5746
-#, c-format
-msgid "%d duplicate word(s) in %s"
-msgstr "%d powt๓rzony(ch) wyraz(๓w) w %s"
-
-#: ../spell.c:5748
-#, c-format
-msgid "Ignored %d word(s) with non-ASCII characters in %s"
-msgstr "Zignorowaณem %d sณ๓w ze znakami nie ASCII w %s"
-
-#: ../spell.c:6115
-#, c-format
-msgid "Reading word file %s ..."
-msgstr "Odczytuj๊ plik wyraz๓w %s ..."
-
-#: ../spell.c:6155
-#, c-format
-msgid "Duplicate /encoding= line ignored in %s line %d: %s"
-msgstr "Zignorowano powt๓rzony wiersz /encoding= w %s wierszu %d: %s"
-
-#: ../spell.c:6159
-#, c-format
-msgid "/encoding= line after word ignored in %s line %d: %s"
-msgstr "Zignorowano wiersz /encoding= po wyrazie w %s wierszu %d: %s"
-
-#: ../spell.c:6180
-#, c-format
-msgid "Duplicate /regions= line ignored in %s line %d: %s"
-msgstr "Powt๓rzony wiersz /regions= zignorowano w %s wierszu %d: %s"
-
-#: ../spell.c:6185
-#, c-format
-msgid "Too many regions in %s line %d: %s"
-msgstr "Za duฟo region๓w w %s wiersz %d: %s"
-
-#: ../spell.c:6198
-#, c-format
-msgid "/ line ignored in %s line %d: %s"
-msgstr "wiersz / zignorowano w %s wierszu %d: %s"
-
-#: ../spell.c:6224
-#, c-format
-msgid "Invalid region nr in %s line %d: %s"
-msgstr "Nieprawidณowy numer regionu w %s wierszu %d: %s"
-
-#: ../spell.c:6230
-#, c-format
-msgid "Unrecognized flags in %s line %d: %s"
-msgstr "Nieznane flagi w %s wiersz %d: %s"
-
-#: ../spell.c:6257
-#, c-format
-msgid "Ignored %d words with non-ASCII characters"
-msgstr "Zignorowaณem %d sณ๓w ze znakami nie ASCII"
-
-#: ../spell.c:6656
-#, c-format
-msgid "Compressed %d of %d nodes; %d (%d%%) remaining"
-msgstr "Skompresowano %d z %d w๊zณ๓w; pozostaje %d (%d%%)"
-
-#: ../spell.c:7340
-msgid "Reading back spell file..."
-msgstr "Odczytuj๊ plik sprawdzania pisowni..."
-
-#. Go through the trie of good words, soundfold each word and add it to
-#. the soundfold trie.
-#: ../spell.c:7357
-msgid "Performing soundfolding..."
-msgstr "Wykonuj๊ kompresj๊ dผwi๊kowฑ..."
-
-#: ../spell.c:7368
-#, c-format
-msgid "Number of words after soundfolding: %<PRId64>"
-msgstr "Liczba sณ๓w po kompresji dผwi๊kowej: %<PRId64>"
-
-#: ../spell.c:7476
-#, c-format
-msgid "Total number of words: %d"
-msgstr "Caณkowita liczba sณ๓w: %d"
-
-#: ../spell.c:7655
-#, c-format
-msgid "Writing suggestion file %s ..."
-msgstr "Zapisuj๊ plik sugestii %s ..."
-
-#: ../spell.c:7707 ../spell.c:7927
-#, c-format
-msgid "Estimated runtime memory use: %d bytes"
-msgstr "Oczekiwane zuฟycie pami๊ci: %d bajt๓w"
-
-#: ../spell.c:7820
-msgid "E751: Output file name must not have region name"
-msgstr "E751: Nazwa pliku wynikowego nie moฟe byๆ nazwฑ regionu"
-
-#: ../spell.c:7822
-msgid "E754: Only up to 8 regions supported"
-msgstr "E754: Wspieram tylko 8 region๓w"
-
-#: ../spell.c:7846
-#, c-format
-msgid "E755: Invalid region in %s"
-msgstr "E755: Nieprawidณowy region w %s"
-
-#: ../spell.c:7907
-msgid "Warning: both compounding and NOBREAK specified"
-msgstr "Ostrzeฟenie: okreถlono zar๓wno zณoฟenia jak i NOBREAK"
-
-#: ../spell.c:7920
-#, c-format
-msgid "Writing spell file %s ..."
-msgstr "Zapisuj๊ plik sprawdzania pisowni %s ..."
-
-#: ../spell.c:7925
-msgid "Done!"
-msgstr "Zrobione!"
-
-#: ../spell.c:8034
-#, c-format
-msgid "E765: 'spellfile' does not have %<PRId64> entries"
-msgstr "E765: 'spellfile' nie posiada wpis๓w %<PRId64>"
-
-#: ../spell.c:8074
-#, fuzzy, c-format
-msgid "Word '%.*s' removed from %s"
-msgstr "Usuni๊to sณowo z %s"
-
-#: ../spell.c:8117
-#, fuzzy, c-format
-msgid "Word '%.*s' added to %s"
-msgstr "Dodano sณowo do %s"
-
-#: ../spell.c:8381
-msgid "E763: Word characters differ between spell files"
-msgstr "E763: Znaki wyraz๓w r๓ฟniฑ si๊ mi๊dzy plikami sprawdzania pisowni"
-
-#: ../spell.c:8684
-msgid "Sorry, no suggestions"
-msgstr "Przykro mi, brak podpowiedzi"
-
-#: ../spell.c:8687
-#, c-format
-msgid "Sorry, only %<PRId64> suggestions"
-msgstr "Przykro mi, tylko %<PRId64> podpowiedzi"
-
-#. for when 'cmdheight' > 1
-#. avoid more prompt
-#: ../spell.c:8704
-#, c-format
-msgid "Change \"%.*s\" to:"
-msgstr "Zmie๑ \"%.*s\" na:"
-
-#: ../spell.c:8737
-#, c-format
-msgid " < \"%.*s\""
-msgstr " < \"%.*s\""
-
-#: ../spell.c:8882
-msgid "E752: No previous spell replacement"
-msgstr "E752: Brak poprzednich podmian sprawdzania pisowni"
-
-#: ../spell.c:8925
-#, c-format
-msgid "E753: Not found: %s"
-msgstr "E753: Nie znaleziono: %s"
-
-#: ../spell.c:9276
-#, c-format
-msgid "E778: This does not look like a .sug file: %s"
-msgstr "E778: Ten plik nie wyglฑda na plik .sug: %s"
-
-#: ../spell.c:9282
-#, c-format
-msgid "E779: Old .sug file, needs to be updated: %s"
-msgstr "E779: Stary plik .sug, konieczne jest uaktualnienie: %s"
-
-#: ../spell.c:9286
-#, c-format
-msgid "E780: .sug file is for newer version of Vim: %s"
-msgstr "E780: Plik .sug dla nowszej wersji Vima: %s"
-
-#: ../spell.c:9295
-#, c-format
-msgid "E781: .sug file doesn't match .spl file: %s"
-msgstr "E781: Plik .sug nie pasuje do pliku .spl: %s"
-
-#: ../spell.c:9305
-#, c-format
-msgid "E782: error while reading .sug file: %s"
-msgstr "E782: Bณฑd w czasie odczytu pliku .sug: %s"
-
-#. This should have been checked when generating the .spl
-#. file.
-#: ../spell.c:11575
-msgid "E783: duplicate char in MAP entry"
-msgstr "E783: Podwojony znak we wpisie MAP"
-
-#: ../syntax.c:266
-msgid "No Syntax items defined for this buffer"
-msgstr "Brak element๓w skณadni okreถlonych dla tego bufora"
-
-#: ../syntax.c:3083 ../syntax.c:3104 ../syntax.c:3127
-#, c-format
-msgid "E390: Illegal argument: %s"
-msgstr "E390: Niedozwolony argument: %s"
-
-#: ../syntax.c:3299
-#, c-format
-msgid "E391: No such syntax cluster: %s"
-msgstr "E391: Nie ma takiego klastra skณadni: %s"
-
-#: ../syntax.c:3433
-msgid "syncing on C-style comments"
-msgstr "synchronizacja komentarzy w stylu C"
-
-#: ../syntax.c:3439
-msgid "no syncing"
-msgstr "brak synchronizacji"
-
-#: ../syntax.c:3441
-msgid "syncing starts "
-msgstr "poczฑtek synchronizacji"
-
-#: ../syntax.c:3443 ../syntax.c:3506
-msgid " lines before top line"
-msgstr " wierszy przed g๓rnฑ liniฑ"
-
-#: ../syntax.c:3448
-msgid ""
-"\n"
-"--- Syntax sync items ---"
-msgstr ""
-"\n"
-"--- Elementy synchronizacji skณadni ---"
-
-#: ../syntax.c:3452
-msgid ""
-"\n"
-"syncing on items"
-msgstr ""
-"\n"
-"synchronizuj๊ na elementach"
-
-#: ../syntax.c:3457
-msgid ""
-"\n"
-"--- Syntax items ---"
-msgstr ""
-"\n"
-"--- Elementy skณadni ---"
-
-#: ../syntax.c:3475
-#, c-format
-msgid "E392: No such syntax cluster: %s"
-msgstr "E392: Nie ma takiego klastra skณadni: %s"
-
-#: ../syntax.c:3497
-msgid "minimal "
-msgstr "minimalnie "
-
-#: ../syntax.c:3503
-msgid "maximal "
-msgstr "maksymalnie "
-
-#: ../syntax.c:3513
-msgid "; match "
-msgstr "; pasuje "
-
-#: ../syntax.c:3515
-msgid " line breaks"
-msgstr "znak๓w nowego wiersza"
-
-#: ../syntax.c:4076
-msgid "E395: contains argument not accepted here"
-msgstr "E395: argument contains niedozwolony w tym miejscu"
-
-#: ../syntax.c:4096
-msgid "E844: invalid cchar value"
-msgstr "E844: Niewณaถciwa wartoถๆ cchar"
-
-#: ../syntax.c:4107
-msgid "E393: group[t]here not accepted here"
-msgstr "E393: group[t]here niedozwolone w tym miejscu"
-
-#: ../syntax.c:4126
-#, c-format
-msgid "E394: Didn't find region item for %s"
-msgstr "E394: Nie znalazณem element๓w regionu dla %s"
-
-#: ../syntax.c:4188
-msgid "E397: Filename required"
-msgstr "E397: Wymagana nazwa pliku"
-
-#: ../syntax.c:4221
-msgid "E847: Too many syntax includes"
-msgstr "E847: Za duฟo wณฑczonych skณadni"
-
-#: ../syntax.c:4303
-#, c-format
-msgid "E789: Missing ']': %s"
-msgstr "E789: Brak ']': %s"
-
-#: ../syntax.c:4531
-#, c-format
-msgid "E398: Missing '=': %s"
-msgstr "E398: Brak '=': %s"
-
-#: ../syntax.c:4666
-#, c-format
-msgid "E399: Not enough arguments: syntax region %s"
-msgstr "E399: Za maณo argument๓w: syntax region %s"
-
-#: ../syntax.c:4870
-msgid "E848: Too many syntax clusters"
-msgstr "E848: Za duฟo klastr๓w skณadni"
-
-#: ../syntax.c:4954
-msgid "E400: No cluster specified"
-msgstr "E400: Brak specyfikacji klastra"
-
-#. end delimiter not found
-#: ../syntax.c:4986
-#, c-format
-msgid "E401: Pattern delimiter not found: %s"
-msgstr "E401: Brak ogranicznika wzorca: %s"
-
-#: ../syntax.c:5049
-#, c-format
-msgid "E402: Garbage after pattern: %s"
-msgstr "E402: ฆmieci po wzorcu: %s"
-
-#: ../syntax.c:5120
-msgid "E403: syntax sync: line continuations pattern specified twice"
-msgstr "E403: syntax sync: wielokrotnie podane wzorce kontynuacji wiersza"
-
-#: ../syntax.c:5169
-#, c-format
-msgid "E404: Illegal arguments: %s"
-msgstr "E404: Niedozwolone argumenty: %s"
-
-#: ../syntax.c:5217
-#, c-format
-msgid "E405: Missing equal sign: %s"
-msgstr "E405: Brak znaku r๓wnoถci: %s"
-
-#: ../syntax.c:5222
-#, c-format
-msgid "E406: Empty argument: %s"
-msgstr "E406: Pusty argument: %s"
-
-#: ../syntax.c:5240
-#, c-format
-msgid "E407: %s not allowed here"
-msgstr "E407: %s jest niedozwolone w tym miejscu"
-
-#: ../syntax.c:5246
-#, c-format
-msgid "E408: %s must be first in contains list"
-msgstr "E408: %s musi byๆ pierwsze w liถcie contains"
-
-#: ../syntax.c:5304
-#, c-format
-msgid "E409: Unknown group name: %s"
-msgstr "E409: Nieznana nazwa grupy: %s"
-
-#: ../syntax.c:5512
-#, c-format
-msgid "E410: Invalid :syntax subcommand: %s"
-msgstr "E410: Niewณaถciwa podkomenda :syntax : %s"
-
-#: ../syntax.c:5854
-msgid ""
-" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
-msgstr ""
-" WSZYTKO ILOฆฦ PASUJE NAJWOLN. ฆREDNIO NAZWA WZORZEC"
-
-#: ../syntax.c:6146
-msgid "E679: recursive loop loading syncolor.vim"
-msgstr "E679: rekursywna p๊tla wczytujฑca syncolor.vim"
-
-#: ../syntax.c:6256
-#, c-format
-msgid "E411: highlight group not found: %s"
-msgstr "E411: nie znaleziono grupy podถwietlania: %s"
-
-#: ../syntax.c:6278
-#, c-format
-msgid "E412: Not enough arguments: \":highlight link %s\""
-msgstr "E412: Zbyt maณo argument๓w: \":highlight link %s\""
-
-#: ../syntax.c:6284
-#, c-format
-msgid "E413: Too many arguments: \":highlight link %s\""
-msgstr "E413: Zbyt wiele argument๓w: \":highlight link %s\""
-
-#: ../syntax.c:6302
-msgid "E414: group has settings, highlight link ignored"
-msgstr "E414: grupa ma ustawienia; zignorowane podณฑczenie podถwietlania"
-
-#: ../syntax.c:6367
-#, c-format
-msgid "E415: unexpected equal sign: %s"
-msgstr "E415: nieoczekiwany znak r๓wnoถci: %s"
-
-#: ../syntax.c:6395
-#, c-format
-msgid "E416: missing equal sign: %s"
-msgstr "E416: brak znaku r๓wnoถci: %s"
-
-#: ../syntax.c:6418
-#, c-format
-msgid "E417: missing argument: %s"
-msgstr "E417: brak argumentu: %s"
-
-#: ../syntax.c:6446
-#, c-format
-msgid "E418: Illegal value: %s"
-msgstr "E418: Niedozwolona wartoถๆ: %s"
-
-#: ../syntax.c:6496
-msgid "E419: FG color unknown"
-msgstr "E419: Kolor FG nieznany"
-
-#: ../syntax.c:6504
-msgid "E420: BG color unknown"
-msgstr "E420: Kolor BG nieznany"
-
-#: ../syntax.c:6564
-#, c-format
-msgid "E421: Color name or number not recognized: %s"
-msgstr "E421: Nazwa lub liczba koloru nierozpoznana: %s"
-
-#: ../syntax.c:6714
-#, c-format
-msgid "E422: terminal code too long: %s"
-msgstr "E422: za dณugi kod terminala: %s"
-
-#: ../syntax.c:6753
-#, c-format
-msgid "E423: Illegal argument: %s"
-msgstr "E423: Niedozwolony argument: %s"
-
-#: ../syntax.c:6925
-msgid "E424: Too many different highlighting attributes in use"
-msgstr "E424: Zbyt wiele r๓ฟnych atrybut๓w podkreถlania w uฟyciu"
-
-#: ../syntax.c:7427
-msgid "E669: Unprintable character in group name"
-msgstr "E669: Niedrukowalny znak w nazwie grupy"
-
-#: ../syntax.c:7434
-msgid "W18: Invalid character in group name"
-msgstr "W18: nieprawidณowy znak w nazwie grupy"
-
-#: ../syntax.c:7448
-msgid "E849: Too many highlight and syntax groups"
-msgstr "E849: Za duฟo grup podถwietlania i skณadni"
-
-#: ../tag.c:104
-msgid "E555: at bottom of tag stack"
-msgstr "E555: na dole stosu znacznik๓w"
-
-#: ../tag.c:105
-msgid "E556: at top of tag stack"
-msgstr "E556: na g๓rze stosu znacznik๓w"
-
-#: ../tag.c:380
-msgid "E425: Cannot go before first matching tag"
-msgstr "E425: Nie moฟna przejถๆ przed pierwszy pasujฑcy znacznik"
-
-#: ../tag.c:504
-#, c-format
-msgid "E426: tag not found: %s"
-msgstr "E426: nie znaleziono znacznika: %s"
-
-#: ../tag.c:528
-msgid " # pri kind tag"
-msgstr " # pri rodzaj znacznik"
-
-#: ../tag.c:531
-msgid "file\n"
-msgstr "plik\n"
-
-#: ../tag.c:829
-msgid "E427: There is only one matching tag"
-msgstr "E427: Pasuje tylko jeden znacznik"
-
-#: ../tag.c:831
-msgid "E428: Cannot go beyond last matching tag"
-msgstr "E428: Nie moฟna przejถๆ za ostatni pasujฑcy znacznik"
-
-#: ../tag.c:850
-#, c-format
-msgid "File \"%s\" does not exist"
-msgstr "Plik \"%s\" nie istnieje"
-
-#. Give an indication of the number of matching tags
-#: ../tag.c:859
-#, c-format
-msgid "tag %d of %d%s"
-msgstr "znacznik %d z %d%s"
-
-#: ../tag.c:862
-msgid " or more"
-msgstr " lub wi๊cej"
-
-#: ../tag.c:864
-msgid " Using tag with different case!"
-msgstr " Uฟywam znacznika o odmiennej wielkoถci liter!"
-
-#: ../tag.c:909
-#, c-format
-msgid "E429: File \"%s\" does not exist"
-msgstr "E429: Plik \"%s\" nie istnieje"
-
-#. Highlight title
-#: ../tag.c:960
-msgid ""
-"\n"
-" # TO tag FROM line in file/text"
-msgstr ""
-"\n"
-" # DO znacznik OD wiersza w pliku/tekถcie"
-
-#: ../tag.c:1303
-#, c-format
-msgid "Searching tags file %s"
-msgstr "Szukam w pliku znacznik๓w %s"
-
-#: ../tag.c:1545
-msgid "Ignoring long line in tags file"
-msgstr "Ignoruj๊ dณugie wiersze w pliku znacznik๓w"
-
-#: ../tag.c:1915
-#, c-format
-msgid "E431: Format error in tags file \"%s\""
-msgstr "E431: Bณฑd formatu w pliku znacznik๓w \"%s\""
-
-#: ../tag.c:1917
-#, c-format
-msgid "Before byte %<PRId64>"
-msgstr "Przed bajtem %<PRId64>"
-
-#: ../tag.c:1929
-#, c-format
-msgid "E432: Tags file not sorted: %s"
-msgstr "E432: Plik znacznik๓w nieuporzฑdkowany: %s"
-
-#. never opened any tags file
-#: ../tag.c:1960
-msgid "E433: No tags file"
-msgstr "E433: Brak pliku znacznik๓w"
-
-#: ../tag.c:2536
-msgid "E434: Can't find tag pattern"
-msgstr "E434: Nie mog๊ znaleผๆ wzorca znacznika"
-
-#: ../tag.c:2544
-msgid "E435: Couldn't find tag, just guessing!"
-msgstr "E435: Nie znalazณem znacznika - tylko zgaduj๊!"
-
-#: ../tag.c:2797
-#, c-format
-msgid "Duplicate field name: %s"
-msgstr "Powt๓rzona nazwa pola: %s"
-
-#: ../term.c:1442
-msgid "' not known. Available builtin terminals are:"
-msgstr "' nieznany. Moฟliwe typy wbudowanych terminali:"
-
-#: ../term.c:1463
-msgid "defaulting to '"
-msgstr "domyถlnie jest '"
-
-#: ../term.c:1731
-msgid "E557: Cannot open termcap file"
-msgstr "E557: Nie mog๊ otworzyๆ pliku termcap"
-
-#: ../term.c:1735
-msgid "E558: Terminal entry not found in terminfo"
-msgstr "E558: Nie ma opisu takiego terminala w terminfo"
-
-#: ../term.c:1737
-msgid "E559: Terminal entry not found in termcap"
-msgstr "E559: Nie ma opisu takiego terminala w termcap"
-
-#: ../term.c:1878
-#, c-format
-msgid "E436: No \"%s\" entry in termcap"
-msgstr "E436: Brak opisu \"%s\" w termcap"
-
-#: ../term.c:2249
-msgid "E437: terminal capability \"cm\" required"
-msgstr "E437: wymagana zdolnoถๆ \"cm\" terminala"
-
-#. Highlight title
-#: ../term.c:4376
-msgid ""
-"\n"
-"--- Terminal keys ---"
-msgstr ""
-"\n"
-"--- Klawisze terminala ---"
-
-#: ../ui.c:481
-msgid "Vim: Error reading input, exiting...\n"
-msgstr "Vim: Bณฑd podczas wczytywania wejถcia, ko๑cz๊...\n"
-
-#. This happens when the FileChangedRO autocommand changes the
-#. * file in a way it becomes shorter.
-#: ../undo.c:379
-#, fuzzy
-msgid "E881: Line count changed unexpectedly"
-msgstr "E834: Niespodziewana zmiana iloถci linii"
-
-#: ../undo.c:627
-#, c-format
-msgid "E828: Cannot open undo file for writing: %s"
-msgstr "E828: Nie mog๊ otworzyๆ do zapisu pliku undo: %s"
-
-#: ../undo.c:717
-#, c-format
-msgid "E825: Corrupted undo file (%s): %s"
-msgstr "E825: Uszkodzony plik undo (%s): %s"
-
-#: ../undo.c:1039
-msgid "Cannot write undo file in any directory in 'undodir'"
-msgstr "Nie moฟna zapisaๆ pliku undo w ฟadnym katalogu z 'undodir'"
-
-#: ../undo.c:1074
-#, c-format
-msgid "Will not overwrite with undo file, cannot read: %s"
-msgstr "Nie nadpisz๊ plikiem undo, nie mog๊ odczytaๆ: %s"
-
-#: ../undo.c:1092
-#, c-format
-msgid "Will not overwrite, this is not an undo file: %s"
-msgstr "Nie nadpisz๊, to nie jest plik undo: %s"
-
-#: ../undo.c:1108
-msgid "Skipping undo file write, nothing to undo"
-msgstr "Pomijam zapis pliku undo, nic do cofni๊cia"
-
-#: ../undo.c:1121
-#, c-format
-msgid "Writing undo file: %s"
-msgstr "Zapisuj๊ plik undo: %s"
-
-#: ../undo.c:1213
-#, c-format
-msgid "E829: write error in undo file: %s"
-msgstr "E829: Bณฑd zapisu w pliku undo: %s"
-
-#: ../undo.c:1280
-#, c-format
-msgid "Not reading undo file, owner differs: %s"
-msgstr "Nie wczytuj๊ pliku undo, inny wณaถciciel: %s"
-
-#: ../undo.c:1292
-#, c-format
-msgid "Reading undo file: %s"
-msgstr "Wczytuj๊ plik undo: %s"
-
-#: ../undo.c:1299
-#, c-format
-msgid "E822: Cannot open undo file for reading: %s"
-msgstr "E822: Nie mog๊ otworzyๆ pliku undo do odczytu: %s"
-
-#: ../undo.c:1308
-#, c-format
-msgid "E823: Not an undo file: %s"
-msgstr "E823: To nie jest plik undo: %s"
-
-#: ../undo.c:1313
-#, c-format
-msgid "E824: Incompatible undo file: %s"
-msgstr "E824: Niekompatybilny plik undo: %s"
-
-#: ../undo.c:1328
-msgid "File contents changed, cannot use undo info"
-msgstr "Zawartoถๆ pliku si๊ zmieniณa, nie mog๊ uฟyๆ pliku undo"
-
-#: ../undo.c:1497
-#, c-format
-msgid "Finished reading undo file %s"
-msgstr "Sko๑czono wczytywanie pliku undo %s"
-
-#: ../undo.c:1586 ../undo.c:1812
-msgid "Already at oldest change"
-msgstr "Juฟ w miejscu ostatniej zmiany"
-
-#: ../undo.c:1597 ../undo.c:1814
-msgid "Already at newest change"
-msgstr "Juฟ w miejscu najnowszej zmiany"
-
-#: ../undo.c:1806
-#, c-format
-msgid "E830: Undo number %<PRId64> not found"
-msgstr "E830: Nie znaleziono numeru cofni๊cia %<PRId64>"
-
-#: ../undo.c:1979
-msgid "E438: u_undo: line numbers wrong"
-msgstr "E438: u_undo: niewณaถciwe numery wierszy"
-
-#: ../undo.c:2183
-msgid "more line"
-msgstr "1 wiersz wi๊cej"
-
-#: ../undo.c:2185
-msgid "more lines"
-msgstr "wi๊cej wierszy"
-
-#: ../undo.c:2187
-msgid "line less"
-msgstr "1 wiersz mniej"
-
-#: ../undo.c:2189
-msgid "fewer lines"
-msgstr "mniej wierszy"
-
-#: ../undo.c:2193
-msgid "change"
-msgstr "1 zmiana"
-
-#: ../undo.c:2195
-msgid "changes"
-msgstr "zmiany"
-
-#: ../undo.c:2225
-#, c-format
-msgid "%<PRId64> %s; %s #%<PRId64> %s"
-msgstr "%<PRId64> %s; %s #%<PRId64> %s"
-
-#: ../undo.c:2228
-msgid "before"
-msgstr "przed"
-
-#: ../undo.c:2228
-msgid "after"
-msgstr "za"
-
-#: ../undo.c:2325
-msgid "Nothing to undo"
-msgstr "Nie ma zmian do cofni๊cia"
-
-#: ../undo.c:2330
-msgid "number changes when saved"
-msgstr "liczba zmiany kiedy zapisano"
-
-#: ../undo.c:2360
-#, c-format
-msgid "%<PRId64> seconds ago"
-msgstr "%<PRId64> sekund temu"
-
-#: ../undo.c:2372
-msgid "E790: undojoin is not allowed after undo"
-msgstr "E790: undojoin nie jest dozwolone po undo"
-
-#: ../undo.c:2466
-msgid "E439: undo list corrupt"
-msgstr "E439: uszkodzona lista cofania"
-
-#: ../undo.c:2495
-msgid "E440: undo line missing"
-msgstr "E440: brak wiersza cofania"
-
-#: ../version.c:600
-msgid ""
-"\n"
-"Included patches: "
-msgstr ""
-"\n"
-"Zadane ณaty: "
-
-#: ../version.c:627
-msgid ""
-"\n"
-"Extra patches: "
-msgstr ""
-"\n"
-"Ekstra ณaty: "
-
-#: ../version.c:639 ../version.c:864
-msgid "Modified by "
-msgstr "Zmieniony przez "
-
-#: ../version.c:646
-msgid ""
-"\n"
-"Compiled "
-msgstr ""
-"\n"
-"Skompilowany "
-
-#: ../version.c:649
-msgid "by "
-msgstr "przez "
-
-#: ../version.c:660
-msgid ""
-"\n"
-"Huge version "
-msgstr ""
-"\n"
-"Olbrzymia wersja "
-
-#: ../version.c:661
-msgid "without GUI."
-msgstr "bez GUI."
-
-#: ../version.c:662
-msgid " Features included (+) or not (-):\n"
-msgstr " Opcje wณฑczone (+) lub nie (-):\n"
-
-#: ../version.c:667
-msgid " system vimrc file: \""
-msgstr " vimrc systemu: \""
-
-#: ../version.c:672
-msgid " user vimrc file: \""
-msgstr " vimrc uฟytkownika: \""
-
-#: ../version.c:677
-msgid " 2nd user vimrc file: \""
-msgstr " 2-gi plik vimrc uฟytkownika: \""
-
-#: ../version.c:682
-msgid " 3rd user vimrc file: \""
-msgstr " 3-ci plik vimrc uฟytkownika: \""
-
-#: ../version.c:687
-msgid " user exrc file: \""
-msgstr " exrc uฟytkownika: \""
-
-#: ../version.c:692
-msgid " 2nd user exrc file: \""
-msgstr " 2-gi plik exrc uฟytkownika: \""
-
-#: ../version.c:699
-msgid " fall-back for $VIM: \""
-msgstr " odwet dla $VIM-a: \""
-
-#: ../version.c:705
-msgid " f-b for $VIMRUNTIME: \""
-msgstr "f-b dla $VIMRUNTIME: \""
-
-#: ../version.c:709
-msgid "Compilation: "
-msgstr "Kompilacja: "
-
-#: ../version.c:712
-msgid "Linking: "
-msgstr "Konsolidacja: "
-
-#: ../version.c:717
-msgid " DEBUG BUILD"
-msgstr " KOMPILACJA DEBUG"
-
-#: ../version.c:767
-msgid "VIM - Vi IMproved"
-msgstr "VIM - Vi rozbudowany"
-
-#: ../version.c:769
-msgid "version "
-msgstr "wersja "
-
-#: ../version.c:770
-msgid "by Bram Moolenaar et al."
-msgstr "Autor: Bram Moolenaar i Inni."
-
-#: ../version.c:774
-msgid "Vim is open source and freely distributable"
-msgstr "Vim jest open source i rozprowadzany darmowo"
-
-#: ../version.c:776
-msgid "Help poor children in Uganda!"
-msgstr "Pom๓ฟ biednym dzieciom w Ugandzie!"
-
-#: ../version.c:777
-msgid "type :help iccf<Enter> for information "
-msgstr "wprowadผ :help iccf<Enter> dla informacji o tym "
-
-#: ../version.c:779
-msgid "type :q<Enter> to exit "
-msgstr "wprowadผ :q<Enter> zako๑czenie programu "
-
-#: ../version.c:780
-msgid "type :help<Enter> or <F1> for on-line help"
-msgstr "wprowadผ :help<Enter> lub <F1> pomoc na bieฟฑco "
-
-#: ../version.c:781
-msgid "type :help version7<Enter> for version info"
-msgstr "wprowadผ :help version7<Enter> dla informacji o wersji"
-
-#: ../version.c:784
-msgid "Running in Vi compatible mode"
-msgstr "Dziaณam w trybie zgodnoถci z Vi"
-
-#: ../version.c:785
-msgid "type :set nocp<Enter> for Vim defaults"
-msgstr "wprowadผ :set nocp<Enter> wartoถci domyถlne Vim-a"
-
-#: ../version.c:786
-msgid "type :help cp-default<Enter> for info on this"
-msgstr "wprowadผ :help cp-default<Enter> dla informacji to tym "
-
-#: ../version.c:827
-msgid "Sponsor Vim development!"
-msgstr "Sponsoruj rozw๓j Vima!"
-
-#: ../version.c:828
-msgid "Become a registered Vim user!"
-msgstr "Zosta๑ zarejestrowanym uฟytkownikiem Vima!"
-
-#: ../version.c:831
-msgid "type :help sponsor<Enter> for information "
-msgstr "wprowadผ :help sponsor<Enter> dla informacji"
-
-#: ../version.c:832
-msgid "type :help register<Enter> for information "
-msgstr "wprowadผ :help register<Enter> dla informacji"
-
-#: ../version.c:834
-msgid "menu Help->Sponsor/Register for information "
-msgstr "menu Pomoc->Sponsoruj/Zarejestruj si๊ dla informacji"
-
-#: ../window.c:119
-msgid "Already only one window"
-msgstr "Juฟ jest tylko jeden widok"
-
-#: ../window.c:224
-msgid "E441: There is no preview window"
-msgstr "E441: Nie ma okna podglฑdu"
-
-#: ../window.c:559
-msgid "E442: Can't split topleft and botright at the same time"
-msgstr "E442: Nie mog๊ rozdzieliๆ lewo-g๓rnego i prawo-dolnego jednoczeถnie"
-
-#: ../window.c:1228
-msgid "E443: Cannot rotate when another window is split"
-msgstr "E443: Nie mog๊ przekr๊ciๆ, gdy inne okno jest rozdzielone"
-
-#: ../window.c:1803
-msgid "E444: Cannot close last window"
-msgstr "E444: Nie mog๊ zamknฑๆ ostatniego okna"
-
-#: ../window.c:1810
-msgid "E813: Cannot close autocmd window"
-msgstr "E813: Nie moฟna zamknฑๆ okna autocmd"
-
-#: ../window.c:1814
-msgid "E814: Cannot close window, only autocmd window would remain"
-msgstr "E814: Nie moฟna zamknฑๆ okna, zostaณoby tylko okno autocmd"
-
-#: ../window.c:2717
-msgid "E445: Other window contains changes"
-msgstr "E445: Inne okno zawiera zmiany"
-
-#: ../window.c:4805
-msgid "E446: No file name under cursor"
-msgstr "E446: Brak nazwy pliku pod kursorem"
-
-#~ msgid "E831: bf_key_init() called with empty password"
-#~ msgstr "E831: bf_key_init() wywoณany z pustym hasณem"
-
-#~ msgid "E820: sizeof(uint32_t) != 4"
-#~ msgstr "E820: sizeof(uint32_t) != 4"
-
-#~ msgid "E817: Blowfish big/little endian use wrong"
-#~ msgstr "E817: Blowfish uฟywa bณ๊dnej kolejnoถci bajt๓w"
-
-#~ msgid "E818: sha256 test failed"
-#~ msgstr "E818: test sha256 nie powi๓dณ si๊"
-
-#~ msgid "E819: Blowfish test failed"
-#~ msgstr "E819: test Blowfisha nie powi๓dณ si๊"
-
-#~ msgid "Patch file"
-#~ msgstr "Plik ณata"
-
-#~ msgid ""
-#~ "&OK\n"
-#~ "&Cancel"
-#~ msgstr ""
-#~ "&OK\n"
-#~ "&Zako๑cz"
-
-#~ msgid "E240: No connection to Vim server"
-#~ msgstr "E240: Brak poณฑczenia z serwerem Vim"
-
-#~ msgid "E241: Unable to send to %s"
-#~ msgstr "E241: Nie mog๊ wysณaๆ do %s"
-
-#~ msgid "E277: Unable to read a server reply"
-#~ msgstr "E277: Nie mog๊ czytaๆ odpowiedzi serwera"
-
-#~ msgid "E258: Unable to send to client"
-#~ msgstr "E258: Nie mog๊ wysณaๆ do klienta"
-
-#~ msgid "Save As"
-#~ msgstr "Zapisz jako"
-
-#~ msgid "Source Vim script"
-#~ msgstr "Wczytaj skrypt Vima"
-
-#~ msgid "Edit File"
-#~ msgstr "Edytuj Plik"
-
-#~ msgid " (NOT FOUND)"
-#~ msgstr " (NIE ZNALEZIONO)"
-
-#~ msgid "unknown"
-#~ msgstr "nieznany"
-
-#~ msgid "Edit File in new window"
-#~ msgstr "Edytuj plik w nowym oknie"
-
-#~ msgid "Append File"
-#~ msgstr "Doณฑcz plik"
-
-#~ msgid "Window position: X %d, Y %d"
-#~ msgstr "Pozycja okna: X %d, Y %d"
-
-#~ msgid "Save Redirection"
-#~ msgstr "Zapisz przekierowanie"
-
-#~ msgid "Save View"
-#~ msgstr "Zapisz widok"
-
-#~ msgid "Save Session"
-#~ msgstr "Zapisz sesj๊"
-
-#~ msgid "Save Setup"
-#~ msgstr "Zapisz ustawienia"
-
-#~ msgid "E809: #< is not available without the +eval feature"
-#~ msgstr "E809: #< nie jest dost๊pne bez wณaถciwoถci +eval"
-
-#~ msgid "E196: No digraphs in this version"
-#~ msgstr "E196: Brak dwugraf๓w w tej wersji"
-
-#~ msgid "is a device (disabled with 'opendevice' option)"
-#~ msgstr "jest urzฑdzeniem (wyณฑczonym w opcji 'opendevice')"
-
-#~ msgid "Reading from stdin..."
-#~ msgstr "Wczytywanie ze stdin..."
-
-#~ msgid "[blowfish]"
-#~ msgstr "[blowfish]"
-
-#~ msgid "[crypted]"
-#~ msgstr "[zakodowane]"
-
-#~ msgid "E821: File is encrypted with unknown method"
-#~ msgstr "E821: Plik zaszyfrowano w nieznany spos๓b"
-
-#~ msgid "NetBeans disallows writes of unmodified buffers"
-#~ msgstr "NetBeans nie pozwala na zapis niezmodyfikowanych bufor๓w"
-
-#~ msgid "Partial writes disallowed for NetBeans buffers"
-#~ msgstr "Cz๊ถciowy zapis niemoฟliwy dla bufor๓w NetBeans"
-
-#~ msgid "writing to device disabled with 'opendevice' option"
-#~ msgstr "zapisywanie do urzฑdzenia wyณฑczone w opcji 'opendevice'"
-
-#~ msgid "E460: The resource fork would be lost (add ! to override)"
-#~ msgstr "E460: Rozdziaณ zasob๓w zostanie utracony (wymuถ przez !)"
-
-#~ msgid "<cannot open> "
-#~ msgstr "<nie mog๊ otworzyๆ> "
-
-#~ msgid "E616: vim_SelFile: can't get font %s"
-#~ msgstr "E616: vim_SelFile: nie mog๊ otrzymaๆ czcionki %s"
-
-#~ msgid "E614: vim_SelFile: can't return to current directory"
-#~ msgstr "E614: vim_SelFile: nie mog๊ powr๓ciๆ do bieฟฑcego katalogu"
-
-#~ msgid "Pathname:"
-#~ msgstr "Trop:"
-
-#~ msgid "E615: vim_SelFile: can't get current directory"
-#~ msgstr "E615: vim_SelFile: nie mog๊ otrzymaๆ bieฟฑcego katalogu"
-
-#~ msgid "OK"
-#~ msgstr "OK"
-
-#~ msgid "Cancel"
-#~ msgstr "Zako๑cz"
-
-#~ msgid "Vim dialog"
-#~ msgstr "VIM - Dialog"
-
-#~ msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
-#~ msgstr ""
-#~ "Scrollbar Widget: Nie mogณem otrzymaๆ rozmiar๓w rysunku na przycisku."
-
-#~ msgid "E232: Cannot create BalloonEval with both message and callback"
-#~ msgstr "E232: Nie mog๊ stworzyๆ BalloonEval z powiadomieniem i wywoณaniem"
-
-#~ msgid "E851: Failed to create a new process for the GUI"
-#~ msgstr "E851: Nie mogณem stworzyๆ nowego procesu dla GUI"
-
-#~ msgid "E852: The child process failed to start the GUI"
-#~ msgstr "E852: Proces potomny nie m๓gณ uruchomiๆ GUI"
-
-#~ msgid "E229: Cannot start the GUI"
-#~ msgstr "E229: Nie mog๊ odpaliๆ GUI"
-
-#~ msgid "E230: Cannot read from \"%s\""
-#~ msgstr "E230: Nie mog๊ czytaๆ z \"%s\""
-
-#~ msgid "E665: Cannot start GUI, no valid font found"
-#~ msgstr "E665: Nie moฟna uruchomiๆ GUI, brak prawidณowej czcionki"
-
-#~ msgid "E231: 'guifontwide' invalid"
-#~ msgstr "E231: Niewณaถciwe 'guifontwide'"
-
-#~ msgid "E599: Value of 'imactivatekey' is invalid"
-#~ msgstr "E599: Nieprawidณowa wartoถๆ 'imactivatekey'"
-
-#~ msgid "E254: Cannot allocate color %s"
-#~ msgstr "E254: Nie mog๊ zarezerwowaๆ koloru %s"
-
-#~ msgid "No match at cursor, finding next"
-#~ msgstr "Brak dopasowania przy kursorze, szukam dalej"
-
-#~ msgid "Input _Methods"
-#~ msgstr "Input _Methods"
-
-#~ msgid "VIM - Search and Replace..."
-#~ msgstr "VIM - Szukaj i Zamie๑..."
-
-#~ msgid "VIM - Search..."
-#~ msgstr "VIM - Szukaj..."
-
-#~ msgid "Find what:"
-#~ msgstr "Znajdผ:"
-
-#~ msgid "Replace with:"
-#~ msgstr "Zamie๑ na:"
-
-#~ msgid "Match whole word only"
-#~ msgstr "Dopasuj tylko caณe wyrazy"
-
-#~ msgid "Match case"
-#~ msgstr "Dopasuj wielkoถๆ liter"
-
-#~ msgid "Direction"
-#~ msgstr "Kierunek"
-
-#~ msgid "Up"
-#~ msgstr "W g๓r๊"
-
-#~ msgid "Down"
-#~ msgstr "W d๓ณ"
-
-#~ msgid "Find Next"
-#~ msgstr "Znajdผ nast๊pne"
-
-#~ msgid "Replace"
-#~ msgstr "Zamie๑"
-
-#~ msgid "Replace All"
-#~ msgstr "Zamie๑ wszystkie"
-
-#~ msgid "Vim: Received \"die\" request from session manager\n"
-#~ msgstr "Vim: otrzymano ฟฑdanie \"die\" od menedฟera sesji\n"
-
-#~ msgid "Close"
-#~ msgstr "Zamknij"
-
-#~ msgid "New tab"
-#~ msgstr "Nowa karta"
-
-#~ msgid "Open Tab..."
-#~ msgstr "Otw๓rz kart๊..."
-
-#~ msgid "Vim: Main window unexpectedly destroyed\n"
-#~ msgstr "Vim: Gณ๓wne okno nieoczekiwanie zniszczone\n"
-
-#~ msgid "&Filter"
-#~ msgstr "&Filtr"
-
-#~ msgid "&Cancel"
-#~ msgstr "&Anuluj"
-
-#~ msgid "Directories"
-#~ msgstr "Katalogi"
-
-#~ msgid "Filter"
-#~ msgstr "Filtr"
-
-#~ msgid "&Help"
-#~ msgstr "&Pomoc"
-
-#~ msgid "Files"
-#~ msgstr "Pliki"
-
-#~ msgid "&OK"
-#~ msgstr "&OK"
-
-#~ msgid "Selection"
-#~ msgstr "Wyb๓r"
-
-#~ msgid "Find &Next"
-#~ msgstr "Znajdผ &nast๊pne"
-
-#~ msgid "&Replace"
-#~ msgstr "&Zamie๑"
-
-#~ msgid "Replace &All"
-#~ msgstr "Zamie๑ &wszystko"
-
-#~ msgid "&Undo"
-#~ msgstr "&Cofnij"
-
-#~ msgid "E671: Cannot find window title \"%s\""
-#~ msgstr "E671: Nie mog๊ znaleผๆ tytuณu okna \"%s\""
-
-#~ msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
-#~ msgstr "E243: Argument nie jest wspomagany: \"-%s\"; Uฟywaj wersji OLE."
-
-#~ msgid "E672: Unable to open window inside MDI application"
-#~ msgstr "E672: Nie moฟna otworzyๆ okna wewnฑtrz aplikacji MDI"
-
-#~ msgid "Close tab"
-#~ msgstr "Zamknij kart๊"
-
-#~ msgid "Open tab..."
-#~ msgstr "Otw๓rz kart๊..."
-
-#~ msgid "Find string (use '\\\\' to find a '\\')"
-#~ msgstr "Znajdผ ciฑg (uฟyj '\\\\' do szukania '\\')"
-
-#~ msgid "Find & Replace (use '\\\\' to find a '\\')"
-#~ msgstr "Szukanie i Zamiana (uฟyj '\\\\' do szukania '\\')"
-
-#~ msgid "Not Used"
-#~ msgstr "Nie uฟywany"
-
-#~ msgid "Directory\t*.nothing\n"
-#~ msgstr "Katalog\t*.nic\n"
-
-#~ msgid ""
-#~ "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
-#~ msgstr ""
-#~ "Vim E458: Nie mog๊ zarezerwowaๆ mapy kolor๓w, pewne kolory mogฑ byๆ "
-#~ "nieprawidณowe"
-
-#~ msgid "E250: Fonts for the following charsets are missing in fontset %s:"
-#~ msgstr ""
-#~ "E250: Brak czcionek dla nast๊pujฑcych zestaw๓w znak๓w w zestawie czcionek "
-#~ "%s:"
-
-#~ msgid "E252: Fontset name: %s"
-#~ msgstr "E252: Nazwa zestawu czcionek: %s"
-
-#~ msgid "Font '%s' is not fixed-width"
-#~ msgstr "Czcionka '%s' nie posiada znak๓w jednolitej szerokoถci"
-
-#~ msgid "E253: Fontset name: %s"
-#~ msgstr "E253: Nazwa zestawu czcionek: %s"
-
-#~ msgid "Font0: %s"
-#~ msgstr "Font0: %s"
-
-#~ msgid "Font1: %s"
-#~ msgstr "Font1: %s"
-
-#~ msgid "Font%<PRId64> width is not twice that of font0"
-#~ msgstr "Szerokoถๆ font%<PRId64> nie jest podw๓jnฑ szerokoถciฑ font0"
-
-#~ msgid "Font0 width: %<PRId64>"
-#~ msgstr "Szerokoถๆ font0: %<PRId64>"
-
-#~ msgid "Font1 width: %<PRId64>"
-#~ msgstr "Szerokoถๆ font1: %<PRId64>"
-
-#~ msgid "Invalid font specification"
-#~ msgstr "Nieprawidณowy opis czcionki"
-
-#~ msgid "&Dismiss"
-#~ msgstr "&Anuluj"
-
-#~ msgid "no specific match"
-#~ msgstr "brak okreถlonego dopasowania"
-
-#~ msgid "Vim - Font Selector"
-#~ msgstr "Vim - wyb๓r czcionki"
-
-#~ msgid "Name:"
-#~ msgstr "Nazwa:"
-
-#~ msgid "Show size in Points"
-#~ msgstr "Pokaฟ wielkoถๆ w punktach"
-
-#~ msgid "Encoding:"
-#~ msgstr "Kodowanie:"
-
-#~ msgid "Font:"
-#~ msgstr "Czcionka:"
-
-#~ msgid "Style:"
-#~ msgstr "Styl:"
-
-#~ msgid "Size:"
-#~ msgstr "Wielkoถๆ:"
-
-#~ msgid "E256: Hangul automata ERROR"
-#~ msgstr "E256: BฃกD w automacie Hangul"
-
-#~ msgid "E563: stat error"
-#~ msgstr "E563: bณฑd stat"
-
-#~ msgid "E625: cannot open cscope database: %s"
-#~ msgstr "E625: nie mog๊ otworzyๆ bazy danych cscope: %s"
-
-#~ msgid "E626: cannot get cscope database information"
-#~ msgstr "E626: nie mog๊ uzyskaๆ informacji z bazy danych cscope"
-
-#~ msgid "Lua library cannot be loaded."
-#~ msgstr "Nie moฟna wczytaๆ biblioteki Lua."
-
-#~ msgid "cannot save undo information"
-#~ msgstr "nie mog๊ zachowaๆ informacji cofania"
-
-#~ msgid ""
-#~ "E815: Sorry, this command is disabled, the MzScheme libraries could not "
-#~ "be loaded."
-#~ msgstr ""
-#~ "E815: Przykro mi, ta komenda jest wyณฑczona, biblioteka MzScheme nie moฟe "
-#~ "byๆ zaณadowana."
-
-#~ msgid "invalid expression"
-#~ msgstr "niepoprawne wyraฟenie"
-
-#~ msgid "expressions disabled at compile time"
-#~ msgstr "wyraฟenia wyณฑczone podczas kompilacji"
-
-#~ msgid "hidden option"
-#~ msgstr "ukryta opcja"
-
-#~ msgid "unknown option"
-#~ msgstr "nieznana opcja"
-
-#~ msgid "window index is out of range"
-#~ msgstr "indeks okna poza zakresem"
-
-#~ msgid "couldn't open buffer"
-#~ msgstr "nie mog๊ otworzyๆ bufora"
-
-#~ msgid "cannot delete line"
-#~ msgstr "nie mog๊ skasowaๆ wiersza"
-
-#~ msgid "cannot replace line"
-#~ msgstr "nie mog๊ zamieniๆ wiersza"
-
-#~ msgid "cannot insert line"
-#~ msgstr "nie mog๊ wprowadziๆ wiersza"
-
-#~ msgid "string cannot contain newlines"
-#~ msgstr "ciฑg nie moฟe zawieraๆ znak๓w nowego wiersza"
-
-#~ msgid "error converting Scheme values to Vim"
-#~ msgstr "bณฑd przy konwersji wartoถci Scheme do Vima"
-
-#~ msgid "Vim error: ~a"
-#~ msgstr "Bณฑd vima: ~a"
-
-#~ msgid "Vim error"
-#~ msgstr "Bณฑd Vima"
-
-#~ msgid "buffer is invalid"
-#~ msgstr "bufor jest niewaฟny"
-
-#~ msgid "window is invalid"
-#~ msgstr "okno jest niewaฟne"
-
-#~ msgid "linenr out of range"
-#~ msgstr "numer wiersza poza zakresem"
-
-#~ msgid "not allowed in the Vim sandbox"
-#~ msgstr "Niedozwolone w piaskownicy Vima"
-
-#~ msgid "E837: This Vim cannot execute :py3 after using :python"
-#~ msgstr "E837: Python: nie moฟna uฟywaๆ :py i :py3 w czasie jednej sesji"
-
-#~ msgid ""
-#~ "E263: Sorry, this command is disabled, the Python library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E263: Przykro mi, ta komenda jest wyณฑczona, bo nie moฟna zaณadowaๆ "
-#~ "biblioteki Pythona"
-
-#~ msgid "E836: This Vim cannot execute :python after using :py3"
-#~ msgstr "E836: Python: nie moฟna uฟywaๆ :py i :py3 w czasie jednej sesji"
-
-#~ msgid "E659: Cannot invoke Python recursively"
-#~ msgstr "E659: Nie moฟna wywoณaๆ Pythona rekursywnie"
-
-#~ msgid "E265: $_ must be an instance of String"
-#~ msgstr "E265: $_ musi byๆ reprezentacjฑ ฃa๑cucha"
-
-#~ msgid ""
-#~ "E266: Sorry, this command is disabled, the Ruby library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E266: Przykro mi, ta komenda jest wyณฑczona, bo nie moฟna zaณadowaๆ "
-#~ "biblioteki Ruby."
-
-#~ msgid "E267: unexpected return"
-#~ msgstr "E267: nieoczekiwany return"
-
-#~ msgid "E268: unexpected next"
-#~ msgstr "E268: nieoczekiwany next"
-
-#~ msgid "E269: unexpected break"
-#~ msgstr "E269: nieoczekiwany break"
-
-#~ msgid "E270: unexpected redo"
-#~ msgstr "E270: nieoczekiwane redo"
-
-#~ msgid "E271: retry outside of rescue clause"
-#~ msgstr "E271: ponowna pr๓ba poza klauzulฑ ratunku"
-
-#~ msgid "E272: unhandled exception"
-#~ msgstr "E272: nieobsณugiwany wyjฑtek"
-
-#~ msgid "E273: unknown longjmp status %d"
-#~ msgstr "E273: Nieznany status longjmp %d"
-
-#~ msgid "Toggle implementation/definition"
-#~ msgstr "Przeณฑcz mi๊dzy implementacjฑ/okreถleniem"
-
-#~ msgid "Show base class of"
-#~ msgstr "Pokaฟ baz๊ klasy"
-
-#~ msgid "Show overridden member function"
-#~ msgstr "Pokaฟ przepisanฑ funkcj๊ czณonowฑ"
-
-#~ msgid "Retrieve from file"
-#~ msgstr "Pobieraj z pliku"
-
-#~ msgid "Retrieve from project"
-#~ msgstr "Pobieraj z projektu"
-
-#~ msgid "Retrieve from all projects"
-#~ msgstr "Pobieraj z wszystkich projekt๓w"
-
-#~ msgid "Retrieve"
-#~ msgstr "Pobierz"
-
-#~ msgid "Show source of"
-#~ msgstr "Pokaฟ ผr๓dณo dla"
-
-#~ msgid "Find symbol"
-#~ msgstr "Znajdผ symbol"
-
-#~ msgid "Browse class"
-#~ msgstr "Przejrzyj klas๊"
-
-#~ msgid "Show class in hierarchy"
-#~ msgstr "Pokaฟ klas๊ w hierarchii"
-
-#~ msgid "Show class in restricted hierarchy"
-#~ msgstr "Pokaฟ klas๊ w ograniczonej hierarchii"
-
-#~ msgid "Xref refers to"
-#~ msgstr "Xref odnosi si๊ do"
-
-#~ msgid "Xref referred by"
-#~ msgstr "Xref ma odniesienia od"
-
-#~ msgid "Xref has a"
-#~ msgstr "Xref ma"
-
-#~ msgid "Xref used by"
-#~ msgstr "Xref uฟyte przez"
-
-#~ msgid "Show docu of"
-#~ msgstr "Pokaฟ dokumentacj๊ dla"
-
-#~ msgid "Generate docu for"
-#~ msgstr "Utw๓rz dokumentacj๊ dla"
-
-#~ msgid ""
-#~ "Cannot connect to SNiFF+. Check environment (sniffemacs must be found in "
-#~ "$PATH).\n"
-#~ msgstr ""
-#~ "Nie mog๊ podณฑczyๆ do SNiFF+. Sprawdผ ถrodowisko (sniffemacs musi byๆ "
-#~ "odnaleziony w $PATH).\n"
-
-#~ msgid "E274: Sniff: Error during read. Disconnected"
-#~ msgstr "E274: Sniff: Bณฑd podczas czytania. Rozณฑczenie"
-
-#~ msgid "SNiFF+ is currently "
-#~ msgstr "SNiFF+ jest obecnie "
-
-#~ msgid "not "
-#~ msgstr "nie "
-
-#~ msgid "connected"
-#~ msgstr "podณฑczony"
-
-#~ msgid "E275: Unknown SNiFF+ request: %s"
-#~ msgstr "E275: Nieznane zapytanie SNiFF+: %s"
-
-#~ msgid "E276: Error connecting to SNiFF+"
-#~ msgstr "E276: Bณฑd w trakcie podณฑczania do SNiFF+"
-
-#~ msgid "E278: SNiFF+ not connected"
-#~ msgstr "E278: SNiFF+ niepodณฑczony"
-
-#~ msgid "E279: Not a SNiFF+ buffer"
-#~ msgstr "E279: Nie jest buforem SNiFF+"
-
-#~ msgid "Sniff: Error during write. Disconnected"
-#~ msgstr "Sniff: Bณฑd w trakcie zapisu. Rozณฑczony"
-
-#~ msgid "invalid buffer number"
-#~ msgstr "niewณaถciwy numer bufora"
-
-#~ msgid "not implemented yet"
-#~ msgstr "obecnie nie zaimplementowano"
-
-#~ msgid "cannot set line(s)"
-#~ msgstr "nie mog๊ ustawiๆ wiersza(y)"
-
-#~ msgid "invalid mark name"
-#~ msgstr "niepoprawna nazwa zakณadki"
-
-#~ msgid "mark not set"
-#~ msgstr "zakณadka nie ustawiona"
-
-#~ msgid "row %d column %d"
-#~ msgstr "wiersz %d kolumna %d"
-
-#~ msgid "cannot insert/append line"
-#~ msgstr "nie mog๊ wprowadziๆ/doณฑczyๆ wiersza"
-
-#~ msgid "line number out of range"
-#~ msgstr "numer wiersza poza zakresem"
-
-#~ msgid "unknown flag: "
-#~ msgstr "nieznana flaga: "
-
-#~ msgid "unknown vimOption"
-#~ msgstr "nieznane vimOption"
-
-#~ msgid "keyboard interrupt"
-#~ msgstr "przerwanie klawiatury"
-
-#~ msgid "vim error"
-#~ msgstr "bณฑd vima"
-
-#~ msgid "cannot create buffer/window command: object is being deleted"
-#~ msgstr "nie mog๊ stworzyๆ bufora/okna komendy: obiekt jest kasowany"
-
-#~ msgid ""
-#~ "cannot register callback command: buffer/window is already being deleted"
-#~ msgstr ""
-#~ "nie mog๊ zarejestrowaๆ wstecznego wywoณania komendy: bufor/okno juฟ "
-#~ "zostaณa skasowana"
-
-#~ msgid ""
-#~ "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-"
-#~ "dev@vim.org"
-#~ msgstr ""
-#~ "E280: TCL FATALNY BฃกD: reflist zepsuta!? Prosz๊ zณoฟyๆ raport o tym na "
-#~ "vim-dev@vim.org"
-
-#~ msgid "cannot register callback command: buffer/window reference not found"
-#~ msgstr ""
-#~ "nie mog๊ zarejestrowaๆ wstecznego wywoณania komendy: brak odniesienia do "
-#~ "bufora/okna"
-
-#~ msgid ""
-#~ "E571: Sorry, this command is disabled: the Tcl library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E571: Przykro mi, ta komenda jest wyณฑczona, bo nie moฟna zaณadowaๆ "
-#~ "biblioteki Tcl."
-
-#~ msgid "E572: exit code %d"
-#~ msgstr "E572: kod wyjถcia %d"
-
-#~ msgid "cannot get line"
-#~ msgstr "nie mog๊ dostaๆ wiersza"
-
-#~ msgid "Unable to register a command server name"
-#~ msgstr "Nie mog๊ zarejestrowaๆ nazwy serwera komend"
-
-#~ msgid "E248: Failed to send command to the destination program"
-#~ msgstr "E248: Wysณanie komendy do programu docelowego nie powiodณo si๊"
-
-#~ msgid "E573: Invalid server id used: %s"
-#~ msgstr "E573: Uฟyto niewณaถciwego id serwera: %s"
-
-#~ msgid "E251: VIM instance registry property is badly formed. Deleted!"
-#~ msgstr ""
-#~ "E251: wcielenia instancji rejestru Vima jest ผle sformowane. Skasowano!"
-
-#~ msgid "netbeans is not supported with this GUI\n"
-#~ msgstr "netbeans nie sฑ obsณugiwane przez to GUI\n"
-
-#~ msgid "This Vim was not compiled with the diff feature."
-#~ msgstr "Ta wersja Vima nie byณa skompilowanego z opcjฑ r๓ฟnic (diff)."
-
-#~ msgid "'-nb' cannot be used: not enabled at compile time\n"
-#~ msgstr "'-nb' - nie moฟe byๆ uฟyte: nie wณฑczone przy kompilacji\n"
-
-#~ msgid "Vim: Error: Failure to start gvim from NetBeans\n"
-#~ msgstr "Vim: Bณฑd: Nie moฟna uruchomiๆ gvim z NetBeans\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Where case is ignored prepend / to make flag upper case"
-#~ msgstr ""
-#~ "\n"
-#~ "gdzie wielkoถๆ znak๓w jest ignorowana dodaj na poczฑtku / by flaga byณa "
-#~ "wielkฑ literฑ"
-
-#~ msgid "-register\t\tRegister this gvim for OLE"
-#~ msgstr "-register\t\tZarejestruj tego gvima w OLE"
-
-#~ msgid "-unregister\t\tUnregister gvim for OLE"
-#~ msgstr "-unregister\t\tWyrejestruj gvima z OLE"
-
-#~ msgid "-g\t\t\tRun using GUI (like \"gvim\")"
-#~ msgstr "-g\t\t\tStartuj w GUI (tak jak \"gvim\")"
-
-#~ msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
-#~ msgstr "-f lub --nofork\tPierwszy plan: Nie wydzielaj przy odpalaniu GUI"
-
-#~ msgid "-f\t\t\tDon't use newcli to open window"
-#~ msgstr "-f\t\t\tNie stosuj newcli do otwierania okien"
-
-#~ msgid "-dev <device>\t\tUse <device> for I/O"
-#~ msgstr "-dev <device>\t\tUฟywaj <device> do I/O"
-
-#~ msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
-#~ msgstr "-U <gvimrc>\t\tUฟyj <gvimrc> zamiast jakiegokolwiek .gvimrc"
-
-#~ msgid "-x\t\t\tEdit encrypted files"
-#~ msgstr "-x\t\t\tEdytuj zakodowane pliki"
-
-#~ msgid "-display <display>\tConnect vim to this particular X-server"
-#~ msgstr "-display <display>\tPodณฑcz vima to danego X-serwera"
-
-#~ msgid "-X\t\t\tDo not connect to X server"
-#~ msgstr "-X\t\t\tNie ณฑcz z serwerem X"
-
-#~ msgid "--remote <files>\tEdit <files> in a Vim server if possible"
-#~ msgstr "--remote <pliki>\tEdytuj pliki w serwerze Vima jeถli moฟliwe"
-
-#~ msgid "--remote-silent <files> Same, don't complain if there is no server"
-#~ msgstr "--remote-silent <pliki> To samo, nie narzekaj jeถli nie ma serwera"
-
-#~ msgid ""
-#~ "--remote-wait <files> As --remote but wait for files to have been edited"
-#~ msgstr ""
-#~ "--remote-wait <pliki>\tTak jak --remote, lecz czekaj na pliki przed edycjฑ"
-
-#~ msgid ""
-#~ "--remote-wait-silent <files> Same, don't complain if there is no server"
-#~ msgstr ""
-#~ "--remote-wait-silent <pliki> To samo, nie narzekaj jeถli nie ma serwera"
-
-#~ msgid ""
-#~ "--remote-tab[-wait][-silent] <files> As --remote but use tab page per "
-#~ "file"
-#~ msgstr ""
-#~ "--remote-tab[-wait][-silent] <pliki> tak jak --remote ale uฟywa jednej "
-#~ "karty na plik"
-
-#~ msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
-#~ msgstr ""
-#~ "--remote-send <klawisze>\tWyถlij <klawisze> do serwera Vima i zako๑cz"
-
-#~ msgid ""
-#~ "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
-#~ msgstr "--remote-expr <wyr>\tWykonaj <wyraฟenie> w serwerze i wypisz wynik"
-
-#~ msgid "--serverlist\t\tList available Vim server names and exit"
-#~ msgstr "--serverlist\t\tWymie๑ nazwy dost๊pnych serwer๓w Vima i zako๑cz"
-
-#~ msgid "--servername <name>\tSend to/become the Vim server <name>"
-#~ msgstr "--servername <nazwa>\t\tOdsyณaj do/sta๑ si๊ serwerem Vim <nazwa>"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Motif version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Argumenty rozpoznawane przez gvim (wersja Motif):\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (neXtaw version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Argumenty rozpoznawane przez gvim (wersja neXtaw):\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Athena version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Argumenty rozpoznawane przez gvim (wersja Athena):\n"
-
-#~ msgid "-display <display>\tRun vim on <display>"
-#~ msgstr "-display <display>\tZaณaduj vim na <display>"
-
-#~ msgid "-iconic\t\tStart vim iconified"
-#~ msgstr "-iconic\t\tZacznij Vim jako ikon๊"
-
-#~ msgid "-background <color>\tUse <color> for the background (also: -bg)"
-#~ msgstr "-background <kolor>\tUฟywaj <kolor> dla tณa (r๓wnieฟ: -bg)"
-
-#~ msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
-#~ msgstr ""
-#~ "-foreground <kolor>\tUฟywaj <kolor> dla normalnego tekstu (r๓wnieฟ: -fg)"
-
-#~ msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
-#~ msgstr "-font <font>\t\tUฟywaj <font> dla normalnego tekstu (r๓wnieฟ: -fn)"
-
-#~ msgid "-boldfont <font>\tUse <font> for bold text"
-#~ msgstr "-boldfont <font>\tUฟywaj <font> dla wytณuszczonego tekstu"
-
-#~ msgid "-italicfont <font>\tUse <font> for italic text"
-#~ msgstr "-italicfont <font>\tUฟywaj <font> dla pochyณego"
-
-#~ msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
-#~ msgstr ""
-#~ "-geometry <geom>\tUฟywaj <geom> dla poczฑtkowych rozmiar๓w (r๓wnieฟ: -"
-#~ "geom)"
-
-#~ msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
-#~ msgstr "-borderwidth <szer>\tUฟyj ramki o gruboถci <szer> (r๓wnieฟ: -bw)"
-
-#~ msgid ""
-#~ "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
-#~ msgstr ""
-#~ "-scrollbarwidth <szer> Uฟywaj przewijacza o szerokoถci <szer> (r๓wnieฟ: -"
-#~ "sw)"
-
-#~ msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
-#~ msgstr ""
-#~ "-menuheight <height>\tStosuj belk๊ menu o wysokoถci <height> (r๓wnieฟ: -"
-#~ "mh)"
-
-#~ msgid "-reverse\t\tUse reverse video (also: -rv)"
-#~ msgstr "-reverse\t\tStosuj negatyw kolor๓w (r๓wnieฟ: -rv)"
-
-#~ msgid "+reverse\t\tDon't use reverse video (also: +rv)"
-#~ msgstr "+reverse\t\tNie stosuj negatywu kolor๓w (r๓wnieฟ: +rv)"
-
-#~ msgid "-xrm <resource>\tSet the specified resource"
-#~ msgstr "-xrm <resource>\tUstaw okreถlony zas๓b"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (GTK+ version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Argumenty rozpoznawane przez gvim (wersja GTK+):\n"
-
-#~ msgid "-display <display>\tRun vim on <display> (also: --display)"
-#~ msgstr "-display <display>\tZastartuj vim na <display> (r๓wnieฟ: --display)"
-
-#~ msgid "--role <role>\tSet a unique role to identify the main window"
-#~ msgstr "--role <role>\tUstaw unikatowฑ rol๊ do identyfikacji gณ๓wnego okna"
-
-#~ msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
-#~ msgstr "--socketid <xid>\tOtw๓rz Vim wewnฑtrz innego widgetu GTK"
-
-#~ msgid "--echo-wid\t\tMake gvim echo the Window ID on stdout"
-#~ msgstr "-echo-wid\t\tGvim wypisze Window ID na wyjถcie standardowe"
-
-#~ msgid "-P <parent title>\tOpen Vim inside parent application"
-#~ msgstr "-P <tytuณ rodzica>\tOtw๓rz Vima wewnฑtrz rodzicielskiej aplikacji"
-
-#~ msgid "--windowid <HWND>\tOpen Vim inside another win32 widget"
-#~ msgstr "--windowid <HWND>\tOtw๓rz Vima wewnฑtrz innego elementu win32"
-
-#~ msgid "No display"
-#~ msgstr "Brak display"
-
-#~ msgid ": Send failed.\n"
-#~ msgstr ": Wysณanie nie powiodณo si๊.\n"
-
-#~ msgid ": Send failed. Trying to execute locally\n"
-#~ msgstr ": Wysณanie nie powiodณo si๊. Pr๓buj๊ wykonaๆ na miejscu\n"
-
-#~ msgid "%d of %d edited"
-#~ msgstr "otworzono %d z %d"
-
-#~ msgid "No display: Send expression failed.\n"
-#~ msgstr "Brak terminala: Wysณanie wyraฟenia nie powiodณo si๊.\n"
-
-#~ msgid ": Send expression failed.\n"
-#~ msgstr ": Wysณanie wyraฟenia nie powiodณo si๊.\n"
-
-#~ msgid "E543: Not a valid codepage"
-#~ msgstr "E543: To nie jest waฟna strona kodowa"
-
-#~ msgid "E284: Cannot set IC values"
-#~ msgstr "E284: Nie mog๊ nastawiๆ wartoถci IC"
-
-#~ msgid "E285: Failed to create input context"
-#~ msgstr "E285: Nie mogณem stworzyๆ kontekstu wprowadze๑"
-
-#~ msgid "E286: Failed to open input method"
-#~ msgstr "E286: Nie mogณem otworzyๆ sposobu wprowadze๑"
-
-#~ msgid "E287: Warning: Could not set destroy callback to IM"
-#~ msgstr "E287: OSTRZEฏENIE: Nie mogณem zlikwidowaๆ wywoณania dla IM"
-
-#~ msgid "E288: input method doesn't support any style"
-#~ msgstr "E288: metoda wprowadze๑ nie wspomaga ฟadnego stylu"
-
-#~ msgid "E289: input method doesn't support my preedit type"
-#~ msgstr "E289: metoda wprowadze๑ nie wspomaga mojego typu preedit"
-
-#~ msgid "E843: Error while updating swap file crypt"
-#~ msgstr "E843: Bณฑd w czasie uaktualniania szyfrowania pliku wymiany"
-
-#~ msgid ""
-#~ "E833: %s is encrypted and this version of Vim does not support encryption"
-#~ msgstr "E833: %s jest zaszyfrowany a ta wersja Vima nie wspiera szyfrowania"
-
-#~ msgid "Swap file is encrypted: \"%s\""
-#~ msgstr "Zaszyfrowany plik wymiany: \"%s\""
-
-#~ msgid ""
-#~ "\n"
-#~ "If you entered a new crypt key but did not write the text file,"
-#~ msgstr ""
-#~ "\n"
-#~ "Jeถli podano nowy klucz szyfrujฑcy, ale nie zapisano pliku tekstowego,"
-
-#~ msgid ""
-#~ "\n"
-#~ "enter the new crypt key."
-#~ msgstr ""
-#~ "\n"
-#~ "wprowadผ nowy klucz szyfrujฑcy."
-
-#~ msgid ""
-#~ "\n"
-#~ "If you wrote the text file after changing the crypt key press enter"
-#~ msgstr ""
-#~ "\n"
-#~ "Jeถli zapisano plik tekstowy po zmianie klucza szyfrujฑcego wciถnij Enter"
-
-#~ msgid ""
-#~ "\n"
-#~ "to use the same key for text file and swap file"
-#~ msgstr ""
-#~ "\n"
-#~ "aby uฟyๆ tego samego klucza dla pliku tekstowego i wymiany"
-
-#~ msgid "Using crypt key from swap file for the text file.\n"
-#~ msgstr "Uฟywam klucza szyfrujฑcego z pliku wymiany do pliku tekstowego.\n"
-
-#~ msgid ""
-#~ "\n"
-#~ " [not usable with this version of Vim]"
-#~ msgstr ""
-#~ "\n"
-#~ " [nie nadaje si๊ dla tej wersji Vima]"
-
-#~ msgid "Tear off this menu"
-#~ msgstr "Oderwij to menu"
-
-#~ msgid "Select Directory dialog"
-#~ msgstr "Dialog wyboru katalogu"
-
-#~ msgid "Save File dialog"
-#~ msgstr "Dialog zapisywania pliku"
-
-#~ msgid "Open File dialog"
-#~ msgstr "Dialog otwierania pliku"
-
-#~ msgid "E338: Sorry, no file browser in console mode"
-#~ msgstr "E338: Przykro mi, nie ma przeglฑdarki plik๓w w trybie konsoli"
-
-#~ msgid "Vim: preserving files...\n"
-#~ msgstr "Vim: zachowuj๊ plik...\n"
-
-#~ msgid "Vim: Finished.\n"
-#~ msgstr "Vim: Zako๑czono.\n"
-
-#~ msgid "ERROR: "
-#~ msgstr "BฃกD: "
-
-#~ msgid ""
-#~ "\n"
-#~ "[bytes] total alloc-freed %<PRIu64>-%<PRIu64>, in use %<PRIu64>, peak use "
-#~ "%<PRIu64>\n"
-#~ msgstr ""
-#~ "\n"
-#~ "[bajt๓w] totalne alokacje-zwolnienia %<PRIu64>-%<PRIu64>, w uฟytku "
-#~ "%<PRIu64>, maksymalne uฟycie %<PRIu64>\n"
-
-#~ msgid ""
-#~ "[calls] total re/malloc()'s %<PRIu64>, total free()'s %<PRIu64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "[wywoณania] wszystkich re/malloc()-๓w %<PRIu64>, wszystkich free()-๓w "
-#~ "%<PRIu64>\n"
-#~ "\n"
-
-#~ msgid "E340: Line is becoming too long"
-#~ msgstr "E340: Wiersz staje si๊ zbyt dณugi"
-
-#~ msgid "E341: Internal error: lalloc(%<PRId64>, )"
-#~ msgstr "E341: Wewn๊trzny bณฑd: lalloc(%<PRId64>, )"
-
-#~ msgid "E547: Illegal mouseshape"
-#~ msgstr "E547: Niedozwolony obrys myszki"
-
-#~ msgid "Enter encryption key: "
-#~ msgstr "Wprowadผ klucz do odkodowania: "
-
-#~ msgid "Enter same key again: "
-#~ msgstr "Wprowadผ ponownie ten sam klucz: "
-
-#~ msgid "Keys don't match!"
-#~ msgstr "Klucze nie pasujฑ do siebie!"
-
-#~ msgid "Cannot connect to Netbeans #2"
-#~ msgstr "Nie moฟna poณฑczyๆ z Netbeans #2"
-
-#~ msgid "Cannot connect to Netbeans"
-#~ msgstr "Nie moฟna poณฑczyๆ z Netbeans"
-
-#~ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
-#~ msgstr "E668: Bณ๊dny tryb dost๊pu pliku info poณฑczenia NetBeans: \"%s\""
-
-#~ msgid "read from Netbeans socket"
-#~ msgstr "odczyt z gniazda Netbeans"
-
-#~ msgid "E658: NetBeans connection lost for buffer %<PRId64>"
-#~ msgstr "E658: Bufor %<PRId64> utraciณ poณฑczenie z NetBeans"
-
-#~ msgid "E838: netbeans is not supported with this GUI"
-#~ msgstr "E838: netbeans nie sฑ obsณugiwane przez to GUI"
-
-#~ msgid "E511: netbeans already connected"
-#~ msgstr "E511: netbeans juฟ podณฑczone"
-
-#~ msgid "E505: %s is read-only (add ! to override)"
-#~ msgstr "E505: %s jest tylko do odczytu (dodaj ! aby wymusiๆ)"
-
-#~ msgid "E775: Eval feature not available"
-#~ msgstr "E775: Funkcjonalnoถๆ eval nie jest dost๊pna"
-
-#~ msgid "freeing %<PRId64> lines"
-#~ msgstr "zwalniam %<PRId64> wierszy"
-
-#~ msgid "E530: Cannot change term in GUI"
-#~ msgstr "E530: Nie mog๊ zmieniๆ term w GUI"
-
-#~ msgid "E531: Use \":gui\" to start the GUI"
-#~ msgstr "E531: Uฟyj \":gui\" do odpalenia GUI"
-
-#~ msgid "E617: Cannot be changed in the GTK+ 2 GUI"
-#~ msgstr "E617: Nie mog๊ zmieniๆ w GTK+2 GUI"
-
-#~ msgid "E596: Invalid font(s)"
-#~ msgstr "E596: Niedozwolona czcionka/ki"
-
-#~ msgid "E597: can't select fontset"
-#~ msgstr "E597: nie mog๊ wybraๆ zestawu czcionek"
-
-#~ msgid "E598: Invalid fontset"
-#~ msgstr "E598: Niedozwolony zestaw czcionek"
-
-#~ msgid "E533: can't select wide font"
-#~ msgstr "E533: nie mog๊ wybraๆ szerokiej czcionki"
-
-#~ msgid "E534: Invalid wide font"
-#~ msgstr "E534: Niedozwolona szeroka czcionka"
-
-#~ msgid "E538: No mouse support"
-#~ msgstr "E538: Brak wspomagania myszki"
-
-#~ msgid "cannot open "
-#~ msgstr "nie mog๊ otworzyๆ "
-
-#~ msgid "VIM: Can't open window!\n"
-#~ msgstr "VIM: Nie mog๊ otworzyๆ okna!\n"
-
-#~ msgid "Need Amigados version 2.04 or later\n"
-#~ msgstr "Potrzebuj๊ Amigados w wersji 2.04 lub p๓ผniejszฑ\n"
-
-#~ msgid "Need %s version %<PRId64>\n"
-#~ msgstr "Potrzebuj๊ %s w wersji %<PRId64>\n"
-
-#~ msgid "Cannot open NIL:\n"
-#~ msgstr "Nie mog๊ otworzyๆ NIL:\n"
-
-#~ msgid "Cannot create "
-#~ msgstr "Nie mog๊ stworzyๆ "
-
-#~ msgid "Vim exiting with %d\n"
-#~ msgstr "Vim ko๑czy prac๊ z %d\n"
-
-#~ msgid "cannot change console mode ?!\n"
-#~ msgstr "nie mog๊ zmieniๆ trybu konsoli ?!\n"
-
-#~ msgid "mch_get_shellsize: not a console??\n"
-#~ msgstr "mch_get_shellsize: nie jest konsolฑ??\n"
-
-#~ msgid "E360: Cannot execute shell with -f option"
-#~ msgstr "E360: Nie mog๊ wykonaๆ powณoki z opcjฑ -f"
-
-#~ msgid "Cannot execute "
-#~ msgstr "Nie mog๊ wykonaๆ "
-
-#~ msgid "shell "
-#~ msgstr "powณoka "
-
-#~ msgid " returned\n"
-#~ msgstr " zwr๓ciณ\n"
-
-#~ msgid "ANCHOR_BUF_SIZE too small."
-#~ msgstr "ANCHOR_BUF_SIZE zbyt niskie."
-
-#~ msgid "I/O ERROR"
-#~ msgstr "BฃกD I/O"
-
-#~ msgid "Message"
-#~ msgstr "Wiadomoถๆ"
-
-#~ msgid "'columns' is not 80, cannot execute external commands"
-#~ msgstr "'columns' nie wynosi 80, nie mog๊ wykonaๆ zewn๊trznych komend"
-
-#~ msgid "E237: Printer selection failed"
-#~ msgstr "E237: Wyb๓r drukarki nie powi๓dณ si๊"
-
-#~ msgid "to %s on %s"
-#~ msgstr "do %s z %s"
-
-#~ msgid "E613: Unknown printer font: %s"
-#~ msgstr "E613: Nieznana czcionka drukarki: %s"
-
-#~ msgid "E238: Print error: %s"
-#~ msgstr "E238: Bณฑd drukarki: %s"
-
-#~ msgid "Printing '%s'"
-#~ msgstr "Wydrukowano '%s'"
-
-#~ msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
-#~ msgstr ""
-#~ "E244: Niedozwolona nazwa zestawu znak๓w \"%s\" w nazwie czcionki \"%s\""
-
-#~ msgid "E245: Illegal char '%c' in font name \"%s\""
-#~ msgstr "E245: Niedozwolony znak '%c' w nazwie czcionki \"%s\""
-
-#~ msgid "Vim: Double signal, exiting\n"
-#~ msgstr "Vim: Podw๓jny sygnaณ, wychodz๊\n"
-
-#~ msgid "Vim: Caught deadly signal %s\n"
-#~ msgstr "Vim: Zaณapaณ ถmiertelny sygnaณ %s\n"
-
-#~ msgid "Vim: Caught deadly signal\n"
-#~ msgstr "Vim: Zaณapaณ ถmiertelny sygnaณ\n"
-
-#~ msgid "Opening the X display took %<PRId64> msec"
-#~ msgstr "Otwieranie ekranu X trwaณo %<PRId64> msec"
-
-#~ msgid ""
-#~ "\n"
-#~ "Vim: Got X error\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Vim: Dostaณ bณฑd X\n"
-
-#~ msgid "Testing the X display failed"
-#~ msgstr "Test ekranu X nie powi๓dณ si๊"
-
-#~ msgid "Opening the X display timed out"
-#~ msgstr "Pr๓ba otwarcia ekranu X trwaณa zbyt dณugo"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot execute shell sh\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Nie mog๊ wykonaๆ powณoki sh\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot create pipes\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Nie mog๊ stworzyๆ potok๓w\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot fork\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Nie mog๊ rozdzieliๆ si๊\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Command terminated\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Komenda zako๑czona\n"
-
-#~ msgid "XSMP lost ICE connection"
-#~ msgstr "XSMP straciณ poณฑczenie ICE"
-
-#~ msgid "Opening the X display failed"
-#~ msgstr "Otwarcie ekranu X nie powiodณo si๊"
-
-#~ msgid "XSMP handling save-yourself request"
-#~ msgstr "XSMP obsณuguje ฟฑdanie samozapisu"
-
-#~ msgid "XSMP opening connection"
-#~ msgstr "XSMP otwiera poณฑczenie"
-
-#~ msgid "XSMP ICE connection watch failed"
-#~ msgstr "Obserwacja poณฑczenia XSMP ICE nie powiodณa si๊"
-
-#~ msgid "XSMP SmcOpenConnection failed: %s"
-#~ msgstr "XSMP SmcOpenConnection nie powiodณo si๊: %s"
-
-#~ msgid "At line"
-#~ msgstr "W wierszu"
-
-#~ msgid "Could not load vim32.dll!"
-#~ msgstr "Nie mog๊ zaณadowaๆ vim32.dll!"
-
-#~ msgid "VIM Error"
-#~ msgstr "Bณฑd VIM"
-
-#~ msgid "Could not fix up function pointers to the DLL!"
-#~ msgstr "Nie zdoณaณem poprawiๆ wskaผnik๓w funkcji w DLL!"
-
-#~ msgid "shell returned %d"
-#~ msgstr "powณoka zwr๓ciณa %d"
-
-#~ msgid "Vim: Caught %s event\n"
-#~ msgstr "Vim: Zaณapaณ wydarzenie %s\n"
-
-#~ msgid "close"
-#~ msgstr "zamknij"
-
-#~ msgid "logoff"
-#~ msgstr "wyloguj"
-
-#~ msgid "shutdown"
-#~ msgstr "zako๑cz"
-
-#~ msgid "E371: Command not found"
-#~ msgstr "E371: Nie znaleziono komendy"
-
-#~ msgid ""
-#~ "VIMRUN.EXE not found in your $PATH.\n"
-#~ "External commands will not pause after completion.\n"
-#~ "See :help win32-vimrun for more information."
-#~ msgstr ""
-#~ "VIMRUN.EXE nie znaleziono w twoim $PATH.\n"
-#~ "Zewn๊trzne komendy nie b๊dฑ wstrzymane po wykonaniu.\n"
-#~ "Zobacz :help wim32-vimrun aby otrzymaๆ wi๊cej informacji."
-
-#~ msgid "Vim Warning"
-#~ msgstr "Vim Ostrzeฟenie"
-
-#~ msgid "Error file"
-#~ msgstr "Plik bณ๊du"
-
-#~ msgid "E868: Error building NFA with equivalence class!"
-#~ msgstr "E868: Bณฑd przy budowwaniu NFA z klasฑ ekwiwalencji"
-
-#~ msgid "E878: (NFA) Could not allocate memory for branch traversal!"
-#~ msgstr ""
-#~ "E878: (NFA) Nie moฟna przydzieliๆ pami๊ci do przejถcia przez gaณ๊zie!"
-
-#~ msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\""
-#~ msgstr ""
-#~ "Ostrzeฟenie: Nie mog๊ znaleผๆ listy sณ๓w \"%s_%s.spl\" lub \"%s_ascii.spl"
-#~ "\""
-
-#~ msgid "Conversion in %s not supported"
-#~ msgstr "Konwersja w %s nie jest wspierana"
-
-#~ msgid "E845: Insufficient memory, word list will be incomplete"
-#~ msgstr ""
-#~ "E845: Nie wystarczajฑca iloถๆ pami๊ci, lista sณ๓w b๊dzie niekompletna"
-
-#~ msgid "E430: Tag file path truncated for %s\n"
-#~ msgstr "E430: Trop szukania pliku znacznik๓w obci๊ty dla %s\n"
-
-#~ msgid "new shell started\n"
-#~ msgstr "uruchomiono nowฑ powณok๊\n"
-
-#~ msgid "Used CUT_BUFFER0 instead of empty selection"
-#~ msgstr "Uฟywam CUT_BUFFER0 zamiast pustego wyboru"
-
-#~ msgid "No undo possible; continue anyway"
-#~ msgstr "Cofni๊cie niemoฟliwe; mimo to kontynuuj๊"
-
-#~ msgid "E832: Non-encrypted file has encrypted undo file: %s"
-#~ msgstr "E832: Nie zaszyfrowany plik ma zaszyfrowany plik undo: %s"
-
-#~ msgid "E826: Undo file decryption failed: %s"
-#~ msgstr "E826: Nie powiodณo si๊ odszyfrowywanie pliku undo: %s"
-
-#~ msgid "E827: Undo file is encrypted: %s"
-#~ msgstr "E827: Plik undo jest zaszyfrowany: %s"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16/32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "16/32-bit wersja GUI dla MS-Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "64 bitowa wersja GUI dla MS-Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "32 bitowa wersja GUI dla MS-Windows"
-
-#~ msgid " in Win32s mode"
-#~ msgstr " w trybie Win32s"
-
-#~ msgid " with OLE support"
-#~ msgstr " ze wspomaganiem OLE"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "32 bitowa wersja na konsol๊ dla MS-Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "32 bitowa wersja na konsol๊ dla MS-Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16-bit version"
-#~ msgstr ""
-#~ "\n"
-#~ "16 bitowa wersja dla MS-Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "32-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "32 bitowa wersja dla MS-DOS"
-
-#~ msgid ""
-#~ "\n"
-#~ "16-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "16 bitowa wersja dla MS-DOS"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X (unix) version"
-#~ msgstr ""
-#~ "\n"
-#~ "wersja dla MacOS X (unix)"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X version"
-#~ msgstr ""
-#~ "\n"
-#~ "wersja dla MacOS X"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "wersja dla MacOS"
-
-#~ msgid ""
-#~ "\n"
-#~ "OpenVMS version"
-#~ msgstr ""
-#~ "\n"
-#~ "wersja dla OpenVMS"
-
-#~ msgid ""
-#~ "\n"
-#~ "Big version "
-#~ msgstr ""
-#~ "\n"
-#~ "Duฟa wersja "
-
-#~ msgid ""
-#~ "\n"
-#~ "Normal version "
-#~ msgstr ""
-#~ "\n"
-#~ "Normalna wersja "
-
-#~ msgid ""
-#~ "\n"
-#~ "Small version "
-#~ msgstr ""
-#~ "\n"
-#~ "Maณa wersja "
-
-#~ msgid ""
-#~ "\n"
-#~ "Tiny version "
-#~ msgstr ""
-#~ "\n"
-#~ "Malutka wersja "
-
-#~ msgid "with GTK2-GNOME GUI."
-#~ msgstr "z GTK2-GNOME GUI."
-
-#~ msgid "with GTK2 GUI."
-#~ msgstr "z GTK2 GUI."
-
-#~ msgid "with X11-Motif GUI."
-#~ msgstr "z X11-Motif GUI."
-
-#~ msgid "with X11-neXtaw GUI."
-#~ msgstr "z X11-neXtaw GUI."
-
-#~ msgid "with X11-Athena GUI."
-#~ msgstr "z X11-Athena GUI."
-
-#~ msgid "with Photon GUI."
-#~ msgstr "z Photon GUI."
-
-#~ msgid "with GUI."
-#~ msgstr "z GUI."
-
-#~ msgid "with Carbon GUI."
-#~ msgstr "z Carbon GUI."
-
-#~ msgid "with Cocoa GUI."
-#~ msgstr "z Cocoa GUI."
-
-#~ msgid "with (classic) GUI."
-#~ msgstr "z (klasycznym) GUI."
-
-#~ msgid " system gvimrc file: \""
-#~ msgstr " gvimrc systemu: \""
-
-#~ msgid " user gvimrc file: \""
-#~ msgstr " gvimrc uฟytkownika: \""
-
-#~ msgid "2nd user gvimrc file: \""
-#~ msgstr "2-gi plik gvimrc uฟytkownika: \""
-
-#~ msgid "3rd user gvimrc file: \""
-#~ msgstr "3-ci plik gvimrc uฟytkownika: \""
-
-#~ msgid " system menu file: \""
-#~ msgstr " systemowy plik menu: \""
-
-#~ msgid "Compiler: "
-#~ msgstr "Kompilator: "
-
-#~ msgid "menu Help->Orphans for information "
-#~ msgstr "menu Pomoc->Sieroty dla informacji to tym "
-
-#~ msgid "Running modeless, typed text is inserted"
-#~ msgstr "Uruchomiony bez tryb๓w, wpisany tekst jest wprowadzany"
-
-#~ msgid "menu Edit->Global Settings->Toggle Insert Mode "
-#~ msgstr "menu Edytuj->Ustawienia globalne->Tryb wstawiania"
-
-#~ msgid " for two modes "
-#~ msgstr " dla dw๓ch tryb๓w "
-
-#~ msgid "menu Edit->Global Settings->Toggle Vi Compatible"
-#~ msgstr "menu Edytuj->Ustawienia globalne->Kompatybilnoถๆ z Vi"
-
-#~ msgid " for Vim defaults "
-#~ msgstr " dla domyถlnych ustawie๑ Vima "
-
-#~ msgid "WARNING: Windows 95/98/ME detected"
-#~ msgstr "OSTRZEฏENIE: wykryto Windows 95/98/ME"
-
-#~ msgid "type :help windows95<Enter> for info on this"
-#~ msgstr "wprowadผ :help windows95<Enter> dla informacji to tym "
-
-#~ msgid "E370: Could not load library %s"
-#~ msgstr "E370: Nie mogณem zaณadowaๆ biblioteki %s"
-
-#~ msgid ""
-#~ "Sorry, this command is disabled: the Perl library could not be loaded."
-#~ msgstr ""
-#~ "Przykro mi, ta komenda jest wyณฑczona: nie mogณem zaณadowaๆ biblioteki "
-#~ "Perla."
-
-#~ msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
-#~ msgstr "E299: wyliczenie Perla zabronione w piaskownicy bez moduณu Safe"
-
-#~ msgid "Edit with &multiple Vims"
-#~ msgstr "Edytuj w &wielu Vimach"
-
-#~ msgid "Edit with single &Vim"
-#~ msgstr "Edytuj w pojedynczym &Vimie"
-
-#~ msgid "Diff with Vim"
-#~ msgstr "Diff z Vimem"
-
-#~ msgid "Edit with &Vim"
-#~ msgstr "Edytuj w &Vimie"
-
-#~ msgid "Edit with existing Vim - "
-#~ msgstr "Edytuj z istniejฑcym Vimem - "
-
-#~ msgid "Edits the selected file(s) with Vim"
-#~ msgstr "Edytuj wybrane pliki w Vimie"
-
-#~ msgid "Error creating process: Check if gvim is in your path!"
-#~ msgstr "Bณฑd tworzenia procesu: Sprawdผ czy gvim jest w twojej ถcieฟce!"
-
-#~ msgid "gvimext.dll error"
-#~ msgstr "bณฑd gvimext.dll"
-
-#~ msgid "Path length too long!"
-#~ msgstr "Za dณuga ถcieฟka!"
-
-#~ msgid "E234: Unknown fontset: %s"
-#~ msgstr "E234: Nieznany zestaw czcionek: %s"
-
-#~ msgid "E235: Unknown font: %s"
-#~ msgstr "E235: Nieznana czcionka: %s"
-
-#~ msgid "E236: Font \"%s\" is not fixed-width"
-#~ msgstr "E236: Czcionka \"%s\" nie ma staณej szerokoถci znak๓w"
-
-#~ msgid "E448: Could not load library function %s"
-#~ msgstr "E448: Nie moฟna zaณadowaๆ funkcji biblioteki %s"
-
-#~ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
-#~ msgstr ""
-#~ "E26: Hebrajski nie moฟe byๆ uฟyty: Nie wณฑczono podczas kompilacji\n"
-
-#~ msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
-#~ msgstr "E27: Farsi nie moฟe byๆ uฟyty: Nie wณฑczono podczas kompilacji\n"
-
-#~ msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
-#~ msgstr "E800: Arabski nie moฟe byๆ uฟyty: Nie wณฑczono podczas kompilacji\n"
-
-#~ msgid "E247: no registered server named \"%s\""
-#~ msgstr "E247: brak zarejestrowanego serwera o nazwie \"%s\""
-
-#~ msgid "E233: cannot open display"
-#~ msgstr "E233: nie mog๊ otworzyๆ ekranu"
-
-#~ msgid "E449: Invalid expression received"
-#~ msgstr "E449: Odebraณem niewณaถciwe wyraฟenie"
-
-#~ msgid "E463: Region is guarded, cannot modify"
-#~ msgstr "E463: Region jest chroniony, nie mog๊ zmieniๆ"
-
-#~ msgid "E744: NetBeans does not allow changes in read-only files"
-#~ msgstr "E744: NetBeans nie zezwala na zmiany w plikach tylko do odczytu"
-
-#~ msgid "Need encryption key for \"%s\""
-#~ msgstr "Potrzebuj๊ klucza szyfrowania dla \"%s\""
-
-#~ msgid "empty keys are not allowed"
-#~ msgstr "puste klucze nie sฑ dozwolone"
-
-#~ msgid "dictionary is locked"
-#~ msgstr "sณownik jest zablokowany"
-
-#~ msgid "list is locked"
-#~ msgstr "lista jest zablokowana"
-
-#~ msgid "failed to add key '%s' to dictionary"
-#~ msgstr "nie powiodณo si๊ dodanie klucza '%s' do sณownika"
-
-#~ msgid "index must be int or slice, not %s"
-#~ msgstr "indeks musi byๆ liczbฑ lub wycinkiem, nie %s"
-
-#~ msgid "expected str() or unicode() instance, but got %s"
-#~ msgstr "czekaณem na str() lub unicode(), a dostaณem %s"
-
-#~ msgid "expected bytes() or str() instance, but got %s"
-#~ msgstr "czekaณem na bytes() lub str(), a dostaณem %s"
-
-#~ msgid ""
-#~ "expected int(), long() or something supporting coercing to long(), but "
-#~ "got %s"
-#~ msgstr ""
-#~ "czekaณem na int(), long() lub coถ co moฟna zmieniๆ na long(), ale "
-#~ "dostaณem %s"
-
-#~ msgid "expected int() or something supporting coercing to int(), but got %s"
-#~ msgstr ""
-#~ "czekaณem na int() lub coถ co moฟna zmieniๆ na int(), ale dostaณem %s"
-
-#~ msgid "value is too large to fit into C int type"
-#~ msgstr "wartoถๆ zbyt duฟa by zmieถciณa si๊ w typie int C"
-
-#~ msgid "value is too small to fit into C int type"
-#~ msgstr "wartoถๆ jest zbyt maณa by zmieถciณa si๊ w typie int C"
-
-#~ msgid "number must be greater then zero"
-#~ msgstr "liczba musi byๆ wi๊ksza niฟ zero"
-
-#~ msgid "number must be greater or equal to zero"
-#~ msgstr "liczba musi byๆ wi๊ksza lub mniejsza niฟ zero"
-
-#~ msgid "can't delete OutputObject attributes"
-#~ msgstr "nie mog๊ skasowaๆ atrybut๓w OutputObject"
-
-#~ msgid "invalid attribute: %s"
-#~ msgstr "niepoprawny atrybut: %s"
-
-#~ msgid "E264: Python: Error initialising I/O objects"
-#~ msgstr "E264: Python: Bณฑd w uruchomieniu obiekt๓w I/O"
-
-#~ msgid "failed to change directory"
-#~ msgstr "nie powiodณa si๊ zmiana katalogu"
-
-#~ msgid "expected 3-tuple as imp.find_module() result, but got %s"
-#~ msgstr "czekaณem na 3-krotk๊ jako wynik imp.find_module(), a dostaณem %s"
-
-#~ msgid ""
-#~ "expected 3-tuple as imp.find_module() result, but got tuple of size %d"
-#~ msgstr ""
-#~ "czekaณem na 3-krotk๊ jako wynik imp.find_module(), a dostaณem krotk๊ o "
-#~ "wielkoถci %d"
-
-#~ msgid "internal error: imp.find_module returned tuple with NULL"
-#~ msgstr "wewn๊trzny bณฑd: imp.find_module zwr๓ciณ krotk๊ z NULL"
-
-#~ msgid "cannot delete vim.Dictionary attributes"
-#~ msgstr "nie mog๊ usunฑๆ atrybut๓w vim.Dictionary"
-
-#~ msgid "cannot modify fixed dictionary"
-#~ msgstr "nie mog๊ zmieniๆ zablokowanego sณownika"
-
-#~ msgid "cannot set attribute %s"
-#~ msgstr "nie mog๊ ustawiๆ atrybutu %s"
-
-#~ msgid "hashtab changed during iteration"
-#~ msgstr "hashtab zmieniณ si๊ w czasie iteracji"
-
-#~ msgid "expected sequence element of size 2, but got sequence of size %d"
-#~ msgstr ""
-#~ "czekaณem na element sekwencyjny od dณugoถci 2, a dostaณem sekwencj๊ o "
-#~ "dณugoถci %d"
-
-#~ msgid "list constructor does not accept keyword arguments"
-#~ msgstr "konstruktor listy nie akceptuje sณ๓w kluczowych jako argument๓w"
-
-#~ msgid "list index out of range"
-#~ msgstr "indeks listy poza zakresem"
-
-#~ msgid "internal error: failed to get vim list item %d"
-#~ msgstr "bณฑd wewn๊trzny: nie powiodณo si๊ pobranie z listy Vima elementu %d"
-
-#~ msgid "failed to add item to list"
-#~ msgstr "nie powiodณo si๊ dodanie elementu do listy"
-
-#~ msgid "internal error: no vim list item %d"
-#~ msgstr "bณฑd wewn๊trzny: w liถcie Vima brak elementu %d"
-
-#~ msgid "internal error: failed to add item to list"
-#~ msgstr "bณฑd wewn๊trzny: nie powiodณo si๊ dodanie elementu do listy"
-
-#~ msgid "cannot delete vim.List attributes"
-#~ msgstr "nie mog๊ usunฑๆ atrybut๓w vim.List"
-
-#~ msgid "cannot modify fixed list"
-#~ msgstr "nie mog๊ zmieniๆ zablokowanej listy"
-
-#~ msgid "unnamed function %s does not exist"
-#~ msgstr "nie nazwana funkcja %s nie istnieje"
-
-#~ msgid "function %s does not exist"
-#~ msgstr "funkcja %s nie istnieje"
-
-#~ msgid "function constructor does not accept keyword arguments"
-#~ msgstr "konstruktor funkcji nie akceptuje sณ๓w kluczowych jako argument๓w"
-
-#~ msgid "failed to run function %s"
-#~ msgstr "nie mog๊ uruchomiๆ funkcji %s"
-
-#~ msgid "problem while switching windows"
-#~ msgstr "wystฑpiณ problem w czasie zmiany okien"
-
-#~ msgid "unable to unset global option %s"
-#~ msgstr "nie mog๊ wyzerowaๆ opcji globalnej %s"
-
-#~ msgid "unable to unset option %s which does not have global value"
-#~ msgstr "nie mog๊ wyzerowaๆ opcji %s, kt๓ra nie ma wartoถci globalnej"
-
-#~ msgid "attempt to refer to deleted tab page"
-#~ msgstr "pr๓ba odniesienia do skasowanej karty"
-
-#~ msgid "no such tab page"
-#~ msgstr "nie ma takiej karty"
-
-#~ msgid "attempt to refer to deleted window"
-#~ msgstr "pr๓ba odniesienia do skasowanego okna"
-
-#~ msgid "readonly attribute: buffer"
-#~ msgstr "atrybut tylko do odczytu: bufor"
-
-#~ msgid "cursor position outside buffer"
-#~ msgstr "pozycja kursora poza buforem"
-
-#~ msgid "no such window"
-#~ msgstr "nie ma takiego okna"
-
-#~ msgid "attempt to refer to deleted buffer"
-#~ msgstr "pr๓ba odniesienia do skasowanego bufora"
-
-#~ msgid "failed to rename buffer"
-#~ msgstr "nie powiodณa si๊ zmiana nazwy bufora"
-
-#~ msgid "mark name must be a single character"
-#~ msgstr "nazwa zakณadki musi byๆ pojedynczym znakiem"
-
-#~ msgid "expected vim.Buffer object, but got %s"
-#~ msgstr "oczekiwaณem na obiekt vim.Buffer, a dostaณem %s"
-
-#~ msgid "failed to switch to buffer %d"
-#~ msgstr "nie przeszedณem do bufora %d"
-
-#~ msgid "expected vim.Window object, but got %s"
-#~ msgstr "oczekiwaณem na obiekt vim.Window, a dostaณem %s"
-
-#~ msgid "failed to find window in the current tab page"
-#~ msgstr "nie znaleziono okna na bieฟฑcej karcie"
-
-#~ msgid "did not switch to the specified window"
-#~ msgstr "nie przeszedณem do okreถlonego okna"
-
-#~ msgid "expected vim.TabPage object, but got %s"
-#~ msgstr "oczekiwaณem na obiekt vim.TabPage, a dostaณem %s"
-
-#~ msgid "did not switch to the specified tab page"
-#~ msgstr "nie przeszedณem do okreถlonej karty"
-
-#~ msgid "failed to run the code"
-#~ msgstr "uruchomienie kodu si๊ nie powiodณo"
-
-#~ msgid "E858: Eval did not return a valid python object"
-#~ msgstr "E858: eval nie zwr๓ciณo odpowiedniego obiektu pythona"
-
-#~ msgid "E859: Failed to convert returned python object to vim value"
-#~ msgstr "E859: Nie powiodณa si๊ konwersja obiektu pythona do wartoถci Vima"
-
-#~ msgid "unable to convert %s to vim dictionary"
-#~ msgstr "nie moฟna konwertowaๆ %s do sณownika Vima"
-
-#~ msgid "unable to convert %s to vim structure"
-#~ msgstr "nie moฟna konwertowaๆ %s do struktury Vima"
-
-#~ msgid "internal error: NULL reference passed"
-#~ msgstr "bณฑd wewn๊trzny: przekazano referencj๊ NULL"
-
-#~ msgid "internal error: invalid value type"
-#~ msgstr "bณฑd wewn๊trzny: bณ๊dny typ wartoถci"
-
-#~ msgid ""
-#~ "Failed to set path hook: sys.path_hooks is not a list\n"
-#~ "You should now do the following:\n"
-#~ "- append vim.path_hook to sys.path_hooks\n"
-#~ "- append vim.VIM_SPECIAL_PATH to sys.path\n"
-#~ msgstr ""
-#~ "Nie mog๊ ustawiๆ haka ถcieฟki: sys.path_hooks nie jest listฑ\n"
-#~ "Powinieneถ teraz wykonaๆ nast๊pujฑce czynnoถci:\n"
-#~ "- dodaๆ vim.path_hook do sys.path_hooks\n"
-#~ "- dodaๆ vim.VIM_SPECIAL_PATH do sys.path\n"
-
-#~ msgid ""
-#~ "Failed to set path: sys.path is not a list\n"
-#~ "You should now append vim.VIM_SPECIAL_PATH to sys.path"
-#~ msgstr ""
-#~ "Nie mog๊ ustawiๆ ถcieฟki: sys.path nie jest listฑ\n"
-#~ "Powinno si๊ teraz dodaๆ vim.VIM_SPECIAL_PATH do sys.path"
-
-#~ msgid "softspace must be an integer"
-#~ msgstr "softspace musi byๆ liczbฑ caณkowitฑ"
-
-#~ msgid "<buffer object (deleted) at %p>"
-#~ msgstr "<obiekt bufora (skasowany) w %p>"
-
-#~ msgid ""
-#~ "E281: TCL ERROR: exit code is not int!? Please report this to vim-dev@vim."
-#~ "org"
-#~ msgstr ""
-#~ "E281: BฃกD TCL: kod zako๑czeniowy nie jest caณkowity!? Prosz๊ zณoฟyๆ "
-#~ "raport o tym na vim-dev@vim.org"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (RISC OS version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Argumenty rozpoznawane przez gvim (wersja RISC OS):\n"
-
-#~ msgid "--columns <number>\tInitial width of window in columns"
-#~ msgstr "--columns <number>\tPoczฑtkowa szerokoถๆ okna w kolumnach"
-
-#~ msgid "--rows <number>\tInitial height of window in rows"
-#~ msgstr "--rows <number>\tPoczฑtkowa wysokoถๆ okna w wierszach"
-
-#~ msgid "E505: "
-#~ msgstr "E505: "
-
-#~ msgid ""
-#~ "\n"
-#~ "RISC OS version"
-#~ msgstr ""
-#~ "\n"
-#~ "wersja dla RISC OS"
-
-#~ msgid "writelines() requires list of strings"
-#~ msgstr "writelines() wymaga listy ciฑg๓w"
-
-#~ msgid "<window object (deleted) at %p>"
-#~ msgstr "<obiekt okna (skasowany) w %p>"
-
-#~ msgid "<window object (unknown) at %p>"
-#~ msgstr "<obiekt okna (nieznany) w %p>"
-
-#~ msgid "<window %d>"
-#~ msgstr "<okno %d>"
-
-#~ msgid "-name <name>\t\tUse resource as if vim was <name>"
-#~ msgstr "-name <nazwa>\t\tUฟywaj zasob๓w tak jak by Vim byณ <nazwa>"
-
-#~ msgid "\t\t\t (Unimplemented)\n"
-#~ msgstr "\t\t\t (Niezaimplementowane)\n"
-
-#~ msgid "E396: containedin argument not accepted here"
-#~ msgstr "E396: argument containedin niedozwolony w tym miejscu"
-
-#~ msgid "Vim dialog..."
-#~ msgstr "Dialog Vima..."
-
-#~ msgid "Font Selection"
-#~ msgstr "Wyb๓r czcionki"
-
-#~ msgid "E290: over-the-spot style requires fontset"
-#~ msgstr "E290: styl nadpunktowy wymaga +fontset"
-
-#~ msgid "E291: Your GTK+ is older than 1.2.3. Status area disabled"
-#~ msgstr "E291: Tw๓j GTK+ jest starszy niฟ 1.2.3. Pole statusu wyณฑczono"
-
-#~ msgid "E292: Input Method Server is not running"
-#~ msgstr "E292: Serwer metod wprowadze๑ nie jest uruchomiony"
-
-#~ msgid "with GTK-GNOME GUI."
-#~ msgstr "z GTK-GNOME GUI."
-
-#~ msgid "with GTK GUI."
-#~ msgstr "z GTK GUI."
-
-#~ msgid "[NL found]"
-#~ msgstr "[znaleziono NL]"
-
-#~ msgid "E569: maximum number of cscope connections reached"
-#~ msgstr "E569: wyczerpano maksymalnฑ liczb๊ poณฑcze๑ cscope"
diff --git a/src/nvim/po/pt_BR.po b/src/nvim/po/pt_BR.po
index 60c11d4b5a..543f0bce27 100644
--- a/src/nvim/po/pt_BR.po
+++ b/src/nvim/po/pt_BR.po
@@ -24,7 +24,7 @@ msgstr "[Ajuda]"
#: ../screen.c:4815 ../buffer.c:3244
msgid "[Preview]"
-msgstr "[Visualiza็ใo]"
+msgstr "[Visualizaรงรฃo]"
#: ../screen.c:4823 ../fileio.c:1855 ../buffer.c:2496 ../buffer.c:3207
msgid "[RO]"
@@ -2478,11 +2478,6 @@ msgstr "E900: Id do job ้ invแlido"
msgid "E901: Job table is full"
msgstr "E901: Tabela de jobs estรก cheia"
-#: ../globals.h:1021
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr "E902: \"%s\" nรฃo รฉ um executรกvel"
-
#: ../globals.h:1023
#, c-format
msgid "E364: Library call failed for \"%s()\""
@@ -3217,7 +3212,7 @@ msgstr "E216: Grupo ou evento inexistente: %s"
#: ../fileio.c:6002
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
"--- Autocomandos ---"
@@ -4864,7 +4859,7 @@ msgstr " tipo arquivo\n"
#: ../ex_getln.c:4762
msgid "'history' option is zero"
-msgstr "op็ใo 'history' vale zero"
+msgstr "opรงรฃo 'history' vale zero"
#: ../ex_getln.c:5008
#, c-format
@@ -5311,7 +5306,7 @@ msgstr "Aviso: regiใo %s nใo ้ suportada"
#: ../spell.c:4366
#, c-format
-msgid "Reading affix file %s ..."
+msgid "Reading affix file %s..."
msgstr "Lendo arquivo de afixos %s..."
#: ../spell.c:4405 ../spell.c:5451 ../spell.c:5956
@@ -5511,8 +5506,8 @@ msgstr "Foram ignoradas %d palavra(s) com caracteres nใo-ASCII em %s"
#: ../spell.c:5931
#, c-format
-msgid "Reading word file %s ..."
-msgstr "Lendo arquivo de palavras %s ..."
+msgid "Reading word file %s..."
+msgstr "Lendo arquivo de palavras %s..."
#: ../spell.c:5971
#, c-format
@@ -6174,7 +6169,7 @@ msgstr "-q [arq.erro] editar arquivo e abrir no primeiro erro"
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
@@ -6208,7 +6203,7 @@ msgstr "--\t\t\tApenas nomes de arquivo depois daqui"
#: ../main.c:2177
msgid "--literal\t\tDon't expand wildcards"
-msgstr "--literal\t\tNใo expandir caracteres-curinga"
+msgstr "--literal\t\tNรฃo expandir caracteres-curinga"
#: ../main.c:2179
msgid "-v\t\t\tVi mode (like \"vi\")"
@@ -6232,7 +6227,7 @@ msgstr "-d\t\t\tModo diff (como \"vimdiff\")"
#: ../main.c:2184
msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
-msgstr "-y\t\t\tModo fแcil (como \"evim\", o Vim nใo modal)"
+msgstr "-y\t\t\tModo fรกcil (como \"evim\", o Vim nรฃo modal)"
#: ../main.c:2185
msgid "-R\t\t\tReadonly mode (like \"view\")"
@@ -6346,8 +6341,8 @@ msgstr ""
#: ../main.c:2213
msgid "-S <session>\t\tSource file <session> after loading the first file"
msgstr ""
-"-S <sessใo>\t\tExecutar o arquivo <sessใo> depois de carregar o\n"
-"\t\t\tprimeiro arquivo"
+"-S <sessใo>\t\tExecutar o arquivo <sessใo> depois de carregar o "
+"primeiro arquivo"
#: ../main.c:2214
msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>"
diff --git a/src/nvim/po/ru.cp1251.po b/src/nvim/po/ru.cp1251.po
deleted file mode 100644
index 29e8c83ee6..0000000000
--- a/src/nvim/po/ru.cp1251.po
+++ /dev/null
@@ -1,8282 +0,0 @@
-# Russian translation for Vim
-#
-# ฮแ ๓๑๋๎โ่๕ ่๑๏๎๋็๎โเํ่ ๗่๒เ้๒ๅ โ ๐ๅไเ๊๒๎๐ๅ Vim ":help uganda"
-#
-# vassily "vr" ragosin <vrr@users.sourceforge.net>, 2004
-# Sergey Alyoshin <alyoshin.s@gmail.com>, 2013
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: vim_ru\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-05-26 14:21+0200\n"
-"PO-Revision-Date: 2014-10-10 12:00+0400\n"
-"Last-Translator: Sergey Alyoshin <alyoshin.s@gmail.com>\n"
-"Language-Team: \n"
-"Language: Russian\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=cp1251\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: ../api/private/helpers.c:201
-#, fuzzy
-msgid "Unable to get option value"
-msgstr "อๅโ๎็์๎ๆํ๎ ๏๎๋๓๗่๒ ็ํเ๗ๅํ่ๅ ๎๏๖่่"
-
-#: ../api/private/helpers.c:204
-msgid "internal error: unknown option type"
-msgstr "ยํ๓๒๐ๅํํ ๎๘่แ๊เ: ํๅ่็โๅ๑๒ํ๛้ ๒่๏ ๎๏๖่่"
-
-#: ../buffer.c:92
-msgid "[Location List]"
-msgstr "[ั๏่๑๎๊ ๐เ๑๏๎๋๎ๆๅํ่้]"
-
-#: ../buffer.c:93
-msgid "[Quickfix List]"
-msgstr "[ั๏่๑๎๊ แ๛๑๒๐๛๕ ่๑๏๐เโ๋ๅํ่้]"
-
-#: ../buffer.c:94
-msgid "E855: Autocommands caused command to abort"
-msgstr "E855: ภโ๒๎๊๎์เํไ๛ โ๛็โเ๋่ ๏๐ๅ๊๐เ๙ๅํ่ๅ ๊๎์เํไ๛"
-
-#: ../buffer.c:135
-msgid "E82: Cannot allocate any buffer, exiting..."
-msgstr "E82: อๅโ๎็์๎ๆํ๎ โ๛ไๅ๋่๒ ๏เ์๒ ไเๆๅ ไ๋ ๎ไํ๎ใ๎ แ๓๔ๅ๐เ, โ๛๕๎ไ..."
-
-#: ../buffer.c:138
-msgid "E83: Cannot allocate buffer, using other one..."
-msgstr "E83: อๅโ๎็์๎ๆํ๎ โ๛ไๅ๋่๒ ๏เ์๒ ไ๋ แ๓๔ๅ๐เ, ่๑๏๎๋็๓ๅ์ ไ๐๓ใ๎้ แ๓๔ๅ๐..."
-
-#: ../buffer.c:763
-msgid "E515: No buffers were unloaded"
-msgstr "E515: อ่ ๎ไ่ํ แ๓๔ๅ๐ ํๅ แ๛๋ โ๛ใ๐๓ๆๅํ ่็ ๏เ์๒่"
-
-#: ../buffer.c:765
-msgid "E516: No buffers were deleted"
-msgstr "E516: อ่ ๎ไ่ํ แ๓๔ๅ๐ ํๅ แ๛๋ ๓ไเ๋ธํ"
-
-#: ../buffer.c:767
-msgid "E517: No buffers were wiped out"
-msgstr "E517: อ่ ๎ไ่ํ แ๓๔ๅ๐ ํๅ แ๛๋ ๎๗่๙ๅํ"
-
-#: ../buffer.c:772
-msgid "1 buffer unloaded"
-msgstr "ฮไ่ํ แ๓๔ๅ๐ โ๛ใ๐๓ๆๅํ ่็ ๏เ์๒่"
-
-#: ../buffer.c:774
-#, c-format
-msgid "%d buffers unloaded"
-msgstr "ย๑ๅใ๎ โ๛ใ๐๓ๆๅํ๎ แ๓๔ๅ๐๎โ ่็ ๏เ์๒่: %d"
-
-#: ../buffer.c:777
-msgid "1 buffer deleted"
-msgstr "ฮไ่ํ แ๓๔ๅ๐ ๓ไเ๋ธํ"
-
-#: ../buffer.c:779
-#, c-format
-msgid "%d buffers deleted"
-msgstr "ย๑ๅใ๎ ๓ไเ๋ๅํ๎ แ๓๔ๅ๐๎โ: %d"
-
-#: ../buffer.c:782
-msgid "1 buffer wiped out"
-msgstr "ฮไ่ํ แ๓๔ๅ๐ ๎๗่๙ๅํ"
-
-#: ../buffer.c:784
-#, c-format
-msgid "%d buffers wiped out"
-msgstr "ย๑ๅใ๎ ๎๗่๙ๅํ๎ แ๓๔ๅ๐๎โ: %d"
-
-#: ../buffer.c:806
-msgid "E90: Cannot unload last buffer"
-msgstr "E90: อๅโ๎็์๎ๆํ๎ โ๛ใ๐๓็่๒ ่็ ๏เ์๒่ ๏๎๑๋ๅไํ่้ แ๓๔ๅ๐"
-
-#: ../buffer.c:874
-msgid "E84: No modified buffer found"
-msgstr "E84: ศ็์ๅํธํํ๛๕ แ๓๔ๅ๐๎โ ํๅ ๎แํเ๐๓ๆๅํ๎"
-
-#. back where we started, didn't find anything.
-#: ../buffer.c:903
-msgid "E85: There is no listed buffer"
-msgstr "E85: ม๓๔ๅ๐๛ โ ๑๏่๑๊ๅ ๎๒๑๓๒๑๒โ๓๒"
-
-#: ../buffer.c:913
-#, c-format
-msgid "E86: Buffer %<PRId64> does not exist"
-msgstr "E86: ม๓๔ๅ๐ %<PRId64> ํๅ ๑๓๙ๅ๑๒โ๓ๅ๒"
-
-#: ../buffer.c:915
-msgid "E87: Cannot go beyond last buffer"
-msgstr "E87: ๒๎ ๏๎๑๋ๅไํ่้ แ๓๔ๅ๐"
-
-#: ../buffer.c:917
-msgid "E88: Cannot go before first buffer"
-msgstr "E88: ๒๎ ๏ๅ๐โ๛้ แ๓๔ๅ๐"
-
-#: ../buffer.c:945
-#, c-format
-msgid ""
-"E89: No write since last change for buffer %<PRId64> (add ! to override)"
-msgstr ""
-"E89: ศ็์ๅํๅํ่ โ แ๓๔ๅ๐ๅ %<PRId64> ํๅ ๑๎๕๐เํๅํ๛ (ไ๎แเโ๒ๅ !, ๗๒๎แ๛ ๎แ๎้๒่ "
-"๏๐๎โๅ๐๊๓)"
-
-#. wrap around (may cause duplicates)
-#: ../buffer.c:1423
-msgid "W14: Warning: List of file names overflow"
-msgstr "W14: ฯ๐ๅไ๓๏๐ๅๆไๅํ่ๅ: ๏ๅ๐ๅ๏๎๋ํๅํ่ๅ ๑๏่๑๊เ ่์ธํ ๔เ้๋๎โ"
-
-#: ../buffer.c:1555 ../quickfix.c:3361
-#, c-format
-msgid "E92: Buffer %<PRId64> not found"
-msgstr "E92: ม๓๔ๅ๐ %<PRId64> ํๅ ํเ้ไๅํ"
-
-#: ../buffer.c:1798
-#, c-format
-msgid "E93: More than one match for %s"
-msgstr "E93: อๅ๑๊๎๋๊๎ ๑๎๎๒โๅ๒๑๒โ่้ ไ๋ %s"
-
-#: ../buffer.c:1800
-#, c-format
-msgid "E94: No matching buffer for %s"
-msgstr "E94: อๅ๒ ๑๎๎๒โๅ๒๑๒โ๓๙ๅใ๎ %s แ๓๔ๅ๐เ"
-
-#: ../buffer.c:2161
-#, c-format
-msgid "line %<PRId64>"
-msgstr "๑๒๐๎๊เ %<PRId64>"
-
-#: ../buffer.c:2233
-msgid "E95: Buffer with this name already exists"
-msgstr "E95: ม๓๔ๅ๐ ๑ ๒เ๊่์ ่์ๅํๅ์ ๓ๆๅ ๑๓๙ๅ๑๒โ๓ๅ๒"
-
-#: ../buffer.c:2498
-msgid " [Modified]"
-msgstr " [ศ็์ๅํธํ]"
-
-#: ../buffer.c:2501
-msgid "[Not edited]"
-msgstr "[อๅ ๐ๅไเ๊๒่๐๎โเ๋๑]"
-
-#: ../buffer.c:2504
-msgid "[New file]"
-msgstr "[อ๎โ๛้ ๔เ้๋]"
-
-#: ../buffer.c:2505
-msgid "[Read errors]"
-msgstr "[ฮ๘่แ๊่ ๗๒ๅํ่]"
-
-#: ../buffer.c:2506 ../buffer.c:3217 ../fileio.c:1807 ../screen.c:4895
-msgid "[RO]"
-msgstr "[าื]"
-
-#: ../buffer.c:2507 ../fileio.c:1807
-msgid "[readonly]"
-msgstr "[๒๎๋๊๎ ไ๋ ๗๒ๅํ่]"
-
-#: ../buffer.c:2524
-#, c-format
-msgid "1 line --%d%%--"
-msgstr "ฮไํเ ๑๒๐๎๊เ --%d%%--"
-
-#: ../buffer.c:2526
-#, c-format
-msgid "%<PRId64> lines --%d%%--"
-msgstr "%<PRId64> ๑๒๐. --%d%%--"
-
-#: ../buffer.c:2530
-#, c-format
-msgid "line %<PRId64> of %<PRId64> --%d%%-- col "
-msgstr "๑๒๐. %<PRId64> ่็ %<PRId64> --%d%%-- ๊๎๋. "
-
-#: ../buffer.c:2632 ../buffer.c:4292 ../memline.c:1554
-msgid "[No Name]"
-msgstr "[อๅ๒ ่์ๅํ่]"
-
-#. must be a help buffer
-#: ../buffer.c:2667
-msgid "help"
-msgstr "๑๏๐เโ๊เ"
-
-#: ../buffer.c:3225 ../screen.c:4883
-msgid "[Help]"
-msgstr "[ั๏๐เโ๊เ]"
-
-#: ../buffer.c:3254 ../screen.c:4887
-msgid "[Preview]"
-msgstr "[ฯ๐ๅไ๏๐๎๑์๎๒๐]"
-
-#: ../buffer.c:3528
-msgid "All"
-msgstr "ยๅ๑"
-
-#: ../buffer.c:3528
-msgid "Bot"
-msgstr "ยํ่็๓"
-
-#: ../buffer.c:3531
-msgid "Top"
-msgstr "อเโๅ๐๕๓"
-
-#: ../buffer.c:4244
-msgid ""
-"\n"
-"# Buffer list:\n"
-msgstr ""
-"\n"
-"# ั๏่๑๎๊ แ๓๔ๅ๐๎โ:\n"
-
-#: ../buffer.c:4289
-msgid "[Scratch]"
-msgstr "[ย๐ๅ์ๅํํ๛้]"
-
-#: ../buffer.c:4529
-msgid ""
-"\n"
-"--- Signs ---"
-msgstr ""
-"\n"
-"--- วํเ๗๊่ ---"
-
-#: ../buffer.c:4538
-#, c-format
-msgid "Signs for %s:"
-msgstr "วํเ๗๊่ ไ๋ %s:"
-
-#: ../buffer.c:4543
-#, c-format
-msgid " line=%<PRId64> id=%d name=%s"
-msgstr " ๑๒๐๎๊เ=%<PRId64> id=%d ่์=%s"
-
-#: ../cursor_shape.c:68
-msgid "E545: Missing colon"
-msgstr "E545: ฯ๐๎๏๓๙ๅํ๎ ไโ๎ๅ๒๎๗่ๅ"
-
-#: ../cursor_shape.c:70 ../cursor_shape.c:94
-msgid "E546: Illegal mode"
-msgstr "E546: อๅไ๎๏๓๑๒่์๛้ ๐ๅๆ่์"
-
-#: ../cursor_shape.c:134
-msgid "E548: digit expected"
-msgstr "E548: า๐ๅแ๓ๅ๒๑ โโๅ๑๒่ ๖่๔๐๓"
-
-#: ../cursor_shape.c:138
-msgid "E549: Illegal percentage"
-msgstr "E549: อๅไ๎๏๓๑๒่์๎ๅ ็ํเ๗ๅํ่ๅ ๏๐๎๖ๅํ๒๎โ"
-
-#: ../diff.c:146
-#, c-format
-msgid "E96: Can not diff more than %<PRId64> buffers"
-msgstr "E96: ั๋ๅไ่๒ ็เ ๎๒๋่๗่์่ ์๎ๆํ๎ ํๅ แ๎๋ๅๅ ๗ๅ์ โ %<PRId64> แ๓๔ๅ๐เ๕"
-
-#: ../diff.c:753
-msgid "E810: Cannot read or write temp files"
-msgstr "E810: อๅโ๎็์๎ๆํ๎ ๏๐๎๗่๒เ๒ ่๋่ ็เ๏่๑เ๒ โ๐ๅ์ๅํํ๛ๅ ๔เ้๋๛"
-
-#: ../diff.c:755
-msgid "E97: Cannot create diffs"
-msgstr "E97: อๅโ๎็์๎ๆํ๎ ๑๎็ไเ๒ ๔เ้๋๛ ๎๒๋่๗่้"
-
-#: ../diff.c:966
-msgid "E816: Cannot read patch output"
-msgstr "E816: อๅโ๎็์๎ๆํ๎ ๏๐๎๗่๒เ๒ โ๛โ๎ไ patch"
-
-#: ../diff.c:1220
-msgid "E98: Cannot read diff output"
-msgstr "E98: อๅโ๎็์๎ๆํ๎ ๏๐๎๗่๒เ๒ โ๛โ๎ไ diff"
-
-#: ../diff.c:2081
-msgid "E99: Current buffer is not in diff mode"
-msgstr "E99: ภ๊๒่โํ๛้ แ๓๔ๅ๐ ํๅ ํเ๕๎ไ่๒๑ โ ๐ๅๆ่์ๅ ๎๒๋่๗่้"
-
-#: ../diff.c:2100
-msgid "E793: No other buffer in diff mode is modifiable"
-msgstr "E793: ม๎๋๘ๅ ํๅ๒ ่็์ๅํๅ์๛๕ แ๓๔ๅ๐๎โ โ ๐ๅๆ่์ๅ ๎๒๋่๗่้"
-
-#: ../diff.c:2102
-msgid "E100: No other buffer in diff mode"
-msgstr "E100: ม๎๋๘ๅ ํๅ๒ แ๓๔ๅ๐๎โ โ ๐ๅๆ่์ๅ ๎๒๋่๗่้"
-
-#: ../diff.c:2112
-msgid "E101: More than two buffers in diff mode, don't know which one to use"
-msgstr "E101: ย ๐ๅๆ่์ๅ ๎๒๋่๗่้ แ๎๋ๅๅ ไโ๓๕ แ๓๔ๅ๐๎โ, ํๅ ์๎ใ๓ โ๛แ๐เ๒"
-
-#: ../diff.c:2141
-#, c-format
-msgid "E102: Can't find buffer \"%s\""
-msgstr "E102: อๅ ์๎ใ๓ ํเ้๒่ แ๓๔ๅ๐ \"%s\""
-
-#: ../diff.c:2152
-#, c-format
-msgid "E103: Buffer \"%s\" is not in diff mode"
-msgstr "E103: ม๓๔ๅ๐ \"%s\" ํๅ ํเ๕๎ไ่๒๑ โ ๐ๅๆ่์ๅ ๎๒๋่๗่้"
-
-#: ../diff.c:2193
-msgid "E787: Buffer changed unexpectedly"
-msgstr "E787: ม๓๔ๅ๐ ํๅ๎ๆ่ไเํํ๎ ่็์ๅํ่๋๑"
-
-#: ../digraph.c:1598
-msgid "E104: Escape not allowed in digraph"
-msgstr "E104: ๊๐เํ่๐๓๙่้ ๑่์โ๎๋ Escape ํๅ๋็ ่๑๏๎๋็๎โเ๒ โ ไ่ใ๐เ๔ๅ"
-
-#: ../digraph.c:1760
-msgid "E544: Keymap file not found"
-msgstr "E544: ิเ้๋ ๑ ๐เ๑๊๋เไ๊๎้ ๊๋เโ่เ๒๓๐๛ ํๅ ํเ้ไๅํ"
-
-#: ../digraph.c:1785
-msgid "E105: Using :loadkeymap not in a sourced file"
-msgstr "E105: ส๎์เํไเ :loadkeymap ๏๐่์ๅํๅํเ โํๅ ๔เ้๋เ ๑๖ๅํเ๐่"
-
-#: ../digraph.c:1821
-msgid "E791: Empty keymap entry"
-msgstr "E791: ๏๓๑๒เ ็เ๏่๑ ๐เ๑๊๋เไ๊่ ๊๋เโ่เ๒๓๐๛"
-
-#: ../edit.c:82
-msgid " Keyword completion (^N^P)"
-msgstr " ภโ๒๎ไ๎๏๎๋ํๅํ่ๅ ๊๋๗ๅโ๎ใ๎ ๑๋๎โเ (^N^P)"
-
-#. ctrl_x_mode == 0, ^P/^N compl.
-#: ../edit.c:83
-msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-msgstr " ะๅๆ่์ ^X (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-
-#: ../edit.c:85
-msgid " Whole line completion (^L^N^P)"
-msgstr " ภโ๒๎ไ๎๏๎๋ํๅํ่ๅ ๖ๅ๋๎้ ๑๒๐๎๊่ (^L^N^P)"
-
-#: ../edit.c:86
-msgid " File name completion (^F^N^P)"
-msgstr " ภโ๒๎ไ๎๏๎๋ํๅํ่ๅ ่์ๅํ่ ๔เ้๋เ (^F^N^P)"
-
-#: ../edit.c:87
-msgid " Tag completion (^]^N^P)"
-msgstr " ภโ๒๎ไ๎๏๎๋ํๅํ่ๅ ์ๅ๒๊่ (^]^N^P)"
-
-#: ../edit.c:88
-msgid " Path pattern completion (^N^P)"
-msgstr " ภโ๒๎ไ๎๏๎๋ํๅํ่ๅ ๘เแ๋๎ํเ ๏๓๒่ (^N^P)"
-
-#: ../edit.c:89
-msgid " Definition completion (^D^N^P)"
-msgstr " ภโ๒๎ไ๎๏๎๋ํๅํ่ๅ ๎๏๐ๅไๅ๋ๅํ่ (^D^N^P)"
-
-#: ../edit.c:91
-msgid " Dictionary completion (^K^N^P)"
-msgstr " ภโ๒๎ไ๎๏๎๋ํๅํ่ๅ ๏๎ ๑๋๎โเ๐ (^K^N^P)"
-
-#: ../edit.c:92
-msgid " Thesaurus completion (^T^N^P)"
-msgstr " ภโ๒๎ไ๎๏๎๋ํๅํ่ๅ ๑่ํ๎ํ่์๎โ (^T^N^P)"
-
-#: ../edit.c:93
-msgid " Command-line completion (^V^N^P)"
-msgstr " ภโ๒๎ไ๎๏๎๋ํๅํ่ๅ ๊๎์เํไํ๎้ ๑๒๐๎๊่ (^V^N^P)"
-
-#: ../edit.c:94
-msgid " User defined completion (^U^N^P)"
-msgstr " ฯ๎๋็๎โเ๒ๅ๋๑๊๎ๅ เโ๒๎ไ๎๏๎๋ํๅํ่ๅ (^U^N^P)"
-
-#: ../edit.c:95
-msgid " Omni completion (^O^N^P)"
-msgstr " Omni-ไ๎๏๎๋ํๅํ่ๅ (^O^N^P)"
-
-#: ../edit.c:96
-msgid " Spelling suggestion (s^N^P)"
-msgstr " ฯ๐ๅไ๋๎ๆๅํ่ๅ ่๑๏๐เโ๋ๅํ่ ๏๐เโ๎๏่๑เํ่ (s^N^P)"
-
-#: ../edit.c:97
-msgid " Keyword Local completion (^N^P)"
-msgstr " ฬๅ๑๒ํ๎ๅ เโ๒๎ไ๎๏๎๋ํๅํ่ๅ ๊๋๗ๅโ๎ใ๎ ๑๋๎โเ (^N^P)"
-
-#: ../edit.c:100
-msgid "Hit end of paragraph"
-msgstr "ส๎ํๅ๖ เแ็เ๖เ"
-
-#: ../edit.c:101
-msgid "E839: Completion function changed window"
-msgstr "E839: ิ๓ํ๊๖่ เโ๒๎ไ๎๏๎๋ํๅํ่ ่็์ๅํ่๋เ ๎๊ํ๎"
-
-#: ../edit.c:102
-msgid "E840: Completion function deleted text"
-msgstr "E840: ิ๓ํ๊๖่ เโ๒๎ไ๎๏๎๋ํๅํ่ ๓ไเ๋่๋เ ๒ๅ๊๑๒"
-
-#: ../edit.c:1847
-msgid "'dictionary' option is empty"
-msgstr "อๅ ็เไเํ๎ ็ํเ๗ๅํ่ๅ ๎๏๖่่ 'dictionary'"
-
-#: ../edit.c:1848
-msgid "'thesaurus' option is empty"
-msgstr "อๅ ็เไเํ๎ ็ํเ๗ๅํ่ๅ ๎๏๖่่ 'thesaurus'"
-
-#: ../edit.c:2655
-#, c-format
-msgid "Scanning dictionary: %s"
-msgstr "ฯ๐๎๑์๎๒๐ ๑๋๎โเ๐: %s"
-
-#: ../edit.c:3079
-msgid " (insert) Scroll (^E/^Y)"
-msgstr " (โ๑๒เโ๊เ) ฯ๐๎๊๐๓๒๊เ (^E/^Y)"
-
-#: ../edit.c:3081
-msgid " (replace) Scroll (^E/^Y)"
-msgstr " (็เ์ๅํเ) ฯ๐๎๊๐๓๒๊เ (^E/^Y)"
-
-#: ../edit.c:3587
-#, c-format
-msgid "Scanning: %s"
-msgstr "ฯ๐๎๑์๎๒๐: %s"
-
-#: ../edit.c:3614
-msgid "Scanning tags."
-msgstr "ย๛๏๎๋ํๅ๒๑ ๏๎่๑๊ ๑๐ๅไ่ ์ๅ๒๎๊."
-
-#: ../edit.c:4519
-msgid " Adding"
-msgstr " ฤ๎แเโ๋ๅํ่ๅ"
-
-#. showmode might reset the internal line pointers, so it must
-#. * be called before line = ml_get(), or when this address is no
-#. * longer needed. -- Acevedo.
-#.
-#: ../edit.c:4562
-msgid "-- Searching..."
-msgstr "-- ฯ๎่๑๊..."
-
-#: ../edit.c:4618
-msgid "Back at original"
-msgstr "ศ๑๕๎ไํ๎ๅ ๑๋๎โ๎"
-
-#: ../edit.c:4621
-msgid "Word from other line"
-msgstr "ั๋๎โ๎ ่็ ไ๐๓ใ๎้ ๑๒๐๎๊่"
-
-#: ../edit.c:4624
-msgid "The only match"
-msgstr "ลไ่ํ๑๒โๅํํ๎ๅ ๑๎๎๒โๅ๒๑๒โ่ๅ"
-
-#: ../edit.c:4680
-#, c-format
-msgid "match %d of %d"
-msgstr "๑๎๎๒โๅ๒๑๒โ่ๅ %d ่็ %d"
-
-#: ../edit.c:4684
-#, c-format
-msgid "match %d"
-msgstr "๑๎๎๒โๅ๒๑๒โ่ๅ %d"
-
-#: ../eval.c:137
-msgid "E18: Unexpected characters in :let"
-msgstr "E18: อๅ๎ๆ่ไเํํ๛ๅ ๑่์โ๎๋๛ โ :let"
-
-#: ../eval.c:138
-#, c-format
-msgid "E684: list index out of range: %<PRId64>"
-msgstr "E684: ศํไๅ๊๑ ๑๏่๑๊เ ็เ ๏๐ๅไๅ๋เ์่ ไ่เ๏เ็๎ํเ: %<PRId64>"
-
-#: ../eval.c:139
-#, c-format
-msgid "E121: Undefined variable: %s"
-msgstr "E121: อๅ๎๏๐ๅไๅ๋ธํํเ ๏ๅ๐ๅ์ๅํํเ: %s"
-
-#: ../eval.c:140
-msgid "E111: Missing ']'"
-msgstr "E111: ฯ๐๎๏๓๙ๅํเ ']'"
-
-#: ../eval.c:141
-#, c-format
-msgid "E686: Argument of %s must be a List"
-msgstr "E686: ฯเ๐เ์ๅ๒๐ %s ไ๎๋ๆๅํ แ๛๒ ๑๏่๑๊๎์"
-
-#: ../eval.c:143
-#, c-format
-msgid "E712: Argument of %s must be a List or Dictionary"
-msgstr "E712: ฯเ๐เ์ๅ๒๐ %s ไ๎๋ๆๅํ แ๛๒ ๑๏่๑๊๎์ ่๋่ ๑๋๎โเ๐ธ์"
-
-#: ../eval.c:144
-msgid "E713: Cannot use empty key for Dictionary"
-msgstr "E713: อๅโ๎็์๎ๆํ๎ ่๑๏๎๋็๎โเ๒ ๏๓๑๒๎้ ๊๋๗ ไ๋ ๑๋๎โเ๐"
-
-#: ../eval.c:145
-msgid "E714: List required"
-msgstr "E714: า๐ๅแ๓ๅ๒๑ ๑๏่๑๎๊"
-
-#: ../eval.c:146
-msgid "E715: Dictionary required"
-msgstr "E715: า๐ๅแ๓ๅ๒๑ ๑๋๎โเ๐"
-
-#: ../eval.c:147
-#, c-format
-msgid "E118: Too many arguments for function: %s"
-msgstr "E118: ั๋่๘๊๎์ ์ํ๎ใ๎ ๏เ๐เ์ๅ๒๐๎โ ไ๋ ๔๓ํ๊๖่่ %s"
-
-#: ../eval.c:148
-#, c-format
-msgid "E716: Key not present in Dictionary: %s"
-msgstr "E716: อๅ๒ ๊๋๗เ โ ๑๋๎โเ๐ๅ: %s"
-
-#: ../eval.c:150
-#, c-format
-msgid "E122: Function %s already exists, add ! to replace it"
-msgstr "E122: ิ๓ํ๊๖่ %s ๓ๆๅ ๑๓๙ๅ๑๒โ๓ๅ๒. ฤ๎แเโ๒ๅ !, ๗๒๎แ๛ ็เ์ๅํ่๒ ๅธ."
-
-#: ../eval.c:151
-msgid "E717: Dictionary entry already exists"
-msgstr "E717: วเ๏่๑ ๓ๆๅ ๑๓๙ๅ๑๒โ๓ๅ๒ โ ๑๋๎โเ๐ๅ"
-
-#: ../eval.c:152
-msgid "E718: Funcref required"
-msgstr "E718: า๐ๅแ๓ๅ๒๑ ๑๑๛๋๊เ ํเ ๔๓ํ๊๖่"
-
-#: ../eval.c:153
-msgid "E719: Cannot use [:] with a Dictionary"
-msgstr "E719: อๅโ๎็์๎ๆํ๎ ่๑๏๎๋็๎โเ๒ [:] ๑๎ ๑๋๎โเ๐ธ์"
-
-#: ../eval.c:154
-#, c-format
-msgid "E734: Wrong variable type for %s="
-msgstr "E734: อๅ๏๐เโ่๋ํ๛้ ๒่๏ ๏ๅ๐ๅ์ๅํํ๎้ ไ๋ %s="
-
-#: ../eval.c:155
-#, c-format
-msgid "E130: Unknown function: %s"
-msgstr "E130: อๅ่็โๅ๑๒ํเ ๔๓ํ๊๖่: %s"
-
-#: ../eval.c:156
-#, c-format
-msgid "E461: Illegal variable name: %s"
-msgstr "E461: อๅไ๎๏๓๑๒่์๎ๅ ่์ ๏ๅ๐ๅ์ๅํํ๎้: %s"
-
-#: ../eval.c:157
-msgid "E806: using Float as a String"
-msgstr "E806: ศ๑๏๎๋็๎โเํ่ๅ ๗่๑๋เ ๑ ๏๋เโเ๙ๅ้ ๒๎๗๊๎้ ๊เ๊ ๑๒๐๎๊่"
-
-#: ../eval.c:1830
-msgid "E687: Less targets than List items"
-msgstr "E687: ึๅ๋ๅ้ ์ๅํ๘ๅ ๗ๅ์ ๋ๅ์ๅํ๒๎โ ๑๏่๑๊เ"
-
-#: ../eval.c:1834
-msgid "E688: More targets than List items"
-msgstr "E688: ึๅ๋ๅ้ แ๎๋๘ๅ ๗ๅ์ ๋ๅ์ๅํ๒๎โ ๑๏่๑๊เ"
-
-#: ../eval.c:1906
-msgid "Double ; in list of variables"
-msgstr "ฤโ๎้ํเ ; โ ๑๏่๑๊ๅ ๏ๅ๐ๅ์ๅํํ๛๕"
-
-#: ../eval.c:2078
-#, c-format
-msgid "E738: Can't list variables for %s"
-msgstr "E738: อๅโ๎็์๎ๆํ๎ ๎๒๎แ๐เ็่๒ ๏ๅ๐ๅ์ๅํํ๛ๅ ไ๋ %s"
-
-#: ../eval.c:2391
-msgid "E689: Can only index a List or Dictionary"
-msgstr "E689: ศํไๅ๊๑่๐๎โเํ่ๅ โ๎็์๎ๆํ๎ ๒๎๋๊๎ ๑๏่๑๊เ ่๋่ ๑๋๎โเ๐"
-
-#: ../eval.c:2396
-msgid "E708: [:] must come last"
-msgstr "E708: [:] ไ๎๋ๆํ๎ แ๛๒ ๏๎๑๋ๅไํ่์"
-
-#: ../eval.c:2439
-msgid "E709: [:] requires a List value"
-msgstr "E709: [:] ๒๐ๅแ๓ๅ๒ ็ํเ๗ๅํ่ๅ์ ๑๏่๑๎๊"
-
-#: ../eval.c:2674
-msgid "E710: List value has more items than target"
-msgstr "E710: ๋ๅ์ๅํ๒๎โ ๑๏่๑๊เ-็ํเ๗ๅํ่ แ๎๋๘ๅ ๗ๅ์ โ ๖ๅ๋่"
-
-#: ../eval.c:2678
-msgid "E711: List value has not enough items"
-msgstr "E711: ั๏่๑๎๊-็ํเ๗ๅํ่ๅ ํๅ ๑๎ไๅ๐ๆ่๒ ไ๎๑๒เ๒๎๗ํ๎ ๋ๅ์ๅํ๒๎โ"
-
-#: ../eval.c:2867
-msgid "E690: Missing \"in\" after :for"
-msgstr "E690: ฯ๐๎๏๓๙ๅํ๎ \"in\" ๏๎๑๋ๅ :for"
-
-#: ../eval.c:3063
-#, c-format
-msgid "E107: Missing parentheses: %s"
-msgstr "E107: ฯ๐๎๏๓๙ๅํ๛ ๑๊๎แ๊่: %s"
-
-#: ../eval.c:3263
-#, c-format
-msgid "E108: No such variable: \"%s\""
-msgstr "E108: อๅ๒ ๒เ๊๎้ ๏ๅ๐ๅ์ๅํํ๎้: \"%s\""
-
-#: ../eval.c:3333
-msgid "E743: variable nested too deep for (un)lock"
-msgstr "E743: ั๋่๘๊๎์ ใ๋๓แ๎๊๎ โ๋๎ๆๅํํ๛ๅ ๏ๅ๐ๅ์ๅํํ๛ๅ ไ๋ (๐เ็)แ๋๎๊่๐๎โ๊่"
-
-#: ../eval.c:3630
-msgid "E109: Missing ':' after '?'"
-msgstr "E109: ฯ๐๎๏๓๙ๅํ๎ ':' ๏๎๑๋ๅ '?'"
-
-#: ../eval.c:3893
-msgid "E691: Can only compare List with List"
-msgstr "E691: ั๏่๑๎๊ ์๎ๆํ๎ ๑๐เโํ่โเ๒ ๒๎๋๊๎ ๑๎ ๑๏่๑๊๎์"
-
-#: ../eval.c:3895
-msgid "E692: Invalid operation for Lists"
-msgstr "E692: อๅไ๎๏๓๑๒่์เ ๎๏ๅ๐เ๖่ ไ๋ ๑๏่๑๊๎โ"
-
-#: ../eval.c:3915
-msgid "E735: Can only compare Dictionary with Dictionary"
-msgstr "E735: ั๋๎โเ๐ ์๎ๆํ๎ ๑๐เโํ่โเ๒ ๒๎๋๊๎ ๑๎ ๑๋๎โเ๐ธ์"
-
-#: ../eval.c:3917
-msgid "E736: Invalid operation for Dictionary"
-msgstr "E736: อๅไ๎๏๓๑๒่์เ ๎๏ๅ๐เ๖่ ไ๋ ๑๋๎โเ๐"
-
-#: ../eval.c:3932
-msgid "E693: Can only compare Funcref with Funcref"
-msgstr "E693: ั๑๛๋๊๓ ํเ ๔๓ํ๊๖่ ์๎ๆํ๎ ๑๐เโํ่โเ๒ ๒๎๋๊๎ ๑ ๑๑๛๋๊๎้ ํเ ๔๓ํ๊๖่"
-
-#: ../eval.c:3934
-msgid "E694: Invalid operation for Funcrefs"
-msgstr "E694: อๅไ๎๏๓๑๒่์เ ๎๏ๅ๐เ๖่ ไ๋ ๑๑๛๋๊่ ํเ ๔๓ํ๊๖่"
-
-#: ../eval.c:4277
-msgid "E804: Cannot use '%' with Float"
-msgstr "E804: อๅโ๎็์๎ๆํ๎ ่๑๏๎๋็๎โเ๒ '%' ๑ ๗่๑๋๎์ ๑ ๏๋เโเ๙ๅ้ ๒๎๗๊๎้"
-
-#: ../eval.c:4478
-msgid "E110: Missing ')'"
-msgstr "E110: ฯ๐๎๏๓๙ๅํเ ')'"
-
-#: ../eval.c:4609
-msgid "E695: Cannot index a Funcref"
-msgstr "E695: อๅโ๎็์๎ๆํ๎ ่ํไๅ๊๑่๐๎โเ๒ ๑๑๛๋๊๓ ํเ ๔๓ํ๊๖่"
-
-#: ../eval.c:4839
-#, c-format
-msgid "E112: Option name missing: %s"
-msgstr "E112: อๅ ๓๊เ็เํ๎ ่์ ๎๏๖่่: %s"
-
-#: ../eval.c:4855
-#, c-format
-msgid "E113: Unknown option: %s"
-msgstr "E113: อๅ่็โๅ๑๒ํเ ๎๏๖่: %s"
-
-#: ../eval.c:4904
-#, c-format
-msgid "E114: Missing quote: %s"
-msgstr "E114: ฯ๐๎๏๓๙ๅํเ ๊เโ๛๗๊เ: %s"
-
-#: ../eval.c:5020
-#, c-format
-msgid "E115: Missing quote: %s"
-msgstr "E115: ฯ๐๎๏๓๙ๅํเ ๊เโ๛๗๊เ: %s"
-
-#: ../eval.c:5084
-#, c-format
-msgid "E696: Missing comma in List: %s"
-msgstr "E696: ฯ๐๎๏๓๙ๅํเ ็เ๏๒เ โ ๑๏่๑๊ๅ: %s"
-
-#: ../eval.c:5091
-#, c-format
-msgid "E697: Missing end of List ']': %s"
-msgstr "E697: ฯ๐๎๏๓๙ๅํ๎ ๎๊๎ํ๗เํ่ๅ ๑๏่๑๊เ ']': %s"
-
-#: ../eval.c:6475
-#, c-format
-msgid "E720: Missing colon in Dictionary: %s"
-msgstr "E720: ฯ๐๎๏๓๙ๅํ๎ ไโ๎ๅ๒๎๗่ๅ โ ๑๋๎โเ๐ๅ: %s"
-
-#: ../eval.c:6499
-#, c-format
-msgid "E721: Duplicate key in Dictionary: \"%s\""
-msgstr "E721: ฯ๎โ๒๎๐ ๊๋๗เ โ ๑๋๎โเ๐ๅ: \"%s\""
-
-#: ../eval.c:6517
-#, c-format
-msgid "E722: Missing comma in Dictionary: %s"
-msgstr "E722: ฯ๐๎๏๓๙ๅํเ ็เ๏๒เ โ ๑๋๎โเ๐ๅ: %s"
-
-#: ../eval.c:6524
-#, c-format
-msgid "E723: Missing end of Dictionary '}': %s"
-msgstr "E723: ฯ๐๎๏๓๙ๅํ๎ ๎๊๎ํ๗เํ่ๅ ๑๋๎โเ๐ '}': %s"
-
-#: ../eval.c:6555
-msgid "E724: variable nested too deep for displaying"
-msgstr "E724: ั๋่๘๊๎์ ใ๋๓แ๎๊๎ โ๋๎ๆๅํํ๛ๅ ๏ๅ๐ๅ์ๅํํ๛ๅ ไ๋ ๎๒๎แ๐เๆๅํ่"
-
-#: ../eval.c:7188
-#, c-format
-msgid "E740: Too many arguments for function %s"
-msgstr "E740: ั๋่๘๊๎์ ์ํ๎ใ๎ ๏เ๐เ์ๅ๒๐๎โ ไ๋ ๔๓ํ๊๖่่ %s"
-
-#: ../eval.c:7190
-#, c-format
-msgid "E116: Invalid arguments for function %s"
-msgstr "E116: ฯเ๐เ์ๅ๒๐๛ ไ๋ ๔๓ํ๊๖่่ %s ็เไเํ๛ ํๅโๅ๐ํ๎"
-
-#: ../eval.c:7377
-#, c-format
-msgid "E117: Unknown function: %s"
-msgstr "E117: อๅ่็โๅ๑๒ํเ ๔๓ํ๊๖่: %s"
-
-#: ../eval.c:7383
-#, c-format
-msgid "E119: Not enough arguments for function: %s"
-msgstr "E119: อๅไ๎๑๒เ๒๎๗ํ๎ ๏เ๐เ์ๅ๒๐๎โ ไ๋ ๔๓ํ๊๖่่ %s"
-
-#: ../eval.c:7387
-#, c-format
-msgid "E120: Using <SID> not in a script context: %s"
-msgstr "E120: <SID> ่๑๏๎๋็๓ๅ๒๑ โํๅ ๑๖ๅํเ๐่: %s"
-
-#: ../eval.c:7391
-#, c-format
-msgid "E725: Calling dict function without Dictionary: %s"
-msgstr "E725: ย๛็๎โ ๔๓ํ๊๖่่ dict แๅ็ ๑๋๎โเ๐: %s"
-
-#: ../eval.c:7453
-msgid "E808: Number or Float required"
-msgstr "E808: า๐ๅแ๓ๅ๒๑ ๖ๅ๋๎ๅ ๗่๑๋๎ ่๋่ ๑ ๏๋เโเ๙ๅ้ ๒๎๗๊๎้"
-
-#: ../eval.c:7503
-msgid "add() argument"
-msgstr "๏เ๐เ์ๅ๒๐เ add()"
-
-#: ../eval.c:7907
-msgid "E699: Too many arguments"
-msgstr "E699: ั๋่๘๊๎์ ์ํ๎ใ๎ ๏เ๐เ์ๅ๒๐๎โ"
-
-#: ../eval.c:8073
-msgid "E785: complete() can only be used in Insert mode"
-msgstr "E785: complete() ์๎ๆๅ๒ ่๑๏๎๋็๎โเ๒๑ ๒๎๋๊๎ โ ๐ๅๆ่์ๅ ย๑๒เโ๊่"
-
-#: ../eval.c:8156
-msgid "&Ok"
-msgstr "&Ok"
-
-#: ../eval.c:8676
-#, c-format
-msgid "E737: Key already exists: %s"
-msgstr "E737: ส๋๗ ๓ๆๅ ๑๓๙ๅ๑๒โ๓ๅ๒: %s"
-
-#: ../eval.c:8692
-msgid "extend() argument"
-msgstr "๏เ๐เ์ๅ๒๐เ extend()"
-
-#: ../eval.c:8915
-msgid "map() argument"
-msgstr "๏เ๐เ์ๅ๒๐เ map()"
-
-#: ../eval.c:8916
-msgid "filter() argument"
-msgstr "๏เ๐เ์ๅ๒๐เ filter()"
-
-#: ../eval.c:9229
-#, c-format
-msgid "+-%s%3ld lines: "
-msgstr "+-%s%3ld ๑๒๐๎๊: "
-
-#: ../eval.c:9291
-#, c-format
-msgid "E700: Unknown function: %s"
-msgstr "E700: อๅ่็โๅ๑๒ํเ ๔๓ํ๊๖่: %s"
-
-#: ../eval.c:10729
-msgid "called inputrestore() more often than inputsave()"
-msgstr "ิ๓ํ๊๖่ inputrestore() โ๛็๛โเๅ๒๑ ๗เ๙ๅ, ๗ๅ์ ๔๓ํ๊๖่ inputsave()"
-
-#: ../eval.c:10771
-msgid "insert() argument"
-msgstr "๏เ๐เ์ๅ๒๐เ insert()"
-
-#: ../eval.c:10841
-msgid "E786: Range not allowed"
-msgstr "E786: ฤ่เ๏เ็๎ํ ํๅ ไ๎๏๓๑๊เๅ๒๑"
-
-#: ../eval.c:11140
-msgid "E701: Invalid type for len()"
-msgstr "E701: อๅ๏๐เโ่๋ํ๛ๅ ๒่๏ ไ๋ len()"
-
-#: ../eval.c:11980
-msgid "E726: Stride is zero"
-msgstr "E726: อ๓๋ๅโ๎้ ๘เใ"
-
-#: ../eval.c:11982
-msgid "E727: Start past end"
-msgstr "E727: อเ๗เ๋๎ ๏๎๑๋ๅ ๊๎ํ๖เ"
-
-#: ../eval.c:12024 ../eval.c:15297
-msgid "<empty>"
-msgstr "<๏๓๑๒๎>"
-
-#: ../eval.c:12282
-msgid "remove() argument"
-msgstr "๏เ๐เ์ๅ๒๐เ remove()"
-
-#: ../eval.c:12466
-msgid "E655: Too many symbolic links (cycle?)"
-msgstr "E655: ั๋่๘๊๎์ ์ํ๎ใ๎ ๑่์โ๎๋่๗ๅ๑๊่๕ ๑๑๛๋๎๊ (๖่๊๋?)"
-
-#: ../eval.c:12593
-msgid "reverse() argument"
-msgstr "๏เ๐เ์ๅ๒๐เ reverse()"
-
-#: ../eval.c:13721
-msgid "sort() argument"
-msgstr "๏เ๐เ์ๅ๒๐เ sort()"
-
-#: ../eval.c:13721
-msgid "uniq() argument"
-msgstr "๏เ๐เ์ๅ๒๐เ uniq()"
-
-#: ../eval.c:13776
-msgid "E702: Sort compare function failed"
-msgstr "E702: อๅ๓ไเ๗ํ๎ๅ ็เโๅ๐๘ๅํ่ๅ ๔๓ํ๊๖่่ ๑๐เโํๅํ่ ๏๐่ ๑๎๐๒่๐๎โ๊ๅ"
-
-#: ../eval.c:13806
-msgid "E882: Uniq compare function failed"
-msgstr ""
-"E882: อๅ๓ไเ๗ํ๎ๅ ็เโๅ๐๘ๅํ่ๅ ๔๓ํ๊๖่่ ๑๐เโํๅํ่ ๏๐่ ๏๐๎โๅ๐๊ๅ ๅไ่ํ๑๒โๅํํ๎๑๒่"
-
-#: ../eval.c:14085
-msgid "(Invalid)"
-msgstr "(อๅ๏๐เโ่๋ํ๎)"
-
-#: ../eval.c:14590
-msgid "E677: Error writing temp file"
-msgstr "E677: ฮ๘่แ๊เ ็เ๏่๑่ โ๎ โ๐ๅ์ๅํํ๛้ ๔เ้๋"
-
-#: ../eval.c:16159
-msgid "E805: Using a Float as a Number"
-msgstr "E805: ศ๑๏๎๋็๎โเํ่ๅ ๗่๑๋เ ๑ ๏๋เโเ๙ๅ้ ๒๎๗๊๎้ ๊เ๊ ๖ๅ๋๎ใ๎"
-
-#: ../eval.c:16162
-msgid "E703: Using a Funcref as a Number"
-msgstr "E703: ศ๑๏๎๋็๎โเํ่ๅ ๑๑๛๋๊่ ํเ ๔๓ํ๊๖่ ๊เ๊ ๗่๑๋เ"
-
-#: ../eval.c:16170
-msgid "E745: Using a List as a Number"
-msgstr "E745: ศ๑๏๎๋็๎โเํ่ๅ ๑๏่๑๊เ ๊เ๊ ๗่๑๋เ"
-
-#: ../eval.c:16173
-msgid "E728: Using a Dictionary as a Number"
-msgstr "E728: ศ๑๏๎๋็๎โเํ่ๅ ๑๋๎โเ๐ ๊เ๊ ๗่๑๋เ"
-
-#: ../eval.c:16259
-msgid "E729: using Funcref as a String"
-msgstr "E729: ศ๑๏๎๋็๎โเํ่ๅ ๑๑๛๋๊่ ํเ ๔๓ํ๊๖่ ๊เ๊ ๑๒๐๎๊่"
-
-#: ../eval.c:16262
-msgid "E730: using List as a String"
-msgstr "E730: ศ๑๏๎๋็๎โเํ่ๅ ๑๏่๑๊เ ๊เ๊ ๑๒๐๎๊่"
-
-#: ../eval.c:16265
-msgid "E731: using Dictionary as a String"
-msgstr "E731: ศ๑๏๎๋็๎โเํ่ๅ ๑๋๎โเ๐ ๊เ๊ ๑๒๐๎๊่"
-
-#: ../eval.c:16619
-#, c-format
-msgid "E706: Variable type mismatch for: %s"
-msgstr "E706: อๅ๑๎๎๒โๅ๒๑๒โ่ๅ ๒่๏เ ๏ๅ๐ๅ์ๅํํ๎้ ไ๋: %s"
-
-#: ../eval.c:16705
-#, c-format
-msgid "E795: Cannot delete variable %s"
-msgstr "E795: อๅโ๎็์๎ๆํ๎ ๓ไเ๋่๒ ๏ๅ๐ๅ์ๅํํ๓ %s"
-
-#: ../eval.c:16724
-#, c-format
-msgid "E704: Funcref variable name must start with a capital: %s"
-msgstr ""
-"E704: ศ์ ๏ๅ๐ๅ์ๅํํ๎้ ๑๑๛๋๊่ ํเ ๔๓ํ๊๖่ ไ๎๋ๆํ๎ ํเ๗่ํเ๒๑ ๑ ็เใ๋เโํ๎้ แ๓๊โ๛: "
-"%s"
-
-#: ../eval.c:16732
-#, c-format
-msgid "E705: Variable name conflicts with existing function: %s"
-msgstr "E705: ศ์ ๏ๅ๐ๅ์ๅํํ๎้ ๊๎ํ๔๋่๊๒๓ๅ๒ ๑ ๑๓๙ๅ๑๒โ๓๙ๅ้ ๔๓ํ๊๖่ๅ้: %s"
-
-#: ../eval.c:16763
-#, c-format
-msgid "E741: Value is locked: %s"
-msgstr "E741: วํเ๗ๅํ่ๅ %s ็เแ๋๎๊่๐๎โเํ๎"
-
-#: ../eval.c:16764 ../eval.c:16769 ../message.c:1839
-msgid "Unknown"
-msgstr "อๅ่็โๅ๑๒ํ๎"
-
-#: ../eval.c:16768
-#, c-format
-msgid "E742: Cannot change value of %s"
-msgstr "E742: อๅโ๎็์๎ๆํ๎ ่็์ๅํ่๒ ็ํเ๗ๅํ่ๅ %s"
-
-#: ../eval.c:16838
-msgid "E698: variable nested too deep for making a copy"
-msgstr "E698: ั๋่๘๊๎์ ใ๋๓แ๎๊๎ โ๋๎ๆๅํํ๛ๅ ๏ๅ๐ๅ์ๅํํ๛ๅ ไ๋ ๊๎๏่๐๎โเํ่"
-
-#: ../eval.c:17249
-#, c-format
-msgid "E123: Undefined function: %s"
-msgstr "E123: อๅ๎๏๐ๅไๅ๋ธํํเ ๔๓ํ๊๖่: %s"
-
-#: ../eval.c:17260
-#, c-format
-msgid "E124: Missing '(': %s"
-msgstr "E124: ฯ๐๎๏๓๙ๅํเ '(': %s"
-
-#: ../eval.c:17293
-msgid "E862: Cannot use g: here"
-msgstr "E862: วไๅ๑ ํๅโ๎็์๎ๆํ๎ ่๑๏๎๋็๎โเ๒ g:"
-
-#: ../eval.c:17312
-#, c-format
-msgid "E125: Illegal argument: %s"
-msgstr "E125: อๅไ๎๏๓๑๒่์๛้ ๏เ๐เ์ๅ๒๐: %s"
-
-#: ../eval.c:17323
-#, c-format
-msgid "E853: Duplicate argument name: %s"
-msgstr "E853: ฯ๎โ๒๎๐๙ๅๅ๑ ่์ ๏เ๐เ์ๅ๒๐เ: %s"
-
-#: ../eval.c:17416
-msgid "E126: Missing :endfunction"
-msgstr "E126: ฯ๐๎๏๓๙ๅํเ ๊๎์เํไเ :endfunction"
-
-#: ../eval.c:17537
-#, c-format
-msgid "E707: Function name conflicts with variable: %s"
-msgstr "E707: ศ์ ๔๓ํ๊๖่่ ๊๎ํ๔๋่๊๒๓ๅ๒ ๑ ๏ๅ๐ๅ์ๅํํ๎้: %s"
-
-#: ../eval.c:17549
-#, c-format
-msgid "E127: Cannot redefine function %s: It is in use"
-msgstr "E127: อๅโ๎็์๎ๆํ๎ ๏ๅ๐ๅ๎๏๐ๅไๅ๋่๒ ๔๓ํ๊๖่ %s, ๎ํเ ่๑๏๎๋็๓ๅ๒๑"
-
-#: ../eval.c:17604
-#, c-format
-msgid "E746: Function name does not match script file name: %s"
-msgstr "E746: ศ์ ๔๓ํ๊๖่่ ํๅ ๑๎๎๒โๅ๒๑๒โ๓ๅ๒ ่์ๅํ่ ๔เ้๋เ ๑๖ๅํเ๐่: %s"
-
-#: ../eval.c:17716
-msgid "E129: Function name required"
-msgstr "E129: า๐ๅแ๓ๅ๒๑ ่์ ๔๓ํ๊๖่่"
-
-#: ../eval.c:17824
-#, c-format
-msgid "E128: Function name must start with a capital or \"s:\": %s"
-msgstr "E128: ศ์ ๔๓ํ๊๖่่ ไ๎๋ๆํ๎ ํเ๗่ํเ๒๑ ๑ ็เใ๋เโํ๎้ แ๓๊โ๛ ่๋่ \"s:\": %s"
-
-#: ../eval.c:17833
-#, c-format
-msgid "E884: Function name cannot contain a colon: %s"
-msgstr "E884: ศ์ ๔๓ํ๊๖่่ ํๅ ์๎ๆๅ๒ ๑๎ไๅ๐ๆเ๒ ไโ๎ๅ๒๎๗่ๅ: %s"
-
-#: ../eval.c:18336
-#, c-format
-msgid "E131: Cannot delete function %s: It is in use"
-msgstr "E131: อๅโ๎็์๎ๆํ๎ ๓ไเ๋่๒ ๔๓ํ๊๖่ %s, ๎ํเ ่๑๏๎๋็๓ๅ๒๑"
-
-#: ../eval.c:18441
-msgid "E132: Function call depth is higher than 'maxfuncdepth'"
-msgstr "E132: ร๋๓แ่ํเ โ๛็๎โเ ๔๓ํ๊๖่่ แ๎๋๘ๅ, ๗ๅ์ ็ํเ๗ๅํ่ๅ 'maxfuncdepth'"
-
-#: ../eval.c:18568
-#, c-format
-msgid "calling %s"
-msgstr "โ๛็๎โ %s"
-
-#: ../eval.c:18651
-#, c-format
-msgid "%s aborted"
-msgstr "%s ๏๐ๅ๐โเํเ"
-
-#: ../eval.c:18653
-#, c-format
-msgid "%s returning #%<PRId64>"
-msgstr "%s โ๎็โ๐เ๙เๅ๒ #%<PRId64>"
-
-#: ../eval.c:18670
-#, c-format
-msgid "%s returning %s"
-msgstr "%s โ๎็โ๐เ๙เๅ๒ %s"
-
-#: ../eval.c:18691 ../ex_cmds2.c:2695
-#, c-format
-msgid "continuing in %s"
-msgstr "๏๐๎ไ๎๋ๆๅํ่ๅ โ %s"
-
-#: ../eval.c:18795
-msgid "E133: :return not inside a function"
-msgstr "E133: ๊๎์เํไเ :return โํๅ ๔๓ํ๊๖่่"
-
-#: ../eval.c:19159
-msgid ""
-"\n"
-"# global variables:\n"
-msgstr ""
-"\n"
-"# ใ๋๎แเ๋ํ๛ๅ ๏ๅ๐ๅ์ๅํํ๛ๅ:\n"
-
-#: ../eval.c:19254
-msgid ""
-"\n"
-"\tLast set from "
-msgstr ""
-"\n"
-"\tย ๏๎๑๋ๅไํ่้ ๐เ็ ๎๏๖่ ่็์ๅํๅํเ โ "
-
-#: ../eval.c:19272
-msgid "No old files"
-msgstr "อๅ๒ ๑๒เ๐๛๕ ๔เ้๋๎โ"
-
-#: ../ex_cmds.c:122
-#, c-format
-msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
-msgstr "<%s>%s%s %d, Hex %02x, Octal %03o"
-
-#: ../ex_cmds.c:145
-#, c-format
-msgid "> %d, Hex %04x, Octal %o"
-msgstr "> %d, Hex %04x, Octal %o"
-
-#: ../ex_cmds.c:146
-#, c-format
-msgid "> %d, Hex %08x, Octal %o"
-msgstr "> %d, Hex %08x, Octal %o"
-
-#: ../ex_cmds.c:684
-msgid "E134: Move lines into themselves"
-msgstr "E134: ั๒๐๎๊่ ๏ๅ๐ๅ์ๅ๙เ๒๑ ๑เ์่ ํเ ๑ๅแ"
-
-#: ../ex_cmds.c:747
-msgid "1 line moved"
-msgstr "ฯๅ๐ๅ์ๅ๙ๅํเ ๎ไํเ ๑๒๐๎๊เ"
-
-#: ../ex_cmds.c:749
-#, c-format
-msgid "%<PRId64> lines moved"
-msgstr "ฯๅ๐ๅ์ๅ๙ๅํ๎ ๑๒๐๎๊: %<PRId64>"
-
-#: ../ex_cmds.c:1175
-#, c-format
-msgid "%<PRId64> lines filtered"
-msgstr "ฯ๐๎๏๓๙ๅํ๎ ๗ๅ๐ๅ็ ๔่๋๒๐ ๑๒๐๎๊: %<PRId64>"
-
-#: ../ex_cmds.c:1194
-msgid "E135: *Filter* Autocommands must not change current buffer"
-msgstr "E135: ภโ๒๎๊๎์เํไ๛ *Filter* ํๅ ไ๎๋ๆํ๛ ่็์ๅํ๒ เ๊๒่โํ๛้ แ๓๔ๅ๐"
-
-#: ../ex_cmds.c:1244
-msgid "[No write since last change]\n"
-msgstr "[ศ็์ๅํๅํ่ ํๅ ๑๎๕๐เํๅํ๛]\n"
-
-#: ../ex_cmds.c:1424
-#, c-format
-msgid "%sviminfo: %s in line: "
-msgstr "%sviminfo: %s โ ๑๒๐๎๊ๅ: "
-
-#: ../ex_cmds.c:1431
-msgid "E136: viminfo: Too many errors, skipping rest of file"
-msgstr ""
-"E136: viminfo: ั๋่๘๊๎์ ์ํ๎ใ๎ ๎๘่แ๎๊, ๎๑๒เ๋ํเ ๗เ๑๒ ๔เ้๋เ แ๓ไๅ๒ ๏๐๎๏๓๙ๅํเ"
-
-#: ../ex_cmds.c:1458
-#, c-format
-msgid "Reading viminfo file \"%s\"%s%s%s"
-msgstr "ื๒ๅํ่ๅ ๔เ้๋เ viminfo \"%s\"%s%s%s"
-
-#: ../ex_cmds.c:1460
-msgid " info"
-msgstr " ่ํ๔๎"
-
-#: ../ex_cmds.c:1461
-msgid " marks"
-msgstr " ๎๒์ๅ๒๎๊"
-
-#: ../ex_cmds.c:1462
-msgid " oldfiles"
-msgstr " ๑๒เ๐๛๕ ๔เ้๋๎โ"
-
-#: ../ex_cmds.c:1463
-msgid " FAILED"
-msgstr " อลำฤภือฮ"
-
-#. avoid a wait_return for this message, it's annoying
-#: ../ex_cmds.c:1541
-#, c-format
-msgid "E137: Viminfo file is not writable: %s"
-msgstr "E137: ฯ๐เโเ ํเ ็เ๏่๑ ๔เ้๋เ viminfo ๎๒๑๓๒๑๒โ๓๒: %s"
-
-#: ../ex_cmds.c:1626
-#, c-format
-msgid "E138: Can't write viminfo file %s!"
-msgstr "E138: อๅโ๎็์๎ๆํ๎ ็เ๏่๑เ๒ ๔เ้๋ viminfo %s!"
-
-#: ../ex_cmds.c:1635
-#, c-format
-msgid "Writing viminfo file \"%s\""
-msgstr "วเ๏่๑ ๔เ้๋เ viminfo \"%s\""
-
-#, c-format
-msgid "E886: Can't rename viminfo file to %s!"
-msgstr "E886: อๅโ๎็์๎ๆํ๎ ๏ๅ๐ๅ่์ๅํ๎โเ๒ ๔เ้๋ viminfo โ %s!"
-
-#. Write the info:
-#: ../ex_cmds.c:1720
-#, c-format
-msgid "# This viminfo file was generated by Vim %s.\n"
-msgstr "# ๒๎๒ ๔เ้๋ viminfo เโ๒๎์เ๒่๗ๅ๑๊่ ๑๎็ไเํ Vim %s.\n"
-
-#: ../ex_cmds.c:1722
-msgid ""
-"# You may edit it if you're careful!\n"
-"\n"
-msgstr ""
-"# ลใ๎ ์๎ๆํ๎ (๎๑๒๎๐๎ๆํ๎!) ๐ๅไเ๊๒่๐๎โเ๒.\n"
-"\n"
-
-#: ../ex_cmds.c:1723
-msgid "# Value of 'encoding' when this file was written\n"
-msgstr "# วํเ๗ๅํ่ๅ ๎๏๖่่ 'encoding' โ ์๎์ๅํ๒ ็เ๏่๑่ ๔เ้๋เ\n"
-
-#: ../ex_cmds.c:1800
-msgid "Illegal starting char"
-msgstr "อๅไ๎๏๓๑๒่์๛้ ํเ๗เ๋ํ๛้ ๑่์โ๎๋"
-
-#: ../ex_cmds.c:2162
-msgid "Write partial file?"
-msgstr "วเ๏่๑เ๒ ๔เ้๋ ๗เ๑๒่๗ํ๎?"
-
-#: ../ex_cmds.c:2166
-msgid "E140: Use ! to write partial buffer"
-msgstr "E140: ฤ๋ ็เ๏่๑่ ๗เ๑๒่ แ๓๔ๅ๐เ ่๑๏๎๋็๓้๒ๅ !"
-
-#: ../ex_cmds.c:2281
-#, c-format
-msgid "Overwrite existing file \"%s\"?"
-msgstr "ฯๅ๐ๅ็เ๏่๑เ๒ ๑๓๙ๅ๑๒โ๓๙่้ ๔เ้๋ \"%s\"?"
-
-#: ../ex_cmds.c:2317
-#, c-format
-msgid "Swap file \"%s\" exists, overwrite anyway?"
-msgstr "ัโ๎๏-๔เ้๋ \"%s\" ๑๓๙ๅ๑๒โ๓ๅ๒, ๏ๅ๐ๅ็เ๏่๑เ๒?"
-
-#: ../ex_cmds.c:2326
-#, c-format
-msgid "E768: Swap file exists: %s (:silent! overrides)"
-msgstr "E768: ัโ๎๏-๔เ้๋ ๑๓๙ๅ๑๒โ๓ๅ๒: %s (:silent! ๗๒๎แ๛ ๎แ๎้๒่ ๏๐๎โๅ๐๊๓)"
-
-#: ../ex_cmds.c:2381
-#, c-format
-msgid "E141: No file name for buffer %<PRId64>"
-msgstr "E141: ม๓๔ๅ๐ %<PRId64> ํๅ ๑โ็เํ ๑ ่์ๅํๅ์ ๔เ้๋เ"
-
-#: ../ex_cmds.c:2412
-msgid "E142: File not written: Writing is disabled by 'write' option"
-msgstr "E142: ิเ้๋ ํๅ ๑๎๕๐เํธํ: ็เ๏่๑ ๎๒๊๋๗ๅํเ ๎๏๖่ๅ้ 'write'"
-
-#: ../ex_cmds.c:2434
-#, c-format
-msgid ""
-"'readonly' option is set for \"%s\".\n"
-"Do you wish to write anyway?"
-msgstr ""
-"ฤ๋ \"%s\" โ๊๋๗ๅํเ ๎๏๖่ 'readonly'.\n"
-"วเ๏่๑เ๒?"
-
-#: ../ex_cmds.c:2439
-#, c-format
-msgid ""
-"File permissions of \"%s\" are read-only.\n"
-"It may still be possible to write it.\n"
-"Do you wish to try?"
-msgstr ""
-"ิเ้๋ \"%s\" ่์ๅๅ๒ ๐ๅๆ่์ ไ๎๑๒๓๏เ ๒๎๋๊๎ ไ๋ ๗๒ๅํ่.\n"
-"อ๎, โ๎็์๎ๆํ๎, ๔เ้๋ ๓ไเ๑๒๑ ็เ๏่๑เ๒.\n"
-"ี๎๒่๒ๅ ๏๎๏๐๎แ๎โเ๒?"
-
-#: ../ex_cmds.c:2451
-#, c-format
-msgid "E505: \"%s\" is read-only (add ! to override)"
-msgstr ""
-"E505: \"%s\" ๎๒๊๐๛๒ ๒๎๋๊๎ ไ๋ ๗๒ๅํ่ (ไ๎แเโ๒ๅ !, ๗๒๎แ๛ ๎แ๎้๒่ ๏๐๎โๅ๐๊๓)"
-
-#: ../ex_cmds.c:3120
-#, c-format
-msgid "E143: Autocommands unexpectedly deleted new buffer %s"
-msgstr "E143: ภโ๒๎๊๎์เํไ๛ ํๅ๎ๆ่ไเํํ๎ ๓แ่๋่ ํ๎โ๛้ แ๓๔ๅ๐ %s"
-
-#: ../ex_cmds.c:3313
-msgid "E144: non-numeric argument to :z"
-msgstr "E144: ฯเ๐เ์ๅ๒๐ ๊๎์เํไ๛ :z ไ๎๋ๆๅํ แ๛๒ ๗่๑๋๎์"
-
-#: ../ex_cmds.c:3404
-msgid "E145: Shell commands not allowed in rvim"
-msgstr "E145: ศ๑๏๎๋็๎โเํ่ๅ ๊๎์เํไ ๎แ๎๋๎๗๊่ ํๅ ไ๎๏๓๑๊เๅ๒๑ โ rvim."
-
-#: ../ex_cmds.c:3498
-msgid "E146: Regular expressions can't be delimited by letters"
-msgstr "E146: ะๅใ๓๋๐ํ๛ๅ โ๛๐เๆๅํ่ ํๅ ์๎ใ๓๒ ๐เ็ไๅ๋๒๑ แ๓๊โเ์่"
-
-#: ../ex_cmds.c:3964
-#, c-format
-msgid "replace with %s (y/n/a/q/l/^E/^Y)?"
-msgstr "็เ์ๅํ่๒ ํเ %s? (y/n/a/q/l/^E/^Y)"
-
-#: ../ex_cmds.c:4379
-msgid "(Interrupted) "
-msgstr "(ฯ๐ๅ๐โเํ๎)"
-
-#: ../ex_cmds.c:4384
-msgid "1 match"
-msgstr "ฮไํ๎ ๑๎๎๒โๅ๒๑๒โ่ๅ"
-
-#: ../ex_cmds.c:4384
-msgid "1 substitution"
-msgstr "ฮไํเ ็เ์ๅํเ"
-
-#: ../ex_cmds.c:4387
-#, c-format
-msgid "%<PRId64> matches"
-msgstr "%<PRId64> ๑๎๎๒โๅ๒๑๒โ่้"
-
-#: ../ex_cmds.c:4388
-#, c-format
-msgid "%<PRId64> substitutions"
-msgstr "%<PRId64> ็เ์ๅํ"
-
-#: ../ex_cmds.c:4392
-msgid " on 1 line"
-msgstr " โ ๎ไํ๎้ ๑๒๐๎๊ๅ"
-
-#: ../ex_cmds.c:4395
-#, c-format
-msgid " on %<PRId64> lines"
-msgstr " โ %<PRId64> ๑๒๐."
-
-#: ../ex_cmds.c:4438
-msgid "E147: Cannot do :global recursive"
-msgstr "E147: ส๎์เํไเ :global ํๅ ์๎ๆๅ๒ แ๛๒ ๐ๅ๊๓๐๑่โํ๎้"
-
-#: ../ex_cmds.c:4467
-msgid "E148: Regular expression missing from global"
-msgstr "E148: ย ๊๎์เํไๅ :global ๏๐๎๏๓๙ๅํ๎ ๐ๅใ๓๋๐ํ๎ๅ โ๛๐เๆๅํ่ๅ"
-
-#: ../ex_cmds.c:4508
-#, c-format
-msgid "Pattern found in every line: %s"
-msgstr "ั๎๎๒โๅ๒๑๒โ่ๅ ๘เแ๋๎ํ๓ ํเ้ไๅํ๎ ํเ ๊เๆไ๎้ ๑๒๐๎๊ๅ: %s"
-
-#: ../ex_cmds.c:4510
-#, c-format
-msgid "Pattern not found: %s"
-msgstr "ุเแ๋๎ํ ํๅ ํเ้ไๅํ: %s"
-
-#: ../ex_cmds.c:4587
-msgid ""
-"\n"
-"# Last Substitute String:\n"
-"$"
-msgstr ""
-"\n"
-"# ฯ๎๑๋ๅไํ ๑๒๐๎๊เ ไ๋ ็เ์ๅํ๛:\n"
-"$"
-
-#: ../ex_cmds.c:4679
-msgid "E478: Don't panic!"
-msgstr "E478: ั๏๎๊๎้๑๒โ่ๅ, ๒๎๋๊๎ ๑๏๎๊๎้๑๒โ่ๅ!"
-
-#: ../ex_cmds.c:4717
-#, c-format
-msgid "E661: Sorry, no '%s' help for %s"
-msgstr "E661: ส ๑๎ๆเ๋ๅํ่, ๑๏๐เโ๊เ '%s' ไ๋ %s ๎๒๑๓๒๑๒โ๓ๅ๒"
-
-#: ../ex_cmds.c:4719
-#, c-format
-msgid "E149: Sorry, no help for %s"
-msgstr "E149: ส ๑๎ๆเ๋ๅํ่ ๑๏๐เโ๊เ ไ๋ %s ๎๒๑๓๒๑๒โ๓ๅ๒"
-
-#: ../ex_cmds.c:4751
-#, c-format
-msgid "Sorry, help file \"%s\" not found"
-msgstr "ศ็โ่ํ่๒ๅ, ๔เ้๋ ๑๏๐เโ๊่ \"%s\" ํๅ ํเ้ไๅํ"
-
-#: ../ex_cmds.c:5323
-#, c-format
-msgid "E150: Not a directory: %s"
-msgstr "E150: %s ํๅ โ๋ๅ๒๑ ๊เ๒เ๋๎ใ๎์"
-
-#: ../ex_cmds.c:5446
-#, c-format
-msgid "E152: Cannot open %s for writing"
-msgstr "E152: อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ %s ไ๋ ็เ๏่๑่"
-
-#: ../ex_cmds.c:5471
-#, c-format
-msgid "E153: Unable to open %s for reading"
-msgstr "E153: อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ %s ไ๋ ๗๒ๅํ่"
-
-#: ../ex_cmds.c:5500
-#, c-format
-msgid "E670: Mix of help file encodings within a language: %s"
-msgstr "E670: ิเ้๋๛ ๑๏๐เโ๊่ ่๑๏๎๋็๓๒ ๐เ็ํ๛ๅ ๊๎ไ่๐๎โ๊่ ไ๋ ๎ไํ๎ใ๎ ็๛๊เ: %s"
-
-#: ../ex_cmds.c:5565
-#, c-format
-msgid "E154: Duplicate tag \"%s\" in file %s/%s"
-msgstr "E154: ฯ๎โ๒๎๐๙เ๑ ์ๅ๒๊เ \"%s\" โ ๔เ้๋ๅ %s/%s"
-
-#: ../ex_cmds.c:5687
-#, c-format
-msgid "E160: Unknown sign command: %s"
-msgstr "E160: อๅ่็โๅ๑๒ํเ ๊๎์เํไเ ็ํเ๗๊เ %s"
-
-#: ../ex_cmds.c:5704
-msgid "E156: Missing sign name"
-msgstr "E156: ฯ๐๎๏๓๙ๅํ๎ ่์ ็ํเ๗๊เ"
-
-#: ../ex_cmds.c:5746
-msgid "E612: Too many signs defined"
-msgstr "E612: ฮ๏๐ๅไๅ๋ๅํ๎ ๑๋่๘๊๎์ ์ํ๎ใ๎ ็ํเ๗๊๎โ"
-
-#: ../ex_cmds.c:5813
-#, c-format
-msgid "E239: Invalid sign text: %s"
-msgstr "E239: อๅ๏๐เโ่๋ํ๛้ ๒ๅ๊๑๒ ็ํเ๗๊เ: %s"
-
-#: ../ex_cmds.c:5844 ../ex_cmds.c:6035
-#, c-format
-msgid "E155: Unknown sign: %s"
-msgstr "E155: อๅ่็โๅ๑๒ํ๛้ ็ํเ๗๎๊: %s"
-
-#: ../ex_cmds.c:5877
-msgid "E159: Missing sign number"
-msgstr "E159: ฯ๐๎๏๓๙ๅํ ํ๎์ๅ๐ ็ํเ๗๊เ"
-
-#: ../ex_cmds.c:5971
-#, c-format
-msgid "E158: Invalid buffer name: %s"
-msgstr "E158: อๅ๏๐เโ่๋ํ๎ๅ ่์ แ๓๔ๅ๐เ: %s"
-
-#: ../ex_cmds.c:6008
-#, c-format
-msgid "E157: Invalid sign ID: %<PRId64>"
-msgstr "E157: อๅ๏๐เโ่๋ํ๛้ ID ็ํเ๗๊เ: %<PRId64>"
-
-#, c-format
-msgid "E885: Not possible to change sign %s"
-msgstr "E885: อๅโ๎็์๎ๆํ๎ ่็์ๅํ่๒ ็ํเ๗๎๊ %s"
-
-#: ../ex_cmds.c:6066
-msgid " (not supported)"
-msgstr " (ํๅ ๏๎ไไๅ๐ๆ่โเๅ๒๑)"
-
-#: ../ex_cmds.c:6169
-msgid "[Deleted]"
-msgstr "[ำไเ๋ๅํ๎]"
-
-#: ../ex_cmds2.c:139
-msgid "Entering Debug mode. Type \"cont\" to continue."
-msgstr "ย๊๋๗ธํ ๐ๅๆ่์ ๎๒๋เไ๊่. ฤ๋ ๏๐๎ไ๎๋ๆๅํ่ ํเแๅ๐่๒ๅ \"cont\""
-
-#: ../ex_cmds2.c:143 ../ex_docmd.c:759
-#, c-format
-msgid "line %<PRId64>: %s"
-msgstr "๑๒๐๎๊เ %<PRId64>: %s"
-
-#: ../ex_cmds2.c:145
-#, c-format
-msgid "cmd: %s"
-msgstr "๊๎์เํไเ: %s"
-
-#: ../ex_cmds2.c:322
-#, c-format
-msgid "Breakpoint in \"%s%s\" line %<PRId64>"
-msgstr "า๎๗๊เ ๎๑๒เํ๎โ๊่ โ \"%s%s\" ๑๒๐. %<PRId64>"
-
-#: ../ex_cmds2.c:581
-#, c-format
-msgid "E161: Breakpoint not found: %s"
-msgstr "E161: า๎๗๊เ ๎๑๒เํ๎โ๊่ ํๅ ํเ้ไๅํเ: %s"
-
-#: ../ex_cmds2.c:611
-msgid "No breakpoints defined"
-msgstr "า๎๗๊่ ๎๑๒เํ๎โ๊่ ํๅ ๎๏๐ๅไๅ๋ๅํ๛"
-
-#: ../ex_cmds2.c:617
-#, c-format
-msgid "%3d %s %s line %<PRId64>"
-msgstr "%3d %s %s ๑๒๐. %<PRId64>"
-
-#: ../ex_cmds2.c:942
-msgid "E750: First use \":profile start {fname}\""
-msgstr "E750: ฯๅ๐โ๎ๅ ่๑๏๎๋็๎โเํ่ๅ \":profile start {่์-๔เ้๋เ}\""
-
-#: ../ex_cmds2.c:1269
-#, c-format
-msgid "Save changes to \"%s\"?"
-msgstr "ั๎๕๐เํ่๒ ่็์ๅํๅํ่ โ \"%s\"?"
-
-#: ../ex_cmds2.c:1271 ../ex_docmd.c:8851
-msgid "Untitled"
-msgstr "มๅ็ ่์ๅํ่"
-
-#: ../ex_cmds2.c:1421
-#, c-format
-msgid "E162: No write since last change for buffer \"%s\""
-msgstr "E162: อๅ๑๎๕๐เํธํํ๛ๅ ่็์ๅํๅํ่ โ แ๓๔ๅ๐ๅ \"%s\""
-
-#: ../ex_cmds2.c:1480
-msgid "Warning: Entered other buffer unexpectedly (check autocommands)"
-msgstr ""
-"ฯ๐ๅไ๓๏๐ๅๆไๅํ่ๅ: อๅ๎ๆ่ไเํํ๛้ ๏ๅ๐ๅ๕๎ไ โ ไ๐๓ใ๎้ แ๓๔ๅ๐ (๏๐๎โๅ๐๒ๅ เโ๒๎๊๎์เํไ๛)"
-
-#: ../ex_cmds2.c:1826
-msgid "E163: There is only one file to edit"
-msgstr "E163: ฤ๋ ๐ๅไเ๊๒่๐๎โเํ่ ไ๎๑๒๓๏ๅํ ๒๎๋๊๎ ๎ไ่ํ ๔เ้๋"
-
-#: ../ex_cmds2.c:1828
-msgid "E164: Cannot go before first file"
-msgstr "E164: ๒๎ ๏ๅ๐โ๛้ ๔เ้๋"
-
-#: ../ex_cmds2.c:1830
-msgid "E165: Cannot go beyond last file"
-msgstr "E165: ๒๎ ๏๎๑๋ๅไํ่้ ๔เ้๋"
-
-#: ../ex_cmds2.c:2175
-#, c-format
-msgid "E666: compiler not supported: %s"
-msgstr "E666: ส๎์๏่๋๒๎๐ ํๅ ๏๎ไไๅ๐ๆ่โเๅ๒๑: %s"
-
-#: ../ex_cmds2.c:2257
-#, c-format
-msgid "Searching for \"%s\" in \"%s\""
-msgstr "ฯ๎่๑๊ \"%s\" โ \"%s\""
-
-#: ../ex_cmds2.c:2284
-#, c-format
-msgid "Searching for \"%s\""
-msgstr "ฯ๎่๑๊ \"%s\""
-
-#: ../ex_cmds2.c:2307
-#, c-format
-msgid "not found in 'runtimepath': \"%s\""
-msgstr "ํๅ ํเ้ไๅํ๎ โ 'runtimepath': \"%s\""
-
-#: ../ex_cmds2.c:2472
-#, c-format
-msgid "Cannot source a directory: \"%s\""
-msgstr "อๅ๋็ ๑๗่๒เ๒ ๊เ๒เ๋๎ใ: \"%s\""
-
-#: ../ex_cmds2.c:2518
-#, c-format
-msgid "could not source \"%s\""
-msgstr "ํๅโ๎็์๎ๆํ๎ ๑๗่๒เ๒ \"%s\""
-
-#: ../ex_cmds2.c:2520
-#, c-format
-msgid "line %<PRId64>: could not source \"%s\""
-msgstr "๑๒๐๎๊เ %<PRId64>: ํๅโ๎็์๎ๆํ๎ ๑๗่๒เ๒ \"%s\""
-
-#: ../ex_cmds2.c:2535
-#, c-format
-msgid "sourcing \"%s\""
-msgstr "๑๗่๒๛โเํ่ๅ ๑๖ๅํเ๐่ \"%s\""
-
-#: ../ex_cmds2.c:2537
-#, c-format
-msgid "line %<PRId64>: sourcing \"%s\""
-msgstr "๑๒๐๎๊เ %<PRId64>: ๑๗่๒๛โเํ่ๅ \"%s\""
-
-#: ../ex_cmds2.c:2693
-#, c-format
-msgid "finished sourcing %s"
-msgstr "๑๗่๒๛โเํ่ๅ ๑๖ๅํเ๐่ %s ็เโๅ๐๘ๅํ๎"
-
-#: ../ex_cmds2.c:2765
-msgid "modeline"
-msgstr "๐ๅๆ่์ํเ ๑๒๐๎๊เ"
-
-#: ../ex_cmds2.c:2767
-msgid "--cmd argument"
-msgstr "--cmd ๏เ๐เ์ๅ๒๐"
-
-#: ../ex_cmds2.c:2769
-msgid "-c argument"
-msgstr "-c ๏เ๐เ์ๅ๒๐"
-
-#: ../ex_cmds2.c:2771
-msgid "environment variable"
-msgstr "๏ๅ๐ๅ์ๅํํเ ๎๊๐๓ๆๅํ่"
-
-#: ../ex_cmds2.c:2773
-msgid "error handler"
-msgstr "๎แ๐เแ๎๒๗่๊ ๎๘่แ๊่"
-
-#: ../ex_cmds2.c:3020
-msgid "W15: Warning: Wrong line separator, ^M may be missing"
-msgstr ""
-"W15: ฯ๐ๅไ๓๏๐ๅๆไๅํ่ๅ: ํๅ๏๐เโ่๋ํ๛้ ๐เ็ไๅ๋่๒ๅ๋ ๑๒๐๎๊่. ย๎็์๎ๆํ๎ ๏๐๎๏๓๙ๅํ๎ ^M"
-
-#: ../ex_cmds2.c:3139
-msgid "E167: :scriptencoding used outside of a sourced file"
-msgstr "E167: ส๎์เํไเ :scriptencoding ่๑๏๎๋็๓ๅ๒๑ โํๅ ๔เ้๋เ ๑๖ๅํเ๐่"
-
-#: ../ex_cmds2.c:3166
-msgid "E168: :finish used outside of a sourced file"
-msgstr "E168: ส๎์เํไเ :finish ่๑๏๎๋็๓ๅ๒๑ โํๅ ๔เ้๋เ ๑๖ๅํเ๐่"
-
-#: ../ex_cmds2.c:3389
-#, c-format
-msgid "Current %slanguage: \"%s\""
-msgstr "ภ๊๒่โํ๛้ %s็๛๊: \"%s\""
-
-#: ../ex_cmds2.c:3404
-#, c-format
-msgid "E197: Cannot set language to \"%s\""
-msgstr "E197: อๅโ๎็์๎ๆํ๎ ๑์ๅํ่๒ ็๛๊ ํเ \"%s\""
-
-#. don't redisplay the window
-#. don't wait for return
-#: ../ex_docmd.c:387
-msgid "Entering Ex mode. Type \"visual\" to go to Normal mode."
-msgstr "ฯๅ๐ๅ๕๎ไ โ ๐ๅๆ่์ Ex. ฤ๋ ๏ๅ๐ๅ๕๎ไเ โ ฮแ๛๗ํ๛้ ๐ๅๆ่์ ํเแๅ๐่๒ๅ \"visual\""
-
-#: ../ex_docmd.c:428
-msgid "E501: At end-of-file"
-msgstr "E501: ย ๊๎ํ๖ๅ ๔เ้๋เ"
-
-#: ../ex_docmd.c:513
-msgid "E169: Command too recursive"
-msgstr "E169: ั๋่๘๊๎์ ๐ๅ๊๓๐๑่โํเ ๊๎์เํไเ"
-
-#: ../ex_docmd.c:1006
-#, c-format
-msgid "E605: Exception not caught: %s"
-msgstr "E605: ศ๑๊๋๗่๒ๅ๋ํเ ๑่๒๓เ๖่ ํๅ ๎แ๐เแ๎๒เํเ: %s"
-
-#: ../ex_docmd.c:1085
-msgid "End of sourced file"
-msgstr "ส๎ํๅ๖ ๑๗่๒เํํ๎ใ๎ ๔เ้๋เ"
-
-#: ../ex_docmd.c:1086
-msgid "End of function"
-msgstr "ส๎ํๅ๖ ๔๓ํ๊๖่่"
-
-#: ../ex_docmd.c:1628
-msgid "E464: Ambiguous use of user-defined command"
-msgstr "E464: อๅ๎ไํ๎็ํเ๗ํ๎ๅ ่๑๏๎๋็๎โเํ่ๅ ๊๎์เํไ๛ ๏๎๋็๎โเ๒ๅ๋"
-
-#: ../ex_docmd.c:1638
-msgid "E492: Not an editor command"
-msgstr "E492: ๒๎ ํๅ ๊๎์เํไเ ๐ๅไเ๊๒๎๐เ"
-
-#: ../ex_docmd.c:1729
-msgid "E493: Backwards range given"
-msgstr "E493: วเไเํ ๎แ๐เ๒ํ๛้ ไ่เ๏เ็๎ํ"
-
-#: ../ex_docmd.c:1733
-msgid "Backwards range given, OK to swap"
-msgstr "วเไเํ ๎แ๐เ๒ํ๛้ ไ่เ๏เ็๎ํ, ์ๅํๅ์ ใ๐เํ่๖๛ ์ๅ๑๒เ์่"
-
-#. append
-#. typed wrong
-#: ../ex_docmd.c:1787
-msgid "E494: Use w or w>>"
-msgstr "E494: ศ๑๏๎๋็๓้๒ๅ w ่๋่ w>>"
-
-#: ../ex_docmd.c:3454
-msgid "E319: The command is not available in this version"
-msgstr "E319: ศ็โ่ํ่๒ๅ, ๒เ ๊๎์เํไเ ํๅไ๎๑๒๓๏ํเ โ ไเํํ๎้ โๅ๐๑่่"
-
-#: ../ex_docmd.c:3752
-msgid "E172: Only one file name allowed"
-msgstr "E172: ะเ็๐ๅ๘ๅํ๎ ่๑๏๎๋็๎โเ๒ ๒๎๋๊๎ ๎ไํ๎ ่์ ๔เ้๋เ"
-
-#: ../ex_docmd.c:4238
-msgid "1 more file to edit. Quit anyway?"
-msgstr "1 ๔เ้๋ ๎ๆ่ไเๅ๒ ๐ๅไเ๊๒่๐๎โเํ่. ย๛้๒่?"
-
-#: ../ex_docmd.c:4242
-#, c-format
-msgid "%d more files to edit. Quit anyway?"
-msgstr "ล๑๒ ํๅ๎๒๐ๅไเ๊๒่๐๎โเํํ๛ๅ ๔เ้๋๛ (%d). ย๛้๒่?"
-
-#: ../ex_docmd.c:4248
-msgid "E173: 1 more file to edit"
-msgstr "E173: 1 ๔เ้๋ ๎ๆ่ไเๅ๒ ๐ๅไเ๊๒่๐๎โเํ่."
-
-#: ../ex_docmd.c:4250
-#, c-format
-msgid "E173: %<PRId64> more files to edit"
-msgstr "E173: ล๑๒ ํๅ๎๒๐ๅไเ๊๒่๐๎โเํํ๛ๅ ๔เ้๋๛ (%<PRId64>)."
-
-#: ../ex_docmd.c:4320
-msgid "E174: Command already exists: add ! to replace it"
-msgstr "E174: ส๎์เํไเ ๓ๆๅ ๑๓๙ๅ๑๒โ๓ๅ๒. ฤ๎แเโ๒ๅ ! ไ๋ ็เ์ๅํ๛."
-
-#: ../ex_docmd.c:4432
-msgid ""
-"\n"
-" Name Args Range Complete Definition"
-msgstr ""
-"\n"
-" ศ์ ฯเ๐เ์. ฤ่เ๏. ฤ๎๏๎๋ํ. ฮ๏๐ๅไๅ๋ๅํ่ๅ"
-
-#: ../ex_docmd.c:4516
-msgid "No user-defined commands found"
-msgstr "ส๎์เํไ๛, ๎๏๐ๅไๅ๋ธํํ๛ๅ ๏๎๋็๎โเ๒ๅ๋ๅ์, ํๅ ๎แํเ๐๓ๆๅํ๛."
-
-#: ../ex_docmd.c:4538
-msgid "E175: No attribute specified"
-msgstr "E175: ฯเ๐เ์ๅ๒๐ ํๅ ็เไเํ"
-
-#: ../ex_docmd.c:4583
-msgid "E176: Invalid number of arguments"
-msgstr "E176: อๅ๏๐เโ่๋ํ๎ๅ ๊๎๋่๗ๅ๑๒โ๎ ๏เ๐เ์ๅ๒๐๎โ"
-
-#: ../ex_docmd.c:4594
-msgid "E177: Count cannot be specified twice"
-msgstr "E177: ื่๑๋๎-๏๐่๑๒เโ๊๓ ํๅ๋็ ๓๊เ็๛โเ๒ ไโเๆไ๛"
-
-#: ../ex_docmd.c:4603
-msgid "E178: Invalid default value for count"
-msgstr "E178: อๅ๏๐เโ่๋ํ๎ๅ ็ํเ๗ๅํ่ๅ ๗่๑๋เ-๏๐่๑๒เโ๊่ ๏๎ ๓์๎๋๗เํ่"
-
-#: ../ex_docmd.c:4625
-msgid "E179: argument required for -complete"
-msgstr "E179: ฤ๋ -complete ๒๐ๅแ๓ๅ๒๑ ๓๊เ็เ๒ ๏เ๐เ์ๅ๒๐"
-
-#: ../ex_docmd.c:4635
-#, c-format
-msgid "E181: Invalid attribute: %s"
-msgstr "E181: อๅ๏๐เโ่๋ํ๛้ เ๒๐่แ๓๒: %s"
-
-#: ../ex_docmd.c:4678
-msgid "E182: Invalid command name"
-msgstr "E182: อๅ๏๐เโ่๋ํ๎ๅ ่์ ๊๎์เํไ๛"
-
-#: ../ex_docmd.c:4691
-msgid "E183: User defined commands must start with an uppercase letter"
-msgstr "E183: ส๎์เํไเ ๏๎๋็๎โเ๒ๅ๋ ไ๎๋ๆํเ ํเ๗่ํเ๒๑ ๑ ็เใ๋เโํ๎้ แ๓๊โ๛"
-
-#: ../ex_docmd.c:4696
-msgid "E841: Reserved name, cannot be used for user defined command"
-msgstr ""
-"E841: วเ๐ๅ็ๅ๐โ่๐๎โเํํ๎ๅ ่์ ํๅ ์๎ๆๅ๒ ่๑๏๎๋็๎โเ๒๑ ไ๋ ๊๎์เํไ ๏๎๋็๎โเ๒ๅ๋"
-
-#: ../ex_docmd.c:4751
-#, c-format
-msgid "E184: No such user-defined command: %s"
-msgstr "E184: อๅ๒ ๒เ๊๎้ ๊๎์เํไ๛ ๏๎๋็๎โเ๒ๅ๋: %s"
-
-#: ../ex_docmd.c:5219
-#, c-format
-msgid "E180: Invalid complete value: %s"
-msgstr "E180: อๅ๏๐เโ่๋ํ๎ๅ ็ํเ๗ๅํ่ๅ ไ๎๏๎๋ํๅํ่: %s"
-
-#: ../ex_docmd.c:5225
-msgid "E468: Completion argument only allowed for custom completion"
-msgstr ""
-"E468: ฯเ๐เ์ๅ๒๐ เโ๒๎ไ๎๏๎๋ํๅํ่ ์๎ๆํ๎ ่๑๏๎๋็๎โเ๒ ๒๎๋๊๎ ๑ ๎๑๎แ๛์ ไ๎๏๎๋ํๅํ่ๅ์"
-
-#: ../ex_docmd.c:5231
-msgid "E467: Custom completion requires a function argument"
-msgstr "E467: ฮ๑๎แ๎ๅ ไ๎๏๎๋ํๅํ่ๅ ๒๐ๅแ๓ๅ๒ ๓๊เ็เํ่ ๏เ๐เ์ๅ๒๐เ ๔๓ํ๊๖่่"
-
-#: ../ex_docmd.c:5257
-#, c-format
-msgid "E185: Cannot find color scheme '%s'"
-msgstr "E185: อๅโ๎็์๎ๆํ๎ ํเ้๒่ ๖โๅ๒๎โ๓ ๑๕ๅ์๓ '%s'"
-
-#: ../ex_docmd.c:5263
-msgid "Greetings, Vim user!"
-msgstr "ฯ๐่โๅ๒๑๒โ๓ๅ์ โเ๑, ๏๎๋็๎โเ๒ๅ๋ Vim!"
-
-#: ../ex_docmd.c:5431
-msgid "E784: Cannot close last tab page"
-msgstr "E784: อๅ๋็ ็เ๊๐๛๒ ๏๎๑๋ๅไํ โ๊๋เไ๊๓"
-
-#: ../ex_docmd.c:5462
-msgid "Already only one tab page"
-msgstr "อเ ๊๐เํๅ โ๑ๅใ๎ ๎ไํเ โ๊๋เไ๊เ"
-
-#: ../ex_docmd.c:6004
-#, c-format
-msgid "Tab page %d"
-msgstr "ย๊๋เไ๊เ %d"
-
-#: ../ex_docmd.c:6295
-msgid "No swap file"
-msgstr "มๅ็ ๑โ๎๏-๔เ้๋เ"
-
-#: ../ex_docmd.c:6478
-msgid "E747: Cannot change directory, buffer is modified (add ! to override)"
-msgstr ""
-"E747: ั์ๅํเ ๊เ๒เ๋๎ใเ ํๅโ๎็์๎ๆํเ, แ๓๔ๅ๐ ่็์ๅํธํ (ไ๎แเโ๒ๅ !, ๗๒๎แ๛ ๎แ๎้๒่ "
-"๏๐๎โๅ๐๊๓)"
-
-#: ../ex_docmd.c:6485
-msgid "E186: No previous directory"
-msgstr "E186: อๅ๒ ๏๐ๅไ๛ไ๓๙ๅใ๎ ๊เ๒เ๋๎ใเ"
-
-#: ../ex_docmd.c:6530
-msgid "E187: Unknown"
-msgstr "E187: อๅ่็โๅ๑๒ํ๎"
-
-#: ../ex_docmd.c:6610
-msgid "E465: :winsize requires two number arguments"
-msgstr "E465: ส๎์เํไเ :winsize ๒๐ๅแ๓ๅ๒ ๓๊เ็เํ่ ไโ๓๕ ๗่๑๋๎โ๛๕ ๏เ๐เ์ๅ๒๐๎โ"
-
-#: ../ex_docmd.c:6655
-msgid "E188: Obtaining window position not implemented for this platform"
-msgstr "E188: ย ไเํํ๎้ ๑่๑๒ๅ์ๅ ๎๏๐ๅไๅ๋ๅํ่ๅ ๏๎๋๎ๆๅํ่ ๎๊ํเ ํๅ ๐เแ๎๒เๅ๒"
-
-#: ../ex_docmd.c:6662
-msgid "E466: :winpos requires two number arguments"
-msgstr "E466: ส๎์เํไเ :winpos ๒๐ๅแ๓ๅ๒ ๓๊เ็เํ่ ไโ๓๕ ๗่๑๋๎โ๛๕ ๏เ๐เ์ๅ๒๐๎โ"
-
-#: ../ex_docmd.c:7241
-#, c-format
-msgid "E739: Cannot create directory: %s"
-msgstr "E739: อๅโ๎็์๎ๆํ๎ ๑๎็ไเ๒ ๊เ๒เ๋๎ใ: %s"
-
-#: ../ex_docmd.c:7268
-#, c-format
-msgid "E189: \"%s\" exists (add ! to override)"
-msgstr "E189: \"%s\" ๑๓๙ๅ๑๒โ๓ๅ๒ (ไ๎แเโ๒ๅ !, ๗๒๎แ๛ ๎แ๎้๒่ ๏๐๎โๅ๐๊๓)"
-
-#: ../ex_docmd.c:7273
-#, c-format
-msgid "E190: Cannot open \"%s\" for writing"
-msgstr "E190: อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ ไ๋ ็เ๏่๑่ \"%s\""
-
-#. set mark
-#: ../ex_docmd.c:7294
-msgid "E191: Argument must be a letter or forward/backward quote"
-msgstr "E191: ฯเ๐เ์ๅ๒๐ ไ๎๋ๆๅํ แ๛๒ ๏๐์๎้/๎แ๐เ๒ํ๎้ ๊เโ๛๗๊๎้ ่๋่ แ๓๊โ๎้"
-
-#: ../ex_docmd.c:7333
-msgid "E192: Recursive use of :normal too deep"
-msgstr "E192: ั๋่๘๊๎์ ใ๋๓แ๎๊เ ๐ๅ๊๓๐๑่ ๏๐่ ่๑๏๎๋็๎โเํ่่ ๊๎์เํไ๛ :normal"
-
-#: ../ex_docmd.c:7807
-msgid "E194: No alternate file name to substitute for '#'"
-msgstr "E194: อๅ๒ ๑๎๑ๅไํๅใ๎ ่์ๅํ่ ๔เ้๋เ ไ๋ ็เ์ๅํ๛ '#'"
-
-#: ../ex_docmd.c:7841
-msgid "E495: no autocommand file name to substitute for \"<afile>\""
-msgstr "E495: อๅ๒ เโ๒๎๊๎์เํไํ๎ใ๎ ่์ๅํ่ ๔เ้๋เ ไ๋ ็เ์ๅํ๛ \"<afile>\""
-
-#: ../ex_docmd.c:7850
-msgid "E496: no autocommand buffer number to substitute for \"<abuf>\""
-msgstr "E496: อๅ๒ เโ๒๎๊๎์เํไํ๎ใ๎ ํ๎์ๅ๐เ แ๓๔ๅ๐เ ไ๋ ็เ์ๅํ๛ \"<abuf>\""
-
-#: ../ex_docmd.c:7861
-msgid "E497: no autocommand match name to substitute for \"<amatch>\""
-msgstr "E497: อๅ๒ เโ๒๎๊๎์เํไํ๎ใ๎ ่์ๅํ่ ๑๎๎๒โๅ๒๑๒โ่ ไ๋ ็เ์ๅํ๛ \"<amatch>\""
-
-#: ../ex_docmd.c:7870
-msgid "E498: no :source file name to substitute for \"<sfile>\""
-msgstr "E498: อๅ๒ ่์ๅํ่ ๔เ้๋เ :source ไ๋ ็เ์ๅํ๛ \"<sfile>\""
-
-#: ../ex_docmd.c:7876
-msgid "E842: no line number to use for \"<slnum>\""
-msgstr "E842: อๅ๒ ํ๎์ๅ๐เ ๑๒๐๎๊่ ไ๋ ่๑๏๎๋็๎โเํ่ \"<slnum>\""
-
-#: ../ex_docmd.c:7903
-#, fuzzy, c-format
-msgid "E499: Empty file name for '%' or '#', only works with \":p:h\""
-msgstr "E499: ฯ๓๑๒๎ๅ ่์ ๔เ้๋เ ไ๋ '%' ่๋่ '#', โ๎็์๎ๆํ๎ ๒๎๋๊๎ c \":p:h\""
-
-#: ../ex_docmd.c:7905
-msgid "E500: Evaluates to an empty string"
-msgstr "E500: ะๅ็๓๋๒เ๒๎์ โ๛๐เๆๅํ่ โ๋ๅ๒๑ ๏๓๑๒เ ๑๒๐๎๊เ"
-
-#: ../ex_docmd.c:8838
-msgid "E195: Cannot open viminfo file for reading"
-msgstr "E195: อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ ๔เ้๋ viminfo ไ๋ ๗๒ๅํ่"
-
-#: ../ex_eval.c:464
-msgid "E608: Cannot :throw exceptions with 'Vim' prefix"
-msgstr ""
-"E608: อๅโ๎็์๎ๆํ๎ โ๛๏๎๋ํ่๒ ๊๎์เํไ๓ :throw ไ๋ ่๑๊๋๗ๅํ่้ ๑ ๏๐่๑๒เโ๊๎้ 'Vim'"
-
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:496
-#, c-format
-msgid "Exception thrown: %s"
-msgstr "ศ๑๊๋๗่๒ๅ๋ํเ ๑่๒๓เ๖่: %s"
-
-#: ../ex_eval.c:545
-#, c-format
-msgid "Exception finished: %s"
-msgstr "วเโๅ๐๘ๅํเ ๎แ๐เแ๎๒๊เ ่๑๊๋๗่๒ๅ๋ํ๎้ ๑่๒๓เ๖่่: %s"
-
-#: ../ex_eval.c:546
-#, c-format
-msgid "Exception discarded: %s"
-msgstr "ศ๑๊๋๗่๒ๅ๋ํเ ๑่๒๓เ๖่ ๏๐๎่ใํ๎๐่๐๎โเํเ: %s"
-
-#: ../ex_eval.c:588 ../ex_eval.c:634
-#, c-format
-msgid "%s, line %<PRId64>"
-msgstr "%s, ๑๒๐๎๊เ %<PRId64>"
-
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:608
-#, c-format
-msgid "Exception caught: %s"
-msgstr "ฮแ๐เแ๎๒๊เ ่๑๊๋๗่๒ๅ๋ํ๎้ ๑่๒๓เ๖่่: %s"
-
-#: ../ex_eval.c:676
-#, c-format
-msgid "%s made pending"
-msgstr "%s โ๛๏๎๋ํๅ๒ ๎ๆ่ไเํ่ๅ"
-
-#: ../ex_eval.c:679
-#, c-format
-msgid "%s resumed"
-msgstr "%s โ๎็๎แํ๎โ๋ๅํ๎"
-
-#: ../ex_eval.c:683
-#, c-format
-msgid "%s discarded"
-msgstr "%s ๏๐๎๏๓๙ๅํ๎"
-
-#: ../ex_eval.c:708
-msgid "Exception"
-msgstr "ศ๑๊๋๗่๒ๅ๋ํเ ๑่๒๓เ๖่"
-
-#: ../ex_eval.c:713
-msgid "Error and interrupt"
-msgstr "ฮ๘่แ๊เ ่ ๏๐ๅ๐๛โเํ่ๅ"
-
-#: ../ex_eval.c:715
-msgid "Error"
-msgstr "ฮ๘่แ๊เ"
-
-#. if (pending & CSTP_INTERRUPT)
-#: ../ex_eval.c:717
-msgid "Interrupt"
-msgstr "ฯ๐ๅ๐๛โเํ่ๅ"
-
-#: ../ex_eval.c:795
-msgid "E579: :if nesting too deep"
-msgstr "E579: ั๋่๘๊๎์ ใ๋๓แ๎๊๎ โ๋๎ๆๅํํ๛้ :if"
-
-#: ../ex_eval.c:830
-msgid "E580: :endif without :if"
-msgstr "E580: :endif แๅ็ :if"
-
-#: ../ex_eval.c:873
-msgid "E581: :else without :if"
-msgstr "E581: :else แๅ็ :if"
-
-#: ../ex_eval.c:876
-msgid "E582: :elseif without :if"
-msgstr "E582: :elseif แๅ็ :if"
-
-#: ../ex_eval.c:880
-msgid "E583: multiple :else"
-msgstr "E583: ฮแํเ๐๓ๆๅํ๎ ํๅ๑๊๎๋๊๎ :else"
-
-#: ../ex_eval.c:883
-msgid "E584: :elseif after :else"
-msgstr "E584: :elseif ๏๎๑๋ๅ :else"
-
-#: ../ex_eval.c:941
-msgid "E585: :while/:for nesting too deep"
-msgstr "E585: ั๋่๘๊๎์ ใ๋๓แ๎๊๎ๅ โ๋๎ๆๅํ่ๅ :while ่๋่ :for"
-
-#: ../ex_eval.c:1028
-msgid "E586: :continue without :while or :for"
-msgstr "E586: :continue แๅ็ :while ่๋่ :for"
-
-#: ../ex_eval.c:1061
-msgid "E587: :break without :while or :for"
-msgstr "E587: :break แๅ็ :while ่๋่ :for"
-
-#: ../ex_eval.c:1102
-msgid "E732: Using :endfor with :while"
-msgstr "E732: ศ๑๏๎๋็๎โเํ่ๅ :endfor ๑ :while"
-
-#: ../ex_eval.c:1104
-msgid "E733: Using :endwhile with :for"
-msgstr "E733: ศ๑๏๎๋็๎โเํ่ๅ :endwhile ๑ :for"
-
-#: ../ex_eval.c:1247
-msgid "E601: :try nesting too deep"
-msgstr "E601: ั๋่๘๊๎์ ใ๋๓แ๎๊๎ โ๋๎ๆๅํํ๛้ :try"
-
-#: ../ex_eval.c:1317
-msgid "E603: :catch without :try"
-msgstr "E603: :catch แๅ็ :try"
-
-#. Give up for a ":catch" after ":finally" and ignore it.
-#. * Just parse.
-#: ../ex_eval.c:1332
-msgid "E604: :catch after :finally"
-msgstr "E604: :catch แๅ็ :finally"
-
-#: ../ex_eval.c:1451
-msgid "E606: :finally without :try"
-msgstr "E606: :finally แๅ็ :try"
-
-#. Give up for a multiple ":finally" and ignore it.
-#: ../ex_eval.c:1467
-msgid "E607: multiple :finally"
-msgstr "E607: ฮแํเ๐๓ๆๅํ๎ ํๅ๑๊๎๋๊๎ :finally"
-
-#: ../ex_eval.c:1571
-msgid "E602: :endtry without :try"
-msgstr "E602: :endtry แๅ็ :try"
-
-#: ../ex_eval.c:2026
-msgid "E193: :endfunction not inside a function"
-msgstr "E193: ส๎์เํไเ :endfunction ์๎ๆๅ๒ ่๑๏๎๋็๎โเ๒๑ ๒๎๋๊๎ โํ๓๒๐่ ๔๓ํ๊๖่่"
-
-#: ../ex_getln.c:1643
-msgid "E788: Not allowed to edit another buffer now"
-msgstr "E788: ัๅ้๗เ๑ ํๅ ไ๎๏๓๑๊เๅ๒๑ ๐ๅไเ๊๒่๐๎โเํ่ๅ ไ๐๓ใ๎ใ๎ แ๓๔ๅ๐เ"
-
-#: ../ex_getln.c:1656
-msgid "E811: Not allowed to change buffer information now"
-msgstr "E811: ัๅ้๗เ๑ ํๅ ไ๎๏๓๑๊เๅ๒๑ ่็์ๅํๅํ่ๅ ่ํ๔๎๐์เ๖่่ ๎ แ๓๔ๅ๐ๅ"
-
-#: ../ex_getln.c:3178
-msgid "tagname"
-msgstr "่์ ์ๅ๒๊่"
-
-#: ../ex_getln.c:3181
-msgid " kind file\n"
-msgstr " ๒่๏ ๔เ้๋เ\n"
-
-#: ../ex_getln.c:4799
-msgid "'history' option is zero"
-msgstr "็ํเ๗ๅํ่ๅ ๎๏๖่่ 'history' ๐เโํ๎ ํ๓๋"
-
-#: ../ex_getln.c:5046
-#, c-format
-msgid ""
-"\n"
-"# %s History (newest to oldest):\n"
-msgstr ""
-"\n"
-"# %s, ่๑๒๎๐่ (ํเ๗่ํเ ๎๒ ๑โๅๆๅใ๎ ๊ ๑๒เ๐๎์๓):\n"
-
-#: ../ex_getln.c:5047
-msgid "Command Line"
-msgstr "ส๎์เํไํเ ๑๒๐๎๊เ"
-
-#: ../ex_getln.c:5048
-msgid "Search String"
-msgstr "ั๒๐๎๊เ ๏๎่๑๊เ"
-
-#: ../ex_getln.c:5049
-msgid "Expression"
-msgstr "ย๛๐เๆๅํ่ๅ"
-
-#: ../ex_getln.c:5050
-msgid "Input Line"
-msgstr "ั๒๐๎๊เ โโ๎ไเ"
-
-#: ../ex_getln.c:5117
-msgid "E198: cmd_pchar beyond the command length"
-msgstr "E198: cmd_pchar แ๎๋๘ๅ ไ๋่ํ๛ ๊๎์เํไ๛"
-
-#: ../ex_getln.c:5279
-msgid "E199: Active window or buffer deleted"
-msgstr "E199: ำไเ๋ๅํ๎ เ๊๒่โํ๎ๅ ๎๊ํ๎ ่๋่ แ๓๔ๅ๐"
-
-#: ../file_search.c:203
-msgid "E854: path too long for completion"
-msgstr "E854: ๑๋่๘๊๎์ แ๎๋๘๎้ ๏๓๒ ไ๋ เโ๒๎ไ๎๏๎๋ํๅํ่"
-
-#: ../file_search.c:446
-#, c-format
-msgid ""
-"E343: Invalid path: '**[number]' must be at the end of the path or be "
-"followed by '%s'."
-msgstr ""
-"E343: อๅ๏๐เโ่๋ํ๎ ็เไเํ ๏๓๒: '**[๗่๑๋๎]' ไ๎๋ๆํ๎ แ๛๒ ๋่แ๎ โ ๊๎ํ๖ๅ ๏๓๒่, "
-"๋่แ๎ ็เ ํ่์ ไ๎๋ๆํ๎ ๑๋ๅไ๎โเ๒ '%s'"
-
-#: ../file_search.c:1505
-#, c-format
-msgid "E344: Can't find directory \"%s\" in cdpath"
-msgstr "E344: สเ๒เ๋๎ใ \"%s\" ํๅ ํเ้ไๅํ โ ๏๓๒่ ไ๋ ๑์ๅํ๛ ๊เ๒เ๋๎ใเ"
-
-#: ../file_search.c:1508
-#, c-format
-msgid "E345: Can't find file \"%s\" in path"
-msgstr "E345: ิเ้๋ \"%s\" โ ่็โๅ๑๒ํ๛๕ ๊เ๒เ๋๎ใเ๕ ํๅ ํเ้ไๅํ"
-
-msgid "List or number required"
-msgstr "า๐ๅแ๓ๅ๒๑ ๑๏่๑๎๊ ่๋่ ๗่๑๋๎"
-
-#: ../file_search.c:1512
-#, c-format
-msgid "E346: No more directory \"%s\" found in cdpath"
-msgstr "E346: ย ๏๓๒่ ๑์ๅํ๛ ๊เ๒เ๋๎ใเ แ๎๋๘ๅ ํๅ๒ ๊เ๒เ๋๎ใ๎โ \"%s\""
-
-#: ../file_search.c:1515
-#, c-format
-msgid "E347: No more file \"%s\" found in path"
-msgstr "E347: ย ่็โๅ๑๒ํ๛๕ ๊เ๒เ๋๎ใเ๕ แ๎๋๘ๅ ํๅ๒ ๔เ้๋๎โ \"%s\""
-
-#: ../fileio.c:137
-msgid "E812: Autocommands changed buffer or buffer name"
-msgstr "E812: ภโ๒๎๊๎์เํไ๛ ่็์ๅํ่๋่ แ๓๔ๅ๐ ่๋่ ่์ แ๓๔ๅ๐เ"
-
-#: ../fileio.c:368
-msgid "Illegal file name"
-msgstr "อๅไ๎๏๓๑๒่์๎ๅ ่์ ๔เ้๋เ"
-
-#: ../fileio.c:395 ../fileio.c:476 ../fileio.c:2543 ../fileio.c:2578
-msgid "is a directory"
-msgstr "โ๋ๅ๒๑ ๊เ๒เ๋๎ใ๎์"
-
-#: ../fileio.c:397
-msgid "is not a file"
-msgstr "ํๅ โ๋ๅ๒๑ ๔เ้๋๎์"
-
-#: ../fileio.c:508 ../fileio.c:3522
-msgid "[New File]"
-msgstr "[อ๎โ๛้ ๔เ้๋]"
-
-#: ../fileio.c:511
-msgid "[New DIRECTORY]"
-msgstr "[อ๎โ๛้ สภาภหฮร]"
-
-#: ../fileio.c:529 ../fileio.c:532
-msgid "[File too big]"
-msgstr "[ิเ้๋ ๑๋่๘๊๎์ แ๎๋๘๎้]"
-
-#: ../fileio.c:534
-msgid "[Permission Denied]"
-msgstr "[ฤ๎๑๒๓๏ ็เ๏๐ๅ๙ธํ]"
-
-#: ../fileio.c:653
-msgid "E200: *ReadPre autocommands made the file unreadable"
-msgstr "E200: ย ๐ๅ็๓๋๒เ๒ๅ โ๛๏๎๋ํๅํ่ เโ๒๎๊๎์เํไ *ReadPre ๔เ้๋ ๑๒เ๋ ํๅ๗่๒เๅ์๛์"
-
-#: ../fileio.c:655
-msgid "E201: *ReadPre autocommands must not change current buffer"
-msgstr "E201: ภโ๒๎๊๎์เํไ๛ *ReadPre ํๅ ไ๎๋ๆํ๛ ่็์ๅํ๒ เ๊๒่โํ๛้ แ๓๔ๅ๐"
-
-#: ../fileio.c:672
-msgid "Nvim: Reading from stdin...\n"
-msgstr "Vim: ื๒ๅํ่ๅ ่็ ๑๒เํไเ๐๒ํ๎ใ๎ ๏๎๒๎๊เ โโ๎ไเ stdin...\n"
-
-#. Re-opening the original file failed!
-#: ../fileio.c:909
-msgid "E202: Conversion made file unreadable!"
-msgstr "E202: ย ๐ๅ็๓๋๒เ๒ๅ ๏๐ๅ๎แ๐เ็๎โเํ่ ๔เ้๋ ๑๒เ๋ ํๅ๗่๒เๅ์๛์!"
-
-#. fifo or socket
-#: ../fileio.c:1782
-msgid "[fifo/socket]"
-msgstr "[fifo/ใํๅ็ไ๎]"
-
-#. fifo
-#: ../fileio.c:1788
-msgid "[fifo]"
-msgstr "[fifo]"
-
-#. or socket
-#: ../fileio.c:1794
-msgid "[socket]"
-msgstr "[ใํๅ็ไ๎]"
-
-#. or character special
-#: ../fileio.c:1801
-msgid "[character special]"
-msgstr "[๑๏ๅ๖่เ๋ํ๛้ ๑่์โ๎๋ํ๛้]"
-
-#: ../fileio.c:1815
-msgid "[CR missing]"
-msgstr "[๏๐๎๏๓๙ๅํ๛ ๑่์โ๎๋๛ CR]"
-
-#: ../fileio.c:1819
-msgid "[long lines split]"
-msgstr "[ไ๋่ํํ๛ๅ ๑๒๐๎๊่ ๐เ็แ่๒๛]"
-
-#: ../fileio.c:1823 ../fileio.c:3512
-msgid "[NOT converted]"
-msgstr "[มลว ๏๐ๅ๎แ๐เ็๎โเํ่้]"
-
-#: ../fileio.c:1826 ../fileio.c:3515
-msgid "[converted]"
-msgstr "[๏ๅ๐ๅ๊๎ไ่๐๎โเํ๎]"
-
-#: ../fileio.c:1831
-#, c-format
-msgid "[CONVERSION ERROR in line %<PRId64>]"
-msgstr "[ฮุศมสภ ฯะลฮมะภวฮยภอศ฿ โ ๑๒๐๎๊ๅ %<PRId64>]"
-
-#: ../fileio.c:1835
-#, c-format
-msgid "[ILLEGAL BYTE in line %<PRId64>]"
-msgstr "[อลฤฮฯำัาศฬษ มภษา โ ๑๒๐๎๊ๅ %<PRId64>]"
-
-#: ../fileio.c:1838
-msgid "[READ ERRORS]"
-msgstr "[ฮุศมสศ ืาลอศ฿]"
-
-#: ../fileio.c:2104
-msgid "Can't find temp file for conversion"
-msgstr "ย๐ๅ์ๅํํ๛้ ๔เ้๋ ไ๋ ๏ๅ๐ๅ๊๎ไ่๐๎โเํ่ ํๅ ํเ้ไๅํ"
-
-#: ../fileio.c:2110
-msgid "Conversion with 'charconvert' failed"
-msgstr "ฯ๐ๅ๎แ๐เ็๎โเํ่ๅ ๑ ๏๎์๎๙ 'charconvert' ํๅ โ๛๏๎๋ํๅํ๎"
-
-#: ../fileio.c:2113
-msgid "can't read output of 'charconvert'"
-msgstr "ํๅโ๎็์๎ๆํ๎ ๏๐๎๗่๒เ๒ โ๛โ๎ไ 'charconvert'"
-
-#: ../fileio.c:2437
-msgid "E676: No matching autocommands for acwrite buffer"
-msgstr "E676: อๅ๒ ๏๎ไ๕๎ไ๙่๕ เโ๒๎๊๎์เํไ ไ๋ แ๓๔ๅ๐เ acwrite"
-
-#: ../fileio.c:2466
-msgid "E203: Autocommands deleted or unloaded buffer to be written"
-msgstr ""
-"E203: ม๓๔ๅ๐, ๊๎๒๎๐๛้ ๒๐ๅแ๎โเ๋๎๑ ็เ๏่๑เ๒, ๓ไเ๋ธํ ่๋่ โ๛ใ๐๓ๆๅํ เโ๒๎๊๎์เํไ๎้"
-
-#: ../fileio.c:2486
-msgid "E204: Autocommand changed number of lines in unexpected way"
-msgstr "E204: ส๎๋่๗ๅ๑๒โ๎ ๑๒๐๎๊ ่็์ๅํๅํ๎ เโ๒๎๊๎์เํไ๎้ ํๅ๎ๆ่ไเํํ๛์ ๎แ๐เ็๎์"
-
-#: ../fileio.c:2548 ../fileio.c:2565
-msgid "is not a file or writable device"
-msgstr "ํๅ โ๋ๅ๒๑ ๔เ้๋๎์ ่๋่ ๓๑๒๐๎้๑๒โ๎์, ไ๎๑๒๓๏ํ๛์ ไ๋ ็เ๏่๑่"
-
-#: ../fileio.c:2601
-msgid "is read-only (add ! to override)"
-msgstr "๎๒๊๐๛๒ ๒๎๋๊๎ ไ๋ ๗๒ๅํ่ (ไ๎แเโ๒ๅ !, ๗๒๎แ๛ ๎แ๎้๒่ ๏๐๎โๅ๐๊๓)"
-
-#: ../fileio.c:2886
-msgid "E506: Can't write to backup file (add ! to override)"
-msgstr ""
-"E506: วเ๏่๑ โ ๐ๅ็ๅ๐โํ๛้ ๔เ้๋ ํๅโ๎็์๎ๆํเ (ไ๎แเโ๒ๅ !, ๗๒๎แ๛ ๎แ๎้๒่ ๏๐๎โๅ๐๊๓)"
-
-#: ../fileio.c:2898
-msgid "E507: Close error for backup file (add ! to override)"
-msgstr ""
-"E507: ฮ๘่แ๊เ ็เ๊๐๛๒่ ๐ๅ็ๅ๐โํ๎ใ๎ ๔เ้๋เ (ไ๎แเโ๒ๅ !, ๗๒๎แ๛ ๎แ๎้๒่ ๏๐๎โๅ๐๊๓)"
-
-#: ../fileio.c:2901
-msgid "E508: Can't read file for backup (add ! to override)"
-msgstr ""
-"E508: อๅโ๎็์๎ๆํ๎ ๏๐๎๗่๒เ๒ ๐ๅ็ๅ๐โํ๛้ ๔เ้๋ (ไ๎แเโ๒ๅ !, ๗๒๎แ๛ ๎แ๎้๒่ ๏๐๎โๅ๐๊๓)"
-
-#: ../fileio.c:2923
-msgid "E509: Cannot create backup file (add ! to override)"
-msgstr ""
-"E509: อๅโ๎็์๎ๆํ๎ ๑๎็ไเ๒ ๐ๅ็ๅ๐โํ๛้ ๔เ้๋ (ไ๎แเโ๒ๅ !, ๗๒๎แ๛ ๎แ๎้๒่ ๏๐๎โๅ๐๊๓)"
-
-#: ../fileio.c:3008
-msgid "E510: Can't make backup file (add ! to override)"
-msgstr ""
-"E510: อๅโ๎็์๎ๆํ๎ ๑๎็ไเ๒ ๐ๅ็ๅ๐โํ๛้ ๔เ้๋ (ไ๎แเโ๒ๅ !, ๗๒๎แ๛ ๎แ๎้๒่ ๏๐๎โๅ๐๊๓)"
-
-#. Can't write without a tempfile!
-#: ../fileio.c:3121
-msgid "E214: Can't find temp file for writing"
-msgstr "E214: ย๐ๅ์ๅํํ๛้ ๔เ้๋ ไ๋ ็เ๏่๑่ ํๅ ํเ้ไๅํ"
-
-#: ../fileio.c:3134
-msgid "E213: Cannot convert (add ! to write without conversion)"
-msgstr ""
-"E213: ฯๅ๐ๅ๊๎ไ่๐๎โ๊เ ํๅโ๎็์๎ๆํเ (ไ๎แเโ๒ๅ ! ไ๋ ็เ๏่๑่ แๅ็ ๏ๅ๐ๅ๊๎ไ่๐๎โ๊่)"
-
-#: ../fileio.c:3169
-msgid "E166: Can't open linked file for writing"
-msgstr "E166: อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ ๑โ็เํํ๛้ ๔เ้๋ ไ๋ ็เ๏่๑่"
-
-#: ../fileio.c:3173
-msgid "E212: Can't open file for writing"
-msgstr "E212: อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ ๔เ้๋ ไ๋ ็เ๏่๑่"
-
-#: ../fileio.c:3363
-msgid "E667: Fsync failed"
-msgstr "E667: อๅ ๓ไเ๋๎๑ โ๛๏๎๋ํ่๒ ๔๓ํ๊๖่ fsync()"
-
-#: ../fileio.c:3398
-msgid "E512: Close failed"
-msgstr "E512: ฮ๏ๅ๐เ๖่ ็เ๊๐๛๒่ ํๅ ๓ไเ๋เ๑"
-
-#: ../fileio.c:3436
-msgid "E513: write error, conversion failed (make 'fenc' empty to override)"
-msgstr ""
-"E513: ฮ๘่แ๊เ ็เ๏่๑่, ๏๐ๅ๎แ๐เ็๎โเํ่ๅ ํๅ ๓ไเ๋๎๑ (๎๗่๑๒่๒ๅ 'fenc', ๗๒๎แ๛ "
-"๎แ๎้๒่)"
-
-#: ../fileio.c:3441
-#, c-format
-msgid ""
-"E513: write error, conversion failed in line %<PRId64> (make 'fenc' empty to "
-"override)"
-msgstr ""
-"E513: ฮ๘่แ๊เ ็เ๏่๑่, ๏๐ๅ๎แ๐เ็๎โเํ่ๅ ํๅ ๓ไเ๋๎๑ ํเ ๑๒๐๎๊ๅ %<PRId64> (๎๗่๑๒่๒ๅ "
-"'fenc', ๗๒๎แ๛ ๎แ๎้๒่)"
-
-#: ../fileio.c:3448
-msgid "E514: write error (file system full?)"
-msgstr "E514: ฮ๘่แ๊เ ็เ๏่๑่ (ํๅ๒ ๑โ๎แ๎ไํ๎ใ๎ ์ๅ๑๒เ?)"
-
-#: ../fileio.c:3506
-msgid " CONVERSION ERROR"
-msgstr " ฮุศมสภ ฯะลฮมะภวฮยภอศ฿"
-
-#: ../fileio.c:3509
-#, c-format
-msgid " in line %<PRId64>;"
-msgstr " ํเ ๑๒๐๎๊ๅ %<PRId64>;"
-
-#: ../fileio.c:3519
-msgid "[Device]"
-msgstr "[ำ๑๒๐๎้๑๒โ๎]"
-
-#: ../fileio.c:3522
-msgid "[New]"
-msgstr "[อ๎โ๛้]"
-
-#: ../fileio.c:3535
-msgid " [a]"
-msgstr " [ไ]"
-
-#: ../fileio.c:3535
-msgid " appended"
-msgstr " ไ๎แเโ๋ๅํ๎"
-
-#: ../fileio.c:3537
-msgid " [w]"
-msgstr " [็]"
-
-#: ../fileio.c:3537
-msgid " written"
-msgstr " ็เ๏่๑เํ๎"
-
-#: ../fileio.c:3579
-msgid "E205: Patchmode: can't save original file"
-msgstr "E205: ะๅๆ่์ ็เ๏๋เ๒๊่: ํๅโ๎็์๎ๆํ๎ ๑๎๕๐เํๅํ่ๅ ่๑๕๎ไํ๎ใ๎ ๔เ้๋เ"
-
-#: ../fileio.c:3602
-msgid "E206: patchmode: can't touch empty original file"
-msgstr ""
-"E206: ะๅๆ่์ ็เ๏๋เ๒๊่: ํๅโ๎็์๎ๆํ๎ ๑์ๅํ่๒ ๏เ๐เ์ๅ๒๐๛ ๏๓๑๒๎ใ๎ ่๑๕๎ไํ๎ใ๎ ๔เ้๋เ"
-
-#: ../fileio.c:3616
-msgid "E207: Can't delete backup file"
-msgstr "E207: อๅโ๎็์๎ๆํ๎ ๓ไเ๋่๒ ๐ๅ็ๅ๐โํ๛้ ๔เ้๋"
-
-#: ../fileio.c:3672
-msgid ""
-"\n"
-"WARNING: Original file may be lost or damaged\n"
-msgstr ""
-"\n"
-"ฯะลฤำฯะลฦฤลอศล: ศ๑๕๎ไํ๛้ ๔เ้๋ ์๎ๆๅ๒ แ๛๒ ๓๒๐เ๗ๅํ ่๋่ ๏๎โ๐ๅๆไธํ\n"
-
-#: ../fileio.c:3675
-msgid "don't quit the editor until the file is successfully written!"
-msgstr "ํๅ โ๛๕๎ไ่๒ๅ ่็ ๐ๅไเ๊๒๎๐เ, ๏๎๊เ ๔เ้๋ ํๅ แ๓ไๅ๒ ๓๑๏ๅ๘ํ๎ ็เ๏่๑เํ!"
-
-#: ../fileio.c:3795
-msgid "[dos]"
-msgstr "[dos]"
-
-#: ../fileio.c:3795
-msgid "[dos format]"
-msgstr "[๔๎๐์เ๒ dos]"
-
-#: ../fileio.c:3801
-msgid "[mac]"
-msgstr "[mac]"
-
-#: ../fileio.c:3801
-msgid "[mac format]"
-msgstr "[๔๎๐์เ๒ mac]"
-
-#: ../fileio.c:3807
-msgid "[unix]"
-msgstr "[unix]"
-
-#: ../fileio.c:3807
-msgid "[unix format]"
-msgstr "[๔๎๐์เ๒ unix]"
-
-#: ../fileio.c:3831
-msgid "1 line, "
-msgstr "1 ๑๒๐๎๊เ, "
-
-#: ../fileio.c:3833
-#, c-format
-msgid "%<PRId64> lines, "
-msgstr "๑๒๐๎๊: %<PRId64>, "
-
-#: ../fileio.c:3836
-msgid "1 character"
-msgstr "1 ๑่์โ๎๋"
-
-#: ../fileio.c:3838
-#, c-format
-msgid "%<PRId64> characters"
-msgstr "๑่์โ๎๋๎โ: %<PRId64>"
-
-#: ../fileio.c:3849
-msgid "[noeol]"
-msgstr "[noeol]"
-
-#: ../fileio.c:3849
-msgid "[Incomplete last line]"
-msgstr "[อๅ็เโๅ๐๘ธํํเ ๏๎๑๋ๅไํ ๑๒๐๎๊เ]"
-
-#. don't overwrite messages here
-#. must give this prompt
-#. don't use emsg() here, don't want to flush the buffers
-#: ../fileio.c:3865
-msgid "WARNING: The file has been changed since reading it!!!"
-msgstr "ฯะลฤำฯะลฦฤลอศล: ิเ้๋ ่็์ๅํธํ ๑ ์๎์ๅํ๒เ ๗๒ๅํ่!!!"
-
-#: ../fileio.c:3867
-msgid "Do you really want to write to it"
-msgstr "ัๅ๐ธ็ํ๎ ๕๎๒่๒ๅ ็เ๏่๑เ๒ โ ๒๎๒ ๔เ้๋"
-
-#: ../fileio.c:4648
-#, c-format
-msgid "E208: Error writing to \"%s\""
-msgstr "E208: ฮ๘่แ๊เ ็เ๏่๑่ โ \"%s\""
-
-#: ../fileio.c:4655
-#, c-format
-msgid "E209: Error closing \"%s\""
-msgstr "E209: ฮ๘่แ๊เ ็เ๊๐๛๒่ \"%s\""
-
-#: ../fileio.c:4657
-#, c-format
-msgid "E210: Error reading \"%s\""
-msgstr "E210: ฮ๘่แ๊เ ๗๒ๅํ่ \"%s\""
-
-#: ../fileio.c:4883
-msgid "E246: FileChangedShell autocommand deleted buffer"
-msgstr "E246: ม๓๔ๅ๐ ๓ไเ๋ธํ ๏๐่ โ๛๏๎๋ํๅํ่่ เโ๒๎๊๎์เํไ๛ FileChangedShell"
-
-#: ../fileio.c:4894
-#, c-format
-msgid "E211: File \"%s\" no longer available"
-msgstr "E211: ิเ้๋ \"%s\" แ๎๋๘ๅ ํๅ ไ๎๑๒๓๏ๅํ"
-
-#: ../fileio.c:4906
-#, c-format
-msgid ""
-"W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as "
-"well"
-msgstr ""
-"W12: ฯ๐ๅไ๓๏๐ๅๆไๅํ่ๅ: ๔เ้๋ \"%s\" ่ แ๓๔ๅ๐ Vim แ๛๋่ ่็์ๅํๅํ๛ ํๅ็เโ่๑่์๎ ไ๐๓ใ "
-"๎๒ ไ๐๓ใเ"
-
-#: ../fileio.c:4907
-msgid "See \":help W12\" for more info."
-msgstr "ั์. \":help W12\" ไ๋ ไ๎๏๎๋ํ่๒ๅ๋ํ๎้ ่ํ๔๎๐์เ๖่่."
-
-#: ../fileio.c:4910
-#, c-format
-msgid "W11: Warning: File \"%s\" has changed since editing started"
-msgstr ""
-"W11: ฯ๐ๅไ๓๏๐ๅๆไๅํ่ๅ: ๔เ้๋ \"%s\" แ๛๋ ่็์ๅํธํ ๏๎๑๋ๅ ํเ๗เ๋เ ๐ๅไเ๊๒่๐๎โเํ่"
-
-#: ../fileio.c:4911
-msgid "See \":help W11\" for more info."
-msgstr "ั์. \":help W11\" ไ๋ ไ๎๏๎๋ํ่๒ๅ๋ํ๎้ ่ํ๔๎๐์เ๖่่."
-
-#: ../fileio.c:4914
-#, c-format
-msgid "W16: Warning: Mode of file \"%s\" has changed since editing started"
-msgstr ""
-"W16: ฯ๐ๅไ๓๏๐ๅๆไๅํ่ๅ: ๐ๅๆ่์ ไ๎๑๒๓๏เ ๊ ๔เ้๋๓ \"%s\" แ๛๋ ่็์ๅํธํ ๏๎๑๋ๅ ํเ๗เ๋เ "
-"๐ๅไเ๊๒่๐๎โเํ่"
-
-#: ../fileio.c:4915
-msgid "See \":help W16\" for more info."
-msgstr "ั์. \":help W16\" ไ๋ ไ๎๏๎๋ํ่๒ๅ๋ํ๎้ ่ํ๔๎๐์เ๖่่."
-
-#: ../fileio.c:4927
-#, c-format
-msgid "W13: Warning: File \"%s\" has been created after editing started"
-msgstr ""
-"W13: ฯ๐ๅไ๓๏๐ๅๆไๅํ่ๅ: ๔เ้๋ \"%s\" แ๛๋ ๑๎็ไเํ ๏๎๑๋ๅ ํเ๗เ๋เ ๐ๅไเ๊๒่๐๎โเํ่"
-
-#: ../fileio.c:4947
-msgid "Warning"
-msgstr "ฯ๐ๅไ๓๏๐ๅๆไๅํ่ๅ"
-
-#: ../fileio.c:4948
-msgid ""
-"&OK\n"
-"&Load File"
-msgstr ""
-"&OK\n"
-"&L วเใ๐๓็่๒ ๔เ้๋"
-
-#: ../fileio.c:5065
-#, c-format
-msgid "E462: Could not prepare for reloading \"%s\""
-msgstr "E462: อๅโ๎็์๎ๆํ๎ ๏๎ไใ๎๒๎โ่๒๑ ๊ ๏ๅ๐ๅ็เใ๐๓็๊ๅ \"%s\""
-
-#: ../fileio.c:5078
-#, c-format
-msgid "E321: Could not reload \"%s\""
-msgstr "E321: อๅโ๎็์๎ๆํ๎ โ๛๏๎๋ํ่๒ ๏ๅ๐ๅ็เใ๐๓็๊๓ \"%s\""
-
-#: ../fileio.c:5601
-msgid "--Deleted--"
-msgstr "--ำไเ๋ๅํ๎--"
-
-#: ../fileio.c:5732
-#, c-format
-msgid "auto-removing autocommand: %s <buffer=%d>"
-msgstr "เโ๒๎-๓ไเ๋ๅํ่ๅ เโ๒๎๊๎์เํไ๛: %s <แ๓๔๔ๅ๐=%d>"
-
-#. the group doesn't exist
-#: ../fileio.c:5772
-#, c-format
-msgid "E367: No such group: \"%s\""
-msgstr "E367: ร๐๓๏๏เ \"%s\" ํๅ ๑๓๙ๅ๑๒โ๓ๅ๒"
-
-#: ../fileio.c:5897
-#, c-format
-msgid "E215: Illegal character after *: %s"
-msgstr "E215: อๅไ๎๏๓๑๒่์๛ๅ ๑่์โ๎๋๛ ๏๎๑๋ๅ *: %s"
-
-#: ../fileio.c:5905
-#, c-format
-msgid "E216: No such event: %s"
-msgstr "E216: อๅ๑๓๙ๅ๑๒โ๓๙ๅๅ ๑๎แ๛๒่ๅ: %s"
-
-#: ../fileio.c:5907
-#, c-format
-msgid "E216: No such group or event: %s"
-msgstr "E216: อๅ๑๓๙ๅ๑๒โ๓๙เ ใ๐๓๏๏เ ่๋่ ๑๎แ๛๒่ๅ: %s"
-
-#. Highlight title
-#: ../fileio.c:6090
-msgid ""
-"\n"
-"--- Auto-Commands ---"
-msgstr ""
-"\n"
-"--- ภโ๒๎๊๎์เํไ๛ ---"
-
-#: ../fileio.c:6293
-#, c-format
-msgid "E680: <buffer=%d>: invalid buffer number "
-msgstr "E680: <buffer=%d>: ํๅ๏๐เโ่๋ํ๛้ ํ๎์ๅ๐ แ๓๔ๅ๐เ "
-
-#: ../fileio.c:6370
-msgid "E217: Can't execute autocommands for ALL events"
-msgstr "E217: อๅโ๎็์๎ๆํ๎ โ๛๏๎๋ํ่๒ เโ๒๎๊๎์เํไ๛ ไ๋ ยัลี ๑๎แ๛๒่้"
-
-#: ../fileio.c:6393
-msgid "No matching autocommands"
-msgstr "อๅ๒ ๏๎ไ๕๎ไ๙่๕ เโ๒๎๊๎์เํไ"
-
-#: ../fileio.c:6831
-msgid "E218: autocommand nesting too deep"
-msgstr "E218: ๑๋่๘๊๎์ ใ๋๓แ๎๊๎ โ๋๎ๆๅํํ๛ๅ เโ๒๎๊๎์เํไ๛"
-
-#: ../fileio.c:7143
-#, c-format
-msgid "%s Auto commands for \"%s\""
-msgstr "%s ภโ๒๎๊๎์เํไ๛ ไ๋ \"%s\""
-
-#: ../fileio.c:7149
-#, c-format
-msgid "Executing %s"
-msgstr "ย๛๏๎๋ํๅํ่ๅ %s"
-
-#: ../fileio.c:7211
-#, c-format
-msgid "autocommand %s"
-msgstr "เโ๒๎๊๎์เํไเ %s"
-
-#: ../fileio.c:7795
-msgid "E219: Missing {."
-msgstr "E219: ฯ๐๎๏๓๙ๅํเ {."
-
-#: ../fileio.c:7797
-msgid "E220: Missing }."
-msgstr "E220: ฯ๐๎๏๓๙ๅํเ }."
-
-#: ../fold.c:93
-msgid "E490: No fold found"
-msgstr "E490: ั๊๋เไ๎๊ ํๅ ๎แํเ๐๓ๆๅํ๎"
-
-#: ../fold.c:544
-msgid "E350: Cannot create fold with current 'foldmethod'"
-msgstr ""
-"E350: ั๊๋เไ๊เ ํๅ ์๎ๆๅ๒ แ๛๒ ๑๎็ไเํเ ๑ ๒ๅ๊๓๙่์ ็ํเ๗ๅํ่ๅ์ ๎๏๖่่ 'foldmethod'"
-
-#: ../fold.c:546
-msgid "E351: Cannot delete fold with current 'foldmethod'"
-msgstr ""
-"E351: ั๊๋เไ๊เ ํๅ ์๎ๆๅ๒ แ๛๒ ๓ไเ๋ๅํเ ๑ ๒ๅ๊๓๙่์ ็ํเ๗ๅํ่ๅ์ ๎๏๖่่ 'foldmethod'"
-
-#: ../fold.c:1784
-#, c-format
-msgid "+--%3ld lines folded "
-msgstr "+--%3ld ๑๒๐๎๊ โ ๑๊๋เไ๊ๅ"
-
-#. buffer has already been read
-#: ../getchar.c:273
-msgid "E222: Add to read buffer"
-msgstr "E222: ฤ๎แเโ๋ๅํ่ๅ โ แ๓๔ๅ๐ ๗๒ๅํ่"
-
-#: ../getchar.c:2040
-msgid "E223: recursive mapping"
-msgstr "E223: ะๅ๊๓๐๑่โํเ ๏๐่โ็๊เ"
-
-#: ../getchar.c:2849
-#, c-format
-msgid "E224: global abbreviation already exists for %s"
-msgstr "E224: ำๆๅ ๅ๑๒ ใ๋๎แเ๋ํ๎ๅ ๑๎๊๐เ๙ๅํ่ๅ ไ๋ %s"
-
-#: ../getchar.c:2852
-#, c-format
-msgid "E225: global mapping already exists for %s"
-msgstr "E225: ำๆๅ ๅ๑๒ ใ๋๎แเ๋ํเ ๏๐่โ็๊เ ไ๋ %s"
-
-#: ../getchar.c:2952
-#, c-format
-msgid "E226: abbreviation already exists for %s"
-msgstr "E226: ำๆๅ ๅ๑๒ ๑๎๊๐เ๙ๅํ่ๅ ไ๋ %s"
-
-#: ../getchar.c:2955
-#, c-format
-msgid "E227: mapping already exists for %s"
-msgstr "E227: ำๆๅ ๅ๑๒ ๏๐่โ็๊เ ไ๋ %s"
-
-#: ../getchar.c:3008
-msgid "No abbreviation found"
-msgstr "ั๎๊๐เ๙ๅํ่ ํๅ ํเ้ไๅํ๛"
-
-#: ../getchar.c:3010
-msgid "No mapping found"
-msgstr "ฯ๐่โ็๊่ ํๅ ํเ้ไๅํ๛"
-
-#: ../getchar.c:3974
-msgid "E228: makemap: Illegal mode"
-msgstr "E228: makemap: ํๅไ๎๏๓๑๒่์๛้ ๐ๅๆ่์"
-
-#. key value of 'cedit' option
-#. type of cmdline window or 0
-#. result of cmdline window or 0
-#: ../globals.h:924
-msgid "--No lines in buffer--"
-msgstr "-- อๅ๒ ๑๒๐๎๊ โ แ๓๔ๅ๐ๅ --"
-
-#.
-#. * The error messages that can be shared are included here.
-#. * Excluded are errors that are only used once and debugging messages.
-#.
-#: ../globals.h:996
-msgid "E470: Command aborted"
-msgstr "E470: ย๛๏๎๋ํๅํ่ๅ ๊๎์เํไ๛ ๏๐ๅ๐โเํ๎"
-
-#: ../globals.h:997
-msgid "E471: Argument required"
-msgstr "E471: า๐ๅแ๓ๅ๒๑ ๓๊เ็เ๒ ๏เ๐เ์ๅ๒๐"
-
-#: ../globals.h:998
-msgid "E10: \\ should be followed by /, ? or &"
-msgstr "E10: ฯ๎๑๋ๅ \\ ไ๎๋ๆๅํ ่ไ๒่ ๑่์โ๎๋ /, ? ่๋่ &"
-
-#: ../globals.h:1000
-msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
-msgstr ""
-"E11: อๅไ๎๏๓๑๒่์๎ โ ๎๊ํๅ ๊๎์เํไํ๎้ ๑๒๐๎๊่; <CR> โ๛๏๎๋ํๅํ่ๅ, CTRL-C โ๛๕๎ไ"
-
-#: ../globals.h:1002
-msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
-msgstr ""
-"E12: ส๎์เํไเ ํๅ ไ๎๏๓๑๊เๅ๒๑ โ exrc/vimrc โ ๒ๅ๊๓๙ๅ์ ๊เ๒เ๋๎ใๅ ่๋่ ๏๎่๑๊ๅ ์ๅ๒๎๊"
-
-#: ../globals.h:1003
-msgid "E171: Missing :endif"
-msgstr "E171: ฮ๒๑๓๒๑๒โ๓ๅ๒ ๊๎์เํไเ :endif"
-
-#: ../globals.h:1004
-msgid "E600: Missing :endtry"
-msgstr "E600: ฮ๒๑๓๒๑๒โ๓ๅ๒ ๊๎์เํไเ :endtry"
-
-#: ../globals.h:1005
-msgid "E170: Missing :endwhile"
-msgstr "E170: ฮ๒๑๓๒๑๒โ๓ๅ๒ ๊๎์เํไเ :endwhile"
-
-#: ../globals.h:1006
-msgid "E170: Missing :endfor"
-msgstr "E170: ฮ๒๑๓๒๑๒โ๓ๅ๒ ๊๎์เํไเ :endfor"
-
-#: ../globals.h:1007
-msgid "E588: :endwhile without :while"
-msgstr "E588: ส๎์เํไเ :endwhile แๅ็ ๏เ๐ํ๎้ ๊๎์เํไ๛ :while"
-
-#: ../globals.h:1008
-msgid "E588: :endfor without :for"
-msgstr "E588: :endfor แๅ็ :for"
-
-#: ../globals.h:1009
-msgid "E13: File exists (add ! to override)"
-msgstr "E13: ิเ้๋ ๑๓๙ๅ๑๒โ๓ๅ๒ (ไ๎แเโ๒ๅ !, ๗๒๎แ๛ ๏ๅ๐ๅ็เ๏่๑เ๒)"
-
-#: ../globals.h:1010
-msgid "E472: Command failed"
-msgstr "E472: อๅ ๓ไเ๋๎๑ โ๛๏๎๋ํ่๒ ๊๎์เํไ๓"
-
-#: ../globals.h:1011
-msgid "E473: Internal error"
-msgstr "E473: ยํ๓๒๐ๅํํ ๎๘่แ๊เ"
-
-#: ../globals.h:1012
-msgid "Interrupted"
-msgstr "ฯ๐ๅ๐โเํ๎"
-
-#: ../globals.h:1013
-msgid "E14: Invalid address"
-msgstr "E14: อๅไ๎๏๓๑๒่์๛้ เไ๐ๅ๑"
-
-#: ../globals.h:1014
-msgid "E474: Invalid argument"
-msgstr "E474: อๅไ๎๏๓๑๒่์๛้ ๏เ๐เ์ๅ๒๐"
-
-#: ../globals.h:1015
-#, c-format
-msgid "E475: Invalid argument: %s"
-msgstr "E475: อๅไ๎๏๓๑๒่์๛้ ๏เ๐เ์ๅ๒๐: %s"
-
-#: ../globals.h:1016
-#, c-format
-msgid "E15: Invalid expression: %s"
-msgstr "E15: อๅไ๎๏๓๑๒่์๎ๅ โ๛๐เๆๅํ่ๅ: %s"
-
-#: ../globals.h:1017
-msgid "E16: Invalid range"
-msgstr "E16: อๅไ๎๏๓๑๒่์๛้ ไ่เ๏เ็๎ํ"
-
-#: ../globals.h:1018
-msgid "E476: Invalid command"
-msgstr "E476: อๅไ๎๏๓๑๒่์เ ๊๎์เํไเ"
-
-#: ../globals.h:1019
-#, c-format
-msgid "E17: \"%s\" is a directory"
-msgstr "E17: \"%s\" โ๋ๅ๒๑ ๊เ๒เ๋๎ใ๎์"
-
-#: ../globals.h:1020
-#, fuzzy
-msgid "E900: Invalid job id"
-msgstr "E49: อๅไ๎๏๓๑๒่์๛้ ๐เ็์ๅ๐ ๏๐๎๊๐๓๒๊่"
-
-#: ../globals.h:1021
-msgid "E901: Job table is full"
-msgstr ""
-
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
-#: ../globals.h:1024
-#, c-format
-msgid "E364: Library call failed for \"%s()\""
-msgstr "E364: อๅ๓ไเ๗ํ๛้ โ๛็๎โ ๔๓ํ๊๖่่ \"%s()\" ่็ แ่แ๋่๎๒ๅ๊่"
-
-#: ../globals.h:1026
-msgid "E19: Mark has invalid line number"
-msgstr "E19: ฮ๒์ๅ๒๊เ ๓๊เ็๛โเๅ๒ ํเ ํๅ๏๐เโ่๋ํ๛้ ํ๎์ๅ๐ ๑๒๐๎๊่"
-
-#: ../globals.h:1027
-msgid "E20: Mark not set"
-msgstr "E20: ฮ๒์ๅ๒๊เ ํๅ ๎๏๐ๅไๅ๋ๅํเ"
-
-#: ../globals.h:1029
-msgid "E21: Cannot make changes, 'modifiable' is off"
-msgstr "E21: ศ็์ๅํๅํ่ ํๅโ๎็์๎ๆํ๛, ๒เ๊ ๊เ๊ ๎๒๊๋๗ๅํเ ๎๏๖่ 'modifiable'"
-
-#: ../globals.h:1030
-msgid "E22: Scripts nested too deep"
-msgstr "E22: ั๋่๘๊๎์ ใ๋๓แ๎๊๎ โ๋๎ๆๅํํ๛ๅ ๑๖ๅํเ๐่่"
-
-#: ../globals.h:1031
-msgid "E23: No alternate file"
-msgstr "E23: ั๎๑ๅไํ่้ ๔เ้๋ ํๅ ๑๓๙ๅ๑๒โ๓ๅ๒"
-
-#: ../globals.h:1032
-msgid "E24: No such abbreviation"
-msgstr "E24: อๅ๒ ๒เ๊๎ใ๎ ๑๎๊๐เ๙ๅํ่"
-
-#: ../globals.h:1033
-msgid "E477: No ! allowed"
-msgstr "E477: ! ํๅ ไ๎๏๓๑๊เๅ๒๑"
-
-#: ../globals.h:1035
-msgid "E25: Nvim does not have a built-in GUI"
-msgstr ""
-"E25: ย๎็์๎ๆํ๎๑๒ ่๑๏๎๋็๎โเํ่ ใ๐เ๔่๗ๅ๑๊๎ใ๎ ่ํ๒ๅ๐๔ๅ้๑เ โ๛๊๋๗ๅํเ ๏๐่ "
-"๊๎์๏่๋๖่่"
-
-#: ../globals.h:1036
-#, c-format
-msgid "E28: No such highlight group name: %s"
-msgstr "E28: ร๐๓๏๏เ ๏๎ไ๑โๅ๒๊่ ๑่ํ๒เ๊๑่๑เ %s ํๅ ๑๓๙ๅ๑๒โ๓ๅ๒"
-
-#: ../globals.h:1037
-msgid "E29: No inserted text yet"
-msgstr "E29: ฯ๎๊เ ํๅ๒ โ๑๒เโ๋ๅํํ๎ใ๎ ๒ๅ๊๑๒เ"
-
-#: ../globals.h:1038
-msgid "E30: No previous command line"
-msgstr "E30: ฯ๐ๅไ๛ไ๓๙ๅ้ ๊๎์เํไํ๎้ ๑๒๐๎๊่ ํๅ๒"
-
-#: ../globals.h:1039
-msgid "E31: No such mapping"
-msgstr "E31: าเ๊๎้ ๏๐่โ็๊่ ํๅ ๑๓๙ๅ๑๒โ๓ๅ๒"
-
-#: ../globals.h:1040
-msgid "E479: No match"
-msgstr "E479: อๅ๒ ๑๎๎๒โๅ๒๑๒โ่"
-
-#: ../globals.h:1041
-#, c-format
-msgid "E480: No match: %s"
-msgstr "E480: อๅ๒ ๑๎๎๒โๅ๒๑๒โ่: %s"
-
-#: ../globals.h:1042
-msgid "E32: No file name"
-msgstr "E32: อๅ๒ ่์ๅํ่ ๔เ้๋เ"
-
-#: ../globals.h:1044
-msgid "E33: No previous substitute regular expression"
-msgstr "E33: อๅ๒ ๏๐ๅไ๛ไ๓๙ๅใ๎ ๐ๅใ๓๋๐ํ๎ใ๎ โ๛๐เๆๅํ่ ไ๋ ็เ์ๅํ๛"
-
-#: ../globals.h:1045
-msgid "E34: No previous command"
-msgstr "E34: อๅ๒ ๏๐ๅไ๛ไ๓๙ๅ้ ๊๎์เํไ๛"
-
-#: ../globals.h:1046
-msgid "E35: No previous regular expression"
-msgstr "E35: อๅ๒ ๏๐ๅไ๛ไ๓๙ๅใ๎ ๐ๅใ๓๋๐ํ๎ใ๎ โ๛๐เๆๅํ่"
-
-#: ../globals.h:1047
-msgid "E481: No range allowed"
-msgstr "E481: ศ๑๏๎๋็๎โเํ่ๅ ไ่เ๏เ็๎ํเ ํๅ ไ๎๏๓๑๊เๅ๒๑"
-
-#: ../globals.h:1048
-msgid "E36: Not enough room"
-msgstr "E36: อๅไ๎๑๒เ๒๎๗ํ๎ ์ๅ๑๒เ"
-
-#: ../globals.h:1049
-#, c-format
-msgid "E482: Can't create file %s"
-msgstr "E482: อๅโ๎็์๎ๆํ๎ ๑๎็ไเ๒ ๔เ้๋ %s"
-
-#: ../globals.h:1050
-msgid "E483: Can't get temp file name"
-msgstr "E483: อๅโ๎็์๎ๆํ๎ ๏๎๋๓๗่๒ ่์ โ๐ๅ์ๅํํ๎ใ๎ ๔เ้๋เ"
-
-#: ../globals.h:1051
-#, c-format
-msgid "E484: Can't open file %s"
-msgstr "E484: อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ ๔เ้๋ %s"
-
-#: ../globals.h:1052
-#, c-format
-msgid "E485: Can't read file %s"
-msgstr "E485: อๅโ๎็์๎ๆํ๎ ๏๐๎๗่๒เ๒ ๔เ้๋ %s"
-
-#: ../globals.h:1054
-msgid "E37: No write since last change (add ! to override)"
-msgstr "E37: ศ็์ๅํๅํ่ ํๅ ๑๎๕๐เํๅํ๛ (ไ๎แเโ๒ๅ !, ๗๒๎แ๛ ๎แ๎้๒่ ๏๐๎โๅ๐๊๓)"
-
-#: ../globals.h:1055
-#, fuzzy
-msgid "E37: No write since last change"
-msgstr "[ศ็์ๅํๅํ่ ํๅ ๑๎๕๐เํๅํ๛]\n"
-
-#: ../globals.h:1056
-msgid "E38: Null argument"
-msgstr "E38: อ๓๋ๅโ๎้ ๏เ๐เ์ๅ๒๐"
-
-#: ../globals.h:1057
-msgid "E39: Number expected"
-msgstr "E39: า๐ๅแ๓ๅ๒๑ ๗่๑๋๎"
-
-#: ../globals.h:1058
-#, c-format
-msgid "E40: Can't open errorfile %s"
-msgstr "E40: อๅ ๓ไเ๋๎๑ ๎๒๊๐๛๒ ๔เ้๋ ๎๘่แ๎๊ %s"
-
-#: ../globals.h:1059
-msgid "E41: Out of memory!"
-msgstr "E41: อๅ ๕โเ๒เๅ๒ ๏เ์๒่!"
-
-#: ../globals.h:1060
-msgid "Pattern not found"
-msgstr "ุเแ๋๎ํ ํๅ ํเ้ไๅํ"
-
-#: ../globals.h:1061
-#, c-format
-msgid "E486: Pattern not found: %s"
-msgstr "E486: ุเแ๋๎ํ ํๅ ํเ้ไๅํ: %s"
-
-#: ../globals.h:1062
-msgid "E487: Argument must be positive"
-msgstr "E487: ฯเ๐เ์ๅ๒๐ ไ๎๋ๆๅํ แ๛๒ ๏๎๋๎ๆ่๒ๅ๋ํ๛์ ๗่๑๋๎์"
-
-#: ../globals.h:1064
-msgid "E459: Cannot go back to previous directory"
-msgstr "E459: ย๎็โ๐เ๒ โ ๏๐ๅไ๛ไ๓๙่้ ๊เ๒เ๋๎ใ ํๅโ๎็์๎ๆๅํ"
-
-#: ../globals.h:1066
-msgid "E42: No Errors"
-msgstr "E42: อๅ๒ ๎๘่แ๎๊"
-
-#: ../globals.h:1067
-msgid "E776: No location list"
-msgstr "E776: อๅ๒ ๑๏่๑๊เ ๐เ๑๏๎๋๎ๆๅํ่้"
-
-#: ../globals.h:1068
-msgid "E43: Damaged match string"
-msgstr "E43: ฯ๎โ๐ๅๆไๅํเ ๑๒๐๎๊เ ๑๎๎๒โๅ๒๑๒โ่"
-
-#: ../globals.h:1069
-msgid "E44: Corrupted regexp program"
-msgstr "E44: ฯ๐๎ใ๐เ์์เ ๎แ๐เแ๎๒๊่ ๐ๅใ๓๋๐ํ๛๕ โ๛๐เๆๅํ่้ ๏๎โ๐ๅๆไๅํเ"
-
-#: ../globals.h:1071
-msgid "E45: 'readonly' option is set (add ! to override)"
-msgstr "E45: ย๊๋๗ๅํเ ๎๏๖่ 'readonly' (ไ๎แเโ๒ๅ !, ๗๒๎แ๛ ๎แ๎้๒่ ๏๐๎โๅ๐๊๓)"
-
-#: ../globals.h:1073
-#, c-format
-msgid "E46: Cannot change read-only variable \"%s\""
-msgstr "E46: อๅโ๎็์๎ๆํ๎ ่็์ๅํ่๒ ๏ๅ๐ๅ์ๅํํ๓ ๒๎๋๊๎ ไ๋ ๗๒ๅํ่ \"%s\""
-
-#: ../globals.h:1075
-#, c-format
-msgid "E794: Cannot set variable in the sandbox: \"%s\""
-msgstr "E794: อๅโ๎็์๎ๆํ๎ ่็์ๅํ่๒ ๏ๅ๐ๅ์ๅํํ๓ โ ๏ๅ๑๎๗ํ่๖ๅ: \"%s\""
-
-#: ../globals.h:1076
-msgid "E47: Error while reading errorfile"
-msgstr "E47: ฮ๘่แ๊เ ๏๐่ ๗๒ๅํ่่ ๔เ้๋เ ๎๘่แ๎๊"
-
-#: ../globals.h:1078
-msgid "E48: Not allowed in sandbox"
-msgstr "E48: อๅ ไ๎๏๓๑๊เๅ๒๑ โ ๏ๅ๑๎๗ํ่๖ๅ"
-
-#: ../globals.h:1080
-msgid "E523: Not allowed here"
-msgstr "E523: วไๅ๑ ํๅ ๐เ็๐ๅ๘ๅํ๎"
-
-#: ../globals.h:1082
-msgid "E359: Screen mode setting not supported"
-msgstr "E359: ฤเํํ๛้ ๐ๅๆ่์ ๊๐เํเ ํๅ ๏๎ไไๅ๐ๆ่โเๅ๒๑"
-
-#: ../globals.h:1083
-msgid "E49: Invalid scroll size"
-msgstr "E49: อๅไ๎๏๓๑๒่์๛้ ๐เ็์ๅ๐ ๏๐๎๊๐๓๒๊่"
-
-#: ../globals.h:1084
-msgid "E91: 'shell' option is empty"
-msgstr "E91: วํเ๗ๅํ่ๅ์ ๎๏๖่่ 'shell' โ๋ๅ๒๑ ๏๓๑๒เ ๑๒๐๎๊เ"
-
-#: ../globals.h:1085
-msgid "E255: Couldn't read in sign data!"
-msgstr "E255: อๅโ๎็์๎ๆํ๎ ๏๐๎๗่๒เ๒ ไเํํ๛ๅ ๎ ็ํเ๗๊เ๕!"
-
-#: ../globals.h:1086
-msgid "E72: Close error on swap file"
-msgstr "E72: ฮ๘่แ๊เ ็เ๊๐๛๒่ ๑โ๎๏-๔เ้๋เ"
-
-#: ../globals.h:1087
-msgid "E73: tag stack empty"
-msgstr "E73: ั๒ๅ๊ ์ๅ๒๎๊ ๏๓๑๒๎้"
-
-#: ../globals.h:1088
-msgid "E74: Command too complex"
-msgstr "E74: ั๋่๘๊๎์ ๑๋๎ๆํเ ๊๎์เํไเ"
-
-#: ../globals.h:1089
-msgid "E75: Name too long"
-msgstr "E75: ั๋่๘๊๎์ ไ๋่ํํ๎ๅ ่์"
-
-#: ../globals.h:1090
-msgid "E76: Too many ["
-msgstr "E76: ั๋่๘๊๎์ ์ํ๎ใ๎ ๑่์โ๎๋๎โ ["
-
-#: ../globals.h:1091
-msgid "E77: Too many file names"
-msgstr "E77: ั๋่๘๊๎์ ์ํ๎ใ๎ ่์ธํ ๔เ้๋๎โ"
-
-#: ../globals.h:1092
-msgid "E488: Trailing characters"
-msgstr "E488: ห่๘ํ่ๅ ๑่์โ๎๋๛ ํเ ๕โ๎๑๒ๅ"
-
-#: ../globals.h:1093
-msgid "E78: Unknown mark"
-msgstr "E78: อๅ่็โๅ๑๒ํเ ๎๒์ๅ๒๊เ"
-
-#: ../globals.h:1094
-msgid "E79: Cannot expand wildcards"
-msgstr "E79: อๅโ๎็์๎ๆํ๎ โ๛๏๎๋ํ่๒ ๏๎ไ๑๒เํ๎โ๊๓ ๏๎ ์เ๑๊ๅ"
-
-#: ../globals.h:1096
-msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
-msgstr ""
-"E591: วํเ๗ๅํ่ๅ ๎๏๖่่ 'winheight' ํๅ ์๎ๆๅ๒ แ๛๒ ์ๅํ๘ๅ ็ํเ๗ๅํ่ 'winminheight'"
-
-#: ../globals.h:1098
-msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
-msgstr ""
-"E592: วํเ๗ๅํ่ๅ ๎๏๖่่ 'winwidth' ํๅ ์๎ๆๅ๒ แ๛๒ ์ๅํ๘ๅ ็ํเ๗ๅํ่ 'winminwidth'"
-
-#: ../globals.h:1099
-msgid "E80: Error while writing"
-msgstr "E80: ฮ๘่แ๊เ ๏๐่ ็เ๏่๑่"
-
-#: ../globals.h:1100
-msgid "Zero count"
-msgstr "อ๓๋ๅโ๎ๅ ็ํเ๗ๅํ่ๅ ๑๗ธ๒๗่๊เ"
-
-#: ../globals.h:1101
-msgid "E81: Using <SID> not in a script context"
-msgstr "E81: ศ๑๏๎๋็๎โเํ่ๅ <SID> โํๅ ๊๎ํ๒ๅ๊๑๒เ ๑๖ๅํเ๐่"
-
-#: ../globals.h:1102
-#, c-format
-msgid "E685: Internal error: %s"
-msgstr "E685: ยํ๓๒๐ๅํํ ๎๘่แ๊เ: %s"
-
-#: ../globals.h:1104
-msgid "E363: pattern uses more memory than 'maxmempattern'"
-msgstr "E363: ุเแ๋๎ํ ่๑๏๎๋็๓ๅ๒ แ๎๋๘ๅ ๏เ์๒่ ๗ๅ์ 'maxmempattern'"
-
-#: ../globals.h:1105
-msgid "E749: empty buffer"
-msgstr "E749: ฯ๓๑๒๎้ แ๓๔ๅ๐"
-
-#: ../globals.h:1108
-msgid "E682: Invalid search pattern or delimiter"
-msgstr "E682: อๅ๏๐เโ่๋ํเ ๑๒๐๎๊เ ๏๎่๑๊เ ่๋่ ๐เ็ไๅ๋่๒ๅ๋"
-
-#: ../globals.h:1109
-msgid "E139: File is loaded in another buffer"
-msgstr "E139: ิเ้๋ ็เใ๐๓ๆๅํ โ ไ๐๓ใ๎์ แ๓๔ๅ๐ๅ"
-
-#: ../globals.h:1110
-#, c-format
-msgid "E764: Option '%s' is not set"
-msgstr "E764: ฮ๏๖่ '%s' ํๅ ๓๑๒เํ๎โ๋ๅํเ"
-
-#: ../globals.h:1111
-msgid "E850: Invalid register name"
-msgstr "E850: อๅไ๎๏๓๑๒่์๎ๅ ่์ ๐ๅใ่๑๒๐เ"
-
-#: ../globals.h:1114
-msgid "search hit TOP, continuing at BOTTOM"
-msgstr "ฯ๎่๑๊ แ๓ไๅ๒ ๏๐๎ไ๎๋ๆๅํ ๑ สฮอึภ ไ๎๊๓์ๅํ๒เ"
-
-#: ../globals.h:1115
-msgid "search hit BOTTOM, continuing at TOP"
-msgstr "ฯ๎่๑๊ แ๓ไๅ๒ ๏๐๎ไ๎๋ๆๅํ ๑ อภืภหภ ไ๎๊๓์ๅํ๒เ"
-
-#: ../hardcopy.c:240
-msgid "E550: Missing colon"
-msgstr "E550: ฯ๐๎๏๓๙ๅํ๎ ไโ๎ๅ๒๎๗่ๅ"
-
-#: ../hardcopy.c:252
-msgid "E551: Illegal component"
-msgstr "E551: อๅไ๎๏๓๑๒่์๛้ ๊๎์๏๎ํๅํ๒"
-
-#: ../hardcopy.c:259
-msgid "E552: digit expected"
-msgstr "E552: า๐ๅแ๓ๅ๒๑ ๓๊เ็เ๒ ๖่๔๐๓"
-
-#: ../hardcopy.c:473
-#, c-format
-msgid "Page %d"
-msgstr "ั๒๐เํ่๖เ %d"
-
-#: ../hardcopy.c:597
-msgid "No text to be printed"
-msgstr "ฯๅ๗เ๒เ๒ ํๅ๗ๅใ๎"
-
-#: ../hardcopy.c:668
-#, c-format
-msgid "Printing page %d (%d%%)"
-msgstr "ฯๅ๗เ๒ ๑๒๐. %d (%d%%)"
-
-#: ../hardcopy.c:680
-#, c-format
-msgid " Copy %d of %d"
-msgstr " ส๎๏่ %d ่็ %d"
-
-#: ../hardcopy.c:733
-#, c-format
-msgid "Printed: %s"
-msgstr "อเ๏ๅ๗เ๒เํ๎: %s"
-
-#: ../hardcopy.c:740
-msgid "Printing aborted"
-msgstr "ฯๅ๗เ๒ ๏๐ๅ๊๐เ๙ๅํเ"
-
-#: ../hardcopy.c:1365
-msgid "E455: Error writing to PostScript output file"
-msgstr "E455: ฮ๘่แ๊เ ็เ๏่๑่ โ ๔เ้๋ PostScript"
-
-#: ../hardcopy.c:1747
-#, c-format
-msgid "E624: Can't open file \"%s\""
-msgstr "E624: อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ ๔เ้๋ \"%s\""
-
-#: ../hardcopy.c:1756 ../hardcopy.c:2470
-#, c-format
-msgid "E457: Can't read PostScript resource file \"%s\""
-msgstr "E457: อๅโ๎็์๎ๆํ๎ ๏๐๎๗่๒เ๒ ๔เ้๋ ๐ๅ๑๓๐๑๎โ PostScript \"%s\""
-
-#: ../hardcopy.c:1772
-#, c-format
-msgid "E618: file \"%s\" is not a PostScript resource file"
-msgstr "E618: ิเ้๋ \"%s\" ํๅ โ๋ๅ๒๑ ๔เ้๋๎์ ๐ๅ๑๓๐๑๎โ PostScript"
-
-#: ../hardcopy.c:1788 ../hardcopy.c:1805 ../hardcopy.c:1844
-#, c-format
-msgid "E619: file \"%s\" is not a supported PostScript resource file"
-msgstr "E619: ิเ้๋ \"%s\" ํๅ โ๋ๅ๒๑ ไ๎๏๓๑๒่์๛์ ๔เ้๋๎์ ๐ๅ๑๓๐๑๎โ PostScript"
-
-#: ../hardcopy.c:1856
-#, c-format
-msgid "E621: \"%s\" resource file has wrong version"
-msgstr "E621: ิเ้๋ ๐ๅ๑๓๐๑๎โ \"%s\" ํๅ่็โๅ๑๒ํ๎้ โๅ๐๑่่"
-
-#: ../hardcopy.c:2225
-msgid "E673: Incompatible multi-byte encoding and character set."
-msgstr "E673: อๅ๑๎โ์ๅ๑๒่์๛ๅ ์ํ๎ใ๎แเ้๒๎โเ ๊๎ไ่๐๎โ๊เ ่ ํเแ๎๐ ๑่์โ๎๋๎โ."
-
-#: ../hardcopy.c:2238
-msgid "E674: printmbcharset cannot be empty with multi-byte encoding."
-msgstr "E674: printmbcharset ํๅ ์๎ๆๅ๒ แ๛๒ ๏๓๑๒๛์ ๏๐่ ์ํ๎ใ๎แเ้๒๎โ๎้ ๊๎ไ่๐๎โ๊ๅ."
-
-#: ../hardcopy.c:2254
-msgid "E675: No default font specified for multi-byte printing."
-msgstr "E675: อๅ๒ ๎๏๐ๅไๅ๋ๅํ่ ๘๐่๔๒เ ๏๎ ๓์๎๋๗เํ่ ไ๋ ์ํ๎ใ๎แเ้๒๎โ๎้ ๏ๅ๗เ๒่."
-
-#: ../hardcopy.c:2426
-msgid "E324: Can't open PostScript output file"
-msgstr "E324: อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ ๔เ้๋ PostScript"
-
-#: ../hardcopy.c:2458
-#, c-format
-msgid "E456: Can't open file \"%s\""
-msgstr "E456: อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ ๔เ้๋ \"%s\""
-
-#: ../hardcopy.c:2583
-msgid "E456: Can't find PostScript resource file \"prolog.ps\""
-msgstr "E456: ิเ้๋ ๐ๅ๑๓๐๑๎โ PostScript \"prolog.ps\" ํๅ ํเ้ไๅํ"
-
-#: ../hardcopy.c:2593
-msgid "E456: Can't find PostScript resource file \"cidfont.ps\""
-msgstr "E456: ิเ้๋ ๐ๅ๑๓๐๑๎โ PostScript \"cidfont.ps\" ํๅ ํเ้ไๅํ"
-
-#: ../hardcopy.c:2622 ../hardcopy.c:2639 ../hardcopy.c:2665
-#, c-format
-msgid "E456: Can't find PostScript resource file \"%s.ps\""
-msgstr "E456: ิเ้๋ ๐ๅ๑๓๐๑๎โ PostScript \"%s.ps\" ํๅ ํเ้ไๅํ"
-
-#: ../hardcopy.c:2654
-#, c-format
-msgid "E620: Unable to convert to print encoding \"%s\""
-msgstr "E620: อๅโ๎็์๎ๆํ๎ ๏๐ๅ๎แ๐เ็๎โเ๒ โ ๊๎ไ่๐๎โ๊๓ ๏ๅ๗เ๒ \"%s\""
-
-#: ../hardcopy.c:2877
-msgid "Sending to printer..."
-msgstr "ฮ๒๏๐เโ๊เ ํเ ๏ๅ๗เ๒..."
-
-#: ../hardcopy.c:2881
-msgid "E365: Failed to print PostScript file"
-msgstr "E365: อๅ ๓ไเ๋๎๑ โ๛๏๎๋ํ่๒ ๏ๅ๗เ๒ ๔เ้๋เ PostScript"
-
-#: ../hardcopy.c:2883
-msgid "Print job sent."
-msgstr "วเไเํ่ๅ ํเ ๏ๅ๗เ๒ ๎๒๏๐เโ๋ๅํ๎."
-
-#: ../if_cscope.c:85
-msgid "Add a new database"
-msgstr "ฤ๎แเโ่๒ ํ๎โ๓ แเ็๓ ไเํํ๛๕"
-
-#: ../if_cscope.c:87
-msgid "Query for a pattern"
-msgstr "วเ๏๐๎๑ ๏๎ ๘เแ๋๎ํ๓"
-
-#: ../if_cscope.c:89
-msgid "Show this message"
-msgstr "ฯ๎๊เ็เ๒ ๒๎ ๑๎๎แ๙ๅํ่ๅ"
-
-#: ../if_cscope.c:91
-msgid "Kill a connection"
-msgstr "ำแ่๒ ๑๎ๅไ่ํๅํ่ๅ"
-
-#: ../if_cscope.c:93
-msgid "Reinit all connections"
-msgstr "วเํ๎โ๎ ่ํ่๖่เ๋่็่๐๎โเ๒ โ๑ๅ ๑๎ๅไ่ํๅํ่"
-
-#: ../if_cscope.c:95
-msgid "Show connections"
-msgstr "ฯ๎๊เ็เ๒ ๑๎ๅไ่ํๅํ่"
-
-#: ../if_cscope.c:101
-#, c-format
-msgid "E560: Usage: cs[cope] %s"
-msgstr "E560: ศ๑๏๎๋็๎โเํ่ๅ: cs[cope] %s"
-
-#: ../if_cscope.c:225
-msgid "This cscope command does not support splitting the window.\n"
-msgstr "๒เ ๊๎์เํไเ cscope ํๅ ๏๎ไไๅ๐ๆ่โเๅ๒ ๐เ็ไๅ๋ๅํ่ๅ ๎๊ํเ.\n"
-
-#: ../if_cscope.c:266
-msgid "E562: Usage: cstag <ident>"
-msgstr "E562: ศ๑๏๎๋็๎โเํ่ๅ: cstag <่์>"
-
-#: ../if_cscope.c:313
-msgid "E257: cstag: tag not found"
-msgstr "E257: cstag: ์ๅ๒๊เ ํๅ ํเ้ไๅํเ"
-
-#: ../if_cscope.c:461
-#, c-format
-msgid "E563: stat(%s) error: %d"
-msgstr "E563: ฮ๘่แ๊เ stat(%s): %d"
-
-#: ../if_cscope.c:551
-#, c-format
-msgid "E564: %s is not a directory or a valid cscope database"
-msgstr "E564: %s ํๅ โ๋ๅ๒๑ ๊เ๒เ๋๎ใ๎์ ่๋่ ่์ๅํๅ์ แเ็๛ cscope"
-
-#: ../if_cscope.c:566
-#, c-format
-msgid "Added cscope database %s"
-msgstr "ฤ๎แเโ๋ๅํเ แเ็เ ไเํํ๛๕ cscope %s"
-
-#: ../if_cscope.c:616
-#, c-format
-msgid "E262: error reading cscope connection %<PRId64>"
-msgstr "E262: ฮ๘่แ๊เ ๏๎๋๓๗ๅํ่ ่ํ๔๎๐์เ๖่่ ๎๒ ๑๎ๅไ่ํๅํ่ cscope %<PRId64>"
-
-#: ../if_cscope.c:711
-msgid "E561: unknown cscope search type"
-msgstr "E561: อๅ่็โๅ๑๒ํ๛้ ๒่๏ ๏๎่๑๊เ cscope"
-
-#: ../if_cscope.c:752 ../if_cscope.c:789
-msgid "E566: Could not create cscope pipes"
-msgstr "E566: อๅโ๎็์๎ๆํ๎ ๑๎็ไเ๒ ๒๐๓แ๓ ไ๋ cscope"
-
-#: ../if_cscope.c:767
-msgid "E622: Could not fork for cscope"
-msgstr "E622: อๅโ๎็์๎ๆํ๎ โ๛๏๎๋ํ่๒ fork() ไ๋ cscope"
-
-#: ../if_cscope.c:849
-msgid "cs_create_connection setpgid failed"
-msgstr "cs_create_connection: ํๅ ๓ไเ๋๎๑ โ๛๏๎๋ํ่๒ setpgid"
-
-#: ../if_cscope.c:853 ../if_cscope.c:889
-msgid "cs_create_connection exec failed"
-msgstr "cs_create_connection: ํๅ ๓ไเ๋๎๑ โ๛๏๎๋ํ่๒ exec"
-
-#: ../if_cscope.c:863 ../if_cscope.c:902
-msgid "cs_create_connection: fdopen for to_fp failed"
-msgstr "cs_create_connection: ํๅ ๓ไเ๋๎๑ โ๛๏๎๋ํ่๒ fdopen ไ๋ to_fp"
-
-#: ../if_cscope.c:865 ../if_cscope.c:906
-msgid "cs_create_connection: fdopen for fr_fp failed"
-msgstr "cs_create_connection: ํๅ ๓ไเ๋๎๑ โ๛๏๎๋ํ่๒ fdopen ไ๋ fr_fp"
-
-#: ../if_cscope.c:890
-msgid "E623: Could not spawn cscope process"
-msgstr "E623: อๅ ๓ไเ๋๎๑ ็เ๏๓๑๒่๒ ๏๐๎๖ๅ๑๑ cscope"
-
-#: ../if_cscope.c:932
-msgid "E567: no cscope connections"
-msgstr "E567: ั๎ๅไ่ํๅํ่้ ๑ cscope ํๅ ๑๎็ไเํ๎"
-
-#: ../if_cscope.c:1009
-#, c-format
-msgid "E469: invalid cscopequickfix flag %c for %c"
-msgstr "E469: อๅ๏๐เโ่๋ํ๛้ ๔๋เใ cscopequickfix %c ไ๋ %c"
-
-#: ../if_cscope.c:1058
-#, c-format
-msgid "E259: no matches found for cscope query %s of %s"
-msgstr "E259: อๅ ํเ้ไๅํ๎ ๑๎๎๒โๅ๒๑๒โ่้ ๏๎ ็เ๏๐๎๑๓ cscope %s ไ๋ %s"
-
-#: ../if_cscope.c:1142
-msgid "cscope commands:\n"
-msgstr "ส๎์เํไ๛ cscope:\n"
-
-#: ../if_cscope.c:1150
-#, c-format
-msgid "%-5s: %s%*s (Usage: %s)"
-msgstr "%-5s: %s%*s (่๑๏๎๋็๎โเํ่ๅ: %s)"
-
-#: ../if_cscope.c:1155
-msgid ""
-"\n"
-" c: Find functions calling this function\n"
-" d: Find functions called by this function\n"
-" e: Find this egrep pattern\n"
-" f: Find this file\n"
-" g: Find this definition\n"
-" i: Find files #including this file\n"
-" s: Find this C symbol\n"
-" t: Find this text string\n"
-msgstr ""
-"\n"
-" c: อเ้๒่ ๔๓ํ๊๖่่ โ๛็๛โเ๙่ๅ ๒๓ ๔๓ํ๊๖่\n"
-" d: อเ้๒่ ๔๓ํ๊๖่่ โ๛็๛โเๅ์๛ๅ ๒๎้ ๔๓ํ๊๖่ๅ้\n"
-" e: อเ้๒่ ๒๎๒ ๘เแ๋๎ํ egrep\n"
-" f: อเ้๒่ ๒๎๒ ๔เ้๋\n"
-" g: อเ้๒่ ๒๎ ๎๏๐ๅไๅ๋ๅํ่ๅ\n"
-" i: อเ้๒่ ๔เ้๋๛ โ๊๋๗เ๙่ๅ (#include) ๒๎๒ ๔เ้๋\n"
-" s: อเ้๒่ ๒๎๒ C-๑่์โ๎๋\n"
-" t: อเ้๒่ ๒๓ ๒ๅ๊๑๒๎โ๓ ๑๒๐๎๊๓\n"
-
-#: ../if_cscope.c:1226
-msgid "E568: duplicate cscope database not added"
-msgstr "E568: ฤเํํเ แเ็เ ไเํํ๛๕ cscope ๓ๆๅ ๏๎ไ๑๎ๅไ่ํๅํเ"
-
-#: ../if_cscope.c:1335
-#, c-format
-msgid "E261: cscope connection %s not found"
-msgstr "E261: ั๎ๅไ่ํๅํ่ๅ ๑ cscope %s ํๅ ๎แํเ๐๓ๆๅํ๎"
-
-#: ../if_cscope.c:1364
-#, c-format
-msgid "cscope connection %s closed"
-msgstr "๑๎ๅไ่ํๅํ่ๅ ๑ cscope %s ็เ๊๐๛๒๎"
-
-#. should not reach here
-#: ../if_cscope.c:1486
-msgid "E570: fatal error in cs_manage_matches"
-msgstr "E570: ส๐่๒่๗ๅ๑๊เ ๎๘่แ๊เ โ cs_manage_matches"
-
-#: ../if_cscope.c:1693
-#, c-format
-msgid "Cscope tag: %s"
-msgstr "ฬๅ๒๊เ cscope: %s"
-
-#: ../if_cscope.c:1711
-msgid ""
-"\n"
-" # line"
-msgstr ""
-"\n"
-" # ๑๒๐๎๊เ"
-
-#: ../if_cscope.c:1713
-msgid "filename / context / line\n"
-msgstr "่์ ๔เ้๋เ / ๊๎ํ๒ๅ๊๑๒ / ๑๒๐๎๊เ\n"
-
-#: ../if_cscope.c:1809
-#, c-format
-msgid "E609: Cscope error: %s"
-msgstr "E609: ฮ๘่แ๊เ cscope: %s"
-
-#: ../if_cscope.c:2053
-msgid "All cscope databases reset"
-msgstr "ฯๅ๐ๅ็เใ๐๓็๊เ โ๑ๅ๕ แเ็ ไเํํ๛๕ cscope"
-
-#: ../if_cscope.c:2123
-msgid "no cscope connections\n"
-msgstr "๑๎ๅไ่ํๅํ่ ๑ cscope ๎๒๑๓๒๑๒โ๓๒\n"
-
-#: ../if_cscope.c:2126
-msgid " # pid database name prepend path\n"
-msgstr " # pid แเ็เ ไเํํ๛๕ ํเ๗เ๋ํ๛้ ๏๓๒\n"
-
-#: ../main.c:144
-msgid "Unknown option argument"
-msgstr "อๅ่็โๅ๑๒ํ๛้ ํๅ๎แ็เ๒ๅ๋ํ๛้ ๏เ๐เ์ๅ๒๐"
-
-#: ../main.c:146
-msgid "Too many edit arguments"
-msgstr "ั๋่๘๊๎์ ์ํ๎ใ๎ ๏เ๐เ์ๅ๒๐๎โ ๐ๅไเ๊๒่๐๎โเํ่"
-
-#: ../main.c:148
-msgid "Argument missing after"
-msgstr "ฯ๐๎๏๓๙ๅํ ๏เ๐เ์ๅ๒๐ ๏๎๑๋ๅ"
-
-#: ../main.c:150
-msgid "Garbage after option argument"
-msgstr "ฬ๓๑๎๐ ๏๎๑๋ๅ ํๅ๎แ็เ๒ๅ๋ํ๎ใ๎ ๏เ๐เ์ๅ๒๐เ"
-
-#: ../main.c:152
-msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"
-msgstr ""
-"ั๋่๘๊๎์ ์ํ๎ใ๎ ๏เ๐เ์ๅ๒๐๎โ \"+๊๎์เํไเ\", \"-c ๊๎์เํไเ\" ่๋่ \"--cmd ๊๎์เํไเ\""
-
-#: ../main.c:154
-msgid "Invalid argument for"
-msgstr "อๅไ๎๏๓๑๒่์๛้ ๏เ๐เ์ๅ๒๐ ไ๋"
-
-#: ../main.c:294
-#, c-format
-msgid "%d files to edit\n"
-msgstr "ิเ้๋๎โ ไ๋ ๐ๅไเ๊๒่๐๎โเํ่: %d\n"
-
-#: ../main.c:1342
-msgid "Attempt to open script file again: \""
-msgstr "ฯ๎๏๛๒๊เ ๏๎โ๒๎๐ํ๎ใ๎ ๎๒๊๐๛๒่ ๔เ้๋เ ๑๖ๅํเ๐่: \""
-
-#: ../main.c:1350
-msgid "Cannot open for reading: \""
-msgstr "อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ ไ๋ ๗๒ๅํ่: \""
-
-#: ../main.c:1393
-msgid "Cannot open for script output: \""
-msgstr "อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ ไ๋ โ๛โ๎ไเ ๑๖ๅํเ๐่: \""
-
-#: ../main.c:1622
-msgid "Vim: Warning: Output is not to a terminal\n"
-msgstr "Vim: ฯ๐ๅไ๓๏๐ๅๆไๅํ่ๅ: ย๛โ๎ไ ๎๑๓๙ๅ๑๒โ๋ๅ๒๑ ํๅ ํเ ๒ๅ๐์่ํเ๋\n"
-
-#: ../main.c:1624
-msgid "Vim: Warning: Input is not from a terminal\n"
-msgstr "Vim: ฯ๐ๅไ๓๏๐ๅๆไๅํ่ๅ: ยโ๎ไ ๏๐๎่๑๕๎ไ่๒ ํๅ ๑ ๒ๅ๐์่ํเ๋เ\n"
-
-#. just in case..
-#: ../main.c:1891
-msgid "pre-vimrc command line"
-msgstr "๊๎์เํไํเ ๑๒๐๎๊เ ๏ๅ๐ๅไ โ๛๏๎๋ํๅํ่ๅ์ vimrc"
-
-#: ../main.c:1964
-#, c-format
-msgid "E282: Cannot read from \"%s\""
-msgstr "E282: อๅโ๎็์๎ๆํ๎ โ๛๏๎๋ํ่๒ ๗๒ๅํ่ๅ ่็ \"%s\""
-
-#: ../main.c:2149
-msgid ""
-"\n"
-"More info with: \"vim -h\"\n"
-msgstr ""
-"\n"
-"ฤ๎๏๎๋ํ่๒ๅ๋ํเ ่ํ๔๎๐์เ๖่: \"vim -h\"\n"
-
-#: ../main.c:2178
-msgid "[file ..] edit specified file(s)"
-msgstr "[๔เ้๋ ..] ๐ๅไเ๊๒่๐๎โเํ่ๅ ๓๊เ็เํํ๛๕ ๔เ้๋๎โ"
-
-#: ../main.c:2179
-msgid "- read text from stdin"
-msgstr "- ๗๒ๅํ่ๅ ๒ๅ๊๑๒เ ่็ ๏๎๒๎๊เ โโ๎ไเ stdin"
-
-#: ../main.c:2180
-msgid "-t tag edit file where tag is defined"
-msgstr "-t ์ๅ๒๊เ ๐ๅไเ๊๒่๐๎โเํ่ๅ ๔เ้๋เ ๑ ๓๊เ็เํํ๎้ ์ๅ๒๊๎้"
-
-# \n\t\t.. ไ๋ ๓์ๅ๙ๅํ่ โ 80 ๑๒๎๋แ๖๎โ
-#: ../main.c:2181
-msgid "-q [errorfile] edit file with first error"
-msgstr ""
-"-q [๔เ้๋-๎๘่แ๎๊]\n"
-"\t\t\t\t ๐ๅไเ๊๒่๐๎โเํ่ๅ ๔เ้๋เ ๑ ๏ๅ๐โ๎้ ๎๘่แ๊๎้"
-
-#: ../main.c:2187
-msgid ""
-"\n"
-"\n"
-"usage:"
-msgstr ""
-"\n"
-"\n"
-"ศ๑๏๎๋็๎โเํ่ๅ:"
-
-#: ../main.c:2189
-msgid " vim [arguments] "
-msgstr " vim [๏เ๐เ์ๅ๒๐๛] "
-
-#: ../main.c:2193
-msgid ""
-"\n"
-" or:"
-msgstr ""
-"\n"
-" ่๋่:"
-
-#: ../main.c:2196
-msgid ""
-"\n"
-"\n"
-"Arguments:\n"
-msgstr ""
-"\n"
-"\n"
-"ฯเ๐เ์ๅ๒๐๛:\n"
-
-#: ../main.c:2197
-msgid "--\t\t\tOnly file names after this"
-msgstr "--\t\t\tฤเ๋ๅๅ ๓๊เ็๛โเ๒๑ ๒๎๋๊๎ ่์ๅํเ ๔เ้๋๎โ"
-
-#: ../main.c:2199
-msgid "--literal\t\tDon't expand wildcards"
-msgstr "--literal\t\tอๅ โ๛๏๎๋ํ๒ ๏๎ไ๑๒เํ๎โ๊๓ ๏๎ ์เ๑๊ๅ"
-
-#: ../main.c:2201
-msgid "-v\t\t\tVi mode (like \"vi\")"
-msgstr "-v\t\t\tะๅๆ่์ Vi (๊เ๊ \"vi\")"
-
-#: ../main.c:2202
-msgid "-e\t\t\tEx mode (like \"ex\")"
-msgstr "-e\t\t\tะๅๆ่์ Ex (๊เ๊ \"ex\")"
-
-#: ../main.c:2203
-msgid "-E\t\t\tImproved Ex mode"
-msgstr "-E\t\t\tำ๋๓๗๘ๅํํ๛้ ๐ๅๆ่์ Ex"
-
-#: ../main.c:2204
-msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")"
-msgstr "-s\t\t\tา่๕่้ (๏เ๊ๅ๒ํ๛้) ๐ๅๆ่์ (๒๎๋๊๎ ไ๋ \"ex\")"
-
-#: ../main.c:2205
-msgid "-d\t\t\tDiff mode (like \"vimdiff\")"
-msgstr "-d\t\t\tะๅๆ่์ ๎๒๋่๗่้ (๊เ๊ \"vimdiff\")"
-
-#: ../main.c:2206
-msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
-msgstr "-y\t\t\tฯ๐๎๑๒๎้ ๐ๅๆ่์ (๊เ๊ \"evim\", แๅ็๐ๅๆ่์ํ๛้)"
-
-#: ../main.c:2207
-msgid "-R\t\t\tReadonly mode (like \"view\")"
-msgstr "-R\t\t\tา๎๋๊๎ ไ๋ ๗๒ๅํ่ (๊เ๊ \"view\")"
-
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tฮใ๐เํ่๗ๅํํ๛้ ๐ๅๆ่์ (๊เ๊ \"rvim\")"
-
-#: ../main.c:2209
-msgid "-m\t\t\tModifications (writing files) not allowed"
-msgstr "-m\t\t\tมๅ็ โ๎็์๎ๆํ๎๑๒่ ๑๎๕๐เํๅํ่ ่็์ๅํๅํ่้ (็เ๏่๑่ ๔เ้๋๎โ)"
-
-#: ../main.c:2210
-msgid "-M\t\t\tModifications in text not allowed"
-msgstr "-M\t\t\tมๅ็ โ๎็์๎ๆํ๎๑๒่ โํๅ๑ๅํ่ ่็์ๅํๅํ่้ โ ๒ๅ๊๑๒"
-
-#: ../main.c:2211
-msgid "-b\t\t\tBinary mode"
-msgstr "-b\t\t\tฤโ๎่๗ํ๛้ ๐ๅๆ่์"
-
-#: ../main.c:2212
-msgid "-l\t\t\tLisp mode"
-msgstr "-l\t\t\tะๅๆ่์ Lisp"
-
-#: ../main.c:2213
-msgid "-C\t\t\tCompatible with Vi: 'compatible'"
-msgstr "-C\t\t\tะๅๆ่์ ๑๎โ์ๅ๑๒่์๎๑๒่ ๑ Vi: 'compatible'"
-
-#: ../main.c:2214
-msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'"
-msgstr "-N\t\t\tะๅๆ่์ ํๅ๏๎๋ํ๎้ ๑๎โ์ๅ๑๒่์๎๑๒่ ๑ Vi: 'nocompatible'"
-
-# \n\t\t.. ไ๋ ๓์ๅ๙ๅํ่ โ 80 ๑๒๎๋แ๖๎โ
-#: ../main.c:2215
-msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]"
-msgstr ""
-"-V[N][๔เ้๋]\t\tย๛โ๎ไ่๒ ไ๎๏๎๋ํ่๒ๅ๋ํ๛ๅ ๑๎๎แ๙ๅํ่\n"
-"\t\t\t\t[๓๐๎โๅํ N] [็เ๏่๑๛โเ๒ โ ๔เ้๋]"
-
-#: ../main.c:2216
-msgid "-D\t\t\tDebugging mode"
-msgstr "-D\t\t\tะๅๆ่์ ๎๒๋เไ๊่"
-
-#: ../main.c:2217
-msgid "-n\t\t\tNo swap file, use memory only"
-msgstr "-n\t\t\tมๅ็ ๑โ๎๏-๔เ้๋เ, ่๑๏๎๋็๓ๅ๒๑ ๒๎๋๊๎ ๏เ์๒"
-
-#: ../main.c:2218
-msgid "-r\t\t\tList swap files and exit"
-msgstr "-r\t\t\tย๛โๅ๑๒่ ๑๏่๑๎๊ ๑โ๎๏-๔เ้๋๎โ ่ ็เโๅ๐๘่๒ ๐เแ๎๒๓"
-
-#: ../main.c:2219
-msgid "-r (with file name)\tRecover crashed session"
-msgstr "-r (๑ ่์ๅํๅ์ ๔เ้๋เ)\tย๎๑๑๒เํ๎โ่๒ เโเ๐่้ํ๎ ็เโๅ๐๘ธํํ๛้ ๑ๅเํ๑"
-
-#: ../main.c:2220
-msgid "-L\t\t\tSame as -r"
-msgstr "-L\t\t\tา๎ ๆๅ, ๗๒๎ ่ -r"
-
-#: ../main.c:2221
-msgid "-A\t\t\tstart in Arabic mode"
-msgstr "-A\t\t\tวเ๏๓๑๊ โ ภ๐เแ๑๊๎์ ๐ๅๆ่์ๅ"
-
-#: ../main.c:2222
-msgid "-H\t\t\tStart in Hebrew mode"
-msgstr "-H\t\t\tวเ๏๓๑๊ โ ๐ๅๆ่์ๅ \"ศโ๐่๒\""
-
-#: ../main.c:2223
-msgid "-F\t\t\tStart in Farsi mode"
-msgstr "-F\t\t\tวเ๏๓๑๊ โ ๐ๅๆ่์ๅ \"ิเ๐๑่\""
-
-#: ../main.c:2224
-msgid "-T <terminal>\tSet terminal type to <terminal>"
-msgstr "-T <๒ๅ๐์่ํเ๋>\tอเ็ํเ๗่๒ ๓๊เ็เํํ๛้ ๒่๏ <๒ๅ๐์่ํเ๋เ>"
-
-#: ../main.c:2225
-msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc"
-msgstr "-u <vimrc>\t\tศ๑๏๎๋็๎โเ๒ <vimrc> โ์ๅ๑๒๎ ๋แ๛๕ ๔เ้๋๎โ .vimrc"
-
-#: ../main.c:2226
-msgid "--noplugin\t\tDon't load plugin scripts"
-msgstr "--noplugin\t\tอๅ ็เใ๐๓ๆเ๒ ๑๖ๅํเ๐่่ ์๎ไ๓๋ๅ้"
-
-# \n\t\t.. ไ๋ ๓์ๅ๙ๅํ่ โ 80 ๑๒๎๋แ๖๎โ
-#: ../main.c:2227
-msgid "-p[N]\t\tOpen N tab pages (default: one for each file)"
-msgstr ""
-"-p[N]\t\tฮ๒๊๐๛๒ N โ๊๋เไ๎๊ (๏๎ ๓์๎๋๗เํ่: ๏๎ ๎ไํ๎้\n"
-"\t\t\t\tํเ ๊เๆไ๛้ ๔เ้๋)"
-
-# \n\t\t.. ไ๋ ๓์ๅ๙ๅํ่ โ 80 ๑๒๎๋แ๖๎โ
-#: ../main.c:2228
-msgid "-o[N]\t\tOpen N windows (default: one for each file)"
-msgstr ""
-"-o[N]\t\tฮ๒๊๐๛๒ N ๎๊๎ํ (๏๎ ๓์๎๋๗เํ่: ๏๎ ๎ไํ๎์๓\n"
-"\t\t\t\tํเ ๊เๆไ๛้ ๔เ้๋)"
-
-#: ../main.c:2229
-msgid "-O[N]\t\tLike -o but split vertically"
-msgstr "-O[N]\t\tา๎ ๆๅ, ๗๒๎ ่ -o, ํ๎ ๑ โๅ๐๒่๊เ๋ํ๛์ ๐เ็ไๅ๋ๅํ่ๅ์ ๎๊๎ํ"
-
-#: ../main.c:2230
-msgid "+\t\t\tStart at end of file"
-msgstr "+\t\t\tอเ๗เ๒ ๐ๅไเ๊๒่๐๎โเํ่ๅ โ ๊๎ํ๖ๅ ๔เ้๋เ"
-
-#: ../main.c:2231
-msgid "+<lnum>\t\tStart at line <lnum>"
-msgstr "+<lnum>\t\tอเ๗เ๒ ๐ๅไเ๊๒่๐๎โเํ่ๅ โ ๑๒๐๎๊ๅ ๑ ํ๎์ๅ๐๎์ <lnum>"
-
-#: ../main.c:2232
-msgid "--cmd <command>\tExecute <command> before loading any vimrc file"
-msgstr "--cmd <๊๎์เํไเ>\tย๛๏๎๋ํ่๒ <๊๎์เํไ๓> ๏ๅ๐ๅไ ็เใ๐๓็๊๎้ ๔เ้๋เ vimrc"
-
-#: ../main.c:2233
-msgid "-c <command>\t\tExecute <command> after loading the first file"
-msgstr "-c <๊๎์เํไเ>\t\tย๛๏๎๋ํ่๒ <๊๎์เํไ๓> ๏๎๑๋ๅ ็เใ๐๓็๊่ ๏ๅ๐โ๎ใ๎ ๔เ้๋เ"
-
-# \n\t\t.. ไ๋ ๓์ๅ๙ๅํ่ โ 80 ๑๒๎๋แ๖๎โ
-#: ../main.c:2235
-msgid "-S <session>\t\tSource file <session> after loading the first file"
-msgstr ""
-"-S <๑ๅเํ๑>\t\tฯ๐๎๗่๒เ๒ ๑๖ๅํเ๐่้ <๑ๅเํ๑เ> ๏๎๑๋ๅ ็เใ๐๓็๊่\n"
-"\t\t\t\t๏ๅ๐โ๎ใ๎ ๔เ้๋เ"
-
-# \n\t\t.. ไ๋ ๓์ๅ๙ๅํ่ โ 80 ๑๒๎๋แ๖๎โ
-#: ../main.c:2236
-msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>"
-msgstr ""
-"-s <๑๖ๅํเ๐่้>\tฯ๐๎๗่๒เ๒ ๊๎์เํไ๛ ฮแ๛๗ํ๎ใ๎ ๐ๅๆ่์เ ่็\n"
-"\t\t\t\t๔เ้๋เ <๑๖ๅํเ๐่>"
-
-#: ../main.c:2237
-msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>"
-msgstr "-w <๑๖ๅํเ๐่้>\tฤ๎แเโ๋๒ โ๑ๅ โโๅไธํํ๛ๅ ๊๎์เํไ๛ โ ๔เ้๋ <๑๖ๅํเ๐่>"
-
-#: ../main.c:2238
-msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>"
-msgstr "-W <๑๖ๅํเ๐่้>\tวเ๏่๑เ๒ โ๑ๅ โโๅไธํํ๛ๅ ๊๎์เํไ๛ โ ๔เ้๋ <๑๖ๅํเ๐่>"
-
-#: ../main.c:2240
-msgid "--startuptime <file>\tWrite startup timing messages to <file>"
-msgstr "--startuptime <๔เ้๋>\tวเ๏่๑เ๒ โ๐ๅ์ๅํํ๓ ์ๅ๒๊๓ ๎ ็เ๏๓๑๊ๅ โ <๔เ้๋>"
-
-#: ../main.c:2242
-msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
-msgstr "-i <viminfo>\t\tศ๑๏๎๋็๎โเ๒ โ์ๅ๑๒๎ .viminfo ๔เ้๋ <viminfo>"
-
-#: ../main.c:2243
-msgid "-h or --help\tPrint Help (this message) and exit"
-msgstr "-h ่๋่ --help\tย๛โๅ๑๒่ ๑๏๐เโ๊๓ (๒๎ ๑๎๎แ๙ๅํ่ๅ) ่ ็เโๅ๐๘่๒ ๐เแ๎๒๓"
-
-#: ../main.c:2244
-msgid "--version\t\tPrint version information and exit"
-msgstr "--version\t\tย๛โๅ๑๒่ ่ํ๔๎๐์เ๖่ ๎ โๅ๐๑่่ Vim ่ ็เโๅ๐๘่๒ ๐เแ๎๒๓"
-
-#: ../mark.c:676
-msgid "No marks set"
-msgstr "อๅ๒ ๓๑๒เํ๎โ๋ๅํํ๛๕ ๎๒์ๅ๒๎๊"
-
-#: ../mark.c:678
-#, c-format
-msgid "E283: No marks matching \"%s\""
-msgstr "E283: อๅ๒ ๎๒์ๅ๒๎๊, ๑๎โ๏เไเ๙่๕ ๑ \"%s\""
-
-#. Highlight title
-#: ../mark.c:687
-msgid ""
-"\n"
-"mark line col file/text"
-msgstr ""
-"\n"
-"๎๒์ๅ๒ ๑๒๐ ๊๎๋ ๔เ้๋/๒ๅ๊๑๒"
-
-#. Highlight title
-#: ../mark.c:789
-msgid ""
-"\n"
-" jump line col file/text"
-msgstr ""
-"\n"
-"๏๐๛ๆ๎๊ ๑๒๐ ๊๎๋ ๔เ้๋/๒ๅ๊๑๒"
-
-#. Highlight title
-#: ../mark.c:831
-msgid ""
-"\n"
-"change line col text"
-msgstr ""
-"\n"
-"่็์ๅํ. ๑๒๐ ๊๎๋ ๒ๅ๊๑๒"
-
-#: ../mark.c:1238
-msgid ""
-"\n"
-"# File marks:\n"
-msgstr ""
-"\n"
-"# ร๋๎แเ๋ํ๛ๅ ๎๒์ๅ๒๊่:\n"
-
-#. Write the jumplist with -'
-#: ../mark.c:1271
-msgid ""
-"\n"
-"# Jumplist (newest first):\n"
-msgstr ""
-"\n"
-"# ั๏่๑๎๊ ๏๐๛ๆ๊๎โ (๑ํเ๗เ๋เ แ๎๋ๅๅ ๑โๅๆ่ๅ):\n"
-
-#: ../mark.c:1352
-msgid ""
-"\n"
-"# History of marks within files (newest to oldest):\n"
-msgstr ""
-"\n"
-"# ศ๑๒๎๐่ ์ๅ๑๒ํ๛๕ ๎๒์ๅ๒๎๊ (๎๒ แ๎๋ๅๅ ๑โๅๆ่๕ ๊ ๑๒เ๐๛์):\n"
-
-#: ../mark.c:1431
-msgid "Missing '>'"
-msgstr "ฯ๐๎๏๓๙ๅํเ '>'"
-
-#: ../memfile.c:426
-msgid "E293: block was not locked"
-msgstr "E293: ม๋๎๊ ํๅ ็เแ๋๎๊่๐๎โเํ"
-
-#: ../memfile.c:799
-msgid "E294: Seek error in swap file read"
-msgstr "E294: ฮ๘่แ๊เ ๏๎่๑๊เ ๏๐่ ๗๒ๅํ่่ ๑โ๎๏-๔เ้๋เ"
-
-#: ../memfile.c:803
-msgid "E295: Read error in swap file"
-msgstr "E295: ฮ๘่แ๊เ ๗๒ๅํ่ ๑โ๎๏-๔เ้๋เ"
-
-#: ../memfile.c:849
-msgid "E296: Seek error in swap file write"
-msgstr "E296: ฮ๘่แ๊เ ๏๎่๑๊เ ๏๐่ ็เ๏่๑่ ๑โ๎๏-๔เ้๋เ"
-
-#: ../memfile.c:865
-msgid "E297: Write error in swap file"
-msgstr "E297: ฮ๘่แ๊เ ๏๐่ ็เ๏่๑่ ๑โ๎๏-๔เ้๋เ"
-
-#: ../memfile.c:1036
-msgid "E300: Swap file already exists (symlink attack?)"
-msgstr ""
-"E300: ัโ๎๏-๔เ้๋ ๓ๆๅ ๑๓๙ๅ๑๒โ๓ๅ๒ (เ๒เ๊เ ๑ ่๑๏๎๋็๎โเํ่ๅ์ ๑่์โ๎๋ํ๎้ ๑๑๛๋๊่?)"
-
-#: ../memline.c:318
-msgid "E298: Didn't get block nr 0?"
-msgstr "E298: อๅ ๏๎๋๓๗ๅํ แ๋๎๊ ํ๎์ๅ๐ 0?"
-
-#: ../memline.c:361
-msgid "E298: Didn't get block nr 1?"
-msgstr "E298: อๅ ๏๎๋๓๗ๅํ แ๋๎๊ ํ๎์ๅ๐ 1?"
-
-#: ../memline.c:377
-msgid "E298: Didn't get block nr 2?"
-msgstr "E298: อๅ ๏๎๋๓๗ๅํ แ๋๎๊ ํ๎์ๅ๐ 2?"
-
-#. could not (re)open the swap file, what can we do????
-#: ../memline.c:465
-msgid "E301: Oops, lost the swap file!!!"
-msgstr "E301: ฮ้, ๏๎๒ๅ๐๋๑ ๑โ๎๏-๔เ้๋!!!"
-
-#: ../memline.c:477
-msgid "E302: Could not rename swap file"
-msgstr "E302: อๅโ๎็์๎ๆํ๎ ๏ๅ๐ๅ่์ๅํ๎โเ๒ ๑โ๎๏-๔เ้๋"
-
-#: ../memline.c:554
-#, c-format
-msgid "E303: Unable to open swap file for \"%s\", recovery impossible"
-msgstr ""
-"E303: อๅ ๓ไเ๋๎๑ ๎๒๊๐๛๒ ๑โ๎๏-๔เ้๋ ไ๋ \"%s\", โ๎๑๑๒เํ๎โ๋ๅํ่ๅ ํๅโ๎็์๎ๆํ๎"
-
-#: ../memline.c:666
-msgid "E304: ml_upd_block0(): Didn't get block 0??"
-msgstr "E304: ml_upd_block0(): อๅ ๏๎๋๓๗ๅํ แ๋๎๊ 0??"
-
-#. no swap files found
-#: ../memline.c:830
-#, c-format
-msgid "E305: No swap file found for %s"
-msgstr "E305: ัโ๎๏-๔เ้๋ ไ๋ %s ํๅ ํเ้ไๅํ"
-
-#: ../memline.c:839
-msgid "Enter number of swap file to use (0 to quit): "
-msgstr ""
-"ยโๅไ่๒ๅ ํ๎์ๅ๐ ๑โ๎๏-๔เ้๋เ, ๊๎๒๎๐๛้ ๑๋ๅไ๓ๅ๒ ่๑๏๎๋็๎โเ๒ (0 ไ๋ โ๛๕๎ไเ): "
-
-#: ../memline.c:879
-#, c-format
-msgid "E306: Cannot open %s"
-msgstr "E306: อๅ ์๎ใ๓ ๎๒๊๐๛๒ %s"
-
-#: ../memline.c:897
-msgid "Unable to read block 0 from "
-msgstr "อๅโ๎็์๎ๆํ๎ ๏๐๎๗่๒เ๒ แ๋๎๊ 0 ่็ "
-
-#: ../memline.c:900
-msgid ""
-"\n"
-"Maybe no changes were made or Vim did not update the swap file."
-msgstr ""
-"\n"
-"อๅ๒ ่็์ๅํๅํ่้, ่๋่ Vim ํๅ ๑์๎ใ ๎แํ๎โ่๒ ๑โ๎๏-๔เ้๋"
-
-#: ../memline.c:909
-msgid " cannot be used with this version of Vim.\n"
-msgstr " ํๅ๋็ ่๑๏๎๋็๎โเ๒ โ ไเํํ๎้ โๅ๐๑่่ Vim.\n"
-
-#: ../memline.c:911
-msgid "Use Vim version 3.0.\n"
-msgstr "ศ๑๏๎๋็๓้๒ๅ Vim โๅ๐๑่่ 3.0.\n"
-
-#: ../memline.c:916
-#, c-format
-msgid "E307: %s does not look like a Vim swap file"
-msgstr "E307: %s ํๅ โ๋ๅ๒๑ ๑โ๎๏-๔เ้๋๎์ Vim"
-
-#: ../memline.c:922
-msgid " cannot be used on this computer.\n"
-msgstr " ํๅ๋็ ่๑๏๎๋็๎โเ๒ ํเ ๒๎์ ๊๎์๏๒ๅ๐ๅ.\n"
-
-#: ../memline.c:924
-msgid "The file was created on "
-msgstr "ิเ้๋ แ๛๋ ๑๎็ไเํ "
-
-#: ../memline.c:928
-msgid ""
-",\n"
-"or the file has been damaged."
-msgstr ""
-",\n"
-"๋่แ๎ ๔เ้๋ แ๛๋ ๏๎โ๐ๅๆไธํ."
-
-#: ../memline.c:945
-msgid " has been damaged (page size is smaller than minimum value).\n"
-msgstr " แ๛๋ ๏๎โ๐ๅๆไธํ (๐เ็์ๅ๐ ๑๒๐เํ่๖๛ ์ๅํ๘ๅ ์่ํ่์เ๋ํ๎ใ๎ ็ํเ๗ๅํ่).\n"
-
-#: ../memline.c:974
-#, c-format
-msgid "Using swap file \"%s\""
-msgstr "ศ๑๏๎๋็๓ๅ๒๑ ๑โ๎๏-๔เ้๋ \"%s\""
-
-#: ../memline.c:980
-#, c-format
-msgid "Original file \"%s\""
-msgstr "ศ๑๕๎ไํ๛้ ๔เ้๋ \"%s\""
-
-#: ../memline.c:995
-msgid "E308: Warning: Original file may have been changed"
-msgstr "E308: ฯ๐ๅไ๓๏๐ๅๆไๅํ่ๅ: ่๑๕๎ไํ๛้ ๔เ้๋ ์๎ใ แ๛๒ ่็์ๅํธํ"
-
-#: ../memline.c:1061
-#, c-format
-msgid "E309: Unable to read block 1 from %s"
-msgstr "E309: อๅโ๎็์๎ๆํ๎ ๏๐๎๗่๒เ๒ แ๋๎๊ 1 ่็ %s"
-
-#: ../memline.c:1065
-msgid "???MANY LINES MISSING"
-msgstr "???ฮาัำาัายำลา ฬอฮรฮ ัาะฮส"
-
-#: ../memline.c:1076
-msgid "???LINE COUNT WRONG"
-msgstr "???อลฯะภยศหอฮล วอภืลอศล ัืจาืศสภ ัาะฮส"
-
-#: ../memline.c:1082
-msgid "???EMPTY BLOCK"
-msgstr "???ฯำัาฮษ มหฮส"
-
-#: ../memline.c:1103
-msgid "???LINES MISSING"
-msgstr "???ฮาัำาัายำา ัาะฮสศ"
-
-#: ../memline.c:1128
-#, c-format
-msgid "E310: Block 1 ID wrong (%s not a .swp file?)"
-msgstr "E310: อๅ๏๐เโ่๋ํ๛้ แ๋๎๊ 1 ID (%s ํๅ โ๋ๅ๒๑ ๔เ้๋๎์ .swp?)"
-
-#: ../memline.c:1133
-msgid "???BLOCK MISSING"
-msgstr "???ฯะฮฯำูลอ มหฮส"
-
-#: ../memline.c:1147
-msgid "??? from here until ???END lines may be messed up"
-msgstr "???๑๒๐๎๊่ ์๎ใ๓๒ แ๛๒ ่๑๏๎๐๗ๅํ๛ ๎๒๑ไเ ไ๎ ???สฮอึภ"
-
-#: ../memline.c:1164
-msgid "??? from here until ???END lines may have been inserted/deleted"
-msgstr "???๑๒๐๎๊่ ์๎ใ๋่ แ๛๒ โ๑๒เโ๋ๅํ๛ ่๋่ ๓ไเ๋ๅํ๛ ๎๒๑ไเ ไ๎ ???สฮอึภ"
-
-#: ../memline.c:1181
-msgid "???END"
-msgstr "???สฮอลึ"
-
-#: ../memline.c:1238
-msgid "E311: Recovery Interrupted"
-msgstr "E311: ย๎๑๑๒เํ๎โ๋ๅํ่ๅ ๏๐ๅ๐โเํ๎"
-
-#: ../memline.c:1243
-msgid ""
-"E312: Errors detected while recovering; look for lines starting with ???"
-msgstr ""
-"E312: ย๎ โ๐ๅ์ โ๎๑๑๒เํ๎โ๋ๅํ่ ๎แํเ๐๓ๆๅํ๛ ๎๘่แ๊่; ๑์. ๑๒๐๎๊่, ํเ๗่ํเ๙่ๅ๑ "
-"๑ ???"
-
-#: ../memline.c:1245
-msgid "See \":help E312\" for more information."
-msgstr "ั์. \":help E312\" ไ๋ ไ๎๏๎๋ํ่๒ๅ๋ํ๎้ ่ํ๔๎๐์เ๖่่."
-
-#: ../memline.c:1249
-msgid "Recovery completed. You should check if everything is OK."
-msgstr "ย๎๑๑๒เํ๎โ๋ๅํ่ๅ ็เโๅ๐๘ๅํ๎. ฯ๐๎โๅ๐๒ๅ, โ๑ธ ๋่ โ ๏๎๐ไ๊ๅ."
-
-#: ../memline.c:1251
-msgid ""
-"\n"
-"(You might want to write out this file under another name\n"
-msgstr ""
-"\n"
-"(ฬ๎ๆๅ๒ๅ ็เ๏่๑เ๒ ๔เ้๋ ๏๎ไ ไ๐๓ใ่์ ่์ๅํๅ์ ่ ๑๐เโํ่๒ ๅใ๎ ๑ ่๑๕๎ไํ๛์\n"
-
-#: ../memline.c:1252
-msgid "and run diff with the original file to check for changes)"
-msgstr "๔เ้๋๎์ ๏๐่ ๏๎์๎๙่ ๏๐๎ใ๐เ์์๛ diff)"
-
-#: ../memline.c:1254
-msgid "Recovery completed. Buffer contents equals file contents."
-msgstr "ย๎๑๑๒เํ๎โ๋ๅํ่ๅ ็เโๅ๐๘ๅํ๎. ั๎ไๅ๐ๆ่์๎ๅ แ๓๔ๅ๐๎โ ่ ๔เ้๋๎โ ๊โ่โเ๋ๅํ๒ํ๎."
-
-#: ../memline.c:1255
-msgid ""
-"\n"
-"You may want to delete the .swp file now.\n"
-"\n"
-msgstr ""
-"\n"
-"ยๅ๐๎๒ํ๎, ๑ๅ้๗เ๑ โ๛ ็เ๕๎๒่๒ๅ ๓ไเ๋่๒ ๔เ้๋ .swp.\n"
-"\n"
-
-#. use msg() to start the scrolling properly
-#: ../memline.c:1327
-msgid "Swap files found:"
-msgstr "ฮแํเ๐๓ๆๅํ๛ ๑โ๎๏-๔เ้๋๛:"
-
-#: ../memline.c:1446
-msgid " In current directory:\n"
-msgstr " ย ๒ๅ๊๓๙ๅ์ ๊เ๒เ๋๎ใๅ:\n"
-
-#: ../memline.c:1448
-msgid " Using specified name:\n"
-msgstr " ั ๓๊เ็เํํ๛์ ่์ๅํๅ์:\n"
-
-#: ../memline.c:1450
-msgid " In directory "
-msgstr " ย ๊เ๒เ๋๎ใๅ "
-
-#: ../memline.c:1465
-msgid " -- none --\n"
-msgstr " -- ํๅ๒ --\n"
-
-#: ../memline.c:1527
-msgid " owned by: "
-msgstr " โ๋เไๅ๋ๅ๖: "
-
-#: ../memline.c:1529
-msgid " dated: "
-msgstr " ไเ๒เ: "
-
-#: ../memline.c:1532 ../memline.c:3231
-msgid " dated: "
-msgstr " ไเ๒เ: "
-
-#: ../memline.c:1548
-msgid " [from Vim version 3.0]"
-msgstr " [๎๒ Vim โๅ๐๑่่ 3.0]"
-
-#: ../memline.c:1550
-msgid " [does not look like a Vim swap file]"
-msgstr " [ํๅ โ๋ๅ๒๑ ๑โ๎๏-๔เ้๋๎์ Vim]"
-
-#: ../memline.c:1552
-msgid " file name: "
-msgstr " ่์ ๔เ้๋เ: "
-
-#: ../memline.c:1558
-msgid ""
-"\n"
-" modified: "
-msgstr ""
-"\n"
-" ่็์ๅํธํ: "
-
-#: ../memline.c:1559
-msgid "YES"
-msgstr "ฤภ"
-
-#: ../memline.c:1559
-msgid "no"
-msgstr "ํๅ๒"
-
-#: ../memline.c:1562
-msgid ""
-"\n"
-" user name: "
-msgstr ""
-"\n"
-" ๏๎๋็๎โเ๒ๅ๋: "
-
-#: ../memline.c:1568
-msgid " host name: "
-msgstr " ๊๎์๏๒ๅ๐: "
-
-#: ../memline.c:1570
-msgid ""
-"\n"
-" host name: "
-msgstr ""
-"\n"
-" ๊๎์๏๒ๅ๐: "
-
-#: ../memline.c:1575
-msgid ""
-"\n"
-" process ID: "
-msgstr ""
-"\n"
-" ๏๐๎๖ๅ๑๑: "
-
-#: ../memline.c:1579
-msgid " (still running)"
-msgstr " (ๅ๙ธ โ๛๏๎๋ํๅ๒๑)"
-
-#: ../memline.c:1586
-msgid ""
-"\n"
-" [not usable on this computer]"
-msgstr ""
-"\n"
-" [ํๅ ๏๐่ใ๎ไๅํ ไ๋ ่๑๏๎๋็๎โเํ่ ํเ ๒๎์ ๊๎์๏๒ๅ๐ๅ]"
-
-#: ../memline.c:1590
-msgid " [cannot be read]"
-msgstr " [ํๅ ๗่๒เๅ๒๑]"
-
-#: ../memline.c:1593
-msgid " [cannot be opened]"
-msgstr " [ํๅ ๎๒๊๐๛โเๅ๒๑]"
-
-#: ../memline.c:1698
-msgid "E313: Cannot preserve, there is no swap file"
-msgstr "E313: อๅโ๎็์๎ๆํ๎ ๎แํ๎โ่๒ ๑โ๎๏-๔เ้๋, ๏๎๑๊๎๋๊๓ ๎ํ ํๅ ๎แํเ๐๓ๆๅํ"
-
-#: ../memline.c:1747
-msgid "File preserved"
-msgstr "ัโ๎๏-๔เ้๋ ๎แํ๎โ๋ธํ"
-
-#: ../memline.c:1749
-msgid "E314: Preserve failed"
-msgstr "E314: อๅ๓ไเ๗ํเ ๏๎๏๛๒๊เ ๎แํ๎โ๋ๅํ่ ๑โ๎๏-๔เ้๋เ"
-
-#: ../memline.c:1819
-#, c-format
-msgid "E315: ml_get: invalid lnum: %<PRId64>"
-msgstr "E315: ml_get: ํๅ๏๐เโ่๋ํ๎ๅ ็ํเ๗ๅํ่ๅ lnum: %<PRId64>"
-
-#: ../memline.c:1851
-#, c-format
-msgid "E316: ml_get: cannot find line %<PRId64>"
-msgstr "E316: ml_get: ํๅโ๎็์๎ๆํ๎ ํเ้๒่ ๑๒๐๎๊๓ %<PRId64>"
-
-#: ../memline.c:2236
-msgid "E317: pointer block id wrong 3"
-msgstr "E317: อๅ๏๐เโ่๋ํ๎ๅ ็ํเ๗ๅํ่ๅ ๓๊เ็เ๒ๅ๋ แ๋๎๊เ 3"
-
-#: ../memline.c:2311
-msgid "stack_idx should be 0"
-msgstr "็ํเ๗ๅํ่ๅ stack_idx ไ๎๋ๆํ๎ แ๛๒ ๐เโํ๎ 0"
-
-#: ../memline.c:2369
-msgid "E318: Updated too many blocks?"
-msgstr "E318: ฮแํ๎โ๋ๅํ๎ ๑๋่๘๊๎์ ์ํ๎ใ๎ แ๋๎๊๎โ?"
-
-#: ../memline.c:2511
-msgid "E317: pointer block id wrong 4"
-msgstr "E317: อๅ๏๐เโ่๋ํ๎ๅ ็ํเ๗ๅํ่ๅ ๓๊เ็เ๒ๅ๋ แ๋๎๊เ 4"
-
-#: ../memline.c:2536
-msgid "deleted block 1?"
-msgstr "๓ไเ๋ธํ แ๋๎๊ 1?"
-
-#: ../memline.c:2707
-#, c-format
-msgid "E320: Cannot find line %<PRId64>"
-msgstr "E320: ั๒๐๎๊เ %<PRId64> ํๅ ๎แํเ๐๓ๆๅํเ"
-
-#: ../memline.c:2916
-msgid "E317: pointer block id wrong"
-msgstr "E317: อๅ๏๐เโ่๋ํ๎ๅ ็ํเ๗ๅํ่ๅ ๓๊เ็เ๒ๅ๋ แ๋๎๊เ"
-
-#: ../memline.c:2930
-msgid "pe_line_count is zero"
-msgstr "็ํเ๗ๅํ่ๅ pe_line_count ๐เโํ๎ ํ๓๋"
-
-#: ../memline.c:2955
-#, c-format
-msgid "E322: line number out of range: %<PRId64> past the end"
-msgstr "E322: อ๎์ๅ๐ ๑๒๐๎๊่ ็เ ๏๐ๅไๅ๋เ์่ ไ่เ๏เ็๎ํเ: %<PRId64>"
-
-#: ../memline.c:2959
-#, c-format
-msgid "E323: line count wrong in block %<PRId64>"
-msgstr "E323: อๅ๏๐เโ่๋ํ๎ๅ ็ํเ๗ๅํ่ๅ ๑๗ธ๒๗่๊เ ๑๒๐๎๊ โ แ๋๎๊ๅ %<PRId64>"
-
-#: ../memline.c:2999
-msgid "Stack size increases"
-msgstr "ะเ็์ๅ๐ ๑๒ๅ๊เ ๓โๅ๋่๗ๅํ"
-
-#: ../memline.c:3038
-msgid "E317: pointer block id wrong 2"
-msgstr "E317: อๅ๏๐เโ่๋ํ๎ๅ ็ํเ๗ๅํ่ๅ ๓๊เ็เ๒ๅ๋ แ๋๎๊เ 2"
-
-#: ../memline.c:3070
-#, c-format
-msgid "E773: Symlink loop for \"%s\""
-msgstr "E773: ฯๅ๒๋ ๑่์โ๎๋ํ๛๕ ๑๑๛๋๎๊ ไ๋ \"%s\""
-
-#: ../memline.c:3221
-msgid "E325: ATTENTION"
-msgstr "E325: ยอศฬภอศล"
-
-#: ../memline.c:3222
-msgid ""
-"\n"
-"Found a swap file by the name \""
-msgstr ""
-"\n"
-"ฮแํเ๐๓ๆๅํ ๑โ๎๏-๔เ้๋ ๑ ่์ๅํๅ์ \""
-
-# ั ์เ๋ๅํ๊๎้ แ๓๊โ๛, ๗๒๎แ๛ ๑๎๎๒โๅ๒๑๒โ๎โเ๋๎ ๏๎ ๑๒่๋ ๑๎๑ๅไํ่์ ๑๎๎แ๙ๅํ่์.
-#: ../memline.c:3226
-msgid "While opening file \""
-msgstr "๏๐่ ๎๒๊๐๛๒่่ ๔เ้๋เ: \""
-
-#: ../memline.c:3239
-msgid " NEWER than swap file!\n"
-msgstr " ม๎๋ๅๅ ัยลฦศษ, ๗ๅ์ ๑โ๎๏-๔เ้๋!\n"
-
-#: ../memline.c:3244
-msgid ""
-"\n"
-"(1) Another program may be editing the same file. If this is the case,\n"
-" be careful not to end up with two different instances of the same\n"
-" file when making changes."
-msgstr ""
-"\n"
-"(1) ย๎็์๎ๆํ๎, ๐ๅไเ๊๒่๐๎โเํ่ๅ ๒๎ใ๎ ๆๅ ๔เ้๋เ โ๛๏๎๋ํๅ๒๑ โ ไ๐๓ใ๎้ ๏๐๎ใ๐เ์์ๅ.\n"
-" ล๑๋่ ๒๎ ๒เ๊, ๒๎ แ๓ไ๒ๅ โํ่์เ๒ๅ๋ํ๛ ๏๐่ โํๅ๑ๅํ่่ ่็์ๅํๅํ่้, ๗๒๎แ๛\n"
-" ๓ โเ๑ ํๅ ๏๎โ่๋๎๑ ไโเ ๐เ็ํ๛๕ โเ๐่เํ๒เ ๎ไํ๎ใ๎ ่ ๒๎ใ๎ ๆๅ ๔เ้๋เ."
-
-# ั๎๎แ๙ๅํ่ๅ ๐เ็ไๅ๋ๅํ๎, " \n" ไ๎แเโ๋ๅํ๎ ๒.๊. ๑๒๐๎๊เ ํๅ ๏๎์ๅ๙เๅ๒๑.
-#: ../memline.c:3245
-msgid " Quit, or continue with caution.\n"
-msgstr ""
-" \n"
-" วเโๅ๐๘่๒ๅ ๐เแ๎๒๓ ่๋่ ๏๐๎ไ๎๋ๆเ้๒ๅ ๑ ๎๑๒๎๐๎ๆํ๎๑๒.\n"
-
-#: ../memline.c:3246
-msgid "(2) An edit session for this file crashed.\n"
-msgstr "(2) ัๅเํ๑ ๐ๅไเ๊๒่๐๎โเํ่ ๒๎ใ๎ ๔เ้๋เ ็เโๅ๐๘ธํ เโเ๐่้ํ๎.\n"
-
-#: ../memline.c:3247
-msgid " If this is the case, use \":recover\" or \"vim -r "
-msgstr " ย ๒๎์ ๑๋๓๗เๅ, ่๑๏๎๋็๓้๒ๅ ๊๎์เํไ๓ \":recover\" ่๋่ \"vim -r "
-
-#: ../memline.c:3249
-msgid ""
-"\"\n"
-" to recover the changes (see \":help recovery\").\n"
-msgstr ""
-"\"\n"
-" ไ๋ โ๎๑๑๒เํ๎โ๋ๅํ่ ่็์ๅํๅํ่้ (๑์. \":help recovery\").\n"
-
-#: ../memline.c:3250
-msgid " If you did this already, delete the swap file \""
-msgstr " ล๑๋่ โ๛ ๓ๆๅ โ๛๏๎๋ํ๋่ ๒๓ ๎๏ๅ๐เ๖่, ๓ไเ๋่๒ๅ ๑โ๎๏-๔เ้๋ \""
-
-#: ../memline.c:3252
-msgid ""
-"\"\n"
-" to avoid this message.\n"
-msgstr ""
-"\"\n"
-" ๗๒๎แ๛ ่็แๅๆเ๒ ๏๎โ๋ๅํ่ ๒๎ใ๎ ๑๎๎แ๙ๅํ่ โ แ๓ไ๓๙ๅ์.\n"
-
-#: ../memline.c:3450 ../memline.c:3452
-msgid "Swap file \""
-msgstr "ัโ๎๏-๔เ้๋ \""
-
-#: ../memline.c:3451 ../memline.c:3455
-msgid "\" already exists!"
-msgstr "\" ๓ๆๅ ๑๓๙ๅ๑๒โ๓ๅ๒!"
-
-#: ../memline.c:3457
-msgid "VIM - ATTENTION"
-msgstr "VIM — ยอศฬภอศล"
-
-#: ../memline.c:3459
-msgid "Swap file already exists!"
-msgstr "ัโ๎๏-๔เ้๋ ๓ๆๅ ๑๓๙ๅ๑๒โ๓ๅ๒!"
-
-#: ../memline.c:3464
-msgid ""
-"&Open Read-Only\n"
-"&Edit anyway\n"
-"&Recover\n"
-"&Quit\n"
-"&Abort"
-msgstr ""
-"&O ฮ๒๊๐๛๒ ไ๋ ๗๒ๅํ่\n"
-"&E ะๅไเ๊๒่๐๎โเ๒\n"
-"&R ย๎๑๑๒เํ๎โ่๒\n"
-"&Q ย๛๕๎ไ\n"
-"&A ฯ๐ๅ๐โเ๒"
-
-#: ../memline.c:3467
-msgid ""
-"&Open Read-Only\n"
-"&Edit anyway\n"
-"&Recover\n"
-"&Delete it\n"
-"&Quit\n"
-"&Abort"
-msgstr ""
-"&O ฮ๒๊๐๛๒ ไ๋ ๗๒ๅํ่\n"
-"&E ะๅไเ๊๒่๐๎โเ๒\n"
-"&R ย๎๑๑๒เํ๎โ่๒\n"
-"&D ำไเ๋่๒\n"
-"&Q ย๛๕๎ไ\n"
-"&A ฯ๐ๅ๐โเ๒"
-
-#.
-#. * Change the ".swp" extension to find another file that can be used.
-#. * First decrement the last char: ".swo", ".swn", etc.
-#. * If that still isn't enough decrement the last but one char: ".svz"
-#. * Can happen when editing many "No Name" buffers.
-#.
-#. ".s?a"
-#. ".saa": tried enough, give up
-#: ../memline.c:3528
-msgid "E326: Too many swap files found"
-msgstr "E326: ฮแํเ๐๓ๆๅํ๎ ๑๋่๘๊๎์ ์ํ๎ใ๎ ๑โ๎๏-๔เ้๋๎โ"
-
-#: ../memory.c:227
-#, c-format
-msgid "E342: Out of memory! (allocating %<PRIu64> bytes)"
-msgstr "E342: อๅ ๕โเ๒เๅ๒ ๏เ์๒่! (โ๛ไๅ๋ๅ๒๑ %<PRIu64> แเ้๒)"
-
-#: ../menu.c:62
-msgid "E327: Part of menu-item path is not sub-menu"
-msgstr "E327: ส๎์๏๎ํๅํ๒ ๏๓๒่ ๊ ๋ๅ์ๅํ๒๓ ์ๅํ ํๅ โ๋ๅ๒๑ ๏๎ไ์ๅํ"
-
-#: ../menu.c:63
-msgid "E328: Menu only exists in another mode"
-msgstr "E328: ฬๅํ โ ๒๎์ ๐ๅๆ่์ๅ ํๅ ๑๓๙ๅ๑๒โ๓ๅ๒"
-
-#: ../menu.c:64
-#, c-format
-msgid "E329: No menu \"%s\""
-msgstr "E329: อๅ๒ ์ๅํ %s"
-
-#. Only a mnemonic or accelerator is not valid.
-#: ../menu.c:329
-msgid "E792: Empty menu name"
-msgstr "E792: ฯ๓๑๒๎ๅ ่์ ์ๅํ"
-
-#: ../menu.c:340
-msgid "E330: Menu path must not lead to a sub-menu"
-msgstr "E330: ฯ๓๒ ๊ ์ๅํ ํๅ ไ๎๋ๆๅํ โๅ๑๒่ ๊ ๏๎ไ์ๅํ"
-
-#: ../menu.c:365
-msgid "E331: Must not add menu items directly to menu bar"
-msgstr "E331: ๋ๅ์ๅํ๒๛ ์ๅํ ํๅ๋็ ไ๎แเโ๋๒ ํๅ๏๎๑๐ๅไ๑๒โๅํํ๎ โ ๏๎๋๎๑๊๓ ์ๅํ"
-
-#: ../menu.c:370
-msgid "E332: Separator cannot be part of a menu path"
-msgstr "E332: ะเ็ไๅ๋่๒ๅ๋่ ํๅ ์๎ใ๓๒ แ๛๒ ๊๎์๏๎ํๅํ๒๎์ ๏๓๒่ ๊ ์ๅํ"
-
-#. Now we have found the matching menu, and we list the mappings
-#. Highlight title
-#: ../menu.c:762
-msgid ""
-"\n"
-"--- Menus ---"
-msgstr ""
-"\n"
-"--- ฬๅํ ---"
-
-#: ../menu.c:1313
-msgid "E333: Menu path must lead to a menu item"
-msgstr "E333: ฯ๓๒ ๊ ์ๅํ ไ๎๋ๆๅํ โๅ๑๒่ ๊ ๋ๅ์ๅํ๒๓ ์ๅํ"
-
-#: ../menu.c:1330
-#, c-format
-msgid "E334: Menu not found: %s"
-msgstr "E334: ฬๅํ ํๅ ํเ้ไๅํ๎: %s"
-
-#: ../menu.c:1396
-#, c-format
-msgid "E335: Menu not defined for %s mode"
-msgstr "E335: ฬๅํ ํๅ ๎๏๐ๅไๅ๋ๅํ๎ ไ๋ ๐ๅๆ่์เ %s"
-
-#: ../menu.c:1426
-msgid "E336: Menu path must lead to a sub-menu"
-msgstr "E336: ฯ๓๒ ๊ ์ๅํ ไ๎๋ๆๅํ โๅ๑๒่ ๊ ๏๎ไ์ๅํ"
-
-#: ../menu.c:1447
-msgid "E337: Menu not found - check menu names"
-msgstr "E337: ฬๅํ ํๅ ํเ้ไๅํ๎ — ๏๐๎โๅ๐๒ๅ ่์ๅํเ ์ๅํ"
-
-#: ../message.c:423
-#, c-format
-msgid "Error detected while processing %s:"
-msgstr "ฮแํเ๐๓ๆๅํเ ๎๘่แ๊เ ๏๐่ ๎แ๐เแ๎๒๊ๅ %s:"
-
-#: ../message.c:445
-#, c-format
-msgid "line %4ld:"
-msgstr "๑๒๐๎๊เ %4ld:"
-
-#: ../message.c:617
-#, c-format
-msgid "E354: Invalid register name: '%s'"
-msgstr "E354: อๅไ๎๏๓๑๒่์๎ๅ ่์ ๐ๅใ่๑๒๐เ: '%s'"
-
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr ""
-"ฯๅ๐ๅโ๎ไ ๑๎๎แ๙ๅํ่้ ํเ ๐๓๑๑๊่้ ็๛๊: ยเ๑่๋่้ ะเใ๎็่ํ <vrr@users.sourceforge."
-"net>, ัๅ๐ใๅ้ ภ๋ธ๘่ํ <alyoshin.s@gmail.com>"
-
-#: ../message.c:986
-msgid "Interrupt: "
-msgstr "ฯ๐ๅ๐๛โเํ่ๅ: "
-
-#: ../message.c:988
-msgid "Press ENTER or type command to continue"
-msgstr "อเๆ์่๒ๅ ENTER ่๋่ โโๅไ่๒ๅ ๊๎์เํไ๓ ไ๋ ๏๐๎ไ๎๋ๆๅํ่"
-
-#: ../message.c:1843
-#, c-format
-msgid "%s line %<PRId64>"
-msgstr "%s ๑๒๐๎๊เ %<PRId64>"
-
-#: ../message.c:2392
-msgid "-- More --"
-msgstr "-- ฯ๐๎ไ๎๋ๆๅํ่ๅ ๑๋ๅไ๓ๅ๒ --"
-
-#: ../message.c:2398
-msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "
-msgstr " SPACE/d/j: ๊๐เํ/๑๒๐เํ่๖เ/๑๒๐๎๊เ โํ่็, b/u/k: โโๅ๐๕, q: โ๛๕๎ไ "
-
-#: ../message.c:3021 ../message.c:3031
-msgid "Question"
-msgstr "ย๎๏๐๎๑"
-
-#: ../message.c:3023
-msgid ""
-"&Yes\n"
-"&No"
-msgstr ""
-"&Y ฤเ\n"
-"&N อๅ๒"
-
-#: ../message.c:3033
-msgid ""
-"&Yes\n"
-"&No\n"
-"&Cancel"
-msgstr ""
-"&ฤเ\n"
-"&อๅ๒\n"
-"ฮ&๒์ๅํเ"
-
-#: ../message.c:3045
-msgid ""
-"&Yes\n"
-"&No\n"
-"Save &All\n"
-"&Discard All\n"
-"&Cancel"
-msgstr ""
-"&Y ฤเ\n"
-"&N อๅ๒\n"
-"&A ั๎๕๐เํ่๒ โ๑ๅ\n"
-"&D ฯ๎๒ๅ๐๒ โ๑ๅ\n"
-"&C ฮ๒์ๅํเ"
-
-#: ../message.c:3058
-msgid "E766: Insufficient arguments for printf()"
-msgstr "E766: อๅไ๎๑๒เ๒๎๗ํ๎ ๏เ๐เ์ๅ๒๐๎โ ไ๋ printf()"
-
-#: ../message.c:3119
-msgid "E807: Expected Float argument for printf()"
-msgstr "E807: ฮๆ่ไเ๋๑ ๏เ๐เ์ๅ๒๐ ๒่๏เ ๑ ๏๋เโเ๙ๅ้ ๒๎๗๊๎้ ไ๋ printf()"
-
-#: ../message.c:3873
-msgid "E767: Too many arguments to printf()"
-msgstr "E767: ั๋่๘๊๎์ ์ํ๎ใ๎ ๏เ๐เ์ๅ๒๐๎โ ไ๋ printf()"
-
-#: ../misc1.c:2256
-msgid "W10: Warning: Changing a readonly file"
-msgstr "W10: ฯ๐ๅไ๓๏๐ๅๆไๅํ่ๅ: ศ็์ๅํๅํ่ๅ ๔เ้๋เ ๑ ๏๐เโเ์่ ๒๎๋๊๎ ไ๋ ๗๒ๅํ่"
-
-#: ../misc1.c:2537
-msgid "Type number and <Enter> or click with mouse (empty cancels): "
-msgstr "ยโๅไ่๒ๅ ํ๎์ๅ๐ ่ <Enter> ่๋่ ๙ธ๋๊ํ่๒ๅ ์๛๘ (๏๓๑๒๎ ไ๋ ๎๒์ๅํ๛): "
-
-#: ../misc1.c:2539
-msgid "Type number and <Enter> (empty cancels): "
-msgstr "ยโๅไ่๒ๅ ํ๎์ๅ๐ ่ <Enter> (๏๓๑๒๎ ไ๋ ๎๒์ๅํ๛): "
-
-#: ../misc1.c:2585
-msgid "1 more line"
-msgstr "ฤ๎แเโ๋ๅํเ ๎ไํเ ๑๒๐๎๊เ"
-
-#: ../misc1.c:2588
-msgid "1 line less"
-msgstr "ำแ๐เํเ ๎ไํเ ๑๒๐๎๊เ"
-
-#: ../misc1.c:2593
-#, c-format
-msgid "%<PRId64> more lines"
-msgstr "ฤ๎แเโ๋ๅํ๎ ๑๒๐๎๊: %<PRId64>"
-
-#: ../misc1.c:2596
-#, c-format
-msgid "%<PRId64> fewer lines"
-msgstr "ำแ๐เํ๎ ๑๒๐๎๊: %<PRId64>"
-
-#: ../misc1.c:2599
-msgid " (Interrupted)"
-msgstr " (ฯ๐ๅ๐โเํ๎)"
-
-#: ../misc1.c:2635
-msgid "Beep!"
-msgstr "ม่-แ่!"
-
-#: ../misc2.c:738
-#, c-format
-msgid "Calling shell to execute: \"%s\""
-msgstr "ย๛็๎โ ๎แ๎๋๎๗๊่ ไ๋ ่๑๏๎๋ํๅํ่: \"%s\""
-
-#: ../normal.c:183
-msgid "E349: No identifier under cursor"
-msgstr "E349: อๅ๒ ่์ๅํ่ โ ๏๎็่๖่่ ๊๓๐๑๎๐เ"
-
-#: ../normal.c:1866
-msgid "E774: 'operatorfunc' is empty"
-msgstr "E774: วํเ๗ๅํ่ๅ์ ๎๏๖่่ 'operatorfunc' โ๋ๅ๒๑ ๏๓๑๒เ ๑๒๐๎๊เ"
-
-#: ../normal.c:2637
-msgid "Warning: terminal cannot highlight"
-msgstr "ฯ๐ๅไ๓๏๐ๅๆไๅํ่ๅ: ๒ๅ๐์่ํเ๋ ํๅ ์๎ๆๅ๒ โ๛๏๎๋ํ๒ ๏๎ไ๑โๅ๒๊๓"
-
-#: ../normal.c:2807
-msgid "E348: No string under cursor"
-msgstr "E348: อๅ๒ ๑๒๐๎๊่ โ ๏๎็่๖่่ ๊๓๐๑๎๐เ"
-
-#: ../normal.c:3937
-msgid "E352: Cannot erase folds with current 'foldmethod'"
-msgstr ""
-"E352: อๅโ๎็์๎ๆํ๎ ๑๒ๅ๐ๅ๒ ๑๊๋เไ๊่ ๑ ๒ๅ๊๓๙่์ ็ํเ๗ๅํ่ๅ์ ๎๏๖่่ 'foldmethod'"
-
-#: ../normal.c:5897
-msgid "E664: changelist is empty"
-msgstr "E664: ั๏่๑๎๊ ่็์ๅํๅํ่้ ๏๓๑๒๎้"
-
-#: ../normal.c:5899
-msgid "E662: At start of changelist"
-msgstr "E662: ย ํเ๗เ๋ๅ ๑๏่๑๊เ ่็์ๅํๅํ่้"
-
-#: ../normal.c:5901
-msgid "E663: At end of changelist"
-msgstr "E663: ย ๊๎ํ๖ๅ ๑๏่๑๊เ ่็์ๅํๅํ่้"
-
-#: ../normal.c:7053
-msgid "Type :quit<Enter> to exit Nvim"
-msgstr "ยโๅไ่๒ๅ :quit<Enter> ไ๋ โ๛๕๎ไเ ่็ Vim"
-
-#: ../ops.c:248
-#, c-format
-msgid "1 line %sed 1 time"
-msgstr "ศ็์ๅํๅํ๛ ๎๒๑๒๓๏๛ โ 1 ๑๒๐๎๊ๅ (%s 1 ๐เ็)"
-
-#: ../ops.c:250
-#, c-format
-msgid "1 line %sed %d times"
-msgstr "ศ็์ๅํๅํ๛ ๎๒๑๒๓๏๛ โ 1 ๑๒๐๎๊ๅ (%s %d ๐เ็)"
-
-#: ../ops.c:253
-#, c-format
-msgid "%<PRId64> lines %sed 1 time"
-msgstr "ศ็์ๅํๅํ๛ ๎๒๑๒๓๏๛, %<PRId64> ๑๒๐๎๊ (%s 1 ๐เ็)"
-
-#: ../ops.c:256
-#, c-format
-msgid "%<PRId64> lines %sed %d times"
-msgstr "ศ็์ๅํๅํ๛ ๎๒๑๒๓๏๛, %<PRId64> ๑๒๐๎๊ (%s %d ๐เ็)"
-
-#: ../ops.c:592
-#, c-format
-msgid "%<PRId64> lines to indent... "
-msgstr "ศ็์ๅํ๒๑ ๎๒๑๒๓๏๛ ๑๒๐๎๊เ๕ (%<PRId64>)..."
-
-#: ../ops.c:634
-msgid "1 line indented "
-msgstr "ศ็์ๅํธํ ๎๒๑๒๓๏ โ ๎ไํ๎้ ๑๒๐๎๊ๅ "
-
-#: ../ops.c:636
-#, c-format
-msgid "%<PRId64> lines indented "
-msgstr "ศ็์ๅํๅํ๛ ๎๒๑๒๓๏๛ โ ๑๒๐๎๊เ๕ (%<PRId64>) "
-
-#: ../ops.c:938
-msgid "E748: No previously used register"
-msgstr "E748: อๅ๒ ๏๐ๅไ๛ไ๓๙ๅใ๎ ่๑๏๎๋็๎โเํํ๎ใ๎ ๐ๅใ่๑๒๐เ"
-
-#. must display the prompt
-#: ../ops.c:1433
-msgid "cannot yank; delete anyway"
-msgstr "๑๊๎๏่๐๎โเ๒ ํๅ ๓ไเ๋๎๑, ๓ไเ๋ๅํ่ๅ โ๛๏๎๋ํๅํ๎"
-
-#: ../ops.c:1929
-msgid "1 line changed"
-msgstr "่็์ๅํๅํเ 1 ๑๒๐๎๊เ"
-
-#: ../ops.c:1931
-#, c-format
-msgid "%<PRId64> lines changed"
-msgstr "่็์ๅํๅํ๎ ๑๒๐๎๊: %<PRId64>"
-
-#: ../ops.c:2521
-msgid "block of 1 line yanked"
-msgstr "๑๊๎๏่๐๎โเํ แ๋๎๊ ่็ ๎ไํ๎้ ๑๒๐๎๊่"
-
-#: ../ops.c:2523
-msgid "1 line yanked"
-msgstr "๑๊๎๏่๐๎โเํเ ๎ไํเ ๑๒๐๎๊เ"
-
-#: ../ops.c:2525
-#, c-format
-msgid "block of %<PRId64> lines yanked"
-msgstr "๑๊๎๏่๐๎โเํ แ๋๎๊ ่็ ๑๒๐๎๊: %<PRId64>"
-
-#: ../ops.c:2528
-#, c-format
-msgid "%<PRId64> lines yanked"
-msgstr "๑๊๎๏่๐๎โเํ๎ ๑๒๐๎๊: %<PRId64>"
-
-#: ../ops.c:2710
-#, c-format
-msgid "E353: Nothing in register %s"
-msgstr "E353: ย ๐ๅใ่๑๒๐ๅ %s ํ่๗ๅใ๎ ํๅ๒"
-
-#. Highlight title
-#: ../ops.c:3185
-msgid ""
-"\n"
-"--- Registers ---"
-msgstr ""
-"\n"
-"--- ะๅใ่๑๒๐๛ ---"
-
-#: ../ops.c:4455
-msgid "Illegal register name"
-msgstr "อๅไ๎๏๓๑๒่์๎ๅ ่์ ๐ๅใ่๑๒๐เ"
-
-#: ../ops.c:4533
-msgid ""
-"\n"
-"# Registers:\n"
-msgstr ""
-"\n"
-"# ะๅใ่๑๒๐๛:\n"
-
-#: ../ops.c:4575
-#, c-format
-msgid "E574: Unknown register type %d"
-msgstr "E574: อๅ่็โๅ๑๒ํ๛้ ๒่๏ ๐ๅใ่๑๒๐เ %d"
-
-msgid ""
-"E883: search pattern and expression register may not contain two or more "
-"lines"
-msgstr ""
-"E883: ๘เแ๋๎ํ ๏๎่๑๊เ ่ ๐ๅใ่๑๒๐ โ๛๐เๆๅํ่ ํๅ ์๎ใ๓๒ ๑๎ไๅ๐ๆเ๒ ไโ๓๕ ่๋่ แ๎๋ๅๅ "
-"๑๒๐๎๊"
-
-#: ../ops.c:5089
-#, c-format
-msgid "%<PRId64> Cols; "
-msgstr "ส๎๋๎ํ๎๊: %<PRId64>; "
-
-#: ../ops.c:5097
-#, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Bytes"
-msgstr ""
-"ย๛ไๅ๋ๅํ๎ %s%<PRId64> ่็ %<PRId64> ๑๒๐๎๊; %<PRId64> ่็ %<PRId64> ๑๋๎โ; "
-"%<PRId64> ่็ %<PRId64> แเ้๒"
-
-#: ../ops.c:5105
-#, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Chars; %<PRId64> of %<PRId64> Bytes"
-msgstr ""
-"ย๛ไๅ๋ๅํ๎ %s%<PRId64> ่็ %<PRId64> ๑๒๐.; %<PRId64> ่็ %<PRId64> ๑๋๎โ; "
-"%<PRId64> ่็ %<PRId64> ๑่์โ.; %<PRId64> ่็ %<PRId64> แเ้๒"
-
-#: ../ops.c:5123
-#, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Byte "
-"%<PRId64> of %<PRId64>"
-msgstr ""
-"ส๎๋. %s ่็ %s; ๑๒๐. %<PRId64> ่็ %<PRId64>; ๑๋. %<PRId64> ่็ %<PRId64>; แเ้๒ "
-"%<PRId64> ่็ %<PRId64>"
-
-#: ../ops.c:5133
-#, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Char "
-"%<PRId64> of %<PRId64>; Byte %<PRId64> of %<PRId64>"
-msgstr ""
-"ส๎๋. %s ่็ %s; ๑๒๐. %<PRId64> ่็ %<PRId64>; ๑๋. %<PRId64> ่็ %<PRId64>; "
-"๑่์โ. %<PRId64> ่็ %<PRId64>; แเ้๒ %<PRId64> ่็ %<PRId64>"
-
-#: ../ops.c:5146
-#, c-format
-msgid "(+%<PRId64> for BOM)"
-msgstr "(+%<PRId64> ๑ ๓๗ธ๒๎์ BOM)"
-
-#: ../option.c:1238
-msgid "%<%f%h%m%=Page %N"
-msgstr "%<%f%h%m%=ั๒๐. %N"
-
-#: ../option.c:1574
-msgid "Thanks for flying Vim"
-msgstr "ม๋เใ๎ไเ๐่์ ็เ ่๑๏๎๋็๎โเํ่ๅ Vim"
-
-#. found a mismatch: skip
-#: ../option.c:2698
-msgid "E518: Unknown option"
-msgstr "E518: อๅ่็โๅ๑๒ํเ ๎๏๖่"
-
-#: ../option.c:2709
-msgid "E519: Option not supported"
-msgstr "E519: ฮ๏๖่ ํๅ ๏๎ไไๅ๐ๆ่โเๅ๒๑"
-
-#: ../option.c:2740
-msgid "E520: Not allowed in a modeline"
-msgstr "E520: อๅ ไ๎๏๓๑๊เๅ๒๑ โ ๐ๅๆ่์ํ๎้ ๑๒๐๎๊ๅ"
-
-#: ../option.c:2815
-msgid "E846: Key code not set"
-msgstr "E846: ส๎ไ ๊๋เโ่๘่ ํๅ ๓๑๒เํ๎โ๋ๅํ"
-
-#: ../option.c:2924
-msgid "E521: Number required after ="
-msgstr "E521: ฯ๎๑๋ๅ = ๒๐ๅแ๓ๅ๒๑ ๓๊เ็เ๒ ๗่๑๋๎"
-
-#: ../option.c:3226 ../option.c:3864
-msgid "E522: Not found in termcap"
-msgstr "E522: อๅ ๎แํเ๐๓ๆๅํ๎ โ termcap"
-
-#: ../option.c:3335
-#, c-format
-msgid "E539: Illegal character <%s>"
-msgstr "E539: อๅไ๎๏๓๑๒่์๛้ ๑่์โ๎๋ <%s>"
-
-#: ../option.c:3862
-msgid "E529: Cannot set 'term' to empty string"
-msgstr "E529: วํเ๗ๅํ่ๅ ๎๏๖่่ 'term' ํๅ ์๎ๆๅ๒ แ๛๒ ๏๓๑๒๎้ ๑๒๐๎๊๎้"
-
-#: ../option.c:3885
-msgid "E589: 'backupext' and 'patchmode' are equal"
-msgstr "E589: วํเ๗ๅํ่ ๎๏๖่้ 'backupext' ่ 'patchmode' ๐เโํ๛"
-
-#: ../option.c:3964
-msgid "E834: Conflicts with value of 'listchars'"
-msgstr "E834: ส๎ํ๔๋่๊๒๓ๅ๒ ๑๎ ็ํเ๗ๅํ่ๅ์ 'listchars'"
-
-#: ../option.c:3966
-msgid "E835: Conflicts with value of 'fillchars'"
-msgstr "E835: ส๎ํ๔๋่๊๒๓ๅ๒ ๑๎ ็ํเ๗ๅํ่ๅ์ 'fillchars'"
-
-#: ../option.c:4163
-msgid "E524: Missing colon"
-msgstr "E524: ฯ๐๎๏๓๙ๅํ๎ ไโ๎ๅ๒๎๗่ๅ"
-
-#: ../option.c:4165
-msgid "E525: Zero length string"
-msgstr "E525: ั๒๐๎๊เ ๑ ํ๓๋ๅโ๎้ ไ๋่ํ๎้"
-
-#: ../option.c:4220
-#, c-format
-msgid "E526: Missing number after <%s>"
-msgstr "E526: ฯ๐๎๏๓๙ๅํ๎ ๗่๑๋๎ ๏๎๑๋ๅ <%s>"
-
-#: ../option.c:4232
-msgid "E527: Missing comma"
-msgstr "E527: ฯ๐๎๏๓๙ๅํเ ็เ๏๒เ"
-
-#: ../option.c:4239
-msgid "E528: Must specify a ' value"
-msgstr "E528: อๅ๎แ๕๎ไ่์๎ ๓๊เ็เ๒ ็ํเ๗ๅํ่ๅ ไ๋ '"
-
-#: ../option.c:4271
-msgid "E595: contains unprintable or wide character"
-msgstr "E595: ั๎ไๅ๐ๆ่๒ ํๅ๏ๅ๗เ๒ํ๛้ ๑่์โ๎๋ ่๋่ ๑่์โ๎๋ ไโ๎้ํ๎้ ๘่๐่ํ๛"
-
-#: ../option.c:4469
-#, c-format
-msgid "E535: Illegal character after <%c>"
-msgstr "E535: อๅ๏๐เโ่๋ํ๛้ ๑่์โ๎๋ ๏๎๑๋ๅ <%c>"
-
-#: ../option.c:4534
-msgid "E536: comma required"
-msgstr "E536: า๐ๅแ๓ๅ๒๑ ็เ๏๒เ"
-
-#: ../option.c:4543
-#, c-format
-msgid "E537: 'commentstring' must be empty or contain %s"
-msgstr ""
-"E537: วํเ๗ๅํ่ๅ ๎๏๖่ 'commentstring' ไ๎๋ๆํ๎ แ๛๒ ๏๓๑๒๎้ ๑๒๐๎๊๎้ ่๋่ "
-"๑๎ไๅ๐ๆเ๒ %s"
-
-#: ../option.c:4928
-msgid "E540: Unclosed expression sequence"
-msgstr "E540: อๅ็เ๊๐๛๒เ ๏๎๑๋ๅไ๎โเ๒ๅ๋ํ๎๑๒ โ๛๐เๆๅํ่"
-
-#: ../option.c:4932
-msgid "E541: too many items"
-msgstr "E541: ั๋่๘๊๎์ ์ํ๎ใ๎ ๋ๅ์ๅํ๒๎โ"
-
-#: ../option.c:4934
-msgid "E542: unbalanced groups"
-msgstr "E542: อๅ๑แเ๋เํ๑่๐๎โเํํ๛ๅ ใ๐๓๏๏๛"
-
-#: ../option.c:5148
-msgid "E590: A preview window already exists"
-msgstr "E590: ฮ๊ํ๎ ๏๐ๅไ๏๐๎๑์๎๒๐เ ๓ๆๅ ๅ๑๒"
-
-#: ../option.c:5311
-msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'"
-msgstr ""
-"W17: ภ๐เแ๑๊่้ ๒๐ๅแ๓ๅ๒ ่๑๏๎๋็๎โเํ่ UTF-8, โโๅไ่๒ๅ ':set encoding=utf-8'"
-
-#: ../option.c:5623
-#, c-format
-msgid "E593: Need at least %d lines"
-msgstr "E593: อ๓ๆํ๎ ๕๎๒ แ๛ %d ๑๒๐๎๊"
-
-#: ../option.c:5631
-#, c-format
-msgid "E594: Need at least %d columns"
-msgstr "E594: อ๓ๆํ๎ ๕๎๒ แ๛ %d ๊๎๋๎ํ๎๊"
-
-#: ../option.c:6011
-#, c-format
-msgid "E355: Unknown option: %s"
-msgstr "E355: อๅ่็โๅ๑๒ํเ ๎๏๖่: %s"
-
-#. There's another character after zeros or the string
-#. * is empty. In both cases, we are trying to set a
-#. * num option using a string.
-#: ../option.c:6037
-#, c-format
-msgid "E521: Number required: &%s = '%s'"
-msgstr "E521: า๐ๅแ๓ๅ๒๑ ๓๊เ็เ๒ ๗่๑๋๎: &%s = '%s'"
-
-#: ../option.c:6149
-msgid ""
-"\n"
-"--- Terminal codes ---"
-msgstr ""
-"\n"
-"--- าๅ๐์่ํเ๋ํ๛ๅ ๊๎ไ๛ ---"
-
-#: ../option.c:6151
-msgid ""
-"\n"
-"--- Global option values ---"
-msgstr ""
-"\n"
-"--- ร๋๎แเ๋ํ๛ๅ ็ํเ๗ๅํ่ ๎๏๖่้ ---"
-
-#: ../option.c:6153
-msgid ""
-"\n"
-"--- Local option values ---"
-msgstr ""
-"\n"
-"--- ฬๅ๑๒ํ๛ๅ ็ํเ๗ๅํ่ ๎๏๖่้ ---"
-
-#: ../option.c:6155
-msgid ""
-"\n"
-"--- Options ---"
-msgstr ""
-"\n"
-"--- ฮ๏๖่่ ---"
-
-#: ../option.c:6816
-msgid "E356: get_varp ERROR"
-msgstr "E356: ฮุศมสภ get_varp"
-
-#: ../option.c:7696
-#, c-format
-msgid "E357: 'langmap': Matching character missing for %s"
-msgstr "E357: 'langmap': อๅ๒ ๑๎๎๒โๅ๒๑๒โ๓๙ๅใ๎ ๑่์โ๎๋เ ไ๋ %s"
-
-#: ../option.c:7715
-#, c-format
-msgid "E358: 'langmap': Extra characters after semicolon: %s"
-msgstr "E358: 'langmap': ห่๘ํ่ๅ ๑่์โ๎๋๛ ๏๎๑๋ๅ ๒๎๗๊่ ๑ ็เ๏๒๎้: %s"
-
-#: ../os/shell.c:194
-msgid ""
-"\n"
-"Cannot execute shell "
-msgstr ""
-"\n"
-"อๅโ๎็์๎ๆํ๎ ็เ๏๓๑๒่๒ ๎แ๎๋๎๗๊๓ "
-
-#: ../os/shell.c:439
-msgid ""
-"\n"
-"shell returned "
-msgstr ""
-"\n"
-"ฮแ๎๋๎๗๊เ ็เโๅ๐๘่๋เ ๐เแ๎๒๓ "
-
-#: ../os_unix.c:465 ../os_unix.c:471
-msgid ""
-"\n"
-"Could not get security context for "
-msgstr ""
-"\n"
-"อๅโ๎็์๎ๆํ๎ ๏๎๋๓๗่๒ ๊๎ํ๒ๅ๊๑๒ แๅ็๎๏เ๑ํ๎๑๒่ ไ๋ "
-
-#: ../os_unix.c:479
-msgid ""
-"\n"
-"Could not set security context for "
-msgstr ""
-"\n"
-"อๅโ๎็์๎ๆํ๎ ๓๑๒เํ๎โ่๒ ๊๎ํ๒ๅ๊๑๒ แๅ็๎๏เ๑ํ๎๑๒่ ไ๋ "
-
-msgid "Could not set security context "
-msgstr "อๅโ๎็์๎ๆํ๎ ๓๑๒เํ๎โ่๒ ๊๎ํ๒ๅ๊๑๒ แๅ็๎๏เ๑ํ๎๑๒่ "
-
-msgid " for "
-msgstr " ไ๋ "
-
-#. no enough size OR unexpected error
-msgid "Could not get security context "
-msgstr "อๅโ๎็์๎ๆํ๎ ๏๎๋๓๗่๒ ๊๎ํ๒ๅ๊๑๒ แๅ็๎๏เ๑ํ๎๑๒่ "
-
-msgid ". Removing it!\n"
-msgstr ". ม๓ไๅ๒ ๓ไเ๋ธํ!\n"
-
-#: ../os_unix.c:1558 ../os_unix.c:1647
-#, c-format
-msgid "dlerror = \"%s\""
-msgstr "dlerror = \"%s\""
-
-#: ../path.c:1449
-#, c-format
-msgid "E447: Can't find file \"%s\" in path"
-msgstr "E447: ิเ้๋ \"%s\" ํๅ ํเ้ไๅํ ๏๎ ่็โๅ๑๒ํ๛์ ๏๓๒์"
-
-#: ../quickfix.c:359
-#, c-format
-msgid "E372: Too many %%%c in format string"
-msgstr "E372: ย ๑๒๐๎๊ๅ ๔๎๐์เ๒เ ๑๋่๘๊๎์ ์ํ๎ใ๎ %%%c"
-
-#: ../quickfix.c:371
-#, c-format
-msgid "E373: Unexpected %%%c in format string"
-msgstr "E373: อๅ๎ๆ่ไเํํ๛้ ๋ๅ์ๅํ๒ %%%c โ ๑๒๐๎๊ๅ ๔๎๐์เ๒เ"
-
-#: ../quickfix.c:420
-msgid "E374: Missing ] in format string"
-msgstr "E374: ย ๑๒๐๎๊ๅ ๔๎๐์เ๒เ ๏๐๎๏๓๙ๅํเ ]"
-
-#: ../quickfix.c:431
-#, c-format
-msgid "E375: Unsupported %%%c in format string"
-msgstr "E375: %%%c ํๅ ๏๎ไไๅ๐ๆ่โเๅ๒๑ โ ๑๒๐๎๊ๅ ๔๎๐์เ๒เ"
-
-#: ../quickfix.c:448
-#, c-format
-msgid "E376: Invalid %%%c in format string prefix"
-msgstr "E376: อๅไ๎๏๓๑๒่์๛้ %%%c โ ๏๐่๑๒เโ๊ๅ โ ๑๒๐๎๊ๅ ๔๎๐์เ๒เ"
-
-#: ../quickfix.c:454
-#, c-format
-msgid "E377: Invalid %%%c in format string"
-msgstr "E377: อๅไ๎๏๓๑๒่์๛้ %%%c โ ๑๒๐๎๊ๅ ๔๎๐์เ๒เ"
-
-#. nothing found
-#: ../quickfix.c:477
-msgid "E378: 'errorformat' contains no pattern"
-msgstr "E378: ย ็ํเ๗ๅํ่่ ๎๏๖่่ 'errorformat' ๎๒๑๓๒๑๒โ๓ๅ๒ ๘เแ๋๎ํ"
-
-#: ../quickfix.c:695
-msgid "E379: Missing or empty directory name"
-msgstr "E379: ศ์ ๊เ๒เ๋๎ใเ ํๅ ็เไเํ๎ ่๋่ ๐เโํ๎ ๏๓๑๒๎้ ๑๒๐๎๊ๅ"
-
-#: ../quickfix.c:1305
-msgid "E553: No more items"
-msgstr "E553: ม๎๋๘ๅ ํๅ๒ ๋ๅ์ๅํ๒๎โ"
-
-#: ../quickfix.c:1674
-#, c-format
-msgid "(%d of %d)%s%s: "
-msgstr "(%d ่็ %d)%s%s: "
-
-#: ../quickfix.c:1676
-msgid " (line deleted)"
-msgstr " (๑๒๐๎๊เ ๓ไเ๋ๅํเ)"
-
-#: ../quickfix.c:1863
-msgid "E380: At bottom of quickfix stack"
-msgstr "E380: ยํ่็๓ ๑๒ๅ๊เ แ๛๑๒๐๛๕ ่๑๏๐เโ๋ๅํ่้"
-
-#: ../quickfix.c:1869
-msgid "E381: At top of quickfix stack"
-msgstr "E381: อเโๅ๐๕๓ ๑๒ๅ๊เ แ๛๑๒๐๛๕ ่๑๏๐เโ๋ๅํ่้"
-
-#: ../quickfix.c:1880
-#, c-format
-msgid "error list %d of %d; %d errors"
-msgstr "๑๏่๑๎๊ ๎๘่แ๎๊ %d ่็ %d; %d ๎๘่แ๎๊"
-
-#: ../quickfix.c:2427
-msgid "E382: Cannot write, 'buftype' option is set"
-msgstr ""
-"E382: วเ๏่๑ ํๅโ๎็์๎ๆํเ, ็ํเ๗ๅํ่ๅ ๎๏๖่่ 'buftype' ํๅ โ๋ๅ๒๑ ๏๓๑๒๎้ ๑๒๐๎๊๎้"
-
-#: ../quickfix.c:2812
-msgid "E683: File name missing or invalid pattern"
-msgstr "E683: อๅ๒ ่์ๅํ่ ๔เ้๋เ ่๋่ ํๅ๏๐เโ่๋ํ๛้ ๘เแ๋๎ํ"
-
-#: ../quickfix.c:2911
-#, c-format
-msgid "Cannot open file \"%s\""
-msgstr "อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ ๔เ้๋ \"%s\""
-
-#: ../quickfix.c:3429
-msgid "E681: Buffer is not loaded"
-msgstr "E681: ม๓๔ๅ๐ ํๅ โ๛ใ๐๓ๆๅํ"
-
-#: ../quickfix.c:3487
-msgid "E777: String or List expected"
-msgstr "E777: า๐ๅแ๓ๅ๒๑ ๑๒๐๎๊เ ่๋่ ๑๏่๑๎๊"
-
-#: ../regexp.c:359
-#, c-format
-msgid "E369: invalid item in %s%%[]"
-msgstr "E369: อๅไ๎๏๓๑๒่์๛้ ๋ๅ์ๅํ๒ โ %s%%[]"
-
-#: ../regexp.c:374
-#, c-format
-msgid "E769: Missing ] after %s["
-msgstr "E769: ฯ๐๎๏๓๙ๅํเ ] ๏๎๑๋ๅ %s["
-
-#: ../regexp.c:375
-#, c-format
-msgid "E53: Unmatched %s%%("
-msgstr "E53: อๅ๒ ๏เ๐๛ ไ๋ %s%%("
-
-#: ../regexp.c:376
-#, c-format
-msgid "E54: Unmatched %s("
-msgstr "E54: อๅ๒ ๏เ๐๛ ไ๋ %s("
-
-#: ../regexp.c:377
-#, c-format
-msgid "E55: Unmatched %s)"
-msgstr "E55: อๅ๒ ๏เ๐๛ ไ๋ %s)"
-
-#: ../regexp.c:378
-msgid "E66: \\z( not allowed here"
-msgstr "E66: \\z( ํๅ ์๎ๆๅ๒ แ๛๒ ่๑๏๎๋็๎โเํ๎ ็ไๅ๑"
-
-#: ../regexp.c:379
-msgid "E67: \\z1 et al. not allowed here"
-msgstr "E67: \\z1 ่ ๒.๏. ํๅ ์๎ใ๓๒ แ๛๒ ่๑๏๎๋็๎โเํ๛ ็ไๅ๑"
-
-#: ../regexp.c:380
-#, c-format
-msgid "E69: Missing ] after %s%%["
-msgstr "E69: ฯ๐๎๏๓๙ๅํเ ] ๏๎๑๋ๅ %s%%["
-
-#: ../regexp.c:381
-#, c-format
-msgid "E70: Empty %s%%[]"
-msgstr "E70: ฯ๓๑๒๎ๅ %s%%[]"
-
-#: ../regexp.c:1209 ../regexp.c:1224
-msgid "E339: Pattern too long"
-msgstr "E339: ั๋่๘๊๎์ ไ๋่ํํ๛้ ๘เแ๋๎ํ"
-
-#: ../regexp.c:1371
-msgid "E50: Too many \\z("
-msgstr "E50: ั๋่๘๊๎์ ์ํ๎ใ๎ \\z("
-
-#: ../regexp.c:1378
-#, c-format
-msgid "E51: Too many %s("
-msgstr "E51: ั๋่๘๊๎์ ์ํ๎ใ๎ %s("
-
-#: ../regexp.c:1427
-msgid "E52: Unmatched \\z("
-msgstr "E52: อๅ๒ ๏เ๐๛ ไ๋ \\z("
-
-#: ../regexp.c:1637
-#, c-format
-msgid "E59: invalid character after %s@"
-msgstr "E59: อๅไ๎๏๓๑๒่์๛้ ๑่์โ๎๋ ๏๎๑๋ๅ %s@"
-
-#: ../regexp.c:1672
-#, c-format
-msgid "E60: Too many complex %s{...}s"
-msgstr "E60: ั๋่๘๊๎์ ์ํ๎ใ๎ ๑๋๎ๆํ๛๕ ๊๎ํ๑๒๐๓๊๖่้ %s{...}"
-
-#: ../regexp.c:1687
-#, c-format
-msgid "E61: Nested %s*"
-msgstr "E61: ย๋๎ๆๅํํ๛ๅ %s*"
-
-#: ../regexp.c:1690
-#, c-format
-msgid "E62: Nested %s%c"
-msgstr "E62: ย๋๎ๆๅํํ๛ๅ %s%c"
-
-#: ../regexp.c:1800
-msgid "E63: invalid use of \\_"
-msgstr "E63: อๅไ๎๏๓๑๒่์๎ๅ ่๑๏๎๋็๎โเํ่ๅ \\_"
-
-#: ../regexp.c:1850
-#, c-format
-msgid "E64: %s%c follows nothing"
-msgstr "E64: %s%c ํ่ ็เ ๗ๅ์ ํๅ ๑๋ๅไ๓ๅ๒"
-
-#: ../regexp.c:1902
-msgid "E65: Illegal back reference"
-msgstr "E65: อๅไ๎๏๓๑๒่์เ ๎แ๐เ๒ํเ ๑๑๛๋๊เ"
-
-#: ../regexp.c:1943
-msgid "E68: Invalid character after \\z"
-msgstr "E68: อๅไ๎๏๓๑๒่์๛้ ๑่์โ๎๋ ๏๎๑๋ๅ \\z"
-
-#: ../regexp.c:2049 ../regexp_nfa.c:1296
-#, c-format
-msgid "E678: Invalid character after %s%%[dxouU]"
-msgstr "E678: อๅไ๎๏๓๑๒่์๛้ ๑่์โ๎๋ ๏๎๑๋ๅ %s%%[dxouU]"
-
-#: ../regexp.c:2107
-#, c-format
-msgid "E71: Invalid character after %s%%"
-msgstr "E71: อๅไ๎๏๓๑๒่์๛้ ๑่์โ๎๋ ๏๎๑๋ๅ %s%%"
-
-#: ../regexp.c:3017
-#, c-format
-msgid "E554: Syntax error in %s{...}"
-msgstr "E554: ั่ํ๒เ๊๑่๗ๅ๑๊เ ๎๘่แ๊เ โ %s{...}"
-
-#: ../regexp.c:3805
-msgid "External submatches:\n"
-msgstr "ยํๅ๘ํ่ๅ ๏๎ไ๑๎๎๒โๅ๒๑๒โ่:\n"
-
-#, c-format
-msgid "E888: (NFA regexp) cannot repeat %s"
-msgstr "E888: (๐ๅใ. โ๛๐เๆๅํ่ๅ อสภ) ํๅโ๎็์๎ๆํ๎ ๏๎โ๒๎๐่๒ %s"
-
-#: ../regexp.c:7022
-msgid ""
-"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be "
-"used "
-msgstr ""
-"E864: ๏๎๑๋ๅ \\%#= ์๎ๆๅ๒ แ๛๒ ๒๎๋๊๎ 0, 1 ่๋่ 2. ม๓ไๅ๒ ่๑๏๎๋็๎โเ๒๑ "
-"เโ๒๎์เ๒่๗ๅ๑๊เ ์เ๘่ํเ"
-
-#: ../regexp_nfa.c:239
-msgid "E865: (NFA) Regexp end encountered prematurely"
-msgstr "E865: (อสภ) ํๅ๎ๆ่ไเํํ๛้ ๊๎ํๅ๖ ๐ๅใ๓๋๐ํ๎ใ๎ โ๛๐เๆๅํ่"
-
-#: ../regexp_nfa.c:240
-#, c-format
-msgid "E866: (NFA regexp) Misplaced %c"
-msgstr "E866: (๐ๅใ. โ๛๐เๆๅํ่ๅ อสภ) ํๅ๎ๆ่ไเํํ๛้ %c"
-
-#: ../regexp_nfa.c:242
-#, c-format
-msgid "E877: (NFA regexp) Invalid character class: %<PRId64>"
-msgstr ""
-
-#: ../regexp_nfa.c:1261
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\z%c'"
-msgstr "E867: (อสภ) ํๅ่็โๅ๑๒ํ๛้ ๎๏ๅ๐เ๒๎๐ '\\z%c'"
-
-#: ../regexp_nfa.c:1387
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\%%%c'"
-msgstr "E867: (อสภ) ํๅ่็โๅ๑๒ํ๛้ ๎๏ๅ๐เ๒๎๐ '\\%%%c'"
-
-#: ../regexp_nfa.c:1802
-#, c-format
-msgid "E869: (NFA) Unknown operator '\\@%c'"
-msgstr "E869: (อสภ) ํๅ่็โๅ๑๒ํ๛้ ๎๏ๅ๐เ๒๎๐ '\\@%c'"
-
-#: ../regexp_nfa.c:1831
-msgid "E870: (NFA regexp) Error reading repetition limits"
-msgstr "E870: (๐ๅใ. โ๛๐เๆๅํ่ๅ อสภ) ๎๘่แ๊เ ๏๐่ ๗๒ๅํ่่ ใ๐เํ่๖ ๏๎โ๒๎๐ๅํ่"
-
-#. Can't have a multi follow a multi.
-#: ../regexp_nfa.c:1895
-msgid "E871: (NFA regexp) Can't have a multi follow a multi !"
-msgstr "E871: (๐ๅใ. โ๛๐เๆๅํ่ๅ อสภ) ์ํ๎ๆๅ๑๒โ๎ ํๅ ์๎ๆๅ๒ ๑๋ๅไ๎โเ๒ ็เ ์ํ๎ๆๅ๑๒โ๎์!"
-
-#. Too many `('
-#: ../regexp_nfa.c:2037
-msgid "E872: (NFA regexp) Too many '('"
-msgstr "E872: (๐ๅใ. โ๛๐เๆๅํ่ๅ อสภ) ๑๋่๘๊๎์ ์ํ๎ใ๎ '('"
-
-#: ../regexp_nfa.c:2042
-msgid "E879: (NFA regexp) Too many \\z("
-msgstr "E879: (๐ๅใ. โ๛๐เๆๅํ่ๅ อสภ) ๑๋่๘๊๎์ ์ํ๎ใ๎ \\z("
-
-#: ../regexp_nfa.c:2066
-msgid "E873: (NFA regexp) proper termination error"
-msgstr "E873: (๐ๅใ. โ๛๐เๆๅํ่ๅ อสภ) ๎๘่แ๊เ ๊๎๐๐ๅ๊๒ํ๎ใ๎ ็เโๅ๐๘ๅํ่"
-
-#: ../regexp_nfa.c:2599
-msgid "E874: (NFA) Could not pop the stack !"
-msgstr "E874: (๐ๅใ. โ๛๐เๆๅํ่ๅ อสภ) ํๅโ๎็์๎ๆํ๎ โ็๒ ่็ ๑๒ๅ๊เ!"
-
-#: ../regexp_nfa.c:3298
-msgid ""
-"E875: (NFA regexp) (While converting from postfix to NFA), too many states "
-"left on stack"
-msgstr ""
-"E875: (๐ๅใ. โ๛๐เๆๅํ่ๅ อสภ) โ ๑๒ๅ๊ๅ ๎๑๒เ๋๎๑ ๑๋่๘๊๎์ ์ํ๎ใ๎ ๑๎๑๒๎ํ่้ (๏๐่ "
-"๏๐ๅ๎แ๐เ็๎โเํ่่ ่็ postfix โ อสภ)"
-
-#: ../regexp_nfa.c:3302
-msgid "E876: (NFA regexp) Not enough space to store the whole NFA "
-msgstr "E876: (๐ๅใ. โ๛๐เๆๅํ่ๅ อสภ) ํๅไ๎๑๒เ๒๎๗ํ๎ ์ๅ๑๒เ ไ๋ ๕๐เํๅํ่ โ๑ๅใ๎ อสภ"
-
-#: ../regexp_nfa.c:4571 ../regexp_nfa.c:4869
-msgid ""
-"Could not open temporary log file for writing, displaying on stderr ... "
-msgstr ""
-"อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ ๔เ้๋ โ๐ๅ์ๅํํ๎ใ๎ ๆ๓๐ํเ๋เ ไ๋ ็เ๏่๑่, โ๛โ๎ไ ํเ stderr..."
-
-#: ../regexp_nfa.c:4840
-#, c-format
-msgid "(NFA) COULD NOT OPEN %s !"
-msgstr "(อสภ) ํๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ %s!"
-
-#: ../regexp_nfa.c:6049
-msgid "Could not open temporary log file for writing "
-msgstr "อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ ๔เ้๋ โ๐ๅ์ๅํํ๎ใ๎ ๆ๓๐ํเ๋เ ไ๋ ็เ๏่๑่"
-
-#: ../screen.c:7435
-msgid " VREPLACE"
-msgstr " ยศะาำภหอภ฿ วภฬลอภ"
-
-#: ../screen.c:7437
-msgid " REPLACE"
-msgstr " วภฬลอภ"
-
-#: ../screen.c:7440
-msgid " REVERSE"
-msgstr " ฮมะภาอภ฿"
-
-#: ../screen.c:7441
-msgid " INSERT"
-msgstr " ยัาภยสภ"
-
-#: ../screen.c:7443
-msgid " (insert)"
-msgstr " (โ๑๒เโ๊เ)"
-
-#: ../screen.c:7445
-msgid " (replace)"
-msgstr " (็เ์ๅํเ)"
-
-#: ../screen.c:7447
-msgid " (vreplace)"
-msgstr " (โ่๐๒๓เ๋ํเ ็เ์ๅํเ)"
-
-#: ../screen.c:7449
-msgid " Hebrew"
-msgstr " ศโ๐่๒"
-
-#: ../screen.c:7454
-msgid " Arabic"
-msgstr " ภ๐เแ๑๊่้"
-
-#: ../screen.c:7456
-msgid " (lang)"
-msgstr " (็๛๊)"
-
-#: ../screen.c:7459
-msgid " (paste)"
-msgstr " (โ๊๋ๅ้๊เ)"
-
-#: ../screen.c:7469
-msgid " VISUAL"
-msgstr " ยศวำภหอษ ะลฦศฬ"
-
-#: ../screen.c:7470
-msgid " VISUAL LINE"
-msgstr " ยศวำภหอภ฿ ัาะฮสภ"
-
-#: ../screen.c:7471
-msgid " VISUAL BLOCK"
-msgstr " ยศวำภหอษ มหฮส"
-
-#: ../screen.c:7472
-msgid " SELECT"
-msgstr " ยฤลหลอศล"
-
-#: ../screen.c:7473
-msgid " SELECT LINE"
-msgstr " ยฤลหลอศล ัาะฮสศ"
-
-#: ../screen.c:7474
-msgid " SELECT BLOCK"
-msgstr " ยฤลหลอศล มหฮสภ"
-
-#: ../screen.c:7486 ../screen.c:7541
-msgid "recording"
-msgstr "็เ๏่๑"
-
-#: ../search.c:487
-#, c-format
-msgid "E383: Invalid search string: %s"
-msgstr "E383: อๅ๏๐เโ่๋ํเ ๑๒๐๎๊เ ๏๎่๑๊เ: %s"
-
-#: ../search.c:832
-#, c-format
-msgid "E384: search hit TOP without match for: %s"
-msgstr "E384: ฯ๎่๑๊ ็เ๊๎ํ๗ๅํ โ อภืภหล ไ๎๊๓์ๅํ๒เ; %s ํๅ ํเ้ไๅํ๎"
-
-#: ../search.c:835
-#, c-format
-msgid "E385: search hit BOTTOM without match for: %s"
-msgstr "E385: ฯ๎่๑๊ ็เ๊๎ํ๗ๅํ โ สฮอึล ไ๎๊๓์ๅํ๒เ; %s ํๅ ํเ้ไๅํ๎"
-
-#: ../search.c:1200
-msgid "E386: Expected '?' or '/' after ';'"
-msgstr "E386: ฯ๎๑๋ๅ ';' ๎ๆ่ไเๅ๒๑ โโ๎ไ '?' ่๋่ '/'"
-
-#: ../search.c:4085
-msgid " (includes previously listed match)"
-msgstr " (โ๊๋๗เๅ๒ ๐เํํๅๅ ๏๎๊เ็เํํ๛ๅ ๑๎๎๒โๅ๒๑๒โ่)"
-
-#. cursor at status line
-#: ../search.c:4104
-msgid "--- Included files "
-msgstr "--- ย๊๋๗ธํํ๛ๅ ๔เ้๋๛ "
-
-#: ../search.c:4106
-msgid "not found "
-msgstr "ํๅ ํเ้ไๅํ๎ "
-
-#: ../search.c:4107
-msgid "in path ---\n"
-msgstr "๏๎ ๏๓๒่ ---\n"
-
-#: ../search.c:4168
-msgid " (Already listed)"
-msgstr " (ำๆๅ ๏๎๊เ็เํ๎)"
-
-#: ../search.c:4170
-msgid " NOT FOUND"
-msgstr " อล อภษฤลอฮ"
-
-#: ../search.c:4211
-#, c-format
-msgid "Scanning included file: %s"
-msgstr "ฯ๐๎๑์๎๒๐ โ๊๋๗ธํํ๛๕ ๔เ้๋๎โ: %s"
-
-#: ../search.c:4216
-#, c-format
-msgid "Searching included file %s"
-msgstr "ฯ๎่๑๊ โ๊๋๗ธํํ๎ใ๎ ๔เ้๋เ %s"
-
-#: ../search.c:4405
-msgid "E387: Match is on current line"
-msgstr "E387: ั๎๎๒โๅ๒๑๒โ่ๅ โ ๒ๅ๊๓๙ๅ้ ๑๒๐๎๊ๅ"
-
-#: ../search.c:4517
-msgid "All included files were found"
-msgstr "อเ้ไๅํ๛ โ๑ๅ โ๊๋๗ธํํ๛ๅ ๔เ้๋๛"
-
-#: ../search.c:4519
-msgid "No included files"
-msgstr "ย๊๋๗ธํํ๛๕ ๔เ้๋๎โ ํๅ๒"
-
-#: ../search.c:4527
-msgid "E388: Couldn't find definition"
-msgstr "E388: ฮ๏๐ๅไๅ๋ๅํ่ๅ ํๅ ํเ้ไๅํ๎"
-
-#: ../search.c:4529
-msgid "E389: Couldn't find pattern"
-msgstr "E389: ุเแ๋๎ํ ํๅ ํเ้ไๅํ"
-
-#: ../search.c:4668
-msgid "Substitute "
-msgstr "วเ์ๅํเ "
-
-#: ../search.c:4681
-#, c-format
-msgid ""
-"\n"
-"# Last %sSearch Pattern:\n"
-"~"
-msgstr ""
-"\n"
-"# ฯ๎๑๋ๅไํ่้ %sุเแ๋๎ํ ๏๎่๑๊เ:\n"
-"~"
-
-#: ../spell.c:951
-msgid "E759: Format error in spell file"
-msgstr "E759: ฮ๘่แ๊เ ๔๎๐์เ๒เ โ ๔เ้๋ๅ ๏๐เโ๎๏่๑เํ่"
-
-#: ../spell.c:952
-msgid "E758: Truncated spell file"
-msgstr "E758: ิเ้๋ ๏๐เโ๎๏่๑เํ่ ๎แ๐ๅ็เํ"
-
-#: ../spell.c:953
-#, c-format
-msgid "Trailing text in %s line %d: %s"
-msgstr "ห่๘ํ่้ ๒ๅ๊๑๒ ํเ ๕โ๎๑๒ๅ โ %s ๑๒๐. %d: %s"
-
-#: ../spell.c:954
-#, c-format
-msgid "Affix name too long in %s line %d: %s"
-msgstr "ศ์ เ๔๔่๊๑เ ๑๋่๘๊๎์ ไ๋่ํํ๎ๅ โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:955
-msgid "E761: Format error in affix file FOL, LOW or UPP"
-msgstr "E761: ฮ๘่แ๊เ ๔๎๐์เ๒เ โ ๔เ้๋ๅ เ๔๔่๊๑๎โ FOL, LOW ่๋่ UPP"
-
-#: ../spell.c:957
-msgid "E762: Character in FOL, LOW or UPP is out of range"
-msgstr "E762: ั่์โ๎๋๛ โ FOL, LOW ่๋่ UPP ็เ ๏๐ๅไๅ๋เ์่ ไ่เ๏เ็๎ํเ"
-
-#: ../spell.c:958
-msgid "Compressing word tree..."
-msgstr "ัๆเ๒่ๅ ไๅ๐ๅโเ ๑๋๎โ..."
-
-#: ../spell.c:1951
-msgid "E756: Spell checking is not enabled"
-msgstr "E756: ฯ๐๎โๅ๐๊เ ๏๐เโ๎๏่๑เํ่ โ๛๊๋๗ๅํเ"
-
-#: ../spell.c:2249
-#, c-format
-msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
-msgstr ""
-"ฯ๐ๅไ๓๏๐ๅๆไๅํ่ๅ: อๅโ๎็์๎ๆํ๎ ํเ้๒่ ๑๏่๑๎๊ ๑๋๎โ \"%s.%s.spl\" ่๋่ \"%s.ascii.spl"
-"\""
-
-#: ../spell.c:2473
-#, c-format
-msgid "Reading spell file \"%s\""
-msgstr "ื๒ๅํ่ๅ ๔เ้๋เ ๏๐เโ๎๏่๑เํ่ \"%s\""
-
-#: ../spell.c:2496
-msgid "E757: This does not look like a spell file"
-msgstr "E757: ๒๎ ํๅ ๏๎๕๎ๆๅ ํเ ๔เ้๋ ๏๐เโ๎๏่๑เํ่"
-
-#: ../spell.c:2501
-msgid "E771: Old spell file, needs to be updated"
-msgstr "E771: ั๒เ๐๛้ ๔เ้๋ ๏๐เโ๎๏่๑เํ่, ๒๐ๅแ๓ๅ๒๑ ๅใ๎ ๎แํ๎โ๋ๅํ่ๅ"
-
-#: ../spell.c:2504
-msgid "E772: Spell file is for newer version of Vim"
-msgstr "E772: ิเ้๋ ๏๐เโ๎๏่๑เํ่ ๏๐ๅไํเ็ํเ๗ๅํ ไ๋ แ๎๋ๅๅ ํ๎โ๎้ โๅ๐๑่่ Vim"
-
-#: ../spell.c:2602
-msgid "E770: Unsupported section in spell file"
-msgstr "E770: อๅ๏๎ไไๅ๐ๆ่โเๅ์๛้ ๐เ็ไๅ๋ โ ๔เ้๋ๅ ๏๐เโ๎๏่๑เํ่"
-
-#: ../spell.c:3762
-#, c-format
-msgid "Warning: region %s not supported"
-msgstr "ฯ๐ๅไ๓๏๐ๅๆไๅํ่ๅ: ๐ๅใ่๎ํ %s ํๅ ๏๎ไไๅ๐ๆ่โเๅ๒๑"
-
-#: ../spell.c:4550
-#, c-format
-msgid "Reading affix file %s ..."
-msgstr "ื๒ๅํ่ๅ ๔เ้๋เ เ๔๔่๊๑๎โ %s ..."
-
-#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
-#, c-format
-msgid "Conversion failure for word in %s line %d: %s"
-msgstr "อๅ ๓ไเ๋๎๑ ๏๐ๅ๎แ๐เ็๎โเ๒ ๑๋๎โ๎ โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:4630 ../spell.c:6170
-#, c-format
-msgid "Conversion in %s not supported: from %s to %s"
-msgstr "ฯ๐ๅ๎แ๐เ็๎โเํ่ๅ โ %s ํๅ ๏๎ไไๅ๐ๆ่โเๅ๒๑: ่็ %s โ %s"
-
-#: ../spell.c:4642
-#, c-format
-msgid "Invalid value for FLAG in %s line %d: %s"
-msgstr "อๅ๏๐เโ่๋ํ๎ๅ ็ํเ๗ๅํ่ๅ FLAG โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:4655
-#, c-format
-msgid "FLAG after using flags in %s line %d: %s"
-msgstr "FLAG ๏๎๑๋ๅ ่๑๏๎๋็๎โเํ่ ๔๋เใ๎โ โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:4723
-#, c-format
-msgid ""
-"Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line "
-"%d"
-msgstr ""
-"ฮ๏๐ๅไๅ๋ๅํ่ๅ COMPOUNDFORBIDFLAG ๏๎๑๋ๅ ๋ๅ์ๅํ๒เ PFX ์๎ๆๅ๒ ไเ๒ ํๅ๏๐เโ่๋ํ๛ๅ "
-"๐ๅ็๓๋๒เ๒๛ โ %s, ๑๒๐๎๊เ %d"
-
-#: ../spell.c:4731
-#, c-format
-msgid ""
-"Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line "
-"%d"
-msgstr ""
-"ฮ๏๐ๅไๅ๋ๅํ่ๅ COMPOUNDPERMITFLAG ๏๎๑๋ๅ ๋ๅ์ๅํ๒เ PFX ์๎ๆๅ๒ ไเ๒ ํๅ๏๐เโ่๋ํ๛ๅ "
-"๐ๅ็๓๋๒เ๒๛ โ %s, ๑๒๐๎๊เ %d"
-
-#: ../spell.c:4747
-#, c-format
-msgid "Wrong COMPOUNDRULES value in %s line %d: %s"
-msgstr "อๅ๏๐เโ่๋ํ๎ๅ ็ํเ๗ๅํ่ๅ COMPOUNDRULES โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:4771
-#, c-format
-msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s"
-msgstr "อๅ๏๐เโ่๋ํ๎ๅ ็ํเ๗ๅํ่ๅ COMPOUNDWORDMAX โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:4777
-#, c-format
-msgid "Wrong COMPOUNDMIN value in %s line %d: %s"
-msgstr "อๅ๏๐เโ่๋ํ๎ๅ ็ํเ๗ๅํ่ๅ COMPOUNDMIN โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:4783
-#, c-format
-msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s"
-msgstr "อๅ๏๐เโ่๋ํ๎ๅ ็ํเ๗ๅํ่ๅ COMPOUNDSYLMAX โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:4795
-#, c-format
-msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"
-msgstr "อๅ๏๐เโ่๋ํ๎ๅ ็ํเ๗ๅํ่ๅ CHECKCOMPOUNDPATTERN โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:4847
-#, c-format
-msgid "Different combining flag in continued affix block in %s line %d: %s"
-msgstr ""
-"ฤ๐๓ใ๎้ ๎แ๚ๅไ่ํ๙่้ ๔๋เใ โ ๏๐๎ไ๎๋ๆเ๙ๅ์ แ๋๎๊ๅ เ๔๔่๊๑เ โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:4850
-#, c-format
-msgid "Duplicate affix in %s line %d: %s"
-msgstr "ฯ๎โ๒๎๐๙่้๑ เ๔๔่๊๑ โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:4871
-#, c-format
-msgid ""
-"Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s "
-"line %d: %s"
-msgstr ""
-"ภ๔๔่๊๑ ๒เ๊ๆๅ ่๑๏๎๋็๓ๅ๒๑ ไ๋ BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/"
-"NOSUGGEST โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:4893
-#, c-format
-msgid "Expected Y or N in %s line %d: %s"
-msgstr "ฮๆ่ไเ๋๎๑ Y ่๋่ N โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:4968
-#, c-format
-msgid "Broken condition in %s line %d: %s"
-msgstr "อเ๐๓๘ๅํํ๎ๅ ๓๑๋๎โ่ๅ โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:5091
-#, c-format
-msgid "Expected REP(SAL) count in %s line %d"
-msgstr "ฮๆ่ไเ๋๑ ๑๗ธ๒๗่๊ REP(SAL) โ %s, ๑๒๐๎๊เ %d"
-
-#: ../spell.c:5120
-#, c-format
-msgid "Expected MAP count in %s line %d"
-msgstr "ฮๆ่ไเ๋๑ ๑๗ธ๒๗่๊ MAP โ %s, ๑๒๐๎๊เ %d"
-
-#: ../spell.c:5132
-#, c-format
-msgid "Duplicate character in MAP in %s line %d"
-msgstr "ฯ๎โ๒๎๐๙่้๑ ๑่์โ๎๋ โ MAP โ %s, ๑๒๐๎๊เ %d"
-
-#: ../spell.c:5176
-#, c-format
-msgid "Unrecognized or duplicate item in %s line %d: %s"
-msgstr "อๅ๐เ๑๏๎็ํเํํ๛้ ่๋่ ๏๎โ๒๎๐๙่้๑ ๋ๅ์ๅํ๒ โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:5197
-#, c-format
-msgid "Missing FOL/LOW/UPP line in %s"
-msgstr "ฯ๐๎๏๓๙ๅํเ ๑๒๐๎๊เ FOL/LOW/UPP โ %s"
-
-#: ../spell.c:5220
-msgid "COMPOUNDSYLMAX used without SYLLABLE"
-msgstr "COMPOUNDSYLMAX ่๑๏๎๋็๓ๅ๒๑ แๅ็ SYLLABLE"
-
-#: ../spell.c:5236
-msgid "Too many postponed prefixes"
-msgstr "ั๋่๘๊๎์ ์ํ๎ใ๎ ๎๒๋๎ๆๅํํ๛๕ ๏๐ๅ๔่๊๑๎โ"
-
-#: ../spell.c:5238
-msgid "Too many compound flags"
-msgstr "ั๋่๘๊๎์ ์ํ๎ใ๎ ๑๎๑๒เโํ๛๕ ๔๋เใ๎โ"
-
-#: ../spell.c:5240
-msgid "Too many postponed prefixes and/or compound flags"
-msgstr "ั๋่๘๊๎์ ์ํ๎ใ๎ ๎๒๋๎ๆๅํํ๛๕ ๏๐ๅ๔่๊๑๎โ ่/่๋่ ๑๎๑๒เโํ๛๕ ๔๋เใ๎โ"
-
-#: ../spell.c:5250
-#, c-format
-msgid "Missing SOFO%s line in %s"
-msgstr "ฯ๐๎๏๓๙ๅํเ ๑๒๐๎๊เ SOFO%s โ %s"
-
-#: ../spell.c:5253
-#, c-format
-msgid "Both SAL and SOFO lines in %s"
-msgstr "ฮแๅ ๑๒๐๎๊่ SAL ่ SOFO โ %s"
-
-#: ../spell.c:5331
-#, c-format
-msgid "Flag is not a number in %s line %d: %s"
-msgstr "ิ๋เใ ํๅ โ๋ๅ๒๑ ๗่๑๋๎์ โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:5334
-#, c-format
-msgid "Illegal flag in %s line %d: %s"
-msgstr "อๅไ๎๏๓๑๒่์๛้ ๔๋เใ โ %s ํเ ๑๒๐๎๊ๅ %d: %s"
-
-#: ../spell.c:5493 ../spell.c:5501
-#, c-format
-msgid "%s value differs from what is used in another .aff file"
-msgstr "%s ่์ๅๅ๒ ไ๐๓ใ๎ๅ ็ํเ๗ๅํ่ๅ, ๗ๅ์ โ ๔เ้๋ๅ .aff"
-
-#: ../spell.c:5602
-#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "ื๒ๅํ่ๅ ๔เ้๋เ ๑๋๎โเ๐ %s ..."
-
-#: ../spell.c:5611
-#, c-format
-msgid "E760: No word count in %s"
-msgstr "E760: ส๎๋่๗ๅ๑๒โ๎ ๑๋๎โ ํๅ ๓๊เ็เํ๎ โ %s"
-
-#: ../spell.c:5669
-#, c-format
-msgid "line %6d, word %6d - %s"
-msgstr "๑๒๐๎๊เ %6d, ๑๋๎โ๎ %6d — %s"
-
-#: ../spell.c:5691
-#, c-format
-msgid "Duplicate word in %s line %d: %s"
-msgstr "ฯ๎โ๒๎๐ ๑๋๎โเ โ %s ํเ ๑๒๐๎๊ๅ %d: %s "
-
-#: ../spell.c:5694
-#, c-format
-msgid "First duplicate word in %s line %d: %s"
-msgstr "ฯๅ๐โ๛้ ๏๎โ๒๎๐ ๑๋๎โเ โ %s ํเ ๑๒๐๎๊ๅ %d: %s"
-
-#: ../spell.c:5746
-#, c-format
-msgid "%d duplicate word(s) in %s"
-msgstr "%d ๏๎โ๒๎๐๙่๕๑ ๑๋๎โ โ %s"
-
-#: ../spell.c:5748
-#, c-format
-msgid "Ignored %d word(s) with non-ASCII characters in %s"
-msgstr "ฯ๐๎๏๓๙ๅํ๎ %d ๑๋๎โ ๑ ํๅ ASCII ๑่์โ๎๋เ์่ โ %s"
-
-#: ../spell.c:6115
-#, c-format
-msgid "Reading word file %s ..."
-msgstr "ื๒ๅํ่ๅ ๔เ้๋เ ๑๋๎โ %s ..."
-
-#: ../spell.c:6155
-#, c-format
-msgid "Duplicate /encoding= line ignored in %s line %d: %s"
-msgstr "ฯ๐๎่ใํ๎๐่๐๎โเํเ ๏๎โ๒๎๐๙เ๑ ๑๒๐๎๊เ /encoding= โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:6159
-#, c-format
-msgid "/encoding= line after word ignored in %s line %d: %s"
-msgstr "ฯ๐๎่ใํ๎๐่๐๎โเํเ ๑๒๐๎๊เ /encoding= ๏๎๑๋ๅ ๑๋๎โเ โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:6180
-#, c-format
-msgid "Duplicate /regions= line ignored in %s line %d: %s"
-msgstr "ฯ๐๎๏๓๑๊เๅ๒๑ ๏๎โ๒๎๐ ๑๒๐๎๊่ /regions= โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:6185
-#, c-format
-msgid "Too many regions in %s line %d: %s"
-msgstr "ั๋่๘๊๎์ ์ํ๎ใ๎ ๐ๅใ่๎ํ๎โ โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:6198
-#, c-format
-msgid "/ line ignored in %s line %d: %s"
-msgstr "/ ๑๒๐๎๊เ ๏๐๎๏๓๑๊เๅ๒๑ โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:6224
-#, c-format
-msgid "Invalid region nr in %s line %d: %s"
-msgstr "อๅไ๎๏๓๑๒่์๛้ ํ๎์ๅ๐ ๐ๅใ่๎ํเ โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:6230
-#, c-format
-msgid "Unrecognized flags in %s line %d: %s"
-msgstr "อๅ๐เ๑๏๎็ํเํํ๛ๅ ๔๋เใ่ โ %s, ๑๒๐๎๊เ %d: %s"
-
-#: ../spell.c:6257
-#, c-format
-msgid "Ignored %d words with non-ASCII characters"
-msgstr "ฯ๐๎๏๓๙ๅํ๎ %d ๑๋๎โ ๑ ํๅ ASCII ๑่์โ๎๋เ์่"
-
-#: ../spell.c:6656
-#, c-format
-msgid "Compressed %d of %d nodes; %d (%d%%) remaining"
-msgstr "ัๆเ๒๎ %d ่็ %d ๓็๋๎โ; ๎๑๒เ๋๎๑ %d (%d%%)"
-
-#: ../spell.c:7340
-msgid "Reading back spell file..."
-msgstr "ื๒ๅํ่ๅ ็เ๏่๑เํํ๎ใ๎ ๔เ้๋เ ๏๐เโ๎๏่๑เํ่..."
-
-#. Go through the trie of good words, soundfold each word and add it to
-#. the soundfold trie.
-#: ../spell.c:7357
-msgid "Performing soundfolding..."
-msgstr "ย๛๏๎๋ํๅํ่ๅ ็โ๓๊๎โ๎้ ๑โธ๐๒๊่..."
-
-#: ../spell.c:7368
-#, c-format
-msgid "Number of words after soundfolding: %<PRId64>"
-msgstr "ส๎๋่๗ๅ๑๒โ๎ ๑๋๎โ ๏๎๑๋ๅ ็โ๓๊๎โ๎้ ๑โธ๐๒๊่: %<PRId64>"
-
-#: ../spell.c:7476
-#, c-format
-msgid "Total number of words: %d"
-msgstr "ฮแ๙ๅๅ ๊๎๋่๗ๅ๑๒โ๎ ๑๋๎โ: %d"
-
-#: ../spell.c:7655
-#, c-format
-msgid "Writing suggestion file %s ..."
-msgstr "วเ๏่๑ ๔เ้๋เ ๏๐ๅไ๋๎ๆๅํ่ ่๑๏๐เโ๋ๅํ่้ ๏๐เโ๎๏่๑เํ่ %s"
-
-#: ../spell.c:7707 ../spell.c:7927
-#, c-format
-msgid "Estimated runtime memory use: %d bytes"
-msgstr "ฮ๖ๅํ๊เ ่๑๏๎๋็๎โเํ่ ๏เ์๒่ ๏๐่ โ๛๏๎๋ํๅํ่่: %d แเ้๒"
-
-#: ../spell.c:7820
-msgid "E751: Output file name must not have region name"
-msgstr "E751: ศ์ โ๛๕๎ไํ๎ใ๎ ๔เ้๋เ ํๅ ไ๎๋ๆํ๎ ๑๎ไๅ๐ๆเ๒ ํเ็โเํ่ ๐ๅใ่๎ํเ"
-
-#: ../spell.c:7822
-msgid "E754: Only up to 8 regions supported"
-msgstr "E754: ฯ๎ไไๅ๐ๆ่โเๅ๒๑ ํๅ แ๎๋ๅๅ 8-์่ ๐ๅใ่๎ํ๎โ"
-
-#: ../spell.c:7846
-#, c-format
-msgid "E755: Invalid region in %s"
-msgstr "E755: อๅไ๎๏๓๑๒่์๛้ ๐ๅใ่๎ํ โ %s"
-
-#: ../spell.c:7907
-msgid "Warning: both compounding and NOBREAK specified"
-msgstr "ฯ๐ๅไ๓๏๐ๅๆไๅํ่ๅ: ๎แเ ๑๎๑๒เโํ๛ๅ ่ ๓๊เ็เํ๎ NOBREAK"
-
-#: ../spell.c:7920
-#, c-format
-msgid "Writing spell file %s ..."
-msgstr "วเ๏่๑ ๔เ้๋เ ๏๐เโ๎๏่๑เํ่ %s ..."
-
-#: ../spell.c:7925
-msgid "Done!"
-msgstr "วเโๅ๐๘ๅํ๎!"
-
-#: ../spell.c:8034
-#, c-format
-msgid "E765: 'spellfile' does not have %<PRId64> entries"
-msgstr "E765: 'spellfile' ํๅ ๑๎ไๅ๐ๆ่๒ %<PRId64> ๋ๅ์ๅํ๒๎โ"
-
-#: ../spell.c:8074
-#, fuzzy, c-format
-msgid "Word '%.*s' removed from %s"
-msgstr "ั๋๎โ๎ ๓ไเ๋ๅํ๎ ่็ %s"
-
-#: ../spell.c:8117
-#, fuzzy, c-format
-msgid "Word '%.*s' added to %s"
-msgstr "ั๋๎โ๎ ไ๎แเโ๋ๅํ๎ โ %s"
-
-#: ../spell.c:8381
-msgid "E763: Word characters differ between spell files"
-msgstr "E763: ั่์โ๎๋๛ ๑๋๎โ ๎๒๋่๗เ๒๑ โ ๔เ้๋เ๕ ๏๐เโ๎๏่๑เํ่"
-
-#: ../spell.c:8684
-msgid "Sorry, no suggestions"
-msgstr "ศ็โ่ํ่๒ๅ, ํๅ๒ ๏๐ๅไ๏๎๋๎ๆๅํ่้"
-
-#: ../spell.c:8687
-#, c-format
-msgid "Sorry, only %<PRId64> suggestions"
-msgstr "ศ็โ่ํ่๒ๅ, ๒๎๋๊๎ %<PRId64> ๏๐ๅไ๏๎๋๎ๆๅํ่้"
-
-#. for when 'cmdheight' > 1
-#. avoid more prompt
-#: ../spell.c:8704
-#, c-format
-msgid "Change \"%.*s\" to:"
-msgstr "วเ์ๅํ่๒ \"%.*s\" ํเ:"
-
-#: ../spell.c:8737
-#, c-format
-msgid " < \"%.*s\""
-msgstr " < \"%.*s\""
-
-#: ../spell.c:8882
-msgid "E752: No previous spell replacement"
-msgstr "E752: อๅ๒ ๏๐ๅไ๛ไ๓๙ๅ้ ็เ์ๅํ๛ ๏๐เโ๎๏่๑เํ่"
-
-#: ../spell.c:8925
-#, c-format
-msgid "E753: Not found: %s"
-msgstr "E753: อๅ ํเ้ไๅํ๎: %s"
-
-#: ../spell.c:9276
-#, c-format
-msgid "E778: This does not look like a .sug file: %s"
-msgstr "E778: ๒๎ ํๅ ๏๎๕๎ๆๅ ํเ ๔เ้๋ .sug: %s"
-
-#: ../spell.c:9282
-#, c-format
-msgid "E779: Old .sug file, needs to be updated: %s"
-msgstr "E779: ั๒เ๐๛้ ๔เ้๋ .sug, ๒๐ๅแ๓ๅ๒ ๎แํ๎โ๋ๅํ่: %s"
-
-#: ../spell.c:9286
-#, c-format
-msgid "E780: .sug file is for newer version of Vim: %s"
-msgstr "E780: ิเ้๋ .sug ไ๋ แ๎๋ๅๅ ํ๎โ๎้ โๅ๐๑่่ Vim: %s"
-
-#: ../spell.c:9295
-#, c-format
-msgid "E781: .sug file doesn't match .spl file: %s"
-msgstr "E781: ิเ้๋ .sug ํๅ ๑๎๎๒โๅ๒๑๒โ๓ๅ๒ ๔เ้๋๓ .spl: %s"
-
-#: ../spell.c:9305
-#, c-format
-msgid "E782: error while reading .sug file: %s"
-msgstr "E782: ฮ๘่แ๊เ ๏๐่ ๗๒ๅํ่่ ๔เ้๋เ .sug: %s"
-
-#. This should have been checked when generating the .spl
-#. file.
-#: ../spell.c:11575
-msgid "E783: duplicate char in MAP entry"
-msgstr "E783: ฯ๎โ๒๎๐๙่้๑ ๑่์โ๎๋ โ ๋ๅ์ๅํ๒ๅ MAP"
-
-#: ../syntax.c:266
-msgid "No Syntax items defined for this buffer"
-msgstr "ั่ํ๒เ๊๑่๗ๅ๑๊่ๅ ๋ๅ์ๅํ๒๛ ไ๋ ไเํํ๎ใ๎ แ๓๔ๅ๐เ ํๅ ๎๏๐ๅไๅ๋ๅํ๛"
-
-#: ../syntax.c:3083 ../syntax.c:3104 ../syntax.c:3127
-#, c-format
-msgid "E390: Illegal argument: %s"
-msgstr "E390: อๅไ๎๏๓๑๒่์๛้ ๏เ๐เ์ๅ๒๐: %s"
-
-#: ../syntax.c:3299
-#, c-format
-msgid "E391: No such syntax cluster: %s"
-msgstr "E391: ั่ํ๒เ๊๑่๗ๅ๑๊่้ ๊๋เ๑๒ๅ๐ %s ํๅ ํเ้ไๅํ"
-
-#: ../syntax.c:3433
-msgid "syncing on C-style comments"
-msgstr "ั่ํ๕๐๎ํ่็เ๖่ ๏๎ ๊๎์์ๅํ๒เ๐่์ โ ๑๒่๋ๅ ็๛๊เ C"
-
-#: ../syntax.c:3439
-msgid "no syncing"
-msgstr "แๅ็ ๑่ํ๕๐๎ํ่็เ๖่่"
-
-#: ../syntax.c:3441
-msgid "syncing starts "
-msgstr "๑่ํ๕๐๎ํ่็เ๖่ ํเ๗เ๒เ "
-
-#: ../syntax.c:3443 ../syntax.c:3506
-msgid " lines before top line"
-msgstr " ๑๒๐๎๊ ๏ๅ๐ๅไ โๅ๐๕ํๅ้ ๑๒๐๎๊๎้"
-
-#: ../syntax.c:3448
-msgid ""
-"\n"
-"--- Syntax sync items ---"
-msgstr ""
-"\n"
-"--- ๋ๅ์ๅํ๒๛ ๑่ํ๕๐๎ํ่็เ๖่่ ๑่ํ๒เ๊๑่๑เ ---"
-
-#: ../syntax.c:3452
-msgid ""
-"\n"
-"syncing on items"
-msgstr ""
-"\n"
-"๑่ํ๕๐๎ํ่็เ๖่ ๏๎ ๋ๅ์ๅํ๒เ์"
-
-#: ../syntax.c:3457
-msgid ""
-"\n"
-"--- Syntax items ---"
-msgstr ""
-"\n"
-"--- ั่ํ๒เ๊๑่๗ๅ๑๊่ๅ ๋ๅ์ๅํ๒๛ ---"
-
-#: ../syntax.c:3475
-#, c-format
-msgid "E392: No such syntax cluster: %s"
-msgstr "E392: ั่ํ๒เ๊๑่๗ๅ๑๊่้ ๊๋เ๑๒ๅ๐ %s ํๅ ํเ้ไๅํ"
-
-#: ../syntax.c:3497
-msgid "minimal "
-msgstr "์่ํ่์๓์ "
-
-#: ../syntax.c:3503
-msgid "maximal "
-msgstr "์เ๊๑่์๓์ "
-
-#: ../syntax.c:3513
-msgid "; match "
-msgstr "; ๑๎๎๒โๅ๒๑๒โ่ๅ "
-
-#: ../syntax.c:3515
-msgid " line breaks"
-msgstr " ๏ๅ๐ๅํ๎๑๎โ ๑๒๐๎๊"
-
-#: ../syntax.c:4076
-msgid "E395: contains argument not accepted here"
-msgstr "E395: วไๅ๑ ํๅ๋็ ่๑๏๎๋็๎โเ๒ ๏เ๐เ์ๅ๒๐ contains"
-
-#: ../syntax.c:4096
-msgid "E844: invalid cchar value"
-msgstr "E844: อๅไ๎๏๓๑๒่์๎ๅ ็ํเ๗ๅํ่ๅ cchar"
-
-#: ../syntax.c:4107
-msgid "E393: group[t]here not accepted here"
-msgstr "E393: วไๅ๑ ํๅ๋็ ่๑๏๎๋็๎โเ๒ group[t]here"
-
-#: ../syntax.c:4126
-#, c-format
-msgid "E394: Didn't find region item for %s"
-msgstr "E394: ๋ๅ์ๅํ๒ ๎แ๋เ๑๒่ ไ๋ %s ํๅ ํเ้ไๅํ"
-
-#: ../syntax.c:4188
-msgid "E397: Filename required"
-msgstr "E397: า๐ๅแ๓ๅ๒๑ ๓๊เ็เ๒ ่์ ๔เ้๋เ"
-
-#: ../syntax.c:4221
-msgid "E847: Too many syntax includes"
-msgstr "E847: ั๋่๘๊๎์ ์ํ๎ใ๎ ๑่ํ๒เ๊๑่๗ๅ๑๊่๕ โ๊๋๗ๅํ่้"
-
-#: ../syntax.c:4303
-#, c-format
-msgid "E789: Missing ']': %s"
-msgstr "E789: ฯ๐๎๏๓๙ๅํ๎ ']': %s"
-
-#: ../syntax.c:4531
-#, c-format
-msgid "E398: Missing '=': %s"
-msgstr "E398: ฯ๐๎๏๓๙ๅํ๎ '=': %s"
-
-#: ../syntax.c:4666
-#, c-format
-msgid "E399: Not enough arguments: syntax region %s"
-msgstr "E399: อๅ ๕โเ๒เๅ๒ ๏เ๐เ์ๅ๒๐๎โ: ๑่ํ๒เ๊๑่๗ๅ๑๊่้ ๐ๅใ่๎ํ %s"
-
-#: ../syntax.c:4870
-msgid "E848: Too many syntax clusters"
-msgstr "E848: ั๋่๘๊๎์ ์ํ๎ใ๎ ๑่ํ๒เ๊๑่๗ๅ๑๊่๕ ๊๋เ๑๒ๅ๐๎โ"
-
-#: ../syntax.c:4954
-msgid "E400: No cluster specified"
-msgstr "E400: ส๋เ๑๒ๅ๐ ํๅ ๓๊เ็เํ"
-
-#. end delimiter not found
-#: ../syntax.c:4986
-#, c-format
-msgid "E401: Pattern delimiter not found: %s"
-msgstr "E401: อๅ ํเ้ไๅํ ๐เ็ไๅ๋่๒ๅ๋ ๘เแ๋๎ํ๎โ: %s"
-
-#: ../syntax.c:5049
-#, c-format
-msgid "E402: Garbage after pattern: %s"
-msgstr "E402: ฬ๓๑๎๐ ๏๎๑๋ๅ ๘เแ๋๎ํเ: %s"
-
-#: ../syntax.c:5120
-msgid "E403: syntax sync: line continuations pattern specified twice"
-msgstr ""
-"E403: ั่ํ๕๐๎ํ่็เ๖่ ๑่ํ๒เ๊๑่๑เ: ๘เแ๋๎ํ ๏๐๎ไ๎๋ๆๅํ่้ ๑๒๐๎๊่ ๓๊เ็เํ ไโเๆไ๛"
-
-#: ../syntax.c:5169
-#, c-format
-msgid "E404: Illegal arguments: %s"
-msgstr "E404: อๅไ๎๏๓๑๒่์๛ๅ ๏เ๐เ์ๅ๒๐๛: %s"
-
-#: ../syntax.c:5217
-#, c-format
-msgid "E405: Missing equal sign: %s"
-msgstr "E405: ฯ๐๎๏๓๙ๅํ ็ํเ๊ ๐เโๅํ๑๒โเ: %s"
-
-#: ../syntax.c:5222
-#, c-format
-msgid "E406: Empty argument: %s"
-msgstr "E406: ฯ๓๑๒๎้ ๏เ๐เ์ๅ๒๐: %s"
-
-#: ../syntax.c:5240
-#, c-format
-msgid "E407: %s not allowed here"
-msgstr "E407: %s ํๅ ไ๎๏๓๑๊เๅ๒๑ โ ๒๎์ ์ๅ๑๒ๅ"
-
-#: ../syntax.c:5246
-#, c-format
-msgid "E408: %s must be first in contains list"
-msgstr "E408: %s ไ๎๋ๆํ๎ แ๛๒ ๏ๅ๐โ๛์ โ ๑๏่๑๊ๅ contains"
-
-#: ../syntax.c:5304
-#, c-format
-msgid "E409: Unknown group name: %s"
-msgstr "E409: อๅ่็โๅ๑๒ํเ ใ๐๓๏๏เ: %s"
-
-#: ../syntax.c:5512
-#, c-format
-msgid "E410: Invalid :syntax subcommand: %s"
-msgstr "E410: อๅ๏๐เโ่๋ํเ ๏๎ไ๊๎์เํไเ :syntax: %s"
-
-#: ../syntax.c:5854
-msgid ""
-" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
-msgstr ""
-" ยัลรฮ สฮห. ัฮฮาย. ฮาัาภูศษ ัะลฤอศษ ศฬ฿ ุภมหฮอ"
-
-#: ../syntax.c:6146
-msgid "E679: recursive loop loading syncolor.vim"
-msgstr "E679: ะๅ๊๓๐๑่โํเ ๏ๅ๒๋ ๏๐่ ็เใ๐๓็๊ๅ syncolor.vim"
-
-#: ../syntax.c:6256
-#, c-format
-msgid "E411: highlight group not found: %s"
-msgstr "E411: ร๐๓๏๏เ ๏๎ไ๑โๅ๒๊่ ๑่ํ๒เ๊๑่๑เ %s ํๅ ํเ้ไๅํเ"
-
-#: ../syntax.c:6278
-#, c-format
-msgid "E412: Not enough arguments: \":highlight link %s\""
-msgstr "E412: อๅ ๕โเ๒เๅ๒ ๏เ๐เ์ๅ๒๐๎โ: \":highlight link %s\""
-
-#: ../syntax.c:6284
-#, c-format
-msgid "E413: Too many arguments: \":highlight link %s\""
-msgstr "E413: ั๋่๘๊๎์ ์ํ๎ใ๎ ๏เ๐เ์ๅ๒๐๎โ: \":highlight link %s\""
-
-#: ../syntax.c:6302
-msgid "E414: group has settings, highlight link ignored"
-msgstr "E414: ำ ใ๐๓๏๏๛ ๅ๑๒ ํเ๑๒๐๎้๊่, ๏๐๎๏๓๑๊เๅ๒๑ highlight link"
-
-#: ../syntax.c:6367
-#, c-format
-msgid "E415: unexpected equal sign: %s"
-msgstr "E415: อๅ๎ๆ่ไเํํ๛้ ็ํเ๊ ๐เโๅํ๑๒โเ: %s"
-
-#: ../syntax.c:6395
-#, c-format
-msgid "E416: missing equal sign: %s"
-msgstr "E416: ฯ๐๎๏๓๙ๅํ ็ํเ๊ ๐เโๅํ๑๒โเ: %s"
-
-#: ../syntax.c:6418
-#, c-format
-msgid "E417: missing argument: %s"
-msgstr "E417: ฯ๐๎๏๓๙ๅํ ๏เ๐เ์ๅ๒๐: %s"
-
-#: ../syntax.c:6446
-#, c-format
-msgid "E418: Illegal value: %s"
-msgstr "E418: อๅไ๎๏๓๑๒่์๎ๅ ็ํเ๗ๅํ่ๅ: %s"
-
-#: ../syntax.c:6496
-msgid "E419: FG color unknown"
-msgstr "E419: อๅ่็โๅ๑๒ํ๛้ ๖โๅ๒ ๒ๅ๊๑๒เ"
-
-#: ../syntax.c:6504
-msgid "E420: BG color unknown"
-msgstr "E420: อๅ่็โๅ๑๒ํ๛้ ๖โๅ๒ ๔๎ํเ"
-
-#: ../syntax.c:6564
-#, c-format
-msgid "E421: Color name or number not recognized: %s"
-msgstr "E421: ศ์ ่๋่ ํ๎์ๅ๐ ๖โๅ๒เ ํๅ ่็โๅ๑๒ํ๎: %s"
-
-#: ../syntax.c:6714
-#, c-format
-msgid "E422: terminal code too long: %s"
-msgstr "E422: ั๋่๘๊๎์ ไ๋่ํํ๛้ ๊๎ไ ๒ๅ๐์่ํเ๋เ: %s"
-
-#: ../syntax.c:6753
-#, c-format
-msgid "E423: Illegal argument: %s"
-msgstr "E423: อๅไ๎๏๓๑๒่์๛้ ๏เ๐เ์ๅ๒๐: %s"
-
-#: ../syntax.c:6925
-msgid "E424: Too many different highlighting attributes in use"
-msgstr "E424: ศ๑๏๎๋็๓ๅ๒๑ ๑๋่๘๊๎์ ์ํ๎ใ๎ ๐เ็ํ๛๕ เ๒๐่แ๓๒๎โ ๏๎ไ๑โๅ๒๊่ ๑่ํ๒เ๊๑่๑เ"
-
-#: ../syntax.c:7427
-msgid "E669: Unprintable character in group name"
-msgstr "E669: อๅ๏ๅ๗เ๒ํ๛้ ๑่์โ๎๋ โ ่์ๅํ่ ใ๐๓๏๏๛"
-
-#: ../syntax.c:7434
-msgid "W18: Invalid character in group name"
-msgstr "W18: อๅไ๎๏๓๑๒่์๛้ ๑่์โ๎๋ โ ่์ๅํ่ ใ๐๓๏๏๛"
-
-#: ../syntax.c:7448
-msgid "E849: Too many highlight and syntax groups"
-msgstr "E849: ั๋่๘๊๎์ ์ํ๎ใ๎ ใ๐๓๏๏ ๏๎ไ๑โๅ๒๊่ ่ ๑่ํ๒เ๊๑่๑เ"
-
-#: ../tag.c:104
-msgid "E555: at bottom of tag stack"
-msgstr "E555: ยํ่็๓ ๑๒ๅ๊เ ์ๅ๒๎๊"
-
-#: ../tag.c:105
-msgid "E556: at top of tag stack"
-msgstr "E556: อเโๅ๐๕๓ ๑๒ๅ๊เ ์ๅ๒๎๊"
-
-#: ../tag.c:380
-msgid "E425: Cannot go before first matching tag"
-msgstr "E425: อๅโ๎็์๎ๆํ๎ ๏ๅ๐ๅ้๒่ โ ๏๎็่๖่ ไ๎ ๏ๅ๐โ๎้ ๑๎โ๏เไเ๙ๅ้ ์ๅ๒๊่"
-
-#: ../tag.c:504
-#, c-format
-msgid "E426: tag not found: %s"
-msgstr "E426: ฬๅ๒๊เ ํๅ ํเ้ไๅํเ: %s"
-
-#: ../tag.c:528
-msgid " # pri kind tag"
-msgstr " # ๏๐่ ๒่๏ ์ๅ๒๊เ"
-
-#: ../tag.c:531
-msgid "file\n"
-msgstr "๔เ้๋\n"
-
-#: ../tag.c:829
-msgid "E427: There is only one matching tag"
-msgstr "E427: ล๑๒ ๒๎๋๊๎ ๎ไํเ ๑๎โ๏เไเ๙เ ์ๅ๒๊เ"
-
-#: ../tag.c:831
-msgid "E428: Cannot go beyond last matching tag"
-msgstr "E428: อๅโ๎็์๎ๆํ๎ ๏ๅ๐ๅ้๒่ โ ๏๎็่๖่ ็เ ๏๎๑๋ๅไํๅ้ ๑๎โ๏เไเ๙ๅ้ ์ๅ๒๊๎้"
-
-#: ../tag.c:850
-#, c-format
-msgid "File \"%s\" does not exist"
-msgstr "ิเ้๋ \"%s\" ํๅ ๑๓๙ๅ๑๒โ๓ๅ๒"
-
-#. Give an indication of the number of matching tags
-#: ../tag.c:859
-#, c-format
-msgid "tag %d of %d%s"
-msgstr "์ๅ๒๊เ %d ่็ %d%s"
-
-#: ../tag.c:862
-msgid " or more"
-msgstr " ่ แ๎๋ๅๅ"
-
-#: ../tag.c:864
-msgid " Using tag with different case!"
-msgstr " ศ๑๏๎๋็๓ๅ๒๑ ์ๅ๒๊เ ๑ ๑่์โ๎๋เ์่ โ ไ๐๓ใ๎์ ๐ๅใ่๑๒๐ๅ!"
-
-#: ../tag.c:909
-#, c-format
-msgid "E429: File \"%s\" does not exist"
-msgstr "E429: ิเ้๋ \"%s\" ํๅ ๑๓๙ๅ๑๒โ๓ๅ๒"
-
-#. Highlight title
-#: ../tag.c:960
-msgid ""
-"\n"
-" # TO tag FROM line in file/text"
-msgstr ""
-"\n"
-" # ส ์ๅ๒๊ๅ ฮา ๑๒๐. โ ๔เ้๋ๅ/๒ๅ๊๑๒ๅ"
-
-#: ../tag.c:1303
-#, c-format
-msgid "Searching tags file %s"
-msgstr "ฯ๎่๑๊ โ ๔เ้๋ๅ ์ๅ๒๎๊ %s"
-
-#: ../tag.c:1545
-msgid "Ignoring long line in tags file"
-msgstr "ศใํ๎๐่๐๎โเํ่ๅ ไ๋่ํํ๎้ ๑๒๐๎๊่ โ ๔เ้๋ๅ tags"
-
-#: ../tag.c:1915
-#, c-format
-msgid "E431: Format error in tags file \"%s\""
-msgstr "E431: ฮ๘่แ๊เ ๔๎๐์เ๒เ โ ๔เ้๋ๅ ์ๅ๒๎๊ \"%s\""
-
-#: ../tag.c:1917
-#, c-format
-msgid "Before byte %<PRId64>"
-msgstr "ฯๅ๐ๅไ แเ้๒๎์ %<PRId64>"
-
-#: ../tag.c:1929
-#, c-format
-msgid "E432: Tags file not sorted: %s"
-msgstr "E432: ิเ้๋ ์ๅ๒๎๊ ํๅ ๎๒๑๎๐๒่๐๎โเํ: %s"
-
-#. never opened any tags file
-#: ../tag.c:1960
-msgid "E433: No tags file"
-msgstr "E433: ิเ้๋ ์ๅ๒๎๊ ํๅ ๎แํเ๐๓ๆๅํ"
-
-#: ../tag.c:2536
-msgid "E434: Can't find tag pattern"
-msgstr "E434: อๅ ํเ้ไๅํ ๘เแ๋๎ํ ์ๅ๒๊่"
-
-#: ../tag.c:2544
-msgid "E435: Couldn't find tag, just guessing!"
-msgstr "E435: ฬๅ๒๊เ ํๅ ํเ้ไๅํเ, ๏๛๒เๅ์๑ ๓ใเไเ๒!"
-
-#: ../tag.c:2797
-#, c-format
-msgid "Duplicate field name: %s"
-msgstr "ฯ๎โ๒๎๐๙ๅๅ๑ ่์ ๏๎๋: %s"
-
-#: ../term.c:1442
-msgid "' not known. Available builtin terminals are:"
-msgstr "' ํๅ ่็โๅ๑๒ๅํ. ฤ๎๑๒๓๏ํ๛ โ๑๒๐๎ๅํํ๛ๅ ๒ๅ๐์่ํเ๋๛:"
-
-#: ../term.c:1463
-msgid "defaulting to '"
-msgstr "๏๎ ๓์๎๋๗เํ่ '"
-
-#: ../term.c:1731
-msgid "E557: Cannot open termcap file"
-msgstr "E557: อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ ๔เ้๋ termcap"
-
-#: ../term.c:1735
-msgid "E558: Terminal entry not found in terminfo"
-msgstr "E558: ย terminfo ํๅ๒ ็เ๏่๑่ ๎แ ๒๎์ ๒ๅ๐์่ํเ๋ๅ"
-
-#: ../term.c:1737
-msgid "E559: Terminal entry not found in termcap"
-msgstr "E559: ย termcap ํๅ๒ ็เ๏่๑่ ๎แ ๒๎์ ๒ๅ๐์่ํเ๋ๅ"
-
-#: ../term.c:1878
-#, c-format
-msgid "E436: No \"%s\" entry in termcap"
-msgstr "E436: ย termcap ํๅ๒ ็เ๏่๑่ \"%s\""
-
-#: ../term.c:2249
-msgid "E437: terminal capability \"cm\" required"
-msgstr "E437: า๐ๅแ๓ๅ๒๑ ๑๏๎๑๎แํ๎๑๒ ๒ๅ๐์่ํเ๋เ \"cm\""
-
-#. Highlight title
-#: ../term.c:4376
-msgid ""
-"\n"
-"--- Terminal keys ---"
-msgstr ""
-"\n"
-"--- สํ๎๏๊่ ๒ๅ๐์่ํเ๋เ ---"
-
-#: ../ui.c:481
-msgid "Vim: Error reading input, exiting...\n"
-msgstr "Vim: ฮ๘่แ๊เ ๗๒ๅํ่ โโ๎ไเ, โ๛๕๎ไ...\n"
-
-#. This happens when the FileChangedRO autocommand changes the
-#. * file in a way it becomes shorter.
-#: ../undo.c:379
-#, fuzzy
-msgid "E881: Line count changed unexpectedly"
-msgstr "E834: อๅ๎ๆ่ไเํํ๎ ่็์ๅํ่๋๑ ๑๗ธ๒๗่๊ ๑๒๐๎๊"
-
-#: ../undo.c:627
-#, c-format
-msgid "E828: Cannot open undo file for writing: %s"
-msgstr "E828: อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ ๔เ้๋ ๎๒์ๅํ ไ๋ ็เ๏่๑่: %s"
-
-#: ../undo.c:717
-#, c-format
-msgid "E825: Corrupted undo file (%s): %s"
-msgstr "E825: ิเ้๋ ๎๒์ๅํ ๏๎โ๐ๅๆไธํ (%s): %s"
-
-#: ../undo.c:1039
-msgid "Cannot write undo file in any directory in 'undodir'"
-msgstr "อๅโ๎็์๎ๆํ๎ ็เ๏่๑เ๒ ๔เ้๋ ๎๒์ๅํ โ ๊เ๊๎์-๋่แ๎ ๊เ๒เ๋๎ใๅ ่็ 'undodir'"
-
-#: ../undo.c:1074
-#, c-format
-msgid "Will not overwrite with undo file, cannot read: %s"
-msgstr "ิเ้๋ ๎๒์ๅํ ํๅ ๏ๅ๐ๅ็เ๏่๑เํ, ํๅโ๎็์๎ๆํ๎ ๏๐๎๗่๒เ๒: %s"
-
-#: ../undo.c:1092
-#, c-format
-msgid "Will not overwrite, this is not an undo file: %s"
-msgstr "ฯๅ๐ๅ็เ๏่๑ ํๅ โ๛๏๎๋ํๅํเ, ๒๎ ํๅ ๔เ้๋ ๎๒์ๅํ: %s"
-
-#: ../undo.c:1108
-msgid "Skipping undo file write, nothing to undo"
-msgstr "ฯ๐๎๏๓๙ๅํเ ็เ๏่๑ ๔เ้๋เ ๎๒์ๅํ, ํๅ๗ๅใ๎ ๎๒์ๅํ๒"
-
-#: ../undo.c:1121
-#, c-format
-msgid "Writing undo file: %s"
-msgstr "วเ๏่๑ ๔เ้๋เ ๎๒์ๅํ: %s"
-
-#: ../undo.c:1213
-#, c-format
-msgid "E829: write error in undo file: %s"
-msgstr "E829: ฮ๘่แ๊เ ๏๐่ ็เ๏่๑่ ๔เ้๋เ ๎๒์ๅํ: %s"
-
-#: ../undo.c:1280
-#, c-format
-msgid "Not reading undo file, owner differs: %s"
-msgstr "ิเ้๋ ๎๒์ๅํ ํๅ ๏๐๎๗่๒เํ, ไ๐๓ใ๎้ โ๋เไๅ๋ๅ๖: %s"
-
-#: ../undo.c:1292
-#, c-format
-msgid "Reading undo file: %s"
-msgstr "ื๒ๅํ่ๅ ๔เ้๋เ ๎๒์ๅํ: %s"
-
-#: ../undo.c:1299
-#, c-format
-msgid "E822: Cannot open undo file for reading: %s"
-msgstr "E822: อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ ๔เ้๋ ๎๒์ๅํ ไ๋ ๗๒ๅํ่: %s"
-
-#: ../undo.c:1308
-#, c-format
-msgid "E823: Not an undo file: %s"
-msgstr "E823: ๒๎ ํๅ ๔เ้๋ ๎๒์ๅํ: %s"
-
-#: ../undo.c:1313
-#, c-format
-msgid "E824: Incompatible undo file: %s"
-msgstr "E824: อๅ๑๎โ์ๅ๑๒่์๛้ ๔เ้๋ ๎๒์ๅํ: %s"
-
-#: ../undo.c:1328
-msgid "File contents changed, cannot use undo info"
-msgstr "ศ็์ๅํ่๋๎๑ ๑๎ไๅ๐ๆ่์๎ๅ ๔เ้๋เ, ํๅโ๎็์๎ๆํ๎ ่๑๏๎๋็๎โเ๒ ่ํ๔๎๐์เ๖่ ๎๒์ๅํ"
-
-#: ../undo.c:1497
-#, c-format
-msgid "Finished reading undo file %s"
-msgstr "วเโๅ๐๘ๅํ๎ ๗๒ๅํ่ๅ ๔เ้๋เ ๎๒์ๅํ %s"
-
-#: ../undo.c:1586 ../undo.c:1812
-msgid "Already at oldest change"
-msgstr "ำๆๅ ํเ ๑เ์๎์ ๏ๅ๐โ๎์ ่็์ๅํๅํ่่"
-
-#: ../undo.c:1597 ../undo.c:1814
-msgid "Already at newest change"
-msgstr "ำๆๅ ํเ ๑เ์๎์ ๏๎๑๋ๅไํๅ์ ่็์ๅํๅํ่่"
-
-#: ../undo.c:1806
-#, c-format
-msgid "E830: Undo number %<PRId64> not found"
-msgstr "E830: อๅ ํเ้ไๅํเ ๎๒์ๅํเ ํ๎์ๅ๐ %<PRId64>"
-
-#: ../undo.c:1979
-msgid "E438: u_undo: line numbers wrong"
-msgstr "E438: u_undo: ํๅ๏๐เโ่๋ํ๛ๅ ํ๎์ๅ๐เ ๑๒๐๎๊"
-
-#: ../undo.c:2183
-msgid "more line"
-msgstr "๑๒๐. ไ๎แเโ๋ๅํเ"
-
-#: ../undo.c:2185
-msgid "more lines"
-msgstr "๑๒๐. ไ๎แเโ๋ๅํ๎"
-
-#: ../undo.c:2187
-msgid "line less"
-msgstr "๑๒๐. ๓ไเ๋ๅํเ"
-
-#: ../undo.c:2189
-msgid "fewer lines"
-msgstr "๑๒๐. ๓ไเ๋ๅํ๎"
-
-#: ../undo.c:2193
-msgid "change"
-msgstr "่็์."
-
-#: ../undo.c:2195
-msgid "changes"
-msgstr "่็์."
-
-#: ../undo.c:2225
-#, c-format
-msgid "%<PRId64> %s; %s #%<PRId64> %s"
-msgstr "%<PRId64> %s; %s #%<PRId64> %s"
-
-#: ../undo.c:2228
-msgid "before"
-msgstr "๏ๅ๐ๅไ"
-
-#: ../undo.c:2228
-msgid "after"
-msgstr "๏๎๑๋ๅ"
-
-#: ../undo.c:2325
-msgid "Nothing to undo"
-msgstr "อๅ๗ๅใ๎ ๎๒์ๅํ๒"
-
-# วเใ๎๋๎โ๎๊ ๒เแ๋่๖๛ :undolist
-#: ../undo.c:2330
-msgid "number changes when saved"
-msgstr " ํ๎์ๅ๐ ่็์ๅํ. ๊๎ใไเ ๑๎๕๐เํๅํ๎"
-
-#: ../undo.c:2360
-#, c-format
-msgid "%<PRId64> seconds ago"
-msgstr "%<PRId64> ๑ ํเ็เไ"
-
-#: ../undo.c:2372
-msgid "E790: undojoin is not allowed after undo"
-msgstr "E790: ฮแ๚ๅไ่ํๅํ่ๅ ๎๒์ๅํ ํๅ ไ๎๏๓๑๊เๅ๒๑ ๏๎๑๋ๅ ๎๒์ๅํ๛"
-
-#: ../undo.c:2466
-msgid "E439: undo list corrupt"
-msgstr "E439: ฯ๎โ๐ๅๆไธํ ๑๏่๑๎๊ ๎๒์ๅํ๛"
-
-#: ../undo.c:2495
-msgid "E440: undo line missing"
-msgstr "E440: ฯ๎๒ๅ๐ํเ ๑๒๐๎๊เ ๎๒์ๅํ๛"
-
-#: ../version.c:600
-msgid ""
-"\n"
-"Included patches: "
-msgstr ""
-"\n"
-"วเ๏๋เ๒๊่: "
-
-#: ../version.c:627
-msgid ""
-"\n"
-"Extra patches: "
-msgstr ""
-"\n"
-"ฤ๎๏๎๋ํ่๒ๅ๋ํ๛ๅ ็เ๏๋เ๒๊่: "
-
-#: ../version.c:639 ../version.c:864
-msgid "Modified by "
-msgstr "ั ่็์ๅํๅํ่์่, โํๅ๑ธํํ๛์่ "
-
-#: ../version.c:646
-msgid ""
-"\n"
-"Compiled "
-msgstr ""
-"\n"
-"ั๊๎์๏่๋่๐๎โเํ "
-
-#: ../version.c:649
-msgid "by "
-msgstr " "
-
-#: ../version.c:660
-msgid ""
-"\n"
-"Huge version "
-msgstr ""
-"\n"
-"ฮใ๐๎์ํเ โๅ๐๑่ "
-
-#: ../version.c:661
-msgid "without GUI."
-msgstr "แๅ็ ใ๐เ๔่๗ๅ๑๊๎ใ๎ ่ํ๒ๅ๐๔ๅ้๑เ."
-
-#: ../version.c:662
-msgid " Features included (+) or not (-):\n"
-msgstr " ย๊๋๗ธํํ๛ๅ (+) ่ ๎๒๊๋๗ธํํ๛ๅ (-) ๎๑๎แๅํํ๎๑๒่:\n"
-
-#: ../version.c:667
-msgid " system vimrc file: \""
-msgstr " ๎แ๙ๅ๑่๑๒ๅ์ํ๛้ ๔เ้๋ vimrc: \""
-
-#: ../version.c:672
-msgid " user vimrc file: \""
-msgstr " ๏๎๋็๎โเ๒ๅ๋๑๊่้ ๔เ้๋ vimrc: \""
-
-#: ../version.c:677
-msgid " 2nd user vimrc file: \""
-msgstr " โ๒๎๐๎้ ๏๎๋็๎โเ๒ๅ๋๑๊่้ ๔เ้๋ vimrc: \""
-
-#: ../version.c:682
-msgid " 3rd user vimrc file: \""
-msgstr " ๒๐ๅ๒่้ ๏๎๋็๎โเ๒ๅ๋๑๊่้ ๔เ้๋ vimrc: \""
-
-#: ../version.c:687
-msgid " user exrc file: \""
-msgstr " ๏๎๋็๎โเ๒ๅ๋๑๊่้ ๔เ้๋ exrc: \""
-
-#: ../version.c:692
-msgid " 2nd user exrc file: \""
-msgstr " โ๒๎๐๎้ ๏๎๋็๎โเ๒ๅ๋๑๊่้ ๔เ้๋ exrc: \""
-
-#: ../version.c:699
-msgid " fall-back for $VIM: \""
-msgstr " ็ํเ๗ๅํ่ๅ $VIM ๏๎ ๓์๎๋๗เํ่: \""
-
-#: ../version.c:705
-msgid " f-b for $VIMRUNTIME: \""
-msgstr " ็ํเ๗ๅํ่ๅ $VIMRUNTIME ๏๎ ๓์๎๋๗เํ่: \""
-
-#: ../version.c:709
-msgid "Compilation: "
-msgstr "ฯเ๐เ์ๅ๒๐๛ ๊๎์๏่๋๖่่: "
-
-#: ../version.c:712
-msgid "Linking: "
-msgstr "ัแ๎๐๊เ: "
-
-#: ../version.c:717
-msgid " DEBUG BUILD"
-msgstr " ฮาหภฤฮือภ฿ ัมฮะสภ"
-
-#: ../version.c:767
-msgid "VIM - Vi IMproved"
-msgstr "VIM — Vi IMproved (๓๋๓๗๘ๅํํ๛้ Vi)"
-
-#: ../version.c:769
-msgid "version "
-msgstr "โๅ๐๑่ "
-
-#: ../version.c:770
-msgid "by Bram Moolenaar et al."
-msgstr "ม๐เ์ ฬ๎๎๋ๅํเเ๐ ่ ไ๐๓ใ่ๅ"
-
-#: ../version.c:774
-msgid "Vim is open source and freely distributable"
-msgstr "Vim ๒๎ ๑โ๎แ๎ไํ๎ ๐เ๑๏๐๎๑๒๐เํๅ์เ ๏๐๎ใ๐เ์์เ ๑ ๎๒๊๐๛๒๛์ ๊๎ไ๎์"
-
-#: ../version.c:776
-msgid "Help poor children in Uganda!"
-msgstr "มๅไํ๛์ ไๅ๒์ โ ำใเํไๅ ํ๓ๆํเ โเ๘เ ๏๎์๎๙!"
-
-#: ../version.c:777
-msgid "type :help iccf<Enter> for information "
-msgstr "ํเแๅ๐่๒ๅ :help iccf<Enter> ไ๋ ไ๎๏๎๋ํ่๒ๅ๋ํ๎้ ่ํ๔๎๐์เ๖่่"
-
-#: ../version.c:779
-msgid "type :q<Enter> to exit "
-msgstr "ํเแๅ๐่๒ๅ :q<Enter> ๗๒๎แ๛ โ๛้๒่ ่็ ๏๐๎ใ๐เ์์๛ "
-
-#: ../version.c:780
-msgid "type :help<Enter> or <F1> for on-line help"
-msgstr "ํเแๅ๐่๒ๅ :help<Enter> ่๋่ <F1> ไ๋ ๏๎๋๓๗ๅํ่ ๑๏๐เโ๊่ "
-
-#: ../version.c:781
-msgid "type :help version7<Enter> for version info"
-msgstr "ํเแๅ๐่๒ๅ :help version7<Enter> ๗๒๎แ๛ ๓็ํเ๒ ๎แ ๒๎้ โๅ๐๑่่ "
-
-#: ../version.c:784
-msgid "Running in Vi compatible mode"
-msgstr "ะเแ๎๒เ โ Vi-๑๎โ์ๅ๑๒่์๎์ ๐ๅๆ่์ๅ"
-
-#: ../version.c:785
-msgid "type :set nocp<Enter> for Vim defaults"
-msgstr "ํเแๅ๐่๒ๅ :set nocp<Enter> ไ๋ ๏ๅ๐ๅ๕๎ไเ โ ๐ๅๆ่์ Vim "
-
-#: ../version.c:786
-msgid "type :help cp-default<Enter> for info on this"
-msgstr "ํเแๅ๐่๒ๅ :help cp-default<Enter> ไ๋ ไ๎๏๎๋ํ่๒ๅ๋ํ๎้ ่ํ๔๎๐์เ๖่่"
-
-#: ../version.c:827
-msgid "Sponsor Vim development!"
-msgstr "ฯ๎์๎ใ่๒ๅ โ ๐เ็๐เแ๎๒๊ๅ Vim!"
-
-#: ../version.c:828
-msgid "Become a registered Vim user!"
-msgstr "ั๒เํ๒ๅ ็เ๐ๅใ่๑๒๐่๐๎โเํํ๛์ ๏๎๋็๎โเ๒ๅ๋ๅ์ Vim!"
-
-#: ../version.c:831
-msgid "type :help sponsor<Enter> for information "
-msgstr "ํเแๅ๐่๒ๅ :help sponsor<Enter> ไ๋ ๏๎๋๓๗ๅํ่ ่ํ๔๎๐์เ๖่่ "
-
-#: ../version.c:832
-msgid "type :help register<Enter> for information "
-msgstr "ํเแๅ๐่๒ๅ :help register<Enter> ไ๋ ๏๎๋๓๗ๅํ่ ่ํ๔๎๐์เ๖่่ "
-
-#: ../version.c:834
-msgid "menu Help->Sponsor/Register for information "
-msgstr "์ๅํ ั๏๐เโ๊เ->ฯ๎์๎๙/ะๅใ่๑๒๐เ๖่ ไ๋ ๏๎๋๓๗ๅํ่ ่ํ๔๎๐์เ๖่่ "
-
-#: ../window.c:119
-msgid "Already only one window"
-msgstr "อเ ๊๐เํๅ โ๑ๅใ๎ ๎ไํ๎ ๎๊ํ๎"
-
-#: ../window.c:224
-msgid "E441: There is no preview window"
-msgstr "E441: ฮ๊ํ๎ ๏๐ๅไ๏๐๎๑์๎๒๐เ ๎๒๑๓๒๑๒โ๓ๅ๒"
-
-#: ../window.c:559
-msgid "E442: Can't split topleft and botright at the same time"
-msgstr "E442: ฮ๊ํ๎ ํๅ ์๎ๆๅ๒ แ๛๒ ๎ไํ๎โ๐ๅ์ๅํํ๎ ๑๋ๅโเ โโๅ๐๕๓ ่ ๑๏๐เโเ โํ่็๓"
-
-#: ../window.c:1228
-msgid "E443: Cannot rotate when another window is split"
-msgstr "E443: อๅโ๎็์๎ๆํ๎ ๏๎์ๅํ๒ ์ๅ๑๒เ์่, ๏๎๊เ ไ๐๓ใ๎ๅ ๎๊ํ๎ ๐เ็ไๅ๋ๅํ๎"
-
-#: ../window.c:1803
-msgid "E444: Cannot close last window"
-msgstr "E444: อๅ๋็ ็เ๊๐๛๒ ๏๎๑๋ๅไํๅๅ ๎๊ํ๎"
-
-#: ../window.c:1810
-msgid "E813: Cannot close autocmd window"
-msgstr "E813: อๅ๋็ ็เ๊๐๛๒ ๎๊ํ๎ เโ๒๎๊๎์เํไ"
-
-#: ../window.c:1814
-msgid "E814: Cannot close window, only autocmd window would remain"
-msgstr "E814: อๅ๋็ ็เ๊๐๛๒ ๎๊ํ๎, ๎๑๒เํๅ๒๑ ๒๎๋๊๎ ๎๊ํ๎ เโ๒๎๊๎์เํไ"
-
-#: ../window.c:2717
-msgid "E445: Other window contains changes"
-msgstr "E445: ย ไ๐๓ใ๎์ ๎๊ํๅ ๅ๑๒ ํๅ๑๎๕๐เํธํํ๛ๅ ่็์ๅํๅํ่"
-
-#: ../window.c:4805
-msgid "E446: No file name under cursor"
-msgstr "E446: อๅ๒ ่์ๅํ่ ๔เ้๋เ โ ๏๎็่๖่่ ๊๓๐๑๎๐เ"
-
-#~ msgid "E831: bf_key_init() called with empty password"
-#~ msgstr "E831: bf_key_init() โ๛็โเํ ๑ ๏๓๑๒๛์ ๏เ๐๎๋ๅ์"
-
-#~ msgid "E820: sizeof(uint32_t) != 4"
-#~ msgstr "E820: sizeof(uint32_t) != 4"
-
-#~ msgid "E817: Blowfish big/little endian use wrong"
-#~ msgstr ""
-#~ "E817: อๅ๏๐เโ่๋ํ๎ๅ ่๑๏๎๋็๎โเํ่ๅ ๎แ๐เ๒ํ๎ใ๎/๏๐์๎ใ๎ ๏๎๐ไ๊เ แเ้๒ โ Blowfish"
-
-#~ msgid "E818: sha256 test failed"
-#~ msgstr "E818: อๅ ๓ไเ๋๎๑ โ๛๏๎๋ํ่๒ ๒ๅ๑๒ sha256"
-
-#~ msgid "E819: Blowfish test failed"
-#~ msgstr "E819: อๅ ๓ไเ๋๎๑ โ๛๏๎๋ํ่๒ ๒ๅ๑๒ Blowfish"
-
-#~ msgid "Patch file"
-#~ msgstr "ิเ้๋-็เ๏๋เ๒๊เ"
-
-#~ msgid ""
-#~ "&OK\n"
-#~ "&Cancel"
-#~ msgstr ""
-#~ "&OK\n"
-#~ "&C ฮ๒์ๅํเ"
-
-#~ msgid "E240: No connection to Vim server"
-#~ msgstr "E240: อๅ๒ ๑โ็่ ๑ ๑ๅ๐โๅ๐๎์ Vim"
-
-#~ msgid "E241: Unable to send to %s"
-#~ msgstr "E241: อๅ ์๎ใ๓ ๎๒๏๐เโ่๒ ๑๎๎แ๙ๅํ่ๅ ไ๋ %s"
-
-#~ msgid "E277: Unable to read a server reply"
-#~ msgstr "E277: ัๅ๐โๅ๐ ํๅ ๎๒โๅ๗เๅ๒"
-
-#~ msgid "E258: Unable to send to client"
-#~ msgstr "E258: อๅ ์๎ใ๓ ๎๒โๅ๒่๒ ๊๋่ๅํ๒๓"
-
-#~ msgid "Save As"
-#~ msgstr "ั๎๕๐เํ่๒ ๊เ๊"
-
-#~ msgid "Edit File"
-#~ msgstr "ะๅไเ๊๒่๐๎โเํ่ๅ ๔เ้๋เ"
-
-#~ msgid " (NOT FOUND)"
-#~ msgstr " (อล อภษฤลอฮ)"
-
-#~ msgid "Source Vim script"
-#~ msgstr "ย๛๏๎๋ํ่๒ ๑๖ๅํเ๐่้ Vim"
-
-#~ msgid "unknown"
-#~ msgstr "ํๅ่็โๅ๑๒ํ๎"
-
-#~ msgid "Edit File in new window"
-#~ msgstr "ะๅไเ๊๒่๐๎โเ๒ ๔เ้๋ โ ํ๎โ๎์ ๎๊ํๅ"
-
-#~ msgid "Append File"
-#~ msgstr "ฤ๎แเโ่๒ ๔เ้๋"
-
-#~ msgid "Window position: X %d, Y %d"
-#~ msgstr "ฯ๎๋๎ๆๅํ่ๅ ๎๊ํเ: X %d, Y %d"
-
-#~ msgid "Save Redirection"
-#~ msgstr "ฯๅ๐ๅํเ๏๐เโ๋ๅํ่ๅ ็เ๏่๑่"
-
-#~ msgid "Save View"
-#~ msgstr "ั๎๕๐เํๅํ่ๅ โ่ไเ"
-
-#~ msgid "Save Session"
-#~ msgstr "ั๎๕๐เํๅํ่ๅ ๑ๅเํ๑เ"
-
-#~ msgid "Save Setup"
-#~ msgstr "ั๎๕๐เํๅํ่ๅ ํเ๑๒๐๎ๅ๊"
-
-#~ msgid "E809: #< is not available without the +eval feature"
-#~ msgstr "E809: #< ํๅ ไ๎๑๒๓๏ํ๎ แๅ็ ๎๑๎แๅํํ๎๑๒่ +eval"
-
-#~ msgid "E196: No digraphs in this version"
-#~ msgstr "E196: ย ๒๎้ โๅ๐๑่่ ไ่ใ๐เ๔๛ ํๅ ๐เแ๎๒เ๒"
-
-#~ msgid "is a device (disabled with 'opendevice' option)"
-#~ msgstr "โ๋ๅ๒๑ ๓๑๒๐๎้๑๒โ๎์ (๎๒๊๋๗ๅํ๎ ๏๐่ ๎๏๖่่ 'opendevice')"
-
-#~ msgid "Reading from stdin..."
-#~ msgstr "ื๒ๅํ่ๅ ่็ ๑๒เํไเ๐๒ํ๎ใ๎ ๏๎๒๎๊เ โโ๎ไเ stdin..."
-
-#~ msgid "[blowfish]"
-#~ msgstr "[blowfish]"
-
-#~ msgid "[crypted]"
-#~ msgstr "[็เ๘่๔๐๎โเํ๎]"
-
-#~ msgid "E821: File is encrypted with unknown method"
-#~ msgstr "E821: ิเ้๋ ็เ๘่๔๐๎โเํ ํๅ่็โๅ๑๒ํ๛์ ์ๅ๒๎ไ๎์"
-
-#~ msgid "NetBeans disallows writes of unmodified buffers"
-#~ msgstr "NetBeans ํๅ ๏๎็โ๎๋ๅ๒ โ๛๏๎๋ํ๒ ็เ๏่๑ ํๅ่็์ๅํธํํ๛๕ แ๓๔ๅ๐๎โ"
-
-#~ msgid "Partial writes disallowed for NetBeans buffers"
-#~ msgstr "ืเ๑๒่๗ํเ ็เ๏่๑ แ๓๔ๅ๐๎โ NetBeans ํๅ ไ๎๏๓๑๊เๅ๒๑"
-
-#~ msgid "writing to device disabled with 'opendevice' option"
-#~ msgstr "็เ๏่๑ โ ๓๑๒๐๎้๑๒โ๎ ๎๒๊๋๗ๅํเ ๏๐่ ๎๏๖่่ 'opendevice'"
-
-#~ msgid "E460: The resource fork would be lost (add ! to override)"
-#~ msgstr ""
-#~ "E460: ยๅ๒โ ๐ๅ๑๓๐๑เ แ๓ไๅ๒ ๏๎๒ๅ๐ํเ (ไ๎แเโ๒ๅ !, ๗๒๎แ๛ ๎แ๎้๒่ ๏๐๎โๅ๐๊๓)"
-
-#~ msgid "E851: Failed to create a new process for the GUI"
-#~ msgstr "E851: อๅโ๎็์๎ๆํ๎ ๑๎็ไเ๒ ํ๎โ๛้ ๏๐๎๖ๅ๑๑ ไ๋ ใ๐เ๔. ่ํ๒ๅ๐๔ๅ้๑เ"
-
-#~ msgid "E852: The child process failed to start the GUI"
-#~ msgstr "E852: ฯ๐๎๖ๅ๑๑๓-๏๎๒๎์๊๓ ํๅ ๓ไเ๋๎๑ ็เ๏๓๑๒่๒ ใ๐เ๔. ่ํ๒ๅ๐๔ๅ้๑"
-
-#~ msgid "E229: Cannot start the GUI"
-#~ msgstr "E229: อๅโ๎็์๎ๆํ๎ ๏ๅ๐ๅ้๒่ โ ๐ๅๆ่์ ใ๐เ๔่๗ๅ๑๊๎ใ๎ ่ํ๒ๅ๐๔ๅ้๑เ"
-
-#~ msgid "E230: Cannot read from \"%s\""
-#~ msgstr "E230: อๅโ๎็์๎ๆํ๎ โ๛๏๎๋ํ่๒ ๗๒ๅํ่ๅ \"%s\""
-
-#~ msgid "E665: Cannot start GUI, no valid font found"
-#~ msgstr ""
-#~ "E665: อๅโ๎็์๎ๆํ๎ ๏ๅ๐ๅ้๒่ โ ๐ๅๆ่์ ใ๐เ๔. ่ํ๒ๅ๐๔ๅ้๑เ, ํๅ๏๐เโ่๋ํ๎ ็เไเํ๛ "
-#~ "๘๐่๔๒๛"
-
-#~ msgid "E231: 'guifontwide' invalid"
-#~ msgstr "E231: อๅ๏๐เโ่๋ํ๎ๅ ็ํเ๗ๅํ่ๅ ๎๏๖่่ 'guifontwide'"
-
-#~ msgid "E599: Value of 'imactivatekey' is invalid"
-#~ msgstr "E599: อๅ๏๐เโ่๋ํ๎ๅ ็ํเ๗ๅํ่ๅ ๎๏๖่่ 'imactivatekey'"
-
-#~ msgid "E254: Cannot allocate color %s"
-#~ msgstr "E254: อๅโ๎็์๎ๆํ๎ ํเ็ํเ๗่๒ ๖โๅ๒ %s"
-
-#~ msgid "No match at cursor, finding next"
-#~ msgstr "อๅ๒ ๑๎โ๏เไๅํ่ ๏๎ไ ๊๓๐๑๎๐๎์, ๏๎่๑๊ ๑๋ๅไ๓๙ๅใ๎"
-
-#~ msgid "<cannot open> "
-#~ msgstr "<ํๅ๋็ ๎๒๊๐๛๒> "
-
-#~ msgid "E616: vim_SelFile: can't get font %s"
-#~ msgstr "E616: vim_SelFile: ๘๐่๔๒ %s ํๅ ํเ้ไๅํ"
-
-#~ msgid "E614: vim_SelFile: can't return to current directory"
-#~ msgstr "E614: vim_SelFile: โ๎็โ๐เ๒ โ ๒ๅ๊๓๙่้ ๊เ๒เ๋๎ใ ํๅโ๎็์๎ๆๅํ"
-
-#~ msgid "Pathname:"
-#~ msgstr "ฯ๓๒ ๊ ๔เ้๋๓:"
-
-#~ msgid "E615: vim_SelFile: can't get current directory"
-#~ msgstr "E615: vim_SelFile: ํๅ ์๎ใ๓ ํเ้๒่ ๒ๅ๊๓๙่้ ๊เ๒เ๋๎ใ"
-
-#~ msgid "OK"
-#~ msgstr "ฤเ"
-
-#~ msgid "Cancel"
-#~ msgstr "ฮ๒์ๅํเ"
-
-#~ msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
-#~ msgstr "ฯ๎๋๎๑เ ๏๐๎๊๐๓๒๊่: ํๅ ์๎ใ๓ ๎๏๐ๅไๅ๋่๒ ใๅ๎์ๅ๒๐่ ๏๎๋็๓ํ๊เ"
-
-#~ msgid "Vim dialog"
-#~ msgstr "ฤ่เ๋๎ใ๎โ๎ๅ ๎๊ํ๎ Vim"
-
-#~ msgid "E232: Cannot create BalloonEval with both message and callback"
-#~ msgstr ""
-#~ "E232: \"ฯ๓็๛๐\" ไ๋ โ๛๗่๑๋ๅํ่้, โ๊๋๗เ๙่้ ่ ๑๎๎แ๙ๅํ่ๅ, ่ ๎แ๐เ๒ํ๛้ "
-#~ "โ๛็๎โ, ํๅ ์๎ๆๅ๒ แ๛๒ ๑๎็ไเํ"
-
-#~ msgid "Input _Methods"
-#~ msgstr "ฬๅ๒๎ไ๛ ยโ๎ไเ"
-
-#~ msgid "VIM - Search and Replace..."
-#~ msgstr "VIM — ฯ๎่๑๊ ่ ็เ์ๅํเ..."
-
-#~ msgid "VIM - Search..."
-#~ msgstr "VIM — ฯ๎่๑๊..."
-
-#~ msgid "Find what:"
-#~ msgstr "ื๒๎ ่๙ๅ์:"
-
-#~ msgid "Replace with:"
-#~ msgstr "อเ ๗๒๎ ็เ์ๅํๅ์:"
-
-#~ msgid "Match whole word only"
-#~ msgstr "า๎๋๊๎ ๒๎๗ํ๛ๅ ๑๎๎๒โๅ๒๑๒โ่"
-
-#~ msgid "Match case"
-#~ msgstr "ะๅใ่๑๒๐๎็เโ่๑่์๛ๅ ๑๎๎๒โๅ๒๑๒โ่"
-
-#~ msgid "Direction"
-#~ msgstr "อเ๏๐เโ๋ๅํ่ๅ"
-
-#~ msgid "Up"
-#~ msgstr "ยโๅ๐๕"
-
-#~ msgid "Down"
-#~ msgstr "ยํ่็"
-
-#~ msgid "Find Next"
-#~ msgstr "อเ้๒่ ๑๋ๅไ๓๙ๅๅ"
-
-#~ msgid "Replace"
-#~ msgstr "วเ์ๅํเ"
-
-#~ msgid "Replace All"
-#~ msgstr "วเ์ๅํ่๒ โ๑ๅ"
-
-#~ msgid "Vim: Received \"die\" request from session manager\n"
-#~ msgstr "Vim: ฯ๎๋๓๗ๅํ ็เ๏๐๎๑ ํเ ๏๐ๅ๊๐เ๙ๅํ่ๅ ๐เแ๎๒๛ ๎๒ ไ่๑๏ๅ๒๗ๅ๐เ ๑ๅเํ๑๎โ\n"
-
-#~ msgid "Close"
-#~ msgstr "วเ๊๐๛๒"
-
-#~ msgid "New tab"
-#~ msgstr "อ๎โเ โ๊๋เไ๊เ"
-
-#~ msgid "Open Tab..."
-#~ msgstr "ฮ๒๊๐๛๒ โ๊๋เไ๊๓..."
-
-#~ msgid "Vim: Main window unexpectedly destroyed\n"
-#~ msgstr "Vim: ฮ๑ํ๎โํ๎ๅ ๎๊ํ๎ แ๛๋๎ ํๅ๎ๆ่ไเํํ๎ ็เ๊๐๛๒๎\n"
-
-#~ msgid "&Filter"
-#~ msgstr "&ิ่๋๒๐"
-
-#~ msgid "&Cancel"
-#~ msgstr "ฮ&๒์ๅํเ"
-
-#~ msgid "Directories"
-#~ msgstr "สเ๒เ๋๎ใ่"
-
-#~ msgid "Filter"
-#~ msgstr "ิ่๋๒๐"
-
-#~ msgid "&Help"
-#~ msgstr "&ั๏๐เโ๊เ"
-
-#~ msgid "Files"
-#~ msgstr "ิเ้๋๛"
-
-#~ msgid "&OK"
-#~ msgstr "&ฤเ"
-
-#~ msgid "Selection"
-#~ msgstr "ย๛ไๅ๋ๅํ่ๅ"
-
-#~ msgid "Find &Next"
-#~ msgstr "อเ้๒่ &๑๋ๅไ๓๙ๅๅ"
-
-#~ msgid "&Replace"
-#~ msgstr "วเ&์ๅํเ"
-
-#~ msgid "Replace &All"
-#~ msgstr "วเ์ๅํ่๒ &โ๑ๅ"
-
-#~ msgid "&Undo"
-#~ msgstr "ฮ&๒์ๅํเ"
-
-#~ msgid "E671: Cannot find window title \"%s\""
-#~ msgstr "E671: ฮ๊ํ๎ ๑ ็เใ๎๋๎โ๊๎์ \"%s\" ํๅ ๎แํเ๐๓ๆๅํ๎"
-
-#~ msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
-#~ msgstr "E243: ฯเ๐เ์ๅ๒๐ ํๅ ๏๎ไไๅ๐ๆ่โเๅ๒๑: \"-%s\"; ่๑๏๎๋็๓้๒ๅ โๅ๐๑่ OLE."
-
-#~ msgid "E672: Unable to open window inside MDI application"
-#~ msgstr "E672: อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ ๎๊ํ๎ โํ๓๒๐่ ๏๐่๋๎ๆๅํ่ MDI"
-
-#~ msgid "Close tab"
-#~ msgstr "วเ๊๐๛๒ โ๊๋เไ๊๓"
-
-#~ msgid "Open tab..."
-#~ msgstr "ฮ๒๊๐๛๒ โ๊๋เไ๊๓..."
-
-#~ msgid "Find string (use '\\\\' to find a '\\')"
-#~ msgstr "ฯ๎่๑๊ ๑๒๐๎๊่ (่๑๏๎๋็๓้๒ๅ '\\\\' ไ๋ ๏๎่๑๊เ '\\')"
-
-#~ msgid "Find & Replace (use '\\\\' to find a '\\')"
-#~ msgstr "ฯ๎่๑๊ ่ ็เ์ๅํเ (่๑๏๎๋็๓้๒ๅ '\\\\' ไ๋ ๏๎่๑๊เ '\\')"
-
-#~ msgid "Not Used"
-#~ msgstr "อๅ ่๑๏๎๋็๓ๅ๒๑"
-
-#~ msgid "Directory\t*.nothing\n"
-#~ msgstr "สเ๒เ๋๎ใ\t*.ํ่๗ๅใ๎\n"
-
-#~ msgid ""
-#~ "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
-#~ msgstr ""
-#~ "Vim E458: อๅโ๎็์๎ๆํ๎ โ๛ไๅ๋่๒ ็เ๏่๑ โ ๒เแ๋่๖ๅ ๖โๅ๒เ, ํๅ๊๎๒๎๐๛ๅ ๖โๅ๒เ "
-#~ "์๎ใ๓๒ ๎๒๎แ๐เๆเ๒๑ ํๅ๏๐เโ่๋ํ๎"
-
-#~ msgid "E250: Fonts for the following charsets are missing in fontset %s:"
-#~ msgstr ""
-#~ "E250: ย ํเแ๎๐ๅ ๘๐่๔๒๎โ %s ๎๒๑๓๒๑๒โ๓๒ ๘๐่๔๒๛ ไ๋ ๑๋ๅไ๓๙่๕ ๊๎ไ่๐๎โ๎๊:"
-
-#~ msgid "E252: Fontset name: %s"
-#~ msgstr "E252: อเแ๎๐ ๘๐่๔๒๎โ: %s"
-
-#~ msgid "Font '%s' is not fixed-width"
-#~ msgstr "ุ๐่๔๒ '%s' ํๅ โ๋ๅ๒๑ ์๎ํ๎๘่๐่ํํ๛์"
-
-#~ msgid "E253: Fontset name: %s"
-#~ msgstr "E253: อเแ๎๐ ๘๐่๔๒๎โ: %s"
-
-#~ msgid "Font0: %s"
-#~ msgstr "Font0: %s"
-
-#~ msgid "Font1: %s"
-#~ msgstr "Font1: %s"
-
-#~ msgid "Font%<PRId64> width is not twice that of font0"
-#~ msgstr ""
-#~ "ุ่๐่ํเ ๘๐่๔๒เ font%<PRId64> ไ๎๋ๆํเ แ๛๒ โไโ๎ๅ แ๎๋๘ๅ ๘่๐่ํ๛ ๘๐่๔๒เ font0"
-
-#~ msgid "Font0 width: %<PRId64>"
-#~ msgstr "ุ่๐่ํเ ๘๐่๔๒เ font0: %<PRId64>"
-
-#~ msgid "Font1 width: %<PRId64>"
-#~ msgstr "ุ่๐่ํเ ๘๐่๔๒เ font1: %<PRId64>"
-
-#~ msgid "Invalid font specification"
-#~ msgstr "อๅ๏๐เโ่๋ํ๎ๅ ๎๏๐ๅไๅ๋ๅํ่ๅ ๘๐่๔๒เ"
-
-#~ msgid "&Dismiss"
-#~ msgstr "ฮ&๒๊๋๎ํ่๒"
-
-#~ msgid "no specific match"
-#~ msgstr "ํๅ๒ ๑๏ๅ๖่เ๋ํ๎ใ๎ ๑๎โ๏เไๅํ่"
-
-#~ msgid "Vim - Font Selector"
-#~ msgstr "Vim — ย๛แ๎๐ ๘๐่๔๒เ"
-
-#~ msgid "Name:"
-#~ msgstr "อเ็โเํ่ๅ:"
-
-#~ msgid "Show size in Points"
-#~ msgstr "ฯ๎๊เ็๛โเ๒ ๐เ็์ๅ๐ โ ๏๓ํ๊๒เ๕"
-
-#~ msgid "Encoding:"
-#~ msgstr "ส๎ไ่๐๎โ๊เ:"
-
-#~ msgid "Font:"
-#~ msgstr "ุ๐่๔๒:"
-
-#~ msgid "Style:"
-#~ msgstr "ั๒่๋:"
-
-#~ msgid "Size:"
-#~ msgstr "ะเ็์ๅ๐:"
-
-#~ msgid "E256: Hangul automata ERROR"
-#~ msgstr "E256: ฮุศมสภ เโ๒๎์เ๒่๊่ ีเํใ๛๋"
-
-#~ msgid "E563: stat error"
-#~ msgstr "E563: ฮ๘่แ๊เ stat"
-
-#~ msgid "E625: cannot open cscope database: %s"
-#~ msgstr "E625: อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ แเ็๓ ไเํํ๛๕ cscope: %s"
-
-#~ msgid "E626: cannot get cscope database information"
-#~ msgstr "E626: ศํ๔๎๐์เ๖่ ๎ แเ็ๅ ไเํํ๛๕ cscope ํๅ ไ๎๑๒๓๏ํเ"
-
-#~ msgid "Lua library cannot be loaded."
-#~ msgstr "ม่แ๋่๎๒ๅ๊เ Lua ํๅ ์๎ๆๅ๒ แ๛๒ ็เใ๐๓ๆๅํเ."
-
-#~ msgid "cannot save undo information"
-#~ msgstr "ํๅโ๎็์๎ๆํ๎ ๑๎๕๐เํ่๒ ่ํ๔๎๐์เ๖่ ๎แ ๎๒์ๅํๅ ๎๏ๅ๐เ๖่่"
-
-#~ msgid ""
-#~ "E815: Sorry, this command is disabled, the MzScheme libraries could not "
-#~ "be loaded."
-#~ msgstr ""
-#~ "E815: ส ๑๎ๆเ๋ๅํ่ ๒เ ๊๎์เํไเ ํๅ ๐เแ๎๒เๅ๒, ๏๎๑๊๎๋๊๓ ํๅ ็เใ๐๓ๆๅํเ "
-#~ "แ่แ๋่๎๒ๅ๊เ MzScheme"
-
-#~ msgid "invalid expression"
-#~ msgstr "ํๅ๏๐เโ่๋ํ๎ๅ โ๛๐เๆๅํ่ๅ"
-
-#~ msgid "expressions disabled at compile time"
-#~ msgstr "โ๛๐เๆๅํ่ ๎๒๊๋๗ๅํ๛ ๏๐่ ๊๎์๏่๋๖่่"
-
-#~ msgid "hidden option"
-#~ msgstr "๑๊๐๛๒เ ๎๏๖่"
-
-#~ msgid "unknown option"
-#~ msgstr "ํๅ่็โๅ๑๒ํเ ๎๏๖่"
-
-#~ msgid "window index is out of range"
-#~ msgstr "่ํไๅ๊๑ ๎๊ํเ ็เ ๏๐ๅไๅ๋เ์่ ไ่เ๏เ็๎ํเ"
-
-#~ msgid "couldn't open buffer"
-#~ msgstr "ํๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ แ๓๔ๅ๐"
-
-#~ msgid "cannot delete line"
-#~ msgstr "ํๅโ๎็์๎ๆํ๎ ๓ไเ๋่๒ ๑๒๐๎๊๓"
-
-#~ msgid "cannot replace line"
-#~ msgstr "ํๅโ๎็์๎ๆํ๎ ็เ์ๅํ่๒ ๑๒๐๎๊๓"
-
-#~ msgid "cannot insert line"
-#~ msgstr "ํๅโ๎็์๎ๆํ๎ โ๑๒เโ่๒ ๑๒๐๎๊๓"
-
-#~ msgid "string cannot contain newlines"
-#~ msgstr "๑๒๐๎๊เ ํๅ ์๎ๆๅ๒ ๑๎ไๅ๐ๆเ๒ ๑่์โ๎๋ ํ๎โ๎้ ๑๒๐๎๊่"
-
-#~ msgid "error converting Scheme values to Vim"
-#~ msgstr "ํๅโ๎็์๎ๆํ๎ ๏๐ๅ๎แ๐เ็๎โเ๒ ็ํเ๗ๅํ่ Scheme โ Vim"
-
-#~ msgid "Vim error: ~a"
-#~ msgstr "๎๘่แ๊เ Vim: ~a"
-
-#~ msgid "Vim error"
-#~ msgstr "๎๘่แ๊เ Vim"
-
-#~ msgid "buffer is invalid"
-#~ msgstr "ํๅ๏๐เโ่๋ํ๛้ แ๓๔ๅ๐"
-
-#~ msgid "window is invalid"
-#~ msgstr "ํๅ๏๐เโ่๋ํ๎ๅ ๎๊ํ๎"
-
-#~ msgid "linenr out of range"
-#~ msgstr "ํ๎์ๅ๐ ๑๒๐๎๊่ ็เ ๏๐ๅไๅ๋เ์่ ไ่เ๏เ็๎ํเ"
-
-#~ msgid "not allowed in the Vim sandbox"
-#~ msgstr "ํๅ ไ๎๏๓๑๊เๅ๒๑ โ ๏ๅ๑๎๗ํ่๖ๅ Vim"
-
-#~ msgid "E836: This Vim cannot execute :python after using :py3"
-#~ msgstr ""
-#~ "E836: ฤเํํ๛้ Vim ํๅ ์๎ๆๅ๒ โ๛๏๎๋ํ่๒ :python ๏๎๑๋ๅ ่๑๏๎๋็๎โเํ่ :py3"
-
-#~ msgid ""
-#~ "E263: Sorry, this command is disabled, the Python library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E263: ส ๑๎ๆเ๋ๅํ่ ๒เ ๊๎์เํไเ ํๅ ๐เแ๎๒เๅ๒, ๏๎๑๊๎๋๊๓ ํๅ ็เใ๐๓ๆๅํเ "
-#~ "แ่แ๋่๎๒ๅ๊เ Python"
-
-#~ msgid "E659: Cannot invoke Python recursively"
-#~ msgstr "E659: อๅโ๎็์๎ๆํ๎ โ๛๏๎๋ํ่๒ ๐ๅ๊๓๐๑่โํ๛้ โ๛็๎โ Python"
-
-#~ msgid "E837: This Vim cannot execute :py3 after using :python"
-#~ msgstr ""
-#~ "E837: ฤเํํ๛้ Vim ํๅ ์๎ๆๅ๒ โ๛๏๎๋ํ่๒ :py3 ๏๎๑๋ๅ ่๑๏๎๋็๎โเํ่ :python"
-
-#~ msgid "E265: $_ must be an instance of String"
-#~ msgstr "E265: $_ ไ๎๋ๆๅํ แ๛๒ ๊็ๅ์๏๋๐๎์ ่๋่ ๑๒๐๎๊๎้"
-
-#~ msgid ""
-#~ "E266: Sorry, this command is disabled, the Ruby library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E266: ส ๑๎ๆเ๋ๅํ่ ๒เ ๊๎์เํไเ ํๅ ๐เแ๎๒เๅ๒, ๏๎๑๊๎๋๊๓ ํๅ ็เใ๐๓ๆๅํเ "
-#~ "แ่แ๋่๎๒ๅ๊เ Ruby"
-
-#~ msgid "E267: unexpected return"
-#~ msgstr "E267: อๅ๎ๆ่ไเํํ๛้ return"
-
-#~ msgid "E268: unexpected next"
-#~ msgstr "E268: อๅ๎ๆ่ไเํํ๛้ next"
-
-#~ msgid "E269: unexpected break"
-#~ msgstr "E269: อๅ๎ๆ่ไเํํ๛้ break"
-
-#~ msgid "E270: unexpected redo"
-#~ msgstr "E270: อๅ๎ๆ่ไเํํ๛้ redo"
-
-#~ msgid "E271: retry outside of rescue clause"
-#~ msgstr "E271: retry โํๅ ๎๏ๅ๐เ๒๎๐เ rescue"
-
-#~ msgid "E272: unhandled exception"
-#~ msgstr "E272: อๅ๎แ๐เแ๎๒เํํ๎ๅ ่๑๊๋๗ๅํ่ๅ"
-
-#~ msgid "E273: unknown longjmp status %d"
-#~ msgstr "E273: อๅ่็โๅ๑๒ํ๎ๅ ๑๎๑๒๎ํ่ๅ longjmp %d"
-
-#~ msgid "Toggle implementation/definition"
-#~ msgstr "ฯๅ๐ๅ๊๋๗ๅํ่ๅ ์ๅๆไ๓ ๐ๅเ๋่็เ๖่ๅ้/๎๏๐ๅไๅ๋ๅํ่ๅ์"
-
-#~ msgid "Show base class of"
-#~ msgstr "ฯ๎๊เ็เ๒ ๎๑ํ๎โํ๎้ ๊๋เ๑๑"
-
-#~ msgid "Show overridden member function"
-#~ msgstr "ฯ๎๊เ็เ๒ ๏ๅ๐ๅใ๐๓ๆๅํํ๛ๅ ๔๓ํ๊๖่่"
-
-#~ msgid "Retrieve from file"
-#~ msgstr "ฯ๎๋๓๗่๒ ่็ ๔เ้๋เ"
-
-#~ msgid "Retrieve from project"
-#~ msgstr "ฯ๎๋๓๗่๒ ่็ ๏๐๎ๅ๊๒เ"
-
-#~ msgid "Retrieve from all projects"
-#~ msgstr "ฯ๎๋๓๗่๒ ่็ โ๑ๅ๕ ๏๐๎ๅ๊๒๎โ"
-
-#~ msgid "Retrieve"
-#~ msgstr "ฯ๎๋๓๗่๒"
-
-#~ msgid "Show source of"
-#~ msgstr "ฯ๎๊เ็เ๒ ่๑๕๎ไํ๛้ ๊๎ไ"
-
-#~ msgid "Find symbol"
-#~ msgstr "อเ้๒่ ๑่์โ๎๋"
-
-#~ msgid "Browse class"
-#~ msgstr "ฯ๐๎๑์๎๒๐ ๊๋เ๑๑เ"
-
-#~ msgid "Show class in hierarchy"
-#~ msgstr "ฯ๎๊เ็เ๒ ๊๋เ๑๑ โ ่ๅ๐เ๐๕่่"
-
-#~ msgid "Show class in restricted hierarchy"
-#~ msgstr "ฯ๎๊เ็เ๒ ๊๋เ๑๑ โ ๎ใ๐เํ่๗ๅํํ๎้ ่ๅ๐เ๐๕่่"
-
-#~ msgid "Xref refers to"
-#~ msgstr "Xref ๑๑๛๋เๅ๒๑ ํเ"
-
-#~ msgid "Xref referred by"
-#~ msgstr "ั๑๛๋๊เ ํเ xref ่็"
-
-#~ msgid "Xref has a"
-#~ msgstr "Xref ่์ๅๅ๒"
-
-#~ msgid "Xref used by"
-#~ msgstr "Xref ่๑๏๎๋็๓ๅ๒๑"
-
-#~ msgid "Show docu of"
-#~ msgstr "ฯ๎๊เ็เ๒ docu"
-
-#~ msgid "Generate docu for"
-#~ msgstr "ั๎็ไเ๒ docu"
-
-#~ msgid ""
-#~ "Cannot connect to SNiFF+. Check environment (sniffemacs must be found in "
-#~ "$PATH).\n"
-#~ msgstr ""
-#~ "อๅโ๎็์๎ๆํ๎ ๏๎ไ๑๎ๅไ่ํ่๒๑ ๊ SNiFF+. ฯ๐๎โๅ๐๒ๅ ํเ๑๒๐๎้๊่ ๎๊๐๓ๆๅํ่."
-#~ "(sniffemacs ไ๎๋ๆํ๛ แ๛๒ ๓๊เ็เํ๛ โ ๏ๅ๐ๅ์ๅํํ๎้ $PATH).\n"
-
-#~ msgid "E274: Sniff: Error during read. Disconnected"
-#~ msgstr "E274: Sniff: ฮ๘่แ๊เ โ๎ โ๐ๅ์ ๗๒ๅํ่. ฮ๒๑๎ๅไ่ํๅํ่ๅ"
-
-#~ msgid "SNiFF+ is currently "
-#~ msgstr "ย ํเ๑๒๎๙่้ ์๎์ๅํ๒ SNiFF+ "
-
-#~ msgid "not "
-#~ msgstr "ํๅ "
-
-#~ msgid "connected"
-#~ msgstr "๏๎ไ๑๎ๅไ่ํธํ"
-
-#~ msgid "E275: Unknown SNiFF+ request: %s"
-#~ msgstr "E275: อๅ่็โๅ๑๒ํ๛้ ็เ๏๐๎๑ SNiFF+: %s"
-
-#~ msgid "E276: Error connecting to SNiFF+"
-#~ msgstr "E276: ฮ๘่แ๊เ ๑๎ๅไ่ํๅํ่ ๑๎ SNiFF+"
-
-#~ msgid "E278: SNiFF+ not connected"
-#~ msgstr "E278: SNiFF+ ํๅ ๏๎ไ๑๎ๅไ่ํธํ"
-
-#~ msgid "E279: Not a SNiFF+ buffer"
-#~ msgstr "E279: ๒๎ ํๅ แ๓๔ๅ๐ SNiFF+"
-
-#~ msgid "Sniff: Error during write. Disconnected"
-#~ msgstr "Sniff: ฮ๘่แ๊เ โ๎ โ๐ๅ์ ็เ๏่๑่. ฮ๒๑๎ๅไ่ํๅํ่ๅ"
-
-#~ msgid "invalid buffer number"
-#~ msgstr "ํๅ๏๐เโ่๋ํ๛้ ํ๎์ๅ๐ แ๓๔ๅ๐เ"
-
-#~ msgid "not implemented yet"
-#~ msgstr "๏๎๊เ ํๅ ๐ๅเ๋่็๎โเํ๎"
-
-#~ msgid "cannot set line(s)"
-#~ msgstr "ํๅโ๎็์๎ๆํ๎ ํเ็ํเ๗่๒ ๑๒๐๎๊๓ ่๋่ ๑๒๐๎๊่"
-
-#~ msgid "invalid mark name"
-#~ msgstr "ํๅ๏๐เโ่๋ํ๎ๅ ่์ ๎๒์ๅ๒๊่"
-
-#~ msgid "mark not set"
-#~ msgstr "๎๒์ๅ๒๊เ ํๅ ๓๑๒เํ๎โ๋ๅํเ"
-
-#~ msgid "row %d column %d"
-#~ msgstr "๐ไ %d ๊๎๋๎ํ๊เ %d"
-
-#~ msgid "cannot insert/append line"
-#~ msgstr "ํๅโ๎็์๎ๆํ๎ โ๑๒เโ่๒ ่๋่ ไ๎แเโ่๒ ๑๒๐๎๊๓"
-
-#~ msgid "line number out of range"
-#~ msgstr "ํ๎์ๅ๐ ๑๒๐๎๊่ ็เ ๏๐ๅไๅ๋เ์่ ไ่เ๏เ็๎ํเ"
-
-#~ msgid "unknown flag: "
-#~ msgstr "ํๅ่็โๅ๑๒ํ๛้ ๔๋เใ: "
-
-#~ msgid "unknown vimOption"
-#~ msgstr "ํๅ่็โๅ๑๒ํเ vimOption"
-
-#~ msgid "keyboard interrupt"
-#~ msgstr "๊๋เโ่เ๒๓๐ํ๎ๅ ๏๐ๅ๐๛โเํ่ๅ"
-
-#~ msgid "vim error"
-#~ msgstr "๎๘่แ๊เ VIM"
-
-#~ msgid "cannot create buffer/window command: object is being deleted"
-#~ msgstr ""
-#~ "ํๅโ๎็์๎ๆํ๎ ๑๎็ไเ๒ ๊๎์เํไ๓ แ๓๔ๅ๐เ ่๋่ ๎๊ํเ: ๎แ๚ๅ๊๒ โ ๏๐๎๖ๅ๑๑ๅ ๓ไเ๋ๅํ่"
-
-#~ msgid ""
-#~ "cannot register callback command: buffer/window is already being deleted"
-#~ msgstr ""
-#~ "ํๅโ๎็์๎ๆํ๎ ็เ๐ๅใ่๑๒๐่๐๎โเ๒ ๊๎์เํไ๓ ๑ ๎แ๐เ๒ํ๛์ โ๛็๎โ๎์: แ๓๔ๅ๐ ่๋่ ๎๊ํ๎ โ "
-#~ "๏๐๎๖ๅ๑๑ๅ ๓ไเ๋ๅํ่"
-
-#~ msgid ""
-#~ "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-"
-#~ "dev@vim.org"
-#~ msgstr ""
-#~ "E280: สะศาศืลัสภ฿ ฮุศมสภ TCL: ๏๎โ๐ๅๆไธํ ๑๏่๑๎๊ ๑๑๛๋๎๊?! ั๎๎แ๙่๒ๅ ๎แ ๒๎์ "
-#~ "๏๎ เไ๐ๅ๑๓ vim-dev@vim.org"
-
-#~ msgid "cannot register callback command: buffer/window reference not found"
-#~ msgstr ""
-#~ "ํๅโ๎็์๎ๆํ๎ ็เ๐ๅใ่๑๒๐่๐๎โเ๒ ๊๎์เํไ๓ ๑ ๎แ๐เ๒ํ๛์ โ๛็๎โ๎์: ๑๑๛๋๊เ ํเ แ๓๔ๅ๐ "
-#~ "่๋่ ๎๊ํ๎ ํๅ ๎แํเ๐๓ๆๅํเ"
-
-#~ msgid ""
-#~ "E571: Sorry, this command is disabled: the Tcl library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E571: ส ๑๎ๆเ๋ๅํ่ ๒เ ๊๎์เํไเ ํๅ ๐เแ๎๒เๅ๒, ๏๎๑๊๎๋๊๓ ํๅ ็เใ๐๓ๆๅํเ "
-#~ "แ่แ๋่๎๒ๅ๊เ Tcl"
-
-#~ msgid "E572: exit code %d"
-#~ msgstr "E572: ส๎ไ โ๛๕๎ไเ %d"
-
-#~ msgid "cannot get line"
-#~ msgstr "ํๅโ๎็์๎ๆํ๎ ๏๎๋๓๗่๒ ๑๒๐๎๊๓"
-
-#~ msgid "Unable to register a command server name"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ็เ๐ๅใ่๑๒๐่๐๎โเ๒ ่์ ๑ๅ๐โๅ๐เ ๊๎์เํไ"
-
-#~ msgid "E248: Failed to send command to the destination program"
-#~ msgstr "E248: อๅ ๓ไเ๋เ๑ ๎๒๏๐เโ๊เ ๊๎์เํไ๛ โ ไ๐๓ใ๓ ๏๐๎ใ๐เ์์๓"
-
-#~ msgid "E573: Invalid server id used: %s"
-#~ msgstr "E573: ศ๑๏๎๋็๓ๅ๒๑ ํๅ๏๐เโ่๋ํ๛้ id ๑ๅ๐โๅ๐เ: %s"
-
-#~ msgid "E251: VIM instance registry property is badly formed. Deleted!"
-#~ msgstr ""
-#~ "E251: อๅ๏๐เโ่๋ํ๎ ๑๔๎๐์่๐๎โเํ๎ ็ํเ๗ๅํ่ๅ ไเํํ๎ใ๎ ๏๐๎๖ๅ๑๑เ VIM โ ๐ๅๅ๑๒๐ๅ. "
-#~ "ำไเ๋ๅํ๎!"
-
-#~ msgid "netbeans is not supported with this GUI\n"
-#~ msgstr "NetBeans ํๅ ๏๎ไไๅ๐ๆ่โเๅ๒๑ ๑ ๒่์ ใ๐เ๔่๗ๅ๑๊่์ ่ํ๒ๅ๐๔ๅ้๑๎์\n"
-
-#~ msgid "This Vim was not compiled with the diff feature."
-#~ msgstr ""
-#~ "ฤเํํ๛้ Vim แ๛๋ ๑๊๎์๏่๋่๐๎โเํ ๑ โ๛๊๋๗ๅํํ๎้ ๎๑๎แๅํํ๎๑๒ ๏๐๎๑์๎๒๐เ ๎๒๋่๗่้"
-
-#~ msgid "'-nb' cannot be used: not enabled at compile time\n"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ่๑๏๎๋็๎โเ๒ '-nb': ํๅ โ๊๋๗ๅํ๎ ๏๐่ ๊๎์๏่๋๖่่\n"
-
-#~ msgid "Vim: Error: Failure to start gvim from NetBeans\n"
-#~ msgstr "Vim: ฮ๘่แ๊เ: อๅ ๓ไเ๋๎๑ ็เ๏๓๑๒่๒ gvim ่็ NetBeans\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Where case is ignored prepend / to make flag upper case"
-#~ msgstr ""
-#~ "\n"
-#~ "ล๑๋่ ๐ๅใ่๑๒๐ ่ใํ๎๐่๐๓ๅ๒๑, ไ๎แเโ๒ๅ ๏ๅ๐ๅไ ๔๋เใ๎์ / ไ๋ โๅ๐๕ํๅใ๎ ๐ๅใ่๑๒๐เ"
-
-#~ msgid "-register\t\tRegister this gvim for OLE"
-#~ msgstr "-register\t\tวเ๐ๅใ่๑๒๐่๐๎โเ๒ ๒๎๒ gvim ไ๋ OLE"
-
-#~ msgid "-unregister\t\tUnregister gvim for OLE"
-#~ msgstr "-unregister\t\tฮ๒๊๋๗่๒ ๐ๅใ่๑๒๐เ๖่ ไเํํ๎ใ๎ gvim ไ๋ OLE"
-
-#~ msgid "-g\t\t\tRun using GUI (like \"gvim\")"
-#~ msgstr "-g\t\t\tวเ๏๓๑๒่๒ ๑ ใ๐เ๔่๗ๅ๑๊่์ ่ํ๒ๅ๐๔ๅ้๑๎์ (๊เ๊ \"gvim\")"
-
-#~ msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
-#~ msgstr ""
-#~ "-f ่๋่ --nofork\tย เ๊๒่โํ๎้ ็เไเ๗ๅ: อๅ โ๛๏๎๋ํ๒ fork ๏๐่ ็เ๏๓๑๊ๅ GUI"
-
-#~ msgid "-f\t\t\tDon't use newcli to open window"
-#~ msgstr "-f\t\t\tอๅ ่๑๏๎๋็๎โเ๒ newcli ไ๋ ๎๒๊๐๛๒่ ๎๊ํเ"
-
-#~ msgid "-dev <device>\t\tUse <device> for I/O"
-#~ msgstr "-dev <๓๑๒๐๎้๑๒โ๎>\t\tศ๑๏๎๋็๎โเ๒ ไ๋ I/O ๓๊เ็เํํ๎ๅ <๓๑๒๐๎้๑๒โ๎>"
-
-#~ msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
-#~ msgstr "-U <gvimrc>\t\tศ๑๏๎๋็๎โเ๒ <gvimrc> โ์ๅ๑๒๎ ๋แ๛๕ ๔เ้๋๎โ .gvimrc"
-
-#~ msgid "-x\t\t\tEdit encrypted files"
-#~ msgstr "-x\t\t\tะๅไเ๊๒่๐๎โเํ่ๅ ็เ๘่๔๐๎โเํํ๛๕ ๔เ้๋๎โ"
-
-#~ msgid "-display <display>\tConnect vim to this particular X-server"
-#~ msgstr "-display <๊๐เํ>\tฯ๎ไ๑๎ๅไ่ํ่๒ VIM ๊ ๓๊เ็เํํ๎์๓ X-๑ๅ๐โๅ๐๓"
-
-#~ msgid "-X\t\t\tDo not connect to X server"
-#~ msgstr "-X\t\t\tอๅ โ๛๏๎๋ํ๒ ๑๎ๅไ่ํๅํ่ๅ ๑ ๑ๅ๐โๅ๐๎์ X"
-
-#~ msgid "--remote <files>\tEdit <files> in a Vim server if possible"
-#~ msgstr ""
-#~ "--remote <๔เ้๋๛>\tฯ๎ โ๎็์๎ๆํ๎๑๒่ ๐ๅไเ๊๒่๐๎โเ๒ <๔เ้๋๛> ํเ ๑ๅ๐โๅ๐ๅ Vim"
-
-#~ msgid "--remote-silent <files> Same, don't complain if there is no server"
-#~ msgstr "--remote-silent <๔เ้๋๛> า๎ ๆๅ, ํ๎ แๅ็ ๆเ๋๎แ ํเ ๎๒๑๓๒๑๒โ่ๅ ๑ๅ๐โๅ๐เ"
-
-#~ msgid ""
-#~ "--remote-wait <files> As --remote but wait for files to have been edited"
-#~ msgstr ""
-#~ "--remote-wait <๔เ้๋๛> า๎ ๆๅ, ๗๒๎ ่ --remote, ํ๎ ๑ ๎ๆ่ไเํ่ๅ์ ็เโๅ๐๘ๅํ่"
-
-#~ msgid ""
-#~ "--remote-wait-silent <files> Same, don't complain if there is no server"
-#~ msgstr ""
-#~ "--remote-wait-silent <๔เ้๋๛> า๎ ๆๅ, ํ๎ แๅ็ ๆเ๋๎แ ํเ ๎๒๑๓๒๑๒โ่ๅ ๑ๅ๐โๅ๐เ"
-
-#~ msgid ""
-#~ "--remote-tab[-wait][-silent] <files> As --remote but use tab page per "
-#~ "file"
-#~ msgstr ""
-#~ "--remote-tab[-wait][-silent] <๔เ้๋๛> า๎ ๆๅ, ๗๒๎ ่ --remote, ํ๎ ๑ "
-#~ "โ๊๋เไ๊เ์่"
-
-#~ msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
-#~ msgstr "--remote-send <๊ํ๎๏๊่>\tฮ๒๏๐เโ่๒ <๊ํ๎๏๊่> ํเ ๑ๅ๐โๅ๐ Vim ่ โ๛้๒่"
-
-#~ msgid ""
-#~ "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
-#~ msgstr ""
-#~ "--remote-expr <โ๛๐เๆ>\tย๛๗่๑๋่๒ <โ๛๐เๆ> ํเ ๑ๅ๐โๅ๐ๅ Vim ่ ํเ๏ๅ๗เ๒เ๒"
-
-#~ msgid "--serverlist\t\tList available Vim server names and exit"
-#~ msgstr ""
-#~ "--serverlist\t\tฯ๎๊เ็เ๒ ๑๏่๑๎๊ ่์ธํ ๑ๅ๐โๅ๐๎โ Vim ่ ็เโๅ๐๘่๒ ๐เแ๎๒๓"
-
-#~ msgid "--servername <name>\tSend to/become the Vim server <name>"
-#~ msgstr ""
-#~ "--servername <่์>\tฮ๒๏๐เโ่๒ ํเ/๑๒เ๒ ๑ๅ๐โๅ๐๎์ Vim ๑ ๓๊เ็เํํ๛์ <่์ๅํๅ์>"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Motif version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ฯเ๐เ์ๅ๒๐๛ ไ๋ gvim (โๅ๐๑่ Motif):\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (neXtaw version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ฯเ๐เ์ๅ๒๐๛ ไ๋ gvim (โๅ๐๑่ neXtaw):\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Athena version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ฯเ๐เ์ๅ๒๐๛ ไ๋ gvim (โๅ๐๑่ Athena):\n"
-
-#~ msgid "-display <display>\tRun vim on <display>"
-#~ msgstr "-display <ไ่๑๏๋ๅ้>\tวเ๏๓๑๒่๒ VIM ํเ ๓๊เ็เํํ๎์ <ไ่๑๏๋ๅๅ>"
-
-#~ msgid "-iconic\t\tStart vim iconified"
-#~ msgstr "-iconic\t\tวเ๏๓๑๒่๒ VIM โ ๑โธ๐ํ๓๒๎์ โ่ไๅ"
-
-#~ msgid "-background <color>\tUse <color> for the background (also: -bg)"
-#~ msgstr ""
-#~ "-background <๖โๅ๒>\tศ๑๏๎๋็๎โเ๒ ๓๊เ็เํํ๛้ <๖โๅ๒> ไ๋ ๔๎ํเ (๒เ๊ๆๅ: -bg)"
-
-#~ msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
-#~ msgstr ""
-#~ "-foreground <๖โๅ๒>\tศ๑๏๎๋็๎โเ๒ <๖โๅ๒> ไ๋ ๎แ๛๗ํ๎ใ๎ ๒ๅ๊๑๒เ (๒เ๊ๆๅ: -fg)"
-
-#~ msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
-#~ msgstr ""
-#~ "-font <๘๐่๔๒>\t\tศ๑๏๎๋็๎โเ๒ <๘๐่๔๒> ไ๋ ๎แ๛๗ํ๎ใ๎ ๒ๅ๊๑๒เ (๒เ๊ๆๅ: -fn)"
-
-#~ msgid "-boldfont <font>\tUse <font> for bold text"
-#~ msgstr "-boldfont <๘๐่๔๒>\tศ๑๏๎๋็๎โเ๒ <๘๐่๔๒> ไ๋ ๆ่๐ํ๎ใ๎ ๒ๅ๊๑๒เ"
-
-#~ msgid "-italicfont <font>\tUse <font> for italic text"
-#~ msgstr "-italicfont <๘๐่๔๒>\tศ๑๏๎๋็๎โเ๒ <๘๐่๔๒> ไ๋ ํเ๊๋๎ํํ๎ใ๎ ๒ๅ๊๑๒เ"
-
-#~ msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
-#~ msgstr ""
-#~ "-geometry <ใๅ๎์ๅ๒๐่>\tศ๑๏๎๋็๎โเ๒ ํเ๗เ๋ํ๓ <ใๅ๎์ๅ๒๐่> (๒เ๊ๆๅ: -geom)"
-
-#~ msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
-#~ msgstr "-borderwidth <๘่๐่ํเ>\tศ๑๏๎๋็๎โเ๒ <๘่๐่ํ๓> แ๎๐ไ๐เ (๒เ๊ๆๅ: -bw)"
-
-#~ msgid ""
-#~ "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
-#~ msgstr ""
-#~ "-scrollbarwidth <๘่๐่ํเ> ศ๑๏๎๋็๎โเ๒ ๘่๐่ํ๓ ๏๎๋๎๑๛ ๏๐๎๊๐๓๒๊่ (๒เ๊ๆๅ: -sw)"
-
-#~ msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
-#~ msgstr "-menuheight <โ๛๑๎๒เ>\tศ๑๏๎๋็๎โเ๒ <โ๛๑๎๒๓> ์ๅํ (๒เ๊ๆๅ: -mh)"
-
-#~ msgid "-reverse\t\tUse reverse video (also: -rv)"
-#~ msgstr "-reverse\t\tศ๑๏๎๋็๎โเ๒ ่ํโๅ๐๑ํ๛้ โ่ไๅ๎๐ๅๆ่์ (๒เ๊ๆๅ: -rv)"
-
-#~ msgid "+reverse\t\tDon't use reverse video (also: +rv)"
-#~ msgstr "+reverse\t\tอๅ ่๑๏๎๋็๎โเ๒ ่ํโๅ๐๑ํ๛้ โ่ไๅ๎๐ๅๆ่์ (๒เ๊ๆๅ: +rv)"
-
-#~ msgid "-xrm <resource>\tSet the specified resource"
-#~ msgstr "-xrm <๐ๅ๑๓๐๑>\tำ๑๒เํ๎โ่๒ ๓๊เ็เํํ๛้ <๐ๅ๑๓๐๑>"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (GTK+ version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ฯเ๐เ์ๅ๒๐๛ ไ๋ gvim (โๅ๐๑่ GTK+):\n"
-
-#~ msgid "-display <display>\tRun vim on <display> (also: --display)"
-#~ msgstr ""
-#~ "-display <ไ่๑๏๋ๅ้>\tวเ๏๓๑๒่๒ VIM ํเ ๓๊เ็เํํ๎์ <ไ่๑๏๋ๅๅ> (๒เ๊ๆๅ: --"
-#~ "display)"
-
-#~ msgid "--role <role>\tSet a unique role to identify the main window"
-#~ msgstr ""
-#~ "--role <๐๎๋>\tำ๑๒เํ๎โ่๒ ๓ํ่๊เ๋ํ๓ <๐๎๋> ไ๋ ่ไๅํ๒่๔่๊เ๖่่ ใ๋เโํ๎ใ๎ "
-#~ "๎๊ํเ"
-
-#~ msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
-#~ msgstr "--socketid <xid>\tฮ๒๊๐๛๒ Vim โํ๓๒๐่ ไ๐๓ใ๎ใ๎ ๊๎์๏๎ํๅํ๒เ GTK"
-
-#~ msgid "--echo-wid\t\tMake gvim echo the Window ID on stdout"
-#~ msgstr ""
-#~ "--echo-wid\t\tย๛โๅ๑๒่ Window ID ไ๋ gvim ํเ ๑๒เํไเ๐๒ํ๛้ ๏๎๒๎๊ โ๛โ๎ไเ"
-
-#~ msgid "-P <parent title>\tOpen Vim inside parent application"
-#~ msgstr "-P <็เใ๎๋๎โ๎๊ ๐๎ไ่๒ๅ๋>\tฮ๒๊๐๛๒ Vim โ ๐๎ไ่๒ๅ๋๑๊๎์ ๏๐่๋๎ๆๅํ่่"
-
-#~ msgid "--windowid <HWND>\tOpen Vim inside another win32 widget"
-#~ msgstr "--windowid <HWND>\tฮ๒๊๐๛๒ Vim โํ๓๒๐่ ไ๐๓ใ๎ใ๎ ๊๎์๏๎ํๅํ๒เ win32"
-
-#~ msgid "No display"
-#~ msgstr "อๅ๒ ไ่๑๏๋ๅ"
-
-#~ msgid ": Send failed.\n"
-#~ msgstr ": ฮ๒๏๐เโ๊เ ํๅ ๓ไเ๋เ๑.\n"
-
-#~ msgid ": Send failed. Trying to execute locally\n"
-#~ msgstr ": ฮ๒๏๐เโ๊เ ํๅ ๓ไเ๋เ๑. ฯ๎๏๛๒๊เ ์ๅ๑๒ํ๎ใ๎ โ๛๏๎๋ํๅํ่\n"
-
-#~ msgid "%d of %d edited"
-#~ msgstr "๎๒๐ๅไเ๊๒่๐๎โเํ๎ %d ่็ %d"
-
-#~ msgid "No display: Send expression failed.\n"
-#~ msgstr "อๅ๒ ไ่๑๏๋ๅ: ๎๒๏๐เโ๊เ โ๛๐เๆๅํ่ ํๅ ๓ไเ๋เ๑.\n"
-
-#~ msgid ": Send expression failed.\n"
-#~ msgstr ": ฮ๒๏๐เโ๊เ โ๛๐เๆๅํ่ ํๅ ๓ไเ๋เ๑.\n"
-
-#~ msgid "E543: Not a valid codepage"
-#~ msgstr "E543: อๅไ๎๏๓๑๒่์๎ๅ ่์ ๊๎ไ่๐๎โ๊่"
-
-#~ msgid "E284: Cannot set IC values"
-#~ msgstr "E284: อๅโ๎็์๎ๆํ๎ ํเ็ํเ๗่๒ ็ํเ๗ๅํ่ ๊๎ํ๒ๅ๊๑๒เ โโ๎ไเ"
-
-#~ msgid "E285: Failed to create input context"
-#~ msgstr "E285: อๅโ๎็์๎ๆํ๎ ๑๎็ไเ๒ ๊๎ํ๒ๅ๊๑๒ โโ๎ไเ"
-
-#~ msgid "E286: Failed to open input method"
-#~ msgstr "E286: อๅ๓ไเ๗ํเ ๏๎๏๛๒๊เ ๎๒๊๐๛๒ ์ๅ๒๎ไ โโ๎ไเ"
-
-#~ msgid "E287: Warning: Could not set destroy callback to IM"
-#~ msgstr ""
-#~ "E287: ฯ๐ๅไ๓๏๐ๅๆไๅํ่ๅ: ํๅโ๎็์๎ๆํ๎ ํเ็ํเ๗่๒ ๎แ๐. โ๛็๎โ ๓ํ่๗๒๎ๆๅํ่ ์ๅ๒๎ไเ "
-#~ "โโ๎ไเ"
-
-#~ msgid "E288: input method doesn't support any style"
-#~ msgstr "E288: ฬๅ๒๎ไ โโ๎ไเ ํๅ ๏๎ไไๅ๐ๆ่โเๅ๒ ๑๒่๋่"
-
-#~ msgid "E289: input method doesn't support my preedit type"
-#~ msgstr ""
-#~ "E289: ฬๅ๒๎ไ โโ๎ไเ ํๅ ๏๎ไไๅ๐ๆ่โเๅ๒ ์๎้ ๒่๏ ๏๐ๅไโเ๐่๒ๅ๋ํ๎ใ๎ ๐ๅไเ๊๒่๐๎โเํ่"
-
-#~ msgid "E843: Error while updating swap file crypt"
-#~ msgstr "E843: ฮ๘่แ๊เ ๏๐่ ๎แํ๎โ๋ๅํ่่ ๘่๔๐๎โเํ่ ๑โ๎๏-๔เ้๋เ"
-
-#~ msgid ""
-#~ "E833: %s is encrypted and this version of Vim does not support encryption"
-#~ msgstr "E833: %s ็เ๘่๔๐๎โเํ, เ ๒เ โๅ๐๑่ Vim ํๅ ๏๎ไไๅ๐ๆ่โเๅ๒ ๘่๔๐๎โเํ่ๅ"
-
-#~ msgid "Swap file is encrypted: \"%s\""
-#~ msgstr "ัโ๎๏-๔เ้๋ ็เ๘่๔๐๎โเํ: \"%s\""
-
-#~ msgid ""
-#~ "\n"
-#~ "If you entered a new crypt key but did not write the text file,"
-#~ msgstr ""
-#~ "\n"
-#~ "ล๑๋่ โ๛ โโๅ๋่ ํ๎โ๛้ ๏เ๐๎๋ ไ๋ ๘่๔๐๎โเํ่, ํ๎ ํๅ ็เ๏่๑เ๋่ ๒ๅ๊๑๒๎โ๛้ ๔เ้๋,"
-
-#~ msgid ""
-#~ "\n"
-#~ "enter the new crypt key."
-#~ msgstr ""
-#~ "\n"
-#~ "๒๎ โโๅไ่๒ๅ ํ๎โ๛้ ๏เ๐๎๋ ไ๋ ๘่๔๐๎โเํ่."
-
-# ฯๅ๐ๅโ๎ไ ๑๎๎แ๙ๅํ่ ๐เ็ไๅ๋ธํ ํเ ไโๅ ๗เ๑๒่, ๗เ๑๒ ๏ๅ๐โเ
-#~ msgid ""
-#~ "\n"
-#~ "If you wrote the text file after changing the crypt key press enter"
-#~ msgstr ""
-#~ "\n"
-#~ "ล๑๋่ โ๛ ็เ๏่๑เ๋่ ๒ๅ๊๑๒๎โ๛้ ๔เ้๋ ๏๎๑๋ๅ ่็์ๅํๅํ่ ๏เ๐๎๋ ๘่๔๐๎โเํ่, ๒๎ "
-#~ "ํเๆ์่๒ๅ"
-
-# ฯๅ๐ๅโ๎ไ ๑๎๎แ๙ๅํ่ ๐เ็ไๅ๋ธํ ํเ ไโๅ ๗เ๑๒่, ๗เ๑๒ โ๒๎๐เ
-#~ msgid ""
-#~ "\n"
-#~ "to use the same key for text file and swap file"
-#~ msgstr ""
-#~ "\n"
-#~ "Enter ไ๋ ่๑๏๎๋็๎โเํ่ ๎ไํ๎ใ๎ ๊๋๗เ ไ๋ ๒ๅ๊๑๒๎โ๎ใ๎ ๔เ้๋เ ่ ๑โ๎๏-๔เ้๋เ"
-
-#~ msgid "Using crypt key from swap file for the text file.\n"
-#~ msgstr ""
-#~ "ศ๑๏๎๋็๎โเํ่ๅ ๊๋๗เ ๘่๔๐๎โเํ่ ่็ ๑โ๎๏-๔เ้๋เ ไ๋ ๒ๅ๊๑๒๎โ๎ใ๎ ๔เ้๋เ.\n"
-
-#~ msgid ""
-#~ "\n"
-#~ " [not usable with this version of Vim]"
-#~ msgstr ""
-#~ "\n"
-#~ " [ํๅ ๏๐่ใ๎ไๅํ ไ๋ ่๑๏๎๋็๎โเํ่ ๑ ไเํํ๎้ โๅ๐๑่ๅ้ Vim]"
-
-#~ msgid "Tear off this menu"
-#~ msgstr "ฮ๒๎๐โเ๒ ๒๎ ์ๅํ"
-
-#~ msgid "Select Directory dialog"
-#~ msgstr "ย๛แ๎๐ ๊เ๒เ๋๎ใเ"
-
-#~ msgid "Save File dialog"
-#~ msgstr "ั๎๕๐เํๅํ่ๅ ๔เ้๋เ"
-
-#~ msgid "Open File dialog"
-#~ msgstr "ฮ๒๊๐๛๒่ๅ ๔เ้๋เ"
-
-#~ msgid "E338: Sorry, no file browser in console mode"
-#~ msgstr ""
-#~ "E338: ศ็โ่ํ่๒ๅ, ํ๎ โ ๊๎ํ๑๎๋ํ๎์ ๐ๅๆ่์ๅ ํๅ๒ ๏๐๎โ๎ไํ่๊เ ๏๎ ๔เ้๋๎โ๎้ ๑่๑๒ๅ์ๅ"
-
-#~ msgid "Vim: preserving files...\n"
-#~ msgstr "Vim: ๑๎๕๐เํๅํ่ๅ ๔เ้๋๎โ...\n"
-
-#~ msgid "Vim: Finished.\n"
-#~ msgstr "Vim: ร๎๒๎โ๎.\n"
-
-#~ msgid "ERROR: "
-#~ msgstr "ฮุศมสภ: "
-
-#~ msgid ""
-#~ "\n"
-#~ "[bytes] total alloc-freed %<PRIu64>-%<PRIu64>, in use %<PRIu64>, peak use "
-#~ "%<PRIu64>\n"
-#~ msgstr ""
-#~ "\n"
-#~ "[แเ้๒] โ๑ๅใ๎ โ๛ไๅ๋.-๎๑โ๎แ. %<PRIu64>-%<PRIu64>, ่๑๏๎๋็. %<PRIu64>, ์เ๊๑. "
-#~ "่๑๏๎๋็. %<PRIu64>\n"
-
-#~ msgid ""
-#~ "[calls] total re/malloc()'s %<PRIu64>, total free()'s %<PRIu64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "[โ๛็๎โ๛] re/malloc() โ๑ๅใ๎ %<PRIu64>, free() โ๑ๅใ๎ %<PRIu64>\n"
-#~ "\n"
-
-#~ msgid "E340: Line is becoming too long"
-#~ msgstr "E340: ั๒๐๎๊เ ๑๒เํ๎โ่๒๑ ๑๋่๘๊๎์ ไ๋่ํํ๎้"
-
-#~ msgid "E341: Internal error: lalloc(%<PRId64>, )"
-#~ msgstr "E341: ยํ๓๒๐ๅํํ ๎๘่แ๊เ: lalloc(%<PRId64>, )"
-
-#~ msgid "E547: Illegal mouseshape"
-#~ msgstr "E547: อๅไ๎๏๓๑๒่์เ ๔๎๐์เ ๊๓๐๑๎๐เ"
-
-#~ msgid "Enter encryption key: "
-#~ msgstr "ยโๅไ่๒ๅ ๏เ๐๎๋ ไ๋ ๘่๔๐๎โเํ่: "
-
-#~ msgid "Enter same key again: "
-#~ msgstr "ฯ๎โ๒๎๐่๒ๅ โโ๎ไ ๏เ๐๎๋: "
-
-#~ msgid "Keys don't match!"
-#~ msgstr "ยโๅไธํํ๛ๅ ๏เ๐๎๋่ ํๅ ๑๎โ๏เไเ๒!"
-
-#~ msgid "Cannot connect to Netbeans #2"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ๑๎ๅไ่ํ่๒๑ ๑ NetBeans #2"
-
-#~ msgid "Cannot connect to Netbeans"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ๑๎ๅไ่ํ่๒๑ ๑ NetBeans"
-
-#~ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
-#~ msgstr ""
-#~ "E668: อๅ๏๐เโ่๋ํ๛้ ๐ๅๆ่์ ไ๎๑๒๓๏เ ๊ ่ํ๔๎๐์เ๖่่ ๎ ๑๎ๅไ่ํๅํ่่ ๑ NetBeans: "
-#~ "\"%s\""
-
-#~ msgid "read from Netbeans socket"
-#~ msgstr "๗๒ๅํ่ๅ ่็ ใํๅ็ไเ NetBeans"
-
-#~ msgid "E658: NetBeans connection lost for buffer %<PRId64>"
-#~ msgstr "E658: ฯ๎๒ๅ๐ํ๎ ๑๎ๅไ่ํๅํ่ๅ ๑ NetBeans ไ๋ แ๓๔ๅ๐เ %<PRId64>"
-
-#~ msgid "E838: netbeans is not supported with this GUI"
-#~ msgstr "E838: NetBeans ํๅ ๏๎ไไๅ๐ๆ่โเๅ๒๑ ๑ ๒่์ ใ๐เ๔่๗ๅ๑๊่์ ่ํ๒ๅ๐๔ๅ้๑๎์"
-
-#~ msgid "E511: netbeans already connected"
-#~ msgstr "E511: ๓ๆๅ ๑๎ๅไ่ํธํ ๑ NetBeans"
-
-#~ msgid "E505: %s is read-only (add ! to override)"
-#~ msgstr ""
-#~ "E505: %s ๎๒๊๐๛๒ ๒๎๋๊๎ ไ๋ ๗๒ๅํ่ (ไ๎แเโ๒ๅ !, ๗๒๎แ๛ ๎แ๎้๒่ ๏๐๎โๅ๐๊๓)"
-
-#~ msgid "E775: Eval feature not available"
-#~ msgstr "E775: eval ํๅ ไ๎๑๒๓๏ํเ"
-
-#~ msgid "freeing %<PRId64> lines"
-#~ msgstr "๎๗่๙ๅํ๎ ๑๒๐๎๊: %<PRId64>"
-
-#~ msgid "E530: Cannot change term in GUI"
-#~ msgstr "E530: ย ใ๐เ๔่๗ๅ๑๊๎์ ่ํ๒ๅ๐๔ๅ้๑ๅ ่็์ๅํ๒ ๒ๅ๐์่ํเ๋ ํๅโ๎็์๎ๆํ๎"
-
-#~ msgid "E531: Use \":gui\" to start the GUI"
-#~ msgstr "E531: ฤ๋ ็เ๏๓๑๊เ ใ๐เ๔่๗ๅ๑๊๎ใ๎ ่ํ๒ๅ๐๔ๅ้๑เ ่๑๏๎๋็๓้๒ๅ \":gui\""
-
-#~ msgid "E617: Cannot be changed in the GTK+ 2 GUI"
-#~ msgstr "E617: อๅ ์๎ๆๅ๒ แ๛๒ ่็์ๅํๅํ๎ โ ใ๐เ๔่๗ๅ๑๊๎์ ่ํ๒ๅ๐๔ๅ้๑ๅ GTK+ 2"
-
-#~ msgid "E596: Invalid font(s)"
-#~ msgstr "E596: อๅ๏๐เโ่๋ํ๛ๅ ๘๐่๔๒๛"
-
-#~ msgid "E597: can't select fontset"
-#~ msgstr "E597: อๅโ๎็์๎ๆํ๎ โ๛แ๐เ๒ ๘๐่๔๒๎โ๎้ ํเแ๎๐"
-
-#~ msgid "E598: Invalid fontset"
-#~ msgstr "E598: อๅ๏๐เโ่๋ํ๛้ ๘๐่๔๒๎โ๎้ ํเแ๎๐"
-
-#~ msgid "E533: can't select wide font"
-#~ msgstr "E533: อๅโ๎็์๎ๆํ๎ โ๛แ๐เ๒ ๘๐่๔๒ ๑ ๑่์โ๎๋เ์่ ไโ๎้ํ๎้ ๘่๐่ํ๛"
-
-#~ msgid "E534: Invalid wide font"
-#~ msgstr "E534: อๅ๏๐เโ่๋ํ๛้ ๘๐่๔๒ ๑ ๑่์โ๎๋เ์่ ไโ๎้ํ๎้ ๘่๐่ํ๛"
-
-#~ msgid "E538: No mouse support"
-#~ msgstr "E538: ฬ๛๘ ํๅ ๏๎ไไๅ๐ๆ่โเๅ๒๑"
-
-#~ msgid "cannot open "
-#~ msgstr "ํๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ "
-
-#~ msgid "VIM: Can't open window!\n"
-#~ msgstr "VIM: อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ ๎๊ํ๎!\n"
-
-#~ msgid "Need Amigados version 2.04 or later\n"
-#~ msgstr "อๅ๎แ๕๎ไ่์เ Amigados โๅ๐๑่่ 2.04 ่๋่ แ๎๋ๅๅ ๏๎็ไํๅ้\n"
-
-#~ msgid "Need %s version %<PRId64>\n"
-#~ msgstr "อๅ๎แ๕๎ไ่์เ %s โๅ๐๑่่ %<PRId64>\n"
-
-#~ msgid "Cannot open NIL:\n"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ NIL:\n"
-
-#~ msgid "Cannot create "
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ๑๎็ไเ๒ "
-
-#~ msgid "Vim exiting with %d\n"
-#~ msgstr "ฯ๐ๅ๊๐เ๙ๅํ่ๅ ๐เแ๎๒๛ Vim ๑ ๊๎ไ๎์ %d\n"
-
-#~ msgid "cannot change console mode ?!\n"
-#~ msgstr "ํๅโ๎็์๎ๆํ๎ ๑์ๅํ่๒ ๐ๅๆ่์ ๊๎ํ๑๎๋่?!\n"
-
-#~ msgid "mch_get_shellsize: not a console??\n"
-#~ msgstr "mch_get_shellsize: ํๅ โ ๊๎ํ๑๎๋่??\n"
-
-#~ msgid "E360: Cannot execute shell with -f option"
-#~ msgstr "E360: อๅโ๎็์๎ๆํ๎ โ๛๏๎๋ํ่๒ ๎แ๎๋๎๗๊๓ ๑ ๏เ๐เ์ๅ๒๐๎์ -f"
-
-#~ msgid "Cannot execute "
-#~ msgstr "อๅโ๎็์๎ๆํ๎ โ๛๏๎๋ํ่๒ "
-
-#~ msgid "shell "
-#~ msgstr "๎แ๎๋๎๗๊เ "
-
-#~ msgid " returned\n"
-#~ msgstr " ็เโๅ๐๘่๋เ ๐เแ๎๒๓\n"
-
-#~ msgid "ANCHOR_BUF_SIZE too small."
-#~ msgstr "๑๋่๘๊๎์ ์เ๋เ โๅ๋่๗่ํเ ANCHOR_BUF_SIZE."
-
-#~ msgid "I/O ERROR"
-#~ msgstr "ฮุศมสภ ยยฮฤภ/ยยฮฤภ"
-
-#~ msgid "Message"
-#~ msgstr "ั๎๎แ๙ๅํ่ๅ"
-
-#~ msgid "'columns' is not 80, cannot execute external commands"
-#~ msgstr ""
-#~ "วํเ๗ๅํ่ๅ ๎๏๖่่ 'columns' ํๅ ๐เโํ๎ 80, โํๅ๘ํ่ๅ ๏๐๎ใ๐เ์์๛ ํๅ โ๛๏๎๋ํ๒๑"
-
-#~ msgid "E237: Printer selection failed"
-#~ msgstr "E237: อๅ๓ไเ๗ํ๎ๅ ็เโๅ๐๘ๅํ่ๅ โ๛แ๎๐เ ๏๐่ํ๒ๅ๐เ"
-
-#~ msgid "to %s on %s"
-#~ msgstr "โ %s ํเ %s"
-
-#~ msgid "E613: Unknown printer font: %s"
-#~ msgstr "E613: อๅ่็โๅ๑๒ํ๛้ ๘๐่๔๒ ๏๐่ํ๒ๅ๐เ: %s"
-
-#~ msgid "E238: Print error: %s"
-#~ msgstr "E238: ฮ๘่แ๊เ ๏ๅ๗เ๒่: %s"
-
-#~ msgid "Printing '%s'"
-#~ msgstr "ฯๅ๗เ๒ '%s'"
-
-#~ msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
-#~ msgstr "E244: อๅไ๎๏๓๑๒่์๎ๅ ่์ ๊๎ไ่๐๎โ๊่ \"%s\" โ ่์ๅํ่ ๘๐่๔๒เ \"%s\""
-
-#~ msgid "E245: Illegal char '%c' in font name \"%s\""
-#~ msgstr "E245: อๅไ๎๏๓๑๒่์๛้ ๑่์โ๎๋ '%c' โ ่์ๅํ่ ๘๐่๔๒เ \"%s\""
-
-#~ msgid "Vim: Double signal, exiting\n"
-#~ msgstr "Vim: ฤโ๎้ํ๎้ ๑่ใํเ๋, ็เโๅ๐๘ๅํ่ๅ ๐เแ๎๒๛\n"
-
-#~ msgid "Vim: Caught deadly signal %s\n"
-#~ msgstr "Vim: ฯ๎๋๓๗ๅํ ๓แ่้๑๒โๅํํ๛้ ๑่ใํเ๋ %s\n"
-
-#~ msgid "Vim: Caught deadly signal\n"
-#~ msgstr "Vim: ฯ๎๋๓๗ๅํ ๓แ่้๑๒โๅํํ๛้ ๑่ใํเ๋\n"
-
-#~ msgid "Opening the X display took %<PRId64> msec"
-#~ msgstr "ฮ๒๊๐๛๒่ๅ ไ่๑๏๋ๅ X ็เํ๋๎ %<PRId64> msec"
-
-#~ msgid ""
-#~ "\n"
-#~ "Vim: Got X error\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Vim: ฮ๘่แ๊เ X\n"
-
-#~ msgid "Testing the X display failed"
-#~ msgstr "ฯ๐๎โๅ๐๊เ ไ่๑๏๋ๅ X ็เโๅ๐๘ๅํเ ํๅ๓ไเ๗ํ๎"
-
-#~ msgid "Opening the X display timed out"
-#~ msgstr "ฮ๒๊๐๛๒่ๅ ไ่๑๏๋ๅ X ํๅ โ๛๏๎๋ํๅํ๎ โ ๎๒โๅไธํํ๎ๅ โ๐ๅ์"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot execute shell sh\n"
-#~ msgstr ""
-#~ "\n"
-#~ "อๅโ๎็์๎ๆํ๎ ็เ๏๓๑๒่๒ ๎แ๎๋๎๗๊๓ sh\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot create pipes\n"
-#~ msgstr ""
-#~ "\n"
-#~ "อๅโ๎็์๎ๆํ๎ ๑๎็ไเ๒ ๒๐๓แ๛\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot fork\n"
-#~ msgstr ""
-#~ "\n"
-#~ "อๅโ๎็์๎ๆํ๎ โ๛๏๎๋ํ่๒ fork()\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Command terminated\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ย๛๏๎๋ํๅํ่ๅ ๊๎์เํไ๛ ๏๐ๅ๐โเํ๎\n"
-
-#~ msgid "XSMP lost ICE connection"
-#~ msgstr "XSMP ๓๒ๅ๐ํ๎ ๑๎ๅไ่ํๅํ่ๅ ICE"
-
-#~ msgid "Opening the X display failed"
-#~ msgstr "อๅ๓ไเ๗ํ๎ๅ ๎๒๊๐๛๒่ๅ ไ่๑๏๋ๅ X"
-
-#~ msgid "XSMP handling save-yourself request"
-#~ msgstr "XSMP ๎แ๐เแเ๒๛โเๅ๒ ็เ๏๐๎๑ ๑เ์๎๑๎๕๐เํๅํ่"
-
-#~ msgid "XSMP opening connection"
-#~ msgstr "XSMP ๎๒๊๐๛โเๅ๒ ๑๎ๅไ่ํๅํ่ๅ"
-
-#~ msgid "XSMP ICE connection watch failed"
-#~ msgstr "XSMP ๏๎๒ๅ๐ํ๎ ๑๋ๅๆๅํ่ๅ ็เ ๑๎ๅไ่ํๅํ่ๅ์ ICE"
-
-#~ msgid "XSMP SmcOpenConnection failed: %s"
-#~ msgstr "XSMP ํๅ๓ไเ๗ํ๎ โ๛๏๎๋ํๅํ๎ SmcOpenConnection: %s"
-
-#~ msgid "At line"
-#~ msgstr "ย ๑๒๐๎๊ๅ"
-
-#~ msgid "Could not load vim32.dll!"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ็เใ๐๓็่๒ vim32.dll!"
-
-#~ msgid "VIM Error"
-#~ msgstr "ฮ๘่แ๊เ VIM"
-
-#~ msgid "Could not fix up function pointers to the DLL!"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ่๑๏๐เโ่๒ ๓๊เ็เ๒ๅ๋่ ๔๓ํ๊๖่้ ไ๋ DLL!"
-
-#~ msgid "shell returned %d"
-#~ msgstr "็เโๅ๐๘ๅํ่ๅ ๐เแ๎๒๛ ๎แ๎๋๎๗๊่ ๑ ๊๎ไ๎์ %d"
-
-#~ msgid "Vim: Caught %s event\n"
-#~ msgstr "Vim: ฯๅ๐ๅ๕โเ๗ๅํ๎ ๑๎แ๛๒่ๅ %s\n"
-
-#~ msgid "close"
-#~ msgstr "็เ๊๐๛๒่ๅ"
-
-#~ msgid "logoff"
-#~ msgstr "๎๒๊๋๗ๅํ่ๅ"
-
-#~ msgid "shutdown"
-#~ msgstr "็เโๅ๐๘ๅํ่ๅ"
-
-#~ msgid "E371: Command not found"
-#~ msgstr "E371: ส๎์เํไเ ํๅ ํเ้ไๅํเ"
-
-#~ msgid ""
-#~ "VIMRUN.EXE not found in your $PATH.\n"
-#~ "External commands will not pause after completion.\n"
-#~ "See :help win32-vimrun for more information."
-#~ msgstr ""
-#~ "VIMRUN.EXE ํๅ ํเ้ไๅํ โ ๏๓๒่, ็เไเํํ๎์ โ $PATH.\n"
-#~ "ยํๅ๘ํ่ๅ ๊๎์เํไ๛ ํๅ แ๓ไ๓๒ ๎๑๒เํเโ๋่โเ๒๑ ๏๎๑๋ๅ โ๛๏๎๋ํๅํ่.\n"
-#~ "ฤ๎๏๎๋ํ่๒ๅ๋ํเ ่ํ๔๎๐์เ๖่ โ :help win32-vimrun"
-
-#~ msgid "Vim Warning"
-#~ msgstr "ฯ๐ๅไ๓๏๐ๅๆไๅํ่ๅ Vim"
-
-#~ msgid "Error file"
-#~ msgstr "ิเ้๋ ๎๘่แ๎๊"
-
-#~ msgid "E868: Error building NFA with equivalence class!"
-#~ msgstr "E868: ๎๘่แ๊เ ๏๐่ ๑๎็ไเํ่่ อสภ ๑ ๊๋เ๑๑๎์ ๊โ่โเ๋ๅํ๒ํ๎๑๒่!"
-
-#~ msgid "E878: (NFA) Could not allocate memory for branch traversal!"
-#~ msgstr "E878: (อสภ) ํๅโ๎็์๎ๆํ๎ โ๛ไๅ๋่๒ ๏เ์๒ ไ๋ ๏๐๎๕๎ไเ โๅ๒โ่!"
-
-#~ msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\""
-#~ msgstr ""
-#~ "ฯ๐ๅไ๓๏๐ๅๆไๅํ่ๅ: อๅโ๎็์๎ๆํ๎ ํเ้๒่ ๑๏่๑๎๊ ๑๋๎โ \"%s_%s.spl\" ่๋่ \"%s_ascii."
-#~ "spl\""
-
-#~ msgid "Conversion in %s not supported"
-#~ msgstr "ฯ๐ๅ๎แ๐เ็๎โเํ่ๅ โ %s ํๅ ๏๎ไไๅ๐ๆ่โเๅ๒๑"
-
-#~ msgid "E845: Insufficient memory, word list will be incomplete"
-#~ msgstr "E845: อๅไ๎๑๒เ๒๎๗ํ๎ ๎๏ๅ๐เ๒่โํ๎้ ๏เ์๒่, ๑๏่๑๎๊ ๑๋๎โ แ๓ไๅ๒ ํๅ ๏๎๋๎ํ"
-
-#~ msgid "E430: Tag file path truncated for %s\n"
-#~ msgstr "E430: ฯ๓๒ ๊ ๔เ้๋๓ ์ๅ๒๎๊ %s ๎แ๐ๅ็เํ\n"
-
-#~ msgid "new shell started\n"
-#~ msgstr "็เ๏๓๑๊ ํ๎โ๎้ ๎แ๎๋๎๗๊่\n"
-
-#~ msgid "Used CUT_BUFFER0 instead of empty selection"
-#~ msgstr "ย์ๅ๑๒๎ ๏๓๑๒๎ใ๎ โ๛ไๅ๋ๅํ่ ่๑๏๎๋็๓ๅ๒๑ CUT_BUFFER0"
-
-#~ msgid "No undo possible; continue anyway"
-#~ msgstr "ฮ๒์ๅํเ ํๅโ๎็์๎ๆํเ; ๏๐๎ไ๎๋ๆเ๒ โ๛๏๎๋ํๅํ่ๅ"
-
-#~ msgid "E832: Non-encrypted file has encrypted undo file: %s"
-#~ msgstr "E832: อๅ ็เ๘่๔๐๎โเํํ๛้ ๔เ้๋ ่์ๅๅ๒ ็เ๘่๔๐๎โเํํ๛้ ๔เ้๋ ๎๒์ๅํ: %s"
-
-#~ msgid "E826: Undo file decryption failed: %s"
-#~ msgstr "E826: อๅ ๓ไเ๋๎๑ ไๅ๘่๔๐๎โเ๒ ๔เ้๋ ๎๒์ๅํ: %s"
-
-#~ msgid "E827: Undo file is encrypted: %s"
-#~ msgstr "E827: ิเ้๋ ๎๒์ๅํ ็เ๘่๔๐๎โเํ: %s"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16/32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "ยๅ๐๑่ ๑ ใ๐เ๔่๗ๅ๑๊่์ ่ํ๒ๅ๐๔ๅ้๑๎์ ไ๋ MS-Windows 16/32 แ่๒"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "ยๅ๐๑่ ๑ ใ๐เ๔่๗ๅ๑๊่์ ่ํ๒ๅ๐๔ๅ้๑๎์ ไ๋ MS-Windows 64 แ่๒"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "ยๅ๐๑่ ๑ ใ๐เ๔่๗ๅ๑๊่์ ่ํ๒ๅ๐๔ๅ้๑๎์ ไ๋ MS-Windows 32 แ่๒"
-
-#~ msgid " in Win32s mode"
-#~ msgstr " โ ๐ๅๆ่์ๅ Win32"
-
-#~ msgid " with OLE support"
-#~ msgstr " ๑ ๏๎ไไๅ๐ๆ๊๎้ OLE"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "ส๎ํ๑๎๋ํเ โๅ๐๑่ ไ๋ MS-Windows 64 แ่๒"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "ส๎ํ๑๎๋ํเ โๅ๐๑่ ไ๋ MS-Windows 32 แ่๒"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16-bit version"
-#~ msgstr ""
-#~ "\n"
-#~ "ยๅ๐๑่ ไ๋ MS-Windows 16 แ่๒"
-
-#~ msgid ""
-#~ "\n"
-#~ "32-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "ยๅ๐๑่ ไ๋ MS-DOS 32 แ่๒"
-
-#~ msgid ""
-#~ "\n"
-#~ "16-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "ยๅ๐๑่ ไ๋ MS-DOS 16 แ่๒"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X (unix) version"
-#~ msgstr ""
-#~ "\n"
-#~ "ยๅ๐๑่ ไ๋ MacOS X (unix)"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X version"
-#~ msgstr ""
-#~ "\n"
-#~ "ยๅ๐๑่ ไ๋ MacOS X"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "ยๅ๐๑่ ไ๋ MacOS"
-
-#~ msgid ""
-#~ "\n"
-#~ "OpenVMS version"
-#~ msgstr ""
-#~ "\n"
-#~ "ยๅ๐๑่ ไ๋ OpenVMS"
-
-#~ msgid ""
-#~ "\n"
-#~ "Big version "
-#~ msgstr ""
-#~ "\n"
-#~ "ม๎๋๘เ โๅ๐๑่ "
-
-#~ msgid ""
-#~ "\n"
-#~ "Normal version "
-#~ msgstr ""
-#~ "\n"
-#~ "ฮแ๛๗ํเ โๅ๐๑่ "
-
-#~ msgid ""
-#~ "\n"
-#~ "Small version "
-#~ msgstr ""
-#~ "\n"
-#~ "ฬเ๋เ โๅ๐๑่ "
-
-#~ msgid ""
-#~ "\n"
-#~ "Tiny version "
-#~ msgstr ""
-#~ "\n"
-#~ "ยๅ๐๑่ \"ส๐๎๕เ\" "
-
-#~ msgid "with GTK2-GNOME GUI."
-#~ msgstr "๑ ใ๐เ๔่๗ๅ๑๊่์ ่ํ๒ๅ๐๔ๅ้๑๎์ GTK2-GNOME."
-
-#~ msgid "with GTK2 GUI."
-#~ msgstr "๑ ใ๐เ๔่๗ๅ๑๊่์ ่ํ๒ๅ๐๔ๅ้๑๎์ GTK2."
-
-#~ msgid "with X11-Motif GUI."
-#~ msgstr "๑ ใ๐เ๔่๗ๅ๑๊่์ ่ํ๒ๅ๐๔ๅ้๑๎์ X11-Motif."
-
-#~ msgid "with X11-neXtaw GUI."
-#~ msgstr "๑ ใ๐เ๔่๗ๅ๑๊่์ ่ํ๒ๅ๐๔ๅ้๑๎์ X11-neXtaw."
-
-#~ msgid "with X11-Athena GUI."
-#~ msgstr "๑ ใ๐เ๔่๗ๅ๑๊่์ ่ํ๒ๅ๐๔ๅ้๑๎์ X11-Athena."
-
-#~ msgid "with Photon GUI."
-#~ msgstr "๑ ใ๐เ๔่๗ๅ๑๊่์ ่ํ๒ๅ๐๔ๅ้๑๎์ Photon."
-
-#~ msgid "with GUI."
-#~ msgstr "๑ ใ๐เ๔่๗ๅ๑๊่์ ่ํ๒ๅ๐๔ๅ้๑๎์."
-
-#~ msgid "with Carbon GUI."
-#~ msgstr "๑ ใ๐เ๔่๗ๅ๑๊่์ ่ํ๒ๅ๐๔ๅ้๑๎์ Carbon."
-
-#~ msgid "with Cocoa GUI."
-#~ msgstr "๑ ใ๐เ๔่๗ๅ๑๊่์ ่ํ๒ๅ๐๔ๅ้๑๎์ Cocoa."
-
-#~ msgid "with (classic) GUI."
-#~ msgstr "๑ ๊๋เ๑๑่๗ๅ๑๊่์ ใ๐เ๔่๗ๅ๑๊่์ ่ํ๒ๅ๐๔ๅ้๑๎์."
-
-#~ msgid " system gvimrc file: \""
-#~ msgstr " ๎แ๙ๅ๑่๑๒ๅ์ํ๛้ ๔เ้๋ gvimrc: \""
-
-#~ msgid " user gvimrc file: \""
-#~ msgstr " ๏๎๋็๎โเ๒ๅ๋๑๊่้ ๔เ้๋ gvimrc: \""
-
-#~ msgid "2nd user gvimrc file: \""
-#~ msgstr " โ๒๎๐๎้ ๏๎๋็๎โเ๒ๅ๋๑๊่้ ๔เ้๋ gvimrc: \""
-
-#~ msgid "3rd user gvimrc file: \""
-#~ msgstr " ๒๐ๅ๒่้ ๏๎๋็๎โเ๒ๅ๋๑๊่้ ๔เ้๋ gvimrc: \""
-
-#~ msgid " system menu file: \""
-#~ msgstr " ๎แ๙ๅ๑่๑๒ๅ์ํ๛้ ๔เ้๋ ์ๅํ: \""
-
-#~ msgid "Compiler: "
-#~ msgstr "ส๎์๏่๋๒๎๐: "
-
-#~ msgid "menu Help->Orphans for information "
-#~ msgstr "์ๅํ ั๏๐เโ๊เ->ั่๐๎๒๛ ไ๋ ๏๎๋๓๗ๅํ่ ่ํ๔๎๐์เ๖่่ "
-
-#~ msgid "Running modeless, typed text is inserted"
-#~ msgstr "มๅ็๐ๅๆ่์ํเ ๐เแ๎๒เ, โ๑๒เโ๊เ โโๅไธํํ๎ใ๎ ๒ๅ๊๑๒เ"
-
-#~ msgid "menu Edit->Global Settings->Toggle Insert Mode "
-#~ msgstr ""
-#~ "์ๅํ ฯ๐เโ๊เ->ร๋๎แเ๋ํ๛ๅ ํเ๑๒๐๎้๊่->ะๅๆ่์ ย๑๒เโ๊่ "
-
-#~ msgid " for two modes "
-#~ msgstr " ไ๋ ไโ๓๕ ๐ๅๆ่์๎โ "
-
-#~ msgid "menu Edit->Global Settings->Toggle Vi Compatible"
-#~ msgstr ""
-#~ "์ๅํ ฯ๐เโ๊เ->ร๋๎แเ๋ํ๛ๅ ํเ๑๒๐๎้๊่->ั๎โ์ๅ๑๒่์๎๑๒ ๑ Vi "
-
-#~ msgid " for Vim defaults "
-#~ msgstr " ไ๋ ๏ๅ๐ๅ๕๎ไเ โ ๐ๅๆ่์ Vim "
-
-#~ msgid "WARNING: Windows 95/98/ME detected"
-#~ msgstr "ฯะลฤำฯะลฦฤลอศล: ๎แํเ๐๓ๆๅํเ Windows 95/98/ME"
-
-#~ msgid "type :help windows95<Enter> for info on this"
-#~ msgstr "ํเแๅ๐่๒ๅ :help windows95<Enter> ไ๋ ๏๎๋๓๗ๅํ่ ่ํ๔๎๐์เ๖่่ "
-
-#~ msgid "E370: Could not load library %s"
-#~ msgstr "E370: อๅโ๎็์๎ๆํ๎ ็เใ๐๓็่๒ แ่แ๋่๎๒ๅ๊๓ %s"
-
-#~ msgid ""
-#~ "Sorry, this command is disabled: the Perl library could not be loaded."
-#~ msgstr ""
-#~ "ศ็โ่ํ่๒ๅ, ไเํํเ ๊๎์เํไเ ๎๒๊๋๗ๅํเ: ํๅโ๎็์๎ๆํ๎ ็เใ๐๓็่๒ แ่แ๋่๎๒ๅ๊๓ Perl"
-
-#~ msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
-#~ msgstr ""
-#~ "E299: อๅ ไ๎๏๓๑๊เๅ๒๑ โ๛๗่๑๋ๅํ่ๅ Perl โ ๏ๅ๑๎๗ํ่๖ๅ แๅ็ ์๎ไ๓๋ แๅ็๎๏เ๑ํ๎๑๒่"
-
-#~ msgid "Edit with &multiple Vims"
-#~ msgstr "ะๅไเ๊๒่๐๎โเ๒ โ &๐เ็ํ๛๕ Vim-เ๕"
-
-#~ msgid "Edit with single &Vim"
-#~ msgstr "ะๅไเ๊๒่๐๎โเ๒ โ &๎ไํ๎์ Vim"
-
-#~ msgid "Diff with Vim"
-#~ msgstr "ั๐เโํ่๒ ๑ ๏๎์๎๙ Vim"
-
-#~ msgid "Edit with &Vim"
-#~ msgstr "ะๅ&ไเ๊๒่๐๎โเ๒ ๑ ๏๎์๎๙ Vim"
-
-#~ msgid "Edit with existing Vim - "
-#~ msgstr "ะๅไเ๊๒่๐๎โเ๒ โ ็เ๏๓๙ๅํํ๎์ Vim — "
-
-#~ msgid "Edits the selected file(s) with Vim"
-#~ msgstr "ะๅไเ๊๒่๐๎โเ๒ โ๛ไๅ๋ๅํํ๛ๅ ๔เ้๋๛ ๑ ๏๎์๎๙ Vim"
-
-#~ msgid "Error creating process: Check if gvim is in your path!"
-#~ msgstr "ฮ๘่แ๊เ ๑๎็ไเํ่ ๏๐๎๖ๅ๑๑เ: ๏๐๎โๅ๐๒ๅ ไ๎๑๒๓๏ํ๎๑๒ gvim โ ๏๓๒่!"
-
-#~ msgid "gvimext.dll error"
-#~ msgstr "๎๘่แ๊เ gvimext.dll"
-
-#~ msgid "Path length too long!"
-#~ msgstr "ั๋่๘๊๎์ ไ๋่ํํ๛้ ๏๓๒!"
-
-#~ msgid "E234: Unknown fontset: %s"
-#~ msgstr "E234: อๅ่็โๅ๑๒ํ๛้ ๘๐่๔๒๎โ๎้ ํเแ๎๐: %s"
-
-#~ msgid "E235: Unknown font: %s"
-#~ msgstr "E235: อๅ่็โๅ๑๒ํ๛้ ๘๐่๔๒: %s"
-
-#~ msgid "E236: Font \"%s\" is not fixed-width"
-#~ msgstr "E236: ุ๐่๔๒ \"%s\" ํๅ โ๋ๅ๒๑ ์๎ํ๎๘่๐่ํํ๛์"
-
-#~ msgid "E448: Could not load library function %s"
-#~ msgstr "E448: อๅ ๓ไเ๋๎๑ ็เใ๐๓็่๒ ๔๓ํ๊๖่ %s ่็ แ่แ๋่๎๒ๅ๊่"
-
-#~ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
-#~ msgstr "E26: ศโ๐่๒ โ๛๊๋๗ๅํ ๏๐่ ๊๎์๏่๋๖่่\n"
-
-#~ msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
-#~ msgstr "E27: ิเ๐๑่ โ๛๊๋๗ๅํ๎ ๏๐่ ๊๎์๏่๋๖่่\n"
-
-#~ msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
-#~ msgstr "E800: ภ๐เแ๑๊่้ โ๛๊๋๗ๅํ ๏๐่ ๊๎์๏่๋๖่่\n"
-
-#~ msgid "E247: no registered server named \"%s\""
-#~ msgstr "E247: ัๅ๐โๅ๐ \"%s\" ํๅ ็เ๐ๅใ่๑๒๐่๐๎โเํ"
-
-#~ msgid "E233: cannot open display"
-#~ msgstr "E233: อๅโ๎็์๎ๆํ๎ ๎๒๊๐๛๒ ไ่๑๏๋ๅ้"
-
-#~ msgid "E449: Invalid expression received"
-#~ msgstr "E449: ฯ๎๋๓๗ๅํ๎ ํๅไ๎๏๓๑๒่์๎ๅ โ๛๐เๆๅํ่ๅ"
-
-#~ msgid "E463: Region is guarded, cannot modify"
-#~ msgstr "E463: อๅโ๎็์๎ๆํ๎ ่็์ๅํ่๒ ๎๕๐เํๅ์๓ ๎แ๋เ๑๒"
-
-#~ msgid "E744: NetBeans does not allow changes in read-only files"
-#~ msgstr "E744: NetBeans ํๅ ไ๎๏๓๑๊เๅ๒ ่็์ๅํๅํ่้ โ ๔เ้๋เ๕ ๒๎๋๊๎ ไ๋ ๗๒ๅํ่"
-
-#~ msgid "Need encryption key for \"%s\""
-#~ msgstr "า๐ๅแ๓ๅ๒๑ ๊๋๗ ๘่๔๐๎โเํ่ ไ๋ \"%s\""
-
-#~ msgid "empty keys are not allowed"
-#~ msgstr "ฯ๓๑๒๛ๅ ๊๋๗่ ํๅ ไ๎๏๓๑๒่์๛"
-
-#~ msgid "dictionary is locked"
-#~ msgstr "ั๋๎โเ๐ ็เแ๋๎๊่๐๎โเํ"
-
-#~ msgid "list is locked"
-#~ msgstr "ั๏่๑๎๊ ็เแ๋๎๊่๐๎โเํ"
-
-#~ msgid "failed to add key '%s' to dictionary"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ไ๎แเโ่๒ ๊๋๗ '%s' ๊ ๑๋๎โเ๐"
-
-#~ msgid "index must be int or slice, not %s"
-#~ msgstr "ศํไๅ๊๑ ไ๎๋ๆๅํ แ๛๒ ๖ๅ๋๛์ ๗่๑๋๎์ ่๋่ โ๛แ๎๐๊๎้, เ ํๅ %s"
-
-#~ msgid "expected str() or unicode() instance, but got %s"
-#~ msgstr "ฮๆ่ไเ๋๑ ๊็ๅ์๏๋๐ str() ่๋่ unicode(), ํ๎ ๏๎๋๓๗ๅํ %s"
-
-#~ msgid "expected bytes() or str() instance, but got %s"
-#~ msgstr "ฮๆ่ไเ๋๑ ๊็ๅ์๏๋๐ bytes() ่๋่ str(), ํ๎ ๏๎๋๓๗ๅํ %s"
-
-#~ msgid ""
-#~ "expected int(), long() or something supporting coercing to long(), but "
-#~ "got %s"
-#~ msgstr ""
-#~ "ฮๆ่ไเ๋๎๑ int(), long() ่๋่ ๗๒๎-๒๎ ๏๐่โ๎ไ่์๎ๅ ๊ long(), ํ๎ ๏๎๋๓๗ๅํ๎ %s"
-
-#~ msgid "expected int() or something supporting coercing to int(), but got %s"
-#~ msgstr "ฮๆ่ไเ๋๎๑ int() ่๋่ ๗๒๎-๒๎ ๏๐่โ๎ไ่์๎ๅ ๊ int(), ํ๎ ๏๎๋๓๗ๅํ๎ %s"
-
-#~ msgid "value is too large to fit into C int type"
-#~ msgstr "วํเ๗ๅํ่ๅ ๑๋่๘๊๎์ โๅ๋่๊๎ ไ๋ ๖ๅ๋๎๗่๑๋ๅํํ๎ใ๎ ๒่๏เ C"
-
-#~ msgid "value is too small to fit into C int type"
-#~ msgstr "วํเ๗ๅํ่ๅ ๑๋่๘๊๎์ ์เ๋๎ ไ๋ ๖ๅ๋๎๗่๑๋ๅํํ๎ใ๎ ๒่๏เ C"
-
-#~ msgid "number must be greater then zero"
-#~ msgstr "อ๎์ๅ๐ ไ๎๋ๆๅํ แ๛๒ แ๎๋๘ๅ ํ๓๋"
-
-#~ msgid "number must be greater or equal to zero"
-#~ msgstr "อ๎์ๅ๐ ไ๎๋ๆๅํ แ๛๒ แ๎๋๘ๅ ่๋่ ๐เโๅํ ํ๓๋"
-
-#~ msgid "can't delete OutputObject attributes"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ๓ไเ๋่๒ เ๒๐่แ๓๒๛ OutputObject"
-
-#~ msgid "invalid attribute: %s"
-#~ msgstr "อๅ๏๐เโ่๋ํ๛้ เ๒๐่แ๓๒: %s"
-
-#~ msgid "E264: Python: Error initialising I/O objects"
-#~ msgstr "E264: Python: ฮ๘่แ๊เ ่ํ่๖่เ๋่็เ๖่่ ๎แ๚ๅ๊๒๎โ I/O"
-
-#~ msgid "failed to change directory"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ๑์ๅํ่๒ ๊เ๒เ๋๎ใ"
-
-#~ msgid "expected 3-tuple as imp.find_module() result, but got %s"
-#~ msgstr "ฮๆ่ไเ๋๑ 3-๊๎๐๒ๅๆ ๊เ๊ ๐ๅ็๓๋๒เ๒ imp.find_module(), ํ๎ ๏๎๋๓๗ๅํ %s"
-
-#~ msgid ""
-#~ "expected 3-tuple as imp.find_module() result, but got tuple of size %d"
-#~ msgstr ""
-#~ "ฮๆ่ไเ๋๑ 3-๊๎๐๒ๅๆ ๊เ๊ ๐ๅ็๓๋๒เ๒ imp.find_module(), ํ๎ ๏๎๋๓๗ๅํ ๊๎๐๒ๅๆ ๑ "
-#~ "๐เ็์ๅ๐๎์ %d"
-
-#~ msgid "internal error: imp.find_module returned tuple with NULL"
-#~ msgstr "ยํ๓๒๐ๅํํ ๎๘่แ๊เ: imp.find_module โ๎็โ๐เ๒่๋ "
-
-#~ msgid "cannot delete vim.Dictionary attributes"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ๓ไเ๋่๒ เ๒๐่แ๓๒๛ vim.Dictionary"
-
-#~ msgid "cannot modify fixed dictionary"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ่็์ๅํ่๒ ๔่๊๑่๐๎โเํํ๛้ ๑๋๎โเ๐"
-
-#~ msgid "cannot set attribute %s"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ๓๑๒เํ๎โ่๒ เ๒๐่แ๓๒ %s"
-
-#~ msgid "hashtab changed during iteration"
-#~ msgstr "ี๘-๒เแ๋่๖เ ่็์ๅํ่๋เ๑ ๏๐่ ่๒ๅ๐เ๖่่"
-
-#~ msgid "expected sequence element of size 2, but got sequence of size %d"
-#~ msgstr ""
-#~ "ฮๆ่ไเ๋๑ ๋ๅ์ๅํ๒-๏๎๑๋ๅไ๎โเ๒ๅ๋ํ๎๑๒ ๐เ็์ๅ๐เ 2, เ ๐เ็์ๅ๐ ๏๎๋๓๗ๅํํ๎้ "
-#~ "๏๎๑๋ๅไ๎โเ๒ๅ๋ํ๎๑๒่ %d"
-
-#~ msgid "list constructor does not accept keyword arguments"
-#~ msgstr "ส๎ํ๑๒๐๓๊๒๎๐ ๑๏่๑๊เ ํๅ ไ๎๏๓๑๊เๅ๒ ๊๋๗ๅโ๛ๅ ๑๋๎โเ ๊เ๊ เ๐ใ๓์ๅํ๒๛"
-
-#~ msgid "list index out of range"
-#~ msgstr "ศํไๅ๊๑ ๑๏่๑๊เ ็เ ๏๐ๅไๅ๋เ์่ ไ่เ๏เ็๎ํเ"
-
-#~ msgid "internal error: failed to get vim list item %d"
-#~ msgstr "ยํ๓๒๐ๅํํ ๎๘่แ๊เ: ํๅ ๓ไเ๋๎๑ ๏๎๋๓๗่๒ ๋ๅ์ๅํ๒ VIM-๑๏่๑๊เ %d"
-
-#~ msgid "failed to add item to list"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ไ๎แเโ่๒ ๋ๅ์ๅํ๒ โ ๑๏่๑๎๊"
-
-#~ msgid "internal error: no vim list item %d"
-#~ msgstr "ยํ๓๒๐ๅํํ ๎๘่แ๊เ: ํๅ๒ ๋ๅ์ๅํ๒เ VIM-๑๏่๑๊เ %d"
-
-#~ msgid "internal error: failed to add item to list"
-#~ msgstr "ยํ๓๒๐ๅํํ ๎๘่แ๊เ: ํๅ ๓ไเ๋๎๑ ไ๎แเโ่๒ ๋ๅ์ๅํ๒ โ ๑๏่๑๎๊"
-
-#~ msgid "cannot delete vim.List attributes"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ๓ไเ๋่๒ เ๒๐่แ๓๒๛ vim.List"
-
-#~ msgid "cannot modify fixed list"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ่็์ๅํ่๒ ๔่๊๑่๐๎โเํํ๛้ ๑๏่๑๎๊"
-
-#~ msgid "unnamed function %s does not exist"
-#~ msgstr "อๅ ๑๓๙ๅ๑๒โ๓ๅ๒ แๅ็๛์ํํ๎้ ๔๓ํ๊๖่่ %s"
-
-#~ msgid "function %s does not exist"
-#~ msgstr "ิ๓ํ๊๖่ %s ํๅ ๑๓๙ๅ๑๒โ๓ๅ๒"
-
-#~ msgid "function constructor does not accept keyword arguments"
-#~ msgstr "ส๎ํ๑๒๐๓๊๒๎๐ ๔๓ํ๊๖่่ ํๅ ไ๎๏๓๑๊เๅ๒ ๊๋๗ๅโ๛ๅ ๑๋๎โเ ๊เ๊ เ๐ใ๓์ๅํ๒๛"
-
-#~ msgid "failed to run function %s"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ โ๛๏๎๋ํ่๒ ๔๓ํ๊๖่ %s"
-
-#~ msgid "problem while switching windows"
-#~ msgstr "ฯ๐๎แ๋ๅ์เ ๏๐่ ๏ๅ๐ๅ๊๋๗ๅํ่่ ๎๊๎ํ"
-
-#~ msgid "unable to unset global option %s"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ๑แ๐๎๑่๒ ใ๋๎แเ๋ํ๓ ๎๏๖่ %s"
-
-#~ msgid "unable to unset option %s which does not have global value"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ๑แ๐๎๑่๒ ๎๏๖่ %s แๅ็ ใ๋๎แเ๋ํ๎ใ๎ ็ํเ๗ๅํ่"
-
-#~ msgid "attempt to refer to deleted tab page"
-#~ msgstr "ฯ๎๏๛๒๊เ ๑๎๑๋เ๒๑ ํเ ๓ไเ๋ธํํ๓ โ๊๋เไ๊๓"
-
-#~ msgid "no such tab page"
-#~ msgstr "อๅ๒ ๒เ๊๎้ โ๊๋เไ๊่"
-
-#~ msgid "attempt to refer to deleted window"
-#~ msgstr "ฯ๎๏๛๒๊เ ๑๎๑๋เ๒๑ ํเ ็เ๊๐๛๒๎ๅ ๎๊ํ๎"
-
-#~ msgid "readonly attribute: buffer"
-#~ msgstr "ภ๒๐่แ๓๒ ๒๎๋๊๎ ไ๋ ๗๒ๅํ่: แ๓๔ๅ๐"
-
-#~ msgid "cursor position outside buffer"
-#~ msgstr "ฯ๎็่๖่ ๊๓๐๑๎๐เ ํเ๕๎ไ่๒๑ โํๅ แ๓๔ๅ๐เ"
-
-#~ msgid "no such window"
-#~ msgstr "อๅ๒ ๒เ๊๎ใ๎ ๎๊ํเ"
-
-#~ msgid "attempt to refer to deleted buffer"
-#~ msgstr "ฯ๎๏๛๒๊เ ๑๎๑๋เ๒๑ ํเ ๓ํ่๗๒๎ๆๅํํ๛้ แ๓๔ๅ๐"
-
-#~ msgid "failed to rename buffer"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ๏ๅ๐ๅ่์ๅํ๎โเ๒ แ๓๔ๅ๐"
-
-#~ msgid "mark name must be a single character"
-#~ msgstr "อเ็โเํ่ๅ ๎๒์ๅ๒๊่ ไ๎๋ๆํ๎ แ๛๒ ๎ไํ่์ ๑่์โ๎๋๎์"
-
-#~ msgid "expected vim.Buffer object, but got %s"
-#~ msgstr "ฮๆ่ไเ๋๑ ๎แ๚ๅ๊๒ vim.Buffer, ํ๎ ๏๎๋๓๗ๅํ %s"
-
-#~ msgid "failed to switch to buffer %d"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ๏ๅ๐ๅ๊๋๗่๒๑ ํเ แ๓๔ๅ๐ %d"
-
-#~ msgid "expected vim.Window object, but got %s"
-#~ msgstr "ฮๆ่ไเ๋๑ ๎แ๚ๅ๊๒ vim.Window, ํ๎ ๏๎๋๓๗ๅํ %s"
-
-#~ msgid "failed to find window in the current tab page"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ํเ้๒่ ๎๊ํ๎ โ ๒ๅ๊๓๙ๅ้ โ๊๋เไ๊ๅ"
-
-#~ msgid "did not switch to the specified window"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ๏ๅ๐ๅ๊๋๗่๒๑ ํเ ๓๊เ็เํํ๎ๅ ๎๊ํ๎"
-
-#~ msgid "expected vim.TabPage object, but got %s"
-#~ msgstr "ฮๆ่ไเ๋๑ ๎แ๚ๅ๊๒ vim.TabPage, ํ๎ ๏๎๋๓๗ๅํ %s"
-
-#~ msgid "did not switch to the specified tab page"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ๏ๅ๐ๅ๊๋๗่๒๑ ํเ ๓๊เ็เํํ๓ โ๊๋เไ๊๓"
-
-#~ msgid "failed to run the code"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ โ๛๏๎๋ํ่๒ ๊๎ไ"
-
-#~ msgid "E858: Eval did not return a valid python object"
-#~ msgstr "E858: Eval ํๅ โ๎็โ๐เ๒่๋ ไ๎๏๓๑๒่์๎ใ๎ ๎แ๚ๅ๊๒เ Python"
-
-#~ msgid "E859: Failed to convert returned python object to vim value"
-#~ msgstr ""
-#~ "E859: อๅ ๓ไเ๋๎๑ ๏๐ๅ๎แ๐เ็๎โเ๒ โ๎็โ๐เ๙ธํํ๛้ ๎แ๚ๅ๊๒ Python โ ็ํเ๗ๅํ่ๅ VIM"
-
-#~ msgid "unable to convert %s to vim dictionary"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ๏๐ๅ๎แ๐เ็๎โเ๒ %s โ ๑๋๎โเ๐ VIM"
-
-#~ msgid "unable to convert %s to vim structure"
-#~ msgstr "อๅโ๎็์๎ๆํ๎ ๏๐ๅ๎แ๐เ็๎โเ๒ %s โ ๑๒๐๓๊๒๓๐๓ VIM"
-
-#~ msgid "internal error: NULL reference passed"
-#~ msgstr "ยํ๓๒๐ๅํํ ๎๘่แ๊เ: ๏ๅ๐ๅไเํเ ๑๑๛๋๊เ ํเ NULL"
-
-#~ msgid "internal error: invalid value type"
-#~ msgstr "ยํ๓๒๐ๅํํ ๎๘่แ๊เ: ํๅ๏๐เโ่๋ํ๛้ ๒่๏ ็ํเ๗ๅํ่"
-
-#~ msgid ""
-#~ "Failed to set path hook: sys.path_hooks is not a list\n"
-#~ "You should now do the following:\n"
-#~ "- append vim.path_hook to sys.path_hooks\n"
-#~ "- append vim.VIM_SPECIAL_PATH to sys.path\n"
-#~ msgstr ""
-#~ "ฮ๘่แ๊เ ๏๐่ ๓๑๒เํ๎โ๊ๅ ๏ๅ๐ๅ๕โเ๒๗่๊เ ๏๓๒่: sys.path_hooks ํๅ โ๋ๅ๒๑ "
-#~ "๑๏่๑๊๎์\n"
-#~ "ั๋ๅไ๓ๅ๒ ๑ไๅ๋เ๒ ๑๋ๅไ๓๙ๅๅ:\n"
-#~ "— ฤ๎แเโ่๒ vim.path_hook โ sys.path_hooks\n"
-#~ "— ฤ๎แเโ่๒ vim.VIM_SPECIAL_PATH โ sys.path\n"
-
-#~ msgid ""
-#~ "Failed to set path: sys.path is not a list\n"
-#~ "You should now append vim.VIM_SPECIAL_PATH to sys.path"
-#~ msgstr ""
-#~ "ฮ๘่แ๊เ ๏๐่ ๓๑๒เํ๎โ๊ๅ ๏๓๒่: sys.path ํๅ โ๋ๅ๒๑ ๑๏่๑๊๎์\n"
-#~ "ั๋ๅไ๓ๅ๒ ไ๎แเโ่๒ vim.VIM_SPECIAL_PATH โ sys.path"
-
-#~ msgid ""
-#~ "E887: Sorry, this command is disabled, the Python's site module could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E887: ส ๑๎ๆเ๋ๅํ่ ๒เ ๊๎์เํไเ ํๅ ๐เแ๎๒เๅ๒, ๏๎๑๊๎๋๊๓ ํๅ ็เใ๐๓ๆๅํ ์๎ไ๓๋ "
-#~ "Python site."
diff --git a/src/nvim/po/ru.po b/src/nvim/po/ru.po
index c8146e8c47..e5be489d72 100644
--- a/src/nvim/po/ru.po
+++ b/src/nvim/po/ru.po
@@ -2458,7 +2458,7 @@ msgstr "E216: ะะตััƒั‰ะตัั‚ะฒัƒัŽั‰ะฐั ะณั€ัƒะฟะฟะฐ ะธะปะธ ัะพะฑั‹ั‚ะธะต: %
#: ../fileio.c:6090
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
"--- ะะฒั‚ะพะบะพะผะฐะฝะดั‹ ---"
@@ -2482,7 +2482,7 @@ msgstr "E218: ัะปะธัˆะบะพะผ ะณะปัƒะฑะพะบะพ ะฒะปะพะถะตะฝะฝั‹ะต ะฐะฒั‚ะพะบะพะผะฐะ
#: ../fileio.c:7143
#, c-format
-msgid "%s Auto commands for \"%s\""
+msgid "%s Autocommands for \"%s\""
msgstr "%s ะะฒั‚ะพะบะพะผะฐะฝะดั‹ ะดะปั \"%s\""
#: ../fileio.c:7149
@@ -2676,11 +2676,6 @@ msgstr "E49: ะะตะดะพะฟัƒัั‚ะธะผั‹ะน ั€ะฐะทะผะตั€ ะฟั€ะพะบั€ัƒั‚ะบะธ"
msgid "E901: Job table is full"
msgstr ""
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
#: ../globals.h:1024
#, c-format
msgid "E364: Library call failed for \"%s()\""
@@ -3381,14 +3376,13 @@ msgstr "-t ะผะตั‚ะบะฐ ั€ะตะดะฐะบั‚ะธั€ะพะฒะฐะฝะธะต ั„ะฐะนะปะฐ ั ัƒะบะฐะทะฐะฝ
#: ../main.c:2181
msgid "-q [errorfile] edit file with first error"
msgstr ""
-"-q [ั„ะฐะนะป-ะพัˆะธะฑะพะบ]\n"
-"\t\t\t\t ั€ะตะดะฐะบั‚ะธั€ะพะฒะฐะฝะธะต ั„ะฐะนะปะฐ ั ะฟะตั€ะฒะพะน ะพัˆะธะฑะบะพะน"
+"-q [ั„ะฐะนะป-ะพัˆะธะฑะพะบ] ั€ะตะดะฐะบั‚ะธั€ะพะฒะฐะฝะธะต ั„ะฐะนะปะฐ ั ะฟะตั€ะฒะพะน ะพัˆะธะฑะบะพะน"
#: ../main.c:2187
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
@@ -3484,8 +3478,8 @@ msgstr "-N\t\t\tะ ะตะถะธะผ ะฝะตะฟะพะปะฝะพะน ัะพะฒะผะตัั‚ะธะผะพัั‚ะธ ั Vi: 'n
#: ../main.c:2215
msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]"
msgstr ""
-"-V[N][ั„ะฐะนะป]\t\tะ’ั‹ะฒะพะดะธั‚ัŒ ะดะพะฟะพะปะฝะธั‚ะตะปัŒะฝั‹ะต ัะพะพะฑั‰ะตะฝะธั\n"
-"\t\t\t\t[ัƒั€ะพะฒะตะฝัŒ N] [ะทะฐะฟะธัั‹ะฒะฐั‚ัŒ ะฒ ั„ะฐะนะป]"
+"-V[N][ั„ะฐะนะป]\t\tะ’ั‹ะฒะพะดะธั‚ัŒ ะดะพะฟะพะปะฝะธั‚ะตะปัŒะฝั‹ะต ัะพะพะฑั‰ะตะฝะธั "
+"[ัƒั€ะพะฒะตะฝัŒ N] [ะทะฐะฟะธัั‹ะฒะฐั‚ัŒ ะฒ ั„ะฐะนะป]"
#: ../main.c:2216
msgid "-D\t\t\tDebugging mode"
@@ -4110,7 +4104,6 @@ msgstr ""
#: ../memline.c:3245
msgid " Quit, or continue with caution.\n"
msgstr ""
-" \n"
" ะ—ะฐะฒะตั€ัˆะธั‚ะต ั€ะฐะฑะพั‚ัƒ ะธะปะธ ะฟั€ะพะดะพะปะถะฐะนั‚ะต ั ะพัั‚ะพั€ะพะถะฝะพัั‚ัŒัŽ.\n"
#: ../memline.c:3246
@@ -4281,12 +4274,6 @@ msgstr "ัั‚ั€ะพะบะฐ %4ld:"
msgid "E354: Invalid register name: '%s'"
msgstr "E354: ะะตะดะพะฟัƒัั‚ะธะผะพะต ะธะผั ั€ะตะณะธัั‚ั€ะฐ: '%s'"
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr ""
-"ะŸะตั€ะตะฒะพะด ัะพะพะฑั‰ะตะฝะธะน ะฝะฐ ั€ัƒััะบะธะน ัะทั‹ะบ: ะ’ะฐัะธะปะธะน ะ ะฐะณะพะทะธะฝ <vrr@users.sourceforge."
-"net>, ะกะตั€ะณะตะน ะะปั‘ัˆะธะฝ <alyoshin.s@gmail.com>"
-
#: ../message.c:986
msgid "Interrupt: "
msgstr "ะŸั€ะตั€ั‹ะฒะฐะฝะธะต: "
@@ -5115,7 +5102,7 @@ msgstr "E876: (ั€ะตะณ. ะฒั‹ั€ะฐะถะตะฝะธะต ะะšะ) ะฝะตะดะพัั‚ะฐั‚ะพั‡ะฝะพ ะผะตั
#: ../regexp_nfa.c:4571 ../regexp_nfa.c:4869
msgid ""
-"Could not open temporary log file for writing, displaying on stderr ... "
+"Could not open temporary log file for writing, displaying on stderr... "
msgstr ""
"ะะตะฒะพะทะผะพะถะฝะพ ะพั‚ะบั€ั‹ั‚ัŒ ั„ะฐะนะป ะฒั€ะตะผะตะฝะฝะพะณะพ ะถัƒั€ะฝะฐะปะฐ ะดะปั ะทะฐะฟะธัะธ, ะฒั‹ะฒะพะด ะฝะฐ stderr..."
@@ -5358,8 +5345,8 @@ msgstr "ะŸั€ะตะดัƒะฟั€ะตะถะดะตะฝะธะต: ั€ะตะณะธะพะฝ %s ะฝะต ะฟะพะดะดะตั€ะถะธะฒะฐะ
#: ../spell.c:4550
#, c-format
-msgid "Reading affix file %s ..."
-msgstr "ะงั‚ะตะฝะธะต ั„ะฐะนะปะฐ ะฐั„ั„ะธะบัะพะฒ %s ..."
+msgid "Reading affix file %s..."
+msgstr "ะงั‚ะตะฝะธะต ั„ะฐะนะปะฐ ะฐั„ั„ะธะบัะพะฒ %s..."
#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
#, c-format
@@ -5522,8 +5509,8 @@ msgstr "%s ะธะผะตะตั‚ ะดั€ัƒะณะพะต ะทะฝะฐั‡ะตะฝะธะต, ั‡ะตะผ ะฒ ั„ะฐะนะปะต .aff"
#: ../spell.c:5602
#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "ะงั‚ะตะฝะธะต ั„ะฐะนะปะฐ ัะปะพะฒะฐั€ั %s ..."
+msgid "Reading dictionary file %s..."
+msgstr "ะงั‚ะตะฝะธะต ั„ะฐะนะปะฐ ัะปะพะฒะฐั€ั %s..."
#: ../spell.c:5611
#, c-format
@@ -5557,8 +5544,8 @@ msgstr "ะŸั€ะพะฟัƒั‰ะตะฝะพ %d ัะปะพะฒ ั ะฝะต ASCII ัะธะผะฒะพะปะฐะผะธ ะฒ %s"
#: ../spell.c:6115
#, c-format
-msgid "Reading word file %s ..."
-msgstr "ะงั‚ะตะฝะธะต ั„ะฐะนะปะฐ ัะปะพะฒ %s ..."
+msgid "Reading word file %s..."
+msgstr "ะงั‚ะตะฝะธะต ั„ะฐะนะปะฐ ัะปะพะฒ %s..."
#: ../spell.c:6155
#, c-format
@@ -5627,7 +5614,7 @@ msgstr "ะžะฑั‰ะตะต ะบะพะปะธั‡ะตัั‚ะฒะพ ัะปะพะฒ: %d"
#: ../spell.c:7655
#, c-format
-msgid "Writing suggestion file %s ..."
+msgid "Writing suggestion file %s..."
msgstr "ะ—ะฐะฟะธััŒ ั„ะฐะนะปะฐ ะฟั€ะตะดะปะพะถะตะฝะธั ะธัะฟั€ะฐะฒะปะตะฝะธะน ะฟั€ะฐะฒะพะฟะธัะฐะฝะธั %s"
#: ../spell.c:7707 ../spell.c:7927
@@ -5654,8 +5641,8 @@ msgstr "ะŸั€ะตะดัƒะฟั€ะตะถะดะตะฝะธะต: ะพะฑะฐ ัะพัั‚ะฐะฒะฝั‹ะต ะธ ัƒะบะฐะทะฐะฝะ
#: ../spell.c:7920
#, c-format
-msgid "Writing spell file %s ..."
-msgstr "ะ—ะฐะฟะธััŒ ั„ะฐะนะปะฐ ะฟั€ะฐะฒะพะฟะธัะฐะฝะธั %s ..."
+msgid "Writing spell file %s..."
+msgstr "ะ—ะฐะฟะธััŒ ั„ะฐะนะปะฐ ะฟั€ะฐะฒะพะฟะธัะฐะฝะธั %s..."
#: ../spell.c:7925
msgid "Done!"
diff --git a/src/nvim/po/sjiscorr.c b/src/nvim/po/sjiscorr.c
deleted file mode 100644
index ebcbe16dee..0000000000
--- a/src/nvim/po/sjiscorr.c
+++ /dev/null
@@ -1,45 +0,0 @@
-// Simplistic program to correct SJIS inside strings.
-// When a trail byte is a backslash it needs to be doubled.
-// Public domain.
-
-#include <stdio.h>
-#include <string.h>
-
-int main(int argc, char **argv)
-{
- char buffer[BUFSIZ];
- char *p;
-
- while (fgets(buffer, BUFSIZ, stdin) != NULL)
- {
- for (p = buffer; *p != 0; p++)
- {
- if (strncmp(p, "charset=utf-8", 13) == 0)
- {
- fputs("charset=cp932", stdout);
- p += 12;
- }
- else if (strncmp(p, "# Original translations", 23) == 0)
- {
- fputs("# generated from ja.po, DO NOT EDIT", stdout);
- while (p[1] != '\n')
- ++p;
- }
- else if (*(unsigned char *)p == 0x81 && p[1] == '_')
- {
- putchar('\\');
- ++p;
- }
- else
- {
- if (*p & 0x80)
- {
- putchar(*p++);
- if (*p == '\\')
- putchar(*p);
- }
- putchar(*p);
- }
- }
- }
-}
diff --git a/src/nvim/po/sk.cp1250.po b/src/nvim/po/sk.cp1250.po
index e3b7508cdc..74b8e1039c 100644
--- a/src/nvim/po/sk.cp1250.po
+++ b/src/nvim/po/sk.cp1250.po
@@ -2472,7 +2472,7 @@ msgstr "E216: Udalos alebo skupina %s neexistuje"
#: ../fileio.c:6090
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
"--- Automatick้ prํkazy ---"
@@ -2496,7 +2496,7 @@ msgstr "E218: vnorenia automatick้ho prํkazu s๚ prํliš hlbok้"
#: ../fileio.c:7143
#, c-format
-msgid "%s Auto commands for \"%s\""
+msgid "%s Autocommands for \"%s\""
msgstr "%s Automatick้ prํkazy pre \"%s\""
#: ../fileio.c:7149
@@ -2689,11 +2689,6 @@ msgstr "E49: Chybnแ hodnota veพkosti rolovania"
msgid "E901: Job table is full"
msgstr ""
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
#: ../globals.h:1024
#, c-format
msgid "E364: Library call failed for \"%s()\""
@@ -3395,7 +3390,7 @@ msgstr "-q [chybov s๚bor] upravi s๚bor na mieste vskytu prvej chyby"
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
@@ -3875,6 +3870,7 @@ msgid ""
"You may want to delete the .swp file now.\n"
"\n"
msgstr "Potom vymažte odkladacํ s๚bor s prํponou .swp.\n"
+"\n"
#. use msg() to start the scrolling properly
#: ../memline.c:1327
@@ -4273,10 +4269,6 @@ msgstr "riadok %4ld:"
msgid "E354: Invalid register name: '%s'"
msgstr "E354: '%s' nie je prํstupn้ meno registru"
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr "Sprแvca prekladu: Lubomir Host <rajo@platon.sk>"
-
#: ../message.c:986
msgid "Interrupt: "
msgstr "Prerušenie: "
@@ -5322,8 +5314,8 @@ msgstr "Varovanie: regi๓n %s nie je podporovan"
#: ../spell.c:4550
#, c-format
-msgid "Reading affix file %s ..."
-msgstr "Na่ํtavam s๚bor s prํponami %s ..."
+msgid "Reading affix file %s..."
+msgstr "Na่ํtavam s๚bor s prํponami %s..."
#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
#, c-format
@@ -5481,8 +5473,8 @@ msgstr "Hodnota %s sa odlišuje od hodnoty použitej v inom .aff s๚bore"
#: ../spell.c:5602
#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "Na่ํtavam slovnํk %s ..."
+msgid "Reading dictionary file %s..."
+msgstr "Na่ํtavam slovnํk %s..."
#: ../spell.c:5611
#, c-format
@@ -5516,8 +5508,8 @@ msgstr "Ignorovanch %d slov s nepํsmennmi znakmi v %s"
#: ../spell.c:6115
#, c-format
-msgid "Reading word file %s ..."
-msgstr "Na่ํtavam s๚bor so slovami %s ..."
+msgid "Reading word file %s..."
+msgstr "Na่ํtavam s๚bor so slovami %s..."
#: ../spell.c:6155
#, c-format
@@ -5614,8 +5606,8 @@ msgstr "Varovanie: špecifikovan้ spแjanie a nezalamovanie"
#: ../spell.c:7920
#, c-format
-msgid "Writing spell file %s ..."
-msgstr "Uklแdแm slovnํkov s๚bor %s ..."
+msgid "Writing spell file %s..."
+msgstr "Uklแdแm slovnํkov s๚bor %s..."
#: ../spell.c:7925
msgid "Done!"
diff --git a/src/nvim/po/sk.po b/src/nvim/po/sk.po
index 53f8a7b911..d3f954f6d8 100644
--- a/src/nvim/po/sk.po
+++ b/src/nvim/po/sk.po
@@ -2472,7 +2472,7 @@ msgstr "E216: Udalosป alebo skupina %s neexistuje"
#: ../fileio.c:6090
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
"--- Automatick้ prํkazy ---"
@@ -2496,7 +2496,7 @@ msgstr "E218: vnorenia automatick้ho prํkazu s๚ prํliน hlbok้"
#: ../fileio.c:7143
#, c-format
-msgid "%s Auto commands for \"%s\""
+msgid "%s Autocommands for \"%s\""
msgstr "%s Automatick้ prํkazy pre \"%s\""
#: ../fileio.c:7149
@@ -2689,11 +2689,6 @@ msgstr "E49: Chybnแ hodnota veตkosti rolovania"
msgid "E901: Job table is full"
msgstr ""
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
#: ../globals.h:1024
#, c-format
msgid "E364: Library call failed for \"%s()\""
@@ -3395,7 +3390,7 @@ msgstr "-q [chybov s๚bor] upraviป s๚bor na mieste vskytu prvej chyby"
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
@@ -3875,6 +3870,7 @@ msgid ""
"You may want to delete the .swp file now.\n"
"\n"
msgstr "Potom vymaพte odkladacํ s๚bor s prํponou .swp.\n"
+"\n"
#. use msg() to start the scrolling properly
#: ../memline.c:1327
@@ -4273,10 +4269,6 @@ msgstr "riadok %4ld:"
msgid "E354: Invalid register name: '%s'"
msgstr "E354: '%s' nie je prํstupn้ meno registru"
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr "Sprแvca prekladu: Lubomir Host <rajo@platon.sk>"
-
#: ../message.c:986
msgid "Interrupt: "
msgstr "Preruนenie: "
@@ -5322,8 +5314,8 @@ msgstr "Varovanie: regi๓n %s nie je podporovan"
#: ../spell.c:4550
#, c-format
-msgid "Reading affix file %s ..."
-msgstr "Na่ํtavam s๚bor s prํponami %s ..."
+msgid "Reading affix file %s..."
+msgstr "Na่ํtavam s๚bor s prํponami %s..."
#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
#, c-format
@@ -5481,8 +5473,8 @@ msgstr "Hodnota %s sa odliนuje od hodnoty pouพitej v inom .aff s๚bore"
#: ../spell.c:5602
#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "Na่ํtavam slovnํk %s ..."
+msgid "Reading dictionary file %s..."
+msgstr "Na่ํtavam slovnํk %s..."
#: ../spell.c:5611
#, c-format
@@ -5516,8 +5508,8 @@ msgstr "Ignorovanch %d slov s nepํsmennmi znakmi v %s"
#: ../spell.c:6115
#, c-format
-msgid "Reading word file %s ..."
-msgstr "Na่ํtavam s๚bor so slovami %s ..."
+msgid "Reading word file %s..."
+msgstr "Na่ํtavam s๚bor so slovami %s..."
#: ../spell.c:6155
#, c-format
@@ -5614,8 +5606,8 @@ msgstr "Varovanie: นpecifikovan้ spแjanie a nezalamovanie"
#: ../spell.c:7920
#, c-format
-msgid "Writing spell file %s ..."
-msgstr "Uklแdแm slovnํkov s๚bor %s ..."
+msgid "Writing spell file %s..."
+msgstr "Uklแdแm slovnํkov s๚bor %s..."
#: ../spell.c:7925
msgid "Done!"
diff --git a/src/nvim/po/sr.po b/src/nvim/po/sr.po
new file mode 100644
index 0000000000..88c5d18866
--- /dev/null
+++ b/src/nvim/po/sr.po
@@ -0,0 +1,7115 @@
+# Serbian Cyrillic translation for Vim
+#
+# Do ":help uganda" in Vim to read copying and usage conditions.
+# Do ":help credits" in Vim to see a list of people who contributed.
+# Copyright (C) 2017
+# This file is distributed under the same license as the Vim package.
+# FIRST AUTHOR Ivan Peลกiฤ‡ <ivan.pesic@gmail.com>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Vim(Serbian)\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-05-15 11:55+0400\n"
+"PO-Revision-Date: 2018-05-15 10:50+0400\n"
+"Last-Translator: Ivan Peลกiฤ‡ <ivan.pesic@gmail.com>\n"
+"Language-Team: Serbian\n"
+"Language: sr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+msgid "E831: bf_key_init() called with empty password"
+msgstr "E831: bf_key_init() ั˜ะต ะฟะพะทะฒะฐะฝะฐ ัะฐ ะฟั€ะฐะทะฝะพะผ ะปะพะทะธะฝะบะพะผ"
+
+msgid "E820: sizeof(uint32_t) != 4"
+msgstr "E820: sizeof(uint32_t) != 4"
+
+msgid "E817: Blowfish big/little endian use wrong"
+msgstr "E817: Blowfish ัƒะฟะพั‚ั€ะตะฑะฐ big/little endian ั˜ะต ะฟะพะณั€ะตัˆะฝะฐ"
+
+msgid "E818: sha256 test failed"
+msgstr "E818: sha256 ั‚ะตัั‚ ะฝะธั˜ะต ัƒัะฟะตะพ"
+
+msgid "E819: Blowfish test failed"
+msgstr "E819: Blowfish ั‚ะตัั‚ ะฝะธั˜ะต ัƒัะฟะตะพ"
+
+msgid "[Location List]"
+msgstr "[ะ›ะธัั‚ะฐ ะปะพะบะฐั†ะธั˜ะฐ]"
+
+msgid "[Quickfix List]"
+msgstr "[Quickfix ะปะธัั‚ะฐ]"
+
+msgid "E855: Autocommands caused command to abort"
+msgstr "E855: ะัƒั‚ะพะบะพะผะฐะฝะดะต ััƒ ะธะทะฐะทะฒะฐะปะต ะฟั€ะตะบะธะด ะบะพะผะฐะฝะดะต"
+
+msgid "E82: Cannot allocate any buffer, exiting..."
+msgstr "E82: ะะต ะผะพะถะต ะดะฐ ัะต ั€ะตะทะตั€ะฒะธัˆะต ะผะตะผะพั€ะธั˜ะฐ ะฝะธ ะทะฐ ั˜ะตะดะฐะฝ ะฑะฐั„ะตั€, ะธะทะปะฐะทะฐะบ..."
+
+msgid "E83: Cannot allocate buffer, using other one..."
+msgstr "E83: ะะต ะผะพะถะต ะดะฐ ัะต ั€ะตะทะตั€ะฒะธัˆะต ะผะตะผะพั€ะธั˜ะฐ ะทะฐ ะฑะฐั„ะตั€, ะบะพั€ะธัั‚ะธ ัะต ะดั€ัƒะณะธ..."
+
+msgid "E931: Buffer cannot be registered"
+msgstr "E931: ะ‘ะฐั„ะตั€ ะฝะต ะผะพะถะต ะดะฐ ัะต ั€ะตะณะธัั‚ั€ัƒั˜ะต"
+
+msgid "E937: Attempt to delete a buffer that is in use"
+msgstr "E937: ะŸะพะบัƒัˆะฐั˜ ะฑั€ะธัะฐัšะฐ ะฑะฐั„ะตั€ะฐ ะบะพั˜ะธ ั˜ะต ัƒ ัƒะฟะพั‚ั€ะตะฑะธ"
+
+msgid "E515: No buffers were unloaded"
+msgstr "E515: ะะธั˜ะตะดะฐะฝ ะฑะฐั„ะตั€ ะฝะธั˜ะต ัƒะบะปะพัšะตะฝ ะธะท ะผะตะผะพั€ะธั˜ะต"
+
+msgid "E516: No buffers were deleted"
+msgstr "E516: ะะธั˜ะตะดะฐะฝ ะฑะฐั„ะตั€ ะฝะธั˜ะต ะพะฑั€ะธัะฐะฝ"
+
+msgid "E517: No buffers were wiped out"
+msgstr "E517: ะะธั˜ะตะดะฐะฝ ะฑะฐั„ะตั€ ะฝะธั˜ะต ะพั‡ะธัˆั›ะตะฝ"
+
+msgid "1 buffer unloaded"
+msgstr "1 ะฑะฐั„ะตั€ ั˜ะต ัƒะบะปะพัšะตะฝ ะธะท ะผะตะผะพั€ะธั˜ะต"
+
+#, c-format
+msgid "%d buffers unloaded"
+msgstr "%d ะฑะฐั„ะตั€ะฐ ั˜ะต ัƒะบะปะพัšะตะฝะพ ะธะท ะผะตะผะพั€ะธั˜ะต"
+
+msgid "1 buffer deleted"
+msgstr "1 ะฑะฐั„ะตั€ ั˜ะต ะพะฑั€ะธัะฐะฝ"
+
+#, c-format
+msgid "%d buffers deleted"
+msgstr "%d ะฑะฐั„ะตั€ะฐ ั˜ะต ะพะฑั€ะธัะฐะฝะพ"
+
+msgid "1 buffer wiped out"
+msgstr "1 ะฑะฐั„ะตั€ ั˜ะต ะพั‡ะธัˆั›ะตะฝ"
+
+#, c-format
+msgid "%d buffers wiped out"
+msgstr "%d ะฑะฐั„ะตั€ะฐ ั˜ะต ะพั‡ะธัˆั›ะตะฝะพ"
+
+msgid "E90: Cannot unload last buffer"
+msgstr "E90: ะŸะพัะปะตะดัšะธ ะฑะฐั„ะตั€ ะฝะต ะผะพะถะต ะดะฐ ัะต ัƒะบะปะพะฝะธ ะธะท ะผะตะผะพั€ะธั˜ะต"
+
+msgid "E84: No modified buffer found"
+msgstr "E84: ะะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝ ะธะทะผะตัšะตะฝะธ ะฑะฐั„ะตั€"
+
+msgid "E85: There is no listed buffer"
+msgstr "E85: ะะตะผะฐ ะฑะฐั„ะตั€ะฐ ะฝะฐ ะปะธัั‚ะธ"
+
+msgid "E87: Cannot go beyond last buffer"
+msgstr "E87: ะะต ะผะพะถะต ะดะฐ ัะต ะธะดะต ะธะทะฐ ะฟะพัะปะตะดัšะตะณ ะฑะฐั„ะตั€ะฐ"
+
+msgid "E88: Cannot go before first buffer"
+msgstr "E88: ะะต ะผะพะถะต ะดะฐ ัะต ะธะดะต ะธัะฟั€ะตะด ะฟั€ะฒะพะณ ะฑะฐั„ะตั€ะฐ"
+
+#, c-format
+msgid "E89: No write since last change for buffer %ld (add ! to override)"
+msgstr ""
+"E89: ะžะด ะฟะพัะปะตะดัšะต ะธะทะผะตะฝะต ะฝะธั˜ะต ะฑะธะปะพ ัƒะฟะธัะฐ ะทะฐ ะฑะฐั„ะตั€ %ld (ะดะพะดะฐั˜ั‚ะต ! ะดะฐ "
+"ะฟั€ะตะผะพัั‚ะธั‚ะต)"
+
+msgid "E948: Job still running (add ! to end the job)"
+msgstr "E948: ะ—ะฐะดะฐั‚ะฐะบ ัะต ั˜ะพัˆ ะธะทะฒั€ัˆะฐะฒะฐ (ะดะพะดะฐั˜ั‚ะต ! ะดะฐ ะทะฐัƒัั‚ะฐะฒะธั‚ะต ะทะฐะดะฐั‚ะฐะบ)"
+
+msgid "E37: No write since last change (add ! to override)"
+msgstr "E37: ะะธั˜ะต ะฑะธะปะพ ัƒะฟะธัะฐ ะพะด ะฟะพัะปะตะดัšะต ะฟั€ะพะผะตะฝะต (ะดะพะดะฐั˜ั‚ะต ! ะดะฐ ะฟั€ะตะผะพัั‚ะธั‚ะต)"
+
+msgid "E948: Job still running"
+msgstr "E948: ะ—ะฐะดะฐั‚ะฐะบ ัะต ะธ ะดะฐั™ะต ะธะทะฒั€ัˆะฐะฒะฐ"
+
+msgid "E37: No write since last change"
+msgstr "E37: ะะธั˜ะต ะฑะธะปะพ ัƒะฟะธัะฐ ะพะด ะฟะพัะปะตะดัšะต ะฟั€ะพะผะตะฝะต"
+
+msgid "W14: Warning: List of file names overflow"
+msgstr ""
+"W14: ะฃะฟะพะทะพั€ะตัšะต: ะŸั€ะตะบะพั€ะฐั‡ะตะฝะฐ ั˜ะต ะผะฐะบัะธะผะฐะปะฝะฐ ะฒะตะปะธั‡ะธะฝะฐ ะปะธัั‚ะต ะธะผะตะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ"
+
+#, c-format
+msgid "E92: Buffer %ld not found"
+msgstr "E92: ะ‘ะฐั„ะตั€ %ld ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝ"
+
+#, c-format
+msgid "E93: More than one match for %s"
+msgstr "E93: ะ’ะธัˆะต ะพะด ั˜ะตะดะฝะพะณ ะฟะพะดัƒะดะฐั€ะฐัšะฐ ัะฐ %s"
+
+#, c-format
+msgid "E94: No matching buffer for %s"
+msgstr "E94: ะะธั˜ะตะดะฐะฝ ะฑะฐั„ะตั€ ัะต ะฝะต ะฟะพะดัƒะดะฐั€ะฐ ัะฐ %s"
+
+#, c-format
+msgid "line %ld"
+msgstr "ะปะธะฝะธั˜ะฐ %ld"
+
+msgid "E95: Buffer with this name already exists"
+msgstr "E95: ะ‘ะฐั„ะตั€ ัะฐ ะพะฒะธะผ ะธะผะตะฝะพะผ ะฒะตั› ะฟะพัั‚ะพั˜ะธ"
+
+msgid " [Modified]"
+msgstr "[ะ˜ะทะผะตัšะตะฝะพ]"
+
+msgid "[Not edited]"
+msgstr "[ะะธั˜ะต ัƒั€ะตั’ะธะฒะฐะฝะพ]"
+
+msgid "[New file]"
+msgstr "[ะะพะฒะฐ ะดะฐั‚ะพั‚ะตะบะฐ]"
+
+msgid "[Read errors]"
+msgstr "[ะ“ั€ะตัˆะบะต ะฟั€ะธ ั‡ะธั‚ะฐัšัƒ]"
+
+msgid "[RO]"
+msgstr "[ะกะง]"
+
+msgid "[readonly]"
+msgstr "[ัะฐะผะพ ะทะฐ ั‡ะธั‚ะฐัšะต]"
+
+#, c-format
+msgid "1 line --%d%%--"
+msgstr "1 ะปะธะฝะธั˜ะฐ --%d%%--"
+
+#, c-format
+msgid "%ld lines --%d%%--"
+msgstr "%ld ะปะธะฝะธั˜ะฐ --%d%%--"
+
+#, c-format
+msgid "line %ld of %ld --%d%%-- col "
+msgstr "ะปะธะฝะธั˜ะฐ %ld ะพะด %ld --%d%%-- ะบะพะป "
+
+msgid "[No Name]"
+msgstr "[ะ‘ะตะท ะธะผะตะฝะฐ]"
+
+msgid "help"
+msgstr "ะฟะพะผะพั›"
+
+msgid "[Help]"
+msgstr "[ะŸะพะผะพั›]"
+
+msgid "[Preview]"
+msgstr "[ะŸั€ะตะณะปะตะด]"
+
+msgid "All"
+msgstr "ะกะฒะต"
+
+msgid "Bot"
+msgstr "ะ”ะฝะพ"
+
+msgid "Top"
+msgstr "ะ’ั€ั…"
+
+msgid ""
+"\n"
+"# Buffer list:\n"
+msgstr ""
+"\n"
+"# ะ›ะธัั‚ะฐ ะฑะฐั„ะตั€ะฐ:\n"
+
+msgid "E382: Cannot write, 'buftype' option is set"
+msgstr "E382: ะฃะฟะธั ะฝะธั˜ะต ะผะพะณัƒั›, ะฟะพัั‚ะฐะฒั™ะตะฝะฐ ั˜ะต 'buftype' ะพะฟั†ะธั˜ะฐ"
+
+msgid "[Scratch]"
+msgstr "[ะŸั€ะฐะทะฝะพ]"
+
+msgid ""
+"\n"
+"--- Signs ---"
+msgstr ""
+"\n"
+"--- ะ—ะฝะฐั†ะธ ---"
+
+#, c-format
+msgid "Signs for %s:"
+msgstr "ะ—ะฝะฐั†ะธ ะทะฐ %s:"
+
+#, c-format
+msgid " line=%ld id=%d name=%s"
+msgstr " ะปะธะฝะธั˜ะฐ=%ld ะธะด=%d ะธะผะต=%s"
+
+msgid "E902: Cannot connect to port"
+msgstr "E902: ะŸะพะฒะตะทะธะฒะฐัšะต ะฝะฐ ะฟะพั€ั‚ ะฝะธั˜ะต ะผะพะณัƒั›ะต"
+
+msgid "E901: gethostbyname() in channel_open()"
+msgstr "E901: gethostbyname() ัƒ channel_open()"
+
+msgid "E898: socket() in channel_open()"
+msgstr "E898: socket() ัƒ channel_open()"
+
+msgid "E903: received command with non-string argument"
+msgstr "E903: ะฟั€ะธะผัšะตะฝะฐ ะบะพะผะฐะฝะดะฐ ัะฐ ะฐั€ะณัƒะผะตะฝะพะผ ะบะพั˜ะธ ะฝะธั˜ะต ัั‚ั€ะธะฝะณ"
+
+msgid "E904: last argument for expr/call must be a number"
+msgstr "E904: ะฟะพัะปะตะดัšะธ ะฐั€ะณัƒะผะตะฝั‚ ะทะฐ expr/call ะผะพั€ะฐ ะฑะธั‚ะธ ะฑั€ะพั˜"
+
+msgid "E904: third argument for call must be a list"
+msgstr "E904: ั‚ั€ะตั›ะธ ะฐั€ะณัƒะผะตะฝั‚ ะทะฐ call ะผะพั€ะฐ ะฑะธั‚ะธ ะปะธัั‚ะฐ"
+
+#, c-format
+msgid "E905: received unknown command: %s"
+msgstr "E905: ะฟั€ะธะผั™ะตะฝะฐ ะฝะตะฟะพะทะฝะฐั‚ะฐ ะบะพะผะฐะฝะดะฐ: %s"
+
+#, c-format
+msgid "E630: %s(): write while not connected"
+msgstr "E630: %s(): ัƒะฟะธั ะดะพะบ ะฝะธั˜ะต ัƒัะฟะพัั‚ะฐะฒั™ะตะฝะฐ ะฒะตะทะฐ"
+
+#, c-format
+msgid "E631: %s(): write failed"
+msgstr "E631: %s(): ัƒะฟะธั ะฝะธั˜ะต ัƒัะฟะตะพ"
+
+#, c-format
+msgid "E917: Cannot use a callback with %s()"
+msgstr "E917: Callback ะฝะต ะผะพะถะต ะดะฐ ัะต ะบะพั€ะธัั‚ะธ ัะฐ %s()"
+
+msgid "E912: cannot use ch_evalexpr()/ch_sendexpr() with a raw or nl channel"
+msgstr ""
+"E912: ch_evalexpr()/ch_sendexpr() ะฝะต ะผะพะถะต ะดะฐ ัะต ะบะพั€ะธัั‚ะธ ัะฐ raw ะธะปะธ nl ะบะฐะฝะฐะปะพะผ"
+
+msgid "E906: not an open channel"
+msgstr "E906: ะฝะธั˜ะต ะพั‚ะฒะพั€ะตะฝ ะบะฐะฝะฐะป"
+
+msgid "E920: _io file requires _name to be set"
+msgstr "E920: _io ะดะฐั‚ะพั‚ะตะบะฐ ะทะฐั…ั‚ะตะฒะฐ ะดะฐ _name ะฑัƒะดะต ะฟะพัั‚ะฐะฒั™ะตะฝะพ"
+
+msgid "E915: in_io buffer requires in_buf or in_name to be set"
+msgstr "E915: in_io ะฑะฐั„ะตั€ ะทะฐั…ั‚ะตะฒะฐ ะดะฐ in_buf ะธะปะธ in_name ะฑัƒะดะต ะฟะพัั‚ะฐะฒั™ะตะฝะพ"
+
+#, c-format
+msgid "E918: buffer must be loaded: %s"
+msgstr "E918: ะฑะฐั„ะตั€ ะผะพั€ะฐ ะฑะธั‚ะธ ัƒั‡ะธั‚ะฐะฝ: %s"
+
+msgid "E821: File is encrypted with unknown method"
+msgstr "E821: ะ”ะฐั‚ะพั‚ะตะบะฐ ั˜ะต ัˆะธั„ั€ะพะฒะฐะฝะฐ ะฝะตะฟะพะทะฝะฐั‚ะพะผ ะผะตั‚ะพะดะพะผ"
+
+msgid "Warning: Using a weak encryption method; see :help 'cm'"
+msgstr "ะฃะฟะพะทะพั€ะตัšะต: ะšะพั€ะธัั‚ะธ ัะต ัะปะฐะฑะฐ ะผะตั‚ะพะดะฐ ัˆะธั„ั€ะธั€ะฐัšะฐ; ะฟะพะณะปะตะดะฐั˜ั‚ะต :help 'cm'"
+
+msgid "Enter encryption key: "
+msgstr "ะฃะฝะตัะธั‚ะต ะบั™ัƒั‡ ะทะฐ ัˆะธั„ั€ะธั€ะฐัšะต: "
+
+msgid "Enter same key again: "
+msgstr "ะฃะฝะตัะธั‚ะต ะธัั‚ะธ ะบั™ัƒั‡ ะฟะพะฝะพะฒะพ: "
+
+msgid "Keys don't match!"
+msgstr "ะšั™ัƒั‡ะตะฒะธ ะฝะธััƒ ะธัั‚ะธ!"
+
+msgid "[crypted]"
+msgstr "[ัˆะธั„ั€ะพะฒะฐะฝะพ]"
+
+#, c-format
+msgid "E720: Missing colon in Dictionary: %s"
+msgstr "E720: ะะตะดะพัั‚ะฐั˜ะต ั‚ะฐั‡ะบะฐ-ะทะฐั€ะตะท ัƒ ะ ะตั‡ะฝะธะบัƒ: %s"
+
+#, c-format
+msgid "E721: Duplicate key in Dictionary: \"%s\""
+msgstr "E721: ะ”ัƒะฟะปะธะบะฐั‚ ะบั™ัƒั‡ะฐ ัƒ ะ ะตั‡ะฝะธะบัƒ: \"%s\""
+
+#, c-format
+msgid "E722: Missing comma in Dictionary: %s"
+msgstr "E722: ะะตะดะพัั‚ะฐั˜ะต ะทะฐั€ะตะท ัƒ ะ ะตั‡ะฝะธะบัƒ: %s"
+
+#, c-format
+msgid "E723: Missing end of Dictionary '}': %s"
+msgstr "E723: ะะตะดะพัั‚ะฐั˜ะต ะบั€ะฐั˜ ะ ะตั‡ะฝะธะบะฐ '}': %s"
+
+msgid "extend() argument"
+msgstr "extend() ะฐั€ะณัƒะผะตะฝั‚"
+
+#, c-format
+msgid "E737: Key already exists: %s"
+msgstr "E737: ะšั™ัƒั‡ ะฒะตั› ะฟะพัั‚ะพั˜ะธ: %s"
+
+#, c-format
+msgid "E96: Cannot diff more than %ld buffers"
+msgstr "E96: ะะต ะผะพะถะต ะดะฐ ัะต ัƒะฟะพั€ะตั’ัƒั˜ะต ะฒะธัˆะต ะพะด %ld ะฑะฐั„ะตั€ะฐ"
+
+msgid "E810: Cannot read or write temp files"
+msgstr "E810: ะะธั˜ะต ะผะพะณัƒั›ะต ั‡ะธั‚ะฐัšะต ะธะปะธ ัƒะฟะธั ัƒ ะฟั€ะธะฒั€ะตะผะตะฝะต ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "E97: Cannot create diffs"
+msgstr "E97: ะะธั˜ะต ะผะพะณัƒั›ะต ะบั€ะตะธั€ะฐัšะต diff-ะพะฒะฐ"
+
+msgid "Patch file"
+msgstr "Patch ะดะฐั‚ะพั‚ะตะบะฐ"
+
+msgid "E816: Cannot read patch output"
+msgstr "E816: ะะธั˜ะต ะผะพะณัƒั›ะต ั‡ะธั‚ะฐัšะต patch ะธะทะปะฐะทะฐ"
+
+msgid "E98: Cannot read diff output"
+msgstr "E98: ะะธั˜ะต ะผะพะณัƒั›ะต ั‡ะธั‚ะฐัšะต diff ะธะทะปะฐะทะฐ"
+
+msgid "E99: Current buffer is not in diff mode"
+msgstr "E99: ะขะตะบัƒั›ะธ ะฑะฐั„ะตั€ ะฝะธั˜ะต ัƒ diff ั€ะตะถะธะผัƒ"
+
+msgid "E793: No other buffer in diff mode is modifiable"
+msgstr "E793: ะะธั˜ะตะดะฐะฝ ะดั€ัƒะณะธ ะฑะฐั„ะตั€ ัƒ diff ั€ะตะถะธะผัƒ ะฝะธั˜ะต ะธะทะผะตัšะธะฒ"
+
+msgid "E100: No other buffer in diff mode"
+msgstr "E100: ะฝะธั˜ะตะดะฐะฝ ะดั€ัƒะณะธ ะฑะฐั„ะตั€ ะฝะธั˜ะต ัƒ diff ั€ะตะถะธะผัƒ"
+
+msgid "E101: More than two buffers in diff mode, don't know which one to use"
+msgstr "E101: ะ’ะธัˆะต ะพะด ะดะฒะฐ ะฑะฐั„ะตั€ะฐ ััƒ ัƒ diff ั€ะตะถะธะผัƒ, ะฝะต ะทะฝะฐะผ ะบะพั˜ะธ ะดะฐ ะบะพั€ะธัั‚ะธะผ"
+
+#, c-format
+msgid "E102: Can't find buffer \"%s\""
+msgstr "E102: ะ‘ะฐั„ะตั€ \"%s\" ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะฝะฐั’ะต"
+
+#, c-format
+msgid "E103: Buffer \"%s\" is not in diff mode"
+msgstr "E103: ะ‘ะฐั„ะตั€ \"%s\" ะฝะธั˜ะต ัƒ diff ั€ะตะถะธะผัƒ"
+
+msgid "E787: Buffer changed unexpectedly"
+msgstr "E787: ะ‘ะฐั„ะตั€ ั˜ะต ะฝะตะพั‡ะตะบะธะฒะฐะฝะพ ะธะทะผะตัšะตะฝ"
+
+msgid "E104: Escape not allowed in digraph"
+msgstr "E104: Escape ะฝะธั˜ะต ะดะพะทะฒะพั™ะตะฝ ัƒ digraph"
+
+msgid "E544: Keymap file not found"
+msgstr "E544: Keymap ะดะฐั‚ะพั‚ะตะบะฐ ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝะฐ"
+
+msgid "E105: Using :loadkeymap not in a sourced file"
+msgstr "E105: ะšะพั€ะธัˆั›ะตัšะต :loadkeymap ะฒะฐะฝ ะดะฐั‚ะพั‚ะตะบะต ะบะพั˜ะฐ ัะต ัƒั‡ะธั‚ะฐะฒะฐ ะบะฐะพ ัะบั€ะธะฟั‚ะฐ"
+
+msgid "E791: Empty keymap entry"
+msgstr "E791: ะŸั€ะฐะทะฝะฐ keymap ัั‚ะฐะฒะบะฐ"
+
+msgid " Keyword completion (^N^P)"
+msgstr " ะ”ะพะฒั€ัˆะฐะฒะฐัšะต ะบั™ัƒั‡ะฝะต ั€ะตั‡ะธ (^N^P)"
+
+msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
+msgstr " ^X ั€ะตะถะธะผ (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
+
+msgid " Whole line completion (^L^N^P)"
+msgstr " ะ”ะพะฒั€ัˆะฐะฒะฐัšะต ั†ะตะปะต ะปะธะฝะธั˜ะต (^L^N^P)"
+
+msgid " File name completion (^F^N^P)"
+msgstr " ะ”ะพะฒั€ัˆะฐะฒะฐัšะต ะธะผะตะฝะฐ ะดะฐั‚ะพั‚ะตะบะต (^F^N^P)"
+
+msgid " Tag completion (^]^N^P)"
+msgstr " ะ”ะพะฒั€ัˆะฐะฒะฐัšะต ะพะทะฝะฐะบะต (^]^N^P)"
+
+msgid " Path pattern completion (^N^P)"
+msgstr " ะ”ะพะฒั€ัˆะฐะฒะฐัšะต ัˆะฐะฑะปะพะฝะฐ ะฟัƒั‚ะฐัšะต (^N^P)"
+
+msgid " Definition completion (^D^N^P)"
+msgstr " ะ”ะพะฒั€ัˆะฐะฒะฐัšะต ะดะตั„ะธะฝะธั†ะธั˜ะต (^D^N^P)"
+
+msgid " Dictionary completion (^K^N^P)"
+msgstr " ะ”ะพะฒั€ัˆะฐะฒะฐัšะต ั€ะตั‡ะฝะธะบะฐ (^K^N^P)"
+
+msgid " Thesaurus completion (^T^N^P)"
+msgstr " ะ”ะพะฒั€ัˆะฐะฒะฐัšะต ั€ะตั‡ะฝะธะบะฐ ัะธะฝะพะฝะธะผะฐ (^T^N^P)"
+
+msgid " Command-line completion (^V^N^P)"
+msgstr " ะ”ะพะฒั€ัˆะฐะฒะฐัšะต ะบะพะผะฐะฝะดะฝะต ะปะธะฝะธั˜ะต (^V^N^P)"
+
+msgid " User defined completion (^U^N^P)"
+msgstr " ะšะพั€ะธัะฝะธั‡ะบะธ ะดะตั„ะธะฝะธัะฐะฝะพ ะดะพะฒั€ัˆะฐะฒะฐัšะต (^U^N^P)"
+
+msgid " Omni completion (^O^N^P)"
+msgstr " Omni ะดะพะฒั€ัˆะฐะฒะฐัšะต (^O^N^P)"
+
+msgid " Spelling suggestion (s^N^P)"
+msgstr " ะŸั€ะฐะฒะพะฟะธัะฝะธ ะฟั€ะตะดะปะพะณ (s^N^P)"
+
+msgid " Keyword Local completion (^N^P)"
+msgstr " ะ”ะพะฒั€ัˆะฐะฒะฐัšะต ะปะพะบะฐะปะฝะต ะบั™ัƒั‡ะฝะต ั€ะตั‡ะธ (^N^P)"
+
+msgid "Hit end of paragraph"
+msgstr "ะ”ะพัั‚ะธะณะฝัƒั‚ ะบั€ะฐั˜ ะฟะฐััƒัะฐ"
+
+msgid "E839: Completion function changed window"
+msgstr "E839: ะคัƒะฝะบั†ะธั˜ะฐ ะดะพะฒั€ัˆะฐะฒะฐัšะฐ ั˜ะต ะฟั€ะพะผะตะฝะธะปะฐ ะฟั€ะพะทะพั€"
+
+msgid "E840: Completion function deleted text"
+msgstr "E840: ะคัƒะฝะบั†ะธั˜ะฐ ะดะพะฒั€ัˆะฐะฒะฐัšะฐ ั˜ะต ะพะฑั€ะธัะฐะปะฐ ั‚ะตะบัั‚"
+
+msgid "'dictionary' option is empty"
+msgstr "ะžะฟั†ะธั˜ะฐ 'dictionary' ั˜ะต ะฟั€ะฐะทะฝะฐ"
+
+msgid "'thesaurus' option is empty"
+msgstr "ะžะฟั†ะธั˜ะฐ 'thesaurus' ั˜ะต ะฟั€ะฐะทะฝะฐ"
+
+#, c-format
+msgid "Scanning dictionary: %s"
+msgstr "ะกะบะตะฝะธั€ะฐัšะต ั€ะตั‡ะฝะธะบะฐ: %s"
+
+msgid " (insert) Scroll (^E/^Y)"
+msgstr " (ัƒะผะตั‚ะฐัšะต) ะกะบั€ะพะปะพะฒะฐัšะต (^E/^Y)"
+
+msgid " (replace) Scroll (^E/^Y)"
+msgstr " (ะทะฐะผะตะฝะฐ) ะกะบั€ะพะปะพะฒะฐัšะต (^E/^Y)"
+
+#, c-format
+msgid "Scanning: %s"
+msgstr "ะกะบะตะฝะธั€ะฐัšะต: %s"
+
+msgid "Scanning tags."
+msgstr "ะกะบะตะฝะธั€ะฐัšะต ะพะทะฝะฐะบะฐ."
+
+msgid "match in file"
+msgstr "ะฟะพะดัƒะดะฐั€ะฐัšะต ัƒ ะดะฐั‚ะพั‚ะตั†ะธ"
+
+msgid " Adding"
+msgstr " ะ”ะพะดะฐะฒะฐัšะต"
+
+msgid "-- Searching..."
+msgstr "-- ะŸั€ะตั‚ั€ะฐะณะฐ..."
+
+msgid "Back at original"
+msgstr "ะะฐะทะฐะด ะฝะฐ ะพั€ะธะณะธะฝะฐะป"
+
+msgid "Word from other line"
+msgstr "ะ ะตั‡ ะธะท ะดั€ัƒะณะต ะปะธะฝะธั˜ะต"
+
+msgid "The only match"
+msgstr "ะˆะตะดะธะฝะพ ะฟะพะดัƒะดะฐั€ะฐัšะต"
+
+#, c-format
+msgid "match %d of %d"
+msgstr "ะฟะพะดัƒะดะฐั€ะฐัšะต %d ะพะด %d"
+
+#, c-format
+msgid "match %d"
+msgstr "ะฟะพะดัƒะดะฐั€ะฐัšะต %d"
+
+msgid "E18: Unexpected characters in :let"
+msgstr "E18: ะะตะพั‡ะตะบะธะฒะฐะฝะธ ะบะฐั€ะฐะบั‚ะตั€ะธ ัƒ :let"
+
+#, c-format
+msgid "E121: Undefined variable: %s"
+msgstr "E121: ะะตะดะตั„ะธะฝะธัะฐะฝะฐ ะฟั€ะพะผะตะฝั™ะธะฒะฐ: %s"
+
+msgid "E111: Missing ']'"
+msgstr "E111: ะะตะดะพัั‚ะฐั˜ะต ']'"
+
+msgid "E719: Cannot use [:] with a Dictionary"
+msgstr "E719: ะะต ะผะพะถะต ะดะฐ ัะต ะบะพั€ะธัั‚ะธ [:] ัะฐ ะ ะตั‡ะฝะธะบะพะผ"
+
+#, c-format
+msgid "E734: Wrong variable type for %s="
+msgstr "E734: ะŸะพะณั€ะตัˆะฐะฝ ั‚ะธะฟ ะฟั€ะพะผะตะฝั™ะธะฒะต ะทะฐ %s="
+
+#, c-format
+msgid "E461: Illegal variable name: %s"
+msgstr "E461: ะะตะดะพะทะฒะพั™ะตะฝะพ ะธะผะต ะฟั€ะพะผะตะฝั™ะธะฒะต: %s"
+
+msgid "E806: using Float as a String"
+msgstr "E806: ะบะพั€ะธัˆั›ะตัšะต Float ะบะฐะพ String"
+
+msgid "E687: Less targets than List items"
+msgstr "E687: ะœะฐัšะต ะพะดั€ะตะดะธัˆั‚ะฐ ะฝะตะณะพ ัั‚ะฐะฒะบะธ ะ›ะธัั‚ะต"
+
+msgid "E688: More targets than List items"
+msgstr "E688: ะ’ะธัˆะต ะพะดั€ะตะดะธัˆั‚ะฐ ะฝะตะณะพ ัั‚ะฐะฒะบะธ ะ›ะธัั‚ะต"
+
+msgid "Double ; in list of variables"
+msgstr "ะ”ัƒะฟะปะต ; ัƒ ะปะธัั‚ะธ ะฟั€ะพะผะตะฝั™ะธะฒะธั…"
+
+#, c-format
+msgid "E738: Can't list variables for %s"
+msgstr "E738: ะะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะธะบะฐะถะต ะปะธัั‚ะฐ ะฟั€ะพะผะตะฝั™ะธะฒะธั… ะทะฐ %s"
+
+msgid "E689: Can only index a List or Dictionary"
+msgstr "E689: ะกะฐะผะพ ะ›ะธัั‚ะฐ ะธะปะธ ะ ะตั‡ะฝะธะบ ะผะพะณัƒ ะดะฐ ัะต ะธะฝะดะตะบัะธั€ะฐั˜ัƒ"
+
+msgid "E708: [:] must come last"
+msgstr "E708: [:] ะผะพั€ะฐ ะดะฐ ะฑัƒะดะต ะฟะพัะปะตะดัšะฐ"
+
+msgid "E709: [:] requires a List value"
+msgstr "E709: [:] ะทะฐั…ั‚ะตะฒะฐ ะฒั€ะตะดะฝะพัั‚ ั‚ะธะฟะฐ List"
+
+msgid "E710: List value has more items than target"
+msgstr "E710: ะ’ั€ะตะดะฝะพัั‚ ั‚ะธะฟะฐ List ะธะผะฐ ะฒะธัˆะต ัั‚ะฐะฒะบะธ ะฝะตะณะพ ะพะดั€ะตะดะธัˆั‚ะต"
+
+msgid "E711: List value has not enough items"
+msgstr "E711: ะ’ั€ะตะดะฝะพัั‚ ั‚ะธะฟะฐ List ะฝะตะผะฐ ะดะพะฒะพั™ะฝะพ ัั‚ะฐะฒะบะธ"
+
+msgid "E690: Missing \"in\" after :for"
+msgstr "E690: ะะตะดะพัั‚ะฐั˜ะต \"in\" ะฝะฐะบะพะฝ :for"
+
+#, c-format
+msgid "E108: No such variable: \"%s\""
+msgstr "E108: ะะต ะฟะพัั‚ะพั˜ะธ ั‚ะฐะบะฒะฐ ะฟั€ะพะผะตะฝั™ะธะฒะฐ: \"%s\""
+
+#, c-format
+msgid "E940: Cannot lock or unlock variable %s"
+msgstr "E940: ะะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะบั™ัƒั‡ะฐ ะธะปะธ ะทะฐะบั™ัƒั‡ะฐ ะฟั€ะพะผะตะฝั™ะธะฒะฐ %s"
+
+msgid "E743: variable nested too deep for (un)lock"
+msgstr "E743: ะฟั€ะพะผะตะฝั™ะธะฒะฐ ั˜ะต ัƒะณัšะตะถะดะตะฝะฐ ััƒะฒะธัˆะต ะดัƒะฑะพะบะพ ะดะฐ ะฑะธ ัะต ะทะฐ(ะพั‚)ะบั™ัƒั‡ะฐะปะฐ"
+
+msgid "E109: Missing ':' after '?'"
+msgstr "E109: ะะตะดะพัั‚ะฐั˜ะต ':' ะฝะฐะบะพะฝ '?'"
+
+msgid "E804: Cannot use '%' with Float"
+msgstr "E804: '%' ะฝะต ะผะพะถะต ะดะฐ ัะต ะบะพั€ะธัั‚ะธ ัะฐ Float"
+
+msgid "E110: Missing ')'"
+msgstr "E110: ะะตะดะพัั‚ะฐั˜ะต ')'"
+
+msgid "E695: Cannot index a Funcref"
+msgstr "E695: Funcref ะฝะต ะผะพะถะต ะดะฐ ัะต ะธะฝะดะตะบัะธั€ะฐ"
+
+msgid "E909: Cannot index a special variable"
+msgstr "E909: ะกะฟะตั†ะธั˜ะฐะปะฝะฐ ะฟั€ะพะผะตะฝั™ะธะฒะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ะธะฝะดะตะบัะธั€ะฐ"
+
+#, c-format
+msgid "E112: Option name missing: %s"
+msgstr "E112: ะะตะดะพัั‚ะฐั˜ะต ะธะผะต ะพะฟั†ะธั˜ะต: %s"
+
+#, c-format
+msgid "E113: Unknown option: %s"
+msgstr "E113: ะะตะฟะพะทะฝะฐั‚ะฐ ะพะฟั†ะธั˜ะฐ: %s"
+
+#, c-format
+msgid "E114: Missing quote: %s"
+msgstr "E114: ะะตะดะพัั‚ะฐั˜ะต ะฝะฐะฒะพะดะฝะธะบ: %s"
+
+#, c-format
+msgid "E115: Missing quote: %s"
+msgstr "E115: ะะตะดะพัั‚ะฐั˜ะต ะฝะฐะฒะพะดะฝะธะบ: %s"
+
+msgid "Not enough memory to set references, garbage collection aborted!"
+msgstr ""
+"ะะตะผะฐ ะดะพะฒะพั™ะฝะพ ะผะตะผะพั€ะธั˜ะต ะทะฐ ะฟะพัั‚ะฐะฒั™ะฐัšะต ั€ะตั„ะตั€ะตะฝั†ะธ, ะฟั€ะตะบะธะฝัƒั‚ะพ ั˜ะต ัะบัƒะฟั™ะฐัšะต ะพั‚ะฟะฐะดะฐ"
+
+msgid "E724: variable nested too deep for displaying"
+msgstr "E724: ะฟั€ะพะผะตะฝั™ะธะฒะฐ ั˜ะต ัƒะณัšะตะถะดะตะฝะฐ ะฟั€ะตะดัƒะฑะพะบะพ ะดะฐ ะฑะธ ัะต ะฟั€ะธะบะฐะทะฐะปะฐ"
+
+msgid "E805: Using a Float as a Number"
+msgstr "E805: ะšะพั€ะธัั‚ะธ ัะต Float ะบะฐะพ Number"
+
+msgid "E703: Using a Funcref as a Number"
+msgstr "E703: ะšะพั€ะธัั‚ะธ ัะต Funcref ะบะฐะพ Number"
+
+msgid "E745: Using a List as a Number"
+msgstr "E745: ะšะพั€ะธัั‚ะธ ัะต List ะบะฐะพ Number"
+
+msgid "E728: Using a Dictionary as a Number"
+msgstr "E728: ะšะพั€ะธัั‚ะธ ัะต Dictionary ะบะฐะพ Number"
+
+msgid "E910: Using a Job as a Number"
+msgstr "E910: ะšะพั€ะธัั‚ะธ ัะต Job ะบะฐะพ Number"
+
+msgid "E913: Using a Channel as a Number"
+msgstr "E913: ะšะพั€ะธัั‚ะธ ัะต Channel ะบะฐะพ Number"
+
+msgid "E891: Using a Funcref as a Float"
+msgstr "E891: ะšะพั€ะธัั‚ะธ ัะต Funcref ะบะฐะพ Float"
+
+msgid "E892: Using a String as a Float"
+msgstr "E892: ะšะพั€ะธัั‚ะธ ัะต String ะบะฐะพ Float"
+
+msgid "E893: Using a List as a Float"
+msgstr "E893: ะšะพั€ะธัั‚ะธ ัะต List ะบะฐะพ Float"
+
+msgid "E894: Using a Dictionary as a Float"
+msgstr "E894: ะšะพั€ะธัั‚ะธ ัะต Dictionary ะบะฐะพ Float"
+
+msgid "E907: Using a special value as a Float"
+msgstr "E907: ะšะพั€ะธัั‚ะธ ัะต ัะฟะตั†ะธั˜ะฐะปะฝะฐ ะฒั€ะตะดะฝะพัั‚ ะบะฐะพ Float"
+
+msgid "E911: Using a Job as a Float"
+msgstr "E911: ะšะพั€ะธัั‚ะธ ัะต Job ะบะฐะพ Float"
+
+msgid "E914: Using a Channel as a Float"
+msgstr "E914: ะšะพั€ะธัั‚ะธ ัะต Channel ะบะฐะพ Float"
+
+msgid "E729: using Funcref as a String"
+msgstr "E729: ะบะพั€ะธัั‚ะธ ัะต Funcref ะบะฐะพ String"
+
+msgid "E730: using List as a String"
+msgstr "E730: ะบะพั€ะธัั‚ะธ ัะต List ะบะฐะพ String"
+
+msgid "E731: using Dictionary as a String"
+msgstr "E731: ะบะพั€ะธัั‚ะธ ัะต Dictionary ะบะฐะพ String"
+
+msgid "E908: using an invalid value as a String"
+msgstr "E908: ะบะพั€ะธัั‚ะธ ัะต ะฝะตะดะพะทะฒะพั™ะตะฝะฐ ะฒั€ะตะดะฝะพัั‚ ะบะฐะพ String"
+
+#, c-format
+msgid "E795: Cannot delete variable %s"
+msgstr "E795: ะŸั€ะพะผะตะฝั™ะธะฒะฐ %s ะฝะต ะผะพะถะต ะดะฐ ัะต ะพะฑั€ะธัˆะต"
+
+#, c-format
+msgid "E704: Funcref variable name must start with a capital: %s"
+msgstr "E704: ะ˜ะผะต Funcref ะผะพั€ะฐ ะดะฐ ะฟะพั‡ะฝะต ะฒะตะปะธะบะธะผ ัะปะพะฒะพะผ: %s"
+
+#, c-format
+msgid "E705: Variable name conflicts with existing function: %s"
+msgstr "E705: ะ˜ะผะต ะฟั€ะพะผะตะฝั™ะธะฒะต ั˜ะต ัƒ ะบะพะฝั„ะปะธะบั‚ัƒ ัะฐ ะฟะพัั‚ะพั˜ะตั›ะพะผ ั„ัƒะฝะบั†ะธั˜ะพะผ: %s"
+
+#, c-format
+msgid "E741: Value is locked: %s"
+msgstr "E741: ะ’ั€ะตะดะฝะพัั‚ ั˜ะต ะทะฐะบั™ัƒั‡ะฐะฝะฐ: %s"
+
+msgid "Unknown"
+msgstr "ะะตะฟะพะทะฝะฐั‚ะพ"
+
+#, c-format
+msgid "E742: Cannot change value of %s"
+msgstr "E742: ะ’ั€ะตะดะฝะพัั‚ %s ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะผะตะฝะธ"
+
+msgid "E698: variable nested too deep for making a copy"
+msgstr "E698: ะฟั€ะพะผะตะฝั™ะธะฒะฐ ั˜ะต ะฟั€ะตะดัƒะฑะพะบะพ ัƒะณัšะตะถะดะตะฝะฐ ะดะฐ ะฑะธ ัะต ะฝะฐะฟั€ะฐะฒะธะปะฐ ะบะพะฟะธั˜ะฐ"
+
+msgid ""
+"\n"
+"# global variables:\n"
+msgstr ""
+"\n"
+"# ะณะปะพะฑะฐะปะฝะต ะฟั€ะพะผะตะฝั™ะธะฒะต:\n"
+
+msgid ""
+"\n"
+"\tLast set from "
+msgstr ""
+"\n"
+"\tะŸะพัะปะตะดัšะธ ัะตั‚ ะพะด "
+
+msgid "E691: Can only compare List with List"
+msgstr "E691: List ะผะพะถะต ะดะฐ ัะต ะฟะพั€ะตะดะธ ัะฐะผะพ ัะฐ List"
+
+msgid "E692: Invalid operation for List"
+msgstr "E692: ะะตะธัะฟั€ะฐะฒะฝะฐ ะพะฟะตั€ะฐั†ะธั˜ะฐ ะทะฐ List"
+
+msgid "E735: Can only compare Dictionary with Dictionary"
+msgstr "E735: Dictionary ะผะพะถะต ะดะฐ ัะต ะฟะพั€ะตะดะธ ัะฐะผะพ ัะฐ Dictionary"
+
+msgid "E736: Invalid operation for Dictionary"
+msgstr "E736: ะะตะธัะฟั€ะฐะฒะฝะฐ ะพะฟะตั€ะฐั†ะธั˜ะฐ ะทะฐ Dictionary"
+
+msgid "E694: Invalid operation for Funcrefs"
+msgstr "E694: ะะตะธัะฟั€ะฐะฒะฝะฐ ะพะฟะตั€ะฐั†ะธั˜ะฐ ะทะฐ Funcrefs"
+
+msgid "map() argument"
+msgstr "map() ะฐั€ะณัƒะผะตะฝั‚"
+
+msgid "filter() argument"
+msgstr "filter() ะฐั€ะณัƒะผะตะฝั‚"
+
+#, c-format
+msgid "E686: Argument of %s must be a List"
+msgstr "E686: ะั€ะณัƒะผะตะฝั‚ ะทะฐ %s ะผะพั€ะฐ ะฑะธั‚ะธ List"
+
+msgid "E928: String required"
+msgstr "E928: ะ—ะฐั…ั‚ะตะฒะฐ ัะต String"
+
+msgid "E808: Number or Float required"
+msgstr "E808: ะ—ะฐั…ั‚ะตะฒะฐ ัะต Number ะธะปะธ Float"
+
+msgid "add() argument"
+msgstr "add() ะฐั€ะณัƒะผะตะฝั‚"
+
+msgid "E785: complete() can only be used in Insert mode"
+msgstr "E785: complete() ะผะพะถะต ะดะฐ ัะต ะบะพั€ะธัั‚ะธ ัะฐะผะพ ัƒ ั€ะตะถะธะผัƒ ะฃะผะตั‚ะฐัšะต"
+
+msgid "&Ok"
+msgstr "&ะžะบ"
+
+#, c-format
+msgid "+-%s%3ld line: "
+msgid_plural "+-%s%3ld lines: "
+msgstr[0] "+-%s%3ld ะปะธะฝะธั˜ะฐ: "
+msgstr[1] "+-%s%3ld ะปะธะฝะธั˜ะฐ: "
+
+#, c-format
+msgid "E700: Unknown function: %s"
+msgstr "E700: ะะตะฟะพะทะฝะฐั‚ะฐ ั„ัƒะฝะบั†ะธั˜ะฐ: %s"
+
+msgid "E922: expected a dict"
+msgstr "E922: ะพั‡ะตะบะธะฒะฐะพ ัะต dict"
+
+msgid "E923: Second argument of function() must be a list or a dict"
+msgstr "E923: ะ”ั€ัƒะณะธ ะฐั€ะณัƒะผะตะฝั‚ function() ะผะพั€ะฐ ะฑะธั‚ะธ list ะธะปะธ dict"
+
+msgid ""
+"&OK\n"
+"&Cancel"
+msgstr ""
+"&OK\n"
+"ะž&ั‚ะบะฐะถะธ"
+
+msgid "called inputrestore() more often than inputsave()"
+msgstr "inputrestore() ั˜ะต ะฟะพะทะฒะฐะฝะฐ ะฒะธัˆะต ะฟัƒั‚ะฐ ะฝะตะณะพ inputsave()"
+
+msgid "insert() argument"
+msgstr "insert() ะฐั€ะณัƒะผะตะฝั‚"
+
+msgid "E786: Range not allowed"
+msgstr "E786: ะžะฟัะตะณ ะฝะธั˜ะต ะดะพะทะฒะพั™ะตะฝ"
+
+msgid "E916: not a valid job"
+msgstr "E916: ะฝะธั˜ะต ะฒะฐะปะธะดะฐะฝ job"
+
+msgid "E701: Invalid type for len()"
+msgstr "E701: ะะตะธัะฟั€ะฐะฒะฐะฝ ั‚ะธะฟ ะทะฐ len()"
+
+#, c-format
+msgid "E798: ID is reserved for \":match\": %ld"
+msgstr "E798: ะ˜ะ” ั˜ะต ั€ะตะทะตั€ะฒะธัะฐะฝ ะทะฐ \":match\": %ld"
+
+msgid "E726: Stride is zero"
+msgstr "E726: ะšะพั€ะฐะบ ั˜ะต ะฝัƒะปะฐ"
+
+msgid "E727: Start past end"
+msgstr "E727: ะŸะพั‡ะตั‚ะฐะบ ะธะทะฐ ะบั€ะฐั˜ะฐ"
+
+msgid "<empty>"
+msgstr "<ะฟั€ะฐะทะฝะพ>"
+
+msgid "E240: No connection to the X server"
+msgstr "E240: ะะตะผะฐ ะฒะตะทะต ัะฐ X ัะตั€ะฒะตั€ะพะผ"
+
+#, c-format
+msgid "E241: Unable to send to %s"
+msgstr "E241: ะกะปะฐัšะต ะบะฐ %s ะฝะธั˜ะต ะผะพะณัƒั›ะต"
+
+msgid "E277: Unable to read a server reply"
+msgstr "E277: ะะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพั‡ะธั‚ะฐ ะพะดะณะพะฒะพั€ ัะตั€ะฒะตั€ะฐ"
+
+msgid "E941: already started a server"
+msgstr "E941: ัะตั€ะฒะตั€ ั˜ะต ะฒะตั› ะฟะพะบั€ะตะฝัƒั‚"
+
+msgid "E942: +clientserver feature not available"
+msgstr "E942: ะœะพะณัƒั›ะฝะพัั‚ +clientserver ะฝะธั˜ะต ะดะพัั‚ัƒะฟะฝะฐ"
+
+msgid "remove() argument"
+msgstr "remove() ะฐั€ะณัƒะผะตะฝั‚"
+
+msgid "E655: Too many symbolic links (cycle?)"
+msgstr "E655: ะŸั€ะตะฒะธัˆะต ัะธะผะฑะพะปะธั‡ะบะธั… ะฒะตะทะฐ (ั†ะธะบะปัƒั?)"
+
+msgid "reverse() argument"
+msgstr "reverse() ะฐั€ะณัƒะผะตะฝั‚"
+
+msgid "E258: Unable to send to client"
+msgstr "E258: ะกะปะฐัšะต ะบะฐ ะบะปะธั˜ะตะฝั‚ัƒ ะฝะธั˜ะต ะผะพะณัƒั›ะต"
+
+#, c-format
+msgid "E927: Invalid action: '%s'"
+msgstr "E927: ะะตะธัะฟั€ะฐะฒะฝะฐ ะฐะบั†ะธั˜ะฐ: '%s'"
+
+msgid "sort() argument"
+msgstr "sort() ะฐั€ะณัƒะผะตะฝั‚"
+
+msgid "uniq() argument"
+msgstr "uniq() ะฐั€ะณัƒะผะตะฝั‚"
+
+msgid "E702: Sort compare function failed"
+msgstr "E702: Sort ั„ัƒะฝะบั†ะธั˜ะฐ ะฟะพั€ะตั’ะตัšะฐ ะฝะธั˜ะต ัƒัะฟะตะปะฐ"
+
+msgid "E882: Uniq compare function failed"
+msgstr "E882: Uniq ั„ัƒะฝะบั†ะธั˜ะฐ ะฟะพั€ะตั’ะตัšะฐ ะฝะธั˜ะต ัƒัะฟะตะปะฐ"
+
+msgid "(Invalid)"
+msgstr "(ะะตะธัะฟั€ะฐะฒะฝะพ)"
+
+#, c-format
+msgid "E935: invalid submatch number: %d"
+msgstr "E935: ะฝะตะธัะฟั€ะฐะฒะฐะฝ ะฑั€ะพั˜ ะฟะพะดะฟะพะบะปะฐะฟะฐัšะฐ: %d"
+
+msgid "E677: Error writing temp file"
+msgstr "E677: ะ“ั€ะตัˆะบะฐ ะฟั€ะธ ัƒะฟะธััƒ temp ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "E921: Invalid callback argument"
+msgstr "E921: ะะตะธัะฟั€ะฐะฒะฐะฝ callback ะฐั€ะณัƒะผะตะฝั‚"
+
+#, c-format
+msgid "<%s>%s%s %d, Hex %02x, Oct %03o, Digr %s"
+msgstr "<%s>%s%s %d, ะฅะตะบั %02x, ะžะบั‚ %03o, ะ”ะธะณั€ %s"
+
+#, c-format
+msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
+msgstr "<%s>%s%s %d, ะฅะตะบั %02x, ะžะบั‚ะฐะปะฝะพ %03o"
+
+#, c-format
+msgid "> %d, Hex %04x, Oct %o, Digr %s"
+msgstr "> %d, ะฅะตะบั %04x, ะžะบั‚ %o, ะ”ะธะณั€ %s"
+
+#, c-format
+msgid "> %d, Hex %08x, Oct %o, Digr %s"
+msgstr "> %d, ะฅะตะบั %08x, ะžะบั‚ %o, ะ”ะธะณั€ %s"
+
+#, c-format
+msgid "> %d, Hex %04x, Octal %o"
+msgstr "> %d, ะฅะตะบั %04x, ะžะบั‚ะฐะปะฝะพ %o"
+
+#, c-format
+msgid "> %d, Hex %08x, Octal %o"
+msgstr "> %d, ะฅะตะบั %08x, ะžะบั‚ะฐะปะฝะพ %o"
+
+msgid "E134: Move lines into themselves"
+msgstr "E134: ะŸั€ะตะผะตัˆั‚ะฐัšะต ะปะธะฝะธั˜ะฐ ัƒ ัะฐะผะต ัะตะฑะต"
+
+msgid "1 line moved"
+msgstr "1 ะปะธะฝะธั˜ะฐ ะฟั€ะตะผะตัˆั‚ะตะฝะฐ"
+
+#, c-format
+msgid "%ld lines moved"
+msgstr "%ld ะปะธะฝะธั˜ะฐ ะฟั€ะตะผะตัˆั‚ะตะฝะพ"
+
+#, c-format
+msgid "%ld lines filtered"
+msgstr "%ld ะปะธะฝะธั˜ะฐ ั„ะธะปั‚ั€ะธั€ะฐะฝะพ"
+
+msgid "E135: *Filter* Autocommands must not change current buffer"
+msgstr "E135: *ะคะธะปั‚ะตั€* ะัƒั‚ะพะบะพะผะฐะฝะดะต ะฝะต ัะผะตั˜ัƒ ะดะฐ ะผะตัšะฐั˜ัƒ ั‚ะตะบัƒั›ะธ ะฑะฐั„ะตั€"
+
+msgid "[No write since last change]\n"
+msgstr "[ะะตะผะฐ ัƒะฟะธัะฐ ะพะด ะฟะพัะปะตะดัšะต ะฟั€ะพะผะตะฝะต]\n"
+
+#, c-format
+msgid "%sviminfo: %s in line: "
+msgstr "%sviminfo: %s ัƒ ะปะธะฝะธั˜ะธ: "
+
+msgid "E136: viminfo: Too many errors, skipping rest of file"
+msgstr "E136: viminfo: ะŸั€ะตะฒะธัˆะต ะณั€ะตัˆะฐะบะฐ, ะพัั‚ะฐั‚ะฐะบ ะดะฐั‚ะพั‚ะตะบะต ัะต ะฟั€ะตัะบะฐั‡ะต"
+
+#, c-format
+msgid "Reading viminfo file \"%s\"%s%s%s"
+msgstr "ะงะธั‚ะฐัšะต viminfo ะดะฐั‚ะพั‚ะตะบะต \"%s\"%s%s%s"
+
+msgid " info"
+msgstr " ะธะฝั„ะพ"
+
+msgid " marks"
+msgstr " ะผะฐั€ะบะตั€ะฐ"
+
+msgid " oldfiles"
+msgstr " ัั‚ะฐั€ะธั…ะดะฐั‚ะพั‚ะตะบะฐ"
+
+msgid " FAILED"
+msgstr " ะะ•ะฃะกะŸะ•ะ›ะž"
+
+#, c-format
+msgid "E137: Viminfo file is not writable: %s"
+msgstr "E137: Viminfo ะดะฐั‚ะพั‚ะตะบะฐ ะฝะธั˜ะต ัƒะฟะธัะธะฒะฐ: %s"
+
+#, c-format
+msgid "E929: Too many viminfo temp files, like %s!"
+msgstr "E929: ะŸั€ะตะฒะธัˆะต viminfo temp ะดะฐั‚ะพั‚ะตะบะฐ, ะบะฐะพ %s!"
+
+#, c-format
+msgid "E138: Can't write viminfo file %s!"
+msgstr "E138: Viminfo ะดะฐั‚ะพั‚ะตะบะฐ %s ะฝะต ะผะพะถะต ะดะฐ ัะต ัƒะฟะธัˆะต!"
+
+#, c-format
+msgid "Writing viminfo file \"%s\""
+msgstr "ะฃะฟะธัะธะฒะฐัšะต viminfo ะดะฐั‚ะพั‚ะตะบะต \"%s\""
+
+#, c-format
+msgid "E886: Can't rename viminfo file to %s!"
+msgstr "E886: Viminfo ะดะฐั‚ะพั‚ะตะบะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะตะธะผะตะฝัƒั˜ะต ัƒ %s!"
+
+#, c-format
+msgid "# This viminfo file was generated by Vim %s.\n"
+msgstr "# ะžะฒัƒ viminfo ะดะฐั‚ะพั‚ะตะบัƒ ั˜ะต ะณะตะฝะตั€ะธัะฐะพ Vim %s.\n"
+
+msgid ""
+"# You may edit it if you're careful!\n"
+"\n"
+msgstr ""
+"# ะœะพะถะตั‚ะต ะดะฐ ั˜ะต ัƒั€ะตั’ัƒั˜ะตั‚ะต ะฐะบะพ ัั‚ะต ะพะฟั€ะตะทะฝะธ!\n"
+"\n"
+
+msgid "# Value of 'encoding' when this file was written\n"
+msgstr "# ะ’ั€ะตะดะฝะพัั‚ ะพะฟั†ะธั˜ะต 'encoding' ะบะฐะดะฐ ั˜ะต ะพะฒะฐ ะดะฐั‚ะพั‚ะตะบะฐ ะฝะฐะฟะธัะฐะฝะฐ\n"
+
+msgid "Illegal starting char"
+msgstr "ะะตะธัะฟั€ะฐะฒะฐะฝ ะฟะพั‡ะตั‚ะฝะธ ะบะฐั€ะฐะบั‚ะตั€"
+
+msgid ""
+"\n"
+"# Bar lines, copied verbatim:\n"
+msgstr ""
+"\n"
+"# ะŸั€ะตะณั€ะฐะดะฝะต ะปะธะฝะธั˜ะต, ะบะพะฟะธั€ะฐะฝะต ะดะพัะปะพะฒะฝะพ:\n"
+
+msgid "Save As"
+msgstr "ะกะฐั‡ัƒะฒะฐั˜ ะบะฐะพ"
+
+msgid "Write partial file?"
+msgstr "ะ”ะฐ ัƒะฟะธัˆะตะผ ะฟะฐั€ั†ะธั˜ะฐะปะฝัƒ ะดะฐั‚ะพั‚ะตะบัƒ?"
+
+msgid "E140: Use ! to write partial buffer"
+msgstr "E140: ะšะพั€ะธัั‚ะธั‚ะต ! ะดะฐ ะฑะธัั‚ะต ัƒะฟะธัะฐะปะธ ะฟะฐั€ั†ะธั˜ะฐะปะฝะธ ะฑะฐั„ะตั€"
+
+#, c-format
+msgid "Overwrite existing file \"%s\"?"
+msgstr "ะ”ะฐ ะฟั€ะตะฟะธัˆะตะผ ะฟะพัั‚ะพั˜ะตั›ะธ ะดะฐั‚ะพั‚ะตะบัƒ \"%s\"?"
+
+#, c-format
+msgid "Swap file \"%s\" exists, overwrite anyway?"
+msgstr "Swap ะดะฐั‚ะพั‚ะตะบะฐ \"%s\" ะฟะพัั‚ะพั˜ะธ, ะดะฐ ั˜ะต ะฟั€ะตะฟะธัˆะตะผ ัƒ ัะฒะฐะบะพะผ ัะปัƒั‡ะฐั˜ัƒ?"
+
+#, c-format
+msgid "E768: Swap file exists: %s (:silent! overrides)"
+msgstr "E768: Swap ะดะฐั‚ะพั‚ะตะบะฐ ะฟะพัั‚ะพั˜ะธ: %s (:silent! ะฟั€ะตะผะพัˆั›ะฐะฒะฐ)"
+
+#, c-format
+msgid "E141: No file name for buffer %ld"
+msgstr "E141: ะะตะผะฐ ะธะผะตะฝะฐ ะดะฐั‚ะพั‚ะตะบะต ะทะฐ ะฑะฐั„ะตั€ %ld"
+
+msgid "E142: File not written: Writing is disabled by 'write' option"
+msgstr "E142: ะ”ะฐั‚ะพั‚ะตะบะฐ ะฝะธั˜ะต ัƒะฟะธัะฐะฝะฐ: ะฃะฟะธัะธะฒะฐัšะต ั˜ะต ะพะฝะตะผะพะณัƒั›ะตะฝะพ ะพะฟั†ะธั˜ะพะผ 'write'"
+
+#, c-format
+msgid ""
+"'readonly' option is set for \"%s\".\n"
+"Do you wish to write anyway?"
+msgstr ""
+"'readonly' ะพะฟั†ะธั˜ะฐ ั˜ะต ะฟะพัั‚ะฐะฒั™ะตะฝะฐ ะทะฐ \"%s\".\n"
+"ะ”ะฐ ะปะธ ะธะฟะฐะบ ะถะตะปะธั‚ะต ะดะฐ ัƒะฟะธัˆะตั‚ะต?"
+
+#, c-format
+msgid ""
+"File permissions of \"%s\" are read-only.\n"
+"It may still be possible to write it.\n"
+"Do you wish to try?"
+msgstr ""
+"ะ”ะพะทะฒะพะปะต ะดะฐั‚ะพั‚ะตะบะต \"%s\" ะพะผะพะณัƒั›ะฐะฒะฐั˜ัƒ ัะฐะผะพ ั‡ะธั‚ะฐัšะต.\n"
+"ะœะพะถะดะฐ ั˜ะต ะธะฟะฐะบ ะผะพะณัƒั›ะต ะดะฐ ัะต ัƒะฟะธัˆะต.\n"
+"ะ”ะฐ ะปะธ ะถะตะปะธั‚ะต ะดะฐ ะฟะพะบัƒัˆะฐั‚ะต?"
+
+#, c-format
+msgid "E505: \"%s\" is read-only (add ! to override)"
+msgstr "E505: \"%s\" ั˜ะต ัะฐะผะพ ะทะฐ ั‡ะธั‚ะฐัšะต (ะดะพะดะฐั˜ั‚ะต ! ะทะฐ ะฟั€ะตะผะพัˆั›ะฐะฒะฐัšะต)"
+
+msgid "Edit File"
+msgstr "ะฃั€ะตะดะธ ะดะฐั‚ะพั‚ะตะบัƒ"
+
+#, c-format
+msgid "E143: Autocommands unexpectedly deleted new buffer %s"
+msgstr "E143: ะัƒั‚ะพะบะพะผะฐะฝะดะต ััƒ ะฝะตะพั‡ะตะบะธะฒะฐะฝะพ ะพะฑั€ะธัะฐะปะต ะฝะพะฒ ะฑะฐั„ะตั€ %s"
+
+msgid "E144: non-numeric argument to :z"
+msgstr "E144: ะฝะตะฝัƒะผะตั€ะธั‡ะบะธ ะฐั€ะณัƒะผะตะฝั‚ ะทะฐ :z"
+
+msgid "E145: Shell commands not allowed in rvim"
+msgstr "E145: Shell ะบะพะผะฐะฝะดะต ะฝะธััƒ ะดะพะทะฒะพั™ะตะฝะต ัƒ rvim"
+
+msgid "E146: Regular expressions can't be delimited by letters"
+msgstr "E146: ะ ะตะณัƒะปะฐั€ะฝะธ ะธะทั€ะฐะทะธ ะฝะต ะผะพะณัƒ ะดะฐ ัะต ั€ะฐะทะดะฒะฐั˜ะฐั˜ัƒ ัะปะพะฒะธะผะฐ"
+
+#, c-format
+msgid "replace with %s (y/n/a/q/l/^E/^Y)?"
+msgstr "ะทะฐะผะตะฝะธั‚ะธ ัะฐ %s (y/n/a/q/l/^E/^Y)?"
+
+msgid "(Interrupted) "
+msgstr "(ะŸั€ะตะบะธะฝัƒั‚ะพ)"
+
+msgid "1 match"
+msgstr "1 ะฟะพะดัƒะดะฐั€ะฐัšะต"
+
+msgid "1 substitution"
+msgstr "1 ะทะฐะผะตะฝะฐ"
+
+#, c-format
+msgid "%ld matches"
+msgstr "%ld ะฟะพะดัƒะดะฐั€ะฐัšะฐ"
+
+#, c-format
+msgid "%ld substitutions"
+msgstr "%ld ะทะฐะผะตะฝะฐ"
+
+msgid " on 1 line"
+msgstr " ัƒ 1 ะปะธะฝะธั˜ะธ"
+
+#, c-format
+msgid " on %ld lines"
+msgstr " ัƒ %ld ะปะธะฝะธั˜ะฐ"
+
+msgid "E147: Cannot do :global recursive with a range"
+msgstr "E147: :global ะฝะต ะผะพะถะต ะดะฐ ัะต ะธะทะฒั€ัˆะธ ั€ะตะบัƒั€ะทะธะฒะฝะพ ัะฐ ะพะฟัะตะณะพะผ"
+
+msgid "E148: Regular expression missing from global"
+msgstr "E148: ะฃ global ะฝะตะดะพัั‚ะฐั˜ะต ั€ะตะณัƒะปะฐั€ะฝะธ ะธะทั€ะฐะท"
+
+#, c-format
+msgid "Pattern found in every line: %s"
+msgstr "ะจะฐะฑะปะพะฝ ั˜ะต ะฟั€ะพะฝะฐั›ะตะฝ ัƒ ัะฒะฐะบะพั˜ ะปะธะฝะธั˜ะธ: %s"
+
+#, c-format
+msgid "Pattern not found: %s"
+msgstr "ะจะฐะฑะปะพะฝ ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝ: %s"
+
+msgid ""
+"\n"
+"# Last Substitute String:\n"
+"$"
+msgstr ""
+"\n"
+"# ะŸะพัะปะตะดัšะธ ะกั‚ั€ะธะฝะณ ะทะฐ ะทะฐะผะตะฝัƒ:\n"
+"$"
+
+msgid "E478: Don't panic!"
+msgstr "E478: ะะต ะฟะฐะฝะธั‡ะธั‚ะต!"
+
+#, c-format
+msgid "E661: Sorry, no '%s' help for %s"
+msgstr "E661: ะ–ะฐะพ ะฝะฐะผ ั˜ะต, ะฝะตะผะฐ '%s' ะฟะพะผะพั›ะธ ะทะฐ %s"
+
+#, c-format
+msgid "E149: Sorry, no help for %s"
+msgstr "E149: ะ–ะฐะพ ะฝะฐะผ ั˜ะต, ะฝะตะผะฐ ะฟะพะผะพั›ะธ ะทะฐ %s"
+
+#, c-format
+msgid "Sorry, help file \"%s\" not found"
+msgstr "ะ–ะฐะพ ะฝะฐะผ ั˜ะต, ะดะฐั‚ะพั‚ะตะบะฐ ะฟะพะผะพั›ะธ \"%s\" ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝะฐ"
+
+#, c-format
+msgid "E151: No match: %s"
+msgstr "E151: ะะตะผะฐ ะฟะพะดัƒะดะฐั€ะฐัšะฐ: %s"
+
+#, c-format
+msgid "E152: Cannot open %s for writing"
+msgstr "E152: %s ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ ะทะฐ ัƒะฟะธั"
+
+#, c-format
+msgid "E153: Unable to open %s for reading"
+msgstr "E153: %s ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ ะทะฐ ั‡ะธั‚ะฐัšะต"
+
+#, c-format
+msgid "E670: Mix of help file encodings within a language: %s"
+msgstr "E670: ะŸะพะผะตัˆะฐะฝะพ ั˜ะต ะฒะธัˆะต ะบะพะดะธั€ะฐัšะฐ ั„ะฐั˜ะปะพะฒะฐ ะฟะพะผะพั›ะธ ะทะฐ ั˜ะตะทะธะบ: %s"
+
+#, c-format
+msgid "E154: Duplicate tag \"%s\" in file %s/%s"
+msgstr "E154: ะ”ัƒะฟะปะธั€ะฐะฝะฐ ะพะทะฝะฐะบะฐ \"%s\" ัƒ ะดะฐั‚ะพั‚ะตั†ะธ %s/%s"
+
+#, c-format
+msgid "E150: Not a directory: %s"
+msgstr "E150: ะะธั˜ะต ะดะธั€ะตะบั‚ะพั€ะธั˜ัƒะผ: %s"
+
+#, c-format
+msgid "E160: Unknown sign command: %s"
+msgstr "E160: ะะตะฟะพะทะฝะฐั‚ะฐ ะทะฝะฐะบ ะบะพะผะฐะฝะดะฐ: %s"
+
+msgid "E156: Missing sign name"
+msgstr "E156: ะะตะดะพัั‚ะฐั˜ะต ะธะผะต ะทะฝะฐะบะฐ"
+
+msgid "E612: Too many signs defined"
+msgstr "E612: ะ”ะตั„ะธะฝะธัะฐะฝะพ ั˜ะต ะฟั€ะตะฒะธัˆะต ะทะฝะฐะบะพะฒะฐ"
+
+#, c-format
+msgid "E239: Invalid sign text: %s"
+msgstr "E239: ะะตะธัะฟั€ะฐะฒะฐะฝ ั‚ะตะบัั‚ ะทะฝะฐะบะฐ: %s"
+
+#, c-format
+msgid "E155: Unknown sign: %s"
+msgstr "E155: ะะตะฟะพะทะฝะฐั‚ ะทะฝะฐะบ: %s"
+
+msgid "E159: Missing sign number"
+msgstr "E159: ะะตะดะพัั‚ะฐั˜ะต ะฑั€ะพั˜ ะทะฝะฐะบะฐ"
+
+#, c-format
+msgid "E158: Invalid buffer name: %s"
+msgstr "E158: ะะตะธัะฟั€ะฐะฒะฝะพ ะธะผะต ะฑะฐั„ะตั€ะฐ: %s"
+
+msgid "E934: Cannot jump to a buffer that does not have a name"
+msgstr "E934: ะะต ะผะพะถะต ะดะฐ ัะต ัะบะพั‡ะธ ะฝะฐ ะฑะฐั„ะตั€ ะบะพั˜ะธ ะฝะตะผะฐ ะธะผะต`"
+
+#, c-format
+msgid "E157: Invalid sign ID: %ld"
+msgstr "E157: ะะตะธัะฟั€ะฐะฒะฐะฝ ะ˜ะ” ะทะฝะฐะบะฐ: %ld"
+
+#, c-format
+msgid "E885: Not possible to change sign %s"
+msgstr "E885: ะ—ะฝะฐะบ %s ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะผะตะฝะธ"
+
+msgid " (NOT FOUND)"
+msgstr " (ะะ˜ะˆะ• ะŸะ ะžะะะ‚ะ•ะะž)"
+
+msgid " (not supported)"
+msgstr " (ะฝะธั˜ะต ะฟะพะดั€ะถะฐะฝะพ)"
+
+msgid "[Deleted]"
+msgstr "[ะžะฑั€ะธัะฐะฝะพ]"
+
+msgid "No old files"
+msgstr "ะะตะผะฐ ัั‚ะฐั€ะธั… ะดะฐั‚ะพั‚ะตะบะฐ"
+
+msgid "Entering Debug mode. Type \"cont\" to continue."
+msgstr "ะฃะปะฐะทะฐะบ ัƒ Debug ั€ะตะถะธะผ. ะžั‚ะบัƒั†ะฐั˜ั‚ะต \"cont\" ะทะฐ ะฝะฐัั‚ะฐะฒะฐะบ."
+
+#, c-format
+msgid "Oldval = \"%s\""
+msgstr "ะกั‚ะฐั€ะฐะฒั€ะตะด = \"%s\""
+
+#, c-format
+msgid "Newval = \"%s\""
+msgstr "ะะพะฒะฐะฐะฒั€ะตะด = \"%s\""
+
+#, c-format
+msgid "line %ld: %s"
+msgstr "ะปะธะฝะธั˜ะฐ %ld: %s"
+
+#, c-format
+msgid "cmd: %s"
+msgstr "ะบะพะผ: %s"
+
+msgid "frame is zero"
+msgstr "ะพะบะฒะธั€ ั˜ะต ะฝัƒะปะฐ"
+
+#, c-format
+msgid "frame at highest level: %d"
+msgstr "ะพะบะฒะธั€ ั˜ะต ะฝะฐ ะฝะฐั˜ะฒะธัˆะตะผ ะฝะธะฒะพัƒ: %d"
+
+#, c-format
+msgid "Breakpoint in \"%s%s\" line %ld"
+msgstr "ะŸั€ะตะบะธะดะฝะฐ ั‚ะฐั‡ะบะฐ ัƒ \"%s%s\" ะปะธะฝะธั˜ะฐ %ld"
+
+#, c-format
+msgid "E161: Breakpoint not found: %s"
+msgstr "E161: ะŸั€ะตะบะธะดะฝะฐ ั‚ะฐั‡ะบะฐ ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝะฐ: %s"
+
+msgid "No breakpoints defined"
+msgstr "ะะธั˜ะต ะดะตั„ะธะฝะธัะฐะฝะฐ ะฝะธั˜ะตะดะฝะฐ ะฟั€ะตะบะธะดะฝะฐ ั‚ะฐั‡ะบะฐ"
+
+#, c-format
+msgid "%3d %s %s line %ld"
+msgstr "%3d %s %s ะปะธะฝะธั˜ะฐ %ld"
+
+#, c-format
+msgid "%3d expr %s"
+msgstr "%3d ะธะทั€ะฐะท %s"
+
+msgid "E750: First use \":profile start {fname}\""
+msgstr "E750: ะะฐั˜ะฟั€ะต ะบะพั€ะธัั‚ะธั‚ะต \":profile start {fname}\""
+
+#, c-format
+msgid "Save changes to \"%s\"?"
+msgstr "ะ”ะฐ ัะฐั‡ัƒะฒะฐะผ ะฟั€ะพะผะตะฝะต ัƒ \"%s\"?"
+
+#, c-format
+msgid "E947: Job still running in buffer \"%s\""
+msgstr "E947: ะ—ะฐะดะฐั‚ะฐะบ ัะต ะธ ะดะฐั™ะต ะธะทะฒั€ัˆะฐะฒะฐ ัƒ ะฑะฐั„ะตั€ัƒ \"%s\""
+
+#, c-format
+msgid "E162: No write since last change for buffer \"%s\""
+msgstr "E162: ะะธั˜ะต ะฑะธะปะพ ัƒะฟะธัะฐ ะพะด ะฟะพัะปะตะดัšะต ะฟั€ะพะผะตะฝะต ะทะฐ ะฑะฐั„ะตั€ \"%s\""
+
+msgid "Warning: Entered other buffer unexpectedly (check autocommands)"
+msgstr "ะฃะฟะพะทะพั€ะตัšะต: ะะตะพั‡ะตะบะธะฒะฐะฝะพ ัะต ะฟั€ะตัˆะปะพ ัƒ ะดั€ัƒะณะธ ะฑะฐั„ะตั€ (ะฟั€ะพะฒะตั€ะธั‚ะต ะฐัƒั‚ะพะบะพะผะฐะฝะดะต)"
+
+msgid "E163: There is only one file to edit"
+msgstr "E163: ะŸะพัั‚ะพั˜ะธ ัะฐะผะพ ั˜ะตะดะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ ะทะฐ ัƒั€ะตั’ะธะฒะฐัšะต"
+
+msgid "E164: Cannot go before first file"
+msgstr "E164: ะะต ะผะพะถะต ะดะฐ ัะต ะธะดะต ะธัะฟั€ะตะด ะฟั€ะฒะต ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "E165: Cannot go beyond last file"
+msgstr "E165: ะะต ะผะพะถะต ะดะฐ ัะต ะธะดะต ะธัะฟั€ะตะด ะฟั€ะฒะต ะดะฐั‚ะพั‚ะตะบะต"
+
+#, c-format
+msgid "E666: compiler not supported: %s"
+msgstr "E666: ะบะพะผะฟะฐั˜ะปะตั€ ะฝะธั˜ะต ะฟะพะดั€ะถะฐะฝ: %s"
+
+#, c-format
+msgid "Searching for \"%s\" in \"%s\""
+msgstr "ะขั€ะฐะถะธ ัะต \"%s\" ัƒ \"%s\""
+
+#, c-format
+msgid "Searching for \"%s\""
+msgstr "ะขั€ะฐะถะธ ัะต\"%s\""
+
+#, c-format
+msgid "not found in '%s': \"%s\""
+msgstr "ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝะพ ัƒ '%s': \"%s\""
+
+#, c-format
+msgid "W20: Required python version 2.x not supported, ignoring file: %s"
+msgstr ""
+"W20: ะ—ะฐั…ั‚ะตะฒะฐะฝะธ python version 2.x ะฝะธั˜ะต ะฟะพะดั€ะถะฐะฝ, ะดะฐั‚ะพั‚ะตะบะฐ: %s ัะต ะธะณะฝะพั€ะธัˆะต"
+
+#, c-format
+msgid "W21: Required python version 3.x not supported, ignoring file: %s"
+msgstr ""
+"W21: ะ—ะฐั…ั‚ะตะฒะฐะฝะธ python version 3.x ะฝะธั˜ะต ะฟะพะดั€ะถะฐะฝ, ะดะฐั‚ะพั‚ะตะบะฐ: %s ัะต ะธะณะฝะพั€ะธัˆะต"
+
+msgid "Source Vim script"
+msgstr "ะ˜ะทะฒะพั€ะฝะฐ Vim ัะบั€ะธะฟั‚ะฐ"
+
+#, c-format
+msgid "Cannot source a directory: \"%s\""
+msgstr "ะ”ะธั€ะตะบั‚ะพั€ะธั˜ัƒะผ ะฝะต ะผะพะถะต ะดะฐ ะฑัƒะดะต ะธะทะฒะพั€: \"%s\""
+
+#, c-format
+msgid "could not source \"%s\""
+msgstr "ะฝะต ะผะพะถะต ะฑะธั‚ะธ ะธะทะฒะพั€ \"%s\""
+
+#, c-format
+msgid "line %ld: could not source \"%s\""
+msgstr "ะปะธะฝะธั˜ะฐ %ld: ะฝะต ะผะพะถะต ะฑะธั‚ะธ ะธะทะฒะพั€ \"%s\""
+
+#, c-format
+msgid "sourcing \"%s\""
+msgstr "ะฟั€ะธะฑะฐะฒั™ะฐัšะต \"%s\""
+
+#, c-format
+msgid "line %ld: sourcing \"%s\""
+msgstr "ะปะธะฝะธั˜ะฐ %ld: ะฟั€ะธะฑะฐะฒั™ะฐัšะต \"%s\""
+
+#, c-format
+msgid "finished sourcing %s"
+msgstr "ะทะฐะฒั€ัˆะตะฝะพ ะฟั€ะธะฑะฐะฒั™ะฐัšะต %s"
+
+#, c-format
+msgid "continuing in %s"
+msgstr "ะฝะฐัั‚ะฐะฒั™ะฐ ัะต ัƒ %s"
+
+msgid "modeline"
+msgstr "ั€ะตะถะธะผัะบะฐ ะปะธะฝะธั˜ะฐ (modeline)"
+
+msgid "--cmd argument"
+msgstr "--cmd ะฐั€ะณัƒะผะตะฝั‚"
+
+msgid "-c argument"
+msgstr "-c ะฐั€ะณัƒะผะตะฝั‚"
+
+msgid "environment variable"
+msgstr "ะฟั€ะพะผะตะฝั™ะธะฒะฐ ะพะบั€ัƒะถะตัšะฐ"
+
+msgid "error handler"
+msgstr "ะฟั€ะพั†ะตะดัƒั€ะฐ ะทะฐ ะพะฑั€ะฐะดัƒ ะณั€ะตัˆะบะต"
+
+msgid "W15: Warning: Wrong line separator, ^M may be missing"
+msgstr "W15: ะฃะฟะพะทะพั€ะตัšะต: ะŸะพะณั€ะตัˆะฐะฝ ัะตะฟะฐั€ะฐั‚ะพั€ ะปะธะฝะธั˜ะต, ะผะพะถะดะฐ ะฝะตะดะพัั‚ะฐั˜ะต ^M"
+
+msgid "E167: :scriptencoding used outside of a sourced file"
+msgstr "E167: :scriptencoding ัะต ะบะพั€ะธัั‚ะธ ะฒะฐะฝ ะธะทะฒะพั€ะธัˆะฝะต ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "E168: :finish used outside of a sourced file"
+msgstr "E168: :finish ัะต ะบะพั€ะธัั‚ะธ ะฒะฐะฝ ะธะทะฒะพั€ะธัˆะฝะต ะดะฐั‚ะพั‚ะตะบะต"
+
+#, c-format
+msgid "Current %slanguage: \"%s\""
+msgstr "ะขะตะบัƒั›ะธ %sั˜ะตะทะธะบ: \"%s\""
+
+#, c-format
+msgid "E197: Cannot set language to \"%s\""
+msgstr "E197: ะˆะตะทะธะบ ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟะพัั‚ะฐะฒะธ ะฝะฐ \"%s\""
+
+msgid "Entering Ex mode. Type \"visual\" to go to Normal mode."
+msgstr ""
+"ะฃะปะฐะทะฐะบ ัƒ Ex ั€ะตะถะธะผ. ะžั‚ะบัƒั†ะฐั˜ั‚ะต \"visual\" ะดะฐ ะฑะธัั‚ะต ะฟั€ะตัˆะปะธ ัƒ ะะพั€ะผะฐะปะฝะธ ั€ะตะถะธะผ."
+
+msgid "E501: At end-of-file"
+msgstr "E501: ะะฐ ะบั€ะฐั˜ัƒ-ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "E169: Command too recursive"
+msgstr "E169: ะšะพะผะฐะฝะดะฐ ั˜ะต ััƒะฒะธัˆะต ั€ะตะบัƒั€ะทะธะฒะฝะฐ"
+
+#, c-format
+msgid "E605: Exception not caught: %s"
+msgstr "E605: ะ˜ะทัƒะทะตั‚ะฐะบ ะฝะธั˜ะต ัƒั…ะฒะฐั›ะตะฝ: %s"
+
+msgid "End of sourced file"
+msgstr "ะšั€ะฐั˜ ะธะทะฒะพั€ะธัˆะฝะต ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "End of function"
+msgstr "ะšั€ะฐั˜ ั„ัƒะฝะบั†ะธั˜ะต"
+
+msgid "E464: Ambiguous use of user-defined command"
+msgstr "E464: ะ”ะฒะพัะผะธัะปะตะฝะฐ ัƒะฟะพั‚ั€ะตะฑะฐ ะบะพั€ะธัะฝะธั‡ะบะธ ะดะตั„ะธะฝะธัะฐะฝะต ะบะพะผะฐะฝะดะต"
+
+msgid "E492: Not an editor command"
+msgstr "E492: ะะธั˜ะต ะบะพะผะฐะฝะดะฐ ะตะดะธั‚ะพั€ะฐ"
+
+msgid "E493: Backwards range given"
+msgstr "E493: ะ—ะฐะดะฐั‚ ั˜ะต ะพะฟัะตะณ ัƒะฝะฐะทะฐะด"
+
+msgid "Backwards range given, OK to swap"
+msgstr "ะ—ะฐะดะฐั‚ ั˜ะต ะพะฟัะตะณ ัƒะฝะฐะทะฐะด, ะžะš ะดะฐ ัะต ะทะฐะผะตะฝะธ"
+
+msgid "E494: Use w or w>>"
+msgstr "E494: ะšะพั€ะธัั‚ะธั‚ะต w ะธะปะธ w>>"
+
+msgid "E943: Command table needs to be updated, run 'make cmdidxs'"
+msgstr "E943: ะขะฐะฑะตะปะฐ ะบะพะผะฐะฝะดะธ ะผะพั€ะฐ ะดะฐ ัะต ะพัะฒะตะถะธ, ะฟะพะบั€ะตะฝะธั‚ะต 'make cmdidxs'"
+
+msgid "E319: Sorry, the command is not available in this version"
+msgstr "E319: ะ–ะฐะพ ะฝะฐะผ ั˜ะต, ั‚ะฐ ะบะพะผะฐะฝะดะฐ ะฝะธั˜ะต ะดะพัั‚ัƒะฟะฝะฐ ัƒ ะพะฒะพั˜ ะฒะตั€ะทะธั˜ะธ"
+
+msgid "1 more file to edit. Quit anyway?"
+msgstr "ะˆะพัˆ 1 ะดะฐั‚ะพั‚ะตะบะฐ ะทะฐ ัƒั€ะตั’ะธะฒะฐัšะต. ะ˜ะฟะฐะบ ะถะตะปะธั‚ะต ะดะฐ ะฝะฐะฟัƒัั‚ะธั‚ะต ะฟั€ะพะณั€ะฐะผ?"
+
+#, c-format
+msgid "%d more files to edit. Quit anyway?"
+msgstr "ะˆะพัˆ %d ะดะฐั‚ะพั‚ะตะบะฐ ะทะฐ ัƒั€ะตั’ะธะฒะฐัšะต. ะ˜ะฟะฐะบ ะถะตะปะธั‚ะต ะดะฐ ะฝะฐะฟัƒัั‚ะธั‚ะต ะฟั€ะพะณั€ะฐะผ?"
+
+msgid "E173: 1 more file to edit"
+msgstr "E173: ะˆะพัˆ 1 ะดะฐั‚ะพั‚ะตะบะฐ ะทะฐ ัƒั€ะตั’ะธะฒะฐัšะต"
+
+#, c-format
+msgid "E173: %ld more files to edit"
+msgstr "E173: ะˆะพัˆ %ld ะดะฐั‚ะพั‚ะตะบะฐ ะทะฐ ัƒั€ะตั’ะธะฒะฐัšะต"
+
+msgid "E174: Command already exists: add ! to replace it"
+msgstr "E174: ะšะพะผะฐะฝะดะฐ ะฒะตั› ะฟะพัั‚ะพั˜ะธ: ะดะพะดะฐั˜ั‚ะต ! ะดะฐ ั˜ะต ะทะฐะผะตะฝะธั‚ะต"
+
+msgid ""
+"\n"
+" Name Args Address Complete Definition"
+msgstr ""
+"\n"
+" ะ˜ะผะต ะั€ะณัƒะผ ะะดั€ะตัะฐ ะ”ะพะฒั€ัˆะตัšะต ะ”ะตั„ะธะฝะธั†ะธั˜ะฐ"
+
+msgid "No user-defined commands found"
+msgstr "ะะธััƒ ะฟั€ะพะฝะฐั’ะตะฝะต ะบะพั€ะธัะฝะธั‡ะบะธ ะดะตั„ะธะฝะธัะฐะฝะต ะบะพะผะฐะฝะดะต"
+
+msgid "E175: No attribute specified"
+msgstr "E175: ะะธั˜ะต ะฝะฐะฒะตะดะตะฝ ะฝะธ ั˜ะตะดะฐะฝ ะฐั‚ั€ะธะฑัƒั‚"
+
+msgid "E176: Invalid number of arguments"
+msgstr "E176: ะะตะธัะฟั€ะฐะฒะฐะฝ ะฑั€ะพั˜ ะฐั€ะณัƒะผะตะฝะฐั‚ะฐ"
+
+msgid "E177: Count cannot be specified twice"
+msgstr "E177: ะ‘ั€ะพั˜ะฐั‡ ะฝะต ะผะพะถะต ะดะฐ ัะต ะฝะฐะฒะตะดะต ะดะฒะฐ ะฟัƒั‚ะฐ"
+
+msgid "E178: Invalid default value for count"
+msgstr "E178: ะะตัะฟั€ะฐะฒะฝะฐ ะฟะพะดั€ะฐะทัƒะผะตะฒะฐะฝะฐ ะฒั€ะตะดะฝะพัั‚ ะทะฐ ะฑั€ะพั˜ะฐั‡"
+
+msgid "E179: argument required for -complete"
+msgstr "E179: ะฟะพั‚ั€ะตะฑะฐะฝ ั˜ะต ะฐั€ะณัƒะผะตะฝั‚ ะทะฐ -complete"
+
+msgid "E179: argument required for -addr"
+msgstr "E179: ะฟะพั‚ั€ะตะฑะฐะฝ ั˜ะต ะฐั€ะณัƒะผะตะฝั‚ ะทะฐ -addr"
+
+#, c-format
+msgid "E181: Invalid attribute: %s"
+msgstr "E181: ะะตะธัะฟั€ะฐะฒะฐะฝ ะฐั‚ั€ะธะฑัƒั‚: %s"
+
+msgid "E182: Invalid command name"
+msgstr "E182: ะะตะธัะฟั€ะฐะฒะฝะพ ะธะผะต ะบะพะผะฐะฝะดะต"
+
+msgid "E183: User defined commands must start with an uppercase letter"
+msgstr "E183: ะšะพั€ะธัะฝะธั‡ะบะธ ะดะตั„ะธะฝะธัะฐะฝะต ะบะพะผะฐะฝะดะต ะผะพั€ะฐั˜ัƒ ะดะฐ ะฟะพั‡ะฝัƒ ะฒะตะปะธะบะธะผ ัะปะพะฒะพะผ"
+
+msgid "E841: Reserved name, cannot be used for user defined command"
+msgstr ""
+"E841: ะ ะตะทะตั€ะฒะธัะฐะฝะพ ะธะผะต, ะฝะต ะผะพะถะต ะดะฐ ัะต ะบะพั€ะธัั‚ะธ ะทะฐ ะบะพั€ะธัะฝะธั‡ะบะธ ะดะตั„ะธะฝะธัะฐะฝัƒ ะบะพะผะฐะฝะดัƒ"
+
+#, c-format
+msgid "E184: No such user-defined command: %s"
+msgstr "E184: ะะต ะฟะพัั‚ะพั˜ะธ ั‚ะฐะบะฒะฐ ะบะพั€ะธัะฝะธั‡ะบะธ ะดะตั„ะธะฝะธัะฐะฝะฐ ะบะพะผะฐะฝะดะฐ: %s"
+
+#, c-format
+msgid "E180: Invalid address type value: %s"
+msgstr "E180: ะะตะธัะฟั€ะฐะฒะฝะฐ ะฒั€ะตะดะฝะพัั‚ ะฐะดั€ะตัะฝะพะณ ั‚ะธะฟะฐ: %s"
+
+#, c-format
+msgid "E180: Invalid complete value: %s"
+msgstr "E180: ะะตะธัะฟั€ะฐะฒะฝะฐ ะฒั€ะตะดะฝะพัั‚ ะดะพะฒั€ัˆะฐะฒะฐัšะฐ: %s"
+
+msgid "E468: Completion argument only allowed for custom completion"
+msgstr "E468: ะั€ะณัƒะผะตะฝั‚ ะดะพะฒั€ัˆะฐะฒะฐัšะฐ ั˜ะต ะดะพะทะฒะพั™ะตะฝ ัะฐะผะพ ะทะฐ ะฟั€ะธะปะฐะณะพั’ะตะฝะฐ ะดะพะฒั€ัˆะฐะฒะฐัšะฐ"
+
+msgid "E467: Custom completion requires a function argument"
+msgstr "E467: ะŸั€ะธะปะฐะณะพั’ะตะฝะพ ะดะพะฒั€ัˆะฐะฒะฐัšะต ะทะฐั…ั‚ะตะฒะฐ ะฐั€ะณัƒะผะตะฝั‚ ั„ัƒะฝะบั†ะธั˜ะต"
+
+msgid "unknown"
+msgstr "ะฝะตะฟะพะทะฝะฐั‚ะพ"
+
+#, c-format
+msgid "E185: Cannot find color scheme '%s'"
+msgstr "E185: ะจะตะผะฐ ะฑะพั˜ะฐ '%s' ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะฝะฐั’ะต"
+
+msgid "Greetings, Vim user!"
+msgstr "ะŸะพะทะดั€ะฐะฒ, ะบะพั€ะธัะฝะธั‡ะต Vim-a"
+
+msgid "E784: Cannot close last tab page"
+msgstr "E784: ะŸะพัะปะตะดัšะฐ ะบะฐั€ั‚ะธั†ะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ะทะฐั‚ะฒะพั€ะธ"
+
+msgid "Already only one tab page"
+msgstr "ะ’ะตั› ัั‚ะต ะฝะฐ ัะฐะผะพ ั˜ะตะดะฝะพั˜ ะบะฐั€ั‚ะธั†ะธ"
+
+msgid "Edit File in new window"
+msgstr "ะฃั€ะตั’ะธะฒะฐัšะต ะ”ะฐั‚ะพั‚ะตะบะต ัƒ ะฝะพะฒะพะผ ะฟั€ะพะทะพั€ัƒ"
+
+#, c-format
+msgid "Tab page %d"
+msgstr "ะšะฐั€ั‚ะธั†ะฐ %d"
+
+msgid "No swap file"
+msgstr "ะะตะผะฐ swap ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "Append File"
+msgstr "ะ”ะพะดะฐะฒะฐัšะต ะฝะฐ ะบั€ะฐั˜ ะ”ะฐั‚ะพั‚ะตะบะต"
+
+msgid "E747: Cannot change directory, buffer is modified (add ! to override)"
+msgstr ""
+"E747: ะ”ะธั€ะตะบั‚ะพั€ะธั˜ัƒะผ ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะผะตะฝะธ, ะฑะฐั„ะตั€ ั˜ะต ะธะทะผะตัšะตะฝ (ะดะพะดะฐั˜ั‚ะต ! ะทะฐ "
+"ะฟั€ะตะผะพัˆั›ะฐะฒะฐัšะต)"
+
+msgid "E186: No previous directory"
+msgstr "E186: ะะตะผะฐ ะฟั€ะตั‚ะณะพะดะฝะพะณ ะดะธั€ะตะบั‚ะพั€ะธั˜ัƒะผะฐ"
+
+msgid "E187: Unknown"
+msgstr "E187: ะะตะฟะพะทะฝะฐั‚ะพ"
+
+msgid "E465: :winsize requires two number arguments"
+msgstr "E465: :winsize ะทะฐั…ั‚ะตะฒะฐ ะดะฒะฐ ะฑั€ะพั˜ั‡ะฐะฝะฐ ะฐั€ะณัƒะผะตะฝั‚ะฐ"
+
+#, c-format
+msgid "Window position: X %d, Y %d"
+msgstr "ะŸะพะทะธั†ะธั˜ะฐ ะฟั€ะพะทะพั€ะฐ: X %d, Y %d"
+
+msgid "E188: Obtaining window position not implemented for this platform"
+msgstr "E188: ะ”ะพะฑะฐะฒั™ะฐัšะต ะฟะพะทะธั†ะธั˜ะต ะฟั€ะพะทะพั€ะฐ ะฝะธั˜ะต ะธะผะฟะปะตะผะตะฝั‚ะธั€ะฐะฝะพ ะทะฐ ะพะฒัƒ ะฟะปะฐั‚ั„ะพั€ะผัƒ"
+
+msgid "E466: :winpos requires two number arguments"
+msgstr "E466: :winpos ะทะฐั…ั‚ะตะฒะฐ ะดะฒะฐ ะฑั€ะพั˜ั‡ะฐะฝะฐ ะฐั€ะณัƒะผะตะฝั‚ะฐ"
+
+msgid "E930: Cannot use :redir inside execute()"
+msgstr "E930: :redir ะฝะต ะผะพะถะต ะดะฐ ัะต ะบะพั€ะธัั‚ะธ ัƒะฝัƒั‚ะฐั€ execute()"
+
+msgid "Save Redirection"
+msgstr "ะกะฐั‡ัƒะฒะฐั˜ ะ ะตะดะธั€ะตะบั†ะธั˜ัƒ"
+
+msgid "Save View"
+msgstr "ะกะฐั‡ัƒะฒะฐั˜ ะŸะพะณะปะตะด"
+
+msgid "Save Session"
+msgstr "ะกะฐั‡ัƒะฒะฐั˜ ะกะตัะธั˜ัƒ"
+
+msgid "Save Setup"
+msgstr "ะกะฐั‡ัƒะฒะฐั˜ ะŸะพะดะตัˆะฐะฒะฐัšะต"
+
+#, c-format
+msgid "E739: Cannot create directory: %s"
+msgstr "E739: ะ”ะธั€ะตะบั‚ะพั€ะธั˜ัƒะผ ะฝะต ะผะพะถะต ะดะฐ ัะต ะบั€ะตะธั€ะฐ: %s"
+
+#, c-format
+msgid "E189: \"%s\" exists (add ! to override)"
+msgstr "E189: \"%s\" ะฟะพัั‚ะพั˜ะธ (ะดะพะดะฐั˜ั‚ะต ! ะทะฐ ะฟั€ะตะผะพัˆั›ะฐะฒะฐัšะต)"
+
+#, c-format
+msgid "E190: Cannot open \"%s\" for writing"
+msgstr "E190: \"%s\" ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ ะทะฐ ัƒะฟะธั"
+
+msgid "E191: Argument must be a letter or forward/backward quote"
+msgstr "E191: ะั€ะณัƒะผะตะฝั‚ ะผะพั€ะฐ ะฑะธั‚ะธ ัะปะพะฒะพ ะธะปะธ ะฐะฟะพัั‚ั€ะพั„/ะพะฑั€ะฝัƒั‚ะธ ะฐะฟะพัั‚ั€ะพั„"
+
+msgid "E192: Recursive use of :normal too deep"
+msgstr "E192: ะ ะตะบัƒั€ะทะธะฒะฝะพ ะบะพั€ะธัˆั›ะตัšะต :normal ั˜ะต ััƒะฒะธัˆะต ะดัƒะฑะพะบะพ"
+
+msgid "E809: #< is not available without the +eval feature"
+msgstr "E809: #< ะฝะธั˜ะต ะดะพัั‚ัƒะฟะฝะพ ะฑะตะท +eval ะผะพะณัƒั›ะฝะพัั‚ะธ"
+
+msgid "E194: No alternate file name to substitute for '#'"
+msgstr "E194: ะะตะผะฐ ะฐะปั‚ะตั€ะฝะฐั‚ะธะฒะฝะพะณ ะธะผะตะฝะฐ ะบะพั˜ะต ะฑะธ ะทะฐะผะตะฝะธะปะพ '#'"
+
+msgid "E495: no autocommand file name to substitute for \"<afile>\""
+msgstr "E495: ะฝะตะผะฐ ะธะผะตะฝะฐ ะดะฐั‚ะพั‚ะตะบะต ะทะฐ ะฐัƒั‚ะพะบะพะผะฐะฝะดะต ะบะพั˜ะต ะฑะธ ะทะฐะผะตะฝะธะปะพ \"<afile>\""
+
+msgid "E496: no autocommand buffer number to substitute for \"<abuf>\""
+msgstr "E496: ะฝะตะผะฐ ะฑั€ะพั˜ะฐ ะฑะฐั„ะตั€ะฐ ะทะฐ ะฐัƒั‚ะพะบะพะผะฐะฝะดัƒ ะบะพั˜ะธ ะฑะธ ะทะฐะผะตะฝะธะพ \"<abuf>\""
+
+msgid "E497: no autocommand match name to substitute for \"<amatch>\""
+msgstr "E497: ะฝะตะผะฐ ะธะผะตะฝะฐ ะฟะพะดัƒะดะฐั€ะฐัšะฐ ะฐัƒั‚ะพะบะพะผะฐะฝะดะต ะบะพั˜ะต ะฑะธ ะทะฐะผะตะฝะธะปะพ \"<amatch>\""
+
+msgid "E498: no :source file name to substitute for \"<sfile>\""
+msgstr "E498: ะฝะตะผะฐ ะธะผะตะฝะฐ :source ะดะฐั‚ะพั‚ะตะบะต ะบะพั˜ะต ะฑะธ ะทะฐะผะตะฝะธะปะพ \"<sfile>\""
+
+msgid "E842: no line number to use for \"<slnum>\""
+msgstr "E842: ะฝะตะผะฐ ะฑั€ะพั˜ะฐ ะปะธะฝะธั˜ะต ะบะพั˜ะธ ะฑะธ ัะต ะบะพั€ะธัั‚ะธะพ ะทะฐ \"<slnum>\""
+
+#, no-c-format
+msgid "E499: Empty file name for '%' or '#', only works with \":p:h\""
+msgstr "E499: ะŸั€ะฐะทะฝะพ ะธะผะต ะดะฐั‚ะพั‚ะตะบะต ะทะฐ'%' or '#', ั„ัƒะฝะบั†ะธะพะฝะธัˆะต ัะฐะผะพ ัะฐ \":p:h\""
+
+msgid "E500: Evaluates to an empty string"
+msgstr "E500: ะ ะตะทัƒะปั‚ะฐั‚ ะธะทั€ะฐั‡ัƒะฝะฐะฒะฐัšะฐ ั˜ะต ะฟั€ะฐะทะฐะฝ ัั‚ั€ะธะฝะณ"
+
+msgid "E195: Cannot open viminfo file for reading"
+msgstr "E195: viminfo ะดะฐั‚ะพั‚ะตะบะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ ะทะฐ ั‡ะธั‚ะฐัšะต"
+
+msgid "Untitled"
+msgstr "ะ‘ะตะท ะฝะฐัะปะพะฒะฐ"
+
+msgid "E196: No digraphs in this version"
+msgstr "E196: ะฃ ะพะฒะพั˜ ะฒะตั€ะทะธั˜ะธ ะฝะตะผะฐ ะดะธะณั€ะฐั„ะฐ"
+
+msgid "E608: Cannot :throw exceptions with 'Vim' prefix"
+msgstr "E608: :throw ะธะทัƒะทะตั‚ะบะฐ ัะฐ 'Vim' ะฟั€ะตั„ะธะบัะพะผ ะฝะธั˜ะต ะดะพะทะฒะพั™ะตะฝ"
+
+#, c-format
+msgid "Exception thrown: %s"
+msgstr "ะ‘ะฐั‡ะตะฝ ั˜ะต ะธะทัƒะทะตั‚ะฐะบ: %s"
+
+#, c-format
+msgid "Exception finished: %s"
+msgstr "ะ˜ะทัƒะทะตั‚ะฐะบ ั˜ะต ะทะฐะฒั€ัˆะตะฝ: %s"
+
+#, c-format
+msgid "Exception discarded: %s"
+msgstr "ะ˜ะทัƒะทะตั‚ะฐะบ ั˜ะต ะพะดะฑะฐั‡ะตะฝ: %s"
+
+#, c-format
+msgid "%s, line %ld"
+msgstr "%s, ะปะธะฝะธั˜ะฐ %ld"
+
+#, c-format
+msgid "Exception caught: %s"
+msgstr "ะ˜ะทัƒะทะตั‚ะฐะบ ั˜ะต ัƒั…ะฒะฐั›ะตะฝ: %s"
+
+#, c-format
+msgid "%s made pending"
+msgstr "%s ั˜ะต ัั‚ะฐะฒั™ะตะฝ ะฝะฐ ั‡ะตะบะฐัšะต"
+
+#, c-format
+msgid "%s resumed"
+msgstr "%s ั˜ะต ะฟะพะฝะพะฒะพ ะฐะบั‚ะธะฒะฐะฝ"
+
+#, c-format
+msgid "%s discarded"
+msgstr "%s ั˜ะต ะพะดะฑะฐั‡ะตะฝ"
+
+msgid "Exception"
+msgstr "ะ˜ะทัƒะทะตั‚ะฐะบ"
+
+msgid "Error and interrupt"
+msgstr "ะ“ั€ะตัˆะบะฐ ะธ ะฟั€ะตะบะธะด"
+
+msgid "Error"
+msgstr "ะ“ั€ะตัˆะบะฐ"
+
+msgid "Interrupt"
+msgstr "ะŸั€ะตะบะธะด"
+
+msgid "E579: :if nesting too deep"
+msgstr "E579: :if ัƒะณัšะตะถะดะฐะฒะฐัšะต ั˜ะต ััƒะฒะธัˆะต ะดัƒะฑะพะบะพ"
+
+msgid "E580: :endif without :if"
+msgstr "E580: :endif ะฑะตะท :if"
+
+msgid "E581: :else without :if"
+msgstr "E581: :else ะฑะตะท :if"
+
+msgid "E582: :elseif without :if"
+msgstr "E582: :elseif ะฑะตะท :if"
+
+msgid "E583: multiple :else"
+msgstr "E583: ะฒะธัˆะตัั‚ั€ัƒะบะพ :else"
+
+msgid "E584: :elseif after :else"
+msgstr "E584: :elseif ะฝะฐะบะพะฝ :else"
+
+msgid "E585: :while/:for nesting too deep"
+msgstr "E585: :while/:for ัƒะณัšะตะถะดะฐะฒะฐัšะต ั˜ะต ััƒะฒะธัˆะต ะดัƒะฑะพะบะพ"
+
+msgid "E586: :continue without :while or :for"
+msgstr "E586: :continue ะฑะตะท :while ะธะปะธ :for"
+
+msgid "E587: :break without :while or :for"
+msgstr "E587: :break ะฑะตะท :while ะธะปะธ :for"
+
+msgid "E732: Using :endfor with :while"
+msgstr "E732: ะšะพั€ะธัˆั›ะตัšะต :endfor ัะฐ :while"
+
+msgid "E733: Using :endwhile with :for"
+msgstr "E733: ะšะพั€ะธัˆั›ะตัšะต :endwhile ัะฐ :for"
+
+msgid "E601: :try nesting too deep"
+msgstr "E601: :try ัƒะณัšะตะถะดะฐะฒะฐัšะต ั˜ะต ััƒะฒะธัˆะต ะดัƒะฑะพะบะพ"
+
+msgid "E603: :catch without :try"
+msgstr "E603: :catch ะฑะตะท :try"
+
+msgid "E604: :catch after :finally"
+msgstr "E604: :catch ะฝะฐะบะพะฝ :finally"
+
+msgid "E606: :finally without :try"
+msgstr "E606: :finally ะฑะตะท :try"
+
+msgid "E607: multiple :finally"
+msgstr "E607: ะฒะธัˆะตัั‚ั€ัƒะบะพ :finally"
+
+msgid "E602: :endtry without :try"
+msgstr "E602: :endtry ะฑะตะท :try"
+
+msgid "E193: :endfunction not inside a function"
+msgstr "E193: :endfunction ะฝะธั˜ะต ัƒะฝัƒั‚ะฐั€ ั„ัƒะฝะบั†ะธั˜ะต"
+
+msgid "E788: Not allowed to edit another buffer now"
+msgstr "E788: ะฃั€ะตั’ะธะฒะฐัšะต ะดั€ัƒะณะพะณ ะฑะฐั„ะตั€ะฐ ั‚ั€ะตะฝัƒั‚ะฝะพ ะฝะธั˜ะต ะดะพะทะฒะพั™ะตะฝะพ"
+
+msgid "E811: Not allowed to change buffer information now"
+msgstr "E811: ะœะตัšะฐัšะต ะธะฝั„ะพั€ะผะฐั†ะธั˜ะฐ ะพ ะฑะฐั„ะตั€ัƒ ั‚ั€ะตะฝัƒั‚ะฝะพ ะฝะธั˜ะต ะดะพะทะฒะพั™ะตะฝะพ"
+
+msgid "tagname"
+msgstr "ะพะทะฝะฐะบะฐ"
+
+msgid " kind file\n"
+msgstr " ะฒั€ัั‚ะฐ ะดะฐั‚ะพั‚ะตะบะต\n"
+
+msgid "'history' option is zero"
+msgstr "ะพะฟั†ะธั˜ะฐ 'history' ั˜ะต ะฝัƒะปะฐ"
+
+#, c-format
+msgid ""
+"\n"
+"# %s History (newest to oldest):\n"
+msgstr ""
+"\n"
+"# %s ะ˜ัั‚ะพั€ะธั˜ะฐ (ะพะด ะฝะฐั˜ะฝะพะฒะธั˜ะตะณ ะบะฐ ะฝะฐั˜ัั‚ะฐั€ะธั˜ะตะผ):\n"
+
+msgid "Command Line"
+msgstr "ะšะพะผะฐะฝะดะฝะฐ ะปะธะฝะธั˜ะฐ"
+
+msgid "Search String"
+msgstr "ะกั‚ั€ะธะฝะณ ะทะฐ ะฟั€ะตั‚ั€ะฐะณัƒ"
+
+msgid "Expression"
+msgstr "ะ˜ะทั€ะฐะท"
+
+msgid "Input Line"
+msgstr "ะ›ะธะฝะธั˜ะฐ ะทะฐ ัƒะฝะพั"
+
+msgid "Debug Line"
+msgstr "Debug ะปะธะฝะธั˜ะฐ"
+
+msgid "E198: cmd_pchar beyond the command length"
+msgstr "E198: cmd_pchar ั˜ะต ะธะทะฐ ะดัƒะถะธะฝะต ะบะพะผะฐะฝะดะต"
+
+msgid "E199: Active window or buffer deleted"
+msgstr "E199: Active window or buffer deleted"
+
+msgid "E812: Autocommands changed buffer or buffer name"
+msgstr "E812: ะัƒั‚ะพะบะพะผะฐะฝะดะต ััƒ ะฟั€ะพะผะตะฝะธะปะต ะฑะฐะณะตั€ ะธะปะธ ะธะผะต ะฑะฐั„ะตั€ะฐ"
+
+msgid "Illegal file name"
+msgstr "ะะตะดะพะทะฒะพั™ะตะฝะพ ะธะผะต ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "is a directory"
+msgstr "ั˜ะต ะดะธั€ะตะบั‚ะพั€ะธั˜ัƒะผ"
+
+msgid "is not a file"
+msgstr "ะฝะธั˜ะต ะดะฐั‚ะพั‚ะตะบะฐ"
+
+msgid "is a device (disabled with 'opendevice' option)"
+msgstr "ั˜ะต ัƒั€ะตั’ะฐั˜ (ะพะฝะตะผะพะณัƒั›ะตะฝ ะพะฟั†ะธั˜ะพะผ 'opendevice')"
+
+msgid "[New File]"
+msgstr "[ะะพะฒะฐ ะดะฐั‚ะพั‚ะตะบะฐ]"
+
+msgid "[New DIRECTORY]"
+msgstr "[ะะพะฒ ะ”ะ˜ะ ะ•ะšะขะžะ ะ˜ะˆะฃะœ]"
+
+msgid "[File too big]"
+msgstr "[ะ”ะฐั‚ะพั‚ะตะบะฐ ั˜ะต ััƒะฒะธัˆะต ะฒะตะปะธะบะฐ]"
+
+msgid "[Permission Denied]"
+msgstr "[ะ”ะพะทะฒะพะปะฐ ะพะดะฑะธั˜ะตะฝะฐ]"
+
+msgid "E200: *ReadPre autocommands made the file unreadable"
+msgstr "E200: *ReadPre ะฐัƒั‚ะพะบะพะผะฐะฝะดะต ััƒ ัƒั‡ะธะฝะธะปะต ะดะฐั‚ะพั‚ะตะบัƒ ะฝะตั‡ะธั‚ั™ะธะฒะพะผ"
+
+msgid "E201: *ReadPre autocommands must not change current buffer"
+msgstr "E201: *ReadPre ะฐัƒั‚ะพะบะพะผะฐะฝะดะต ะฝะต ัะผะตั˜ัƒ ะดะฐ ะธะทะผะตะฝะต ั‚ะตะบัƒั›ะธ ะฑะฐั„ะตั€"
+
+msgid "Vim: Reading from stdin...\n"
+msgstr "Vim: ะงะธั‚ะฐัšะต ัะฐ stdin...\n"
+
+msgid "Reading from stdin..."
+msgstr "ะงะธั‚ะฐัšะต ัะฐ stdin..."
+
+msgid "E202: Conversion made file unreadable!"
+msgstr "E202: ะšะพะฝะฒะตั€ะทะธั˜ะฐ ั˜ะต ัƒั‡ะธะฝะธะปะฐ ะดะฐั‚ะพั‚ะตะบัƒ ะฝะตั‡ะธั‚ั™ะธะฒะพะผ!"
+
+msgid "[fifo/socket]"
+msgstr "[fifo/ัƒั‚ะธั‡ะฝะธั†ะฐ]"
+
+msgid "[fifo]"
+msgstr "[fifo]"
+
+msgid "[socket]"
+msgstr "[ัƒั‚ะธั‡ะฝะธั†ะฐ]"
+
+msgid "[character special]"
+msgstr "[ัะฟะตั†ะธั˜ะฐะปะฝะธ ะบะฐั€ะฐะบั‚ะตั€]"
+
+msgid "[CR missing]"
+msgstr "[ะฝะตะดะพัั‚ะฐั˜ะต CR]"
+
+msgid "[long lines split]"
+msgstr "[ะดัƒะณะต ะปะธะฝะธั˜ะต ะฟั€ะตะปะพะผั™ะตะฝะต]"
+
+msgid "[NOT converted]"
+msgstr "[ะะ˜ะˆะ• ะบะพะฝะฒะตั€ั‚ะพะฒะฐะฝะพ]"
+
+msgid "[converted]"
+msgstr "[ะบะพะฝะฒะตั€ั‚ะพะฒะฐะฝะพ]"
+
+#, c-format
+msgid "[CONVERSION ERROR in line %ld]"
+msgstr "[ะ“ะ ะ•ะจะšะ ะšะžะะ’ะ•ะ ะ—ะ˜ะˆะ• ัƒ ะปะธะฝะธั˜ะธ %ld]"
+
+#, c-format
+msgid "[ILLEGAL BYTE in line %ld]"
+msgstr "[ะะ•ะ”ะžะ—ะ’ะžะ‰ะ•ะ ะ‘ะะˆะข ัƒ ะปะธะฝะธั˜ะธ %ld]"
+
+msgid "[READ ERRORS]"
+msgstr "[ะ“ะ ะ•ะจะšะ• ะŸะ ะ˜ ะงะ˜ะขะะŠะฃ]"
+
+msgid "Can't find temp file for conversion"
+msgstr "ะŸั€ะธะฒั€ะตะผะตะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ ะทะฐ ะบะพะฝะฒะตั€ะทะธั˜ัƒ ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะฝะฐั’ะต"
+
+msgid "Conversion with 'charconvert' failed"
+msgstr "ะšะพะฝะฒะตั€ะทะธั˜ะฐ ัะฐ 'charconvert' ะฝะธั˜ะต ัƒัะฟะตะปะฐ"
+
+msgid "can't read output of 'charconvert'"
+msgstr "ะธะทะปะฐะท 'charconvert' ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพั‡ะธั‚ะฐ"
+
+msgid "E676: No matching autocommands for acwrite buffer"
+msgstr "E676: ะะตะผะฐ ะพะดะณะพะฒะฐั€ะฐั˜ัƒั›ะธั… ะฐัƒั‚ะพะบะพะผะฐะฝะดะธ ะทะฐ acwrite ะฑะฐั„ะตั€"
+
+msgid "E203: Autocommands deleted or unloaded buffer to be written"
+msgstr ""
+"E203: ะัƒั‚ะพะบะพะผะฐะฝะดะต ััƒ ะพะฑั€ะธัะฐะปะต ะธะปะธ ัƒะบะปะพะฝะธะปะต ะธะท ะผะตะผะพั€ะธั˜ะต ะฑะฐั„ะตั€ ะบะพั˜ะธ ั‚ั€ะตะฑะฐะปะพ ะดะฐ "
+"ะฑัƒะดะต ัƒะฟะธัะฐะฝ"
+
+msgid "E204: Autocommand changed number of lines in unexpected way"
+msgstr "E204: ะัƒั‚ะพะบะพะผะฐะฝะดะต ััƒ ะฝะฐ ะฝะตะพั‡ะตะบะธะฒะฐะฝ ะฝะฐั‡ะธะฝ ะฟั€ะพะผะตะฝะธะปะต ะฑั€ะพั˜ ะปะธะฝะธั˜ะฐ"
+
+msgid "NetBeans disallows writes of unmodified buffers"
+msgstr "NetBeans ะฝะต ะดะพะทะฒะพั™ะฐะฒะฐ ัƒะฟะธั ะฝะตะธะทะผะตัšะตะฝะธั… ะฑะฐั„ะตั€ะฐ"
+
+msgid "Partial writes disallowed for NetBeans buffers"
+msgstr "ะŸะฐั€ั†ะธั˜ะฐะปะฝะธ ัƒะฟะธัะธ ะฝะธััƒ ะดะพะทะฒะพั™ะตะฝะธ ะทะฐ NetBeans ะฑะฐั„ะตั€ะต"
+
+msgid "is not a file or writable device"
+msgstr "ะฝะธั˜ะต ะดะฐั‚ะพั‚ะตะบะฐ ะธะปะธ ัƒั€ะตั’ะฐั˜ ะฝะฐ ะบะพั˜ะธ ะผะพะถะต ะดะฐ ัะต ัƒะฟะธััƒั˜ะต"
+
+msgid "writing to device disabled with 'opendevice' option"
+msgstr "ัƒะฟะธั ะฝะฐ ัƒั€ะตั’ะฐั˜ ั˜ะต ะพะฝะตะผะพะณัƒั›ะตะฝ ะพะฟั†ะธั˜ะพะผ 'opendevice'"
+
+msgid "is read-only (add ! to override)"
+msgstr "ั˜ะต ัะฐะผะพ ะทะฐ ั‡ะธั‚ะฐัšะต (ะดะพะดะฐั˜ั‚ะต ! ะทะฐ ะฟั€ะตะผะพัˆั›ะฐะฒะฐัšะต)"
+
+msgid "E506: Can't write to backup file (add ! to override)"
+msgstr ""
+"E506: ะะต ะผะพะถะต ะดะฐ ัะต ัƒะฟะธัˆะต ัƒ ั€ะตะทะตั€ะฒะฝัƒ ะดะฐั‚ะพั‚ะตะบัƒ (ะดะพะดะฐั˜ั‚ะต ! ะทะฐ ะฟั€ะตะผะพัˆั›ะฐะฒะฐัšะต)"
+
+msgid "E507: Close error for backup file (add ! to override)"
+msgstr ""
+"E507: ะ“ั€ะตัˆะบะฐ ะบะพะด ะทะฐั‚ะฒะฐั€ะฐัšะฐ ะทะฐ ั€ะตะทะตั€ะฒะฝัƒ ะดะฐั‚ะพั‚ะตะบัƒ (ะดะพะดะฐั˜ั‚ะต ! ะทะฐ ะฟั€ะตะผะพัˆั›ะฐะฒะฐัšะต)"
+
+msgid "E508: Can't read file for backup (add ! to override)"
+msgstr ""
+"E508: ะ ะตะทะตั€ะฒะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพั‡ะธั‚ะฐ (ะดะพะดะฐั˜ั‚ะต ! ะทะฐ ะฟั€ะตะผะพัˆั›ะฐะฒะฐัšะต)"
+
+msgid "E509: Cannot create backup file (add ! to override)"
+msgstr ""
+"E509: ะ ะตะทะตั€ะฒะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ะบั€ะตะธั€ะฐ (ะดะพะดะฐั˜ั‚ะต ! ะทะฐ ะฟั€ะตะผะพัˆั›ะฐะฒะฐัšะต)"
+
+msgid "E510: Can't make backup file (add ! to override)"
+msgstr ""
+"E510: ะ ะตะทะตั€ะฒะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ะฝะฐะฟั€ะฐะฒะธ (ะดะพะดะฐั˜ั‚ะต ! ะทะฐ ะฟั€ะตะผะพัˆั›ะฐะฒะฐัšะต)"
+
+msgid "E214: Can't find temp file for writing"
+msgstr "E214: ะŸั€ะธะฒั€ะตะผะตะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ ะทะฐ ัƒะฟะธั ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะฝะฐั’ะต"
+
+msgid "E213: Cannot convert (add ! to write without conversion)"
+msgstr "E213: ะšะพะฝะฒะตั€ะทะธั˜ะฐ ะฝะธั˜ะต ะผะพะณัƒั›ะฐ (ะดะพะดะฐั˜ั‚ะต ! ะทะฐ ัƒะฟะธั ะฑะตะท ะบะพะฝะฒะตั€ะทะธั˜ะต)"
+
+msgid "E166: Can't open linked file for writing"
+msgstr "E166: ะŸะพะฒะตะทะฐะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ ะทะฐ ัƒะฟะธั"
+
+msgid "E212: Can't open file for writing"
+msgstr "E212: ะ”ะฐั‚ะพั‚ะตะบะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ ะทะฐ ัƒะฟะธั"
+
+msgid "E949: File changed while writing"
+msgstr "E949: ะ”ะฐั‚ะพั‚ะตะบะฐ ั˜ะต ะฟั€ะพะผะตัšะตะฝะฐ ั‚ะพะบะพะผ ัƒะฟะธัะฐ"
+
+msgid "E512: Close failed"
+msgstr "E512: ะ—ะฐั‚ะฒะฐั€ะฐัšะต ะฝะธั˜ะต ัƒัะฟะตะปะพ"
+
+msgid "E513: write error, conversion failed (make 'fenc' empty to override)"
+msgstr ""
+"E513: ะณั€ะตัˆะบะฐ ะฟั€ะธ ัƒะฟะธััƒ, ะบะพะฝะฒะตั€ะทะธั˜ะฐ ะฝะธั˜ะต ัƒัะฟะตะปะฐ (ะพัั‚ะฐะฒะธั‚ะต 'fenc' ะฟั€ะฐะทะฝะพ ะดะฐ "
+"ะฟั€ะตะผะพัั‚ะธั‚ะต)"
+
+#, c-format
+msgid ""
+"E513: write error, conversion failed in line %ld (make 'fenc' empty to "
+"override)"
+msgstr ""
+"E513: ะณั€ะตัˆะบะฐ ะฟั€ะธ ัƒะฟะธััƒ, ะบะพะฝะฒะตั€ะทะธั˜ะฐ ะฝะธั˜ะต ัƒัะฟะตะปะฐ ัƒ ะปะธะฝะธั˜ะธ %ld (ะพัั‚ะฐะฒะธั‚ะต 'fenc' "
+"ะฟั€ะฐะทะฝะพ ะดะฐ ะฟั€ะตะผะพัั‚ะธั‚ะต)"
+
+msgid "E514: write error (file system full?)"
+msgstr "E514: ะณั€ะตัˆะบะฐ ะฟั€ะธ ัƒะฟะธััƒ (ัะธัั‚ะตะผ ะดะฐั‚ะพั‚ะตะบะฐ ั˜ะต ะฟัƒะฝ?)"
+
+msgid " CONVERSION ERROR"
+msgstr " ะ“ะ ะ•ะจะšะ ะšะžะะ’ะ•ะ ะ—ะ˜ะˆะ•"
+
+#, c-format
+msgid " in line %ld;"
+msgstr " ัƒ ะปะธะฝะธั˜ะธ %ld;"
+
+msgid "[Device]"
+msgstr "[ะฃั€ะตั’ะฐั˜]"
+
+msgid "[New]"
+msgstr "[ะะพะฒะพ]"
+
+msgid " [a]"
+msgstr " [ะฝ]"
+
+msgid " appended"
+msgstr " ะฝะฐัั‚ะฐะฒั™ะตะฝะพ"
+
+msgid " [w]"
+msgstr " [ัƒ]"
+
+msgid " written"
+msgstr " ัƒะฟะธัะฐะฝะพ"
+
+msgid "E205: Patchmode: can't save original file"
+msgstr "E205: Patch ั€ะตะถะธะผ: ะพั€ะธะณะธะฝะฐะปะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ัะฐั‡ัƒะฒะฐ"
+
+msgid "E206: patchmode: can't touch empty original file"
+msgstr "E206: Patch ั€ะตะถะธะผ: ะฝะต ะผะพะถะต ะดะฐ ัะต ะบั€ะตะธั€ะฐ ะฟั€ะฐะทะฝะฐ ะพั€ะธะณะธะฝะฐะปะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ"
+
+msgid "E207: Can't delete backup file"
+msgstr "E207: ะ ะตะทะตั€ะฒะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ะพะฑั€ะธัˆะต"
+
+msgid ""
+"\n"
+"WARNING: Original file may be lost or damaged\n"
+msgstr ""
+"\n"
+"ะฃะŸะžะ—ะžะ ะ•ะŠะ•: ะžั€ะธะณะธะฝะฐะปะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ ั˜ะต ะผะพะถะดะฐ ะธะทะณัƒะฑั™ะตะฝะฐ ะธะปะธ ะพัˆั‚ะตั›ะตะฝะฐ\n"
+
+msgid "don't quit the editor until the file is successfully written!"
+msgstr "ะฝะต ะฝะฐะฟัƒัˆั‚ะฐั˜ั‚ะต ะตะดะธั‚ะพั€ ะดะพะบ ัะต ะดะฐั‚ะพั‚ะตะบะฐ ัƒัะฟะตัˆะฝะพ ะฝะต ัƒะฟะธัˆะต!"
+
+msgid "[dos]"
+msgstr "[dos]"
+
+msgid "[dos format]"
+msgstr "[dos ั„ะพั€ะผะฐั‚]"
+
+msgid "[mac]"
+msgstr "[mac]"
+
+msgid "[mac format]"
+msgstr "[mac ั„ะพั€ะผะฐั‚]"
+
+msgid "[unix]"
+msgstr "[unix]"
+
+msgid "[unix format]"
+msgstr "[unix ั„ะพั€ะผะฐั‚]"
+
+msgid "1 line, "
+msgstr "1 ะปะธะฝะธั˜ะฐ, "
+
+#, c-format
+msgid "%ld lines, "
+msgstr "%ld ะปะธะฝะธั˜ะฐ, "
+
+msgid "1 character"
+msgstr "1 ะบะฐั€ะฐะบั‚ะตั€"
+
+#, c-format
+msgid "%lld characters"
+msgstr "%lld ะบะฐั€ะฐะบั‚ะตั€ะฐ"
+
+msgid "[noeol]"
+msgstr "[noeol]"
+
+msgid "[Incomplete last line]"
+msgstr "[ะŸะพัะปะตะดัšะฐ ะปะธะฝะธั˜ะฐ ะฝะธั˜ะต ะบะพะผะฟะปะตั‚ะฝะฐ]"
+
+msgid "WARNING: The file has been changed since reading it!!!"
+msgstr "ะฃะŸะžะ—ะžะ ะ•ะŠะ•: ะžะฒะฐ ะดะฐั‚ะพั‚ะตะบะฐ ั˜ะต ะฟั€ะพะผะตัšะตะฝะฐ ะพะด ะบะฐะด ั˜ะต ะฟั€ะพั‡ะธั‚ะฐะฝะฐ!!!"
+
+msgid "Do you really want to write to it"
+msgstr "ะ”ะฐ ะปะธ ะทะฐะธัั‚ะฐ ะถะตะปะธั‚ะต ะดะฐ ะฟะธัˆะตั‚ะต ัƒ ัšัƒ"
+
+#, c-format
+msgid "E208: Error writing to \"%s\""
+msgstr "E208: ะ“ั€ะตัˆะบะฐ ะฟั€ะธ ัƒะฟะธััƒ ัƒ \"%s\""
+
+#, c-format
+msgid "E209: Error closing \"%s\""
+msgstr "E209: ะ“ั€ะตัˆะบะฐ ะฟั€ะธ ะทะฐั‚ะฒะฐั€ะฐัšัƒ \"%s\""
+
+#, c-format
+msgid "E210: Error reading \"%s\""
+msgstr "E210: ะ“ั€ะตัˆะบะฐ ะฟั€ะธ ั‡ะธั‚ะฐัšัƒ \"%s\""
+
+msgid "E246: FileChangedShell autocommand deleted buffer"
+msgstr "E246: FileChangedShell ะฐัƒั‚ะพะบะพะผะฐะฝะดะฐ ั˜ะต ะพะฑั€ะธัะฐะปะฐ ะฑะฐั„ะตั€"
+
+#, c-format
+msgid "E211: File \"%s\" no longer available"
+msgstr "E211: ะ”ะฐั‚ะพั‚ะตะบะฐ \"%s\" ะฒะธัˆะต ะฝะธั˜ะต ะดะพัั‚ัƒะฟะฝะฐ"
+
+#, c-format
+msgid ""
+"W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as "
+"well"
+msgstr ""
+"W12: ะฃะฟะพะทะพั€ะตัšะต: ะ”ะฐั‚ะพั‚ะตะบะฐ \"%s\" ั˜ะต ะธะทะผะตัšะตะฝะฐ ะธ ะฑะฐั„ะตั€ ัƒ ะฟั€ะพะณั€ะฐะผัƒ Vim ั˜ะต ั‚ะฐะบะพั’ะต "
+"ะธะทะผะตัšะตะฝ"
+
+msgid "See \":help W12\" for more info."
+msgstr "ะŸะพะณะปะตะดะฐั˜ั‚ะต \":help W12\" ะทะฐ ะฒะธัˆะต ะธะฝั„ะพั€ะผะฐั†ะธั˜ะฐ."
+
+#, c-format
+msgid "W11: Warning: File \"%s\" has changed since editing started"
+msgstr ""
+"W11: ะฃะฟะพะทะพั€ะตัšะต: ะ”ะฐั‚ะพั‚ะตะบะฐ \"%s\" ั˜ะต ะธะทะผะตัšะตะฝะฐ ะพั‚ะบะฐะด ั˜ะต ะทะฐะฟะพั‡ะตั‚ะพ ัƒั€ะตั’ะธะฒะฐัšะต"
+
+msgid "See \":help W11\" for more info."
+msgstr "ะŸะพะณะปะตะดะฐั˜ั‚ะต \":help W11\" ะทะฐ ะฒะธัˆะต ะธะฝั„ะพั€ะผะฐั†ะธั˜ะฐ."
+
+#, c-format
+msgid "W16: Warning: Mode of file \"%s\" has changed since editing started"
+msgstr ""
+"W16: ะฃะฟะพะทะพั€ะตัšะต: ะ ะตะถะธะผ ะดะฐั‚ะพั‚ะตะบะต \"%s\" ั˜ะต ะธะทะผะตัšะตะฝ ะพั‚ะบะฐะด ั˜ะต ะทะฐะฟะพั‡ะตั‚ะพ ัƒั€ะตั’ะธะฒะฐัšะต"
+
+msgid "See \":help W16\" for more info."
+msgstr "ะŸะพะณะปะตะดะฐั˜ั‚ะต \":help W16\" ะทะฐ ะฒะธัˆะต ะธะฝั„ะพั€ะผะฐั†ะธั˜ะฐ."
+
+#, c-format
+msgid "W13: Warning: File \"%s\" has been created after editing started"
+msgstr "W13: ะฃะฟะพะทะพั€ะตัšะต: ะ”ะฐั‚ะพั‚ะตะบะฐ \"%s\" ั˜ะต ะบั€ะตะธั€ะฐะฝะฐ ะฝะฐะบะพะฝ ะฟะพั‡ะตั‚ะบะฐ ัƒั€ะตั’ะธะฒะฐัšะฐ"
+
+msgid "Warning"
+msgstr "ะฃะฟะพะทะพั€ะตัšะต"
+
+msgid ""
+"&OK\n"
+"&Load File"
+msgstr ""
+"&OK\n"
+"&ะฃั‡ะธั‚ะฐั˜ ะดะฐั‚ะพั‚ะตะบัƒ"
+
+#, c-format
+msgid "E462: Could not prepare for reloading \"%s\""
+msgstr "E462: ะŸั€ะธะฟั€ะตะผะฐ ะทะฐ ะฟะพะฝะพะฒะฝะพ ัƒั‡ะธั‚ะฐะฒะฐัšะต \"%s\" ะฝะธั˜ะต ะฑะธะปะฐ ะผะพะณัƒั›ะฐ"
+
+#, c-format
+msgid "E321: Could not reload \"%s\""
+msgstr "E321: \"%s\" ะฝะต ะผะพะถะต ะฟะพะฝะพะฒะพ ะดะฐ ัะต ัƒั‡ะธั‚ะฐ"
+
+msgid "--Deleted--"
+msgstr "--ะžะฑั€ะธัะฐะฝะพ--"
+
+#, c-format
+msgid "auto-removing autocommand: %s <buffer=%d>"
+msgstr "ะฐัƒั‚ะพ-ัƒะบะปะฐัšะฐั˜ัƒั›ะฐ ะฐัƒั‚ะพะบะพะผะฐะฝะดะฐ: %s <ะฑะฐั„ะตั€=%d>"
+
+#, c-format
+msgid "E367: No such group: \"%s\""
+msgstr "E367: ะะตะผะฐ ั‚ะฐะบะฒะต ะณั€ัƒะฟะต: \"%s\""
+
+msgid "E936: Cannot delete the current group"
+msgstr "E936: ะขะตะบัƒั›ะฐ ะณั€ัƒะฟะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ะพะฑั€ะธัˆะต"
+
+msgid "W19: Deleting augroup that is still in use"
+msgstr "W19: ะ‘ั€ะธัะฐัšะต augroup ะบะพั˜ะฐ ั˜ะต ั˜ะพัˆ ัƒ ัƒะฟะพั‚ั€ะตะฑะธ"
+
+#, c-format
+msgid "E215: Illegal character after *: %s"
+msgstr "E215: ะะตะดะพะทะฒะพั™ะตะฝะธ ะบะฐั€ะฐะบั‚ะตั€ ะฝะฐะบะพะฝ *: %s"
+
+#, c-format
+msgid "E216: No such event: %s"
+msgstr "E216: ะะตะผะฐ ั‚ะฐะบะฒะพะณ ะดะพะณะฐั’ะฐั˜ะฐ: %s"
+
+#, c-format
+msgid "E216: No such group or event: %s"
+msgstr "E216: ะะตะผะฐ ั‚ะฐะบะฒะต ะณั€ัƒะฟะต ะธะปะธ ะดะพะณะฐั’ะฐั˜ะฐ: %s"
+
+msgid ""
+"\n"
+"--- Autocommands ---"
+msgstr ""
+"\n"
+"--- ะัƒั‚ะพะบะพะผะฐะฝะดะต ---"
+
+#, c-format
+msgid "E680: <buffer=%d>: invalid buffer number "
+msgstr "E680: <ะฑะฐั„ะตั€=%d>: ะฝะตะธัะฟั€ะฐะฒะฐะฝ ะฑั€ะพั˜ ะฑะฐั„ะตั€ะฐ "
+
+msgid "E217: Can't execute autocommands for ALL events"
+msgstr "E217: ะัƒั‚ะพะบะพะผะฐะฝะดะต ะทะฐ ะกะ’ะ• ะดะพะณะฐั’ะฐั˜ะต ะฝะต ะผะพะณัƒ ะดะฐ ัะต ะธะทะฒั€ัˆะต"
+
+msgid "No matching autocommands"
+msgstr "ะะตะผะฐ ะฟะพะดัƒะดะฐั€ะฐั˜ัƒั›ะธั… ะฐัƒั‚ะพะบะพะผะฐะฝะดะธ"
+
+msgid "E218: autocommand nesting too deep"
+msgstr "E218: ะฃะณัšะตะถะดะฐะฒะฐัšะต ะฐัƒั‚ะพะบะพะผะฐะฝะดะต ั˜ะต ััƒะฒะธัˆะต ะดัƒะฑะพะบะพ"
+
+#, c-format
+msgid "%s Autocommands for \"%s\""
+msgstr "%s ะัƒั‚ะพะบะพะผะฐะฝะดะต ะทะฐ \"%s\""
+
+#, c-format
+msgid "Executing %s"
+msgstr "ะ˜ะทะฒั€ัˆะฐะฒะฐัšะต %s"
+
+#, c-format
+msgid "autocommand %s"
+msgstr "ะฐัƒั‚ะพะบะพะผะฐะฝะดะฐ %s"
+
+msgid "E219: Missing {."
+msgstr "E219: ะะตะดะพัั‚ะฐั˜ะต {."
+
+msgid "E220: Missing }."
+msgstr "E220: ะะตะดะพัั‚ะฐั˜ะต }."
+
+msgid "E490: No fold found"
+msgstr "E490: ะะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝะพ ะฝะธั˜ะตะดะฝะพ ัะบะปะฐะฟะฐัšะต"
+
+msgid "E350: Cannot create fold with current 'foldmethod'"
+msgstr "E350: ะกะบะปะฐะฟะฐัšะต ะฝะต ะผะพะถะต ะดะฐ ัะต ะบั€ะตะธั€ะฐ ัะฐ ั‚ะตะบัƒั›ะธะผ 'foldmethod'"
+
+msgid "E351: Cannot delete fold with current 'foldmethod'"
+msgstr "E351: ะกะบะปะฐะฟะฐัšะต ะฝะต ะผะพะถะต ะดะฐ ัะต ะพะฑั€ะธัˆะต ัะฐ ั‚ะตะบั›ะธะผ 'foldmethod'"
+
+#, c-format
+msgid "+--%3ld line folded "
+msgid_plural "+--%3ld lines folded "
+msgstr[0] "+--%3ld ะปะธะฝะธั˜ะฐ ะฟะพะดะฒะธั˜ะตะฝะฐ"
+msgstr[1] "+--%3ld ะปะธะฝะธั˜ะฐ ะฟะพะดะฒะธั˜ะตะฝะพ"
+
+msgid "E222: Add to read buffer"
+msgstr "E222: ะ”ะพะดะฐะฒะฐัšะต ัƒ ะฑะฐั„ะตั€ ั‡ะธั‚ะฐัšะฐ"
+
+msgid "E223: recursive mapping"
+msgstr "E223: ั€ะตะบัƒั€ะทะธะฒะฝะพ ะผะฐะฟะธั€ะฐัšะต"
+
+#, c-format
+msgid "E224: global abbreviation already exists for %s"
+msgstr "E224: ะณะปะพะฑะฐะปะฝะฐ ัะบั€ะฐั›ะตะฝะธั†ะฐ ะทะฐ %s ะฒะตั› ะฟะพัั‚ะพั˜ะธ"
+
+#, c-format
+msgid "E225: global mapping already exists for %s"
+msgstr "E225: ะณะปะพะฑะฐะปะฝะพ ะผะฐะฟะธั€ะฐัšะต ะทะฐ %s ะฒะตั› ะฟะพัั‚ะพั˜ะธ"
+
+#, c-format
+msgid "E226: abbreviation already exists for %s"
+msgstr "E226: ัะบั€ะฐั›ะตะฝะธั†ะฐ ะทะฐ %s ะฒะตั› ะฟะพัั‚ะพั˜ะธ"
+
+#, c-format
+msgid "E227: mapping already exists for %s"
+msgstr "E227: ะผะฐะฟะธั€ะฐัšะต ะทะฐ %s ะฒะตั› ะฟะพัั‚ะพั˜ะธ"
+
+msgid "No abbreviation found"
+msgstr "ะกะบั€ะฐั›ะตะฝะธั†ะฐ ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝะฐ"
+
+msgid "No mapping found"
+msgstr "ะœะฐะฟะธั€ะฐัšะต ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝะพ"
+
+msgid "E228: makemap: Illegal mode"
+msgstr "E228: makemap: ะะตะดะพะทะฒะพั™ะตะฝ ั€ะตะถะธะผ"
+
+msgid "E851: Failed to create a new process for the GUI"
+msgstr "E851: ะšั€ะตะธั€ะฐัšะต ะฝะพะฒะพะณ ะฟั€ะพั†ะตัะฐ ะทะฐ GUI ะฝะธั˜ะต ัƒัะฟะตะปะพ"
+
+msgid "E852: The child process failed to start the GUI"
+msgstr "E852: ะŸั€ะพั†ะตั ะฟะพั‚ะพะผะฐะบ ะฝะธั˜ะต ัƒัะฟะตะพ ะดะฐ ะฟะพะบั€ะตะฝะต GUI"
+
+msgid "E229: Cannot start the GUI"
+msgstr "E229: GUI ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟะพะบั€ะตะฝะต"
+
+#, c-format
+msgid "E230: Cannot read from \"%s\""
+msgstr "E230: ะ˜ะท \"%s\" ะฝะต ะผะพะถะต ะดะฐ ัะต ั‡ะธั‚ะฐ"
+
+msgid "E665: Cannot start GUI, no valid font found"
+msgstr "E665: GUI ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟะพะบั€ะตะฝะต, ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝ ะฒะฐะปะธะดะฐะฝ ั„ะพะฝั‚"
+
+msgid "E231: 'guifontwide' invalid"
+msgstr "E231: 'guifontwide' ะฝะตะธัะฟั€ะฐะฒะฐะฝ"
+
+msgid "E599: Value of 'imactivatekey' is invalid"
+msgstr "E599: ะ’ั€ะตะดะฝะพัั‚ 'imactivatekey' ะฝะธั˜ะต ะธัะฟั€ะฐะฒะฝะฐ"
+
+#, c-format
+msgid "E254: Cannot allocate color %s"
+msgstr "E254: ะ‘ะพั˜ะฐ %s ะฝะต ะผะพะถะต ะดะฐ ัะต ะฐะปะพั†ะธั€ะฐ"
+
+msgid "No match at cursor, finding next"
+msgstr "ะะตะผะฐ ะฟะพะดัƒะดะฐั€ะฐัšะฐ ะฝะฐ ะผะตัั‚ัƒ ะบัƒั€ัะพั€ะฐ, ั‚ั€ะฐะถะธ ัะต ะดะฐั™ะต"
+
+msgid "<cannot open> "
+msgstr "<ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ> "
+
+#, c-format
+msgid "E616: vim_SelFile: can't get font %s"
+msgstr "E616: vim_SelFile: ะฝะต ะผะพะถะต ะดะฐ ัะต ะดะพะฑะธั˜ะต ั„ะพะฝั‚ %s"
+
+msgid "E614: vim_SelFile: can't return to current directory"
+msgstr "E614: vim_SelFile: ะฟะพะฒั€ะฐั‚ะฐะบ ัƒ ั‚ะตะบัƒั›ะธ ะดะธั€ะตะบั‚ะพั€ะธั˜ัƒะผ ะฝะธั˜ะต ะผะพะณัƒั›"
+
+msgid "Pathname:"
+msgstr "ะ˜ะผะต ะฟัƒั‚ะฐัšะต:"
+
+msgid "E615: vim_SelFile: can't get current directory"
+msgstr "E615: vim_SelFile: ะฝะต ะผะพะถะต ะดะฐ ัะต ะดะพะฑะธั˜ะต ั‚ะตะบัƒั›ะธ ะดะธั€ะตะบั‚ะพั€ะธั˜ัƒะผ"
+
+msgid "OK"
+msgstr "ะžะš"
+
+msgid "Cancel"
+msgstr "ะžั‚ะบะฐะถะธ"
+
+msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
+msgstr "Scrollbar Widget: ะะต ะผะพะถะต ะดะฐ ัะต ะดะพะฑะธั˜ะต ะณะตะพะผะตั‚ั€ะธั˜ะฐ thumb pixmap."
+
+msgid "Vim dialog"
+msgstr "Vim ะดะธั˜ะฐะปะพะณ"
+
+msgid "E232: Cannot create BalloonEval with both message and callback"
+msgstr ""
+"E232: ะะต ะผะพะถะต ะดะฐ ัะต ะบั€ะตะธั€ะฐ BalloonEval ะธ ัะฐ ะฟะพั€ัƒะบะพะผ ะธ ัะฐ ะฟะพะฒั€ะฐั‚ะฝะธะผ ะฟะพะทะธะฒะพะผ"
+
+msgid "_Cancel"
+msgstr "_ะžั‚ะบะฐะถะธ"
+
+msgid "_Save"
+msgstr "_ะกะฐั‡ัƒะฒะฐั˜"
+
+msgid "_Open"
+msgstr "_ะžั‚ะฒะพั€ะธ"
+
+msgid "_OK"
+msgstr "_OK"
+
+msgid ""
+"&Yes\n"
+"&No\n"
+"&Cancel"
+msgstr ""
+"&ะ”ะฐ\n"
+"&ะะต\n"
+"&ะžั‚ะบะฐะถะธ"
+
+msgid "Yes"
+msgstr "ะ”ะฐ"
+
+msgid "No"
+msgstr "ะะต"
+
+msgid "Input _Methods"
+msgstr "_ะœะตั‚ะพะดะต ัƒะฝะพัะฐ"
+
+msgid "VIM - Search and Replace..."
+msgstr "VIM - ะŸั€ะตั‚ั€ะฐะณะฐ and ะ—ะฐะผะตะฝะฐ..."
+
+msgid "VIM - Search..."
+msgstr "VIM - ะŸั€ะตั‚ั€ะฐะณะฐ..."
+
+msgid "Find what:"
+msgstr "ะŸั€ะพะฝะฐั’ะธ:"
+
+msgid "Replace with:"
+msgstr "ะ—ะฐะผะตะฝะธ ัะฐ:"
+
+msgid "Match whole word only"
+msgstr "ะกะฐะผะพ ั†ะตะปะต ั€ะตั‡ะธ ะฟะพะดัƒะดะฐั€ะฐั˜ัƒ"
+
+msgid "Match case"
+msgstr "ะœะฐะปะฐ/ะฒะตะปะธะบะฐ ัะปะพะฒะฐ"
+
+msgid "Direction"
+msgstr "ะกะผะตั€"
+
+msgid "Up"
+msgstr "ะ“ะพั€ะต"
+
+msgid "Down"
+msgstr "ะ”ะพะปะต"
+
+msgid "Find Next"
+msgstr "ะŸั€ะพะฝะฐั’ะธ ะฝะฐั€ะตะดะฝะพ"
+
+msgid "Replace"
+msgstr "ะ—ะฐะผะตะฝะธ"
+
+msgid "Replace All"
+msgstr "ะ—ะฐะผะตะฝะธ ัะฒะต"
+
+msgid "_Close"
+msgstr "_ะ—ะฐั‚ะฒะพั€ะธ"
+
+msgid "Vim: Received \"die\" request from session manager\n"
+msgstr "Vim: ะŸั€ะธะผั™ะตะฝ ั˜ะต \"die\" ะทะฐั…ั‚ะตะฒ ะพะด ะผะตะฝะฐัŸะตั€ะฐ ัะตัะธั˜ะต\n"
+
+msgid "Close tab"
+msgstr "ะ—ะฐั‚ะฒะพั€ะธ ะบะฐั€ั‚ะธั†ัƒ"
+
+msgid "New tab"
+msgstr "ะะพะฒะฐ ะบะฐั€ั‚ะธั†ะฐ"
+
+msgid "Open Tab..."
+msgstr "ะžั‚ะฒะพั€ะธ ะบะฐั€ั‚ะธั†ัƒ..."
+
+msgid "Vim: Main window unexpectedly destroyed\n"
+msgstr "Vim: ะ“ะปะฐะฒะฝะธ ะฟั€ะพะทะพั€ ั˜ะต ะฝะตะพั‡ะตะบะธะฒะฐะฝะพ ัƒะฝะธัˆั‚ะตะฝ\n"
+
+msgid "&Filter"
+msgstr "&ะคะธะปั‚ะตั€"
+
+msgid "&Cancel"
+msgstr "&ะžั‚ะบะฐะถะธ"
+
+msgid "Directories"
+msgstr "ะ”ะธั€ะตะบั‚ะพั€ะธั˜ัƒะผะธ"
+
+msgid "Filter"
+msgstr "ะคะธะปั‚ะตั€"
+
+msgid "&Help"
+msgstr "&ะŸะพะผะพั›"
+
+msgid "Files"
+msgstr "ะ”ะฐั‚ะพั‚ะตะบะต"
+
+msgid "&OK"
+msgstr "&ะžะš"
+
+msgid "Selection"
+msgstr "ะกะตะปะตะบั†ะธั˜ะฐ"
+
+msgid "Find &Next"
+msgstr "ะŸั€ะพะฝะฐั’ะธ &ะกะปะตะดะตั›ะต"
+
+msgid "&Replace"
+msgstr "&ะ—ะฐะผะตะฝะธ"
+
+msgid "Replace &All"
+msgstr "ะ—ะฐะผะตะฝะธ ั&ะ’ะต"
+
+msgid "&Undo"
+msgstr "ะž&ะฟะพะทะพะฒะธ"
+
+msgid "Open tab..."
+msgstr "ะžั‚ะฒะพั€ะธ ะบะฐั€ั‚ะธั†ัƒ"
+
+msgid "Find string (use '\\\\' to find a '\\')"
+msgstr "ะŸั€ะพะฝะฐั’ะธ ัั‚ั€ะธะฝะณ (ะบะพั€ะธัั‚ะธั‚ะต '\\\\' ะดะฐ ะฟั€ะพะฝะฐั’ะตั‚ะต '\\')"
+
+msgid "Find & Replace (use '\\\\' to find a '\\')"
+msgstr "ะŸั€ะพะฝะฐั’ะธ & ะ—ะฐะผะตะฝะธ (ะบะพั€ะธัั‚ะธั‚ะต '\\\\' ะดะฐ ะฟั€ะพะฝะฐั’ะตั‚ะต '\\')"
+
+msgid "Not Used"
+msgstr "ะะต ะบะพั€ะธัั‚ะธ ัะต"
+
+msgid "Directory\t*.nothing\n"
+msgstr "ะ”ะธั€ะตะบั‚ะพั€ะธั˜ัƒะผ\t*.ะฝะธัˆั‚ะฐ\n"
+
+#, c-format
+msgid "E671: Cannot find window title \"%s\""
+msgstr "E671: ะะฐัะปะพะฒ ะฟั€ะพะทะพั€ะฐ \"%s\" ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะฝะฐั’ะต"
+
+#, c-format
+msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
+msgstr "E243: ะั€ะณัƒะผะตะฝั‚ ะฝะธั˜ะต ะฟะพะดั€ะถะฐะฝ: \"-%s\"; ะšะพั€ะธัั‚ะธั‚ะต OLE ะฒะตั€ะทะธั˜ัƒ."
+
+msgid "E672: Unable to open window inside MDI application"
+msgstr "E672: ะะธั˜ะต ะผะพะณัƒั›ะต ะพั‚ะฒะฐั€ะฐัšะต ะฟั€ะพะทะพั€ะฐ ัƒะฝัƒั‚ะฐั€ MDI ะฐะฟะปะธะบะฐั†ะธั˜ะต"
+
+msgid "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
+msgstr ""
+"Vim E458: colormap ัƒะฝะพั ะฝะต ะผะพะถะต ะดะฐ ัะต ะฐะปะพั†ะธั€ะฐ, ะฝะตะบะต ะฑะพั˜ะต ััƒ ะผะพะถะดะฐ ะฝะตะธัะฟั€ะฐะฒะฝะต"
+
+#, c-format
+msgid "E250: Fonts for the following charsets are missing in fontset %s:"
+msgstr "E250: ะคะพะฝั‚ะพะฒะธ ะทะฐ ัะปะตะดะตั›ะต ัะตั‚ะพะฒะต ะบะฐั€ะฐะบั‚ะตั€ะฐ ะฝะตะดะพัั‚ะฐั˜ัƒ ัƒ ั„ะพะฝั‚ัะตั‚ัƒ %s:"
+
+#, c-format
+msgid "E252: Fontset name: %s"
+msgstr "E252: ะ˜ะผะต ั„ะพะฝั‚ัะตั‚ะฐ: %s"
+
+#, c-format
+msgid "Font '%s' is not fixed-width"
+msgstr "ะคะพะฝั‚ %s' ะฝะธั˜ะต ั„ะธะบัะฝะต ัˆะธั€ะธะฝะต"
+
+#, c-format
+msgid "E253: Fontset name: %s"
+msgstr "E253: ะ˜ะผะต ั„ะพะฝั‚ัะตั‚ะฐ: %s"
+
+#, c-format
+msgid "Font0: %s"
+msgstr "ะคะพะฝั‚0: %s"
+
+#, c-format
+msgid "Font1: %s"
+msgstr "ะคะพะฝั‚1: %s"
+
+#, c-format
+msgid "Font%ld width is not twice that of font0"
+msgstr "ะจะธั€ะธะฝะฐ ั„ะพะฝั‚%ld ะฝะธั˜ะต ะดะฒะพัั‚ั€ัƒะบะฐ ะพะด ัˆะธั€ะธะฝะต ั„ะพะฝั‚0"
+
+#, c-format
+msgid "Font0 width: %ld"
+msgstr "ะคะพะฝั‚0 ัˆะธั€ะธะฝะฐ: %ld"
+
+#, c-format
+msgid "Font1 width: %ld"
+msgstr "ะคะพะฝั‚1 ัˆะธั€ะธะฝะฐ: %ld"
+
+msgid "Invalid font specification"
+msgstr "ะะตะธัะฟั€ะฐะฒะฝะฐ ัะฟะตั†ะธั„ะธะบะฐั†ะธั˜ะฐ ั„ะพะฝั‚ะฐ"
+
+msgid "&Dismiss"
+msgstr "ะž&ะดะฑะฐั†ะธ"
+
+msgid "no specific match"
+msgstr "ะฝะตะผะฐ ะฟะพัะตะฑะฝะพะณ ะฟะพะดัƒะดะฐั€ะฐัšะฐ"
+
+msgid "Vim - Font Selector"
+msgstr "Vim - ะคะพะฝั‚ ัะตะปะตะบั‚ะพั€"
+
+msgid "Name:"
+msgstr "ะ˜ะผะต:"
+
+msgid "Show size in Points"
+msgstr "ะŸั€ะธะบะฐะถะธ ะฒะตะปะธั‡ะธะฝัƒ ัƒ ะขะฐั‡ะบะฐะผะฐ"
+
+msgid "Encoding:"
+msgstr "ะšะพะดะธั€ะฐัšะต:"
+
+msgid "Font:"
+msgstr "ะคะพะฝั‚:"
+
+msgid "Style:"
+msgstr "ะกั‚ะธะป:"
+
+msgid "Size:"
+msgstr "ะ’ะตะปะธั‡ะธะฝะฐ:"
+
+msgid "E256: Hangul automata ERROR"
+msgstr "E256: ะ“ะ ะ•ะจะšะ Hangul ะฐัƒั‚ะพะผะฐั‚ะฐ"
+
+msgid "E550: Missing colon"
+msgstr "E550: ะะตะดะพัั‚ะฐั˜ะต ะดะฒะพั‚ะฐั‡ะบะฐ"
+
+msgid "E551: Illegal component"
+msgstr "E551: ะะตะธัะฟั€ะฐะฒะฝะฐ ะบะพะผะฟะพะฝะตะฝั‚ะฐ"
+
+msgid "E552: digit expected"
+msgstr "E552: ะพั‡ะตะบัƒั˜ะต ัะต ั†ะธั„ั€ะฐ"
+
+#, c-format
+msgid "Page %d"
+msgstr "ะกั‚ั€ะฐะฝะฐ %d"
+
+msgid "No text to be printed"
+msgstr "ะะตะผะฐ ั‚ะตะบัั‚ะฐ ะทะฐ ัˆั‚ะฐะผะฟัƒ"
+
+#, c-format
+msgid "Printing page %d (%d%%)"
+msgstr "ะจั‚ะฐะผะฟะฐัšะต ัั‚ั€ะฐะฝะต %d (%d%%)"
+
+#, c-format
+msgid " Copy %d of %d"
+msgstr " ะšะพะฟะธั˜ะฐ %d ะพะด %d"
+
+#, c-format
+msgid "Printed: %s"
+msgstr "ะžะดัˆั‚ะฐะผะฟะฐะฝะพ: %s"
+
+msgid "Printing aborted"
+msgstr "ะจั‚ะฐะผะฟะฐัšะต ะฟั€ะตะบะธะฝัƒั‚ะพ"
+
+msgid "E455: Error writing to PostScript output file"
+msgstr "E455: ะ“ั€ะตัˆะบะฐ ะฟั€ะธะปะธะบะพะผ ัƒะฟะธัะฐ ัƒ PostScript ะธะทะปะฐะทะฝัƒ ะดะฐั‚ะพั‚ะตะบัƒ"
+
+#, c-format
+msgid "E624: Can't open file \"%s\""
+msgstr "E624: ะ”ะฐั‚ะพั‚ะตะบะฐ \"%s\" ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ"
+
+#, c-format
+msgid "E457: Can't read PostScript resource file \"%s\""
+msgstr "E457: PostScript resource ะดะฐั‚ะพั‚ะตะบะฐ \"%s\" ะฝะต ะผะพะถะต ะดะฐ ัะต ั‡ะธั‚ะฐ"
+
+#, c-format
+msgid "E618: file \"%s\" is not a PostScript resource file"
+msgstr "E618: ะดะฐั‚ะพั‚ะตะบะฐ \"%s\" ะฝะธั˜ะต PostScript resource ะดะฐั‚ะพั‚ะตะบะฐ"
+
+#, c-format
+msgid "E619: file \"%s\" is not a supported PostScript resource file"
+msgstr "E619: ะดะฐั‚ะพั‚ะตะบะฐ \"%s\" ะฝะธั˜ะต ะฟะพะดั€ะถะฐะฝะฐ PostScript resource ะดะฐั‚ะพั‚ะตะบะฐ"
+
+#, c-format
+msgid "E621: \"%s\" resource file has wrong version"
+msgstr "E621: \"%s\" resource ะดะฐั‚ะพั‚ะตะบะฐ ั˜ะต ะฟะพะณั€ะตัˆะฝะต ะฒะตั€ะทะธั˜ะต"
+
+msgid "E673: Incompatible multi-byte encoding and character set."
+msgstr "E673: ะ’ะธัˆะตะฑะฐั˜ั‚ะฝะพ ะบะพะดะธั€ะฐัšะต ะธ ัะบัƒะฟ ะบะฐั€ะฐะบั‚ะตั€ะฐ ะฝะธััƒ ะบะพะผะฟะฐั‚ะธะฑะธะปะฝะธ."
+
+msgid "E674: printmbcharset cannot be empty with multi-byte encoding."
+msgstr "E674: printmbcharset ะฝะต ะผะพะถะต ะฑะธั‚ะธ ะฟั€ะฐะทะฝะพ ัะฐ ะฒะธัˆะตะฑะฐั˜ั‚ะฝะธะผ ะบะพะดะธั€ะฐัšะตะผ."
+
+msgid "E675: No default font specified for multi-byte printing."
+msgstr "E675: ะะธั˜ะต ะฝะฐะฒะตะดะตะฝ ะฟะพะดั€ะฐะทัƒะผะตะฒะฐะฝะธ ั„ะพะฝั‚ ะทะฐ ะฒะธัˆะตะฑะฐั˜ั‚ะฝะพ ัˆั‚ะฐะผะฟะฐัšะต."
+
+msgid "E324: Can't open PostScript output file"
+msgstr "E324: PostScript ะธะทะปะฐะทะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ"
+
+#, c-format
+msgid "E456: Can't open file \"%s\""
+msgstr "E456: ะ”ะฐั‚ะพั‚ะตะบะฐ \"%s\" ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ"
+
+msgid "E456: Can't find PostScript resource file \"prolog.ps\""
+msgstr "E456: PostScript resource ะดะฐั‚ะพั‚ะตะบะฐ \"prolog.ps\" ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะฝะฐั’ะต"
+
+msgid "E456: Can't find PostScript resource file \"cidfont.ps\""
+msgstr ""
+"E456: PostScript resource ะดะฐั‚ะพั‚ะตะบะฐ \"cidfont.ps\" ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะฝะฐั’ะต"
+
+#, c-format
+msgid "E456: Can't find PostScript resource file \"%s.ps\""
+msgstr "E456: PostScript resource ะดะฐั‚ะพั‚ะตะบะฐ \"%s.ps\" ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะฝะฐั’ะต"
+
+#, c-format
+msgid "E620: Unable to convert to print encoding \"%s\""
+msgstr "E620: ะะธั˜ะต ะผะพะณัƒั›ะฐ ะบะพะฝะฒะตั€ะทะธั˜ะฐ ัƒ ะบะพะดะธั€ะฐัšะต ะทะฐ ัˆั‚ะฐะผะฟัƒ \"%s\""
+
+msgid "Sending to printer..."
+msgstr "ะกะปะฐัšะต ัˆั‚ะฐะผะฟะฐั‡ัƒ..."
+
+msgid "E365: Failed to print PostScript file"
+msgstr "E365: PostScript ะดะฐั‚ะพั‚ะตะบะฐ ะฝะธั˜ะต ัƒัะฟะตะปะฐ ะดะฐ ัะต ะพะดัˆั‚ะฐะผะฟะฐ"
+
+msgid "Print job sent."
+msgstr "ะ—ะฐะดะฐั‚ะฐะบ ัˆั‚ะฐะผะฟะต ั˜ะต ะฟะพัะปะฐั‚"
+
+msgid "Add a new database"
+msgstr "ะ”ะพะดะฐั˜ ะฝะพะฒัƒ ะฑะฐะทัƒ"
+
+msgid "Query for a pattern"
+msgstr "ะฃะฟะธั‚ ะทะฐ ัˆะฐะฑะปะพะฝ"
+
+msgid "Show this message"
+msgstr "ะŸั€ะธะบะฐะถะธ ะพะฒัƒ ะฟะพั€ัƒะบัƒ"
+
+msgid "Kill a connection"
+msgstr "ะ—ะฐั‚ะฒะพั€ะธ ะฒะตะทัƒ"
+
+msgid "Reinit all connections"
+msgstr "ะŸะพะฝะพะฒะพ ะธะฝะธั†ะธั˜ะฐะปะธะทัƒั˜ ัะฒะต ะฒะตะทะต"
+
+msgid "Show connections"
+msgstr "ะŸั€ะธะบะฐะถะธ ะฒะตะทะต"
+
+#, c-format
+msgid "E560: Usage: cs[cope] %s"
+msgstr "E560: ะฃะฟะพั‚ั€ะตะฑะฐ: cs[cope] %s"
+
+msgid "This cscope command does not support splitting the window.\n"
+msgstr "ะžะฒะฐ cscope ะบะพะผะฐะฝะดะฐ ะฝะต ะฟะพะดั€ะถะฐะฒะฐ ะฟะพะดะตะปัƒ ะฟั€ะพะทะพั€ะฐ.\n"
+
+msgid "E562: Usage: cstag <ident>"
+msgstr "E562: ะฃะฟะพั‚ั€ะตะฑะฐ: cstag <ident>"
+
+msgid "E257: cstag: tag not found"
+msgstr "E257: cstag: ะพะทะฝะฐะบะฐ ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝะฐ"
+
+#, c-format
+msgid "E563: stat(%s) error: %d"
+msgstr "E563: stat(%s) ะณั€ะตัˆะบะฐ: %d"
+
+msgid "E563: stat error"
+msgstr "E563: stat ะณั€ะตัˆะบะฐ"
+
+#, c-format
+msgid "E564: %s is not a directory or a valid cscope database"
+msgstr "E564: %s ะฝะธั˜ะต ะดะธั€ะตะบั‚ะพั€ะธั˜ัƒะผ ะธะปะธ ะฒะฐะปะธะดะฝะฐ cscope ะฑะฐะทะฐ ะฟะพะดะฐั‚ะฐะบะฐ"
+
+#, c-format
+msgid "Added cscope database %s"
+msgstr "cscope ะฑะฐะทะฐ ะฟะพะดะฐั‚ะฐะบะฐ %s ั˜ะต ะดะพะดะฐั‚ะฐ"
+
+#, c-format
+msgid "E262: error reading cscope connection %ld"
+msgstr "E262: ะณั€ะตัˆะบะฐ ะบะพะด ั‡ะธั‚ะฐัšะฐ cscope ะฒะตะทะต %ld"
+
+msgid "E561: unknown cscope search type"
+msgstr "E561: ะฝะตะฟะพะทะฝะฐั‚ cscope ั‚ะธะฟ ะฟั€ะตั‚ั€ะฐะณะต"
+
+msgid "E566: Could not create cscope pipes"
+msgstr "E566: cscope ะฟั€ะพั†ะตัะฝะธ ั‚ะพะบะพะฒะธ ะฝะธััƒ ะผะพะณะปะธ ะดะฐ ัะต ะบั€ะตะธั€ะฐั˜ัƒ"
+
+msgid "E622: Could not fork for cscope"
+msgstr "E622: ะ ะฐั‡ะฒะฐัšะต ะทะฐ cscope ะฝะธั˜ะต ัƒัะฟะตะปะพ"
+
+msgid "cs_create_connection setpgid failed"
+msgstr "cs_create_connection setpgid ะฝะธั˜ะต ัƒัะฟะตะพ"
+
+msgid "cs_create_connection exec failed"
+msgstr "cs_create_connection exec ะฝะธั˜ะต ัƒัะฟะตะพ"
+
+msgid "cs_create_connection: fdopen for to_fp failed"
+msgstr "cs_create_connection: fdopen ะทะฐ to_fp ะฝะธั˜ะต ัƒัะฟะตะพ"
+
+msgid "cs_create_connection: fdopen for fr_fp failed"
+msgstr "cs_create_connection: fdopen ะทะฐ fr_fp ะฝะธั˜ะต ัƒัะฟะตะพ"
+
+msgid "E623: Could not spawn cscope process"
+msgstr "E623: ะœั€ะตัˆั›ะตัšะต cscope ะฟั€ะพั†ะตัะฐ ะฝะธั˜ะต ัƒัะฟะตะปะพ"
+
+msgid "E567: no cscope connections"
+msgstr "E567: ะฝะตะผะฐ cscope ะฒะตะทะฐ"
+
+#, c-format
+msgid "E469: invalid cscopequickfix flag %c for %c"
+msgstr "E469: ะฝะตะธัะฟั€ะฐะฒะฐะฝ cscopequickfix ะธะฝะดะธะบะฐั‚ะพั€ %c ะทะฐ %c"
+
+#, c-format
+msgid "E259: no matches found for cscope query %s of %s"
+msgstr "E259: ะฝะธััƒ ะฟั€ะพะฝะฐั’ะตะฝะฐ ะฟะพะดัƒะดะฐั€ะฐัšะฐ ะทะฐ cscope ัƒะฟะธั‚ %s ะฝะฐ %s"
+
+msgid "cscope commands:\n"
+msgstr "cscope ะบะพะผะฐะฝะดะต:\n"
+
+#, c-format
+msgid "%-5s: %s%*s (Usage: %s)"
+msgstr "%-5s: %s%*s (ะฃะฟะพั‚ั€ะตะฑะฐ: %s)"
+
+msgid ""
+"\n"
+" a: Find assignments to this symbol\n"
+" c: Find functions calling this function\n"
+" d: Find functions called by this function\n"
+" e: Find this egrep pattern\n"
+" f: Find this file\n"
+" g: Find this definition\n"
+" i: Find files #including this file\n"
+" s: Find this C symbol\n"
+" t: Find this text string\n"
+msgstr ""
+"\n"
+" a: ะŸั€ะพะฝะฐั’ะธ ะดะพะดะตะปะต ะพะฒะพะผ ัะธะผะฑะพะปัƒ\n"
+" c: ะŸั€ะพะฝะฐั’ะธ ั„ัƒะฝะบั†ะธั˜ะต ะบะพั˜ะต ะฟะพะทะธะฒะฐั˜ัƒ ะพะฒัƒ ั„ัƒะฝะบั†ะธั˜ัƒ\n"
+" d: ะŸั€ะพะฝะฐั’ะธ ั„ัƒะฝะบั†ะธั˜ะต ะบะพั˜ะต ะทะพะฒะต ะพะฒะฐ ั„ัƒะฝะบั†ะธั˜ะฐ\n"
+" e: ะŸั€ะพะฝะฐั’ะธ ะพะฒะฐั˜ egrep ัˆะฐะฑะปะพะฝ\n"
+" f: ะŸั€ะพะฝะฐั’ะธ ะพะฒัƒ ะดะฐั‚ะพั‚ะตะบัƒ\n"
+" g: ะŸั€ะพะฝะฐั’ะธ ะพะฒัƒ ะดะตั„ะธะฝะธั†ะธั˜ัƒ\n"
+" i: ะŸั€ะพะฝะฐั’ะธ ะดะฐั‚ะพั‚ะตะบะต ะบะพั˜ะต #includะต ะพะฒัƒ ะดะฐั‚ะพั‚ะตะบัƒ\n"
+" s: ะŸั€ะพะฝะฐั’ะธ ะพะฒะฐั˜ C ัะธะผะฑะพะป\n"
+" t: ะŸั€ะพะฝะฐั’ะธ ะพะฒะฐั˜ ั‚ะตะบัั‚ ัั‚ั€ะธะฝะณ\n"
+
+#, c-format
+msgid "E625: cannot open cscope database: %s"
+msgstr "E625: cscope database: %s ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ"
+
+msgid "E626: cannot get cscope database information"
+msgstr "E626: ะ˜ะฝั„ะพั€ะฐะผั†ะธั˜ะต ะพ cscope ะฑะฐะทะธ ะฟะพะดะฐั‚ะฐะบะฐ ะฝะต ะผะพะณัƒ ะดะฐ ัะต ะดะพะฑะธั˜ัƒ"
+
+msgid "E568: duplicate cscope database not added"
+msgstr "E568: ะ”ัƒะฟะปะธะบะฐั‚ cscope ะฑะฐะทะฐ ะฟะพะดะฐั‚ะฐะบะฐ ะฝะธั˜ะต ะดะพะดะฐั‚ะฐ"
+
+#, c-format
+msgid "E261: cscope connection %s not found"
+msgstr "E261: cscope ะฒะตะทะฐ %s ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝะฐ"
+
+#, c-format
+msgid "cscope connection %s closed"
+msgstr "cscope ะฒะตะทะฐ %s ั˜ะต ะทะฐั‚ะฒะพั€ะตะฝะฐ"
+
+msgid "E570: fatal error in cs_manage_matches"
+msgstr "E570: ั„ะฐั‚ะฐะปะฝะฐ ะณั€ะตัˆะบะฐ ัƒ cs_manage_matches"
+
+#, c-format
+msgid "Cscope tag: %s"
+msgstr "Cscope ะพะทะฝะฐะบะฐ: %s"
+
+msgid ""
+"\n"
+" # line"
+msgstr ""
+"\n"
+" # ะปะธะฝะธั˜ะฐ"
+
+msgid "filename / context / line\n"
+msgstr "ะดะฐั‚ะพั‚ะตะบะฐ / ะบะพะฝั‚ะตะบัั‚ / ะปะธะฝะธั˜ะฐ\n"
+
+#, c-format
+msgid "E609: Cscope error: %s"
+msgstr "E609: Cscope ะณั€ะตัˆะบะฐ: %s"
+
+msgid "All cscope databases reset"
+msgstr "ะกะฒะต cscope ะฑะฐะทะต ะฟะพะดะฐั‚ะฐะบะฐ ั€ะตัะตั‚ะพะฒะฐะฝะต"
+
+msgid "no cscope connections\n"
+msgstr "ะฝะตะผะฐ cscope ะฒะตะทะฐ\n"
+
+msgid " # pid database name prepend path\n"
+msgstr " # pid ะธะผะต ะฑะฐะทะต ะฟะพะดะฐั‚ะฐะบะฐ ะดะพะดะฐั˜ ะฟัƒั‚ะฐัšัƒ ะธัะฟั€ะตะด\n"
+
+msgid "Lua library cannot be loaded."
+msgstr "Lua ะฑะธะฑะปะธะพั‚ะตะบะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ัƒั‡ะธั‚ะฐ"
+
+msgid "cannot save undo information"
+msgstr "ะธะฝั„ะพั€ะฐะผั†ะธั˜ะต ะทะฐ ะพะฟะพะทะธะฒ ะฝะต ะผะพะณัƒ ะดะฐ ัะต ัะฐั‡ัƒะฒะฐั˜ัƒ"
+
+msgid ""
+"E815: Sorry, this command is disabled, the MzScheme libraries could not be "
+"loaded."
+msgstr ""
+"E815: ะ–ะฐะพ ะฝะฐะผ ั˜ะต, ะพะฒะฐ ะบะพะผะฐะฝะดะฐ ั˜ะต ะพะฝะตะผะพะณัƒั›ะตะฝะฐ, MzScheme ะฑะธะฑะปะธะพั‚ะตะบะต ะฝะธััƒ ะผะพะณะปะต "
+"ะดะฐ ัะต ัƒั‡ะธั‚ะฐั˜ัƒ."
+
+msgid ""
+"E895: Sorry, this command is disabled, the MzScheme's racket/base module "
+"could not be loaded."
+msgstr ""
+"E895: ะ–ะฐะพ ะฝะฐะผ ั˜ะต, ะพะฒะฐ ะบะพะผะฐะฝะดะฐ ั˜ะต ะพะฝะตะผะพะณัƒั›ะตะฝะฐ, MzScheme-ะพะฒ racket/base ะผะพะดัƒะป "
+"ะฝะธั˜ะต ะผะพะณะฐะพ ะดะฐ ัะต ัƒั‡ะธั‚ะฐ."
+
+msgid "invalid expression"
+msgstr "ะฝะตะธัะฟั€ะฐะฒะฐะฝ ะธะทั€ะฐะท"
+
+msgid "expressions disabled at compile time"
+msgstr "ะธะทั€ะฐะทะธ ััƒ ะพะฝะตะผะพะณัƒั›ะตะฝะธ ัƒ ะฒั€ะตะผะต ะบะพะผะฟะธะปะฐั†ะธั˜ะต"
+
+msgid "hidden option"
+msgstr "ัะบั€ะธะฒะตะฝะฐ ะพะฟั†ะธั˜ะฐ"
+
+msgid "unknown option"
+msgstr "ะฝะตะฟะพะทะฝะฐั‚ะฐ ะพะฟั†ะธั˜ะฐ"
+
+msgid "window index is out of range"
+msgstr "ะธะฝะดะตะบั ะฟั€ะพะทะพั€ะฐ ั˜ะต ะฒะฐะฝ ะพะฟัะตะณะฐ"
+
+msgid "couldn't open buffer"
+msgstr "ะฑะฐั„ะตั€ ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ"
+
+msgid "cannot delete line"
+msgstr "ะปะธะฝะธั˜ะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ะพะฑั€ะธัˆะต"
+
+msgid "cannot replace line"
+msgstr "ะปะธะฝะธั˜ะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ะทะฐะผะตะฝะธ"
+
+msgid "cannot insert line"
+msgstr "ะปะธะฝะธั˜ะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ัƒะผะตั‚ะฝะต"
+
+msgid "string cannot contain newlines"
+msgstr "ัั‚ั€ะธะฝะณ ะฝะต ะผะพะถะต ะดะฐ ัะฐะดั€ะถะธ ะฝะพะฒะต ั€ะตะดะพะฒะต"
+
+msgid "error converting Scheme values to Vim"
+msgstr "ะณั€ะตัˆะบะฐ ะฟั€ะธ ะบะพะฝะฒะตั€ะทะธั˜ะธ Scheme ะฒั€ะตะดะฝะพัั‚ะธ ัƒ Vim"
+
+msgid "Vim error: ~a"
+msgstr "Vim ะณั€ะตัˆะบะฐ: ~a"
+
+msgid "Vim error"
+msgstr "Vim ะณั€ะตัˆะบะฐ"
+
+msgid "buffer is invalid"
+msgstr "ะฑะฐั„ะตั€ ั˜ะต ะฝะตะฒะฐะถะตั›ะธ"
+
+msgid "window is invalid"
+msgstr "ะฟั€ะพะทะพั€ ั˜ะต ะฝะตะฒะฐะถะตั›ะธ"
+
+msgid "linenr out of range"
+msgstr "linenr ั˜ะต ะฒะฐะฝ ะพะฟัะตะณะฐ"
+
+msgid "not allowed in the Vim sandbox"
+msgstr "ะฝะธั˜ะต ะดะพะทะฒะพั™ะตะฝะพ ัƒ Vim sandbox-ัƒ"
+
+#, c-format
+msgid "E370: Could not load library %s"
+msgstr "E370: ะ‘ะธะฑะปะธะพั‚ะตะบะฐ %s ะฝะธั˜ะต ะผะพะณะปะฐ ะดะฐ ัะต ัƒั‡ะธั‚ะฐ"
+
+msgid "Sorry, this command is disabled: the Perl library could not be loaded."
+msgstr ""
+"ะ–ะฐะพ ะฝะฐะผ ั˜ะต, ะพะฒะฐ ะบะพะผะฐะฝะดะฐ ั˜ะต ะพะฝะตะผะพะณัƒั›ะตะฝะฐ: Perl ะฑะธะฑะปะธะพั‚ะตะบะฐ ะฝะธั˜ะต ะผะพะณะปะฐ ะดะฐ "
+"ัะต ัƒั‡ะธั‚ะฐ."
+
+msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
+msgstr "E299: Perl ะพะดั€ะตั’ะธะฒะฐัšะต ะฒั€ะตะดะฝะพัั‚ะธ ัƒ sandbox-ัƒ ั˜ะต ะทะฐะฑั€ะฐัšะตะฝะพ ะฑะตะท Safe ะผะพะดัƒะปะฐ"
+
+msgid "E836: This Vim cannot execute :python after using :py3"
+msgstr "E836: ะžะฒะฐั˜ Vim ะฝะต ะผะพะถะต ะดะฐ ะธะทะฒั€ัˆะธ :python ะฝะฐะบะพะฝ ะบะพั€ะธัˆั›ะตัšะฐ :py3"
+
+msgid ""
+"E263: Sorry, this command is disabled, the Python library could not be "
+"loaded."
+msgstr ""
+"E263: ะ–ะฐะพ ะฝะฐะผ ั˜ะต, ะพะฒะฐ ะบะพะผะฐะฝะดะฐ ั˜ะต ะพะฝะตะผะพะณัƒั›ะตะฝะฐ, Python ะฑะธะฑะปะธะพั‚ะตะบะฐ ะฝะธั˜ะต ะผะพะณะปะฐ "
+"ะดะฐ ัะต ัƒั‡ะธั‚ะฐ."
+
+msgid ""
+"E887: Sorry, this command is disabled, the Python's site module could not be "
+"loaded."
+msgstr ""
+"E887: ะ–ะฐะพ ะฝะฐะผ ั˜ะต, ะพะฒะฐ ะบะพะผะฐะฝะดะฐ ั˜ะต ะพะฝะตะผะพะณัƒั›ะตะฝะฐ, Python-ะพะฒ site ะผะพะดัƒะป ะฝะธั˜ะต "
+"ะผะพะณะฐะพ ะดะฐ ัะต ัƒั‡ะธั‚ะฐ."
+
+msgid "E659: Cannot invoke Python recursively"
+msgstr "E659: Python ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟะพะทะธะฒะฐ ั€ะตะบัƒั€ะทะธะฒะฝะพ"
+
+msgid "E837: This Vim cannot execute :py3 after using :python"
+msgstr "E837: ะžะฒะฐั˜ Vim ะฝะต ะผะพะถะต ะดะฐ ะธะทะฒั€ัˆะธ :py3 ะฝะฐะบะพะฝ ะบะพั€ะธัˆั›ะตัšะฐ :python"
+
+msgid "E265: $_ must be an instance of String"
+msgstr "E265: $_ ะผะพั€ะฐ ะดะฐ ะฑัƒะดะต ะธะฝัั‚ะฐะฝั†ะฐ String-ะฐ"
+
+msgid ""
+"E266: Sorry, this command is disabled, the Ruby library could not be loaded."
+msgstr ""
+"E266: ะ–ะฐะพ ะฝะฐะผ ั˜ะต, ะพะฒะฐ ะบะพะผะฐะฝะดะฐ ั˜ะต ะพะฝะตะผะพะณัƒั›ะตะฝะฐ, Ruby ะฑะธะฑะปะธะพั‚ะตะบะฐ ะฝะธั˜ะต ะผะพะณะปะฐ ะดะฐ "
+"ัะต ัƒั‡ะธั‚ะฐ."
+
+msgid "E267: unexpected return"
+msgstr "E267: ะฝะตะพั‡ะตะบะธะฒะฐะฝ return"
+
+msgid "E268: unexpected next"
+msgstr "E268: ะฝะตะพั‡ะตะบะธะฒะฐะฝะพ next"
+
+msgid "E269: unexpected break"
+msgstr "E269: ะฝะตะพั‡ะตะบะธะฒะฐะฝะพ break"
+
+msgid "E270: unexpected redo"
+msgstr "E270: ะฝะตะพั‡ะตะบะธะฒะฐะฝะพ redo"
+
+msgid "E271: retry outside of rescue clause"
+msgstr "E271: retry ะฒะฐะฝ rescue ะบะปะฐัƒะทัƒะปะต"
+
+msgid "E272: unhandled exception"
+msgstr "E272: ะฝะตะพะฑั€ะฐั’ะตะฝะธ ะธะทัƒะทะตั‚ะฐะบ"
+
+#, c-format
+msgid "E273: unknown longjmp status %d"
+msgstr "E273: ะฝะตะฟะพะทะฝะฐั‚ longjmp ัั‚ะฐั‚ัƒั %d"
+
+msgid "invalid buffer number"
+msgstr "ะฝะตะธัะฟั€ะฐะฒะฐะฝ ะฑั€ะพั˜ ะฑะฐั„ะตั€ะฐ"
+
+msgid "not implemented yet"
+msgstr "ั˜ะพัˆ ะฝะธั˜ะต ะธะผะฟะปะตะผะตะฝั‚ะธั€ะฐะฝะพ"
+
+msgid "cannot set line(s)"
+msgstr "ะปะธะฝะธั˜ะฐ(ะต) ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟะพัั‚ะฐะฒะธ"
+
+msgid "invalid mark name"
+msgstr "ะฝะตะธัะฟั€ะฐะฒะฝะพ ะธะผะต ะผะฐั€ะบะตั€ะฐ"
+
+msgid "mark not set"
+msgstr "ะผะฐั€ะบะตั€ ะฝะธั˜ะต ะฟะพัั‚ะฐะฒั™ะตะฝ"
+
+#, c-format
+msgid "row %d column %d"
+msgstr "ั€ะตะด %d ะบะพะปะพะฝะฐ %d"
+
+msgid "cannot insert/append line"
+msgstr "ะปะธะฝะธั˜ะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ัƒะผะตั‚ะฝะต/ะดะพะดะฐ ะฝะฐ ะบั€ะฐั˜"
+
+msgid "line number out of range"
+msgstr "ะฑั€ะพั˜ ะปะธะฝะธั˜ะต ั˜ะต ะฒะฐะฝ ะพะฟัะตะณะฐ"
+
+msgid "unknown flag: "
+msgstr "ะฝะตะฟะพะทะฝะฐั‚ ะธะฝะดะธะบะฐั‚ะพั€"
+
+msgid "unknown vimOption"
+msgstr "ะฝะตะฟะพะทะฝะฐั‚ะฐ vimะžะฟั†ะธั˜ะฐ"
+
+msgid "keyboard interrupt"
+msgstr "ะฟั€ะตะบะธะด ั‚ะฐัั‚ะฐั‚ัƒั€ะต"
+
+msgid "vim error"
+msgstr "vim ะณั€ะตัˆะบะฐ"
+
+msgid "cannot create buffer/window command: object is being deleted"
+msgstr "ะฑะฐั„ะตั€/ะฟั€ะพะทะพั€ ะบะพะผะฐะฝะดะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ะบั€ะตะธั€ะฐ: ะพะฑั˜ะตะบะฐั‚ ัะต ะฑั€ะธัˆะต"
+
+msgid ""
+"cannot register callback command: buffer/window is already being deleted"
+msgstr ""
+"ะบะพะผะฐะฝะดะฐ ะฟะพะฒั€ะฐั‚ะฝะพะณ ะฟะพะทะธะฒะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ั€ะตะณะธัั‚ั€ัƒั˜ะต: ะฑะฐั„ะตั€/ะฟั€ะพะทะพั€ ั˜ะต ะฒะตั› "
+"ะพะฑั€ะธัะฐะฝ"
+
+msgid ""
+"E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-dev@vim."
+"org"
+msgstr ""
+"E280: TCL ะคะะขะะ›ะะ ะ“ะ ะ•ะจะšะ: reflist ั˜ะต ะพัˆั‚ะตั›ะตะฝะฐ!? ะœะพะปะธะผะพ ะฟั€ะธั˜ะฐะฒะธั‚ะต ะพะฒะพ ะฝะฐ "
+"vim-dev@vim.org"
+
+msgid "cannot register callback command: buffer/window reference not found"
+msgstr ""
+"ะบะพะผะฐะฝะดะฐ ะฟะพะฒั€ะฐั‚ะฝะพะณ ะฟะพะทะธะฒะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ั€ะตะณะธัั‚ั€ัƒั˜ะต: ั€ะตั„ะตั€ะตะฝั†ะฐ ะฑะฐั„ะตั€ะฐ/ะฟั€ะพะทะพั€ะฐ "
+"ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝะฐ"
+
+msgid ""
+"E571: Sorry, this command is disabled: the Tcl library could not be loaded."
+msgstr ""
+"E571: ะ–ะฐะพ ะฝะฐะผ ั˜ะต, ะพะฒะฐ ะบะพะผะฐะฝะดะฐ ั˜ะต ะพะฝะตะผะพะณัƒั›ะตะฝะฐ: Tcl ะฑะธะฑะปะธะพั‚ะตะบะฐ ะฝะธั˜ะต ะผะพะณะปะฐ ะดะฐ "
+"ัะต ัƒั‡ะธั‚ะฐ."
+
+#, c-format
+msgid "E572: exit code %d"
+msgstr "E572: ะธะทะปะฐะทะฝะธ ะบะพะด %d"
+
+msgid "cannot get line"
+msgstr "ะปะธะฝะธั˜ะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ะดะพะฑะธั˜ะต"
+
+msgid "Unable to register a command server name"
+msgstr "ะ˜ะผะต ัะตั€ะฒะตั€ะฐ ะบะพะผะฐะฝะดะธ ะฝะธั˜ะต ะผะพะณะปะพ ะดะฐ ัะต ั€ะตะณะธัั‚ั€ัƒั˜ะต"
+
+msgid "E248: Failed to send command to the destination program"
+msgstr "E248: ะกะปะฐัšะต ะบะพะผะฐะฝะดะต ั†ะธั™ะฝะพะผ ะฟั€ะพะณั€ะฐะผัƒ ะฝะธั˜ะต ัƒัะฟะตะปะพ"
+
+#, c-format
+msgid "E573: Invalid server id used: %s"
+msgstr "E573: ะšะพั€ะธัั‚ะธ ัะต ะฝะตัะฟั€ะฐะฒะฐะฝ ะธะด ัะตั€ะฒะตั€ะฐ: %s"
+
+msgid "E251: VIM instance registry property is badly formed. Deleted!"
+msgstr "E251: registry ัะฒะพั˜ัั‚ะฒะพ VIM ะธะฝัั‚ะฐะฝั†ะต ั˜ะต ะปะพัˆะต ั„ะพั€ะผะธั€ะฐะฝะพ. ะžะฑั€ะธัะฐะฝะพ!"
+
+#, c-format
+msgid "E938: Duplicate key in JSON: \"%s\""
+msgstr "E938: ะ”ัƒะฟะปะธ ะบั™ัƒั‡ ัƒ JSON: \"%s\""
+
+#, c-format
+msgid "E696: Missing comma in List: %s"
+msgstr "E696: ะฃ ะ›ะธัั‚ะธ ะฝะตะดะพัั‚ะฐั˜ะต ะทะฐั€ะตะท: %s"
+
+#, c-format
+msgid "E697: Missing end of List ']': %s"
+msgstr "E697: ะะตะดะพัั‚ะฐั˜ะต ะบั€ะฐั˜ ะ›ะธัั‚ะต ']': %s"
+
+msgid "Unknown option argument"
+msgstr "ะะตะฟะพะทะฝะฐั‚ ะฐั€ะณัƒะผะตะฝั‚ ะพะฟั†ะธั˜ะต"
+
+msgid "Too many edit arguments"
+msgstr "ะกัƒะฒะธัˆะต ะฐั€ะณัƒะผะตะฝั‚ะฐ ัƒั€ะตั’ะธะฒะฐัšะฐ"
+
+msgid "Argument missing after"
+msgstr "ะั€ะณัƒะผะตะฝั‚ ะฝะตะดะพัั‚ะฐั˜ะต ะฝะฐะบะพะฝ"
+
+msgid "Garbage after option argument"
+msgstr "ะกะผะตั›ะต ะฝะฐะบะพะฝ ะฐั€ะณัƒะผะตะฝั‚ะฐ ะพะฟั†ะธั˜ะต"
+
+msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"
+msgstr "ะกัƒะฒะธัˆะต \"+command\", \"-c command\" ะธะปะธ \"--cmd command\" ะฐั€ะณัƒะผะตะฝะฐั‚ะฐ"
+
+msgid "Invalid argument for"
+msgstr "ะะตะธัะฟั€ะฐะฒะฐะฝ ะฐั€ะณัƒะผะตะฝั‚ for"
+
+#, c-format
+msgid "%d files to edit\n"
+msgstr "%d ะดะฐั‚ะพั‚ะตะบะฐ ะทะฐ ัƒั€ะตั’ะธะฒะฐัšะต\n"
+
+msgid "netbeans is not supported with this GUI\n"
+msgstr "NetBeans ะฝะธั˜ะต ะฟะพะดั€ะถะฐะฝ ัะฐ ะพะฒะธะผ GUI\n"
+
+msgid "'-nb' cannot be used: not enabled at compile time\n"
+msgstr "'-nb' ะฝะต ะผะพะถะต ะดะฐ ัะต ะบะพั€ะธัั‚ะธ: ะฝะธั˜ะต ะพะผะพะณัƒั›ะตะฝะพ ัƒ ะฒั€ะตะผะต ะบะพะผะฟะธะปะฐั†ะธั˜ะต\n"
+
+msgid "This Vim was not compiled with the diff feature."
+msgstr "ะžะฒะฐั˜ Vim ะฝะธั˜ะต ะบะพะผะฟะฐั˜ะปะธั€ะฐะฝ ัะฐ diff ะผะพะณัƒั›ะฝะพัˆั›ัƒ."
+
+msgid "Attempt to open script file again: \""
+msgstr "ะŸะพะบัƒัˆะฐั˜ ะดะฐ ัะต ะฟะพะฝะพะฒะพ ะพั‚ะฒะพั€ะธ ัะบั€ะธะฟั‚ ะดะฐั‚ะพั‚ะตะบะฐ: \""
+
+msgid "Cannot open for reading: \""
+msgstr "ะะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ ะทะฐ ั‡ะธั‚ะฐัšะต: \""
+
+msgid "Cannot open for script output: \""
+msgstr "ะะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ ะทะฐ ะธะทะปะฐะท ัะบั€ะธะฟั‚ะต: \""
+
+msgid "Vim: Error: Failure to start gvim from NetBeans\n"
+msgstr "Vim: ะ“ั€ะตัˆะบะฐ: ะŸะพะบั€ะตั‚ะฐัšะต gvim ะธะท NetBeans ะฝะธั˜ะต ัƒัะฟะตะปะพ\n"
+
+msgid "Vim: Error: This version of Vim does not run in a Cygwin terminal\n"
+msgstr ""
+"Vim: ะ“ั€ะตัˆะบะฐ: ะžะฒะฐ ะฒะตั€ะทะธั˜ะฐ Vim ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟะพะบั€ะตะฝะต ะธะท Cygwin ั‚ะตั€ะผะธะฝะฐะปะฐ\n"
+
+msgid "Vim: Warning: Output is not to a terminal\n"
+msgstr "Vim: ะฃะฟะพะทะพั€ะตัšะต: ะ˜ะทะปะฐะท ะฝะธั˜ะต ัƒ ั‚ะตั€ะผะธะฝะฐะป\n"
+
+msgid "Vim: Warning: Input is not from a terminal\n"
+msgstr "Vim: ะฃะฟะพะทะพั€ะตัšะต: ะฃะปะฐะท ะฝะธั˜ะต ะธะท ั‚ะตั€ะผะธะฝะฐะปะฐ\n"
+
+msgid "pre-vimrc command line"
+msgstr "pre-vimrc ะบะพะผะฐะฝะดะฝะฐ ะปะธะฝะธั˜ะฐ"
+
+#, c-format
+msgid "E282: Cannot read from \"%s\""
+msgstr "E282: ะะต ะผะพะถะต ะดะฐ ัะต ั‡ะธั‚ะฐ ะธะท \"%s\""
+
+msgid ""
+"\n"
+"More info with: \"vim -h\"\n"
+msgstr ""
+"\n"
+"ะ’ะธัˆะต ะธะฝั„ะพ ัะฐ: \"vim -h\"\n"
+
+msgid "[file ..] edit specified file(s)"
+msgstr "[ะดะฐั‚ะพั‚ะตะบะฐ ..] ัƒั€ะตั’ัƒั˜ ะฝะฐะฒะตะดะตะฝัƒ(ะต) ะดะฐั‚ะพั‚ะตะบัƒ(ะต)"
+
+msgid "- read text from stdin"
+msgstr "- ั‡ะธั‚ะฐั˜ ั‚ะตะบัั‚ ัะฐ stdin"
+
+msgid "-t tag edit file where tag is defined"
+msgstr "-t tag ัƒั€ะตั’ัƒั˜ ะดะฐั‚ะพั‚ะตะบัƒ ะณะดะต ั˜ะต ะดะตั„ะธะฝะธัะฐะฝะฐ ะพะทะฝะฐะบะฐ"
+
+msgid "-q [errorfile] edit file with first error"
+msgstr "-q [ะดะฐั‚.ะณั€ะตัˆะบะต] ัƒั€ะตั’ัƒั˜ ะดะฐั‚ะพั‚ะตะบัƒ ัะฐ ะฟั€ะฒะพะผ ะณั€ะตัˆะบะพะผ"
+
+msgid ""
+"\n"
+"\n"
+"Usage:"
+msgstr ""
+"\n"
+"\n"
+"ะฃะฟะพั‚ั€ะตะฑะฐ:"
+
+msgid " vim [arguments] "
+msgstr " vim [ะฐั€ะณัƒะผะตะฝั‚ะธ] "
+
+msgid ""
+"\n"
+" or:"
+msgstr ""
+"\n"
+" ะธะปะธ:"
+
+msgid ""
+"\n"
+"Where case is ignored prepend / to make flag upper case"
+msgstr ""
+"\n"
+"ะ“ะดะต ัะต ะผะฐะปะฐ/ะฒะตะปะธะบะฐ ัะปะพะฒะฐ ะธะณะฝะพั€ะธัˆัƒ ัั‚ะฐะฒะธั‚ะต ะธัะฟั€ะตะด / ะบะฐะบะพ ะฑะธ ะฟั€ะตั‚ะฒะพั€ะธะปะธ "
+"ะธะฝะดะธะบะฐั‚ะพั€ ัƒ ะฒะตะปะธะบะฐ ัะปะพะฒะฐ"
+
+msgid ""
+"\n"
+"\n"
+"Arguments:\n"
+msgstr ""
+"\n"
+"\n"
+"ะั€ะณัƒะผะตะฝั‚ะธ:\n"
+
+msgid "--\t\t\tOnly file names after this"
+msgstr "--\t\t\tะกะฐะผะพ ะธะผะตะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ ะฝะฐะบะพะฝ ะพะฒะพะณะฐ"
+
+msgid "--literal\t\tDon't expand wildcards"
+msgstr "--literal\t\tะะต ั€ะฐะทะฒะธั˜ะฐั˜ ัŸะพะบะตั€ะต"
+
+msgid "-register\t\tRegister this gvim for OLE"
+msgstr "-register\t\tะ ะตะณะธัั‚ั€ัƒั˜ ะพะฒะฐั˜ gvim ะทะฐ OLE"
+
+msgid "-unregister\t\tUnregister gvim for OLE"
+msgstr "-unregister\t\tะฃะบะปะพะฝะธ ั€ะตะณะธัั‚ั€ะฐั†ะธั˜ัƒ gvim ะทะฐ OLE"
+
+msgid "-g\t\t\tRun using GUI (like \"gvim\")"
+msgstr "-g\t\t\tะŸะพะบั€ะตะฝะธ ะบะพั€ะธัั‚ะตั›ะธ GUI (ะบะฐะพ \"gvim\")"
+
+msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
+msgstr "-f ะธะปะธ --nofork\tะฃ ะฟั€ะตะดัšะตะผ ะฟะปะฐะฝัƒ: ะฝะตะผะพั˜ ะดะฐ ั€ะฐั‡ะฒะฐัˆ ะบะฐะด ัะต ะฟะพะบั€ะตั›ะต GUI"
+
+msgid "-v\t\t\tVi mode (like \"vi\")"
+msgstr "-v\t\t\tVi ั€ะตะถะธะผ (ะบะฐะพ \"vi\")"
+
+msgid "-e\t\t\tEx mode (like \"ex\")"
+msgstr "-e\t\t\tEx ั€ะตะถะธะผ (ะบะฐะพ \"ex\")"
+
+msgid "-E\t\t\tImproved Ex mode"
+msgstr "-E\t\t\tะฃะฝะฐะฟั€ะตั’ะตะฝ Ex ั€ะตะถะธะผ"
+
+msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")"
+msgstr "-s\t\t\tะะตั‡ัƒั˜ะฝะธ (batch) ั€ะตะถะธะผ (ัะฐะผะพ ะทะฐ \"ex\")"
+
+msgid "-d\t\t\tDiff mode (like \"vimdiff\")"
+msgstr "-d\t\t\tDiff ั€ะตะถะธะผ (ะบะฐะพ \"vimdiff\")"
+
+msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
+msgstr "-y\t\t\tEasy ั€ะตะถะธะผ (ะบะฐะพ \"evim\", ะฑะตะทั€ะตะถะธะผะฝะธ)"
+
+msgid "-R\t\t\tReadonly mode (like \"view\")"
+msgstr "-R\t\t\tReadonly ั€ะตะถะธะผ (ะบะฐะพ \"view\")"
+
+msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
+msgstr "-Z\t\t\tRestricted ั€ะตะถะธะผ (ะบะฐะพ \"rvim\")"
+
+msgid "-m\t\t\tModifications (writing files) not allowed"
+msgstr "-m\t\t\tะ˜ะทะผะตะฝะต (ัƒะฟะธัะธะฒะฐัšะต ะดะฐั‚ะพั‚ะตะบะฐ) ะฝะธััƒ ะดะพะทะฒะพั™ะตะฝะต"
+
+msgid "-M\t\t\tModifications in text not allowed"
+msgstr "-M\t\t\tะ˜ะทะผะตะฝะต ัƒ ั‚ะตะบัั‚ัƒ ะฝะธััƒ ะดะพะทะฒะพั™ะตะฝะต"
+
+msgid "-b\t\t\tBinary mode"
+msgstr "-b\t\t\tะ‘ะธะฝะฐั€ะฝะธ ั€ะตะถะธะผ"
+
+msgid "-l\t\t\tLisp mode"
+msgstr "-l\t\t\tLisp ั€ะตะถะธะผ"
+
+msgid "-C\t\t\tCompatible with Vi: 'compatible'"
+msgstr "-C\t\t\tะšะพะผะฟะฐั‚ะธะฑะธะปะฐะฝ ัะฐ Vi: 'compatible'"
+
+msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'"
+msgstr "-N\t\t\tะะต ะฟะพั‚ะฟัƒะฝะพ Vi ะบะพะผะฟะฐั‚ะธะฑะธะปะฐะฝ: 'nocompatible'"
+
+msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]"
+msgstr "-V[N][fname]\t\tะ‘ัƒะดะธ ะพะฟัˆะธั€ะฐะฝ [ะฝะธะฒะพ N] [ะฑะตะปะตะถะธ ะฟะพั€ัƒะบะต ัƒ fname]"
+
+msgid "-D\t\t\tDebugging mode"
+msgstr "-D\t\t\tDebugging ั€ะตะถะธะผ"
+
+msgid "-n\t\t\tNo swap file, use memory only"
+msgstr "-n\t\t\tะ‘ะตะท swap ะดะฐั‚ะพั‚ะตะบะต, ะบะพั€ะธัั‚ะธ ัะฐะผะพ ะผะตะผะพั€ะธั˜ัƒ"
+
+msgid "-r\t\t\tList swap files and exit"
+msgstr "-r\t\t\tะ˜ะทะปะธัั‚ะฐั˜ swap ะดะฐั‚ะพั‚ะตะบะต ะธ ะธะทะฐั’ะธ"
+
+msgid "-r (with file name)\tRecover crashed session"
+msgstr "-r (ัะฐ ะธะผะตะฝะพะผ ะดะฐั‚ะพั‚ะตะบะต)\tะžะฑะฝะพะฒะธ ัั€ัƒัˆะตะฝัƒ ัะตัะธั˜ัƒ"
+
+msgid "-L\t\t\tSame as -r"
+msgstr "-L\t\t\tะ˜ัั‚ะพ ะบะฐะพ -r"
+
+msgid "-f\t\t\tDon't use newcli to open window"
+msgstr "-f\t\t\tะะตะผะพั˜ ะดะฐ ะบะพั€ะธัั‚ะธัˆ ะฝะพะฒ cli ะดะฐ ะพั‚ะฒะพั€ะธัˆ ะฟั€ะพะทะพั€"
+
+msgid "-dev <device>\t\tUse <device> for I/O"
+msgstr "-dev <ัƒั€ะตั’ะฐั˜>\t\tะšะพั€ะธัั‚ะธ <ัƒั€ะตั’ะฐั˜> ะทะฐ ะฃ/ะ˜"
+
+msgid "-A\t\t\tStart in Arabic mode"
+msgstr "-A\t\t\tะŸะพะบั€ะตะฝะธ ัƒ ะั€ะฐะฟัะบะพะผ ั€ะตะถะธะผัƒ"
+
+msgid "-H\t\t\tStart in Hebrew mode"
+msgstr "-H\t\t\tะŸะพะบั€ะตะฝะธ ัƒ ะฅะตะฑั€ะตั˜ัะบะพะผ ั€ะตะถะธะผัƒ"
+
+msgid "-F\t\t\tStart in Farsi mode"
+msgstr "-F\t\t\tะŸะพะบั€ะตะฝะธ ัƒ ะคะฐั€ัะธ ั€ะตะถะธะผัƒ"
+
+msgid "-T <terminal>\tSet terminal type to <terminal>"
+msgstr "-T <ั‚ะตั€ะผะธะฝะฐะป>\tะŸะพัั‚ะฐะฒะธ ั‚ะธะฟ ั‚ะตั€ะผะธะฝะฐะปะฐ ะฝะฐ <ั‚ะตั€ะผะธะฝะฐะป>"
+
+msgid "--not-a-term\t\tSkip warning for input/output not being a terminal"
+msgstr "--not-a-term\t\tะŸั€ะตัะบะพั‡ะธ ัƒะฟะพะทะพั€ะตัšะต ะดะฐ ัƒะปะฐะท/ะธะทะปะฐะท ะฝะธั˜ะต ั‚ะตั€ะผะธะฝะฐะป"
+
+msgid "--ttyfail\t\tExit if input or output is not a terminal"
+msgstr "--ttyfail\t\tะ˜ะทะฐั’ะธ ะฐะบะพ ัƒะปะฐะท ะธะปะธ ะธะทะปะฐะท ะฝะธััƒ ั‚ะตั€ะผะธะฝะฐะป"
+
+msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc"
+msgstr "-u <vimrc>\t\tะšะพั€ะธัั‚ะธ <vimrc> ัƒะผะตัั‚ะพ ะฑะธะปะพ ะบะพะณ .vimrc"
+
+msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
+msgstr "-U <gvimrc>\t\tะšะพั€ะธัั‚ะธ <gvimrc> ัƒะผะตัั‚ะพ ะฑะธะปะพ ะบะพะณ .gvimrc"
+
+msgid "--noplugin\t\tDon't load plugin scripts"
+msgstr "--noplugin\t\tะะต ัƒั‡ะธั‚ะฐะฒะฐั˜ ัะบั€ะธะฟั‚ะต ะดะพะดะฐั‚ะฐะบะฐ"
+
+msgid "-p[N]\t\tOpen N tab pages (default: one for each file)"
+msgstr "-p[N]\t\tะžั‚ะฒะพั€ะธ N ะบะฐั€ั‚ะธั†ะฐ (ะฟะพะดั€ะฐะทัƒะผะตะฒะฐะฝะพ: ะฟะพ ั˜ะตะดะฝัƒ ะทะฐ ัะฒะฐะบัƒ ะดะฐั‚ะพั‚ะตะบัƒ)"
+
+msgid "-o[N]\t\tOpen N windows (default: one for each file)"
+msgstr "-o[N]\t\tะžั‚ะฒะพั€ะธ N ะฟั€ะพะทะพั€ะฐ (ะฟะพะดั€ะฐะทัƒะผะตะฒะฐะฝะพ: ะฟะพ ั˜ะตะดะฐะฝ ะทะฐ ัะฒะฐะบัƒ ะดะฐั‚ะพั‚ะตะบัƒ)"
+
+msgid "-O[N]\t\tLike -o but split vertically"
+msgstr "-O[N]\t\tะšะฐะพ -o ะฐะปะธ ะฟะพะดะตะปะธ ะฟะพ ะฒะตั€ั‚ะธะบะฐะปะธ"
+
+msgid "+\t\t\tStart at end of file"
+msgstr "+\t\t\tะŸะพั‡ะฝะธ ะฝะฐ ะบั€ะฐั˜ัƒ ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "+<lnum>\t\tStart at line <lnum>"
+msgstr "+<ะฑั€ะพั˜ะป>\t\tะŸะพั‡ะฝะธ ะฝะฐ ะปะธะฝะธั˜ะธ <ะฑั€ะพั˜ะป>"
+
+msgid "--cmd <command>\tExecute <command> before loading any vimrc file"
+msgstr ""
+"--cmd <ะบะพะผะฐะฝะดะฐ>\tะ˜ะทะฒั€ัˆะธ <ะบะพะผะฐะฝะดะฐ> ะฟั€ะต ัƒั‡ะธั‚ะฐะฒะฐัšะฐ ะฑะธะปะพ ะบะพั˜ะต vimrc ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "-c <command>\t\tExecute <command> after loading the first file"
+msgstr "-c <ะบะพะผะฐะฝะดะฐ>\t\tะ˜ะทะฒั€ัˆะธ <ะบะพะผะฐะฝะดะฐ> ะฝะฐะบะพะฝ ัƒั‡ะธั‚ะฐะฒะฐัšะฐ ะฟั€ะฒะต ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "-S <session>\t\tSource file <session> after loading the first file"
+msgstr ""
+"-S <ัะตัะธั˜ะฐ>\t\tะ˜ะทะฒะพั€ะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ <ัะตัะธั˜ะฐ> ะฝะฐะบะพะฝ ัƒั‡ะธั‚ะฐะฒะฐัšะฐ ะฟั€ะฒะต "
+"ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>"
+msgstr ""
+"-s <ัะบั€ะธะฟั‚ัƒะปะฐะท>\tะงะธั‚ะฐั˜ ะบะพะผะฐะฝะดะต ะะพั€ะผะฐะปะฝะพะณ ั€ะตะถะธะผะฐ ะธะท ะดะฐั‚ะพั‚ะตะบะต <ัะบั€ะธะฟั‚ัƒะปะฐะท>"
+
+msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>"
+msgstr ""
+"-w <ัะบั€ะธะฟั‚ะธะทะปะฐะท>\tะะฐะดะพะฒะตะถะธ ัะฒะต ะพั‚ะบัƒั†ะฐะฝะต ะบะพะผะฐะฝะดะต ะฝะฐ ะบั€ะฐั˜ ะดะฐั‚ะพั‚ะตะบะต "
+"<ัะบั€ะธะฟั‚ะธะทะปะฐะท>"
+
+msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>"
+msgstr "-W <ัะบั€ะธะฟั‚ะธะทะปะฐะท>\tะฃะฟะธััƒั˜ ัะฒะต ะพั‚ะบัƒั†ะฐะฝะต ะบะพะผะฐะฝะดะต ัƒ ะดะฐั‚ะพั‚ะตะบัƒ <ัะบั€ะธะฟั‚ะธะทะปะฐะท>"
+
+msgid "-x\t\t\tEdit encrypted files"
+msgstr "-x\t\t\tะฃั€ะตั’ัƒั˜ ัˆะธั„ั€ะพะฒะฐะฝะต ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "-display <display>\tConnect vim to this particular X-server"
+msgstr "-display <ะดะธัะฟะปะตั˜>\tะŸะพะฒะตะถะธ vim ะฝะฐ ะพะฒะฐั˜ X-ัะตั€ะฒะตั€"
+
+msgid "-X\t\t\tDo not connect to X server"
+msgstr "-X\t\t\tะะต ะฟะพะฒะตะทัƒั˜ ัะต ะฝะฐ X ัะตั€ะฒะตั€"
+
+msgid "--remote <files>\tEdit <files> in a Vim server if possible"
+msgstr "--remote <ะดะฐั‚ะพั‚ะตะบะต>\tะฃั€ะตั’ัƒั˜ <ะดะฐั‚ะพั‚ะตะบะต> ัƒ Vim ัะตั€ะฒะตั€ัƒ ะฐะบะพ ั˜ะต ะผะพะณัƒั›ะต"
+
+msgid "--remote-silent <files> Same, don't complain if there is no server"
+msgstr "--remote-silent <ะดะฐั‚ะพั‚ะตะบะต> ะ˜ัั‚ะพ, ะฝะต ะฑัƒะฝะธ ัะต ะฐะบะพ ะฝะตะผะฐ ัะตั€ะฒะตั€ะฐ"
+
+msgid ""
+"--remote-wait <files> As --remote but wait for files to have been edited"
+msgstr ""
+"--remote-wait <ะดะฐั‚ะพั‚ะตะบะต> ะšะฐะพ --remote ะฐะปะธ ั‡ะตะบะฐั˜ ะดะฐ ะดะฐั‚ะพั‚ะตะบะต ะฑัƒะดัƒ ัƒั€ะตั’ะตะฝะต"
+
+msgid ""
+"--remote-wait-silent <files> Same, don't complain if there is no server"
+msgstr "--remote-wait-silent <ะดะฐั‚ะพั‚ะตะบะต> ะ˜ัั‚ะพ, ะฝะต ะฑัƒะฝะธ ัะต ะฐะบะพ ะฝะตะผะฐ ัะตั€ะฒะตั€ะฐ"
+
+msgid ""
+"--remote-tab[-wait][-silent] <files> As --remote but use tab page per file"
+msgstr ""
+"--remote-tab[-wait][-silent] <ะดะฐั‚ะพั‚ะตะบะต> ะšะฐะพ --remote ะฐะปะธ ะบะพั€ะธัั‚ะธ ั˜ะตะดะฝัƒ "
+"ะบะฐั€ั‚ะธั†ัƒ ะฟะพ ะดะฐั‚ะพั‚ะตั†ะธ"
+
+msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
+msgstr "--remote-send <ั‚ะฐัั‚ะตั€ะธ>\tะŸะพัˆะฐั™ะธ <ั‚ะฐัั‚ะตั€ะธ> Vim ัะตั€ะฒะตั€ัƒ ะธ ะธะทะฐั’ะธ"
+
+msgid "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
+msgstr ""
+"--remote-expr <ะธะทั€ะฐะท>\tะ˜ะทั€ะฐั‡ัƒะฝะฐั˜ <ะธะทั€ะฐะท> ัƒ Vim ัะตั€ะฒะตั€ัƒ ะธ ะพะดัˆั‚ะฐะผะฟะฐั˜ ั€ะตะทัƒะปั‚ะฐั‚"
+
+msgid "--serverlist\t\tList available Vim server names and exit"
+msgstr "--serverlist\t\tะ˜ะทะปะธัั‚ะฐั˜ ะธะผะตะฝะฐ ะดะพัั‚ัƒะฟะฝะธั… Vim ัะตั€ะฒะตั€ะฐ ะธ ะธะทะฐั’ะธ"
+
+msgid "--servername <name>\tSend to/become the Vim server <name>"
+msgstr "--servername <ะธะผะต>\tะŸะพัˆะฐั™ะธ/ะฟะพัั‚ะฐะฝะธ Vim ัะตั€ะฒะตั€ <ะธะผะต>"
+
+msgid "--startuptime <file>\tWrite startup timing messages to <file>"
+msgstr "--startuptime <ะดะฐั‚ะพั‚ะตะบะฐ>\tะฃะฟะธัˆะธ ะฟะพั€ัƒะบะต ะพ ะดัƒะถะธะฝะธ ะฟะพะบั€ะตั‚ะฐัšะฐ ัƒ <ะดะฐั‚ะพั‚ะตะบัƒ>"
+
+msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
+msgstr "-i <viminfo>\t\tะšะพั€ะธัั‚ะธ <viminfo> ัƒะผะตัั‚ะพ .viminfo"
+
+msgid "--clean\t\t'nocompatible', Vim defaults, no plugins, no viminfo"
+msgstr ""
+"--clean\t\t'nocompatible', Vim ะฟะพะดั€ะฐะทัƒะผะตะฒะฐะฝะต ะฒั€ะตะดะฝะพัั‚ะธ, ะฑะตะท ะดะพะดะฐั‚ะฐะบะฐ, ะฑะตะท "
+"viminfo"
+
+msgid "-h or --help\tPrint Help (this message) and exit"
+msgstr "-h or --help\tะ˜ัะฟะธัˆะธ ะŸะพะผะพั› (ะพะฒัƒ ะฟะพั€ัƒะบัƒ) ะธ ะธะทะฐั’ะธ"
+
+msgid "--version\t\tPrint version information and exit"
+msgstr "--version\t\tะ˜ัะฟะธัˆะธ ะธะฝั„ะพั€ะผะฐั†ะธั˜ะต ะพ ะฒะตั€ะทะธั˜ะธ ะธ ะธะทะฐั’ะธ"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (Motif version):\n"
+msgstr ""
+"\n"
+"ะั€ะณัƒะผะตะฝั‚ะธ ะบะพั˜ะต ะฟั€ะตะฟะพะทะฝะฐั˜ะต gvim (Motif ะฒะตั€ะทะธั˜ะฐ):\n"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (neXtaw version):\n"
+msgstr ""
+"\n"
+"ะั€ะณัƒะผะตะฝั‚ะธ ะบะพั˜ะต ะฟั€ะตะฟะพะทะฝะฐั˜ะต gvim (neXtaw ะฒะตั€ะทะธั˜ะฐ):\n"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (Athena version):\n"
+msgstr ""
+"\n"
+"ะั€ะณัƒะผะตะฝั‚ะธ ะบะพั˜ะต ะฟั€ะตะฟะพะทะฝะฐั˜ะต gvim (Athena ะฒะตั€ะทะธั˜ะฐ):\n"
+
+msgid "-display <display>\tRun vim on <display>"
+msgstr "-display <ะดะธัะฟะปะตั˜>\tะŸะพะบั€ะตะฝะธ vim ะฝะฐ <ะดะธัะฟะปะตั˜>"
+
+msgid "-iconic\t\tStart vim iconified"
+msgstr "-iconic\t\tะŸะพะบั€ะตะฝะธ vim ะบะฐะพ ะธะบะพะฝัƒ"
+
+msgid "-background <color>\tUse <color> for the background (also: -bg)"
+msgstr "-background <ะฑะพั˜ะฐ>\tะšะพั€ะธัั‚ะธ <ะฑะพั˜ะฐ> ะทะฐ ะฟะพะทะฐะดะธะฝัƒ (ั‚ะฐะบะพั’ะต: -bg)"
+
+msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
+msgstr "-foreground <ะฑะพั˜ะฐ>\tะšะพั€ะธัั‚ะธ <ะฑะพั˜ะฐ> ะทะฐ ะฝะพั€ะผะฐะปะฝะธ ั‚ะตะบัั‚ (ั‚ะฐะบะพั’ะต: -fg)"
+
+msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
+msgstr "-font <ั„ะพะฝั‚>\t\tะšะพั€ะธัั‚ะธ <ั„ะพะฝั‚> ะทะฐ ะฝะพั€ะผะฐะปะฝะธ ั‚ะตะบัั‚ (ั‚ะฐะบะพั’ะต: -fn)"
+
+msgid "-boldfont <font>\tUse <font> for bold text"
+msgstr "-boldfont <ั„ะพะฝั‚>\tะšะพั€ะธัั‚ะธ <ั„ะพะฝั‚> ะทะฐ ะฟะพะดะตะฑั™ะฐะฝะธ ั‚ะตะบัั‚"
+
+msgid "-italicfont <font>\tUse <font> for italic text"
+msgstr "-italicfont <ั„ะพะฝั‚>\tะšะพั€ะธัั‚ะธ <ั„ะพะฝั‚> ะทะฐ ะบัƒั€ะทะธะฒะฝะธ ั‚ะตะบัั‚"
+
+msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
+msgstr "-geometry <ะณะตะพะผ>\tะšะพั€ะธัั‚ะธ <ะณะตะพะผ> ะทะฐ ะฟะพั‡ะตั‚ะฝัƒ ะณะตะพะผะตั‚ั€ะธั˜ัƒ (ั‚ะฐะบะพั’ะต: -geom)"
+
+msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
+msgstr "-borderwidth <ัˆะธั€ะธะฝะฐ>\tะšะพั€ะธัั‚ะธ ะพะบะฒะธั€ ัˆะธั€ะธะฝะต <ัˆะธั€ะธะฝะฐ> (ั‚ะฐะบะพั’ะต: -bw)"
+
+msgid "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
+msgstr ""
+"-scrollbarwidth <ัˆะธั€ะธะฝะฐ> ะšะพั€ะธัั‚ะธ ะ›ะธะฝะธั˜ัƒ ะทะฐ ัะบั€ะพะปะพะฒะฐัšะต ัˆะธั€ะธะฝะต <ัˆะธั€ะธะฝะฐ> "
+"(ั‚ะฐะบะพั’ะต: -sw)"
+
+msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
+msgstr ""
+"-menuheight <ัˆะธั€ะธะฝะฐ>\tะšะพั€ะธัั‚ะธ ะปะธะฝะธั˜ัƒ ะผะตะฝะธั˜ะฐ ะฒะธัะธะฝะต <ะฒะธัะธะฝะฐ> (ั‚ะฐะบะพั’ะต: -mh)"
+
+msgid "-reverse\t\tUse reverse video (also: -rv)"
+msgstr "-reverse\t\tะšะพั€ะธัั‚ะธ ะพะฑั€ะฝัƒั‚ะธ ะฒะธะดะตะพ (ั‚ะฐะบะพั’ะต: -rv)"
+
+msgid "+reverse\t\tDon't use reverse video (also: +rv)"
+msgstr "+reverse\t\tะะตะผะพั˜ ะดะฐ ะบะพั€ะธัั‚ะธัˆ ะพะฑั€ะฝัƒั‚ะธ ะฒะธะดะตะพ (ั‚ะฐะบะพั’ะต: +rv)"
+
+msgid "-xrm <resource>\tSet the specified resource"
+msgstr "-xrm <ั€ะตััƒั€ั>\tะŸะพัั‚ะฐะฒะธ ะฝะฐะฒะตะดะตะฝะธ ั€ะตััƒั€ั"
+
+msgid ""
+"\n"
+"Arguments recognised by gvim (GTK+ version):\n"
+msgstr ""
+"\n"
+"ะั€ะณัƒะผะตะฝั‚ะธ ะบะพั˜ะต ะฟั€ะตะฟะพะทะฝะฐั˜ะต gvim (GTK+ ะฒะตั€ะทะธั˜ะฐ):\n"
+
+msgid "-display <display>\tRun vim on <display> (also: --display)"
+msgstr "-display <ะดะธัะฟะปะตั˜>\tะŸะพะบั€ะตะฝะธ vim ะฝะฐ <ะดะธัะฟะปะตั˜> (ั‚ะฐะบะพั’ะต: --display)"
+
+msgid "--role <role>\tSet a unique role to identify the main window"
+msgstr ""
+"--role <ัƒะปะพะณะฐ>\tะŸะพัั‚ะฐะฒะธ ั˜ะตะดะธะฝัั‚ะฒะตะฝัƒ ัƒะปะพะณัƒ ะดะฐ ะฑะธ ัะต ะธะดะตะฝั‚ะธั„ะธะบะพะฒะฐะพ ะณะปะฐะฒะฝะธ "
+"ะฟั€ะพะทะพั€"
+
+msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
+msgstr "--socketid <xid>\tะžั‚ะฒะพั€ะธ Vim ัƒะฝัƒั‚ะฐั€ ะดั€ัƒะณะพะณ GTK ะฒะธัŸะตั‚ะฐ"
+
+msgid "--echo-wid\t\tMake gvim echo the Window ID on stdout"
+msgstr "--echo-wid\t\tะะตะบะฐ gvim ะธัะฟะธัˆะต Window ID ะฝะฐ stdout"
+
+msgid "-P <parent title>\tOpen Vim inside parent application"
+msgstr "-P <ะฝะฐะทะธะฒ ั€ะพะดะธั‚ะตั™ะฐ>\tะžั‚ะฒะพั€ะธ Vim ัƒะฝัƒั‚ะฐั€ ั€ะพะดะธั‚ะตั™ัะบะต ะฐะฟะปะธะบะฐั†ะธั˜ะต"
+
+msgid "--windowid <HWND>\tOpen Vim inside another win32 widget"
+msgstr "--windowid <HWND>\tะžั‚ะฒะพั€ะธ Vim ัƒะฝัƒั‚ะฐั€ ะดั€ัƒะณะพะณ win32 ะฒะธัŸะตั‚ะฐ"
+
+msgid "No display"
+msgstr "ะะตะผะฐ ะฟั€ะธะบะฐะทะฐ"
+
+msgid ": Send failed.\n"
+msgstr ": ะกะปะฐัšะต ะฝะธั˜ะต ัƒัะฟะตะปะพ.\n"
+
+msgid ": Send failed. Trying to execute locally\n"
+msgstr ": ะกะปะฐัšะต ะฝะธั˜ะต ัƒัะฟะตะปะพ. ะŸะพะบัƒัˆะฐะฒะฐ ัะต ะปะพะบะฐะปะฝะพ ะธะทะฒั€ัˆะฐะฒะฐัšะต\n"
+
+#, c-format
+msgid "%d of %d edited"
+msgstr "%d ะพะด %d ัƒั€ะตั’ะตะฝะพ"
+
+msgid "No display: Send expression failed.\n"
+msgstr "ะะตะผะฐ ะฟั€ะธะบะฐะทะฐ: ะ˜ะทั€ะฐะท ัะปะฐัšะฐ ะฝะธั˜ะต ัƒัะฟะตะพ.\n"
+
+msgid ": Send expression failed.\n"
+msgstr ": ะ˜ะทั€ะฐะท ัะปะฐัšะฐ ะฝะธั˜ะต ัƒัะฟะตะพ.\n"
+
+msgid "No marks set"
+msgstr "ะะตะผะฐ ะฟะพัั‚ะฐะฒั™ะตะฝะธั… ะผะฐั€ะบะตั€ะฐ"
+
+#, c-format
+msgid "E283: No marks matching \"%s\""
+msgstr "E283: ะะตะผะฐ ะผะฐั€ะบะตั€ะฐ ะบะพั˜ะธ ัะต ะฟะพะดัƒะดะฐั€ะฐั˜ัƒ ัะฐ \"%s\""
+
+msgid ""
+"\n"
+"mark line col file/text"
+msgstr ""
+"\n"
+"ะปะธะฝะธั˜ะฐ ะผะฐั€ะบะตั€ะฐ ะบะพะป ะดะฐั‚ะพั‚ะตะบะฐ/ั‚ะตะบัั‚"
+
+msgid ""
+"\n"
+" jump line col file/text"
+msgstr ""
+"\n"
+" ะปะธะฝะธั˜ะฐ ัะบะพะบะฐ ะบะพะป ะดะฐั‚ะพั‚ะตะบะฐ/ั‚ะตะบัั‚"
+
+msgid ""
+"\n"
+"change line col text"
+msgstr ""
+"\n"
+"ะปะธะฝะธั˜ะฐ ะฟั€ะพะผะตะฝะต ะบะพะป ั‚ะตะบัั‚"
+
+msgid ""
+"\n"
+"# File marks:\n"
+msgstr ""
+"\n"
+"# ะœะฐั€ะบะตั€ะธ ะดะฐั‚ะพั‚ะตะบะต:\n"
+
+msgid ""
+"\n"
+"# Jumplist (newest first):\n"
+msgstr ""
+"\n"
+"# ะกะบะพะบ-ะปะธัั‚ะฐ (ะฟั€ะฒะพ ะฝะฐั˜ะฝะพะฒะธั˜ะธ):\n"
+
+msgid ""
+"\n"
+"# History of marks within files (newest to oldest):\n"
+msgstr ""
+"\n"
+"# ะ˜ัั‚ะพั€ะธั˜ะฐ ะผะฐั€ะบะตั€ะฐ ัƒะฝัƒั‚ะฐั€ ะดะฐั‚ะพั‚ะตะบะฐ (ะพะบ ะฝะฐั˜ะฝะพะฒะธั˜ะตะณ ะดะพ ะฝะฐั˜ัั‚ะฐั€ะธั˜ะตะณ):\n"
+
+msgid "Missing '>'"
+msgstr "ะะตะดะพัั‚ะฐั˜ะต '>'"
+
+msgid "E543: Not a valid codepage"
+msgstr "E543: ะะตะฒะฐะถะตั›ะฐ ะบะพะดะฝะฐ ัั‚ั€ะฐะฝะฐ"
+
+msgid "E284: Cannot set IC values"
+msgstr "E284: IC ะฒั€ะตะดะฝะพัั‚ะธ ะฝะต ะผะพะณัƒ ะดะฐ ัะต ะฟะพัั‚ะฐะฒะต"
+
+msgid "E285: Failed to create input context"
+msgstr "E285: ะšั€ะตะธั€ะฐัšะต ะบะพะฝั‚ะตะบัั‚ะฐ ัƒะฝะพัะฐ ะฝะธั˜ะต ัƒัะฟะตะปะพ"
+
+msgid "E286: Failed to open input method"
+msgstr "E286: ะžั‚ะฒะฐั€ะฐัšะต ะผะตั‚ะพะดะต ัƒะฝะพัะฐ ะฝะธั˜ะต ัƒัะฟะตะปะพ"
+
+msgid "E287: Warning: Could not set destroy callback to IM"
+msgstr ""
+"E287: ะฃะฟะพะทะพั€ะตัšะต: ะŸะพัั‚ะฐะฒั™ะฐัšะต ะฟะพะฒั€ะฐั‚ะฝะต ั„ัƒะฝะบั†ะธั˜ะต ะทะฐ ัƒะฝะธัˆั‚ะตัšะต IM ะฝะธั˜ะต ัƒัะฟะตะปะพ"
+
+msgid "E288: input method doesn't support any style"
+msgstr "E288: ะผะตั‚ะพะด ัƒะฝะพัะฐ ะฝะต ะฟะพะดั€ะถะฐะฒะฐ ะฝะธั˜ะตะดะฐะฝ ัั‚ะธะป"
+
+msgid "E289: input method doesn't support my preedit type"
+msgstr "E289: ะผะตั‚ะพะด ัƒะฝะพัะฐ ะฝะต ะฟะพะดั€ะถะฐะฒะฐ ะผะพั˜ preedit ั‚ะธะฟ"
+
+msgid "E293: block was not locked"
+msgstr "E293: ะฑะปะพะบ ะฝะธั˜ะต ะทะฐะบั™ัƒั‡ะฐะฝ"
+
+msgid "E294: Seek error in swap file read"
+msgstr "E294: ะ“ั€ะตัˆะบะฐ ะบะพะด ะฟะพัั‚ะฐะฒั™ะฐัšะฐ ะฟะพะบะฐะทะธะฒะฐั‡ะฐ ะทะฐ ั‡ะธั‚ะฐัšะต swap ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "E295: Read error in swap file"
+msgstr "E295: ะ“ั€ะตัˆะบะฐ ะฟั€ะธ ั‡ะธั‚ะฐัšัƒ swap ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "E296: Seek error in swap file write"
+msgstr "E296: ะ“ั€ะตัˆะบะฐ ะบะพะด ะฟะพัั‚ะฐะฒั™ะฐัšะฐ ะฟะพะบะฐะทะธะฒะฐั‡ะฐ ะทะฐ ัƒะฟะธั swap ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "E297: Write error in swap file"
+msgstr "E297: ะ“ั€ะตัˆะบะฐ ะฟั€ะธ ัƒะฟะธััƒ swap ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "E300: Swap file already exists (symlink attack?)"
+msgstr "E300: Swap ะดะฐั‚ะพั‚ะตะบะฐ ะฒะตั› ะฟะพัั‚ะพั˜ะธ (symlink ะฝะฐะฟะฐะด?)"
+
+msgid "E298: Didn't get block nr 0?"
+msgstr "E298: ะ‘ะปะพะบ ะฑั€ 0 ะฝะธั˜ะต ะดะพะฑะฐะฒั™ะตะฝ?"
+
+msgid "E298: Didn't get block nr 1?"
+msgstr "E298: ะ‘ะปะพะบ ะฑั€ 1 ะฝะธั˜ะต ะดะพะฑะฐะฒั™ะตะฝ?"
+
+msgid "E298: Didn't get block nr 2?"
+msgstr "E298: ะ‘ะปะพะบ ะฑั€ 2 ะฝะธั˜ะต ะดะพะฑะฐะฒั™ะตะฝ?"
+
+msgid "E843: Error while updating swap file crypt"
+msgstr "E843: ะ“ั€ะตัˆะบะฐ ะฟั€ะธะปะธะบะพะผ ะพัะฒะฐะถะฐะฒะฐัšะฐ ะบั€ะธะฟั‚ะพะฒะฐัšะฐ swap ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "E301: Oops, lost the swap file!!!"
+msgstr "E301: ะฃัƒะฟั, swap ะดะฐั‚ะพั‚ะตะบะฐ ั˜ะต ะธะทะณัƒะฑั™ะตะฝะฐ!!!"
+
+msgid "E302: Could not rename swap file"
+msgstr "E302: ะŸั€ะพะผะตะฝะฐ ะธะผะตะฝะฐ swap ะดะฐั‚ะพั‚ะตะบะต ะฝะธั˜ะต ัƒัะฟะตะปะฐ"
+
+#, c-format
+msgid "E303: Unable to open swap file for \"%s\", recovery impossible"
+msgstr ""
+"E303: ะžั‚ะฒะฐั€ะฐัšะต swap ะดะฐั‚ะพั‚ะตะบะต ะทะฐ \"%s\" ะฝะธั˜ะต ัƒัะฟะตะปะพ, ะพะฟะพั€ะฐะฒะฐะบ ั˜ะต ะฝะตะผะพะณัƒั›"
+
+msgid "E304: ml_upd_block0(): Didn't get block 0??"
+msgstr "E304: ml_upd_block0(): ะ‘ะปะพะบ ะฑั€ 0 ะฝะธั˜ะต ะดะพะฑะฐะฒั™ะตะฝ??"
+
+#, c-format
+msgid "E305: No swap file found for %s"
+msgstr "E305: ะ—ะฐ %s ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝะฐ swap ะดะฐั‚ะพั‚ะตะบะฐ"
+
+msgid "Enter number of swap file to use (0 to quit): "
+msgstr "ะฃะฝะตัะธั‚ะต ะฑั€ะพั˜ swap ะดะฐั‚ะพั‚ะตะบะต ะบะพั˜ะฐ ั›ะต ะดะฐ ัะต ะบะพั€ะธัั‚ะธ (0 ะทะฐ ะพั‚ะบะฐะทะธะฒะฐัšะต): "
+
+#, c-format
+msgid "E306: Cannot open %s"
+msgstr "E306: %s ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ"
+
+msgid "Unable to read block 0 from "
+msgstr "ะะธั˜ะต ะผะพะณัƒั›ะต ะปะธั‚ะฐัšะต ะฑะปะพะบะฐ 0 ะธะท "
+
+msgid ""
+"\n"
+"Maybe no changes were made or Vim did not update the swap file."
+msgstr ""
+"\n"
+"ะœะพะถะดะฐ ะฝะธััƒ ะฝะฐะฟั€ะฐะฒั™ะตะฝะต ะฝะธะบะฐะบะฒะต ะธะทะผะตะฝะต ะธะปะธ Vim ะฝะธั˜ะต ะพัะฒะตะถะธะพ swap ะดะฐั‚ะพั‚ะตะบัƒ."
+
+msgid " cannot be used with this version of Vim.\n"
+msgstr " ะฝะต ะผะพะถะต ะดะฐ ัะต ะบะพั€ะธัั‚ะธ ัะฐ ะพะฒะพะผ ะฒะตั€ะทะธั˜ะพะผ Vim-ะฐ.\n"
+
+msgid "Use Vim version 3.0.\n"
+msgstr "ะšะพั€ะธัั‚ะธั‚ะต Vim ะฒะตั€ะทะธั˜e 3.0.\n"
+
+#, c-format
+msgid "E307: %s does not look like a Vim swap file"
+msgstr "E307: %s ะฝะต ะธะทะณะปะตะดะฐ ะบะฐะพ Vim swap ะดะฐั‚ะพั‚ะตะบะฐ"
+
+msgid " cannot be used on this computer.\n"
+msgstr " ะฝะต ะผะพะถะต ะดะฐ ัะต ะบะพั€ะธัั‚ะธ ะฝะฐ ะพะฒะพะผ ะบะพะผะฟั˜ัƒั‚ะตั€ัƒ.\n"
+
+msgid "The file was created on "
+msgstr "ะžะฒะฐ ะดะฐั‚ะพั‚ะตะบะฐ ั˜ะต ะบั€ะตะธั€ะฐะฝะฐ ัะฐ "
+
+msgid ""
+",\n"
+"or the file has been damaged."
+msgstr ""
+",\n"
+"ะธะปะธ ั˜ะต ะดะฐั‚ะพั‚ะตะบะฐ ะพัˆั‚ะตั›ะตะฝะฐ."
+
+#, c-format
+msgid ""
+"E833: %s is encrypted and this version of Vim does not support encryption"
+msgstr "E833: %s ั˜ะต ัˆะธั„ั€ะพะฒะฐะฝะฐ ะธ ะพะฒะฐ ะฒะตั€ะทะธั˜ะฐ Vim-ะฐ ะฝะต ะฟะพะดั€ะถะฐะฒะฐ ัˆะธั„ั€ะพะฒะฐัšะต"
+
+msgid " has been damaged (page size is smaller than minimum value).\n"
+msgstr " ั˜ะต ะพัˆั‚ะตั›ะตะฝะฐ (ะฒะตะปะธั‡ะธะฝะฐ ัั‚ั€ะฐะฝะธั†ะต ั˜ะต ะผะฐั™ะฐ ะพะด ะผะธะฝะธะผะฐะปะฝะต ะฒั€ะตะดะฝะพัั‚ะธ).\n"
+
+#, c-format
+msgid "Using swap file \"%s\""
+msgstr "ะšะพั€ะธัั‚ะธ ัะต swap ะดะฐั‚ะพั‚ะตะบะฐ \"%s\""
+
+#, c-format
+msgid "Original file \"%s\""
+msgstr "ะžั€ะธะณะธะฝะฐะปะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ \"%s\""
+
+msgid "E308: Warning: Original file may have been changed"
+msgstr "E308: ะฃะฟะพะทะพั€ะตัšะต: ะœะพะถะดะฐ ั˜ะต ะฟั€ะพะผะตัšะตะฝะฐ ะพั€ะธะณะธะฝะฐะปะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ"
+
+#, c-format
+msgid "Swap file is encrypted: \"%s\""
+msgstr "Swap ะดะฐั‚ะพั‚ะตะบะฐ ั˜ะต ัˆะธั„ั€ะพะฒะฐะฝะฐ: \"%s\""
+
+msgid ""
+"\n"
+"If you entered a new crypt key but did not write the text file,"
+msgstr ""
+"\n"
+"ะะบะพ ัั‚ะต ัƒะฝะตะปะธ ะฝะพะฒ ะบั™ัƒั‡ ะทะฐ ัˆะธั„ั€ะธั€ะฐัšะต ะฐะปะธ ะฝะธัั‚ะต ัƒะฟะธัะฐะปะธ ั‚ะตะบัั‚ ะดะฐั‚ะพั‚ะตะบัƒ,"
+
+msgid ""
+"\n"
+"enter the new crypt key."
+msgstr ""
+"\n"
+"ัƒะฝะตัะธั‚ะต ะฝะพะฒะธ ะบั™ัƒั‡ ะทะฐ ัˆะธั„ั€ะธั€ะฐัšะต."
+
+msgid ""
+"\n"
+"If you wrote the text file after changing the crypt key press enter"
+msgstr ""
+"\n"
+"ะะบะพ ัั‚ะต ัƒะฟะธัะฐะปะธ ั‚ะตะบัั‚ ะดะฐั‚ะพั‚ะตะบัƒ ะฝะฐ ะดะธัะบ ะฝะฐะบะพะฝ ะฟั€ะพะผะตะฝะต ะบั™ัƒั‡ะฐ ะทะฐ ัˆะธั„ั€ะธั€ะฐัšะต "
+"ะฟั€ะธั‚ะธัะฝะธั‚ะต ะตะฝั‚ะตั€"
+
+msgid ""
+"\n"
+"to use the same key for text file and swap file"
+msgstr ""
+"\n"
+"ะดะฐ ะฑะธัั‚ะต ะบะพั€ะธัั‚ะธะปะธ ะธัั‚ะธ ะบั™ัƒั‡ ะทะฐ ั‚ะตะบัั‚ ะดะฐั‚ะพั‚ะตะบัƒ ะธ swap ะดะฐั‚ะพั‚ะตะบัƒ"
+
+#, c-format
+msgid "E309: Unable to read block 1 from %s"
+msgstr "E309: ะ‘ะปะพะบ 1 ะธะท %s ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพั‡ะธั‚ะฐ"
+
+msgid "???MANY LINES MISSING"
+msgstr "??ะะ•ะ”ะžะกะขะะˆะ• ะœะะžะ“ะž ะ›ะ˜ะะ˜ะˆะ"
+
+msgid "???LINE COUNT WRONG"
+msgstr "???ะ‘ะ ะžะˆ ะ›ะ˜ะะ˜ะˆะ ะˆะ• ะŸะžะ“ะ ะ•ะจะะ"
+
+msgid "???EMPTY BLOCK"
+msgstr "???ะŸะ ะะ—ะะ ะ‘ะ›ะžะš"
+
+msgid "???LINES MISSING"
+msgstr "???ะะ•ะ”ะžะกะขะะˆะฃ ะ›ะ˜ะะ˜ะˆะ•"
+
+#, c-format
+msgid "E310: Block 1 ID wrong (%s not a .swp file?)"
+msgstr "E310: ID ะฑะปะพะบะฐ 1 ั˜ะต ะฟะพะณั€ะตัˆะฐะฝ (%s ะฝะธั˜ะต .swp ะดะฐั‚ะพั‚ะตะบะฐ?)"
+
+msgid "???BLOCK MISSING"
+msgstr "???ะะ•ะ”ะžะกะขะะˆะ• ะ‘ะ›ะžะš"
+
+msgid "??? from here until ???END lines may be messed up"
+msgstr "??? ะพะดะฐะฒะดะต ะฟะฐ ะดะพ ???ะšะ ะะˆ ะปะธะฝะธั˜ะต ััƒ ะผะพะถะดะฐ ะทะฐะฑั€ั™ะฐะฝะต"
+
+msgid "??? from here until ???END lines may have been inserted/deleted"
+msgstr "??? ะพะดะฐะฒะดะต ะฟะฐ ะดะพ ???ะšะ ะะˆ ะปะธะฝะธั˜ะต ััƒ ะผะพะถะดะฐ ัƒะผะตั‚ะฐะฝะต/ะฑั€ะธัะฐะฝะต"
+
+msgid "???END"
+msgstr "???ะšะ ะะˆ"
+
+msgid "E311: Recovery Interrupted"
+msgstr "E311: ะžะฟะพั€ะฐะฒะฐะบ ั˜ะต ะฟั€ะตะบะธะฝัƒั‚"
+
+msgid ""
+"E312: Errors detected while recovering; look for lines starting with ???"
+msgstr ""
+"E312: ะžั‚ะบั€ะธะฒะตะฝะต ััƒ ะณั€ะตัˆะบะต ะฟั€ะธะปะธะบะพะผ ะพะฟะพั€ะฐะฒะบะฐ; ะฟะพั‚ั€ะฐะถะธั‚ะต ะปะธะฝะธั˜ะต ะบะพั˜ะต ะฟะพั‡ะธัšัƒ "
+"ัะฐ ???"
+
+msgid "See \":help E312\" for more information."
+msgstr "ะŸะพะณะปะตะดะฐั˜ั‚ะต \":help E312\" ะทะฐ ะฒะธัˆะต ะธะฝั„ะพั€ะผะฐั†ะธั˜ะฐ."
+
+msgid "Recovery completed. You should check if everything is OK."
+msgstr "ะžะฟะพั€ะฐะฒะฐะบ ั˜ะต ะทะฐะฒั€ัˆะตะฝ. ะขั€ะตะฑะฐะปะพ ะฑะธ ะดะฐ ะฟั€ะพะฒะตั€ะธั‚ะต ะดะฐ ะปะธ ั˜ะต ัะฒะต OK."
+
+msgid ""
+"\n"
+"(You might want to write out this file under another name\n"
+msgstr ""
+"\n"
+"(ะœะพะถะดะฐ ะฑะธัั‚ะต ั…ั‚ะตะปะธ ะดะฐ ะทะฐะฟะธัˆะตั‚ะต ะพะฒัƒ ะดะฐั‚ะพั‚ะตะบัƒ ะฟะพะด ะดั€ัƒะณะธะผ ะธะผะตะฝะพะผ\n"
+
+msgid "and run diff with the original file to check for changes)"
+msgstr "ะธ ะฟะพะบั€ะตะฝะตั‚ะต diff ัะฐ ะพั€ะธะณะธะฝะฐะปะฝะพะผ ะดะฐั‚ะพั‚ะตะบะพะผ ะดะฐ ะฟั€ะพะฒะตะปะธั‚ะต ะธะผะฐ ะปะธ ะธะทะผะตะฝะฐ)"
+
+msgid "Recovery completed. Buffer contents equals file contents."
+msgstr "ะžะฟะพั€ะฐะฒะฐะบ ั˜ะต ะทะฐะฒั€ัˆะตะฝ. ะกะฐะดั€ะถะฐั˜ ะฑะฐั„ะตั€ะฐ ั˜ะต ะธัั‚ะพะฒะตั‚ะฐะฝ ัะฐะดั€ะถะฐั˜ัƒ ะดะฐั‚ะพั‚ะตะบะต."
+
+msgid ""
+"\n"
+"You may want to delete the .swp file now.\n"
+"\n"
+msgstr ""
+"\n"
+"ะกะฐะดะฐ ะผะพะถะดะฐ ะถะตะปะธั‚ะต ะดะฐ ะพะฑั€ะธัˆะตั‚ะต .swp ะดะฐั‚ะพั‚ะตะบัƒ.\n"
+"\n"
+
+msgid "Using crypt key from swap file for the text file.\n"
+msgstr "ะ—ะฐ ั‚ะตะบัั‚ ะดะฐั‚ะพั‚ะตะบัƒ ัะต ะบะพั€ะธัั‚ะธ ะบั™ัƒั‡ ะทะฐ ัˆะธั„ั€ะธั€ะฐัšะต ะธะท swap ะดะฐั‚ะพั‚ะตะบะต.\n"
+
+msgid "Swap files found:"
+msgstr "ะŸั€ะพะฝะฐั’ะตะฝะต ััƒ swap ะดะฐั‚ะพั‚ะตะบะต:"
+
+msgid " In current directory:\n"
+msgstr " ะฃ ั‚ะตะบัƒั›ะตะผ ะดะธั€ะตะบั‚ะพั€ะธั˜ัƒะผัƒ:\n"
+
+msgid " Using specified name:\n"
+msgstr " ะšะพั€ะธัั‚ะตั›ะธ ะฝะฐะฒะตะดะตะฝะพ ะธะผะต:\n"
+
+msgid " In directory "
+msgstr " ะฃ ะดะธั€ะตะบั‚ะพั€ะธั˜ัƒะผัƒ "
+
+msgid " -- none --\n"
+msgstr " -- ะฝะธั˜ะตะดะฝะฐ --\n"
+
+msgid " owned by: "
+msgstr " ะบะพั˜ะต ะฟะพัะตะดัƒั˜ะต: "
+
+msgid " dated: "
+msgstr " ะดะฐั‚ะธั€ะฐะฝะต: "
+
+msgid " dated: "
+msgstr " ะดะฐั‚ะธั€ะฐะฝะต: "
+
+msgid " [from Vim version 3.0]"
+msgstr " [ะพะด Vim ะฒะตั€ะทะธั˜ะต 3.0]"
+
+msgid " [does not look like a Vim swap file]"
+msgstr " [ะฝะต ะธะทะณะปะตะดะฐ ะบะฐะพ Vim swap ะดะฐั‚ะพั‚ะตะบะฐ]"
+
+msgid " file name: "
+msgstr " ะธะผะต ะดะฐั‚ะพั‚ะตะบะต: "
+
+msgid ""
+"\n"
+" modified: "
+msgstr ""
+"\n"
+" ะธะทะผะตัšะตะฝะพ: "
+
+msgid "YES"
+msgstr "ะ”ะ"
+
+msgid "no"
+msgstr "ะฝะต"
+
+msgid ""
+"\n"
+" user name: "
+msgstr ""
+"\n"
+" ะบะพั€ะธัะฝะธั‡ะบะพ ะธะผะต: "
+
+msgid " host name: "
+msgstr " ะธะผะต ั…ะพัั‚ะฐ: "
+
+msgid ""
+"\n"
+" host name: "
+msgstr ""
+"\n"
+" ะธะผะต ั…ะพัั‚ะฐ: "
+
+msgid ""
+"\n"
+" process ID: "
+msgstr ""
+"\n"
+" ะ˜ะ” ะฟั€ะพั†ะตัะฐ: "
+
+msgid " (still running)"
+msgstr " (ั˜ะพัˆ ัะต ะธะทะฒั€ัˆะฐะฒะฐ)"
+
+msgid ""
+"\n"
+" [not usable with this version of Vim]"
+msgstr ""
+"\n"
+" [ะฝะธั˜ะต ัƒะฟะพั‚ั€ะตะฑั™ะธะฒะฐ ัะฐ ะพะฒะพะผ ะฒะตั€ะทะธั˜ะพะผ Vim-ะฐ]"
+
+msgid ""
+"\n"
+" [not usable on this computer]"
+msgstr ""
+"\n"
+" [ะฝะธั˜ะต ัƒะฟะพั‚ั€ะตะฑั™ะธะฒะฐ ะฝะฐ ะพะฒะพะผ ะบะพะผะฟั˜ัƒั‚ะตั€ัƒ]"
+
+msgid " [cannot be read]"
+msgstr " [ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพั‡ะธั‚ะฐ]"
+
+msgid " [cannot be opened]"
+msgstr " [ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ]"
+
+msgid "E313: Cannot preserve, there is no swap file"
+msgstr "E313: ะะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะตะทะตั€ะฒะธั€ะฐ, ะฝะตะผะฐ swap ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "File preserved"
+msgstr "ะ”ะฐั‚ะพั‚ะตะบะฐ ั˜ะต ะฟั€ะตะทะตั€ะฒะธั€ะฐะฝะฐ"
+
+msgid "E314: Preserve failed"
+msgstr "E314: ะŸั€ะตะทะตั€ะฒะฐั†ะธั˜ะฐ ะฝะธั˜ะต ัƒัะฟะตะปะฐ"
+
+#, c-format
+msgid "E315: ml_get: invalid lnum: %ld"
+msgstr "E315: ml_get: ะฝะตะธัะฟั€ะฐะฒะฐะฝ lnum: %ld"
+
+#, c-format
+msgid "E316: ml_get: cannot find line %ld"
+msgstr "E316: ml_get: ะปะธะฝะธั˜ะฐ %ld ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะฝะฐั’ะต"
+
+msgid "E317: pointer block id wrong 3"
+msgstr "E317: ะธะด ะฟะพะบะฐะทะธะฒะฐั‡ะฐ ะฑะปะพะบะฐ ั˜ะต ะฟะพะณั€ะตัˆะฐะฝ 3"
+
+msgid "stack_idx should be 0"
+msgstr "stack_idx ะฑะธ ั‚ั€ะตะฑะฐะปะพ ะดะฐ ั˜ะต 0"
+
+msgid "E318: Updated too many blocks?"
+msgstr "E318: ะžัะฒะตะถะตะฝะพ ะฟั€ะตะฒะธัˆะต ะฑะปะพะบะพะฒะฐ?"
+
+msgid "E317: pointer block id wrong 4"
+msgstr "E317: ะธะด ะฟะพะบะฐะทะธะฒะฐั‡ะฐ ะฑะปะพะบะฐ ั˜ะต ะฟะพะณั€ะตัˆะฐะฝ 4"
+
+msgid "deleted block 1?"
+msgstr "ะฑะปะพะบ 1 ะพะฑั€ะธัะฐะฝ?"
+
+#, c-format
+msgid "E320: Cannot find line %ld"
+msgstr "E320: ะ›ะธะฝะธั˜ะฐ %ld ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะฝะฐั’ะต"
+
+msgid "E317: pointer block id wrong"
+msgstr "E317: ะธะด ะฟะพะบะฐะทะธะฒะฐั‡ะฐ ะฑะปะพะบะฐ ั˜ะต ะฟะพะณั€ะตัˆะฐะฝ"
+
+msgid "pe_line_count is zero"
+msgstr "pe_line_count ั˜ะต ะฝัƒะปะฐ"
+
+#, c-format
+msgid "E322: line number out of range: %ld past the end"
+msgstr "E322: ะฑั€ะพั˜ ะปะธะฝะธั˜ะต ั˜ะต ะฒะฐะฝ ะพะฟัะตะณะฐ: %ld ะธะทะฐ ะบั€ะฐั˜ะฐ"
+
+#, c-format
+msgid "E323: line count wrong in block %ld"
+msgstr "E323: ะฑั€ะพั˜ ะปะธะฝะธั˜ะฐ ั˜ะต ะฟะพะณั€ะตัˆะฐะฝ ัƒ ะฑะปะพะบัƒ %ld"
+
+msgid "Stack size increases"
+msgstr "ะ’ะตะปะธั‡ะธะฝะฐ ัั‚ะตะบะฐ ัะต ะฟะพะฒะตั›ะฐะฒะฐ"
+
+msgid "E317: pointer block id wrong 2"
+msgstr "E317: ะธะด ะฟะพะบะฐะทะธะฒะฐั‡ะฐ ะฑะปะพะบะฐ ั˜ะต ะฟะพะณั€ะตัˆะฐะฝ 2"
+
+#, c-format
+msgid "E773: Symlink loop for \"%s\""
+msgstr "E773: Symlink ะฟะตั‚ั™ะฐ ะทะฐ \"%s\""
+
+msgid "E325: ATTENTION"
+msgstr "E325: ะŸะะ–ะŠะ"
+
+msgid ""
+"\n"
+"Found a swap file by the name \""
+msgstr ""
+"\n"
+"ะŸั€ะพะฝะฐั’ะตะฝะฐ ั˜ะต swap ะดะฐั‚ะพั‚ะตะบะฐ ะฟะพะด ะธะผะตะฝะพะผ \""
+
+msgid "While opening file \""
+msgstr "ะ”ะพะบ ัะต ะพั‚ะฒะฐั€ะฐะปะฐ ะดะฐั‚ะพั‚ะตะบa \""
+
+msgid " NEWER than swap file!\n"
+msgstr " ะะžะ’ะ˜ะˆะ ะพะด swap ะดะฐั‚ะพั‚ะตะบะต!\n"
+
+msgid ""
+"\n"
+"(1) Another program may be editing the same file. If this is the case,\n"
+" be careful not to end up with two different instances of the same\n"
+" file when making changes. Quit, or continue with caution.\n"
+msgstr ""
+"\n"
+"(1) ะœะพะถะดะฐ ะดั€ัƒะณะธ ะฟั€ะพะณั€ะฐะผ ัƒั€ะตั’ัƒั˜ะต ะธัั‚ัƒ ะดะฐั‚ะพั‚ะตะบัƒ. ะะบะพ ั˜ะต ะพะฒะพ ัะปัƒั‡ะฐั˜,\n"
+" ะบะฐะด ะฟั€ะฐะฒะธั‚ะต ะธะทะผะตะฝะต, ะฟะฐะทะธั‚ะต ะดะฐ ะฝะต ะทะฐะฒั€ัˆะธั‚ะต ัะฐ ะดะฒะต ั€ะฐะทะปะธั‡ะธั‚ะต\n"
+" ะธะฝัั‚ะฐะฝั†ะต ะธัั‚ะต ะดะฐั‚ะพั‚ะตะบะต. ะ˜ะทะฐั’ะธั‚ะต, ะธะปะธ ะพะฟั€ะตะทะฝะพ ะฝะฐัั‚ะฐะฒะธั‚ะต.\n"
+
+msgid "(2) An edit session for this file crashed.\n"
+msgstr "(2) ะกะตัะธั˜ะฐ ัƒั€ะตั’ะธะฒะฐัšะฐ ะพะฒะต ะดะฐั‚ะพั‚ะตะบะต ัะต ัั€ัƒัˆะธะปะฐ.\n"
+
+msgid " If this is the case, use \":recover\" or \"vim -r "
+msgstr " ะะบะพ ั˜ะต ะพะฒะพ ัะปัƒั‡ะฐั˜, ะบะพั€ะธัั‚ะธั‚ะต \":recover\" ะธะปะธ \"vim -r "
+
+msgid ""
+"\"\n"
+" to recover the changes (see \":help recovery\").\n"
+msgstr ""
+"\"\n"
+" ะดะฐ ะพะฟะพั€ะฐะฒะธั‚ะต ะธะทะผะตะฝะต (ะฟะพะณะปะตะดะฐั˜ั‚ะต \":help recovery\").\n"
+
+msgid " If you did this already, delete the swap file \""
+msgstr " ะะบะพ ัั‚ะต ะพะฒะพ ะฒะตั› ัƒั‡ะธะฝะธะปะธ, ะพะฑั€ะธัˆะธั‚ะต swap ะดะฐั‚ะพั‚ะตะบัƒ \""
+
+msgid ""
+"\"\n"
+" to avoid this message.\n"
+msgstr ""
+"\"\n"
+" ะบะฐะบะพ ะฑะธ ะธะทะฑะตะณะปะธ ะพะฒัƒ ะฟะพั€ัƒะบัƒ.\n"
+
+msgid "Swap file \""
+msgstr "Swap ะดะฐั‚ะพั‚ะตะบะฐ \""
+
+msgid "\" already exists!"
+msgstr "\" ะฒะตั› ะฟะพัั‚ะพั˜ะธ!"
+
+msgid "VIM - ATTENTION"
+msgstr "VIM - ะŸะะ–ะŠะ"
+
+msgid "Swap file already exists!"
+msgstr "Swap ะดะฐั‚ะพั‚ะตะบะฐ ะฒะตั› ะฟะพัั‚ะพั˜ะธ!"
+
+msgid ""
+"&Open Read-Only\n"
+"&Edit anyway\n"
+"&Recover\n"
+"&Quit\n"
+"&Abort"
+msgstr ""
+"ะžั‚ะฒะพั€ะธ &ะกะฐะผะพ ะทะฐ ั‡ะธั‚ะฐัšะต\n"
+"ะ˜ะฟะฐะบ &ะฃั€ะตั’ัƒั˜\n"
+"&ะžะฟะพั€ะฐะฒะธ\n"
+"&ะ˜ะทะฐั’ะธ\n"
+"&ะŸั€ะตะบะธะฝะธ"
+
+msgid ""
+"&Open Read-Only\n"
+"&Edit anyway\n"
+"&Recover\n"
+"&Delete it\n"
+"&Quit\n"
+"&Abort"
+msgstr ""
+"ะžั‚ะฒะพั€ะธ &ะกะฐะผะพ ะทะฐ ั‡ะธั‚ะฐัšะต\n"
+"ะ˜ะฟะฐะบ &ะฃั€ะตั’ัƒั˜\n"
+"&ะžะฟะพั€ะฐะฒะธ\n"
+"&ะ˜ะทะฐั’ะธ\n"
+"&ะŸั€ะตะบะธะฝะธ"
+
+msgid "E326: Too many swap files found"
+msgstr "E326: ะŸั€ะพะฝะฐั’ะตะฝะพ ั˜ะต ะฟั€ะตะฒะธัˆะต swap ะดะฐั‚ะพั‚ะตะบะฐ"
+
+msgid "E327: Part of menu-item path is not sub-menu"
+msgstr "E327: ะ”ะตะพ ะฟัƒั‚ะฐัšะต ัั‚ะฐะฒะบะต ะผะตะฝะธั˜ะฐ ะฝะธั˜ะต ะฟะพะดะผะตะฝะธ"
+
+msgid "E328: Menu only exists in another mode"
+msgstr "E328: ะœะตะฝะธ ะฟะพัั‚ะพั˜ะธ ัะฐะผะพ ัƒ ะดั€ัƒะณะพะผ ั€ะตะถะธะผัƒ"
+
+#, c-format
+msgid "E329: No menu \"%s\""
+msgstr "E329: ะะตะผะฐ ะผะตะฝะธั˜ะฐ \"%s\""
+
+msgid "E792: Empty menu name"
+msgstr "E792: ะŸั€ะฐะทะฝะพ ะธะผะต ะผะตะฝะธั˜ะฐ"
+
+msgid "E330: Menu path must not lead to a sub-menu"
+msgstr "E330: ะŸัƒั‚ะฐัšะฐ ะผะตะฝะธั˜ะฐ ะฝะต ัะผะต ะดะฐ ะฒะพะดะธ ัƒ ะฟะพะดะผะตะฝะธ"
+
+msgid "E331: Must not add menu items directly to menu bar"
+msgstr "E331: ะกั‚ะฐะฒะบะต ะผะตะฝะธั˜ะฐ ะฝะต ัะผะตั˜ัƒ ะดะฐ ัะต ะดะพะดะฐั˜ัƒ ะดะธั€ะตะบั‚ะฝะพ ัƒ ะปะธะฝะธั˜ัƒ ะผะตะฝะธั˜ะฐ"
+
+msgid "E332: Separator cannot be part of a menu path"
+msgstr "E332: ะกะตะฟะฐั€ะฐั‚ะพั€ ะฝะต ะผะพะถะต ะดะฐ ะฑัƒะดะต ะดะตะพ ะฟัƒั‚ะฐัšะต ะผะตะฝะธั˜ะฐ"
+
+msgid ""
+"\n"
+"--- Menus ---"
+msgstr ""
+"\n"
+"--- ะœะตะฝะธั˜ะธ ---"
+
+msgid "Tear off this menu"
+msgstr "ะžั‚ั†ะตะฟะธ ะพะฒะฐั˜ ะผะตะฝะธ"
+
+#, c-format
+msgid "E335: Menu not defined for %s mode"
+msgstr "E335: ะœะตะฝะธ ะฝะธั˜ะต ะดะตั„ะธะฝะธัะฐะฝ ะทะฐ %s ั€eะถะธะผ"
+
+msgid "E333: Menu path must lead to a menu item"
+msgstr "E333: ะŸัƒั‚ะฐัšะฐ ะผะตะฝะธั˜ะฐ ะผะพั€ะฐ ะดะฐ ะฒะพะดะธ ัƒ ัั‚ะฐะฒะบัƒ ะผะตะฝะธั˜ะฐ"
+
+#, c-format
+msgid "E334: Menu not found: %s"
+msgstr "E334: ะœะตะฝะธ ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝ: %s"
+
+msgid "E336: Menu path must lead to a sub-menu"
+msgstr "E336: ะŸัƒั‚ะฐัšะฐ ะผะตะฝะธั˜ะฐ ะผะพั€ะฐ ะดะฐ ะฒะพะดะธ ัƒ ะฟะพะดะผะตะฝะธ"
+
+msgid "E337: Menu not found - check menu names"
+msgstr "E337: ะœะตะฝะธ ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝ - ะฟั€ะพะฒะตั€ะธั‚ะต ะธะผะตะฝะฐ ะผะตะฝะธั˜ะฐ"
+
+#, c-format
+msgid "Error detected while processing %s:"
+msgstr "ะžั‚ะบั€ะธะฒะตะฝะฐ ั˜ะต ะณั€ะตัˆะบะฐ ั‚ะพะบะพะผ ะพะฑั€ะฐะดะต %s:"
+
+#, c-format
+msgid "line %4ld:"
+msgstr "ะปะธะฝะธั˜ะฐ %4ld:"
+
+#, c-format
+msgid "E354: Invalid register name: '%s'"
+msgstr "E354: ะะตะธัะฟั€ะฐะฒะฝะพ ะธะผะต ั€ะตะณะธัั‚ั€ะฐ: '%s'"
+
+msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
+msgstr "ะŸะพั€ัƒะบะต ะพะดั€ะถะฐะฒะฐ: ะ˜ะฒะฐะฝ ะŸะตัˆะธั› <ivan.pesic@gmail.com>"
+
+msgid "Interrupt: "
+msgstr "ะŸั€ะตะบะธะด: "
+
+msgid "Press ENTER or type command to continue"
+msgstr "ะ”ะฐ ะฑะธัั‚ะต ะฝะฐัั‚ะฐะฒะธะปะธ, ะฟั€ะธั‚ะธัะฝะธั‚ะต ะ•ะะขะ•ะ  ะธะปะธ ะพั‚ะบัƒั†ะฐั˜ั‚ะต ะบะพะผะฐะฝะดัƒ"
+
+#, c-format
+msgid "%s line %ld"
+msgstr "%s ะปะธะฝะธั˜ะฐ %ld"
+
+msgid "-- More --"
+msgstr "-- ะˆะพัˆ --"
+
+msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "
+msgstr " ะ ะะ—ะœะะšะะ˜ะฆะ/d/j: ะตะบั€ะฐะฝ/ัั‚ั€ะฐะฝะฐ/ะปะธะฝะธั˜ะฐ ะฝะฐะฝะธะถะต, b/u/k: ะฝะฐะฒะธัˆะต, q: ะธะทะปะฐะท "
+
+msgid "Question"
+msgstr "ะŸะธั‚ะฐัšะต"
+
+msgid ""
+"&Yes\n"
+"&No"
+msgstr ""
+"&ะ”ะฐ\n"
+"&ะะต"
+
+msgid ""
+"&Yes\n"
+"&No\n"
+"Save &All\n"
+"&Discard All\n"
+"&Cancel"
+msgstr ""
+"&ะ”ะฐ\n"
+"&ะะต\n"
+"ะกะฐั‡ัƒะฒะฐั˜ &ะกะฒะต\n"
+"ะพ&ะ”ะฑะฐั†ะธ ัะฒะต\n"
+"&ะžั‚ะบะฐะถะธ"
+
+msgid "Select Directory dialog"
+msgstr "ะ”ะธั˜ะฐะปะพะณ ะธะทะฑะพั€ะฐ ะดะธั€ะตะบั‚ะพั€ะธั˜ัƒะผะฐ"
+
+msgid "Save File dialog"
+msgstr "ะ”ะธั˜ะฐะปะพะณ ั‡ัƒะฒะฐัšะฐ ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "Open File dialog"
+msgstr "ะ”ะธั˜ะฐะปะพะณ ะพั‚ะฒะฐั€ะฐัšะฐ ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "E338: Sorry, no file browser in console mode"
+msgstr "E338: ะ–ะฐะพ ะฝะฐะผ ั˜ะต, ะฝะตะผะฐ ะฟั€ะตั‚ั€ะฐะถะธะฒะฐั‡ะฐ ะดะฐั‚ะพั‚ะตะบะฐ ัƒ ะบะพะฝะทะพะปะฝะพะผ ั€ะตะถะธะผัƒ"
+
+msgid "E766: Insufficient arguments for printf()"
+msgstr "E766: ะะตะดะพะฒะพั™ะฝะพ ะฐั€ะณัƒะผะตะฝะฐั‚ะฐ ะทะฐ printf()"
+
+msgid "E807: Expected Float argument for printf()"
+msgstr "E807: ะžั‡ะตะบัƒั˜ะต ัะต Float ะฐั€ะณัƒะผะตะฝั‚ ะทะฐ printf()"
+
+msgid "E767: Too many arguments to printf()"
+msgstr "E767: ะกัƒะฒะธัˆะต ะฐั€ะณัƒะผะตะฝะฐั‚ะฐ ะทะฐ printf()"
+
+msgid "W10: Warning: Changing a readonly file"
+msgstr "W10: ะฃะฟะพะทะพั€ะตัšะต: ะœะตัšะฐ ัะต ะดะฐั‚ะพั‚ะตะบะฐ ะบะพั˜ะฐ ะผะพะถะต ัะฐะผะพ ะดะฐ ัะต ั‡ะธั‚ะฐ"
+
+msgid "Type number and <Enter> or click with mouse (empty cancels): "
+msgstr "ะฃะฝะตัะธั‚ะต ะฑั€ะพั˜ ะธ <Enter> ะธะปะธ ะบะปะธะบะฝะธั‚ะต ะผะธัˆะตะผ (ะฝะธัˆั‚ะฐ ะทะฐ ะพั‚ะบะฐะท): "
+
+msgid "Type number and <Enter> (empty cancels): "
+msgstr "ะฃะฝะตัะธั‚ะต ะฑั€ะพั˜ ะธ <Enter> (ะฝะธัˆั‚ะฐ ะทะฐ ะพั‚ะบะฐะท): "
+
+msgid "1 more line"
+msgstr "1 ะปะธะฝะธั˜ะฐ ะฒะธัˆะต"
+
+msgid "1 line less"
+msgstr "1 ะปะธะฝะธั˜ะฐ ะผะฐัšะต"
+
+#, c-format
+msgid "%ld more lines"
+msgstr "%ld ะปะธะฝะธั˜ะฐ ะฒะธัˆะต"
+
+#, c-format
+msgid "%ld fewer lines"
+msgstr "%ld ะปะธะฝะธั˜ะฐ ะผะฐัšะต"
+
+msgid " (Interrupted)"
+msgstr " (ะŸั€ะตะบะธะฝัƒั‚ะพ)"
+
+msgid "Beep!"
+msgstr "ะ‘ะธะธะฟ!"
+
+msgid "ERROR: "
+msgstr "ะ“ะ ะ•ะจะšะ: "
+
+#, c-format
+msgid ""
+"\n"
+"[bytes] total alloc-freed %lu-%lu, in use %lu, peak use %lu\n"
+msgstr ""
+"\n"
+"[ะฑะฐั˜ั‚ะพะฒะฐ] ัƒะบัƒะฟะฝะพ ะฐะปะพั†-ะพัะปะพะฑ %lu-%lu, ัƒ ัƒะฟะพั‚ั€ %lu, ะฒั€ัˆะฝะฐ ัƒะฟะพั‚ั€ %lu\n"
+
+#, c-format
+msgid ""
+"[calls] total re/malloc()'s %lu, total free()'s %lu\n"
+"\n"
+msgstr ""
+"[ะฟะพะทะธะฒะฐ] ัƒะบัƒะฟะฝะพ re/malloc()-ะฐ %lu, ัƒะบัƒะฟะฝะพ free()-ะพะฒะฐ %lu\n"
+"\n"
+
+msgid "E340: Line is becoming too long"
+msgstr "E340: ะ›ะธะฝะธั˜ะฐ ะฟะพัั‚ะฐั˜ะต ะฟั€ะตะดัƒะณะฐั‡ะบะฐ"
+
+#, c-format
+msgid "E341: Internal error: lalloc(%ld, )"
+msgstr "E341: ะ˜ะฝั‚ะตั€ะฝะฐ ะณั€ะตัˆะบะฐ: lalloc(%ld, )"
+
+#, c-format
+msgid "E342: Out of memory! (allocating %lu bytes)"
+msgstr "E342: ะะตะผะฐ ะฒะธัˆะต ะผะตะผะพั€ะธั˜ะต! (ะบะพะด ะฐะปะพะบะฐั†ะธั˜ะต %lu ะฑะฐั˜ั‚ะพะฒะฐ)"
+
+#, c-format
+msgid "Calling shell to execute: \"%s\""
+msgstr "ะŸะพะทะธะฒะฐ ัะต ะบะพะผะฐะฝะดะฝะพ ะพะบั€ัƒะถะตัšะต ะดะฐ ะธะทะฒั€ัˆะธ: \"%s\""
+
+msgid "E545: Missing colon"
+msgstr "E545: ะะตะดะพัั‚ะฐั˜ะต ะดะฒะพั‚ะฐั‡ะบะฐ"
+
+msgid "E546: Illegal mode"
+msgstr "E546: ะะตะดะพะทะฒะพั™ะตะฝะธ ั€ะตะถะธะผ"
+
+msgid "E547: Illegal mouseshape"
+msgstr "E547: ะะตะดะพะทะฒะพั™ะตะฝะธ mouseshape"
+
+msgid "E548: digit expected"
+msgstr "E548: ะพั‡ะตะบัƒั˜ะต ัะต ั†ะธั„ั€ะฐ"
+
+msgid "E549: Illegal percentage"
+msgstr "E549: ะะตะดะพะทะฒะพั™ะตะฝะธ ะฟั€ะพั†ะตะฝะฐั‚"
+
+msgid "E854: path too long for completion"
+msgstr "E854: ะฟัƒั‚ะฐัšะฐ ั˜ะต ััƒะฒะธัˆะต ะดัƒะณะฐั‡ะบะฐ ะดะฐ ะฑะธ ัะต ะดะพะฒั€ัˆะธะปะฐ"
+
+#, c-format
+msgid ""
+"E343: Invalid path: '**[number]' must be at the end of the path or be "
+"followed by '%s'."
+msgstr ""
+"E343: ะะตะธัะฟั€ะฐะฒะฝะฐ ะฟัƒั‚ะฐัšะฐ: '**[ะฑั€ะพั˜]' ะผะพั€ะฐ ะฑะธั‚ะธ ะฝะฐ ะบั€ะฐั˜ัƒ ะฟัƒั‚ะฐัšะต ะธะปะธ ะดะฐ ะธะทะฐ "
+"ัšะตะณะฐ ัะปะตะดะธ '%s'."
+
+#, c-format
+msgid "E344: Can't find directory \"%s\" in cdpath"
+msgstr "E344: ะ”ะธั€ะตะบั‚ะพั€ะธั˜ัƒะผ \"%s\" ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะฝะฐั’ะต ัƒ cdpath"
+
+#, c-format
+msgid "E345: Can't find file \"%s\" in path"
+msgstr "E345: ะ”ะฐั‚ะพั‚ะตะบะฐ \"%s\" ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะฝะฐั’ะต ัƒ path"
+
+#, c-format
+msgid "E346: No more directory \"%s\" found in cdpath"
+msgstr "E346: ะ”ะธั€ะตะบั‚ะพั€ะธั˜ัƒะผ \"%s\" ะฒะธัˆะต ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะฝะฐั’ะต ัƒ cdpath"
+
+#, c-format
+msgid "E347: No more file \"%s\" found in path"
+msgstr "E347: ะ”ะฐั‚ะพั‚ะตะบะฐ \"%s\" ะฒะธัˆะต ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะฝะฐั’ะต ัƒ path"
+
+#, c-format
+msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
+msgstr "E668: ะŸะพะณั€ะตัˆะฐะฝ ั€ะตะถะธะผ ะฟั€ะธัั‚ัƒะฟะฐ ะทะฐ ะธะฝั„ะพ ะดะฐั‚ะพั‚ะตะบัƒ NetBeans ะฒะตะทะต: \"%s\""
+
+#, c-format
+msgid "E658: NetBeans connection lost for buffer %ld"
+msgstr "E658: NetBeans ะฒะตะทะฐ ั˜ะต ะธะทะณัƒะฑั™ะตะฝะฐ ะทะฐ ะฑะฐั„ะตั€ %ld"
+
+msgid "E838: netbeans is not supported with this GUI"
+msgstr "E838: netbeans ะฝะธั˜ะต ะฟะพะดั€ะถะฐะฝ ัะฐ ะพะฒะธะผ GUI"
+
+msgid "E511: netbeans already connected"
+msgstr "E511: netbeans ั˜ะต ะฒะตั› ะฟะพะฒะตะทะฐะฝ"
+
+#, c-format
+msgid "E505: %s is read-only (add ! to override)"
+msgstr "E505: %s ั˜ะต ัะฐะผะพ ะทะฐ ั‡ะธั‚ะฐัšะต (ะดะพะดะฐั˜ั‚ะต ! ะทะฐ ะฟั€ะตะผะพัˆั›ะฐะฒะฐัšะต)"
+
+msgid "E349: No identifier under cursor"
+msgstr "E349: ะŸะพะด ะบัƒั€ัะพั€ะพะผ ะฝะธั˜ะต ะธะดะตะฝั‚ะธั„ะธะบะฐั‚ะพั€"
+
+msgid "E774: 'operatorfunc' is empty"
+msgstr "E774: 'operatorfunc' ั˜ะต ะฟั€ะฐะทะฝะฐ"
+
+msgid "E775: Eval feature not available"
+msgstr "E775: Eval ะผะพะณัƒั›ะฝะพัั‚ ะฝะธั˜ะต ะดะพัั‚ัƒะฟะฝะฐ"
+
+msgid "Warning: terminal cannot highlight"
+msgstr "ะฃะฟะพะทะพั€ะตัšะต: ั‚ะตั€ะผะธะฝะฐะป ะฝะต ะผะพะถะต ะดะฐ ะธัั‚ะฐะบะฝะต ั‚ะตะบัั‚"
+
+msgid "E348: No string under cursor"
+msgstr "E348: ะŸะพะด ะบัƒั€ัะพั€ะพะผ ะฝะตะผะฐ ัั‚ั€ะธะฝะณะฐ"
+
+msgid "E352: Cannot erase folds with current 'foldmethod'"
+msgstr "E352: ะกะฐ ั‚ะตะบัƒั›ะธะผ 'foldmethod' ะฝะต ะผะพะณัƒ ะดะฐ ัะต ะพะฑั€ะธัˆัƒ ัะบะปะฐะฟะฐัšะฐ"
+
+msgid "E664: changelist is empty"
+msgstr "E664: ะปะธัั‚ะฐ ะฟั€ะพะผะตะฝะฐ ั˜ะต ะฟั€ะฐะทะฝะฐ"
+
+msgid "E662: At start of changelist"
+msgstr "E662: ะะฐ ะฟะพั‡ะตั‚ะบัƒ ะปะธัั‚ะต ะฟั€ะพะผะตะฝะฐ"
+
+msgid "E663: At end of changelist"
+msgstr "E663: ะะฐ ะบั€ะฐั˜ัƒ ะปะธัั‚ะต ะฟั€ะพะผะตะฝะฐ"
+
+msgid "Type :qa! and press <Enter> to abandon all changes and exit Vim"
+msgstr ""
+"ะžั‚ะบัƒั†ะฐั˜ั‚ะต :qa! ะธ ะฟั€ะธั‚ะธัะฝะธั‚ะต <ะ•ะฝั‚ะตั€> ะดะฐ ะพะดะฑะฐั†ะธั‚ะต ัะฒะต ะธะทะผะตะฝะต ะธ ะฝะฐะฟัƒัั‚ะธั‚ะต Vim"
+
+#, c-format
+msgid "1 line %sed 1 time"
+msgstr "1 ะปะธะฝะธั˜ะฐ %sั€ะฐะฝะฐ 1 ะฟัƒั‚"
+
+#, c-format
+msgid "1 line %sed %d times"
+msgstr "1 ะปะธะฝะธั˜ะฐ %sั€ะฐะฝะฐ %d ะฟัƒั‚ะฐ"
+
+#, c-format
+msgid "%ld lines %sed 1 time"
+msgstr "%ld ะปะธะฝะธั˜ะฐ %sั€ะฐะฝะพ 1 ะฟัƒั‚"
+
+#, c-format
+msgid "%ld lines %sed %d times"
+msgstr "%ld ะปะธะฝะธั˜ะฐ %sั€ะฐะฝะพ %d ะฟัƒั‚ะฐ"
+
+#, c-format
+msgid "%ld lines to indent... "
+msgstr "%ld ะทะฐ ัƒะฒะปะฐั‡ะตัšะต... "
+
+msgid "1 line indented "
+msgstr "1 ะปะธะฝะธั˜ะฐ ัƒะฒัƒั‡ะตะฝะฐ "
+
+#, c-format
+msgid "%ld lines indented "
+msgstr "%ld ะธะฝะธั˜ะฐ ัƒะฒัƒั‡ะตะฝะพ "
+
+msgid "E748: No previously used register"
+msgstr "E748: ะะตะผะฐ ะฟั€ะตั‚ั…ะพะดะฝะพ ะบะพั€ะธัˆั›ะตะฝะพะณ ั€ะตะณะธัั‚ั€ะฐ"
+
+msgid "cannot yank; delete anyway"
+msgstr "ะฝะต ะผะพะถะต ะดะฐ ัะต ั‚ั€ะณะฝะต; ะธะฟะฐะบ ะพะฑั€ะธัะฐั‚ะธ"
+
+msgid "1 line changed"
+msgstr "1 ะปะธะฝะธั˜ะฐ ั˜ะต ะฟั€ะพะผะตัšะตะฝะฐ"
+
+#, c-format
+msgid "%ld lines changed"
+msgstr "%ld ะปะธะฝะธั˜ะฐ ั˜ะต ะฟั€ะพะผะตัšะตะฝะพ"
+
+#, c-format
+msgid "freeing %ld lines"
+msgstr "ะพัะปะพะฑะฐั’ะฐ ัะต %ld ะปะธะฝะธั˜ะฐ"
+
+#, c-format
+msgid " into \"%c"
+msgstr " ัƒ \"%c"
+
+#, c-format
+msgid "block of 1 line yanked%s"
+msgstr "ะฑะปะพะบ ะพะด 1 ะปะธะฝะธั˜ะต ั˜ะต ั‚ั€ะณะฝัƒั‚%s"
+
+#, c-format
+msgid "1 line yanked%s"
+msgstr "1 ะปะธะฝะธั˜ะฐ ั˜ะต ั‚ั€ะณะฝัƒั‚ะฐ%s"
+
+#, c-format
+msgid "block of %ld lines yanked%s"
+msgstr "ะฑะปะพะบ ะพะด %ld ะปะธะฝะธั˜ะฐ ั˜ะต ั‚ั€ะณะฝัƒั‚%s"
+
+#, c-format
+msgid "%ld lines yanked%s"
+msgstr "%ld ะปะธะฝะธั˜ะฐ ั˜ะต ั‚ั€ะณะฝัƒั‚ะพ%s"
+
+#, c-format
+msgid "E353: Nothing in register %s"
+msgstr "E353: ะ ะตะณะธัั‚ะฐั€ %s ั˜ะต ะฟั€ะฐะทะฐะฝ"
+
+msgid ""
+"\n"
+"--- Registers ---"
+msgstr ""
+"\n"
+"--- ะ ะตะณะธัั‚ั€ะธ ---"
+
+msgid "Illegal register name"
+msgstr "ะะตะฒะฐะถะตั›ะต ะธะผะต ั€ะตะณะธัั‚ั€ะฐ"
+
+msgid ""
+"\n"
+"# Registers:\n"
+msgstr ""
+"\n"
+"# ะ ะตะณะธัั‚ั€ะธ:\n"
+
+#, c-format
+msgid "E574: Unknown register type %d"
+msgstr "E574: ะะตะฟะพะทะฝะฐั‚ ั‚ะธะฟ ั€ะตะณะธัั‚ั€ะฐ %d"
+
+msgid ""
+"E883: search pattern and expression register may not contain two or more "
+"lines"
+msgstr ""
+"E883: ั€ะตะณะธัั‚ะฐั€ ะทะฐ ัˆะฐะฑะปะพะฝ ะฟั€ะตั‚ั€ะฐะณะต ะธ ะธะทั€ะฐะท ะฝะต ะผะพะถะต ะดะฐ ัะฐะดั€ะถะธ ะดะฒะต ะธะปะธ ะฒะธัˆะต "
+"ะปะธะฝะธั˜ะฐ"
+
+#, c-format
+msgid "%ld Cols; "
+msgstr "%ld ะšะพะป; "
+
+#, c-format
+msgid "Selected %s%ld of %ld Lines; %lld of %lld Words; %lld of %lld Bytes"
+msgstr "ะ˜ะทะฐะฑั€ะฐะฝะพ %s%ld ะพะด %ld ะ›ะธะฝะธั˜ะฐ; %lld ะพะด %lld ะ ะตั‡ะธ; %lld ะพะด %lld ะ‘ะฐั˜ั‚ะพะฒะฐ"
+
+#, c-format
+msgid ""
+"Selected %s%ld of %ld Lines; %lld of %lld Words; %lld of %lld Chars; %lld of "
+"%lld Bytes"
+msgstr ""
+"ะ˜ะทะฐะฑั€ะฐะฝะพ %s%ld ะพะด %ld ะ›ะธะฝะธั˜ะฐ; %lld ะพะด %lld ะ ะตั‡ะธ; %lld ะพะด %lld ะ—ะฝะฐะบะฐ; %lld ะพะด "
+"%lld ะ‘ะฐั˜ั‚ะพะฒะฐ"
+
+#, c-format
+msgid "Col %s of %s; Line %ld of %ld; Word %lld of %lld; Byte %lld of %lld"
+msgstr "ะšะพะป %s ะพะด %s; ะ›ะธะฝะธั˜ะฐ %ld ะพะด %ld; ะ ะตั‡ %lld ะพะด %lld; ะ‘ะฐั˜ั‚ %lld ะพะด %lld"
+
+#, c-format
+msgid ""
+"Col %s of %s; Line %ld of %ld; Word %lld of %lld; Char %lld of %lld; Byte %"
+"lld of %lld"
+msgstr ""
+"ะšะพะป %s ะพะด %s; ะ›ะธะฝะธั˜ะฐ %ld ะพะด %ld; ะ ะตั‡ %lld ะพะด %lld; ะ—ะฝะฐะบ %lld ะพะด %lld; ะ‘ะฐั˜ั‚ %"
+"lld ะพะด %lld"
+
+#, c-format
+msgid "(+%lld for BOM)"
+msgstr "(+%lld ะทะฐ BOM)"
+
+msgid "Thanks for flying Vim"
+msgstr "ะฅะฒะฐะปะฐ ัˆั‚ะพ ะปะตั‚ะธั‚ะต ัะฐ Vim"
+
+msgid "E518: Unknown option"
+msgstr "E518: ะะตะฟะพะทะฝะฐั‚ะฐ ะพะฟั†ะธั˜ะฐ"
+
+msgid "E519: Option not supported"
+msgstr "E519: ะžะฟั†ะธั˜ะฐ ะฝะธั˜ะต ะฟะพะดั€ะถะฐะฝะฐ"
+
+msgid "E520: Not allowed in a modeline"
+msgstr "E520: ะะธั˜ะต ะดะพะฒะพั™ะตะฝะพ ัƒ ั€ะตะถะธะผัะบะพั˜ ะปะธะฝะธั˜ะธ"
+
+msgid "E846: Key code not set"
+msgstr "E846: ะะธั˜ะต ะฟะพัั‚ะฐะฒั™ั€ะฝ ะบะพะด ั‚ะฐัั‚ะตั€ะฐ"
+
+msgid "E521: Number required after ="
+msgstr "E521: ะŸะพั‚ั€ะตะฑะฐะฝ ั˜ะต ะฑั€ะพั˜ ะฝะฐะบะพะฝ ="
+
+msgid "E522: Not found in termcap"
+msgstr "E522: ะะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝะพ ัƒ termcap"
+
+#, c-format
+msgid "E539: Illegal character <%s>"
+msgstr "E539: ะะตะดะพะทะฒะพั™ะตะฝ ะบะฐั€ะฐะบั‚ะตั€ <%s>"
+
+#, c-format
+msgid "For option %s"
+msgstr "ะ—ะฐ ะพะฟั†ะธั˜ัƒ %s"
+
+msgid "E529: Cannot set 'term' to empty string"
+msgstr "E529: 'term' ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟะพัั‚ะฐะฒะธ ะฝะฐ ะฟั€ะฐะทะฐะฝ ัั‚ั€ะธะฝะณ"
+
+msgid "E530: Cannot change term in GUI"
+msgstr "E530: term ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะผะตะฝะธ ะธะท GUI"
+
+msgid "E531: Use \":gui\" to start the GUI"
+msgstr "E531: ะšะพั€ะธัั‚ะธั‚ะต \":gui\" ะดะฐ ะฟะพะบั€ะตะฝะตั‚ะต GUI"
+
+msgid "E589: 'backupext' and 'patchmode' are equal"
+msgstr "E589: 'backupext' ะธ 'patchmode' ััƒ ะธัั‚ะพะฒะตั‚ะฝะธ"
+
+msgid "E834: Conflicts with value of 'listchars'"
+msgstr "E834: ะฃ ะบะพะฝั„ะปะธะบั‚ัƒ ัะฐ ะฒั€ะตะดะฝะพัˆั›ัƒ 'listchars'"
+
+msgid "E835: Conflicts with value of 'fillchars'"
+msgstr "E835: ะฃ ะบะพะฝั„ะปะธะบั‚ัƒ ัะฐ ะฒั€ะตะดะฝะพัˆั›ัƒ 'fillchars'"
+
+msgid "E617: Cannot be changed in the GTK+ 2 GUI"
+msgstr "E617: ะะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะผะตะฝะธ ัƒ GTK+ 2 GUI"
+
+#, c-format
+msgid "E950: Cannot convert between %s and %s"
+msgstr "E950: ะะต ะผะพะถะต ะดะฐ ัะต ะบะพะฝะฒะตั€ั‚ัƒั˜ะต ะธะทะผะตั’ัƒ %s ะธ %s"
+
+msgid "E524: Missing colon"
+msgstr "E524: ะะตะดะพัั‚ะฐั˜ะต ะดะฒะพั‚ะฐั‡ะบะฐ"
+
+msgid "E525: Zero length string"
+msgstr "E525: ะกั‚ั€ะธะฝะณ ะดัƒะถะธะฝะต ะฝัƒะปะฐ"
+
+#, c-format
+msgid "E526: Missing number after <%s>"
+msgstr "E526: ะะตะดะพัั‚ะฐั˜ะต ะฑั€ะพั˜ ะฝะฐะบะพะฝ <%s>"
+
+msgid "E527: Missing comma"
+msgstr "E527: ะะตะดะพัั‚ะฐั˜ะต ะทะฐั€ะตะท"
+
+msgid "E528: Must specify a ' value"
+msgstr "E528: ะœะพั€ะฐ ะดะฐ ัะต ะฝะฐะฒะตะดะต ' ะฒั€ะตะดะฝะพัั‚"
+
+msgid "E595: contains unprintable or wide character"
+msgstr "E595: ัะฐะดั€ะถะธ ะบะฐั€ะฐะบั‚ะตั€ ะบะพั˜ะธ ะฝะต ะผะพะถะต ะดะฐ ัะต ะพะดัˆั‚ะฐะผะฟะฐ, ะธะปะธ ัˆะธั€ะพะบะธ ะบะฐั€ะฐะบั‚ะตั€"
+
+msgid "E596: Invalid font(s)"
+msgstr "E596: ะะตะธัะฟั€ะฐะฒะฝะธ ั„ะพะฝั‚(ะพะฒะธ)"
+
+msgid "E597: can't select fontset"
+msgstr "E597: fontset ะฝะต ะผะพะถะต ะดะฐ ัะต ะธะทะฐะฑะตั€ะต"
+
+msgid "E598: Invalid fontset"
+msgstr "E598: ะะตะธัะฟั€ะฐะฒะฐะฝ fontset"
+
+msgid "E533: can't select wide font"
+msgstr "E533: ัˆะธั€ะพะบะธ ั„ะพะฝั‚ ะฝะต ะผะพะถะต ะดะฐ ัะต ะธะทะฐะฑะตั€ะต"
+
+msgid "E534: Invalid wide font"
+msgstr "E534: ะะตะธัะฟั€ะฐะฒะฐะฝ ัˆะธั€ะพะบะธ ั„ะพะฝั‚"
+
+#, c-format
+msgid "E535: Illegal character after <%c>"
+msgstr "E535: ะะตะฒะฐะถะตั›ะธ ะบะฐั€ะฐะบั‚ะตั€ ะฝะฐะบะพะฝ <%c>"
+
+msgid "E536: comma required"
+msgstr "E536: ะฟะพั‚ั€ะตะฑะฐะฝ ะทะฐั€ะตะท"
+
+#, c-format
+msgid "E537: 'commentstring' must be empty or contain %s"
+msgstr "E537: 'commentstring' ะผะพั€ะฐ ะฑะธั‚ะธ ะฟั€ะฐะทะฝะพ ะธะปะธ ะดะฐ ัะฐะดั€ะถะธ %s"
+
+msgid "E538: No mouse support"
+msgstr "E538: ะะตะผะฐ ะฟะพะดั€ัˆะบะต ะทะฐ ะผะธัˆะฐ"
+
+msgid "E540: Unclosed expression sequence"
+msgstr "E540: ะะธะท ะธะทั€ะฐะทะฐ ะฝะธั˜ะต ะทะฐั‚ะฒะพั€ะตะฝ"
+
+msgid "E541: too many items"
+msgstr "E541: ะฟั€ะตะฒะธัˆะต ัั‚ะฐะฒะบะธ"
+
+msgid "E542: unbalanced groups"
+msgstr "E542: ะฝะตัƒั€ะฐะฒะฝะพั‚ะตะถะตะฝะต ะณั€ัƒะฟะต"
+
+msgid "E946: Cannot make a terminal with running job modifiable"
+msgstr ""
+"E946: ะขะตั€ะผะธะฝะฐะป ัะฐ ะทะฐะดะฐั‚ะบะพะผ ะบะพั˜ะธ ัะต ะธะทะฒั€ัˆะฐะฒะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ัƒั‡ะธะฝะธ ะธะทะผะตัšะธะฒะธะผ"
+
+msgid "E590: A preview window already exists"
+msgstr "E590: ะŸั€ะพะทะพั€ ะทะฐ ะฟั€ะตะณะปะตะด ะฒะตั› ะฟะพัั‚ะพั˜ะธ"
+
+msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'"
+msgstr "W17: ะั€ะฐะฟัะบะธ ะทะฐั…ั‚ะตะฒะฐ UTF-8, ะธะทะฒั€ัˆะธั‚ะต ':set encoding=utf-8'"
+
+msgid "E954: 24-bit colors are not supported on this environment"
+msgstr "E954: ะžะฒะพ ะพะบั€ัƒะถะตัšะต ะฝะต ะฟะพะดั€ะถะฐะฒะฐ 24-ะฑะธั‚ะฝะต ะฑะพั˜ะต"
+
+#, c-format
+msgid "E593: Need at least %d lines"
+msgstr "E593: ะŸะพั‚ั€ะตะฑะฝะพ ั˜ะต ะฝะฐั˜ะผะฐัšะต %d ะปะธะฝะธั˜ะฐ"
+
+#, c-format
+msgid "E594: Need at least %d columns"
+msgstr "E594: ะŸะพั‚ั€ะตะฑะฝะพ ั˜ะต ะฝะฐั˜ะผะฐัšะต %d ะบะพะปะพะฝะฐ"
+
+#, c-format
+msgid "E355: Unknown option: %s"
+msgstr "E355: ะะตะฟะพะทะฝะฐั‚ะฐ ะพะฟั†ะธั˜ะฐ: %s"
+
+#, c-format
+msgid "E521: Number required: &%s = '%s'"
+msgstr "E521: ะ—ะฐั…ั‚ะตะฒะฐ ัะต ะฑั€ะพั˜: &%s = '%s'"
+
+msgid ""
+"\n"
+"--- Terminal codes ---"
+msgstr ""
+"\n"
+"--- ะšะพะดะพะฒะธ ั‚ะตั€ะผะธะฝะฐะปะฐ ---"
+
+msgid ""
+"\n"
+"--- Global option values ---"
+msgstr ""
+"\n"
+"--- ะ’ั€ะตะดะฝะพัั‚ะธ ะณะปะพะฑะฐะปะฝะธั… ะพะฟั†ะธั˜ะฐ ---"
+
+msgid ""
+"\n"
+"--- Local option values ---"
+msgstr ""
+"\n"
+"--- ะ’ั€ะตะดะฝะพัั‚ะธ ะปะพะบะฐะปะฝะธั… ะพะฟั†ะธั˜ะฐ ---"
+
+msgid ""
+"\n"
+"--- Options ---"
+msgstr ""
+"\n"
+"--- ะžะฟั†ะธั˜ะต ---"
+
+msgid "E356: get_varp ERROR"
+msgstr "E356: get_varp ะ“ะ ะ•ะจะšะ"
+
+#, c-format
+msgid "E357: 'langmap': Matching character missing for %s"
+msgstr "E357: 'langmap': ะะตะดะพัั‚ะฐั˜ะต ะพะดะณะพะฒะฐั€ะฐั˜ัƒั›ะธ ะบะฐั€ะฐะบั‚ะตั€ ะทะฐ %s"
+
+#, c-format
+msgid "E358: 'langmap': Extra characters after semicolon: %s"
+msgstr "E358: 'langmap': ะ˜ะผะฐ ั˜ะพัˆ ะบะฐั€ะฐะบั‚ะตั€ะฐ ะฝะฐะบะพะฝ ั‚ะฐั‡ะบะฐะทะฐั€ะตะทะฐ: %s"
+
+msgid "cannot open "
+msgstr "ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ "
+
+msgid "VIM: Can't open window!\n"
+msgstr "VIM: ะŸั€ะพะทะพั€ ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ!\n"
+
+msgid "Need Amigados version 2.04 or later\n"
+msgstr "ะŸะพั‚ั€ะตะฑะฐะฝ ั˜ะต Amigados ะฒะตั€ะทะธั˜ะฐ 2.04 ะธะปะธ ะบะฐัะฝะธั˜ะธ\n"
+
+#, c-format
+msgid "Need %s version %ld\n"
+msgstr "ะŸะพั‚ั€ะตะฑะฐะฝ ั˜ะต %s ะฒะตั€ะทะธั˜ะฐ %ld\n"
+
+msgid "Cannot open NIL:\n"
+msgstr "ะะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ NIL:\n"
+
+msgid "Cannot create "
+msgstr "ะะต ะผะพะถะต ะดะฐ ัะต ะบั€ะตะธั€ะฐ "
+
+#, c-format
+msgid "Vim exiting with %d\n"
+msgstr "Vim ะธะทะปะฐะทะธ ัะฐ %d\n"
+
+msgid "cannot change console mode ?!\n"
+msgstr "ะบะพะฝะทะพะปะฝะธ ั€ะตะถะธะผ ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะผะตะฝะธ ?!\n"
+
+msgid "mch_get_shellsize: not a console??\n"
+msgstr "mch_get_shellsize: ะฝะธั˜ะต ะบะพะฝะทะพะปะฐ??\n"
+
+msgid "E360: Cannot execute shell with -f option"
+msgstr "E360: ะšะพะผะฐะฝะดะฝะพ ะพะบั€ัƒะถะตัšะต ะฝะต ะผะพะถะต ะดะฐ ัะต ะธะทะฒั€ัˆะธ ัะฐ -f ะพะฟั†ะธั˜ะพะผ"
+
+msgid "Cannot execute "
+msgstr "ะะต ะผะพะถะต ะดะฐ ัะต ะธะทะฒั€ัˆะธ "
+
+msgid "shell "
+msgstr "ะบะพะผะฐะฝะดะฝะพ ะพะบั€ัƒะถะตัšะต "
+
+msgid " returned\n"
+msgstr " ะฒั€ะฐั‚ะธะปะพ\n"
+
+msgid "ANCHOR_BUF_SIZE too small."
+msgstr "ANCHOR_BUF_SIZE ััƒะฒะธัˆะต ะผะฐะปะธ."
+
+msgid "I/O ERROR"
+msgstr "ะฃ/ะ˜ ะ“ะ ะ•ะจะšะ"
+
+msgid "Message"
+msgstr "ะŸะพั€ัƒะบะฐ"
+
+msgid "E237: Printer selection failed"
+msgstr "E237: ะ˜ะทะฑะพั€ ัˆั‚ะฐะผะฟะฐั‡ะฐ ะฝะธั˜ะต ัƒัะฟะตะพ"
+
+#, c-format
+msgid "to %s on %s"
+msgstr "ัƒ %s ะฝะฐ %s"
+
+#, c-format
+msgid "E613: Unknown printer font: %s"
+msgstr "E613: ะะตะฟะพะทะฝะฐั‚ ั„ะพะฝั‚ ัˆั‚ะฐะผะฟะฐั‡ะฐ: %s"
+
+#, c-format
+msgid "E238: Print error: %s"
+msgstr "E238: ะ“ั€ะตัˆะบะฐ ะบะพะด ัˆั‚ะฐะผะฟะฐัšะฐ: %s"
+
+#, c-format
+msgid "Printing '%s'"
+msgstr "ะจั‚ะฐะผะฟะฐ ัะต '%s'"
+
+#, c-format
+msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
+msgstr "E244: ะะตะดะพะทะฒะพั™ะตะฝะพ ะธะผะต ัะตั‚ะฐ ะบะฐั€ะฐะบั‚ะตั€ะฐ \"%s\" ัƒ ะธะผะตะฝัƒ ั„ะพะฝั‚ัƒ \"%s\""
+
+#, c-format
+msgid "E244: Illegal quality name \"%s\" in font name \"%s\""
+msgstr "E244: ะะตะดะพะทะฒะพั™ะตะฝะพ ะธะผะต ะฒะฐั€ะธั˜ะฐะฝั‚ะต \"%s\" ัƒ ะธะผะตะฝัƒ ั„ะพะฝั‚ัƒ \"%s\""
+
+#, c-format
+msgid "E245: Illegal char '%c' in font name \"%s\""
+msgstr "E245: ะะตะธัะฟั€ะฐะฒะฐะฝ ะบะฐั€ะฐะบั‚ะตั€ '%c' ัƒ ะธะผะตะฝัƒ ั„ะพะฝั‚ะฐ \"%s\""
+
+#, c-format
+msgid "Opening the X display took %ld msec"
+msgstr "ะžั‚ะฒะฐั€ะฐัšะต X ะฟั€ะธะบะฐะทะฐ ั˜ะต ั‚ั€ะฐั˜ะฐะปะพ %ld ะผัะตะบ"
+
+msgid ""
+"\n"
+"Vim: Got X error\n"
+msgstr ""
+"\n"
+"Vim: ะ”ะพัˆะปะพ ั˜ะต ะดะพ X ะณั€ะตัˆะบะต\n"
+
+msgid "Testing the X display failed"
+msgstr "ะขะตัั‚ะธั€ะฐัšะต X ะฟั€ะธะบะฐะทะฐ ะฝะธั˜ะต ัƒัะฟะตะปะพ"
+
+msgid "Opening the X display timed out"
+msgstr "ะ˜ัั‚ะตะบะปะพ ั˜ะต ะผะฐะบัะธะผะฐะปะฝะพ ะฒั€ะตะผะต ะทะฐ ะพั‚ะฒะฐั€ะฐัšะต X ะฟั€ะธะบะฐะทะฐ"
+
+msgid ""
+"\n"
+"Could not get security context for "
+msgstr ""
+"\n"
+"ะะธั˜ะต ะผะพะณะฐะพ ะดะฐ ัะต ะพั‡ะธั‚ะฐ ะฑะตะทะฑะตะดะฝะพัะฝะธ ะบะพะฝั‚ะตะบัั‚ ะทะฐ "
+
+msgid ""
+"\n"
+"Could not set security context for "
+msgstr ""
+"\n"
+"ะะธั˜ะต ะผะพะณะฐะพ ะดะฐ ัะต ะฟะพัั‚ะฐะฒะธ ะฑะตะทะฑะตะดะฝะพัะฝะธ ะบะพะฝั‚ะตะบัั‚ ะทะฐ "
+
+#, c-format
+msgid "Could not set security context %s for %s"
+msgstr "ะ‘ะตะทะฑะตะดะฝะพัะฝะธ ะบะพะฝั‚ะตะบัั‚ %s ะทะฐ %s ะฝะธั˜ะต ะผะพะณะฐะพ ะดะฐ ัะต ะฟะพัั‚ะฐะฒะธ"
+
+#, c-format
+msgid "Could not get security context %s for %s. Removing it!"
+msgstr "ะ‘ะตะทะฑะตะดะฝะพัะฝะธ ะบะพะฝั‚ะตะบัั‚ %s ะทะฐ %s ะฝะธั˜ะต ะผะพะณะฐะพ ะดะฐ ัะต ะพั‡ะธั‚ะฐ. ะฃะบะปะฐัšะฐ ัะต!"
+
+msgid ""
+"\n"
+"Cannot execute shell sh\n"
+msgstr ""
+"\n"
+"ะšะพะผะฐะฝะดะฝะพ ะพะบั€ัƒะถะตัšะต sh ะฝะต ะผะพะถะต ะดะฐ ัะต ะธะทะฒั€ัˆะธ\n"
+
+msgid ""
+"\n"
+"shell returned "
+msgstr ""
+"\n"
+"ะบะพะผะฐะฝะดะฝะพ ะพะบั€ัƒะถะตัšะต ั˜ะต ะฒั€ะฐั‚ะธะปะพ "
+
+msgid ""
+"\n"
+"Cannot create pipes\n"
+msgstr ""
+"\n"
+"ะขะพะบะพะฒะธ ะฟะพะดะฐั‚ะฐะบะฐ ะฝะต ะผะพะณัƒ ะดะฐ ัะต ะบั€ะตะธั€ะฐั˜ัƒ\n"
+
+msgid ""
+"\n"
+"Cannot fork\n"
+msgstr ""
+"\n"
+"ะ ะฐั‡ะฒะฐัšะต ะฝะธั˜ะต ะผะพะณัƒั›ะต\n"
+
+msgid ""
+"\n"
+"Cannot execute shell "
+msgstr ""
+"\n"
+"ะšะพะผะฐะฝะดะฝะพ ะพะบั€ัƒะถะตัšะต ะฝะต ะผะพะถะต ะดะฐ ัะต ะธะทะฒั€ัˆะธ "
+
+msgid ""
+"\n"
+"Command terminated\n"
+msgstr ""
+"\n"
+"ะšะพะผะฐะฝะดะฐ ั˜ะต ะฟั€ะตะบะธะฝัƒั‚ะฐ\n"
+
+msgid "XSMP lost ICE connection"
+msgstr "XSMP ั˜ะต ะธะทะณัƒะฑะธะพ ICE ะฒะตะทัƒ"
+
+#, c-format
+msgid "dlerror = \"%s\""
+msgstr "dlerror = \"%s\""
+
+msgid "Opening the X display failed"
+msgstr "ะžั‚ะฒะฐั€ะฐัšะต X ะฟั€ะธะบะฐะทะฐ ะฝะธั˜ะต ัƒัะฟะตะปะพ"
+
+msgid "XSMP handling save-yourself request"
+msgstr "XSMP ะพะฟัะปัƒะถัƒั˜ะต ัะฐั‡ัƒะฒะฐั˜-ัะต ะทะฐั…ั‚ะตะฒ"
+
+msgid "XSMP opening connection"
+msgstr "XSMP ะพั‚ะฒะฐั€ะฐ ะฒะตะทัƒ"
+
+msgid "XSMP ICE connection watch failed"
+msgstr "XSMP ICE ะฝะฐะดะณะปะตะดะฐัšะต ะฒะตะทะต ะฝะธั˜ะต ัƒัะฟะตะปะพ"
+
+#, c-format
+msgid "XSMP SmcOpenConnection failed: %s"
+msgstr "XSMP SmcOpenConnection ะฝะธั˜ะต ัƒัะฟะตะปะพ: %s"
+
+msgid "At line"
+msgstr "ะšะพะด ะปะธะฝะธั˜ะต"
+
+msgid "Could not load vim32.dll!"
+msgstr "vim32.dll ะฝะธั˜ะต ะผะพะณะปะฐ ะดะฐ ัะต ัƒั‡ะธั‚ะฐ!"
+
+msgid "VIM Error"
+msgstr "VIM ะ“ั€ะตัˆะบะฐ"
+
+msgid "Could not fix up function pointers to the DLL!"
+msgstr "ะŸะพะบะฐะทะธะฒะฐั‡ะธ ะฝะฐ ั„ัƒะฝะบั†ะธั˜ะต ัƒ DLL-ัƒ ะฝะธััƒ ะผะพะณะปะธ ะดะฐ ัะต ะฟะพะฟั€ะฐะฒะต!"
+
+#, c-format
+msgid "Vim: Caught %s event\n"
+msgstr "Vim: ะฃั…ะฒะฐั›ะตะฝ ั˜ะต %s ะดะพะณะฐั’ะฐั˜\n"
+
+msgid "close"
+msgstr "ะทะฐั‚ะฒะฐั€ะฐัšะต"
+
+msgid "logoff"
+msgstr "ะพะดั˜ะฐะฒั™ะธะฒะฐัšะต"
+
+msgid "shutdown"
+msgstr "ะธัะบั™ัƒั‡ะธะฒะฐัšะต"
+
+msgid "E371: Command not found"
+msgstr "E371: ะšะพะผะฐะฝะดะฐ ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝะฐ"
+
+msgid ""
+"VIMRUN.EXE not found in your $PATH.\n"
+"External commands will not pause after completion.\n"
+"See :help win32-vimrun for more information."
+msgstr ""
+"VIMRUN.EXE ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝ ัƒ ะฒะฐัˆะตะผ $PATH.\n"
+"ะ•ะบัั‚ะตั€ะฝะต ะบะพะผะฐะฝะดะต ะฝะตั›ะต ะผะพั›ะธ ะดะฐ ัะต ะฟะฐัƒะทะธั€ะฐั˜ัƒ ะฝะฐะบะพะฝ ะทะฐะฒั€ัˆะตั‚ะบะฐ.\n"
+"ะŸะพะณะปะตะดะฐั˜ั‚ะต :help win32-vimrun ะทะฐ ะฒะธัˆะต ะธะฝั„ะพั€ะผะฐั†ะธั˜ะฐ."
+
+msgid "Vim Warning"
+msgstr "Vim ะฃะฟะพะทะพั€ะตัšะต"
+
+#, c-format
+msgid "shell returned %d"
+msgstr "ะบะพะผะฐะฝะดะฝะพ ะพะบั€ัƒะถะตัšะต ั˜ะต ะฒั€ะฐั‚ะธะปะพ %d"
+
+msgid "E926: Current location list was changed"
+msgstr "E926: ะขะตะบัƒั›ะฐ ะปะธัั‚ะฐ ะปะพะบะฐั†ะธั˜ะฐ ั˜ะต ะฟั€ะพะผะตัšะตะฝะฐ"
+
+#, c-format
+msgid "E372: Too many %%%c in format string"
+msgstr "E372: ะŸั€ะตะฒะธัˆะต %%%c ัั‚ั€ะธะฝะณัƒ ั„ะพั€ะผะฐั‚ะฐ"
+
+#, c-format
+msgid "E373: Unexpected %%%c in format string"
+msgstr "E373: ะะตะพั‡ะตะบะธะฒะฐะฝะพ %%%c ัั‚ั€ะธะฝะณัƒ ั„ะพั€ะผะฐั‚ะฐ"
+
+msgid "E374: Missing ] in format string"
+msgstr "E374: ะะตะดะพัั‚ะฐั˜ะต ] ัƒ ัั‚ั€ะธะฝะณัƒ ั„ะพั€ะผะฐั‚ะฐ"
+
+#, c-format
+msgid "E375: Unsupported %%%c in format string"
+msgstr "E375: ะะตะฟะพะดั€ะถะฐะฝะพ %%%c ัƒ ัั‚ั€ะธะฝะณัƒ ั„ะพั€ะผะฐั‚ะฐ"
+
+#, c-format
+msgid "E376: Invalid %%%c in format string prefix"
+msgstr "E376: ะะตะฒะฐะถะตั›ะต %%%c ัƒ ะฟั€ะตั„ะธะบััƒ ัั‚ั€ะธะฝะณะฐ ั„ะพั€ะผะฐั‚ะฐ"
+
+#, c-format
+msgid "E377: Invalid %%%c in format string"
+msgstr "E377: ะะตะฒะฐะถะตั›ะต %%%c ัƒ ัั‚ั€ะธะฝะณัƒ ั„ะพั€ะผะฐั‚ะฐ"
+
+msgid "E378: 'errorformat' contains no pattern"
+msgstr "E378: 'errorformat' ะฝะต ัะฐะดั€ะถะธ ัˆะฐะฑะปะพะฝ"
+
+msgid "E379: Missing or empty directory name"
+msgstr "E379: ะ˜ะผะต ะดะธั€ะตะบั‚ะพั€ะธั˜ัƒะผะฐ ะฝะตะดะพัั‚ะฐั˜ะต ะธะปะธ ั˜ะต ะฟั€ะฐะทะฝะพ"
+
+msgid "E553: No more items"
+msgstr "E553: ะะตะผะฐ ะฒะธัˆะต ัั‚ะฐะฒะบะธ"
+
+msgid "E924: Current window was closed"
+msgstr "E924: ะขะตะบัƒั›ะธ ะฟั€ะพะทะพั€ ั˜ะต ะทะฐั‚ะฒะพั€ะตะฝ"
+
+msgid "E925: Current quickfix was changed"
+msgstr "E925: ะขะตะบัƒั›ะธ quickfix ั˜ะต ะฟั€ะพะผะตัšะตะฝ"
+
+#, c-format
+msgid "(%d of %d)%s%s: "
+msgstr "(%d ะพะด %d)%s%s: "
+
+msgid " (line deleted)"
+msgstr " (ะปะธะฝะธั˜ะฐ ะพะฑั€ะธัะฐะฝะฐ)"
+
+#, c-format
+msgid "%serror list %d of %d; %d errors "
+msgstr "%sะปะธัั‚ะฐ ะณั€ะตัˆะฐะบะฐ %d ะพะด %d; %d ะณั€ะตัˆะฐะบะฐ "
+
+msgid "E380: At bottom of quickfix stack"
+msgstr "E380: ะะฐ ะดะฝัƒ quickfix ัั‚ะตะบะฐ"
+
+msgid "E381: At top of quickfix stack"
+msgstr "E381: ะะฐ ะฒั€ั…ัƒ quickfix ัั‚ะตะบะฐ"
+
+msgid "No entries"
+msgstr "ะะตะผะฐ ัƒะฝะพัะฐ"
+
+msgid "Error file"
+msgstr "ะ”ะฐั‚ะพั‚ะตะบะฐ ะณั€ะตัˆะฐะบะฐ"
+
+msgid "E683: File name missing or invalid pattern"
+msgstr "E683: ะะตะดะพัั‚ะฐั˜ะต ะธะผะต ะดะฐั‚ะพั‚ะตะบะต ะธะปะธ ะฝะตะฒะฐะถะตั›ะธ ัˆะฐะฑะปะพะฝ"
+
+#, c-format
+msgid "Cannot open file \"%s\""
+msgstr "ะ”ะฐั‚ะพั‚ะตะบะฐ \"%s\" ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ"
+
+msgid "E681: Buffer is not loaded"
+msgstr "E681: ะ‘ะฐั„ะตั€ ะฝะธั˜ะต ัƒั‡ะธั‚ะฐะฝ"
+
+msgid "E777: String or List expected"
+msgstr "E777: ะžั‡ะตะบัƒั˜ะต ัะต String ะธะปะธ List"
+
+#, c-format
+msgid "E369: invalid item in %s%%[]"
+msgstr "E369: ะฝะตะฒะฐะถะตั›ะฐ ัั‚ะฐะฒะบะฐ ัƒ %s%%[]"
+
+#, c-format
+msgid "E769: Missing ] after %s["
+msgstr "E769: ะะตะดะพัั‚ะฐั˜ะต ] ะฝะฐะบะพะฝ %s["
+
+msgid "E944: Reverse range in character class"
+msgstr "E944: ะžะฑั€ะฝัƒั‚ะธ ะพะฟัะตะณ ัƒ ะบะฐั€ะฐะบั‚ะตั€ ะบะปะฐัะธ"
+
+msgid "E945: Range too large in character class"
+msgstr "E945: ะŸั€ะตะฒะตะปะธะบะธ ะพะฟัะตะณ ัƒ ะบะฐั€ะฐะบั‚ะตั€ ะบะปะฐัะธ"
+
+#, c-format
+msgid "E53: Unmatched %s%%("
+msgstr "E53: ะะตัƒะฟะฐั€ะตะฝะฐ %s%%("
+
+#, c-format
+msgid "E54: Unmatched %s("
+msgstr "E54: ะะตัƒะฟะฐั€ะตะฝะฐ %s("
+
+#, c-format
+msgid "E55: Unmatched %s)"
+msgstr "E55: ะะตัƒะฟะฐั€ะตะฝะฐ %s)"
+
+msgid "E66: \\z( not allowed here"
+msgstr "E66: \\z( ะพะฒะดะต ะฝะธั˜ะต ะดะพะทะฒะพั™ะตะฝะพ"
+
+msgid "E67: \\z1 - \\z9 not allowed here"
+msgstr "E67: \\z1 - \\z9 ะพะฒะดะต ะฝะธััƒ ะดะพะทะฒะพั™ะตะฝะธ"
+
+#, c-format
+msgid "E69: Missing ] after %s%%["
+msgstr "E69: ะะตะดะพัั‚ะฐั˜ะต ] ะฝะฐะบะพะฝ %s%%["
+
+#, c-format
+msgid "E70: Empty %s%%[]"
+msgstr "E70: ะŸั€ะฐะทะฐะฝ %s%%[]"
+
+msgid "E65: Illegal back reference"
+msgstr "E65: ะะตะฒะฐะถะตั›ะฐ ะฟะพะฒั€ะฐั‚ะฝะฐ ั€ะตั„ะตั€ะตะฝั†ะฐ"
+
+msgid "E339: Pattern too long"
+msgstr "E339: ะจะฐะฑะปะพะฝ ั˜ะต ะฟั€ะตะดัƒะณะฐั‡ะฐะบ"
+
+msgid "E50: Too many \\z("
+msgstr "E50: ะŸั€ะตะฒะธัˆะต \\z("
+
+#, c-format
+msgid "E51: Too many %s("
+msgstr "E51: ะŸั€ะตะฒะธัˆะต %s("
+
+msgid "E52: Unmatched \\z("
+msgstr "E52: ะะตัƒะฟะฐั€ะตะฝะพ \\z("
+
+#, c-format
+msgid "E59: invalid character after %s@"
+msgstr "E59: ะฝะตะฒะฐะถะตั›ะธ ะบะฐั€ะฐะบั‚ะตั€ ะฝะฐะบะพะฝ %s@"
+
+#, c-format
+msgid "E60: Too many complex %s{...}s"
+msgstr "E60: ะŸั€ะตะฒะธัˆะต ะบะพะผะฟะปะตะบัะฝะธั… %s{...}s"
+
+#, c-format
+msgid "E61: Nested %s*"
+msgstr "E61: ะฃะณัšะตะถะดะตะฝะพ %s*"
+
+#, c-format
+msgid "E62: Nested %s%c"
+msgstr "E62: ะฃะณัšะตะถะดะตะฝะพ %s%c"
+
+msgid "E63: invalid use of \\_"
+msgstr "E63: ะฝะตะธัะฟั€ะฐะฒะฝะฐ ัƒะฟะพั‚ั€ะตะฑะฐ \\_"
+
+#, c-format
+msgid "E64: %s%c follows nothing"
+msgstr "E64: %s%c je ะธะทะฐ ะฝะธั‡ะตะณะฐ"
+
+msgid "E68: Invalid character after \\z"
+msgstr "E68: ะะตะฒะฐะถะตั›ะธ ะบะฐั€ะฐะบั‚ะตั€ ะฝะฐะบะพะฝ \\z"
+
+#, c-format
+msgid "E678: Invalid character after %s%%[dxouU]"
+msgstr "E678: ะะตะฒะฐะถะตั›ะธ ะบะฐั€ะฐะบั‚ะตั€ ะฝะฐะบะพะฝ %s%%[dxouU]"
+
+#, c-format
+msgid "E71: Invalid character after %s%%"
+msgstr "E71: ะะตะฒะฐะถะตั›ะธ ะบะฐั€ะฐะบั‚ะตั€ ะฝะฐะบะพะฝ %s%%"
+
+#, c-format
+msgid "E554: Syntax error in %s{...}"
+msgstr "E554: ะกะธะฝั‚ะฐะบัะฝะฐ ะณั€ะตัˆะบะฐ ัƒ %s{...}"
+
+msgid "External submatches:\n"
+msgstr "ะกะฟะพั™ะฝะฐ ะฟะพะดะฟะพะบะปะฐะฟะฐัšะฐ:\n"
+
+#, c-format
+msgid "E888: (NFA regexp) cannot repeat %s"
+msgstr "E888: (NFA regexp) ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟะพะฝะพะฒะธ %s"
+
+msgid ""
+"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be "
+"used "
+msgstr ""
+"E864: ะ˜ะทะฐ \\%#= ะผะพะถะต ะดะฐ ัะปะตะดะธ ั˜ะตะดะธะฝะพ 0, 1, ะธะปะธ 2. ะšะพั€ะธัั‚ะธั›ะต ัะต ะฐัƒั‚ะพะผะฐั‚ัะบะธ "
+"ะตะฝัŸะธะฝ "
+
+msgid "Switching to backtracking RE engine for pattern: "
+msgstr "ะŸั€ะตะฑะฐั†ะธะฒะฐัšะต ะฝะฐ backtracking RE ะตะฝัŸะธะฝ ะทะฐ ัˆะฐะฑะปะพะฝ: "
+
+msgid "E865: (NFA) Regexp end encountered prematurely"
+msgstr "E865: ะšั€ะฐั˜ (NFA) Regexp ะธะทั€ะฐะทะฐ ั˜ะต ะดะพัั‚ะธะณะฝัƒั‚ ะฟั€ะตั€ะฐะฝะพ"
+
+#, c-format
+msgid "E866: (NFA regexp) Misplaced %c"
+msgstr "E866: (NFA regexp) %c ั˜ะต ะฝะฐ ะฟะพะณั€ะตัˆะฝะพะผ ะผะตัั‚ัƒ"
+
+#, c-format
+msgid "E877: (NFA regexp) Invalid character class: %ld"
+msgstr "E877: (NFA regexp) ะะตะฒะฐะถะตั›ะฐ ะบะฐั€ะฐะบั‚ะตั€ ะบะปะฐัะฐ: %ld"
+
+#, c-format
+msgid "E867: (NFA) Unknown operator '\\z%c'"
+msgstr "E867: (NFA) ะะตะฟะพะทะฝะฐั‚ะธ ะพะฟะตั€ะฐั‚ะพั€ '\\z%c'"
+
+msgid "E951: \\% value too large"
+msgstr "E951: ะ’ั€ะตะดะฝะพัั‚ \\% ั˜ะต ะฟั€ะตะดัƒะณะฐั‡ะบะฐ"
+
+#, c-format
+msgid "E867: (NFA) Unknown operator '\\%%%c'"
+msgstr "E867: (NFA) ะะตะฟะพะทะฝะฐั‚ะธ ะพะฟะตั€ะฐั‚ะพั€ '\\%%%c'"
+
+msgid "E868: Error building NFA with equivalence class!"
+msgstr "E868: ะ“ั€ะตัˆะบะฐ ะฟั€ะธ ะณั€ะฐั’ะตัšัƒ NFA ัะฐ ะบะปะฐัะพะผ ะตะบะฒะธะฒะฐะปะตะฝั†ะธั˜ะต!"
+
+#, c-format
+msgid "E869: (NFA) Unknown operator '\\@%c'"
+msgstr "E869: (NFA) ะะตะฟะพะทะฝะฐั‚ะธ ะพะฟะตั€ะฐั‚ะพั€ '\\@%c'"
+
+msgid "E870: (NFA regexp) Error reading repetition limits"
+msgstr "E870: (NFA regexp) ะ“ั€ะตัˆะบะฐ ะฟั€ะธ ั‡ะธั‚ะฐัšัƒ ะณั€ะฐะฝะธั†ะฐ ะฟะพะฝะฐะฒั™ะฐัšะฐ"
+
+msgid "E871: (NFA regexp) Can't have a multi follow a multi"
+msgstr "E871: (NFA regexp) ะœัƒะปั‚ะธ ะฝะต ะผะพะถะต ัะปะตะดะธ ะธะทะฐ ะผัƒะปั‚ะธ"
+
+msgid "E872: (NFA regexp) Too many '('"
+msgstr "E872: (NFA regexp) ะŸั€ะตะฒะธัˆะต '('"
+
+msgid "E879: (NFA regexp) Too many \\z("
+msgstr "E879: (NFA regexp) ะŸั€ะตะฒะธัˆะต \\z("
+
+msgid "E873: (NFA regexp) proper termination error"
+msgstr "E873: (NFA regexp) ะณั€ะตัˆะบะฐ ะฟั€ะฐะฒะธะปะฝะต ั‚ะตั€ะผะธะฝะฐั†ะธั˜ะต"
+
+msgid "E874: (NFA) Could not pop the stack!"
+msgstr "E874: (NFA) ะกะบะธะดะฐัšะต ัะฐ ัั‚ะตะบะฐ ะฝะธั˜ะต ัƒัะฟะตะปะพ!"
+
+msgid ""
+"E875: (NFA regexp) (While converting from postfix to NFA), too many states "
+"left on stack"
+msgstr ""
+"E875: (NFA regexp) (ะ”ะพะบ ั˜ะต ะฒั€ัˆะตะฝะฐ ะบะพะฝะฒะตั€ะทะธั˜ะฐ ะธะท postfix ัƒ NFA), ะฟั€ะตะฒะธัˆะต "
+"ัั‚ะฐัšะฐ ั˜ะต ะพัั‚ะฐะปะพ ะฝะฐ ัั‚ะตะบัƒ"
+
+msgid "E876: (NFA regexp) Not enough space to store the whole NFA "
+msgstr ""
+"E876: (NFA regexp) ะะตะผะฐ ะดะพะฒะพั™ะฝะพ ะฟั€ะพัั‚ะพั€ะฐ ะดะฐ ัะต ัƒัะบะปะฐะดะธัˆั‚ะธ ะบะพะผะฟะปะตั‚ะฐะฝ NFA "
+
+msgid "E878: (NFA) Could not allocate memory for branch traversal!"
+msgstr "E878: (NFA) ะะธั˜ะต ะผะพะณะปะฐ ะดะฐ ัะต ะฐะปะพั†ะธั€ะฐ ะผะตะผะพั€ะธั˜ะฐ ะทะฐ ะพะฑะธะปะฐะทะฐะบ ะณั€ะฐะฝะฐ!"
+
+msgid ""
+"Could not open temporary log file for writing, displaying on stderr... "
+msgstr ""
+"ะŸั€ะธะฒั€ะตะผะตะฝะฐ ะปะพะณ ะดะฐั‚ะพั‚ะตะบะฐ ะฝะธั˜ะต ะผะพะณะปะฐ ะดะฐ ัะต ะพั‚ะฒะพั€ะธ ะทะฐ ัƒะฟะธั, ะฟั€ะธะบะฐะทัƒั˜ะต ัะต ะฝะฐ "
+"stderr... "
+
+#, c-format
+msgid "(NFA) COULD NOT OPEN %s !"
+msgstr "(NFA) %s ะะ• ะœะžะ–ะ• ะ”ะ ะกะ• ะžะขะ’ะžะ ะ˜ !"
+
+msgid "Could not open temporary log file for writing "
+msgstr "ะŸั€ะธะฒั€ะตะผะตะฝะฐ ะปะพะณ ะดะฐั‚ะพั‚ะตะบะฐ ะฝะธั˜ะต ะผะพะณะปะฐ ะดะฐ ัะต ะพั‚ะฒะพั€ะธ ะทะฐ ัƒะฟะธั "
+
+msgid " VREPLACE"
+msgstr "ะ’ะ—ะะœะ•ะะ"
+
+msgid " REPLACE"
+msgstr " ะ—ะะœะ•ะะ"
+
+msgid " REVERSE"
+msgstr " ะžะ‘ะ ะะฃะขะž"
+
+msgid " INSERT"
+msgstr " ะฃะœะ•ะขะะŠะ•"
+
+msgid " (insert)"
+msgstr " (ัƒะผะตั‚ะฐัšะต)"
+
+msgid " (replace)"
+msgstr " (ะทะฐะผะตะฝะฐ)"
+
+msgid " (vreplace)"
+msgstr " (ะฒะทะฐะผะตะฝะฐ)"
+
+msgid " Hebrew"
+msgstr " ั…ะตะฑั€ะตั˜ัะบะธ"
+
+msgid " Arabic"
+msgstr " ะฐั€ะฐะฟัะบะธ"
+
+msgid " (paste)"
+msgstr " (ะฝะฐะปะตะฟะธ)"
+
+msgid " VISUAL"
+msgstr " ะ’ะ˜ะ—ะฃะ•ะ›ะะž"
+
+msgid " VISUAL LINE"
+msgstr " ะ’ะ˜ะ—ะฃะ•ะ›ะะ ะ›ะ˜ะะ˜ะˆะ"
+
+msgid " VISUAL BLOCK"
+msgstr " ะ’ะ˜ะ—ะฃะ•ะ›ะะ˜ ะ‘ะ›ะžะš"
+
+msgid " SELECT"
+msgstr " ะ˜ะ—ะ‘ะžะ "
+
+msgid " SELECT LINE"
+msgstr " ะ˜ะ—ะ‘ะžะ  ะ›ะ˜ะะ˜ะˆะ"
+
+msgid " SELECT BLOCK"
+msgstr " ะ˜ะ—ะ‘ะžะ  ะ‘ะ›ะžะšะ"
+
+msgid "recording"
+msgstr "ัะฝะธะผะฐัšะต"
+
+#, c-format
+msgid "E383: Invalid search string: %s"
+msgstr "E383: ะะตะธัะฟั€ะฐะฒะฐะฝ ัั‚ั€ะธะฝะณ ะทะฐ ะฟั€ะตั‚ั€ะฐะณัƒ: %s"
+
+#, c-format
+msgid "E384: search hit TOP without match for: %s"
+msgstr "E384: ะฟั€ะตั‚ั€ะฐะณะฐ ั˜ะต ะดะพัั‚ะธะณะปะฐ ะ’ะ ะฅ ะฑะตะท ะฟะพะดัƒะดะฐั€ะฐัšะฐ ะทะฐ: %s"
+
+#, c-format
+msgid "E385: search hit BOTTOM without match for: %s"
+msgstr "E385: ะฟั€ะตั‚ั€ะฐะณะฐ ั˜ะต ะดะพัั‚ะธะณะปะฐ ะ”ะะž ะฑะตะท ะฟะพะดัƒะดะฐั€ะฐัšะฐ ะทะฐ: %s"
+
+msgid "E386: Expected '?' or '/' after ';'"
+msgstr "E386: ะะฐะบะพะฝ ';' ัะต ะพั‡ะตะบัƒั˜ะต '?' ะธะปะธ '/'"
+
+msgid " (includes previously listed match)"
+msgstr " (ัƒะบั™ัƒั‡ัƒั˜ะต ะฟั€ะตั‚ั…ะพะดะฝะพ ะฝะฐะฒะตะดะตะฝะฐ ะฟะพะดัƒะดะฐั€ะฐัšะฐ)"
+
+msgid "--- Included files "
+msgstr "--- ะŸั€ะธะบั™ัƒั‡ะตะฝะต ะดะฐั‚ะพั‚ะตะบะต "
+
+msgid "not found "
+msgstr "ะฝะธััƒ ะฟั€ะพะฝะฐั’ะตะฝะต "
+
+msgid "in path ---\n"
+msgstr "ัƒ ะฟัƒั‚ะฐัšะธ ---\n"
+
+msgid " (Already listed)"
+msgstr " (ะ’ะตั› ะฝะฐะฒะตะดะตะฝะพ)"
+
+msgid " NOT FOUND"
+msgstr " ะะ˜ะˆะ• ะŸะ ะžะะะ‚ะ•ะะž"
+
+#, c-format
+msgid "Scanning included file: %s"
+msgstr "ะŸั€ะตะณะปะตะดะฐัšะต ัƒะผะตั‚ะฝัƒั‚ะต ะดะฐั‚ะพั‚ะตะบะต: %s"
+
+#, c-format
+msgid "Searching included file %s"
+msgstr "ะŸั€ะตั‚ั€ะฐะถะธะฒะฐัšะต ัƒะผะตั‚ะฝัƒั‚ะต ะดะฐั‚ะพั‚ะตะบะต %s"
+
+msgid "E387: Match is on current line"
+msgstr "E387: ะŸะพะดัƒะดะฐั€ะฐัšะต ั˜ะต ัƒ ั‚ะตะบัƒั›ะพั˜ ะปะธะฝะธั˜ะธ"
+
+msgid "All included files were found"
+msgstr "ะกะฒะต ัƒะผะตั‚ะฝัƒั‚ะต ะดะฐั‚ะพั‚ะตะบะต ััƒ ะฟั€ะพะฝะฐั’ะตะฝะต"
+
+msgid "No included files"
+msgstr "ะะตะผะฐ ัƒะผะตั‚ะฝัƒั‚ะธั… ะดะฐั‚ะพั‚ะตะบะฐ"
+
+msgid "E388: Couldn't find definition"
+msgstr "E388: ะ”ะตั„ะธะฝะธั†ะธั˜ะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะฝะฐั’ะต"
+
+msgid "E389: Couldn't find pattern"
+msgstr "E389: ะจะฐะฑะปะพะฝ ะทะฐ ะฟั€ะตั‚ั€ะฐะณัƒ ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝ"
+
+msgid "Substitute "
+msgstr "ะ—ะฐะผะตะฝะฐ "
+
+#, c-format
+msgid ""
+"\n"
+"# Last %sSearch Pattern:\n"
+"~"
+msgstr ""
+"\n"
+"# ะŸะพัะปะตะดัšะธ %sะจะฐะฑะปะพะฝ ะŸั€ะตั‚ั€ะฐะณะต:\n"
+"~"
+
+msgid "E756: Spell checking is not enabled"
+msgstr "E756: ะŸั€ะพะฒะตั€ะฐ ะฟั€ะฐะฒะพะฟะธัะฐ ะฝะธั˜ะต ะพะผะพะณัƒั›ะตะฝะฐ"
+
+#, c-format
+msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\""
+msgstr ""
+"ะฃะฟะพะทะพั€ะตัšะต: ะ›ะธัั‚ะฐ ั€ะตั‡ะธ \"%s_%s.spl\" ะธะปะธ \"%s_ascii.spl\" ะฝะต ะผะพะถะต ะดะฐ ัะต "
+"ะฟั€ะพะฝะฐั’ะต"
+
+#, c-format
+msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
+msgstr ""
+"ะฃะฟะพะทะพั€ะตัšะต: ะ›ะธัั‚ะฐ ั€ะตั‡ะธ \"%s.%s.spl\" ะธะปะธ \"%s.ascii.spl\" ะฝะต ะผะพะถะต ะดะฐ ัะต "
+"ะฟั€ะพะฝะฐั’ะต"
+
+msgid "E797: SpellFileMissing autocommand deleted buffer"
+msgstr "E797: SpellFileMissing ะฐัƒั‚ะพะบะพะผะฐะฝะดะฐ ั˜ะต ะพะฑั€ะธัะฐะปะฐ ะฑะฐั„ะตั€"
+
+#, c-format
+msgid "Warning: region %s not supported"
+msgstr "ะฃะฟะพะทะพั€ะตัšะต: ั€ะตะณะธะพะฝ %s ะฝะธั˜ะต ะฟะพะดั€ะถะฐะฝ"
+
+msgid "Sorry, no suggestions"
+msgstr "ะ–ะฐะพ ะฝะฐะผ ั˜ะต, ะฝะตะผะฐ ััƒะณะตัั‚ะธั˜ะฐ"
+
+#, c-format
+msgid "Sorry, only %ld suggestions"
+msgstr "ะ–ะฐะพ ะฝะฐะผ ั˜ะต, ัะฐะผะพ %ld ััƒะณะตัั‚ะธั˜ะฐ"
+
+#, c-format
+msgid "Change \"%.*s\" to:"
+msgstr "ะŸั€ะพะผะตะฝะธั‚ะธ \"%.*s\" ัƒ:"
+
+#, c-format
+msgid " < \"%.*s\""
+msgstr " < \"%.*s\""
+
+msgid "E752: No previous spell replacement"
+msgstr "E752: ะะตะผะฐ ะฟั€ะตั‚ั…ะพะดะฝะต ะฟั€ะฐะฒะพะฟะธัะฝะต ะทะฐะผะตะฝะต"
+
+#, c-format
+msgid "E753: Not found: %s"
+msgstr "E753: ะะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝะพ: %s"
+
+msgid "E758: Truncated spell file"
+msgstr "E758: ะŸั€ะฐะฒะพะฟะธัะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ ั˜ะต ะฟั€ะตะบั€ะฐั›ะตะฝะฐ"
+
+#, c-format
+msgid "Trailing text in %s line %d: %s"
+msgstr "ะขะตะบัั‚ ะฒะธัˆะฐะบ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "Affix name too long in %s line %d: %s"
+msgstr "ะ˜ะผะต ะฝะฐัั‚ะฐะฒะบะฐ ั˜ะต ะฟั€ะตะดัƒะณะฐั‡ะบะพ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+msgid "E761: Format error in affix file FOL, LOW or UPP"
+msgstr "E761: ะ“ั€ะตัˆะบะฐ ั„ะพั€ะผะฐั‚ะฐ ัƒ ะดะฐั‚ะพั‚ะตั†ะธ ะฝะฐัั‚ะฐะฒะฐะบะฐ FOL, LOW ะธะปะธ UPP"
+
+msgid "E762: Character in FOL, LOW or UPP is out of range"
+msgstr "E762: ะšะฐั€ะฐะบั‚ะตั€ ัƒ FOL, LOW ะธะปะธ UPP ั˜ะต ะฒะฐะฝ ะพะฟัะตะณะฐ"
+
+msgid "Compressing word tree..."
+msgstr "ะกั‚ะฐะฑะปะพ ั€ะตั‡ะธ ัะต ะบะพะผะฟั€ะตััƒั˜ะต..."
+
+#, c-format
+msgid "Reading spell file \"%s\""
+msgstr "ะงะธั‚ะฐัšะต ะฟั€ะฐะฒะพะฟะธัะฝะต ะดะฐั‚ะพั‚ะตะบะต \"%s\""
+
+msgid "E757: This does not look like a spell file"
+msgstr "E757: ะžะฒะพ ะฝะต ะธะทะณะปะตะดะฐ ะบะฐะพ ะฟั€ะฐะฒะพะฟะธัะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ"
+
+msgid "E771: Old spell file, needs to be updated"
+msgstr "E771: ะกั‚ะฐั€ะฐ ะฟั€ะฐะฒะพะฟะธัะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ, ะฟะพั‚ั€ะตะฑะฝะพ ั˜ะต ะดะฐ ัะต ะพัะฒะตะถะธ"
+
+msgid "E772: Spell file is for newer version of Vim"
+msgstr "E772: ะŸั€ะฐะฒะพะฟะธัะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ ั˜ะต ะทะฐ ะฝะพะฒะธั˜ัƒ ะฒะตั€ะทะธั˜ัƒ Vim-ะฐ"
+
+msgid "E770: Unsupported section in spell file"
+msgstr "E770: ะะตะฟะพะดั€ะถะฐะฝะฐ ัะตะบั†ะธั˜ะฐ ัƒ ะฟั€ะฐะฒะพะฟะธัะฝะพั˜ ะดะฐั‚ะพั‚ะตั†ะธ"
+
+#, c-format
+msgid "E778: This does not look like a .sug file: %s"
+msgstr "E778: ะžะฒะพ ะฝะต ะธะทะณะปะตะดะฐ ะบะฐะพ .sug ะดะฐั‚ะพั‚ะตะบะฐ: %s"
+
+#, c-format
+msgid "E779: Old .sug file, needs to be updated: %s"
+msgstr "E779: ะกั‚ะฐั€ะฐ .sug ะดะฐั‚ะพั‚ะตะบะฐ, ะฟะพั‚ั€ะตะฑะฝะพ ั˜ะต ะดะฐ ัะต ะพัะฒะตะถะธ: %s"
+
+#, c-format
+msgid "E780: .sug file is for newer version of Vim: %s"
+msgstr "E780: .sug ะดะฐั‚ะพั‚ะตะบะฐ ั˜ะต ะทะฐ ะฝะพะฒะธั˜ัƒ ะฒะตั€ะทะธั˜ัƒ Vim-ะฐ: %s"
+
+#, c-format
+msgid "E781: .sug file doesn't match .spl file: %s"
+msgstr "E781: .sug ะดะฐั‚ะพั‚ะตะบะฐ ะฝะต ะพะดะณะพะฒะฐั€ะฐ .spl ะดะฐั‚ะพั‚ะตั†ะธ: %s"
+
+#, c-format
+msgid "E782: error while reading .sug file: %s"
+msgstr "E782: ะณั€ะตัˆะบะฐ ะฟั€ะธะปะธะบะพะผ ั‡ะธั‚ะฐัšะฐ .sug ะดะฐั‚ะพั‚ะตะบะต: %s"
+
+#, c-format
+msgid "Reading affix file %s..."
+msgstr "ะงะธั‚ะฐัšะต ะดะฐั‚ะพั‚ะตะบะต ะฝะฐัั‚ะฐะฒะฐะบะฐ %s..."
+
+#, c-format
+msgid "Conversion failure for word in %s line %d: %s"
+msgstr "ะะตัƒัะฟะตัˆะฝะฐ ะบะพะฝะฒะตั€ะทะธั˜ะฐ ะทะฐ ั€ะตั‡ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "Conversion in %s not supported: from %s to %s"
+msgstr "ะšะพะฝะฒะตั€ะทะธั˜ะฐ ัƒ %s ะฝะธั˜ะต ะฟะพะดั€ะถะฐะฝะฐ: ะธะท %s ัƒ %s"
+
+#, c-format
+msgid "Conversion in %s not supported"
+msgstr "ะšะพะฝะฒะตั€ะทะธั˜ะฐ ัƒ %s ะฝะธั˜ะต ะฟะพะดั€ะถะฐะฝะฐ"
+
+#, c-format
+msgid "Invalid value for FLAG in %s line %d: %s"
+msgstr "ะะตะฒะฐะถะตั›ะฐ ะฒั€ะตะดะฝะพัั‚ ะทะฐ FLAG ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "FLAG after using flags in %s line %d: %s"
+msgstr "FLAG ะฝะฐะบะพะฝ ะบะพั€ะธัˆั›ะตัšะฐ ะธะฝะดะธะบะฐั‚ะพั€ะฐ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid ""
+"Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line "
+"%d"
+msgstr ""
+"ะ”ะตั„ะธะฝะธัะฐัšะต COMPOUNDFORBIDFLAG ะฝะฐะบะพะฝ PFX ัั‚ะฐะฒะบะต ะผะพะถะต ะดะฐ ะดรข ะฟะพะณั€ะตัˆะฝะต ั€ะตะทัƒะปั‚ะฐั‚ะต "
+"ัƒ %s line %d"
+
+#, c-format
+msgid ""
+"Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line "
+"%d"
+msgstr ""
+"ะ”ะตั„ะธะฝะธัะฐัšะต COMPOUNDPERMITFLAG ะฝะฐะบะพะฝ PFX ัั‚ะฐะฒะบะต ะผะพะถะต ะดะฐ ะดรข ะฟะพะณั€ะตัˆะฝะต ั€ะตะทัƒะปั‚ะฐั‚ะต "
+"ัƒ %s line %d"
+
+#, c-format
+msgid "Wrong COMPOUNDRULES value in %s line %d: %s"
+msgstr "ะŸะพะณั€ะตัˆะฝะฐ COMPOUNDRULES ะฒั€ะตะดะฝะพัั‚ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s"
+msgstr "ะŸะพะณั€ะตัˆะฝะฐ COMPOUNDWORDMAX ะฒั€ะตะดะฝะพัั‚ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "Wrong COMPOUNDMIN value in %s line %d: %s"
+msgstr "ะŸะพะณั€ะตัˆะฝะฐ COMPOUNDMIN ะฒั€ะตะดะฝะพัั‚ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s"
+msgstr "ะŸะพะณั€ะตัˆะฝะฐ COMPOUNDSYLMAX ะฒั€ะตะดะฝะพัั‚ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"
+msgstr "ะŸะพะณั€ะตัˆะฝะฐ CHECKCOMPOUNDPATTERN ะฒั€ะตะดะฝะพัั‚ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "Different combining flag in continued affix block in %s line %d: %s"
+msgstr ""
+"ะ ะฐะทะปะธั‡ะธั‚ ะธะฝะดะธะบะฐั‚ะพั€ ะบะพะผะฑะธะฝะพะฒะฐัšะฐ ัƒ ะฝะฐัั‚ะฐะฒั™ะตะฝะพะผ ะฑะปะพะบัƒ ะฝะฐัั‚ะฐะฒะฐะบะฐ ัƒ %s ะปะธะฝะธั˜ะฐ %d: "
+"%s"
+
+#, c-format
+msgid "Duplicate affix in %s line %d: %s"
+msgstr "ะ”ัƒะฟะปะธะบะฐั‚ ะฝะฐัั‚ะฐะฒะบะฐ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid ""
+"Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s "
+"line %d: %s"
+msgstr ""
+"ะะฐัั‚ะฐะฒะฐะบ ัะต ั‚ะฐะบะพั’ะต ะบะพั€ะธัั‚ะธ ะทะฐ BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST ัƒ %s"
+"ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "Expected Y or N in %s line %d: %s"
+msgstr "ะžั‡ะตะบัƒั˜ะต ัะต Y ะธะปะธ N ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "Broken condition in %s line %d: %s"
+msgstr "ะะตะฟั€ะฐะฒะธะปะฐะฝ ัƒัะปะพะฒ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "Expected REP(SAL) count in %s line %d"
+msgstr "ะžั‡ะตะบัƒั˜ะต ัะต ะฑั€ะพั˜ REP(SAL) ัƒ %s ะปะธะฝะธั˜ะฐ %d"
+
+#, c-format
+msgid "Expected MAP count in %s line %d"
+msgstr "ะžั‡ะตะบัƒั˜ะต ัะต ะฑั€ะพั˜ MAP ัƒ %s ะปะธะฝะธั˜ะฐ %d"
+
+#, c-format
+msgid "Duplicate character in MAP in %s line %d"
+msgstr "ะ”ัƒะฟะปะธะบะฐั‚ ะบะฐั€ะฐะบั‚ะตั€ะฐ ัƒ MAP ัƒ %s ะปะธะฝะธั˜ะฐ %d"
+
+#, c-format
+msgid "Unrecognized or duplicate item in %s line %d: %s"
+msgstr "ะะตะฟั€ะตะฟะพัะฝะฐั‚ะฐ ะธะปะธ ะดัƒะฟะปะฐ ัั‚ะฐะฒะบะฐ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "Missing FOL/LOW/UPP line in %s"
+msgstr "ะะตะดะพัั‚ะฐั˜ะต FOL/LOW/UPP ะปะธะฝะธั˜ะฐ ัƒ %s"
+
+msgid "COMPOUNDSYLMAX used without SYLLABLE"
+msgstr "COMPOUNDSYLMAX ัะต ะบะพั€ะธัั‚ะธ ะฑะตะท SYLLABLE"
+
+msgid "Too many postponed prefixes"
+msgstr "ะŸั€ะตะฒะธัˆะต ะทะฐะบะฐัˆัšะตะฝะธั… ะฟั€ะตั„ะธะบัะฐ"
+
+msgid "Too many compound flags"
+msgstr "ะŸั€ะตะฒะธัˆะต ะธะฝะดะธะบะฐั‚ะพั€ะฐ ัะปะพะถะตะฝะธั†ะฐ"
+
+msgid "Too many postponed prefixes and/or compound flags"
+msgstr "ะŸั€ะตะฒะธัˆะต ะทะฐะบะฐัˆัšะตะฝะธั… ะฟั€ะตั„ะธะบัะฐ ะธ/ะธะปะธ ะธะฝะดะธะบะฐั‚ะพั€ะฐ ัะปะพะถะตะฝะธั†ะฐ"
+
+#, c-format
+msgid "Missing SOFO%s line in %s"
+msgstr "ะะตะดะพัั‚ะฐั˜ะต SOFO%s ะปะธะฝะธั˜ะฐ ัƒ %s"
+
+#, c-format
+msgid "Both SAL and SOFO lines in %s"
+msgstr "ะ˜ SAL ะธ SOFO ะปะธะฝะธั˜ะต ัƒ %s"
+
+#, c-format
+msgid "Flag is not a number in %s line %d: %s"
+msgstr "ะ˜ะฝะดะธะบะฐั‚ะพั€ ะฝะธั˜ะต ะฑั€ะพั˜ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "Illegal flag in %s line %d: %s"
+msgstr "ะะตะฒะฐะถะตั›ะธ ะธะฝะดะธะบะฐั‚ะพั€ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "%s value differs from what is used in another .aff file"
+msgstr ""
+"%s ะฒั€ะตะดะฝะพัั‚ ัะต ั€ะฐะทะปะธะบัƒั˜ะต ะพะด ะพะฝะพะณะฐ ัˆั‚ะพ ั˜ะต ะบะพั€ะธัˆั›ะตะฝะพ ัƒ ะดั€ัƒะณะพั˜ .aff ะดะฐั‚ะพั‚ะตั†ะธ"
+
+#, c-format
+msgid "Reading dictionary file %s..."
+msgstr "ะงะธั‚ะฐัšะต ะดะฐั‚ะพั‚ะตะบะต ั€ะตั‡ะฝะธะบะฐ %s..."
+
+#, c-format
+msgid "E760: No word count in %s"
+msgstr "E760: ะะตะผะฐ ะฑั€ะพั˜ะฐ ั€ะตั‡ะธ ัƒ %s"
+
+#, c-format
+msgid "line %6d, word %6ld - %s"
+msgstr "ะปะธะฝะธั˜ะฐ %6d, ั€ะตั‡ %6ld - %s"
+
+#, c-format
+msgid "Duplicate word in %s line %d: %s"
+msgstr "ะ”ัƒะฟะปะธะบะฐั‚ ั€ะตั‡ะธ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "First duplicate word in %s line %d: %s"
+msgstr "ะŸั€ะฒะฐ ั€ะตั‡ ะดัƒะฟะปะธะบะฐั‚ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "%d duplicate word(s) in %s"
+msgstr "%d ั€ะตั‡(ะธ) ะดัƒะฟะปะธะบะฐั‚(ะฐ) ัƒ %s"
+
+#, c-format
+msgid "Ignored %d word(s) with non-ASCII characters in %s"
+msgstr "ะ˜ะณะฝะพั€ะธัะฐะฝะฐ/ะพ %d ั€ะตั‡(ะธ) ัะฐ ะฝะต-ASCII ะบะฐั€ะฐะบั‚ะตั€ะธะผะฐ ัƒ %s"
+
+#, c-format
+msgid "Reading word file %s..."
+msgstr "ะงะธั‚ะฐัšะต ะดะฐั‚ะพั‚ะตะบะต ั€ะตั‡ะธ %s..."
+
+#, c-format
+msgid "Duplicate /encoding= line ignored in %s line %d: %s"
+msgstr "ะ”ัƒะฟะปะธะบะฐั‚ /encoding= ะปะธะฝะธั˜ะฐ ั˜ะต ะธะณะฝะพั€ะธัะฐะฝะฐ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "/encoding= line after word ignored in %s line %d: %s"
+msgstr "/encoding= ะปะธะฝะธั˜ะฐ ะฝะฐะบะพะฝ ั€ะตั‡ะธ ั˜ะต ะธะณะฝะพั€ะธัะฐะฝะฐ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "Duplicate /regions= line ignored in %s line %d: %s"
+msgstr "ะ”ัƒะฟะปะธะบะฐั‚ /regions= ะปะธะฝะธั˜ะฐ ั˜ะต ะธะณะฝะพั€ะธัะฐะฝะฐ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "Too many regions in %s line %d: %s"
+msgstr "ะŸั€ะตะฒะธัˆะต ั€ะตะณะธะพะฝะฐ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "/ line ignored in %s line %d: %s"
+msgstr "/ ะปะธะฝะธั˜ะฐ ะธะณะฝะพั€ะธัะฐะฝะฐ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "Invalid region nr in %s line %d: %s"
+msgstr "ะะตะฒะฐะถะตั›ะธ ะฑั€ะพั˜ ั€ะตะณะธะพะฝะฐ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "Unrecognized flags in %s line %d: %s"
+msgstr "ะะตะฟั€ะตะฟะพะทะฝะฐั‚ะธ ะธะฝะดะธะบะฐั‚ะพั€ะธ ัƒ %s ะปะธะฝะธั˜ะฐ %d: %s"
+
+#, c-format
+msgid "Ignored %d words with non-ASCII characters"
+msgstr "ะ˜ะณะฝะพั€ะธัะฐะฝะพ ั˜ะต %d ั€ั›ะธ ัะฐ ะฝะต-ASCII ะบะฐั€ะฐะบั‚ะตั€ะธะผะฐ"
+
+msgid "E845: Insufficient memory, word list will be incomplete"
+msgstr "E845: ะะตะดะพะฒะพั™ะฝะพ ะผะตะผะพั€ะธั˜ะต, ะปะธัั‚ะฐ ั€ะตั‡ะธ ะฝะตั›ะต ะฑะธั‚ะธ ะบะพะผะฟะปะตั‚ะฝะฐ"
+
+#, c-format
+msgid "Compressed %d of %d nodes; %d (%d%%) remaining"
+msgstr "ะšะพะผะฟั€ะตัะพะฒะฐะฝะพ ั˜ะต %d ะพะด %d ั‡ะฒะพั€ะพะฒะฐ; ะฟั€ะตะพัั‚ะฐะปะพ ั˜ะต ั˜ะพัˆ %d (%d%%)"
+
+msgid "Reading back spell file..."
+msgstr "ะงะธั‚ะฐัšะต ะฟั€ะฐะฒะพะฟะธัะฝะต ะดะฐั‚ะพั‚ะตะบะต..."
+
+msgid "Performing soundfolding..."
+msgstr "ะ˜ะทะฒะพั’ะตัšะต ัะบะปะฐะฟะฐัšะฐ ะฟะพ ะทะฒัƒั‡ะฝะพัั‚ะธ..."
+
+#, c-format
+msgid "Number of words after soundfolding: %ld"
+msgstr "ะ‘ั€ะพั˜ ั€ะตั‡ะธ ะฝะฐะบะพะฝ ัะบะปะฐะฟะฐัšะฐ ะฟะพ ะทะฒัƒั‡ะฝะพัั‚ะธ: %ld"
+
+#, c-format
+msgid "Total number of words: %d"
+msgstr "ะฃะบัƒะฟะฐะฝ ะฑั€ะพั˜ ั€ะตั‡ะธ: %d"
+
+#, c-format
+msgid "Writing suggestion file %s..."
+msgstr "ะฃะฟะธัะธะฒะฐัšะต ะดะฐั‚ะพั‚ะตะบะต ะฟั€ะตะดะปะพะณะฐ %s..."
+
+#, c-format
+msgid "Estimated runtime memory use: %d bytes"
+msgstr "ะŸั€ะพั†ะตัšะตะฝะฐ ะฟะพั‚ั€ะตะฑะฝะฐ ะฒะตะปะธั‡ะธะฝะฐ ะผะตะผะพั€ะธั˜ะต ัƒ ะฒั€ะตะผะต ะธะทะฒั€ัˆะฐะฒะฐัšะฐ: %d ะฑะฐั˜ั‚ะพะฒะฐ"
+
+msgid "E751: Output file name must not have region name"
+msgstr "E751: ะ˜ะผะต ะธะทะปะฐะทะฝะต ะดะฐั‚ะพั‚ะตะบะต ะฝะต ัะผะต ะดะฐ ะธะผะฐ ะธะผะต ั€ะตะณะธะพะฝะฐ"
+
+#, c-format
+msgid "E754: Only up to %ld regions supported"
+msgstr "E754: ะŸะพะดั€ะถะฐะฝะพ ั˜ะต ัะฐะผะพ ะดะพ %ld ั€ะตะณะธะพะฝะฐ"
+
+#, c-format
+msgid "E755: Invalid region in %s"
+msgstr "E755: ะะตะฒะฐะถะตั›ะธ ั€ะตะณะธะพะฝ ัƒ %s"
+
+msgid "Warning: both compounding and NOBREAK specified"
+msgstr "ะฃะฟะพะทะพั€ะตัšะต: ะฝะฐะฒะตะดะตะฝะธ ััƒ ะธ ัะปะฐะณะฐัšะต ะธ NOBREAK"
+
+#, c-format
+msgid "Writing spell file %s..."
+msgstr "ะฃะฟะธัะธะฒะฐัšะต ะฟั€ะฐะฒะพะฟะธัะฝะต ะดะฐั‚ะพั‚ะตะบะต %s..."
+
+msgid "Done!"
+msgstr "ะ—ะฐะฒั€ัˆะตะฝะพ!"
+
+#, c-format
+msgid "E765: 'spellfile' does not have %ld entries"
+msgstr "E765: 'spellfile' ะฝะต ัะฐะดั€ะถะธ %ld ัั‚ะฐะฒะบะต"
+
+#, c-format
+msgid "Word '%.*s' removed from %s"
+msgstr "ะ ะตั‡ '%.*s' ั˜ะต ัƒะบะปะพัšะตะฝะฐ ะธะท %s"
+
+#, c-format
+msgid "Word '%.*s' added to %s"
+msgstr "ะ ะตั‡ '%.*s' ั˜ะต ะดะพะดะฐั‚ะฐ ัƒ %s"
+
+msgid "E763: Word characters differ between spell files"
+msgstr "E763: ะšะฐั€ะฐะบั‚ะตั€ะธ ัƒ ั€ะตั‡ะธ ัะต ั€ะฐะทะปะธะบัƒั˜ัƒ ะธะทะผะตั’ัƒ ะฟั€ะฐะฒะพะฟะธัะฝะธั… ะดะฐั‚ะพั‚ะตะบะฐ"
+
+msgid "E783: duplicate char in MAP entry"
+msgstr "E783: ะบะฐั€ะฐะบั‚ะตั€ ะดัƒะฟะปะธะบะฐั‚ ัƒ MAP ัั‚ะฐะฒั†ะธ"
+
+msgid "No Syntax items defined for this buffer"
+msgstr "ะ—ะฐ ะพะฑะฐ ั˜ะฑะฐั„ะตั€ ะฝะธััƒ ะดะตั„ะธะฝะธัะฐะฝะต ัะธะฝั‚ะฐะบัะฝะต ัั‚ะฐะฒะบะต"
+
+msgid "syntax conceal on"
+msgstr "ัะบั€ะธะฒะฐัšะต ัะธะฝั‚ะฐะบัะต ัƒะบั™ัƒั‡ะตะฝะพ"
+
+msgid "syntax conceal off"
+msgstr "ัะบั€ะธะฒะฐัšะต ัะธะฝั‚ะฐะบัะต ะธัะบั™ัƒั‡ะตะฝะพ"
+
+#, c-format
+msgid "E390: Illegal argument: %s"
+msgstr "E390: ะะตะฒะฐะถะตั›ะธ ะฐั€ะณัƒะผะตะฝั‚: %s"
+
+msgid "syntax case ignore"
+msgstr "ะผะฐะปะฐ/ะฒะตะปะธะบะฐ ัะปะพะฒะฐ ัะต ะฝะต ั€ะฐะทะปะธะบัƒั˜ัƒ ัƒ ัะธะฝั‚ะฐะบัะธ"
+
+msgid "syntax case match"
+msgstr "ะผะฐะปะฐ/ะฒะตะปะธะบะฐ ัะปะพะฒะฐ ัะต ั€ะฐะทะปะธะบัƒั˜ัƒ ัƒ ัะธะฝั‚ะฐะบัะธ"
+
+msgid "syntax spell toplevel"
+msgstr "ัะธะฝั‚ะฐะบัะฐ ะฟั€ะฐะฒะพะฟะธัะฐ toplevel"
+
+msgid "syntax spell notoplevel"
+msgstr "ัะธะฝั‚ะฐะบัะฐ ะฟั€ะฐะฒะพะฟะธัะฐ notoplevel"
+
+msgid "syntax spell default"
+msgstr "ัะธะฝั‚ะฐะบัะฐ ะฟั€ะฐะฒะพะฟะธัะฐ ะฟะพะดั€ะฐะทัƒะผะตะฒะฐะฝะพ"
+
+msgid "syntax iskeyword "
+msgstr "ัะธะฝั‚ะฐะบัะฐ iskeyword "
+
+#, c-format
+msgid "E391: No such syntax cluster: %s"
+msgstr "E391: ะะต ะฟะพัั‚ะพั˜ะธ ั‚ะฐะบะฐะฒ ัะธะฝั‚ะฐะบัะฝะธ ะบะปะฐัั‚ะตั€: %s"
+
+msgid "syncing on C-style comments"
+msgstr "ัะธะฝั…ั€ะพะฝะธะทะฐั†ะธั˜ะฐ ะฝะฐ ะบะพะผะตะฝั‚ะฐั€ะธะผะฐ C-ัั‚ะธะปะฐ"
+
+msgid "no syncing"
+msgstr "ะฑะตะท ัะธะฝั…ั€ะพะฝะธะทะฐั†ะธั˜ะต"
+
+msgid "syncing starts "
+msgstr "ัะธะฝั…ั€ะพะฝะธะทะฐั†ะธั˜ะฐ ะฟะพั‡ะธัšะต "
+
+msgid " lines before top line"
+msgstr " ะปะธะฝะธั˜ะฐ ะฟั€ะต ะปะธะฝะธั˜ะต ะฝะฐ ะฒั€ั…ัƒ"
+
+msgid ""
+"\n"
+"--- Syntax sync items ---"
+msgstr ""
+"\n"
+"--- ะกั‚ะฐะฒะบะต ัะธะฝั…ั€ะพ ัะธะฝั‚ะฐะบัะต ---"
+
+msgid ""
+"\n"
+"syncing on items"
+msgstr ""
+"\n"
+"ัะธะฝั…ั€ะพ ะฝะฐ ัั‚ะฐะฒะบะฐะผะฐ"
+
+msgid ""
+"\n"
+"--- Syntax items ---"
+msgstr ""
+"\n"
+"--- ะกั‚ะฐะฒะบะต ัะธะฝั‚ะฐะบัะต ---"
+
+#, c-format
+msgid "E392: No such syntax cluster: %s"
+msgstr "E392: ะฝะต ะฟะพัั‚ะพั˜ะธ ั‚ะฐะบะฐะฒ ัะธะฝั‚ะฐะบัะฝะธ ะบะปะฐัั‚ะตั€: %s"
+
+msgid "minimal "
+msgstr "ะผะธะฝะธะผะฐะปะฝะพ "
+
+msgid "maximal "
+msgstr "ะผะฐะบัะธะผะฐะปะฝะพ "
+
+msgid "; match "
+msgstr "; ะฟะพะดัƒะดะฐั€ะฐัšะฐ "
+
+msgid " line breaks"
+msgstr " ะฟั€ะตะปะพะผะฐ ะปะธะฝะธั˜ะต"
+
+msgid "E395: contains argument not accepted here"
+msgstr "E395: ัะฐะดั€ะถะธ ะฐั€ะณัƒะผะตะฝั‚ ะบะพั˜ะธ ัะต ะพะฒะดะต ะฝะต ะฟั€ะธั…ะฒะฐั‚ะฐ"
+
+msgid "E844: invalid cchar value"
+msgstr "E844: ะฝะตะฒะฐะถะตั›ะฐ cchar ะฒั€ะตะดะฝะพัั‚"
+
+msgid "E393: group[t]here not accepted here"
+msgstr "E393: group[t]here ัะต ะพะฒะดะต ะฝะต ะฟั€ะธั…ะฒะฐั‚ะฐ"
+
+#, c-format
+msgid "E394: Didn't find region item for %s"
+msgstr "E394: ะกั‚ะฐะฒะบะฐ ั€ะตะณะธะพะฝะฐ ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝะฐ ะทะฐ %s"
+
+msgid "E397: Filename required"
+msgstr "E397: ะŸะพั‚ั€ะตะฑะฝะพ ะธะผะต ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "E847: Too many syntax includes"
+msgstr "E847: ะŸั€ะตะฒะธัˆะต ัะธะฝั‚ะฐะบัะฝะธั… ัƒะผะตั‚ะฐัšะฐ"
+
+#, c-format
+msgid "E789: Missing ']': %s"
+msgstr "E789: ะะตะดะพัั‚ะฐั˜ะต ']': %s"
+
+#, c-format
+msgid "E890: trailing char after ']': %s]%s"
+msgstr "E890: ะบะฐั€ะฐะบั‚ะตั€ ะฒะธัˆะบะฐ ะฝะฐะบะพะฝ ']': %s]%s"
+
+#, c-format
+msgid "E398: Missing '=': %s"
+msgstr "E398: ะะตะดะพัั‚ะฐั˜ะต '=': %s"
+
+#, c-format
+msgid "E399: Not enough arguments: syntax region %s"
+msgstr "E399: ะะตะผะฐ ะดะพะฒะพั™ะฝะพ ะฐั€ะณัƒะผะตะฝะฐั‚ะฐ: ัะธะฝั‚ะฐะบัะฝะธ ั€ะตะณะธะพะฝ %s"
+
+msgid "E848: Too many syntax clusters"
+msgstr "E848: ะŸั€ะตะฒะธัˆะต ัะธะฝั‚ะฐะบัะฝะธั… ะบะปะฐัั‚ะตั€ะฐ"
+
+msgid "E400: No cluster specified"
+msgstr "E400: ะะธั˜ะต ะฝะฐะฒะตะดะตะฝ ะฝะธั˜ะตะดะฐะฝ ะบะปะฐัั‚ะตั€"
+
+#, c-format
+msgid "E401: Pattern delimiter not found: %s"
+msgstr "E401: ะะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝ ะณั€ะฐะฝะธั‡ะฝะธะบ ัˆะฐะฑะปะพะฝะฐ: %s"
+
+#, c-format
+msgid "E402: Garbage after pattern: %s"
+msgstr "E402: ะกะผะตั›ะต ะฝะฐะบะพะฝ ัˆะฐะฑะปะพะฝะฐ: %s"
+
+msgid "E403: syntax sync: line continuations pattern specified twice"
+msgstr "E403: ัะธะฝั‚ะฐะบัะฝะฐ ัะธะฝั…ั€ะพ: ัˆะฐะฑะปะพะฝ ะฝะฐัั‚ะฐะฒั™ะฐัšะฐ ะปะธะฝะธั˜ะต ั˜ะต ะฝะฐะฒะตะดะตะฝ ะดะฒะฐะฟัƒั‚"
+
+#, c-format
+msgid "E404: Illegal arguments: %s"
+msgstr "E404: ะะตะฒะฐะถะตั›ะธ ะฐั€ะณัƒะผะตะฝั‚ะธ: %s"
+
+#, c-format
+msgid "E405: Missing equal sign: %s"
+msgstr "E405: ะฝะตะดะพัั‚ะฐั˜ะต ะทะฝะฐะบ ั˜ะตะดะฝะฐะบะพัั‚ะธ: %s"
+
+#, c-format
+msgid "E406: Empty argument: %s"
+msgstr "E406: ะŸั€ะฐะทะฐะฝ ะฐั€ะณัƒะผะตะฝั‚: %s"
+
+#, c-format
+msgid "E407: %s not allowed here"
+msgstr "E407: %s ะพะฒะดะต ะฝะธั˜ะต ะดะพะทะฒะพั™ะตะฝะพ"
+
+#, c-format
+msgid "E408: %s must be first in contains list"
+msgstr "E408: %s ะผะพั€ะฐ ะดะฐ ะฑัƒะดะต ะฟั€ะฒะพ ัƒ contains ะปะธัั‚ะธ"
+
+#, c-format
+msgid "E409: Unknown group name: %s"
+msgstr "E409: ะะตะฟะพะทะฝะฐั‚ะพ ะธะผะต ะณั€ัƒะฟะต: %s"
+
+#, c-format
+msgid "E410: Invalid :syntax subcommand: %s"
+msgstr "E410: ะะตะฒะฐะถะตั›ะฐ :syntax ะฟะพะดะบะพะผะฐะฝะดะฐ: %s"
+
+msgid ""
+" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
+msgstr ""
+" ะฃะšะฃะŸะะž ะ‘ะ ะžะˆ ะŸะžะ”ะฃะ” ะะะˆะกะŸะžะ ะ˜ะˆะ• ะŸะ ะžะกะ•ะš ะ˜ะœะ• ะจะะ‘ะ›ะžะ"
+
+msgid "E679: recursive loop loading syncolor.vim"
+msgstr "E679: ะ ะตะบัƒั€ะทะธะฒะฝะฐ ะฟะตั‚ั™ะฐ ะบะพะด ัƒั‡ะธั‚ะฐะฒะฐัšะฐ syncolor.vim"
+
+#, c-format
+msgid "E411: highlight group not found: %s"
+msgstr "E411: ะณั€ัƒะฟะฐ ะธัั‚ะธั†ะฐัšะฐ ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝะฐ: %s"
+
+#, c-format
+msgid "E412: Not enough arguments: \":highlight link %s\""
+msgstr "E412: ะะตะผะฐ ะดะพะฒะพั™ะฝะพ ะฐั€ะณัƒะผะตะฝะฐั‚ะฐ: \":highlight link %s\""
+
+#, c-format
+msgid "E413: Too many arguments: \":highlight link %s\""
+msgstr "E413: ะกัƒะฒะธัˆะต ะฐั€ะณัƒะผะตะฝะฐั‚ะฐ: \":highlight link %s\""
+
+msgid "E414: group has settings, highlight link ignored"
+msgstr "E414: ะณั€ัƒะฟะฐ ะธะผะฐ ะฟะพัั‚ะฐะฒะบะต, highlight link ัะต ะธะณะฝะพั€ะธัˆะต"
+
+#, c-format
+msgid "E415: unexpected equal sign: %s"
+msgstr "E415: ะฝะตะพั‡ะบะธะฒะฐะฝ ะทะฝะฐะบ ั˜ะตะดะฝะฐะบะพัั‚ะธ: %s"
+
+#, c-format
+msgid "E416: missing equal sign: %s"
+msgstr "E416: ะฝะตะดะพัั‚ะฐั˜ะต ะทะฝะฐะบ ั˜ะตะดะฝะฐะบะพัั‚ะธ: %s"
+
+#, c-format
+msgid "E417: missing argument: %s"
+msgstr "E417: ะฝะตะดะพัั‚ะฐั˜ะต ะฐั€ะณัƒะผะตะฝั‚: %s"
+
+#, c-format
+msgid "E418: Illegal value: %s"
+msgstr "E418: ะะตะฒะฐะถะตั›ะฐ ะฒั€ะตะดะฝะพัั‚: %s"
+
+msgid "E419: FG color unknown"
+msgstr "E419: ะะตะฟะพะทะฝะฐั‚ะฐ FG ะฑะพั˜ะฐ"
+
+msgid "E420: BG color unknown"
+msgstr "E420: ะะตะฟะพะทะฝะฐั‚ะฐ BG ะฑะพั˜ะฐ"
+
+#, c-format
+msgid "E421: Color name or number not recognized: %s"
+msgstr "E421: ะ˜ะผะต ะฑะพั˜ะต ะธะปะธ ะฑั€ะพั˜ ะฝะธััƒ ะฟั€ะตะฟะพะทะฝะฐั‚ะธ: %s"
+
+#, c-format
+msgid "E422: terminal code too long: %s"
+msgstr "E422: ะบะพะด ั‚ะตั€ะผะธะฝะฐะปะฐ ั˜ะต ะฟั€ะตะดัƒะณะฐั‡ะฐะบ: %s"
+
+#, c-format
+msgid "E423: Illegal argument: %s"
+msgstr "E423: ะะตะฒะฐะถะตั›ะธ ะฐั€ะณัƒะผะตะฝั‚: %s"
+
+msgid "E424: Too many different highlighting attributes in use"
+msgstr "E424: ะฃ ัƒะฟะพั‚ั€ะตะฑะธ ั˜ะต ะฟั€ะตะฒะธัˆะต ั€ะฐะทะปะธั‡ะธั‚ะธั… ะฐั‚ั€ะธะฑัƒั‚ะฐ ะธัั‚ะธั†ะฐัšะฐ"
+
+msgid "E669: Unprintable character in group name"
+msgstr "E669: ะฃ ะธะผะตะฝัƒ ะณั€ัƒะฟะต ั˜ะต ะบะฐั€ะฐะบั‚ะตั€ ะบะพั˜ะธ ะฝะต ะผะพะถะต ะดะฐ ัะต ัˆั‚ะฐะผะฟะฐ"
+
+msgid "W18: Invalid character in group name"
+msgstr "W18: ะะตะฒะฐะถะตั›ะธ ะบะฐั€ะฐะบั‚ะตั€ ัƒ ะธะผะตะฝัƒ ะณั€ัƒะฟะต"
+
+msgid "E849: Too many highlight and syntax groups"
+msgstr "E849: ะŸั€ะตะฒะธัˆะต ัะธะฝั‚ะฐะบัะฝะธั… ะธ ะณั€ัƒะฟะฐ ะธัั‚ะธั†ะฐัšะฐ"
+
+msgid "E555: at bottom of tag stack"
+msgstr "E555: ะฝะฐ ะดะฝัƒ ัั‚ะตะบะฐ ะพะทะฝะฐะบะฐ"
+
+msgid "E556: at top of tag stack"
+msgstr "E556: ะฝะฐ ะฒั€ั…ัƒ ัั‚ะตะบะฐ ะพะทะฝะฐะบะฐ"
+
+msgid "E425: Cannot go before first matching tag"
+msgstr "E425: ะะต ะผะพะถะต ะดะฐ ัะต ะธะดะต ะธัะฟั€ะตะด ะฟั€ะฒะต ะฟะพะดัƒะดะฐั€ะฐั˜ัƒั›ะต ะพะทะฝะฐะบะต"
+
+#, c-format
+msgid "E426: tag not found: %s"
+msgstr "E426: ะพะทะฝะฐะบะฐ ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝะฐ: %s"
+
+msgid " # pri kind tag"
+msgstr " # ะพะทะฝะฐะบะฐ pri ะฒั€ัั‚ะต"
+
+msgid "file\n"
+msgstr "ะดะฐั‚ะพั‚ะตะบะฐ\n"
+
+msgid "E427: There is only one matching tag"
+msgstr "E427: ะŸะพัั‚ะพั˜ะธ ัะฐะผะพ ั˜ะตะดะฝะฐ ะฟะพะดัƒะดะฐั€ะฐั˜ัƒั›ะฐ ะพะทะฝะฐะบะฐ"
+
+msgid "E428: Cannot go beyond last matching tag"
+msgstr "E428: ะะต ะผะพะถะต ะดะฐ ัะต ะธะดะต ะธะทะฐ ะฟะพัะปะตะดัšะต ะฟะพะดัƒะดะฐั€ะฐั˜ัƒั›ะต ะพะทะฝะฐะบะต"
+
+#, c-format
+msgid "File \"%s\" does not exist"
+msgstr "ะ”ะฐั‚ะพั‚ะตะบะฐ \"%s\" ะฝะต ะฟะพัั‚ะพั˜ะธ"
+
+#, c-format
+msgid "tag %d of %d%s"
+msgstr "ะพะทะฝะฐะบะฐ %d ะพะด %d%s"
+
+msgid " or more"
+msgstr " ะธะปะธ ะฒะธัˆะต"
+
+msgid " Using tag with different case!"
+msgstr " ะšะพั€ะธัั‚ะธ ัะต ะพะทะฝะฐะบะฐ ะทะฐ ะดั€ัƒะณะพะผ ะฒั€ัั‚ะพะผ ัะปะพะฒะฐ (ะผะฐะปะฐ/ะฒะตะปะธะบะฐ)!"
+
+#, c-format
+msgid "E429: File \"%s\" does not exist"
+msgstr "E429: ะ”ะฐั‚ะพั‚ะตะบะฐ \"%s\" ะฝะต ะฟะพัั‚ะพั˜ะธ"
+
+msgid ""
+"\n"
+" # TO tag FROM line in file/text"
+msgstr ""
+"\n"
+" # ะะ ะพะทะฝะฐะบะฐ ะžะ” ะปะธะฝะธั˜ะต ัƒ ะดะฐั‚ะพั‚/ั‚ะตะบัั‚"
+
+#, c-format
+msgid "Searching tags file %s"
+msgstr "ะŸั€ะตั‚ั€ะฐะถะธะฒะฐัšะต ะดะฐั‚ะพั‚ะตะบะต ะพะทะฝะฐะบะฐ %s"
+
+#, c-format
+msgid "E430: Tag file path truncated for %s\n"
+msgstr "E430: ะŸัƒั‚ะฐัšะฐ ะดะฐั‚ะพั‚ะตะบะต ะพะทะฝะฐะบะฐ ั˜ะต ะฟั€ะตะบะธะฝัƒั‚ะฐ ะทะฐ %s\n"
+
+msgid "Ignoring long line in tags file"
+msgstr "ะ”ัƒะณะฐั‡ะบะฐ ะปะธะฝะธั˜ะฐ ัƒ ะดะฐั‚ะพั‚ะตั†ะธ ะพะทะฝะฐะบะฐ ัะต ะธะณะฝะพั€ะธัˆะต"
+
+#, c-format
+msgid "E431: Format error in tags file \"%s\""
+msgstr "E431: ะ“ั€ะตัˆะบะฐ ั„ะพั€ะผะฐั‚ะฐ ัƒ ะดะฐั‚ะพั‚ะตั†ะธ ะพะทะฝะฐะบะฐ \"%s\""
+
+#, c-format
+msgid "Before byte %ld"
+msgstr "ะŸั€ะต ะฑะฐั˜ั‚ะฐ %ld"
+
+#, c-format
+msgid "E432: Tags file not sorted: %s"
+msgstr "E432: ะ”ะฐั‚ะพั‚ะตะบะฐ ะพะทะฝะฐะบะฐ ะฝะธั˜ะต ัะพั€ั‚ะธั€ะฐะฝะฐ: %s"
+
+msgid "E433: No tags file"
+msgstr "E433: ะะตะผะฐ ะดะฐั‚ะพั‚ะตะบะต ะพะทะฝะฐะบะฐ"
+
+msgid "E434: Can't find tag pattern"
+msgstr "E434: ะะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะฝะฐั’ะต ัˆะฐะฑะปะพะฝ ะพะทะฝะฐะบะต"
+
+msgid "E435: Couldn't find tag, just guessing!"
+msgstr "E435: ะžะทะฝะฐะบะฐ ะฝะธั˜ะต ะผะพะณะปะฐ ะดะฐ ัะต ะฟั€ะพะฝะฐั’ะต, ัะฐะผะพ ะฝะฐะณะฐั’ะฐะผ!"
+
+#, c-format
+msgid "Duplicate field name: %s"
+msgstr "ะ”ัƒะฟะปะพ ะธะผะต ะฟะพั™ะฐ: %s"
+
+msgid "' not known. Available builtin terminals are:"
+msgstr "' ะฝะธั˜ะต ะฟะพะทะฝะฐั‚. ะ”ะพัั‚ัƒะฟะฝะธ ัƒะณั€ะฐั’ะตะฝะธ ั‚ะตั€ะผะธะฝะฐะปะธ ััƒ:"
+
+msgid "defaulting to '"
+msgstr "ะฟะพะดั€ะฐะทัƒะผะตะฒะฐ ัะต '"
+
+msgid "E557: Cannot open termcap file"
+msgstr "E557: termcap ะดะฐั‚ะพั‚ะตะบะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ"
+
+msgid "E558: Terminal entry not found in terminfo"
+msgstr "E558: ะฃ terminfo ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝะฐ ัั‚ะฐะฒะบะฐ ะทะฐ ั‚ะตั€ะผะธะฝะฐะป"
+
+msgid "E559: Terminal entry not found in termcap"
+msgstr "E559: ะฃ termcap ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝะฐ ัั‚ะฐะฒะบะฐ ั‚ะตั€ะผะธะฝะฐะปะฐ"
+
+#, c-format
+msgid "E436: No \"%s\" entry in termcap"
+msgstr "E436: ะะตะผะฐ \"%s\" ัั‚ะฐะฒะบะต ัƒ termcap"
+
+msgid "E437: terminal capability \"cm\" required"
+msgstr "E437: ะฟะพั‚ั€ะตะฑะฝะฐ ั˜ะต ะผะพะณัƒั›ะฝะพัั‚ ั‚ะตั€ะผะธะฝะฐะปะฐ \"cm\""
+
+msgid ""
+"\n"
+"--- Terminal keys ---"
+msgstr ""
+"\n"
+"--- ะขะฐัั‚ะตั€ะธ ั‚ะตั€ะผะธะฝะฐะปะฐ ---"
+
+msgid "Cannot open $VIMRUNTIME/rgb.txt"
+msgstr "ะะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ $VIMRUNTIME/rgb.txt"
+
+#, c-format
+msgid "Kill job in \"%s\"?"
+msgstr "ะ”ะฐ ะปะธ ะดะฐ ัะต ัƒะฝะธัˆั‚ะธ ะทะฐะดะฐั‚ะฐะบ ัƒ \"%s\"?"
+
+msgid "Terminal"
+msgstr "ะขะตั€ะผะธะฝะฐะป"
+
+msgid "Terminal-finished"
+msgstr "ะขะตั€ะผะธะฝะฐะป-ะทะฐะฒั€ัˆะตะฝ"
+
+msgid "active"
+msgstr "aktivan"
+
+msgid "running"
+msgstr "ั€ะฐะดะธ"
+
+msgid "finished"
+msgstr "ะทะฐะฒั€ัˆะตะฝ"
+
+#, c-format
+msgid "E953: File exists: %s"
+msgstr "E953: ะ”ะฐั‚ะพั‚ะตะบะฐ ะฒะตั› ะฟะพัั‚ะพั˜ะธ: %s"
+
+msgid "E955: Not a terminal buffer"
+msgstr "E955: ะะธั˜ะต ั‚ะตั€ะผะธะฝะฐะปัะบะธ ะฑะฐั„ะตั€"
+
+msgid "new shell started\n"
+msgstr "ะฟะพะบั€ะตะฝัƒั‚ะพ ะฝะพะฒะพ ะบะพะผะฐะฝะดะฝะพ ะพะบั€ัƒะถะตัšะต\n"
+
+msgid "Vim: Error reading input, exiting...\n"
+msgstr "Vim: ะ“ั€ะตัˆะบะฐ ะฟั€ะธ ั‡ะธั‚ะฐัšัƒ ัƒะปะฐะทะฐ, ะธะทะปะฐะทะฐะบ...\n"
+
+msgid "Used CUT_BUFFER0 instead of empty selection"
+msgstr "ะฃะผะตัั‚ะพ ะฟั€ะฐะทะฝะต ัะตะปะตะบั†ะธั˜ะต ะบะพั€ะธั›ะตะฝ ั˜ะต CUT_BUFFER0"
+
+msgid "E881: Line count changed unexpectedly"
+msgstr "E881: ะ‘ั€ะพั˜ ะปะธะฝะธั˜ะฐ ัะต ะฝะตะพั‡ะตะบะธะฒะฐะฝะพ ะฟั€ะพะผะตะฝะธะพ"
+
+msgid "No undo possible; continue anyway"
+msgstr "ะะธั˜ะต ะผะพะณัƒั› ะพะฟะพะทะธะฒ; ะธะฟะฐะบ ะฝะฐัั‚ะฐะฒะธ"
+
+#, c-format
+msgid "E828: Cannot open undo file for writing: %s"
+msgstr "E828: ะ”ะฐั‚ะพั‚ะตะบะฐ ะพะฟะพะทะธะฒะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ ะทะฐ ัƒะฟะธั: %s"
+
+#, c-format
+msgid "E825: Corrupted undo file (%s): %s"
+msgstr "E825: ะ˜ัะบะฒะฐั€ะตะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ ะทะฐ ะพะฟะพะทะธะฒ (%s): %s"
+
+msgid "Cannot write undo file in any directory in 'undodir'"
+msgstr ""
+"ะ”ะฐั‚ะพั‚ะตะบะฐ ะทะฐ ะพะฟะพะทะธะฒ ะฝะต ะผะพะถะต ะดะฐ ัะต ัƒะฟะธัˆะต ะฝะธ ัƒ ั˜ะตะดะฐะฝ ะดะธั€ะตะบั‚ะพั€ะธั˜ัƒะผ ะธะท 'undodir'"
+
+#, c-format
+msgid "Will not overwrite with undo file, cannot read: %s"
+msgstr ""
+"ะะตั›ะต ัะต ะฒั€ัˆะธั‚ะธ ะฟั€ะตะฟะธัะธะฒะฐัšะต ัะฐ ะดะฐั‚ะพั‚ะตะบะพะผ ะพะฟะพะทะธะฒะฐ, ั‡ะธั‚ะฐัšะต ะฝะธั˜ะต ะผะพะณัƒั›ะต: %s"
+
+#, c-format
+msgid "Will not overwrite, this is not an undo file: %s"
+msgstr "ะะตั›ะต ัะต ั†ั€ัˆะธั‚ะธ ะฟั€ะตะฟะธัะธะฒะฐัšะต, ะพะฒะพ ะฝะธั˜ะต ะดะฐั‚ะพั‚ะตะบะฐ ะทะฐ ะพะฟะพะทะธะฒ: %s"
+
+msgid "Skipping undo file write, nothing to undo"
+msgstr "ะŸั€ะตัะบะฐะบะฐัšะต ัƒะฟะธัะฐ ัƒ ะดะฐั‚ะพั‚ะตะบัƒ ะทะฐ ะพะฟะพะทะธะฒ, ะฝะตะผะฐ ัˆั‚ะฐ ะดะฐ ัะต ะพะฟะพะทะพะฒะต"
+
+#, c-format
+msgid "Writing undo file: %s"
+msgstr "ะฃะฟะธั ะดะฐั‚ะพั‚ะตะบะต ะทะฐ ะพะฟะพะทะธะฒ: %s"
+
+#, c-format
+msgid "E829: write error in undo file: %s"
+msgstr "E829: ะณั€ะตัˆะบะฐ ะบะพะด ัƒะฟะธัะฐ ัƒ ะดะฐั‚ะพั‚ะตะบัƒ ะทะฐ ะพะฟะพะทะธะฒ: %s"
+
+#, c-format
+msgid "Not reading undo file, owner differs: %s"
+msgstr "ะ”ะฐั‚ะพั‚ะตะบะฐ ะทะฐ ะพะฟะพะทะธะฒ ัะต ะฝะต ั‡ะธั‚ะฐ, ะฒะปะฐัะฝะธะบ ัะต ั€ะฐะทะปะธะบัƒั˜ะต: %s"
+
+#, c-format
+msgid "Reading undo file: %s"
+msgstr "ะงะธั‚ะฐัšะต ะดะฐั‚ะพั‚ะตะบะต ะทะฐ ะพะฟะพะทะธะฒ: %s"
+
+#, c-format
+msgid "E822: Cannot open undo file for reading: %s"
+msgstr "E822: ะ”ะฐั‚ะพั‚ะตะบะฐ ะทะฐ ะพะฟะพะทะธะฒ ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ ะทะฐ ั‡ะธั‚ะฐัšะต: %s"
+
+#, c-format
+msgid "E823: Not an undo file: %s"
+msgstr "E823: ะะธั˜ะต ะดะฐั‚ะพั‚ะตะบะฐ ะทะฐ ะพะฟะพะทะธะฒ: %s"
+
+#, c-format
+msgid "E832: Non-encrypted file has encrypted undo file: %s"
+msgstr ""
+"E832: ะ”ะฐั‚ะพั‚ะตะบะฐ ะบะพั˜ะฐ ะฝะธั˜ะต ัˆะธั„ั€ะพะฒะฐะฝะฐ ะธะผะฐ ัˆะธั„ั€ะพะฒะฐะฝัƒ ะดะฐั‚ะพั‚ะตะบัƒ ะทะฐ ะพะฟะพะทะธะฒ: %s"
+
+#, c-format
+msgid "E826: Undo file decryption failed: %s"
+msgstr "E826: ะ”ะตัˆะธั„ั€ะพะฒะฐัšะต ะดะฐั‚ะพั‚ะตะบะต ะทะฐ ะพะฟะพะทะธะฒ ะฝะธั˜ะต ัƒัะฟะตะปะพ: %s"
+
+#, c-format
+msgid "E827: Undo file is encrypted: %s"
+msgstr "E827: ะ”ะฐั‚ะพั‚ะตะบะฐ ะทะฐ ะพะฟะพะทะธะฒ ั˜ะต ัˆะธั„ั€ะพะฒะฐะฝะฐ: %s"
+
+#, c-format
+msgid "E824: Incompatible undo file: %s"
+msgstr "E824: ะะตะบะพะผะฟะฐั‚ะธะฑะธะปะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ ะทะฐ ะพะฟะพะทะธะฒ: %s"
+
+msgid "File contents changed, cannot use undo info"
+msgstr ""
+"ะกะฐะดั€ะถะฐั˜ ะดะฐั‚ะพั‚ะตะบะต ั˜ะต ะฟั€ะพะผะตัšะตะฝ, ะธะฝั„ะพั€ะผะฐั†ะธั˜ะต ะทะฐ ะพะฟะพะทะธะฒ ะฝะต ะผะพะณัƒ ะดะฐ ัะต ะบะพั€ะธัั‚ะต"
+
+#, c-format
+msgid "Finished reading undo file %s"
+msgstr "ะขะฐะฒั€ัˆะตะฝะพ ั˜ะต ั‡ะธั‚ะฐัšะต ะดะฐั‚ะพั‚ะตะบะต ะทะฐ ะพะฟะพะทะธะฒ %s"
+
+msgid "Already at oldest change"
+msgstr "ะ’ะตั› ัั‚ะต ะฝะฐ ะฝะฐั˜ัั‚ะฐั€ะธั˜ะพั˜ ะธะทะผะตะฝะธ"
+
+msgid "Already at newest change"
+msgstr "ะ’ะตั› ัั‚ะต ะฝะฐ ะฝะฐั˜ะฝะพะฒะธั˜ะพั˜ ะธะทะผะตะฝะธ"
+
+#, c-format
+msgid "E830: Undo number %ld not found"
+msgstr "E830: ะ‘ั€ะพั˜ ะพะฟะพะทะธะฒะฐ %ld ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝ"
+
+msgid "E438: u_undo: line numbers wrong"
+msgstr "E438: u_undo: ะฟะพะณั€ะตัˆะฝะธ ะฑั€ะพั˜ะตะฒะธ ะปะธะฝะธั˜ะต"
+
+msgid "more line"
+msgstr "ะปะธะฝะธั˜ะฐ ะฒะธัˆะต"
+
+msgid "more lines"
+msgstr "ะปะธะฝะธั˜ะฐ ะฒะธัˆะต"
+
+msgid "line less"
+msgstr "ะปะธะฝะธั˜ะฐ ะผะฐัšะต"
+
+msgid "fewer lines"
+msgstr "ะปะธะฝะธั˜ะฐ ะผะฐัšะต"
+
+msgid "change"
+msgstr "ะธะทะผะตะฝะฐ"
+
+msgid "changes"
+msgstr "ะธะทะผะตะฝะฐ"
+
+#, c-format
+msgid "%ld %s; %s #%ld %s"
+msgstr "%ld %s; %s #%ld %s"
+
+msgid "before"
+msgstr "ะฟั€ะต"
+
+msgid "after"
+msgstr "ะฝะฐะบะพะฝ"
+
+msgid "Nothing to undo"
+msgstr "ะะธัˆั‚ะฐ ะทะฐ ะพะฟะพะทะธะฒ"
+
+msgid "number changes when saved"
+msgstr "ะฑั€ะพั˜ ะธะทะผะตะฝะต ะบะฐะดะฐ ัะฐั‡ัƒะฒะฐะฝะพ"
+
+#, c-format
+msgid "%ld seconds ago"
+msgstr "ะฟั€ะต %ld ัะตะบัƒะฝะดะธ"
+
+msgid "E790: undojoin is not allowed after undo"
+msgstr "E790: undojoin ะธั˜ะต ะดะพะทะฒะพั™ะตะฝ ะฝะฐะบะพะฝ undo"
+
+msgid "E439: undo list corrupt"
+msgstr "E439: ะปะธัั‚ะฐ ะพะฟะพะทะธะฒะฐ ั˜ะต ะธัะบะฒะฐั€ะตะฝะฐ"
+
+msgid "E440: undo line missing"
+msgstr "E440: ะฝะตะดะพัั‚ะฐั˜ะต ะปะธะฝะธั˜ะฐ ะพะฟะพะทะธะฒะฐ"
+
+#, c-format
+msgid "E122: Function %s already exists, add ! to replace it"
+msgstr "E122: ะคัƒะฝะบั†ะธั˜ะฐ %s ะฒะตั› ะฟะพัั‚ะพั˜ะธ, ะดะพะดะฐั˜ั‚ะต ! ะดะฐ ั˜ะต ะทะฐะผะตะฝะธั‚ะต"
+
+msgid "E717: Dictionary entry already exists"
+msgstr "E717: ะฃะฝะพั ะฒะตั› ะฟะพัั‚ะพั˜ะธ ัƒ ั€ะตั‡ะฝะธะบัƒ"
+
+msgid "E718: Funcref required"
+msgstr "E718: ะŸะพั‚ั€ะตะฑะฝะฐ funcref"
+
+#, c-format
+msgid "E130: Unknown function: %s"
+msgstr "E130: ะะตะฟะพะทะฝะฐั‚ะฐ ั„ัƒะฝะบั†ะธั˜ะฐ: %s"
+
+#, c-format
+msgid "E125: Illegal argument: %s"
+msgstr "E125: ะะตะฒะฐะถะตั›ะธ ะฐั€ะณัƒะผะตะฝั‚: %s"
+
+#, c-format
+msgid "E853: Duplicate argument name: %s"
+msgstr "E853: ะ˜ะผะต ะฐั€ะณัƒะผะตะฝั‚ะฐ ั˜ะต ะดัƒะฟะปะธั€ะฐะฝะพ: %s"
+
+#, c-format
+msgid "E740: Too many arguments for function %s"
+msgstr "E740: ะŸั€ะตะฒะธัˆะต ะฐั€ะณัƒะผะตะฝะฐั‚ะฐ ะทะฐ ั„ัƒะฝะบั†ะธั˜ัƒ %s"
+
+#, c-format
+msgid "E116: Invalid arguments for function %s"
+msgstr "E116: ะะตะฒะฐะถะตั›ะธ ะฐั€ะณัƒะผะตะฝั‚ะธ ะทะฐ ั„ัƒะฝะบั†ะธั˜ัƒ %s"
+
+msgid "E132: Function call depth is higher than 'maxfuncdepth'"
+msgstr "E132: ะ”ัƒะฑะธะฝะฐ ะฟะพะทะธะฒะฐ ั„ัƒะฝะบั†ะธั˜ะต ั˜ะต ะฒะตั›ะฐ ะพะด 'maxfuncdepth'"
+
+#, c-format
+msgid "calling %s"
+msgstr "ะฟะพะทะธะฒะฐ ัะต %s"
+
+#, c-format
+msgid "%s aborted"
+msgstr "%s ั˜ะต ะฟั€ะตะบะธะฝัƒั‚ะฐ"
+
+#, c-format
+msgid "%s returning #%ld"
+msgstr "%s ะฒั€ะฐั›ะฐ #%ld"
+
+#, c-format
+msgid "%s returning %s"
+msgstr "%s ะฒั€ะฐั›ะฐ %s"
+
+msgid "E699: Too many arguments"
+msgstr "E699: ะกัƒะฒะธัˆะต ะฐั€ะณัƒะผะตะฝะฐั‚ะฐ"
+
+#, c-format
+msgid "E117: Unknown function: %s"
+msgstr "E117: ะะตะฟะพะทะฝะฐั‚ะฐ ั„ัƒะฝะบั†ะธั˜ะฐ: %s"
+
+#, c-format
+msgid "E933: Function was deleted: %s"
+msgstr "E933: ะคัƒะฝะบั†ะธั˜ะฐ ั˜ะต ะพะฑั€ะธัะฐะฝะฐ: %s"
+
+#, c-format
+msgid "E119: Not enough arguments for function: %s"
+msgstr "E119: ะะตะผะฐ ะดะพะฒะพั™ะฝะพ ะฐั€ะณัƒะผะตะฝะฐั‚ะฐ ะทะฐ ั„ัƒะฝะบั†ะธั˜ัƒ: %s"
+
+#, c-format
+msgid "E120: Using <SID> not in a script context: %s"
+msgstr "E120: ะšะพั€ะธัˆั›ะตัšะต <SID> ะฒะฐะฝ ัะบั€ะธะฟั‚ ะบะพะฝั‚ะตะบัั‚ะฐ: %s"
+
+#, c-format
+msgid "E725: Calling dict function without Dictionary: %s"
+msgstr "E725: ะŸะพะทะธะฒะฐัšะต dict ั„ัƒะฝะบั†ะธั˜ะต ะฑะตะท ะ ะตั‡ะฝะธะบะฐ: %s"
+
+msgid "E129: Function name required"
+msgstr "E129: ะŸะพั‚ั€ะตะฑะฝะพ ั˜ะต ะธะผะต ั„ัƒะฝะบั†ะธั˜ะต"
+
+#, c-format
+msgid "E128: Function name must start with a capital or \"s:\": %s"
+msgstr "E128: ะ˜ะผะต ั„ัƒะฝะบั†ะธั˜ะต ะผะพั€ะฐ ะดะฐ ะฟะพั‡ะฝะต ะฒะตะปะธะบะธะผ ัะปะพะฒะพะผ ะธะปะธ \"s:\": %s"
+
+#, c-format
+msgid "E884: Function name cannot contain a colon: %s"
+msgstr "E884: ะ˜ะผะต ั„ัƒะฝะบั†ะธั˜ะต ะฝะต ะผะพะถะต ะดะฐ ัะฐะดั€ะถะธ ะดะฒะพั‚ะฐั‡ะบัƒ: %s"
+
+#, c-format
+msgid "E123: Undefined function: %s"
+msgstr "E123: ะะตะดะตั„ะธะฝะธัะฐะฝะฐ ั„ัƒะฝะบั†ะธั˜ะฐ: %s"
+
+#, c-format
+msgid "E124: Missing '(': %s"
+msgstr "E124: ะะตะดะพัั‚ะฐั˜ะต '(': %s"
+
+msgid "E862: Cannot use g: here"
+msgstr "E862: g: ะฝะต ะผะพะถะต ะพะฒะดะต ะดะฐ ัะต ะบะพั€ะธัั‚ะธ"
+
+#, c-format
+msgid "E932: Closure function should not be at top level: %s"
+msgstr "E932: ะ—ะฐั‚ะฒะฐั€ะฐั˜ัƒั›ะฐ ั„ัƒะฝะบั†ะธั˜ะฐ ะฝะต ะฑะธ ั‚ั€ะตะฑะฐะปะพ ะดะฐ ะฑัƒะดะต ะฝะฐ ะฝะฐั˜ะฒะธัˆะตะผ ะฝะธะฒะพัƒ: %s"
+
+msgid "E126: Missing :endfunction"
+msgstr "E126: ะะตะดะพัั‚ะฐั˜ะต :endfunction"
+
+#, c-format
+msgid "W22: Text found after :endfunction: %s"
+msgstr "W22: ะŸั€ะพะฝะฐั’ะตะฝ ั‚ะตะบัั‚ ะฝะฐะบะพะฝ :endfunction: %s"
+
+#, c-format
+msgid "E707: Function name conflicts with variable: %s"
+msgstr "E707: ะ˜ะผะต ั„ัƒะฝะบั†ะธั˜ะต ั˜ะต ัƒ ะบะพะฝั„ะปะธะบั‚ัƒ ัะฐ ะฟั€ะพะผะตะฝั™ะธะฒะพะผ: %s"
+
+#, c-format
+msgid "E127: Cannot redefine function %s: It is in use"
+msgstr "E127: ะคัƒะฝะบั†ะธั˜ะฐ %s ะฝะต ะผะพะถะต ะดะฐ ัะต ั€ะตะดะตั„ะธะฝะธัˆะต: ะขั€ะตะฝัƒั‚ะฝะพ ัะต ะบะพั€ะธัั‚ะธ"
+
+#, c-format
+msgid "E746: Function name does not match script file name: %s"
+msgstr "E746: ะ˜ะผะต ั„ัƒะฝะบั†ะธั˜ะต ัะต ะฝะต ะฟะพะบะปะฐะฟะฐ ัะฐ ะธะผะตะฝะพะผ ัะบั€ะธะฟั‚ ะดะฐั‚ะพั‚ะตะบะต: %s"
+
+#, c-format
+msgid "E131: Cannot delete function %s: It is in use"
+msgstr "E131: ะคัƒะฝะบั†ะธั˜ะฐ %s ะฝะต ะผะพะถะต ะดะฐ ัะต ะพะฑั€ะธัˆะต: ะขั€ะตะฝัƒั‚ะฝะพ ัะต ะบะพั€ะธัั‚ะธ"
+
+msgid "E133: :return not inside a function"
+msgstr "E133: :return ะฝะธั˜ะต ัƒะฝัƒั‚ะฐั€ ั„ัƒะฝะบั†ะธั˜ะต"
+
+#, c-format
+msgid "E107: Missing parentheses: %s"
+msgstr "E107: ะะตะดะพัั‚ะฐั˜ัƒ ะทะฐะณั€ะฐะดะต: %s"
+
+msgid ""
+"\n"
+"MS-Windows 64-bit GUI version"
+msgstr ""
+"\n"
+"MS-Windows 64-ะฑะธั‚ะฝะฐ GUI ะฒะตั€ะทะธั˜ะฐ"
+
+msgid ""
+"\n"
+"MS-Windows 32-bit GUI version"
+msgstr ""
+"\n"
+"MS-Windows 32-ะฑะธั‚ะฝะฐ GUI ะฒะตั€ะทะธั˜ะฐ"
+
+msgid " with OLE support"
+msgstr " ัะฐ OLE ะฟะพะดั€ัˆะบะพะผ"
+
+msgid ""
+"\n"
+"MS-Windows 64-bit console version"
+msgstr ""
+"\n"
+"MS-Windows 64-ะฑะธั‚ะฝะฐ ะบะพะฝะทะพะปะฝะฐ ะฒะตั€ะทะธั˜ะฐ"
+
+msgid ""
+"\n"
+"MS-Windows 32-bit console version"
+msgstr ""
+"\n"
+"MS-Windows 32-ะฑะธั‚ะฝะฐ ะบะพะฝะทะพะปะฝะฐ ะฒะตั€ะทะธั˜ะฐ"
+
+msgid ""
+"\n"
+"macOS version"
+msgstr ""
+"\n"
+"macOS ะฒะตั€ะทะธั˜ะฐ"
+
+msgid ""
+"\n"
+"macOS version w/o darwin feat."
+msgstr ""
+"\n"
+"macOS ะฒะตั€ะทะธั˜ะฐ ะฑะตะท darwin ะผะพะณัƒั›."
+
+msgid ""
+"\n"
+"OpenVMS version"
+msgstr ""
+"\n"
+"OpenVMS ะฒะตั€ะทะธั˜ะฐ"
+
+msgid ""
+"\n"
+"Included patches: "
+msgstr ""
+"\n"
+"ะฃะบั™ัƒั‡ะตะฝะต ะธัะฟั€ะฐะฒะบะต: "
+
+msgid ""
+"\n"
+"Extra patches: "
+msgstr ""
+"\n"
+"ะ•ะบัั‚ั€ะฐ ะธัะฟั€ะฐะฒะบะต: "
+
+msgid "Modified by "
+msgstr "ะœะพะดะธั„ะธะบะพะฒะฐะพ "
+
+msgid ""
+"\n"
+"Compiled "
+msgstr ""
+"\n"
+"ะšะพะผะฟะฐั˜ะปะธั€ะฐะพ"
+
+msgid "by "
+msgstr " "
+
+msgid ""
+"\n"
+"Huge version "
+msgstr ""
+"\n"
+"ะžะณั€ะพะผะฝะฐ ะฒะตั€ะทะธั˜ะฐ "
+
+msgid ""
+"\n"
+"Big version "
+msgstr ""
+"\n"
+"ะ’ะตะปะธะบะฐ ะฒะตั€ะทะธั˜ะฐ "
+
+msgid ""
+"\n"
+"Normal version "
+msgstr ""
+"\n"
+"ะะพั€ะผะฐะปะฝะฐ ะฒะตั€ะทะธั˜ะฐ "
+
+msgid ""
+"\n"
+"Small version "
+msgstr ""
+"\n"
+"ะœะฐะปะฐ ะฒะตั€ะทะธั˜ะฐ "
+
+msgid ""
+"\n"
+"Tiny version "
+msgstr ""
+"\n"
+"ะกะธั›ัƒัˆะฝะฐ ะฒะตั€ะทะธั˜ะฐ "
+
+msgid "without GUI."
+msgstr "ะฑะตะท GUI."
+
+msgid "with GTK3 GUI."
+msgstr "ัะฐ GTK3 GUI."
+
+msgid "with GTK2-GNOME GUI."
+msgstr "ัะฐ GTK2-GNOME GUI."
+
+msgid "with GTK2 GUI."
+msgstr "ัะฐ GTK2 GUI."
+
+msgid "with X11-Motif GUI."
+msgstr "ัะฐ X11-Motif GUI."
+
+msgid "with X11-neXtaw GUI."
+msgstr "ัะฐ X11-neXtaw GUI."
+
+msgid "with X11-Athena GUI."
+msgstr "ัะฐ X11-Athena GUI."
+
+msgid "with Photon GUI."
+msgstr "ัะฐ Photon GUI."
+
+msgid "with GUI."
+msgstr "ัะฐ GUI."
+
+msgid "with Carbon GUI."
+msgstr "ัะฐ Carbon GUI."
+
+msgid "with Cocoa GUI."
+msgstr "ัะฐ Cocoa GUI."
+
+msgid " Features included (+) or not (-):\n"
+msgstr " ะœะพะณัƒั›ะฝะพัั‚ะธ ัƒะบั™ัƒั‡ะตะฝะต (+) ะธะปะธ ะฝะต (-):\n"
+
+msgid " system vimrc file: \""
+msgstr " ัะธัั‚ะตะผัะบa vimrc ะดะฐั‚ะพั‚ะตะบะฐ: \""
+
+msgid " user vimrc file: \""
+msgstr " ะบะพั€ะธัะฝะธั‡ะบะฐ vimrc ะดะฐั‚ะพั‚ะตะบะฐ: \""
+
+msgid " 2nd user vimrc file: \""
+msgstr " 2ะณะฐ ะบะพั€ะธัะฝะธั‡ะบะฐ vimrc ะดะฐั‚ะพั‚ะตะบะฐ: \""
+
+msgid " 3rd user vimrc file: \""
+msgstr " 3ั›ะฐ ะบะพั€ะธัะฝะธั‡ะบะฐ vimrc ะดะฐั‚ะพั‚ะตะบะฐ: \""
+
+msgid " user exrc file: \""
+msgstr " ะบะพั€ะธัะฝะธั‡ะบะฐ exrc ะดะฐั‚ะพั‚ะตะบะฐ: \""
+
+msgid " 2nd user exrc file: \""
+msgstr " 2ะณะฐ ะบะพั€ะธัะฝะธั‡ะบะฐ exrc ะดะฐั‚ะพั‚ะตะบะฐ: \""
+
+msgid " system gvimrc file: \""
+msgstr " ัะธัั‚ะตะผัะบะฐ gvimrc ะดะฐั‚ะพั‚ะตะบะฐ: \""
+
+msgid " user gvimrc file: \""
+msgstr " ะบะพั€ะธัะฝะธั‡ะบะฐ gvimrc ะดะฐั‚ะพั‚ะตะบะฐ: \""
+
+msgid "2nd user gvimrc file: \""
+msgstr "2ะณะฐ ะบะพั€ะธัะฝะธั‡ะบะฐ gvimrc ะดะฐั‚ะพั‚ะตะบะฐ: \""
+
+msgid "3rd user gvimrc file: \""
+msgstr "3ั›ะฐ ะบะพั€ะธัะฝะธั‡ะบะฐ gvimrc ะดะฐั‚ะพั‚ะตะบะฐ: \""
+
+msgid " defaults file: \""
+msgstr " ะดะฐั‚ะพั‚ะตะบะฐ ัะฐ ะฟะพะดั€ะฐะท. ะพะฟั†ะธั˜ะฐะผะฐ: \""
+
+msgid " system menu file: \""
+msgstr " ัะธัั‚ะตะผัะบะฐ ะดะฐั‚ะพั‚ะตะบะฐ ะผะตะฝะธั˜ะฐ: \""
+
+msgid " fall-back for $VIM: \""
+msgstr " ั€ะตะทะตั€ะฒะฝะฐ ะฒั€ะตะดะฝะพัั‚ ะทะฐ $VIM: \""
+
+msgid " f-b for $VIMRUNTIME: \""
+msgstr "ั€ะตะทะตั€ะฒะฝะฐ ะฒั€ะตะดะฝ. ะทะฐ $VIMRUNTIME: \""
+
+msgid "Compilation: "
+msgstr "ะšะพะผะฟะธะปะฐั†ะธั˜ะฐ: "
+
+msgid "Compiler: "
+msgstr "ะšะพะผะฟะฐั˜ะปะตั€: "
+
+msgid "Linking: "
+msgstr "ะŸะพะฒะตะทะธะฒะฐัšะต: "
+
+msgid " DEBUG BUILD"
+msgstr " DEBUG ะ˜ะ—ะ”ะะŠะ•"
+
+msgid "VIM - Vi IMproved"
+msgstr "VIM - Vi IMproved"
+
+msgid "version "
+msgstr "ะฒะตั€ะทะธั˜ะฐ "
+
+msgid "by Bram Moolenaar et al."
+msgstr "ะฝะฐะฟะธัะฐะปะธ Bram Moolenaar et al."
+
+msgid "Vim is open source and freely distributable"
+msgstr "Vim ั˜ะต ะพั‚ะฒะพั€ะตะฝะพะณ ะบะพะดะฐ ะธ ะผะพะถะต ัะปะพะฑะพะดะฝะพ ะดะฐ ัะต ะดะธัั‚ั€ะธะฑัƒะธั€ะฐ"
+
+msgid "Help poor children in Uganda!"
+msgstr "ะŸะพะผะพะทะธั‚ะต ัะธั€ะพะผะฐัˆะฝะพั˜ ะดะตั†ะธ ัƒ ะฃะณะฐะฝะดะธ!"
+
+msgid "type :help iccf<Enter> for information "
+msgstr "ะพั‚ะบัƒั†ะฐั˜ั‚ะต :help iccf<Enter> ะทะฐ ะธะฝั„ะพั€ะผะฐั†ะธั˜ะต "
+
+msgid "type :q<Enter> to exit "
+msgstr "ะพั‚ะบัƒั†ะฐั˜ั‚ะต :q<Enter> ะทะฐ ะธะทะปะฐะท "
+
+msgid "type :help<Enter> or <F1> for on-line help"
+msgstr "ะพั‚ะบัƒั†ะฐั˜ั‚ะต :help<Enter> ะธะปะธ <F1> ะทะฐ on-line ะฟะพะผะพั› "
+
+msgid "type :help version8<Enter> for version info"
+msgstr "ะพั‚ะบัƒั†ะฐั˜ั‚ะต :help version8<Enter> ะทะฐ ะธะฝั„ะพ ะพ ะฒะตั€ะทะธั˜ะธ"
+
+msgid "Running in Vi compatible mode"
+msgstr "ะ ะฐะด ัƒ Vi ะบะพะผะฟะฐั‚ะธะฑะธะปะฝะพะผ ั€ะตะถะธะผัƒ"
+
+msgid "type :set nocp<Enter> for Vim defaults"
+msgstr "ะพั‚ะบัƒั†ะฐั˜ั‚ะต :set nocp<Enter> ะทะฐ Vim ะฟะพะดั€ะฐะทัƒะผะตะฒะฐะฝะพ"
+
+msgid "type :help cp-default<Enter> for info on this"
+msgstr "ะพั‚ะบัƒั†ะฐั˜ั‚ะต :help cp-default<Enter> ะทะฐ ะธะฝั„ะพ ะพ ะพะฒะพะผะต"
+
+msgid "menu Help->Orphans for information "
+msgstr "ะผะตะฝะธ ะŸะพะผะพั›->ะกะธั€ะพั‡ะธั›ะธ ะทะฐ ะธะฝั„ะพั€ะผะฐั†ะธั˜ะต "
+
+msgid "Running modeless, typed text is inserted"
+msgstr "ะ‘ะตะทั€ะตะถะธะผัะบะธ ั€ะฐะด, ัƒะผะตั›ะต ัะต ะพั‚ะบัƒั†ะฐะฝะธ ั‚ะตะบัั‚"
+
+msgid "menu Edit->Global Settings->Toggle Insert Mode "
+msgstr "ะผะตะฝะธ ะฃั€ะตั’ะธะฒะฐัšะต->ะ“ะปะพะฑะฐะปะฝะฐ ะฟะพะดะตัˆะฐะฒะฐัšะฐ->ะŸั€ะตะบะปะฐะฟะฐั˜ ั€ะตะถะธะผ ะฃะผะตั‚ะฐัšะต "
+
+msgid " for two modes "
+msgstr " ะทะฐ ะดะฒะฐ ั€ะตะถะธะผะฐ "
+
+msgid "menu Edit->Global Settings->Toggle Vi Compatible"
+msgstr "ะผะตะฝะธ ะฃั€ะตั’ะธะฒะฐัšะต->ะ“ะปะพะฑะฐะปะฝะฐ ะฟะพะดะตัˆะฐะฒะฐัšะฐ->ะŸั€ะตะบะปะฐะฟะฐั˜ Vi ะšะพะผะฟะฐั‚ะธะฑะธะปะฝะพ"
+
+msgid " for Vim defaults "
+msgstr " ะทะฐ Vim ะฟะพะดั€ะฐะทัƒะผะตะฒะฐะฝะพ "
+
+msgid "Sponsor Vim development!"
+msgstr "ะกะฟะพะฝะทะพั€ะธัˆะธั‚ะต Vim ั€ะฐะทะฒะพั˜!"
+
+msgid "Become a registered Vim user!"
+msgstr "ะŸะพัั‚ะฐะฝะธั‚ะต ั€ะตะณะธัั‚ั€ะพะฒะฐะฝะธ Vim ะบะพั€ะธัะฝะธะบ!"
+
+msgid "type :help sponsor<Enter> for information "
+msgstr "ะพั‚ะบัƒั†ะฐั˜ั‚ะต :help sponsor<Enter> ะทะฐ ะธะฝั„ะพั€ะผะฐั†ะธั˜ะต "
+
+msgid "type :help register<Enter> for information "
+msgstr "ะพั‚ะบัƒั†ะฐั˜ั‚ะต :help register<Enter> ะทะฐ ะธะฝั„ะพั€ะผะฐั†ะธั˜ะต "
+
+msgid "menu Help->Sponsor/Register for information "
+msgstr "ะผะตะฝะธ ะŸะพะผะพั›->ะกะฟะพะฝะทะพั€/ะ ะตะณะธัั‚ั€ัƒั˜ ัะต ะทะฐ ะธะฝั„ะพั€ะผะฐั†ะธั˜ะต "
+
+msgid "Already only one window"
+msgstr "ะ’ะตั› ะฟะพัั‚ะพั˜ะธ ัะฐะผะพ ั˜ะตะดะฐะฝ ะฟั€ะพะทะพั€"
+
+msgid "E441: There is no preview window"
+msgstr "E441: ะะตะผะฐ ะฟั€ะพะทะพั€ะฐ ะทะฐ ะฟั€ะตะณะปะตะด"
+
+msgid "E442: Can't split topleft and botright at the same time"
+msgstr "E442: topleft ะธ botright ะฝะต ะผะพะณัƒ ะดะฐ ัะต ะฟะพะดะตะปะต ัƒ ะธัั‚ะพ ะฒั€ะตะผะต"
+
+msgid "E443: Cannot rotate when another window is split"
+msgstr "E443: ะะต ะผะพะถะต ะดะฐ ัะต ั€ะพั‚ะธั€ะฐ ะบะฐะดะฐ ั˜ะต ะฟะพะดะตั™ะตะฝ ะดั€ัƒะณะธ ะฟั€ะพะทะพั€"
+
+msgid "E444: Cannot close last window"
+msgstr "E444: ะŸะพัะปะตะดัšะธ ะฟั€ะพะทะพั€ ะฝะต ะผะพะถะต ะดะฐ ัะต ะทะฐั‚ะฒะพั€ะธ"
+
+msgid "E813: Cannot close autocmd window"
+msgstr "E813: autocmd ะฟั€ะพะทะพั€ ะฝะต ะผะพะถะต ะดะฐ ัะต ะทะฐั‚ะฒะพั€ะธ"
+
+msgid "E814: Cannot close window, only autocmd window would remain"
+msgstr "E814: ะŸั€ะพะทะพั€ ะฝะต ะผะพะถะต ะดะฐ ัะต ะทะฐั‚ะฒะพั€ะธ, ะฟั€ะตะพัั‚ะฐะพ ะฑะธ ั˜ะตะดะธะฝะพ autocmd ะฟั€ะพะทะพั€"
+
+msgid "E445: Other window contains changes"
+msgstr "E445: ะ”ั€ัƒะณะธ ะฟั€ะพะทะพั€ะธ ัะฐะดั€ะถะต ะธะทะผะตะฝะต"
+
+msgid "E446: No file name under cursor"
+msgstr "E446: ะŸะพะด ะบัƒั€ัะพั€ะพะผ ัะต ะฝะต ะฝะฐะปะฐะทะธ ะธะผะต ะดะฐั‚ะพั‚ะตะบะต"
+
+#, c-format
+msgid "E447: Can't find file \"%s\" in path"
+msgstr "E447: ะ”ะฐั‚ะพั‚ะตะบะฐ \"%s\" ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะฝะฐั’ะต ัƒ ะฟัƒั‚ะฐัšะธ"
+
+#, c-format
+msgid "E799: Invalid ID: %ld (must be greater than or equal to 1)"
+msgstr "E799: ะะตะฒะฐะถะตั›ะธ ะ˜ะ”: %ld (ะผะพั€ะฐ ะฑะธั‚ะธ ะฒะตั›ะธ ะพะด ะธะปะธ ั˜ะตะดะฝะฐะบ 1)"
+
+#, c-format
+msgid "E801: ID already taken: %ld"
+msgstr "E801: ะ˜ะ” ั˜ะต ะฒะตั› ะทะฐัƒะทะตั‚: %ld"
+
+msgid "List or number required"
+msgstr "ะ—ะฐั…ั‚ะตะฒะฐ ัะต ะปะธัั‚ะฐ ะธะปะธ ะฑั€ะพั˜"
+
+#, c-format
+msgid "E802: Invalid ID: %ld (must be greater than or equal to 1)"
+msgstr "E802: ะะตะฒะฐะถะตั›ะธ ะ˜ะ”: %ld (ะผะพั€ะฐ ะฑะธั‚ะธ ะฒะตั›ะธ ะพะด ะธะปะธ ั˜ะตะดะฝะฐะบ 1)"
+
+#, c-format
+msgid "E803: ID not found: %ld"
+msgstr "E803: ะ˜ะ” ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝ: %ld"
+
+msgid "Edit with &multiple Vims"
+msgstr "ะฃั€ะตั’ัƒั˜ ัะฐ &ะฒะธัˆะต Vim-ะพะฒะฐ"
+
+msgid "Edit with single &Vim"
+msgstr "ะฃั€ะตั’ัƒั˜ ัะฐ ั˜ะตะดะฝะธะผ &Vim-ะพะผ"
+
+msgid "Diff with Vim"
+msgstr "Diff ัะฐ Vim"
+
+msgid "Edit with &Vim"
+msgstr "ะฃั€ะตั’ัƒั˜ ัะฐ &Vim-ะพะผ"
+
+msgid "Edit with existing Vim - "
+msgstr "ะฃั€ะตั’ัƒั˜ ัะฐ ะฟะพัั‚ะพั˜ะตั›ะธะผ Vim - "
+
+msgid "Edits the selected file(s) with Vim"
+msgstr "ะฃั€ะตั’ัƒั˜ะต ัะตะปะตะบั‚ะพะฒะฐัƒะต ะดะฐั‚ะพั‚ะตะบัƒ(ะต) ัะฐ Vim-ะพะผ"
+
+msgid "Error creating process: Check if gvim is in your path!"
+msgstr ""
+"ะ“ั€ะตัˆะบะฐ ะฟั€ะธะปะธะบะพะผ ะบั€ะตะธั€ะฐัšะฐ ะฟั€ะพั†ะตัะฐ: ะŸั€ะพะฒะตั€ะธั‚ะต ะดะฐ ะปะธ ั˜ะต gvim ัƒ ะฒะฐัˆะพั˜ ะฟัƒั‚ะฐัšะธ!"
+
+msgid "gvimext.dll error"
+msgstr "gvimext.dll ะณั€ะตัˆะบะฐ"
+
+msgid "Path length too long!"
+msgstr "ะŸัƒั‚ะฐัšะฐ ั˜ะต ะฟั€ะตะดัƒะณะฐั‡ะบะฐ!"
+
+msgid "--No lines in buffer--"
+msgstr "--ะฃ ะฑะฐั„ะตั€ัƒ ะฝะตะผะฐ ะปะธะฝะธั˜ะฐ--"
+
+msgid "E470: Command aborted"
+msgstr "E470: ะšะพะผะฐะฝะดะฐ ะฟั€ะตะบะธะฝัƒั‚ะฐ"
+
+msgid "E471: Argument required"
+msgstr "E471: ะŸะพั‚ั€ะตะฑะฐะฝ ั˜ะต ะฐั€ะณัƒะผะตะฝั‚"
+
+msgid "E10: \\ should be followed by /, ? or &"
+msgstr "E10: ะ˜ะทะฐ \\ ั‚ั€ะตะฑะฐ ะดะฐ ั˜ะต /, ? ะธะปะธ &"
+
+msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
+msgstr ""
+"E11: ะะตะฒะฐะถะตั›ะต ัƒ ะฟั€ะพะทะพั€ัƒ ะบะพะผะฐะฝะดะฝะต ะปะธะฝะธั˜ะต; <CR> ะธะทะฒั€ัˆะฐะฒะฐ, CTRL-C ะพั‚ะบะฐะทัƒั˜ะต"
+
+msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
+msgstr ""
+"E12: ะŸะพัั‚ะพั˜ะธ ะทะฐะฑั€ะฐะฝะฐ ะทะฐ ะบะพะผะฐะฝะดัƒ ัƒ exrc/vimrc ัƒ ั‚ะตะบัƒั›ะพั˜ ะฟั€ะตั‚ั€ะฐะทะธ "
+"ะดะธั€ะตะบั‚ะพั€ะธั˜ัƒะผะฐ ะธะปะธ ะพะทะฝะฐะบะต"
+
+msgid "E171: Missing :endif"
+msgstr "E171: ะะตะดะพัั‚ะฐั˜ะต :endif"
+
+msgid "E600: Missing :endtry"
+msgstr "E600: ะะตะดะพัั‚ะฐั˜ะต :endtry"
+
+msgid "E170: Missing :endwhile"
+msgstr "E170: ะะตะดะพัั‚ะฐั˜ะต :endwhile"
+
+msgid "E170: Missing :endfor"
+msgstr "E170: ะะตะดะพัั‚ะฐั˜ะต :endfor"
+
+msgid "E588: :endwhile without :while"
+msgstr "E588: :endwhile ะฑะตะท :while"
+
+msgid "E588: :endfor without :for"
+msgstr "E588: :endfor ะฑะตะท :for"
+
+msgid "E13: File exists (add ! to override)"
+msgstr "E13: ะ”ะฐั‚ะพั‚ะตะบะฐ ะฟะพัั‚ะพั˜ะธ (ะดะพะดะฐั˜ั‚ะต ! ะทะฐ ะฟั€ะตะผะพัˆั›ะฐะฒะฐัšะต)"
+
+msgid "E472: Command failed"
+msgstr "E472: ะšะพะผะฐะฝะดะฐ ะฝะธั˜ะต ัƒัะฟะตะปะฐ"
+
+#, c-format
+msgid "E234: Unknown fontset: %s"
+msgstr "E234: ะะตะฟะพะทะฝะฐั‚ fontset: %s"
+
+#, c-format
+msgid "E235: Unknown font: %s"
+msgstr "E235: ะะตะฟะพะทะฝะฐั‚ ั„ะพะฝั‚: %s"
+
+#, c-format
+msgid "E236: Font \"%s\" is not fixed-width"
+msgstr "E236: ะคะพะฝั‚ \"%s\" ะฝะธั˜ะต ั„ะธะบัะฝะต ัˆะธั€ะธะฝะต"
+
+msgid "E473: Internal error"
+msgstr "E473: ะ˜ะฝั‚ะตั€ะฝะฐ ะณั€ะตัˆะบะฐ"
+
+#, c-format
+msgid "E685: Internal error: %s"
+msgstr "E685: ะ˜ะฝั‚ะตั€ะฝะฐ ะณั€ะตัˆะบะฐ: %s"
+
+msgid "Interrupted"
+msgstr "ะŸั€ะตะบะธะฝัƒั‚ะพ"
+
+msgid "E14: Invalid address"
+msgstr "E14: ะะตะฒะฐะถะตั›ะฐ ะฐะดั€ะตัะฐ"
+
+msgid "E474: Invalid argument"
+msgstr "E474: ะะตะฒะฐะถะตั›ะธ ะฐั€ะณัƒะผะตะฝั‚"
+
+#, c-format
+msgid "E475: Invalid argument: %s"
+msgstr "E475: ะะตะฒะฐะถะตั›ะธ ะฐั€ะณัƒะผะตะฝั‚: %s"
+
+#, c-format
+msgid "E475: Invalid value for argument %s"
+msgstr "E475: ะะตะฒะฐะถะตั›a ะฒั€ะตะดะฝะพัั‚ ะทะฐ ะฐั€ะณัƒะผะตะฝั‚: %s"
+
+#, c-format
+msgid "E475: Invalid value for argument %s: %s"
+msgstr "E475: ะะตะฒะฐะถะตั›a ะฒั€ะตะดะฝะพัั‚ ะทะฐ ะฐั€ะณัƒะผะตะฝั‚ %s: %s"
+
+#, c-format
+msgid "E15: Invalid expression: %s"
+msgstr "E15: ะะตะฒะฐะถะตั›ะธ ะธะทั€ะฐะท: %s"
+
+msgid "E16: Invalid range"
+msgstr "E16: ะะตะฒะฐะถะตั›ะธ ะพะฟัะตะณ"
+
+msgid "E476: Invalid command"
+msgstr "E476: ะะตะฒะฐะถะตั›ะฐ ะบะพะผะฐะฝะดะฐ"
+
+#, c-format
+msgid "E17: \"%s\" is a directory"
+msgstr "E17: \"%s\" ั˜ะต ะดะธั€ะตะบั‚ะพั€ะธั˜ัƒะผ"
+
+#, c-format
+msgid "E364: Library call failed for \"%s()\""
+msgstr "E364: ะŸะพะทะธะฒ ะฑะธะฑะปะธะพั‚ะตะบะต ะฝะธั˜ะต ัƒัะฟะตะพ ะทะฐ \"%s()\""
+
+msgid "E667: Fsync failed"
+msgstr "E667: Fsync ะฝะธั˜ะต ัƒัะฟะตะพ"
+
+#, c-format
+msgid "E448: Could not load library function %s"
+msgstr "E448: ะ‘ะธะฑะปะธะพั‚ะตั‡ะบะฐ ั„ัƒะฝะบั†ะธั˜ะฐ %s ะฝะธั˜ะต ะผะพะณะปะฐ ะดะฐ ัะต ัƒั‡ะธั‚ะฐ"
+
+msgid "E19: Mark has invalid line number"
+msgstr "E19: ะœะฐั€ะบะตั€ ัะฐะดั€ะถะธ ะฝะตะธัะฟั€ะฐะฒะฐะฝ ะฑั€ะพั˜ ะปะธะฝะธั˜ะต"
+
+msgid "E20: Mark not set"
+msgstr "E20: ะœะฐั€ะบะตั€ ะฝะธั˜ะต ะฟะพัั‚ะฐะฒั™ะตะฝ"
+
+msgid "E21: Cannot make changes, 'modifiable' is off"
+msgstr "E21: ะ˜ะทะผะตะฝะต ะฝะต ะผะพะณัƒ ะดะฐ ัะต ัƒั‡ะธะฝะต, ะพะฟั†ะธั˜ะฐ 'modifiable' ั˜ะต ะธัะบั™ัƒั‡ะตะฝะฐ"
+
+msgid "E22: Scripts nested too deep"
+msgstr "E22: ะกะบั€ะธะฟั‚ะต ััƒ ะฟั€ะตะดัƒะฑะพะบะพ ัƒะณัšะตะถะดะตะฝะต"
+
+msgid "E23: No alternate file"
+msgstr "E23: ะะตะผะฐ ะฐะปั‚ะตั€ะฝะฐั‚ะธะฒะฝะต ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "E24: No such abbreviation"
+msgstr "E24: ะขะฐะบะฒะฐ ัะบั€ะฐั›ะตะฝะธั†ะฐ ะฝะต ะฟะพัั‚ะพั˜ะธ"
+
+msgid "E477: No ! allowed"
+msgstr "E477: ! ะฝะธั˜ะต ะดะพะทะฒะพั™ะตะฝ"
+
+msgid "E25: GUI cannot be used: Not enabled at compile time"
+msgstr "E25: GUI ะฝะต ะผะพะถะต ะดะฐ ัะต ะบะพั€ะธัั‚ะธ: ะะธั˜ะต ะพะผะพะณัƒั›ะตะฝ ัƒ ะฒั€ะตะผะต ะบะพะผะฟะธะปะฐั†ะธั˜ะต"
+
+msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
+msgstr ""
+"E26: ั…ะตะฑั€ะตั˜ัะบะธ ะฝะต ะผะพะถะต ะดะฐ ัะต ะบะพั€ะธัั‚ะธ: ะะธั˜ะต ะพะผะพะณัƒั›ะตะฝ ัƒ ะฒั€ะตะผะต ะบะพะผะฟะธะปะฐั†ะธั˜ะต\n"
+
+msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
+msgstr "E27: ั„ะฐั€ัะธ ะฝะต ะผะพะถะต ะดะฐ ัะต ะบะพั€ะธัั‚ะธ: ะะธั˜ะต ะพะผะพะณัƒั›ะตะฝ ัƒ ะฒั€ะตะผะต ะบะพะผะฟะธะปะฐั†ะธั˜ะต\n"
+
+msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
+msgstr ""
+"E800: ะฐั€ะฐะฟัะบะธ ะฝะต ะผะพะถะต ะดะฐ ัะต ะบะพั€ะธัั‚ะธ: ะะธั˜ะต ะพะผะพะณัƒั›ะตะฝ ัƒ ะฒั€ะตะผะต ะบะพะผะฟะธะปะฐั†ะธั˜ะต\n"
+
+#, c-format
+msgid "E28: No such highlight group name: %s"
+msgstr "E28: ะะตะผะฐ ะณั€ัƒะฟะต ะธัั‚ะธั†ะฐัšะฐ ัะฐ ั‚ะฐะบะฒะธะผ ะธะผะตะฝะพะผ: %s"
+
+msgid "E29: No inserted text yet"
+msgstr "E29: ะขะตะบัั‚ ั˜ะพัˆ ะฝะธั˜ะต ัƒะฝะตั‚"
+
+msgid "E30: No previous command line"
+msgstr "E30: ะะตะผะฐ ะฟั€ะตั‚ั…ะพะดะฝะต ะบะพะผะฐะฝะดะฝะต ะปะธะฝะธั˜ะต"
+
+msgid "E31: No such mapping"
+msgstr "E31: ะขะฐะบะฒะพ ะผะฐะฟะธั€ะฐัšะต ะฝะต ะฟะพัั‚ะพั˜ะธ"
+
+msgid "E479: No match"
+msgstr "E479: ะะตะผะฐ ะฟะพะดัƒะดะฐั€ะฐัšะฐ"
+
+#, c-format
+msgid "E480: No match: %s"
+msgstr "E480: ะะตะผะฐ ะฟะพะดัƒะดะฐั€ะฐัšะฐ: %s"
+
+msgid "E32: No file name"
+msgstr "E32: ะะตะผะฐ ะธะผะตะฝะฐ ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "E33: No previous substitute regular expression"
+msgstr "E33: ะะตะผะฐ ะฟั€ะตั‚ั…ะพะดะฝะพะณ ั€ะตะณัƒะปะฐั€ะฝะพะณ ะธะทั€ะฐะทะฐ ะทะฐ ะทะฐะผะตะฝัƒ"
+
+msgid "E34: No previous command"
+msgstr "E34: ะะตะผะฐ ะฟั€ะตั‚ั…ะพะดะฝะต ะบะพะผะฐะฝะดะต"
+
+msgid "E35: No previous regular expression"
+msgstr "E35: ะะตะผะฐ ะฟั€ะตั‚ั…ะพะดะฝะพะณ ั€ะตะณัƒะปะฐั€ะฝะพะณ ะธะทั€ะฐะทะฐ"
+
+msgid "E481: No range allowed"
+msgstr "E481: ะžะฟัะตะณ ะฝะธั˜ะต ะดะพะทะฒะพั™ะตะฝ"
+
+msgid "E36: Not enough room"
+msgstr "E36: ะะตะผะฐ ะดะพะฒะพั™ะฝะพ ะฟั€ะพัั‚ะพั€ะฐ"
+
+#, c-format
+msgid "E247: no registered server named \"%s\""
+msgstr "E247: ะฝะตะผะฐ ั€ะตะณะธัั‚ะพะฒะฐะฝะพะณ ัะตั€ะฒะตั€ะฐ ะฟะพะด ะธะผะตะฝะพะผ \"%s\""
+
+#, c-format
+msgid "E482: Can't create file %s"
+msgstr "E482: ะ”ะฐั‚ะพั‚ะตะบะฐ %s ะฝะต ะผะพะถะต ะดะฐ ัะต ะบั€ะตะธั€ะฐ"
+
+msgid "E483: Can't get temp file name"
+msgstr "E483: ะ˜ะผะต ะฟั€ะธะฒั€ะตะผะตะฝะต ะดะฐั‚ะพั‚ะบะต ะฝะต ะผะพะถะต ะดะฐ ัะต ะดะพะฑะธั˜ะต"
+
+#, c-format
+msgid "E484: Can't open file %s"
+msgstr "E484: ะ”ะฐั‚ะพั‚ะตะบะฐ %s ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ"
+
+#, c-format
+msgid "E485: Can't read file %s"
+msgstr "E485: ะ”ะฐั‚ะพั‚ะตะบะฐ %s ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพั‡ะธั‚ะฐ"
+
+msgid "E38: Null argument"
+msgstr "E38: ะŸั€ะฐะทะฐะฝ ะฐั€ะณัƒะผะตะฝั‚"
+
+msgid "E39: Number expected"
+msgstr "E39: ะžั‡ะตะบัƒั˜ะต ัะต ะฑั€ะพั˜"
+
+#, c-format
+msgid "E40: Can't open errorfile %s"
+msgstr "E40: ะ”ะฐั‚ะพั‚ะตะบะฐ ะณั€ะตัˆะบะต %s ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ"
+
+msgid "E233: cannot open display"
+msgstr "E233: ะฟั€ะพะบะฐะท ะฝะต ะผะพะถะต ะดะฐ ัะต ะพั‚ะฒะพั€ะธ"
+
+msgid "E41: Out of memory!"
+msgstr "E41: ะะตะผะฐ ะฒะธัˆะต ะผะตะผะพั€ะธั˜ะต!"
+
+msgid "Pattern not found"
+msgstr "ะจะฐะฑะปะพะฝ ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝ"
+
+#, c-format
+msgid "E486: Pattern not found: %s"
+msgstr "E486: ะจะฐะฑะปะพะฝ ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝ: %s"
+
+msgid "E487: Argument must be positive"
+msgstr "E487: ะั€ะณัƒะผะตะฝั‚ ะผะพั€ะฐ ะฑะธั‚ะธ ะฟะพะทะธั‚ะธะฒะฐะฝ"
+
+msgid "E459: Cannot go back to previous directory"
+msgstr "E459: ะะต ะผะพะถะต ะดะฐ ัะต ะพะดะต ะฝะฐะทะฐะด ะฝะฐ ะฟั€ะตั‚ั…ะพะดะฝะธ ะดะธั€ะตะบั‚ะพั€ะธั˜ัƒะผ"
+
+msgid "E42: No Errors"
+msgstr "E42: ะะตะผะฐ ะณั€ะตัˆะฐะบะฐ"
+
+msgid "E776: No location list"
+msgstr "E776: ะะตะผะฐ ะปะธัั‚ะต ะปะพะบะฐั†ะธั˜ะฐ"
+
+msgid "E43: Damaged match string"
+msgstr "E43: ะžัˆั‚ะตั›ะตะฝ ัั‚ั€ะธะฝะณ ะทะฐ ะฟะพะดัƒะดะฐั€ะฐัšะต"
+
+msgid "E44: Corrupted regexp program"
+msgstr "E44: regexp ะฟั€ะพะณั€ะฐะผ ั˜ะต ะฟะพะบะฒะฐั€ะตะฝ"
+
+msgid "E45: 'readonly' option is set (add ! to override)"
+msgstr "E45: ะŸะพัั‚ะฐะฒั™ะตะฝะฐ ั˜ะต 'readonly' ะพะฟั†ะธั˜ะฐ (ะดะพะดะฐั˜ั‚ะต ! ะทะฐ ะฟั€ะตะผะพัˆั›ะฐะฒะฐัšะต)"
+
+#, c-format
+msgid "E46: Cannot change read-only variable \"%s\""
+msgstr "E46: ะŸั€ะพะผะตะฝั™ะธะฒะฐ ัะฐะผะพ ะทะฐ ั‡ะธั‚ะฐัšะต \"%s\" ะฝะต ะผะพะถะต ะดะฐ ัะต ะธะทะผะตะฝะธ"
+
+#, c-format
+msgid "E794: Cannot set variable in the sandbox: \"%s\""
+msgstr "E794: ะะต ะผะพะถะต ะดะฐ ัะต ะฟะพัั‚ะฐะฒะธ ะฟั€ะพะผะตะฝั™ะธะฒะฐ ัƒ sandbox-ัƒ: \"%s\""
+
+msgid "E713: Cannot use empty key for Dictionary"
+msgstr "E713: ะะต ะผะพะถะต ะดะฐ ัะต ะบะพั€ะธัั‚ะธ ะฟั€ะฐะทะฐะฝ ะบั™ัƒั‡ ะทะฐ ะ ะตั‡ะฝะธะบ"
+
+msgid "E715: Dictionary required"
+msgstr "E715: ะŸะพั‚ั€ะตะฑะฐะฝ ะ ะตั‡ะฝะธะบ"
+
+#, c-format
+msgid "E684: list index out of range: %ld"
+msgstr "E684: ะธะฝะดะตะบั ะปะธัั‚ะต ั˜ะต ะฒะฐะฝ ะพะฟัะตะณะฐ: %ld"
+
+#, c-format
+msgid "E118: Too many arguments for function: %s"
+msgstr "E118: ะŸั€ะตะฒะธัˆะต ะฐั€ะณัƒะผะตะฝะฐั‚ะฐ ะทะฐ ั„ัƒะฝะบั†ะธั˜ัƒ: %s"
+
+#, c-format
+msgid "E716: Key not present in Dictionary: %s"
+msgstr "E716: ะฃ ะ ะตั‡ะฝะธะบัƒ ะฝะตะผะฐ ะบั™ัƒั‡ะฐ: %s"
+
+msgid "E714: List required"
+msgstr "E714: ะŸะพั‚ั€ะตะฑะฝะฐ ะ›ะธัั‚ะฐ"
+
+#, c-format
+msgid "E712: Argument of %s must be a List or Dictionary"
+msgstr "E712: ะั€ะณัƒะผะตะฝั‚ ะทะฐ %s ะผะพั€ะฐ ะฑะธั‚ะธ ะ›ะธัั‚ะฐ ะธะปะธ ะ ะตั‡ะฝะธะบ"
+
+msgid "E47: Error while reading errorfile"
+msgstr "E47: ะ“ั€ะตัˆะบะฐ ะฟั€ะธะปะธะบะพะผ ั‡ะธั‚ะฐั™ะฐ ะดะฐั‚ะพั‚ะตะบะต ะณั€ะตัˆะบะต"
+
+msgid "E48: Not allowed in sandbox"
+msgstr "E48: ะะธั˜ะต ะดะพะทะฒะพั™ะตะฝะพ ัƒ sandbox-ัƒ"
+
+msgid "E523: Not allowed here"
+msgstr "E523: ะะธั˜ะต ะดะพะทะฒะพั™ะตะฝะพ ะพะฒะดะต"
+
+msgid "E359: Screen mode setting not supported"
+msgstr "E359: ะŸะพะดะตัˆะฐะฒะฐัšะต ั€ะตะถะธะผะฐ ะตะบั€ะฐะฝะฐ ะฝะธั˜ะต ะฟะพะดั€ะถะฐะฝะพ"
+
+msgid "E49: Invalid scroll size"
+msgstr "E49: ะะตะฒะฐะถะตั›ะฐ ะฒะตะปะธั‡ะธะฝะฐ ะปะธะฝะธั˜ะต ะทะฐ ัะบั€ะพะปะพะฒะฐัšะต"
+
+msgid "E91: 'shell' option is empty"
+msgstr "E91: ะžะฟั†ะธั˜ะฐ 'shell' ั˜ะต ะฟั€ะฐะทะฝะฐ"
+
+msgid "E255: Couldn't read in sign data!"
+msgstr "E255: ะŸะพะดะฐั†ะธ ะทะฐ ะทะฝะฐะบ ะฝะธััƒ ะผะพะณะปะธ ะดะฐ ัะต ะฟั€ะพั‡ะธั‚ะฐั˜ัƒ!"
+
+msgid "E72: Close error on swap file"
+msgstr "E72: ะ“ั€ะตัˆะบะฐ ะบะพะด ะทะฐั‚ะฒะฐัšะฐั€ะฐ swap ะดะฐั‚ะพั‚ะตะบะต"
+
+msgid "E73: tag stack empty"
+msgstr "E73: ัั‚ะตะบ ะพะทะฝะฐะบะฐ ั˜ะต ะฟั€ะฐะทะฐะฝ"
+
+msgid "E74: Command too complex"
+msgstr "E74: ะšะพะผะฐะฝะดะฐ ั˜ะต ััƒะฒะธัˆะต ะบะพะผะฟะปะตะบัะฝะฐ"
+
+msgid "E75: Name too long"
+msgstr "E75: ะ˜ะผะต ั˜ะต ะฟั€ะตะดัƒะณะฐั‡ะบะพ"
+
+msgid "E76: Too many ["
+msgstr "E76: ะŸั€ะตะฒะธัˆะต ["
+
+msgid "E77: Too many file names"
+msgstr "E77: ะŸั€ะตะฒะธัˆะต ะธะผะตะฝะฐ ะดะฐั‚ะพั‚ะตะบะฐ"
+
+msgid "E488: Trailing characters"
+msgstr "E488: ะšะฐั€ะฐะบั‚ะตั€ะธ ะฒะธัˆะบะฐ ะฝะฐ ะบั€ะฐั˜ัƒ"
+
+msgid "E78: Unknown mark"
+msgstr "E78: ะะตะฟะพะทะฝะฐั‚ ะผะฐั€ะบะตั€"
+
+msgid "E79: Cannot expand wildcards"
+msgstr "E79: ะะพะบะตั€ะธ ะฝะต ะผะพะณัƒ ะดะฐ ัะต ั€ะฐะทะฒะธั˜ัƒ"
+
+msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
+msgstr "E591: 'winheight' ะฝะต ะผะพะถะต ะดะฐ ะฑัƒะดะต ะผะฐัšะต ะพะด 'winminheight'"
+
+msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
+msgstr "E592: 'winwidth' ะฝะต ะผะพะถะต ะดะฐ ะฑัƒะดะต ะผะฐัšะต ะพะด 'winminwidth'"
+
+msgid "E80: Error while writing"
+msgstr "E80: ะ“ั€ะตัˆะบะฐ ะฟั€ะธะปะธะบะพะผ ัƒะฟะธัะฐ"
+
+msgid "E939: Positive count required"
+msgstr "E939: ะŸะพั‚ั€ะตะฑะฐะฝ ั˜ะต ะฟะพะทะธั‚ะธะฒะฐะฝ ะฑั€ะพั˜"
+
+msgid "E81: Using <SID> not in a script context"
+msgstr "E81: <SID> ัะต ะบะพั€ะธัั‚ะธ ะฒะฐะฝ ัะบั€ะธะฟั‚ ะบะพะฝั‚ะตะบัั‚ะฐ"
+
+msgid "E449: Invalid expression received"
+msgstr "E449: ะŸั€ะธะผั™ะตะฝ ั˜ะต ะฝะตะฒะฐะถะตั›ะธ ะธะทั€ะฐะท"
+
+msgid "E463: Region is guarded, cannot modify"
+msgstr "E463: ะ ะตะณะธะพะฝ ั˜ะต ั‡ัƒะฒะฐะฝ, ะธะทะผะตะฝะฐ ะฝะธั˜ะต ะผะพะณัƒั›ะฐ"
+
+msgid "E744: NetBeans does not allow changes in read-only files"
+msgstr ""
+"E744: NetBeans ะฝะต ะดะพะทะฒะพั™ะฐะฒะฐ ะธะทะผะตะฝะต ะดะฐั‚ะพั‚ะตะบะฐ ะบะพั˜ะต ัะผะตั˜ัƒ ัะฐะผะพ ะดะฐ ัะต ั‡ะธั‚ะฐั˜ัƒ"
+
+msgid "E363: pattern uses more memory than 'maxmempattern'"
+msgstr "E363: ัˆะฐะฑะปะพะฝ ะบะพั€ะธัั‚ะธ ะฒะธัˆะต ะผะตะผะพั€ะธั˜ะต ะพะด 'maxmempattern'"
+
+msgid "E749: empty buffer"
+msgstr "E749: ะฟั€ะฐะทะฐะฝ ะฑะฐั„ะตั€"
+
+#, c-format
+msgid "E86: Buffer %ld does not exist"
+msgstr "E86: ะ‘ะฐั„ะตั€ %ld ะฝะต ะฟะพัั‚ะพั˜ะธ"
+
+msgid "E682: Invalid search pattern or delimiter"
+msgstr "E682: ะะตะฒะฐะถะตั›ะธ ัˆะฐะฑะปะพะฝ ะฟั€ะตั‚ั€ะฐะณะต ะธะปะธ ั€ะฐะทะดะฒะพั˜ะฝะธ ะบะฐั€ะฐะบั‚ะตั€"
+
+msgid "E139: File is loaded in another buffer"
+msgstr "E139: ะ”ะฐั‚ะพั‚ะตะบะฐ ั˜ะต ัƒั‡ะธั‚ะฐะฝะฐ ัƒ ะดั€ัƒะณะธ ะฑะฐั„ะตั€"
+
+#, c-format
+msgid "E764: Option '%s' is not set"
+msgstr "E764: ะžะฟั†ะธั˜ะฐ '%s' ะฝะธั˜ะต ะฟะพัั‚ะฐะฒั™ะตะฝะฐ"
+
+msgid "E850: Invalid register name"
+msgstr "E850: ะะตะฒะฐะถะตั›ะต ะธะผะต ั€ะตะณะธัั‚ั€ะฐ"
+
+#, c-format
+msgid "E919: Directory not found in '%s': \"%s\""
+msgstr "E919: ะะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝ ะดะธั€ะตะบั‚ะพั€ะธั˜ัƒะผ ัƒ '%s': \"%s\""
+
+msgid "E952: Autocommand caused recursive behavior"
+msgstr "E952: ะัƒั‚ะพะบะพะผะฐะฝะดa je ะธะทะฐะทะฒะฐะปะฐ ั€ะตะบัƒั€ะทะธะฒะฝะพ ะฟะพะฝะฐัˆะฐัšะต"
+
+msgid "search hit TOP, continuing at BOTTOM"
+msgstr "ะฟั€ะตั‚ั€ะฐะณะฐ ั˜ะต ะดะพัั‚ะธะณะปะฐ ะ’ะ ะฅ, ะฝะฐัั‚ะฐะฒั™ะฐ ัะต ะฝะฐ ะ”ะะฃ"
+
+msgid "search hit BOTTOM, continuing at TOP"
+msgstr "ะฟั€ะตั‚ั€ะฐะณะฐ ั˜ะต ะดะพัั‚ะธะณะปะฐ ะ”ะะž, ะฝะฐัั‚ะฐะฒั™ะฐ ัะต ะฝะฐ ะ’ะ ะฅะฃ"
+
+#, c-format
+msgid "Need encryption key for \"%s\""
+msgstr "ะŸะพั‚ั€ะตะฑะฐะฝ ั˜ะต ะบั™ัƒั‡ ะทะฐ ัˆะธั„ั€ะพะฒะฐัšะต \"%s\""
+
+msgid "empty keys are not allowed"
+msgstr "ะฟั€ะฐะทะฝะธ ะบั™ัƒั‡ะตะฒะธ ะฝะธััƒ ะดะพะทะฒะพั™ะตะฝะธ"
+
+msgid "dictionary is locked"
+msgstr "ั€ะตั‡ะฝะธะบ ั˜ะต ะทะฐะบั™ัƒั‡ะฐะฝ"
+
+msgid "list is locked"
+msgstr "ะปะธัั‚ะฐ ั˜ะต ะทะฐะบั™ัƒั‡ะฐะฝะฐ"
+
+#, c-format
+msgid "failed to add key '%s' to dictionary"
+msgstr "ะบั™ัƒั‡ '%s' ะฝะธั˜ะต ะผะพะณะฐะพ ะดะฐ ัะต ะดะพะดะฐ ัƒ ั€ะตั‡ะฝะธะบ"
+
+#, c-format
+msgid "index must be int or slice, not %s"
+msgstr "index ะผะพั€ะฐ ะฑะธั‚ะธ ั‚ะธะฟะฐ int ะธะปะธ slice, ะฝะต %s"
+
+#, c-format
+msgid "expected str() or unicode() instance, but got %s"
+msgstr "ะพั‡ะตะบะธะฒะฐะปะฐ ัะต ะธะฝัั‚ะฐะฝั†ะฐ str() ะธะปะธ unicode(), ะฐะปะธ ั˜ะต ะดะพะฑะธั˜ะตะฝะฐ %s"
+
+#, c-format
+msgid "expected bytes() or str() instance, but got %s"
+msgstr "ะพั‡ะตะบะธะฒะฐะปะฐ ัะต ะธะฝัั‚ะฐะฝั†ะฐ bytes() ะธะปะธ str(), ะฐะปะธ ั˜ะต ะดะพะฑะธั˜ะตะฝะฐ %s"
+
+#, c-format
+msgid ""
+"expected int(), long() or something supporting coercing to long(), but got %s"
+msgstr ""
+"ะพั‡ะตะบะธะฒะฐะปะพ ัะต int(), long() ะธะปะธ ะฝะตัˆั‚ะพ ัˆั‚ะพ ะฟะพะดั€ะถะฐะฒะฐ ัะฟะฐั˜ะฐัšะต ัะฐ long(), ะฐะปะธ ั˜ะต "
+"ะดะพะฑะธั˜ะตะฝะพ %s"
+
+#, c-format
+msgid "expected int() or something supporting coercing to int(), but got %s"
+msgstr ""
+"ะพั‡ะตะบะธะฒะฐะปะพ ัะต int() ะธะปะธ ะฝะตัˆั‚ะพ ัˆั‚ะพ ะฟะพะดั€ะถะฐะฒะฐ ัะฟะฐั˜ะฐัšะต ัะฐ int(), ะฐะปะธ ั˜ะต ะดะพะฑะธั˜ะตะฝะพ %"
+"s"
+
+msgid "value is too large to fit into C int type"
+msgstr "ะฒั€ะตะดะฝะพัั‚ ั˜ะต ััƒะฒะธัˆะต ะฒะตะปะธะบะฐ ะดะฐ ัะต ัะผะตัั‚ะธ ัƒ C int ั‚ะธะฟ"
+
+msgid "value is too small to fit into C int type"
+msgstr "ะฒั€ะตะดะฝะพัั‚ ั˜ะต ััƒะฒะธัˆะต ะผะฐะปะฐ ะดะฐ ัะต ัะผะตัั‚ะธ ัƒ C int ั‚ะธะฟ"
+
+msgid "number must be greater than zero"
+msgstr "ะฑั€ะพั˜ ะผะพั€ะฐ ะฑะธั‚ะธ ะฒะตั›ะธ ะพะด ะฝัƒะปะต"
+
+msgid "number must be greater or equal to zero"
+msgstr "ะฑั€ะพั˜ ะผะพั€ะฐ ะฑะธั‚ะธ ะฒะตั›ะธ ะพะด ะธะปะธ ั˜ะตะดะฝะฐะบ ะฝัƒะปะธ"
+
+msgid "can't delete OutputObject attributes"
+msgstr "ะฐั‚ั€ะธะฑัƒั‚ะธ OutputObject ะฝะต ะผะพะณัƒ ะดะฐ ัะต ะพะฑั€ะธัˆัƒ"
+
+#, c-format
+msgid "invalid attribute: %s"
+msgstr "ะฝะตะฒะฐะถะตั›ะธ ะฐั‚ั€ะธะฑัƒั‚: %s"
+
+msgid "E264: Python: Error initialising I/O objects"
+msgstr "E264: Python: ะ“ั€ะตัˆะบะฐ ะบะพะด ะธะฝะธั†ะธั˜ะฐะปะธะทะฐั†ะธั˜ะต ะฃ/ะ˜ ะพะฑั˜ะตะบะฐั‚ะฐ"
+
+msgid "failed to change directory"
+msgstr "ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟั€ะพะผะตะฝะธ ะดะธั€ะตะบั‚ะพั€ะธั˜ัƒะผ"
+
+#, c-format
+msgid "expected 3-tuple as imp.find_module() result, but got %s"
+msgstr "ะšะฐะพ ั€ะตะทัƒะปั‚ะฐั‚ imp.find_module() ะพั‡ะตะบัƒั˜ะต ัะต ั‚ั€ะธะฟะปะตั‚, ะฐะปะธ ั˜ะต ะดะพะฑะธั˜ะตะฝะพ %s"
+
+#, c-format
+msgid "expected 3-tuple as imp.find_module() result, but got tuple of size %d"
+msgstr ""
+"ะšะฐะพ ั€ะตะทัƒะปั‚ะฐั‚ imp.find_module() ะพั‡ะตะบัƒั˜ะต ัะต ั‚ั€ะธะฟะปะตั‚, ะฐะปะธ ั˜ะต ะดะพะฑะธั˜ะตะฝะฐ ะฝ-ั‚ะพั€ะบะฐ "
+"ะฒะตะปะธั‡ะธะฝะต %d"
+
+msgid "internal error: imp.find_module returned tuple with NULL"
+msgstr "ะธะฝั‚ะตั€ะฝะฐ ะณั€ะตัˆะบะฐ: imp.find_module ั˜ะต ะฒั€ะฐั‚ะธะพ ะฝ-ั‚ะพั€ะบัƒ ัะฐ NULL"
+
+msgid "cannot delete vim.Dictionary attributes"
+msgstr "vim.Dictionary ะฐั‚ั€ะธะฑัƒั‚ะธ ะฝะต ะผะพะณัƒ ะดะฐ ัะต ะพะฑั€ะธัˆัƒ"
+
+msgid "cannot modify fixed dictionary"
+msgstr "ั„ะธะบัะฝะธ ั€ะตั‡ะฝะธะบ ะฝะต ะผะพะถะต ะดะฐ ัะต ะธะทะผะตะฝะธ"
+
+#, c-format
+msgid "cannot set attribute %s"
+msgstr "ะฐั‚ั€ะธะฑัƒั‚ %s ะฝะต ะผะพะถะต ะดะฐ ัะต ะฟะพัั‚ะฐะฒะธ"
+
+msgid "hashtab changed during iteration"
+msgstr "hashtab ั˜ะต ะฟั€ะพะผะตัšะตะฝ ั‚ะพะบะพะผ ะธั‚ะตั€ะฐั†ะธั˜ะต"
+
+#, c-format
+msgid "expected sequence element of size 2, but got sequence of size %d"
+msgstr ""
+"ะพั‡ะตะบะธะฒะฐะพ ัะต ะตะปะตะผะตะฝั‚ ัะตะบะฒะตะฝั†ะต ะฒะตะปะธั‡ะธะฝะต 2, ะฐะปะธ ั˜ะต ะดะพะฑะธั˜ะตะฝะฐ ัะตะบะฒะตะฝั†ะฐ "
+"ะฒะตะปะธั‡ะธะฝะต %d"
+
+msgid "list constructor does not accept keyword arguments"
+msgstr "ะบะพะฝัั‚ั€ัƒะบั‚ะพั€ ะปะธัั‚ะต ะฝะต ะฟั€ะธั…ะฒะฐั‚ะฐ ะบั™ัƒั‡ะฝะต ั€ะตั‡ะธ ะทะฐ ะฐั€ะณัƒะผะตะฝั‚ะต"
+
+msgid "list index out of range"
+msgstr "ะธะฝะดะตะบั ะปะธัั‚ะต ั˜ะต ะฒะฐะฝ ะพะฟัะตะณะฐ"
+
+#, c-format
+msgid "internal error: failed to get vim list item %d"
+msgstr "ะธะฝั‚ะตั€ะฝะฐ ะณั€ะตัˆะบะฐ: ัั‚ะฐะฒะบะฐ %d vim ะปะธัั‚ะต ะฝะธั˜ะต ะผะพะณะปะฐ ะดะฐ ัะต ะดะพะฑะธั˜ะต"
+
+msgid "slice step cannot be zero"
+msgstr "slice ะบะพั€ะฐะบ ะฝะต ะผะพะถะต ะดะฐ ะฑัƒะดะต ะฝัƒะปะฐ"
+
+#, c-format
+msgid "attempt to assign sequence of size greater than %d to extended slice"
+msgstr "ะฟะพะบัƒัˆะฐั˜ ะดะพะดะตะปะต ัะตะบะฒะตะฝั†ะต ะฒะตะปะธั‡ะธะฝะต ะฒะตั›ะต ะพะด %d ะบะฐะบะพ ะฑะธ ัะต ะฟั€ะพะดัƒะถะธะพ slice"
+
+#, c-format
+msgid "internal error: no vim list item %d"
+msgstr "ะธะฝั‚ะตั€ะฝะฐ ะณั€ะตัˆะบะฐ: ะฝะตะผะฐ ัั‚ะฐะฒะบะต %d ัƒ vim ะปะธัั‚ะธ"
+
+msgid "internal error: not enough list items"
+msgstr "ะธะฝั‚ะตั€ะฝะฐ ะณั€ะตัˆะบะฐ: ะฝะตะผะฐ ะดะพะฒะพั™ะฝะพ ัั‚ะฐะฒะบะธ ะปะธัั‚ะต"
+
+msgid "internal error: failed to add item to list"
+msgstr "ะธะฝั‚ะตั€ะฝะฐ ะณั€ะตัˆะบะฐ: ัั‚ะฐะฒะบะฐ ะฝะธั˜ะต ะผะพะณะปะฐ ะดะฐ ัะต ะดะพะดะฐ ะปะธัั‚ะธ"
+
+#, c-format
+msgid "attempt to assign sequence of size %d to extended slice of size %d"
+msgstr ""
+"ะฟะพะบัƒัˆะฐั˜ ะดะพะดะตะปะต ัะตะบะฒะตะฝั†ะต ะฒะตะปะธั‡ะธะฝะต %d ะบะฐะบะพ ะฑะธ ัะต ะฟั€ะพะดัƒะถะธะพ slice ะฒะตะปะธั‡ะธะฝะต %d"
+
+msgid "failed to add item to list"
+msgstr "ัั‚ะฐะฒะบะฐ ะฝะธั˜ะต ะผะพะณะปะฐ ะดะฐ ัะต ะดะพะดะฐ ะปะธัั‚ะธ"
+
+msgid "cannot delete vim.List attributes"
+msgstr "vim.List ะฐั‚ั€ะธะฑัƒั‚ะธ ะฝะต ะผะพะณัƒ ะดะฐ ัะต ะพะฑั€ะธัˆัƒ"
+
+msgid "cannot modify fixed list"
+msgstr "ั„ะธะบัะฝะฐ ะปะธัั‚ะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ะธะทะผะตะฝะธ"
+
+#, c-format
+msgid "unnamed function %s does not exist"
+msgstr "ะฝะตะธะผะตะฝะพะฒะฐะฝะฐ ั„ัƒะฝะบั†ะธั˜ะฐ %s ะฝะต ะฟะพัั‚ะพั˜ะธ"
+
+#, c-format
+msgid "function %s does not exist"
+msgstr "ั„ัƒะฝะบั†ะธั˜ะฐ %s ะฝะต ะฟะพัั‚ะพั˜ะธ"
+
+#, c-format
+msgid "failed to run function %s"
+msgstr "ั„ัƒะฝะบั†ะธั˜ะฐ %s ะฝะธั˜ะต ะผะพะณะปะฐ ะดะฐ ัะต ะฟะพะบั€ะตะฝะต"
+
+msgid "unable to get option value"
+msgstr "ะฒั€ะตะดะฝะพัั‚ ะพะฟั†ะธั˜ะต ะฝะธั˜ะต ะผะพะณะปะฐ ะดะฐ ัะต ะดะพะฑะธั˜ะต"
+
+msgid "internal error: unknown option type"
+msgstr "ะธะฝั‚ะตั€ะฝะฐ ะณั€ะตัˆะบะฐ: ะฝะตะฟะพะทะฝะฐั‚ ั‚ะธะฟ ะพะฟั†ะธั˜ะต"
+
+msgid "problem while switching windows"
+msgstr "ะฟั€ะพะฑะปะตะผ ะบะพะด ะฟั€ะตะฑะฐั†ะธะฒะฐัšะฐ ะฟั€ะพะทะพั€ะฐ"
+
+#, c-format
+msgid "unable to unset global option %s"
+msgstr "ะณะปะพะฑะฐะปะฝะฐ ะพะฟั†ะธั˜ะฐ %s ะฝะธั˜ะต ะผะพะณะปะฐ ะดะฐ ัะต ะธัะบั™ัƒั‡ะธ"
+
+#, c-format
+msgid "unable to unset option %s which does not have global value"
+msgstr "ะพะฟั†ะธั˜ะฐ %s ะบะพั˜ะฐ ะฝะตะผะฐ ะณะปะพะฑะฐะปะฝัƒ ะฒั€ะตะดะฝะพัั‚ ะฝะธั˜ะต ะผะพะณะปะฐ ะดะฐ ัะต ะธัะบั™ัƒั‡ะธ"
+
+msgid "attempt to refer to deleted tab page"
+msgstr "ะฟะพะบัƒัˆะฐั˜ ั€ะตั„ะตั€ะธัะฐัšะฐ ะฝะฐ ะพะฑั€ะธัะฐะฝัƒ ะบะฐั€ั‚ะธั†ัƒ"
+
+msgid "no such tab page"
+msgstr "ะฝะต ะฟะพัั‚ะพั˜ะธ ั‚ะฐะบะฒะฐ ะบะฐั€ั‚ะธั†ะฐ"
+
+msgid "attempt to refer to deleted window"
+msgstr "ะฟะพะบัƒัˆะฐั˜ ั€ะตั„ะตั€ะธัะฐัšะฐ ะฝะฐ ะพะฑั€ะธัะฐะฝ ะฟั€ะพะทะพั€"
+
+msgid "readonly attribute: buffer"
+msgstr "ะฐั‚ั€ะธะฑัƒั‚ ัะฐะผะพ ะทะฐ ั‡ะธั‚ะฐัšะต: ะฑะฐั„ะตั€"
+
+msgid "cursor position outside buffer"
+msgstr "ะฟะพะทะธั†ะธั˜ะฐ ะบัƒั€ัะพั€ะฐ ั˜ะต ะฒะฐะฝ ะฑะฐั„ะตั€ะฐ"
+
+msgid "no such window"
+msgstr "ะฝะตะผะฐ ั‚ะฐะบะฒะพะณ ะฟั€ะพะทะพั€ะฐ"
+
+msgid "attempt to refer to deleted buffer"
+msgstr "ะฟะพะบัƒัˆะฐั˜ ั€ะตั„ะตั€ะธัะฐัšะฐ ะฝะฐ ะพะฑั€ะธัะฐะฝ ะฑะฐั„ะตั€"
+
+msgid "failed to rename buffer"
+msgstr "ะธะผะต ะฑะฐั„ะตั€ะฐ ะฝะธั˜ะต ะผะพะณะปะพ ะดะฐ ัะต ะฟั€ะพะผะตะฝะธ"
+
+msgid "mark name must be a single character"
+msgstr "ะธะผะต ะผะฐั€ะบะตั€ะฐ ะผะพั€ะฐ ะฑะธั‚ะธ ัะฐะผะพ ั˜ะตะดะฐะฝ ะบะฐั€ะฐะบั‚ะตั€"
+
+#, c-format
+msgid "expected vim.Buffer object, but got %s"
+msgstr "ะพั‡ะตะบะธะฒะฐะพ ัะต vim.Buffer ะพะฑั˜ะตะบะฐั‚, ะฐะปะธ ั˜ะต ะดะพะฑะธั˜ะตะฝ %s"
+
+#, c-format
+msgid "failed to switch to buffer %d"
+msgstr "ะฟั€ะตะปะฐะทะฐะบ ะฝะฐ ะฑะฐั„ะตั€ %d ะฝะธั˜ะต ะฑะธะพ ะผะพะณัƒั›"
+
+#, c-format
+msgid "expected vim.Window object, but got %s"
+msgstr "ะพั‡ะตะบะธะฒะฐะพ ัะต vim.Window ะพะฑั˜ะตะบะฐั‚, ะฐะปะธ ั˜ะต ะดะพะฑะธั˜ะตะฝ %s"
+
+msgid "failed to find window in the current tab page"
+msgstr "ะฟั€ะพะทะพั€ ะฝะธั˜ะต ะฟั€ะพะฝะฐั’ะตะฝ ัƒ ั‚ะตะบัƒั›ะพั˜ ะบะฐั€ั‚ะธั†ะธ"
+
+msgid "did not switch to the specified window"
+msgstr "ะฝะธั˜ะต ัะต ะฟั€ะตัˆะปะพ ัƒ ะฝะฐะฒะตะดะตะฝะธ ะฟั€ะพะทะพั€"
+
+#, c-format
+msgid "expected vim.TabPage object, but got %s"
+msgstr "ะพั‡ะตะบะธะฒะฐะพ ัะต vim.TabPage ะพะฑั˜ะตะบะฐั‚, ะฐะปะธ ั˜ะต ะดะพะฑะธั˜ะตะฝ %s"
+
+msgid "did not switch to the specified tab page"
+msgstr "ะฝะธั˜ะต ัะต ะฟั€ะตัˆะปะพ ัƒ ะฝะฐะฒะตะดะตะฝัƒ ะบะฐั€ั‚ะธั†ัƒ"
+
+msgid "failed to run the code"
+msgstr "ะบรดะด ะฝะธั˜ะต ะผะพะณะฐะพ ะดะฐ ัะต ะฟะพะบั€ะตะฝะต"
+
+msgid "E858: Eval did not return a valid python object"
+msgstr "E858: Eval ะฝะธั˜ะต ะฒั€ะฐั‚ะธะพ ะฒะฐะถะตั›ะธ python ะพะฑั˜ะตะบะฐั‚"
+
+msgid "E859: Failed to convert returned python object to vim value"
+msgstr "E859: ะšะพะฝะฒะตั€ะทะธั˜ะฐ ะฒั€ะฐั›ะตะฝะพะณ python ะพะฑั˜ะตะบั‚ะฐ ัƒ vim ะฒั€ะตะดะฝะพัั‚ ะฝะธั˜ะต ัƒัะฟะตะปะฐ"
+
+#, c-format
+msgid "unable to convert %s to vim dictionary"
+msgstr "%s ะฝะต ะผะพะถะต ะดะฐ ัะต ะบะพะฝะฒะตั€ั‚ัƒั˜ะต ัƒ vim ั€ะตั‡ะฝะธะบ"
+
+#, c-format
+msgid "unable to convert %s to vim list"
+msgstr "%s ะฝะต ะผะพะถะต ะดะฐ ัะต ะบะพะฝะฒะตั€ั‚ัƒั˜ะต ัƒ vim ะปะธัั‚ัƒ"
+
+#, c-format
+msgid "unable to convert %s to vim structure"
+msgstr "%s ะฝะต ะผะพะถะต ะดะฐ ัะต ะบะพะฝะฒะตั€ั‚ัƒั˜ะต ัƒ vim ัั‚ั€ัƒะบั‚ัƒั€ัƒ"
+
+msgid "internal error: NULL reference passed"
+msgstr "ะธะฝั‚ะตั€ะฝะฐ ะณั€ะตัˆะบะฐ: ะฟั€ะพัะปะตั’ะตะฝะฐ ั˜ะต NULL ั€ะตั„ะตั€ะตะฝั†ะฐ"
+
+msgid "internal error: invalid value type"
+msgstr "ะธะฝั‚ะตั€ะฝะฐ ะณั€ะตัˆะบะฐ: ะฒั€ะตะดะฝะพัั‚ ะฝะตะฒะฐะถะตั›ะตะณ ั‚ะธะฟะฐ"
+
+msgid ""
+"Failed to set path hook: sys.path_hooks is not a list\n"
+"You should now do the following:\n"
+"- append vim.path_hook to sys.path_hooks\n"
+"- append vim.VIM_SPECIAL_PATH to sys.path\n"
+msgstr ""
+"ะšัƒะบะฐ ะทะฐ ะฟัƒั‚ะฐัšัƒ ะฝะธั˜ะต ะผะพะณะปะฐ ะดะฐ ัะต ะฟะพัั‚ะฐะฒะธ: sys.path_hooks ะฝะธั˜ะต ัƒ ะปะธัั‚ะธ\n"
+"ะกะฐะดะฐ ะฑะธ ั‚ั€ะตะฑะฐะปะพ ะดะฐ ัƒั€ะฐะดะธั‚ะต ัะปะตะดะตั›ะต:\n"
+"- ะดะพะดะฐั˜ั‚ะต vim.path_hook ะฝะฐ ะบั€ะฐั˜ sys.path_hooks\n"
+"- ะดะพะดะฐั˜ั‚ะต vim.VIM_SPECIAL_PATH ะฝะฐ ะบั€ะฐั˜ sys.path\n"
+
+msgid ""
+"Failed to set path: sys.path is not a list\n"
+"You should now append vim.VIM_SPECIAL_PATH to sys.path"
+msgstr ""
+"ะŸัƒั‚ะฐัšะฐ ะฝะธั˜ะต ะผะพะณะปะฐ ะดะฐ ัะต ะฟะพัั‚ะฐะฒะธ: sys.path ะฝะธั˜ะต ัƒ ะปะธัั‚ะธ\n"
+"ะกะฐะดะฐ ะฑะธ ั‚ั€ะตะฑะฐะปะพ ะดะฐ ะดะพะดะฐั‚ะต vim.VIM_SPECIAL_PATH ะฝะฐ ะบั€ะฐั˜ sys.path"
+
+msgid ""
+"Vim macro files (*.vim)\t*.vim\n"
+"All Files (*.*)\t*.*\n"
+msgstr ""
+"Vim ะผะฐะบั€ะพ ะดะฐั‚ะพั‚ะตะบะต (*.vim)\t*.vim\n"
+"ะกะฒะต ะดะฐั‚ะพั‚ะตะบะต (*.*)\t*.*\n"
+
+msgid "All Files (*.*)\t*.*\n"
+msgstr "ะกะฒะต ะดะฐั‚ะพั‚ะตะบะต (*.*)\t*.*\n"
+
+msgid ""
+"All Files (*.*)\t*.*\n"
+"C source (*.c, *.h)\t*.c;*.h\n"
+"C++ source (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
+"VB code (*.bas, *.frm)\t*.bas;*.frm\n"
+"Vim files (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
+msgstr ""
+"ะกะฒะต ะดะฐั‚ะพั‚ะตะบะต (*.*)\t*.*\n"
+"C ะธะทะฒะพั€ะฝะธ ะบะพะด (*.c, *.h)\t*.c;*.h\n"
+"C++ ะธะทะฒะพั€ะฝะธ ะบะพะด (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
+"VB ะบะพะด (*.bas, *.frm)\t*.bas;*.frm\n"
+"Vim ะดะฐั‚ะพั‚ะตะบะต (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
+
+msgid ""
+"Vim macro files (*.vim)\t*.vim\n"
+"All Files (*)\t*\n"
+msgstr ""
+"Vim ะผะฐะบั€ะพ ะดะฐั‚ะพั‚ะตะบะต (*.vim)\t*.vim\n"
+"ะกะฒะต ะดะฐั‚ะพั‚ะตะบะต (*)\t*\n"
+
+msgid "All Files (*)\t*\n"
+msgstr "ะกะฒะต ะดะฐั‚ะพั‚ะตะบะต (*)\t*\n"
+
+msgid ""
+"All Files (*)\t*\n"
+"C source (*.c, *.h)\t*.c;*.h\n"
+"C++ source (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
+"Vim files (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
+msgstr ""
+"ะกะฒะต ะดะฐั‚ะพั‚ะตะบะต (*)\t*\n"
+"C ะธะทะฒะพั€ะฝะธ ะบะพะด (*.c, *.h)\t*.c;*.h\n"
+"C++ ะธะทะฒะพั€ะฝะธ ะบะพะด (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
+"Vim ะดะฐั‚ะพั‚ะตะบะต (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
diff --git a/src/nvim/po/sv.po b/src/nvim/po/sv.po
index eedaecd1e7..4770db15de 100644
--- a/src/nvim/po/sv.po
+++ b/src/nvim/po/sv.po
@@ -818,7 +818,7 @@ msgstr "E216: Ingen sๅdan grupp eller hไndelse: %s"
#: ../fileio.c:5994
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
"--- Autokommandon ---"
@@ -842,7 +842,7 @@ msgstr "E218: autokommando nไstlad f๖r djupt"
#: ../fileio.c:7043
#, c-format
-msgid "%s Auto commands for \"%s\""
+msgid "%s Autocommands for \"%s\""
msgstr "%s Autokommandon f๖r \"%s\""
#: ../fileio.c:7049
@@ -3792,8 +3792,8 @@ msgstr "Varning: region %s st๖ds inte"
#: ../spell.c:4362
#, c-format
-msgid "Reading affix file %s ..."
-msgstr "Lไser affix-fil %s ..."
+msgid "Reading affix file %s..."
+msgstr "Lไser affix-fil %s..."
#: ../spell.c:4401 ../spell.c:5439 ../spell.c:5944
#, c-format
@@ -3953,8 +3953,8 @@ msgstr "%s vไrde skiljer sig frๅn vad som anvไnds i en annan .aff-fil."
#: ../spell.c:5406
#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "Lไser ordboksfil %s ..."
+msgid "Reading dictionary file %s..."
+msgstr "Lไser ordboksfil %s..."
#: ../spell.c:5415
#, c-format
@@ -3988,8 +3988,8 @@ msgstr "Ignorerade %d ord med icke-ASCII tecken i %s"
#: ../spell.c:5919
#, c-format
-msgid "Reading word file %s ..."
-msgstr "Lไser ordfil %s ..."
+msgid "Reading word file %s..."
+msgstr "Lไser ordfil %s..."
#: ../spell.c:5959
#, c-format
@@ -4058,8 +4058,8 @@ msgstr "Totalt antal ord: %d"
#: ../spell.c:7458
#, c-format
-msgid "Writing suggestion file %s ..."
-msgstr "Skriver f๖rslagsfil %s ..."
+msgid "Writing suggestion file %s..."
+msgstr "Skriver f๖rslagsfil %s..."
#: ../spell.c:7510 ../spell.c:7730
#, c-format
@@ -4085,8 +4085,8 @@ msgstr "Varning: bๅde sammansไttning och NOBREAK specifierad"
#: ../spell.c:7723
#, c-format
-msgid "Writing spell file %s ..."
-msgstr "Skriver stavningsfil %s ..."
+msgid "Writing spell file %s..."
+msgstr "Skriver stavningsfil %s..."
#: ../spell.c:7728
msgid "Done!"
@@ -4742,11 +4742,6 @@ msgstr "E900: Ogiltigt jobb-id"
msgid "E901: Job table is full"
msgstr "E901: Jobbtabellen ไr full"
-#: ../globals.h:1008
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr "E902: \"%s\" ไr inte k๖rbar"
-
#: ../globals.h:1009
#, c-format
msgid "E364: Library call failed for \"%s()\""
@@ -5680,7 +5675,7 @@ msgstr "-q [felfil] redigera fil med f๖rsta fel"
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
diff --git a/src/nvim/po/uk.cp1251.po b/src/nvim/po/uk.cp1251.po
deleted file mode 100644
index 2c6f3423ae..0000000000
--- a/src/nvim/po/uk.cp1251.po
+++ /dev/null
@@ -1,8388 +0,0 @@
-#
-# Ukrainian Vim translation [uk]
-#
-# Copyright (C) 2001 Bohdan Vlasyuk <bohdan@vstu.edu.ua>
-# Bohdan donated this work to be distributed with Vim under the Vim license.
-#
-# Thanks to:
-# Dmytro Kovalov <dmytro.kovalov@nssmb.com> for useful suggestions
-# Dmytro O. Redchuk <dor@kiev-online.net> for viminfo bug
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: vim 7.4\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-05-26 14:21+0200\n"
-"PO-Revision-Date: 2010-06-18 21:53+0300\n"
-"Last-Translator: ภํเ๒๎๋ณ้ ัเ๕ํณ๊ <sakhnik@gmail.com>\n"
-"Language-Team: Bohdan Vlasyuk <bohdan@vstu.edu.ua>\n"
-"Language: uk\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=cp1251\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: ../api/private/helpers.c:201
-#, fuzzy
-msgid "Unable to get option value"
-msgstr "ํๅ โไเ๋๎๑ ๎๒๐่์เ๒่ ็ํเ๗ๅํํ ๎๏๖ณฟ"
-
-#: ../api/private/helpers.c:204
-msgid "internal error: unknown option type"
-msgstr "โํ๓๒๐ณ๘ํ ๏๎์่๋๊เ: ํๅโณไ๎์่้ ๒่๏ ๎๏๖ณฟ"
-
-#: ../buffer.c:92
-msgid "[Location List]"
-msgstr "[ั๏่๑๎๊ ์ณ๑๖]"
-
-#: ../buffer.c:93
-msgid "[Quickfix List]"
-msgstr "[ั๏่๑๎๊ โ่๏๐เโ๋ๅํ]"
-
-#: ../buffer.c:94
-msgid "E855: Autocommands caused command to abort"
-msgstr "E855: ภโ๒๎๊๎์เํไ่ ๏๐่็โๅ๋่ ไ๎ ๑๊เ๑๓โเํํ ๊๎์เํไ่"
-
-#: ../buffer.c:135
-msgid "E82: Cannot allocate any buffer, exiting..."
-msgstr "E82: อๅ์เบ ์๎ๆ๋่โ๎๑๒ณ ๐๎็์ณ๑๒่๒่ ๕๎๗ ๎ไ่ํ แ๓๔ๅ๐, ็เโๅ๐๘ๅํํ ๐๎แ๎๒่..."
-
-#: ../buffer.c:138
-msgid "E83: Cannot allocate buffer, using other one..."
-msgstr "E83: อๅ์เบ ์๎ๆ๋่โ๎๑๒ณ ๐๎็์ณ๑๒่๒่ แ๓๔ๅ๐, แ๓ไๅ โ่๊๎๐่๑๒เํ๎ ณํ๘่้..."
-
-#: ../buffer.c:763
-msgid "E515: No buffers were unloaded"
-msgstr "E515: ฦ๎ไๅํ ็ แ๓๔ๅ๐ณโ ํๅ แ๓โ โ่โเํ๒เๆๅํ่้"
-
-#: ../buffer.c:765
-msgid "E516: No buffers were deleted"
-msgstr "E516: ฦ๎ไๅํ ็ แ๓๔ๅ๐ณโ ํๅ ็ํ่๙ๅํ๎"
-
-#: ../buffer.c:767
-msgid "E517: No buffers were wiped out"
-msgstr "E517: ฦ๎ไๅํ ็ แ๓๔ๅ๐ณโ ํๅ โ่๒ๅ๐๒๎"
-
-#: ../buffer.c:772
-msgid "1 buffer unloaded"
-msgstr "ย่โเํ๒เๆๅํ๎ ๎ไ่ํ แ๓๔ๅ๐"
-
-#: ../buffer.c:774
-#, c-format
-msgid "%d buffers unloaded"
-msgstr "ย่โเํ๒เๆๅํ๎ %d แ๓๔ๅ๐่(ณโ)"
-
-#: ../buffer.c:777
-msgid "1 buffer deleted"
-msgstr "วํ่๙ๅํ๎ ๎ไ่ํ แ๓๔ๅ๐"
-
-#: ../buffer.c:779
-#, c-format
-msgid "%d buffers deleted"
-msgstr "วํ่๙ๅํ๎ %d แ๓๔ๅ๐่(ณโ)"
-
-#: ../buffer.c:782
-msgid "1 buffer wiped out"
-msgstr "ย่๒ๅ๐๒๎ ๎ไ่ํ แ๓๔ๅ๐"
-
-#: ../buffer.c:784
-#, c-format
-msgid "%d buffers wiped out"
-msgstr "ย่๒ๅ๐๒๎ %d แ๓๔ๅ๐่(ณโ)"
-
-#: ../buffer.c:806
-msgid "E90: Cannot unload last buffer"
-msgstr "E90: อๅ ์๎ๆ๓ โ่โเํ๒เๆ่๒่ ๎๑๒เํํณ้ แ๓๔ๅ๐"
-
-#: ../buffer.c:874
-msgid "E84: No modified buffer found"
-msgstr "E84: ฦ๎ไๅํ แ๓๔ๅ๐ ํๅ ็์ณํๅํ๎"
-
-#. back where we started, didn't find anything.
-#: ../buffer.c:903
-msgid "E85: There is no listed buffer"
-msgstr "E85: ำ ๑๏่๑๊๓ ํๅ์เบ แ๓๔ๅ๐ณโ"
-
-#: ../buffer.c:913
-#, c-format
-msgid "E86: Buffer %<PRId64> does not exist"
-msgstr "E86: ม๓๔ๅ๐เ %<PRId64> ํๅ์เบ"
-
-#: ../buffer.c:915
-msgid "E87: Cannot go beyond last buffer"
-msgstr "E87: ึๅ โๆๅ ๎๑๒เํํณ้ แ๓๔ๅ๐"
-
-#: ../buffer.c:917
-msgid "E88: Cannot go before first buffer"
-msgstr "E88: ึๅ โๆๅ ํเ้๏ๅ๐๘่้ แ๓๔ๅ๐"
-
-#: ../buffer.c:945
-#, c-format
-msgid ""
-"E89: No write since last change for buffer %<PRId64> (add ! to override)"
-msgstr "E89: ม๓๔ๅ๐ %<PRId64> ์เบ ็์ณํ่ (! ๙๎แ ํๅ ็โเๆเ๒่)"
-
-#. wrap around (may cause duplicates)
-#: ../buffer.c:1423
-msgid "W14: Warning: List of file names overflow"
-msgstr "W14: ฮแๅ๐ๅๆํ๎: ั๏่๑๎๊ ํเ็โ ๔เ้๋ณโ ๏ๅ๐ๅ๏๎โํๅํ๎"
-
-#: ../buffer.c:1555 ../quickfix.c:3361
-#, c-format
-msgid "E92: Buffer %<PRId64> not found"
-msgstr "E92: ม๓๔ๅ๐ %<PRId64> ํๅ ็ํเ้ไๅํ๎"
-
-#: ../buffer.c:1798
-#, c-format
-msgid "E93: More than one match for %s"
-msgstr "E93: วํเ้ไๅํ๎ ๊ณ๋๊เ ็แณใณโ ็ %s"
-
-#: ../buffer.c:1800
-#, c-format
-msgid "E94: No matching buffer for %s"
-msgstr "E94: อๅ ็ํเ้ไๅํ๎ แ๓๔ๅ๐, ๑๕๎ๆ่้ ํเ %s"
-
-#: ../buffer.c:2161
-#, c-format
-msgid "line %<PRId64>"
-msgstr "๐ไ๎๊ %<PRId64>"
-
-#: ../buffer.c:2233
-msgid "E95: Buffer with this name already exists"
-msgstr "E95: ม๓๔ๅ๐ ็ ๒เ๊๎ ํเ็โ๎ โๆๅ ณ๑ํ๓บ"
-
-#: ../buffer.c:2498
-msgid " [Modified]"
-msgstr " [ว์ณํๅํ๎]"
-
-#: ../buffer.c:2501
-msgid "[Not edited]"
-msgstr "[อๅ ๐ๅไเใ๎โเํ๎]"
-
-#: ../buffer.c:2504
-msgid "[New file]"
-msgstr "[อ๎โ่้ ๔เ้๋]"
-
-#: ../buffer.c:2505
-msgid "[Read errors]"
-msgstr "[ฯ๎์่๋๊่ ๗่๒เํํ]"
-
-#: ../buffer.c:2506 ../buffer.c:3217 ../fileio.c:1807 ../screen.c:4895
-msgid "[RO]"
-msgstr "[RO]"
-
-#: ../buffer.c:2507 ../fileio.c:1807
-msgid "[readonly]"
-msgstr "[๋่๘ๅ ๗่๒เ๒่]"
-
-#: ../buffer.c:2524
-#, c-format
-msgid "1 line --%d%%--"
-msgstr "๎ไ่ํ ๐ไ๎๊ --%d%%--"
-
-#: ../buffer.c:2526
-#, c-format
-msgid "%<PRId64> lines --%d%%--"
-msgstr "%<PRId64> ๐ไ๊่(ณโ) --%d%%--"
-
-#: ../buffer.c:2530
-#, c-format
-msgid "line %<PRId64> of %<PRId64> --%d%%-- col "
-msgstr "๐ไ๎๊ %<PRId64> ็ %<PRId64> --%d%%-- ๊๎๋๎ํ๊เ "
-
-#: ../buffer.c:2632 ../buffer.c:4292 ../memline.c:1554
-msgid "[No Name]"
-msgstr "[มๅ็ ํเ็โ่]"
-
-#. must be a help buffer
-#: ../buffer.c:2667
-msgid "help"
-msgstr "ไ๎๏๎์๎ใเ"
-
-#: ../buffer.c:3225 ../screen.c:4883
-msgid "[Help]"
-msgstr "[ฤ๎๏๎์๎ใเ]"
-
-#: ../buffer.c:3254 ../screen.c:4887
-msgid "[Preview]"
-msgstr "[ฯๅ๐ๅใ๋ไ]"
-
-#: ../buffer.c:3528
-msgid "All"
-msgstr "ำ๑ๅ"
-
-#: ../buffer.c:3528
-msgid "Bot"
-msgstr "วํ่็๓"
-
-#: ../buffer.c:3531
-msgid "Top"
-msgstr "ยใ๎๐ณ"
-
-#: ../buffer.c:4244
-msgid ""
-"\n"
-"# Buffer list:\n"
-msgstr ""
-"\n"
-"# ั๏่๑๎๊ แ๓๔ๅ๐ณโ:\n"
-
-#: ../buffer.c:4289
-msgid "[Scratch]"
-msgstr "[ว ํ๓๋]"
-
-#: ../buffer.c:4529
-msgid ""
-"\n"
-"--- Signs ---"
-msgstr ""
-"\n"
-"--- ฯ๎็ํเ๗๊่ ---"
-
-#: ../buffer.c:4538
-#, c-format
-msgid "Signs for %s:"
-msgstr "ฯ๎็ํเ๗๊่ ไ๋ %s:"
-
-#: ../buffer.c:4543
-#, c-format
-msgid " line=%<PRId64> id=%d name=%s"
-msgstr " ๐ไ๎๊=%<PRId64> id=%d ํเ็โเ=%s"
-
-#: ../cursor_shape.c:68
-msgid "E545: Missing colon"
-msgstr "E545: ฯ๐๎๏๓๙ๅํ๎ ไโ๎๊๐เ๏๊๓"
-
-#: ../cursor_shape.c:70 ../cursor_shape.c:94
-msgid "E546: Illegal mode"
-msgstr "E546: อๅ๏๐เโ่๋ํ่้ ๐ๅๆ่์"
-
-#: ../cursor_shape.c:134
-msgid "E548: digit expected"
-msgstr "E548: ฯ๎๒๐ณแํเ ๖่๔๐เ"
-
-#: ../cursor_shape.c:138
-msgid "E549: Illegal percentage"
-msgstr "E549: อๅ๏๐เโ่๋ํ่้ โณไ๑๎๒๎๊"
-
-#: ../diff.c:146
-#, c-format
-msgid "E96: Can not diff more than %<PRId64> buffers"
-msgstr "E96: อๅ ์๎ๆํเ ๏๎๐ณโํโเ๒่ ๏๎ํเไ %<PRId64> แ๓๔ๅ๐่(ณโ)"
-
-#: ../diff.c:753
-msgid "E810: Cannot read or write temp files"
-msgstr "E810: อๅ ์๎ๆํเ ๗่๒เ๒่ ๗่ ็เ๏่๑๓โเ๒่ ๒่์๗เ๑๎โณ ๔เ้๋่"
-
-#: ../diff.c:755
-msgid "E97: Cannot create diffs"
-msgstr "E97: อๅ โไเ๋๎๑ ๑๒โ๎๐่๒่ ๏๎๐ณโํํํ"
-
-#: ../diff.c:966
-msgid "E816: Cannot read patch output"
-msgstr "E816: อๅ โไเ๋๎๑ ๏๐๎๗่๒เ๒่ ๐ๅ็๓๋๒เ๒ patch"
-
-#: ../diff.c:1220
-msgid "E98: Cannot read diff output"
-msgstr "E98: อๅ โไเ๋๎๑ ๏๐๎๗่๒เ๒่ ๐ๅ็๓๋๒เ๒ diff"
-
-#: ../diff.c:2081
-msgid "E99: Current buffer is not in diff mode"
-msgstr "E99: ึๅ้ แ๓๔ๅ๐ ํๅ โ ๐ๅๆ่์ณ ๏๎๐ณโํํํ"
-
-#: ../diff.c:2100
-msgid "E793: No other buffer in diff mode is modifiable"
-msgstr "E793: อๅ์เบ แณ๋๘ๅ ์๎ไ่๔ณ๊๎โํ่๕ แ๓๔ๅ๐ณโ โ ๐ๅๆ่์ณ ๏๎๐ณโํํํ"
-
-#: ../diff.c:2102
-msgid "E100: No other buffer in diff mode"
-msgstr "E100: อๅ์เบ ณํ๘่๕ แ๓๔ๅ๐ณโ โ ๐ๅๆ่์ณ ๏๎๐ณโํํํ"
-
-#: ../diff.c:2112
-msgid "E101: More than two buffers in diff mode, don't know which one to use"
-msgstr ""
-"E101: ฯ๎ํเไ ไโเ แ๓๔ๅ๐่ ๓ ๐ๅๆ่์ณ ๏๎๐ณโํํํ, ํๅ ็๐๎็๓์ณ๋๎, ๊๎๒๐่้ ณ็ ํ่๕ "
-"โ่๊๎๐่๑๒เ๒่"
-
-#: ../diff.c:2141
-#, c-format
-msgid "E102: Can't find buffer \"%s\""
-msgstr "E102: อๅ โไเ๋๎๑ ็ํเ้๒่ แ๓๔ๅ๐ ซ%sป"
-
-#: ../diff.c:2152
-#, c-format
-msgid "E103: Buffer \"%s\" is not in diff mode"
-msgstr "E103: ม๓๔ๅ๐ ซ%sป ํๅ โ ๐ๅๆ่์ณ ๏๎๐ณโํํํ"
-
-#: ../diff.c:2193
-msgid "E787: Buffer changed unexpectedly"
-msgstr "E787: ม๓๔ๅ๐ ํๅ๑๏๎ไณโเํ๎ ็์ณํ่โ๑"
-
-#: ../digraph.c:1598
-msgid "E104: Escape not allowed in digraph"
-msgstr "E104: ำ ไ่ใ๐เ๔เ๕ ํๅ ์๎ๆๅ ์ณ๑๒่๒่๑ escape"
-
-#: ../digraph.c:1760
-msgid "E544: Keymap file not found"
-msgstr "E544: อๅ ็ํเ้ไๅํ๎ ๔เ้๋ ๐๎็๊๋เไ๊่"
-
-#: ../digraph.c:1785
-msgid "E105: Using :loadkeymap not in a sourced file"
-msgstr "E105: :loadkeymap โ่๊๎๐่๑๒เํ๎ ํๅ ๓ ๔เ้๋ณ ๊๎์เํไ"
-
-#: ../digraph.c:1821
-msgid "E791: Empty keymap entry"
-msgstr "E791: ล๋ๅ์ๅํ๒ ๐๎็๊๋เไ๊่ ๏๎๐๎ๆํณ้"
-
-#: ../edit.c:82
-msgid " Keyword completion (^N^P)"
-msgstr " ฤ๎๏๎โํๅํํ ๊๋๗๎โ่๕ ๑๋ณโ (^N^P)"
-
-#. ctrl_x_mode == 0, ^P/^N compl.
-#: ../edit.c:83
-msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-msgstr " ะๅๆ่์ ^X (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-
-#: ../edit.c:85
-msgid " Whole line completion (^L^N^P)"
-msgstr " ฤ๎๏๎โํๅํํ ๓๑๎ใ๎ ๐ไ๊เ (^L^N^P)"
-
-#: ../edit.c:86
-msgid " File name completion (^F^N^P)"
-msgstr " ฤ๎๏๎โํๅํํ ํเ็โ่ ๔เ้๋๓ (^F^N^P)"
-
-#: ../edit.c:87
-msgid " Tag completion (^]^N^P)"
-msgstr " ฤ๎๏๎โํๅํํ ๒ๅดณโ (^]^N^P)"
-
-#: ../edit.c:88
-msgid " Path pattern completion (^N^P)"
-msgstr " ฤ๎๏๎โํๅํํ ๘๋๕๓ ็เ ็๐เ็๊๎์ (^N^P)"
-
-#: ../edit.c:89
-msgid " Definition completion (^D^N^P)"
-msgstr " ฤ๎๏๎โํๅํํ โ่็ํเ๗ๅํํ (^D^N^P)"
-
-#: ../edit.c:91
-msgid " Dictionary completion (^K^N^P)"
-msgstr " ฤ๎๏๎โํๅํํ ็ณ ๑๋๎โํ่๊เ (^K^N^P)"
-
-#: ../edit.c:92
-msgid " Thesaurus completion (^T^N^P)"
-msgstr " ฤ๎๏๎โํๅํํ ็ ๒ๅ็เ๓๐๓๑๓ (^T^N^P)"
-
-#: ../edit.c:93
-msgid " Command-line completion (^V^N^P)"
-msgstr " ฤ๎๏๎โํๅํํ ๊๎์เํไ (^V^N^P)"
-
-#: ../edit.c:94
-msgid " User defined completion (^U^N^P)"
-msgstr " ส๎๐่๑๒๓โเ๖๊ๅ ไ๎๏๎โํๅํํ (^U^N^P)"
-
-#: ../edit.c:95
-msgid " Omni completion (^O^N^P)"
-msgstr " ส์ณ๒๋่โๅ ไ๎๏๎โํๅํํ (^O^N^P)"
-
-#: ../edit.c:96
-msgid " Spelling suggestion (s^N^P)"
-msgstr " ฮ๐๔๎ใ๐เ๔ณ๗ํเ ๏ณไ๊เ็๊เ (s^N^P)"
-
-#: ../edit.c:97
-msgid " Keyword Local completion (^N^P)"
-msgstr " ฤ๎๏๎โํๅํํ ์ณ๑๖ๅโ่๕ ๊๋๗๎โ่๕ ๑๋ณโ (^N^P)"
-
-#: ../edit.c:100
-msgid "Hit end of paragraph"
-msgstr "า๐เ๏่โ๑ ๊ณํๅ๖ ๏เ๐เใ๐เ๔เ"
-
-# msgstr "E443: "
-#: ../edit.c:101
-msgid "E839: Completion function changed window"
-msgstr "E839: ิ๓ํ๊๖ณ ไ๎๏๎โํๅํํ ็์ณํ่๋เ โณ๊ํ๎"
-
-#: ../edit.c:102
-msgid "E840: Completion function deleted text"
-msgstr "E840: ิ๓ํ๊๖ณ ไ๎๏๎โํๅํํ ็ํ่๙่๋เ ๒ๅ๊๑๒"
-
-#: ../edit.c:1847
-msgid "'dictionary' option is empty"
-msgstr "ฮ๏๖ณ 'dictionary' ๏๎๐๎ๆํ"
-
-#: ../edit.c:1848
-msgid "'thesaurus' option is empty"
-msgstr "ฮ๏๖ณ 'thesaurus' ๏๎๐๎ๆํ"
-
-#: ../edit.c:2655
-#, c-format
-msgid "Scanning dictionary: %s"
-msgstr "ั๊เํ๓บ๒๑ ๑๋๎โํ่๊: %s"
-
-#: ../edit.c:3079
-msgid " (insert) Scroll (^E/^Y)"
-msgstr " (โ๑๒เโ๊เ) ฯ๐๎ใ๎๐ํ๓๒่ (^E/^Y)"
-
-#: ../edit.c:3081
-msgid " (replace) Scroll (^E/^Y)"
-msgstr " (็เ์ณํเ) ฯ๐๎ใ๎๐ํ๓๒่ (^E/^Y)"
-
-#: ../edit.c:3587
-#, c-format
-msgid "Scanning: %s"
-msgstr "ฯ๎๘๓๊ ๓: %s"
-
-#: ../edit.c:3614
-msgid "Scanning tags."
-msgstr "ฯ๎๘๓๊ ๑ๅ๐ๅไ ๒ๅดณโ."
-
-#: ../edit.c:4519
-msgid " Adding"
-msgstr " ฤ๎ไเบ๒๑"
-
-#. showmode might reset the internal line pointers, so it must
-#. * be called before line = ml_get(), or when this address is no
-#. * longer needed. -- Acevedo.
-#.
-#: ../edit.c:4562
-msgid "-- Searching..."
-msgstr "-- ฯ๎๘๓๊..."
-
-#: ../edit.c:4618
-msgid "Back at original"
-msgstr "ฯ๎๗เ๒๊๎โ่้ โเ๐ณเํ๒"
-
-#: ../edit.c:4621
-msgid "Word from other line"
-msgstr "ั๋๎โ๎ ็ ณํ๘๎ใ๎ ๐ไ๊เ"
-
-#: ../edit.c:4624
-msgid "The only match"
-msgstr "ชไ่ํ่้ ็แณใ"
-
-#: ../edit.c:4680
-#, c-format
-msgid "match %d of %d"
-msgstr "็แณใ %d ็ %d"
-
-#: ../edit.c:4684
-#, c-format
-msgid "match %d"
-msgstr "็แณใ %d"
-
-# msgstr "E17: "
-#: ../eval.c:137
-msgid "E18: Unexpected characters in :let"
-msgstr "E18: อๅ๎๗ณ๊๓โเํณ ๑่์โ๎๋่ ๓ :let"
-
-#: ../eval.c:138
-#, c-format
-msgid "E684: list index out of range: %<PRId64>"
-msgstr "E684: ฒํไๅ๊๑ ๑๏่๑๊๓ ๏๎็เ ์ๅๆเ์่: %<PRId64>"
-
-#: ../eval.c:139
-#, c-format
-msgid "E121: Undefined variable: %s"
-msgstr "E121: อๅโ่็ํเ๗ๅํเ ็์ณํํเ: %s"
-
-#: ../eval.c:140
-msgid "E111: Missing ']'"
-msgstr "E111: ม๐เ๊๓บ ']'"
-
-#: ../eval.c:141
-#, c-format
-msgid "E686: Argument of %s must be a List"
-msgstr "E686: ภ๐ใ๓์ๅํ๒ ๓ %s ์เบ แ๓๒่ ๑๏่๑๊๎์"
-
-#: ../eval.c:143
-#, c-format
-msgid "E712: Argument of %s must be a List or Dictionary"
-msgstr "E712: ภ๐ใ๓์ๅํ๒ ๓ %s ์เบ แ๓๒่ ๑๏่๑๊๎์ ๗่ ๑๋๎โํ่๊๎์"
-
-#: ../eval.c:144
-msgid "E713: Cannot use empty key for Dictionary"
-msgstr "E713: ส๋๗ ๑๋๎โํ่๊เ ํๅ ์๎ๆๅ แ๓๒่ ๏๎๐๎ๆํณ์"
-
-# msgstr "E396: "
-#: ../eval.c:145
-msgid "E714: List required"
-msgstr "E714: ฯ๎๒๐ณแๅํ ๑๏่๑๎๊"
-
-#: ../eval.c:146
-msgid "E715: Dictionary required"
-msgstr "E715: ฯ๎๒๐ณแๅํ ๑๋๎โํ่๊"
-
-#: ../eval.c:147
-#, c-format
-msgid "E118: Too many arguments for function: %s"
-msgstr "E118: วเแเใเ๒๎ เ๐ใ๓์ๅํ๒ณโ ไ๋ ๔๓ํ๊๖ณฟ: %s"
-
-#: ../eval.c:148
-#, c-format
-msgid "E716: Key not present in Dictionary: %s"
-msgstr "E716: อๅ์เบ ๒เ๊๎ใ๎ ๊๋๗เ ๓ ๑๋๎โํ่๊๓: %s"
-
-#: ../eval.c:150
-#, c-format
-msgid "E122: Function %s already exists, add ! to replace it"
-msgstr "E122: ิ๓ํ๊๖ณ %s ๓ๆๅ ณ๑ํ๓บ, ! ๙๎แ ็เ์ณํ่๒่"
-
-#: ../eval.c:151
-msgid "E717: Dictionary entry already exists"
-msgstr "E717: วเ๏่๑ ๓ ๑๋๎โํ่๊๓ โๆๅ ณ๑ํ๓บ"
-
-#: ../eval.c:152
-msgid "E718: Funcref required"
-msgstr "E718: า๐ๅแเ ๏๎๑่๋เํํ ํเ ๔๓ํ๊๖ณ"
-
-#: ../eval.c:153
-msgid "E719: Cannot use [:] with a Dictionary"
-msgstr "E719: อๅ ์๎ๆํเ โ่๊๎๐่๑๒เ๒่ [:] ็ณ ๑๋๎โํ่๊๎์"
-
-#: ../eval.c:154
-#, c-format
-msgid "E734: Wrong variable type for %s="
-msgstr "E734: อๅ๏๐เโ่๋ํ่้ ๒่๏ ็์ณํํ๎ฟ ไ๋ %s="
-
-#: ../eval.c:155
-#, c-format
-msgid "E130: Unknown function: %s"
-msgstr "E130: อๅโณไ๎์เ ๔๓ํ๊๖ณ: %s"
-
-#: ../eval.c:156
-#, c-format
-msgid "E461: Illegal variable name: %s"
-msgstr "E461: อๅ๏๐่๏๓๑๒่์เ ํเ็โเ ็์ณํํ๎ฟ: %s"
-
-# msgstr "E373: "
-#: ../eval.c:157
-msgid "E806: using Float as a String"
-msgstr "E806: Float โๆ่๒๎ ๊ String"
-
-#: ../eval.c:1830
-msgid "E687: Less targets than List items"
-msgstr "E687: ึณ๋ๅ้ ์ๅํ๘ๅ, ํณๆ ๅ๋ๅ์ๅํ๒ณโ ๑๏่๑๊๓"
-
-#: ../eval.c:1834
-msgid "E688: More targets than List items"
-msgstr "E688: ึณ๋ๅ้ แณ๋๘ๅ, ํณๆ ๅ๋ๅ์ๅํ๒ณโ ๑๏่๑๊๓"
-
-#: ../eval.c:1906
-msgid "Double ; in list of variables"
-msgstr "ฤ๐๓ใเ ; ๓ ๑๏่๑๊๓ ็์ณํํ่๕"
-
-# msgstr "E235: "
-#: ../eval.c:2078
-#, c-format
-msgid "E738: Can't list variables for %s"
-msgstr "E738: อๅ ์๎ๆํเ ๏ๅ๐ๅ๐เ๕๓โเ๒่ ็์ณํํณ ๓ %s"
-
-#: ../eval.c:2391
-msgid "E689: Can only index a List or Dictionary"
-msgstr "E689: ฒํไๅ๊๑ํ่้ ไ๎๑๒๓๏ ์๎ๆๅ แ๓๒่ ๒ณ๋๊่ ไ๎ ๑๏่๑๊๓ ๗่ ๑๋๎โํ่๊เ"
-
-#: ../eval.c:2396
-msgid "E708: [:] must come last"
-msgstr "E708: [:] ์เบ แ๓๒่ ๎๑๒เํํ๎"
-
-#: ../eval.c:2439
-msgid "E709: [:] requires a List value"
-msgstr "E709: [:] โ่์เใเบ ๑๏่๑๎๊"
-
-#: ../eval.c:2674
-msgid "E710: List value has more items than target"
-msgstr "E710: ั๏่๑๎๊ ์เบ แณ๋๘ๅ ๅ๋ๅ์ๅํ๒ณโ, ํณๆ ๖ณ๋"
-
-#: ../eval.c:2678
-msgid "E711: List value has not enough items"
-msgstr "E711: ั๏่๑๎๊ ์เบ ํๅไ๎๑๒เ๒ํ๎ ๅ๋ๅ์ๅํ๒ณโ"
-
-#: ../eval.c:2867
-msgid "E690: Missing \"in\" after :for"
-msgstr "E690: ฯ๐๎๏๓๙ๅํ๎ ซinป ๏ณ๑๋ :for"
-
-#: ../eval.c:3063
-#, c-format
-msgid "E107: Missing parentheses: %s"
-msgstr "E107: ฯ๐๎๏๓๙ๅํ๎ ไ๓ๆ๊่: %s"
-
-#: ../eval.c:3263
-#, c-format
-msgid "E108: No such variable: \"%s\""
-msgstr "E108: ว์ณํํ๎ฟ ํๅ์เบ: ซ%sป"
-
-#: ../eval.c:3333
-msgid "E743: variable nested too deep for (un)lock"
-msgstr "E743: ว์ณํํเ ์เบ ็เแเใเ๒๎ โ๊๋เไๅํ ๙๎แ แ๓๒่ ็เ-/โณไ๊๐่๒๎."
-
-#: ../eval.c:3630
-msgid "E109: Missing ':' after '?'"
-msgstr "E109: ม๐เ๊๓บ ':' ๏ณ๑๋ '?'"
-
-#: ../eval.c:3893
-msgid "E691: Can only compare List with List"
-msgstr "E691: ั๏่๑๎๊ ์๎ๆํเ ๏๎๐ณโํ๒่ ๒ณ๋๊่ ็ณ ๑๏่๑๊๎์"
-
-#: ../eval.c:3895
-msgid "E692: Invalid operation for Lists"
-msgstr "E692: อๅ๊๎๐ๅ๊๒ํเ ๎๏ๅ๐เ๖ณ ํเไ ๑๏่๑๊๎์"
-
-#: ../eval.c:3915
-msgid "E735: Can only compare Dictionary with Dictionary"
-msgstr "E735: ั๋๎โํ่๊ ์๎ๆํเ ๏๎๐ณโํ๒่ ๒ณ๋๊่ ณ็ ๑๋๎โํ่๊๎์"
-
-#: ../eval.c:3917
-msgid "E736: Invalid operation for Dictionary"
-msgstr "E736: อๅ๊๎๐ๅ๊๒ํเ ๎๏ๅ๐เ๖ณ ํเไ ๑๋๎โํ่๊๎์"
-
-#: ../eval.c:3932
-msgid "E693: Can only compare Funcref with Funcref"
-msgstr "E693: ิ๓ํ๊๖ณ ์๎ๆํเ ๏๎๐ณโํ๒่ ๒ณ๋๊่ ็ ๔๓ํ๊๖ณบ"
-
-#: ../eval.c:3934
-msgid "E694: Invalid operation for Funcrefs"
-msgstr "E694: อๅ๊๎๐ๅ๊๒ํเ ๎๏ๅ๐เ๖ณ ํเไ ๔๓ํ๊๖ณบ"
-
-#: ../eval.c:4277
-msgid "E804: Cannot use '%' with Float"
-msgstr "E804: อๅ ์๎ๆํเ โ่๊๎ํเ๒่ '%' ํเไ Float"
-
-#: ../eval.c:4478
-msgid "E110: Missing ')'"
-msgstr "E110: ฯ๐๎๏๓๙ๅํ๎ ')'"
-
-#: ../eval.c:4609
-msgid "E695: Cannot index a Funcref"
-msgstr "E695: ิ๓ํ๊๖ณ ํๅ ์เบ ณํไๅ๊๑เ๖ณฟ"
-
-#: ../eval.c:4839
-#, c-format
-msgid "E112: Option name missing: %s"
-msgstr "E112: ม๐เ๊๓บ ํเ็โ่ ๎๏๖ณฟ: %s"
-
-#: ../eval.c:4855
-#, c-format
-msgid "E113: Unknown option: %s"
-msgstr "E113: อๅโณไ๎์เ ๎๏๖ณ: %s"
-
-#: ../eval.c:4904
-#, c-format
-msgid "E114: Missing quote: %s"
-msgstr "E114: ม๐เ๊๓บ ๋เ๏๊่: %s"
-
-#: ../eval.c:5020
-#, c-format
-msgid "E115: Missing quote: %s"
-msgstr "E115: ม๐เ๊๓บ ๋เ๏๊่: %s"
-
-# msgstr "E404: "
-#: ../eval.c:5084
-#, c-format
-msgid "E696: Missing comma in List: %s"
-msgstr "E696: ม๐เ๊๓บ ๊๎์่ ๓ ๑๏่๑๊๓: %s"
-
-#: ../eval.c:5091
-#, c-format
-msgid "E697: Missing end of List ']': %s"
-msgstr "E697: อๅ์เบ ๊ณํ๖ณโ๊่ ๑๏่๑๊๓ ']': %s"
-
-# msgstr "E235: "
-#: ../eval.c:6475
-#, c-format
-msgid "E720: Missing colon in Dictionary: %s"
-msgstr "E720: ม๐เ๊๓บ ไโ๎๊๐เ๏๊่ ๓ ๑๋๎โํ่๊๓: %s"
-
-#: ../eval.c:6499
-#, c-format
-msgid "E721: Duplicate key in Dictionary: \"%s\""
-msgstr "E721: ฯ๎โ๒๎๐ๅํํ ๊๋๗เ โ ๑๋๎โํ่๊๓: ซ%sป"
-
-# msgstr "E235: "
-#: ../eval.c:6517
-#, c-format
-msgid "E722: Missing comma in Dictionary: %s"
-msgstr "E722: ม๐เ๊๓บ ๊๎์่ ๓ ๑๋๎โํ่๊๓: %s"
-
-#: ../eval.c:6524
-#, c-format
-msgid "E723: Missing end of Dictionary '}': %s"
-msgstr "E723: อๅ์เบ ๊ณํ๖ณโ๊่ ๑๋๎โํ่๊เ '}': %s"
-
-# msgstr "E21: "
-#: ../eval.c:6555
-msgid "E724: variable nested too deep for displaying"
-msgstr "E724: ำ ็์ณํํณ้ ็เแเใเ๒๎ โ๊๋เไๅํ ๙๎แ ฟฟ ๏๎๊เ็เ๒่"
-
-#: ../eval.c:7188
-#, c-format
-msgid "E740: Too many arguments for function %s"
-msgstr "E740: วเแเใเ๒๎ เ๐ใ๓์ๅํ๒ณโ ไ๋ ๔๓ํ๊๖ณฟ %s"
-
-#: ../eval.c:7190
-#, c-format
-msgid "E116: Invalid arguments for function %s"
-msgstr "E116: อๅ๏๐เโ่๋ํณ เ๐ใ๓์ๅํ๒่ ๔๓ํ๊๖ณฟ %s"
-
-#: ../eval.c:7377
-#, c-format
-msgid "E117: Unknown function: %s"
-msgstr "E117: อๅโณไ๎์เ ๔๓ํ๊๖ณ: %s"
-
-#: ../eval.c:7383
-#, c-format
-msgid "E119: Not enough arguments for function: %s"
-msgstr "E119: วเ์เ๋๎ เ๐ใ๓์ๅํ๒ณโ ไ๋ ๔๓ํ๊๖ณฟ %s"
-
-#: ../eval.c:7387
-#, c-format
-msgid "E120: Using <SID> not in a script context: %s"
-msgstr "E120: <SID> โ่๊๎๐่๑๒๎โ๓บ๒๑ ํๅ ๓ ๊๎ํ๒ๅ๊๑๒ณ ๑๊๐่๏๒๓: %s"
-
-#: ../eval.c:7391
-#, c-format
-msgid "E725: Calling dict function without Dictionary: %s"
-msgstr "E725: ย่๊๋่๊ dict-๔๓ํ๊๖ณฟ แๅ็ ๑๋๎โํ่๊เ: %s"
-
-#: ../eval.c:7453
-msgid "E808: Number or Float required"
-msgstr "E808: า๐ๅแเ โ๊เ็เ๒่ Number ๗่ Float"
-
-# msgstr "E14: "
-#: ../eval.c:7503
-msgid "add() argument"
-msgstr "เ๐ใ๓์ๅํ๒ add()"
-
-#: ../eval.c:7907
-msgid "E699: Too many arguments"
-msgstr "E699: วเแเใเ๒๎ เ๐ใ๓์ๅํ๒ณโ"
-
-# msgstr "E327: "
-#: ../eval.c:8073
-msgid "E785: complete() can only be used in Insert mode"
-msgstr "E785: complete() ์๎ๆํเ โๆ่โเ๒่ ๒ณ๋๊่ โ ๐ๅๆ่์ณ โ๑๒เโ๊่"
-
-#: ../eval.c:8156
-msgid "&Ok"
-msgstr "&O:รเ๐เ็ไ"
-
-# msgstr "E226: "
-#: ../eval.c:8676
-#, c-format
-msgid "E737: Key already exists: %s"
-msgstr "E737: ส๋๗ โๆๅ ณ๑ํ๓บ: %s"
-
-# msgstr "E14: "
-#: ../eval.c:8692
-msgid "extend() argument"
-msgstr "เ๐ใ๓์ๅํ๒ extend()"
-
-# msgstr "E14: "
-#: ../eval.c:8915
-msgid "map() argument"
-msgstr "เ๐ใ๓์ๅํ๒ map()"
-
-# msgstr "E14: "
-#: ../eval.c:8916
-msgid "filter() argument"
-msgstr "เ๐ใ๓์ๅํ๒ filter()"
-
-#: ../eval.c:9229
-#, c-format
-msgid "+-%s%3ld lines: "
-msgstr "+-%s%3ld ๐ไ๊ณโ: "
-
-#: ../eval.c:9291
-#, c-format
-msgid "E700: Unknown function: %s"
-msgstr "E700: อๅโณไ๎์เ ๔๓ํ๊๖ณ: %s"
-
-#: ../eval.c:10729
-msgid "called inputrestore() more often than inputsave()"
-msgstr "ย่๊๋่๊่ ไ๎ inputrestore() ๗เ๑๒ณ๘ๅ, ํณๆ ไ๎ inputsave()"
-
-# msgstr "E14: "
-#: ../eval.c:10771
-msgid "insert() argument"
-msgstr "เ๐ใ๓์ๅํ๒ insert()"
-
-# msgstr "E406: "
-#: ../eval.c:10841
-msgid "E786: Range not allowed"
-msgstr "E786: ฒํ๒ๅ๐โเ๋ ํๅ ไ๎็โ๎๋ๅํ๎"
-
-# msgstr "E177: "
-#: ../eval.c:11140
-msgid "E701: Invalid type for len()"
-msgstr "E701: อๅ๊๎๐ๅ๊๒ํ่้ ๒่๏ ไ๋ len()"
-
-#: ../eval.c:11980
-msgid "E726: Stride is zero"
-msgstr "E726: ส๐๎๊ ํ๓๋๎โ่้"
-
-#: ../eval.c:11982
-msgid "E727: Start past end"
-msgstr "E727: ฯ๎๗เ๒๎๊ ็เ ๊ณํ๖ๅ์"
-
-#: ../eval.c:12024 ../eval.c:15297
-msgid "<empty>"
-msgstr "<ํณ๗๎ใ๎>"
-
-# msgstr "E14: "
-#: ../eval.c:12282
-msgid "remove() argument"
-msgstr "เ๐ใ๓์ๅํ๒ remove()"
-
-#: ../eval.c:12466
-msgid "E655: Too many symbolic links (cycle?)"
-msgstr "E655: วเแเใเ๒๎ ๑่์โ๎๋ํ่๕ ๏๎๑่๋เํ (๖่๊๋?)"
-
-# msgstr "E14: "
-#: ../eval.c:12593
-msgid "reverse() argument"
-msgstr "เ๐ใ๓์ๅํ๒ reverse()"
-
-# msgstr "E14: "
-#: ../eval.c:13721
-msgid "sort() argument"
-msgstr "เ๐ใ๓์ๅํ๒ sort()"
-
-# msgstr "E14: "
-#: ../eval.c:13721
-#, fuzzy
-msgid "uniq() argument"
-msgstr "เ๐ใ๓์ๅํ๒ add()"
-
-# msgstr "E364: "
-#: ../eval.c:13776
-msgid "E702: Sort compare function failed"
-msgstr "E702: ฯ๎์่๋๊เ ๓ ๔๓ํ๊๖ณฟ ๏๎๐ณโํํํ"
-
-# msgstr "E364: "
-#: ../eval.c:13806
-#, fuzzy
-msgid "E882: Uniq compare function failed"
-msgstr "E702: ฯ๎์่๋๊เ ๓ ๔๓ํ๊๖ณฟ ๏๎๐ณโํํํ"
-
-#: ../eval.c:14085
-msgid "(Invalid)"
-msgstr "(อๅ์๎ๆ๋่โ๎)"
-
-#: ../eval.c:14590
-msgid "E677: Error writing temp file"
-msgstr "E677: อๅ โไเ๋๎๑ ็เ๏่๑เ๒่ ๒่์๗เ๑๎โ่้ ๔เ้๋"
-
-#: ../eval.c:16159
-msgid "E805: Using a Float as a Number"
-msgstr "E805: Float โๆ่๒๎ ๊ Number"
-
-#: ../eval.c:16162
-msgid "E703: Using a Funcref as a Number"
-msgstr "E703: Funcref โๆ่๒๎ ๊ Number"
-
-#: ../eval.c:16170
-msgid "E745: Using a List as a Number"
-msgstr "E745: List โๆ่๒๎ ๊ Number"
-
-#: ../eval.c:16173
-msgid "E728: Using a Dictionary as a Number"
-msgstr "E728: Dictionary โๆ่๒๎ ๊ Number"
-
-#: ../eval.c:16259
-msgid "E729: using Funcref as a String"
-msgstr "E729: Funcref โๆ่๒๎ ๊ String"
-
-# msgstr "E373: "
-#: ../eval.c:16262
-msgid "E730: using List as a String"
-msgstr "E730: List โๆ่๒๎ ๊ String"
-
-#: ../eval.c:16265
-msgid "E731: using Dictionary as a String"
-msgstr "E731: Dictionary โๆ่๒๎ ๊ String"
-
-#: ../eval.c:16619
-#, c-format
-msgid "E706: Variable type mismatch for: %s"
-msgstr "E706: อๅ๏๐เโ่๋ํ่้ ๒่๏ ็์ณํํ๎ฟ: %s"
-
-#: ../eval.c:16705
-#, c-format
-msgid "E795: Cannot delete variable %s"
-msgstr "E795: อๅ ์๎ๆํเ ็ํ่๙่๒่ ็์ณํํ๓ %s"
-
-#: ../eval.c:16724
-#, c-format
-msgid "E704: Funcref variable name must start with a capital: %s"
-msgstr "E704: อเ็โเ ็์ณํํ๎ฟ Funcref ์เบ ๏๎๗่ํเ๒่๑ ็ โๅ๋่๊๎ฟ ๋ณ๒ๅ๐่: %s"
-
-#: ../eval.c:16732
-#, c-format
-msgid "E705: Variable name conflicts with existing function: %s"
-msgstr "E705: อเ็โเ ็์ณํํ๎ฟ ๑๏ณโ๏เไเบ ็ ณ๑ํ๓๗๎ ๔๓ํ๊๖ณบ: %s"
-
-#: ../eval.c:16763
-#, c-format
-msgid "E741: Value is locked: %s"
-msgstr "E741: วํเ๗ๅํํ ็เ๕่๙ๅํๅ: %s"
-
-#: ../eval.c:16764 ../eval.c:16769 ../message.c:1839
-msgid "Unknown"
-msgstr "อๅโณไ๎์๎"
-
-#: ../eval.c:16768
-#, c-format
-msgid "E742: Cannot change value of %s"
-msgstr "E742: อๅ ์๎ๆํเ ็์ณํ่๒่ ็ํเ๗ๅํํ %s"
-
-#: ../eval.c:16838
-msgid "E698: variable nested too deep for making a copy"
-msgstr "E698: ว์ณํํเ โ๊๋เไๅํเ ็เํเไ๒๎ ใ๋่แ๎๊๎ ๙๎แ ็๐๎แ่๒่ ฟฟ ๊๎๏ณ"
-
-#: ../eval.c:17249
-#, c-format
-msgid "E123: Undefined function: %s"
-msgstr "E123: อๅโ่็ํเ๗ๅํเ ๔๓ํ๊๖ณ: %s"
-
-#: ../eval.c:17260
-#, c-format
-msgid "E124: Missing '(': %s"
-msgstr "E124: ม๐เ๊๓บ '(': %s"
-
-#: ../eval.c:17293
-msgid "E862: Cannot use g: here"
-msgstr "E862: า๓๒ ํๅ ์๎ๆํเ โ่๊๎๐่๑๒เ๒่ g:"
-
-#: ../eval.c:17312
-#, c-format
-msgid "E125: Illegal argument: %s"
-msgstr "E125: อๅไ๎็โ๎๋ๅํ่้ เ๐ใ๓์ๅํ๒: %s"
-
-#: ../eval.c:17323
-#, c-format
-msgid "E853: Duplicate argument name: %s"
-msgstr "E853: อเ็โเ เ๐ใ๓์ๅํ๒๓ ๏๎โ๒๎๐บ๒๑: %s"
-
-#: ../eval.c:17416
-msgid "E126: Missing :endfunction"
-msgstr "E126: ม๐เ๊๓บ :endfunction"
-
-#: ../eval.c:17537
-#, c-format
-msgid "E707: Function name conflicts with variable: %s"
-msgstr "E707: อเ็โเ ๔๓ํ๊๖ณฟ ๑๏ณโ๏เไเบ ็ณ ็์ณํํ๎: %s"
-
-#: ../eval.c:17549
-#, c-format
-msgid "E127: Cannot redefine function %s: It is in use"
-msgstr "E127: อๅ โไเ๋๎๑ ๏ๅ๐ๅโ่็ํเ๗่๒่ ๔๓ํ๊๖ณ %s: โ๎ํเ โ่๊๎๐่๑๒๎โ๓บ๒๑"
-
-#: ../eval.c:17604
-#, c-format
-msgid "E746: Function name does not match script file name: %s"
-msgstr "E746: อเ็โเ ๔๓ํ๊๖ณฟ ํๅ ็แณใเบ๒๑ ็ ํเ็โ๎ ๔เ้๋๓ ๑๊๐่๏๒๓: %s"
-
-#: ../eval.c:17716
-msgid "E129: Function name required"
-msgstr "E129: อๅ โ๊เ็เํ๎ ํเ็โ๓ ๔๓ํ๊๖ณฟ"
-
-#: ../eval.c:17824
-#, fuzzy, c-format
-msgid "E128: Function name must start with a capital or \"s:\": %s"
-msgstr ""
-"E128: อเ็โเ ๔๓ํ๊๖ณฟ ์เบ ๏๎๗่ํเ๒่๑ ็ โๅ๋่๊๎ฟ ๋ณ๒ๅ๐่ เแ๎ ์ณ๑๒่๒่ ไโ๎๊๐เ๏๊๓: %s"
-
-#: ../eval.c:17833
-#, fuzzy, c-format
-msgid "E884: Function name cannot contain a colon: %s"
-msgstr ""
-"E128: อเ็โเ ๔๓ํ๊๖ณฟ ์เบ ๏๎๗่ํเ๒่๑ ็ โๅ๋่๊๎ฟ ๋ณ๒ๅ๐่ เแ๎ ์ณ๑๒่๒่ ไโ๎๊๐เ๏๊๓: %s"
-
-#: ../eval.c:18336
-#, c-format
-msgid "E131: Cannot delete function %s: It is in use"
-msgstr "E131: อๅ โไเ๋๎๑ ็ํ่๙่๒่ ๔๓ํ๊๖ณ %s: ย๎ํเ โ่๊๎๐่๑๒๎โ๓บ๒๑"
-
-#: ../eval.c:18441
-msgid "E132: Function call depth is higher than 'maxfuncdepth'"
-msgstr "E132: ร๋่แ่ํเ โ่๊๋่๊ณโ ๔๓ํ๊๖ณฟ ๏ๅ๐ๅโ่๙๓บ 'maxfuncdepth'"
-
-#: ../eval.c:18568
-#, c-format
-msgid "calling %s"
-msgstr "โ่๊๋่๊เบ๒๑ %s"
-
-#: ../eval.c:18651
-#, c-format
-msgid "%s aborted"
-msgstr "%s ๏๐่๏่ํๅํ๎"
-
-#: ../eval.c:18653
-#, c-format
-msgid "%s returning #%<PRId64>"
-msgstr "%s ๏๎โๅ๐๒เบ #%<PRId64>"
-
-#: ../eval.c:18670
-#, c-format
-msgid "%s returning %s"
-msgstr "%s ๏๎โๅ๐๒เบ %s"
-
-#: ../eval.c:18691 ../ex_cmds2.c:2695
-#, c-format
-msgid "continuing in %s"
-msgstr "๏๐๎ไ๎โๆๅํํ โ %s"
-
-#: ../eval.c:18795
-msgid "E133: :return not inside a function"
-msgstr "E133: :return ๏๎็เ ์ๅๆเ์่ ๔๓ํ๊๖ณฟ"
-
-#: ../eval.c:19159
-msgid ""
-"\n"
-"# global variables:\n"
-msgstr ""
-"\n"
-"# ใ๋๎แเ๋ํณ ็์ณํํณ:\n"
-
-#: ../eval.c:19254
-msgid ""
-"\n"
-"\tLast set from "
-msgstr ""
-"\n"
-"\tย๎๑๒เํํบ ็์ณํๅํเ ๓ "
-
-#: ../eval.c:19272
-msgid "No old files"
-msgstr "ฦ๎ไํ๎ใ๎ ๑๒เ๐๎ใ๎ ๔เ้๋๓"
-
-#: ../ex_cmds.c:122
-#, c-format
-msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
-msgstr "<%s>%s%s %d, ๘ณ๑๒ %02x, โณ๑ %03o"
-
-#: ../ex_cmds.c:145
-#, c-format
-msgid "> %d, Hex %04x, Octal %o"
-msgstr "> %d, ๘ณ๑๒ %04x, โณ๑ %o"
-
-#: ../ex_cmds.c:146
-#, c-format
-msgid "> %d, Hex %08x, Octal %o"
-msgstr "> %d, ๘ณ๑๒ %08x, โณ๑ %o"
-
-#: ../ex_cmds.c:684
-msgid "E134: Move lines into themselves"
-msgstr "E134: อๅ์๎ๆ๋่โ๎ ๏ๅ๐ๅ์ณ๑๒่๒่ ๐ไ๊่ ๑เ์ณ โ ๑ๅแๅ"
-
-#: ../ex_cmds.c:747
-msgid "1 line moved"
-msgstr "ฯๅ๐ๅ์ณ๙ๅํ๎ ๎ไ่ํ ๐ไ๎๊"
-
-#: ../ex_cmds.c:749
-#, c-format
-msgid "%<PRId64> lines moved"
-msgstr "ฯๅ๐ๅ์ณ๙ๅํ๎ %<PRId64> ๐ไ๊่(ณโ)"
-
-#: ../ex_cmds.c:1175
-#, c-format
-msgid "%<PRId64> lines filtered"
-msgstr "ยณไ๔ณ๋๒๐๎โเํ๎ %<PRId64> ๐ไ๊่(ณโ)"
-
-#: ../ex_cmds.c:1194
-msgid "E135: *Filter* Autocommands must not change current buffer"
-msgstr "E135: ภโ๒๎๊๎์เํไ่ *Filter* ํๅ ๏๎โ่ํํณ ็์ณํโเ๒่ ๏๎๒๎๗ํ่้ แ๓๔ๅ๐"
-
-#: ../ex_cmds.c:1244
-msgid "[No write since last change]\n"
-msgstr "[ว์ณํ่ ํๅ ็เ๏่๑เํ๎]\n"
-
-#: ../ex_cmds.c:1424
-#, c-format
-msgid "%sviminfo: %s in line: "
-msgstr "%sviminfo: %s โ ๐ไ๊๓: "
-
-#: ../ex_cmds.c:1431
-msgid "E136: viminfo: Too many errors, skipping rest of file"
-msgstr "E136: viminfo: วเแเใเ๒๎ ๏๎์่๋๎๊, ๐ๅ๘๒เ ๔เ้๋๓ แ๓ไๅ ๏๐๎๏๓๙ๅํ๎"
-
-#: ../ex_cmds.c:1458
-#, c-format
-msgid "Reading viminfo file \"%s\"%s%s%s"
-msgstr "ว๗่๒๓บ๒๑ ๔เ้๋ viminfo: ซ%sป%s%s%s"
-
-#: ../ex_cmds.c:1460
-msgid " info"
-msgstr " ณํ๔๎๐์เ๖ณ"
-
-#: ../ex_cmds.c:1461
-msgid " marks"
-msgstr " ๏๎็ํเ๗๊่"
-
-#: ../ex_cmds.c:1462
-msgid " oldfiles"
-msgstr " ๑๒เ๐ณ ๔เ้๋่"
-
-#: ../ex_cmds.c:1463
-msgid " FAILED"
-msgstr " อล ยฤภหฮั฿"
-
-#. avoid a wait_return for this message, it's annoying
-#: ../ex_cmds.c:1541
-#, c-format
-msgid "E137: Viminfo file is not writable: %s"
-msgstr "E137: อๅ ไ๎็โ๎๋ๅํ๎ ็เ๏่๑ ๓ ๔เ้๋ viminfo: %s"
-
-#: ../ex_cmds.c:1626
-#, c-format
-msgid "E138: Can't write viminfo file %s!"
-msgstr "E138: อๅ โไเ๋๎๑ ็เ๏่๑เ๒่ ๔เ้๋ viminfo %s!"
-
-#: ../ex_cmds.c:1635
-#, c-format
-msgid "Writing viminfo file \"%s\""
-msgstr "วเ๏่๑๓บ๒๑ ๔เ้๋ viminfo ซ%sป"
-
-#. Write the info:
-#: ../ex_cmds.c:1720
-#, c-format
-msgid "# This viminfo file was generated by Vim %s.\n"
-msgstr "# ึๅ้ ๔เ้๋ เโ๒๎์เ๒่๗ํ๎ ๑๒โ๎๐ๅํ่้ Vim %s.\n"
-
-#: ../ex_cmds.c:1722
-msgid ""
-"# You may edit it if you're careful!\n"
-"\n"
-msgstr ""
-"# ฬ๎ๆๅ๒ๅ ๐ๅไเใ๓โเ๒่, เ๋ๅ ฮมละลฦอฮ!\n"
-"\n"
-
-#: ../ex_cmds.c:1723
-msgid "# Value of 'encoding' when this file was written\n"
-msgstr "# วํเ๗ๅํํ 'encoding' ๏ณไ ๗เ๑ ๑๒โ๎๐ๅํํ ๖๎ใ๎ ๔เ้๋๓\n"
-
-#: ../ex_cmds.c:1800
-msgid "Illegal starting char"
-msgstr "อๅไ๎็โ๎๋ๅํ่้ ๑่์โ๎๋ ํเ ๏๎๗เ๒๊๓ ๐ไ๊เ"
-
-#: ../ex_cmds.c:2162
-msgid "Write partial file?"
-msgstr "วเ๏่๑เ๒่ ๗เ๑๒่ํ๓ ๔เ้๋๓?"
-
-#: ../ex_cmds.c:2166
-msgid "E140: Use ! to write partial buffer"
-msgstr "E140: ย่๊๎๐่๑๒เ้๒ๅ ! ไ๋ ็เ๏่๑๓ ๗เ๑๒่ํ่ แ๓๔ๅ๐เ"
-
-#: ../ex_cmds.c:2281
-#, c-format
-msgid "Overwrite existing file \"%s\"?"
-msgstr "ฯๅ๐ๅ๏่๑เ๒่ ณ๑ํ๓๗่้ ๔เ้๋ ซ%sป?"
-
-#: ../ex_cmds.c:2317
-#, c-format
-msgid "Swap file \"%s\" exists, overwrite anyway?"
-msgstr "ิเ้๋ ๎แ์ณํ๓ ซ%sป ณ๑ํ๓บ, ๏ๅ๐ๅ็เ๏่๑เ๒่?"
-
-#: ../ex_cmds.c:2326
-#, c-format
-msgid "E768: Swap file exists: %s (:silent! overrides)"
-msgstr "E768: ิเ้๋ ๎แ์ณํ๓ ณ๑ํ๓บ: %s (:silent! ๏ๅ๐ๅโเๆ๓บ)"
-
-#: ../ex_cmds.c:2381
-#, c-format
-msgid "E141: No file name for buffer %<PRId64>"
-msgstr "E141: อๅ์เบ โ๕ณไํ๎ใ๎ ๔เ้๋๓ ไ๋ แ๓๔ๅ๐เ %<PRId64>"
-
-#: ../ex_cmds.c:2412
-msgid "E142: File not written: Writing is disabled by 'write' option"
-msgstr "E142: ิเ้๋ ํๅ ็เ๏่๑เํ๎: ็เ๏่๑ ็เแ๎๐๎ํๅํ๎ ๎๏๖ณบ 'write'"
-
-#: ../ex_cmds.c:2434
-#, c-format
-msgid ""
-"'readonly' option is set for \"%s\".\n"
-"Do you wish to write anyway?"
-msgstr ""
-"ฤ๋ ซ%sป โ๑๒เํ๎โ๋ๅํ๎ 'readonly'.\n"
-"มเๆเบ๒ๅ โ๑ๅ ๎ไํ๎ ๏๐๎ไ๎โๆ่๒่ ็เ๏่๑?"
-
-#: ../ex_cmds.c:2439
-#, c-format
-msgid ""
-"File permissions of \"%s\" are read-only.\n"
-"It may still be possible to write it.\n"
-"Do you wish to try?"
-msgstr ""
-"ิเ้๋ ซ%sป ไ๎็โ๎๋ๅํ๎ ๒ณ๋๊่ ๗่๒เ๒่.\n"
-"ฯ๐๎๒ๅ, ์๎ๆ๋่โ๎, ้๎ใ๎ ์๎ๆํเ ็เ๏่๑เ๒่.\n"
-"ี๎๗ๅ๒ๅ ๑๏๐๎แ๓โเ๒่?"
-
-#: ../ex_cmds.c:2451
-#, c-format
-msgid "E505: \"%s\" is read-only (add ! to override)"
-msgstr "E505: ซ%sป ๒ณ๋๊่ ไ๋ ๗่๒เํํ (! ๙๎แ ํๅ ็โเๆเ๒่)"
-
-#: ../ex_cmds.c:3120
-#, c-format
-msgid "E143: Autocommands unexpectedly deleted new buffer %s"
-msgstr "E143: ภโ๒๎๊๎์เํไ่ ํๅ๑๏๎ไณโเํ๎ ็ํ่๙่๋่ ํ๎โ่้ แ๓๔ๅ๐ %s"
-
-#: ../ex_cmds.c:3313
-msgid "E144: non-numeric argument to :z"
-msgstr "E144: ํๅ๗่๑๋๎โ่้ เ๐ใ๓์ๅํ๒ ไ๋ :z"
-
-#: ../ex_cmds.c:3404
-msgid "E145: Shell commands not allowed in rvim"
-msgstr "E145: ำ rvim ํๅ ไ๎็โ๎๋ๅํณ ๊๎์เํไ่ ๎แ๎๋๎ํ๊่"
-
-#: ../ex_cmds.c:3498
-msgid "E146: Regular expressions can't be delimited by letters"
-msgstr "E146: ะๅใ๓๋๐ํณ โ่๐เ็่ ํๅ ์๎ๆํเ ๐๎็ไณ๋๒่ ๋ณ๒ๅ๐เ์่"
-
-#: ../ex_cmds.c:3964
-#, c-format
-msgid "replace with %s (y/n/a/q/l/^E/^Y)?"
-msgstr "วเ์ณํ่๒่ ํเ %s (y/n/a/q/l/^E/^Y)?"
-
-#: ../ex_cmds.c:4379
-msgid "(Interrupted) "
-msgstr "(ฯๅ๐ๅ๐โเํ๎) "
-
-# msgstr "E31: "
-#: ../ex_cmds.c:4384
-msgid "1 match"
-msgstr "ฮไ่ํ ็แณใ"
-
-#: ../ex_cmds.c:4384
-msgid "1 substitution"
-msgstr "ฮไํเ ็เ์ณํเ"
-
-#: ../ex_cmds.c:4387
-#, c-format
-msgid "%<PRId64> matches"
-msgstr "%<PRId64> ็แณใ่(ณโ)"
-
-#: ../ex_cmds.c:4388
-#, c-format
-msgid "%<PRId64> substitutions"
-msgstr "%<PRId64> ็เ์ณํ(่)"
-
-#: ../ex_cmds.c:4392
-msgid " on 1 line"
-msgstr " โ ๎ไํ๎์๓ ๐ไ๊๓"
-
-#: ../ex_cmds.c:4395
-#, c-format
-msgid " on %<PRId64> lines"
-msgstr " โ %<PRId64> ๐ไ๊เ๕"
-
-#: ../ex_cmds.c:4438
-msgid "E147: Cannot do :global recursive"
-msgstr "E147: :global ํๅ ์๎ๆํเ โๆ่โเ๒่ ๐ๅ๊๓๐๑่โํ๎"
-
-#: ../ex_cmds.c:4467
-msgid "E148: Regular expression missing from global"
-msgstr "E148: ำ global แ๐เ๊๓บ ็๐เ็๊เ"
-
-#: ../ex_cmds.c:4508
-#, c-format
-msgid "Pattern found in every line: %s"
-msgstr "ว๐เ็๎๊ ็ํเ้ไๅํ๎ ๓ ๊๎ๆํ๎์๓ ๐ไ๊๓: %s"
-
-#: ../ex_cmds.c:4510
-#, c-format
-msgid "Pattern not found: %s"
-msgstr "ว๐เ็๎๊ ํๅ ็ํเ้ไๅํ๎: %s"
-
-#: ../ex_cmds.c:4587
-msgid ""
-"\n"
-"# Last Substitute String:\n"
-"$"
-msgstr ""
-"\n"
-"# ฮ๑๒เํํ ็เ์ณํเ:\n"
-"$"
-
-#: ../ex_cmds.c:4679
-msgid "E478: Don't panic!"
-msgstr "E478: มๅ็ ๏เํณ๊่!"
-
-#: ../ex_cmds.c:4717
-#, c-format
-msgid "E661: Sorry, no '%s' help for %s"
-msgstr "E661: ย่แเ๗๒ๅ, ํๅ์เบ ไ๎๏๎์๎ใ่ '%s' ไ๋ %s"
-
-#: ../ex_cmds.c:4719
-#, c-format
-msgid "E149: Sorry, no help for %s"
-msgstr "E149: ย่แเ๗๒ๅ, ํๅ์เบ ไ๎๏๎์๎ใ่ ไ๋ %s"
-
-#: ../ex_cmds.c:4751
-#, c-format
-msgid "Sorry, help file \"%s\" not found"
-msgstr "ย่แเ๗๒ๅ, ๔เ้๋ ไ๎๏๎์๎ใ่ ซ%sป ํๅ ็ํเ้ไๅํ๎"
-
-#: ../ex_cmds.c:5323
-#, c-format
-msgid "E150: Not a directory: %s"
-msgstr "E150: อๅ บ ๊เ๒เ๋๎ใ๎์: %s"
-
-#: ../ex_cmds.c:5446
-#, c-format
-msgid "E152: Cannot open %s for writing"
-msgstr "E152: อๅ โไเ๋๎๑ โณไ๊๐่๒่ %s ไ๋ ็เ๏่๑๓"
-
-#: ../ex_cmds.c:5471
-#, c-format
-msgid "E153: Unable to open %s for reading"
-msgstr "E153: อๅ โไเ๋๎๑ โณไ๊๐่๒่ %s ไ๋ ๗่๒เํํ"
-
-#: ../ex_cmds.c:5500
-#, c-format
-msgid "E670: Mix of help file encodings within a language: %s"
-msgstr "E670: ฬณ๘เํ่ํเ ๊๎ไ๓โเํ ๔เ้๋๓ ไ๎๏๎์๎ใ่ ไ๋ ์๎โ่ %s"
-
-#: ../ex_cmds.c:5565
-#, c-format
-msgid "E154: Duplicate tag \"%s\" in file %s/%s"
-msgstr "E154: ฯ๎โ๒๎๐ๅํํ ๒ๅด๓ ซ%sป ๓ ๔เ้๋ณ %s/%s"
-
-#: ../ex_cmds.c:5687
-#, c-format
-msgid "E160: Unknown sign command: %s"
-msgstr "E160: อๅโณไ๎์เ ๊๎์เํไเ ํเไ๏่๑๓: %s"
-
-#: ../ex_cmds.c:5704
-msgid "E156: Missing sign name"
-msgstr "E156: ฯ๐๎๏๓๙ๅํ๎ ํเ็โ๓ ํเไ๏่๑๓"
-
-#: ../ex_cmds.c:5746
-msgid "E612: Too many signs defined"
-msgstr "E612: ย่็ํเ๗ๅํ๎ ็เแเใเ๒๎ ํเไ๏่๑ณโ"
-
-#: ../ex_cmds.c:5813
-#, c-format
-msgid "E239: Invalid sign text: %s"
-msgstr "E239: อๅ๊๎๐ๅ๊๒ํ่้ ํเไ๏่๑: %s"
-
-#: ../ex_cmds.c:5844 ../ex_cmds.c:6035
-#, c-format
-msgid "E155: Unknown sign: %s"
-msgstr "E155: อๅโณไ๎์่้ ํเไ๏่๑: %s"
-
-#: ../ex_cmds.c:5877
-msgid "E159: Missing sign number"
-msgstr "E159: ฯ๐๎๏๓๙ๅํ๎ ํ๎์ๅ๐ ํเไ๏่๑๓"
-
-#: ../ex_cmds.c:5971
-#, c-format
-msgid "E158: Invalid buffer name: %s"
-msgstr "E158: อๅ๊๎๐ๅ๊๒ํเ ํเ็โเ แ๓๔ๅ๐เ: %s"
-
-#: ../ex_cmds.c:6008
-#, c-format
-msgid "E157: Invalid sign ID: %<PRId64>"
-msgstr "E157: อๅ๏๐เโ่๋ํ่้ ID ํเไ๏่๑๓: %<PRId64>"
-
-#: ../ex_cmds.c:6066
-msgid " (not supported)"
-msgstr " (ํๅ ๏ณไ๒๐่์๓บ๒๑)"
-
-#: ../ex_cmds.c:6169
-msgid "[Deleted]"
-msgstr "[วํ่๙ๅํ๎]"
-
-#: ../ex_cmds2.c:139
-msgid "Entering Debug mode. Type \"cont\" to continue."
-msgstr "ะๅๆ่์ ํเ๋เใ๎ไๆๅํํ. ู๎แ ๏๐๎ไ๎โๆ่๒่ โโๅไณ๒ ซcontป."
-
-#: ../ex_cmds2.c:143 ../ex_docmd.c:759
-#, c-format
-msgid "line %<PRId64>: %s"
-msgstr "๐ไ๎๊ %<PRId64>: %s"
-
-#: ../ex_cmds2.c:145
-#, c-format
-msgid "cmd: %s"
-msgstr "๊๎์เํไเ: %s"
-
-#: ../ex_cmds2.c:322
-#, c-format
-msgid "Breakpoint in \"%s%s\" line %<PRId64>"
-msgstr "า๎๗๊เ ็๓๏่ํ๊่ โ ซ%s%sป ๐ไ๎๊ %<PRId64>"
-
-#: ../ex_cmds2.c:581
-#, c-format
-msgid "E161: Breakpoint not found: %s"
-msgstr "E161: า๎๗๊๓ ็๓๏่ํ๊่ ํๅ ็ํเ้ไๅํ๎: %s"
-
-#: ../ex_cmds2.c:611
-msgid "No breakpoints defined"
-msgstr "อๅ โ่็ํเ๗ๅํ๎ ๆ๎ไํ๎ฟ ๒๎๗๊่ ็๓๏่ํ๊่"
-
-#: ../ex_cmds2.c:617
-#, c-format
-msgid "%3d %s %s line %<PRId64>"
-msgstr "%3d %s %s ๐ไ๎๊ %<PRId64>"
-
-#: ../ex_cmds2.c:942
-msgid "E750: First use \":profile start {fname}\""
-msgstr "E750: ั๏๎๗เ๒๊๓ ็๐๎แณ๒ ซ:profile start {๔เ้๋}ป"
-
-#: ../ex_cmds2.c:1269
-#, c-format
-msgid "Save changes to \"%s\"?"
-msgstr "วแๅ๐ๅใ๒่ ็์ณํ่ โ ซ%sป?"
-
-#: ../ex_cmds2.c:1271 ../ex_docmd.c:8851
-msgid "Untitled"
-msgstr "อๅํเ็โเํ่้"
-
-#: ../ex_cmds2.c:1421
-#, c-format
-msgid "E162: No write since last change for buffer \"%s\""
-msgstr "E162: ม๓๔ๅ๐ ซ%sป ์เบ ํๅ็แๅ๐ๅๆๅํณ ็์ณํ่"
-
-#: ../ex_cmds2.c:1480
-msgid "Warning: Entered other buffer unexpectedly (check autocommands)"
-msgstr ""
-"ฮแๅ๐ๅๆํ๎: อๅ๑๏๎ไณโเํ๎ ๎๏่ํ่๋่๑ ๓ ณํ๘๎์๓ แ๓๔ๅ๐ณ (๏ๅ๐ๅโณ๐๒ๅ เโ๒๎๊๎์เํไ่)"
-
-#: ../ex_cmds2.c:1826
-msgid "E163: There is only one file to edit"
-msgstr "E163: ะๅไเใ๓บ๒๑ ๋่๘ๅ ๎ไ่ํ ๔เ้๋"
-
-#: ../ex_cmds2.c:1828
-msgid "E164: Cannot go before first file"
-msgstr "E164: ึๅ โๆๅ ํเ้๏ๅ๐๘่้ ๔เ้๋"
-
-#: ../ex_cmds2.c:1830
-msgid "E165: Cannot go beyond last file"
-msgstr "E165: ึๅ โๆๅ ๎๑๒เํํณ้ ๔เ้๋"
-
-#: ../ex_cmds2.c:2175
-#, c-format
-msgid "E666: compiler not supported: %s"
-msgstr "E666: ส๎์๏ณ๋๒๎๐ ํๅ ๏ณไ๒๐่์๓บ๒๑: %s"
-
-# msgstr "E195: "
-#: ../ex_cmds2.c:2257
-#, c-format
-msgid "Searching for \"%s\" in \"%s\""
-msgstr "ฯ๎๘๓๊ ซ%sป โ ซ%sป"
-
-#: ../ex_cmds2.c:2284
-#, c-format
-msgid "Searching for \"%s\""
-msgstr "ฯ๎๘๓๊ ซ%sป"
-
-#: ../ex_cmds2.c:2307
-#, c-format
-msgid "not found in 'runtimepath': \"%s\""
-msgstr "ย 'runtimepath' ํๅ ็ํเ้ไๅํ๎ ซ%sป"
-
-#: ../ex_cmds2.c:2472
-#, c-format
-msgid "Cannot source a directory: \"%s\""
-msgstr "อๅ โไเ๋๎๑ ๏๐๎๗่๒เ๒่ ๊เ๒เ๋๎ใ: ซ%sป"
-
-#: ../ex_cmds2.c:2518
-#, c-format
-msgid "could not source \"%s\""
-msgstr "อๅ โไเ๋๎๑ โ่๊๎ํเ๒่ ซ%sป"
-
-#: ../ex_cmds2.c:2520
-#, c-format
-msgid "line %<PRId64>: could not source \"%s\""
-msgstr "๐ไ๎๊ %<PRId64>: ํๅ โไเ๋๎๑ โ่๊๎ํเ๒่ ซ%sป"
-
-#: ../ex_cmds2.c:2535
-#, c-format
-msgid "sourcing \"%s\""
-msgstr "โ่๊๎ํ๓บ๒๑ ซ%sป"
-
-#: ../ex_cmds2.c:2537
-#, c-format
-msgid "line %<PRId64>: sourcing \"%s\""
-msgstr "๐ไ๎๊ %<PRId64>: โ่๊๎ํ๓บ๒๑ ซ%sป"
-
-#: ../ex_cmds2.c:2693
-#, c-format
-msgid "finished sourcing %s"
-msgstr "็เ๊ณํ๗ๅํ๎ โ่๊๎ํเํํ %s"
-
-#: ../ex_cmds2.c:2765
-msgid "modeline"
-msgstr "modeline"
-
-# msgstr "E14: "
-#: ../ex_cmds2.c:2767
-msgid "--cmd argument"
-msgstr "--cmd เ๐ใ๓์ๅํ๒"
-
-# msgstr "E14: "
-#: ../ex_cmds2.c:2769
-msgid "-c argument"
-msgstr "-c เ๐ใ๓์ๅํ๒"
-
-#: ../ex_cmds2.c:2771
-msgid "environment variable"
-msgstr "็์ณํํเ ๎๒๎๗ๅํํ"
-
-#: ../ex_cmds2.c:2773
-msgid "error handler"
-msgstr "๎แ๐๎แํ่๊ ๏๎์่๋๊่"
-
-#: ../ex_cmds2.c:3020
-msgid "W15: Warning: Wrong line separator, ^M may be missing"
-msgstr "W15: วเ๑๒ๅ๐ๅๆๅํํ: อๅ๏๐เโ่๋ํ่้ ๐๎็ไณ๋ํ่๊ ๐ไ๊ณโ, ์๎ๆ๋่โ๎, แ๐เ๊๓บ ^M"
-
-#: ../ex_cmds2.c:3139
-msgid "E167: :scriptencoding used outside of a sourced file"
-msgstr "E167: :scriptencoding โ่๊๎๐่๑๒เํ๎ ๏๎็เ โ่๊๎ํ๓โเํ่์ ๔เ้๋๎์"
-
-#: ../ex_cmds2.c:3166
-msgid "E168: :finish used outside of a sourced file"
-msgstr "E168: :finish โ่๊๎๐่๑๒เํ๎ ๏๎็เ โ่๊๎ํ๓โเํ่์ ๔เ้๋๎์"
-
-#: ../ex_cmds2.c:3389
-#, c-format
-msgid "Current %slanguage: \"%s\""
-msgstr "ฬ๎โเ (%s): ซ%sป"
-
-#: ../ex_cmds2.c:3404
-#, c-format
-msgid "E197: Cannot set language to \"%s\""
-msgstr "E197: อๅ โไเ๋๎๑ โ๑๒เํ๎โ่๒่ ์๎โ๓ ซ%sป"
-
-#. don't redisplay the window
-#. don't wait for return
-#: ../ex_docmd.c:387
-msgid "Entering Ex mode. Type \"visual\" to go to Normal mode."
-msgstr "ะๅๆ่์ Ex. ฤ๋ ๏๎โๅ๐ํๅํํ ไ๎ ํ๎๐์เ๋ํ๎ใ๎ ๐ๅๆ่์๓ โ่๊๎ํเ้๒ๅ ซvisualป"
-
-#: ../ex_docmd.c:428
-msgid "E501: At end-of-file"
-msgstr "E501: สณํๅ๖ ๔เ้๋๓"
-
-#: ../ex_docmd.c:513
-msgid "E169: Command too recursive"
-msgstr "E169: ส๎์เํไเ ็เํเไ๒๎ ๐ๅ๊๓๐๑่โํเ"
-
-#: ../ex_docmd.c:1006
-#, c-format
-msgid "E605: Exception not caught: %s"
-msgstr "E605: ย่ํ๒๊๎โเ ๑่๒๓เ๖ณ ํๅ ๎แ๐๎แ๋ๅํเ: %s"
-
-#: ../ex_docmd.c:1085
-msgid "End of sourced file"
-msgstr "สณํๅ๖ โ่๊๎ํ๓โเํ๎ใ๎ ๔เ้๋๓"
-
-#: ../ex_docmd.c:1086
-msgid "End of function"
-msgstr "สณํๅ๖ ๔๓ํ๊๖ณฟ"
-
-#: ../ex_docmd.c:1628
-msgid "E464: Ambiguous use of user-defined command"
-msgstr "E464: อๅ๎ไํ๎็ํเ๗ํ่้ โๆ่๒๎๊ ๊๎์เํไ่ ๊๎๐่๑๒๓โเ๗เ"
-
-#: ../ex_docmd.c:1638
-msgid "E492: Not an editor command"
-msgstr "E492: ึๅ ํๅ ๊๎์เํไเ ๐ๅไเ๊๒๎๐เ"
-
-#: ../ex_docmd.c:1729
-msgid "E493: Backwards range given"
-msgstr "E493: ฒํ๒ๅ๐โเ๋ ็เไเํ๎ ํเโ่โ๎๐ณ๒"
-
-#: ../ex_docmd.c:1733
-msgid "Backwards range given, OK to swap"
-msgstr "ฒํ๒ๅ๐โเ๋ ็เไเํ๎ ํเโ่โ๎๐ณ๒, ๙๎แ ๏๎์ณํ๒่ ์ณ๑๖์่ — รภะภวฤ"
-
-#. append
-#. typed wrong
-#: ../ex_docmd.c:1787
-msgid "E494: Use w or w>>"
-msgstr "E494: ั๏๐๎แ๓้๒ๅ w เแ๎ w>>"
-
-#: ../ex_docmd.c:3454
-msgid "E319: The command is not available in this version"
-msgstr "E319: ย่แเ๗๒ๅ, ๖ณบฟ ๊๎์เํไ่ ํๅ์เบ ๓ ๖ณ้ โๅ๐๑ณฟ"
-
-#: ../ex_docmd.c:3752
-msgid "E172: Only one file name allowed"
-msgstr "E172: ฤ๎็โ๎๋ๅํ๎ ๒ณ๋๊่ ๎ไํ๓ ํเ็โ๓ ๔เ้๋๓"
-
-#: ../ex_docmd.c:4238
-msgid "1 more file to edit. Quit anyway?"
-msgstr "วเ๋่๘่๋๎๑ โณไ๐ๅไเใ๓โเ๒่ ๙ๅ ๎ไ่ํ ๔เ้๋. ย๑ๅ ๎ไํ๎ โ่้๒่?"
-
-#: ../ex_docmd.c:4242
-#, c-format
-msgid "%d more files to edit. Quit anyway?"
-msgstr "ูๅ บ %d ํๅ ๐ๅไเใ๎โเํ่๕ ๔เ้๋ณโ. ย๑ๅ ๎ไํ๎ โ่้๒่?"
-
-#: ../ex_docmd.c:4248
-msgid "E173: 1 more file to edit"
-msgstr "E173: วเ๋่๘่๋๎๑ โณไ๐ๅไเใ๓โเ๒่ ๙ๅ ๎ไ่ํ ๔เ้๋"
-
-#: ../ex_docmd.c:4250
-#, c-format
-msgid "E173: %<PRId64> more files to edit"
-msgstr "E173: วเ๋่๘่๋๎๑ %<PRId64> ํๅ ๐ๅไเใ๎โเํ่๕ ๔เ้๋ณโ"
-
-#: ../ex_docmd.c:4320
-msgid "E174: Command already exists: add ! to replace it"
-msgstr "E174: ส๎์เํไเ โๆๅ ณ๑ํ๓บ, ! ๙๎แ ็เ์ณํ่๒่ ฟฟ"
-
-#: ../ex_docmd.c:4432
-msgid ""
-"\n"
-" Name Args Range Complete Definition"
-msgstr ""
-"\n"
-" อเ็โเ ภ๐ใ. ฬๅๆเ ฤ๎๏๎โํๅํํ ย่็ํเ๗ๅํํ"
-
-#: ../ex_docmd.c:4516
-msgid "No user-defined commands found"
-msgstr "อๅ ็ํเ้ไๅํ๎ ๊๎์เํไ ๊๎๐่๑๒๓โเ๗เ"
-
-#: ../ex_docmd.c:4538
-msgid "E175: No attribute specified"
-msgstr "E175: อๅ โ๊เ็เํ๎ เ๒๐่แ๓๒ณโ"
-
-#: ../ex_docmd.c:4583
-msgid "E176: Invalid number of arguments"
-msgstr "E176: อๅ๏๐เโ่๋ํเ ๊ณ๋๊ณ๑๒ เ๐ใ๓์ๅํ๒ณโ"
-
-#: ../ex_docmd.c:4594
-msgid "E177: Count cannot be specified twice"
-msgstr "E177: หณ๗่๋ํ่๊ ํๅ ์๎ๆๅ แ๓๒่ โ๊เ็เํ๎ ไโณ๗ณ"
-
-# msgstr "E177: "
-#: ../ex_docmd.c:4603
-msgid "E178: Invalid default value for count"
-msgstr "E178: อๅ๏๐เโ่๋ํๅ ๏๎๗เ๒๊๎โๅ ็ํเ๗ๅํํ ๋ณ๗่๋ํ่๊เ"
-
-# msgstr "E178: "
-#: ../ex_docmd.c:4625
-msgid "E179: argument required for -complete"
-msgstr "E179: ไ๋ -complete ๏๎๒๐ณแํ่้ เ๐ใ๓์ๅํ๒"
-
-# msgstr "E180: "
-#: ../ex_docmd.c:4635
-#, c-format
-msgid "E181: Invalid attribute: %s"
-msgstr "E181: อๅ๏๐เโ่๋ํ่้ เ๒๐่แ๓๒: %s"
-
-# msgstr "E181: "
-#: ../ex_docmd.c:4678
-msgid "E182: Invalid command name"
-msgstr "E182: อๅ๏๐เโ่๋ํเ ํเ็โเ ๊๎์เํไ่"
-
-# msgstr "E182: "
-#: ../ex_docmd.c:4691
-msgid "E183: User defined commands must start with an uppercase letter"
-msgstr "E183: ส๎์เํไ่ ๊๎๐่๑๒๓โเ๗เ ๏๎โ่ํํณ ๏๎๗่ํเ๒่๑ ็ โๅ๋่๊๎ฟ ๋ณ๒ๅ๐่"
-
-#: ../ex_docmd.c:4696
-msgid "E841: Reserved name, cannot be used for user defined command"
-msgstr ""
-"E841: วเ๐ๅ็ๅ๐โ๎โเํเ ํเ็โเ, ํๅ ์๎ๆํเ โ่๊๎๐่๑๒เ๒่ ไ๋ ๊๎๐่๑๒๓โเ๖๊๎ฟ ๊๎์เํไ่"
-
-# msgstr "E183: "
-#: ../ex_docmd.c:4751
-#, c-format
-msgid "E184: No such user-defined command: %s"
-msgstr "E184: ส๎์เํไ๓ ๊๎๐่๑๒๓โเ๗เ ํๅ ็ํเ้ไๅํ๎: %s"
-
-# msgstr "E179: "
-#: ../ex_docmd.c:5219
-#, c-format
-msgid "E180: Invalid complete value: %s"
-msgstr "E180: อๅ๏๐เโ่๋ํๅ ไ๎๏๎โํๅํํ: %s"
-
-#: ../ex_docmd.c:5225
-msgid "E468: Completion argument only allowed for custom completion"
-msgstr "E468: ภ๐ใ๓์ๅํ๒ ไ๎็โ๎๋ๅํ่้ ๒ณ๋๊่ ไ๋ ๊๎๐่๑๒๓โเ๖๊๎ใ๎ ไ๎๏๎โํๅํํ"
-
-#: ../ex_docmd.c:5231
-msgid "E467: Custom completion requires a function argument"
-msgstr "E467: ส๎๐่๑๒๓โเ๖๊ๅ ไ๎๏๎โํๅํํ โ่์เใเบ เ๐ใ๓์ๅํ๒-๔๓ํ๊๖ณ"
-
-# msgstr "E184: "
-#: ../ex_docmd.c:5257
-#, c-format
-msgid "E185: Cannot find color scheme '%s'"
-msgstr "E185: อๅ โไเ๋๎๑ ็ํเ้๒่ ๑๕ๅ์๓ ๊๎๋๎๐ณโ ซ%sป"
-
-#: ../ex_docmd.c:5263
-msgid "Greetings, Vim user!"
-msgstr "ยณ๒เํํ, ๊๎๐่๑๒๓โเ๗๓ Vim!"
-
-# msgstr "E443: "
-#: ../ex_docmd.c:5431
-msgid "E784: Cannot close last tab page"
-msgstr "E784: อๅ ์๎ๆํเ ็เ๊๐่๒่ ๎๑๒เํํ โ๊๋เไ๊๓"
-
-# msgstr "E444: "
-#: ../ex_docmd.c:5462
-msgid "Already only one tab page"
-msgstr "ยๆๅ ้ ๒เ๊ ๋่๘ๅ ๎ไํเ โ๊๋เไ๊เ"
-
-#: ../ex_docmd.c:6004
-#, c-format
-msgid "Tab page %d"
-msgstr "ย๊๋เไ๊เ %d"
-
-#: ../ex_docmd.c:6295
-msgid "No swap file"
-msgstr "อๅ์เบ ๔เ้๋๓ ๎แ์ณํ๓"
-
-#: ../ex_docmd.c:6478
-msgid "E747: Cannot change directory, buffer is modified (add ! to override)"
-msgstr "E747: อๅ โไเ๋๎๑ ็์ณํ่๒่ ๊เ๒เ๋๎ใ, แ๓๔ๅ๐ ์เบ ็์ณํ่ (! ๙๎แ ํๅ ็โเๆเ๒่)"
-
-#: ../ex_docmd.c:6485
-msgid "E186: No previous directory"
-msgstr "E186: ึๅ โๆๅ ํเ้๏ๅ๐๘่้ ๊เ๒เ๋๎ใ"
-
-# msgstr "E186: "
-#: ../ex_docmd.c:6530
-msgid "E187: Unknown"
-msgstr "E187: อๅโณไ๎์๎"
-
-#: ../ex_docmd.c:6610
-msgid "E465: :winsize requires two number arguments"
-msgstr "E465: :winsize โ่์เใเบ ไโเ ๗่๑๋๎โ่๕ เ๐ใ๓์ๅํ๒่"
-
-#: ../ex_docmd.c:6655
-msgid "E188: Obtaining window position not implemented for this platform"
-msgstr "E188: อๅ ์๎ๆํเ ๎๒๐่์เ๒่ ๏๎็่๖ณ โณ๊ํเ ํเ ๖ณ้ ๏๋เ๒๔๎๐์ณ"
-
-#: ../ex_docmd.c:6662
-msgid "E466: :winpos requires two number arguments"
-msgstr "E466: :winpos โ่์เใเบ ไโเ ๗่๑๋๎โ่๕ เ๐ใ๓์ๅํ๒่"
-
-#: ../ex_docmd.c:7241
-#, c-format
-msgid "E739: Cannot create directory: %s"
-msgstr "E739: อๅ โไเ๋๎๑ ๑๒โ๎๐่๒่ ๊เ๒เ๋๎ใ: %s"
-
-#: ../ex_docmd.c:7268
-#, c-format
-msgid "E189: \"%s\" exists (add ! to override)"
-msgstr "E189: ิเ้๋ ซ%sป ณ๑ํ๓บ (! ๙๎แ ํๅ ็โเๆเ๒่)"
-
-# msgstr "E189: "
-#: ../ex_docmd.c:7273
-#, c-format
-msgid "E190: Cannot open \"%s\" for writing"
-msgstr "E190: อๅ โไเ๋๎๑ โณไ๊๐่๒่ ซ%sป ไ๋ ็เ๏่๑๓"
-
-# msgstr "E190: "
-#. set mark
-#: ../ex_docmd.c:7294
-msgid "E191: Argument must be a letter or forward/backward quote"
-msgstr "E191: ภ๐ใ๓์ๅํ๒ ์เบ แ๓๒่ ๋ณ๒ๅ๐๎, ` เแ๎ '"
-
-# msgstr "E191: "
-#: ../ex_docmd.c:7333
-msgid "E192: Recursive use of :normal too deep"
-msgstr "E192: วเแเใเ๒๎ โ๊๋เไๅํ่๕ :normal"
-
-# msgstr "E193: "
-#: ../ex_docmd.c:7807
-msgid "E194: No alternate file name to substitute for '#'"
-msgstr "E194: อๅ์เบ ํเ็โ่ โ๒๎๐่ํํ๎ใ๎ ๔เ้๋๓ ไ๋ ็เ์ณํ่ '#'"
-
-#: ../ex_docmd.c:7841
-msgid "E495: no autocommand file name to substitute for \"<afile>\""
-msgstr "E495: อๅ์เบ ํเ็โ่ ๔เ้๋๓ เโ๒๎๊๎์เํไ่ ไ๋ ็เ์ณํ่ ซ<afile>ป"
-
-#: ../ex_docmd.c:7850
-msgid "E496: no autocommand buffer number to substitute for \"<abuf>\""
-msgstr "E496: อๅ์เบ ํ๎์ๅ๐เ แ๓๔ๅ๐เ เโ๒๎๊๎์เํไ่ ไ๋ ็เ์ณํ่ ซ<abuf>ป"
-
-#: ../ex_docmd.c:7861
-msgid "E497: no autocommand match name to substitute for \"<amatch>\""
-msgstr "E497: อๅ์เบ ํเ็โ่ ็แณใ๓ เโ๒๎๊๎์เํไ่ ไ๋ ็เ์ณํ่ ซ<amatch>ป"
-
-#: ../ex_docmd.c:7870
-msgid "E498: no :source file name to substitute for \"<sfile>\""
-msgstr "E498: อๅ์เบ ํเ็โ่ ๔เ้๋๓ :source ไ๋ ็เ์ณํ่ ซ<sfile>ป"
-
-#: ../ex_docmd.c:7876
-msgid "E842: no line number to use for \"<slnum>\""
-msgstr "E842: ํๅ์เบ ํ๎์ๅ๐เ ๐ไ๊เ, ๙๎แ โ่๊๎๐่๑๒เ๒่ ็ ซ<sfile>ป"
-
-#: ../ex_docmd.c:7903
-#, fuzzy, c-format
-msgid "E499: Empty file name for '%' or '#', only works with \":p:h\""
-msgstr "E499: อเ็โเ ๔เ้๋๓ ไ๋ '%' ๗่ '#' ๏๎๐๎ๆํ, ๏๐เ๖บ ๋่๘ๅ ็ ซ:p:hป"
-
-#: ../ex_docmd.c:7905
-msgid "E500: Evaluates to an empty string"
-msgstr "E500: ะๅ็๓๋๒เ๒ — ๏๎๐๎ๆํณ้ ๐ไ๎๊"
-
-#: ../ex_docmd.c:8838
-msgid "E195: Cannot open viminfo file for reading"
-msgstr "E195: อๅ โไเ๋๎๑ ๏๐๎๗่๒เ๒่ ๔เ้๋ viminfo"
-
-#: ../ex_eval.c:464
-msgid "E608: Cannot :throw exceptions with 'Vim' prefix"
-msgstr "E608: อๅ ์๎ๆํเ โ่๊่ไเ๒่ (:throw) โ่ํ๒๊่ ็ ๏๐ๅ๔ณ๊๑๎์ 'Vim'"
-
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:496
-#, c-format
-msgid "Exception thrown: %s"
-msgstr "ย่ํ๒๊๎โเ ๑่๒๓เ๖ณ: %s"
-
-#: ../ex_eval.c:545
-#, c-format
-msgid "Exception finished: %s"
-msgstr "ย่ํ๒๎๊ ็เ๊ณํ๗ๅํ๎: %s"
-
-#: ../ex_eval.c:546
-#, c-format
-msgid "Exception discarded: %s"
-msgstr "ย่ํ๒๎๊ ๑๊่ํ๓๒๎: %s"
-
-#: ../ex_eval.c:588 ../ex_eval.c:634
-#, c-format
-msgid "%s, line %<PRId64>"
-msgstr "%s, ๐ไ๎๊ %<PRId64>"
-
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:608
-#, c-format
-msgid "Exception caught: %s"
-msgstr "ั๏ณ้์เํ๎ โ่ํ๒๊๎โ๓ ๑่๒๓เ๖ณ: %s"
-
-#: ../ex_eval.c:676
-#, c-format
-msgid "%s made pending"
-msgstr "ฮ๗ณ๊๓บ๒๑ %s"
-
-#: ../ex_eval.c:679
-#, c-format
-msgid "%s resumed"
-msgstr "ยณไํ๎โ๋ๅํ๎ %s"
-
-#: ../ex_eval.c:683
-#, c-format
-msgid "%s discarded"
-msgstr "ั๊่ํ๓๒๎ %s"
-
-#: ../ex_eval.c:708
-msgid "Exception"
-msgstr "ย่ํ๒๎๊"
-
-#: ../ex_eval.c:713
-msgid "Error and interrupt"
-msgstr "ฯ๎์่๋๊เ, ๏ๅ๐ๅ๐โเํ๎"
-
-# msgstr "E231: "
-#: ../ex_eval.c:715
-msgid "Error"
-msgstr "ฯ๎์่๋๊เ"
-
-#. if (pending & CSTP_INTERRUPT)
-#: ../ex_eval.c:717
-msgid "Interrupt"
-msgstr "ฯๅ๐ๅ๐โเํ๎"
-
-#: ../ex_eval.c:795
-msgid "E579: :if nesting too deep"
-msgstr "E579: วเํเไ๒๎ แเใเ๒๎ โ๊๋เไๅํ่๕ :if"
-
-#: ../ex_eval.c:830
-msgid "E580: :endif without :if"
-msgstr "E580: :endif แๅ็ :if"
-
-#: ../ex_eval.c:873
-msgid "E581: :else without :if"
-msgstr "E581: :else แๅ็ :if"
-
-#: ../ex_eval.c:876
-msgid "E582: :elseif without :if"
-msgstr "E582: :elseif แๅ็ :if"
-
-#: ../ex_eval.c:880
-msgid "E583: multiple :else"
-msgstr "E583: อๅ ๎ไํๅ :else"
-
-#: ../ex_eval.c:883
-msgid "E584: :elseif after :else"
-msgstr "E584: :elseif ๏ณ๑๋ :else"
-
-#: ../ex_eval.c:941
-msgid "E585: :while/:for nesting too deep"
-msgstr "E585: วเแเใเ๒๎ โ๊๋เไๅํ่๕ :while/:for"
-
-#: ../ex_eval.c:1028
-msgid "E586: :continue without :while or :for"
-msgstr "E586: :continue แๅ็ :while ๗่ :for"
-
-#: ../ex_eval.c:1061
-msgid "E587: :break without :while or :for"
-msgstr "E587: :break แๅ็ :while ๗่ :for"
-
-#: ../ex_eval.c:1102
-msgid "E732: Using :endfor with :while"
-msgstr "E732: ยๆ่๒๎ :endfor ณ็ :while"
-
-#: ../ex_eval.c:1104
-msgid "E733: Using :endwhile with :for"
-msgstr "E733: ยๆ่๒๎ :endwhile ณ็ :for"
-
-#: ../ex_eval.c:1247
-msgid "E601: :try nesting too deep"
-msgstr "E601: วเแเใเ๒๎ โ๊๋เไๅํ่๕ :try"
-
-#: ../ex_eval.c:1317
-msgid "E603: :catch without :try"
-msgstr "E603: :catch แๅ็ :try"
-
-#. Give up for a ":catch" after ":finally" and ignore it.
-#. * Just parse.
-#: ../ex_eval.c:1332
-msgid "E604: :catch after :finally"
-msgstr "E604: :catch ๏ณ๑๋ :finally"
-
-#: ../ex_eval.c:1451
-msgid "E606: :finally without :try"
-msgstr "E606: :finally แๅ็ :try"
-
-#. Give up for a multiple ":finally" and ignore it.
-#: ../ex_eval.c:1467
-msgid "E607: multiple :finally"
-msgstr "E607: อๅ ๎ไํๅ :finally"
-
-#: ../ex_eval.c:1571
-msgid "E602: :endtry without :try"
-msgstr "E602: :entry แๅ็ :try"
-
-#: ../ex_eval.c:2026
-msgid "E193: :endfunction not inside a function"
-msgstr "E193: :endfunction ๏๎็เ ์ๅๆเ์่ ๔๓ํ๊๖ณฟ"
-
-#: ../ex_getln.c:1643
-msgid "E788: Not allowed to edit another buffer now"
-msgstr "E788: วเ๐เ็ ํๅ ์๎ๆํเ ๐ๅไเใ๓โเ๒่ ณํ๘่้ แ๓๔ๅ๐"
-
-#: ../ex_getln.c:1656
-msgid "E811: Not allowed to change buffer information now"
-msgstr "E811: วเ๐เ็ ํๅ ์๎ๆํเ ็์ณํโเ๒่ ณํ๔๎๐์เ๖ณ แ๓๔ๅ๐เ"
-
-# msgstr "E197: "
-#: ../ex_getln.c:3178
-msgid "tagname"
-msgstr "ํเ็โเ ๒ๅด๓"
-
-#: ../ex_getln.c:3181
-msgid " kind file\n"
-msgstr " ๒่๏ ๔เ้๋๓\n"
-
-#: ../ex_getln.c:4799
-msgid "'history' option is zero"
-msgstr "ฮ๏๖ณ 'history' ๏๎๐๎ๆํ"
-
-#: ../ex_getln.c:5046
-#, c-format
-msgid ""
-"\n"
-"# %s History (newest to oldest):\n"
-msgstr ""
-"\n"
-"# ฯ๎๏ๅ๐ๅไํณ %s (โณไ ํเ้ํ๎โณ๘่๕):\n"
-
-#: ../ex_getln.c:5047
-msgid "Command Line"
-msgstr "๊๎์เํไ่"
-
-#: ../ex_getln.c:5048
-msgid "Search String"
-msgstr "๘๓๊เํณ ๐ไ๊่"
-
-#: ../ex_getln.c:5049
-msgid "Expression"
-msgstr "โ่๐เ็่"
-
-#: ../ex_getln.c:5050
-msgid "Input Line"
-msgstr "โโๅไๅํณ ๐ไ๊่"
-
-#: ../ex_getln.c:5117
-msgid "E198: cmd_pchar beyond the command length"
-msgstr "E198: cmd_pchar ๏๎็เ ์ๅๆเ์่ ๊๎์เํไ่"
-
-#: ../ex_getln.c:5279
-msgid "E199: Active window or buffer deleted"
-msgstr "E199: ภ๊๒่โํๅ โณ๊ํ๎ เแ๎ แ๓๔ๅ๐ แ๓๋๎ ็ํ่๙ๅํ๎"
-
-#: ../file_search.c:203
-msgid "E854: path too long for completion"
-msgstr "E854: ๘๋๕ ็เํเไ๒๎ ไ๎โใ่้ ไ๋ ไ๎๏๎โํๅํํ"
-
-#: ../file_search.c:446
-#, c-format
-msgid ""
-"E343: Invalid path: '**[number]' must be at the end of the path or be "
-"followed by '%s'."
-msgstr ""
-"E343: อๅ๊๎๐ๅ๊๒ํ่้ ๘๋๕: `**[๗่๑๋๎]' ๏๎โ่ํํๅ แ๓๒่ ํเ๏๐่๊ณํ๖ณ ๘๋๕๓ เแ๎ ๏ๅ๐ๅไ "
-"'%s'."
-
-# msgstr "E343: "
-#: ../file_search.c:1505
-#, c-format
-msgid "E344: Can't find directory \"%s\" in cdpath"
-msgstr "E344: อๅ โไเ๋๎๑ ็ํเ้๒่ ๊เ๒เ๋๎ใ ซ%sป ๓ cdpath"
-
-# msgstr "E344: "
-#: ../file_search.c:1508
-#, c-format
-msgid "E345: Can't find file \"%s\" in path"
-msgstr "E345: อๅ โไเ๋๎๑ ็ํเ้๒่ ๔เ้๋ ซ%sป ๓ path"
-
-# msgstr "E345: "
-#: ../file_search.c:1512
-#, c-format
-msgid "E346: No more directory \"%s\" found in cdpath"
-msgstr "E346: ำ cdpath ํๅ์เบ แณ๋๘ๅ ๊เ๒เ๋๎ใ๓ ซ%sป"
-
-# msgstr "E346: "
-#: ../file_search.c:1515
-#, c-format
-msgid "E347: No more file \"%s\" found in path"
-msgstr "E347: ำ ๘๋๕๓ ๏๎๘๓๊๓ แณ๋๘ๅ ํๅ์เบ ๔เ้๋ณโ ซ%sป"
-
-#: ../fileio.c:137
-msgid "E812: Autocommands changed buffer or buffer name"
-msgstr "E812: ภโ๒๎๊๎์เํไ่ ็์ณํ่๋่ แ๓๔ๅ๐ ๗่ ้๎ใ๎ ํเ็โ๓"
-
-# msgstr "E199: "
-#: ../fileio.c:368
-msgid "Illegal file name"
-msgstr "อๅไ๎็โ๎๋ๅํเ ํเ็โเ ๔เ้๋๓"
-
-#: ../fileio.c:395 ../fileio.c:476 ../fileio.c:2543 ../fileio.c:2578
-msgid "is a directory"
-msgstr "๊เ๒เ๋๎ใ"
-
-#: ../fileio.c:397
-msgid "is not a file"
-msgstr "ํๅ ๔เ้๋"
-
-#: ../fileio.c:508 ../fileio.c:3522
-msgid "[New File]"
-msgstr "[อ๎โ่้ ๔เ้๋]"
-
-#: ../fileio.c:511
-msgid "[New DIRECTORY]"
-msgstr "[อ๎โ่้ ๊เ๒เ๋๎ใ]"
-
-#: ../fileio.c:529 ../fileio.c:532
-msgid "[File too big]"
-msgstr "[ิเ้๋ ็เโๅ๋่๊่้]"
-
-#: ../fileio.c:534
-msgid "[Permission Denied]"
-msgstr "[ยณไ์๎โ๋ๅํ๎]"
-
-#: ../fileio.c:653
-msgid "E200: *ReadPre autocommands made the file unreadable"
-msgstr "E200: ภโ๒๎๊๎์เํไ่ *ReadPre ๓ํๅ์๎ๆ๋่โ่๋่ ๗่๒เํํ ๔เ้๋๓"
-
-# msgstr "E200: "
-#: ../fileio.c:655
-msgid "E201: *ReadPre autocommands must not change current buffer"
-msgstr "E201: ภโ๒๎๊๎์เํไ่ *ReadPre ํๅ ๏๎โ่ํํณ ็์ณํโเ๒่ ๖ๅ้ แ๓๔ๅ๐"
-
-# msgstr "E201: "
-#: ../fileio.c:672
-msgid "Nvim: Reading from stdin...\n"
-msgstr "Vim: ื่๒เบ๒๑ ็ stdin...\n"
-
-#. Re-opening the original file failed!
-#: ../fileio.c:909
-msgid "E202: Conversion made file unreadable!"
-msgstr "E202: ส๎ํโๅ๐๒เ๖ณ ๓ํๅ์๎ๆ๋่โ่๋เ ๗่๒เํํ ๔เ้๋๓!"
-
-# msgstr "E202: "
-#. fifo or socket
-#: ../fileio.c:1782
-msgid "[fifo/socket]"
-msgstr "[๊เํเ๋/๑๎๊ๅ๒]"
-
-#. fifo
-#: ../fileio.c:1788
-msgid "[fifo]"
-msgstr "[๊เํเ๋]"
-
-#. or socket
-#: ../fileio.c:1794
-msgid "[socket]"
-msgstr "[๑๎๊ๅ๒]"
-
-#. or character special
-#: ../fileio.c:1801
-msgid "[character special]"
-msgstr "[๑๏ๅ๖. ๑่์โ๎๋ํ่้]"
-
-#: ../fileio.c:1815
-msgid "[CR missing]"
-msgstr "[ม๐เ๊๓บ CR]"
-
-#: ../fileio.c:1819
-msgid "[long lines split]"
-msgstr "[ะ๎็แ่๒๎ ไ๎โใณ ๐ไ๊่]"
-
-#: ../fileio.c:1823 ../fileio.c:3512
-msgid "[NOT converted]"
-msgstr "[อล ๊๎ํโๅ๐๒๎โเํ๎]"
-
-#: ../fileio.c:1826 ../fileio.c:3515
-msgid "[converted]"
-msgstr "[๊๎ํโๅ๐๒๎โเํ๎]"
-
-#: ../fileio.c:1831
-#, c-format
-msgid "[CONVERSION ERROR in line %<PRId64>]"
-msgstr "[ฯฮฬศหสภ สฮอยละาภึฒฏ ๓ ๐ไ๊๓ %<PRId64>]"
-
-#: ../fileio.c:1835
-#, c-format
-msgid "[ILLEGAL BYTE in line %<PRId64>]"
-msgstr "[อลสฮะลสาอศษ มภษา ๓ ๐ไ๊๓ %<PRId64>]"
-
-#: ../fileio.c:1838
-msgid "[READ ERRORS]"
-msgstr "[ฯฮฬศหสภ ืศาภออ฿]"
-
-#: ../fileio.c:2104
-msgid "Can't find temp file for conversion"
-msgstr "อๅ โไเ๋๎๑ ๏ณไ๘๓๊เ๒่ ๒่์๗เ๑๎โ่้ ๔เ้๋ ไ๋ ๊๎ํโๅ๐๒เ๖ณฟ"
-
-#: ../fileio.c:2110
-msgid "Conversion with 'charconvert' failed"
-msgstr "ส๎ํโๅ๐๒เ๖ณ ็ 'charconvert' ํๅ โไเ๋เ๑"
-
-#: ../fileio.c:2113
-msgid "can't read output of 'charconvert'"
-msgstr "ํๅ โไเ๋๎๑ ๏๐๎๗่๒เ๒่ โ่โณไ 'charconvert'"
-
-# msgstr "E217: "
-#: ../fileio.c:2437
-msgid "E676: No matching autocommands for acwrite buffer"
-msgstr "E676: อๅ์เบ โณไ๏๎โณไํ่๕ เโ๒๎๊๎์เํไ"
-
-#: ../fileio.c:2466
-msgid "E203: Autocommands deleted or unloaded buffer to be written"
-msgstr "E203: ภโ๒๎๊๎์เํไเ ็ํ่๙่๋เ เแ๎ โ่โเํ๒เๆ่๋เ แ๓๔ๅ๐, ๙๎ ์เโ แ๓๒่ ็เ๏่๑เํ่้"
-
-#: ../fileio.c:2486
-msgid "E204: Autocommand changed number of lines in unexpected way"
-msgstr "E204: ภโ๒๎๊๎์เํไเ ํๅ๑๏๎ไณโเํ่์ ๗่ํ๎์ ็์ณํ่๋เ ๊ณ๋๊ณ๑๒ ๐ไ๊ณโ"
-
-#: ../fileio.c:2548 ../fileio.c:2565
-msgid "is not a file or writable device"
-msgstr "อๅ ๏๐่ไเ๒ํ่้ ไ๋ ็เ๏่๑๓"
-
-#: ../fileio.c:2601
-msgid "is read-only (add ! to override)"
-msgstr "๋่๘ๅ ไ๋ ๗่๒เํํ (! ๙๎แ ํๅ ็โเๆเ๒่)"
-
-#: ../fileio.c:2886
-msgid "E506: Can't write to backup file (add ! to override)"
-msgstr "E506: อๅ โไเ๋๎๑ ็เ๏่๑เ๒่ ๐ๅ็ๅ๐โํ่้ ๔เ้๋ (! ๙๎แ ํๅ ็โเๆเ๒่)"
-
-#: ../fileio.c:2898
-msgid "E507: Close error for backup file (add ! to override)"
-msgstr "E507: ฯ๎์่๋๊เ ็เ๊๐่๒๒ ๐ๅ็ๅ๐โํ๎ใ๎ ๔เ้๋๓ (! ๙๎แ ํๅ ็โเๆเ๒่)"
-
-#: ../fileio.c:2901
-msgid "E508: Can't read file for backup (add ! to override)"
-msgstr ""
-"E508: อๅ โไเ๋๎๑ ๏๐๎๗่๒เ๒่ ๔เ้๋ ๙๎แ ๑๒โ๎๐่๒่ ๐ๅ็ๅ๐โํ๓ ๊๎๏ณ (! ๙๎แ ํๅ "
-"็โเๆเ๒่)"
-
-#: ../fileio.c:2923
-msgid "E509: Cannot create backup file (add ! to override)"
-msgstr "E509: อๅ โไเ๋๎๑ ๑๒โ๎๐่๒่ ๐ๅ็ๅ๐โํ๓ ๊๎๏ณ (! ๙๎แ ํๅ ็โเๆเ๒่)"
-
-#: ../fileio.c:3008
-msgid "E510: Can't make backup file (add ! to override)"
-msgstr "E510: อๅ โไเ๋๎๑ ็๐๎แ่๒่ ๐ๅ็ๅ๐โํ๓ ๊๎๏ณ (! ๙๎แ ํๅ ็โเๆเ๒่)"
-
-#. Can't write without a tempfile!
-#: ../fileio.c:3121
-msgid "E214: Can't find temp file for writing"
-msgstr "E214: อๅ โไเ๋๎๑ ๏ณไ๘๓๊เ๒่ ๒่์๗เ๑๎โ่้ ๔เ้๋ ไ๋ ็เ๏่๑๓"
-
-#: ../fileio.c:3134
-msgid "E213: Cannot convert (add ! to write without conversion)"
-msgstr "E213: อๅ โไเ๋๎๑ ๏ๅ๐ๅ๒โ๎๐่๒่ (! ๙๎แ ็เ๏่๑เ๒่ แๅ็ ๊๎ํโๅ๐๒เ๖ณฟ)"
-
-#: ../fileio.c:3169
-msgid "E166: Can't open linked file for writing"
-msgstr "E166: อๅ โไเ๋๎๑ โณไ๊๐่๒่ ไ๋ ็เ๏่๑๓ ็โ'็เํ่้ ๔เ้๋"
-
-#: ../fileio.c:3173
-msgid "E212: Can't open file for writing"
-msgstr "E212: อๅ โไเ๋๎๑ โณไ๊๐่๒่ ๔เ้๋ ไ๋ ็เ๏่๑๓"
-
-#: ../fileio.c:3363
-msgid "E667: Fsync failed"
-msgstr "E667: อๅ โไเ๋๎๑ โ่๊๎ํเ๒่ fsync"
-
-#: ../fileio.c:3398
-msgid "E512: Close failed"
-msgstr "E512: อๅ โไเ๋๎๑ ็เ๊๐่๒่"
-
-#: ../fileio.c:3436
-msgid "E513: write error, conversion failed (make 'fenc' empty to override)"
-msgstr "E513: ฯ๎์่๋๊เ ็เ๏่๑๓, ๊๎ํโๅ๐๒เ๖ณ ํๅ โไเ๋เ๑ (๑๊่ํ๒ๅ 'fenc')"
-
-#: ../fileio.c:3441
-#, c-format
-msgid ""
-"E513: write error, conversion failed in line %<PRId64> (make 'fenc' empty to "
-"override)"
-msgstr ""
-"E513: ฯ๎์่๋๊เ ็เ๏่๑๓, ๊๎ํโๅ๐๒เ๖ณ ํๅ โไเ๋เ๑ ๓ ๐ไ๊๓ %<PRId64> (๑๊่ํ๒ๅ "
-"'fenc')"
-
-#: ../fileio.c:3448
-msgid "E514: write error (file system full?)"
-msgstr "E514: ฯ๎์่๋๊เ ็เ๏่๑๓ (๑๊ณํ๗่๋๎๑ โณ๋ํๅ ์ณ๑๖ๅ?)"
-
-#: ../fileio.c:3506
-msgid " CONVERSION ERROR"
-msgstr " ฯฮฬศหสภ สฮอยละาภึฒฏ"
-
-#: ../fileio.c:3509
-#, c-format
-msgid " in line %<PRId64>;"
-msgstr " ๓ ๐ไ๊๓ %<PRId64>;"
-
-#: ../fileio.c:3519
-msgid "[Device]"
-msgstr "[ฯ๐่๑๒๐ณ้]"
-
-#: ../fileio.c:3522
-msgid "[New]"
-msgstr "[อ๎โ่้]"
-
-#: ../fileio.c:3535
-msgid " [a]"
-msgstr "[ไ]"
-
-#: ../fileio.c:3535
-msgid " appended"
-msgstr " ไ๎๏่๑เํ่้"
-
-#: ../fileio.c:3537
-msgid " [w]"
-msgstr "[็]"
-
-#: ../fileio.c:3537
-msgid " written"
-msgstr " ็เ๏่๑เํ่้"
-
-#: ../fileio.c:3579
-msgid "E205: Patchmode: can't save original file"
-msgstr "E205: หเ๒เํํ: ํๅ โไเ๋๎๑ ็แๅ๐ๅใ๒่ ๎๐่ใณํเ๋"
-
-#: ../fileio.c:3602
-msgid "E206: patchmode: can't touch empty original file"
-msgstr "E206: หเ๒เํํ: ํๅ โไเ๋๎๑ ๑๒โ๎๐่๒่ ๎๐่ใณํเ๋"
-
-#: ../fileio.c:3616
-msgid "E207: Can't delete backup file"
-msgstr "E207: อๅ โไเ๋๎๑ ็ํ่๙่๒่ ๐ๅ็ๅ๐โํ่้ ๔เ้๋"
-
-#: ../fileio.c:3672
-msgid ""
-"\n"
-"WARNING: Original file may be lost or damaged\n"
-msgstr ""
-"\n"
-"วภัาละลฦลออ฿: ฮ๐่ใณํเ๋, ์เแ๓๒, โ๒๐เ๗ๅํ่้ ๗่ ๏๎๘๊๎ไๆๅํ่้\n"
-
-#: ../fileio.c:3675
-msgid "don't quit the editor until the file is successfully written!"
-msgstr "อๅ โ่๕๎ไ๒ๅ ็ ๐ๅไเ๊๒๎๐เ, ไ๎๊่ ๔เ้๋ ํๅ ็เ๏่๑เํ๎!"
-
-#: ../fileio.c:3795
-msgid "[dos]"
-msgstr "[dos]"
-
-#: ../fileio.c:3795
-msgid "[dos format]"
-msgstr "[๔๎๐์เ๒ dos]"
-
-#: ../fileio.c:3801
-msgid "[mac]"
-msgstr "[mac]"
-
-#: ../fileio.c:3801
-msgid "[mac format]"
-msgstr "[๔๎๐์เ๒ mac]"
-
-#: ../fileio.c:3807
-msgid "[unix]"
-msgstr "[unix]"
-
-#: ../fileio.c:3807
-msgid "[unix format]"
-msgstr "[๔๎๐์เ๒ unix]"
-
-#: ../fileio.c:3831
-msgid "1 line, "
-msgstr "๎ไ่ํ ๐ไ๎๊, "
-
-#: ../fileio.c:3833
-#, c-format
-msgid "%<PRId64> lines, "
-msgstr "%<PRId64> ๐ไ๊ณโ, "
-
-#: ../fileio.c:3836
-msgid "1 character"
-msgstr "๎ไ่ํ ๑่์โ๎๋"
-
-#: ../fileio.c:3838
-#, c-format
-msgid "%<PRId64> characters"
-msgstr "%<PRId64> ๑่์โ๎๋ณโ"
-
-#: ../fileio.c:3849
-msgid "[noeol]"
-msgstr "[noeol]"
-
-#: ../fileio.c:3849
-msgid "[Incomplete last line]"
-msgstr "[อๅ๏๎โํ่้ ๎๑๒เํํณ้ ๐ไ๎๊]"
-
-#. don't overwrite messages here
-#. must give this prompt
-#. don't use emsg() here, don't want to flush the buffers
-#: ../fileio.c:3865
-msgid "WARNING: The file has been changed since reading it!!!"
-msgstr "วภัาละลฦลออ฿: ิเ้๋ ็์ณํ่โ๑ ็ ๗เ๑๓ ๎๑๒เํํ๎ใ๎ ๗่๒เํํ!!!"
-
-#: ../fileio.c:3867
-msgid "Do you really want to write to it"
-msgstr "ย่ ๑๏๐เโไณ ๕๎๗ๅ๒ๅ ้๎ใ๎ ๏ๅ๐ๅ๏่๑เ๒่??"
-
-#: ../fileio.c:4648
-#, c-format
-msgid "E208: Error writing to \"%s\""
-msgstr "E208: ฯ๎์่๋๊เ ็เ๏่๑๓ ๓ ซ%sป"
-
-#: ../fileio.c:4655
-#, c-format
-msgid "E209: Error closing \"%s\""
-msgstr "E209: ฯ๎์่๋๊เ ็เ๊๐่๒๒ ซ%sป"
-
-#: ../fileio.c:4657
-#, c-format
-msgid "E210: Error reading \"%s\""
-msgstr "E210: ฯ๎์่๋๊เ ๗่๒เํํ ซ%sป"
-
-#: ../fileio.c:4883
-msgid "E246: FileChangedShell autocommand deleted buffer"
-msgstr "E246: ภโ๒๎๊๎์เํไเ FileChangedShell ็ํ่๙่๋เ แ๓๔ๅ๐"
-
-#: ../fileio.c:4894
-#, c-format
-msgid "E211: File \"%s\" no longer available"
-msgstr "E211: ิเ้๋ ซ%sป แณ๋๘ๅ ํๅ ไ๎๑ๆํ่้"
-
-#: ../fileio.c:4906
-#, c-format
-msgid ""
-"W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as "
-"well"
-msgstr "W12: วเ๑๒ๅ๐ๅๆๅํํ: ิเ้๋ ซ%sป ็์ณํ่โ๑, เ๋ๅ ้ แ๓๔ๅ๐ ๓ Vim ๒เ๊๎ๆ"
-
-#: ../fileio.c:4907
-msgid "See \":help W12\" for more info."
-msgstr "ฤ่โ. ซ:help W12ป ไ๋ ๓๒๎๗ํๅํํ."
-
-#: ../fileio.c:4910
-#, c-format
-msgid "W11: Warning: File \"%s\" has changed since editing started"
-msgstr "W11: วเ๑๒ๅ๐ๅๆๅํํ: ิเ้๋ ซ%sป ็์ณํ่โ๑ ๏ณ๑๋ ๏๎๗เ๒๊๓ ๐ๅไเใ๓โเํํ"
-
-#: ../fileio.c:4911
-msgid "See \":help W11\" for more info."
-msgstr "ฤ่โ. ซ:help W11ป ไ๋ ๓๒๎๗ํๅํํ."
-
-#: ../fileio.c:4914
-#, c-format
-msgid "W16: Warning: Mode of file \"%s\" has changed since editing started"
-msgstr "W16: วเ๑๒ๅ๐ๅๆๅํํ: ะๅๆ่์ ๔เ้๋๓ ซ%sป ็์ณํ่โ๑ ๏ณ๑๋ ๏๎๗เ๒๊๓ ๐ๅไเใ๓โเํํ"
-
-#: ../fileio.c:4915
-msgid "See \":help W16\" for more info."
-msgstr "ฤ่โ. ซ:help W16ป ไ๋ ๓๒๎๗ํๅํํ."
-
-#: ../fileio.c:4927
-#, c-format
-msgid "W13: Warning: File \"%s\" has been created after editing started"
-msgstr "W13: วเ๑๒ๅ๐ๅๆๅํํ: ิเ้๋ ซ%sป แ๓๋๎ ๑๒โ๎๐ๅํ๎ ๏ณ๑๋ ๏๎๗เ๒๊๓ ๐ๅไเใ๓โเํํ"
-
-#: ../fileio.c:4947
-msgid "Warning"
-msgstr "วเ๑๒ๅ๐ๅๆๅํํ"
-
-#: ../fileio.c:4948
-msgid ""
-"&OK\n"
-"&Load File"
-msgstr ""
-"&O:รเ๐เ็ไ\n"
-"&L:วเโเํ๒เๆ่๒่"
-
-#: ../fileio.c:5065
-#, c-format
-msgid "E462: Could not prepare for reloading \"%s\""
-msgstr "E462: อๅ โไเ๋๎๑ ๏ณไใ๎๒๓โเ๒่ ซ%sป, ๙๎แ ๏ๅ๐ๅ๗่๒เ๒่"
-
-#: ../fileio.c:5078
-#, c-format
-msgid "E321: Could not reload \"%s\""
-msgstr "E321: อๅ โไเ๋๎๑ ๏ๅ๐ๅ๗่๒เ๒่ ซ%sป"
-
-#: ../fileio.c:5601
-msgid "--Deleted--"
-msgstr "--วํ่๙ๅํ๎--"
-
-#: ../fileio.c:5732
-#, c-format
-msgid "auto-removing autocommand: %s <buffer=%d>"
-msgstr "ภโ๒๎์เ๒่๗ํๅ ็ํ่๙ๅํํ เโ๒๎๊๎์เํไ่: %s <แ๓๔ๅ๐=%d>"
-
-#. the group doesn't exist
-#: ../fileio.c:5772
-#, c-format
-msgid "E367: No such group: \"%s\""
-msgstr "E367: อๅ์เบ ๒เ๊๎ฟ ใ๐๓๏่: ซ%sป"
-
-#: ../fileio.c:5897
-#, c-format
-msgid "E215: Illegal character after *: %s"
-msgstr "E215: อๅไ๎็โ๎๋ๅํ่้ ๑่์โ๎๋ ๏ณ๑๋ *: %s"
-
-# msgstr "E215: "
-#: ../fileio.c:5905
-#, c-format
-msgid "E216: No such event: %s"
-msgstr "E216: อๅ์เบ ๒เ๊๎ฟ ๏๎ไณฟ: %s"
-
-# msgstr "E215: "
-#: ../fileio.c:5907
-#, c-format
-msgid "E216: No such group or event: %s"
-msgstr "E216: อๅ์เบ ๒เ๊๎ฟ ใ๐๓๏่ ๗่ ๏๎ไณฟ: %s"
-
-# msgstr "E216: "
-#. Highlight title
-#: ../fileio.c:6090
-msgid ""
-"\n"
-"--- Auto-Commands ---"
-msgstr ""
-"\n"
-"--- ภโ๒๎๊๎์เํไ่ ---"
-
-#: ../fileio.c:6293
-#, c-format
-msgid "E680: <buffer=%d>: invalid buffer number "
-msgstr "E680: <แ๓๔ๅ๐=%d>: ํๅ๊๎๐ๅ๊๒ํ่้ ํ๎์ๅ๐ แ๓๔ๅ๐เ "
-
-#: ../fileio.c:6370
-msgid "E217: Can't execute autocommands for ALL events"
-msgstr "E217: อๅ ์๎ๆ๓ โ่๊๎ํ๓โเ๒่ เโ๒๎๊๎์เํไ่ ไ๋ ำัฒี ๏๎ไณ้"
-
-# msgstr "E217: "
-#: ../fileio.c:6393
-msgid "No matching autocommands"
-msgstr "อๅ์เบ โณไ๏๎โณไํ่๕ เโ๒๎๊๎์เํไ"
-
-#: ../fileio.c:6831
-msgid "E218: autocommand nesting too deep"
-msgstr "E218: วเแเใเ๒๎ โ๊๋เไๅํ่๕ เโ๒๎๊๎์เํไ"
-
-# msgstr "E218: "
-#: ../fileio.c:7143
-#, c-format
-msgid "%s Auto commands for \"%s\""
-msgstr "ภโ๒๎๊๎์เํไ่ %s ไ๋ ซ%sป"
-
-#: ../fileio.c:7149
-#, c-format
-msgid "Executing %s"
-msgstr "ย่๊๎ํ๓บ๒๑ %s"
-
-#: ../fileio.c:7211
-#, c-format
-msgid "autocommand %s"
-msgstr "เโ๒๎๊๎์เํไเ %s"
-
-#: ../fileio.c:7795
-msgid "E219: Missing {."
-msgstr "E219: ม๐เ๊๓บ {."
-
-# msgstr "E219: "
-#: ../fileio.c:7797
-msgid "E220: Missing }."
-msgstr "E220: ม๐เ๊๓บ }."
-
-# msgstr "E220: "
-#: ../fold.c:93
-msgid "E490: No fold found"
-msgstr "E490: วใ๎๐๒๎๊ ํๅ ็ํเ้ไๅํ๎"
-
-# msgstr "E349: "
-#: ../fold.c:544
-msgid "E350: Cannot create fold with current 'foldmethod'"
-msgstr "E350: อๅ โไเ๋๎๑ ๑๒โ๎๐่๒่ ็ใ๎๐๒๊๓ ์ๅ๒๎ไ๎์ 'foldmethod'"
-
-#: ../fold.c:546
-msgid "E351: Cannot delete fold with current 'foldmethod'"
-msgstr "E351: อๅ โไเ๋๎๑ ็ํ่๙่๒่ ็ใ๎๐๒๊๓ ์ๅ๒๎ไ๎์ 'foldmethod'"
-
-#: ../fold.c:1784
-#, c-format
-msgid "+--%3ld lines folded "
-msgstr "+-- ็ใ๎๐ํ๓๒๎ %3ld ๐ไ๊ณโ "
-
-#. buffer has already been read
-#: ../getchar.c:273
-msgid "E222: Add to read buffer"
-msgstr "E222: ฤ๎ไเ๒่ ไ๎ แ๓๔ๅ๐เ ๗่๒เํํ"
-
-#: ../getchar.c:2040
-msgid "E223: recursive mapping"
-msgstr "E223: วเ์ณํเ ๐ๅ๊๓๐๑่โํเ"
-
-# msgstr "E223: "
-#: ../getchar.c:2849
-#, c-format
-msgid "E224: global abbreviation already exists for %s"
-msgstr "E224: วเใเ๋ํๅ ๑๊๎๐๎๗ๅํํ ไ๋ %s โๆๅ ณ๑ํ๓บ"
-
-# msgstr "E224: "
-#: ../getchar.c:2852
-#, c-format
-msgid "E225: global mapping already exists for %s"
-msgstr "E225: วเใเ๋ํเ ็เ์ณํเ ไ๋ %s โๆๅ ณ๑ํ๓บ"
-
-# msgstr "E225: "
-#: ../getchar.c:2952
-#, c-format
-msgid "E226: abbreviation already exists for %s"
-msgstr "E226: ยๆๅ บ ๑๊๎๐๎๗ๅํํ ไ๋ %s"
-
-# msgstr "E226: "
-#: ../getchar.c:2955
-#, c-format
-msgid "E227: mapping already exists for %s"
-msgstr "E227: ยๆๅ บ ็เ์ณํเ ไ๋ %s"
-
-# msgstr "E227: "
-#: ../getchar.c:3008
-msgid "No abbreviation found"
-msgstr "ั๊๎๐๎๗ๅํํ ํๅ ็ํเ้ไๅํ๎"
-
-#: ../getchar.c:3010
-msgid "No mapping found"
-msgstr "วเ์ณํ่ ํๅ ็ํเ้ไๅํ๎"
-
-#: ../getchar.c:3974
-msgid "E228: makemap: Illegal mode"
-msgstr "E228: makemap: อๅ๏๐่๏๓๑๒่์่้ ๐ๅๆ่์"
-
-# msgstr "E447: "
-#. key value of 'cedit' option
-#. type of cmdline window or 0
-#. result of cmdline window or 0
-#: ../globals.h:924
-msgid "--No lines in buffer--"
-msgstr "--ฦ๎ไํ๎ใ๎ ๐ไ๊เ--"
-
-#.
-#. * The error messages that can be shared are included here.
-#. * Excluded are errors that are only used once and debugging messages.
-#.
-#: ../globals.h:996
-msgid "E470: Command aborted"
-msgstr "E470: ส๎์เํไ๓ ๏ๅ๐ๅ๐โเํ๎"
-
-#: ../globals.h:997
-msgid "E471: Argument required"
-msgstr "E471: อๅ๎แ๕ณไํ๎ โ๊เ็เ๒่ เ๐ใ๓์ๅํ๒"
-
-#: ../globals.h:998
-msgid "E10: \\ should be followed by /, ? or &"
-msgstr "E10: วเ \\ ์เบ ้๒่ /, ? เแ๎ &"
-
-# msgstr "E10: "
-#: ../globals.h:1000
-msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
-msgstr "E11: อๅ๏๐่๏๓๑๒่์๎ ๓ โณ๊ํณ ๊๎์เํไ, <CR> โ่๊๎ํ๓บ, CTRL-C โ่๕๎ไ่๒"
-
-#: ../globals.h:1002
-msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
-msgstr ""
-"E12: ส๎์เํไเ ํๅ ไ๎็โ๎๋ๅํเ ๓ exrc/vimrc ๓ ๏๎๘๓๊๓ ๏๎๒๎๗ํ๎ใ๎ ๊เ๒เ๋๎ใ๓ ๗่ ๒ๅด๓"
-
-#: ../globals.h:1003
-msgid "E171: Missing :endif"
-msgstr "E171: ม๐เ๊๓บ :endif"
-
-#: ../globals.h:1004
-msgid "E600: Missing :endtry"
-msgstr "E600: ม๐เ๊๓บ :endtry"
-
-#: ../globals.h:1005
-msgid "E170: Missing :endwhile"
-msgstr "E170: ม๐เ๊๓บ :endwhile"
-
-#: ../globals.h:1006
-msgid "E170: Missing :endfor"
-msgstr "E170: ม๐เ๊๓บ :endfor"
-
-#: ../globals.h:1007
-msgid "E588: :endwhile without :while"
-msgstr "E588: :endwhile แๅ็ :while"
-
-#: ../globals.h:1008
-msgid "E588: :endfor without :for"
-msgstr "E588: :endfor แๅ็ :for"
-
-#: ../globals.h:1009
-msgid "E13: File exists (add ! to override)"
-msgstr "E13: ิเ้๋ ณ๑ํ๓บ (! ๙๎แ ํๅ ็โเๆเ๒่)"
-
-#: ../globals.h:1010
-msgid "E472: Command failed"
-msgstr "E472: ส๎์เํไเ ํเ โไเ๋เ๑"
-
-#: ../globals.h:1011
-msgid "E473: Internal error"
-msgstr "E473: ยํ๓๒๐ณ๘ํ ๏๎์่๋๊เ"
-
-#: ../globals.h:1012
-msgid "Interrupted"
-msgstr "ฯๅ๐ๅ๐โเํ๎"
-
-#: ../globals.h:1013
-msgid "E14: Invalid address"
-msgstr "E14: อๅ๏๐เโ่๋ํเ เไ๐ๅ๑เ"
-
-# msgstr "E14: "
-#: ../globals.h:1014
-msgid "E474: Invalid argument"
-msgstr "E474: อๅ๊๎๐ๅ๊๒ํ่้ เ๐ใ๓์ๅํ๒"
-
-#: ../globals.h:1015
-#, c-format
-msgid "E475: Invalid argument: %s"
-msgstr "E475: อๅ๊๎๐ๅ๊๒ํ่้ เ๐ใ๓์ๅํ๒: %s"
-
-#: ../globals.h:1016
-#, c-format
-msgid "E15: Invalid expression: %s"
-msgstr "E15: อๅ๏๐เโ่๋ํ่้ โ่๐เ็: %s"
-
-# msgstr "E15: "
-#: ../globals.h:1017
-msgid "E16: Invalid range"
-msgstr "E16: อๅ๏๐เโ่๋ํณ ์ๅๆณ"
-
-# msgstr "E16: "
-#: ../globals.h:1018
-msgid "E476: Invalid command"
-msgstr "E476: อๅ๊๎๐ๅ๊๒ํเ ๊๎์เํไเ"
-
-#: ../globals.h:1019
-#, c-format
-msgid "E17: \"%s\" is a directory"
-msgstr "E17: ซ%sป — ๖ๅ ๊เ๒เ๋๎ใ"
-
-#: ../globals.h:1020
-#, fuzzy
-msgid "E900: Invalid job id"
-msgstr "E49: อๅ๊๎๐ๅ๊๒ํ่้ ๐๎็์ณ๐ ็๑๓โ๓"
-
-#: ../globals.h:1021
-msgid "E901: Job table is full"
-msgstr ""
-
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
-#: ../globals.h:1024
-#, c-format
-msgid "E364: Library call failed for \"%s()\""
-msgstr "E364: มณแ๋ณ๎๒ๅ๗ํ่้ โ่๊๋่๊ ไ๎ ซ%s()ป ํๅ โไเโ๑"
-
-# msgstr "E18: "
-#: ../globals.h:1026
-msgid "E19: Mark has invalid line number"
-msgstr "E19: ำ ๏๎์ณ๒๊่ ํๅ๊๎๐ๅ๊๒ํ่้ ํ๎์ๅ๐ ๐ไ๊เ"
-
-# msgstr "E19: "
-#: ../globals.h:1027
-msgid "E20: Mark not set"
-msgstr "E20: ฯ๎์ณ๒๊๓ ํๅ โ๑๒เํ๎โ๋ๅํ๎"
-
-# msgstr "E20: "
-#: ../globals.h:1029
-msgid "E21: Cannot make changes, 'modifiable' is off"
-msgstr "E21: ว์ณํ่ ํๅ ไ๎็โ๎๋ๅํณ: โ่์๊ํๅํ๎ 'modifiable'"
-
-# msgstr "E21: "
-#: ../globals.h:1030
-msgid "E22: Scripts nested too deep"
-msgstr "E22: วเแเใเ๒๎ โ๊๋เไๅํ่๕ ๑๊๐่๏๒ณโ"
-
-# msgstr "E22: "
-#: ../globals.h:1031
-msgid "E23: No alternate file"
-msgstr "E23: อๅ์เบ โ๒๎๐่ํํ๎ใ๎ ๔เ้๋๓"
-
-# msgstr "E23: "
-#: ../globals.h:1032
-msgid "E24: No such abbreviation"
-msgstr "E24: าเ๊๎ใ๎ ๑๊๎๐๎๗ๅํํ ํๅ์เบ"
-
-# msgstr "E24: "
-#: ../globals.h:1033
-msgid "E477: No ! allowed"
-msgstr "E477: ! ํๅ ไ๎็โ๎๋ๅํ๎"
-
-#: ../globals.h:1035
-msgid "E25: Nvim does not have a built-in GUI"
-msgstr "E25: อๅ ์๎ๆํเ โ่๊๎๐่๑๒เ๒่ GUI: อๅ โโณ์๊ํๅํ๎ ๏ณไ ๗เ๑ ๊๎์๏ณ๋๖ณฟ"
-
-# msgstr "E25: "
-#: ../globals.h:1036
-#, c-format
-msgid "E28: No such highlight group name: %s"
-msgstr "E28: อๅ์เบ ๒เ๊๎ฟ ใ๐๓๏่ ๏ณไ๑โณ๗๓โเํํ: %s"
-
-# msgstr "E28: "
-#: ../globals.h:1037
-msgid "E29: No inserted text yet"
-msgstr "E29: าๅ๊๑๒ ๙ๅ ํๅ แ๓๋๎ ไ๎ไเํ๎"
-
-# msgstr "E29: "
-#: ../globals.h:1038
-msgid "E30: No previous command line"
-msgstr "E30: ูๅ ํๅ แ๓๋๎ ๊๎์เํไ"
-
-# msgstr "E30: "
-#: ../globals.h:1039
-msgid "E31: No such mapping"
-msgstr "E31: อๅ์เบ ๒เ๊๎ฟ ็เ์ณํ่"
-
-# msgstr "E31: "
-#: ../globals.h:1040
-msgid "E479: No match"
-msgstr "E479: ฦ๎ไํ๎ใ๎ ็แณใ๓"
-
-#: ../globals.h:1041
-#, c-format
-msgid "E480: No match: %s"
-msgstr "E480: ฦ๎ไํ๎ใ๎ ็แณใ๓: %s"
-
-#: ../globals.h:1042
-msgid "E32: No file name"
-msgstr "E32: ม๐เ๊๓บ ํเ็โ่ ๔เ้๋๓"
-
-# msgstr "E32: "
-#: ../globals.h:1044
-msgid "E33: No previous substitute regular expression"
-msgstr "E33: วเ์ณํเ ็๐เ็๊ณโ ๙ๅ ํๅ โ่๊๎๐่๑๒๎โ๓โเ๋เ๑"
-
-# msgstr "E33: "
-#: ../globals.h:1045
-msgid "E34: No previous command"
-msgstr "E34: ส๎์เํไ ๙ๅ ํๅ แ๓๋๎"
-
-# msgstr "E34: "
-#: ../globals.h:1046
-msgid "E35: No previous regular expression"
-msgstr "E35: ว๐เ็๊ณโ ๏๎๘๓๊๓ ๙ๅ ํๅ แ๓๋๎"
-
-# msgstr "E35: "
-#: ../globals.h:1047
-msgid "E481: No range allowed"
-msgstr "E481: อๅ ไ๎็โ๎๋ๅํ๎ โ๊เ็๓โเ๒่ ์ๅๆณ"
-
-#: ../globals.h:1048
-msgid "E36: Not enough room"
-msgstr "E36: ฬณ๑๖ ํๅ โ่๑๒เ๗่๒"
-
-# msgstr "E36: "
-#: ../globals.h:1049
-#, c-format
-msgid "E482: Can't create file %s"
-msgstr "E482: อๅ โไเ๋๎๑ ๑๒โ๎๐่๒่ ๔เ้๋ %s"
-
-#: ../globals.h:1050
-msgid "E483: Can't get temp file name"
-msgstr "E483: อๅ โไเ๋๎๑ ๑๔๎๐์๓โเ๒่ ํเ็โ๓ ๒่์๗เ๑๎โ๎ใ๎ ๔เ้๋๓"
-
-#: ../globals.h:1051
-#, c-format
-msgid "E484: Can't open file %s"
-msgstr "E484: อๅ โไเ๋๎๑ โณไ๊๐่๒่ ๔เ้๋ %s"
-
-#: ../globals.h:1052
-#, c-format
-msgid "E485: Can't read file %s"
-msgstr "E485: อๅ โไเ๋๎๑ ๏๐๎๗่๒เ๒่ ๔เ้๋ %s"
-
-#: ../globals.h:1054
-msgid "E37: No write since last change (add ! to override)"
-msgstr "E37: ว์ณํ่ ํๅ แ๓๋๎ ็เ๏่๑เํ๎ (! ๙๎แ ํๅ ็โเๆเ๒่)"
-
-#: ../globals.h:1055
-#, fuzzy
-msgid "E37: No write since last change"
-msgstr "[ว์ณํ่ ํๅ ็เ๏่๑เํ๎]\n"
-
-#: ../globals.h:1056
-msgid "E38: Null argument"
-msgstr "E38: ยณไ๑๓๒ํณ้ เ๐ใ๓์ๅํ๒"
-
-#: ../globals.h:1057
-msgid "E39: Number expected"
-msgstr "E39: ฮ๗ณ๊๓บ๒๑ ๗่๑๋๎"
-
-#: ../globals.h:1058
-#, c-format
-msgid "E40: Can't open errorfile %s"
-msgstr "E40: อๅ โไเ๋๎๑ โณไ๊๐่๒่ ๔เ้๋ ๏๎์่๋๎๊ %s"
-
-#: ../globals.h:1059
-msgid "E41: Out of memory!"
-msgstr "E41: วเแ๐เ๊๋๎ ๏เ์'๒ณ!"
-
-#: ../globals.h:1060
-msgid "Pattern not found"
-msgstr "ว๐เ็๎๊ ํๅ ็ํเ้ไๅํ๎"
-
-#: ../globals.h:1061
-#, c-format
-msgid "E486: Pattern not found: %s"
-msgstr "E486: ว๐เ็๎๊ ํๅ ็ํเ้ไๅํ๎: %s"
-
-#: ../globals.h:1062
-msgid "E487: Argument must be positive"
-msgstr "E487: ภ๐ใ๓์ๅํ๒ ์เบ แ๓๒่ ไ๎ไเ๒ํ่้"
-
-#: ../globals.h:1064
-msgid "E459: Cannot go back to previous directory"
-msgstr "E459: อๅ โไเ๋๎๑ ๏ๅ๐ๅ้๒่ ไ๎ ๏๎๏ๅ๐ๅไํ๎ใ๎ ๊เ๒เ๋๎ใ๓"
-
-#: ../globals.h:1066
-msgid "E42: No Errors"
-msgstr "E42: ฦ๎ไํ๎ฟ ๏๎์่๋๊่"
-
-#: ../globals.h:1067
-msgid "E776: No location list"
-msgstr "E776: อๅ์เบ ๑๏่๑๊๓ ์ณ๑๖"
-
-#: ../globals.h:1068
-msgid "E43: Damaged match string"
-msgstr "E43: าๅ๊๑๒ ็แณใ๓ ๏๎๘๊๎ไๆๅํ๎"
-
-#: ../globals.h:1069
-msgid "E44: Corrupted regexp program"
-msgstr "E44: วณ๏๑๎โเํเ ๏๐๎ใ๐เ์เ ๐ๅใ๓๋๐ํ่๕ โ่๐เ็ณโ"
-
-#: ../globals.h:1071
-msgid "E45: 'readonly' option is set (add ! to override)"
-msgstr "E45: ย๑๒เํ๎โ๋ๅํ๎ ๎๏๖ณ 'readonly' (! ๙๎แ ํๅ ็โเๆเ๒่)"
-
-#: ../globals.h:1073
-#, c-format
-msgid "E46: Cannot change read-only variable \"%s\""
-msgstr "E46: ว์ณํํเ ๒ณ๋๊่ ไ๋ ๗่๒เํํ: ซ%sป"
-
-#: ../globals.h:1075
-#, c-format
-msgid "E794: Cannot set variable in the sandbox: \"%s\""
-msgstr "E794: อๅ ์๎ๆํเ โ๑๒เํ๎โ่๒่ ็์ณํํ๓ ๓ ๏ณ๑๎๗ํ่๖ณ: ซ%sป"
-
-#: ../globals.h:1076
-msgid "E47: Error while reading errorfile"
-msgstr "E47: ฯ๎์่๋๊เ ๗่๒เํํ ๔เ้๋๓ ๏๎์่๋๎๊"
-
-#: ../globals.h:1078
-msgid "E48: Not allowed in sandbox"
-msgstr "E48: อเ ไ๎็โ๎๋ๅํ๎ ๓ ๏ณ๑๎๗ํ่๖ณ"
-
-#: ../globals.h:1080
-msgid "E523: Not allowed here"
-msgstr "E523: อๅ ไ๎็โ๎๋ๅํ๎ ๒๓๒"
-
-#: ../globals.h:1082
-msgid "E359: Screen mode setting not supported"
-msgstr "E359: ะๅๆ่์ ๅ๊๐เํ๓ ํๅ ๏ณไ๒๐่์๓บ๒๑"
-
-#: ../globals.h:1083
-msgid "E49: Invalid scroll size"
-msgstr "E49: อๅ๊๎๐ๅ๊๒ํ่้ ๐๎็์ณ๐ ็๑๓โ๓"
-
-#: ../globals.h:1084
-msgid "E91: 'shell' option is empty"
-msgstr "E91: ฮ๏๖ณ 'shell' ๏๎๐๎ๆํ"
-
-# msgstr "E254: "
-#: ../globals.h:1085
-msgid "E255: Couldn't read in sign data!"
-msgstr "E255: อๅ ์๎ๆํเ ็๗่๒เ๒่ ไเํณ ํเ๏่๑๓!"
-
-#: ../globals.h:1086
-msgid "E72: Close error on swap file"
-msgstr "E72: ฯ๎์่๋๊เ ๏ณไ ๗เ๑ ็เ๊๐่๒๒ ๔เ้๋๓ ๎แ์ณํ๓"
-
-#: ../globals.h:1087
-msgid "E73: tag stack empty"
-msgstr "E73: ั๒ๅ๊ ๒ๅดณโ ๏๎๐๎ๆํณ้"
-
-#: ../globals.h:1088
-msgid "E74: Command too complex"
-msgstr "E74: วเํเไ๒๎ ๑๊๋เไํเ ๊๎์เํไเ"
-
-#: ../globals.h:1089
-msgid "E75: Name too long"
-msgstr "E75: วเไ๎โใๅ ณ์'"
-
-#: ../globals.h:1090
-msgid "E76: Too many ["
-msgstr "E76: วเแเใเ๒๎ '['"
-
-#: ../globals.h:1091
-msgid "E77: Too many file names"
-msgstr "E77: วเแเใเ๒๎ ํเ็โ ๔เ้๋ณโ"
-
-#: ../globals.h:1092
-msgid "E488: Trailing characters"
-msgstr "E488: อเไ๋่๘๊๎โณ ๑่์โ๎๋่"
-
-#: ../globals.h:1093
-msgid "E78: Unknown mark"
-msgstr "E78: อๅโณไ๎์เ ๏๎์ณ๒๊เ"
-
-#: ../globals.h:1094
-msgid "E79: Cannot expand wildcards"
-msgstr "E79: อๅ โไเ๋๎๑ ๐๎็๊๐่๒่ ๘เแ๋๎ํ"
-
-#: ../globals.h:1096
-msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
-msgstr "E591: 'winheight' ํๅ ์๎ๆๅ แ๓๒่ ์ๅํ๘่์ ็เ 'winminheight'"
-
-#: ../globals.h:1098
-msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
-msgstr "E592: 'winwidth' ํๅ ์๎ๆๅ แ๓๒่ ์ๅํ๘่์ ็เ 'winminwidth'"
-
-# msgstr "E79: "
-#: ../globals.h:1099
-msgid "E80: Error while writing"
-msgstr "E80: ฯ๎์่๋๊เ ๏ณไ ๗เ๑ ็เ๏่๑๓"
-
-#: ../globals.h:1100
-msgid "Zero count"
-msgstr "อ๓๋๎โเ ๊ณ๋๊ณ๑๒"
-
-#: ../globals.h:1101
-msgid "E81: Using <SID> not in a script context"
-msgstr "E81: <SID> โ่๊๎๐่๑๒๎โ๓บ๒๑ ํๅ โ ๊๎ํ๒ๅ๊๑๒ณ ๑๊๐่๏๒๓"
-
-#: ../globals.h:1102
-#, c-format
-msgid "E685: Internal error: %s"
-msgstr "E685: ยํ๓๒๐ณ๘ํ ๏๎์่๋๊เ: %s"
-
-#: ../globals.h:1104
-msgid "E363: pattern uses more memory than 'maxmempattern'"
-msgstr "E363: ว๐เ็๎๊ โ่๊๎๐่๑๒๎โ๓บ แณ๋๘ๅ, ํณๆ 'maxmempattern', ๏เ์'๒ณ"
-
-#: ../globals.h:1105
-msgid "E749: empty buffer"
-msgstr "E749: ฯ๎๐๎ๆํณ้ แ๓๔ๅ๐"
-
-#: ../globals.h:1108
-msgid "E682: Invalid search pattern or delimiter"
-msgstr "E682: อๅ๊๎๐ๅ๊๒ํ่้ ็๐เ็๎๊ ไ๋ ๏๎๘๓๊๓ ๗่ ๐๎็ไณ๋ํ่๊"
-
-#: ../globals.h:1109
-msgid "E139: File is loaded in another buffer"
-msgstr "E139: ิเ้๋ ๓ๆๅ ็เโเํ๒เๆๅํ๎ โ ณํ๘่้ แ๓๔ๅ๐"
-
-# msgstr "E235: "
-#: ../globals.h:1110
-#, c-format
-msgid "E764: Option '%s' is not set"
-msgstr "E764: ฮ๏๖ณ '%s' ํๅ โ๑๒เํ๎โ๋ๅํเ"
-
-#: ../globals.h:1111
-msgid "E850: Invalid register name"
-msgstr "E850: อๅ๏๐เโ่๋ํเ ํเ็โเ ๐ๅใณ๑๒๐๓"
-
-#: ../globals.h:1114
-msgid "search hit TOP, continuing at BOTTOM"
-msgstr "ฯ๎๘๓๊ ไณ้๘๎โ ไ๎ ฯฮืภาสำ, ๏๐๎ไ๎โๆ๓บ๒๑ ็ สฒอึ฿"
-
-#: ../globals.h:1115
-msgid "search hit BOTTOM, continuing at TOP"
-msgstr "ฯ๎๘๓๊ ไณ้๘๎โ ไ๎ สฒอึ฿, ๏๐๎ไ๎โๆ๓บ๒๑ ็ ฯฮืภาสำ"
-
-#: ../hardcopy.c:240
-msgid "E550: Missing colon"
-msgstr "E550: ฯ๐๎๏๓๙ๅํ๎ ไโ๎๊๐เ๏๊๓"
-
-# msgstr "E347: "
-#: ../hardcopy.c:252
-msgid "E551: Illegal component"
-msgstr "E551: อๅ๊๎๐ๅ๊๒ํ่้ ๊๎์๏๎ํๅํ๒"
-
-#: ../hardcopy.c:259
-msgid "E552: digit expected"
-msgstr "E552: ๎๗ณ๊๓บ๒๑ ๖่๔๐เ"
-
-#: ../hardcopy.c:473
-#, c-format
-msgid "Page %d"
-msgstr "ั๒๎๐ณํ๊เ %d"
-
-#: ../hardcopy.c:597
-msgid "No text to be printed"
-msgstr "อณ๗๎ใ๎ ไ๐๓๊๓โเ๒่"
-
-#: ../hardcopy.c:668
-#, c-format
-msgid "Printing page %d (%d%%)"
-msgstr "ฤ๐๓๊๓บ๒๑ ๑๒๎๐ณํ๊เ %d (%d%%)"
-
-#: ../hardcopy.c:680
-#, c-format
-msgid " Copy %d of %d"
-msgstr " ส๎๏ณ %d ็ %d"
-
-#: ../hardcopy.c:733
-#, c-format
-msgid "Printed: %s"
-msgstr "อเไ๐๓๊๎โเํ๎: %s"
-
-#: ../hardcopy.c:740
-msgid "Printing aborted"
-msgstr "ฤ๐๓๊ ๏ๅ๐ๅ๐โเํ๎"
-
-#: ../hardcopy.c:1365
-msgid "E455: Error writing to PostScript output file"
-msgstr "E455: อๅ โไเ๋๎๑ ็เ๏่๑เ๒่ โ่๕ณไํ่้ ๔เ้๋ PostScript"
-
-#: ../hardcopy.c:1747
-#, c-format
-msgid "E624: Can't open file \"%s\""
-msgstr "E624: อๅ โไเ๋๎๑ โณไ๊๐่๒่ ๔เ้๋ ซ%sป"
-
-#: ../hardcopy.c:1756 ../hardcopy.c:2470
-#, c-format
-msgid "E457: Can't read PostScript resource file \"%s\""
-msgstr "E457: อๅ โไเ๋๎๑ ๏๐๎๗่๒เ๒่ ๔เ้๋ ๐ๅ๑๓๐๑ณโ PostScript ซ%sป"
-
-#: ../hardcopy.c:1772
-#, c-format
-msgid "E618: file \"%s\" is not a PostScript resource file"
-msgstr "E618: ซ%sป ํๅ บ ๔เ้๋๎์ ๐ๅ๑๓๐๑ณโ PostScript"
-
-#: ../hardcopy.c:1788 ../hardcopy.c:1805 ../hardcopy.c:1844
-#, c-format
-msgid "E619: file \"%s\" is not a supported PostScript resource file"
-msgstr "E619: ซ%sป ํๅ บ ๏ณไ๒๐่์๓โเํ่์ ๔เ้๋๎์ ๐ๅ๑๓๐๑ณโ PostScript"
-
-#: ../hardcopy.c:1856
-#, c-format
-msgid "E621: \"%s\" resource file has wrong version"
-msgstr "E621: อๅ๏๐เโ่๋ํเ โๅ๐๑ณ ๔เ้๋๓ ๐ๅ๑๓๐๑ณโ ซ%sป"
-
-#: ../hardcopy.c:2225
-msgid "E673: Incompatible multi-byte encoding and character set."
-msgstr "E673: อๅ๑๓์ณ๑ํณ แเใเ๒๎แเ้๒๎โๅ ๊๎ไ๓โเํํ ้ ํเแณ๐ ๑่์โ๎๋ณโ."
-
-#: ../hardcopy.c:2238
-msgid "E674: printmbcharset cannot be empty with multi-byte encoding."
-msgstr ""
-"E674: printmbcharset ํๅ ์๎ๆๅ แ๓๒่ ๏๎๐๎ๆํณ์ ็ แเใเ๒๎แเ้๒๎โ่์ ๊๎ไ๓โเํํ์."
-
-#: ../hardcopy.c:2254
-msgid "E675: No default font specified for multi-byte printing."
-msgstr "E675: อๅ ็เ็ํเ๗ๅํ๎ ๘๐่๔๒ ไ๋ แเใเ๒๎แเ้๒๎โ๎ใ๎ ไ๐๓๊๓."
-
-#: ../hardcopy.c:2426
-msgid "E324: Can't open PostScript output file"
-msgstr "E324: อๅ โไเ๋๎๑ โณไ๊๐่๒่ ๔เ้๋ PostScript ไ๋ โ่โ๎ไ๓"
-
-#: ../hardcopy.c:2458
-#, c-format
-msgid "E456: Can't open file \"%s\""
-msgstr "E456: อๅ โไเ๋๎๑ โณไ๊๐่๒่ ๔เ้๋ ซ%sป"
-
-#: ../hardcopy.c:2583
-msgid "E456: Can't find PostScript resource file \"prolog.ps\""
-msgstr "E456: อๅ โไเ๋๎๑ ็ํเ้๒่ ๔เ้๋ ๐ๅ๑๓๐๑ณโ PostScript ซprolog.psป"
-
-#: ../hardcopy.c:2593
-msgid "E456: Can't find PostScript resource file \"cidfont.ps\""
-msgstr "E456: อๅ โไเ๋๎๑ ็ํเ้๒่ ๔เ้๋ ๐ๅ๑๓๐๑ณโ PostScript ซcidfont.psป"
-
-#: ../hardcopy.c:2622 ../hardcopy.c:2639 ../hardcopy.c:2665
-#, c-format
-msgid "E456: Can't find PostScript resource file \"%s.ps\""
-msgstr "E456: อๅ โไเ๋๎๑ ็ํเ้๒่ ๔เ้๋ ๐ๅ๑๓๐๑ณโ PostScript ซ%s.psป"
-
-#: ../hardcopy.c:2654
-#, c-format
-msgid "E620: Unable to convert to print encoding \"%s\""
-msgstr "E620: อๅ โไเ๋๎๑ ๏ๅ๐ๅ๒โ๎๐่๒่ ไ๎ ๊๎ไ๓โเํํ ไ๐๓๊๓ ซ%sป"
-
-#: ../hardcopy.c:2877
-msgid "Sending to printer..."
-msgstr "ยณไ๑่๋เบ๒๑ ํเ ๏๐่ํ๒ๅ๐..."
-
-#: ../hardcopy.c:2881
-msgid "E365: Failed to print PostScript file"
-msgstr "E365: อๅ โไเ๋๎๑ ํเไ๐๓๊๓โเ๒่ ๔เ้๋ PostScript"
-
-#: ../hardcopy.c:2883
-msgid "Print job sent."
-msgstr "วเโไเํํ ไ๐๓๊๓ โณไณ๑๋เํ๎."
-
-# msgstr "E255: "
-#: ../if_cscope.c:85
-msgid "Add a new database"
-msgstr "ฤ๎ไเ๒่ ํ๎โ๓ แเ็๓ ไเํ่๕"
-
-#: ../if_cscope.c:87
-msgid "Query for a pattern"
-msgstr "วเ๏่๒ ็เ ็๐เ็๊๎์"
-
-#: ../if_cscope.c:89
-msgid "Show this message"
-msgstr "ฯ๎๊เ็เ๒่ ๖ๅ ๏๎โณไ๎์๋ๅํํ"
-
-#: ../if_cscope.c:91
-msgid "Kill a connection"
-msgstr "วํ่๙่๒่ ็'บไํเํํ"
-
-#: ../if_cscope.c:93
-msgid "Reinit all connections"
-msgstr "ฯๅ๐ๅ็เ๏๓๑๒่๒่ ๓๑ณ ็'บไํเํํ"
-
-#: ../if_cscope.c:95
-msgid "Show connections"
-msgstr "ฯ๎๊เ็เ๒่ ็'บไํเํํ"
-
-#: ../if_cscope.c:101
-#, c-format
-msgid "E560: Usage: cs[cope] %s"
-msgstr "E560: ย่๊๎๐่๑๒เํํ: cs[cope] %s"
-
-#: ../if_cscope.c:225
-msgid "This cscope command does not support splitting the window.\n"
-msgstr "ึ ๊๎์เํไเ cscope ํๅ โ์ณบ ไณ๋่๒่ โณ๊ํ๎.\n"
-
-#: ../if_cscope.c:266
-msgid "E562: Usage: cstag <ident>"
-msgstr "E562: ย่๊๎๐่๑๒เํํ: cstag <ณไๅํ๒่๔-๎๐>"
-
-#: ../if_cscope.c:313
-msgid "E257: cstag: tag not found"
-msgstr "E257: cstag: ๒ๅด ํๅ ็ํเ้ไๅํ๎"
-
-# msgstr "E257: "
-#: ../if_cscope.c:461
-#, c-format
-msgid "E563: stat(%s) error: %d"
-msgstr "E563: stat(%s) ๏๎์่๋๊เ: %d"
-
-#: ../if_cscope.c:551
-#, c-format
-msgid "E564: %s is not a directory or a valid cscope database"
-msgstr "E564: %s ํๅ บ ํณ ๊เ๒เ๋๎ใ๎์, ํณ แเ็๎ ไเํ่๕ cscope"
-
-#: ../if_cscope.c:566
-#, c-format
-msgid "Added cscope database %s"
-msgstr "ฤ๎ไเํ๎ แเ็๓ ไเํ่๕ cscope %s"
-
-#: ../if_cscope.c:616
-#, c-format
-msgid "E262: error reading cscope connection %<PRId64>"
-msgstr "E262: ฯ๎์่๋๊เ ๗่๒เํํ ็ณ ็'บไํเํํ cscope %<PRId64>"
-
-#: ../if_cscope.c:711
-msgid "E561: unknown cscope search type"
-msgstr "E561: อๅโณไ๎์่้ ๒่๏ ๏๎๘๓๊๓ cscope"
-
-#: ../if_cscope.c:752 ../if_cscope.c:789
-msgid "E566: Could not create cscope pipes"
-msgstr "E566: อๅ โไเ๋๎๑ ๑๒โ๎๐่๒่ ๊เํเ๋่ ไ๎ cscope"
-
-#: ../if_cscope.c:767
-msgid "E622: Could not fork for cscope"
-msgstr "E622: อๅ โไเ๋๎๑ ๐๎็ไณ๋่๒่ ๏๐๎๖ๅ๑ ไ๋ cscope"
-
-#: ../if_cscope.c:849
-msgid "cs_create_connection setpgid failed"
-msgstr "cs_create_connection: ๏๎์่๋๊เ setpgid"
-
-#: ../if_cscope.c:853 ../if_cscope.c:889
-msgid "cs_create_connection exec failed"
-msgstr "cs_create_connection: ๏๎์่๋๊เ ๏ณไ ๗เ๑ โ่๊๎ํเํํ"
-
-#: ../if_cscope.c:863 ../if_cscope.c:902
-msgid "cs_create_connection: fdopen for to_fp failed"
-msgstr "cs_create_connection: fdopen ไ๋ to_fp ํๅ โไเโ๑"
-
-#: ../if_cscope.c:865 ../if_cscope.c:906
-msgid "cs_create_connection: fdopen for fr_fp failed"
-msgstr "cs_create_connection: fdopen ไ๋ fr_fp ํๅ โไเโ๑"
-
-#: ../if_cscope.c:890
-msgid "E623: Could not spawn cscope process"
-msgstr "E623: อๅ โไเ๋๎๑ ๑๒โ๎๐่๒่ ๏๐๎๖ๅ๑ cscope"
-
-#: ../if_cscope.c:932
-msgid "E567: no cscope connections"
-msgstr "E567: ๆ๎ไํ๎ใ๎ ็'บไํเํํ ณ็ cscope"
-
-#: ../if_cscope.c:1009
-#, c-format
-msgid "E469: invalid cscopequickfix flag %c for %c"
-msgstr "E469: อๅ๊๎๐ๅ๊๒ํ่้ ๏๐เ๏๎๐ๅ๖ cscopequickfix %c ไ๋ %c"
-
-# msgstr "E258: "
-#: ../if_cscope.c:1058
-#, c-format
-msgid "E259: no matches found for cscope query %s of %s"
-msgstr "E259: ฤ๋ ็เ๏่๒๓ cscope %s ็ %s ํณ๗๎ใ๎ ํๅ ็ํเ้ไๅํ๎"
-
-# msgstr "E259: "
-#: ../if_cscope.c:1142
-msgid "cscope commands:\n"
-msgstr "ส๎์เํไ่ cscope:\n"
-
-#: ../if_cscope.c:1150
-#, c-format
-msgid "%-5s: %s%*s (Usage: %s)"
-msgstr "%-5s: %s%*s (ย่๊๎๐่๑๒เํํ: %s)"
-
-#: ../if_cscope.c:1155
-msgid ""
-"\n"
-" c: Find functions calling this function\n"
-" d: Find functions called by this function\n"
-" e: Find this egrep pattern\n"
-" f: Find this file\n"
-" g: Find this definition\n"
-" i: Find files #including this file\n"
-" s: Find this C symbol\n"
-" t: Find this text string\n"
-msgstr ""
-"\n"
-" c: วํเ้๒่ ๔๓ํ๊๖ณฟ, ๙๎ โ่๊๋่๊เ๒ ๖ ๔๓ํ๊๖ณ\n"
-" d: วํเ้๒่ ๔๓ํ๊๖ณฟ, ๙๎ โ่๊๋่๊เ๒๑ ๖ณบ ๔๓ํ๊๖ณบ\n"
-" e: วํเ้๒่ ๖ๅ้ ๘เแ๋๎ํ egrep\n"
-" f: วํเ้๒่ ๖ๅ้ ๔เ้๋\n"
-" g: วํเ้๒่ ๖ๅ โ่็ํเ๗ๅํํ\n"
-" i: วํเ้๒่ ๔เ้๋่, ๊ณ โ๊๋๗เ๒ โ ๑ๅแๅ ๖ๅ้ ๔เ้๋\n"
-" s: วํเ้๒่ ๖ๅ้ ๑่์โ๎๋ C\n"
-" t: วํเ้๒่ ๖ๅ้ ๒ๅ๊๑๒\n"
-
-#: ../if_cscope.c:1226
-msgid "E568: duplicate cscope database not added"
-msgstr "E568: ฯ๎โ๒๎๐ํเ แเ็เ ไเํ่๕ cscope ํๅ ไ๎ไเํเ"
-
-# msgstr "E260: "
-#: ../if_cscope.c:1335
-#, c-format
-msgid "E261: cscope connection %s not found"
-msgstr "E261: ว'บไํเํํ ็ cscope %s ํๅ ็ํเ้ไๅํ๎"
-
-#: ../if_cscope.c:1364
-#, c-format
-msgid "cscope connection %s closed"
-msgstr "ว'บไํเํํ ็ cscope %s ็เ๊ณํ๗ๅํ๎"
-
-#. should not reach here
-#: ../if_cscope.c:1486
-msgid "E570: fatal error in cs_manage_matches"
-msgstr "E570: ิเ๒เ๋ํเ ๏๎์่๋๊เ โ cs_manage_matches"
-
-#: ../if_cscope.c:1693
-#, c-format
-msgid "Cscope tag: %s"
-msgstr "าๅด cscope: %s"
-
-#: ../if_cscope.c:1711
-msgid ""
-"\n"
-" # line"
-msgstr ""
-"\n"
-" # ๐ไ๎๊"
-
-#: ../if_cscope.c:1713
-msgid "filename / context / line\n"
-msgstr "๔เ้๋ / ๊๎ํ๒ๅ๊๑๒ / ๐ไ๎๊\n"
-
-#: ../if_cscope.c:1809
-#, c-format
-msgid "E609: Cscope error: %s"
-msgstr "E609: ฯ๎์่๋๊เ cscope: %s"
-
-#: ../if_cscope.c:2053
-msgid "All cscope databases reset"
-msgstr "ำ๑ณ แเ็่ ไเํ่๕ cscope ๏ๅ๐ๅ็เโเํ๒เๆๅํ๎"
-
-#: ../if_cscope.c:2123
-msgid "no cscope connections\n"
-msgstr "ฦ๎ไํ๎ใ๎ ็'บไํเํํ ็ cscope\n"
-
-#: ../if_cscope.c:2126
-msgid " # pid database name prepend path\n"
-msgstr " # pid ํเ็โเ แเ็่ ไเํ่๕ ๘๋๕\n"
-
-#: ../main.c:144
-msgid "Unknown option argument"
-msgstr "อๅโณไ๎์่้ เ๐ใ๓์ๅํ๒ ๎๏๖ณฟ"
-
-#: ../main.c:146
-msgid "Too many edit arguments"
-msgstr "วเแเใเ๒๎ เ๐ใ๓์ๅํ๒ณโ"
-
-#: ../main.c:148
-msgid "Argument missing after"
-msgstr "ฯ๐๎๏๓๙ๅํ๎ เ๐ใ๓์ๅํ๒ ๏ณ๑๋"
-
-#: ../main.c:150
-msgid "Garbage after option argument"
-msgstr "ั์ณ๒๒ ๏ณ๑๋ เ๐ใ๓์ๅํ๒๓ ๎๏๖ณฟ"
-
-#: ../main.c:152
-msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"
-msgstr "วเแเใเ๒๎ เ๐ใ๓์ๅํ๒ณโ ๓ ซ+๊๎์เํไเป, ซ-c ๊๎์เํไเป เแ๎ ซ--cmd ๊๎์เํไเป"
-
-# msgstr "E14: "
-#: ../main.c:154
-msgid "Invalid argument for"
-msgstr "อๅ๏๐เโ่๋ํ่้ เ๐ใ๓์ๅํ๒ ๓"
-
-#: ../main.c:294
-#, c-format
-msgid "%d files to edit\n"
-msgstr "%d ๔เ้๋่(ณโ)\n"
-
-#: ../main.c:1342
-msgid "Attempt to open script file again: \""
-msgstr "ั๏๐๎แเ ๏๎โ๒๎๐ํ๎ โณไ๊๐่๒่ ๑๊๐่๏๒: \""
-
-#: ../main.c:1350
-msgid "Cannot open for reading: \""
-msgstr "อๅ โไเ๋๎๑ ๏๐๎๗่๒เ๒่: \""
-
-#: ../main.c:1393
-msgid "Cannot open for script output: \""
-msgstr "อๅ โไเ๋๎๑ โณไ๊๐่๒่ ๊ โ่๕ณไํ่้ ๔เ้๋: \""
-
-#: ../main.c:1622
-msgid "Vim: Warning: Output is not to a terminal\n"
-msgstr "Vim: วเ๑๒ๅ๐ๅๆๅํํ: ย่โณไ ํๅ ๓ ๒ๅ๐์ณํเ๋\n"
-
-#: ../main.c:1624
-msgid "Vim: Warning: Input is not from a terminal\n"
-msgstr "Vim: วเ๑๒ๅ๐ๅๆๅํํ: ำโๅไๅํํ ํๅ ็ ๒ๅ๐์ณํเ๋๓\n"
-
-#. just in case..
-#: ../main.c:1891
-msgid "pre-vimrc command line"
-msgstr "๊๎์เํไ่ ๏ๅ๐ๅไ vimrc"
-
-#: ../main.c:1964
-#, c-format
-msgid "E282: Cannot read from \"%s\""
-msgstr "E282: อๅ โไเ๋๎๑ ๏๐๎๗่๒เ๒่ ็ ซ%sป"
-
-# msgstr "E282: "
-#: ../main.c:2149
-msgid ""
-"\n"
-"More info with: \"vim -h\"\n"
-msgstr ""
-"\n"
-"ฤณ็ํเ้๒ๅ๑ แณ๋๘ๅ: ซvim -hป\n"
-
-#: ../main.c:2178
-msgid "[file ..] edit specified file(s)"
-msgstr "[๔เ้๋ ..] ๐ๅไเใ๓โเ๒่ โ๊เ็เํณ ๔เ้๋่"
-
-#: ../main.c:2179
-msgid "- read text from stdin"
-msgstr "- ๗่๒เ๒่ ๒ๅ๊๑๒ ็ stdin"
-
-#: ../main.c:2180
-msgid "-t tag edit file where tag is defined"
-msgstr "-t ๏๎์ณ๒๊เ ๏ๅ๐ๅ้๒่ ไ๎ ๒ๅด๓"
-
-#: ../main.c:2181
-msgid "-q [errorfile] edit file with first error"
-msgstr "-q [๔เ้๋] ๏ๅ๐ๅ้๒่ ไ๎ ๏ๅ๐๘๎ฟ ๏๎์่๋๊่"
-
-#: ../main.c:2187
-msgid ""
-"\n"
-"\n"
-"usage:"
-msgstr ""
-"\n"
-"\n"
-"ยๆ่๒๎๊:"
-
-#: ../main.c:2189
-msgid " vim [arguments] "
-msgstr " vim [เ๐ใ๓์ๅํ๒่] "
-
-#: ../main.c:2193
-msgid ""
-"\n"
-" or:"
-msgstr ""
-"\n"
-" เแ๎:"
-
-#: ../main.c:2196
-msgid ""
-"\n"
-"\n"
-"Arguments:\n"
-msgstr ""
-"\n"
-"\n"
-"ภ๐ใ๓์ๅํ๒่:\n"
-
-#: ../main.c:2197
-msgid "--\t\t\tOnly file names after this"
-msgstr "--\t\t\tห่๘ๅ ํเ็โ่ ๔เ้๋ณโ ๏ณ๑๋ ๖๎ใ๎"
-
-#: ../main.c:2199
-msgid "--literal\t\tDon't expand wildcards"
-msgstr "--literal\t\tอๅ ๐๎็๊๐่โเ๒่ ๘เแ๋๎ํ่"
-
-#: ../main.c:2201
-msgid "-v\t\t\tVi mode (like \"vi\")"
-msgstr "-v\t\t\tะๅๆ่์ Vi (ํณแ่ ซviป)"
-
-#: ../main.c:2202
-msgid "-e\t\t\tEx mode (like \"ex\")"
-msgstr "-e\t\t\tะๅๆ่์ Ex (ํณแ่ ซexป)"
-
-#: ../main.c:2203
-msgid "-E\t\t\tImproved Ex mode"
-msgstr "-E\t\t\tฯ๎๊๐เ๙ๅํ่้ ๐ๅๆ่์ Ex"
-
-#: ../main.c:2204
-msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")"
-msgstr "-s\t\t\tฬ๎โ๗เ็ํ่้ (๏เ๊ๅ๒ํ่้) ๐ๅๆ่์ (๋่๘ๅ ไ๋ ซexป)"
-
-#: ../main.c:2205
-msgid "-d\t\t\tDiff mode (like \"vimdiff\")"
-msgstr "-d\t\t\tะๅๆ่์ ๏๎๐ณโํํํ (ํณแ่ ซvimdiffป)"
-
-#: ../main.c:2206
-msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
-msgstr "-y\t\t\tฯ๐๎๑๒่้ ๐ๅๆ่์ (ํณแ่ ซevimป, แๅ็ ๐ๅๆ่์ณโ)"
-
-#: ../main.c:2207
-msgid "-R\t\t\tReadonly mode (like \"view\")"
-msgstr "-R\t\t\tะๅๆ่์ ๏ๅ๐ๅใ๋ไ๓ (ํณแ่ ซviewป)"
-
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tฮแ์ๅๆๅํ่้ ๐ๅๆ่์ (ํณแ่ ซrvimป)"
-
-#: ../main.c:2209
-msgid "-m\t\t\tModifications (writing files) not allowed"
-msgstr "-m\t\t\tว์ณํ่ (็เ๏่๑ ๔เ้๋ณโ) ํๅ ไ๎็โ๎๋ๅํ๎"
-
-#: ../main.c:2210
-msgid "-M\t\t\tModifications in text not allowed"
-msgstr "-M\t\t\tว์ณํ่ โ ๒ๅ๊๑๒ณ ๔เ้๋ณโ ํๅ ไ๎็โ๎๋ๅํ๎"
-
-#: ../main.c:2211
-msgid "-b\t\t\tBinary mode"
-msgstr "-b\t\t\tฤโณ้๊๎โ่้ ๐ๅๆ่์"
-
-#: ../main.c:2212
-msgid "-l\t\t\tLisp mode"
-msgstr "-l\t\t\tะๅๆ่์ lisp"
-
-#: ../main.c:2213
-msgid "-C\t\t\tCompatible with Vi: 'compatible'"
-msgstr "-C\t\t\tั๓์ณ๑ํ่้ ็ Vi ๐ๅๆ่์: 'compatible'"
-
-#: ../main.c:2214
-msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'"
-msgstr "-N\t\t\tอๅ ็๎โ๑ณ์ ๑๓์ณ๑ํ่้ ็ Vi ๐ๅๆ่์: 'nocompatible'"
-
-#: ../main.c:2215
-msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]"
-msgstr "-V[N][๔เ้๋]\t\tมณ๋๘ๅ ๏๎โณไ๎์๋ๅํ [๐ณโๅํ N] [๔เ้๋ ๆ๓๐ํ. ๏๎โณไ๎์๋ๅํ]"
-
-#: ../main.c:2216
-msgid "-D\t\t\tDebugging mode"
-msgstr "-D\t\t\tะๅๆ่์ ํเ๋เใ๎ไๆๅํํ"
-
-#: ../main.c:2217
-msgid "-n\t\t\tNo swap file, use memory only"
-msgstr "-n\t\t\tอๅ โ่๊๎๐่๑๒๎โ๓โเ๒่ ๔เ้๋ ๎แ์ณํ๓, ๒๐่์เ๒่ ๓๑ๅ โ ๏เ์'๒ณ"
-
-#: ../main.c:2218
-msgid "-r\t\t\tList swap files and exit"
-msgstr "-r\t\t\tฯ๎๊เ็เ๒่ ๔เ้๋่ ๎แ์ณํ๓ ณ โ่้๒่"
-
-#: ../main.c:2219
-msgid "-r (with file name)\tRecover crashed session"
-msgstr "-r (ํเ็โเ ๔เ้๋๓)\tยณไํ๎โ่๒่ เโเ๐ณ้ํ๎ ็เ๊ณํ๗ๅํ่้ ๑ๅเํ๑"
-
-#: ../main.c:2220
-msgid "-L\t\t\tSame as -r"
-msgstr "-L\t\t\tาๅ ๑เ์ๅ, ๙๎ ้ -r"
-
-#: ../main.c:2221
-msgid "-A\t\t\tstart in Arabic mode"
-msgstr "-A\t\t\tวเ๏๓๑๒่๒่ โ ๐ๅๆ่์ณ เ๐เแ๑๊๎ฟ ์๎โ่"
-
-#: ../main.c:2222
-msgid "-H\t\t\tStart in Hebrew mode"
-msgstr "-H\t\t\tวเ๏๓๑๒่๒่ โ ๐ๅๆ่์ณ ณโ๐่๒๓"
-
-#: ../main.c:2223
-msgid "-F\t\t\tStart in Farsi mode"
-msgstr "-F\t\t\tวเ๏๓๑๒่๒่ โ ๐ๅๆ่์ณ ๏ๅ๐๑๊๎ฟ ์๎โ่"
-
-#: ../main.c:2224
-msgid "-T <terminal>\tSet terminal type to <terminal>"
-msgstr "-T <๒ๅ๐์ณํเ๋>\tย๑๒เํ๎โ่๒่ ๒่๏ ๒ๅ๐์ณํเ๋๓ ๓ <๒ๅ๐์ณํเ๋>"
-
-#: ../main.c:2225
-msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc"
-msgstr "-u <vimrc>\t\tย่๊๎๐่๑๒เ๒่ ๏๎ไเํ่้ ๔เ้๋ ็เ์ณ๑๒ .vimrc"
-
-#: ../main.c:2226
-msgid "--noplugin\t\tDon't load plugin scripts"
-msgstr "--noplugin\t\tอๅ โเํ๒เๆ่๒่ ๑๊๐่๏๒่ ไ๎๏๎โํๅํํ"
-
-#: ../main.c:2227
-msgid "-p[N]\t\tOpen N tab pages (default: one for each file)"
-msgstr "-p[N]\t\tยณไ๊๐่๒่ N โ๊๋เไ๎๊ (เแ๎ ๏๎ ๎ไํณ้ ไ๋ ๊๎ๆํ๎ใ๎ ๔เ้๋๓)"
-
-#: ../main.c:2228
-msgid "-o[N]\t\tOpen N windows (default: one for each file)"
-msgstr "-o[N]\t\tยณไ๊๐่๒่ N โณ๊๎ํ (เแ๎ ๏๎ ๎ไํ๎์๓ ไ๋ ๊๎ๆํ๎ใ๎ ๔เ้๋๓)"
-
-#: ../main.c:2229
-msgid "-O[N]\t\tLike -o but split vertically"
-msgstr "-O[N]\t\tอณแ่ -o, เ๋ๅ ๏๎ไณ๋่๒่ โณ๊ํเ โๅ๐๒่๊เ๋ํ๎"
-
-#: ../main.c:2230
-msgid "+\t\t\tStart at end of file"
-msgstr "+\t\t\tะ๎็๏๎๗เ๒่ โ ๊ณํ๖ณ ๔เ้๋๓"
-
-#: ../main.c:2231
-msgid "+<lnum>\t\tStart at line <lnum>"
-msgstr "+<๐ไ๎๊>\t\tะ๎็๏๎๗เ๒่ ๓ โ๊เ็เํ๎์๓ <๐ไ๊๓>"
-
-#: ../main.c:2232
-msgid "--cmd <command>\tExecute <command> before loading any vimrc file"
-msgstr "--cmd <๊๎์เํไเ>\tย่๊๎ํเ๒่ <๊๎์เํไ๓> ๏ๅ๐ๅไ ็เโเํ๒เๆๅํํ์ vimrc"
-
-#: ../main.c:2233
-msgid "-c <command>\t\tExecute <command> after loading the first file"
-msgstr "-c <๊๎์เํไเ>\t\tย่๊๎ํเ๒่ <๊๎์เํไ๓> ๏ณ๑๋ ็เโเํ๒เๆๅํํ ๏ๅ๐๘๎ใ๎ ๔เ้๋๓"
-
-#: ../main.c:2235
-msgid "-S <session>\t\tSource file <session> after loading the first file"
-msgstr "-S <๑ๅเํ๑>\t\tย่๊๎ํเ๒่ ๏๎ไเํ่้ ๔เ้๋ ๏ณ๑๋ ๏ๅ๐๘๎ใ๎ ็เโเํ๒เๆๅํ๎ใ๎ ๔เ้๋๓"
-
-#: ../main.c:2236
-msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>"
-msgstr "-s <๑๊๐่๏๒>\t\tว๗่๒เ๒่ ๊๎์เํไ่ ํ๎๐์เ๋ํ๎ใ๎ ๐ๅๆ่์๓ ็ ๔เ้๋๓ <๑๊๐่๏๒>"
-
-#: ../main.c:2237
-msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>"
-msgstr "-w <๑๊๐่๏๒>\t\tฤ๎๏่๑เ๒่ ๓๑ณ ํเแ๐เํณ ๊๎์เํไ่ ไ๎ ๔เ้๋๓ <๑๊๐่๏๒>"
-
-#: ../main.c:2238
-msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>"
-msgstr "-w <๑๊๐่๏๒>\t\tวเ๏่๑เ๒่ ๓๑ณ ํเแ๐เํณ ๊๎์เํไ่ ๓ ๔เ้๋ <๑๊๐่๏๒>"
-
-#: ../main.c:2240
-msgid "--startuptime <file>\tWrite startup timing messages to <file>"
-msgstr ""
-"--startuptime <๔เ้๋>\tวเ๏่๑เ๒่ ็เ๏๓๑๊ํณ ๏๎โณไ๎์๋ๅํํ ็ ๗เ๑๎โ่์่ โณไ์ณ๒๊เ์่ "
-"ไ๎ <๔เ้๋๓>"
-
-#: ../main.c:2242
-msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
-msgstr "-i <viminfo>\t\tย่๊๎๐่๑๒เ๒่ <viminfo> ็เ์ณ๑๒ .viminfo"
-
-#: ../main.c:2243
-msgid "-h or --help\tPrint Help (this message) and exit"
-msgstr "-h ๗่ --help\tอเไ๐๓๊๓โเ๒่ ๖ๅ ๏๎โณไ๎์๋ๅํํ ณ โ่้๒่"
-
-#: ../main.c:2244
-msgid "--version\t\tPrint version information and exit"
-msgstr "--version\t\tอเไ๐๓๊๓โเ๒่ ณํ๔๎๐์เ๖ณ ๏๐๎ โๅ๐๑ณ ๏๐๎ใ๐เ์่ ณ โ่้๒่"
-
-#: ../mark.c:676
-msgid "No marks set"
-msgstr "อๅ โ๑๒เํ๎โ๋ๅํ๎ ๆ๎ไํ๎ฟ ๏๎์ณ๒๊่"
-
-#: ../mark.c:678
-#, c-format
-msgid "E283: No marks matching \"%s\""
-msgstr "E283: ฯ๎์ณ๒๊๓ ซ%sป ํๅ ็ํเ้ไๅํ๎"
-
-# msgstr "E283: "
-#. Highlight title
-#: ../mark.c:687
-msgid ""
-"\n"
-"mark line col file/text"
-msgstr ""
-"\n"
-"๏๎์. ๐ไ. ๊๎๋. ๔เ้๋/๒ๅ๊๑๒"
-
-#. Highlight title
-#: ../mark.c:789
-msgid ""
-"\n"
-" jump line col file/text"
-msgstr ""
-"\n"
-" ๒๎๗๊เ ๐ไ. ๑๒๎โ๏. ๔เ้๋/๒ๅ๊๑๒"
-
-# msgstr "E283: "
-#. Highlight title
-#: ../mark.c:831
-msgid ""
-"\n"
-"change line col text"
-msgstr ""
-"\n"
-"็์ณํ่๒่ ๐ไ. ๑๒๎โ๏. ๒ๅ๊๑๒"
-
-# TODO
-#: ../mark.c:1238
-msgid ""
-"\n"
-"# File marks:\n"
-msgstr ""
-"\n"
-"# ฯ๎์ณ๒๊่:\n"
-
-#. Write the jumplist with -'
-#: ../mark.c:1271
-msgid ""
-"\n"
-"# Jumplist (newest first):\n"
-msgstr ""
-"\n"
-"# ั๏่๑๎๊ ๏ๅ๐ๅ๕๎ไณโ (โณไ ํเ้ํ๎โณ๘่๕):\n"
-
-# TODO
-#: ../mark.c:1352
-msgid ""
-"\n"
-"# History of marks within files (newest to oldest):\n"
-msgstr ""
-"\n"
-"# ฯ๎๏ๅ๐ๅไํณ ๏๎์ณ๒๊่ โ ๔เ้๋เ๕ (โณไ ํเ้ํ๎โณ๘่๕):\n"
-
-#: ../mark.c:1431
-msgid "Missing '>'"
-msgstr "ฯ๐๎๏๓๙ๅํ๎ '>'"
-
-# msgstr "E292: "
-#: ../memfile.c:426
-msgid "E293: block was not locked"
-msgstr "E293: ม๋๎๊ ํๅ แ๓๋๎ ็เ๔ณ๊๑๎โเํ๎"
-
-# msgstr "E293: "
-#: ../memfile.c:799
-msgid "E294: Seek error in swap file read"
-msgstr "E294: ฯ๎์่๋๊เ ็์ณํ่ ๏๎็่๖ณฟ ๓ ๔เ้๋ณ ๎แ์ณํ๓"
-
-#: ../memfile.c:803
-msgid "E295: Read error in swap file"
-msgstr "E295: ฯ๎์่๋๊เ ็๗่๒๓โเํํ ๔เ้๋๓ ๎แ์ณํ๓"
-
-#: ../memfile.c:849
-msgid "E296: Seek error in swap file write"
-msgstr "E296: ฯ๎์่๋๊เ ็์ณํ่ ๏๎็่๖ณฟ ๏ณไ ๗เ๑ ็เ๏่๑๓ ๓ ๔เ้๋ ๎แ์ณํ๓"
-
-#: ../memfile.c:865
-msgid "E297: Write error in swap file"
-msgstr "E297: ฯ๎์่๋๊เ ็เ๏่๑๓ ๔เ้๋๓ ๎แ์ณํ๓"
-
-#: ../memfile.c:1036
-msgid "E300: Swap file already exists (symlink attack?)"
-msgstr "E300: ิเ้๋ ๎แ์ณํ๓ โๆๅ ณ๑ํ๓บ (เ๒เ๊เ ๑่์โ๎๋ํ่์ ๏๎๑่๋เํํ์?)"
-
-#: ../memline.c:318
-msgid "E298: Didn't get block nr 0?"
-msgstr "E298: อๅ์เบ แ๋๎๊๓ 0?"
-
-#: ../memline.c:361
-msgid "E298: Didn't get block nr 1?"
-msgstr "E298: อๅ์เบ แ๋๎๊๓ 1?"
-
-# msgstr "E298: "
-#: ../memline.c:377
-msgid "E298: Didn't get block nr 2?"
-msgstr "E298: อๅ์เบ แ๋๎๊๓ 2?"
-
-#. could not (re)open the swap file, what can we do????
-#: ../memline.c:465
-msgid "E301: Oops, lost the swap file!!!"
-msgstr "E301: ฮ้, โ๒๐เ๗ๅํ๎ ๔เ้๋ ๎แ์ณํ๓!!!"
-
-# msgstr "E301: "
-#: ../memline.c:477
-msgid "E302: Could not rename swap file"
-msgstr "E302: อๅ โไเ๋๎๑ ๏ๅ๐ๅ้์ๅํ๓โเ๒่ ๔เ้๋๓ ๎แ์ณํ๓"
-
-# msgstr "E302: "
-#: ../memline.c:554
-#, c-format
-msgid "E303: Unable to open swap file for \"%s\", recovery impossible"
-msgstr "E303: อๅ โไเ๋๎๑ ๏๐๎๗่๒เ๒่ ๔เ้๋ ๎แ์ณํ๓ ไ๋ ซ%sป, โณไํ๎โ๋ๅํํ ํๅ์๎ๆ๋่โๅ"
-
-#: ../memline.c:666
-msgid "E304: ml_upd_block0(): Didn't get block 0??"
-msgstr "E304: ml_upd_block0(): อๅ์เบ แ๋๎๊๓ 0??"
-
-#. no swap files found
-#: ../memline.c:830
-#, c-format
-msgid "E305: No swap file found for %s"
-msgstr "E305: อๅ ็ํเ้ไๅํ๎ ๔เ้๋๓ ๎แ์ณํ๓ ไ๋ %s"
-
-# msgstr "E305: "
-#: ../memline.c:839
-msgid "Enter number of swap file to use (0 to quit): "
-msgstr "ยโๅไณ๒ ํ๎์ๅ๐ ๔เ้๋๓ ๎แ์ณํ๓, ๊๎๒๐่้ โ่๊๎๐่๑๒เ๒่, (0 ไ๋ โ่๕๎ไ๓):"
-
-#: ../memline.c:879
-#, c-format
-msgid "E306: Cannot open %s"
-msgstr "E306: อๅ โไเ๋๎๑ โณไ๊๐่๒่ %s"
-
-#: ../memline.c:897
-msgid "Unable to read block 0 from "
-msgstr "อๅ โไเ๋๎๑ ๏๐๎๗่๒เ๒่ แ๋๎๊ 0 ็ "
-
-#: ../memline.c:900
-msgid ""
-"\n"
-"Maybe no changes were made or Vim did not update the swap file."
-msgstr ""
-"\n"
-"อเ๏ๅโํ๎, ็์ณํ ํๅ แ๓๋๎, เแ๎ Vim ํๅ ๏๎ํ๎โ่โ ๔เ้๋ ๎แ์ณํ๓."
-
-#: ../memline.c:909
-msgid " cannot be used with this version of Vim.\n"
-msgstr " ํๅ ์๎ๆํเ โ่๊๎๐่๑๒เ๒่ ็ ๖ณบ โๅ๐๑ณบ Vim.\n"
-
-#: ../memline.c:911
-msgid "Use Vim version 3.0.\n"
-msgstr "วํเ้ไณ๒ Vim 3.0\n"
-
-#: ../memline.c:916
-#, c-format
-msgid "E307: %s does not look like a Vim swap file"
-msgstr "E307: %s ํๅ ๑๕๎ๆๅ ํเ ๔เ้๋ ๎แ์ณํ๓ Vim"
-
-#: ../memline.c:922
-msgid " cannot be used on this computer.\n"
-msgstr " ํๅ ์๎ๆํเ โ่๊๎๐่๑๒เ๒่ ํเ ๖๎์๓ ๊๎์๏'๒ๅ๐ณ.\n"
-
-#: ../memline.c:924
-msgid "The file was created on "
-msgstr "ิเ้๋ แ๓๋๎ ๑๒โ๎๐ๅํ๎ ํเ "
-
-#: ../memline.c:928
-msgid ""
-",\n"
-"or the file has been damaged."
-msgstr ""
-",\n"
-"เแ๎ ๔เ้๋ แ๓๋๎ ๏๎๘๊๎ไๆๅํ๎."
-
-#: ../memline.c:945
-msgid " has been damaged (page size is smaller than minimum value).\n"
-msgstr " ๏๎๘๊๎ไๆๅํ่้ (๐๎็์ณ๐ ๑๒๎๐ณํ๊่ ์ๅํ๘่้ ์ณํณ์เ๋ํ๎ใ๎ ็ํเ๗ๅํํ).\n"
-
-#: ../memline.c:974
-#, c-format
-msgid "Using swap file \"%s\""
-msgstr "ย่๊๎๐่๑๒๎โ๓บ๒๑ ๔เ้๋ ๎แ์ณํ๓ ซ%sป"
-
-#: ../memline.c:980
-#, c-format
-msgid "Original file \"%s\""
-msgstr "ฯ๎๗เ๒๊๎โ่้ ๔เ้๋ ซ%sป"
-
-#: ../memline.c:995
-msgid "E308: Warning: Original file may have been changed"
-msgstr "E308: วเ๑๒ๅ๐ๅๆๅํํ: ฬ๎ๆ๋่โ๎, ๏๎๗เ๒๊๎โ่้ ๔เ้๋ แ๓๋๎ ็์ณํๅํ๎"
-
-# msgstr "E308: "
-#: ../memline.c:1061
-#, c-format
-msgid "E309: Unable to read block 1 from %s"
-msgstr "E309: อๅ โไเ๋๎๑ ๏๐๎๗่๒เ๒่ แ๋๎๊ 1 ็ %s"
-
-# msgstr "E309: "
-#: ../memline.c:1065
-msgid "???MANY LINES MISSING"
-msgstr "??? มะภสำช มภรภาฮี ะ฿ฤสฒย"
-
-#: ../memline.c:1076
-msgid "???LINE COUNT WRONG"
-msgstr "??? อลฯะภยศหอภ สฒหสฒัา ะ฿ฤสฒย"
-
-#: ../memline.c:1082
-msgid "???EMPTY BLOCK"
-msgstr "??? ฯฮะฮฦอฒษ มหฮส"
-
-#: ../memline.c:1103
-msgid "???LINES MISSING"
-msgstr "??? ฯะฮฯำูลอฒ ะ฿ฤสศ"
-
-#: ../memline.c:1128
-#, c-format
-msgid "E310: Block 1 ID wrong (%s not a .swp file?)"
-msgstr "E310: ฒไๅํ๒่๔ณ๊เ๒๎๐ แ๋๎๊๓ 1 ํๅ๏๐เโ่๋ํ่้ (%s ํๅ บ ๔เ้๋๎์ ๎แ์ณํ๓?)"
-
-# msgstr "E310: "
-#: ../memline.c:1133
-msgid "???BLOCK MISSING"
-msgstr "??? ฯะฮฯำูลอฮ มหฮส"
-
-#: ../memline.c:1147
-msgid "??? from here until ???END lines may be messed up"
-msgstr "??? ็โณไ๑่ ณ ไ๎ `??? สฒอลึ' ๐ไ๊่, ์๎ๆ๋่โ๎, ๑๏๋๓๒เํณ"
-
-#: ../memline.c:1164
-msgid "??? from here until ???END lines may have been inserted/deleted"
-msgstr "??? ็โณไ๑่ ณ ไ๎ `??? สฒอลึ' ๐ไ๊่, ์๎ๆ๋่โ๎, แ๓๋่ ไ๎ไเํณ/็ํ่๙ๅํณ"
-
-#: ../memline.c:1181
-msgid "???END"
-msgstr "??? สฒอลึ"
-
-#: ../memline.c:1238
-msgid "E311: Recovery Interrupted"
-msgstr "E311: ยณไํ๎โ๋ๅํํ ๏ๅ๐ๅ๐โเํ๎"
-
-#: ../memline.c:1243
-msgid ""
-"E312: Errors detected while recovering; look for lines starting with ???"
-msgstr ""
-"E312: ฯณไ ๗เ๑ โณไํ๎โ๋ๅํํ ็ํเ้ไๅํ๎ ๏๎์่๋๊่. ฯๅ๐ๅใ๋ํ๒ๅ ๐ไ๊่, ๙๎ "
-"๏๎๗่ํเ๒๑ ็ ???"
-
-#: ../memline.c:1245
-msgid "See \":help E312\" for more information."
-msgstr "ฤ่โ. ซ:help E312ป ไ๋ ๓๒๎๗ํๅํํ."
-
-#: ../memline.c:1249
-msgid "Recovery completed. You should check if everything is OK."
-msgstr "ยณไํ๎โ๋ๅํํ ็เ๊ณํ๗ๅํ๎, ๏ๅ๐ๅโณ๐๒ๅ ๗่ โ๑ๅ ใเ๐เ็ไ."
-
-#: ../memline.c:1251
-msgid ""
-"\n"
-"(You might want to write out this file under another name\n"
-msgstr ""
-"\n"
-"(ฬ๎ๆ๋่โ๎, ๏๎๒๐ณแํ๎ ็เ๏่๑เ๒่ ๖ๅ้ ๔เ้๋ ๏ณไ ณํ๘๎ ํเ็โ๎\n"
-
-#: ../memline.c:1252
-msgid "and run diff with the original file to check for changes)"
-msgstr "ณ ็เ๏๓๑๒่๒่ diff ็ ๎๐่ใณํเ๋๎์ ๙๎แ ๏ๅ๐ๅโณ๐่๒่ ็์ณํ่)"
-
-#: ../memline.c:1254
-msgid "Recovery completed. Buffer contents equals file contents."
-msgstr "ยณไํ๎โ๋ๅํํ ็เ๊ณํ๗ๅํ๎. ย์ณ๑๒ แ๓๔ๅ๐เ ๑๏ณโ๏เไเบ ็ณ โ์ณ๑๒๎์ ๔เ้๋๓."
-
-#: ../memline.c:1255
-msgid ""
-"\n"
-"You may want to delete the .swp file now.\n"
-"\n"
-msgstr ""
-"\n"
-"ฬ๎ๆ๋่โ๎, ๒ๅ๏ๅ๐ โ่ ๕๎๗ๅ๒ๅ ็ํ่๙่๒่ ๔เ้๋ ๎แ์ณํ๓ .swp.\n"
-"\n"
-
-#. use msg() to start the scrolling properly
-#: ../memline.c:1327
-msgid "Swap files found:"
-msgstr "วํเ้ไๅํ๎ ๔เ้๋่ ๎แ์ณํ๓:"
-
-#: ../memline.c:1446
-msgid " In current directory:\n"
-msgstr " ย ๏๎๒๎๗ํ๎์๓ ๊เ๒เ๋๎็ณ:\n"
-
-#: ../memline.c:1448
-msgid " Using specified name:\n"
-msgstr " ย่๊๎๐่๑๒๎โ๓๗่ โ๊เ็เํ๓ ํเ็โ๓:\n"
-
-#: ../memline.c:1450
-msgid " In directory "
-msgstr " ำ ๊เ๒เ๋๎็ณ "
-
-#: ../memline.c:1465
-msgid " -- none --\n"
-msgstr " -- ๆ๎ไํ๎ใ๎ --\n"
-
-#: ../memline.c:1527
-msgid " owned by: "
-msgstr " โ๋เ๑ํ่๊: "
-
-#: ../memline.c:1529
-msgid " dated: "
-msgstr " ไเ๒เ: "
-
-#: ../memline.c:1532 ../memline.c:3231
-msgid " dated: "
-msgstr " ไเ๒เ: "
-
-#: ../memline.c:1548
-msgid " [from Vim version 3.0]"
-msgstr " [โณไ Vim 3.0]"
-
-#: ../memline.c:1550
-msgid " [does not look like a Vim swap file]"
-msgstr " [ํๅ ๑๕๎ๆๅ ํเ ๔เ้๋ ๎แ์ณํ๓]"
-
-#: ../memline.c:1552
-msgid " file name: "
-msgstr " ํเ็โเ ๔เ้๋๓: "
-
-#: ../memline.c:1558
-msgid ""
-"\n"
-" modified: "
-msgstr ""
-"\n"
-" ็์ณํๅํ๎: "
-
-#: ../memline.c:1559
-msgid "YES"
-msgstr "าภส"
-
-#: ../memline.c:1559
-msgid "no"
-msgstr "ํณ"
-
-#: ../memline.c:1562
-msgid ""
-"\n"
-" user name: "
-msgstr ""
-"\n"
-" ๊๎๐่๑๒๓โเ๗: "
-
-#: ../memline.c:1568
-msgid " host name: "
-msgstr " ํเ็โเ โ๓็๋เ: "
-
-#: ../memline.c:1570
-msgid ""
-"\n"
-" host name: "
-msgstr ""
-"\n"
-" ํเ็โเ โ๓็๋เ: "
-
-#: ../memline.c:1575
-msgid ""
-"\n"
-" process ID: "
-msgstr ""
-"\n"
-" ID ๏๐๎๖ๅ๑๓: "
-
-#: ../memline.c:1579
-msgid " (still running)"
-msgstr " (โ่๊๎ํ๓บ๒๑)"
-
-#: ../memline.c:1586
-msgid ""
-"\n"
-" [not usable on this computer]"
-msgstr ""
-"\n"
-" [ํๅ๏๐่ไเ๒ํ่้ ํเ ๖๎์๓ ๊๎์๏'๒ๅ๐ณ]"
-
-#: ../memline.c:1590
-msgid " [cannot be read]"
-msgstr " [ํๅ ์๎ๆํเ ๏๐๎๗่๒เ๒่]"
-
-#: ../memline.c:1593
-msgid " [cannot be opened]"
-msgstr " [ํๅ ์๎ๆํเ โณไ๊๐่๒่]"
-
-#: ../memline.c:1698
-msgid "E313: Cannot preserve, there is no swap file"
-msgstr "E313: อๅ โไเ๋๎๑ ็เใ๎๒๎โ่๒่, ํๅ์เบ ๔เ้๋๓ ๎แ์ณํ๓"
-
-# msgstr "E313: "
-#: ../memline.c:1747
-msgid "File preserved"
-msgstr "ิเ้๋ ็แๅ๐ๅๆๅํ๎"
-
-#: ../memline.c:1749
-msgid "E314: Preserve failed"
-msgstr "E314: วแๅ๐ๅๆๅํํ ํๅ โไเ๋๎๑"
-
-# msgstr "E314: "
-#: ../memline.c:1819
-#, c-format
-msgid "E315: ml_get: invalid lnum: %<PRId64>"
-msgstr "E315: ml_get: ํๅ๏๐เโ่๋ํ่้ lnum: %<PRId64>"
-
-# msgstr "E315: "
-#: ../memline.c:1851
-#, c-format
-msgid "E316: ml_get: cannot find line %<PRId64>"
-msgstr "E316: ml_get: ํๅ ็ํเ้๘๎โ ๐ไ๎๊ %<PRId64>"
-
-# msgstr "E316: "
-#: ../memline.c:2236
-msgid "E317: pointer block id wrong 3"
-msgstr "E317: ย๊เ็ณโํ่๊ แ๋๎๊๓ ๏๎์่๋๊๎โ่้ 3"
-
-# msgstr "E317: "
-#: ../memline.c:2311
-msgid "stack_idx should be 0"
-msgstr "stack_idx ์เบ แ๓๒่ ๐ณโํ่์ 0"
-
-#: ../memline.c:2369
-msgid "E318: Updated too many blocks?"
-msgstr "E318: ฯ๎ํ๎โ๋ๅํ๎ ็เแเใเ๒๎ แ๋๎๊ณโ?"
-
-#: ../memline.c:2511
-msgid "E317: pointer block id wrong 4"
-msgstr "E317: ย๊เ็ณโํ่๊ แ๋๎๊๓ ๏๎์่๋๊๎โ่้ 4"
-
-#: ../memline.c:2536
-msgid "deleted block 1?"
-msgstr "แ๋๎๊ 1 ็ํ่๙ๅํ๎?"
-
-#: ../memline.c:2707
-#, c-format
-msgid "E320: Cannot find line %<PRId64>"
-msgstr "E320: อๅ โไเ๋๎๑ ็ํเ้๒่ ๐ไ๎๊ %<PRId64>"
-
-#: ../memline.c:2916
-msgid "E317: pointer block id wrong"
-msgstr "E317: ย๊เ็ณโํ่๊ แ๋๎๊๓ ๏๎์่๋๊๎โ่้"
-
-# msgstr "E317: "
-#: ../memline.c:2930
-msgid "pe_line_count is zero"
-msgstr "pe_line_count ไ๎๐ณโํบ 0"
-
-#: ../memline.c:2955
-#, c-format
-msgid "E322: line number out of range: %<PRId64> past the end"
-msgstr "E322: อ๎์ๅ๐ ๐ไ๊เ โ่้๘๎โ ็เ ์ๅๆณ: %<PRId64> ็เ ๊ณํ๖ๅ์"
-
-# msgstr "E322: "
-#: ../memline.c:2959
-#, c-format
-msgid "E323: line count wrong in block %<PRId64>"
-msgstr "E323: สณ๋๊ณ๑๒ ๐ไ๊ณโ ๓ แ๋๎๖ณ %<PRId64>"
-
-# msgstr "E323: "
-#: ../memline.c:2999
-msgid "Stack size increases"
-msgstr "ะ๎็์ณ๐ ๑๒ๅ๊๓ ็แณ๋๘๓บ๒๑"
-
-#: ../memline.c:3038
-msgid "E317: pointer block id wrong 2"
-msgstr "E317: ย๊เ็ณโํ่๊ แ๋๎๊๓ ๏๎์่๋๊๎โ่้ 2"
-
-#: ../memline.c:3070
-#, c-format
-msgid "E773: Symlink loop for \"%s\""
-msgstr "E773: ึ่๊๋ณ๗ํณ ๑่์โ๎๋ํณ ๏๎๑่๋เํํ ซ%sป"
-
-# msgstr "E317: "
-#: ../memline.c:3221
-msgid "E325: ATTENTION"
-msgstr "E325: ำยภรภ"
-
-#: ../memline.c:3222
-msgid ""
-"\n"
-"Found a swap file by the name \""
-msgstr ""
-"\n"
-"วํเ้ไๅํ๎ ๔เ้๋ ๎แ์ณํ๓ ็ ํเ็โ๎ \""
-
-#: ../memline.c:3226
-msgid "While opening file \""
-msgstr "ฯ๐่ โณไ๊๐่๒๒ณ ๔เ้๋๓ \""
-
-#: ../memline.c:3239
-msgid " NEWER than swap file!\n"
-msgstr " อฮยฒุศษ ็เ ๔เ้๋ ๎แ์ณํ๓!\n"
-
-#: ../memline.c:3244
-msgid ""
-"\n"
-"(1) Another program may be editing the same file. If this is the case,\n"
-" be careful not to end up with two different instances of the same\n"
-" file when making changes."
-msgstr ""
-"\n"
-"(1) ฬ๎ๆ๋่โ๎, ณํ๘เ ๏๐๎ใ๐เ์เ โๆๅ ๐ๅไเใ๓บ ๖ๅ้ ๑เ์่้ ๔เ้๋. ฿๊๙๎ ๖ๅ ๒เ๊,\n"
-" แ๓ไ๒ๅ ๎แๅ๐ๅๆํณ, ๙๎แ ํๅ ็เ๋่๘่๋่๑ ไโเ ๐ณ็ํณ ๅ๊็ๅ์๏๋๐่\n"
-" ๎ไํ๎ใ๎ ้ ๒๎ใ๎ ๑เ์๎ใ๎ ๔เ้๋๓ ๏ณ๑๋ ็์ณํ."
-
-#: ../memline.c:3245
-msgid " Quit, or continue with caution.\n"
-msgstr " ย่้ไณ๒ เแ๎ ๏๐๎ไ๎โๆ๓้๒ๅ ๎แๅ๐ๅๆํ๎.\n"
-
-#: ../memline.c:3246
-msgid "(2) An edit session for this file crashed.\n"
-msgstr "(2) ัๅเํ๑ ๐ๅไเใ๓โเํํ ๖๎ใ๎ ๔เ้๋๓ ็เ็ํเโ ๊๐เ๕๓.\n"
-
-#: ../memline.c:3247
-msgid " If this is the case, use \":recover\" or \"vim -r "
-msgstr " ฿๊๙๎ ๖ๅ ๑๏๐เโไณ ๒๐เ๏่๋๎๑, ๑๏๐๎แ๓้๒ๅ ซ:recoverป เแ๎ ซvim -r "
-
-#: ../memline.c:3249
-msgid ""
-"\"\n"
-" to recover the changes (see \":help recovery\").\n"
-msgstr ""
-"ป\n"
-" ๙๎แ โณไํ๎โ่๒่ ็์ณํ่ (ไ่โ. ซ:help recoveryป).\n"
-
-#: ../memline.c:3250
-msgid " If you did this already, delete the swap file \""
-msgstr " ฿๊๙๎ โ่ โๆๅ ๖ๅ ็๐๎แ่๋่, ็ํ่๙ณ๒ ๔เ้๋ ๎แ์ณํ๓ ซ"
-
-#: ../memline.c:3252
-msgid ""
-"\"\n"
-" to avoid this message.\n"
-msgstr ""
-"ป,\n"
-" ๙๎แ ๏๎็แ๓๒่๑ ๖๎ใ๎ ๏๎โณไ๎์๋ๅํํ.\n"
-"\n"
-
-#: ../memline.c:3450 ../memline.c:3452
-msgid "Swap file \""
-msgstr "ิเ้๋ ๎แ์ณํ๓ ซ"
-
-#: ../memline.c:3451 ../memline.c:3455
-msgid "\" already exists!"
-msgstr "ป โๆๅ ณ๑ํ๓บ!"
-
-#: ../memline.c:3457
-msgid "VIM - ATTENTION"
-msgstr "VIM — ำยภรภ"
-
-#: ../memline.c:3459
-msgid "Swap file already exists!"
-msgstr "ิเ้๋ ๎แ์ณํ๓ โๆๅ ณ๑ํ๓บ!"
-
-#: ../memline.c:3464
-msgid ""
-"&Open Read-Only\n"
-"&Edit anyway\n"
-"&Recover\n"
-"&Quit\n"
-"&Abort"
-msgstr ""
-"&O:ยณไ๊๐่๒่ ๋่๘ๅ ไ๋ ๗่๒เํํ\n"
-"&E:ย๑ๅ ๎ไํ๎ ๐ๅไเใ๓โเ๒่\n"
-"&R:ยณไํ๎โ่๒่\n"
-"&Q:ย่้๒่\n"
-"&A:ฯๅ๐ๅ๐โเ๒่"
-
-#: ../memline.c:3467
-msgid ""
-"&Open Read-Only\n"
-"&Edit anyway\n"
-"&Recover\n"
-"&Delete it\n"
-"&Quit\n"
-"&Abort"
-msgstr ""
-"&O:ยณไ๊๐่๒่ ๋่๘ๅ ไ๋ ๗่๒เํํ\n"
-"&E:ำ๑ๅ ๎ไํ๎ ๐ๅไเใ๓โเ๒่\n"
-"&R:ยณไํ๎โ่๒่\n"
-"&D:วํ่๙่๒่ ้๎ใ๎\n"
-"&Q:ย่้๒่\n"
-"&A:ฯๅ๐ๅ๐โเ๒่"
-
-#.
-#. * Change the ".swp" extension to find another file that can be used.
-#. * First decrement the last char: ".swo", ".swn", etc.
-#. * If that still isn't enough decrement the last but one char: ".svz"
-#. * Can happen when editing many "No Name" buffers.
-#.
-#. ".s?a"
-#. ".saa": tried enough, give up
-#: ../memline.c:3528
-msgid "E326: Too many swap files found"
-msgstr "E326: วํเ้ไๅํ๎ ็เแเใเ๒๎ ๔เ้๋ณโ ๎แ์ณํ๓"
-
-# msgstr "E341: "
-#: ../memory.c:227
-#, c-format
-msgid "E342: Out of memory! (allocating %<PRIu64> bytes)"
-msgstr "E342: วเแ๐เ๊๋๎ ๏เ์'๒ณ! (๏๎๒๐ณแํ๎ แ๓๋๎ %<PRIu64> แเ้๒ณโ)"
-
-# msgstr "E326: "
-#: ../menu.c:62
-msgid "E327: Part of menu-item path is not sub-menu"
-msgstr "E327: ืเ๑๒่ํเ ๘๋๕๓ ไ๎ ๅ๋ๅ์ๅํ๒เ ์ๅํ ํๅ บ ๏ณไ์ๅํ"
-
-# msgstr "E327: "
-#: ../menu.c:63
-msgid "E328: Menu only exists in another mode"
-msgstr "E328: ฬๅํ ์๎ๆๅ แ๓๒่ ๒ณ๋๊่ โ ณํ๘๎์๓ ๐ๅๆ่์ณ"
-
-# msgstr "E328: "
-#: ../menu.c:64
-#, c-format
-msgid "E329: No menu \"%s\""
-msgstr "E329: อๅ์เบ ์ๅํ ซ%sป"
-
-#. Only a mnemonic or accelerator is not valid.
-#: ../menu.c:329
-msgid "E792: Empty menu name"
-msgstr "E792: ฯ๎๐๎ๆํ ํเ็โเ ์ๅํ"
-
-# msgstr "E329: "
-#: ../menu.c:340
-msgid "E330: Menu path must not lead to a sub-menu"
-msgstr "E330: ุ๋๕ ไ๎ ์ๅํ ํๅ ๏๎โ่ํๅํ โๅ๑๒่ ไ๎ ๏ณไ์ๅํ"
-
-# msgstr "E330: "
-#: ../menu.c:365
-msgid "E331: Must not add menu items directly to menu bar"
-msgstr "E331: อๅ ์๎ๆํเ ไ๎ไเโเ๒่ ๅ๋ๅ์ๅํ๒่ ์ๅํ ๏๐๎๑๒๎ ไ๎ โๅ๐๕ํ๎ใ๎ ์ๅํ"
-
-# msgstr "E331: "
-#: ../menu.c:370
-msgid "E332: Separator cannot be part of a menu path"
-msgstr "E332: ะ๎็ไณ๋ํ่๊ ํๅ ์๎ๆๅ แ๓๒่ ๗เ๑๒่ํ๎ ๘๋๕๓ ์ๅํ"
-
-# msgstr "E332: "
-#. Now we have found the matching menu, and we list the mappings
-#. Highlight title
-#: ../menu.c:762
-msgid ""
-"\n"
-"--- Menus ---"
-msgstr ""
-"\n"
-"--- ฬๅํ ---"
-
-#: ../menu.c:1313
-msgid "E333: Menu path must lead to a menu item"
-msgstr "E333: ุ๋๕ ๏๎โ่ํๅํ โๅ๑๒่ ไ๎ ๅ๋ๅ์ๅํ๒เ ์ๅํ"
-
-# msgstr "E333: "
-#: ../menu.c:1330
-#, c-format
-msgid "E334: Menu not found: %s"
-msgstr "E334: ฬๅํ ํๅ ็ํเ้ไๅํ๎: %s"
-
-# msgstr "E334: "
-#: ../menu.c:1396
-#, c-format
-msgid "E335: Menu not defined for %s mode"
-msgstr "E335: ฤ๋ ๐ๅๆ่์๓ %s ์ๅํ ํๅ โ่็ํเ๗ๅํ๎"
-
-# msgstr "E335: "
-#: ../menu.c:1426
-msgid "E336: Menu path must lead to a sub-menu"
-msgstr "E336: ุ๋๕ ๏๎โ่ํๅํ โๅ๑๒่ ไ๎ ๏ณไ์ๅํ"
-
-# msgstr "E336: "
-#: ../menu.c:1447
-msgid "E337: Menu not found - check menu names"
-msgstr "E337: ฬๅํ ํๅ ็ํเ้ไๅํ๎ — ๏ๅ๐ๅโณ๐๒ๅ ํเ็โ๓"
-
-# msgstr "E337: "
-#: ../message.c:423
-#, c-format
-msgid "Error detected while processing %s:"
-msgstr "ย่โ๋ๅํ๎ ๏๎์่๋๊๓ ๏ณไ ๗เ๑ โ่๊๎ํเํํ %s:"
-
-#: ../message.c:445
-#, c-format
-msgid "line %4ld:"
-msgstr "๐ไ๎๊ %4ld:"
-
-#: ../message.c:617
-#, c-format
-msgid "E354: Invalid register name: '%s'"
-msgstr "E354: อๅ๏๐เโ่๋ํเ ํเ็โเ ๐ๅใณ๑๒๐๓: '%s'"
-
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr "ำ๊๐เฟํณ็เ๖ณ: ภํเ๒๎๋ณ้ ัเ๕ํณ๊ <sakhnik@gmail.com>"
-
-#: ../message.c:986
-msgid "Interrupt: "
-msgstr "ฯๅ๐ๅ๐โเํ๎: "
-
-#: ../message.c:988
-msgid "Press ENTER or type command to continue"
-msgstr "อเ๒่๑ํณ๒ ENTER เแ๎ โโๅไณ๒ ๊๎์เํไ๓ ไ๋ ๏๐๎ไ๎โๆๅํํ"
-
-#: ../message.c:1843
-#, c-format
-msgid "%s line %<PRId64>"
-msgstr "%s ๐ไ๎๊ %<PRId64>"
-
-#: ../message.c:2392
-msgid "-- More --"
-msgstr "-- ูๅ --"
-
-#: ../message.c:2398
-msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "
-msgstr " ฯะฮมฒห/d/j: โํ่็ ํเ ๅ๊๐เํ/๑๒๎๐ณํ๊๓/๐ไ๎๊, b/u/k: โใ๎๐๓, q: โ่้๒่ "
-
-#: ../message.c:3021 ../message.c:3031
-msgid "Question"
-msgstr "วเ๏่๒เํํ"
-
-#: ../message.c:3023
-msgid ""
-"&Yes\n"
-"&No"
-msgstr ""
-"&Y:าเ๊\n"
-"&N:อณ"
-
-#: ../message.c:3033
-msgid ""
-"&Yes\n"
-"&No\n"
-"&Cancel"
-msgstr ""
-"&Y:าเ๊\n"
-"&N:อณ\n"
-"&C:ั๊เ๑๓โเ๒่"
-
-#: ../message.c:3045
-msgid ""
-"&Yes\n"
-"&No\n"
-"Save &All\n"
-"&Discard All\n"
-"&Cancel"
-msgstr ""
-"&Y:าเ๊\n"
-"&N:อณ\n"
-"&A:ำ๑ณ\n"
-"&D:ฦ๎ไํ๎ใ๎\n"
-"&C:ั๊เ๑๓โเ๒่"
-
-#: ../message.c:3058
-msgid "E766: Insufficient arguments for printf()"
-msgstr "E766: อๅไ๎๑๒เ๒ํ๎ เ๐ใ๓์ๅํ๒ณโ ไ๋ printf()"
-
-#: ../message.c:3119
-msgid "E807: Expected Float argument for printf()"
-msgstr "E807: ฮ๗ณ๊๓บ๒๑ เ๐ใ๓์ๅํ๒ Float ไ๋ printf()"
-
-#: ../message.c:3873
-msgid "E767: Too many arguments to printf()"
-msgstr "E767: วเแเใเ๒๎ เ๐ใ๓์ๅํ๒ณโ ไ๋ printf()"
-
-# msgstr "E338: "
-#: ../misc1.c:2256
-msgid "W10: Warning: Changing a readonly file"
-msgstr "W10: วเ๑๒ๅ๐ๅๆๅํํ: ว์ณํบ๒๑ ๔เ้๋ ๏๐่็ํเ๗ๅํ่้ ๋่๘ๅ ไ๋ ๗่๒เํํ"
-
-#: ../misc1.c:2537
-msgid "Type number and <Enter> or click with mouse (empty cancels): "
-msgstr "อเแๅ๐ณ๒ ๗่๑๋๎ ้ <Enter> ๗่ ๊๋เ๖ํณ๒ ์่๘๊๎ (๏๎๐๎ๆํบ ๑๊เ๑๎โ๓บ): "
-
-#: ../misc1.c:2539
-msgid "Type number and <Enter> (empty cancels): "
-msgstr "อเแๅ๐ณ๒ ๗่๑๋๎ ้ <Enter> (๏๎๐๎ๆํบ ๑๊เ๑๎โ๓บ): "
-
-#: ../misc1.c:2585
-msgid "1 more line"
-msgstr "ไ๎ไเํ๎ ๎ไ่ํ ๐ไ๎๊"
-
-#: ../misc1.c:2588
-msgid "1 line less"
-msgstr "็ํ่๙ๅํ๎ ๎ไ่ํ ๐ไ๎๊"
-
-#: ../misc1.c:2593
-#, c-format
-msgid "%<PRId64> more lines"
-msgstr "ไ๎ไเํ๎ ๐ไ๊ณโ: %<PRId64>"
-
-#: ../misc1.c:2596
-#, c-format
-msgid "%<PRId64> fewer lines"
-msgstr "็ํ่๙ๅํ๎ ๐ไ๊ณโ: %<PRId64>"
-
-#: ../misc1.c:2599
-msgid " (Interrupted)"
-msgstr " (ฯๅ๐ๅ๐โเํ๎)"
-
-#: ../misc1.c:2635
-msgid "Beep!"
-msgstr "ฤ็ๅํ!"
-
-# msgstr "E342: "
-#: ../misc2.c:738
-#, c-format
-msgid "Calling shell to execute: \"%s\""
-msgstr "ย่๊๋่๊เบ๒๑ ๎แ๎๋๎ํ๊เ ๙๎แ โ่๊๎ํเ๒่: ซ%sป"
-
-# msgstr "E348: "
-#: ../normal.c:183
-msgid "E349: No identifier under cursor"
-msgstr "E349: อๅ์เบ ณไๅํ๒่๔ณ๊เ๒๎๐เ ํเไ ๊๓๐๑๎๐๎์"
-
-#: ../normal.c:1866
-msgid "E774: 'operatorfunc' is empty"
-msgstr "E774: 'operatorfunc' ๏๎๐๎ๆํ"
-
-#: ../normal.c:2637
-msgid "Warning: terminal cannot highlight"
-msgstr "วเ๑๒ๅ๐ๅๆๅํํ: าๅ๐์ณํเ๋ ํๅ ๏ณไ๒๐่์๓บ ๊๎๋๎๐่"
-
-#: ../normal.c:2807
-msgid "E348: No string under cursor"
-msgstr "E348: อๅ์เบ ๐ไ๊เ ํเ ๊๓๐๑๎๐ณ"
-
-#: ../normal.c:3937
-msgid "E352: Cannot erase folds with current 'foldmethod'"
-msgstr "E352: อๅ โไเ๋๎๑ ็ํ่๙่๒่ ็ใ๎๐๒๊่ ๏๎๒๎๗ํ่์ ์ๅ๒๎ไ๎์ 'foldmethod'"
-
-#: ../normal.c:5897
-msgid "E664: changelist is empty"
-msgstr "E664: ั๏่๑๎๊ ็์ณํ ๏๎๐๎ๆํณ้"
-
-#: ../normal.c:5899
-msgid "E662: At start of changelist"
-msgstr "E662: ฯ๎๗เ๒๎๊ ๑๏่๑๊๓ ็์ณํ"
-
-#: ../normal.c:5901
-msgid "E663: At end of changelist"
-msgstr "E663: สณํๅ๖ ๑๏่๑๊๓ ็์ณํ"
-
-#: ../normal.c:7053
-msgid "Type :quit<Enter> to exit Nvim"
-msgstr "ำโๅไณ๒ :quit<Enter> ๙๎แ โ่้๒่ ็ Vim"
-
-#: ../ops.c:248
-#, c-format
-msgid "1 line %sed 1 time"
-msgstr "ฮไ่ํ ๐ไ๎๊ %s-ํ๎"
-
-#: ../ops.c:250
-#, c-format
-msgid "1 line %sed %d times"
-msgstr "ฮไ่ํ ๐ไ๎๊ %s-ํ๎ %d ๐เ็ณโ"
-
-#: ../ops.c:253
-#, c-format
-msgid "%<PRId64> lines %sed 1 time"
-msgstr "%<PRId64> ๐ไ๊ณโ %s-ํ๎"
-
-#: ../ops.c:256
-#, c-format
-msgid "%<PRId64> lines %sed %d times"
-msgstr "%<PRId64> ๐ไ๊ณโ %s-ํ๎ %d ๐เ็ณโ"
-
-#: ../ops.c:592
-#, c-format
-msgid "%<PRId64> lines to indent... "
-msgstr "วเ๋่๘่๋๎๑ โ่๐ณโํ๒่ %<PRId64> ๐ไ๊ณโ..."
-
-#: ../ops.c:634
-msgid "1 line indented "
-msgstr "ย่๐ณโํํ๎ ๎ไ่ํ ๐ไ๎๊"
-
-#: ../ops.c:636
-#, c-format
-msgid "%<PRId64> lines indented "
-msgstr "ย่๐ณโํํ๎ ๐ไ๊ณโ: %<PRId64>"
-
-#: ../ops.c:938
-msgid "E748: No previously used register"
-msgstr "E748: ะๅใณ๑๒๐่ ๏ๅ๐ๅไ ๖่์ ํๅ โๆ่โเ๋่๑"
-
-#. must display the prompt
-#: ../ops.c:1433
-msgid "cannot yank; delete anyway"
-msgstr "ํๅ โไเ๋๎๑ ็เ๏เ์'๒เ๒่; โ๑ๅ ๎ไํ๎ ็ํ่๙่๒่?"
-
-#: ../ops.c:1929
-msgid "1 line changed"
-msgstr "ฮไ่ํ ๐ไ๎๊ ็์ณํๅํ๎"
-
-#: ../ops.c:1931
-#, c-format
-msgid "%<PRId64> lines changed"
-msgstr "ว์ณํๅํ๎ ๐ไ๊ณโ: %<PRId64>"
-
-#: ../ops.c:2521
-msgid "block of 1 line yanked"
-msgstr "วเ๏เ์'๒เโ แ๋๎๊ ็ ๎ไํ๎ใ๎ ๐ไ๊เ"
-
-#: ../ops.c:2523
-msgid "1 line yanked"
-msgstr "วเ๏เ์'๒เโ ๎ไ่ํ ๐ไ๎๊"
-
-#: ../ops.c:2525
-#, c-format
-msgid "block of %<PRId64> lines yanked"
-msgstr "วเ๏เ์'๒เโ แ๋๎๊ ณ็ %<PRId64> ๐ไ๊ณโ"
-
-#: ../ops.c:2528
-#, c-format
-msgid "%<PRId64> lines yanked"
-msgstr "วเ๏เ์'๒เโ ๐ไ๊ณโ: %<PRId64>"
-
-#: ../ops.c:2710
-#, c-format
-msgid "E353: Nothing in register %s"
-msgstr "E353: ำ ๐ๅใณ๑๒๐ณ %s ํณ๗๎ใ๎ ํๅ์เบ"
-
-# msgstr "E353: "
-#. Highlight title
-#: ../ops.c:3185
-msgid ""
-"\n"
-"--- Registers ---"
-msgstr ""
-"\n"
-"--- ะๅใณ๑๒๐่ ---"
-
-#: ../ops.c:4455
-msgid "Illegal register name"
-msgstr "อๅ๏๐เโ่๋ํเ ํเ็โเ ๐ๅใณ๑๒๐๓"
-
-#: ../ops.c:4533
-msgid ""
-"\n"
-"# Registers:\n"
-msgstr ""
-"\n"
-"# ะๅใณ๑๒๐่:\n"
-
-#: ../ops.c:4575
-#, c-format
-msgid "E574: Unknown register type %d"
-msgstr "E574: อๅโณไ๎์่้ ๒่๏ ๐ๅใณ๑๒๐๓ %d"
-
-#: ../ops.c:5089
-#, c-format
-msgid "%<PRId64> Cols; "
-msgstr "ไ๎โๆ.: %<PRId64>; "
-
-#: ../ops.c:5097
-#, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Bytes"
-msgstr ""
-"ย่แ๐เํ๎ %s%<PRId64> ็ %<PRId64> ๐ไ๊ณโ; %<PRId64> ็ %<PRId64> ๑๋ณโ; "
-"%<PRId64> ็ %<PRId64> แเ้๒ณโ"
-
-#: ../ops.c:5105
-#, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Chars; %<PRId64> of %<PRId64> Bytes"
-msgstr ""
-"ย่แ๐เํ๎ %s%<PRId64> ็ %<PRId64> ๐ไ๊ณโ; %<PRId64> ็ %<PRId64> ๑๋ณโ; "
-"%<PRId64> of %<PRId64> ๑่์โ๎๋ณโ; %<PRId64> ็ %<PRId64> แเ้๒ณโ"
-
-#: ../ops.c:5123
-#, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Byte "
-"%<PRId64> of %<PRId64>"
-msgstr ""
-"ส๎๋๎ํ๊เ %s ็ %s; ๐ไ๎๊ %<PRId64> ็ %<PRId64>; ๑๋๎โ๎ %<PRId64> ็ %<PRId64>; "
-"แเ้๒ %<PRId64> ็ %<PRId64>"
-
-#: ../ops.c:5133
-#, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Char "
-"%<PRId64> of %<PRId64>; Byte %<PRId64> of %<PRId64>"
-msgstr ""
-"ส๎๋๎ํ๊เ %s ็ %s; ๐ไ๎๊ %<PRId64> ็ %<PRId64>; ๑๋๎โ๎ %<PRId64> ็ %<PRId64>; "
-"๑่์โ๎๋ %<PRId64> of %<PRId64>; แเ้๒ %<PRId64> ็ %<PRId64>"
-
-#: ../ops.c:5146
-#, c-format
-msgid "(+%<PRId64> for BOM)"
-msgstr "(+%<PRId64> ไ๋ BOM)"
-
-#: ../option.c:1238
-msgid "%<%f%h%m%=Page %N"
-msgstr "%<%f%h%m%=ั๒๎๐. %N"
-
-#: ../option.c:1574
-msgid "Thanks for flying Vim"
-msgstr "ฤ๊๓บ์๎ ็เ โ่แณ๐ Vim"
-
-#. found a mismatch: skip
-#: ../option.c:2698
-msgid "E518: Unknown option"
-msgstr "E518: อๅโณไ๎์เ ๎๏๖ณ"
-
-#: ../option.c:2709
-msgid "E519: Option not supported"
-msgstr "E519: ฮ๏๖ณ ํๅ ๏ณไ๒๐่์๓บ๒๑"
-
-#: ../option.c:2740
-msgid "E520: Not allowed in a modeline"
-msgstr "E520: อๅ ไ๎็โ๎๋ๅํ๎ ๓ modeline"
-
-#: ../option.c:2815
-msgid "E846: Key code not set"
-msgstr "E846: ส๎ไ ๊๋๗เ ํๅ โ๑๒เํ๎โ๋ๅํ๎"
-
-#: ../option.c:2924
-msgid "E521: Number required after ="
-msgstr "E521: ฯณ๑๋ = ๏๎๒๐ณแํ๎ โ๊เ็เ๒่ ๗่๑๋๎"
-
-#: ../option.c:3226 ../option.c:3864
-msgid "E522: Not found in termcap"
-msgstr "E522: อๅ ็ํเ้ไๅํ๎ ๑ๅ๐ๅไ ์๎ๆ๋่โ๎๑๒ๅ้ ๒ๅ๐์ณํเ๋ณโ"
-
-#: ../option.c:3335
-#, c-format
-msgid "E539: Illegal character <%s>"
-msgstr "E539: อๅไ๎็โ๎๋ๅํ่้ ๑่์โ๎๋ <%s>"
-
-#: ../option.c:3862
-msgid "E529: Cannot set 'term' to empty string"
-msgstr "E529: อๅ โไเ๋๎๑ ๑๏๎๐๎ๆํ่๒่ 'term'"
-
-#: ../option.c:3885
-msgid "E589: 'backupext' and 'patchmode' are equal"
-msgstr "E589: ฮ๏๖ณฟ 'backupext' ณ 'patchmode' ๎ไํเ๊๎โณ"
-
-#: ../option.c:3964
-msgid "E834: Conflicts with value of 'listchars'"
-msgstr "E834: ส๎ํ๔๋ณ๊๒๓บ ณ็ ็ํเ๗ๅํํ์ 'listchars'"
-
-#: ../option.c:3966
-msgid "E835: Conflicts with value of 'fillchars'"
-msgstr "E835: ส๎ํ๔๋ณ๊๒๓บ ณ็ ็ํเ๗ๅํํ์ 'fillchars'"
-
-#: ../option.c:4163
-msgid "E524: Missing colon"
-msgstr "E524: ม๐เ๊๓บ ไโ๎๊๐เ๏๊่"
-
-#: ../option.c:4165
-msgid "E525: Zero length string"
-msgstr "E525: ะไ๎๊ ๏๎๐๎ๆํณ้"
-
-#: ../option.c:4220
-#, c-format
-msgid "E526: Missing number after <%s>"
-msgstr "E526: ฯณ๑๋ <%s> แ๐เ๊๓บ ๗่๑๋เ"
-
-#: ../option.c:4232
-msgid "E527: Missing comma"
-msgstr "E527: ม๐เ๊๓บ ๊๎์่"
-
-#: ../option.c:4239
-msgid "E528: Must specify a ' value"
-msgstr "E528: ฯ๎๒๐ณแํ๎ โ๊เ็เ๒่ ็ํเ๗ๅํํ '"
-
-#: ../option.c:4271
-msgid "E595: contains unprintable or wide character"
-msgstr "E595: ฬณ๑๒่๒ ํๅไ๐๓๊๎โํณ เแ๎ ๐๎็๘่๐ๅํณ ๑่์โ๎๋่"
-
-#: ../option.c:4469
-#, c-format
-msgid "E535: Illegal character after <%c>"
-msgstr "E535: อๅไ๎็โ๎๋ๅํ่้ ๑่์โ๎๋ ๏ณ๑๋ <%c>"
-
-#: ../option.c:4534
-msgid "E536: comma required"
-msgstr "E536: ฯ๎๒๐ณแํเ ๊๎์เ"
-
-#: ../option.c:4543
-#, c-format
-msgid "E537: 'commentstring' must be empty or contain %s"
-msgstr "E537: 'commentstring' ์เบ แ๓๒่ ๏๎๐๎ๆํ๎ ๗่ ์ณ๑๒่๒่ %s"
-
-#: ../option.c:4928
-msgid "E540: Unclosed expression sequence"
-msgstr "E540: ฯ๎๑๋ณไ๎โํณ๑๒ โ่๐เ็ณโ ํๅ ็เโๅ๐๘ๅํ๎"
-
-#: ../option.c:4932
-msgid "E541: too many items"
-msgstr "E541: วเแเใเ๒๎ ๅ๋ๅ์ๅํ๒ณโ"
-
-#: ../option.c:4934
-msgid "E542: unbalanced groups"
-msgstr "E542: ร๐๓๏่ ํๅ ็แเ๋เํ๑๎โเํ๎"
-
-#: ../option.c:5148
-msgid "E590: A preview window already exists"
-msgstr "E590: ยณ๊ํ๎ ๏ๅ๐ๅใ๋ไ๓ โๆๅ ณ๑ํ๓บ"
-
-#: ../option.c:5311
-msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'"
-msgstr ""
-"W17: ฤ๋ เ๐เแ๑๊๎ฟ ์๎โ่ ๏๎๒๐ณแํๅ UTF-8, โ่๊๎ํเ้๒ๅ ':set encoding=utf-8'"
-
-#: ../option.c:5623
-#, c-format
-msgid "E593: Need at least %d lines"
-msgstr "E593: ฯ๎๒๐ณแํ๎ ๙๎ํเ้์ๅํ๘ๅ %d ๐ไ๊ณโ"
-
-#: ../option.c:5631
-#, c-format
-msgid "E594: Need at least %d columns"
-msgstr "E594: ฯ๎๒๐ณแํ๎ ๙๎ํเ้์ๅํ๘ๅ %d ๑๒๎โ๏๖ณโ"
-
-#: ../option.c:6011
-#, c-format
-msgid "E355: Unknown option: %s"
-msgstr "E355: อๅโณไ๎์เ ๎๏๖ณ: %s"
-
-#. There's another character after zeros or the string
-#. * is empty. In both cases, we are trying to set a
-#. * num option using a string.
-#: ../option.c:6037
-#, c-format
-msgid "E521: Number required: &%s = '%s'"
-msgstr "E521: ฯ๎๒๐ณแํ๎ โ๊เ็เ๒่ Number: &%s = '%s'"
-
-# msgstr "E355: "
-#: ../option.c:6149
-msgid ""
-"\n"
-"--- Terminal codes ---"
-msgstr ""
-"\n"
-"--- ส๎ไ่ ๒ๅ๐์ณํเ๋๓ ---"
-
-#: ../option.c:6151
-msgid ""
-"\n"
-"--- Global option values ---"
-msgstr ""
-"\n"
-"--- วํเ๗ๅํํ ็เใเ๋ํ่๕ ๎๏๖ณ้ ---"
-
-#: ../option.c:6153
-msgid ""
-"\n"
-"--- Local option values ---"
-msgstr ""
-"\n"
-"--- วํเ๗ๅํํ ๋๎๊เ๋ํ่๕ ๎๏๖ณ้ ---"
-
-#: ../option.c:6155
-msgid ""
-"\n"
-"--- Options ---"
-msgstr ""
-"\n"
-"--- ฮ๏๖ณฟ ---"
-
-#: ../option.c:6816
-msgid "E356: get_varp ERROR"
-msgstr "E356: ฯ๎์่๋๊เ get_varp"
-
-# msgstr "E356: "
-#: ../option.c:7696
-#, c-format
-msgid "E357: 'langmap': Matching character missing for %s"
-msgstr "E357: 'langmap': ฤ๋ ๑่์โ๎๋๓ %s ํๅ์เบ ๏เ๐่"
-
-# msgstr "E357: "
-#: ../option.c:7715
-#, c-format
-msgid "E358: 'langmap': Extra characters after semicolon: %s"
-msgstr "E358: 'langmap': วเ้โณ ๑่์โ๎๋่ ๏ณ๑๋ `;': %s"
-
-#: ../os/shell.c:194
-msgid ""
-"\n"
-"Cannot execute shell "
-msgstr ""
-"\n"
-"อๅ โไเ๋๎๑ ็เ๏๓๑๒่๒่ ๎แ๎๋๎ํ๊๓"
-
-# msgstr "E362: "
-#: ../os/shell.c:439
-msgid ""
-"\n"
-"shell returned "
-msgstr ""
-"\n"
-"๎แ๎๋๎ํ๊เ ๏๎โๅ๐ํ๓๋เ: "
-
-#: ../os_unix.c:465 ../os_unix.c:471
-msgid ""
-"\n"
-"Could not get security context for "
-msgstr ""
-"\n"
-"อๅ โไเ๋๎๑ ๎๒๐่์เ๒่ ๊๎ํ๒ๅ๊๑๒ แๅ็๏ๅ๊่ ไ๋ "
-
-#: ../os_unix.c:479
-msgid ""
-"\n"
-"Could not set security context for "
-msgstr ""
-"\n"
-"อๅ โไเ๋๎๑ โ๑๒เํ๎โ่๒่ ๊๎ํ๒ๅ๊๑๒ แๅ็๏ๅ๊่ ไ๋ "
-
-#: ../os_unix.c:1558 ../os_unix.c:1647
-#, c-format
-msgid "dlerror = \"%s\""
-msgstr "dlerror = ซ%sป"
-
-# msgstr "E446: "
-#: ../path.c:1449
-#, c-format
-msgid "E447: Can't find file \"%s\" in path"
-msgstr "E447: ิเ้๋ ซ%sป ํๅ ็ํเ้ไๅํ๎ ๓ ๘๋๕๓ ๏๎๘๓๊๓"
-
-# msgstr "E371: "
-#: ../quickfix.c:359
-#, c-format
-msgid "E372: Too many %%%c in format string"
-msgstr "E372: วเแเใเ๒๎ %%%c ๓ ๐ไ๊๓ ๔๎๐์เ๒๓"
-
-# msgstr "E372: "
-#: ../quickfix.c:371
-#, c-format
-msgid "E373: Unexpected %%%c in format string"
-msgstr "E373: อๅ๎๗ณ๊๓โเํ่้ `%%%c' ๓ ๐ไ๊๓ ๔๎๐์เ๒๓"
-
-# msgstr "E373: "
-#: ../quickfix.c:420
-msgid "E374: Missing ] in format string"
-msgstr "E374: ฯ๐๎๏๓๙ๅํ๎ ] ๓ ๐ไ๊๓ ๔๎๐์เ๒๓"
-
-# msgstr "E374: "
-#: ../quickfix.c:431
-#, c-format
-msgid "E375: Unsupported %%%c in format string"
-msgstr "E375: %%%c ๓ ๐ไ๊๓ ๔๎๐์เ๒๓ ํๅ ๏ณไ๒๐่์๓บ๒๑"
-
-# msgstr "E375: "
-#: ../quickfix.c:448
-#, c-format
-msgid "E376: Invalid %%%c in format string prefix"
-msgstr "E376: ฯ๎์่๋๊๎โ่้ `%%%c' ๓ ๏๐ๅ๔ณ๊๑ณ ๐ไ๊๓ ๔๎๐์เ๒๓"
-
-# msgstr "E376: "
-#: ../quickfix.c:454
-#, c-format
-msgid "E377: Invalid %%%c in format string"
-msgstr "E377: ฯ๎์่๋๊๎โ่้ `%%%c' ๓ ๐ไ๊๓ ๔๎๐์เ๒๓"
-
-# msgstr "E377: "
-#. nothing found
-#: ../quickfix.c:477
-msgid "E378: 'errorformat' contains no pattern"
-msgstr "E378: 'errorformat' ํๅ ์ณ๑๒่๒ ็๐เ็๎๊"
-
-# msgstr "E378: "
-#: ../quickfix.c:695
-msgid "E379: Missing or empty directory name"
-msgstr "E379: ฯ๐๎๏๓๙ๅํเ ๗่ ๏๎๐๎ๆํ ํเ็โเ ๊เ๒เ๋๎ใ๓"
-
-#: ../quickfix.c:1305
-msgid "E553: No more items"
-msgstr "E553: อๅ์เบ แณ๋๘ๅ ๅ๋ๅ์ๅํ๒ณโ"
-
-#: ../quickfix.c:1674
-#, c-format
-msgid "(%d of %d)%s%s: "
-msgstr "(%d ็ %d)%s%s: "
-
-#: ../quickfix.c:1676
-msgid " (line deleted)"
-msgstr " (๐ไ๎๊ ็ํ่๙ๅํ๎)"
-
-#: ../quickfix.c:1863
-msgid "E380: At bottom of quickfix stack"
-msgstr "E380: ฤํ๎ ๑๒ๅ๊๓ โ่๏๐เโ๋ๅํ"
-
-#: ../quickfix.c:1869
-msgid "E381: At top of quickfix stack"
-msgstr "E381: ยๅ๐๘่ํเ ๑๒ๅ๊๓ โ่๏๐เโ๋ๅํ"
-
-#: ../quickfix.c:1880
-#, c-format
-msgid "error list %d of %d; %d errors"
-msgstr "๑๏่๑๎๊ ๏๎์่๋๎๊ %d ็ %d; %d ๏๎์่๋๎๊"
-
-#: ../quickfix.c:2427
-msgid "E382: Cannot write, 'buftype' option is set"
-msgstr "E382: อๅ ์๎ๆ๓ ็เ๏่๑เ๒่, โ๊เ็เํเ ๎๏๖ณ 'buftype'"
-
-#: ../quickfix.c:2812
-msgid "E683: File name missing or invalid pattern"
-msgstr "E683: ฯ๐๎๏๓๙ๅํ๎ ํเ็โ๓ ๔เ้๋๓ ๗่ ํๅ๊๎๐ๅ๊๒ํ่้ ๘เแ๋๎ํ"
-
-#: ../quickfix.c:2911
-#, c-format
-msgid "Cannot open file \"%s\""
-msgstr "อๅ โไเ๋๎๑ โณไ๊๐่๒่ ๔เ้๋ ซ%sป"
-
-#: ../quickfix.c:3429
-msgid "E681: Buffer is not loaded"
-msgstr "E681: ม๓๔ๅ๐ ํๅ ็เโเํ๒เๆๅํ๎"
-
-#: ../quickfix.c:3487
-msgid "E777: String or List expected"
-msgstr "E777: ฮ๗ณ๊๓บ๒๑ String ๗่ List"
-
-#: ../regexp.c:359
-#, c-format
-msgid "E369: invalid item in %s%%[]"
-msgstr "E369: อๅ๊๎๐ๅ๊๒ํ่้ ๅ๋ๅ์ๅํ๒ ๓ %s%%[]"
-
-#: ../regexp.c:374
-#, c-format
-msgid "E769: Missing ] after %s["
-msgstr "E769: ม๐เ๊๓บ ] ๏ณ๑๋ %s["
-
-#: ../regexp.c:375
-#, c-format
-msgid "E53: Unmatched %s%%("
-msgstr "E53: อๅ์เบ ๏เ๐่ %s%%("
-
-#: ../regexp.c:376
-#, c-format
-msgid "E54: Unmatched %s("
-msgstr "E54: อๅ์เบ ๏เ๐่ %s("
-
-#: ../regexp.c:377
-#, c-format
-msgid "E55: Unmatched %s)"
-msgstr "E55: อๅ์เบ ๏เ๐่ %s)"
-
-# msgstr "E406: "
-#: ../regexp.c:378
-msgid "E66: \\z( not allowed here"
-msgstr "E66: \\z( ๒๓๒ ํๅ ไ๎็โ๎๋ๅํ๎"
-
-# msgstr "E406: "
-#: ../regexp.c:379
-msgid "E67: \\z1 et al. not allowed here"
-msgstr "E67: \\z1 ๒เ ณํ. ๒๓๒ ํๅ ไ๎็โ๎๋ๅํ๎"
-
-#: ../regexp.c:380
-#, c-format
-msgid "E69: Missing ] after %s%%["
-msgstr "E69: ฯ๐๎๏๓๙ๅํ๎ ] ๏ณ๑๋ %s%%["
-
-#: ../regexp.c:381
-#, c-format
-msgid "E70: Empty %s%%[]"
-msgstr "E70: %s%%[] ๏๎๐๎ๆํณ้"
-
-# msgstr "E382: "
-#: ../regexp.c:1209 ../regexp.c:1224
-msgid "E339: Pattern too long"
-msgstr "E339: ว๐เ็๎๊ ็เํเไ๒๎ ไ๎โใ่้"
-
-#: ../regexp.c:1371
-msgid "E50: Too many \\z("
-msgstr "E50: วเแเใเ๒๎ \\z("
-
-#: ../regexp.c:1378
-#, c-format
-msgid "E51: Too many %s("
-msgstr "E51: วเแเใเ๒๎ %s("
-
-#: ../regexp.c:1427
-msgid "E52: Unmatched \\z("
-msgstr "E52: อๅ์เบ ๏เ๐่ \\z("
-
-#: ../regexp.c:1637
-#, c-format
-msgid "E59: invalid character after %s@"
-msgstr "E59: อๅไ๎็โ๎๋ๅํ่้ ๑่์โ๎๋ ๏ณ๑๋ %s@"
-
-#: ../regexp.c:1672
-#, c-format
-msgid "E60: Too many complex %s{...}s"
-msgstr "E60: วเแเใเ๒๎ ๑๊๋เไํ่๕ %s{...}"
-
-# msgstr "E339: "
-#: ../regexp.c:1687
-#, c-format
-msgid "E61: Nested %s*"
-msgstr "E61: ย๊๋เไๅํณ %s*"
-
-# msgstr "E61: "
-#: ../regexp.c:1690
-#, c-format
-msgid "E62: Nested %s%c"
-msgstr "E62: ย๊๋เไๅํณ %s%c"
-
-#: ../regexp.c:1800
-msgid "E63: invalid use of \\_"
-msgstr "E63: อๅ๊๎๐ๅ๊๒ํ๎ โๆ่๒๎ \\_"
-
-# msgstr "E62: "
-#: ../regexp.c:1850
-#, c-format
-msgid "E64: %s%c follows nothing"
-msgstr "E64: ฯณ๑๋ %s%c ํณ๗๎ใ๎ ํๅ์เบ"
-
-#: ../regexp.c:1902
-msgid "E65: Illegal back reference"
-msgstr "E65: อๅ๊๎๐ๅ๊๒ํๅ ็โ๎๐๎๒ํบ ๏๎๑่๋เํํ"
-
-#: ../regexp.c:1943
-msgid "E68: Invalid character after \\z"
-msgstr "E68: อๅ๏๐เโ่๋ํ่้ ๑่์โ๎๋ ๏ณ๑๋ \\z"
-
-#: ../regexp.c:2049 ../regexp_nfa.c:1296
-#, c-format
-msgid "E678: Invalid character after %s%%[dxouU]"
-msgstr "E678: อๅไ๎็โ๎๋ๅํ่้ ๑่์โ๎๋ ๏ณ๑๋ %s%%[dxouU]"
-
-#: ../regexp.c:2107
-#, c-format
-msgid "E71: Invalid character after %s%%"
-msgstr "E71: อๅไ๎็โ๎๋ๅํ่้ ๑่์โ๎๋ ๏ณ๑๋ %s%%"
-
-# msgstr "E64: "
-#: ../regexp.c:3017
-#, c-format
-msgid "E554: Syntax error in %s{...}"
-msgstr "E554: ั่ํ๒เ๊๑่๗ํเ ๏๎์่๋๊เ โ %s{...}"
-
-#: ../regexp.c:3805
-msgid "External submatches:\n"
-msgstr "ว๎โํณ๘ํณ ๏ณไ-็แณใ่:\n"
-
-#: ../regexp.c:7022
-msgid ""
-"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be "
-"used "
-msgstr ""
-"E864: ๏ณ๑๋ \\%#= ์๎ๆๅ แ๓๒่ ๒ณ๋๊่ 0, 1, or 2. ม๓ไๅ โ่๊๎๐่๑๒เํ๎ เโ๒๎์เ๒่๗ํ่้ "
-"์ๅ๕เํณ็์ "
-
-#: ../regexp_nfa.c:239
-msgid "E865: (NFA) Regexp end encountered prematurely"
-msgstr "E865: (NFA) วเ๐เํ๎ ๒๐เ๏่โ๑ ๊ณํๅ๖ ๐ๅใ๓๋๐ํ๎ใ๎ โ่๐เ็๓"
-
-#: ../regexp_nfa.c:240
-#, c-format
-msgid "E866: (NFA regexp) Misplaced %c"
-msgstr "E866: (NFA regexp) อๅ ํเ ์ณ๑๖ณ %c"
-
-#: ../regexp_nfa.c:242
-#, c-format
-msgid "E877: (NFA regexp) Invalid character class: %<PRId64>"
-msgstr ""
-
-#: ../regexp_nfa.c:1261
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\z%c'"
-msgstr "E867: (NFA) อๅโณไ๎์่้ ๎๏ๅ๐เ๒๎๐ '\\z%c'"
-
-#: ../regexp_nfa.c:1387
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\%%%c'"
-msgstr "E867: (NFA) อๅโณไ๎์่้ ๎๏ๅ๐เ๒๎๐ '\\%%%c'"
-
-#: ../regexp_nfa.c:1802
-#, c-format
-msgid "E869: (NFA) Unknown operator '\\@%c'"
-msgstr "E869: (NFA) อๅโณไ๎์่้ ๎๏ๅ๐เ๒๎๐ '\\@%c'"
-
-#: ../regexp_nfa.c:1831
-msgid "E870: (NFA regexp) Error reading repetition limits"
-msgstr "E870: (NFA regexp) อๅ โไเ๋๎๑ ๏๐๎๗่๒เ๒่ ์ๅๆณ ๏๎โ๒๎๐ๅํํ"
-
-#. Can't have a multi follow a multi.
-#: ../regexp_nfa.c:1895
-msgid "E871: (NFA regexp) Can't have a multi follow a multi !"
-msgstr "E871: (NFA regexp) ฬ๓๋๒่ ํๅ ์๎ๆๅ แ๓๒่ ็เ ์๓๋๒่!"
-
-#. Too many `('
-#: ../regexp_nfa.c:2037
-msgid "E872: (NFA regexp) Too many '('"
-msgstr "E872: (NFA regexp) วเแเใเ๒๎ '('"
-
-#: ../regexp_nfa.c:2042
-msgid "E879: (NFA regexp) Too many \\z("
-msgstr "E879: (NFA regexp) วเแเใเ๒๎ \\z("
-
-#: ../regexp_nfa.c:2066
-msgid "E873: (NFA regexp) proper termination error"
-msgstr "E873: (NFA regexp) ๏๎์่๋๊เ ํเ๋ๅๆํ๎ใ๎ ๏๐่๏่ํๅํํ"
-
-#: ../regexp_nfa.c:2599
-msgid "E874: (NFA) Could not pop the stack !"
-msgstr "E874: (NFA) ั๒ๅ๊ ๏๎๐๎ๆํณ้!"
-
-#: ../regexp_nfa.c:3298
-msgid ""
-"E875: (NFA regexp) (While converting from postfix to NFA), too many states "
-"left on stack"
-msgstr ""
-"E875: (NFA regexp) (ฯณไ ๗เ๑ ๏ๅ๐ๅ๒โ๎๐ๅํํ ็ ๏๎๑๒๔ณ๊๑ ๓ NFA) ็เ๋่๘่๋๎๑ "
-"็เแเใเ๒๎ ๑๒เํณโ ๓ ๑๒ๅ๊๓"
-
-#: ../regexp_nfa.c:3302
-msgid "E876: (NFA regexp) Not enough space to store the whole NFA "
-msgstr "E876: (NFA regexp) อๅไ๎๑๒เ๒ํ๎ ๏เ์’๒ณ, ๙๎แ ็แๅ๐ๅใ๒่ โๅ๑ NFA "
-
-#: ../regexp_nfa.c:4571 ../regexp_nfa.c:4869
-msgid ""
-"Could not open temporary log file for writing, displaying on stderr ... "
-msgstr ""
-"อๅ โไเ๋๎๑ โณไ๊๐่๒่ ๒่์๗เ๑๎โ่้ ๔เ้๋ ๆ๓๐ํเ๋๓ ไ๋ ็เ๏่๑๓, ๏๎๊เ็๓บ๒๑ ํเ "
-"stderr ... "
-
-#: ../regexp_nfa.c:4840
-#, c-format
-msgid "(NFA) COULD NOT OPEN %s !"
-msgstr "(NFA) อล ยฤภหฮั฿ ยฒฤสะศาศ %s!"
-
-#: ../regexp_nfa.c:6049
-msgid "Could not open temporary log file for writing "
-msgstr "อๅ โไเ๋๎๑ โณไ๊๐่๒่ ๒่์๗เ๑๎โ่้ ๔เ้๋ ๆ๓๐ํเ๋๓ ไ๋ ็เ๏่๑๓ "
-
-#: ../screen.c:7435
-msgid " VREPLACE"
-msgstr " ยฒะา วภฬฒอภ"
-
-#: ../screen.c:7437
-msgid " REPLACE"
-msgstr " วภฬฒอภ"
-
-#: ../screen.c:7440
-msgid " REVERSE"
-msgstr " อภยศยฮะฒา"
-
-#: ../screen.c:7441
-msgid " INSERT"
-msgstr " ยัาภยสภ"
-
-#: ../screen.c:7443
-msgid " (insert)"
-msgstr " (โ๑๒เโ๊เ)"
-
-#: ../screen.c:7445
-msgid " (replace)"
-msgstr " (็เ์ณํเ)"
-
-#: ../screen.c:7447
-msgid " (vreplace)"
-msgstr " (โณ๐๒ ็เ์ณํเ)"
-
-#: ../screen.c:7449
-msgid " Hebrew"
-msgstr " ฒโ๐่๒"
-
-#: ../screen.c:7454
-msgid " Arabic"
-msgstr " ภ๐เแ๑๊เ"
-
-#: ../screen.c:7456
-msgid " (lang)"
-msgstr " (์๎โเ)"
-
-#: ../screen.c:7459
-msgid " (paste)"
-msgstr " (๊๋ๅ้)"
-
-#: ../screen.c:7469
-msgid " VISUAL"
-msgstr " ยศมฒะ"
-
-#: ../screen.c:7470
-msgid " VISUAL LINE"
-msgstr " ยศมฒะ ะ฿ฤสฒย"
-
-#: ../screen.c:7471
-msgid " VISUAL BLOCK"
-msgstr " ยศมฒะ มหฮสำ"
-
-#: ../screen.c:7472
-msgid " SELECT"
-msgstr " ยศฤฒหลออ฿"
-
-#: ../screen.c:7473
-msgid " SELECT LINE"
-msgstr " ยศฤฒหลออ฿ ะ฿ฤสฒย"
-
-#: ../screen.c:7474
-msgid " SELECT BLOCK"
-msgstr " ยศฤฒหลออ฿ มหฮสำ"
-
-#: ../screen.c:7486 ../screen.c:7541
-msgid "recording"
-msgstr "้ไๅ ็เ๏่๑"
-
-#: ../search.c:487
-#, c-format
-msgid "E383: Invalid search string: %s"
-msgstr "E383: อๅ๏๐เโ่๋ํ่้ ็๐เ็๎๊ ไ๋ ๏๎๘๓๊๓: %s"
-
-#: ../search.c:832
-#, c-format
-msgid "E384: search hit TOP without match for: %s"
-msgstr "E384: ฯ๎๘๓๊ ไณ้๘๎โ ไ๎ ฯฮืภาสำ แๅ็ ็แณใณโ ็ %s"
-
-#: ../search.c:835
-#, c-format
-msgid "E385: search hit BOTTOM without match for: %s"
-msgstr "E385: ฯ๎๘๓๊ ไณ้๘๎โ ไ๎ สฒอึ฿ แๅ็ ็แณใณโ ็ %s"
-
-#: ../search.c:1200
-msgid "E386: Expected '?' or '/' after ';'"
-msgstr "E386: ฯณ๑๋ `;' ์เบ แ๓๒่ `?' เแ๎ `/'"
-
-# msgstr "E386: "
-#: ../search.c:4085
-msgid " (includes previously listed match)"
-msgstr " (๐เ็๎์ ็ ๏๎๏ๅ๐ๅไํณ์่ ็แณใเ์่)"
-
-#. cursor at status line
-#: ../search.c:4104
-msgid "--- Included files "
-msgstr "--- ย๊๋๗ๅํณ ๔เ้๋่ "
-
-#: ../search.c:4106
-msgid "not found "
-msgstr "ํๅ ็ํเ้ไๅํ๎ "
-
-#: ../search.c:4107
-msgid "in path ---\n"
-msgstr "๓ ๘๋๕๓ ๏๎๘๓๊๓ ---\n"
-
-#: ../search.c:4168
-msgid " (Already listed)"
-msgstr " (ำๆๅ ๓ ๑๏่๑๊๓)"
-
-#: ../search.c:4170
-msgid " NOT FOUND"
-msgstr " อล วอภษฤลอฮ"
-
-#: ../search.c:4211
-#, c-format
-msgid "Scanning included file: %s"
-msgstr "ฯ๎๘๓๊ ๓ โ๊๋๗ๅํ๎์๓ ๔เ้๋ณ: %s"
-
-#: ../search.c:4216
-#, c-format
-msgid "Searching included file %s"
-msgstr "ุ๓๊เบ๒๑ ๓ โ๊๋๗ๅํ๎์๓ ๔เ้๋ณ %s"
-
-#: ../search.c:4405
-msgid "E387: Match is on current line"
-msgstr "E387: วแณใ ๓ ๏๎๒๎๗ํ๎์๓ ๐ไ๊๓"
-
-#: ../search.c:4517
-msgid "All included files were found"
-msgstr "ม๓๋่ ็ํเ้ไๅํณ โ๑ณ โ๊๋๗ๅํณ ๔เ้๋่"
-
-#: ../search.c:4519
-msgid "No included files"
-msgstr "ฦ๎ไํ๎ใ๎ โ๊๋๗ๅํ๎ใ๎ ๔เ้๋๓"
-
-#: ../search.c:4527
-msgid "E388: Couldn't find definition"
-msgstr "E388: ย่็ํเ๗ๅํํ ํๅ ็ํเ้ไๅํ๎"
-
-#: ../search.c:4529
-msgid "E389: Couldn't find pattern"
-msgstr "E389: ว๐เ็๎๊ ํๅ ็ํเ้ไๅํ๎"
-
-#: ../search.c:4668
-msgid "Substitute "
-msgstr "วเ์ณํเ "
-
-#: ../search.c:4681
-#, c-format
-msgid ""
-"\n"
-"# Last %sSearch Pattern:\n"
-"~"
-msgstr ""
-"\n"
-"# ฮ๑๒. %sว๐เ็๎๊ ๏๎๘๓๊๓:\n"
-"~"
-
-#: ../spell.c:951
-msgid "E759: Format error in spell file"
-msgstr "E759: ฯ๎์่๋๊เ ๔๎๐์เ๒๓ ๓ ๔เ้๋ณ ๎๐๔๎ใ๐เ๔ณฟ"
-
-# msgstr "E364: "
-#: ../spell.c:952
-msgid "E758: Truncated spell file"
-msgstr "E758: ฮแณ๐โเํ่้ ๔เ้๋ ๎๐๔๎ใ๐เ๔ณฟ"
-
-#: ../spell.c:953
-#, c-format
-msgid "Trailing text in %s line %d: %s"
-msgstr "วเ้โ่้ ๒ๅ๊๑๒ ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:954
-#, c-format
-msgid "Affix name too long in %s line %d: %s"
-msgstr "อเ็โเ เ๔ณ๊๑๓ ็เโๅ๋่๊เ ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-# msgstr "E430: "
-#: ../spell.c:955
-msgid "E761: Format error in affix file FOL, LOW or UPP"
-msgstr "E761: ฯ๎์่๋๊เ ๔๎๐์เ๒๓ ๓ ๔เ้๋ณ เ๔ณ๊๑ณโ FOL, LOW ๗่ UPP"
-
-#: ../spell.c:957
-msgid "E762: Character in FOL, LOW or UPP is out of range"
-msgstr "E762: ั่์โ๎๋ ๓ FOL, LOW ๗่ UPP ๏๎็เ ์ๅๆเ์่"
-
-#: ../spell.c:958
-msgid "Compressing word tree..."
-msgstr "ั๒่๑๊๓บ๒๑ ไๅ๐ๅโ๎ ๑๋ณโ..."
-
-#: ../spell.c:1951
-msgid "E756: Spell checking is not enabled"
-msgstr "E756: ฯๅ๐ๅโณ๐๊เ ๎๐๔๎ใ๐เ๔ณฟ ํๅ ไ๎็โ๎๋ๅํเ"
-
-#: ../spell.c:2249
-#, c-format
-msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
-msgstr ""
-"วเ๑๒ๅ๐ๅๆๅํํ: อๅ โไเ๋๎๑ ็ํเ้๒่ ๑๏่๑๎๊ ๑๋ณโ ซ%s.%s.splป ๗่ ซ%s.ascii.splป"
-
-#: ../spell.c:2473
-#, c-format
-msgid "Reading spell file \"%s\""
-msgstr "ื่๒เบ๒๑ ๔เ้๋ ๎๐๔๎ใ๐เ๔ณฟ ซ%sป"
-
-#: ../spell.c:2496
-msgid "E757: This does not look like a spell file"
-msgstr "E757: อๅ ๑๕๎ๆๅ ํเ ๔เ้๋ ๎๐๔๎ใ๐เ๔ณฟ"
-
-#: ../spell.c:2501
-msgid "E771: Old spell file, needs to be updated"
-msgstr "E771: ิเ้๋ ๎๐๔๎ใ๐เ๔ณฟ ๑๒เ๐่้, ๒๐ๅแเ ๏๎ํ๎โ่๒่"
-
-#: ../spell.c:2504
-msgid "E772: Spell file is for newer version of Vim"
-msgstr "E772: ิเ้๋ ๎๐๔๎ใ๐เ๔ณฟ ๏๐่็ํเ๗ๅํ่้ ไ๋ แณ๋๘ ํ๎โ๎ฟ โๅ๐๑ณฟ Vim"
-
-#: ../spell.c:2602
-msgid "E770: Unsupported section in spell file"
-msgstr "E770: อๅไ๎็โ๎๋ๅํเ ๑ๅ๊๖ณ ๓ ๔เ้๋ณ ๎๐๔๎ใ๐เ๔ณฟ"
-
-#: ../spell.c:3762
-#, c-format
-msgid "Warning: region %s not supported"
-msgstr "วเ๑๒ๅ๐ๅๆๅํํ: ๐ๅใณ๎ํ %s ํๅ ๏ณไ๒๐่์๓บ๒๑"
-
-#: ../spell.c:4550
-#, c-format
-msgid "Reading affix file %s ..."
-msgstr "ื่๒เบ๒๑ ๔เ้๋ เ๔ณ๊๑ณโ %s ..."
-
-#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
-#, c-format
-msgid "Conversion failure for word in %s line %d: %s"
-msgstr "ฯ๎์่๋๊เ ๏ๅ๐ๅ๒โ๎๐ๅํํ ๑๋๎โเ ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:4630 ../spell.c:6170
-#, c-format
-msgid "Conversion in %s not supported: from %s to %s"
-msgstr "ฯๅ๐ๅ๒โ๎๐ๅํํ ๓ %s ํๅ ๏ณไ๒๐่์๓บ๒๑: ็ %s ไ๎ %s"
-
-#: ../spell.c:4642
-#, c-format
-msgid "Invalid value for FLAG in %s line %d: %s"
-msgstr "อๅ๊๎๐ๅ๊๒ํๅ ็ํเ๗ๅํํ FLAG ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:4655
-#, c-format
-msgid "FLAG after using flags in %s line %d: %s"
-msgstr "FLAG ๏ณ๑๋ โ่๊๎๐่๑๒เํํ ๏๐เ๏๎๐๖ณโ ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:4723
-#, c-format
-msgid ""
-"Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line "
-"%d"
-msgstr ""
-"ย่็ํเ๗ๅํํ COMPOUNDFORBIDFLAG ๏ณ๑๋ ๅ๋ๅ์ๅํ๒๓ PFX ์๎ๆๅ ไเ๒่ ํๅ๏๐เโ่๋ํ่้ "
-"๐ๅ็๓๋๒เ๒ ๓ %s ๓ ๐ไ๊๓ %d"
-
-#: ../spell.c:4731
-#, c-format
-msgid ""
-"Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line "
-"%d"
-msgstr ""
-"ย่็ํเ๗ๅํํ COMPOUNDPERMITFLAG ๏ณ๑๋ ๅ๋ๅ์ๅํ๒๓ PFX ์๎ๆ๓ ไเ๒่ ํๅ๏๐เโ่๋ํ่้ "
-"๐ๅ็๓๋๒เ๒ ๓ %s ๓ ๐ไ๊๓ %d"
-
-#: ../spell.c:4747
-#, c-format
-msgid "Wrong COMPOUNDRULES value in %s line %d: %s"
-msgstr "อๅ๏๐เโ่๋ํๅ ็ํเ๗ๅํํ COMPOUNDRULES ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:4771
-#, c-format
-msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s"
-msgstr "อๅ๏๐เโ่๋ํๅ ็ํเ๗ๅํํ COMPOUNDWORDMAX ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:4777
-#, c-format
-msgid "Wrong COMPOUNDMIN value in %s line %d: %s"
-msgstr "อๅ๏๐เโ่๋ํๅ ็ํเ๗ๅํํ COMPOUNDMIN ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:4783
-#, c-format
-msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s"
-msgstr "อๅ๏๐เโ่๋ํๅ ็ํเ๗ๅํํ COMPOUNDSYLMAX ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:4795
-#, c-format
-msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"
-msgstr "อๅ๏๐เโ่๋ํๅ ็ํเ๗ๅํํ CHECKCOMPOUNDPATTERN ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:4847
-#, c-format
-msgid "Different combining flag in continued affix block in %s line %d: %s"
-msgstr ""
-"ฒํ๘่้ ๏๐เ๏๎๐ๅ๖ ๊๎์แณํเ๖ณฟ ๓ ๏๐๎ไ๎โๆๅํํณ แ๋๎๊๓ เ๔ณ๊๑ณโ ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:4850
-#, c-format
-msgid "Duplicate affix in %s line %d: %s"
-msgstr "ฯ๎ไโณ้ํ่้ เ๔ณ๊๑ ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:4871
-#, c-format
-msgid ""
-"Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s "
-"line %d: %s"
-msgstr ""
-"ภ๔ณ๊๑ ๒เ๊๎ๆ โ่๊๎๐่๑๒๎โ๓บ๒๑ ไ๋ BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/"
-"NOSUGGEST ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:4893
-#, c-format
-msgid "Expected Y or N in %s line %d: %s"
-msgstr "า๐ๅแเ Y ๗่ N ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:4968
-#, c-format
-msgid "Broken condition in %s line %d: %s"
-msgstr "อๅ๏๐่ไเ๒ํเ ๓์๎โเ ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:5091
-#, c-format
-msgid "Expected REP(SAL) count in %s line %d"
-msgstr "า๐ๅแเ ๊ณ๋๊ณ๑๒ REP(SAL) ๓ %s ๓ ๐ไ๊๓ %d"
-
-#: ../spell.c:5120
-#, c-format
-msgid "Expected MAP count in %s line %d"
-msgstr "า๐ๅแเ ๊ณ๋๊ณ๑๒ MAP ๓ %s ๓ ๐ไ๊๓ %d"
-
-#: ../spell.c:5132
-#, c-format
-msgid "Duplicate character in MAP in %s line %d"
-msgstr "ฯ๎โ๒๎๐ๅํํ ๑่์โ๎๋๓ ๓ MAP ๓ %s ๓ ๐ไ๊๓ %d"
-
-#: ../spell.c:5176
-#, c-format
-msgid "Unrecognized or duplicate item in %s line %d: %s"
-msgstr "อๅ๐๎็๏ณ็ํเํ่้ ๗่ ๏๎โ๒๎๐ํ่้ ๅ๋ๅ์ๅํ๒ ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:5197
-#, c-format
-msgid "Missing FOL/LOW/UPP line in %s"
-msgstr "ฯ๐๎๏๓๙ๅํ๎ ๐ไ๎๊ FOL/LOW/UPP ๓ %s"
-
-#: ../spell.c:5220
-msgid "COMPOUNDSYLMAX used without SYLLABLE"
-msgstr "ยๆ่๒๎ COMPOUNDSYLMAX แๅ็ SYLLABLE"
-
-#: ../spell.c:5236
-msgid "Too many postponed prefixes"
-msgstr "วเแเใเ๒๎ โณไ๊๋เไๅํ่๕ ๏๐ๅ๔ณ๊๑ณโ"
-
-#: ../spell.c:5238
-msgid "Too many compound flags"
-msgstr "วเแเใเ๒๎ ๑๊๋เไํ่๕ ๏๐เ๏๎๐๖ณโ"
-
-#: ../spell.c:5240
-msgid "Too many postponed prefixes and/or compound flags"
-msgstr "วเแเใเ๒๎ โณไ๊๋เไๅํ่๕ ๏๐ๅ๔ณ๊๑ณโ ณ/เแ๎ ๑๊๋เไํ่๕ ๏๐เ๏๎๐๖ณโ"
-
-#: ../spell.c:5250
-#, c-format
-msgid "Missing SOFO%s line in %s"
-msgstr "ฯ๐๎๏๓๙ๅํ๎ ๐ไ๎๊ SOFO%s ๓ %s"
-
-#: ../spell.c:5253
-#, c-format
-msgid "Both SAL and SOFO lines in %s"
-msgstr "ฮแ่ไโเ ๐ไ๊่ SAL ณ SOFO ๓ %s"
-
-#: ../spell.c:5331
-#, c-format
-msgid "Flag is not a number in %s line %d: %s"
-msgstr "ฯ๐เ๏๎๐ๅ๖ ํๅ บ ๗่๑๋๎์ ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:5334
-#, c-format
-msgid "Illegal flag in %s line %d: %s"
-msgstr "อๅ๏๐เโ่๋ํ่้ ๏๐เ๏๎๐ๅ๖ ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:5493 ../spell.c:5501
-#, c-format
-msgid "%s value differs from what is used in another .aff file"
-msgstr "วํเ๗ๅํํ %s โณไ๐ณ็ํบ๒๑ โณไ ๒๎ใ๎, ๙๎ โๆ่๒๎ ๓ ณํ๘๎์๓ ๔เ้๋ณ .aff"
-
-#: ../spell.c:5602
-#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "ว๗่๒๓บ๒๑ ๑๋๎โํ่๊๎โ่้ ๔เ้๋ %s ..."
-
-#: ../spell.c:5611
-#, c-format
-msgid "E760: No word count in %s"
-msgstr "E760: อๅ์เบ ๊ณ๋๊๎๑๒ณ ๑๋ณโ ๓ %s"
-
-#: ../spell.c:5669
-#, c-format
-msgid "line %6d, word %6d - %s"
-msgstr "๐ไ๎๊ %6d, ๑๋๎โ๎ %6d - %s"
-
-#: ../spell.c:5691
-#, c-format
-msgid "Duplicate word in %s line %d: %s"
-msgstr "ฯ๎โ๒๎๐ๅํํ ๑๋๎โเ ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:5694
-#, c-format
-msgid "First duplicate word in %s line %d: %s"
-msgstr "ฯๅ๐๘ๅ ๏๎โ๒๎๐ๅํํ ๑๋๎โเ ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:5746
-#, c-format
-msgid "%d duplicate word(s) in %s"
-msgstr "%d ๏๎โ๒๎๐โเํ่๕ ๑๋ณโ ๓ %s"
-
-#: ../spell.c:5748
-#, c-format
-msgid "Ignored %d word(s) with non-ASCII characters in %s"
-msgstr "ฯ๐๎๏๓๙ๅํ๎ %d ๑๋ณโ(~) ณ็ ํๅ-ASCII ๑่์โ๎๋เ์่ ๓ %s"
-
-#: ../spell.c:6115
-#, c-format
-msgid "Reading word file %s ..."
-msgstr "ื่๒เบ๒๑ ๔เ้๋ ๑๋ณโ %s ..."
-
-#: ../spell.c:6155
-#, c-format
-msgid "Duplicate /encoding= line ignored in %s line %d: %s"
-msgstr "ฯ๎โ๒๎๐ๅํํ ๐ไ๊เ /encoding= ๏๐๎ณใํ๎๐๎โเํ๎ ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:6159
-#, c-format
-msgid "/encoding= line after word ignored in %s line %d: %s"
-msgstr "ะไ๎๊ /encoding= ๏ณ๑๋ ๑๋๎โเ ๏๐๎ณใํ๎๐๎โเํ๎ ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:6180
-#, c-format
-msgid "Duplicate /regions= line ignored in %s line %d: %s"
-msgstr "ฯ๎โ๒๎๐ๅํํ ๐ไ๊เ /regions= ๏๐๎ณใํ๎๐๎โเํ๎ ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:6185
-#, c-format
-msgid "Too many regions in %s line %d: %s"
-msgstr "วเแเใเ๒๎ ๐ๅใณ๎ํณโ ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:6198
-#, c-format
-msgid "/ line ignored in %s line %d: %s"
-msgstr "ะไ๎๊ / ๏๐๎ณใํ๎๐๎โเํ๎ ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:6224
-#, c-format
-msgid "Invalid region nr in %s line %d: %s"
-msgstr "อๅ๊๎๐ๅ๊๒ํ่้ ํ๎์ๅ๐ ๐ๅใณ๎ํ๓ ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:6230
-#, c-format
-msgid "Unrecognized flags in %s line %d: %s"
-msgstr "อๅ๐๎็๏ณ็ํเํณ ๏๐เ๏๎๐๖ณ ๓ %s ๓ ๐ไ๊๓ %d: %s"
-
-#: ../spell.c:6257
-#, c-format
-msgid "Ignored %d words with non-ASCII characters"
-msgstr "ฯ๐๎ณใํ๎๐๎โเํ๎ %d ๑๋ณโ ณ็ ํๅ-ASCII ๑่์โ๎๋เ์่"
-
-#: ../spell.c:6656
-#, c-format
-msgid "Compressed %d of %d nodes; %d (%d%%) remaining"
-msgstr "ั๒่๑ํๅํ๎ %d ็ %d โ๓็๋ณโ; ็เ๋่๘่๋๎๑ %d (%d%%)"
-
-#: ../spell.c:7340
-msgid "Reading back spell file..."
-msgstr "ฯๅ๐ๅ๗่๒๓บ๒๑ ๔เ้๋ ๎๐๔๎ใ๐เ๔ณฟ..."
-
-#. Go through the trie of good words, soundfold each word and add it to
-#. the soundfold trie.
-#: ../spell.c:7357
-msgid "Performing soundfolding..."
-msgstr "ย่๊๎ํ๓บ๒๑ ็ใ๎๐๒เํํ ็โ๓๊ณโ..."
-
-#: ../spell.c:7368
-#, c-format
-msgid "Number of words after soundfolding: %<PRId64>"
-msgstr "สณ๋๊ณ๑๒ ๑๋ณโ ๏ณ๑๋ ็ใ๎๐๒เํํ ็โ๓๊ณโ: %<PRId64>"
-
-#: ../spell.c:7476
-#, c-format
-msgid "Total number of words: %d"
-msgstr "ฯ๎โํเ ๊ณ๋๊ณ๑๒ ๑๋ณโ: %d"
-
-#: ../spell.c:7655
-#, c-format
-msgid "Writing suggestion file %s ..."
-msgstr "วเ๏่๑๓บ๒๑ ๔เ้๋ ๏๐่๏๓๙ๅํ %s ..."
-
-#: ../spell.c:7707 ../spell.c:7927
-#, c-format
-msgid "Estimated runtime memory use: %d bytes"
-msgstr "ฮ๖ณํ๊เ ๑๏๎ๆ่โเํํ ๏เ์'๒ณ: %d แเ้๒"
-
-#: ../spell.c:7820
-msgid "E751: Output file name must not have region name"
-msgstr "E751: ย่๕ณไํ่้ ๔เ้๋ ํๅ ๏๎โ่ํๅํ ์เ๒่ ํเ็โ๓ ๐ๅใณ๎ํ๓"
-
-#: ../spell.c:7822
-msgid "E754: Only up to 8 regions supported"
-msgstr "E754: ฯณไ๒๐่์๓บ๒๑ ๒ณ๋๊่ ไ๎ โ๎๑์่ ๐ๅใณ๎ํณโ"
-
-#: ../spell.c:7846
-#, c-format
-msgid "E755: Invalid region in %s"
-msgstr "E755: อๅ๊๎๐ๅ๊๒ํ่้ ๐ๅใณ๎ํ ๓ %s"
-
-#: ../spell.c:7907
-msgid "Warning: both compounding and NOBREAK specified"
-msgstr "วเ๑๒ๅ๐ๅๆๅํํ: ็เ็ํเ๗ๅํ๎ ๎แ่ไโเ `๑๊๋เไํณ ๑๋๎โเ' ณ NOBREAK"
-
-#: ../spell.c:7920
-#, c-format
-msgid "Writing spell file %s ..."
-msgstr "วเ๏่๑๓บ๒๑ ๔เ้๋ ๎๐๔๎ใ๐เ๔ณฟ %s ..."
-
-#: ../spell.c:7925
-msgid "Done!"
-msgstr "ว๐๎แ๋ๅํ๎!"
-
-#: ../spell.c:8034
-#, c-format
-msgid "E765: 'spellfile' does not have %<PRId64> entries"
-msgstr "E765: 'spellfile' ํๅ ์ณ๑๒่๒ %<PRId64> ๅ๋ๅ์ๅํ๒ณโ"
-
-#: ../spell.c:8074
-#, c-format
-msgid "Word '%.*s' removed from %s"
-msgstr "ั๋๎โ๎ '%.*s' ็ํ่๙ๅํ๎ ็ %s"
-
-#: ../spell.c:8117
-#, c-format
-msgid "Word '%.*s' added to %s"
-msgstr "ั๋๎โ๎ '%.*s' ไ๎ไเํ๎ ไ๎ %s"
-
-#: ../spell.c:8381
-msgid "E763: Word characters differ between spell files"
-msgstr "E763: ั่์โ๎๋่ ๓ ๑๋๎โณ โณไ๐ณ็ํ๒๑ ๓ ๔เ้๋เ๕ ๎๐๔๎ใ๐เ๔ณฟ"
-
-#: ../spell.c:8684
-msgid "Sorry, no suggestions"
-msgstr "ฯ๐๎แเ๗๒ๅ, ํๅ์เบ ๏๐๎๏๎็่๖ณ้"
-
-#: ../spell.c:8687
-#, c-format
-msgid "Sorry, only %<PRId64> suggestions"
-msgstr "ฯ๐๎แเ๗๒ๅ, ๒ณ๋๊่ %<PRId64> ๏๐๎๏๎็่๖ณ้"
-
-#. for when 'cmdheight' > 1
-#. avoid more prompt
-#: ../spell.c:8704
-#, c-format
-msgid "Change \"%.*s\" to:"
-msgstr "วเ์ณํ่๒่ ซ%.*sป ํเ:"
-
-#: ../spell.c:8737
-#, c-format
-msgid " < \"%.*s\""
-msgstr " < ซ%.*sป"
-
-# msgstr "E34: "
-#: ../spell.c:8882
-msgid "E752: No previous spell replacement"
-msgstr "E752: อๅ์เบ ๏๎๏ๅ๐ๅไํ๎ฟ ็เ์ณํ่"
-
-# msgstr "E333: "
-#: ../spell.c:8925
-#, c-format
-msgid "E753: Not found: %s"
-msgstr "E753: อๅ ็ํเ้ไๅํ๎: %s"
-
-#: ../spell.c:9276
-#, c-format
-msgid "E778: This does not look like a .sug file: %s"
-msgstr "E778: อๅ ๑๕๎ๆๅ ํเ ๔เ้๋ .sug: %s"
-
-#: ../spell.c:9282
-#, c-format
-msgid "E779: Old .sug file, needs to be updated: %s"
-msgstr "E779: วเ๑๒เ๐ณ๋่้ ๔เ้๋ .sug, ๒๐ๅแเ ๏๎ํ๎โ่๒่: %s"
-
-#: ../spell.c:9286
-#, c-format
-msgid "E780: .sug file is for newer version of Vim: %s"
-msgstr "E780: ิเ้๋ .sug ไ๋ แณ๋๘ ํ๎โ๎ฟ โๅ๐๑ณฟ Vim: %s"
-
-#: ../spell.c:9295
-#, c-format
-msgid "E781: .sug file doesn't match .spl file: %s"
-msgstr "E781: ิเ้๋ .sug ํๅ โณไ๏๎โณไเบ ๔เ้๋๓ .spl: %s"
-
-#: ../spell.c:9305
-#, c-format
-msgid "E782: error while reading .sug file: %s"
-msgstr "E782: ฯ๎์่๋๊เ ๗่๒เํํ ๔เ้๋๓ .sug: %s"
-
-#. This should have been checked when generating the .spl
-#. file.
-#: ../spell.c:11575
-msgid "E783: duplicate char in MAP entry"
-msgstr "E783: ฯ๎โ๒๎๐ๅํ๎ ๑่์โ๎๋ ๓ ๅ๋ๅ์ๅํ๒ณ MAP"
-
-# msgstr "E391: "
-#: ../syntax.c:266
-msgid "No Syntax items defined for this buffer"
-msgstr "ฤ๋ แ๓๔ๅ๐เ ํๅ โ่็ํเ๗ๅํ๎ ๅ๋ๅ์ๅํ๒ณโ ๑่ํ๒เ๊๑่๑๓"
-
-#: ../syntax.c:3083 ../syntax.c:3104 ../syntax.c:3127
-#, c-format
-msgid "E390: Illegal argument: %s"
-msgstr "E390: อๅ๏๐เโ่๋ํ่้ เ๐ใ๓์ๅํ๒: %s"
-
-#: ../syntax.c:3299
-#, c-format
-msgid "E391: No such syntax cluster: %s"
-msgstr "E391: อๅ์เบ ๒เ๊๎ใ๎ ๑่ํ๒เ๊๑่๗ํ๎ใ๎ ๊๋เ๑๒ๅ๐เ: %s"
-
-#: ../syntax.c:3433
-msgid "syncing on C-style comments"
-msgstr "๑่ํ๕๐๎ํณ็๓บ๒๑ ๏๎ ๊๎์ๅํ๒เ๐๕ ๑๒่๋ ั"
-
-#: ../syntax.c:3439
-msgid "no syncing"
-msgstr "แๅ็ ๑่ํ๕๐๎ํณ็เ๖ณฟ"
-
-#: ../syntax.c:3441
-msgid "syncing starts "
-msgstr "๏๎๗่ํเบ๒๑ ๑่ํ๕๐๎ํณ็เ๖ณ ็เ "
-
-#: ../syntax.c:3443 ../syntax.c:3506
-msgid " lines before top line"
-msgstr " ๐ไ๊ณโ ๏ๅ๐ๅไ ๏ๅ๐๘่์ ๐ไ๊๎์"
-
-#: ../syntax.c:3448
-msgid ""
-"\n"
-"--- Syntax sync items ---"
-msgstr ""
-"\n"
-"--- ล๋ๅ์ๅํ๒่ ๑่ํ๕๐๎ํณ็เ๖ณฟ ๑่ํ๒เ๊๑่๑๓ ---"
-
-#: ../syntax.c:3452
-msgid ""
-"\n"
-"syncing on items"
-msgstr ""
-"\n"
-"๑่ํ๕๐๎ํณ็เ๖ณ ๏๎ ๅ๋ๅ์ๅํ๒เ๕"
-
-#: ../syntax.c:3457
-msgid ""
-"\n"
-"--- Syntax items ---"
-msgstr ""
-"\n"
-"--- ล๋ๅ์ๅํ๒่ ๑่ํ๒เ๊๑่๑๓ ---"
-
-#: ../syntax.c:3475
-#, c-format
-msgid "E392: No such syntax cluster: %s"
-msgstr "E392: อๅ์เบ ๒เ๊๎ใ๎ ๑่ํ๒เ๊๑่๗ํ๎ใ๎ ๊๋เ๑๒ๅ๐เ: %s"
-
-#: ../syntax.c:3497
-msgid "minimal "
-msgstr "์ณํณ์เ๋ํ่้ "
-
-#: ../syntax.c:3503
-msgid "maximal "
-msgstr "์เ๊๑่์เ๋ํ่้ "
-
-#: ../syntax.c:3513
-msgid "; match "
-msgstr "; ็แณใ "
-
-#: ../syntax.c:3515
-msgid " line breaks"
-msgstr " ๐๎็๐่โ่ ๐ไ๊ณโ"
-
-#: ../syntax.c:4076
-msgid "E395: contains argument not accepted here"
-msgstr "E395: ฬณ๑๒่๒ ํๅ๏๐่้ํ๒ํณ ๒๓๒ เ๐ใ๓์ๅํ๒่"
-
-# msgstr "E14: "
-#: ../syntax.c:4096
-msgid "E844: invalid cchar value"
-msgstr "E844: อๅ๊๎๐ๅ๊๒ํๅ ็ํเ๗ๅํํ cchar"
-
-#: ../syntax.c:4107
-msgid "E393: group[t]here not accepted here"
-msgstr "E393: group[t]hete ๒๓๒ ํๅ๏๐่้ํ๒ํ่้"
-
-#: ../syntax.c:4126
-#, c-format
-msgid "E394: Didn't find region item for %s"
-msgstr "E394: อๅ ็ํเ้ไๅํ๎ ๅ๋ๅ์ๅํ๒ ๐ๅใณ๎ํ๓ ไ๋ %s"
-
-# msgstr "E396: "
-#: ../syntax.c:4188
-msgid "E397: Filename required"
-msgstr "E397: ฯ๎๒๐ณแํเ ํเ็โเ ๔เ้๋๓"
-
-#: ../syntax.c:4221
-msgid "E847: Too many syntax includes"
-msgstr "E847: วเแเใเ๒๎ ๑่ํ๒เ๊๑่๗ํ่๕ โ๊๋๗ๅํ"
-
-#: ../syntax.c:4303
-#, c-format
-msgid "E789: Missing ']': %s"
-msgstr "E789: ฯ๐๎๏๓๙ๅํ๎ ']': %s"
-
-#: ../syntax.c:4531
-#, c-format
-msgid "E398: Missing '=': %s"
-msgstr "E398: ฯ๐๎๏๓๙ๅํ๎ `=': %s"
-
-# ---------------------------------------
-#: ../syntax.c:4666
-#, c-format
-msgid "E399: Not enough arguments: syntax region %s"
-msgstr "E399: ม๐เ๊๓บ เ๐ใ๓์ๅํ๒ณโ: ๑่ํ๒เ๊๑่๗ํ่้ ๐ๅใณ๎ํ %s"
-
-#: ../syntax.c:4870
-msgid "E848: Too many syntax clusters"
-msgstr "E848: วเแเใเ๒๎ ๑่ํ๒เ๊๑่๗ํ่๕ ๊๋เ๑๒ๅ๐ณโ"
-
-#: ../syntax.c:4954
-msgid "E400: No cluster specified"
-msgstr "E400: ส๋เ๑๒ๅ๐ ํๅ โ๊เ็เํ๎"
-
-#. end delimiter not found
-#: ../syntax.c:4986
-#, c-format
-msgid "E401: Pattern delimiter not found: %s"
-msgstr "E401: สณํๅ๖ ็๐เ็๊๓ ํๅ ็ํเ้ไๅํ๎: %s"
-
-#: ../syntax.c:5049
-#, c-format
-msgid "E402: Garbage after pattern: %s"
-msgstr "E402: ั์ณ๒๒ ๏ณ๑๋ ็๐เ็๊๓: %s"
-
-# msgstr "E402: "
-#: ../syntax.c:5120
-msgid "E403: syntax sync: line continuations pattern specified twice"
-msgstr ""
-"E403: ั่ํ๒เ๊๑่๗ํเ ๑่ํ๕๐๎ํณ็เ๖ณ: ็๐เ็๎๊ ไ๋ ๏๐๎ไ๎โๆๅํํ ๐ไ๊เ โ๊เ็เํ๎ ไโณ๗ณ"
-
-#: ../syntax.c:5169
-#, c-format
-msgid "E404: Illegal arguments: %s"
-msgstr "E404: อๅ๏๐เโ่๋ํณ เ๐ใ๓์ๅํ๒่: %s"
-
-# msgstr "E404: "
-#: ../syntax.c:5217
-#, c-format
-msgid "E405: Missing equal sign: %s"
-msgstr "E405: ฯ๐๎๏๓๙ๅํ๎ ็ํเ๊ ๐ณโํ๎๑๒ณ: %s"
-
-# msgstr "E405: "
-#: ../syntax.c:5222
-#, c-format
-msgid "E406: Empty argument: %s"
-msgstr "E406: ฯ๎๐๎ๆํณ้ เ๐ใ๓์ๅํ๒: %s"
-
-# msgstr "E406: "
-#: ../syntax.c:5240
-#, c-format
-msgid "E407: %s not allowed here"
-msgstr "E407: %s ๒๓๒ ํๅ ไ๎็โ๎๋ๅํ๎"
-
-#: ../syntax.c:5246
-#, c-format
-msgid "E408: %s must be first in contains list"
-msgstr "E408: %s ์เบ แ๓๒่ ๏ๅ๐๘่์ ๐ไ๊๎์ ๓ ๑๏่๑๊๓ contains"
-
-#: ../syntax.c:5304
-#, c-format
-msgid "E409: Unknown group name: %s"
-msgstr "E409: อๅโณไ๎์เ ํเ็โเ ใ๐๓๏่: %s"
-
-# msgstr "E409: "
-#: ../syntax.c:5512
-#, c-format
-msgid "E410: Invalid :syntax subcommand: %s"
-msgstr "E410: อๅ๏๐เโ่๋ํเ ๏ณไ๊๎์เํไเ :syntax: %s"
-
-#: ../syntax.c:5854
-msgid ""
-" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
-msgstr ""
-" ยัฮรฮ ส-า ัฯฒยฯ. อภษฯฮยฒห. ัละลฤอ. อภวยภ ุภมหฮอ"
-
-#: ../syntax.c:6146
-msgid "E679: recursive loop loading syncolor.vim"
-msgstr "E679: ะๅ๊๓๐๑่โํ่้ ๖่๊๋ ๗่๒เํํ syncolor.vim"
-
-# msgstr "E410: "
-#: ../syntax.c:6256
-#, c-format
-msgid "E411: highlight group not found: %s"
-msgstr "E411: ร๐๓๏๓ ๏ณไ๑โณ๗๓โเํํ ํๅ ็ํเ้ไๅํ๎: %s"
-
-# msgstr "E411: "
-#: ../syntax.c:6278
-#, c-format
-msgid "E412: Not enough arguments: \":highlight link %s\""
-msgstr "E412: อๅไ๎๑๒เ๒ํ๎ เ๐ใ๓์ๅํ๒ณโ: ซ:highlight link %sป"
-
-# msgstr "E412: "
-#: ../syntax.c:6284
-#, c-format
-msgid "E413: Too many arguments: \":highlight link %s\""
-msgstr "E413: วเแเใเ๒๎ เ๐ใ๓์ๅํ๒ณโ: ซ:highlight link %sป"
-
-# msgstr "E413: "
-#: ../syntax.c:6302
-msgid "E414: group has settings, highlight link ignored"
-msgstr "E414: ร๐๓์เ ์เบ settings, highlight link ๏๐๎ณใํ๎๐๎โเํ๎"
-
-# msgstr "E414: "
-#: ../syntax.c:6367
-#, c-format
-msgid "E415: unexpected equal sign: %s"
-msgstr "E415: อๅ๑๏๎ไณโเํ่้ ็ํเ๊ ๐ณโํ๎๑๒ณ: %s"
-
-# msgstr "E415: "
-#: ../syntax.c:6395
-#, c-format
-msgid "E416: missing equal sign: %s"
-msgstr "E416: ฯ๐๎๏๓๙ๅํ๎ ็ํเ๊ ๐ณโํ๎๑๒ณ: %s"
-
-#: ../syntax.c:6418
-#, c-format
-msgid "E417: missing argument: %s"
-msgstr "E417: ฯ๐๎๏๓๙ๅํ๎ เ๐ใ๓์ๅํ๒: %s"
-
-#: ../syntax.c:6446
-#, c-format
-msgid "E418: Illegal value: %s"
-msgstr "E418: อๅ๏๐เโ่๋ํๅ ็ํเ๗ๅํํ: %s"
-
-# msgstr "E418: "
-#: ../syntax.c:6496
-msgid "E419: FG color unknown"
-msgstr "E419: อๅโณไ๎์่้ ๊๎๋ณ๐ ๒ๅ๊๑๒๓"
-
-# msgstr "E419: "
-#: ../syntax.c:6504
-msgid "E420: BG color unknown"
-msgstr "E420: อๅโณไ๎์่้ ๊๎๋ณ๐ ๔๎ํ๓"
-
-# msgstr "E420: "
-#: ../syntax.c:6564
-#, c-format
-msgid "E421: Color name or number not recognized: %s"
-msgstr "E421: อๅ๐๎็๏ณ็ํเํเ ํเ็โเ เแ๎ ํ๎์ๅ๐ ๊๎๋๎๐๓: %s"
-
-# msgstr "E421: "
-#: ../syntax.c:6714
-#, c-format
-msgid "E422: terminal code too long: %s"
-msgstr "E422: วเํเไ๒๎ ไ๎โใ่้ ๊๎ไ ๒ๅ๐์ณํเ๋๓: %s"
-
-# msgstr "E422: "
-#: ../syntax.c:6753
-#, c-format
-msgid "E423: Illegal argument: %s"
-msgstr "E423: อๅ๏๐เโ่๋ํ่้ เ๐ใ๓์ๅํ๒: %s"
-
-# msgstr "E423: "
-#: ../syntax.c:6925
-msgid "E424: Too many different highlighting attributes in use"
-msgstr "E424: ย่๊๎๐่๑๒เํ๎ ็เแเใเ๒๎ ๐ณ็ํ่๕ เ๒๐่แ๓๒ณโ ๊๎๋๎๐๓"
-
-#: ../syntax.c:7427
-msgid "E669: Unprintable character in group name"
-msgstr "E669: อๅไ๐๓๊๎โํ่้ ๑่์โ๎๋ ๓ ํเ็โณ ใ๐๓๏่"
-
-# msgstr "E181: "
-#: ../syntax.c:7434
-msgid "W18: Invalid character in group name"
-msgstr "W18: อๅ๊๎๐ๅ๊๒ํ่้ ๑่์โ๎๋ ๓ ํเ็โณ ใ๐๓๏่"
-
-#: ../syntax.c:7448
-msgid "E849: Too many highlight and syntax groups"
-msgstr "E849: วเแเใเ๒๎ ใ๐๓๏ ๏ณไ๑โณ๗๓โเํํ ณ ๑่ํ๒เ๊๑่๑๓"
-
-# msgstr "E424: "
-#: ../tag.c:104
-msgid "E555: at bottom of tag stack"
-msgstr "E555: สณํๅ๖ ๑๒ๅ๊๓ ๒ๅดณโ"
-
-#: ../tag.c:105
-msgid "E556: at top of tag stack"
-msgstr "E556: ยๅ๐๘่ํเ ๑๒ๅ๊๓ ๒ๅดณโ"
-
-#: ../tag.c:380
-msgid "E425: Cannot go before first matching tag"
-msgstr "E425: ึๅ โๆๅ ํเ้๏ๅ๐๘่้ โณไ๏๎โณไํ่้ ๒ๅด"
-
-# msgstr "E425: "
-#: ../tag.c:504
-#, c-format
-msgid "E426: tag not found: %s"
-msgstr "E426: าๅด ํๅ ็ํเ้ไๅํ๎: %s"
-
-# msgstr "E426: "
-#: ../tag.c:528
-msgid " # pri kind tag"
-msgstr " # ๏๐ณ ๒่๏ ๒ๅด"
-
-#: ../tag.c:531
-msgid "file\n"
-msgstr "๔เ้๋\n"
-
-#: ../tag.c:829
-msgid "E427: There is only one matching tag"
-msgstr "E427: ห่๘ๅ ๎ไ่ํ โณไ๏๎โณไํ่้ ๒ๅด"
-
-# msgstr "E427: "
-#: ../tag.c:831
-msgid "E428: Cannot go beyond last matching tag"
-msgstr "E428: ึๅ โๆๅ ๎๑๒เํํณ้ โณไ๏๎โณไํ่้ ๒ๅด"
-
-# msgstr "E428: "
-#: ../tag.c:850
-#, c-format
-msgid "File \"%s\" does not exist"
-msgstr "ิเ้๋ ซ%sป ํๅ ณ๑ํ๓บ"
-
-#. Give an indication of the number of matching tags
-#: ../tag.c:859
-#, c-format
-msgid "tag %d of %d%s"
-msgstr "๒ๅด %d ็ %d%s"
-
-#: ../tag.c:862
-msgid " or more"
-msgstr " เแ๎ แณ๋๘ๅ"
-
-#: ../tag.c:864
-msgid " Using tag with different case!"
-msgstr " ย่๊๎๐่๑๒เํ๎ ๒ๅด, ํๅ ๐๎็๐ณ็ํ๗่ โๅ๋่๊ณ ้ ์เ๋ณ ๋ณ๒ๅ๐่"
-
-#: ../tag.c:909
-#, c-format
-msgid "E429: File \"%s\" does not exist"
-msgstr "E429: ิเ้๋ ซ%sป ํๅ ณ๑ํ๓บ"
-
-# msgstr "E429: "
-#. Highlight title
-#: ../tag.c:960
-msgid ""
-"\n"
-" # TO tag FROM line in file/text"
-msgstr ""
-"\n"
-" # ฤฮ ๒ๅด๓ ว ๐ไ๊เ ๓ ๔เ้๋ณ/๒ๅ๊๑๒ณ"
-
-#: ../tag.c:1303
-#, c-format
-msgid "Searching tags file %s"
-msgstr "ุ๓๊เบ๒๑ ๓ ๔เ้๋ณ ๒ๅดณโ %s"
-
-#: ../tag.c:1545
-msgid "Ignoring long line in tags file"
-msgstr "ฒใํ๎๐๓บ๒๑ ไ๎โใ่้ ๐ไ๎๊ ๓ ๔เ้๋ณ ็ ๏๎็ํเ๗๊เ์่"
-
-# msgstr "E430: "
-#: ../tag.c:1915
-#, c-format
-msgid "E431: Format error in tags file \"%s\""
-msgstr "E431: ฯ๎์่๋๊เ ๔๎๐์เ๒๓ ๓ ๔เ้๋ณ ๒ๅดณโ ซ%sป"
-
-# msgstr "E431: "
-#: ../tag.c:1917
-#, c-format
-msgid "Before byte %<PRId64>"
-msgstr "ฯๅ๐ๅไ แเ้๒๎์ %<PRId64>"
-
-#: ../tag.c:1929
-#, c-format
-msgid "E432: Tags file not sorted: %s"
-msgstr "E432: ิเ้๋ ๒ๅดณโ ํๅ โ๏๎๐ไ๊๎โเํ่้: %s"
-
-# msgstr "E432: "
-#. never opened any tags file
-#: ../tag.c:1960
-msgid "E433: No tags file"
-msgstr "E433: อๅ์เบ ๔เ้๋๓ ๒ๅดณโ"
-
-# msgstr "E433: "
-#: ../tag.c:2536
-msgid "E434: Can't find tag pattern"
-msgstr "E434: อๅ โไเ๋๎๑ ็ํเ้๒่ ็๐เ็๎๊ ๒ๅด๓"
-
-# msgstr "E434: "
-#: ../tag.c:2544
-msgid "E435: Couldn't find tag, just guessing!"
-msgstr "E435: อๅ โไเ๋๎๑ ็ํเ้๒่ ๒ๅด, ๒ณ๋๊่ ๏๐่๏๓๙ๅํํ!"
-
-#: ../tag.c:2797
-#, c-format
-msgid "Duplicate field name: %s"
-msgstr "อเ็โเ ๏๎๋ ๏๎โ๒๎๐บ๒๑: %s"
-
-# msgstr "E435: "
-#: ../term.c:1442
-msgid "' not known. Available builtin terminals are:"
-msgstr "' ํๅ โณไ๎์่้. ยแ๓ไ๎โเํณ ๒ๅ๐์ณํเ๋่:"
-
-#: ../term.c:1463
-msgid "defaulting to '"
-msgstr "๏๎๗เ๒๊๎โ๎ '"
-
-#: ../term.c:1731
-msgid "E557: Cannot open termcap file"
-msgstr "E557: อๅ โไเ๋๎๑ โณไ๊๐่๒่ ๔เ้๋ ์๎ๆ๋่โ๎๑๒ๅ้ ๒ๅ๐์ณํเ๋ณโ"
-
-#: ../term.c:1735
-msgid "E558: Terminal entry not found in terminfo"
-msgstr "E558: อๅ์เบ ณํ๔๎๐์เ๖ณฟ ๏๐๎ ๒ๅ๐์ณํเ๋"
-
-#: ../term.c:1737
-msgid "E559: Terminal entry not found in termcap"
-msgstr "E559: อๅ์เบ ณํ๔๎๐์เ๖ณฟ ๏๐๎ ์๎ๆ๋่โ๎๑๒ณ ๒ๅ๐์ณํเ๋๓"
-
-#: ../term.c:1878
-#, c-format
-msgid "E436: No \"%s\" entry in termcap"
-msgstr "E436: อๅ์เบ ็เ๏่๑๓ ซ%sป ๏๐๎ ์๎ๆ๋่โ๎๑๒ณ ๒ๅ๐์ณํเ๋๓"
-
-#: ../term.c:2249
-msgid "E437: terminal capability \"cm\" required"
-msgstr "E437: ฯ๎๒๐ณแํเ ์๎ๆ๋่โณ๑๒ ๒ๅ๐์ณํเ๋๓ ซcmป"
-
-#. Highlight title
-#: ../term.c:4376
-msgid ""
-"\n"
-"--- Terminal keys ---"
-msgstr ""
-"\n"
-"--- ส๋เโณ๘ณ ๒ๅ๐์ณํเ๋๓ ---"
-
-#: ../ui.c:481
-msgid "Vim: Error reading input, exiting...\n"
-msgstr "Vim: ฯ๎์่๋๊เ ๗่๒เํํ โโ๎ไ๓, ๐๎แ๎๒เ ็เโๅ๐๘๓บ๒๑...\n"
-
-#. This happens when the FileChangedRO autocommand changes the
-#. * file in a way it becomes shorter.
-#: ../undo.c:379
-#, fuzzy
-msgid "E881: Line count changed unexpectedly"
-msgstr "E834: สณ๋๊ณ๑๒ ๐ไ๊ณโ ํๅ๑๏๎ไณโเํ๎ ็์ณํ่๋เ๑"
-
-#: ../undo.c:627
-#, c-format
-msgid "E828: Cannot open undo file for writing: %s"
-msgstr "E828: อๅ โไเ๋๎๑ โณไ๊๐่๒่ ๔เ้๋ ณ๑๒๎๐ณฟ ไ๋ ็เ๏่๑๓: %s"
-
-#: ../undo.c:717
-#, c-format
-msgid "E825: Corrupted undo file (%s): %s"
-msgstr "E825: ิเ้๋ ณ๑๒๎๐ณฟ ๏๎๘๊๎ไๆๅํ๎ (%s): %s"
-
-#: ../undo.c:1039
-msgid "Cannot write undo file in any directory in 'undodir'"
-msgstr "อๅ โไเ๋๎๑ ็เ๏่๑เ๒่ ๔เ้๋ ณ๑๒๎๐ณฟ ๓ ๆ๎ไํ๓ ็ ไ่๐ๅ๊๒๎๐ณ้ ๓ 'undodir'"
-
-#: ../undo.c:1074
-#, c-format
-msgid "Will not overwrite with undo file, cannot read: %s"
-msgstr "Will not overwrite with undo file, cannot read: %s"
-
-#: ../undo.c:1092
-#, c-format
-msgid "Will not overwrite, this is not an undo file: %s"
-msgstr "อๅ ์๎ๆํเ ๏ๅ๐ๅ็เ๏่๑เ๒่, ๖ๅ ํๅ ๔เ้๋ ณ๑๒๎๐ณฟ: %s"
-
-#: ../undo.c:1108
-msgid "Skipping undo file write, nothing to undo"
-msgstr "ิเ้๋ ณ๑๒๎๐ณฟ ํๅ ็เ๏่๑๓บ๒๑, ํณ๗๎ใ๎ ๏๎โๅ๐๒เ๒่"
-
-#: ../undo.c:1121
-#, c-format
-msgid "Writing undo file: %s"
-msgstr "วเ๏่๑๓บ๒๑ ๔เ้๋ ณ๑๒๎๐ณฟ: %s"
-
-#: ../undo.c:1213
-#, c-format
-msgid "E829: write error in undo file: %s"
-msgstr "E829: ฯ๎์่๋๊เ ็เ๏่๑๓ ๓ ๔เ้๋ณ ณ๑๒๎๐ณฟ: %s"
-
-#: ../undo.c:1280
-#, c-format
-msgid "Not reading undo file, owner differs: %s"
-msgstr "ิเ้๋ ณ๑๒๎๐ณฟ ๏๐๎๗่๒เํ๎ ํๅ แ๓ไๅ, โ๋เ๑ํ่๊ ณํ๘่้: %s"
-
-#: ../undo.c:1292
-#, c-format
-msgid "Reading undo file: %s"
-msgstr "ื่๒เบ๒๑ ๔เ้๋ ณ๑๒๎๐ณฟ: %s"
-
-#: ../undo.c:1299
-#, c-format
-msgid "E822: Cannot open undo file for reading: %s"
-msgstr "E822: อๅ โไเ๋๎๑ โณไ๊๐่๒่ ๔เ้๋ ไ๋ ๗่๒เํํ: %s"
-
-# msgstr "E333: "
-#: ../undo.c:1308
-#, c-format
-msgid "E823: Not an undo file: %s"
-msgstr "E823: อๅ ๔เ้๋ ณ๑๒๎๐ณฟ: %s"
-
-#: ../undo.c:1313
-#, c-format
-msgid "E824: Incompatible undo file: %s"
-msgstr "E824: อๅ๑๓์ณ๑ํ่้ ๔เ้๋ ณ๑๒๎๐ณฟ: %s"
-
-#: ../undo.c:1328
-msgid "File contents changed, cannot use undo info"
-msgstr "ย์ณ๑๒ ๔เ้๋๓ ็์ณํ่โ๑, ํๅ ์๎ๆํเ โ่๊๎๐่๑๒เ๒่ ณํ๔๎๐์เ๖ณ ๏๐๎ ณ๑๒๎๐ณ"
-
-#: ../undo.c:1497
-#, c-format
-msgid "Finished reading undo file %s"
-msgstr "วเ๊ณํ๗ๅํ๎ ๗่๒เํํ ๔เ้๋๓ ณ๑๒๎๐ณฟ %s"
-
-#: ../undo.c:1586 ../undo.c:1812
-msgid "Already at oldest change"
-msgstr "ยๆๅ ํเ ํเ้๑๒เ๐๘ณ้ ็์ณํณ"
-
-#: ../undo.c:1597 ../undo.c:1814
-msgid "Already at newest change"
-msgstr "ยๆๅ ํเ ํเ้ํ๎โณ๘ณ้ ็์ณํณ"
-
-#: ../undo.c:1806
-#, c-format
-msgid "E830: Undo number %<PRId64> not found"
-msgstr "E830: ว์ณํ๓ %<PRId64> ํๅ ็ํเ้ไๅํ๎ โ ณ๑๒๎๐ณฟ"
-
-#: ../undo.c:1979
-msgid "E438: u_undo: line numbers wrong"
-msgstr "E438: u_undo: ํๅ๏๐เโ่๋ํณ ํ๎์ๅ๐่ ๐ไ๊ณโ"
-
-#: ../undo.c:2183
-msgid "more line"
-msgstr "ไ๎ไเํ๎ ๐ไ๎๊"
-
-#: ../undo.c:2185
-msgid "more lines"
-msgstr "๐ไ๊ณโ ไ๎ไเํ๎"
-
-#: ../undo.c:2187
-msgid "line less"
-msgstr "็ํ่๙ๅํ๎ ๐ไ๎๊"
-
-#: ../undo.c:2189
-msgid "fewer lines"
-msgstr "๐ไ๊ณโ ็ํ่๙ๅํ๎"
-
-# msgstr "E438: "
-#: ../undo.c:2193
-msgid "change"
-msgstr "็์ณํเ"
-
-# msgstr "E438: "
-#: ../undo.c:2195
-msgid "changes"
-msgstr "็์ณํ"
-
-#: ../undo.c:2225
-#, c-format
-msgid "%<PRId64> %s; %s #%<PRId64> %s"
-msgstr "%<PRId64> %s; %s #%<PRId64> %s"
-
-#: ../undo.c:2228
-msgid "before"
-msgstr "๏ๅ๐ๅไ"
-
-#: ../undo.c:2228
-msgid "after"
-msgstr "๏ณ๑๋"
-
-#: ../undo.c:2325
-msgid "Nothing to undo"
-msgstr "อๅ์เบ ํณ๗๎ใ๎ ๑๊เ๑๎โ๓โเ๒่"
-
-#: ../undo.c:2330
-msgid "number changes when saved"
-msgstr "ํ๎์ๅ๐ ็์ณํ่ ๗เ๑ ็แๅ๐ๅๆๅํ๎"
-
-#: ../undo.c:2360
-#, c-format
-msgid "%<PRId64> seconds ago"
-msgstr "%<PRId64> ๑ๅ๊๓ํไ ๒๎์๓"
-
-# msgstr "E406: "
-#: ../undo.c:2372
-msgid "E790: undojoin is not allowed after undo"
-msgstr "E790: อๅ ์๎ๆํเ โ่๊๎ํเ๒่ undojoin ๏ณ๑๋ undo"
-
-#: ../undo.c:2466
-msgid "E439: undo list corrupt"
-msgstr "E439: ั๏่๑๎๊ ๑๊เ๑๓โเํํ ๏๎๘๊๎ไๆๅํ๎"
-
-# msgstr "E439: "
-#: ../undo.c:2495
-msgid "E440: undo line missing"
-msgstr "E440: ยณไ๑๓๒ํณ้ ๐ไ๎๊ ๑๊เ๑๓โเํํ"
-
-#: ../version.c:600
-msgid ""
-"\n"
-"Included patches: "
-msgstr ""
-"\n"
-"ย๊๋๗ๅํณ ๋เ๒๊่: "
-
-#: ../version.c:627
-msgid ""
-"\n"
-"Extra patches: "
-msgstr ""
-"\n"
-"ฤ๎ไเ๒๊๎โณ ๋เ๒๊่: "
-
-#: ../version.c:639 ../version.c:864
-msgid "Modified by "
-msgstr "ว์ณํ่โ "
-
-#: ../version.c:646
-msgid ""
-"\n"
-"Compiled "
-msgstr ""
-"\n"
-"ั๊๎์๏ณ๋โเโ "
-
-#: ../version.c:649
-msgid "by "
-msgstr " "
-
-#: ../version.c:660
-msgid ""
-"\n"
-"Huge version "
-msgstr ""
-"\n"
-"รณใเํ๒๑๊เ โๅ๐๑ณ "
-
-#: ../version.c:661
-msgid "without GUI."
-msgstr "แๅ็ GUI."
-
-#: ../version.c:662
-msgid " Features included (+) or not (-):\n"
-msgstr " ย๊๋๗ๅํณ (+) เแ๎ ํๅ โ๊๋๗ๅํณ (-) ๊๎์๏๎ํๅํ๒่:\n"
-
-#: ../version.c:667
-msgid " system vimrc file: \""
-msgstr " ๑่๑๒ๅ์ํ่้ vimrc: \""
-
-#: ../version.c:672
-msgid " user vimrc file: \""
-msgstr " vimrc ๊๎๐่๑๒๓โเ๗เ: \""
-
-#: ../version.c:677
-msgid " 2nd user vimrc file: \""
-msgstr " ไ๐๓ใ่้ vimrc ๊๎๐่๑๒๓โเ๗เ: \""
-
-#: ../version.c:682
-msgid " 3rd user vimrc file: \""
-msgstr " ๒๐ๅ๒ณ้ vimrc ๊๎๐่๑๒๓โเ๗เ: \""
-
-#: ../version.c:687
-msgid " user exrc file: \""
-msgstr " exrc ๊๎๐่๑๒๓โเ๗เ: \""
-
-#: ../version.c:692
-msgid " 2nd user exrc file: \""
-msgstr " ไ๐๓ใ่้ exrc ๊๎๐่๑๒๓โเ๗เ: \""
-
-#: ../version.c:699
-msgid " fall-back for $VIM: \""
-msgstr " ็เ์ณํเ ไ๋ $VIM: \""
-
-#: ../version.c:705
-msgid " f-b for $VIMRUNTIME: \""
-msgstr " ็เ์ณํเ ไ๋ $VIMRUNTIME: \""
-
-#: ../version.c:709
-msgid "Compilation: "
-msgstr "ั๊๎์๏ณ๋๎โเํ๎: "
-
-#: ../version.c:712
-msgid "Linking: "
-msgstr "ั๊๎์๏๎ํ๎โเํ๎: "
-
-#: ../version.c:717
-msgid " DEBUG BUILD"
-msgstr " ยละัฒ฿ ฤห฿ อภหภรฮฤฦลออ฿"
-
-#: ../version.c:767
-msgid "VIM - Vi IMproved"
-msgstr "VIM - ฯ๎๊๐เ๙ๅํ่้ Vi"
-
-#: ../version.c:769
-msgid "version "
-msgstr "โๅ๐๑ณ "
-
-#: ../version.c:770
-msgid "by Bram Moolenaar et al."
-msgstr "เโ๒๎๐: Bram Moolenaar ๒เ ณํ."
-
-#: ../version.c:774
-msgid "Vim is open source and freely distributable"
-msgstr "Vim — ๖ๅ โณไ๊๐่๒เ ้ โณ๋ํ๎ ๐๎็๏๎โ๑ไๆ๓โเํเ ๏๐๎ใ๐เ์เ"
-
-#: ../version.c:776
-msgid "Help poor children in Uganda!"
-msgstr "ฤ๎๏๎์๎ๆณ๒ ๑่๐๎๒เ์ ็ ำใเํไ่!"
-
-#: ../version.c:777
-msgid "type :help iccf<Enter> for information "
-msgstr ":help iccf<Enter> ๏๎ไ๐๎แ่๖ณ "
-
-#: ../version.c:779
-msgid "type :q<Enter> to exit "
-msgstr ":q<Enter> โ่๕ณไ ็ Vim "
-
-#: ../version.c:780
-msgid "type :help<Enter> or <F1> for on-line help"
-msgstr ":help<Enter> เแ๎ <F1> ๏ๅ๐ๅใ๋ไ ไ๎๏๎์๎ใ่ "
-
-#: ../version.c:781
-msgid "type :help version7<Enter> for version info"
-msgstr ":help version7<Enter> ณํ๔๎๐์เ๖ณ ๏๐๎ โๅ๐๑ณ "
-
-#: ../version.c:784
-msgid "Running in Vi compatible mode"
-msgstr "ย่ ๏๐เ๖บ๒ๅ โ ๐ๅๆ่์ณ ๑๓์ณ๑ํ๎์๓ ็ Vi"
-
-#: ../version.c:785
-msgid "type :set nocp<Enter> for Vim defaults"
-msgstr ":set nocp<Enter> ๐ๅๆ่์ ํๅ๑๓์ณ๑ํ่้ ็ Vi "
-
-#: ../version.c:786
-msgid "type :help cp-default<Enter> for info on this"
-msgstr ":help cp-default<Enter> ณํ๔๎๐์เ๖ณ ๏๐๎ ๑๓์ณ๑ํณ๑๒"
-
-#: ../version.c:827
-msgid "Sponsor Vim development!"
-msgstr "ฯณไ๒๐่์เ้๒ๅ ๐๎็๐๎แ๊๓ ๐ๅไเ๊๒๎๐เ Vim!"
-
-#: ../version.c:828
-msgid "Become a registered Vim user!"
-msgstr "ั๒เํ๒ๅ ็เ๐ๅบ๑๒๐๎โเํ่์ ๊๎๐่๑๒๓โเ๗ๅ์ Vim!"
-
-#: ../version.c:831
-msgid "type :help sponsor<Enter> for information "
-msgstr ":help sponsor<Enter> ๏๎ไเ๋๘เ ณํ๔๎๐์เ๖ณ "
-
-#: ../version.c:832
-msgid "type :help register<Enter> for information "
-msgstr ":help register<Enter> ๏๎ไเ๋๘เ ณํ๔๎๐์เ๖ณ "
-
-#: ../version.c:834
-msgid "menu Help->Sponsor/Register for information "
-msgstr "์ๅํ ฤ๎๏๎์๎ใเ->ั๏๎ํ๑๎๐/ะๅบ๑๒๐เ๖ณ ๏๎ไ๐๎แ่๖ณ "
-
-# msgstr "E444: "
-#: ../window.c:119
-msgid "Already only one window"
-msgstr "ึๅ โๆๅ บไ่ํๅ โณ๊ํ๎"
-
-#: ../window.c:224
-msgid "E441: There is no preview window"
-msgstr "E441: อๅ์เบ โณ๊ํเ ๏ๅ๐ๅใ๋ไ๓"
-
-# msgstr "E441: "
-#: ../window.c:559
-msgid "E442: Can't split topleft and botright at the same time"
-msgstr "E442: อๅ โไเ๋๎๑ ๎ไํ๎๗เ๑ํ๎ ๐๎็แ่๒่ topleft ณ botright"
-
-# msgstr "E442: "
-#: ../window.c:1228
-msgid "E443: Cannot rotate when another window is split"
-msgstr "E443: อๅ โไเ๋๎๑ ๏ๅ๐ๅ์ณ๑๒่๒่ โณ๊ํ๎, ็เโเๆเ๒ ณํ๘ณ"
-
-# msgstr "E443: "
-#: ../window.c:1803
-msgid "E444: Cannot close last window"
-msgstr "E444: อๅ โไเ๋๎๑ ็เ๊๐่๒่ ๎๑๒เํํบ โณ๊ํ๎"
-
-# msgstr "E443: "
-#: ../window.c:1810
-msgid "E813: Cannot close autocmd window"
-msgstr "E813: อๅ โไเ๋๎๑ ็เ๊๐่๒่ โณ๊ํ๎ autocmd"
-
-# msgstr "E443: "
-#: ../window.c:1814
-msgid "E814: Cannot close window, only autocmd window would remain"
-msgstr "E814: อๅ โไเ๋๎๑ ็เ๊๐่๒่ โณ๊ํ๎, ็เ๋่๘่๋๎๑ แ ๒ณ๋๊่ โณ๊ํ๎ autocmd"
-
-#: ../window.c:2717
-msgid "E445: Other window contains changes"
-msgstr "E445: ำ ณํ๘๎์๓ โณ๊ํณ บ ็์ณํ่"
-
-# msgstr "E445: "
-#: ../window.c:4805
-msgid "E446: No file name under cursor"
-msgstr "E446: อๅ์เบ ํเ็โ่ ๔เ้๋๓ ํเไ ๊๓๐๑๎๐๎์"
-
-#~ msgid "E831: bf_key_init() called with empty password"
-#~ msgstr "E831: ย่๊๋่๊เํ๎ bf_key_init() ็ ๏๎๐๎ๆํณ์ ๏เ๐๎๋ๅ์"
-
-#~ msgid "E820: sizeof(uint32_t) != 4"
-#~ msgstr "E820: sizeof(uint32_t) != 4"
-
-#~ msgid "E817: Blowfish big/little endian use wrong"
-#~ msgstr "E817: อๅ๏๐เโ่๋ํๅ โ่๊๎๐่๑๒เํํ ๏๎๐ไ๊๓ แเ้๒ณโ Blowfish (BE/LE)"
-
-#~ msgid "E818: sha256 test failed"
-#~ msgstr "E818: อๅ ๏๐๎้๘๋เ ๏ๅ๐ๅโณ๐๊เ sha256"
-
-#~ msgid "E819: Blowfish test failed"
-#~ msgstr "E819: อๅ ๏๐๎้๘๋เ ๏ๅ๐ๅโณ๐๊เ Blowfish"
-
-#~ msgid "Patch file"
-#~ msgstr "หเ๒๊เ"
-
-#~ msgid ""
-#~ "&OK\n"
-#~ "&Cancel"
-#~ msgstr ""
-#~ "&O:รเ๐เ็ไ\n"
-#~ "&C:ั๊เ๑๓โเ๒่"
-
-#~ msgid "E240: No connection to Vim server"
-#~ msgstr "E240: อๅ์เบ ็'บไํเํํ ณ็ ๑ๅ๐โๅ๐๎์ Vim"
-
-#~ msgid "E241: Unable to send to %s"
-#~ msgstr "E241: อๅ โไเ๋๎๑ โณไณ๑๋เ๒่ ไ๎ %s"
-
-#~ msgid "E277: Unable to read a server reply"
-#~ msgstr "E277: อๅ โไเ๋๎๑ ๏๐๎๗่๒เ๒่ โณไ๏๎โณไ ๑ๅ๐โๅ๐เ"
-
-#~ msgid "E258: Unable to send to client"
-#~ msgstr "E258: อๅ โไเ๋๎๑ ํเไณ๑๋เ๒่ ๊๋ณบํ๒๓"
-
-#~ msgid "Save As"
-#~ msgstr "วแๅ๐ๅใ๒่ ๊"
-
-#~ msgid "Source Vim script"
-#~ msgstr "ฯ๐๎๗่๒เ๒่ ๑๊๐่๏๒ Vim"
-
-#~ msgid "Edit File"
-#~ msgstr "ะๅไเใ๓โเ๒่ ิเ้๋"
-
-#~ msgid " (NOT FOUND)"
-#~ msgstr " (อล วอภษฤลอฮ)"
-
-#~ msgid "unknown"
-#~ msgstr "อๅโณไ๎์๎"
-
-# msgstr "E185: "
-#~ msgid "Edit File in new window"
-#~ msgstr "ะๅไเใ๓โเ๒่ ๔เ้๋ ๓ ํ๎โ๎์๓ โณ๊ํณ"
-
-#~ msgid "Append File"
-#~ msgstr "ฤ๎๏่๑เ๒่ ๔เ้๋"
-
-# msgstr "E187: "
-#~ msgid "Window position: X %d, Y %d"
-#~ msgstr "ฯ๎็่๖ณ โณ๊ํเ: X %d, Y %d"
-
-# msgstr "E188: "
-#~ msgid "Save Redirection"
-#~ msgstr "วแๅ๐ๅใ๒่ ๏ๅ๐ๅเไ๐ๅ๑๎โเํ่้ โ่โณไ"
-
-#~ msgid "Save View"
-#~ msgstr "วแๅ๐ๅใ๒่ โ่ใ๋ไ"
-
-#~ msgid "Save Session"
-#~ msgstr "วแๅ๐ๅใ๒่ ๑ๅเํ๑"
-
-#~ msgid "Save Setup"
-#~ msgstr "วแๅ๐ๅใ๒่ ํเ๋เ๘๒๓โเํํ"
-
-#~ msgid "E809: #< is not available without the +eval feature"
-#~ msgstr "E809: #< ํๅ ไ๎๑๒๓๏ํเ แๅ็ ์๎ๆ๋่โ๎๑๒ณ +eval"
-
-#~ msgid "E196: No digraphs in this version"
-#~ msgstr "E196: ำ ๖ณ้ โๅ๐๑ณฟ ํๅ์เบ ไ่ใ๐เ๔ณโ"
-
-#~ msgid "is a device (disabled with 'opendevice' option)"
-#~ msgstr "บ ๏๐่๑๒๐๎บ์ (โ่์๊ํๅํ๎ ๎๏๖ณบ 'opendevice')"
-
-#~ msgid "Reading from stdin..."
-#~ msgstr "ื่๒เบ๒๑ ็ stdin..."
-
-#~ msgid "[blowfish]"
-#~ msgstr "[blowfish]"
-
-#~ msgid "[crypted]"
-#~ msgstr "[็เ๘่๔๐๎โเํ๎]"
-
-#~ msgid "E821: File is encrypted with unknown method"
-#~ msgstr "E821: ิเ้๋ ็เ๘่๔๐๎โเํ๎ ํๅโณไ๎์่์ ์ๅ๒๎ไ๎์"
-
-#~ msgid "NetBeans disallows writes of unmodified buffers"
-#~ msgstr "NetBeans ํๅ ไ๎็โ๎๋บ ็เ๏่๑๓โเ๒่ ๓ ํๅ็์ณํๅํณ แ๓๔ๅ๐่"
-
-# msgstr "E391: "
-#~ msgid "Partial writes disallowed for NetBeans buffers"
-#~ msgstr "ืเ๑๒๊๎โณ ็เ๏่๑่ ็เแ๎๐๎ํๅํณ ไ๋ แ๓๔ๅ๐ณโ NetBeans"
-
-#~ msgid "writing to device disabled with 'opendevice' option"
-#~ msgstr "วเ๏่๑ ไ๎ ๏๐่๑๒๐๎ ็เแ๎๐๎ํๅํ๎ ๎๏๖ณบ 'opendevice'"
-
-#~ msgid "E460: The resource fork would be lost (add ! to override)"
-#~ msgstr "E460: รณ๋๊๓ ๐ๅ๑๓๐๑ณโ ์๎ๆํเ โ๒๐เ๒่๒่ (! ๙๎แ ํๅ ็โเๆเ๒่)"
-
-#~ msgid "<cannot open> "
-#~ msgstr "<ํๅ โณไ๊๐่โเบ๒๑> "
-
-#~ msgid "E616: vim_SelFile: can't get font %s"
-#~ msgstr "E616: vim_SelFile: ํๅ โไเ๋๎๑ ๎๒๐่์เ๒่ ๘๐่๔๒ %s"
-
-#~ msgid "E614: vim_SelFile: can't return to current directory"
-#~ msgstr "E614: vim_SelFile: ํๅ โไเ๋๎๑ ๏๎โๅ๐ํ๓๒่๑ โ ๏๎๒๎๗ํ่้ ๊เ๒เ๋๎ใ"
-
-#~ msgid "Pathname:"
-#~ msgstr "ุ๋๕:"
-
-#~ msgid "E615: vim_SelFile: can't get current directory"
-#~ msgstr "E615: vim_SelFile: ํๅ โไเ๋๎๑ ๎๒๐่์เ๒่ ๏๎๒๎๗ํ่้ ๊เ๒เ๋๎ใ"
-
-#~ msgid "OK"
-#~ msgstr "รเ๐เ็ไ"
-
-#~ msgid "Cancel"
-#~ msgstr "ั๊เ๑๓โเ๒่"
-
-#~ msgid "Vim dialog"
-#~ msgstr "ฤณเ๋๎ใ Vim"
-
-#~ msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
-#~ msgstr "Scrollbar Widget: อๅ โไเ๋๎๑ โ่็ํเ๗่๒่ ๐๎็์ณ๐ ๑๊๎๐๎๗ๅํ๎ฟ ๊เ๐๒่ํ๊่."
-
-#~ msgid "E232: Cannot create BalloonEval with both message and callback"
-#~ msgstr "E232: อๅ โไเ๋๎๑ ๑๒โ๎๐่๒่ BalloonEval ็ ๏๎โณไ๎์๋ๅํํ์ ณ ๔๓ํ๊๖ณบ"
-
-#~ msgid "E851: Failed to create a new process for the GUI"
-#~ msgstr "E851: อๅ โไเ๋๎๑ ๑๒โ๎๐่๒่ ํ๎โ่้ ๏๐๎๖ๅ๑ ไ๋ GUI"
-
-#~ msgid "E852: The child process failed to start the GUI"
-#~ msgstr "E852: ฤ๎๗ณ๐ํณ้ ๏๐๎๖ๅ๑ ํๅ ็์ณใ ็เ๏๓๑๒่๒่ GUI"
-
-# msgstr "E228: "
-#~ msgid "E229: Cannot start the GUI"
-#~ msgstr "E229: อๅ โไเ๋๎๑ ็เ๏๓๑๒่๒่ GUI"
-
-# msgstr "E229: "
-#~ msgid "E230: Cannot read from \"%s\""
-#~ msgstr "E230: อๅ โไเ๋๎๑ ๏๐๎๗่๒เ๒่ ็ ซ%sป"
-
-#~ msgid "E665: Cannot start GUI, no valid font found"
-#~ msgstr "E665: อๅ โไเ๋๎๑ ็เ๏๓๑๒่๒่ GUI, ํๅ ็ํเ้ไๅํ๎ ๘๐่๔๒"
-
-# msgstr "E230: "
-#~ msgid "E231: 'guifontwide' invalid"
-#~ msgstr "E231: อๅ๊๎๐ๅ๊๒ํ่้ 'guifontwide'"
-
-#~ msgid "E599: Value of 'imactivatekey' is invalid"
-#~ msgstr "E599: วํเ๗ๅํํ 'imactivatekey' ํๅ๊๎๐ๅ๊๒ํๅ"
-
-#~ msgid "E254: Cannot allocate color %s"
-#~ msgstr "E254: อๅ โไเ๋๎๑ ๎๒๐่์เ๒่ ๊๎๋ณ๐ %s"
-
-#~ msgid "No match at cursor, finding next"
-#~ msgstr "อๅ์เบ ํเไ ๊๓๐๑๎๐๎์, ๏๎๘๓๊ ๒๐่โเบ"
-
-#~ msgid "Input _Methods"
-#~ msgstr "ฬๅ๒๎ไ่ โโๅไๅํํ"
-
-#~ msgid "VIM - Search and Replace..."
-#~ msgstr "VIM - วํเ้๒่ ้ ็เ์ณํ่๒่..."
-
-#~ msgid "VIM - Search..."
-#~ msgstr "VIM - ฯ๎๘๓๊..."
-
-#~ msgid "Find what:"
-#~ msgstr "วํเ้๒่:"
-
-#~ msgid "Replace with:"
-#~ msgstr "วเ์ณํ่๒่ ํเ:"
-
-#~ msgid "Match whole word only"
-#~ msgstr "ห่๘ๅ ๏๎โํๅ ๑๋๎โ๎"
-
-#~ msgid "Match case"
-#~ msgstr "วโเๆเ๒่ ํเ ๐ๅใณ๑๒๐"
-
-#~ msgid "Direction"
-#~ msgstr "อเ๏๐์"
-
-#~ msgid "Up"
-#~ msgstr "ยใ๎๐๓"
-
-#~ msgid "Down"
-#~ msgstr "ำํ่็"
-
-#~ msgid "Find Next"
-#~ msgstr "อเ๑๒๓๏ํๅ"
-
-#~ msgid "Replace"
-#~ msgstr "วเ์ณํ่๒่"
-
-#~ msgid "Replace All"
-#~ msgstr "วเ์ณํ่๒่ ๓๑ณ"
-
-#~ msgid "Vim: Received \"die\" request from session manager\n"
-#~ msgstr "Vim: ฮ๒๐่์เโ ็เ๏่๒ ซdieป โณไ ์ๅํๅไๆๅ๐เ ๑ๅ๑ณ้\n"
-
-#~ msgid "Close"
-#~ msgstr "วเ๊๐่๒่"
-
-#~ msgid "New tab"
-#~ msgstr "อ๎โเ โ๊๋เไ๊เ"
-
-#~ msgid "Open Tab..."
-#~ msgstr "ยณไ๊๐่๒่ โ๊๋เไ๊๓..."
-
-#~ msgid "Vim: Main window unexpectedly destroyed\n"
-#~ msgstr "Vim: อๅ๑๏๎ไณโเํ๎ ็ํ่๙่๋๎๑ ใ๎๋๎โํๅ โณ๊ํ๎\n"
-
-#~ msgid "&Filter"
-#~ msgstr "&F:ิณ๋๒๐๓โเ๒่"
-
-#~ msgid "&Cancel"
-#~ msgstr "&C:ั๊เ๑๓โเ๒่"
-
-#~ msgid "Directories"
-#~ msgstr "สเ๒เ๋๎ใ่"
-
-#~ msgid "Filter"
-#~ msgstr "ิณ๋๒๐"
-
-#~ msgid "&Help"
-#~ msgstr "&H:ฤ๎๏๎์๎ใเ"
-
-#~ msgid "Files"
-#~ msgstr "ิเ้๋่"
-
-#~ msgid "&OK"
-#~ msgstr "&O:รเ๐เ็ไ"
-
-#~ msgid "Selection"
-#~ msgstr "ย่ไณ๋ๅํํ"
-
-#~ msgid "Find &Next"
-#~ msgstr "&N:วํเ้๒่ ไเ๋ณ"
-
-#~ msgid "&Replace"
-#~ msgstr "&R:วเ์ณํ่๒่"
-
-#~ msgid "Replace &All"
-#~ msgstr "&A:วเ์ณํ่๒่ ๓๑ณ"
-
-#~ msgid "&Undo"
-#~ msgstr "&U:ั๊เ๑๓โเ๒่"
-
-#~ msgid "E671: Cannot find window title \"%s\""
-#~ msgstr "E671: อๅ โไเ๋๎๑ ็ํเ้๒่ โณ๊ํ๎ ซ%sป"
-
-#~ msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
-#~ msgstr "E243: ภ๐ใ๓์ๅํ๒ ํๅ ๏ณไ๒๐่์๓บ๒๑: ซ-%sป; ๊๎๐่๑๒๓้๒ๅ๑ โๅ๐๑ณบ ็ OLE."
-
-#~ msgid "E672: Unable to open window inside MDI application"
-#~ msgstr "E672: อๅ โไเ๋๎๑ โณไ๊๐่๒่ โณ๊ํ๎ โ๑ๅ๐ๅไ่ํณ ๏๐๎ใ๐เ์่ MDI"
-
-#~ msgid "Close tab"
-#~ msgstr "วเ๊๐่๒่ โ๊๋เไ๊๓"
-
-#~ msgid "Open tab..."
-#~ msgstr "ยณไ๊๐่๒่ โ๊๋เไ๊๓..."
-
-# msgstr "E245: "
-#~ msgid "Find string (use '\\\\' to find a '\\')"
-#~ msgstr "วํเ้๒่ ๐ไ๎๊ ('\\\\' ๙๎แ ็ํเ้๒่ '\\')"
-
-#~ msgid "Find & Replace (use '\\\\' to find a '\\')"
-#~ msgstr "วํเ้๒่ ณ ็เ์ณํ่๒่ ('\\\\' ๙๎แ ็ํเ้๒่ '\\')"
-
-#~ msgid "Not Used"
-#~ msgstr "อๅ์เบ"
-
-#~ msgid "Directory\t*.nothing\n"
-#~ msgstr "สเ๒เ๋๎ใ\t*.ํณ๗๎ใ๎\n"
-
-#~ msgid ""
-#~ "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
-#~ msgstr ""
-#~ "Vim E458: อๅ์เบ โณ๋ํ่๕ ๊๎์ณ๐๎๊ ๓ ๏เ๋ณ๒๐ณ, ไๅ๊ณ ๊๎๋๎๐่ ์๎ๆ๓๒ แ๓๒่ "
-#~ "ํๅ๏๐เโ่๋ํณ"
-
-#~ msgid "E250: Fonts for the following charsets are missing in fontset %s:"
-#~ msgstr "E250: ุ๐่๔๒่ ไ๋ ๖่๕ ๑่์โ๎๋ณโ โณไ๑๓๒ํณ ๓ ํเแ๎๐ณ %s:"
-
-# msgstr "E250: "
-#~ msgid "E252: Fontset name: %s"
-#~ msgstr "E252: อเ็โเ ํเแ๎๐๓ ๘๐่๔๒ณโ: %s"
-
-# msgstr "E252: "
-#~ msgid "Font '%s' is not fixed-width"
-#~ msgstr "ุ๐่๔๒ '%s' ํๅ บ ์๎ํ๎๘่๐่ํํ่์"
-
-#~ msgid "E253: Fontset name: %s"
-#~ msgstr "E253: อเ็โเ ํเแ๎๐๓ ๘๐่๔๒ณโ: %s"
-
-#~ msgid "Font0: %s"
-#~ msgstr "ุ๐่๔๒0: %s"
-
-#~ msgid "Font1: %s"
-#~ msgstr "ุ๐่๔๒1: %s"
-
-#~ msgid "Font%<PRId64> width is not twice that of font0"
-#~ msgstr "ุ่๐่ํเ ๘๐่๔๒๓%<PRId64> ํๅ แณ๋๘เ ๓ไโณ๗ณ ็เ ๘่๐่ํ๓ ๘๐่๔๒๓0"
-
-#~ msgid "Font0 width: %<PRId64>"
-#~ msgstr "ุ่๐่ํเ ๘๐่๔๒๓0: %<PRId64>"
-
-#~ msgid "Font1 width: %<PRId64>"
-#~ msgstr "ุ่๐่ํเ ๘๐่๔๒๓1: %<PRId64>"
-
-#~ msgid "Invalid font specification"
-#~ msgstr "อๅ๊๎๐ๅ๊๒ํเ ๑๏ๅ๖่๔ณ๊เ๖ณ ๘๐่๔๒๓"
-
-#~ msgid "&Dismiss"
-#~ msgstr "&D:ฯ๐่๏่ํ่๒่"
-
-#~ msgid "no specific match"
-#~ msgstr "ํๅ์เบ ๊๎ํ๊๐ๅ๒ํ๎ใ๎ ็แณใ๓"
-
-# msgstr "E234: "
-#~ msgid "Vim - Font Selector"
-#~ msgstr "Vim - ย่แณ๐ ๘๐่๔๒๓"
-
-#~ msgid "Name:"
-#~ msgstr "อเ็โเ:"
-
-#~ msgid "Show size in Points"
-#~ msgstr "ฯ๎๊เ็เ๒่ ๐๎็์ณ๐ ๓ ๏๓ํ๊๒เ๕"
-
-#~ msgid "Encoding:"
-#~ msgstr "ส๎ไ๓โเํํ:"
-
-#~ msgid "Font:"
-#~ msgstr "ุ๐่๔๒:"
-
-#~ msgid "Style:"
-#~ msgstr "ั๒่๋:"
-
-#~ msgid "Size:"
-#~ msgstr "ะ๎็์ณ๐:"
-
-#~ msgid "E256: Hangul automata ERROR"
-#~ msgstr "E256: ฯ๎์่๋๊เ เโ๒๎์เ๒๓ Hangul"
-
-#~ msgid "E563: stat error"
-#~ msgstr "E563: ๏๎์่๋๊เ stat"
-
-#~ msgid "E625: cannot open cscope database: %s"
-#~ msgstr "E625: อๅ โไเ๋๎๑ โณไ๊๐่๒่ แเ็๓ ไเํ่๕ cscope: %s"
-
-#~ msgid "E626: cannot get cscope database information"
-#~ msgstr "E626: อๅ โไเ๋๎๑ ๎๒๐่์เ๒่ ณํ๔๎๐์เ๖ณ ็ แเ็่ ไเํ่๕ cscope"
-
-#~ msgid "Lua library cannot be loaded."
-#~ msgstr "อๅ โไเ๋๎๑ ็เโเํ๒เๆ่๒่ แณแ๋ณ๎๒ๅ๊๓ Lua"
-
-#~ msgid "cannot save undo information"
-#~ msgstr "ํๅ โไเ๋๎๑ ็แๅ๐ๅใ๒่ ณํ๔๎๐์เ๖ณ ไ๋ ๑๊เ๑๓โเํํ"
-
-#~ msgid ""
-#~ "E815: Sorry, this command is disabled, the MzScheme libraries could not "
-#~ "be loaded."
-#~ msgstr ""
-#~ "E815: ย่แเ๗๒ๅ, ๖ ๊๎์เํไเ โ่์๊ํๅํเ, แณแ๋ณ๎๒ๅ๊่ MzScheme ํๅ ์๎ๆ๓๒ แ๓๒่ "
-#~ "็เโเํ๒เๆๅํณ."
-
-#~ msgid "invalid expression"
-#~ msgstr "ํๅ๊๎๐ๅ๊๒ํ่้ โ่๐เ็"
-
-#~ msgid "expressions disabled at compile time"
-#~ msgstr "๎แ๐๎แ๊๓ โ่๐เ็ณโ โ่์๊ํๅํ๎ ๏ณไ ๗เ๑ ๊๎์๏ณ๋๖ณฟ"
-
-#~ msgid "hidden option"
-#~ msgstr "๏๐่๕๎โเํเ ๎๏๖ณ"
-
-#~ msgid "unknown option"
-#~ msgstr "ํๅโณไ๎์เ ๎๏๖ณ"
-
-#~ msgid "window index is out of range"
-#~ msgstr "ํๅ๊๎๐ๅ๊๒ํ่้ ํ๎์ๅ๐ โณ๊ํเ"
-
-#~ msgid "couldn't open buffer"
-#~ msgstr "ํๅ โไเ๋๎๑ โณไ๊๐่๒่ แ๓๔ๅ๐"
-
-#~ msgid "cannot delete line"
-#~ msgstr "ํๅ์๎ๆ๋่โ๎ ็ํ่๙่๒่ ๐ไ๎๊"
-
-#~ msgid "cannot replace line"
-#~ msgstr "ํๅ์๎ๆ๋่โ๎ ็เ์ณํ่๒่ ๐ไ๎๊"
-
-#~ msgid "cannot insert line"
-#~ msgstr "ํๅ โไเ๋๎๑ โ๑๒เโ่๒่ ๐ไ๎๊"
-
-#~ msgid "string cannot contain newlines"
-#~ msgstr "แณ๋๘ๅ ํณๆ ๎ไ่ํ ๐ไ๎๊"
-
-#~ msgid "error converting Scheme values to Vim"
-#~ msgstr "ํๅ โไเ๋๎๑ ๏ๅ๐ๅ๒โ๎๐่๒่ ็ํเ๗ๅํํ Scheme ๓ Vim"
-
-#~ msgid "Vim error: ~a"
-#~ msgstr "ฯ๎์่๋๊เ Vim: ~a"
-
-#~ msgid "Vim error"
-#~ msgstr "ฯ๎์่๋๊เ Vim"
-
-#~ msgid "buffer is invalid"
-#~ msgstr "แ๓๔ๅ๐ ํๅ๏๐่ไเ๒ํ่้"
-
-#~ msgid "window is invalid"
-#~ msgstr "โณ๊ํ๎ ํๅ๏๐่ไเ๒ํๅ"
-
-#~ msgid "linenr out of range"
-#~ msgstr "ํ๎์ๅ๐ ๐ไ๊เ ็เ ์ๅๆเ์่ ๔เ้๋๓"
-
-#~ msgid "not allowed in the Vim sandbox"
-#~ msgstr "ํๅ ไ๎็โ๎๋ๅํ๎ ๓ ๏ณ๑๎๗ํ่๖ณ Vim"
-
-#~ msgid "E837: This Vim cannot execute :py3 after using :python"
-#~ msgstr "E837: Python: อๅ ์๎ๆํเ โ่๊๎๐่๑๒เ๒่ :py ณ :py3 โ ๎ไํ๎์๓ ๑ๅเํ๑ณ"
-
-#~ msgid ""
-#~ "E263: Sorry, this command is disabled, the Python library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E263: ย่แเ๗๒ๅ, ๖ ๊๎์เํไเ โ่์๊ํๅํเ, แณแ๋ณ๎๒ๅ๊เ Python ํๅ ์๎ๆๅ แ๓๒่ "
-#~ "็เโเํ๒เๆๅํเ."
-
-#~ msgid "E836: This Vim cannot execute :python after using :py3"
-#~ msgstr "E836: Python: อๅ ์๎ๆํเ โ่๊๎๐่๑๒เ๒่ :py ณ :py3 โ ๎ไํ๎์๓ ๑ๅเํ๑ณ"
-
-#~ msgid "E659: Cannot invoke Python recursively"
-#~ msgstr "E659: อๅ ์๎ๆํเ ๐ๅ๊๓๐๑่โํ๎ โ่๊๋่๊เ๒่ Python"
-
-#~ msgid "E265: $_ must be an instance of String"
-#~ msgstr "E265: $_ ์เบ แ๓๒่ ๅ๊็ๅ์๏๋๐๎์ String"
-
-#~ msgid ""
-#~ "E266: Sorry, this command is disabled, the Ruby library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E266: ย่แเ๗๒ๅ, ๖ ๊๎์เํไเ โ่์๊ํๅํเ, แณแ๋ณ๎๒ๅ๊เ Ruby ํๅ ์๎ๆๅ แ๓๒่ "
-#~ "็เโเํ๒เๆๅํเ."
-
-# msgstr "E414: "
-#~ msgid "E267: unexpected return"
-#~ msgstr "E267: ํๅ๑๏๎ไณโเํ่้ return"
-
-#~ msgid "E268: unexpected next"
-#~ msgstr "E268: ํๅ๑๏๎ไณโเํ่้ next"
-
-#~ msgid "E269: unexpected break"
-#~ msgstr "E269: ํๅ๑๏๎ไณโเํ่้ break"
-
-#~ msgid "E270: unexpected redo"
-#~ msgstr "E270: ํๅ๑๏๎ไณโเํ่้ redo"
-
-#~ msgid "E271: retry outside of rescue clause"
-#~ msgstr "E271: retry ๏๎็เ rescue"
-
-#~ msgid "E272: unhandled exception"
-#~ msgstr "E272: อๅ๎แ๐๎แ๋ๅํ่้ โ่ํ๒๎๊"
-
-# msgstr "E233: "
-#~ msgid "E273: unknown longjmp status %d"
-#~ msgstr "E273: อๅโณไ๎์่้ ๑๒เ๒๓๑ longjmp: %d"
-
-#~ msgid "Toggle implementation/definition"
-#~ msgstr "ฯๅ๐ๅ์๊ํ๓๒่ ๐ๅเ๋ณ็เ๖ณ/โ่็ํเ๗ๅํํ"
-
-#~ msgid "Show base class of"
-#~ msgstr "วํเ้๒่ แเ็๎โ่้ ๊๋เ๑"
-
-#~ msgid "Show overridden member function"
-#~ msgstr "ฯ๎๊เ็เ๒่ ็เ์ณํๅํณ ๔๓ํ๊๖ณฟ-๗๋ๅํ่"
-
-#~ msgid "Retrieve from file"
-#~ msgstr "ฯ๐๎๗่๒เ๒่ ็ ๔เ้๋๓"
-
-#~ msgid "Retrieve from project"
-#~ msgstr "ฮ๒๐่์เ๒่ ็ ๏๐๎ๅ๊๒๓"
-
-#~ msgid "Retrieve from all projects"
-#~ msgstr "ฮ๒๐่์เ๒่ ็ ๓๑ณ๕ ๏๐๎ๅ๊๒ณโ"
-
-#~ msgid "Retrieve"
-#~ msgstr "ฮ๒๐่์เ๒่"
-
-#~ msgid "Show source of"
-#~ msgstr "ฤๆๅ๐ๅ๋๎"
-
-#~ msgid "Find symbol"
-#~ msgstr "วํเ้๒่ ๑่์โ๎๋"
-
-#~ msgid "Browse class"
-#~ msgstr "ฯๅ๐ๅใ๋ํ๓๒่ ๊๋เ๑"
-
-#~ msgid "Show class in hierarchy"
-#~ msgstr "ฯ๎๊เ็เ๒่ ๊๋เ๑ โ ณบ๐เ๐๕ณฟ"
-
-#~ msgid "Show class in restricted hierarchy"
-#~ msgstr "ฯ๎๊เ็เ๒่ ๊๋เ๑ โ ๎แ์ๅๆๅํณ้ ณบ๐เ๐๕ณฟ"
-
-#~ msgid "Xref refers to"
-#~ msgstr "Xref โ๊เ็๓บ ํเ"
-
-#~ msgid "Xref referred by"
-#~ msgstr "อเ Xref โ๊เ็เํ๎ ็"
-
-#~ msgid "Xref has a"
-#~ msgstr "Xref ์เบ"
-
-#~ msgid "Xref used by"
-#~ msgstr "Xref โ่๊๎๐่๑๒เํ๎"
-
-#~ msgid "Show docu of"
-#~ msgstr "ฯ๎๊เ็เ๒่ docu"
-
-#~ msgid "Generate docu for"
-#~ msgstr "ั๒โ๎๐่๒่ docu ไ๋"
-
-#~ msgid ""
-#~ "Cannot connect to SNiFF+. Check environment (sniffemacs must be found in "
-#~ "$PATH).\n"
-#~ msgstr ""
-#~ "อๅ โไเ๋๎๑ ็'บไํเ๒่๑ ็ณ SNiFF+. ฯๅ๐ๅโณ๐๒ๅ ๎๒๎๗ๅํํ (sniffemacs ์เบ แ๓๒่ "
-#~ "๓ $PATH).\n"
-
-#~ msgid "E274: Sniff: Error during read. Disconnected"
-#~ msgstr "E274: Sniff: ฯ๎์่๋๊เ ๏ณไ ๗เ๑ ๗่๒เํํ. ยณไ'บไํเํ๎"
-
-#~ msgid "SNiFF+ is currently "
-#~ msgstr "SNiFF+ ็เ๐เ็ "
-
-#~ msgid "not "
-#~ msgstr "ํๅ "
-
-#~ msgid "connected"
-#~ msgstr "๏ณไ'บไํเํ่้"
-
-#~ msgid "E275: Unknown SNiFF+ request: %s"
-#~ msgstr "E275: อๅโณไ๎์่้ ็เ๏่๒ ไ๎ SNiFF+: %s"
-
-#~ msgid "E276: Error connecting to SNiFF+"
-#~ msgstr "E276: ฯ๎์่๋๊เ ็'บไํเํํ ไ๎ SNiFF+"
-
-#~ msgid "E278: SNiFF+ not connected"
-#~ msgstr "E278: SNiFF+ ํๅ ๏ณไ'บไํเํ๎"
-
-#~ msgid "E279: Not a SNiFF+ buffer"
-#~ msgstr "E279: อๅ บ แ๓๔ๅ๐๎์ SNiFF+"
-
-#~ msgid "Sniff: Error during write. Disconnected"
-#~ msgstr "Sniff: ฯ๎์่๋๊เ ็เ๏่๑๓. ยณไ'บไํเํ๎"
-
-#~ msgid "invalid buffer number"
-#~ msgstr "ํๅ๏๐เโ่๋ํเ ํเ็โเ แ๓๔ๅ๐เ"
-
-#~ msgid "not implemented yet"
-#~ msgstr "๙ๅ ํๅ ๐ๅเ๋ณ็๎โเํ๎"
-
-#~ msgid "cannot set line(s)"
-#~ msgstr "ํๅ โไเ๋๎๑ โ๑๒เํ๎โ่๒่ ๐ไ๊่"
-
-#~ msgid "invalid mark name"
-#~ msgstr "ํๅ๏๐เโ่๋ํเ ํเ็โเ ๏๎็ํเ๗๊่"
-
-# msgstr "E19: "
-#~ msgid "mark not set"
-#~ msgstr "๏๎์ณ๒๊๓ ํๅ โ๊เ็เํ๎"
-
-#~ msgid "row %d column %d"
-#~ msgstr "๐ไ๎๊ %d ๊๎๋๎ํ๊เ %d"
-
-#~ msgid "cannot insert/append line"
-#~ msgstr "อๅ โไเ๋๎๑ โ๑๒เโ่๒่/ไ๎ไเ๒่ ๐ไ๎๊"
-
-#~ msgid "line number out of range"
-#~ msgstr "ํ๎์ๅ๐ ๐ไ๊เ ็เ ์ๅๆเ์่ ๔เ้๋๓"
-
-#~ msgid "unknown flag: "
-#~ msgstr "ํๅโณไ๎์่้ ๏๐เ๏๎๐ๅ๖: "
-
-#~ msgid "unknown vimOption"
-#~ msgstr "อๅโณไ๎์เ vimOption"
-
-#~ msgid "keyboard interrupt"
-#~ msgstr "๏ๅ๐ๅ๐โเํ๎ ็ ๊๋เโณเ๒๓๐่"
-
-#~ msgid "vim error"
-#~ msgstr "๏๎์่๋๊เ Vim"
-
-#~ msgid "cannot create buffer/window command: object is being deleted"
-#~ msgstr "ํๅ โไเ๋๎๑ ๑๒โ๎๐่๒่ ๊๎์เํไ๓ โณ๊ํเ/แ๓๔ๅ๐เ: ๎แ'บ๊๒ ็ํ่๙๓บ๒๑"
-
-#~ msgid ""
-#~ "cannot register callback command: buffer/window is already being deleted"
-#~ msgstr "อๅ โไเ๋๎๑ ็เ๐ๅบ๑๒๐๓โเ๒่ ๏๎ไณ: แ๓๔ๅ๐/โณ๊ํ๎ ๓ๆๅ ็ํ่๙๓บ๒๑"
-
-#~ msgid ""
-#~ "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-"
-#~ "dev@vim.org"
-#~ msgstr ""
-#~ "E280: ิภาภหอภ ฯฮฬศหสภ TCL: ์๎ๆ๋่โ๎ ๏๎๘๊๎ไๆๅํ๎ ๑๏่๑๎๊ ๏๎๑่๋เํ!? ม๓ไ "
-#~ "๋เ๑๊เ, ๏๎โณไ๎์๒ๅ ๓ vim-dev@vim.org"
-
-#~ msgid "cannot register callback command: buffer/window reference not found"
-#~ msgstr ""
-#~ "อๅ โไเ๋๎๑ ็เ๐ๅบ๑๒๐๓โเ๒่ ๊๎์เํไ๓ ๏๎ไณฟ: ๏๎๑่๋เํํ ํเ แ๓๔ๅ๐/โณ๊ํ๎ ํๅ "
-#~ "็ํเ้ไๅํ๎"
-
-#~ msgid ""
-#~ "E571: Sorry, this command is disabled: the Tcl library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E571: ย่แเ๗๒ๅ, ๖ ๊๎์เํไเ โ่์๊ํๅํเ, แณแ๋ณ๎๒ๅ๊เ Tcl ํๅ ์๎ๆๅ แ๓๒่ "
-#~ "็เโเํ๒เๆๅํเ."
-
-#~ msgid "E572: exit code %d"
-#~ msgstr "E572: ส๎ไ โ่๕๎ไ๓ %d"
-
-#~ msgid "cannot get line"
-#~ msgstr "ํๅ โไเ๋๎๑ ไณ๑๒เ๒่ ๐ไ๎๊"
-
-#~ msgid "Unable to register a command server name"
-#~ msgstr "อๅ โไเ๋๎๑ ็เ๐ๅบ๑๒๐๓โเ๒่ ํเ็โ๓ ๑ๅ๐โๅ๐เ ๊๎์เํไ"
-
-#~ msgid "E248: Failed to send command to the destination program"
-#~ msgstr "E248: อๅ โไเ๋๎๑ โณไณ๑๋เ๒่ ๊๎์เํไ๓ ไ๎ ๏๐๎ใ๐เ์่-๖ณ๋ณ"
-
-#~ msgid "E573: Invalid server id used: %s"
-#~ msgstr "E573: ย่๊๎๐่๑๒เํ๎ ํๅ๊๎๐ๅ๊๒ํ่้ ณไๅํ๒่๔ณ๊เ๒๎๐ ๑ๅ๐โๅ๐เ: %s"
-
-#~ msgid "E251: VIM instance registry property is badly formed. Deleted!"
-#~ msgstr ""
-#~ "E251: ะๅ๊โณ็่๒ ๐ๅบ๑๒๐๓ ็๐เ็๊๓ VIM ๑๔๎๐์๎โเํ่้ ํๅ๏๐เโ่๋ํ๎. วํ่๙ๅํ๎!"
-
-#~ msgid "netbeans is not supported with this GUI\n"
-#~ msgstr "netbeans ํๅ ๏ณไ๒๐่์๓บ๒๑ ็ ๖่์ GUI\n"
-
-#~ msgid "This Vim was not compiled with the diff feature."
-#~ msgstr "ึ โๅ๐๑ณ Vim ํๅ แ๓๋เ ๑๊๎์๏ณ๋๎โเํเ ็ ๏ณไ๒๐่์๊๎ ๏๎๐ณโํํํ."
-
-#~ msgid "'-nb' cannot be used: not enabled at compile time\n"
-#~ msgstr "อๅ ์๎ๆํเ โ่๊๎๐่๑๒เ๒่ '-nb': ํๅ ไ๎็โ๎๋ๅํ๎ ๏ณไ ๗เ๑ ๊๎์๏ณ๋๖ณฟ\n"
-
-#~ msgid "Vim: Error: Failure to start gvim from NetBeans\n"
-#~ msgstr "Vim: ฯ๎์่๋๊เ: อๅ โไเ๋๎๑ ็เ๏๓๑๒่๒่ gvim ไ๋ NetBeans\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Where case is ignored prepend / to make flag upper case"
-#~ msgstr ""
-#~ "\n"
-#~ "฿๊๙๎ ๐ๅใณ๑๒๐ ณใํ๎๐๓บ๒๑, ไ๎ไเ้๒ๅ / ๑๏ๅ๐ๅไ๓ ๙๎แ ๏๐เ๏๎๐ๅ๖ แ๓โ ๓ โๅ๐๕ํ๎์๓ "
-#~ "๐ๅใณ๑๒๐ณ."
-
-#~ msgid "-register\t\tRegister this gvim for OLE"
-#~ msgstr "-register\t\tวเ๐ๅบ๑๒๐๓โเ๒่ ๖ๅ้ gvim ไ๋ OLE"
-
-#~ msgid "-unregister\t\tUnregister gvim for OLE"
-#~ msgstr "-unregister\t\tั๊เ๑๓โเ๒่ ๐ๅบ๑๒๐เ๖ณ ๖๎ใ๎ gvim ไ๋ OLE"
-
-#~ msgid "-g\t\t\tRun using GUI (like \"gvim\")"
-#~ msgstr "-g\t\t\tวเ๏๓๑๒่๒่ GUI (ํณแ่ ซgvimป)"
-
-#~ msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
-#~ msgstr "-f ๗่ --nofork\tฯๅ๐ๅไํณ้ ๏๋เํ: ๒๐่์เ๒่ ๒ๅ๐์ณํเ๋ ๏ณ๑๋ ็เ๏๓๑๊๓ GUI"
-
-#~ msgid "-f\t\t\tDon't use newcli to open window"
-#~ msgstr "-f\t\t\tอๅ โ่๊๎๐่๑๒๎โ๓โเ๒่ newcli ไ๋ โณไ๊๐่๒๒ โณ๊ํเ"
-
-#~ msgid "-dev <device>\t\tUse <device> for I/O"
-#~ msgstr "-dev <๏๐่๑๒๐ณ้>\t\t\tย่๊๎๐่๑๒๎โ๓โเ๒่ <๏๐่๑๒๐ณ้> ไ๋ โโ๎ไ๓/โ่โ๎ไ๓"
-
-#~ msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
-#~ msgstr "-u <gvimrc>\t\tย่๊๎๐่๑๒เ๒่ ๏๎ไเํ่้ ๔เ้๋ ็เ์ณ๑๒ .gvimrc"
-
-#~ msgid "-x\t\t\tEdit encrypted files"
-#~ msgstr "-x\t\t\tะๅไเใ๓โเ๒่ ็เ๘่๔๐๎โเํณ ๔เ้๋่"
-
-#~ msgid "-display <display>\tConnect vim to this particular X-server"
-#~ msgstr "-display <ไ่๑๏๋ๅ้>\tฯณไ'บไํเ๒่ vim ไ๎ ็เไเํ๎ใ๎ ไ่๑๏๋ๅ ๑ๅ๐โๅ๐เ X"
-
-#~ msgid "-X\t\t\tDo not connect to X server"
-#~ msgstr "-X\t\t\tอๅ ็'บไํ๓โเ๒่๑ ็ X ๑ๅ๐โๅ๐๎์"
-
-#~ msgid "--remote <files>\tEdit <files> in a Vim server if possible"
-#~ msgstr ""
-#~ "--remote <๔เ้๋่>\tะๅไเใ๓โเ๒่ <๔เ้๋่> ํเ ๑ๅ๐โๅ๐ณ Vim, ๊๙๎ ๖ๅ ์๎ๆ๋่โ๎"
-
-#~ msgid "--remote-silent <files> Same, don't complain if there is no server"
-#~ msgstr ""
-#~ "--remote-silent <๔เ้๋่> าๅ ๑เ์ๅ, ๒ณ๋๊่ ํๅ ๑๊เ๐ๆ่๒่๑ ํเ โณไ๑๓๒ํณ๑๒ "
-#~ "๑ๅ๐โๅ๐เ"
-
-#~ msgid ""
-#~ "--remote-wait <files> As --remote but wait for files to have been edited"
-#~ msgstr ""
-#~ "--remote-wait <๔เ้๋่> ..., เ๋ๅ ็เ๗ๅ๊เ๒่ ๏๎๊่ ๓๑ณ ๔เ้๋่ แ๓ไ๓๒ "
-#~ "โณไ๐ๅไเใ๎โเํณ"
-
-#~ msgid ""
-#~ "--remote-wait-silent <files> Same, don't complain if there is no server"
-#~ msgstr ""
-#~ "--remote-wait-silent <๔เ้๋่> าๅ ๑เ์ๅ, ๒ณ๋๊่ ํๅ ๑๊เ๐ๆ่๒่๑, ๊๙๎ ๑ๅ๐โๅ๐เ "
-#~ "ํๅ์เบ"
-
-#~ msgid ""
-#~ "--remote-tab[-wait][-silent] <files> As --remote but use tab page per "
-#~ "file"
-#~ msgstr ""
-#~ "--remote-tab[-wait][-silent] <๔เ้๋่> าเ๊ ๑เ์๎, ๊ --remote, เ๋ๅ ๏๎ "
-#~ "โ๊๋เไ๖ณ ํเ ๔เ้๋"
-
-#~ msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
-#~ msgstr ""
-#~ "--remote-send <๑่์โ๎๋่> ยณไณ๑๋เ๒่ <๑่์โ๎๋่> ๑ๅ๐โๅ๐๓ ณ ็เโๅ๐๘่๒่ ๐๎แ๎๒๓"
-
-#~ msgid ""
-#~ "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
-#~ msgstr ""
-#~ "--remote-expr <โ่๐เ็> ย่๊๎ํเ๒่ <โ่๐เ็> ๓ ๑ๅ๐โๅ๐ณ Vim ณ ํเไ๐๓๊๓โเ๒่ "
-#~ "๐ๅ็๓๋๒เ๒"
-
-#~ msgid "--serverlist\t\tList available Vim server names and exit"
-#~ msgstr ""
-#~ "--serverlist\t\tฯ๎๊เ็เ๒่ ๑๏่๑๎๊ ํเโํ่๕ ๑ๅ๐โๅ๐ณโ Vim ณ ็เโๅ๐๘่๒่ ๐๎แ๎๒๓"
-
-#~ msgid "--servername <name>\tSend to/become the Vim server <name>"
-#~ msgstr "--servername <ํเ็โเ>\tอเไณ๑๋เ๒่ ไ๎/๑๒เ๒่ Vim ๑ๅ๐โๅ๐๎์ ็ <ํเ็โ๎>"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Motif version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ภ๐ใ๓์ๅํ๒่ ไ๋ gvim (โๅ๐๑ณ Motif)\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (neXtaw version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ภ๐ใ๓์ๅํ๒่ ไ๋ gvim (โๅ๐๑ณ neXtaw):\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Athena version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ภ๐ใ๓์ๅํ๒่ ไ๋ gvim (โๅ๐๑ณ Athena)\n"
-
-#~ msgid "-display <display>\tRun vim on <display>"
-#~ msgstr "-display <ไ่๑๏๋ๅ้>\tย่๊๎ํเ๒่ vim ํเ ็เไเํ๎์๓ <ไ่๑๏๋ๅฟ>"
-
-#~ msgid "-iconic\t\tStart vim iconified"
-#~ msgstr "-iconic\t\tวเ๏๓๑๒่๒่ Vim ณ ็ใ๎๐ํ๓๒่ ้๎ใ๎ โณ๊ํ๎"
-
-#~ msgid "-background <color>\tUse <color> for the background (also: -bg)"
-#~ msgstr "-background <๊๎๋ณ๐>\tย่๊๎๐่๑๒เ๒่ <๊๎๋ณ๐> ไ๋ ๔๎ํ๓ (๒เ๊๎ๆ: -bg)"
-
-#~ msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
-#~ msgstr ""
-#~ "-foreground <๊๎๋ณ๐>\tย่๊๎๐่๑๒เ๒่ <๊๎๋ณ๐> ไ๋ ็โ่๗เ้ํ๎ใ๎ ๒ๅ๊๑๒๓ (๒เ๊๎ๆ: -"
-#~ "fg)"
-
-#~ msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
-#~ msgstr ""
-#~ "-font <๘๐่๔๒>\tย่๊๎๐่๑๒เ๒่ <๘๐่๔๒> ไ๋ ็โ่๗เ้ํ๎ใ๎ ๒ๅ๊๑๒๓ (๒เ๊๎ๆ: -fn)"
-
-#~ msgid "-boldfont <font>\tUse <font> for bold text"
-#~ msgstr "-boldfont <๘๐่๔๒>\tย่๊๎๐่๑๒เ๒่ <๘๐่๔๒> ไ๋ ๆ่๐ํ๎ใ๎ ๒ๅ๊๑๒๓"
-
-#~ msgid "-italicfont <font>\tUse <font> for italic text"
-#~ msgstr "-italicfont <๘๐่๔๒>\tย่๊๎๐่๑๒เ๒่ <๘๐่๔๒> ไ๋ ๏๎๕่๋๎ใ๎ ๒ๅ๊๑๒๓"
-
-#~ msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
-#~ msgstr "-geometry <ใๅ๎์>\tวเไเ๒่ ๐๎็์ณ๐่ ้ ๏๎๋๎ๆๅํํ (๒เ๊๎ๆ: -geom)"
-
-#~ msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
-#~ msgstr "-borderwidth <๒๎โ๙>\tย๑๒เํ๎โ่๒่ ๒๎โ๙่ํ๓ ์ๅๆ <๒๎โ๙> (๒เ๊๎ๆ: -bw)"
-
-#~ msgid ""
-#~ "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
-#~ msgstr ""
-#~ "-scrollbarwidth <๒๎โ๙> ย๑๒เํ๎โ่๒่ ๒๎โ๙่ํ๓ ๋ณํณ้๊่ ็๑๓โ๓ (๒เ๊๎ๆ: -sw)"
-
-#~ msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
-#~ msgstr "-menuheight <โ่๑๎๒เ>\tย๑๒เํ๎โ่๒่ โ่๑๎๒๓ ์ๅํ <โ่๑๎๒เ> (๒เ๊๎ๆ: -mh)"
-
-#~ msgid "-reverse\t\tUse reverse video (also: -rv)"
-#~ msgstr "-reverse\t\tฮแๅ๐ํ๓๒่ ๊๎๋๎๐่ (๒เ๊๎ๆ: -rv)"
-
-#~ msgid "+reverse\t\tDon't use reverse video (also: +rv)"
-#~ msgstr "+reverse\t\tอๅ ๎แๅ๐๒เ๒่ ๊๎๋๎๐่ (๒เ๊๎ๆ: +rv)"
-
-#~ msgid "-xrm <resource>\tSet the specified resource"
-#~ msgstr "-xrm <๐ๅ๑๓๐๑>\t\tย๑๒เํ๎โ่๒่ ็เ็ํเ๗ๅํ่้ ๐ๅ๑๓๐๑"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (GTK+ version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ภ๐ใ๓์ๅํ๒่ gvim (โๅ๐๑ณ GTK+)\n"
-
-#~ msgid "-display <display>\tRun vim on <display> (also: --display)"
-#~ msgstr "-display <ไ่๑๏๋ๅ้>\tย่๊๎ํเ๒่ vim ํเ <ไ่๑๏๋ๅฟ> (๒เ๊๎ๆ: --display)"
-
-#~ msgid "--role <role>\tSet a unique role to identify the main window"
-#~ msgstr ""
-#~ "--role <๐๎๋>\tย๑๒เํ๎โ่๒่ ๓ํณ๊เ๋ํ๓ ๐๎๋ ไ๋ ณไๅํ๒่๔ณ๊เ๖ณฟ ใ๎๋๎โํ๎ใ๎ โณ๊ํเ"
-
-#~ msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
-#~ msgstr "--socketid <xid>\tยณไ๊๐่๒่ Vim โ ณํ๘๎์๓ ๅ๋ๅ์ๅํ๒ณ ณํ๒ๅ๐๔ๅ้๑๓ GTK"
-
-#~ msgid "--echo-wid\t\tMake gvim echo the Window ID on stdout"
-#~ msgstr "--echo-wid\t\tีเ้ gvim ํเไ๐๓๊๓บ ณไๅํ๒่๔ณ๊เ๒๎๐ โณ๊ํเ ํเ stdout"
-
-#~ msgid "-P <parent title>\tOpen Vim inside parent application"
-#~ msgstr "-P <็เใ๎๋๎โ๎๊ แเ๒๊เ>\tยณไ๊๐่๒่ Vim โ๑ๅ๐ๅไ่ํณ แเ๒๊ณโ๑๊๎ใ๎ โณ๊ํเ"
-
-#~ msgid "--windowid <HWND>\tOpen Vim inside another win32 widget"
-#~ msgstr "--windowid <HWND>\tยณไ๊๐่๒่ Vim โ๑ๅ๐ๅไ่ํณ ณํ๘๎ใ๎ ๅ๋ๅ์ๅํ๒๓ win32"
-
-#~ msgid "No display"
-#~ msgstr "อๅ์เบ ไ่๑๏๋ๅ"
-
-#~ msgid ": Send failed.\n"
-#~ msgstr ": อๅ โไเ๋๎๑ โณไณ๑๋เ๒่.\n"
-
-#~ msgid ": Send failed. Trying to execute locally\n"
-#~ msgstr ": อๅ โไเ๋๎๑ โณไณ๑๋เ๒่. ั๏๐๎แเ โ่๊๎ํเ๒่ ํเ ์ณ๑๖ณ\n"
-
-#~ msgid "%d of %d edited"
-#~ msgstr "โณไ๐ๅไเใ๎โเํ๎ %d ็ %d"
-
-#~ msgid "No display: Send expression failed.\n"
-#~ msgstr "อๅ์เบ ไ่๑๏๋ๅ: ยณไณ๑๋เ๒่ โ่๐เ็ ํๅ โไเ๋๎๑.\n"
-
-#~ msgid ": Send expression failed.\n"
-#~ msgstr ": ยณไณ๑๋เ๒่ โ่๐เ็ ํๅ โไเ๋๎๑.\n"
-
-#~ msgid "E543: Not a valid codepage"
-#~ msgstr "E543: อๅ๊๎๐ๅ๊๒ํเ ๊๎ไ๎โเ ๑๒๎๐ณํ๊เ"
-
-#~ msgid "E284: Cannot set IC values"
-#~ msgstr "E284: อๅ โไเ๋๎๑ โ๑๒เํ๎โ่๒่ ็ํเ๗ๅํํ ๊๎ํ๒ๅ๊๑๒๓ โโ๎ไ๓"
-
-#~ msgid "E285: Failed to create input context"
-#~ msgstr "E285: อๅ โไเ๋๎๑ ๑๒โ๎๐่๒่ ๊๎ํ๒ๅ๊๑๒ โโ๎ไ๓"
-
-#~ msgid "E286: Failed to open input method"
-#~ msgstr "E286: อๅ โไเ๋๎๑ ๑๒โ๎๐่๒่ ์ๅ๒๎ไ โโ๎ไ๓"
-
-# msgstr "E286: "
-#~ msgid "E287: Warning: Could not set destroy callback to IM"
-#~ msgstr ""
-#~ "E287: วเ๑๒ๅ๐ๅๆๅํํ: อๅ โไเ๋๎๑ โ๑๒เํ๎โ่๒่ โ ์ๅ๒๎ไณ โโ๎ไ๓ ๏๎ไณ ็ํ่๙ๅํํ"
-
-# msgstr "E287: "
-#~ msgid "E288: input method doesn't support any style"
-#~ msgstr "E288: ฬๅ๒๎ไ โโ๎ไ๓ ํๅ ๏ณไ๒๐่์๓บ ๑๒่๋ณ"
-
-# msgstr "E288: "
-#~ msgid "E289: input method doesn't support my preedit type"
-#~ msgstr "E289: ฬๅ๒๎ไ โโ๎ไ๓ ํๅ ๏ณไ๒๐่์๓บ โณไ๐ๅไเใ๎โเํณ ๒่๏่"
-
-#~ msgid "E843: Error while updating swap file crypt"
-#~ msgstr "E843: ฯ๎์่๋๊เ ๏๎ํ๎โ๋ๅํํ ๘่๔๐๓โเํํ ๔เ้๋๓ ๎แ์ณํ๓"
-
-#~ msgid ""
-#~ "E833: %s is encrypted and this version of Vim does not support encryption"
-#~ msgstr "E833: %s ็เ๘่๔๐๎โเํ๎, เ ๖ โๅ๐๑ณ Vim ํๅ ๏ณไ๒๐่์๓บ ๘่๔๐๓โเํํ"
-
-#~ msgid "Swap file is encrypted: \"%s\""
-#~ msgstr "ิเ้๋ ๎แ์ณํ๓ ็เ๘่๔๐๎โเํ่้: ซ%sป"
-
-#~ msgid ""
-#~ "\n"
-#~ "If you entered a new crypt key but did not write the text file,"
-#~ msgstr ""
-#~ "\n"
-#~ "฿๊๙๎ โ่ ็เไเ๋่ ํ๎โ่้ ๊๋๗ ๘่๔๐๓, เ๋ๅ ํๅ ็เ๏่๑เ๋่ ๒ๅ๊๑๒๎โ่้ ๔เ้๋,"
-
-#~ msgid ""
-#~ "\n"
-#~ "enter the new crypt key."
-#~ msgstr ""
-#~ "\n"
-#~ "โโๅไณ๒ ํ๎โ่้ ๊๋๗ ๘่๔๐๓."
-
-#~ msgid ""
-#~ "\n"
-#~ "If you wrote the text file after changing the crypt key press enter"
-#~ msgstr ""
-#~ "\n"
-#~ "฿๊๙๎ โ่ ็เ๏่๑เ๋่ ๒ๅ๊๑๒๎โ่้ ๔เ้๋ ๏ณ๑๋ ็์ณํ่ ๊๋๗เ ๘่๔๐๓, ํเ๒่๑ํณ๒ enter"
-
-#~ msgid ""
-#~ "\n"
-#~ "to use the same key for text file and swap file"
-#~ msgstr ""
-#~ "\n"
-#~ "๙๎แ โ่๊๎๐่๑๒เ๒่ ๎ไํเ๊๎โ่้ ๊๋๗ ไ๋ ๒ๅ๊๑๒๎โ๎ใ๎ ๔เ้๋๓ ๒เ ๔เ้๋๓ ๎แ์ณํ๓"
-
-#~ msgid "Using crypt key from swap file for the text file.\n"
-#~ msgstr "ฤ๋ ๒ๅ๊๑๒๎โ๎ใ๎ ๔เ้๋๓ โ่๊๎๐่๑๒๎โ๓บ๒๑ ๊๋๗ ๘่๔๐๓ ็ ๔เ้๋๓ ๎แ์ณํ๓.\n"
-
-#~ msgid ""
-#~ "\n"
-#~ " [not usable with this version of Vim]"
-#~ msgstr ""
-#~ "\n"
-#~ " [ํๅ ๏๐่ไเ๒ํ่้ ไ๋ ๖ณบฟ โๅ๐๑ณฟ Vim]"
-
-#~ msgid "Tear off this menu"
-#~ msgstr "ยณไณ๐โเ๒่ ๖ๅ ์ๅํ"
-
-#~ msgid "Select Directory dialog"
-#~ msgstr "ย่แ๐เ๒่ ๊เ๒เ๋๎ใ"
-
-#~ msgid "Save File dialog"
-#~ msgstr "วเ๏เ์'๒เ๒่ ๔เ้๋"
-
-#~ msgid "Open File dialog"
-#~ msgstr "ยณไ๊๐่๒่ ๔เ้๋"
-
-#~ msgid "E338: Sorry, no file browser in console mode"
-#~ msgstr "E338: ย่แเ๗๒ๅ, เ๋ๅ โ ๊๎ํ๑๎๋ณ ํๅ์เบ ไณเ๋๎ใ๓ โ่แ๎๐๓ ๔เ้๋๓"
-
-#~ msgid "ERROR: "
-#~ msgstr "ฯฮฬศหสภ: "
-
-#~ msgid ""
-#~ "\n"
-#~ "[bytes] total alloc-freed %<PRIu64>-%<PRIu64>, in use %<PRIu64>, peak use "
-#~ "%<PRIu64>\n"
-#~ msgstr ""
-#~ "\n"
-#~ "[แเ้๒] โ๑๎ใ๎ ๐๎็์/็ํ่๙. %<PRIu64>/%<PRIu64>, โ่๊๎๐. %<PRIu64>, ์เ๊๑. "
-#~ "%<PRIu64>\n"
-
-#~ msgid ""
-#~ "[calls] total re/malloc()'s %<PRIu64>, total free()'s %<PRIu64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "[โ่๊๋่๊่] ๓๑๎ใ๎ re/malloc() - %<PRIu64>, ๓๑๎ใ๎ free() - %<PRIu64>\n"
-#~ "\n"
-
-#~ msgid "E340: Line is becoming too long"
-#~ msgstr "E340: ะไ๎๊ ๑๒เบ ็เํเไ๒๎ ไ๎โใ่์"
-
-# msgstr "E340: "
-#~ msgid "E341: Internal error: lalloc(%<PRId64>, )"
-#~ msgstr "E341: ยํ๓๒๐ณ๘ํ ๏๎์่๋๊เ: lalloc(%<PRId64>, )"
-
-#~ msgid "E547: Illegal mouseshape"
-#~ msgstr "E547: อๅ๏๐เโ่๋ํ่้ โ่ใ๋ไ ์่๘ณ"
-
-#~ msgid "Enter encryption key: "
-#~ msgstr "ย๊เๆณ๒ ๊๋๗ ๘่๔๐๓: "
-
-#~ msgid "Enter same key again: "
-#~ msgstr "ฯ๎โ๒๎๐ณ๒ ๊๋๗: "
-
-#~ msgid "Keys don't match!"
-#~ msgstr "ส๋๗ณ ํๅ ๎ไํเ๊๎โณ!"
-
-#~ msgid "Cannot connect to Netbeans #2"
-#~ msgstr "อๅ โไเ๋๎๑ ็'บไํเ๒่๑ ณ็ Netbeans #2"
-
-#~ msgid "Cannot connect to Netbeans"
-#~ msgstr "อๅ โไเ๋๎๑ ็'บไํเ๒่๑ ณ็ Netbeans"
-
-#~ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
-#~ msgstr ""
-#~ "E668: อๅ๏๐เโ่๋ํ่้ ๐ๅๆ่์ ไ๎๑๒๓๏๓ ไ๎ ๔เ้๋๓ ณํ๔๎๐์เ๖ณฟ ๏๐๎ ็'บไํเํํ ็ "
-#~ "NetBenans: ซ%sป"
-
-#~ msgid "read from Netbeans socket"
-#~ msgstr "๗่๒เบ๒๑ ็ ๑๎๊ๅ๒เ Netbeans"
-
-#~ msgid "E658: NetBeans connection lost for buffer %<PRId64>"
-#~ msgstr "E658: ย๒๐เ๗ๅํ๎ ็โ'็๎๊ ณ็ NetBeans ไ๋ แ๓๔ๅ๐เ %<PRId64>"
-
-#~ msgid "E838: netbeans is not supported with this GUI"
-#~ msgstr "E838: netbeans ํๅ ๏ณไ๒๐่์๓บ๒๑ ็ ๖่์ GUI"
-
-#~ msgid "E511: netbeans already connected"
-#~ msgstr "E511: netbeans โๆๅ ๏ณไ'บไํเํ๎"
-
-#~ msgid "E505: %s is read-only (add ! to override)"
-#~ msgstr "E505: %s ๒ณ๋๊่ ไ๋ ๗่๒เํํ (! ๙๎แ ํๅ ็โเๆเ๒่)"
-
-#~ msgid "E775: Eval feature not available"
-#~ msgstr "E775: ฬ๎ๆ๋่โณ๑๒ eval ํๅไ๎๑๒๓๏ํเ"
-
-#~ msgid "freeing %<PRId64> lines"
-#~ msgstr "วโณ๋ํๅํ๎ ๐ไ๊ณโ: %<PRId64>"
-
-#~ msgid "E530: Cannot change term in GUI"
-#~ msgstr "E530: อๅ โไเ๋๎๑ ็์ณํ่๒่ term โ GUI"
-
-#~ msgid "E531: Use \":gui\" to start the GUI"
-#~ msgstr "E531: วเ๑๒๎๑๓้๒ๅ ซ:guiป ไ๋ ็เ๏๓๑๊๓ GUI"
-
-#~ msgid "E617: Cannot be changed in the GTK+ 2 GUI"
-#~ msgstr "E617: อๅ ์๎ๆํเ ็์ณํ่๒่ โ GUI GTK+ 2"
-
-#~ msgid "E596: Invalid font(s)"
-#~ msgstr "E596: อๅ๊๎๐ๅ๊๒ํ่้(ณ) ๘๐่๔๒(่)"
-
-#~ msgid "E597: can't select fontset"
-#~ msgstr "E597: อๅ โไเ๋๎๑ โ่แ๐เ๒่ ํเแณ๐ ๘๐่๔๒ณโ"
-
-#~ msgid "E598: Invalid fontset"
-#~ msgstr "E598: อๅ๏๐เโ่๋ํ่้ ํเแณ๐ ๘๐่๔๒ณโ"
-
-#~ msgid "E533: can't select wide font"
-#~ msgstr "E533: อๅ โไเ๋๎๑ โ่๊๎๐่๑๒เ๒่ ๐๎็๘่๐ๅํ่้ ๘๐่๔๒"
-
-#~ msgid "E534: Invalid wide font"
-#~ msgstr "E534: อๅ๊๎๐ๅ๊๒ํ่้ ๐๎็๘่๐ๅํ่้ ๘๐่๔๒"
-
-#~ msgid "E538: No mouse support"
-#~ msgstr "E538: ฬ่๘เ ํๅ ๏ณไ๒๐่์๓บ๒๑"
-
-# msgstr "E358: "
-#~ msgid "cannot open "
-#~ msgstr "ํๅ โไเ๋๎๑ โณไ๊๐่๒่ "
-
-#~ msgid "VIM: Can't open window!\n"
-#~ msgstr "VIM: อๅ โไเ๋๎๑ โณไ๊๐่๒่ โณ๊ํ๎!\n"
-
-#~ msgid "Need Amigados version 2.04 or later\n"
-#~ msgstr "ฯ๎๒๐ณแํเ Amigados 2.04 เแ๎ ๏ณ็ํณ๘เ\n"
-
-#~ msgid "Need %s version %<PRId64>\n"
-#~ msgstr "ฯ๎๒๐ณแํ๎ %s โๅ๐๑ณฟ %<PRId64>\n"
-
-#~ msgid "Cannot open NIL:\n"
-#~ msgstr "อๅ โไเ๋๎๑ โณไ๊๐่๒่ NIL:\n"
-
-#~ msgid "Cannot create "
-#~ msgstr "อๅ โไเ๋๎๑ ๑๒โ๎๐่๒่ "
-
-#~ msgid "Vim exiting with %d\n"
-#~ msgstr "Vim ็เโๅ๐๘๓บ ๐๎แ๎๒๓ ็ %d\n"
-
-#~ msgid "cannot change console mode ?!\n"
-#~ msgstr "ํๅ ์๎ๆ๓ ็์ณํ่๒่ ๐ๅๆ่์ ๊๎ํ๑๎๋ณ ?!\n"
-
-# msgstr "E359: "
-#~ msgid "mch_get_shellsize: not a console??\n"
-#~ msgstr "mch_get_shellsize: ํๅ ๊๎ํ๑๎๋??\n"
-
-#~ msgid "E360: Cannot execute shell with -f option"
-#~ msgstr "E360: อๅ โไเ๋๎๑ ็เ๏๓๑๒่๒่ ๎แ๎๋๎ํ๊๓ ็ ๎๏๖ณบ -f"
-
-# msgstr "E360: "
-#~ msgid "Cannot execute "
-#~ msgstr "อๅ โไเ๋๎๑ โ่๊๎ํเ๒่ "
-
-#~ msgid "shell "
-#~ msgstr "๎แ๎๋๎ํ๊๓ "
-
-#~ msgid " returned\n"
-#~ msgstr " ๏๎โๅ๐ํ๓๒๎\n"
-
-#~ msgid "ANCHOR_BUF_SIZE too small."
-#~ msgstr "ANCHOR_BUF_SIZE ็เ์เ๋่้"
-
-#~ msgid "I/O ERROR"
-#~ msgstr "ฯ๎์่๋๊เ โโ๎ไ๓/โ่โ๎ไ๓"
-
-#~ msgid "Message"
-#~ msgstr "ฯ๎โณไ๎์๋ๅํํ"
-
-#~ msgid "'columns' is not 80, cannot execute external commands"
-#~ msgstr "'columns' ํๅ 80, ํๅ ์๎ๆํเ โ่๊๎ํ๓โเ๒่ ็๎โํณ๘ํณ ๊๎์เํไ่"
-
-# msgstr "E364: "
-#~ msgid "E237: Printer selection failed"
-#~ msgstr "E237: อๅ โไเ๋๎๑ โ่แ๐เ๒่ ๏๐่ํ๒ๅ๐"
-
-#~ msgid "to %s on %s"
-#~ msgstr "ํเ %s ็ %s"
-
-#~ msgid "E613: Unknown printer font: %s"
-#~ msgstr "E613: อๅโณไ๎์่้ ๘๐่๔๒ ๏๐่ํ๒ๅ๐เ: %s"
-
-#~ msgid "E238: Print error: %s"
-#~ msgstr "E238: ฯ๎์่๋๊เ ไ๐๓๊๓: %s"
-
-#~ msgid "Printing '%s'"
-#~ msgstr "ฤ๐๓๊๓บ๒๑ '%s'"
-
-#~ msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
-#~ msgstr "E244: อๅ๊๎๐ๅ๊๒ํเ ํเ็โเ ํเแ๎๐๓ ๑่์โ๎๋ณโ ซ%sป ๓ ํเ็โณ ๘๐่๔๒๓ ซ%sป"
-
-#~ msgid "E245: Illegal char '%c' in font name \"%s\""
-#~ msgstr "E245: ฯ๎์่๋๊๎โ่้ ๑่์โ๎๋ %c โ ํเ็โณ ๘๐่๔๒๓ ซ%sป"
-
-#~ msgid "Opening the X display took %<PRId64> msec"
-#~ msgstr "อเ โณไ๊๐่๒๒ ไ่๑๏๋ๅ X ๏ณ๘๋๎ %<PRId64> ์ณ๋ณ๑ๅ๊๓ํไ"
-
-#~ msgid ""
-#~ "\n"
-#~ "Vim: Got X error\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Vim: ฯ๎์่๋๊เ X\n"
-
-#~ msgid "Testing the X display failed"
-#~ msgstr "ฤ่๑๏๋ๅ้ ี ํๅ ๏๐๎้๘๎โ ๏ๅ๐ๅโณ๐๊๓"
-
-#~ msgid "Opening the X display timed out"
-#~ msgstr "ั๏๋่โ ๗เ๑ ๎๗ณ๊๓โเํํ โณไ๊๐่๒๒ ไ่๑๏๋ๅ ี"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot execute shell sh\n"
-#~ msgstr ""
-#~ "\n"
-#~ "อๅ โไเ๋๎๑ ็เ๏๓๑๒่๒่ ๎แ๎๋๎ํ๊๓ `sh'\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot create pipes\n"
-#~ msgstr ""
-#~ "\n"
-#~ "อๅ ์๎ๆํเ ๑๒โ๎๐่๒่ ๊เํเ๋่\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot fork\n"
-#~ msgstr ""
-#~ "\n"
-#~ "อๅ โไเ๋๎๑ ๐๎็ไโ๎ฟ๒่๑\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Command terminated\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ส๎์เํไเ ็เ๊ณํ๗่๋เ โ่๊๎ํเํํ\n"
-
-#~ msgid "XSMP lost ICE connection"
-#~ msgstr "XSMP โ๒๐เ๒่โ ็'บไํเํํ ICE"
-
-#~ msgid "Opening the X display failed"
-#~ msgstr "อๅ โไเ๋๎๑ โณไ๊๐่๒่ ไ่๑๏๋ๅ้ X"
-
-#~ msgid "XSMP handling save-yourself request"
-#~ msgstr "XSMP ๎แ๐๎แ๋บ๒๑ ็เ๏่๒ '็แๅ๐ๅๆ่ ๑ๅแๅ'"
-
-#~ msgid "XSMP opening connection"
-#~ msgstr "XSMP โณไ๊๐่โเบ๒๑ ็'บไํเํํ"
-
-#~ msgid "XSMP ICE connection watch failed"
-#~ msgstr "XSMP ๑๏๎๑๒ๅ๐ๅๆๅํํ ็เ ็'บไํเํํ์ ็ ICE ํๅ โไเ๋๎๑"
-
-#~ msgid "XSMP SmcOpenConnection failed: %s"
-#~ msgstr "XSMP ํๅ โไเ๋๎๑ SmcOpenConnection: %s"
-
-#~ msgid "At line"
-#~ msgstr "ะไ๎๊:"
-
-#~ msgid "Could not load vim32.dll!"
-#~ msgstr "อๅ โไเ๋๎๑ ็เโเํ๒เๆ่๒่ vim32.dll"
-
-#~ msgid "VIM Error"
-#~ msgstr "ฯ๎์่๋๊เ VIM"
-
-#~ msgid "Could not fix up function pointers to the DLL!"
-#~ msgstr "อๅ โไเ๋๎๑ โ่๏๐เโ่๒่ โ๊เ็ณโํ่๊่ ํเ ๔๓ํ๊๖ณฟ DLL!"
-
-#~ msgid "shell returned %d"
-#~ msgstr "๎แ๎๋๎ํ๊เ ๏๎โๅ๐ํ๓๋เ %d"
-
-#~ msgid "Vim: Caught %s event\n"
-#~ msgstr "Vim: ย่โ๋ๅํ๎ ๏๎ไณ %s\n"
-
-#~ msgid "close"
-#~ msgstr "close"
-
-#~ msgid "logoff"
-#~ msgstr "logoff"
-
-#~ msgid "shutdown"
-#~ msgstr "shutdown"
-
-#~ msgid "E371: Command not found"
-#~ msgstr "E371: ส๎์เํไ๓ ํๅ ็ํเ้ไๅํ๎"
-
-#~ msgid ""
-#~ "VIMRUN.EXE not found in your $PATH.\n"
-#~ "External commands will not pause after completion.\n"
-#~ "See :help win32-vimrun for more information."
-#~ msgstr ""
-#~ "ิเ้๋ VIMRUN.EXE ํๅ ็ํเ้ไๅํ๎ ๓ ๘๋๕๓ ๏๎๘๓๊๓.\n"
-#~ "ว๎โํณ๘ํณ ๊๎์เํไ่ ํๅ แ๓ไ๓๒ ๏๐่็๓๏่ํๅํณ ๏ณ๑๋ โ่๊๎ํเํํ.\n"
-#~ "ร๋ํ๒ๅ :help win32-vimrun ๙๎แ ๎๒๐่์เ๒่ ๏๎ไ๐๎แ่๖ณ."
-
-#~ msgid "Vim Warning"
-#~ msgstr "วเ๑๒ๅ๐ๅๆๅํํ Vim"
-
-# msgstr "E231: "
-#~ msgid "Error file"
-#~ msgstr "ิเ้๋ ๏๎์่๋๎๊"
-
-#~ msgid "E868: Error building NFA with equivalence class!"
-#~ msgstr "E868: อๅ โไเ๋๎๑ ๏๎แ๓ไ๓โเ๒่ NFA ็ ๊๋เ๑๎์ ๅ๊โณโเ๋ๅํ๒ํ๎๑๒ณ!"
-
-#~ msgid "E878: (NFA) Could not allocate memory for branch traversal!"
-#~ msgstr "E878: (NFA) อๅ โไเ๋๎๑ ๎๒๐่์เ๒่ ๏เ์’๒ ไ๋ ๎แ๕๎ไ๓ ใณ๋๎๊!"
-
-#~ msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\""
-#~ msgstr ""
-#~ "วเ๑๒ๅ๐ๅๆๅํํ: อๅ โไเ๋๎๑ ็ํเ้๒่ ๑๏่๑๎๊ ๑๋ณโ ซ%s_%s.splป ๗่ ซ%s_ascii.splป"
-
-#~ msgid "Conversion in %s not supported"
-#~ msgstr "ฯๅ๐ๅ๒โ๎๐ๅํํ ๓ %s ํๅ ๏ณไ๒๐่์๓บ๒๑"
-
-#~ msgid "E845: Insufficient memory, word list will be incomplete"
-#~ msgstr "E845: อๅไ๎๑๒เ๒ํ๎ ๏เ์’๒ณ, ๑๏่๑๎๊ ๑๋ณโ แ๓ไๅ ํๅ๏๎โํ่์"
-
-#~ msgid "E430: Tag file path truncated for %s\n"
-#~ msgstr "E430: ุ๋๕ ๔เ้๋๓ ๒ๅดณโ ๑๊๎๐๎๗ๅํ๎ ไ๎ %s\n"
-
-#~ msgid "new shell started\n"
-#~ msgstr "็เ๏๓๙ๅํ๎ ํ๎โ๓ ๎แ๎๋๎ํ๊๓\n"
-
-# msgstr "E242: "
-#~ msgid "Used CUT_BUFFER0 instead of empty selection"
-#~ msgstr "ย่๊๎๐่๑๒เํ๎ CUT_BUFFER0 ็เ์ณ๑๒ ๏๎๐๎ๆํ๎ใ๎ โ่ไณ๋ๅํํ"
-
-#~ msgid "No undo possible; continue anyway"
-#~ msgstr "ั๊เ๑๓โเํํ แ๓ไๅ ํๅ์๎ๆ๋่โๅ, โ๑ๅ ๎ไํ๎ ๏๐๎ไ๎โๆ่๒่"
-
-#~ msgid "E832: Non-encrypted file has encrypted undo file: %s"
-#~ msgstr "E832: อๅ็เ๘่๔๐๎โเํ่้ ๔เ้๋ ์เบ ็เ๘่๔๐๎โเํ่้ ๔เ้๋ ณ๑๒๎๐ณฟ: %s"
-
-#~ msgid "E826: Undo file decryption failed: %s"
-#~ msgstr "E826: อๅ โไเ๋๎๑ ๐๎็๘่๔๐๓โเ๒่ ๔เ้๋ ณ๑๒๎๐ณฟ: %s"
-
-#~ msgid "E827: Undo file is encrypted: %s"
-#~ msgstr "E827: ิเ้๋ ณ๑๒๎๐ณฟ ็เ๘่๔๐๎โเํ่้: %s"
-
-# msgstr "E440: "
-# ---------------------------------------
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16/32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "ยๅ๐๑ณ ็ GUI ไ๋ 16/32-๐๎็๐ไํ๎ฟ Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "ยๅ๐๑ณ ็ GUI ไ๋ 64-๐๎็๐ไํ๎ฟ MS-Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "ยๅ๐๑ณ ็ GUI ไ๋ 32-๐๎็๐ไํ๎ฟ Windows"
-
-#~ msgid " in Win32s mode"
-#~ msgstr " โ ๐ๅๆ่์ณ Win32s"
-
-#~ msgid " with OLE support"
-#~ msgstr " ็ ๏ณไ๒๐่์๊๎ OLE"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "ส๎ํ๑๎๋ํเ โๅ๐๑ณ ไ๋ 64-๐๎็๐ไํ๎ฟ Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "ส๎ํ๑๎๋ํเ โๅ๐๑ณ ไ๋ 32-๐๎็๐ไํ๎ฟ Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16-bit version"
-#~ msgstr ""
-#~ "\n"
-#~ "ยๅ๐๑ณ ไ๋ 16-๐๎็๐ไํ๎ฟ Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "32-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "ยๅ๐๑ณ ไ๋ 32-๐๎็๐ไํ๎ฟ MS-DOS"
-
-#~ msgid ""
-#~ "\n"
-#~ "16-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "ยๅ๐๑ณ ไ๋ 16-๐๎็๐ไํ๎ฟ MS-DOS"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X (unix) version"
-#~ msgstr ""
-#~ "\n"
-#~ "ยๅ๐๑ณ ไ๋ MacOS X (unix)"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X version"
-#~ msgstr ""
-#~ "\n"
-#~ "ยๅ๐๑ณ ไ๋ MacOS X"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "ยๅ๐๑ณ ไ๋ MacOS"
-
-#~ msgid ""
-#~ "\n"
-#~ "OpenVMS version"
-#~ msgstr ""
-#~ "\n"
-#~ "ยๅ๐๑ณ ไ๋ OpenVMS"
-
-#~ msgid ""
-#~ "\n"
-#~ "Big version "
-#~ msgstr ""
-#~ "\n"
-#~ "ยๅ๋่๊เ โๅ๐๑ณ "
-
-#~ msgid ""
-#~ "\n"
-#~ "Normal version "
-#~ msgstr ""
-#~ "\n"
-#~ "อ๎๐์เ๋ํเ โๅ๐๑ณ "
-
-#~ msgid ""
-#~ "\n"
-#~ "Small version "
-#~ msgstr ""
-#~ "\n"
-#~ "ฬเ๋เ โๅ๐๑ณ "
-
-#~ msgid ""
-#~ "\n"
-#~ "Tiny version "
-#~ msgstr ""
-#~ "\n"
-#~ "ส๐่๕ณ๒ํเ โๅ๐๑ณ "
-
-#~ msgid "with GTK2-GNOME GUI."
-#~ msgstr "็ GUI GTK2-GNOME."
-
-#~ msgid "with GTK2 GUI."
-#~ msgstr "็ GUI GTK2."
-
-#~ msgid "with X11-Motif GUI."
-#~ msgstr "็ GUI X11-Motif."
-
-#~ msgid "with X11-neXtaw GUI."
-#~ msgstr "็ GUI X11-neXtaw."
-
-#~ msgid "with X11-Athena GUI."
-#~ msgstr "็ GUI X11-Athena."
-
-#~ msgid "with Photon GUI."
-#~ msgstr "็ GUI Photon."
-
-#~ msgid "with GUI."
-#~ msgstr "็ GUI."
-
-#~ msgid "with Carbon GUI."
-#~ msgstr "็ GUI Carbon."
-
-#~ msgid "with Cocoa GUI."
-#~ msgstr "็ GUI Cocoa."
-
-#~ msgid "with (classic) GUI."
-#~ msgstr "็ (๊๋เ๑่๗ํ่์) GUI."
-
-#~ msgid " system gvimrc file: \""
-#~ msgstr " ๑่๑๒ๅ์ํ่้ gvimrc: \""
-
-#~ msgid " user gvimrc file: \""
-#~ msgstr " gvimrc ๊๎๐่๑๒๓โเ๗เ: \""
-
-#~ msgid "2nd user gvimrc file: \""
-#~ msgstr "ไ๐๓ใ่้ gvimrc ๊๎๐่๑๒๓โเ๗เ: \""
-
-#~ msgid "3rd user gvimrc file: \""
-#~ msgstr "๒๐ๅ๒ณ้ gvimrc ๊๎๐่๑๒๓โเ๗เ: \""
-
-#~ msgid " system menu file: \""
-#~ msgstr " ๑่๑๒ๅ์ํๅ ์ๅํ: \""
-
-#~ msgid "Compiler: "
-#~ msgstr "ส๎์๏ณ๋๒๎๐: "
-
-#~ msgid "menu Help->Orphans for information "
-#~ msgstr "์ๅํ Help->Orphans ๏๎ไเ๋๘เ ณํ๔๎๐์เ๖ณ "
-
-#~ msgid "Running modeless, typed text is inserted"
-#~ msgstr "มๅ็ ๐ๅๆ่์ณโ, ๒ๅ๊๑๒ ๙๎ ํเแ๐เํ๎ โ๑๒เโ๋บ๒๑"
-
-#~ msgid "menu Edit->Global Settings->Toggle Insert Mode "
-#~ msgstr "์ๅํ Edit->Global Settings->Toggle Insert Mode "
-
-#~ msgid " for two modes "
-#~ msgstr " ไ๋ ไโ๎๕ ๐ๅๆ่์ณโ "
-
-#~ msgid "menu Edit->Global Settings->Toggle Vi Compatible"
-#~ msgstr "์ๅํ Edit->Global Settings->Toggle Vi Compatible "
-
-#~ msgid " for Vim defaults "
-#~ msgstr " ๙๎แ ๏๎๗่ํเ๒่ โ ๐ๅๆ่์ณ ๑๓์ณ๑ํ๎๑๒ณ ็ Vi"
-
-#~ msgid "WARNING: Windows 95/98/ME detected"
-#~ msgstr "วภัาละลฦลออ฿: ย่ ๊๎๐่๑๒๓บ๒ๅ๑ Windows 95/98/ME"
-
-#~ msgid "type :help windows95<Enter> for info on this"
-#~ msgstr ":help windows95<Enter> ณํ๔๎๐์เ๖ณ ๏๐๎ ๖ๅ "
-
-#~ msgid "E370: Could not load library %s"
-#~ msgstr "E370: อๅ โไเ๋๎๑ ็เโเํ๒เๆ่๒่ แณแ๋ณ๎๒ๅ๊๓ %s"
-
-#~ msgid ""
-#~ "Sorry, this command is disabled: the Perl library could not be loaded."
-#~ msgstr ""
-#~ "ย่แเ๗๒ๅ, ๖ ๊๎์เํไเ โ่์๊ํๅํเ, แณแ๋ณ๎๒ๅ๊เ Perl ํๅ ์๎ๆๅ แ๓๒่ ็เโเํ๒เๆๅํเ."
-
-#~ msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
-#~ msgstr ""
-#~ "E299: ฮแ๗่๑๋ๅํํ โ่๐เ็ณโ Perl ็เแ๎๐๎ํๅํๅ ๓ ๏ณ๑๎๗ํ่๖ณ แๅ็ ์๎ไ๓๋ Safe"
-
-#~ msgid "Edit with &multiple Vims"
-#~ msgstr "ะๅไเใ๓โเ๒่ ๓ (&m)๐ณ็ํ่๕ Vim"
-
-#~ msgid "Edit with single &Vim"
-#~ msgstr "ะๅไเใ๓โเ๒่ ๓ ๎ไํ๎์๓ &Vim"
-
-#~ msgid "Diff with Vim"
-#~ msgstr "ฯ๎๐ณโํ๒่ ็ ไ๎๏๎์๎ใ๎ Vim"
-
-#~ msgid "Edit with &Vim"
-#~ msgstr "ะๅไเใ๓โเ๒่ ็เ ไ๎๏๎์๎ใ๎ &Vim"
-
-#~ msgid "Edit with existing Vim - "
-#~ msgstr "ะๅไเใ๓โเ๒่ ๓ โๆๅ ็เ๏๓๙ๅํ๎์๓ Vim - "
-
-#~ msgid "Edits the selected file(s) with Vim"
-#~ msgstr "ะๅไเใ๓บ โ่แ๐เํณ ๔เ้๋่ ็ ไ๎๏๎์๎ใ๎ Vim"
-
-#~ msgid "Error creating process: Check if gvim is in your path!"
-#~ msgstr "ฯ๎์่๋๊เ ๑๒โ๎๐ๅํํ ๏๐๎๖ๅ๑๓, ๏ๅ๐ๅโณ๐๒ๅ ๗่ บ gvim ๓ ๘๋๕๓ ๏๎๘๓๊๓!"
-
-#~ msgid "gvimext.dll error"
-#~ msgstr "๏๎์่๋๊เ gvimext.dll"
-
-#~ msgid "Path length too long!"
-#~ msgstr "ุ๋๕ ็เํเไ๒๎ ไ๎โใ่้!"
-
-# msgstr "E233: "
-#~ msgid "E234: Unknown fontset: %s"
-#~ msgstr "E234: อๅโณไ๎์่้ ํเแณ๐ ๘๐่๔๒ณโ: %s"
-
-#~ msgid "E235: Unknown font: %s"
-#~ msgstr "E235: อๅโณไ๎์่้ ๘๐่๔๒: %s"
-
-# msgstr "E235: "
-#~ msgid "E236: Font \"%s\" is not fixed-width"
-#~ msgstr "E236: ุ๐่๔๒ ซ%sป ํๅ ์๎ํ๎๘่๐่ํํ่้"
-
-#~ msgid "E448: Could not load library function %s"
-#~ msgstr "E448: อๅ โไเ๋๎๑ ็เโเํ๒เๆ่๒่ แณแ๋ณ๎๒ๅ๗ํ๓ ๔๓ํ๊๖ณ %s"
-
-#~ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
-#~ msgstr "E26: อๅ ์๎ๆํเ โ่๊๎๐่๑๒เ๒่ ณโ๐่๒: อๅ โโณ์๊ํๅํ๎ ๏ณไ ๗เ๑ ๊๎์๏ณ๋๖ณฟ\n"
-
-#~ msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
-#~ msgstr "E27: อๅ ์๎ๆํเ โ่๊๎๐่๑๒เ๒่ ๔เ๐๑ณ: อๅ โโณ์๊ํๅํ๎ ๏ณไ ๗เ๑ ๊๎์๏ณ๋๖ณฟ\n"
-
-#~ msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
-#~ msgstr ""
-#~ "E800: อๅ ์๎ๆํเ โ่๊๎๐่๑๒เ๒่ เ๐เแ๑๊๓ ์๎โ๓: อๅ โโณ์๊ํๅํ๎ ๏ณไ ๗เ๑ "
-#~ "๊๎์๏ณ๋๖ณฟ\n"
-
-#~ msgid "E247: no registered server named \"%s\""
-#~ msgstr "E247: อๅ์เบ ็เ๐ๅบ๑๒๐๎โเํ่๕ ๑ๅ๐โๅ๐ณโ ็ ํเ็โ๎ ซ%sป"
-
-#~ msgid "E233: cannot open display"
-#~ msgstr "E233: อๅ โไเ๋๎๑ โณไ๊๐่๒่ ไ่๑๏๋ๅ้"
-
-#~ msgid "E449: Invalid expression received"
-#~ msgstr "E449: ฮ๒๐่์เํ๎ ํๅ๊๎๐ๅ๊๒ํ่้ โ่๐เ็"
-
-#~ msgid "E463: Region is guarded, cannot modify"
-#~ msgstr "E463: อๅ ์๎ๆํเ ็์ณํ่๒่ ็เ๕่๙ๅํ่้ ๐ๅใณ๎ํ"
-
-#~ msgid "E744: NetBeans does not allow changes in read-only files"
-#~ msgstr "E744: NetBeans ํๅ ไ๎็โ๎๋บ ็์ณํโเ๒่ ็เ๕่๙ๅํณ โณไ ็เ๏่๑๓ ๔เ้๋่"
-
-#~ msgid "Need encryption key for \"%s\""
-#~ msgstr "ฤ๋ ซ%sป ๏๎๒๐ณแๅํ ๊๋๗: "
-
-# msgstr "E406: "
-#~ msgid "empty keys are not allowed"
-#~ msgstr "๏๎๐๎ๆํณ ๊๋๗ณ ํๅ ไ๎็โ๎๋ๅํณ"
-
-#~ msgid "dictionary is locked"
-#~ msgstr "๑๋๎โํ่๊ ็เแ๋๎๊๎โเํ๎"
-
-#~ msgid "list is locked"
-#~ msgstr "๑๏่๑๎๊ ็เแ๋๎๊๎โเํ๎"
-
-#~ msgid "failed to add key '%s' to dictionary"
-#~ msgstr "ํๅ โไเ๋๎๑ ไ๎ไเ๒่ ๊๋๗ '%s' ไ๎ ๑๋๎โํ่๊เ"
-
-#~ msgid "index must be int or slice, not %s"
-#~ msgstr "ณํไๅ๊๑ ์เบ แ๓๒่ ๖ณ๋่้ ๗่ ็๐ณ็, ํๅ %s"
-
-#~ msgid "expected str() or unicode() instance, but got %s"
-#~ msgstr "๎๗ณ๊๓โเโ๑ ๅ๊็ๅ์๏๋๐ str() ๗่ unicode(), เ๋ๅ ๎๒๐่์เํ๎ %s"
-
-#~ msgid "expected bytes() or str() instance, but got %s"
-#~ msgstr "๎๗ณ๊๓โเโ๑ ๅ๊็ๅ์๏๋๐ bytes() ๗่ str(), เ๋ๅ ๎๒๐่์เํ๎ %s"
-
-#~ msgid ""
-#~ "expected int(), long() or something supporting coercing to long(), but "
-#~ "got %s"
-#~ msgstr ""
-#~ "๎๗ณ๊๓โเโ๑ int(), long() ๗่ ๙๎๑, ๙๎ ์๎ๆๅ แ๓๒่ โ์ณ๙ๅํๅ long(), เ๋ๅ "
-#~ "๎๒๐่์เํ๎ %s"
-
-#~ msgid "expected int() or something supporting coercing to int(), but got %s"
-#~ msgstr ""
-#~ "๎๗ณ๊๓โเโ๑ int() ๗่ ๙๎๑, ๙๎ ์๎ๆๅ แ๓๒่ โ์ณ๙ๅํๅ int(), เ๋ๅ ๎๒๐่์เํ๎ %s"
-
-#~ msgid "value is too large to fit into C int type"
-#~ msgstr "็ํเ๗ๅํํ ็เโๅ๋่๊ๅ, ๙๎แ โ์ณ๑๒่๒่๑ ๓ ๒่๏ C int"
-
-#~ msgid "value is too small to fit into C int type"
-#~ msgstr "็ํเ๗ๅํํ ็เ์เ๋ๅ, ๙๎แ โ์ณ๑๒่๒่๑ ๓ ๒่๏ C int"
-
-#~ msgid "number must be greater then zero"
-#~ msgstr "๗่๑๋๎ ์เบ แ๓๒่ แณ๋๘ๅ, ํณๆ ํ๓๋"
-
-#~ msgid "number must be greater or equal to zero"
-#~ msgstr "๗่๑๋๎ ์เบ แ๓๒่ ํๅ ์ๅํ๘ๅ, ํณๆ ํ๓๋"
-
-#~ msgid "can't delete OutputObject attributes"
-#~ msgstr "ํๅ โไเ๋๎๑ ็ํ่๙่๒่ เ๒๐่แ๓๒่ OutputObject"
-
-# msgstr "E180: "
-#~ msgid "invalid attribute: %s"
-#~ msgstr "ํๅ๏๐เโ่๋ํ่้ เ๒๐่แ๓๒: %s"
-
-#~ msgid "E264: Python: Error initialising I/O objects"
-#~ msgstr "E264: Python: ฯ๎์่๋๊เ ณํณ๖ณเ๋ณ็เ๖ณฟ ๎แ'บ๊๒ณโ โโ๎ไ๓/โ่โ๎ไ๓"
-
-#~ msgid "failed to change directory"
-#~ msgstr "ํๅ โไเ๋๎๑ ็์ณํ่๒่ ไ่๐ๅ๊๒๎๐ณ"
-
-#~ msgid "expected 3-tuple as imp.find_module() result, but got %s"
-#~ msgstr "๎๗ณ๊๓โเโ๑ 3-๊๎๐๒ๅๆ ๊ ๐ๅ็๓๋๒เ๒ imp.find_module(), เ๋ๅ ๎๒๐่์เํ๎ %s"
-
-#~ msgid ""
-#~ "expected 3-tuple as imp.find_module() result, but got tuple of size %d"
-#~ msgstr "๎๗ณ๊๓โเโ๑ 3-๊๎๐๒ๅๆ ๊ ๐ๅ็๓๋๒เ๒ imp.find_module(), เ๋ๅ ๎๒๐่์เํ๎ %d"
-
-#~ msgid "internal error: imp.find_module returned tuple with NULL"
-#~ msgstr "โํ๓๒๐ณ๘ํ ๏๎์่๋๊เ: imp.find_module ๏๎โๅ๐ํ๓๋เ ๊๎๐๒ๅๆ ็ NULL"
-
-#~ msgid "cannot delete vim.Dictionary attributes"
-#~ msgstr "ํๅ โไเ๋๎๑ ็ํ่๙่๒่ เ๒๐่แ๓๒่ vim.Dictionary"
-
-#~ msgid "cannot modify fixed dictionary"
-#~ msgstr "ํๅ ์๎ๆํเ ็์ณํ่๒่ ๔ณ๊๑๎โเํ่้ ๑๋๎โํ่๊"
-
-#~ msgid "cannot set attribute %s"
-#~ msgstr "ํๅ ์๎ๆํเ โ๑๒เํ๎โ่๒่ เ๒๐่แ๓๒ %s"
-
-#~ msgid "hashtab changed during iteration"
-#~ msgstr "๕ๅ๘-๒เแ๋่๖ ็์ณํ่๋เ๑ ๏ณไ ๗เ๑ ๏ๅ๐ๅแ่๐เํํ"
-
-#~ msgid "expected sequence element of size 2, but got sequence of size %d"
-#~ msgstr ""
-#~ "๎๗ณ๊๓โเ๋เ๑ ๏๎๑๋ณไ๎โํณ๑๒ ๐๎็์ณ๐๎์ 2, เ๋ๅ ๎๒๐่์เํ๎ ๏๎๑๋ณไ๎โํณ๑๒ ๐๎็์ณ๐๓ "
-#~ "%d"
-
-#~ msgid "list constructor does not accept keyword arguments"
-#~ msgstr "๑๏่๑๊๎โ่้ ๊๎ํ๑๒๐๓๊๒๎๐ ํๅ ๏๐่้์เบ ณ์ๅํ๎โเํณ เ๐ใ๓์ๅํ๒่"
-
-#~ msgid "list index out of range"
-#~ msgstr "ณํไๅ๊๑ ๑๏่๑๊๓ ็เ ์ๅๆเ์่"
-
-#~ msgid "internal error: failed to get vim list item %d"
-#~ msgstr "โํ๓๒๐ณ๘ํ ๏๎์่๋๊เ: ํๅ โไเ๋๎๑ ๎๒๐่์เ๒่ ๅ๋ๅ์ๅํ๒ ๑๏่๑๊๓ vim %d"
-
-#~ msgid "failed to add item to list"
-#~ msgstr "ํๅ โไเ๋๎๑ ไ๎ไเ๒่ ๅ๋ๅ์ๅํ๒ ไ๎ ๑๏่๑๊๓"
-
-#~ msgid "internal error: no vim list item %d"
-#~ msgstr "โํ๓๒๐ณ๘ํ ๏๎์่๋๊เ: ํๅ์เบ ๅ๋ๅ์ๅํ๒เ ๑๏่๑๊๓ vim %d"
-
-#~ msgid "internal error: failed to add item to list"
-#~ msgstr "โํ๓๒๐ณ๘ํ ๏๎์่๋๊เ: ํๅ โไเ๋๎๑ ไ๎ไเ๒่ ๅ๋ๅ์ๅํ๒ ไ๎ ๑๏่๑๊๓"
-
-#~ msgid "cannot delete vim.List attributes"
-#~ msgstr "ํๅ โไเ๋๎๑ ็ํ่๙่๒่ เ๒๐่แ๓๒่ vim.List"
-
-#~ msgid "cannot modify fixed list"
-#~ msgstr "ํๅ ์๎ๆํเ ็์ณํ่๒่ ๔ณ๊๑๎โเํ่้ ๑๏่๑๎๊"
-
-# msgstr "E428: "
-#~ msgid "unnamed function %s does not exist"
-#~ msgstr "แๅ็ณ์ๅํํ๎ฟ ๔๓ํ๊๖ณฟ %s ํๅ ณ๑ํ๓บ"
-
-# msgstr "E428: "
-#~ msgid "function %s does not exist"
-#~ msgstr "๔๓ํ๊๖ณฟ %s ํๅ ณ๑ํ๓บ"
-
-#~ msgid "function constructor does not accept keyword arguments"
-#~ msgstr "๊๎ํ๑๒๐๓๊๒๎๐ ๔๓ํ๊๖ณฟ ํๅ ๏๐่้์เบ ณ์ๅํ๎โเํณ เ๐ใ๓์ๅํ๒่"
-
-#~ msgid "failed to run function %s"
-#~ msgstr "ํๅ โไเ๋๎๑ โ่๊๎ํเ๒่ ๔๓ํ๊๖ณ %s"
-
-#~ msgid "problem while switching windows"
-#~ msgstr "ํๅ โไเ๋๎๑ ๏ๅ๐ๅ์๊ํ๓๒่ โณ๊ํเ"
-
-#~ msgid "unable to unset global option %s"
-#~ msgstr "ํๅ โไเ๋๎๑ ๑๊่ํ๓๒่ ใ๋๎แเ๋ํ๓ ๎๏๖ณ %s"
-
-#~ msgid "unable to unset option %s which does not have global value"
-#~ msgstr "ํๅ โไเ๋๎๑ ๑๊่ํ๓๒่ ๎๏๖ณ %s, ๊เ ํๅ ์เบ ใ๋๎แเ๋ํ๎ใ๎ ็ํเ๗ๅํํ"
-
-#~ msgid "attempt to refer to deleted tab page"
-#~ msgstr "๑๏๐๎แเ ็โๅ๐ํๅํํ ไ๎ ็ํ่๙ๅํ๎ฟ โ๊๋เไ๊่"
-
-#~ msgid "no such tab page"
-#~ msgstr "๒เ๊๎ฟ โ๊๋เไ๊่ ํๅ์เบ"
-
-#~ msgid "attempt to refer to deleted window"
-#~ msgstr "๑๏๐๎แเ ็โๅ๐ํ๓๒่๑ ไ๎ ็ํ่๙ๅํ๎ใ๎ โณ๊ํเ"
-
-#~ msgid "readonly attribute: buffer"
-#~ msgstr "เ๒๐่แ๓๒ ๋่๘ๅ ไ๋ ๗่๒เํํ: แ๓๔ๅ๐"
-
-#~ msgid "cursor position outside buffer"
-#~ msgstr "๊๓๐๑๎๐ ็เ ์ๅๆเ์่ แ๓๔ๅ๐เ"
-
-#~ msgid "no such window"
-#~ msgstr "๒เ๊๎ใ๎ โณ๊ํเ ํๅ์เบ"
-
-#~ msgid "attempt to refer to deleted buffer"
-#~ msgstr "๑๏๐๎แเ ็โๅ๐ํๅํํ ไ๎ ็ํ่๙ๅํ๎ใ๎ แ๓๔ๅ๐เ"
-
-#~ msgid "failed to rename buffer"
-#~ msgstr "ํๅ โไเ๋๎๑ ๏ๅ๐ๅ้์ๅํ๓โเ๒่ แ๓๔ๅ๐"
-
-#~ msgid "mark name must be a single character"
-#~ msgstr "ํเ็โ๎ ์ณ๒๊่ ์เบ แ๓๒่ ๎ไ่ํ ๑่์โ๎๋"
-
-#~ msgid "expected vim.Buffer object, but got %s"
-#~ msgstr "๎๗ณ๊๓โเโ๑ ๎แ’บ๊๒ vim.Buffer, เ๋ๅ ๎๒๐่์เํ๎ %s"
-
-#~ msgid "failed to switch to buffer %d"
-#~ msgstr "ํๅ โไเ๋๎๑ ๏ๅ๐ๅ์๊ํ๓๒่๑ ไ๎ แ๓๔ๅ๐เ %d"
-
-#~ msgid "expected vim.Window object, but got %s"
-#~ msgstr "๎๗ณ๊๓โเโ๑ ๎แ’บ๊๒ vim.Window, เ๋ๅ ๎๒๐่์เํ๎ %s"
-
-#~ msgid "failed to find window in the current tab page"
-#~ msgstr "ํๅ โไเ๋๎๑ ็ํเ้๒่ โณ๊ํ๎ ๓ ๏๎๒๎๗ํณ้ โ๊๋เไ๖ณ"
-
-#~ msgid "did not switch to the specified window"
-#~ msgstr "ํๅ ๏ๅ๐ๅ์๊ํ๓โ๑ ไ๎ โ๊เ็เํ๎ใ๎ โณ๊ํเ"
-
-#~ msgid "expected vim.TabPage object, but got %s"
-#~ msgstr "๎๗ณ๊๓โเโ๑ ๎แ’บ๊๒ vim.TabPage, เ๋ๅ ๎๒๐่์เํ๎ %s"
-
-#~ msgid "did not switch to the specified tab page"
-#~ msgstr "ํๅ ๏ๅ๐ๅ์๊ํ๓โ๑ ไ๎ โ๊เ็เํ๎ฟ โ๊๋เไ๊่"
-
-#~ msgid "failed to run the code"
-#~ msgstr "ํๅ โไเ๋๎๑ โ่๊๎ํเ๒่ ๊๎ไ"
-
-#~ msgid "E858: Eval did not return a valid python object"
-#~ msgstr "E858: Eval ํๅ ๏๎โๅ๐ํ๓โ ไณ้๑ํ่้ ๎แ’บ๊๒ python"
-
-#~ msgid "E859: Failed to convert returned python object to vim value"
-#~ msgstr "E859: อๅ โไเ๋๎๑ ๏ๅ๐ๅ๒โ๎๐่๒่ ๎แ’บ๊๒ python ๓ ็ํเ๗ๅํํ vim"
-
-#~ msgid "unable to convert %s to vim dictionary"
-#~ msgstr "ํๅ โไเ๋๎๑ ๏ๅ๐ๅ๒โ๎๐่๒่ %s ๓ ๑๋๎โํ่๊ vim"
-
-#~ msgid "unable to convert %s to vim structure"
-#~ msgstr "ํๅ โไเ๋๎๑ ๏ๅ๐ๅ๒โ๎๐่๒่ %s ๓ ๑๒๐๓๊๒๓๐๓ vim"
-
-#~ msgid "internal error: NULL reference passed"
-#~ msgstr "โํ๓๒๐ณ๘ํ ๏๎์่๋๊เ: ๏ๅ๐ๅไเํ๎ ๏๎๑่๋เํํ NULL"
-
-#~ msgid "internal error: invalid value type"
-#~ msgstr "โํ๓๒๐ณ๘ํ ๏๎์่๋๊เ: ํๅ๏๐เโ่๋ํ่้ ๒่๏ ็ํเ๗ๅํํ"
-
-#~ msgid ""
-#~ "Failed to set path hook: sys.path_hooks is not a list\n"
-#~ "You should now do the following:\n"
-#~ "- append vim.path_hook to sys.path_hooks\n"
-#~ "- append vim.VIM_SPECIAL_PATH to sys.path\n"
-#~ msgstr ""
-#~ "อๅ โไเ๋๎๑ โ๑๒เํ๎โ่๒่ ๎แ๐๎แํ่๊ ๘๋๕๓: sys.path_hooks ํๅ ๑๏่๑๎๊\n"
-#~ "ยเ์ ๑๋ณไ โ๗่ํ่๒่ ๒เ๊:\n"
-#~ "- ไ๎ไเ้๒ๅ vim.path_hook ไ๎ sys.path_hooks\n"
-#~ "- ไ๎ไเ้๒ๅ vim.VIM_SPECIAL_PATH ไ๎ sys.path\n"
-
-#~ msgid ""
-#~ "Failed to set path: sys.path is not a list\n"
-#~ "You should now append vim.VIM_SPECIAL_PATH to sys.path"
-#~ msgstr ""
-#~ "อๅ โไเ๋๎๑ โ๑๒เํ๎โ่๒่ ๘๋๕: sys.path ํๅ ๑๏่๑๎๊\n"
-#~ "ยเ๑ ๑๋ณไ ไ๎ไเ๒่ vim.VIM_SPECIAL_PATH ไ๎ sys.path"
diff --git a/src/nvim/po/uk.po b/src/nvim/po/uk.po
index eaa3a5bfa9..211d38e53a 100644
--- a/src/nvim/po/uk.po
+++ b/src/nvim/po/uk.po
@@ -1,5 +1,7 @@
#
-# Ukrainian Vim translation [uk]
+# Ukrainian translation for Vim
+#
+# Original translations
#
# Copyright (C) 2001 Bohdan Vlasyuk <bohdan@vstu.edu.ua>
# Bohdan donated this work to be distributed with Vim under the Vim license.
@@ -12,225 +14,163 @@ msgid ""
msgstr ""
"Project-Id-Version: vim 7.4\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-05-26 14:21+0200\n"
-"PO-Revision-Date: 2010-06-18 21:53+0300\n"
+"POT-Creation-Date: 2018-12-18 22:42+0200\n"
+"PO-Revision-Date: 2018-12-18 22:42+0200\n"
"Last-Translator: ะะฝะฐั‚ะพะปั–ะน ะกะฐั…ะฝั–ะบ <sakhnik@gmail.com>\n"
-"Language-Team: Bohdan Vlasyuk <bohdan@vstu.edu.ua>\n"
+"Language-Team: Ukrainian\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
+"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ../api/private/helpers.c:201
-#, fuzzy
-msgid "Unable to get option value"
-msgstr "ะฝะต ะฒะดะฐะปะพัั ะพั‚ั€ะธะผะฐั‚ะธ ะทะฝะฐั‡ะตะฝะฝั ะพะฟั†ั–ั—"
-
-#: ../api/private/helpers.c:204
-msgid "internal error: unknown option type"
-msgstr "ะฒะฝัƒั‚ั€ั–ัˆะฝั ะฟะพะผะธะปะบะฐ: ะฝะตะฒั–ะดะพะผะธะน ั‚ะธะฟ ะพะฟั†ั–ั—"
-
-#: ../buffer.c:92
msgid "[Location List]"
msgstr "[ะกะฟะธัะพะบ ะผั–ัั†ัŒ]"
-#: ../buffer.c:93
msgid "[Quickfix List]"
msgstr "[ะกะฟะธัะพะบ ะฒะธะฟั€ะฐะฒะปะตะฝัŒ]"
-#: ../buffer.c:94
msgid "E855: Autocommands caused command to abort"
msgstr "E855: ะะฒั‚ะพะบะพะผะฐะฝะดะธ ะฟั€ะธะทะฒะตะปะธ ะดะพ ัะบะฐััƒะฒะฐะฝะฝั ะบะพะผะฐะฝะดะธ"
-#: ../buffer.c:135
msgid "E82: Cannot allocate any buffer, exiting..."
msgstr "E82: ะะตะผะฐั” ะผะพะถะปะธะฒะพัั‚ั– ั€ะพะทะผั–ัั‚ะธั‚ะธ ั…ะพั‡ ะพะดะธะฝ ะฑัƒั„ะตั€, ะทะฐะฒะตั€ัˆะตะฝะฝั ั€ะพะฑะพั‚ะธ..."
-#: ../buffer.c:138
msgid "E83: Cannot allocate buffer, using other one..."
msgstr "E83: ะะตะผะฐั” ะผะพะถะปะธะฒะพัั‚ั– ั€ะพะทะผั–ัั‚ะธั‚ะธ ะฑัƒั„ะตั€, ะฑัƒะดะต ะฒะธะบะพั€ะธัั‚ะฐะฝะพ ั–ะฝัˆะธะน..."
-#: ../buffer.c:763
+msgid "E937: Attempt to delete a buffer that is in use"
+msgstr "E937: ะกะฟั€ะพะฑะฐ ะทะฝะธั‰ะตะฝะฝั ะฑัƒั„ะตั€ัƒ, ัะบะธะน ะฒะธะบะพั€ะธัั‚ะพะฒัƒั”ั‚ัŒัั"
+
msgid "E515: No buffers were unloaded"
msgstr "E515: ะ–ะพะดะตะฝ ะท ะฑัƒั„ะตั€ั–ะฒ ะฝะต ะฑัƒะฒ ะฒะธะฒะฐะฝั‚ะฐะถะตะฝะธะน"
-#: ../buffer.c:765
msgid "E516: No buffers were deleted"
msgstr "E516: ะ–ะพะดะตะฝ ะท ะฑัƒั„ะตั€ั–ะฒ ะฝะต ะทะฝะธั‰ะตะฝะพ"
-#: ../buffer.c:767
msgid "E517: No buffers were wiped out"
msgstr "E517: ะ–ะพะดะตะฝ ะท ะฑัƒั„ะตั€ั–ะฒ ะฝะต ะฒะธั‚ะตั€ั‚ะพ"
-#: ../buffer.c:772
msgid "1 buffer unloaded"
msgstr "ะ’ะธะฒะฐะฝั‚ะฐะถะตะฝะพ ะพะดะธะฝ ะฑัƒั„ะตั€"
-#: ../buffer.c:774
#, c-format
msgid "%d buffers unloaded"
msgstr "ะ’ะธะฒะฐะฝั‚ะฐะถะตะฝะพ %d ะฑัƒั„ะตั€ะธ(ั–ะฒ)"
-#: ../buffer.c:777
msgid "1 buffer deleted"
msgstr "ะ—ะฝะธั‰ะตะฝะพ ะพะดะธะฝ ะฑัƒั„ะตั€"
-#: ../buffer.c:779
#, c-format
msgid "%d buffers deleted"
msgstr "ะ—ะฝะธั‰ะตะฝะพ %d ะฑัƒั„ะตั€ะธ(ั–ะฒ)"
-#: ../buffer.c:782
msgid "1 buffer wiped out"
msgstr "ะ’ะธั‚ะตั€ั‚ะพ ะพะดะธะฝ ะฑัƒั„ะตั€"
-#: ../buffer.c:784
#, c-format
msgid "%d buffers wiped out"
msgstr "ะ’ะธั‚ะตั€ั‚ะพ %d ะฑัƒั„ะตั€ะธ(ั–ะฒ)"
-#: ../buffer.c:806
msgid "E90: Cannot unload last buffer"
msgstr "E90: ะะต ะผะพะถัƒ ะฒะธะฒะฐะฝั‚ะฐะถะธั‚ะธ ะพัั‚ะฐะฝะฝั–ะน ะฑัƒั„ะตั€"
-#: ../buffer.c:874
msgid "E84: No modified buffer found"
msgstr "E84: ะ–ะพะดะตะฝ ะฑัƒั„ะตั€ ะฝะต ะทะผั–ะฝะตะฝะพ"
-#. back where we started, didn't find anything.
-#: ../buffer.c:903
msgid "E85: There is no listed buffer"
msgstr "E85: ะฃ ัะฟะธัะบัƒ ะฝะตะผะฐั” ะฑัƒั„ะตั€ั–ะฒ"
-#: ../buffer.c:913
-#, c-format
-msgid "E86: Buffer %<PRId64> does not exist"
-msgstr "E86: ะ‘ัƒั„ะตั€ะฐ %<PRId64> ะฝะตะผะฐั”"
-
-#: ../buffer.c:915
msgid "E87: Cannot go beyond last buffer"
msgstr "E87: ะฆะต ะฒะถะต ะพัั‚ะฐะฝะฝั–ะน ะฑัƒั„ะตั€"
-#: ../buffer.c:917
msgid "E88: Cannot go before first buffer"
msgstr "E88: ะฆะต ะฒะถะต ะฝะฐะนะฟะตั€ัˆะธะน ะฑัƒั„ะตั€"
-#: ../buffer.c:945
+#, c-format
+msgid "E89: %s will be killed(add ! to override)"
+msgstr "E89: ยซ%sยป ะฑัƒะดะต ะฒะฑะธั‚ะพ(! ั‰ะพะฑ ะฝะต ะทะฒะฐะถะฐั‚ะธ)"
+
#, c-format
msgid ""
"E89: No write since last change for buffer %<PRId64> (add ! to override)"
msgstr "E89: ะ‘ัƒั„ะตั€ %<PRId64> ะผะฐั” ะทะผั–ะฝะธ (! ั‰ะพะฑ ะฝะต ะทะฒะฐะถะฐั‚ะธ)"
-#. wrap around (may cause duplicates)
-#: ../buffer.c:1423
msgid "W14: Warning: List of file names overflow"
msgstr "W14: ะžะฑะตั€ะตะถะฝะพ: ะกะฟะธัะพะบ ะฝะฐะทะฒ ั„ะฐะนะปั–ะฒ ะฟะตั€ะตะฟะพะฒะฝะตะฝะพ"
-#: ../buffer.c:1555 ../quickfix.c:3361
#, c-format
msgid "E92: Buffer %<PRId64> not found"
msgstr "E92: ะ‘ัƒั„ะตั€ %<PRId64> ะฝะต ะทะฝะฐะนะดะตะฝะพ"
-#: ../buffer.c:1798
#, c-format
msgid "E93: More than one match for %s"
msgstr "E93: ะ—ะฝะฐะนะดะตะฝะพ ะบั–ะปัŒะบะฐ ะทะฑั–ะณั–ะฒ ะท %s"
-#: ../buffer.c:1800
#, c-format
msgid "E94: No matching buffer for %s"
msgstr "E94: ะะต ะทะฝะฐะนะดะตะฝะพ ะฑัƒั„ะตั€, ัั…ะพะถะธะน ะฝะฐ %s"
-#: ../buffer.c:2161
#, c-format
msgid "line %<PRId64>"
msgstr "ั€ัะดะพะบ %<PRId64>"
-#: ../buffer.c:2233
msgid "E95: Buffer with this name already exists"
msgstr "E95: ะ‘ัƒั„ะตั€ ะท ั‚ะฐะบะพัŽ ะฝะฐะทะฒะพัŽ ะฒะถะต ั–ัะฝัƒั”"
-#: ../buffer.c:2498
msgid " [Modified]"
msgstr " [ะ—ะผั–ะฝะตะฝะพ]"
-#: ../buffer.c:2501
msgid "[Not edited]"
msgstr "[ะะต ั€ะตะดะฐะณะพะฒะฐะฝะพ]"
-#: ../buffer.c:2504
msgid "[New file]"
msgstr "[ะะพะฒะธะน ั„ะฐะนะป]"
-#: ../buffer.c:2505
msgid "[Read errors]"
msgstr "[ะŸะพะผะธะปะบะธ ั‡ะธั‚ะฐะฝะฝั]"
-#: ../buffer.c:2506 ../buffer.c:3217 ../fileio.c:1807 ../screen.c:4895
msgid "[RO]"
msgstr "[RO]"
-#: ../buffer.c:2507 ../fileio.c:1807
msgid "[readonly]"
msgstr "[ะปะธัˆะต ั‡ะธั‚ะฐั‚ะธ]"
-#: ../buffer.c:2524
#, c-format
msgid "1 line --%d%%--"
msgstr "ะพะดะธะฝ ั€ัะดะพะบ --%d%%--"
-#: ../buffer.c:2526
#, c-format
msgid "%<PRId64> lines --%d%%--"
msgstr "%<PRId64> ั€ัะดะบะธ(ั–ะฒ) --%d%%--"
-#: ../buffer.c:2530
#, c-format
msgid "line %<PRId64> of %<PRId64> --%d%%-- col "
msgstr "ั€ัะดะพะบ %<PRId64> ะท %<PRId64> --%d%%-- ะบะพะปะพะฝะบะฐ "
-#: ../buffer.c:2632 ../buffer.c:4292 ../memline.c:1554
msgid "[No Name]"
msgstr "[ะ‘ะตะท ะฝะฐะทะฒะธ]"
-#. must be a help buffer
-#: ../buffer.c:2667
msgid "help"
msgstr "ะดะพะฟะพะผะพะณะฐ"
-#: ../buffer.c:3225 ../screen.c:4883
msgid "[Help]"
msgstr "[ะ”ะพะฟะพะผะพะณะฐ]"
-#: ../buffer.c:3254 ../screen.c:4887
msgid "[Preview]"
msgstr "[ะŸะตั€ะตะณะปัะด]"
-#: ../buffer.c:3528
msgid "All"
msgstr "ะฃัะต"
-#: ../buffer.c:3528
msgid "Bot"
msgstr "ะ—ะฝะธะทัƒ"
-#: ../buffer.c:3531
msgid "Top"
msgstr "ะ’ะณะพั€ั–"
-#: ../buffer.c:4244
-msgid ""
-"\n"
-"# Buffer list:\n"
-msgstr ""
-"\n"
-"# ะกะฟะธัะพะบ ะฑัƒั„ะตั€ั–ะฒ:\n"
-
-#: ../buffer.c:4289
msgid "[Scratch]"
msgstr "[ะ— ะฝัƒะปั]"
-#: ../buffer.c:4529
msgid ""
"\n"
"--- Signs ---"
@@ -238,962 +178,1151 @@ msgstr ""
"\n"
"--- ะŸะพะทะฝะฐั‡ะบะธ ---"
-#: ../buffer.c:4538
#, c-format
msgid "Signs for %s:"
msgstr "ะŸะพะทะฝะฐั‡ะบะธ ะดะปั %s:"
-#: ../buffer.c:4543
#, c-format
msgid " line=%<PRId64> id=%d name=%s"
msgstr " ั€ัะดะพะบ=%<PRId64> id=%d ะฝะฐะทะฒะฐ=%s"
-#: ../cursor_shape.c:68
+msgid "can only be opened in headless mode"
+msgstr "ะผะพะถะฝะฐ ะฒั–ะดะบั€ะธั‚ะธ ั‚ั–ะปัŒะบะธ ะฑะตะท ั–ะฝั‚ะตั€ั„ะตะนััƒ ะบะพั€ะธัั‚ัƒะฒะฐั‡ะฐ"
+
+msgid "channel was already open"
+msgstr "ะบะฐะฝะฐะป ะฒะถะต ะฑัƒะฒ ะฒั–ะดะบั€ะธั‚ะธะน"
+
+msgid "Can't send data to closed stream"
+msgstr "ะะตะผะพะถะปะธะฒะพ ะฝะฐะดั–ัะปะฐั‚ะธ ะดะฐะฝั– ัƒ ะทะฐะบั€ะธั‚ะธะน ะฟะพั‚ั–ะบ"
+
+msgid "Can't send raw data to rpc channel"
+msgstr "ะะตะผะพะถะปะธะฒะพ ะฝะฐะดั–ัะปะฐั‚ะธ ะดะฐะฝั– ัƒ ะบะฐะฝะฐะป ะทะฐะฒะดะฐะฝะฝั"
+
msgid "E545: Missing colon"
msgstr "E545: ะŸั€ะพะฟัƒั‰ะตะฝะพ ะดะฒะพะบั€ะฐะฟะบัƒ"
-#: ../cursor_shape.c:70 ../cursor_shape.c:94
msgid "E546: Illegal mode"
msgstr "E546: ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ั€ะตะถะธะผ"
-#: ../cursor_shape.c:134
msgid "E548: digit expected"
msgstr "E548: ะŸะพั‚ั€ั–ะฑะฝะฐ ั†ะธั„ั€ะฐ"
-#: ../cursor_shape.c:138
msgid "E549: Illegal percentage"
msgstr "E549: ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ะฒั–ะดัะพั‚ะพะบ"
-#: ../diff.c:146
#, c-format
-msgid "E96: Can not diff more than %<PRId64> buffers"
+msgid "E96: Cannot diff more than %<PRId64> buffers"
msgstr "E96: ะะต ะผะพะถะฝะฐ ะฟะพั€ั–ะฒะฝัŽะฒะฐั‚ะธ ะฟะพะฝะฐะด %<PRId64> ะฑัƒั„ะตั€ะธ(ั–ะฒ)"
-#: ../diff.c:753
+#, c-format
+msgid "Not enough memory to use internal diff for buffer \"%s\""
+msgstr "ะะตะดะพัั‚ะฐั‚ะฝัŒะพ ะฟะฐะผโ€™ัั‚ั– ะดะปั ะฒะฝัƒั‚ั€ั–ัˆะฝัŒะพะณะพ ะฟะพั€ั–ะฒะฝัะฝะฝั ัƒ ะฑัƒั„ะตั€ั– \"%s\""
+
msgid "E810: Cannot read or write temp files"
msgstr "E810: ะะต ะผะพะถะฝะฐ ั‡ะธั‚ะฐั‚ะธ ั‡ะธ ะทะฐะฟะธััƒะฒะฐั‚ะธ ั‚ะธะผั‡ะฐัะพะฒั– ั„ะฐะนะปะธ"
-#: ../diff.c:755
msgid "E97: Cannot create diffs"
msgstr "E97: ะะต ะฒะดะฐะปะพัั ัั‚ะฒะพั€ะธั‚ะธ ะฟะพั€ั–ะฒะฝัะฝะฝั"
-#: ../diff.c:966
+msgid "E960: Problem creating the internal diff"
+msgstr "E960: ะะต ะฒะดะฐะปะพัั ัั‚ะฒะพั€ะธั‚ะธ ะฒะฝัƒั‚ั€ั–ัˆะฝั” ะฟะพั€ั–ะฒะฝัะฝะฝั"
+
msgid "E816: Cannot read patch output"
msgstr "E816: ะะต ะฒะดะฐะปะพัั ะฟั€ะพั‡ะธั‚ะฐั‚ะธ ั€ะตะทัƒะปัŒั‚ะฐั‚ patch"
-#: ../diff.c:1220
msgid "E98: Cannot read diff output"
msgstr "E98: ะะต ะฒะดะฐะปะพัั ะฟั€ะพั‡ะธั‚ะฐั‚ะธ ั€ะตะทัƒะปัŒั‚ะฐั‚ diff"
-#: ../diff.c:2081
+msgid "E959: Invalid diff format."
+msgstr "E959: ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ั„ะพั€ะผะฐั‚ ะฟะพั€ั–ะฒะฝัะฝะฝั."
+
msgid "E99: Current buffer is not in diff mode"
msgstr "E99: ะฆะตะน ะฑัƒั„ะตั€ ะฝะต ะฒ ั€ะตะถะธะผั– ะฟะพั€ั–ะฒะฝัะฝะฝั"
-#: ../diff.c:2100
msgid "E793: No other buffer in diff mode is modifiable"
msgstr "E793: ะะตะผะฐั” ะฑั–ะปัŒัˆะต ะผะพะดะธั„ั–ะบะพะฒะฝะธั… ะฑัƒั„ะตั€ั–ะฒ ะฒ ั€ะตะถะธะผั– ะฟะพั€ั–ะฒะฝัะฝะฝั"
-#: ../diff.c:2102
msgid "E100: No other buffer in diff mode"
msgstr "E100: ะะตะผะฐั” ั–ะฝัˆะธั… ะฑัƒั„ะตั€ั–ะฒ ะฒ ั€ะตะถะธะผั– ะฟะพั€ั–ะฒะฝัะฝะฝั"
-#: ../diff.c:2112
msgid "E101: More than two buffers in diff mode, don't know which one to use"
msgstr ""
"E101: ะŸะพะฝะฐะด ะดะฒะฐ ะฑัƒั„ะตั€ะธ ัƒ ั€ะตะถะธะผั– ะฟะพั€ั–ะฒะฝัะฝะฝั, ะฝะต ะทั€ะพะทัƒะผั–ะปะพ, ะบะพั‚ั€ะธะน ั–ะท ะฝะธั… "
"ะฒะธะบะพั€ะธัั‚ะฐั‚ะธ"
-#: ../diff.c:2141
#, c-format
msgid "E102: Can't find buffer \"%s\""
msgstr "E102: ะะต ะฒะดะฐะปะพัั ะทะฝะฐะนั‚ะธ ะฑัƒั„ะตั€ ยซ%sยป"
-#: ../diff.c:2152
#, c-format
msgid "E103: Buffer \"%s\" is not in diff mode"
msgstr "E103: ะ‘ัƒั„ะตั€ ยซ%sยป ะฝะต ะฒ ั€ะตะถะธะผั– ะฟะพั€ั–ะฒะฝัะฝะฝั"
-#: ../diff.c:2193
msgid "E787: Buffer changed unexpectedly"
msgstr "E787: ะ‘ัƒั„ะตั€ ะฝะตัะฟะพะดั–ะฒะฐะฝะพ ะทะผั–ะฝะธะฒัั"
-#: ../digraph.c:1598
msgid "E104: Escape not allowed in digraph"
msgstr "E104: ะฃ ะดะธะณั€ะฐั„ะฐั… ะฝะต ะผะพะถะต ะผั–ัั‚ะธั‚ะธัั escape"
-#: ../digraph.c:1760
msgid "E544: Keymap file not found"
msgstr "E544: ะะต ะทะฝะฐะนะดะตะฝะพ ั„ะฐะนะป ั€ะพะทะบะปะฐะดะบะธ"
-#: ../digraph.c:1785
msgid "E105: Using :loadkeymap not in a sourced file"
msgstr "E105: :loadkeymap ะฒะธะบะพั€ะธัั‚ะฐะฝะพ ะฝะต ัƒ ั„ะฐะนะปั– ะบะพะผะฐะฝะด"
-#: ../digraph.c:1821
msgid "E791: Empty keymap entry"
msgstr "E791: ะ•ะปะตะผะตะฝั‚ ั€ะพะทะบะปะฐะดะบะธ ะฟะพั€ะพะถะฝั–ะน"
-#: ../edit.c:82
msgid " Keyword completion (^N^P)"
msgstr " ะ”ะพะฟะพะฒะฝะตะฝะฝั ะบะปัŽั‡ะพะฒะธั… ัะปั–ะฒ (^N^P)"
-#. ctrl_x_mode == 0, ^P/^N compl.
-#: ../edit.c:83
msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
msgstr " ะ ะตะถะธะผ ^X (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-#: ../edit.c:85
msgid " Whole line completion (^L^N^P)"
msgstr " ะ”ะพะฟะพะฒะฝะตะฝะฝั ัƒััŒะพะณะพ ั€ัะดะบะฐ (^L^N^P)"
-#: ../edit.c:86
msgid " File name completion (^F^N^P)"
msgstr " ะ”ะพะฟะพะฒะฝะตะฝะฝั ะฝะฐะทะฒะธ ั„ะฐะนะปัƒ (^F^N^P)"
-#: ../edit.c:87
msgid " Tag completion (^]^N^P)"
-msgstr " ะ”ะพะฟะพะฒะฝะตะฝะฝั ั‚ะตา‘ั–ะฒ (^]^N^P)"
+msgstr " ะ”ะพะฟะพะฒะฝะตะฝะฝั ะท ะผั–ั‚ะพะบ (^]^N^P)"
-#: ../edit.c:88
msgid " Path pattern completion (^N^P)"
msgstr " ะ”ะพะฟะพะฒะฝะตะฝะฝั ัˆะปัั…ัƒ ะทะฐ ะทั€ะฐะทะบะพะผ (^N^P)"
-#: ../edit.c:89
msgid " Definition completion (^D^N^P)"
msgstr " ะ”ะพะฟะพะฒะฝะตะฝะฝั ะฒะธะทะฝะฐั‡ะตะฝะฝั (^D^N^P)"
-#: ../edit.c:91
msgid " Dictionary completion (^K^N^P)"
msgstr " ะ”ะพะฟะพะฒะฝะตะฝะฝั ะทั– ัะปะพะฒะฝะธะบะฐ (^K^N^P)"
-#: ../edit.c:92
msgid " Thesaurus completion (^T^N^P)"
msgstr " ะ”ะพะฟะพะฒะฝะตะฝะฝั ะท ั‚ะตะทะฐัƒั€ัƒััƒ (^T^N^P)"
-#: ../edit.c:93
msgid " Command-line completion (^V^N^P)"
msgstr " ะ”ะพะฟะพะฒะฝะตะฝะฝั ะบะพะผะฐะฝะด (^V^N^P)"
-#: ../edit.c:94
msgid " User defined completion (^U^N^P)"
msgstr " ะšะพั€ะธัั‚ัƒะฒะฐั†ัŒะบะต ะดะพะฟะพะฒะฝะตะฝะฝั (^U^N^P)"
-#: ../edit.c:95
msgid " Omni completion (^O^N^P)"
msgstr " ะšะผั–ั‚ะปะธะฒะต ะดะพะฟะพะฒะฝะตะฝะฝั (^O^N^P)"
-#: ../edit.c:96
msgid " Spelling suggestion (s^N^P)"
msgstr " ะžั€ั„ะพะณั€ะฐั„ั–ั‡ะฝะฐ ะฟั–ะดะบะฐะทะบะฐ (s^N^P)"
-#: ../edit.c:97
msgid " Keyword Local completion (^N^P)"
msgstr " ะ”ะพะฟะพะฒะฝะตะฝะฝั ะผั–ัั†ะตะฒะธั… ะบะปัŽั‡ะพะฒะธั… ัะปั–ะฒ (^N^P)"
-#: ../edit.c:100
msgid "Hit end of paragraph"
msgstr "ะขั€ะฐะฟะธะฒัั ะบั–ะฝะตั†ัŒ ะฟะฐั€ะฐะณั€ะฐั„ะฐ"
-# msgstr "E443: "
-#: ../edit.c:101
msgid "E839: Completion function changed window"
msgstr "E839: ะคัƒะฝะบั†ั–ั ะดะพะฟะพะฒะฝะตะฝะฝั ะทะผั–ะฝะธะปะฐ ะฒั–ะบะฝะพ"
-#: ../edit.c:102
msgid "E840: Completion function deleted text"
msgstr "E840: ะคัƒะฝะบั†ั–ั ะดะพะฟะพะฒะฝะตะฝะฝั ะทะฝะธั‰ะธะปะฐ ั‚ะตะบัั‚"
-#: ../edit.c:1847
msgid "'dictionary' option is empty"
msgstr "ะžะฟั†ั–ั 'dictionary' ะฟะพั€ะพะถะฝั"
-#: ../edit.c:1848
msgid "'thesaurus' option is empty"
msgstr "ะžะฟั†ั–ั 'thesaurus' ะฟะพั€ะพะถะฝั"
-#: ../edit.c:2655
#, c-format
msgid "Scanning dictionary: %s"
msgstr "ะกะบะฐะฝัƒั”ั‚ัŒัั ัะปะพะฒะฝะธะบ: %s"
-#: ../edit.c:3079
msgid " (insert) Scroll (^E/^Y)"
-msgstr " (ะฒัั‚ะฐะฒะบะฐ) ะŸั€ะพะณะพั€ะฝัƒั‚ะธ (^E/^Y)"
+msgstr " (ะฒัั‚ะฐะฒะธั‚ะธ) ะŸั€ะพะณะพั€ะฝัƒั‚ะธ (^E/^Y)"
-#: ../edit.c:3081
msgid " (replace) Scroll (^E/^Y)"
msgstr " (ะทะฐะผั–ะฝะฐ) ะŸั€ะพะณะพั€ะฝัƒั‚ะธ (^E/^Y)"
-#: ../edit.c:3587
#, c-format
msgid "Scanning: %s"
msgstr "ะŸะพัˆัƒะบ ัƒ: %s"
-#: ../edit.c:3614
msgid "Scanning tags."
msgstr "ะŸะพัˆัƒะบ ัะตั€ะตะด ั‚ะตา‘ั–ะฒ."
-#: ../edit.c:4519
+msgid "match in file"
+msgstr "ะทะฑั–ะณ ัƒ ั„ะฐะนะปั–"
+
msgid " Adding"
msgstr " ะ”ะพะดะฐั”ั‚ัŒัั"
-#. showmode might reset the internal line pointers, so it must
-#. * be called before line = ml_get(), or when this address is no
-#. * longer needed. -- Acevedo.
-#.
-#: ../edit.c:4562
msgid "-- Searching..."
msgstr "-- ะŸะพัˆัƒะบ..."
-#: ../edit.c:4618
msgid "Back at original"
msgstr "ะŸะพั‡ะฐั‚ะบะพะฒะธะน ะฒะฐั€ั–ะฐะฝั‚"
-#: ../edit.c:4621
msgid "Word from other line"
msgstr "ะกะปะพะฒะพ ะท ั–ะฝัˆะพะณะพ ั€ัะดะบะฐ"
-#: ../edit.c:4624
msgid "The only match"
msgstr "ะ„ะดะธะฝะธะน ะทะฑั–ะณ"
-#: ../edit.c:4680
#, c-format
msgid "match %d of %d"
msgstr "ะทะฑั–ะณ %d ะท %d"
-#: ../edit.c:4684
#, c-format
msgid "match %d"
msgstr "ะทะฑั–ะณ %d"
-# msgstr "E17: "
-#: ../eval.c:137
msgid "E18: Unexpected characters in :let"
msgstr "E18: ะะตะพั‡ั–ะบัƒะฒะฐะฝั– ัะธะผะฒะพะปะธ ัƒ :let"
-#: ../eval.c:138
-#, c-format
-msgid "E684: list index out of range: %<PRId64>"
-msgstr "E684: ะ†ะฝะดะตะบั ัะฟะธัะบัƒ ะฟะพะทะฐ ะผะตะถะฐะผะธ: %<PRId64>"
-
-#: ../eval.c:139
-#, c-format
-msgid "E121: Undefined variable: %s"
-msgstr "E121: ะะตะฒะธะทะฝะฐั‡ะตะฝะฐ ะทะผั–ะฝะฝะฐ: %s"
-
-#: ../eval.c:140
msgid "E111: Missing ']'"
msgstr "E111: ะ‘ั€ะฐะบัƒั” ']'"
-#: ../eval.c:141
#, c-format
msgid "E686: Argument of %s must be a List"
msgstr "E686: ะั€ะณัƒะผะตะฝั‚ ัƒ %s ะผะฐั” ะฑัƒั‚ะธ ัะฟะธัะบะพะผ"
-#: ../eval.c:143
#, c-format
msgid "E712: Argument of %s must be a List or Dictionary"
msgstr "E712: ะั€ะณัƒะผะตะฝั‚ ัƒ %s ะผะฐั” ะฑัƒั‚ะธ ัะฟะธัะบะพะผ ั‡ะธ ัะปะพะฒะฝะธะบะพะผ"
-#: ../eval.c:144
-msgid "E713: Cannot use empty key for Dictionary"
-msgstr "E713: ะšะปัŽั‡ ัะปะพะฒะฝะธะบะฐ ะฝะต ะผะพะถะต ะฑัƒั‚ะธ ะฟะพั€ะพะถะฝั–ะผ"
-
-# msgstr "E396: "
-#: ../eval.c:145
msgid "E714: List required"
msgstr "E714: ะŸะพั‚ั€ั–ะฑะตะฝ ัะฟะธัะพะบ"
-#: ../eval.c:146
msgid "E715: Dictionary required"
msgstr "E715: ะŸะพั‚ั€ั–ะฑะตะฝ ัะปะพะฒะฝะธะบ"
-#: ../eval.c:147
+msgid "E928: String required"
+msgstr "E928: ะŸะพั‚ั€ั–ะฑะตะฝ String"
+
#, c-format
msgid "E118: Too many arguments for function: %s"
msgstr "E118: ะ—ะฐะฑะฐะณะฐั‚ะพ ะฐั€ะณัƒะผะตะฝั‚ั–ะฒ ะดะปั ั„ัƒะฝะบั†ั–ั—: %s"
-#: ../eval.c:148
#, c-format
msgid "E716: Key not present in Dictionary: %s"
msgstr "E716: ะะตะผะฐั” ั‚ะฐะบะพะณะพ ะบะปัŽั‡ะฐ ัƒ ัะปะพะฒะฝะธะบัƒ: %s"
-#: ../eval.c:150
#, c-format
msgid "E122: Function %s already exists, add ! to replace it"
msgstr "E122: ะคัƒะฝะบั†ั–ั %s ัƒะถะต ั–ัะฝัƒั”, ! ั‰ะพะฑ ะทะฐะผั–ะฝะธั‚ะธ"
-#: ../eval.c:151
msgid "E717: Dictionary entry already exists"
msgstr "E717: ะ—ะฐะฟะธั ัƒ ัะปะพะฒะฝะธะบัƒ ะฒะถะต ั–ัะฝัƒั”"
-#: ../eval.c:152
msgid "E718: Funcref required"
msgstr "E718: ะขั€ะตะฑะฐ ะฟะพัะธะปะฐะฝะฝั ะฝะฐ ั„ัƒะฝะบั†ั–ัŽ"
-#: ../eval.c:153
msgid "E719: Cannot use [:] with a Dictionary"
msgstr "E719: ะะต ะผะพะถะฝะฐ ะฒะธะบะพั€ะธัั‚ะฐั‚ะธ [:] ะทั– ัะปะพะฒะฝะธะบะพะผ"
-#: ../eval.c:154
-#, c-format
-msgid "E734: Wrong variable type for %s="
-msgstr "E734: ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ั‚ะธะฟ ะทะผั–ะฝะฝะพั— ะดะปั %s="
-
-#: ../eval.c:155
#, c-format
msgid "E130: Unknown function: %s"
msgstr "E130: ะะตะฒั–ะดะพะผะฐ ั„ัƒะฝะบั†ั–ั: %s"
-#: ../eval.c:156
#, c-format
msgid "E461: Illegal variable name: %s"
msgstr "E461: ะะตะฟั€ะธะฟัƒัั‚ะธะผะฐ ะฝะฐะทะฒะฐ ะทะผั–ะฝะฝะพั—: %s"
-# msgstr "E373: "
-#: ../eval.c:157
-msgid "E806: using Float as a String"
-msgstr "E806: Float ะฒะถะธั‚ะพ ัะบ String"
+#, c-format
+msgid "E46: Cannot change read-only variable \"%.*s\""
+msgstr "E46: ะ—ะผั–ะฝะฝะฐ ั‚ั–ะปัŒะบะธ ะดะปั ั‡ะธั‚ะฐะฝะฝั: ยซ%.*sยป"
+
+#, c-format
+msgid "E734: Wrong variable type for %s="
+msgstr "E734: ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ั‚ะธะฟ ะทะผั–ะฝะฝะพั— ะดะปั %s="
+
+msgid ""
+"E5700: Expression from 'spellsuggest' must yield lists with exactly two "
+"values"
+msgstr ""
+"E5700: ะ’ะธั€ะฐะท ั–ะท 'spellsuggest' ะผะฐั” ะฟะพะฒะตั€ั‚ะฐั‚ะธ ัะฟะธัะพะบ ั–ะท ั€ั–ะฒะฝะพ ะดะฒะพะผะฐ ะตะปะตะผะตะฝั‚ะฐะผะธ"
-#: ../eval.c:1830
msgid "E687: Less targets than List items"
msgstr "E687: ะฆั–ะปะตะน ะผะตะฝัˆะต, ะฝั–ะถ ะตะปะตะผะตะฝั‚ั–ะฒ ัะฟะธัะบัƒ"
-#: ../eval.c:1834
msgid "E688: More targets than List items"
msgstr "E688: ะฆั–ะปะตะน ะฑั–ะปัŒัˆะต, ะฝั–ะถ ะตะปะตะผะตะฝั‚ั–ะฒ ัะฟะธัะบัƒ"
-#: ../eval.c:1906
msgid "Double ; in list of variables"
msgstr "ะ”ั€ัƒะณะฐ ; ัƒ ัะฟะธัะบัƒ ะทะผั–ะฝะฝะธั…"
-# msgstr "E235: "
-#: ../eval.c:2078
#, c-format
msgid "E738: Can't list variables for %s"
msgstr "E738: ะะต ะผะพะถะฝะฐ ะฟะตั€ะตั€ะฐั…ัƒะฒะฐั‚ะธ ะทะผั–ะฝะฝั– ัƒ %s"
-#: ../eval.c:2391
+#, c-format
+msgid "E121: Undefined variable: %.*s"
+msgstr "E121: ะะตะฒะธะทะฝะฐั‡ะตะฝะฐ ะทะผั–ะฝะฝะฐ: %.*s"
+
msgid "E689: Can only index a List or Dictionary"
msgstr "E689: ะ†ะฝะดะตะบัะฝะธะน ะดะพัั‚ัƒะฟ ะผะพะถะต ะฑัƒั‚ะธ ั‚ั–ะปัŒะบะธ ะดะพ ัะฟะธัะบัƒ ั‡ะธ ัะปะพะฒะฝะธะบะฐ"
-#: ../eval.c:2396
msgid "E708: [:] must come last"
msgstr "E708: [:] ะผะฐั” ะฑัƒั‚ะธ ะพัั‚ะฐะฝะฝัŒะพัŽ"
-#: ../eval.c:2439
+msgid "E713: Cannot use empty key after ."
+msgstr "E713: ะะตะผะพะถะปะธะฒะพ ะฒะถะธั‚ะธ ะฟะพั€ะพะถะฝั–ะน ะบะปัŽั‡ ะฟั–ัะปั ."
+
msgid "E709: [:] requires a List value"
msgstr "E709: [:] ะฒะธะผะฐะณะฐั” ัะฟะธัะพะบ"
-#: ../eval.c:2674
msgid "E710: List value has more items than target"
msgstr "E710: ะกะฟะธัะพะบ ะผะฐั” ะฑั–ะปัŒัˆะต ะตะปะตะผะตะฝั‚ั–ะฒ, ะฝั–ะถ ั†ั–ะปัŒ"
-#: ../eval.c:2678
msgid "E711: List value has not enough items"
msgstr "E711: ะกะฟะธัะพะบ ะผะฐั” ะฝะตะดะพัั‚ะฐั‚ะฝัŒะพ ะตะปะตะผะตะฝั‚ั–ะฒ"
-#: ../eval.c:2867
msgid "E690: Missing \"in\" after :for"
msgstr "E690: ะŸั€ะพะฟัƒั‰ะตะฝะพ ยซinยป ะฟั–ัะปั :for"
-#: ../eval.c:3063
#, c-format
msgid "E107: Missing parentheses: %s"
msgstr "E107: ะŸั€ะพะฟัƒั‰ะตะฝะพ ะดัƒะถะบะธ: %s"
-#: ../eval.c:3263
#, c-format
msgid "E108: No such variable: \"%s\""
msgstr "E108: ะ—ะผั–ะฝะฝะพั— ะฝะตะผะฐั”: ยซ%sยป"
-#: ../eval.c:3333
-msgid "E743: variable nested too deep for (un)lock"
-msgstr "E743: ะ—ะผั–ะฝะฝะฐ ะผะฐั” ะทะฐะฑะฐะณะฐั‚ะพ ะฒะบะปะฐะดะตะฝัŒ ั‰ะพะฑ ะฑัƒั‚ะธ ะทะฐ-/ะฒั–ะดะบั€ะธั‚ะพัŽ."
+#, c-format
+msgid "E940: Cannot lock or unlock variable %s"
+msgstr "E940: ะะตะผะพะถะปะธะฒะพ ะทะฐะฑะปะพะบัƒะฒะฐั‚ะธ ั‡ะธ ั€ะพะทะฑะปะพะบัƒะฒะฐั‚ะธ ะทะผั–ะฝะฝัƒ %s"
-#: ../eval.c:3630
msgid "E109: Missing ':' after '?'"
msgstr "E109: ะ‘ั€ะฐะบัƒั” ':' ะฟั–ัะปั '?'"
-#: ../eval.c:3893
msgid "E691: Can only compare List with List"
msgstr "E691: ะกะฟะธัะพะบ ะผะพะถะฝะฐ ะฟะพั€ั–ะฒะฝัั‚ะธ ั‚ั–ะปัŒะบะธ ะทั– ัะฟะธัะบะพะผ"
-#: ../eval.c:3895
-msgid "E692: Invalid operation for Lists"
+msgid "E692: Invalid operation for List"
msgstr "E692: ะะตะบะพั€ะตะบั‚ะฝะฐ ะพะฟะตั€ะฐั†ั–ั ะฝะฐะด ัะฟะธัะบะพะผ"
-#: ../eval.c:3915
msgid "E735: Can only compare Dictionary with Dictionary"
msgstr "E735: ะกะปะพะฒะฝะธะบ ะผะพะถะฝะฐ ะฟะพั€ั–ะฒะฝัั‚ะธ ั‚ั–ะปัŒะบะธ ั–ะท ัะปะพะฒะฝะธะบะพะผ"
-#: ../eval.c:3917
msgid "E736: Invalid operation for Dictionary"
msgstr "E736: ะะตะบะพั€ะตะบั‚ะฝะฐ ะพะฟะตั€ะฐั†ั–ั ะฝะฐะด ัะปะพะฒะฝะธะบะพะผ"
-#: ../eval.c:3932
-msgid "E693: Can only compare Funcref with Funcref"
-msgstr "E693: ะคัƒะฝะบั†ั–ัŽ ะผะพะถะฝะฐ ะฟะพั€ั–ะฒะฝัั‚ะธ ั‚ั–ะปัŒะบะธ ะท ั„ัƒะฝะบั†ั–ั”ัŽ"
-
-#: ../eval.c:3934
msgid "E694: Invalid operation for Funcrefs"
msgstr "E694: ะะตะบะพั€ะตะบั‚ะฝะฐ ะพะฟะตั€ะฐั†ั–ั ะฝะฐะด ั„ัƒะฝะบั†ั–ั”ัŽ"
-#: ../eval.c:4277
msgid "E804: Cannot use '%' with Float"
msgstr "E804: ะะต ะผะพะถะฝะฐ ะฒะธะบะพะฝะฐั‚ะธ '%' ะฝะฐะด Float"
-#: ../eval.c:4478
msgid "E110: Missing ')'"
msgstr "E110: ะŸั€ะพะฟัƒั‰ะตะฝะพ ')'"
-#: ../eval.c:4609
msgid "E695: Cannot index a Funcref"
msgstr "E695: ะคัƒะฝะบั†ั–ั ะฝะต ะผะฐั” ั–ะฝะดะตะบัะฐั†ั–ั—"
-#: ../eval.c:4839
+msgid "E909: Cannot index a special variable"
+msgstr "E909: ะกะฟะตั†ั–ะฐะปัŒะฝะฐ ะทะผั–ะฝะฝะฐ ะฝะต ะผะฐั” ั–ะฝะดะตะบัะฐั†ั–ั—"
+
#, c-format
msgid "E112: Option name missing: %s"
msgstr "E112: ะ‘ั€ะฐะบัƒั” ะฝะฐะทะฒะธ ะพะฟั†ั–ั—: %s"
-#: ../eval.c:4855
#, c-format
msgid "E113: Unknown option: %s"
msgstr "E113: ะะตะฒั–ะดะพะผะฐ ะพะฟั†ั–ั: %s"
-#: ../eval.c:4904
#, c-format
msgid "E114: Missing quote: %s"
msgstr "E114: ะ‘ั€ะฐะบัƒั” ะปะฐะฟะบะธ: %s"
-#: ../eval.c:5020
#, c-format
msgid "E115: Missing quote: %s"
msgstr "E115: ะ‘ั€ะฐะบัƒั” ะปะฐะฟะบะธ: %s"
-# msgstr "E404: "
-#: ../eval.c:5084
#, c-format
msgid "E696: Missing comma in List: %s"
msgstr "E696: ะ‘ั€ะฐะบัƒั” ะบะพะผะธ ัƒ ัะฟะธัะบัƒ: %s"
-#: ../eval.c:5091
#, c-format
msgid "E697: Missing end of List ']': %s"
msgstr "E697: ะะตะผะฐั” ะบั–ะฝั†ั–ะฒะบะธ ัะฟะธัะบัƒ ']': %s"
-# msgstr "E235: "
-#: ../eval.c:6475
+msgid "Not enough memory to set references, garbage collection aborted!"
+msgstr ""
+"ะะตะดะพัั‚ะฐั‚ะฝัŒะพ ะฟะฐะผโ€™ัั‚ั– ะดะปั ะฒัั‚ะฐะฝะพะฒะปะตะฝะฝั ะฟะพัะธะปะฐะฝัŒ, ะทะฑะธั€ะฐะฝะฝั ัะผั–ั‚ั‚ั ะฟั€ะธะฟะธะฝะตะฝะพ!"
+
#, c-format
msgid "E720: Missing colon in Dictionary: %s"
msgstr "E720: ะ‘ั€ะฐะบัƒั” ะดะฒะพะบั€ะฐะฟะบะธ ัƒ ัะปะพะฒะฝะธะบัƒ: %s"
-#: ../eval.c:6499
#, c-format
msgid "E721: Duplicate key in Dictionary: \"%s\""
msgstr "E721: ะŸะพะฒั‚ะพั€ะตะฝะฝั ะบะปัŽั‡ะฐ ะฒ ัะปะพะฒะฝะธะบัƒ: ยซ%sยป"
-# msgstr "E235: "
-#: ../eval.c:6517
#, c-format
msgid "E722: Missing comma in Dictionary: %s"
msgstr "E722: ะ‘ั€ะฐะบัƒั” ะบะพะผะธ ัƒ ัะปะพะฒะฝะธะบัƒ: %s"
-#: ../eval.c:6524
#, c-format
msgid "E723: Missing end of Dictionary '}': %s"
msgstr "E723: ะะตะผะฐั” ะบั–ะฝั†ั–ะฒะบะธ ัะปะพะฒะฝะธะบะฐ '}': %s"
-# msgstr "E21: "
-#: ../eval.c:6555
-msgid "E724: variable nested too deep for displaying"
-msgstr "E724: ะฃ ะทะผั–ะฝะฝั–ะน ะทะฐะฑะฐะณะฐั‚ะพ ะฒะบะปะฐะดะตะฝัŒ ั‰ะพะฑ ั—ั— ะฟะพะบะฐะทะฐั‚ะธ"
+#, c-format
+msgid "E125: Illegal argument: %s"
+msgstr "E125: ะะตะดะพะทะฒะพะปะตะฝะธะน ะฐั€ะณัƒะผะตะฝั‚: %s"
+
+#, c-format
+msgid "E853: Duplicate argument name: %s"
+msgstr "E853: ะะฐะทะฒะฐ ะฐั€ะณัƒะผะตะฝั‚ัƒ ะฟะพะฒั‚ะพั€ัŽั”ั‚ัŒัั: %s"
-#: ../eval.c:7188
#, c-format
msgid "E740: Too many arguments for function %s"
msgstr "E740: ะ—ะฐะฑะฐะณะฐั‚ะพ ะฐั€ะณัƒะผะตะฝั‚ั–ะฒ ะดะปั ั„ัƒะฝะบั†ั–ั— %s"
-#: ../eval.c:7190
#, c-format
msgid "E116: Invalid arguments for function %s"
msgstr "E116: ะะตะฟั€ะฐะฒะธะปัŒะฝั– ะฐั€ะณัƒะผะตะฝั‚ะธ ั„ัƒะฝะบั†ั–ั— %s"
-#: ../eval.c:7377
#, c-format
msgid "E117: Unknown function: %s"
msgstr "E117: ะะตะฒั–ะดะพะผะฐ ั„ัƒะฝะบั†ั–ั: %s"
-#: ../eval.c:7383
+#, c-format
+msgid "E933: Function was deleted: %s"
+msgstr "E933: ะคัƒะฝะบั†ั–ัŽ ะฑัƒะปะพ ะฒะธะดะฐะปะตะฝะพ: %s"
+
#, c-format
msgid "E119: Not enough arguments for function: %s"
msgstr "E119: ะ—ะฐะผะฐะปะพ ะฐั€ะณัƒะผะตะฝั‚ั–ะฒ ะดะปั ั„ัƒะฝะบั†ั–ั— %s"
-#: ../eval.c:7387
#, c-format
msgid "E120: Using <SID> not in a script context: %s"
msgstr "E120: <SID> ะฒะธะบะพั€ะธัั‚ะพะฒัƒั”ั‚ัŒัั ะฝะต ัƒ ะบะพะฝั‚ะตะบัั‚ั– ัะบั€ะธะฟั‚ัƒ: %s"
-#: ../eval.c:7391
#, c-format
msgid "E725: Calling dict function without Dictionary: %s"
msgstr "E725: ะ’ะธะบะปะธะบ dict-ั„ัƒะฝะบั†ั–ั— ะฑะตะท ัะปะพะฒะฝะธะบะฐ: %s"
-#: ../eval.c:7453
-msgid "E808: Number or Float required"
-msgstr "E808: ะขั€ะตะฑะฐ ะฒะบะฐะทะฐั‚ะธ Number ั‡ะธ Float"
+#, c-format
+msgid "Error converting the call result: %s"
+msgstr "ะะต ะฒะดะฐะปะพัั ะฟะตั€ะตั‚ะฒะพั€ะธั‚ะธ ั€ะตะทัƒะปัŒั‚ะฐั‚ ะฒะธะบะปะธะบัƒ: %s"
-# msgstr "E14: "
-#: ../eval.c:7503
msgid "add() argument"
msgstr "ะฐั€ะณัƒะผะตะฝั‚ add()"
-#: ../eval.c:7907
msgid "E699: Too many arguments"
msgstr "E699: ะ—ะฐะฑะฐะณะฐั‚ะพ ะฐั€ะณัƒะผะตะฝั‚ั–ะฒ"
-# msgstr "E327: "
-#: ../eval.c:8073
+#, c-format
+msgid "Invalid channel stream \"%s\""
+msgstr "ะะตะบะพั€ะตะบั‚ะฝะธะน ะฟะพั‚ั–ะบ ะทะฐะฒะดะฐะฝะฝั ยซ%sยป"
+
msgid "E785: complete() can only be used in Insert mode"
-msgstr "E785: complete() ะผะพะถะฝะฐ ะฒะถะธะฒะฐั‚ะธ ั‚ั–ะปัŒะบะธ ะฒ ั€ะตะถะธะผั– ะฒัั‚ะฐะฒะบะธ"
+msgstr "E785: complete() ะผะพะถะฝะฐ ะฒะถะธะฒะฐั‚ะธ ั‚ั–ะปัŒะบะธ ะฒ ั€ะตะถะธะผั– ะฒัั‚ะฐะฒะปัะฝะฝั"
-#: ../eval.c:8156
msgid "&Ok"
msgstr "&O:ะ“ะฐั€ะฐะทะด"
-# msgstr "E226: "
-#: ../eval.c:8676
-#, c-format
-msgid "E737: Key already exists: %s"
-msgstr "E737: ะšะปัŽั‡ ะฒะถะต ั–ัะฝัƒั”: %s"
+msgid "dictwatcheradd() argument"
+msgstr "ะฐั€ะณัƒะผะตะฝั‚ dictwatcheradd()"
-# msgstr "E14: "
-#: ../eval.c:8692
msgid "extend() argument"
msgstr "ะฐั€ะณัƒะผะตะฝั‚ extend()"
-# msgstr "E14: "
-#: ../eval.c:8915
msgid "map() argument"
msgstr "ะฐั€ะณัƒะผะตะฝั‚ map()"
-# msgstr "E14: "
-#: ../eval.c:8916
msgid "filter() argument"
msgstr "ะฐั€ะณัƒะผะตะฝั‚ filter()"
-#: ../eval.c:9229
-#, c-format
-msgid "+-%s%3ld lines: "
-msgstr "+-%s%3ld ั€ัะดะบั–ะฒ: "
-
-#: ../eval.c:9291
#, c-format
msgid "E700: Unknown function: %s"
msgstr "E700: ะะตะฒั–ะดะพะผะฐ ั„ัƒะฝะบั†ั–ั: %s"
-#: ../eval.c:10729
+msgid "E922: expected a dict"
+msgstr "E922: ะพั‡ั–ะบัƒั”ั‚ัŒัั ัะปะพะฒะฝะธะบ"
+
+msgid "E923: Second argument of function() must be a list or a dict"
+msgstr "E923: ะ”ั€ัƒะณะธะน ะฐั€ะณัƒะผะตะฝั‚ function() ะผะฐั” ะฑัƒั‚ะธ ัะฟะธัะบะพะผ ั‡ะธ ัะปะพะฒะฝะธะบะพะผ"
+
+msgid "E5000: Cannot find tab number."
+msgstr "E5000: ะะต ะผะพะถะฝะฐ ะทะฝะฐะนั‚ะธ ะฝะพะผะตั€ ะฒะบะปะฐะดะบะธ."
+
+msgid "E5001: Higher scope cannot be -1 if lower scope is >= 0."
+msgstr "E5001: ะ’ะธั‰ะฐ ะพะฑะปะฐัั‚ัŒ ะฝะต ะผะพะถะต ะฑัƒั‚ะธ -1, ัะบั‰ะพ ะฝะธะถั‡ะฐ ะพะฑะปะฐัั‚ัŒ >= 0."
+
+msgid "E5002: Cannot find window number."
+msgstr "E5002: ะะตะผะพะถะปะธะฒะพ ะทะฝะฐะนั‚ะธ ะฝะพะผะตั€ ะฒั–ะบะฝะฐ."
+
+msgid "E5050: {opts} must be the only argument"
+msgstr "E5050: {opts} ะผะฐั” ะฑัƒั‚ะธ ั”ะดะธะฝะธะผ ะฐั€ะณัƒะผะตะฝั‚ะพะผ"
+
msgid "called inputrestore() more often than inputsave()"
msgstr "ะ’ะธะบะปะธะบะธ ะดะพ inputrestore() ั‡ะฐัั‚ั–ัˆะต, ะฝั–ะถ ะดะพ inputsave()"
-# msgstr "E14: "
-#: ../eval.c:10771
msgid "insert() argument"
msgstr "ะฐั€ะณัƒะผะตะฝั‚ insert()"
-# msgstr "E406: "
-#: ../eval.c:10841
msgid "E786: Range not allowed"
msgstr "E786: ะ†ะฝั‚ะตั€ะฒะฐะป ะฝะต ะดะพะทะฒะพะปะตะฝะพ"
-# msgstr "E177: "
-#: ../eval.c:11140
+msgid "E474: Failed to convert list to string"
+msgstr "E474: ะะต ะฒะดะฐะปะพัั ะฟะตั€ะตั‚ะฒะพั€ะธั‚ะธ ัะฟะธัะพะบ ัƒ ั‚ะตะบัั‚"
+
+#, c-format
+msgid "E474: Failed to parse %.*s"
+msgstr "E474: ะะต ะฒะดะฐะปะพัั ั€ะพะทั–ะฑั€ะฐั‚ะธ %.*s"
+
msgid "E701: Invalid type for len()"
msgstr "E701: ะะตะบะพั€ะตะบั‚ะฝะธะน ั‚ะธะฟ ะดะปั len()"
-#: ../eval.c:11980
+#, c-format
+msgid "E798: ID is reserved for \":match\": %<PRId64>"
+msgstr "E798: ID ะทะฐั€ะตะทะตั€ะฒะพะฒะฐะฝะพ ะดะปั \":match\": %<PRId64>"
+
+#, c-format
+msgid "E798: ID is reserved for \"match\": %<PRId64>"
+msgstr "E798: ID ะทะฐั€ะตะทะตั€ะฒะพะฒะฐะฝะพ ะดะปั \"match\": %<PRId64>"
+
+#, c-format
+msgid "msgpackdump() argument, index %i"
+msgstr "ะฐั€ะณัƒะผะตะฝั‚ msgpackdump(), ั–ะฝะดะตะบั %i"
+
+msgid "E5070: Character number must not be less than zero"
+msgstr "E5070: ะะพะผะตั€ ัะธะผะฒะพะปะฐ ะผะฐั” ะฑัƒั‚ะธ ะฝะตะฒั–ะดโ€™ั”ะผะฝะธะผ"
+
+#, c-format
+msgid "E5071: Character number must not be greater than INT_MAX (%i)"
+msgstr "E5071: ะะพะผะตั€ ัะธะผะฒะพะปะฐ ะฝะต ะผะพะถะต ะฑัƒั‚ะธ ะฑั–ะปัŒัˆะธะผ, ะฝั–ะถ INT_MAX (%i)"
+
msgid "E726: Stride is zero"
msgstr "E726: ะšั€ะพะบ ะฝัƒะปัŒะพะฒะธะน"
-#: ../eval.c:11982
msgid "E727: Start past end"
msgstr "E727: ะŸะพั‡ะฐั‚ะพะบ ะทะฐ ะบั–ะฝั†ะตะผ"
-#: ../eval.c:12024 ../eval.c:15297
msgid "<empty>"
msgstr "<ะฝั–ั‡ะพะณะพ>"
-# msgstr "E14: "
-#: ../eval.c:12282
msgid "remove() argument"
msgstr "ะฐั€ะณัƒะผะตะฝั‚ remove()"
-#: ../eval.c:12466
msgid "E655: Too many symbolic links (cycle?)"
msgstr "E655: ะ—ะฐะฑะฐะณะฐั‚ะพ ัะธะผะฒะพะปัŒะฝะธั… ะฟะพัะธะปะฐะฝัŒ (ั†ะธะบะป?)"
-# msgstr "E14: "
-#: ../eval.c:12593
msgid "reverse() argument"
msgstr "ะฐั€ะณัƒะผะตะฝั‚ reverse()"
-# msgstr "E14: "
-#: ../eval.c:13721
+#, c-format
+msgid "E5010: List item %d of the second argument is not a string"
+msgstr "E5010: ะ•ะปะตะผะตะฝั‚ ัะฟะธัะบัƒ %d ะดั€ัƒะณะพะณะพ ะฐั€ะณัƒะผะตะฝั‚ัƒ ะฝะต ั‚ะตะบัั‚"
+
+#, c-format
+msgid "E927: Invalid action: '%s'"
+msgstr "E927: ะะตะฟั€ะฐะฒะธะปัŒะฝะฐ ะดั–ั: ยซ%sยป"
+
+#, c-format
+msgid "E474: List item %d is either not a dictionary or an empty one"
+msgstr "E474: ะ•ะปะตะผะตะฝั‚ ัะฟะธัะบัƒ %d ะฐะฑะพ ะฝะต ัะปะพะฒะฝะธะบ ะฐะฑะพ ะฟะพั€ะพะถะฝั–ะน"
+
+#, c-format
+msgid "E474: List item %d is missing one of the required keys"
+msgstr "E474: ะ•ะปะตะผะตะฝั‚ ัะฟะธัะบัƒ %d ะฝะตะผะฐั” ะพะดะฝะพะณะพ ะท ะพะฑะพะฒโ€™ัะทะบะพะฒะธั… ะบะปัŽั‡ั–ะฒ"
+
+#, c-format
+msgid "connection failed: %s"
+msgstr "ะทโ€™ั”ะดะฝะฐะฝะฝั ะฝะต ะฒะดะฐะปะพัั: %s"
+
msgid "sort() argument"
msgstr "ะฐั€ะณัƒะผะตะฝั‚ sort()"
-# msgstr "E14: "
-#: ../eval.c:13721
-#, fuzzy
msgid "uniq() argument"
-msgstr "ะฐั€ะณัƒะผะตะฝั‚ add()"
+msgstr "ะฐั€ะณัƒะผะตะฝั‚ uniq()"
-# msgstr "E364: "
-#: ../eval.c:13776
msgid "E702: Sort compare function failed"
msgstr "E702: ะŸะพะผะธะปะบะฐ ัƒ ั„ัƒะฝะบั†ั–ั— ะฟะพั€ั–ะฒะฝัะฝะฝั"
-# msgstr "E364: "
-#: ../eval.c:13806
-#, fuzzy
msgid "E882: Uniq compare function failed"
-msgstr "E702: ะŸะพะผะธะปะบะฐ ัƒ ั„ัƒะฝะบั†ั–ั— ะฟะพั€ั–ะฒะฝัะฝะฝั"
+msgstr "E882: ะŸะพะผะธะปะบะฐ ัƒ ั„ัƒะฝะบั†ั–ั— ะฟะพั€ั–ะฒะฝัะฝะฝั uniq"
+
+#, c-format
+msgid "E6100: \"%s\" is not a valid stdpath"
+msgstr "E6100: \"%s\" โ€” ะฝะตะบะพั€ะตะบั‚ะฝะธะน stdpath"
-#: ../eval.c:14085
msgid "(Invalid)"
msgstr "(ะะตะผะพะถะปะธะฒะพ)"
-#: ../eval.c:14590
-msgid "E677: Error writing temp file"
-msgstr "E677: ะะต ะฒะดะฐะปะพัั ะทะฐะฟะธัะฐั‚ะธ ั‚ะธะผั‡ะฐัะพะฒะธะน ั„ะฐะนะป"
-
-#: ../eval.c:16159
-msgid "E805: Using a Float as a Number"
-msgstr "E805: Float ะฒะถะธั‚ะพ ัะบ Number"
+#, c-format
+msgid "E935: invalid submatch number: %d"
+msgstr "E935: ะฝะตะฟั€ะฐะฒะธะปัŒะฝะธะน ะฝะพะผะตั€ ะณั€ัƒะฟะธ ัะฟั–ะฒะฟะฐะดั–ะฝะฝั: %d"
-#: ../eval.c:16162
-msgid "E703: Using a Funcref as a Number"
-msgstr "E703: Funcref ะฒะถะธั‚ะพ ัะบ Number"
+#, c-format
+msgid "Executing command: \"%s\""
+msgstr "ะ’ะธะบะพะฝัƒั”ั‚ัŒัั ะบะพะผะฐะฝะดะฐ: ยซ%sยป"
-#: ../eval.c:16170
-msgid "E745: Using a List as a Number"
-msgstr "E745: List ะฒะถะธั‚ะพ ัะบ Number"
+msgid "Can only call this function in an unmodified buffer"
+msgstr "ะฆัŽ ั„ัƒะฝะบั†ั–ัŽ ะผะพะถะฝะฐ ะฒะธะบะปะธะบะฐั‚ะธ ั‚ั–ะปัŒะบะธ ัƒ ะฝะตะทะผั–ะฝะตะฝะพะผัƒ ะฑัƒั„ะตั€ั–"
-#: ../eval.c:16173
-msgid "E728: Using a Dictionary as a Number"
-msgstr "E728: Dictionary ะฒะถะธั‚ะพ ัะบ Number"
+msgid "E921: Invalid callback argument"
+msgstr "E921: ะะตะบะพั€ะตะบั‚ะฝะธะน ะฐั€ะณัƒะผะตะฝั‚ ั„ัƒะฝะบั†ั–ั— ะทะฒะพั€ะพั‚ะฝัŒะพะณะพ ะฒะธะบะปะธะบัƒ"
-#: ../eval.c:16259
-msgid "E729: using Funcref as a String"
-msgstr "E729: Funcref ะฒะถะธั‚ะพ ัะบ String"
+#, c-format
+msgid "E80: Error while writing: %s"
+msgstr "E80: ะŸะพะผะธะปะบะฐ ะฟั–ะด ั‡ะฐั ะทะฐะฟะธััƒ: %s"
-# msgstr "E373: "
-#: ../eval.c:16262
-msgid "E730: using List as a String"
-msgstr "E730: List ะฒะถะธั‚ะพ ัะบ String"
+#, c-format
+msgid "E5060: Unknown flag: %s"
+msgstr "E5060: ะะตะฒั–ะดะพะผะธะน ะฟั€ะฐะฟะพั€ะตั†ัŒ: %s"
-#: ../eval.c:16265
-msgid "E731: using Dictionary as a String"
-msgstr "E731: Dictionary ะฒะถะธั‚ะพ ัะบ String"
+msgid "E482: Can't open file with an empty name"
+msgstr "E482: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ั„ะฐะนะป ะท ะฟะพั€ะพะถะฝั–ะผ ั–ะผโ€™ัะผ"
-#: ../eval.c:16619
#, c-format
-msgid "E706: Variable type mismatch for: %s"
-msgstr "E706: ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ั‚ะธะฟ ะทะผั–ะฝะฝะพั—: %s"
+msgid "E482: Can't open file %s for writing: %s"
+msgstr "E482: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ั„ะฐะนะป %s ะดะปั ะทะฐะฟะธััƒ: %s"
-#: ../eval.c:16705
#, c-format
-msgid "E795: Cannot delete variable %s"
-msgstr "E795: ะะต ะผะพะถะฝะฐ ะทะฝะธั‰ะธั‚ะธ ะทะผั–ะฝะฝัƒ %s"
+msgid "E80: Error when closing file %s: %s"
+msgstr "E80: ะŸะพะผะธะปะบะฐ ะฟั€ะธ ะทะฐะบั€ะธั‚ั‚ั– ั„ะฐะนะปัƒ %s: %s"
-#: ../eval.c:16724
#, c-format
-msgid "E704: Funcref variable name must start with a capital: %s"
-msgstr "E704: ะะฐะทะฒะฐ ะทะผั–ะฝะฝะพั— Funcref ะผะฐั” ะฟะพั‡ะธะฝะฐั‚ะธัั ะท ะฒะตะปะธะบะพั— ะปั–ั‚ะตั€ะธ: %s"
+msgid "E963: setting %s to value with wrong type"
+msgstr "E963: ะฒัั‚ะฐะฝะพะฒะปะตะฝะฝั %s ะดะพ ะทะฝะฐั‡ะตะฝะฝั ะท ะฝะตะฟั€ะฐะฒะธะปัŒะฝะธะผ ั‚ะธะฟะพะผ"
-#: ../eval.c:16732
#, c-format
-msgid "E705: Variable name conflicts with existing function: %s"
-msgstr "E705: ะะฐะทะฒะฐ ะทะผั–ะฝะฝะพั— ัะฟั–ะฒะฟะฐะดะฐั” ะท ั–ัะฝัƒัŽั‡ะพัŽ ั„ัƒะฝะบั†ั–ั”ัŽ: %s"
+msgid "E794: Cannot set variable in the sandbox: \"%.*s\""
+msgstr "E794: ะะต ะผะพะถะฝะฐ ะฒัั‚ะฐะฝะพะฒะธั‚ะธ ะทะผั–ะฝะฝัƒ ัƒ ะฟั–ัะพั‡ะฝะธั†ั–: ยซ%.*sยป"
-#: ../eval.c:16763
#, c-format
-msgid "E741: Value is locked: %s"
-msgstr "E741: ะ—ะฝะฐั‡ะตะฝะฝั ะทะฐั…ะธั‰ะตะฝะต: %s"
+msgid "E795: Cannot delete variable %.*s"
+msgstr "E795: ะะต ะผะพะถะฝะฐ ะทะฝะธั‰ะธั‚ะธ ะทะผั–ะฝะฝัƒ %.*s"
-#: ../eval.c:16764 ../eval.c:16769 ../message.c:1839
-msgid "Unknown"
-msgstr "ะะตะฒั–ะดะพะผะพ"
+#, c-format
+msgid "E704: Funcref variable name must start with a capital: %s"
+msgstr "E704: ะะฐะทะฒะฐ ะทะผั–ะฝะฝะพั— Funcref ะผะฐั” ะฟะพั‡ะธะฝะฐั‚ะธัั ะท ะฒะตะปะธะบะพั— ะปั–ั‚ะตั€ะธ: %s"
-#: ../eval.c:16768
#, c-format
-msgid "E742: Cannot change value of %s"
-msgstr "E742: ะะต ะผะพะถะฝะฐ ะทะผั–ะฝะธั‚ะธ ะทะฝะฐั‡ะตะฝะฝั %s"
+msgid "E705: Variable name conflicts with existing function: %s"
+msgstr "E705: ะะฐะทะฒะฐ ะทะผั–ะฝะฝะพั— ัะฟั–ะฒะฟะฐะดะฐั” ะท ั–ัะฝัƒัŽั‡ะพัŽ ั„ัƒะฝะบั†ั–ั”ัŽ: %s"
-#: ../eval.c:16838
msgid "E698: variable nested too deep for making a copy"
msgstr "E698: ะ—ะผั–ะฝะฝะฐ ะฒะบะปะฐะดะตะฝะฐ ะทะฐะฝะฐะดั‚ะพ ะณะปะธะฑะพะบะพ ั‰ะพะฑ ะทั€ะพะฑะธั‚ะธ ั—ั— ะบะพะฟั–ัŽ"
-#: ../eval.c:17249
#, c-format
msgid "E123: Undefined function: %s"
msgstr "E123: ะะตะฒะธะทะฝะฐั‡ะตะฝะฐ ั„ัƒะฝะบั†ั–ั: %s"
-#: ../eval.c:17260
#, c-format
msgid "E124: Missing '(': %s"
msgstr "E124: ะ‘ั€ะฐะบัƒั” '(': %s"
-#: ../eval.c:17293
msgid "E862: Cannot use g: here"
msgstr "E862: ะขัƒั‚ ะฝะต ะผะพะถะฝะฐ ะฒะธะบะพั€ะธัั‚ะฐั‚ะธ g:"
-#: ../eval.c:17312
#, c-format
-msgid "E125: Illegal argument: %s"
-msgstr "E125: ะะตะดะพะทะฒะพะปะตะฝะธะน ะฐั€ะณัƒะผะตะฝั‚: %s"
+msgid "E932: Closure function should not be at top level: %s"
+msgstr "E932: ะคัƒะฝะบั†ั–ั ะทะฐะผะธะบะฐะฝะฝั ะฝะต ะผะพะถะต ะฑัƒั‚ะธ ะฝะฐ ะฒะตั€ั…ะฝัŒะพะผัƒ ั€ั–ะฒะฝั–: %s"
-#: ../eval.c:17323
-#, c-format
-msgid "E853: Duplicate argument name: %s"
-msgstr "E853: ะะฐะทะฒะฐ ะฐั€ะณัƒะผะตะฝั‚ัƒ ะฟะพะฒั‚ะพั€ัŽั”ั‚ัŒัั: %s"
-
-#: ../eval.c:17416
msgid "E126: Missing :endfunction"
msgstr "E126: ะ‘ั€ะฐะบัƒั” :endfunction"
-#: ../eval.c:17537
+#, c-format
+msgid "W22: Text found after :endfunction: %s"
+msgstr "W22: ะขั€ะฐะฟะธะฒัั ั‚ะตะบัั‚ ะฟั–ัะปั :endfunction: %s"
+
#, c-format
msgid "E707: Function name conflicts with variable: %s"
msgstr "E707: ะะฐะทะฒะฐ ั„ัƒะฝะบั†ั–ั— ัะฟั–ะฒะฟะฐะดะฐั” ะทั– ะทะผั–ะฝะฝะพัŽ: %s"
-#: ../eval.c:17549
#, c-format
msgid "E127: Cannot redefine function %s: It is in use"
msgstr "E127: ะะต ะฒะดะฐะปะพัั ะฟะตั€ะตะฒะธะทะฝะฐั‡ะธั‚ะธ ั„ัƒะฝะบั†ั–ัŽ %s: ะฒะพะฝะฐ ะฒะธะบะพั€ะธัั‚ะพะฒัƒั”ั‚ัŒัั"
-#: ../eval.c:17604
#, c-format
msgid "E746: Function name does not match script file name: %s"
msgstr "E746: ะะฐะทะฒะฐ ั„ัƒะฝะบั†ั–ั— ะฝะต ะทะฑั–ะณะฐั”ั‚ัŒัั ะท ะฝะฐะทะฒะพัŽ ั„ะฐะนะปัƒ ัะบั€ะธะฟั‚ัƒ: %s"
-#: ../eval.c:17716
msgid "E129: Function name required"
msgstr "E129: ะะต ะฒะบะฐะทะฐะฝะพ ะฝะฐะทะฒัƒ ั„ัƒะฝะบั†ั–ั—"
-#: ../eval.c:17824
-#, fuzzy, c-format
+#, c-format
msgid "E128: Function name must start with a capital or \"s:\": %s"
-msgstr ""
-"E128: ะะฐะทะฒะฐ ั„ัƒะฝะบั†ั–ั— ะผะฐั” ะฟะพั‡ะธะฝะฐั‚ะธัั ะท ะฒะตะปะธะบะพั— ะปั–ั‚ะตั€ะธ ะฐะฑะพ ะผั–ัั‚ะธั‚ะธ ะดะฒะพะบั€ะฐะฟะบัƒ: %s"
+msgstr "E128: ะะฐะทะฒะฐ ั„ัƒะฝะบั†ั–ั— ะผะฐั” ะฟะพั‡ะธะฝะฐั‚ะธัั ะท ะฒะตะปะธะบะพั— ะปั–ั‚ะตั€ะธ ะฐะฑะพ \"s:\": %s"
-#: ../eval.c:17833
-#, fuzzy, c-format
+#, c-format
msgid "E884: Function name cannot contain a colon: %s"
-msgstr ""
-"E128: ะะฐะทะฒะฐ ั„ัƒะฝะบั†ั–ั— ะผะฐั” ะฟะพั‡ะธะฝะฐั‚ะธัั ะท ะฒะตะปะธะบะพั— ะปั–ั‚ะตั€ะธ ะฐะฑะพ ะผั–ัั‚ะธั‚ะธ ะดะฒะพะบั€ะฐะฟะบัƒ: %s"
+msgstr "E884: ะะฐะทะฒะฐ ั„ัƒะฝะบั†ั–ั— ะฝะต ะผะพะถะต ะผั–ัั‚ะธั‚ะธ ะดะฒะพะบั€ะฐะฟะบัƒ: %s"
-#: ../eval.c:18336
#, c-format
msgid "E131: Cannot delete function %s: It is in use"
msgstr "E131: ะะต ะฒะดะฐะปะพัั ะทะฝะธั‰ะธั‚ะธ ั„ัƒะฝะบั†ั–ัŽ %s: ะ’ะพะฝะฐ ะฒะธะบะพั€ะธัั‚ะพะฒัƒั”ั‚ัŒัั"
-#: ../eval.c:18441
+#, c-format
+msgid "Cannot delete function %s: It is being used internally"
+msgstr "ะะต ะฒะดะฐะปะพัั ะทะฝะธั‰ะธั‚ะธ ั„ัƒะฝะบั†ั–ัŽ %s: ะ’ะพะฝะฐ ะฒะธะบะพั€ะธัั‚ะพะฒัƒั”ั‚ัŒัั"
+
msgid "E132: Function call depth is higher than 'maxfuncdepth'"
msgstr "E132: ะ“ะปะธะฑะธะฝะฐ ะฒะธะบะปะธะบั–ะฒ ั„ัƒะฝะบั†ั–ั— ะฟะตั€ะตะฒะธั‰ัƒั” 'maxfuncdepth'"
-#: ../eval.c:18568
#, c-format
msgid "calling %s"
msgstr "ะฒะธะบะปะธะบะฐั”ั‚ัŒัั %s"
-#: ../eval.c:18651
#, c-format
msgid "%s aborted"
msgstr "%s ะฟั€ะธะฟะธะฝะตะฝะพ"
-#: ../eval.c:18653
#, c-format
msgid "%s returning #%<PRId64>"
msgstr "%s ะฟะพะฒะตั€ั‚ะฐั” #%<PRId64>"
-#: ../eval.c:18670
#, c-format
msgid "%s returning %s"
msgstr "%s ะฟะพะฒะตั€ั‚ะฐั” %s"
-#: ../eval.c:18691 ../ex_cmds2.c:2695
#, c-format
msgid "continuing in %s"
msgstr "ะฟั€ะพะดะพะฒะถะตะฝะฝั ะฒ %s"
-#: ../eval.c:18795
msgid "E133: :return not inside a function"
msgstr "E133: :return ะฟะพะทะฐ ะผะตะถะฐะผะธ ั„ัƒะฝะบั†ั–ั—"
-#: ../eval.c:19159
msgid ""
"\n"
-"# global variables:\n"
+"\tLast set from "
msgstr ""
"\n"
-"# ะณะปะพะฑะฐะปัŒะฝั– ะทะผั–ะฝะฝั–:\n"
+"\tะ’ะพัั‚ะฐะฝะฝั” ะทะผั–ะฝะตะฝะฐ ัƒ "
+
+msgid "E5009: $VIMRUNTIME is empty or unset"
+msgstr "E5009: $VIMRUNTIME ะฟะพั€ะพะถะฝั ั‡ะธ ะฝะต ะฒัั‚ะฐะฝะพะฒะปะตะฝะฐ"
+
+#, c-format
+msgid "E5009: Invalid $VIMRUNTIME: %s"
+msgstr "E5009: ะะตะบะพั€ะตะบั‚ะฝะฐ $VIMRUNTIME: %s"
+
+msgid "E5009: Invalid 'runtimepath'"
+msgstr "E5009: ะะตะบะพั€ะตะบั‚ะฝะธะน 'runtimepath'"
+
+#, c-format
+msgid "E474: Expected comma before list item: %s"
+msgstr "E474: ะžั‡ั–ะบัƒั”ั‚ัŒัั ะบะพะผะฐ ะฟะตั€ะตะด ะตะปะตะผะตะฝั‚ะพะผ ัะฟะธัะบะฐ: %s"
+
+#, c-format
+msgid "E474: Expected colon before dictionary value: %s"
+msgstr "E474: ะžั‡ั–ะบัƒั”ั‚ัŒัั ะดะฒะพะบั€ะฐะฟะบะฐ ะฟะตั€ะตะด ะทะฝะฐั‡ะตะฝะฝัะผ ัƒ ัะปะพะฒะฝะธะบัƒ: %s"
+
+#, c-format
+msgid "E474: Expected string key: %s"
+msgstr "E474: ะžั‡ั–ะบัƒั”ั‚ัŒัั ั‚ะตะบัั‚ะพะฒะธะน ะบะปัŽั‡: %s"
+
+#, c-format
+msgid "E474: Expected comma before dictionary key: %s"
+msgstr "E474: ะžั‡ั–ะบัƒั”ั‚ัŒัั ะบะพะผะฐ ะฟะตั€ะตะด ัะปะพะฒะฝะธะบะพะฒะธะผ ะบะปัŽั‡ะตะผ: %s"
+
+#, c-format
+msgid "E474: Unfinished escape sequence: %.*s"
+msgstr "E474: ะะต ะทะฐะบั–ะฝั‡ะตะฝะพ ะฟะพัะปั–ะดะพะฒะฝั–ัั‚ัŒ escape: %.*s"
+
+#, c-format
+msgid "E474: Unfinished unicode escape sequence: %.*s"
+msgstr "E474: ะะต ะทะฐะบั–ะฝั‡ะตะฝะพ escape-ะฟะพัะปั–ะดะพะฒะฝั–ัั‚ัŒ ัŽะฝั–ะบะพะดัƒ: %.*s"
-#: ../eval.c:19254
+#, c-format
+msgid "E474: Expected four hex digits after \\u: %.*s"
+msgstr "E474: ะžั‡ั–ะบัƒั”ั‚ัŒัั ั‡ะพั‚ะธั€ะธ ัˆั–ัั‚ะฝะฐะดั†ัั‚ะบะพะฒั– ั†ะธั„ั€ะธ ะฟั–ัะปั \\u: %.*s"
+
+#, c-format
+msgid "E474: Unknown escape sequence: %.*s"
+msgstr "E474: ะะตะฒั–ะดะพะผะฐ ะฟะพัะปั–ะดะพะฒะฝั–ัั‚ัŒ escape: %.*s"
+
+#, c-format
+msgid "E474: ASCII control characters cannot be present inside string: %.*s"
+msgstr "E474: ะšะตั€ัƒัŽั‡ั– ัะธะผะฒะพะปะธ ASCII ะฝะต ะผะพะถัƒั‚ัŒ ะฑัƒั‚ะธ ะฒัะตั€ะตะดะธะฝั– ั‚ะตะบัั‚ัƒ: %.*s"
+
+#, c-format
+msgid "E474: Only UTF-8 strings allowed: %.*s"
+msgstr "E474: ะ”ะพะทะฒะพะปะตะฝะพ ั‚ั–ะปัŒะบะธ ั‚ะตะบัั‚ UTF-8: %.*s"
+
+#, c-format
msgid ""
-"\n"
-"\tLast set from "
+"E474: Only UTF-8 code points up to U+10FFFF are allowed to appear unescaped: "
+"%.*s"
msgstr ""
-"\n"
-"\tะ’ะพัั‚ะฐะฝะฝั” ะทะผั–ะฝะตะฝะฐ ัƒ "
+"E474: ะขั–ะปัŒะบะธ ั‚ะพั‡ะบะธ ะบะพะดัƒ UTF-8 ะดะพ U+10FFFF ะผะพะถัƒั‚ัŒ ะฑัƒั‚ะธ ะฟั€ะธััƒั‚ะฝั– ะฑะตะท escape: "
+"%.*s"
-#: ../eval.c:19272
-msgid "No old files"
-msgstr "ะ–ะพะดะฝะพะณะพ ัั‚ะฐั€ะพะณะพ ั„ะฐะนะปัƒ"
+#, c-format
+msgid "E474: Expected string end: %.*s"
+msgstr "E474: ะžั‡ั–ะบัƒะฒะฐะฒัั ะบั–ะฝะตั†ัŒ ั€ัะดะบะฐ: %.*s"
-#: ../ex_cmds.c:122
#, c-format
-msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
-msgstr "<%s>%s%s %d, ัˆั–ัั‚ %02x, ะฒั–ั %03o"
+msgid "E474: Leading zeroes are not allowed: %.*s"
+msgstr "E474: ะŸะพั‡ะฐั‚ะบะพะฒั– ะฝัƒะปั– ะฝะต ะดะพะทะฒะพะปะตะฝะพ: %.*s"
-#: ../ex_cmds.c:145
#, c-format
-msgid "> %d, Hex %04x, Octal %o"
-msgstr "> %d, ัˆั–ัั‚ %04x, ะฒั–ั %o"
+msgid "E474: Missing number after minus sign: %.*s"
+msgstr "E474: ะ‘ั€ะฐะบัƒั” ั‡ะธัะปะฐ ะฟั–ัะปั ะทะฝะฐะบัƒ: %.*s"
-#: ../ex_cmds.c:146
#, c-format
-msgid "> %d, Hex %08x, Octal %o"
-msgstr "> %d, ัˆั–ัั‚ %08x, ะฒั–ั %o"
+msgid "E474: Missing number after decimal dot: %.*s"
+msgstr "E474: ะ‘ั€ะฐะบัƒั” ั‡ะธัะปะฐ ะฟั–ัะปั ะดะตััั‚ะบะพะฒะพั— ะบั€ะฐะฟะบะธ: %.*s"
+
+#, c-format
+msgid "E474: Missing exponent: %.*s"
+msgstr "E474: ะ‘ั€ะฐะบัƒั” ะตะบัะฟะพะฝะตะฝั‚ะธ: %.*s"
-#: ../ex_cmds.c:684
-msgid "E134: Move lines into themselves"
-msgstr "E134: ะะตะผะพะถะปะธะฒะพ ะฟะตั€ะตะผั–ัั‚ะธั‚ะธ ั€ัะดะบะธ ัะฐะผั– ะฒ ัะตะฑะต"
+#, c-format
+msgid ""
+"E685: internal error: while converting number \"%.*s\" to float string2float "
+"consumed %zu bytes in place of %zu"
+msgstr ""
+"E685: ะฒะฝัƒั‚ั€ั–ัˆะฝั ะฟะพะผะธะปะบะฐ: ะฟั€ะธ ะฟะตั€ะตั‚ะฒะพั€ะตะฝะฝั– ั‡ะธัะปะฐ ยซ%.*sยป ัƒ float, string2float "
+"ัะฟะพะถะธะฒ %zu ะฑะฐะนั‚ั–ะฒ ะทะฐะผั–ัั‚ัŒ %zu"
-#: ../ex_cmds.c:747
-msgid "1 line moved"
-msgstr "ะŸะตั€ะตะผั–ั‰ะตะฝะพ ะพะดะธะฝ ั€ัะดะพะบ"
+#, c-format
+msgid ""
+"E685: internal error: while converting number \"%.*s\" to integer vim_str2nr "
+"consumed %i bytes in place of %zu"
+msgstr ""
+"E685: ะฒะฝัƒั‚ั€ั–ัˆะฝั ะฟะพะผะธะปะบะฐ: ะฟั€ะธ ะฟะตั€ะตั‚ะฒะพั€ะตะฝะฝั– ั‡ะธัะปะฐ ยซ%.*sยป ัƒ ั†ั–ะปะต, vim_str2nr "
+"ัะฟะพะถะธะฒ %i ะฑะฐะนั‚ั–ะฒ ะทะฐะผั–ัั‚ัŒ %zu"
+
+msgid "E474: Attempt to decode a blank string"
+msgstr "E474: ะกะฟั€ะพะฑะฐ ะดะตะบะพะดัƒะฒะฐะฝะฝั ะฟะพั€ะพะถะฝัŒะพะณะพ ั‚ะตะบัั‚ัƒ"
-#: ../ex_cmds.c:749
#, c-format
-msgid "%<PRId64> lines moved"
-msgstr "ะŸะตั€ะตะผั–ั‰ะตะฝะพ %<PRId64> ั€ัะดะบะธ(ั–ะฒ)"
+msgid "E474: No container to close: %.*s"
+msgstr "E474: ะะตะผะฐั” ะบะพะฝั‚ะตะนะฝะตั€ะฐ ั‰ะพะฑ ะทะฐะบั€ะธั‚ะธ: %.*s"
-#: ../ex_cmds.c:1175
#, c-format
-msgid "%<PRId64> lines filtered"
-msgstr "ะ’ั–ะดั„ั–ะปัŒั‚ั€ะพะฒะฐะฝะพ %<PRId64> ั€ัะดะบะธ(ั–ะฒ)"
+msgid "E474: Closing list with curly bracket: %.*s"
+msgstr "E474: ะ—ะฐะบั€ะธะฒะฐั”ั‚ัŒัั ัะฟะธัะพะบ ั„ั–ะณัƒั€ะฝะพัŽ ะดัƒะถะบะพัŽ: %.*s"
-#: ../ex_cmds.c:1194
-msgid "E135: *Filter* Autocommands must not change current buffer"
-msgstr "E135: ะะฒั‚ะพะบะพะผะฐะฝะดะธ *Filter* ะฝะต ะฟะพะฒะธะฝะฝั– ะทะผั–ะฝัŽะฒะฐั‚ะธ ะฟะพั‚ะพั‡ะฝะธะน ะฑัƒั„ะตั€"
+#, c-format
+msgid "E474: Closing dictionary with square bracket: %.*s"
+msgstr "E474: ะ—ะฐะบั€ะธั‚ั‚ั ัะปะพะฒะฝะธะบะฐ ะบะฒะฐะดั€ะฐั‚ะฝะพัŽ ะดัƒะถะบะพัŽ: %.*s"
-#: ../ex_cmds.c:1244
-msgid "[No write since last change]\n"
-msgstr "[ะ—ะผั–ะฝะธ ะฝะต ะทะฐะฟะธัะฐะฝะพ]\n"
+#, c-format
+msgid "E474: Trailing comma: %.*s"
+msgstr "E474: ะ—ะฐะนะฒะฐ ะบะพะผะฐ: %.*s"
-#: ../ex_cmds.c:1424
#, c-format
-msgid "%sviminfo: %s in line: "
-msgstr "%sviminfo: %s ะฒ ั€ัะดะบัƒ: "
+msgid "E474: Expected value after colon: %.*s"
+msgstr "E474: ะžั‡ั–ะบัƒั”ั‚ัŒัั ะทะฝะฐั‡ะตะฝะฝั ะฟั–ัะปั ะดะฒะพะบั€ะฐะฟะบะธ: %.*s"
-#: ../ex_cmds.c:1431
-msgid "E136: viminfo: Too many errors, skipping rest of file"
-msgstr "E136: viminfo: ะ—ะฐะฑะฐะณะฐั‚ะพ ะฟะพะผะธะปะพะบ, ั€ะตัˆั‚ะฐ ั„ะฐะนะปัƒ ะฑัƒะดะต ะฟั€ะพะฟัƒั‰ะตะฝะพ"
+#, c-format
+msgid "E474: Expected value: %.*s"
+msgstr "E474: ะžั‡ั–ะบัƒั”ั‚ัŒัั ะทะฝะฐั‡ะตะฝะฝั: %.*s"
-#: ../ex_cmds.c:1458
#, c-format
-msgid "Reading viminfo file \"%s\"%s%s%s"
-msgstr "ะ—ั‡ะธั‚ัƒั”ั‚ัŒัั ั„ะฐะนะป viminfo: ยซ%sยป%s%s%s"
+msgid "E474: Comma not inside container: %.*s"
+msgstr "E474: ะšะพะผะฐ ะฟะพะทะฐ ะบะพะฝั‚ะตะนะฝะตั€ะพะผ: %.*s"
-#: ../ex_cmds.c:1460
-msgid " info"
-msgstr " ั–ะฝั„ะพั€ะผะฐั†ั–ั"
+#, c-format
+msgid "E474: Duplicate comma: %.*s"
+msgstr "E474: ะ—ะฐะนะฒะฐ ะบะพะผะฐ: %.*s"
-#: ../ex_cmds.c:1461
-msgid " marks"
-msgstr " ะฟะพะทะฝะฐั‡ะบะธ"
+#, c-format
+msgid "E474: Comma after colon: %.*s"
+msgstr "E474: ะšะพะผะฐ ะฟั–ัะปั ะดะฒะพะบั€ะฐะฟะบะธ: %.*s"
-#: ../ex_cmds.c:1462
-msgid " oldfiles"
-msgstr " ัั‚ะฐั€ั– ั„ะฐะนะปะธ"
+#, c-format
+msgid "E474: Using comma in place of colon: %.*s"
+msgstr "E474: ะšะพะผะฐ ะทะฐะผั–ัั‚ัŒ ะดะฒะพะบั€ะฐะฟะบะธ: %.*s"
-#: ../ex_cmds.c:1463
-msgid " FAILED"
-msgstr " ะะ• ะ’ะ”ะะ›ะžะกะฏ"
+#, c-format
+msgid "E474: Leading comma: %.*s"
+msgstr "E474: ะšะพะผะฐ ะฝะฐ ะฟะพั‡ะฐั‚ะบัƒ: %.*s"
+
+#, c-format
+msgid "E474: Colon not inside container: %.*s"
+msgstr "E474: ะ”ะฒะพะบั€ะฐะฟะบะฐ ะฝะต ะฒัะตั€ะตะดะธะฝั– ะบะพะฝั‚ะตะนะฝะตั€ะฐ: %.*s"
+
+#, c-format
+msgid "E474: Using colon not in dictionary: %.*s"
+msgstr "E474: ะ”ะฒะพะบั€ะฐะฟะบะฐ ะฝะต ะฒ ัะปะพะฒะฝะธะบัƒ: %.*s"
+
+#, c-format
+msgid "E474: Unexpected colon: %.*s"
+msgstr "E474: ะะตัะฟะพะดั–ะฒะฐะฝะฐ ะดะฒะพะบั€ะฐะฟะบะฐ: %.*s"
+
+#, c-format
+msgid "E474: Colon after comma: %.*s"
+msgstr "E474: ะ”ะฒะพะบั€ะฐะฟะบะฐ ะฟั–ัะปั ะบะพะผะธ: %.*s"
+
+#, c-format
+msgid "E474: Duplicate colon: %.*s"
+msgstr "E474: ะ—ะฐะนะฒะฐ ะดะฒะพะบั€ะฐะฟะบะฐ: %.*s"
+
+#, c-format
+msgid "E474: Expected null: %.*s"
+msgstr "E474: ะะตัะฟะพะดั–ะฒะฐะฝะธะน null: %.*s"
+
+#, c-format
+msgid "E474: Expected true: %.*s"
+msgstr "E474: ะžั‡ั–ะบัƒั”ั‚ัŒัั true: %.*s"
-#. avoid a wait_return for this message, it's annoying
-#: ../ex_cmds.c:1541
#, c-format
-msgid "E137: Viminfo file is not writable: %s"
-msgstr "E137: ะะต ะดะพะทะฒะพะปะตะฝะพ ะทะฐะฟะธั ัƒ ั„ะฐะนะป viminfo: %s"
+msgid "E474: Expected false: %.*s"
+msgstr "E474: ะžั‡ั–ะบัƒั”ั‚ัŒัั false: %.*s"
-#: ../ex_cmds.c:1626
#, c-format
-msgid "E138: Can't write viminfo file %s!"
-msgstr "E138: ะะต ะฒะดะฐะปะพัั ะทะฐะฟะธัะฐั‚ะธ ั„ะฐะนะป viminfo %s!"
+msgid "E474: Unidentified byte: %.*s"
+msgstr "E474: ะะตะฒะธะทะฝะฐั‡ะตะฝะธะน ะฑะฐะนั‚: %.*s"
-#: ../ex_cmds.c:1635
#, c-format
-msgid "Writing viminfo file \"%s\""
-msgstr "ะ—ะฐะฟะธััƒั”ั‚ัŒัั ั„ะฐะนะป viminfo ยซ%sยป"
+msgid "E474: Trailing characters: %.*s"
+msgstr "E474: ะะฐะดะปะธัˆะบะพะฒั– ัะธะผะฒะพะปะธ: %.*s"
-#. Write the info:
-#: ../ex_cmds.c:1720
#, c-format
-msgid "# This viminfo file was generated by Vim %s.\n"
-msgstr "# ะฆะตะน ั„ะฐะนะป ะฐะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ ัั‚ะฒะพั€ะตะฝะธะน Vim %s.\n"
+msgid "E474: Unexpected end of input: %.*s"
+msgstr "E474: ะะตัะฟะพะดั–ะฒะฐะฝะธะน ะบั–ะฝะตั†ัŒ: %.*s"
-#: ../ex_cmds.c:1722
+#, c-format
+msgid "key %s"
+msgstr "ะบะปัŽั‡ %s"
+
+#, c-format
+msgid "key %s at index %i from special map"
+msgstr "ะบะปัŽั‡ %s ะทะฐ ั–ะฝะดะตะบัะพะผ %i ั–ะท ัะฟะตั†ั–ะฐะปัŒะฝะพั— ะผะฐะฟะธ"
+
+#, c-format
+msgid "index %i"
+msgstr "ั–ะฝะดะตะบั %i"
+
+msgid "partial"
+msgstr "ั‡ะฐัั‚ะบะพะฒะธะน"
+
+#, c-format
+msgid "argument %i"
+msgstr "ะฐั€ะณัƒะผะตะฝั‚ %i"
+
+msgid "partial self dictionary"
+msgstr "ั‡ะฐัั‚ะบะพะฒะธะน ัะปะพะฒะฝะธะบ self"
+
+msgid "itself"
+msgstr "ัะฐะผ ัะตะฑะต"
+
+msgid "E724: unable to correctly dump variable with self-referencing container"
+msgstr ""
+"E724: ะฝะต ะฒะดะฐะปะพัั ะบะพั€ะตะบั‚ะฝะพ ะทะปะธั‚ะธ ะทะผั–ะฝะฝัƒ ะท ะบะพะฝั‚ะตะนะฝะตั€ะพะผ, ัะบะธะน ัะฐะผ ะฝะฐ ัะตะฑะต "
+"ะฟะพัะธะปะฐั”ั‚ัŒัั"
+
+msgid "E474: Unable to represent NaN value in JSON"
+msgstr "E474: ะะตะผะพะถะปะธะฒะพ ะฟั€ะตะดัั‚ะฐะฒะธั‚ะธ ะทะฝะฐั‡ะตะฝะฝั NaN ัƒ JSON"
+
+msgid "E474: Unable to represent infinity in JSON"
+msgstr "E474: ะะตะผะพะถะปะธะฒะพ ะฟั€ะตะดัั‚ะฐะฒะธั‚ะธ ะฝะตัะบั–ะฝั‡ะตะฝะฝั–ัั‚ัŒ ัƒ JSON"
+
+#, c-format
msgid ""
-"# You may edit it if you're careful!\n"
-"\n"
+"E474: String \"%.*s\" contains byte that does not start any UTF-8 character"
+msgstr "E474: ะขะตะบัั‚ \"%.*s\" ะผั–ัั‚ะธั‚ัŒ ะฑะฐะนั‚, ั‰ะพ ะฝะต ะฟะพั‡ะธะฝะฐั” ะถะพะดะฝะพะณะพ ัะธะผะฒะพะปัƒ UTF-8"
+
+#, c-format
+msgid ""
+"E474: UTF-8 string contains code point which belongs to a surrogate pair: "
+"%.*s"
msgstr ""
-"# ะœะพะถะตั‚ะต ั€ะตะดะฐะณัƒะฒะฐั‚ะธ, ะฐะปะต ะžะ‘ะ•ะ ะ•ะ–ะะž!\n"
-"\n"
+"E474: ั‚ะตะบัั‚ UTF-8 ะผั–ัั‚ะธั‚ัŒ ั‚ะพั‡ะบัƒ ะบะพะดัƒะฒะฐะฝะฝั, ัะบะฐ ะฝะฐะปะตะถะธั‚ัŒ ััƒั€ะพะณะฐั‚ะฝั–ะน ะฟะฐั€ั–: %.*s"
+
+msgid "E474: Unable to convert EXT string to JSON"
+msgstr "E474: ะะต ะฒะดะฐะปะพัั ะฟะตั€ะตั‚ะฒะพั€ะธั‚ะธ ั€ัะดะพะบ EXT ัƒ JSON"
+
+#, c-format
+msgid "E474: Error while dumping %s, %s: attempt to dump function reference"
+msgstr "E474: ะŸะพะผะธะปะบะฐ ะฟั€ะธ ะทะปะธั‚ั‚ั– %s, %s: ัะฟั€ะพะฑะฐ ะทะปะธั‚ะธ ะฟะพัะธะปะฐะฝะฝั ะฝะฐ ั„ัƒะฝะบั†ั–ัŽ"
+
+msgid "E474: Invalid key in special dictionary"
+msgstr "E474: ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ะบะปัŽั‡ ัƒ ัะฟะตั†ั–ะฐะปัŒะฝะพะผัƒ ัะปะพะฒะฝะธะบัƒ"
+
+msgid "encode_tv2string() argument"
+msgstr "ะฐั€ะณัƒะผะตะฝั‚ encode_tv2string()"
+
+msgid ":echo argument"
+msgstr "ะฐั€ะณัƒะผะตะฝั‚ :echo"
+
+msgid "encode_tv2json() argument"
+msgstr "ะฐั€ะณัƒะผะตะฝั‚ encode_tv2json()"
+
+#, c-format
+msgid "E5004: Error while dumping %s, %s: attempt to dump function reference"
+msgstr "E5004: ะŸะพะผะธะปะบะฐ ะฟั€ะธ ะทะปะธั‚ั‚ั– %s, %s: ัะฟั€ะพะฑะฐ ะทะปะธั‚ะธ ะฟะพัะธะปะฐะฝะฝั ะฝะฐ ั„ัƒะฝะบั†ั–ัŽ"
+
+#, c-format
+msgid "E5005: Unable to dump %s: container references itself in %s"
+msgstr "E5005: ะะตะผะพะถะปะธะฒะพ ะทะปะธั‚ะธ %s: ะบะพะฝั‚ะตะนะฝะตั€ ะฟะพัะธะปะฐั”ั‚ัŒัั ะฝะฐ ัะฐะผะพะณะพ ัะตะฑะต ัƒ %s"
+
+#, c-format
+msgid "E684: list index out of range: %<PRId64>"
+msgstr "E684: ะ†ะฝะดะตะบั ัะฟะธัะบัƒ ะฟะพะทะฐ ะผะตะถะฐะผะธ: %<PRId64>"
+
+#, c-format
+msgid "E5142: Failed to open file %s: %s"
+msgstr "E5142: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ั„ะฐะนะป %s: %s"
+
+#, c-format
+msgid "E5143: Failed to write to file %s: %s"
+msgstr "E5143: ะะต ะฒะดะฐะปะพัั ะทะฐะฟะธัะฐั‚ะธ ัƒ ั„ะฐะนะป %s: %s"
+
+#, c-format
+msgid "E5144: Failed to close file %s: %s"
+msgstr "E5144: ะะต ะฒะดะฐะปะพัั ะทะฐะบั€ะธั‚ะธ ั„ะฐะนะป %s: %s"
+
+msgid "E6000: Argument is not a function or function name"
+msgstr "E6000: ะั€ะณัƒะผะตะฝั‚ ะฝะต ั„ัƒะฝะบั†ั–ั ั‡ะธ ะฝะฐะทะฒะฐ ั„ัƒะฝะบั†ั–ั—"
+
+#, c-format
+msgid "E737: Key already exists: %s"
+msgstr "E737: ะšะปัŽั‡ ะฒะถะต ั–ัะฝัƒั”: %s"
-#: ../ex_cmds.c:1723
-msgid "# Value of 'encoding' when this file was written\n"
-msgstr "# ะ—ะฝะฐั‡ะตะฝะฝั 'encoding' ะฟั–ะด ั‡ะฐั ัั‚ะฒะพั€ะตะฝะฝั ั†ัŒะพะณะพ ั„ะฐะนะปัƒ\n"
+msgid "E743: variable nested too deep for (un)lock"
+msgstr "E743: ะ—ะผั–ะฝะฝะฐ ะผะฐั” ะทะฐะฑะฐะณะฐั‚ะพ ะฒะบะปะฐะดะตะฝัŒ ั‰ะพะฑ ะฑัƒั‚ะธ ะทะฐ-/ะฒั–ะดะบั€ะธั‚ะพัŽ."
+
+#, c-format
+msgid "E741: Value is locked: %.*s"
+msgstr "E741: ะ—ะฝะฐั‡ะตะฝะฝั ะทะฐั…ะธั‰ะตะฝะต: %.*s"
+
+#, c-format
+msgid "E742: Cannot change value of %.*s"
+msgstr "E742: ะะต ะผะพะถะฝะฐ ะทะผั–ะฝะธั‚ะธ ะทะฝะฐั‡ะตะฝะฝั %.*s"
+
+msgid "Unknown"
+msgstr "ะะตะฒั–ะดะพะผะพ"
+
+msgid "E805: Expected a Number or a String, Float found"
+msgstr "E805: ะžั‡ั–ะบัƒั”ั‚ัŒัั Number ั‡ะธ String, ั‚ั€ะฐะฟะธะฒัั Float"
+
+msgid "E703: Expected a Number or a String, Funcref found"
+msgstr "E703: ะžั‡ั–ะบัƒั”ั‚ัŒัั Number ั‡ะธ String, ั‚ั€ะฐะฟะธะฒัั Funcref"
+
+msgid "E745: Expected a Number or a String, List found"
+msgstr "E745: ะžั‡ั–ะบัƒั”ั‚ัŒัั Number ั‡ะธ String, ั‚ั€ะฐะฟะธะฒัั List"
+
+msgid "E728: Expected a Number or a String, Dictionary found"
+msgstr "E728: ะžั‡ั–ะบัƒั”ั‚ัŒัั Number ั‡ะธ String, ั‚ั€ะฐะฟะธะฒัั Dictionary"
+
+msgid "E5300: Expected a Number or a String"
+msgstr "E5300: ะžั‡ั–ะบัƒั”ั‚ัŒัั Number ั‡ะธ String"
+
+msgid "E745: Using a List as a Number"
+msgstr "E745: List ะฒะถะธั‚ะพ ัะบ Number"
+
+msgid "E728: Using a Dictionary as a Number"
+msgstr "E728: Dictionary ะฒะถะธั‚ะพ ัะบ Number"
+
+msgid "E805: Using a Float as a Number"
+msgstr "E805: Float ะฒะถะธั‚ะพ ัะบ Number"
+
+msgid "E685: using an invalid value as a Number"
+msgstr "E685: ะฝะตะบะพั€ะตะบั‚ะฝะต ะทะฝะฐั‡ะตะฝะฝั ะฒะถะธั‚ะพ ัะบ Number"
+
+msgid "E730: using List as a String"
+msgstr "E730: List ะฒะถะธั‚ะพ ัะบ String"
+
+msgid "E731: using Dictionary as a String"
+msgstr "E731: Dictionary ะฒะถะธั‚ะพ ัะบ String"
+
+msgid "E908: using an invalid value as a String"
+msgstr "E908: ะฝะตะบะพั€ะตะบั‚ะฝะต ะทะฝะฐั‡ะตะฝะฝั ะฒะถะธั‚ะพ ัะบ String"
+
+msgid "E891: Using a Funcref as a Float"
+msgstr "E891: Funcref ะฒะถะธั‚ะพ ัะบ Float"
+
+msgid "E892: Using a String as a Float"
+msgstr "E892: String ะฒะถะธั‚ะพ ัะบ Float"
+
+msgid "E893: Using a List as a Float"
+msgstr "E893: List ะฒะถะธั‚ะพ ัะบ Float"
+
+msgid "E894: Using a Dictionary as a Float"
+msgstr "E894: Dictionary ะฒะถะธั‚ะพ ัะบ Float"
+
+msgid "E907: Using a special value as a Float"
+msgstr "E907: ะ’ะธะบะพั€ะธัั‚ะฐะฝะพ ัะฟะตั†ั–ะฐะปัŒะฝะต ะทะฝะฐั‡ะตะฝะฝั ัะบ Float"
+
+msgid "E808: Number or Float required"
+msgstr "E808: ะขั€ะตะฑะฐ ะฒะบะฐะทะฐั‚ะธ Number ั‡ะธ Float"
+
+msgid "tcp address must be host:port"
+msgstr "ะฐะดั€ะตัะฐ tcp ะผะฐั” ะฑัƒั‚ะธ ะฒัƒะทะพะป:ะฟะพั€ั‚"
+
+msgid "failed to lookup host or port"
+msgstr "ะฝะต ะฒะดะฐะปะพัั ะทะฝะฐะนั‚ะธ ะฒัƒะทะพะป ั‡ะธ ะฟะพั€ั‚"
+
+msgid "connection refused"
+msgstr "ะท'ั”ะดะฝะฐะฝะฝั ะฒั–ะดะผะพะฒะปะตะฝะพ"
+
+#, c-format
+msgid "<%s>%s%s %d, Hex %02x, Oct %03o, Digr %s"
+msgstr "<%s>%s%s %d, ัˆั–ัั‚ %02x, ะฒั–ั %03o, ะดะธะณั€ %s"
+
+#, c-format
+msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
+msgstr "<%s>%s%s %d, ัˆั–ัั‚ %02x, ะฒั–ั %03o"
+
+#, c-format
+msgid "> %d, Hex %04x, Oct %o, Digr %s"
+msgstr "> %d, ัˆั–ัั‚ %04x, ะฒั–ั %o, ะดะธะณั€ %s"
+
+#, c-format
+msgid "> %d, Hex %08x, Oct %o, Digr %s"
+msgstr "> %d, ัˆั–ัั‚ %08x, ะฒั–ั %o, ะดะธะณั€ %s"
+
+#, c-format
+msgid "> %d, Hex %04x, Octal %o"
+msgstr "> %d, ัˆั–ัั‚ %04x, ะฒั–ั %o"
+
+#, c-format
+msgid "> %d, Hex %08x, Octal %o"
+msgstr "> %d, ัˆั–ัั‚ %08x, ะฒั–ั %o"
+
+msgid "E134: Cannot move a range of lines into itself"
+msgstr "E134: ะะตะผะพะถะปะธะฒะพ ะฟะตั€ะตะผั–ัั‚ะธั‚ะธ ะดั–ะฐะฟะฐะทะพะฝ ั€ัะดะบั–ะฒ ัะฐะผ ัƒ ัะตะฑะต"
+
+msgid "1 line moved"
+msgstr "ะŸะตั€ะตะผั–ั‰ะตะฝะพ ะพะดะธะฝ ั€ัะดะพะบ"
+
+#, c-format
+msgid "%<PRId64> lines moved"
+msgstr "ะŸะตั€ะตะผั–ั‰ะตะฝะพ %<PRId64> ั€ัะดะบะธ(ั–ะฒ)"
-#: ../ex_cmds.c:1800
-msgid "Illegal starting char"
-msgstr "ะะตะดะพะทะฒะพะปะตะฝะธะน ัะธะผะฒะพะป ะฝะฐ ะฟะพั‡ะฐั‚ะบัƒ ั€ัะดะบะฐ"
+#, c-format
+msgid "E482: Can't create file %s"
+msgstr "E482: ะะต ะฒะดะฐะปะพัั ัั‚ะฒะพั€ะธั‚ะธ ั„ะฐะนะป %s"
+
+#, c-format
+msgid "%<PRId64> lines filtered"
+msgstr "ะ’ั–ะดั„ั–ะปัŒั‚ั€ะพะฒะฐะฝะพ %<PRId64> ั€ัะดะบะธ(ั–ะฒ)"
+
+msgid "E135: *Filter* Autocommands must not change current buffer"
+msgstr "E135: ะะฒั‚ะพะบะพะผะฐะฝะดะธ *Filter* ะฝะต ะฟะพะฒะธะฝะฝั– ะทะผั–ะฝัŽะฒะฐั‚ะธ ะฟะพั‚ะพั‡ะฝะธะน ะฑัƒั„ะตั€"
+
+msgid "[No write since last change]\n"
+msgstr "[ะ—ะผั–ะฝะธ ะฝะต ะทะฐะฟะธัะฐะฝะพ]\n"
-#: ../ex_cmds.c:2162
msgid "Write partial file?"
msgstr "ะ—ะฐะฟะธัะฐั‚ะธ ั‡ะฐัั‚ะธะฝัƒ ั„ะฐะนะปัƒ?"
-#: ../ex_cmds.c:2166
msgid "E140: Use ! to write partial buffer"
msgstr "E140: ะ’ะธะบะพั€ะธัั‚ะฐะนั‚ะต ! ะดะปั ะทะฐะฟะธััƒ ั‡ะฐัั‚ะธะฝะธ ะฑัƒั„ะตั€ะฐ"
-#: ../ex_cmds.c:2281
#, c-format
msgid "Overwrite existing file \"%s\"?"
msgstr "ะŸะตั€ะตะฟะธัะฐั‚ะธ ั–ัะฝัƒัŽั‡ะธะน ั„ะฐะนะป ยซ%sยป?"
-#: ../ex_cmds.c:2317
#, c-format
msgid "Swap file \"%s\" exists, overwrite anyway?"
msgstr "ะคะฐะนะป ะพะฑะผั–ะฝัƒ ยซ%sยป ั–ัะฝัƒั”, ะฟะตั€ะตะทะฐะฟะธัะฐั‚ะธ?"
-#: ../ex_cmds.c:2326
#, c-format
msgid "E768: Swap file exists: %s (:silent! overrides)"
msgstr "E768: ะคะฐะนะป ะพะฑะผั–ะฝัƒ ั–ัะฝัƒั”: %s (:silent! ะฟะตั€ะตะฒะฐะถัƒั”)"
-#: ../ex_cmds.c:2381
#, c-format
msgid "E141: No file name for buffer %<PRId64>"
msgstr "E141: ะะตะผะฐั” ะฒั…ั–ะดะฝะพะณะพ ั„ะฐะนะปัƒ ะดะปั ะฑัƒั„ะตั€ะฐ %<PRId64>"
-#: ../ex_cmds.c:2412
msgid "E142: File not written: Writing is disabled by 'write' option"
msgstr "E142: ะคะฐะนะป ะฝะต ะทะฐะฟะธัะฐะฝะพ: ะทะฐะฟะธั ะทะฐะฑะพั€ะพะฝะตะฝะพ ะพะฟั†ั–ั”ัŽ 'write'"
-#: ../ex_cmds.c:2434
#, c-format
msgid ""
"'readonly' option is set for \"%s\".\n"
@@ -1202,7 +1331,6 @@ msgstr ""
"ะ”ะปั ยซ%sยป ะฒัั‚ะฐะฝะพะฒะปะตะฝะพ 'readonly'.\n"
"ะ‘ะฐะถะฐั”ั‚ะต ะฒัะต ะพะดะฝะพ ะฟั€ะพะดะพะฒะถะธั‚ะธ ะทะฐะฟะธั?"
-#: ../ex_cmds.c:2439
#, c-format
msgid ""
"File permissions of \"%s\" are read-only.\n"
@@ -1213,816 +1341,636 @@ msgstr ""
"ะŸั€ะพั‚ะต, ะผะพะถะปะธะฒะพ, ะนะพะณะพ ะผะพะถะฝะฐ ะทะฐะฟะธัะฐั‚ะธ.\n"
"ะฅะพั‡ะตั‚ะต ัะฟั€ะพะฑัƒะฒะฐั‚ะธ?"
-#: ../ex_cmds.c:2451
#, c-format
msgid "E505: \"%s\" is read-only (add ! to override)"
msgstr "E505: ยซ%sยป ั‚ั–ะปัŒะบะธ ะดะปั ั‡ะธั‚ะฐะฝะฝั (! ั‰ะพะฑ ะฝะต ะทะฒะฐะถะฐั‚ะธ)"
-#: ../ex_cmds.c:3120
#, c-format
msgid "E143: Autocommands unexpectedly deleted new buffer %s"
msgstr "E143: ะะฒั‚ะพะบะพะผะฐะฝะดะธ ะฝะตัะฟะพะดั–ะฒะฐะฝะพ ะทะฝะธั‰ะธะปะธ ะฝะพะฒะธะน ะฑัƒั„ะตั€ %s"
-#: ../ex_cmds.c:3313
msgid "E144: non-numeric argument to :z"
msgstr "E144: ะฝะตั‡ะธัะปะพะฒะธะน ะฐั€ะณัƒะผะตะฝั‚ ะดะปั :z"
-#: ../ex_cmds.c:3404
-msgid "E145: Shell commands not allowed in rvim"
-msgstr "E145: ะฃ rvim ะฝะต ะดะพะทะฒะพะปะตะฝั– ะบะพะผะฐะฝะดะธ ะพะฑะพะปะพะฝะบะธ"
+msgid "E145: Shell commands not allowed in restricted mode"
+msgstr "E145: ะฃ ะพะฑะผะตะถะตะฝะพะผัƒ ั€ะตะถะธะผั– ะฝะต ะดะพะทะฒะพะปะตะฝั– ะบะพะผะฐะฝะดะธ ะพะฑะพะปะพะฝะบะธ"
-#: ../ex_cmds.c:3498
msgid "E146: Regular expressions can't be delimited by letters"
msgstr "E146: ะ ะตะณัƒะปัั€ะฝั– ะฒะธั€ะฐะทะธ ะฝะต ะผะพะถะฝะฐ ั€ะพะทะดั–ะปัั‚ะธ ะปั–ั‚ะตั€ะฐะผะธ"
-#: ../ex_cmds.c:3964
#, c-format
msgid "replace with %s (y/n/a/q/l/^E/^Y)?"
msgstr "ะ—ะฐะผั–ะฝะธั‚ะธ ะฝะฐ %s (y/n/a/q/l/^E/^Y)?"
-#: ../ex_cmds.c:4379
msgid "(Interrupted) "
msgstr "(ะŸะตั€ะตั€ะฒะฐะฝะพ) "
-# msgstr "E31: "
-#: ../ex_cmds.c:4384
msgid "1 match"
msgstr "ะžะดะธะฝ ะทะฑั–ะณ"
-#: ../ex_cmds.c:4384
msgid "1 substitution"
msgstr "ะžะดะฝะฐ ะทะฐะผั–ะฝะฐ"
-#: ../ex_cmds.c:4387
#, c-format
msgid "%<PRId64> matches"
msgstr "%<PRId64> ะทะฑั–ะณะธ(ั–ะฒ)"
-#: ../ex_cmds.c:4388
#, c-format
msgid "%<PRId64> substitutions"
msgstr "%<PRId64> ะทะฐะผั–ะฝ(ะธ)"
-#: ../ex_cmds.c:4392
msgid " on 1 line"
msgstr " ะฒ ะพะดะฝะพะผัƒ ั€ัะดะบัƒ"
-#: ../ex_cmds.c:4395
#, c-format
msgid " on %<PRId64> lines"
msgstr " ะฒ %<PRId64> ั€ัะดะบะฐั…"
-#: ../ex_cmds.c:4438
-msgid "E147: Cannot do :global recursive"
-msgstr "E147: :global ะฝะต ะผะพะถะฝะฐ ะฒะถะธะฒะฐั‚ะธ ั€ะตะบัƒั€ัะธะฒะฝะพ"
+msgid "E147: Cannot do :global recursive with a range"
+msgstr "E147: :global ะฝะต ะผะพะถะฝะฐ ั€ะตะบัƒั€ัะธะฒะฝะพ ะท ะดั–ะฐะฟะฐะทะพะฝะพะผ"
-#: ../ex_cmds.c:4467
msgid "E148: Regular expression missing from global"
msgstr "E148: ะฃ global ะฑั€ะฐะบัƒั” ะทั€ะฐะทะบะฐ"
-#: ../ex_cmds.c:4508
#, c-format
msgid "Pattern found in every line: %s"
msgstr "ะ—ั€ะฐะทะพะบ ะทะฝะฐะนะดะตะฝะพ ัƒ ะบะพะถะฝะพะผัƒ ั€ัะดะบัƒ: %s"
-#: ../ex_cmds.c:4510
#, c-format
msgid "Pattern not found: %s"
msgstr "ะ—ั€ะฐะทะพะบ ะฝะต ะทะฝะฐะนะดะตะฝะพ: %s"
-#: ../ex_cmds.c:4587
-msgid ""
-"\n"
-"# Last Substitute String:\n"
-"$"
-msgstr ""
-"\n"
-"# ะžัั‚ะฐะฝะฝั ะทะฐะผั–ะฝะฐ:\n"
-"$"
-
-#: ../ex_cmds.c:4679
msgid "E478: Don't panic!"
msgstr "E478: ะ‘ะตะท ะฟะฐะฝั–ะบะธ!"
-#: ../ex_cmds.c:4717
#, c-format
msgid "E661: Sorry, no '%s' help for %s"
msgstr "E661: ะ’ะธะฑะฐั‡ั‚ะต, ะฝะตะผะฐั” ะดะพะฟะพะผะพะณะธ '%s' ะดะปั %s"
-#: ../ex_cmds.c:4719
#, c-format
msgid "E149: Sorry, no help for %s"
msgstr "E149: ะ’ะธะฑะฐั‡ั‚ะต, ะฝะตะผะฐั” ะดะพะฟะพะผะพะณะธ ะดะปั %s"
-#: ../ex_cmds.c:4751
#, c-format
msgid "Sorry, help file \"%s\" not found"
msgstr "ะ’ะธะฑะฐั‡ั‚ะต, ั„ะฐะนะป ะดะพะฟะพะผะพะณะธ ยซ%sยป ะฝะต ะทะฝะฐะนะดะตะฝะพ"
-#: ../ex_cmds.c:5323
#, c-format
-msgid "E150: Not a directory: %s"
-msgstr "E150: ะะต ั” ะบะฐั‚ะฐะปะพะณะพะผ: %s"
+msgid "E151: No match: %s"
+msgstr "E151: ะ–ะพะดะฝะพะณะพ ะทะฑั–ะณัƒ: %s"
-#: ../ex_cmds.c:5446
#, c-format
msgid "E152: Cannot open %s for writing"
msgstr "E152: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ %s ะดะปั ะทะฐะฟะธััƒ"
-#: ../ex_cmds.c:5471
#, c-format
msgid "E153: Unable to open %s for reading"
msgstr "E153: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ %s ะดะปั ั‡ะธั‚ะฐะฝะฝั"
-#: ../ex_cmds.c:5500
#, c-format
msgid "E670: Mix of help file encodings within a language: %s"
msgstr "E670: ะœั–ัˆะฐะฝะธะฝะฐ ะบะพะดัƒะฒะฐะฝัŒ ั„ะฐะนะปัƒ ะดะพะฟะพะผะพะณะธ ะดะปั ะผะพะฒะธ %s"
-#: ../ex_cmds.c:5565
#, c-format
msgid "E154: Duplicate tag \"%s\" in file %s/%s"
-msgstr "E154: ะŸะพะฒั‚ะพั€ะตะฝะฝั ั‚ะตา‘ัƒ ยซ%sยป ัƒ ั„ะฐะนะปั– %s/%s"
+msgstr "E154: ะŸะพะฒั‚ะพั€ะตะฝะฝั ะผั–ั‚ะบะธ ยซ%sยป ัƒ ั„ะฐะนะปั– %s/%s"
+
+#, c-format
+msgid "E150: Not a directory: %s"
+msgstr "E150: ะะต ั” ะบะฐั‚ะฐะปะพะณะพะผ: %s"
-#: ../ex_cmds.c:5687
#, c-format
msgid "E160: Unknown sign command: %s"
msgstr "E160: ะะตะฒั–ะดะพะผะฐ ะบะพะผะฐะฝะดะฐ ะฝะฐะดะฟะธััƒ: %s"
-#: ../ex_cmds.c:5704
msgid "E156: Missing sign name"
msgstr "E156: ะŸั€ะพะฟัƒั‰ะตะฝะพ ะฝะฐะทะฒัƒ ะฝะฐะดะฟะธััƒ"
-#: ../ex_cmds.c:5746
msgid "E612: Too many signs defined"
msgstr "E612: ะ’ะธะทะฝะฐั‡ะตะฝะพ ะทะฐะฑะฐะณะฐั‚ะพ ะฝะฐะดะฟะธัั–ะฒ"
-#: ../ex_cmds.c:5813
#, c-format
msgid "E239: Invalid sign text: %s"
msgstr "E239: ะะตะบะพั€ะตะบั‚ะฝะธะน ะฝะฐะดะฟะธั: %s"
-#: ../ex_cmds.c:5844 ../ex_cmds.c:6035
#, c-format
msgid "E155: Unknown sign: %s"
msgstr "E155: ะะตะฒั–ะดะพะผะธะน ะฝะฐะดะฟะธั: %s"
-#: ../ex_cmds.c:5877
msgid "E159: Missing sign number"
msgstr "E159: ะŸั€ะพะฟัƒั‰ะตะฝะพ ะฝะพะผะตั€ ะฝะฐะดะฟะธััƒ"
-#: ../ex_cmds.c:5971
#, c-format
msgid "E158: Invalid buffer name: %s"
msgstr "E158: ะะตะบะพั€ะตะบั‚ะฝะฐ ะฝะฐะทะฒะฐ ะฑัƒั„ะตั€ะฐ: %s"
-#: ../ex_cmds.c:6008
+msgid "E934: Cannot jump to a buffer that does not have a name"
+msgstr "E934: ะะต ะผะพะถะฝะฐ ะฟะตั€ะตะนั‚ะธ ะดะพ ะฑัƒั„ะตั€ะฐ ะฑะตะท ะฝะฐะทะฒะธ"
+
#, c-format
msgid "E157: Invalid sign ID: %<PRId64>"
msgstr "E157: ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ID ะฝะฐะดะฟะธััƒ: %<PRId64>"
-#: ../ex_cmds.c:6066
+#, c-format
+msgid "E885: Not possible to change sign %s"
+msgstr "E885: ะะตะผะพะถะปะธะฒะพ ะทะผั–ะฝะธั‚ะธ ะทะฝะฐะบ %s"
+
msgid " (not supported)"
msgstr " (ะฝะต ะฟั–ะดั‚ั€ะธะผัƒั”ั‚ัŒัั)"
-#: ../ex_cmds.c:6169
msgid "[Deleted]"
msgstr "[ะ—ะฝะธั‰ะตะฝะพ]"
-#: ../ex_cmds2.c:139
+msgid "No old files"
+msgstr "ะ–ะพะดะฝะพะณะพ ัั‚ะฐั€ะพะณะพ ั„ะฐะนะปัƒ"
+
msgid "Entering Debug mode. Type \"cont\" to continue."
msgstr "ะ ะตะถะธะผ ะฝะฐะปะฐะณะพะดะถะตะฝะฝั. ะฉะพะฑ ะฟั€ะพะดะพะฒะถะธั‚ะธ ะฒะฒะตะดั–ั‚ัŒ ยซcontยป."
-#: ../ex_cmds2.c:143 ../ex_docmd.c:759
#, c-format
msgid "line %<PRId64>: %s"
msgstr "ั€ัะดะพะบ %<PRId64>: %s"
-#: ../ex_cmds2.c:145
#, c-format
msgid "cmd: %s"
msgstr "ะบะพะผะฐะฝะดะฐ: %s"
-#: ../ex_cmds2.c:322
+msgid "frame is zero"
+msgstr "ะบะฐะดั€ ะฝัƒะปัŒะพะฒะธะน"
+
+#, c-format
+msgid "frame at highest level: %d"
+msgstr "ะบะฐะดั€ ะฝะฐ ะฝะฐะนะฒะธั‰ะพะผัƒ ั€ั–ะฒะฝั–: %d"
+
#, c-format
msgid "Breakpoint in \"%s%s\" line %<PRId64>"
msgstr "ะขะพั‡ะบะฐ ะทัƒะฟะธะฝะบะธ ะฒ ยซ%s%sยป ั€ัะดะพะบ %<PRId64>"
-#: ../ex_cmds2.c:581
#, c-format
msgid "E161: Breakpoint not found: %s"
msgstr "E161: ะขะพั‡ะบัƒ ะทัƒะฟะธะฝะบะธ ะฝะต ะทะฝะฐะนะดะตะฝะพ: %s"
-#: ../ex_cmds2.c:611
msgid "No breakpoints defined"
msgstr "ะะต ะฒะธะทะฝะฐั‡ะตะฝะพ ะถะพะดะฝะพั— ั‚ะพั‡ะบะธ ะทัƒะฟะธะฝะบะธ"
-#: ../ex_cmds2.c:617
#, c-format
msgid "%3d %s %s line %<PRId64>"
msgstr "%3d %s %s ั€ัะดะพะบ %<PRId64>"
-#: ../ex_cmds2.c:942
msgid "E750: First use \":profile start {fname}\""
msgstr "E750: ะกะฟะพั‡ะฐั‚ะบัƒ ะทั€ะพะฑั–ั‚ัŒ ยซ:profile start {ั„ะฐะนะป}ยป"
-#: ../ex_cmds2.c:1269
#, c-format
msgid "Save changes to \"%s\"?"
msgstr "ะ—ะฑะตั€ะตะณั‚ะธ ะทะผั–ะฝะธ ะฒ ยซ%sยป?"
-#: ../ex_cmds2.c:1271 ../ex_docmd.c:8851
-msgid "Untitled"
-msgstr "ะะตะฝะฐะทะฒะฐะฝะธะน"
+#, c-format
+msgid "Close \"%s\"?"
+msgstr "ะ—ะฐะบั€ะธั‚ะธ ยซ%sยป?"
-#: ../ex_cmds2.c:1421
#, c-format
msgid "E162: No write since last change for buffer \"%s\""
msgstr "E162: ะ‘ัƒั„ะตั€ ยซ%sยป ะผะฐั” ะฝะตะทะฑะตั€ะตะถะตะฝั– ะทะผั–ะฝะธ"
-#: ../ex_cmds2.c:1480
msgid "Warning: Entered other buffer unexpectedly (check autocommands)"
msgstr ""
"ะžะฑะตั€ะตะถะฝะพ: ะะตัะฟะพะดั–ะฒะฐะฝะพ ะพะฟะธะฝะธะปะธัั ัƒ ั–ะฝัˆะพะผัƒ ะฑัƒั„ะตั€ั– (ะฟะตั€ะตะฒั–ั€ั‚ะต ะฐะฒั‚ะพะบะพะผะฐะฝะดะธ)"
-#: ../ex_cmds2.c:1826
msgid "E163: There is only one file to edit"
msgstr "E163: ะ ะตะดะฐะณัƒั”ั‚ัŒัั ะปะธัˆะต ะพะดะธะฝ ั„ะฐะนะป"
-#: ../ex_cmds2.c:1828
msgid "E164: Cannot go before first file"
msgstr "E164: ะฆะต ะฒะถะต ะฝะฐะนะฟะตั€ัˆะธะน ั„ะฐะนะป"
-#: ../ex_cmds2.c:1830
msgid "E165: Cannot go beyond last file"
msgstr "E165: ะฆะต ะฒะถะต ะพัั‚ะฐะฝะฝั–ะน ั„ะฐะนะป"
-#: ../ex_cmds2.c:2175
#, c-format
msgid "E666: compiler not supported: %s"
msgstr "E666: ะšะพะผะฟั–ะปัั‚ะพั€ ะฝะต ะฟั–ะดั‚ั€ะธะผัƒั”ั‚ัŒัั: %s"
-# msgstr "E195: "
-#: ../ex_cmds2.c:2257
#, c-format
msgid "Searching for \"%s\" in \"%s\""
msgstr "ะŸะพัˆัƒะบ ยซ%sยป ะฒ ยซ%sยป"
-#: ../ex_cmds2.c:2284
#, c-format
msgid "Searching for \"%s\""
msgstr "ะŸะพัˆัƒะบ ยซ%sยป"
-#: ../ex_cmds2.c:2307
#, c-format
-msgid "not found in 'runtimepath': \"%s\""
-msgstr "ะ’ 'runtimepath' ะฝะต ะทะฝะฐะนะดะตะฝะพ ยซ%sยป"
+msgid "not found in '%s': \"%s\""
+msgstr "ะฝะต ะทะฝะฐะนะดะตะฝะพ ะฒ '%s': ยซ%sยป"
-#: ../ex_cmds2.c:2472
#, c-format
msgid "Cannot source a directory: \"%s\""
msgstr "ะะต ะฒะดะฐะปะพัั ะฟั€ะพั‡ะธั‚ะฐั‚ะธ ะบะฐั‚ะฐะปะพะณ: ยซ%sยป"
-#: ../ex_cmds2.c:2518
#, c-format
msgid "could not source \"%s\""
msgstr "ะะต ะฒะดะฐะปะพัั ะฒะธะบะพะฝะฐั‚ะธ ยซ%sยป"
-#: ../ex_cmds2.c:2520
#, c-format
msgid "line %<PRId64>: could not source \"%s\""
msgstr "ั€ัะดะพะบ %<PRId64>: ะฝะต ะฒะดะฐะปะพัั ะฒะธะบะพะฝะฐั‚ะธ ยซ%sยป"
-#: ../ex_cmds2.c:2535
#, c-format
msgid "sourcing \"%s\""
msgstr "ะฒะธะบะพะฝัƒั”ั‚ัŒัั ยซ%sยป"
-#: ../ex_cmds2.c:2537
#, c-format
msgid "line %<PRId64>: sourcing \"%s\""
msgstr "ั€ัะดะพะบ %<PRId64>: ะฒะธะบะพะฝัƒั”ั‚ัŒัั ยซ%sยป"
-#: ../ex_cmds2.c:2693
#, c-format
msgid "finished sourcing %s"
msgstr "ะทะฐะบั–ะฝั‡ะตะฝะพ ะฒะธะบะพะฝะฐะฝะฝั %s"
-#: ../ex_cmds2.c:2765
msgid "modeline"
msgstr "modeline"
-# msgstr "E14: "
-#: ../ex_cmds2.c:2767
msgid "--cmd argument"
msgstr "--cmd ะฐั€ะณัƒะผะตะฝั‚"
-# msgstr "E14: "
-#: ../ex_cmds2.c:2769
msgid "-c argument"
msgstr "-c ะฐั€ะณัƒะผะตะฝั‚"
-#: ../ex_cmds2.c:2771
msgid "environment variable"
msgstr "ะทะผั–ะฝะฝะฐ ะพั‚ะพั‡ะตะฝะฝั"
-#: ../ex_cmds2.c:2773
msgid "error handler"
msgstr "ะพะฑั€ะพะฑะฝะธะบ ะฟะพะผะธะปะบะธ"
-#: ../ex_cmds2.c:3020
+msgid "Lua"
+msgstr "Lua"
+
+#, c-format
+msgid "API client (channel id %<PRIu64>)"
+msgstr "ะšะปั–ั”ะฝั‚ API (ะบะฐะฝะฐะป ยซ%<PRIu64>ยป)"
+
msgid "W15: Warning: Wrong line separator, ^M may be missing"
msgstr "W15: ะ—ะฐัั‚ะตั€ะตะถะตะฝะฝั: ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ั€ะพะทะดั–ะปัŒะฝะธะบ ั€ัะดะบั–ะฒ, ะผะพะถะปะธะฒะพ, ะฑั€ะฐะบัƒั” ^M"
-#: ../ex_cmds2.c:3139
msgid "E167: :scriptencoding used outside of a sourced file"
msgstr "E167: :scriptencoding ะฒะธะบะพั€ะธัั‚ะฐะฝะพ ะฟะพะทะฐ ะฒะธะบะพะฝัƒะฒะฐะฝะธะผ ั„ะฐะนะปะพะผ"
-#: ../ex_cmds2.c:3166
msgid "E168: :finish used outside of a sourced file"
msgstr "E168: :finish ะฒะธะบะพั€ะธัั‚ะฐะฝะพ ะฟะพะทะฐ ะฒะธะบะพะฝัƒะฒะฐะฝะธะผ ั„ะฐะนะปะพะผ"
-#: ../ex_cmds2.c:3389
#, c-format
msgid "Current %slanguage: \"%s\""
msgstr "ะœะพะฒะฐ (%s): ยซ%sยป"
-#: ../ex_cmds2.c:3404
#, c-format
msgid "E197: Cannot set language to \"%s\""
msgstr "E197: ะะต ะฒะดะฐะปะพัั ะฒัั‚ะฐะฝะพะฒะธั‚ะธ ะผะพะฒัƒ ยซ%sยป"
-#. don't redisplay the window
-#. don't wait for return
-#: ../ex_docmd.c:387
msgid "Entering Ex mode. Type \"visual\" to go to Normal mode."
msgstr "ะ ะตะถะธะผ Ex. ะ”ะปั ะฟะพะฒะตั€ะฝะตะฝะฝั ะดะพ ะฝะพั€ะผะฐะปัŒะฝะพะณะพ ั€ะตะถะธะผัƒ ะฒะธะบะพะฝะฐะนั‚ะต ยซvisualยป"
-#: ../ex_docmd.c:428
msgid "E501: At end-of-file"
msgstr "E501: ะšั–ะฝะตั†ัŒ ั„ะฐะนะปัƒ"
-#: ../ex_docmd.c:513
msgid "E169: Command too recursive"
msgstr "E169: ะšะพะผะฐะฝะดะฐ ะทะฐะฝะฐะดั‚ะพ ั€ะตะบัƒั€ัะธะฒะฝะฐ"
-#: ../ex_docmd.c:1006
+msgid "line %"
+msgstr "ั€ัะดะพะบ %"
+
#, c-format
msgid "E605: Exception not caught: %s"
msgstr "E605: ะ’ะธะฝัั‚ะบะพะฒะฐ ัะธั‚ัƒะฐั†ั–ั ะฝะต ะพะฑั€ะพะฑะปะตะฝะฐ: %s"
-#: ../ex_docmd.c:1085
msgid "End of sourced file"
msgstr "ะšั–ะฝะตั†ัŒ ะฒะธะบะพะฝัƒะฒะฐะฝะพะณะพ ั„ะฐะนะปัƒ"
-#: ../ex_docmd.c:1086
msgid "End of function"
msgstr "ะšั–ะฝะตั†ัŒ ั„ัƒะฝะบั†ั–ั—"
-#: ../ex_docmd.c:1628
msgid "E464: Ambiguous use of user-defined command"
msgstr "E464: ะะตะพะดะฝะพะทะฝะฐั‡ะฝะธะน ะฒะถะธั‚ะพะบ ะบะพะผะฐะฝะดะธ ะบะพั€ะธัั‚ัƒะฒะฐั‡ะฐ"
-#: ../ex_docmd.c:1638
msgid "E492: Not an editor command"
msgstr "E492: ะฆะต ะฝะต ะบะพะผะฐะฝะดะฐ ั€ะตะดะฐะบั‚ะพั€ะฐ"
-#: ../ex_docmd.c:1729
msgid "E493: Backwards range given"
msgstr "E493: ะ†ะฝั‚ะตั€ะฒะฐะป ะทะฐะดะฐะฝะพ ะฝะฐะฒะธะฒะพั€ั–ั‚"
-#: ../ex_docmd.c:1733
msgid "Backwards range given, OK to swap"
msgstr "ะ†ะฝั‚ะตั€ะฒะฐะป ะทะฐะดะฐะฝะพ ะฝะฐะฒะธะฒะพั€ั–ั‚, ั‰ะพะฑ ะฟะพะผั–ะฝัั‚ะธ ะผั–ัั†ัะผะธ โ€” ะ“ะะ ะะ—ะ”"
-#. append
-#. typed wrong
-#: ../ex_docmd.c:1787
msgid "E494: Use w or w>>"
msgstr "E494: ะกะฟั€ะพะฑัƒะนั‚ะต w ะฐะฑะพ w>>"
-#: ../ex_docmd.c:3454
msgid "E319: The command is not available in this version"
msgstr "E319: ะ’ะธะฑะฐั‡ั‚ะต, ั†ั–ั”ั— ะบะพะผะฐะฝะดะธ ะฝะตะผะฐั” ัƒ ั†ั–ะน ะฒะตั€ัั–ั—"
-#: ../ex_docmd.c:3752
-msgid "E172: Only one file name allowed"
-msgstr "E172: ะ”ะพะทะฒะพะปะตะฝะพ ั‚ั–ะปัŒะบะธ ะพะดะฝัƒ ะฝะฐะทะฒัƒ ั„ะฐะนะปัƒ"
-
-#: ../ex_docmd.c:4238
msgid "1 more file to edit. Quit anyway?"
msgstr "ะ—ะฐะปะธัˆะธะปะพัั ะฒั–ะดั€ะตะดะฐะณัƒะฒะฐั‚ะธ ั‰ะต ะพะดะธะฝ ั„ะฐะนะป. ะ’ัะต ะพะดะฝะพ ะฒะธะนั‚ะธ?"
-#: ../ex_docmd.c:4242
#, c-format
msgid "%d more files to edit. Quit anyway?"
msgstr "ะฉะต ั” %d ะฝะต ั€ะตะดะฐะณะพะฒะฐะฝะธั… ั„ะฐะนะปั–ะฒ. ะ’ัะต ะพะดะฝะพ ะฒะธะนั‚ะธ?"
-#: ../ex_docmd.c:4248
msgid "E173: 1 more file to edit"
msgstr "E173: ะ—ะฐะปะธัˆะธะปะพัั ะฒั–ะดั€ะตะดะฐะณัƒะฒะฐั‚ะธ ั‰ะต ะพะดะธะฝ ั„ะฐะนะป"
-#: ../ex_docmd.c:4250
#, c-format
msgid "E173: %<PRId64> more files to edit"
msgstr "E173: ะ—ะฐะปะธัˆะธะปะพัั %<PRId64> ะฝะต ั€ะตะดะฐะณะพะฒะฐะฝะธั… ั„ะฐะนะปั–ะฒ"
-#: ../ex_docmd.c:4320
msgid "E174: Command already exists: add ! to replace it"
msgstr "E174: ะšะพะผะฐะฝะดะฐ ะฒะถะต ั–ัะฝัƒั”, ! ั‰ะพะฑ ะทะฐะผั–ะฝะธั‚ะธ ั—ั—"
-#: ../ex_docmd.c:4432
msgid ""
"\n"
-" Name Args Range Complete Definition"
+" Name Args Address Complete Definition"
msgstr ""
"\n"
-" ะะฐะทะฒะฐ ะั€ะณ. ะœะตะถะฐ ะ”ะพะฟะพะฒะฝะตะฝะฝั ะ’ะธะทะฝะฐั‡ะตะฝะฝั"
+" ะะฐะทะฒะฐ ะั€ะณ. ะะดั€ะตัะฐ ะ”ะพะฟะพะฒะฝะตะฝะฝั ะ’ะธะทะฝะฐั‡ะตะฝะฝั"
-#: ../ex_docmd.c:4516
msgid "No user-defined commands found"
msgstr "ะะต ะทะฝะฐะนะดะตะฝะพ ะบะพะผะฐะฝะด ะบะพั€ะธัั‚ัƒะฒะฐั‡ะฐ"
-#: ../ex_docmd.c:4538
msgid "E175: No attribute specified"
msgstr "E175: ะะต ะฒะบะฐะทะฐะฝะพ ะฐั‚ั€ะธะฑัƒั‚ั–ะฒ"
-#: ../ex_docmd.c:4583
msgid "E176: Invalid number of arguments"
msgstr "E176: ะะตะฟั€ะฐะฒะธะปัŒะฝะฐ ะบั–ะปัŒะบั–ัั‚ัŒ ะฐั€ะณัƒะผะตะฝั‚ั–ะฒ"
-#: ../ex_docmd.c:4594
msgid "E177: Count cannot be specified twice"
msgstr "E177: ะ›ั–ั‡ะธะปัŒะฝะธะบ ะฝะต ะผะพะถะต ะฑัƒั‚ะธ ะฒะบะฐะทะฐะฝะพ ะดะฒั–ั‡ั–"
-# msgstr "E177: "
-#: ../ex_docmd.c:4603
msgid "E178: Invalid default value for count"
msgstr "E178: ะะตะฟั€ะฐะฒะธะปัŒะฝะต ะฟะพั‡ะฐั‚ะบะพะฒะต ะทะฝะฐั‡ะตะฝะฝั ะปั–ั‡ะธะปัŒะฝะธะบะฐ"
-# msgstr "E178: "
-#: ../ex_docmd.c:4625
msgid "E179: argument required for -complete"
msgstr "E179: ะดะปั -complete ะฟะพั‚ั€ั–ะฑะฝะธะน ะฐั€ะณัƒะผะตะฝั‚"
-# msgstr "E180: "
-#: ../ex_docmd.c:4635
+msgid "E179: argument required for -addr"
+msgstr "E179: ะดะปั -addr ะฟะพั‚ั€ั–ะฑะฝะธะน ะฐั€ะณัƒะผะตะฝั‚"
+
#, c-format
msgid "E181: Invalid attribute: %s"
msgstr "E181: ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ะฐั‚ั€ะธะฑัƒั‚: %s"
-# msgstr "E181: "
-#: ../ex_docmd.c:4678
msgid "E182: Invalid command name"
msgstr "E182: ะะตะฟั€ะฐะฒะธะปัŒะฝะฐ ะฝะฐะทะฒะฐ ะบะพะผะฐะฝะดะธ"
-# msgstr "E182: "
-#: ../ex_docmd.c:4691
msgid "E183: User defined commands must start with an uppercase letter"
msgstr "E183: ะšะพะผะฐะฝะดะธ ะบะพั€ะธัั‚ัƒะฒะฐั‡ะฐ ะฟะพะฒะธะฝะฝั– ะฟะพั‡ะธะฝะฐั‚ะธัั ะท ะฒะตะปะธะบะพั— ะปั–ั‚ะตั€ะธ"
-#: ../ex_docmd.c:4696
msgid "E841: Reserved name, cannot be used for user defined command"
msgstr ""
"E841: ะ—ะฐั€ะตะทะตั€ะฒะพะฒะฐะฝะฐ ะฝะฐะทะฒะฐ, ะฝะต ะผะพะถะฝะฐ ะฒะธะบะพั€ะธัั‚ะฐั‚ะธ ะดะปั ะบะพั€ะธัั‚ัƒะฒะฐั†ัŒะบะพั— ะบะพะผะฐะฝะดะธ"
-# msgstr "E183: "
-#: ../ex_docmd.c:4751
#, c-format
msgid "E184: No such user-defined command: %s"
msgstr "E184: ะšะพะผะฐะฝะดัƒ ะบะพั€ะธัั‚ัƒะฒะฐั‡ะฐ ะฝะต ะทะฝะฐะนะดะตะฝะพ: %s"
-# msgstr "E179: "
-#: ../ex_docmd.c:5219
+#, c-format
+msgid "E180: Invalid address type value: %s"
+msgstr "E180: ะะตะฟั€ะฐะฒะธะปัŒะฝะต ะทะฝะฐั‡ะตะฝะฝั ั‚ะธะฟัƒ ะฐะดั€ะตัะธ: %s"
+
#, c-format
msgid "E180: Invalid complete value: %s"
msgstr "E180: ะะตะฟั€ะฐะฒะธะปัŒะฝะต ะดะพะฟะพะฒะฝะตะฝะฝั: %s"
-#: ../ex_docmd.c:5225
msgid "E468: Completion argument only allowed for custom completion"
msgstr "E468: ะั€ะณัƒะผะตะฝั‚ ะดะพะทะฒะพะปะตะฝะธะน ั‚ั–ะปัŒะบะธ ะดะปั ะบะพั€ะธัั‚ัƒะฒะฐั†ัŒะบะพะณะพ ะดะพะฟะพะฒะฝะตะฝะฝั"
-#: ../ex_docmd.c:5231
msgid "E467: Custom completion requires a function argument"
msgstr "E467: ะšะพั€ะธัั‚ัƒะฒะฐั†ัŒะบะต ะดะพะฟะพะฒะฝะตะฝะฝั ะฒะธะผะฐะณะฐั” ะฐั€ะณัƒะผะตะฝั‚-ั„ัƒะฝะบั†ั–ัŽ"
-# msgstr "E184: "
-#: ../ex_docmd.c:5257
#, c-format
msgid "E185: Cannot find color scheme '%s'"
msgstr "E185: ะะต ะฒะดะฐะปะพัั ะทะฝะฐะนั‚ะธ ัั…ะตะผัƒ ะบะพะปัŒะพั€ั–ะฒ ยซ%sยป"
-#: ../ex_docmd.c:5263
msgid "Greetings, Vim user!"
msgstr "ะ’ั–ั‚ะฐะฝะฝั, ะบะพั€ะธัั‚ัƒะฒะฐั‡ัƒ Vim!"
-# msgstr "E443: "
-#: ../ex_docmd.c:5431
msgid "E784: Cannot close last tab page"
msgstr "E784: ะะต ะผะพะถะฝะฐ ะทะฐะบั€ะธั‚ะธ ะพัั‚ะฐะฝะฝัŽ ะฒะบะปะฐะดะบัƒ"
-# msgstr "E444: "
-#: ../ex_docmd.c:5462
msgid "Already only one tab page"
msgstr "ะ’ะถะต ะน ั‚ะฐะบ ะปะธัˆะต ะพะดะฝะฐ ะฒะบะปะฐะดะบะฐ"
-#: ../ex_docmd.c:6004
#, c-format
msgid "Tab page %d"
msgstr "ะ’ะบะปะฐะดะบะฐ %d"
-#: ../ex_docmd.c:6295
+msgid "E25: Nvim does not have a built-in GUI"
+msgstr "E25: ะะต ะผะพะถะฝะฐ ะฒะธะบะพั€ะธัั‚ะฐั‚ะธ GUI: ะะต ะฒะฒั–ะผะบะฝะตะฝะพ ะฟั–ะด ั‡ะฐั ะบะพะผะฟั–ะปัั†ั–ั—"
+
msgid "No swap file"
msgstr "ะะตะผะฐั” ั„ะฐะนะปัƒ ะพะฑะผั–ะฝัƒ"
-#: ../ex_docmd.c:6478
-msgid "E747: Cannot change directory, buffer is modified (add ! to override)"
-msgstr "E747: ะะต ะฒะดะฐะปะพัั ะทะผั–ะฝะธั‚ะธ ะบะฐั‚ะฐะปะพะณ, ะฑัƒั„ะตั€ ะผะฐั” ะทะผั–ะฝะธ (! ั‰ะพะฑ ะฝะต ะทะฒะฐะถะฐั‚ะธ)"
-
-#: ../ex_docmd.c:6485
msgid "E186: No previous directory"
msgstr "E186: ะฆะต ะฒะถะต ะฝะฐะนะฟะตั€ัˆะธะน ะบะฐั‚ะฐะปะพะณ"
-# msgstr "E186: "
-#: ../ex_docmd.c:6530
msgid "E187: Unknown"
msgstr "E187: ะะตะฒั–ะดะพะผะพ"
-#: ../ex_docmd.c:6610
msgid "E465: :winsize requires two number arguments"
msgstr "E465: :winsize ะฒะธะผะฐะณะฐั” ะดะฒะฐ ั‡ะธัะปะพะฒะธั… ะฐั€ะณัƒะผะตะฝั‚ะธ"
-#: ../ex_docmd.c:6655
-msgid "E188: Obtaining window position not implemented for this platform"
-msgstr "E188: ะะต ะผะพะถะฝะฐ ะพั‚ั€ะธะผะฐั‚ะธ ะฟะพะทะธั†ั–ัŽ ะฒั–ะบะฝะฐ ะฝะฐ ั†ั–ะน ะฟะปะฐั‚ั„ะพั€ะผั–"
-
-#: ../ex_docmd.c:6662
-msgid "E466: :winpos requires two number arguments"
-msgstr "E466: :winpos ะฒะธะผะฐะณะฐั” ะดะฒะฐ ั‡ะธัะปะพะฒะธั… ะฐั€ะณัƒะผะตะฝั‚ะธ"
-
-#: ../ex_docmd.c:7241
-#, c-format
-msgid "E739: Cannot create directory: %s"
-msgstr "E739: ะะต ะฒะดะฐะปะพัั ัั‚ะฒะพั€ะธั‚ะธ ะบะฐั‚ะฐะปะพะณ: %s"
-
-#: ../ex_docmd.c:7268
#, c-format
msgid "E189: \"%s\" exists (add ! to override)"
msgstr "E189: ะคะฐะนะป ยซ%sยป ั–ัะฝัƒั” (! ั‰ะพะฑ ะฝะต ะทะฒะฐะถะฐั‚ะธ)"
-# msgstr "E189: "
-#: ../ex_docmd.c:7273
#, c-format
msgid "E190: Cannot open \"%s\" for writing"
msgstr "E190: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ยซ%sยป ะดะปั ะทะฐะฟะธััƒ"
-# msgstr "E190: "
-#. set mark
-#: ../ex_docmd.c:7294
msgid "E191: Argument must be a letter or forward/backward quote"
msgstr "E191: ะั€ะณัƒะผะตะฝั‚ ะผะฐั” ะฑัƒั‚ะธ ะปั–ั‚ะตั€ะพัŽ, ` ะฐะฑะพ '"
-# msgstr "E191: "
-#: ../ex_docmd.c:7333
msgid "E192: Recursive use of :normal too deep"
msgstr "E192: ะ—ะฐะฑะฐะณะฐั‚ะพ ะฒะบะปะฐะดะตะฝะธั… :normal"
-# msgstr "E193: "
-#: ../ex_docmd.c:7807
msgid "E194: No alternate file name to substitute for '#'"
msgstr "E194: ะะตะผะฐั” ะฝะฐะทะฒะธ ะฒั‚ะพั€ะธะฝะฝะพะณะพ ั„ะฐะนะปัƒ ะดะปั ะทะฐะผั–ะฝะธ '#'"
-#: ../ex_docmd.c:7841
msgid "E495: no autocommand file name to substitute for \"<afile>\""
msgstr "E495: ะะตะผะฐั” ะฝะฐะทะฒะธ ั„ะฐะนะปัƒ ะฐะฒั‚ะพะบะพะผะฐะฝะดะธ ะดะปั ะทะฐะผั–ะฝะธ ยซ<afile>ยป"
-#: ../ex_docmd.c:7850
msgid "E496: no autocommand buffer number to substitute for \"<abuf>\""
msgstr "E496: ะะตะผะฐั” ะฝะพะผะตั€ะฐ ะฑัƒั„ะตั€ะฐ ะฐะฒั‚ะพะบะพะผะฐะฝะดะธ ะดะปั ะทะฐะผั–ะฝะธ ยซ<abuf>ยป"
-#: ../ex_docmd.c:7861
msgid "E497: no autocommand match name to substitute for \"<amatch>\""
msgstr "E497: ะะตะผะฐั” ะฝะฐะทะฒะธ ะทะฑั–ะณัƒ ะฐะฒั‚ะพะบะพะผะฐะฝะดะธ ะดะปั ะทะฐะผั–ะฝะธ ยซ<amatch>ยป"
-#: ../ex_docmd.c:7870
msgid "E498: no :source file name to substitute for \"<sfile>\""
msgstr "E498: ะะตะผะฐั” ะฝะฐะทะฒะธ ั„ะฐะนะปัƒ :source ะดะปั ะทะฐะผั–ะฝะธ ยซ<sfile>ยป"
-#: ../ex_docmd.c:7876
msgid "E842: no line number to use for \"<slnum>\""
msgstr "E842: ะฝะตะผะฐั” ะฝะพะผะตั€ะฐ ั€ัะดะบะฐ, ั‰ะพะฑ ะฒะธะบะพั€ะธัั‚ะฐั‚ะธ ะท ยซ<sfile>ยป"
-#: ../ex_docmd.c:7903
-#, fuzzy, c-format
+#, c-format
msgid "E499: Empty file name for '%' or '#', only works with \":p:h\""
msgstr "E499: ะะฐะทะฒะฐ ั„ะฐะนะปัƒ ะดะปั '%' ั‡ะธ '#' ะฟะพั€ะพะถะฝั, ะฟั€ะฐั†ัŽั” ะปะธัˆะต ะท ยซ:p:hยป"
-#: ../ex_docmd.c:7905
msgid "E500: Evaluates to an empty string"
msgstr "E500: ะ ะตะทัƒะปัŒั‚ะฐั‚ โ€” ะฟะพั€ะพะถะฝั–ะน ั€ัะดะพะบ"
-#: ../ex_docmd.c:8838
-msgid "E195: Cannot open viminfo file for reading"
-msgstr "E195: ะะต ะฒะดะฐะปะพัั ะฟั€ะพั‡ะธั‚ะฐั‚ะธ ั„ะฐะนะป viminfo"
+msgid "Untitled"
+msgstr "ะะตะฝะฐะทะฒะฐะฝะธะน"
-#: ../ex_eval.c:464
msgid "E608: Cannot :throw exceptions with 'Vim' prefix"
msgstr "E608: ะะต ะผะพะถะฝะฐ ะฒะธะบะธะดะฐั‚ะธ (:throw) ะฒะธะฝัั‚ะบะธ ะท ะฟั€ะตั„ั–ะบัะพะผ 'Vim'"
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:496
#, c-format
msgid "Exception thrown: %s"
msgstr "ะ’ะธะฝัั‚ะบะพะฒะฐ ัะธั‚ัƒะฐั†ั–ั: %s"
-#: ../ex_eval.c:545
#, c-format
msgid "Exception finished: %s"
msgstr "ะ’ะธะฝัั‚ะพะบ ะทะฐะบั–ะฝั‡ะตะฝะพ: %s"
-#: ../ex_eval.c:546
#, c-format
msgid "Exception discarded: %s"
msgstr "ะ’ะธะฝัั‚ะพะบ ัะบะธะฝัƒั‚ะพ: %s"
-#: ../ex_eval.c:588 ../ex_eval.c:634
#, c-format
msgid "%s, line %<PRId64>"
msgstr "%s, ั€ัะดะพะบ %<PRId64>"
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:608
#, c-format
msgid "Exception caught: %s"
msgstr "ะกะฟั–ะนะผะฐะฝะพ ะฒะธะฝัั‚ะบะพะฒัƒ ัะธั‚ัƒะฐั†ั–ัŽ: %s"
-#: ../ex_eval.c:676
#, c-format
msgid "%s made pending"
msgstr "ะžั‡ั–ะบัƒั”ั‚ัŒัั %s"
-#: ../ex_eval.c:679
#, c-format
msgid "%s resumed"
msgstr "ะ’ั–ะดะฝะพะฒะปะตะฝะพ %s"
-#: ../ex_eval.c:683
#, c-format
msgid "%s discarded"
msgstr "ะกะบะธะฝัƒั‚ะพ %s"
-#: ../ex_eval.c:708
msgid "Exception"
msgstr "ะ’ะธะฝัั‚ะพะบ"
-#: ../ex_eval.c:713
msgid "Error and interrupt"
msgstr "ะŸะพะผะธะปะบะฐ, ะฟะตั€ะตั€ะฒะฐะฝะพ"
-# msgstr "E231: "
-#: ../ex_eval.c:715
msgid "Error"
msgstr "ะŸะพะผะธะปะบะฐ"
-#. if (pending & CSTP_INTERRUPT)
-#: ../ex_eval.c:717
msgid "Interrupt"
msgstr "ะŸะตั€ะตั€ะฒะฐะฝะพ"
-#: ../ex_eval.c:795
msgid "E579: :if nesting too deep"
msgstr "E579: ะ—ะฐะฝะฐะดั‚ะพ ะฑะฐะณะฐั‚ะพ ะฒะบะปะฐะดะตะฝะธั… :if"
-#: ../ex_eval.c:830
msgid "E580: :endif without :if"
msgstr "E580: :endif ะฑะตะท :if"
-#: ../ex_eval.c:873
msgid "E581: :else without :if"
msgstr "E581: :else ะฑะตะท :if"
-#: ../ex_eval.c:876
msgid "E582: :elseif without :if"
msgstr "E582: :elseif ะฑะตะท :if"
-#: ../ex_eval.c:880
msgid "E583: multiple :else"
msgstr "E583: ะะต ะพะดะฝะต :else"
-#: ../ex_eval.c:883
msgid "E584: :elseif after :else"
msgstr "E584: :elseif ะฟั–ัะปั :else"
-#: ../ex_eval.c:941
msgid "E585: :while/:for nesting too deep"
msgstr "E585: ะ—ะฐะฑะฐะณะฐั‚ะพ ะฒะบะปะฐะดะตะฝะธั… :while/:for"
-#: ../ex_eval.c:1028
msgid "E586: :continue without :while or :for"
msgstr "E586: :continue ะฑะตะท :while ั‡ะธ :for"
-#: ../ex_eval.c:1061
msgid "E587: :break without :while or :for"
msgstr "E587: :break ะฑะตะท :while ั‡ะธ :for"
-#: ../ex_eval.c:1102
msgid "E732: Using :endfor with :while"
msgstr "E732: ะ’ะถะธั‚ะพ :endfor ั–ะท :while"
-#: ../ex_eval.c:1104
msgid "E733: Using :endwhile with :for"
msgstr "E733: ะ’ะถะธั‚ะพ :endwhile ั–ะท :for"
-#: ../ex_eval.c:1247
msgid "E601: :try nesting too deep"
msgstr "E601: ะ—ะฐะฑะฐะณะฐั‚ะพ ะฒะบะปะฐะดะตะฝะธั… :try"
-#: ../ex_eval.c:1317
msgid "E603: :catch without :try"
msgstr "E603: :catch ะฑะตะท :try"
-#. Give up for a ":catch" after ":finally" and ignore it.
-#. * Just parse.
-#: ../ex_eval.c:1332
msgid "E604: :catch after :finally"
msgstr "E604: :catch ะฟั–ัะปั :finally"
-#: ../ex_eval.c:1451
msgid "E606: :finally without :try"
msgstr "E606: :finally ะฑะตะท :try"
-#. Give up for a multiple ":finally" and ignore it.
-#: ../ex_eval.c:1467
msgid "E607: multiple :finally"
msgstr "E607: ะะต ะพะดะฝะต :finally"
-#: ../ex_eval.c:1571
msgid "E602: :endtry without :try"
msgstr "E602: :entry ะฑะตะท :try"
-#: ../ex_eval.c:2026
msgid "E193: :endfunction not inside a function"
msgstr "E193: :endfunction ะฟะพะทะฐ ะผะตะถะฐะผะธ ั„ัƒะฝะบั†ั–ั—"
-#: ../ex_getln.c:1643
msgid "E788: Not allowed to edit another buffer now"
msgstr "E788: ะ—ะฐั€ะฐะท ะฝะต ะผะพะถะฝะฐ ั€ะตะดะฐะณัƒะฒะฐั‚ะธ ั–ะฝัˆะธะน ะฑัƒั„ะตั€"
-#: ../ex_getln.c:1656
msgid "E811: Not allowed to change buffer information now"
msgstr "E811: ะ—ะฐั€ะฐะท ะฝะต ะผะพะถะฝะฐ ะทะผั–ะฝัŽะฒะฐั‚ะธ ั–ะฝั„ะพั€ะผะฐั†ั–ัŽ ะฑัƒั„ะตั€ะฐ"
-# msgstr "E197: "
-#: ../ex_getln.c:3178
-msgid "tagname"
-msgstr "ะฝะฐะทะฒะฐ ั‚ะตา‘ัƒ"
+#, c-format
+msgid "E5408: Unable to get g:Nvim_color_cmdline callback: %s"
+msgstr "E5408: ะะต ะฒะดะฐะปะพัั ะพั‚ั€ะธะผะฐั‚ะธ g:Nvim_color_cmdline callback: %s"
-#: ../ex_getln.c:3181
-msgid " kind file\n"
-msgstr " ั‚ะธะฟ ั„ะฐะนะปัƒ\n"
+#, c-format
+msgid "E5407: Callback has thrown an exception: %s"
+msgstr "E5407: ะฃ ะทะฒะพั€ะพั‚ะฝัŒะพะผัƒ ะฒะธะบะปะธะบัƒ ัั‚ะฐะปะฐัั ะฒะธะฝัั‚ะบะพะฒะฐ ัะธั‚ัƒะฐั†ั–ั: %s"
-#: ../ex_getln.c:4799
-msgid "'history' option is zero"
-msgstr "ะžะฟั†ั–ั 'history' ะฟะพั€ะพะถะฝั"
+msgid "E5400: Callback should return list"
+msgstr "E5400: ะ—ะฒะพั€ะพั‚ะฝั–ะน ะฒะธะบะปะธะบ ะผะฐั” ะฟะพะฒะตั€ั‚ะฐั‚ะธ ัะฟะธัะพะบ"
-#: ../ex_getln.c:5046
#, c-format
-msgid ""
-"\n"
-"# %s History (newest to oldest):\n"
-msgstr ""
-"\n"
-"# ะŸะพะฟะตั€ะตะดะฝั– %s (ะฒั–ะด ะฝะฐะนะฝะพะฒั–ัˆะธั…):\n"
+msgid "E5401: List item %i is not a List"
+msgstr "E5401: ะ•ะปะตะผะตะฝั‚ ัะฟะธัะบัƒ %i ะฝะต List"
-#: ../ex_getln.c:5047
-msgid "Command Line"
-msgstr "ะบะพะผะฐะฝะดะธ"
+#, c-format
+msgid "E5402: List item %i has incorrect length: %d /= 3"
+msgstr "E5402: ะ•ะปะตะผะตะฝั‚ ัะฟะธัะบัƒ %i ะผะฐั” ะฝะตะฟั€ะฐะฒะธะปัŒะฝัƒ ะดะพะฒะถะธะฝัƒ: %d /= 3"
-#: ../ex_getln.c:5048
-msgid "Search String"
-msgstr "ัˆัƒะบะฐะฝั– ั€ัะดะบะธ"
+msgid "E5403: Chunk %i start %"
+msgstr "E5403: ะŸะพั‡ะฐั‚ะพะบ ัˆะผะฐั‚ะบะฐ %i %"
+
+msgid "E5405: Chunk %i start %"
+msgstr "E5405: ะŸะพั‡ะฐั‚ะพะบ ัˆะผะฐั‚ะบะฐ %i %"
+
+msgid "E5404: Chunk %i end %"
+msgstr "E5404: ะšั–ะฝะตั†ัŒ ัˆะผะฐั‚ะบะฐ %i %"
+
+msgid "E5406: Chunk %i end %"
+msgstr "E5406: ะšั–ะฝะตั†ัŒ ัˆะผะฐั‚ะบะฐ %i %"
+
+msgid "tagname"
+msgstr "ะฝะฐะทะฒะฐ ั‚ะตา‘ัƒ"
-#: ../ex_getln.c:5049
-msgid "Expression"
-msgstr "ะฒะธั€ะฐะทะธ"
+msgid " kind file\n"
+msgstr " ั‚ะธะฟ ั„ะฐะนะปัƒ\n"
-#: ../ex_getln.c:5050
-msgid "Input Line"
-msgstr "ะฒะฒะตะดะตะฝั– ั€ัะดะบะธ"
+msgid "'history' option is zero"
+msgstr "ะžะฟั†ั–ั 'history' ะฟะพั€ะพะถะฝั"
-#: ../ex_getln.c:5117
msgid "E198: cmd_pchar beyond the command length"
msgstr "E198: cmd_pchar ะฟะพะทะฐ ะผะตะถะฐะผะธ ะบะพะผะฐะฝะดะธ"
-#: ../ex_getln.c:5279
msgid "E199: Active window or buffer deleted"
msgstr "E199: ะะบั‚ะธะฒะฝะต ะฒั–ะบะฝะพ ะฐะฑะพ ะฑัƒั„ะตั€ ะฑัƒะปะพ ะทะฝะธั‰ะตะฝะพ"
-#: ../file_search.c:203
msgid "E854: path too long for completion"
msgstr "E854: ัˆะปัั… ะทะฐะฝะฐะดั‚ะพ ะดะพะฒะณะธะน ะดะปั ะดะพะฟะพะฒะฝะตะฝะฝั"
-#: ../file_search.c:446
#, c-format
msgid ""
"E343: Invalid path: '**[number]' must be at the end of the path or be "
@@ -2031,276 +1979,193 @@ msgstr ""
"E343: ะะตะบะพั€ะตะบั‚ะฝะธะน ัˆะปัั…: `**[ั‡ะธัะปะพ]' ะฟะพะฒะธะฝะฝะต ะฑัƒั‚ะธ ะฝะฐะฟั€ะธะบั–ะฝั†ั– ัˆะปัั…ัƒ ะฐะฑะพ ะฟะตั€ะตะด "
"'%s'."
-# msgstr "E343: "
-#: ../file_search.c:1505
#, c-format
msgid "E344: Can't find directory \"%s\" in cdpath"
msgstr "E344: ะะต ะฒะดะฐะปะพัั ะทะฝะฐะนั‚ะธ ะบะฐั‚ะฐะปะพะณ ยซ%sยป ัƒ cdpath"
-# msgstr "E344: "
-#: ../file_search.c:1508
#, c-format
msgid "E345: Can't find file \"%s\" in path"
msgstr "E345: ะะต ะฒะดะฐะปะพัั ะทะฝะฐะนั‚ะธ ั„ะฐะนะป ยซ%sยป ัƒ path"
-# msgstr "E345: "
-#: ../file_search.c:1512
#, c-format
msgid "E346: No more directory \"%s\" found in cdpath"
msgstr "E346: ะฃ cdpath ะฝะตะผะฐั” ะฑั–ะปัŒัˆะต ะบะฐั‚ะฐะปะพะณัƒ ยซ%sยป"
-# msgstr "E346: "
-#: ../file_search.c:1515
#, c-format
msgid "E347: No more file \"%s\" found in path"
msgstr "E347: ะฃ ัˆะปัั…ัƒ ะฟะพัˆัƒะบัƒ ะฑั–ะปัŒัˆะต ะฝะตะผะฐั” ั„ะฐะนะปั–ะฒ ยซ%sยป"
-#: ../fileio.c:137
msgid "E812: Autocommands changed buffer or buffer name"
msgstr "E812: ะะฒั‚ะพะบะพะผะฐะฝะดะธ ะทะผั–ะฝะธะปะธ ะฑัƒั„ะตั€ ั‡ะธ ะนะพะณะพ ะฝะฐะทะฒัƒ"
-# msgstr "E199: "
-#: ../fileio.c:368
msgid "Illegal file name"
msgstr "ะะตะดะพะทะฒะพะปะตะฝะฐ ะฝะฐะทะฒะฐ ั„ะฐะนะปัƒ"
-#: ../fileio.c:395 ../fileio.c:476 ../fileio.c:2543 ../fileio.c:2578
msgid "is a directory"
msgstr "ะบะฐั‚ะฐะปะพะณ"
-#: ../fileio.c:397
msgid "is not a file"
msgstr "ะฝะต ั„ะฐะนะป"
-#: ../fileio.c:508 ../fileio.c:3522
msgid "[New File]"
msgstr "[ะะพะฒะธะน ั„ะฐะนะป]"
-#: ../fileio.c:511
msgid "[New DIRECTORY]"
msgstr "[ะะพะฒะธะน ะบะฐั‚ะฐะปะพะณ]"
-#: ../fileio.c:529 ../fileio.c:532
msgid "[File too big]"
msgstr "[ะคะฐะนะป ะทะฐะฒะตะปะธะบะธะน]"
-#: ../fileio.c:534
msgid "[Permission Denied]"
msgstr "[ะ’ั–ะดะผะพะฒะปะตะฝะพ]"
-#: ../fileio.c:653
msgid "E200: *ReadPre autocommands made the file unreadable"
msgstr "E200: ะะฒั‚ะพะบะพะผะฐะฝะดะธ *ReadPre ัƒะฝะตะผะพะถะปะธะฒะธะปะธ ั‡ะธั‚ะฐะฝะฝั ั„ะฐะนะปัƒ"
-# msgstr "E200: "
-#: ../fileio.c:655
msgid "E201: *ReadPre autocommands must not change current buffer"
msgstr "E201: ะะฒั‚ะพะบะพะผะฐะฝะดะธ *ReadPre ะฝะต ะฟะพะฒะธะฝะฝั– ะทะผั–ะฝัŽะฒะฐั‚ะธ ั†ะตะน ะฑัƒั„ะตั€"
-# msgstr "E201: "
-#: ../fileio.c:672
-msgid "Nvim: Reading from stdin...\n"
-msgstr "Vim: ะงะธั‚ะฐั”ั‚ัŒัั ะท stdin...\n"
-
-#. Re-opening the original file failed!
-#: ../fileio.c:909
msgid "E202: Conversion made file unreadable!"
msgstr "E202: ะšะพะฝะฒะตั€ั‚ะฐั†ั–ั ัƒะฝะตะผะพะถะปะธะฒะธะปะฐ ั‡ะธั‚ะฐะฝะฝั ั„ะฐะนะปัƒ!"
-# msgstr "E202: "
-#. fifo or socket
-#: ../fileio.c:1782
msgid "[fifo/socket]"
msgstr "[ะบะฐะฝะฐะป/ัะพะบะตั‚]"
-#. fifo
-#: ../fileio.c:1788
msgid "[fifo]"
msgstr "[ะบะฐะฝะฐะป]"
-#. or socket
-#: ../fileio.c:1794
msgid "[socket]"
msgstr "[ัะพะบะตั‚]"
-#. or character special
-#: ../fileio.c:1801
msgid "[character special]"
msgstr "[ัะฟะตั†. ัะธะผะฒะพะปัŒะฝะธะน]"
-#: ../fileio.c:1815
msgid "[CR missing]"
msgstr "[ะ‘ั€ะฐะบัƒั” CR]"
-#: ../fileio.c:1819
-msgid "[long lines split]"
-msgstr "[ะ ะพะทะฑะธั‚ะพ ะดะพะฒะณั– ั€ัะดะบะธ]"
-
-#: ../fileio.c:1823 ../fileio.c:3512
msgid "[NOT converted]"
msgstr "[ะะ• ะบะพะฝะฒะตั€ั‚ะพะฒะฐะฝะพ]"
-#: ../fileio.c:1826 ../fileio.c:3515
msgid "[converted]"
msgstr "[ะบะพะฝะฒะตั€ั‚ะพะฒะฐะฝะพ]"
-#: ../fileio.c:1831
#, c-format
msgid "[CONVERSION ERROR in line %<PRId64>]"
msgstr "[ะŸะžะœะ˜ะ›ะšะ ะšะžะะ’ะ•ะ ะขะะฆะ†ะ‡ ัƒ ั€ัะดะบัƒ %<PRId64>]"
-#: ../fileio.c:1835
#, c-format
msgid "[ILLEGAL BYTE in line %<PRId64>]"
msgstr "[ะะ•ะšะžะ ะ•ะšะขะะ˜ะ™ ะ‘ะะ™ะข ัƒ ั€ัะดะบัƒ %<PRId64>]"
-#: ../fileio.c:1838
msgid "[READ ERRORS]"
msgstr "[ะŸะžะœะ˜ะ›ะšะ ะงะ˜ะขะะะะฏ]"
-#: ../fileio.c:2104
msgid "Can't find temp file for conversion"
msgstr "ะะต ะฒะดะฐะปะพัั ะฟั–ะดัˆัƒะบะฐั‚ะธ ั‚ะธะผั‡ะฐัะพะฒะธะน ั„ะฐะนะป ะดะปั ะบะพะฝะฒะตั€ั‚ะฐั†ั–ั—"
-#: ../fileio.c:2110
msgid "Conversion with 'charconvert' failed"
msgstr "ะšะพะฝะฒะตั€ั‚ะฐั†ั–ั ะท 'charconvert' ะฝะต ะฒะดะฐะปะฐัั"
-#: ../fileio.c:2113
msgid "can't read output of 'charconvert'"
msgstr "ะฝะต ะฒะดะฐะปะพัั ะฟั€ะพั‡ะธั‚ะฐั‚ะธ ะฒะธะฒั–ะด 'charconvert'"
-# msgstr "E217: "
-#: ../fileio.c:2437
msgid "E676: No matching autocommands for acwrite buffer"
msgstr "E676: ะะตะผะฐั” ะฒั–ะดะฟะพะฒั–ะดะฝะธั… ะฐะฒั‚ะพะบะพะผะฐะฝะด"
-#: ../fileio.c:2466
msgid "E203: Autocommands deleted or unloaded buffer to be written"
msgstr "E203: ะะฒั‚ะพะบะพะผะฐะฝะดะฐ ะทะฝะธั‰ะธะปะฐ ะฐะฑะพ ะฒะธะฒะฐะฝั‚ะฐะถะธะปะฐ ะฑัƒั„ะตั€, ั‰ะพ ะผะฐะฒ ะฑัƒั‚ะธ ะทะฐะฟะธัะฐะฝะธะน"
-#: ../fileio.c:2486
msgid "E204: Autocommand changed number of lines in unexpected way"
msgstr "E204: ะะฒั‚ะพะบะพะผะฐะฝะดะฐ ะฝะตัะฟะพะดั–ะฒะฐะฝะธะผ ั‡ะธะฝะพะผ ะทะผั–ะฝะธะปะฐ ะบั–ะปัŒะบั–ัั‚ัŒ ั€ัะดะบั–ะฒ"
-#: ../fileio.c:2548 ../fileio.c:2565
msgid "is not a file or writable device"
msgstr "ะะต ะฟั€ะธะดะฐั‚ะฝะธะน ะดะปั ะทะฐะฟะธััƒ"
-#: ../fileio.c:2601
msgid "is read-only (add ! to override)"
msgstr "ะปะธัˆะต ะดะปั ั‡ะธั‚ะฐะฝะฝั (! ั‰ะพะฑ ะฝะต ะทะฒะฐะถะฐั‚ะธ)"
-#: ../fileio.c:2886
msgid "E506: Can't write to backup file (add ! to override)"
msgstr "E506: ะะต ะฒะดะฐะปะพัั ะทะฐะฟะธัะฐั‚ะธ ั€ะตะทะตั€ะฒะฝะธะน ั„ะฐะนะป (! ั‰ะพะฑ ะฝะต ะทะฒะฐะถะฐั‚ะธ)"
-#: ../fileio.c:2898
-msgid "E507: Close error for backup file (add ! to override)"
-msgstr "E507: ะŸะพะผะธะปะบะฐ ะทะฐะบั€ะธั‚ั‚ั ั€ะตะทะตั€ะฒะฝะพะณะพ ั„ะฐะนะปัƒ (! ั‰ะพะฑ ะฝะต ะทะฒะฐะถะฐั‚ะธ)"
+#, c-format
+msgid "E507: Close error for backup file (add ! to override): %s"
+msgstr "E507: ะŸะพะผะธะปะบะฐ ะทะฐะบั€ะธั‚ั‚ั ั€ะตะทะตั€ะฒะฝะพะณะพ ั„ะฐะนะปัƒ (! ั‰ะพะฑ ะฝะต ะทะฒะฐะถะฐั‚ะธ): %s"
-#: ../fileio.c:2901
msgid "E508: Can't read file for backup (add ! to override)"
msgstr ""
"E508: ะะต ะฒะดะฐะปะพัั ะฟั€ะพั‡ะธั‚ะฐั‚ะธ ั„ะฐะนะป ั‰ะพะฑ ัั‚ะฒะพั€ะธั‚ะธ ั€ะตะทะตั€ะฒะฝัƒ ะบะพะฟั–ัŽ (! ั‰ะพะฑ ะฝะต "
"ะทะฒะฐะถะฐั‚ะธ)"
-#: ../fileio.c:2923
msgid "E509: Cannot create backup file (add ! to override)"
msgstr "E509: ะะต ะฒะดะฐะปะพัั ัั‚ะฒะพั€ะธั‚ะธ ั€ะตะทะตั€ะฒะฝัƒ ะบะพะฟั–ัŽ (! ั‰ะพะฑ ะฝะต ะทะฒะฐะถะฐั‚ะธ)"
-#: ../fileio.c:3008
msgid "E510: Can't make backup file (add ! to override)"
msgstr "E510: ะะต ะฒะดะฐะปะพัั ะทั€ะพะฑะธั‚ะธ ั€ะตะทะตั€ะฒะฝัƒ ะบะพะฟั–ัŽ (! ั‰ะพะฑ ะฝะต ะทะฒะฐะถะฐั‚ะธ)"
-#. Can't write without a tempfile!
-#: ../fileio.c:3121
msgid "E214: Can't find temp file for writing"
msgstr "E214: ะะต ะฒะดะฐะปะพัั ะฟั–ะดัˆัƒะบะฐั‚ะธ ั‚ะธะผั‡ะฐัะพะฒะธะน ั„ะฐะนะป ะดะปั ะทะฐะฟะธััƒ"
-#: ../fileio.c:3134
msgid "E213: Cannot convert (add ! to write without conversion)"
msgstr "E213: ะะต ะฒะดะฐะปะพัั ะฟะตั€ะตั‚ะฒะพั€ะธั‚ะธ (! ั‰ะพะฑ ะทะฐะฟะธัะฐั‚ะธ ะฑะตะท ะบะพะฝะฒะตั€ั‚ะฐั†ั–ั—)"
-#: ../fileio.c:3169
msgid "E166: Can't open linked file for writing"
msgstr "E166: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ะดะปั ะทะฐะฟะธััƒ ะทะฒ'ัะทะฐะฝะธะน ั„ะฐะนะป"
-#: ../fileio.c:3173
-msgid "E212: Can't open file for writing"
-msgstr "E212: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ั„ะฐะนะป ะดะปั ะทะฐะฟะธััƒ"
+#, c-format
+msgid "E212: Can't open file for writing: %s"
+msgstr "E212: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ั„ะฐะนะป ะดะปั ะทะฐะฟะธััƒ: %s"
-#: ../fileio.c:3363
-msgid "E667: Fsync failed"
-msgstr "E667: ะะต ะฒะดะฐะปะพัั ะฒะธะบะพะฝะฐั‚ะธ fsync"
+#, c-format
+msgid "E667: Fsync failed: %s"
+msgstr "E667: ะะต ะฒะดะฐะปะพัั ะฒะธะบะพะฝะฐั‚ะธ fsync: %s"
-#: ../fileio.c:3398
-msgid "E512: Close failed"
-msgstr "E512: ะะต ะฒะดะฐะปะพัั ะทะฐะบั€ะธั‚ะธ"
+#, c-format
+msgid "E512: Close failed: %s"
+msgstr "E512: ะะต ะฒะดะฐะปะพัั ะทะฐะบั€ะธั‚ะธ: %s"
-#: ../fileio.c:3436
msgid "E513: write error, conversion failed (make 'fenc' empty to override)"
msgstr "E513: ะŸะพะผะธะปะบะฐ ะทะฐะฟะธััƒ, ะบะพะฝะฒะตั€ั‚ะฐั†ั–ั ะฝะต ะฒะดะฐะปะฐัั (ัะบะธะฝัŒั‚ะต 'fenc')"
-#: ../fileio.c:3441
-#, c-format
-msgid ""
-"E513: write error, conversion failed in line %<PRId64> (make 'fenc' empty to "
-"override)"
-msgstr ""
-"E513: ะŸะพะผะธะปะบะฐ ะทะฐะฟะธััƒ, ะบะพะฝะฒะตั€ั‚ะฐั†ั–ั ะฝะต ะฒะดะฐะปะฐัั ัƒ ั€ัะดะบัƒ %<PRId64> (ัะบะธะฝัŒั‚ะต "
-"'fenc')"
+msgid "E513: write error, conversion failed in line %"
+msgstr "E513: ะŸะพะผะธะปะบะฐ ะทะฐะฟะธััƒ, ะฟะตั€ะตั‚ะฒะพั€ะตะฝะฝั ะฝะต ะฒะดะฐะปะฐัั ัƒ ั€ัะดะบัƒ %"
-#: ../fileio.c:3448
msgid "E514: write error (file system full?)"
msgstr "E514: ะŸะพะผะธะปะบะฐ ะทะฐะฟะธััƒ (ัะบั–ะฝั‡ะธะปะพััŒ ะฒั–ะปัŒะฝะต ะผั–ัั†ะต?)"
-#: ../fileio.c:3506
msgid " CONVERSION ERROR"
msgstr " ะŸะžะœะ˜ะ›ะšะ ะšะžะะ’ะ•ะ ะขะะฆะ†ะ‡"
-#: ../fileio.c:3509
#, c-format
msgid " in line %<PRId64>;"
msgstr " ัƒ ั€ัะดะบัƒ %<PRId64>;"
-#: ../fileio.c:3519
msgid "[Device]"
msgstr "[ะŸั€ะธัั‚ั€ั–ะน]"
-#: ../fileio.c:3522
msgid "[New]"
msgstr "[ะะพะฒะธะน]"
-#: ../fileio.c:3535
msgid " [a]"
msgstr "[ะด]"
-#: ../fileio.c:3535
msgid " appended"
msgstr " ะดะพะฟะธัะฐะฝะธะน"
-#: ../fileio.c:3537
msgid " [w]"
msgstr "[ะท]"
-#: ../fileio.c:3537
msgid " written"
msgstr " ะทะฐะฟะธัะฐะฝะธะน"
-#: ../fileio.c:3579
msgid "E205: Patchmode: can't save original file"
msgstr "E205: ะ›ะฐั‚ะฐะฝะฝั: ะฝะต ะฒะดะฐะปะพัั ะทะฑะตั€ะตะณั‚ะธ ะพั€ะธะณั–ะฝะฐะป"
-#: ../fileio.c:3602
msgid "E206: patchmode: can't touch empty original file"
msgstr "E206: ะ›ะฐั‚ะฐะฝะฝั: ะฝะต ะฒะดะฐะปะพัั ัั‚ะฒะพั€ะธั‚ะธ ะพั€ะธะณั–ะฝะฐะป"
-#: ../fileio.c:3616
msgid "E207: Can't delete backup file"
msgstr "E207: ะะต ะฒะดะฐะปะพัั ะทะฝะธั‰ะธั‚ะธ ั€ะตะทะตั€ะฒะฝะธะน ั„ะฐะนะป"
-#: ../fileio.c:3672
msgid ""
"\n"
"WARNING: Original file may be lost or damaged\n"
@@ -2308,134 +2173,102 @@ msgstr ""
"\n"
"ะ—ะะกะขะ•ะ ะ•ะ–ะ•ะะะฏ: ะžั€ะธะณั–ะฝะฐะป, ะผะฐะฑัƒั‚ัŒ, ะฒั‚ั€ะฐั‡ะตะฝะธะน ั‡ะธ ะฟะพัˆะบะพะดะถะตะฝะธะน\n"
-#: ../fileio.c:3675
msgid "don't quit the editor until the file is successfully written!"
msgstr "ะะต ะฒะธั…ะพะดัŒั‚ะต ะท ั€ะตะดะฐะบั‚ะพั€ะฐ, ะดะพะบะธ ั„ะฐะนะป ะฝะต ะทะฐะฟะธัะฐะฝะพ!"
-#: ../fileio.c:3795
-msgid "[dos]"
-msgstr "[dos]"
-
-#: ../fileio.c:3795
msgid "[dos format]"
msgstr "[ั„ะพั€ะผะฐั‚ dos]"
-#: ../fileio.c:3801
-msgid "[mac]"
-msgstr "[mac]"
+msgid "[dos]"
+msgstr "[dos]"
-#: ../fileio.c:3801
msgid "[mac format]"
msgstr "[ั„ะพั€ะผะฐั‚ mac]"
-#: ../fileio.c:3807
-msgid "[unix]"
-msgstr "[unix]"
+msgid "[mac]"
+msgstr "[mac]"
-#: ../fileio.c:3807
msgid "[unix format]"
msgstr "[ั„ะพั€ะผะฐั‚ unix]"
-#: ../fileio.c:3831
+msgid "[unix]"
+msgstr "[unix]"
+
msgid "1 line, "
msgstr "ะพะดะธะฝ ั€ัะดะพะบ, "
-#: ../fileio.c:3833
#, c-format
msgid "%<PRId64> lines, "
msgstr "%<PRId64> ั€ัะดะบั–ะฒ, "
-#: ../fileio.c:3836
msgid "1 character"
msgstr "ะพะดะธะฝ ัะธะผะฒะพะป"
-#: ../fileio.c:3838
#, c-format
msgid "%<PRId64> characters"
msgstr "%<PRId64> ัะธะผะฒะพะปั–ะฒ"
-#: ../fileio.c:3849
-msgid "[noeol]"
-msgstr "[noeol]"
-
-#: ../fileio.c:3849
msgid "[Incomplete last line]"
msgstr "[ะะตะฟะพะฒะฝะธะน ะพัั‚ะฐะฝะฝั–ะน ั€ัะดะพะบ]"
-#. don't overwrite messages here
-#. must give this prompt
-#. don't use emsg() here, don't want to flush the buffers
-#: ../fileio.c:3865
+msgid "[noeol]"
+msgstr "[noeol]"
+
msgid "WARNING: The file has been changed since reading it!!!"
msgstr "ะ—ะะกะขะ•ะ ะ•ะ–ะ•ะะะฏ: ะคะฐะนะป ะทะผั–ะฝะธะฒัั ะท ั‡ะฐััƒ ะพัั‚ะฐะฝะฝัŒะพะณะพ ั‡ะธั‚ะฐะฝะฝั!!!"
-#: ../fileio.c:3867
msgid "Do you really want to write to it"
msgstr "ะ’ะธ ัะฟั€ะฐะฒะดั– ั…ะพั‡ะตั‚ะต ะนะพะณะพ ะฟะตั€ะตะฟะธัะฐั‚ะธ??"
-#: ../fileio.c:4648
#, c-format
msgid "E208: Error writing to \"%s\""
msgstr "E208: ะŸะพะผะธะปะบะฐ ะทะฐะฟะธััƒ ัƒ ยซ%sยป"
-#: ../fileio.c:4655
#, c-format
msgid "E209: Error closing \"%s\""
msgstr "E209: ะŸะพะผะธะปะบะฐ ะทะฐะบั€ะธั‚ั‚ั ยซ%sยป"
-#: ../fileio.c:4657
#, c-format
msgid "E210: Error reading \"%s\""
msgstr "E210: ะŸะพะผะธะปะบะฐ ั‡ะธั‚ะฐะฝะฝั ยซ%sยป"
-#: ../fileio.c:4883
msgid "E246: FileChangedShell autocommand deleted buffer"
msgstr "E246: ะะฒั‚ะพะบะพะผะฐะฝะดะฐ FileChangedShell ะทะฝะธั‰ะธะปะฐ ะฑัƒั„ะตั€"
-#: ../fileio.c:4894
#, c-format
msgid "E211: File \"%s\" no longer available"
msgstr "E211: ะคะฐะนะป ยซ%sยป ะฑั–ะปัŒัˆะต ะฝะต ะดะพััะถะฝะธะน"
-#: ../fileio.c:4906
#, c-format
msgid ""
"W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as "
"well"
msgstr "W12: ะ—ะฐัั‚ะตั€ะตะถะตะฝะฝั: ะคะฐะนะป ยซ%sยป ะทะผั–ะฝะธะฒัั, ะฐะปะต ะน ะฑัƒั„ะตั€ ัƒ Vim ั‚ะฐะบะพะถ"
-#: ../fileio.c:4907
msgid "See \":help W12\" for more info."
msgstr "ะ”ะธะฒ. ยซ:help W12ยป ะดะปั ัƒั‚ะพั‡ะฝะตะฝะฝั."
-#: ../fileio.c:4910
#, c-format
msgid "W11: Warning: File \"%s\" has changed since editing started"
msgstr "W11: ะ—ะฐัั‚ะตั€ะตะถะตะฝะฝั: ะคะฐะนะป ยซ%sยป ะทะผั–ะฝะธะฒัั ะฟั–ัะปั ะฟะพั‡ะฐั‚ะบัƒ ั€ะตะดะฐะณัƒะฒะฐะฝะฝั"
-#: ../fileio.c:4911
msgid "See \":help W11\" for more info."
msgstr "ะ”ะธะฒ. ยซ:help W11ยป ะดะปั ัƒั‚ะพั‡ะฝะตะฝะฝั."
-#: ../fileio.c:4914
#, c-format
msgid "W16: Warning: Mode of file \"%s\" has changed since editing started"
msgstr "W16: ะ—ะฐัั‚ะตั€ะตะถะตะฝะฝั: ะ ะตะถะธะผ ั„ะฐะนะปัƒ ยซ%sยป ะทะผั–ะฝะธะฒัั ะฟั–ัะปั ะฟะพั‡ะฐั‚ะบัƒ ั€ะตะดะฐะณัƒะฒะฐะฝะฝั"
-#: ../fileio.c:4915
msgid "See \":help W16\" for more info."
msgstr "ะ”ะธะฒ. ยซ:help W16ยป ะดะปั ัƒั‚ะพั‡ะฝะตะฝะฝั."
-#: ../fileio.c:4927
#, c-format
msgid "W13: Warning: File \"%s\" has been created after editing started"
msgstr "W13: ะ—ะฐัั‚ะตั€ะตะถะตะฝะฝั: ะคะฐะนะป ยซ%sยป ะฑัƒะปะพ ัั‚ะฒะพั€ะตะฝะพ ะฟั–ัะปั ะฟะพั‡ะฐั‚ะบัƒ ั€ะตะดะฐะณัƒะฒะฐะฝะฝั"
-#: ../fileio.c:4947
msgid "Warning"
msgstr "ะ—ะฐัั‚ะตั€ะตะถะตะฝะฝั"
-#: ../fileio.c:4948
msgid ""
"&OK\n"
"&Load File"
@@ -2443,854 +2276,681 @@ msgstr ""
"&O:ะ“ะฐั€ะฐะทะด\n"
"&L:ะ—ะฐะฒะฐะฝั‚ะฐะถะธั‚ะธ"
-#: ../fileio.c:5065
#, c-format
msgid "E462: Could not prepare for reloading \"%s\""
msgstr "E462: ะะต ะฒะดะฐะปะพัั ะฟั–ะดะณะพั‚ัƒะฒะฐั‚ะธ ยซ%sยป, ั‰ะพะฑ ะฟะตั€ะตั‡ะธั‚ะฐั‚ะธ"
-#: ../fileio.c:5078
#, c-format
msgid "E321: Could not reload \"%s\""
msgstr "E321: ะะต ะฒะดะฐะปะพัั ะฟะตั€ะตั‡ะธั‚ะฐั‚ะธ ยซ%sยป"
-#: ../fileio.c:5601
msgid "--Deleted--"
msgstr "--ะ—ะฝะธั‰ะตะฝะพ--"
-#: ../fileio.c:5732
#, c-format
msgid "auto-removing autocommand: %s <buffer=%d>"
msgstr "ะะฒั‚ะพะผะฐั‚ะธั‡ะฝะต ะทะฝะธั‰ะตะฝะฝั ะฐะฒั‚ะพะบะพะผะฐะฝะดะธ: %s <ะฑัƒั„ะตั€=%d>"
-#. the group doesn't exist
-#: ../fileio.c:5772
#, c-format
msgid "E367: No such group: \"%s\""
msgstr "E367: ะะตะผะฐั” ั‚ะฐะบะพั— ะณั€ัƒะฟะธ: ยซ%sยป"
-#: ../fileio.c:5897
+msgid "E936: Cannot delete the current group"
+msgstr "E936: ะะต ะฒะดะฐะปะพัั ะทะฝะธั‰ะธั‚ะธ ั†ัŽ ะณั€ัƒะฟัƒ"
+
+msgid "W19: Deleting augroup that is still in use"
+msgstr "W19: ะ—ะฝะธั‰ะตะฝะฝั ะฐะฒั‚ะพะณั€ัƒะฟะธ, ัะบะฐ ะฒัะต ั‰ะต ะฒะธะบะพั€ะธัั‚ะพะฒัƒั”ั‚ัŒัั"
+
#, c-format
msgid "E215: Illegal character after *: %s"
msgstr "E215: ะะตะดะพะทะฒะพะปะตะฝะธะน ัะธะผะฒะพะป ะฟั–ัะปั *: %s"
-# msgstr "E215: "
-#: ../fileio.c:5905
#, c-format
msgid "E216: No such event: %s"
msgstr "E216: ะะตะผะฐั” ั‚ะฐะบะพั— ะฟะพะดั–ั—: %s"
-# msgstr "E215: "
-#: ../fileio.c:5907
#, c-format
msgid "E216: No such group or event: %s"
msgstr "E216: ะะตะผะฐั” ั‚ะฐะบะพั— ะณั€ัƒะฟะธ ั‡ะธ ะฟะพะดั–ั—: %s"
-# msgstr "E216: "
-#. Highlight title
-#: ../fileio.c:6090
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
"--- ะะฒั‚ะพะบะพะผะฐะฝะดะธ ---"
-#: ../fileio.c:6293
#, c-format
msgid "E680: <buffer=%d>: invalid buffer number "
msgstr "E680: <ะฑัƒั„ะตั€=%d>: ะฝะตะบะพั€ะตะบั‚ะฝะธะน ะฝะพะผะตั€ ะฑัƒั„ะตั€ะฐ "
-#: ../fileio.c:6370
msgid "E217: Can't execute autocommands for ALL events"
msgstr "E217: ะะต ะผะพะถัƒ ะฒะธะบะพะฝัƒะฒะฐั‚ะธ ะฐะฒั‚ะพะบะพะผะฐะฝะดะธ ะดะปั ะฃะกะ†ะฅ ะฟะพะดั–ะน"
-# msgstr "E217: "
-#: ../fileio.c:6393
msgid "No matching autocommands"
msgstr "ะะตะผะฐั” ะฒั–ะดะฟะพะฒั–ะดะฝะธั… ะฐะฒั‚ะพะบะพะผะฐะฝะด"
-#: ../fileio.c:6831
msgid "E218: autocommand nesting too deep"
msgstr "E218: ะ—ะฐะฑะฐะณะฐั‚ะพ ะฒะบะปะฐะดะตะฝะธั… ะฐะฒั‚ะพะบะพะผะฐะฝะด"
-# msgstr "E218: "
-#: ../fileio.c:7143
#, c-format
-msgid "%s Auto commands for \"%s\""
-msgstr "ะะฒั‚ะพะบะพะผะฐะฝะดะธ %s ะดะปั ยซ%sยป"
+msgid "%s Autocommands for \"%s\""
+msgstr "%s ะะฒั‚ะพะบะพะผะฐะฝะดะธ ะดะปั ยซ%sยป"
-#: ../fileio.c:7149
#, c-format
msgid "Executing %s"
msgstr "ะ’ะธะบะพะฝัƒั”ั‚ัŒัั %s"
-#: ../fileio.c:7211
#, c-format
msgid "autocommand %s"
msgstr "ะฐะฒั‚ะพะบะพะผะฐะฝะดะฐ %s"
-#: ../fileio.c:7795
msgid "E219: Missing {."
msgstr "E219: ะ‘ั€ะฐะบัƒั” {."
-# msgstr "E219: "
-#: ../fileio.c:7797
msgid "E220: Missing }."
msgstr "E220: ะ‘ั€ะฐะบัƒั” }."
-# msgstr "E220: "
-#: ../fold.c:93
msgid "E490: No fold found"
msgstr "E490: ะ—ะณะพั€ั‚ะพะบ ะฝะต ะทะฝะฐะนะดะตะฝะพ"
-# msgstr "E349: "
-#: ../fold.c:544
msgid "E350: Cannot create fold with current 'foldmethod'"
msgstr "E350: ะะต ะฒะดะฐะปะพัั ัั‚ะฒะพั€ะธั‚ะธ ะทะณะพั€ั‚ะบัƒ ะผะตั‚ะพะดะพะผ 'foldmethod'"
-#: ../fold.c:546
msgid "E351: Cannot delete fold with current 'foldmethod'"
msgstr "E351: ะะต ะฒะดะฐะปะพัั ะทะฝะธั‰ะธั‚ะธ ะทะณะพั€ั‚ะบัƒ ะผะตั‚ะพะดะพะผ 'foldmethod'"
-#: ../fold.c:1784
-#, c-format
-msgid "+--%3ld lines folded "
-msgstr "+-- ะทะณะพั€ะฝัƒั‚ะพ %3ld ั€ัะดะบั–ะฒ "
-
-#. buffer has already been read
-#: ../getchar.c:273
msgid "E222: Add to read buffer"
msgstr "E222: ะ”ะพะดะฐั‚ะธ ะดะพ ะฑัƒั„ะตั€ะฐ ั‡ะธั‚ะฐะฝะฝั"
-#: ../getchar.c:2040
msgid "E223: recursive mapping"
-msgstr "E223: ะ—ะฐะผั–ะฝะฐ ั€ะตะบัƒั€ัะธะฒะฝะฐ"
+msgstr "E223: ะ—ะฐะผั–ะฝะฐ ะบะปะฐะฒั–ัˆ ั€ะตะบัƒั€ัะธะฒะฝะฐ"
-# msgstr "E223: "
-#: ../getchar.c:2849
#, c-format
msgid "E224: global abbreviation already exists for %s"
msgstr "E224: ะ—ะฐะณะฐะปัŒะฝะต ัะบะพั€ะพั‡ะตะฝะฝั ะดะปั %s ะฒะถะต ั–ัะฝัƒั”"
-# msgstr "E224: "
-#: ../getchar.c:2852
#, c-format
msgid "E225: global mapping already exists for %s"
-msgstr "E225: ะ—ะฐะณะฐะปัŒะฝะฐ ะทะฐะผั–ะฝะฐ ะดะปั %s ะฒะถะต ั–ัะฝัƒั”"
+msgstr "E225: ะ“ะปะพะฑะฐะปัŒะฝะฐ ะทะฐะผั–ะฝะฐ ะบะปะฐะฒั–ัˆ ะดะปั %s ะฒะถะต ั–ัะฝัƒั”"
-# msgstr "E225: "
-#: ../getchar.c:2952
#, c-format
msgid "E226: abbreviation already exists for %s"
msgstr "E226: ะ’ะถะต ั” ัะบะพั€ะพั‡ะตะฝะฝั ะดะปั %s"
-# msgstr "E226: "
-#: ../getchar.c:2955
#, c-format
msgid "E227: mapping already exists for %s"
-msgstr "E227: ะ’ะถะต ั” ะทะฐะผั–ะฝะฐ ะดะปั %s"
+msgstr "E227: ะ’ะถะต ั” ะทะฐะผั–ะฝะฐ ะบะปะฐะฒั–ัˆ ะดะปั %s"
-# msgstr "E227: "
-#: ../getchar.c:3008
msgid "No abbreviation found"
msgstr "ะกะบะพั€ะพั‡ะตะฝะฝั ะฝะต ะทะฝะฐะนะดะตะฝะพ"
-#: ../getchar.c:3010
msgid "No mapping found"
-msgstr "ะ—ะฐะผั–ะฝะธ ะฝะต ะทะฝะฐะนะดะตะฝะพ"
+msgstr "ะ—ะฐะผั–ะฝะธ ะบะปะฐะฒั–ัˆ ะฝะต ะทะฝะฐะนะดะตะฝะพ"
-#: ../getchar.c:3974
msgid "E228: makemap: Illegal mode"
msgstr "E228: makemap: ะะตะฟั€ะธะฟัƒัั‚ะธะผะธะน ั€ะตะถะธะผ"
-# msgstr "E447: "
-#. key value of 'cedit' option
-#. type of cmdline window or 0
-#. result of cmdline window or 0
-#: ../globals.h:924
msgid "--No lines in buffer--"
msgstr "--ะ–ะพะดะฝะพะณะพ ั€ัะดะบะฐ--"
-#.
-#. * The error messages that can be shared are included here.
-#. * Excluded are errors that are only used once and debugging messages.
-#.
-#: ../globals.h:996
msgid "E470: Command aborted"
msgstr "E470: ะšะพะผะฐะฝะดัƒ ะฟะตั€ะตั€ะฒะฐะฝะพ"
-#: ../globals.h:997
+msgid "E905: Cannot set this option after startup"
+msgstr "E905: ะะต ะฒะดะฐะปะพัั ะฒัั‚ะฐะฝะพะฒะธั‚ะธ ั†ัŽ ะพะฟั†ั–ัŽ ะฟั–ัะปั ะทะฐะฟัƒัะบัƒ"
+
+msgid "E903: Could not spawn API job"
+msgstr "E903: ะะต ะฒะดะฐะปะพัั ะทะฐะฟัƒัั‚ะธั‚ะธ ะทะฐะดะฐั‡ัƒ"
+
msgid "E471: Argument required"
msgstr "E471: ะะตะพะฑั…ั–ะดะฝะพ ะฒะบะฐะทะฐั‚ะธ ะฐั€ะณัƒะผะตะฝั‚"
-#: ../globals.h:998
msgid "E10: \\ should be followed by /, ? or &"
msgstr "E10: ะ—ะฐ \\ ะผะฐั” ะนั‚ะธ /, ? ะฐะฑะพ &"
-# msgstr "E10: "
-#: ../globals.h:1000
msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
msgstr "E11: ะะตะฟั€ะธะฟัƒัั‚ะธะผะพ ัƒ ะฒั–ะบะฝั– ะบะพะผะฐะฝะด, <CR> ะฒะธะบะพะฝัƒั”, CTRL-C ะฒะธั…ะพะดะธั‚ัŒ"
-#: ../globals.h:1002
msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
msgstr ""
-"E12: ะšะพะผะฐะฝะดะฐ ะฝะต ะดะพะทะฒะพะปะตะฝะฐ ัƒ exrc/vimrc ัƒ ะฟะพัˆัƒะบัƒ ะฟะพั‚ะพั‡ะฝะพะณะพ ะบะฐั‚ะฐะปะพะณัƒ ั‡ะธ ั‚ะตา‘ัƒ"
+"E12: ะšะพะผะฐะฝะดะฐ ะฝะต ะดะพะทะฒะพะปะตะฝะฐ ัƒ exrc/vimrc ัƒ ะฟะพัˆัƒะบัƒ ะฟะพั‚ะพั‡ะฝะพะณะพ ะบะฐั‚ะฐะปะพะณัƒ ั‡ะธ ะผั–ั‚ะบะธ"
-#: ../globals.h:1003
msgid "E171: Missing :endif"
msgstr "E171: ะ‘ั€ะฐะบัƒั” :endif"
-#: ../globals.h:1004
msgid "E600: Missing :endtry"
msgstr "E600: ะ‘ั€ะฐะบัƒั” :endtry"
-#: ../globals.h:1005
msgid "E170: Missing :endwhile"
msgstr "E170: ะ‘ั€ะฐะบัƒั” :endwhile"
-#: ../globals.h:1006
msgid "E170: Missing :endfor"
msgstr "E170: ะ‘ั€ะฐะบัƒั” :endfor"
-#: ../globals.h:1007
msgid "E588: :endwhile without :while"
msgstr "E588: :endwhile ะฑะตะท :while"
-#: ../globals.h:1008
msgid "E588: :endfor without :for"
msgstr "E588: :endfor ะฑะตะท :for"
-#: ../globals.h:1009
msgid "E13: File exists (add ! to override)"
msgstr "E13: ะคะฐะนะป ั–ัะฝัƒั” (! ั‰ะพะฑ ะฝะต ะทะฒะฐะถะฐั‚ะธ)"
-#: ../globals.h:1010
msgid "E472: Command failed"
msgstr "E472: ะšะพะผะฐะฝะดะฐ ะฝะฐ ะฒะดะฐะปะฐััŒ"
-#: ../globals.h:1011
msgid "E473: Internal error"
msgstr "E473: ะ’ะฝัƒั‚ั€ั–ัˆะฝั ะฟะพะผะธะปะบะฐ"
-#: ../globals.h:1012
+#, c-format
+msgid "E685: Internal error: %s"
+msgstr "E685: ะ’ะฝัƒั‚ั€ั–ัˆะฝั ะฟะพะผะธะปะบะฐ: %s"
+
msgid "Interrupted"
msgstr "ะŸะตั€ะตั€ะฒะฐะฝะพ"
-#: ../globals.h:1013
msgid "E14: Invalid address"
msgstr "E14: ะะตะฟั€ะฐะฒะธะปัŒะฝะฐ ะฐะดั€ะตัะฐ"
-# msgstr "E14: "
-#: ../globals.h:1014
msgid "E474: Invalid argument"
msgstr "E474: ะะตะบะพั€ะตะบั‚ะฝะธะน ะฐั€ะณัƒะผะตะฝั‚"
-#: ../globals.h:1015
#, c-format
msgid "E475: Invalid argument: %s"
msgstr "E475: ะะตะบะพั€ะตะบั‚ะฝะธะน ะฐั€ะณัƒะผะตะฝั‚: %s"
-#: ../globals.h:1016
#, c-format
msgid "E15: Invalid expression: %s"
msgstr "E15: ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ะฒะธั€ะฐะท: %s"
-# msgstr "E15: "
-#: ../globals.h:1017
msgid "E16: Invalid range"
msgstr "E16: ะะตะฟั€ะฐะฒะธะปัŒะฝั– ะผะตะถั–"
-# msgstr "E16: "
-#: ../globals.h:1018
msgid "E476: Invalid command"
msgstr "E476: ะะตะบะพั€ะตะบั‚ะฝะฐ ะบะพะผะฐะฝะดะฐ"
-#: ../globals.h:1019
#, c-format
msgid "E17: \"%s\" is a directory"
msgstr "E17: ยซ%sยป โ€” ั†ะต ะบะฐั‚ะฐะปะพะณ"
-#: ../globals.h:1020
-#, fuzzy
-msgid "E900: Invalid job id"
-msgstr "E49: ะะตะบะพั€ะตะบั‚ะฝะธะน ั€ะพะทะผั–ั€ ะทััƒะฒัƒ"
+msgid "E900: Invalid channel id"
+msgstr "E900: ะะตะบะพั€ะตะบั‚ะฝะธะน ะบะฐะฝะฐะป"
+
+msgid "E900: Invalid channel id: not a job"
+msgstr "E900: ะะตะบะพั€ะตะบั‚ะฝะธะน ะบะฐะฝะฐะป: ะฝะต ะทะฐะฒะดะฐะฝะฝั"
-#: ../globals.h:1021
msgid "E901: Job table is full"
-msgstr ""
+msgstr "E901: ะขะฐะฑะปะธั†ั ะทะฐะฒะดะฐะฝัŒ ะทะฐะฟะพะฒะฝะตะฝะฐ"
-#: ../globals.h:1022
#, c-format
-msgid "E902: \"%s\" is not an executable"
+msgid "E903: Process failed to start: %s: \"%s\""
+msgstr "E903: ะะต ะฒะดะฐะปะพัั ะทะฐะฟัƒัั‚ะธั‚ะธ ะฟั€ะพั†ะตั: %s: \"%s\""
+
+msgid "E904: channel is not a pty"
+msgstr "E904: ะบะฐะฝะฐะป ะฝะต ะฟัะตะฒะดะพั‚ะตั€ะผั–ะฝะฐะป"
+
+#, c-format
+msgid "E905: Couldn't open stdio channel: %s"
+msgstr "E905: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ะบะฐะฝะฐะป stdio: ยซ%sยป"
+
+msgid "E906: invalid stream for channel"
+msgstr "E906: ะะตะบะพั€ะตะบั‚ะฝะธะน ะฟะพั‚ั–ะบ ะดะปั ะบะฐะฝะฐะปัƒ"
+
+msgid "E906: invalid stream for rpc channel, use 'rpc'"
+msgstr "E906: ะะตะบะพั€ะตะบั‚ะฝะธะน ะฟะพั‚ั–ะบ ะดะปั ะบะฐะฝะฐะปัƒ rpc, use 'rpc'"
+
+#, c-format
+msgid ""
+"E5210: dict key '%s' already set for buffered stream in channel %<PRIu64>"
msgstr ""
+"E5210: ะบะปัŽั‡ ัะปะพะฒะฝะธะบะฐ '%s' ะฒะถะต ะฒัั‚ะฐะฝะพะฒะปะตะฝะพ ะดะปั ะฑัƒั„ะตั€ะธะทะพะฒะฐะฝะพะณะพ ะฟะพั‚ะพะบัƒ ัƒ ะบะฐะฝะฐะปั– "
+"%<PRIu64>"
-#: ../globals.h:1024
#, c-format
msgid "E364: Library call failed for \"%s()\""
msgstr "E364: ะ‘ั–ะฑะปั–ะพั‚ะตั‡ะฝะธะน ะฒะธะบะปะธะบ ะดะพ ยซ%s()ยป ะฝะต ะฒะดะฐะฒัั"
-# msgstr "E18: "
-#: ../globals.h:1026
+#, c-format
+msgid "E739: Cannot create directory %s: %s"
+msgstr "E739: ะะต ะฒะดะฐะปะพัั ัั‚ะฒะพั€ะธั‚ะธ ะบะฐั‚ะฐะปะพะณ %s: %s"
+
msgid "E19: Mark has invalid line number"
msgstr "E19: ะฃ ะฟะพะผั–ั‚ะบะธ ะฝะตะบะพั€ะตะบั‚ะฝะธะน ะฝะพะผะตั€ ั€ัะดะบะฐ"
-# msgstr "E19: "
-#: ../globals.h:1027
msgid "E20: Mark not set"
msgstr "E20: ะŸะพะผั–ั‚ะบัƒ ะฝะต ะฒัั‚ะฐะฝะพะฒะปะตะฝะพ"
-# msgstr "E20: "
-#: ../globals.h:1029
msgid "E21: Cannot make changes, 'modifiable' is off"
msgstr "E21: ะ—ะผั–ะฝะธ ะฝะต ะดะพะทะฒะพะปะตะฝั–: ะฒะธะผะบะฝะตะฝะพ 'modifiable'"
-# msgstr "E21: "
-#: ../globals.h:1030
msgid "E22: Scripts nested too deep"
msgstr "E22: ะ—ะฐะฑะฐะณะฐั‚ะพ ะฒะบะปะฐะดะตะฝะธั… ัะบั€ะธะฟั‚ั–ะฒ"
-# msgstr "E22: "
-#: ../globals.h:1031
msgid "E23: No alternate file"
msgstr "E23: ะะตะผะฐั” ะฒั‚ะพั€ะธะฝะฝะพะณะพ ั„ะฐะนะปัƒ"
-# msgstr "E23: "
-#: ../globals.h:1032
msgid "E24: No such abbreviation"
msgstr "E24: ะขะฐะบะพะณะพ ัะบะพั€ะพั‡ะตะฝะฝั ะฝะตะผะฐั”"
-# msgstr "E24: "
-#: ../globals.h:1033
msgid "E477: No ! allowed"
msgstr "E477: ! ะฝะต ะดะพะทะฒะพะปะตะฝะพ"
-#: ../globals.h:1035
-msgid "E25: Nvim does not have a built-in GUI"
-msgstr "E25: ะะต ะผะพะถะฝะฐ ะฒะธะบะพั€ะธัั‚ะฐั‚ะธ GUI: ะะต ะฒะฒั–ะผะบะฝะตะฝะพ ะฟั–ะด ั‡ะฐั ะบะพะผะฟั–ะปัั†ั–ั—"
-
-# msgstr "E25: "
-#: ../globals.h:1036
#, c-format
msgid "E28: No such highlight group name: %s"
msgstr "E28: ะะตะผะฐั” ั‚ะฐะบะพั— ะณั€ัƒะฟะธ ะฟั–ะดัะฒั–ั‡ัƒะฒะฐะฝะฝั: %s"
-# msgstr "E28: "
-#: ../globals.h:1037
msgid "E29: No inserted text yet"
msgstr "E29: ะขะตะบัั‚ ั‰ะต ะฝะต ะฑัƒะปะพ ะดะพะดะฐะฝะพ"
-# msgstr "E29: "
-#: ../globals.h:1038
msgid "E30: No previous command line"
msgstr "E30: ะฉะต ะฝะต ะฑัƒะปะพ ะบะพะผะฐะฝะด"
-# msgstr "E30: "
-#: ../globals.h:1039
msgid "E31: No such mapping"
-msgstr "E31: ะะตะผะฐั” ั‚ะฐะบะพั— ะทะฐะผั–ะฝะธ"
+msgstr "E31: ะะตะผะฐั” ั‚ะฐะบะพั— ะทะฐะผั–ะฝะธ ะบะปะฐะฒั–ัˆ"
-# msgstr "E31: "
-#: ../globals.h:1040
msgid "E479: No match"
msgstr "E479: ะ–ะพะดะฝะพะณะพ ะทะฑั–ะณัƒ"
-#: ../globals.h:1041
#, c-format
msgid "E480: No match: %s"
msgstr "E480: ะ–ะพะดะฝะพะณะพ ะทะฑั–ะณัƒ: %s"
-#: ../globals.h:1042
msgid "E32: No file name"
msgstr "E32: ะ‘ั€ะฐะบัƒั” ะฝะฐะทะฒะธ ั„ะฐะนะปัƒ"
-# msgstr "E32: "
-#: ../globals.h:1044
msgid "E33: No previous substitute regular expression"
msgstr "E33: ะ—ะฐะผั–ะฝะฐ ะทั€ะฐะทะบั–ะฒ ั‰ะต ะฝะต ะฒะธะบะพั€ะธัั‚ะพะฒัƒะฒะฐะปะฐััŒ"
-# msgstr "E33: "
-#: ../globals.h:1045
msgid "E34: No previous command"
msgstr "E34: ะšะพะผะฐะฝะด ั‰ะต ะฝะต ะฑัƒะปะพ"
-# msgstr "E34: "
-#: ../globals.h:1046
msgid "E35: No previous regular expression"
msgstr "E35: ะ—ั€ะฐะทะบั–ะฒ ะฟะพัˆัƒะบัƒ ั‰ะต ะฝะต ะฑัƒะปะพ"
-# msgstr "E35: "
-#: ../globals.h:1047
msgid "E481: No range allowed"
msgstr "E481: ะะต ะดะพะทะฒะพะปะตะฝะพ ะฒะบะฐะทัƒะฒะฐั‚ะธ ะผะตะถั–"
-#: ../globals.h:1048
msgid "E36: Not enough room"
msgstr "E36: ะœั–ัั†ั ะฝะต ะฒะธัั‚ะฐั‡ะธั‚ัŒ"
-# msgstr "E36: "
-#: ../globals.h:1049
-#, c-format
-msgid "E482: Can't create file %s"
-msgstr "E482: ะะต ะฒะดะฐะปะพัั ัั‚ะฒะพั€ะธั‚ะธ ั„ะฐะนะป %s"
-
-#: ../globals.h:1050
msgid "E483: Can't get temp file name"
msgstr "E483: ะะต ะฒะดะฐะปะพัั ัั„ะพั€ะผัƒะฒะฐั‚ะธ ะฝะฐะทะฒัƒ ั‚ะธะผั‡ะฐัะพะฒะพะณะพ ั„ะฐะนะปัƒ"
-#: ../globals.h:1051
#, c-format
msgid "E484: Can't open file %s"
msgstr "E484: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ั„ะฐะนะป %s"
-#: ../globals.h:1052
+#, c-format
+msgid "E484: Can't open file %s: %s"
+msgstr "E484: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ั„ะฐะนะป %s: %s"
+
#, c-format
msgid "E485: Can't read file %s"
msgstr "E485: ะะต ะฒะดะฐะปะพัั ะฟั€ะพั‡ะธั‚ะฐั‚ะธ ั„ะฐะนะป %s"
-#: ../globals.h:1054
msgid "E37: No write since last change (add ! to override)"
msgstr "E37: ะ—ะผั–ะฝะธ ะฝะต ะฑัƒะปะพ ะทะฐะฟะธัะฐะฝะพ (! ั‰ะพะฑ ะฝะต ะทะฒะฐะถะฐั‚ะธ)"
-#: ../globals.h:1055
-#, fuzzy
msgid "E37: No write since last change"
-msgstr "[ะ—ะผั–ะฝะธ ะฝะต ะทะฐะฟะธัะฐะฝะพ]\n"
+msgstr "E37: ะะต ะทะฐะฟะธัะฐะฝะพ ะฟั–ัะปั ะพัั‚ะฐะฝะฝั–ั… ะทะผั–ะฝ"
-#: ../globals.h:1056
msgid "E38: Null argument"
msgstr "E38: ะ’ั–ะดััƒั‚ะฝั–ะน ะฐั€ะณัƒะผะตะฝั‚"
-#: ../globals.h:1057
msgid "E39: Number expected"
msgstr "E39: ะžั‡ั–ะบัƒั”ั‚ัŒัั ั‡ะธัะปะพ"
-#: ../globals.h:1058
#, c-format
msgid "E40: Can't open errorfile %s"
msgstr "E40: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ั„ะฐะนะป ะฟะพะผะธะปะพะบ %s"
-#: ../globals.h:1059
msgid "E41: Out of memory!"
msgstr "E41: ะ—ะฐะฑั€ะฐะบะปะพ ะฟะฐะผ'ัั‚ั–!"
-#: ../globals.h:1060
msgid "Pattern not found"
msgstr "ะ—ั€ะฐะทะพะบ ะฝะต ะทะฝะฐะนะดะตะฝะพ"
-#: ../globals.h:1061
#, c-format
msgid "E486: Pattern not found: %s"
msgstr "E486: ะ—ั€ะฐะทะพะบ ะฝะต ะทะฝะฐะนะดะตะฝะพ: %s"
-#: ../globals.h:1062
msgid "E487: Argument must be positive"
msgstr "E487: ะั€ะณัƒะผะตะฝั‚ ะผะฐั” ะฑัƒั‚ะธ ะดะพะดะฐั‚ะฝะธะน"
-#: ../globals.h:1064
msgid "E459: Cannot go back to previous directory"
msgstr "E459: ะะต ะฒะดะฐะปะพัั ะฟะตั€ะตะนั‚ะธ ะดะพ ะฟะพะฟะตั€ะตะดะฝัŒะพะณะพ ะบะฐั‚ะฐะปะพะณัƒ"
-#: ../globals.h:1066
msgid "E42: No Errors"
msgstr "E42: ะ–ะพะดะฝะพั— ะฟะพะผะธะปะบะธ"
-#: ../globals.h:1067
msgid "E776: No location list"
msgstr "E776: ะะตะผะฐั” ัะฟะธัะบัƒ ะผั–ัั†ัŒ"
-#: ../globals.h:1068
msgid "E43: Damaged match string"
msgstr "E43: ะขะตะบัั‚ ะทะฑั–ะณัƒ ะฟะพัˆะบะพะดะถะตะฝะพ"
-#: ../globals.h:1069
msgid "E44: Corrupted regexp program"
msgstr "E44: ะ—ั–ะฟัะพะฒะฐะฝะฐ ะฟั€ะพะณั€ะฐะผะฐ ั€ะตะณัƒะปัั€ะฝะธั… ะฒะธั€ะฐะทั–ะฒ"
-#: ../globals.h:1071
msgid "E45: 'readonly' option is set (add ! to override)"
msgstr "E45: ะ’ัั‚ะฐะฝะพะฒะปะตะฝะพ ะพะฟั†ั–ัŽ 'readonly' (! ั‰ะพะฑ ะฝะต ะทะฒะฐะถะฐั‚ะธ)"
-#: ../globals.h:1073
-#, c-format
-msgid "E46: Cannot change read-only variable \"%s\""
-msgstr "E46: ะ—ะผั–ะฝะฝะฐ ั‚ั–ะปัŒะบะธ ะดะปั ั‡ะธั‚ะฐะฝะฝั: ยซ%sยป"
-
-#: ../globals.h:1075
-#, c-format
-msgid "E794: Cannot set variable in the sandbox: \"%s\""
-msgstr "E794: ะะต ะผะพะถะฝะฐ ะฒัั‚ะฐะฝะพะฒะธั‚ะธ ะทะผั–ะฝะฝัƒ ัƒ ะฟั–ัะพั‡ะฝะธั†ั–: ยซ%sยป"
-
-#: ../globals.h:1076
msgid "E47: Error while reading errorfile"
msgstr "E47: ะŸะพะผะธะปะบะฐ ั‡ะธั‚ะฐะฝะฝั ั„ะฐะนะปัƒ ะฟะพะผะธะปะพะบ"
-#: ../globals.h:1078
msgid "E48: Not allowed in sandbox"
msgstr "E48: ะะฐ ะดะพะทะฒะพะปะตะฝะพ ัƒ ะฟั–ัะพั‡ะฝะธั†ั–"
-#: ../globals.h:1080
msgid "E523: Not allowed here"
msgstr "E523: ะะต ะดะพะทะฒะพะปะตะฝะพ ั‚ัƒั‚"
-#: ../globals.h:1082
msgid "E359: Screen mode setting not supported"
msgstr "E359: ะ ะตะถะธะผ ะตะบั€ะฐะฝัƒ ะฝะต ะฟั–ะดั‚ั€ะธะผัƒั”ั‚ัŒัั"
-#: ../globals.h:1083
msgid "E49: Invalid scroll size"
msgstr "E49: ะะตะบะพั€ะตะบั‚ะฝะธะน ั€ะพะทะผั–ั€ ะทััƒะฒัƒ"
-#: ../globals.h:1084
msgid "E91: 'shell' option is empty"
msgstr "E91: ะžะฟั†ั–ั 'shell' ะฟะพั€ะพะถะฝั"
-# msgstr "E254: "
-#: ../globals.h:1085
msgid "E255: Couldn't read in sign data!"
msgstr "E255: ะะต ะผะพะถะฝะฐ ะทั‡ะธั‚ะฐั‚ะธ ะดะฐะฝั– ะฝะฐะฟะธััƒ!"
-#: ../globals.h:1086
msgid "E72: Close error on swap file"
msgstr "E72: ะŸะพะผะธะปะบะฐ ะฟั–ะด ั‡ะฐั ะทะฐะบั€ะธั‚ั‚ั ั„ะฐะนะปัƒ ะพะฑะผั–ะฝัƒ"
-#: ../globals.h:1087
msgid "E73: tag stack empty"
-msgstr "E73: ะกั‚ะตะบ ั‚ะตา‘ั–ะฒ ะฟะพั€ะพะถะฝั–ะน"
+msgstr "E73: ะกั‚ะตะบ ะผั–ั‚ะพะบ ะฟะพั€ะพะถะฝั–ะน"
-#: ../globals.h:1088
msgid "E74: Command too complex"
msgstr "E74: ะ—ะฐะฝะฐะดั‚ะพ ัะบะปะฐะดะฝะฐ ะบะพะผะฐะฝะดะฐ"
-#: ../globals.h:1089
msgid "E75: Name too long"
msgstr "E75: ะ—ะฐะดะพะฒะณะต ั–ะผ'ั"
-#: ../globals.h:1090
msgid "E76: Too many ["
msgstr "E76: ะ—ะฐะฑะฐะณะฐั‚ะพ '['"
-#: ../globals.h:1091
msgid "E77: Too many file names"
msgstr "E77: ะ—ะฐะฑะฐะณะฐั‚ะพ ะฝะฐะทะฒ ั„ะฐะนะปั–ะฒ"
-#: ../globals.h:1092
msgid "E488: Trailing characters"
msgstr "E488: ะะฐะดะปะธัˆะบะพะฒั– ัะธะผะฒะพะปะธ"
-#: ../globals.h:1093
+#, c-format
+msgid "E488: Trailing characters: %s"
+msgstr "E488: ะะฐะดะปะธัˆะบะพะฒั– ัะธะผะฒะพะปะธ: %s"
+
msgid "E78: Unknown mark"
msgstr "E78: ะะตะฒั–ะดะพะผะฐ ะฟะพะผั–ั‚ะบะฐ"
-#: ../globals.h:1094
msgid "E79: Cannot expand wildcards"
msgstr "E79: ะะต ะฒะดะฐะปะพัั ั€ะพะทะบั€ะธั‚ะธ ัˆะฐะฑะปะพะฝ"
-#: ../globals.h:1096
msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
msgstr "E591: 'winheight' ะฝะต ะผะพะถะต ะฑัƒั‚ะธ ะผะตะฝัˆะธะผ ะทะฐ 'winminheight'"
-#: ../globals.h:1098
msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
msgstr "E592: 'winwidth' ะฝะต ะผะพะถะต ะฑัƒั‚ะธ ะผะตะฝัˆะธะผ ะทะฐ 'winminwidth'"
-# msgstr "E79: "
-#: ../globals.h:1099
msgid "E80: Error while writing"
msgstr "E80: ะŸะพะผะธะปะบะฐ ะฟั–ะด ั‡ะฐั ะทะฐะฟะธััƒ"
-#: ../globals.h:1100
-msgid "Zero count"
-msgstr "ะัƒะปัŒะพะฒะฐ ะบั–ะปัŒะบั–ัั‚ัŒ"
+msgid "E939: Positive count required"
+msgstr "E939: ะŸะพั‚ั€ั–ะฑะฝะฐ ะดะพะดะฐะฝะฐ ะบั–ะปัŒะบั–ัั‚ัŒ"
-#: ../globals.h:1101
msgid "E81: Using <SID> not in a script context"
msgstr "E81: <SID> ะฒะธะบะพั€ะธัั‚ะพะฒัƒั”ั‚ัŒัั ะฝะต ะฒ ะบะพะฝั‚ะตะบัั‚ั– ัะบั€ะธะฟั‚ัƒ"
-#: ../globals.h:1102
-#, c-format
-msgid "E685: Internal error: %s"
-msgstr "E685: ะ’ะฝัƒั‚ั€ั–ัˆะฝั ะฟะพะผะธะปะบะฐ: %s"
-
-#: ../globals.h:1104
msgid "E363: pattern uses more memory than 'maxmempattern'"
msgstr "E363: ะ—ั€ะฐะทะพะบ ะฒะธะบะพั€ะธัั‚ะพะฒัƒั” ะฑั–ะปัŒัˆะต, ะฝั–ะถ 'maxmempattern', ะฟะฐะผ'ัั‚ั–"
-#: ../globals.h:1105
msgid "E749: empty buffer"
msgstr "E749: ะŸะพั€ะพะถะฝั–ะน ะฑัƒั„ะตั€"
-#: ../globals.h:1108
+#, c-format
+msgid "E86: Buffer %<PRId64> does not exist"
+msgstr "E86: ะ‘ัƒั„ะตั€ะฐ %<PRId64> ะฝะตะผะฐั”"
+
msgid "E682: Invalid search pattern or delimiter"
msgstr "E682: ะะตะบะพั€ะตะบั‚ะฝะธะน ะทั€ะฐะทะพะบ ะดะปั ะฟะพัˆัƒะบัƒ ั‡ะธ ั€ะพะทะดั–ะปัŒะฝะธะบ"
-#: ../globals.h:1109
msgid "E139: File is loaded in another buffer"
msgstr "E139: ะคะฐะนะป ัƒะถะต ะทะฐะฒะฐะฝั‚ะฐะถะตะฝะพ ะฒ ั–ะฝัˆะธะน ะฑัƒั„ะตั€"
-# msgstr "E235: "
-#: ../globals.h:1110
#, c-format
msgid "E764: Option '%s' is not set"
msgstr "E764: ะžะฟั†ั–ั '%s' ะฝะต ะฒัั‚ะฐะฝะพะฒะปะตะฝะฐ"
-#: ../globals.h:1111
msgid "E850: Invalid register name"
msgstr "E850: ะะตะฟั€ะฐะฒะธะปัŒะฝะฐ ะฝะฐะทะฒะฐ ั€ะตะณั–ัั‚ั€ัƒ"
-#: ../globals.h:1114
+#, c-format
+msgid "E919: Directory not found in '%s': \"%s\""
+msgstr "E919: ะšะฐั‚ะฐะปะพะณ ะฝะต ะทะฝะฐะนะดะตะฝะพ ัƒ '%s': ยซ%sยป"
+
+msgid "E952: Autocommand caused recursive behavior"
+msgstr "E952: ะะฒั‚ะพะบะพะผะฐะฝะดะธ ะฟั€ะธะทะฒะตะปะธ ะดะพ ั€ะตะบัƒั€ัั–ั—"
+
+msgid "E519: Option not supported"
+msgstr "E519: ะžะฟั†ั–ั ะฝะต ะฟั–ะดั‚ั€ะธะผัƒั”ั‚ัŒัั"
+
+msgid "E856: Filename too long"
+msgstr "E856: ะ—ะฐะดะพะฒะณะฐ ะฝะฐะทะฒะฐ ั„ะฐะนะปัƒ"
+
+msgid "E806: using Float as a String"
+msgstr "E806: Float ะฒะถะธั‚ะพ ัะบ String"
+
+#, c-format
+msgid "E5500: autocmd has thrown an exception: %s"
+msgstr "E5500: ะฐะฒั‚ะพะบะพะผะฐะฝะดะฐ ะฒะธะบะธะฝัƒะปะฐ ะฒะธะฝัั‚ะบะพะฒัƒ ัะธั‚ัƒะฐั†ั–ัŽ: %s"
+
+msgid "E5520: <Cmd> mapping must end with <CR>"
+msgstr "E5520: ะ—ะฐะผั–ะฝะฐ ะบะปะฐะฒั–ัˆ <Cmd> ะผะฐั” ะทะฐะบั–ะฝั‡ัƒะฒะฐั‚ะธัั <CR>"
+
+msgid "E5521: <Cmd> mapping must end with <CR> before second <Cmd>"
+msgstr "E5521: ะ—ะฐะผั–ะฝะฐ ะบะปะฐะฒั–ัˆ <Cmd> ะผะฐั” ะทะฐะบั–ะฝั‡ัƒะฒะฐั‚ะธัั <CR> ะฟะตั€ะตะด ะดั€ัƒะณะพัŽ <Cmd>"
+
+#, c-format
+msgid "E5522: <Cmd> mapping must not include %s key"
+msgstr "E5522: ะ—ะฐะผั–ะฝะฐ ะบะปะฐะฒั–ัˆ <Cmd> ะฝะต ะผะพะถะต ะผั–ัั‚ะธั‚ะธ ะบะปัŽั‡ %s"
+
msgid "search hit TOP, continuing at BOTTOM"
msgstr "ะŸะพัˆัƒะบ ะดั–ะนัˆะพะฒ ะดะพ ะŸะžะงะะขะšะฃ, ะฟั€ะพะดะพะฒะถัƒั”ั‚ัŒัั ะท ะšะ†ะะฆะฏ"
-#: ../globals.h:1115
msgid "search hit BOTTOM, continuing at TOP"
msgstr "ะŸะพัˆัƒะบ ะดั–ะนัˆะพะฒ ะดะพ ะšะ†ะะฆะฏ, ะฟั€ะพะดะพะฒะถัƒั”ั‚ัŒัั ะท ะŸะžะงะะขะšะฃ"
-#: ../hardcopy.c:240
msgid "E550: Missing colon"
msgstr "E550: ะŸั€ะพะฟัƒั‰ะตะฝะพ ะดะฒะพะบั€ะฐะฟะบัƒ"
-# msgstr "E347: "
-#: ../hardcopy.c:252
msgid "E551: Illegal component"
msgstr "E551: ะะตะบะพั€ะตะบั‚ะฝะธะน ะบะพะผะฟะพะฝะตะฝั‚"
-#: ../hardcopy.c:259
msgid "E552: digit expected"
msgstr "E552: ะพั‡ั–ะบัƒั”ั‚ัŒัั ั†ะธั„ั€ะฐ"
-#: ../hardcopy.c:473
#, c-format
msgid "Page %d"
msgstr "ะกั‚ะพั€ั–ะฝะบะฐ %d"
-#: ../hardcopy.c:597
msgid "No text to be printed"
msgstr "ะั–ั‡ะพะณะพ ะดั€ัƒะบัƒะฒะฐั‚ะธ"
-#: ../hardcopy.c:668
#, c-format
-msgid "Printing page %d (%d%%)"
-msgstr "ะ”ั€ัƒะบัƒั”ั‚ัŒัั ัั‚ะพั€ั–ะฝะบะฐ %d (%d%%)"
+msgid "Printing page %d (%zu%%)"
+msgstr "ะ”ั€ัƒะบัƒั”ั‚ัŒัั ัั‚ะพั€ั–ะฝะบะฐ %d (%zu%%)"
-#: ../hardcopy.c:680
#, c-format
msgid " Copy %d of %d"
msgstr " ะšะพะฟั–ั %d ะท %d"
-#: ../hardcopy.c:733
#, c-format
msgid "Printed: %s"
msgstr "ะะฐะดั€ัƒะบะพะฒะฐะฝะพ: %s"
-#: ../hardcopy.c:740
msgid "Printing aborted"
msgstr "ะ”ั€ัƒะบ ะฟะตั€ะตั€ะฒะฐะฝะพ"
-#: ../hardcopy.c:1365
msgid "E455: Error writing to PostScript output file"
msgstr "E455: ะะต ะฒะดะฐะปะพัั ะทะฐะฟะธัะฐั‚ะธ ะฒะธั…ั–ะดะฝะธะน ั„ะฐะนะป PostScript"
-#: ../hardcopy.c:1747
#, c-format
msgid "E624: Can't open file \"%s\""
msgstr "E624: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ั„ะฐะนะป ยซ%sยป"
-#: ../hardcopy.c:1756 ../hardcopy.c:2470
#, c-format
msgid "E457: Can't read PostScript resource file \"%s\""
msgstr "E457: ะะต ะฒะดะฐะปะพัั ะฟั€ะพั‡ะธั‚ะฐั‚ะธ ั„ะฐะนะป ั€ะตััƒั€ัั–ะฒ PostScript ยซ%sยป"
-#: ../hardcopy.c:1772
#, c-format
msgid "E618: file \"%s\" is not a PostScript resource file"
msgstr "E618: ยซ%sยป ะฝะต ั” ั„ะฐะนะปะพะผ ั€ะตััƒั€ัั–ะฒ PostScript"
-#: ../hardcopy.c:1788 ../hardcopy.c:1805 ../hardcopy.c:1844
#, c-format
msgid "E619: file \"%s\" is not a supported PostScript resource file"
msgstr "E619: ยซ%sยป ะฝะต ั” ะฟั–ะดั‚ั€ะธะผัƒะฒะฐะฝะธะผ ั„ะฐะนะปะพะผ ั€ะตััƒั€ัั–ะฒ PostScript"
-#: ../hardcopy.c:1856
#, c-format
msgid "E621: \"%s\" resource file has wrong version"
msgstr "E621: ะะตะฟั€ะฐะฒะธะปัŒะฝะฐ ะฒะตั€ัั–ั ั„ะฐะนะปัƒ ั€ะตััƒั€ัั–ะฒ ยซ%sยป"
-#: ../hardcopy.c:2225
msgid "E673: Incompatible multi-byte encoding and character set."
msgstr "E673: ะะตััƒะผั–ัะฝั– ะฑะฐะณะฐั‚ะพะฑะฐะนั‚ะพะฒะต ะบะพะดัƒะฒะฐะฝะฝั ะน ะฝะฐะฑั–ั€ ัะธะผะฒะพะปั–ะฒ."
-#: ../hardcopy.c:2238
msgid "E674: printmbcharset cannot be empty with multi-byte encoding."
msgstr ""
"E674: printmbcharset ะฝะต ะผะพะถะต ะฑัƒั‚ะธ ะฟะพั€ะพะถะฝั–ะผ ะท ะฑะฐะณะฐั‚ะพะฑะฐะนั‚ะพะฒะธะผ ะบะพะดัƒะฒะฐะฝะฝัะผ."
-#: ../hardcopy.c:2254
msgid "E675: No default font specified for multi-byte printing."
msgstr "E675: ะะต ะทะฐะทะฝะฐั‡ะตะฝะพ ัˆั€ะธั„ั‚ ะดะปั ะฑะฐะณะฐั‚ะพะฑะฐะนั‚ะพะฒะพะณะพ ะดั€ัƒะบัƒ."
-#: ../hardcopy.c:2426
msgid "E324: Can't open PostScript output file"
msgstr "E324: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ั„ะฐะนะป PostScript ะดะปั ะฒะธะฒะพะดัƒ"
-#: ../hardcopy.c:2458
#, c-format
msgid "E456: Can't open file \"%s\""
msgstr "E456: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ั„ะฐะนะป ยซ%sยป"
-#: ../hardcopy.c:2583
msgid "E456: Can't find PostScript resource file \"prolog.ps\""
msgstr "E456: ะะต ะฒะดะฐะปะพัั ะทะฝะฐะนั‚ะธ ั„ะฐะนะป ั€ะตััƒั€ัั–ะฒ PostScript ยซprolog.psยป"
-#: ../hardcopy.c:2593
msgid "E456: Can't find PostScript resource file \"cidfont.ps\""
msgstr "E456: ะะต ะฒะดะฐะปะพัั ะทะฝะฐะนั‚ะธ ั„ะฐะนะป ั€ะตััƒั€ัั–ะฒ PostScript ยซcidfont.psยป"
-#: ../hardcopy.c:2622 ../hardcopy.c:2639 ../hardcopy.c:2665
#, c-format
msgid "E456: Can't find PostScript resource file \"%s.ps\""
msgstr "E456: ะะต ะฒะดะฐะปะพัั ะทะฝะฐะนั‚ะธ ั„ะฐะนะป ั€ะตััƒั€ัั–ะฒ PostScript ยซ%s.psยป"
-#: ../hardcopy.c:2654
#, c-format
msgid "E620: Unable to convert to print encoding \"%s\""
msgstr "E620: ะะต ะฒะดะฐะปะพัั ะฟะตั€ะตั‚ะฒะพั€ะธั‚ะธ ะดะพ ะบะพะดัƒะฒะฐะฝะฝั ะดั€ัƒะบัƒ ยซ%sยป"
-#: ../hardcopy.c:2877
msgid "Sending to printer..."
msgstr "ะ’ั–ะดัะธะปะฐั”ั‚ัŒัั ะฝะฐ ะฟั€ะธะฝั‚ะตั€..."
-#: ../hardcopy.c:2881
msgid "E365: Failed to print PostScript file"
msgstr "E365: ะะต ะฒะดะฐะปะพัั ะฝะฐะดั€ัƒะบัƒะฒะฐั‚ะธ ั„ะฐะนะป PostScript"
-#: ../hardcopy.c:2883
msgid "Print job sent."
msgstr "ะ—ะฐะฒะดะฐะฝะฝั ะดั€ัƒะบัƒ ะฒั–ะดั–ัะปะฐะฝะพ."
-# msgstr "E255: "
-#: ../if_cscope.c:85
+msgid "E424: Too many different highlighting attributes in use"
+msgstr "E424: ะ’ะธะบะพั€ะธัั‚ะฐะฝะพ ะทะฐะฑะฐะณะฐั‚ะพ ั€ั–ะทะฝะธั… ะฐั‚ั€ะธะฑัƒั‚ั–ะฒ ะบะพะปัŒะพั€ัƒ"
+
msgid "Add a new database"
msgstr "ะ”ะพะดะฐั‚ะธ ะฝะพะฒัƒ ะฑะฐะทัƒ ะดะฐะฝะธั…"
-#: ../if_cscope.c:87
msgid "Query for a pattern"
msgstr "ะ—ะฐะฟะธั‚ ะทะฐ ะทั€ะฐะทะบะพะผ"
-#: ../if_cscope.c:89
msgid "Show this message"
msgstr "ะŸะพะบะฐะทะฐั‚ะธ ั†ะต ะฟะพะฒั–ะดะพะผะปะตะฝะฝั"
-#: ../if_cscope.c:91
msgid "Kill a connection"
msgstr "ะ—ะฝะธั‰ะธั‚ะธ ะท'ั”ะดะฝะฐะฝะฝั"
-#: ../if_cscope.c:93
msgid "Reinit all connections"
msgstr "ะŸะตั€ะตะทะฐะฟัƒัั‚ะธั‚ะธ ัƒัั– ะท'ั”ะดะฝะฐะฝะฝั"
-#: ../if_cscope.c:95
msgid "Show connections"
msgstr "ะŸะพะบะฐะทะฐั‚ะธ ะท'ั”ะดะฝะฐะฝะฝั"
-#: ../if_cscope.c:101
#, c-format
msgid "E560: Usage: cs[cope] %s"
msgstr "E560: ะ’ะธะบะพั€ะธัั‚ะฐะฝะฝั: cs[cope] %s"
-#: ../if_cscope.c:225
msgid "This cscope command does not support splitting the window.\n"
msgstr "ะฆั ะบะพะผะฐะฝะดะฐ cscope ะฝะต ะฒะผั–ั” ะดั–ะปะธั‚ะธ ะฒั–ะบะฝะพ.\n"
-#: ../if_cscope.c:266
msgid "E562: Usage: cstag <ident>"
msgstr "E562: ะ’ะธะบะพั€ะธัั‚ะฐะฝะฝั: cstag <ั–ะดะตะฝั‚ะธั„-ะพั€>"
-#: ../if_cscope.c:313
msgid "E257: cstag: tag not found"
-msgstr "E257: cstag: ั‚ะตา‘ ะฝะต ะทะฝะฐะนะดะตะฝะพ"
+msgstr "E257: cstag: ะผั–ั‚ะบัƒ ะฝะต ะทะฝะฐะนะดะตะฝะพ"
-# msgstr "E257: "
-#: ../if_cscope.c:461
#, c-format
msgid "E563: stat(%s) error: %d"
msgstr "E563: stat(%s) ะฟะพะผะธะปะบะฐ: %d"
-#: ../if_cscope.c:551
#, c-format
msgid "E564: %s is not a directory or a valid cscope database"
msgstr "E564: %s ะฝะต ั” ะฝั– ะบะฐั‚ะฐะปะพะณะพะผ, ะฝั– ะฑะฐะทะพัŽ ะดะฐะฝะธั… cscope"
-#: ../if_cscope.c:566
#, c-format
msgid "Added cscope database %s"
msgstr "ะ”ะพะดะฐะฝะพ ะฑะฐะทัƒ ะดะฐะฝะธั… cscope %s"
-#: ../if_cscope.c:616
#, c-format
-msgid "E262: error reading cscope connection %<PRId64>"
-msgstr "E262: ะŸะพะผะธะปะบะฐ ั‡ะธั‚ะฐะฝะฝั ะทั– ะท'ั”ะดะฝะฐะฝะฝั cscope %<PRId64>"
+msgid "E262: error reading cscope connection %<PRIu64>"
+msgstr "E262: ะฟะพะผะธะปะบะฐ ั‡ะธั‚ะฐะฝะฝั ะทั– ะท'ั”ะดะฝะฐะฝะฝั cscope %<PRIu64>"
-#: ../if_cscope.c:711
msgid "E561: unknown cscope search type"
msgstr "E561: ะะตะฒั–ะดะพะผะธะน ั‚ะธะฟ ะฟะพัˆัƒะบัƒ cscope"
-#: ../if_cscope.c:752 ../if_cscope.c:789
msgid "E566: Could not create cscope pipes"
msgstr "E566: ะะต ะฒะดะฐะปะพัั ัั‚ะฒะพั€ะธั‚ะธ ะบะฐะฝะฐะปะธ ะดะพ cscope"
-#: ../if_cscope.c:767
msgid "E622: Could not fork for cscope"
msgstr "E622: ะะต ะฒะดะฐะปะพัั ั€ะพะทะดั–ะปะธั‚ะธ ะฟั€ะพั†ะตั ะดะปั cscope"
-#: ../if_cscope.c:849
msgid "cs_create_connection setpgid failed"
msgstr "cs_create_connection: ะฟะพะผะธะปะบะฐ setpgid"
-#: ../if_cscope.c:853 ../if_cscope.c:889
msgid "cs_create_connection exec failed"
msgstr "cs_create_connection: ะฟะพะผะธะปะบะฐ ะฟั–ะด ั‡ะฐั ะฒะธะบะพะฝะฐะฝะฝั"
-#: ../if_cscope.c:863 ../if_cscope.c:902
msgid "cs_create_connection: fdopen for to_fp failed"
msgstr "cs_create_connection: fdopen ะดะปั to_fp ะฝะต ะฒะดะฐะฒัั"
-#: ../if_cscope.c:865 ../if_cscope.c:906
msgid "cs_create_connection: fdopen for fr_fp failed"
msgstr "cs_create_connection: fdopen ะดะปั fr_fp ะฝะต ะฒะดะฐะฒัั"
-#: ../if_cscope.c:890
msgid "E623: Could not spawn cscope process"
msgstr "E623: ะะต ะฒะดะฐะปะพัั ัั‚ะฒะพั€ะธั‚ะธ ะฟั€ะพั†ะตั cscope"
-#: ../if_cscope.c:932
msgid "E567: no cscope connections"
msgstr "E567: ะถะพะดะฝะพะณะพ ะท'ั”ะดะฝะฐะฝะฝั ั–ะท cscope"
-#: ../if_cscope.c:1009
#, c-format
msgid "E469: invalid cscopequickfix flag %c for %c"
msgstr "E469: ะะตะบะพั€ะตะบั‚ะฝะธะน ะฟั€ะฐะฟะพั€ะตั†ัŒ cscopequickfix %c ะดะปั %c"
-# msgstr "E258: "
-#: ../if_cscope.c:1058
#, c-format
msgid "E259: no matches found for cscope query %s of %s"
msgstr "E259: ะ”ะปั ะทะฐะฟะธั‚ัƒ cscope %s ะท %s ะฝั–ั‡ะพะณะพ ะฝะต ะทะฝะฐะนะดะตะฝะพ"
-# msgstr "E259: "
-#: ../if_cscope.c:1142
msgid "cscope commands:\n"
msgstr "ะšะพะผะฐะฝะดะธ cscope:\n"
-#: ../if_cscope.c:1150
#, c-format
msgid "%-5s: %s%*s (Usage: %s)"
msgstr "%-5s: %s%*s (ะ’ะธะบะพั€ะธัั‚ะฐะฝะฝั: %s)"
-#: ../if_cscope.c:1155
msgid ""
"\n"
+" a: Find assignments to this symbol\n"
" c: Find functions calling this function\n"
" d: Find functions called by this function\n"
" e: Find this egrep pattern\n"
@@ -3301,6 +2961,8 @@ msgid ""
" t: Find this text string\n"
msgstr ""
"\n"
+" a: ะ—ะฝะฐะนั‚ะธ ะฟั€ะธัะฒะพั”ะฝะฝั ั†ัŒะพะณะพ ัะธะผะฒะพะปัƒ\n"
+" a: ะ—ะฝะฐะนั‚ะธ ะฟั€ะธัะฒะพั”ะฝะฝั ั†ัŒะพะณะพ ัะธะผะฒะพะปัƒ\n"
" c: ะ—ะฝะฐะนั‚ะธ ั„ัƒะฝะบั†ั–ั—, ั‰ะพ ะฒะธะบะปะธะบะฐัŽั‚ัŒ ั†ัŽ ั„ัƒะฝะบั†ั–ัŽ\n"
" d: ะ—ะฝะฐะนั‚ะธ ั„ัƒะฝะบั†ั–ั—, ั‰ะพ ะฒะธะบะปะธะบะฐัŽั‚ัŒัั ั†ั–ั”ัŽ ั„ัƒะฝะบั†ั–ั”ัŽ\n"
" e: ะ—ะฝะฐะนั‚ะธ ั†ะตะน ัˆะฐะฑะปะพะฝ egrep\n"
@@ -3310,32 +2972,24 @@ msgstr ""
" s: ะ—ะฝะฐะนั‚ะธ ั†ะตะน ัะธะผะฒะพะป C\n"
" t: ะ—ะฝะฐะนั‚ะธ ั†ะตะน ั‚ะตะบัั‚\n"
-#: ../if_cscope.c:1226
msgid "E568: duplicate cscope database not added"
msgstr "E568: ะŸะพะฒั‚ะพั€ะฝะฐ ะฑะฐะทะฐ ะดะฐะฝะธั… cscope ะฝะต ะดะพะดะฐะฝะฐ"
-# msgstr "E260: "
-#: ../if_cscope.c:1335
#, c-format
msgid "E261: cscope connection %s not found"
msgstr "E261: ะ—'ั”ะดะฝะฐะฝะฝั ะท cscope %s ะฝะต ะทะฝะฐะนะดะตะฝะพ"
-#: ../if_cscope.c:1364
#, c-format
msgid "cscope connection %s closed"
msgstr "ะ—'ั”ะดะฝะฐะฝะฝั ะท cscope %s ะทะฐะบั–ะฝั‡ะตะฝะพ"
-#. should not reach here
-#: ../if_cscope.c:1486
msgid "E570: fatal error in cs_manage_matches"
msgstr "E570: ะคะฐั‚ะฐะปัŒะฝะฐ ะฟะพะผะธะปะบะฐ ะฒ cs_manage_matches"
-#: ../if_cscope.c:1693
#, c-format
msgid "Cscope tag: %s"
-msgstr "ะขะตา‘ cscope: %s"
+msgstr "ะœั–ั‚ะบะฐ cscope: %s"
-#: ../if_cscope.c:1711
msgid ""
"\n"
" # line"
@@ -3343,330 +2997,285 @@ msgstr ""
"\n"
" # ั€ัะดะพะบ"
-#: ../if_cscope.c:1713
msgid "filename / context / line\n"
msgstr "ั„ะฐะนะป / ะบะพะฝั‚ะตะบัั‚ / ั€ัะดะพะบ\n"
-#: ../if_cscope.c:1809
#, c-format
msgid "E609: Cscope error: %s"
msgstr "E609: ะŸะพะผะธะปะบะฐ cscope: %s"
-#: ../if_cscope.c:2053
msgid "All cscope databases reset"
msgstr "ะฃัั– ะฑะฐะทะธ ะดะฐะฝะธั… cscope ะฟะตั€ะตะทะฐะฒะฐะฝั‚ะฐะถะตะฝะพ"
-#: ../if_cscope.c:2123
msgid "no cscope connections\n"
msgstr "ะ–ะพะดะฝะพะณะพ ะท'ั”ะดะฝะฐะฝะฝั ะท cscope\n"
-#: ../if_cscope.c:2126
msgid " # pid database name prepend path\n"
msgstr " # pid ะฝะฐะทะฒะฐ ะฑะฐะทะธ ะดะฐะฝะธั… ัˆะปัั…\n"
-#: ../main.c:144
-msgid "Unknown option argument"
-msgstr "ะะตะฒั–ะดะพะผะธะน ะฐั€ะณัƒะผะตะฝั‚ ะพะฟั†ั–ั—"
+#, c-format
+msgid "E1502: Lua failed to grow stack to %i"
+msgstr "E1502: Lua ะฝะต ะฒะดะฐะปะพัั ะทะฑั–ะปัŒัˆะธั‚ะธ ัั‚ะตะบ ะดะพ %i"
-#: ../main.c:146
-msgid "Too many edit arguments"
-msgstr "ะ—ะฐะฑะฐะณะฐั‚ะพ ะฐั€ะณัƒะผะตะฝั‚ั–ะฒ"
+msgid ""
+"E5100: Cannot convert given lua table: table should either have a sequence "
+"of positive integer keys or contain only string keys"
+msgstr ""
+"E5100: ะะต ะฒะดะฐะปะพัั ะฟะตั€ะตั‚ะฒะพั€ะธั‚ะธ ั‚ะฐะฑะปะธั†ัŽ lua: ั‚ะฐะฑะปะธั†ั ะฟะพะฒะธะฝะฝะฐ ะผะฐั‚ะธ "
+"ะฟะพัะปั–ะดะพะฒะฝั–ัั‚ัŒ ะดะพะดะฐั‚ะฝะธั… ั‡ะธัะตะป ัะบ ะบะปัŽั‡ั– ะฐะฑะพ ั‚ะตะบัั‚ะพะฒั– ะบะปัŽั‡ั–"
+
+msgid "E5101: Cannot convert given lua type"
+msgstr "E5101: ะะต ะฒะดะฐะปะพัั ะฟะตั€ะตั‚ะฒะพั€ะธั‚ะธ ั‚ะธะฟ lua"
+
+#, c-format
+msgid "E5102: Lua failed to grow stack to %i"
+msgstr "E5102: Lua ะฝะต ะฒะดะฐะปะพัั ะทะฑั–ะปัŒัˆะธั‚ะธ ัั‚ะตะบ ะดะพ %i"
+
+#, c-format
+msgid "E5106: Error while creating vim module: %.*s"
+msgstr "E5106: ะŸะพะผะธะปะบะฐ ัั‚ะฒะพั€ะตะฝะฝั ะผะพะดัƒะปั vim: %.*s"
+
+msgid "E970: Failed to initialize lua interpreter"
+msgstr "E970: ะะต ะฒะดะฐะปะพัั ั–ะฝั–ั†ั–ะฐะปั–ะทัƒะฒะฐั‚ะธ ั–ะฝั‚ะตั€ะฟั€ะตั‚ะฐั‚ะพั€ lua"
+
+#, c-format
+msgid "E5117: Error while updating package paths: %.*s"
+msgstr "E5117: ะŸะพะผะธะปะบะฐ ะพะฝะพะฒะปะตะฝะฝั ัˆะปัั…ั–ะฒ ะฟะฐะบัƒะฝะบัƒ: %.*s"
+
+#, c-format
+msgid "E5104: Error while creating lua chunk: %.*s"
+msgstr "E5104: ะŸะพะผะธะปะบะฐ ัั‚ะฒะพั€ะตะฝะฝั ัˆะผะฐั‚ะบัƒ lua: %.*s"
+
+#, c-format
+msgid "E5105: Error while calling lua chunk: %.*s"
+msgstr "E5105: ะŸะพะผะธะปะบะฐ ะฒะธะบะปะธะบัƒ ัˆะผะฐั‚ะบัƒ lua: %.*s"
+
+#, c-format
+msgid "E5114: Error while converting print argument #%i: %.*s"
+msgstr "E5114: ะะต ะฒะดะฐะปะพัั ะฟะตั€ะตั‚ะฒะพั€ะธั‚ะธ ะฐั€ะณัƒะผะตะฝั‚ #%i ะดั€ัƒะบัƒ: %.*s"
+
+#, c-format
+msgid "E5115: Error while loading debug string: %.*s"
+msgstr "E5115: ะŸะพะผะธะปะบะฐ ะทะฐะฒะฐะฝั‚ะฐะถะตะฝะฝั ะฝะฐะปะฐะณะพะดะถะตะฝะฝั: %.*s"
+
+#, c-format
+msgid "E5116: Error while calling debug string: %.*s"
+msgstr "E5116: ะŸะพะผะธะปะบะฐ ะฒะธะบะปะธะบัƒ ะฝะฐะปะฐะณะพะดะถะตะฝะฝั: %.*s"
+
+#, c-format
+msgid "E5107: Error while creating lua chunk for luaeval(): %.*s"
+msgstr "E5107: ะŸะพะผะธะปะบะฐ ัั‚ะฒะพั€ะตะฝะฝั ัˆะผะฐั‚ะบัƒ lua ะดะปั luaeval(): %.*s"
+
+#, c-format
+msgid "E5108: Error while calling lua chunk for luaeval(): %.*s"
+msgstr "E5108: ะŸะพะผะธะปะบะฐ ะฒะธะบะปะธะบัƒ ัˆะผะฐั‚ะบัƒ lua ะดะปั luaeval(): %.*s"
+
+msgid "cannot save undo information"
+msgstr "ะะต ะฒะดะฐะปะพัั ะทะฐะฟะธัะฐั‚ะธ ั–ะฝั„ะพั€ะผะฐั†ั–ัŽ ะฟะพะฒะตั€ะฝะตะฝะฝั"
+
+#, c-format
+msgid "E5109: Error while creating lua chunk: %.*s"
+msgstr "E5109: ะŸะพะผะธะปะบะฐ ัั‚ะฒะพั€ะตะฝะฝั ัˆะผะฐั‚ะบัƒ lua: %.*s"
+
+#, c-format
+msgid "E5110: Error while creating lua function: %.*s"
+msgstr "E5110: ะŸะพะผะธะปะบะฐ ัั‚ะฒะพั€ะตะฝะฝั ั„ัƒะฝะบั†ั–ั— lua: %.*s"
+
+#, c-format
+msgid "E5111: Error while calling lua function: %.*s"
+msgstr "E5111: ะŸะพะผะธะปะบะฐ ะฒะธะบะปะธะบัƒ ั„ัƒะฝะบั†ั–ั— lua: %.*s"
+
+#, c-format
+msgid "E5112: Error while creating lua chunk: %.*s"
+msgstr "E5112: ะŸะพะผะธะปะบะฐ ัั‚ะฒะพั€ะตะฝะฝั ัˆะผะฐั‚ะบัƒ lua: %.*s"
+
+#, c-format
+msgid "E5113: Error while calling lua chunk: %.*s"
+msgstr "E5113: ะŸะพะผะธะปะบะฐ ะฒะธะบะปะธะบัƒ ัˆะผะฐั‚ะบัƒ lua: %.*s"
-#: ../main.c:148
msgid "Argument missing after"
msgstr "ะŸั€ะพะฟัƒั‰ะตะฝะพ ะฐั€ะณัƒะผะตะฝั‚ ะฟั–ัะปั"
-#: ../main.c:150
msgid "Garbage after option argument"
msgstr "ะกะผั–ั‚ั‚ั ะฟั–ัะปั ะฐั€ะณัƒะผะตะฝั‚ัƒ ะพะฟั†ั–ั—"
-#: ../main.c:152
+msgid "Unknown option argument"
+msgstr "ะะตะฒั–ะดะพะผะธะน ะฐั€ะณัƒะผะตะฝั‚ ะพะฟั†ั–ั—"
+
+msgid "Too many edit arguments"
+msgstr "ะ—ะฐะฑะฐะณะฐั‚ะพ ะฐั€ะณัƒะผะตะฝั‚ั–ะฒ"
+
msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"
msgstr "ะ—ะฐะฑะฐะณะฐั‚ะพ ะฐั€ะณัƒะผะตะฝั‚ั–ะฒ ัƒ ยซ+ะบะพะผะฐะฝะดะฐยป, ยซ-c ะบะพะผะฐะฝะดะฐยป ะฐะฑะพ ยซ--cmd ะบะพะผะฐะฝะดะฐยป"
-# msgstr "E14: "
-#: ../main.c:154
-msgid "Invalid argument for"
-msgstr "ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ะฐั€ะณัƒะผะตะฝั‚ ัƒ"
-
-#: ../main.c:294
#, c-format
-msgid "%d files to edit\n"
-msgstr "%d ั„ะฐะนะปะธ(ั–ะฒ)\n"
+msgid "E5421: Failed to open stdin: %s"
+msgstr "E5421: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ stdin: %s"
-#: ../main.c:1342
-msgid "Attempt to open script file again: \""
-msgstr "ะกะฟั€ะพะฑะฐ ะฟะพะฒั‚ะพั€ะฝะพ ะฒั–ะดะบั€ะธั‚ะธ ัะบั€ะธะฟั‚: \""
+#, c-format
+msgid "Attempt to open script file again: \"%s %s\"\n"
+msgstr "ะกะฟั€ะพะฑะฐ ะฟะพะฒั‚ะพั€ะฝะพ ะฒั–ะดะบั€ะธั‚ะธ ัะบั€ะธะฟั‚ ะทะฝะพะฒัƒ: \"%s %s\"\n"
-#: ../main.c:1350
-msgid "Cannot open for reading: \""
-msgstr "ะะต ะฒะดะฐะปะพัั ะฟั€ะพั‡ะธั‚ะฐั‚ะธ: \""
+#, c-format
+msgid "Cannot open for reading: \"%s\": %s\n"
+msgstr "ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ะดะปั ั‡ะธั‚ะฐะฝะฝั: \"%s\": %s\n"
-#: ../main.c:1393
msgid "Cannot open for script output: \""
msgstr "ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ัะบ ะฒะธั…ั–ะดะฝะธะน ั„ะฐะนะป: \""
-#: ../main.c:1622
-msgid "Vim: Warning: Output is not to a terminal\n"
-msgstr "Vim: ะ—ะฐัั‚ะตั€ะตะถะตะฝะฝั: ะ’ะธะฒั–ะด ะฝะต ัƒ ั‚ะตั€ะผั–ะฝะฐะป\n"
-
-#: ../main.c:1624
-msgid "Vim: Warning: Input is not from a terminal\n"
-msgstr "Vim: ะ—ะฐัั‚ะตั€ะตะถะตะฝะฝั: ะฃะฒะตะดะตะฝะฝั ะฝะต ะท ั‚ะตั€ะผั–ะฝะฐะปัƒ\n"
-
-#. just in case..
-#: ../main.c:1891
msgid "pre-vimrc command line"
msgstr "ะบะพะผะฐะฝะดะธ ะฟะตั€ะตะด vimrc"
-#: ../main.c:1964
#, c-format
msgid "E282: Cannot read from \"%s\""
msgstr "E282: ะะต ะฒะดะฐะปะพัั ะฟั€ะพั‡ะธั‚ะฐั‚ะธ ะท ยซ%sยป"
-# msgstr "E282: "
-#: ../main.c:2149
msgid ""
"\n"
-"More info with: \"vim -h\"\n"
+"More info with \""
msgstr ""
"\n"
-"ะ”ั–ะทะฝะฐะนั‚ะตัั ะฑั–ะปัŒัˆะต: ยซvim -hยป\n"
+"ะ”ั–ะทะฝะฐะนั‚ะตัั ะฑั–ะปัŒัˆะต: \""
-#: ../main.c:2178
-msgid "[file ..] edit specified file(s)"
-msgstr "[ั„ะฐะนะป ..] ั€ะตะดะฐะณัƒะฒะฐั‚ะธ ะฒะบะฐะทะฐะฝั– ั„ะฐะนะปะธ"
+msgid "Usage:\n"
+msgstr "ะ’ะถะธั‚ะพะบ:\n"
-#: ../main.c:2179
-msgid "- read text from stdin"
-msgstr "- ั‡ะธั‚ะฐั‚ะธ ั‚ะตะบัั‚ ะท stdin"
+msgid " nvim [options] [file ...] Edit file(s)\n"
+msgstr " nvim [ะพะฟั†ั–ั—] [ั„ะฐะนะป ...] ะ ะตะดะฐะณัƒะฒะฐั‚ะธ ั„ะฐะนะปะธ\n"
-#: ../main.c:2180
-msgid "-t tag edit file where tag is defined"
-msgstr "-t ะฟะพะผั–ั‚ะบะฐ ะฟะตั€ะตะนั‚ะธ ะดะพ ั‚ะตา‘ัƒ"
+msgid " nvim [options] -t <tag> Edit file where tag is defined\n"
+msgstr " nvim [ะพะฟั†ั–ั—] -t <ะผั–ั‚ะบะฐ> ะ ะตะดะฐะณัƒะฒะฐั‚ะธ ั„ะฐะนะป, ะดะต ะฒะธะทะฝะฐั‡ะตะฝะพ ะผั–ั‚ะบัƒ\n"
-#: ../main.c:2181
-msgid "-q [errorfile] edit file with first error"
-msgstr "-q [ั„ะฐะนะป] ะฟะตั€ะตะนั‚ะธ ะดะพ ะฟะตั€ัˆะพั— ะฟะพะผะธะปะบะธ"
+msgid " nvim [options] -q [errorfile] Edit file with first error\n"
+msgstr " nvim [ะพะฟั†ั–ั—] -q [ั„.ะฟะพะผะธะปะบะธ] ะ ะตะดะฐะณัƒะฒะฐั‚ะธ ั„ะฐะนะป ะท ะฟะตั€ัˆะพัŽ ะฟะพะผะธะปะบะพัŽ\n"
-#: ../main.c:2187
msgid ""
"\n"
-"\n"
-"usage:"
+"Options:\n"
msgstr ""
"\n"
-"\n"
-"ะ’ะถะธั‚ะพะบ:"
+"ะžะฟั†ั–ั—:\n"
-#: ../main.c:2189
-msgid " vim [arguments] "
-msgstr " vim [ะฐั€ะณัƒะผะตะฝั‚ะธ] "
+msgid " -- Only file names after this\n"
+msgstr " -- ะ›ะธัˆะต ะฝะฐะทะฒะธ ั„ะฐะนะปั–ะฒ ะฟั–ัะปั ั†ัŒะพะณะพ\n"
-#: ../main.c:2193
-msgid ""
-"\n"
-" or:"
-msgstr ""
-"\n"
-" ะฐะฑะพ:"
+msgid " + Start at end of file\n"
+msgstr " + ะ ะพะทะฟะพั‡ะฐั‚ะธ ะฒ ะบั–ะฝั†ั– ั„ะฐะนะปัƒ\n"
-#: ../main.c:2196
-msgid ""
-"\n"
-"\n"
-"Arguments:\n"
+msgid " --cmd <cmd> Execute <cmd> before any config\n"
msgstr ""
-"\n"
-"\n"
-"ะั€ะณัƒะผะตะฝั‚ะธ:\n"
-
-#: ../main.c:2197
-msgid "--\t\t\tOnly file names after this"
-msgstr "--\t\t\tะ›ะธัˆะต ะฝะฐะทะฒะธ ั„ะฐะนะปั–ะฒ ะฟั–ัะปั ั†ัŒะพะณะพ"
-
-#: ../main.c:2199
-msgid "--literal\t\tDon't expand wildcards"
-msgstr "--literal\t\tะะต ั€ะพะทะบั€ะธะฒะฐั‚ะธ ัˆะฐะฑะปะพะฝะธ"
-
-#: ../main.c:2201
-msgid "-v\t\t\tVi mode (like \"vi\")"
-msgstr "-v\t\t\tะ ะตะถะธะผ Vi (ะฝั–ะฑะธ ยซviยป)"
+" --cmd <ะบะพะผะฐะฝะดะฐ> ะ’ะธะบะพะฝะฐั‚ะธ <ะบะพะผะฐะฝะดัƒ> ะฟะตั€ะตะด ะฑัƒะดัŒ-ัะบะพัŽ ะบะพะฝั„ั–ะณัƒั€ะฐั†ั–ั”ัŽ\n"
-#: ../main.c:2202
-msgid "-e\t\t\tEx mode (like \"ex\")"
-msgstr "-e\t\t\tะ ะตะถะธะผ Ex (ะฝั–ะฑะธ ยซexยป)"
-
-#: ../main.c:2203
-msgid "-E\t\t\tImproved Ex mode"
-msgstr "-E\t\t\tะŸะพะบั€ะฐั‰ะตะฝะธะน ั€ะตะถะธะผ Ex"
-
-#: ../main.c:2204
-msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")"
-msgstr "-s\t\t\tะœะพะฒั‡ะฐะทะฝะธะน (ะฟะฐะบะตั‚ะฝะธะน) ั€ะตะถะธะผ (ะปะธัˆะต ะดะปั ยซexยป)"
-
-#: ../main.c:2205
-msgid "-d\t\t\tDiff mode (like \"vimdiff\")"
-msgstr "-d\t\t\tะ ะตะถะธะผ ะฟะพั€ั–ะฒะฝัะฝะฝั (ะฝั–ะฑะธ ยซvimdiffยป)"
-
-#: ../main.c:2206
-msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
-msgstr "-y\t\t\tะŸั€ะพัั‚ะธะน ั€ะตะถะธะผ (ะฝั–ะฑะธ ยซevimยป, ะฑะตะท ั€ะตะถะธะผั–ะฒ)"
-
-#: ../main.c:2207
-msgid "-R\t\t\tReadonly mode (like \"view\")"
-msgstr "-R\t\t\tะ ะตะถะธะผ ะฟะตั€ะตะณะปัะดัƒ (ะฝั–ะฑะธ ยซviewยป)"
-
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tะžะฑะผะตะถะตะฝะธะน ั€ะตะถะธะผ (ะฝั–ะฑะธ ยซrvimยป)"
-
-#: ../main.c:2209
-msgid "-m\t\t\tModifications (writing files) not allowed"
-msgstr "-m\t\t\tะ—ะผั–ะฝะธ (ะทะฐะฟะธั ั„ะฐะนะปั–ะฒ) ะฝะต ะดะพะทะฒะพะปะตะฝะพ"
-
-#: ../main.c:2210
-msgid "-M\t\t\tModifications in text not allowed"
-msgstr "-M\t\t\tะ—ะผั–ะฝะธ ะฒ ั‚ะตะบัั‚ั– ั„ะฐะนะปั–ะฒ ะฝะต ะดะพะทะฒะพะปะตะฝะพ"
+msgid " +<cmd>, -c <cmd> Execute <cmd> after config and first file\n"
+msgstr ""
+" +<cmd>, -c <ะบะพะผะฐะฝะดะฐ> ะ’ะธะบะพะฝะฐั‚ะธ <ะบะพะผะฐะฝะดัƒ> ะฟั–ัะปั ะทะฐะฒะฐะฝั‚ะฐะถะตะฝะฝั ะฟะตั€ัˆะพะณะพ ั„ะฐะนะปัƒ\n"
-#: ../main.c:2211
-msgid "-b\t\t\tBinary mode"
-msgstr "-b\t\t\tะ”ะฒั–ะนะบะพะฒะธะน ั€ะตะถะธะผ"
+msgid " -b Binary mode\n"
+msgstr " -b ะ”ะฒั–ะนะบะพะฒะธะน ั€ะตะถะธะผ\n"
-#: ../main.c:2212
-msgid "-l\t\t\tLisp mode"
-msgstr "-l\t\t\tะ ะตะถะธะผ lisp"
+msgid " -d Diff mode\n"
+msgstr " -d ะ ะตะถะธะผ ะฟะพั€ั–ะฒะฝัะฝะฝั\n"
-#: ../main.c:2213
-msgid "-C\t\t\tCompatible with Vi: 'compatible'"
-msgstr "-C\t\t\tะกัƒะผั–ัะฝะธะน ะท Vi ั€ะตะถะธะผ: 'compatible'"
+msgid " -e, -E Ex mode\n"
+msgstr " -e, -E ะ ะตะถะธะผ Ex\n"
-#: ../main.c:2214
-msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'"
-msgstr "-N\t\t\tะะต ะทะพะฒัั–ะผ ััƒะผั–ัะฝะธะน ะท Vi ั€ะตะถะธะผ: 'nocompatible'"
+msgid " -es, -Es Silent (batch) mode\n"
+msgstr " -es, -Es ะœะพะฒั‡ะฐะทะฝะธะน (ะฟะฐะบะตั‚ะฝะธะน) ั€ะตะถะธะผ\n"
-#: ../main.c:2215
-msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]"
-msgstr "-V[N][ั„ะฐะนะป]\t\tะ‘ั–ะปัŒัˆะต ะฟะพะฒั–ะดะพะผะปะตะฝัŒ [ั€ั–ะฒะตะฝัŒ N] [ั„ะฐะนะป ะถัƒั€ะฝ. ะฟะพะฒั–ะดะพะผะปะตะฝัŒ]"
+msgid " -h, --help Print this help message\n"
+msgstr " -h, --help ะะฐะดั€ัƒะบัƒะฒะฐั‚ะธ ั†ะต ะฟะพะฒั–ะดะพะผะปะตะฝะฝั\n"
-#: ../main.c:2216
-msgid "-D\t\t\tDebugging mode"
-msgstr "-D\t\t\tะ ะตะถะธะผ ะฝะฐะปะฐะณะพะดะถะตะฝะฝั"
+msgid " -i <shada> Use this shada file\n"
+msgstr " -i <shada> ะ’ะถะธั‚ะธ ั†ะตะน ั„ะฐะนะป shada\n"
-#: ../main.c:2217
-msgid "-n\t\t\tNo swap file, use memory only"
-msgstr "-n\t\t\tะะต ะฒะธะบะพั€ะธัั‚ะพะฒัƒะฒะฐั‚ะธ ั„ะฐะนะป ะพะฑะผั–ะฝัƒ, ั‚ั€ะธะผะฐั‚ะธ ัƒัะต ะฒ ะฟะฐะผ'ัั‚ั–"
+msgid " -m Modifications (writing files) not allowed\n"
+msgstr " -m ะ—ะผั–ะฝะธ (ะทะฐะฟะธั ั„ะฐะนะปั–ะฒ) ะฝะต ะดะพะทะฒะพะปะตะฝะพ\n"
-#: ../main.c:2218
-msgid "-r\t\t\tList swap files and exit"
-msgstr "-r\t\t\tะŸะพะบะฐะทะฐั‚ะธ ั„ะฐะนะปะธ ะพะฑะผั–ะฝัƒ ั– ะฒะธะนั‚ะธ"
+msgid " -M Modifications in text not allowed\n"
+msgstr " -M ะ—ะผั–ะฝะธ ะฒ ั‚ะตะบัั‚ั– ั„ะฐะนะปั–ะฒ ะฝะต ะดะพะทะฒะพะปะตะฝะพ\n"
-#: ../main.c:2219
-msgid "-r (with file name)\tRecover crashed session"
-msgstr "-r (ะฝะฐะทะฒะฐ ั„ะฐะนะปัƒ)\tะ’ั–ะดะฝะพะฒะธั‚ะธ ะฐะฒะฐั€ั–ะนะฝะพ ะทะฐะบั–ะฝั‡ะตะฝะธะน ัะตะฐะฝั"
+msgid " -n No swap file, use memory only\n"
+msgstr ""
+" -n ะะต ะฒะธะบะพั€ะธัั‚ะพะฒัƒะฒะฐั‚ะธ ั„ะฐะนะป ะพะฑะผั–ะฝัƒ, ั‚ั€ะธะผะฐั‚ะธ ัƒัะต ะฒ "
+"ะฟะฐะผ'ัั‚ั–\n"
-#: ../main.c:2220
-msgid "-L\t\t\tSame as -r"
-msgstr "-L\t\t\tะขะต ัะฐะผะต, ั‰ะพ ะน -r"
+msgid " -o[N] Open N windows (default: one per file)\n"
+msgstr " -o[N] ะ’ั–ะดะบั€ะธั‚ะธ N ะฒั–ะบะพะฝ (ัั‚ะฐะฝะดะฐั€ั‚ะฝะพ: ะพะดะฝะต ะฝะฐ ั„ะฐะนะป)\n"
-#: ../main.c:2221
-msgid "-A\t\t\tstart in Arabic mode"
-msgstr "-A\t\t\tะ—ะฐะฟัƒัั‚ะธั‚ะธ ะฒ ั€ะตะถะธะผั– ะฐั€ะฐะฑััŒะบะพั— ะผะพะฒะธ"
+msgid ""
+" -O[N] Open N vertical windows (default: one per file)\n"
+msgstr ""
+" -o[N] ะ’ั–ะดะบั€ะธั‚ะธ N ะฒะตั€ั‚ะธะบะฐะปัŒะฝะธั… ะฒั–ะบะพะฝ (ัั‚ะฐะฝะดะฐั€ั‚ะฝะพ: ะพะดะฝะต ะฝะฐ "
+"ั„ะฐะนะป)\n"
-#: ../main.c:2222
-msgid "-H\t\t\tStart in Hebrew mode"
-msgstr "-H\t\t\tะ—ะฐะฟัƒัั‚ะธั‚ะธ ะฒ ั€ะตะถะธะผั– ั–ะฒั€ะธั‚ัƒ"
+msgid " -p[N] Open N tab pages (default: one per file)\n"
+msgstr ""
+" -p[N] ะ’ั–ะดะบั€ะธั‚ะธ N ะฒะบะปะฐะดะพะบ (ัั‚ะฐะฝะดะฐั€ั‚ะฝะพ: ะพะดะฝะฐ ะฝะฐ ั„ะฐะนะป)\n"
-#: ../main.c:2223
-msgid "-F\t\t\tStart in Farsi mode"
-msgstr "-F\t\t\tะ—ะฐะฟัƒัั‚ะธั‚ะธ ะฒ ั€ะตะถะธะผั– ะฟะตั€ััŒะบะพั— ะผะพะฒะธ"
+msgid " -r, -L List swap files\n"
+msgstr " -r, -L ะŸะพะบะฐะทะฐั‚ะธ ั„ะฐะนะปะธ ะพะฑะผั–ะฝัƒ\n"
-#: ../main.c:2224
-msgid "-T <terminal>\tSet terminal type to <terminal>"
-msgstr "-T <ั‚ะตั€ะผั–ะฝะฐะป>\tะ’ัั‚ะฐะฝะพะฒะธั‚ะธ ั‚ะธะฟ ั‚ะตั€ะผั–ะฝะฐะปัƒ ัƒ <ั‚ะตั€ะผั–ะฝะฐะป>"
+msgid " -r <file> Recover edit state for this file\n"
+msgstr " -r <ั„ะฐะนะป> ะ’ั–ะดะฝะพะฒะธั‚ะธ ัั‚ะฐะฝ ั€ะตะดะฐะณัƒะฒะฐะฝะฝั ะดะปั ั†ัŒะพะณะพ ั„ะฐะนะปัƒ\n"
-#: ../main.c:2225
-msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc"
-msgstr "-u <vimrc>\t\tะ’ะธะบะพั€ะธัั‚ะฐั‚ะธ ะฟะพะดะฐะฝะธะน ั„ะฐะนะป ะทะฐะผั–ัั‚ัŒ .vimrc"
+msgid " -R Read-only mode\n"
+msgstr " -R ะ ะตะถะธะผ ั‚ั–ะปัŒะบะธ ะดะปั ั‡ะธั‚ะฐะฝะฝั\n"
-#: ../main.c:2226
-msgid "--noplugin\t\tDon't load plugin scripts"
-msgstr "--noplugin\t\tะะต ะฒะฐะฝั‚ะฐะถะธั‚ะธ ัะบั€ะธะฟั‚ะธ ะดะพะฟะพะฒะฝะตะฝะฝั"
+msgid " -S <session> Source <session> after loading the first file\n"
+msgstr ""
+" -S <ัะตะฐะฝั> ะ’ะธะบะพะฝะฐั‚ะธ <ัะตะฐะฝั> ะฟั–ัะปั ะฟะตั€ัˆะพะณะพ ะทะฐะฒะฐะฝั‚ะฐะถะตะฝะพะณะพ ั„ะฐะนะปัƒ\n"
-#: ../main.c:2227
-msgid "-p[N]\t\tOpen N tab pages (default: one for each file)"
-msgstr "-p[N]\t\tะ’ั–ะดะบั€ะธั‚ะธ N ะฒะบะปะฐะดะพะบ (ะฐะฑะพ ะฟะพ ะพะดะฝั–ะน ะดะปั ะบะพะถะฝะพะณะพ ั„ะฐะนะปัƒ)"
+msgid " -s <scriptin> Read Normal mode commands from <scriptin>\n"
+msgstr ""
+" -s <ัะบั€ะธะฟั‚> ะ—ั‡ะธั‚ะฐั‚ะธ ะบะพะผะฐะฝะดะธ ะฝะพั€ะผะฐะปัŒะฝะพะณะพ ั€ะตะถะธะผัƒ ะท ั„ะฐะนะปัƒ <ัะบั€ะธะฟั‚>\n"
-#: ../main.c:2228
-msgid "-o[N]\t\tOpen N windows (default: one for each file)"
-msgstr "-o[N]\t\tะ’ั–ะดะบั€ะธั‚ะธ N ะฒั–ะบะพะฝ (ะฐะฑะพ ะฟะพ ะพะดะฝะพะผัƒ ะดะปั ะบะพะถะฝะพะณะพ ั„ะฐะนะปัƒ)"
+msgid " -u <config> Use this config file\n"
+msgstr " -u <config> ะ’ะถะธั‚ะธ ั†ะตะน ั„ะฐะนะป ะบะพะฝั„ั–ะณัƒั€ะฐั†ั–ั—\n"
-#: ../main.c:2229
-msgid "-O[N]\t\tLike -o but split vertically"
-msgstr "-O[N]\t\tะั–ะฑะธ -o, ะฐะปะต ะฟะพะดั–ะปะธั‚ะธ ะฒั–ะบะฝะฐ ะฒะตั€ั‚ะธะบะฐะปัŒะฝะพ"
+msgid " -v, --version Print version information\n"
+msgstr " -v, --version ะะฐะดั€ัƒะบัƒะฒะฐั‚ะธ ั–ะฝั„ะพั€ะผะฐั†ั–ัŽ ะฟั€ะพ ะฒะตั€ัั–ัŽ ะฟั€ะพะณั€ะฐะผะธ\n"
-#: ../main.c:2230
-msgid "+\t\t\tStart at end of file"
-msgstr "+\t\t\tะ ะพะทะฟะพั‡ะฐั‚ะธ ะฒ ะบั–ะฝั†ั– ั„ะฐะนะปัƒ"
+msgid " -V[N][file] Verbose [level][file]\n"
+msgstr " -V[N][ั„ะฐะนะป] ะ‘ั–ะปัŒัˆะต ะฟะพะฒั–ะดะพะผะปะตะฝัŒ [ั€ั–ะฒะตะฝัŒ][ั„ะฐะนะป]\n"
-#: ../main.c:2231
-msgid "+<lnum>\t\tStart at line <lnum>"
-msgstr "+<ั€ัะดะพะบ>\t\tะ ะพะทะฟะพั‡ะฐั‚ะธ ัƒ ะฒะบะฐะทะฐะฝะพะผัƒ <ั€ัะดะบัƒ>"
+msgid " -Z Restricted mode\n"
+msgstr " -Z ะžะฑะผะตะถะตะฝะธะน ั€ะตะถะธะผ\n"
-#: ../main.c:2232
-msgid "--cmd <command>\tExecute <command> before loading any vimrc file"
-msgstr "--cmd <ะบะพะผะฐะฝะดะฐ>\tะ’ะธะบะพะฝะฐั‚ะธ <ะบะพะผะฐะฝะดัƒ> ะฟะตั€ะตะด ะทะฐะฒะฐะฝั‚ะฐะถะตะฝะฝัะผ vimrc"
+msgid " --api-info Write msgpack-encoded API metadata to stdout\n"
+msgstr ""
+" --api-info ะ—ะฐะฟะธัะฐั‚ะธ ะผะตั‚ะฐะดะฐะฝั– API, ัะตั€ั–ะฐะปั–ะทะพะฒะฐะฝั– ัƒ msgpack, ัƒ "
+"stdout\n"
-#: ../main.c:2233
-msgid "-c <command>\t\tExecute <command> after loading the first file"
-msgstr "-c <ะบะพะผะฐะฝะดะฐ>\t\tะ’ะธะบะพะฝะฐั‚ะธ <ะบะพะผะฐะฝะดัƒ> ะฟั–ัะปั ะทะฐะฒะฐะฝั‚ะฐะถะตะฝะฝั ะฟะตั€ัˆะพะณะพ ั„ะฐะนะปัƒ"
+msgid " --embed Use stdin/stdout as a msgpack-rpc channel\n"
+msgstr ""
+" --embed ะ’ะธะบะพั€ะธัั‚ะฐั‚ะธ stdin/stdout, ัะบ ะบะฐะฝะฐะป msgpack-rpc\n"
-#: ../main.c:2235
-msgid "-S <session>\t\tSource file <session> after loading the first file"
-msgstr "-S <ัะตะฐะฝั>\t\tะ’ะธะบะพะฝะฐั‚ะธ ะฟะพะดะฐะฝะธะน ั„ะฐะนะป ะฟั–ัะปั ะฟะตั€ัˆะพะณะพ ะทะฐะฒะฐะฝั‚ะฐะถะตะฝะพะณะพ ั„ะฐะนะปัƒ"
+msgid " --headless Don't start a user interface\n"
+msgstr " --headless ะะต ะทะฐะฟัƒัะบะฐั‚ะธ ั–ะฝั‚ะตั€ั„ะตะนั ะบะพั€ะธัั‚ัƒะฒะฐั‡ะฐ\n"
-#: ../main.c:2236
-msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>"
-msgstr "-s <ัะบั€ะธะฟั‚>\t\tะ—ั‡ะธั‚ะฐั‚ะธ ะบะพะผะฐะฝะดะธ ะฝะพั€ะผะฐะปัŒะฝะพะณะพ ั€ะตะถะธะผัƒ ะท ั„ะฐะนะปัƒ <ัะบั€ะธะฟั‚>"
+msgid " --listen <address> Serve RPC API from this address\n"
+msgstr " --listen <ะฐะดั€ะตัะฐ> ะžะฑัะปัƒะณะพะฒัƒะฒะฐั‚ะธ RPC API ะทะฐ ั†ั–ั”ัŽ ะฐะดั€ะตัะพัŽ\n"
-#: ../main.c:2237
-msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>"
-msgstr "-w <ัะบั€ะธะฟั‚>\t\tะ”ะพะฟะธัะฐั‚ะธ ัƒัั– ะฝะฐะฑั€ะฐะฝั– ะบะพะผะฐะฝะดะธ ะดะพ ั„ะฐะนะปัƒ <ัะบั€ะธะฟั‚>"
+msgid " --noplugin Don't load plugins\n"
+msgstr " --noplugin ะะต ะทะฐะฒะฐะฝั‚ะฐะถัƒะฒะฐั‚ะธ ะดะพะฟะพะฒะฝะตะฝะฝั\n"
-#: ../main.c:2238
-msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>"
-msgstr "-w <ัะบั€ะธะฟั‚>\t\tะ—ะฐะฟะธัะฐั‚ะธ ัƒัั– ะฝะฐะฑั€ะฐะฝั– ะบะพะผะฐะฝะดะธ ัƒ ั„ะฐะนะป <ัะบั€ะธะฟั‚>"
+msgid " --startuptime <file> Write startup timing messages to <file>\n"
+msgstr " --startuptime <ั„ะฐะนะป> ะ—ะฐะฟะธัะฐั‚ะธ ะฟั€ะพั„ั–ะปัŒ ะทะฐะฟัƒัะบัƒ ะดะพ <ั„ะฐะนะปัƒ>\n"
-#: ../main.c:2240
-msgid "--startuptime <file>\tWrite startup timing messages to <file>"
+msgid ""
+"\n"
+"See \":help startup-options\" for all options.\n"
msgstr ""
-"--startuptime <ั„ะฐะนะป>\tะ—ะฐะฟะธัะฐั‚ะธ ะทะฐะฟัƒัะบะฝั– ะฟะพะฒั–ะดะพะผะปะตะฝะฝั ะท ั‡ะฐัะพะฒะธะผะธ ะฒั–ะดะผั–ั‚ะบะฐะผะธ "
-"ะดะพ <ั„ะฐะนะปัƒ>"
-
-#: ../main.c:2242
-msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
-msgstr "-i <viminfo>\t\tะ’ะธะบะพั€ะธัั‚ะฐั‚ะธ <viminfo> ะทะฐะผั–ัั‚ัŒ .viminfo"
-
-#: ../main.c:2243
-msgid "-h or --help\tPrint Help (this message) and exit"
-msgstr "-h ั‡ะธ --help\tะะฐะดั€ัƒะบัƒะฒะฐั‚ะธ ั†ะต ะฟะพะฒั–ะดะพะผะปะตะฝะฝั ั– ะฒะธะนั‚ะธ"
-
-#: ../main.c:2244
-msgid "--version\t\tPrint version information and exit"
-msgstr "--version\t\tะะฐะดั€ัƒะบัƒะฒะฐั‚ะธ ั–ะฝั„ะพั€ะผะฐั†ั–ัŽ ะฟั€ะพ ะฒะตั€ัั–ัŽ ะฟั€ะพะณั€ะฐะผะธ ั– ะฒะธะนั‚ะธ"
+"\n"
+"ะ”ะธะฒ \":help startup-options\" ั‰ะพะฑ ะฟะพะฑะฐั‡ะธั‚ะธ ะฒัั– ะพะฟั†ั–ั—.\n"
-#: ../mark.c:676
msgid "No marks set"
msgstr "ะะต ะฒัั‚ะฐะฝะพะฒะปะตะฝะพ ะถะพะดะฝะพั— ะฟะพะผั–ั‚ะบะธ"
-#: ../mark.c:678
#, c-format
msgid "E283: No marks matching \"%s\""
msgstr "E283: ะŸะพะผั–ั‚ะบัƒ ยซ%sยป ะฝะต ะทะฝะฐะนะดะตะฝะพ"
-# msgstr "E283: "
-#. Highlight title
-#: ../mark.c:687
msgid ""
"\n"
"mark line col file/text"
@@ -3674,8 +3283,6 @@ msgstr ""
"\n"
"ะฟะพะผ. ั€ัะด. ะบะพะป. ั„ะฐะนะป/ั‚ะตะบัั‚"
-#. Highlight title
-#: ../mark.c:789
msgid ""
"\n"
" jump line col file/text"
@@ -3683,9 +3290,6 @@ msgstr ""
"\n"
" ั‚ะพั‡ะบะฐ ั€ัะด. ัั‚ะพะฒะฟ. ั„ะฐะนะป/ั‚ะตะบัั‚"
-# msgstr "E283: "
-#. Highlight title
-#: ../mark.c:831
msgid ""
"\n"
"change line col text"
@@ -3693,117 +3297,60 @@ msgstr ""
"\n"
"ะทะผั–ะฝะธั‚ะธ ั€ัะด. ัั‚ะพะฒะฟ. ั‚ะตะบัั‚"
-# TODO
-#: ../mark.c:1238
-msgid ""
-"\n"
-"# File marks:\n"
-msgstr ""
-"\n"
-"# ะŸะพะผั–ั‚ะบะธ:\n"
-
-#. Write the jumplist with -'
-#: ../mark.c:1271
-msgid ""
-"\n"
-"# Jumplist (newest first):\n"
-msgstr ""
-"\n"
-"# ะกะฟะธัะพะบ ะฟะตั€ะตั…ะพะดั–ะฒ (ะฒั–ะด ะฝะฐะนะฝะพะฒั–ัˆะธั…):\n"
-
-# TODO
-#: ../mark.c:1352
-msgid ""
-"\n"
-"# History of marks within files (newest to oldest):\n"
-msgstr ""
-"\n"
-"# ะŸะพะฟะตั€ะตะดะฝั– ะฟะพะผั–ั‚ะบะธ ะฒ ั„ะฐะนะปะฐั… (ะฒั–ะด ะฝะฐะนะฝะพะฒั–ัˆะธั…):\n"
-
-#: ../mark.c:1431
-msgid "Missing '>'"
-msgstr "ะŸั€ะพะฟัƒั‰ะตะฝะพ '>'"
-
-# msgstr "E292: "
-#: ../memfile.c:426
msgid "E293: block was not locked"
msgstr "E293: ะ‘ะปะพะบ ะฝะต ะฑัƒะปะพ ะทะฐั„ั–ะบัะพะฒะฐะฝะพ"
-# msgstr "E293: "
-#: ../memfile.c:799
msgid "E294: Seek error in swap file read"
msgstr "E294: ะŸะพะผะธะปะบะฐ ะทะผั–ะฝะธ ะฟะพะทะธั†ั–ั— ัƒ ั„ะฐะนะปั– ะพะฑะผั–ะฝัƒ"
-#: ../memfile.c:803
msgid "E295: Read error in swap file"
msgstr "E295: ะŸะพะผะธะปะบะฐ ะทั‡ะธั‚ัƒะฒะฐะฝะฝั ั„ะฐะนะปัƒ ะพะฑะผั–ะฝัƒ"
-#: ../memfile.c:849
msgid "E296: Seek error in swap file write"
msgstr "E296: ะŸะพะผะธะปะบะฐ ะทะผั–ะฝะธ ะฟะพะทะธั†ั–ั— ะฟั–ะด ั‡ะฐั ะทะฐะฟะธััƒ ัƒ ั„ะฐะนะป ะพะฑะผั–ะฝัƒ"
-#: ../memfile.c:865
msgid "E297: Write error in swap file"
msgstr "E297: ะŸะพะผะธะปะบะฐ ะทะฐะฟะธััƒ ั„ะฐะนะปัƒ ะพะฑะผั–ะฝัƒ"
-#: ../memfile.c:1036
msgid "E300: Swap file already exists (symlink attack?)"
msgstr "E300: ะคะฐะนะป ะพะฑะผั–ะฝัƒ ะฒะถะต ั–ัะฝัƒั” (ะฐั‚ะฐะบะฐ ัะธะผะฒะพะปัŒะฝะธะผ ะฟะพัะธะปะฐะฝะฝัะผ?)"
-#: ../memline.c:318
msgid "E298: Didn't get block nr 0?"
msgstr "E298: ะะตะผะฐั” ะฑะปะพะบัƒ 0?"
-#: ../memline.c:361
msgid "E298: Didn't get block nr 1?"
msgstr "E298: ะะตะผะฐั” ะฑะปะพะบัƒ 1?"
-# msgstr "E298: "
-#: ../memline.c:377
msgid "E298: Didn't get block nr 2?"
msgstr "E298: ะะตะผะฐั” ะฑะปะพะบัƒ 2?"
-#. could not (re)open the swap file, what can we do????
-#: ../memline.c:465
msgid "E301: Oops, lost the swap file!!!"
msgstr "E301: ะžะน, ะฒั‚ั€ะฐั‡ะตะฝะพ ั„ะฐะนะป ะพะฑะผั–ะฝัƒ!!!"
-# msgstr "E301: "
-#: ../memline.c:477
msgid "E302: Could not rename swap file"
msgstr "E302: ะะต ะฒะดะฐะปะพัั ะฟะตั€ะตะนะผะตะฝัƒะฒะฐั‚ะธ ั„ะฐะนะปัƒ ะพะฑะผั–ะฝัƒ"
-# msgstr "E302: "
-#: ../memline.c:554
#, c-format
msgid "E303: Unable to open swap file for \"%s\", recovery impossible"
msgstr "E303: ะะต ะฒะดะฐะปะพัั ะฟั€ะพั‡ะธั‚ะฐั‚ะธ ั„ะฐะนะป ะพะฑะผั–ะฝัƒ ะดะปั ยซ%sยป, ะฒั–ะดะฝะพะฒะปะตะฝะฝั ะฝะตะผะพะถะปะธะฒะต"
-#: ../memline.c:666
msgid "E304: ml_upd_block0(): Didn't get block 0??"
msgstr "E304: ml_upd_block0(): ะะตะผะฐั” ะฑะปะพะบัƒ 0??"
-#. no swap files found
-#: ../memline.c:830
#, c-format
msgid "E305: No swap file found for %s"
msgstr "E305: ะะต ะทะฝะฐะนะดะตะฝะพ ั„ะฐะนะปัƒ ะพะฑะผั–ะฝัƒ ะดะปั %s"
-# msgstr "E305: "
-#: ../memline.c:839
msgid "Enter number of swap file to use (0 to quit): "
msgstr "ะ’ะฒะตะดั–ั‚ัŒ ะฝะพะผะตั€ ั„ะฐะนะปัƒ ะพะฑะผั–ะฝัƒ, ะบะพั‚ั€ะธะน ะฒะธะบะพั€ะธัั‚ะฐั‚ะธ, (0 ะดะปั ะฒะธั…ะพะดัƒ):"
-#: ../memline.c:879
#, c-format
msgid "E306: Cannot open %s"
msgstr "E306: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ %s"
-#: ../memline.c:897
msgid "Unable to read block 0 from "
msgstr "ะะต ะฒะดะฐะปะพัั ะฟั€ะพั‡ะธั‚ะฐั‚ะธ ะฑะปะพะบ 0 ะท "
-#: ../memline.c:900
msgid ""
"\n"
"Maybe no changes were made or Vim did not update the swap file."
@@ -3811,28 +3358,22 @@ msgstr ""
"\n"
"ะะฐะฟะตะฒะฝะพ, ะทะผั–ะฝ ะฝะต ะฑัƒะปะพ, ะฐะฑะพ Vim ะฝะต ะฟะพะฝะพะฒะธะฒ ั„ะฐะนะป ะพะฑะผั–ะฝัƒ."
-#: ../memline.c:909
msgid " cannot be used with this version of Vim.\n"
msgstr " ะฝะต ะผะพะถะฝะฐ ะฒะธะบะพั€ะธัั‚ะฐั‚ะธ ะท ั†ั–ั”ัŽ ะฒะตั€ัั–ั”ัŽ Vim.\n"
-#: ../memline.c:911
msgid "Use Vim version 3.0.\n"
msgstr "ะ—ะฝะฐะนะดั–ั‚ัŒ Vim 3.0\n"
-#: ../memline.c:916
#, c-format
msgid "E307: %s does not look like a Vim swap file"
msgstr "E307: %s ะฝะต ัั…ะพะถะต ะฝะฐ ั„ะฐะนะป ะพะฑะผั–ะฝัƒ Vim"
-#: ../memline.c:922
msgid " cannot be used on this computer.\n"
msgstr " ะฝะต ะผะพะถะฝะฐ ะฒะธะบะพั€ะธัั‚ะฐั‚ะธ ะฝะฐ ั†ัŒะพะผัƒ ะบะพะผะฟ'ัŽั‚ะตั€ั–.\n"
-#: ../memline.c:924
msgid "The file was created on "
msgstr "ะคะฐะนะป ะฑัƒะปะพ ัั‚ะฒะพั€ะตะฝะพ ะฝะฐ "
-#: ../memline.c:928
msgid ""
",\n"
"or the file has been damaged."
@@ -3840,89 +3381,67 @@ msgstr ""
",\n"
"ะฐะฑะพ ั„ะฐะนะป ะฑัƒะปะพ ะฟะพัˆะบะพะดะถะตะฝะพ."
-#: ../memline.c:945
msgid " has been damaged (page size is smaller than minimum value).\n"
msgstr " ะฟะพัˆะบะพะดะถะตะฝะธะน (ั€ะพะทะผั–ั€ ัั‚ะพั€ั–ะฝะบะธ ะผะตะฝัˆะธะน ะผั–ะฝั–ะผะฐะปัŒะฝะพะณะพ ะทะฝะฐั‡ะตะฝะฝั).\n"
-#: ../memline.c:974
#, c-format
msgid "Using swap file \"%s\""
msgstr "ะ’ะธะบะพั€ะธัั‚ะพะฒัƒั”ั‚ัŒัั ั„ะฐะนะป ะพะฑะผั–ะฝัƒ ยซ%sยป"
-#: ../memline.c:980
#, c-format
msgid "Original file \"%s\""
msgstr "ะŸะพั‡ะฐั‚ะบะพะฒะธะน ั„ะฐะนะป ยซ%sยป"
-#: ../memline.c:995
msgid "E308: Warning: Original file may have been changed"
msgstr "E308: ะ—ะฐัั‚ะตั€ะตะถะตะฝะฝั: ะœะพะถะปะธะฒะพ, ะฟะพั‡ะฐั‚ะบะพะฒะธะน ั„ะฐะนะป ะฑัƒะปะพ ะทะผั–ะฝะตะฝะพ"
-# msgstr "E308: "
-#: ../memline.c:1061
#, c-format
msgid "E309: Unable to read block 1 from %s"
msgstr "E309: ะะต ะฒะดะฐะปะพัั ะฟั€ะพั‡ะธั‚ะฐั‚ะธ ะฑะปะพะบ 1 ะท %s"
-# msgstr "E309: "
-#: ../memline.c:1065
msgid "???MANY LINES MISSING"
msgstr "??? ะ‘ะ ะะšะฃะ„ ะ‘ะะ“ะะขะฌะžะฅ ะ ะฏะ”ะšะ†ะ’"
-#: ../memline.c:1076
msgid "???LINE COUNT WRONG"
msgstr "??? ะะ•ะŸะ ะะ’ะ˜ะ›ะฌะะ ะšะ†ะ›ะฌะšะ†ะกะขะฌ ะ ะฏะ”ะšะ†ะ’"
-#: ../memline.c:1082
msgid "???EMPTY BLOCK"
msgstr "??? ะŸะžะ ะžะ–ะะ†ะ™ ะ‘ะ›ะžะš"
-#: ../memline.c:1103
msgid "???LINES MISSING"
msgstr "??? ะŸะ ะžะŸะฃะฉะ•ะะ† ะ ะฏะ”ะšะ˜"
-#: ../memline.c:1128
#, c-format
msgid "E310: Block 1 ID wrong (%s not a .swp file?)"
msgstr "E310: ะ†ะดะตะฝั‚ะธั„ั–ะบะฐั‚ะพั€ ะฑะปะพะบัƒ 1 ะฝะตะฟั€ะฐะฒะธะปัŒะฝะธะน (%s ะฝะต ั” ั„ะฐะนะปะพะผ ะพะฑะผั–ะฝัƒ?)"
-# msgstr "E310: "
-#: ../memline.c:1133
msgid "???BLOCK MISSING"
msgstr "??? ะŸะ ะžะŸะฃะฉะ•ะะž ะ‘ะ›ะžะš"
-#: ../memline.c:1147
msgid "??? from here until ???END lines may be messed up"
msgstr "??? ะทะฒั–ะดัะธ ั– ะดะพ `??? ะšะ†ะะ•ะฆะฌ' ั€ัะดะบะธ, ะผะพะถะปะธะฒะพ, ัะฟะปัƒั‚ะฐะฝั–"
-#: ../memline.c:1164
msgid "??? from here until ???END lines may have been inserted/deleted"
msgstr "??? ะทะฒั–ะดัะธ ั– ะดะพ `??? ะšะ†ะะ•ะฆะฌ' ั€ัะดะบะธ, ะผะพะถะปะธะฒะพ, ะฑัƒะปะธ ะดะพะดะฐะฝั–/ะทะฝะธั‰ะตะฝั–"
-#: ../memline.c:1181
msgid "???END"
msgstr "??? ะšะ†ะะ•ะฆะฌ"
-#: ../memline.c:1238
msgid "E311: Recovery Interrupted"
msgstr "E311: ะ’ั–ะดะฝะพะฒะปะตะฝะฝั ะฟะตั€ะตั€ะฒะฐะฝะพ"
-#: ../memline.c:1243
msgid ""
"E312: Errors detected while recovering; look for lines starting with ???"
msgstr ""
"E312: ะŸั–ะด ั‡ะฐั ะฒั–ะดะฝะพะฒะปะตะฝะฝั ะทะฝะฐะนะดะตะฝะพ ะฟะพะผะธะปะบะธ. ะŸะตั€ะตะณะปัะฝัŒั‚ะต ั€ัะดะบะธ, ั‰ะพ "
"ะฟะพั‡ะธะฝะฐัŽั‚ัŒัั ะท ???"
-#: ../memline.c:1245
msgid "See \":help E312\" for more information."
msgstr "ะ”ะธะฒ. ยซ:help E312ยป ะดะปั ัƒั‚ะพั‡ะฝะตะฝะฝั."
-#: ../memline.c:1249
msgid "Recovery completed. You should check if everything is OK."
msgstr "ะ’ั–ะดะฝะพะฒะปะตะฝะฝั ะทะฐะบั–ะฝั‡ะตะฝะพ, ะฟะตั€ะตะฒั–ั€ั‚ะต ั‡ะธ ะฒัะต ะณะฐั€ะฐะทะด."
-#: ../memline.c:1251
msgid ""
"\n"
"(You might want to write out this file under another name\n"
@@ -3930,15 +3449,12 @@ msgstr ""
"\n"
"(ะœะพะถะปะธะฒะพ, ะฟะพั‚ั€ั–ะฑะฝะพ ะทะฐะฟะธัะฐั‚ะธ ั†ะตะน ั„ะฐะนะป ะฟั–ะด ั–ะฝัˆะพัŽ ะฝะฐะทะฒะพัŽ\n"
-#: ../memline.c:1252
msgid "and run diff with the original file to check for changes)"
msgstr "ั– ะทะฐะฟัƒัั‚ะธั‚ะธ diff ะท ะพั€ะธะณั–ะฝะฐะปะพะผ ั‰ะพะฑ ะฟะตั€ะตะฒั–ั€ะธั‚ะธ ะทะผั–ะฝะธ)"
-#: ../memline.c:1254
msgid "Recovery completed. Buffer contents equals file contents."
msgstr "ะ’ั–ะดะฝะพะฒะปะตะฝะฝั ะทะฐะบั–ะฝั‡ะตะฝะพ. ะ’ะผั–ัั‚ ะฑัƒั„ะตั€ะฐ ัะฟั–ะฒะฟะฐะดะฐั” ะทั– ะฒะผั–ัั‚ะพะผ ั„ะฐะนะปัƒ."
-#: ../memline.c:1255
msgid ""
"\n"
"You may want to delete the .swp file now.\n"
@@ -3948,52 +3464,42 @@ msgstr ""
"ะœะพะถะปะธะฒะพ, ั‚ะตะฟะตั€ ะฒะธ ั…ะพั‡ะตั‚ะต ะทะฝะธั‰ะธั‚ะธ ั„ะฐะนะป ะพะฑะผั–ะฝัƒ .swp.\n"
"\n"
-#. use msg() to start the scrolling properly
-#: ../memline.c:1327
msgid "Swap files found:"
msgstr "ะ—ะฝะฐะนะดะตะฝะพ ั„ะฐะนะปะธ ะพะฑะผั–ะฝัƒ:"
-#: ../memline.c:1446
msgid " In current directory:\n"
msgstr " ะ’ ะฟะพั‚ะพั‡ะฝะพะผัƒ ะบะฐั‚ะฐะปะพะทั–:\n"
-#: ../memline.c:1448
msgid " Using specified name:\n"
msgstr " ะ’ะธะบะพั€ะธัั‚ะพะฒัƒัŽั‡ะธ ะฒะบะฐะทะฐะฝัƒ ะฝะฐะทะฒัƒ:\n"
-#: ../memline.c:1450
msgid " In directory "
msgstr " ะฃ ะบะฐั‚ะฐะปะพะทั– "
-#: ../memline.c:1465
msgid " -- none --\n"
msgstr " -- ะถะพะดะฝะพะณะพ --\n"
-#: ../memline.c:1527
msgid " owned by: "
msgstr " ะฒะปะฐัะฝะธะบ: "
-#: ../memline.c:1529
msgid " dated: "
msgstr " ะดะฐั‚ะฐ: "
-#: ../memline.c:1532 ../memline.c:3231
msgid " dated: "
msgstr " ะดะฐั‚ะฐ: "
-#: ../memline.c:1548
msgid " [from Vim version 3.0]"
msgstr " [ะฒั–ะด Vim 3.0]"
-#: ../memline.c:1550
msgid " [does not look like a Vim swap file]"
msgstr " [ะฝะต ัั…ะพะถะต ะฝะฐ ั„ะฐะนะป ะพะฑะผั–ะฝัƒ]"
-#: ../memline.c:1552
+msgid " [garbled strings (not nul terminated)]"
+msgstr " [ะฟะพัˆะบะพะดะถะตะฝะธะน ั‚ะตะบัั‚ (ะฝะต ะทะฐะบั–ะฝั‡ัƒั”ั‚ัŒัั nul)]"
+
msgid " file name: "
msgstr " ะฝะฐะทะฒะฐ ั„ะฐะนะปัƒ: "
-#: ../memline.c:1558
msgid ""
"\n"
" modified: "
@@ -4001,15 +3507,12 @@ msgstr ""
"\n"
" ะทะผั–ะฝะตะฝะพ: "
-#: ../memline.c:1559
msgid "YES"
msgstr "ะขะะš"
-#: ../memline.c:1559
msgid "no"
msgstr "ะฝั–"
-#: ../memline.c:1562
msgid ""
"\n"
" user name: "
@@ -4017,11 +3520,9 @@ msgstr ""
"\n"
" ะบะพั€ะธัั‚ัƒะฒะฐั‡: "
-#: ../memline.c:1568
msgid " host name: "
msgstr " ะฝะฐะทะฒะฐ ะฒัƒะทะปะฐ: "
-#: ../memline.c:1570
msgid ""
"\n"
" host name: "
@@ -4029,7 +3530,6 @@ msgstr ""
"\n"
" ะฝะฐะทะฒะฐ ะฒัƒะทะปะฐ: "
-#: ../memline.c:1575
msgid ""
"\n"
" process ID: "
@@ -4037,11 +3537,9 @@ msgstr ""
"\n"
" ID ะฟั€ะพั†ะตััƒ: "
-#: ../memline.c:1579
-msgid " (still running)"
-msgstr " (ะฒะธะบะพะฝัƒั”ั‚ัŒัั)"
+msgid " (STILL RUNNING)"
+msgstr " (ะฉะ• ะ’ะ˜ะšะžะะฃะ„ะขะฌะกะฏ)"
-#: ../memline.c:1586
msgid ""
"\n"
" [not usable on this computer]"
@@ -4049,106 +3547,75 @@ msgstr ""
"\n"
" [ะฝะตะฟั€ะธะดะฐั‚ะฝะธะน ะฝะฐ ั†ัŒะพะผัƒ ะบะพะผะฟ'ัŽั‚ะตั€ั–]"
-#: ../memline.c:1590
msgid " [cannot be read]"
msgstr " [ะฝะต ะผะพะถะฝะฐ ะฟั€ะพั‡ะธั‚ะฐั‚ะธ]"
-#: ../memline.c:1593
msgid " [cannot be opened]"
msgstr " [ะฝะต ะผะพะถะฝะฐ ะฒั–ะดะบั€ะธั‚ะธ]"
-#: ../memline.c:1698
msgid "E313: Cannot preserve, there is no swap file"
msgstr "E313: ะะต ะฒะดะฐะปะพัั ะทะฐะณะพั‚ะพะฒะธั‚ะธ, ะฝะตะผะฐั” ั„ะฐะนะปัƒ ะพะฑะผั–ะฝัƒ"
-# msgstr "E313: "
-#: ../memline.c:1747
msgid "File preserved"
msgstr "ะคะฐะนะป ะทะฑะตั€ะตะถะตะฝะพ"
-#: ../memline.c:1749
msgid "E314: Preserve failed"
msgstr "E314: ะ—ะฑะตั€ะตะถะตะฝะฝั ะฝะต ะฒะดะฐะปะพัั"
-# msgstr "E314: "
-#: ../memline.c:1819
#, c-format
msgid "E315: ml_get: invalid lnum: %<PRId64>"
msgstr "E315: ml_get: ะฝะตะฟั€ะฐะฒะธะปัŒะฝะธะน lnum: %<PRId64>"
-# msgstr "E315: "
-#: ../memline.c:1851
#, c-format
msgid "E316: ml_get: cannot find line %<PRId64>"
msgstr "E316: ml_get: ะฝะต ะทะฝะฐะนัˆะพะฒ ั€ัะดะพะบ %<PRId64>"
-# msgstr "E316: "
-#: ../memline.c:2236
msgid "E317: pointer block id wrong 3"
msgstr "E317: ะ’ะบะฐะทั–ะฒะฝะธะบ ะฑะปะพะบัƒ ะฟะพะผะธะปะบะพะฒะธะน 3"
-# msgstr "E317: "
-#: ../memline.c:2311
msgid "stack_idx should be 0"
msgstr "stack_idx ะผะฐั” ะฑัƒั‚ะธ ั€ั–ะฒะฝะธะผ 0"
-#: ../memline.c:2369
msgid "E318: Updated too many blocks?"
msgstr "E318: ะŸะพะฝะพะฒะปะตะฝะพ ะทะฐะฑะฐะณะฐั‚ะพ ะฑะปะพะบั–ะฒ?"
-#: ../memline.c:2511
msgid "E317: pointer block id wrong 4"
msgstr "E317: ะ’ะบะฐะทั–ะฒะฝะธะบ ะฑะปะพะบัƒ ะฟะพะผะธะปะบะพะฒะธะน 4"
-#: ../memline.c:2536
msgid "deleted block 1?"
msgstr "ะฑะปะพะบ 1 ะทะฝะธั‰ะตะฝะพ?"
-#: ../memline.c:2707
#, c-format
msgid "E320: Cannot find line %<PRId64>"
msgstr "E320: ะะต ะฒะดะฐะปะพัั ะทะฝะฐะนั‚ะธ ั€ัะดะพะบ %<PRId64>"
-#: ../memline.c:2916
msgid "E317: pointer block id wrong"
msgstr "E317: ะ’ะบะฐะทั–ะฒะฝะธะบ ะฑะปะพะบัƒ ะฟะพะผะธะปะบะพะฒะธะน"
-# msgstr "E317: "
-#: ../memline.c:2930
msgid "pe_line_count is zero"
msgstr "pe_line_count ะดะพั€ั–ะฒะฝัŽั” 0"
-#: ../memline.c:2955
#, c-format
msgid "E322: line number out of range: %<PRId64> past the end"
msgstr "E322: ะะพะผะตั€ ั€ัะดะบะฐ ะฒะธะนัˆะพะฒ ะทะฐ ะผะตะถั–: %<PRId64> ะทะฐ ะบั–ะฝั†ะตะผ"
-# msgstr "E322: "
-#: ../memline.c:2959
#, c-format
msgid "E323: line count wrong in block %<PRId64>"
msgstr "E323: ะšั–ะปัŒะบั–ัั‚ัŒ ั€ัะดะบั–ะฒ ัƒ ะฑะปะพั†ั– %<PRId64>"
-# msgstr "E323: "
-#: ../memline.c:2999
msgid "Stack size increases"
msgstr "ะ ะพะทะผั–ั€ ัั‚ะตะบัƒ ะทะฑั–ะปัŒัˆัƒั”ั‚ัŒัั"
-#: ../memline.c:3038
msgid "E317: pointer block id wrong 2"
msgstr "E317: ะ’ะบะฐะทั–ะฒะฝะธะบ ะฑะปะพะบัƒ ะฟะพะผะธะปะบะพะฒะธะน 2"
-#: ../memline.c:3070
#, c-format
msgid "E773: Symlink loop for \"%s\""
msgstr "E773: ะฆะธะบะปั–ั‡ะฝั– ัะธะผะฒะพะปัŒะฝั– ะฟะพัะธะปะฐะฝะฝั ยซ%sยป"
-# msgstr "E317: "
-#: ../memline.c:3221
msgid "E325: ATTENTION"
msgstr "E325: ะฃะ’ะะ“ะ"
-#: ../memline.c:3222
msgid ""
"\n"
"Found a swap file by the name \""
@@ -4156,39 +3623,32 @@ msgstr ""
"\n"
"ะ—ะฝะฐะนะดะตะฝะพ ั„ะฐะนะป ะพะฑะผั–ะฝัƒ ะท ะฝะฐะทะฒะพัŽ \""
-#: ../memline.c:3226
msgid "While opening file \""
msgstr "ะŸั€ะธ ะฒั–ะดะบั€ะธั‚ั‚ั– ั„ะฐะนะปัƒ \""
-#: ../memline.c:3239
+msgid " CANNOT BE FOUND"
+msgstr " ะะ• ะ—ะะะ™ะ”ะ•ะะž"
+
msgid " NEWER than swap file!\n"
msgstr " ะะžะ’ะ†ะจะ˜ะ™ ะทะฐ ั„ะฐะนะป ะพะฑะผั–ะฝัƒ!\n"
-#: ../memline.c:3244
msgid ""
"\n"
"(1) Another program may be editing the same file. If this is the case,\n"
" be careful not to end up with two different instances of the same\n"
-" file when making changes."
+" file when making changes. Quit, or continue with caution.\n"
msgstr ""
"\n"
"(1) ะœะพะถะปะธะฒะพ, ั–ะฝัˆะฐ ะฟั€ะพะณั€ะฐะผะฐ ะฒะถะต ั€ะตะดะฐะณัƒั” ั†ะตะน ัะฐะผะธะน ั„ะฐะนะป. ะฏะบั‰ะพ ั†ะต ั‚ะฐะบ,\n"
-" ะฑัƒะดัŒั‚ะต ะพะฑะตั€ะตะถะฝั–, ั‰ะพะฑ ะฝะต ะทะฐะปะธัˆะธะปะธัั ะดะฒะฐ ั€ั–ะทะฝั– ะตะบะทะตะผะฟะปัั€ะธ\n"
-" ะพะดะฝะพะณะพ ะน ั‚ะพะณะพ ัะฐะผะพะณะพ ั„ะฐะนะปัƒ ะฟั–ัะปั ะทะผั–ะฝ."
+" ะฑัƒะดัŒั‚ะต ะพะฑะตั€ะตะถะฝั–, ั‰ะพะฑ ะฝะต ะทะฐะปะธัˆะธะปะธัั ะดะฒะฐ ั€ั–ะทะฝั– ะตะบะทะตะผะฟะปัั€ะธ ะพะดะฝะพะณะพ ะน ั‚ะพะณะพ\n"
+" ัะฐะผะพะณะพ ั„ะฐะนะปัƒ ะฟั–ัะปั ะทะผั–ะฝ. ะ’ะธะนะดั–ั‚ัŒ ั‡ะธ ะฟั€ะพะดะพะฒะถัƒะนั‚ะต ะพะฑะตั€ะตะถะฝะพ.\n"
-#: ../memline.c:3245
-msgid " Quit, or continue with caution.\n"
-msgstr " ะ’ะธะนะดั–ั‚ัŒ ะฐะฑะพ ะฟั€ะพะดะพะฒะถัƒะนั‚ะต ะพะฑะตั€ะตะถะฝะพ.\n"
-
-#: ../memline.c:3246
msgid "(2) An edit session for this file crashed.\n"
msgstr "(2) ะกะตะฐะฝั ั€ะตะดะฐะณัƒะฒะฐะฝะฝั ั†ัŒะพะณะพ ั„ะฐะนะปัƒ ะทะฐะทะฝะฐะฒ ะบั€ะฐั…ัƒ.\n"
-#: ../memline.c:3247
msgid " If this is the case, use \":recover\" or \"vim -r "
msgstr " ะฏะบั‰ะพ ั†ะต ัะฟั€ะฐะฒะดั– ั‚ั€ะฐะฟะธะปะพัั, ัะฟั€ะพะฑัƒะนั‚ะต ยซ:recoverยป ะฐะฑะพ ยซvim -r "
-#: ../memline.c:3249
msgid ""
"\"\n"
" to recover the changes (see \":help recovery\").\n"
@@ -4196,36 +3656,25 @@ msgstr ""
"ยป\n"
" ั‰ะพะฑ ะฒั–ะดะฝะพะฒะธั‚ะธ ะทะผั–ะฝะธ (ะดะธะฒ. ยซ:help recoveryยป).\n"
-#: ../memline.c:3250
msgid " If you did this already, delete the swap file \""
msgstr " ะฏะบั‰ะพ ะฒะธ ะฒะถะต ั†ะต ะทั€ะพะฑะธะปะธ, ะทะฝะธั‰ั–ั‚ัŒ ั„ะฐะนะป ะพะฑะผั–ะฝัƒ ยซ"
-#: ../memline.c:3252
msgid ""
"\"\n"
" to avoid this message.\n"
msgstr ""
"ยป,\n"
" ั‰ะพะฑ ะฟะพะทะฑัƒั‚ะธัั ั†ัŒะพะณะพ ะฟะพะฒั–ะดะพะผะปะตะฝะฝั.\n"
-"\n"
-#: ../memline.c:3450 ../memline.c:3452
msgid "Swap file \""
msgstr "ะคะฐะนะป ะพะฑะผั–ะฝัƒ ยซ"
-#: ../memline.c:3451 ../memline.c:3455
msgid "\" already exists!"
msgstr "ยป ะฒะถะต ั–ัะฝัƒั”!"
-#: ../memline.c:3457
msgid "VIM - ATTENTION"
msgstr "VIM โ€” ะฃะ’ะะ“ะ"
-#: ../memline.c:3459
-msgid "Swap file already exists!"
-msgstr "ะคะฐะนะป ะพะฑะผั–ะฝัƒ ะฒะถะต ั–ัะฝัƒั”!"
-
-#: ../memline.c:3464
msgid ""
"&Open Read-Only\n"
"&Edit anyway\n"
@@ -4239,7 +3688,6 @@ msgstr ""
"&Q:ะ’ะธะนั‚ะธ\n"
"&A:ะŸะตั€ะตั€ะฒะฐั‚ะธ"
-#: ../memline.c:3467
msgid ""
"&Open Read-Only\n"
"&Edit anyway\n"
@@ -4255,64 +3703,46 @@ msgstr ""
"&Q:ะ’ะธะนั‚ะธ\n"
"&A:ะŸะตั€ะตั€ะฒะฐั‚ะธ"
-#.
-#. * Change the ".swp" extension to find another file that can be used.
-#. * First decrement the last char: ".swo", ".swn", etc.
-#. * If that still isn't enough decrement the last but one char: ".svz"
-#. * Can happen when editing many "No Name" buffers.
-#.
-#. ".s?a"
-#. ".saa": tried enough, give up
-#: ../memline.c:3528
msgid "E326: Too many swap files found"
msgstr "E326: ะ—ะฝะฐะนะดะตะฝะพ ะทะฐะฑะฐะณะฐั‚ะพ ั„ะฐะนะปั–ะฒ ะพะฑะผั–ะฝัƒ"
-# msgstr "E341: "
-#: ../memory.c:227
+#, c-format
+msgid ""
+"E303: Unable to create directory \"%s\" for swap file, recovery impossible: "
+"%s"
+msgstr ""
+"E303: ะะต ะฒะดะฐะปะพัั ัั‚ะฒะพั€ะธั‚ะธ ะบะฐั‚ะฐะปะพะณ ยซ%sยป ะดะปั ั„ะฐะนะปัƒ ะพะฑะผั–ะฝัƒ, ะฒั–ะดะฝะพะฒะปะตะฝะฝั "
+"ะฝะตะผะพะถะปะธะฒะต: %s"
+
+msgid "Vim: Data too large to fit into virtual memory space\n"
+msgstr "Vim: ะ”ะฐะฝะธั… ะทะฐะฑะฐะณะฐั‚ะพ ั‰ะพะฑ ะฒะปั–ะทั‚ะธ ัƒ ะฒั–ั€ั‚ัƒะฐะปัŒะฝะธะน ะฐะดั€ะตัะฝะธะน ะฟั€ะพัั‚ั–ั€\n"
+
#, c-format
msgid "E342: Out of memory! (allocating %<PRIu64> bytes)"
msgstr "E342: ะ—ะฐะฑั€ะฐะบะปะพ ะฟะฐะผ'ัั‚ั–! (ะฟะพั‚ั€ั–ะฑะฝะพ ะฑัƒะปะพ %<PRIu64> ะฑะฐะนั‚ั–ะฒ)"
-# msgstr "E326: "
-#: ../menu.c:62
msgid "E327: Part of menu-item path is not sub-menu"
msgstr "E327: ะงะฐัั‚ะธะฝะฐ ัˆะปัั…ัƒ ะดะพ ะตะปะตะผะตะฝั‚ะฐ ะผะตะฝัŽ ะฝะต ั” ะฟั–ะดะผะตะฝัŽ"
-# msgstr "E327: "
-#: ../menu.c:63
msgid "E328: Menu only exists in another mode"
msgstr "E328: ะœะตะฝัŽ ะผะพะถะต ะฑัƒั‚ะธ ั‚ั–ะปัŒะบะธ ะฒ ั–ะฝัˆะพะผัƒ ั€ะตะถะธะผั–"
-# msgstr "E328: "
-#: ../menu.c:64
#, c-format
msgid "E329: No menu \"%s\""
msgstr "E329: ะะตะผะฐั” ะผะตะฝัŽ ยซ%sยป"
-#. Only a mnemonic or accelerator is not valid.
-#: ../menu.c:329
msgid "E792: Empty menu name"
msgstr "E792: ะŸะพั€ะพะถะฝั ะฝะฐะทะฒะฐ ะผะตะฝัŽ"
-# msgstr "E329: "
-#: ../menu.c:340
msgid "E330: Menu path must not lead to a sub-menu"
msgstr "E330: ะจะปัั… ะดะพ ะผะตะฝัŽ ะฝะต ะฟะพะฒะธะฝะตะฝ ะฒะตัั‚ะธ ะดะพ ะฟั–ะดะผะตะฝัŽ"
-# msgstr "E330: "
-#: ../menu.c:365
msgid "E331: Must not add menu items directly to menu bar"
msgstr "E331: ะะต ะผะพะถะฝะฐ ะดะพะดะฐะฒะฐั‚ะธ ะตะปะตะผะตะฝั‚ะธ ะผะตะฝัŽ ะฟั€ะพัั‚ะพ ะดะพ ะฒะตั€ั…ะฝัŒะพะณะพ ะผะตะฝัŽ"
-# msgstr "E331: "
-#: ../menu.c:370
msgid "E332: Separator cannot be part of a menu path"
msgstr "E332: ะ ะพะทะดั–ะปัŒะฝะธะบ ะฝะต ะผะพะถะต ะฑัƒั‚ะธ ั‡ะฐัั‚ะธะฝะพัŽ ัˆะปัั…ัƒ ะผะตะฝัŽ"
-# msgstr "E332: "
-#. Now we have found the matching menu, and we list the mappings
-#. Highlight title
-#: ../menu.c:762
msgid ""
"\n"
"--- Menus ---"
@@ -4320,78 +3750,48 @@ msgstr ""
"\n"
"--- ะœะตะฝัŽ ---"
-#: ../menu.c:1313
msgid "E333: Menu path must lead to a menu item"
msgstr "E333: ะจะปัั… ะฟะพะฒะธะฝะตะฝ ะฒะตัั‚ะธ ะดะพ ะตะปะตะผะตะฝั‚ะฐ ะผะตะฝัŽ"
-# msgstr "E333: "
-#: ../menu.c:1330
#, c-format
msgid "E334: Menu not found: %s"
msgstr "E334: ะœะตะฝัŽ ะฝะต ะทะฝะฐะนะดะตะฝะพ: %s"
-# msgstr "E334: "
-#: ../menu.c:1396
#, c-format
msgid "E335: Menu not defined for %s mode"
msgstr "E335: ะ”ะปั ั€ะตะถะธะผัƒ %s ะผะตะฝัŽ ะฝะต ะฒะธะทะฝะฐั‡ะตะฝะพ"
-# msgstr "E335: "
-#: ../menu.c:1426
-msgid "E336: Menu path must lead to a sub-menu"
-msgstr "E336: ะจะปัั… ะฟะพะฒะธะฝะตะฝ ะฒะตัั‚ะธ ะดะพ ะฟั–ะดะผะตะฝัŽ"
-
-# msgstr "E336: "
-#: ../menu.c:1447
-msgid "E337: Menu not found - check menu names"
-msgstr "E337: ะœะตะฝัŽ ะฝะต ะทะฝะฐะนะดะตะฝะพ โ€” ะฟะตั€ะตะฒั–ั€ั‚ะต ะฝะฐะทะฒัƒ"
-
-# msgstr "E337: "
-#: ../message.c:423
#, c-format
msgid "Error detected while processing %s:"
msgstr "ะ’ะธัะฒะปะตะฝะพ ะฟะพะผะธะปะบัƒ ะฟั–ะด ั‡ะฐั ะฒะธะบะพะฝะฐะฝะฝั %s:"
-#: ../message.c:445
#, c-format
msgid "line %4ld:"
msgstr "ั€ัะดะพะบ %4ld:"
-#: ../message.c:617
#, c-format
msgid "E354: Invalid register name: '%s'"
msgstr "E354: ะะตะฟั€ะฐะฒะธะปัŒะฝะฐ ะฝะฐะทะฒะฐ ั€ะตะณั–ัั‚ั€ัƒ: '%s'"
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr "ะฃะบั€ะฐั—ะฝั–ะทะฐั†ั–ั: ะะฝะฐั‚ะพะปั–ะน ะกะฐั…ะฝั–ะบ <sakhnik@gmail.com>"
-
-#: ../message.c:986
msgid "Interrupt: "
msgstr "ะŸะตั€ะตั€ะฒะฐะฝะพ: "
-#: ../message.c:988
msgid "Press ENTER or type command to continue"
msgstr "ะะฐั‚ะธัะฝั–ั‚ัŒ ENTER ะฐะฑะพ ะฒะฒะตะดั–ั‚ัŒ ะบะพะผะฐะฝะดัƒ ะดะปั ะฟั€ะพะดะพะฒะถะตะฝะฝั"
-#: ../message.c:1843
#, c-format
msgid "%s line %<PRId64>"
msgstr "%s ั€ัะดะพะบ %<PRId64>"
-#: ../message.c:2392
msgid "-- More --"
msgstr "-- ะฉะต --"
-#: ../message.c:2398
msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "
msgstr " ะŸะ ะžะ‘ะ†ะ›/d/j: ะฒะฝะธะท ะฝะฐ ะตะบั€ะฐะฝ/ัั‚ะพั€ั–ะฝะบัƒ/ั€ัะดะพะบ, b/u/k: ะฒะณะพั€ัƒ, q: ะฒะธะนั‚ะธ "
-#: ../message.c:3021 ../message.c:3031
msgid "Question"
msgstr "ะ—ะฐะฟะธั‚ะฐะฝะฝั"
-#: ../message.c:3023
msgid ""
"&Yes\n"
"&No"
@@ -4399,7 +3799,6 @@ msgstr ""
"&Y:ะขะฐะบ\n"
"&N:ะั–"
-#: ../message.c:3033
msgid ""
"&Yes\n"
"&No\n"
@@ -4409,7 +3808,6 @@ msgstr ""
"&N:ะั–\n"
"&C:ะกะบะฐััƒะฒะฐั‚ะธ"
-#: ../message.c:3045
msgid ""
"&Yes\n"
"&No\n"
@@ -4423,178 +3821,124 @@ msgstr ""
"&D:ะ–ะพะดะฝะพะณะพ\n"
"&C:ะกะบะฐััƒะฒะฐั‚ะธ"
-#: ../message.c:3058
-msgid "E766: Insufficient arguments for printf()"
-msgstr "E766: ะะตะดะพัั‚ะฐั‚ะฝัŒะพ ะฐั€ะณัƒะผะตะฝั‚ั–ะฒ ะดะปั printf()"
-
-#: ../message.c:3119
-msgid "E807: Expected Float argument for printf()"
-msgstr "E807: ะžั‡ั–ะบัƒั”ั‚ัŒัั ะฐั€ะณัƒะผะตะฝั‚ Float ะดะปั printf()"
-
-#: ../message.c:3873
-msgid "E767: Too many arguments to printf()"
-msgstr "E767: ะ—ะฐะฑะฐะณะฐั‚ะพ ะฐั€ะณัƒะผะตะฝั‚ั–ะฒ ะดะปั printf()"
-
-# msgstr "E338: "
-#: ../misc1.c:2256
msgid "W10: Warning: Changing a readonly file"
msgstr "W10: ะ—ะฐัั‚ะตั€ะตะถะตะฝะฝั: ะ—ะผั–ะฝัŽั”ั‚ัŒัั ั„ะฐะนะป ะฟั€ะธะทะฝะฐั‡ะตะฝะธะน ะปะธัˆะต ะดะปั ั‡ะธั‚ะฐะฝะฝั"
-#: ../misc1.c:2537
msgid "Type number and <Enter> or click with mouse (empty cancels): "
msgstr "ะะฐะฑะตั€ั–ั‚ัŒ ั‡ะธัะปะพ ะน <Enter> ั‡ะธ ะบะปะฐั†ะฝั–ั‚ัŒ ะผะธัˆะบะพัŽ (ะฟะพั€ะพะถะฝั” ัะบะฐัะพะฒัƒั”): "
-#: ../misc1.c:2539
msgid "Type number and <Enter> (empty cancels): "
msgstr "ะะฐะฑะตั€ั–ั‚ัŒ ั‡ะธัะปะพ ะน <Enter> (ะฟะพั€ะพะถะฝั” ัะบะฐัะพะฒัƒั”): "
-#: ../misc1.c:2585
msgid "1 more line"
msgstr "ะดะพะดะฐะฝะพ ะพะดะธะฝ ั€ัะดะพะบ"
-#: ../misc1.c:2588
msgid "1 line less"
msgstr "ะทะฝะธั‰ะตะฝะพ ะพะดะธะฝ ั€ัะดะพะบ"
-#: ../misc1.c:2593
#, c-format
msgid "%<PRId64> more lines"
msgstr "ะดะพะดะฐะฝะพ ั€ัะดะบั–ะฒ: %<PRId64>"
-#: ../misc1.c:2596
#, c-format
msgid "%<PRId64> fewer lines"
msgstr "ะทะฝะธั‰ะตะฝะพ ั€ัะดะบั–ะฒ: %<PRId64>"
-#: ../misc1.c:2599
msgid " (Interrupted)"
msgstr " (ะŸะตั€ะตั€ะฒะฐะฝะพ)"
-#: ../misc1.c:2635
msgid "Beep!"
msgstr "ะ”ะทะตะฝัŒ!"
-# msgstr "E342: "
-#: ../misc2.c:738
-#, c-format
-msgid "Calling shell to execute: \"%s\""
-msgstr "ะ’ะธะบะปะธะบะฐั”ั‚ัŒัั ะพะฑะพะปะพะฝะบะฐ ั‰ะพะฑ ะฒะธะบะพะฝะฐั‚ะธ: ยซ%sยป"
-
-# msgstr "E348: "
-#: ../normal.c:183
msgid "E349: No identifier under cursor"
msgstr "E349: ะะตะผะฐั” ั–ะดะตะฝั‚ะธั„ั–ะบะฐั‚ะพั€ะฐ ะฝะฐะด ะบัƒั€ัะพั€ะพะผ"
-#: ../normal.c:1866
msgid "E774: 'operatorfunc' is empty"
msgstr "E774: 'operatorfunc' ะฟะพั€ะพะถะฝั"
-#: ../normal.c:2637
msgid "Warning: terminal cannot highlight"
msgstr "ะ—ะฐัั‚ะตั€ะตะถะตะฝะฝั: ะขะตั€ะผั–ะฝะฐะป ะฝะต ะฟั–ะดั‚ั€ะธะผัƒั” ะบะพะปัŒะพั€ะธ"
-#: ../normal.c:2807
msgid "E348: No string under cursor"
msgstr "E348: ะะตะผะฐั” ั€ัะดะบะฐ ะฝะฐ ะบัƒั€ัะพั€ั–"
-#: ../normal.c:3937
msgid "E352: Cannot erase folds with current 'foldmethod'"
msgstr "E352: ะะต ะฒะดะฐะปะพัั ะทะฝะธั‰ะธั‚ะธ ะทะณะพั€ั‚ะบะธ ะฟะพั‚ะพั‡ะฝะธะผ ะผะตั‚ะพะดะพะผ 'foldmethod'"
-#: ../normal.c:5897
msgid "E664: changelist is empty"
msgstr "E664: ะกะฟะธัะพะบ ะทะผั–ะฝ ะฟะพั€ะพะถะฝั–ะน"
-#: ../normal.c:5899
msgid "E662: At start of changelist"
msgstr "E662: ะŸะพั‡ะฐั‚ะพะบ ัะฟะธัะบัƒ ะทะผั–ะฝ"
-#: ../normal.c:5901
msgid "E663: At end of changelist"
msgstr "E663: ะšั–ะฝะตั†ัŒ ัะฟะธัะบัƒ ะทะผั–ะฝ"
-#: ../normal.c:7053
-msgid "Type :quit<Enter> to exit Nvim"
-msgstr "ะฃะฒะตะดั–ั‚ัŒ :quit<Enter> ั‰ะพะฑ ะฒะธะนั‚ะธ ะท Vim"
+msgid "Type :qa! and press <Enter> to abandon all changes and exit Nvim"
+msgstr ""
+"ะ’ะฒะตะดั–ั‚ัŒ :qa! ั– ะฝะฐั‚ะธัะฝั–ัั‚ัŒ <Enter> ั‰ะพะฑ ะฒั–ะดะบะธะฝัƒั‚ะธ ะฒัั– ะทะผั–ะฝะธ ั– ะฒะธะนั‚ะธ Nvim"
-#: ../ops.c:248
#, c-format
msgid "1 line %sed 1 time"
msgstr "ะžะดะธะฝ ั€ัะดะพะบ %s-ะฝะพ"
-#: ../ops.c:250
#, c-format
msgid "1 line %sed %d times"
msgstr "ะžะดะธะฝ ั€ัะดะพะบ %s-ะฝะพ %d ั€ะฐะทั–ะฒ"
-#: ../ops.c:253
#, c-format
msgid "%<PRId64> lines %sed 1 time"
msgstr "%<PRId64> ั€ัะดะบั–ะฒ %s-ะฝะพ"
-#: ../ops.c:256
#, c-format
msgid "%<PRId64> lines %sed %d times"
msgstr "%<PRId64> ั€ัะดะบั–ะฒ %s-ะฝะพ %d ั€ะฐะทั–ะฒ"
-#: ../ops.c:592
#, c-format
msgid "%<PRId64> lines to indent... "
msgstr "ะ—ะฐะปะธัˆะธะปะพัั ะฒะธั€ั–ะฒะฝัั‚ะธ %<PRId64> ั€ัะดะบั–ะฒ..."
-#: ../ops.c:634
msgid "1 line indented "
msgstr "ะ’ะธั€ั–ะฒะฝัะฝะพ ะพะดะธะฝ ั€ัะดะพะบ"
-#: ../ops.c:636
#, c-format
msgid "%<PRId64> lines indented "
msgstr "ะ’ะธั€ั–ะฒะฝัะฝะพ ั€ัะดะบั–ะฒ: %<PRId64>"
-#: ../ops.c:938
msgid "E748: No previously used register"
msgstr "E748: ะ ะตะณั–ัั‚ั€ะธ ะฟะตั€ะตะด ั†ะธะผ ะฝะต ะฒะถะธะฒะฐะปะธััŒ"
-#. must display the prompt
-#: ../ops.c:1433
-msgid "cannot yank; delete anyway"
-msgstr "ะฝะต ะฒะดะฐะปะพัั ะทะฐะฟะฐะผ'ัั‚ะฐั‚ะธ; ะฒัะต ะพะดะฝะพ ะทะฝะธั‰ะธั‚ะธ?"
-
-#: ../ops.c:1929
msgid "1 line changed"
msgstr "ะžะดะธะฝ ั€ัะดะพะบ ะทะผั–ะฝะตะฝะพ"
-#: ../ops.c:1931
#, c-format
msgid "%<PRId64> lines changed"
msgstr "ะ—ะผั–ะฝะตะฝะพ ั€ัะดะบั–ะฒ: %<PRId64>"
-#: ../ops.c:2521
-msgid "block of 1 line yanked"
-msgstr "ะ—ะฐะฟะฐะผ'ัั‚ะฐะฒ ะฑะปะพะบ ะท ะพะดะฝะพะณะพ ั€ัะดะบะฐ"
+#, c-format
+msgid " into \"%c"
+msgstr " ัƒ \"%c"
-#: ../ops.c:2523
-msgid "1 line yanked"
-msgstr "ะ—ะฐะฟะฐะผ'ัั‚ะฐะฒ ะพะดะธะฝ ั€ัะดะพะบ"
+#, c-format
+msgid "block of 1 line yanked%s"
+msgstr "ะ—ะฐะฟะฐะผ'ัั‚ะฐะฒ ะฑะปะพะบ ะท ะพะดะฝะพะณะพ ั€ัะดะบะฐ%s"
-#: ../ops.c:2525
#, c-format
-msgid "block of %<PRId64> lines yanked"
-msgstr "ะ—ะฐะฟะฐะผ'ัั‚ะฐะฒ ะฑะปะพะบ ั–ะท %<PRId64> ั€ัะดะบั–ะฒ"
+msgid "1 line yanked%s"
+msgstr "ะ—ะฐะฟะฐะผ'ัั‚ะฐะฒ ะพะดะธะฝ ั€ัะดะพะบ%s"
-#: ../ops.c:2528
#, c-format
-msgid "%<PRId64> lines yanked"
-msgstr "ะ—ะฐะฟะฐะผ'ัั‚ะฐะฒ ั€ัะดะบั–ะฒ: %<PRId64>"
+msgid "block of %<PRId64> lines yanked%s"
+msgstr "ะ—ะฐะฟะฐะผ'ัั‚ะฐะฒ ะฑะปะพะบ ั–ะท %<PRId64> ั€ัะดะบั–ะฒ%s"
+
+#, c-format
+msgid "%<PRId64> lines yanked%s"
+msgstr "ะ—ะฐะฟะฐะผ'ัั‚ะฐะฒ ั€ัะดะบั–ะฒ: %<PRId64>%s"
-#: ../ops.c:2710
#, c-format
msgid "E353: Nothing in register %s"
msgstr "E353: ะฃ ั€ะตะณั–ัั‚ั€ั– %s ะฝั–ั‡ะพะณะพ ะฝะตะผะฐั”"
-# msgstr "E353: "
-#. Highlight title
-#: ../ops.c:3185
msgid ""
"\n"
"--- Registers ---"
@@ -4602,29 +3946,16 @@ msgstr ""
"\n"
"--- ะ ะตะณั–ัั‚ั€ะธ ---"
-#: ../ops.c:4455
-msgid "Illegal register name"
-msgstr "ะะตะฟั€ะฐะฒะธะปัŒะฝะฐ ะฝะฐะทะฒะฐ ั€ะตะณั–ัั‚ั€ัƒ"
-
-#: ../ops.c:4533
msgid ""
-"\n"
-"# Registers:\n"
+"E883: search pattern and expression register may not contain two or more "
+"lines"
msgstr ""
-"\n"
-"# ะ ะตะณั–ัั‚ั€ะธ:\n"
-
-#: ../ops.c:4575
-#, c-format
-msgid "E574: Unknown register type %d"
-msgstr "E574: ะะตะฒั–ะดะพะผะธะน ั‚ะธะฟ ั€ะตะณั–ัั‚ั€ัƒ %d"
+"E883: ัˆะฐะฑะปะพะฝ ะฟะพัˆัƒะบัƒ ั– ั€ะตั”ัั‚ั€ ะฒะธั€ะฐะทัƒ ะฝะต ะผะพะถัƒั‚ัŒ ะผั–ัั‚ะธั‚ะธ ะดะฒะฐ ั‡ะธ ะฑั–ะปัŒัˆะต ั€ัะดะบั–ะฒ"
-#: ../ops.c:5089
#, c-format
msgid "%<PRId64> Cols; "
msgstr "ะดะพะฒะถ.: %<PRId64>; "
-#: ../ops.c:5097
#, c-format
msgid ""
"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
@@ -4633,7 +3964,6 @@ msgstr ""
"ะ’ะธะฑั€ะฐะฝะพ %s%<PRId64> ะท %<PRId64> ั€ัะดะบั–ะฒ; %<PRId64> ะท %<PRId64> ัะปั–ะฒ; "
"%<PRId64> ะท %<PRId64> ะฑะฐะนั‚ั–ะฒ"
-#: ../ops.c:5105
#, c-format
msgid ""
"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
@@ -4642,7 +3972,6 @@ msgstr ""
"ะ’ะธะฑั€ะฐะฝะพ %s%<PRId64> ะท %<PRId64> ั€ัะดะบั–ะฒ; %<PRId64> ะท %<PRId64> ัะปั–ะฒ; "
"%<PRId64> of %<PRId64> ัะธะผะฒะพะปั–ะฒ; %<PRId64> ะท %<PRId64> ะฑะฐะนั‚ั–ะฒ"
-#: ../ops.c:5123
#, c-format
msgid ""
"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Byte "
@@ -4651,7 +3980,6 @@ msgstr ""
"ะšะพะปะพะฝะบะฐ %s ะท %s; ั€ัะดะพะบ %<PRId64> ะท %<PRId64>; ัะปะพะฒะพ %<PRId64> ะท %<PRId64>; "
"ะฑะฐะนั‚ %<PRId64> ะท %<PRId64>"
-#: ../ops.c:5133
#, c-format
msgid ""
"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Char "
@@ -4660,158 +3988,101 @@ msgstr ""
"ะšะพะปะพะฝะบะฐ %s ะท %s; ั€ัะดะพะบ %<PRId64> ะท %<PRId64>; ัะปะพะฒะพ %<PRId64> ะท %<PRId64>; "
"ัะธะผะฒะพะป %<PRId64> of %<PRId64>; ะฑะฐะนั‚ %<PRId64> ะท %<PRId64>"
-#: ../ops.c:5146
#, c-format
msgid "(+%<PRId64> for BOM)"
msgstr "(+%<PRId64> ะดะปั BOM)"
-#: ../option.c:1238
-msgid "%<%f%h%m%=Page %N"
-msgstr "%<%f%h%m%=ะกั‚ะพั€. %N"
-
-#: ../option.c:1574
-msgid "Thanks for flying Vim"
-msgstr "ะ”ัะบัƒั”ะผะพ ะทะฐ ะฒะธะฑั–ั€ Vim"
-
-#. found a mismatch: skip
-#: ../option.c:2698
msgid "E518: Unknown option"
msgstr "E518: ะะตะฒั–ะดะพะผะฐ ะพะฟั†ั–ั"
-#: ../option.c:2709
-msgid "E519: Option not supported"
-msgstr "E519: ะžะฟั†ั–ั ะฝะต ะฟั–ะดั‚ั€ะธะผัƒั”ั‚ัŒัั"
-
-#: ../option.c:2740
msgid "E520: Not allowed in a modeline"
msgstr "E520: ะะต ะดะพะทะฒะพะปะตะฝะพ ัƒ modeline"
-#: ../option.c:2815
msgid "E846: Key code not set"
msgstr "E846: ะšะพะด ะบะปัŽั‡ะฐ ะฝะต ะฒัั‚ะฐะฝะพะฒะปะตะฝะพ"
-#: ../option.c:2924
msgid "E521: Number required after ="
msgstr "E521: ะŸั–ัะปั = ะฟะพั‚ั€ั–ะฑะฝะพ ะฒะบะฐะทะฐั‚ะธ ั‡ะธัะปะพ"
-#: ../option.c:3226 ../option.c:3864
-msgid "E522: Not found in termcap"
-msgstr "E522: ะะต ะทะฝะฐะนะดะตะฝะพ ัะตั€ะตะด ะผะพะถะปะธะฒะพัั‚ะตะน ั‚ะตั€ะผั–ะฝะฐะปั–ะฒ"
-
-#: ../option.c:3335
#, c-format
msgid "E539: Illegal character <%s>"
msgstr "E539: ะะตะดะพะทะฒะพะปะตะฝะธะน ัะธะผะฒะพะป <%s>"
-#: ../option.c:3862
-msgid "E529: Cannot set 'term' to empty string"
-msgstr "E529: ะะต ะฒะดะฐะปะพัั ัะฟะพั€ะพะถะฝะธั‚ะธ 'term'"
+#, c-format
+msgid "For option %s"
+msgstr "ะ”ะปั ะพะฟั†ั–ั— %s"
-#: ../option.c:3885
msgid "E589: 'backupext' and 'patchmode' are equal"
msgstr "E589: ะžะฟั†ั–ั— 'backupext' ั– 'patchmode' ะพะดะฝะฐะบะพะฒั–"
-#: ../option.c:3964
msgid "E834: Conflicts with value of 'listchars'"
msgstr "E834: ะšะพะฝั„ะปั–ะบั‚ัƒั” ั–ะท ะทะฝะฐั‡ะตะฝะฝัะผ 'listchars'"
-#: ../option.c:3966
msgid "E835: Conflicts with value of 'fillchars'"
msgstr "E835: ะšะพะฝั„ะปั–ะบั‚ัƒั” ั–ะท ะทะฝะฐั‡ะตะฝะฝัะผ 'fillchars'"
-#: ../option.c:4163
msgid "E524: Missing colon"
msgstr "E524: ะ‘ั€ะฐะบัƒั” ะดะฒะพะบั€ะฐะฟะบะธ"
-#: ../option.c:4165
msgid "E525: Zero length string"
msgstr "E525: ะ ัะดะพะบ ะฟะพั€ะพะถะฝั–ะน"
-#: ../option.c:4220
#, c-format
msgid "E526: Missing number after <%s>"
msgstr "E526: ะŸั–ัะปั <%s> ะฑั€ะฐะบัƒั” ั‡ะธัะปะฐ"
-#: ../option.c:4232
msgid "E527: Missing comma"
msgstr "E527: ะ‘ั€ะฐะบัƒั” ะบะพะผะธ"
-#: ../option.c:4239
msgid "E528: Must specify a ' value"
msgstr "E528: ะŸะพั‚ั€ั–ะฑะฝะพ ะฒะบะฐะทะฐั‚ะธ ะทะฝะฐั‡ะตะฝะฝั '"
-#: ../option.c:4271
msgid "E595: contains unprintable or wide character"
msgstr "E595: ะœั–ัั‚ะธั‚ัŒ ะฝะตะดั€ัƒะบะพะฒะฝั– ะฐะฑะพ ั€ะพะทัˆะธั€ะตะฝั– ัะธะผะฒะพะปะธ"
-#: ../option.c:4469
#, c-format
msgid "E535: Illegal character after <%c>"
msgstr "E535: ะะตะดะพะทะฒะพะปะตะฝะธะน ัะธะผะฒะพะป ะฟั–ัะปั <%c>"
-#: ../option.c:4534
msgid "E536: comma required"
msgstr "E536: ะŸะพั‚ั€ั–ะฑะฝะฐ ะบะพะผะฐ"
-#: ../option.c:4543
#, c-format
msgid "E537: 'commentstring' must be empty or contain %s"
msgstr "E537: 'commentstring' ะผะฐั” ะฑัƒั‚ะธ ะฟะพั€ะพะถะฝัŒะพัŽ ั‡ะธ ะผั–ัั‚ะธั‚ะธ %s"
-#: ../option.c:4928
msgid "E540: Unclosed expression sequence"
msgstr "E540: ะŸะพัะปั–ะดะพะฒะฝั–ัั‚ัŒ ะฒะธั€ะฐะทั–ะฒ ะฝะต ะทะฐะฒะตั€ัˆะตะฝะพ"
-#: ../option.c:4932
msgid "E541: too many items"
msgstr "E541: ะ—ะฐะฑะฐะณะฐั‚ะพ ะตะปะตะผะตะฝั‚ั–ะฒ"
-#: ../option.c:4934
msgid "E542: unbalanced groups"
msgstr "E542: ะ“ั€ัƒะฟะธ ะฝะต ะทะฑะฐะปะฐะฝัะพะฒะฐะฝะพ"
-#: ../option.c:5148
msgid "E590: A preview window already exists"
msgstr "E590: ะ’ั–ะบะฝะพ ะฟะตั€ะตะณะปัะดัƒ ะฒะถะต ั–ัะฝัƒั”"
-#: ../option.c:5311
msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'"
msgstr ""
"W17: ะ”ะปั ะฐั€ะฐะฑััŒะบะพั— ะผะพะฒะธ ะฟะพั‚ั€ั–ะฑะฝะต UTF-8, ะฒะธะบะพะฝะฐะนั‚ะต ':set encoding=utf-8'"
-#: ../option.c:5623
#, c-format
msgid "E593: Need at least %d lines"
msgstr "E593: ะŸะพั‚ั€ั–ะฑะฝะพ ั‰ะพะฝะฐะนะผะตะฝัˆะต %d ั€ัะดะบั–ะฒ"
-#: ../option.c:5631
#, c-format
msgid "E594: Need at least %d columns"
msgstr "E594: ะŸะพั‚ั€ั–ะฑะฝะพ ั‰ะพะฝะฐะนะผะตะฝัˆะต %d ัั‚ะพะฒะฟั†ั–ะฒ"
-#: ../option.c:6011
#, c-format
msgid "E355: Unknown option: %s"
msgstr "E355: ะะตะฒั–ะดะพะผะฐ ะพะฟั†ั–ั: %s"
-#. There's another character after zeros or the string
-#. * is empty. In both cases, we are trying to set a
-#. * num option using a string.
-#: ../option.c:6037
#, c-format
msgid "E521: Number required: &%s = '%s'"
msgstr "E521: ะŸะพั‚ั€ั–ะฑะฝะพ ะฒะบะฐะทะฐั‚ะธ Number: &%s = '%s'"
-# msgstr "E355: "
-#: ../option.c:6149
-msgid ""
-"\n"
-"--- Terminal codes ---"
-msgstr ""
-"\n"
-"--- ะšะพะดะธ ั‚ะตั€ะผั–ะฝะฐะปัƒ ---"
-
-#: ../option.c:6151
msgid ""
"\n"
"--- Global option values ---"
@@ -4819,7 +4090,6 @@ msgstr ""
"\n"
"--- ะ—ะฝะฐั‡ะตะฝะฝั ะทะฐะณะฐะปัŒะฝะธั… ะพะฟั†ั–ะน ---"
-#: ../option.c:6153
msgid ""
"\n"
"--- Local option values ---"
@@ -4827,7 +4097,6 @@ msgstr ""
"\n"
"--- ะ—ะฝะฐั‡ะตะฝะฝั ะปะพะบะฐะปัŒะฝะธั… ะพะฟั†ั–ะน ---"
-#: ../option.c:6155
msgid ""
"\n"
"--- Options ---"
@@ -4835,40 +4104,46 @@ msgstr ""
"\n"
"--- ะžะฟั†ั–ั— ---"
-#: ../option.c:6816
msgid "E356: get_varp ERROR"
msgstr "E356: ะŸะพะผะธะปะบะฐ get_varp"
-# msgstr "E356: "
-#: ../option.c:7696
#, c-format
msgid "E357: 'langmap': Matching character missing for %s"
msgstr "E357: 'langmap': ะ”ะปั ัะธะผะฒะพะปัƒ %s ะฝะตะผะฐั” ะฟะฐั€ะธ"
-# msgstr "E357: "
-#: ../option.c:7715
#, c-format
msgid "E358: 'langmap': Extra characters after semicolon: %s"
msgstr "E358: 'langmap': ะ—ะฐะนะฒั– ัะธะผะฒะพะปะธ ะฟั–ัะปั `;': %s"
-#: ../os/shell.c:194
+#, c-format
+msgid "dlerror = \"%s\""
+msgstr "dlerror = ยซ%sยป"
+
+#, c-format
+msgid "E5420: Failed to write to file: %s"
+msgstr "E5420: ะะต ะฒะดะฐะปะพัั ะทะฐะฟะธัะฐั‚ะธ ัƒ ั„ะฐะนะป: %s"
+
+msgid "Vim: Error reading input, exiting...\n"
+msgstr "Vim: ะŸะพะผะธะปะบะฐ ั‡ะธั‚ะฐะฝะฝั ะฒะฒะพะดัƒ, ั€ะพะฑะพั‚ะฐ ะทะฐะฒะตั€ัˆัƒั”ั‚ัŒัั...\n"
+
msgid ""
"\n"
-"Cannot execute shell "
+"shell returned "
msgstr ""
"\n"
-"ะะต ะฒะดะฐะปะพัั ะทะฐะฟัƒัั‚ะธั‚ะธ ะพะฑะพะปะพะฝะบัƒ"
+"ะพะฑะพะปะพะฝะบะฐ ะฟะพะฒะตั€ะฝัƒะปะฐ: "
-# msgstr "E362: "
-#: ../os/shell.c:439
msgid ""
"\n"
-"shell returned "
+"shell failed to start: "
msgstr ""
"\n"
-"ะพะฑะพะปะพะฝะบะฐ ะฟะพะฒะตั€ะฝัƒะปะฐ: "
+"ะฝะต ะฒะดะฐะปะพัั ะทะฐะฟัƒัั‚ะธั‚ะธ ะพะฑะพะปะพะฝะบัƒ: "
+
+#, c-format
+msgid "E5677: Error writing input to shell-command: %s"
+msgstr "E5677: ะะต ะฒะดะฐะปะพัั ะทะฐะฟะธัะฐั‚ะธ ะฝะฐ ะฒั…ั–ะด ะบะพะผะฐะฝะดะธ ะพะฑะพะปะพะฝะบะธ: %s"
-#: ../os_unix.c:465 ../os_unix.c:471
msgid ""
"\n"
"Could not get security context for "
@@ -4876,7 +4151,6 @@ msgstr ""
"\n"
"ะะต ะฒะดะฐะปะพัั ะพั‚ั€ะธะผะฐั‚ะธ ะบะพะฝั‚ะตะบัั‚ ะฑะตะทะฟะตะบะธ ะดะปั "
-#: ../os_unix.c:479
msgid ""
"\n"
"Could not set security context for "
@@ -4884,234 +4158,188 @@ msgstr ""
"\n"
"ะะต ะฒะดะฐะปะพัั ะฒัั‚ะฐะฝะพะฒะธั‚ะธ ะบะพะฝั‚ะตะบัั‚ ะฑะตะทะฟะตะบะธ ะดะปั "
-#: ../os_unix.c:1558 ../os_unix.c:1647
-#, c-format
-msgid "dlerror = \"%s\""
-msgstr "dlerror = ยซ%sยป"
-
-# msgstr "E446: "
-#: ../path.c:1449
#, c-format
msgid "E447: Can't find file \"%s\" in path"
msgstr "E447: ะคะฐะนะป ยซ%sยป ะฝะต ะทะฝะฐะนะดะตะฝะพ ัƒ ัˆะปัั…ัƒ ะฟะพัˆัƒะบัƒ"
-# msgstr "E371: "
-#: ../quickfix.c:359
#, c-format
msgid "E372: Too many %%%c in format string"
msgstr "E372: ะ—ะฐะฑะฐะณะฐั‚ะพ %%%c ัƒ ั€ัะดะบัƒ ั„ะพั€ะผะฐั‚ัƒ"
-# msgstr "E372: "
-#: ../quickfix.c:371
#, c-format
msgid "E373: Unexpected %%%c in format string"
msgstr "E373: ะะตะพั‡ั–ะบัƒะฒะฐะฝะธะน `%%%c' ัƒ ั€ัะดะบัƒ ั„ะพั€ะผะฐั‚ัƒ"
-# msgstr "E373: "
-#: ../quickfix.c:420
msgid "E374: Missing ] in format string"
msgstr "E374: ะŸั€ะพะฟัƒั‰ะตะฝะพ ] ัƒ ั€ัะดะบัƒ ั„ะพั€ะผะฐั‚ัƒ"
-# msgstr "E374: "
-#: ../quickfix.c:431
#, c-format
msgid "E375: Unsupported %%%c in format string"
msgstr "E375: %%%c ัƒ ั€ัะดะบัƒ ั„ะพั€ะผะฐั‚ัƒ ะฝะต ะฟั–ะดั‚ั€ะธะผัƒั”ั‚ัŒัั"
-# msgstr "E375: "
-#: ../quickfix.c:448
#, c-format
msgid "E376: Invalid %%%c in format string prefix"
msgstr "E376: ะŸะพะผะธะปะบะพะฒะธะน `%%%c' ัƒ ะฟั€ะตั„ั–ะบัั– ั€ัะดะบัƒ ั„ะพั€ะผะฐั‚ัƒ"
-# msgstr "E376: "
-#: ../quickfix.c:454
#, c-format
msgid "E377: Invalid %%%c in format string"
msgstr "E377: ะŸะพะผะธะปะบะพะฒะธะน `%%%c' ัƒ ั€ัะดะบัƒ ั„ะพั€ะผะฐั‚ัƒ"
-# msgstr "E377: "
-#. nothing found
-#: ../quickfix.c:477
msgid "E378: 'errorformat' contains no pattern"
msgstr "E378: 'errorformat' ะฝะต ะผั–ัั‚ะธั‚ัŒ ะทั€ะฐะทะพะบ"
-# msgstr "E378: "
-#: ../quickfix.c:695
msgid "E379: Missing or empty directory name"
msgstr "E379: ะŸั€ะพะฟัƒั‰ะตะฝะฐ ั‡ะธ ะฟะพั€ะพะถะฝั ะฝะฐะทะฒะฐ ะบะฐั‚ะฐะปะพะณัƒ"
-#: ../quickfix.c:1305
msgid "E553: No more items"
msgstr "E553: ะะตะผะฐั” ะฑั–ะปัŒัˆะต ะตะปะตะผะตะฝั‚ั–ะฒ"
-#: ../quickfix.c:1674
+msgid "E924: Current window was closed"
+msgstr "E924: ะะบั‚ะธะฒะฝะต ะฒั–ะบะฝะพ ะฑัƒะปะพ ะทะฐะบั€ะธั‚ะพ"
+
+msgid "E925: Current quickfix was changed"
+msgstr "E925: ะฆะตะน quickfix ะฑัƒะปะพ ะทะผั–ะฝะตะฝะพ"
+
+msgid "E926: Current location list was changed"
+msgstr "E926: ะฆะตะน ัะฟะธัะพะบ ะผั–ัั†ัŒ ะฑัƒะปะพ ะทะผั–ะฝะตะฝะพ"
+
#, c-format
msgid "(%d of %d)%s%s: "
msgstr "(%d ะท %d)%s%s: "
-#: ../quickfix.c:1676
msgid " (line deleted)"
msgstr " (ั€ัะดะพะบ ะทะฝะธั‰ะตะฝะพ)"
-#: ../quickfix.c:1863
+#, c-format
+msgid "%serror list %d of %d; %d errors "
+msgstr "%sัะฟะธัะพะบ ะฟะพะผะธะปะพะบ %d ะท %d; %d ะฟะพะผะธะปะพะบ "
+
msgid "E380: At bottom of quickfix stack"
msgstr "E380: ะ”ะฝะพ ัั‚ะตะบัƒ ะฒะธะฟั€ะฐะฒะปะตะฝัŒ"
-#: ../quickfix.c:1869
msgid "E381: At top of quickfix stack"
msgstr "E381: ะ’ะตั€ัˆะธะฝะฐ ัั‚ะตะบัƒ ะฒะธะฟั€ะฐะฒะปะตะฝัŒ"
-#: ../quickfix.c:1880
-#, c-format
-msgid "error list %d of %d; %d errors"
-msgstr "ัะฟะธัะพะบ ะฟะพะผะธะปะพะบ %d ะท %d; %d ะฟะพะผะธะปะพะบ"
+msgid "No entries"
+msgstr "ะั–ั‡ะพะณะพ"
-#: ../quickfix.c:2427
msgid "E382: Cannot write, 'buftype' option is set"
msgstr "E382: ะะต ะผะพะถัƒ ะทะฐะฟะธัะฐั‚ะธ, ะฒะบะฐะทะฐะฝะฐ ะพะฟั†ั–ั 'buftype'"
-#: ../quickfix.c:2812
msgid "E683: File name missing or invalid pattern"
msgstr "E683: ะŸั€ะพะฟัƒั‰ะตะฝะพ ะฝะฐะทะฒัƒ ั„ะฐะนะปัƒ ั‡ะธ ะฝะตะบะพั€ะตะบั‚ะฝะธะน ัˆะฐะฑะปะพะฝ"
-#: ../quickfix.c:2911
#, c-format
msgid "Cannot open file \"%s\""
msgstr "ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ั„ะฐะนะป ยซ%sยป"
-#: ../quickfix.c:3429
msgid "E681: Buffer is not loaded"
msgstr "E681: ะ‘ัƒั„ะตั€ ะฝะต ะทะฐะฒะฐะฝั‚ะฐะถะตะฝะพ"
-#: ../quickfix.c:3487
msgid "E777: String or List expected"
msgstr "E777: ะžั‡ั–ะบัƒั”ั‚ัŒัั String ั‡ะธ List"
-#: ../regexp.c:359
#, c-format
msgid "E369: invalid item in %s%%[]"
msgstr "E369: ะะตะบะพั€ะตะบั‚ะฝะธะน ะตะปะตะผะตะฝั‚ ัƒ %s%%[]"
-#: ../regexp.c:374
#, c-format
msgid "E769: Missing ] after %s["
msgstr "E769: ะ‘ั€ะฐะบัƒั” ] ะฟั–ัะปั %s["
-#: ../regexp.c:375
+msgid "E944: Reverse range in character class"
+msgstr "E944: ะ—ะฒะพั€ะพั‚ะฝั–ะน ะดั–ะฐะฟะฐะทะพะฝ ัƒ ะบะปะฐัั– ัะธะผะฒะพะปั–ะฒ"
+
+msgid "E945: Range too large in character class"
+msgstr "E945: ะ—ะฐะฒะตะปะธะบะธะน ะดั–ะฐะฟะฐะทะพะฝ ัƒ ะบะปะฐัั– ัะธะผะฒะพะปั–ะฒ"
+
#, c-format
msgid "E53: Unmatched %s%%("
msgstr "E53: ะะตะผะฐั” ะฟะฐั€ะธ %s%%("
-#: ../regexp.c:376
#, c-format
msgid "E54: Unmatched %s("
msgstr "E54: ะะตะผะฐั” ะฟะฐั€ะธ %s("
-#: ../regexp.c:377
#, c-format
msgid "E55: Unmatched %s)"
msgstr "E55: ะะตะผะฐั” ะฟะฐั€ะธ %s)"
-# msgstr "E406: "
-#: ../regexp.c:378
msgid "E66: \\z( not allowed here"
msgstr "E66: \\z( ั‚ัƒั‚ ะฝะต ะดะพะทะฒะพะปะตะฝะพ"
-# msgstr "E406: "
-#: ../regexp.c:379
-msgid "E67: \\z1 et al. not allowed here"
-msgstr "E67: \\z1 ั‚ะฐ ั–ะฝ. ั‚ัƒั‚ ะฝะต ะดะพะทะฒะพะปะตะฝะพ"
+msgid "E67: \\z1 - \\z9 not allowed here"
+msgstr "E67: \\z1 - \\z9 ั‚ัƒั‚ ะฝะต ะดะพะทะฒะพะปะตะฝะพ"
-#: ../regexp.c:380
#, c-format
msgid "E69: Missing ] after %s%%["
msgstr "E69: ะŸั€ะพะฟัƒั‰ะตะฝะพ ] ะฟั–ัะปั %s%%["
-#: ../regexp.c:381
#, c-format
msgid "E70: Empty %s%%[]"
msgstr "E70: %s%%[] ะฟะพั€ะพะถะฝั–ะน"
-# msgstr "E382: "
-#: ../regexp.c:1209 ../regexp.c:1224
msgid "E339: Pattern too long"
msgstr "E339: ะ—ั€ะฐะทะพะบ ะทะฐะฝะฐะดั‚ะพ ะดะพะฒะณะธะน"
-#: ../regexp.c:1371
msgid "E50: Too many \\z("
msgstr "E50: ะ—ะฐะฑะฐะณะฐั‚ะพ \\z("
-#: ../regexp.c:1378
#, c-format
msgid "E51: Too many %s("
msgstr "E51: ะ—ะฐะฑะฐะณะฐั‚ะพ %s("
-#: ../regexp.c:1427
msgid "E52: Unmatched \\z("
msgstr "E52: ะะตะผะฐั” ะฟะฐั€ะธ \\z("
-#: ../regexp.c:1637
#, c-format
msgid "E59: invalid character after %s@"
msgstr "E59: ะะตะดะพะทะฒะพะปะตะฝะธะน ัะธะผะฒะพะป ะฟั–ัะปั %s@"
-#: ../regexp.c:1672
#, c-format
msgid "E60: Too many complex %s{...}s"
msgstr "E60: ะ—ะฐะฑะฐะณะฐั‚ะพ ัะบะปะฐะดะฝะธั… %s{...}"
-# msgstr "E339: "
-#: ../regexp.c:1687
#, c-format
msgid "E61: Nested %s*"
msgstr "E61: ะ’ะบะปะฐะดะตะฝั– %s*"
-# msgstr "E61: "
-#: ../regexp.c:1690
#, c-format
msgid "E62: Nested %s%c"
msgstr "E62: ะ’ะบะปะฐะดะตะฝั– %s%c"
-#: ../regexp.c:1800
msgid "E63: invalid use of \\_"
msgstr "E63: ะะตะบะพั€ะตะบั‚ะฝะพ ะฒะถะธั‚ะพ \\_"
-# msgstr "E62: "
-#: ../regexp.c:1850
#, c-format
msgid "E64: %s%c follows nothing"
msgstr "E64: ะŸั–ัะปั %s%c ะฝั–ั‡ะพะณะพ ะฝะตะผะฐั”"
-#: ../regexp.c:1902
msgid "E65: Illegal back reference"
msgstr "E65: ะะตะบะพั€ะตะบั‚ะฝะต ะทะฒะพั€ะพั‚ะฝั” ะฟะพัะธะปะฐะฝะฝั"
-#: ../regexp.c:1943
msgid "E68: Invalid character after \\z"
msgstr "E68: ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ัะธะผะฒะพะป ะฟั–ัะปั \\z"
-#: ../regexp.c:2049 ../regexp_nfa.c:1296
#, c-format
msgid "E678: Invalid character after %s%%[dxouU]"
msgstr "E678: ะะตะดะพะทะฒะพะปะตะฝะธะน ัะธะผะฒะพะป ะฟั–ัะปั %s%%[dxouU]"
-#: ../regexp.c:2107
#, c-format
msgid "E71: Invalid character after %s%%"
msgstr "E71: ะะตะดะพะทะฒะพะปะตะฝะธะน ัะธะผะฒะพะป ะฟั–ัะปั %s%%"
-# msgstr "E64: "
-#: ../regexp.c:3017
+#, c-format
+msgid "E888: (NFA regexp) cannot repeat %s"
+msgstr "E888: (NFA regexp) ะฝะตะผะพะถะปะธะฒะพ ะฟะพะฒั‚ะพั€ะธั‚ะธ %s"
+
#, c-format
msgid "E554: Syntax error in %s{...}"
msgstr "E554: ะกะธะฝั‚ะฐะบัะธั‡ะฝะฐ ะฟะพะผะธะปะบะฐ ะฒ %s{...}"
-#: ../regexp.c:3805
msgid "External submatches:\n"
msgstr "ะ—ะพะฒะฝั–ัˆะฝั– ะฟั–ะด-ะทะฑั–ะณะธ:\n"
-#: ../regexp.c:7022
msgid ""
"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be "
"used "
@@ -5119,345 +4347,437 @@ msgstr ""
"E864: ะฟั–ัะปั \\%#= ะผะพะถะต ะฑัƒั‚ะธ ั‚ั–ะปัŒะบะธ 0, 1, or 2. ะ‘ัƒะดะต ะฒะธะบะพั€ะธัั‚ะฐะฝะพ ะฐะฒั‚ะพะผะฐั‚ะธั‡ะฝะธะน "
"ะผะตั…ะฐะฝั–ะทะผ "
-#: ../regexp_nfa.c:239
-msgid "E865: (NFA) Regexp end encountered prematurely"
-msgstr "E865: (NFA) ะ—ะฐั€ะฐะฝะพ ั‚ั€ะฐะฟะธะฒัั ะบั–ะฝะตั†ัŒ ั€ะตะณัƒะปัั€ะฝะพะณะพ ะฒะธั€ะฐะทัƒ"
+msgid "Switching to backtracking RE engine for pattern: "
+msgstr "ะŸะตั€ะตะผะธะบะฐะฝะฝั ะดะพ ะฟั€ะพัั‚ะพะณะพ ั€ัƒัˆั–ั ั€ะตะณัƒะปัั€ะฝะธั… ะฒะธั€ะฐะทั–ะฒ: "
-#: ../regexp_nfa.c:240
-#, c-format
-msgid "E866: (NFA regexp) Misplaced %c"
-msgstr "E866: (NFA regexp) ะะต ะฝะฐ ะผั–ัั†ั– %c"
+msgid " TERMINAL"
+msgstr " ะขะ•ะ ะœะ†ะะะ›"
-#: ../regexp_nfa.c:242
-#, c-format
-msgid "E877: (NFA regexp) Invalid character class: %<PRId64>"
-msgstr ""
-
-#: ../regexp_nfa.c:1261
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\z%c'"
-msgstr "E867: (NFA) ะะตะฒั–ะดะพะผะธะน ะพะฟะตั€ะฐั‚ะพั€ '\\z%c'"
-
-#: ../regexp_nfa.c:1387
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\%%%c'"
-msgstr "E867: (NFA) ะะตะฒั–ะดะพะผะธะน ะพะฟะตั€ะฐั‚ะพั€ '\\%%%c'"
-
-#: ../regexp_nfa.c:1802
-#, c-format
-msgid "E869: (NFA) Unknown operator '\\@%c'"
-msgstr "E869: (NFA) ะะตะฒั–ะดะพะผะธะน ะพะฟะตั€ะฐั‚ะพั€ '\\@%c'"
-
-#: ../regexp_nfa.c:1831
-msgid "E870: (NFA regexp) Error reading repetition limits"
-msgstr "E870: (NFA regexp) ะะต ะฒะดะฐะปะพัั ะฟั€ะพั‡ะธั‚ะฐั‚ะธ ะผะตะถั– ะฟะพะฒั‚ะพั€ะตะฝะฝั"
-
-#. Can't have a multi follow a multi.
-#: ../regexp_nfa.c:1895
-msgid "E871: (NFA regexp) Can't have a multi follow a multi !"
-msgstr "E871: (NFA regexp) ะœัƒะปัŒั‚ะธ ะฝะต ะผะพะถะต ะฑัƒั‚ะธ ะทะฐ ะผัƒะปัŒั‚ะธ!"
-
-#. Too many `('
-#: ../regexp_nfa.c:2037
-msgid "E872: (NFA regexp) Too many '('"
-msgstr "E872: (NFA regexp) ะ—ะฐะฑะฐะณะฐั‚ะพ '('"
-
-#: ../regexp_nfa.c:2042
-msgid "E879: (NFA regexp) Too many \\z("
-msgstr "E879: (NFA regexp) ะ—ะฐะฑะฐะณะฐั‚ะพ \\z("
-
-#: ../regexp_nfa.c:2066
-msgid "E873: (NFA regexp) proper termination error"
-msgstr "E873: (NFA regexp) ะฟะพะผะธะปะบะฐ ะฝะฐะปะตะถะฝะพะณะพ ะฟั€ะธะฟะธะฝะตะฝะฝั"
-
-#: ../regexp_nfa.c:2599
-msgid "E874: (NFA) Could not pop the stack !"
-msgstr "E874: (NFA) ะกั‚ะตะบ ะฟะพั€ะพะถะฝั–ะน!"
-
-#: ../regexp_nfa.c:3298
-msgid ""
-"E875: (NFA regexp) (While converting from postfix to NFA), too many states "
-"left on stack"
-msgstr ""
-"E875: (NFA regexp) (ะŸั–ะด ั‡ะฐั ะฟะตั€ะตั‚ะฒะพั€ะตะฝะฝั ะท ะฟะพัั‚ั„ั–ะบั ัƒ NFA) ะทะฐะปะธัˆะธะปะพัั "
-"ะทะฐะฑะฐะณะฐั‚ะพ ัั‚ะฐะฝั–ะฒ ัƒ ัั‚ะตะบัƒ"
-
-#: ../regexp_nfa.c:3302
-msgid "E876: (NFA regexp) Not enough space to store the whole NFA "
-msgstr "E876: (NFA regexp) ะะตะดะพัั‚ะฐั‚ะฝัŒะพ ะฟะฐะผโ€™ัั‚ั–, ั‰ะพะฑ ะทะฑะตั€ะตะณั‚ะธ ะฒะตััŒ NFA "
-
-#: ../regexp_nfa.c:4571 ../regexp_nfa.c:4869
-msgid ""
-"Could not open temporary log file for writing, displaying on stderr ... "
-msgstr ""
-"ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ั‚ะธะผั‡ะฐัะพะฒะธะน ั„ะฐะนะป ะถัƒั€ะฝะฐะปัƒ ะดะปั ะทะฐะฟะธััƒ, ะฟะพะบะฐะทัƒั”ั‚ัŒัั ะฝะฐ "
-"stderr ... "
-
-#: ../regexp_nfa.c:4840
-#, c-format
-msgid "(NFA) COULD NOT OPEN %s !"
-msgstr "(NFA) ะะ• ะ’ะ”ะะ›ะžะกะฏ ะ’ะ†ะ”ะšะ ะ˜ะขะ˜ %s!"
-
-#: ../regexp_nfa.c:6049
-msgid "Could not open temporary log file for writing "
-msgstr "ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ั‚ะธะผั‡ะฐัะพะฒะธะน ั„ะฐะนะป ะถัƒั€ะฝะฐะปัƒ ะดะปั ะทะฐะฟะธััƒ "
-
-#: ../screen.c:7435
msgid " VREPLACE"
msgstr " ะ’ะ†ะ ะข ะ—ะะœะ†ะะ"
-#: ../screen.c:7437
msgid " REPLACE"
msgstr " ะ—ะะœะ†ะะ"
-#: ../screen.c:7440
msgid " REVERSE"
msgstr " ะะะ’ะ˜ะ’ะžะ ะ†ะข"
-#: ../screen.c:7441
msgid " INSERT"
-msgstr " ะ’ะกะขะะ’ะšะ"
+msgstr " ะ’ะกะขะะ’ะ˜ะขะ˜"
-#: ../screen.c:7443
msgid " (insert)"
-msgstr " (ะฒัั‚ะฐะฒะบะฐ)"
+msgstr " (ะฒัั‚ะฐะฒะธั‚ะธ)"
-#: ../screen.c:7445
msgid " (replace)"
msgstr " (ะทะฐะผั–ะฝะฐ)"
-#: ../screen.c:7447
msgid " (vreplace)"
msgstr " (ะฒั–ั€ั‚ ะทะฐะผั–ะฝะฐ)"
-#: ../screen.c:7449
msgid " Hebrew"
msgstr " ะ†ะฒั€ะธั‚"
-#: ../screen.c:7454
msgid " Arabic"
msgstr " ะั€ะฐะฑััŒะบะฐ"
-#: ../screen.c:7456
-msgid " (lang)"
-msgstr " (ะผะพะฒะฐ)"
-
-#: ../screen.c:7459
msgid " (paste)"
msgstr " (ะบะปะตะน)"
-#: ../screen.c:7469
msgid " VISUAL"
msgstr " ะ’ะ˜ะ‘ะ†ะ "
-#: ../screen.c:7470
msgid " VISUAL LINE"
msgstr " ะ’ะ˜ะ‘ะ†ะ  ะ ะฏะ”ะšะ†ะ’"
-#: ../screen.c:7471
msgid " VISUAL BLOCK"
msgstr " ะ’ะ˜ะ‘ะ†ะ  ะ‘ะ›ะžะšะฃ"
-#: ../screen.c:7472
msgid " SELECT"
msgstr " ะ’ะ˜ะ”ะ†ะ›ะ•ะะะฏ"
-#: ../screen.c:7473
msgid " SELECT LINE"
msgstr " ะ’ะ˜ะ”ะ†ะ›ะ•ะะะฏ ะ ะฏะ”ะšะ†ะ’"
-#: ../screen.c:7474
msgid " SELECT BLOCK"
msgstr " ะ’ะ˜ะ”ะ†ะ›ะ•ะะะฏ ะ‘ะ›ะžะšะฃ"
-#: ../screen.c:7486 ../screen.c:7541
msgid "recording"
msgstr "ะนะดะต ะทะฐะฟะธั"
-#: ../search.c:487
#, c-format
msgid "E383: Invalid search string: %s"
msgstr "E383: ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ะทั€ะฐะทะพะบ ะดะปั ะฟะพัˆัƒะบัƒ: %s"
-#: ../search.c:832
#, c-format
msgid "E384: search hit TOP without match for: %s"
msgstr "E384: ะŸะพัˆัƒะบ ะดั–ะนัˆะพะฒ ะดะพ ะŸะžะงะะขะšะฃ ะฑะตะท ะทะฑั–ะณั–ะฒ ะท %s"
-#: ../search.c:835
#, c-format
msgid "E385: search hit BOTTOM without match for: %s"
msgstr "E385: ะŸะพัˆัƒะบ ะดั–ะนัˆะพะฒ ะดะพ ะšะ†ะะฆะฏ ะฑะตะท ะทะฑั–ะณั–ะฒ ะท %s"
-#: ../search.c:1200
msgid "E386: Expected '?' or '/' after ';'"
msgstr "E386: ะŸั–ัะปั `;' ะผะฐั” ะฑัƒั‚ะธ `?' ะฐะฑะพ `/'"
-# msgstr "E386: "
-#: ../search.c:4085
msgid " (includes previously listed match)"
msgstr " (ั€ะฐะทะพะผ ะท ะฟะพะฟะตั€ะตะดะฝั–ะผะธ ะทะฑั–ะณะฐะผะธ)"
-#. cursor at status line
-#: ../search.c:4104
msgid "--- Included files "
msgstr "--- ะ’ะบะปัŽั‡ะตะฝั– ั„ะฐะนะปะธ "
-#: ../search.c:4106
msgid "not found "
msgstr "ะฝะต ะทะฝะฐะนะดะตะฝะพ "
-#: ../search.c:4107
msgid "in path ---\n"
msgstr "ัƒ ัˆะปัั…ัƒ ะฟะพัˆัƒะบัƒ ---\n"
-#: ../search.c:4168
msgid " (Already listed)"
msgstr " (ะฃะถะต ัƒ ัะฟะธัะบัƒ)"
-#: ../search.c:4170
msgid " NOT FOUND"
msgstr " ะะ• ะ—ะะะ™ะ”ะ•ะะž"
-#: ../search.c:4211
#, c-format
msgid "Scanning included file: %s"
msgstr "ะŸะพัˆัƒะบ ัƒ ะฒะบะปัŽั‡ะตะฝะพะผัƒ ั„ะฐะนะปั–: %s"
-#: ../search.c:4216
#, c-format
msgid "Searching included file %s"
msgstr "ะจัƒะบะฐั”ั‚ัŒัั ัƒ ะฒะบะปัŽั‡ะตะฝะพะผัƒ ั„ะฐะนะปั– %s"
-#: ../search.c:4405
msgid "E387: Match is on current line"
msgstr "E387: ะ—ะฑั–ะณ ัƒ ะฟะพั‚ะพั‡ะฝะพะผัƒ ั€ัะดะบัƒ"
-#: ../search.c:4517
msgid "All included files were found"
msgstr "ะ‘ัƒะปะธ ะทะฝะฐะนะดะตะฝั– ะฒัั– ะฒะบะปัŽั‡ะตะฝั– ั„ะฐะนะปะธ"
-#: ../search.c:4519
msgid "No included files"
msgstr "ะ–ะพะดะฝะพะณะพ ะฒะบะปัŽั‡ะตะฝะพะณะพ ั„ะฐะนะปัƒ"
-#: ../search.c:4527
msgid "E388: Couldn't find definition"
msgstr "E388: ะ’ะธะทะฝะฐั‡ะตะฝะฝั ะฝะต ะทะฝะฐะนะดะตะฝะพ"
-#: ../search.c:4529
msgid "E389: Couldn't find pattern"
msgstr "E389: ะ—ั€ะฐะทะพะบ ะฝะต ะทะฝะฐะนะดะตะฝะพ"
-#: ../search.c:4668
-msgid "Substitute "
-msgstr "ะ—ะฐะผั–ะฝะฐ "
+msgid "too few bytes read"
+msgstr "ะฟั€ะพั‡ะธั‚ะฐะฝะพ ะทะฐะผะฐะปะพ ะฑะฐะนั‚ั–ะฒ"
+
+#, c-format
+msgid "System error while skipping in ShaDa file: %s"
+msgstr "ะกะธัั‚ะตะผะฝะฐ ะฟะพะผะธะปะบะฐ ะฟั€ะธ ะฟั€ะพะฟัƒัะบะฐะฝะฝั– ัƒ ั„ะฐะนะปั– ShaDa: %s"
-#: ../search.c:4681
#, c-format
msgid ""
-"\n"
-"# Last %sSearch Pattern:\n"
-"~"
+"Error while reading ShaDa file: last entry specified that it occupies "
+"%<PRIu64> bytes, but file ended earlier"
msgstr ""
-"\n"
-"# ะžัั‚. %sะ—ั€ะฐะทะพะบ ะฟะพัˆัƒะบัƒ:\n"
-"~"
+"ะŸะพะผะธะปะบะฐ ะฟั€ะธ ั‡ะธั‚ะฐะฝะฝั– ั„ะฐะนะปัƒ ShaDa: ะพัั‚ะฐะฝะฝั” ะฟะพะปะต ะทะฐะทะฝะฐั‡ะธะปะพ, ั‰ะพ ะฒะพะฝะพ ะทะฐะนะผะฐั” "
+"%<PRIu64> ะฑะฐะนั‚ั–ะฒ, ะฐะปะต ั„ะฐะนะป ะทะฐะบั–ะฝั‡ะธะฒัั ั€ะฐะฝั–ัˆะต"
+
+#, c-format
+msgid "System error while closing ShaDa file: %s"
+msgstr "ะกะธัั‚ะตะผะฝะฐ ะฟะพะผะธะปะบะฐ ะฟั€ะธ ะทะฐะบั€ะธั‚ั‚ั– ั„ะฐะนะปัƒ ShaDa: %s"
+
+#, c-format
+msgid "System error while writing ShaDa file: %s"
+msgstr "ะกะธัั‚ะตะผะฝะฐ ะฟะพะผะธะปะบะฐ ะฟั€ะธ ั‡ะธั‚ะฐะฝะฝั– ะท ั„ะฐะนะปัƒ ShaDa: %s"
+
+#, c-format
+msgid "Reading ShaDa file \"%s\"%s%s%s%s"
+msgstr "ะ—ั‡ะธั‚ัƒั”ั‚ัŒัั ั„ะฐะนะป ShaDa: ยซ%sยป%s%s%s%s"
+
+msgid " info"
+msgstr " ั–ะฝั„ะพั€ะผะฐั†ั–ั"
+
+msgid " marks"
+msgstr " ะฟะพะทะฝะฐั‡ะบะธ"
+
+msgid " oldfiles"
+msgstr " ัั‚ะฐั€ั– ั„ะฐะนะปะธ"
+
+msgid " FAILED"
+msgstr " ะะ• ะ’ะ”ะะ›ะžะกะฏ"
+
+#, c-format
+msgid "System error while opening ShaDa file %s for reading: %s"
+msgstr "ะกะธัั‚ะตะผะฝะฐ ะฟะพะผะธะปะบะฐ ะฟั€ะธ ะฒั–ะดะบั€ะธั‚ั‚ั– ั„ะฐะนะปัƒ ShaDa %s ะดะปั ั‡ะธั‚ะฐะฝะฝั: %s"
+
+msgid "additional elements of ShaDa "
+msgstr "ะดะพะดะฐั‚ะบะพะฒั– ะตะปะตะผะตะฝั‚ะธ ShaDa "
+
+msgid "additional data of ShaDa "
+msgstr "ะดะพะดะฐั‚ะบะพะฒั– ะดะฐะฝั– ShaDa "
+
+#, c-format
+msgid "Failed to write variable %s"
+msgstr "ะะต ะฒะดะฐะปะพัั ะทะฐะฟะธัะฐั‚ะธ ะทะผั–ะฝะฝัƒ %s"
+
+#, c-format
+msgid ""
+"Failed to parse ShaDa file due to a msgpack parser error at position "
+"%<PRIu64>"
+msgstr ""
+"ะะต ะฒะดะฐะปะพัั ั€ะพะทั–ะฑั€ะฐั‚ะธ ั„ะฐะนะป ShaDa ั‡ะตั€ะตะท ะฟะพะผะธะปะบัƒ ั€ะพะทะฑะพั€ัƒ msgpack ัƒ ะฟะพะทะธั†ั–ั— "
+"%<PRIu64>"
+
+#, c-format
+msgid ""
+"Failed to parse ShaDa file: incomplete msgpack string at position %<PRIu64>"
+msgstr ""
+"ะะต ะฒะดะฐะปะพัั ั€ะพะทั–ะฑั€ะฐั‚ะธ ั„ะฐะนะป ShaDa: ะฝะตะฟะพะฒะฝะธะน ั‚ะตะบัั‚ msgpack ัƒ ะฟะพะทะธั†ั–ั— %<PRIu64>"
+
+#, c-format
+msgid ""
+"Failed to parse ShaDa file: extra bytes in msgpack string at position "
+"%<PRIu64>"
+msgstr ""
+"ะะต ะฒะดะฐะปะพัั ั€ะพะทั–ะฑั€ะฐั‚ะธ ั„ะฐะนะป ShaDa: ะทะฐะนะฒั– ะฑะฐะนั‚ะธ ัƒ ั‚ะตะบัั‚ั– msgpack ัƒ ะฟะพะทะธั†ั–ั— "
+"%<PRIu64>"
+
+#, c-format
+msgid ""
+"System error while opening ShaDa file %s for reading to merge before writing "
+"it: %s"
+msgstr ""
+"ะกะธัั‚ะตะผะฝะฐ ะฟะพะผะธะปะบะฐ ะฟั€ะธ ะฒั–ะดะบั€ะธั‚ั‚ั– ั„ะฐะนะปัƒ ShaDa %s ะดะปั ั‡ะธั‚ะฐะฝะฝั ั‰ะพะฑ ะฒะธะบะพะฝะฐั‚ะธ "
+"ะทะปะธั‚ั‚ั ะฟะตั€ะตะด ะทะฐะฟะธัะพะผ: %s"
+
+#, c-format
+msgid "E138: All %s.tmp.X files exist, cannot write ShaDa file!"
+msgstr "E138: ะฃัั– ั„ะฐะนะปะธ %s.tmp.X ะทะฐะนะฝัั‚ะพ, ะฝะตะผะพะถะปะธะฒะพ ะทะฐะฟะธัะฐั‚ะธ ั„ะฐะนะป ShaDa!"
+
+#, c-format
+msgid "System error while opening temporary ShaDa file %s for writing: %s"
+msgstr ""
+"ะกะธัั‚ะตะผะฝะฐ ะฟะพะผะธะปะบะฐ ะฟั€ะธ ะฒั–ะดะบั€ะธั‚ั‚ั– ั‚ะธะผั‡ะฐัะพะฒะพะณะพ ั„ะฐะนะปัƒ ShaDa %s ะดะปั ะทะฐะฟะธััƒ: %s"
+
+#, c-format
+msgid "Failed to create directory %s for writing ShaDa file: %s"
+msgstr "ะะต ะฒะดะฐะปะพัั ัั‚ะฒะพั€ะธั‚ะธ ะบะฐั‚ะฐะปะพะณ %s ะดะปั ะทะฐะฟะธััƒ ั„ะฐะนะปัƒ ShaDa: %s"
+
+#, c-format
+msgid "System error while opening ShaDa file %s for writing: %s"
+msgstr "ะกะธัั‚ะตะผะฝะฐ ะฟะพะผะธะปะบะฐ ะฟั€ะธ ะฒั–ะดะบั€ะธั‚ั‚ั– ั„ะฐะนะปัƒ ShaDa %s ะดะปั ะทะฐะฟะธััƒ: %s"
+
+#, c-format
+msgid "Writing ShaDa file \"%s\""
+msgstr "ะ—ะฐะฟะธััƒั”ั‚ัŒัั ั„ะฐะนะป ShaDa ยซ%sยป"
+
+#, c-format
+msgid "Failed setting uid and gid for file %s: %s"
+msgstr "ะะต ะฒะดะฐะปะพัั ะฒัั‚ะฐะฝะพะฒะธั‚ะธ uid ั– gid ะดะปั ั„ะฐะนะปัƒ %s: %s"
+
+#, c-format
+msgid "E137: ShaDa file is not writable: %s"
+msgstr "E137: ะะต ะดะพะทะฒะพะปะตะฝะพ ะทะฐะฟะธั ัƒ ั„ะฐะนะป ShaDa: %s"
+
+#, c-format
+msgid "Can't rename ShaDa file from %s to %s!"
+msgstr "ะะต ะฒะดะฐะปะพัั ะฟะตั€ะตะนะผะตะฝัƒะฒะฐั‚ะธ ั„ะฐะนะป ShaDa ะท %s ัƒ %s!"
+
+#, c-format
+msgid "Did not rename %s because %s does not look like a ShaDa file"
+msgstr "ะะต ะฟะตั€ะตะนะผะตะฝัƒะฒะฐะฒ %s, ั‚ะพะผัƒ ั‰ะพ %s ะฝะต ัั…ะพะถะธะน ะฝะฐ ั„ะฐะนะป ShaDa"
+
+#, c-format
+msgid "Did not rename %s to %s because there were errors during writing it"
+msgstr "ะะต ะฒะดะฐะปะพัั ะฟะตั€ะตะนะผะตะฝัƒะฒะฐั‚ะธ %s ัƒ %s ั‡ะตั€ะตะท ะฟะพะผะธะปะบะธ ะฟั–ะด ั‡ะฐั ะทะฐะฟะธััƒ"
+
+#, c-format
+msgid "Do not forget to remove %s or rename it manually to %s."
+msgstr "ะะต ะทะฐะฑัƒะดัŒั‚ะต ะทะฝะธั‰ะธั‚ะธ %s ั‡ะธ ะฟะตั€ะตะนะผะตะฝัƒะฒะฐั‚ะธ ะนะพะณะพ ัะฐะผะพัั‚ั–ะนะฝะพ ัƒ %s."
+
+#, c-format
+msgid "System error while reading ShaDa file: %s"
+msgstr "ะกะธัั‚ะตะผะฝะฐ ะฟะพะผะธะปะบะฐ ะฟั€ะธ ั‡ะธั‚ะฐะฝะฝั– ั„ะฐะนะปัƒ ShaDa: %s"
+
+#, c-format
+msgid "System error while reading integer from ShaDa file: %s"
+msgstr "ะกะธัั‚ะตะผะฝะฐ ะฟะพะผะธะปะบะฐ ะฟั€ะธ ั‡ะธั‚ะฐะฝะฝั– ั†ั–ะปะพะณะพ ั‡ะธัะปะฐ ะท ั„ะฐะนะปัƒ ShaDa: %s"
+
+#, c-format
+msgid ""
+"Error while reading ShaDa file: expected positive integer at position "
+"%<PRIu64>, but got nothing"
+msgstr ""
+"ะŸะพะผะธะปะบะฐ ะฟั€ะธ ั‡ะธั‚ะฐะฝะฝั– ั„ะฐะนะปัƒ ShaDa: ะพั‡ั–ะบัƒะฒะฐะปะพัั ะดะพะดะฐั‚ะฝะต ั‡ะธัะปะพ ัƒ ะฟะพะทะธั†ั–ั— "
+"%<PRIu64>, ะฐะปะต ะฝั–ั‡ะพะณะพ ะฝะตะผะฐั”"
+
+#, c-format
+msgid ""
+"Error while reading ShaDa file: expected positive integer at position "
+"%<PRIu64>"
+msgstr ""
+"ะŸะพะผะธะปะบะฐ ะฟั€ะธ ั‡ะธั‚ะฐะฝะฝั– ั„ะฐะนะปัƒ ShaDa: ะพั‡ั–ะบัƒะฒะฐะปะพัั ะดะพะดะฐั‚ะฝะต ั‡ะธัะปะพ ัƒ ะฟะพะทะธั†ั–ั— "
+"%<PRIu64>"
+
+#, c-format
+msgid ""
+"Error while reading ShaDa file: there is an item at position %<PRIu64> that "
+"is stated to be too long"
+msgstr "ะŸะพะผะธะปะบะฐ ั‡ะธั‚ะฐะฝะฝั ั„ะฐะนะปัƒ ShaDa: ั” ะทะฐะดะพะฒะณะธะน ะตะปะตะผะตะฝั‚ ัƒ ะฟะพะทะธั†ั–ั— %<PRIu64>"
+
+#, c-format
+msgid ""
+"Error while reading ShaDa file: there is an item at position %<PRIu64> that "
+"must not be there: Missing items are for internal uses only"
+msgstr ""
+"ะŸะพะผะธะปะบะฐ ะฟั€ะธ ั‡ะธั‚ะฐะฝะฝั– ั„ะฐะนะปัƒ ShaDa: ะฝะตะพั‡ั–ะบัƒะฒะฐะฝะธะน ะตะปะตะผะตะฝั‚ ัƒ ะฟะพะทะธั†ั–ั— %<PRIu64>: "
+"ะŸั€ะพะฟัƒั‰ะตะฝั– ะตะปะตะผะตะฝั‚ะธ ั‚ั–ะปัŒะบะธ ะดะปั ะฒะฝัƒั‚ั€ั–ัˆะฝัŒะพะณะพ ะฒะถะธั‚ะบัƒ"
+
+#, c-format
+msgid ""
+"Error while reading ShaDa file: buffer list at position %<PRIu64> contains "
+"entry that is not a dictionary"
+msgstr ""
+"ะŸะพะผะธะปะบะฐ ะฟั€ะธ ั‡ะธั‚ะฐะฝะฝั– ั„ะฐะนะปัƒ ShaDa: ัะฟะธัะพะบ ะฑัƒั„ะตั€ั–ะฒ ัƒ ะฟะพะทะธั†ั–ั— %<PRIu64> ะผั–ัั‚ะธั‚ัŒ "
+"ะฟะพะปะต, ัะบะต ะฝะต ั” ัะปะพะฒะฝะธะบะพะผ"
+
+#, c-format
+msgid ""
+"Error while reading ShaDa file: buffer list at position %<PRIu64> contains "
+"entry with invalid line number"
+msgstr ""
+"ะŸะพะผะธะปะบะฐ ะฟั€ะธ ั‡ะธั‚ะฐะฝะฝั– ั„ะฐะนะปัƒ ShaDa: ัะฟะธัะพะบ ะฑัƒั„ะตั€ั–ะฒ ัƒ ะฟะพะทะธั†ั–ั— %<PRIu64> ะผั–ัั‚ะธั‚ัŒ "
+"ะฟะพะปะต ะท ะฝะตะบะพั€ะตะบั‚ะฝะธะผ ะฝะพะผะตั€ะพะผ ั€ัะดะบะฐ"
+
+#, c-format
+msgid ""
+"Error while reading ShaDa file: buffer list at position %<PRIu64> contains "
+"entry with invalid column number"
+msgstr ""
+"ะŸะพะผะธะปะบะฐ ะฟั€ะธ ั‡ะธั‚ะฐะฝะฝั– ั„ะฐะนะปัƒ ShaDa: ัะฟะธัะพะบ ะฑัƒั„ะตั€ั–ะฒ ัƒ ะฟะพะทะธั†ั–ั— %<PRIu64> ะผั–ัั‚ะธั‚ัŒ "
+"ะฟะพะปะต ะท ะฝะตะบะพั€ะตะบั‚ะฝะธะผ ะฝะพะผะตั€ะพะผ ัั‚ะพะฒะฟั†ั"
+
+#, c-format
+msgid ""
+"Error while reading ShaDa file: buffer list at position %<PRIu64> contains "
+"entry that does not have a file name"
+msgstr ""
+"ะŸะพะผะธะปะบะฐ ะฟั€ะธ ั‡ะธั‚ะฐะฝะฝั– ั„ะฐะนะปัƒ ShaDa: ัะฟะธัะพะบ ะฑัƒั„ะตั€ั–ะฒ ัƒ ะฟะพะทะธั†ั–ั— %<PRIu64> ะผั–ัั‚ะธั‚ัŒ "
+"ะฟะพะปะต, ัะบะต ะฝะต ะผะฐั” ะฝะฐะทะฒัƒ ั„ะฐะนะปัƒ"
-#: ../spell.c:951
msgid "E759: Format error in spell file"
msgstr "E759: ะŸะพะผะธะปะบะฐ ั„ะพั€ะผะฐั‚ัƒ ัƒ ั„ะฐะนะปั– ะพั€ั„ะพะณั€ะฐั„ั–ั—"
-# msgstr "E364: "
-#: ../spell.c:952
+msgid "E756: Spell checking is not enabled"
+msgstr "E756: ะŸะตั€ะตะฒั–ั€ะบะฐ ะพั€ั„ะพะณั€ะฐั„ั–ั— ะฝะต ะดะพะทะฒะพะปะตะฝะฐ"
+
+#, c-format
+msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
+msgstr ""
+"ะ—ะฐัั‚ะตั€ะตะถะตะฝะฝั: ะะต ะฒะดะฐะปะพัั ะทะฝะฐะนั‚ะธ ัะฟะธัะพะบ ัะปั–ะฒ ยซ%s.%s.splยป ั‡ะธ ยซ%s.ascii.splยป"
+
+msgid "E797: SpellFileMissing autocommand deleted buffer"
+msgstr "E797: ะะฒั‚ะพะบะพะผะฐะฝะดะฐ SpellFileMissing ะทะฝะธั‰ะธะปะฐ ะฑัƒั„ะตั€"
+
+#, c-format
+msgid "Warning: region %s not supported"
+msgstr "ะ—ะฐัั‚ะตั€ะตะถะตะฝะฝั: ั€ะตะณั–ะพะฝ %s ะฝะต ะฟั–ะดั‚ั€ะธะผัƒั”ั‚ัŒัั"
+
+msgid "Sorry, no suggestions"
+msgstr "ะŸั€ะพะฑะฐั‡ั‚ะต, ะฝะตะผะฐั” ะฟั€ะพะฟะพะทะธั†ั–ะน"
+
+#, c-format
+msgid "Sorry, only %<PRId64> suggestions"
+msgstr "ะŸั€ะพะฑะฐั‡ั‚ะต, ั‚ั–ะปัŒะบะธ %<PRId64> ะฟั€ะพะฟะพะทะธั†ั–ะน"
+
+#, c-format
+msgid "Change \"%.*s\" to:"
+msgstr "ะ—ะฐะผั–ะฝะธั‚ะธ ยซ%.*sยป ะฝะฐ:"
+
+#, c-format
+msgid " < \"%.*s\""
+msgstr " < ยซ%.*sยป"
+
+msgid "E752: No previous spell replacement"
+msgstr "E752: ะะตะผะฐั” ะฟะพะฟะตั€ะตะดะฝัŒะพั— ะทะฐะผั–ะฝะธ"
+
+#, c-format
+msgid "E753: Not found: %s"
+msgstr "E753: ะะต ะทะฝะฐะนะดะตะฝะพ: %s"
+
msgid "E758: Truncated spell file"
msgstr "E758: ะžะฑั–ั€ะฒะฐะฝะธะน ั„ะฐะนะป ะพั€ั„ะพะณั€ะฐั„ั–ั—"
-#: ../spell.c:953
#, c-format
msgid "Trailing text in %s line %d: %s"
msgstr "ะ—ะฐะนะฒะธะน ั‚ะตะบัั‚ ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
-#: ../spell.c:954
#, c-format
msgid "Affix name too long in %s line %d: %s"
msgstr "ะะฐะทะฒะฐ ะฐั„ั–ะบััƒ ะทะฐะฒะตะปะธะบะฐ ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
-# msgstr "E430: "
-#: ../spell.c:955
msgid "E761: Format error in affix file FOL, LOW or UPP"
msgstr "E761: ะŸะพะผะธะปะบะฐ ั„ะพั€ะผะฐั‚ัƒ ัƒ ั„ะฐะนะปั– ะฐั„ั–ะบัั–ะฒ FOL, LOW ั‡ะธ UPP"
-#: ../spell.c:957
msgid "E762: Character in FOL, LOW or UPP is out of range"
msgstr "E762: ะกะธะผะฒะพะป ัƒ FOL, LOW ั‡ะธ UPP ะฟะพะทะฐ ะผะตะถะฐะผะธ"
-#: ../spell.c:958
msgid "Compressing word tree..."
msgstr "ะกั‚ะธัะบัƒั”ั‚ัŒัั ะดะตั€ะตะฒะพ ัะปั–ะฒ..."
-#: ../spell.c:1951
-msgid "E756: Spell checking is not enabled"
-msgstr "E756: ะŸะตั€ะตะฒั–ั€ะบะฐ ะพั€ั„ะพะณั€ะฐั„ั–ั— ะฝะต ะดะพะทะฒะพะปะตะฝะฐ"
-
-#: ../spell.c:2249
-#, c-format
-msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
-msgstr ""
-"ะ—ะฐัั‚ะตั€ะตะถะตะฝะฝั: ะะต ะฒะดะฐะปะพัั ะทะฝะฐะนั‚ะธ ัะฟะธัะพะบ ัะปั–ะฒ ยซ%s.%s.splยป ั‡ะธ ยซ%s.ascii.splยป"
-
-#: ../spell.c:2473
#, c-format
msgid "Reading spell file \"%s\""
msgstr "ะงะธั‚ะฐั”ั‚ัŒัั ั„ะฐะนะป ะพั€ั„ะพะณั€ะฐั„ั–ั— ยซ%sยป"
-#: ../spell.c:2496
msgid "E757: This does not look like a spell file"
msgstr "E757: ะะต ัั…ะพะถะต ะฝะฐ ั„ะฐะนะป ะพั€ั„ะพะณั€ะฐั„ั–ั—"
-#: ../spell.c:2501
+#, c-format
+msgid "E5042: Failed to read spell file %s: %s"
+msgstr "E5042: ะะต ะฒะดะฐะปะพัั ะฟั€ะพั‡ะธั‚ะฐั‚ะธ ั„ะฐะนะป ะฟั€ะฐะฒะพะฟะธััƒ %s: %s"
+
msgid "E771: Old spell file, needs to be updated"
msgstr "E771: ะคะฐะนะป ะพั€ั„ะพะณั€ะฐั„ั–ั— ัั‚ะฐั€ะธะน, ั‚ั€ะตะฑะฐ ะฟะพะฝะพะฒะธั‚ะธ"
-#: ../spell.c:2504
msgid "E772: Spell file is for newer version of Vim"
msgstr "E772: ะคะฐะนะป ะพั€ั„ะพะณั€ะฐั„ั–ั— ะฟั€ะธะทะฝะฐั‡ะตะฝะธะน ะดะปั ะฑั–ะปัŒัˆ ะฝะพะฒะพั— ะฒะตั€ัั–ั— Vim"
-#: ../spell.c:2602
msgid "E770: Unsupported section in spell file"
msgstr "E770: ะะตะดะพะทะฒะพะปะตะฝะฐ ัะตะบั†ั–ั ัƒ ั„ะฐะนะปั– ะพั€ั„ะพะณั€ะฐั„ั–ั—"
-#: ../spell.c:3762
#, c-format
-msgid "Warning: region %s not supported"
-msgstr "ะ—ะฐัั‚ะตั€ะตะถะตะฝะฝั: ั€ะตะณั–ะพะฝ %s ะฝะต ะฟั–ะดั‚ั€ะธะผัƒั”ั‚ัŒัั"
+msgid "E778: This does not look like a .sug file: %s"
+msgstr "E778: ะะต ัั…ะพะถะต ะฝะฐ ั„ะฐะนะป .sug: %s"
+
+#, c-format
+msgid "E779: Old .sug file, needs to be updated: %s"
+msgstr "E779: ะ—ะฐัั‚ะฐั€ั–ะปะธะน ั„ะฐะนะป .sug, ั‚ั€ะตะฑะฐ ะฟะพะฝะพะฒะธั‚ะธ: %s"
+
+#, c-format
+msgid "E780: .sug file is for newer version of Vim: %s"
+msgstr "E780: ะคะฐะนะป .sug ะดะปั ะฑั–ะปัŒัˆ ะฝะพะฒะพั— ะฒะตั€ัั–ั— Vim: %s"
+
+#, c-format
+msgid "E781: .sug file doesn't match .spl file: %s"
+msgstr "E781: ะคะฐะนะป .sug ะฝะต ะฒั–ะดะฟะพะฒั–ะดะฐั” ั„ะฐะนะปัƒ .spl: %s"
+
+#, c-format
+msgid "E782: error while reading .sug file: %s"
+msgstr "E782: ะŸะพะผะธะปะบะฐ ั‡ะธั‚ะฐะฝะฝั ั„ะฐะนะปัƒ .sug: %s"
-#: ../spell.c:4550
#, c-format
-msgid "Reading affix file %s ..."
-msgstr "ะงะธั‚ะฐั”ั‚ัŒัั ั„ะฐะนะป ะฐั„ั–ะบัั–ะฒ %s ..."
+msgid "Reading affix file %s..."
+msgstr "ะงะธั‚ะฐั”ั‚ัŒัั ั„ะฐะนะป ะฐั„ั–ะบัั–ะฒ %s..."
-#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
#, c-format
msgid "Conversion failure for word in %s line %d: %s"
msgstr "ะŸะพะผะธะปะบะฐ ะฟะตั€ะตั‚ะฒะพั€ะตะฝะฝั ัะปะพะฒะฐ ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
-#: ../spell.c:4630 ../spell.c:6170
#, c-format
msgid "Conversion in %s not supported: from %s to %s"
msgstr "ะŸะตั€ะตั‚ะฒะพั€ะตะฝะฝั ัƒ %s ะฝะต ะฟั–ะดั‚ั€ะธะผัƒั”ั‚ัŒัั: ะท %s ะดะพ %s"
-#: ../spell.c:4642
#, c-format
msgid "Invalid value for FLAG in %s line %d: %s"
msgstr "ะะตะบะพั€ะตะบั‚ะฝะต ะทะฝะฐั‡ะตะฝะฝั FLAG ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
-#: ../spell.c:4655
#, c-format
msgid "FLAG after using flags in %s line %d: %s"
msgstr "FLAG ะฟั–ัะปั ะฒะธะบะพั€ะธัั‚ะฐะฝะฝั ะฟั€ะฐะฟะพั€ั†ั–ะฒ ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
-#: ../spell.c:4723
#, c-format
msgid ""
"Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line "
@@ -5466,7 +4786,6 @@ msgstr ""
"ะ’ะธะทะฝะฐั‡ะตะฝะฝั COMPOUNDFORBIDFLAG ะฟั–ัะปั ะตะปะตะผะตะฝั‚ัƒ PFX ะผะพะถะต ะดะฐั‚ะธ ะฝะตะฟั€ะฐะฒะธะปัŒะฝะธะน "
"ั€ะตะทัƒะปัŒั‚ะฐั‚ ัƒ %s ัƒ ั€ัะดะบัƒ %d"
-#: ../spell.c:4731
#, c-format
msgid ""
"Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line "
@@ -5475,382 +4794,292 @@ msgstr ""
"ะ’ะธะทะฝะฐั‡ะตะฝะฝั COMPOUNDPERMITFLAG ะฟั–ัะปั ะตะปะตะผะตะฝั‚ัƒ PFX ะผะพะถัƒ ะดะฐั‚ะธ ะฝะตะฟั€ะฐะฒะธะปัŒะฝะธะน "
"ั€ะตะทัƒะปัŒั‚ะฐั‚ ัƒ %s ัƒ ั€ัะดะบัƒ %d"
-#: ../spell.c:4747
#, c-format
msgid "Wrong COMPOUNDRULES value in %s line %d: %s"
msgstr "ะะตะฟั€ะฐะฒะธะปัŒะฝะต ะทะฝะฐั‡ะตะฝะฝั COMPOUNDRULES ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
-#: ../spell.c:4771
#, c-format
msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s"
msgstr "ะะตะฟั€ะฐะฒะธะปัŒะฝะต ะทะฝะฐั‡ะตะฝะฝั COMPOUNDWORDMAX ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
-#: ../spell.c:4777
#, c-format
msgid "Wrong COMPOUNDMIN value in %s line %d: %s"
msgstr "ะะตะฟั€ะฐะฒะธะปัŒะฝะต ะทะฝะฐั‡ะตะฝะฝั COMPOUNDMIN ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
-#: ../spell.c:4783
#, c-format
msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s"
msgstr "ะะตะฟั€ะฐะฒะธะปัŒะฝะต ะทะฝะฐั‡ะตะฝะฝั COMPOUNDSYLMAX ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
-#: ../spell.c:4795
#, c-format
msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"
msgstr "ะะตะฟั€ะฐะฒะธะปัŒะฝะต ะทะฝะฐั‡ะตะฝะฝั CHECKCOMPOUNDPATTERN ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
-#: ../spell.c:4847
#, c-format
msgid "Different combining flag in continued affix block in %s line %d: %s"
msgstr ""
"ะ†ะฝัˆะธะน ะฟั€ะฐะฟะพั€ะตั†ัŒ ะบะพะผะฑั–ะฝะฐั†ั–ั— ัƒ ะฟั€ะพะดะพะฒะถะตะฝะฝั– ะฑะปะพะบัƒ ะฐั„ั–ะบัั–ะฒ ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
-#: ../spell.c:4850
#, c-format
msgid "Duplicate affix in %s line %d: %s"
msgstr "ะŸะพะดะฒั–ะนะฝะธะน ะฐั„ั–ะบั ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
-#: ../spell.c:4871
#, c-format
msgid ""
-"Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s "
+"Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGESTin %s "
"line %d: %s"
msgstr ""
-"ะั„ั–ะบั ั‚ะฐะบะพะถ ะฒะธะบะพั€ะธัั‚ะพะฒัƒั”ั‚ัŒัั ะดะปั BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/"
-"NOSUGGEST ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
+"ะั„ั–ะบั ั‚ะฐะบะพะถ ะฒะถะธะฒะฐั”ั‚ัŒัั ะดะปั BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/"
+"NOSUGGEST ัƒ %s ั€ัะดะพะบ %d: %s"
-#: ../spell.c:4893
#, c-format
msgid "Expected Y or N in %s line %d: %s"
msgstr "ะขั€ะตะฑะฐ Y ั‡ะธ N ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
-#: ../spell.c:4968
#, c-format
msgid "Broken condition in %s line %d: %s"
msgstr "ะะตะฟั€ะธะดะฐั‚ะฝะฐ ัƒะผะพะฒะฐ ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
-#: ../spell.c:5091
#, c-format
msgid "Expected REP(SAL) count in %s line %d"
msgstr "ะขั€ะตะฑะฐ ะบั–ะปัŒะบั–ัั‚ัŒ REP(SAL) ัƒ %s ัƒ ั€ัะดะบัƒ %d"
-#: ../spell.c:5120
#, c-format
msgid "Expected MAP count in %s line %d"
msgstr "ะขั€ะตะฑะฐ ะบั–ะปัŒะบั–ัั‚ัŒ MAP ัƒ %s ัƒ ั€ัะดะบัƒ %d"
-#: ../spell.c:5132
#, c-format
msgid "Duplicate character in MAP in %s line %d"
msgstr "ะŸะพะฒั‚ะพั€ะตะฝะฝั ัะธะผะฒะพะปัƒ ัƒ MAP ัƒ %s ัƒ ั€ัะดะบัƒ %d"
-#: ../spell.c:5176
#, c-format
msgid "Unrecognized or duplicate item in %s line %d: %s"
msgstr "ะะตั€ะพะทะฟั–ะทะฝะฐะฝะธะน ั‡ะธ ะฟะพะฒั‚ะพั€ะฝะธะน ะตะปะตะผะตะฝั‚ ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
-#: ../spell.c:5197
#, c-format
msgid "Missing FOL/LOW/UPP line in %s"
msgstr "ะŸั€ะพะฟัƒั‰ะตะฝะพ ั€ัะดะพะบ FOL/LOW/UPP ัƒ %s"
-#: ../spell.c:5220
msgid "COMPOUNDSYLMAX used without SYLLABLE"
msgstr "ะ’ะถะธั‚ะพ COMPOUNDSYLMAX ะฑะตะท SYLLABLE"
-#: ../spell.c:5236
msgid "Too many postponed prefixes"
msgstr "ะ—ะฐะฑะฐะณะฐั‚ะพ ะฒั–ะดะบะปะฐะดะตะฝะธั… ะฟั€ะตั„ั–ะบัั–ะฒ"
-#: ../spell.c:5238
msgid "Too many compound flags"
msgstr "ะ—ะฐะฑะฐะณะฐั‚ะพ ัะบะปะฐะดะฝะธั… ะฟั€ะฐะฟะพั€ั†ั–ะฒ"
-#: ../spell.c:5240
msgid "Too many postponed prefixes and/or compound flags"
msgstr "ะ—ะฐะฑะฐะณะฐั‚ะพ ะฒั–ะดะบะปะฐะดะตะฝะธั… ะฟั€ะตั„ั–ะบัั–ะฒ ั–/ะฐะฑะพ ัะบะปะฐะดะฝะธั… ะฟั€ะฐะฟะพั€ั†ั–ะฒ"
-#: ../spell.c:5250
#, c-format
msgid "Missing SOFO%s line in %s"
msgstr "ะŸั€ะพะฟัƒั‰ะตะฝะพ ั€ัะดะพะบ SOFO%s ัƒ %s"
-#: ../spell.c:5253
#, c-format
msgid "Both SAL and SOFO lines in %s"
msgstr "ะžะฑะธะดะฒะฐ ั€ัะดะบะธ SAL ั– SOFO ัƒ %s"
-#: ../spell.c:5331
#, c-format
msgid "Flag is not a number in %s line %d: %s"
msgstr "ะŸั€ะฐะฟะพั€ะตั†ัŒ ะฝะต ั” ั‡ะธัะปะพะผ ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
-#: ../spell.c:5334
#, c-format
msgid "Illegal flag in %s line %d: %s"
msgstr "ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ะฟั€ะฐะฟะพั€ะตั†ัŒ ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
-#: ../spell.c:5493 ../spell.c:5501
#, c-format
msgid "%s value differs from what is used in another .aff file"
msgstr "ะ—ะฝะฐั‡ะตะฝะฝั %s ะฒั–ะดั€ั–ะทะฝัั”ั‚ัŒัั ะฒั–ะด ั‚ะพะณะพ, ั‰ะพ ะฒะถะธั‚ะพ ัƒ ั–ะฝัˆะพะผัƒ ั„ะฐะนะปั– .aff"
-#: ../spell.c:5602
#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "ะ—ั‡ะธั‚ัƒั”ั‚ัŒัั ัะปะพะฒะฝะธะบะพะฒะธะน ั„ะฐะนะป %s ..."
+msgid "Reading dictionary file %s..."
+msgstr "ะ—ั‡ะธั‚ัƒั”ั‚ัŒัั ัะปะพะฒะฝะธะบะพะฒะธะน ั„ะฐะนะป %s..."
-#: ../spell.c:5611
#, c-format
msgid "E760: No word count in %s"
msgstr "E760: ะะตะผะฐั” ะบั–ะปัŒะบะพัั‚ั– ัะปั–ะฒ ัƒ %s"
-#: ../spell.c:5669
#, c-format
-msgid "line %6d, word %6d - %s"
-msgstr "ั€ัะดะพะบ %6d, ัะปะพะฒะพ %6d - %s"
+msgid "line %6d, word %6ld - %s"
+msgstr "ั€ัะดะพะบ %6d, ัะปะพะฒะพ %6ld - %s"
-#: ../spell.c:5691
#, c-format
msgid "Duplicate word in %s line %d: %s"
msgstr "ะŸะพะฒั‚ะพั€ะตะฝะฝั ัะปะพะฒะฐ ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
-#: ../spell.c:5694
#, c-format
msgid "First duplicate word in %s line %d: %s"
msgstr "ะŸะตั€ัˆะต ะฟะพะฒั‚ะพั€ะตะฝะฝั ัะปะพะฒะฐ ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
-#: ../spell.c:5746
#, c-format
msgid "%d duplicate word(s) in %s"
msgstr "%d ะฟะพะฒั‚ะพั€ัŽะฒะฐะฝะธั… ัะปั–ะฒ ัƒ %s"
-#: ../spell.c:5748
#, c-format
msgid "Ignored %d word(s) with non-ASCII characters in %s"
msgstr "ะŸั€ะพะฟัƒั‰ะตะฝะพ %d ัะปั–ะฒ(~) ั–ะท ะฝะต-ASCII ัะธะผะฒะพะปะฐะผะธ ัƒ %s"
-#: ../spell.c:6115
#, c-format
-msgid "Reading word file %s ..."
-msgstr "ะงะธั‚ะฐั”ั‚ัŒัั ั„ะฐะนะป ัะปั–ะฒ %s ..."
+msgid "Reading word file %s..."
+msgstr "ะงะธั‚ะฐั”ั‚ัŒัั ั„ะฐะนะป ัะปั–ะฒ %s..."
+
+#, c-format
+msgid "Conversion failure for word in %s line %ld: %s"
+msgstr "ะŸะพะผะธะปะบะฐ ะฟะตั€ะตั‚ะฒะพั€ะตะฝะฝั ัะปะพะฒะฐ ัƒ %s ัƒ ั€ัะดะบัƒ %ld: %s"
-#: ../spell.c:6155
#, c-format
-msgid "Duplicate /encoding= line ignored in %s line %d: %s"
-msgstr "ะŸะพะฒั‚ะพั€ะตะฝะฝั ั€ัะดะบะฐ /encoding= ะฟั€ะพั–ะณะฝะพั€ะพะฒะฐะฝะพ ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
+msgid "Duplicate /encoding= line ignored in %s line %ld: %s"
+msgstr "ะŸะพะฒั‚ะพั€ะตะฝะฝั ั€ัะดะบะฐ /encoding= ะฟั€ะพั–ะณะฝะพั€ะพะฒะฐะฝะพ ัƒ %s ัƒ ั€ัะดะบัƒ %ld: %s"
-#: ../spell.c:6159
#, c-format
-msgid "/encoding= line after word ignored in %s line %d: %s"
-msgstr "ะ ัะดะพะบ /encoding= ะฟั–ัะปั ัะปะพะฒะฐ ะฟั€ะพั–ะณะฝะพั€ะพะฒะฐะฝะพ ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
+msgid "/encoding= line after word ignored in %s line %ld: %s"
+msgstr "ะ ัะดะพะบ /encoding= ะฟั–ัะปั ัะปะพะฒะฐ ะฟั€ะพั–ะณะฝะพั€ะพะฒะฐะฝะพ ัƒ %s ัƒ ั€ัะดะบัƒ %ld: %s"
-#: ../spell.c:6180
#, c-format
-msgid "Duplicate /regions= line ignored in %s line %d: %s"
-msgstr "ะŸะพะฒั‚ะพั€ะตะฝะฝั ั€ัะดะบะฐ /regions= ะฟั€ะพั–ะณะฝะพั€ะพะฒะฐะฝะพ ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
+msgid "Duplicate /regions= line ignored in %s line %ld: %s"
+msgstr "ะŸะพะฒั‚ะพั€ะตะฝะฝั ั€ัะดะบะฐ /regions= ะฟั€ะพั–ะณะฝะพั€ะพะฒะฐะฝะพ ัƒ %s ัƒ ั€ัะดะบัƒ %ld: %s"
-#: ../spell.c:6185
#, c-format
-msgid "Too many regions in %s line %d: %s"
-msgstr "ะ—ะฐะฑะฐะณะฐั‚ะพ ั€ะตะณั–ะพะฝั–ะฒ ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
+msgid "Too many regions in %s line %ld: %s"
+msgstr "ะ—ะฐะฑะฐะณะฐั‚ะพ ั€ะตะณั–ะพะฝั–ะฒ ัƒ %s ัƒ ั€ัะดะบัƒ %ld: %s"
-#: ../spell.c:6198
#, c-format
-msgid "/ line ignored in %s line %d: %s"
-msgstr "ะ ัะดะพะบ / ะฟั€ะพั–ะณะฝะพั€ะพะฒะฐะฝะพ ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
+msgid "/ line ignored in %s line %ld: %s"
+msgstr "ะ ัะดะพะบ / ะฟั€ะพั–ะณะฝะพั€ะพะฒะฐะฝะพ ัƒ %s ัƒ ั€ัะดะบัƒ %ld: %s"
-#: ../spell.c:6224
#, c-format
-msgid "Invalid region nr in %s line %d: %s"
-msgstr "ะะตะบะพั€ะตะบั‚ะฝะธะน ะฝะพะผะตั€ ั€ะตะณั–ะพะฝัƒ ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
+msgid "Invalid region nr in %s line %ld: %s"
+msgstr "ะะตะบะพั€ะตะบั‚ะฝะธะน ะฝะพะผะตั€ ั€ะตะณั–ะพะฝัƒ ัƒ %s ัƒ ั€ัะดะบัƒ %ld: %s"
-#: ../spell.c:6230
#, c-format
-msgid "Unrecognized flags in %s line %d: %s"
-msgstr "ะะตั€ะพะทะฟั–ะทะฝะฐะฝั– ะฟั€ะฐะฟะพั€ั†ั– ัƒ %s ัƒ ั€ัะดะบัƒ %d: %s"
+msgid "Unrecognized flags in %s line %ld: %s"
+msgstr "ะะตั€ะพะทะฟั–ะทะฝะฐะฝั– ะฟั€ะฐะฟะพั€ั†ั– ัƒ %s ัƒ ั€ัะดะบัƒ %ld: %s"
-#: ../spell.c:6257
#, c-format
msgid "Ignored %d words with non-ASCII characters"
msgstr "ะŸั€ะพั–ะณะฝะพั€ะพะฒะฐะฝะพ %d ัะปั–ะฒ ั–ะท ะฝะต-ASCII ัะธะผะฒะพะปะฐะผะธ"
-#: ../spell.c:6656
#, c-format
msgid "Compressed %d of %d nodes; %d (%d%%) remaining"
msgstr "ะกั‚ะธัะฝะตะฝะพ %d ะท %d ะฒัƒะทะปั–ะฒ; ะทะฐะปะธัˆะธะปะพัั %d (%d%%)"
-#: ../spell.c:7340
msgid "Reading back spell file..."
msgstr "ะŸะตั€ะตั‡ะธั‚ัƒั”ั‚ัŒัั ั„ะฐะนะป ะพั€ั„ะพะณั€ะฐั„ั–ั—..."
-#. Go through the trie of good words, soundfold each word and add it to
-#. the soundfold trie.
-#: ../spell.c:7357
msgid "Performing soundfolding..."
msgstr "ะ’ะธะบะพะฝัƒั”ั‚ัŒัั ะทะณะพั€ั‚ะฐะฝะฝั ะทะฒัƒะบั–ะฒ..."
-#: ../spell.c:7368
#, c-format
msgid "Number of words after soundfolding: %<PRId64>"
msgstr "ะšั–ะปัŒะบั–ัั‚ัŒ ัะปั–ะฒ ะฟั–ัะปั ะทะณะพั€ั‚ะฐะฝะฝั ะทะฒัƒะบั–ะฒ: %<PRId64>"
-#: ../spell.c:7476
#, c-format
msgid "Total number of words: %d"
msgstr "ะŸะพะฒะฝะฐ ะบั–ะปัŒะบั–ัั‚ัŒ ัะปั–ะฒ: %d"
-#: ../spell.c:7655
#, c-format
-msgid "Writing suggestion file %s ..."
-msgstr "ะ—ะฐะฟะธััƒั”ั‚ัŒัั ั„ะฐะนะป ะฟั€ะธะฟัƒั‰ะตะฝัŒ %s ..."
+msgid "Writing suggestion file %s..."
+msgstr "ะ—ะฐะฟะธััƒั”ั‚ัŒัั ั„ะฐะนะป ะฟั€ะธะฟัƒั‰ะตะฝัŒ %s..."
-#: ../spell.c:7707 ../spell.c:7927
#, c-format
msgid "Estimated runtime memory use: %d bytes"
msgstr "ะžั†ั–ะฝะบะฐ ัะฟะพะถะธะฒะฐะฝะฝั ะฟะฐะผ'ัั‚ั–: %d ะฑะฐะนั‚"
-#: ../spell.c:7820
msgid "E751: Output file name must not have region name"
msgstr "E751: ะ’ะธั…ั–ะดะฝะธะน ั„ะฐะนะป ะฝะต ะฟะพะฒะธะฝะตะฝ ะผะฐั‚ะธ ะฝะฐะทะฒัƒ ั€ะตะณั–ะพะฝัƒ"
-#: ../spell.c:7822
-msgid "E754: Only up to 8 regions supported"
-msgstr "E754: ะŸั–ะดั‚ั€ะธะผัƒั”ั‚ัŒัั ั‚ั–ะปัŒะบะธ ะดะพ ะฒะพััŒะผะธ ั€ะตะณั–ะพะฝั–ะฒ"
+#, c-format
+msgid "E754: Only up to %d regions supported"
+msgstr "E754: ะŸั–ะดั‚ั€ะธะผัƒั”ั‚ัŒัั ั‚ั–ะปัŒะบะธ ะดะพ %d ั€ะตะณั–ะพะฝั–ะฒ"
-#: ../spell.c:7846
#, c-format
msgid "E755: Invalid region in %s"
msgstr "E755: ะะตะบะพั€ะตะบั‚ะฝะธะน ั€ะตะณั–ะพะฝ ัƒ %s"
-#: ../spell.c:7907
msgid "Warning: both compounding and NOBREAK specified"
msgstr "ะ—ะฐัั‚ะตั€ะตะถะตะฝะฝั: ะทะฐะทะฝะฐั‡ะตะฝะพ ะพะฑะธะดะฒะฐ `ัะบะปะฐะดะฝั– ัะปะพะฒะฐ' ั– NOBREAK"
-#: ../spell.c:7920
#, c-format
-msgid "Writing spell file %s ..."
-msgstr "ะ—ะฐะฟะธััƒั”ั‚ัŒัั ั„ะฐะนะป ะพั€ั„ะพะณั€ะฐั„ั–ั— %s ..."
+msgid "Writing spell file %s..."
+msgstr "ะ—ะฐะฟะธััƒั”ั‚ัŒัั ั„ะฐะนะป ะพั€ั„ะพะณั€ะฐั„ั–ั— %s..."
-#: ../spell.c:7925
msgid "Done!"
msgstr "ะ—ั€ะพะฑะปะตะฝะพ!"
-#: ../spell.c:8034
#, c-format
msgid "E765: 'spellfile' does not have %<PRId64> entries"
msgstr "E765: 'spellfile' ะฝะต ะผั–ัั‚ะธั‚ัŒ %<PRId64> ะตะปะตะผะตะฝั‚ั–ะฒ"
-#: ../spell.c:8074
#, c-format
msgid "Word '%.*s' removed from %s"
msgstr "ะกะปะพะฒะพ '%.*s' ะทะฝะธั‰ะตะฝะพ ะท %s"
-#: ../spell.c:8117
#, c-format
msgid "Word '%.*s' added to %s"
msgstr "ะกะปะพะฒะพ '%.*s' ะดะพะดะฐะฝะพ ะดะพ %s"
-#: ../spell.c:8381
msgid "E763: Word characters differ between spell files"
msgstr "E763: ะกะธะผะฒะพะปะธ ัƒ ัะปะพะฒั– ะฒั–ะดั€ั–ะทะฝััŽั‚ัŒัั ัƒ ั„ะฐะนะปะฐั… ะพั€ั„ะพะณั€ะฐั„ั–ั—"
-#: ../spell.c:8684
-msgid "Sorry, no suggestions"
-msgstr "ะŸั€ะพะฑะฐั‡ั‚ะต, ะฝะตะผะฐั” ะฟั€ะพะฟะพะทะธั†ั–ะน"
+msgid "E783: duplicate char in MAP entry"
+msgstr "E783: ะŸะพะฒั‚ะพั€ะตะฝะพ ัะธะผะฒะพะป ัƒ ะตะปะตะผะตะฝั‚ั– MAP"
-#: ../spell.c:8687
-#, c-format
-msgid "Sorry, only %<PRId64> suggestions"
-msgstr "ะŸั€ะพะฑะฐั‡ั‚ะต, ั‚ั–ะปัŒะบะธ %<PRId64> ะฟั€ะพะฟะพะทะธั†ั–ะน"
+msgid "E766: Insufficient arguments for printf()"
+msgstr "E766: ะะตะดะพัั‚ะฐั‚ะฝัŒะพ ะฐั€ะณัƒะผะตะฝั‚ั–ะฒ ะดะปั printf()"
-#. for when 'cmdheight' > 1
-#. avoid more prompt
-#: ../spell.c:8704
-#, c-format
-msgid "Change \"%.*s\" to:"
-msgstr "ะ—ะฐะผั–ะฝะธั‚ะธ ยซ%.*sยป ะฝะฐ:"
+msgid "E807: Expected Float argument for printf()"
+msgstr "E807: ะžั‡ั–ะบัƒั”ั‚ัŒัั ะฐั€ะณัƒะผะตะฝั‚ Float ะดะปั printf()"
-#: ../spell.c:8737
-#, c-format
-msgid " < \"%.*s\""
-msgstr " < ยซ%.*sยป"
+msgid "E767: Too many arguments to printf()"
+msgstr "E767: ะ—ะฐะฑะฐะณะฐั‚ะพ ะฐั€ะณัƒะผะตะฝั‚ั–ะฒ ะดะปั printf()"
-# msgstr "E34: "
-#: ../spell.c:8882
-msgid "E752: No previous spell replacement"
-msgstr "E752: ะะตะผะฐั” ะฟะพะฟะตั€ะตะดะฝัŒะพั— ะทะฐะผั–ะฝะธ"
+msgid "No Syntax items defined for this buffer"
+msgstr "ะ”ะปั ะฑัƒั„ะตั€ะฐ ะฝะต ะฒะธะทะฝะฐั‡ะตะฝะพ ะตะปะตะผะตะฝั‚ั–ะฒ ัะธะฝั‚ะฐะบัะธััƒ"
-# msgstr "E333: "
-#: ../spell.c:8925
-#, c-format
-msgid "E753: Not found: %s"
-msgstr "E753: ะะต ะทะฝะฐะนะดะตะฝะพ: %s"
+msgid "syntax conceal on"
+msgstr "ัะธะฝั‚ะฐะบัะธั‡ะฝะต ะฟั€ะธั…ะพะฒัƒะฒะฐะฝะฝั ัƒะฒั–ะผะบ"
-#: ../spell.c:9276
-#, c-format
-msgid "E778: This does not look like a .sug file: %s"
-msgstr "E778: ะะต ัั…ะพะถะต ะฝะฐ ั„ะฐะนะป .sug: %s"
+msgid "syntax conceal off"
+msgstr "ัะธะฝั‚ะฐะบัะธั‡ะฝะต ะฟั€ะธั…ะพะฒัƒะฒะฐะฝะฝั ะฒะธะผะบ"
-#: ../spell.c:9282
#, c-format
-msgid "E779: Old .sug file, needs to be updated: %s"
-msgstr "E779: ะ—ะฐัั‚ะฐั€ั–ะปะธะน ั„ะฐะนะป .sug, ั‚ั€ะตะฑะฐ ะฟะพะฝะพะฒะธั‚ะธ: %s"
+msgid "E390: Illegal argument: %s"
+msgstr "E390: ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ะฐั€ะณัƒะผะตะฝั‚: %s"
-#: ../spell.c:9286
-#, c-format
-msgid "E780: .sug file is for newer version of Vim: %s"
-msgstr "E780: ะคะฐะนะป .sug ะดะปั ะฑั–ะปัŒัˆ ะฝะพะฒะพั— ะฒะตั€ัั–ั— Vim: %s"
+msgid "syntax case ignore"
+msgstr "ัะธะฝั‚ะฐะบัะธั ั–ะณะฝะพั€ัƒะฒะฐั‚ะธ ั€ะตะณั–ัั‚ั€"
-#: ../spell.c:9295
-#, c-format
-msgid "E781: .sug file doesn't match .spl file: %s"
-msgstr "E781: ะคะฐะนะป .sug ะฝะต ะฒั–ะดะฟะพะฒั–ะดะฐั” ั„ะฐะนะปัƒ .spl: %s"
+msgid "syntax case match"
+msgstr "ัะธะฝั‚ะฐะบัะธั ะดะพั‚ั€ะธะผัƒะฒะฐั‚ะธัั ั€ะตะณั–ัั‚ั€ัƒ"
-#: ../spell.c:9305
-#, c-format
-msgid "E782: error while reading .sug file: %s"
-msgstr "E782: ะŸะพะผะธะปะบะฐ ั‡ะธั‚ะฐะฝะฝั ั„ะฐะนะปัƒ .sug: %s"
+msgid "syntax spell toplevel"
+msgstr "ัะธะฝั‚ะฐะบัะธั ะฟะตั€ะตะฒั–ั€ัั‚ะธ ะฒััŽะดะธ"
-#. This should have been checked when generating the .spl
-#. file.
-#: ../spell.c:11575
-msgid "E783: duplicate char in MAP entry"
-msgstr "E783: ะŸะพะฒั‚ะพั€ะตะฝะพ ัะธะผะฒะพะป ัƒ ะตะปะตะผะตะฝั‚ั– MAP"
+msgid "syntax spell notoplevel"
+msgstr "ัะธะฝั‚ะฐะบัะธั ะฝะต ะฟะตั€ะตะฒั–ั€ัั‚ะธ"
-# msgstr "E391: "
-#: ../syntax.c:266
-msgid "No Syntax items defined for this buffer"
-msgstr "ะ”ะปั ะฑัƒั„ะตั€ะฐ ะฝะต ะฒะธะทะฝะฐั‡ะตะฝะพ ะตะปะตะผะตะฝั‚ั–ะฒ ัะธะฝั‚ะฐะบัะธััƒ"
+msgid "syntax spell default"
+msgstr "ัะธะฝั‚ะฐะบัะธั ะฟะพั‡ะฐั‚ะบะพะฒะพ"
-#: ../syntax.c:3083 ../syntax.c:3104 ../syntax.c:3127
-#, c-format
-msgid "E390: Illegal argument: %s"
-msgstr "E390: ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ะฐั€ะณัƒะผะตะฝั‚: %s"
+msgid "syntax iskeyword "
+msgstr "ัะธะฝั‚ะฐะบัะธั iskeyword "
-#: ../syntax.c:3299
#, c-format
msgid "E391: No such syntax cluster: %s"
msgstr "E391: ะะตะผะฐั” ั‚ะฐะบะพะณะพ ัะธะฝั‚ะฐะบัะธั‡ะฝะพะณะพ ะบะปะฐัั‚ะตั€ะฐ: %s"
-#: ../syntax.c:3433
msgid "syncing on C-style comments"
msgstr "ัะธะฝั…ั€ะพะฝั–ะทัƒั”ั‚ัŒัั ะฟะพ ะบะพะผะตะฝั‚ะฐั€ัั… ัั‚ะธะปัŽ ะก"
-#: ../syntax.c:3439
msgid "no syncing"
msgstr "ะฑะตะท ัะธะฝั…ั€ะพะฝั–ะทะฐั†ั–ั—"
-#: ../syntax.c:3441
msgid "syncing starts "
msgstr "ะฟะพั‡ะธะฝะฐั”ั‚ัŒัั ัะธะฝั…ั€ะพะฝั–ะทะฐั†ั–ั ะทะฐ "
-#: ../syntax.c:3443 ../syntax.c:3506
msgid " lines before top line"
msgstr " ั€ัะดะบั–ะฒ ะฟะตั€ะตะด ะฟะตั€ัˆะธะผ ั€ัะดะบะพะผ"
-#: ../syntax.c:3448
msgid ""
"\n"
"--- Syntax sync items ---"
@@ -5858,7 +5087,6 @@ msgstr ""
"\n"
"--- ะ•ะปะตะผะตะฝั‚ะธ ัะธะฝั…ั€ะพะฝั–ะทะฐั†ั–ั— ัะธะฝั‚ะฐะบัะธััƒ ---"
-#: ../syntax.c:3452
msgid ""
"\n"
"syncing on items"
@@ -5866,7 +5094,6 @@ msgstr ""
"\n"
"ัะธะฝั…ั€ะพะฝั–ะทะฐั†ั–ั ะฟะพ ะตะปะตะผะตะฝั‚ะฐั…"
-#: ../syntax.c:3457
msgid ""
"\n"
"--- Syntax items ---"
@@ -5874,581 +5101,371 @@ msgstr ""
"\n"
"--- ะ•ะปะตะผะตะฝั‚ะธ ัะธะฝั‚ะฐะบัะธััƒ ---"
-#: ../syntax.c:3475
#, c-format
msgid "E392: No such syntax cluster: %s"
msgstr "E392: ะะตะผะฐั” ั‚ะฐะบะพะณะพ ัะธะฝั‚ะฐะบัะธั‡ะฝะพะณะพ ะบะปะฐัั‚ะตั€ะฐ: %s"
-#: ../syntax.c:3497
msgid "minimal "
msgstr "ะผั–ะฝั–ะผะฐะปัŒะฝะธะน "
-#: ../syntax.c:3503
msgid "maximal "
msgstr "ะผะฐะบัะธะผะฐะปัŒะฝะธะน "
-#: ../syntax.c:3513
msgid "; match "
msgstr "; ะทะฑั–ะณ "
-#: ../syntax.c:3515
msgid " line breaks"
msgstr " ั€ะพะทั€ะธะฒะธ ั€ัะดะบั–ะฒ"
-#: ../syntax.c:4076
msgid "E395: contains argument not accepted here"
msgstr "E395: ะœั–ัั‚ะธั‚ัŒ ะฝะตะฟั€ะธะนะฝัั‚ะฝั– ั‚ัƒั‚ ะฐั€ะณัƒะผะตะฝั‚ะธ"
-# msgstr "E14: "
-#: ../syntax.c:4096
msgid "E844: invalid cchar value"
msgstr "E844: ะะตะบะพั€ะตะบั‚ะฝะต ะทะฝะฐั‡ะตะฝะฝั cchar"
-#: ../syntax.c:4107
msgid "E393: group[t]here not accepted here"
msgstr "E393: group[t]hete ั‚ัƒั‚ ะฝะตะฟั€ะธะนะฝัั‚ะฝะธะน"
-#: ../syntax.c:4126
#, c-format
msgid "E394: Didn't find region item for %s"
msgstr "E394: ะะต ะทะฝะฐะนะดะตะฝะพ ะตะปะตะผะตะฝั‚ ั€ะตะณั–ะพะฝัƒ ะดะปั %s"
-# msgstr "E396: "
-#: ../syntax.c:4188
msgid "E397: Filename required"
msgstr "E397: ะŸะพั‚ั€ั–ะฑะฝะฐ ะฝะฐะทะฒะฐ ั„ะฐะนะปัƒ"
-#: ../syntax.c:4221
msgid "E847: Too many syntax includes"
msgstr "E847: ะ—ะฐะฑะฐะณะฐั‚ะพ ัะธะฝั‚ะฐะบัะธั‡ะฝะธั… ะฒะบะปัŽั‡ะตะฝัŒ"
-#: ../syntax.c:4303
#, c-format
msgid "E789: Missing ']': %s"
msgstr "E789: ะŸั€ะพะฟัƒั‰ะตะฝะพ ']': %s"
-#: ../syntax.c:4531
+#, c-format
+msgid "E890: trailing char after ']': %s]%s"
+msgstr "E890: ะ—ะฐะนะฒะธะน ัะธะผะฒะพะป ะฟั–ัะปั ']': %s]%s"
+
#, c-format
msgid "E398: Missing '=': %s"
msgstr "E398: ะŸั€ะพะฟัƒั‰ะตะฝะพ `=': %s"
-# ---------------------------------------
-#: ../syntax.c:4666
#, c-format
msgid "E399: Not enough arguments: syntax region %s"
msgstr "E399: ะ‘ั€ะฐะบัƒั” ะฐั€ะณัƒะผะตะฝั‚ั–ะฒ: ัะธะฝั‚ะฐะบัะธั‡ะฝะธะน ั€ะตะณั–ะพะฝ %s"
-#: ../syntax.c:4870
msgid "E848: Too many syntax clusters"
msgstr "E848: ะ—ะฐะฑะฐะณะฐั‚ะพ ัะธะฝั‚ะฐะบัะธั‡ะฝะธั… ะบะปะฐัั‚ะตั€ั–ะฒ"
-#: ../syntax.c:4954
msgid "E400: No cluster specified"
msgstr "E400: ะšะปะฐัั‚ะตั€ ะฝะต ะฒะบะฐะทะฐะฝะพ"
-#. end delimiter not found
-#: ../syntax.c:4986
#, c-format
msgid "E401: Pattern delimiter not found: %s"
msgstr "E401: ะšั–ะฝะตั†ัŒ ะทั€ะฐะทะบัƒ ะฝะต ะทะฝะฐะนะดะตะฝะพ: %s"
-#: ../syntax.c:5049
#, c-format
msgid "E402: Garbage after pattern: %s"
msgstr "E402: ะกะผั–ั‚ั‚ั ะฟั–ัะปั ะทั€ะฐะทะบัƒ: %s"
-# msgstr "E402: "
-#: ../syntax.c:5120
msgid "E403: syntax sync: line continuations pattern specified twice"
msgstr ""
"E403: ะกะธะฝั‚ะฐะบัะธั‡ะฝะฐ ัะธะฝั…ั€ะพะฝั–ะทะฐั†ั–ั: ะทั€ะฐะทะพะบ ะดะปั ะฟั€ะพะดะพะฒะถะตะฝะฝั ั€ัะดะบะฐ ะฒะบะฐะทะฐะฝะพ ะดะฒั–ั‡ั–"
-#: ../syntax.c:5169
#, c-format
msgid "E404: Illegal arguments: %s"
msgstr "E404: ะะตะฟั€ะฐะฒะธะปัŒะฝั– ะฐั€ะณัƒะผะตะฝั‚ะธ: %s"
-# msgstr "E404: "
-#: ../syntax.c:5217
#, c-format
msgid "E405: Missing equal sign: %s"
msgstr "E405: ะŸั€ะพะฟัƒั‰ะตะฝะพ ะทะฝะฐะบ ั€ั–ะฒะฝะพัั‚ั–: %s"
-# msgstr "E405: "
-#: ../syntax.c:5222
#, c-format
msgid "E406: Empty argument: %s"
msgstr "E406: ะŸะพั€ะพะถะฝั–ะน ะฐั€ะณัƒะผะตะฝั‚: %s"
-# msgstr "E406: "
-#: ../syntax.c:5240
#, c-format
msgid "E407: %s not allowed here"
msgstr "E407: %s ั‚ัƒั‚ ะฝะต ะดะพะทะฒะพะปะตะฝะพ"
-#: ../syntax.c:5246
#, c-format
msgid "E408: %s must be first in contains list"
msgstr "E408: %s ะผะฐั” ะฑัƒั‚ะธ ะฟะตั€ัˆะธะผ ั€ัะดะบะพะผ ัƒ ัะฟะธัะบัƒ contains"
-#: ../syntax.c:5304
#, c-format
msgid "E409: Unknown group name: %s"
msgstr "E409: ะะตะฒั–ะดะพะผะฐ ะฝะฐะทะฒะฐ ะณั€ัƒะฟะธ: %s"
-# msgstr "E409: "
-#: ../syntax.c:5512
#, c-format
msgid "E410: Invalid :syntax subcommand: %s"
msgstr "E410: ะะตะฟั€ะฐะฒะธะปัŒะฝะฐ ะฟั–ะดะบะพะผะฐะฝะดะฐ :syntax: %s"
-#: ../syntax.c:5854
msgid ""
" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
msgstr ""
" ะ’ะกะฌะžะ“ะž ะš-ะขะฌ ะกะŸะ†ะ’ะŸ. ะะะ™ะŸะžะ’ะ†ะ›. ะกะ•ะ ะ•ะ”ะ. ะะะ—ะ’ะ ะจะะ‘ะ›ะžะ"
-#: ../syntax.c:6146
msgid "E679: recursive loop loading syncolor.vim"
msgstr "E679: ะ ะตะบัƒั€ัะธะฒะฝะธะน ั†ะธะบะป ั‡ะธั‚ะฐะฝะฝั syncolor.vim"
-# msgstr "E410: "
-#: ../syntax.c:6256
#, c-format
msgid "E411: highlight group not found: %s"
msgstr "E411: ะ“ั€ัƒะฟัƒ ะฟั–ะดัะฒั–ั‡ัƒะฒะฐะฝะฝั ะฝะต ะทะฝะฐะนะดะตะฝะพ: %s"
-# msgstr "E411: "
-#: ../syntax.c:6278
#, c-format
msgid "E412: Not enough arguments: \":highlight link %s\""
msgstr "E412: ะะตะดะพัั‚ะฐั‚ะฝัŒะพ ะฐั€ะณัƒะผะตะฝั‚ั–ะฒ: ยซ:highlight link %sยป"
-# msgstr "E412: "
-#: ../syntax.c:6284
#, c-format
msgid "E413: Too many arguments: \":highlight link %s\""
msgstr "E413: ะ—ะฐะฑะฐะณะฐั‚ะพ ะฐั€ะณัƒะผะตะฝั‚ั–ะฒ: ยซ:highlight link %sยป"
-# msgstr "E413: "
-#: ../syntax.c:6302
msgid "E414: group has settings, highlight link ignored"
msgstr "E414: ะ“ั€ัƒะผะฐ ะผะฐั” settings, highlight link ะฟั€ะพั–ะณะฝะพั€ะพะฒะฐะฝะพ"
-# msgstr "E414: "
-#: ../syntax.c:6367
#, c-format
msgid "E415: unexpected equal sign: %s"
msgstr "E415: ะะตัะฟะพะดั–ะฒะฐะฝะธะน ะทะฝะฐะบ ั€ั–ะฒะฝะพัั‚ั–: %s"
-# msgstr "E415: "
-#: ../syntax.c:6395
#, c-format
msgid "E416: missing equal sign: %s"
msgstr "E416: ะŸั€ะพะฟัƒั‰ะตะฝะพ ะทะฝะฐะบ ั€ั–ะฒะฝะพัั‚ั–: %s"
-#: ../syntax.c:6418
#, c-format
msgid "E417: missing argument: %s"
msgstr "E417: ะŸั€ะพะฟัƒั‰ะตะฝะพ ะฐั€ะณัƒะผะตะฝั‚: %s"
-#: ../syntax.c:6446
#, c-format
msgid "E418: Illegal value: %s"
msgstr "E418: ะะตะฟั€ะฐะฒะธะปัŒะฝะต ะทะฝะฐั‡ะตะฝะฝั: %s"
-# msgstr "E418: "
-#: ../syntax.c:6496
msgid "E419: FG color unknown"
msgstr "E419: ะะตะฒั–ะดะพะผะธะน ะบะพะปั–ั€ ั‚ะตะบัั‚ัƒ"
-# msgstr "E419: "
-#: ../syntax.c:6504
msgid "E420: BG color unknown"
msgstr "E420: ะะตะฒั–ะดะพะผะธะน ะบะพะปั–ั€ ั„ะพะฝัƒ"
-# msgstr "E420: "
-#: ../syntax.c:6564
#, c-format
msgid "E421: Color name or number not recognized: %s"
msgstr "E421: ะะตั€ะพะทะฟั–ะทะฝะฐะฝะฐ ะฝะฐะทะฒะฐ ะฐะฑะพ ะฝะพะผะตั€ ะบะพะปัŒะพั€ัƒ: %s"
-# msgstr "E421: "
-#: ../syntax.c:6714
-#, c-format
-msgid "E422: terminal code too long: %s"
-msgstr "E422: ะ—ะฐะฝะฐะดั‚ะพ ะดะพะฒะณะธะน ะบะพะด ั‚ะตั€ะผั–ะฝะฐะปัƒ: %s"
-
-# msgstr "E422: "
-#: ../syntax.c:6753
#, c-format
msgid "E423: Illegal argument: %s"
msgstr "E423: ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ะฐั€ะณัƒะผะตะฝั‚: %s"
-# msgstr "E423: "
-#: ../syntax.c:6925
-msgid "E424: Too many different highlighting attributes in use"
-msgstr "E424: ะ’ะธะบะพั€ะธัั‚ะฐะฝะพ ะทะฐะฑะฐะณะฐั‚ะพ ั€ั–ะทะฝะธั… ะฐั‚ั€ะธะฑัƒั‚ั–ะฒ ะบะพะปัŒะพั€ัƒ"
-
-#: ../syntax.c:7427
msgid "E669: Unprintable character in group name"
msgstr "E669: ะะตะดั€ัƒะบะพะฒะฝะธะน ัะธะผะฒะพะป ัƒ ะฝะฐะทะฒั– ะณั€ัƒะฟะธ"
-# msgstr "E181: "
-#: ../syntax.c:7434
msgid "W18: Invalid character in group name"
msgstr "W18: ะะตะบะพั€ะตะบั‚ะฝะธะน ัะธะผะฒะพะป ัƒ ะฝะฐะทะฒั– ะณั€ัƒะฟะธ"
-#: ../syntax.c:7448
msgid "E849: Too many highlight and syntax groups"
msgstr "E849: ะ—ะฐะฑะฐะณะฐั‚ะพ ะณั€ัƒะฟ ะฟั–ะดัะฒั–ั‡ัƒะฒะฐะฝะฝั ั– ัะธะฝั‚ะฐะบัะธััƒ"
-# msgstr "E424: "
-#: ../tag.c:104
msgid "E555: at bottom of tag stack"
-msgstr "E555: ะšั–ะฝะตั†ัŒ ัั‚ะตะบัƒ ั‚ะตา‘ั–ะฒ"
+msgstr "E555: ะšั–ะฝะตั†ัŒ ัั‚ะตะบัƒ ะผั–ั‚ะพะบ"
-#: ../tag.c:105
msgid "E556: at top of tag stack"
-msgstr "E556: ะ’ะตั€ัˆะธะฝะฐ ัั‚ะตะบัƒ ั‚ะตา‘ั–ะฒ"
+msgstr "E556: ะ’ะตั€ัˆะธะฝะฐ ัั‚ะตะบัƒ ะผั–ั‚ะพะบ"
-#: ../tag.c:380
msgid "E425: Cannot go before first matching tag"
-msgstr "E425: ะฆะต ะฒะถะต ะฝะฐะนะฟะตั€ัˆะธะน ะฒั–ะดะฟะพะฒั–ะดะฝะธะน ั‚ะตา‘"
+msgstr "E425: ะฆะต ะฒะถะต ะฝะฐะนะฟะตั€ัˆะฐ ะฒั–ะดะฟะพะฒั–ะดะฝะฐ ะผั–ั‚ะบะฐ"
-# msgstr "E425: "
-#: ../tag.c:504
#, c-format
msgid "E426: tag not found: %s"
-msgstr "E426: ะขะตา‘ ะฝะต ะทะฝะฐะนะดะตะฝะพ: %s"
+msgstr "E426: ะœั–ั‚ะบัƒ ะฝะต ะทะฝะฐะนะดะตะฝะพ: %s"
-# msgstr "E426: "
-#: ../tag.c:528
msgid " # pri kind tag"
-msgstr " # ะฟั€ั– ั‚ะธะฟ ั‚ะตา‘"
+msgstr " # ะฟั€ั– ั‚ะธะฟ ะผั–ั‚ะบะฐ"
-#: ../tag.c:531
msgid "file\n"
msgstr "ั„ะฐะนะป\n"
-#: ../tag.c:829
msgid "E427: There is only one matching tag"
-msgstr "E427: ะ›ะธัˆะต ะพะดะธะฝ ะฒั–ะดะฟะพะฒั–ะดะฝะธะน ั‚ะตา‘"
+msgstr "E427: ะ›ะธัˆะต ะพะดะฝะฐ ะฒั–ะดะฟะพะฒั–ะดะฝะฐ ะผั–ั‚ะบะฐ"
-# msgstr "E427: "
-#: ../tag.c:831
msgid "E428: Cannot go beyond last matching tag"
-msgstr "E428: ะฆะต ะฒะถะต ะพัั‚ะฐะฝะฝั–ะน ะฒั–ะดะฟะพะฒั–ะดะฝะธะน ั‚ะตา‘"
+msgstr "E428: ะฆะต ะฒะถะต ะพัั‚ะฐะฝะฝั ะฒั–ะดะฟะพะฒั–ะดะฝะฐ ะผั–ั‚ะบะฐ"
-# msgstr "E428: "
-#: ../tag.c:850
#, c-format
msgid "File \"%s\" does not exist"
msgstr "ะคะฐะนะป ยซ%sยป ะฝะต ั–ัะฝัƒั”"
-#. Give an indication of the number of matching tags
-#: ../tag.c:859
#, c-format
msgid "tag %d of %d%s"
-msgstr "ั‚ะตา‘ %d ะท %d%s"
+msgstr "ะผั–ั‚ะบะฐ %d ะท %d%s"
-#: ../tag.c:862
msgid " or more"
msgstr " ะฐะฑะพ ะฑั–ะปัŒัˆะต"
-#: ../tag.c:864
msgid " Using tag with different case!"
-msgstr " ะ’ะธะบะพั€ะธัั‚ะฐะฝะพ ั‚ะตา‘, ะฝะต ั€ะพะทั€ั–ะทะฝััŽั‡ะธ ะฒะตะปะธะบั– ะน ะผะฐะปั– ะปั–ั‚ะตั€ะธ"
+msgstr " ะ’ะธะบะพั€ะธัั‚ะฐะฝะพ ะผั–ั‚ะบัƒ, ะฝะต ั€ะพะทั€ั–ะทะฝััŽั‡ะธ ะฒะตะปะธะบั– ะน ะผะฐะปั– ะปั–ั‚ะตั€ะธ!"
-#: ../tag.c:909
#, c-format
msgid "E429: File \"%s\" does not exist"
msgstr "E429: ะคะฐะนะป ยซ%sยป ะฝะต ั–ัะฝัƒั”"
-# msgstr "E429: "
-#. Highlight title
-#: ../tag.c:960
msgid ""
"\n"
" # TO tag FROM line in file/text"
msgstr ""
"\n"
-" # ะ”ะž ั‚ะตา‘ัƒ ะ— ั€ัะดะบะฐ ัƒ ั„ะฐะนะปั–/ั‚ะตะบัั‚ั–"
+" # ะ”ะž ะผั–ั‚ะบะธ ะ— ั€ัะดะบะฐ ัƒ ั„ะฐะนะปั–/ั‚ะตะบัั‚ั–"
-#: ../tag.c:1303
#, c-format
msgid "Searching tags file %s"
msgstr "ะจัƒะบะฐั”ั‚ัŒัั ัƒ ั„ะฐะนะปั– ั‚ะตา‘ั–ะฒ %s"
-#: ../tag.c:1545
msgid "Ignoring long line in tags file"
msgstr "ะ†ะณะฝะพั€ัƒั”ั‚ัŒัั ะดะพะฒะณะธะน ั€ัะดะพะบ ัƒ ั„ะฐะนะปั– ะท ะฟะพะทะฝะฐั‡ะบะฐะผะธ"
-# msgstr "E430: "
-#: ../tag.c:1915
#, c-format
msgid "E431: Format error in tags file \"%s\""
msgstr "E431: ะŸะพะผะธะปะบะฐ ั„ะพั€ะผะฐั‚ัƒ ัƒ ั„ะฐะนะปั– ั‚ะตา‘ั–ะฒ ยซ%sยป"
-# msgstr "E431: "
-#: ../tag.c:1917
#, c-format
msgid "Before byte %<PRId64>"
msgstr "ะŸะตั€ะตะด ะฑะฐะนั‚ะพะผ %<PRId64>"
-#: ../tag.c:1929
#, c-format
msgid "E432: Tags file not sorted: %s"
msgstr "E432: ะคะฐะนะป ั‚ะตา‘ั–ะฒ ะฝะต ะฒะฟะพั€ัะดะบะพะฒะฐะฝะธะน: %s"
-# msgstr "E432: "
-#. never opened any tags file
-#: ../tag.c:1960
msgid "E433: No tags file"
msgstr "E433: ะะตะผะฐั” ั„ะฐะนะปัƒ ั‚ะตา‘ั–ะฒ"
-# msgstr "E433: "
-#: ../tag.c:2536
msgid "E434: Can't find tag pattern"
-msgstr "E434: ะะต ะฒะดะฐะปะพัั ะทะฝะฐะนั‚ะธ ะทั€ะฐะทะพะบ ั‚ะตา‘ัƒ"
+msgstr "E434: ะะต ะฒะดะฐะปะพัั ะทะฝะฐะนั‚ะธ ะทั€ะฐะทะพะบ ะผั–ั‚ะบะธ"
-# msgstr "E434: "
-#: ../tag.c:2544
msgid "E435: Couldn't find tag, just guessing!"
-msgstr "E435: ะะต ะฒะดะฐะปะพัั ะทะฝะฐะนั‚ะธ ั‚ะตา‘, ั‚ั–ะปัŒะบะธ ะฟั€ะธะฟัƒั‰ะตะฝะฝั!"
+msgstr "E435: ะะต ะฒะดะฐะปะพัั ะทะฝะฐะนั‚ะธ ะผั–ั‚ะบัƒ, ั‚ั–ะปัŒะบะธ ะฟั€ะธะฟัƒั‰ะตะฝะฝั!"
-#: ../tag.c:2797
#, c-format
msgid "Duplicate field name: %s"
msgstr "ะะฐะทะฒะฐ ะฟะพะปั ะฟะพะฒั‚ะพั€ัŽั”ั‚ัŒัั: %s"
-# msgstr "E435: "
-#: ../term.c:1442
-msgid "' not known. Available builtin terminals are:"
-msgstr "' ะฝะต ะฒั–ะดะพะผะธะน. ะ’ะฑัƒะดะพะฒะฐะฝั– ั‚ะตั€ะผั–ะฝะฐะปะธ:"
-
-#: ../term.c:1463
-msgid "defaulting to '"
-msgstr "ะฟะพั‡ะฐั‚ะบะพะฒะพ '"
-
-#: ../term.c:1731
-msgid "E557: Cannot open termcap file"
-msgstr "E557: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ั„ะฐะนะป ะผะพะถะปะธะฒะพัั‚ะตะน ั‚ะตั€ะผั–ะฝะฐะปั–ะฒ"
-
-#: ../term.c:1735
-msgid "E558: Terminal entry not found in terminfo"
-msgstr "E558: ะะตะผะฐั” ั–ะฝั„ะพั€ะผะฐั†ั–ั— ะฟั€ะพ ั‚ะตั€ะผั–ะฝะฐะป"
-
-#: ../term.c:1737
-msgid "E559: Terminal entry not found in termcap"
-msgstr "E559: ะะตะผะฐั” ั–ะฝั„ะพั€ะผะฐั†ั–ั— ะฟั€ะพ ะผะพะถะปะธะฒะพัั‚ั– ั‚ะตั€ะผั–ะฝะฐะปัƒ"
-
-#: ../term.c:1878
-#, c-format
-msgid "E436: No \"%s\" entry in termcap"
-msgstr "E436: ะะตะผะฐั” ะทะฐะฟะธััƒ ยซ%sยป ะฟั€ะพ ะผะพะถะปะธะฒะพัั‚ั– ั‚ะตั€ะผั–ะฝะฐะปัƒ"
-
-#: ../term.c:2249
-msgid "E437: terminal capability \"cm\" required"
-msgstr "E437: ะŸะพั‚ั€ั–ะฑะฝะฐ ะผะพะถะปะธะฒั–ัั‚ัŒ ั‚ะตั€ะผั–ะฝะฐะปัƒ ยซcmยป"
-
-#. Highlight title
-#: ../term.c:4376
-msgid ""
-"\n"
-"--- Terminal keys ---"
-msgstr ""
-"\n"
-"--- ะšะปะฐะฒั–ัˆั– ั‚ะตั€ะผั–ะฝะฐะปัƒ ---"
-
-#: ../ui.c:481
-msgid "Vim: Error reading input, exiting...\n"
-msgstr "Vim: ะŸะพะผะธะปะบะฐ ั‡ะธั‚ะฐะฝะฝั ะฒะฒะพะดัƒ, ั€ะพะฑะพั‚ะฐ ะทะฐะฒะตั€ัˆัƒั”ั‚ัŒัั...\n"
-
-#. This happens when the FileChangedRO autocommand changes the
-#. * file in a way it becomes shorter.
-#: ../undo.c:379
-#, fuzzy
msgid "E881: Line count changed unexpectedly"
-msgstr "E834: ะšั–ะปัŒะบั–ัั‚ัŒ ั€ัะดะบั–ะฒ ะฝะตัะฟะพะดั–ะฒะฐะฝะพ ะทะผั–ะฝะธะปะฐัั"
+msgstr "E881: ะšั–ะปัŒะบั–ัั‚ัŒ ั€ัะดะบั–ะฒ ะฝะตัะฟะพะดั–ะฒะฐะฝะพ ะทะผั–ะฝะธะปะฐัั"
-#: ../undo.c:627
#, c-format
msgid "E828: Cannot open undo file for writing: %s"
msgstr "E828: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ั„ะฐะนะป ั–ัั‚ะพั€ั–ั— ะดะปั ะทะฐะฟะธััƒ: %s"
-#: ../undo.c:717
+#, c-format
+msgid "E5003: Unable to create directory \"%s\" for undo file: %s"
+msgstr "E5003: ะะต ะฒะดะฐะปะพัั ัั‚ะฒะพั€ะธั‚ะธ ะบะฐั‚ะฐะปะพะณ ยซ%sยป ะดะปั ั„ะฐะนะปัƒ ะฟะพะฒะตั€ะฝะตะฝะฝั ะทะผั–ะฝ: %s"
+
#, c-format
msgid "E825: Corrupted undo file (%s): %s"
msgstr "E825: ะคะฐะนะป ั–ัั‚ะพั€ั–ั— ะฟะพัˆะบะพะดะถะตะฝะพ (%s): %s"
-#: ../undo.c:1039
msgid "Cannot write undo file in any directory in 'undodir'"
msgstr "ะะต ะฒะดะฐะปะพัั ะทะฐะฟะธัะฐั‚ะธ ั„ะฐะนะป ั–ัั‚ะพั€ั–ั— ัƒ ะถะพะดะฝัƒ ะท ะดะธั€ะตะบั‚ะพั€ั–ะน ัƒ 'undodir'"
-#: ../undo.c:1074
#, c-format
msgid "Will not overwrite with undo file, cannot read: %s"
msgstr "Will not overwrite with undo file, cannot read: %s"
-#: ../undo.c:1092
#, c-format
msgid "Will not overwrite, this is not an undo file: %s"
msgstr "ะะต ะผะพะถะฝะฐ ะฟะตั€ะตะทะฐะฟะธัะฐั‚ะธ, ั†ะต ะฝะต ั„ะฐะนะป ั–ัั‚ะพั€ั–ั—: %s"
-#: ../undo.c:1108
msgid "Skipping undo file write, nothing to undo"
msgstr "ะคะฐะนะป ั–ัั‚ะพั€ั–ั— ะฝะต ะทะฐะฟะธััƒั”ั‚ัŒัั, ะฝั–ั‡ะพะณะพ ะฟะพะฒะตั€ั‚ะฐั‚ะธ"
-#: ../undo.c:1121
#, c-format
msgid "Writing undo file: %s"
msgstr "ะ—ะฐะฟะธััƒั”ั‚ัŒัั ั„ะฐะนะป ั–ัั‚ะพั€ั–ั—: %s"
-#: ../undo.c:1213
#, c-format
msgid "E829: write error in undo file: %s"
msgstr "E829: ะŸะพะผะธะปะบะฐ ะทะฐะฟะธััƒ ัƒ ั„ะฐะนะปั– ั–ัั‚ะพั€ั–ั—: %s"
-#: ../undo.c:1280
#, c-format
msgid "Not reading undo file, owner differs: %s"
msgstr "ะคะฐะนะป ั–ัั‚ะพั€ั–ั— ะฟั€ะพั‡ะธั‚ะฐะฝะพ ะฝะต ะฑัƒะดะต, ะฒะปะฐัะฝะธะบ ั–ะฝัˆะธะน: %s"
-#: ../undo.c:1292
#, c-format
msgid "Reading undo file: %s"
msgstr "ะงะธั‚ะฐั”ั‚ัŒัั ั„ะฐะนะป ั–ัั‚ะพั€ั–ั—: %s"
-#: ../undo.c:1299
#, c-format
msgid "E822: Cannot open undo file for reading: %s"
msgstr "E822: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ั„ะฐะนะป ะดะปั ั‡ะธั‚ะฐะฝะฝั: %s"
-# msgstr "E333: "
-#: ../undo.c:1308
#, c-format
msgid "E823: Not an undo file: %s"
msgstr "E823: ะะต ั„ะฐะนะป ั–ัั‚ะพั€ั–ั—: %s"
-#: ../undo.c:1313
#, c-format
msgid "E824: Incompatible undo file: %s"
msgstr "E824: ะะตััƒะผั–ัะฝะธะน ั„ะฐะนะป ั–ัั‚ะพั€ั–ั—: %s"
-#: ../undo.c:1328
msgid "File contents changed, cannot use undo info"
msgstr "ะ’ะผั–ัั‚ ั„ะฐะนะปัƒ ะทะผั–ะฝะธะฒัั, ะฝะต ะผะพะถะฝะฐ ะฒะธะบะพั€ะธัั‚ะฐั‚ะธ ั–ะฝั„ะพั€ะผะฐั†ั–ัŽ ะฟั€ะพ ั–ัั‚ะพั€ั–ัŽ"
-#: ../undo.c:1497
#, c-format
msgid "Finished reading undo file %s"
msgstr "ะ—ะฐะบั–ะฝั‡ะตะฝะพ ั‡ะธั‚ะฐะฝะฝั ั„ะฐะนะปัƒ ั–ัั‚ะพั€ั–ั— %s"
-#: ../undo.c:1586 ../undo.c:1812
msgid "Already at oldest change"
msgstr "ะ’ะถะต ะฝะฐ ะฝะฐะนัั‚ะฐั€ัˆั–ะน ะทะผั–ะฝั–"
-#: ../undo.c:1597 ../undo.c:1814
msgid "Already at newest change"
msgstr "ะ’ะถะต ะฝะฐ ะฝะฐะนะฝะพะฒั–ัˆั–ะน ะทะผั–ะฝั–"
-#: ../undo.c:1806
#, c-format
msgid "E830: Undo number %<PRId64> not found"
msgstr "E830: ะ—ะผั–ะฝัƒ %<PRId64> ะฝะต ะทะฝะฐะนะดะตะฝะพ ะฒ ั–ัั‚ะพั€ั–ั—"
-#: ../undo.c:1979
msgid "E438: u_undo: line numbers wrong"
msgstr "E438: u_undo: ะฝะตะฟั€ะฐะฒะธะปัŒะฝั– ะฝะพะผะตั€ะธ ั€ัะดะบั–ะฒ"
-#: ../undo.c:2183
msgid "more line"
msgstr "ะดะพะดะฐะฝะพ ั€ัะดะพะบ"
-#: ../undo.c:2185
msgid "more lines"
msgstr "ั€ัะดะบั–ะฒ ะดะพะดะฐะฝะพ"
-#: ../undo.c:2187
msgid "line less"
msgstr "ะทะฝะธั‰ะตะฝะพ ั€ัะดะพะบ"
-#: ../undo.c:2189
msgid "fewer lines"
msgstr "ั€ัะดะบั–ะฒ ะทะฝะธั‰ะตะฝะพ"
-# msgstr "E438: "
-#: ../undo.c:2193
msgid "change"
msgstr "ะทะผั–ะฝะฐ"
-# msgstr "E438: "
-#: ../undo.c:2195
msgid "changes"
msgstr "ะทะผั–ะฝ"
-#: ../undo.c:2225
#, c-format
msgid "%<PRId64> %s; %s #%<PRId64> %s"
msgstr "%<PRId64> %s; %s #%<PRId64> %s"
-#: ../undo.c:2228
-msgid "before"
-msgstr "ะฟะตั€ะตะด"
-
-#: ../undo.c:2228
msgid "after"
msgstr "ะฟั–ัะปั"
-#: ../undo.c:2325
+msgid "before"
+msgstr "ะฟะตั€ะตะด"
+
msgid "Nothing to undo"
msgstr "ะะตะผะฐั” ะฝั–ั‡ะพะณะพ ัะบะฐัะพะฒัƒะฒะฐั‚ะธ"
-#: ../undo.c:2330
msgid "number changes when saved"
msgstr "ะฝะพะผะตั€ ะทะผั–ะฝะธ ั‡ะฐั ะทะฑะตั€ะตะถะตะฝะพ"
-#: ../undo.c:2360
#, c-format
msgid "%<PRId64> seconds ago"
msgstr "%<PRId64> ัะตะบัƒะฝะด ั‚ะพะผัƒ"
-# msgstr "E406: "
-#: ../undo.c:2372
msgid "E790: undojoin is not allowed after undo"
msgstr "E790: ะะต ะผะพะถะฝะฐ ะฒะธะบะพะฝะฐั‚ะธ undojoin ะฟั–ัะปั undo"
-#: ../undo.c:2466
msgid "E439: undo list corrupt"
msgstr "E439: ะกะฟะธัะพะบ ัะบะฐััƒะฒะฐะฝะฝั ะฟะพัˆะบะพะดะถะตะฝะพ"
-# msgstr "E439: "
-#: ../undo.c:2495
msgid "E440: undo line missing"
msgstr "E440: ะ’ั–ะดััƒั‚ะฝั–ะน ั€ัะดะพะบ ัะบะฐััƒะฒะฐะฝะฝั"
-#: ../version.c:600
-msgid ""
-"\n"
-"Included patches: "
-msgstr ""
-"\n"
-"ะ’ะบะปัŽั‡ะตะฝั– ะปะฐั‚ะบะธ: "
-
-#: ../version.c:627
-msgid ""
-"\n"
-"Extra patches: "
-msgstr ""
-"\n"
-"ะ”ะพะดะฐั‚ะบะพะฒั– ะปะฐั‚ะบะธ: "
-
-#: ../version.c:639 ../version.c:864
-msgid "Modified by "
-msgstr "ะ—ะผั–ะฝะธะฒ "
-
-#: ../version.c:646
msgid ""
"\n"
"Compiled "
@@ -6456,1933 +5473,280 @@ msgstr ""
"\n"
"ะกะบะพะผะฟั–ะปัŽะฒะฐะฒ "
-#: ../version.c:649
msgid "by "
msgstr " "
-#: ../version.c:660
msgid ""
"\n"
-"Huge version "
+"\n"
+"Features: "
msgstr ""
"\n"
-"ะ“ั–ะณะฐะฝั‚ััŒะบะฐ ะฒะตั€ัั–ั "
-
-#: ../version.c:661
-msgid "without GUI."
-msgstr "ะฑะตะท GUI."
-
-#: ../version.c:662
-msgid " Features included (+) or not (-):\n"
-msgstr " ะ’ะบะปัŽั‡ะตะฝั– (+) ะฐะฑะพ ะฝะต ะฒะบะปัŽั‡ะตะฝั– (-) ะบะพะผะฟะพะฝะตะฝั‚ะธ:\n"
+"\n"
+"ะฅะฐั€ะฐะบั‚ะตั€ะธัั‚ะธะบะธ: "
-#: ../version.c:667
msgid " system vimrc file: \""
msgstr " ัะธัั‚ะตะผะฝะธะน vimrc: \""
-#: ../version.c:672
-msgid " user vimrc file: \""
-msgstr " vimrc ะบะพั€ะธัั‚ัƒะฒะฐั‡ะฐ: \""
-
-#: ../version.c:677
-msgid " 2nd user vimrc file: \""
-msgstr " ะดั€ัƒะณะธะน vimrc ะบะพั€ะธัั‚ัƒะฒะฐั‡ะฐ: \""
-
-#: ../version.c:682
-msgid " 3rd user vimrc file: \""
-msgstr " ั‚ั€ะตั‚ั–ะน vimrc ะบะพั€ะธัั‚ัƒะฒะฐั‡ะฐ: \""
-
-#: ../version.c:687
-msgid " user exrc file: \""
-msgstr " exrc ะบะพั€ะธัั‚ัƒะฒะฐั‡ะฐ: \""
-
-#: ../version.c:692
-msgid " 2nd user exrc file: \""
-msgstr " ะดั€ัƒะณะธะน exrc ะบะพั€ะธัั‚ัƒะฒะฐั‡ะฐ: \""
-
-#: ../version.c:699
msgid " fall-back for $VIM: \""
msgstr " ะทะฐะผั–ะฝะฐ ะดะปั $VIM: \""
-#: ../version.c:705
msgid " f-b for $VIMRUNTIME: \""
msgstr " ะทะฐะผั–ะฝะฐ ะดะปั $VIMRUNTIME: \""
-#: ../version.c:709
-msgid "Compilation: "
-msgstr "ะกะบะพะผะฟั–ะปัŒะพะฒะฐะฝะพ: "
-
-#: ../version.c:712
-msgid "Linking: "
-msgstr "ะกะบะพะผะฟะพะฝะพะฒะฐะฝะพ: "
+msgid "Nvim is open source and freely distributable"
+msgstr "Nvim โ€” ั†ะต ะฒั–ะดะบั€ะธั‚ะฐ ะน ะฒั–ะปัŒะฝะพ ั€ะพะทะฟะพะฒััŽะดะถัƒะฒะฐะฝะฐ ะฟั€ะพะณั€ะฐะผะฐ"
-#: ../version.c:717
-msgid " DEBUG BUILD"
-msgstr " ะ’ะ•ะ ะกะ†ะฏ ะ”ะ›ะฏ ะะะ›ะะ“ะžะ”ะ–ะ•ะะะฏ"
+msgid "https://neovim.io/#chat"
+msgstr "https://neovim.io/#chat"
-#: ../version.c:767
-msgid "VIM - Vi IMproved"
-msgstr "VIM - ะŸะพะบั€ะฐั‰ะตะฝะธะน Vi"
+msgid "type :help nvim<Enter> if you are new! "
+msgstr ":help nvim<Enter> ัะบั‰ะพ ะฒะธ ะฒะฟะตั€ัˆะต! "
-#: ../version.c:769
-msgid "version "
-msgstr "ะฒะตั€ัั–ั "
+msgid "type :checkhealth<Enter> to optimize Nvim"
+msgstr ":checkhealth<Enter> ั‰ะพะฑ ะพะฟั‚ะธะผั–ะทัƒะฒะฐั‚ะธ Nvim "
-#: ../version.c:770
-msgid "by Bram Moolenaar et al."
-msgstr "ะฐะฒั‚ะพั€: Bram Moolenaar ั‚ะฐ ั–ะฝ."
+msgid "type :q<Enter> to exit "
+msgstr ":q<Enter> ะฒะธั…ั–ะด ะท Vim "
-#: ../version.c:774
-msgid "Vim is open source and freely distributable"
-msgstr "Vim โ€” ั†ะต ะฒั–ะดะบั€ะธั‚ะฐ ะน ะฒั–ะปัŒะฝะพ ั€ะพะทะฟะพะฒััŽะดะถัƒะฒะฐะฝะฐ ะฟั€ะพะณั€ะฐะผะฐ"
+msgid "type :help<Enter> for help "
+msgstr ":help<Enter> ั‰ะพะฑ ะพั‚ั€ะธะผะฐั‚ะธ ะดะพะฟะพะผะพะณัƒ "
-#: ../version.c:776
msgid "Help poor children in Uganda!"
msgstr "ะ”ะพะฟะพะผะพะถั–ั‚ัŒ ัะธั€ะพั‚ะฐะผ ะท ะฃะณะฐะฝะดะธ!"
-#: ../version.c:777
msgid "type :help iccf<Enter> for information "
-msgstr ":help iccf<Enter> ะฟะพะดั€ะพะฑะธั†ั– "
-
-#: ../version.c:779
-msgid "type :q<Enter> to exit "
-msgstr ":q<Enter> ะฒะธั…ั–ะด ะท Vim "
+msgstr ":help iccf<Enter> ะฟะพะดั€ะพะฑะธั†ั– "
-#: ../version.c:780
-msgid "type :help<Enter> or <F1> for on-line help"
-msgstr ":help<Enter> ะฐะฑะพ <F1> ะฟะตั€ะตะณะปัะด ะดะพะฟะพะผะพะณะธ "
-
-#: ../version.c:781
-msgid "type :help version7<Enter> for version info"
-msgstr ":help version7<Enter> ั–ะฝั„ะพั€ะผะฐั†ั–ั ะฟั€ะพ ะฒะตั€ัั–ัŽ "
-
-#: ../version.c:784
-msgid "Running in Vi compatible mode"
-msgstr "ะ’ะธ ะฟั€ะฐั†ัŽั”ั‚ะต ะฒ ั€ะตะถะธะผั– ััƒะผั–ัะฝะพะผัƒ ะท Vi"
-
-#: ../version.c:785
-msgid "type :set nocp<Enter> for Vim defaults"
-msgstr ":set nocp<Enter> ั€ะตะถะธะผ ะฝะตััƒะผั–ัะฝะธะน ะท Vi "
-
-#: ../version.c:786
-msgid "type :help cp-default<Enter> for info on this"
-msgstr ":help cp-default<Enter> ั–ะฝั„ะพั€ะผะฐั†ั–ั ะฟั€ะพ ััƒะผั–ัะฝั–ัั‚ัŒ"
-
-#: ../version.c:827
msgid "Sponsor Vim development!"
msgstr "ะŸั–ะดั‚ั€ะธะผะฐะนั‚ะต ั€ะพะทั€ะพะฑะบัƒ ั€ะตะดะฐะบั‚ะพั€ะฐ Vim!"
-#: ../version.c:828
msgid "Become a registered Vim user!"
msgstr "ะกั‚ะฐะฝัŒั‚ะต ะทะฐั€ะตั”ัั‚ั€ะพะฒะฐะฝะธะผ ะบะพั€ะธัั‚ัƒะฒะฐั‡ะตะผ Vim!"
-#: ../version.c:831
msgid "type :help sponsor<Enter> for information "
-msgstr ":help sponsor<Enter> ะฟะพะดะฐะปัŒัˆะฐ ั–ะฝั„ะพั€ะผะฐั†ั–ั "
+msgstr ":help sponsor<Enter> ะฟะพะดะฐะปัŒัˆะฐ ั–ะฝั„ะพั€ะผะฐั†ั–ั "
-#: ../version.c:832
msgid "type :help register<Enter> for information "
-msgstr ":help register<Enter> ะฟะพะดะฐะปัŒัˆะฐ ั–ะฝั„ะพั€ะผะฐั†ั–ั "
+msgstr ":help register<Enter> ะฟะพะดะฐะปัŒัˆะฐ ั–ะฝั„ะพั€ะผะฐั†ั–ั "
-#: ../version.c:834
msgid "menu Help->Sponsor/Register for information "
-msgstr "ะผะตะฝัŽ ะ”ะพะฟะพะผะพะณะฐ->ะกะฟะพะฝัะพั€/ะ ะตั”ัั‚ั€ะฐั†ั–ั ะฟะพะดั€ะพะฑะธั†ั– "
-
-# msgstr "E444: "
-#: ../window.c:119
-msgid "Already only one window"
-msgstr "ะฆะต ะฒะถะต ั”ะดะธะฝะต ะฒั–ะบะฝะพ"
-
-#: ../window.c:224
-msgid "E441: There is no preview window"
-msgstr "E441: ะะตะผะฐั” ะฒั–ะบะฝะฐ ะฟะตั€ะตะณะปัะดัƒ"
-
-# msgstr "E441: "
-#: ../window.c:559
-msgid "E442: Can't split topleft and botright at the same time"
-msgstr "E442: ะะต ะฒะดะฐะปะพัั ะพะดะฝะพั‡ะฐัะฝะพ ั€ะพะทะฑะธั‚ะธ topleft ั– botright"
-
-# msgstr "E442: "
-#: ../window.c:1228
-msgid "E443: Cannot rotate when another window is split"
-msgstr "E443: ะะต ะฒะดะฐะปะพัั ะฟะตั€ะตะผั–ัั‚ะธั‚ะธ ะฒั–ะบะฝะพ, ะทะฐะฒะฐะถะฐัŽั‚ัŒ ั–ะฝัˆั–"
-
-# msgstr "E443: "
-#: ../window.c:1803
-msgid "E444: Cannot close last window"
-msgstr "E444: ะะต ะฒะดะฐะปะพัั ะทะฐะบั€ะธั‚ะธ ะพัั‚ะฐะฝะฝั” ะฒั–ะบะฝะพ"
-
-# msgstr "E443: "
-#: ../window.c:1810
-msgid "E813: Cannot close autocmd window"
-msgstr "E813: ะะต ะฒะดะฐะปะพัั ะทะฐะบั€ะธั‚ะธ ะฒั–ะบะฝะพ autocmd"
-
-# msgstr "E443: "
-#: ../window.c:1814
-msgid "E814: Cannot close window, only autocmd window would remain"
-msgstr "E814: ะะต ะฒะดะฐะปะพัั ะทะฐะบั€ะธั‚ะธ ะฒั–ะบะฝะพ, ะทะฐะปะธัˆะธะปะพัั ะฑ ั‚ั–ะปัŒะบะธ ะฒั–ะบะฝะพ autocmd"
-
-#: ../window.c:2717
-msgid "E445: Other window contains changes"
-msgstr "E445: ะฃ ั–ะฝัˆะพะผัƒ ะฒั–ะบะฝั– ั” ะทะผั–ะฝะธ"
-
-# msgstr "E445: "
-#: ../window.c:4805
-msgid "E446: No file name under cursor"
-msgstr "E446: ะะตะผะฐั” ะฝะฐะทะฒะธ ั„ะฐะนะปัƒ ะฝะฐะด ะบัƒั€ัะพั€ะพะผ"
-
-#~ msgid "E831: bf_key_init() called with empty password"
-#~ msgstr "E831: ะ’ะธะบะปะธะบะฐะฝะพ bf_key_init() ะท ะฟะพั€ะพะถะฝั–ะผ ะฟะฐั€ะพะปะตะผ"
-
-#~ msgid "E820: sizeof(uint32_t) != 4"
-#~ msgstr "E820: sizeof(uint32_t) != 4"
-
-#~ msgid "E817: Blowfish big/little endian use wrong"
-#~ msgstr "E817: ะะตะฟั€ะฐะฒะธะปัŒะฝะต ะฒะธะบะพั€ะธัั‚ะฐะฝะฝั ะฟะพั€ัะดะบัƒ ะฑะฐะนั‚ั–ะฒ Blowfish (BE/LE)"
-
-#~ msgid "E818: sha256 test failed"
-#~ msgstr "E818: ะะต ะฟั€ะพะนัˆะปะฐ ะฟะตั€ะตะฒั–ั€ะบะฐ sha256"
-
-#~ msgid "E819: Blowfish test failed"
-#~ msgstr "E819: ะะต ะฟั€ะพะนัˆะปะฐ ะฟะตั€ะตะฒั–ั€ะบะฐ Blowfish"
-
-#~ msgid "Patch file"
-#~ msgstr "ะ›ะฐั‚ะบะฐ"
-
-#~ msgid ""
-#~ "&OK\n"
-#~ "&Cancel"
-#~ msgstr ""
-#~ "&O:ะ“ะฐั€ะฐะทะด\n"
-#~ "&C:ะกะบะฐััƒะฒะฐั‚ะธ"
-
-#~ msgid "E240: No connection to Vim server"
-#~ msgstr "E240: ะะตะผะฐั” ะท'ั”ะดะฝะฐะฝะฝั ั–ะท ัะตั€ะฒะตั€ะพะผ Vim"
-
-#~ msgid "E241: Unable to send to %s"
-#~ msgstr "E241: ะะต ะฒะดะฐะปะพัั ะฒั–ะดั–ัะปะฐั‚ะธ ะดะพ %s"
-
-#~ msgid "E277: Unable to read a server reply"
-#~ msgstr "E277: ะะต ะฒะดะฐะปะพัั ะฟั€ะพั‡ะธั‚ะฐั‚ะธ ะฒั–ะดะฟะพะฒั–ะดัŒ ัะตั€ะฒะตั€ะฐ"
-
-#~ msgid "E258: Unable to send to client"
-#~ msgstr "E258: ะะต ะฒะดะฐะปะพัั ะฝะฐะดั–ัะปะฐั‚ะธ ะบะปั–ั”ะฝั‚ัƒ"
-
-#~ msgid "Save As"
-#~ msgstr "ะ—ะฑะตั€ะตะณั‚ะธ ัะบ"
-
-#~ msgid "Source Vim script"
-#~ msgstr "ะŸั€ะพั‡ะธั‚ะฐั‚ะธ ัะบั€ะธะฟั‚ Vim"
-
-#~ msgid "Edit File"
-#~ msgstr "ะ ะตะดะฐะณัƒะฒะฐั‚ะธ ะคะฐะนะป"
-
-#~ msgid " (NOT FOUND)"
-#~ msgstr " (ะะ• ะ—ะะะ™ะ”ะ•ะะž)"
-
-#~ msgid "unknown"
-#~ msgstr "ะะตะฒั–ะดะพะผะพ"
-
-# msgstr "E185: "
-#~ msgid "Edit File in new window"
-#~ msgstr "ะ ะตะดะฐะณัƒะฒะฐั‚ะธ ั„ะฐะนะป ัƒ ะฝะพะฒะพะผัƒ ะฒั–ะบะฝั–"
-
-#~ msgid "Append File"
-#~ msgstr "ะ”ะพะฟะธัะฐั‚ะธ ั„ะฐะนะป"
-
-# msgstr "E187: "
-#~ msgid "Window position: X %d, Y %d"
-#~ msgstr "ะŸะพะทะธั†ั–ั ะฒั–ะบะฝะฐ: X %d, Y %d"
-
-# msgstr "E188: "
-#~ msgid "Save Redirection"
-#~ msgstr "ะ—ะฑะตั€ะตะณั‚ะธ ะฟะตั€ะตะฐะดั€ะตัะพะฒะฐะฝะธะน ะฒะธะฒั–ะด"
-
-#~ msgid "Save View"
-#~ msgstr "ะ—ะฑะตั€ะตะณั‚ะธ ะฒะธะณะปัะด"
-
-#~ msgid "Save Session"
-#~ msgstr "ะ—ะฑะตั€ะตะณั‚ะธ ัะตะฐะฝั"
-
-#~ msgid "Save Setup"
-#~ msgstr "ะ—ะฑะตั€ะตะณั‚ะธ ะฝะฐะปะฐัˆั‚ัƒะฒะฐะฝะฝั"
-
-#~ msgid "E809: #< is not available without the +eval feature"
-#~ msgstr "E809: #< ะฝะต ะดะพัั‚ัƒะฟะฝะฐ ะฑะตะท ะผะพะถะปะธะฒะพัั‚ั– +eval"
-
-#~ msgid "E196: No digraphs in this version"
-#~ msgstr "E196: ะฃ ั†ั–ะน ะฒะตั€ัั–ั— ะฝะตะผะฐั” ะดะธะณั€ะฐั„ั–ะฒ"
-
-#~ msgid "is a device (disabled with 'opendevice' option)"
-#~ msgstr "ั” ะฟั€ะธัั‚ั€ะพั”ะผ (ะฒะธะผะบะฝะตะฝะพ ะพะฟั†ั–ั”ัŽ 'opendevice')"
-
-#~ msgid "Reading from stdin..."
-#~ msgstr "ะงะธั‚ะฐั”ั‚ัŒัั ะท stdin..."
-
-#~ msgid "[blowfish]"
-#~ msgstr "[blowfish]"
-
-#~ msgid "[crypted]"
-#~ msgstr "[ะทะฐัˆะธั„ั€ะพะฒะฐะฝะพ]"
-
-#~ msgid "E821: File is encrypted with unknown method"
-#~ msgstr "E821: ะคะฐะนะป ะทะฐัˆะธั„ั€ะพะฒะฐะฝะพ ะฝะตะฒั–ะดะพะผะธะผ ะผะตั‚ะพะดะพะผ"
-
-#~ msgid "NetBeans disallows writes of unmodified buffers"
-#~ msgstr "NetBeans ะฝะต ะดะพะทะฒะพะปัั” ะทะฐะฟะธััƒะฒะฐั‚ะธ ัƒ ะฝะตะทะผั–ะฝะตะฝั– ะฑัƒั„ะตั€ะธ"
-
-# msgstr "E391: "
-#~ msgid "Partial writes disallowed for NetBeans buffers"
-#~ msgstr "ะงะฐัั‚ะบะพะฒั– ะทะฐะฟะธัะธ ะทะฐะฑะพั€ะพะฝะตะฝั– ะดะปั ะฑัƒั„ะตั€ั–ะฒ NetBeans"
-
-#~ msgid "writing to device disabled with 'opendevice' option"
-#~ msgstr "ะ—ะฐะฟะธั ะดะพ ะฟั€ะธัั‚ั€ะพัŽ ะทะฐะฑะพั€ะพะฝะตะฝะพ ะพะฟั†ั–ั”ัŽ 'opendevice'"
-
-#~ msgid "E460: The resource fork would be lost (add ! to override)"
-#~ msgstr "E460: ะ“ั–ะปะบัƒ ั€ะตััƒั€ัั–ะฒ ะผะพะถะฝะฐ ะฒั‚ั€ะฐั‚ะธั‚ะธ (! ั‰ะพะฑ ะฝะต ะทะฒะฐะถะฐั‚ะธ)"
-
-#~ msgid "<cannot open> "
-#~ msgstr "<ะฝะต ะฒั–ะดะบั€ะธะฒะฐั”ั‚ัŒัั> "
-
-#~ msgid "E616: vim_SelFile: can't get font %s"
-#~ msgstr "E616: vim_SelFile: ะฝะต ะฒะดะฐะปะพัั ะพั‚ั€ะธะผะฐั‚ะธ ัˆั€ะธั„ั‚ %s"
-
-#~ msgid "E614: vim_SelFile: can't return to current directory"
-#~ msgstr "E614: vim_SelFile: ะฝะต ะฒะดะฐะปะพัั ะฟะพะฒะตั€ะฝัƒั‚ะธัั ะฒ ะฟะพั‚ะพั‡ะฝะธะน ะบะฐั‚ะฐะปะพะณ"
-
-#~ msgid "Pathname:"
-#~ msgstr "ะจะปัั…:"
-
-#~ msgid "E615: vim_SelFile: can't get current directory"
-#~ msgstr "E615: vim_SelFile: ะฝะต ะฒะดะฐะปะพัั ะพั‚ั€ะธะผะฐั‚ะธ ะฟะพั‚ะพั‡ะฝะธะน ะบะฐั‚ะฐะปะพะณ"
-
-#~ msgid "OK"
-#~ msgstr "ะ“ะฐั€ะฐะทะด"
-
-#~ msgid "Cancel"
-#~ msgstr "ะกะบะฐััƒะฒะฐั‚ะธ"
-
-#~ msgid "Vim dialog"
-#~ msgstr "ะ”ั–ะฐะปะพะณ Vim"
-
-#~ msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
-#~ msgstr "Scrollbar Widget: ะะต ะฒะดะฐะปะพัั ะฒะธะทะฝะฐั‡ะธั‚ะธ ั€ะพะทะผั–ั€ ัะบะพั€ะพั‡ะตะฝะพั— ะบะฐั€ั‚ะธะฝะบะธ."
-
-#~ msgid "E232: Cannot create BalloonEval with both message and callback"
-#~ msgstr "E232: ะะต ะฒะดะฐะปะพัั ัั‚ะฒะพั€ะธั‚ะธ BalloonEval ะท ะฟะพะฒั–ะดะพะผะปะตะฝะฝัะผ ั– ั„ัƒะฝะบั†ั–ั”ัŽ"
-
-#~ msgid "E851: Failed to create a new process for the GUI"
-#~ msgstr "E851: ะะต ะฒะดะฐะปะพัั ัั‚ะฒะพั€ะธั‚ะธ ะฝะพะฒะธะน ะฟั€ะพั†ะตั ะดะปั GUI"
-
-#~ msgid "E852: The child process failed to start the GUI"
-#~ msgstr "E852: ะ”ะพั‡ั–ั€ะฝั–ะน ะฟั€ะพั†ะตั ะฝะต ะทะผั–ะณ ะทะฐะฟัƒัั‚ะธั‚ะธ GUI"
-
-# msgstr "E228: "
-#~ msgid "E229: Cannot start the GUI"
-#~ msgstr "E229: ะะต ะฒะดะฐะปะพัั ะทะฐะฟัƒัั‚ะธั‚ะธ GUI"
-
-# msgstr "E229: "
-#~ msgid "E230: Cannot read from \"%s\""
-#~ msgstr "E230: ะะต ะฒะดะฐะปะพัั ะฟั€ะพั‡ะธั‚ะฐั‚ะธ ะท ยซ%sยป"
-
-#~ msgid "E665: Cannot start GUI, no valid font found"
-#~ msgstr "E665: ะะต ะฒะดะฐะปะพัั ะทะฐะฟัƒัั‚ะธั‚ะธ GUI, ะฝะต ะทะฝะฐะนะดะตะฝะพ ัˆั€ะธั„ั‚"
-
-# msgstr "E230: "
-#~ msgid "E231: 'guifontwide' invalid"
-#~ msgstr "E231: ะะตะบะพั€ะตะบั‚ะฝะธะน 'guifontwide'"
-
-#~ msgid "E599: Value of 'imactivatekey' is invalid"
-#~ msgstr "E599: ะ—ะฝะฐั‡ะตะฝะฝั 'imactivatekey' ะฝะตะบะพั€ะตะบั‚ะฝะต"
-
-#~ msgid "E254: Cannot allocate color %s"
-#~ msgstr "E254: ะะต ะฒะดะฐะปะพัั ะพั‚ั€ะธะผะฐั‚ะธ ะบะพะปั–ั€ %s"
-
-#~ msgid "No match at cursor, finding next"
-#~ msgstr "ะะตะผะฐั” ะฝะฐะด ะบัƒั€ัะพั€ะพะผ, ะฟะพัˆัƒะบ ั‚ั€ะธะฒะฐั”"
-
-#~ msgid "Input _Methods"
-#~ msgstr "ะœะตั‚ะพะดะธ ะฒะฒะตะดะตะฝะฝั"
-
-#~ msgid "VIM - Search and Replace..."
-#~ msgstr "VIM - ะ—ะฝะฐะนั‚ะธ ะน ะทะฐะผั–ะฝะธั‚ะธ..."
-
-#~ msgid "VIM - Search..."
-#~ msgstr "VIM - ะŸะพัˆัƒะบ..."
-
-#~ msgid "Find what:"
-#~ msgstr "ะ—ะฝะฐะนั‚ะธ:"
-
-#~ msgid "Replace with:"
-#~ msgstr "ะ—ะฐะผั–ะฝะธั‚ะธ ะฝะฐ:"
-
-#~ msgid "Match whole word only"
-#~ msgstr "ะ›ะธัˆะต ะฟะพะฒะฝะต ัะปะพะฒะพ"
-
-#~ msgid "Match case"
-#~ msgstr "ะ—ะฒะฐะถะฐั‚ะธ ะฝะฐ ั€ะตะณั–ัั‚ั€"
-
-#~ msgid "Direction"
-#~ msgstr "ะะฐะฟั€ัะผ"
-
-#~ msgid "Up"
-#~ msgstr "ะ’ะณะพั€ัƒ"
-
-#~ msgid "Down"
-#~ msgstr "ะฃะฝะธะท"
-
-#~ msgid "Find Next"
-#~ msgstr "ะะฐัั‚ัƒะฟะฝะต"
-
-#~ msgid "Replace"
-#~ msgstr "ะ—ะฐะผั–ะฝะธั‚ะธ"
-
-#~ msgid "Replace All"
-#~ msgstr "ะ—ะฐะผั–ะฝะธั‚ะธ ัƒัั–"
-
-#~ msgid "Vim: Received \"die\" request from session manager\n"
-#~ msgstr "Vim: ะžั‚ั€ะธะผะฐะฒ ะทะฐะฟะธั‚ ยซdieยป ะฒั–ะด ะผะตะฝะตะดะถะตั€ะฐ ัะตัั–ะน\n"
-
-#~ msgid "Close"
-#~ msgstr "ะ—ะฐะบั€ะธั‚ะธ"
-
-#~ msgid "New tab"
-#~ msgstr "ะะพะฒะฐ ะฒะบะปะฐะดะบะฐ"
-
-#~ msgid "Open Tab..."
-#~ msgstr "ะ’ั–ะดะบั€ะธั‚ะธ ะฒะบะปะฐะดะบัƒ..."
-
-#~ msgid "Vim: Main window unexpectedly destroyed\n"
-#~ msgstr "Vim: ะะตัะฟะพะดั–ะฒะฐะฝะพ ะทะฝะธั‰ะธะปะพัั ะณะพะปะพะฒะฝะต ะฒั–ะบะฝะพ\n"
-
-#~ msgid "&Filter"
-#~ msgstr "&F:ะคั–ะปัŒั‚ั€ัƒะฒะฐั‚ะธ"
-
-#~ msgid "&Cancel"
-#~ msgstr "&C:ะกะบะฐััƒะฒะฐั‚ะธ"
-
-#~ msgid "Directories"
-#~ msgstr "ะšะฐั‚ะฐะปะพะณะธ"
-
-#~ msgid "Filter"
-#~ msgstr "ะคั–ะปัŒั‚ั€"
-
-#~ msgid "&Help"
-#~ msgstr "&H:ะ”ะพะฟะพะผะพะณะฐ"
-
-#~ msgid "Files"
-#~ msgstr "ะคะฐะนะปะธ"
-
-#~ msgid "&OK"
-#~ msgstr "&O:ะ“ะฐั€ะฐะทะด"
-
-#~ msgid "Selection"
-#~ msgstr "ะ’ะธะดั–ะปะตะฝะฝั"
-
-#~ msgid "Find &Next"
-#~ msgstr "&N:ะ—ะฝะฐะนั‚ะธ ะดะฐะปั–"
-
-#~ msgid "&Replace"
-#~ msgstr "&R:ะ—ะฐะผั–ะฝะธั‚ะธ"
-
-#~ msgid "Replace &All"
-#~ msgstr "&A:ะ—ะฐะผั–ะฝะธั‚ะธ ัƒัั–"
-
-#~ msgid "&Undo"
-#~ msgstr "&U:ะกะบะฐััƒะฒะฐั‚ะธ"
-
-#~ msgid "E671: Cannot find window title \"%s\""
-#~ msgstr "E671: ะะต ะฒะดะฐะปะพัั ะทะฝะฐะนั‚ะธ ะฒั–ะบะฝะพ ยซ%sยป"
-
-#~ msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
-#~ msgstr "E243: ะั€ะณัƒะผะตะฝั‚ ะฝะต ะฟั–ะดั‚ั€ะธะผัƒั”ั‚ัŒัั: ยซ-%sยป; ะบะพั€ะธัั‚ัƒะนั‚ะตััŒ ะฒะตั€ัั–ั”ัŽ ะท OLE."
-
-#~ msgid "E672: Unable to open window inside MDI application"
-#~ msgstr "E672: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ะฒั–ะบะฝะพ ะฒัะตั€ะตะดะธะฝั– ะฟั€ะพะณั€ะฐะผะธ MDI"
-
-#~ msgid "Close tab"
-#~ msgstr "ะ—ะฐะบั€ะธั‚ะธ ะฒะบะปะฐะดะบัƒ"
-
-#~ msgid "Open tab..."
-#~ msgstr "ะ’ั–ะดะบั€ะธั‚ะธ ะฒะบะปะฐะดะบัƒ..."
-
-# msgstr "E245: "
-#~ msgid "Find string (use '\\\\' to find a '\\')"
-#~ msgstr "ะ—ะฝะฐะนั‚ะธ ั€ัะดะพะบ ('\\\\' ั‰ะพะฑ ะทะฝะฐะนั‚ะธ '\\')"
-
-#~ msgid "Find & Replace (use '\\\\' to find a '\\')"
-#~ msgstr "ะ—ะฝะฐะนั‚ะธ ั– ะทะฐะผั–ะฝะธั‚ะธ ('\\\\' ั‰ะพะฑ ะทะฝะฐะนั‚ะธ '\\')"
+msgstr "ะผะตะฝัŽ ะ”ะพะฟะพะผะพะณะฐ->ะกะฟะพะฝัะพั€/ะ ะตั”ัั‚ั€ะฐั†ั–ั ะฟะพะดั€ะพะฑะธั†ั– "
-#~ msgid "Not Used"
-#~ msgstr "ะะตะผะฐั”"
-
-#~ msgid "Directory\t*.nothing\n"
-#~ msgstr "ะšะฐั‚ะฐะปะพะณ\t*.ะฝั–ั‡ะพะณะพ\n"
-
-#~ msgid ""
-#~ "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
-#~ msgstr ""
-#~ "Vim E458: ะะตะผะฐั” ะฒั–ะปัŒะฝะธั… ะบะพะผั–ั€ะพะบ ัƒ ะฟะฐะปั–ั‚ั€ั–, ะดะตัะบั– ะบะพะปัŒะพั€ะธ ะผะพะถัƒั‚ัŒ ะฑัƒั‚ะธ "
-#~ "ะฝะตะฟั€ะฐะฒะธะปัŒะฝั–"
-
-#~ msgid "E250: Fonts for the following charsets are missing in fontset %s:"
-#~ msgstr "E250: ะจั€ะธั„ั‚ะธ ะดะปั ั†ะธั… ัะธะผะฒะพะปั–ะฒ ะฒั–ะดััƒั‚ะฝั– ัƒ ะฝะฐะฑะพั€ั– %s:"
-
-# msgstr "E250: "
-#~ msgid "E252: Fontset name: %s"
-#~ msgstr "E252: ะะฐะทะฒะฐ ะฝะฐะฑะพั€ัƒ ัˆั€ะธั„ั‚ั–ะฒ: %s"
-
-# msgstr "E252: "
-#~ msgid "Font '%s' is not fixed-width"
-#~ msgstr "ะจั€ะธั„ั‚ '%s' ะฝะต ั” ะผะพะฝะพัˆะธั€ะธะฝะฝะธะผ"
-
-#~ msgid "E253: Fontset name: %s"
-#~ msgstr "E253: ะะฐะทะฒะฐ ะฝะฐะฑะพั€ัƒ ัˆั€ะธั„ั‚ั–ะฒ: %s"
-
-#~ msgid "Font0: %s"
-#~ msgstr "ะจั€ะธั„ั‚0: %s"
-
-#~ msgid "Font1: %s"
-#~ msgstr "ะจั€ะธั„ั‚1: %s"
-
-#~ msgid "Font%<PRId64> width is not twice that of font0"
-#~ msgstr "ะจะธั€ะธะฝะฐ ัˆั€ะธั„ั‚ัƒ%<PRId64> ะฝะต ะฑั–ะปัŒัˆะฐ ัƒะดะฒั–ั‡ั– ะทะฐ ัˆะธั€ะธะฝัƒ ัˆั€ะธั„ั‚ัƒ0"
-
-#~ msgid "Font0 width: %<PRId64>"
-#~ msgstr "ะจะธั€ะธะฝะฐ ัˆั€ะธั„ั‚ัƒ0: %<PRId64>"
-
-#~ msgid "Font1 width: %<PRId64>"
-#~ msgstr "ะจะธั€ะธะฝะฐ ัˆั€ะธั„ั‚ัƒ1: %<PRId64>"
-
-#~ msgid "Invalid font specification"
-#~ msgstr "ะะตะบะพั€ะตะบั‚ะฝะฐ ัะฟะตั†ะธั„ั–ะบะฐั†ั–ั ัˆั€ะธั„ั‚ัƒ"
-
-#~ msgid "&Dismiss"
-#~ msgstr "&D:ะŸั€ะธะฟะธะฝะธั‚ะธ"
-
-#~ msgid "no specific match"
-#~ msgstr "ะฝะตะผะฐั” ะบะพะฝะบั€ะตั‚ะฝะพะณะพ ะทะฑั–ะณัƒ"
-
-# msgstr "E234: "
-#~ msgid "Vim - Font Selector"
-#~ msgstr "Vim - ะ’ะธะฑั–ั€ ัˆั€ะธั„ั‚ัƒ"
-
-#~ msgid "Name:"
-#~ msgstr "ะะฐะทะฒะฐ:"
-
-#~ msgid "Show size in Points"
-#~ msgstr "ะŸะพะบะฐะทะฐั‚ะธ ั€ะพะทะผั–ั€ ัƒ ะฟัƒะฝะบั‚ะฐั…"
-
-#~ msgid "Encoding:"
-#~ msgstr "ะšะพะดัƒะฒะฐะฝะฝั:"
-
-#~ msgid "Font:"
-#~ msgstr "ะจั€ะธั„ั‚:"
-
-#~ msgid "Style:"
-#~ msgstr "ะกั‚ะธะปัŒ:"
-
-#~ msgid "Size:"
-#~ msgstr "ะ ะพะทะผั–ั€:"
-
-#~ msgid "E256: Hangul automata ERROR"
-#~ msgstr "E256: ะŸะพะผะธะปะบะฐ ะฐะฒั‚ะพะผะฐั‚ัƒ Hangul"
-
-#~ msgid "E563: stat error"
-#~ msgstr "E563: ะฟะพะผะธะปะบะฐ stat"
-
-#~ msgid "E625: cannot open cscope database: %s"
-#~ msgstr "E625: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ะฑะฐะทัƒ ะดะฐะฝะธั… cscope: %s"
-
-#~ msgid "E626: cannot get cscope database information"
-#~ msgstr "E626: ะะต ะฒะดะฐะปะพัั ะพั‚ั€ะธะผะฐั‚ะธ ั–ะฝั„ะพั€ะผะฐั†ั–ัŽ ะท ะฑะฐะทะธ ะดะฐะฝะธั… cscope"
-
-#~ msgid "Lua library cannot be loaded."
-#~ msgstr "ะะต ะฒะดะฐะปะพัั ะทะฐะฒะฐะฝั‚ะฐะถะธั‚ะธ ะฑั–ะฑะปั–ะพั‚ะตะบัƒ Lua"
-
-#~ msgid "cannot save undo information"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ะทะฑะตั€ะตะณั‚ะธ ั–ะฝั„ะพั€ะผะฐั†ั–ัŽ ะดะปั ัะบะฐััƒะฒะฐะฝะฝั"
-
-#~ msgid ""
-#~ "E815: Sorry, this command is disabled, the MzScheme libraries could not "
-#~ "be loaded."
-#~ msgstr ""
-#~ "E815: ะ’ะธะฑะฐั‡ั‚ะต, ั†ั ะบะพะผะฐะฝะดะฐ ะฒะธะผะบะฝะตะฝะฐ, ะฑั–ะฑะปั–ะพั‚ะตะบะธ MzScheme ะฝะต ะผะพะถัƒั‚ัŒ ะฑัƒั‚ะธ "
-#~ "ะทะฐะฒะฐะฝั‚ะฐะถะตะฝั–."
-
-#~ msgid "invalid expression"
-#~ msgstr "ะฝะตะบะพั€ะตะบั‚ะฝะธะน ะฒะธั€ะฐะท"
-
-#~ msgid "expressions disabled at compile time"
-#~ msgstr "ะพะฑั€ะพะฑะบัƒ ะฒะธั€ะฐะทั–ะฒ ะฒะธะผะบะฝะตะฝะพ ะฟั–ะด ั‡ะฐั ะบะพะผะฟั–ะปัั†ั–ั—"
-
-#~ msgid "hidden option"
-#~ msgstr "ะฟั€ะธั…ะพะฒะฐะฝะฐ ะพะฟั†ั–ั"
-
-#~ msgid "unknown option"
-#~ msgstr "ะฝะตะฒั–ะดะพะผะฐ ะพะฟั†ั–ั"
-
-#~ msgid "window index is out of range"
-#~ msgstr "ะฝะตะบะพั€ะตะบั‚ะฝะธะน ะฝะพะผะตั€ ะฒั–ะบะฝะฐ"
-
-#~ msgid "couldn't open buffer"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ะฑัƒั„ะตั€"
-
-#~ msgid "cannot delete line"
-#~ msgstr "ะฝะตะผะพะถะปะธะฒะพ ะทะฝะธั‰ะธั‚ะธ ั€ัะดะพะบ"
-
-#~ msgid "cannot replace line"
-#~ msgstr "ะฝะตะผะพะถะปะธะฒะพ ะทะฐะผั–ะฝะธั‚ะธ ั€ัะดะพะบ"
-
-#~ msgid "cannot insert line"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ะฒัั‚ะฐะฒะธั‚ะธ ั€ัะดะพะบ"
-
-#~ msgid "string cannot contain newlines"
-#~ msgstr "ะฑั–ะปัŒัˆะต ะฝั–ะถ ะพะดะธะฝ ั€ัะดะพะบ"
-
-#~ msgid "error converting Scheme values to Vim"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ะฟะตั€ะตั‚ะฒะพั€ะธั‚ะธ ะทะฝะฐั‡ะตะฝะฝั Scheme ัƒ Vim"
-
-#~ msgid "Vim error: ~a"
-#~ msgstr "ะŸะพะผะธะปะบะฐ Vim: ~a"
-
-#~ msgid "Vim error"
-#~ msgstr "ะŸะพะผะธะปะบะฐ Vim"
-
-#~ msgid "buffer is invalid"
-#~ msgstr "ะฑัƒั„ะตั€ ะฝะตะฟั€ะธะดะฐั‚ะฝะธะน"
-
-#~ msgid "window is invalid"
-#~ msgstr "ะฒั–ะบะฝะพ ะฝะตะฟั€ะธะดะฐั‚ะฝะต"
-
-#~ msgid "linenr out of range"
-#~ msgstr "ะฝะพะผะตั€ ั€ัะดะบะฐ ะทะฐ ะผะตะถะฐะผะธ ั„ะฐะนะปัƒ"
-
-#~ msgid "not allowed in the Vim sandbox"
-#~ msgstr "ะฝะต ะดะพะทะฒะพะปะตะฝะพ ัƒ ะฟั–ัะพั‡ะฝะธั†ั– Vim"
-
-#~ msgid "E837: This Vim cannot execute :py3 after using :python"
-#~ msgstr "E837: Python: ะะต ะผะพะถะฝะฐ ะฒะธะบะพั€ะธัั‚ะฐั‚ะธ :py ั– :py3 ะฒ ะพะดะฝะพะผัƒ ัะตะฐะฝัั–"
-
-#~ msgid ""
-#~ "E263: Sorry, this command is disabled, the Python library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E263: ะ’ะธะฑะฐั‡ั‚ะต, ั†ั ะบะพะผะฐะฝะดะฐ ะฒะธะผะบะฝะตะฝะฐ, ะฑั–ะฑะปั–ะพั‚ะตะบะฐ Python ะฝะต ะผะพะถะต ะฑัƒั‚ะธ "
-#~ "ะทะฐะฒะฐะฝั‚ะฐะถะตะฝะฐ."
-
-#~ msgid "E836: This Vim cannot execute :python after using :py3"
-#~ msgstr "E836: Python: ะะต ะผะพะถะฝะฐ ะฒะธะบะพั€ะธัั‚ะฐั‚ะธ :py ั– :py3 ะฒ ะพะดะฝะพะผัƒ ัะตะฐะฝัั–"
-
-#~ msgid "E659: Cannot invoke Python recursively"
-#~ msgstr "E659: ะะต ะผะพะถะฝะฐ ั€ะตะบัƒั€ัะธะฒะฝะพ ะฒะธะบะปะธะบะฐั‚ะธ Python"
-
-#~ msgid "E265: $_ must be an instance of String"
-#~ msgstr "E265: $_ ะผะฐั” ะฑัƒั‚ะธ ะตะบะทะตะผะฟะปัั€ะพะผ String"
-
-#~ msgid ""
-#~ "E266: Sorry, this command is disabled, the Ruby library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E266: ะ’ะธะฑะฐั‡ั‚ะต, ั†ั ะบะพะผะฐะฝะดะฐ ะฒะธะผะบะฝะตะฝะฐ, ะฑั–ะฑะปั–ะพั‚ะตะบะฐ Ruby ะฝะต ะผะพะถะต ะฑัƒั‚ะธ "
-#~ "ะทะฐะฒะฐะฝั‚ะฐะถะตะฝะฐ."
-
-# msgstr "E414: "
-#~ msgid "E267: unexpected return"
-#~ msgstr "E267: ะฝะตัะฟะพะดั–ะฒะฐะฝะธะน return"
-
-#~ msgid "E268: unexpected next"
-#~ msgstr "E268: ะฝะตัะฟะพะดั–ะฒะฐะฝะธะน next"
-
-#~ msgid "E269: unexpected break"
-#~ msgstr "E269: ะฝะตัะฟะพะดั–ะฒะฐะฝะธะน break"
-
-#~ msgid "E270: unexpected redo"
-#~ msgstr "E270: ะฝะตัะฟะพะดั–ะฒะฐะฝะธะน redo"
-
-#~ msgid "E271: retry outside of rescue clause"
-#~ msgstr "E271: retry ะฟะพะทะฐ rescue"
-
-#~ msgid "E272: unhandled exception"
-#~ msgstr "E272: ะะตะพะฑั€ะพะฑะปะตะฝะธะน ะฒะธะฝัั‚ะพะบ"
-
-# msgstr "E233: "
-#~ msgid "E273: unknown longjmp status %d"
-#~ msgstr "E273: ะะตะฒั–ะดะพะผะธะน ัั‚ะฐั‚ัƒั longjmp: %d"
-
-#~ msgid "Toggle implementation/definition"
-#~ msgstr "ะŸะตั€ะตะผะบะฝัƒั‚ะธ ั€ะตะฐะปั–ะทะฐั†ั–ัŽ/ะฒะธะทะฝะฐั‡ะตะฝะฝั"
-
-#~ msgid "Show base class of"
-#~ msgstr "ะ—ะฝะฐะนั‚ะธ ะฑะฐะทะพะฒะธะน ะบะปะฐั"
-
-#~ msgid "Show overridden member function"
-#~ msgstr "ะŸะพะบะฐะทะฐั‚ะธ ะทะฐะผั–ะฝะตะฝั– ั„ัƒะฝะบั†ั–ั—-ั‡ะปะตะฝะธ"
-
-#~ msgid "Retrieve from file"
-#~ msgstr "ะŸั€ะพั‡ะธั‚ะฐั‚ะธ ะท ั„ะฐะนะปัƒ"
-
-#~ msgid "Retrieve from project"
-#~ msgstr "ะžั‚ั€ะธะผะฐั‚ะธ ะท ะฟั€ะพะตะบั‚ัƒ"
-
-#~ msgid "Retrieve from all projects"
-#~ msgstr "ะžั‚ั€ะธะผะฐั‚ะธ ะท ัƒัั–ั… ะฟั€ะพะตะบั‚ั–ะฒ"
-
-#~ msgid "Retrieve"
-#~ msgstr "ะžั‚ั€ะธะผะฐั‚ะธ"
-
-#~ msgid "Show source of"
-#~ msgstr "ะ”ะถะตั€ะตะปะพ"
-
-#~ msgid "Find symbol"
-#~ msgstr "ะ—ะฝะฐะนั‚ะธ ัะธะผะฒะพะป"
-
-#~ msgid "Browse class"
-#~ msgstr "ะŸะตั€ะตะณะปัะฝัƒั‚ะธ ะบะปะฐั"
-
-#~ msgid "Show class in hierarchy"
-#~ msgstr "ะŸะพะบะฐะทะฐั‚ะธ ะบะปะฐั ะฒ ั–ั”ั€ะฐั€ั…ั–ั—"
-
-#~ msgid "Show class in restricted hierarchy"
-#~ msgstr "ะŸะพะบะฐะทะฐั‚ะธ ะบะปะฐั ะฒ ะพะฑะผะตะถะตะฝั–ะน ั–ั”ั€ะฐั€ั…ั–ั—"
-
-#~ msgid "Xref refers to"
-#~ msgstr "Xref ะฒะบะฐะทัƒั” ะฝะฐ"
-
-#~ msgid "Xref referred by"
-#~ msgstr "ะะฐ Xref ะฒะบะฐะทะฐะฝะพ ะท"
-
-#~ msgid "Xref has a"
-#~ msgstr "Xref ะผะฐั”"
-
-#~ msgid "Xref used by"
-#~ msgstr "Xref ะฒะธะบะพั€ะธัั‚ะฐะฝะพ"
-
-#~ msgid "Show docu of"
-#~ msgstr "ะŸะพะบะฐะทะฐั‚ะธ docu"
-
-#~ msgid "Generate docu for"
-#~ msgstr "ะกั‚ะฒะพั€ะธั‚ะธ docu ะดะปั"
-
-#~ msgid ""
-#~ "Cannot connect to SNiFF+. Check environment (sniffemacs must be found in "
-#~ "$PATH).\n"
-#~ msgstr ""
-#~ "ะะต ะฒะดะฐะปะพัั ะท'ั”ะดะฝะฐั‚ะธัั ะทั– SNiFF+. ะŸะตั€ะตะฒั–ั€ั‚ะต ะพั‚ะพั‡ะตะฝะฝั (sniffemacs ะผะฐั” ะฑัƒั‚ะธ "
-#~ "ัƒ $PATH).\n"
-
-#~ msgid "E274: Sniff: Error during read. Disconnected"
-#~ msgstr "E274: Sniff: ะŸะพะผะธะปะบะฐ ะฟั–ะด ั‡ะฐั ั‡ะธั‚ะฐะฝะฝั. ะ’ั–ะด'ั”ะดะฝะฐะฝะพ"
-
-#~ msgid "SNiFF+ is currently "
-#~ msgstr "SNiFF+ ะทะฐั€ะฐะท "
-
-#~ msgid "not "
-#~ msgstr "ะฝะต "
-
-#~ msgid "connected"
-#~ msgstr "ะฟั–ะด'ั”ะดะฝะฐะฝะธะน"
-
-#~ msgid "E275: Unknown SNiFF+ request: %s"
-#~ msgstr "E275: ะะตะฒั–ะดะพะผะธะน ะทะฐะฟะธั‚ ะดะพ SNiFF+: %s"
-
-#~ msgid "E276: Error connecting to SNiFF+"
-#~ msgstr "E276: ะŸะพะผะธะปะบะฐ ะท'ั”ะดะฝะฐะฝะฝั ะดะพ SNiFF+"
-
-#~ msgid "E278: SNiFF+ not connected"
-#~ msgstr "E278: SNiFF+ ะฝะต ะฟั–ะด'ั”ะดะฝะฐะฝะพ"
-
-#~ msgid "E279: Not a SNiFF+ buffer"
-#~ msgstr "E279: ะะต ั” ะฑัƒั„ะตั€ะพะผ SNiFF+"
-
-#~ msgid "Sniff: Error during write. Disconnected"
-#~ msgstr "Sniff: ะŸะพะผะธะปะบะฐ ะทะฐะฟะธััƒ. ะ’ั–ะด'ั”ะดะฝะฐะฝะพ"
-
-#~ msgid "invalid buffer number"
-#~ msgstr "ะฝะตะฟั€ะฐะฒะธะปัŒะฝะฐ ะฝะฐะทะฒะฐ ะฑัƒั„ะตั€ะฐ"
-
-#~ msgid "not implemented yet"
-#~ msgstr "ั‰ะต ะฝะต ั€ะตะฐะปั–ะทะพะฒะฐะฝะพ"
-
-#~ msgid "cannot set line(s)"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ะฒัั‚ะฐะฝะพะฒะธั‚ะธ ั€ัะดะบะธ"
-
-#~ msgid "invalid mark name"
-#~ msgstr "ะฝะตะฟั€ะฐะฒะธะปัŒะฝะฐ ะฝะฐะทะฒะฐ ะฟะพะทะฝะฐั‡ะบะธ"
-
-# msgstr "E19: "
-#~ msgid "mark not set"
-#~ msgstr "ะฟะพะผั–ั‚ะบัƒ ะฝะต ะฒะบะฐะทะฐะฝะพ"
-
-#~ msgid "row %d column %d"
-#~ msgstr "ั€ัะดะพะบ %d ะบะพะปะพะฝะบะฐ %d"
-
-#~ msgid "cannot insert/append line"
-#~ msgstr "ะะต ะฒะดะฐะปะพัั ะฒัั‚ะฐะฒะธั‚ะธ/ะดะพะดะฐั‚ะธ ั€ัะดะพะบ"
-
-#~ msgid "line number out of range"
-#~ msgstr "ะฝะพะผะตั€ ั€ัะดะบะฐ ะทะฐ ะผะตะถะฐะผะธ ั„ะฐะนะปัƒ"
-
-#~ msgid "unknown flag: "
-#~ msgstr "ะฝะตะฒั–ะดะพะผะธะน ะฟั€ะฐะฟะพั€ะตั†ัŒ: "
-
-#~ msgid "unknown vimOption"
-#~ msgstr "ะะตะฒั–ะดะพะผะฐ vimOption"
-
-#~ msgid "keyboard interrupt"
-#~ msgstr "ะฟะตั€ะตั€ะฒะฐะฝะพ ะท ะบะปะฐะฒั–ะฐั‚ัƒั€ะธ"
-
-#~ msgid "vim error"
-#~ msgstr "ะฟะพะผะธะปะบะฐ Vim"
-
-#~ msgid "cannot create buffer/window command: object is being deleted"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ัั‚ะฒะพั€ะธั‚ะธ ะบะพะผะฐะฝะดัƒ ะฒั–ะบะฝะฐ/ะฑัƒั„ะตั€ะฐ: ะพะฑ'ั”ะบั‚ ะทะฝะธั‰ัƒั”ั‚ัŒัั"
-
-#~ msgid ""
-#~ "cannot register callback command: buffer/window is already being deleted"
-#~ msgstr "ะะต ะฒะดะฐะปะพัั ะทะฐั€ะตั”ัั‚ั€ัƒะฒะฐั‚ะธ ะฟะพะดั–ัŽ: ะฑัƒั„ะตั€/ะฒั–ะบะฝะพ ัƒะถะต ะทะฝะธั‰ัƒั”ั‚ัŒัั"
-
-#~ msgid ""
-#~ "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-"
-#~ "dev@vim.org"
-#~ msgstr ""
-#~ "E280: ะคะะขะะ›ะฌะะ ะŸะžะœะ˜ะ›ะšะ TCL: ะผะพะถะปะธะฒะพ ะฟะพัˆะบะพะดะถะตะฝะพ ัะฟะธัะพะบ ะฟะพัะธะปะฐะฝัŒ!? ะ‘ัƒะดัŒ "
-#~ "ะปะฐัะบะฐ, ะฟะพะฒั–ะดะพะผั‚ะต ัƒ vim-dev@vim.org"
-
-#~ msgid "cannot register callback command: buffer/window reference not found"
-#~ msgstr ""
-#~ "ะะต ะฒะดะฐะปะพัั ะทะฐั€ะตั”ัั‚ั€ัƒะฒะฐั‚ะธ ะบะพะผะฐะฝะดัƒ ะฟะพะดั–ั—: ะฟะพัะธะปะฐะฝะฝั ะฝะฐ ะฑัƒั„ะตั€/ะฒั–ะบะฝะพ ะฝะต "
-#~ "ะทะฝะฐะนะดะตะฝะพ"
-
-#~ msgid ""
-#~ "E571: Sorry, this command is disabled: the Tcl library could not be "
-#~ "loaded."
-#~ msgstr ""
-#~ "E571: ะ’ะธะฑะฐั‡ั‚ะต, ั†ั ะบะพะผะฐะฝะดะฐ ะฒะธะผะบะฝะตะฝะฐ, ะฑั–ะฑะปั–ะพั‚ะตะบะฐ Tcl ะฝะต ะผะพะถะต ะฑัƒั‚ะธ "
-#~ "ะทะฐะฒะฐะฝั‚ะฐะถะตะฝะฐ."
-
-#~ msgid "E572: exit code %d"
-#~ msgstr "E572: ะšะพะด ะฒะธั…ะพะดัƒ %d"
-
-#~ msgid "cannot get line"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ะดั–ัั‚ะฐั‚ะธ ั€ัะดะพะบ"
-
-#~ msgid "Unable to register a command server name"
-#~ msgstr "ะะต ะฒะดะฐะปะพัั ะทะฐั€ะตั”ัั‚ั€ัƒะฒะฐั‚ะธ ะฝะฐะทะฒัƒ ัะตั€ะฒะตั€ะฐ ะบะพะผะฐะฝะด"
-
-#~ msgid "E248: Failed to send command to the destination program"
-#~ msgstr "E248: ะะต ะฒะดะฐะปะพัั ะฒั–ะดั–ัะปะฐั‚ะธ ะบะพะผะฐะฝะดัƒ ะดะพ ะฟั€ะพะณั€ะฐะผะธ-ั†ั–ะปั–"
-
-#~ msgid "E573: Invalid server id used: %s"
-#~ msgstr "E573: ะ’ะธะบะพั€ะธัั‚ะฐะฝะพ ะฝะตะบะพั€ะตะบั‚ะฝะธะน ั–ะดะตะฝั‚ะธั„ั–ะบะฐั‚ะพั€ ัะตั€ะฒะตั€ะฐ: %s"
-
-#~ msgid "E251: VIM instance registry property is badly formed. Deleted!"
-#~ msgstr ""
-#~ "E251: ะ ะตะบะฒั–ะทะธั‚ ั€ะตั”ัั‚ั€ัƒ ะทั€ะฐะทะบัƒ VIM ัั„ะพั€ะผะพะฒะฐะฝะธะน ะฝะตะฟั€ะฐะฒะธะปัŒะฝะพ. ะ—ะฝะธั‰ะตะฝะพ!"
-
-#~ msgid "netbeans is not supported with this GUI\n"
-#~ msgstr "netbeans ะฝะต ะฟั–ะดั‚ั€ะธะผัƒั”ั‚ัŒัั ะท ั†ะธะผ GUI\n"
-
-#~ msgid "This Vim was not compiled with the diff feature."
-#~ msgstr "ะฆั ะฒะตั€ัั–ั Vim ะฝะต ะฑัƒะปะฐ ัะบะพะผะฟั–ะปัŒะพะฒะฐะฝะฐ ะท ะฟั–ะดั‚ั€ะธะผะบะพัŽ ะฟะพั€ั–ะฒะฝัะฝะฝั."
-
-#~ msgid "'-nb' cannot be used: not enabled at compile time\n"
-#~ msgstr "ะะต ะผะพะถะฝะฐ ะฒะธะบะพั€ะธัั‚ะฐั‚ะธ '-nb': ะฝะต ะดะพะทะฒะพะปะตะฝะพ ะฟั–ะด ั‡ะฐั ะบะพะผะฟั–ะปัั†ั–ั—\n"
-
-#~ msgid "Vim: Error: Failure to start gvim from NetBeans\n"
-#~ msgstr "Vim: ะŸะพะผะธะปะบะฐ: ะะต ะฒะดะฐะปะพัั ะทะฐะฟัƒัั‚ะธั‚ะธ gvim ะดะปั NetBeans\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Where case is ignored prepend / to make flag upper case"
-#~ msgstr ""
-#~ "\n"
-#~ "ะฏะบั‰ะพ ั€ะตะณั–ัั‚ั€ ั–ะณะฝะพั€ัƒั”ั‚ัŒัั, ะดะพะดะฐะนั‚ะต / ัะฟะตั€ะตะดัƒ ั‰ะพะฑ ะฟั€ะฐะฟะพั€ะตั†ัŒ ะฑัƒะฒ ัƒ ะฒะตั€ั…ะฝัŒะพะผัƒ "
-#~ "ั€ะตะณั–ัั‚ั€ั–."
-
-#~ msgid "-register\t\tRegister this gvim for OLE"
-#~ msgstr "-register\t\tะ—ะฐั€ะตั”ัั‚ั€ัƒะฒะฐั‚ะธ ั†ะตะน gvim ะดะปั OLE"
-
-#~ msgid "-unregister\t\tUnregister gvim for OLE"
-#~ msgstr "-unregister\t\tะกะบะฐััƒะฒะฐั‚ะธ ั€ะตั”ัั‚ั€ะฐั†ั–ัŽ ั†ัŒะพะณะพ gvim ะดะปั OLE"
-
-#~ msgid "-g\t\t\tRun using GUI (like \"gvim\")"
-#~ msgstr "-g\t\t\tะ—ะฐะฟัƒัั‚ะธั‚ะธ GUI (ะฝั–ะฑะธ ยซgvimยป)"
-
-#~ msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
-#~ msgstr "-f ั‡ะธ --nofork\tะŸะตั€ะตะดะฝั–ะน ะฟะปะฐะฝ: ั‚ั€ะธะผะฐั‚ะธ ั‚ะตั€ะผั–ะฝะฐะป ะฟั–ัะปั ะทะฐะฟัƒัะบัƒ GUI"
-
-#~ msgid "-f\t\t\tDon't use newcli to open window"
-#~ msgstr "-f\t\t\tะะต ะฒะธะบะพั€ะธัั‚ะพะฒัƒะฒะฐั‚ะธ newcli ะดะปั ะฒั–ะดะบั€ะธั‚ั‚ั ะฒั–ะบะฝะฐ"
-
-#~ msgid "-dev <device>\t\tUse <device> for I/O"
-#~ msgstr "-dev <ะฟั€ะธัั‚ั€ั–ะน>\t\t\tะ’ะธะบะพั€ะธัั‚ะพะฒัƒะฒะฐั‚ะธ <ะฟั€ะธัั‚ั€ั–ะน> ะดะปั ะฒะฒะพะดัƒ/ะฒะธะฒะพะดัƒ"
-
-#~ msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
-#~ msgstr "-u <gvimrc>\t\tะ’ะธะบะพั€ะธัั‚ะฐั‚ะธ ะฟะพะดะฐะฝะธะน ั„ะฐะนะป ะทะฐะผั–ัั‚ัŒ .gvimrc"
-
-#~ msgid "-x\t\t\tEdit encrypted files"
-#~ msgstr "-x\t\t\tะ ะตะดะฐะณัƒะฒะฐั‚ะธ ะทะฐัˆะธั„ั€ะพะฒะฐะฝั– ั„ะฐะนะปะธ"
-
-#~ msgid "-display <display>\tConnect vim to this particular X-server"
-#~ msgstr "-display <ะดะธัะฟะปะตะน>\tะŸั–ะด'ั”ะดะฝะฐั‚ะธ vim ะดะพ ะทะฐะดะฐะฝะพะณะพ ะดะธัะฟะปะตัŽ ัะตั€ะฒะตั€ะฐ X"
-
-#~ msgid "-X\t\t\tDo not connect to X server"
-#~ msgstr "-X\t\t\tะะต ะท'ั”ะดะฝัƒะฒะฐั‚ะธัั ะท X ัะตั€ะฒะตั€ะพะผ"
-
-#~ msgid "--remote <files>\tEdit <files> in a Vim server if possible"
-#~ msgstr ""
-#~ "--remote <ั„ะฐะนะปะธ>\tะ ะตะดะฐะณัƒะฒะฐั‚ะธ <ั„ะฐะนะปะธ> ะฝะฐ ัะตั€ะฒะตั€ั– Vim, ัะบั‰ะพ ั†ะต ะผะพะถะปะธะฒะพ"
-
-#~ msgid "--remote-silent <files> Same, don't complain if there is no server"
-#~ msgstr ""
-#~ "--remote-silent <ั„ะฐะนะปะธ> ะขะต ัะฐะผะต, ั‚ั–ะปัŒะบะธ ะฝะต ัะบะฐั€ะถะธั‚ะธัั ะฝะฐ ะฒั–ะดััƒั‚ะฝั–ัั‚ัŒ "
-#~ "ัะตั€ะฒะตั€ะฐ"
-
-#~ msgid ""
-#~ "--remote-wait <files> As --remote but wait for files to have been edited"
-#~ msgstr ""
-#~ "--remote-wait <ั„ะฐะนะปะธ> ..., ะฐะปะต ะทะฐั‡ะตะบะฐั‚ะธ ะฟะพะบะธ ัƒัั– ั„ะฐะนะปะธ ะฑัƒะดัƒั‚ัŒ "
-#~ "ะฒั–ะดั€ะตะดะฐะณะพะฒะฐะฝั–"
-
-#~ msgid ""
-#~ "--remote-wait-silent <files> Same, don't complain if there is no server"
-#~ msgstr ""
-#~ "--remote-wait-silent <ั„ะฐะนะปะธ> ะขะต ัะฐะผะต, ั‚ั–ะปัŒะบะธ ะฝะต ัะบะฐั€ะถะธั‚ะธัั, ัะบั‰ะพ ัะตั€ะฒะตั€ะฐ "
-#~ "ะฝะตะผะฐั”"
-
-#~ msgid ""
-#~ "--remote-tab[-wait][-silent] <files> As --remote but use tab page per "
-#~ "file"
-#~ msgstr ""
-#~ "--remote-tab[-wait][-silent] <ั„ะฐะนะปะธ> ะขะฐะบ ัะฐะผะพ, ัะบ --remote, ะฐะปะต ะฟะพ "
-#~ "ะฒะบะปะฐะดั†ั– ะฝะฐ ั„ะฐะนะป"
-
-#~ msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
-#~ msgstr ""
-#~ "--remote-send <ัะธะผะฒะพะปะธ> ะ’ั–ะดั–ัะปะฐั‚ะธ <ัะธะผะฒะพะปะธ> ัะตั€ะฒะตั€ัƒ ั– ะทะฐะฒะตั€ัˆะธั‚ะธ ั€ะพะฑะพั‚ัƒ"
-
-#~ msgid ""
-#~ "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
-#~ msgstr ""
-#~ "--remote-expr <ะฒะธั€ะฐะท> ะ’ะธะบะพะฝะฐั‚ะธ <ะฒะธั€ะฐะท> ัƒ ัะตั€ะฒะตั€ั– Vim ั– ะฝะฐะดั€ัƒะบัƒะฒะฐั‚ะธ "
-#~ "ั€ะตะทัƒะปัŒั‚ะฐั‚"
-
-#~ msgid "--serverlist\t\tList available Vim server names and exit"
-#~ msgstr ""
-#~ "--serverlist\t\tะŸะพะบะฐะทะฐั‚ะธ ัะฟะธัะพะบ ะฝะฐัะฒะฝะธั… ัะตั€ะฒะตั€ั–ะฒ Vim ั– ะทะฐะฒะตั€ัˆะธั‚ะธ ั€ะพะฑะพั‚ัƒ"
-
-#~ msgid "--servername <name>\tSend to/become the Vim server <name>"
-#~ msgstr "--servername <ะฝะฐะทะฒะฐ>\tะะฐะดั–ัะปะฐั‚ะธ ะดะพ/ัั‚ะฐั‚ะธ Vim ัะตั€ะฒะตั€ะพะผ ะท <ะฝะฐะทะฒะพัŽ>"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Motif version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ะั€ะณัƒะผะตะฝั‚ะธ ะดะปั gvim (ะฒะตั€ัั–ั Motif)\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (neXtaw version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ะั€ะณัƒะผะตะฝั‚ะธ ะดะปั gvim (ะฒะตั€ัั–ั neXtaw):\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Athena version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ะั€ะณัƒะผะตะฝั‚ะธ ะดะปั gvim (ะฒะตั€ัั–ั Athena)\n"
-
-#~ msgid "-display <display>\tRun vim on <display>"
-#~ msgstr "-display <ะดะธัะฟะปะตะน>\tะ’ะธะบะพะฝะฐั‚ะธ vim ะฝะฐ ะทะฐะดะฐะฝะพะผัƒ <ะดะธัะฟะปะตั—>"
-
-#~ msgid "-iconic\t\tStart vim iconified"
-#~ msgstr "-iconic\t\tะ—ะฐะฟัƒัั‚ะธั‚ะธ Vim ั– ะทะณะพั€ะฝัƒั‚ะธ ะนะพะณะพ ะฒั–ะบะฝะพ"
-
-#~ msgid "-background <color>\tUse <color> for the background (also: -bg)"
-#~ msgstr "-background <ะบะพะปั–ั€>\tะ’ะธะบะพั€ะธัั‚ะฐั‚ะธ <ะบะพะปั–ั€> ะดะปั ั„ะพะฝัƒ (ั‚ะฐะบะพะถ: -bg)"
-
-#~ msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
-#~ msgstr ""
-#~ "-foreground <ะบะพะปั–ั€>\tะ’ะธะบะพั€ะธัั‚ะฐั‚ะธ <ะบะพะปั–ั€> ะดะปั ะทะฒะธั‡ะฐะนะฝะพะณะพ ั‚ะตะบัั‚ัƒ (ั‚ะฐะบะพะถ: -"
-#~ "fg)"
-
-#~ msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
-#~ msgstr ""
-#~ "-font <ัˆั€ะธั„ั‚>\tะ’ะธะบะพั€ะธัั‚ะฐั‚ะธ <ัˆั€ะธั„ั‚> ะดะปั ะทะฒะธั‡ะฐะนะฝะพะณะพ ั‚ะตะบัั‚ัƒ (ั‚ะฐะบะพะถ: -fn)"
-
-#~ msgid "-boldfont <font>\tUse <font> for bold text"
-#~ msgstr "-boldfont <ัˆั€ะธั„ั‚>\tะ’ะธะบะพั€ะธัั‚ะฐั‚ะธ <ัˆั€ะธั„ั‚> ะดะปั ะถะธั€ะฝะพะณะพ ั‚ะตะบัั‚ัƒ"
-
-#~ msgid "-italicfont <font>\tUse <font> for italic text"
-#~ msgstr "-italicfont <ัˆั€ะธั„ั‚>\tะ’ะธะบะพั€ะธัั‚ะฐั‚ะธ <ัˆั€ะธั„ั‚> ะดะปั ะฟะพั…ะธะปะพะณะพ ั‚ะตะบัั‚ัƒ"
-
-#~ msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
-#~ msgstr "-geometry <ะณะตะพะผ>\tะ—ะฐะดะฐั‚ะธ ั€ะพะทะผั–ั€ะธ ะน ะฟะพะปะพะถะตะฝะฝั (ั‚ะฐะบะพะถ: -geom)"
-
-#~ msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
-#~ msgstr "-borderwidth <ั‚ะพะฒั‰>\tะ’ัั‚ะฐะฝะพะฒะธั‚ะธ ั‚ะพะฒั‰ะธะฝัƒ ะผะตะถ <ั‚ะพะฒั‰> (ั‚ะฐะบะพะถ: -bw)"
-
-#~ msgid ""
-#~ "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
-#~ msgstr ""
-#~ "-scrollbarwidth <ั‚ะพะฒั‰> ะ’ัั‚ะฐะฝะพะฒะธั‚ะธ ั‚ะพะฒั‰ะธะฝัƒ ะปั–ะฝั–ะนะบะธ ะทััƒะฒัƒ (ั‚ะฐะบะพะถ: -sw)"
-
-#~ msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
-#~ msgstr "-menuheight <ะฒะธัะพั‚ะฐ>\tะ’ัั‚ะฐะฝะพะฒะธั‚ะธ ะฒะธัะพั‚ัƒ ะผะตะฝัŽ <ะฒะธัะพั‚ะฐ> (ั‚ะฐะบะพะถ: -mh)"
-
-#~ msgid "-reverse\t\tUse reverse video (also: -rv)"
-#~ msgstr "-reverse\t\tะžะฑะตั€ะฝัƒั‚ะธ ะบะพะปัŒะพั€ะธ (ั‚ะฐะบะพะถ: -rv)"
-
-#~ msgid "+reverse\t\tDon't use reverse video (also: +rv)"
-#~ msgstr "+reverse\t\tะะต ะพะฑะตั€ั‚ะฐั‚ะธ ะบะพะปัŒะพั€ะธ (ั‚ะฐะบะพะถ: +rv)"
-
-#~ msgid "-xrm <resource>\tSet the specified resource"
-#~ msgstr "-xrm <ั€ะตััƒั€ั>\t\tะ’ัั‚ะฐะฝะพะฒะธั‚ะธ ะทะฐะทะฝะฐั‡ะตะฝะธะน ั€ะตััƒั€ั"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (GTK+ version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ะั€ะณัƒะผะตะฝั‚ะธ gvim (ะฒะตั€ัั–ั GTK+)\n"
-
-#~ msgid "-display <display>\tRun vim on <display> (also: --display)"
-#~ msgstr "-display <ะดะธัะฟะปะตะน>\tะ’ะธะบะพะฝะฐั‚ะธ vim ะฝะฐ <ะดะธัะฟะปะตั—> (ั‚ะฐะบะพะถ: --display)"
-
-#~ msgid "--role <role>\tSet a unique role to identify the main window"
-#~ msgstr ""
-#~ "--role <ั€ะพะปัŒ>\tะ’ัั‚ะฐะฝะพะฒะธั‚ะธ ัƒะฝั–ะบะฐะปัŒะฝัƒ ั€ะพะปัŒ ะดะปั ั–ะดะตะฝั‚ะธั„ั–ะบะฐั†ั–ั— ะณะพะปะพะฒะฝะพะณะพ ะฒั–ะบะฝะฐ"
-
-#~ msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
-#~ msgstr "--socketid <xid>\tะ’ั–ะดะบั€ะธั‚ะธ Vim ะฒ ั–ะฝัˆะพะผัƒ ะตะปะตะผะตะฝั‚ั– ั–ะฝั‚ะตั€ั„ะตะนััƒ GTK"
-
-#~ msgid "--echo-wid\t\tMake gvim echo the Window ID on stdout"
-#~ msgstr "--echo-wid\t\tะฅะฐะน gvim ะฝะฐะดั€ัƒะบัƒั” ั–ะดะตะฝั‚ะธั„ั–ะบะฐั‚ะพั€ ะฒั–ะบะฝะฐ ะฝะฐ stdout"
-
-#~ msgid "-P <parent title>\tOpen Vim inside parent application"
-#~ msgstr "-P <ะทะฐะณะพะปะพะฒะพะบ ะฑะฐั‚ัŒะบะฐ>\tะ’ั–ะดะบั€ะธั‚ะธ Vim ะฒัะตั€ะตะดะธะฝั– ะฑะฐั‚ัŒะบั–ะฒััŒะบะพะณะพ ะฒั–ะบะฝะฐ"
-
-#~ msgid "--windowid <HWND>\tOpen Vim inside another win32 widget"
-#~ msgstr "--windowid <HWND>\tะ’ั–ะดะบั€ะธั‚ะธ Vim ะฒัะตั€ะตะดะธะฝั– ั–ะฝัˆะพะณะพ ะตะปะตะผะตะฝั‚ัƒ win32"
-
-#~ msgid "No display"
-#~ msgstr "ะะตะผะฐั” ะดะธัะฟะปะตัŽ"
-
-#~ msgid ": Send failed.\n"
-#~ msgstr ": ะะต ะฒะดะฐะปะพัั ะฒั–ะดั–ัะปะฐั‚ะธ.\n"
-
-#~ msgid ": Send failed. Trying to execute locally\n"
-#~ msgstr ": ะะต ะฒะดะฐะปะพัั ะฒั–ะดั–ัะปะฐั‚ะธ. ะกะฟั€ะพะฑะฐ ะฒะธะบะพะฝะฐั‚ะธ ะฝะฐ ะผั–ัั†ั–\n"
-
-#~ msgid "%d of %d edited"
-#~ msgstr "ะฒั–ะดั€ะตะดะฐะณะพะฒะฐะฝะพ %d ะท %d"
-
-#~ msgid "No display: Send expression failed.\n"
-#~ msgstr "ะะตะผะฐั” ะดะธัะฟะปะตัŽ: ะ’ั–ะดั–ัะปะฐั‚ะธ ะฒะธั€ะฐะท ะฝะต ะฒะดะฐะปะพัั.\n"
-
-#~ msgid ": Send expression failed.\n"
-#~ msgstr ": ะ’ั–ะดั–ัะปะฐั‚ะธ ะฒะธั€ะฐะท ะฝะต ะฒะดะฐะปะพัั.\n"
-
-#~ msgid "E543: Not a valid codepage"
-#~ msgstr "E543: ะะตะบะพั€ะตะบั‚ะฝะฐ ะบะพะดะพะฒะฐ ัั‚ะพั€ั–ะฝะบะฐ"
-
-#~ msgid "E284: Cannot set IC values"
-#~ msgstr "E284: ะะต ะฒะดะฐะปะพัั ะฒัั‚ะฐะฝะพะฒะธั‚ะธ ะทะฝะฐั‡ะตะฝะฝั ะบะพะฝั‚ะตะบัั‚ัƒ ะฒะฒะพะดัƒ"
-
-#~ msgid "E285: Failed to create input context"
-#~ msgstr "E285: ะะต ะฒะดะฐะปะพัั ัั‚ะฒะพั€ะธั‚ะธ ะบะพะฝั‚ะตะบัั‚ ะฒะฒะพะดัƒ"
-
-#~ msgid "E286: Failed to open input method"
-#~ msgstr "E286: ะะต ะฒะดะฐะปะพัั ัั‚ะฒะพั€ะธั‚ะธ ะผะตั‚ะพะด ะฒะฒะพะดัƒ"
-
-# msgstr "E286: "
-#~ msgid "E287: Warning: Could not set destroy callback to IM"
-#~ msgstr ""
-#~ "E287: ะ—ะฐัั‚ะตั€ะตะถะตะฝะฝั: ะะต ะฒะดะฐะปะพัั ะฒัั‚ะฐะฝะพะฒะธั‚ะธ ะฒ ะผะตั‚ะพะดั– ะฒะฒะพะดัƒ ะฟะพะดั–ัŽ ะทะฝะธั‰ะตะฝะฝั"
-
-# msgstr "E287: "
-#~ msgid "E288: input method doesn't support any style"
-#~ msgstr "E288: ะœะตั‚ะพะด ะฒะฒะพะดัƒ ะฝะต ะฟั–ะดั‚ั€ะธะผัƒั” ัั‚ะธะปั–"
-
-# msgstr "E288: "
-#~ msgid "E289: input method doesn't support my preedit type"
-#~ msgstr "E289: ะœะตั‚ะพะด ะฒะฒะพะดัƒ ะฝะต ะฟั–ะดั‚ั€ะธะผัƒั” ะฒั–ะดั€ะตะดะฐะณะพะฒะฐะฝั– ั‚ะธะฟะธ"
-
-#~ msgid "E843: Error while updating swap file crypt"
-#~ msgstr "E843: ะŸะพะผะธะปะบะฐ ะฟะพะฝะพะฒะปะตะฝะฝั ัˆะธั„ั€ัƒะฒะฐะฝะฝั ั„ะฐะนะปัƒ ะพะฑะผั–ะฝัƒ"
-
-#~ msgid ""
-#~ "E833: %s is encrypted and this version of Vim does not support encryption"
-#~ msgstr "E833: %s ะทะฐัˆะธั„ั€ะพะฒะฐะฝะพ, ะฐ ั†ั ะฒะตั€ัั–ั Vim ะฝะต ะฟั–ะดั‚ั€ะธะผัƒั” ัˆะธั„ั€ัƒะฒะฐะฝะฝั"
-
-#~ msgid "Swap file is encrypted: \"%s\""
-#~ msgstr "ะคะฐะนะป ะพะฑะผั–ะฝัƒ ะทะฐัˆะธั„ั€ะพะฒะฐะฝะธะน: ยซ%sยป"
-
-#~ msgid ""
-#~ "\n"
-#~ "If you entered a new crypt key but did not write the text file,"
-#~ msgstr ""
-#~ "\n"
-#~ "ะฏะบั‰ะพ ะฒะธ ะทะฐะดะฐะปะธ ะฝะพะฒะธะน ะบะปัŽั‡ ัˆะธั„ั€ัƒ, ะฐะปะต ะฝะต ะทะฐะฟะธัะฐะปะธ ั‚ะตะบัั‚ะพะฒะธะน ั„ะฐะนะป,"
-
-#~ msgid ""
-#~ "\n"
-#~ "enter the new crypt key."
-#~ msgstr ""
-#~ "\n"
-#~ "ะฒะฒะตะดั–ั‚ัŒ ะฝะพะฒะธะน ะบะปัŽั‡ ัˆะธั„ั€ัƒ."
-
-#~ msgid ""
-#~ "\n"
-#~ "If you wrote the text file after changing the crypt key press enter"
-#~ msgstr ""
-#~ "\n"
-#~ "ะฏะบั‰ะพ ะฒะธ ะทะฐะฟะธัะฐะปะธ ั‚ะตะบัั‚ะพะฒะธะน ั„ะฐะนะป ะฟั–ัะปั ะทะผั–ะฝะธ ะบะปัŽั‡ะฐ ัˆะธั„ั€ัƒ, ะฝะฐั‚ะธัะฝั–ั‚ัŒ enter"
-
-#~ msgid ""
-#~ "\n"
-#~ "to use the same key for text file and swap file"
-#~ msgstr ""
-#~ "\n"
-#~ "ั‰ะพะฑ ะฒะธะบะพั€ะธัั‚ะฐั‚ะธ ะพะดะฝะฐะบะพะฒะธะน ะบะปัŽั‡ ะดะปั ั‚ะตะบัั‚ะพะฒะพะณะพ ั„ะฐะนะปัƒ ั‚ะฐ ั„ะฐะนะปัƒ ะพะฑะผั–ะฝัƒ"
-
-#~ msgid "Using crypt key from swap file for the text file.\n"
-#~ msgstr "ะ”ะปั ั‚ะตะบัั‚ะพะฒะพะณะพ ั„ะฐะนะปัƒ ะฒะธะบะพั€ะธัั‚ะพะฒัƒั”ั‚ัŒัั ะบะปัŽั‡ ัˆะธั„ั€ัƒ ะท ั„ะฐะนะปัƒ ะพะฑะผั–ะฝัƒ.\n"
-
-#~ msgid ""
-#~ "\n"
-#~ " [not usable with this version of Vim]"
-#~ msgstr ""
-#~ "\n"
-#~ " [ะฝะต ะฟั€ะธะดะฐั‚ะฝะธะน ะดะปั ั†ั–ั”ั— ะฒะตั€ัั–ั— Vim]"
-
-#~ msgid "Tear off this menu"
-#~ msgstr "ะ’ั–ะดั–ั€ะฒะฐั‚ะธ ั†ะต ะผะตะฝัŽ"
-
-#~ msgid "Select Directory dialog"
-#~ msgstr "ะ’ะธะฑั€ะฐั‚ะธ ะบะฐั‚ะฐะปะพะณ"
-
-#~ msgid "Save File dialog"
-#~ msgstr "ะ—ะฐะฟะฐะผ'ัั‚ะฐั‚ะธ ั„ะฐะนะป"
-
-#~ msgid "Open File dialog"
-#~ msgstr "ะ’ั–ะดะบั€ะธั‚ะธ ั„ะฐะนะป"
-
-#~ msgid "E338: Sorry, no file browser in console mode"
-#~ msgstr "E338: ะ’ะธะฑะฐั‡ั‚ะต, ะฐะปะต ะฒ ะบะพะฝัะพะปั– ะฝะตะผะฐั” ะดั–ะฐะปะพะณัƒ ะฒะธะฑะพั€ัƒ ั„ะฐะนะปัƒ"
-
-#~ msgid "ERROR: "
-#~ msgstr "ะŸะžะœะ˜ะ›ะšะ: "
-
-#~ msgid ""
-#~ "\n"
-#~ "[bytes] total alloc-freed %<PRIu64>-%<PRIu64>, in use %<PRIu64>, peak use "
-#~ "%<PRIu64>\n"
-#~ msgstr ""
-#~ "\n"
-#~ "[ะฑะฐะนั‚] ะฒััŒะพะณะพ ั€ะพะทะผ/ะทะฝะธั‰. %<PRIu64>/%<PRIu64>, ะฒะธะบะพั€. %<PRIu64>, ะผะฐะบั. "
-#~ "%<PRIu64>\n"
-
-#~ msgid ""
-#~ "[calls] total re/malloc()'s %<PRIu64>, total free()'s %<PRIu64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "[ะฒะธะบะปะธะบะธ] ัƒััŒะพะณะพ re/malloc() - %<PRIu64>, ัƒััŒะพะณะพ free() - %<PRIu64>\n"
-#~ "\n"
-
-#~ msgid "E340: Line is becoming too long"
-#~ msgstr "E340: ะ ัะดะพะบ ัั‚ะฐั” ะทะฐะฝะฐะดั‚ะพ ะดะพะฒะณะธะผ"
-
-# msgstr "E340: "
-#~ msgid "E341: Internal error: lalloc(%<PRId64>, )"
-#~ msgstr "E341: ะ’ะฝัƒั‚ั€ั–ัˆะฝั ะฟะพะผะธะปะบะฐ: lalloc(%<PRId64>, )"
-
-#~ msgid "E547: Illegal mouseshape"
-#~ msgstr "E547: ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ะฒะธะณะปัะด ะผะธัˆั–"
-
-#~ msgid "Enter encryption key: "
-#~ msgstr "ะ’ะบะฐะถั–ั‚ัŒ ะบะปัŽั‡ ัˆะธั„ั€ัƒ: "
-
-#~ msgid "Enter same key again: "
-#~ msgstr "ะŸะพะฒั‚ะพั€ั–ั‚ัŒ ะบะปัŽั‡: "
-
-#~ msgid "Keys don't match!"
-#~ msgstr "ะšะปัŽั‡ั– ะฝะต ะพะดะฝะฐะบะพะฒั–!"
-
-#~ msgid "Cannot connect to Netbeans #2"
-#~ msgstr "ะะต ะฒะดะฐะปะพัั ะท'ั”ะดะฝะฐั‚ะธัั ั–ะท Netbeans #2"
-
-#~ msgid "Cannot connect to Netbeans"
-#~ msgstr "ะะต ะฒะดะฐะปะพัั ะท'ั”ะดะฝะฐั‚ะธัั ั–ะท Netbeans"
-
-#~ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
-#~ msgstr ""
-#~ "E668: ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ั€ะตะถะธะผ ะดะพัั‚ัƒะฟัƒ ะดะพ ั„ะฐะนะปัƒ ั–ะฝั„ะพั€ะผะฐั†ั–ั— ะฟั€ะพ ะท'ั”ะดะฝะฐะฝะฝั ะท "
-#~ "NetBenans: ยซ%sยป"
-
-#~ msgid "read from Netbeans socket"
-#~ msgstr "ั‡ะธั‚ะฐั”ั‚ัŒัั ะท ัะพะบะตั‚ะฐ Netbeans"
-
-#~ msgid "E658: NetBeans connection lost for buffer %<PRId64>"
-#~ msgstr "E658: ะ’ั‚ั€ะฐั‡ะตะฝะพ ะทะฒ'ัะทะพะบ ั–ะท NetBeans ะดะปั ะฑัƒั„ะตั€ะฐ %<PRId64>"
-
-#~ msgid "E838: netbeans is not supported with this GUI"
-#~ msgstr "E838: netbeans ะฝะต ะฟั–ะดั‚ั€ะธะผัƒั”ั‚ัŒัั ะท ั†ะธะผ GUI"
-
-#~ msgid "E511: netbeans already connected"
-#~ msgstr "E511: netbeans ะฒะถะต ะฟั–ะด'ั”ะดะฝะฐะฝะพ"
-
-#~ msgid "E505: %s is read-only (add ! to override)"
-#~ msgstr "E505: %s ั‚ั–ะปัŒะบะธ ะดะปั ั‡ะธั‚ะฐะฝะฝั (! ั‰ะพะฑ ะฝะต ะทะฒะฐะถะฐั‚ะธ)"
-
-#~ msgid "E775: Eval feature not available"
-#~ msgstr "E775: ะœะพะถะปะธะฒั–ัั‚ัŒ eval ะฝะตะดะพัั‚ัƒะฟะฝะฐ"
-
-#~ msgid "freeing %<PRId64> lines"
-#~ msgstr "ะ—ะฒั–ะปัŒะฝะตะฝะพ ั€ัะดะบั–ะฒ: %<PRId64>"
-
-#~ msgid "E530: Cannot change term in GUI"
-#~ msgstr "E530: ะะต ะฒะดะฐะปะพัั ะทะผั–ะฝะธั‚ะธ term ะฒ GUI"
-
-#~ msgid "E531: Use \":gui\" to start the GUI"
-#~ msgstr "E531: ะ—ะฐัั‚ะพััƒะนั‚ะต ยซ:guiยป ะดะปั ะทะฐะฟัƒัะบัƒ GUI"
-
-#~ msgid "E617: Cannot be changed in the GTK+ 2 GUI"
-#~ msgstr "E617: ะะต ะผะพะถะฝะฐ ะทะผั–ะฝะธั‚ะธ ะฒ GUI GTK+ 2"
-
-#~ msgid "E596: Invalid font(s)"
-#~ msgstr "E596: ะะตะบะพั€ะตะบั‚ะฝะธะน(ั–) ัˆั€ะธั„ั‚(ะธ)"
-
-#~ msgid "E597: can't select fontset"
-#~ msgstr "E597: ะะต ะฒะดะฐะปะพัั ะฒะธะฑั€ะฐั‚ะธ ะฝะฐะฑั–ั€ ัˆั€ะธั„ั‚ั–ะฒ"
-
-#~ msgid "E598: Invalid fontset"
-#~ msgstr "E598: ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ะฝะฐะฑั–ั€ ัˆั€ะธั„ั‚ั–ะฒ"
-
-#~ msgid "E533: can't select wide font"
-#~ msgstr "E533: ะะต ะฒะดะฐะปะพัั ะฒะธะบะพั€ะธัั‚ะฐั‚ะธ ั€ะพะทัˆะธั€ะตะฝะธะน ัˆั€ะธั„ั‚"
-
-#~ msgid "E534: Invalid wide font"
-#~ msgstr "E534: ะะตะบะพั€ะตะบั‚ะฝะธะน ั€ะพะทัˆะธั€ะตะฝะธะน ัˆั€ะธั„ั‚"
-
-#~ msgid "E538: No mouse support"
-#~ msgstr "E538: ะœะธัˆะฐ ะฝะต ะฟั–ะดั‚ั€ะธะผัƒั”ั‚ัŒัั"
-
-# msgstr "E358: "
-#~ msgid "cannot open "
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ "
-
-#~ msgid "VIM: Can't open window!\n"
-#~ msgstr "VIM: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ะฒั–ะบะฝะพ!\n"
-
-#~ msgid "Need Amigados version 2.04 or later\n"
-#~ msgstr "ะŸะพั‚ั€ั–ะฑะฝะฐ Amigados 2.04 ะฐะฑะพ ะฟั–ะทะฝั–ัˆะฐ\n"
-
-#~ msgid "Need %s version %<PRId64>\n"
-#~ msgstr "ะŸะพั‚ั€ั–ะฑะฝะพ %s ะฒะตั€ัั–ั— %<PRId64>\n"
-
-#~ msgid "Cannot open NIL:\n"
-#~ msgstr "ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ NIL:\n"
-
-#~ msgid "Cannot create "
-#~ msgstr "ะะต ะฒะดะฐะปะพัั ัั‚ะฒะพั€ะธั‚ะธ "
-
-#~ msgid "Vim exiting with %d\n"
-#~ msgstr "Vim ะทะฐะฒะตั€ัˆัƒั” ั€ะพะฑะพั‚ัƒ ะท %d\n"
-
-#~ msgid "cannot change console mode ?!\n"
-#~ msgstr "ะฝะต ะผะพะถัƒ ะทะผั–ะฝะธั‚ะธ ั€ะตะถะธะผ ะบะพะฝัะพะปั– ?!\n"
-
-# msgstr "E359: "
-#~ msgid "mch_get_shellsize: not a console??\n"
-#~ msgstr "mch_get_shellsize: ะฝะต ะบะพะฝัะพะปัŒ??\n"
-
-#~ msgid "E360: Cannot execute shell with -f option"
-#~ msgstr "E360: ะะต ะฒะดะฐะปะพัั ะทะฐะฟัƒัั‚ะธั‚ะธ ะพะฑะพะปะพะฝะบัƒ ะท ะพะฟั†ั–ั”ัŽ -f"
-
-# msgstr "E360: "
-#~ msgid "Cannot execute "
-#~ msgstr "ะะต ะฒะดะฐะปะพัั ะฒะธะบะพะฝะฐั‚ะธ "
-
-#~ msgid "shell "
-#~ msgstr "ะพะฑะพะปะพะฝะบัƒ "
-
-#~ msgid " returned\n"
-#~ msgstr " ะฟะพะฒะตั€ะฝัƒั‚ะพ\n"
-
-#~ msgid "ANCHOR_BUF_SIZE too small."
-#~ msgstr "ANCHOR_BUF_SIZE ะทะฐะผะฐะปะธะน"
-
-#~ msgid "I/O ERROR"
-#~ msgstr "ะŸะพะผะธะปะบะฐ ะฒะฒะพะดัƒ/ะฒะธะฒะพะดัƒ"
-
-#~ msgid "Message"
-#~ msgstr "ะŸะพะฒั–ะดะพะผะปะตะฝะฝั"
-
-#~ msgid "'columns' is not 80, cannot execute external commands"
-#~ msgstr "'columns' ะฝะต 80, ะฝะต ะผะพะถะฝะฐ ะฒะธะบะพะฝัƒะฒะฐั‚ะธ ะทะพะฒะฝั–ัˆะฝั– ะบะพะผะฐะฝะดะธ"
-
-# msgstr "E364: "
-#~ msgid "E237: Printer selection failed"
-#~ msgstr "E237: ะะต ะฒะดะฐะปะพัั ะฒะธะฑั€ะฐั‚ะธ ะฟั€ะธะฝั‚ะตั€"
-
-#~ msgid "to %s on %s"
-#~ msgstr "ะฝะฐ %s ะท %s"
-
-#~ msgid "E613: Unknown printer font: %s"
-#~ msgstr "E613: ะะตะฒั–ะดะพะผะธะน ัˆั€ะธั„ั‚ ะฟั€ะธะฝั‚ะตั€ะฐ: %s"
-
-#~ msgid "E238: Print error: %s"
-#~ msgstr "E238: ะŸะพะผะธะปะบะฐ ะดั€ัƒะบัƒ: %s"
-
-#~ msgid "Printing '%s'"
-#~ msgstr "ะ”ั€ัƒะบัƒั”ั‚ัŒัั '%s'"
-
-#~ msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
-#~ msgstr "E244: ะะตะบะพั€ะตะบั‚ะฝะฐ ะฝะฐะทะฒะฐ ะฝะฐะฑะพั€ัƒ ัะธะผะฒะพะปั–ะฒ ยซ%sยป ัƒ ะฝะฐะทะฒั– ัˆั€ะธั„ั‚ัƒ ยซ%sยป"
-
-#~ msgid "E245: Illegal char '%c' in font name \"%s\""
-#~ msgstr "E245: ะŸะพะผะธะปะบะพะฒะธะน ัะธะผะฒะพะป %c ะฒ ะฝะฐะทะฒั– ัˆั€ะธั„ั‚ัƒ ยซ%sยป"
-
-#~ msgid "Opening the X display took %<PRId64> msec"
-#~ msgstr "ะะฐ ะฒั–ะดะบั€ะธั‚ั‚ั ะดะธัะฟะปะตัŽ X ะฟั–ัˆะปะพ %<PRId64> ะผั–ะปั–ัะตะบัƒะฝะด"
-
-#~ msgid ""
-#~ "\n"
-#~ "Vim: Got X error\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Vim: ะŸะพะผะธะปะบะฐ X\n"
-
-#~ msgid "Testing the X display failed"
-#~ msgstr "ะ”ะธัะฟะปะตะน ะฅ ะฝะต ะฟั€ะพะนัˆะพะฒ ะฟะตั€ะตะฒั–ั€ะบัƒ"
-
-#~ msgid "Opening the X display timed out"
-#~ msgstr "ะกะฟะปะธะฒ ั‡ะฐั ะพั‡ั–ะบัƒะฒะฐะฝะฝั ะฒั–ะดะบั€ะธั‚ั‚ั ะดะธัะฟะปะตัŽ ะฅ"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot execute shell sh\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ะะต ะฒะดะฐะปะพัั ะทะฐะฟัƒัั‚ะธั‚ะธ ะพะฑะพะปะพะฝะบัƒ `sh'\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot create pipes\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ะะต ะผะพะถะฝะฐ ัั‚ะฒะพั€ะธั‚ะธ ะบะฐะฝะฐะปะธ\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot fork\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ะะต ะฒะดะฐะปะพัั ั€ะพะทะดะฒะพั—ั‚ะธัั\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Command terminated\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ะšะพะผะฐะฝะดะฐ ะทะฐะบั–ะฝั‡ะธะปะฐ ะฒะธะบะพะฝะฐะฝะฝั\n"
-
-#~ msgid "XSMP lost ICE connection"
-#~ msgstr "XSMP ะฒั‚ั€ะฐั‚ะธะฒ ะท'ั”ะดะฝะฐะฝะฝั ICE"
-
-#~ msgid "Opening the X display failed"
-#~ msgstr "ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ะดะธัะฟะปะตะน X"
-
-#~ msgid "XSMP handling save-yourself request"
-#~ msgstr "XSMP ะพะฑั€ะพะฑะปัั”ั‚ัŒัั ะทะฐะฟะธั‚ 'ะทะฑะตั€ะตะถะธ ัะตะฑะต'"
-
-#~ msgid "XSMP opening connection"
-#~ msgstr "XSMP ะฒั–ะดะบั€ะธะฒะฐั”ั‚ัŒัั ะท'ั”ะดะฝะฐะฝะฝั"
-
-#~ msgid "XSMP ICE connection watch failed"
-#~ msgstr "XSMP ัะฟะพัั‚ะตั€ะตะถะตะฝะฝั ะทะฐ ะท'ั”ะดะฝะฐะฝะฝัะผ ะท ICE ะฝะต ะฒะดะฐะปะพัั"
-
-#~ msgid "XSMP SmcOpenConnection failed: %s"
-#~ msgstr "XSMP ะฝะต ะฒะดะฐะปะพัั SmcOpenConnection: %s"
-
-#~ msgid "At line"
-#~ msgstr "ะ ัะดะพะบ:"
-
-#~ msgid "Could not load vim32.dll!"
-#~ msgstr "ะะต ะฒะดะฐะปะพัั ะทะฐะฒะฐะฝั‚ะฐะถะธั‚ะธ vim32.dll"
-
-#~ msgid "VIM Error"
-#~ msgstr "ะŸะพะผะธะปะบะฐ VIM"
-
-#~ msgid "Could not fix up function pointers to the DLL!"
-#~ msgstr "ะะต ะฒะดะฐะปะพัั ะฒะธะฟั€ะฐะฒะธั‚ะธ ะฒะบะฐะทั–ะฒะฝะธะบะธ ะฝะฐ ั„ัƒะฝะบั†ั–ั— DLL!"
-
-#~ msgid "shell returned %d"
-#~ msgstr "ะพะฑะพะปะพะฝะบะฐ ะฟะพะฒะตั€ะฝัƒะปะฐ %d"
-
-#~ msgid "Vim: Caught %s event\n"
-#~ msgstr "Vim: ะ’ะธัะฒะปะตะฝะพ ะฟะพะดั–ัŽ %s\n"
-
-#~ msgid "close"
-#~ msgstr "close"
-
-#~ msgid "logoff"
-#~ msgstr "logoff"
-
-#~ msgid "shutdown"
-#~ msgstr "shutdown"
-
-#~ msgid "E371: Command not found"
-#~ msgstr "E371: ะšะพะผะฐะฝะดัƒ ะฝะต ะทะฝะฐะนะดะตะฝะพ"
-
-#~ msgid ""
-#~ "VIMRUN.EXE not found in your $PATH.\n"
-#~ "External commands will not pause after completion.\n"
-#~ "See :help win32-vimrun for more information."
-#~ msgstr ""
-#~ "ะคะฐะนะป VIMRUN.EXE ะฝะต ะทะฝะฐะนะดะตะฝะพ ัƒ ัˆะปัั…ัƒ ะฟะพัˆัƒะบัƒ.\n"
-#~ "ะ—ะพะฒะฝั–ัˆะฝั– ะบะพะผะฐะฝะดะธ ะฝะต ะฑัƒะดัƒั‚ัŒ ะฟั€ะธะทัƒะฟะธะฝะตะฝั– ะฟั–ัะปั ะฒะธะบะพะฝะฐะฝะฝั.\n"
-#~ "ะ“ะปัะฝัŒั‚ะต :help win32-vimrun ั‰ะพะฑ ะพั‚ั€ะธะผะฐั‚ะธ ะฟะพะดั€ะพะฑะธั†ั–."
-
-#~ msgid "Vim Warning"
-#~ msgstr "ะ—ะฐัั‚ะตั€ะตะถะตะฝะฝั Vim"
-
-# msgstr "E231: "
-#~ msgid "Error file"
-#~ msgstr "ะคะฐะนะป ะฟะพะผะธะปะพะบ"
-
-#~ msgid "E868: Error building NFA with equivalence class!"
-#~ msgstr "E868: ะะต ะฒะดะฐะปะพัั ะฟะพะฑัƒะดัƒะฒะฐั‚ะธ NFA ะท ะบะปะฐัะพะผ ะตะบะฒั–ะฒะฐะปะตะฝั‚ะฝะพัั‚ั–!"
-
-#~ msgid "E878: (NFA) Could not allocate memory for branch traversal!"
-#~ msgstr "E878: (NFA) ะะต ะฒะดะฐะปะพัั ะพั‚ั€ะธะผะฐั‚ะธ ะฟะฐะผโ€™ัั‚ัŒ ะดะปั ะพะฑั…ะพะดัƒ ะณั–ะปะพะบ!"
-
-#~ msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\""
-#~ msgstr ""
-#~ "ะ—ะฐัั‚ะตั€ะตะถะตะฝะฝั: ะะต ะฒะดะฐะปะพัั ะทะฝะฐะนั‚ะธ ัะฟะธัะพะบ ัะปั–ะฒ ยซ%s_%s.splยป ั‡ะธ ยซ%s_ascii.splยป"
-
-#~ msgid "Conversion in %s not supported"
-#~ msgstr "ะŸะตั€ะตั‚ะฒะพั€ะตะฝะฝั ัƒ %s ะฝะต ะฟั–ะดั‚ั€ะธะผัƒั”ั‚ัŒัั"
-
-#~ msgid "E845: Insufficient memory, word list will be incomplete"
-#~ msgstr "E845: ะะตะดะพัั‚ะฐั‚ะฝัŒะพ ะฟะฐะผโ€™ัั‚ั–, ัะฟะธัะพะบ ัะปั–ะฒ ะฑัƒะดะต ะฝะตะฟะพะฒะฝะธะผ"
-
-#~ msgid "E430: Tag file path truncated for %s\n"
-#~ msgstr "E430: ะจะปัั… ั„ะฐะนะปัƒ ั‚ะตา‘ั–ะฒ ัะบะพั€ะพั‡ะตะฝะพ ะดะพ %s\n"
-
-#~ msgid "new shell started\n"
-#~ msgstr "ะทะฐะฟัƒั‰ะตะฝะพ ะฝะพะฒัƒ ะพะฑะพะปะพะฝะบัƒ\n"
-
-# msgstr "E242: "
-#~ msgid "Used CUT_BUFFER0 instead of empty selection"
-#~ msgstr "ะ’ะธะบะพั€ะธัั‚ะฐะฝะพ CUT_BUFFER0 ะทะฐะผั–ัั‚ัŒ ะฟะพั€ะพะถะฝัŒะพะณะพ ะฒะธะดั–ะปะตะฝะฝั"
-
-#~ msgid "No undo possible; continue anyway"
-#~ msgstr "ะกะบะฐััƒะฒะฐะฝะฝั ะฑัƒะดะต ะฝะตะผะพะถะปะธะฒะต, ะฒัะต ะพะดะฝะพ ะฟั€ะพะดะพะฒะถะธั‚ะธ"
-
-#~ msgid "E832: Non-encrypted file has encrypted undo file: %s"
-#~ msgstr "E832: ะะตะทะฐัˆะธั„ั€ะพะฒะฐะฝะธะน ั„ะฐะนะป ะผะฐั” ะทะฐัˆะธั„ั€ะพะฒะฐะฝะธะน ั„ะฐะนะป ั–ัั‚ะพั€ั–ั—: %s"
-
-#~ msgid "E826: Undo file decryption failed: %s"
-#~ msgstr "E826: ะะต ะฒะดะฐะปะพัั ั€ะพะทัˆะธั„ั€ัƒะฒะฐั‚ะธ ั„ะฐะนะป ั–ัั‚ะพั€ั–ั—: %s"
-
-#~ msgid "E827: Undo file is encrypted: %s"
-#~ msgstr "E827: ะคะฐะนะป ั–ัั‚ะพั€ั–ั— ะทะฐัˆะธั„ั€ะพะฒะฐะฝะธะน: %s"
-
-# msgstr "E440: "
-# ---------------------------------------
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16/32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "ะ’ะตั€ัั–ั ะท GUI ะดะปั 16/32-ั€ะพะทั€ัะดะฝะพั— Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "ะ’ะตั€ัั–ั ะท GUI ะดะปั 64-ั€ะพะทั€ัะดะฝะพั— MS-Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "ะ’ะตั€ัั–ั ะท GUI ะดะปั 32-ั€ะพะทั€ัะดะฝะพั— Windows"
-
-#~ msgid " in Win32s mode"
-#~ msgstr " ะฒ ั€ะตะถะธะผั– Win32s"
-
-#~ msgid " with OLE support"
-#~ msgstr " ะท ะฟั–ะดั‚ั€ะธะผะบะพัŽ OLE"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 64-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "ะšะพะฝัะพะปัŒะฝะฐ ะฒะตั€ัั–ั ะดะปั 64-ั€ะพะทั€ัะดะฝะพั— Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "ะšะพะฝัะพะปัŒะฝะฐ ะฒะตั€ัั–ั ะดะปั 32-ั€ะพะทั€ัะดะฝะพั— Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16-bit version"
-#~ msgstr ""
-#~ "\n"
-#~ "ะ’ะตั€ัั–ั ะดะปั 16-ั€ะพะทั€ัะดะฝะพั— Windows"
-
-#~ msgid ""
-#~ "\n"
-#~ "32-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "ะ’ะตั€ัั–ั ะดะปั 32-ั€ะพะทั€ัะดะฝะพั— MS-DOS"
-
-#~ msgid ""
-#~ "\n"
-#~ "16-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "ะ’ะตั€ัั–ั ะดะปั 16-ั€ะพะทั€ัะดะฝะพั— MS-DOS"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X (unix) version"
-#~ msgstr ""
-#~ "\n"
-#~ "ะ’ะตั€ัั–ั ะดะปั MacOS X (unix)"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X version"
-#~ msgstr ""
-#~ "\n"
-#~ "ะ’ะตั€ัั–ั ะดะปั MacOS X"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "ะ’ะตั€ัั–ั ะดะปั MacOS"
-
-#~ msgid ""
-#~ "\n"
-#~ "OpenVMS version"
-#~ msgstr ""
-#~ "\n"
-#~ "ะ’ะตั€ัั–ั ะดะปั OpenVMS"
-
-#~ msgid ""
-#~ "\n"
-#~ "Big version "
-#~ msgstr ""
-#~ "\n"
-#~ "ะ’ะตะปะธะบะฐ ะฒะตั€ัั–ั "
-
-#~ msgid ""
-#~ "\n"
-#~ "Normal version "
-#~ msgstr ""
-#~ "\n"
-#~ "ะะพั€ะผะฐะปัŒะฝะฐ ะฒะตั€ัั–ั "
-
-#~ msgid ""
-#~ "\n"
-#~ "Small version "
-#~ msgstr ""
-#~ "\n"
-#~ "ะœะฐะปะฐ ะฒะตั€ัั–ั "
-
-#~ msgid ""
-#~ "\n"
-#~ "Tiny version "
-#~ msgstr ""
-#~ "\n"
-#~ "ะšั€ะธั…ั–ั‚ะฝะฐ ะฒะตั€ัั–ั "
-
-#~ msgid "with GTK2-GNOME GUI."
-#~ msgstr "ะท GUI GTK2-GNOME."
-
-#~ msgid "with GTK2 GUI."
-#~ msgstr "ะท GUI GTK2."
-
-#~ msgid "with X11-Motif GUI."
-#~ msgstr "ะท GUI X11-Motif."
-
-#~ msgid "with X11-neXtaw GUI."
-#~ msgstr "ะท GUI X11-neXtaw."
-
-#~ msgid "with X11-Athena GUI."
-#~ msgstr "ะท GUI X11-Athena."
-
-#~ msgid "with Photon GUI."
-#~ msgstr "ะท GUI Photon."
-
-#~ msgid "with GUI."
-#~ msgstr "ะท GUI."
-
-#~ msgid "with Carbon GUI."
-#~ msgstr "ะท GUI Carbon."
-
-#~ msgid "with Cocoa GUI."
-#~ msgstr "ะท GUI Cocoa."
-
-#~ msgid "with (classic) GUI."
-#~ msgstr "ะท (ะบะปะฐัะธั‡ะฝะธะผ) GUI."
-
-#~ msgid " system gvimrc file: \""
-#~ msgstr " ัะธัั‚ะตะผะฝะธะน gvimrc: \""
-
-#~ msgid " user gvimrc file: \""
-#~ msgstr " gvimrc ะบะพั€ะธัั‚ัƒะฒะฐั‡ะฐ: \""
-
-#~ msgid "2nd user gvimrc file: \""
-#~ msgstr "ะดั€ัƒะณะธะน gvimrc ะบะพั€ะธัั‚ัƒะฒะฐั‡ะฐ: \""
-
-#~ msgid "3rd user gvimrc file: \""
-#~ msgstr "ั‚ั€ะตั‚ั–ะน gvimrc ะบะพั€ะธัั‚ัƒะฒะฐั‡ะฐ: \""
-
-#~ msgid " system menu file: \""
-#~ msgstr " ัะธัั‚ะตะผะฝะต ะผะตะฝัŽ: \""
-
-#~ msgid "Compiler: "
-#~ msgstr "ะšะพะผะฟั–ะปัั‚ะพั€: "
-
-#~ msgid "menu Help->Orphans for information "
-#~ msgstr "ะผะตะฝัŽ Help->Orphans ะฟะพะดะฐะปัŒัˆะฐ ั–ะฝั„ะพั€ะผะฐั†ั–ั "
-
-#~ msgid "Running modeless, typed text is inserted"
-#~ msgstr "ะ‘ะตะท ั€ะตะถะธะผั–ะฒ, ั‚ะตะบัั‚ ั‰ะพ ะฝะฐะฑั€ะฐะฝะพ ะฒัั‚ะฐะฒะปัั”ั‚ัŒัั"
-
-#~ msgid "menu Edit->Global Settings->Toggle Insert Mode "
-#~ msgstr "ะผะตะฝัŽ Edit->Global Settings->Toggle Insert Mode "
-
-#~ msgid " for two modes "
-#~ msgstr " ะดะปั ะดะฒะพั… ั€ะตะถะธะผั–ะฒ "
-
-#~ msgid "menu Edit->Global Settings->Toggle Vi Compatible"
-#~ msgstr "ะผะตะฝัŽ Edit->Global Settings->Toggle Vi Compatible "
-
-#~ msgid " for Vim defaults "
-#~ msgstr " ั‰ะพะฑ ะฟะพั‡ะธะฝะฐั‚ะธ ะฒ ั€ะตะถะธะผั– ััƒะผั–ัะฝะพัั‚ั– ะท Vi"
-
-#~ msgid "WARNING: Windows 95/98/ME detected"
-#~ msgstr "ะ—ะะกะขะ•ะ ะ•ะ–ะ•ะะะฏ: ะ’ะธ ะบะพั€ะธัั‚ัƒั”ั‚ะตัั Windows 95/98/ME"
-
-#~ msgid "type :help windows95<Enter> for info on this"
-#~ msgstr ":help windows95<Enter> ั–ะฝั„ะพั€ะผะฐั†ั–ั ะฟั€ะพ ั†ะต "
-
-#~ msgid "E370: Could not load library %s"
-#~ msgstr "E370: ะะต ะฒะดะฐะปะพัั ะทะฐะฒะฐะฝั‚ะฐะถะธั‚ะธ ะฑั–ะฑะปั–ะพั‚ะตะบัƒ %s"
-
-#~ msgid ""
-#~ "Sorry, this command is disabled: the Perl library could not be loaded."
-#~ msgstr ""
-#~ "ะ’ะธะฑะฐั‡ั‚ะต, ั†ั ะบะพะผะฐะฝะดะฐ ะฒะธะผะบะฝะตะฝะฐ, ะฑั–ะฑะปั–ะพั‚ะตะบะฐ Perl ะฝะต ะผะพะถะต ะฑัƒั‚ะธ ะทะฐะฒะฐะฝั‚ะฐะถะตะฝะฐ."
-
-#~ msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
-#~ msgstr ""
-#~ "E299: ะžะฑั‡ะธัะปะตะฝะฝั ะฒะธั€ะฐะทั–ะฒ Perl ะทะฐะฑะพั€ะพะฝะตะฝะต ัƒ ะฟั–ัะพั‡ะฝะธั†ั– ะฑะตะท ะผะพะดัƒะปั Safe"
-
-#~ msgid "Edit with &multiple Vims"
-#~ msgstr "ะ ะตะดะฐะณัƒะฒะฐั‚ะธ ัƒ (&m)ั€ั–ะทะฝะธั… Vim"
-
-#~ msgid "Edit with single &Vim"
-#~ msgstr "ะ ะตะดะฐะณัƒะฒะฐั‚ะธ ัƒ ะพะดะฝะพะผัƒ &Vim"
-
-#~ msgid "Diff with Vim"
-#~ msgstr "ะŸะพั€ั–ะฒะฝัั‚ะธ ะท ะดะพะฟะพะผะพะณะพัŽ Vim"
-
-#~ msgid "Edit with &Vim"
-#~ msgstr "ะ ะตะดะฐะณัƒะฒะฐั‚ะธ ะทะฐ ะดะพะฟะพะผะพะณะพัŽ &Vim"
-
-#~ msgid "Edit with existing Vim - "
-#~ msgstr "ะ ะตะดะฐะณัƒะฒะฐั‚ะธ ัƒ ะฒะถะต ะทะฐะฟัƒั‰ะตะฝะพะผัƒ Vim - "
-
-#~ msgid "Edits the selected file(s) with Vim"
-#~ msgstr "ะ ะตะดะฐะณัƒั” ะฒะธะฑั€ะฐะฝั– ั„ะฐะนะปะธ ะท ะดะพะฟะพะผะพะณะพัŽ Vim"
-
-#~ msgid "Error creating process: Check if gvim is in your path!"
-#~ msgstr "ะŸะพะผะธะปะบะฐ ัั‚ะฒะพั€ะตะฝะฝั ะฟั€ะพั†ะตััƒ, ะฟะตั€ะตะฒั–ั€ั‚ะต ั‡ะธ ั” gvim ัƒ ัˆะปัั…ัƒ ะฟะพัˆัƒะบัƒ!"
-
-#~ msgid "gvimext.dll error"
-#~ msgstr "ะฟะพะผะธะปะบะฐ gvimext.dll"
-
-#~ msgid "Path length too long!"
-#~ msgstr "ะจะปัั… ะทะฐะฝะฐะดั‚ะพ ะดะพะฒะณะธะน!"
-
-# msgstr "E233: "
-#~ msgid "E234: Unknown fontset: %s"
-#~ msgstr "E234: ะะตะฒั–ะดะพะผะธะน ะฝะฐะฑั–ั€ ัˆั€ะธั„ั‚ั–ะฒ: %s"
-
-#~ msgid "E235: Unknown font: %s"
-#~ msgstr "E235: ะะตะฒั–ะดะพะผะธะน ัˆั€ะธั„ั‚: %s"
-
-# msgstr "E235: "
-#~ msgid "E236: Font \"%s\" is not fixed-width"
-#~ msgstr "E236: ะจั€ะธั„ั‚ ยซ%sยป ะฝะต ะผะพะฝะพัˆะธั€ะธะฝะฝะธะน"
-
-#~ msgid "E448: Could not load library function %s"
-#~ msgstr "E448: ะะต ะฒะดะฐะปะพัั ะทะฐะฒะฐะฝั‚ะฐะถะธั‚ะธ ะฑั–ะฑะปั–ะพั‚ะตั‡ะฝัƒ ั„ัƒะฝะบั†ั–ัŽ %s"
-
-#~ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
-#~ msgstr "E26: ะะต ะผะพะถะฝะฐ ะฒะธะบะพั€ะธัั‚ะฐั‚ะธ ั–ะฒั€ะธั‚: ะะต ะฒะฒั–ะผะบะฝะตะฝะพ ะฟั–ะด ั‡ะฐั ะบะพะผะฟั–ะปัั†ั–ั—\n"
-
-#~ msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
-#~ msgstr "E27: ะะต ะผะพะถะฝะฐ ะฒะธะบะพั€ะธัั‚ะฐั‚ะธ ั„ะฐั€ัั–: ะะต ะฒะฒั–ะผะบะฝะตะฝะพ ะฟั–ะด ั‡ะฐั ะบะพะผะฟั–ะปัั†ั–ั—\n"
-
-#~ msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
-#~ msgstr ""
-#~ "E800: ะะต ะผะพะถะฝะฐ ะฒะธะบะพั€ะธัั‚ะฐั‚ะธ ะฐั€ะฐะฑััŒะบัƒ ะผะพะฒัƒ: ะะต ะฒะฒั–ะผะบะฝะตะฝะพ ะฟั–ะด ั‡ะฐั "
-#~ "ะบะพะผะฟั–ะปัั†ั–ั—\n"
-
-#~ msgid "E247: no registered server named \"%s\""
-#~ msgstr "E247: ะะตะผะฐั” ะทะฐั€ะตั”ัั‚ั€ะพะฒะฐะฝะธั… ัะตั€ะฒะตั€ั–ะฒ ะท ะฝะฐะทะฒะพัŽ ยซ%sยป"
-
-#~ msgid "E233: cannot open display"
-#~ msgstr "E233: ะะต ะฒะดะฐะปะพัั ะฒั–ะดะบั€ะธั‚ะธ ะดะธัะฟะปะตะน"
-
-#~ msgid "E449: Invalid expression received"
-#~ msgstr "E449: ะžั‚ั€ะธะผะฐะฝะพ ะฝะตะบะพั€ะตะบั‚ะฝะธะน ะฒะธั€ะฐะท"
-
-#~ msgid "E463: Region is guarded, cannot modify"
-#~ msgstr "E463: ะะต ะผะพะถะฝะฐ ะทะผั–ะฝะธั‚ะธ ะทะฐั…ะธั‰ะตะฝะธะน ั€ะตะณั–ะพะฝ"
-
-#~ msgid "E744: NetBeans does not allow changes in read-only files"
-#~ msgstr "E744: NetBeans ะฝะต ะดะพะทะฒะพะปัั” ะทะผั–ะฝัŽะฒะฐั‚ะธ ะทะฐั…ะธั‰ะตะฝั– ะฒั–ะด ะทะฐะฟะธััƒ ั„ะฐะนะปะธ"
-
-#~ msgid "Need encryption key for \"%s\""
-#~ msgstr "ะ”ะปั ยซ%sยป ะฟะพั‚ั€ั–ะฑะตะฝ ะบะปัŽั‡: "
-
-# msgstr "E406: "
-#~ msgid "empty keys are not allowed"
-#~ msgstr "ะฟะพั€ะพะถะฝั– ะบะปัŽั‡ั– ะฝะต ะดะพะทะฒะพะปะตะฝั–"
-
-#~ msgid "dictionary is locked"
-#~ msgstr "ัะปะพะฒะฝะธะบ ะทะฐะฑะปะพะบะพะฒะฐะฝะพ"
-
-#~ msgid "list is locked"
-#~ msgstr "ัะฟะธัะพะบ ะทะฐะฑะปะพะบะพะฒะฐะฝะพ"
-
-#~ msgid "failed to add key '%s' to dictionary"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ะดะพะดะฐั‚ะธ ะบะปัŽั‡ '%s' ะดะพ ัะปะพะฒะฝะธะบะฐ"
-
-#~ msgid "index must be int or slice, not %s"
-#~ msgstr "ั–ะฝะดะตะบั ะผะฐั” ะฑัƒั‚ะธ ั†ั–ะปะธะน ั‡ะธ ะทั€ั–ะท, ะฝะต %s"
-
-#~ msgid "expected str() or unicode() instance, but got %s"
-#~ msgstr "ะพั‡ั–ะบัƒะฒะฐะฒัั ะตะบะทะตะผะฟะปัั€ str() ั‡ะธ unicode(), ะฐะปะต ะพั‚ั€ะธะผะฐะฝะพ %s"
-
-#~ msgid "expected bytes() or str() instance, but got %s"
-#~ msgstr "ะพั‡ั–ะบัƒะฒะฐะฒัั ะตะบะทะตะผะฟะปัั€ bytes() ั‡ะธ str(), ะฐะปะต ะพั‚ั€ะธะผะฐะฝะพ %s"
-
-#~ msgid ""
-#~ "expected int(), long() or something supporting coercing to long(), but "
-#~ "got %s"
-#~ msgstr ""
-#~ "ะพั‡ั–ะบัƒะฒะฐะฒัั int(), long() ั‡ะธ ั‰ะพััŒ, ั‰ะพ ะผะพะถะต ะฑัƒั‚ะธ ะฒะผั–ั‰ะตะฝะต long(), ะฐะปะต "
-#~ "ะพั‚ั€ะธะผะฐะฝะพ %s"
-
-#~ msgid "expected int() or something supporting coercing to int(), but got %s"
-#~ msgstr ""
-#~ "ะพั‡ั–ะบัƒะฒะฐะฒัั int() ั‡ะธ ั‰ะพััŒ, ั‰ะพ ะผะพะถะต ะฑัƒั‚ะธ ะฒะผั–ั‰ะตะฝะต int(), ะฐะปะต ะพั‚ั€ะธะผะฐะฝะพ %s"
+#, c-format
+msgid "E15: Invalid control character present in input: %.*s"
+msgstr "E15: ะะตะบะพั€ะตะบั‚ะฝั– ะบะตั€ั–ะฒะฝั– ัะธะผะฒะพะปะธ ะฝะฐ ะฒั…ะพะดั–: %.*s"
-#~ msgid "value is too large to fit into C int type"
-#~ msgstr "ะทะฝะฐั‡ะตะฝะฝั ะทะฐะฒะตะปะธะบะต, ั‰ะพะฑ ะฒะผั–ัั‚ะธั‚ะธัั ัƒ ั‚ะธะฟ C int"
+#, c-format
+msgid "E112: Option name missing: %.*s"
+msgstr "E112: ะ‘ั€ะฐะบัƒั” ะฝะฐะทะฒะธ ะพะฟั†ั–ั—: %.*s"
-#~ msgid "value is too small to fit into C int type"
-#~ msgstr "ะทะฝะฐั‡ะตะฝะฝั ะทะฐะผะฐะปะต, ั‰ะพะฑ ะฒะผั–ัั‚ะธั‚ะธัั ัƒ ั‚ะธะฟ C int"
+#, c-format
+msgid "E15: Unexpected EOC character: %.*s"
+msgstr "E15: ะะตัะฟะพะดั–ะฒะฐะฝะธะน ัะธะผะฒะพะป EOC: %.*s"
-#~ msgid "number must be greater then zero"
-#~ msgstr "ั‡ะธัะปะพ ะผะฐั” ะฑัƒั‚ะธ ะฑั–ะปัŒัˆะต, ะฝั–ะถ ะฝัƒะปัŒ"
+#, c-format
+msgid "E15: Unidentified character: %.*s"
+msgstr "E15: ะะตั€ะพะทะฟั–ะทะฝะฐะฝะธะน ัะธะผะฒะพะป: %.*s"
-#~ msgid "number must be greater or equal to zero"
-#~ msgstr "ั‡ะธัะปะพ ะผะฐั” ะฑัƒั‚ะธ ะฝะต ะผะตะฝัˆะต, ะฝั–ะถ ะฝัƒะปัŒ"
+#, c-format
+msgid "E15: Operator is not associative: %.*s"
+msgstr "E15: ะžะฟะตั€ะฐั‚ะพั€ ะฝะต ะฐัะพั†ั–ะฐั‚ะธะฒะฝะธะน: %.*s"
-#~ msgid "can't delete OutputObject attributes"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ะทะฝะธั‰ะธั‚ะธ ะฐั‚ั€ะธะฑัƒั‚ะธ OutputObject"
+#, c-format
+msgid "E15: Missing operator: %.*s"
+msgstr "E15: ะ‘ั€ะฐะบัƒั” ะพะฟะตั€ะฐั‚ะพั€ะฐ: %.*s"
-# msgstr "E180: "
-#~ msgid "invalid attribute: %s"
-#~ msgstr "ะฝะตะฟั€ะฐะฒะธะปัŒะฝะธะน ะฐั‚ั€ะธะฑัƒั‚: %s"
+#, c-format
+msgid "E15: Expected lambda arguments list or arrow: %.*s"
+msgstr "E15: ะžั‡ั–ะบัƒั”ั‚ัŒัั ัะฟะธัะพะบ ะฐั€ะณัƒะผะตะฝั‚ั–ะฒ ะปัะผะฑะดะฐ ั‡ะธ ัั‚ั€ั–ะปะบะฐ: %.*s"
-#~ msgid "E264: Python: Error initialising I/O objects"
-#~ msgstr "E264: Python: ะŸะพะผะธะปะบะฐ ั–ะฝั–ั†ั–ะฐะปั–ะทะฐั†ั–ั— ะพะฑ'ั”ะบั‚ั–ะฒ ะฒะฒะพะดัƒ/ะฒะธะฒะพะดัƒ"
+#, c-format
+msgid "E15: Expected value part of assignment lvalue: %.*s"
+msgstr "E15: ะžั‡ั–ะบัƒั”ั‚ัŒัั ะทะฝะฐั‡ะตะฝะฝั ะฟั€ะธัะฒะพั”ะฝะฝั lvalue: %.*s"
-#~ msgid "failed to change directory"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ะทะผั–ะฝะธั‚ะธ ะดะธั€ะตะบั‚ะพั€ั–ัŽ"
+#, c-format
+msgid "E15: Expected assignment operator or subscript: %.*s"
+msgstr "E15: ะžั‡ั–ะบัƒั”ั‚ัŒัั ะพะฟะตั€ะฐั‚ะพั€ ะฟั€ะธัะฒะพัŽะฒะฐะฝะฝั ั‡ะธ ั–ะฝะดะตะบั: %.*s"
-#~ msgid "expected 3-tuple as imp.find_module() result, but got %s"
-#~ msgstr "ะพั‡ั–ะบัƒะฒะฐะฒัั 3-ะบะพั€ั‚ะตะถ ัะบ ั€ะตะทัƒะปัŒั‚ะฐั‚ imp.find_module(), ะฐะปะต ะพั‚ั€ะธะผะฐะฝะพ %s"
+msgid "E15: Unexpected "
+msgstr "E15: ะะตัะฟะพะดั–ะฒะฐะฝะพ "
-#~ msgid ""
-#~ "expected 3-tuple as imp.find_module() result, but got tuple of size %d"
-#~ msgstr "ะพั‡ั–ะบัƒะฒะฐะฒัั 3-ะบะพั€ั‚ะตะถ ัะบ ั€ะตะทัƒะปัŒั‚ะฐั‚ imp.find_module(), ะฐะปะต ะพั‚ั€ะธะผะฐะฝะพ %d"
+#, c-format
+msgid "E15: Unexpected multiplication-like operator: %.*s"
+msgstr "E15: ะะตัะฟะพะดั–ะฒะฐะฝะพ ะพะฟะตั€ะฐั‚ะพั€ ะฝะฐ ะทั€ะฐะทะพะบ ะผะฝะพะถะตะฝะฝั: %.*s"
-#~ msgid "internal error: imp.find_module returned tuple with NULL"
-#~ msgstr "ะฒะฝัƒั‚ั€ั–ัˆะฝั ะฟะพะผะธะปะบะฐ: imp.find_module ะฟะพะฒะตั€ะฝัƒะปะฐ ะบะพั€ั‚ะตะถ ะท NULL"
+msgid "E15: Environment variable name missing"
+msgstr "E15: ะ‘ั€ะฐะบัƒั” ะทะผั–ะฝะฝะพั— ะพั‚ะพั‡ะตะฝะฝั"
-#~ msgid "cannot delete vim.Dictionary attributes"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ะทะฝะธั‰ะธั‚ะธ ะฐั‚ั€ะธะฑัƒั‚ะธ vim.Dictionary"
+#, c-format
+msgid "E15: Expected value, got comparison operator: %.*s"
+msgstr "E15: ะžั‡ั–ะบัƒั”ั‚ัŒัั ะทะฝะฐั‡ะตะฝะฝั, ะพั‚ั€ะธะผะฐะฝะพ ะพะฟะตั€ะฐั‚ะพั€ ะฟะพั€ั–ะฒะฝัะฝะฝั: %.*s"
-#~ msgid "cannot modify fixed dictionary"
-#~ msgstr "ะฝะต ะผะพะถะฝะฐ ะทะผั–ะฝะธั‚ะธ ั„ั–ะบัะพะฒะฐะฝะธะน ัะปะพะฒะฝะธะบ"
+#, c-format
+msgid "E15: Expected value, got comma: %.*s"
+msgstr "E15: ะžั‡ั–ะบัƒั”ั‚ัŒัั ะทะฝะฐั‡ะตะฝะฝั, ะพั‚ั€ะธะผะฐะฝะพ ะบะพะผัƒ: %.*s"
-#~ msgid "cannot set attribute %s"
-#~ msgstr "ะฝะต ะผะพะถะฝะฐ ะฒัั‚ะฐะฝะพะฒะธั‚ะธ ะฐั‚ั€ะธะฑัƒั‚ %s"
+#, c-format
+msgid "E15: Comma outside of call, lambda or literal: %.*s"
+msgstr "E15: ะšะพะผะฐ ะฟะพะทะฐ ะฒะธะบะปะธะบะพะผ, ะปัะผะฑะดะพัŽ ั‡ะธ ะปั–ั‚ะตั€ะฐะปะพะผ: %.*s"
-#~ msgid "hashtab changed during iteration"
-#~ msgstr "ั…ะตัˆ-ั‚ะฐะฑะปะธั†ั ะทะผั–ะฝะธะปะฐัั ะฟั–ะด ั‡ะฐั ะฟะตั€ะตะฑะธั€ะฐะฝะฝั"
+#, c-format
+msgid "E15: Colon outside of dictionary or ternary operator: %.*s"
+msgstr "E15: ะ”ะฒะพะบั€ะฐะฟะบะฐ ะฟะพะทะฐ ัะปะพะฒะฝะธะบะพะผ ั‡ะธ ั‚ะตั€ะฝะฐั€ะฝะธะผ ะพะฟะตั€ะฐั‚ะพั€ะพะผ: %.*s"
-#~ msgid "expected sequence element of size 2, but got sequence of size %d"
-#~ msgstr ""
-#~ "ะพั‡ั–ะบัƒะฒะฐะปะฐััŒ ะฟะพัะปั–ะดะพะฒะฝั–ัั‚ัŒ ั€ะพะทะผั–ั€ะพะผ 2, ะฐะปะต ะพั‚ั€ะธะผะฐะฝะพ ะฟะพัะปั–ะดะพะฒะฝั–ัั‚ัŒ ั€ะพะทะผั–ั€ัƒ "
-#~ "%d"
+#, c-format
+msgid "E15: Expected value, got closing bracket: %.*s"
+msgstr "E15: ะžั‡ั–ะบัƒั”ั‚ัŒัั ะทะฝะฐั‡ะตะฝะฝั, ะพั‚ั€ะธะผะฐะฝะพ ะฟั€ะฐะฒัƒ ะดัƒะถะบัƒ: %.*s"
-#~ msgid "list constructor does not accept keyword arguments"
-#~ msgstr "ัะฟะธัะบะพะฒะธะน ะบะพะฝัั‚ั€ัƒะบั‚ะพั€ ะฝะต ะฟั€ะธะนะผะฐั” ั–ะผะตะฝะพะฒะฐะฝั– ะฐั€ะณัƒะผะตะฝั‚ะธ"
+#, c-format
+msgid "E475: Unable to assign to empty list: %.*s"
+msgstr "E475: ะะต ะผะพะถะฝะฐ ะฟั€ะธัะฒะพั—ั‚ะธ ะฟะพั€ะพะถะฝั–ะน ัะฟะธัะพะบ: %.*s"
-#~ msgid "list index out of range"
-#~ msgstr "ั–ะฝะดะตะบั ัะฟะธัะบัƒ ะทะฐ ะผะตะถะฐะผะธ"
+#, c-format
+msgid "E15: Unexpected closing figure brace: %.*s"
+msgstr "E15: ะะตัะฟะพะดั–ะฒะฐะฝะพ ะฟั€ะฐะฒะฐ ั„ั–ะณัƒั€ะฝะฐ ะดัƒะถะบะฐ: %.*s"
-#~ msgid "internal error: failed to get vim list item %d"
-#~ msgstr "ะฒะฝัƒั‚ั€ั–ัˆะฝั ะฟะพะผะธะปะบะฐ: ะฝะต ะฒะดะฐะปะพัั ะพั‚ั€ะธะผะฐั‚ะธ ะตะปะตะผะตะฝั‚ ัะฟะธัะบัƒ vim %d"
+#, c-format
+msgid "E475: Nested lists not allowed when assigning: %.*s"
+msgstr "E475: ะ’ะบะปะฐะดะตะฝั– ัะฟะธัะบะธ ะฝะต ะผะพะถะฝะฐ ะฟั€ะธัะฒะพัŽะฒะฐั‚ะธ: %.*s"
-#~ msgid "failed to add item to list"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ะดะพะดะฐั‚ะธ ะตะปะตะผะตะฝั‚ ะดะพ ัะฟะธัะบัƒ"
+#, c-format
+msgid "E15: Expected value, got closing figure brace: %.*s"
+msgstr "E15: ะžั‡ั–ะบัƒั”ั‚ัŒัั ะทะฝะฐั‡ะตะฝะฝั, ะพั‚ั€ะธะผะฐะฝะพ ะฟั€ะฐะฒัƒ ั„ั–ะณัƒั€ะฝัƒ ะดัƒะถะบัƒ: %.*s"
-#~ msgid "internal error: no vim list item %d"
-#~ msgstr "ะฒะฝัƒั‚ั€ั–ัˆะฝั ะฟะพะผะธะปะบะฐ: ะฝะตะผะฐั” ะตะปะตะผะตะฝั‚ะฐ ัะฟะธัะบัƒ vim %d"
+#, c-format
+msgid "E15: Don't know what figure brace means: %.*s"
+msgstr "E15: ะะต ะทะฝะฐัŽ, ั‰ะพ ะพะทะฝะฐั‡ะฐั” ั„ั–ะณัƒั€ะฝะฐ ะดัƒะถะบะฐ: %.*s"
-#~ msgid "internal error: failed to add item to list"
-#~ msgstr "ะฒะฝัƒั‚ั€ั–ัˆะฝั ะฟะพะผะธะปะบะฐ: ะฝะต ะฒะดะฐะปะพัั ะดะพะดะฐั‚ะธ ะตะปะตะผะตะฝั‚ ะดะพ ัะฟะธัะบัƒ"
+#, c-format
+msgid "E15: Unexpected arrow: %.*s"
+msgstr "E15: ะะตะพั‡ั–ะบัƒะฒะฐะฝะพ ัั‚ั€ั–ะปะบะฐ: %.*s"
-#~ msgid "cannot delete vim.List attributes"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ะทะฝะธั‰ะธั‚ะธ ะฐั‚ั€ะธะฑัƒั‚ะธ vim.List"
+#, c-format
+msgid "E15: Arrow outside of lambda: %.*s"
+msgstr "E15: ะกั‚ั€ั–ะปะบะฐ ะฟะพะทะฐ ะปัะผะฑะดะพัŽ: %.*s"
-#~ msgid "cannot modify fixed list"
-#~ msgstr "ะฝะต ะผะพะถะฝะฐ ะทะผั–ะฝะธั‚ะธ ั„ั–ะบัะพะฒะฐะฝะธะน ัะฟะธัะพะบ"
+#, c-format
+msgid "E15: Unexpected dot: %.*s"
+msgstr "E15: ะะตัะฟะพะดั–ะฒะฐะฝะพ ะบั€ะฐะฟะบะฐ: %.*s"
-# msgstr "E428: "
-#~ msgid "unnamed function %s does not exist"
-#~ msgstr "ะฑะตะทั–ะผะตะฝะฝะพั— ั„ัƒะฝะบั†ั–ั— %s ะฝะต ั–ัะฝัƒั”"
+#, c-format
+msgid "E15: Cannot concatenate in assignments: %.*s"
+msgstr "E15: ะะต ะผะพะถะฝะฐ ัะบะปะตัŽะฒะฐั‚ะธ ัƒ ะฟั€ะธัะฒะพั”ะฝะฝัั…: %.*s"
-# msgstr "E428: "
-#~ msgid "function %s does not exist"
-#~ msgstr "ั„ัƒะฝะบั†ั–ั— %s ะฝะต ั–ัะฝัƒั”"
+#, c-format
+msgid "E15: Expected value, got parenthesis: %.*s"
+msgstr "E15: ะžั‡ั–ะบัƒั”ั‚ัŒัั ะทะฝะฐั‡ะตะฝะฝั, ะพั‚ั€ะธะผะฐะฝะพ ะดัƒะถะบะธ: %.*s"
-#~ msgid "function constructor does not accept keyword arguments"
-#~ msgstr "ะบะพะฝัั‚ั€ัƒะบั‚ะพั€ ั„ัƒะฝะบั†ั–ั— ะฝะต ะฟั€ะธะนะผะฐั” ั–ะผะตะฝะพะฒะฐะฝั– ะฐั€ะณัƒะผะตะฝั‚ะธ"
+#, c-format
+msgid "E15: Unexpected closing parenthesis: %.*s"
+msgstr "E15: ะะตัะฟะพะดั–ะฒะฐะฝะพ ะฟั€ะฐะฒะฐ ะดัƒะถะบะฐ: %.*s"
-#~ msgid "failed to run function %s"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ะฒะธะบะพะฝะฐั‚ะธ ั„ัƒะฝะบั†ั–ัŽ %s"
+#, c-format
+msgid "E15: Expected value, got question mark: %.*s"
+msgstr "E15: ะžั‡ั–ะบัƒั”ั‚ัŒัั ะทะฝะฐั‡ะตะฝะฝั, ะพั‚ั€ะธะผะฐะฝะพ ะทะฝะฐะบ ะฟะธั‚ะฐะฝะฝั: %.*s"
-#~ msgid "problem while switching windows"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ะฟะตั€ะตะผะบะฝัƒั‚ะธ ะฒั–ะบะฝะฐ"
+#, c-format
+msgid "E114: Missing double quote: %.*s"
+msgstr "E114: ะ‘ั€ะฐะบัƒั” ะฟะพะดะฒั–ะนะฝะธั… ะปะฐะฟะพะบ: %.*s"
-#~ msgid "unable to unset global option %s"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ัะบะธะฝัƒั‚ะธ ะณะปะพะฑะฐะปัŒะฝัƒ ะพะฟั†ั–ัŽ %s"
+#, c-format
+msgid "E115: Missing single quote: %.*s"
+msgstr "E115: ะ‘ั€ะฐะบัƒั” ะพะดะธะฝะฐั€ะฝะธั… ะปะฐะฟะพะบ: %.*s"
-#~ msgid "unable to unset option %s which does not have global value"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ัะบะธะฝัƒั‚ะธ ะพะฟั†ั–ัŽ %s, ัะบะฐ ะฝะต ะผะฐั” ะณะปะพะฑะฐะปัŒะฝะพะณะพ ะทะฝะฐั‡ะตะฝะฝั"
+#, c-format
+msgid "E475: Expected closing bracket to end list assignment lvalue: %.*s"
+msgstr ""
+"E475: ะžั‡ั–ะบัƒั”ั‚ัŒัั ะฟั€ะฐะฒะฐ ะบะฒะฐะดั€ะฐั‚ะฝะฐ ะดัƒะถะบะฐ ั‰ะพะฑ ะทะฐะบั–ะฝั‡ะธั‚ะธ ะฟั€ะธัะฒะพั”ะฝะฝั ัะฟะธัะบัƒ: %.*s"
-#~ msgid "attempt to refer to deleted tab page"
-#~ msgstr "ัะฟั€ะพะฑะฐ ะทะฒะตั€ะฝะตะฝะฝั ะดะพ ะทะฝะธั‰ะตะฝะพั— ะฒะบะปะฐะดะบะธ"
+#, c-format
+msgid "E15: Misplaced assignment: %.*s"
+msgstr "E15: ะŸั€ะธัะฒะพั”ะฝะฝั ะฝะต ะฝะฐ ะผั–ัั†ั–: %.*s"
-#~ msgid "no such tab page"
-#~ msgstr "ั‚ะฐะบะพั— ะฒะบะปะฐะดะบะธ ะฝะตะผะฐั”"
+#, c-format
+msgid "E15: Unexpected assignment: %.*s"
+msgstr "E15: ะะตัะฟะพะดั–ะฒะฐะฝะพ ะฟั€ะธัะฒะพั”ะฝะฝั: %.*s"
-#~ msgid "attempt to refer to deleted window"
-#~ msgstr "ัะฟั€ะพะฑะฐ ะทะฒะตั€ะฝัƒั‚ะธัั ะดะพ ะทะฝะธั‰ะตะฝะพะณะพ ะฒั–ะบะฝะฐ"
+#, c-format
+msgid "E15: Expected value, got EOC: %.*s"
+msgstr "E15: ะžั‡ั–ะบัƒั”ั‚ัŒัั ะทะฝะฐั‡ะตะฝะฝั, ะพั‚ั€ะธะผะฐะฝะพ EOC: %.*s"
-#~ msgid "readonly attribute: buffer"
-#~ msgstr "ะฐั‚ั€ะธะฑัƒั‚ ะปะธัˆะต ะดะปั ั‡ะธั‚ะฐะฝะฝั: ะฑัƒั„ะตั€"
+#, c-format
+msgid "E116: Missing closing parenthesis for function call: %.*s"
+msgstr "E116: ะ‘ั€ะฐะบัƒั” ะฟั€ะฐะฒะพั— ะดัƒะถะบะธ ัƒ ะฒะธะบะปะธะบัƒ ั„ัƒะฝะบั†ั–ั—: %.*s"
-#~ msgid "cursor position outside buffer"
-#~ msgstr "ะบัƒั€ัะพั€ ะทะฐ ะผะตะถะฐะผะธ ะฑัƒั„ะตั€ะฐ"
+#, c-format
+msgid "E110: Missing closing parenthesis for nested expression: %.*s"
+msgstr "E110: ะŸั€ะพะฟัƒั‰ะตะฝะพ ะฟั€ะฐะฒัƒ ะดัƒะถะบัƒ ัƒ ะฒะบะปะฐะดะตะฝะพะผัƒ ะฒะธั€ะฐะทั–: %.*s"
-#~ msgid "no such window"
-#~ msgstr "ั‚ะฐะบะพะณะพ ะฒั–ะบะฝะฐ ะฝะตะผะฐั”"
+#, c-format
+msgid "E697: Missing end of List ']': %.*s"
+msgstr "E697: ะะตะผะฐั” ะบั–ะฝั†ั–ะฒะบะธ ัะฟะธัะบัƒ ']': %.*s"
-#~ msgid "attempt to refer to deleted buffer"
-#~ msgstr "ัะฟั€ะพะฑะฐ ะทะฒะตั€ะฝะตะฝะฝั ะดะพ ะทะฝะธั‰ะตะฝะพะณะพ ะฑัƒั„ะตั€ะฐ"
+#, c-format
+msgid "E723: Missing end of Dictionary '}': %.*s"
+msgstr "E723: ะะตะผะฐั” ะบั–ะฝั†ั–ะฒะบะธ ัะปะพะฒะฝะธะบะฐ '}': %.*s"
-#~ msgid "failed to rename buffer"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ะฟะตั€ะตะนะผะตะฝัƒะฒะฐั‚ะธ ะฑัƒั„ะตั€"
+#, c-format
+msgid "E15: Missing closing figure brace: %.*s"
+msgstr "E15: ะะตะผะฐั” ะฟั€ะฐะฒะพั— ั„ั–ะณัƒั€ะฝะพั— ะดัƒะถะบะธ: %.*s"
-#~ msgid "mark name must be a single character"
-#~ msgstr "ะฝะฐะทะฒะพัŽ ะผั–ั‚ะบะธ ะผะฐั” ะฑัƒั‚ะธ ะพะดะธะฝ ัะธะผะฒะพะป"
+#, c-format
+msgid "E15: Missing closing figure brace for lambda: %.*s"
+msgstr "E15: ะ‘ั€ะฐะบัƒั” ะฟั€ะฐะฒะพั— ั„ั–ะณัƒั€ะฝะพั— ะดัƒะถะบะธ ัƒ ะปัะผะฑะดั–: %.*s"
-#~ msgid "expected vim.Buffer object, but got %s"
-#~ msgstr "ะพั‡ั–ะบัƒะฒะฐะฒัั ะพะฑโ€™ั”ะบั‚ vim.Buffer, ะฐะปะต ะพั‚ั€ะธะผะฐะฝะพ %s"
+#, c-format
+msgid "E109: Missing ':' after '?': %.*s"
+msgstr "E109: ะ‘ั€ะฐะบัƒั” ':' ะฟั–ัะปั '?': %.*s"
-#~ msgid "failed to switch to buffer %d"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ะฟะตั€ะตะผะบะฝัƒั‚ะธัั ะดะพ ะฑัƒั„ะตั€ะฐ %d"
+msgid "Already only one window"
+msgstr "ะฆะต ะฒะถะต ั”ะดะธะฝะต ะฒั–ะบะฝะพ"
-#~ msgid "expected vim.Window object, but got %s"
-#~ msgstr "ะพั‡ั–ะบัƒะฒะฐะฒัั ะพะฑโ€™ั”ะบั‚ vim.Window, ะฐะปะต ะพั‚ั€ะธะผะฐะฝะพ %s"
+msgid "E441: There is no preview window"
+msgstr "E441: ะะตะผะฐั” ะฒั–ะบะฝะฐ ะฟะตั€ะตะณะปัะดัƒ"
-#~ msgid "failed to find window in the current tab page"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ะทะฝะฐะนั‚ะธ ะฒั–ะบะฝะพ ัƒ ะฟะพั‚ะพั‡ะฝั–ะน ะฒะบะปะฐะดั†ั–"
+msgid "E442: Can't split topleft and botright at the same time"
+msgstr "E442: ะะต ะฒะดะฐะปะพัั ะพะดะฝะพั‡ะฐัะฝะพ ั€ะพะทะฑะธั‚ะธ topleft ั– botright"
-#~ msgid "did not switch to the specified window"
-#~ msgstr "ะฝะต ะฟะตั€ะตะผะบะฝัƒะฒัั ะดะพ ะฒะบะฐะทะฐะฝะพะณะพ ะฒั–ะบะฝะฐ"
+msgid "E443: Cannot rotate when another window is split"
+msgstr "E443: ะะต ะฒะดะฐะปะพัั ะฟะตั€ะตะผั–ัั‚ะธั‚ะธ ะฒั–ะบะฝะพ, ะทะฐะฒะฐะถะฐัŽั‚ัŒ ั–ะฝัˆั–"
-#~ msgid "expected vim.TabPage object, but got %s"
-#~ msgstr "ะพั‡ั–ะบัƒะฒะฐะฒัั ะพะฑโ€™ั”ะบั‚ vim.TabPage, ะฐะปะต ะพั‚ั€ะธะผะฐะฝะพ %s"
+msgid "E444: Cannot close last window"
+msgstr "E444: ะะต ะฒะดะฐะปะพัั ะทะฐะบั€ะธั‚ะธ ะพัั‚ะฐะฝะฝั” ะฒั–ะบะฝะพ"
-#~ msgid "did not switch to the specified tab page"
-#~ msgstr "ะฝะต ะฟะตั€ะตะผะบะฝัƒะฒัั ะดะพ ะฒะบะฐะทะฐะฝะพั— ะฒะบะปะฐะดะบะธ"
+msgid "E813: Cannot close autocmd window"
+msgstr "E813: ะะต ะฒะดะฐะปะพัั ะทะฐะบั€ะธั‚ะธ ะฒั–ะบะฝะพ autocmd"
-#~ msgid "failed to run the code"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ะฒะธะบะพะฝะฐั‚ะธ ะบะพะด"
+msgid "E814: Cannot close window, only autocmd window would remain"
+msgstr "E814: ะะต ะฒะดะฐะปะพัั ะทะฐะบั€ะธั‚ะธ ะฒั–ะบะฝะพ, ะทะฐะปะธัˆะธะปะพัั ะฑ ั‚ั–ะปัŒะบะธ ะฒั–ะบะฝะพ autocmd"
-#~ msgid "E858: Eval did not return a valid python object"
-#~ msgstr "E858: Eval ะฝะต ะฟะพะฒะตั€ะฝัƒะฒ ะดั–ะนัะฝะธะน ะพะฑโ€™ั”ะบั‚ python"
+msgid "E445: Other window contains changes"
+msgstr "E445: ะฃ ั–ะฝัˆะพะผัƒ ะฒั–ะบะฝั– ั” ะทะผั–ะฝะธ"
-#~ msgid "E859: Failed to convert returned python object to vim value"
-#~ msgstr "E859: ะะต ะฒะดะฐะปะพัั ะฟะตั€ะตั‚ะฒะพั€ะธั‚ะธ ะพะฑโ€™ั”ะบั‚ python ัƒ ะทะฝะฐั‡ะตะฝะฝั vim"
+msgid "E446: No file name under cursor"
+msgstr "E446: ะะตะผะฐั” ะฝะฐะทะฒะธ ั„ะฐะนะปัƒ ะฝะฐะด ะบัƒั€ัะพั€ะพะผ"
-#~ msgid "unable to convert %s to vim dictionary"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ะฟะตั€ะตั‚ะฒะพั€ะธั‚ะธ %s ัƒ ัะปะพะฒะฝะธะบ vim"
+#, c-format
+msgid "E799: Invalid ID: %<PRId64> (must be greater than or equal to 1)"
+msgstr "E799: ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ID: %<PRId64> (ะผะฐั” ะฑัƒั‚ะธ ะฝะต ะผะตะฝัˆะธะผ 1)"
-#~ msgid "unable to convert %s to vim structure"
-#~ msgstr "ะฝะต ะฒะดะฐะปะพัั ะฟะตั€ะตั‚ะฒะพั€ะธั‚ะธ %s ัƒ ัั‚ั€ัƒะบั‚ัƒั€ัƒ vim"
+#, c-format
+msgid "E801: ID already taken: %<PRId64>"
+msgstr "E801: ID ะฒะถะต ะทะฐะนะฝัั‚ะพ: %<PRId64>"
-#~ msgid "internal error: NULL reference passed"
-#~ msgstr "ะฒะฝัƒั‚ั€ั–ัˆะฝั ะฟะพะผะธะปะบะฐ: ะฟะตั€ะตะดะฐะฝะพ ะฟะพัะธะปะฐะฝะฝั NULL"
+#, c-format
+msgid "E5030: Empty list at position %d"
+msgstr "E5030: ะŸะพั€ะพะถะฝั–ะน ัะฟะธัะพะบ ัƒ ะฟะพะทะธั†ั–ั— %d"
-#~ msgid "internal error: invalid value type"
-#~ msgstr "ะฒะฝัƒั‚ั€ั–ัˆะฝั ะฟะพะผะธะปะบะฐ: ะฝะตะฟั€ะฐะฒะธะปัŒะฝะธะน ั‚ะธะฟ ะทะฝะฐั‡ะตะฝะฝั"
+#, c-format
+msgid "E5031: List or number required at position %d"
+msgstr "E5031: ะžั‡ั–ะบัƒั”ั‚ัŒัั ัะฟะธัะพะบ ั‡ะธ ั‡ะธัะปะพ ัƒ ะฟะพะทะธั†ั–ั— %d"
-#~ msgid ""
-#~ "Failed to set path hook: sys.path_hooks is not a list\n"
-#~ "You should now do the following:\n"
-#~ "- append vim.path_hook to sys.path_hooks\n"
-#~ "- append vim.VIM_SPECIAL_PATH to sys.path\n"
-#~ msgstr ""
-#~ "ะะต ะฒะดะฐะปะพัั ะฒัั‚ะฐะฝะพะฒะธั‚ะธ ะพะฑั€ะพะฑะฝะธะบ ัˆะปัั…ัƒ: sys.path_hooks ะฝะต ัะฟะธัะพะบ\n"
-#~ "ะ’ะฐะผ ัะปั–ะด ะฒั‡ะธะฝะธั‚ะธ ั‚ะฐะบ:\n"
-#~ "- ะดะพะดะฐะนั‚ะต vim.path_hook ะดะพ sys.path_hooks\n"
-#~ "- ะดะพะดะฐะนั‚ะต vim.VIM_SPECIAL_PATH ะดะพ sys.path\n"
+#, c-format
+msgid "E802: Invalid ID: %<PRId64> (must be greater than or equal to 1)"
+msgstr "E802: ะะตะฟั€ะฐะฒะธะปัŒะฝะธะน ID: %<PRId64> (ะผะฐั” ะฑัƒั‚ะธ ะฝะต ะผะตะฝัˆะธะผ 1)"
-#~ msgid ""
-#~ "Failed to set path: sys.path is not a list\n"
-#~ "You should now append vim.VIM_SPECIAL_PATH to sys.path"
-#~ msgstr ""
-#~ "ะะต ะฒะดะฐะปะพัั ะฒัั‚ะฐะฝะพะฒะธั‚ะธ ัˆะปัั…: sys.path ะฝะต ัะฟะธัะพะบ\n"
-#~ "ะ’ะฐั ัะปั–ะด ะดะพะดะฐั‚ะธ vim.VIM_SPECIAL_PATH ะดะพ sys.path"
+#, c-format
+msgid "E803: ID not found: %<PRId64>"
+msgstr "E803: ID ะฝะต ะทะฝะฐะนะดะตะฝะพ: %<PRId64>"
diff --git a/src/nvim/po/vi.po b/src/nvim/po/vi.po
index a720510426..7dbf19c263 100644
--- a/src/nvim/po/vi.po
+++ b/src/nvim/po/vi.po
@@ -2500,7 +2500,7 @@ msgstr "E216: Nhรณm hoแบทc sแปฑ kiแป‡n khรดng cรณ thแบญt: %s"
#: ../fileio.c:6090
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
"--- Cรขu lแป‡nh tแปฑ ฤ‘แป™ng ---"
@@ -2524,7 +2524,7 @@ msgstr "E218: cรขu lแป‡nh tแปฑ ฤ‘แป™ng xแบฟp lแป“ng vร o nhau quรก xรขu"
#: ../fileio.c:7143
#, c-format
-msgid "%s Auto commands for \"%s\""
+msgid "%s Autocommands for \"%s\""
msgstr "%s cรขu lแป‡nh tแปฑ ฤ‘แป™ng cho \"%s\""
#: ../fileio.c:7149
@@ -2720,11 +2720,6 @@ msgstr "E49: Kรญch thฦฐแป›c thanh cuแป™n khรดng cho phรฉp"
msgid "E901: Job table is full"
msgstr ""
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
#: ../globals.h:1024
#, c-format
msgid "E364: Library call failed for \"%s()\""
@@ -3424,7 +3419,7 @@ msgstr "-q [tแบญp tin lแป—i] soแบกn thแบฃo tแบญp tin vแป›i lแป—i ฤ‘แบงu tiรชn"
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
@@ -4311,11 +4306,6 @@ msgstr "dรฒng %4ld:"
msgid "E354: Invalid register name: '%s'"
msgstr "E354: Tรชn sแป• ฤ‘ฤƒng kรฝ khรดng cho phรฉp: '%s'"
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr ""
-"Bแบฃn dแป‹ch cรกc thรดng bรกo sang tiแบฟng Viแป‡t: Phan Vฤฉnh Thแป‹nh <teppi@vnlinux.org>"
-
#: ../message.c:986
msgid "Interrupt: "
msgstr "Giรกn ฤ‘oแบกn: "
diff --git a/src/nvim/po/zh_CN.UTF-8.po b/src/nvim/po/zh_CN.UTF-8.po
index 82b895d9d6..76204a43a8 100644
--- a/src/nvim/po/zh_CN.UTF-8.po
+++ b/src/nvim/po/zh_CN.UTF-8.po
@@ -2461,7 +2461,7 @@ msgstr "E216: ๆ— ๆญค็ป„ๆˆ–ไบ‹ไปถ: %s"
#: ../fileio.c:6090
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
"--- ่‡ชๅŠจๅ‘ฝไปค ---"
@@ -2485,7 +2485,7 @@ msgstr "E218: ่‡ชๅŠจๅ‘ฝไปคๅตŒๅฅ—ๅฑ‚ๆ•ฐ่ฟ‡ๆทฑ"
#: ../fileio.c:7143
#, c-format
-msgid "%s Auto commands for \"%s\""
+msgid "%s Autocommands for \"%s\""
msgstr "%s ่‡ชๅŠจๅ‘ฝไปค \"%s\""
#: ../fileio.c:7149
@@ -2675,11 +2675,6 @@ msgstr "E49: ๆ— ๆ•ˆ็š„ๆปšๅŠจๅคงๅฐ"
msgid "E901: Job table is full"
msgstr ""
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
#: ../globals.h:1024
#, c-format
msgid "E364: Library call failed for \"%s()\""
@@ -3372,7 +3367,7 @@ msgstr "-q [errorfile] ็ผ–่พ‘็ฌฌไธ€ไธชๅ‡บ้”™ๅค„็š„ๆ–‡ไปถ"
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
@@ -4264,10 +4259,6 @@ msgstr "็ฌฌ %4ld ่กŒ:"
msgid "E354: Invalid register name: '%s'"
msgstr "E354: ๆ— ๆ•ˆ็š„ๅฏ„ๅญ˜ๅ™จๅ: '%s'"
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr "็ฎ€ไฝ“ไธญๆ–‡ๆถˆๆฏ็ปดๆŠค่€…: Yuheng Xie <elephant@linux.net.cn>"
-
#: ../message.c:986
msgid "Interrupt: "
msgstr "ๅทฒไธญๆ–ญ: "
@@ -5301,7 +5292,7 @@ msgstr "่ญฆๅ‘Š: ๅŒบๅŸŸ %s ไธๆ”ฏๆŒ"
#: ../spell.c:4550
#, c-format
-msgid "Reading affix file %s ..."
+msgid "Reading affix file %s..."
msgstr "่ฏปๅ–้™„ๅŠ ๆ–‡ไปถ %s โ€ฆโ€ฆ"
#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
@@ -5460,7 +5451,7 @@ msgstr "%s ็š„ๅ€ผไธŽๅฆไธ€ไธช .aff ๆ–‡ไปถไธญไฝฟ็”จ็š„ๅ€ผไธ็›ธๅŒ"
#: ../spell.c:5602
#, c-format
-msgid "Reading dictionary file %s ..."
+msgid "Reading dictionary file %s..."
msgstr "่ฏปๅ–ๅญ—ๅ…ธๆ–‡ไปถ %s โ€ฆโ€ฆ"
#: ../spell.c:5611
@@ -5495,7 +5486,7 @@ msgstr "ๅฟฝ็•ฅไบ†ๅซๆœ‰้ž ASCII ๅญ—็ฌฆ็š„ %d ไธชๅ•่ฏ๏ผŒๅœจ %s ไธญ"
#: ../spell.c:6115
#, c-format
-msgid "Reading word file %s ..."
+msgid "Reading word file %s..."
msgstr "่ฏปๅ–ๅ•่ฏๆ–‡ไปถ %s โ€ฆโ€ฆ"
#: ../spell.c:6155
@@ -5565,7 +5556,7 @@ msgstr "ๅ•่ฏๆ€ปๆ•ฐ: %d"
#: ../spell.c:7655
#, c-format
-msgid "Writing suggestion file %s ..."
+msgid "Writing suggestion file %s..."
msgstr "ๅ†™ๅ…ฅๅปบ่ฎฎๆ–‡ไปถ %s โ€ฆโ€ฆ"
#: ../spell.c:7707 ../spell.c:7927
@@ -5592,7 +5583,7 @@ msgstr "่ญฆๅ‘Š: ๅŒๆ—ถๆŒ‡ๅฎšไบ† compounding ๅ’Œ NOBREAK"
#: ../spell.c:7920
#, c-format
-msgid "Writing spell file %s ..."
+msgid "Writing spell file %s..."
msgstr "ๅ†™ๅ…ฅๆ‹ผๅ†™ๆ–‡ไปถ %s โ€ฆโ€ฆ"
#: ../spell.c:7925
diff --git a/src/nvim/po/zh_CN.cp936.po b/src/nvim/po/zh_CN.cp936.po
deleted file mode 100644
index cf66010c71..0000000000
--- a/src/nvim/po/zh_CN.cp936.po
+++ /dev/null
@@ -1,7932 +0,0 @@
-# Chinese (simplified) Translation for Vim
-#
-# Do ":help uganda" in Vim to read copying and usage conditions.
-# Do ":help credits" in Vim to see a list of people who contributed.
-#
-# FIRST AUTHOR Wang Jun <junw@turbolinux.com.cn>
-#
-# TRANSLATORS
-# Edyfox <edyfox@gmail.com>
-# Yuheng Xie <elephant@linux.net.cn>
-#
-# Generated from zh_CN.po, DO NOT EDIT.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: Vim(Simplified Chinese)\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-05-26 14:21+0200\n"
-"PO-Revision-Date: 2006-04-21 14:00+0800\n"
-"Last-Translator: Yuheng Xie <elephant@linux.net.cn>\n"
-"Language-Team: Simplified Chinese <i18n-translation@lists.linux.net.cn>\n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=gbk\n"
-"Content-Transfer-Encoding: 8-bit\n"
-
-#: ../api/private/helpers.c:201
-#, fuzzy
-msgid "Unable to get option value"
-msgstr "ักฯ๎ฒฮสบ๓ตฤฤฺศฮะง"
-
-#: ../api/private/helpers.c:204
-msgid "internal error: unknown option type"
-msgstr ""
-
-#: ../buffer.c:92
-msgid "[Location List]"
-msgstr "[Location มะฑํ]"
-
-#: ../buffer.c:93
-msgid "[Quickfix List]"
-msgstr "[Quickfix มะฑํ]"
-
-#: ../buffer.c:94
-msgid "E855: Autocommands caused command to abort"
-msgstr ""
-
-#: ../buffer.c:135
-msgid "E82: Cannot allocate any buffer, exiting..."
-msgstr "E82: ฮทจทึลไศฮบฮปบณๅว๘ฃฌอหณ๖ณฬะ๒..."
-
-#: ../buffer.c:138
-msgid "E83: Cannot allocate buffer, using other one..."
-msgstr "E83: ฮทจทึลไปบณๅว๘ฃฌสนำรมําปธ๖ปบณๅว๘..."
-
-#: ../buffer.c:763
-msgid "E515: No buffers were unloaded"
-msgstr "E515: รปำะสอทลศฮบฮปบณๅว๘"
-
-#: ../buffer.c:765
-msgid "E516: No buffers were deleted"
-msgstr "E516: รปำะษพณศฮบฮปบณๅว๘"
-
-#: ../buffer.c:767
-msgid "E517: No buffers were wiped out"
-msgstr "E517: รปำะวๅณศฮบฮปบณๅว๘"
-
-#: ../buffer.c:772
-msgid "1 buffer unloaded"
-msgstr "สอทลมห 1 ธ๖ปบณๅว๘"
-
-#: ../buffer.c:774
-#, c-format
-msgid "%d buffers unloaded"
-msgstr "สอทลมห %d ธ๖ปบณๅว๘"
-
-#: ../buffer.c:777
-msgid "1 buffer deleted"
-msgstr "ษพณมห 1 ธ๖ปบณๅว๘"
-
-#: ../buffer.c:779
-#, c-format
-msgid "%d buffers deleted"
-msgstr "ษพณมห %d ธ๖ปบณๅว๘"
-
-#: ../buffer.c:782
-msgid "1 buffer wiped out"
-msgstr "วๅณมห 1 ธ๖ปบณๅว๘"
-
-#: ../buffer.c:784
-#, c-format
-msgid "%d buffers wiped out"
-msgstr "วๅณมห %d ธ๖ปบณๅว๘"
-
-#: ../buffer.c:806
-msgid "E90: Cannot unload last buffer"
-msgstr "E90: ฮทจสอทลื๎บ๓าปธ๖ปบณๅว๘"
-
-#: ../buffer.c:874
-msgid "E84: No modified buffer found"
-msgstr "E84: รปำะะธฤนตฤปบณๅว๘"
-
-#. back where we started, didn't find anything.
-#: ../buffer.c:903
-msgid "E85: There is no listed buffer"
-msgstr "E85: รปำะฟษมะณ๖ตฤปบณๅว๘"
-
-#: ../buffer.c:913
-#, c-format
-msgid "E86: Buffer %<PRId64> does not exist"
-msgstr "E86: ปบณๅว๘ %<PRId64> ฒปดๆิฺ"
-
-#: ../buffer.c:915
-msgid "E87: Cannot go beyond last buffer"
-msgstr "E87: ฮทจวะปปฃฌาัสวื๎บ๓าปธ๖ปบณๅว๘"
-
-#: ../buffer.c:917
-msgid "E88: Cannot go before first buffer"
-msgstr "E88: ฮทจวะปปฃฌาัสวตฺาปธ๖ปบณๅว๘"
-
-#: ../buffer.c:945
-#, c-format
-msgid ""
-"E89: No write since last change for buffer %<PRId64> (add ! to override)"
-msgstr "E89: ปบณๅว๘ %<PRId64> าัะธฤตซษะฮดฑฃดๆ (ว๋ผำ ! วฟึฦึดะะ)"
-
-#. wrap around (may cause duplicates)
-#: ../buffer.c:1423
-msgid "W14: Warning: List of file names overflow"
-msgstr "W14: พฏธๆ: ฮฤผร๛นถเ"
-
-#: ../buffer.c:1555 ../quickfix.c:3361
-#, c-format
-msgid "E92: Buffer %<PRId64> not found"
-msgstr "E92: ีาฒปตฝปบณๅว๘ %<PRId64>"
-
-#: ../buffer.c:1798
-#, c-format
-msgid "E93: More than one match for %s"
-msgstr "E93: ีาตฝฒปึนาปธ๖ %s"
-
-#: ../buffer.c:1800
-#, c-format
-msgid "E94: No matching buffer for %s"
-msgstr "E94: รปำะฦฅลไตฤปบณๅว๘ %s"
-
-#: ../buffer.c:2161
-#, c-format
-msgid "line %<PRId64>"
-msgstr "ตฺ %<PRId64> ะะ"
-
-#: ../buffer.c:2233
-msgid "E95: Buffer with this name already exists"
-msgstr "E95: าัำะปบณๅว๘สนำรธรร๛ณฦ"
-
-#: ../buffer.c:2498
-msgid " [Modified]"
-msgstr " [าัะธฤ]"
-
-#: ../buffer.c:2501
-msgid "[Not edited]"
-msgstr "[ฮดฑเผญ]"
-
-#: ../buffer.c:2504
-msgid "[New file]"
-msgstr "[ะยฮฤผ]"
-
-#: ../buffer.c:2505
-msgid "[Read errors]"
-msgstr "[ถมดํฮ๓]"
-
-#: ../buffer.c:2506 ../buffer.c:3217 ../fileio.c:1807 ../screen.c:4895
-msgid "[RO]"
-msgstr "[ึปถม]"
-
-#: ../buffer.c:2507 ../fileio.c:1807
-msgid "[readonly]"
-msgstr "[ึปถม]"
-
-#: ../buffer.c:2524
-#, c-format
-msgid "1 line --%d%%--"
-msgstr "1 ะะ --%d%%--"
-
-#: ../buffer.c:2526
-#, c-format
-msgid "%<PRId64> lines --%d%%--"
-msgstr "%<PRId64> ะะ --%d%%--"
-
-#: ../buffer.c:2530
-#, c-format
-msgid "line %<PRId64> of %<PRId64> --%d%%-- col "
-msgstr "ะะ %<PRId64> / %<PRId64> --%d%%-- มะ "
-
-#: ../buffer.c:2632 ../buffer.c:4292 ../memline.c:1554
-msgid "[No Name]"
-msgstr "[ฮดรร๛]"
-
-#. must be a help buffer
-#: ../buffer.c:2667
-msgid "help"
-msgstr "ฐ๏ึ๚"
-
-#: ../buffer.c:3225 ../screen.c:4883
-msgid "[Help]"
-msgstr "[ฐ๏ึ๚]"
-
-#: ../buffer.c:3254 ../screen.c:4887
-msgid "[Preview]"
-msgstr "[ิคภภ]"
-
-#: ../buffer.c:3528
-msgid "All"
-msgstr "ศซฒฟ"
-
-#: ../buffer.c:3528
-msgid "Bot"
-msgstr "ตืถห"
-
-#: ../buffer.c:3531
-msgid "Top"
-msgstr "ถฅถห"
-
-#: ../buffer.c:4244
-msgid ""
-"\n"
-"# Buffer list:\n"
-msgstr ""
-"\n"
-"# ปบณๅว๘มะฑํ:\n"
-
-#: ../buffer.c:4289
-msgid "[Scratch]"
-msgstr ""
-
-#: ../buffer.c:4529
-msgid ""
-"\n"
-"--- Signs ---"
-msgstr ""
-"\n"
-"--- Signs ---"
-
-#: ../buffer.c:4538
-#, c-format
-msgid "Signs for %s:"
-msgstr "%s ตฤ Signs:"
-
-#: ../buffer.c:4543
-#, c-format
-msgid " line=%<PRId64> id=%d name=%s"
-msgstr " ะะ=%<PRId64> id=%d ร๛ณฦ=%s"
-
-#: ../cursor_shape.c:68
-msgid "E545: Missing colon"
-msgstr "E545: ศฑษูรฐบล"
-
-#: ../cursor_shape.c:70 ../cursor_shape.c:94
-msgid "E546: Illegal mode"
-msgstr "E546: ฮะงตฤฤฃสฝ"
-
-#: ../cursor_shape.c:134
-msgid "E548: digit expected"
-msgstr "E548: ดหดฆะ่าชสืึ"
-
-#: ../cursor_shape.c:138
-msgid "E549: Illegal percentage"
-msgstr "E549: ฮะงตฤฐูทึฑศ"
-
-#: ../diff.c:146
-#, c-format
-msgid "E96: Can not diff more than %<PRId64> buffers"
-msgstr "E96: ฒปฤฑศฝฯ(diff) %<PRId64> ธ๖าิษฯตฤปบณๅว๘"
-
-#: ../diff.c:753
-#, fuzzy
-msgid "E810: Cannot read or write temp files"
-msgstr "E557: ฮทจด๒ฟช termcap ฮฤผ"
-
-#: ../diff.c:755
-msgid "E97: Cannot create diffs"
-msgstr "E97: ฮทจดดฝจ diff"
-
-#: ../diff.c:966
-#, fuzzy
-msgid "E816: Cannot read patch output"
-msgstr "E98: ฮทจถมศก diff ตฤสไณ๖"
-
-#: ../diff.c:1220
-msgid "E98: Cannot read diff output"
-msgstr "E98: ฮทจถมศก diff ตฤสไณ๖"
-
-#: ../diff.c:2081
-msgid "E99: Current buffer is not in diff mode"
-msgstr "E99: ตฑวฐปบณๅว๘ฒปิฺ diff ฤฃสฝ"
-
-#: ../diff.c:2100
-#, fuzzy
-msgid "E793: No other buffer in diff mode is modifiable"
-msgstr "E100: รปำะฦไหดฆำฺ diff ฤฃสฝตฤปบณๅว๘"
-
-#: ../diff.c:2102
-msgid "E100: No other buffer in diff mode"
-msgstr "E100: รปำะฦไหดฆำฺ diff ฤฃสฝตฤปบณๅว๘"
-
-#: ../diff.c:2112
-msgid "E101: More than two buffers in diff mode, don't know which one to use"
-msgstr "E101: ำะมฝธ๖าิษฯตฤปบณๅว๘ดฆำฺ diff ฤฃสฝฃฌฒปฤพ๖ถจำรฤฤาปธ๖"
-
-#: ../diff.c:2141
-#, c-format
-msgid "E102: Can't find buffer \"%s\""
-msgstr "E102: ีาฒปตฝปบณๅว๘ \"%s\""
-
-#: ../diff.c:2152
-#, c-format
-msgid "E103: Buffer \"%s\" is not in diff mode"
-msgstr "E103: ปบณๅว๘ \"%s\" ฒปิฺ diff ฤฃสฝ"
-
-#: ../diff.c:2193
-msgid "E787: Buffer changed unexpectedly"
-msgstr "E787: าโอโตุธฤฑไมหปบณๅว๘"
-
-#: ../digraph.c:1598
-msgid "E104: Escape not allowed in digraph"
-msgstr "E104: ธดบฯืึท๛(digraph)ึะฒปฤสนำร Escape"
-
-#: ../digraph.c:1760
-msgid "E544: Keymap file not found"
-msgstr "E544: ีาฒปตฝ Keymap ฮฤผ"
-
-#: ../digraph.c:1785
-msgid "E105: Using :loadkeymap not in a sourced file"
-msgstr "E105: ฒปสวิฺฝลฑพฮฤผึะสนำร :loadkeymap "
-
-#: ../digraph.c:1821
-msgid "E791: Empty keymap entry"
-msgstr ""
-
-#: ../edit.c:82
-msgid " Keyword completion (^N^P)"
-msgstr " นุผืึฒนศซ (^N^P)"
-
-#. ctrl_x_mode == 0, ^P/^N compl.
-#: ../edit.c:83
-msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-msgstr " ^X ฤฃสฝ (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-
-#: ../edit.c:85
-msgid " Whole line completion (^L^N^P)"
-msgstr " ี๛ะะฒนศซ (^L^N^P)"
-
-#: ../edit.c:86
-msgid " File name completion (^F^N^P)"
-msgstr " ฮฤผร๛ฒนศซ (^F^N^P)"
-
-#: ../edit.c:87
-msgid " Tag completion (^]^N^P)"
-msgstr " Tag ฒนศซ (^]^N^P)"
-
-#: ../edit.c:88
-#, fuzzy
-msgid " Path pattern completion (^N^P)"
-msgstr " ยทพถฤฃสฝฒนศซ (^N^P)"
-
-#: ../edit.c:89
-msgid " Definition completion (^D^N^P)"
-msgstr " ถจาๅฒนศซ (^D^N^P)"
-
-#: ../edit.c:91
-msgid " Dictionary completion (^K^N^P)"
-msgstr " Dictionary ฒนศซ (^K^N^P)"
-
-#: ../edit.c:92
-msgid " Thesaurus completion (^T^N^P)"
-msgstr " Thesaurus ฒนศซ (^T^N^P)"
-
-#: ../edit.c:93
-msgid " Command-line completion (^V^N^P)"
-msgstr " รม๎ะะฒนศซ (^V^N^P)"
-
-#: ../edit.c:94
-msgid " User defined completion (^U^N^P)"
-msgstr " ำรปงืิถจาๅฒนศซ (^U^N^P)"
-
-#: ../edit.c:95
-msgid " Omni completion (^O^N^P)"
-msgstr " ศซฤฒนศซ (^O^N^P)"
-
-#: ../edit.c:96
-msgid " Spelling suggestion (s^N^P)"
-msgstr " ฦดะดฝจา้ (s^N^P)"
-
-#: ../edit.c:97
-msgid " Keyword Local completion (^N^P)"
-msgstr " นุผืึพึฒฟฒนศซ (^N^P)"
-
-#: ../edit.c:100
-msgid "Hit end of paragraph"
-msgstr "าัตฝถฮยไฝแฮฒ"
-
-#: ../edit.c:101
-msgid "E839: Completion function changed window"
-msgstr ""
-
-#: ../edit.c:102
-msgid "E840: Completion function deleted text"
-msgstr ""
-
-#: ../edit.c:1847
-msgid "'dictionary' option is empty"
-msgstr "ักฯ๎ 'dictionary' ฮชฟี"
-
-#: ../edit.c:1848
-msgid "'thesaurus' option is empty"
-msgstr "ักฯ๎ 'thesaurus' ฮชฟี"
-
-#: ../edit.c:2655
-#, c-format
-msgid "Scanning dictionary: %s"
-msgstr "ีิฺษจร่ dictionary: %s"
-
-#: ../edit.c:3079
-msgid " (insert) Scroll (^E/^Y)"
-msgstr " (ฒๅศ๋) Scroll (^E/^Y)"
-
-#: ../edit.c:3081
-msgid " (replace) Scroll (^E/^Y)"
-msgstr " (ฬๆปป) Scroll (^E/^Y)"
-
-#: ../edit.c:3587
-#, c-format
-msgid "Scanning: %s"
-msgstr "ีิฺษจร่: %s"
-
-#: ../edit.c:3614
-msgid "Scanning tags."
-msgstr "ษจร่ฑ๊วฉ."
-
-#: ../edit.c:4519
-msgid " Adding"
-msgstr " ิ๖ผำ"
-
-#. showmode might reset the internal line pointers, so it must
-#. * be called before line = ml_get(), or when this address is no
-#. * longer needed. -- Acevedo.
-#.
-#: ../edit.c:4562
-msgid "-- Searching..."
-msgstr "-- ฒ้ีาึะ..."
-
-#: ../edit.c:4618
-msgid "Back at original"
-msgstr "ปุตฝฦ๐ตใ"
-
-#: ../edit.c:4621
-msgid "Word from other line"
-msgstr "มําปะะตฤดส"
-
-#: ../edit.c:4624
-msgid "The only match"
-msgstr "ฮจาปฦฅลไ"
-
-#: ../edit.c:4680
-#, c-format
-msgid "match %d of %d"
-msgstr "ฦฅลไ %d / %d"
-
-#: ../edit.c:4684
-#, c-format
-msgid "match %d"
-msgstr "ฦฅลไ %d"
-
-#: ../eval.c:137
-msgid "E18: Unexpected characters in :let"
-msgstr "E18: :let ึะณ๖ฯึา์ณฃืึท๛"
-
-#: ../eval.c:138
-#, c-format
-msgid "E684: list index out of range: %<PRId64>"
-msgstr "E684: List ห๗าณฌณ๖ทถฮง: %<PRId64>"
-
-#: ../eval.c:139
-#, c-format
-msgid "E121: Undefined variable: %s"
-msgstr "E121: ฮดถจาๅตฤฑไมฟ: %s"
-
-#: ../eval.c:140
-msgid "E111: Missing ']'"
-msgstr "E111: ศฑษู ']'"
-
-#: ../eval.c:141
-#, c-format
-msgid "E686: Argument of %s must be a List"
-msgstr "E686: %s ตฤฒฮสฑุะ๋สว List"
-
-#: ../eval.c:143
-#, c-format
-msgid "E712: Argument of %s must be a List or Dictionary"
-msgstr "E712: %s ตฤฒฮสฑุะ๋สว List ป๒ี฿ Dictionary"
-
-#: ../eval.c:144
-msgid "E713: Cannot use empty key for Dictionary"
-msgstr "E713: Dictionary ตฤผฒปฤฮชฟี"
-
-#: ../eval.c:145
-msgid "E714: List required"
-msgstr "E714: ะ่าช List"
-
-#: ../eval.c:146
-msgid "E715: Dictionary required"
-msgstr "E715: ะ่าช Dictionary"
-
-#: ../eval.c:147
-#, c-format
-msgid "E118: Too many arguments for function: %s"
-msgstr "E118: บฏสตฤฒฮสนถเ: %s"
-
-#: ../eval.c:148
-#, c-format
-msgid "E716: Key not present in Dictionary: %s"
-msgstr "E716: Dictionary ึะฒปดๆิฺผ: %s"
-
-#: ../eval.c:150
-#, c-format
-msgid "E122: Function %s already exists, add ! to replace it"
-msgstr "E122: บฏส %s าัดๆิฺฃฌว๋ผำ ! วฟึฦฬๆปป"
-
-#: ../eval.c:151
-msgid "E717: Dictionary entry already exists"
-msgstr "E717: Dictionary ฯ๎าัดๆิฺ"
-
-#: ../eval.c:152
-msgid "E718: Funcref required"
-msgstr "E718: ะ่าช Funcref"
-
-#: ../eval.c:153
-msgid "E719: Cannot use [:] with a Dictionary"
-msgstr "E719: ฒปฤถิ Dictionary สนำร [:]"
-
-#: ../eval.c:154
-#, c-format
-msgid "E734: Wrong variable type for %s="
-msgstr "E734: %s= ตฤฑไมฟภเะอฒปีศท"
-
-#: ../eval.c:155
-#, c-format
-msgid "E130: Unknown function: %s"
-msgstr "E130: ฮดึชตฤบฏส: %s"
-
-#: ../eval.c:156
-#, c-format
-msgid "E461: Illegal variable name: %s"
-msgstr "E461: ฮะงตฤฑไมฟร๛: %s"
-
-#: ../eval.c:157
-#, fuzzy
-msgid "E806: using Float as a String"
-msgstr "E730: ฝซ List ื๗ String สนำร"
-
-#: ../eval.c:1830
-msgid "E687: Less targets than List items"
-msgstr "E687: ฤฟฑ๊ฑศ List ฯ๎สษู"
-
-#: ../eval.c:1834
-msgid "E688: More targets than List items"
-msgstr "E688: ฤฟฑ๊ฑศ List ฯ๎สถเ"
-
-#: ../eval.c:1906
-msgid "Double ; in list of variables"
-msgstr "ฑไมฟมะฑํึะณ๖ฯึมฝธ๖ ;"
-
-#: ../eval.c:2078
-#, c-format
-msgid "E738: Can't list variables for %s"
-msgstr "E738: ฮทจมะณ๖ %s ตฤฑไมฟ"
-
-#: ../eval.c:2391
-msgid "E689: Can only index a List or Dictionary"
-msgstr "E689: ึปฤห๗า List ป๒ Dictionary"
-
-#: ../eval.c:2396
-msgid "E708: [:] must come last"
-msgstr "E708: [:] ฑุะ๋ิฺื๎บ๓"
-
-#: ../eval.c:2439
-msgid "E709: [:] requires a List value"
-msgstr "E709: [:] ะ่าชาปธ๖ List ึต"
-
-#: ../eval.c:2674
-msgid "E710: List value has more items than target"
-msgstr "E710: List ึตตฤฯ๎ฑศฤฟฑ๊ถเ"
-
-#: ../eval.c:2678
-msgid "E711: List value has not enough items"
-msgstr "E711: List ึตรปำะืในปถเตฤฯ๎"
-
-#: ../eval.c:2867
-msgid "E690: Missing \"in\" after :for"
-msgstr "E690: :for บ๓ศฑษู \"in\""
-
-#: ../eval.c:3063
-#, c-format
-msgid "E107: Missing parentheses: %s"
-msgstr "E107: ศฑษูภจบล: %s"
-
-#: ../eval.c:3263
-#, c-format
-msgid "E108: No such variable: \"%s\""
-msgstr "E108: ฮดหฑไมฟ: \"%s\""
-
-#: ../eval.c:3333
-msgid "E743: variable nested too deep for (un)lock"
-msgstr "E743: (un)lock ตฤฑไมฟวถฬืนษ๎"
-
-#: ../eval.c:3630
-msgid "E109: Missing ':' after '?'"
-msgstr "E109: '?' บ๓ศฑษู ':'"
-
-#: ../eval.c:3893
-msgid "E691: Can only compare List with List"
-msgstr "E691: ึปฤฑศฝฯ List บอ List"
-
-#: ../eval.c:3895
-msgid "E692: Invalid operation for Lists"
-msgstr "E692: ถิ List ฮะงตฤฒูื๗"
-
-#: ../eval.c:3915
-msgid "E735: Can only compare Dictionary with Dictionary"
-msgstr "E735: ึปฤฑศฝฯ Dictionary บอ Dictionary"
-
-#: ../eval.c:3917
-msgid "E736: Invalid operation for Dictionary"
-msgstr "E736: ถิ Dictionary ฮะงตฤฒูื๗"
-
-#: ../eval.c:3932
-msgid "E693: Can only compare Funcref with Funcref"
-msgstr "E693: ึปฤฑศฝฯ Funcref บอ Funcref"
-
-#: ../eval.c:3934
-msgid "E694: Invalid operation for Funcrefs"
-msgstr "E694: ถิ Funcrefs ฮะงตฤฒูื๗"
-
-#: ../eval.c:4277
-#, fuzzy
-msgid "E804: Cannot use '%' with Float"
-msgstr "E719: ฒปฤถิ Dictionary สนำร [:]"
-
-#: ../eval.c:4478
-msgid "E110: Missing ')'"
-msgstr "E110: ศฑษู ')'"
-
-#: ../eval.c:4609
-msgid "E695: Cannot index a Funcref"
-msgstr "E695: ฒปฤห๗าาปธ๖ Funcref"
-
-#: ../eval.c:4839
-#, c-format
-msgid "E112: Option name missing: %s"
-msgstr "E112: ศฑษูักฯ๎ร๛ณฦ: %s"
-
-#: ../eval.c:4855
-#, c-format
-msgid "E113: Unknown option: %s"
-msgstr "E113: ฮดึชตฤักฯ๎: %s"
-
-#: ../eval.c:4904
-#, c-format
-msgid "E114: Missing quote: %s"
-msgstr "E114: ศฑษูาบล: %s"
-
-#: ../eval.c:5020
-#, c-format
-msgid "E115: Missing quote: %s"
-msgstr "E115: ศฑษูาบล: %s"
-
-#: ../eval.c:5084
-#, c-format
-msgid "E696: Missing comma in List: %s"
-msgstr "E696: List ึะศฑษูถบบล: %s"
-
-#: ../eval.c:5091
-#, c-format
-msgid "E697: Missing end of List ']': %s"
-msgstr "E697: List ศฑษูฝแส๘ท๛ ']': %s"
-
-#: ../eval.c:6475
-#, c-format
-msgid "E720: Missing colon in Dictionary: %s"
-msgstr "E720: Dictionary ึะศฑษูรฐบล: %s"
-
-#: ../eval.c:6499
-#, c-format
-msgid "E721: Duplicate key in Dictionary: \"%s\""
-msgstr "E721: Dictionary ึะณ๖ฯึึุธดตฤผ: \"%s\""
-
-#: ../eval.c:6517
-#, c-format
-msgid "E722: Missing comma in Dictionary: %s"
-msgstr "E722: Dictionary ึะศฑษูถบบล: %s"
-
-#: ../eval.c:6524
-#, c-format
-msgid "E723: Missing end of Dictionary '}': %s"
-msgstr "E723: Dictionary ศฑษูฝแส๘ท๛ '}': %s"
-
-#: ../eval.c:6555
-msgid "E724: variable nested too deep for displaying"
-msgstr "E724: ฑไมฟวถฬืนษ๎ฮทจฯิสพ"
-
-#: ../eval.c:7188
-#, fuzzy, c-format
-msgid "E740: Too many arguments for function %s"
-msgstr "E118: บฏสตฤฒฮสนถเ: %s"
-
-#: ../eval.c:7190
-#, fuzzy, c-format
-msgid "E116: Invalid arguments for function %s"
-msgstr "E118: บฏสตฤฒฮสนถเ: %s"
-
-#: ../eval.c:7377
-#, fuzzy, c-format
-msgid "E117: Unknown function: %s"
-msgstr "E130: ฮดึชตฤบฏส: %s"
-
-#: ../eval.c:7383
-#, c-format
-msgid "E119: Not enough arguments for function: %s"
-msgstr "E119: บฏส %s ตฤฒฮสฬซษู"
-
-#: ../eval.c:7387
-#, c-format
-msgid "E120: Using <SID> not in a script context: %s"
-msgstr "E120: <SID> ฒปฤิฺ script ษฯฯยฮฤอโสนำร: %s"
-
-#: ../eval.c:7391
-#, fuzzy, c-format
-msgid "E725: Calling dict function without Dictionary: %s"
-msgstr "E720: Dictionary ึะศฑษูรฐบล: %s"
-
-#: ../eval.c:7453
-#, fuzzy
-msgid "E808: Number or Float required"
-msgstr "E521: = บ๓รๆะ่าชสืึ"
-
-#: ../eval.c:7503
-#, fuzzy
-msgid "add() argument"
-msgstr "-c ฒฮส"
-
-#: ../eval.c:7907
-msgid "E699: Too many arguments"
-msgstr "E699: ฒฮสนถเ"
-
-#: ../eval.c:8073
-msgid "E785: complete() can only be used in Insert mode"
-msgstr "E785: complete() ึปฤิฺฒๅศ๋ฤฃสฝึะสนำร"
-
-#: ../eval.c:8156
-msgid "&Ok"
-msgstr "ศทถจ(&O)"
-
-#: ../eval.c:8676
-#, c-format
-msgid "E737: Key already exists: %s"
-msgstr "E737: ผาัดๆิฺ: %s"
-
-#: ../eval.c:8692
-#, fuzzy
-msgid "extend() argument"
-msgstr "--cmd ฒฮส"
-
-#: ../eval.c:8915
-#, fuzzy
-msgid "map() argument"
-msgstr "-c ฒฮส"
-
-#: ../eval.c:8916
-#, fuzzy
-msgid "filter() argument"
-msgstr "-c ฒฮส"
-
-#: ../eval.c:9229
-#, c-format
-msgid "+-%s%3ld lines: "
-msgstr "+-%s%3ld ะะ: "
-
-#: ../eval.c:9291
-#, c-format
-msgid "E700: Unknown function: %s"
-msgstr "E700: ฮดึชตฤบฏส: %s"
-
-#: ../eval.c:10729
-msgid "called inputrestore() more often than inputsave()"
-msgstr "inputrestore() ตฤต๗ำรดฮสถเำฺ inputsave()"
-
-#: ../eval.c:10771
-#, fuzzy
-msgid "insert() argument"
-msgstr "-c ฒฮส"
-
-#: ../eval.c:10841
-msgid "E786: Range not allowed"
-msgstr "E786: ฒปิสะํตฤทถฮง"
-
-#: ../eval.c:11140
-msgid "E701: Invalid type for len()"
-msgstr "E701: len() ตฤภเะอฮะง"
-
-#: ../eval.c:11980
-msgid "E726: Stride is zero"
-msgstr "E726: ฒฝณคฮชมใ"
-
-#: ../eval.c:11982
-msgid "E727: Start past end"
-msgstr "E727: ฦ๐สผึติฺึีึนึตบ๓"
-
-#: ../eval.c:12024 ../eval.c:15297
-msgid "<empty>"
-msgstr "<ฟี>"
-
-#: ../eval.c:12282
-#, fuzzy
-msgid "remove() argument"
-msgstr "--cmd ฒฮส"
-
-#: ../eval.c:12466
-msgid "E655: Too many symbolic links (cycle?)"
-msgstr "E655: ท๛บลมฌฝำนถเ(ัญปทฃฟ)"
-
-#: ../eval.c:12593
-#, fuzzy
-msgid "reverse() argument"
-msgstr "-c ฒฮส"
-
-#: ../eval.c:13721
-#, fuzzy
-msgid "sort() argument"
-msgstr "-c ฒฮส"
-
-#: ../eval.c:13721
-#, fuzzy
-msgid "uniq() argument"
-msgstr "-c ฒฮส"
-
-#: ../eval.c:13776
-msgid "E702: Sort compare function failed"
-msgstr "E702: Sort ฑศฝฯบฏสสงฐ"
-
-#: ../eval.c:13806
-#, fuzzy
-msgid "E882: Uniq compare function failed"
-msgstr "E702: Sort ฑศฝฯบฏสสงฐ"
-
-#: ../eval.c:14085
-msgid "(Invalid)"
-msgstr "(ฮะง)"
-
-#: ../eval.c:14590
-msgid "E677: Error writing temp file"
-msgstr "E677: ะดมูสฑฮฤผณ๖ดํ"
-
-#: ../eval.c:16159
-#, fuzzy
-msgid "E805: Using a Float as a Number"
-msgstr "E745: ฝซ List ื๗สืึสนำร"
-
-#: ../eval.c:16162
-msgid "E703: Using a Funcref as a Number"
-msgstr "E703: ฝซ Funcref ื๗สืึสนำร"
-
-#: ../eval.c:16170
-msgid "E745: Using a List as a Number"
-msgstr "E745: ฝซ List ื๗สืึสนำร"
-
-#: ../eval.c:16173
-msgid "E728: Using a Dictionary as a Number"
-msgstr "E728: ฝซ Dictionary ื๗สืึสนำร"
-
-#: ../eval.c:16259
-msgid "E729: using Funcref as a String"
-msgstr "E729: ฝซ Funcref ื๗ String สนำร"
-
-#: ../eval.c:16262
-msgid "E730: using List as a String"
-msgstr "E730: ฝซ List ื๗ String สนำร"
-
-#: ../eval.c:16265
-msgid "E731: using Dictionary as a String"
-msgstr "E731: ฝซ Dictionary ื๗ String สนำร"
-
-#: ../eval.c:16619
-#, c-format
-msgid "E706: Variable type mismatch for: %s"
-msgstr "E706: ฑไมฟภเะอฒปฦฅลไ: %s"
-
-#: ../eval.c:16705
-#, fuzzy, c-format
-msgid "E795: Cannot delete variable %s"
-msgstr "E738: ฮทจมะณ๖ %s ตฤฑไมฟ"
-
-#: ../eval.c:16724
-#, c-format
-msgid "E704: Funcref variable name must start with a capital: %s"
-msgstr "E704: Funcref ฑไมฟร๛ฑุะ๋าิด๓ะดืึฤธฟชอท: %s"
-
-#: ../eval.c:16732
-#, c-format
-msgid "E705: Variable name conflicts with existing function: %s"
-msgstr "E705: ฑไมฟร๛ำ๋าัำะบฏสร๛ณๅอป: %s"
-
-#: ../eval.c:16763
-#, c-format
-msgid "E741: Value is locked: %s"
-msgstr "E741: ึตาัห๘ถจ: %s"
-
-#: ../eval.c:16764 ../eval.c:16769 ../message.c:1839
-msgid "Unknown"
-msgstr "ฮดึช"
-
-#: ../eval.c:16768
-#, c-format
-msgid "E742: Cannot change value of %s"
-msgstr "E742: ฮทจธฤฑไ %s ตฤึต"
-
-#: ../eval.c:16838
-msgid "E698: variable nested too deep for making a copy"
-msgstr "E698: ฑไมฟวถฬืนษ๎ฮทจธดึฦ"
-
-#: ../eval.c:17249
-#, c-format
-msgid "E123: Undefined function: %s"
-msgstr "E123: บฏส %s ษะฮดถจาๅ"
-
-#: ../eval.c:17260
-#, c-format
-msgid "E124: Missing '(': %s"
-msgstr "E124: ศฑษู '(': %s"
-
-#: ../eval.c:17293
-#, fuzzy
-msgid "E862: Cannot use g: here"
-msgstr "E284: ฒปฤษ่ถจ IC ึต"
-
-#: ../eval.c:17312
-#, c-format
-msgid "E125: Illegal argument: %s"
-msgstr "E125: ฮะงตฤฒฮส: %s"
-
-#: ../eval.c:17323
-#, fuzzy, c-format
-msgid "E853: Duplicate argument name: %s"
-msgstr "E125: ฮะงตฤฒฮส: %s"
-
-#: ../eval.c:17416
-msgid "E126: Missing :endfunction"
-msgstr "E126: ศฑษู :endfunction"
-
-#: ../eval.c:17537
-#, fuzzy, c-format
-msgid "E707: Function name conflicts with variable: %s"
-msgstr "E746: บฏสร๛ำ๋ฝลฑพฮฤผร๛ฒปฦฅลไ: %s"
-
-#: ../eval.c:17549
-#, c-format
-msgid "E127: Cannot redefine function %s: It is in use"
-msgstr "E127: บฏส %s ีิฺสนำรึะฃฌฒปฤึุะยถจาๅ"
-
-#: ../eval.c:17604
-#, c-format
-msgid "E746: Function name does not match script file name: %s"
-msgstr "E746: บฏสร๛ำ๋ฝลฑพฮฤผร๛ฒปฦฅลไ: %s"
-
-#: ../eval.c:17716
-msgid "E129: Function name required"
-msgstr "E129: ะ่าชบฏสร๛"
-
-#: ../eval.c:17824
-#, fuzzy, c-format
-msgid "E128: Function name must start with a capital or \"s:\": %s"
-msgstr "E128: บฏสร๛ฑุะ๋าิด๓ะดืึฤธฟชอทป๒ี฿ฐบฌรฐบล: %s"
-
-#: ../eval.c:17833
-#, fuzzy, c-format
-msgid "E884: Function name cannot contain a colon: %s"
-msgstr "E128: บฏสร๛ฑุะ๋าิด๓ะดืึฤธฟชอทป๒ี฿ฐบฌรฐบล: %s"
-
-#: ../eval.c:18336
-#, c-format
-msgid "E131: Cannot delete function %s: It is in use"
-msgstr "E131: ฮทจษพณบฏส %s: ีิฺสนำรึะ"
-
-#: ../eval.c:18441
-msgid "E132: Function call depth is higher than 'maxfuncdepth'"
-msgstr "E132: บฏสต๗ำรษ๎ถศณฌณ๖ 'maxfuncdepth'"
-
-#: ../eval.c:18568
-#, c-format
-msgid "calling %s"
-msgstr "ต๗ำร %s"
-
-#: ../eval.c:18651
-#, c-format
-msgid "%s aborted"
-msgstr "%s าัึะึน"
-
-#: ../eval.c:18653
-#, c-format
-msgid "%s returning #%<PRId64>"
-msgstr "%s ทตปุ #%<PRId64> "
-
-#: ../eval.c:18670
-#, c-format
-msgid "%s returning %s"
-msgstr "%s ทตปุ %s"
-
-#: ../eval.c:18691 ../ex_cmds2.c:2695
-#, c-format
-msgid "continuing in %s"
-msgstr "ิฺ %s ึะผฬะ๘"
-
-#: ../eval.c:18795
-msgid "E133: :return not inside a function"
-msgstr "E133: :return ฒปิฺบฏสึะ"
-
-#: ../eval.c:19159
-msgid ""
-"\n"
-"# global variables:\n"
-msgstr ""
-"\n"
-"# ศซพึฑไมฟ:\n"
-
-#: ../eval.c:19254
-msgid ""
-"\n"
-"\tLast set from "
-msgstr ""
-"\n"
-"\tื๎ฝะธฤำฺ "
-
-#: ../eval.c:19272
-#, fuzzy
-msgid "No old files"
-msgstr "รปำะฐบฌฮฤผ"
-
-#: ../ex_cmds.c:122
-#, c-format
-msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
-msgstr "<%s>%s%s %d, สฎม๙ฝ๘ึฦ %02x, ฐหฝ๘ึฦ %03o"
-
-#: ../ex_cmds.c:145
-#, c-format
-msgid "> %d, Hex %04x, Octal %o"
-msgstr "> %d, สฎม๙ฝ๘ึฦ %04x, ฐหฝ๘ึฦ %o"
-
-#: ../ex_cmds.c:146
-#, c-format
-msgid "> %d, Hex %08x, Octal %o"
-msgstr "> %d, สฎม๙ฝ๘ึฦ %08x, ฐหฝ๘ึฦ %o"
-
-#: ../ex_cmds.c:684
-msgid "E134: Move lines into themselves"
-msgstr "E134: ฐัะะาฦถฏตฝืิาัึะ"
-
-#: ../ex_cmds.c:747
-msgid "1 line moved"
-msgstr "าฦถฏมห 1 ะะ"
-
-#: ../ex_cmds.c:749
-#, c-format
-msgid "%<PRId64> lines moved"
-msgstr "าฦถฏมห %<PRId64> ะะ"
-
-#: ../ex_cmds.c:1175
-#, c-format
-msgid "%<PRId64> lines filtered"
-msgstr "นยหมห %<PRId64> ะะ"
-
-#: ../ex_cmds.c:1194
-msgid "E135: *Filter* Autocommands must not change current buffer"
-msgstr "E135: *Filter* ืิถฏรม๎ฒปฟษาิธฤฑไตฑวฐปบณๅว๘"
-
-#: ../ex_cmds.c:1244
-msgid "[No write since last change]\n"
-msgstr "[าัะธฤตซษะฮดฑฃดๆ]\n"
-
-# bad to translate
-#: ../ex_cmds.c:1424
-#, c-format
-msgid "%sviminfo: %s in line: "
-msgstr "%sviminfo: %s ฮปำฺะะ: "
-
-#: ../ex_cmds.c:1431
-msgid "E136: viminfo: Too many errors, skipping rest of file"
-msgstr "E136: viminfo: ดํฮ๓นถเฃฌบ๖ยิฮฤผตฤสฃำเฒฟทึ"
-
-#: ../ex_cmds.c:1458
-#, c-format
-msgid "Reading viminfo file \"%s\"%s%s%s"
-msgstr "ถมศก viminfo ฮฤผ \"%s\"%s%s%s"
-
-#: ../ex_cmds.c:1460
-msgid " info"
-msgstr " ะลฯข"
-
-#: ../ex_cmds.c:1461
-msgid " marks"
-msgstr " ฑ๊ผว"
-
-#: ../ex_cmds.c:1462
-#, fuzzy
-msgid " oldfiles"
-msgstr "รปำะฐบฌฮฤผ"
-
-#: ../ex_cmds.c:1463
-msgid " FAILED"
-msgstr " สงฐ"
-
-#. avoid a wait_return for this message, it's annoying
-#: ../ex_cmds.c:1541
-#, c-format
-msgid "E137: Viminfo file is not writable: %s"
-msgstr "E137: Viminfo ฮฤผฒปฟษะดศ๋: %s"
-
-#: ../ex_cmds.c:1626
-#, c-format
-msgid "E138: Can't write viminfo file %s!"
-msgstr "E138: ฮทจะดศ๋ viminfo ฮฤผ %sฃก"
-
-#: ../ex_cmds.c:1635
-#, c-format
-msgid "Writing viminfo file \"%s\""
-msgstr "ะดศ๋ viminfo ฮฤผ \"%s\""
-
-# do not translate to avoid writing Chinese in files
-#. Write the info:
-#: ../ex_cmds.c:1720
-#, fuzzy, c-format
-msgid "# This viminfo file was generated by Vim %s.\n"
-msgstr "# ีโธ๖ viminfo ฮฤผสวำษ Vim %s ษ๚ณษตฤกฃ\n"
-
-# do not translate to avoid writing Chinese in files
-#: ../ex_cmds.c:1722
-#, fuzzy
-msgid ""
-"# You may edit it if you're careful!\n"
-"\n"
-msgstr ""
-"# ศ็น๛าชืิะะะธฤว๋ฬุฑ๐ะกะฤฃก\n"
-"\n"
-
-# do not translate to avoid writing Chinese in files
-#: ../ex_cmds.c:1723
-#, fuzzy
-msgid "# Value of 'encoding' when this file was written\n"
-msgstr "# 'encoding' ิฺดหฮฤผฝจมขสฑตฤึต\n"
-
-#: ../ex_cmds.c:1800
-msgid "Illegal starting char"
-msgstr "ฮะงตฤฦ๔ถฏืึท๛"
-
-#: ../ex_cmds.c:2162
-msgid "Write partial file?"
-msgstr "าชะดศ๋ฒฟทึฮฤผย๐ฃฟ"
-
-#: ../ex_cmds.c:2166
-msgid "E140: Use ! to write partial buffer"
-msgstr "E140: ว๋สนำร ! ภดะดศ๋ฒฟทึปบณๅว๘"
-
-#: ../ex_cmds.c:2281
-#, c-format
-msgid "Overwrite existing file \"%s\"?"
-msgstr "ธฒธวาัดๆิฺตฤฮฤผ \"%s\" ย๐ฃฟ"
-
-#: ../ex_cmds.c:2317
-#, c-format
-msgid "Swap file \"%s\" exists, overwrite anyway?"
-msgstr "ฝปปปฮฤผ \"%s\" าัดๆิฺฃฌศทสตาชธฒธวย๐ฃฟ"
-
-#: ../ex_cmds.c:2326
-#, c-format
-msgid "E768: Swap file exists: %s (:silent! overrides)"
-msgstr "E768: ฝปปปฮฤผาัดๆิฺ: %s (:silent! วฟึฦึดะะ)"
-
-#: ../ex_cmds.c:2381
-#, c-format
-msgid "E141: No file name for buffer %<PRId64>"
-msgstr "E141: ปบณๅว๘ %<PRId64> รปำะฮฤผร๛"
-
-#: ../ex_cmds.c:2412
-msgid "E142: File not written: Writing is disabled by 'write' option"
-msgstr "E142: ฮฤผฮดะดศ๋: ะดศ๋ฑป 'write' ักฯ๎ฝ๛ำร"
-
-#: ../ex_cmds.c:2434
-#, c-format
-msgid ""
-"'readonly' option is set for \"%s\".\n"
-"Do you wish to write anyway?"
-msgstr ""
-"\"%s\" าัษ่ถจ 'readonly' ักฯ๎กฃ\n"
-"ศทสตาชธฒธวย๐ฃฟ"
-
-#: ../ex_cmds.c:2439
-#, c-format
-msgid ""
-"File permissions of \"%s\" are read-only.\n"
-"It may still be possible to write it.\n"
-"Do you wish to try?"
-msgstr ""
-
-#: ../ex_cmds.c:2451
-#, fuzzy, c-format
-msgid "E505: \"%s\" is read-only (add ! to override)"
-msgstr "ึปถม (ว๋ผำ ! วฟึฦึดะะ)"
-
-#: ../ex_cmds.c:3120
-#, c-format
-msgid "E143: Autocommands unexpectedly deleted new buffer %s"
-msgstr "E143: ืิถฏรม๎าโอโตุษพณมหะยปบณๅว๘ %s"
-
-#: ../ex_cmds.c:3313
-msgid "E144: non-numeric argument to :z"
-msgstr "E144: :z ฒปฝำสทวสืึตฤฒฮส"
-
-#: ../ex_cmds.c:3404
-msgid "E145: Shell commands not allowed in rvim"
-msgstr "E145: rvim ึะฝ๛ึนสนำร shell รม๎"
-
-#: ../ex_cmds.c:3498
-msgid "E146: Regular expressions can't be delimited by letters"
-msgstr "E146: ีิ๒ฑํด๏สฝฒปฤำรืึฤธื๗ทึฝ็"
-
-#: ../ex_cmds.c:3964
-#, c-format
-msgid "replace with %s (y/n/a/q/l/^E/^Y)?"
-msgstr "ฬๆปปฮช %s (y/n/a/q/l/^E/^Y)ฃฟ"
-
-#: ../ex_cmds.c:4379
-msgid "(Interrupted) "
-msgstr "(าัึะถฯ) "
-
-#: ../ex_cmds.c:4384
-msgid "1 match"
-msgstr "1 ธ๖ฦฅลไฃฌ"
-
-#: ../ex_cmds.c:4384
-msgid "1 substitution"
-msgstr "1 ดฮฬๆปปฃฌ"
-
-#: ../ex_cmds.c:4387
-#, c-format
-msgid "%<PRId64> matches"
-msgstr "%<PRId64> ธ๖ฦฅลไฃฌ"
-
-#: ../ex_cmds.c:4388
-#, c-format
-msgid "%<PRId64> substitutions"
-msgstr "%<PRId64> ดฮฬๆปปฃฌ"
-
-#: ../ex_cmds.c:4392
-msgid " on 1 line"
-msgstr "นฒ 1 ะะ"
-
-#: ../ex_cmds.c:4395
-#, c-format
-msgid " on %<PRId64> lines"
-msgstr "นฒ %<PRId64> ะะ"
-
-#: ../ex_cmds.c:4438
-msgid "E147: Cannot do :global recursive"
-msgstr "E147: :global ฒปฤตน้ึดะะ"
-
-#: ../ex_cmds.c:4467
-msgid "E148: Regular expression missing from global"
-msgstr "E148: global ศฑษูีิ๒ฑํด๏สฝ"
-
-#: ../ex_cmds.c:4508
-#, c-format
-msgid "Pattern found in every line: %s"
-msgstr "รฟะะถผฦฅลไฑํด๏สฝ: %s"
-
-#: ../ex_cmds.c:4510
-#, fuzzy, c-format
-msgid "Pattern not found: %s"
-msgstr "ีาฒปตฝฤฃสฝ"
-
-# do not translate to avoid writing Chinese in files
-#: ../ex_cmds.c:4587
-#, fuzzy
-msgid ""
-"\n"
-"# Last Substitute String:\n"
-"$"
-msgstr ""
-"\n"
-"# ื๎ฝตฤฬๆปปืึท๛ดฎ:\n"
-"$"
-
-#: ../ex_cmds.c:4679
-msgid "E478: Don't panic!"
-msgstr "E478: ฒปาชปลฃก"
-
-#: ../ex_cmds.c:4717
-#, c-format
-msgid "E661: Sorry, no '%s' help for %s"
-msgstr "E661: ฑงวธฃฌรปำะ '%s' ตฤ %s ตฤหตร๗"
-
-#: ../ex_cmds.c:4719
-#, c-format
-msgid "E149: Sorry, no help for %s"
-msgstr "E149: ฑงวธฃฌรปำะ %s ตฤหตร๗"
-
-#: ../ex_cmds.c:4751
-#, c-format
-msgid "Sorry, help file \"%s\" not found"
-msgstr "ฑงวธฃฌีาฒปตฝฐ๏ึ๚ฮฤผ \"%s\""
-
-#: ../ex_cmds.c:5323
-#, c-format
-msgid "E150: Not a directory: %s"
-msgstr "E150: ฒปสวฤฟยผ: %s"
-
-#: ../ex_cmds.c:5446
-#, c-format
-msgid "E152: Cannot open %s for writing"
-msgstr "E152: ฮทจด๒ฟชฒขะดศ๋ %s"
-
-#: ../ex_cmds.c:5471
-#, c-format
-msgid "E153: Unable to open %s for reading"
-msgstr "E153: ฮทจด๒ฟชฒขถมศก %s"
-
-#: ../ex_cmds.c:5500
-#, c-format
-msgid "E670: Mix of help file encodings within a language: %s"
-msgstr "E670: ิฺาปึึำ๏ัิึะป์บฯมหถเึึฐ๏ึ๚ฮฤผฑเย๋: %s"
-
-#: ../ex_cmds.c:5565
-#, c-format
-msgid "E154: Duplicate tag \"%s\" in file %s/%s"
-msgstr "E154: Tag \"%s\" ิฺฮฤผ %s/%s ึะึุธดณ๖ฯึ"
-
-#: ../ex_cmds.c:5687
-#, c-format
-msgid "E160: Unknown sign command: %s"
-msgstr "E160: ฮดึชตฤ sign รม๎: %s"
-
-#: ../ex_cmds.c:5704
-msgid "E156: Missing sign name"
-msgstr "E156: ศฑษู sign ร๛ณฦ"
-
-#: ../ex_cmds.c:5746
-msgid "E612: Too many signs defined"
-msgstr "E612: Signs ถจาๅนถเ"
-
-#: ../ex_cmds.c:5813
-#, c-format
-msgid "E239: Invalid sign text: %s"
-msgstr "E239: ฮะงตฤ sign ฮฤืึ: %s"
-
-#: ../ex_cmds.c:5844 ../ex_cmds.c:6035
-#, c-format
-msgid "E155: Unknown sign: %s"
-msgstr "E155: ฮดึชตฤ sign: %s"
-
-#: ../ex_cmds.c:5877
-msgid "E159: Missing sign number"
-msgstr "E159: ศฑษู sign บล"
-
-#: ../ex_cmds.c:5971
-#, c-format
-msgid "E158: Invalid buffer name: %s"
-msgstr "E158: ฮะงตฤปบณๅว๘ร๛: %s"
-
-#: ../ex_cmds.c:6008
-#, c-format
-msgid "E157: Invalid sign ID: %<PRId64>"
-msgstr "E157: ฮะงตฤ sign ID: %<PRId64>"
-
-#: ../ex_cmds.c:6066
-msgid " (not supported)"
-msgstr " (ฒปึงณึ)"
-
-#: ../ex_cmds.c:6169
-msgid "[Deleted]"
-msgstr "[าัษพณ]"
-
-#: ../ex_cmds2.c:139
-msgid "Entering Debug mode. Type \"cont\" to continue."
-msgstr "ฝ๘ศ๋ต๗สิฤฃสฝกฃสไศ๋ \"cont\" ผฬะ๘ิหะะกฃ"
-
-#: ../ex_cmds2.c:143 ../ex_docmd.c:759
-#, c-format
-msgid "line %<PRId64>: %s"
-msgstr "ตฺ %<PRId64> ะะ: %s"
-
-#: ../ex_cmds2.c:145
-#, c-format
-msgid "cmd: %s"
-msgstr "รม๎: %s"
-
-#: ../ex_cmds2.c:322
-#, c-format
-msgid "Breakpoint in \"%s%s\" line %<PRId64>"
-msgstr "ถฯตใ \"%s%s\" ตฺ %<PRId64> ะะ"
-
-#: ../ex_cmds2.c:581
-#, c-format
-msgid "E161: Breakpoint not found: %s"
-msgstr "E161: ีาฒปตฝถฯตใ: %s"
-
-#: ../ex_cmds2.c:611
-msgid "No breakpoints defined"
-msgstr "รปำะถจาๅถฯตใ"
-
-#: ../ex_cmds2.c:617
-#, c-format
-msgid "%3d %s %s line %<PRId64>"
-msgstr "%3d %s %s ตฺ %<PRId64> ะะ"
-
-#: ../ex_cmds2.c:942
-#, fuzzy
-msgid "E750: First use \":profile start {fname}\""
-msgstr "E750: ว๋ฯศสนำร :profile start <fname>"
-
-#: ../ex_cmds2.c:1269
-#, c-format
-msgid "Save changes to \"%s\"?"
-msgstr "ฝซธฤฑไฑฃดๆตฝ \"%s\" ย๐ฃฟ"
-
-#: ../ex_cmds2.c:1271 ../ex_docmd.c:8851
-msgid "Untitled"
-msgstr "ฮดรร๛"
-
-#: ../ex_cmds2.c:1421
-#, c-format
-msgid "E162: No write since last change for buffer \"%s\""
-msgstr "E162: ปบณๅว๘ \"%s\" าัะธฤตซษะฮดฑฃดๆ"
-
-#: ../ex_cmds2.c:1480
-msgid "Warning: Entered other buffer unexpectedly (check autocommands)"
-msgstr "พฏธๆ: าโอโตุฝ๘ศ๋มหฦไหปบณๅว๘ (ว๋ผ์ฒ้ืิถฏรม๎)"
-
-#: ../ex_cmds2.c:1826
-msgid "E163: There is only one file to edit"
-msgstr "E163: ึปำะาปธ๖ฮฤผฟษฑเผญ"
-
-#: ../ex_cmds2.c:1828
-msgid "E164: Cannot go before first file"
-msgstr "E164: ฮทจวะปปฃฌาัสวตฺาปธ๖ฮฤผ"
-
-#: ../ex_cmds2.c:1830
-msgid "E165: Cannot go beyond last file"
-msgstr "E165: ฮทจวะปปฃฌาัสวื๎บ๓าปธ๖ฮฤผ"
-
-#: ../ex_cmds2.c:2175
-#, c-format
-msgid "E666: compiler not supported: %s"
-msgstr "E666: ฒปึงณึฑเา๋ฦ๗: %s"
-
-#: ../ex_cmds2.c:2257
-#, c-format
-msgid "Searching for \"%s\" in \"%s\""
-msgstr "ีิฺฒ้ีา \"%s\"ฃฌิฺ \"%s\" ึะ"
-
-#: ../ex_cmds2.c:2284
-#, c-format
-msgid "Searching for \"%s\""
-msgstr "ีิฺฒ้ีา \"%s\""
-
-#: ../ex_cmds2.c:2307
-#, c-format
-msgid "not found in 'runtimepath': \"%s\""
-msgstr "ิฺ 'runtimepath' ึะีาฒปตฝ \"%s\""
-
-#: ../ex_cmds2.c:2472
-#, c-format
-msgid "Cannot source a directory: \"%s\""
-msgstr "ฒปฤึดะะฤฟยผ: \"%s\""
-
-#: ../ex_cmds2.c:2518
-#, c-format
-msgid "could not source \"%s\""
-msgstr "ฒปฤึดะะ \"%s\""
-
-#: ../ex_cmds2.c:2520
-#, c-format
-msgid "line %<PRId64>: could not source \"%s\""
-msgstr "ตฺ %<PRId64> ะะ: ฒปฤึดะะ \"%s\""
-
-#: ../ex_cmds2.c:2535
-#, c-format
-msgid "sourcing \"%s\""
-msgstr "ึดะะ \"%s\""
-
-#: ../ex_cmds2.c:2537
-#, c-format
-msgid "line %<PRId64>: sourcing \"%s\""
-msgstr "ตฺ %<PRId64> ะะ: ึดะะ \"%s\""
-
-#: ../ex_cmds2.c:2693
-#, c-format
-msgid "finished sourcing %s"
-msgstr "ฝแส๘ึดะะ %s"
-
-#: ../ex_cmds2.c:2765
-msgid "modeline"
-msgstr "modeline"
-
-#: ../ex_cmds2.c:2767
-msgid "--cmd argument"
-msgstr "--cmd ฒฮส"
-
-#: ../ex_cmds2.c:2769
-msgid "-c argument"
-msgstr "-c ฒฮส"
-
-#: ../ex_cmds2.c:2771
-msgid "environment variable"
-msgstr "ปทพณฑไมฟ"
-
-#: ../ex_cmds2.c:2773
-msgid "error handler"
-msgstr ""
-
-#: ../ex_cmds2.c:3020
-msgid "W15: Warning: Wrong line separator, ^M may be missing"
-msgstr "W15: พฏธๆ: ดํฮ๓ตฤะะทึธ๔ท๛ฃฌฟษฤสวษูมห ^M"
-
-#: ../ex_cmds2.c:3139
-msgid "E167: :scriptencoding used outside of a sourced file"
-msgstr "E167: ิฺฝลฑพฮฤผอโสนำรมห :scriptencoding"
-
-#: ../ex_cmds2.c:3166
-msgid "E168: :finish used outside of a sourced file"
-msgstr "E168: ิฺฝลฑพฮฤผอโสนำรมห :finish"
-
-#: ../ex_cmds2.c:3389
-#, c-format
-msgid "Current %slanguage: \"%s\""
-msgstr "ตฑวฐตฤ %sำ๏ัิ: \"%s\""
-
-#: ../ex_cmds2.c:3404
-#, c-format
-msgid "E197: Cannot set language to \"%s\""
-msgstr "E197: ฒปฤษ่ถจำ๏ัิฮช \"%s\""
-
-#. don't redisplay the window
-#. don't wait for return
-#: ../ex_docmd.c:387
-msgid "Entering Ex mode. Type \"visual\" to go to Normal mode."
-msgstr "ฝ๘ศ๋ Ex ฤฃสฝกฃสไศ๋ \"visual\" ปุตฝีณฃฤฃสฝกฃ"
-
-#: ../ex_docmd.c:428
-msgid "E501: At end-of-file"
-msgstr "E501: าัตฝฮฤผฤฉฮฒ"
-
-#: ../ex_docmd.c:513
-msgid "E169: Command too recursive"
-msgstr "E169: รม๎ตน้ฒใสนถเ"
-
-#: ../ex_docmd.c:1006
-#, c-format
-msgid "E605: Exception not caught: %s"
-msgstr "E605: า์ณฃรปำะฑปฒถป๑: %s"
-
-#: ../ex_docmd.c:1085
-msgid "End of sourced file"
-msgstr "ฝลฑพฮฤผฝแส๘"
-
-#: ../ex_docmd.c:1086
-msgid "End of function"
-msgstr "บฏสฝแส๘"
-
-#: ../ex_docmd.c:1628
-msgid "E464: Ambiguous use of user-defined command"
-msgstr "E464: ฒปศทถจตฤำรปงืิถจาๅรม๎"
-
-#: ../ex_docmd.c:1638
-msgid "E492: Not an editor command"
-msgstr "E492: ฒปสวฑเผญฦ๗ตฤรม๎"
-
-#: ../ex_docmd.c:1729
-msgid "E493: Backwards range given"
-msgstr "E493: สนำรมหฤๆฯ๒ตฤทถฮง"
-
-#: ../ex_docmd.c:1733
-msgid "Backwards range given, OK to swap"
-msgstr "สนำรมหฤๆฯ๒ตฤทถฮงฃฌศทถจฝปปปย๐"
-
-#. append
-#. typed wrong
-#: ../ex_docmd.c:1787
-msgid "E494: Use w or w>>"
-msgstr "E494: ว๋สนำร w ป๒ w>>"
-
-#: ../ex_docmd.c:3454
-msgid "E319: The command is not available in this version"
-msgstr "E319: ฑงวธฃฌรม๎ิฺดหฐๆฑพึะฒปฟษำร"
-
-#: ../ex_docmd.c:3752
-msgid "E172: Only one file name allowed"
-msgstr "E172: ึปิสะําปธ๖ฮฤผร๛"
-
-#: ../ex_docmd.c:4238
-msgid "1 more file to edit. Quit anyway?"
-msgstr "ปนำะ 1 ธ๖ฮฤผฮดฑเผญกฃศทสตาชอหณ๖ย๐ฃฟ"
-
-#: ../ex_docmd.c:4242
-#, c-format
-msgid "%d more files to edit. Quit anyway?"
-msgstr "ปนำะ %d ธ๖ฮฤผฮดฑเผญกฃศทสตาชอหณ๖ย๐ฃฟ"
-
-#: ../ex_docmd.c:4248
-msgid "E173: 1 more file to edit"
-msgstr "E173: ปนำะ 1 ธ๖ฮฤผฮดฑเผญ"
-
-#: ../ex_docmd.c:4250
-#, c-format
-msgid "E173: %<PRId64> more files to edit"
-msgstr "E173: ปนำะ %<PRId64> ธ๖ฮฤผฮดฑเผญ"
-
-#: ../ex_docmd.c:4320
-msgid "E174: Command already exists: add ! to replace it"
-msgstr "E174: รม๎าัดๆิฺ: ว๋ผำ ! วฟึฦฬๆปป"
-
-#: ../ex_docmd.c:4432
-msgid ""
-"\n"
-" Name Args Range Complete Definition"
-msgstr ""
-"\n"
-" ร๛ณฦ ฒฮส ทถฮง ฒนศซ ถจาๅ "
-
-#: ../ex_docmd.c:4516
-msgid "No user-defined commands found"
-msgstr "ีาฒปตฝำรปงืิถจาๅรม๎"
-
-#: ../ex_docmd.c:4538
-msgid "E175: No attribute specified"
-msgstr "E175: รปำะึธถจส๔ะิ"
-
-#: ../ex_docmd.c:4583
-msgid "E176: Invalid number of arguments"
-msgstr "E176: ฮะงตฤฒฮสธ๖ส"
-
-#: ../ex_docmd.c:4594
-msgid "E177: Count cannot be specified twice"
-msgstr "E177: ฒปฤึธถจมฝดฮผฦส"
-
-#: ../ex_docmd.c:4603
-msgid "E178: Invalid default value for count"
-msgstr "E178: ฮะงตฤผฦสฤฌศฯึต"
-
-#: ../ex_docmd.c:4625
-msgid "E179: argument required for -complete"
-msgstr "E179: -complete ะ่าชฒฮส"
-
-#: ../ex_docmd.c:4635
-#, c-format
-msgid "E181: Invalid attribute: %s"
-msgstr "E181: ฮะงตฤส๔ะิ: %s"
-
-#: ../ex_docmd.c:4678
-msgid "E182: Invalid command name"
-msgstr "E182: ฮะงตฤรม๎ร๛"
-
-#: ../ex_docmd.c:4691
-msgid "E183: User defined commands must start with an uppercase letter"
-msgstr "E183: ำรปงืิถจาๅรม๎ฑุะ๋าิด๓ะดืึฤธฟชอท"
-
-#: ../ex_docmd.c:4696
-#, fuzzy
-msgid "E841: Reserved name, cannot be used for user defined command"
-msgstr "E464: ฒปศทถจตฤำรปงืิถจาๅรม๎"
-
-#: ../ex_docmd.c:4751
-#, c-format
-msgid "E184: No such user-defined command: %s"
-msgstr "E184: รปำะีโธ๖ำรปงืิถจาๅรม๎: %s"
-
-#: ../ex_docmd.c:5219
-#, c-format
-msgid "E180: Invalid complete value: %s"
-msgstr "E180: ฮะงตฤฒนศซภเะอ: %s"
-
-#: ../ex_docmd.c:5225
-msgid "E468: Completion argument only allowed for custom completion"
-msgstr "E468: ึปำะ custom ฒนศซฒลิสะํฒฮส"
-
-#: ../ex_docmd.c:5231
-msgid "E467: Custom completion requires a function argument"
-msgstr "E467: Custom ฒนศซะ่าชาปธ๖บฏสฒฮส"
-
-#: ../ex_docmd.c:5257
-#, fuzzy, c-format
-msgid "E185: Cannot find color scheme '%s'"
-msgstr "E185: ีาฒปตฝลไษซทฝฐธ %s"
-
-#: ../ex_docmd.c:5263
-msgid "Greetings, Vim user!"
-msgstr "ฤ๚บรฃฌVim ำรปงฃก"
-
-#: ../ex_docmd.c:5431
-msgid "E784: Cannot close last tab page"
-msgstr "E784: ฒปฤนุฑีื๎บ๓าปธ๖ tab าณ"
-
-#: ../ex_docmd.c:5462
-msgid "Already only one tab page"
-msgstr "าัพญึปสฃาปธ๖ tab าณมห"
-
-#: ../ex_docmd.c:6004
-#, c-format
-msgid "Tab page %d"
-msgstr "Tab าณ %d"
-
-#: ../ex_docmd.c:6295
-msgid "No swap file"
-msgstr "ฮฝปปปฮฤผ"
-
-#: ../ex_docmd.c:6478
-msgid "E747: Cannot change directory, buffer is modified (add ! to override)"
-msgstr "E747: ฒปฤธฤฑไฤฟยผฃฌปบณๅว๘าัะธฤ (ว๋ผำ ! วฟึฦึดะะ)"
-
-#: ../ex_docmd.c:6485
-msgid "E186: No previous directory"
-msgstr "E186: วฐาปธ๖ฤฟยผฒปดๆิฺ"
-
-#: ../ex_docmd.c:6530
-msgid "E187: Unknown"
-msgstr "E187: ฮดึช"
-
-#: ../ex_docmd.c:6610
-msgid "E465: :winsize requires two number arguments"
-msgstr "E465: :winsize ะ่าชมฝธ๖สืึฒฮส"
-
-#: ../ex_docmd.c:6655
-msgid "E188: Obtaining window position not implemented for this platform"
-msgstr "E188: ิฺดหฦฝฬจษฯฒปฤป๑ตรดฐฟฺฮปึร"
-
-#: ../ex_docmd.c:6662
-msgid "E466: :winpos requires two number arguments"
-msgstr "E466: :winpos ะ่าชมฝธ๖สืึฒฮส"
-
-#: ../ex_docmd.c:7241
-#, c-format
-msgid "E739: Cannot create directory: %s"
-msgstr "E739: ฮทจดดฝจฤฟยผ: %s"
-
-#: ../ex_docmd.c:7268
-#, c-format
-msgid "E189: \"%s\" exists (add ! to override)"
-msgstr "E189: \"%s\" าัดๆิฺ (ว๋ผำ ! วฟึฦึดะะ)"
-
-#: ../ex_docmd.c:7273
-#, c-format
-msgid "E190: Cannot open \"%s\" for writing"
-msgstr "E190: ฮทจด๒ฟชฒขะดศ๋ \"%s\""
-
-#. set mark
-#: ../ex_docmd.c:7294
-msgid "E191: Argument must be a letter or forward/backward quote"
-msgstr "E191: ฒฮสฑุะ๋สวาปธ๖ืึฤธป๒ี฿ี/ทดาบล"
-
-#: ../ex_docmd.c:7333
-msgid "E192: Recursive use of :normal too deep"
-msgstr "E192: :normal ตน้ฒใสนษ๎"
-
-#: ../ex_docmd.c:7807
-msgid "E194: No alternate file name to substitute for '#'"
-msgstr "E194: รปำะำรำฺฬๆปป '#' ตฤฝปฬๆฮฤผร๛"
-
-#: ../ex_docmd.c:7841
-msgid "E495: no autocommand file name to substitute for \"<afile>\""
-msgstr "E495: รปำะำรำฺฬๆปป \"<afile>\" ตฤืิถฏรม๎ฮฤผร๛"
-
-#: ../ex_docmd.c:7850
-msgid "E496: no autocommand buffer number to substitute for \"<abuf>\""
-msgstr "E496: รปำะำรำฺฬๆปป \"<abuf>\" ตฤืิถฏรม๎ปบณๅว๘บล"
-
-#: ../ex_docmd.c:7861
-msgid "E497: no autocommand match name to substitute for \"<amatch>\""
-msgstr "E497: รปำะำรำฺฬๆปป \"<amatch>\" ตฤืิถฏรม๎ฦฅลไร๛"
-
-#: ../ex_docmd.c:7870
-msgid "E498: no :source file name to substitute for \"<sfile>\""
-msgstr "E498: รปำะำรำฺฬๆปป \"<sfile>\" ตฤ :source ฮฤผร๛"
-
-#: ../ex_docmd.c:7876
-#, fuzzy
-msgid "E842: no line number to use for \"<slnum>\""
-msgstr "E498: รปำะำรำฺฬๆปป \"<sfile>\" ตฤ :source ฮฤผร๛"
-
-#: ../ex_docmd.c:7903
-#, fuzzy, c-format
-msgid "E499: Empty file name for '%' or '#', only works with \":p:h\""
-msgstr "E499: '%' ป๒ '#' ฮชฟีฮฤผร๛ฃฌึปฤำรำฺ \":p:h\""
-
-#: ../ex_docmd.c:7905
-msgid "E500: Evaluates to an empty string"
-msgstr "E500: ฝแน๛ฮชฟีืึท๛ดฎ"
-
-#: ../ex_docmd.c:8838
-msgid "E195: Cannot open viminfo file for reading"
-msgstr "E195: ฮทจด๒ฟชฒขถมศก viminfo ฮฤผ"
-
-#: ../ex_eval.c:464
-msgid "E608: Cannot :throw exceptions with 'Vim' prefix"
-msgstr "E608: ฒปฤ :throw วฐืบฮช 'Vim' ตฤา์ณฃ"
-
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:496
-#, c-format
-msgid "Exception thrown: %s"
-msgstr "ลืณ๖า์ณฃ: %s"
-
-#: ../ex_eval.c:545
-#, c-format
-msgid "Exception finished: %s"
-msgstr "อ๊ณษา์ณฃ: %s"
-
-#: ../ex_eval.c:546
-#, c-format
-msgid "Exception discarded: %s"
-msgstr "ถชฦ๚า์ณฃ: %s"
-
-#: ../ex_eval.c:588 ../ex_eval.c:634
-#, c-format
-msgid "%s, line %<PRId64>"
-msgstr "%sฃฌตฺ %<PRId64> ะะ"
-
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:608
-#, c-format
-msgid "Exception caught: %s"
-msgstr "ฒถป๑า์ณฃ: %s"
-
-#: ../ex_eval.c:676
-#, c-format
-msgid "%s made pending"
-msgstr ""
-
-#: ../ex_eval.c:679
-#, fuzzy, c-format
-msgid "%s resumed"
-msgstr " าัทตปุ\n"
-
-#: ../ex_eval.c:683
-#, c-format
-msgid "%s discarded"
-msgstr ""
-
-#: ../ex_eval.c:708
-msgid "Exception"
-msgstr "า์ณฃ"
-
-#: ../ex_eval.c:713
-msgid "Error and interrupt"
-msgstr "ดํฮ๓บอึะถฯ"
-
-#: ../ex_eval.c:715
-msgid "Error"
-msgstr "ดํฮ๓"
-
-#. if (pending & CSTP_INTERRUPT)
-#: ../ex_eval.c:717
-msgid "Interrupt"
-msgstr "ึะถฯ"
-
-#: ../ex_eval.c:795
-msgid "E579: :if nesting too deep"
-msgstr "E579: :if วถฬืฒใสนษ๎"
-
-#: ../ex_eval.c:830
-msgid "E580: :endif without :if"
-msgstr "E580: :endif ศฑษูถิำฆตฤ :if"
-
-#: ../ex_eval.c:873
-msgid "E581: :else without :if"
-msgstr "E581: :else ศฑษูถิำฆตฤ :if"
-
-#: ../ex_eval.c:876
-msgid "E582: :elseif without :if"
-msgstr "E582: :elseif ศฑษูถิำฆตฤ :if"
-
-#: ../ex_eval.c:880
-msgid "E583: multiple :else"
-msgstr "E583: ถเธ๖ :else"
-
-#: ../ex_eval.c:883
-msgid "E584: :elseif after :else"
-msgstr "E584: :elseif ิฺ :else บ๓รๆ"
-
-#: ../ex_eval.c:941
-msgid "E585: :while/:for nesting too deep"
-msgstr "E585: :while/:for วถฬืฒใสนษ๎"
-
-#: ../ex_eval.c:1028
-msgid "E586: :continue without :while or :for"
-msgstr "E586: :continue ศฑษูถิำฆตฤ :while ป๒ :for"
-
-#: ../ex_eval.c:1061
-msgid "E587: :break without :while or :for"
-msgstr "E587: :break ศฑษูถิำฆตฤ :while ป๒ :for"
-
-#: ../ex_eval.c:1102
-msgid "E732: Using :endfor with :while"
-msgstr "E732: :while าิ :endfor ฝแฮฒ"
-
-#: ../ex_eval.c:1104
-msgid "E733: Using :endwhile with :for"
-msgstr "E733: :for าิ :endwhile ฝแฮฒ"
-
-#: ../ex_eval.c:1247
-msgid "E601: :try nesting too deep"
-msgstr "E601: :try วถฬืฒใสนษ๎"
-
-#: ../ex_eval.c:1317
-msgid "E603: :catch without :try"
-msgstr "E603: :catch ศฑษูถิำฆตฤ :try"
-
-#. Give up for a ":catch" after ":finally" and ignore it.
-#. * Just parse.
-#: ../ex_eval.c:1332
-msgid "E604: :catch after :finally"
-msgstr "E604: :catch ิฺ :finally บ๓รๆ"
-
-#: ../ex_eval.c:1451
-msgid "E606: :finally without :try"
-msgstr "E606: :finally ศฑษูถิำฆตฤ :try"
-
-#. Give up for a multiple ":finally" and ignore it.
-#: ../ex_eval.c:1467
-msgid "E607: multiple :finally"
-msgstr "E607: ถเธ๖ :finally"
-
-#: ../ex_eval.c:1571
-msgid "E602: :endtry without :try"
-msgstr "E602: :endtry ศฑษูถิำฆตฤ :try"
-
-#: ../ex_eval.c:2026
-msgid "E193: :endfunction not inside a function"
-msgstr "E193: :endfunction ฒปิฺบฏสฤฺ"
-
-#: ../ex_getln.c:1643
-msgid "E788: Not allowed to edit another buffer now"
-msgstr "E788: ฤฟวฐฒปิสะํฑเผญฑ๐ตฤปบณๅว๘"
-
-#: ../ex_getln.c:1656
-#, fuzzy
-msgid "E811: Not allowed to change buffer information now"
-msgstr "E788: ฤฟวฐฒปิสะํฑเผญฑ๐ตฤปบณๅว๘"
-
-#: ../ex_getln.c:3178
-msgid "tagname"
-msgstr "tag ร๛"
-
-#: ../ex_getln.c:3181
-msgid " kind file\n"
-msgstr " ภเะอ ฮฤผ\n"
-
-#: ../ex_getln.c:4799
-msgid "'history' option is zero"
-msgstr "ักฯ๎ 'history' ฮชมใ"
-
-# do not translate to avoid writing Chinese in files
-#: ../ex_getln.c:5046
-#, fuzzy, c-format
-msgid ""
-"\n"
-"# %s History (newest to oldest):\n"
-msgstr ""
-"\n"
-"# %s ภ๚สทผวยผ (ดำะยตฝพษ):\n"
-
-# do not translate to avoid writing Chinese in files
-#: ../ex_getln.c:5047
-#, fuzzy
-msgid "Command Line"
-msgstr "รม๎ะะ"
-
-# do not translate to avoid writing Chinese in files
-#: ../ex_getln.c:5048
-#, fuzzy
-msgid "Search String"
-msgstr "ฒ้ีาืึท๛ดฎ"
-
-# do not translate to avoid writing Chinese in files
-#: ../ex_getln.c:5049
-#, fuzzy
-msgid "Expression"
-msgstr "ฑํด๏สฝ"
-
-# do not translate to avoid writing Chinese in files
-#: ../ex_getln.c:5050
-#, fuzzy
-msgid "Input Line"
-msgstr "สไศ๋ะะ"
-
-#: ../ex_getln.c:5117
-msgid "E198: cmd_pchar beyond the command length"
-msgstr "E198: cmd_pchar ณฌนรม๎ณคถศ"
-
-#: ../ex_getln.c:5279
-msgid "E199: Active window or buffer deleted"
-msgstr "E199: ป๎ถฏดฐฟฺป๒ปบณๅว๘าัฑปษพณ"
-
-#: ../file_search.c:203
-msgid "E854: path too long for completion"
-msgstr ""
-
-#: ../file_search.c:446
-#, c-format
-msgid ""
-"E343: Invalid path: '**[number]' must be at the end of the path or be "
-"followed by '%s'."
-msgstr "E343: ฮะงตฤยทพถ: '**[number]' ฑุะ๋ิฺยทพถฤฉฮฒป๒ี฿บ๓รๆฝำ '%s'กฃ"
-
-#: ../file_search.c:1505
-#, c-format
-msgid "E344: Can't find directory \"%s\" in cdpath"
-msgstr "E344: cdpath ึะีาฒปตฝฤฟยผ \"%s\""
-
-#: ../file_search.c:1508
-#, c-format
-msgid "E345: Can't find file \"%s\" in path"
-msgstr "E345: ิฺยทพถึะีาฒปตฝฮฤผ \"%s\""
-
-#: ../file_search.c:1512
-#, c-format
-msgid "E346: No more directory \"%s\" found in cdpath"
-msgstr "E346: ิฺยทพถึะีาฒปตฝธถเตฤฮฤผ \"%s\""
-
-#: ../file_search.c:1515
-#, c-format
-msgid "E347: No more file \"%s\" found in path"
-msgstr "E347: ิฺยทพถึะีาฒปตฝธถเตฤฮฤผ \"%s\""
-
-#: ../fileio.c:137
-#, fuzzy
-msgid "E812: Autocommands changed buffer or buffer name"
-msgstr "E135: *Filter* ืิถฏรม๎ฒปฟษาิธฤฑไตฑวฐปบณๅว๘"
-
-#: ../fileio.c:368
-msgid "Illegal file name"
-msgstr "ฮะงตฤฮฤผร๛"
-
-#: ../fileio.c:395 ../fileio.c:476 ../fileio.c:2543 ../fileio.c:2578
-msgid "is a directory"
-msgstr "สวฤฟยผ"
-
-#: ../fileio.c:397
-msgid "is not a file"
-msgstr "ฒปสวฮฤผ"
-
-#: ../fileio.c:508 ../fileio.c:3522
-msgid "[New File]"
-msgstr "[ะยฮฤผ]"
-
-#: ../fileio.c:511
-msgid "[New DIRECTORY]"
-msgstr "[ะยฤฟยผ]"
-
-#: ../fileio.c:529 ../fileio.c:532
-msgid "[File too big]"
-msgstr "[ฮฤผนด๓]"
-
-#: ../fileio.c:534
-msgid "[Permission Denied]"
-msgstr "[ศจฯฒปืใ]"
-
-#: ../fileio.c:653
-msgid "E200: *ReadPre autocommands made the file unreadable"
-msgstr "E200: *ReadPre ืิถฏรม๎ตผึยฮฤผฒปฟษถม"
-
-#: ../fileio.c:655
-msgid "E201: *ReadPre autocommands must not change current buffer"
-msgstr "E201: *ReadPre ืิถฏรม๎ฒปิสะํธฤฑไตฑวฐปบณๅว๘"
-
-#: ../fileio.c:672
-msgid "Nvim: Reading from stdin...\n"
-msgstr "Vim: ดำฑ๊ืผสไศ๋ถมศก...\n"
-
-#. Re-opening the original file failed!
-#: ../fileio.c:909
-msgid "E202: Conversion made file unreadable!"
-msgstr "E202: ืชปปตผึยฮฤผฒปฟษถม"
-
-#. fifo or socket
-#: ../fileio.c:1782
-msgid "[fifo/socket]"
-msgstr "[fifo/socket]"
-
-#. fifo
-#: ../fileio.c:1788
-msgid "[fifo]"
-msgstr "[fifo]"
-
-#. or socket
-#: ../fileio.c:1794
-msgid "[socket]"
-msgstr "[socket]"
-
-#. or character special
-#: ../fileio.c:1801
-#, fuzzy
-msgid "[character special]"
-msgstr "1 ธ๖ืึท๛"
-
-#: ../fileio.c:1815
-msgid "[CR missing]"
-msgstr "[ศฑษู CR]'"
-
-#: ../fileio.c:1819
-msgid "[long lines split]"
-msgstr "[ณคะะทึธ๎]"
-
-#: ../fileio.c:1823 ../fileio.c:3512
-msgid "[NOT converted]"
-msgstr "[ฮดืชปป]"
-
-#: ../fileio.c:1826 ../fileio.c:3515
-msgid "[converted]"
-msgstr "[าัืชปป]"
-
-#: ../fileio.c:1831
-#, c-format
-msgid "[CONVERSION ERROR in line %<PRId64>]"
-msgstr "[ตฺ %<PRId64> ะะืชปปดํฮ๓]"
-
-#: ../fileio.c:1835
-#, c-format
-msgid "[ILLEGAL BYTE in line %<PRId64>]"
-msgstr "[ตฺ %<PRId64> ะะฮะงืึท๛]"
-
-#: ../fileio.c:1838
-msgid "[READ ERRORS]"
-msgstr "[ถมดํฮ๓]"
-
-#: ../fileio.c:2104
-msgid "Can't find temp file for conversion"
-msgstr "ีาฒปตฝำรำฺืชปปตฤมูสฑฮฤผ"
-
-#: ../fileio.c:2110
-msgid "Conversion with 'charconvert' failed"
-msgstr "'charconvert' ืชปปสงฐ"
-
-#: ../fileio.c:2113
-msgid "can't read output of 'charconvert'"
-msgstr "ฮทจถมศก 'charconvert' ตฤสไณ๖"
-
-#: ../fileio.c:2437
-msgid "E676: No matching autocommands for acwrite buffer"
-msgstr "E676: ีาฒปตฝ acwrite ปบณๅว๘ถิำฆตฤืิถฏรม๎"
-
-#: ../fileio.c:2466
-msgid "E203: Autocommands deleted or unloaded buffer to be written"
-msgstr "E203: ืิถฏรม๎ษพณป๒สอทลมหาชะดศ๋ตฤปบณๅว๘"
-
-#: ../fileio.c:2486
-msgid "E204: Autocommand changed number of lines in unexpected way"
-msgstr "E204: ืิถฏรม๎าโอโตุธฤฑไมหะะส"
-
-#: ../fileio.c:2548 ../fileio.c:2565
-msgid "is not a file or writable device"
-msgstr "ฒปสวฮฤผป๒ฟษะดตฤษ่ฑธ"
-
-#: ../fileio.c:2601
-msgid "is read-only (add ! to override)"
-msgstr "ึปถม (ว๋ผำ ! วฟึฦึดะะ)"
-
-#: ../fileio.c:2886
-msgid "E506: Can't write to backup file (add ! to override)"
-msgstr "E506: ฮทจะดศ๋ฑธทฮฤผ (ว๋ผำ ! วฟึฦึดะะ)"
-
-#: ../fileio.c:2898
-msgid "E507: Close error for backup file (add ! to override)"
-msgstr "E507: นุฑีฑธทฮฤผณ๖ดํ (ว๋ผำ ! วฟึฦึดะะ)"
-
-#: ../fileio.c:2901
-msgid "E508: Can't read file for backup (add ! to override)"
-msgstr "E508: ฮทจถมศกฮฤผาินฉฑธท (ว๋ผำ ! วฟึฦึดะะ)"
-
-#: ../fileio.c:2923
-msgid "E509: Cannot create backup file (add ! to override)"
-msgstr "E509: ฮทจดดฝจฑธทฮฤผ (ว๋ผำ ! วฟึฦึดะะ)"
-
-#: ../fileio.c:3008
-msgid "E510: Can't make backup file (add ! to override)"
-msgstr "E510: ฮทจษ๚ณษฑธทฮฤผ (ว๋ผำ ! วฟึฦึดะะ)"
-
-#. Can't write without a tempfile!
-#: ../fileio.c:3121
-msgid "E214: Can't find temp file for writing"
-msgstr "E214: ีาฒปตฝำรำฺะดศ๋ตฤมูสฑฮฤผ"
-
-#: ../fileio.c:3134
-msgid "E213: Cannot convert (add ! to write without conversion)"
-msgstr "E213: ฮทจืชปป (ว๋ผำ ! วฟึฦฒปืชปปะดศ๋)"
-
-#: ../fileio.c:3169
-msgid "E166: Can't open linked file for writing"
-msgstr "E166: ฮทจด๒ฟชฒขะดศ๋มดฝำฮฤผ"
-
-#: ../fileio.c:3173
-msgid "E212: Can't open file for writing"
-msgstr "E212: ฮทจด๒ฟชฒขะดศ๋ฮฤผ"
-
-#: ../fileio.c:3363
-msgid "E667: Fsync failed"
-msgstr "E667: อฌฒฝสงฐ"
-
-#: ../fileio.c:3398
-msgid "E512: Close failed"
-msgstr "E512: นุฑีสงฐ"
-
-#: ../fileio.c:3436
-msgid "E513: write error, conversion failed (make 'fenc' empty to override)"
-msgstr "E513: ะดศ๋ดํฮ๓ฃฌืชปปสงฐ (ว๋ฝซ 'fenc' ึรฟีาิวฟึฦึดะะ)"
-
-#: ../fileio.c:3441
-#, fuzzy, c-format
-msgid ""
-"E513: write error, conversion failed in line %<PRId64> (make 'fenc' empty to "
-"override)"
-msgstr "E513: ะดศ๋ดํฮ๓ฃฌืชปปสงฐ (ว๋ฝซ 'fenc' ึรฟีาิวฟึฦึดะะ)"
-
-#: ../fileio.c:3448
-msgid "E514: write error (file system full?)"
-msgstr "E514: ะดศ๋ดํฮ๓ (ฮฤผฯตอณาัย๚ฃฟ)"
-
-#: ../fileio.c:3506
-msgid " CONVERSION ERROR"
-msgstr " ืชปปดํฮ๓"
-
-#: ../fileio.c:3509
-#, fuzzy, c-format
-msgid " in line %<PRId64>;"
-msgstr "ตฺ %<PRId64> ะะ"
-
-#: ../fileio.c:3519
-msgid "[Device]"
-msgstr "[ษ่ฑธ]"
-
-#: ../fileio.c:3522
-msgid "[New]"
-msgstr "[ะย]"
-
-#: ../fileio.c:3535
-msgid " [a]"
-msgstr " [a]"
-
-#: ../fileio.c:3535
-msgid " appended"
-msgstr " าัืทผำ"
-
-#: ../fileio.c:3537
-msgid " [w]"
-msgstr " [w]"
-
-#: ../fileio.c:3537
-msgid " written"
-msgstr " าัะดศ๋"
-
-#: ../fileio.c:3579
-msgid "E205: Patchmode: can't save original file"
-msgstr "E205: Patchmode: ฮทจฑฃดๆิญสผฮฤผ"
-
-#: ../fileio.c:3602
-msgid "E206: patchmode: can't touch empty original file"
-msgstr "E206: Patchmode: ฮทจษ๚ณษฟีตฤิญสผฮฤผ"
-
-#: ../fileio.c:3616
-msgid "E207: Can't delete backup file"
-msgstr "E207: ฮทจษพณฑธทฮฤผ"
-
-#: ../fileio.c:3672
-msgid ""
-"\n"
-"WARNING: Original file may be lost or damaged\n"
-msgstr ""
-"\n"
-"พฏธๆ: ิญสผฮฤผฟษฤาัถชสงป๒ห๐ปต\n"
-
-#: ../fileio.c:3675
-msgid "don't quit the editor until the file is successfully written!"
-msgstr "ิฺฮฤผีศทะดศ๋วฐว๋ฮ๐อหณ๖ฑเผญฦ๗ฃก"
-
-#: ../fileio.c:3795
-msgid "[dos]"
-msgstr "[dos]"
-
-#: ../fileio.c:3795
-msgid "[dos format]"
-msgstr "[dos ธ๑สฝ]"
-
-#: ../fileio.c:3801
-msgid "[mac]"
-msgstr "[mac]"
-
-#: ../fileio.c:3801
-msgid "[mac format]"
-msgstr "[mac ธ๑สฝ]"
-
-#: ../fileio.c:3807
-msgid "[unix]"
-msgstr "[unix]"
-
-#: ../fileio.c:3807
-msgid "[unix format]"
-msgstr "[unix ธ๑สฝ]"
-
-#: ../fileio.c:3831
-msgid "1 line, "
-msgstr "1 ะะฃฌ"
-
-#: ../fileio.c:3833
-#, c-format
-msgid "%<PRId64> lines, "
-msgstr "%<PRId64> ะะฃฌ"
-
-#: ../fileio.c:3836
-msgid "1 character"
-msgstr "1 ธ๖ืึท๛"
-
-#: ../fileio.c:3838
-#, c-format
-msgid "%<PRId64> characters"
-msgstr "%<PRId64> ธ๖ืึท๛"
-
-#: ../fileio.c:3849
-msgid "[noeol]"
-msgstr "[noeol]"
-
-#: ../fileio.c:3849
-msgid "[Incomplete last line]"
-msgstr "[ื๎บ๓าปะะฒปอ๊ี๛]"
-
-#. don't overwrite messages here
-#. must give this prompt
-#. don't use emsg() here, don't want to flush the buffers
-#: ../fileio.c:3865
-msgid "WARNING: The file has been changed since reading it!!!"
-msgstr "พฏธๆ: ดหฮฤผืิถมศ๋บ๓าัทขษ๚ฑไถฏฃกฃกฃก"
-
-#: ../fileio.c:3867
-msgid "Do you really want to write to it"
-msgstr "ศทสตาชะดศ๋ย๐"
-
-#: ../fileio.c:4648
-#, c-format
-msgid "E208: Error writing to \"%s\""
-msgstr "E208: ะดศ๋ฮฤผ \"%s\" ณ๖ดํ"
-
-#: ../fileio.c:4655
-#, c-format
-msgid "E209: Error closing \"%s\""
-msgstr "E209: นุฑีฮฤผ \"%s\" ณ๖ดํ"
-
-#: ../fileio.c:4657
-#, c-format
-msgid "E210: Error reading \"%s\""
-msgstr "E210: ถมศกฮฤผ \"%s\" ณ๖ดํ"
-
-#: ../fileio.c:4883
-msgid "E246: FileChangedShell autocommand deleted buffer"
-msgstr "E246: FileChangedShell ืิถฏรม๎ษพณมหปบณๅว๘"
-
-#: ../fileio.c:4894
-#, c-format
-msgid "E211: File \"%s\" no longer available"
-msgstr "E211: ฮฤผ \"%s\" าัพญฒปดๆิฺ"
-
-#: ../fileio.c:4906
-#, c-format
-msgid ""
-"W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as "
-"well"
-msgstr "W12: พฏธๆ: ฮฤผ \"%s\" าัฑไถฏฃฌฒขวาิฺ Vim ึะตฤปบณๅว๘าฒาัฑไถฏ"
-
-#: ../fileio.c:4907
-msgid "See \":help W12\" for more info."
-msgstr "ฝ๘าปฒฝหตร๗ว๋ผ๛ \":help W12\""
-
-#: ../fileio.c:4910
-#, c-format
-msgid "W11: Warning: File \"%s\" has changed since editing started"
-msgstr "W11: พฏธๆ: ฑเผญฟชสผบ๓ฃฌฮฤผ \"%s\" าัฑไถฏ"
-
-#: ../fileio.c:4911
-msgid "See \":help W11\" for more info."
-msgstr "ฝ๘าปฒฝหตร๗ว๋ผ๛ \":help W11\""
-
-#: ../fileio.c:4914
-#, c-format
-msgid "W16: Warning: Mode of file \"%s\" has changed since editing started"
-msgstr "W16: พฏธๆ: ฑเผญฟชสผบ๓ฃฌฮฤผ \"%s\" ตฤฤฃสฝาัฑไถฏ"
-
-#: ../fileio.c:4915
-msgid "See \":help W16\" for more info."
-msgstr "ฝ๘าปฒฝหตร๗ว๋ผ๛ \":help W16\""
-
-#: ../fileio.c:4927
-#, c-format
-msgid "W13: Warning: File \"%s\" has been created after editing started"
-msgstr "W13: พฏธๆ: ฑเผญฟชสผบ๓ฃฌฮฤผ \"%s\" าัฑปดดฝจ"
-
-#: ../fileio.c:4947
-msgid "Warning"
-msgstr "พฏธๆ"
-
-#: ../fileio.c:4948
-msgid ""
-"&OK\n"
-"&Load File"
-msgstr ""
-"ศทถจ(&O)\n"
-"ผำิุฮฤผ(&L)"
-
-#: ../fileio.c:5065
-#, c-format
-msgid "E462: Could not prepare for reloading \"%s\""
-msgstr "E462: ฮทจฮชึุะยผำิุ \"%s\" ื๖ืผฑธ"
-
-#: ../fileio.c:5078
-#, c-format
-msgid "E321: Could not reload \"%s\""
-msgstr "E321: ฮทจึุะยผำิุ \"%s\""
-
-#: ../fileio.c:5601
-msgid "--Deleted--"
-msgstr "--าัษพณ--"
-
-#: ../fileio.c:5732
-#, c-format
-msgid "auto-removing autocommand: %s <buffer=%d>"
-msgstr ""
-
-#. the group doesn't exist
-#: ../fileio.c:5772
-#, c-format
-msgid "E367: No such group: \"%s\""
-msgstr "E367: ฮดหื้: \"%s\""
-
-#: ../fileio.c:5897
-#, c-format
-msgid "E215: Illegal character after *: %s"
-msgstr "E215: * บ๓รๆำะฮะงืึท๛: %s"
-
-#: ../fileio.c:5905
-#, c-format
-msgid "E216: No such event: %s"
-msgstr "E216: ฮดหสยผ: %s"
-
-#: ../fileio.c:5907
-#, c-format
-msgid "E216: No such group or event: %s"
-msgstr "E216: ฮดหื้ป๒สยผ: %s"
-
-#. Highlight title
-#: ../fileio.c:6090
-msgid ""
-"\n"
-"--- Auto-Commands ---"
-msgstr ""
-"\n"
-"--- ืิถฏรม๎ ---"
-
-#: ../fileio.c:6293
-#, c-format
-msgid "E680: <buffer=%d>: invalid buffer number "
-msgstr "E680: <buffer=%d>: ฮะงตฤปบณๅว๘บล "
-
-#: ../fileio.c:6370
-msgid "E217: Can't execute autocommands for ALL events"
-msgstr "E217: ฒปฤถิห๙ำะสยผึดะะืิถฏรม๎"
-
-#: ../fileio.c:6393
-msgid "No matching autocommands"
-msgstr "รปำะฦฅลไตฤืิถฏรม๎"
-
-#: ../fileio.c:6831
-msgid "E218: autocommand nesting too deep"
-msgstr "E218: ืิถฏรม๎วถฬืฒใสนษ๎"
-
-#: ../fileio.c:7143
-#, c-format
-msgid "%s Auto commands for \"%s\""
-msgstr "%s ืิถฏรม๎ \"%s\""
-
-#: ../fileio.c:7149
-#, c-format
-msgid "Executing %s"
-msgstr "ึดะะ %s"
-
-#: ../fileio.c:7211
-#, c-format
-msgid "autocommand %s"
-msgstr "ืิถฏรม๎ %s"
-
-#: ../fileio.c:7795
-msgid "E219: Missing {."
-msgstr "E219: ศฑษู {กฃ"
-
-#: ../fileio.c:7797
-msgid "E220: Missing }."
-msgstr "E220: ศฑษู }กฃ"
-
-#: ../fold.c:93
-msgid "E490: No fold found"
-msgstr "E490: ีาฒปตฝีต"
-
-#: ../fold.c:544
-msgid "E350: Cannot create fold with current 'foldmethod'"
-msgstr "E350: ฒปฤิฺตฑวฐตฤ 'foldmethod' ฯยดดฝจีต"
-
-#: ../fold.c:546
-msgid "E351: Cannot delete fold with current 'foldmethod'"
-msgstr "E351: ฒปฤิฺตฑวฐตฤ 'foldmethod' ฯยษพณีต"
-
-#: ../fold.c:1784
-#, c-format
-msgid "+--%3ld lines folded "
-msgstr "+--าัีต %3ld ะะ"
-
-#. buffer has already been read
-#: ../getchar.c:273
-msgid "E222: Add to read buffer"
-msgstr "E222: ฬํผำตฝาัถมปบณๅว๘ึะ"
-
-#: ../getchar.c:2040
-msgid "E223: recursive mapping"
-msgstr "E223: ตน้ำณษไ"
-
-#: ../getchar.c:2849
-#, c-format
-msgid "E224: global abbreviation already exists for %s"
-msgstr "E224: ศซพึห๕ะด %s าัดๆิฺ"
-
-#: ../getchar.c:2852
-#, c-format
-msgid "E225: global mapping already exists for %s"
-msgstr "E225: ศซพึำณษไ %s าัดๆิฺ"
-
-#: ../getchar.c:2952
-#, c-format
-msgid "E226: abbreviation already exists for %s"
-msgstr "E226: ห๕ะด %s าัดๆิฺ"
-
-#: ../getchar.c:2955
-#, c-format
-msgid "E227: mapping already exists for %s"
-msgstr "E227: ำณษไ %s าัดๆิฺ"
-
-#: ../getchar.c:3008
-msgid "No abbreviation found"
-msgstr "ีาฒปตฝห๕ะด"
-
-#: ../getchar.c:3010
-msgid "No mapping found"
-msgstr "ีาฒปตฝำณษไ"
-
-#: ../getchar.c:3974
-msgid "E228: makemap: Illegal mode"
-msgstr "E228: makemap: ฮะงตฤฤฃสฝ"
-
-#. key value of 'cedit' option
-#. type of cmdline window or 0
-#. result of cmdline window or 0
-#: ../globals.h:924
-msgid "--No lines in buffer--"
-msgstr "--ปบณๅว๘ฮฤฺศ--"
-
-#.
-#. * The error messages that can be shared are included here.
-#. * Excluded are errors that are only used once and debugging messages.
-#.
-#: ../globals.h:996
-msgid "E470: Command aborted"
-msgstr "E470: รม๎ฑปึะึน"
-
-#: ../globals.h:997
-msgid "E471: Argument required"
-msgstr "E471: ะ่าชฒฮส"
-
-#: ../globals.h:998
-msgid "E10: \\ should be followed by /, ? or &"
-msgstr "E10: \\ บ๓รๆำฆธรธ๚ำะ /กข? ป๒ &"
-
-#: ../globals.h:1000
-msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
-msgstr "E11: ิฺรม๎ะะดฐฟฺึะฮะงฃป<CR> ึดะะฃฌCTRL-C อหณ๖"
-
-#: ../globals.h:1002
-msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
-msgstr "E12: ตฑวฐฤฟยผึะตฤ exrc/vimrc ป๒ tag ฒ้ีาึะฒปิสะํดหรม๎"
-
-#: ../globals.h:1003
-msgid "E171: Missing :endif"
-msgstr "E171: ศฑษู :endif"
-
-#: ../globals.h:1004
-msgid "E600: Missing :endtry"
-msgstr "E600: ศฑษู :endtry"
-
-#: ../globals.h:1005
-msgid "E170: Missing :endwhile"
-msgstr "E170: ศฑษู :endwhile"
-
-#: ../globals.h:1006
-msgid "E170: Missing :endfor"
-msgstr "E170: ศฑษู :endfor"
-
-#: ../globals.h:1007
-msgid "E588: :endwhile without :while"
-msgstr "E588: :endwhile ศฑษูถิำฆตฤ :while"
-
-#: ../globals.h:1008
-msgid "E588: :endfor without :for"
-msgstr "E588: :endfor ศฑษูถิำฆตฤ :for"
-
-#: ../globals.h:1009
-msgid "E13: File exists (add ! to override)"
-msgstr "E13: ฮฤผาัดๆิฺ (ว๋ผำ ! วฟึฦึดะะ)"
-
-#: ../globals.h:1010
-msgid "E472: Command failed"
-msgstr "E472: รม๎ึดะะสงฐ"
-
-#: ../globals.h:1011
-msgid "E473: Internal error"
-msgstr "E473: ฤฺฒฟดํฮ๓"
-
-#: ../globals.h:1012
-msgid "Interrupted"
-msgstr "าัึะถฯ"
-
-#: ../globals.h:1013
-msgid "E14: Invalid address"
-msgstr "E14: ฮะงตฤตุึท"
-
-#: ../globals.h:1014
-msgid "E474: Invalid argument"
-msgstr "E474: ฮะงตฤฒฮส"
-
-#: ../globals.h:1015
-#, c-format
-msgid "E475: Invalid argument: %s"
-msgstr "E475: ฮะงตฤฒฮส: %s"
-
-#: ../globals.h:1016
-#, c-format
-msgid "E15: Invalid expression: %s"
-msgstr "E15: ฮะงตฤฑํด๏สฝ: %s"
-
-#: ../globals.h:1017
-msgid "E16: Invalid range"
-msgstr "E16: ฮะงตฤทถฮง"
-
-#: ../globals.h:1018
-msgid "E476: Invalid command"
-msgstr "E476: ฮะงตฤรม๎"
-
-#: ../globals.h:1019
-#, c-format
-msgid "E17: \"%s\" is a directory"
-msgstr "E17: \"%s\" สวฤฟยผ"
-
-#: ../globals.h:1020
-#, fuzzy
-msgid "E900: Invalid job id"
-msgstr "E49: ฮะงตฤน๖ถฏด๓ะก"
-
-#: ../globals.h:1021
-msgid "E901: Job table is full"
-msgstr ""
-
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
-#: ../globals.h:1024
-#, c-format
-msgid "E364: Library call failed for \"%s()\""
-msgstr "E364: ต๗ำรบฏสฟโ \"%s()\" สงฐ"
-
-#: ../globals.h:1026
-msgid "E19: Mark has invalid line number"
-msgstr "E19: ฑ๊ผวตฤะะบลฮะง"
-
-#: ../globals.h:1027
-msgid "E20: Mark not set"
-msgstr "E20: รปำะษ่ถจฑ๊ผว"
-
-#: ../globals.h:1029
-msgid "E21: Cannot make changes, 'modifiable' is off"
-msgstr "E21: ฒปฤะธฤฃฌา๒ฮชักฯ๎ 'modifiable' สวนุตฤ"
-
-#: ../globals.h:1030
-msgid "E22: Scripts nested too deep"
-msgstr "E22: ฝลฑพวถฬืนษ๎"
-
-#: ../globals.h:1031
-msgid "E23: No alternate file"
-msgstr "E23: รปำะฝปฬๆฮฤผ"
-
-#: ../globals.h:1032
-msgid "E24: No such abbreviation"
-msgstr "E24: รปำะีโธ๖ห๕ะด"
-
-#: ../globals.h:1033
-msgid "E477: No ! allowed"
-msgstr "E477: ฒปฤสนำร \"!\""
-
-#: ../globals.h:1035
-msgid "E25: Nvim does not have a built-in GUI"
-msgstr "E25: ฮทจสนำรอผะฮฝ็รๆ: ฑเา๋สฑรปำะฦ๔ำร"
-
-#: ../globals.h:1036
-#, c-format
-msgid "E28: No such highlight group name: %s"
-msgstr "E28: รปำะีโธ๖ธ฿มมศบื้ร๛: %s"
-
-#: ../globals.h:1037
-msgid "E29: No inserted text yet"
-msgstr "E29: รปำะฒๅศ๋นฮฤืึ"
-
-#: ../globals.h:1038
-msgid "E30: No previous command line"
-msgstr "E30: รปำะวฐาปธ๖รม๎ะะ"
-
-#: ../globals.h:1039
-msgid "E31: No such mapping"
-msgstr "E31: รปำะีโธ๖ำณษไ"
-
-#: ../globals.h:1040
-msgid "E479: No match"
-msgstr "E479: รปำะฦฅลไ"
-
-#: ../globals.h:1041
-#, c-format
-msgid "E480: No match: %s"
-msgstr "E480: รปำะฦฅลไ: %s"
-
-#: ../globals.h:1042
-msgid "E32: No file name"
-msgstr "E32: รปำะฮฤผร๛"
-
-#: ../globals.h:1044
-msgid "E33: No previous substitute regular expression"
-msgstr "E33: รปำะวฐาปธ๖ฬๆปปีิ๒ฑํด๏สฝ"
-
-#: ../globals.h:1045
-msgid "E34: No previous command"
-msgstr "E34: รปำะวฐาปธ๖รม๎"
-
-#: ../globals.h:1046
-msgid "E35: No previous regular expression"
-msgstr "E35: รปำะวฐาปธ๖ีิ๒ฑํด๏สฝ"
-
-#: ../globals.h:1047
-msgid "E481: No range allowed"
-msgstr "E481: ฒปฤสนำรทถฮง"
-
-#: ../globals.h:1048
-msgid "E36: Not enough room"
-msgstr "E36: รปำะืในปตฤฟีผไ"
-
-#: ../globals.h:1049
-#, c-format
-msgid "E482: Can't create file %s"
-msgstr "E482: ฮทจดดฝจฮฤผ %s"
-
-#: ../globals.h:1050
-msgid "E483: Can't get temp file name"
-msgstr "E483: ฮทจป๑ศกมูสฑฮฤผร๛"
-
-#: ../globals.h:1051
-#, c-format
-msgid "E484: Can't open file %s"
-msgstr "E484: ฮทจด๒ฟชฮฤผ %s"
-
-#: ../globals.h:1052
-#, c-format
-msgid "E485: Can't read file %s"
-msgstr "E485: ฮทจถมศกฮฤผ %s"
-
-#: ../globals.h:1054
-msgid "E37: No write since last change (add ! to override)"
-msgstr "E37: าัะธฤตซษะฮดฑฃดๆ (ฟษำร ! วฟึฦึดะะ)"
-
-#: ../globals.h:1055
-#, fuzzy
-msgid "E37: No write since last change"
-msgstr "[าัะธฤตซษะฮดฑฃดๆ]\n"
-
-#: ../globals.h:1056
-msgid "E38: Null argument"
-msgstr "E38: ฟีตฤฒฮส"
-
-#: ../globals.h:1057
-msgid "E39: Number expected"
-msgstr "E39: ดหดฆะ่าชสืึ"
-
-#: ../globals.h:1058
-#, c-format
-msgid "E40: Can't open errorfile %s"
-msgstr "E40: ฮทจด๒ฟชดํฮ๓ฮฤผ %s"
-
-#: ../globals.h:1059
-msgid "E41: Out of memory!"
-msgstr "E41: ฤฺดๆฒปืใฃก"
-
-#: ../globals.h:1060
-msgid "Pattern not found"
-msgstr "ีาฒปตฝฤฃสฝ"
-
-#: ../globals.h:1061
-#, c-format
-msgid "E486: Pattern not found: %s"
-msgstr "E486: ีาฒปตฝฤฃสฝ: %s"
-
-#: ../globals.h:1062
-msgid "E487: Argument must be positive"
-msgstr "E487: ฒฮสฑุะ๋สวีส"
-
-#: ../globals.h:1064
-msgid "E459: Cannot go back to previous directory"
-msgstr "E459: ฮทจปุตฝวฐาปธ๖ฤฟยผ"
-
-#: ../globals.h:1066
-msgid "E42: No Errors"
-msgstr "E42: รปำะดํฮ๓"
-
-#: ../globals.h:1067
-msgid "E776: No location list"
-msgstr "E776: รปำะ location มะฑํ"
-
-#: ../globals.h:1068
-msgid "E43: Damaged match string"
-msgstr "E43: าัห๐ปตตฤฦฅลไืึท๛ดฎ"
-
-#: ../globals.h:1069
-msgid "E44: Corrupted regexp program"
-msgstr "E44: าัห๐ปตตฤีิ๒ฑํด๏สฝณฬะ๒"
-
-#: ../globals.h:1071
-msgid "E45: 'readonly' option is set (add ! to override)"
-msgstr "E45: าัษ่ถจักฯ๎ 'readonly' (ว๋ผำ ! วฟึฦึดะะ)"
-
-#: ../globals.h:1073
-#, c-format
-msgid "E46: Cannot change read-only variable \"%s\""
-msgstr "E46: ฒปฤธฤฑไึปถมฑไมฟ \"%s\""
-
-#: ../globals.h:1075
-#, fuzzy, c-format
-msgid "E794: Cannot set variable in the sandbox: \"%s\""
-msgstr "E46: ฒปฤิฺ sandbox ึะษ่ถจฑไมฟ: \"%s\""
-
-#: ../globals.h:1076
-msgid "E47: Error while reading errorfile"
-msgstr "E47: ถมศกดํฮ๓ฮฤผสงฐ"
-
-#: ../globals.h:1078
-msgid "E48: Not allowed in sandbox"
-msgstr "E48: ฒปิสะํิฺ sandbox ึะสนำร"
-
-#: ../globals.h:1080
-msgid "E523: Not allowed here"
-msgstr "E523: ฒปิสะํิฺดหสนำร"
-
-#: ../globals.h:1082
-msgid "E359: Screen mode setting not supported"
-msgstr "E359: ฒปึงณึษ่ถจฦมฤปฤฃสฝ"
-
-#: ../globals.h:1083
-msgid "E49: Invalid scroll size"
-msgstr "E49: ฮะงตฤน๖ถฏด๓ะก"
-
-#: ../globals.h:1084
-msgid "E91: 'shell' option is empty"
-msgstr "E91: ักฯ๎ 'shell' ฮชฟี"
-
-#: ../globals.h:1085
-msgid "E255: Couldn't read in sign data!"
-msgstr "E255: ฮทจถมศก sign สพฃก"
-
-#: ../globals.h:1086
-msgid "E72: Close error on swap file"
-msgstr "E72: ฝปปปฮฤผนุฑีดํฮ๓"
-
-#: ../globals.h:1087
-msgid "E73: tag stack empty"
-msgstr "E73: tag ถัีปฮชฟี"
-
-#: ../globals.h:1088
-msgid "E74: Command too complex"
-msgstr "E74: รม๎นธดิำ"
-
-#: ../globals.h:1089
-msgid "E75: Name too long"
-msgstr "E75: ร๛ืึนณค"
-
-#: ../globals.h:1090
-msgid "E76: Too many ["
-msgstr "E76: [ นถเ"
-
-#: ../globals.h:1091
-msgid "E77: Too many file names"
-msgstr "E77: ฮฤผร๛นถเ"
-
-#: ../globals.h:1092
-msgid "E488: Trailing characters"
-msgstr "E488: ถเำเตฤฮฒฒฟืึท๛"
-
-#: ../globals.h:1093
-msgid "E78: Unknown mark"
-msgstr "E78: ฮดึชตฤฑ๊ผว"
-
-#: ../globals.h:1094
-msgid "E79: Cannot expand wildcards"
-msgstr "E79: ฮทจภฉีนอจลไท๛"
-
-#: ../globals.h:1096
-msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
-msgstr "E591: 'winheight' ฒปฤะกำฺ 'winminheight'"
-
-#: ../globals.h:1098
-msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
-msgstr "E592: 'winwidth' ฒปฤะกำฺ 'winminwidth'"
-
-#: ../globals.h:1099
-msgid "E80: Error while writing"
-msgstr "E80: ะดศ๋ณ๖ดํ"
-
-#: ../globals.h:1100
-msgid "Zero count"
-msgstr "ผฦสฮชมใ"
-
-#: ../globals.h:1101
-msgid "E81: Using <SID> not in a script context"
-msgstr "E81: ิฺฝลฑพปทพณอโสนำรมห <SID>"
-
-#: ../globals.h:1102
-#, c-format
-msgid "E685: Internal error: %s"
-msgstr "E685: ฤฺฒฟดํฮ๓: %s"
-
-#: ../globals.h:1104
-msgid "E363: pattern uses more memory than 'maxmempattern'"
-msgstr "E363: ฑํด๏สฝตฤฤฺดๆสนำรณฌณ๖ 'maxmempattern'"
-
-#: ../globals.h:1105
-msgid "E749: empty buffer"
-msgstr "E749: ฟีตฤปบณๅว๘"
-
-#: ../globals.h:1108
-msgid "E682: Invalid search pattern or delimiter"
-msgstr "E682: ฮะงตฤหัห๗ฑํด๏สฝป๒ทึธ๔ท๛"
-
-#: ../globals.h:1109
-msgid "E139: File is loaded in another buffer"
-msgstr "E139: ฮฤผาัิฺมําปธ๖ปบณๅว๘ึะฑปผำิุ"
-
-#: ../globals.h:1110
-#, c-format
-msgid "E764: Option '%s' is not set"
-msgstr "E764: รปำะษ่ถจักฯ๎ '%s'"
-
-#: ../globals.h:1111
-#, fuzzy
-msgid "E850: Invalid register name"
-msgstr "E354: ฮะงตฤผฤดๆฦ๗ร๛: '%s'"
-
-#: ../globals.h:1114
-msgid "search hit TOP, continuing at BOTTOM"
-msgstr "าัฒ้ีาตฝฮฤผฟชอทฃฌิูดำฝแฮฒผฬะ๘ฒ้ีา"
-
-#: ../globals.h:1115
-msgid "search hit BOTTOM, continuing at TOP"
-msgstr "าัฒ้ีาตฝฮฤผฝแฮฒฃฌิูดำฟชอทผฬะ๘ฒ้ีา"
-
-#: ../hardcopy.c:240
-msgid "E550: Missing colon"
-msgstr "E550: ศฑษูรฐบล"
-
-#: ../hardcopy.c:252
-msgid "E551: Illegal component"
-msgstr "E551: ฮะงตฤฒฟทึ"
-
-#: ../hardcopy.c:259
-msgid "E552: digit expected"
-msgstr "E552: ำฆธราชำะสืึ"
-
-#: ../hardcopy.c:473
-#, c-format
-msgid "Page %d"
-msgstr "ตฺ %d าณ"
-
-#: ../hardcopy.c:597
-msgid "No text to be printed"
-msgstr "รปำะาชด๒ำกตฤฮฤืึ"
-
-#: ../hardcopy.c:668
-#, c-format
-msgid "Printing page %d (%d%%)"
-msgstr "ีิฺด๒ำกตฺ %d าณ (%d%%)"
-
-#: ../hardcopy.c:680
-#, c-format
-msgid " Copy %d of %d"
-msgstr "ธดึฦ %d / %d"
-
-#: ../hardcopy.c:733
-#, c-format
-msgid "Printed: %s"
-msgstr "าัด๒ำก: %s"
-
-#: ../hardcopy.c:740
-msgid "Printing aborted"
-msgstr "ด๒ำกึะึน"
-
-#: ../hardcopy.c:1365
-msgid "E455: Error writing to PostScript output file"
-msgstr "E455: ะดศ๋ PostScript สไณ๖ฮฤผณ๖ดํ"
-
-#: ../hardcopy.c:1747
-#, c-format
-msgid "E624: Can't open file \"%s\""
-msgstr "E624: ฮทจด๒ฟชฮฤผ \"%s\""
-
-#: ../hardcopy.c:1756 ../hardcopy.c:2470
-#, c-format
-msgid "E457: Can't read PostScript resource file \"%s\""
-msgstr "E457: ฮทจถมศก PostScript ืสิดฮฤผ \"%s\""
-
-#: ../hardcopy.c:1772
-#, c-format
-msgid "E618: file \"%s\" is not a PostScript resource file"
-msgstr "E618: ฮฤผ \"%s\" ฒปสว PostScript ืสิดฮฤผ"
-
-#: ../hardcopy.c:1788 ../hardcopy.c:1805 ../hardcopy.c:1844
-#, c-format
-msgid "E619: file \"%s\" is not a supported PostScript resource file"
-msgstr "E619: ฮฤผ \"%s\" ฒปสวาัึงณึตฤ PostScript ืสิดฮฤผ"
-
-#: ../hardcopy.c:1856
-#, c-format
-msgid "E621: \"%s\" resource file has wrong version"
-msgstr "E621: \"%s\" ืสิดฮฤผฐๆฑพฒปีศท"
-
-#: ../hardcopy.c:2225
-msgid "E673: Incompatible multi-byte encoding and character set."
-msgstr "E673: ฒปผๆศตฤถเืึฝฺฑเย๋บอืึท๛ผฏกฃ"
-
-#: ../hardcopy.c:2238
-msgid "E674: printmbcharset cannot be empty with multi-byte encoding."
-msgstr "E674: printmbcharset ิฺถเืึฝฺฑเย๋ฯยฒปฤฮชฟีกฃ"
-
-#: ../hardcopy.c:2254
-msgid "E675: No default font specified for multi-byte printing."
-msgstr "E675: รปำะึธถจถเืึฝฺด๒ำกตฤฤฌศฯืึฬๅกฃ"
-
-#: ../hardcopy.c:2426
-msgid "E324: Can't open PostScript output file"
-msgstr "E324: ฮทจด๒ฟช PostScript สไณ๖ฮฤผ"
-
-#: ../hardcopy.c:2458
-#, c-format
-msgid "E456: Can't open file \"%s\""
-msgstr "E456: ฮทจด๒ฟชฮฤผ \"%s\""
-
-#: ../hardcopy.c:2583
-msgid "E456: Can't find PostScript resource file \"prolog.ps\""
-msgstr "E456: ีาฒปตฝ PostScript ืสิดฮฤผ \"prolog.ps\""
-
-#: ../hardcopy.c:2593
-msgid "E456: Can't find PostScript resource file \"cidfont.ps\""
-msgstr "E456: ีาฒปตฝ PostScript ืสิดฮฤผ \"cidfont.ps\""
-
-#: ../hardcopy.c:2622 ../hardcopy.c:2639 ../hardcopy.c:2665
-#, c-format
-msgid "E456: Can't find PostScript resource file \"%s.ps\""
-msgstr "E456: ีาฒปตฝ PostScript ืสิดฮฤผ \"%s.ps\""
-
-#: ../hardcopy.c:2654
-#, c-format
-msgid "E620: Unable to convert to print encoding \"%s\""
-msgstr "E620: ฮทจืชปปึมด๒ำกฑเย๋ \"%s\""
-
-#: ../hardcopy.c:2877
-msgid "Sending to printer..."
-msgstr "ทขหอตฝด๒ำกป๚กญกญ"
-
-#: ../hardcopy.c:2881
-msgid "E365: Failed to print PostScript file"
-msgstr "E365: ฮทจด๒ำก PostScript ฮฤผ"
-
-#: ../hardcopy.c:2883
-msgid "Print job sent."
-msgstr "ด๒ำกศฮฮ๑าัฑปทขหอกฃ"
-
-#: ../if_cscope.c:85
-msgid "Add a new database"
-msgstr "ฬํผำาปธ๖ะยตฤสพฟโ"
-
-#: ../if_cscope.c:87
-msgid "Query for a pattern"
-msgstr "ฒ้ัฏาปธ๖ฤฃสฝ"
-
-#: ../if_cscope.c:89
-msgid "Show this message"
-msgstr "ฯิสพดหะลฯข"
-
-#: ../if_cscope.c:91
-msgid "Kill a connection"
-msgstr "ฝแส๘าปธ๖มฌฝำ"
-
-#: ../if_cscope.c:93
-msgid "Reinit all connections"
-msgstr "ึุึรห๙ำะมฌฝำ"
-
-#: ../if_cscope.c:95
-msgid "Show connections"
-msgstr "ฯิสพมฌฝำ"
-
-#: ../if_cscope.c:101
-#, c-format
-msgid "E560: Usage: cs[cope] %s"
-msgstr "E560: ำรทจ: cs[cope] %s"
-
-#: ../if_cscope.c:225
-msgid "This cscope command does not support splitting the window.\n"
-msgstr "ีโธ๖ cscope รม๎ฒปึงณึทึธ๎ดฐฟฺกฃ\n"
-
-#: ../if_cscope.c:266
-msgid "E562: Usage: cstag <ident>"
-msgstr "E562: ำรทจ: cstag <ident>"
-
-#: ../if_cscope.c:313
-msgid "E257: cstag: tag not found"
-msgstr "E257: cstag: ีาฒปตฝ tag"
-
-#: ../if_cscope.c:461
-#, c-format
-msgid "E563: stat(%s) error: %d"
-msgstr "E563: stat(%s) ดํฮ๓: %d"
-
-#: ../if_cscope.c:551
-#, c-format
-msgid "E564: %s is not a directory or a valid cscope database"
-msgstr "E564: %s ฒปสวฤฟยผป๒ำะะงตฤ cscope สพฟโ"
-
-#: ../if_cscope.c:566
-#, c-format
-msgid "Added cscope database %s"
-msgstr "ฬํผำมห cscope สพฟโ %s"
-
-#: ../if_cscope.c:616
-#, c-format
-msgid "E262: error reading cscope connection %<PRId64>"
-msgstr "E262: ถมศก cscope มฌฝำ %<PRId64> ณ๖ดํ"
-
-#: ../if_cscope.c:711
-msgid "E561: unknown cscope search type"
-msgstr "E561: ฮดึชตฤ cscope ฒ้ีาภเะอ"
-
-#: ../if_cscope.c:752 ../if_cscope.c:789
-msgid "E566: Could not create cscope pipes"
-msgstr "E566: ฮทจดดฝจ cscope นตภ"
-
-#: ../if_cscope.c:767
-msgid "E622: Could not fork for cscope"
-msgstr "E622: ฮทจถิ cscope ฝ๘ะะ fork"
-
-#: ../if_cscope.c:849
-#, fuzzy
-msgid "cs_create_connection setpgid failed"
-msgstr "cs_create_connection ึดะะสงฐ"
-
-#: ../if_cscope.c:853 ../if_cscope.c:889
-msgid "cs_create_connection exec failed"
-msgstr "cs_create_connection ึดะะสงฐ"
-
-#: ../if_cscope.c:863 ../if_cscope.c:902
-msgid "cs_create_connection: fdopen for to_fp failed"
-msgstr "cs_create_connection: fdopen to_fp สงฐ"
-
-#: ../if_cscope.c:865 ../if_cscope.c:906
-msgid "cs_create_connection: fdopen for fr_fp failed"
-msgstr "cs_create_connection: fdopen fr_fp สงฐ"
-
-#: ../if_cscope.c:890
-msgid "E623: Could not spawn cscope process"
-msgstr "E623: ฮทจษ๚ณษ cscope ฝ๘ณฬ"
-
-#: ../if_cscope.c:932
-msgid "E567: no cscope connections"
-msgstr "E567: รปำะ cscope มฌฝำ"
-
-#: ../if_cscope.c:1009
-#, c-format
-msgid "E469: invalid cscopequickfix flag %c for %c"
-msgstr "E469: cscopequickfix ฑ๊ึพ %c ถิ %c ฮะง"
-
-#: ../if_cscope.c:1058
-#, c-format
-msgid "E259: no matches found for cscope query %s of %s"
-msgstr "E259: cscope ฒ้ัฏ %s %s รปำะีาตฝฦฅลไตฤฝแน๛"
-
-#: ../if_cscope.c:1142
-msgid "cscope commands:\n"
-msgstr "cscope รม๎:\n"
-
-#: ../if_cscope.c:1150
-#, fuzzy, c-format
-msgid "%-5s: %s%*s (Usage: %s)"
-msgstr "%-5s: %-30s (ำรทจ: %s)"
-
-#: ../if_cscope.c:1155
-msgid ""
-"\n"
-" c: Find functions calling this function\n"
-" d: Find functions called by this function\n"
-" e: Find this egrep pattern\n"
-" f: Find this file\n"
-" g: Find this definition\n"
-" i: Find files #including this file\n"
-" s: Find this C symbol\n"
-" t: Find this text string\n"
-msgstr ""
-
-#: ../if_cscope.c:1226
-msgid "E568: duplicate cscope database not added"
-msgstr "E568: ึุธดตฤ cscope สพฟโฮดฑปผำศ๋"
-
-#: ../if_cscope.c:1335
-#, c-format
-msgid "E261: cscope connection %s not found"
-msgstr "E261: ีาฒปตฝ cscope มฌฝำ %s"
-
-#: ../if_cscope.c:1364
-#, c-format
-msgid "cscope connection %s closed"
-msgstr "cscope มฌฝำ %s าันุฑี"
-
-#. should not reach here
-#: ../if_cscope.c:1486
-msgid "E570: fatal error in cs_manage_matches"
-msgstr "E570: cs_manage_matches ัฯึุดํฮ๓"
-
-#: ../if_cscope.c:1693
-#, c-format
-msgid "Cscope tag: %s"
-msgstr "Cscope tag: %s"
-
-#: ../if_cscope.c:1711
-msgid ""
-"\n"
-" # line"
-msgstr ""
-"\n"
-" # ะะ "
-
-#: ../if_cscope.c:1713
-msgid "filename / context / line\n"
-msgstr "ฮฤผร๛ / ษฯฯยฮฤ / ะะ\n"
-
-#: ../if_cscope.c:1809
-#, c-format
-msgid "E609: Cscope error: %s"
-msgstr "E609: Cscope ดํฮ๓: %s"
-
-#: ../if_cscope.c:2053
-msgid "All cscope databases reset"
-msgstr "ห๙ำะ cscope สพฟโาัฑปึุึร"
-
-#: ../if_cscope.c:2123
-msgid "no cscope connections\n"
-msgstr "รปำะ cscope มฌฝำ\n"
-
-#: ../if_cscope.c:2126
-msgid " # pid database name prepend path\n"
-msgstr " # pid สพฟโร๛ prepend path\n"
-
-#: ../main.c:144
-msgid "Unknown option argument"
-msgstr "ฮดึชตฤักฯ๎ฒฮส"
-
-#: ../main.c:146
-msgid "Too many edit arguments"
-msgstr "ฑเผญฒฮสนถเ"
-
-#: ../main.c:148
-msgid "Argument missing after"
-msgstr "ศฑษูฑุาชตฤฒฮส"
-
-#: ../main.c:150
-msgid "Garbage after option argument"
-msgstr "ักฯ๎ฒฮสบ๓ตฤฤฺศฮะง"
-
-#: ../main.c:152
-msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"
-msgstr "\"+command\"กข\"-c command\" ป๒ \"--cmd command\" ฒฮสนถเ"
-
-#: ../main.c:154
-msgid "Invalid argument for"
-msgstr "ฮะงตฤฒฮส"
-
-#: ../main.c:294
-#, c-format
-msgid "%d files to edit\n"
-msgstr "ปนำะ %d ธ๖ฮฤผตศดฑเผญ\n"
-
-#: ../main.c:1342
-msgid "Attempt to open script file again: \""
-msgstr "สิอผิูดฮด๒ฟชฝลฑพฮฤผ: \""
-
-#: ../main.c:1350
-msgid "Cannot open for reading: \""
-msgstr "ฮทจด๒ฟชฒขถมศก: \""
-
-#: ../main.c:1393
-msgid "Cannot open for script output: \""
-msgstr "ฮทจด๒ฟชฒขสไณ๖ฝลฑพ: \""
-
-#: ../main.c:1622
-msgid "Vim: Warning: Output is not to a terminal\n"
-msgstr "Vim: พฏธๆ: สไณ๖ฒปสวตฝึีถห(ฦมฤป)\n"
-
-#: ../main.c:1624
-msgid "Vim: Warning: Input is not from a terminal\n"
-msgstr "Vim: พฏธๆ: สไศ๋ฒปสวภดืิึีถห(ผลฬ)\n"
-
-#. just in case..
-#: ../main.c:1891
-msgid "pre-vimrc command line"
-msgstr "pre-vimrc รม๎ะะ"
-
-#: ../main.c:1964
-#, c-format
-msgid "E282: Cannot read from \"%s\""
-msgstr "E282: ฮทจถมศก \"%s\""
-
-#: ../main.c:2149
-msgid ""
-"\n"
-"More info with: \"vim -h\"\n"
-msgstr ""
-"\n"
-"ธถเะลฯขว๋ผ๛: \"vim -h\"\n"
-
-#: ../main.c:2178
-msgid "[file ..] edit specified file(s)"
-msgstr "[ฮฤผ ..] ฑเผญึธถจตฤฮฤผ"
-
-#: ../main.c:2179
-msgid "- read text from stdin"
-msgstr "- ดำฑ๊ืผสไศ๋(stdin)ถมศกฮฤฑพ"
-
-#: ../main.c:2180
-msgid "-t tag edit file where tag is defined"
-msgstr "-t tag ฑเผญ tag ถจาๅดฆตฤฮฤผ"
-
-#: ../main.c:2181
-msgid "-q [errorfile] edit file with first error"
-msgstr "-q [errorfile] ฑเผญตฺาปธ๖ณ๖ดํดฆตฤฮฤผ"
-
-#: ../main.c:2187
-msgid ""
-"\n"
-"\n"
-"usage:"
-msgstr ""
-"\n"
-"\n"
-"ำรทจ:"
-
-#: ../main.c:2189
-msgid " vim [arguments] "
-msgstr " vim [ฒฮส] "
-
-#: ../main.c:2193
-msgid ""
-"\n"
-" or:"
-msgstr ""
-"\n"
-" ป๒:"
-
-#: ../main.c:2196
-msgid ""
-"\n"
-"\n"
-"Arguments:\n"
-msgstr ""
-"\n"
-"\n"
-"ฒฮส:\n"
-
-#: ../main.c:2197
-msgid "--\t\t\tOnly file names after this"
-msgstr "--\t\t\tิฺีโาิบ๓ึปำะฮฤผร๛"
-
-#: ../main.c:2199
-msgid "--literal\t\tDon't expand wildcards"
-msgstr "--literal\t\tฒปภฉีนอจลไท๛"
-
-#: ../main.c:2201
-msgid "-v\t\t\tVi mode (like \"vi\")"
-msgstr "-v\t\t\tVi ฤฃสฝ (อฌ \"vi\")"
-
-#: ../main.c:2202
-msgid "-e\t\t\tEx mode (like \"ex\")"
-msgstr "-e\t\t\tEx ฤฃสฝ (อฌ \"ex\")"
-
-#: ../main.c:2203
-msgid "-E\t\t\tImproved Ex mode"
-msgstr ""
-
-#: ../main.c:2204
-msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")"
-msgstr "-s\t\t\tฐฒพฒ(ล๚ดฆภํ)ฤฃสฝ (ึปฤำ๋ \"ex\" าปฦ๐สนำร)"
-
-#: ../main.c:2205
-msgid "-d\t\t\tDiff mode (like \"vimdiff\")"
-msgstr "-d\t\t\tDiff ฤฃสฝ (อฌ \"vimdiff\")"
-
-#: ../main.c:2206
-msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
-msgstr "-y\t\t\tศาืฤฃสฝ (อฌ \"evim\"ฃฌฮฤฃสฝ)"
-
-#: ../main.c:2207
-msgid "-R\t\t\tReadonly mode (like \"view\")"
-msgstr "-R\t\t\tึปถมฤฃสฝ (อฌ \"view\")"
-
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tฯึฦฤฃสฝ (อฌ \"rvim\")"
-
-#: ../main.c:2209
-msgid "-m\t\t\tModifications (writing files) not allowed"
-msgstr "-m\t\t\tฒปฟษะธฤ(ะดศ๋ฮฤผ)"
-
-#: ../main.c:2210
-msgid "-M\t\t\tModifications in text not allowed"
-msgstr "-M\t\t\tฮฤฑพฒปฟษะธฤ"
-
-#: ../main.c:2211
-msgid "-b\t\t\tBinary mode"
-msgstr "-b\t\t\tถฝ๘ึฦฤฃสฝ"
-
-#: ../main.c:2212
-msgid "-l\t\t\tLisp mode"
-msgstr "-l\t\t\tLisp ฤฃสฝ"
-
-#: ../main.c:2213
-msgid "-C\t\t\tCompatible with Vi: 'compatible'"
-msgstr "-C\t\t\tผๆศดซอณตฤ Vi: 'compatible'"
-
-#: ../main.c:2214
-msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'"
-msgstr "-N\t\t\tฒปอ๊ศซผๆศดซอณตฤ Vi: 'nocompatible'"
-
-#: ../main.c:2215
-msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]"
-msgstr ""
-
-#: ../main.c:2216
-msgid "-D\t\t\tDebugging mode"
-msgstr "-D\t\t\tต๗สิฤฃสฝ"
-
-#: ../main.c:2217
-msgid "-n\t\t\tNo swap file, use memory only"
-msgstr "-n\t\t\tฒปสนำรฝปปปฮฤผฃฌึปสนำรฤฺดๆ"
-
-#: ../main.c:2218
-msgid "-r\t\t\tList swap files and exit"
-msgstr "-r\t\t\tมะณ๖ฝปปปฮฤผฒขอหณ๖"
-
-#: ../main.c:2219
-msgid "-r (with file name)\tRecover crashed session"
-msgstr "-r (ธ๚ฮฤผร๛)\t\tปึธดฑภภฃตฤปแปฐ"
-
-#: ../main.c:2220
-msgid "-L\t\t\tSame as -r"
-msgstr "-L\t\t\tอฌ -r"
-
-#: ../main.c:2221
-msgid "-A\t\t\tstart in Arabic mode"
-msgstr "-A\t\t\tาิ Arabic ฤฃสฝฦ๔ถฏ"
-
-#: ../main.c:2222
-msgid "-H\t\t\tStart in Hebrew mode"
-msgstr "-H\t\t\tาิ Hebrew ฤฃสฝฦ๔ถฏ"
-
-#: ../main.c:2223
-msgid "-F\t\t\tStart in Farsi mode"
-msgstr "-F\t\t\tาิ Farsi ฤฃสฝฦ๔ถฏ"
-
-#: ../main.c:2224
-msgid "-T <terminal>\tSet terminal type to <terminal>"
-msgstr "-T <terminal>\tษ่ถจึีถหภเะอฮช <terminal>"
-
-#: ../main.c:2225
-msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc"
-msgstr "-u <vimrc>\t\tสนำร <vimrc> ฬๆด๚ศฮบฮ .vimrc"
-
-#: ../main.c:2226
-msgid "--noplugin\t\tDon't load plugin scripts"
-msgstr "--noplugin\t\tฒปผำิุ plugin ฝลฑพ"
-
-#: ../main.c:2227
-msgid "-p[N]\t\tOpen N tab pages (default: one for each file)"
-msgstr "-P[N]\t\tด๒ฟช N ธ๖ฑ๊วฉาณ (ฤฌศฯึต: รฟธ๖ฮฤผาปธ๖)"
-
-#: ../main.c:2228
-msgid "-o[N]\t\tOpen N windows (default: one for each file)"
-msgstr "-o[N]\t\tด๒ฟช N ธ๖ดฐฟฺ (ฤฌศฯึต: รฟธ๖ฮฤผาปธ๖)"
-
-#: ../main.c:2229
-msgid "-O[N]\t\tLike -o but split vertically"
-msgstr "-O[N]\t\tอฌ -o ตซดนึฑทึธ๎"
-
-#: ../main.c:2230
-msgid "+\t\t\tStart at end of file"
-msgstr "+\t\t\tฦ๔ถฏบ๓ฬ๘ตฝฮฤผฤฉฮฒ"
-
-#: ../main.c:2231
-msgid "+<lnum>\t\tStart at line <lnum>"
-msgstr "+<lnum>\t\tฦ๔ถฏบ๓ฬ๘ตฝตฺ <lnum> ะะ"
-
-#: ../main.c:2232
-msgid "--cmd <command>\tExecute <command> before loading any vimrc file"
-msgstr "--cmd <command>\tผำิุศฮบฮ vimrc ฮฤผวฐึดะะ <command>"
-
-#: ../main.c:2233
-msgid "-c <command>\t\tExecute <command> after loading the first file"
-msgstr "-c <command>\t\tผำิุตฺาปธ๖ฮฤผบ๓ึดะะ <command>"
-
-#: ../main.c:2235
-msgid "-S <session>\t\tSource file <session> after loading the first file"
-msgstr "-S <session>\t\tผำิุตฺาปธ๖ฮฤผบ๓ึดะะฮฤผ <session>"
-
-#: ../main.c:2236
-msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>"
-msgstr "-s <scriptin>\tดำฮฤผ <scriptin> ถมศ๋ีณฃฤฃสฝตฤรม๎"
-
-#: ../main.c:2237
-msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>"
-msgstr "-w <scriptout>\tฝซห๙ำะสไศ๋ตฤรม๎ืทผำตฝฮฤผ <scriptout>"
-
-#: ../main.c:2238
-msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>"
-msgstr "-W <scriptout>\tฝซห๙ำะสไศ๋ตฤรม๎ะดศ๋ตฝฮฤผ <scriptout>"
-
-#: ../main.c:2240
-msgid "--startuptime <file>\tWrite startup timing messages to <file>"
-msgstr ""
-
-#: ../main.c:2242
-msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
-msgstr "-i <viminfo>\t\tสนำร <viminfo> ศกด๚ .viminfo"
-
-#: ../main.c:2243
-msgid "-h or --help\tPrint Help (this message) and exit"
-msgstr "-h ป๒ --help\tด๒ำกฐ๏ึ๚(ฑพะลฯข)ฒขอหณ๖"
-
-#: ../main.c:2244
-msgid "--version\t\tPrint version information and exit"
-msgstr "--version\t\tด๒ำกฐๆฑพะลฯขฒขอหณ๖"
-
-#: ../mark.c:676
-msgid "No marks set"
-msgstr "รปำะษ่ถจฑ๊ผว"
-
-#: ../mark.c:678
-#, c-format
-msgid "E283: No marks matching \"%s\""
-msgstr "E283: รปำะฦฅลไ \"%s\" ตฤฑ๊ผว"
-
-#. Highlight title
-#: ../mark.c:687
-msgid ""
-"\n"
-"mark line col file/text"
-msgstr ""
-"\n"
-"ฑ๊ผว ะะ มะ ฮฤผ/ฮฤฑพ"
-
-#. Highlight title
-#: ../mark.c:789
-msgid ""
-"\n"
-" jump line col file/text"
-msgstr ""
-"\n"
-" ฬ๘ืช ะะ มะ ฮฤผ/ฮฤฑพ"
-
-#. Highlight title
-#: ../mark.c:831
-msgid ""
-"\n"
-"change line col text"
-msgstr ""
-"\n"
-" ธฤฑไ ะะ มะ ฮฤฑพ"
-
-#: ../mark.c:1238
-msgid ""
-"\n"
-"# File marks:\n"
-msgstr ""
-"\n"
-"# ฮฤผฑ๊ผว:\n"
-
-#. Write the jumplist with -'
-#: ../mark.c:1271
-msgid ""
-"\n"
-"# Jumplist (newest first):\n"
-msgstr ""
-"\n"
-"# ฬ๘ืชมะฑํ (ดำะยตฝพษ):\n"
-
-#: ../mark.c:1352
-msgid ""
-"\n"
-"# History of marks within files (newest to oldest):\n"
-msgstr ""
-"\n"
-"# ฮฤผฤฺตฤฑ๊ผวภ๚สทผวยผ (ดำะยตฝพษ):\n"
-
-#: ../mark.c:1431
-msgid "Missing '>'"
-msgstr "ศฑษู '>'"
-
-#: ../memfile.c:426
-msgid "E293: block was not locked"
-msgstr "E293: ฟ้ฮดฑปห๘ถจ"
-
-#: ../memfile.c:799
-msgid "E294: Seek error in swap file read"
-msgstr "E294: ฝปปปฮฤผถมศกถจฮปดํฮ๓"
-
-#: ../memfile.c:803
-msgid "E295: Read error in swap file"
-msgstr "E295: ฝปปปฮฤผถมศกดํฮ๓"
-
-#: ../memfile.c:849
-msgid "E296: Seek error in swap file write"
-msgstr "E296: ฝปปปฮฤผะดศ๋ถจฮปดํฮ๓"
-
-#: ../memfile.c:865
-msgid "E297: Write error in swap file"
-msgstr "E297: ฝปปปฮฤผะดศ๋ดํฮ๓"
-
-#: ../memfile.c:1036
-msgid "E300: Swap file already exists (symlink attack?)"
-msgstr "E300: ฝปปปฮฤผาัดๆิฺ (ท๛บลมฌฝำนฅป๗ฃฟ)"
-
-#: ../memline.c:318
-msgid "E298: Didn't get block nr 0?"
-msgstr "E298: ีาฒปตฝฟ้ 0ฃฟ"
-
-#: ../memline.c:361
-msgid "E298: Didn't get block nr 1?"
-msgstr "E298: ีาฒปตฝฟ้ 1ฃฟ"
-
-#: ../memline.c:377
-msgid "E298: Didn't get block nr 2?"
-msgstr "E298: ีาฒปตฝฟ้ 2ฃฟ"
-
-#. could not (re)open the swap file, what can we do????
-#: ../memline.c:465
-msgid "E301: Oops, lost the swap file!!!"
-msgstr "E301: เฃฌฝปปปฮฤผฒปผ๛มหฃกฃกฃก"
-
-#: ../memline.c:477
-msgid "E302: Could not rename swap file"
-msgstr "E302: ฮทจึุรร๛ฝปปปฮฤผ"
-
-#: ../memline.c:554
-#, c-format
-msgid "E303: Unable to open swap file for \"%s\", recovery impossible"
-msgstr "E303: ฮทจด๒ฟช \"%s\" ตฤฝปปปฮฤผฃฌปึธดฝซฒปฟษฤ"
-
-#: ../memline.c:666
-msgid "E304: ml_upd_block0(): Didn't get block 0??"
-msgstr "E304: ml_upd_block0(): ีาฒปตฝฟ้ 0ฃฟ"
-
-#. no swap files found
-#: ../memline.c:830
-#, c-format
-msgid "E305: No swap file found for %s"
-msgstr "E305: ีาฒปตฝ %s ตฤฝปปปฮฤผ"
-
-#: ../memline.c:839
-msgid "Enter number of swap file to use (0 to quit): "
-msgstr "ว๋สไศ๋าชสนำรตฤฝปปปฮฤผฑเบล (0 อหณ๖): "
-
-#: ../memline.c:879
-#, c-format
-msgid "E306: Cannot open %s"
-msgstr "E306: ฮทจด๒ฟช %s"
-
-#: ../memline.c:897
-msgid "Unable to read block 0 from "
-msgstr "ฮทจถมศกฟ้ 0: "
-
-#: ../memline.c:900
-msgid ""
-"\n"
-"Maybe no changes were made or Vim did not update the swap file."
-msgstr ""
-"\n"
-"ฟษฤฤใรปื๖นศฮบฮะธฤป๒สว Vim ปนภดฒปผฐธะยฝปปปฮฤผกฃ"
-
-#: ../memline.c:909
-msgid " cannot be used with this version of Vim.\n"
-msgstr " ฒปฤิฺธรฐๆฑพตฤ Vim ึะสนำรกฃ\n"
-
-#: ../memline.c:911
-msgid "Use Vim version 3.0.\n"
-msgstr "สนำร Vim 3.0กฃ\n"
-
-#: ../memline.c:916
-#, c-format
-msgid "E307: %s does not look like a Vim swap file"
-msgstr "E307: %s ฟดฦ๐ภดฒปฯ๑สว Vim ฝปปปฮฤผ"
-
-#: ../memline.c:922
-msgid " cannot be used on this computer.\n"
-msgstr " ฒปฤิฺีโฬจต็ฤิษฯสนำรกฃ\n"
-
-#: ../memline.c:924
-msgid "The file was created on "
-msgstr "ดหฮฤผดดฝจำฺ "
-
-#: ../memline.c:928
-msgid ""
-",\n"
-"or the file has been damaged."
-msgstr ""
-"ฃฌ\n"
-"ป๒สวดหฮฤผาัห๐ปตกฃ"
-
-#: ../memline.c:945
-msgid " has been damaged (page size is smaller than minimum value).\n"
-msgstr ""
-
-#: ../memline.c:974
-#, c-format
-msgid "Using swap file \"%s\""
-msgstr "สนำรฝปปปฮฤผ \"%s\""
-
-#: ../memline.c:980
-#, c-format
-msgid "Original file \"%s\""
-msgstr "ิญสผฮฤผ \"%s\""
-
-#: ../memline.c:995
-msgid "E308: Warning: Original file may have been changed"
-msgstr "E308: พฏธๆ: ิญสผฮฤผฟษฤาัฑปะธฤ"
-
-#: ../memline.c:1061
-#, c-format
-msgid "E309: Unable to read block 1 from %s"
-msgstr "E309: ฮทจดำ %s ถมศกฟ้ 1"
-
-# do not translate to avoid writing Chinese in files
-#: ../memline.c:1065
-#, fuzzy
-msgid "???MANY LINES MISSING"
-msgstr "???ศฑษูมหฬซถเะะ"
-
-# do not translate to avoid writing Chinese in files
-#: ../memline.c:1076
-#, fuzzy
-msgid "???LINE COUNT WRONG"
-msgstr "???ะะสดํฮ๓"
-
-# do not translate to avoid writing Chinese in files
-#: ../memline.c:1082
-#, fuzzy
-msgid "???EMPTY BLOCK"
-msgstr "???ฟีตฤฟ้"
-
-# do not translate to avoid writing Chinese in files
-#: ../memline.c:1103
-#, fuzzy
-msgid "???LINES MISSING"
-msgstr "???ศฑษูมหาปะฉะะ"
-
-#: ../memline.c:1128
-#, c-format
-msgid "E310: Block 1 ID wrong (%s not a .swp file?)"
-msgstr "E310: ฟ้ 1 ID ดํฮ๓ (%s ฒปสวฝปปปฮฤผฃฟ)"
-
-# do not translate to avoid writing Chinese in files
-#: ../memline.c:1133
-#, fuzzy
-msgid "???BLOCK MISSING"
-msgstr "???ศฑษูฟ้"
-
-# do not translate to avoid writing Chinese in files
-#: ../memline.c:1147
-#, fuzzy
-msgid "??? from here until ???END lines may be messed up"
-msgstr "??? ดำีโภ๏ตฝ ???END ตฤะะฟษฤาัป์ยา"
-
-# do not translate to avoid writing Chinese in files
-#: ../memline.c:1164
-#, fuzzy
-msgid "??? from here until ???END lines may have been inserted/deleted"
-msgstr "??? ดำีโภ๏ตฝ ???END ตฤะะฟษฤาัฑปฒๅศ๋/ษพณน"
-
-# do not translate to avoid writing Chinese in files
-#: ../memline.c:1181
-#, fuzzy
-msgid "???END"
-msgstr "???END"
-
-#: ../memline.c:1238
-msgid "E311: Recovery Interrupted"
-msgstr "E311: ปึธดาัฑปึะถฯ"
-
-#: ../memline.c:1243
-msgid ""
-"E312: Errors detected while recovering; look for lines starting with ???"
-msgstr "E312: ปึธดสฑทขษ๚ดํฮ๓ฃปว๋ืขาโฟชอทฮช ??? ตฤะะ"
-
-#: ../memline.c:1245
-msgid "See \":help E312\" for more information."
-msgstr "ธถเะลฯขว๋ผ๛ \":help E312\""
-
-#: ../memline.c:1249
-msgid "Recovery completed. You should check if everything is OK."
-msgstr "ปึธดอ๊ฑฯกฃว๋ศทถจาปวะีณฃกฃ"
-
-#: ../memline.c:1251
-msgid ""
-"\n"
-"(You might want to write out this file under another name\n"
-msgstr ""
-"\n"
-"(ฤใฟษฤฯ๋าชฝซีโธ๖ฮฤผมํดๆฮชฑ๐ตฤฮฤผร๛\n"
-
-#: ../memline.c:1252
-#, fuzzy
-msgid "and run diff with the original file to check for changes)"
-msgstr "ิูิหะะ diff ำ๋ิญฮฤผฑศฝฯาิผ์ฒ้สวท๑ำะธฤฑไ)\n"
-
-#: ../memline.c:1254
-msgid "Recovery completed. Buffer contents equals file contents."
-msgstr ""
-
-#: ../memline.c:1255
-#, fuzzy
-msgid ""
-"\n"
-"You may want to delete the .swp file now.\n"
-"\n"
-msgstr ""
-"ศปบ๓ฐั .swp ฮฤผษพต๔กฃ\n"
-"\n"
-
-#. use msg() to start the scrolling properly
-#: ../memline.c:1327
-msgid "Swap files found:"
-msgstr "ีาตฝฝปปปฮฤผ:"
-
-#: ../memline.c:1446
-msgid " In current directory:\n"
-msgstr " ฮปำฺตฑวฐฤฟยผ:\n"
-
-#: ../memline.c:1448
-msgid " Using specified name:\n"
-msgstr " สนำรึธถจตฤร๛ืึ:\n"
-
-#: ../memline.c:1450
-msgid " In directory "
-msgstr " ฮปำฺฤฟยผ "
-
-#: ../memline.c:1465
-msgid " -- none --\n"
-msgstr " -- ฮ --\n"
-
-#: ../memline.c:1527
-msgid " owned by: "
-msgstr " ห๙ำะี฿: "
-
-#: ../memline.c:1529
-msgid " dated: "
-msgstr " ศีฦฺ: "
-
-#: ../memline.c:1532 ../memline.c:3231
-msgid " dated: "
-msgstr " ศีฦฺ: "
-
-#: ../memline.c:1548
-msgid " [from Vim version 3.0]"
-msgstr " [ภดืิ Vim ฐๆฑพ 3.0]"
-
-#: ../memline.c:1550
-msgid " [does not look like a Vim swap file]"
-msgstr " [ฒปฯ๑สว Vim ฝปปปฮฤผ]"
-
-#: ../memline.c:1552
-msgid " file name: "
-msgstr " ฮฤผร๛: "
-
-#: ../memline.c:1558
-msgid ""
-"\n"
-" modified: "
-msgstr ""
-"\n"
-" ะธฤน: "
-
-#: ../memline.c:1559
-msgid "YES"
-msgstr "สว"
-
-#: ../memline.c:1559
-msgid "no"
-msgstr "ท๑"
-
-#: ../memline.c:1562
-msgid ""
-"\n"
-" user name: "
-msgstr ""
-"\n"
-" ำรปงร๛: "
-
-#: ../memline.c:1568
-msgid " host name: "
-msgstr " ึ๗ป๚ร๛: "
-
-#: ../memline.c:1570
-msgid ""
-"\n"
-" host name: "
-msgstr ""
-"\n"
-" ึ๗ป๚ร๛: "
-
-#: ../memline.c:1575
-msgid ""
-"\n"
-" process ID: "
-msgstr ""
-"\n"
-" ฝ๘ณฬ ID: "
-
-#: ../memline.c:1579
-msgid " (still running)"
-msgstr " (ศิิฺิหะะ)"
-
-#: ../memline.c:1586
-msgid ""
-"\n"
-" [not usable on this computer]"
-msgstr ""
-"\n"
-" [ฒปฤิฺฑพป๚ษฯสนำร]"
-
-#: ../memline.c:1590
-msgid " [cannot be read]"
-msgstr " [ฮทจถมศก]"
-
-#: ../memline.c:1593
-msgid " [cannot be opened]"
-msgstr " [ฮทจด๒ฟช]"
-
-#: ../memline.c:1698
-msgid "E313: Cannot preserve, there is no swap file"
-msgstr "E313: ฮทจฑฃม๔ฃฌรปำะฝปปปฮฤผ"
-
-#: ../memline.c:1747
-msgid "File preserved"
-msgstr "ฮฤผาัฑฃม๔"
-
-#: ../memline.c:1749
-msgid "E314: Preserve failed"
-msgstr "E314: ฑฃม๔สงฐ"
-
-#: ../memline.c:1819
-#, c-format
-msgid "E315: ml_get: invalid lnum: %<PRId64>"
-msgstr "E315: ml_get: ฮะงตฤ lnum: %<PRId64>"
-
-#: ../memline.c:1851
-#, c-format
-msgid "E316: ml_get: cannot find line %<PRId64>"
-msgstr "E316: ml_get: ีาฒปตฝตฺ %<PRId64> ะะ"
-
-#: ../memline.c:2236
-msgid "E317: pointer block id wrong 3"
-msgstr "E317: ึธี๋ฟ้ id ดํฮ๓ 3"
-
-#: ../memline.c:2311
-msgid "stack_idx should be 0"
-msgstr "stack_idx ำฆธรสว 0"
-
-#: ../memline.c:2369
-msgid "E318: Updated too many blocks?"
-msgstr "E318: ธะยมหฬซถเตฤฟ้ฃฟ"
-
-#: ../memline.c:2511
-msgid "E317: pointer block id wrong 4"
-msgstr "E317: ึธี๋ฟ้ id ดํฮ๓ 4"
-
-#: ../memline.c:2536
-msgid "deleted block 1?"
-msgstr "ษพณมหฟ้ 1ฃฟ"
-
-#: ../memline.c:2707
-#, c-format
-msgid "E320: Cannot find line %<PRId64>"
-msgstr "E320: ีาฒปตฝตฺ %<PRId64> ะะ"
-
-#: ../memline.c:2916
-msgid "E317: pointer block id wrong"
-msgstr "E317: ึธี๋ฟ้ id ดํฮ๓"
-
-#: ../memline.c:2930
-msgid "pe_line_count is zero"
-msgstr "pe_line_count ฮชมใ"
-
-#: ../memline.c:2955
-#, c-format
-msgid "E322: line number out of range: %<PRId64> past the end"
-msgstr "E322: ะะบลณฌณ๖ทถฮง: %<PRId64> ณฌณ๖ฝแฮฒ"
-
-#: ../memline.c:2959
-#, c-format
-msgid "E323: line count wrong in block %<PRId64>"
-msgstr "E323: ฟ้ %<PRId64> ะะสดํฮ๓"
-
-#: ../memline.c:2999
-msgid "Stack size increases"
-msgstr "ถัีปด๓ะกิ๖ผำ"
-
-#: ../memline.c:3038
-msgid "E317: pointer block id wrong 2"
-msgstr "E317: ึธี๋ฟ้ id ดํฮ๓ 2"
-
-#: ../memline.c:3070
-#, c-format
-msgid "E773: Symlink loop for \"%s\""
-msgstr "E773: \"%s\" ท๛บลมฌฝำณ๖ฯึัญปท"
-
-#: ../memline.c:3221
-msgid "E325: ATTENTION"
-msgstr "E325: ืขาโ"
-
-#: ../memline.c:3222
-msgid ""
-"\n"
-"Found a swap file by the name \""
-msgstr ""
-"\n"
-"ทขฯึฝปปปฮฤผ \""
-
-#: ../memline.c:3226
-msgid "While opening file \""
-msgstr "ีิฺด๒ฟชฮฤผ \""
-
-#: ../memline.c:3239
-msgid " NEWER than swap file!\n"
-msgstr " ฑศฝปปปฮฤผะยฃก\n"
-
-#: ../memline.c:3244
-#, fuzzy
-msgid ""
-"\n"
-"(1) Another program may be editing the same file. If this is the case,\n"
-" be careful not to end up with two different instances of the same\n"
-" file when making changes."
-msgstr ""
-"\n"
-"(1) มําปธ๖ณฬะ๒ฟษฤาฒิฺฑเผญอฌาปธ๖ฮฤผกฃ\n"
-" ศ็น๛สวีโั๙ฃฌะธฤสฑว๋ืขาโฑรโอฌาปธ๖ฮฤผฒ๚ษ๚มฝธ๖ฒปอฌตฤฐๆฑพกฃ\n"
-"\n"
-
-#: ../memline.c:3245
-#, fuzzy
-msgid " Quit, or continue with caution.\n"
-msgstr " อหณ๖ฃฌป๒ะกะฤตุผฬะ๘กฃ\n"
-
-#: ../memline.c:3246
-#, fuzzy
-msgid "(2) An edit session for this file crashed.\n"
-msgstr ""
-"\n"
-"(2) ษฯดฮฑเผญดหฮฤผสฑฑภภฃกฃ\n"
-
-#: ../memline.c:3247
-msgid " If this is the case, use \":recover\" or \"vim -r "
-msgstr " ศ็น๛สวีโั๙ฃฌว๋ำร \":recover\" ป๒ \"vim -r "
-
-#: ../memline.c:3249
-msgid ""
-"\"\n"
-" to recover the changes (see \":help recovery\").\n"
-msgstr ""
-"\"\n"
-" ปึธดะธฤตฤฤฺศ (ว๋ผ๛ \":help recovery\")กฃ\n"
-
-#: ../memline.c:3250
-msgid " If you did this already, delete the swap file \""
-msgstr " ศ็น๛ฤใาัพญฝ๘ะะมหปึธดฃฌว๋ษพณฝปปปฮฤผ \""
-
-#: ../memline.c:3252
-msgid ""
-"\"\n"
-" to avoid this message.\n"
-msgstr ""
-"\"\n"
-" าิฑรโิูฟดตฝดหฯ๛ฯขกฃ\n"
-
-#: ../memline.c:3450 ../memline.c:3452
-msgid "Swap file \""
-msgstr "ฝปปปฮฤผ \""
-
-#: ../memline.c:3451 ../memline.c:3455
-msgid "\" already exists!"
-msgstr "\" าัดๆิฺฃก"
-
-#: ../memline.c:3457
-msgid "VIM - ATTENTION"
-msgstr "VIM - ืขาโ"
-
-#: ../memline.c:3459
-msgid "Swap file already exists!"
-msgstr "ฝปปปฮฤผาัดๆิฺฃก"
-
-#: ../memline.c:3464
-msgid ""
-"&Open Read-Only\n"
-"&Edit anyway\n"
-"&Recover\n"
-"&Quit\n"
-"&Abort"
-msgstr ""
-"าิึปถมทฝสฝด๒ฟช(&O)\n"
-"ึฑฝำฑเผญ(&E)\n"
-"ปึธด(&R)\n"
-"อหณ๖(&Q)\n"
-"ึะึน(&A)"
-
-#: ../memline.c:3467
-msgid ""
-"&Open Read-Only\n"
-"&Edit anyway\n"
-"&Recover\n"
-"&Delete it\n"
-"&Quit\n"
-"&Abort"
-msgstr ""
-"าิึปถมทฝสฝด๒ฟช(&O)\n"
-"ึฑฝำฑเผญ(&E)\n"
-"ปึธด(&R)\n"
-"ษพณฝปปปฮฤผ(&D)\n"
-"อหณ๖(&Q)\n"
-"ึะึน(&A)"
-
-#.
-#. * Change the ".swp" extension to find another file that can be used.
-#. * First decrement the last char: ".swo", ".swn", etc.
-#. * If that still isn't enough decrement the last but one char: ".svz"
-#. * Can happen when editing many "No Name" buffers.
-#.
-#. ".s?a"
-#. ".saa": tried enough, give up
-#: ../memline.c:3528
-msgid "E326: Too many swap files found"
-msgstr "E326: ีาตฝฬซถเฝปปปฮฤผ"
-
-#: ../memory.c:227
-#, c-format
-msgid "E342: Out of memory! (allocating %<PRIu64> bytes)"
-msgstr "E342: ฤฺดๆฒปืใฃก(ทึลไ %<PRIu64> ืึฝฺ)"
-
-#: ../menu.c:62
-msgid "E327: Part of menu-item path is not sub-menu"
-msgstr "E327: ฒหตฅฯ๎ตฤฤณฒฟทึยทพถฒปสวืำฒหตฅ"
-
-#: ../menu.c:63
-msgid "E328: Menu only exists in another mode"
-msgstr "E328: ฒหตฅึปิฺฦไหฤฃสฝึะดๆิฺ"
-
-#: ../menu.c:64
-#, c-format
-msgid "E329: No menu \"%s\""
-msgstr "E329: รปำะฒหตฅ \"%s\""
-
-#. Only a mnemonic or accelerator is not valid.
-#: ../menu.c:329
-#, fuzzy
-msgid "E792: Empty menu name"
-msgstr "E749: ฟีตฤปบณๅว๘"
-
-#: ../menu.c:340
-msgid "E330: Menu path must not lead to a sub-menu"
-msgstr "E330: ฒหตฅยทพถฒปฤึธฯ๒ืำฒหตฅ"
-
-#: ../menu.c:365
-msgid "E331: Must not add menu items directly to menu bar"
-msgstr "E331: ฒปฤฐัฒหตฅฯ๎ึฑฝำผำตฝฒหตฅภธึะ"
-
-#: ../menu.c:370
-msgid "E332: Separator cannot be part of a menu path"
-msgstr "E332: ทึธ๔ฯ฿ฒปฤสวฒหตฅยทพถตฤาปฒฟทึ"
-
-#. Now we have found the matching menu, and we list the mappings
-#. Highlight title
-#: ../menu.c:762
-msgid ""
-"\n"
-"--- Menus ---"
-msgstr ""
-"\n"
-"--- ฒหตฅ ---"
-
-#: ../menu.c:1313
-msgid "E333: Menu path must lead to a menu item"
-msgstr "E333: ฒหตฅยทพถฑุะ๋ึธฯ๒ฒหตฅฯ๎"
-
-#: ../menu.c:1330
-#, c-format
-msgid "E334: Menu not found: %s"
-msgstr "E334: ีาฒปตฝฒหตฅ: %s"
-
-#: ../menu.c:1396
-#, c-format
-msgid "E335: Menu not defined for %s mode"
-msgstr "E335: %s ฤฃสฝึะฒหตฅฮดถจาๅ"
-
-#: ../menu.c:1426
-msgid "E336: Menu path must lead to a sub-menu"
-msgstr "E336: ฒหตฅยทพถฑุะ๋ึธฯ๒ืำฒหตฅ"
-
-#: ../menu.c:1447
-msgid "E337: Menu not found - check menu names"
-msgstr "E337: ีาฒปตฝฒหตฅ - ว๋ผ์ฒ้ฒหตฅร๛ณฦ"
-
-#: ../message.c:423
-#, c-format
-msgid "Error detected while processing %s:"
-msgstr "ดฆภํ %s สฑทขษ๚ดํฮ๓:"
-
-#: ../message.c:445
-#, c-format
-msgid "line %4ld:"
-msgstr "ตฺ %4ld ะะ:"
-
-#: ../message.c:617
-#, c-format
-msgid "E354: Invalid register name: '%s'"
-msgstr "E354: ฮะงตฤผฤดๆฦ๗ร๛: '%s'"
-
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr "ผ๒ฬๅึะฮฤฯ๛ฯขฮฌปคี฿: Yuheng Xie <elephant@linux.net.cn>"
-
-#: ../message.c:986
-msgid "Interrupt: "
-msgstr "าัึะถฯ: "
-
-#: ../message.c:988
-msgid "Press ENTER or type command to continue"
-msgstr "ว๋ฐด ENTER ป๒ฦไหรม๎ผฬะ๘"
-
-#: ../message.c:1843
-#, c-format
-msgid "%s line %<PRId64>"
-msgstr "%s ตฺ %<PRId64> ะะ"
-
-#: ../message.c:2392
-msgid "-- More --"
-msgstr "-- ธถเ --"
-
-#: ../message.c:2398
-msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "
-msgstr " ฟีธ๑/d/j: ฦมฤป/าณ/ะะ ฯยทญฃฌb/u/k: ษฯทญฃฌq: อหณ๖ "
-
-#: ../message.c:3021 ../message.c:3031
-msgid "Question"
-msgstr "ฮสฬโ"
-
-#: ../message.c:3023
-msgid ""
-"&Yes\n"
-"&No"
-msgstr ""
-"สว(&Y)\n"
-"ท๑(&N)"
-
-#: ../message.c:3033
-msgid ""
-"&Yes\n"
-"&No\n"
-"&Cancel"
-msgstr ""
-"สว(&Y)\n"
-"ท๑(&N)\n"
-"ศกฯ๛(&C)"
-
-#: ../message.c:3045
-msgid ""
-"&Yes\n"
-"&No\n"
-"Save &All\n"
-"&Discard All\n"
-"&Cancel"
-msgstr ""
-"สว(&Y)\n"
-"ท๑(&N)\n"
-"ศซฒฟฑฃดๆ(&A)\n"
-"ศซฒฟถชฦ๚(&D)\n"
-"ศกฯ๛(&C)"
-
-#: ../message.c:3058
-msgid "E766: Insufficient arguments for printf()"
-msgstr "E766: printf() ตฤฒฮสฒปืใ"
-
-#: ../message.c:3119
-#, fuzzy
-msgid "E807: Expected Float argument for printf()"
-msgstr "E766: printf() ตฤฒฮสฒปืใ"
-
-#: ../message.c:3873
-msgid "E767: Too many arguments to printf()"
-msgstr "E767: printf() ตฤฒฮสนถเ"
-
-#: ../misc1.c:2256
-msgid "W10: Warning: Changing a readonly file"
-msgstr "W10: พฏธๆ: ีิฺะธฤาปธ๖ึปถมฮฤผ"
-
-#: ../misc1.c:2537
-#, fuzzy
-msgid "Type number and <Enter> or click with mouse (empty cancels): "
-msgstr "ว๋สไศ๋สืึป๒ตใป๗ส๓ฑ๊ (<Enter> ศกฯ๛): "
-
-#: ../misc1.c:2539
-#, fuzzy
-msgid "Type number and <Enter> (empty cancels): "
-msgstr "ว๋ักิ๑สืึ (<Enter> ศกฯ๛): "
-
-#: ../misc1.c:2585
-msgid "1 more line"
-msgstr "ถเมห 1 ะะ"
-
-#: ../misc1.c:2588
-msgid "1 line less"
-msgstr "ษูมห 1 ะะ"
-
-#: ../misc1.c:2593
-#, c-format
-msgid "%<PRId64> more lines"
-msgstr "ถเมห %<PRId64> ะะ"
-
-#: ../misc1.c:2596
-#, c-format
-msgid "%<PRId64> fewer lines"
-msgstr "ษูมห %<PRId64> ะะ"
-
-#: ../misc1.c:2599
-msgid " (Interrupted)"
-msgstr " (าัึะถฯ)"
-
-#: ../misc1.c:2635
-msgid "Beep!"
-msgstr "Beep!"
-
-#: ../misc2.c:738
-#, c-format
-msgid "Calling shell to execute: \"%s\""
-msgstr "ต๗ำร shell ึดะะ: \"%s\""
-
-#: ../normal.c:183
-msgid "E349: No identifier under cursor"
-msgstr "E349: นโฑ๊ดฆรปำะสถฑ๐ืึ"
-
-#: ../normal.c:1866
-msgid "E774: 'operatorfunc' is empty"
-msgstr "E774: 'operatorfunc' ฮชฟี"
-
-#: ../normal.c:2637
-msgid "Warning: terminal cannot highlight"
-msgstr "พฏธๆ: ฤใตฤึีถหฒปฤฯิสพธ฿มม"
-
-#: ../normal.c:2807
-msgid "E348: No string under cursor"
-msgstr "E348: นโฑ๊ดฆรปำะืึท๛ดฎ"
-
-#: ../normal.c:3937
-msgid "E352: Cannot erase folds with current 'foldmethod'"
-msgstr "E352: ฒปฤิฺตฑวฐตฤ 'foldmethod' ฯยษพณ fold"
-
-#: ../normal.c:5897
-msgid "E664: changelist is empty"
-msgstr "E664: ธฤฑไมะฑํฮชฟี"
-
-#: ../normal.c:5899
-msgid "E662: At start of changelist"
-msgstr "E662: าัิฺธฤฑไมะฑํตฤฟชสผดฆ"
-
-#: ../normal.c:5901
-msgid "E663: At end of changelist"
-msgstr "E663: าัิฺธฤฑไมะฑํตฤฤฉฮฒดฆ"
-
-#: ../normal.c:7053
-msgid "Type :quit<Enter> to exit Nvim"
-msgstr "สไศ๋ :quit<Enter> อหณ๖ Vim"
-
-#: ../ops.c:248
-#, c-format
-msgid "1 line %sed 1 time"
-msgstr "1 ะะ %s มห 1 ดฮ"
-
-#: ../ops.c:250
-#, c-format
-msgid "1 line %sed %d times"
-msgstr "1 ะะ %s มห %d ดฮ"
-
-#: ../ops.c:253
-#, c-format
-msgid "%<PRId64> lines %sed 1 time"
-msgstr "%<PRId64> ะะ %s มห 1 ดฮ"
-
-#: ../ops.c:256
-#, c-format
-msgid "%<PRId64> lines %sed %d times"
-msgstr "%<PRId64> ะะ %s มห %d ดฮ"
-
-#: ../ops.c:592
-#, c-format
-msgid "%<PRId64> lines to indent... "
-msgstr "ห๕ฝ๘ %<PRId64> ะะกญกญ "
-
-#: ../ops.c:634
-msgid "1 line indented "
-msgstr "ห๕ฝ๘มห 1 ะะ "
-
-#: ../ops.c:636
-#, c-format
-msgid "%<PRId64> lines indented "
-msgstr "ห๕ฝ๘มห %<PRId64> ะะ "
-
-#: ../ops.c:938
-msgid "E748: No previously used register"
-msgstr "E748: รปำะวฐาปธ๖สนำรตฤผฤดๆฦ๗"
-
-#. must display the prompt
-#: ../ops.c:1433
-msgid "cannot yank; delete anyway"
-msgstr "ฮทจธดึฦฃปธฤฮชษพณ"
-
-#: ../ops.c:1929
-msgid "1 line changed"
-msgstr "ธฤฑไมห 1 ะะ"
-
-#: ../ops.c:1931
-#, c-format
-msgid "%<PRId64> lines changed"
-msgstr "ธฤฑไมห %<PRId64> ะะ"
-
-#: ../ops.c:2521
-msgid "block of 1 line yanked"
-msgstr "ธดึฦมห 1 ะะตฤฟ้"
-
-#: ../ops.c:2523
-msgid "1 line yanked"
-msgstr "ธดึฦมห 1 ะะ"
-
-#: ../ops.c:2525
-#, c-format
-msgid "block of %<PRId64> lines yanked"
-msgstr "ธดึฦมห %<PRId64> ะะตฤฟ้"
-
-#: ../ops.c:2528
-#, c-format
-msgid "%<PRId64> lines yanked"
-msgstr "ธดึฦมห %<PRId64> ะะ"
-
-#: ../ops.c:2710
-#, c-format
-msgid "E353: Nothing in register %s"
-msgstr "E353: ผฤดๆฦ๗ %s ภ๏รปำะถซฮ๗"
-
-#. Highlight title
-#: ../ops.c:3185
-msgid ""
-"\n"
-"--- Registers ---"
-msgstr ""
-"\n"
-"--- ผฤดๆฦ๗ ---"
-
-#: ../ops.c:4455
-msgid "Illegal register name"
-msgstr "ฮะงตฤผฤดๆฦ๗ร๛"
-
-#: ../ops.c:4533
-msgid ""
-"\n"
-"# Registers:\n"
-msgstr ""
-"\n"
-"# ผฤดๆฦ๗:\n"
-
-#: ../ops.c:4575
-#, c-format
-msgid "E574: Unknown register type %d"
-msgstr "E574: ฮดึชตฤผฤดๆฦ๗ภเะอ %d"
-
-#: ../ops.c:5089
-#, c-format
-msgid "%<PRId64> Cols; "
-msgstr "%<PRId64> มะ; "
-
-#: ../ops.c:5097
-#, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Bytes"
-msgstr ""
-"ักิ๑มห %s%<PRId64>/%<PRId64> ะะ; %<PRId64>/%<PRId64> ธ๖ดส; %<PRId64>/"
-"%<PRId64> ธ๖ืึฝฺ"
-
-#: ../ops.c:5105
-#, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Chars; %<PRId64> of %<PRId64> Bytes"
-msgstr ""
-"ักิ๑มห %s%<PRId64>/%<PRId64> ะะ; %<PRId64>/%<PRId64> ธ๖ดส; %<PRId64>/"
-"%<PRId64> ธ๖ืึท๛; %<PRId64>/%<PRId64> ธ๖ืึฝฺ"
-
-#: ../ops.c:5123
-#, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Byte "
-"%<PRId64> of %<PRId64>"
-msgstr ""
-"ตฺ %s/%s มะ; ตฺ %<PRId64>/%<PRId64> ะะ; ตฺ %<PRId64>/%<PRId64> ธ๖ดส; ตฺ "
-"%<PRId64>/%<PRId64> ธ๖ืึฝฺ"
-
-#: ../ops.c:5133
-#, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Char "
-"%<PRId64> of %<PRId64>; Byte %<PRId64> of %<PRId64>"
-msgstr ""
-"ตฺ %s/%s มะ; ตฺ %<PRId64>/%<PRId64> ะะ; ตฺ %<PRId64>/%<PRId64> ธ๖ดส; ตฺ "
-"%<PRId64>/%<PRId64> ธ๖ืึท๛; ตฺ %<PRId64>/%<PRId64> ธ๖ืึฝฺ"
-
-#: ../ops.c:5146
-#, c-format
-msgid "(+%<PRId64> for BOM)"
-msgstr ""
-
-#: ../option.c:1238
-msgid "%<%f%h%m%=Page %N"
-msgstr ""
-
-#: ../option.c:1574
-msgid "Thanks for flying Vim"
-msgstr "ธะะปฤ๚ักิ๑ Vim"
-
-#. found a mismatch: skip
-#: ../option.c:2698
-msgid "E518: Unknown option"
-msgstr "E518: ฮดึชตฤักฯ๎"
-
-#: ../option.c:2709
-msgid "E519: Option not supported"
-msgstr "E519: ฒปึงณึธรักฯ๎"
-
-#: ../option.c:2740
-msgid "E520: Not allowed in a modeline"
-msgstr "E520: ฒปิสะํิฺ modeline ึะสนำร"
-
-#: ../option.c:2815
-msgid "E846: Key code not set"
-msgstr ""
-
-#: ../option.c:2924
-msgid "E521: Number required after ="
-msgstr "E521: = บ๓รๆะ่าชสืึ"
-
-#: ../option.c:3226 ../option.c:3864
-msgid "E522: Not found in termcap"
-msgstr "E522: Termcap ภ๏รๆีาฒปตฝ"
-
-#: ../option.c:3335
-#, c-format
-msgid "E539: Illegal character <%s>"
-msgstr "E539: ฮะงตฤืึท๛ <%s>"
-
-#: ../option.c:3862
-msgid "E529: Cannot set 'term' to empty string"
-msgstr "E529: ฒปฤษ่ถจ 'term' ฮชฟีืึท๛ดฎ"
-
-#: ../option.c:3885
-msgid "E589: 'backupext' and 'patchmode' are equal"
-msgstr "E589: 'backupext' บอ 'patchmode' ฯเตศ"
-
-#: ../option.c:3964
-msgid "E834: Conflicts with value of 'listchars'"
-msgstr ""
-
-#: ../option.c:3966
-msgid "E835: Conflicts with value of 'fillchars'"
-msgstr ""
-
-#: ../option.c:4163
-msgid "E524: Missing colon"
-msgstr "E524: ศฑษูรฐบล"
-
-#: ../option.c:4165
-msgid "E525: Zero length string"
-msgstr "E525: ืึท๛ดฎณคถศฮชมใ"
-
-#: ../option.c:4220
-#, c-format
-msgid "E526: Missing number after <%s>"
-msgstr "E526: <%s> บ๓รๆศฑษูสืึ"
-
-#: ../option.c:4232
-msgid "E527: Missing comma"
-msgstr "E527: ศฑษูถบบล"
-
-#: ../option.c:4239
-msgid "E528: Must specify a ' value"
-msgstr "E528: ฑุะ๋ึธถจาปธ๖ ' ึต"
-
-#: ../option.c:4271
-msgid "E595: contains unprintable or wide character"
-msgstr "E595: ฐบฌฒปฟษฯิสพืึท๛ป๒ฟํืึท๛"
-
-#: ../option.c:4469
-#, c-format
-msgid "E535: Illegal character after <%c>"
-msgstr "E535: <%c> บ๓รๆำะฮะงตฤืึท๛"
-
-#: ../option.c:4534
-msgid "E536: comma required"
-msgstr "E536: ะ่าชถบบล"
-
-#: ../option.c:4543
-#, c-format
-msgid "E537: 'commentstring' must be empty or contain %s"
-msgstr "E537: 'commentstring' ฑุะ๋ฮชฟีป๒ฐบฌ %s"
-
-#: ../option.c:4928
-msgid "E540: Unclosed expression sequence"
-msgstr "E540: รปำะฝแส๘ตฤฑํด๏สฝะ๒มะ"
-
-#: ../option.c:4932
-msgid "E541: too many items"
-msgstr "E541: ฯ๎ฤฟนถเ"
-
-#: ../option.c:4934
-msgid "E542: unbalanced groups"
-msgstr "E542: ดํยาตฤื้"
-
-#: ../option.c:5148
-msgid "E590: A preview window already exists"
-msgstr "E590: ิคภภดฐฟฺาัดๆิฺ"
-
-#: ../option.c:5311
-msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'"
-msgstr "W17: Arabic ะ่าช UTF-8ฃฌว๋ึดะะ ':set encoding=utf-8'"
-
-#: ../option.c:5623
-#, c-format
-msgid "E593: Need at least %d lines"
-msgstr "E593: ึมษูะ่าช %d ะะ"
-
-#: ../option.c:5631
-#, c-format
-msgid "E594: Need at least %d columns"
-msgstr "E594: ึมษูะ่าช %d มะ"
-
-#: ../option.c:6011
-#, c-format
-msgid "E355: Unknown option: %s"
-msgstr "E355: ฮดึชตฤักฯ๎: %s"
-
-#. There's another character after zeros or the string
-#. * is empty. In both cases, we are trying to set a
-#. * num option using a string.
-#: ../option.c:6037
-#, fuzzy, c-format
-msgid "E521: Number required: &%s = '%s'"
-msgstr "E521: = บ๓รๆะ่าชสืึ"
-
-#: ../option.c:6149
-msgid ""
-"\n"
-"--- Terminal codes ---"
-msgstr ""
-"\n"
-"--- ึีถหฑเย๋ ---"
-
-#: ../option.c:6151
-msgid ""
-"\n"
-"--- Global option values ---"
-msgstr ""
-"\n"
-"--- ศซพึักฯ๎ึต ---"
-
-#: ../option.c:6153
-msgid ""
-"\n"
-"--- Local option values ---"
-msgstr ""
-"\n"
-"--- พึฒฟักฯ๎ึต ---"
-
-#: ../option.c:6155
-msgid ""
-"\n"
-"--- Options ---"
-msgstr ""
-"\n"
-"--- ักฯ๎ ---"
-
-#: ../option.c:6816
-msgid "E356: get_varp ERROR"
-msgstr "E356: get_varp ดํฮ๓"
-
-#: ../option.c:7696
-#, c-format
-msgid "E357: 'langmap': Matching character missing for %s"
-msgstr "E357: 'langmap': ีาฒปตฝ %s ถิำฆตฤืึท๛"
-
-#: ../option.c:7715
-#, c-format
-msgid "E358: 'langmap': Extra characters after semicolon: %s"
-msgstr "E358: 'langmap': ทึบลบ๓ำะถเำเตฤืึท๛: %s"
-
-#: ../os/shell.c:194
-msgid ""
-"\n"
-"Cannot execute shell "
-msgstr ""
-"\n"
-"ฮทจึดะะ shell"
-
-#: ../os/shell.c:439
-msgid ""
-"\n"
-"shell returned "
-msgstr ""
-"\n"
-"Shell าัทตปุ"
-
-#: ../os_unix.c:465 ../os_unix.c:471
-msgid ""
-"\n"
-"Could not get security context for "
-msgstr ""
-
-#: ../os_unix.c:479
-msgid ""
-"\n"
-"Could not set security context for "
-msgstr ""
-
-# do not translate
-#: ../os_unix.c:1558 ../os_unix.c:1647
-#, c-format
-msgid "dlerror = \"%s\""
-msgstr "dlerror = \"%s\""
-
-#: ../path.c:1449
-#, c-format
-msgid "E447: Can't find file \"%s\" in path"
-msgstr "E447: ิฺยทพถึะีาฒปตฝฮฤผ \"%s\""
-
-#: ../quickfix.c:359
-#, c-format
-msgid "E372: Too many %%%c in format string"
-msgstr "E372: ธ๑สฝปฏืึท๛ดฎภ๏ำะฬซถเ %%%c "
-
-#: ../quickfix.c:371
-#, c-format
-msgid "E373: Unexpected %%%c in format string"
-msgstr "E373: ธ๑สฝปฏืึท๛ดฎฒปำฆธรณ๖ฯึ %%%c "
-
-#: ../quickfix.c:420
-msgid "E374: Missing ] in format string"
-msgstr "E374: ธ๑สฝปฏืึท๛ดฎภ๏ษูมห ]"
-
-#: ../quickfix.c:431
-#, c-format
-msgid "E375: Unsupported %%%c in format string"
-msgstr "E375: ธ๑สฝปฏืึท๛ดฎภ๏ำะฒปึงณึตฤ %%%c "
-
-#: ../quickfix.c:448
-#, c-format
-msgid "E376: Invalid %%%c in format string prefix"
-msgstr "E376: ธ๑สฝปฏืึท๛ดฎฟชอทภ๏ำะฒปีศทตฤ %%%c "
-
-#: ../quickfix.c:454
-#, c-format
-msgid "E377: Invalid %%%c in format string"
-msgstr "E377: ธ๑สฝปฏืึท๛ดฎภ๏ำะฒปีศทตฤ %%%c "
-
-#. nothing found
-#: ../quickfix.c:477
-msgid "E378: 'errorformat' contains no pattern"
-msgstr "E378: 'errorformat' ฮดษ่ถจ"
-
-#: ../quickfix.c:695
-msgid "E379: Missing or empty directory name"
-msgstr "E379: ีาฒปตฝฤฟยผร๛ณฦป๒สวฟีตฤฤฟยผร๛ณฦ"
-
-#: ../quickfix.c:1305
-msgid "E553: No more items"
-msgstr "E553: รปำะธถเตฤฯ๎"
-
-#: ../quickfix.c:1674
-#, c-format
-msgid "(%d of %d)%s%s: "
-msgstr "(%d / %d)%s%s: "
-
-#: ../quickfix.c:1676
-msgid " (line deleted)"
-msgstr " (ะะาัษพณ)"
-
-#: ../quickfix.c:1863
-msgid "E380: At bottom of quickfix stack"
-msgstr "E380: Quickfix ถัีปตืถห"
-
-#: ../quickfix.c:1869
-msgid "E381: At top of quickfix stack"
-msgstr "E381: Quickfix ถัีปถฅถห"
-
-#: ../quickfix.c:1880
-#, c-format
-msgid "error list %d of %d; %d errors"
-msgstr "ดํฮ๓มะฑํ %d / %dฃปนฒ %d ธ๖ดํฮ๓"
-
-#: ../quickfix.c:2427
-msgid "E382: Cannot write, 'buftype' option is set"
-msgstr "E382: ฮทจะดศ๋ฃฌาัษ่ถจักฯ๎ 'buftype'"
-
-#: ../quickfix.c:2812
-msgid "E683: File name missing or invalid pattern"
-msgstr "E683: ศฑษูฮฤผร๛ป๒ฤฃสฝฮะง"
-
-#: ../quickfix.c:2911
-#, c-format
-msgid "Cannot open file \"%s\""
-msgstr "ฮทจด๒ฟชฮฤผ \"%s\""
-
-#: ../quickfix.c:3429
-msgid "E681: Buffer is not loaded"
-msgstr "E681: ปบณๅว๘ฮดผำิุ"
-
-#: ../quickfix.c:3487
-msgid "E777: String or List expected"
-msgstr "E777: ดหดฆะ่าช String ป๒ี฿ List"
-
-#: ../regexp.c:359
-#, c-format
-msgid "E369: invalid item in %s%%[]"
-msgstr "E369: %s%%[] ึะำะฮะงตฤฯ๎"
-
-#: ../regexp.c:374
-#, c-format
-msgid "E769: Missing ] after %s["
-msgstr "E769: %s[ บ๓ศฑษู ]"
-
-#: ../regexp.c:375
-#, c-format
-msgid "E53: Unmatched %s%%("
-msgstr "E53: ฒปฦฅลไตฤ %s%%("
-
-#: ../regexp.c:376
-#, c-format
-msgid "E54: Unmatched %s("
-msgstr "E54: ฒปฦฅลไตฤ %s("
-
-#: ../regexp.c:377
-#, c-format
-msgid "E55: Unmatched %s)"
-msgstr "E55: ฒปฦฅลไตฤ %s)"
-
-#: ../regexp.c:378
-msgid "E66: \\z( not allowed here"
-msgstr "E66: ดหดฆฒปิสะํ \\z("
-
-#: ../regexp.c:379
-msgid "E67: \\z1 et al. not allowed here"
-msgstr "E67: ดหดฆฒปิสะํ \\z1 ตศ"
-
-#: ../regexp.c:380
-#, c-format
-msgid "E69: Missing ] after %s%%["
-msgstr "E69: %s%%[ บ๓ศฑษู ]"
-
-#: ../regexp.c:381
-#, c-format
-msgid "E70: Empty %s%%[]"
-msgstr "E70: ฟีตฤ %s%%[]"
-
-#: ../regexp.c:1209 ../regexp.c:1224
-msgid "E339: Pattern too long"
-msgstr "E339: ฤฃสฝฬซณค"
-
-#: ../regexp.c:1371
-msgid "E50: Too many \\z("
-msgstr "E50: ฬซถเ \\z("
-
-#: ../regexp.c:1378
-#, c-format
-msgid "E51: Too many %s("
-msgstr "E51: ฬซถเ %s("
-
-#: ../regexp.c:1427
-msgid "E52: Unmatched \\z("
-msgstr "E52: ฒปฦฅลไตฤ \\z("
-
-#: ../regexp.c:1637
-#, c-format
-msgid "E59: invalid character after %s@"
-msgstr "E59: %s@ บ๓รๆำะฮะงตฤืึท๛"
-
-#: ../regexp.c:1672
-#, c-format
-msgid "E60: Too many complex %s{...}s"
-msgstr "E60: ฬซถเธดิำตฤ %s{...}s"
-
-#: ../regexp.c:1687
-#, c-format
-msgid "E61: Nested %s*"
-msgstr "E61: วถฬืตฤ %s*"
-
-#: ../regexp.c:1690
-#, c-format
-msgid "E62: Nested %s%c"
-msgstr "E62: วถฬืตฤ %s%c"
-
-#: ../regexp.c:1800
-msgid "E63: invalid use of \\_"
-msgstr "E63: ฒปีศทตุสนำร \\_"
-
-#: ../regexp.c:1850
-#, c-format
-msgid "E64: %s%c follows nothing"
-msgstr "E64: %s%c วฐรๆฮฤฺศ"
-
-#: ../regexp.c:1902
-msgid "E65: Illegal back reference"
-msgstr "E65: ฮะงตฤปุา"
-
-#: ../regexp.c:1943
-msgid "E68: Invalid character after \\z"
-msgstr "E68: \\z บ๓รๆำะฮะงตฤืึท๛"
-
-#: ../regexp.c:2049 ../regexp_nfa.c:1296
-#, c-format
-msgid "E678: Invalid character after %s%%[dxouU]"
-msgstr "E678: %s%%[dxouU] บ๓รๆำะฮะงตฤืึท๛"
-
-#: ../regexp.c:2107
-#, c-format
-msgid "E71: Invalid character after %s%%"
-msgstr "E71: %s%% บ๓รๆำะฮะงตฤืึท๛"
-
-#: ../regexp.c:3017
-#, c-format
-msgid "E554: Syntax error in %s{...}"
-msgstr "E554: %s{...} ึะำ๏ทจดํฮ๓"
-
-#: ../regexp.c:3805
-msgid "External submatches:\n"
-msgstr "อโฒฟท๛บฯ:\n"
-
-#: ../regexp.c:7022
-msgid ""
-"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be "
-"used "
-msgstr ""
-
-#: ../regexp_nfa.c:239
-msgid "E865: (NFA) Regexp end encountered prematurely"
-msgstr ""
-
-#: ../regexp_nfa.c:240
-#, c-format
-msgid "E866: (NFA regexp) Misplaced %c"
-msgstr ""
-
-#: ../regexp_nfa.c:242
-#, c-format
-msgid "E877: (NFA regexp) Invalid character class: %<PRId64>"
-msgstr ""
-
-#: ../regexp_nfa.c:1261
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\z%c'"
-msgstr ""
-
-#: ../regexp_nfa.c:1387
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\%%%c'"
-msgstr ""
-
-#: ../regexp_nfa.c:1802
-#, c-format
-msgid "E869: (NFA) Unknown operator '\\@%c'"
-msgstr ""
-
-#: ../regexp_nfa.c:1831
-msgid "E870: (NFA regexp) Error reading repetition limits"
-msgstr ""
-
-#. Can't have a multi follow a multi.
-#: ../regexp_nfa.c:1895
-msgid "E871: (NFA regexp) Can't have a multi follow a multi !"
-msgstr ""
-
-#. Too many `('
-#: ../regexp_nfa.c:2037
-msgid "E872: (NFA regexp) Too many '('"
-msgstr ""
-
-#: ../regexp_nfa.c:2042
-#, fuzzy
-msgid "E879: (NFA regexp) Too many \\z("
-msgstr "E50: ฬซถเ \\z("
-
-#: ../regexp_nfa.c:2066
-msgid "E873: (NFA regexp) proper termination error"
-msgstr ""
-
-#: ../regexp_nfa.c:2599
-msgid "E874: (NFA) Could not pop the stack !"
-msgstr ""
-
-#: ../regexp_nfa.c:3298
-msgid ""
-"E875: (NFA regexp) (While converting from postfix to NFA), too many states "
-"left on stack"
-msgstr ""
-
-#: ../regexp_nfa.c:3302
-msgid "E876: (NFA regexp) Not enough space to store the whole NFA "
-msgstr ""
-
-#: ../regexp_nfa.c:4571 ../regexp_nfa.c:4869
-msgid ""
-"Could not open temporary log file for writing, displaying on stderr ... "
-msgstr ""
-
-#: ../regexp_nfa.c:4840
-#, c-format
-msgid "(NFA) COULD NOT OPEN %s !"
-msgstr ""
-
-#: ../regexp_nfa.c:6049
-#, fuzzy
-msgid "Could not open temporary log file for writing "
-msgstr "E214: ีาฒปตฝำรำฺะดศ๋ตฤมูสฑฮฤผ"
-
-#: ../screen.c:7435
-msgid " VREPLACE"
-msgstr " V-ฬๆปป"
-
-#: ../screen.c:7437
-msgid " REPLACE"
-msgstr " ฬๆปป"
-
-#: ../screen.c:7440
-msgid " REVERSE"
-msgstr " ทดฯ๒"
-
-#: ../screen.c:7441
-msgid " INSERT"
-msgstr " ฒๅศ๋"
-
-#: ../screen.c:7443
-msgid " (insert)"
-msgstr " (ฒๅศ๋)"
-
-#: ../screen.c:7445
-msgid " (replace)"
-msgstr " (ฬๆปป)"
-
-#: ../screen.c:7447
-msgid " (vreplace)"
-msgstr " (V-ฬๆปป)"
-
-#: ../screen.c:7449
-msgid " Hebrew"
-msgstr " Hebrew"
-
-#: ../screen.c:7454
-msgid " Arabic"
-msgstr " Arabic"
-
-#: ../screen.c:7456
-msgid " (lang)"
-msgstr " (ำ๏ัิ)"
-
-#: ../screen.c:7459
-msgid " (paste)"
-msgstr " (ีณฬ๛)"
-
-#: ../screen.c:7469
-msgid " VISUAL"
-msgstr " ฟษสำ"
-
-#: ../screen.c:7470
-msgid " VISUAL LINE"
-msgstr " ฟษสำ ะะ"
-
-#: ../screen.c:7471
-msgid " VISUAL BLOCK"
-msgstr " ฟษสำ ฟ้"
-
-#: ../screen.c:7472
-msgid " SELECT"
-msgstr " ักิ๑"
-
-#: ../screen.c:7473
-msgid " SELECT LINE"
-msgstr " ักิ๑ ะะ"
-
-#: ../screen.c:7474
-msgid " SELECT BLOCK"
-msgstr " ักิ๑ ฟ้"
-
-#: ../screen.c:7486 ../screen.c:7541
-msgid "recording"
-msgstr "ผวยผึะ"
-
-#: ../search.c:487
-#, c-format
-msgid "E383: Invalid search string: %s"
-msgstr "E383: ฮะงตฤฒ้ีาืึท๛ดฎ: %s"
-
-#: ../search.c:832
-#, c-format
-msgid "E384: search hit TOP without match for: %s"
-msgstr "E384: าัฒ้ีาตฝฮฤผฟชอทศิีาฒปตฝ %s"
-
-#: ../search.c:835
-#, c-format
-msgid "E385: search hit BOTTOM without match for: %s"
-msgstr "E385: าัฒ้ีาตฝฮฤผฝแฮฒศิีาฒปตฝ %s"
-
-#: ../search.c:1200
-msgid "E386: Expected '?' or '/' after ';'"
-msgstr "E386: ิฺ ';' บ๓รๆำฆธรำะ '?' ป๒ '/'"
-
-#: ../search.c:4085
-msgid " (includes previously listed match)"
-msgstr " (ฐภจษฯดฮมะณ๖ท๛บฯฯ๎)"
-
-#. cursor at status line
-#: ../search.c:4104
-msgid "--- Included files "
-msgstr "--- ฐบฌฮฤผ "
-
-#: ../search.c:4106
-msgid "not found "
-msgstr "ีาฒปตฝ "
-
-#: ../search.c:4107
-msgid "in path ---\n"
-msgstr "ิฺยทพถ ---\n"
-
-#: ../search.c:4168
-msgid " (Already listed)"
-msgstr " (าัมะณ๖)"
-
-#: ../search.c:4170
-msgid " NOT FOUND"
-msgstr " ีาฒปตฝ"
-
-#: ../search.c:4211
-#, c-format
-msgid "Scanning included file: %s"
-msgstr "ฒ้ีาฐบฌฮฤผ: %s"
-
-#: ../search.c:4216
-#, c-format
-msgid "Searching included file %s"
-msgstr "ฒ้ีาฐบฌตฤฮฤผ %s"
-
-#: ../search.c:4405
-msgid "E387: Match is on current line"
-msgstr "E387: ตฑวฐะะฦฅลไ"
-
-#: ../search.c:4517
-msgid "All included files were found"
-msgstr "ห๙ำะฐบฌฮฤผถผาัีาตฝ"
-
-#: ../search.c:4519
-msgid "No included files"
-msgstr "รปำะฐบฌฮฤผ"
-
-#: ../search.c:4527
-msgid "E388: Couldn't find definition"
-msgstr "E388: ีาฒปตฝถจาๅ"
-
-#: ../search.c:4529
-msgid "E389: Couldn't find pattern"
-msgstr "E389: ีาฒปตฝ pattern"
-
-#: ../search.c:4668
-#, fuzzy
-msgid "Substitute "
-msgstr "1 ดฮฬๆปปฃฌ"
-
-#: ../search.c:4681
-#, c-format
-msgid ""
-"\n"
-"# Last %sSearch Pattern:\n"
-"~"
-msgstr ""
-
-#: ../spell.c:951
-msgid "E759: Format error in spell file"
-msgstr "E759: ฦดะดฮฤผธ๑สฝดํฮ๓"
-
-#: ../spell.c:952
-msgid "E758: Truncated spell file"
-msgstr "E758: าัฝุถฯตฤฦดะดฮฤผ"
-
-#: ../spell.c:953
-#, c-format
-msgid "Trailing text in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌถเำเตฤบ๓ะ๘ืึท๛: %s"
-
-#: ../spell.c:954
-#, c-format
-msgid "Affix name too long in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌธฝผำฯ๎ร๛ืึฬซณค: %s"
-
-#: ../spell.c:955
-msgid "E761: Format error in affix file FOL, LOW or UPP"
-msgstr "E761: ธฝผำฮฤผ FOLกขLOW ป๒ UPP ึะธ๑สฝดํฮ๓"
-
-#: ../spell.c:957
-msgid "E762: Character in FOL, LOW or UPP is out of range"
-msgstr "E762: FOLกขLOW ป๒ UPP ึะืึท๛ณฌณ๖ทถฮง"
-
-#: ../spell.c:958
-msgid "Compressing word tree..."
-msgstr "ันห๕ตฅดสส๗กญกญ"
-
-#: ../spell.c:1951
-msgid "E756: Spell checking is not enabled"
-msgstr "E756: ฦดะดผ์ฒ้ฮดฦ๔ำร"
-
-#: ../spell.c:2249
-#, c-format
-msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
-msgstr "พฏธๆ: ีาฒปตฝตฅดสมะฑํ \"%s.%s.spl\" or \"%s.ascii.spl\""
-
-#: ../spell.c:2473
-#, c-format
-msgid "Reading spell file \"%s\""
-msgstr "ถมศกฦดะดฮฤผ \"%s\""
-
-#: ../spell.c:2496
-msgid "E757: This does not look like a spell file"
-msgstr "E757: ีโฟดฦ๐ภดฒปฯ๑สวฦดะดฮฤผ"
-
-#: ../spell.c:2501
-msgid "E771: Old spell file, needs to be updated"
-msgstr "E771: พษฐๆฑพตฤฦดะดฮฤผฃฌะ่าชธะย"
-
-#: ../spell.c:2504
-msgid "E772: Spell file is for newer version of Vim"
-msgstr "E772: ฮชธธ฿ฐๆฑพตฤ Vim ห๙ำรตฤฦดะดฮฤผ"
-
-#: ../spell.c:2602
-msgid "E770: Unsupported section in spell file"
-msgstr "E770: ฦดะดฮฤผึะดๆิฺฒปึงณึตฤฝฺ"
-
-#: ../spell.c:3762
-#, c-format
-msgid "Warning: region %s not supported"
-msgstr "พฏธๆ: ว๘ำ๒ %s ฒปึงณึ"
-
-#: ../spell.c:4550
-#, c-format
-msgid "Reading affix file %s ..."
-msgstr "ถมศกธฝผำฮฤผ %s กญกญ"
-
-#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
-#, c-format
-msgid "Conversion failure for word in %s line %d: %s"
-msgstr "ตฅดส %s ืชปปสงฐฃฌตฺ %d ะะ: %s"
-
-#: ../spell.c:4630 ../spell.c:6170
-#, c-format
-msgid "Conversion in %s not supported: from %s to %s"
-msgstr "ฒปึงณึ %s ึะตฤืชปป: ดำ %s ตฝ %s"
-
-#: ../spell.c:4642
-#, c-format
-msgid "Invalid value for FLAG in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌFLAG ตฤึตฮะง: %s"
-
-#: ../spell.c:4655
-#, c-format
-msgid "FLAG after using flags in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌิฺสนำรฑ๊ึพบ๓ณ๖ฯึ FLAG: %s"
-
-#: ../spell.c:4723
-#, c-format
-msgid ""
-"Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line "
-"%d"
-msgstr ""
-
-#: ../spell.c:4731
-#, c-format
-msgid ""
-"Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line "
-"%d"
-msgstr ""
-
-#: ../spell.c:4747
-#, fuzzy, c-format
-msgid "Wrong COMPOUNDRULES value in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌดํฮ๓ตฤ COMPOUNDMIN ึต: %s"
-
-#: ../spell.c:4771
-#, c-format
-msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌดํฮ๓ตฤ COMPOUNDWORDMAX ึต: %s"
-
-#: ../spell.c:4777
-#, c-format
-msgid "Wrong COMPOUNDMIN value in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌดํฮ๓ตฤ COMPOUNDMIN ึต: %s"
-
-#: ../spell.c:4783
-#, c-format
-msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌดํฮ๓ตฤ COMPOUNDSYLMAX ึต: %s"
-
-#: ../spell.c:4795
-#, c-format
-msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌดํฮ๓ตฤ CHECKCOMPOUNDPATTERN ึต: %s"
-
-#: ../spell.c:4847
-#, c-format
-msgid "Different combining flag in continued affix block in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌิฺมฌะ๘ตฤธฝผำฟ้ึะณ๖ฯึฒปอฌตฤื้บฯฑ๊ึพ: %s"
-
-#: ../spell.c:4850
-#, c-format
-msgid "Duplicate affix in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌึุธดตฤธฝผำฯ๎: %s"
-
-#: ../spell.c:4871
-#, c-format
-msgid ""
-"Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s "
-"line %d: %s"
-msgstr ""
-"%s ตฺ %d ะะฃฌธฝผำฯ๎ฑป BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST สน"
-"ำร: %s"
-
-#: ../spell.c:4893
-#, c-format
-msgid "Expected Y or N in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌดหดฆะ่าช Y ป๒ N: %s"
-
-#: ../spell.c:4968
-#, c-format
-msgid "Broken condition in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌดํฮ๓ตฤฬ๕ผ: %s"
-
-#: ../spell.c:5091
-#, c-format
-msgid "Expected REP(SAL) count in %s line %d"
-msgstr "%s ตฺ %d ะะฃฌดหดฆะ่าช REP(SAL) ผฦส"
-
-#: ../spell.c:5120
-#, c-format
-msgid "Expected MAP count in %s line %d"
-msgstr "%s ตฺ %d ะะฃฌดหดฆะ่าช MAP ผฦส"
-
-#: ../spell.c:5132
-#, c-format
-msgid "Duplicate character in MAP in %s line %d"
-msgstr "%s ตฺ %d ะะฃฌMAP ึะดๆิฺึุธดตฤืึท๛"
-
-#: ../spell.c:5176
-#, c-format
-msgid "Unrecognized or duplicate item in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌฮทจสถฑ๐ป๒ึุธดตฤฯ๎: %s"
-
-#: ../spell.c:5197
-#, c-format
-msgid "Missing FOL/LOW/UPP line in %s"
-msgstr "%s ึะศฑษู FOL/LOW/UPP ะะ"
-
-#: ../spell.c:5220
-msgid "COMPOUNDSYLMAX used without SYLLABLE"
-msgstr "ิฺรปำะ SYLLABLE ตฤว้ฟ๖ฯยสนำรมห COMPOUNDSYLMAX"
-
-#: ../spell.c:5236
-msgid "Too many postponed prefixes"
-msgstr "ฬซถเัำณูวฐืบ"
-
-#: ../spell.c:5238
-msgid "Too many compound flags"
-msgstr "ฬซถเื้บฯฑ๊ึพ"
-
-#: ../spell.c:5240
-msgid "Too many postponed prefixes and/or compound flags"
-msgstr "ฬซถเัำณูวฐืบบอ/ป๒ื้บฯฑ๊ึพ"
-
-#: ../spell.c:5250
-#, c-format
-msgid "Missing SOFO%s line in %s"
-msgstr "%s ึะศฑษู SOFO%s ะะ"
-
-#: ../spell.c:5253
-#, c-format
-msgid "Both SAL and SOFO lines in %s"
-msgstr "%s อฌสฑณ๖ฯึ SQL บอ SOFO ะะ"
-
-#: ../spell.c:5331
-#, c-format
-msgid "Flag is not a number in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌฑ๊ึพฒปสวสืึ: %s"
-
-#: ../spell.c:5334
-#, c-format
-msgid "Illegal flag in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌฮะงตฤฑ๊ึพ: %s"
-
-#: ../spell.c:5493 ../spell.c:5501
-#, c-format
-msgid "%s value differs from what is used in another .aff file"
-msgstr "%s ตฤึตำ๋มําปธ๖ .aff ฮฤผึะสนำรตฤึตฒปฯเอฌ"
-
-#: ../spell.c:5602
-#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "ถมศกืึตไฮฤผ %s กญกญ"
-
-#: ../spell.c:5611
-#, c-format
-msgid "E760: No word count in %s"
-msgstr "E760: %s ึะรปำะตฅดสผฦส"
-
-#: ../spell.c:5669
-#, c-format
-msgid "line %6d, word %6d - %s"
-msgstr "ตฺ %6d ะะฃฌตฺ %6d ธ๖ตฅดส - %s"
-
-#: ../spell.c:5691
-#, c-format
-msgid "Duplicate word in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌึุธดตฤตฅดส: %s"
-
-#: ../spell.c:5694
-#, c-format
-msgid "First duplicate word in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌสืดฮึุธดตฤตฅดส: %s"
-
-#: ../spell.c:5746
-#, c-format
-msgid "%d duplicate word(s) in %s"
-msgstr "ดๆิฺ %d ธ๖ึุธดตฤตฅดสฃฌิฺ %s ึะ"
-
-#: ../spell.c:5748
-#, c-format
-msgid "Ignored %d word(s) with non-ASCII characters in %s"
-msgstr "บ๖ยิมหบฌำะทว ASCII ืึท๛ตฤ %d ธ๖ตฅดสฃฌิฺ %s ึะ"
-
-#: ../spell.c:6115
-#, c-format
-msgid "Reading word file %s ..."
-msgstr "ถมศกตฅดสฮฤผ %s กญกญ"
-
-#: ../spell.c:6155
-#, c-format
-msgid "Duplicate /encoding= line ignored in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:6159
-#, c-format
-msgid "/encoding= line after word ignored in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌตฅดสบ๓ตฤ /encoding= ะะาัฑปบ๖ยิ: %s"
-
-#: ../spell.c:6180
-#, c-format
-msgid "Duplicate /regions= line ignored in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌึุธดตฤ /regions= ะะาัฑปบ๖ยิ: %s"
-
-#: ../spell.c:6185
-#, c-format
-msgid "Too many regions in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌฬซถเว๘ำ๒: %s"
-
-#: ../spell.c:6198
-#, c-format
-msgid "/ line ignored in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌ/ ะะาัฑปบ๖ยิ: %s"
-
-#: ../spell.c:6224
-#, c-format
-msgid "Invalid region nr in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌฮะงตฤว๘ำ๒บล: %s"
-
-#: ../spell.c:6230
-#, c-format
-msgid "Unrecognized flags in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌฒปฟษสถฑ๐ตฤฑ๊ึพ: %s"
-
-#: ../spell.c:6257
-#, c-format
-msgid "Ignored %d words with non-ASCII characters"
-msgstr "บ๖ยิมหบฌำะทว ASCII ืึท๛ตฤ %d ธ๖ตฅดส"
-
-#: ../spell.c:6656
-#, c-format
-msgid "Compressed %d of %d nodes; %d (%d%%) remaining"
-msgstr "ันห๕มห %d/%d ธ๖ฝฺตใฃปสฃำเ %d (%d%%)"
-
-#: ../spell.c:7340
-msgid "Reading back spell file..."
-msgstr "ถมศกฦดะดฮฤผกญกญ"
-
-#. Go through the trie of good words, soundfold each word and add it to
-#. the soundfold trie.
-#: ../spell.c:7357
-msgid "Performing soundfolding..."
-msgstr "ีิฺ soundfoldingกญกญ"
-
-#: ../spell.c:7368
-#, c-format
-msgid "Number of words after soundfolding: %<PRId64>"
-msgstr "soundfolding บ๓ตฤตฅดสส: %<PRId64>"
-
-#: ../spell.c:7476
-#, c-format
-msgid "Total number of words: %d"
-msgstr "ตฅดสืส: %d"
-
-#: ../spell.c:7655
-#, c-format
-msgid "Writing suggestion file %s ..."
-msgstr "ะดศ๋ฝจา้ฮฤผ %s กญกญ"
-
-#: ../spell.c:7707 ../spell.c:7927
-#, c-format
-msgid "Estimated runtime memory use: %d bytes"
-msgstr "นภผฦิหะะสฑฤฺดๆำรมฟ: %d ืึฝฺ"
-
-#: ../spell.c:7820
-msgid "E751: Output file name must not have region name"
-msgstr "E751: สไณ๖ฮฤผร๛ฒปฤบฌำะว๘ำ๒ร๛"
-
-#: ../spell.c:7822
-msgid "E754: Only up to 8 regions supported"
-msgstr "E754: ื๎ถเึปึงณึ 8 ธ๖ว๘ำ๒"
-
-#: ../spell.c:7846
-#, c-format
-msgid "E755: Invalid region in %s"
-msgstr "E755: %s ณ๖ฯึฮะงตฤทถฮง"
-
-#: ../spell.c:7907
-msgid "Warning: both compounding and NOBREAK specified"
-msgstr "พฏธๆ: อฌสฑึธถจมห compounding บอ NOBREAK"
-
-#: ../spell.c:7920
-#, c-format
-msgid "Writing spell file %s ..."
-msgstr "ะดศ๋ฦดะดฮฤผ %s กญกญ"
-
-#: ../spell.c:7925
-msgid "Done!"
-msgstr "อ๊ณษฃก"
-
-#: ../spell.c:8034
-#, c-format
-msgid "E765: 'spellfile' does not have %<PRId64> entries"
-msgstr "E765: 'spellfile' รปำะ %<PRId64> ฯ๎"
-
-#: ../spell.c:8074
-#, fuzzy, c-format
-msgid "Word '%.*s' removed from %s"
-msgstr "ดำ %s ึะษพณมหตฅดส"
-
-#: ../spell.c:8117
-#, fuzzy, c-format
-msgid "Word '%.*s' added to %s"
-msgstr "ฯ๒ %s ึะฬํผำมหตฅดส"
-
-#: ../spell.c:8381
-msgid "E763: Word characters differ between spell files"
-msgstr "E763: ฦดะดฮฤผึฎผไตฤืึท๛ฒปฯเอฌ"
-
-#: ../spell.c:8684
-msgid "Sorry, no suggestions"
-msgstr "ฑงวธฃฌรปำะฝจา้"
-
-#: ../spell.c:8687
-#, c-format
-msgid "Sorry, only %<PRId64> suggestions"
-msgstr "ฑงวธฃฌึปำะ %<PRId64> ฬ๕ฝจา้"
-
-#. for when 'cmdheight' > 1
-#. avoid more prompt
-#: ../spell.c:8704
-#, c-format
-msgid "Change \"%.*s\" to:"
-msgstr "ฝซ \"%.*s\" ธฤฮชฃบ"
-
-#: ../spell.c:8737
-#, c-format
-msgid " < \"%.*s\""
-msgstr " < \"%.*s\""
-
-#: ../spell.c:8882
-msgid "E752: No previous spell replacement"
-msgstr "E752: ึฎวฐรปำะฦดะดฬๆปป"
-
-#: ../spell.c:8925
-#, c-format
-msgid "E753: Not found: %s"
-msgstr "E753: ีาฒปตฝ: %s"
-
-#: ../spell.c:9276
-#, c-format
-msgid "E778: This does not look like a .sug file: %s"
-msgstr "E778: ฟดฦ๐ภดฒปฯ๑สว .sug ฮฤผ: %s"
-
-#: ../spell.c:9282
-#, c-format
-msgid "E779: Old .sug file, needs to be updated: %s"
-msgstr ""
-
-#: ../spell.c:9286
-#, c-format
-msgid "E780: .sug file is for newer version of Vim: %s"
-msgstr ""
-
-#: ../spell.c:9295
-#, c-format
-msgid "E781: .sug file doesn't match .spl file: %s"
-msgstr ""
-
-#: ../spell.c:9305
-#, fuzzy, c-format
-msgid "E782: error while reading .sug file: %s"
-msgstr "E47: ถมศกดํฮ๓ฮฤผสงฐ"
-
-#. This should have been checked when generating the .spl
-#. file.
-#: ../spell.c:11575
-msgid "E783: duplicate char in MAP entry"
-msgstr ""
-
-#: ../syntax.c:266
-msgid "No Syntax items defined for this buffer"
-msgstr "ีโธ๖ปบณๅว๘รปำะถจาๅศฮบฮำ๏ทจฯ๎"
-
-#: ../syntax.c:3083 ../syntax.c:3104 ../syntax.c:3127
-#, c-format
-msgid "E390: Illegal argument: %s"
-msgstr "E390: ฮะงตฤฒฮส: %s"
-
-#: ../syntax.c:3299
-#, c-format
-msgid "E391: No such syntax cluster: %s"
-msgstr "E391: ฮดหำ๏ทจ cluster: \"%s\""
-
-#: ../syntax.c:3433
-msgid "syncing on C-style comments"
-msgstr "Cท็ธ๑ืขสออฌฒฝึะ"
-
-#: ../syntax.c:3439
-msgid "no syncing"
-msgstr "รปำะอฌฒฝ"
-
-#: ../syntax.c:3441
-msgid "syncing starts "
-msgstr "อฌฒฝฟชสผ"
-
-#: ../syntax.c:3443 ../syntax.c:3506
-msgid " lines before top line"
-msgstr "ะะบลณฌณ๖ทถฮง"
-
-#: ../syntax.c:3448
-msgid ""
-"\n"
-"--- Syntax sync items ---"
-msgstr ""
-"\n"
-"--- ำ๏ทจอฌฒฝฯ๎ฤฟ (Syntax sync items) ---"
-
-#: ../syntax.c:3452
-msgid ""
-"\n"
-"syncing on items"
-msgstr ""
-"\n"
-"อฌฒฝึะ:"
-
-#: ../syntax.c:3457
-msgid ""
-"\n"
-"--- Syntax items ---"
-msgstr ""
-"\n"
-"--- ำ๏ทจฯ๎ฤฟ ---"
-
-#: ../syntax.c:3475
-#, c-format
-msgid "E392: No such syntax cluster: %s"
-msgstr "E392: ฮดหำ๏ทจ cluster: \"%s\""
-
-#: ../syntax.c:3497
-msgid "minimal "
-msgstr "ื๎ะก"
-
-#: ../syntax.c:3503
-msgid "maximal "
-msgstr "ื๎ด๓"
-
-#: ../syntax.c:3513
-#, fuzzy
-msgid "; match "
-msgstr "ฦฅลไ %d"
-
-#: ../syntax.c:3515
-#, fuzzy
-msgid " line breaks"
-msgstr "ษูำฺาปะะ"
-
-#: ../syntax.c:4076
-msgid "E395: contains argument not accepted here"
-msgstr "E395: สนำรมหฒปีศทตฤฒฮส"
-
-#: ../syntax.c:4096
-#, fuzzy
-msgid "E844: invalid cchar value"
-msgstr "E474: ฮะงตฤฒฮส"
-
-#: ../syntax.c:4107
-msgid "E393: group[t]here not accepted here"
-msgstr "E393: สนำรมหฒปีศทตฤฒฮส"
-
-#: ../syntax.c:4126
-#, c-format
-msgid "E394: Didn't find region item for %s"
-msgstr "E394: ีาฒปตฝ %s ตฤ region item"
-
-#: ../syntax.c:4188
-msgid "E397: Filename required"
-msgstr "E397: ะ่าชฮฤผร๛ณฦ"
-
-#: ../syntax.c:4221
-#, fuzzy
-msgid "E847: Too many syntax includes"
-msgstr "E77: ฮฤผร๛นถเ"
-
-#: ../syntax.c:4303
-#, fuzzy, c-format
-msgid "E789: Missing ']': %s"
-msgstr "E747: ศฑษู ']': %s"
-
-#: ../syntax.c:4531
-#, c-format
-msgid "E398: Missing '=': %s"
-msgstr "E398: ศฑษู '=': %s"
-
-#: ../syntax.c:4666
-#, c-format
-msgid "E399: Not enough arguments: syntax region %s"
-msgstr "E399: syntax region %s ตฤฒฮสฬซษู"
-
-#: ../syntax.c:4870
-#, fuzzy
-msgid "E848: Too many syntax clusters"
-msgstr "E391: ฮดหำ๏ทจ cluster: \"%s\""
-
-#: ../syntax.c:4954
-msgid "E400: No cluster specified"
-msgstr "E400: รปำะึธถจตฤส๔ะิ"
-
-#. end delimiter not found
-#: ../syntax.c:4986
-#, c-format
-msgid "E401: Pattern delimiter not found: %s"
-msgstr "E401: ีาฒปตฝทึธ๔ท๛บล: %s"
-
-#: ../syntax.c:5049
-#, c-format
-msgid "E402: Garbage after pattern: %s"
-msgstr "E402: '%s' บ๓รๆตฤถซฮ๗ฒปฤสถฑ๐"
-
-#: ../syntax.c:5120
-msgid "E403: syntax sync: line continuations pattern specified twice"
-msgstr "E403: ำ๏ทจอฌฒฝ: มฌฝำะะท๛บลึธถจมหมฝดฮ"
-
-#: ../syntax.c:5169
-#, c-format
-msgid "E404: Illegal arguments: %s"
-msgstr "E404: ฮะงตฤฒฮส: %s"
-
-#: ../syntax.c:5217
-#, c-format
-msgid "E405: Missing equal sign: %s"
-msgstr "E405: ศฑษูตศบล: %s"
-
-#: ../syntax.c:5222
-#, c-format
-msgid "E406: Empty argument: %s"
-msgstr "E406: ฟีตฤฒฮส: %s"
-
-#: ../syntax.c:5240
-#, c-format
-msgid "E407: %s not allowed here"
-msgstr "E407: %s ฒปฤิฺดหณ๖ฯึ"
-
-#: ../syntax.c:5246
-#, c-format
-msgid "E408: %s must be first in contains list"
-msgstr "E408: %s ฑุะ๋สวมะฑํภ๏ตฤตฺาปธ๖"
-
-#: ../syntax.c:5304
-#, c-format
-msgid "E409: Unknown group name: %s"
-msgstr "E409: ฒปีศทตฤื้ร๛: %s"
-
-#: ../syntax.c:5512
-#, c-format
-msgid "E410: Invalid :syntax subcommand: %s"
-msgstr "E410: ฒปีศทตฤ :syntax ืำรม๎: %s"
-
-#: ../syntax.c:5854
-msgid ""
-" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
-msgstr ""
-
-#: ../syntax.c:6146
-msgid "E679: recursive loop loading syncolor.vim"
-msgstr "E679: ผำิุ syncolor.vim สฑณ๖ฯึวถฬืัญปท"
-
-#: ../syntax.c:6256
-#, c-format
-msgid "E411: highlight group not found: %s"
-msgstr "E411: ีาฒปตฝ highlight group: %s"
-
-#: ../syntax.c:6278
-#, c-format
-msgid "E412: Not enough arguments: \":highlight link %s\""
-msgstr "E412: ฒฮสฬซษู: \":highlight link %s\""
-
-#: ../syntax.c:6284
-#, c-format
-msgid "E413: Too many arguments: \":highlight link %s\""
-msgstr "E413: ฒฮสนถเ: \":highlight link %s\""
-
-#: ../syntax.c:6302
-msgid "E414: group has settings, highlight link ignored"
-msgstr "E414: าัษ่ถจื้, บ๖ยิ highlight link"
-
-#: ../syntax.c:6367
-#, c-format
-msgid "E415: unexpected equal sign: %s"
-msgstr "E415: ฒปธรำะตฤตศบล: %s"
-
-#: ../syntax.c:6395
-#, c-format
-msgid "E416: missing equal sign: %s"
-msgstr "E416: ศฑษูตศบล: %s"
-
-#: ../syntax.c:6418
-#, c-format
-msgid "E417: missing argument: %s"
-msgstr "E417: ศฑษูฒฮส: %s"
-
-#: ../syntax.c:6446
-#, c-format
-msgid "E418: Illegal value: %s"
-msgstr "E418: ฒปบฯทจตฤึต: %s"
-
-#: ../syntax.c:6496
-msgid "E419: FG color unknown"
-msgstr "E419: ดํฮ๓ตฤวฐพฐัีษซ"
-
-#: ../syntax.c:6504
-msgid "E420: BG color unknown"
-msgstr "E420: ดํฮ๓ตฤฑณพฐัีษซ"
-
-#: ../syntax.c:6564
-#, c-format
-msgid "E421: Color name or number not recognized: %s"
-msgstr "E421: ดํฮ๓ตฤัีษซร๛ณฦป๒สึต: %s"
-
-#: ../syntax.c:6714
-#, c-format
-msgid "E422: terminal code too long: %s"
-msgstr "E422: ึีถหฑเย๋ฬซณค: %s"
-
-#: ../syntax.c:6753
-#, c-format
-msgid "E423: Illegal argument: %s"
-msgstr "E423: ฮะงตฤฒฮส: %s"
-
-#: ../syntax.c:6925
-msgid "E424: Too many different highlighting attributes in use"
-msgstr "E424: สนำรมหฬซถเฒปอฌตฤธ฿มมถศส๔ะิ"
-
-#: ../syntax.c:7427
-msgid "E669: Unprintable character in group name"
-msgstr "E669: ื้ร๛ึะดๆิฺฒปฟษฯิสพืึท๛"
-
-#: ../syntax.c:7434
-msgid "W18: Invalid character in group name"
-msgstr "W18: ื้ร๛ึะบฌำะฮะงืึท๛"
-
-#: ../syntax.c:7448
-msgid "E849: Too many highlight and syntax groups"
-msgstr ""
-
-#: ../tag.c:104
-msgid "E555: at bottom of tag stack"
-msgstr "E555: าัิฺ tag ถัีปตืฒฟ"
-
-#: ../tag.c:105
-msgid "E556: at top of tag stack"
-msgstr "E556: าัิฺ tag ถัีปถฅฒฟ"
-
-#: ../tag.c:380
-msgid "E425: Cannot go before first matching tag"
-msgstr "E425: าัตฝตฺาปธ๖ฦฅลไตฤ tag"
-
-#: ../tag.c:504
-#, c-format
-msgid "E426: tag not found: %s"
-msgstr "E426: ีาฒปตฝ tag: %s"
-
-#: ../tag.c:528
-msgid " # pri kind tag"
-msgstr " # pri kind tag"
-
-#: ../tag.c:531
-msgid "file\n"
-msgstr "ฮฤผ\n"
-
-#: ../tag.c:829
-msgid "E427: There is only one matching tag"
-msgstr "E427: ึปำะาปธ๖ฦฅลไตฤ tag"
-
-#: ../tag.c:831
-msgid "E428: Cannot go beyond last matching tag"
-msgstr "E428: ผบตฝื๎บ๓าปธ๖ฦฅลไตฤ tag"
-
-#: ../tag.c:850
-#, c-format
-msgid "File \"%s\" does not exist"
-msgstr "ฮฤผ \"%s\" ฒปดๆิฺ"
-
-#. Give an indication of the number of matching tags
-#: ../tag.c:859
-#, c-format
-msgid "tag %d of %d%s"
-msgstr "ีาตฝ tag: %d / %d%s"
-
-#: ../tag.c:862
-msgid " or more"
-msgstr " ป๒ธถเ"
-
-#: ../tag.c:864
-msgid " Using tag with different case!"
-msgstr " าิฒปอฌด๓ะกะดภดสนำร tagฃก"
-
-#: ../tag.c:909
-#, c-format
-msgid "E429: File \"%s\" does not exist"
-msgstr "E429: ฮฤผ \"%s\" ฒปดๆิฺ"
-
-#. Highlight title
-#: ../tag.c:960
-msgid ""
-"\n"
-" # TO tag FROM line in file/text"
-msgstr ""
-"\n"
-" # ตฝ tag ดำ ะะ ิฺ ฮฤผ/ฮฤฑพ"
-
-#: ../tag.c:1303
-#, c-format
-msgid "Searching tags file %s"
-msgstr "ฒ้ีา tag ฮฤผ %s"
-
-#: ../tag.c:1545
-msgid "Ignoring long line in tags file"
-msgstr ""
-
-#: ../tag.c:1915
-#, c-format
-msgid "E431: Format error in tags file \"%s\""
-msgstr "E431: Tag ฮฤผ \"%s\" ธ๑สฝดํฮ๓"
-
-#: ../tag.c:1917
-#, c-format
-msgid "Before byte %<PRId64>"
-msgstr "ิฺตฺ %<PRId64> ืึฝฺึฎวฐ"
-
-#: ../tag.c:1929
-#, c-format
-msgid "E432: Tags file not sorted: %s"
-msgstr "E432: Tag ฮฤผฮดลละ๒: %s"
-
-#. never opened any tags file
-#: ../tag.c:1960
-msgid "E433: No tags file"
-msgstr "E433: รปำะ tag ฮฤผ"
-
-#: ../tag.c:2536
-msgid "E434: Can't find tag pattern"
-msgstr "E434: ีาฒปตฝ tag ฤฃสฝ"
-
-#: ../tag.c:2544
-msgid "E435: Couldn't find tag, just guessing!"
-msgstr "E435: ีาฒปตฝ tagฃฌสิืลฒยฃก"
-
-#: ../tag.c:2797
-#, fuzzy, c-format
-msgid "Duplicate field name: %s"
-msgstr "%s ตฺ %d ะะฃฌึุธดตฤธฝผำฯ๎: %s"
-
-#: ../term.c:1442
-msgid "' not known. Available builtin terminals are:"
-msgstr "' ฮดึชกฃฟษำรตฤฤฺฝจึีถหำะ:"
-
-#: ../term.c:1463
-msgid "defaulting to '"
-msgstr "ฤฌศฯึตฮช: '"
-
-#: ../term.c:1731
-msgid "E557: Cannot open termcap file"
-msgstr "E557: ฮทจด๒ฟช termcap ฮฤผ"
-
-#: ../term.c:1735
-msgid "E558: Terminal entry not found in terminfo"
-msgstr "E558: ิฺ terminfo ึะีาฒปตฝึีถหฯ๎"
-
-#: ../term.c:1737
-msgid "E559: Terminal entry not found in termcap"
-msgstr "E559: ิฺ termcap ึะีาฒปตฝึีถหฯ๎"
-
-#: ../term.c:1878
-#, c-format
-msgid "E436: No \"%s\" entry in termcap"
-msgstr "E436: termcap ึะรปำะ \"%s\" ฯ๎"
-
-#: ../term.c:2249
-msgid "E437: terminal capability \"cm\" required"
-msgstr "E437: ึีถหะ่าชฤมฆ \"cm\""
-
-#. Highlight title
-#: ../term.c:4376
-msgid ""
-"\n"
-"--- Terminal keys ---"
-msgstr ""
-"\n"
-"--- ึีถหฐดผ ---"
-
-#: ../ui.c:481
-msgid "Vim: Error reading input, exiting...\n"
-msgstr "Vim: ถมดํฮ๓ฃฌอหณ๖ึะ...\n"
-
-#. This happens when the FileChangedRO autocommand changes the
-#. * file in a way it becomes shorter.
-#: ../undo.c:379
-#, fuzzy
-msgid "E881: Line count changed unexpectedly"
-msgstr "E787: าโอโตุธฤฑไมหปบณๅว๘"
-
-#: ../undo.c:627
-#, fuzzy, c-format
-msgid "E828: Cannot open undo file for writing: %s"
-msgstr "E212: ฮทจด๒ฟชฒขะดศ๋ฮฤผ"
-
-#: ../undo.c:717
-#, c-format
-msgid "E825: Corrupted undo file (%s): %s"
-msgstr ""
-
-#: ../undo.c:1039
-msgid "Cannot write undo file in any directory in 'undodir'"
-msgstr ""
-
-#: ../undo.c:1074
-#, c-format
-msgid "Will not overwrite with undo file, cannot read: %s"
-msgstr ""
-
-#: ../undo.c:1092
-#, c-format
-msgid "Will not overwrite, this is not an undo file: %s"
-msgstr ""
-
-#: ../undo.c:1108
-msgid "Skipping undo file write, nothing to undo"
-msgstr ""
-
-#: ../undo.c:1121
-#, fuzzy, c-format
-msgid "Writing undo file: %s"
-msgstr "ะดศ๋ viminfo ฮฤผ \"%s\""
-
-#: ../undo.c:1213
-#, fuzzy, c-format
-msgid "E829: write error in undo file: %s"
-msgstr "E297: ฝปปปฮฤผะดศ๋ดํฮ๓"
-
-#: ../undo.c:1280
-#, c-format
-msgid "Not reading undo file, owner differs: %s"
-msgstr ""
-
-#: ../undo.c:1292
-#, fuzzy, c-format
-msgid "Reading undo file: %s"
-msgstr "ถมศกตฅดสฮฤผ %s กญกญ"
-
-#: ../undo.c:1299
-#, fuzzy, c-format
-msgid "E822: Cannot open undo file for reading: %s"
-msgstr "E195: ฮทจด๒ฟชฒขถมศก viminfo ฮฤผ"
-
-#: ../undo.c:1308
-#, fuzzy, c-format
-msgid "E823: Not an undo file: %s"
-msgstr "E753: ีาฒปตฝ: %s"
-
-#: ../undo.c:1313
-#, fuzzy, c-format
-msgid "E824: Incompatible undo file: %s"
-msgstr "E484: ฮทจด๒ฟชฮฤผ %s"
-
-#: ../undo.c:1328
-msgid "File contents changed, cannot use undo info"
-msgstr ""
-
-#: ../undo.c:1497
-#, fuzzy, c-format
-msgid "Finished reading undo file %s"
-msgstr "ฝแส๘ึดะะ %s"
-
-#: ../undo.c:1586 ../undo.c:1812
-msgid "Already at oldest change"
-msgstr "าัฮปำฺื๎พษตฤธฤฑไ"
-
-#: ../undo.c:1597 ../undo.c:1814
-msgid "Already at newest change"
-msgstr "าัฮปำฺื๎ะยตฤธฤฑไ"
-
-#: ../undo.c:1806
-#, fuzzy, c-format
-msgid "E830: Undo number %<PRId64> not found"
-msgstr "ีาฒปตฝณทฯ๚บล %<PRId64>"
-
-#: ../undo.c:1979
-msgid "E438: u_undo: line numbers wrong"
-msgstr "E438: u_undo: ะะบลดํฮ๓"
-
-#: ../undo.c:2183
-msgid "more line"
-msgstr "ะะฑปผำศ๋"
-
-#: ../undo.c:2185
-msgid "more lines"
-msgstr "ะะฑปผำศ๋"
-
-#: ../undo.c:2187
-msgid "line less"
-msgstr "ะะฑปศฅต๔"
-
-#: ../undo.c:2189
-msgid "fewer lines"
-msgstr "ะะฑปศฅต๔"
-
-#: ../undo.c:2193
-msgid "change"
-msgstr "ะะทขษ๚ธฤฑไ"
-
-#: ../undo.c:2195
-msgid "changes"
-msgstr "ะะทขษ๚ธฤฑไ"
-
-#: ../undo.c:2225
-#, c-format
-msgid "%<PRId64> %s; %s #%<PRId64> %s"
-msgstr "%<PRId64> %sฃป%s #%<PRId64> %s"
-
-#: ../undo.c:2228
-msgid "before"
-msgstr "before"
-
-#: ../undo.c:2228
-msgid "after"
-msgstr "after"
-
-#: ../undo.c:2325
-msgid "Nothing to undo"
-msgstr "ฮฟษณทฯ๚"
-
-#: ../undo.c:2330
-msgid "number changes when saved"
-msgstr ""
-
-#: ../undo.c:2360
-#, fuzzy, c-format
-msgid "%<PRId64> seconds ago"
-msgstr "%<PRId64> มะ; "
-
-#: ../undo.c:2372
-#, fuzzy
-msgid "E790: undojoin is not allowed after undo"
-msgstr "E407: %s ฒปฤิฺดหณ๖ฯึ"
-
-#: ../undo.c:2466
-msgid "E439: undo list corrupt"
-msgstr "E439: ณทฯ๚มะฑํห๐ปต"
-
-#: ../undo.c:2495
-msgid "E440: undo line missing"
-msgstr "E440: ีาฒปตฝาชณทฯ๚ตฤะะ"
-
-#: ../version.c:600
-msgid ""
-"\n"
-"Included patches: "
-msgstr ""
-"\n"
-"ฐบฌฒนถก: "
-
-#: ../version.c:627
-#, fuzzy
-msgid ""
-"\n"
-"Extra patches: "
-msgstr "อโฒฟท๛บฯ:\n"
-
-#: ../version.c:639 ../version.c:864
-msgid "Modified by "
-msgstr "ะธฤี฿ "
-
-#: ../version.c:646
-msgid ""
-"\n"
-"Compiled "
-msgstr ""
-"\n"
-"ฑเา๋"
-
-#: ../version.c:649
-msgid "by "
-msgstr "ี฿ "
-
-#: ../version.c:660
-msgid ""
-"\n"
-"Huge version "
-msgstr ""
-"\n"
-"พะอฐๆฑพ "
-
-#: ../version.c:661
-msgid "without GUI."
-msgstr "ฮอผะฮฝ็รๆกฃ"
-
-#: ../version.c:662
-msgid " Features included (+) or not (-):\n"
-msgstr " ฟษสนำร(+)ำ๋ฒปฟษสนำร(-)ตฤนฆฤ:\n"
-
-#: ../version.c:667
-msgid " system vimrc file: \""
-msgstr " ฯตอณ vimrc ฮฤผ: \""
-
-#: ../version.c:672
-msgid " user vimrc file: \""
-msgstr " ำรปง vimrc ฮฤผ: \""
-
-#: ../version.c:677
-msgid " 2nd user vimrc file: \""
-msgstr " ตฺถำรปง vimrc ฮฤผ: \""
-
-#: ../version.c:682
-msgid " 3rd user vimrc file: \""
-msgstr " ตฺศำรปง vimrc ฮฤผ: \""
-
-#: ../version.c:687
-msgid " user exrc file: \""
-msgstr " ำรปง exrc ฮฤผ: \""
-
-#: ../version.c:692
-msgid " 2nd user exrc file: \""
-msgstr " ตฺถำรปง exrc ฮฤผ: \""
-
-#: ../version.c:699
-msgid " fall-back for $VIM: \""
-msgstr " $VIM ิคษ่ึต: \""
-
-#: ../version.c:705
-msgid " f-b for $VIMRUNTIME: \""
-msgstr " $VIMRUNTIME ิคษ่ึต: \""
-
-#: ../version.c:709
-msgid "Compilation: "
-msgstr "ฑเา๋ทฝสฝ: "
-
-#: ../version.c:712
-msgid "Linking: "
-msgstr "มดฝำทฝสฝ: "
-
-#: ../version.c:717
-msgid " DEBUG BUILD"
-msgstr " ต๗สิฐๆฑพ"
-
-#: ../version.c:767
-msgid "VIM - Vi IMproved"
-msgstr "VIM - Vi IMproved"
-
-#: ../version.c:769
-msgid "version "
-msgstr "ฐๆฑพ "
-
-#: ../version.c:770
-msgid "by Bram Moolenaar et al."
-msgstr "ฮฌปคศห Bram Moolenaar ตศ"
-
-#: ../version.c:774
-msgid "Vim is open source and freely distributable"
-msgstr "Vim สวฟษืิำษทึทขตฤฟชทลิดด๚ย๋ศํผ"
-
-#: ../version.c:776
-msgid "Help poor children in Uganda!"
-msgstr "ฐ๏ึ๚ฮฺธษด๏ตฤฟษมฏถ๙อฏฃก"
-
-#: ../version.c:777
-msgid "type :help iccf<Enter> for information "
-msgstr "สไศ๋ :help iccf<Enter> ฒ้ฟดหตร๗ "
-
-#: ../version.c:779
-msgid "type :q<Enter> to exit "
-msgstr "สไศ๋ :q<Enter> อหณ๖ "
-
-#: ../version.c:780
-msgid "type :help<Enter> or <F1> for on-line help"
-msgstr "สไศ๋ :help<Enter> ป๒ <F1> ฒ้ฟดิฺฯ฿ฐ๏ึ๚ "
-
-#: ../version.c:781
-msgid "type :help version7<Enter> for version info"
-msgstr "สไศ๋ :help version7<Enter> ฒ้ฟดฐๆฑพะลฯข "
-
-#: ../version.c:784
-msgid "Running in Vi compatible mode"
-msgstr "ิหะะำฺ Vi ผๆศฤฃสฝ"
-
-#: ../version.c:785
-msgid "type :set nocp<Enter> for Vim defaults"
-msgstr "สไศ๋ :set nocp<Enter> ปึธดฤฌศฯตฤ Vim "
-
-#: ../version.c:786
-msgid "type :help cp-default<Enter> for info on this"
-msgstr "สไศ๋ :help cp-default<Enter> ฒ้ฟดฯเนุหตร๗ "
-
-#: ../version.c:827
-msgid "Sponsor Vim development!"
-msgstr "ิึ๚ Vim ตฤฟชทขฃก"
-
-#: ../version.c:828
-msgid "Become a registered Vim user!"
-msgstr "ณษฮช Vim ตฤืขฒแำรปงฃก"
-
-#: ../version.c:831
-msgid "type :help sponsor<Enter> for information "
-msgstr "สไศ๋ :help sponsor<Enter> ฒ้ฟดหตร๗ "
-
-#: ../version.c:832
-msgid "type :help register<Enter> for information "
-msgstr "สไศ๋ :help register<Enter> ฒ้ฟดหตร๗ "
-
-#: ../version.c:834
-msgid "menu Help->Sponsor/Register for information "
-msgstr "ฒหตฅ Help->Sponsor/Register ฒ้ฟดหตร๗ "
-
-#: ../window.c:119
-msgid "Already only one window"
-msgstr "าัพญึปสฃาปธ๖ดฐฟฺมห"
-
-#: ../window.c:224
-msgid "E441: There is no preview window"
-msgstr "E441: รปำะิคภภดฐฟฺ"
-
-#: ../window.c:559
-msgid "E442: Can't split topleft and botright at the same time"
-msgstr "E442: ฒปฤอฌสฑฝ๘ะะ topleft บอ botright ทึธ๎"
-
-#: ../window.c:1228
-msgid "E443: Cannot rotate when another window is split"
-msgstr "E443: ำะฦไหทึธ๎ดฐฟฺสฑฒปฤะืช"
-
-#: ../window.c:1803
-msgid "E444: Cannot close last window"
-msgstr "E444: ฒปฤนุฑีื๎บ๓าปธ๖ดฐฟฺ"
-
-#: ../window.c:1810
-#, fuzzy
-msgid "E813: Cannot close autocmd window"
-msgstr "E444: ฒปฤนุฑีื๎บ๓าปธ๖ดฐฟฺ"
-
-#: ../window.c:1814
-#, fuzzy
-msgid "E814: Cannot close window, only autocmd window would remain"
-msgstr "E444: ฒปฤนุฑีื๎บ๓าปธ๖ดฐฟฺ"
-
-#: ../window.c:2717
-msgid "E445: Other window contains changes"
-msgstr "E445: ฦไหดฐฟฺำะธฤฑไตฤฤฺศ"
-
-#: ../window.c:4805
-msgid "E446: No file name under cursor"
-msgstr "E446: นโฑ๊ดฆรปำะฮฤผร๛"
-
-#~ msgid "Patch file"
-#~ msgstr "Patch ฮฤผ"
-
-#~ msgid ""
-#~ "&OK\n"
-#~ "&Cancel"
-#~ msgstr ""
-#~ "ศทถจ(&O)\n"
-#~ "ศกฯ๛(&C)"
-
-#~ msgid "E240: No connection to Vim server"
-#~ msgstr "E240: รปำะตฝ Vim ทฮ๑ฦ๗ตฤมฌฝำ"
-
-#~ msgid "E241: Unable to send to %s"
-#~ msgstr "E241: ฮทจทขหอตฝ %s"
-
-#~ msgid "E277: Unable to read a server reply"
-#~ msgstr "E277: ฮทจถมศกทฮ๑ฦ๗ฯ์ำฆ"
-
-#~ msgid "E258: Unable to send to client"
-#~ msgstr "E258: ฮทจทขหอตฝฟอปงถห"
-
-#~ msgid "Save As"
-#~ msgstr "มํดๆฮช"
-
-#~ msgid "Edit File"
-#~ msgstr "ฑเผญฮฤผ"
-
-#~ msgid " (NOT FOUND)"
-#~ msgstr " (ีาฒปตฝ)"
-
-#~ msgid "Source Vim script"
-#~ msgstr "ึดะะ Vim ฝลฑพ"
-
-#~ msgid "Edit File in new window"
-#~ msgstr "ิฺะยดฐฟฺฑเผญฮฤผ"
-
-#~ msgid "Append File"
-#~ msgstr "ืทผำฮฤผ"
-
-#~ msgid "Window position: X %d, Y %d"
-#~ msgstr "ดฐฟฺฮปึร: X %d, Y %d"
-
-#~ msgid "Save Redirection"
-#~ msgstr "ฑฃดๆึุถจฯ๒"
-
-#~ msgid "Save View"
-#~ msgstr "ฑฃดๆสำอผ"
-
-#~ msgid "Save Session"
-#~ msgstr "ฑฃดๆปแปฐ"
-
-#~ msgid "Save Setup"
-#~ msgstr "ฑฃดๆษ่ถจ"
-
-#~ msgid "E196: No digraphs in this version"
-#~ msgstr "E196: ดหฐๆฑพฮธดบฯืึท๛(digraph)"
-
-#~ msgid "Reading from stdin..."
-#~ msgstr "ดำฑ๊ืผสไศ๋ถมศก..."
-
-#~ msgid "[NL found]"
-#~ msgstr "[ีาตฝ NL]"
-
-#~ msgid "[crypted]"
-#~ msgstr "[าัผำร]"
-
-#~ msgid "NetBeans disallows writes of unmodified buffers"
-#~ msgstr "NetBeans ฒปิสะํฮดะธฤตฤปบณๅว๘ะดศ๋"
-
-#~ msgid "Partial writes disallowed for NetBeans buffers"
-#~ msgstr "NetBeans ฒปิสะํปบณๅว๘ฒฟทึะดศ๋"
-
-#~ msgid "E460: The resource fork would be lost (add ! to override)"
-#~ msgstr "E460: Resource fork ปแถชสง (ว๋ผำ ! วฟึฦึดะะ)"
-
-#~ msgid "E229: Cannot start the GUI"
-#~ msgstr "E229: ฮทจฦ๔ถฏอผะฮฝ็รๆ"
-
-#~ msgid "E230: Cannot read from \"%s\""
-#~ msgstr "E230: ฮทจถมศกฮฤผ \"%s\""
-
-#~ msgid "E665: Cannot start GUI, no valid font found"
-#~ msgstr "E665: ฮทจฦ๔ถฏอผะฮฝ็รๆฃฌีาฒปตฝำะะงตฤืึฬๅ"
-
-#~ msgid "E231: 'guifontwide' invalid"
-#~ msgstr "E231: ฮะงตฤ 'guifontwide'"
-
-#~ msgid "E599: Value of 'imactivatekey' is invalid"
-#~ msgstr "E599: 'imactivatekey' ตฤึตฮะง"
-
-#~ msgid "E254: Cannot allocate color %s"
-#~ msgstr "E254: ฮทจทึลไัีษซ %s"
-
-#~ msgid "No match at cursor, finding next"
-#~ msgstr "ิฺนโฑ๊ดฆรปำะฦฅลไฃฌฒ้ีาฯยาปธ๖"
-
-#~ msgid "<cannot open> "
-#~ msgstr "<ฮทจด๒ฟช>"
-
-#~ msgid "E616: vim_SelFile: can't get font %s"
-#~ msgstr "E616: vim_SelFile: ฮทจป๑ศกืึฬๅ %s"
-
-#~ msgid "E614: vim_SelFile: can't return to current directory"
-#~ msgstr "E614: vim_SelFile: ฮทจทตปุตฑวฐฤฟยผ"
-
-#~ msgid "Pathname:"
-#~ msgstr "ยทพถ:"
-
-#~ msgid "E615: vim_SelFile: can't get current directory"
-#~ msgstr "E615: vim_SelFile: ฮทจป๑ศกตฑวฐฤฟยผ"
-
-#~ msgid "OK"
-#~ msgstr "ศทถจ"
-
-#~ msgid "Cancel"
-#~ msgstr "ศกฯ๛"
-
-#~ msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
-#~ msgstr "น๖ถฏฬ๕ฒฟผ: ฮทจป๑ศกปฌฟ้อผฯ๑ตฤผธบฮด๓ะก"
-
-#~ msgid "Vim dialog"
-#~ msgstr "Vim ถิปฐฟ๒"
-
-#~ msgid "E232: Cannot create BalloonEval with both message and callback"
-#~ msgstr "E232: ฒปฤอฌสฑสนำรฯ๛ฯขบอปุต๗บฏสภดดดฝจ BalloonEval"
-
-#~ msgid "Vim dialog..."
-#~ msgstr "Vim ถิปฐฟ๒..."
-
-#~ msgid "Input _Methods"
-#~ msgstr "สไศ๋ทจ(_M)"
-
-#~ msgid "VIM - Search and Replace..."
-#~ msgstr "VIM - ฒ้ีาบอฬๆปป..."
-
-#~ msgid "VIM - Search..."
-#~ msgstr "VIM - ฒ้ีา..."
-
-#~ msgid "Find what:"
-#~ msgstr "ฒ้ีาฤฺศ:"
-
-#~ msgid "Replace with:"
-#~ msgstr "ฬๆปปฮช:"
-
-#~ msgid "Match whole word only"
-#~ msgstr "ฦฅลไอ๊ี๛ตฤดส"
-
-#~ msgid "Match case"
-#~ msgstr "ฦฅลได๓ะกะด"
-
-#~ msgid "Direction"
-#~ msgstr "ทฝฯ๒"
-
-#~ msgid "Up"
-#~ msgstr "ฯ๒ษฯ"
-
-#~ msgid "Down"
-#~ msgstr "ฯ๒ฯย"
-
-#~ msgid "Find Next"
-#~ msgstr "ฒ้ีาฯยาปธ๖"
-
-#~ msgid "Replace"
-#~ msgstr "ฬๆปป"
-
-#~ msgid "Replace All"
-#~ msgstr "ศซฒฟฬๆปป"
-
-#~ msgid "Vim: Received \"die\" request from session manager\n"
-#~ msgstr "Vim: ดำปแปฐนภํฦ๗สีตฝ \"die\" ว๋ว๓\n"
-
-#~ msgid "Close"
-#~ msgstr "นุฑี"
-
-#~ msgid "New tab"
-#~ msgstr "ะยฝจฑ๊วฉ"
-
-#~ msgid "Open Tab..."
-#~ msgstr "ด๒ฟชฑ๊วฉ..."
-
-#~ msgid "Vim: Main window unexpectedly destroyed\n"
-#~ msgstr "Vim: ึ๗ดฐฟฺฑปาโอโตุดปู\n"
-
-#~ msgid "Font Selection"
-#~ msgstr "ักิ๑ืึฬๅ"
-
-#~ msgid "Used CUT_BUFFER0 instead of empty selection"
-#~ msgstr "สนำร CUT_BUFFER0 ภดศกด๚ฟีักิ๑"
-
-#~ msgid "&Filter"
-#~ msgstr "นยห(&F)"
-
-#~ msgid "&Cancel"
-#~ msgstr "ศกฯ๛(&C)"
-
-#~ msgid "Directories"
-#~ msgstr "ฤฟยผ"
-
-#~ msgid "Filter"
-#~ msgstr "นยหฦ๗"
-
-#~ msgid "&Help"
-#~ msgstr "ฐ๏ึ๚(&H)"
-
-#~ msgid "Files"
-#~ msgstr "ฮฤผ"
-
-#~ msgid "&OK"
-#~ msgstr "ศทถจ(&O)"
-
-#~ msgid "Selection"
-#~ msgstr "ักิ๑"
-
-#~ msgid "Find &Next"
-#~ msgstr "ฒ้ีาฯยาปธ๖(&N)"
-
-#~ msgid "&Replace"
-#~ msgstr "ฬๆปป(&R)"
-
-#~ msgid "Replace &All"
-#~ msgstr "ศซฒฟฬๆปป(&A)"
-
-#~ msgid "&Undo"
-#~ msgstr "ณทฯ๚(&U)"
-
-#~ msgid "E671: Cannot find window title \"%s\""
-#~ msgstr "E671: ีาฒปตฝดฐฟฺฑ๊ฬโ \"%s\""
-
-#~ msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
-#~ msgstr "E243: ฒปึงณึตฤฒฮส: \"-%s\"ฃปว๋สนำร OLE ฐๆฑพกฃ"
-
-#~ msgid "E672: Unable to open window inside MDI application"
-#~ msgstr "E672: ฮทจิฺ MDI ำฆำรณฬะ๒ึะด๒ฟชดฐฟฺ"
-
-#~ msgid "Close tab"
-#~ msgstr "นุฑีฑ๊วฉ"
-
-#~ msgid "Open tab..."
-#~ msgstr "ด๒ฟชฑ๊วฉ..."
-
-#~ msgid "Find string (use '\\\\' to find a '\\')"
-#~ msgstr "ฒ้ีาืึท๛ดฎ (สนำร '\\\\' ภดฒ้ีา '\\')"
-
-#~ msgid "Find & Replace (use '\\\\' to find a '\\')"
-#~ msgstr "ฒ้ีาบอฬๆปปืึท๛ดฎ (สนำร '\\\\' ภดฒ้ีา '\\')"
-
-#~ msgid "Not Used"
-#~ msgstr "ฮดสนำร"
-
-#~ msgid "Directory\t*.nothing\n"
-#~ msgstr "ฤฟยผ\t*.nothing\n"
-
-#~ msgid ""
-#~ "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
-#~ msgstr "Vim E458: ฮทจทึลไัีษซฑํฯ๎ฃฌฤณะฉัีษซฟษฤฒปีศท"
-
-#~ msgid "E250: Fonts for the following charsets are missing in fontset %s:"
-#~ msgstr "E250: Fontset %s ศฑษูฯยมะืึท๛ผฏตฤืึฬๅ:"
-
-#~ msgid "E252: Fontset name: %s"
-#~ msgstr "E252: Fontset ร๛ณฦ: %s"
-
-#~ msgid "Font '%s' is not fixed-width"
-#~ msgstr "'%s' ฒปสวนฬถจฟํถศตฤืึฬๅ"
-
-#~ msgid "E253: Fontset name: %s\n"
-#~ msgstr "E253: Fontset ร๛ณฦ: %s\n"
-
-#~ msgid "Font0: %s\n"
-#~ msgstr "ืึฬๅ0: %s\n"
-
-#~ msgid "Font1: %s\n"
-#~ msgstr "ืึฬๅ1: %s\n"
-
-#~ msgid "Font%<PRId64> width is not twice that of font0\n"
-#~ msgstr "ืึฬๅ%<PRId64>ตฤฟํถศฒปสวืึฬๅ0ตฤมฝฑถ\n"
-
-#~ msgid "Font0 width: %<PRId64>\n"
-#~ msgstr "ืึฬๅ0ตฤฟํถศฃบ%<PRId64>\n"
-
-#~ msgid ""
-#~ "Font1 width: %<PRId64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "ืึฬๅ1ตฤฟํถศ: %<PRId64>\n"
-#~ "\n"
-
-#~ msgid "Invalid font specification"
-#~ msgstr "ึธถจมหฮะงตฤืึฬๅ"
-
-#~ msgid "&Dismiss"
-#~ msgstr "ศกฯ๛(&D)"
-
-#~ msgid "no specific match"
-#~ msgstr "ีาฒปตฝฦฅลไตฤฯ๎"
-
-#~ msgid "Vim - Font Selector"
-#~ msgstr "Vim - ืึฬๅักิ๑ฦ๗"
-
-#~ msgid "Name:"
-#~ msgstr "ร๛ณฦ:"
-
-#~ msgid "Encoding:"
-#~ msgstr "ฑเย๋:"
-
-#~ msgid "Font:"
-#~ msgstr "ืึฬๅ:"
-
-#~ msgid "Style:"
-#~ msgstr "ท็ธ๑:"
-
-#~ msgid "Size:"
-#~ msgstr "ณ฿ด็:"
-
-#~ msgid "E256: Hangul automata ERROR"
-#~ msgstr "E256: Hangul automata ดํฮ๓"
-
-#~ msgid "E563: stat error"
-#~ msgstr "E563: stat ดํฮ๓"
-
-#~ msgid "E625: cannot open cscope database: %s"
-#~ msgstr "E625: ฮทจด๒ฟช cscope สพฟโ: %s"
-
-#~ msgid "E626: cannot get cscope database information"
-#~ msgstr "E626: ฮทจป๑ศก cscope สพฟโะลฯข"
-
-#~ msgid "E569: maximum number of cscope connections reached"
-#~ msgstr "E569: าัด๏ตฝ cscope ตฤื๎ด๓มฌฝำส"
-
-#~ msgid ""
-#~ "???: Sorry, this command is disabled, the MzScheme library could not be "
-#~ "loaded."
-#~ msgstr "???: ฑงวธฃฌดหรม๎ฒปฟษำรฃฌฮทจผำิุ MzScheme ฟโ"
-
-#~ msgid "invalid expression"
-#~ msgstr "ฮะงตฤฑํด๏สฝ"
-
-#~ msgid "expressions disabled at compile time"
-#~ msgstr "ฑเา๋สฑรปำะฦ๔ำรฑํด๏สฝ"
-
-#~ msgid "hidden option"
-#~ msgstr "าฒุตฤักฯ๎"
-
-#~ msgid "unknown option"
-#~ msgstr "ฮดึชตฤักฯ๎"
-
-#~ msgid "window index is out of range"
-#~ msgstr "ดฐฟฺห๗าณฌณ๖ทถฮง"
-
-#~ msgid "couldn't open buffer"
-#~ msgstr "ฮทจด๒ฟชปบณๅว๘"
-
-#~ msgid "cannot save undo information"
-#~ msgstr "ฮทจฑฃดๆณทฯ๚ะลฯข"
-
-#~ msgid "cannot delete line"
-#~ msgstr "ฮทจษพณะะ"
-
-#~ msgid "cannot replace line"
-#~ msgstr "ฮทจฬๆปปะะ"
-
-#~ msgid "cannot insert line"
-#~ msgstr "ฮทจฒๅศ๋ะะ"
-
-#~ msgid "string cannot contain newlines"
-#~ msgstr "ืึท๛ดฎฒปฤฐบฌปปะะ(NL)"
-
-#~ msgid "Vim error: ~a"
-#~ msgstr "Vim ดํฮ๓: ~a"
-
-#~ msgid "Vim error"
-#~ msgstr "Vim ดํฮ๓"
-
-#~ msgid "buffer is invalid"
-#~ msgstr "ปบณๅว๘ฮะง"
-
-#~ msgid "window is invalid"
-#~ msgstr "ดฐฟฺฮะง"
-
-#~ msgid "linenr out of range"
-#~ msgstr "ะะบลณฌณ๖ทถฮง"
-
-#~ msgid "not allowed in the Vim sandbox"
-#~ msgstr "ฒปิสะํิฺ sandbox ึะสนำร"
-
-#~ msgid ""
-#~ "E263: Sorry, this command is disabled, the Python library could not be "
-#~ "loaded."
-#~ msgstr "E263: ฑงวธฃฌดหรม๎ฒปฟษำรฃฌฮทจผำิุ Python ฟโกฃ"
-
-#~ msgid "E659: Cannot invoke Python recursively"
-#~ msgstr "E659: ฒปฤตน้ต๗ำร Python"
-
-#~ msgid "can't delete OutputObject attributes"
-#~ msgstr "ฒปฤษพณ OutputObject ส๔ะิ"
-
-#~ msgid "softspace must be an integer"
-#~ msgstr "softspace ฑุะ๋สวี๛ส"
-
-#~ msgid "invalid attribute"
-#~ msgstr "ฮะงตฤส๔ะิ"
-
-#~ msgid "writelines() requires list of strings"
-#~ msgstr "writelines() ะ่าชืึท๛ดฎมะฑํื๗ฒฮส"
-
-#~ msgid "E264: Python: Error initialising I/O objects"
-#~ msgstr "E264: Python: ณ๕สผปฏ I/O ถิฯ๓ณ๖ดํ"
-
-#~ msgid "attempt to refer to deleted buffer"
-#~ msgstr "สิอผาำราัฑปษพณตฤปบณๅว๘"
-
-#~ msgid "line number out of range"
-#~ msgstr "ะะบลณฌณ๖ทถฮง"
-
-#~ msgid "<buffer object (deleted) at %8lX>"
-#~ msgstr "<ปบณๅว๘ถิฯ๓(าัษพณ): %8lX>"
-
-#~ msgid "invalid mark name"
-#~ msgstr "ฮะงตฤฑ๊ผวร๛ณฦ"
-
-#~ msgid "no such buffer"
-#~ msgstr "ฮดหปบณๅว๘"
-
-#~ msgid "attempt to refer to deleted window"
-#~ msgstr "สิอผาำราัฑปษพณตฤดฐฟฺ"
-
-#~ msgid "readonly attribute"
-#~ msgstr "ึปถมส๔ะิ"
-
-#~ msgid "cursor position outside buffer"
-#~ msgstr "นโฑ๊ฮปึริฺปบณๅว๘อโ"
-
-#~ msgid "<window object (deleted) at %.8lX>"
-#~ msgstr "<ดฐฟฺถิฯ๓(าัษพณ): %.8lX>"
-
-#~ msgid "<window object (unknown) at %.8lX>"
-#~ msgstr "<ดฐฟฺถิฯ๓(ฮดึช): %.8lX>"
-
-#~ msgid "<window %d>"
-#~ msgstr "<ดฐฟฺ %d>"
-
-#~ msgid "no such window"
-#~ msgstr "ฮดหดฐฟฺ"
-
-#~ msgid ""
-#~ "E266: Sorry, this command is disabled, the Ruby library could not be "
-#~ "loaded."
-#~ msgstr "E266: ฑงวธฃฌดหรม๎ฒปฟษำรฃฌฮทจผำิุ Ruby ฟโ"
-
-#~ msgid "E273: unknown longjmp status %d"
-#~ msgstr "E273: ฮดึชตฤ longjmp ืดฬฌ %d"
-
-#~ msgid "Toggle implementation/definition"
-#~ msgstr "วะปปสตฯึ/ถจาๅ"
-
-#~ msgid "Show base class of"
-#~ msgstr "ฯิสพ base class of:"
-
-#~ msgid "Show overridden member function"
-#~ msgstr "ฯิสพฑปธฒธวตฤณษิฑบฏส"
-
-#~ msgid "Retrieve from file"
-#~ msgstr "ปึธด: ดำฮฤผ"
-
-#~ msgid "Retrieve from project"
-#~ msgstr "ปึธด: ดำถิฯ๓"
-
-#~ msgid "Retrieve from all projects"
-#~ msgstr "ปึธด: ดำห๙ำะฯ๎ฤฟ"
-
-#~ msgid "Retrieve"
-#~ msgstr "ปึธด"
-
-#~ msgid "Show source of"
-#~ msgstr "ฯิสพิดด๚ย๋: "
-
-#~ msgid "Find symbol"
-#~ msgstr "ฒ้ีา symbol"
-
-#~ msgid "Browse class"
-#~ msgstr "ไฏภภ class"
-
-#~ msgid "Show class in hierarchy"
-#~ msgstr "ฯิสพฒใดฮนุฯตตฤภเ"
-
-#~ msgid "Show class in restricted hierarchy"
-#~ msgstr "ฯิสพ restricted ฒใดฮนุฯตตฤ class"
-
-#~ msgid "Xref refers to"
-#~ msgstr "Xref ฒฮฟผตฝ"
-
-#~ msgid "Xref referred by"
-#~ msgstr "Xref ฑปหญฒฮฟผ:"
-
-#~ msgid "Xref has a"
-#~ msgstr "Xref ำะ"
-
-#~ msgid "Xref used by"
-#~ msgstr "Xref ฑปหญสนำร:"
-
-#~ msgid "Show docu of"
-#~ msgstr "ฯิสพฮฤผ: "
-
-#~ msgid "Generate docu for"
-#~ msgstr "ฒ๚ษ๚ฮฤผ: "
-
-#~ msgid ""
-#~ "Cannot connect to SNiFF+. Check environment (sniffemacs must be found in "
-#~ "$PATH).\n"
-#~ msgstr ""
-#~ "ฒปฤมฌฝำตฝ SNiFF+กฃว๋ผ์ฒ้ปทพณฑไมฟ ($PATH ภ๏ฑุะ่ฟษาิีาตฝ sniffemacs)\n"
-
-#~ msgid "E274: Sniff: Error during read. Disconnected"
-#~ msgstr "E274: Sniff: ถมศกดํฮ๓. ศกฯ๛มฌฝำ"
-
-#~ msgid "SNiFF+ is currently "
-#~ msgstr "SNiFF+ ฤฟวฐ"
-
-#~ msgid "not "
-#~ msgstr "ฮด"
-
-#~ msgid "connected"
-#~ msgstr "มฌฝำึะ"
-
-#~ msgid "E275: Unknown SNiFF+ request: %s"
-#~ msgstr "E275: ฒปีศทตฤ SNiff+ ต๗ำร: %s"
-
-#~ msgid "E276: Error connecting to SNiFF+"
-#~ msgstr "E276: มฌฝำตฝ SNiFF+ สงฐ"
-
-#~ msgid "E278: SNiFF+ not connected"
-#~ msgstr "E278: ฮดมฌฝำตฝ SNiFF+"
-
-#~ msgid "E279: Not a SNiFF+ buffer"
-#~ msgstr "E279: ฒปสว SNiFF+ ตฤปบณๅว๘"
-
-#~ msgid "Sniff: Error during write. Disconnected"
-#~ msgstr "Sniff: ะดศ๋ดํฮ๓กฃฝแส๘มฌฝำ"
-
-#~ msgid "invalid buffer number"
-#~ msgstr "ฮะงตฤปบณๅว๘บล"
-
-#~ msgid "not implemented yet"
-#~ msgstr "ษะฮดสตฯึ"
-
-#~ msgid "cannot set line(s)"
-#~ msgstr "ฮทจษ่ถจะะ"
-
-#~ msgid "mark not set"
-#~ msgstr "รปำะษ่ถจฑ๊ผว"
-
-#~ msgid "row %d column %d"
-#~ msgstr "ตฺ %d ะะ ตฺ %d มะ"
-
-#~ msgid "cannot insert/append line"
-#~ msgstr "ฮทจฒๅศ๋/ืทผำะะ"
-
-#~ msgid "unknown flag: "
-#~ msgstr "ฮดึชตฤฑ๊ึพ: "
-
-#~ msgid "unknown vimOption"
-#~ msgstr "ฮดึชตฤ vim ักฯ๎"
-
-#~ msgid "keyboard interrupt"
-#~ msgstr "ผลฬึะถฯ"
-
-#~ msgid "vim error"
-#~ msgstr "vim ดํฮ๓"
-
-#~ msgid "cannot create buffer/window command: object is being deleted"
-#~ msgstr "ฮทจดดฝจปบณๅว๘/ดฐฟฺรม๎: ถิฯ๓ฝซฑปษพณ"
-
-#~ msgid ""
-#~ "cannot register callback command: buffer/window is already being deleted"
-#~ msgstr "ฮทจืขฒแปุต๗รม๎: ปบณๅว๘/ดฐฟฺาัฑปษพณ"
-
-#~ msgid ""
-#~ "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-"
-#~ "dev@vim.org"
-#~ msgstr "E280: TCL ัฯึุดํฮ๓: reflist ห๐ปตฃกฃฟว๋ฑจธๆธ๘ vim-dev@vim.org"
-
-#~ msgid "cannot register callback command: buffer/window reference not found"
-#~ msgstr "ฮทจืขฒแปุต๗รม๎: ีาฒปตฝปบณๅว๘/ดฐฟฺาำร"
-
-#~ msgid ""
-#~ "E571: Sorry, this command is disabled: the Tcl library could not be "
-#~ "loaded."
-#~ msgstr "E571: ฑงวธฃฌดหรม๎ฒปฟษำรฃฌฮทจผำิุ Tcl ฟโ"
-
-#~ msgid ""
-#~ "E281: TCL ERROR: exit code is not int!? Please report this to vim-dev@vim."
-#~ "org"
-#~ msgstr "E281: TCL ดํฮ๓: อหณ๖ทตปุึตฒปสวี๛สฃกฃฟว๋ฑจธๆธ๘ vim-dev@vim.org"
-
-#~ msgid "E572: exit code %d"
-#~ msgstr "E572: อหณ๖ทตปุึต %d"
-
-#~ msgid "cannot get line"
-#~ msgstr "ฮทจป๑ศกะะ"
-
-#~ msgid "Unable to register a command server name"
-#~ msgstr "ฮทจืขฒแรม๎ทฮ๑ฦ๗ร๛"
-
-#~ msgid "E248: Failed to send command to the destination program"
-#~ msgstr "E248: ฮทจทขหอรม๎ตฝฤฟตฤณฬะ๒"
-
-#~ msgid "E573: Invalid server id used: %s"
-#~ msgstr "E573: สนำรมหฮะงตฤทฮ๑ฦ๗ id: %s"
-
-#~ msgid "E251: VIM instance registry property is badly formed. Deleted!"
-#~ msgstr "E251: VIM สตภืขฒแส๔ะิำะฮ๓กฃาัษพณฃก"
-
-#~ msgid "This Vim was not compiled with the diff feature."
-#~ msgstr "ดห Vim ฑเา๋สฑรปำะผำศ๋ diff นฆฤ"
-
-#~ msgid "Vim: Error: Failure to start gvim from NetBeans\n"
-#~ msgstr "Vim: ดํฮ๓: ฮทจดำ NetBeans ึะฦ๔ถฏ gvim\n"
-
-#~ msgid "-register\t\tRegister this gvim for OLE"
-#~ msgstr "-register\t\tืขฒแดห gvim ตฝ OLE"
-
-#~ msgid "-unregister\t\tUnregister gvim for OLE"
-#~ msgstr "-unregister\t\tศกฯ๛ OLE ึะตฤ gvim ืขฒแ"
-
-#~ msgid "-g\t\t\tRun using GUI (like \"gvim\")"
-#~ msgstr "-g\t\t\tสนำรอผะฮฝ็รๆ (อฌ \"gvim\")"
-
-#~ msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
-#~ msgstr "-f ป๒ --nofork\tวฐฬจ: ฦ๔ถฏอผะฮฝ็รๆสฑฒป fork"
-
-#~ msgid "-V[N]\t\tVerbose level"
-#~ msgstr "-V[N]\t\tVerbose ตศผถ"
-
-#~ msgid "-f\t\t\tDon't use newcli to open window"
-#~ msgstr "-f\t\t\tฒปสนำร newcli ภดด๒ฟชดฐฟฺ"
-
-#~ msgid "-dev <device>\t\tUse <device> for I/O"
-#~ msgstr "-dev <device>\t\tสนำร <device> ฝ๘ะะสไศ๋สไณ๖"
-
-#~ msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
-#~ msgstr "-U <gvimrc>\t\tสนำร <gvimrc> ฬๆด๚ศฮบฮ .gvimrc"
-
-#~ msgid "-x\t\t\tEdit encrypted files"
-#~ msgstr "-x\t\t\tฑเผญผำรตฤฮฤผ"
-
-#~ msgid "-display <display>\tConnect vim to this particular X-server"
-#~ msgstr "-display <display>\tฝซ vim ำ๋ึธถจตฤ X-server มฌฝำ"
-
-#~ msgid "-X\t\t\tDo not connect to X server"
-#~ msgstr "-X\t\t\tฒปมฌฝำตฝ X Server"
-
-#~ msgid "--remote <files>\tEdit <files> in a Vim server if possible"
-#~ msgstr "--remote <files>\tศ็ำะฟษฤฃฌิฺ Vim ทฮ๑ฦ๗ษฯฑเผญฮฤผ <files>"
-
-#~ msgid "--remote-silent <files> Same, don't complain if there is no server"
-#~ msgstr "--remote-silent <files> อฌษฯฃฌีาฒปตฝทฮ๑ฦ๗สฑฒปฑงิน"
-
-#~ msgid ""
-#~ "--remote-wait <files> As --remote but wait for files to have been edited"
-#~ msgstr "--remote-wait <files> อฌ --remote ตซปแตศดฮฤผอ๊ณษฑเผญ"
-
-#~ msgid ""
-#~ "--remote-wait-silent <files> Same, don't complain if there is no server"
-#~ msgstr "--remote-wait-silent <files> อฌษฯฃฌีาฒปตฝทฮ๑ฦ๗สฑฒปฑงิน"
-
-#~ msgid "--remote-tab <files> As --remote but open tab page for each file"
-#~ msgstr "--remote-tab <files> อฌ --remote ตซถิรฟธ๖ฮฤผด๒ฟชาปธ๖ฑ๊วฉาณ"
-
-#~ msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
-#~ msgstr "--remote-send <keys>\tหอณ๖ <keys> ตฝ Vim ทฮ๑ฦ๗ฒขอหณ๖"
-
-#~ msgid ""
-#~ "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
-#~ msgstr "--remote-expr <expr>\tิฺ Vim ทฮ๑ฦ๗ษฯว๓ <expr> ตฤึตฒขด๒ำกฝแน๛"
-
-#~ msgid "--serverlist\t\tList available Vim server names and exit"
-#~ msgstr "--serverlist\t\tมะณ๖ฟษำรตฤ Vim ทฮ๑ฦ๗ร๛ณฦฒขอหณ๖"
-
-#~ msgid "--servername <name>\tSend to/become the Vim server <name>"
-#~ msgstr "--servername <name>\tทขหอตฝป๒ณษฮช Vim ทฮ๑ฦ๗ <name>"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Motif version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvim (Motif ฐๆฑพ) ฟษสถฑ๐ตฤฒฮส:\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (neXtaw version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvim (neXtaw ฐๆฑพ) ฟษสถฑ๐ตฤฒฮส:\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Athena version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvim (Athena ฐๆฑพ) ฟษสถฑ๐ตฤฒฮส:\n"
-
-#~ msgid "-display <display>\tRun vim on <display>"
-#~ msgstr "-display <display>\tิฺ <display> ษฯิหะะ vim"
-
-#~ msgid "-iconic\t\tStart vim iconified"
-#~ msgstr "-iconic\t\tฦ๔ถฏบ๓ื๎ะกปฏ"
-
-#~ msgid "-name <name>\t\tUse resource as if vim was <name>"
-#~ msgstr "-name <name>\t\tถมศก Resource สฑฐั vim สำฮช <name>"
-
-#~ msgid "\t\t\t (Unimplemented)\n"
-#~ msgstr "\t\t\t (ษะฮดสตฯึ)\n"
-
-#~ msgid "-background <color>\tUse <color> for the background (also: -bg)"
-#~ msgstr "-background <color>\tสนำร <color> ื๗ฮชฑณพฐษซ (าฒฟษำร -bg)"
-
-#~ msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
-#~ msgstr "-foreground <color>\tสนำร <color> ื๗ฮชาปฐใฮฤืึัีษซ (าฒฟษำร -fg)"
-
-#~ msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
-#~ msgstr "-font <font>\tสนำร <font> ื๗ฮชาปฐใืึฬๅ (าฒฟษำร -fn)"
-
-#~ msgid "-boldfont <font>\tUse <font> for bold text"
-#~ msgstr "-boldfont <font>\tสนำร <font> ื๗ฮชดึฬๅืึฬๅ"
-
-#~ msgid "-italicfont <font>\tUse <font> for italic text"
-#~ msgstr "-italicfont <font>\tสนำร <font> ื๗ฮชะฑฬๅืึฬๅ"
-
-#~ msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
-#~ msgstr "-geometry <geom>\tสนำร <geom> ื๗ฮชณ๕สผฮปึร (าฒฟษำร -geom)"
-
-#~ msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
-#~ msgstr "-borderwidth <width>\tษ่ถจฑ฿ฟ๒ฟํถศฮช <width> (าฒฟษำร -bw)"
-
-#~ msgid ""
-#~ "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
-#~ msgstr "-scrollbarwidth <width> ษ่ถจน๖ถฏฬ๕ฟํถศฮช <width> (าฒฟษำร -sw)"
-
-#~ msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
-#~ msgstr "-menuheight <height>\tษ่ถจฒหตฅภธธ฿ถศฮช <height> (าฒฟษำร -mh)"
-
-#~ msgid "-reverse\t\tUse reverse video (also: -rv)"
-#~ msgstr "-reverse\t\tสนำรทดฯิ (าฒฟษำร -rv)"
-
-#~ msgid "+reverse\t\tDon't use reverse video (also: +rv)"
-#~ msgstr "+reverse\t\tฒปสนำรทดฯิ (าฒฟษำร +rv)"
-
-#~ msgid "-xrm <resource>\tSet the specified resource"
-#~ msgstr "-xrm <resource>\tษ่ถจึธถจตฤืสิด"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (RISC OS version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvim (RISC OS ฐๆฑพ) ฟษสถฑ๐ตฤฒฮส:\n"
-
-#~ msgid "--columns <number>\tInitial width of window in columns"
-#~ msgstr "--columns <number>\tดฐฟฺณ๕สผฟํถศ"
-
-#~ msgid "--rows <number>\tInitial height of window in rows"
-#~ msgstr "--rows <number>\tดฐฟฺณ๕สผธ฿ถศ"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (GTK+ version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvim (GTK+ ฐๆฑพ) ฟษสถฑ๐ตฤฒฮส:\n"
-
-#~ msgid "-display <display>\tRun vim on <display> (also: --display)"
-#~ msgstr "-display <display>\tิฺ <display> ษฯิหะะ vim (าฒฟษำร --display)"
-
-#~ msgid "--role <role>\tSet a unique role to identify the main window"
-#~ msgstr "--role <role>\tษ่ึรำรำฺว๘ทึึ๗ดฐฟฺตฤดฐฟฺฝวษซร๛"
-
-#~ msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
-#~ msgstr "--socketid <xid>\tิฺมําปธ๖ GTK ฒฟผึะด๒ฟช Vim"
-
-#~ msgid "-P <parent title>\tOpen Vim inside parent application"
-#~ msgstr "-P <parent title>\tิฺธธำฆำรณฬะ๒ึะด๒ฟช Vim"
-
-#~ msgid "No display"
-#~ msgstr "รปำะ display"
-
-#~ msgid ": Send failed.\n"
-#~ msgstr ": ทขหอสงฐกฃ\n"
-
-#~ msgid ": Send failed. Trying to execute locally\n"
-#~ msgstr ": ทขหอสงฐกฃณขสิฑพตุึดะะ\n"
-
-#~ msgid "%d of %d edited"
-#~ msgstr "%d ึะ %d าัฑเผญ"
-
-#~ msgid "No display: Send expression failed.\n"
-#~ msgstr "รปำะ display: ทขหอฑํด๏สฝสงฐกฃ\n"
-
-#~ msgid ": Send expression failed.\n"
-#~ msgstr ": ทขหอฑํด๏สฝสงฐกฃ\n"
-
-#~ msgid "E543: Not a valid codepage"
-#~ msgstr "E543: ฮะงตฤด๚ย๋าณ"
-
-#~ msgid "E285: Failed to create input context"
-#~ msgstr "E285: ฮทจดดฝจสไศ๋ษฯฯยฮฤ"
-
-#~ msgid "E286: Failed to open input method"
-#~ msgstr "E286: ฮทจด๒ฟชสไศ๋ทจ"
-
-#~ msgid "E287: Warning: Could not set destroy callback to IM"
-#~ msgstr "E287: พฏธๆ: ฮทจษ่ถจสไศ๋ทจตฤสอทลปุต๗บฏส"
-
-#~ msgid "E288: input method doesn't support any style"
-#~ msgstr "E288: สไศ๋ทจฒปึงณึศฮบฮท็ธ๑"
-
-#~ msgid "E289: input method doesn't support my preedit type"
-#~ msgstr "E289: สไศ๋ทจฒปึงณึฮาตฤิคฑเผญภเะอ"
-
-#~ msgid "E290: over-the-spot style requires fontset"
-#~ msgstr "E290: over-the-spot ท็ธ๑ะ่าช Fontset"
-
-#~ msgid "E291: Your GTK+ is older than 1.2.3. Status area disabled"
-#~ msgstr "E291: ฤใตฤ GTK+ ฑศ 1.2.3 พษกฃืดฬฌว๘ฒปฟษำรกฃ"
-
-#~ msgid "E292: Input Method Server is not running"
-#~ msgstr "E292: สไศ๋ทจทฮ๑ฦ๗ฮดิหะะ"
-
-#~ msgid ""
-#~ "\n"
-#~ " [not usable with this version of Vim]"
-#~ msgstr ""
-#~ "\n"
-#~ " [ฒปฤิฺธรฐๆฑพตฤ Vim ษฯสนำร]"
-
-#~ msgid "Tear off this menu"
-#~ msgstr "หบฯยดหฒหตฅ"
-
-#~ msgid "Select Directory dialog"
-#~ msgstr "ักิ๑ฤฟยผถิปฐฟ๒"
-
-#~ msgid "Save File dialog"
-#~ msgstr "ฑฃดๆฮฤผถิปฐฟ๒"
-
-#~ msgid "Open File dialog"
-#~ msgstr "ด๒ฟชฮฤผถิปฐฟ๒"
-
-#~ msgid "E338: Sorry, no file browser in console mode"
-#~ msgstr "E338: ฑงวธฃฌฟุึฦฬจฤฃสฝฯยรปำะฮฤผไฏภภฦ๗"
-
-#~ msgid "Vim: preserving files...\n"
-#~ msgstr "Vim: ีิฺฑฃม๔ฮฤผกญกญ\n"
-
-#~ msgid "Vim: Finished.\n"
-#~ msgstr "Vim: ฝแส๘กฃ\n"
-
-#~ msgid "ERROR: "
-#~ msgstr "ดํฮ๓: "
-
-#~ msgid ""
-#~ "\n"
-#~ "[bytes] total alloc-freed %<PRIu64>-%<PRIu64>, in use %<PRIu64>, peak use "
-#~ "%<PRIu64>\n"
-#~ msgstr ""
-#~ "\n"
-#~ "[ืึฝฺ] ืนฒ alloc-free %<PRIu64>-%<PRIu64>ฃฌสนำรึะ %<PRIu64>ฃฌธ฿ทๅสนำร "
-#~ "%<PRIu64>\n"
-
-#~ msgid ""
-#~ "[calls] total re/malloc()'s %<PRIu64>, total free()'s %<PRIu64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "[ต๗ำร] ืนฒ re/malloc(): %<PRIu64>ฃฌืนฒ free()': %<PRIu64>\n"
-#~ "\n"
-
-#~ msgid "E340: Line is becoming too long"
-#~ msgstr "E340: ดหะะนณค"
-
-#~ msgid "E341: Internal error: lalloc(%<PRId64>, )"
-#~ msgstr "E341: ฤฺฒฟดํฮ๓: lalloc(%<PRId64>, )"
-
-#~ msgid "E547: Illegal mouseshape"
-#~ msgstr "E547: ฮะงตฤส๓ฑ๊ะฮืด"
-
-#~ msgid "Enter encryption key: "
-#~ msgstr "สไศ๋รย๋: "
-
-#~ msgid "Enter same key again: "
-#~ msgstr "ว๋ิูสไศ๋าปดฮ: "
-
-#~ msgid "Keys don't match!"
-#~ msgstr "มฝดฮรย๋ฒปฦฅลไฃก"
-
-#~ msgid "Cannot connect to Netbeans #2"
-#~ msgstr "ฮทจมฌฝำตฝ Netbeans #2"
-
-#~ msgid "Cannot connect to Netbeans"
-#~ msgstr "ฮทจมฌฝำตฝ Netbeans"
-
-#~ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
-#~ msgstr "E668: NetBeans มฌฝำะลฯขฮฤผึะดํฮ๓ตฤทรฮสฤฃสฝ: \"%s\""
-
-#~ msgid "read from Netbeans socket"
-#~ msgstr "ดำ Netbeans ฬืฝำืึถมศก"
-
-#~ msgid "E658: NetBeans connection lost for buffer %<PRId64>"
-#~ msgstr "E658: ปบณๅว๘ %<PRId64> ถชสง NetBeans มฌฝำ"
-
-#~ msgid "E505: "
-#~ msgstr "E505: "
-
-#~ msgid "E775: Eval feature not available"
-#~ msgstr "E775: ว๓ึตนฆฤฒปฟษำร"
-
-#~ msgid "freeing %<PRId64> lines"
-#~ msgstr "สอทลมห %<PRId64> ะะ"
-
-#~ msgid "E530: Cannot change term in GUI"
-#~ msgstr "E530: ิฺอผะฮฝ็รๆึะฒปฤธฤฑไึีถห"
-
-#~ msgid "E531: Use \":gui\" to start the GUI"
-#~ msgstr "E531: ว๋ำร \":gui\" ฦ๔ถฏอผะฮฝ็รๆ"
-
-#~ msgid "E617: Cannot be changed in the GTK+ 2 GUI"
-#~ msgstr "E617: ิฺ GTK+ 2 อผะฮฝ็รๆึะฒปฤธธฤ"
-
-#~ msgid "E596: Invalid font(s)"
-#~ msgstr "E596: ฮะงตฤืึฬๅ"
-
-#~ msgid "E597: can't select fontset"
-#~ msgstr "E597: ฮทจักิ๑ Fontset"
-
-#~ msgid "E598: Invalid fontset"
-#~ msgstr "E598: ฮะงตฤ Fontset"
-
-#~ msgid "E533: can't select wide font"
-#~ msgstr "E533: ฮทจักิ๑ฟํืึฬๅ"
-
-#~ msgid "E534: Invalid wide font"
-#~ msgstr "E534: ฮะงตฤฟํืึฬๅ"
-
-#~ msgid "E538: No mouse support"
-#~ msgstr "E538: ฒปึงณึส๓ฑ๊"
-
-#~ msgid "cannot open "
-#~ msgstr "ฒปฤด๒ฟช"
-
-#~ msgid "VIM: Can't open window!\n"
-#~ msgstr "VIM: ฒปฤด๒ฟชดฐฟฺ!\n"
-
-#~ msgid "Need Amigados version 2.04 or later\n"
-#~ msgstr "ะ่าช Amigados ฐๆฑพ 2.04 าิษฯ\n"
-
-#~ msgid "Need %s version %<PRId64>\n"
-#~ msgstr "ะ่าช %s ฐๆฑพ %<PRId64>\n"
-
-#~ msgid "Cannot open NIL:\n"
-#~ msgstr "ฒปฤด๒ฟช NIL:\n"
-
-#~ msgid "Cannot create "
-#~ msgstr "ฒปฤดดฝจ "
-
-#~ msgid "Vim exiting with %d\n"
-#~ msgstr "Vim ทตปุึต: %d\n"
-
-#~ msgid "cannot change console mode ?!\n"
-#~ msgstr "ฒปฤวะปปึ๗ฟุฬจ(console)ฤฃสฝ !?\n"
-
-#~ msgid "mch_get_shellsize: not a console??\n"
-#~ msgstr "mch_get_shellsize: ฒปสวึ๗ฟุฬจ(console)??\n"
-
-#~ msgid "E360: Cannot execute shell with -f option"
-#~ msgstr "E360: ฒปฤำร -f ักฯ๎ึดะะ shell"
-
-#~ msgid "Cannot execute "
-#~ msgstr "ฒปฤึดะะ "
-
-#~ msgid "shell "
-#~ msgstr "shell "
-
-#~ msgid " returned\n"
-#~ msgstr " าัทตปุ\n"
-
-#~ msgid "ANCHOR_BUF_SIZE too small."
-#~ msgstr "ANCHOR_BUF_SIZE ฬซะก"
-
-#~ msgid "I/O ERROR"
-#~ msgstr "I/O ดํฮ๓"
-
-#~ msgid "Message"
-#~ msgstr "ฯ๛ฯข"
-
-#~ msgid "'columns' is not 80, cannot execute external commands"
-#~ msgstr "'columns' ฒปสว 80, ฒปฤึดะะอโฒฟรม๎"
-
-#~ msgid "E237: Printer selection failed"
-#~ msgstr "E237: ักิ๑ด๒ำกป๚สงฐ"
-
-#~ msgid "to %s on %s"
-#~ msgstr "ดำ %s ตฝ %s"
-
-#~ msgid "E613: Unknown printer font: %s"
-#~ msgstr "E613: ฮดึชตฤด๒ำกป๚ืึฬๅ: %s"
-
-#~ msgid "E238: Print error: %s"
-#~ msgstr "E238: ด๒ำกดํฮ๓: %s"
-
-#~ msgid "Printing '%s'"
-#~ msgstr "ด๒ำก '%s'"
-
-#~ msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
-#~ msgstr "E244: ืึท๛ผฏ \"%s\" ฒปฤถิำฆืึฬๅ\"%s\""
-
-#~ msgid "E245: Illegal char '%c' in font name \"%s\""
-#~ msgstr "E245: ฒปีศทตฤืึท๛ '%c' ณ๖ฯึิฺืึฬๅร๛ณฦ \"%s\" ฤฺ"
-
-#~ msgid "Vim: Double signal, exiting\n"
-#~ msgstr "Vim: หซึุะลบลฃฌอหณ๖ึะ\n"
-
-#~ msgid "Vim: Caught deadly signal %s\n"
-#~ msgstr "Vim: ภนฝุตฝึยระลบล(deadly signal) %s\n"
-
-#~ msgid "Vim: Caught deadly signal\n"
-#~ msgstr "Vim: ภนฝุตฝึยระลบล(deadly signal)\n"
-
-#~ msgid "Opening the X display took %<PRId64> msec"
-#~ msgstr "ด๒ฟช X display ำรสฑ %<PRId64> ร๋"
-
-#~ msgid ""
-#~ "\n"
-#~ "Vim: Got X error\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Vim: X ดํฮ๓\n"
-
-#~ msgid "Testing the X display failed"
-#~ msgstr "ฒโสิ X display สงฐ"
-
-#~ msgid "Opening the X display timed out"
-#~ msgstr "ด๒ฟช X display ณฌสฑ"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot execute shell sh\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ฮทจึดะะ shell sh\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot create pipes\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ฮทจฝจมขนตภ\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot fork\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ฮทจ fork\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Command terminated\n"
-#~ msgstr ""
-#~ "\n"
-#~ "รม๎าัฝแส๘\n"
-
-#~ msgid "XSMP lost ICE connection"
-#~ msgstr "XSMP ถชสงมหตฝ ICE ตฤมฌฝำ"
-
-#~ msgid "Opening the X display failed"
-#~ msgstr "ด๒ฟช X display สงฐ"
-
-#~ msgid "XSMP handling save-yourself request"
-#~ msgstr "XSMP ดฆภํ save-yourself ว๋ว๓"
-
-#~ msgid "XSMP opening connection"
-#~ msgstr "XSMP ด๒ฟชมฌฝำ"
-
-#~ msgid "XSMP ICE connection watch failed"
-#~ msgstr "XSMP ICE มฌฝำผเสำสงฐ"
-
-#~ msgid "XSMP SmcOpenConnection failed: %s"
-#~ msgstr "XSMP SmcOpenConnection ต๗ำรสงฐ: %s"
-
-#~ msgid "At line"
-#~ msgstr "ิฺะะบล "
-
-#~ msgid "Could not load vim32.dll!"
-#~ msgstr "ฮทจผำิุ vim32.dllฃก"
-
-#~ msgid "VIM Error"
-#~ msgstr "VIM ดํฮ๓"
-
-#~ msgid "Could not fix up function pointers to the DLL!"
-#~ msgstr "ฮทจะีตฝ DLL ตฤบฏสึธี๋!"
-
-#~ msgid "shell returned %d"
-#~ msgstr "Shell ทตปุ %d"
-
-#~ msgid "Vim: Caught %s event\n"
-#~ msgstr "Vim: ภนฝุตฝ %s สยผ\n"
-
-#~ msgid "close"
-#~ msgstr "นุฑี"
-
-#~ msgid "logoff"
-#~ msgstr "ืขฯ๛"
-
-#~ msgid "shutdown"
-#~ msgstr "นุป๚"
-
-#~ msgid "E371: Command not found"
-#~ msgstr "E371: ีาฒปตฝรม๎"
-
-#~ msgid ""
-#~ "VIMRUN.EXE not found in your $PATH.\n"
-#~ "External commands will not pause after completion.\n"
-#~ "See :help win32-vimrun for more information."
-#~ msgstr ""
-#~ "ิฺฤใตฤ $PATH ึะีาฒปตฝ VIMRUN.EXEกฃ\n"
-#~ "อโฒฟรม๎ึดะะอ๊ฑฯบ๓ฝซฒปปแิอฃกฃ\n"
-#~ "ฝ๘าปฒฝหตร๗ว๋ผ๛ :help win32-vimrun"
-
-#~ msgid "Vim Warning"
-#~ msgstr "Vim พฏธๆ"
-
-#~ msgid "Conversion in %s not supported"
-#~ msgstr "ฒปึงณึ %s ึะตฤืชปป"
-
-#~ msgid "E396: containedin argument not accepted here"
-#~ msgstr "E396: สนำรมหฒปีศทตฤฒฮส"
-
-#~ msgid "E430: Tag file path truncated for %s\n"
-#~ msgstr "E430: Tag ฮฤผยทพถฑปฝุถฯฮช %s\n"
-
-#~ msgid "new shell started\n"
-#~ msgstr "ฦ๔ถฏะย shell\n"
-
-#~ msgid "No undo possible; continue anyway"
-#~ msgstr "ฮทจณทฯ๚ฃปว๋ผฬะ๘"
-
-#~ msgid "number changes time"
-#~ msgstr " ฑเบล ธฤฑไ สฑผไ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16/32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 16/32 ฮปอผะฮฝ็รๆฐๆฑพ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 32 ฮปอผะฮฝ็รๆฐๆฑพ"
-
-#~ msgid " in Win32s mode"
-#~ msgstr " Win32s ฤฃสฝ"
-
-#~ msgid " with OLE support"
-#~ msgstr " ด๘ OLE ึงณึ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 32 ฮปฟุึฦฬจฐๆฑพ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16-bit version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 16 ฮปฟุึฦฬจฐๆฑพ"
-
-#~ msgid ""
-#~ "\n"
-#~ "32-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "32 ฮป MS-DOS ฐๆฑพ"
-
-#~ msgid ""
-#~ "\n"
-#~ "16-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "16 ฮป MS-DOS ฐๆฑพ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X (unix) version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS X (unix) ฐๆฑพ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS X ฐๆฑพ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS ฐๆฑพ"
-
-#~ msgid ""
-#~ "\n"
-#~ "RISC OS version"
-#~ msgstr ""
-#~ "\n"
-#~ "RISC OS ฐๆฑพ"
-
-#~ msgid ""
-#~ "\n"
-#~ "Big version "
-#~ msgstr ""
-#~ "\n"
-#~ "ด๓ะอฐๆฑพ "
-
-#~ msgid ""
-#~ "\n"
-#~ "Normal version "
-#~ msgstr ""
-#~ "\n"
-#~ "ีณฃฐๆฑพ "
-
-#~ msgid ""
-#~ "\n"
-#~ "Small version "
-#~ msgstr ""
-#~ "\n"
-#~ "ะกะอฐๆฑพ "
-
-#~ msgid ""
-#~ "\n"
-#~ "Tiny version "
-#~ msgstr ""
-#~ "\n"
-#~ "ฮขะอฐๆฑพ "
-
-#~ msgid "with GTK2-GNOME GUI."
-#~ msgstr "ด๘ GTK2-GNOME อผะฮฝ็รๆกฃ"
-
-#~ msgid "with GTK-GNOME GUI."
-#~ msgstr "ด๘ GTK-GNOME อผะฮฝ็รๆกฃ"
-
-#~ msgid "with GTK2 GUI."
-#~ msgstr "ด๘ GTK2 อผะฮฝ็รๆกฃ"
-
-#~ msgid "with GTK GUI."
-#~ msgstr "ด๘ GTK อผะฮฝ็รๆกฃ"
-
-#~ msgid "with X11-Motif GUI."
-#~ msgstr "ด๘ X11-Motif อผะฮฝ็รๆกฃ"
-
-#~ msgid "with X11-neXtaw GUI."
-#~ msgstr "ด๘ X11-neXtaw อผะฮฝ็รๆกฃ"
-
-#~ msgid "with X11-Athena GUI."
-#~ msgstr "ด๘ X11-Athena อผะฮฝ็รๆกฃ"
-
-#~ msgid "with Photon GUI."
-#~ msgstr "ด๘ Photon อผะฮฝ็รๆกฃ"
-
-#~ msgid "with GUI."
-#~ msgstr "ด๘อผะฮฝ็รๆกฃ"
-
-#~ msgid "with Carbon GUI."
-#~ msgstr "ด๘ Carbon อผะฮฝ็รๆกฃ"
-
-#~ msgid "with Cocoa GUI."
-#~ msgstr "ด๘ Cocoa อผะฮฝ็รๆกฃ"
-
-#~ msgid "with (classic) GUI."
-#~ msgstr "ด๘(ดซอณ)อผะฮฝ็รๆกฃ"
-
-#~ msgid " system gvimrc file: \""
-#~ msgstr " ฯตอณ gvimrc ฮฤผ: \""
-
-#~ msgid " user gvimrc file: \""
-#~ msgstr " ำรปง gvimrc ฮฤผ: \""
-
-#~ msgid "2nd user gvimrc file: \""
-#~ msgstr "ตฺถำรปง gvimrc ฮฤผ: \""
-
-#~ msgid "3rd user gvimrc file: \""
-#~ msgstr "ตฺศำรปง gvimrc ฮฤผ: \""
-
-#~ msgid " system menu file: \""
-#~ msgstr " ฯตอณฒหตฅฮฤผ: \""
-
-#~ msgid "Compiler: "
-#~ msgstr "ฑเา๋ฦ๗: "
-
-#~ msgid "menu Help->Orphans for information "
-#~ msgstr "ฒหตฅ Help->Orphans ฒ้ฟดหตร๗ "
-
-#~ msgid "Running modeless, typed text is inserted"
-#~ msgstr "ฮฤฃสฝิหะะฃฌสไศ๋ฮฤืึผดฒๅศ๋"
-
-#~ msgid "menu Edit->Global Settings->Toggle Insert Mode "
-#~ msgstr "ฒหตฅ Edit->Global Settings->Toggle Insert Mode "
-
-#, fuzzy
-#~ msgid " for two modes "
-#~ msgstr " # pid สพฟโร๛ณฦ prepend path\n"
-
-#, fuzzy
-#~ msgid " for Vim defaults "
-#~ msgstr " # pid สพฟโร๛ณฦ prepend path\n"
-
-#~ msgid "WARNING: Windows 95/98/ME detected"
-#~ msgstr "พฏธๆ: ผ์ฒโตฝ Windows 95/98/ME"
-
-#~ msgid "type :help windows95<Enter> for info on this"
-#~ msgstr "สไศ๋ :help windows95<Enter> ฒ้ฟดฯเนุหตร๗ "
-
-#~ msgid "E370: Could not load library %s"
-#~ msgstr "E370: ฮทจผำิุฟโ %s"
-
-#~ msgid ""
-#~ "Sorry, this command is disabled: the Perl library could not be loaded."
-#~ msgstr "ฑงวธฃฌดหรม๎ฒปฟษำร: ฮทจผำิุ Perl ฟโกฃ"
-
-#~ msgid "Edit with &multiple Vims"
-#~ msgstr "ำรถเธ๖ Vim ฑเผญ(&M)"
-
-#~ msgid "Edit with single &Vim"
-#~ msgstr "ำรตฅธ๖ Vim ฑเผญ(&V)"
-
-#~ msgid "Diff with Vim"
-#~ msgstr "ำร Vim ฑศฝฯ(diff)"
-
-#~ msgid "Edit with &Vim"
-#~ msgstr "ำร Vim ฑเผญ(&V)"
-
-#~ msgid "Edit with existing Vim - "
-#~ msgstr "ำรตฑวฐตฤ Vim ฑเผญ - "
-
-#~ msgid "Edits the selected file(s) with Vim"
-#~ msgstr "ำร Vim ฑเผญักึะตฤฮฤผ"
-
-#~ msgid "Error creating process: Check if gvim is in your path!"
-#~ msgstr "ดดฝจฝ๘ณฬสงฐ: ว๋ผ์ฒ้ gvim สวท๑ิฺยทพถึะฃก"
-
-#~ msgid "gvimext.dll error"
-#~ msgstr "gvimext.dll ดํฮ๓"
-
-#~ msgid "Path length too long!"
-#~ msgstr "ยทพถฬซณคฃก"
-
-#~ msgid "E234: Unknown fontset: %s"
-#~ msgstr "E234: ฮดึชตฤ Fontset: %s"
-
-#~ msgid "E235: Unknown font: %s"
-#~ msgstr "E235: ฮดึชตฤืึฬๅ: %s"
-
-#~ msgid "E236: Font \"%s\" is not fixed-width"
-#~ msgstr "E236: ืึฬๅ \"%s\" ฒปสวตศฟํืึฬๅ"
-
-#~ msgid "E448: Could not load library function %s"
-#~ msgstr "E448: ฮทจผำิุฟโบฏส %s"
-
-#~ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
-#~ msgstr "E26: ฮทจสนำร Hebrew: ฑเา๋สฑรปำะฦ๔ำร\n"
-
-#~ msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
-#~ msgstr "E27: ฮทจสนำร Farsi: ฑเา๋สฑรปำะฦ๔ำร\n"
-
-#~ msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
-#~ msgstr "E800: ฮทจสนำร Arabic: ฑเา๋สฑรปำะฦ๔ำร\n"
-
-#~ msgid "E247: no registered server named \"%s\""
-#~ msgstr "E247: รปำะร๛ฝะ \"%s\" ตฤาัืขฒแตฤทฮ๑ฦ๗"
-
-#~ msgid "E233: cannot open display"
-#~ msgstr "E233: ฮทจด๒ฟช display"
-
-#~ msgid "E449: Invalid expression received"
-#~ msgstr "E449: สีตฝฮะงตฤฑํด๏สฝ"
-
-#~ msgid "E744: NetBeans does not allow changes in read-only files"
-#~ msgstr "E744: NetBeans ฒปิสะํธฤฑไึปถมฮฤผ"
-
-#~ msgid "Affix flags ignored when PFXPOSTPONE used in %s line %d: %s"
-#~ msgstr "%s ตฺ %d ะะฃฌสนำร PFXPOSTPONE สฑธฝผำฑ๊ึพฑปบ๖ยิ: %s"
-
-#~ msgid "[No file]"
-#~ msgstr "[ฮดรร๛]"
-
-#~ msgid "[Error List]"
-#~ msgstr "[ดํฮ๓มะฑํ]"
-
-#~ msgid "E106: Unknown variable: \"%s\""
-#~ msgstr "E106: ฮดถจาๅตฤฑไมฟ: \"%s\""
-
-#~ msgid "function "
-#~ msgstr "บฏส "
-
-#~ msgid "E130: Undefined function: %s"
-#~ msgstr "E130: บฏส %s ษะฮดถจาๅ"
-
-#~ msgid "Run Macro"
-#~ msgstr "ึดะะบ๊"
-
-#~ msgid "E242: Color name not recognized: %s"
-#~ msgstr "E242: %s ฮชฒปฤสถฑ๐ตฤัีษซร๛ณฦ"
-
-#~ msgid "error reading cscope connection %d"
-#~ msgstr "ถมศก cscope มฌฝำ %d สฑดํฮ๓"
-
-#~ msgid "E260: cscope connection not found"
-#~ msgstr "E260: ีาฒปตฝ cscope มฌฝำ"
-
-#~ msgid "cscope connection closed"
-#~ msgstr "cscope มฌฝำาันุฑี"
-
-#~ msgid "couldn't malloc\n"
-#~ msgstr "ฒปฤสนำร malloc\n"
-
-#~ msgid "%2d %-5ld %-34s <none>\n"
-#~ msgstr "%2d %-5ld %-34s <ฮ>\n"
-
-#~ msgid "E249: couldn't read VIM instance registry property"
-#~ msgstr "E249: ฒปฤถมศก VIM ตฤ ืขฒแฑํส๔ะิ"
-
-#~ msgid "\"\n"
-#~ msgstr "\"\n"
-
-#~ msgid "--help\t\tShow Gnome arguments"
-#~ msgstr "--help\t\tฯิสพ Gnome ฯเนุฒฮส"
-
-#~ msgid "[string too long]"
-#~ msgstr "[ืึท๛ดฎฬซณค]"
-
-#~ msgid "Hit ENTER to continue"
-#~ msgstr "ว๋ฐด ENTER ผฬะ๘"
-
-#~ msgid " (RET/BS: line, SPACE/b: page, d/u: half page, q: quit)"
-#~ msgstr " (RET/BS: ฯ๒ฯย/ฯ๒ษฯาปะะ, ฟีธ๑/b: าปาณ, d/u: ฐ๋าณ, q: อหณ๖)"
-
-#~ msgid " (RET: line, SPACE: page, d: half page, q: quit)"
-#~ msgstr " (RET: ฯ๒ฯยาปะะ, ฟีฐืผ: าปาณ, d: ฐ๋าณ, q: อหณ๖)"
-
-#~ msgid "E361: Crash intercepted; regexp too complex?"
-#~ msgstr "E361: ฒปฤึดะะ; regular expression ฬซธดิำ?"
-
-#~ msgid "E363: pattern caused out-of-stack error"
-#~ msgstr "E363: regular expression ิ์ณษถัีปำรนโตฤดํฮ๓"
-
-#~ msgid " BLOCK"
-#~ msgstr " ฟ้"
-
-#~ msgid " LINE"
-#~ msgstr " ะะ"
-
-#~ msgid "Enter nr of choice (<CR> to abort): "
-#~ msgstr "สไศ๋ nr ป๒ักิ๑ (<CR> อหณ๖): "
-
-#~ msgid "Linear tag search"
-#~ msgstr "ฯ฿ะิฒ้ีาฑ๊วฉ (Tags)"
-
-#~ msgid "Binary tag search"
-#~ msgstr "ถฝ๘ึฦฒ้ีา(Binary search) ฑ๊วฉ(Tags)"
-
-#~ msgid "with BeOS GUI."
-#~ msgstr "สนำร BeOS อผะฮฝ็รๆกฃ"
diff --git a/src/nvim/po/zh_CN.po b/src/nvim/po/zh_CN.po
deleted file mode 100644
index 254ebbce6b..0000000000
--- a/src/nvim/po/zh_CN.po
+++ /dev/null
@@ -1,7932 +0,0 @@
-# Chinese (simplified) Translation for Vim
-#
-# Do ":help uganda" in Vim to read copying and usage conditions.
-# Do ":help credits" in Vim to see a list of people who contributed.
-#
-# FIRST AUTHOR Wang Jun <junw@turbolinux.com.cn>
-#
-# TRANSLATORS
-# Edyfox <edyfox@gmail.com>
-# Yuheng Xie <elephant@linux.net.cn>
-#
-# Original translations.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: Vim(Simplified Chinese)\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-05-26 14:21+0200\n"
-"PO-Revision-Date: 2006-04-21 14:00+0800\n"
-"Last-Translator: Yuheng Xie <elephant@linux.net.cn>\n"
-"Language-Team: Simplified Chinese <i18n-translation@lists.linux.net.cn>\n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=gb2312\n"
-"Content-Transfer-Encoding: 8-bit\n"
-
-#: ../api/private/helpers.c:201
-#, fuzzy
-msgid "Unable to get option value"
-msgstr "ักฯ๎ฒฮสบ๓ตฤฤฺศฮะง"
-
-#: ../api/private/helpers.c:204
-msgid "internal error: unknown option type"
-msgstr ""
-
-#: ../buffer.c:92
-msgid "[Location List]"
-msgstr "[Location มะฑํ]"
-
-#: ../buffer.c:93
-msgid "[Quickfix List]"
-msgstr "[Quickfix มะฑํ]"
-
-#: ../buffer.c:94
-msgid "E855: Autocommands caused command to abort"
-msgstr ""
-
-#: ../buffer.c:135
-msgid "E82: Cannot allocate any buffer, exiting..."
-msgstr "E82: ฮทจทึลไศฮบฮปบณๅว๘ฃฌอหณ๖ณฬะ๒..."
-
-#: ../buffer.c:138
-msgid "E83: Cannot allocate buffer, using other one..."
-msgstr "E83: ฮทจทึลไปบณๅว๘ฃฌสนำรมําปธ๖ปบณๅว๘..."
-
-#: ../buffer.c:763
-msgid "E515: No buffers were unloaded"
-msgstr "E515: รปำะสอทลศฮบฮปบณๅว๘"
-
-#: ../buffer.c:765
-msgid "E516: No buffers were deleted"
-msgstr "E516: รปำะษพณศฮบฮปบณๅว๘"
-
-#: ../buffer.c:767
-msgid "E517: No buffers were wiped out"
-msgstr "E517: รปำะวๅณศฮบฮปบณๅว๘"
-
-#: ../buffer.c:772
-msgid "1 buffer unloaded"
-msgstr "สอทลมห 1 ธ๖ปบณๅว๘"
-
-#: ../buffer.c:774
-#, c-format
-msgid "%d buffers unloaded"
-msgstr "สอทลมห %d ธ๖ปบณๅว๘"
-
-#: ../buffer.c:777
-msgid "1 buffer deleted"
-msgstr "ษพณมห 1 ธ๖ปบณๅว๘"
-
-#: ../buffer.c:779
-#, c-format
-msgid "%d buffers deleted"
-msgstr "ษพณมห %d ธ๖ปบณๅว๘"
-
-#: ../buffer.c:782
-msgid "1 buffer wiped out"
-msgstr "วๅณมห 1 ธ๖ปบณๅว๘"
-
-#: ../buffer.c:784
-#, c-format
-msgid "%d buffers wiped out"
-msgstr "วๅณมห %d ธ๖ปบณๅว๘"
-
-#: ../buffer.c:806
-msgid "E90: Cannot unload last buffer"
-msgstr "E90: ฮทจสอทลื๎บ๓าปธ๖ปบณๅว๘"
-
-#: ../buffer.c:874
-msgid "E84: No modified buffer found"
-msgstr "E84: รปำะะธฤนตฤปบณๅว๘"
-
-#. back where we started, didn't find anything.
-#: ../buffer.c:903
-msgid "E85: There is no listed buffer"
-msgstr "E85: รปำะฟษมะณ๖ตฤปบณๅว๘"
-
-#: ../buffer.c:913
-#, c-format
-msgid "E86: Buffer %<PRId64> does not exist"
-msgstr "E86: ปบณๅว๘ %<PRId64> ฒปดๆิฺ"
-
-#: ../buffer.c:915
-msgid "E87: Cannot go beyond last buffer"
-msgstr "E87: ฮทจวะปปฃฌาัสวื๎บ๓าปธ๖ปบณๅว๘"
-
-#: ../buffer.c:917
-msgid "E88: Cannot go before first buffer"
-msgstr "E88: ฮทจวะปปฃฌาัสวตฺาปธ๖ปบณๅว๘"
-
-#: ../buffer.c:945
-#, c-format
-msgid ""
-"E89: No write since last change for buffer %<PRId64> (add ! to override)"
-msgstr "E89: ปบณๅว๘ %<PRId64> าัะธฤตซษะฮดฑฃดๆ (ว๋ผำ ! วฟึฦึดะะ)"
-
-#. wrap around (may cause duplicates)
-#: ../buffer.c:1423
-msgid "W14: Warning: List of file names overflow"
-msgstr "W14: พฏธๆ: ฮฤผร๛นถเ"
-
-#: ../buffer.c:1555 ../quickfix.c:3361
-#, c-format
-msgid "E92: Buffer %<PRId64> not found"
-msgstr "E92: ีาฒปตฝปบณๅว๘ %<PRId64>"
-
-#: ../buffer.c:1798
-#, c-format
-msgid "E93: More than one match for %s"
-msgstr "E93: ีาตฝฒปึนาปธ๖ %s"
-
-#: ../buffer.c:1800
-#, c-format
-msgid "E94: No matching buffer for %s"
-msgstr "E94: รปำะฦฅลไตฤปบณๅว๘ %s"
-
-#: ../buffer.c:2161
-#, c-format
-msgid "line %<PRId64>"
-msgstr "ตฺ %<PRId64> ะะ"
-
-#: ../buffer.c:2233
-msgid "E95: Buffer with this name already exists"
-msgstr "E95: าัำะปบณๅว๘สนำรธรร๛ณฦ"
-
-#: ../buffer.c:2498
-msgid " [Modified]"
-msgstr " [าัะธฤ]"
-
-#: ../buffer.c:2501
-msgid "[Not edited]"
-msgstr "[ฮดฑเผญ]"
-
-#: ../buffer.c:2504
-msgid "[New file]"
-msgstr "[ะยฮฤผ]"
-
-#: ../buffer.c:2505
-msgid "[Read errors]"
-msgstr "[ถมดํฮ๓]"
-
-#: ../buffer.c:2506 ../buffer.c:3217 ../fileio.c:1807 ../screen.c:4895
-msgid "[RO]"
-msgstr "[ึปถม]"
-
-#: ../buffer.c:2507 ../fileio.c:1807
-msgid "[readonly]"
-msgstr "[ึปถม]"
-
-#: ../buffer.c:2524
-#, c-format
-msgid "1 line --%d%%--"
-msgstr "1 ะะ --%d%%--"
-
-#: ../buffer.c:2526
-#, c-format
-msgid "%<PRId64> lines --%d%%--"
-msgstr "%<PRId64> ะะ --%d%%--"
-
-#: ../buffer.c:2530
-#, c-format
-msgid "line %<PRId64> of %<PRId64> --%d%%-- col "
-msgstr "ะะ %<PRId64> / %<PRId64> --%d%%-- มะ "
-
-#: ../buffer.c:2632 ../buffer.c:4292 ../memline.c:1554
-msgid "[No Name]"
-msgstr "[ฮดรร๛]"
-
-#. must be a help buffer
-#: ../buffer.c:2667
-msgid "help"
-msgstr "ฐ๏ึ๚"
-
-#: ../buffer.c:3225 ../screen.c:4883
-msgid "[Help]"
-msgstr "[ฐ๏ึ๚]"
-
-#: ../buffer.c:3254 ../screen.c:4887
-msgid "[Preview]"
-msgstr "[ิคภภ]"
-
-#: ../buffer.c:3528
-msgid "All"
-msgstr "ศซฒฟ"
-
-#: ../buffer.c:3528
-msgid "Bot"
-msgstr "ตืถห"
-
-#: ../buffer.c:3531
-msgid "Top"
-msgstr "ถฅถห"
-
-#: ../buffer.c:4244
-msgid ""
-"\n"
-"# Buffer list:\n"
-msgstr ""
-"\n"
-"# ปบณๅว๘มะฑํ:\n"
-
-#: ../buffer.c:4289
-msgid "[Scratch]"
-msgstr ""
-
-#: ../buffer.c:4529
-msgid ""
-"\n"
-"--- Signs ---"
-msgstr ""
-"\n"
-"--- Signs ---"
-
-#: ../buffer.c:4538
-#, c-format
-msgid "Signs for %s:"
-msgstr "%s ตฤ Signs:"
-
-#: ../buffer.c:4543
-#, c-format
-msgid " line=%<PRId64> id=%d name=%s"
-msgstr " ะะ=%<PRId64> id=%d ร๛ณฦ=%s"
-
-#: ../cursor_shape.c:68
-msgid "E545: Missing colon"
-msgstr "E545: ศฑษูรฐบล"
-
-#: ../cursor_shape.c:70 ../cursor_shape.c:94
-msgid "E546: Illegal mode"
-msgstr "E546: ฮะงตฤฤฃสฝ"
-
-#: ../cursor_shape.c:134
-msgid "E548: digit expected"
-msgstr "E548: ดหดฆะ่าชสืึ"
-
-#: ../cursor_shape.c:138
-msgid "E549: Illegal percentage"
-msgstr "E549: ฮะงตฤฐูทึฑศ"
-
-#: ../diff.c:146
-#, c-format
-msgid "E96: Can not diff more than %<PRId64> buffers"
-msgstr "E96: ฒปฤฑศฝฯ(diff) %<PRId64> ธ๖าิษฯตฤปบณๅว๘"
-
-#: ../diff.c:753
-#, fuzzy
-msgid "E810: Cannot read or write temp files"
-msgstr "E557: ฮทจด๒ฟช termcap ฮฤผ"
-
-#: ../diff.c:755
-msgid "E97: Cannot create diffs"
-msgstr "E97: ฮทจดดฝจ diff"
-
-#: ../diff.c:966
-#, fuzzy
-msgid "E816: Cannot read patch output"
-msgstr "E98: ฮทจถมศก diff ตฤสไณ๖"
-
-#: ../diff.c:1220
-msgid "E98: Cannot read diff output"
-msgstr "E98: ฮทจถมศก diff ตฤสไณ๖"
-
-#: ../diff.c:2081
-msgid "E99: Current buffer is not in diff mode"
-msgstr "E99: ตฑวฐปบณๅว๘ฒปิฺ diff ฤฃสฝ"
-
-#: ../diff.c:2100
-#, fuzzy
-msgid "E793: No other buffer in diff mode is modifiable"
-msgstr "E100: รปำะฦไหดฆำฺ diff ฤฃสฝตฤปบณๅว๘"
-
-#: ../diff.c:2102
-msgid "E100: No other buffer in diff mode"
-msgstr "E100: รปำะฦไหดฆำฺ diff ฤฃสฝตฤปบณๅว๘"
-
-#: ../diff.c:2112
-msgid "E101: More than two buffers in diff mode, don't know which one to use"
-msgstr "E101: ำะมฝธ๖าิษฯตฤปบณๅว๘ดฆำฺ diff ฤฃสฝฃฌฒปฤพ๖ถจำรฤฤาปธ๖"
-
-#: ../diff.c:2141
-#, c-format
-msgid "E102: Can't find buffer \"%s\""
-msgstr "E102: ีาฒปตฝปบณๅว๘ \"%s\""
-
-#: ../diff.c:2152
-#, c-format
-msgid "E103: Buffer \"%s\" is not in diff mode"
-msgstr "E103: ปบณๅว๘ \"%s\" ฒปิฺ diff ฤฃสฝ"
-
-#: ../diff.c:2193
-msgid "E787: Buffer changed unexpectedly"
-msgstr "E787: าโอโตุธฤฑไมหปบณๅว๘"
-
-#: ../digraph.c:1598
-msgid "E104: Escape not allowed in digraph"
-msgstr "E104: ธดบฯืึท๛(digraph)ึะฒปฤสนำร Escape"
-
-#: ../digraph.c:1760
-msgid "E544: Keymap file not found"
-msgstr "E544: ีาฒปตฝ Keymap ฮฤผ"
-
-#: ../digraph.c:1785
-msgid "E105: Using :loadkeymap not in a sourced file"
-msgstr "E105: ฒปสวิฺฝลฑพฮฤผึะสนำร :loadkeymap "
-
-#: ../digraph.c:1821
-msgid "E791: Empty keymap entry"
-msgstr ""
-
-#: ../edit.c:82
-msgid " Keyword completion (^N^P)"
-msgstr " นุผืึฒนศซ (^N^P)"
-
-#. ctrl_x_mode == 0, ^P/^N compl.
-#: ../edit.c:83
-msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-msgstr " ^X ฤฃสฝ (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-
-#: ../edit.c:85
-msgid " Whole line completion (^L^N^P)"
-msgstr " ี๛ะะฒนศซ (^L^N^P)"
-
-#: ../edit.c:86
-msgid " File name completion (^F^N^P)"
-msgstr " ฮฤผร๛ฒนศซ (^F^N^P)"
-
-#: ../edit.c:87
-msgid " Tag completion (^]^N^P)"
-msgstr " Tag ฒนศซ (^]^N^P)"
-
-#: ../edit.c:88
-#, fuzzy
-msgid " Path pattern completion (^N^P)"
-msgstr " ยทพถฤฃสฝฒนศซ (^N^P)"
-
-#: ../edit.c:89
-msgid " Definition completion (^D^N^P)"
-msgstr " ถจาๅฒนศซ (^D^N^P)"
-
-#: ../edit.c:91
-msgid " Dictionary completion (^K^N^P)"
-msgstr " Dictionary ฒนศซ (^K^N^P)"
-
-#: ../edit.c:92
-msgid " Thesaurus completion (^T^N^P)"
-msgstr " Thesaurus ฒนศซ (^T^N^P)"
-
-#: ../edit.c:93
-msgid " Command-line completion (^V^N^P)"
-msgstr " รม๎ะะฒนศซ (^V^N^P)"
-
-#: ../edit.c:94
-msgid " User defined completion (^U^N^P)"
-msgstr " ำรปงืิถจาๅฒนศซ (^U^N^P)"
-
-#: ../edit.c:95
-msgid " Omni completion (^O^N^P)"
-msgstr " ศซฤฒนศซ (^O^N^P)"
-
-#: ../edit.c:96
-msgid " Spelling suggestion (s^N^P)"
-msgstr " ฦดะดฝจา้ (s^N^P)"
-
-#: ../edit.c:97
-msgid " Keyword Local completion (^N^P)"
-msgstr " นุผืึพึฒฟฒนศซ (^N^P)"
-
-#: ../edit.c:100
-msgid "Hit end of paragraph"
-msgstr "าัตฝถฮยไฝแฮฒ"
-
-#: ../edit.c:101
-msgid "E839: Completion function changed window"
-msgstr ""
-
-#: ../edit.c:102
-msgid "E840: Completion function deleted text"
-msgstr ""
-
-#: ../edit.c:1847
-msgid "'dictionary' option is empty"
-msgstr "ักฯ๎ 'dictionary' ฮชฟี"
-
-#: ../edit.c:1848
-msgid "'thesaurus' option is empty"
-msgstr "ักฯ๎ 'thesaurus' ฮชฟี"
-
-#: ../edit.c:2655
-#, c-format
-msgid "Scanning dictionary: %s"
-msgstr "ีิฺษจร่ dictionary: %s"
-
-#: ../edit.c:3079
-msgid " (insert) Scroll (^E/^Y)"
-msgstr " (ฒๅศ๋) Scroll (^E/^Y)"
-
-#: ../edit.c:3081
-msgid " (replace) Scroll (^E/^Y)"
-msgstr " (ฬๆปป) Scroll (^E/^Y)"
-
-#: ../edit.c:3587
-#, c-format
-msgid "Scanning: %s"
-msgstr "ีิฺษจร่: %s"
-
-#: ../edit.c:3614
-msgid "Scanning tags."
-msgstr "ษจร่ฑ๊วฉ."
-
-#: ../edit.c:4519
-msgid " Adding"
-msgstr " ิ๖ผำ"
-
-#. showmode might reset the internal line pointers, so it must
-#. * be called before line = ml_get(), or when this address is no
-#. * longer needed. -- Acevedo.
-#.
-#: ../edit.c:4562
-msgid "-- Searching..."
-msgstr "-- ฒ้ีาึะ..."
-
-#: ../edit.c:4618
-msgid "Back at original"
-msgstr "ปุตฝฦ๐ตใ"
-
-#: ../edit.c:4621
-msgid "Word from other line"
-msgstr "มําปะะตฤดส"
-
-#: ../edit.c:4624
-msgid "The only match"
-msgstr "ฮจาปฦฅลไ"
-
-#: ../edit.c:4680
-#, c-format
-msgid "match %d of %d"
-msgstr "ฦฅลไ %d / %d"
-
-#: ../edit.c:4684
-#, c-format
-msgid "match %d"
-msgstr "ฦฅลไ %d"
-
-#: ../eval.c:137
-msgid "E18: Unexpected characters in :let"
-msgstr "E18: :let ึะณ๖ฯึา์ณฃืึท๛"
-
-#: ../eval.c:138
-#, c-format
-msgid "E684: list index out of range: %<PRId64>"
-msgstr "E684: List ห๗าณฌณ๖ทถฮง: %<PRId64>"
-
-#: ../eval.c:139
-#, c-format
-msgid "E121: Undefined variable: %s"
-msgstr "E121: ฮดถจาๅตฤฑไมฟ: %s"
-
-#: ../eval.c:140
-msgid "E111: Missing ']'"
-msgstr "E111: ศฑษู ']'"
-
-#: ../eval.c:141
-#, c-format
-msgid "E686: Argument of %s must be a List"
-msgstr "E686: %s ตฤฒฮสฑุะ๋สว List"
-
-#: ../eval.c:143
-#, c-format
-msgid "E712: Argument of %s must be a List or Dictionary"
-msgstr "E712: %s ตฤฒฮสฑุะ๋สว List ป๒ี฿ Dictionary"
-
-#: ../eval.c:144
-msgid "E713: Cannot use empty key for Dictionary"
-msgstr "E713: Dictionary ตฤผฒปฤฮชฟี"
-
-#: ../eval.c:145
-msgid "E714: List required"
-msgstr "E714: ะ่าช List"
-
-#: ../eval.c:146
-msgid "E715: Dictionary required"
-msgstr "E715: ะ่าช Dictionary"
-
-#: ../eval.c:147
-#, c-format
-msgid "E118: Too many arguments for function: %s"
-msgstr "E118: บฏสตฤฒฮสนถเ: %s"
-
-#: ../eval.c:148
-#, c-format
-msgid "E716: Key not present in Dictionary: %s"
-msgstr "E716: Dictionary ึะฒปดๆิฺผ: %s"
-
-#: ../eval.c:150
-#, c-format
-msgid "E122: Function %s already exists, add ! to replace it"
-msgstr "E122: บฏส %s าัดๆิฺฃฌว๋ผำ ! วฟึฦฬๆปป"
-
-#: ../eval.c:151
-msgid "E717: Dictionary entry already exists"
-msgstr "E717: Dictionary ฯ๎าัดๆิฺ"
-
-#: ../eval.c:152
-msgid "E718: Funcref required"
-msgstr "E718: ะ่าช Funcref"
-
-#: ../eval.c:153
-msgid "E719: Cannot use [:] with a Dictionary"
-msgstr "E719: ฒปฤถิ Dictionary สนำร [:]"
-
-#: ../eval.c:154
-#, c-format
-msgid "E734: Wrong variable type for %s="
-msgstr "E734: %s= ตฤฑไมฟภเะอฒปีศท"
-
-#: ../eval.c:155
-#, c-format
-msgid "E130: Unknown function: %s"
-msgstr "E130: ฮดึชตฤบฏส: %s"
-
-#: ../eval.c:156
-#, c-format
-msgid "E461: Illegal variable name: %s"
-msgstr "E461: ฮะงตฤฑไมฟร๛: %s"
-
-#: ../eval.c:157
-#, fuzzy
-msgid "E806: using Float as a String"
-msgstr "E730: ฝซ List ื๗ String สนำร"
-
-#: ../eval.c:1830
-msgid "E687: Less targets than List items"
-msgstr "E687: ฤฟฑ๊ฑศ List ฯ๎สษู"
-
-#: ../eval.c:1834
-msgid "E688: More targets than List items"
-msgstr "E688: ฤฟฑ๊ฑศ List ฯ๎สถเ"
-
-#: ../eval.c:1906
-msgid "Double ; in list of variables"
-msgstr "ฑไมฟมะฑํึะณ๖ฯึมฝธ๖ ;"
-
-#: ../eval.c:2078
-#, c-format
-msgid "E738: Can't list variables for %s"
-msgstr "E738: ฮทจมะณ๖ %s ตฤฑไมฟ"
-
-#: ../eval.c:2391
-msgid "E689: Can only index a List or Dictionary"
-msgstr "E689: ึปฤห๗า List ป๒ Dictionary"
-
-#: ../eval.c:2396
-msgid "E708: [:] must come last"
-msgstr "E708: [:] ฑุะ๋ิฺื๎บ๓"
-
-#: ../eval.c:2439
-msgid "E709: [:] requires a List value"
-msgstr "E709: [:] ะ่าชาปธ๖ List ึต"
-
-#: ../eval.c:2674
-msgid "E710: List value has more items than target"
-msgstr "E710: List ึตตฤฯ๎ฑศฤฟฑ๊ถเ"
-
-#: ../eval.c:2678
-msgid "E711: List value has not enough items"
-msgstr "E711: List ึตรปำะืในปถเตฤฯ๎"
-
-#: ../eval.c:2867
-msgid "E690: Missing \"in\" after :for"
-msgstr "E690: :for บ๓ศฑษู \"in\""
-
-#: ../eval.c:3063
-#, c-format
-msgid "E107: Missing parentheses: %s"
-msgstr "E107: ศฑษูภจบล: %s"
-
-#: ../eval.c:3263
-#, c-format
-msgid "E108: No such variable: \"%s\""
-msgstr "E108: ฮดหฑไมฟ: \"%s\""
-
-#: ../eval.c:3333
-msgid "E743: variable nested too deep for (un)lock"
-msgstr "E743: (un)lock ตฤฑไมฟวถฬืนษ๎"
-
-#: ../eval.c:3630
-msgid "E109: Missing ':' after '?'"
-msgstr "E109: '?' บ๓ศฑษู ':'"
-
-#: ../eval.c:3893
-msgid "E691: Can only compare List with List"
-msgstr "E691: ึปฤฑศฝฯ List บอ List"
-
-#: ../eval.c:3895
-msgid "E692: Invalid operation for Lists"
-msgstr "E692: ถิ List ฮะงตฤฒูื๗"
-
-#: ../eval.c:3915
-msgid "E735: Can only compare Dictionary with Dictionary"
-msgstr "E735: ึปฤฑศฝฯ Dictionary บอ Dictionary"
-
-#: ../eval.c:3917
-msgid "E736: Invalid operation for Dictionary"
-msgstr "E736: ถิ Dictionary ฮะงตฤฒูื๗"
-
-#: ../eval.c:3932
-msgid "E693: Can only compare Funcref with Funcref"
-msgstr "E693: ึปฤฑศฝฯ Funcref บอ Funcref"
-
-#: ../eval.c:3934
-msgid "E694: Invalid operation for Funcrefs"
-msgstr "E694: ถิ Funcrefs ฮะงตฤฒูื๗"
-
-#: ../eval.c:4277
-#, fuzzy
-msgid "E804: Cannot use '%' with Float"
-msgstr "E719: ฒปฤถิ Dictionary สนำร [:]"
-
-#: ../eval.c:4478
-msgid "E110: Missing ')'"
-msgstr "E110: ศฑษู ')'"
-
-#: ../eval.c:4609
-msgid "E695: Cannot index a Funcref"
-msgstr "E695: ฒปฤห๗าาปธ๖ Funcref"
-
-#: ../eval.c:4839
-#, c-format
-msgid "E112: Option name missing: %s"
-msgstr "E112: ศฑษูักฯ๎ร๛ณฦ: %s"
-
-#: ../eval.c:4855
-#, c-format
-msgid "E113: Unknown option: %s"
-msgstr "E113: ฮดึชตฤักฯ๎: %s"
-
-#: ../eval.c:4904
-#, c-format
-msgid "E114: Missing quote: %s"
-msgstr "E114: ศฑษูาบล: %s"
-
-#: ../eval.c:5020
-#, c-format
-msgid "E115: Missing quote: %s"
-msgstr "E115: ศฑษูาบล: %s"
-
-#: ../eval.c:5084
-#, c-format
-msgid "E696: Missing comma in List: %s"
-msgstr "E696: List ึะศฑษูถบบล: %s"
-
-#: ../eval.c:5091
-#, c-format
-msgid "E697: Missing end of List ']': %s"
-msgstr "E697: List ศฑษูฝแส๘ท๛ ']': %s"
-
-#: ../eval.c:6475
-#, c-format
-msgid "E720: Missing colon in Dictionary: %s"
-msgstr "E720: Dictionary ึะศฑษูรฐบล: %s"
-
-#: ../eval.c:6499
-#, c-format
-msgid "E721: Duplicate key in Dictionary: \"%s\""
-msgstr "E721: Dictionary ึะณ๖ฯึึุธดตฤผ: \"%s\""
-
-#: ../eval.c:6517
-#, c-format
-msgid "E722: Missing comma in Dictionary: %s"
-msgstr "E722: Dictionary ึะศฑษูถบบล: %s"
-
-#: ../eval.c:6524
-#, c-format
-msgid "E723: Missing end of Dictionary '}': %s"
-msgstr "E723: Dictionary ศฑษูฝแส๘ท๛ '}': %s"
-
-#: ../eval.c:6555
-msgid "E724: variable nested too deep for displaying"
-msgstr "E724: ฑไมฟวถฬืนษ๎ฮทจฯิสพ"
-
-#: ../eval.c:7188
-#, fuzzy, c-format
-msgid "E740: Too many arguments for function %s"
-msgstr "E118: บฏสตฤฒฮสนถเ: %s"
-
-#: ../eval.c:7190
-#, fuzzy, c-format
-msgid "E116: Invalid arguments for function %s"
-msgstr "E118: บฏสตฤฒฮสนถเ: %s"
-
-#: ../eval.c:7377
-#, fuzzy, c-format
-msgid "E117: Unknown function: %s"
-msgstr "E130: ฮดึชตฤบฏส: %s"
-
-#: ../eval.c:7383
-#, c-format
-msgid "E119: Not enough arguments for function: %s"
-msgstr "E119: บฏส %s ตฤฒฮสฬซษู"
-
-#: ../eval.c:7387
-#, c-format
-msgid "E120: Using <SID> not in a script context: %s"
-msgstr "E120: <SID> ฒปฤิฺ script ษฯฯยฮฤอโสนำร: %s"
-
-#: ../eval.c:7391
-#, fuzzy, c-format
-msgid "E725: Calling dict function without Dictionary: %s"
-msgstr "E720: Dictionary ึะศฑษูรฐบล: %s"
-
-#: ../eval.c:7453
-#, fuzzy
-msgid "E808: Number or Float required"
-msgstr "E521: = บ๓รๆะ่าชสืึ"
-
-#: ../eval.c:7503
-#, fuzzy
-msgid "add() argument"
-msgstr "-c ฒฮส"
-
-#: ../eval.c:7907
-msgid "E699: Too many arguments"
-msgstr "E699: ฒฮสนถเ"
-
-#: ../eval.c:8073
-msgid "E785: complete() can only be used in Insert mode"
-msgstr "E785: complete() ึปฤิฺฒๅศ๋ฤฃสฝึะสนำร"
-
-#: ../eval.c:8156
-msgid "&Ok"
-msgstr "ศทถจ(&O)"
-
-#: ../eval.c:8676
-#, c-format
-msgid "E737: Key already exists: %s"
-msgstr "E737: ผาัดๆิฺ: %s"
-
-#: ../eval.c:8692
-#, fuzzy
-msgid "extend() argument"
-msgstr "--cmd ฒฮส"
-
-#: ../eval.c:8915
-#, fuzzy
-msgid "map() argument"
-msgstr "-c ฒฮส"
-
-#: ../eval.c:8916
-#, fuzzy
-msgid "filter() argument"
-msgstr "-c ฒฮส"
-
-#: ../eval.c:9229
-#, c-format
-msgid "+-%s%3ld lines: "
-msgstr "+-%s%3ld ะะ: "
-
-#: ../eval.c:9291
-#, c-format
-msgid "E700: Unknown function: %s"
-msgstr "E700: ฮดึชตฤบฏส: %s"
-
-#: ../eval.c:10729
-msgid "called inputrestore() more often than inputsave()"
-msgstr "inputrestore() ตฤต๗ำรดฮสถเำฺ inputsave()"
-
-#: ../eval.c:10771
-#, fuzzy
-msgid "insert() argument"
-msgstr "-c ฒฮส"
-
-#: ../eval.c:10841
-msgid "E786: Range not allowed"
-msgstr "E786: ฒปิสะํตฤทถฮง"
-
-#: ../eval.c:11140
-msgid "E701: Invalid type for len()"
-msgstr "E701: len() ตฤภเะอฮะง"
-
-#: ../eval.c:11980
-msgid "E726: Stride is zero"
-msgstr "E726: ฒฝณคฮชมใ"
-
-#: ../eval.c:11982
-msgid "E727: Start past end"
-msgstr "E727: ฦ๐สผึติฺึีึนึตบ๓"
-
-#: ../eval.c:12024 ../eval.c:15297
-msgid "<empty>"
-msgstr "<ฟี>"
-
-#: ../eval.c:12282
-#, fuzzy
-msgid "remove() argument"
-msgstr "--cmd ฒฮส"
-
-#: ../eval.c:12466
-msgid "E655: Too many symbolic links (cycle?)"
-msgstr "E655: ท๛บลมฌฝำนถเ(ัญปทฃฟ)"
-
-#: ../eval.c:12593
-#, fuzzy
-msgid "reverse() argument"
-msgstr "-c ฒฮส"
-
-#: ../eval.c:13721
-#, fuzzy
-msgid "sort() argument"
-msgstr "-c ฒฮส"
-
-#: ../eval.c:13721
-#, fuzzy
-msgid "uniq() argument"
-msgstr "-c ฒฮส"
-
-#: ../eval.c:13776
-msgid "E702: Sort compare function failed"
-msgstr "E702: Sort ฑศฝฯบฏสสงฐ"
-
-#: ../eval.c:13806
-#, fuzzy
-msgid "E882: Uniq compare function failed"
-msgstr "E702: Sort ฑศฝฯบฏสสงฐ"
-
-#: ../eval.c:14085
-msgid "(Invalid)"
-msgstr "(ฮะง)"
-
-#: ../eval.c:14590
-msgid "E677: Error writing temp file"
-msgstr "E677: ะดมูสฑฮฤผณ๖ดํ"
-
-#: ../eval.c:16159
-#, fuzzy
-msgid "E805: Using a Float as a Number"
-msgstr "E745: ฝซ List ื๗สืึสนำร"
-
-#: ../eval.c:16162
-msgid "E703: Using a Funcref as a Number"
-msgstr "E703: ฝซ Funcref ื๗สืึสนำร"
-
-#: ../eval.c:16170
-msgid "E745: Using a List as a Number"
-msgstr "E745: ฝซ List ื๗สืึสนำร"
-
-#: ../eval.c:16173
-msgid "E728: Using a Dictionary as a Number"
-msgstr "E728: ฝซ Dictionary ื๗สืึสนำร"
-
-#: ../eval.c:16259
-msgid "E729: using Funcref as a String"
-msgstr "E729: ฝซ Funcref ื๗ String สนำร"
-
-#: ../eval.c:16262
-msgid "E730: using List as a String"
-msgstr "E730: ฝซ List ื๗ String สนำร"
-
-#: ../eval.c:16265
-msgid "E731: using Dictionary as a String"
-msgstr "E731: ฝซ Dictionary ื๗ String สนำร"
-
-#: ../eval.c:16619
-#, c-format
-msgid "E706: Variable type mismatch for: %s"
-msgstr "E706: ฑไมฟภเะอฒปฦฅลไ: %s"
-
-#: ../eval.c:16705
-#, fuzzy, c-format
-msgid "E795: Cannot delete variable %s"
-msgstr "E738: ฮทจมะณ๖ %s ตฤฑไมฟ"
-
-#: ../eval.c:16724
-#, c-format
-msgid "E704: Funcref variable name must start with a capital: %s"
-msgstr "E704: Funcref ฑไมฟร๛ฑุะ๋าิด๓ะดืึฤธฟชอท: %s"
-
-#: ../eval.c:16732
-#, c-format
-msgid "E705: Variable name conflicts with existing function: %s"
-msgstr "E705: ฑไมฟร๛ำ๋าัำะบฏสร๛ณๅอป: %s"
-
-#: ../eval.c:16763
-#, c-format
-msgid "E741: Value is locked: %s"
-msgstr "E741: ึตาัห๘ถจ: %s"
-
-#: ../eval.c:16764 ../eval.c:16769 ../message.c:1839
-msgid "Unknown"
-msgstr "ฮดึช"
-
-#: ../eval.c:16768
-#, c-format
-msgid "E742: Cannot change value of %s"
-msgstr "E742: ฮทจธฤฑไ %s ตฤึต"
-
-#: ../eval.c:16838
-msgid "E698: variable nested too deep for making a copy"
-msgstr "E698: ฑไมฟวถฬืนษ๎ฮทจธดึฦ"
-
-#: ../eval.c:17249
-#, c-format
-msgid "E123: Undefined function: %s"
-msgstr "E123: บฏส %s ษะฮดถจาๅ"
-
-#: ../eval.c:17260
-#, c-format
-msgid "E124: Missing '(': %s"
-msgstr "E124: ศฑษู '(': %s"
-
-#: ../eval.c:17293
-#, fuzzy
-msgid "E862: Cannot use g: here"
-msgstr "E284: ฒปฤษ่ถจ IC ึต"
-
-#: ../eval.c:17312
-#, c-format
-msgid "E125: Illegal argument: %s"
-msgstr "E125: ฮะงตฤฒฮส: %s"
-
-#: ../eval.c:17323
-#, fuzzy, c-format
-msgid "E853: Duplicate argument name: %s"
-msgstr "E125: ฮะงตฤฒฮส: %s"
-
-#: ../eval.c:17416
-msgid "E126: Missing :endfunction"
-msgstr "E126: ศฑษู :endfunction"
-
-#: ../eval.c:17537
-#, fuzzy, c-format
-msgid "E707: Function name conflicts with variable: %s"
-msgstr "E746: บฏสร๛ำ๋ฝลฑพฮฤผร๛ฒปฦฅลไ: %s"
-
-#: ../eval.c:17549
-#, c-format
-msgid "E127: Cannot redefine function %s: It is in use"
-msgstr "E127: บฏส %s ีิฺสนำรึะฃฌฒปฤึุะยถจาๅ"
-
-#: ../eval.c:17604
-#, c-format
-msgid "E746: Function name does not match script file name: %s"
-msgstr "E746: บฏสร๛ำ๋ฝลฑพฮฤผร๛ฒปฦฅลไ: %s"
-
-#: ../eval.c:17716
-msgid "E129: Function name required"
-msgstr "E129: ะ่าชบฏสร๛"
-
-#: ../eval.c:17824
-#, fuzzy, c-format
-msgid "E128: Function name must start with a capital or \"s:\": %s"
-msgstr "E128: บฏสร๛ฑุะ๋าิด๓ะดืึฤธฟชอทป๒ี฿ฐบฌรฐบล: %s"
-
-#: ../eval.c:17833
-#, fuzzy, c-format
-msgid "E884: Function name cannot contain a colon: %s"
-msgstr "E128: บฏสร๛ฑุะ๋าิด๓ะดืึฤธฟชอทป๒ี฿ฐบฌรฐบล: %s"
-
-#: ../eval.c:18336
-#, c-format
-msgid "E131: Cannot delete function %s: It is in use"
-msgstr "E131: ฮทจษพณบฏส %s: ีิฺสนำรึะ"
-
-#: ../eval.c:18441
-msgid "E132: Function call depth is higher than 'maxfuncdepth'"
-msgstr "E132: บฏสต๗ำรษ๎ถศณฌณ๖ 'maxfuncdepth'"
-
-#: ../eval.c:18568
-#, c-format
-msgid "calling %s"
-msgstr "ต๗ำร %s"
-
-#: ../eval.c:18651
-#, c-format
-msgid "%s aborted"
-msgstr "%s าัึะึน"
-
-#: ../eval.c:18653
-#, c-format
-msgid "%s returning #%<PRId64>"
-msgstr "%s ทตปุ #%<PRId64> "
-
-#: ../eval.c:18670
-#, c-format
-msgid "%s returning %s"
-msgstr "%s ทตปุ %s"
-
-#: ../eval.c:18691 ../ex_cmds2.c:2695
-#, c-format
-msgid "continuing in %s"
-msgstr "ิฺ %s ึะผฬะ๘"
-
-#: ../eval.c:18795
-msgid "E133: :return not inside a function"
-msgstr "E133: :return ฒปิฺบฏสึะ"
-
-#: ../eval.c:19159
-msgid ""
-"\n"
-"# global variables:\n"
-msgstr ""
-"\n"
-"# ศซพึฑไมฟ:\n"
-
-#: ../eval.c:19254
-msgid ""
-"\n"
-"\tLast set from "
-msgstr ""
-"\n"
-"\tื๎ฝะธฤำฺ "
-
-#: ../eval.c:19272
-#, fuzzy
-msgid "No old files"
-msgstr "รปำะฐบฌฮฤผ"
-
-#: ../ex_cmds.c:122
-#, c-format
-msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
-msgstr "<%s>%s%s %d, สฎม๙ฝ๘ึฦ %02x, ฐหฝ๘ึฦ %03o"
-
-#: ../ex_cmds.c:145
-#, c-format
-msgid "> %d, Hex %04x, Octal %o"
-msgstr "> %d, สฎม๙ฝ๘ึฦ %04x, ฐหฝ๘ึฦ %o"
-
-#: ../ex_cmds.c:146
-#, c-format
-msgid "> %d, Hex %08x, Octal %o"
-msgstr "> %d, สฎม๙ฝ๘ึฦ %08x, ฐหฝ๘ึฦ %o"
-
-#: ../ex_cmds.c:684
-msgid "E134: Move lines into themselves"
-msgstr "E134: ฐัะะาฦถฏตฝืิาัึะ"
-
-#: ../ex_cmds.c:747
-msgid "1 line moved"
-msgstr "าฦถฏมห 1 ะะ"
-
-#: ../ex_cmds.c:749
-#, c-format
-msgid "%<PRId64> lines moved"
-msgstr "าฦถฏมห %<PRId64> ะะ"
-
-#: ../ex_cmds.c:1175
-#, c-format
-msgid "%<PRId64> lines filtered"
-msgstr "นยหมห %<PRId64> ะะ"
-
-#: ../ex_cmds.c:1194
-msgid "E135: *Filter* Autocommands must not change current buffer"
-msgstr "E135: *Filter* ืิถฏรม๎ฒปฟษาิธฤฑไตฑวฐปบณๅว๘"
-
-#: ../ex_cmds.c:1244
-msgid "[No write since last change]\n"
-msgstr "[าัะธฤตซษะฮดฑฃดๆ]\n"
-
-# bad to translate
-#: ../ex_cmds.c:1424
-#, c-format
-msgid "%sviminfo: %s in line: "
-msgstr "%sviminfo: %s ฮปำฺะะ: "
-
-#: ../ex_cmds.c:1431
-msgid "E136: viminfo: Too many errors, skipping rest of file"
-msgstr "E136: viminfo: ดํฮ๓นถเฃฌบ๖ยิฮฤผตฤสฃำเฒฟทึ"
-
-#: ../ex_cmds.c:1458
-#, c-format
-msgid "Reading viminfo file \"%s\"%s%s%s"
-msgstr "ถมศก viminfo ฮฤผ \"%s\"%s%s%s"
-
-#: ../ex_cmds.c:1460
-msgid " info"
-msgstr " ะลฯข"
-
-#: ../ex_cmds.c:1461
-msgid " marks"
-msgstr " ฑ๊ผว"
-
-#: ../ex_cmds.c:1462
-#, fuzzy
-msgid " oldfiles"
-msgstr "รปำะฐบฌฮฤผ"
-
-#: ../ex_cmds.c:1463
-msgid " FAILED"
-msgstr " สงฐ"
-
-#. avoid a wait_return for this message, it's annoying
-#: ../ex_cmds.c:1541
-#, c-format
-msgid "E137: Viminfo file is not writable: %s"
-msgstr "E137: Viminfo ฮฤผฒปฟษะดศ๋: %s"
-
-#: ../ex_cmds.c:1626
-#, c-format
-msgid "E138: Can't write viminfo file %s!"
-msgstr "E138: ฮทจะดศ๋ viminfo ฮฤผ %sฃก"
-
-#: ../ex_cmds.c:1635
-#, c-format
-msgid "Writing viminfo file \"%s\""
-msgstr "ะดศ๋ viminfo ฮฤผ \"%s\""
-
-# do not translate to avoid writing Chinese in files
-#. Write the info:
-#: ../ex_cmds.c:1720
-#, fuzzy, c-format
-msgid "# This viminfo file was generated by Vim %s.\n"
-msgstr "# ีโธ๖ viminfo ฮฤผสวำษ Vim %s ษ๚ณษตฤกฃ\n"
-
-# do not translate to avoid writing Chinese in files
-#: ../ex_cmds.c:1722
-#, fuzzy
-msgid ""
-"# You may edit it if you're careful!\n"
-"\n"
-msgstr ""
-"# ศ็น๛าชืิะะะธฤว๋ฬุฑ๐ะกะฤฃก\n"
-"\n"
-
-# do not translate to avoid writing Chinese in files
-#: ../ex_cmds.c:1723
-#, fuzzy
-msgid "# Value of 'encoding' when this file was written\n"
-msgstr "# 'encoding' ิฺดหฮฤผฝจมขสฑตฤึต\n"
-
-#: ../ex_cmds.c:1800
-msgid "Illegal starting char"
-msgstr "ฮะงตฤฦ๔ถฏืึท๛"
-
-#: ../ex_cmds.c:2162
-msgid "Write partial file?"
-msgstr "าชะดศ๋ฒฟทึฮฤผย๐ฃฟ"
-
-#: ../ex_cmds.c:2166
-msgid "E140: Use ! to write partial buffer"
-msgstr "E140: ว๋สนำร ! ภดะดศ๋ฒฟทึปบณๅว๘"
-
-#: ../ex_cmds.c:2281
-#, c-format
-msgid "Overwrite existing file \"%s\"?"
-msgstr "ธฒธวาัดๆิฺตฤฮฤผ \"%s\" ย๐ฃฟ"
-
-#: ../ex_cmds.c:2317
-#, c-format
-msgid "Swap file \"%s\" exists, overwrite anyway?"
-msgstr "ฝปปปฮฤผ \"%s\" าัดๆิฺฃฌศทสตาชธฒธวย๐ฃฟ"
-
-#: ../ex_cmds.c:2326
-#, c-format
-msgid "E768: Swap file exists: %s (:silent! overrides)"
-msgstr "E768: ฝปปปฮฤผาัดๆิฺ: %s (:silent! วฟึฦึดะะ)"
-
-#: ../ex_cmds.c:2381
-#, c-format
-msgid "E141: No file name for buffer %<PRId64>"
-msgstr "E141: ปบณๅว๘ %<PRId64> รปำะฮฤผร๛"
-
-#: ../ex_cmds.c:2412
-msgid "E142: File not written: Writing is disabled by 'write' option"
-msgstr "E142: ฮฤผฮดะดศ๋: ะดศ๋ฑป 'write' ักฯ๎ฝ๛ำร"
-
-#: ../ex_cmds.c:2434
-#, c-format
-msgid ""
-"'readonly' option is set for \"%s\".\n"
-"Do you wish to write anyway?"
-msgstr ""
-"\"%s\" าัษ่ถจ 'readonly' ักฯ๎กฃ\n"
-"ศทสตาชธฒธวย๐ฃฟ"
-
-#: ../ex_cmds.c:2439
-#, c-format
-msgid ""
-"File permissions of \"%s\" are read-only.\n"
-"It may still be possible to write it.\n"
-"Do you wish to try?"
-msgstr ""
-
-#: ../ex_cmds.c:2451
-#, fuzzy, c-format
-msgid "E505: \"%s\" is read-only (add ! to override)"
-msgstr "ึปถม (ว๋ผำ ! วฟึฦึดะะ)"
-
-#: ../ex_cmds.c:3120
-#, c-format
-msgid "E143: Autocommands unexpectedly deleted new buffer %s"
-msgstr "E143: ืิถฏรม๎าโอโตุษพณมหะยปบณๅว๘ %s"
-
-#: ../ex_cmds.c:3313
-msgid "E144: non-numeric argument to :z"
-msgstr "E144: :z ฒปฝำสทวสืึตฤฒฮส"
-
-#: ../ex_cmds.c:3404
-msgid "E145: Shell commands not allowed in rvim"
-msgstr "E145: rvim ึะฝ๛ึนสนำร shell รม๎"
-
-#: ../ex_cmds.c:3498
-msgid "E146: Regular expressions can't be delimited by letters"
-msgstr "E146: ีิ๒ฑํด๏สฝฒปฤำรืึฤธื๗ทึฝ็"
-
-#: ../ex_cmds.c:3964
-#, c-format
-msgid "replace with %s (y/n/a/q/l/^E/^Y)?"
-msgstr "ฬๆปปฮช %s (y/n/a/q/l/^E/^Y)ฃฟ"
-
-#: ../ex_cmds.c:4379
-msgid "(Interrupted) "
-msgstr "(าัึะถฯ) "
-
-#: ../ex_cmds.c:4384
-msgid "1 match"
-msgstr "1 ธ๖ฦฅลไฃฌ"
-
-#: ../ex_cmds.c:4384
-msgid "1 substitution"
-msgstr "1 ดฮฬๆปปฃฌ"
-
-#: ../ex_cmds.c:4387
-#, c-format
-msgid "%<PRId64> matches"
-msgstr "%<PRId64> ธ๖ฦฅลไฃฌ"
-
-#: ../ex_cmds.c:4388
-#, c-format
-msgid "%<PRId64> substitutions"
-msgstr "%<PRId64> ดฮฬๆปปฃฌ"
-
-#: ../ex_cmds.c:4392
-msgid " on 1 line"
-msgstr "นฒ 1 ะะ"
-
-#: ../ex_cmds.c:4395
-#, c-format
-msgid " on %<PRId64> lines"
-msgstr "นฒ %<PRId64> ะะ"
-
-#: ../ex_cmds.c:4438
-msgid "E147: Cannot do :global recursive"
-msgstr "E147: :global ฒปฤตน้ึดะะ"
-
-#: ../ex_cmds.c:4467
-msgid "E148: Regular expression missing from global"
-msgstr "E148: global ศฑษูีิ๒ฑํด๏สฝ"
-
-#: ../ex_cmds.c:4508
-#, c-format
-msgid "Pattern found in every line: %s"
-msgstr "รฟะะถผฦฅลไฑํด๏สฝ: %s"
-
-#: ../ex_cmds.c:4510
-#, fuzzy, c-format
-msgid "Pattern not found: %s"
-msgstr "ีาฒปตฝฤฃสฝ"
-
-# do not translate to avoid writing Chinese in files
-#: ../ex_cmds.c:4587
-#, fuzzy
-msgid ""
-"\n"
-"# Last Substitute String:\n"
-"$"
-msgstr ""
-"\n"
-"# ื๎ฝตฤฬๆปปืึท๛ดฎ:\n"
-"$"
-
-#: ../ex_cmds.c:4679
-msgid "E478: Don't panic!"
-msgstr "E478: ฒปาชปลฃก"
-
-#: ../ex_cmds.c:4717
-#, c-format
-msgid "E661: Sorry, no '%s' help for %s"
-msgstr "E661: ฑงวธฃฌรปำะ '%s' ตฤ %s ตฤหตร๗"
-
-#: ../ex_cmds.c:4719
-#, c-format
-msgid "E149: Sorry, no help for %s"
-msgstr "E149: ฑงวธฃฌรปำะ %s ตฤหตร๗"
-
-#: ../ex_cmds.c:4751
-#, c-format
-msgid "Sorry, help file \"%s\" not found"
-msgstr "ฑงวธฃฌีาฒปตฝฐ๏ึ๚ฮฤผ \"%s\""
-
-#: ../ex_cmds.c:5323
-#, c-format
-msgid "E150: Not a directory: %s"
-msgstr "E150: ฒปสวฤฟยผ: %s"
-
-#: ../ex_cmds.c:5446
-#, c-format
-msgid "E152: Cannot open %s for writing"
-msgstr "E152: ฮทจด๒ฟชฒขะดศ๋ %s"
-
-#: ../ex_cmds.c:5471
-#, c-format
-msgid "E153: Unable to open %s for reading"
-msgstr "E153: ฮทจด๒ฟชฒขถมศก %s"
-
-#: ../ex_cmds.c:5500
-#, c-format
-msgid "E670: Mix of help file encodings within a language: %s"
-msgstr "E670: ิฺาปึึำ๏ัิึะป์บฯมหถเึึฐ๏ึ๚ฮฤผฑเย๋: %s"
-
-#: ../ex_cmds.c:5565
-#, c-format
-msgid "E154: Duplicate tag \"%s\" in file %s/%s"
-msgstr "E154: Tag \"%s\" ิฺฮฤผ %s/%s ึะึุธดณ๖ฯึ"
-
-#: ../ex_cmds.c:5687
-#, c-format
-msgid "E160: Unknown sign command: %s"
-msgstr "E160: ฮดึชตฤ sign รม๎: %s"
-
-#: ../ex_cmds.c:5704
-msgid "E156: Missing sign name"
-msgstr "E156: ศฑษู sign ร๛ณฦ"
-
-#: ../ex_cmds.c:5746
-msgid "E612: Too many signs defined"
-msgstr "E612: Signs ถจาๅนถเ"
-
-#: ../ex_cmds.c:5813
-#, c-format
-msgid "E239: Invalid sign text: %s"
-msgstr "E239: ฮะงตฤ sign ฮฤืึ: %s"
-
-#: ../ex_cmds.c:5844 ../ex_cmds.c:6035
-#, c-format
-msgid "E155: Unknown sign: %s"
-msgstr "E155: ฮดึชตฤ sign: %s"
-
-#: ../ex_cmds.c:5877
-msgid "E159: Missing sign number"
-msgstr "E159: ศฑษู sign บล"
-
-#: ../ex_cmds.c:5971
-#, c-format
-msgid "E158: Invalid buffer name: %s"
-msgstr "E158: ฮะงตฤปบณๅว๘ร๛: %s"
-
-#: ../ex_cmds.c:6008
-#, c-format
-msgid "E157: Invalid sign ID: %<PRId64>"
-msgstr "E157: ฮะงตฤ sign ID: %<PRId64>"
-
-#: ../ex_cmds.c:6066
-msgid " (not supported)"
-msgstr " (ฒปึงณึ)"
-
-#: ../ex_cmds.c:6169
-msgid "[Deleted]"
-msgstr "[าัษพณ]"
-
-#: ../ex_cmds2.c:139
-msgid "Entering Debug mode. Type \"cont\" to continue."
-msgstr "ฝ๘ศ๋ต๗สิฤฃสฝกฃสไศ๋ \"cont\" ผฬะ๘ิหะะกฃ"
-
-#: ../ex_cmds2.c:143 ../ex_docmd.c:759
-#, c-format
-msgid "line %<PRId64>: %s"
-msgstr "ตฺ %<PRId64> ะะ: %s"
-
-#: ../ex_cmds2.c:145
-#, c-format
-msgid "cmd: %s"
-msgstr "รม๎: %s"
-
-#: ../ex_cmds2.c:322
-#, c-format
-msgid "Breakpoint in \"%s%s\" line %<PRId64>"
-msgstr "ถฯตใ \"%s%s\" ตฺ %<PRId64> ะะ"
-
-#: ../ex_cmds2.c:581
-#, c-format
-msgid "E161: Breakpoint not found: %s"
-msgstr "E161: ีาฒปตฝถฯตใ: %s"
-
-#: ../ex_cmds2.c:611
-msgid "No breakpoints defined"
-msgstr "รปำะถจาๅถฯตใ"
-
-#: ../ex_cmds2.c:617
-#, c-format
-msgid "%3d %s %s line %<PRId64>"
-msgstr "%3d %s %s ตฺ %<PRId64> ะะ"
-
-#: ../ex_cmds2.c:942
-#, fuzzy
-msgid "E750: First use \":profile start {fname}\""
-msgstr "E750: ว๋ฯศสนำร :profile start <fname>"
-
-#: ../ex_cmds2.c:1269
-#, c-format
-msgid "Save changes to \"%s\"?"
-msgstr "ฝซธฤฑไฑฃดๆตฝ \"%s\" ย๐ฃฟ"
-
-#: ../ex_cmds2.c:1271 ../ex_docmd.c:8851
-msgid "Untitled"
-msgstr "ฮดรร๛"
-
-#: ../ex_cmds2.c:1421
-#, c-format
-msgid "E162: No write since last change for buffer \"%s\""
-msgstr "E162: ปบณๅว๘ \"%s\" าัะธฤตซษะฮดฑฃดๆ"
-
-#: ../ex_cmds2.c:1480
-msgid "Warning: Entered other buffer unexpectedly (check autocommands)"
-msgstr "พฏธๆ: าโอโตุฝ๘ศ๋มหฦไหปบณๅว๘ (ว๋ผ์ฒ้ืิถฏรม๎)"
-
-#: ../ex_cmds2.c:1826
-msgid "E163: There is only one file to edit"
-msgstr "E163: ึปำะาปธ๖ฮฤผฟษฑเผญ"
-
-#: ../ex_cmds2.c:1828
-msgid "E164: Cannot go before first file"
-msgstr "E164: ฮทจวะปปฃฌาัสวตฺาปธ๖ฮฤผ"
-
-#: ../ex_cmds2.c:1830
-msgid "E165: Cannot go beyond last file"
-msgstr "E165: ฮทจวะปปฃฌาัสวื๎บ๓าปธ๖ฮฤผ"
-
-#: ../ex_cmds2.c:2175
-#, c-format
-msgid "E666: compiler not supported: %s"
-msgstr "E666: ฒปึงณึฑเา๋ฦ๗: %s"
-
-#: ../ex_cmds2.c:2257
-#, c-format
-msgid "Searching for \"%s\" in \"%s\""
-msgstr "ีิฺฒ้ีา \"%s\"ฃฌิฺ \"%s\" ึะ"
-
-#: ../ex_cmds2.c:2284
-#, c-format
-msgid "Searching for \"%s\""
-msgstr "ีิฺฒ้ีา \"%s\""
-
-#: ../ex_cmds2.c:2307
-#, c-format
-msgid "not found in 'runtimepath': \"%s\""
-msgstr "ิฺ 'runtimepath' ึะีาฒปตฝ \"%s\""
-
-#: ../ex_cmds2.c:2472
-#, c-format
-msgid "Cannot source a directory: \"%s\""
-msgstr "ฒปฤึดะะฤฟยผ: \"%s\""
-
-#: ../ex_cmds2.c:2518
-#, c-format
-msgid "could not source \"%s\""
-msgstr "ฒปฤึดะะ \"%s\""
-
-#: ../ex_cmds2.c:2520
-#, c-format
-msgid "line %<PRId64>: could not source \"%s\""
-msgstr "ตฺ %<PRId64> ะะ: ฒปฤึดะะ \"%s\""
-
-#: ../ex_cmds2.c:2535
-#, c-format
-msgid "sourcing \"%s\""
-msgstr "ึดะะ \"%s\""
-
-#: ../ex_cmds2.c:2537
-#, c-format
-msgid "line %<PRId64>: sourcing \"%s\""
-msgstr "ตฺ %<PRId64> ะะ: ึดะะ \"%s\""
-
-#: ../ex_cmds2.c:2693
-#, c-format
-msgid "finished sourcing %s"
-msgstr "ฝแส๘ึดะะ %s"
-
-#: ../ex_cmds2.c:2765
-msgid "modeline"
-msgstr "modeline"
-
-#: ../ex_cmds2.c:2767
-msgid "--cmd argument"
-msgstr "--cmd ฒฮส"
-
-#: ../ex_cmds2.c:2769
-msgid "-c argument"
-msgstr "-c ฒฮส"
-
-#: ../ex_cmds2.c:2771
-msgid "environment variable"
-msgstr "ปทพณฑไมฟ"
-
-#: ../ex_cmds2.c:2773
-msgid "error handler"
-msgstr ""
-
-#: ../ex_cmds2.c:3020
-msgid "W15: Warning: Wrong line separator, ^M may be missing"
-msgstr "W15: พฏธๆ: ดํฮ๓ตฤะะทึธ๔ท๛ฃฌฟษฤสวษูมห ^M"
-
-#: ../ex_cmds2.c:3139
-msgid "E167: :scriptencoding used outside of a sourced file"
-msgstr "E167: ิฺฝลฑพฮฤผอโสนำรมห :scriptencoding"
-
-#: ../ex_cmds2.c:3166
-msgid "E168: :finish used outside of a sourced file"
-msgstr "E168: ิฺฝลฑพฮฤผอโสนำรมห :finish"
-
-#: ../ex_cmds2.c:3389
-#, c-format
-msgid "Current %slanguage: \"%s\""
-msgstr "ตฑวฐตฤ %sำ๏ัิ: \"%s\""
-
-#: ../ex_cmds2.c:3404
-#, c-format
-msgid "E197: Cannot set language to \"%s\""
-msgstr "E197: ฒปฤษ่ถจำ๏ัิฮช \"%s\""
-
-#. don't redisplay the window
-#. don't wait for return
-#: ../ex_docmd.c:387
-msgid "Entering Ex mode. Type \"visual\" to go to Normal mode."
-msgstr "ฝ๘ศ๋ Ex ฤฃสฝกฃสไศ๋ \"visual\" ปุตฝีณฃฤฃสฝกฃ"
-
-#: ../ex_docmd.c:428
-msgid "E501: At end-of-file"
-msgstr "E501: าัตฝฮฤผฤฉฮฒ"
-
-#: ../ex_docmd.c:513
-msgid "E169: Command too recursive"
-msgstr "E169: รม๎ตน้ฒใสนถเ"
-
-#: ../ex_docmd.c:1006
-#, c-format
-msgid "E605: Exception not caught: %s"
-msgstr "E605: า์ณฃรปำะฑปฒถป๑: %s"
-
-#: ../ex_docmd.c:1085
-msgid "End of sourced file"
-msgstr "ฝลฑพฮฤผฝแส๘"
-
-#: ../ex_docmd.c:1086
-msgid "End of function"
-msgstr "บฏสฝแส๘"
-
-#: ../ex_docmd.c:1628
-msgid "E464: Ambiguous use of user-defined command"
-msgstr "E464: ฒปศทถจตฤำรปงืิถจาๅรม๎"
-
-#: ../ex_docmd.c:1638
-msgid "E492: Not an editor command"
-msgstr "E492: ฒปสวฑเผญฦ๗ตฤรม๎"
-
-#: ../ex_docmd.c:1729
-msgid "E493: Backwards range given"
-msgstr "E493: สนำรมหฤๆฯ๒ตฤทถฮง"
-
-#: ../ex_docmd.c:1733
-msgid "Backwards range given, OK to swap"
-msgstr "สนำรมหฤๆฯ๒ตฤทถฮงฃฌศทถจฝปปปย๐"
-
-#. append
-#. typed wrong
-#: ../ex_docmd.c:1787
-msgid "E494: Use w or w>>"
-msgstr "E494: ว๋สนำร w ป๒ w>>"
-
-#: ../ex_docmd.c:3454
-msgid "E319: The command is not available in this version"
-msgstr "E319: ฑงวธฃฌรม๎ิฺดหฐๆฑพึะฒปฟษำร"
-
-#: ../ex_docmd.c:3752
-msgid "E172: Only one file name allowed"
-msgstr "E172: ึปิสะําปธ๖ฮฤผร๛"
-
-#: ../ex_docmd.c:4238
-msgid "1 more file to edit. Quit anyway?"
-msgstr "ปนำะ 1 ธ๖ฮฤผฮดฑเผญกฃศทสตาชอหณ๖ย๐ฃฟ"
-
-#: ../ex_docmd.c:4242
-#, c-format
-msgid "%d more files to edit. Quit anyway?"
-msgstr "ปนำะ %d ธ๖ฮฤผฮดฑเผญกฃศทสตาชอหณ๖ย๐ฃฟ"
-
-#: ../ex_docmd.c:4248
-msgid "E173: 1 more file to edit"
-msgstr "E173: ปนำะ 1 ธ๖ฮฤผฮดฑเผญ"
-
-#: ../ex_docmd.c:4250
-#, c-format
-msgid "E173: %<PRId64> more files to edit"
-msgstr "E173: ปนำะ %<PRId64> ธ๖ฮฤผฮดฑเผญ"
-
-#: ../ex_docmd.c:4320
-msgid "E174: Command already exists: add ! to replace it"
-msgstr "E174: รม๎าัดๆิฺ: ว๋ผำ ! วฟึฦฬๆปป"
-
-#: ../ex_docmd.c:4432
-msgid ""
-"\n"
-" Name Args Range Complete Definition"
-msgstr ""
-"\n"
-" ร๛ณฦ ฒฮส ทถฮง ฒนศซ ถจาๅ "
-
-#: ../ex_docmd.c:4516
-msgid "No user-defined commands found"
-msgstr "ีาฒปตฝำรปงืิถจาๅรม๎"
-
-#: ../ex_docmd.c:4538
-msgid "E175: No attribute specified"
-msgstr "E175: รปำะึธถจส๔ะิ"
-
-#: ../ex_docmd.c:4583
-msgid "E176: Invalid number of arguments"
-msgstr "E176: ฮะงตฤฒฮสธ๖ส"
-
-#: ../ex_docmd.c:4594
-msgid "E177: Count cannot be specified twice"
-msgstr "E177: ฒปฤึธถจมฝดฮผฦส"
-
-#: ../ex_docmd.c:4603
-msgid "E178: Invalid default value for count"
-msgstr "E178: ฮะงตฤผฦสฤฌศฯึต"
-
-#: ../ex_docmd.c:4625
-msgid "E179: argument required for -complete"
-msgstr "E179: -complete ะ่าชฒฮส"
-
-#: ../ex_docmd.c:4635
-#, c-format
-msgid "E181: Invalid attribute: %s"
-msgstr "E181: ฮะงตฤส๔ะิ: %s"
-
-#: ../ex_docmd.c:4678
-msgid "E182: Invalid command name"
-msgstr "E182: ฮะงตฤรม๎ร๛"
-
-#: ../ex_docmd.c:4691
-msgid "E183: User defined commands must start with an uppercase letter"
-msgstr "E183: ำรปงืิถจาๅรม๎ฑุะ๋าิด๓ะดืึฤธฟชอท"
-
-#: ../ex_docmd.c:4696
-#, fuzzy
-msgid "E841: Reserved name, cannot be used for user defined command"
-msgstr "E464: ฒปศทถจตฤำรปงืิถจาๅรม๎"
-
-#: ../ex_docmd.c:4751
-#, c-format
-msgid "E184: No such user-defined command: %s"
-msgstr "E184: รปำะีโธ๖ำรปงืิถจาๅรม๎: %s"
-
-#: ../ex_docmd.c:5219
-#, c-format
-msgid "E180: Invalid complete value: %s"
-msgstr "E180: ฮะงตฤฒนศซภเะอ: %s"
-
-#: ../ex_docmd.c:5225
-msgid "E468: Completion argument only allowed for custom completion"
-msgstr "E468: ึปำะ custom ฒนศซฒลิสะํฒฮส"
-
-#: ../ex_docmd.c:5231
-msgid "E467: Custom completion requires a function argument"
-msgstr "E467: Custom ฒนศซะ่าชาปธ๖บฏสฒฮส"
-
-#: ../ex_docmd.c:5257
-#, fuzzy, c-format
-msgid "E185: Cannot find color scheme '%s'"
-msgstr "E185: ีาฒปตฝลไษซทฝฐธ %s"
-
-#: ../ex_docmd.c:5263
-msgid "Greetings, Vim user!"
-msgstr "ฤ๚บรฃฌVim ำรปงฃก"
-
-#: ../ex_docmd.c:5431
-msgid "E784: Cannot close last tab page"
-msgstr "E784: ฒปฤนุฑีื๎บ๓าปธ๖ tab าณ"
-
-#: ../ex_docmd.c:5462
-msgid "Already only one tab page"
-msgstr "าัพญึปสฃาปธ๖ tab าณมห"
-
-#: ../ex_docmd.c:6004
-#, c-format
-msgid "Tab page %d"
-msgstr "Tab าณ %d"
-
-#: ../ex_docmd.c:6295
-msgid "No swap file"
-msgstr "ฮฝปปปฮฤผ"
-
-#: ../ex_docmd.c:6478
-msgid "E747: Cannot change directory, buffer is modified (add ! to override)"
-msgstr "E747: ฒปฤธฤฑไฤฟยผฃฌปบณๅว๘าัะธฤ (ว๋ผำ ! วฟึฦึดะะ)"
-
-#: ../ex_docmd.c:6485
-msgid "E186: No previous directory"
-msgstr "E186: วฐาปธ๖ฤฟยผฒปดๆิฺ"
-
-#: ../ex_docmd.c:6530
-msgid "E187: Unknown"
-msgstr "E187: ฮดึช"
-
-#: ../ex_docmd.c:6610
-msgid "E465: :winsize requires two number arguments"
-msgstr "E465: :winsize ะ่าชมฝธ๖สืึฒฮส"
-
-#: ../ex_docmd.c:6655
-msgid "E188: Obtaining window position not implemented for this platform"
-msgstr "E188: ิฺดหฦฝฬจษฯฒปฤป๑ตรดฐฟฺฮปึร"
-
-#: ../ex_docmd.c:6662
-msgid "E466: :winpos requires two number arguments"
-msgstr "E466: :winpos ะ่าชมฝธ๖สืึฒฮส"
-
-#: ../ex_docmd.c:7241
-#, c-format
-msgid "E739: Cannot create directory: %s"
-msgstr "E739: ฮทจดดฝจฤฟยผ: %s"
-
-#: ../ex_docmd.c:7268
-#, c-format
-msgid "E189: \"%s\" exists (add ! to override)"
-msgstr "E189: \"%s\" าัดๆิฺ (ว๋ผำ ! วฟึฦึดะะ)"
-
-#: ../ex_docmd.c:7273
-#, c-format
-msgid "E190: Cannot open \"%s\" for writing"
-msgstr "E190: ฮทจด๒ฟชฒขะดศ๋ \"%s\""
-
-#. set mark
-#: ../ex_docmd.c:7294
-msgid "E191: Argument must be a letter or forward/backward quote"
-msgstr "E191: ฒฮสฑุะ๋สวาปธ๖ืึฤธป๒ี฿ี/ทดาบล"
-
-#: ../ex_docmd.c:7333
-msgid "E192: Recursive use of :normal too deep"
-msgstr "E192: :normal ตน้ฒใสนษ๎"
-
-#: ../ex_docmd.c:7807
-msgid "E194: No alternate file name to substitute for '#'"
-msgstr "E194: รปำะำรำฺฬๆปป '#' ตฤฝปฬๆฮฤผร๛"
-
-#: ../ex_docmd.c:7841
-msgid "E495: no autocommand file name to substitute for \"<afile>\""
-msgstr "E495: รปำะำรำฺฬๆปป \"<afile>\" ตฤืิถฏรม๎ฮฤผร๛"
-
-#: ../ex_docmd.c:7850
-msgid "E496: no autocommand buffer number to substitute for \"<abuf>\""
-msgstr "E496: รปำะำรำฺฬๆปป \"<abuf>\" ตฤืิถฏรม๎ปบณๅว๘บล"
-
-#: ../ex_docmd.c:7861
-msgid "E497: no autocommand match name to substitute for \"<amatch>\""
-msgstr "E497: รปำะำรำฺฬๆปป \"<amatch>\" ตฤืิถฏรม๎ฦฅลไร๛"
-
-#: ../ex_docmd.c:7870
-msgid "E498: no :source file name to substitute for \"<sfile>\""
-msgstr "E498: รปำะำรำฺฬๆปป \"<sfile>\" ตฤ :source ฮฤผร๛"
-
-#: ../ex_docmd.c:7876
-#, fuzzy
-msgid "E842: no line number to use for \"<slnum>\""
-msgstr "E498: รปำะำรำฺฬๆปป \"<sfile>\" ตฤ :source ฮฤผร๛"
-
-#: ../ex_docmd.c:7903
-#, fuzzy, c-format
-msgid "E499: Empty file name for '%' or '#', only works with \":p:h\""
-msgstr "E499: '%' ป๒ '#' ฮชฟีฮฤผร๛ฃฌึปฤำรำฺ \":p:h\""
-
-#: ../ex_docmd.c:7905
-msgid "E500: Evaluates to an empty string"
-msgstr "E500: ฝแน๛ฮชฟีืึท๛ดฎ"
-
-#: ../ex_docmd.c:8838
-msgid "E195: Cannot open viminfo file for reading"
-msgstr "E195: ฮทจด๒ฟชฒขถมศก viminfo ฮฤผ"
-
-#: ../ex_eval.c:464
-msgid "E608: Cannot :throw exceptions with 'Vim' prefix"
-msgstr "E608: ฒปฤ :throw วฐืบฮช 'Vim' ตฤา์ณฃ"
-
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:496
-#, c-format
-msgid "Exception thrown: %s"
-msgstr "ลืณ๖า์ณฃ: %s"
-
-#: ../ex_eval.c:545
-#, c-format
-msgid "Exception finished: %s"
-msgstr "อ๊ณษา์ณฃ: %s"
-
-#: ../ex_eval.c:546
-#, c-format
-msgid "Exception discarded: %s"
-msgstr "ถชฦ๚า์ณฃ: %s"
-
-#: ../ex_eval.c:588 ../ex_eval.c:634
-#, c-format
-msgid "%s, line %<PRId64>"
-msgstr "%sฃฌตฺ %<PRId64> ะะ"
-
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:608
-#, c-format
-msgid "Exception caught: %s"
-msgstr "ฒถป๑า์ณฃ: %s"
-
-#: ../ex_eval.c:676
-#, c-format
-msgid "%s made pending"
-msgstr ""
-
-#: ../ex_eval.c:679
-#, fuzzy, c-format
-msgid "%s resumed"
-msgstr " าัทตปุ\n"
-
-#: ../ex_eval.c:683
-#, c-format
-msgid "%s discarded"
-msgstr ""
-
-#: ../ex_eval.c:708
-msgid "Exception"
-msgstr "า์ณฃ"
-
-#: ../ex_eval.c:713
-msgid "Error and interrupt"
-msgstr "ดํฮ๓บอึะถฯ"
-
-#: ../ex_eval.c:715
-msgid "Error"
-msgstr "ดํฮ๓"
-
-#. if (pending & CSTP_INTERRUPT)
-#: ../ex_eval.c:717
-msgid "Interrupt"
-msgstr "ึะถฯ"
-
-#: ../ex_eval.c:795
-msgid "E579: :if nesting too deep"
-msgstr "E579: :if วถฬืฒใสนษ๎"
-
-#: ../ex_eval.c:830
-msgid "E580: :endif without :if"
-msgstr "E580: :endif ศฑษูถิำฆตฤ :if"
-
-#: ../ex_eval.c:873
-msgid "E581: :else without :if"
-msgstr "E581: :else ศฑษูถิำฆตฤ :if"
-
-#: ../ex_eval.c:876
-msgid "E582: :elseif without :if"
-msgstr "E582: :elseif ศฑษูถิำฆตฤ :if"
-
-#: ../ex_eval.c:880
-msgid "E583: multiple :else"
-msgstr "E583: ถเธ๖ :else"
-
-#: ../ex_eval.c:883
-msgid "E584: :elseif after :else"
-msgstr "E584: :elseif ิฺ :else บ๓รๆ"
-
-#: ../ex_eval.c:941
-msgid "E585: :while/:for nesting too deep"
-msgstr "E585: :while/:for วถฬืฒใสนษ๎"
-
-#: ../ex_eval.c:1028
-msgid "E586: :continue without :while or :for"
-msgstr "E586: :continue ศฑษูถิำฆตฤ :while ป๒ :for"
-
-#: ../ex_eval.c:1061
-msgid "E587: :break without :while or :for"
-msgstr "E587: :break ศฑษูถิำฆตฤ :while ป๒ :for"
-
-#: ../ex_eval.c:1102
-msgid "E732: Using :endfor with :while"
-msgstr "E732: :while าิ :endfor ฝแฮฒ"
-
-#: ../ex_eval.c:1104
-msgid "E733: Using :endwhile with :for"
-msgstr "E733: :for าิ :endwhile ฝแฮฒ"
-
-#: ../ex_eval.c:1247
-msgid "E601: :try nesting too deep"
-msgstr "E601: :try วถฬืฒใสนษ๎"
-
-#: ../ex_eval.c:1317
-msgid "E603: :catch without :try"
-msgstr "E603: :catch ศฑษูถิำฆตฤ :try"
-
-#. Give up for a ":catch" after ":finally" and ignore it.
-#. * Just parse.
-#: ../ex_eval.c:1332
-msgid "E604: :catch after :finally"
-msgstr "E604: :catch ิฺ :finally บ๓รๆ"
-
-#: ../ex_eval.c:1451
-msgid "E606: :finally without :try"
-msgstr "E606: :finally ศฑษูถิำฆตฤ :try"
-
-#. Give up for a multiple ":finally" and ignore it.
-#: ../ex_eval.c:1467
-msgid "E607: multiple :finally"
-msgstr "E607: ถเธ๖ :finally"
-
-#: ../ex_eval.c:1571
-msgid "E602: :endtry without :try"
-msgstr "E602: :endtry ศฑษูถิำฆตฤ :try"
-
-#: ../ex_eval.c:2026
-msgid "E193: :endfunction not inside a function"
-msgstr "E193: :endfunction ฒปิฺบฏสฤฺ"
-
-#: ../ex_getln.c:1643
-msgid "E788: Not allowed to edit another buffer now"
-msgstr "E788: ฤฟวฐฒปิสะํฑเผญฑ๐ตฤปบณๅว๘"
-
-#: ../ex_getln.c:1656
-#, fuzzy
-msgid "E811: Not allowed to change buffer information now"
-msgstr "E788: ฤฟวฐฒปิสะํฑเผญฑ๐ตฤปบณๅว๘"
-
-#: ../ex_getln.c:3178
-msgid "tagname"
-msgstr "tag ร๛"
-
-#: ../ex_getln.c:3181
-msgid " kind file\n"
-msgstr " ภเะอ ฮฤผ\n"
-
-#: ../ex_getln.c:4799
-msgid "'history' option is zero"
-msgstr "ักฯ๎ 'history' ฮชมใ"
-
-# do not translate to avoid writing Chinese in files
-#: ../ex_getln.c:5046
-#, fuzzy, c-format
-msgid ""
-"\n"
-"# %s History (newest to oldest):\n"
-msgstr ""
-"\n"
-"# %s ภ๚สทผวยผ (ดำะยตฝพษ):\n"
-
-# do not translate to avoid writing Chinese in files
-#: ../ex_getln.c:5047
-#, fuzzy
-msgid "Command Line"
-msgstr "รม๎ะะ"
-
-# do not translate to avoid writing Chinese in files
-#: ../ex_getln.c:5048
-#, fuzzy
-msgid "Search String"
-msgstr "ฒ้ีาืึท๛ดฎ"
-
-# do not translate to avoid writing Chinese in files
-#: ../ex_getln.c:5049
-#, fuzzy
-msgid "Expression"
-msgstr "ฑํด๏สฝ"
-
-# do not translate to avoid writing Chinese in files
-#: ../ex_getln.c:5050
-#, fuzzy
-msgid "Input Line"
-msgstr "สไศ๋ะะ"
-
-#: ../ex_getln.c:5117
-msgid "E198: cmd_pchar beyond the command length"
-msgstr "E198: cmd_pchar ณฌนรม๎ณคถศ"
-
-#: ../ex_getln.c:5279
-msgid "E199: Active window or buffer deleted"
-msgstr "E199: ป๎ถฏดฐฟฺป๒ปบณๅว๘าัฑปษพณ"
-
-#: ../file_search.c:203
-msgid "E854: path too long for completion"
-msgstr ""
-
-#: ../file_search.c:446
-#, c-format
-msgid ""
-"E343: Invalid path: '**[number]' must be at the end of the path or be "
-"followed by '%s'."
-msgstr "E343: ฮะงตฤยทพถ: '**[number]' ฑุะ๋ิฺยทพถฤฉฮฒป๒ี฿บ๓รๆฝำ '%s'กฃ"
-
-#: ../file_search.c:1505
-#, c-format
-msgid "E344: Can't find directory \"%s\" in cdpath"
-msgstr "E344: cdpath ึะีาฒปตฝฤฟยผ \"%s\""
-
-#: ../file_search.c:1508
-#, c-format
-msgid "E345: Can't find file \"%s\" in path"
-msgstr "E345: ิฺยทพถึะีาฒปตฝฮฤผ \"%s\""
-
-#: ../file_search.c:1512
-#, c-format
-msgid "E346: No more directory \"%s\" found in cdpath"
-msgstr "E346: ิฺยทพถึะีาฒปตฝธถเตฤฮฤผ \"%s\""
-
-#: ../file_search.c:1515
-#, c-format
-msgid "E347: No more file \"%s\" found in path"
-msgstr "E347: ิฺยทพถึะีาฒปตฝธถเตฤฮฤผ \"%s\""
-
-#: ../fileio.c:137
-#, fuzzy
-msgid "E812: Autocommands changed buffer or buffer name"
-msgstr "E135: *Filter* ืิถฏรม๎ฒปฟษาิธฤฑไตฑวฐปบณๅว๘"
-
-#: ../fileio.c:368
-msgid "Illegal file name"
-msgstr "ฮะงตฤฮฤผร๛"
-
-#: ../fileio.c:395 ../fileio.c:476 ../fileio.c:2543 ../fileio.c:2578
-msgid "is a directory"
-msgstr "สวฤฟยผ"
-
-#: ../fileio.c:397
-msgid "is not a file"
-msgstr "ฒปสวฮฤผ"
-
-#: ../fileio.c:508 ../fileio.c:3522
-msgid "[New File]"
-msgstr "[ะยฮฤผ]"
-
-#: ../fileio.c:511
-msgid "[New DIRECTORY]"
-msgstr "[ะยฤฟยผ]"
-
-#: ../fileio.c:529 ../fileio.c:532
-msgid "[File too big]"
-msgstr "[ฮฤผนด๓]"
-
-#: ../fileio.c:534
-msgid "[Permission Denied]"
-msgstr "[ศจฯฒปืใ]"
-
-#: ../fileio.c:653
-msgid "E200: *ReadPre autocommands made the file unreadable"
-msgstr "E200: *ReadPre ืิถฏรม๎ตผึยฮฤผฒปฟษถม"
-
-#: ../fileio.c:655
-msgid "E201: *ReadPre autocommands must not change current buffer"
-msgstr "E201: *ReadPre ืิถฏรม๎ฒปิสะํธฤฑไตฑวฐปบณๅว๘"
-
-#: ../fileio.c:672
-msgid "Nvim: Reading from stdin...\n"
-msgstr "Vim: ดำฑ๊ืผสไศ๋ถมศก...\n"
-
-#. Re-opening the original file failed!
-#: ../fileio.c:909
-msgid "E202: Conversion made file unreadable!"
-msgstr "E202: ืชปปตผึยฮฤผฒปฟษถม"
-
-#. fifo or socket
-#: ../fileio.c:1782
-msgid "[fifo/socket]"
-msgstr "[fifo/socket]"
-
-#. fifo
-#: ../fileio.c:1788
-msgid "[fifo]"
-msgstr "[fifo]"
-
-#. or socket
-#: ../fileio.c:1794
-msgid "[socket]"
-msgstr "[socket]"
-
-#. or character special
-#: ../fileio.c:1801
-#, fuzzy
-msgid "[character special]"
-msgstr "1 ธ๖ืึท๛"
-
-#: ../fileio.c:1815
-msgid "[CR missing]"
-msgstr "[ศฑษู CR]'"
-
-#: ../fileio.c:1819
-msgid "[long lines split]"
-msgstr "[ณคะะทึธ๎]"
-
-#: ../fileio.c:1823 ../fileio.c:3512
-msgid "[NOT converted]"
-msgstr "[ฮดืชปป]"
-
-#: ../fileio.c:1826 ../fileio.c:3515
-msgid "[converted]"
-msgstr "[าัืชปป]"
-
-#: ../fileio.c:1831
-#, c-format
-msgid "[CONVERSION ERROR in line %<PRId64>]"
-msgstr "[ตฺ %<PRId64> ะะืชปปดํฮ๓]"
-
-#: ../fileio.c:1835
-#, c-format
-msgid "[ILLEGAL BYTE in line %<PRId64>]"
-msgstr "[ตฺ %<PRId64> ะะฮะงืึท๛]"
-
-#: ../fileio.c:1838
-msgid "[READ ERRORS]"
-msgstr "[ถมดํฮ๓]"
-
-#: ../fileio.c:2104
-msgid "Can't find temp file for conversion"
-msgstr "ีาฒปตฝำรำฺืชปปตฤมูสฑฮฤผ"
-
-#: ../fileio.c:2110
-msgid "Conversion with 'charconvert' failed"
-msgstr "'charconvert' ืชปปสงฐ"
-
-#: ../fileio.c:2113
-msgid "can't read output of 'charconvert'"
-msgstr "ฮทจถมศก 'charconvert' ตฤสไณ๖"
-
-#: ../fileio.c:2437
-msgid "E676: No matching autocommands for acwrite buffer"
-msgstr "E676: ีาฒปตฝ acwrite ปบณๅว๘ถิำฆตฤืิถฏรม๎"
-
-#: ../fileio.c:2466
-msgid "E203: Autocommands deleted or unloaded buffer to be written"
-msgstr "E203: ืิถฏรม๎ษพณป๒สอทลมหาชะดศ๋ตฤปบณๅว๘"
-
-#: ../fileio.c:2486
-msgid "E204: Autocommand changed number of lines in unexpected way"
-msgstr "E204: ืิถฏรม๎าโอโตุธฤฑไมหะะส"
-
-#: ../fileio.c:2548 ../fileio.c:2565
-msgid "is not a file or writable device"
-msgstr "ฒปสวฮฤผป๒ฟษะดตฤษ่ฑธ"
-
-#: ../fileio.c:2601
-msgid "is read-only (add ! to override)"
-msgstr "ึปถม (ว๋ผำ ! วฟึฦึดะะ)"
-
-#: ../fileio.c:2886
-msgid "E506: Can't write to backup file (add ! to override)"
-msgstr "E506: ฮทจะดศ๋ฑธทฮฤผ (ว๋ผำ ! วฟึฦึดะะ)"
-
-#: ../fileio.c:2898
-msgid "E507: Close error for backup file (add ! to override)"
-msgstr "E507: นุฑีฑธทฮฤผณ๖ดํ (ว๋ผำ ! วฟึฦึดะะ)"
-
-#: ../fileio.c:2901
-msgid "E508: Can't read file for backup (add ! to override)"
-msgstr "E508: ฮทจถมศกฮฤผาินฉฑธท (ว๋ผำ ! วฟึฦึดะะ)"
-
-#: ../fileio.c:2923
-msgid "E509: Cannot create backup file (add ! to override)"
-msgstr "E509: ฮทจดดฝจฑธทฮฤผ (ว๋ผำ ! วฟึฦึดะะ)"
-
-#: ../fileio.c:3008
-msgid "E510: Can't make backup file (add ! to override)"
-msgstr "E510: ฮทจษ๚ณษฑธทฮฤผ (ว๋ผำ ! วฟึฦึดะะ)"
-
-#. Can't write without a tempfile!
-#: ../fileio.c:3121
-msgid "E214: Can't find temp file for writing"
-msgstr "E214: ีาฒปตฝำรำฺะดศ๋ตฤมูสฑฮฤผ"
-
-#: ../fileio.c:3134
-msgid "E213: Cannot convert (add ! to write without conversion)"
-msgstr "E213: ฮทจืชปป (ว๋ผำ ! วฟึฦฒปืชปปะดศ๋)"
-
-#: ../fileio.c:3169
-msgid "E166: Can't open linked file for writing"
-msgstr "E166: ฮทจด๒ฟชฒขะดศ๋มดฝำฮฤผ"
-
-#: ../fileio.c:3173
-msgid "E212: Can't open file for writing"
-msgstr "E212: ฮทจด๒ฟชฒขะดศ๋ฮฤผ"
-
-#: ../fileio.c:3363
-msgid "E667: Fsync failed"
-msgstr "E667: อฌฒฝสงฐ"
-
-#: ../fileio.c:3398
-msgid "E512: Close failed"
-msgstr "E512: นุฑีสงฐ"
-
-#: ../fileio.c:3436
-msgid "E513: write error, conversion failed (make 'fenc' empty to override)"
-msgstr "E513: ะดศ๋ดํฮ๓ฃฌืชปปสงฐ (ว๋ฝซ 'fenc' ึรฟีาิวฟึฦึดะะ)"
-
-#: ../fileio.c:3441
-#, fuzzy, c-format
-msgid ""
-"E513: write error, conversion failed in line %<PRId64> (make 'fenc' empty to "
-"override)"
-msgstr "E513: ะดศ๋ดํฮ๓ฃฌืชปปสงฐ (ว๋ฝซ 'fenc' ึรฟีาิวฟึฦึดะะ)"
-
-#: ../fileio.c:3448
-msgid "E514: write error (file system full?)"
-msgstr "E514: ะดศ๋ดํฮ๓ (ฮฤผฯตอณาัย๚ฃฟ)"
-
-#: ../fileio.c:3506
-msgid " CONVERSION ERROR"
-msgstr " ืชปปดํฮ๓"
-
-#: ../fileio.c:3509
-#, fuzzy, c-format
-msgid " in line %<PRId64>;"
-msgstr "ตฺ %<PRId64> ะะ"
-
-#: ../fileio.c:3519
-msgid "[Device]"
-msgstr "[ษ่ฑธ]"
-
-#: ../fileio.c:3522
-msgid "[New]"
-msgstr "[ะย]"
-
-#: ../fileio.c:3535
-msgid " [a]"
-msgstr " [a]"
-
-#: ../fileio.c:3535
-msgid " appended"
-msgstr " าัืทผำ"
-
-#: ../fileio.c:3537
-msgid " [w]"
-msgstr " [w]"
-
-#: ../fileio.c:3537
-msgid " written"
-msgstr " าัะดศ๋"
-
-#: ../fileio.c:3579
-msgid "E205: Patchmode: can't save original file"
-msgstr "E205: Patchmode: ฮทจฑฃดๆิญสผฮฤผ"
-
-#: ../fileio.c:3602
-msgid "E206: patchmode: can't touch empty original file"
-msgstr "E206: Patchmode: ฮทจษ๚ณษฟีตฤิญสผฮฤผ"
-
-#: ../fileio.c:3616
-msgid "E207: Can't delete backup file"
-msgstr "E207: ฮทจษพณฑธทฮฤผ"
-
-#: ../fileio.c:3672
-msgid ""
-"\n"
-"WARNING: Original file may be lost or damaged\n"
-msgstr ""
-"\n"
-"พฏธๆ: ิญสผฮฤผฟษฤาัถชสงป๒ห๐ปต\n"
-
-#: ../fileio.c:3675
-msgid "don't quit the editor until the file is successfully written!"
-msgstr "ิฺฮฤผีศทะดศ๋วฐว๋ฮ๐อหณ๖ฑเผญฦ๗ฃก"
-
-#: ../fileio.c:3795
-msgid "[dos]"
-msgstr "[dos]"
-
-#: ../fileio.c:3795
-msgid "[dos format]"
-msgstr "[dos ธ๑สฝ]"
-
-#: ../fileio.c:3801
-msgid "[mac]"
-msgstr "[mac]"
-
-#: ../fileio.c:3801
-msgid "[mac format]"
-msgstr "[mac ธ๑สฝ]"
-
-#: ../fileio.c:3807
-msgid "[unix]"
-msgstr "[unix]"
-
-#: ../fileio.c:3807
-msgid "[unix format]"
-msgstr "[unix ธ๑สฝ]"
-
-#: ../fileio.c:3831
-msgid "1 line, "
-msgstr "1 ะะฃฌ"
-
-#: ../fileio.c:3833
-#, c-format
-msgid "%<PRId64> lines, "
-msgstr "%<PRId64> ะะฃฌ"
-
-#: ../fileio.c:3836
-msgid "1 character"
-msgstr "1 ธ๖ืึท๛"
-
-#: ../fileio.c:3838
-#, c-format
-msgid "%<PRId64> characters"
-msgstr "%<PRId64> ธ๖ืึท๛"
-
-#: ../fileio.c:3849
-msgid "[noeol]"
-msgstr "[noeol]"
-
-#: ../fileio.c:3849
-msgid "[Incomplete last line]"
-msgstr "[ื๎บ๓าปะะฒปอ๊ี๛]"
-
-#. don't overwrite messages here
-#. must give this prompt
-#. don't use emsg() here, don't want to flush the buffers
-#: ../fileio.c:3865
-msgid "WARNING: The file has been changed since reading it!!!"
-msgstr "พฏธๆ: ดหฮฤผืิถมศ๋บ๓าัทขษ๚ฑไถฏฃกฃกฃก"
-
-#: ../fileio.c:3867
-msgid "Do you really want to write to it"
-msgstr "ศทสตาชะดศ๋ย๐"
-
-#: ../fileio.c:4648
-#, c-format
-msgid "E208: Error writing to \"%s\""
-msgstr "E208: ะดศ๋ฮฤผ \"%s\" ณ๖ดํ"
-
-#: ../fileio.c:4655
-#, c-format
-msgid "E209: Error closing \"%s\""
-msgstr "E209: นุฑีฮฤผ \"%s\" ณ๖ดํ"
-
-#: ../fileio.c:4657
-#, c-format
-msgid "E210: Error reading \"%s\""
-msgstr "E210: ถมศกฮฤผ \"%s\" ณ๖ดํ"
-
-#: ../fileio.c:4883
-msgid "E246: FileChangedShell autocommand deleted buffer"
-msgstr "E246: FileChangedShell ืิถฏรม๎ษพณมหปบณๅว๘"
-
-#: ../fileio.c:4894
-#, c-format
-msgid "E211: File \"%s\" no longer available"
-msgstr "E211: ฮฤผ \"%s\" าัพญฒปดๆิฺ"
-
-#: ../fileio.c:4906
-#, c-format
-msgid ""
-"W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as "
-"well"
-msgstr "W12: พฏธๆ: ฮฤผ \"%s\" าัฑไถฏฃฌฒขวาิฺ Vim ึะตฤปบณๅว๘าฒาัฑไถฏ"
-
-#: ../fileio.c:4907
-msgid "See \":help W12\" for more info."
-msgstr "ฝ๘าปฒฝหตร๗ว๋ผ๛ \":help W12\""
-
-#: ../fileio.c:4910
-#, c-format
-msgid "W11: Warning: File \"%s\" has changed since editing started"
-msgstr "W11: พฏธๆ: ฑเผญฟชสผบ๓ฃฌฮฤผ \"%s\" าัฑไถฏ"
-
-#: ../fileio.c:4911
-msgid "See \":help W11\" for more info."
-msgstr "ฝ๘าปฒฝหตร๗ว๋ผ๛ \":help W11\""
-
-#: ../fileio.c:4914
-#, c-format
-msgid "W16: Warning: Mode of file \"%s\" has changed since editing started"
-msgstr "W16: พฏธๆ: ฑเผญฟชสผบ๓ฃฌฮฤผ \"%s\" ตฤฤฃสฝาัฑไถฏ"
-
-#: ../fileio.c:4915
-msgid "See \":help W16\" for more info."
-msgstr "ฝ๘าปฒฝหตร๗ว๋ผ๛ \":help W16\""
-
-#: ../fileio.c:4927
-#, c-format
-msgid "W13: Warning: File \"%s\" has been created after editing started"
-msgstr "W13: พฏธๆ: ฑเผญฟชสผบ๓ฃฌฮฤผ \"%s\" าัฑปดดฝจ"
-
-#: ../fileio.c:4947
-msgid "Warning"
-msgstr "พฏธๆ"
-
-#: ../fileio.c:4948
-msgid ""
-"&OK\n"
-"&Load File"
-msgstr ""
-"ศทถจ(&O)\n"
-"ผำิุฮฤผ(&L)"
-
-#: ../fileio.c:5065
-#, c-format
-msgid "E462: Could not prepare for reloading \"%s\""
-msgstr "E462: ฮทจฮชึุะยผำิุ \"%s\" ื๖ืผฑธ"
-
-#: ../fileio.c:5078
-#, c-format
-msgid "E321: Could not reload \"%s\""
-msgstr "E321: ฮทจึุะยผำิุ \"%s\""
-
-#: ../fileio.c:5601
-msgid "--Deleted--"
-msgstr "--าัษพณ--"
-
-#: ../fileio.c:5732
-#, c-format
-msgid "auto-removing autocommand: %s <buffer=%d>"
-msgstr ""
-
-#. the group doesn't exist
-#: ../fileio.c:5772
-#, c-format
-msgid "E367: No such group: \"%s\""
-msgstr "E367: ฮดหื้: \"%s\""
-
-#: ../fileio.c:5897
-#, c-format
-msgid "E215: Illegal character after *: %s"
-msgstr "E215: * บ๓รๆำะฮะงืึท๛: %s"
-
-#: ../fileio.c:5905
-#, c-format
-msgid "E216: No such event: %s"
-msgstr "E216: ฮดหสยผ: %s"
-
-#: ../fileio.c:5907
-#, c-format
-msgid "E216: No such group or event: %s"
-msgstr "E216: ฮดหื้ป๒สยผ: %s"
-
-#. Highlight title
-#: ../fileio.c:6090
-msgid ""
-"\n"
-"--- Auto-Commands ---"
-msgstr ""
-"\n"
-"--- ืิถฏรม๎ ---"
-
-#: ../fileio.c:6293
-#, c-format
-msgid "E680: <buffer=%d>: invalid buffer number "
-msgstr "E680: <buffer=%d>: ฮะงตฤปบณๅว๘บล "
-
-#: ../fileio.c:6370
-msgid "E217: Can't execute autocommands for ALL events"
-msgstr "E217: ฒปฤถิห๙ำะสยผึดะะืิถฏรม๎"
-
-#: ../fileio.c:6393
-msgid "No matching autocommands"
-msgstr "รปำะฦฅลไตฤืิถฏรม๎"
-
-#: ../fileio.c:6831
-msgid "E218: autocommand nesting too deep"
-msgstr "E218: ืิถฏรม๎วถฬืฒใสนษ๎"
-
-#: ../fileio.c:7143
-#, c-format
-msgid "%s Auto commands for \"%s\""
-msgstr "%s ืิถฏรม๎ \"%s\""
-
-#: ../fileio.c:7149
-#, c-format
-msgid "Executing %s"
-msgstr "ึดะะ %s"
-
-#: ../fileio.c:7211
-#, c-format
-msgid "autocommand %s"
-msgstr "ืิถฏรม๎ %s"
-
-#: ../fileio.c:7795
-msgid "E219: Missing {."
-msgstr "E219: ศฑษู {กฃ"
-
-#: ../fileio.c:7797
-msgid "E220: Missing }."
-msgstr "E220: ศฑษู }กฃ"
-
-#: ../fold.c:93
-msgid "E490: No fold found"
-msgstr "E490: ีาฒปตฝีต"
-
-#: ../fold.c:544
-msgid "E350: Cannot create fold with current 'foldmethod'"
-msgstr "E350: ฒปฤิฺตฑวฐตฤ 'foldmethod' ฯยดดฝจีต"
-
-#: ../fold.c:546
-msgid "E351: Cannot delete fold with current 'foldmethod'"
-msgstr "E351: ฒปฤิฺตฑวฐตฤ 'foldmethod' ฯยษพณีต"
-
-#: ../fold.c:1784
-#, c-format
-msgid "+--%3ld lines folded "
-msgstr "+--าัีต %3ld ะะ"
-
-#. buffer has already been read
-#: ../getchar.c:273
-msgid "E222: Add to read buffer"
-msgstr "E222: ฬํผำตฝาัถมปบณๅว๘ึะ"
-
-#: ../getchar.c:2040
-msgid "E223: recursive mapping"
-msgstr "E223: ตน้ำณษไ"
-
-#: ../getchar.c:2849
-#, c-format
-msgid "E224: global abbreviation already exists for %s"
-msgstr "E224: ศซพึห๕ะด %s าัดๆิฺ"
-
-#: ../getchar.c:2852
-#, c-format
-msgid "E225: global mapping already exists for %s"
-msgstr "E225: ศซพึำณษไ %s าัดๆิฺ"
-
-#: ../getchar.c:2952
-#, c-format
-msgid "E226: abbreviation already exists for %s"
-msgstr "E226: ห๕ะด %s าัดๆิฺ"
-
-#: ../getchar.c:2955
-#, c-format
-msgid "E227: mapping already exists for %s"
-msgstr "E227: ำณษไ %s าัดๆิฺ"
-
-#: ../getchar.c:3008
-msgid "No abbreviation found"
-msgstr "ีาฒปตฝห๕ะด"
-
-#: ../getchar.c:3010
-msgid "No mapping found"
-msgstr "ีาฒปตฝำณษไ"
-
-#: ../getchar.c:3974
-msgid "E228: makemap: Illegal mode"
-msgstr "E228: makemap: ฮะงตฤฤฃสฝ"
-
-#. key value of 'cedit' option
-#. type of cmdline window or 0
-#. result of cmdline window or 0
-#: ../globals.h:924
-msgid "--No lines in buffer--"
-msgstr "--ปบณๅว๘ฮฤฺศ--"
-
-#.
-#. * The error messages that can be shared are included here.
-#. * Excluded are errors that are only used once and debugging messages.
-#.
-#: ../globals.h:996
-msgid "E470: Command aborted"
-msgstr "E470: รม๎ฑปึะึน"
-
-#: ../globals.h:997
-msgid "E471: Argument required"
-msgstr "E471: ะ่าชฒฮส"
-
-#: ../globals.h:998
-msgid "E10: \\ should be followed by /, ? or &"
-msgstr "E10: \\ บ๓รๆำฆธรธ๚ำะ /กข? ป๒ &"
-
-#: ../globals.h:1000
-msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
-msgstr "E11: ิฺรม๎ะะดฐฟฺึะฮะงฃป<CR> ึดะะฃฌCTRL-C อหณ๖"
-
-#: ../globals.h:1002
-msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
-msgstr "E12: ตฑวฐฤฟยผึะตฤ exrc/vimrc ป๒ tag ฒ้ีาึะฒปิสะํดหรม๎"
-
-#: ../globals.h:1003
-msgid "E171: Missing :endif"
-msgstr "E171: ศฑษู :endif"
-
-#: ../globals.h:1004
-msgid "E600: Missing :endtry"
-msgstr "E600: ศฑษู :endtry"
-
-#: ../globals.h:1005
-msgid "E170: Missing :endwhile"
-msgstr "E170: ศฑษู :endwhile"
-
-#: ../globals.h:1006
-msgid "E170: Missing :endfor"
-msgstr "E170: ศฑษู :endfor"
-
-#: ../globals.h:1007
-msgid "E588: :endwhile without :while"
-msgstr "E588: :endwhile ศฑษูถิำฆตฤ :while"
-
-#: ../globals.h:1008
-msgid "E588: :endfor without :for"
-msgstr "E588: :endfor ศฑษูถิำฆตฤ :for"
-
-#: ../globals.h:1009
-msgid "E13: File exists (add ! to override)"
-msgstr "E13: ฮฤผาัดๆิฺ (ว๋ผำ ! วฟึฦึดะะ)"
-
-#: ../globals.h:1010
-msgid "E472: Command failed"
-msgstr "E472: รม๎ึดะะสงฐ"
-
-#: ../globals.h:1011
-msgid "E473: Internal error"
-msgstr "E473: ฤฺฒฟดํฮ๓"
-
-#: ../globals.h:1012
-msgid "Interrupted"
-msgstr "าัึะถฯ"
-
-#: ../globals.h:1013
-msgid "E14: Invalid address"
-msgstr "E14: ฮะงตฤตุึท"
-
-#: ../globals.h:1014
-msgid "E474: Invalid argument"
-msgstr "E474: ฮะงตฤฒฮส"
-
-#: ../globals.h:1015
-#, c-format
-msgid "E475: Invalid argument: %s"
-msgstr "E475: ฮะงตฤฒฮส: %s"
-
-#: ../globals.h:1016
-#, c-format
-msgid "E15: Invalid expression: %s"
-msgstr "E15: ฮะงตฤฑํด๏สฝ: %s"
-
-#: ../globals.h:1017
-msgid "E16: Invalid range"
-msgstr "E16: ฮะงตฤทถฮง"
-
-#: ../globals.h:1018
-msgid "E476: Invalid command"
-msgstr "E476: ฮะงตฤรม๎"
-
-#: ../globals.h:1019
-#, c-format
-msgid "E17: \"%s\" is a directory"
-msgstr "E17: \"%s\" สวฤฟยผ"
-
-#: ../globals.h:1020
-#, fuzzy
-msgid "E900: Invalid job id"
-msgstr "E49: ฮะงตฤน๖ถฏด๓ะก"
-
-#: ../globals.h:1021
-msgid "E901: Job table is full"
-msgstr ""
-
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
-#: ../globals.h:1024
-#, c-format
-msgid "E364: Library call failed for \"%s()\""
-msgstr "E364: ต๗ำรบฏสฟโ \"%s()\" สงฐ"
-
-#: ../globals.h:1026
-msgid "E19: Mark has invalid line number"
-msgstr "E19: ฑ๊ผวตฤะะบลฮะง"
-
-#: ../globals.h:1027
-msgid "E20: Mark not set"
-msgstr "E20: รปำะษ่ถจฑ๊ผว"
-
-#: ../globals.h:1029
-msgid "E21: Cannot make changes, 'modifiable' is off"
-msgstr "E21: ฒปฤะธฤฃฌา๒ฮชักฯ๎ 'modifiable' สวนุตฤ"
-
-#: ../globals.h:1030
-msgid "E22: Scripts nested too deep"
-msgstr "E22: ฝลฑพวถฬืนษ๎"
-
-#: ../globals.h:1031
-msgid "E23: No alternate file"
-msgstr "E23: รปำะฝปฬๆฮฤผ"
-
-#: ../globals.h:1032
-msgid "E24: No such abbreviation"
-msgstr "E24: รปำะีโธ๖ห๕ะด"
-
-#: ../globals.h:1033
-msgid "E477: No ! allowed"
-msgstr "E477: ฒปฤสนำร \"!\""
-
-#: ../globals.h:1035
-msgid "E25: Nvim does not have a built-in GUI"
-msgstr "E25: ฮทจสนำรอผะฮฝ็รๆ: ฑเา๋สฑรปำะฦ๔ำร"
-
-#: ../globals.h:1036
-#, c-format
-msgid "E28: No such highlight group name: %s"
-msgstr "E28: รปำะีโธ๖ธ฿มมศบื้ร๛: %s"
-
-#: ../globals.h:1037
-msgid "E29: No inserted text yet"
-msgstr "E29: รปำะฒๅศ๋นฮฤืึ"
-
-#: ../globals.h:1038
-msgid "E30: No previous command line"
-msgstr "E30: รปำะวฐาปธ๖รม๎ะะ"
-
-#: ../globals.h:1039
-msgid "E31: No such mapping"
-msgstr "E31: รปำะีโธ๖ำณษไ"
-
-#: ../globals.h:1040
-msgid "E479: No match"
-msgstr "E479: รปำะฦฅลไ"
-
-#: ../globals.h:1041
-#, c-format
-msgid "E480: No match: %s"
-msgstr "E480: รปำะฦฅลไ: %s"
-
-#: ../globals.h:1042
-msgid "E32: No file name"
-msgstr "E32: รปำะฮฤผร๛"
-
-#: ../globals.h:1044
-msgid "E33: No previous substitute regular expression"
-msgstr "E33: รปำะวฐาปธ๖ฬๆปปีิ๒ฑํด๏สฝ"
-
-#: ../globals.h:1045
-msgid "E34: No previous command"
-msgstr "E34: รปำะวฐาปธ๖รม๎"
-
-#: ../globals.h:1046
-msgid "E35: No previous regular expression"
-msgstr "E35: รปำะวฐาปธ๖ีิ๒ฑํด๏สฝ"
-
-#: ../globals.h:1047
-msgid "E481: No range allowed"
-msgstr "E481: ฒปฤสนำรทถฮง"
-
-#: ../globals.h:1048
-msgid "E36: Not enough room"
-msgstr "E36: รปำะืในปตฤฟีผไ"
-
-#: ../globals.h:1049
-#, c-format
-msgid "E482: Can't create file %s"
-msgstr "E482: ฮทจดดฝจฮฤผ %s"
-
-#: ../globals.h:1050
-msgid "E483: Can't get temp file name"
-msgstr "E483: ฮทจป๑ศกมูสฑฮฤผร๛"
-
-#: ../globals.h:1051
-#, c-format
-msgid "E484: Can't open file %s"
-msgstr "E484: ฮทจด๒ฟชฮฤผ %s"
-
-#: ../globals.h:1052
-#, c-format
-msgid "E485: Can't read file %s"
-msgstr "E485: ฮทจถมศกฮฤผ %s"
-
-#: ../globals.h:1054
-msgid "E37: No write since last change (add ! to override)"
-msgstr "E37: าัะธฤตซษะฮดฑฃดๆ (ฟษำร ! วฟึฦึดะะ)"
-
-#: ../globals.h:1055
-#, fuzzy
-msgid "E37: No write since last change"
-msgstr "[าัะธฤตซษะฮดฑฃดๆ]\n"
-
-#: ../globals.h:1056
-msgid "E38: Null argument"
-msgstr "E38: ฟีตฤฒฮส"
-
-#: ../globals.h:1057
-msgid "E39: Number expected"
-msgstr "E39: ดหดฆะ่าชสืึ"
-
-#: ../globals.h:1058
-#, c-format
-msgid "E40: Can't open errorfile %s"
-msgstr "E40: ฮทจด๒ฟชดํฮ๓ฮฤผ %s"
-
-#: ../globals.h:1059
-msgid "E41: Out of memory!"
-msgstr "E41: ฤฺดๆฒปืใฃก"
-
-#: ../globals.h:1060
-msgid "Pattern not found"
-msgstr "ีาฒปตฝฤฃสฝ"
-
-#: ../globals.h:1061
-#, c-format
-msgid "E486: Pattern not found: %s"
-msgstr "E486: ีาฒปตฝฤฃสฝ: %s"
-
-#: ../globals.h:1062
-msgid "E487: Argument must be positive"
-msgstr "E487: ฒฮสฑุะ๋สวีส"
-
-#: ../globals.h:1064
-msgid "E459: Cannot go back to previous directory"
-msgstr "E459: ฮทจปุตฝวฐาปธ๖ฤฟยผ"
-
-#: ../globals.h:1066
-msgid "E42: No Errors"
-msgstr "E42: รปำะดํฮ๓"
-
-#: ../globals.h:1067
-msgid "E776: No location list"
-msgstr "E776: รปำะ location มะฑํ"
-
-#: ../globals.h:1068
-msgid "E43: Damaged match string"
-msgstr "E43: าัห๐ปตตฤฦฅลไืึท๛ดฎ"
-
-#: ../globals.h:1069
-msgid "E44: Corrupted regexp program"
-msgstr "E44: าัห๐ปตตฤีิ๒ฑํด๏สฝณฬะ๒"
-
-#: ../globals.h:1071
-msgid "E45: 'readonly' option is set (add ! to override)"
-msgstr "E45: าัษ่ถจักฯ๎ 'readonly' (ว๋ผำ ! วฟึฦึดะะ)"
-
-#: ../globals.h:1073
-#, c-format
-msgid "E46: Cannot change read-only variable \"%s\""
-msgstr "E46: ฒปฤธฤฑไึปถมฑไมฟ \"%s\""
-
-#: ../globals.h:1075
-#, fuzzy, c-format
-msgid "E794: Cannot set variable in the sandbox: \"%s\""
-msgstr "E46: ฒปฤิฺ sandbox ึะษ่ถจฑไมฟ: \"%s\""
-
-#: ../globals.h:1076
-msgid "E47: Error while reading errorfile"
-msgstr "E47: ถมศกดํฮ๓ฮฤผสงฐ"
-
-#: ../globals.h:1078
-msgid "E48: Not allowed in sandbox"
-msgstr "E48: ฒปิสะํิฺ sandbox ึะสนำร"
-
-#: ../globals.h:1080
-msgid "E523: Not allowed here"
-msgstr "E523: ฒปิสะํิฺดหสนำร"
-
-#: ../globals.h:1082
-msgid "E359: Screen mode setting not supported"
-msgstr "E359: ฒปึงณึษ่ถจฦมฤปฤฃสฝ"
-
-#: ../globals.h:1083
-msgid "E49: Invalid scroll size"
-msgstr "E49: ฮะงตฤน๖ถฏด๓ะก"
-
-#: ../globals.h:1084
-msgid "E91: 'shell' option is empty"
-msgstr "E91: ักฯ๎ 'shell' ฮชฟี"
-
-#: ../globals.h:1085
-msgid "E255: Couldn't read in sign data!"
-msgstr "E255: ฮทจถมศก sign สพฃก"
-
-#: ../globals.h:1086
-msgid "E72: Close error on swap file"
-msgstr "E72: ฝปปปฮฤผนุฑีดํฮ๓"
-
-#: ../globals.h:1087
-msgid "E73: tag stack empty"
-msgstr "E73: tag ถัีปฮชฟี"
-
-#: ../globals.h:1088
-msgid "E74: Command too complex"
-msgstr "E74: รม๎นธดิำ"
-
-#: ../globals.h:1089
-msgid "E75: Name too long"
-msgstr "E75: ร๛ืึนณค"
-
-#: ../globals.h:1090
-msgid "E76: Too many ["
-msgstr "E76: [ นถเ"
-
-#: ../globals.h:1091
-msgid "E77: Too many file names"
-msgstr "E77: ฮฤผร๛นถเ"
-
-#: ../globals.h:1092
-msgid "E488: Trailing characters"
-msgstr "E488: ถเำเตฤฮฒฒฟืึท๛"
-
-#: ../globals.h:1093
-msgid "E78: Unknown mark"
-msgstr "E78: ฮดึชตฤฑ๊ผว"
-
-#: ../globals.h:1094
-msgid "E79: Cannot expand wildcards"
-msgstr "E79: ฮทจภฉีนอจลไท๛"
-
-#: ../globals.h:1096
-msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
-msgstr "E591: 'winheight' ฒปฤะกำฺ 'winminheight'"
-
-#: ../globals.h:1098
-msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
-msgstr "E592: 'winwidth' ฒปฤะกำฺ 'winminwidth'"
-
-#: ../globals.h:1099
-msgid "E80: Error while writing"
-msgstr "E80: ะดศ๋ณ๖ดํ"
-
-#: ../globals.h:1100
-msgid "Zero count"
-msgstr "ผฦสฮชมใ"
-
-#: ../globals.h:1101
-msgid "E81: Using <SID> not in a script context"
-msgstr "E81: ิฺฝลฑพปทพณอโสนำรมห <SID>"
-
-#: ../globals.h:1102
-#, c-format
-msgid "E685: Internal error: %s"
-msgstr "E685: ฤฺฒฟดํฮ๓: %s"
-
-#: ../globals.h:1104
-msgid "E363: pattern uses more memory than 'maxmempattern'"
-msgstr "E363: ฑํด๏สฝตฤฤฺดๆสนำรณฌณ๖ 'maxmempattern'"
-
-#: ../globals.h:1105
-msgid "E749: empty buffer"
-msgstr "E749: ฟีตฤปบณๅว๘"
-
-#: ../globals.h:1108
-msgid "E682: Invalid search pattern or delimiter"
-msgstr "E682: ฮะงตฤหัห๗ฑํด๏สฝป๒ทึธ๔ท๛"
-
-#: ../globals.h:1109
-msgid "E139: File is loaded in another buffer"
-msgstr "E139: ฮฤผาัิฺมําปธ๖ปบณๅว๘ึะฑปผำิุ"
-
-#: ../globals.h:1110
-#, c-format
-msgid "E764: Option '%s' is not set"
-msgstr "E764: รปำะษ่ถจักฯ๎ '%s'"
-
-#: ../globals.h:1111
-#, fuzzy
-msgid "E850: Invalid register name"
-msgstr "E354: ฮะงตฤผฤดๆฦ๗ร๛: '%s'"
-
-#: ../globals.h:1114
-msgid "search hit TOP, continuing at BOTTOM"
-msgstr "าัฒ้ีาตฝฮฤผฟชอทฃฌิูดำฝแฮฒผฬะ๘ฒ้ีา"
-
-#: ../globals.h:1115
-msgid "search hit BOTTOM, continuing at TOP"
-msgstr "าัฒ้ีาตฝฮฤผฝแฮฒฃฌิูดำฟชอทผฬะ๘ฒ้ีา"
-
-#: ../hardcopy.c:240
-msgid "E550: Missing colon"
-msgstr "E550: ศฑษูรฐบล"
-
-#: ../hardcopy.c:252
-msgid "E551: Illegal component"
-msgstr "E551: ฮะงตฤฒฟทึ"
-
-#: ../hardcopy.c:259
-msgid "E552: digit expected"
-msgstr "E552: ำฆธราชำะสืึ"
-
-#: ../hardcopy.c:473
-#, c-format
-msgid "Page %d"
-msgstr "ตฺ %d าณ"
-
-#: ../hardcopy.c:597
-msgid "No text to be printed"
-msgstr "รปำะาชด๒ำกตฤฮฤืึ"
-
-#: ../hardcopy.c:668
-#, c-format
-msgid "Printing page %d (%d%%)"
-msgstr "ีิฺด๒ำกตฺ %d าณ (%d%%)"
-
-#: ../hardcopy.c:680
-#, c-format
-msgid " Copy %d of %d"
-msgstr "ธดึฦ %d / %d"
-
-#: ../hardcopy.c:733
-#, c-format
-msgid "Printed: %s"
-msgstr "าัด๒ำก: %s"
-
-#: ../hardcopy.c:740
-msgid "Printing aborted"
-msgstr "ด๒ำกึะึน"
-
-#: ../hardcopy.c:1365
-msgid "E455: Error writing to PostScript output file"
-msgstr "E455: ะดศ๋ PostScript สไณ๖ฮฤผณ๖ดํ"
-
-#: ../hardcopy.c:1747
-#, c-format
-msgid "E624: Can't open file \"%s\""
-msgstr "E624: ฮทจด๒ฟชฮฤผ \"%s\""
-
-#: ../hardcopy.c:1756 ../hardcopy.c:2470
-#, c-format
-msgid "E457: Can't read PostScript resource file \"%s\""
-msgstr "E457: ฮทจถมศก PostScript ืสิดฮฤผ \"%s\""
-
-#: ../hardcopy.c:1772
-#, c-format
-msgid "E618: file \"%s\" is not a PostScript resource file"
-msgstr "E618: ฮฤผ \"%s\" ฒปสว PostScript ืสิดฮฤผ"
-
-#: ../hardcopy.c:1788 ../hardcopy.c:1805 ../hardcopy.c:1844
-#, c-format
-msgid "E619: file \"%s\" is not a supported PostScript resource file"
-msgstr "E619: ฮฤผ \"%s\" ฒปสวาัึงณึตฤ PostScript ืสิดฮฤผ"
-
-#: ../hardcopy.c:1856
-#, c-format
-msgid "E621: \"%s\" resource file has wrong version"
-msgstr "E621: \"%s\" ืสิดฮฤผฐๆฑพฒปีศท"
-
-#: ../hardcopy.c:2225
-msgid "E673: Incompatible multi-byte encoding and character set."
-msgstr "E673: ฒปผๆศตฤถเืึฝฺฑเย๋บอืึท๛ผฏกฃ"
-
-#: ../hardcopy.c:2238
-msgid "E674: printmbcharset cannot be empty with multi-byte encoding."
-msgstr "E674: printmbcharset ิฺถเืึฝฺฑเย๋ฯยฒปฤฮชฟีกฃ"
-
-#: ../hardcopy.c:2254
-msgid "E675: No default font specified for multi-byte printing."
-msgstr "E675: รปำะึธถจถเืึฝฺด๒ำกตฤฤฌศฯืึฬๅกฃ"
-
-#: ../hardcopy.c:2426
-msgid "E324: Can't open PostScript output file"
-msgstr "E324: ฮทจด๒ฟช PostScript สไณ๖ฮฤผ"
-
-#: ../hardcopy.c:2458
-#, c-format
-msgid "E456: Can't open file \"%s\""
-msgstr "E456: ฮทจด๒ฟชฮฤผ \"%s\""
-
-#: ../hardcopy.c:2583
-msgid "E456: Can't find PostScript resource file \"prolog.ps\""
-msgstr "E456: ีาฒปตฝ PostScript ืสิดฮฤผ \"prolog.ps\""
-
-#: ../hardcopy.c:2593
-msgid "E456: Can't find PostScript resource file \"cidfont.ps\""
-msgstr "E456: ีาฒปตฝ PostScript ืสิดฮฤผ \"cidfont.ps\""
-
-#: ../hardcopy.c:2622 ../hardcopy.c:2639 ../hardcopy.c:2665
-#, c-format
-msgid "E456: Can't find PostScript resource file \"%s.ps\""
-msgstr "E456: ีาฒปตฝ PostScript ืสิดฮฤผ \"%s.ps\""
-
-#: ../hardcopy.c:2654
-#, c-format
-msgid "E620: Unable to convert to print encoding \"%s\""
-msgstr "E620: ฮทจืชปปึมด๒ำกฑเย๋ \"%s\""
-
-#: ../hardcopy.c:2877
-msgid "Sending to printer..."
-msgstr "ทขหอตฝด๒ำกป๚กญกญ"
-
-#: ../hardcopy.c:2881
-msgid "E365: Failed to print PostScript file"
-msgstr "E365: ฮทจด๒ำก PostScript ฮฤผ"
-
-#: ../hardcopy.c:2883
-msgid "Print job sent."
-msgstr "ด๒ำกศฮฮ๑าัฑปทขหอกฃ"
-
-#: ../if_cscope.c:85
-msgid "Add a new database"
-msgstr "ฬํผำาปธ๖ะยตฤสพฟโ"
-
-#: ../if_cscope.c:87
-msgid "Query for a pattern"
-msgstr "ฒ้ัฏาปธ๖ฤฃสฝ"
-
-#: ../if_cscope.c:89
-msgid "Show this message"
-msgstr "ฯิสพดหะลฯข"
-
-#: ../if_cscope.c:91
-msgid "Kill a connection"
-msgstr "ฝแส๘าปธ๖มฌฝำ"
-
-#: ../if_cscope.c:93
-msgid "Reinit all connections"
-msgstr "ึุึรห๙ำะมฌฝำ"
-
-#: ../if_cscope.c:95
-msgid "Show connections"
-msgstr "ฯิสพมฌฝำ"
-
-#: ../if_cscope.c:101
-#, c-format
-msgid "E560: Usage: cs[cope] %s"
-msgstr "E560: ำรทจ: cs[cope] %s"
-
-#: ../if_cscope.c:225
-msgid "This cscope command does not support splitting the window.\n"
-msgstr "ีโธ๖ cscope รม๎ฒปึงณึทึธ๎ดฐฟฺกฃ\n"
-
-#: ../if_cscope.c:266
-msgid "E562: Usage: cstag <ident>"
-msgstr "E562: ำรทจ: cstag <ident>"
-
-#: ../if_cscope.c:313
-msgid "E257: cstag: tag not found"
-msgstr "E257: cstag: ีาฒปตฝ tag"
-
-#: ../if_cscope.c:461
-#, c-format
-msgid "E563: stat(%s) error: %d"
-msgstr "E563: stat(%s) ดํฮ๓: %d"
-
-#: ../if_cscope.c:551
-#, c-format
-msgid "E564: %s is not a directory or a valid cscope database"
-msgstr "E564: %s ฒปสวฤฟยผป๒ำะะงตฤ cscope สพฟโ"
-
-#: ../if_cscope.c:566
-#, c-format
-msgid "Added cscope database %s"
-msgstr "ฬํผำมห cscope สพฟโ %s"
-
-#: ../if_cscope.c:616
-#, c-format
-msgid "E262: error reading cscope connection %<PRId64>"
-msgstr "E262: ถมศก cscope มฌฝำ %<PRId64> ณ๖ดํ"
-
-#: ../if_cscope.c:711
-msgid "E561: unknown cscope search type"
-msgstr "E561: ฮดึชตฤ cscope ฒ้ีาภเะอ"
-
-#: ../if_cscope.c:752 ../if_cscope.c:789
-msgid "E566: Could not create cscope pipes"
-msgstr "E566: ฮทจดดฝจ cscope นตภ"
-
-#: ../if_cscope.c:767
-msgid "E622: Could not fork for cscope"
-msgstr "E622: ฮทจถิ cscope ฝ๘ะะ fork"
-
-#: ../if_cscope.c:849
-#, fuzzy
-msgid "cs_create_connection setpgid failed"
-msgstr "cs_create_connection ึดะะสงฐ"
-
-#: ../if_cscope.c:853 ../if_cscope.c:889
-msgid "cs_create_connection exec failed"
-msgstr "cs_create_connection ึดะะสงฐ"
-
-#: ../if_cscope.c:863 ../if_cscope.c:902
-msgid "cs_create_connection: fdopen for to_fp failed"
-msgstr "cs_create_connection: fdopen to_fp สงฐ"
-
-#: ../if_cscope.c:865 ../if_cscope.c:906
-msgid "cs_create_connection: fdopen for fr_fp failed"
-msgstr "cs_create_connection: fdopen fr_fp สงฐ"
-
-#: ../if_cscope.c:890
-msgid "E623: Could not spawn cscope process"
-msgstr "E623: ฮทจษ๚ณษ cscope ฝ๘ณฬ"
-
-#: ../if_cscope.c:932
-msgid "E567: no cscope connections"
-msgstr "E567: รปำะ cscope มฌฝำ"
-
-#: ../if_cscope.c:1009
-#, c-format
-msgid "E469: invalid cscopequickfix flag %c for %c"
-msgstr "E469: cscopequickfix ฑ๊ึพ %c ถิ %c ฮะง"
-
-#: ../if_cscope.c:1058
-#, c-format
-msgid "E259: no matches found for cscope query %s of %s"
-msgstr "E259: cscope ฒ้ัฏ %s %s รปำะีาตฝฦฅลไตฤฝแน๛"
-
-#: ../if_cscope.c:1142
-msgid "cscope commands:\n"
-msgstr "cscope รม๎:\n"
-
-#: ../if_cscope.c:1150
-#, fuzzy, c-format
-msgid "%-5s: %s%*s (Usage: %s)"
-msgstr "%-5s: %-30s (ำรทจ: %s)"
-
-#: ../if_cscope.c:1155
-msgid ""
-"\n"
-" c: Find functions calling this function\n"
-" d: Find functions called by this function\n"
-" e: Find this egrep pattern\n"
-" f: Find this file\n"
-" g: Find this definition\n"
-" i: Find files #including this file\n"
-" s: Find this C symbol\n"
-" t: Find this text string\n"
-msgstr ""
-
-#: ../if_cscope.c:1226
-msgid "E568: duplicate cscope database not added"
-msgstr "E568: ึุธดตฤ cscope สพฟโฮดฑปผำศ๋"
-
-#: ../if_cscope.c:1335
-#, c-format
-msgid "E261: cscope connection %s not found"
-msgstr "E261: ีาฒปตฝ cscope มฌฝำ %s"
-
-#: ../if_cscope.c:1364
-#, c-format
-msgid "cscope connection %s closed"
-msgstr "cscope มฌฝำ %s าันุฑี"
-
-#. should not reach here
-#: ../if_cscope.c:1486
-msgid "E570: fatal error in cs_manage_matches"
-msgstr "E570: cs_manage_matches ัฯึุดํฮ๓"
-
-#: ../if_cscope.c:1693
-#, c-format
-msgid "Cscope tag: %s"
-msgstr "Cscope tag: %s"
-
-#: ../if_cscope.c:1711
-msgid ""
-"\n"
-" # line"
-msgstr ""
-"\n"
-" # ะะ "
-
-#: ../if_cscope.c:1713
-msgid "filename / context / line\n"
-msgstr "ฮฤผร๛ / ษฯฯยฮฤ / ะะ\n"
-
-#: ../if_cscope.c:1809
-#, c-format
-msgid "E609: Cscope error: %s"
-msgstr "E609: Cscope ดํฮ๓: %s"
-
-#: ../if_cscope.c:2053
-msgid "All cscope databases reset"
-msgstr "ห๙ำะ cscope สพฟโาัฑปึุึร"
-
-#: ../if_cscope.c:2123
-msgid "no cscope connections\n"
-msgstr "รปำะ cscope มฌฝำ\n"
-
-#: ../if_cscope.c:2126
-msgid " # pid database name prepend path\n"
-msgstr " # pid สพฟโร๛ prepend path\n"
-
-#: ../main.c:144
-msgid "Unknown option argument"
-msgstr "ฮดึชตฤักฯ๎ฒฮส"
-
-#: ../main.c:146
-msgid "Too many edit arguments"
-msgstr "ฑเผญฒฮสนถเ"
-
-#: ../main.c:148
-msgid "Argument missing after"
-msgstr "ศฑษูฑุาชตฤฒฮส"
-
-#: ../main.c:150
-msgid "Garbage after option argument"
-msgstr "ักฯ๎ฒฮสบ๓ตฤฤฺศฮะง"
-
-#: ../main.c:152
-msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"
-msgstr "\"+command\"กข\"-c command\" ป๒ \"--cmd command\" ฒฮสนถเ"
-
-#: ../main.c:154
-msgid "Invalid argument for"
-msgstr "ฮะงตฤฒฮส"
-
-#: ../main.c:294
-#, c-format
-msgid "%d files to edit\n"
-msgstr "ปนำะ %d ธ๖ฮฤผตศดฑเผญ\n"
-
-#: ../main.c:1342
-msgid "Attempt to open script file again: \""
-msgstr "สิอผิูดฮด๒ฟชฝลฑพฮฤผ: \""
-
-#: ../main.c:1350
-msgid "Cannot open for reading: \""
-msgstr "ฮทจด๒ฟชฒขถมศก: \""
-
-#: ../main.c:1393
-msgid "Cannot open for script output: \""
-msgstr "ฮทจด๒ฟชฒขสไณ๖ฝลฑพ: \""
-
-#: ../main.c:1622
-msgid "Vim: Warning: Output is not to a terminal\n"
-msgstr "Vim: พฏธๆ: สไณ๖ฒปสวตฝึีถห(ฦมฤป)\n"
-
-#: ../main.c:1624
-msgid "Vim: Warning: Input is not from a terminal\n"
-msgstr "Vim: พฏธๆ: สไศ๋ฒปสวภดืิึีถห(ผลฬ)\n"
-
-#. just in case..
-#: ../main.c:1891
-msgid "pre-vimrc command line"
-msgstr "pre-vimrc รม๎ะะ"
-
-#: ../main.c:1964
-#, c-format
-msgid "E282: Cannot read from \"%s\""
-msgstr "E282: ฮทจถมศก \"%s\""
-
-#: ../main.c:2149
-msgid ""
-"\n"
-"More info with: \"vim -h\"\n"
-msgstr ""
-"\n"
-"ธถเะลฯขว๋ผ๛: \"vim -h\"\n"
-
-#: ../main.c:2178
-msgid "[file ..] edit specified file(s)"
-msgstr "[ฮฤผ ..] ฑเผญึธถจตฤฮฤผ"
-
-#: ../main.c:2179
-msgid "- read text from stdin"
-msgstr "- ดำฑ๊ืผสไศ๋(stdin)ถมศกฮฤฑพ"
-
-#: ../main.c:2180
-msgid "-t tag edit file where tag is defined"
-msgstr "-t tag ฑเผญ tag ถจาๅดฆตฤฮฤผ"
-
-#: ../main.c:2181
-msgid "-q [errorfile] edit file with first error"
-msgstr "-q [errorfile] ฑเผญตฺาปธ๖ณ๖ดํดฆตฤฮฤผ"
-
-#: ../main.c:2187
-msgid ""
-"\n"
-"\n"
-"usage:"
-msgstr ""
-"\n"
-"\n"
-"ำรทจ:"
-
-#: ../main.c:2189
-msgid " vim [arguments] "
-msgstr " vim [ฒฮส] "
-
-#: ../main.c:2193
-msgid ""
-"\n"
-" or:"
-msgstr ""
-"\n"
-" ป๒:"
-
-#: ../main.c:2196
-msgid ""
-"\n"
-"\n"
-"Arguments:\n"
-msgstr ""
-"\n"
-"\n"
-"ฒฮส:\n"
-
-#: ../main.c:2197
-msgid "--\t\t\tOnly file names after this"
-msgstr "--\t\t\tิฺีโาิบ๓ึปำะฮฤผร๛"
-
-#: ../main.c:2199
-msgid "--literal\t\tDon't expand wildcards"
-msgstr "--literal\t\tฒปภฉีนอจลไท๛"
-
-#: ../main.c:2201
-msgid "-v\t\t\tVi mode (like \"vi\")"
-msgstr "-v\t\t\tVi ฤฃสฝ (อฌ \"vi\")"
-
-#: ../main.c:2202
-msgid "-e\t\t\tEx mode (like \"ex\")"
-msgstr "-e\t\t\tEx ฤฃสฝ (อฌ \"ex\")"
-
-#: ../main.c:2203
-msgid "-E\t\t\tImproved Ex mode"
-msgstr ""
-
-#: ../main.c:2204
-msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")"
-msgstr "-s\t\t\tฐฒพฒ(ล๚ดฆภํ)ฤฃสฝ (ึปฤำ๋ \"ex\" าปฦ๐สนำร)"
-
-#: ../main.c:2205
-msgid "-d\t\t\tDiff mode (like \"vimdiff\")"
-msgstr "-d\t\t\tDiff ฤฃสฝ (อฌ \"vimdiff\")"
-
-#: ../main.c:2206
-msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
-msgstr "-y\t\t\tศาืฤฃสฝ (อฌ \"evim\"ฃฌฮฤฃสฝ)"
-
-#: ../main.c:2207
-msgid "-R\t\t\tReadonly mode (like \"view\")"
-msgstr "-R\t\t\tึปถมฤฃสฝ (อฌ \"view\")"
-
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tฯึฦฤฃสฝ (อฌ \"rvim\")"
-
-#: ../main.c:2209
-msgid "-m\t\t\tModifications (writing files) not allowed"
-msgstr "-m\t\t\tฒปฟษะธฤ(ะดศ๋ฮฤผ)"
-
-#: ../main.c:2210
-msgid "-M\t\t\tModifications in text not allowed"
-msgstr "-M\t\t\tฮฤฑพฒปฟษะธฤ"
-
-#: ../main.c:2211
-msgid "-b\t\t\tBinary mode"
-msgstr "-b\t\t\tถฝ๘ึฦฤฃสฝ"
-
-#: ../main.c:2212
-msgid "-l\t\t\tLisp mode"
-msgstr "-l\t\t\tLisp ฤฃสฝ"
-
-#: ../main.c:2213
-msgid "-C\t\t\tCompatible with Vi: 'compatible'"
-msgstr "-C\t\t\tผๆศดซอณตฤ Vi: 'compatible'"
-
-#: ../main.c:2214
-msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'"
-msgstr "-N\t\t\tฒปอ๊ศซผๆศดซอณตฤ Vi: 'nocompatible'"
-
-#: ../main.c:2215
-msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]"
-msgstr ""
-
-#: ../main.c:2216
-msgid "-D\t\t\tDebugging mode"
-msgstr "-D\t\t\tต๗สิฤฃสฝ"
-
-#: ../main.c:2217
-msgid "-n\t\t\tNo swap file, use memory only"
-msgstr "-n\t\t\tฒปสนำรฝปปปฮฤผฃฌึปสนำรฤฺดๆ"
-
-#: ../main.c:2218
-msgid "-r\t\t\tList swap files and exit"
-msgstr "-r\t\t\tมะณ๖ฝปปปฮฤผฒขอหณ๖"
-
-#: ../main.c:2219
-msgid "-r (with file name)\tRecover crashed session"
-msgstr "-r (ธ๚ฮฤผร๛)\t\tปึธดฑภภฃตฤปแปฐ"
-
-#: ../main.c:2220
-msgid "-L\t\t\tSame as -r"
-msgstr "-L\t\t\tอฌ -r"
-
-#: ../main.c:2221
-msgid "-A\t\t\tstart in Arabic mode"
-msgstr "-A\t\t\tาิ Arabic ฤฃสฝฦ๔ถฏ"
-
-#: ../main.c:2222
-msgid "-H\t\t\tStart in Hebrew mode"
-msgstr "-H\t\t\tาิ Hebrew ฤฃสฝฦ๔ถฏ"
-
-#: ../main.c:2223
-msgid "-F\t\t\tStart in Farsi mode"
-msgstr "-F\t\t\tาิ Farsi ฤฃสฝฦ๔ถฏ"
-
-#: ../main.c:2224
-msgid "-T <terminal>\tSet terminal type to <terminal>"
-msgstr "-T <terminal>\tษ่ถจึีถหภเะอฮช <terminal>"
-
-#: ../main.c:2225
-msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc"
-msgstr "-u <vimrc>\t\tสนำร <vimrc> ฬๆด๚ศฮบฮ .vimrc"
-
-#: ../main.c:2226
-msgid "--noplugin\t\tDon't load plugin scripts"
-msgstr "--noplugin\t\tฒปผำิุ plugin ฝลฑพ"
-
-#: ../main.c:2227
-msgid "-p[N]\t\tOpen N tab pages (default: one for each file)"
-msgstr "-P[N]\t\tด๒ฟช N ธ๖ฑ๊วฉาณ (ฤฌศฯึต: รฟธ๖ฮฤผาปธ๖)"
-
-#: ../main.c:2228
-msgid "-o[N]\t\tOpen N windows (default: one for each file)"
-msgstr "-o[N]\t\tด๒ฟช N ธ๖ดฐฟฺ (ฤฌศฯึต: รฟธ๖ฮฤผาปธ๖)"
-
-#: ../main.c:2229
-msgid "-O[N]\t\tLike -o but split vertically"
-msgstr "-O[N]\t\tอฌ -o ตซดนึฑทึธ๎"
-
-#: ../main.c:2230
-msgid "+\t\t\tStart at end of file"
-msgstr "+\t\t\tฦ๔ถฏบ๓ฬ๘ตฝฮฤผฤฉฮฒ"
-
-#: ../main.c:2231
-msgid "+<lnum>\t\tStart at line <lnum>"
-msgstr "+<lnum>\t\tฦ๔ถฏบ๓ฬ๘ตฝตฺ <lnum> ะะ"
-
-#: ../main.c:2232
-msgid "--cmd <command>\tExecute <command> before loading any vimrc file"
-msgstr "--cmd <command>\tผำิุศฮบฮ vimrc ฮฤผวฐึดะะ <command>"
-
-#: ../main.c:2233
-msgid "-c <command>\t\tExecute <command> after loading the first file"
-msgstr "-c <command>\t\tผำิุตฺาปธ๖ฮฤผบ๓ึดะะ <command>"
-
-#: ../main.c:2235
-msgid "-S <session>\t\tSource file <session> after loading the first file"
-msgstr "-S <session>\t\tผำิุตฺาปธ๖ฮฤผบ๓ึดะะฮฤผ <session>"
-
-#: ../main.c:2236
-msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>"
-msgstr "-s <scriptin>\tดำฮฤผ <scriptin> ถมศ๋ีณฃฤฃสฝตฤรม๎"
-
-#: ../main.c:2237
-msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>"
-msgstr "-w <scriptout>\tฝซห๙ำะสไศ๋ตฤรม๎ืทผำตฝฮฤผ <scriptout>"
-
-#: ../main.c:2238
-msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>"
-msgstr "-W <scriptout>\tฝซห๙ำะสไศ๋ตฤรม๎ะดศ๋ตฝฮฤผ <scriptout>"
-
-#: ../main.c:2240
-msgid "--startuptime <file>\tWrite startup timing messages to <file>"
-msgstr ""
-
-#: ../main.c:2242
-msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
-msgstr "-i <viminfo>\t\tสนำร <viminfo> ศกด๚ .viminfo"
-
-#: ../main.c:2243
-msgid "-h or --help\tPrint Help (this message) and exit"
-msgstr "-h ป๒ --help\tด๒ำกฐ๏ึ๚(ฑพะลฯข)ฒขอหณ๖"
-
-#: ../main.c:2244
-msgid "--version\t\tPrint version information and exit"
-msgstr "--version\t\tด๒ำกฐๆฑพะลฯขฒขอหณ๖"
-
-#: ../mark.c:676
-msgid "No marks set"
-msgstr "รปำะษ่ถจฑ๊ผว"
-
-#: ../mark.c:678
-#, c-format
-msgid "E283: No marks matching \"%s\""
-msgstr "E283: รปำะฦฅลไ \"%s\" ตฤฑ๊ผว"
-
-#. Highlight title
-#: ../mark.c:687
-msgid ""
-"\n"
-"mark line col file/text"
-msgstr ""
-"\n"
-"ฑ๊ผว ะะ มะ ฮฤผ/ฮฤฑพ"
-
-#. Highlight title
-#: ../mark.c:789
-msgid ""
-"\n"
-" jump line col file/text"
-msgstr ""
-"\n"
-" ฬ๘ืช ะะ มะ ฮฤผ/ฮฤฑพ"
-
-#. Highlight title
-#: ../mark.c:831
-msgid ""
-"\n"
-"change line col text"
-msgstr ""
-"\n"
-" ธฤฑไ ะะ มะ ฮฤฑพ"
-
-#: ../mark.c:1238
-msgid ""
-"\n"
-"# File marks:\n"
-msgstr ""
-"\n"
-"# ฮฤผฑ๊ผว:\n"
-
-#. Write the jumplist with -'
-#: ../mark.c:1271
-msgid ""
-"\n"
-"# Jumplist (newest first):\n"
-msgstr ""
-"\n"
-"# ฬ๘ืชมะฑํ (ดำะยตฝพษ):\n"
-
-#: ../mark.c:1352
-msgid ""
-"\n"
-"# History of marks within files (newest to oldest):\n"
-msgstr ""
-"\n"
-"# ฮฤผฤฺตฤฑ๊ผวภ๚สทผวยผ (ดำะยตฝพษ):\n"
-
-#: ../mark.c:1431
-msgid "Missing '>'"
-msgstr "ศฑษู '>'"
-
-#: ../memfile.c:426
-msgid "E293: block was not locked"
-msgstr "E293: ฟ้ฮดฑปห๘ถจ"
-
-#: ../memfile.c:799
-msgid "E294: Seek error in swap file read"
-msgstr "E294: ฝปปปฮฤผถมศกถจฮปดํฮ๓"
-
-#: ../memfile.c:803
-msgid "E295: Read error in swap file"
-msgstr "E295: ฝปปปฮฤผถมศกดํฮ๓"
-
-#: ../memfile.c:849
-msgid "E296: Seek error in swap file write"
-msgstr "E296: ฝปปปฮฤผะดศ๋ถจฮปดํฮ๓"
-
-#: ../memfile.c:865
-msgid "E297: Write error in swap file"
-msgstr "E297: ฝปปปฮฤผะดศ๋ดํฮ๓"
-
-#: ../memfile.c:1036
-msgid "E300: Swap file already exists (symlink attack?)"
-msgstr "E300: ฝปปปฮฤผาัดๆิฺ (ท๛บลมฌฝำนฅป๗ฃฟ)"
-
-#: ../memline.c:318
-msgid "E298: Didn't get block nr 0?"
-msgstr "E298: ีาฒปตฝฟ้ 0ฃฟ"
-
-#: ../memline.c:361
-msgid "E298: Didn't get block nr 1?"
-msgstr "E298: ีาฒปตฝฟ้ 1ฃฟ"
-
-#: ../memline.c:377
-msgid "E298: Didn't get block nr 2?"
-msgstr "E298: ีาฒปตฝฟ้ 2ฃฟ"
-
-#. could not (re)open the swap file, what can we do????
-#: ../memline.c:465
-msgid "E301: Oops, lost the swap file!!!"
-msgstr "E301: เฃฌฝปปปฮฤผฒปผ๛มหฃกฃกฃก"
-
-#: ../memline.c:477
-msgid "E302: Could not rename swap file"
-msgstr "E302: ฮทจึุรร๛ฝปปปฮฤผ"
-
-#: ../memline.c:554
-#, c-format
-msgid "E303: Unable to open swap file for \"%s\", recovery impossible"
-msgstr "E303: ฮทจด๒ฟช \"%s\" ตฤฝปปปฮฤผฃฌปึธดฝซฒปฟษฤ"
-
-#: ../memline.c:666
-msgid "E304: ml_upd_block0(): Didn't get block 0??"
-msgstr "E304: ml_upd_block0(): ีาฒปตฝฟ้ 0ฃฟ"
-
-#. no swap files found
-#: ../memline.c:830
-#, c-format
-msgid "E305: No swap file found for %s"
-msgstr "E305: ีาฒปตฝ %s ตฤฝปปปฮฤผ"
-
-#: ../memline.c:839
-msgid "Enter number of swap file to use (0 to quit): "
-msgstr "ว๋สไศ๋าชสนำรตฤฝปปปฮฤผฑเบล (0 อหณ๖): "
-
-#: ../memline.c:879
-#, c-format
-msgid "E306: Cannot open %s"
-msgstr "E306: ฮทจด๒ฟช %s"
-
-#: ../memline.c:897
-msgid "Unable to read block 0 from "
-msgstr "ฮทจถมศกฟ้ 0: "
-
-#: ../memline.c:900
-msgid ""
-"\n"
-"Maybe no changes were made or Vim did not update the swap file."
-msgstr ""
-"\n"
-"ฟษฤฤใรปื๖นศฮบฮะธฤป๒สว Vim ปนภดฒปผฐธะยฝปปปฮฤผกฃ"
-
-#: ../memline.c:909
-msgid " cannot be used with this version of Vim.\n"
-msgstr " ฒปฤิฺธรฐๆฑพตฤ Vim ึะสนำรกฃ\n"
-
-#: ../memline.c:911
-msgid "Use Vim version 3.0.\n"
-msgstr "สนำร Vim 3.0กฃ\n"
-
-#: ../memline.c:916
-#, c-format
-msgid "E307: %s does not look like a Vim swap file"
-msgstr "E307: %s ฟดฦ๐ภดฒปฯ๑สว Vim ฝปปปฮฤผ"
-
-#: ../memline.c:922
-msgid " cannot be used on this computer.\n"
-msgstr " ฒปฤิฺีโฬจต็ฤิษฯสนำรกฃ\n"
-
-#: ../memline.c:924
-msgid "The file was created on "
-msgstr "ดหฮฤผดดฝจำฺ "
-
-#: ../memline.c:928
-msgid ""
-",\n"
-"or the file has been damaged."
-msgstr ""
-"ฃฌ\n"
-"ป๒สวดหฮฤผาัห๐ปตกฃ"
-
-#: ../memline.c:945
-msgid " has been damaged (page size is smaller than minimum value).\n"
-msgstr ""
-
-#: ../memline.c:974
-#, c-format
-msgid "Using swap file \"%s\""
-msgstr "สนำรฝปปปฮฤผ \"%s\""
-
-#: ../memline.c:980
-#, c-format
-msgid "Original file \"%s\""
-msgstr "ิญสผฮฤผ \"%s\""
-
-#: ../memline.c:995
-msgid "E308: Warning: Original file may have been changed"
-msgstr "E308: พฏธๆ: ิญสผฮฤผฟษฤาัฑปะธฤ"
-
-#: ../memline.c:1061
-#, c-format
-msgid "E309: Unable to read block 1 from %s"
-msgstr "E309: ฮทจดำ %s ถมศกฟ้ 1"
-
-# do not translate to avoid writing Chinese in files
-#: ../memline.c:1065
-#, fuzzy
-msgid "???MANY LINES MISSING"
-msgstr "???ศฑษูมหฬซถเะะ"
-
-# do not translate to avoid writing Chinese in files
-#: ../memline.c:1076
-#, fuzzy
-msgid "???LINE COUNT WRONG"
-msgstr "???ะะสดํฮ๓"
-
-# do not translate to avoid writing Chinese in files
-#: ../memline.c:1082
-#, fuzzy
-msgid "???EMPTY BLOCK"
-msgstr "???ฟีตฤฟ้"
-
-# do not translate to avoid writing Chinese in files
-#: ../memline.c:1103
-#, fuzzy
-msgid "???LINES MISSING"
-msgstr "???ศฑษูมหาปะฉะะ"
-
-#: ../memline.c:1128
-#, c-format
-msgid "E310: Block 1 ID wrong (%s not a .swp file?)"
-msgstr "E310: ฟ้ 1 ID ดํฮ๓ (%s ฒปสวฝปปปฮฤผฃฟ)"
-
-# do not translate to avoid writing Chinese in files
-#: ../memline.c:1133
-#, fuzzy
-msgid "???BLOCK MISSING"
-msgstr "???ศฑษูฟ้"
-
-# do not translate to avoid writing Chinese in files
-#: ../memline.c:1147
-#, fuzzy
-msgid "??? from here until ???END lines may be messed up"
-msgstr "??? ดำีโภ๏ตฝ ???END ตฤะะฟษฤาัป์ยา"
-
-# do not translate to avoid writing Chinese in files
-#: ../memline.c:1164
-#, fuzzy
-msgid "??? from here until ???END lines may have been inserted/deleted"
-msgstr "??? ดำีโภ๏ตฝ ???END ตฤะะฟษฤาัฑปฒๅศ๋/ษพณน"
-
-# do not translate to avoid writing Chinese in files
-#: ../memline.c:1181
-#, fuzzy
-msgid "???END"
-msgstr "???END"
-
-#: ../memline.c:1238
-msgid "E311: Recovery Interrupted"
-msgstr "E311: ปึธดาัฑปึะถฯ"
-
-#: ../memline.c:1243
-msgid ""
-"E312: Errors detected while recovering; look for lines starting with ???"
-msgstr "E312: ปึธดสฑทขษ๚ดํฮ๓ฃปว๋ืขาโฟชอทฮช ??? ตฤะะ"
-
-#: ../memline.c:1245
-msgid "See \":help E312\" for more information."
-msgstr "ธถเะลฯขว๋ผ๛ \":help E312\""
-
-#: ../memline.c:1249
-msgid "Recovery completed. You should check if everything is OK."
-msgstr "ปึธดอ๊ฑฯกฃว๋ศทถจาปวะีณฃกฃ"
-
-#: ../memline.c:1251
-msgid ""
-"\n"
-"(You might want to write out this file under another name\n"
-msgstr ""
-"\n"
-"(ฤใฟษฤฯ๋าชฝซีโธ๖ฮฤผมํดๆฮชฑ๐ตฤฮฤผร๛\n"
-
-#: ../memline.c:1252
-#, fuzzy
-msgid "and run diff with the original file to check for changes)"
-msgstr "ิูิหะะ diff ำ๋ิญฮฤผฑศฝฯาิผ์ฒ้สวท๑ำะธฤฑไ)\n"
-
-#: ../memline.c:1254
-msgid "Recovery completed. Buffer contents equals file contents."
-msgstr ""
-
-#: ../memline.c:1255
-#, fuzzy
-msgid ""
-"\n"
-"You may want to delete the .swp file now.\n"
-"\n"
-msgstr ""
-"ศปบ๓ฐั .swp ฮฤผษพต๔กฃ\n"
-"\n"
-
-#. use msg() to start the scrolling properly
-#: ../memline.c:1327
-msgid "Swap files found:"
-msgstr "ีาตฝฝปปปฮฤผ:"
-
-#: ../memline.c:1446
-msgid " In current directory:\n"
-msgstr " ฮปำฺตฑวฐฤฟยผ:\n"
-
-#: ../memline.c:1448
-msgid " Using specified name:\n"
-msgstr " สนำรึธถจตฤร๛ืึ:\n"
-
-#: ../memline.c:1450
-msgid " In directory "
-msgstr " ฮปำฺฤฟยผ "
-
-#: ../memline.c:1465
-msgid " -- none --\n"
-msgstr " -- ฮ --\n"
-
-#: ../memline.c:1527
-msgid " owned by: "
-msgstr " ห๙ำะี฿: "
-
-#: ../memline.c:1529
-msgid " dated: "
-msgstr " ศีฦฺ: "
-
-#: ../memline.c:1532 ../memline.c:3231
-msgid " dated: "
-msgstr " ศีฦฺ: "
-
-#: ../memline.c:1548
-msgid " [from Vim version 3.0]"
-msgstr " [ภดืิ Vim ฐๆฑพ 3.0]"
-
-#: ../memline.c:1550
-msgid " [does not look like a Vim swap file]"
-msgstr " [ฒปฯ๑สว Vim ฝปปปฮฤผ]"
-
-#: ../memline.c:1552
-msgid " file name: "
-msgstr " ฮฤผร๛: "
-
-#: ../memline.c:1558
-msgid ""
-"\n"
-" modified: "
-msgstr ""
-"\n"
-" ะธฤน: "
-
-#: ../memline.c:1559
-msgid "YES"
-msgstr "สว"
-
-#: ../memline.c:1559
-msgid "no"
-msgstr "ท๑"
-
-#: ../memline.c:1562
-msgid ""
-"\n"
-" user name: "
-msgstr ""
-"\n"
-" ำรปงร๛: "
-
-#: ../memline.c:1568
-msgid " host name: "
-msgstr " ึ๗ป๚ร๛: "
-
-#: ../memline.c:1570
-msgid ""
-"\n"
-" host name: "
-msgstr ""
-"\n"
-" ึ๗ป๚ร๛: "
-
-#: ../memline.c:1575
-msgid ""
-"\n"
-" process ID: "
-msgstr ""
-"\n"
-" ฝ๘ณฬ ID: "
-
-#: ../memline.c:1579
-msgid " (still running)"
-msgstr " (ศิิฺิหะะ)"
-
-#: ../memline.c:1586
-msgid ""
-"\n"
-" [not usable on this computer]"
-msgstr ""
-"\n"
-" [ฒปฤิฺฑพป๚ษฯสนำร]"
-
-#: ../memline.c:1590
-msgid " [cannot be read]"
-msgstr " [ฮทจถมศก]"
-
-#: ../memline.c:1593
-msgid " [cannot be opened]"
-msgstr " [ฮทจด๒ฟช]"
-
-#: ../memline.c:1698
-msgid "E313: Cannot preserve, there is no swap file"
-msgstr "E313: ฮทจฑฃม๔ฃฌรปำะฝปปปฮฤผ"
-
-#: ../memline.c:1747
-msgid "File preserved"
-msgstr "ฮฤผาัฑฃม๔"
-
-#: ../memline.c:1749
-msgid "E314: Preserve failed"
-msgstr "E314: ฑฃม๔สงฐ"
-
-#: ../memline.c:1819
-#, c-format
-msgid "E315: ml_get: invalid lnum: %<PRId64>"
-msgstr "E315: ml_get: ฮะงตฤ lnum: %<PRId64>"
-
-#: ../memline.c:1851
-#, c-format
-msgid "E316: ml_get: cannot find line %<PRId64>"
-msgstr "E316: ml_get: ีาฒปตฝตฺ %<PRId64> ะะ"
-
-#: ../memline.c:2236
-msgid "E317: pointer block id wrong 3"
-msgstr "E317: ึธี๋ฟ้ id ดํฮ๓ 3"
-
-#: ../memline.c:2311
-msgid "stack_idx should be 0"
-msgstr "stack_idx ำฆธรสว 0"
-
-#: ../memline.c:2369
-msgid "E318: Updated too many blocks?"
-msgstr "E318: ธะยมหฬซถเตฤฟ้ฃฟ"
-
-#: ../memline.c:2511
-msgid "E317: pointer block id wrong 4"
-msgstr "E317: ึธี๋ฟ้ id ดํฮ๓ 4"
-
-#: ../memline.c:2536
-msgid "deleted block 1?"
-msgstr "ษพณมหฟ้ 1ฃฟ"
-
-#: ../memline.c:2707
-#, c-format
-msgid "E320: Cannot find line %<PRId64>"
-msgstr "E320: ีาฒปตฝตฺ %<PRId64> ะะ"
-
-#: ../memline.c:2916
-msgid "E317: pointer block id wrong"
-msgstr "E317: ึธี๋ฟ้ id ดํฮ๓"
-
-#: ../memline.c:2930
-msgid "pe_line_count is zero"
-msgstr "pe_line_count ฮชมใ"
-
-#: ../memline.c:2955
-#, c-format
-msgid "E322: line number out of range: %<PRId64> past the end"
-msgstr "E322: ะะบลณฌณ๖ทถฮง: %<PRId64> ณฌณ๖ฝแฮฒ"
-
-#: ../memline.c:2959
-#, c-format
-msgid "E323: line count wrong in block %<PRId64>"
-msgstr "E323: ฟ้ %<PRId64> ะะสดํฮ๓"
-
-#: ../memline.c:2999
-msgid "Stack size increases"
-msgstr "ถัีปด๓ะกิ๖ผำ"
-
-#: ../memline.c:3038
-msgid "E317: pointer block id wrong 2"
-msgstr "E317: ึธี๋ฟ้ id ดํฮ๓ 2"
-
-#: ../memline.c:3070
-#, c-format
-msgid "E773: Symlink loop for \"%s\""
-msgstr "E773: \"%s\" ท๛บลมฌฝำณ๖ฯึัญปท"
-
-#: ../memline.c:3221
-msgid "E325: ATTENTION"
-msgstr "E325: ืขาโ"
-
-#: ../memline.c:3222
-msgid ""
-"\n"
-"Found a swap file by the name \""
-msgstr ""
-"\n"
-"ทขฯึฝปปปฮฤผ \""
-
-#: ../memline.c:3226
-msgid "While opening file \""
-msgstr "ีิฺด๒ฟชฮฤผ \""
-
-#: ../memline.c:3239
-msgid " NEWER than swap file!\n"
-msgstr " ฑศฝปปปฮฤผะยฃก\n"
-
-#: ../memline.c:3244
-#, fuzzy
-msgid ""
-"\n"
-"(1) Another program may be editing the same file. If this is the case,\n"
-" be careful not to end up with two different instances of the same\n"
-" file when making changes."
-msgstr ""
-"\n"
-"(1) มําปธ๖ณฬะ๒ฟษฤาฒิฺฑเผญอฌาปธ๖ฮฤผกฃ\n"
-" ศ็น๛สวีโั๙ฃฌะธฤสฑว๋ืขาโฑรโอฌาปธ๖ฮฤผฒ๚ษ๚มฝธ๖ฒปอฌตฤฐๆฑพกฃ\n"
-"\n"
-
-#: ../memline.c:3245
-#, fuzzy
-msgid " Quit, or continue with caution.\n"
-msgstr " อหณ๖ฃฌป๒ะกะฤตุผฬะ๘กฃ\n"
-
-#: ../memline.c:3246
-#, fuzzy
-msgid "(2) An edit session for this file crashed.\n"
-msgstr ""
-"\n"
-"(2) ษฯดฮฑเผญดหฮฤผสฑฑภภฃกฃ\n"
-
-#: ../memline.c:3247
-msgid " If this is the case, use \":recover\" or \"vim -r "
-msgstr " ศ็น๛สวีโั๙ฃฌว๋ำร \":recover\" ป๒ \"vim -r "
-
-#: ../memline.c:3249
-msgid ""
-"\"\n"
-" to recover the changes (see \":help recovery\").\n"
-msgstr ""
-"\"\n"
-" ปึธดะธฤตฤฤฺศ (ว๋ผ๛ \":help recovery\")กฃ\n"
-
-#: ../memline.c:3250
-msgid " If you did this already, delete the swap file \""
-msgstr " ศ็น๛ฤใาัพญฝ๘ะะมหปึธดฃฌว๋ษพณฝปปปฮฤผ \""
-
-#: ../memline.c:3252
-msgid ""
-"\"\n"
-" to avoid this message.\n"
-msgstr ""
-"\"\n"
-" าิฑรโิูฟดตฝดหฯ๛ฯขกฃ\n"
-
-#: ../memline.c:3450 ../memline.c:3452
-msgid "Swap file \""
-msgstr "ฝปปปฮฤผ \""
-
-#: ../memline.c:3451 ../memline.c:3455
-msgid "\" already exists!"
-msgstr "\" าัดๆิฺฃก"
-
-#: ../memline.c:3457
-msgid "VIM - ATTENTION"
-msgstr "VIM - ืขาโ"
-
-#: ../memline.c:3459
-msgid "Swap file already exists!"
-msgstr "ฝปปปฮฤผาัดๆิฺฃก"
-
-#: ../memline.c:3464
-msgid ""
-"&Open Read-Only\n"
-"&Edit anyway\n"
-"&Recover\n"
-"&Quit\n"
-"&Abort"
-msgstr ""
-"าิึปถมทฝสฝด๒ฟช(&O)\n"
-"ึฑฝำฑเผญ(&E)\n"
-"ปึธด(&R)\n"
-"อหณ๖(&Q)\n"
-"ึะึน(&A)"
-
-#: ../memline.c:3467
-msgid ""
-"&Open Read-Only\n"
-"&Edit anyway\n"
-"&Recover\n"
-"&Delete it\n"
-"&Quit\n"
-"&Abort"
-msgstr ""
-"าิึปถมทฝสฝด๒ฟช(&O)\n"
-"ึฑฝำฑเผญ(&E)\n"
-"ปึธด(&R)\n"
-"ษพณฝปปปฮฤผ(&D)\n"
-"อหณ๖(&Q)\n"
-"ึะึน(&A)"
-
-#.
-#. * Change the ".swp" extension to find another file that can be used.
-#. * First decrement the last char: ".swo", ".swn", etc.
-#. * If that still isn't enough decrement the last but one char: ".svz"
-#. * Can happen when editing many "No Name" buffers.
-#.
-#. ".s?a"
-#. ".saa": tried enough, give up
-#: ../memline.c:3528
-msgid "E326: Too many swap files found"
-msgstr "E326: ีาตฝฬซถเฝปปปฮฤผ"
-
-#: ../memory.c:227
-#, c-format
-msgid "E342: Out of memory! (allocating %<PRIu64> bytes)"
-msgstr "E342: ฤฺดๆฒปืใฃก(ทึลไ %<PRIu64> ืึฝฺ)"
-
-#: ../menu.c:62
-msgid "E327: Part of menu-item path is not sub-menu"
-msgstr "E327: ฒหตฅฯ๎ตฤฤณฒฟทึยทพถฒปสวืำฒหตฅ"
-
-#: ../menu.c:63
-msgid "E328: Menu only exists in another mode"
-msgstr "E328: ฒหตฅึปิฺฦไหฤฃสฝึะดๆิฺ"
-
-#: ../menu.c:64
-#, c-format
-msgid "E329: No menu \"%s\""
-msgstr "E329: รปำะฒหตฅ \"%s\""
-
-#. Only a mnemonic or accelerator is not valid.
-#: ../menu.c:329
-#, fuzzy
-msgid "E792: Empty menu name"
-msgstr "E749: ฟีตฤปบณๅว๘"
-
-#: ../menu.c:340
-msgid "E330: Menu path must not lead to a sub-menu"
-msgstr "E330: ฒหตฅยทพถฒปฤึธฯ๒ืำฒหตฅ"
-
-#: ../menu.c:365
-msgid "E331: Must not add menu items directly to menu bar"
-msgstr "E331: ฒปฤฐัฒหตฅฯ๎ึฑฝำผำตฝฒหตฅภธึะ"
-
-#: ../menu.c:370
-msgid "E332: Separator cannot be part of a menu path"
-msgstr "E332: ทึธ๔ฯ฿ฒปฤสวฒหตฅยทพถตฤาปฒฟทึ"
-
-#. Now we have found the matching menu, and we list the mappings
-#. Highlight title
-#: ../menu.c:762
-msgid ""
-"\n"
-"--- Menus ---"
-msgstr ""
-"\n"
-"--- ฒหตฅ ---"
-
-#: ../menu.c:1313
-msgid "E333: Menu path must lead to a menu item"
-msgstr "E333: ฒหตฅยทพถฑุะ๋ึธฯ๒ฒหตฅฯ๎"
-
-#: ../menu.c:1330
-#, c-format
-msgid "E334: Menu not found: %s"
-msgstr "E334: ีาฒปตฝฒหตฅ: %s"
-
-#: ../menu.c:1396
-#, c-format
-msgid "E335: Menu not defined for %s mode"
-msgstr "E335: %s ฤฃสฝึะฒหตฅฮดถจาๅ"
-
-#: ../menu.c:1426
-msgid "E336: Menu path must lead to a sub-menu"
-msgstr "E336: ฒหตฅยทพถฑุะ๋ึธฯ๒ืำฒหตฅ"
-
-#: ../menu.c:1447
-msgid "E337: Menu not found - check menu names"
-msgstr "E337: ีาฒปตฝฒหตฅ - ว๋ผ์ฒ้ฒหตฅร๛ณฦ"
-
-#: ../message.c:423
-#, c-format
-msgid "Error detected while processing %s:"
-msgstr "ดฆภํ %s สฑทขษ๚ดํฮ๓:"
-
-#: ../message.c:445
-#, c-format
-msgid "line %4ld:"
-msgstr "ตฺ %4ld ะะ:"
-
-#: ../message.c:617
-#, c-format
-msgid "E354: Invalid register name: '%s'"
-msgstr "E354: ฮะงตฤผฤดๆฦ๗ร๛: '%s'"
-
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr "ผ๒ฬๅึะฮฤฯ๛ฯขฮฌปคี฿: Yuheng Xie <elephant@linux.net.cn>"
-
-#: ../message.c:986
-msgid "Interrupt: "
-msgstr "าัึะถฯ: "
-
-#: ../message.c:988
-msgid "Press ENTER or type command to continue"
-msgstr "ว๋ฐด ENTER ป๒ฦไหรม๎ผฬะ๘"
-
-#: ../message.c:1843
-#, c-format
-msgid "%s line %<PRId64>"
-msgstr "%s ตฺ %<PRId64> ะะ"
-
-#: ../message.c:2392
-msgid "-- More --"
-msgstr "-- ธถเ --"
-
-#: ../message.c:2398
-msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "
-msgstr " ฟีธ๑/d/j: ฦมฤป/าณ/ะะ ฯยทญฃฌb/u/k: ษฯทญฃฌq: อหณ๖ "
-
-#: ../message.c:3021 ../message.c:3031
-msgid "Question"
-msgstr "ฮสฬโ"
-
-#: ../message.c:3023
-msgid ""
-"&Yes\n"
-"&No"
-msgstr ""
-"สว(&Y)\n"
-"ท๑(&N)"
-
-#: ../message.c:3033
-msgid ""
-"&Yes\n"
-"&No\n"
-"&Cancel"
-msgstr ""
-"สว(&Y)\n"
-"ท๑(&N)\n"
-"ศกฯ๛(&C)"
-
-#: ../message.c:3045
-msgid ""
-"&Yes\n"
-"&No\n"
-"Save &All\n"
-"&Discard All\n"
-"&Cancel"
-msgstr ""
-"สว(&Y)\n"
-"ท๑(&N)\n"
-"ศซฒฟฑฃดๆ(&A)\n"
-"ศซฒฟถชฦ๚(&D)\n"
-"ศกฯ๛(&C)"
-
-#: ../message.c:3058
-msgid "E766: Insufficient arguments for printf()"
-msgstr "E766: printf() ตฤฒฮสฒปืใ"
-
-#: ../message.c:3119
-#, fuzzy
-msgid "E807: Expected Float argument for printf()"
-msgstr "E766: printf() ตฤฒฮสฒปืใ"
-
-#: ../message.c:3873
-msgid "E767: Too many arguments to printf()"
-msgstr "E767: printf() ตฤฒฮสนถเ"
-
-#: ../misc1.c:2256
-msgid "W10: Warning: Changing a readonly file"
-msgstr "W10: พฏธๆ: ีิฺะธฤาปธ๖ึปถมฮฤผ"
-
-#: ../misc1.c:2537
-#, fuzzy
-msgid "Type number and <Enter> or click with mouse (empty cancels): "
-msgstr "ว๋สไศ๋สืึป๒ตใป๗ส๓ฑ๊ (<Enter> ศกฯ๛): "
-
-#: ../misc1.c:2539
-#, fuzzy
-msgid "Type number and <Enter> (empty cancels): "
-msgstr "ว๋ักิ๑สืึ (<Enter> ศกฯ๛): "
-
-#: ../misc1.c:2585
-msgid "1 more line"
-msgstr "ถเมห 1 ะะ"
-
-#: ../misc1.c:2588
-msgid "1 line less"
-msgstr "ษูมห 1 ะะ"
-
-#: ../misc1.c:2593
-#, c-format
-msgid "%<PRId64> more lines"
-msgstr "ถเมห %<PRId64> ะะ"
-
-#: ../misc1.c:2596
-#, c-format
-msgid "%<PRId64> fewer lines"
-msgstr "ษูมห %<PRId64> ะะ"
-
-#: ../misc1.c:2599
-msgid " (Interrupted)"
-msgstr " (าัึะถฯ)"
-
-#: ../misc1.c:2635
-msgid "Beep!"
-msgstr "Beep!"
-
-#: ../misc2.c:738
-#, c-format
-msgid "Calling shell to execute: \"%s\""
-msgstr "ต๗ำร shell ึดะะ: \"%s\""
-
-#: ../normal.c:183
-msgid "E349: No identifier under cursor"
-msgstr "E349: นโฑ๊ดฆรปำะสถฑ๐ืึ"
-
-#: ../normal.c:1866
-msgid "E774: 'operatorfunc' is empty"
-msgstr "E774: 'operatorfunc' ฮชฟี"
-
-#: ../normal.c:2637
-msgid "Warning: terminal cannot highlight"
-msgstr "พฏธๆ: ฤใตฤึีถหฒปฤฯิสพธ฿มม"
-
-#: ../normal.c:2807
-msgid "E348: No string under cursor"
-msgstr "E348: นโฑ๊ดฆรปำะืึท๛ดฎ"
-
-#: ../normal.c:3937
-msgid "E352: Cannot erase folds with current 'foldmethod'"
-msgstr "E352: ฒปฤิฺตฑวฐตฤ 'foldmethod' ฯยษพณ fold"
-
-#: ../normal.c:5897
-msgid "E664: changelist is empty"
-msgstr "E664: ธฤฑไมะฑํฮชฟี"
-
-#: ../normal.c:5899
-msgid "E662: At start of changelist"
-msgstr "E662: าัิฺธฤฑไมะฑํตฤฟชสผดฆ"
-
-#: ../normal.c:5901
-msgid "E663: At end of changelist"
-msgstr "E663: าัิฺธฤฑไมะฑํตฤฤฉฮฒดฆ"
-
-#: ../normal.c:7053
-msgid "Type :quit<Enter> to exit Nvim"
-msgstr "สไศ๋ :quit<Enter> อหณ๖ Vim"
-
-#: ../ops.c:248
-#, c-format
-msgid "1 line %sed 1 time"
-msgstr "1 ะะ %s มห 1 ดฮ"
-
-#: ../ops.c:250
-#, c-format
-msgid "1 line %sed %d times"
-msgstr "1 ะะ %s มห %d ดฮ"
-
-#: ../ops.c:253
-#, c-format
-msgid "%<PRId64> lines %sed 1 time"
-msgstr "%<PRId64> ะะ %s มห 1 ดฮ"
-
-#: ../ops.c:256
-#, c-format
-msgid "%<PRId64> lines %sed %d times"
-msgstr "%<PRId64> ะะ %s มห %d ดฮ"
-
-#: ../ops.c:592
-#, c-format
-msgid "%<PRId64> lines to indent... "
-msgstr "ห๕ฝ๘ %<PRId64> ะะกญกญ "
-
-#: ../ops.c:634
-msgid "1 line indented "
-msgstr "ห๕ฝ๘มห 1 ะะ "
-
-#: ../ops.c:636
-#, c-format
-msgid "%<PRId64> lines indented "
-msgstr "ห๕ฝ๘มห %<PRId64> ะะ "
-
-#: ../ops.c:938
-msgid "E748: No previously used register"
-msgstr "E748: รปำะวฐาปธ๖สนำรตฤผฤดๆฦ๗"
-
-#. must display the prompt
-#: ../ops.c:1433
-msgid "cannot yank; delete anyway"
-msgstr "ฮทจธดึฦฃปธฤฮชษพณ"
-
-#: ../ops.c:1929
-msgid "1 line changed"
-msgstr "ธฤฑไมห 1 ะะ"
-
-#: ../ops.c:1931
-#, c-format
-msgid "%<PRId64> lines changed"
-msgstr "ธฤฑไมห %<PRId64> ะะ"
-
-#: ../ops.c:2521
-msgid "block of 1 line yanked"
-msgstr "ธดึฦมห 1 ะะตฤฟ้"
-
-#: ../ops.c:2523
-msgid "1 line yanked"
-msgstr "ธดึฦมห 1 ะะ"
-
-#: ../ops.c:2525
-#, c-format
-msgid "block of %<PRId64> lines yanked"
-msgstr "ธดึฦมห %<PRId64> ะะตฤฟ้"
-
-#: ../ops.c:2528
-#, c-format
-msgid "%<PRId64> lines yanked"
-msgstr "ธดึฦมห %<PRId64> ะะ"
-
-#: ../ops.c:2710
-#, c-format
-msgid "E353: Nothing in register %s"
-msgstr "E353: ผฤดๆฦ๗ %s ภ๏รปำะถซฮ๗"
-
-#. Highlight title
-#: ../ops.c:3185
-msgid ""
-"\n"
-"--- Registers ---"
-msgstr ""
-"\n"
-"--- ผฤดๆฦ๗ ---"
-
-#: ../ops.c:4455
-msgid "Illegal register name"
-msgstr "ฮะงตฤผฤดๆฦ๗ร๛"
-
-#: ../ops.c:4533
-msgid ""
-"\n"
-"# Registers:\n"
-msgstr ""
-"\n"
-"# ผฤดๆฦ๗:\n"
-
-#: ../ops.c:4575
-#, c-format
-msgid "E574: Unknown register type %d"
-msgstr "E574: ฮดึชตฤผฤดๆฦ๗ภเะอ %d"
-
-#: ../ops.c:5089
-#, c-format
-msgid "%<PRId64> Cols; "
-msgstr "%<PRId64> มะ; "
-
-#: ../ops.c:5097
-#, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Bytes"
-msgstr ""
-"ักิ๑มห %s%<PRId64>/%<PRId64> ะะ; %<PRId64>/%<PRId64> ธ๖ดส; %<PRId64>/"
-"%<PRId64> ธ๖ืึฝฺ"
-
-#: ../ops.c:5105
-#, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Chars; %<PRId64> of %<PRId64> Bytes"
-msgstr ""
-"ักิ๑มห %s%<PRId64>/%<PRId64> ะะ; %<PRId64>/%<PRId64> ธ๖ดส; %<PRId64>/"
-"%<PRId64> ธ๖ืึท๛; %<PRId64>/%<PRId64> ธ๖ืึฝฺ"
-
-#: ../ops.c:5123
-#, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Byte "
-"%<PRId64> of %<PRId64>"
-msgstr ""
-"ตฺ %s/%s มะ; ตฺ %<PRId64>/%<PRId64> ะะ; ตฺ %<PRId64>/%<PRId64> ธ๖ดส; ตฺ "
-"%<PRId64>/%<PRId64> ธ๖ืึฝฺ"
-
-#: ../ops.c:5133
-#, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Char "
-"%<PRId64> of %<PRId64>; Byte %<PRId64> of %<PRId64>"
-msgstr ""
-"ตฺ %s/%s มะ; ตฺ %<PRId64>/%<PRId64> ะะ; ตฺ %<PRId64>/%<PRId64> ธ๖ดส; ตฺ "
-"%<PRId64>/%<PRId64> ธ๖ืึท๛; ตฺ %<PRId64>/%<PRId64> ธ๖ืึฝฺ"
-
-#: ../ops.c:5146
-#, c-format
-msgid "(+%<PRId64> for BOM)"
-msgstr ""
-
-#: ../option.c:1238
-msgid "%<%f%h%m%=Page %N"
-msgstr ""
-
-#: ../option.c:1574
-msgid "Thanks for flying Vim"
-msgstr "ธะะปฤ๚ักิ๑ Vim"
-
-#. found a mismatch: skip
-#: ../option.c:2698
-msgid "E518: Unknown option"
-msgstr "E518: ฮดึชตฤักฯ๎"
-
-#: ../option.c:2709
-msgid "E519: Option not supported"
-msgstr "E519: ฒปึงณึธรักฯ๎"
-
-#: ../option.c:2740
-msgid "E520: Not allowed in a modeline"
-msgstr "E520: ฒปิสะํิฺ modeline ึะสนำร"
-
-#: ../option.c:2815
-msgid "E846: Key code not set"
-msgstr ""
-
-#: ../option.c:2924
-msgid "E521: Number required after ="
-msgstr "E521: = บ๓รๆะ่าชสืึ"
-
-#: ../option.c:3226 ../option.c:3864
-msgid "E522: Not found in termcap"
-msgstr "E522: Termcap ภ๏รๆีาฒปตฝ"
-
-#: ../option.c:3335
-#, c-format
-msgid "E539: Illegal character <%s>"
-msgstr "E539: ฮะงตฤืึท๛ <%s>"
-
-#: ../option.c:3862
-msgid "E529: Cannot set 'term' to empty string"
-msgstr "E529: ฒปฤษ่ถจ 'term' ฮชฟีืึท๛ดฎ"
-
-#: ../option.c:3885
-msgid "E589: 'backupext' and 'patchmode' are equal"
-msgstr "E589: 'backupext' บอ 'patchmode' ฯเตศ"
-
-#: ../option.c:3964
-msgid "E834: Conflicts with value of 'listchars'"
-msgstr ""
-
-#: ../option.c:3966
-msgid "E835: Conflicts with value of 'fillchars'"
-msgstr ""
-
-#: ../option.c:4163
-msgid "E524: Missing colon"
-msgstr "E524: ศฑษูรฐบล"
-
-#: ../option.c:4165
-msgid "E525: Zero length string"
-msgstr "E525: ืึท๛ดฎณคถศฮชมใ"
-
-#: ../option.c:4220
-#, c-format
-msgid "E526: Missing number after <%s>"
-msgstr "E526: <%s> บ๓รๆศฑษูสืึ"
-
-#: ../option.c:4232
-msgid "E527: Missing comma"
-msgstr "E527: ศฑษูถบบล"
-
-#: ../option.c:4239
-msgid "E528: Must specify a ' value"
-msgstr "E528: ฑุะ๋ึธถจาปธ๖ ' ึต"
-
-#: ../option.c:4271
-msgid "E595: contains unprintable or wide character"
-msgstr "E595: ฐบฌฒปฟษฯิสพืึท๛ป๒ฟํืึท๛"
-
-#: ../option.c:4469
-#, c-format
-msgid "E535: Illegal character after <%c>"
-msgstr "E535: <%c> บ๓รๆำะฮะงตฤืึท๛"
-
-#: ../option.c:4534
-msgid "E536: comma required"
-msgstr "E536: ะ่าชถบบล"
-
-#: ../option.c:4543
-#, c-format
-msgid "E537: 'commentstring' must be empty or contain %s"
-msgstr "E537: 'commentstring' ฑุะ๋ฮชฟีป๒ฐบฌ %s"
-
-#: ../option.c:4928
-msgid "E540: Unclosed expression sequence"
-msgstr "E540: รปำะฝแส๘ตฤฑํด๏สฝะ๒มะ"
-
-#: ../option.c:4932
-msgid "E541: too many items"
-msgstr "E541: ฯ๎ฤฟนถเ"
-
-#: ../option.c:4934
-msgid "E542: unbalanced groups"
-msgstr "E542: ดํยาตฤื้"
-
-#: ../option.c:5148
-msgid "E590: A preview window already exists"
-msgstr "E590: ิคภภดฐฟฺาัดๆิฺ"
-
-#: ../option.c:5311
-msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'"
-msgstr "W17: Arabic ะ่าช UTF-8ฃฌว๋ึดะะ ':set encoding=utf-8'"
-
-#: ../option.c:5623
-#, c-format
-msgid "E593: Need at least %d lines"
-msgstr "E593: ึมษูะ่าช %d ะะ"
-
-#: ../option.c:5631
-#, c-format
-msgid "E594: Need at least %d columns"
-msgstr "E594: ึมษูะ่าช %d มะ"
-
-#: ../option.c:6011
-#, c-format
-msgid "E355: Unknown option: %s"
-msgstr "E355: ฮดึชตฤักฯ๎: %s"
-
-#. There's another character after zeros or the string
-#. * is empty. In both cases, we are trying to set a
-#. * num option using a string.
-#: ../option.c:6037
-#, fuzzy, c-format
-msgid "E521: Number required: &%s = '%s'"
-msgstr "E521: = บ๓รๆะ่าชสืึ"
-
-#: ../option.c:6149
-msgid ""
-"\n"
-"--- Terminal codes ---"
-msgstr ""
-"\n"
-"--- ึีถหฑเย๋ ---"
-
-#: ../option.c:6151
-msgid ""
-"\n"
-"--- Global option values ---"
-msgstr ""
-"\n"
-"--- ศซพึักฯ๎ึต ---"
-
-#: ../option.c:6153
-msgid ""
-"\n"
-"--- Local option values ---"
-msgstr ""
-"\n"
-"--- พึฒฟักฯ๎ึต ---"
-
-#: ../option.c:6155
-msgid ""
-"\n"
-"--- Options ---"
-msgstr ""
-"\n"
-"--- ักฯ๎ ---"
-
-#: ../option.c:6816
-msgid "E356: get_varp ERROR"
-msgstr "E356: get_varp ดํฮ๓"
-
-#: ../option.c:7696
-#, c-format
-msgid "E357: 'langmap': Matching character missing for %s"
-msgstr "E357: 'langmap': ีาฒปตฝ %s ถิำฆตฤืึท๛"
-
-#: ../option.c:7715
-#, c-format
-msgid "E358: 'langmap': Extra characters after semicolon: %s"
-msgstr "E358: 'langmap': ทึบลบ๓ำะถเำเตฤืึท๛: %s"
-
-#: ../os/shell.c:194
-msgid ""
-"\n"
-"Cannot execute shell "
-msgstr ""
-"\n"
-"ฮทจึดะะ shell"
-
-#: ../os/shell.c:439
-msgid ""
-"\n"
-"shell returned "
-msgstr ""
-"\n"
-"Shell าัทตปุ"
-
-#: ../os_unix.c:465 ../os_unix.c:471
-msgid ""
-"\n"
-"Could not get security context for "
-msgstr ""
-
-#: ../os_unix.c:479
-msgid ""
-"\n"
-"Could not set security context for "
-msgstr ""
-
-# do not translate
-#: ../os_unix.c:1558 ../os_unix.c:1647
-#, c-format
-msgid "dlerror = \"%s\""
-msgstr "dlerror = \"%s\""
-
-#: ../path.c:1449
-#, c-format
-msgid "E447: Can't find file \"%s\" in path"
-msgstr "E447: ิฺยทพถึะีาฒปตฝฮฤผ \"%s\""
-
-#: ../quickfix.c:359
-#, c-format
-msgid "E372: Too many %%%c in format string"
-msgstr "E372: ธ๑สฝปฏืึท๛ดฎภ๏ำะฬซถเ %%%c "
-
-#: ../quickfix.c:371
-#, c-format
-msgid "E373: Unexpected %%%c in format string"
-msgstr "E373: ธ๑สฝปฏืึท๛ดฎฒปำฆธรณ๖ฯึ %%%c "
-
-#: ../quickfix.c:420
-msgid "E374: Missing ] in format string"
-msgstr "E374: ธ๑สฝปฏืึท๛ดฎภ๏ษูมห ]"
-
-#: ../quickfix.c:431
-#, c-format
-msgid "E375: Unsupported %%%c in format string"
-msgstr "E375: ธ๑สฝปฏืึท๛ดฎภ๏ำะฒปึงณึตฤ %%%c "
-
-#: ../quickfix.c:448
-#, c-format
-msgid "E376: Invalid %%%c in format string prefix"
-msgstr "E376: ธ๑สฝปฏืึท๛ดฎฟชอทภ๏ำะฒปีศทตฤ %%%c "
-
-#: ../quickfix.c:454
-#, c-format
-msgid "E377: Invalid %%%c in format string"
-msgstr "E377: ธ๑สฝปฏืึท๛ดฎภ๏ำะฒปีศทตฤ %%%c "
-
-#. nothing found
-#: ../quickfix.c:477
-msgid "E378: 'errorformat' contains no pattern"
-msgstr "E378: 'errorformat' ฮดษ่ถจ"
-
-#: ../quickfix.c:695
-msgid "E379: Missing or empty directory name"
-msgstr "E379: ีาฒปตฝฤฟยผร๛ณฦป๒สวฟีตฤฤฟยผร๛ณฦ"
-
-#: ../quickfix.c:1305
-msgid "E553: No more items"
-msgstr "E553: รปำะธถเตฤฯ๎"
-
-#: ../quickfix.c:1674
-#, c-format
-msgid "(%d of %d)%s%s: "
-msgstr "(%d / %d)%s%s: "
-
-#: ../quickfix.c:1676
-msgid " (line deleted)"
-msgstr " (ะะาัษพณ)"
-
-#: ../quickfix.c:1863
-msgid "E380: At bottom of quickfix stack"
-msgstr "E380: Quickfix ถัีปตืถห"
-
-#: ../quickfix.c:1869
-msgid "E381: At top of quickfix stack"
-msgstr "E381: Quickfix ถัีปถฅถห"
-
-#: ../quickfix.c:1880
-#, c-format
-msgid "error list %d of %d; %d errors"
-msgstr "ดํฮ๓มะฑํ %d / %dฃปนฒ %d ธ๖ดํฮ๓"
-
-#: ../quickfix.c:2427
-msgid "E382: Cannot write, 'buftype' option is set"
-msgstr "E382: ฮทจะดศ๋ฃฌาัษ่ถจักฯ๎ 'buftype'"
-
-#: ../quickfix.c:2812
-msgid "E683: File name missing or invalid pattern"
-msgstr "E683: ศฑษูฮฤผร๛ป๒ฤฃสฝฮะง"
-
-#: ../quickfix.c:2911
-#, c-format
-msgid "Cannot open file \"%s\""
-msgstr "ฮทจด๒ฟชฮฤผ \"%s\""
-
-#: ../quickfix.c:3429
-msgid "E681: Buffer is not loaded"
-msgstr "E681: ปบณๅว๘ฮดผำิุ"
-
-#: ../quickfix.c:3487
-msgid "E777: String or List expected"
-msgstr "E777: ดหดฆะ่าช String ป๒ี฿ List"
-
-#: ../regexp.c:359
-#, c-format
-msgid "E369: invalid item in %s%%[]"
-msgstr "E369: %s%%[] ึะำะฮะงตฤฯ๎"
-
-#: ../regexp.c:374
-#, c-format
-msgid "E769: Missing ] after %s["
-msgstr "E769: %s[ บ๓ศฑษู ]"
-
-#: ../regexp.c:375
-#, c-format
-msgid "E53: Unmatched %s%%("
-msgstr "E53: ฒปฦฅลไตฤ %s%%("
-
-#: ../regexp.c:376
-#, c-format
-msgid "E54: Unmatched %s("
-msgstr "E54: ฒปฦฅลไตฤ %s("
-
-#: ../regexp.c:377
-#, c-format
-msgid "E55: Unmatched %s)"
-msgstr "E55: ฒปฦฅลไตฤ %s)"
-
-#: ../regexp.c:378
-msgid "E66: \\z( not allowed here"
-msgstr "E66: ดหดฆฒปิสะํ \\z("
-
-#: ../regexp.c:379
-msgid "E67: \\z1 et al. not allowed here"
-msgstr "E67: ดหดฆฒปิสะํ \\z1 ตศ"
-
-#: ../regexp.c:380
-#, c-format
-msgid "E69: Missing ] after %s%%["
-msgstr "E69: %s%%[ บ๓ศฑษู ]"
-
-#: ../regexp.c:381
-#, c-format
-msgid "E70: Empty %s%%[]"
-msgstr "E70: ฟีตฤ %s%%[]"
-
-#: ../regexp.c:1209 ../regexp.c:1224
-msgid "E339: Pattern too long"
-msgstr "E339: ฤฃสฝฬซณค"
-
-#: ../regexp.c:1371
-msgid "E50: Too many \\z("
-msgstr "E50: ฬซถเ \\z("
-
-#: ../regexp.c:1378
-#, c-format
-msgid "E51: Too many %s("
-msgstr "E51: ฬซถเ %s("
-
-#: ../regexp.c:1427
-msgid "E52: Unmatched \\z("
-msgstr "E52: ฒปฦฅลไตฤ \\z("
-
-#: ../regexp.c:1637
-#, c-format
-msgid "E59: invalid character after %s@"
-msgstr "E59: %s@ บ๓รๆำะฮะงตฤืึท๛"
-
-#: ../regexp.c:1672
-#, c-format
-msgid "E60: Too many complex %s{...}s"
-msgstr "E60: ฬซถเธดิำตฤ %s{...}s"
-
-#: ../regexp.c:1687
-#, c-format
-msgid "E61: Nested %s*"
-msgstr "E61: วถฬืตฤ %s*"
-
-#: ../regexp.c:1690
-#, c-format
-msgid "E62: Nested %s%c"
-msgstr "E62: วถฬืตฤ %s%c"
-
-#: ../regexp.c:1800
-msgid "E63: invalid use of \\_"
-msgstr "E63: ฒปีศทตุสนำร \\_"
-
-#: ../regexp.c:1850
-#, c-format
-msgid "E64: %s%c follows nothing"
-msgstr "E64: %s%c วฐรๆฮฤฺศ"
-
-#: ../regexp.c:1902
-msgid "E65: Illegal back reference"
-msgstr "E65: ฮะงตฤปุา"
-
-#: ../regexp.c:1943
-msgid "E68: Invalid character after \\z"
-msgstr "E68: \\z บ๓รๆำะฮะงตฤืึท๛"
-
-#: ../regexp.c:2049 ../regexp_nfa.c:1296
-#, c-format
-msgid "E678: Invalid character after %s%%[dxouU]"
-msgstr "E678: %s%%[dxouU] บ๓รๆำะฮะงตฤืึท๛"
-
-#: ../regexp.c:2107
-#, c-format
-msgid "E71: Invalid character after %s%%"
-msgstr "E71: %s%% บ๓รๆำะฮะงตฤืึท๛"
-
-#: ../regexp.c:3017
-#, c-format
-msgid "E554: Syntax error in %s{...}"
-msgstr "E554: %s{...} ึะำ๏ทจดํฮ๓"
-
-#: ../regexp.c:3805
-msgid "External submatches:\n"
-msgstr "อโฒฟท๛บฯ:\n"
-
-#: ../regexp.c:7022
-msgid ""
-"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be "
-"used "
-msgstr ""
-
-#: ../regexp_nfa.c:239
-msgid "E865: (NFA) Regexp end encountered prematurely"
-msgstr ""
-
-#: ../regexp_nfa.c:240
-#, c-format
-msgid "E866: (NFA regexp) Misplaced %c"
-msgstr ""
-
-#: ../regexp_nfa.c:242
-#, c-format
-msgid "E877: (NFA regexp) Invalid character class: %<PRId64>"
-msgstr ""
-
-#: ../regexp_nfa.c:1261
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\z%c'"
-msgstr ""
-
-#: ../regexp_nfa.c:1387
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\%%%c'"
-msgstr ""
-
-#: ../regexp_nfa.c:1802
-#, c-format
-msgid "E869: (NFA) Unknown operator '\\@%c'"
-msgstr ""
-
-#: ../regexp_nfa.c:1831
-msgid "E870: (NFA regexp) Error reading repetition limits"
-msgstr ""
-
-#. Can't have a multi follow a multi.
-#: ../regexp_nfa.c:1895
-msgid "E871: (NFA regexp) Can't have a multi follow a multi !"
-msgstr ""
-
-#. Too many `('
-#: ../regexp_nfa.c:2037
-msgid "E872: (NFA regexp) Too many '('"
-msgstr ""
-
-#: ../regexp_nfa.c:2042
-#, fuzzy
-msgid "E879: (NFA regexp) Too many \\z("
-msgstr "E50: ฬซถเ \\z("
-
-#: ../regexp_nfa.c:2066
-msgid "E873: (NFA regexp) proper termination error"
-msgstr ""
-
-#: ../regexp_nfa.c:2599
-msgid "E874: (NFA) Could not pop the stack !"
-msgstr ""
-
-#: ../regexp_nfa.c:3298
-msgid ""
-"E875: (NFA regexp) (While converting from postfix to NFA), too many states "
-"left on stack"
-msgstr ""
-
-#: ../regexp_nfa.c:3302
-msgid "E876: (NFA regexp) Not enough space to store the whole NFA "
-msgstr ""
-
-#: ../regexp_nfa.c:4571 ../regexp_nfa.c:4869
-msgid ""
-"Could not open temporary log file for writing, displaying on stderr ... "
-msgstr ""
-
-#: ../regexp_nfa.c:4840
-#, c-format
-msgid "(NFA) COULD NOT OPEN %s !"
-msgstr ""
-
-#: ../regexp_nfa.c:6049
-#, fuzzy
-msgid "Could not open temporary log file for writing "
-msgstr "E214: ีาฒปตฝำรำฺะดศ๋ตฤมูสฑฮฤผ"
-
-#: ../screen.c:7435
-msgid " VREPLACE"
-msgstr " V-ฬๆปป"
-
-#: ../screen.c:7437
-msgid " REPLACE"
-msgstr " ฬๆปป"
-
-#: ../screen.c:7440
-msgid " REVERSE"
-msgstr " ทดฯ๒"
-
-#: ../screen.c:7441
-msgid " INSERT"
-msgstr " ฒๅศ๋"
-
-#: ../screen.c:7443
-msgid " (insert)"
-msgstr " (ฒๅศ๋)"
-
-#: ../screen.c:7445
-msgid " (replace)"
-msgstr " (ฬๆปป)"
-
-#: ../screen.c:7447
-msgid " (vreplace)"
-msgstr " (V-ฬๆปป)"
-
-#: ../screen.c:7449
-msgid " Hebrew"
-msgstr " Hebrew"
-
-#: ../screen.c:7454
-msgid " Arabic"
-msgstr " Arabic"
-
-#: ../screen.c:7456
-msgid " (lang)"
-msgstr " (ำ๏ัิ)"
-
-#: ../screen.c:7459
-msgid " (paste)"
-msgstr " (ีณฬ๛)"
-
-#: ../screen.c:7469
-msgid " VISUAL"
-msgstr " ฟษสำ"
-
-#: ../screen.c:7470
-msgid " VISUAL LINE"
-msgstr " ฟษสำ ะะ"
-
-#: ../screen.c:7471
-msgid " VISUAL BLOCK"
-msgstr " ฟษสำ ฟ้"
-
-#: ../screen.c:7472
-msgid " SELECT"
-msgstr " ักิ๑"
-
-#: ../screen.c:7473
-msgid " SELECT LINE"
-msgstr " ักิ๑ ะะ"
-
-#: ../screen.c:7474
-msgid " SELECT BLOCK"
-msgstr " ักิ๑ ฟ้"
-
-#: ../screen.c:7486 ../screen.c:7541
-msgid "recording"
-msgstr "ผวยผึะ"
-
-#: ../search.c:487
-#, c-format
-msgid "E383: Invalid search string: %s"
-msgstr "E383: ฮะงตฤฒ้ีาืึท๛ดฎ: %s"
-
-#: ../search.c:832
-#, c-format
-msgid "E384: search hit TOP without match for: %s"
-msgstr "E384: าัฒ้ีาตฝฮฤผฟชอทศิีาฒปตฝ %s"
-
-#: ../search.c:835
-#, c-format
-msgid "E385: search hit BOTTOM without match for: %s"
-msgstr "E385: าัฒ้ีาตฝฮฤผฝแฮฒศิีาฒปตฝ %s"
-
-#: ../search.c:1200
-msgid "E386: Expected '?' or '/' after ';'"
-msgstr "E386: ิฺ ';' บ๓รๆำฆธรำะ '?' ป๒ '/'"
-
-#: ../search.c:4085
-msgid " (includes previously listed match)"
-msgstr " (ฐภจษฯดฮมะณ๖ท๛บฯฯ๎)"
-
-#. cursor at status line
-#: ../search.c:4104
-msgid "--- Included files "
-msgstr "--- ฐบฌฮฤผ "
-
-#: ../search.c:4106
-msgid "not found "
-msgstr "ีาฒปตฝ "
-
-#: ../search.c:4107
-msgid "in path ---\n"
-msgstr "ิฺยทพถ ---\n"
-
-#: ../search.c:4168
-msgid " (Already listed)"
-msgstr " (าัมะณ๖)"
-
-#: ../search.c:4170
-msgid " NOT FOUND"
-msgstr " ีาฒปตฝ"
-
-#: ../search.c:4211
-#, c-format
-msgid "Scanning included file: %s"
-msgstr "ฒ้ีาฐบฌฮฤผ: %s"
-
-#: ../search.c:4216
-#, c-format
-msgid "Searching included file %s"
-msgstr "ฒ้ีาฐบฌตฤฮฤผ %s"
-
-#: ../search.c:4405
-msgid "E387: Match is on current line"
-msgstr "E387: ตฑวฐะะฦฅลไ"
-
-#: ../search.c:4517
-msgid "All included files were found"
-msgstr "ห๙ำะฐบฌฮฤผถผาัีาตฝ"
-
-#: ../search.c:4519
-msgid "No included files"
-msgstr "รปำะฐบฌฮฤผ"
-
-#: ../search.c:4527
-msgid "E388: Couldn't find definition"
-msgstr "E388: ีาฒปตฝถจาๅ"
-
-#: ../search.c:4529
-msgid "E389: Couldn't find pattern"
-msgstr "E389: ีาฒปตฝ pattern"
-
-#: ../search.c:4668
-#, fuzzy
-msgid "Substitute "
-msgstr "1 ดฮฬๆปปฃฌ"
-
-#: ../search.c:4681
-#, c-format
-msgid ""
-"\n"
-"# Last %sSearch Pattern:\n"
-"~"
-msgstr ""
-
-#: ../spell.c:951
-msgid "E759: Format error in spell file"
-msgstr "E759: ฦดะดฮฤผธ๑สฝดํฮ๓"
-
-#: ../spell.c:952
-msgid "E758: Truncated spell file"
-msgstr "E758: าัฝุถฯตฤฦดะดฮฤผ"
-
-#: ../spell.c:953
-#, c-format
-msgid "Trailing text in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌถเำเตฤบ๓ะ๘ืึท๛: %s"
-
-#: ../spell.c:954
-#, c-format
-msgid "Affix name too long in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌธฝผำฯ๎ร๛ืึฬซณค: %s"
-
-#: ../spell.c:955
-msgid "E761: Format error in affix file FOL, LOW or UPP"
-msgstr "E761: ธฝผำฮฤผ FOLกขLOW ป๒ UPP ึะธ๑สฝดํฮ๓"
-
-#: ../spell.c:957
-msgid "E762: Character in FOL, LOW or UPP is out of range"
-msgstr "E762: FOLกขLOW ป๒ UPP ึะืึท๛ณฌณ๖ทถฮง"
-
-#: ../spell.c:958
-msgid "Compressing word tree..."
-msgstr "ันห๕ตฅดสส๗กญกญ"
-
-#: ../spell.c:1951
-msgid "E756: Spell checking is not enabled"
-msgstr "E756: ฦดะดผ์ฒ้ฮดฦ๔ำร"
-
-#: ../spell.c:2249
-#, c-format
-msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
-msgstr "พฏธๆ: ีาฒปตฝตฅดสมะฑํ \"%s.%s.spl\" or \"%s.ascii.spl\""
-
-#: ../spell.c:2473
-#, c-format
-msgid "Reading spell file \"%s\""
-msgstr "ถมศกฦดะดฮฤผ \"%s\""
-
-#: ../spell.c:2496
-msgid "E757: This does not look like a spell file"
-msgstr "E757: ีโฟดฦ๐ภดฒปฯ๑สวฦดะดฮฤผ"
-
-#: ../spell.c:2501
-msgid "E771: Old spell file, needs to be updated"
-msgstr "E771: พษฐๆฑพตฤฦดะดฮฤผฃฌะ่าชธะย"
-
-#: ../spell.c:2504
-msgid "E772: Spell file is for newer version of Vim"
-msgstr "E772: ฮชธธ฿ฐๆฑพตฤ Vim ห๙ำรตฤฦดะดฮฤผ"
-
-#: ../spell.c:2602
-msgid "E770: Unsupported section in spell file"
-msgstr "E770: ฦดะดฮฤผึะดๆิฺฒปึงณึตฤฝฺ"
-
-#: ../spell.c:3762
-#, c-format
-msgid "Warning: region %s not supported"
-msgstr "พฏธๆ: ว๘ำ๒ %s ฒปึงณึ"
-
-#: ../spell.c:4550
-#, c-format
-msgid "Reading affix file %s ..."
-msgstr "ถมศกธฝผำฮฤผ %s กญกญ"
-
-#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
-#, c-format
-msgid "Conversion failure for word in %s line %d: %s"
-msgstr "ตฅดส %s ืชปปสงฐฃฌตฺ %d ะะ: %s"
-
-#: ../spell.c:4630 ../spell.c:6170
-#, c-format
-msgid "Conversion in %s not supported: from %s to %s"
-msgstr "ฒปึงณึ %s ึะตฤืชปป: ดำ %s ตฝ %s"
-
-#: ../spell.c:4642
-#, c-format
-msgid "Invalid value for FLAG in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌFLAG ตฤึตฮะง: %s"
-
-#: ../spell.c:4655
-#, c-format
-msgid "FLAG after using flags in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌิฺสนำรฑ๊ึพบ๓ณ๖ฯึ FLAG: %s"
-
-#: ../spell.c:4723
-#, c-format
-msgid ""
-"Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line "
-"%d"
-msgstr ""
-
-#: ../spell.c:4731
-#, c-format
-msgid ""
-"Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line "
-"%d"
-msgstr ""
-
-#: ../spell.c:4747
-#, fuzzy, c-format
-msgid "Wrong COMPOUNDRULES value in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌดํฮ๓ตฤ COMPOUNDMIN ึต: %s"
-
-#: ../spell.c:4771
-#, c-format
-msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌดํฮ๓ตฤ COMPOUNDWORDMAX ึต: %s"
-
-#: ../spell.c:4777
-#, c-format
-msgid "Wrong COMPOUNDMIN value in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌดํฮ๓ตฤ COMPOUNDMIN ึต: %s"
-
-#: ../spell.c:4783
-#, c-format
-msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌดํฮ๓ตฤ COMPOUNDSYLMAX ึต: %s"
-
-#: ../spell.c:4795
-#, c-format
-msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌดํฮ๓ตฤ CHECKCOMPOUNDPATTERN ึต: %s"
-
-#: ../spell.c:4847
-#, c-format
-msgid "Different combining flag in continued affix block in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌิฺมฌะ๘ตฤธฝผำฟ้ึะณ๖ฯึฒปอฌตฤื้บฯฑ๊ึพ: %s"
-
-#: ../spell.c:4850
-#, c-format
-msgid "Duplicate affix in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌึุธดตฤธฝผำฯ๎: %s"
-
-#: ../spell.c:4871
-#, c-format
-msgid ""
-"Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s "
-"line %d: %s"
-msgstr ""
-"%s ตฺ %d ะะฃฌธฝผำฯ๎ฑป BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST สน"
-"ำร: %s"
-
-#: ../spell.c:4893
-#, c-format
-msgid "Expected Y or N in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌดหดฆะ่าช Y ป๒ N: %s"
-
-#: ../spell.c:4968
-#, c-format
-msgid "Broken condition in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌดํฮ๓ตฤฬ๕ผ: %s"
-
-#: ../spell.c:5091
-#, c-format
-msgid "Expected REP(SAL) count in %s line %d"
-msgstr "%s ตฺ %d ะะฃฌดหดฆะ่าช REP(SAL) ผฦส"
-
-#: ../spell.c:5120
-#, c-format
-msgid "Expected MAP count in %s line %d"
-msgstr "%s ตฺ %d ะะฃฌดหดฆะ่าช MAP ผฦส"
-
-#: ../spell.c:5132
-#, c-format
-msgid "Duplicate character in MAP in %s line %d"
-msgstr "%s ตฺ %d ะะฃฌMAP ึะดๆิฺึุธดตฤืึท๛"
-
-#: ../spell.c:5176
-#, c-format
-msgid "Unrecognized or duplicate item in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌฮทจสถฑ๐ป๒ึุธดตฤฯ๎: %s"
-
-#: ../spell.c:5197
-#, c-format
-msgid "Missing FOL/LOW/UPP line in %s"
-msgstr "%s ึะศฑษู FOL/LOW/UPP ะะ"
-
-#: ../spell.c:5220
-msgid "COMPOUNDSYLMAX used without SYLLABLE"
-msgstr "ิฺรปำะ SYLLABLE ตฤว้ฟ๖ฯยสนำรมห COMPOUNDSYLMAX"
-
-#: ../spell.c:5236
-msgid "Too many postponed prefixes"
-msgstr "ฬซถเัำณูวฐืบ"
-
-#: ../spell.c:5238
-msgid "Too many compound flags"
-msgstr "ฬซถเื้บฯฑ๊ึพ"
-
-#: ../spell.c:5240
-msgid "Too many postponed prefixes and/or compound flags"
-msgstr "ฬซถเัำณูวฐืบบอ/ป๒ื้บฯฑ๊ึพ"
-
-#: ../spell.c:5250
-#, c-format
-msgid "Missing SOFO%s line in %s"
-msgstr "%s ึะศฑษู SOFO%s ะะ"
-
-#: ../spell.c:5253
-#, c-format
-msgid "Both SAL and SOFO lines in %s"
-msgstr "%s อฌสฑณ๖ฯึ SQL บอ SOFO ะะ"
-
-#: ../spell.c:5331
-#, c-format
-msgid "Flag is not a number in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌฑ๊ึพฒปสวสืึ: %s"
-
-#: ../spell.c:5334
-#, c-format
-msgid "Illegal flag in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌฮะงตฤฑ๊ึพ: %s"
-
-#: ../spell.c:5493 ../spell.c:5501
-#, c-format
-msgid "%s value differs from what is used in another .aff file"
-msgstr "%s ตฤึตำ๋มําปธ๖ .aff ฮฤผึะสนำรตฤึตฒปฯเอฌ"
-
-#: ../spell.c:5602
-#, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "ถมศกืึตไฮฤผ %s กญกญ"
-
-#: ../spell.c:5611
-#, c-format
-msgid "E760: No word count in %s"
-msgstr "E760: %s ึะรปำะตฅดสผฦส"
-
-#: ../spell.c:5669
-#, c-format
-msgid "line %6d, word %6d - %s"
-msgstr "ตฺ %6d ะะฃฌตฺ %6d ธ๖ตฅดส - %s"
-
-#: ../spell.c:5691
-#, c-format
-msgid "Duplicate word in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌึุธดตฤตฅดส: %s"
-
-#: ../spell.c:5694
-#, c-format
-msgid "First duplicate word in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌสืดฮึุธดตฤตฅดส: %s"
-
-#: ../spell.c:5746
-#, c-format
-msgid "%d duplicate word(s) in %s"
-msgstr "ดๆิฺ %d ธ๖ึุธดตฤตฅดสฃฌิฺ %s ึะ"
-
-#: ../spell.c:5748
-#, c-format
-msgid "Ignored %d word(s) with non-ASCII characters in %s"
-msgstr "บ๖ยิมหบฌำะทว ASCII ืึท๛ตฤ %d ธ๖ตฅดสฃฌิฺ %s ึะ"
-
-#: ../spell.c:6115
-#, c-format
-msgid "Reading word file %s ..."
-msgstr "ถมศกตฅดสฮฤผ %s กญกญ"
-
-#: ../spell.c:6155
-#, c-format
-msgid "Duplicate /encoding= line ignored in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:6159
-#, c-format
-msgid "/encoding= line after word ignored in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌตฅดสบ๓ตฤ /encoding= ะะาัฑปบ๖ยิ: %s"
-
-#: ../spell.c:6180
-#, c-format
-msgid "Duplicate /regions= line ignored in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌึุธดตฤ /regions= ะะาัฑปบ๖ยิ: %s"
-
-#: ../spell.c:6185
-#, c-format
-msgid "Too many regions in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌฬซถเว๘ำ๒: %s"
-
-#: ../spell.c:6198
-#, c-format
-msgid "/ line ignored in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌ/ ะะาัฑปบ๖ยิ: %s"
-
-#: ../spell.c:6224
-#, c-format
-msgid "Invalid region nr in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌฮะงตฤว๘ำ๒บล: %s"
-
-#: ../spell.c:6230
-#, c-format
-msgid "Unrecognized flags in %s line %d: %s"
-msgstr "%s ตฺ %d ะะฃฌฒปฟษสถฑ๐ตฤฑ๊ึพ: %s"
-
-#: ../spell.c:6257
-#, c-format
-msgid "Ignored %d words with non-ASCII characters"
-msgstr "บ๖ยิมหบฌำะทว ASCII ืึท๛ตฤ %d ธ๖ตฅดส"
-
-#: ../spell.c:6656
-#, c-format
-msgid "Compressed %d of %d nodes; %d (%d%%) remaining"
-msgstr "ันห๕มห %d/%d ธ๖ฝฺตใฃปสฃำเ %d (%d%%)"
-
-#: ../spell.c:7340
-msgid "Reading back spell file..."
-msgstr "ถมศกฦดะดฮฤผกญกญ"
-
-#. Go through the trie of good words, soundfold each word and add it to
-#. the soundfold trie.
-#: ../spell.c:7357
-msgid "Performing soundfolding..."
-msgstr "ีิฺ soundfoldingกญกญ"
-
-#: ../spell.c:7368
-#, c-format
-msgid "Number of words after soundfolding: %<PRId64>"
-msgstr "soundfolding บ๓ตฤตฅดสส: %<PRId64>"
-
-#: ../spell.c:7476
-#, c-format
-msgid "Total number of words: %d"
-msgstr "ตฅดสืส: %d"
-
-#: ../spell.c:7655
-#, c-format
-msgid "Writing suggestion file %s ..."
-msgstr "ะดศ๋ฝจา้ฮฤผ %s กญกญ"
-
-#: ../spell.c:7707 ../spell.c:7927
-#, c-format
-msgid "Estimated runtime memory use: %d bytes"
-msgstr "นภผฦิหะะสฑฤฺดๆำรมฟ: %d ืึฝฺ"
-
-#: ../spell.c:7820
-msgid "E751: Output file name must not have region name"
-msgstr "E751: สไณ๖ฮฤผร๛ฒปฤบฌำะว๘ำ๒ร๛"
-
-#: ../spell.c:7822
-msgid "E754: Only up to 8 regions supported"
-msgstr "E754: ื๎ถเึปึงณึ 8 ธ๖ว๘ำ๒"
-
-#: ../spell.c:7846
-#, c-format
-msgid "E755: Invalid region in %s"
-msgstr "E755: %s ณ๖ฯึฮะงตฤทถฮง"
-
-#: ../spell.c:7907
-msgid "Warning: both compounding and NOBREAK specified"
-msgstr "พฏธๆ: อฌสฑึธถจมห compounding บอ NOBREAK"
-
-#: ../spell.c:7920
-#, c-format
-msgid "Writing spell file %s ..."
-msgstr "ะดศ๋ฦดะดฮฤผ %s กญกญ"
-
-#: ../spell.c:7925
-msgid "Done!"
-msgstr "อ๊ณษฃก"
-
-#: ../spell.c:8034
-#, c-format
-msgid "E765: 'spellfile' does not have %<PRId64> entries"
-msgstr "E765: 'spellfile' รปำะ %<PRId64> ฯ๎"
-
-#: ../spell.c:8074
-#, fuzzy, c-format
-msgid "Word '%.*s' removed from %s"
-msgstr "ดำ %s ึะษพณมหตฅดส"
-
-#: ../spell.c:8117
-#, fuzzy, c-format
-msgid "Word '%.*s' added to %s"
-msgstr "ฯ๒ %s ึะฬํผำมหตฅดส"
-
-#: ../spell.c:8381
-msgid "E763: Word characters differ between spell files"
-msgstr "E763: ฦดะดฮฤผึฎผไตฤืึท๛ฒปฯเอฌ"
-
-#: ../spell.c:8684
-msgid "Sorry, no suggestions"
-msgstr "ฑงวธฃฌรปำะฝจา้"
-
-#: ../spell.c:8687
-#, c-format
-msgid "Sorry, only %<PRId64> suggestions"
-msgstr "ฑงวธฃฌึปำะ %<PRId64> ฬ๕ฝจา้"
-
-#. for when 'cmdheight' > 1
-#. avoid more prompt
-#: ../spell.c:8704
-#, c-format
-msgid "Change \"%.*s\" to:"
-msgstr "ฝซ \"%.*s\" ธฤฮชฃบ"
-
-#: ../spell.c:8737
-#, c-format
-msgid " < \"%.*s\""
-msgstr " < \"%.*s\""
-
-#: ../spell.c:8882
-msgid "E752: No previous spell replacement"
-msgstr "E752: ึฎวฐรปำะฦดะดฬๆปป"
-
-#: ../spell.c:8925
-#, c-format
-msgid "E753: Not found: %s"
-msgstr "E753: ีาฒปตฝ: %s"
-
-#: ../spell.c:9276
-#, c-format
-msgid "E778: This does not look like a .sug file: %s"
-msgstr "E778: ฟดฦ๐ภดฒปฯ๑สว .sug ฮฤผ: %s"
-
-#: ../spell.c:9282
-#, c-format
-msgid "E779: Old .sug file, needs to be updated: %s"
-msgstr ""
-
-#: ../spell.c:9286
-#, c-format
-msgid "E780: .sug file is for newer version of Vim: %s"
-msgstr ""
-
-#: ../spell.c:9295
-#, c-format
-msgid "E781: .sug file doesn't match .spl file: %s"
-msgstr ""
-
-#: ../spell.c:9305
-#, fuzzy, c-format
-msgid "E782: error while reading .sug file: %s"
-msgstr "E47: ถมศกดํฮ๓ฮฤผสงฐ"
-
-#. This should have been checked when generating the .spl
-#. file.
-#: ../spell.c:11575
-msgid "E783: duplicate char in MAP entry"
-msgstr ""
-
-#: ../syntax.c:266
-msgid "No Syntax items defined for this buffer"
-msgstr "ีโธ๖ปบณๅว๘รปำะถจาๅศฮบฮำ๏ทจฯ๎"
-
-#: ../syntax.c:3083 ../syntax.c:3104 ../syntax.c:3127
-#, c-format
-msgid "E390: Illegal argument: %s"
-msgstr "E390: ฮะงตฤฒฮส: %s"
-
-#: ../syntax.c:3299
-#, c-format
-msgid "E391: No such syntax cluster: %s"
-msgstr "E391: ฮดหำ๏ทจ cluster: \"%s\""
-
-#: ../syntax.c:3433
-msgid "syncing on C-style comments"
-msgstr "Cท็ธ๑ืขสออฌฒฝึะ"
-
-#: ../syntax.c:3439
-msgid "no syncing"
-msgstr "รปำะอฌฒฝ"
-
-#: ../syntax.c:3441
-msgid "syncing starts "
-msgstr "อฌฒฝฟชสผ"
-
-#: ../syntax.c:3443 ../syntax.c:3506
-msgid " lines before top line"
-msgstr "ะะบลณฌณ๖ทถฮง"
-
-#: ../syntax.c:3448
-msgid ""
-"\n"
-"--- Syntax sync items ---"
-msgstr ""
-"\n"
-"--- ำ๏ทจอฌฒฝฯ๎ฤฟ (Syntax sync items) ---"
-
-#: ../syntax.c:3452
-msgid ""
-"\n"
-"syncing on items"
-msgstr ""
-"\n"
-"อฌฒฝึะ:"
-
-#: ../syntax.c:3457
-msgid ""
-"\n"
-"--- Syntax items ---"
-msgstr ""
-"\n"
-"--- ำ๏ทจฯ๎ฤฟ ---"
-
-#: ../syntax.c:3475
-#, c-format
-msgid "E392: No such syntax cluster: %s"
-msgstr "E392: ฮดหำ๏ทจ cluster: \"%s\""
-
-#: ../syntax.c:3497
-msgid "minimal "
-msgstr "ื๎ะก"
-
-#: ../syntax.c:3503
-msgid "maximal "
-msgstr "ื๎ด๓"
-
-#: ../syntax.c:3513
-#, fuzzy
-msgid "; match "
-msgstr "ฦฅลไ %d"
-
-#: ../syntax.c:3515
-#, fuzzy
-msgid " line breaks"
-msgstr "ษูำฺาปะะ"
-
-#: ../syntax.c:4076
-msgid "E395: contains argument not accepted here"
-msgstr "E395: สนำรมหฒปีศทตฤฒฮส"
-
-#: ../syntax.c:4096
-#, fuzzy
-msgid "E844: invalid cchar value"
-msgstr "E474: ฮะงตฤฒฮส"
-
-#: ../syntax.c:4107
-msgid "E393: group[t]here not accepted here"
-msgstr "E393: สนำรมหฒปีศทตฤฒฮส"
-
-#: ../syntax.c:4126
-#, c-format
-msgid "E394: Didn't find region item for %s"
-msgstr "E394: ีาฒปตฝ %s ตฤ region item"
-
-#: ../syntax.c:4188
-msgid "E397: Filename required"
-msgstr "E397: ะ่าชฮฤผร๛ณฦ"
-
-#: ../syntax.c:4221
-#, fuzzy
-msgid "E847: Too many syntax includes"
-msgstr "E77: ฮฤผร๛นถเ"
-
-#: ../syntax.c:4303
-#, fuzzy, c-format
-msgid "E789: Missing ']': %s"
-msgstr "E747: ศฑษู ']': %s"
-
-#: ../syntax.c:4531
-#, c-format
-msgid "E398: Missing '=': %s"
-msgstr "E398: ศฑษู '=': %s"
-
-#: ../syntax.c:4666
-#, c-format
-msgid "E399: Not enough arguments: syntax region %s"
-msgstr "E399: syntax region %s ตฤฒฮสฬซษู"
-
-#: ../syntax.c:4870
-#, fuzzy
-msgid "E848: Too many syntax clusters"
-msgstr "E391: ฮดหำ๏ทจ cluster: \"%s\""
-
-#: ../syntax.c:4954
-msgid "E400: No cluster specified"
-msgstr "E400: รปำะึธถจตฤส๔ะิ"
-
-#. end delimiter not found
-#: ../syntax.c:4986
-#, c-format
-msgid "E401: Pattern delimiter not found: %s"
-msgstr "E401: ีาฒปตฝทึธ๔ท๛บล: %s"
-
-#: ../syntax.c:5049
-#, c-format
-msgid "E402: Garbage after pattern: %s"
-msgstr "E402: '%s' บ๓รๆตฤถซฮ๗ฒปฤสถฑ๐"
-
-#: ../syntax.c:5120
-msgid "E403: syntax sync: line continuations pattern specified twice"
-msgstr "E403: ำ๏ทจอฌฒฝ: มฌฝำะะท๛บลึธถจมหมฝดฮ"
-
-#: ../syntax.c:5169
-#, c-format
-msgid "E404: Illegal arguments: %s"
-msgstr "E404: ฮะงตฤฒฮส: %s"
-
-#: ../syntax.c:5217
-#, c-format
-msgid "E405: Missing equal sign: %s"
-msgstr "E405: ศฑษูตศบล: %s"
-
-#: ../syntax.c:5222
-#, c-format
-msgid "E406: Empty argument: %s"
-msgstr "E406: ฟีตฤฒฮส: %s"
-
-#: ../syntax.c:5240
-#, c-format
-msgid "E407: %s not allowed here"
-msgstr "E407: %s ฒปฤิฺดหณ๖ฯึ"
-
-#: ../syntax.c:5246
-#, c-format
-msgid "E408: %s must be first in contains list"
-msgstr "E408: %s ฑุะ๋สวมะฑํภ๏ตฤตฺาปธ๖"
-
-#: ../syntax.c:5304
-#, c-format
-msgid "E409: Unknown group name: %s"
-msgstr "E409: ฒปีศทตฤื้ร๛: %s"
-
-#: ../syntax.c:5512
-#, c-format
-msgid "E410: Invalid :syntax subcommand: %s"
-msgstr "E410: ฒปีศทตฤ :syntax ืำรม๎: %s"
-
-#: ../syntax.c:5854
-msgid ""
-" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
-msgstr ""
-
-#: ../syntax.c:6146
-msgid "E679: recursive loop loading syncolor.vim"
-msgstr "E679: ผำิุ syncolor.vim สฑณ๖ฯึวถฬืัญปท"
-
-#: ../syntax.c:6256
-#, c-format
-msgid "E411: highlight group not found: %s"
-msgstr "E411: ีาฒปตฝ highlight group: %s"
-
-#: ../syntax.c:6278
-#, c-format
-msgid "E412: Not enough arguments: \":highlight link %s\""
-msgstr "E412: ฒฮสฬซษู: \":highlight link %s\""
-
-#: ../syntax.c:6284
-#, c-format
-msgid "E413: Too many arguments: \":highlight link %s\""
-msgstr "E413: ฒฮสนถเ: \":highlight link %s\""
-
-#: ../syntax.c:6302
-msgid "E414: group has settings, highlight link ignored"
-msgstr "E414: าัษ่ถจื้, บ๖ยิ highlight link"
-
-#: ../syntax.c:6367
-#, c-format
-msgid "E415: unexpected equal sign: %s"
-msgstr "E415: ฒปธรำะตฤตศบล: %s"
-
-#: ../syntax.c:6395
-#, c-format
-msgid "E416: missing equal sign: %s"
-msgstr "E416: ศฑษูตศบล: %s"
-
-#: ../syntax.c:6418
-#, c-format
-msgid "E417: missing argument: %s"
-msgstr "E417: ศฑษูฒฮส: %s"
-
-#: ../syntax.c:6446
-#, c-format
-msgid "E418: Illegal value: %s"
-msgstr "E418: ฒปบฯทจตฤึต: %s"
-
-#: ../syntax.c:6496
-msgid "E419: FG color unknown"
-msgstr "E419: ดํฮ๓ตฤวฐพฐัีษซ"
-
-#: ../syntax.c:6504
-msgid "E420: BG color unknown"
-msgstr "E420: ดํฮ๓ตฤฑณพฐัีษซ"
-
-#: ../syntax.c:6564
-#, c-format
-msgid "E421: Color name or number not recognized: %s"
-msgstr "E421: ดํฮ๓ตฤัีษซร๛ณฦป๒สึต: %s"
-
-#: ../syntax.c:6714
-#, c-format
-msgid "E422: terminal code too long: %s"
-msgstr "E422: ึีถหฑเย๋ฬซณค: %s"
-
-#: ../syntax.c:6753
-#, c-format
-msgid "E423: Illegal argument: %s"
-msgstr "E423: ฮะงตฤฒฮส: %s"
-
-#: ../syntax.c:6925
-msgid "E424: Too many different highlighting attributes in use"
-msgstr "E424: สนำรมหฬซถเฒปอฌตฤธ฿มมถศส๔ะิ"
-
-#: ../syntax.c:7427
-msgid "E669: Unprintable character in group name"
-msgstr "E669: ื้ร๛ึะดๆิฺฒปฟษฯิสพืึท๛"
-
-#: ../syntax.c:7434
-msgid "W18: Invalid character in group name"
-msgstr "W18: ื้ร๛ึะบฌำะฮะงืึท๛"
-
-#: ../syntax.c:7448
-msgid "E849: Too many highlight and syntax groups"
-msgstr ""
-
-#: ../tag.c:104
-msgid "E555: at bottom of tag stack"
-msgstr "E555: าัิฺ tag ถัีปตืฒฟ"
-
-#: ../tag.c:105
-msgid "E556: at top of tag stack"
-msgstr "E556: าัิฺ tag ถัีปถฅฒฟ"
-
-#: ../tag.c:380
-msgid "E425: Cannot go before first matching tag"
-msgstr "E425: าัตฝตฺาปธ๖ฦฅลไตฤ tag"
-
-#: ../tag.c:504
-#, c-format
-msgid "E426: tag not found: %s"
-msgstr "E426: ีาฒปตฝ tag: %s"
-
-#: ../tag.c:528
-msgid " # pri kind tag"
-msgstr " # pri kind tag"
-
-#: ../tag.c:531
-msgid "file\n"
-msgstr "ฮฤผ\n"
-
-#: ../tag.c:829
-msgid "E427: There is only one matching tag"
-msgstr "E427: ึปำะาปธ๖ฦฅลไตฤ tag"
-
-#: ../tag.c:831
-msgid "E428: Cannot go beyond last matching tag"
-msgstr "E428: ผบตฝื๎บ๓าปธ๖ฦฅลไตฤ tag"
-
-#: ../tag.c:850
-#, c-format
-msgid "File \"%s\" does not exist"
-msgstr "ฮฤผ \"%s\" ฒปดๆิฺ"
-
-#. Give an indication of the number of matching tags
-#: ../tag.c:859
-#, c-format
-msgid "tag %d of %d%s"
-msgstr "ีาตฝ tag: %d / %d%s"
-
-#: ../tag.c:862
-msgid " or more"
-msgstr " ป๒ธถเ"
-
-#: ../tag.c:864
-msgid " Using tag with different case!"
-msgstr " าิฒปอฌด๓ะกะดภดสนำร tagฃก"
-
-#: ../tag.c:909
-#, c-format
-msgid "E429: File \"%s\" does not exist"
-msgstr "E429: ฮฤผ \"%s\" ฒปดๆิฺ"
-
-#. Highlight title
-#: ../tag.c:960
-msgid ""
-"\n"
-" # TO tag FROM line in file/text"
-msgstr ""
-"\n"
-" # ตฝ tag ดำ ะะ ิฺ ฮฤผ/ฮฤฑพ"
-
-#: ../tag.c:1303
-#, c-format
-msgid "Searching tags file %s"
-msgstr "ฒ้ีา tag ฮฤผ %s"
-
-#: ../tag.c:1545
-msgid "Ignoring long line in tags file"
-msgstr ""
-
-#: ../tag.c:1915
-#, c-format
-msgid "E431: Format error in tags file \"%s\""
-msgstr "E431: Tag ฮฤผ \"%s\" ธ๑สฝดํฮ๓"
-
-#: ../tag.c:1917
-#, c-format
-msgid "Before byte %<PRId64>"
-msgstr "ิฺตฺ %<PRId64> ืึฝฺึฎวฐ"
-
-#: ../tag.c:1929
-#, c-format
-msgid "E432: Tags file not sorted: %s"
-msgstr "E432: Tag ฮฤผฮดลละ๒: %s"
-
-#. never opened any tags file
-#: ../tag.c:1960
-msgid "E433: No tags file"
-msgstr "E433: รปำะ tag ฮฤผ"
-
-#: ../tag.c:2536
-msgid "E434: Can't find tag pattern"
-msgstr "E434: ีาฒปตฝ tag ฤฃสฝ"
-
-#: ../tag.c:2544
-msgid "E435: Couldn't find tag, just guessing!"
-msgstr "E435: ีาฒปตฝ tagฃฌสิืลฒยฃก"
-
-#: ../tag.c:2797
-#, fuzzy, c-format
-msgid "Duplicate field name: %s"
-msgstr "%s ตฺ %d ะะฃฌึุธดตฤธฝผำฯ๎: %s"
-
-#: ../term.c:1442
-msgid "' not known. Available builtin terminals are:"
-msgstr "' ฮดึชกฃฟษำรตฤฤฺฝจึีถหำะ:"
-
-#: ../term.c:1463
-msgid "defaulting to '"
-msgstr "ฤฌศฯึตฮช: '"
-
-#: ../term.c:1731
-msgid "E557: Cannot open termcap file"
-msgstr "E557: ฮทจด๒ฟช termcap ฮฤผ"
-
-#: ../term.c:1735
-msgid "E558: Terminal entry not found in terminfo"
-msgstr "E558: ิฺ terminfo ึะีาฒปตฝึีถหฯ๎"
-
-#: ../term.c:1737
-msgid "E559: Terminal entry not found in termcap"
-msgstr "E559: ิฺ termcap ึะีาฒปตฝึีถหฯ๎"
-
-#: ../term.c:1878
-#, c-format
-msgid "E436: No \"%s\" entry in termcap"
-msgstr "E436: termcap ึะรปำะ \"%s\" ฯ๎"
-
-#: ../term.c:2249
-msgid "E437: terminal capability \"cm\" required"
-msgstr "E437: ึีถหะ่าชฤมฆ \"cm\""
-
-#. Highlight title
-#: ../term.c:4376
-msgid ""
-"\n"
-"--- Terminal keys ---"
-msgstr ""
-"\n"
-"--- ึีถหฐดผ ---"
-
-#: ../ui.c:481
-msgid "Vim: Error reading input, exiting...\n"
-msgstr "Vim: ถมดํฮ๓ฃฌอหณ๖ึะ...\n"
-
-#. This happens when the FileChangedRO autocommand changes the
-#. * file in a way it becomes shorter.
-#: ../undo.c:379
-#, fuzzy
-msgid "E881: Line count changed unexpectedly"
-msgstr "E787: าโอโตุธฤฑไมหปบณๅว๘"
-
-#: ../undo.c:627
-#, fuzzy, c-format
-msgid "E828: Cannot open undo file for writing: %s"
-msgstr "E212: ฮทจด๒ฟชฒขะดศ๋ฮฤผ"
-
-#: ../undo.c:717
-#, c-format
-msgid "E825: Corrupted undo file (%s): %s"
-msgstr ""
-
-#: ../undo.c:1039
-msgid "Cannot write undo file in any directory in 'undodir'"
-msgstr ""
-
-#: ../undo.c:1074
-#, c-format
-msgid "Will not overwrite with undo file, cannot read: %s"
-msgstr ""
-
-#: ../undo.c:1092
-#, c-format
-msgid "Will not overwrite, this is not an undo file: %s"
-msgstr ""
-
-#: ../undo.c:1108
-msgid "Skipping undo file write, nothing to undo"
-msgstr ""
-
-#: ../undo.c:1121
-#, fuzzy, c-format
-msgid "Writing undo file: %s"
-msgstr "ะดศ๋ viminfo ฮฤผ \"%s\""
-
-#: ../undo.c:1213
-#, fuzzy, c-format
-msgid "E829: write error in undo file: %s"
-msgstr "E297: ฝปปปฮฤผะดศ๋ดํฮ๓"
-
-#: ../undo.c:1280
-#, c-format
-msgid "Not reading undo file, owner differs: %s"
-msgstr ""
-
-#: ../undo.c:1292
-#, fuzzy, c-format
-msgid "Reading undo file: %s"
-msgstr "ถมศกตฅดสฮฤผ %s กญกญ"
-
-#: ../undo.c:1299
-#, fuzzy, c-format
-msgid "E822: Cannot open undo file for reading: %s"
-msgstr "E195: ฮทจด๒ฟชฒขถมศก viminfo ฮฤผ"
-
-#: ../undo.c:1308
-#, fuzzy, c-format
-msgid "E823: Not an undo file: %s"
-msgstr "E753: ีาฒปตฝ: %s"
-
-#: ../undo.c:1313
-#, fuzzy, c-format
-msgid "E824: Incompatible undo file: %s"
-msgstr "E484: ฮทจด๒ฟชฮฤผ %s"
-
-#: ../undo.c:1328
-msgid "File contents changed, cannot use undo info"
-msgstr ""
-
-#: ../undo.c:1497
-#, fuzzy, c-format
-msgid "Finished reading undo file %s"
-msgstr "ฝแส๘ึดะะ %s"
-
-#: ../undo.c:1586 ../undo.c:1812
-msgid "Already at oldest change"
-msgstr "าัฮปำฺื๎พษตฤธฤฑไ"
-
-#: ../undo.c:1597 ../undo.c:1814
-msgid "Already at newest change"
-msgstr "าัฮปำฺื๎ะยตฤธฤฑไ"
-
-#: ../undo.c:1806
-#, fuzzy, c-format
-msgid "E830: Undo number %<PRId64> not found"
-msgstr "ีาฒปตฝณทฯ๚บล %<PRId64>"
-
-#: ../undo.c:1979
-msgid "E438: u_undo: line numbers wrong"
-msgstr "E438: u_undo: ะะบลดํฮ๓"
-
-#: ../undo.c:2183
-msgid "more line"
-msgstr "ะะฑปผำศ๋"
-
-#: ../undo.c:2185
-msgid "more lines"
-msgstr "ะะฑปผำศ๋"
-
-#: ../undo.c:2187
-msgid "line less"
-msgstr "ะะฑปศฅต๔"
-
-#: ../undo.c:2189
-msgid "fewer lines"
-msgstr "ะะฑปศฅต๔"
-
-#: ../undo.c:2193
-msgid "change"
-msgstr "ะะทขษ๚ธฤฑไ"
-
-#: ../undo.c:2195
-msgid "changes"
-msgstr "ะะทขษ๚ธฤฑไ"
-
-#: ../undo.c:2225
-#, c-format
-msgid "%<PRId64> %s; %s #%<PRId64> %s"
-msgstr "%<PRId64> %sฃป%s #%<PRId64> %s"
-
-#: ../undo.c:2228
-msgid "before"
-msgstr "before"
-
-#: ../undo.c:2228
-msgid "after"
-msgstr "after"
-
-#: ../undo.c:2325
-msgid "Nothing to undo"
-msgstr "ฮฟษณทฯ๚"
-
-#: ../undo.c:2330
-msgid "number changes when saved"
-msgstr ""
-
-#: ../undo.c:2360
-#, fuzzy, c-format
-msgid "%<PRId64> seconds ago"
-msgstr "%<PRId64> มะ; "
-
-#: ../undo.c:2372
-#, fuzzy
-msgid "E790: undojoin is not allowed after undo"
-msgstr "E407: %s ฒปฤิฺดหณ๖ฯึ"
-
-#: ../undo.c:2466
-msgid "E439: undo list corrupt"
-msgstr "E439: ณทฯ๚มะฑํห๐ปต"
-
-#: ../undo.c:2495
-msgid "E440: undo line missing"
-msgstr "E440: ีาฒปตฝาชณทฯ๚ตฤะะ"
-
-#: ../version.c:600
-msgid ""
-"\n"
-"Included patches: "
-msgstr ""
-"\n"
-"ฐบฌฒนถก: "
-
-#: ../version.c:627
-#, fuzzy
-msgid ""
-"\n"
-"Extra patches: "
-msgstr "อโฒฟท๛บฯ:\n"
-
-#: ../version.c:639 ../version.c:864
-msgid "Modified by "
-msgstr "ะธฤี฿ "
-
-#: ../version.c:646
-msgid ""
-"\n"
-"Compiled "
-msgstr ""
-"\n"
-"ฑเา๋"
-
-#: ../version.c:649
-msgid "by "
-msgstr "ี฿ "
-
-#: ../version.c:660
-msgid ""
-"\n"
-"Huge version "
-msgstr ""
-"\n"
-"พะอฐๆฑพ "
-
-#: ../version.c:661
-msgid "without GUI."
-msgstr "ฮอผะฮฝ็รๆกฃ"
-
-#: ../version.c:662
-msgid " Features included (+) or not (-):\n"
-msgstr " ฟษสนำร(+)ำ๋ฒปฟษสนำร(-)ตฤนฆฤ:\n"
-
-#: ../version.c:667
-msgid " system vimrc file: \""
-msgstr " ฯตอณ vimrc ฮฤผ: \""
-
-#: ../version.c:672
-msgid " user vimrc file: \""
-msgstr " ำรปง vimrc ฮฤผ: \""
-
-#: ../version.c:677
-msgid " 2nd user vimrc file: \""
-msgstr " ตฺถำรปง vimrc ฮฤผ: \""
-
-#: ../version.c:682
-msgid " 3rd user vimrc file: \""
-msgstr " ตฺศำรปง vimrc ฮฤผ: \""
-
-#: ../version.c:687
-msgid " user exrc file: \""
-msgstr " ำรปง exrc ฮฤผ: \""
-
-#: ../version.c:692
-msgid " 2nd user exrc file: \""
-msgstr " ตฺถำรปง exrc ฮฤผ: \""
-
-#: ../version.c:699
-msgid " fall-back for $VIM: \""
-msgstr " $VIM ิคษ่ึต: \""
-
-#: ../version.c:705
-msgid " f-b for $VIMRUNTIME: \""
-msgstr " $VIMRUNTIME ิคษ่ึต: \""
-
-#: ../version.c:709
-msgid "Compilation: "
-msgstr "ฑเา๋ทฝสฝ: "
-
-#: ../version.c:712
-msgid "Linking: "
-msgstr "มดฝำทฝสฝ: "
-
-#: ../version.c:717
-msgid " DEBUG BUILD"
-msgstr " ต๗สิฐๆฑพ"
-
-#: ../version.c:767
-msgid "VIM - Vi IMproved"
-msgstr "VIM - Vi IMproved"
-
-#: ../version.c:769
-msgid "version "
-msgstr "ฐๆฑพ "
-
-#: ../version.c:770
-msgid "by Bram Moolenaar et al."
-msgstr "ฮฌปคศห Bram Moolenaar ตศ"
-
-#: ../version.c:774
-msgid "Vim is open source and freely distributable"
-msgstr "Vim สวฟษืิำษทึทขตฤฟชทลิดด๚ย๋ศํผ"
-
-#: ../version.c:776
-msgid "Help poor children in Uganda!"
-msgstr "ฐ๏ึ๚ฮฺธษด๏ตฤฟษมฏถ๙อฏฃก"
-
-#: ../version.c:777
-msgid "type :help iccf<Enter> for information "
-msgstr "สไศ๋ :help iccf<Enter> ฒ้ฟดหตร๗ "
-
-#: ../version.c:779
-msgid "type :q<Enter> to exit "
-msgstr "สไศ๋ :q<Enter> อหณ๖ "
-
-#: ../version.c:780
-msgid "type :help<Enter> or <F1> for on-line help"
-msgstr "สไศ๋ :help<Enter> ป๒ <F1> ฒ้ฟดิฺฯ฿ฐ๏ึ๚ "
-
-#: ../version.c:781
-msgid "type :help version7<Enter> for version info"
-msgstr "สไศ๋ :help version7<Enter> ฒ้ฟดฐๆฑพะลฯข "
-
-#: ../version.c:784
-msgid "Running in Vi compatible mode"
-msgstr "ิหะะำฺ Vi ผๆศฤฃสฝ"
-
-#: ../version.c:785
-msgid "type :set nocp<Enter> for Vim defaults"
-msgstr "สไศ๋ :set nocp<Enter> ปึธดฤฌศฯตฤ Vim "
-
-#: ../version.c:786
-msgid "type :help cp-default<Enter> for info on this"
-msgstr "สไศ๋ :help cp-default<Enter> ฒ้ฟดฯเนุหตร๗ "
-
-#: ../version.c:827
-msgid "Sponsor Vim development!"
-msgstr "ิึ๚ Vim ตฤฟชทขฃก"
-
-#: ../version.c:828
-msgid "Become a registered Vim user!"
-msgstr "ณษฮช Vim ตฤืขฒแำรปงฃก"
-
-#: ../version.c:831
-msgid "type :help sponsor<Enter> for information "
-msgstr "สไศ๋ :help sponsor<Enter> ฒ้ฟดหตร๗ "
-
-#: ../version.c:832
-msgid "type :help register<Enter> for information "
-msgstr "สไศ๋ :help register<Enter> ฒ้ฟดหตร๗ "
-
-#: ../version.c:834
-msgid "menu Help->Sponsor/Register for information "
-msgstr "ฒหตฅ Help->Sponsor/Register ฒ้ฟดหตร๗ "
-
-#: ../window.c:119
-msgid "Already only one window"
-msgstr "าัพญึปสฃาปธ๖ดฐฟฺมห"
-
-#: ../window.c:224
-msgid "E441: There is no preview window"
-msgstr "E441: รปำะิคภภดฐฟฺ"
-
-#: ../window.c:559
-msgid "E442: Can't split topleft and botright at the same time"
-msgstr "E442: ฒปฤอฌสฑฝ๘ะะ topleft บอ botright ทึธ๎"
-
-#: ../window.c:1228
-msgid "E443: Cannot rotate when another window is split"
-msgstr "E443: ำะฦไหทึธ๎ดฐฟฺสฑฒปฤะืช"
-
-#: ../window.c:1803
-msgid "E444: Cannot close last window"
-msgstr "E444: ฒปฤนุฑีื๎บ๓าปธ๖ดฐฟฺ"
-
-#: ../window.c:1810
-#, fuzzy
-msgid "E813: Cannot close autocmd window"
-msgstr "E444: ฒปฤนุฑีื๎บ๓าปธ๖ดฐฟฺ"
-
-#: ../window.c:1814
-#, fuzzy
-msgid "E814: Cannot close window, only autocmd window would remain"
-msgstr "E444: ฒปฤนุฑีื๎บ๓าปธ๖ดฐฟฺ"
-
-#: ../window.c:2717
-msgid "E445: Other window contains changes"
-msgstr "E445: ฦไหดฐฟฺำะธฤฑไตฤฤฺศ"
-
-#: ../window.c:4805
-msgid "E446: No file name under cursor"
-msgstr "E446: นโฑ๊ดฆรปำะฮฤผร๛"
-
-#~ msgid "Patch file"
-#~ msgstr "Patch ฮฤผ"
-
-#~ msgid ""
-#~ "&OK\n"
-#~ "&Cancel"
-#~ msgstr ""
-#~ "ศทถจ(&O)\n"
-#~ "ศกฯ๛(&C)"
-
-#~ msgid "E240: No connection to Vim server"
-#~ msgstr "E240: รปำะตฝ Vim ทฮ๑ฦ๗ตฤมฌฝำ"
-
-#~ msgid "E241: Unable to send to %s"
-#~ msgstr "E241: ฮทจทขหอตฝ %s"
-
-#~ msgid "E277: Unable to read a server reply"
-#~ msgstr "E277: ฮทจถมศกทฮ๑ฦ๗ฯ์ำฆ"
-
-#~ msgid "E258: Unable to send to client"
-#~ msgstr "E258: ฮทจทขหอตฝฟอปงถห"
-
-#~ msgid "Save As"
-#~ msgstr "มํดๆฮช"
-
-#~ msgid "Edit File"
-#~ msgstr "ฑเผญฮฤผ"
-
-#~ msgid " (NOT FOUND)"
-#~ msgstr " (ีาฒปตฝ)"
-
-#~ msgid "Source Vim script"
-#~ msgstr "ึดะะ Vim ฝลฑพ"
-
-#~ msgid "Edit File in new window"
-#~ msgstr "ิฺะยดฐฟฺฑเผญฮฤผ"
-
-#~ msgid "Append File"
-#~ msgstr "ืทผำฮฤผ"
-
-#~ msgid "Window position: X %d, Y %d"
-#~ msgstr "ดฐฟฺฮปึร: X %d, Y %d"
-
-#~ msgid "Save Redirection"
-#~ msgstr "ฑฃดๆึุถจฯ๒"
-
-#~ msgid "Save View"
-#~ msgstr "ฑฃดๆสำอผ"
-
-#~ msgid "Save Session"
-#~ msgstr "ฑฃดๆปแปฐ"
-
-#~ msgid "Save Setup"
-#~ msgstr "ฑฃดๆษ่ถจ"
-
-#~ msgid "E196: No digraphs in this version"
-#~ msgstr "E196: ดหฐๆฑพฮธดบฯืึท๛(digraph)"
-
-#~ msgid "Reading from stdin..."
-#~ msgstr "ดำฑ๊ืผสไศ๋ถมศก..."
-
-#~ msgid "[NL found]"
-#~ msgstr "[ีาตฝ NL]"
-
-#~ msgid "[crypted]"
-#~ msgstr "[าัผำร]"
-
-#~ msgid "NetBeans disallows writes of unmodified buffers"
-#~ msgstr "NetBeans ฒปิสะํฮดะธฤตฤปบณๅว๘ะดศ๋"
-
-#~ msgid "Partial writes disallowed for NetBeans buffers"
-#~ msgstr "NetBeans ฒปิสะํปบณๅว๘ฒฟทึะดศ๋"
-
-#~ msgid "E460: The resource fork would be lost (add ! to override)"
-#~ msgstr "E460: Resource fork ปแถชสง (ว๋ผำ ! วฟึฦึดะะ)"
-
-#~ msgid "E229: Cannot start the GUI"
-#~ msgstr "E229: ฮทจฦ๔ถฏอผะฮฝ็รๆ"
-
-#~ msgid "E230: Cannot read from \"%s\""
-#~ msgstr "E230: ฮทจถมศกฮฤผ \"%s\""
-
-#~ msgid "E665: Cannot start GUI, no valid font found"
-#~ msgstr "E665: ฮทจฦ๔ถฏอผะฮฝ็รๆฃฌีาฒปตฝำะะงตฤืึฬๅ"
-
-#~ msgid "E231: 'guifontwide' invalid"
-#~ msgstr "E231: ฮะงตฤ 'guifontwide'"
-
-#~ msgid "E599: Value of 'imactivatekey' is invalid"
-#~ msgstr "E599: 'imactivatekey' ตฤึตฮะง"
-
-#~ msgid "E254: Cannot allocate color %s"
-#~ msgstr "E254: ฮทจทึลไัีษซ %s"
-
-#~ msgid "No match at cursor, finding next"
-#~ msgstr "ิฺนโฑ๊ดฆรปำะฦฅลไฃฌฒ้ีาฯยาปธ๖"
-
-#~ msgid "<cannot open> "
-#~ msgstr "<ฮทจด๒ฟช>"
-
-#~ msgid "E616: vim_SelFile: can't get font %s"
-#~ msgstr "E616: vim_SelFile: ฮทจป๑ศกืึฬๅ %s"
-
-#~ msgid "E614: vim_SelFile: can't return to current directory"
-#~ msgstr "E614: vim_SelFile: ฮทจทตปุตฑวฐฤฟยผ"
-
-#~ msgid "Pathname:"
-#~ msgstr "ยทพถ:"
-
-#~ msgid "E615: vim_SelFile: can't get current directory"
-#~ msgstr "E615: vim_SelFile: ฮทจป๑ศกตฑวฐฤฟยผ"
-
-#~ msgid "OK"
-#~ msgstr "ศทถจ"
-
-#~ msgid "Cancel"
-#~ msgstr "ศกฯ๛"
-
-#~ msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
-#~ msgstr "น๖ถฏฬ๕ฒฟผ: ฮทจป๑ศกปฌฟ้อผฯ๑ตฤผธบฮด๓ะก"
-
-#~ msgid "Vim dialog"
-#~ msgstr "Vim ถิปฐฟ๒"
-
-#~ msgid "E232: Cannot create BalloonEval with both message and callback"
-#~ msgstr "E232: ฒปฤอฌสฑสนำรฯ๛ฯขบอปุต๗บฏสภดดดฝจ BalloonEval"
-
-#~ msgid "Vim dialog..."
-#~ msgstr "Vim ถิปฐฟ๒..."
-
-#~ msgid "Input _Methods"
-#~ msgstr "สไศ๋ทจ(_M)"
-
-#~ msgid "VIM - Search and Replace..."
-#~ msgstr "VIM - ฒ้ีาบอฬๆปป..."
-
-#~ msgid "VIM - Search..."
-#~ msgstr "VIM - ฒ้ีา..."
-
-#~ msgid "Find what:"
-#~ msgstr "ฒ้ีาฤฺศ:"
-
-#~ msgid "Replace with:"
-#~ msgstr "ฬๆปปฮช:"
-
-#~ msgid "Match whole word only"
-#~ msgstr "ฦฅลไอ๊ี๛ตฤดส"
-
-#~ msgid "Match case"
-#~ msgstr "ฦฅลได๓ะกะด"
-
-#~ msgid "Direction"
-#~ msgstr "ทฝฯ๒"
-
-#~ msgid "Up"
-#~ msgstr "ฯ๒ษฯ"
-
-#~ msgid "Down"
-#~ msgstr "ฯ๒ฯย"
-
-#~ msgid "Find Next"
-#~ msgstr "ฒ้ีาฯยาปธ๖"
-
-#~ msgid "Replace"
-#~ msgstr "ฬๆปป"
-
-#~ msgid "Replace All"
-#~ msgstr "ศซฒฟฬๆปป"
-
-#~ msgid "Vim: Received \"die\" request from session manager\n"
-#~ msgstr "Vim: ดำปแปฐนภํฦ๗สีตฝ \"die\" ว๋ว๓\n"
-
-#~ msgid "Close"
-#~ msgstr "นุฑี"
-
-#~ msgid "New tab"
-#~ msgstr "ะยฝจฑ๊วฉ"
-
-#~ msgid "Open Tab..."
-#~ msgstr "ด๒ฟชฑ๊วฉ..."
-
-#~ msgid "Vim: Main window unexpectedly destroyed\n"
-#~ msgstr "Vim: ึ๗ดฐฟฺฑปาโอโตุดปู\n"
-
-#~ msgid "Font Selection"
-#~ msgstr "ักิ๑ืึฬๅ"
-
-#~ msgid "Used CUT_BUFFER0 instead of empty selection"
-#~ msgstr "สนำร CUT_BUFFER0 ภดศกด๚ฟีักิ๑"
-
-#~ msgid "&Filter"
-#~ msgstr "นยห(&F)"
-
-#~ msgid "&Cancel"
-#~ msgstr "ศกฯ๛(&C)"
-
-#~ msgid "Directories"
-#~ msgstr "ฤฟยผ"
-
-#~ msgid "Filter"
-#~ msgstr "นยหฦ๗"
-
-#~ msgid "&Help"
-#~ msgstr "ฐ๏ึ๚(&H)"
-
-#~ msgid "Files"
-#~ msgstr "ฮฤผ"
-
-#~ msgid "&OK"
-#~ msgstr "ศทถจ(&O)"
-
-#~ msgid "Selection"
-#~ msgstr "ักิ๑"
-
-#~ msgid "Find &Next"
-#~ msgstr "ฒ้ีาฯยาปธ๖(&N)"
-
-#~ msgid "&Replace"
-#~ msgstr "ฬๆปป(&R)"
-
-#~ msgid "Replace &All"
-#~ msgstr "ศซฒฟฬๆปป(&A)"
-
-#~ msgid "&Undo"
-#~ msgstr "ณทฯ๚(&U)"
-
-#~ msgid "E671: Cannot find window title \"%s\""
-#~ msgstr "E671: ีาฒปตฝดฐฟฺฑ๊ฬโ \"%s\""
-
-#~ msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
-#~ msgstr "E243: ฒปึงณึตฤฒฮส: \"-%s\"ฃปว๋สนำร OLE ฐๆฑพกฃ"
-
-#~ msgid "E672: Unable to open window inside MDI application"
-#~ msgstr "E672: ฮทจิฺ MDI ำฆำรณฬะ๒ึะด๒ฟชดฐฟฺ"
-
-#~ msgid "Close tab"
-#~ msgstr "นุฑีฑ๊วฉ"
-
-#~ msgid "Open tab..."
-#~ msgstr "ด๒ฟชฑ๊วฉ..."
-
-#~ msgid "Find string (use '\\\\' to find a '\\')"
-#~ msgstr "ฒ้ีาืึท๛ดฎ (สนำร '\\\\' ภดฒ้ีา '\\')"
-
-#~ msgid "Find & Replace (use '\\\\' to find a '\\')"
-#~ msgstr "ฒ้ีาบอฬๆปปืึท๛ดฎ (สนำร '\\\\' ภดฒ้ีา '\\')"
-
-#~ msgid "Not Used"
-#~ msgstr "ฮดสนำร"
-
-#~ msgid "Directory\t*.nothing\n"
-#~ msgstr "ฤฟยผ\t*.nothing\n"
-
-#~ msgid ""
-#~ "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
-#~ msgstr "Vim E458: ฮทจทึลไัีษซฑํฯ๎ฃฌฤณะฉัีษซฟษฤฒปีศท"
-
-#~ msgid "E250: Fonts for the following charsets are missing in fontset %s:"
-#~ msgstr "E250: Fontset %s ศฑษูฯยมะืึท๛ผฏตฤืึฬๅ:"
-
-#~ msgid "E252: Fontset name: %s"
-#~ msgstr "E252: Fontset ร๛ณฦ: %s"
-
-#~ msgid "Font '%s' is not fixed-width"
-#~ msgstr "'%s' ฒปสวนฬถจฟํถศตฤืึฬๅ"
-
-#~ msgid "E253: Fontset name: %s\n"
-#~ msgstr "E253: Fontset ร๛ณฦ: %s\n"
-
-#~ msgid "Font0: %s\n"
-#~ msgstr "ืึฬๅ0: %s\n"
-
-#~ msgid "Font1: %s\n"
-#~ msgstr "ืึฬๅ1: %s\n"
-
-#~ msgid "Font%<PRId64> width is not twice that of font0\n"
-#~ msgstr "ืึฬๅ%<PRId64>ตฤฟํถศฒปสวืึฬๅ0ตฤมฝฑถ\n"
-
-#~ msgid "Font0 width: %<PRId64>\n"
-#~ msgstr "ืึฬๅ0ตฤฟํถศฃบ%<PRId64>\n"
-
-#~ msgid ""
-#~ "Font1 width: %<PRId64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "ืึฬๅ1ตฤฟํถศ: %<PRId64>\n"
-#~ "\n"
-
-#~ msgid "Invalid font specification"
-#~ msgstr "ึธถจมหฮะงตฤืึฬๅ"
-
-#~ msgid "&Dismiss"
-#~ msgstr "ศกฯ๛(&D)"
-
-#~ msgid "no specific match"
-#~ msgstr "ีาฒปตฝฦฅลไตฤฯ๎"
-
-#~ msgid "Vim - Font Selector"
-#~ msgstr "Vim - ืึฬๅักิ๑ฦ๗"
-
-#~ msgid "Name:"
-#~ msgstr "ร๛ณฦ:"
-
-#~ msgid "Encoding:"
-#~ msgstr "ฑเย๋:"
-
-#~ msgid "Font:"
-#~ msgstr "ืึฬๅ:"
-
-#~ msgid "Style:"
-#~ msgstr "ท็ธ๑:"
-
-#~ msgid "Size:"
-#~ msgstr "ณ฿ด็:"
-
-#~ msgid "E256: Hangul automata ERROR"
-#~ msgstr "E256: Hangul automata ดํฮ๓"
-
-#~ msgid "E563: stat error"
-#~ msgstr "E563: stat ดํฮ๓"
-
-#~ msgid "E625: cannot open cscope database: %s"
-#~ msgstr "E625: ฮทจด๒ฟช cscope สพฟโ: %s"
-
-#~ msgid "E626: cannot get cscope database information"
-#~ msgstr "E626: ฮทจป๑ศก cscope สพฟโะลฯข"
-
-#~ msgid "E569: maximum number of cscope connections reached"
-#~ msgstr "E569: าัด๏ตฝ cscope ตฤื๎ด๓มฌฝำส"
-
-#~ msgid ""
-#~ "???: Sorry, this command is disabled, the MzScheme library could not be "
-#~ "loaded."
-#~ msgstr "???: ฑงวธฃฌดหรม๎ฒปฟษำรฃฌฮทจผำิุ MzScheme ฟโ"
-
-#~ msgid "invalid expression"
-#~ msgstr "ฮะงตฤฑํด๏สฝ"
-
-#~ msgid "expressions disabled at compile time"
-#~ msgstr "ฑเา๋สฑรปำะฦ๔ำรฑํด๏สฝ"
-
-#~ msgid "hidden option"
-#~ msgstr "าฒุตฤักฯ๎"
-
-#~ msgid "unknown option"
-#~ msgstr "ฮดึชตฤักฯ๎"
-
-#~ msgid "window index is out of range"
-#~ msgstr "ดฐฟฺห๗าณฌณ๖ทถฮง"
-
-#~ msgid "couldn't open buffer"
-#~ msgstr "ฮทจด๒ฟชปบณๅว๘"
-
-#~ msgid "cannot save undo information"
-#~ msgstr "ฮทจฑฃดๆณทฯ๚ะลฯข"
-
-#~ msgid "cannot delete line"
-#~ msgstr "ฮทจษพณะะ"
-
-#~ msgid "cannot replace line"
-#~ msgstr "ฮทจฬๆปปะะ"
-
-#~ msgid "cannot insert line"
-#~ msgstr "ฮทจฒๅศ๋ะะ"
-
-#~ msgid "string cannot contain newlines"
-#~ msgstr "ืึท๛ดฎฒปฤฐบฌปปะะ(NL)"
-
-#~ msgid "Vim error: ~a"
-#~ msgstr "Vim ดํฮ๓: ~a"
-
-#~ msgid "Vim error"
-#~ msgstr "Vim ดํฮ๓"
-
-#~ msgid "buffer is invalid"
-#~ msgstr "ปบณๅว๘ฮะง"
-
-#~ msgid "window is invalid"
-#~ msgstr "ดฐฟฺฮะง"
-
-#~ msgid "linenr out of range"
-#~ msgstr "ะะบลณฌณ๖ทถฮง"
-
-#~ msgid "not allowed in the Vim sandbox"
-#~ msgstr "ฒปิสะํิฺ sandbox ึะสนำร"
-
-#~ msgid ""
-#~ "E263: Sorry, this command is disabled, the Python library could not be "
-#~ "loaded."
-#~ msgstr "E263: ฑงวธฃฌดหรม๎ฒปฟษำรฃฌฮทจผำิุ Python ฟโกฃ"
-
-#~ msgid "E659: Cannot invoke Python recursively"
-#~ msgstr "E659: ฒปฤตน้ต๗ำร Python"
-
-#~ msgid "can't delete OutputObject attributes"
-#~ msgstr "ฒปฤษพณ OutputObject ส๔ะิ"
-
-#~ msgid "softspace must be an integer"
-#~ msgstr "softspace ฑุะ๋สวี๛ส"
-
-#~ msgid "invalid attribute"
-#~ msgstr "ฮะงตฤส๔ะิ"
-
-#~ msgid "writelines() requires list of strings"
-#~ msgstr "writelines() ะ่าชืึท๛ดฎมะฑํื๗ฒฮส"
-
-#~ msgid "E264: Python: Error initialising I/O objects"
-#~ msgstr "E264: Python: ณ๕สผปฏ I/O ถิฯ๓ณ๖ดํ"
-
-#~ msgid "attempt to refer to deleted buffer"
-#~ msgstr "สิอผาำราัฑปษพณตฤปบณๅว๘"
-
-#~ msgid "line number out of range"
-#~ msgstr "ะะบลณฌณ๖ทถฮง"
-
-#~ msgid "<buffer object (deleted) at %8lX>"
-#~ msgstr "<ปบณๅว๘ถิฯ๓(าัษพณ): %8lX>"
-
-#~ msgid "invalid mark name"
-#~ msgstr "ฮะงตฤฑ๊ผวร๛ณฦ"
-
-#~ msgid "no such buffer"
-#~ msgstr "ฮดหปบณๅว๘"
-
-#~ msgid "attempt to refer to deleted window"
-#~ msgstr "สิอผาำราัฑปษพณตฤดฐฟฺ"
-
-#~ msgid "readonly attribute"
-#~ msgstr "ึปถมส๔ะิ"
-
-#~ msgid "cursor position outside buffer"
-#~ msgstr "นโฑ๊ฮปึริฺปบณๅว๘อโ"
-
-#~ msgid "<window object (deleted) at %.8lX>"
-#~ msgstr "<ดฐฟฺถิฯ๓(าัษพณ): %.8lX>"
-
-#~ msgid "<window object (unknown) at %.8lX>"
-#~ msgstr "<ดฐฟฺถิฯ๓(ฮดึช): %.8lX>"
-
-#~ msgid "<window %d>"
-#~ msgstr "<ดฐฟฺ %d>"
-
-#~ msgid "no such window"
-#~ msgstr "ฮดหดฐฟฺ"
-
-#~ msgid ""
-#~ "E266: Sorry, this command is disabled, the Ruby library could not be "
-#~ "loaded."
-#~ msgstr "E266: ฑงวธฃฌดหรม๎ฒปฟษำรฃฌฮทจผำิุ Ruby ฟโ"
-
-#~ msgid "E273: unknown longjmp status %d"
-#~ msgstr "E273: ฮดึชตฤ longjmp ืดฬฌ %d"
-
-#~ msgid "Toggle implementation/definition"
-#~ msgstr "วะปปสตฯึ/ถจาๅ"
-
-#~ msgid "Show base class of"
-#~ msgstr "ฯิสพ base class of:"
-
-#~ msgid "Show overridden member function"
-#~ msgstr "ฯิสพฑปธฒธวตฤณษิฑบฏส"
-
-#~ msgid "Retrieve from file"
-#~ msgstr "ปึธด: ดำฮฤผ"
-
-#~ msgid "Retrieve from project"
-#~ msgstr "ปึธด: ดำถิฯ๓"
-
-#~ msgid "Retrieve from all projects"
-#~ msgstr "ปึธด: ดำห๙ำะฯ๎ฤฟ"
-
-#~ msgid "Retrieve"
-#~ msgstr "ปึธด"
-
-#~ msgid "Show source of"
-#~ msgstr "ฯิสพิดด๚ย๋: "
-
-#~ msgid "Find symbol"
-#~ msgstr "ฒ้ีา symbol"
-
-#~ msgid "Browse class"
-#~ msgstr "ไฏภภ class"
-
-#~ msgid "Show class in hierarchy"
-#~ msgstr "ฯิสพฒใดฮนุฯตตฤภเ"
-
-#~ msgid "Show class in restricted hierarchy"
-#~ msgstr "ฯิสพ restricted ฒใดฮนุฯตตฤ class"
-
-#~ msgid "Xref refers to"
-#~ msgstr "Xref ฒฮฟผตฝ"
-
-#~ msgid "Xref referred by"
-#~ msgstr "Xref ฑปหญฒฮฟผ:"
-
-#~ msgid "Xref has a"
-#~ msgstr "Xref ำะ"
-
-#~ msgid "Xref used by"
-#~ msgstr "Xref ฑปหญสนำร:"
-
-#~ msgid "Show docu of"
-#~ msgstr "ฯิสพฮฤผ: "
-
-#~ msgid "Generate docu for"
-#~ msgstr "ฒ๚ษ๚ฮฤผ: "
-
-#~ msgid ""
-#~ "Cannot connect to SNiFF+. Check environment (sniffemacs must be found in "
-#~ "$PATH).\n"
-#~ msgstr ""
-#~ "ฒปฤมฌฝำตฝ SNiFF+กฃว๋ผ์ฒ้ปทพณฑไมฟ ($PATH ภ๏ฑุะ่ฟษาิีาตฝ sniffemacs)\n"
-
-#~ msgid "E274: Sniff: Error during read. Disconnected"
-#~ msgstr "E274: Sniff: ถมศกดํฮ๓. ศกฯ๛มฌฝำ"
-
-#~ msgid "SNiFF+ is currently "
-#~ msgstr "SNiFF+ ฤฟวฐ"
-
-#~ msgid "not "
-#~ msgstr "ฮด"
-
-#~ msgid "connected"
-#~ msgstr "มฌฝำึะ"
-
-#~ msgid "E275: Unknown SNiFF+ request: %s"
-#~ msgstr "E275: ฒปีศทตฤ SNiff+ ต๗ำร: %s"
-
-#~ msgid "E276: Error connecting to SNiFF+"
-#~ msgstr "E276: มฌฝำตฝ SNiFF+ สงฐ"
-
-#~ msgid "E278: SNiFF+ not connected"
-#~ msgstr "E278: ฮดมฌฝำตฝ SNiFF+"
-
-#~ msgid "E279: Not a SNiFF+ buffer"
-#~ msgstr "E279: ฒปสว SNiFF+ ตฤปบณๅว๘"
-
-#~ msgid "Sniff: Error during write. Disconnected"
-#~ msgstr "Sniff: ะดศ๋ดํฮ๓กฃฝแส๘มฌฝำ"
-
-#~ msgid "invalid buffer number"
-#~ msgstr "ฮะงตฤปบณๅว๘บล"
-
-#~ msgid "not implemented yet"
-#~ msgstr "ษะฮดสตฯึ"
-
-#~ msgid "cannot set line(s)"
-#~ msgstr "ฮทจษ่ถจะะ"
-
-#~ msgid "mark not set"
-#~ msgstr "รปำะษ่ถจฑ๊ผว"
-
-#~ msgid "row %d column %d"
-#~ msgstr "ตฺ %d ะะ ตฺ %d มะ"
-
-#~ msgid "cannot insert/append line"
-#~ msgstr "ฮทจฒๅศ๋/ืทผำะะ"
-
-#~ msgid "unknown flag: "
-#~ msgstr "ฮดึชตฤฑ๊ึพ: "
-
-#~ msgid "unknown vimOption"
-#~ msgstr "ฮดึชตฤ vim ักฯ๎"
-
-#~ msgid "keyboard interrupt"
-#~ msgstr "ผลฬึะถฯ"
-
-#~ msgid "vim error"
-#~ msgstr "vim ดํฮ๓"
-
-#~ msgid "cannot create buffer/window command: object is being deleted"
-#~ msgstr "ฮทจดดฝจปบณๅว๘/ดฐฟฺรม๎: ถิฯ๓ฝซฑปษพณ"
-
-#~ msgid ""
-#~ "cannot register callback command: buffer/window is already being deleted"
-#~ msgstr "ฮทจืขฒแปุต๗รม๎: ปบณๅว๘/ดฐฟฺาัฑปษพณ"
-
-#~ msgid ""
-#~ "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-"
-#~ "dev@vim.org"
-#~ msgstr "E280: TCL ัฯึุดํฮ๓: reflist ห๐ปตฃกฃฟว๋ฑจธๆธ๘ vim-dev@vim.org"
-
-#~ msgid "cannot register callback command: buffer/window reference not found"
-#~ msgstr "ฮทจืขฒแปุต๗รม๎: ีาฒปตฝปบณๅว๘/ดฐฟฺาำร"
-
-#~ msgid ""
-#~ "E571: Sorry, this command is disabled: the Tcl library could not be "
-#~ "loaded."
-#~ msgstr "E571: ฑงวธฃฌดหรม๎ฒปฟษำรฃฌฮทจผำิุ Tcl ฟโ"
-
-#~ msgid ""
-#~ "E281: TCL ERROR: exit code is not int!? Please report this to vim-dev@vim."
-#~ "org"
-#~ msgstr "E281: TCL ดํฮ๓: อหณ๖ทตปุึตฒปสวี๛สฃกฃฟว๋ฑจธๆธ๘ vim-dev@vim.org"
-
-#~ msgid "E572: exit code %d"
-#~ msgstr "E572: อหณ๖ทตปุึต %d"
-
-#~ msgid "cannot get line"
-#~ msgstr "ฮทจป๑ศกะะ"
-
-#~ msgid "Unable to register a command server name"
-#~ msgstr "ฮทจืขฒแรม๎ทฮ๑ฦ๗ร๛"
-
-#~ msgid "E248: Failed to send command to the destination program"
-#~ msgstr "E248: ฮทจทขหอรม๎ตฝฤฟตฤณฬะ๒"
-
-#~ msgid "E573: Invalid server id used: %s"
-#~ msgstr "E573: สนำรมหฮะงตฤทฮ๑ฦ๗ id: %s"
-
-#~ msgid "E251: VIM instance registry property is badly formed. Deleted!"
-#~ msgstr "E251: VIM สตภืขฒแส๔ะิำะฮ๓กฃาัษพณฃก"
-
-#~ msgid "This Vim was not compiled with the diff feature."
-#~ msgstr "ดห Vim ฑเา๋สฑรปำะผำศ๋ diff นฆฤ"
-
-#~ msgid "Vim: Error: Failure to start gvim from NetBeans\n"
-#~ msgstr "Vim: ดํฮ๓: ฮทจดำ NetBeans ึะฦ๔ถฏ gvim\n"
-
-#~ msgid "-register\t\tRegister this gvim for OLE"
-#~ msgstr "-register\t\tืขฒแดห gvim ตฝ OLE"
-
-#~ msgid "-unregister\t\tUnregister gvim for OLE"
-#~ msgstr "-unregister\t\tศกฯ๛ OLE ึะตฤ gvim ืขฒแ"
-
-#~ msgid "-g\t\t\tRun using GUI (like \"gvim\")"
-#~ msgstr "-g\t\t\tสนำรอผะฮฝ็รๆ (อฌ \"gvim\")"
-
-#~ msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
-#~ msgstr "-f ป๒ --nofork\tวฐฬจ: ฦ๔ถฏอผะฮฝ็รๆสฑฒป fork"
-
-#~ msgid "-V[N]\t\tVerbose level"
-#~ msgstr "-V[N]\t\tVerbose ตศผถ"
-
-#~ msgid "-f\t\t\tDon't use newcli to open window"
-#~ msgstr "-f\t\t\tฒปสนำร newcli ภดด๒ฟชดฐฟฺ"
-
-#~ msgid "-dev <device>\t\tUse <device> for I/O"
-#~ msgstr "-dev <device>\t\tสนำร <device> ฝ๘ะะสไศ๋สไณ๖"
-
-#~ msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
-#~ msgstr "-U <gvimrc>\t\tสนำร <gvimrc> ฬๆด๚ศฮบฮ .gvimrc"
-
-#~ msgid "-x\t\t\tEdit encrypted files"
-#~ msgstr "-x\t\t\tฑเผญผำรตฤฮฤผ"
-
-#~ msgid "-display <display>\tConnect vim to this particular X-server"
-#~ msgstr "-display <display>\tฝซ vim ำ๋ึธถจตฤ X-server มฌฝำ"
-
-#~ msgid "-X\t\t\tDo not connect to X server"
-#~ msgstr "-X\t\t\tฒปมฌฝำตฝ X Server"
-
-#~ msgid "--remote <files>\tEdit <files> in a Vim server if possible"
-#~ msgstr "--remote <files>\tศ็ำะฟษฤฃฌิฺ Vim ทฮ๑ฦ๗ษฯฑเผญฮฤผ <files>"
-
-#~ msgid "--remote-silent <files> Same, don't complain if there is no server"
-#~ msgstr "--remote-silent <files> อฌษฯฃฌีาฒปตฝทฮ๑ฦ๗สฑฒปฑงิน"
-
-#~ msgid ""
-#~ "--remote-wait <files> As --remote but wait for files to have been edited"
-#~ msgstr "--remote-wait <files> อฌ --remote ตซปแตศดฮฤผอ๊ณษฑเผญ"
-
-#~ msgid ""
-#~ "--remote-wait-silent <files> Same, don't complain if there is no server"
-#~ msgstr "--remote-wait-silent <files> อฌษฯฃฌีาฒปตฝทฮ๑ฦ๗สฑฒปฑงิน"
-
-#~ msgid "--remote-tab <files> As --remote but open tab page for each file"
-#~ msgstr "--remote-tab <files> อฌ --remote ตซถิรฟธ๖ฮฤผด๒ฟชาปธ๖ฑ๊วฉาณ"
-
-#~ msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
-#~ msgstr "--remote-send <keys>\tหอณ๖ <keys> ตฝ Vim ทฮ๑ฦ๗ฒขอหณ๖"
-
-#~ msgid ""
-#~ "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
-#~ msgstr "--remote-expr <expr>\tิฺ Vim ทฮ๑ฦ๗ษฯว๓ <expr> ตฤึตฒขด๒ำกฝแน๛"
-
-#~ msgid "--serverlist\t\tList available Vim server names and exit"
-#~ msgstr "--serverlist\t\tมะณ๖ฟษำรตฤ Vim ทฮ๑ฦ๗ร๛ณฦฒขอหณ๖"
-
-#~ msgid "--servername <name>\tSend to/become the Vim server <name>"
-#~ msgstr "--servername <name>\tทขหอตฝป๒ณษฮช Vim ทฮ๑ฦ๗ <name>"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Motif version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvim (Motif ฐๆฑพ) ฟษสถฑ๐ตฤฒฮส:\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (neXtaw version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvim (neXtaw ฐๆฑพ) ฟษสถฑ๐ตฤฒฮส:\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Athena version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvim (Athena ฐๆฑพ) ฟษสถฑ๐ตฤฒฮส:\n"
-
-#~ msgid "-display <display>\tRun vim on <display>"
-#~ msgstr "-display <display>\tิฺ <display> ษฯิหะะ vim"
-
-#~ msgid "-iconic\t\tStart vim iconified"
-#~ msgstr "-iconic\t\tฦ๔ถฏบ๓ื๎ะกปฏ"
-
-#~ msgid "-name <name>\t\tUse resource as if vim was <name>"
-#~ msgstr "-name <name>\t\tถมศก Resource สฑฐั vim สำฮช <name>"
-
-#~ msgid "\t\t\t (Unimplemented)\n"
-#~ msgstr "\t\t\t (ษะฮดสตฯึ)\n"
-
-#~ msgid "-background <color>\tUse <color> for the background (also: -bg)"
-#~ msgstr "-background <color>\tสนำร <color> ื๗ฮชฑณพฐษซ (าฒฟษำร -bg)"
-
-#~ msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
-#~ msgstr "-foreground <color>\tสนำร <color> ื๗ฮชาปฐใฮฤืึัีษซ (าฒฟษำร -fg)"
-
-#~ msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
-#~ msgstr "-font <font>\tสนำร <font> ื๗ฮชาปฐใืึฬๅ (าฒฟษำร -fn)"
-
-#~ msgid "-boldfont <font>\tUse <font> for bold text"
-#~ msgstr "-boldfont <font>\tสนำร <font> ื๗ฮชดึฬๅืึฬๅ"
-
-#~ msgid "-italicfont <font>\tUse <font> for italic text"
-#~ msgstr "-italicfont <font>\tสนำร <font> ื๗ฮชะฑฬๅืึฬๅ"
-
-#~ msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
-#~ msgstr "-geometry <geom>\tสนำร <geom> ื๗ฮชณ๕สผฮปึร (าฒฟษำร -geom)"
-
-#~ msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
-#~ msgstr "-borderwidth <width>\tษ่ถจฑ฿ฟ๒ฟํถศฮช <width> (าฒฟษำร -bw)"
-
-#~ msgid ""
-#~ "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
-#~ msgstr "-scrollbarwidth <width> ษ่ถจน๖ถฏฬ๕ฟํถศฮช <width> (าฒฟษำร -sw)"
-
-#~ msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
-#~ msgstr "-menuheight <height>\tษ่ถจฒหตฅภธธ฿ถศฮช <height> (าฒฟษำร -mh)"
-
-#~ msgid "-reverse\t\tUse reverse video (also: -rv)"
-#~ msgstr "-reverse\t\tสนำรทดฯิ (าฒฟษำร -rv)"
-
-#~ msgid "+reverse\t\tDon't use reverse video (also: +rv)"
-#~ msgstr "+reverse\t\tฒปสนำรทดฯิ (าฒฟษำร +rv)"
-
-#~ msgid "-xrm <resource>\tSet the specified resource"
-#~ msgstr "-xrm <resource>\tษ่ถจึธถจตฤืสิด"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (RISC OS version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvim (RISC OS ฐๆฑพ) ฟษสถฑ๐ตฤฒฮส:\n"
-
-#~ msgid "--columns <number>\tInitial width of window in columns"
-#~ msgstr "--columns <number>\tดฐฟฺณ๕สผฟํถศ"
-
-#~ msgid "--rows <number>\tInitial height of window in rows"
-#~ msgstr "--rows <number>\tดฐฟฺณ๕สผธ฿ถศ"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (GTK+ version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvim (GTK+ ฐๆฑพ) ฟษสถฑ๐ตฤฒฮส:\n"
-
-#~ msgid "-display <display>\tRun vim on <display> (also: --display)"
-#~ msgstr "-display <display>\tิฺ <display> ษฯิหะะ vim (าฒฟษำร --display)"
-
-#~ msgid "--role <role>\tSet a unique role to identify the main window"
-#~ msgstr "--role <role>\tษ่ึรำรำฺว๘ทึึ๗ดฐฟฺตฤดฐฟฺฝวษซร๛"
-
-#~ msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
-#~ msgstr "--socketid <xid>\tิฺมําปธ๖ GTK ฒฟผึะด๒ฟช Vim"
-
-#~ msgid "-P <parent title>\tOpen Vim inside parent application"
-#~ msgstr "-P <parent title>\tิฺธธำฆำรณฬะ๒ึะด๒ฟช Vim"
-
-#~ msgid "No display"
-#~ msgstr "รปำะ display"
-
-#~ msgid ": Send failed.\n"
-#~ msgstr ": ทขหอสงฐกฃ\n"
-
-#~ msgid ": Send failed. Trying to execute locally\n"
-#~ msgstr ": ทขหอสงฐกฃณขสิฑพตุึดะะ\n"
-
-#~ msgid "%d of %d edited"
-#~ msgstr "%d ึะ %d าัฑเผญ"
-
-#~ msgid "No display: Send expression failed.\n"
-#~ msgstr "รปำะ display: ทขหอฑํด๏สฝสงฐกฃ\n"
-
-#~ msgid ": Send expression failed.\n"
-#~ msgstr ": ทขหอฑํด๏สฝสงฐกฃ\n"
-
-#~ msgid "E543: Not a valid codepage"
-#~ msgstr "E543: ฮะงตฤด๚ย๋าณ"
-
-#~ msgid "E285: Failed to create input context"
-#~ msgstr "E285: ฮทจดดฝจสไศ๋ษฯฯยฮฤ"
-
-#~ msgid "E286: Failed to open input method"
-#~ msgstr "E286: ฮทจด๒ฟชสไศ๋ทจ"
-
-#~ msgid "E287: Warning: Could not set destroy callback to IM"
-#~ msgstr "E287: พฏธๆ: ฮทจษ่ถจสไศ๋ทจตฤสอทลปุต๗บฏส"
-
-#~ msgid "E288: input method doesn't support any style"
-#~ msgstr "E288: สไศ๋ทจฒปึงณึศฮบฮท็ธ๑"
-
-#~ msgid "E289: input method doesn't support my preedit type"
-#~ msgstr "E289: สไศ๋ทจฒปึงณึฮาตฤิคฑเผญภเะอ"
-
-#~ msgid "E290: over-the-spot style requires fontset"
-#~ msgstr "E290: over-the-spot ท็ธ๑ะ่าช Fontset"
-
-#~ msgid "E291: Your GTK+ is older than 1.2.3. Status area disabled"
-#~ msgstr "E291: ฤใตฤ GTK+ ฑศ 1.2.3 พษกฃืดฬฌว๘ฒปฟษำรกฃ"
-
-#~ msgid "E292: Input Method Server is not running"
-#~ msgstr "E292: สไศ๋ทจทฮ๑ฦ๗ฮดิหะะ"
-
-#~ msgid ""
-#~ "\n"
-#~ " [not usable with this version of Vim]"
-#~ msgstr ""
-#~ "\n"
-#~ " [ฒปฤิฺธรฐๆฑพตฤ Vim ษฯสนำร]"
-
-#~ msgid "Tear off this menu"
-#~ msgstr "หบฯยดหฒหตฅ"
-
-#~ msgid "Select Directory dialog"
-#~ msgstr "ักิ๑ฤฟยผถิปฐฟ๒"
-
-#~ msgid "Save File dialog"
-#~ msgstr "ฑฃดๆฮฤผถิปฐฟ๒"
-
-#~ msgid "Open File dialog"
-#~ msgstr "ด๒ฟชฮฤผถิปฐฟ๒"
-
-#~ msgid "E338: Sorry, no file browser in console mode"
-#~ msgstr "E338: ฑงวธฃฌฟุึฦฬจฤฃสฝฯยรปำะฮฤผไฏภภฦ๗"
-
-#~ msgid "Vim: preserving files...\n"
-#~ msgstr "Vim: ีิฺฑฃม๔ฮฤผกญกญ\n"
-
-#~ msgid "Vim: Finished.\n"
-#~ msgstr "Vim: ฝแส๘กฃ\n"
-
-#~ msgid "ERROR: "
-#~ msgstr "ดํฮ๓: "
-
-#~ msgid ""
-#~ "\n"
-#~ "[bytes] total alloc-freed %<PRIu64>-%<PRIu64>, in use %<PRIu64>, peak use "
-#~ "%<PRIu64>\n"
-#~ msgstr ""
-#~ "\n"
-#~ "[ืึฝฺ] ืนฒ alloc-free %<PRIu64>-%<PRIu64>ฃฌสนำรึะ %<PRIu64>ฃฌธ฿ทๅสนำร "
-#~ "%<PRIu64>\n"
-
-#~ msgid ""
-#~ "[calls] total re/malloc()'s %<PRIu64>, total free()'s %<PRIu64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "[ต๗ำร] ืนฒ re/malloc(): %<PRIu64>ฃฌืนฒ free()': %<PRIu64>\n"
-#~ "\n"
-
-#~ msgid "E340: Line is becoming too long"
-#~ msgstr "E340: ดหะะนณค"
-
-#~ msgid "E341: Internal error: lalloc(%<PRId64>, )"
-#~ msgstr "E341: ฤฺฒฟดํฮ๓: lalloc(%<PRId64>, )"
-
-#~ msgid "E547: Illegal mouseshape"
-#~ msgstr "E547: ฮะงตฤส๓ฑ๊ะฮืด"
-
-#~ msgid "Enter encryption key: "
-#~ msgstr "สไศ๋รย๋: "
-
-#~ msgid "Enter same key again: "
-#~ msgstr "ว๋ิูสไศ๋าปดฮ: "
-
-#~ msgid "Keys don't match!"
-#~ msgstr "มฝดฮรย๋ฒปฦฅลไฃก"
-
-#~ msgid "Cannot connect to Netbeans #2"
-#~ msgstr "ฮทจมฌฝำตฝ Netbeans #2"
-
-#~ msgid "Cannot connect to Netbeans"
-#~ msgstr "ฮทจมฌฝำตฝ Netbeans"
-
-#~ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
-#~ msgstr "E668: NetBeans มฌฝำะลฯขฮฤผึะดํฮ๓ตฤทรฮสฤฃสฝ: \"%s\""
-
-#~ msgid "read from Netbeans socket"
-#~ msgstr "ดำ Netbeans ฬืฝำืึถมศก"
-
-#~ msgid "E658: NetBeans connection lost for buffer %<PRId64>"
-#~ msgstr "E658: ปบณๅว๘ %<PRId64> ถชสง NetBeans มฌฝำ"
-
-#~ msgid "E505: "
-#~ msgstr "E505: "
-
-#~ msgid "E775: Eval feature not available"
-#~ msgstr "E775: ว๓ึตนฆฤฒปฟษำร"
-
-#~ msgid "freeing %<PRId64> lines"
-#~ msgstr "สอทลมห %<PRId64> ะะ"
-
-#~ msgid "E530: Cannot change term in GUI"
-#~ msgstr "E530: ิฺอผะฮฝ็รๆึะฒปฤธฤฑไึีถห"
-
-#~ msgid "E531: Use \":gui\" to start the GUI"
-#~ msgstr "E531: ว๋ำร \":gui\" ฦ๔ถฏอผะฮฝ็รๆ"
-
-#~ msgid "E617: Cannot be changed in the GTK+ 2 GUI"
-#~ msgstr "E617: ิฺ GTK+ 2 อผะฮฝ็รๆึะฒปฤธธฤ"
-
-#~ msgid "E596: Invalid font(s)"
-#~ msgstr "E596: ฮะงตฤืึฬๅ"
-
-#~ msgid "E597: can't select fontset"
-#~ msgstr "E597: ฮทจักิ๑ Fontset"
-
-#~ msgid "E598: Invalid fontset"
-#~ msgstr "E598: ฮะงตฤ Fontset"
-
-#~ msgid "E533: can't select wide font"
-#~ msgstr "E533: ฮทจักิ๑ฟํืึฬๅ"
-
-#~ msgid "E534: Invalid wide font"
-#~ msgstr "E534: ฮะงตฤฟํืึฬๅ"
-
-#~ msgid "E538: No mouse support"
-#~ msgstr "E538: ฒปึงณึส๓ฑ๊"
-
-#~ msgid "cannot open "
-#~ msgstr "ฒปฤด๒ฟช"
-
-#~ msgid "VIM: Can't open window!\n"
-#~ msgstr "VIM: ฒปฤด๒ฟชดฐฟฺ!\n"
-
-#~ msgid "Need Amigados version 2.04 or later\n"
-#~ msgstr "ะ่าช Amigados ฐๆฑพ 2.04 าิษฯ\n"
-
-#~ msgid "Need %s version %<PRId64>\n"
-#~ msgstr "ะ่าช %s ฐๆฑพ %<PRId64>\n"
-
-#~ msgid "Cannot open NIL:\n"
-#~ msgstr "ฒปฤด๒ฟช NIL:\n"
-
-#~ msgid "Cannot create "
-#~ msgstr "ฒปฤดดฝจ "
-
-#~ msgid "Vim exiting with %d\n"
-#~ msgstr "Vim ทตปุึต: %d\n"
-
-#~ msgid "cannot change console mode ?!\n"
-#~ msgstr "ฒปฤวะปปึ๗ฟุฬจ(console)ฤฃสฝ !?\n"
-
-#~ msgid "mch_get_shellsize: not a console??\n"
-#~ msgstr "mch_get_shellsize: ฒปสวึ๗ฟุฬจ(console)??\n"
-
-#~ msgid "E360: Cannot execute shell with -f option"
-#~ msgstr "E360: ฒปฤำร -f ักฯ๎ึดะะ shell"
-
-#~ msgid "Cannot execute "
-#~ msgstr "ฒปฤึดะะ "
-
-#~ msgid "shell "
-#~ msgstr "shell "
-
-#~ msgid " returned\n"
-#~ msgstr " าัทตปุ\n"
-
-#~ msgid "ANCHOR_BUF_SIZE too small."
-#~ msgstr "ANCHOR_BUF_SIZE ฬซะก"
-
-#~ msgid "I/O ERROR"
-#~ msgstr "I/O ดํฮ๓"
-
-#~ msgid "Message"
-#~ msgstr "ฯ๛ฯข"
-
-#~ msgid "'columns' is not 80, cannot execute external commands"
-#~ msgstr "'columns' ฒปสว 80, ฒปฤึดะะอโฒฟรม๎"
-
-#~ msgid "E237: Printer selection failed"
-#~ msgstr "E237: ักิ๑ด๒ำกป๚สงฐ"
-
-#~ msgid "to %s on %s"
-#~ msgstr "ดำ %s ตฝ %s"
-
-#~ msgid "E613: Unknown printer font: %s"
-#~ msgstr "E613: ฮดึชตฤด๒ำกป๚ืึฬๅ: %s"
-
-#~ msgid "E238: Print error: %s"
-#~ msgstr "E238: ด๒ำกดํฮ๓: %s"
-
-#~ msgid "Printing '%s'"
-#~ msgstr "ด๒ำก '%s'"
-
-#~ msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
-#~ msgstr "E244: ืึท๛ผฏ \"%s\" ฒปฤถิำฆืึฬๅ\"%s\""
-
-#~ msgid "E245: Illegal char '%c' in font name \"%s\""
-#~ msgstr "E245: ฒปีศทตฤืึท๛ '%c' ณ๖ฯึิฺืึฬๅร๛ณฦ \"%s\" ฤฺ"
-
-#~ msgid "Vim: Double signal, exiting\n"
-#~ msgstr "Vim: หซึุะลบลฃฌอหณ๖ึะ\n"
-
-#~ msgid "Vim: Caught deadly signal %s\n"
-#~ msgstr "Vim: ภนฝุตฝึยระลบล(deadly signal) %s\n"
-
-#~ msgid "Vim: Caught deadly signal\n"
-#~ msgstr "Vim: ภนฝุตฝึยระลบล(deadly signal)\n"
-
-#~ msgid "Opening the X display took %<PRId64> msec"
-#~ msgstr "ด๒ฟช X display ำรสฑ %<PRId64> ร๋"
-
-#~ msgid ""
-#~ "\n"
-#~ "Vim: Got X error\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Vim: X ดํฮ๓\n"
-
-#~ msgid "Testing the X display failed"
-#~ msgstr "ฒโสิ X display สงฐ"
-
-#~ msgid "Opening the X display timed out"
-#~ msgstr "ด๒ฟช X display ณฌสฑ"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot execute shell sh\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ฮทจึดะะ shell sh\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot create pipes\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ฮทจฝจมขนตภ\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot fork\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ฮทจ fork\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Command terminated\n"
-#~ msgstr ""
-#~ "\n"
-#~ "รม๎าัฝแส๘\n"
-
-#~ msgid "XSMP lost ICE connection"
-#~ msgstr "XSMP ถชสงมหตฝ ICE ตฤมฌฝำ"
-
-#~ msgid "Opening the X display failed"
-#~ msgstr "ด๒ฟช X display สงฐ"
-
-#~ msgid "XSMP handling save-yourself request"
-#~ msgstr "XSMP ดฆภํ save-yourself ว๋ว๓"
-
-#~ msgid "XSMP opening connection"
-#~ msgstr "XSMP ด๒ฟชมฌฝำ"
-
-#~ msgid "XSMP ICE connection watch failed"
-#~ msgstr "XSMP ICE มฌฝำผเสำสงฐ"
-
-#~ msgid "XSMP SmcOpenConnection failed: %s"
-#~ msgstr "XSMP SmcOpenConnection ต๗ำรสงฐ: %s"
-
-#~ msgid "At line"
-#~ msgstr "ิฺะะบล "
-
-#~ msgid "Could not load vim32.dll!"
-#~ msgstr "ฮทจผำิุ vim32.dllฃก"
-
-#~ msgid "VIM Error"
-#~ msgstr "VIM ดํฮ๓"
-
-#~ msgid "Could not fix up function pointers to the DLL!"
-#~ msgstr "ฮทจะีตฝ DLL ตฤบฏสึธี๋!"
-
-#~ msgid "shell returned %d"
-#~ msgstr "Shell ทตปุ %d"
-
-#~ msgid "Vim: Caught %s event\n"
-#~ msgstr "Vim: ภนฝุตฝ %s สยผ\n"
-
-#~ msgid "close"
-#~ msgstr "นุฑี"
-
-#~ msgid "logoff"
-#~ msgstr "ืขฯ๛"
-
-#~ msgid "shutdown"
-#~ msgstr "นุป๚"
-
-#~ msgid "E371: Command not found"
-#~ msgstr "E371: ีาฒปตฝรม๎"
-
-#~ msgid ""
-#~ "VIMRUN.EXE not found in your $PATH.\n"
-#~ "External commands will not pause after completion.\n"
-#~ "See :help win32-vimrun for more information."
-#~ msgstr ""
-#~ "ิฺฤใตฤ $PATH ึะีาฒปตฝ VIMRUN.EXEกฃ\n"
-#~ "อโฒฟรม๎ึดะะอ๊ฑฯบ๓ฝซฒปปแิอฃกฃ\n"
-#~ "ฝ๘าปฒฝหตร๗ว๋ผ๛ :help win32-vimrun"
-
-#~ msgid "Vim Warning"
-#~ msgstr "Vim พฏธๆ"
-
-#~ msgid "Conversion in %s not supported"
-#~ msgstr "ฒปึงณึ %s ึะตฤืชปป"
-
-#~ msgid "E396: containedin argument not accepted here"
-#~ msgstr "E396: สนำรมหฒปีศทตฤฒฮส"
-
-#~ msgid "E430: Tag file path truncated for %s\n"
-#~ msgstr "E430: Tag ฮฤผยทพถฑปฝุถฯฮช %s\n"
-
-#~ msgid "new shell started\n"
-#~ msgstr "ฦ๔ถฏะย shell\n"
-
-#~ msgid "No undo possible; continue anyway"
-#~ msgstr "ฮทจณทฯ๚ฃปว๋ผฬะ๘"
-
-#~ msgid "number changes time"
-#~ msgstr " ฑเบล ธฤฑไ สฑผไ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16/32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 16/32 ฮปอผะฮฝ็รๆฐๆฑพ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 32 ฮปอผะฮฝ็รๆฐๆฑพ"
-
-#~ msgid " in Win32s mode"
-#~ msgstr " Win32s ฤฃสฝ"
-
-#~ msgid " with OLE support"
-#~ msgstr " ด๘ OLE ึงณึ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 32 ฮปฟุึฦฬจฐๆฑพ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16-bit version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 16 ฮปฟุึฦฬจฐๆฑพ"
-
-#~ msgid ""
-#~ "\n"
-#~ "32-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "32 ฮป MS-DOS ฐๆฑพ"
-
-#~ msgid ""
-#~ "\n"
-#~ "16-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "16 ฮป MS-DOS ฐๆฑพ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X (unix) version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS X (unix) ฐๆฑพ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS X ฐๆฑพ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS ฐๆฑพ"
-
-#~ msgid ""
-#~ "\n"
-#~ "RISC OS version"
-#~ msgstr ""
-#~ "\n"
-#~ "RISC OS ฐๆฑพ"
-
-#~ msgid ""
-#~ "\n"
-#~ "Big version "
-#~ msgstr ""
-#~ "\n"
-#~ "ด๓ะอฐๆฑพ "
-
-#~ msgid ""
-#~ "\n"
-#~ "Normal version "
-#~ msgstr ""
-#~ "\n"
-#~ "ีณฃฐๆฑพ "
-
-#~ msgid ""
-#~ "\n"
-#~ "Small version "
-#~ msgstr ""
-#~ "\n"
-#~ "ะกะอฐๆฑพ "
-
-#~ msgid ""
-#~ "\n"
-#~ "Tiny version "
-#~ msgstr ""
-#~ "\n"
-#~ "ฮขะอฐๆฑพ "
-
-#~ msgid "with GTK2-GNOME GUI."
-#~ msgstr "ด๘ GTK2-GNOME อผะฮฝ็รๆกฃ"
-
-#~ msgid "with GTK-GNOME GUI."
-#~ msgstr "ด๘ GTK-GNOME อผะฮฝ็รๆกฃ"
-
-#~ msgid "with GTK2 GUI."
-#~ msgstr "ด๘ GTK2 อผะฮฝ็รๆกฃ"
-
-#~ msgid "with GTK GUI."
-#~ msgstr "ด๘ GTK อผะฮฝ็รๆกฃ"
-
-#~ msgid "with X11-Motif GUI."
-#~ msgstr "ด๘ X11-Motif อผะฮฝ็รๆกฃ"
-
-#~ msgid "with X11-neXtaw GUI."
-#~ msgstr "ด๘ X11-neXtaw อผะฮฝ็รๆกฃ"
-
-#~ msgid "with X11-Athena GUI."
-#~ msgstr "ด๘ X11-Athena อผะฮฝ็รๆกฃ"
-
-#~ msgid "with Photon GUI."
-#~ msgstr "ด๘ Photon อผะฮฝ็รๆกฃ"
-
-#~ msgid "with GUI."
-#~ msgstr "ด๘อผะฮฝ็รๆกฃ"
-
-#~ msgid "with Carbon GUI."
-#~ msgstr "ด๘ Carbon อผะฮฝ็รๆกฃ"
-
-#~ msgid "with Cocoa GUI."
-#~ msgstr "ด๘ Cocoa อผะฮฝ็รๆกฃ"
-
-#~ msgid "with (classic) GUI."
-#~ msgstr "ด๘(ดซอณ)อผะฮฝ็รๆกฃ"
-
-#~ msgid " system gvimrc file: \""
-#~ msgstr " ฯตอณ gvimrc ฮฤผ: \""
-
-#~ msgid " user gvimrc file: \""
-#~ msgstr " ำรปง gvimrc ฮฤผ: \""
-
-#~ msgid "2nd user gvimrc file: \""
-#~ msgstr "ตฺถำรปง gvimrc ฮฤผ: \""
-
-#~ msgid "3rd user gvimrc file: \""
-#~ msgstr "ตฺศำรปง gvimrc ฮฤผ: \""
-
-#~ msgid " system menu file: \""
-#~ msgstr " ฯตอณฒหตฅฮฤผ: \""
-
-#~ msgid "Compiler: "
-#~ msgstr "ฑเา๋ฦ๗: "
-
-#~ msgid "menu Help->Orphans for information "
-#~ msgstr "ฒหตฅ Help->Orphans ฒ้ฟดหตร๗ "
-
-#~ msgid "Running modeless, typed text is inserted"
-#~ msgstr "ฮฤฃสฝิหะะฃฌสไศ๋ฮฤืึผดฒๅศ๋"
-
-#~ msgid "menu Edit->Global Settings->Toggle Insert Mode "
-#~ msgstr "ฒหตฅ Edit->Global Settings->Toggle Insert Mode "
-
-#, fuzzy
-#~ msgid " for two modes "
-#~ msgstr " # pid สพฟโร๛ณฦ prepend path\n"
-
-#, fuzzy
-#~ msgid " for Vim defaults "
-#~ msgstr " # pid สพฟโร๛ณฦ prepend path\n"
-
-#~ msgid "WARNING: Windows 95/98/ME detected"
-#~ msgstr "พฏธๆ: ผ์ฒโตฝ Windows 95/98/ME"
-
-#~ msgid "type :help windows95<Enter> for info on this"
-#~ msgstr "สไศ๋ :help windows95<Enter> ฒ้ฟดฯเนุหตร๗ "
-
-#~ msgid "E370: Could not load library %s"
-#~ msgstr "E370: ฮทจผำิุฟโ %s"
-
-#~ msgid ""
-#~ "Sorry, this command is disabled: the Perl library could not be loaded."
-#~ msgstr "ฑงวธฃฌดหรม๎ฒปฟษำร: ฮทจผำิุ Perl ฟโกฃ"
-
-#~ msgid "Edit with &multiple Vims"
-#~ msgstr "ำรถเธ๖ Vim ฑเผญ(&M)"
-
-#~ msgid "Edit with single &Vim"
-#~ msgstr "ำรตฅธ๖ Vim ฑเผญ(&V)"
-
-#~ msgid "Diff with Vim"
-#~ msgstr "ำร Vim ฑศฝฯ(diff)"
-
-#~ msgid "Edit with &Vim"
-#~ msgstr "ำร Vim ฑเผญ(&V)"
-
-#~ msgid "Edit with existing Vim - "
-#~ msgstr "ำรตฑวฐตฤ Vim ฑเผญ - "
-
-#~ msgid "Edits the selected file(s) with Vim"
-#~ msgstr "ำร Vim ฑเผญักึะตฤฮฤผ"
-
-#~ msgid "Error creating process: Check if gvim is in your path!"
-#~ msgstr "ดดฝจฝ๘ณฬสงฐ: ว๋ผ์ฒ้ gvim สวท๑ิฺยทพถึะฃก"
-
-#~ msgid "gvimext.dll error"
-#~ msgstr "gvimext.dll ดํฮ๓"
-
-#~ msgid "Path length too long!"
-#~ msgstr "ยทพถฬซณคฃก"
-
-#~ msgid "E234: Unknown fontset: %s"
-#~ msgstr "E234: ฮดึชตฤ Fontset: %s"
-
-#~ msgid "E235: Unknown font: %s"
-#~ msgstr "E235: ฮดึชตฤืึฬๅ: %s"
-
-#~ msgid "E236: Font \"%s\" is not fixed-width"
-#~ msgstr "E236: ืึฬๅ \"%s\" ฒปสวตศฟํืึฬๅ"
-
-#~ msgid "E448: Could not load library function %s"
-#~ msgstr "E448: ฮทจผำิุฟโบฏส %s"
-
-#~ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
-#~ msgstr "E26: ฮทจสนำร Hebrew: ฑเา๋สฑรปำะฦ๔ำร\n"
-
-#~ msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
-#~ msgstr "E27: ฮทจสนำร Farsi: ฑเา๋สฑรปำะฦ๔ำร\n"
-
-#~ msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
-#~ msgstr "E800: ฮทจสนำร Arabic: ฑเา๋สฑรปำะฦ๔ำร\n"
-
-#~ msgid "E247: no registered server named \"%s\""
-#~ msgstr "E247: รปำะร๛ฝะ \"%s\" ตฤาัืขฒแตฤทฮ๑ฦ๗"
-
-#~ msgid "E233: cannot open display"
-#~ msgstr "E233: ฮทจด๒ฟช display"
-
-#~ msgid "E449: Invalid expression received"
-#~ msgstr "E449: สีตฝฮะงตฤฑํด๏สฝ"
-
-#~ msgid "E744: NetBeans does not allow changes in read-only files"
-#~ msgstr "E744: NetBeans ฒปิสะํธฤฑไึปถมฮฤผ"
-
-#~ msgid "Affix flags ignored when PFXPOSTPONE used in %s line %d: %s"
-#~ msgstr "%s ตฺ %d ะะฃฌสนำร PFXPOSTPONE สฑธฝผำฑ๊ึพฑปบ๖ยิ: %s"
-
-#~ msgid "[No file]"
-#~ msgstr "[ฮดรร๛]"
-
-#~ msgid "[Error List]"
-#~ msgstr "[ดํฮ๓มะฑํ]"
-
-#~ msgid "E106: Unknown variable: \"%s\""
-#~ msgstr "E106: ฮดถจาๅตฤฑไมฟ: \"%s\""
-
-#~ msgid "function "
-#~ msgstr "บฏส "
-
-#~ msgid "E130: Undefined function: %s"
-#~ msgstr "E130: บฏส %s ษะฮดถจาๅ"
-
-#~ msgid "Run Macro"
-#~ msgstr "ึดะะบ๊"
-
-#~ msgid "E242: Color name not recognized: %s"
-#~ msgstr "E242: %s ฮชฒปฤสถฑ๐ตฤัีษซร๛ณฦ"
-
-#~ msgid "error reading cscope connection %d"
-#~ msgstr "ถมศก cscope มฌฝำ %d สฑดํฮ๓"
-
-#~ msgid "E260: cscope connection not found"
-#~ msgstr "E260: ีาฒปตฝ cscope มฌฝำ"
-
-#~ msgid "cscope connection closed"
-#~ msgstr "cscope มฌฝำาันุฑี"
-
-#~ msgid "couldn't malloc\n"
-#~ msgstr "ฒปฤสนำร malloc\n"
-
-#~ msgid "%2d %-5ld %-34s <none>\n"
-#~ msgstr "%2d %-5ld %-34s <ฮ>\n"
-
-#~ msgid "E249: couldn't read VIM instance registry property"
-#~ msgstr "E249: ฒปฤถมศก VIM ตฤ ืขฒแฑํส๔ะิ"
-
-#~ msgid "\"\n"
-#~ msgstr "\"\n"
-
-#~ msgid "--help\t\tShow Gnome arguments"
-#~ msgstr "--help\t\tฯิสพ Gnome ฯเนุฒฮส"
-
-#~ msgid "[string too long]"
-#~ msgstr "[ืึท๛ดฎฬซณค]"
-
-#~ msgid "Hit ENTER to continue"
-#~ msgstr "ว๋ฐด ENTER ผฬะ๘"
-
-#~ msgid " (RET/BS: line, SPACE/b: page, d/u: half page, q: quit)"
-#~ msgstr " (RET/BS: ฯ๒ฯย/ฯ๒ษฯาปะะ, ฟีธ๑/b: าปาณ, d/u: ฐ๋าณ, q: อหณ๖)"
-
-#~ msgid " (RET: line, SPACE: page, d: half page, q: quit)"
-#~ msgstr " (RET: ฯ๒ฯยาปะะ, ฟีฐืผ: าปาณ, d: ฐ๋าณ, q: อหณ๖)"
-
-#~ msgid "E361: Crash intercepted; regexp too complex?"
-#~ msgstr "E361: ฒปฤึดะะ; regular expression ฬซธดิำ?"
-
-#~ msgid "E363: pattern caused out-of-stack error"
-#~ msgstr "E363: regular expression ิ์ณษถัีปำรนโตฤดํฮ๓"
-
-#~ msgid " BLOCK"
-#~ msgstr " ฟ้"
-
-#~ msgid " LINE"
-#~ msgstr " ะะ"
-
-#~ msgid "Enter nr of choice (<CR> to abort): "
-#~ msgstr "สไศ๋ nr ป๒ักิ๑ (<CR> อหณ๖): "
-
-#~ msgid "Linear tag search"
-#~ msgstr "ฯ฿ะิฒ้ีาฑ๊วฉ (Tags)"
-
-#~ msgid "Binary tag search"
-#~ msgstr "ถฝ๘ึฦฒ้ีา(Binary search) ฑ๊วฉ(Tags)"
-
-#~ msgid "with BeOS GUI."
-#~ msgstr "สนำร BeOS อผะฮฝ็รๆกฃ"
diff --git a/src/nvim/po/zh_TW.UTF-8.po b/src/nvim/po/zh_TW.UTF-8.po
index 79e09c83d1..3c1dd463b7 100644
--- a/src/nvim/po/zh_TW.UTF-8.po
+++ b/src/nvim/po/zh_TW.UTF-8.po
@@ -2509,10 +2509,10 @@ msgstr "E216: ็„กๆญค็พค็ต„ๆˆ–ไบ‹ไปถ: %s"
#: ../fileio.c:6090
msgid ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
msgstr ""
"\n"
-"--- Auto-Commands ---"
+"--- Autocommands ---"
#: ../fileio.c:6293
#, fuzzy, c-format
@@ -2533,8 +2533,8 @@ msgstr "E218: autocommand ๅฑคๆ•ธ้Žๆทฑ"
#: ../fileio.c:7143
#, c-format
-msgid "%s Auto commands for \"%s\""
-msgstr "%s Auto commands: \"%s\""
+msgid "%s Autocommands for \"%s\""
+msgstr "%s Autocommands: \"%s\""
#: ../fileio.c:7149
#, c-format
@@ -2725,11 +2725,6 @@ msgstr "E49: ้Œฏ่ชค็š„ๆฒๅ‹•ๅคงๅฐ"
msgid "E901: Job table is full"
msgstr ""
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
#: ../globals.h:1024
#, c-format
msgid "E364: Library call failed for \"%s()\""
@@ -3427,7 +3422,7 @@ msgstr "-q [errorfile] ็ทจ่ผฏๆ™‚่ผ‰ๅ…ฅ็ฌฌไธ€ๅ€‹้Œฏ่ชค"
msgid ""
"\n"
"\n"
-"usage:"
+"Usage:"
msgstr ""
"\n"
"\n"
@@ -4304,12 +4299,6 @@ msgstr "่กŒ %4ld:"
msgid "E354: Invalid register name: '%s'"
msgstr "E354: ๆšซๅญ˜ๅ™จๅ็จฑ้Œฏ่ชค: '%s'"
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr ""
-"ๆญฃ้ซ”ไธญๆ–‡่จŠๆฏ็ถญ่ญท่€…: Francis S.Lin <piaip@csie.ntu.edu."
-"tw>, Cecil Sheng <b7506022@csie.ntu.edu.tw>"
-
#: ../message.c:986
msgid "Interrupt: "
msgstr "ๅทฒไธญๆ–ท: "
diff --git a/src/nvim/po/zh_TW.po b/src/nvim/po/zh_TW.po
deleted file mode 100644
index 07d510c0c6..0000000000
--- a/src/nvim/po/zh_TW.po
+++ /dev/null
@@ -1,7910 +0,0 @@
-# Traditional Chinese Translation for Vim vim:set foldmethod=marker:
-#
-# Do ":help uganda" in Vim to read copying and usage conditions.
-# Do ":help credits" in Vim to see a list of people who contributed.
-#
-# FIRST AUTHOR Francis S.Lin <piaip@csie.ntu.edu.tw>, 2000
-# FIRST RELEASE Thu Jun 14 14:24:17 CST 2001
-#
-# Last update: 2005/01/27 07:03 (6.3)
-#
-# To update, search pattern: /fuzzy\|^msgstr ""\(\n"\)\@!
-#
-# DO NOT USE WORDS WITH BACKSLASH ('\') AS SECOND BYTE OF BIG5 CHARS
-# EG: 'ฅ\', # ณ\ฅ\ป# [blacklist: ภ\ฌ\พ\ฏ\ฝ\ถ\ฒ\ฦ\ฐ\ย\ฟ\ม\ล\ง\ช\ซ\]
-# [blacklist: ฎ\ฑ\ร\ฤ\ด\ต\ท\น\บ\ค\ฆ\ญ\แ\ไ\]
-# you can replace these characters with alternative words.
-# THIS WILL CAUSE INCOMPATIBLE ON gettext 0.10.36+
-#
-# Note (2005.01.27):
-# A bug was found for UTF8 mode.
-# > msgid "%<PRId64> fewer lines" "on %<PRId64> lines"
-# If you don't put more (at least 2) spaces after %<PRId64>
-# gvim/win32 will crash (no reason).
-# So please change [ฆๆ"] to [ฆๆ "]
-#
-# Q. How to use UTF8 mode on Win32?
-# A. A simple configuration:
-# set encoding=utf-8; let $LANG='zh_TW.UTF-8';
-# (set langmenu=none or ..)
-# set fileencodings=ucs-bom,utf-8,japan,taiwan,prc
-# set fileencoding=taiwan (or utf-8)
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: Vim(Traditional Chinese)\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-05-26 14:21+0200\n"
-"PO-Revision-Date: Mon Feb 19 22:49:21 CST 2001\n"
-"Last-Translator: Hung-Te Lin <piaip@csie.ntu.edu.tw>\n"
-"Language-Team: Hung-Te Lin <piaip@csie.ntu.edu.tw>, Cecil Sheng "
-"<b7506022@csie.ntu.edu.tw>\n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=big5\n"
-"Content-Transfer-Encoding: 8-bit\n"
-
-#: ../api/private/helpers.c:201
-#, fuzzy
-msgid "Unable to get option value"
-msgstr "ตLชkถวฐeฆ^ภณฐTฎง"
-
-#: ../api/private/helpers.c:204
-msgid "internal error: unknown option type"
-msgstr ""
-
-#: ../buffer.c:92
-msgid "[Location List]"
-msgstr ""
-
-#: ../buffer.c:93
-msgid "[Quickfix List]"
-msgstr ""
-
-#: ../buffer.c:94
-msgid "E855: Autocommands caused command to abort"
-msgstr ""
-
-#: ../buffer.c:135
-msgid "E82: Cannot allocate any buffer, exiting..."
-msgstr "E82: ตLชkฐtธmฅ๔ฆ๓ฝwฝฤฐฯกAย๗ถ}ต{ฆก..."
-
-#: ../buffer.c:138
-msgid "E83: Cannot allocate buffer, using other one..."
-msgstr "E83: ตLชkฐtธmฝwฝฤฐฯกAจฯฅฮฅtค@ญำฝwฝฤฐฯ...."
-
-#: ../buffer.c:763
-msgid "E515: No buffers were unloaded"
-msgstr "E515: จSฆณฤภฉ๑ฅ๔ฆ๓ฝwฝฤฐฯ"
-
-#: ../buffer.c:765
-msgid "E516: No buffers were deleted"
-msgstr "E516: จSฆณงRฐฃฅ๔ฆ๓ฝwฝฤฐฯ"
-
-#: ../buffer.c:767
-msgid "E517: No buffers were wiped out"
-msgstr "E517: จSฆณฒMฐฃฅ๔ฆ๓ฝwฝฤฐฯ"
-
-#: ../buffer.c:772
-msgid "1 buffer unloaded"
-msgstr "คwฤภฉ๑ค@ญำฝwฝฤฐฯ"
-
-#: ../buffer.c:774
-#, c-format
-msgid "%d buffers unloaded"
-msgstr "คwฤภฉ๑ %d ญำฝwฝฤฐฯ"
-
-#: ../buffer.c:777
-msgid "1 buffer deleted"
-msgstr "คwงRฐฃค@ญำฝwฝฤฐฯ"
-
-#: ../buffer.c:779
-#, c-format
-msgid "%d buffers deleted"
-msgstr "คwงRฐฃ %d ญำฝwฝฤฐฯ"
-
-#: ../buffer.c:782
-msgid "1 buffer wiped out"
-msgstr "คwงRฐฃค@ญำฝwฝฤฐฯ"
-
-#: ../buffer.c:784
-#, c-format
-msgid "%d buffers wiped out"
-msgstr "คwงRฐฃ %d ญำฝwฝฤฐฯ"
-
-#: ../buffer.c:806
-msgid "E90: Cannot unload last buffer"
-msgstr "E90: ตLชkฤภฉ๑ณฬซแค@ญำฝwฝฤฐฯ"
-
-#: ../buffer.c:874
-msgid "E84: No modified buffer found"
-msgstr "E84: จSฆณญืง๏นLชบฝwฝฤฐฯ"
-
-#. back where we started, didn't find anything.
-#: ../buffer.c:903
-msgid "E85: There is no listed buffer"
-msgstr "E85: จSฆณฆCฅXชบฝwฝฤฐฯ"
-
-#: ../buffer.c:913
-#, c-format
-msgid "E86: Buffer %<PRId64> does not exist"
-msgstr "E86: ฝwฝฤฐฯ %<PRId64> คฃฆsฆb"
-
-#: ../buffer.c:915
-msgid "E87: Cannot go beyond last buffer"
-msgstr "E87: ตLชkคมดซจ์ง๓ซแญฑชบฝwฝฤฐฯ"
-
-#: ../buffer.c:917
-msgid "E88: Cannot go before first buffer"
-msgstr "E88: ตLชkคมดซจ์ง๓ซeญฑชบฝwฝฤฐฯ"
-
-#: ../buffer.c:945
-#, c-format
-msgid ""
-"E89: No write since last change for buffer %<PRId64> (add ! to override)"
-msgstr "E89: คwง๓ง๏นLฝwฝฤฐฯ %<PRId64> ฆฉ|ฅผฆsภษ (ฅiฅฮ ! ฑjจ๎ฐ๕ฆๆ)"
-
-#. wrap around (may cause duplicates)
-#: ../buffer.c:1423
-msgid "W14: Warning: List of file names overflow"
-msgstr "W14: ฤตงi: ภษฆWนLฆh"
-
-#: ../buffer.c:1555 ../quickfix.c:3361
-#, c-format
-msgid "E92: Buffer %<PRId64> not found"
-msgstr "E92: งไคฃจ์ฒฤ %<PRId64> ญำฝwฝฤฐฯ"
-
-#: ../buffer.c:1798
-#, c-format
-msgid "E93: More than one match for %s"
-msgstr "E93: งไจ์ค@ญำฅHคWชบ %s"
-
-#: ../buffer.c:1800
-#, c-format
-msgid "E94: No matching buffer for %s"
-msgstr "E94: งไคฃจ์ %s"
-
-#: ../buffer.c:2161
-#, c-format
-msgid "line %<PRId64>"
-msgstr "ฆๆ %<PRId64>"
-
-#: ../buffer.c:2233
-msgid "E95: Buffer with this name already exists"
-msgstr "E95: คwฆณฝwฝฤฐฯจฯฅฮณoญำฆWฆr"
-
-#: ../buffer.c:2498
-msgid " [Modified]"
-msgstr " [คwญืง๏]"
-
-#: ../buffer.c:2501
-msgid "[Not edited]"
-msgstr "[ฅผฝsฟ่]"
-
-#: ../buffer.c:2504
-msgid "[New file]"
-msgstr "[ทsภษฎื]"
-
-#: ../buffer.c:2505
-msgid "[Read errors]"
-msgstr "[ลชจ๚ฟ๙ป~]"
-
-#: ../buffer.c:2506 ../buffer.c:3217 ../fileio.c:1807 ../screen.c:4895
-msgid "[RO]"
-msgstr "[ฐ฿ลช]"
-
-#: ../buffer.c:2507 ../fileio.c:1807
-msgid "[readonly]"
-msgstr "[ฐ฿ลช]"
-
-#: ../buffer.c:2524
-#, c-format
-msgid "1 line --%d%%--"
-msgstr "ฆๆผฦ 1 --%d%%--"
-
-#: ../buffer.c:2526
-#, c-format
-msgid "%<PRId64> lines --%d%%--"
-msgstr "ฆๆผฦ %<PRId64> --%d%%--"
-
-#: ../buffer.c:2530
-#, c-format
-msgid "line %<PRId64> of %<PRId64> --%d%%-- col "
-msgstr "ฆๆ %<PRId64>/%<PRId64> --%d%%-- ฤๆ "
-
-#: ../buffer.c:2632 ../buffer.c:4292 ../memline.c:1554
-#, fuzzy
-msgid "[No Name]"
-msgstr "[ฅผฉRฆW]"
-
-#. must be a help buffer
-#: ../buffer.c:2667
-msgid "help"
-msgstr "[ปฒงUปกฉ๚]"
-
-#: ../buffer.c:3225 ../screen.c:4883
-#, fuzzy
-msgid "[Help]"
-msgstr "[ปฒงUปกฉ๚]"
-
-#: ../buffer.c:3254 ../screen.c:4887
-msgid "[Preview]"
-msgstr "[นwฤ]"
-
-#: ../buffer.c:3528
-msgid "All"
-msgstr "ฅณก"
-
-#: ../buffer.c:3528
-msgid "Bot"
-msgstr "ฉณบ"
-
-#: ../buffer.c:3531
-msgid "Top"
-msgstr "ณปบ"
-
-#: ../buffer.c:4244
-msgid ""
-"\n"
-"# Buffer list:\n"
-msgstr ""
-"\n"
-"# ฝwฝฤฐฯฆCชํ:\n"
-
-#: ../buffer.c:4289
-msgid "[Scratch]"
-msgstr ""
-
-#: ../buffer.c:4529
-msgid ""
-"\n"
-"--- Signs ---"
-msgstr ""
-"\n"
-"--- ฒลธน ---"
-
-#: ../buffer.c:4538
-#, c-format
-msgid "Signs for %s:"
-msgstr "%s ชบฒลธน:"
-
-#: ../buffer.c:4543
-#, c-format
-msgid " line=%<PRId64> id=%d name=%s"
-msgstr " ฆๆ=%<PRId64> id=%d ฆWบู=%s"
-
-#: ../cursor_shape.c:68
-msgid "E545: Missing colon"
-msgstr "E545: ฏสคึ colon"
-
-#: ../cursor_shape.c:70 ../cursor_shape.c:94
-msgid "E546: Illegal mode"
-msgstr "E546: คฃฅฟฝTชบผาฆก"
-
-#: ../cursor_shape.c:134
-msgid "E548: digit expected"
-msgstr "E548: ภณธำญnฆณผฦฆr"
-
-#: ../cursor_shape.c:138
-msgid "E549: Illegal percentage"
-msgstr "E549: คฃฅฟฝTชบฆสคภค๑"
-
-#: ../diff.c:146
-#, c-format
-msgid "E96: Can not diff more than %<PRId64> buffers"
-msgstr "E96: ตLชkค๑ธ๛(diff) %<PRId64>ญำฅHคWชบฝwฝฤฐฯ"
-
-#: ../diff.c:753
-#, fuzzy
-msgid "E810: Cannot read or write temp files"
-msgstr "E557: ตLชkถ}ฑา termcap ภษฎื"
-
-#: ../diff.c:755
-msgid "E97: Cannot create diffs"
-msgstr "E97: คฃฏเซุฅ฿ "
-
-#: ../diff.c:966
-#, fuzzy
-msgid "E816: Cannot read patch output"
-msgstr "E98: ตLชkลชจ๚ diff ชบฟ้ฅX"
-
-#: ../diff.c:1220
-msgid "E98: Cannot read diff output"
-msgstr "E98: ตLชkลชจ๚ diff ชบฟ้ฅX"
-
-#: ../diff.c:2081
-msgid "E99: Current buffer is not in diff mode"
-msgstr "E99: ฅุซeชบฝwฝฤฐฯคฃฌOฆb diff ผาฆก"
-
-#: ../diff.c:2100
-#, fuzzy
-msgid "E793: No other buffer in diff mode is modifiable"
-msgstr "E100: จSฆณฝwฝฤฐฯฆb diff ผาฆก"
-
-#: ../diff.c:2102
-msgid "E100: No other buffer in diff mode"
-msgstr "E100: จSฆณฝwฝฤฐฯฆb diff ผาฆก"
-
-#: ../diff.c:2112
-msgid "E101: More than two buffers in diff mode, don't know which one to use"
-msgstr "E101: ฆณจโญำฅHคWชบฝwฝฤฐฯฆb diff ผาฆกกAตLชkจMฉwญnฅฮญค@ญำ"
-
-#: ../diff.c:2141
-#, c-format
-msgid "E102: Can't find buffer \"%s\""
-msgstr "E102: งไคฃจ์ฝwฝฤฐฯ: \"%s\""
-
-#: ../diff.c:2152
-#, c-format
-msgid "E103: Buffer \"%s\" is not in diff mode"
-msgstr "E103: ฝwฝฤฐฯ \"%s\" คฃฌOฆb diff ผาฆก"
-
-#: ../diff.c:2193
-msgid "E787: Buffer changed unexpectedly"
-msgstr ""
-
-#: ../digraph.c:1598
-msgid "E104: Escape not allowed in digraph"
-msgstr "E104: ฝฦฆXฆrคธ(digraph)คคคฃฏเจฯฅฮ Escape"
-
-#: ../digraph.c:1760
-msgid "E544: Keymap file not found"
-msgstr "E544: งไคฃจ์ keymap ภษ"
-
-#: ../digraph.c:1785
-msgid "E105: Using :loadkeymap not in a sourced file"
-msgstr "E105: จฯฅฮ :loadkeymap "
-
-#: ../digraph.c:1821
-msgid "E791: Empty keymap entry"
-msgstr ""
-
-#: ../edit.c:82
-msgid " Keyword completion (^N^P)"
-msgstr " ร๖มไฆrฆฐสงนฆจ (^N^P)"
-
-#. ctrl_x_mode == 0, ^P/^N compl.
-#: ../edit.c:83
-#, fuzzy
-msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
-msgstr " ^X ผาฆก (^E^Y^L^]^F^I^K^D^N^P)"
-
-#: ../edit.c:85
-msgid " Whole line completion (^L^N^P)"
-msgstr " พใฆๆฆฐสงนฆจ (^L^N^P)"
-
-#: ../edit.c:86
-msgid " File name completion (^F^N^P)"
-msgstr " ภษฆWฆฐสงนฆจ (^F^N^P)"
-
-#: ../edit.c:87
-msgid " Tag completion (^]^N^P)"
-msgstr " ผะลาฆฐสงนฆจ (^]^N^P)"
-
-#: ../edit.c:88
-msgid " Path pattern completion (^N^P)"
-msgstr " ธ๔ฎ|ฆฐสงนฆจ (^N^P)"
-
-#: ../edit.c:89
-msgid " Definition completion (^D^N^P)"
-msgstr " ฉwธqฆฐสงนฆจ (^D^N^P)"
-
-#: ../edit.c:91
-msgid " Dictionary completion (^K^N^P)"
-msgstr " ฆrจๅฆฐสงนฆจ (^K^N^P)"
-
-#: ../edit.c:92
-msgid " Thesaurus completion (^T^N^P)"
-msgstr " Thesaurus ฆฐสงนฆจ (^T^N^P)"
-
-#: ../edit.c:93
-msgid " Command-line completion (^V^N^P)"
-msgstr " ฉRฅOฆCฆฐสงนฆจ (^V^N^P)"
-
-#: ../edit.c:94
-#, fuzzy
-msgid " User defined completion (^U^N^P)"
-msgstr " พใฆๆฆฐสงนฆจ (^L^N^P)"
-
-#: ../edit.c:95
-#, fuzzy
-msgid " Omni completion (^O^N^P)"
-msgstr " ผะลาฆฐสงนฆจ (^]^N^P)"
-
-#: ../edit.c:96
-#, fuzzy
-msgid " Spelling suggestion (s^N^P)"
-msgstr " พใฆๆฆฐสงนฆจ (^L^N^P)"
-
-#: ../edit.c:97
-msgid " Keyword Local completion (^N^P)"
-msgstr " ฐฯฐ์ร๖มไฆrฆฐสงนฆจ (^N^P)"
-
-#: ../edit.c:100
-msgid "Hit end of paragraph"
-msgstr "คwจ์ฌqธจตฒงภ"
-
-#: ../edit.c:101
-msgid "E839: Completion function changed window"
-msgstr ""
-
-#: ../edit.c:102
-msgid "E840: Completion function deleted text"
-msgstr ""
-
-#: ../edit.c:1847
-msgid "'dictionary' option is empty"
-msgstr "ฟ๏ถต 'dictionary' ฅผณ]ฉw"
-
-#: ../edit.c:1848
-msgid "'thesaurus' option is empty"
-msgstr "ฟ๏ถต 'thesaurus' ฅผณ]ฉw"
-
-#: ../edit.c:2655
-#, c-format
-msgid "Scanning dictionary: %s"
-msgstr "ฑฝบหฆrจๅ: %s"
-
-#: ../edit.c:3079
-msgid " (insert) Scroll (^E/^Y)"
-msgstr " (ดกคJ) Scroll (^E/^Y)"
-
-#: ../edit.c:3081
-msgid " (replace) Scroll (^E/^Y)"
-msgstr " (จ๚ฅN) Scroll (^E/^Y)"
-
-#: ../edit.c:3587
-#, c-format
-msgid "Scanning: %s"
-msgstr "ฑฝบหคค: %s"
-
-#: ../edit.c:3614
-msgid "Scanning tags."
-msgstr "ฑฝบหผะลา."
-
-#: ../edit.c:4519
-msgid " Adding"
-msgstr " ผWฅ["
-
-#. showmode might reset the internal line pointers, so it must
-#. * be called before line = ml_get(), or when this address is no
-#. * longer needed. -- Acevedo.
-#.
-#: ../edit.c:4562
-msgid "-- Searching..."
-msgstr "-- ทjดMคค..."
-
-#: ../edit.c:4618
-msgid "Back at original"
-msgstr "ฆ^จ์ฐ_ยI"
-
-#: ../edit.c:4621
-msgid "Word from other line"
-msgstr "ฑqงOฆๆถ}ฉlชบฆr (?)"
-
-#: ../edit.c:4624
-msgid "The only match"
-msgstr "ฅuฆณฆนถตฒลฆX"
-
-#: ../edit.c:4680
-#, c-format
-msgid "match %d of %d"
-msgstr "งไจ์ %d / %d"
-
-#: ../edit.c:4684
-#, c-format
-msgid "match %d"
-msgstr "ฒลฆX %d"
-
-#: ../eval.c:137
-#, fuzzy
-msgid "E18: Unexpected characters in :let"
-msgstr "E18: '=' ซeญฑฅXฒ{คFฟ๙ป~ชบฆrคธ"
-
-#: ../eval.c:138
-#, fuzzy, c-format
-msgid "E684: list index out of range: %<PRId64>"
-msgstr "E322: ฆๆธนถWฅXฝdณ๒: %<PRId64> ถWนLตฒงภ"
-
-#: ../eval.c:139
-#, c-format
-msgid "E121: Undefined variable: %s"
-msgstr "E121: ลผฦ %s ฉ|ฅผฉwธq"
-
-#: ../eval.c:140
-msgid "E111: Missing ']'"
-msgstr "E111: ฏสคึน๏ภณชบ \"]\""
-
-#: ../eval.c:141
-#, fuzzy, c-format
-msgid "E686: Argument of %s must be a List"
-msgstr "E487: ฐัผฦภณธำฌOฅฟผฦ"
-
-#: ../eval.c:143
-#, fuzzy, c-format
-msgid "E712: Argument of %s must be a List or Dictionary"
-msgstr "E487: ฐัผฦภณธำฌOฅฟผฦ"
-
-#: ../eval.c:144
-#, fuzzy
-msgid "E713: Cannot use empty key for Dictionary"
-msgstr "E214: งไคฃจ์ผgคJฅฮชบผศฆsภษ"
-
-#: ../eval.c:145
-#, fuzzy
-msgid "E714: List required"
-msgstr "E471: ปญnซฅOฐัผฦ"
-
-#: ../eval.c:146
-#, fuzzy
-msgid "E715: Dictionary required"
-msgstr "E129: ปญnจ็ฆกฆWบู"
-
-#: ../eval.c:147
-#, c-format
-msgid "E118: Too many arguments for function: %s"
-msgstr "E118: จ็ฆก %s ชบคผฦนLฆh"
-
-#: ../eval.c:148
-#, c-format
-msgid "E716: Key not present in Dictionary: %s"
-msgstr ""
-
-#: ../eval.c:150
-#, c-format
-msgid "E122: Function %s already exists, add ! to replace it"
-msgstr "E122: จ็ฆก %s คwธgฆsฆb, ฝะจฯฅฮ ! ฑjจ๎จ๚ฅN"
-
-#: ../eval.c:151
-#, fuzzy
-msgid "E717: Dictionary entry already exists"
-msgstr "E95: คwฆณฝwฝฤฐฯจฯฅฮณoญำฆWฆr"
-
-#: ../eval.c:152
-#, fuzzy
-msgid "E718: Funcref required"
-msgstr "E129: ปญnจ็ฆกฆWบู"
-
-#: ../eval.c:153
-#, fuzzy
-msgid "E719: Cannot use [:] with a Dictionary"
-msgstr "E360: คฃฏเฅฮ -f ฟ๏ถตฐ๕ฆๆ shell"
-
-#: ../eval.c:154
-#, c-format
-msgid "E734: Wrong variable type for %s="
-msgstr ""
-
-#: ../eval.c:155
-#, fuzzy, c-format
-msgid "E130: Unknown function: %s"
-msgstr "E117: ฅผฉwธqชบจ็ฆก: %s"
-
-#: ../eval.c:156
-#, c-format
-msgid "E461: Illegal variable name: %s"
-msgstr "E461: คฃฆXชkชบลผฦฆWบู: %s"
-
-#: ../eval.c:157
-msgid "E806: using Float as a String"
-msgstr ""
-
-#: ../eval.c:1830
-msgid "E687: Less targets than List items"
-msgstr ""
-
-#: ../eval.c:1834
-msgid "E688: More targets than List items"
-msgstr ""
-
-#: ../eval.c:1906
-msgid "Double ; in list of variables"
-msgstr ""
-
-#: ../eval.c:2078
-#, fuzzy, c-format
-msgid "E738: Can't list variables for %s"
-msgstr "E138: ตLชkผgคJ viminfo ภษฎื %s !"
-
-#: ../eval.c:2391
-msgid "E689: Can only index a List or Dictionary"
-msgstr ""
-
-#: ../eval.c:2396
-msgid "E708: [:] must come last"
-msgstr ""
-
-#: ../eval.c:2439
-msgid "E709: [:] requires a List value"
-msgstr ""
-
-#: ../eval.c:2674
-msgid "E710: List value has more items than target"
-msgstr ""
-
-#: ../eval.c:2678
-msgid "E711: List value has not enough items"
-msgstr ""
-
-#: ../eval.c:2867
-#, fuzzy
-msgid "E690: Missing \"in\" after :for"
-msgstr "E69: %s%%[ ซแฏสคึ ]"
-
-#: ../eval.c:3063
-#, c-format
-msgid "E107: Missing parentheses: %s"
-msgstr "E107: ฏสคึน๏ภณชบฌAธน: %s"
-
-#: ../eval.c:3263
-#, c-format
-msgid "E108: No such variable: \"%s\""
-msgstr "E108: ตLฆนลผฦ: \"%s\""
-
-#: ../eval.c:3333
-msgid "E743: variable nested too deep for (un)lock"
-msgstr ""
-
-#: ../eval.c:3630
-msgid "E109: Missing ':' after '?'"
-msgstr "E109: '?' ซแฏสคึ ':'"
-
-#: ../eval.c:3893
-msgid "E691: Can only compare List with List"
-msgstr ""
-
-#: ../eval.c:3895
-#, fuzzy
-msgid "E692: Invalid operation for Lists"
-msgstr "E449: ฆฌจ์คฃฅฟฝTชบนBบโฆก"
-
-#: ../eval.c:3915
-msgid "E735: Can only compare Dictionary with Dictionary"
-msgstr ""
-
-#: ../eval.c:3917
-#, fuzzy
-msgid "E736: Invalid operation for Dictionary"
-msgstr "E116: จ็ฆก %s ชบคผฦคฃฅฟฝT"
-
-#: ../eval.c:3932
-msgid "E693: Can only compare Funcref with Funcref"
-msgstr ""
-
-#: ../eval.c:3934
-#, fuzzy
-msgid "E694: Invalid operation for Funcrefs"
-msgstr "E116: จ็ฆก %s ชบคผฦคฃฅฟฝT"
-
-#: ../eval.c:4277
-#, fuzzy
-msgid "E804: Cannot use '%' with Float"
-msgstr "E360: คฃฏเฅฮ -f ฟ๏ถตฐ๕ฆๆ shell"
-
-#: ../eval.c:4478
-msgid "E110: Missing ')'"
-msgstr "E110: ฏสคึน๏ภณชบ \")\""
-
-#: ../eval.c:4609
-#, fuzzy
-msgid "E695: Cannot index a Funcref"
-msgstr "E90: ตLชkฤภฉ๑ณฬซแค@ญำฝwฝฤฐฯ"
-
-#: ../eval.c:4839
-#, c-format
-msgid "E112: Option name missing: %s"
-msgstr "E112: ฏสคึฟ๏ถตฆWบู: %s"
-
-#: ../eval.c:4855
-#, c-format
-msgid "E113: Unknown option: %s"
-msgstr "E113: คฃฅฟฝTชบฟ๏ถต: %s"
-
-#: ../eval.c:4904
-#, c-format
-msgid "E114: Missing quote: %s"
-msgstr "E114: ฏสคึคธน: %s"
-
-#: ../eval.c:5020
-#, c-format
-msgid "E115: Missing quote: %s"
-msgstr "E115: ฏสคึคธน: %s"
-
-#: ../eval.c:5084
-#, fuzzy, c-format
-msgid "E696: Missing comma in List: %s"
-msgstr "E405: ฏสคึฌตฅฒลธน: %s"
-
-#: ../eval.c:5091
-#, fuzzy, c-format
-msgid "E697: Missing end of List ']': %s"
-msgstr "E398: ฏสคึ \"=\": %s"
-
-#: ../eval.c:6475
-#, fuzzy, c-format
-msgid "E720: Missing colon in Dictionary: %s"
-msgstr "E242: งไคฃจ์รCฆโ: %s"
-
-#: ../eval.c:6499
-#, c-format
-msgid "E721: Duplicate key in Dictionary: \"%s\""
-msgstr ""
-
-#: ../eval.c:6517
-#, fuzzy, c-format
-msgid "E722: Missing comma in Dictionary: %s"
-msgstr "E242: งไคฃจ์รCฆโ: %s"
-
-#: ../eval.c:6524
-#, fuzzy, c-format
-msgid "E723: Missing end of Dictionary '}': %s"
-msgstr "E126: ฏสคึ :endfunction"
-
-#: ../eval.c:6555
-#, fuzzy
-msgid "E724: variable nested too deep for displaying"
-msgstr "E22: ฑ_ชฌปผฐjฉIฅsคำฆhผh"
-
-#: ../eval.c:7188
-#, fuzzy, c-format
-msgid "E740: Too many arguments for function %s"
-msgstr "E118: จ็ฆก %s ชบคผฦนLฆh"
-
-#: ../eval.c:7190
-#, c-format
-msgid "E116: Invalid arguments for function %s"
-msgstr "E116: จ็ฆก %s ชบคผฦคฃฅฟฝT"
-
-#: ../eval.c:7377
-#, c-format
-msgid "E117: Unknown function: %s"
-msgstr "E117: ฅผฉwธqชบจ็ฆก: %s"
-
-#: ../eval.c:7383
-#, c-format
-msgid "E119: Not enough arguments for function: %s"
-msgstr "E119: จ็ฆก %s ชบคผฦคำคึ"
-
-#: ../eval.c:7387
-#, c-format
-msgid "E120: Using <SID> not in a script context: %s"
-msgstr "E120: <SID> คฃฏเฆb script ฅปคๅฅ~จฯฅฮ: %s"
-
-#: ../eval.c:7391
-#, c-format
-msgid "E725: Calling dict function without Dictionary: %s"
-msgstr ""
-
-#: ../eval.c:7453
-#, fuzzy
-msgid "E808: Number or Float required"
-msgstr "E521: = ซแปญnฆณผฦฆr"
-
-#: ../eval.c:7503
-#, fuzzy
-msgid "add() argument"
-msgstr "คฃฅฟฝTชบฐัผฦ: "
-
-#: ../eval.c:7907
-#, fuzzy
-msgid "E699: Too many arguments"
-msgstr "คำฆhฝsฟ่ฐัผฦ"
-
-#: ../eval.c:8073
-#, fuzzy
-msgid "E785: complete() can only be used in Insert mode"
-msgstr "E328: ฟ๏ณๆฅuฏเฆbจไฅฆผาฆกคคจฯฅฮ"
-
-#: ../eval.c:8156
-msgid "&Ok"
-msgstr "ฝTฉw(&O)"
-
-#: ../eval.c:8676
-#, fuzzy, c-format
-msgid "E737: Key already exists: %s"
-msgstr "E227: %s ชบ mapping คwธgฆsฆb"
-
-#: ../eval.c:8692
-msgid "extend() argument"
-msgstr ""
-
-#: ../eval.c:8915
-#, fuzzy
-msgid "map() argument"
-msgstr "vim [ฐัผฦ] "
-
-#: ../eval.c:8916
-msgid "filter() argument"
-msgstr ""
-
-#: ../eval.c:9229
-#, c-format
-msgid "+-%s%3ld lines: "
-msgstr "+-%s%3ld ฆๆ: "
-
-#: ../eval.c:9291
-#, fuzzy, c-format
-msgid "E700: Unknown function: %s"
-msgstr "E117: ฅผฉwธqชบจ็ฆก: %s"
-
-#: ../eval.c:10729
-msgid "called inputrestore() more often than inputsave()"
-msgstr "ฉIฅs inputrestore() ชบฆธผฦค๑ inputsave() มูฆh"
-
-#: ../eval.c:10771
-#, fuzzy
-msgid "insert() argument"
-msgstr "คำฆhฝsฟ่ฐัผฦ"
-
-#: ../eval.c:10841
-#, fuzzy
-msgid "E786: Range not allowed"
-msgstr "E481: คฃฅiจฯฅฮฝdณ๒ซฅO"
-
-#: ../eval.c:11140
-#, fuzzy
-msgid "E701: Invalid type for len()"
-msgstr "E596: คฃฅฟฝTชบฆrซฌ"
-
-#: ../eval.c:11980
-msgid "E726: Stride is zero"
-msgstr ""
-
-#: ../eval.c:11982
-msgid "E727: Start past end"
-msgstr ""
-
-#: ../eval.c:12024 ../eval.c:15297
-msgid "<empty>"
-msgstr ""
-
-#: ../eval.c:12282
-msgid "remove() argument"
-msgstr ""
-
-#: ../eval.c:12466
-msgid "E655: Too many symbolic links (cycle?)"
-msgstr "E655: คำฆhผhชบฒลธนร์ตฒ(symlink) (ด`ภ๔?)"
-
-#: ../eval.c:12593
-msgid "reverse() argument"
-msgstr ""
-
-#: ../eval.c:13721
-msgid "sort() argument"
-msgstr ""
-
-#: ../eval.c:13721
-#, fuzzy
-msgid "uniq() argument"
-msgstr "คฃฅฟฝTชบฐัผฦ: "
-
-#: ../eval.c:13776
-#, fuzzy
-msgid "E702: Sort compare function failed"
-msgstr "E237: ตLชkฟ๏พฆนฆLชํพ๗"
-
-#: ../eval.c:13806
-msgid "E882: Uniq compare function failed"
-msgstr ""
-
-#: ../eval.c:14085
-msgid "(Invalid)"
-msgstr "(คฃฅฟฝT)"
-
-#: ../eval.c:14590
-#, fuzzy
-msgid "E677: Error writing temp file"
-msgstr "E208: ผgคJภษฎื \"%s\" ฟ๙ป~"
-
-#: ../eval.c:16159
-msgid "E805: Using a Float as a Number"
-msgstr ""
-
-#: ../eval.c:16162
-msgid "E703: Using a Funcref as a Number"
-msgstr ""
-
-#: ../eval.c:16170
-msgid "E745: Using a List as a Number"
-msgstr ""
-
-#: ../eval.c:16173
-msgid "E728: Using a Dictionary as a Number"
-msgstr ""
-
-#: ../eval.c:16259
-msgid "E729: using Funcref as a String"
-msgstr ""
-
-#: ../eval.c:16262
-#, fuzzy
-msgid "E730: using List as a String"
-msgstr "E374: ฎๆฆกคฦฆrฆ๊ธฬคึคF ]"
-
-#: ../eval.c:16265
-msgid "E731: using Dictionary as a String"
-msgstr ""
-
-#: ../eval.c:16619
-#, fuzzy, c-format
-msgid "E706: Variable type mismatch for: %s"
-msgstr "E93: งไจ์ค@ญำฅHคWชบ %s"
-
-#: ../eval.c:16705
-#, fuzzy, c-format
-msgid "E795: Cannot delete variable %s"
-msgstr "E46: ตLชkณ]ฉwฐ฿ลชลผฦ \"%s\""
-
-#: ../eval.c:16724
-#, fuzzy, c-format
-msgid "E704: Funcref variable name must start with a capital: %s"
-msgstr "E128: จ็ฆกฆWบูฒฤค@ญำฆrฅภฅฒถทคjผg: %s"
-
-#: ../eval.c:16732
-#, c-format
-msgid "E705: Variable name conflicts with existing function: %s"
-msgstr ""
-
-#: ../eval.c:16763
-#, c-format
-msgid "E741: Value is locked: %s"
-msgstr ""
-
-#: ../eval.c:16764 ../eval.c:16769 ../message.c:1839
-msgid "Unknown"
-msgstr "ฅผชพ"
-
-#: ../eval.c:16768
-#, fuzzy, c-format
-msgid "E742: Cannot change value of %s"
-msgstr "E284: คฃฏเณ]ฉw IC ผฦญศ"
-
-#: ../eval.c:16838
-msgid "E698: variable nested too deep for making a copy"
-msgstr ""
-
-#: ../eval.c:17249
-#, c-format
-msgid "E123: Undefined function: %s"
-msgstr "E123: จ็ฆก %s ฉ|ฅผฉwธq"
-
-#: ../eval.c:17260
-#, c-format
-msgid "E124: Missing '(': %s"
-msgstr "E124: ฏสคึ \"(\": %s"
-
-#: ../eval.c:17293
-#, fuzzy
-msgid "E862: Cannot use g: here"
-msgstr "E284: คฃฏเณ]ฉw IC ผฦญศ"
-
-#: ../eval.c:17312
-#, c-format
-msgid "E125: Illegal argument: %s"
-msgstr "E125: ฐัผฦคฃฅฟฝT: %s"
-
-#: ../eval.c:17323
-#, fuzzy, c-format
-msgid "E853: Duplicate argument name: %s"
-msgstr "E154: ผะลา(tag) \"%s\" ฆbภษฎื %s ธฬญซฝฦฅXฒ{ฆhฆธ"
-
-#: ../eval.c:17416
-msgid "E126: Missing :endfunction"
-msgstr "E126: ฏสคึ :endfunction"
-
-#: ../eval.c:17537
-#, fuzzy, c-format
-msgid "E707: Function name conflicts with variable: %s"
-msgstr "E128: จ็ฆกฆWบูฒฤค@ญำฆrฅภฅฒถทคjผg: %s"
-
-#: ../eval.c:17549
-#, c-format
-msgid "E127: Cannot redefine function %s: It is in use"
-msgstr "E127: จ็ฆก %s ฅฟฆbจฯฅฮคคกAตLชkญซทsฉwธq"
-
-#: ../eval.c:17604
-#, fuzzy, c-format
-msgid "E746: Function name does not match script file name: %s"
-msgstr "E128: จ็ฆกฆWบูฒฤค@ญำฆrฅภฅฒถทคjผg: %s"
-
-#: ../eval.c:17716
-msgid "E129: Function name required"
-msgstr "E129: ปญnจ็ฆกฆWบู"
-
-#: ../eval.c:17824
-#, fuzzy, c-format
-msgid "E128: Function name must start with a capital or \"s:\": %s"
-msgstr "E128: จ็ฆกฆWบูฒฤค@ญำฆrฅภฅฒถทคjผg: %s"
-
-#: ../eval.c:17833
-#, fuzzy, c-format
-msgid "E884: Function name cannot contain a colon: %s"
-msgstr "E128: จ็ฆกฆWบูฒฤค@ญำฆrฅภฅฒถทคjผg: %s"
-
-#: ../eval.c:18336
-#, c-format
-msgid "E131: Cannot delete function %s: It is in use"
-msgstr "E131: จ็ฆก %s ฅฟฆbจฯฅฮคคกAตLชkงRฐฃ"
-
-#: ../eval.c:18441
-msgid "E132: Function call depth is higher than 'maxfuncdepth'"
-msgstr "E132: จ็ฆกปผฐjฉIฅsผhผฦถWนL 'maxfuncdepth'"
-
-#: ../eval.c:18568
-#, c-format
-msgid "calling %s"
-msgstr "ฉIฅs %s"
-
-#: ../eval.c:18651
-#, c-format
-msgid "%s aborted"
-msgstr "%s ณQฑjจ๎คคย_ฐ๕ฆๆ "
-
-#: ../eval.c:18653
-#, c-format
-msgid "%s returning #%<PRId64>"
-msgstr "%s ถวฆ^ญศ #%<PRId64> "
-
-#: ../eval.c:18670
-#, fuzzy, c-format
-msgid "%s returning %s"
-msgstr "%s ถวฆ^ญศ \"%s\""
-
-#: ../eval.c:18691 ../ex_cmds2.c:2695
-#, c-format
-msgid "continuing in %s"
-msgstr "ฤ~ฤ๒: %s"
-
-#: ../eval.c:18795
-msgid "E133: :return not inside a function"
-msgstr "E133: :return ฅฒถทฆbจ็ฆกธฬจฯฅฮ"
-
-#: ../eval.c:19159
-msgid ""
-"\n"
-"# global variables:\n"
-msgstr ""
-"\n"
-"# ฅฐ์ลผฦ:\n"
-
-#: ../eval.c:19254
-msgid ""
-"\n"
-"\tLast set from "
-msgstr ""
-"\n"
-"\tคWฆธณ]ฉw: "
-
-#: ../eval.c:19272
-#, fuzzy
-msgid "No old files"
-msgstr "จSฆณคคJภษฎื"
-
-#: ../ex_cmds.c:122
-#, c-format
-msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
-msgstr "<%s>%s%s %d, คQคปถiฆ์ %02x, คKถiฆ์ %03o"
-
-#: ../ex_cmds.c:145
-#, c-format
-msgid "> %d, Hex %04x, Octal %o"
-msgstr "> %d, คQคปถiฆ์ %04x, คKถiฆ์ %o"
-
-#: ../ex_cmds.c:146
-#, c-format
-msgid "> %d, Hex %08x, Octal %o"
-msgstr "> %d, คQคปถiฆ์ %08x, คKถiฆ์ %o"
-
-#: ../ex_cmds.c:684
-msgid "E134: Move lines into themselves"
-msgstr "E134: ตLชkงโฆๆฒพจ์ฅฆฆคwคบ"
-
-#: ../ex_cmds.c:747
-msgid "1 line moved"
-msgstr "คwทhฒพ 1 ฆๆ "
-
-#: ../ex_cmds.c:749
-#, c-format
-msgid "%<PRId64> lines moved"
-msgstr "คwทhฒพ %<PRId64> ฆๆ "
-
-#: ../ex_cmds.c:1175
-#, c-format
-msgid "%<PRId64> lines filtered"
-msgstr "คwณBฒz %<PRId64> ฆๆ "
-
-#: ../ex_cmds.c:1194
-msgid "E135: *Filter* Autocommands must not change current buffer"
-msgstr "E135: *Filter* Autocommand คฃฅiฅHง๓ง๏ฝwฝฤฐฯชบคบฎe"
-
-#: ../ex_cmds.c:1244
-msgid "[No write since last change]\n"
-msgstr "[ง๓ทsซแฉ|ฅผภxฆs]\n"
-
-#: ../ex_cmds.c:1424
-#, c-format
-msgid "%sviminfo: %s in line: "
-msgstr "%sviminfo: %s ฆbฆๆคค: "
-
-#: ../ex_cmds.c:1431
-msgid "E136: viminfo: Too many errors, skipping rest of file"
-msgstr "E136: viminfo: นLฆhฟ๙ป~, ฉฟฒคภษฎืจไพlณกคภ"
-
-#: ../ex_cmds.c:1458
-#, c-format
-msgid "Reading viminfo file \"%s\"%s%s%s"
-msgstr "ลชจ๚ viminfo ภษฎื \"%s\"%s%s%s"
-
-#: ../ex_cmds.c:1460
-msgid " info"
-msgstr " ฐTฎง"
-
-#: ../ex_cmds.c:1461
-msgid " marks"
-msgstr " ผะฐO"
-
-#: ../ex_cmds.c:1462
-#, fuzzy
-msgid " oldfiles"
-msgstr "จSฆณคคJภษฎื"
-
-#: ../ex_cmds.c:1463
-msgid " FAILED"
-msgstr " ฅขฑั"
-
-#. avoid a wait_return for this message, it's annoying
-#: ../ex_cmds.c:1541
-#, c-format
-msgid "E137: Viminfo file is not writable: %s"
-msgstr "E137: Viminfo ภษฎืตLชkผgคJ: %s"
-
-#: ../ex_cmds.c:1626
-#, c-format
-msgid "E138: Can't write viminfo file %s!"
-msgstr "E138: ตLชkผgคJ viminfo ภษฎื %s !"
-
-#: ../ex_cmds.c:1635
-#, c-format
-msgid "Writing viminfo file \"%s\""
-msgstr "ผgคJ viminfo ภษฎื \"%s\" คค"
-
-#. Write the info:
-#: ../ex_cmds.c:1720
-#, c-format
-msgid "# This viminfo file was generated by Vim %s.\n"
-msgstr "# ฅป viminfo ภษฎืฌOฅั Vim %s ฉาฒฃฅอ.\n"
-
-#: ../ex_cmds.c:1722
-msgid ""
-"# You may edit it if you're careful!\n"
-"\n"
-msgstr ""
-"# ฆpชGทQญnฆฆๆญืง๏ฝะฏSงOคpค฿กI\n"
-"\n"
-
-#: ../ex_cmds.c:1723
-msgid "# Value of 'encoding' when this file was written\n"
-msgstr "# 'encoding' ฆbฆนภษซุฅ฿ฎษชบญศ\n"
-
-#: ../ex_cmds.c:1800
-msgid "Illegal starting char"
-msgstr "ตLฎฤชบฐ_ฉlฆrคธ"
-
-#: ../ex_cmds.c:2162
-msgid "Write partial file?"
-msgstr "ญnผgคJณกคภภษฎืถกH"
-
-#: ../ex_cmds.c:2166
-msgid "E140: Use ! to write partial buffer"
-msgstr "E140: ฝะจฯฅฮ ! ฅHผgคJณกคภฝwฝฤฐฯ"
-
-#: ../ex_cmds.c:2281
-#, fuzzy, c-format
-msgid "Overwrite existing file \"%s\"?"
-msgstr "ญnยะผgคwฆsฆbชบภษฎื \"%.*s\"กH"
-
-#: ../ex_cmds.c:2317
-#, c-format
-msgid "Swap file \"%s\" exists, overwrite anyway?"
-msgstr ""
-
-#: ../ex_cmds.c:2326
-#, fuzzy, c-format
-msgid "E768: Swap file exists: %s (:silent! overrides)"
-msgstr "E13: ภษฎืคwธgฆsฆb (ฅiฅฮ ! ฑjจ๎จ๚ฅN)"
-
-#: ../ex_cmds.c:2381
-#, c-format
-msgid "E141: No file name for buffer %<PRId64>"
-msgstr "E141: ฝwฝฤฐฯ %<PRId64> จSฆณภษฎืฆWบู"
-
-#: ../ex_cmds.c:2412
-msgid "E142: File not written: Writing is disabled by 'write' option"
-msgstr "E142: ภษฎืฅผผgคJกAฆ]ฌฐ 'write' ฟ๏ถตณQร๖ณฌ"
-
-#: ../ex_cmds.c:2434
-#, fuzzy, c-format
-msgid ""
-"'readonly' option is set for \"%s\".\n"
-"Do you wish to write anyway?"
-msgstr ""
-"\"%.*s\" คwณ]ฉw 'readonly' ฟ๏ถต.\n"
-"ฝTฉwญnยะผgถกH"
-
-#: ../ex_cmds.c:2439
-#, c-format
-msgid ""
-"File permissions of \"%s\" are read-only.\n"
-"It may still be possible to write it.\n"
-"Do you wish to try?"
-msgstr ""
-
-#: ../ex_cmds.c:2451
-#, fuzzy, c-format
-msgid "E505: \"%s\" is read-only (add ! to override)"
-msgstr "ฌOฐ฿ลชภษ (ฝะจฯฅฮ ! ฑjจ๎ฐ๕ฆๆ)"
-
-#: ../ex_cmds.c:3120
-#, c-format
-msgid "E143: Autocommands unexpectedly deleted new buffer %s"
-msgstr "E143: Autocommands ทNฅ~ฆaงRฐฃทsฝwฝฤฐฯ %s"
-
-#: ../ex_cmds.c:3313
-msgid "E144: non-numeric argument to :z"
-msgstr "E144: :z คฃฑตจซDผฦฆrชบฐัผฦ"
-
-#: ../ex_cmds.c:3404
-msgid "E145: Shell commands not allowed in rvim"
-msgstr "E145: rvim คคธTค๎จฯฅฮ shell ฉRฅO"
-
-#: ../ex_cmds.c:3498
-msgid "E146: Regular expressions can't be delimited by letters"
-msgstr "E146: Regular expression ตLชkฅฮฆrฅภคภนj (?)"
-
-#: ../ex_cmds.c:3964
-#, c-format
-msgid "replace with %s (y/n/a/q/l/^E/^Y)?"
-msgstr "จ๚ฅNฌฐ %s (y/n/a/q/^E/^Y)?"
-
-#: ../ex_cmds.c:4379
-msgid "(Interrupted) "
-msgstr "(คwคคย_) "
-
-#: ../ex_cmds.c:4384
-#, fuzzy
-msgid "1 match"
-msgstr "; ฒลฆX "
-
-#: ../ex_cmds.c:4384
-msgid "1 substitution"
-msgstr "จ๚ฅNค@ฒี "
-
-#: ../ex_cmds.c:4387
-#, fuzzy, c-format
-msgid "%<PRId64> matches"
-msgstr "%<PRId64> ถตง๏ล"
-
-#: ../ex_cmds.c:4388
-#, c-format
-msgid "%<PRId64> substitutions"
-msgstr "จ๚ฅN %<PRId64> ฒี "
-
-#: ../ex_cmds.c:4392
-msgid " on 1 line"
-msgstr "กAฝdณ๒กGค@ฆๆ "
-
-#: ../ex_cmds.c:4395
-#, c-format
-msgid " on %<PRId64> lines"
-msgstr "กAฝdณ๒กG %<PRId64> ฆๆ "
-
-#: ../ex_cmds.c:4438
-msgid "E147: Cannot do :global recursive"
-msgstr "E147: :global ตLชkปผฐjฐ๕ฆๆ "
-
-#: ../ex_cmds.c:4467
-msgid "E148: Regular expression missing from global"
-msgstr "E148: จSฆณจฯฅฮนL Regular expression (?)"
-
-#: ../ex_cmds.c:4508
-#, c-format
-msgid "Pattern found in every line: %s"
-msgstr "จCค@ฆๆณฃงไคฃจ์: %s"
-
-#: ../ex_cmds.c:4510
-#, fuzzy, c-format
-msgid "Pattern not found: %s"
-msgstr "งไคฃจ์"
-
-#: ../ex_cmds.c:4587
-msgid ""
-"\n"
-"# Last Substitute String:\n"
-"$"
-msgstr ""
-"\n"
-"# ซeค@ฒีดภฅNฆrฆ๊:\n"
-"$"
-
-#: ../ex_cmds.c:4679
-msgid "E478: Don't panic!"
-msgstr "E478: คฃญnลๅทW!"
-
-#: ../ex_cmds.c:4717
-#, c-format
-msgid "E661: Sorry, no '%s' help for %s"
-msgstr "E661: ฉ๊บp, จSฆณร๖ฉ๓ %s-%s ชบปกฉ๚"
-
-#: ../ex_cmds.c:4719
-#, c-format
-msgid "E149: Sorry, no help for %s"
-msgstr "E149: ฉ๊บp, จSฆณ %s ชบปกฉ๚"
-
-#: ../ex_cmds.c:4751
-#, c-format
-msgid "Sorry, help file \"%s\" not found"
-msgstr "ฉ๊บp, งไคฃจ์ปกฉ๚ภษ \"%s\""
-
-#: ../ex_cmds.c:5323
-#, c-format
-msgid "E150: Not a directory: %s"
-msgstr "E150: %s คฃฌOฅุฟ"
-
-#: ../ex_cmds.c:5446
-#, c-format
-msgid "E152: Cannot open %s for writing"
-msgstr "E152: ตLชkฅHผgคJผาฆกถ}ฑา \"%s\""
-
-#: ../ex_cmds.c:5471
-#, c-format
-msgid "E153: Unable to open %s for reading"
-msgstr "E153: ตLชkลชจ๚ภษฎื: %s"
-
-#: ../ex_cmds.c:5500
-#, c-format
-msgid "E670: Mix of help file encodings within a language: %s"
-msgstr "E670: ฆPค@ปyจฅ (%s) คคฆณฒVฆXคฃฆPฆrคธฝsฝXชบปกฉ๚ภษ"
-
-#: ../ex_cmds.c:5565
-#, fuzzy, c-format
-msgid "E154: Duplicate tag \"%s\" in file %s/%s"
-msgstr "E154: ผะลา(tag) \"%s\" ฆbภษฎื %s ธฬญซฝฦฅXฒ{ฆhฆธ"
-
-#: ../ex_cmds.c:5687
-#, c-format
-msgid "E160: Unknown sign command: %s"
-msgstr "E160: ฅผฉwธqชบ sign command: %s"
-
-#: ../ex_cmds.c:5704
-msgid "E156: Missing sign name"
-msgstr "E156: ฏสคึ sign ฆWบู"
-
-#: ../ex_cmds.c:5746
-msgid "E612: Too many signs defined"
-msgstr "E612: คwฉwธqคำฆh signs"
-
-#: ../ex_cmds.c:5813
-#, c-format
-msgid "E239: Invalid sign text: %s"
-msgstr "E239: คฃฅฟฝTชบ sign คๅฆr: %s"
-
-#: ../ex_cmds.c:5844 ../ex_cmds.c:6035
-#, c-format
-msgid "E155: Unknown sign: %s"
-msgstr "E155: คฃฅฟฝTชบ sign: %s"
-
-#: ../ex_cmds.c:5877
-msgid "E159: Missing sign number"
-msgstr "E159: ฏสคึ sign number"
-
-#: ../ex_cmds.c:5971
-#, c-format
-msgid "E158: Invalid buffer name: %s"
-msgstr "E158: ฝwฝฤฐฯฆWบูฟ๙ป~: %s"
-
-#: ../ex_cmds.c:6008
-#, c-format
-msgid "E157: Invalid sign ID: %<PRId64>"
-msgstr "E157: Sign ID ฟ๙ป~: %<PRId64>"
-
-#: ../ex_cmds.c:6066
-msgid " (not supported)"
-msgstr " (คฃคไดฉ) "
-
-#: ../ex_cmds.c:6169
-msgid "[Deleted]"
-msgstr "[คwงRฐฃ]"
-
-#: ../ex_cmds2.c:139
-msgid "Entering Debug mode. Type \"cont\" to continue."
-msgstr "ถiคJฐฃฟ๙ผาฆก. ฟ้คJ \"cont\" ฅHฆ^จ์ฅฟฑ`ผาฆก."
-
-#: ../ex_cmds2.c:143 ../ex_docmd.c:759
-#, c-format
-msgid "line %<PRId64>: %s"
-msgstr "ฆๆ %<PRId64>: %s"
-
-#: ../ex_cmds2.c:145
-#, c-format
-msgid "cmd: %s"
-msgstr "cmd: %s"
-
-#: ../ex_cmds2.c:322
-#, c-format
-msgid "Breakpoint in \"%s%s\" line %<PRId64>"
-msgstr "\"%s%s\" คคย_ยI: ฒฤ %<PRId64> ฆๆ "
-
-#: ../ex_cmds2.c:581
-#, c-format
-msgid "E161: Breakpoint not found: %s"
-msgstr "E161: งไคฃจ์คคย_ยI: %s"
-
-#: ../ex_cmds2.c:611
-msgid "No breakpoints defined"
-msgstr "จSฆณฉwธqคคย_ยI"
-
-#: ../ex_cmds2.c:617
-#, c-format
-msgid "%3d %s %s line %<PRId64>"
-msgstr "%3d %s %s ฒฤ %<PRId64> ฆๆ "
-
-#: ../ex_cmds2.c:942
-msgid "E750: First use \":profile start {fname}\""
-msgstr ""
-
-#: ../ex_cmds2.c:1269
-#, fuzzy, c-format
-msgid "Save changes to \"%s\"?"
-msgstr "ฑNลฐสฆsภxฆ \"%.*s\"?"
-
-#: ../ex_cmds2.c:1271 ../ex_docmd.c:8851
-msgid "Untitled"
-msgstr "ฅผฉRฆW"
-
-#: ../ex_cmds2.c:1421
-#, c-format
-msgid "E162: No write since last change for buffer \"%s\""
-msgstr "E162: คwง๓ง๏นLฝwฝฤฐฯ \"%s\" ฆฉ|ฅผฆsภษ (ฅiฅฮ ! ฑjจ๎ฐ๕ฆๆ)"
-
-#: ../ex_cmds2.c:1480
-msgid "Warning: Entered other buffer unexpectedly (check autocommands)"
-msgstr "ช`ทN: คwคมดซจ์จไฅฆฝwฝฤฐฯ (ฝะภหฌd Autocommands ฆณตLฟ๙ป~)"
-
-#: ../ex_cmds2.c:1826
-msgid "E163: There is only one file to edit"
-msgstr "E163: ฅuฆณค@ญำภษฎืฅiฝsฟ่"
-
-#: ../ex_cmds2.c:1828
-msgid "E164: Cannot go before first file"
-msgstr "E164: คwธgฆbฒฤค@ญำภษฎืคF"
-
-#: ../ex_cmds2.c:1830
-msgid "E165: Cannot go beyond last file"
-msgstr "E165: คwธgฆbณฬซแค@ญำภษฎืคF"
-
-#: ../ex_cmds2.c:2175
-#, c-format
-msgid "E666: compiler not supported: %s"
-msgstr "E666: ฝsฤถพนคฃคไดฉ: %s"
-
-#: ../ex_cmds2.c:2257
-#, c-format
-msgid "Searching for \"%s\" in \"%s\""
-msgstr "ทjดMคค: \"%s\" -- \"%s\""
-
-#: ../ex_cmds2.c:2284
-#, c-format
-msgid "Searching for \"%s\""
-msgstr "ทjดMคค: \"%s\""
-
-#: ../ex_cmds2.c:2307
-#, c-format
-msgid "not found in 'runtimepath': \"%s\""
-msgstr "ฆb 'runtimepath' ธฬงไคฃจ์ \"%s\""
-
-#: ../ex_cmds2.c:2472
-#, c-format
-msgid "Cannot source a directory: \"%s\""
-msgstr "ตLชkฐ๕ฆๆฅุฟกG \"%s\""
-
-#: ../ex_cmds2.c:2518
-#, c-format
-msgid "could not source \"%s\""
-msgstr "ตLชkฐ๕ฆๆ \"%s\""
-
-#: ../ex_cmds2.c:2520
-#, c-format
-msgid "line %<PRId64>: could not source \"%s\""
-msgstr "ฒฤ %<PRId64> ฆๆ: ตLชkฐ๕ฆๆ \"%s\""
-
-#: ../ex_cmds2.c:2535
-#, c-format
-msgid "sourcing \"%s\""
-msgstr "ฐ๕ฆๆ \"%s\" คค"
-
-#: ../ex_cmds2.c:2537
-#, c-format
-msgid "line %<PRId64>: sourcing \"%s\""
-msgstr "ฒฤ %<PRId64> ฆๆ: ตฒง๔ฐ๕ฆๆ %s"
-
-#: ../ex_cmds2.c:2693
-#, c-format
-msgid "finished sourcing %s"
-msgstr "ตฒง๔ฐ๕ฆๆ %s"
-
-#: ../ex_cmds2.c:2765
-#, fuzzy
-msgid "modeline"
-msgstr "มูฆณค@ฆๆ "
-
-#: ../ex_cmds2.c:2767
-#, fuzzy
-msgid "--cmd argument"
-msgstr "vim [ฐัผฦ] "
-
-#: ../ex_cmds2.c:2769
-#, fuzzy
-msgid "-c argument"
-msgstr "vim [ฐัผฦ] "
-
-#: ../ex_cmds2.c:2771
-msgid "environment variable"
-msgstr ""
-
-#: ../ex_cmds2.c:2773
-#, fuzzy
-msgid "error handler"
-msgstr "ฟ๙ป~ปPคคย_"
-
-#: ../ex_cmds2.c:3020
-msgid "W15: Warning: Wrong line separator, ^M may be missing"
-msgstr "W15: ช`ทN: ฟ๙ป~ชบฆๆคภนjฆrคธกAฅiฏเฌOคึคF ^M"
-
-#: ../ex_cmds2.c:3139
-msgid "E167: :scriptencoding used outside of a sourced file"
-msgstr "E167: ฆbฐ๕ฆๆ script ภษฎืฅ~คฃฅiจฯฅฮ :scriptencoding"
-
-#: ../ex_cmds2.c:3166
-msgid "E168: :finish used outside of a sourced file"
-msgstr "E168: ฆbฐ๕ฆๆ script ภษฎืฅ~คฃฅiจฯฅฮ :finish"
-
-#: ../ex_cmds2.c:3389
-#, c-format
-msgid "Current %slanguage: \"%s\""
-msgstr "ฅุซeชบ %sปyจฅ: \"%s\""
-
-#: ../ex_cmds2.c:3404
-#, c-format
-msgid "E197: Cannot set language to \"%s\""
-msgstr "E197: คฃฏเณ]ฉwปyจฅฆจ \"%s\""
-
-#. don't redisplay the window
-#. don't wait for return
-#: ../ex_docmd.c:387
-msgid "Entering Ex mode. Type \"visual\" to go to Normal mode."
-msgstr "ถiคJ Ex ผาฆก. ฟ้คJ \"visua\" ฅHฆ^จ์ฅฟฑ`ผาฆก."
-
-#: ../ex_docmd.c:428
-msgid "E501: At end-of-file"
-msgstr "E501: คwจ์ภษฎืตฒงภ"
-
-#: ../ex_docmd.c:513
-msgid "E169: Command too recursive"
-msgstr "E169: ฉRฅOปผฐjผhผฦนLฆh"
-
-#: ../ex_docmd.c:1006
-#, c-format
-msgid "E605: Exception not caught: %s"
-msgstr "E605: ฅผฤdบIชบจาฅ~กG %s"
-
-#: ../ex_docmd.c:1085
-msgid "End of sourced file"
-msgstr "ฉRฅOภษตฒง๔"
-
-#: ../ex_docmd.c:1086
-msgid "End of function"
-msgstr "จ็ฆกตฒงภ"
-
-#: ../ex_docmd.c:1628
-msgid "E464: Ambiguous use of user-defined command"
-msgstr "E464: จฯฅฮชฬฉwธqชบฉRฅOท|ฒVฒc"
-
-#: ../ex_docmd.c:1638
-msgid "E492: Not an editor command"
-msgstr "E492: คฃฌOฝsฟ่พนชบฉRฅO"
-
-#: ../ex_docmd.c:1729
-msgid "E493: Backwards range given"
-msgstr "E493: ซฉwคFฆVซeฐัฆาชบฝdณ๒"
-
-#: ../ex_docmd.c:1733
-msgid "Backwards range given, OK to swap"
-msgstr "ซฉwคFฆVซeฐัฆาชบฝdณ๒กAOK to swap"
-
-#. append
-#. typed wrong
-#: ../ex_docmd.c:1787
-msgid "E494: Use w or w>>"
-msgstr "E494: ฝะจฯฅฮ w ฉฮ w>>"
-
-#: ../ex_docmd.c:3454
-msgid "E319: The command is not available in this version"
-msgstr "E319: ฉ๊บp, ฅปฉRฅOฆbฆนชฉฅปคคจSฆณน๊ง@"
-
-#: ../ex_docmd.c:3752
-msgid "E172: Only one file name allowed"
-msgstr "E172: ฅuฏเฆณค@ญำภษ"
-
-#: ../ex_docmd.c:4238
-msgid "1 more file to edit. Quit anyway?"
-msgstr "มูฆณค@ญำภษฎืฅผฝsฟ่. ฝTฉwญnย๗ถ}กH"
-
-#: ../ex_docmd.c:4242
-#, c-format
-msgid "%d more files to edit. Quit anyway?"
-msgstr "มูฆณ %d ญำภษฎืฅผฝsฟ่. ฝTฉwญnย๗ถ}กH"
-
-#: ../ex_docmd.c:4248
-msgid "E173: 1 more file to edit"
-msgstr "E173: มูฆณค@ญำภษฎืฅผฝsฟ่ "
-
-#: ../ex_docmd.c:4250
-#, c-format
-msgid "E173: %<PRId64> more files to edit"
-msgstr "E173: มูฆณ %<PRId64> ญำภษฎืฅผฝsฟ่"
-
-#: ../ex_docmd.c:4320
-msgid "E174: Command already exists: add ! to replace it"
-msgstr "E174: ฉRฅOคwธgฆsฆb, ฝะจฯฅฮ ! ฑjจ๎ญซทsฉwธq"
-
-#: ../ex_docmd.c:4432
-msgid ""
-"\n"
-" Name Args Range Complete Definition"
-msgstr ""
-"\n"
-" ฆWบู ฐัผฦ ฝdณ๒ งนพใ ฉwธq "
-
-#: ../ex_docmd.c:4516
-msgid "No user-defined commands found"
-msgstr "งไคฃจ์จฯฅฮชฬฉwธqชบฉRฅO"
-
-#: ../ex_docmd.c:4538
-msgid "E175: No attribute specified"
-msgstr "E175: จSฆณซฉwชบฤฉส"
-
-#: ../ex_docmd.c:4583
-msgid "E176: Invalid number of arguments"
-msgstr "E176: คฃฅฟฝTชบฐัผฦผฦฅุ"
-
-#: ../ex_docmd.c:4594
-msgid "E177: Count cannot be specified twice"
-msgstr "E177: คฃฏเซฉwจโฆธผฦฅุ"
-
-#: ../ex_docmd.c:4603
-msgid "E178: Invalid default value for count"
-msgstr "E178: ผฦฅุชบนwณ]ฐัผฦคฃฅฟฝT"
-
-#: ../ex_docmd.c:4625
-#, fuzzy
-msgid "E179: argument required for -complete"
-msgstr "E179: ซฅOปญnฐัผฦค~ฏเงนฆจ"
-
-#: ../ex_docmd.c:4635
-#, c-format
-msgid "E181: Invalid attribute: %s"
-msgstr "E181: คฃฅฟฝTชบฤฉส: %s"
-
-#: ../ex_docmd.c:4678
-msgid "E182: Invalid command name"
-msgstr "E182: ซฅOฆWบูคฃฅฟฝT"
-
-#: ../ex_docmd.c:4691
-msgid "E183: User defined commands must start with an uppercase letter"
-msgstr "E183: จฯฅฮชฬฆฉwซฅOฅฒถทฅHคjผgฆrฅภถ}ฉl"
-
-#: ../ex_docmd.c:4696
-#, fuzzy
-msgid "E841: Reserved name, cannot be used for user defined command"
-msgstr "E464: จฯฅฮชฬฉwธqชบฉRฅOท|ฒVฒc"
-
-#: ../ex_docmd.c:4751
-#, c-format
-msgid "E184: No such user-defined command: %s"
-msgstr "E184: จSฆณจฯฅฮชฬฆฉwชบฉRฅOกG %s"
-
-#: ../ex_docmd.c:5219
-#, c-format
-msgid "E180: Invalid complete value: %s"
-msgstr "E180: คฃงนพใชบญศ: '%s'"
-
-#: ../ex_docmd.c:5225
-msgid "E468: Completion argument only allowed for custom completion"
-msgstr "E468: ฆญqธษงนฎษค~ฅiธษงนฐัผฦ"
-
-#: ../ex_docmd.c:5231
-msgid "E467: Custom completion requires a function argument"
-msgstr "E467: ฆญqธษงนปญnจ็ฆกฌฐฐัผฦ"
-
-#: ../ex_docmd.c:5257
-#, fuzzy, c-format
-msgid "E185: Cannot find color scheme '%s'"
-msgstr "E185: งไคฃจ์รCฆโผหฆก %s"
-
-#: ../ex_docmd.c:5263
-msgid "Greetings, Vim user!"
-msgstr "ถู, Vim จฯฅฮชฬกI"
-
-#: ../ex_docmd.c:5431
-#, fuzzy
-msgid "E784: Cannot close last tab page"
-msgstr "E444: คฃฏเร๖ณฌณฬซแค@ญำต๘ตก"
-
-#: ../ex_docmd.c:5462
-#, fuzzy
-msgid "Already only one tab page"
-msgstr "คwธgฅuณัค@ญำต๘ตกคF"
-
-#: ../ex_docmd.c:6004
-#, fuzzy, c-format
-msgid "Tab page %d"
-msgstr "ฒฤ %d ญถ"
-
-#: ../ex_docmd.c:6295
-msgid "No swap file"
-msgstr "ตLผศฆsภษ"
-
-#: ../ex_docmd.c:6478
-#, fuzzy
-msgid "E747: Cannot change directory, buffer is modified (add ! to override)"
-msgstr "E509: ตLชkซุฅ฿ณฦฅ๗ภษ (ฝะจฯฅฮ ! ฑjจ๎ฐ๕ฆๆ)"
-
-#: ../ex_docmd.c:6485
-msgid "E186: No previous directory"
-msgstr "E186: จSฆณซeค@ญำฅุฟ"
-
-#: ../ex_docmd.c:6530
-msgid "E187: Unknown"
-msgstr "E187: ตLชkฟ์รัชบผะฐO"
-
-#: ../ex_docmd.c:6610
-msgid "E465: :winsize requires two number arguments"
-msgstr "E465: :winsize ปญnจโญำฐัผฦ"
-
-#: ../ex_docmd.c:6655
-msgid "E188: Obtaining window position not implemented for this platform"
-msgstr "E188: ฆbฑzชบฅญฅxคWตLชkภ๒ฑoต๘ตกฆ์ธm"
-
-#: ../ex_docmd.c:6662
-msgid "E466: :winpos requires two number arguments"
-msgstr "E466: :winpos ปญnจโญำฐัผฦ"
-
-#: ../ex_docmd.c:7241
-#, fuzzy, c-format
-msgid "E739: Cannot create directory: %s"
-msgstr "ตLชkฐ๕ฆๆฅุฟกG \"%s\""
-
-#: ../ex_docmd.c:7268
-#, c-format
-msgid "E189: \"%s\" exists (add ! to override)"
-msgstr "E189: \"%s\" คwฆsฆb (ฝะฅฮ ! ฑjจ๎ฐ๕ฆๆ)"
-
-#: ../ex_docmd.c:7273
-#, c-format
-msgid "E190: Cannot open \"%s\" for writing"
-msgstr "E190: ตLชkฅHผgคJผาฆกถ}ฑา \"%s\""
-
-#. set mark
-#: ../ex_docmd.c:7294
-msgid "E191: Argument must be a letter or forward/backward quote"
-msgstr "E191: ฐัผฦฅฒถทฌOญ^คๅฆrฅภฉฮฆVซe/ซแชบคธน"
-
-#: ../ex_docmd.c:7333
-msgid "E192: Recursive use of :normal too deep"
-msgstr "E192: :normal ปผฐjผhผฦนLฒ`"
-
-#: ../ex_docmd.c:7807
-msgid "E194: No alternate file name to substitute for '#'"
-msgstr "E194: จSฆณ '#' ฅiดภฅNชบภษฆW"
-
-#: ../ex_docmd.c:7841
-msgid "E495: no autocommand file name to substitute for \"<afile>\""
-msgstr "E495: จSฆณ Autocommand ภษฆWฅHจ๚ฅN \"<afile>\""
-
-#: ../ex_docmd.c:7850
-msgid "E496: no autocommand buffer number to substitute for \"<abuf>\""
-msgstr "E496: จSฆณ Autocommand ฝwฝฤฐฯฆWบูฅHจ๚ฅN \"<abuf>\""
-
-#: ../ex_docmd.c:7861
-msgid "E497: no autocommand match name to substitute for \"<amatch>\""
-msgstr "E497: จSฆณ Autocommand ฒลฆXฆWบูฅHจ๚ฅN \"<amatch>\""
-
-#: ../ex_docmd.c:7870
-msgid "E498: no :source file name to substitute for \"<sfile>\""
-msgstr "E498: จSฆณ :source ภษฆWฅHจ๚ฅN \"<sfile>\""
-
-#: ../ex_docmd.c:7876
-#, fuzzy
-msgid "E842: no line number to use for \"<slnum>\""
-msgstr "E498: จSฆณ :source ภษฆWฅHจ๚ฅN \"<sfile>\""
-
-#: ../ex_docmd.c:7903
-#, fuzzy, c-format
-msgid "E499: Empty file name for '%' or '#', only works with \":p:h\""
-msgstr "E499: '%' ฉฮ '#' ซฆVชลภษฆWกAฅuฏเฅฮฉ๓ \":p:h\""
-
-#: ../ex_docmd.c:7905
-msgid "E500: Evaluates to an empty string"
-msgstr "E500: ฟ้คJฌฐชลฆrฆ๊"
-
-#: ../ex_docmd.c:8838
-msgid "E195: Cannot open viminfo file for reading"
-msgstr "E195: ตLชkลชจ๚ viminfo"
-
-#: ../ex_eval.c:464
-msgid "E608: Cannot :throw exceptions with 'Vim' prefix"
-msgstr "E608: คฃฏเ :throw ฅฮ 'Vim' ถ}ภYชบจาฅ~"
-
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:496
-#, c-format
-msgid "Exception thrown: %s"
-msgstr "ฅแฅXจาฅ~กG %s"
-
-#: ../ex_eval.c:545
-#, c-format
-msgid "Exception finished: %s"
-msgstr "จาฅ~ตฒง๔กG %s"
-
-#: ../ex_eval.c:546
-#, c-format
-msgid "Exception discarded: %s"
-msgstr "คwฅแฑ๓จาฅ~กG %s"
-
-#: ../ex_eval.c:588 ../ex_eval.c:634
-#, c-format
-msgid "%s, line %<PRId64>"
-msgstr "%s, ฆๆ %<PRId64>"
-
-#. always scroll up, don't overwrite
-#: ../ex_eval.c:608
-#, c-format
-msgid "Exception caught: %s"
-msgstr "ตoฅอจาฅ~กG%s"
-
-#: ../ex_eval.c:676
-#, c-format
-msgid "%s made pending"
-msgstr "%s ณyฆจ pending"
-
-#: ../ex_eval.c:679
-#, c-format
-msgid "%s resumed"
-msgstr "%s คwฆ^ด_"
-
-#: ../ex_eval.c:683
-#, c-format
-msgid "%s discarded"
-msgstr "%s คwฅแฑ๓"
-
-#: ../ex_eval.c:708
-msgid "Exception"
-msgstr "จาฅ~"
-
-#: ../ex_eval.c:713
-msgid "Error and interrupt"
-msgstr "ฟ๙ป~ปPคคย_"
-
-#: ../ex_eval.c:715
-msgid "Error"
-msgstr "ฟ๙ป~"
-
-#. if (pending & CSTP_INTERRUPT)
-#: ../ex_eval.c:717
-msgid "Interrupt"
-msgstr "คคย_"
-
-#: ../ex_eval.c:795
-msgid "E579: :if nesting too deep"
-msgstr "E579: :if ผhผฦนLฒ`"
-
-#: ../ex_eval.c:830
-msgid "E580: :endif without :if"
-msgstr "E580: :endif ฏสคึน๏ภณชบ :if"
-
-#: ../ex_eval.c:873
-msgid "E581: :else without :if"
-msgstr "E581: :else ฏสคึน๏ภณชบ :if"
-
-#: ../ex_eval.c:876
-msgid "E582: :elseif without :if"
-msgstr "E582: :elseif ฏสคึน๏ภณชบ :if"
-
-#: ../ex_eval.c:880
-msgid "E583: multiple :else"
-msgstr "E583: ฆhญซ :else"
-
-#: ../ex_eval.c:883
-msgid "E584: :elseif after :else"
-msgstr "E584: :elseif ฆb :else คงซแ"
-
-#: ../ex_eval.c:941
-#, fuzzy
-msgid "E585: :while/:for nesting too deep"
-msgstr "E585: :while ผhผฦนLฒ`"
-
-#: ../ex_eval.c:1028
-#, fuzzy
-msgid "E586: :continue without :while or :for"
-msgstr "E586: :continue ฏสคึน๏ภณชบ :while"
-
-#: ../ex_eval.c:1061
-#, fuzzy
-msgid "E587: :break without :while or :for"
-msgstr "E587: :break ฏสคึน๏ภณชบ :while"
-
-#: ../ex_eval.c:1102
-#, fuzzy
-msgid "E732: Using :endfor with :while"
-msgstr "E170: ฏสคึ :endwhile"
-
-#: ../ex_eval.c:1104
-#, fuzzy
-msgid "E733: Using :endwhile with :for"
-msgstr "E170: ฏสคึ :endwhile"
-
-#: ../ex_eval.c:1247
-msgid "E601: :try nesting too deep"
-msgstr "E601: :if ผhผฦนLฒ`"
-
-#: ../ex_eval.c:1317
-msgid "E603: :catch without :try"
-msgstr "E603: :catch จSฆณ :try"
-
-#. Give up for a ":catch" after ":finally" and ignore it.
-#. * Just parse.
-#: ../ex_eval.c:1332
-msgid "E604: :catch after :finally"
-msgstr "E604: :catch ฆb :finally คงซแ"
-
-#: ../ex_eval.c:1451
-msgid "E606: :finally without :try"
-msgstr "E606: :finally จSฆณ :try"
-
-#. Give up for a multiple ":finally" and ignore it.
-#: ../ex_eval.c:1467
-msgid "E607: multiple :finally"
-msgstr "E607: ฆhญซ :finally"
-
-#: ../ex_eval.c:1571
-msgid "E602: :endtry without :try"
-msgstr "E602: :endif ฏสคึน๏ภณชบ :if"
-
-#: ../ex_eval.c:2026
-msgid "E193: :endfunction not inside a function"
-msgstr "E193: :endfunction ฅฒถทฆbจ็ฆกคบณกจฯฅฮ"
-
-#: ../ex_getln.c:1643
-#, fuzzy
-msgid "E788: Not allowed to edit another buffer now"
-msgstr "E48: คฃฏเฆb sandbox ธฬฅXฒ{"
-
-#: ../ex_getln.c:1656
-#, fuzzy
-msgid "E811: Not allowed to change buffer information now"
-msgstr "E94: งไคฃจ์ %s"
-
-#: ../ex_getln.c:3178
-msgid "tagname"
-msgstr "ผะลาฆWบู"
-
-#: ../ex_getln.c:3181
-msgid " kind file\n"
-msgstr "รภษฎื\n"
-
-#: ../ex_getln.c:4799
-msgid "'history' option is zero"
-msgstr "ฟ๏ถต 'history' ฌOนs"
-
-#: ../ex_getln.c:5046
-#, c-format
-msgid ""
-"\n"
-"# %s History (newest to oldest):\n"
-msgstr ""
-"\n"
-"# %s พ๚ฅvฐOฟ (ทsจ์ยย):\n"
-
-#: ../ex_getln.c:5047
-msgid "Command Line"
-msgstr "ฉRฅOฆC"
-
-#: ../ex_getln.c:5048
-msgid "Search String"
-msgstr "ทjดMฆrฆ๊"
-
-#: ../ex_getln.c:5049
-msgid "Expression"
-msgstr "นBบโฆก"
-
-#: ../ex_getln.c:5050
-msgid "Input Line"
-msgstr "ฟ้คJฆๆ "
-
-#: ../ex_getln.c:5117
-msgid "E198: cmd_pchar beyond the command length"
-msgstr "E198: cmd_pchar ถWนLฉRฅOช๘ซื"
-
-#: ../ex_getln.c:5279
-msgid "E199: Active window or buffer deleted"
-msgstr "E199: คwงRฐฃฑผง@ฅฮคคชบต๘ตกฉฮผศฆsฐฯ"
-
-#: ../file_search.c:203
-msgid "E854: path too long for completion"
-msgstr ""
-
-#: ../file_search.c:446
-#, c-format
-msgid ""
-"E343: Invalid path: '**[number]' must be at the end of the path or be "
-"followed by '%s'."
-msgstr "E343: คฃฅฟฝTชบธ๔ฎ|: '**[number]' ฅฒปญnฆbธ๔ฎ|ตฒงภฉฮญnฑตต '%s'"
-
-#: ../file_search.c:1505
-#, c-format
-msgid "E344: Can't find directory \"%s\" in cdpath"
-msgstr "E344: cdpath คคจSฆณฅุฟ \"%s\""
-
-#: ../file_search.c:1508
-#, c-format
-msgid "E345: Can't find file \"%s\" in path"
-msgstr "E345: ฆbธ๔ฎ|คคงไคฃจ์ภษฎื \"%s\""
-
-#: ../file_search.c:1512
-#, c-format
-msgid "E346: No more directory \"%s\" found in cdpath"
-msgstr "E346: ฆbธ๔ฎ|คคงไคฃจ์ง๓ฆhชบภษฎื \"%s\""
-
-#: ../file_search.c:1515
-#, c-format
-msgid "E347: No more file \"%s\" found in path"
-msgstr "E347: ฆbธ๔ฎ|คคงไคฃจ์ง๓ฆhชบภษฎื \"%s\""
-
-#: ../fileio.c:137
-#, fuzzy
-msgid "E812: Autocommands changed buffer or buffer name"
-msgstr "E135: *Filter* Autocommand คฃฅiฅHง๓ง๏ฝwฝฤฐฯชบคบฎe"
-
-#: ../fileio.c:368
-msgid "Illegal file name"
-msgstr "คฃฅฟฝTชบภษฆW"
-
-#: ../fileio.c:395 ../fileio.c:476 ../fileio.c:2543 ../fileio.c:2578
-msgid "is a directory"
-msgstr "ฌOฅุฟ"
-
-#: ../fileio.c:397
-msgid "is not a file"
-msgstr "คฃฌOภษฎื"
-
-#: ../fileio.c:508 ../fileio.c:3522
-msgid "[New File]"
-msgstr "[ฅผฉRฆW]"
-
-#: ../fileio.c:511
-msgid "[New DIRECTORY]"
-msgstr ""
-
-#: ../fileio.c:529 ../fileio.c:532
-msgid "[File too big]"
-msgstr ""
-
-#: ../fileio.c:534
-msgid "[Permission Denied]"
-msgstr "[ลvญญคฃจฌ]"
-
-#: ../fileio.c:653
-msgid "E200: *ReadPre autocommands made the file unreadable"
-msgstr "E200: *ReadPre Autocommand จฯต{ฆกตLชkลชจ๚ฆนภษ"
-
-#: ../fileio.c:655
-msgid "E201: *ReadPre autocommands must not change current buffer"
-msgstr "E201: *Filter* Autocommand คฃฅiฅHง๓ง๏ฝwฝฤฐฯชบคบฎe"
-
-#: ../fileio.c:672
-msgid "Nvim: Reading from stdin...\n"
-msgstr "Vim: ฑqผะทวฟ้คJลชจ๚...\n"
-
-#. Re-opening the original file failed!
-#: ../fileio.c:909
-msgid "E202: Conversion made file unreadable!"
-msgstr "E202: ยเดซฟ๙ป~"
-
-#. fifo or socket
-#: ../fileio.c:1782
-msgid "[fifo/socket]"
-msgstr "[fifo/socket]"
-
-#. fifo
-#: ../fileio.c:1788
-msgid "[fifo]"
-msgstr "[fifo]"
-
-#. or socket
-#: ../fileio.c:1794
-msgid "[socket]"
-msgstr "[socket]"
-
-#. or character special
-#: ../fileio.c:1801
-#, fuzzy
-msgid "[character special]"
-msgstr "ค@ญำฆrคธ"
-
-#: ../fileio.c:1815
-msgid "[CR missing]"
-msgstr "[ฏสคึCR]'"
-
-#: ../fileio.c:1819
-msgid "[long lines split]"
-msgstr "[คภณฮนLช๘ฆๆ]"
-
-#: ../fileio.c:1823 ../fileio.c:3512
-msgid "[NOT converted]"
-msgstr "[ฅผยเดซ]"
-
-#: ../fileio.c:1826 ../fileio.c:3515
-msgid "[converted]"
-msgstr "[คwยเดซ]"
-
-#: ../fileio.c:1831
-#, fuzzy, c-format
-msgid "[CONVERSION ERROR in line %<PRId64>]"
-msgstr "[ฆๆ %<PRId64> ฆณคฃฅฟฝTชบฆ์คธ]"
-
-#: ../fileio.c:1835
-#, c-format
-msgid "[ILLEGAL BYTE in line %<PRId64>]"
-msgstr "[ฆๆ %<PRId64> ฆณคฃฅฟฝTชบฆ์คธ]"
-
-#: ../fileio.c:1838
-msgid "[READ ERRORS]"
-msgstr "[ลชจ๚ฟ๙ป~]"
-
-#: ../fileio.c:2104
-msgid "Can't find temp file for conversion"
-msgstr "งไคฃจ์ยเดซฅฮชบผศฆsภษ"
-
-#: ../fileio.c:2110
-msgid "Conversion with 'charconvert' failed"
-msgstr "ฆrคธถฐยเดซฟ๙ป~"
-
-#: ../fileio.c:2113
-msgid "can't read output of 'charconvert'"
-msgstr "ตLชkลชจ๚ 'charconvert' ชบฟ้ฅX"
-
-#: ../fileio.c:2437
-#, fuzzy
-msgid "E676: No matching autocommands for acwrite buffer"
-msgstr "งไคฃจ์น๏ภณชบ autocommand"
-
-#: ../fileio.c:2466
-msgid "E203: Autocommands deleted or unloaded buffer to be written"
-msgstr "E203: Autocommand งRฐฃฉฮฤภฉ๑คFญnผgคJชบฝwฝฤฐฯ"
-
-#: ../fileio.c:2486
-msgid "E204: Autocommand changed number of lines in unexpected way"
-msgstr "E204: Autocommand ทNฅ~ฆaง๏ลคFฆๆธน"
-
-#: ../fileio.c:2548 ../fileio.c:2565
-msgid "is not a file or writable device"
-msgstr "คฃฌOภษฎืฉฮฅiผgคJชบธหธm"
-
-#: ../fileio.c:2601
-msgid "is read-only (add ! to override)"
-msgstr "ฌOฐ฿ลชภษ (ฝะจฯฅฮ ! ฑjจ๎ฐ๕ฆๆ)"
-
-#: ../fileio.c:2886
-msgid "E506: Can't write to backup file (add ! to override)"
-msgstr "E506: ตLชkผgคJณฦฅ๗ภษ (ฝะจฯฅฮ ! ฑjจ๎ฐ๕ฆๆ)"
-
-#: ../fileio.c:2898
-msgid "E507: Close error for backup file (add ! to override)"
-msgstr "E507: ตLชkร๖ณฌณฦฅ๗ภษ (ฝะจฯฅฮ ! ฑjจ๎ฐ๕ฆๆ)"
-
-#: ../fileio.c:2901
-msgid "E508: Can't read file for backup (add ! to override)"
-msgstr "E508: ตLชkลชจ๚ภษฎืฅHจัณฦฅ๗ (ฝะจฯฅฮ ! ฑjจ๎ฐ๕ฆๆ)"
-
-#: ../fileio.c:2923
-msgid "E509: Cannot create backup file (add ! to override)"
-msgstr "E509: ตLชkซุฅ฿ณฦฅ๗ภษ (ฝะจฯฅฮ ! ฑjจ๎ฐ๕ฆๆ)"
-
-#: ../fileio.c:3008
-msgid "E510: Can't make backup file (add ! to override)"
-msgstr "E510: ตLชkปsง@ณฦฅ๗ภษ (ฝะจฯฅฮ ! ฑjจ๎ฐ๕ฆๆ)"
-
-#. Can't write without a tempfile!
-#: ../fileio.c:3121
-msgid "E214: Can't find temp file for writing"
-msgstr "E214: งไคฃจ์ผgคJฅฮชบผศฆsภษ"
-
-#: ../fileio.c:3134
-msgid "E213: Cannot convert (add ! to write without conversion)"
-msgstr "E213: ตLชkยเดซ (ฝะจฯฅฮ ! ฑjจ๎คฃยเดซผgคJ)"
-
-#: ../fileio.c:3169
-msgid "E166: Can't open linked file for writing"
-msgstr "E166: ตLชkฅHผgคJผาฆกถ}ฑาณsตฒภษฎื"
-
-#: ../fileio.c:3173
-msgid "E212: Can't open file for writing"
-msgstr "E212: ตLชkฅHผgคJผาฆกถ}ฑา"
-
-#: ../fileio.c:3363
-msgid "E667: Fsync failed"
-msgstr "E667: Fsync ฉRฅOฐ๕ฆๆฅขฑั"
-
-#: ../fileio.c:3398
-msgid "E512: Close failed"
-msgstr "E512: ร๖ณฌฅขฑั"
-
-#: ../fileio.c:3436
-#, fuzzy
-msgid "E513: write error, conversion failed (make 'fenc' empty to override)"
-msgstr "E513: ตLชkผgคJ -- ยเดซฅขฑั"
-
-#: ../fileio.c:3441
-#, c-format
-msgid ""
-"E513: write error, conversion failed in line %<PRId64> (make 'fenc' empty to "
-"override)"
-msgstr ""
-
-#: ../fileio.c:3448
-msgid "E514: write error (file system full?)"
-msgstr "E514: ผgคJฟ๙ป~ (ภษฎืจtฒฮคwบกกH)"
-
-#: ../fileio.c:3506
-msgid " CONVERSION ERROR"
-msgstr "ยเดซฟ๙ป~"
-
-#: ../fileio.c:3509
-#, fuzzy, c-format
-msgid " in line %<PRId64>;"
-msgstr "ฆๆ %<PRId64>"
-
-#: ../fileio.c:3519
-msgid "[Device]"
-msgstr "[ธหธm]"
-
-#: ../fileio.c:3522
-msgid "[New]"
-msgstr "[ทs]"
-
-#: ../fileio.c:3535
-msgid " [a]"
-msgstr "[a]"
-
-#: ../fileio.c:3535
-msgid " appended"
-msgstr " คwชฅ["
-
-#: ../fileio.c:3537
-msgid " [w]"
-msgstr "[w]"
-
-#: ../fileio.c:3537
-msgid " written"
-msgstr " คwผgคJ"
-
-#: ../fileio.c:3579
-msgid "E205: Patchmode: can't save original file"
-msgstr "E205: Patch ผาฆก: ตLชkภxฆsญ์ฉlภษฎื"
-
-#: ../fileio.c:3602
-msgid "E206: patchmode: can't touch empty original file"
-msgstr "E206: Patch ผาฆก: ตLชkลง๓ชลชบญ์ฉlภษฎื"
-
-#: ../fileio.c:3616
-msgid "E207: Can't delete backup file"
-msgstr "E207: ตLชkงRฐฃณฦฅ๗ภษ"
-
-#: ../fileio.c:3672
-msgid ""
-"\n"
-"WARNING: Original file may be lost or damaged\n"
-msgstr ""
-"\n"
-"ฤตงi: ญ์ฉlภษฎืฌyฅขฉฮทlรa\n"
-
-#: ../fileio.c:3675
-msgid "don't quit the editor until the file is successfully written!"
-msgstr "ฆbภษฎืฅฟฝTผgคJซeฝะคลย๗ถ}ฝsฟ่พน!"
-
-#: ../fileio.c:3795
-msgid "[dos]"
-msgstr "[dos]"
-
-#: ../fileio.c:3795
-msgid "[dos format]"
-msgstr "[dos ฎๆฆก]"
-
-#: ../fileio.c:3801
-msgid "[mac]"
-msgstr "[mac]"
-
-#: ../fileio.c:3801
-msgid "[mac format]"
-msgstr "[mac ฎๆฆก]"
-
-#: ../fileio.c:3807
-msgid "[unix]"
-msgstr "[unix]"
-
-#: ../fileio.c:3807
-msgid "[unix format]"
-msgstr "[unix ฎๆฆก]"
-
-#: ../fileio.c:3831
-msgid "1 line, "
-msgstr "1 ฆๆ, "
-
-#: ../fileio.c:3833
-#, c-format
-msgid "%<PRId64> lines, "
-msgstr "%<PRId64> ฆๆ, "
-
-#: ../fileio.c:3836
-msgid "1 character"
-msgstr "ค@ญำฆrคธ"
-
-#: ../fileio.c:3838
-#, c-format
-msgid "%<PRId64> characters"
-msgstr "%<PRId64>ญำฆrคธ"
-
-#: ../fileio.c:3849
-msgid "[noeol]"
-msgstr "[noeol]"
-
-#: ../fileio.c:3849
-msgid "[Incomplete last line]"
-msgstr "[ตฒงภฆๆคฃงนพใ]"
-
-#. don't overwrite messages here
-#. must give this prompt
-#. don't use emsg() here, don't want to flush the buffers
-#: ../fileio.c:3865
-msgid "WARNING: The file has been changed since reading it!!!"
-msgstr "ฤตงi: ฅปภษฎืฆคWฆธลชคJซแคwลฐส!!!"
-
-#: ../fileio.c:3867
-msgid "Do you really want to write to it"
-msgstr "ฝTฉwญnผgคJถ"
-
-#: ../fileio.c:4648
-#, c-format
-msgid "E208: Error writing to \"%s\""
-msgstr "E208: ผgคJภษฎื \"%s\" ฟ๙ป~"
-
-#: ../fileio.c:4655
-#, c-format
-msgid "E209: Error closing \"%s\""
-msgstr "E209: ร๖ณฌภษฎื \"%s\" ฟ๙ป~"
-
-#: ../fileio.c:4657
-#, c-format
-msgid "E210: Error reading \"%s\""
-msgstr "E210: ลชจ๚ภษฎื \"%s\" ฟ๙ป~"
-
-#: ../fileio.c:4883
-msgid "E246: FileChangedShell autocommand deleted buffer"
-msgstr "E246: FileChangedShell autocommand งRฐฃฝwฝฤฐฯ"
-
-#: ../fileio.c:4894
-#, fuzzy, c-format
-msgid "E211: File \"%s\" no longer available"
-msgstr "E211: ฤตงi: ภษฎื \"%s\" คwธgคฃฆsฆb"
-
-#: ../fileio.c:4906
-#, c-format
-msgid ""
-"W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as "
-"well"
-msgstr "W12: ฤตงi: ภษฎื \"%s\" ฆคWฆธลชคJซแคwลฐส, ฆำฅBฝsฟ่คคชบฝwฝฤฐฯค]ง๓ฐสคF"
-
-#: ../fileio.c:4907
-#, fuzzy
-msgid "See \":help W12\" for more info."
-msgstr "ถiค@จBปกฉ๚ฝะจฃ \":help W11\"กC"
-
-#: ../fileio.c:4910
-#, c-format
-msgid "W11: Warning: File \"%s\" has changed since editing started"
-msgstr "W11: ฤตงi: ภษฎื \"%s\" ฆคWฆธลชคJซแคwลฐส"
-
-#: ../fileio.c:4911
-msgid "See \":help W11\" for more info."
-msgstr "ถiค@จBปกฉ๚ฝะจฃ \":help W11\"กC"
-
-#: ../fileio.c:4914
-#, c-format
-msgid "W16: Warning: Mode of file \"%s\" has changed since editing started"
-msgstr "W16: ฤตงi: ภษฎื \"%s\" ชบลvญญปPคWฆธลชคJฎษคฃค@ผห (ฆณลฐสนL)"
-
-#: ../fileio.c:4915
-#, fuzzy
-msgid "See \":help W16\" for more info."
-msgstr "ถiค@จBปกฉ๚ฝะจฃ \":help W11\"กC"
-
-# 'mode' seems better as translated to 'permission'?
-#: ../fileio.c:4927
-#, c-format
-msgid "W13: Warning: File \"%s\" has been created after editing started"
-msgstr "W13: ฤตงi: ภษฎื \"%s\" ฆbถ}ฉlฝsฟ่ซแคSณQซุฅ฿คF"
-
-#: ../fileio.c:4947
-msgid "Warning"
-msgstr "ฤตงi"
-
-#: ../fileio.c:4948
-msgid ""
-"&OK\n"
-"&Load File"
-msgstr ""
-"ฝTฉw(&O)\n"
-"ธคJภษฎื(&L)"
-
-#: ../fileio.c:5065
-#, c-format
-msgid "E462: Could not prepare for reloading \"%s\""
-msgstr "E462: ตLชkทวณฦญซทsธคJ \"%s\""
-
-#: ../fileio.c:5078
-#, c-format
-msgid "E321: Could not reload \"%s\""
-msgstr "E321: ตLชkญซทsธคJ \"%s\""
-
-#: ../fileio.c:5601
-msgid "--Deleted--"
-msgstr "--คwงRฐฃ--"
-
-#: ../fileio.c:5732
-#, c-format
-msgid "auto-removing autocommand: %s <buffer=%d>"
-msgstr ""
-
-#. the group doesn't exist
-#: ../fileio.c:5772
-#, c-format
-msgid "E367: No such group: \"%s\""
-msgstr "E367: ตLฆนธsฒี: \"%s\""
-
-#: ../fileio.c:5897
-#, c-format
-msgid "E215: Illegal character after *: %s"
-msgstr "E215: * ซแญฑฆณคฃฅฟฝTชบฆrคธ: %s"
-
-#: ../fileio.c:5905
-#, c-format
-msgid "E216: No such event: %s"
-msgstr "E216: ตLฆนจฦฅ๓: %s"
-
-#: ../fileio.c:5907
-#, c-format
-msgid "E216: No such group or event: %s"
-msgstr "E216: ตLฆนธsฒีฉฮจฦฅ๓: %s"
-
-#. Highlight title
-#: ../fileio.c:6090
-msgid ""
-"\n"
-"--- Auto-Commands ---"
-msgstr ""
-"\n"
-"--- Auto-Commands ---"
-
-#: ../fileio.c:6293
-#, fuzzy, c-format
-msgid "E680: <buffer=%d>: invalid buffer number "
-msgstr "ฝwฝฤฐฯธนฝXฟ๙ป~"
-
-#: ../fileio.c:6370
-msgid "E217: Can't execute autocommands for ALL events"
-msgstr "E217: ตLชkน๏ฉาฆณจฦฅ๓ฐ๕ฆๆ autocommand"
-
-#: ../fileio.c:6393
-msgid "No matching autocommands"
-msgstr "งไคฃจ์น๏ภณชบ autocommand"
-
-#: ../fileio.c:6831
-msgid "E218: autocommand nesting too deep"
-msgstr "E218: autocommand ผhผฦนLฒ`"
-
-#: ../fileio.c:7143
-#, c-format
-msgid "%s Auto commands for \"%s\""
-msgstr "%s Auto commands: \"%s\""
-
-#: ../fileio.c:7149
-#, c-format
-msgid "Executing %s"
-msgstr "ฐ๕ฆๆ %s"
-
-#: ../fileio.c:7211
-#, c-format
-msgid "autocommand %s"
-msgstr "autocommand %s"
-
-#: ../fileio.c:7795
-msgid "E219: Missing {."
-msgstr "E219: ฏสคึ {."
-
-#: ../fileio.c:7797
-msgid "E220: Missing }."
-msgstr "E220: ฏสคึ }."
-
-#: ../fold.c:93
-msgid "E490: No fold found"
-msgstr "E490: งไคฃจ์ฅ๔ฆ๓ fold"
-
-#: ../fold.c:544
-msgid "E350: Cannot create fold with current 'foldmethod'"
-msgstr "E350: ตLชkฆbฅุซeชบ 'foldmethod' คUซุฅ฿ fold"
-
-#: ../fold.c:546
-msgid "E351: Cannot delete fold with current 'foldmethod'"
-msgstr "E351: ตLชkฆbฅุซeชบ 'foldmethod' คUงRฐฃ fold"
-
-#: ../fold.c:1784
-#, c-format
-msgid "+--%3ld lines folded "
-msgstr "+--คw fold %3ld ฆๆ "
-
-#. buffer has already been read
-#: ../getchar.c:273
-msgid "E222: Add to read buffer"
-msgstr "E222: ฅ[คJลชจ๚ฝwฝฤฐฯคค"
-
-#: ../getchar.c:2040
-msgid "E223: recursive mapping"
-msgstr "E223: ปผฐj mapping"
-
-#: ../getchar.c:2849
-#, c-format
-msgid "E224: global abbreviation already exists for %s"
-msgstr "E224: %s คwธgฆณฅฐ์ abbreviation คF"
-
-#: ../getchar.c:2852
-#, c-format
-msgid "E225: global mapping already exists for %s"
-msgstr "E225: %s คwธgฆณฅฐ์ mapping คF"
-
-#: ../getchar.c:2952
-#, c-format
-msgid "E226: abbreviation already exists for %s"
-msgstr "E226: %s คwธgฆณ abbreviation คF"
-
-#: ../getchar.c:2955
-#, c-format
-msgid "E227: mapping already exists for %s"
-msgstr "E227: %s ชบ mapping คwธgฆsฆb"
-
-#: ../getchar.c:3008
-msgid "No abbreviation found"
-msgstr "งไคฃจ์ abbreviation"
-
-#: ../getchar.c:3010
-msgid "No mapping found"
-msgstr "จSฆณณoญำ mapping น๏ภณ"
-
-#: ../getchar.c:3974
-msgid "E228: makemap: Illegal mode"
-msgstr "E228: makemap: คฃฅฟฝTชบผาฆก"
-
-#. key value of 'cedit' option
-#. type of cmdline window or 0
-#. result of cmdline window or 0
-#: ../globals.h:924
-msgid "--No lines in buffer--"
-msgstr "--ฝwฝฤฐฯตLธ๊ฎฦ--"
-
-#.
-#. * The error messages that can be shared are included here.
-#. * Excluded are errors that are only used once and debugging messages.
-#.
-#: ../globals.h:996
-msgid "E470: Command aborted"
-msgstr "E470: ฉRฅOณQฑjจ๎คคย_ฐ๕ฆๆ "
-
-#: ../globals.h:997
-msgid "E471: Argument required"
-msgstr "E471: ปญnซฅOฐัผฦ"
-
-#: ../globals.h:998
-msgid "E10: \\ should be followed by /, ? or &"
-msgstr "E10: \\ ซแญฑภณธำฆณ / ? ฉฮ &"
-
-#: ../globals.h:1000
-msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
-msgstr "E11: คฃฏเฆbฉRฅOฆCต๘ตกคคจฯฅฮกC<CR>ฐ๕ฆๆกACTRL-C ย๗ถ}"
-
-#: ../globals.h:1002
-msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
-msgstr "E12: exrc/vimrc ธฬชบซฅOตLชkฐ๕ฆๆ "
-
-#: ../globals.h:1003
-msgid "E171: Missing :endif"
-msgstr "E171: ฏสคึ :endif"
-
-#: ../globals.h:1004
-msgid "E600: Missing :endtry"
-msgstr "E600: ฏสคึ :endtry"
-
-#: ../globals.h:1005
-msgid "E170: Missing :endwhile"
-msgstr "E170: ฏสคึ :endwhile"
-
-#: ../globals.h:1006
-#, fuzzy
-msgid "E170: Missing :endfor"
-msgstr "E171: ฏสคึ :endif"
-
-#: ../globals.h:1007
-msgid "E588: :endwhile without :while"
-msgstr "E588: :endwhile ฏสคึน๏ภณชบ :while"
-
-#: ../globals.h:1008
-#, fuzzy
-msgid "E588: :endfor without :for"
-msgstr "E580: :endif ฏสคึน๏ภณชบ :if"
-
-#: ../globals.h:1009
-msgid "E13: File exists (add ! to override)"
-msgstr "E13: ภษฎืคwธgฆsฆb (ฅiฅฮ ! ฑjจ๎จ๚ฅN)"
-
-#: ../globals.h:1010
-msgid "E472: Command failed"
-msgstr "E472: ฉRฅOฐ๕ฆๆฅขฑั"
-
-#: ../globals.h:1011
-msgid "E473: Internal error"
-msgstr "E473: คบณกฟ๙ป~"
-
-#: ../globals.h:1012
-msgid "Interrupted"
-msgstr "คwคคย_"
-
-#: ../globals.h:1013
-msgid "E14: Invalid address"
-msgstr "E14: คฃฅฟฝTชบฆ์ง}"
-
-#: ../globals.h:1014
-msgid "E474: Invalid argument"
-msgstr "E474: คฃฅฟฝTชบฐัผฦ"
-
-#: ../globals.h:1015
-#, c-format
-msgid "E475: Invalid argument: %s"
-msgstr "E475: คฃฅฟฝTชบฐัผฦ: %s"
-
-#: ../globals.h:1016
-#, c-format
-msgid "E15: Invalid expression: %s"
-msgstr "E15: คฃฅฟฝTชบนBบโฆก: %s"
-
-#: ../globals.h:1017
-msgid "E16: Invalid range"
-msgstr "E16: คฃฅฟฝTชบฝdณ๒"
-
-#: ../globals.h:1018
-msgid "E476: Invalid command"
-msgstr "E476: คฃฅฟฝTชบฉRฅO"
-
-#: ../globals.h:1019
-#, c-format
-msgid "E17: \"%s\" is a directory"
-msgstr "E17: \"%s\" ฌOฅุฟ"
-
-#: ../globals.h:1020
-#, fuzzy
-msgid "E900: Invalid job id"
-msgstr "E49: ฟ๙ป~ชบฑฒฐสคjคp"
-
-#: ../globals.h:1021
-msgid "E901: Job table is full"
-msgstr ""
-
-#: ../globals.h:1022
-#, c-format
-msgid "E902: \"%s\" is not an executable"
-msgstr ""
-
-#: ../globals.h:1024
-#, c-format
-msgid "E364: Library call failed for \"%s()\""
-msgstr "E364: ฉIฅsจ็ฆกฎw \"%s\"() ฅขฑั"
-
-#: ../globals.h:1026
-msgid "E19: Mark has invalid line number"
-msgstr "E19: ผะฐOชบฆๆธนฟ๙ป~"
-
-#: ../globals.h:1027
-msgid "E20: Mark not set"
-msgstr "E20: จSฆณณ]ฉwผะฐO"
-
-#: ../globals.h:1029
-msgid "E21: Cannot make changes, 'modifiable' is off"
-msgstr "E21: ฆ]ฌฐ 'modifiable' ฟ๏ถตฌOร๖ณฌชบกAฉาฅHคฃฏเญืง๏"
-
-#: ../globals.h:1030
-msgid "E22: Scripts nested too deep"
-msgstr "E22: ฑ_ชฌปผฐjฉIฅsคำฆhผh"
-
-#: ../globals.h:1031
-msgid "E23: No alternate file"
-msgstr "E23: จSฆณดภฅNชบภษฎื"
-
-#: ../globals.h:1032
-msgid "E24: No such abbreviation"
-msgstr "E24: จSฆณณoญำ abbreviation น๏ภณ"
-
-#: ../globals.h:1033
-msgid "E477: No ! allowed"
-msgstr "E477: คฃฅiจฯฅฮ '!'"
-
-#: ../globals.h:1035
-msgid "E25: Nvim does not have a built-in GUI"
-msgstr "E25: ฆ]ฌฐฝsฤถฎษจSฆณฅ[คJนฯซฌฌษญฑชบต{ฆกฝXกAฉาฅHตLชkจฯฅฮนฯซฌฌษญฑ"
-
-#: ../globals.h:1036
-#, c-format
-msgid "E28: No such highlight group name: %s"
-msgstr "E28: จSฆณฆWฌฐ '%s' ชบ highlight group"
-
-#: ../globals.h:1037
-msgid "E29: No inserted text yet"
-msgstr "E29: มูจSฆณดกคJคๅฆrนL"
-
-#: ../globals.h:1038
-msgid "E30: No previous command line"
-msgstr "E30: จSฆณซeค@ถตฉRฅO"
-
-#: ../globals.h:1039
-msgid "E31: No such mapping"
-msgstr "E31: จSฆณณoญำ mapping น๏ภณ"
-
-#: ../globals.h:1040
-msgid "E479: No match"
-msgstr "E479: งไคฃจ์"
-
-#: ../globals.h:1041
-#, c-format
-msgid "E480: No match: %s"
-msgstr "E480: งไคฃจ์: %s"
-
-#: ../globals.h:1042
-msgid "E32: No file name"
-msgstr "E32: จSฆณภษฆW"
-
-#: ../globals.h:1044
-msgid "E33: No previous substitute regular expression"
-msgstr "E33: จSฆณซeค@ญำทjดM/จ๚ฅNชบฉRฅO"
-
-#: ../globals.h:1045
-msgid "E34: No previous command"
-msgstr "E34: จSฆณซeค@ญำฉRฅO"
-
-#: ../globals.h:1046
-msgid "E35: No previous regular expression"
-msgstr "E35: จSฆณซeค@ญำทjดMซฅO"
-
-#: ../globals.h:1047
-msgid "E481: No range allowed"
-msgstr "E481: คฃฅiจฯฅฮฝdณ๒ซฅO"
-
-#: ../globals.h:1048
-msgid "E36: Not enough room"
-msgstr "E36: จSฆณจฌฐ๗ชบชลถก"
-
-#: ../globals.h:1049
-#, c-format
-msgid "E482: Can't create file %s"
-msgstr "E482: คฃฏเซุฅ฿ภษฎื %s"
-
-#: ../globals.h:1050
-msgid "E483: Can't get temp file name"
-msgstr "E483: ตLชkฑoชพผศฆsภษฆW"
-
-#: ../globals.h:1051
-#, c-format
-msgid "E484: Can't open file %s"
-msgstr "E484: ตLชkถ}ฑาภษฎื %s"
-
-#: ../globals.h:1052
-#, c-format
-msgid "E485: Can't read file %s"
-msgstr "E485: ตLชkลชจ๚ภษฎื %s"
-
-#: ../globals.h:1054
-msgid "E37: No write since last change (add ! to override)"
-msgstr "E37: คwง๓ง๏นLภษฎืฆฉ|ฅผฆsภษ (ฅiฅฮ ! ฑjจ๎ฐ๕ฆๆ)"
-
-#: ../globals.h:1055
-#, fuzzy
-msgid "E37: No write since last change"
-msgstr "[ง๓ทsซแฉ|ฅผภxฆs]\n"
-
-#: ../globals.h:1056
-msgid "E38: Null argument"
-msgstr "E38: ชลชบ (Null) ฐัผฦ"
-
-#: ../globals.h:1057
-msgid "E39: Number expected"
-msgstr "E39: ภณธำญnฆณผฦฆr"
-
-#: ../globals.h:1058
-#, c-format
-msgid "E40: Can't open errorfile %s"
-msgstr "E40: ตLชkถ}ฑาฟ๙ป~ภษฎื %s"
-
-#: ../globals.h:1059
-msgid "E41: Out of memory!"
-msgstr "E41: ฐOพะล้คฃจฌ!"
-
-#: ../globals.h:1060
-msgid "Pattern not found"
-msgstr "งไคฃจ์"
-
-#: ../globals.h:1061
-#, c-format
-msgid "E486: Pattern not found: %s"
-msgstr "E486: งไคฃจ์ %s"
-
-#: ../globals.h:1062
-msgid "E487: Argument must be positive"
-msgstr "E487: ฐัผฦภณธำฌOฅฟผฦ"
-
-#: ../globals.h:1064
-msgid "E459: Cannot go back to previous directory"
-msgstr "E459: ตLชkฆ^จ์ซeค@ญำฅุฟ"
-
-#: ../globals.h:1066
-msgid "E42: No Errors"
-msgstr "E42: จSฆณฟ๙ป~"
-
-#: ../globals.h:1067
-msgid "E776: No location list"
-msgstr ""
-
-#: ../globals.h:1068
-msgid "E43: Damaged match string"
-msgstr "E43: ฒลฆXฆrฆ๊ฆณฐรD"
-
-#: ../globals.h:1069
-msgid "E44: Corrupted regexp program"
-msgstr "E44: regexp ฆณฐรD"
-
-#: ../globals.h:1071
-msgid "E45: 'readonly' option is set (add ! to override)"
-msgstr "E45: ฆณณ]ฉw 'readonly' ฟ๏ถต(ฐ฿ลช) (ฅiฅฮ ! ฑjจ๎ฐ๕ฆๆ)"
-
-#: ../globals.h:1073
-#, fuzzy, c-format
-msgid "E46: Cannot change read-only variable \"%s\""
-msgstr "E46: ตLชkณ]ฉwฐ฿ลชลผฦ \"%s\""
-
-#: ../globals.h:1075
-#, fuzzy, c-format
-msgid "E794: Cannot set variable in the sandbox: \"%s\""
-msgstr "E46: ตLชkณ]ฉwฐ฿ลชลผฦ \"%s\""
-
-#: ../globals.h:1076
-msgid "E47: Error while reading errorfile"
-msgstr "E47: ลชจ๚ฟ๙ป~ภษฎืฅขฑั"
-
-#: ../globals.h:1078
-msgid "E48: Not allowed in sandbox"
-msgstr "E48: คฃฏเฆb sandbox ธฬฅXฒ{"
-
-#: ../globals.h:1080
-msgid "E523: Not allowed here"
-msgstr "E523: ณoธฬคฃฅiจฯฅฮ"
-
-#: ../globals.h:1082
-msgid "E359: Screen mode setting not supported"
-msgstr "E359: คฃคไดฉณ]ฉwฟรน๕ผาฆก"
-
-#: ../globals.h:1083
-msgid "E49: Invalid scroll size"
-msgstr "E49: ฟ๙ป~ชบฑฒฐสคjคp"
-
-#: ../globals.h:1084
-msgid "E91: 'shell' option is empty"
-msgstr "E91: 'E71: ฟ๏ถต 'shell' ฅผณ]ฉw"
-
-#: ../globals.h:1085
-msgid "E255: Couldn't read in sign data!"
-msgstr "E255: ตLชkลชจ๚ sign data!"
-
-#: ../globals.h:1086
-msgid "E72: Close error on swap file"
-msgstr "E72: ผศฆsภษร๖ณฌฟ๙ป~"
-
-#: ../globals.h:1087
-msgid "E73: tag stack empty"
-msgstr "E73: ผะลาฐ๏ล|คwชล"
-
-#: ../globals.h:1088
-msgid "E74: Command too complex"
-msgstr "E74: ฉRฅOคำฝฦย๘"
-
-#: ../globals.h:1089
-msgid "E75: Name too long"
-msgstr "E75: ฆWฆrคำช๘"
-
-#: ../globals.h:1090
-msgid "E76: Too many ["
-msgstr "E76: คำฆh ["
-
-#: ../globals.h:1091
-msgid "E77: Too many file names"
-msgstr "E77: คำฆhภษฆW"
-
-#: ../globals.h:1092
-msgid "E488: Trailing characters"
-msgstr "E488: งAฟ้คJคFฆhพlชบฆrคธ"
-
-#: ../globals.h:1093
-msgid "E78: Unknown mark"
-msgstr "E78: ตLชkฟ์รัชบผะฐO"
-
-#: ../globals.h:1094
-msgid "E79: Cannot expand wildcards"
-msgstr "E79: ตLชkฎiถ}ธUฅฮฆrคธ"
-
-#: ../globals.h:1096
-msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
-msgstr "E591: 'winheight' คฃฏเค๑ 'winminheight' ง๓คึ"
-
-#: ../globals.h:1098
-msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
-msgstr "E592: 'winwidth' คฃฏเค๑ 'winminwidth' ง๓คึ"
-
-#: ../globals.h:1099
-msgid "E80: Error while writing"
-msgstr "E80: ผgคJฟ๙ป~"
-
-#: ../globals.h:1100
-msgid "Zero count"
-msgstr "ผฦจ์นs (?)"
-
-#: ../globals.h:1101
-msgid "E81: Using <SID> not in a script context"
-msgstr "E81: <SID> คฃฏเฆb script ฅปคๅฅ~จฯฅฮ."
-
-#: ../globals.h:1102
-#, fuzzy, c-format
-msgid "E685: Internal error: %s"
-msgstr "E473: คบณกฟ๙ป~"
-
-#: ../globals.h:1104
-msgid "E363: pattern uses more memory than 'maxmempattern'"
-msgstr ""
-
-#: ../globals.h:1105
-#, fuzzy
-msgid "E749: empty buffer"
-msgstr "E279: คฃฌO SNiFF+ ชบฝwฝฤฐฯ"
-
-#: ../globals.h:1108
-#, fuzzy
-msgid "E682: Invalid search pattern or delimiter"
-msgstr "E383: ฟ๙ป~ชบทjดMฆrฆ๊: %s"
-
-#: ../globals.h:1109
-msgid "E139: File is loaded in another buffer"
-msgstr "E139: ฑzฆbฅtค@ญำฝwฝฤฐฯค]ธคJคFณoญำภษฎื"
-
-#: ../globals.h:1110
-#, fuzzy, c-format
-msgid "E764: Option '%s' is not set"
-msgstr "E236: \"%s\" คฃฌOฉTฉwผeซืฆrซฌ"
-
-#: ../globals.h:1111
-#, fuzzy
-msgid "E850: Invalid register name"
-msgstr "E354: ผศฆsพนฆWบูฟ๙ป~: '%s'"
-
-#: ../globals.h:1114
-msgid "search hit TOP, continuing at BOTTOM"
-msgstr "คwทjดMจ์ภษฎืถ}ภYกFฆAฑqตฒงภฤ~ฤ๒ทjดM"
-
-#: ../globals.h:1115
-msgid "search hit BOTTOM, continuing at TOP"
-msgstr "คwทjดMจ์ภษฎืตฒงภกFฆAฑqถ}ภYฤ~ฤ๒ทjดM"
-
-#: ../hardcopy.c:240
-msgid "E550: Missing colon"
-msgstr "E550: ฏสคึ colon"
-
-#: ../hardcopy.c:252
-msgid "E551: Illegal component"
-msgstr "E551: คฃฅฟฝTชบผาฆก"
-
-#: ../hardcopy.c:259
-msgid "E552: digit expected"
-msgstr "E552: ภณธำญnฆณผฦฆr"
-
-#: ../hardcopy.c:473
-#, c-format
-msgid "Page %d"
-msgstr "ฒฤ %d ญถ"
-
-#: ../hardcopy.c:597
-msgid "No text to be printed"
-msgstr "จSฆณญnฆCฆLชบคๅฆr"
-
-#: ../hardcopy.c:668
-#, c-format
-msgid "Printing page %d (%d%%)"
-msgstr "ฆCฆLคค: ฒฤ %d ญถ (%d%%)"
-
-#: ../hardcopy.c:680
-#, c-format
-msgid " Copy %d of %d"
-msgstr "ฝฦปs %d / %d"
-
-#: ../hardcopy.c:733
-#, c-format
-msgid "Printed: %s"
-msgstr "คwฆCฆL: %s"
-
-#: ../hardcopy.c:740
-msgid "Printing aborted"
-msgstr "คwจ๚ฎ๘ฆCฆL"
-
-#: ../hardcopy.c:1365
-msgid "E455: Error writing to PostScript output file"
-msgstr "E455: ตLชkผgคJ PostScript ฟ้ฅXภษ"
-
-#: ../hardcopy.c:1747
-#, c-format
-msgid "E624: Can't open file \"%s\""
-msgstr "E624: ตLชkถ}ฑาภษฎื \"%s\""
-
-#: ../hardcopy.c:1756 ../hardcopy.c:2470
-#, c-format
-msgid "E457: Can't read PostScript resource file \"%s\""
-msgstr "E457: ตLชkลชจ๚ PostScript ธ๊ทฝภษ \"%s\""
-
-#: ../hardcopy.c:1772
-#, c-format
-msgid "E618: file \"%s\" is not a PostScript resource file"
-msgstr "E618: ภษฎื \"%s\" คฃฌO PostScript ธ๊ทฝภษ "
-
-#: ../hardcopy.c:1788 ../hardcopy.c:1805 ../hardcopy.c:1844
-#, c-format
-msgid "E619: file \"%s\" is not a supported PostScript resource file"
-msgstr "E619: คฃคไดฉ PostScript ธ๊ทฝภษ \"%s\""
-
-#: ../hardcopy.c:1856
-#, c-format
-msgid "E621: \"%s\" resource file has wrong version"
-msgstr "E621: \"%s\" ธ๊ทฝภษชฉฅปฟ๙ป~"
-
-#: ../hardcopy.c:2225
-msgid "E673: Incompatible multi-byte encoding and character set."
-msgstr ""
-
-#: ../hardcopy.c:2238
-msgid "E674: printmbcharset cannot be empty with multi-byte encoding."
-msgstr ""
-
-#: ../hardcopy.c:2254
-msgid "E675: No default font specified for multi-byte printing."
-msgstr ""
-
-#: ../hardcopy.c:2426
-msgid "E324: Can't open PostScript output file"
-msgstr "E324: ตLชkถ}ฑา PostScript ฟ้ฅXภษ"
-
-#: ../hardcopy.c:2458
-#, c-format
-msgid "E456: Can't open file \"%s\""
-msgstr "E456: ตLชkถ}ฑาภษฎื \"%s\""
-
-#: ../hardcopy.c:2583
-msgid "E456: Can't find PostScript resource file \"prolog.ps\""
-msgstr "E456: ตLชkลชจ๚ PostScript ธ๊ทฝภษ \"prolog.ps\""
-
-#: ../hardcopy.c:2593
-#, fuzzy
-msgid "E456: Can't find PostScript resource file \"cidfont.ps\""
-msgstr "E456: ตLชkลชจ๚ PostScript ธ๊ทฝภษ \"%s.ps\""
-
-#: ../hardcopy.c:2622 ../hardcopy.c:2639 ../hardcopy.c:2665
-#, c-format
-msgid "E456: Can't find PostScript resource file \"%s.ps\""
-msgstr "E456: ตLชkลชจ๚ PostScript ธ๊ทฝภษ \"%s.ps\""
-
-#: ../hardcopy.c:2654
-#, fuzzy, c-format
-msgid "E620: Unable to convert to print encoding \"%s\""
-msgstr "E620:ตLชkยเดซฆ \"%s\" ฆrคธฝsฝX"
-
-#: ../hardcopy.c:2877
-msgid "Sending to printer..."
-msgstr "ถวฐeธ๊ฎฦจ์ฆLชํพ๗..."
-
-#: ../hardcopy.c:2881
-msgid "E365: Failed to print PostScript file"
-msgstr "E365: ตLชkฆCฆL PostScript ภษฎื"
-
-#: ../hardcopy.c:2883
-msgid "Print job sent."
-msgstr "คwฐeฅXฆCฆLคuง@กC"
-
-#: ../if_cscope.c:85
-msgid "Add a new database"
-msgstr "ทsผWธ๊ฎฦฎw"
-
-#: ../if_cscope.c:87
-msgid "Query for a pattern"
-msgstr "ฟ้คJ pattern"
-
-#: ../if_cscope.c:89
-msgid "Show this message"
-msgstr "ลใฅฆนฐTฎง"
-
-#: ../if_cscope.c:91
-msgid "Kill a connection"
-msgstr "ตฒง๔ณsฝu"
-
-#: ../if_cscope.c:93
-msgid "Reinit all connections"
-msgstr "ญซณ]ฉาฆณณsฝu"
-
-#: ../if_cscope.c:95
-msgid "Show connections"
-msgstr "ลใฅณsฝu"
-
-#: ../if_cscope.c:101
-#, c-format
-msgid "E560: Usage: cs[cope] %s"
-msgstr "E560: ฅฮชk: cs[cope] %s"
-
-#: ../if_cscope.c:225
-msgid "This cscope command does not support splitting the window.\n"
-msgstr "ณoญำ cscope ฉRฅOคฃคไดฉคภณฮฟรน๕\n"
-
-#: ../if_cscope.c:266
-msgid "E562: Usage: cstag <ident>"
-msgstr "E562: ฅฮชk: cstag <รังOฆrident>"
-
-#: ../if_cscope.c:313
-msgid "E257: cstag: tag not found"
-msgstr "E257: cstag: งไคฃจ์ tag"
-
-#: ../if_cscope.c:461
-#, c-format
-msgid "E563: stat(%s) error: %d"
-msgstr "E563: stat(%s) ฟ๙ป~: %d"
-
-#: ../if_cscope.c:551
-#, c-format
-msgid "E564: %s is not a directory or a valid cscope database"
-msgstr "E564: %s คฃฌOฅุฟฉฮ cscope ธ๊ฎฦฎw"
-
-#: ../if_cscope.c:566
-#, c-format
-msgid "Added cscope database %s"
-msgstr "ทsผW cscope ธ๊ฎฦฎw %s"
-
-#: ../if_cscope.c:616
-#, c-format
-msgid "E262: error reading cscope connection %<PRId64>"
-msgstr "E262: ลชจ๚ cscope ณsฝu %<PRId64> ฟ๙ป~"
-
-#: ../if_cscope.c:711
-msgid "E561: unknown cscope search type"
-msgstr "E561: ฅผชพชบ cscope ทjดMงฮบA"
-
-#: ../if_cscope.c:752 ../if_cscope.c:789
-msgid "E566: Could not create cscope pipes"
-msgstr "E566: ตLชkซุฅ฿ปP cscope ชบ pipe ณsฝu"
-
-#: ../if_cscope.c:767
-msgid "E622: Could not fork for cscope"
-msgstr "E622: ตLชk fork ฅHฐ๕ฆๆ cscope "
-
-#: ../if_cscope.c:849
-#, fuzzy
-msgid "cs_create_connection setpgid failed"
-msgstr "cs_create_connection ฐ๕ฆๆฅขฑั"
-
-#: ../if_cscope.c:853 ../if_cscope.c:889
-msgid "cs_create_connection exec failed"
-msgstr "cs_create_connection ฐ๕ฆๆฅขฑั"
-
-#: ../if_cscope.c:863 ../if_cscope.c:902
-msgid "cs_create_connection: fdopen for to_fp failed"
-msgstr "cs_create_connection: fdopen ฅขฑั (to_fp)"
-
-#: ../if_cscope.c:865 ../if_cscope.c:906
-msgid "cs_create_connection: fdopen for fr_fp failed"
-msgstr "cs_create_connection: fdopen ฅขฑั (fr_fp)"
-
-#: ../if_cscope.c:890
-msgid "E623: Could not spawn cscope process"
-msgstr "E623: ตLชkฐ๕ฆๆ cscope "
-
-#: ../if_cscope.c:932
-msgid "E567: no cscope connections"
-msgstr "E567: จSฆณ cscope ณsฝu"
-
-#: ../if_cscope.c:1009
-#, c-format
-msgid "E469: invalid cscopequickfix flag %c for %c"
-msgstr "E469: cscopequickfix ชบ flac %c (%c) คฃฅฟฝT"
-
-#: ../if_cscope.c:1058
-#, c-format
-msgid "E259: no matches found for cscope query %s of %s"
-msgstr "E259: งไคฃจ์ฒลฆX cscope ชบทjดM %s / %s"
-
-#: ../if_cscope.c:1142
-msgid "cscope commands:\n"
-msgstr "cscope ฉRฅO:\n"
-
-#: ../if_cscope.c:1150
-#, fuzzy, c-format
-msgid "%-5s: %s%*s (Usage: %s)"
-msgstr "%-5s: %-30s (ฅฮชk: %s)"
-
-#: ../if_cscope.c:1155
-msgid ""
-"\n"
-" c: Find functions calling this function\n"
-" d: Find functions called by this function\n"
-" e: Find this egrep pattern\n"
-" f: Find this file\n"
-" g: Find this definition\n"
-" i: Find files #including this file\n"
-" s: Find this C symbol\n"
-" t: Find this text string\n"
-msgstr ""
-
-#: ../if_cscope.c:1226
-msgid "E568: duplicate cscope database not added"
-msgstr "E568: ญซฝฦชบ cscope ธ๊ฎฦฎwฅผณQฅ[คJ"
-
-#: ../if_cscope.c:1335
-#, c-format
-msgid "E261: cscope connection %s not found"
-msgstr "E261: งไคฃจ์ cscope ณsฝu %s"
-
-#: ../if_cscope.c:1364
-#, c-format
-msgid "cscope connection %s closed"
-msgstr "cscope ณsฝu %s คwร๖ณฌ"
-
-#. should not reach here
-#: ../if_cscope.c:1486
-msgid "E570: fatal error in cs_manage_matches"
-msgstr "E570: cs_manage_matches ฤYญซฟ๙ป~"
-
-#: ../if_cscope.c:1693
-#, c-format
-msgid "Cscope tag: %s"
-msgstr "Cscope ผะลา(tag): %s"
-
-#: ../if_cscope.c:1711
-msgid ""
-"\n"
-" # line"
-msgstr ""
-"\n"
-" # ฆๆ "
-
-#: ../if_cscope.c:1713
-msgid "filename / context / line\n"
-msgstr "ภษฆW / คบคๅ / ฆๆธน\n"
-
-#: ../if_cscope.c:1809
-#, c-format
-msgid "E609: Cscope error: %s"
-msgstr "E609: Csope ฟ๙ป~: %s"
-
-#: ../if_cscope.c:2053
-msgid "All cscope databases reset"
-msgstr "ญซณ]ฉาฆณ cscope ธ๊ฎฦฎw"
-
-#: ../if_cscope.c:2123
-msgid "no cscope connections\n"
-msgstr "จSฆณ cscope ณsฝu\n"
-
-#: ../if_cscope.c:2126
-msgid " # pid database name prepend path\n"
-msgstr " # pid ธ๊ฎฦฎwฆWบู prepend path\n"
-
-#: ../main.c:144
-#, fuzzy
-msgid "Unknown option argument"
-msgstr "คฃฅฟฝTชบฟ๏ถต"
-
-#: ../main.c:146
-msgid "Too many edit arguments"
-msgstr "คำฆhฝsฟ่ฐัผฦ"
-
-#: ../main.c:148
-msgid "Argument missing after"
-msgstr "ฏสคึฅฒญnชบฐัผฦ:"
-
-#: ../main.c:150
-#, fuzzy
-msgid "Garbage after option argument"
-msgstr "ตLชkฟ๋ป{ฆนฟ๏ถตซแชบฉRฅO: "
-
-#: ../main.c:152
-msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"
-msgstr "คำฆh \"+command\" กB \"-c command\" ฉฮ \"--cmd command\" ฐัผฦ"
-
-#: ../main.c:154
-msgid "Invalid argument for"
-msgstr "คฃฅฟฝTชบฐัผฦ: "
-
-#: ../main.c:294
-#, c-format
-msgid "%d files to edit\n"
-msgstr "มูฆณ %d ญำภษฎืตฅซฝsฟ่\n"
-
-#: ../main.c:1342
-msgid "Attempt to open script file again: \""
-msgstr "ธีนฯฆAฆธถ}ฑา script ภษ: \""
-
-#: ../main.c:1350
-msgid "Cannot open for reading: \""
-msgstr "ตLชkถ}ฑาฅHลชจ๚: \""
-
-#: ../main.c:1393
-msgid "Cannot open for script output: \""
-msgstr "ตLชkถ}ฑาฌฐ script ฟ้ฅX: \""
-
-#: ../main.c:1622
-msgid "Vim: Warning: Output is not to a terminal\n"
-msgstr "Vim: ช`ทN: ฟ้ฅXคฃฌOฒืบพ๗(ฟรน๕)\n"
-
-#: ../main.c:1624
-msgid "Vim: Warning: Input is not from a terminal\n"
-msgstr "Vim: ช`ทN: ฟ้คJคฃฌOฒืบพ๗(มไฝL)\n"
-
-#. just in case..
-#: ../main.c:1891
-msgid "pre-vimrc command line"
-msgstr "vimrc ซeฉRฅOฆC"
-
-#: ../main.c:1964
-#, c-format
-msgid "E282: Cannot read from \"%s\""
-msgstr "E282: ตLชkลชจ๚ภษฎื \"%s\""
-
-#: ../main.c:2149
-msgid ""
-"\n"
-"More info with: \"vim -h\"\n"
-msgstr ""
-"\n"
-"ฌdธ฿ง๓ฆhธ๊ฐTฝะฐ๕ฆๆ: \"vim -h\"\n"
-
-#: ../main.c:2178
-msgid "[file ..] edit specified file(s)"
-msgstr "[ภษฎื ..] ฝsฟ่ซฉwชบภษฎื"
-
-#: ../main.c:2179
-msgid "- read text from stdin"
-msgstr "- ฑqผะทวฟ้คJ(stdin)ลชจ๚ภษฎื"
-
-#: ../main.c:2180
-msgid "-t tag edit file where tag is defined"
-msgstr "-t tag ฝsฟ่ฎษจฯฅฮซฉwชบ tag"
-
-#: ../main.c:2181
-msgid "-q [errorfile] edit file with first error"
-msgstr "-q [errorfile] ฝsฟ่ฎษธคJฒฤค@ญำฟ๙ป~"
-
-#: ../main.c:2187
-msgid ""
-"\n"
-"\n"
-"usage:"
-msgstr ""
-"\n"
-"\n"
-" ฅฮชk:"
-
-#: ../main.c:2189
-msgid " vim [arguments] "
-msgstr "vim [ฐัผฦ] "
-
-#: ../main.c:2193
-msgid ""
-"\n"
-" or:"
-msgstr ""
-"\n"
-" ฉฮ:"
-
-#: ../main.c:2196
-msgid ""
-"\n"
-"\n"
-"Arguments:\n"
-msgstr ""
-"\n"
-"\n"
-"ฐัผฦ:\n"
-
-#: ../main.c:2197
-msgid "--\t\t\tOnly file names after this"
-msgstr "--\t\t\tฅuฆณฆbณoคงซแชบภษฎื"
-
-#: ../main.c:2199
-msgid "--literal\t\tDon't expand wildcards"
-msgstr "--literal\t\tคฃฎiถ}ธUฅฮฆrคธ"
-
-#: ../main.c:2201
-msgid "-v\t\t\tVi mode (like \"vi\")"
-msgstr "-v\t\t\tVi ผาฆก (ฆP \"vi\")"
-
-#: ../main.c:2202
-msgid "-e\t\t\tEx mode (like \"ex\")"
-msgstr "-e\t\t\tEx ผาฆก (ฆP \"ex\")"
-
-#: ../main.c:2203
-msgid "-E\t\t\tImproved Ex mode"
-msgstr ""
-
-#: ../main.c:2204
-msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")"
-msgstr "-s\t\t\tฆwภR (batch) ผาฆก (ฅuฏเปP \"ex\" ค@ฐ_จฯฅฮ)"
-
-#: ../main.c:2205
-msgid "-d\t\t\tDiff mode (like \"vimdiff\")"
-msgstr "-d\t\t\tDiff ผาฆก (ฆP \"vimdiff\", ฅiจณณtค๑ธ๛จโภษฎืคฃฆPณB)"
-
-#: ../main.c:2206
-msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
-msgstr "-y\t\t\tยฒฉ๖ผาฆก (ฆP \"evim\", modeless)"
-
-#: ../main.c:2207
-msgid "-R\t\t\tReadonly mode (like \"view\")"
-msgstr "-R\t\t\tฐ฿ลชผาฆก (ฆP \"view\")"
-
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tญญจ๎ผาฆก (ฆP \"rvim\")"
-
-#: ../main.c:2209
-msgid "-m\t\t\tModifications (writing files) not allowed"
-msgstr "-m\t\t\tคฃฅiญืง๏ (ผgคJภษฎื)"
-
-#: ../main.c:2210
-msgid "-M\t\t\tModifications in text not allowed"
-msgstr "-M\t\t\tคฃฅiญืง๏คๅฆr"
-
-#: ../main.c:2211
-msgid "-b\t\t\tBinary mode"
-msgstr "-b\t\t\tคGถiฆ์ผาฆก"
-
-#: ../main.c:2212
-msgid "-l\t\t\tLisp mode"
-msgstr "-l\t\t\tLisp ผาฆก"
-
-#: ../main.c:2213
-msgid "-C\t\t\tCompatible with Vi: 'compatible'"
-msgstr "-C\t\t\t'compatible' ถวฒฮ Vi ฌฎeผาฆก"
-
-#: ../main.c:2214
-msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'"
-msgstr "-N\t\t\t'nocompatible' คฃงนฅปPถวฒฮ Vi ฌฎeกAฅiจฯฅฮ Vim ฅ[ฑjฏเคO"
-
-#: ../main.c:2215
-msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]"
-msgstr ""
-
-#: ../main.c:2216
-msgid "-D\t\t\tDebugging mode"
-msgstr "-D\t\t\tฐฃฟ๙ผาฆก"
-
-#: ../main.c:2217
-msgid "-n\t\t\tNo swap file, use memory only"
-msgstr "-n\t\t\tคฃจฯฅฮผศฆsภษ, ฅuจฯฅฮฐOพะล้"
-
-#: ../main.c:2218
-msgid "-r\t\t\tList swap files and exit"
-msgstr "-r\t\t\tฆCฅXผศฆsภษซแย๗ถ}"
-
-#: ../main.c:2219
-msgid "-r (with file name)\tRecover crashed session"
-msgstr "-r (ฅ[ภษฆW) \tญืด_คWฆธทlทดชบธ๊ฎฦ(Recover crashed session)"
-
-#: ../main.c:2220
-msgid "-L\t\t\tSame as -r"
-msgstr "-L\t\t\tฆP -r"
-
-#: ../main.c:2221
-msgid "-A\t\t\tstart in Arabic mode"
-msgstr "-A\t\t\tฑาฐสฌฐ Arabic ผาฆก"
-
-#: ../main.c:2222
-msgid "-H\t\t\tStart in Hebrew mode"
-msgstr "-H\t\t\tฑาฐสฌฐ Hebrew ผาฆก"
-
-#: ../main.c:2223
-msgid "-F\t\t\tStart in Farsi mode"
-msgstr "-F\t\t\tฑาฐสฌฐ Farsi ผาฆก"
-
-#: ../main.c:2224
-msgid "-T <terminal>\tSet terminal type to <terminal>"
-msgstr "-T <terminal>\tณ]ฉwฒืบพ๗ฌฐ <terminal>"
-
-#: ../main.c:2225
-msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc"
-msgstr "-u <vimrc>\t\tจฯฅฮ <vimrc> จ๚ฅNฅ๔ฆ๓ .vimrc"
-
-#: ../main.c:2226
-msgid "--noplugin\t\tDon't load plugin scripts"
-msgstr "--noplugin\t\tคฃธคJฅ๔ฆ๓ plugin"
-
-#: ../main.c:2227
-#, fuzzy
-msgid "-p[N]\t\tOpen N tab pages (default: one for each file)"
-msgstr "-o[N]\t\tถ}ฑา N ญำต๘ตก (นwณ]ฌOจCญำภษฎืค@ญำ)"
-
-#: ../main.c:2228
-msgid "-o[N]\t\tOpen N windows (default: one for each file)"
-msgstr "-o[N]\t\tถ}ฑา N ญำต๘ตก (นwณ]ฌOจCญำภษฎืค@ญำ)"
-
-#: ../main.c:2229
-msgid "-O[N]\t\tLike -o but split vertically"
-msgstr "-O[N]\t\tฆP -o ฆจฯฅฮซซชฝคภณฮ"
-
-#: ../main.c:2230
-msgid "+\t\t\tStart at end of file"
-msgstr "+\t\t\tฑาฐสซแธ๕จ์ภษฎืตฒงภ"
-
-#: ../main.c:2231
-msgid "+<lnum>\t\tStart at line <lnum>"
-msgstr "+<lnum>\t\tฑาฐสซแธ๕จ์ฒฤ <lnum> ฆๆ "
-
-#: ../main.c:2232
-msgid "--cmd <command>\tExecute <command> before loading any vimrc file"
-msgstr "--cmd <command>\tธคJฅ๔ฆ๓ vimrc ซeฐ๕ฆๆ <command>"
-
-#: ../main.c:2233
-msgid "-c <command>\t\tExecute <command> after loading the first file"
-msgstr "-c <command>\t\tธคJฒฤค@ญำภษฎืซแฐ๕ฆๆ <command>"
-
-#: ../main.c:2235
-msgid "-S <session>\t\tSource file <session> after loading the first file"
-msgstr "-S <session>\t\tธคJฒฤค@ญำภษฎืซแธคJ Session ภษ <session>"
-
-#: ../main.c:2236
-msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>"
-msgstr "-s <scriptin>\tฑq <scriptin> ลชคJค@ฏ๋ผาฆกฉRฅO"
-
-#: ../main.c:2237
-msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>"
-msgstr "-w <scriptout>\tน๏ภษฎื <scriptout> ชฅ[(append)ฉาฆณฟ้คJชบฉRฅO"
-
-#: ../main.c:2238
-msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>"
-msgstr "-W <scriptout>\tน๏ภษฎื <scriptout> ผgคJฉาฆณฟ้คJชบฉRฅO"
-
-#: ../main.c:2240
-msgid "--startuptime <file>\tWrite startup timing messages to <file>"
-msgstr ""
-
-#: ../main.c:2242
-msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
-msgstr "-i <viminfo>\t\tจฯฅฮ <viminfo> ฆำซD .viminfo"
-
-#: ../main.c:2243
-msgid "-h or --help\tPrint Help (this message) and exit"
-msgstr "-h ฉฮ --help\tฆLฅXปกฉ๚(ค]ดNฌOฅปฐTฎง)ซแย๗ถ}"
-
-#: ../main.c:2244
-msgid "--version\t\tPrint version information and exit"
-msgstr "--version\t\tฆLฅXชฉฅปธ๊ฐTซแย๗ถ}"
-
-#: ../mark.c:676
-msgid "No marks set"
-msgstr "จSฆณณ]ฉwผะฐO (mark)"
-
-#: ../mark.c:678
-#, c-format
-msgid "E283: No marks matching \"%s\""
-msgstr "E283: งไคฃจ์ฒลฆX \"%s\" ชบผะฐO(mark)"
-
-#. Highlight title
-#: ../mark.c:687
-msgid ""
-"\n"
-"mark line col file/text"
-msgstr ""
-"\n"
-"ผะฐO ฆๆธน ฤๆ ภษฎื/คๅฆr"
-
-#. Highlight title
-#: ../mark.c:789
-msgid ""
-"\n"
-" jump line col file/text"
-msgstr ""
-"\n"
-" jump ฆๆธน ฤๆ ภษฎื/คๅฆr"
-
-#. Highlight title
-#: ../mark.c:831
-msgid ""
-"\n"
-"change line col text"
-msgstr ""
-"\n"
-"ง๏ล ฆๆธน ฤๆ คๅฆr"
-
-#: ../mark.c:1238
-msgid ""
-"\n"
-"# File marks:\n"
-msgstr ""
-"\n"
-"# ภษฎืผะฐO:\n"
-
-#. Write the jumplist with -'
-#: ../mark.c:1271
-msgid ""
-"\n"
-"# Jumplist (newest first):\n"
-msgstr ""
-"\n"
-"# Jumplist (ฅัทsจ์ยย):\n"
-
-#: ../mark.c:1352
-msgid ""
-"\n"
-"# History of marks within files (newest to oldest):\n"
-msgstr ""
-"\n"
-"# ภษฎืคบ Mark ฐOฟ (ฅัทsจ์ยย):\n"
-
-#: ../mark.c:1431
-msgid "Missing '>'"
-msgstr "ฏสคึน๏ภณชบ '>'"
-
-#: ../memfile.c:426
-msgid "E293: block was not locked"
-msgstr "E293: ฐฯถ๔ฅผณQย๊ฉw"
-
-#: ../memfile.c:799
-msgid "E294: Seek error in swap file read"
-msgstr "E294: ผศฆsภษลชจ๚ฟ๙ป~"
-
-#: ../memfile.c:803
-msgid "E295: Read error in swap file"
-msgstr "E295: ผศฆsภษลชจ๚ฟ๙ป~"
-
-#: ../memfile.c:849
-msgid "E296: Seek error in swap file write"
-msgstr "E296: ผศฆsภษผgคJฟ๙ป~"
-
-#: ../memfile.c:865
-msgid "E297: Write error in swap file"
-msgstr "E297: ผศฆsภษผgคJฟ๙ป~"
-
-#: ../memfile.c:1036
-msgid "E300: Swap file already exists (symlink attack?)"
-msgstr "E300: ผศฆsภษคwธgฆsฆb! (คpค฿ฒลธนณsตฒชบฆwฅบ|ฌ}!?)"
-
-#: ../memline.c:318
-msgid "E298: Didn't get block nr 0?"
-msgstr "E298: งไคฃจ์ฐฯถ๔ 0?"
-
-#: ../memline.c:361
-msgid "E298: Didn't get block nr 1?"
-msgstr "E298: งไคฃจ์ฐฯถ๔ 1?"
-
-#: ../memline.c:377
-msgid "E298: Didn't get block nr 2?"
-msgstr "E298: งไคฃจ์ฐฯถ๔ 2?"
-
-#. could not (re)open the swap file, what can we do????
-#: ../memline.c:465
-msgid "E301: Oops, lost the swap file!!!"
-msgstr "E301: พพพพ, ผศฆsภษคฃจฃคF!!!"
-
-#: ../memline.c:477
-msgid "E302: Could not rename swap file"
-msgstr "E302: ตLชkง๏ลผศฆsภษชบฆWบู"
-
-#: ../memline.c:554
-#, c-format
-msgid "E303: Unable to open swap file for \"%s\", recovery impossible"
-msgstr "E303: ตLชkถ}ฑาผศฆsภษ \"%s\", คฃฅiฏเญืด_คF"
-
-#: ../memline.c:666
-#, fuzzy
-msgid "E304: ml_upd_block0(): Didn't get block 0??"
-msgstr "E304: ml_timestamp: งไคฃจ์ฐฯถ๔ 0??"
-
-#. no swap files found
-#: ../memline.c:830
-#, c-format
-msgid "E305: No swap file found for %s"
-msgstr "E305: งไคฃจ์ %s ชบผศฆsภษ"
-
-#: ../memline.c:839
-msgid "Enter number of swap file to use (0 to quit): "
-msgstr "ฝะฟ๏พงAญnจฯฅฮชบผศฆsภษ (ซ๖0 ย๗ถ}): "
-
-#: ../memline.c:879
-#, c-format
-msgid "E306: Cannot open %s"
-msgstr "E306: ตLชkถ}ฑา %s"
-
-#: ../memline.c:897
-msgid "Unable to read block 0 from "
-msgstr "ตLชkลชจ๚ฐฯถ๔ 0:"
-
-#: ../memline.c:900
-msgid ""
-"\n"
-"Maybe no changes were made or Vim did not update the swap file."
-msgstr ""
-"\n"
-"ฅiฏเฌOงAจSฐตนLฅ๔ฆ๓ญืง๏ฉฮฌO Vim มูจำคฃคฮง๓ทsผศฆsภษ."
-
-#: ../memline.c:909
-msgid " cannot be used with this version of Vim.\n"
-msgstr " ตLชkฆbฅปชฉฅปชบ Vim คคจฯฅฮ.\n"
-
-#: ../memline.c:911
-msgid "Use Vim version 3.0.\n"
-msgstr "จฯฅฮ Vim 3.0กC\n"
-
-#: ../memline.c:916
-#, c-format
-msgid "E307: %s does not look like a Vim swap file"
-msgstr "E307: %s ฌฐ_จำคฃนณฌO Vim ผศฆsภษ"
-
-#: ../memline.c:922
-msgid " cannot be used on this computer.\n"
-msgstr " ตLชkฆbณoปOนqธฃคWจฯฅฮ.\n"
-
-#: ../memline.c:924
-msgid "The file was created on "
-msgstr "ฅปภษฎืซุฅ฿ฉ๓ "
-
-#: ../memline.c:928
-msgid ""
-",\n"
-"or the file has been damaged."
-msgstr ""
-",\n"
-"ฉฮฌOณoภษฎืคwธgทlทดกC"
-
-#: ../memline.c:945
-msgid " has been damaged (page size is smaller than minimum value).\n"
-msgstr ""
-
-#: ../memline.c:974
-#, c-format
-msgid "Using swap file \"%s\""
-msgstr "จฯฅฮผศฆsภษ \"%s\""
-
-#: ../memline.c:980
-#, c-format
-msgid "Original file \"%s\""
-msgstr "ญ์ฉlภษ \"%s\""
-
-#: ../memline.c:995
-msgid "E308: Warning: Original file may have been changed"
-msgstr "E308: ฤตงi: ญ์ฉlภษฎืฅiฏเคwธgญืง๏นLคF"
-
-#: ../memline.c:1061
-#, c-format
-msgid "E309: Unable to read block 1 from %s"
-msgstr "E309: ตLชkฑq %s ลชจ๚ฐฯถ๔ 1"
-
-#: ../memline.c:1065
-msgid "???MANY LINES MISSING"
-msgstr "???ฏสคึคำฆhฆๆ "
-
-#: ../memline.c:1076
-msgid "???LINE COUNT WRONG"
-msgstr "???ฆๆธนฟ๙ป~"
-
-#: ../memline.c:1082
-msgid "???EMPTY BLOCK"
-msgstr "???ชลชบ BLOCK"
-
-#: ../memline.c:1103
-msgid "???LINES MISSING"
-msgstr "???งไคฃจ์ค@จวฆๆ "
-
-#: ../memline.c:1128
-#, c-format
-msgid "E310: Block 1 ID wrong (%s not a .swp file?)"
-msgstr "E310: ฐฯถ๔ 1 ID ฟ๙ป~ (%s คฃฌOผศฆsภษ?)"
-
-#: ../memline.c:1133
-msgid "???BLOCK MISSING"
-msgstr "???งไคฃจ์BLOCK"
-
-#: ../memline.c:1147
-msgid "??? from here until ???END lines may be messed up"
-msgstr "??? ฑqณoธฬจ์ ???END ชบคบฎeฅiฏเฆณฐรD"
-
-#: ../memline.c:1164
-msgid "??? from here until ???END lines may have been inserted/deleted"
-msgstr "??? ฑqณoธฬจ์ ???END ชบคบฎeฅiฏเณQงRฐฃ/ดกคJนL"
-
-# do not translate
-#: ../memline.c:1181
-msgid "???END"
-msgstr "???END"
-
-#: ../memline.c:1238
-msgid "E311: Recovery Interrupted"
-msgstr "E311: ญืด_คwคคย_"
-
-#: ../memline.c:1243
-msgid ""
-"E312: Errors detected while recovering; look for lines starting with ???"
-msgstr "E312: ญืด_ฎษตoฅอฟ๙ป~; ฝะช`ทNถ}ภYฌฐ ??? ชบฆๆ "
-
-#: ../memline.c:1245
-msgid "See \":help E312\" for more information."
-msgstr "ธิฒำปกฉ๚ฝะจฃ \":help E312\""
-
-#: ../memline.c:1249
-msgid "Recovery completed. You should check if everything is OK."
-msgstr "ด_ญ์งนฆจ. ฝะฝTฉwค@คมฅฟฑ`."
-
-#: ../memline.c:1251
-msgid ""
-"\n"
-"(You might want to write out this file under another name\n"
-msgstr ""
-"\n"
-"(งAฅiฏเท|ทQญnงโณoญำภษฎืฅtฆsงOชบภษฆWกA\n"
-
-#: ../memline.c:1252
-#, fuzzy
-msgid "and run diff with the original file to check for changes)"
-msgstr "ฆAฐ๕ฆๆ diff ปPญ์ภษฎืค๑ธ๛ฅHภหฌdฌOง_ฆณง๏ล)\n"
-
-#: ../memline.c:1254
-msgid "Recovery completed. Buffer contents equals file contents."
-msgstr ""
-
-#: ../memline.c:1255
-#, fuzzy
-msgid ""
-"\n"
-"You may want to delete the .swp file now.\n"
-"\n"
-msgstr ""
-"(D)ชฝฑตงRฐฃ .swp ผศฆsภษ\n"
-"\n"
-
-#. use msg() to start the scrolling properly
-#: ../memline.c:1327
-msgid "Swap files found:"
-msgstr "งไจ์ฅHคUชบผศฆsภษ:"
-
-#: ../memline.c:1446
-msgid " In current directory:\n"
-msgstr " ฆbฅุซeชบฅุฟ:\n"
-
-#: ../memline.c:1448
-msgid " Using specified name:\n"
-msgstr " Using specified name:\n"
-
-#: ../memline.c:1450
-msgid " In directory "
-msgstr " ฆbฅุฟ "
-
-#: ../memline.c:1465
-msgid " -- none --\n"
-msgstr " -- ตL --\n"
-
-#: ../memline.c:1527
-msgid " owned by: "
-msgstr " พึฆณชฬ: "
-
-#: ../memline.c:1529
-msgid " dated: "
-msgstr " ค้ดม: "
-
-#: ../memline.c:1532 ../memline.c:3231
-msgid " dated: "
-msgstr " ค้ดม: "
-
-#: ../memline.c:1548
-msgid " [from Vim version 3.0]"
-msgstr " [ฑq Vim ชฉฅป 3.0]"
-
-#: ../memline.c:1550
-msgid " [does not look like a Vim swap file]"
-msgstr " [คฃนณ Vim ชบผศฆsภษ]"
-
-#: ../memline.c:1552
-msgid " file name: "
-msgstr " ภษฆW: "
-
-#: ../memline.c:1558
-msgid ""
-"\n"
-" modified: "
-msgstr ""
-"\n"
-" ญืง๏นL: "
-
-#: ../memline.c:1559
-msgid "YES"
-msgstr "ฌO"
-
-#: ../memline.c:1559
-msgid "no"
-msgstr "ง_"
-
-#: ../memline.c:1562
-msgid ""
-"\n"
-" user name: "
-msgstr ""
-"\n"
-" จฯฅฮชฬ: "
-
-#: ../memline.c:1568
-msgid " host name: "
-msgstr " ฅDพ๗ฆWบู: "
-
-#: ../memline.c:1570
-msgid ""
-"\n"
-" host name: "
-msgstr ""
-"\n"
-" ฅDพ๗ฆWบู: "
-
-#: ../memline.c:1575
-msgid ""
-"\n"
-" process ID: "
-msgstr ""
-"\n"
-" process ID: "
-
-#: ../memline.c:1579
-msgid " (still running)"
-msgstr " (ฐ๕ฆๆคค)"
-
-#: ../memline.c:1586
-msgid ""
-"\n"
-" [not usable on this computer]"
-msgstr ""
-"\n"
-" [ตLชkฆbฅปนqธฃคWจฯฅฮ]"
-
-#: ../memline.c:1590
-msgid " [cannot be read]"
-msgstr " [ตLชkลชจ๚]"
-
-#: ../memline.c:1593
-msgid " [cannot be opened]"
-msgstr " [ตLชkถ}ฑา]"
-
-#: ../memline.c:1698
-msgid "E313: Cannot preserve, there is no swap file"
-msgstr "E313: ตLชkซOฏd, คฃจฯฅฮผศฆsภษ"
-
-#: ../memline.c:1747
-msgid "File preserved"
-msgstr "ภษฎืคwซOฏd"
-
-#: ../memline.c:1749
-msgid "E314: Preserve failed"
-msgstr "E314: ซOฏdฅขฑั"
-
-#: ../memline.c:1819
-#, c-format
-msgid "E315: ml_get: invalid lnum: %<PRId64>"
-msgstr "E315: ml_get: ฟ๙ป~ชบ lnum: %<PRId64>"
-
-#: ../memline.c:1851
-#, c-format
-msgid "E316: ml_get: cannot find line %<PRId64>"
-msgstr "E316: ml_get: งไคฃจ์ฒฤ %<PRId64> ฆๆ "
-
-#: ../memline.c:2236
-msgid "E317: pointer block id wrong 3"
-msgstr "E317: ซผะฐฯถ๔ id ฟ๙ป~ 3"
-
-#: ../memline.c:2311
-msgid "stack_idx should be 0"
-msgstr "stack_idx ภณธำฌO 0"
-
-#: ../memline.c:2369
-msgid "E318: Updated too many blocks?"
-msgstr "E318: ง๓ทsคำฆhฐฯถ๔?"
-
-#: ../memline.c:2511
-msgid "E317: pointer block id wrong 4"
-msgstr "E317: ซผะฐฯถ๔ id ฟ๙ป~ 4"
-
-#: ../memline.c:2536
-msgid "deleted block 1?"
-msgstr "งRฐฃฐฯถ๔ 1?"
-
-#: ../memline.c:2707
-#, c-format
-msgid "E320: Cannot find line %<PRId64>"
-msgstr "E320: งไคฃจ์ฒฤ %<PRId64> ฆๆ "
-
-#: ../memline.c:2916
-msgid "E317: pointer block id wrong"
-msgstr "E317: ซผะฐฯถ๔ id ฟ๙ป~"
-
-#: ../memline.c:2930
-msgid "pe_line_count is zero"
-msgstr "pe_line_count ฌฐนs"
-
-#: ../memline.c:2955
-#, c-format
-msgid "E322: line number out of range: %<PRId64> past the end"
-msgstr "E322: ฆๆธนถWฅXฝdณ๒: %<PRId64> ถWนLตฒงภ"
-
-#: ../memline.c:2959
-#, c-format
-msgid "E323: line count wrong in block %<PRId64>"
-msgstr "E323: ฐฯถ๔ %<PRId64> ฆๆผฦฟ๙ป~"
-
-#: ../memline.c:2999
-msgid "Stack size increases"
-msgstr "ฐ๏ล|คjคpผWฅ["
-
-#: ../memline.c:3038
-msgid "E317: pointer block id wrong 2"
-msgstr "E317: ซผะฐฯถ๔ id ฟ๙ 2"
-
-#: ../memline.c:3070
-#, c-format
-msgid "E773: Symlink loop for \"%s\""
-msgstr ""
-
-#: ../memline.c:3221
-msgid "E325: ATTENTION"
-msgstr "E325: ช`ทN"
-
-#: ../memline.c:3222
-msgid ""
-"\n"
-"Found a swap file by the name \""
-msgstr ""
-"\n"
-"งไจ์ผศฆsภษ \""
-
-#: ../memline.c:3226
-msgid "While opening file \""
-msgstr "ฆbถ}ฑาภษฎื \""
-
-#: ../memline.c:3239
-msgid " NEWER than swap file!\n"
-msgstr " ค๑ผศฆsภษง๓ทs!\n"
-
-#: ../memline.c:3244
-#, fuzzy
-msgid ""
-"\n"
-"(1) Another program may be editing the same file. If this is the case,\n"
-" be careful not to end up with two different instances of the same\n"
-" file when making changes."
-msgstr ""
-"\n"
-"(1) ฅiฏเฆณฅtค@ญำต{ฆกค]ฆbฝsฟ่ฆPค@ญำภษฎื.\n"
-" ฆpชGฌOณoผหกAฝะคpค฿คฃญnจโรไค@ฐ_ผgคJกAคฃตMงAชบงVคOณฃท|ญtฝัฌyค๔กC\n"
-
-#: ../memline.c:3245
-#, fuzzy
-msgid " Quit, or continue with caution.\n"
-msgstr " ย๗ถ}กAฉฮฌOฤ~ฤ๒ฝsฟ่กC\n"
-
-#: ../memline.c:3246
-#, fuzzy
-msgid "(2) An edit session for this file crashed.\n"
-msgstr ""
-"\n"
-"(2) ซeฆธฝsฟ่ฆนภษฎษทํพ๗\n"
-
-#: ../memline.c:3247
-msgid " If this is the case, use \":recover\" or \"vim -r "
-msgstr " ฆpชGฌOณoผห, ฝะฅฮ \":recover\" ฉฮ \"vim -r"
-
-#: ../memline.c:3249
-msgid ""
-"\"\n"
-" to recover the changes (see \":help recovery\").\n"
-msgstr ""
-"\"\n"
-" จำฑฯฆ^ญืง๏ธ๊ฎฦ (ธิฒำปกฉ๚ฝะฌ \":help recovery\").\n"
-
-#: ../memline.c:3250
-msgid " If you did this already, delete the swap file \""
-msgstr " ฆpชGธำฑฯชบณฃคwธgฑฯคF, ฝะชฝฑตงRฐฃฆนผศฆsภษ \""
-
-#: ../memline.c:3252
-msgid ""
-"\"\n"
-" to avoid this message.\n"
-msgstr ""
-"\"\n"
-" ฅHมืงKฆAฌจ์ฆนฐTฎง.\n"
-
-#: ../memline.c:3450 ../memline.c:3452
-msgid "Swap file \""
-msgstr "ผศฆsภษ \""
-
-#: ../memline.c:3451 ../memline.c:3455
-msgid "\" already exists!"
-msgstr "\" คwธgฆsฆbคF!"
-
-#: ../memline.c:3457
-msgid "VIM - ATTENTION"
-msgstr "VIM - ช`ทN"
-
-#: ../memline.c:3459
-msgid "Swap file already exists!"
-msgstr "ผศฆsภษคwธgฆsฆb!"
-
-#: ../memline.c:3464
-msgid ""
-"&Open Read-Only\n"
-"&Edit anyway\n"
-"&Recover\n"
-"&Quit\n"
-"&Abort"
-msgstr ""
-"ฅHฐ฿ลชค่ฆกถ}ฑา(&O)\n"
-"ชฝฑตฝsฟ่(&E)\n"
-"ญืด_(&R)\n"
-"ย๗ถ}(&Q)\n"
-"ธ๕ฅX(&A)"
-
-#: ../memline.c:3467
-#, fuzzy
-msgid ""
-"&Open Read-Only\n"
-"&Edit anyway\n"
-"&Recover\n"
-"&Delete it\n"
-"&Quit\n"
-"&Abort"
-msgstr ""
-"ฅHฐ฿ลชค่ฆกถ}ฑา(&O)\n"
-"ชฝฑตฝsฟ่(&E)\n"
-"ญืด_(&R)\n"
-"ย๗ถ}(&Q)\n"
-"ธ๕ฅX(&A)"
-
-#.
-#. * Change the ".swp" extension to find another file that can be used.
-#. * First decrement the last char: ".swo", ".swn", etc.
-#. * If that still isn't enough decrement the last but one char: ".svz"
-#. * Can happen when editing many "No Name" buffers.
-#.
-#. ".s?a"
-#. ".saa": tried enough, give up
-#: ../memline.c:3528
-msgid "E326: Too many swap files found"
-msgstr "E326: งไจ์คำฆhผศฆsภษ"
-
-#: ../memory.c:227
-#, c-format
-msgid "E342: Out of memory! (allocating %<PRIu64> bytes)"
-msgstr "E342: ฐOพะล้คฃจฌ! (นมธีฐtธm %<PRIu64> ฆ์คธฒี)"
-
-#: ../menu.c:62
-msgid "E327: Part of menu-item path is not sub-menu"
-msgstr "E327: ณกฅ๗ฟ๏ถตธ๔ฎ|คฃฌOคlฟ๏ณๆ"
-
-#: ../menu.c:63
-msgid "E328: Menu only exists in another mode"
-msgstr "E328: ฟ๏ณๆฅuฏเฆbจไฅฆผาฆกคคจฯฅฮ"
-
-#: ../menu.c:64
-#, fuzzy, c-format
-msgid "E329: No menu \"%s\""
-msgstr "E329: จSฆณจบผหชบฟ๏ณๆ"
-
-#. Only a mnemonic or accelerator is not valid.
-#: ../menu.c:329
-msgid "E792: Empty menu name"
-msgstr ""
-
-#: ../menu.c:340
-msgid "E330: Menu path must not lead to a sub-menu"
-msgstr "E330: ฟ๏ณๆธ๔ฎ|คฃฏเซฆVคlฟ๏ณๆ"
-
-#: ../menu.c:365
-msgid "E331: Must not add menu items directly to menu bar"
-msgstr "E331: คฃฏเชฝฑตงโฟ๏ถตฅ[จ์ฟ๏ณๆฆCคค"
-
-#: ../menu.c:370
-msgid "E332: Separator cannot be part of a menu path"
-msgstr "E332: คภนjฝuคฃฏเฌOฟ๏ณๆธ๔ฎ|ชบค@ณกฅ๗"
-
-#. Now we have found the matching menu, and we list the mappings
-#. Highlight title
-#: ../menu.c:762
-msgid ""
-"\n"
-"--- Menus ---"
-msgstr ""
-"\n"
-"--- ฟ๏ณๆ ---"
-
-#: ../menu.c:1313
-msgid "E333: Menu path must lead to a menu item"
-msgstr "E333: ฟ๏ณๆธ๔ฎ|ฅฒปซฆVค@ญำฟ๏ถต"
-
-#: ../menu.c:1330
-#, c-format
-msgid "E334: Menu not found: %s"
-msgstr "E334: [ฟ๏ณๆ] งไคฃจ์ %s"
-
-#: ../menu.c:1396
-#, c-format
-msgid "E335: Menu not defined for %s mode"
-msgstr "E335: %s ผาฆกฅผฉwธqฟ๏ณๆ"
-
-#: ../menu.c:1426
-msgid "E336: Menu path must lead to a sub-menu"
-msgstr "E336: ฟ๏ณๆธ๔ฎ|ฅฒปซฆVคlฟ๏ณๆ"
-
-#: ../menu.c:1447
-msgid "E337: Menu not found - check menu names"
-msgstr "E337: งไคฃจ์ฟ๏ณๆ - ฝะภหฌdฟ๏ณๆฆWบู"
-
-#: ../message.c:423
-#, c-format
-msgid "Error detected while processing %s:"
-msgstr "ณBฒz %s ฎษตoฅอฟ๙ป~:"
-
-#: ../message.c:445
-#, c-format
-msgid "line %4ld:"
-msgstr "ฆๆ %4ld:"
-
-#: ../message.c:617
-#, c-format
-msgid "E354: Invalid register name: '%s'"
-msgstr "E354: ผศฆsพนฆWบูฟ๙ป~: '%s'"
-
-#: ../message.c:745
-msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
-msgstr ""
-"ฅฟล้คคคๅฐTฎงบ๛ล@ชฬ: Francis S.Lin <piaip@csie.ntu.edu."
-"tw>, Cecil Sheng <b7506022@csie.ntu.edu.tw>"
-
-#: ../message.c:986
-msgid "Interrupt: "
-msgstr "คwคคย_: "
-
-#: ../message.c:988
-#, fuzzy
-msgid "Press ENTER or type command to continue"
-msgstr "ฝะซ๖ ENTER ฉฮจไฅฆฉRฅOฅHฤ~ฤ๒"
-
-#: ../message.c:1843
-#, fuzzy, c-format
-msgid "%s line %<PRId64>"
-msgstr "%s, ฆๆ %<PRId64>"
-
-#: ../message.c:2392
-msgid "-- More --"
-msgstr "-- ฉ|ฆณ --"
-
-#: ../message.c:2398
-msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "
-msgstr ""
-
-#: ../message.c:3021 ../message.c:3031
-msgid "Question"
-msgstr "ฐรD"
-
-#: ../message.c:3023
-msgid ""
-"&Yes\n"
-"&No"
-msgstr ""
-"&YฌO\n"
-"&Nง_"
-
-#: ../message.c:3033
-msgid ""
-"&Yes\n"
-"&No\n"
-"&Cancel"
-msgstr ""
-"&YฌO\n"
-"&Nง_\n"
-"&Cจ๚ฎ๘"
-
-#: ../message.c:3045
-msgid ""
-"&Yes\n"
-"&No\n"
-"Save &All\n"
-"&Discard All\n"
-"&Cancel"
-msgstr ""
-"&YฌO\n"
-"&Nง_\n"
-"&Aฅณกฆsภษ\n"
-"&Dฅณกคฃฆs\n"
-"&Cจ๚ฎ๘"
-
-#: ../message.c:3058
-#, fuzzy
-msgid "E766: Insufficient arguments for printf()"
-msgstr "E116: จ็ฆก %s ชบคผฦคฃฅฟฝT"
-
-#: ../message.c:3119
-msgid "E807: Expected Float argument for printf()"
-msgstr ""
-
-#: ../message.c:3873
-#, fuzzy
-msgid "E767: Too many arguments to printf()"
-msgstr "E118: จ็ฆก %s ชบคผฦนLฆh"
-
-#: ../misc1.c:2256
-msgid "W10: Warning: Changing a readonly file"
-msgstr "W10: ช`ทN: งAฅฟฆbญืง๏ค@ญำฐ฿ลชภษ"
-
-#: ../misc1.c:2537
-msgid "Type number and <Enter> or click with mouse (empty cancels): "
-msgstr ""
-
-#: ../misc1.c:2539
-msgid "Type number and <Enter> (empty cancels): "
-msgstr ""
-
-#: ../misc1.c:2585
-msgid "1 more line"
-msgstr "มูฆณค@ฆๆ "
-
-#: ../misc1.c:2588
-msgid "1 line less"
-msgstr "คึฉ๓ค@ฆๆ "
-
-#: ../misc1.c:2593
-#, c-format
-msgid "%<PRId64> more lines"
-msgstr "มูฆณ %<PRId64> ฆๆ "
-
-#: ../misc1.c:2596
-#, c-format
-msgid "%<PRId64> fewer lines"
-msgstr "ฅuณั %<PRId64> ฆๆ "
-
-#: ../misc1.c:2599
-msgid " (Interrupted)"
-msgstr " (คwคคย_)"
-
-#: ../misc1.c:2635
-msgid "Beep!"
-msgstr ""
-
-#: ../misc2.c:738
-#, c-format
-msgid "Calling shell to execute: \"%s\""
-msgstr "ฉIฅs shell ฐ๕ฆๆ: \"%s\""
-
-#: ../normal.c:183
-msgid "E349: No identifier under cursor"
-msgstr "E349: ดๅผะณBจSฆณรังOฆr"
-
-#: ../normal.c:1866
-#, fuzzy
-msgid "E774: 'operatorfunc' is empty"
-msgstr "E221: ฟ๏ถต 'commentstring' ฅผณ]ฉw"
-
-#: ../normal.c:2637
-msgid "Warning: terminal cannot highlight"
-msgstr "ช`ทN: งAชบฒืบพ๗ตLชkลใฅฐชซGซื"
-
-#: ../normal.c:2807
-msgid "E348: No string under cursor"
-msgstr "E348: ดๅผะณBจSฆณฆrฆ๊"
-
-#: ../normal.c:3937
-msgid "E352: Cannot erase folds with current 'foldmethod'"
-msgstr "E352: ตLชkฆbฅุซeชบ 'foldmethod' คUงRฐฃ fold"
-
-#: ../normal.c:5897
-msgid "E664: changelist is empty"
-msgstr "E664: ลง๓ฆCชํฌOชลชบ"
-
-#: ../normal.c:5899
-msgid "E662: At start of changelist"
-msgstr "E662: คwฆbลง๓ฆCชํชบถ}ภY"
-
-#: ../normal.c:5901
-msgid "E663: At end of changelist"
-msgstr "E663: คwฆbลง๓ฆCชํชบตฒงภ"
-
-#: ../normal.c:7053
-msgid "Type :quit<Enter> to exit Nvim"
-msgstr "ญnย๗ถ} Vim ฝะฟ้คJ :quit<Enter> "
-
-#: ../ops.c:248
-#, c-format
-msgid "1 line %sed 1 time"
-msgstr "ค@ฆๆ %s นL ค@ฆธ"
-
-#: ../ops.c:250
-#, c-format
-msgid "1 line %sed %d times"
-msgstr "ค@ฆๆ %s นL %d ฆธ"
-
-#: ../ops.c:253
-#, c-format
-msgid "%<PRId64> lines %sed 1 time"
-msgstr "%<PRId64> ฆๆ %s นL ค@ฆธ"
-
-#: ../ops.c:256
-#, c-format
-msgid "%<PRId64> lines %sed %d times"
-msgstr "%<PRId64> ฆๆ %s นL %d ฆธ"
-
-#: ../ops.c:592
-#, c-format
-msgid "%<PRId64> lines to indent... "
-msgstr "มYฑฦ %<PRId64> ฆๆ... "
-
-#: ../ops.c:634
-msgid "1 line indented "
-msgstr "ค@ฆๆคwมYฑฦ"
-
-#: ../ops.c:636
-#, c-format
-msgid "%<PRId64> lines indented "
-msgstr "คwมYฑฦ %<PRId64> ฆๆ "
-
-#: ../ops.c:938
-#, fuzzy
-msgid "E748: No previously used register"
-msgstr "E186: จSฆณซeค@ญำฅุฟ"
-
-#. must display the prompt
-#: ../ops.c:1433
-msgid "cannot yank; delete anyway"
-msgstr "ตLชkฐลคU; ชฝฑตงRฐฃ"
-
-#: ../ops.c:1929
-msgid "1 line changed"
-msgstr " 1 ฆๆ ~ed"
-
-#: ../ops.c:1931
-#, c-format
-msgid "%<PRId64> lines changed"
-msgstr "คwง๏ล %<PRId64> ฆๆ "
-
-#: ../ops.c:2521
-#, fuzzy
-msgid "block of 1 line yanked"
-msgstr "คwฝฦปs 1 ฆๆ "
-
-#: ../ops.c:2523
-msgid "1 line yanked"
-msgstr "คwฝฦปs 1 ฆๆ "
-
-#: ../ops.c:2525
-#, fuzzy, c-format
-msgid "block of %<PRId64> lines yanked"
-msgstr "คwฝฦปs %<PRId64> ฆๆ "
-
-#: ../ops.c:2528
-#, c-format
-msgid "%<PRId64> lines yanked"
-msgstr "คwฝฦปs %<PRId64> ฆๆ "
-
-#: ../ops.c:2710
-#, c-format
-msgid "E353: Nothing in register %s"
-msgstr "E353: ผศฆsพน %s ธฬจSฆณชFฆ่"
-
-#. Highlight title
-#: ../ops.c:3185
-msgid ""
-"\n"
-"--- Registers ---"
-msgstr ""
-"\n"
-"--- ผศฆsพน ---"
-
-#: ../ops.c:4455
-msgid "Illegal register name"
-msgstr "คฃฅฟฝTชบผศฆsพนฆWบู"
-
-#: ../ops.c:4533
-msgid ""
-"\n"
-"# Registers:\n"
-msgstr ""
-"\n"
-"# ผศฆsพน:\n"
-
-#: ../ops.c:4575
-#, c-format
-msgid "E574: Unknown register type %d"
-msgstr "E574: ฅผชพชบต๙ฅUซฌบA: %d"
-
-#: ../ops.c:5089
-#, c-format
-msgid "%<PRId64> Cols; "
-msgstr "%<PRId64> ฤๆ; "
-
-#: ../ops.c:5097
-#, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Bytes"
-msgstr ""
-"ฟ๏พคF %s%<PRId64>/%<PRId64> ฆๆ; %<PRId64>/%<PRId64> ฆr(Word); %<PRId64>/"
-"%<PRId64> ฆrคธ(Bytes)"
-
-#: ../ops.c:5105
-#, fuzzy, c-format
-msgid ""
-"Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; "
-"%<PRId64> of %<PRId64> Chars; %<PRId64> of %<PRId64> Bytes"
-msgstr ""
-"ฟ๏พคF %s%<PRId64>/%<PRId64> ฆๆ; %<PRId64>/%<PRId64> ฆr(Word); %<PRId64>/"
-"%<PRId64> ฆrคธ(Bytes)"
-
-#: ../ops.c:5123
-#, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Byte "
-"%<PRId64> of %<PRId64>"
-msgstr ""
-"ฤๆ %s/%s; ฆๆ %<PRId64>/%<PRId64>; ฆr(Word) %<PRId64>/%<PRId64>; ฆrคธ(Byte) "
-"%<PRId64>/%<PRId64>"
-
-#: ../ops.c:5133
-#, fuzzy, c-format
-msgid ""
-"Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Char "
-"%<PRId64> of %<PRId64>; Byte %<PRId64> of %<PRId64>"
-msgstr ""
-"ฤๆ %s/%s; ฆๆ %<PRId64>/%<PRId64>; ฆr(Word) %<PRId64>/%<PRId64>; ฆrคธ(Byte) "
-"%<PRId64>/%<PRId64>"
-
-#: ../ops.c:5146
-#, c-format
-msgid "(+%<PRId64> for BOM)"
-msgstr "(+%<PRId64> for BOM)"
-
-#: ../option.c:1238
-msgid "%<%f%h%m%=Page %N"
-msgstr "%<%f%h%m%=ฒฤ %N ญถ"
-
-# ? what's this for?
-#: ../option.c:1574
-msgid "Thanks for flying Vim"
-msgstr "ทPมยฑzทRฅฮ Vim"
-
-#. found a mismatch: skip
-#: ../option.c:2698
-msgid "E518: Unknown option"
-msgstr "E518: คฃฅฟฝTชบฟ๏ถต"
-
-#: ../option.c:2709
-msgid "E519: Option not supported"
-msgstr "E519: คฃคไดฉธำฟ๏ถต"
-
-#: ../option.c:2740
-msgid "E520: Not allowed in a modeline"
-msgstr "E520: คฃฏเฆb Modeline ธฬฅXฒ{"
-
-#: ../option.c:2815
-msgid "E846: Key code not set"
-msgstr ""
-
-#: ../option.c:2924
-msgid "E521: Number required after ="
-msgstr "E521: = ซแปญnฆณผฦฆr"
-
-#: ../option.c:3226 ../option.c:3864
-msgid "E522: Not found in termcap"
-msgstr "E522: Termcap ธฬญฑงไคฃจ์"
-
-#: ../option.c:3335
-#, c-format
-msgid "E539: Illegal character <%s>"
-msgstr "E539: คฃฅฟฝTชบฆrคธ <%s>"
-
-#: ../option.c:3862
-msgid "E529: Cannot set 'term' to empty string"
-msgstr "E529: ตLชkณ]ฉw 'term' ฌฐชลฆrฆ๊"
-
-#: ../option.c:3885
-msgid "E589: 'backupext' and 'patchmode' are equal"
-msgstr "E589: 'backupext' ธ๒ 'patchmode' ฌOค@ผหชบ"
-
-#: ../option.c:3964
-msgid "E834: Conflicts with value of 'listchars'"
-msgstr ""
-
-#: ../option.c:3966
-msgid "E835: Conflicts with value of 'fillchars'"
-msgstr ""
-
-#: ../option.c:4163
-msgid "E524: Missing colon"
-msgstr "E524: ฏสคึ colon"
-
-#: ../option.c:4165
-msgid "E525: Zero length string"
-msgstr "E525: นsช๘ซืฆrฆ๊"
-
-#: ../option.c:4220
-#, c-format
-msgid "E526: Missing number after <%s>"
-msgstr "E526: <%s> ซแฏสคึผฦฆr"
-
-#: ../option.c:4232
-msgid "E527: Missing comma"
-msgstr "E527: ฏสคึณrธน"
-
-#: ../option.c:4239
-msgid "E528: Must specify a ' value"
-msgstr "E528: ฅฒปซฉwค@ญำ ' ญศ"
-
-#: ../option.c:4271
-msgid "E595: contains unprintable or wide character"
-msgstr "E595: คบงtตLชkลใฅชบฆrคธ"
-
-#: ../option.c:4469
-#, c-format
-msgid "E535: Illegal character after <%c>"
-msgstr "E535: <%c> ซแฆณคฃฅฟฝTชบฆrคธ"
-
-#: ../option.c:4534
-msgid "E536: comma required"
-msgstr "E536: ปญnณrธน"
-
-#: ../option.c:4543
-#, c-format
-msgid "E537: 'commentstring' must be empty or contain %s"
-msgstr "E537: 'commentstring' ฅฒปฌOชลฅีฉฮฅ]งt %s"
-
-#: ../option.c:4928
-msgid "E540: Unclosed expression sequence"
-msgstr "E540: จSฆณตฒง๔ชบนBบโฆก: "
-
-#: ../option.c:4932
-msgid "E541: too many items"
-msgstr "E541: คำฆhถตฅุ"
-
-#: ../option.c:4934
-msgid "E542: unbalanced groups"
-msgstr "E542: คฃน๏บูชบ group"
-
-#: ../option.c:5148
-msgid "E590: A preview window already exists"
-msgstr "E590: นwต๘ชบต๘ตกคwธgฆsฆbคF"
-
-#: ../option.c:5311
-msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'"
-msgstr "W17: Arabic ปญn UTF-8, ฝะฐ๕ฆๆ ':set encoding=utf-8'"
-
-#: ../option.c:5623
-#, c-format
-msgid "E593: Need at least %d lines"
-msgstr "E593: ฆคึปญn %d ฆๆ "
-
-#: ../option.c:5631
-#, c-format
-msgid "E594: Need at least %d columns"
-msgstr "E594: ฆคึปญn %d ฤๆ"
-
-#: ../option.c:6011
-#, c-format
-msgid "E355: Unknown option: %s"
-msgstr "E355: คฃฅฟฝTชบฟ๏ถต: %s"
-
-#. There's another character after zeros or the string
-#. * is empty. In both cases, we are trying to set a
-#. * num option using a string.
-#: ../option.c:6037
-#, fuzzy, c-format
-msgid "E521: Number required: &%s = '%s'"
-msgstr "E521: = ซแปญnฆณผฦฆr"
-
-#: ../option.c:6149
-msgid ""
-"\n"
-"--- Terminal codes ---"
-msgstr ""
-"\n"
-"--- ฒืบพ๗ฝX ---"
-
-#: ../option.c:6151
-msgid ""
-"\n"
-"--- Global option values ---"
-msgstr ""
-"\n"
-"--- Global ฟ๏ถตญศ ---"
-
-#: ../option.c:6153
-msgid ""
-"\n"
-"--- Local option values ---"
-msgstr ""
-"\n"
-"--- Local ฟ๏ถตญศ ---"
-
-#: ../option.c:6155
-msgid ""
-"\n"
-"--- Options ---"
-msgstr ""
-"\n"
-"--- ฟ๏ถต ---"
-
-#: ../option.c:6816
-msgid "E356: get_varp ERROR"
-msgstr "E356: get_varp ฟ๙ป~"
-
-#: ../option.c:7696
-#, c-format
-msgid "E357: 'langmap': Matching character missing for %s"
-msgstr "E357: 'langmap': งไคฃจ์ %s น๏ภณชบฆrคธ"
-
-#: ../option.c:7715
-#, c-format
-msgid "E358: 'langmap': Extra characters after semicolon: %s"
-msgstr "E358: 'langmap': คภธนซแฆณฆhพlชบฆrคธ: %s"
-
-#: ../os/shell.c:194
-msgid ""
-"\n"
-"Cannot execute shell "
-msgstr ""
-"\n"
-"คฃฏเฐ๕ฆๆ shell"
-
-#: ../os/shell.c:439
-msgid ""
-"\n"
-"shell returned "
-msgstr ""
-"\n"
-"Shell คwช๐ฆ^"
-
-#: ../os_unix.c:465 ../os_unix.c:471
-msgid ""
-"\n"
-"Could not get security context for "
-msgstr ""
-
-#: ../os_unix.c:479
-msgid ""
-"\n"
-"Could not set security context for "
-msgstr ""
-
-#: ../os_unix.c:1558 ../os_unix.c:1647
-#, c-format
-msgid "dlerror = \"%s\""
-msgstr ""
-
-#: ../path.c:1449
-#, c-format
-msgid "E447: Can't find file \"%s\" in path"
-msgstr "E447: ฆbธ๔ฎ|คคงไคฃจ์ภษฎื \"%s\""
-
-#: ../quickfix.c:359
-#, c-format
-msgid "E372: Too many %%%c in format string"
-msgstr "E372: ฎๆฆกคฦฆrฆ๊ธฬฆณคำฆh %%%c "
-
-#: ../quickfix.c:371
-#, c-format
-msgid "E373: Unexpected %%%c in format string"
-msgstr "E373: ฎๆฆกคฦฆrฆ๊คฃภณธำฅXฒ{ %%%c "
-
-#: ../quickfix.c:420
-msgid "E374: Missing ] in format string"
-msgstr "E374: ฎๆฆกคฦฆrฆ๊ธฬคึคF ]"
-
-#: ../quickfix.c:431
-#, c-format
-msgid "E375: Unsupported %%%c in format string"
-msgstr "E375: ฎๆฆกคฦฆrฆ๊ธฬฆณคฃคไดฉชบ %%%c "
-
-#: ../quickfix.c:448
-#, c-format
-msgid "E376: Invalid %%%c in format string prefix"
-msgstr "E376: ฎๆฆกคฦฆrฆ๊ถ}ภYธฬฆณคฃฅฟฝTชบ %%%c "
-
-#: ../quickfix.c:454
-#, c-format
-msgid "E377: Invalid %%%c in format string"
-msgstr "E377: ฎๆฆกคฦฆrฆ๊ธฬฆณคฃฅฟฝTชบ %%%c "
-
-#. nothing found
-#: ../quickfix.c:477
-msgid "E378: 'errorformat' contains no pattern"
-msgstr "E378: 'errorformat' ฅผณ]ฉw"
-
-#: ../quickfix.c:695
-msgid "E379: Missing or empty directory name"
-msgstr "E379: งไคฃจ์ฅุฟฆWบูฉฮฌOชลชบฅุฟฆWบู"
-
-#: ../quickfix.c:1305
-msgid "E553: No more items"
-msgstr "E553: จSฆณจไฅฆถตฅุ"
-
-#: ../quickfix.c:1674
-#, c-format
-msgid "(%d of %d)%s%s: "
-msgstr "(%d / %d)%s%s: "
-
-#: ../quickfix.c:1676
-msgid " (line deleted)"
-msgstr " (ฆๆคwงRฐฃ)"
-
-#: ../quickfix.c:1863
-msgid "E380: At bottom of quickfix stack"
-msgstr "E380: Quickfix ฐ๏ล|ตฒงภ"
-
-#: ../quickfix.c:1869
-msgid "E381: At top of quickfix stack"
-msgstr "E381: Quickfix ฐ๏ล|ณปบ"
-
-#: ../quickfix.c:1880
-#, c-format
-msgid "error list %d of %d; %d errors"
-msgstr "ฟ๙ป~ฆCชํ %d/%d; ฆ@ฆณ %d ถตฟ๙ป~"
-
-#: ../quickfix.c:2427
-msgid "E382: Cannot write, 'buftype' option is set"
-msgstr "E382: ตLชkผgคJกA'buftype' ฟ๏ถตคwณ]ฉw"
-
-#: ../quickfix.c:2812
-msgid "E683: File name missing or invalid pattern"
-msgstr ""
-
-#: ../quickfix.c:2911
-#, fuzzy, c-format
-msgid "Cannot open file \"%s\""
-msgstr "ตLชkถ}ฑาภษฎื %s"
-
-#: ../quickfix.c:3429
-#, fuzzy
-msgid "E681: Buffer is not loaded"
-msgstr "คwฤภฉ๑ค@ญำฝwฝฤฐฯ"
-
-#: ../quickfix.c:3487
-#, fuzzy
-msgid "E777: String or List expected"
-msgstr "E548: ภณธำญnฆณผฦฆr"
-
-#: ../regexp.c:359
-#, c-format
-msgid "E369: invalid item in %s%%[]"
-msgstr "E369: คฃฅฟฝTชบถตฅุกG %s%%[]"
-
-#: ../regexp.c:374
-#, fuzzy, c-format
-msgid "E769: Missing ] after %s["
-msgstr "E69: %s%%[ ซแฏสคึ ]"
-
-#: ../regexp.c:375
-#, c-format
-msgid "E53: Unmatched %s%%("
-msgstr "E53: ตLน๏ภณชบ %s%%("
-
-#: ../regexp.c:376
-#, c-format
-msgid "E54: Unmatched %s("
-msgstr "E54: ตLน๏ภณชบ %s("
-
-#: ../regexp.c:377
-#, c-format
-msgid "E55: Unmatched %s)"
-msgstr "E55: ตLน๏ภณชบ %s)"
-
-#: ../regexp.c:378
-msgid "E66: \\z( not allowed here"
-msgstr "E66: \\z( คฃฏเฆbฆนฅXฒ{"
-
-#: ../regexp.c:379
-msgid "E67: \\z1 et al. not allowed here"
-msgstr "E67: \\z1 et al. คฃฏเฆbฆนฅXฒ{"
-
-#: ../regexp.c:380
-#, c-format
-msgid "E69: Missing ] after %s%%["
-msgstr "E69: %s%%[ ซแฏสคึ ]"
-
-#: ../regexp.c:381
-#, c-format
-msgid "E70: Empty %s%%[]"
-msgstr "E70: ชลชบ %s%%[]"
-
-#: ../regexp.c:1209 ../regexp.c:1224
-msgid "E339: Pattern too long"
-msgstr "E339: ฆWฆrคำช๘"
-
-#: ../regexp.c:1371
-msgid "E50: Too many \\z("
-msgstr "E50: คำฆh \\z("
-
-#: ../regexp.c:1378
-#, c-format
-msgid "E51: Too many %s("
-msgstr "E51: คำฆh %s("
-
-#: ../regexp.c:1427
-msgid "E52: Unmatched \\z("
-msgstr "E52: ตLน๏ภณชบ \\z("
-
-#: ../regexp.c:1637
-#, c-format
-msgid "E59: invalid character after %s@"
-msgstr "E59: ซแญฑฆณคฃฅฟฝTชบฆrคธ: %s@"
-
-#: ../regexp.c:1672
-#, c-format
-msgid "E60: Too many complex %s{...}s"
-msgstr "E60: คำฆhฝฦย๘ชบ %s{...}s"
-
-#: ../regexp.c:1687
-#, c-format
-msgid "E61: Nested %s*"
-msgstr "E61: ฑ_ชฌ %s*"
-
-#: ../regexp.c:1690
-#, c-format
-msgid "E62: Nested %s%c"
-msgstr "E62: ฑ_ชฌ %s%c"
-
-#: ../regexp.c:1800
-msgid "E63: invalid use of \\_"
-msgstr "E63: คฃฅฟฝTชบจฯฅฮ \\_"
-
-#: ../regexp.c:1850
-#, c-format
-msgid "E64: %s%c follows nothing"
-msgstr "E64: %s%c จSฆณฑตชFฆ่"
-
-#: ../regexp.c:1902
-msgid "E65: Illegal back reference"
-msgstr "E65: คฃฅฟฝTชบคฯฆVฐัฆา"
-
-#: ../regexp.c:1943
-msgid "E68: Invalid character after \\z"
-msgstr "E68: ซแญฑฆณคฃฅฟฝTชบฆrคธ: \\z"
-
-#: ../regexp.c:2049 ../regexp_nfa.c:1296
-#, fuzzy, c-format
-msgid "E678: Invalid character after %s%%[dxouU]"
-msgstr "E71: ซแญฑฆณคฃฅฟฝTชบฆrคธ: %s%%"
-
-#: ../regexp.c:2107
-#, c-format
-msgid "E71: Invalid character after %s%%"
-msgstr "E71: ซแญฑฆณคฃฅฟฝTชบฆrคธ: %s%%"
-
-#: ../regexp.c:3017
-#, c-format
-msgid "E554: Syntax error in %s{...}"
-msgstr "E554: ปyชkฟ๙ป~: %s{...}"
-
-#: ../regexp.c:3805
-msgid "External submatches:\n"
-msgstr "ฅ~ณกฒลฆX:\n"
-
-#: ../regexp.c:7022
-msgid ""
-"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be "
-"used "
-msgstr ""
-
-#: ../regexp_nfa.c:239
-msgid "E865: (NFA) Regexp end encountered prematurely"
-msgstr ""
-
-#: ../regexp_nfa.c:240
-#, c-format
-msgid "E866: (NFA regexp) Misplaced %c"
-msgstr ""
-
-#: ../regexp_nfa.c:242
-#, c-format
-msgid "E877: (NFA regexp) Invalid character class: %<PRId64>"
-msgstr ""
-
-#: ../regexp_nfa.c:1261
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\z%c'"
-msgstr ""
-
-#: ../regexp_nfa.c:1387
-#, c-format
-msgid "E867: (NFA) Unknown operator '\\%%%c'"
-msgstr ""
-
-#: ../regexp_nfa.c:1802
-#, c-format
-msgid "E869: (NFA) Unknown operator '\\@%c'"
-msgstr ""
-
-#: ../regexp_nfa.c:1831
-msgid "E870: (NFA regexp) Error reading repetition limits"
-msgstr ""
-
-#. Can't have a multi follow a multi.
-#: ../regexp_nfa.c:1895
-msgid "E871: (NFA regexp) Can't have a multi follow a multi !"
-msgstr ""
-
-#. Too many `('
-#: ../regexp_nfa.c:2037
-msgid "E872: (NFA regexp) Too many '('"
-msgstr ""
-
-#: ../regexp_nfa.c:2042
-#, fuzzy
-msgid "E879: (NFA regexp) Too many \\z("
-msgstr "E50: คำฆh \\z("
-
-#: ../regexp_nfa.c:2066
-msgid "E873: (NFA regexp) proper termination error"
-msgstr ""
-
-#: ../regexp_nfa.c:2599
-msgid "E874: (NFA) Could not pop the stack !"
-msgstr ""
-
-#: ../regexp_nfa.c:3298
-msgid ""
-"E875: (NFA regexp) (While converting from postfix to NFA), too many states "
-"left on stack"
-msgstr ""
-
-#: ../regexp_nfa.c:3302
-msgid "E876: (NFA regexp) Not enough space to store the whole NFA "
-msgstr ""
-
-#: ../regexp_nfa.c:4571 ../regexp_nfa.c:4869
-msgid ""
-"Could not open temporary log file for writing, displaying on stderr ... "
-msgstr ""
-
-#: ../regexp_nfa.c:4840
-#, c-format
-msgid "(NFA) COULD NOT OPEN %s !"
-msgstr ""
-
-#: ../regexp_nfa.c:6049
-#, fuzzy
-msgid "Could not open temporary log file for writing "
-msgstr "E214: งไคฃจ์ผgคJฅฮชบผศฆsภษ"
-
-#: ../screen.c:7435
-msgid " VREPLACE"
-msgstr " V-จ๚ฅN"
-
-#: ../screen.c:7437
-msgid " REPLACE"
-msgstr " จ๚ฅN"
-
-#: ../screen.c:7440
-msgid " REVERSE"
-msgstr " คฯยเ"
-
-#: ../screen.c:7441
-msgid " INSERT"
-msgstr " ดกคJ"
-
-#: ../screen.c:7443
-msgid " (insert)"
-msgstr " (ดกคJ)"
-
-#: ../screen.c:7445
-msgid " (replace)"
-msgstr " (จ๚ฅN)"
-
-#: ../screen.c:7447
-msgid " (vreplace)"
-msgstr " (v-จ๚ฅN)"
-
-#: ../screen.c:7449
-msgid " Hebrew"
-msgstr " Hebrew"
-
-#: ../screen.c:7454
-msgid " Arabic"
-msgstr " Arabic"
-
-#: ../screen.c:7456
-msgid " (lang)"
-msgstr " (ปyจฅ)"
-
-#: ../screen.c:7459
-msgid " (paste)"
-msgstr " (ถKคW)"
-
-#: ../screen.c:7469
-msgid " VISUAL"
-msgstr " ฟ๏จ๚"
-
-#: ../screen.c:7470
-msgid " VISUAL LINE"
-msgstr " [ฆๆ] "
-
-#: ../screen.c:7471
-msgid " VISUAL BLOCK"
-msgstr " [ฐฯถ๔] "
-
-#: ../screen.c:7472
-msgid " SELECT"
-msgstr " ฟ๏จ๚"
-
-#: ../screen.c:7473
-msgid " SELECT LINE"
-msgstr " ฟ๏จ๚ฆๆ "
-
-#: ../screen.c:7474
-msgid " SELECT BLOCK"
-msgstr " ฟ๏จ๚ฐฯถ๔"
-
-#: ../screen.c:7486 ../screen.c:7541
-msgid "recording"
-msgstr "ฐOฟคค"
-
-#: ../search.c:487
-#, c-format
-msgid "E383: Invalid search string: %s"
-msgstr "E383: ฟ๙ป~ชบทjดMฆrฆ๊: %s"
-
-#: ../search.c:832
-#, c-format
-msgid "E384: search hit TOP without match for: %s"
-msgstr "E384: คwทjดMจ์ภษฎืถ}ภYคดงไคฃจ์ %s"
-
-#: ../search.c:835
-#, c-format
-msgid "E385: search hit BOTTOM without match for: %s"
-msgstr "E385: คwทjดMจ์ภษฎืตฒงภคดงไคฃจ์ %s"
-
-#: ../search.c:1200
-msgid "E386: Expected '?' or '/' after ';'"
-msgstr "E386: ฆb ';' ซแญฑภณธำฆณ '?' ฉฮ '/'"
-
-#: ../search.c:4085
-msgid " (includes previously listed match)"
-msgstr " (ฅ]ฌAซeฆธฆCฅXฒลฆXถต)"
-
-#. cursor at status line
-#: ../search.c:4104
-msgid "--- Included files "
-msgstr "--- คคJภษฎื "
-
-#: ../search.c:4106
-msgid "not found "
-msgstr "งไคฃจ์ "
-
-#: ../search.c:4107
-msgid "in path ---\n"
-msgstr "---\n"
-
-#: ../search.c:4168
-msgid " (Already listed)"
-msgstr " (คwฆCฅX)"
-
-#: ../search.c:4170
-msgid " NOT FOUND"
-msgstr " งไคฃจ์"
-
-#: ../search.c:4211
-#, c-format
-msgid "Scanning included file: %s"
-msgstr "ทjดMคคJภษฎื: %s"
-
-#: ../search.c:4216
-#, fuzzy, c-format
-msgid "Searching included file %s"
-msgstr "ทjดMคคJภษฎื: %s"
-
-#: ../search.c:4405
-msgid "E387: Match is on current line"
-msgstr "E387: ฅุซeฉาฆbฆๆคคฆณค@ควฐt"
-
-#: ../search.c:4517
-msgid "All included files were found"
-msgstr "ฉาฆณคคJภษฎืณฃคwงไจ์"
-
-#: ../search.c:4519
-msgid "No included files"
-msgstr "จSฆณคคJภษฎื"
-
-#: ../search.c:4527
-msgid "E388: Couldn't find definition"
-msgstr "E388: งไคฃจ์ฉwธq"
-
-#: ../search.c:4529
-msgid "E389: Couldn't find pattern"
-msgstr "E389: งไคฃจ์ pattern"
-
-#: ../search.c:4668
-#, fuzzy
-msgid "Substitute "
-msgstr "จ๚ฅNค@ฒี "
-
-#: ../search.c:4681
-#, c-format
-msgid ""
-"\n"
-"# Last %sSearch Pattern:\n"
-"~"
-msgstr ""
-
-#: ../spell.c:951
-#, fuzzy
-msgid "E759: Format error in spell file"
-msgstr "E297: ผศฆsภษผgคJฟ๙ป~"
-
-#: ../spell.c:952
-msgid "E758: Truncated spell file"
-msgstr ""
-
-#: ../spell.c:953
-#, c-format
-msgid "Trailing text in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:954
-#, c-format
-msgid "Affix name too long in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:955
-#, fuzzy
-msgid "E761: Format error in affix file FOL, LOW or UPP"
-msgstr "E431: Tag ภษ \"%s\" ฎๆฆกฟ๙ป~"
-
-#: ../spell.c:957
-msgid "E762: Character in FOL, LOW or UPP is out of range"
-msgstr ""
-
-#: ../spell.c:958
-msgid "Compressing word tree..."
-msgstr ""
-
-#: ../spell.c:1951
-msgid "E756: Spell checking is not enabled"
-msgstr ""
-
-#: ../spell.c:2249
-#, c-format
-msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
-msgstr ""
-
-#: ../spell.c:2473
-#, fuzzy, c-format
-msgid "Reading spell file \"%s\""
-msgstr "จฯฅฮผศฆsภษ \"%s\""
-
-#: ../spell.c:2496
-#, fuzzy
-msgid "E757: This does not look like a spell file"
-msgstr "E307: %s ฌฐ_จำคฃนณฌO Vim ผศฆsภษ"
-
-#: ../spell.c:2501
-msgid "E771: Old spell file, needs to be updated"
-msgstr ""
-
-#: ../spell.c:2504
-msgid "E772: Spell file is for newer version of Vim"
-msgstr ""
-
-#: ../spell.c:2602
-#, fuzzy
-msgid "E770: Unsupported section in spell file"
-msgstr "E297: ผศฆsภษผgคJฟ๙ป~"
-
-#: ../spell.c:3762
-#, fuzzy, c-format
-msgid "Warning: region %s not supported"
-msgstr "E519: คฃคไดฉธำฟ๏ถต"
-
-#: ../spell.c:4550
-#, fuzzy, c-format
-msgid "Reading affix file %s ..."
-msgstr "ทjดM tag ภษฎื \"%s\""
-
-#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140
-#, c-format
-msgid "Conversion failure for word in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:4630 ../spell.c:6170
-#, c-format
-msgid "Conversion in %s not supported: from %s to %s"
-msgstr ""
-
-#: ../spell.c:4642
-#, c-format
-msgid "Invalid value for FLAG in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:4655
-#, c-format
-msgid "FLAG after using flags in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:4723
-#, c-format
-msgid ""
-"Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line "
-"%d"
-msgstr ""
-
-#: ../spell.c:4731
-#, c-format
-msgid ""
-"Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line "
-"%d"
-msgstr ""
-
-#: ../spell.c:4747
-#, c-format
-msgid "Wrong COMPOUNDRULES value in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:4771
-#, c-format
-msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:4777
-#, c-format
-msgid "Wrong COMPOUNDMIN value in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:4783
-#, c-format
-msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:4795
-#, c-format
-msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:4847
-#, c-format
-msgid "Different combining flag in continued affix block in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:4850
-#, fuzzy, c-format
-msgid "Duplicate affix in %s line %d: %s"
-msgstr "E154: ผะลา(tag) \"%s\" ฆbภษฎื %s ธฬญซฝฦฅXฒ{ฆhฆธ"
-
-#: ../spell.c:4871
-#, c-format
-msgid ""
-"Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s "
-"line %d: %s"
-msgstr ""
-
-#: ../spell.c:4893
-#, c-format
-msgid "Expected Y or N in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:4968
-#, c-format
-msgid "Broken condition in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:5091
-#, c-format
-msgid "Expected REP(SAL) count in %s line %d"
-msgstr ""
-
-#: ../spell.c:5120
-#, c-format
-msgid "Expected MAP count in %s line %d"
-msgstr ""
-
-#: ../spell.c:5132
-#, c-format
-msgid "Duplicate character in MAP in %s line %d"
-msgstr ""
-
-#: ../spell.c:5176
-#, c-format
-msgid "Unrecognized or duplicate item in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:5197
-#, c-format
-msgid "Missing FOL/LOW/UPP line in %s"
-msgstr ""
-
-#: ../spell.c:5220
-msgid "COMPOUNDSYLMAX used without SYLLABLE"
-msgstr ""
-
-#: ../spell.c:5236
-#, fuzzy
-msgid "Too many postponed prefixes"
-msgstr "คำฆhฝsฟ่ฐัผฦ"
-
-#: ../spell.c:5238
-#, fuzzy
-msgid "Too many compound flags"
-msgstr "คำฆhฝsฟ่ฐัผฦ"
-
-#: ../spell.c:5240
-msgid "Too many postponed prefixes and/or compound flags"
-msgstr ""
-
-#: ../spell.c:5250
-#, c-format
-msgid "Missing SOFO%s line in %s"
-msgstr ""
-
-#: ../spell.c:5253
-#, c-format
-msgid "Both SAL and SOFO lines in %s"
-msgstr ""
-
-#: ../spell.c:5331
-#, c-format
-msgid "Flag is not a number in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:5334
-#, c-format
-msgid "Illegal flag in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:5493 ../spell.c:5501
-#, c-format
-msgid "%s value differs from what is used in another .aff file"
-msgstr ""
-
-#: ../spell.c:5602
-#, fuzzy, c-format
-msgid "Reading dictionary file %s ..."
-msgstr "ฑฝบหฆrจๅ: %s"
-
-#: ../spell.c:5611
-#, c-format
-msgid "E760: No word count in %s"
-msgstr ""
-
-#: ../spell.c:5669
-#, c-format
-msgid "line %6d, word %6d - %s"
-msgstr ""
-
-#: ../spell.c:5691
-#, fuzzy, c-format
-msgid "Duplicate word in %s line %d: %s"
-msgstr "จCค@ฆๆณฃงไคฃจ์: %s"
-
-#: ../spell.c:5694
-#, c-format
-msgid "First duplicate word in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:5746
-#, c-format
-msgid "%d duplicate word(s) in %s"
-msgstr ""
-
-#: ../spell.c:5748
-#, c-format
-msgid "Ignored %d word(s) with non-ASCII characters in %s"
-msgstr ""
-
-#: ../spell.c:6115
-#, fuzzy, c-format
-msgid "Reading word file %s ..."
-msgstr "ฑqผะทวฟ้คJลชจ๚..."
-
-#: ../spell.c:6155
-#, c-format
-msgid "Duplicate /encoding= line ignored in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:6159
-#, c-format
-msgid "/encoding= line after word ignored in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:6180
-#, c-format
-msgid "Duplicate /regions= line ignored in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:6185
-#, c-format
-msgid "Too many regions in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:6198
-#, c-format
-msgid "/ line ignored in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:6224
-#, fuzzy, c-format
-msgid "Invalid region nr in %s line %d: %s"
-msgstr "E573: คฃฅฟฝTชบฆ๘ชAพน id : %s"
-
-#: ../spell.c:6230
-#, c-format
-msgid "Unrecognized flags in %s line %d: %s"
-msgstr ""
-
-#: ../spell.c:6257
-#, c-format
-msgid "Ignored %d words with non-ASCII characters"
-msgstr ""
-
-#: ../spell.c:6656
-#, c-format
-msgid "Compressed %d of %d nodes; %d (%d%%) remaining"
-msgstr ""
-
-#: ../spell.c:7340
-msgid "Reading back spell file..."
-msgstr ""
-
-#. Go through the trie of good words, soundfold each word and add it to
-#. the soundfold trie.
-#: ../spell.c:7357
-msgid "Performing soundfolding..."
-msgstr ""
-
-#: ../spell.c:7368
-#, c-format
-msgid "Number of words after soundfolding: %<PRId64>"
-msgstr ""
-
-#: ../spell.c:7476
-#, c-format
-msgid "Total number of words: %d"
-msgstr ""
-
-#: ../spell.c:7655
-#, fuzzy, c-format
-msgid "Writing suggestion file %s ..."
-msgstr "ผgคJ viminfo ภษฎื \"%s\" คค"
-
-#: ../spell.c:7707 ../spell.c:7927
-#, c-format
-msgid "Estimated runtime memory use: %d bytes"
-msgstr ""
-
-#: ../spell.c:7820
-msgid "E751: Output file name must not have region name"
-msgstr ""
-
-#: ../spell.c:7822
-#, fuzzy
-msgid "E754: Only up to 8 regions supported"
-msgstr "E519: คฃคไดฉธำฟ๏ถต"
-
-#: ../spell.c:7846
-#, fuzzy, c-format
-msgid "E755: Invalid region in %s"
-msgstr "E15: คฃฅฟฝTชบนBบโฆก: %s"
-
-#: ../spell.c:7907
-msgid "Warning: both compounding and NOBREAK specified"
-msgstr ""
-
-#: ../spell.c:7920
-#, fuzzy, c-format
-msgid "Writing spell file %s ..."
-msgstr "ผgคJ viminfo ภษฎื \"%s\" คค"
-
-#: ../spell.c:7925
-msgid "Done!"
-msgstr ""
-
-#: ../spell.c:8034
-#, c-format
-msgid "E765: 'spellfile' does not have %<PRId64> entries"
-msgstr ""
-
-#: ../spell.c:8074
-#, c-format
-msgid "Word '%.*s' removed from %s"
-msgstr ""
-
-#: ../spell.c:8117
-#, c-format
-msgid "Word '%.*s' added to %s"
-msgstr ""
-
-#: ../spell.c:8381
-msgid "E763: Word characters differ between spell files"
-msgstr ""
-
-#: ../spell.c:8684
-msgid "Sorry, no suggestions"
-msgstr ""
-
-#: ../spell.c:8687
-#, fuzzy, c-format
-msgid "Sorry, only %<PRId64> suggestions"
-msgstr "กAฝdณ๒กG %<PRId64> ฆๆ "
-
-#. for when 'cmdheight' > 1
-#. avoid more prompt
-#: ../spell.c:8704
-#, fuzzy, c-format
-msgid "Change \"%.*s\" to:"
-msgstr "ฑNลฐสฆsภxฆ \"%.*s\"?"
-
-#: ../spell.c:8737
-#, c-format
-msgid " < \"%.*s\""
-msgstr ""
-
-#: ../spell.c:8882
-#, fuzzy
-msgid "E752: No previous spell replacement"
-msgstr "E35: จSฆณซeค@ญำทjดMซฅO"
-
-#: ../spell.c:8925
-#, fuzzy, c-format
-msgid "E753: Not found: %s"
-msgstr "E334: [ฟ๏ณๆ] งไคฃจ์ %s"
-
-#: ../spell.c:9276
-#, fuzzy, c-format
-msgid "E778: This does not look like a .sug file: %s"
-msgstr "E307: %s ฌฐ_จำคฃนณฌO Vim ผศฆsภษ"
-
-#: ../spell.c:9282
-#, c-format
-msgid "E779: Old .sug file, needs to be updated: %s"
-msgstr ""
-
-#: ../spell.c:9286
-#, c-format
-msgid "E780: .sug file is for newer version of Vim: %s"
-msgstr ""
-
-#: ../spell.c:9295
-#, c-format
-msgid "E781: .sug file doesn't match .spl file: %s"
-msgstr ""
-
-#: ../spell.c:9305
-#, fuzzy, c-format
-msgid "E782: error while reading .sug file: %s"
-msgstr "E47: ลชจ๚ฟ๙ป~ภษฎืฅขฑั"
-
-#. This should have been checked when generating the .spl
-#. file.
-#: ../spell.c:11575
-msgid "E783: duplicate char in MAP entry"
-msgstr ""
-
-#: ../syntax.c:266
-msgid "No Syntax items defined for this buffer"
-msgstr "ณoญำฝwฝฤฐฯจSฆณฉwธqฅ๔ฆ๓ปyชk"
-
-#: ../syntax.c:3083 ../syntax.c:3104 ../syntax.c:3127
-#, c-format
-msgid "E390: Illegal argument: %s"
-msgstr "E390: ฐัผฦคฃฅฟฝT: %s"
-
-#: ../syntax.c:3299
-#, c-format
-msgid "E391: No such syntax cluster: %s"
-msgstr "E391: ตLฆน syntax cluster: \"%s\""
-
-#: ../syntax.c:3433
-msgid "syncing on C-style comments"
-msgstr "Cปyจฅฆกต๙ธัฆPจBคฦคค"
-
-#: ../syntax.c:3439
-msgid "no syncing"
-msgstr "จSฆณฆPจBคฦ"
-
-#: ../syntax.c:3441
-msgid "syncing starts "
-msgstr "ฆPจBคฦถ}ฉl"
-
-#: ../syntax.c:3443 ../syntax.c:3506
-msgid " lines before top line"
-msgstr "ฆๆธนถWฅXฝdณ๒"
-
-#: ../syntax.c:3448
-msgid ""
-"\n"
-"--- Syntax sync items ---"
-msgstr ""
-"\n"
-"--- ปyชkฆPจBชซฅ๓ (Syntax sync items) ---"
-
-#: ../syntax.c:3452
-msgid ""
-"\n"
-"syncing on items"
-msgstr ""
-"\n"
-"ฆPจBคฦคค:"
-
-#: ../syntax.c:3457
-msgid ""
-"\n"
-"--- Syntax items ---"
-msgstr ""
-"\n"
-"--- ปyชkถตฅุ ---"
-
-#: ../syntax.c:3475
-#, c-format
-msgid "E392: No such syntax cluster: %s"
-msgstr "E392: ตLฆน syntax cluster: \"%s\""
-
-#: ../syntax.c:3497
-msgid "minimal "
-msgstr "ณฬคp"
-
-#: ../syntax.c:3503
-msgid "maximal "
-msgstr "ณฬคj"
-
-#: ../syntax.c:3513
-msgid "; match "
-msgstr "; ฒลฆX "
-
-#: ../syntax.c:3515
-msgid " line breaks"
-msgstr "ย_ฆๆ "
-
-#: ../syntax.c:4076
-msgid "E395: contains argument not accepted here"
-msgstr "E395: จฯฅฮคFคฃฅฟฝTชบฐัผฦ"
-
-#: ../syntax.c:4096
-#, fuzzy
-msgid "E844: invalid cchar value"
-msgstr "E474: คฃฅฟฝTชบฐัผฦ"
-
-#: ../syntax.c:4107
-msgid "E393: group[t]here not accepted here"
-msgstr "E393: จฯฅฮคFคฃฅฟฝTชบฐัผฦ"
-
-#: ../syntax.c:4126
-#, c-format
-msgid "E394: Didn't find region item for %s"
-msgstr "E394: งไคฃจ์ %s ชบ region item"
-
-#: ../syntax.c:4188
-msgid "E397: Filename required"
-msgstr "E397: ปญnภษฎืฆWบู"
-
-#: ../syntax.c:4221
-#, fuzzy
-msgid "E847: Too many syntax includes"
-msgstr "E77: คำฆhภษฆW"
-
-#: ../syntax.c:4303
-#, fuzzy, c-format
-msgid "E789: Missing ']': %s"
-msgstr "E398: ฏสคึ \"=\": %s"
-
-#: ../syntax.c:4531
-#, c-format
-msgid "E398: Missing '=': %s"
-msgstr "E398: ฏสคึ \"=\": %s"
-
-#: ../syntax.c:4666
-#, c-format
-msgid "E399: Not enough arguments: syntax region %s"
-msgstr "E399: syntax region %s ชบคผฦคำคึ"
-
-#: ../syntax.c:4870
-#, fuzzy
-msgid "E848: Too many syntax clusters"
-msgstr "E391: ตLฆน syntax cluster: \"%s\""
-
-#: ../syntax.c:4954
-msgid "E400: No cluster specified"
-msgstr "E400: จSฆณซฉwชบฤฉส"
-
-#. end delimiter not found
-#: ../syntax.c:4986
-#, c-format
-msgid "E401: Pattern delimiter not found: %s"
-msgstr "E401: งไคฃจ์คภนjฒลธน: %s"
-
-#: ../syntax.c:5049
-#, c-format
-msgid "E402: Garbage after pattern: %s"
-msgstr "E402: '%s' ซแญฑชบชFฆ่ตLชkฟ๋รั"
-
-#: ../syntax.c:5120
-msgid "E403: syntax sync: line continuations pattern specified twice"
-msgstr "E403: ปyชkฆPจB: ณsฑตฆๆฒลธนณQซฉwคFจโฆธ"
-
-#: ../syntax.c:5169
-#, c-format
-msgid "E404: Illegal arguments: %s"
-msgstr "E404: ฐัผฦคฃฅฟฝT: %s"
-
-#: ../syntax.c:5217
-#, c-format
-msgid "E405: Missing equal sign: %s"
-msgstr "E405: ฏสคึฌตฅฒลธน: %s"
-
-#: ../syntax.c:5222
-#, c-format
-msgid "E406: Empty argument: %s"
-msgstr "E406: ชลฅีฐัผฦ: %s"
-
-#: ../syntax.c:5240
-#, c-format
-msgid "E407: %s not allowed here"
-msgstr "E407: %s คฃฏเฆbฆนฅXฒ{"
-
-#: ../syntax.c:5246
-#, c-format
-msgid "E408: %s must be first in contains list"
-msgstr "E408: %s ฅฒถทฌOฆCชํธฬชบฒฤค@ญำ"
-
-#: ../syntax.c:5304
-#, c-format
-msgid "E409: Unknown group name: %s"
-msgstr "E409: คฃฅฟฝTชบธsฒีฆWบู: %s"
-
-#: ../syntax.c:5512
-#, c-format
-msgid "E410: Invalid :syntax subcommand: %s"
-msgstr "E410: คฃฅฟฝTชบ :syntax คlฉRฅO: %s"
-
-#: ../syntax.c:5854
-msgid ""
-" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
-msgstr ""
-
-#: ../syntax.c:6146
-msgid "E679: recursive loop loading syncolor.vim"
-msgstr ""
-
-#: ../syntax.c:6256
-#, c-format
-msgid "E411: highlight group not found: %s"
-msgstr "E411: งไคฃจ์ highlight group: %s"
-
-#: ../syntax.c:6278
-#, c-format
-msgid "E412: Not enough arguments: \":highlight link %s\""
-msgstr "E412: ฐัผฦคำคึ: \":highlight link %s\""
-
-#: ../syntax.c:6284
-#, c-format
-msgid "E413: Too many arguments: \":highlight link %s\""
-msgstr "E413: ฐัผฦนLฆh: \":highlight link %s\""
-
-#: ../syntax.c:6302
-msgid "E414: group has settings, highlight link ignored"
-msgstr "E414: คwณ]ฉwธsฒี, ฉฟฒค highlight link"
-
-#: ../syntax.c:6367
-#, c-format
-msgid "E415: unexpected equal sign: %s"
-msgstr "E415: คฃธำฆณชบตฅธน: %s"
-
-#: ../syntax.c:6395
-#, c-format
-msgid "E416: missing equal sign: %s"
-msgstr "E416: ฏสคึฌตฅฒลธน: %s"
-
-#: ../syntax.c:6418
-#, c-format
-msgid "E417: missing argument: %s"
-msgstr "E417: ฏสคึฐัผฦ: %s"
-
-#: ../syntax.c:6446
-#, c-format
-msgid "E418: Illegal value: %s"
-msgstr "E418: คฃฆXชkชบญศ: %s"
-
-#: ../syntax.c:6496
-msgid "E419: FG color unknown"
-msgstr "E419: ฟ๙ป~ชบซeดบรCฆโ"
-
-#: ../syntax.c:6504
-msgid "E420: BG color unknown"
-msgstr "E420: ฟ๙ป~ชบญIดบรCฆโ"
-
-#: ../syntax.c:6564
-#, c-format
-msgid "E421: Color name or number not recognized: %s"
-msgstr "E421: ฟ๙ป~ชบรCฆโฆWบูฉฮผฦญศ: %s"
-
-#: ../syntax.c:6714
-#, c-format
-msgid "E422: terminal code too long: %s"
-msgstr "E422: ฒืบพ๗ฝXคำช๘: %s"
-
-#: ../syntax.c:6753
-#, c-format
-msgid "E423: Illegal argument: %s"
-msgstr "E423: ฐัผฦคฃฅฟฝT: %s"
-
-#: ../syntax.c:6925
-msgid "E424: Too many different highlighting attributes in use"
-msgstr "E424: จฯฅฮคFนLฆhฌฒงชบฐชซGซืฤฉส"
-
-#: ../syntax.c:7427
-msgid "E669: Unprintable character in group name"
-msgstr "E669: ธsฒีฆWบูคคฆณตLชkฆCฆLชบฆrคธ"
-
-#: ../syntax.c:7434
-msgid "W18: Invalid character in group name"
-msgstr "W18: ธsฒีฆWบูคคฆณคฃฅฟฝTชบฆrคธ"
-
-#: ../syntax.c:7448
-msgid "E849: Too many highlight and syntax groups"
-msgstr ""
-
-#: ../tag.c:104
-msgid "E555: at bottom of tag stack"
-msgstr "E555: ผะลา(tag)ฐ๏ล|ตฒงภ"
-
-#: ../tag.c:105
-msgid "E556: at top of tag stack"
-msgstr "E556: ผะลา(tag)ฐ๏ล|ถ}ภY"
-
-#: ../tag.c:380
-msgid "E425: Cannot go before first matching tag"
-msgstr "E425: คwธgฆbณฬซeญฑชบผะลา(tag)คF"
-
-#: ../tag.c:504
-#, c-format
-msgid "E426: tag not found: %s"
-msgstr "E426: งไคฃจ์ผะลา(tag): %s"
-
-#: ../tag.c:528
-msgid " # pri kind tag"
-msgstr " # pri kind tag"
-
-#: ../tag.c:531
-msgid "file\n"
-msgstr "ภษฎื\n"
-
-#: ../tag.c:829
-msgid "E427: There is only one matching tag"
-msgstr "E427: ฅuฆณฆนถตฒลฆX"
-
-#: ../tag.c:831
-msgid "E428: Cannot go beyond last matching tag"
-msgstr "E428: คvธgฆbณฬซแค@ญำฒลฆXชบ tag คF"
-
-#: ../tag.c:850
-#, c-format
-msgid "File \"%s\" does not exist"
-msgstr "ภษฎื \"%s\" คฃฆsฆb"
-
-#. Give an indication of the number of matching tags
-#: ../tag.c:859
-#, c-format
-msgid "tag %d of %d%s"
-msgstr "งไจ์ tag: %d/%d%s"
-
-#: ../tag.c:862
-msgid " or more"
-msgstr " ฉฮง๓ฆh"
-
-#: ../tag.c:864
-msgid " Using tag with different case!"
-msgstr " ฅHคฃฆPคjคpผgจำจฯฅฮ tag!"
-
-#: ../tag.c:909
-#, c-format
-msgid "E429: File \"%s\" does not exist"
-msgstr "E429: ภษฎื \"%s\" คฃฆsฆb"
-
-#. Highlight title
-#: ../tag.c:960
-msgid ""
-"\n"
-" # TO tag FROM line in file/text"
-msgstr ""
-"\n"
-" # จ์ tag ฑq ฆๆ ฆb ภษฎื/คๅฆr"
-
-#: ../tag.c:1303
-#, c-format
-msgid "Searching tags file %s"
-msgstr "ทjดM tag ภษฎื \"%s\""
-
-#: ../tag.c:1545
-msgid "Ignoring long line in tags file"
-msgstr ""
-
-#: ../tag.c:1915
-#, c-format
-msgid "E431: Format error in tags file \"%s\""
-msgstr "E431: Tag ภษ \"%s\" ฎๆฆกฟ๙ป~"
-
-#: ../tag.c:1917
-#, c-format
-msgid "Before byte %<PRId64>"
-msgstr "ฆb %<PRId64> ฆ์คธคงซe"
-
-#: ../tag.c:1929
-#, c-format
-msgid "E432: Tags file not sorted: %s"
-msgstr "E432: Tag ภษฎืฅผฑฦงว: %s"
-
-#. never opened any tags file
-#: ../tag.c:1960
-msgid "E433: No tags file"
-msgstr "E433: จSฆณ tag ภษ"
-
-#: ../tag.c:2536
-msgid "E434: Can't find tag pattern"
-msgstr "E434: งไคฃจ์ tag"
-
-#: ../tag.c:2544
-msgid "E435: Couldn't find tag, just guessing!"
-msgstr "E435: งไคฃจ์ tag, ฅฮฒqชบ!"
-
-#: ../tag.c:2797
-#, c-format
-msgid "Duplicate field name: %s"
-msgstr ""
-
-#: ../term.c:1442
-msgid "' not known. Available builtin terminals are:"
-msgstr "' ตLชkธคJกCฅiฅฮชบคบซุฒืบพ๗งฮฆกฆณ:"
-
-#: ../term.c:1463
-msgid "defaulting to '"
-msgstr "นwณ]: '"
-
-#: ../term.c:1731
-msgid "E557: Cannot open termcap file"
-msgstr "E557: ตLชkถ}ฑา termcap ภษฎื"
-
-#: ../term.c:1735
-msgid "E558: Terminal entry not found in terminfo"
-msgstr "E558: terminfo คคจSฆณฒืบพ๗ธ๊ฎฦถต"
-
-#: ../term.c:1737
-msgid "E559: Terminal entry not found in termcap"
-msgstr "E559: termcap คคจSฆณฒืบพ๗ธ๊ฎฦถต"
-
-#: ../term.c:1878
-#, c-format
-msgid "E436: No \"%s\" entry in termcap"
-msgstr "E436: termcap จSฆณ \"%s\" entry"
-
-#: ../term.c:2249
-msgid "E437: terminal capability \"cm\" required"
-msgstr "E437: ฒืบพ๗ปญn \"cm\" ชบฏเคO"
-
-#. Highlight title
-#: ../term.c:4376
-msgid ""
-"\n"
-"--- Terminal keys ---"
-msgstr ""
-"\n"
-"--- ฒืบพ๗ซ๖มไ ---"
-
-#: ../ui.c:481
-msgid "Vim: Error reading input, exiting...\n"
-msgstr "Vim: ลชจ๚ฟ้คJฟ๙ป~กAย๗ถ}คค...\n"
-
-#. This happens when the FileChangedRO autocommand changes the
-#. * file in a way it becomes shorter.
-#: ../undo.c:379
-msgid "E881: Line count changed unexpectedly"
-msgstr ""
-
-#: ../undo.c:627
-#, fuzzy, c-format
-msgid "E828: Cannot open undo file for writing: %s"
-msgstr "E212: ตLชkฅHผgคJผาฆกถ}ฑา"
-
-#: ../undo.c:717
-#, c-format
-msgid "E825: Corrupted undo file (%s): %s"
-msgstr ""
-
-#: ../undo.c:1039
-msgid "Cannot write undo file in any directory in 'undodir'"
-msgstr ""
-
-#: ../undo.c:1074
-#, c-format
-msgid "Will not overwrite with undo file, cannot read: %s"
-msgstr ""
-
-#: ../undo.c:1092
-#, c-format
-msgid "Will not overwrite, this is not an undo file: %s"
-msgstr ""
-
-#: ../undo.c:1108
-msgid "Skipping undo file write, nothing to undo"
-msgstr ""
-
-#: ../undo.c:1121
-#, fuzzy, c-format
-msgid "Writing undo file: %s"
-msgstr "ผgคJ viminfo ภษฎื \"%s\" คค"
-
-#: ../undo.c:1213
-#, fuzzy, c-format
-msgid "E829: write error in undo file: %s"
-msgstr "E297: ผศฆsภษผgคJฟ๙ป~"
-
-#: ../undo.c:1280
-#, c-format
-msgid "Not reading undo file, owner differs: %s"
-msgstr ""
-
-#: ../undo.c:1292
-#, fuzzy, c-format
-msgid "Reading undo file: %s"
-msgstr "ลชจ๚ viminfo ภษฎื \"%s\"%s%s%s"
-
-#: ../undo.c:1299
-#, fuzzy, c-format
-msgid "E822: Cannot open undo file for reading: %s"
-msgstr "E195: ตLชkลชจ๚ viminfo"
-
-#: ../undo.c:1308
-#, fuzzy, c-format
-msgid "E823: Not an undo file: %s"
-msgstr "E484: ตLชkถ}ฑาภษฎื %s"
-
-#: ../undo.c:1313
-#, fuzzy, c-format
-msgid "E824: Incompatible undo file: %s"
-msgstr "E484: ตLชkถ}ฑาภษฎื %s"
-
-#: ../undo.c:1328
-msgid "File contents changed, cannot use undo info"
-msgstr ""
-
-#: ../undo.c:1497
-#, fuzzy, c-format
-msgid "Finished reading undo file %s"
-msgstr "ตฒง๔ฐ๕ฆๆ %s"
-
-#: ../undo.c:1586 ../undo.c:1812
-msgid "Already at oldest change"
-msgstr ""
-
-#: ../undo.c:1597 ../undo.c:1814
-msgid "Already at newest change"
-msgstr ""
-
-#: ../undo.c:1806
-#, fuzzy, c-format
-msgid "E830: Undo number %<PRId64> not found"
-msgstr "E92: งไคฃจ์ฒฤ %<PRId64> ญำฝwฝฤฐฯ"
-
-#: ../undo.c:1979
-msgid "E438: u_undo: line numbers wrong"
-msgstr "E438: u_undo: ฆๆธนฟ๙ป~"
-
-#: ../undo.c:2183
-#, fuzzy
-msgid "more line"
-msgstr "มูฆณค@ฆๆ "
-
-#: ../undo.c:2185
-#, fuzzy
-msgid "more lines"
-msgstr "มูฆณค@ฆๆ "
-
-#: ../undo.c:2187
-#, fuzzy
-msgid "line less"
-msgstr "คึฉ๓ค@ฆๆ "
-
-#: ../undo.c:2189
-#, fuzzy
-msgid "fewer lines"
-msgstr "ฅuณั %<PRId64> ฆๆ "
-
-#: ../undo.c:2193
-#, fuzzy
-msgid "change"
-msgstr "ค@ถตง๏ล"
-
-#: ../undo.c:2195
-#, fuzzy
-msgid "changes"
-msgstr "ค@ถตง๏ล"
-
-#: ../undo.c:2225
-#, fuzzy, c-format
-msgid "%<PRId64> %s; %s #%<PRId64> %s"
-msgstr "%<PRId64> ฆๆ %s นL %d ฆธ"
-
-#: ../undo.c:2228
-msgid "before"
-msgstr ""
-
-#: ../undo.c:2228
-msgid "after"
-msgstr ""
-
-#: ../undo.c:2325
-#, fuzzy
-msgid "Nothing to undo"
-msgstr "จSฆณณoญำ mapping น๏ภณ"
-
-#: ../undo.c:2330
-msgid "number changes when saved"
-msgstr ""
-
-#: ../undo.c:2360
-#, fuzzy, c-format
-msgid "%<PRId64> seconds ago"
-msgstr "%<PRId64> ฤๆ; "
-
-#: ../undo.c:2372
-#, fuzzy
-msgid "E790: undojoin is not allowed after undo"
-msgstr "E407: %s คฃฏเฆbฆนฅXฒ{"
-
-#: ../undo.c:2466
-msgid "E439: undo list corrupt"
-msgstr "E439: ด_ญ์ฆCชํทlรa"
-
-#: ../undo.c:2495
-msgid "E440: undo line missing"
-msgstr "E440: งไคฃจ์ญn undo ชบฆๆ "
-
-#: ../version.c:600
-msgid ""
-"\n"
-"Included patches: "
-msgstr ""
-"\n"
-"คคJญืฅฟ: "
-
-#: ../version.c:627
-#, fuzzy
-msgid ""
-"\n"
-"Extra patches: "
-msgstr "ฅ~ณกฒลฆX:\n"
-
-#: ../version.c:639 ../version.c:864
-msgid "Modified by "
-msgstr "ญืง๏ชฬฌฐ"
-
-#: ../version.c:646
-msgid ""
-"\n"
-"Compiled "
-msgstr ""
-"\n"
-"ฝsฤถ"
-
-#: ../version.c:649
-msgid "by "
-msgstr "ชฬ:"
-
-#: ../version.c:660
-msgid ""
-"\n"
-"Huge version "
-msgstr ""
-"\n"
-"ถWฑjชฉฅป "
-
-#: ../version.c:661
-msgid "without GUI."
-msgstr "คฃจฯฅฮนฯซฌฌษญฑกC"
-
-#: ../version.c:662
-msgid " Features included (+) or not (-):\n"
-msgstr " ฅุซeฅiจฯฅฮ(+)ปPคฃฅiจฯฅฮ(-)ชบผาฒีฆCชํ:\n"
-
-#: ../version.c:667
-msgid " system vimrc file: \""
-msgstr " จtฒฮ vimrc ณ]ฉwภษ: \""
-
-#: ../version.c:672
-msgid " user vimrc file: \""
-msgstr " จฯฅฮชฬญำคH vimrc ณ]ฉwภษ: \""
-
-#: ../version.c:677
-msgid " 2nd user vimrc file: \""
-msgstr " ฒฤคGฒีญำคH vimrc ภษฎื: \""
-
-#: ../version.c:682
-msgid " 3rd user vimrc file: \""
-msgstr " ฒฤคTฒีญำคH vimrc ภษฎื: \""
-
-#: ../version.c:687
-msgid " user exrc file: \""
-msgstr " จฯฅฮชฬญำคH exrc ณ]ฉwภษ: \""
-
-#: ../version.c:692
-msgid " 2nd user exrc file: \""
-msgstr " ฒฤคGฒีจฯฅฮชฬ exrc ภษฎื: \""
-
-#: ../version.c:699
-msgid " fall-back for $VIM: \""
-msgstr " $VIM นwณ]ญศ: \""
-
-#: ../version.c:705
-msgid " f-b for $VIMRUNTIME: \""
-msgstr " $VIMRUNTIME นwณ]ญศ: \""
-
-#: ../version.c:709
-msgid "Compilation: "
-msgstr "ฝsฤถค่ฆก: "
-
-#: ../version.c:712
-msgid "Linking: "
-msgstr "ร์ตฒค่ฆก: "
-
-#: ../version.c:717
-msgid " DEBUG BUILD"
-msgstr " ฐฃฟ๙ชฉฅป"
-
-#: ../version.c:767
-msgid "VIM - Vi IMproved"
-msgstr "VIM - Vi IMproved"
-
-#: ../version.c:769
-msgid "version "
-msgstr "ชฉฅป "
-
-#: ../version.c:770
-msgid "by Bram Moolenaar et al."
-msgstr "บ๛ล@ชฬ: Bram Moolenaar et al."
-
-#: ../version.c:774
-msgid "Vim is open source and freely distributable"
-msgstr "Vim ฌฐฅiฆฅัดฒงGชบถ}ฉ๑ญ์ฉlฝXณnล้"
-
-#: ../version.c:776
-msgid "Help poor children in Uganda!"
-msgstr "ฝะภฐงUฏQคzนFชบฅiผฆซฤตฃ!"
-
-#: ../version.c:777
-msgid "type :help iccf<Enter> for information "
-msgstr "ถiค@จBปกฉ๚ฝะฟ้คJ :help iccf<Enter>"
-
-#: ../version.c:779
-msgid "type :q<Enter> to exit "
-msgstr "ญnย๗ถ}ฝะฟ้คJ :q<Enter> "
-
-#: ../version.c:780
-msgid "type :help<Enter> or <F1> for on-line help"
-msgstr "ฝuคWปกฉ๚ฝะฟ้คJ :help<Enter> "
-
-#: ../version.c:781
-msgid "type :help version7<Enter> for version info"
-msgstr "ทsชฉฅปธ๊ฐTฝะฟ้คJ :help version7<Enter>"
-
-#: ../version.c:784
-msgid "Running in Vi compatible mode"
-msgstr "Vi ฌฎeผาฆก"
-
-#: ../version.c:785
-msgid "type :set nocp<Enter> for Vim defaults"
-msgstr "ฆpชGญnงนฅผาภภถวฒฮ Vi ฝะฟ้คJ :set nocp<Enter>"
-
-#: ../version.c:786
-msgid "type :help cp-default<Enter> for info on this"
-msgstr "ฆpชGปญnน๏ Vi ฌฎeผาฆกชบถiค@จBปกฉ๚ฝะฟ้คJ :help cp-default<Enter>"
-
-#: ../version.c:827
-msgid "Sponsor Vim development!"
-msgstr "รูงU Vim ชบถ}ตoปPฆจช๘กI"
-
-#: ../version.c:828
-msgid "Become a registered Vim user!"
-msgstr "ฆจฌฐ Vim ชบต๙ฅUจฯฅฮชฬกI"
-
-#: ../version.c:831
-msgid "type :help sponsor<Enter> for information "
-msgstr "ธิฒำปกฉ๚ฝะฟ้คJ :help sponsor<Enter>"
-
-#: ../version.c:832
-msgid "type :help register<Enter> for information "
-msgstr "ธิฒำปกฉ๚ฝะฟ้คJ :help register<Enter> "
-
-#: ../version.c:834
-msgid "menu Help->Sponsor/Register for information "
-msgstr "ธิฒำปกฉ๚ฝะฟ๏จ๚ฟ๏ณๆชบ ปฒงUปกฉ๚->รูงU/ต๙ฅU "
-
-#: ../window.c:119
-msgid "Already only one window"
-msgstr "คwธgฅuณัค@ญำต๘ตกคF"
-
-#: ../window.c:224
-msgid "E441: There is no preview window"
-msgstr "E441: จSฆณนwฤต๘ตก"
-
-#: ../window.c:559
-msgid "E442: Can't split topleft and botright at the same time"
-msgstr "E442: คฃฏเฆPฎษคภณฮต๘ตกฌฐฅชคWฉMฅkคUจค"
-
-#: ../window.c:1228
-msgid "E443: Cannot rotate when another window is split"
-msgstr "E443: ฆณจไฅฆคภณฮต๘ตกฎษตLชkฑยเ"
-
-#: ../window.c:1803
-msgid "E444: Cannot close last window"
-msgstr "E444: คฃฏเร๖ณฌณฬซแค@ญำต๘ตก"
-
-#: ../window.c:1810
-#, fuzzy
-msgid "E813: Cannot close autocmd window"
-msgstr "E444: คฃฏเร๖ณฌณฬซแค@ญำต๘ตก"
-
-#: ../window.c:1814
-#, fuzzy
-msgid "E814: Cannot close window, only autocmd window would remain"
-msgstr "E444: คฃฏเร๖ณฌณฬซแค@ญำต๘ตก"
-
-#: ../window.c:2717
-msgid "E445: Other window contains changes"
-msgstr "E445: จไฅฆต๘ตกฆณง๓ฐสธ๊ฎฦ"
-
-#: ../window.c:4805
-msgid "E446: No file name under cursor"
-msgstr "E446: ดๅผะณBจSฆณภษฆW"
-
-#~ msgid "[Error List]"
-#~ msgstr "[ฟ๙ป~ฆCชํ]"
-
-#~ msgid "[No File]"
-#~ msgstr "[ฅผฉRฆW]"
-
-#~ msgid "Patch file"
-#~ msgstr "Patch ภษฎื"
-
-#~ msgid "E106: Unknown variable: \"%s\""
-#~ msgstr "E106: ฅผฉwธqชบลผฦ: \"%s\""
-
-#~ msgid ""
-#~ "&OK\n"
-#~ "&Cancel"
-#~ msgstr ""
-#~ "ฝTฉw(&O)\n"
-#~ "จ๚ฎ๘(&C)"
-
-#~ msgid "E240: No connection to Vim server"
-#~ msgstr "E240: จSฆณปP Vim Server ซุฅ฿ณsฝu"
-
-#~ msgid "E277: Unable to read a server reply"
-#~ msgstr "E277: ตLชkลชจ๚ฆ๘ชAพนชบฆ^ภณ"
-
-#~ msgid "E258: Unable to send to client"
-#~ msgstr "E258: ตLชkถวฐeจ์ client"
-
-#~ msgid "E241: Unable to send to %s"
-#~ msgstr "E241: ตLชkถวฐeจ์ %s"
-
-#~ msgid "E130: Undefined function: %s"
-#~ msgstr "E130: จ็ฆก %s ฉ|ฅผฉwธq"
-
-#~ msgid "Save As"
-#~ msgstr "ฅtฆsทsภษ"
-
-#~ msgid "Edit File"
-#~ msgstr "ฝsฟ่ภษฎื"
-
-#~ msgid " (NOT FOUND)"
-#~ msgstr " (งไคฃจ์) "
-
-#~ msgid "Source Vim script"
-#~ msgstr "ฐ๕ฆๆ Vim script"
-
-#~ msgid "Edit File in new window"
-#~ msgstr "ฆbทsต๘ตกฝsฟ่ภษฎื"
-
-#~ msgid "Append File"
-#~ msgstr "ชฅ[ภษฎื"
-
-#~ msgid "Window position: X %d, Y %d"
-#~ msgstr "ต๘ตกฆ์ธm: X %d, Y %d"
-
-#~ msgid "Save Redirection"
-#~ msgstr "ภxฆs Redirection"
-
-#~ msgid "Save View"
-#~ msgstr "ภxฆs View"
-
-#~ msgid "Save Session"
-#~ msgstr "ภxฆs Session"
-
-#~ msgid "Save Setup"
-#~ msgstr "ภxฆsณ]ฉw"
-
-#~ msgid "E196: No digraphs in this version"
-#~ msgstr "E196: ฅปชฉฅปตLฝฦฆXฆrคธ(digraph)"
-
-#~ msgid "[NL found]"
-#~ msgstr "[งไจ์NL]"
-
-#~ msgid "[crypted]"
-#~ msgstr "[คwฅ[ฑK]"
-
-#~ msgid "[CONVERSION ERROR]"
-#~ msgstr "ยเดซฟ๙ป~"
-
-#~ msgid "NetBeans disallows writes of unmodified buffers"
-#~ msgstr "NetBeans คฃฏเผgฅXฅผญืง๏ชบฝwฝฤฐฯ"
-
-#~ msgid "Partial writes disallowed for NetBeans buffers"
-#~ msgstr "ณกฅ๗คบฎeตLชkผgคJ Netbeans ฝwฝฤฐฯ"
-
-#~ msgid "E460: The resource fork would be lost (add ! to override)"
-#~ msgstr "E460: Resource fork ท|ฎ๘ฅข (ฝะจฯฅฮ ! ฑjจ๎ฐ๕ฆๆ)"
-
-#~ msgid "E229: Cannot start the GUI"
-#~ msgstr "E229: ตLชkฑาฐสนฯซฌฌษญฑ"
-
-#~ msgid "E230: Cannot read from \"%s\""
-#~ msgstr "E230: ตLชkลชจ๚ภษฎื \"%s\""
-
-#~ msgid "E665: Cannot start GUI, no valid font found"
-#~ msgstr "E665: ตLชkฑาฐสนฯซฌฌษญฑกAงไคฃจ์ฅiฅฮชบฆrซฌ"
-
-#~ msgid "E231: 'guifontwide' invalid"
-#~ msgstr "E231: คฃฅฟฝTชบ 'guifontwide'"
-
-#~ msgid "E599: Value of 'imactivatekey' is invalid"
-#~ msgstr "E599: 'imactivatekey' ชบญศคฃฅฟฝT"
-
-#~ msgid "E254: Cannot allocate color %s"
-#~ msgstr "E254: คฃฏเฐtธmรCฆโ %s"
-
-#~ msgid "<cannot open> "
-#~ msgstr "<คฃฏเถ}ฑา>"
-
-#~ msgid "E616: vim_SelFile: can't get font %s"
-#~ msgstr "E616: vim_SelFile: คฃฏเจฯฅฮ %s ฆrซฌ"
-
-#~ msgid "E614: vim_SelFile: can't return to current directory"
-#~ msgstr "E614: vim_SelFile: ตLชkฆ^จ์ฅุซeฅุฟ"
-
-#~ msgid "Pathname:"
-#~ msgstr "ธ๔ฎ|:"
-
-#~ msgid "E615: vim_SelFile: can't get current directory"
-#~ msgstr "E615: vim_SelFile: ตLชkจ๚ฑoฅุซeฅุฟ"
-
-#~ msgid "OK"
-#~ msgstr "ฝTฉw"
-
-#~ msgid "Cancel"
-#~ msgstr "จ๚ฎ๘"
-
-#~ msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
-#~ msgstr "ฑฒฐสถb: คฃฏเณ]ฉw thumb pixmap ชบฆ์ธm"
-
-#~ msgid "Vim dialog"
-#~ msgstr "Vim น๏ธฒฐ"
-
-#~ msgid "E232: Cannot create BalloonEval with both message and callback"
-#~ msgstr "E232: คฃฏเน๏ฐTฎงปP callback ซุฅ฿ BallonEval"
-
-#~ msgid "Vim dialog..."
-#~ msgstr "Vim น๏ธฒฐ..."
-
-#~ msgid "Input _Methods"
-#~ msgstr "ฟ้คJชk"
-
-#~ msgid "VIM - Search and Replace..."
-#~ msgstr "VIM - ดMงไปPจ๚ฅN..."
-
-#~ msgid "VIM - Search..."
-#~ msgstr "VIM - ดMงไ..."
-
-#~ msgid "Find what:"
-#~ msgstr "ทjดM:"
-
-#~ msgid "Replace with:"
-#~ msgstr "จ๚ฅNฌฐ:"
-
-#~ msgid "Match whole word only"
-#~ msgstr "ฅuทjดMงนฅฌฆPชบฆr"
-
-#~ msgid "Match case"
-#~ msgstr "ฒลฆXคjคpผg"
-
-#~ msgid "Direction"
-#~ msgstr "ค่ฆV"
-
-#~ msgid "Up"
-#~ msgstr "ฆVคW"
-
-#~ msgid "Down"
-#~ msgstr "ฆVคU"
-
-#~ msgid "Find Next"
-#~ msgstr "งไคUค@ญำ"
-
-#~ msgid "Replace"
-#~ msgstr "จ๚ฅN"
-
-#~ msgid "Replace All"
-#~ msgstr "จ๚ฅNฅณก"
-
-#~ msgid "Vim: Received \"die\" request from session manager\n"
-#~ msgstr "Vim: ฅั Session บฒzญ๛ฆฌจ์ \"die\" ญnจD\n"
-
-#~ msgid "Vim: Main window unexpectedly destroyed\n"
-#~ msgstr "Vim: ฅDต๘ตกฤ๊ฑผ\n"
-
-#~ msgid "Font Selection"
-#~ msgstr "ฆrซฌฟ๏พ"
-
-#~ msgid "Used CUT_BUFFER0 instead of empty selection"
-#~ msgstr "จฯฅฮ CUT_BUFFER0 จำจ๚ฅNชลฟ๏พ"
-
-#~ msgid "Filter"
-#~ msgstr "นLยoพน"
-
-#~ msgid "Directories"
-#~ msgstr "ฅุฟ"
-
-#~ msgid "Help"
-#~ msgstr "ปฒงUปกฉ๚"
-
-#~ msgid "Files"
-#~ msgstr "ภษฎื"
-
-#~ msgid "Selection"
-#~ msgstr "ฟ๏พ"
-
-#~ msgid "Undo"
-#~ msgstr "ด_ญ์"
-
-#~ msgid "E671: Cannot find window title \"%s\""
-#~ msgstr "E671: งไคฃจ์ผะรDฌฐ \"%s\" ชบต๘ตก"
-
-#~ msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
-#~ msgstr "E243: คฃคไดฉฐัผฦ \"-%s\"กCฝะฅฮ OLE ชฉฅปกC"
-
-#~ msgid "E672: Unable to open window inside MDI application"
-#~ msgstr "E672: ตLชkฆb MDI ต{ฆกคคถ}ฑาต๘ตก"
-
-#~ msgid "Find string (use '\\\\' to find a '\\')"
-#~ msgstr "ทjดMฆrฆ๊ (จฯฅฮ '\\\\' จำชํฅ '\\')"
-
-#~ msgid "Find & Replace (use '\\\\' to find a '\\')"
-#~ msgstr "ทjดMคฮจ๚ฅNฆrฆ๊ (จฯฅฮ '\\\\' จำชํฅ '\\')"
-
-#~ msgid ""
-#~ "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
-#~ msgstr "Vim E458: ตLชkฐtธm color map ถตฅุกAฆณจวรCฆโฌฐ_จำท|ฉวฉวชบ"
-
-#~ msgid "E250: Fonts for the following charsets are missing in fontset %s:"
-#~ msgstr "E250: Fontset %s จSฆณณ]ฉwฅฟฝTชบฆrซฌฅHจัลใฅณoจวฆrคธถฐ:"
-
-#~ msgid "E252: Fontset name: %s"
-#~ msgstr "E252: ฆrซฌถฐ(Fontset)ฆWบู: %s"
-
-#~ msgid "Font '%s' is not fixed-width"
-#~ msgstr "'%s' คฃฌOฉTฉwผeซืฆrซฌ"
-
-#~ msgid "E253: Fontset name: %s\n"
-#~ msgstr "E253: ฆrซฌถฐ(Fontset)ฆWบู: %s\n"
-
-#~ msgid "Font0: %s\n"
-#~ msgstr "Font0: %s\n"
-
-#~ msgid "Font1: %s\n"
-#~ msgstr "Font1: %s\n"
-
-#~ msgid "Font%<PRId64> width is not twice that of font0\n"
-#~ msgstr "ฆrซฌ%<PRId64> ผeซืคฃฌO ฆrซฌ0 ชบจโญฟ\n"
-
-#~ msgid "Font0 width: %<PRId64>\n"
-#~ msgstr "ฆrซฌ0ชบผeซืกG%<PRId64>\n"
-
-#~ msgid ""
-#~ "Font1 width: %<PRId64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "ฆrซฌ1ผeซื: %<PRId64>\n"
-#~ "\n"
-
-#~ msgid "E256: Hangul automata ERROR"
-#~ msgstr "E256: Hangul automata ฟ๙ป~"
-
-#~ msgid "E563: stat error"
-#~ msgstr "E563: stat ฟ๙ป~"
-
-#~ msgid "E625: cannot open cscope database: %s"
-#~ msgstr "E625: ตLชkถ}ฑา cscope ธ๊ฎฦฎw %s"
-
-#~ msgid "E626: cannot get cscope database information"
-#~ msgstr "E626: ตLชkจ๚ฑo cscope ธ๊ฎฦฎwธ๊ฐT"
-
-#~ msgid "E569: maximum number of cscope connections reached"
-#~ msgstr "E569: คwนFจ์ cscope ณฬคjณsฝuผฦฅุ"
-
-#~ msgid ""
-#~ "E263: Sorry, this command is disabled, the Python library could not be "
-#~ "loaded."
-#~ msgstr "E263: ฉ๊บpกAณoญำฉRฅOตLชkจฯฅฮกAPython ต{ฆกฎwจSฆณธคJกC"
-
-#~ msgid "E659: Cannot invoke Python recursively"
-#~ msgstr "E659: ตLชkปผฐjฐ๕ฆๆ Python "
-
-#~ msgid "can't delete OutputObject attributes"
-#~ msgstr "ตLชkงRฐฃ OutputObject ฤฉส"
-
-#~ msgid "softspace must be an integer"
-#~ msgstr "softspace ฅฒปฌOพใผฦ"
-
-#~ msgid "invalid attribute"
-#~ msgstr "คฃฅฟฝTชบฤฉส"
-
-#~ msgid "writelines() requires list of strings"
-#~ msgstr "writelines() ปญn string list ทํฐัผฦ"
-
-#~ msgid "E264: Python: Error initialising I/O objects"
-#~ msgstr "E264: Python: ตLชkช์ฉl I/O ชซฅ๓"
-
-#~ msgid "invalid expression"
-#~ msgstr "คฃฅฟฝTชบนBบโฆก"
-
-#~ msgid "expressions disabled at compile time"
-#~ msgstr "ฆ]ฌฐฝsฤถฎษจSฆณฅ[คJนBบโฆก(expression)ชบต{ฆกฝXกAฉาฅHตLชkจฯฅฮนBบโฆก"
-
-#~ msgid "attempt to refer to deleted buffer"
-#~ msgstr "ธีนฯจฯฅฮคwณQงRฐฃชบ buffer"
-
-#~ msgid "line number out of range"
-#~ msgstr "ฆๆธนถWฅXฝdณ๒"
-
-#~ msgid "<buffer object (deleted) at %8lX>"
-#~ msgstr "<buffer ชซฅ๓ (คwงRฐฃ): %8lX>"
-
-#~ msgid "invalid mark name"
-#~ msgstr "ผะฐOฆWบูคฃฅฟฝT"
-
-#~ msgid "no such buffer"
-#~ msgstr "ตLฆน buffer"
-
-#~ msgid "attempt to refer to deleted window"
-#~ msgstr "ธีนฯจฯฅฮคwณQงRฐฃชบต๘ตก"
-
-#~ msgid "readonly attribute"
-#~ msgstr "ฐ฿ลชฤฉส"
-
-#~ msgid "cursor position outside buffer"
-#~ msgstr "ดๅผะฉwฆ์ฆbฝwฝฤฐฯคงฅ~"
-
-#~ msgid "<window object (deleted) at %.8lX>"
-#~ msgstr "<ต๘ตกชซฅ๓(คwงRฐฃ): %.8lX>"
-
-#~ msgid "<window object (unknown) at %.8lX>"
-#~ msgstr "<ต๘ตกชซฅ๓(ฅผชพ): %.8lX>"
-
-#~ msgid "<window %d>"
-#~ msgstr "<ต๘ตก %d>"
-
-#~ msgid "no such window"
-#~ msgstr "ตLฆนต๘ตก"
-
-#~ msgid "cannot save undo information"
-#~ msgstr "ตLชkภxฆsด_ญ์ธ๊ฐT"
-
-#~ msgid "cannot delete line"
-#~ msgstr "คฃฏเงRฐฃฆนฆๆ "
-
-#~ msgid "cannot replace line"
-#~ msgstr "คฃฏเดภฅNฆนฆๆ "
-
-#~ msgid "cannot insert line"
-#~ msgstr "คฃฏเดภฅNดกคJฆนฆๆ "
-
-#~ msgid "string cannot contain newlines"
-#~ msgstr "ฆrฆ๊ตLชkฅ]งtทsฆๆ "
-
-#~ msgid ""
-#~ "E266: Sorry, this command is disabled, the Ruby library could not be "
-#~ "loaded."
-#~ msgstr "E266: ฆนฉRฅOตLชkจฯฅฮกAตLชkธคJ Ruby ต{ฆกฎw(Library)"
-
-#~ msgid "E273: unknown longjmp status %d"
-#~ msgstr "E273: ฅผชพชบ longjmp status %d"
-
-#~ msgid "Toggle implementation/definition"
-#~ msgstr "คมดซน๊ง@/ฉwธq"
-
-#~ msgid "Show base class of"
-#~ msgstr "ลใฅ base class of:"
-
-#~ msgid "Show overridden member function"
-#~ msgstr "ลใฅณQ override ชบ member function"
-
-#~ msgid "Retrieve from file"
-#~ msgstr "ลชจ๚: ฑqภษฎื"
-
-#~ msgid "Retrieve from project"
-#~ msgstr "ลชจ๚: ฑqชซฅ๓"
-
-#~ msgid "Retrieve from all projects"
-#~ msgstr "ลชจ๚: ฑqฉาฆณ project"
-
-#~ msgid "Retrieve"
-#~ msgstr "ลชจ๚"
-
-#~ msgid "Show source of"
-#~ msgstr "ลใฅญ์ฉlฝX: "
-
-#~ msgid "Find symbol"
-#~ msgstr "ทjดM symbol"
-
-#~ msgid "Browse class"
-#~ msgstr "ยsฤ class"
-
-#~ msgid "Show class in hierarchy"
-#~ msgstr "ลใฅถฅผhฆกชบ class"
-
-#~ msgid "Show class in restricted hierarchy"
-#~ msgstr "ลใฅ restricted ถฅผhฆกชบ class"
-
-#~ msgid "Xref refers to"
-#~ msgstr "Xref ฐัฆาจ์"
-
-#~ msgid "Xref referred by"
-#~ msgstr "Xref ณQฝึฐัฆา:"
-
-#~ msgid "Xref has a"
-#~ msgstr "Xref ฆณ"
-
-#~ msgid "Xref used by"
-#~ msgstr "Xref ณQฝึจฯฅฮ:"
-
-#~ msgid "Show docu of"
-#~ msgstr "ลใฅคๅฅ๓: "
-
-#~ msgid "Generate docu for"
-#~ msgstr "ฒฃฅอคๅฅ๓: "
-
-#~ msgid ""
-#~ "Cannot connect to SNiFF+. Check environment (sniffemacs must be found in "
-#~ "$PATH).\n"
-#~ msgstr ""
-#~ "ตLชkณsฝuจ์ SNiFF+กCฝะภหฌdภ๔นาลผฦ ($PATH ธฬฅฒปฅiฅHงไจ์ sniffemacs)\n"
-
-#~ msgid "E274: Sniff: Error during read. Disconnected"
-#~ msgstr "E274: Sniff: ลชจ๚ฟ๙ป~. จ๚ฎ๘ณsฝu"
-
-#~ msgid "SNiFF+ is currently "
-#~ msgstr "SNiFF+ ฅุซe"
-
-#~ msgid "not "
-#~ msgstr "ฅผ"
-
-#~ msgid "connected"
-#~ msgstr "ณsฝuคค"
-
-#~ msgid "E275: Unknown SNiFF+ request: %s"
-#~ msgstr "E275: คฃฅฟฝTชบ SNiff+ ฉIฅs: %s"
-
-#~ msgid "E276: Error connecting to SNiFF+"
-#~ msgstr "E276: ณsฝuจ์ SNiFF+ ฅขฑั"
-
-#~ msgid "E278: SNiFF+ not connected"
-#~ msgstr "E278: ฅผณsฝuจ์ SNiFF+"
-
-#~ msgid "Sniff: Error during write. Disconnected"
-#~ msgstr "Sniff: ผgคJฟ๙ป~กCตฒง๔ณsฝu"
-
-#~ msgid "not implemented yet"
-#~ msgstr "ฉ|ฅผน๊ง@"
-
-#~ msgid "unknown option"
-#~ msgstr "คฃฅฟฝTชบฟ๏ถต"
-
-#~ msgid "cannot set line(s)"
-#~ msgstr "คฃฏเณ]ฉwฆๆ "
-
-#~ msgid "mark not set"
-#~ msgstr "จSฆณณ]ฉwผะฐO"
-
-#~ msgid "row %d column %d"
-#~ msgstr "ฆC %d ฆๆ %d"
-
-#~ msgid "cannot insert/append line"
-#~ msgstr "คฃฏเดกคJฉฮชฅ[ฆนฆๆ "
-
-#~ msgid "unknown flag: "
-#~ msgstr "ฟ๙ป~ชบบXผะ: "
-
-#~ msgid "unknown vimOption"
-#~ msgstr "คฃฅฟฝTชบ VIM ฟ๏ถต"
-
-#~ msgid "keyboard interrupt"
-#~ msgstr "มไฝLคคย_"
-
-#~ msgid "vim error"
-#~ msgstr "vim ฟ๙ป~"
-
-#~ msgid "cannot create buffer/window command: object is being deleted"
-#~ msgstr "ตLชkซุฅ฿ฝwฝฤฐฯ/ต๘ตกฉRฅO: ชซฅ๓ฑNท|ณQงRฐฃ"
-
-#~ msgid ""
-#~ "cannot register callback command: buffer/window is already being deleted"
-#~ msgstr "ตLชkต๙ฅU callback ฉRฅO: ฝwฝฤฐฯ/ต๘ตกคwธgณQงRฐฃคF"
-
-#~ msgid ""
-#~ "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-"
-#~ "dev@vim.org"
-#~ msgstr "E280: TCL ฤYญซฟ๙ป~: reflist ฤ๊ฑผคF!? ฝะณ๘งiตน to vim-dev@vim.org"
-
-#~ msgid "cannot register callback command: buffer/window reference not found"
-#~ msgstr "ตLชkต๙ฅU callback ฉRฅO: งไคฃจ์ฝwฝฤฐฯ/ต๘ตก"
-
-#~ msgid ""
-#~ "E571: Sorry, this command is disabled: the Tcl library could not be "
-#~ "loaded."
-#~ msgstr "E571: ฆนฉRฅOตLชkจฯฅฮ, ฆ]ฌฐตLชkธคJ Tcl ต{ฆกฎw(Library)"
-
-#~ msgid ""
-#~ "E281: TCL ERROR: exit code is not int!? Please report this to vim-dev@vim."
-#~ "org"
-#~ msgstr "E281: TCL ฟ๙ป~: ตฒง๔ฝXคฃฌOพใผฦ!? ฝะณ๘งiตน to vim-dev@vim.org"
-
-#~ msgid "cannot get line"
-#~ msgstr "คฃฏเจ๚ฑoฆนฆๆ "
-
-#~ msgid "Unable to register a command server name"
-#~ msgstr "ตLชkต๙ฅUฉRฅOฆ๘ชAพนฆWบู"
-
-#~ msgid "E248: Failed to send command to the destination program"
-#~ msgstr "E248: ตLชkฐeฅXฉRฅOจ์ฅุชบฆaต{ฆก"
-
-#~ msgid "E251: VIM instance registry property is badly formed. Deleted!"
-#~ msgstr "E251: VIM ชบ registry ณ]ฉwถตฆณป~กCคwงRฐฃกC"
-
-#~ msgid "This Vim was not compiled with the diff feature."
-#~ msgstr "ฑzชบ Vim ฝsฤถฎษจSฆณฅ[คJ diff ชบฏเคO"
-
-#~ msgid "-register\t\tRegister this gvim for OLE"
-#~ msgstr "-register\t\tต๙ฅU gvim จ์ OLE"
-
-#~ msgid "-unregister\t\tUnregister gvim for OLE"
-#~ msgstr "-unregister\t\tจ๚ฎ๘ OLE คคชบ gvim ต๙ฅU"
-
-#~ msgid "-g\t\t\tRun using GUI (like \"gvim\")"
-#~ msgstr "-g\t\t\tจฯฅฮนฯงฮฌษญฑ (ฆP \"gvim\")"
-
-#~ msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
-#~ msgstr "-f ฉฮ --nofork\tซeดบ: ฐ_ฉlนฯงฮฌษญฑฎษคฃ fork"
-
-#~ msgid "-V[N]\t\tVerbose level"
-#~ msgstr "-V[N]\t\tVerbose ตฅฏล"
-
-#~ msgid "-f\t\t\tDon't use newcli to open window"
-#~ msgstr "-f\t\t\tคฃจฯฅฮ newcli จำถ}ฑาต๘ตก"
-
-#~ msgid "-dev <device>\t\tUse <device> for I/O"
-#~ msgstr "-dev <device>\t\tจฯฅฮ <device> ฐตฟ้ฅXคJ"
-
-#~ msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
-#~ msgstr "-U <gvimrc>\t\tจฯฅฮ <gvimrc> จ๚ฅNฅ๔ฆ๓ .gvimrc"
-
-#~ msgid "-x\t\t\tEdit encrypted files"
-#~ msgstr "-x\t\t\tฝsฟ่ฝsฝXนLชบภษฎื"
-
-#~ msgid "-display <display>\tConnect vim to this particular X-server"
-#~ msgstr "-display <display>\tฑN vim ปPซฉwชบ X-server ณsฝu"
-
-#~ msgid "-X\t\t\tDo not connect to X server"
-#~ msgstr "-X\t\t\tคฃญnณsฝuจ์ X Server"
-
-#~ msgid "--remote <files>\tEdit <files> in a Vim server if possible"
-#~ msgstr "--remote <files>\tฝsฟ่ Vim ฆ๘ชAพนคWชบ <files> ซแย๗ถ}"
-
-#~ msgid "--remote-silent <files> Same, don't complain if there is no server"
-#~ msgstr "--remote-silent <files> ฌฆPกAฆจSฆณฆ๘ชAพนฎษคฃฤตงi"
-
-#~ msgid ""
-#~ "--remote-wait <files> As --remote but wait for files to have been edited"
-#~ msgstr "--remote-wait <files> ฆP --remote, ฆท|ตฅญิภษฎืงนฆจฝsฟ่"
-
-#~ msgid ""
-#~ "--remote-wait-silent <files> Same, don't complain if there is no server"
-#~ msgstr "--remote-wait-silent <files> ฌฆPกAฆจSฆ๘ชAพนฎษคฃฤตงi"
-
-#~ msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
-#~ msgstr "--remote-send <keys>\tฐeฅX <keys> จ์ Vim ฆ๘ชAพนจรย๗ถ}"
-
-#~ msgid ""
-#~ "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
-#~ msgstr "--remote-expr <expr>\tฆbฆ๘ชAพนคWฐ๕ฆๆ <expr> จรฆLฅXตฒชG"
-
-#~ msgid "--serverlist\t\tList available Vim server names and exit"
-#~ msgstr "--serverlist\t\tฆCฅXฅiฅฮชบ Vim ฆ๘ชAพนฆWบูจรย๗ถ}"
-
-#~ msgid "--servername <name>\tSend to/become the Vim server <name>"
-#~ msgstr "--servername <name>\tฐeฆ/ฆจฌฐ Vim ฆ๘ชAพน <name>"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Motif version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvim ป{ฑoชบฐัผฦ (Motif ชฉ):\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (neXtaw version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvim ป{ฑoชบฐัผฦ (neXtaw ชฉ):\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (Athena version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvim ป{ฑoชบฐัผฦ (Athena ชฉ):\n"
-
-#~ msgid "-display <display>\tRun vim on <display>"
-#~ msgstr "-display <display>\tฆbต๘ตก <display> ฐ๕ฆๆ vim"
-
-#~ msgid "-iconic\t\tStart vim iconified"
-#~ msgstr "-iconic\t\tฑาฐสซแนฯฅคฦ(iconified)"
-
-#~ msgid "-name <name>\t\tUse resource as if vim was <name>"
-#~ msgstr "-name <name>\t\tลชจ๚ Resource ฎษงโ vim ชบฆWบูต๘ฌฐ <name>"
-
-#~ msgid "\t\t\t (Unimplemented)\n"
-#~ msgstr "\t\t\t (ฉ|ฅผน๊ง@)\n"
-
-#~ msgid "-background <color>\tUse <color> for the background (also: -bg)"
-#~ msgstr "-background <color>\tณ]ฉw <color> ฌฐญIดบฆโ (ค]ฅiฅฮ -bg)"
-
-#~ msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
-#~ msgstr "-foreground <color>\tณ]ฉw <color> ฌฐค@ฏ๋คๅฆrรCฆโ (ค]ฅiฅฮ -fg)"
-
-#~ msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
-#~ msgstr "-font <font>\tจฯฅฮ <font> ฌฐค@ฏ๋ฆrซฌ (ค]ฅiฅฮ -fn)"
-
-#~ msgid "-boldfont <font>\tUse <font> for bold text"
-#~ msgstr "-boldfont <font>\tจฯฅฮ <font> ฌฐฒสล้ฆrซฌ"
-
-#~ msgid "-italicfont <font>\tUse <font> for italic text"
-#~ msgstr "-italicfont <font>\tจฯฅฮ <font> ฌฐฑืล้ฆrซฌ"
-
-#~ msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
-#~ msgstr "-geometry <geom>\tจฯฅฮ<geom>ฌฐฐ_ฉlฆ์ธm (ค]ฅiฅฮ -geom)"
-
-#~ msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
-#~ msgstr "-borderwidth <width>\tจฯฅฮผeซืฌฐ <width> ชบรไฎุ (ค]ฅiฅฮ -bw)"
-
-#~ msgid ""
-#~ "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
-#~ msgstr "-scrollbarwidth <width> ณ]ฉwฑฒฐสถbผeซืฌฐ <width> (ค]ฅiฅฮ -sw)"
-
-#~ msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
-#~ msgstr "-menuheight <height>\tณ]ฉwฟ๏ณๆฆCชบฐชซืฌฐ <height> (ค]ฅiฅฮ -mh)"
-
-#~ msgid "-reverse\t\tUse reverse video (also: -rv)"
-#~ msgstr "-reverse\t\tจฯฅฮคฯฌลใฅ (ค]ฅiฅฮ -rv)"
-
-#~ msgid "+reverse\t\tDon't use reverse video (also: +rv)"
-#~ msgstr "+reverse\t\tคฃจฯฅฮคฯฌลใฅ (ค]ฅiฅฮ +rv)"
-
-#~ msgid "-xrm <resource>\tSet the specified resource"
-#~ msgstr "-xrm <resource>\tณ]ฉwซฉwชบ resource"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (RISC OS version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvim ป{ฑoชบฐัผฦ (RISC OS ชฉ):\n"
-
-#~ msgid "--columns <number>\tInitial width of window in columns"
-#~ msgstr "--columns <number>\tต๘ตกช์ฉlคฦผeซื"
-
-#~ msgid "--rows <number>\tInitial height of window in rows"
-#~ msgstr "--rows <number>\tต๘ตกช์ฉlคฦฐชซื"
-
-#~ msgid ""
-#~ "\n"
-#~ "Arguments recognised by gvim (GTK+ version):\n"
-#~ msgstr ""
-#~ "\n"
-#~ "gvim ป{ฑoชบฐัผฦ (GTK+ ชฉ):\n"
-
-#~ msgid "-display <display>\tRun vim on <display> (also: --display)"
-#~ msgstr "-display <display>\tฆb <display> ฐ๕ฆๆ vim (ค]ฅiฅฮ --display)"
-
-#~ msgid "--role <role>\tSet a unique role to identify the main window"
-#~ msgstr "--role <role>\tณ]ฉwฟWฏSชบจคฆโ(role)ฅHฐฯคภฅDต๘ตก"
-
-#~ msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
-#~ msgstr "--socketid <xid>\tฆbฅtค@ญำ GTK widget คบถ}ฑา Vim"
-
-#~ msgid "-P <parent title>\tOpen Vim inside parent application"
-#~ msgstr "-P <parent title>\tฆbค๗ต{ฆกคคถ}ฑา Vim"
-
-#~ msgid "No display"
-#~ msgstr "ตLลใฅ"
-
-#~ msgid ": Send failed.\n"
-#~ msgstr ": ถวฐeฅขฑักC\n"
-
-#~ msgid ": Send failed. Trying to execute locally\n"
-#~ msgstr ": ฐeฅXฅขฑักCธีนฯฆbฅปฆaฐ๕ฆๆ\n"
-
-#~ msgid "%d of %d edited"
-#~ msgstr "คwฝsฟ่ %d/%d ญำภษฎื"
-
-#~ msgid "No display: Send expression failed.\n"
-#~ msgstr "ตL Display: ตLชkถวฐeนBบโฆกกC\n"
-
-#~ msgid ": Send expression failed.\n"
-#~ msgstr ": ตLชkถวฐeนBบโฆกกC\n"
-
-#~ msgid "E543: Not a valid codepage"
-#~ msgstr "E543: คฃฅฟฝTชบ codepage"
-
-#~ msgid "E285: Failed to create input context"
-#~ msgstr "E285: ตLชkซุฅ฿ input context"
-
-#~ msgid "E286: Failed to open input method"
-#~ msgstr "E286: ตLชkถ}ฑาฟ้คJชk"
-
-#~ msgid "E287: Warning: Could not set destroy callback to IM"
-#~ msgstr "E287: ฤตงi: ตLชkฒพฐฃ IM ชบ callback"
-
-#~ msgid "E288: input method doesn't support any style"
-#~ msgstr "E288: ฟ้คJชkคฃคไดฉฅ๔ฆ๓ style"
-
-#~ msgid "E289: input method doesn't support my preedit type"
-#~ msgstr "E289: ฟ้คJชkคฃคไดฉฅ๔ฆ๓ style"
-
-#~ msgid "E290: over-the-spot style requires fontset"
-#~ msgstr "E290: over-the-spot ปญnฆrซฌถฐ(Fontset)"
-
-#~ msgid "E291: Your GTK+ is older than 1.2.3. Status area disabled"
-#~ msgstr "E291: งAชบ GTK+ ค๑ 1.2.3 มูยยกCตLชkจฯฅฮชฌบAฐฯกC"
-
-#~ msgid "E292: Input Method Server is not running"
-#~ msgstr "E292: จSฆณฐ๕ฆๆคคชบฟ้คJชkบฒzต{ฆก(Input Method Server)"
-
-#~ msgid ""
-#~ "\n"
-#~ " [not usable with this version of Vim]"
-#~ msgstr ""
-#~ "\n"
-#~ " [ตLชkฆbฅปชฉฅปชบ Vim คWจฯฅฮ]"
-
-#~ msgid ""
-#~ "&Open Read-Only\n"
-#~ "&Edit anyway\n"
-#~ "&Recover\n"
-#~ "&Quit\n"
-#~ "&Abort\n"
-#~ "&Delete it"
-#~ msgstr ""
-#~ "ฅHฐ฿ลชค่ฆกถ}ฑา(&O)\n"
-#~ "ชฝฑตฝsฟ่(&E)\n"
-#~ "ญืด_(&R)\n"
-#~ "ย๗ถ}(&Q)\n"
-#~ "ธ๕ฅX(&A)\n"
-#~ "งRฐฃผศฆsภษ(&D)"
-
-#~ msgid "Tear off this menu"
-#~ msgstr "คมคUฆนฟ๏ณๆ"
-
-#~ msgid "[string too long]"
-#~ msgstr "[ฆนฆๆนLช๘]"
-
-#~ msgid "Hit ENTER to continue"
-#~ msgstr "ฝะซ๖ ENTER ฤ~ฤ๒"
-
-#~ msgid " (RET/BS: line, SPACE/b: page, d/u: half page, q: quit)"
-#~ msgstr " (RET/BS: ฆVคU/ฆVคWค@ฆๆ, ชลฅีมไ/b: ค@ญถ, d/u: ฅbญถ, q: ย๗ถ})"
-
-#~ msgid " (RET: line, SPACE: page, d: half page, q: quit)"
-#~ msgstr " (RET: ฆVคUค@ฆๆ, ชลฅีมไ: ค@ญถ, d: ฅbญถ, q: ย๗ถ})"
-
-#~ msgid "Save File dialog"
-#~ msgstr "ฆsภษ"
-
-#~ msgid "Open File dialog"
-#~ msgstr "ถ}ภษ"
-
-#~ msgid "E338: Sorry, no file browser in console mode"
-#~ msgstr "E338: ฅDฑฑฅx(Console)ผาฆกฎษจSฆณภษฎืยsฤพน(file browser)"
-
-#~ msgid "Vim: preserving files...\n"
-#~ msgstr "Vim: ซOฏdภษฎืคค...\n"
-
-#~ msgid "Vim: Finished.\n"
-#~ msgstr "Vim: ตฒง๔.\n"
-
-#~ msgid "ERROR: "
-#~ msgstr "ฟ๙ป~: "
-
-#~ msgid ""
-#~ "\n"
-#~ "[bytes] total alloc-freed %<PRIu64>-%<PRIu64>, in use %<PRIu64>, peak use "
-#~ "%<PRIu64>\n"
-#~ msgstr ""
-#~ "\n"
-#~ "[bytes] ฅณก alloc-freed %<PRIu64>-%<PRIu64>, จฯฅฮคค %<PRIu64>, peak จฯฅฮ "
-#~ "%<PRIu64>\n"
-
-#~ msgid ""
-#~ "[calls] total re/malloc()'s %<PRIu64>, total free()'s %<PRIu64>\n"
-#~ "\n"
-#~ msgstr ""
-#~ "[ฉIฅs] ฅณก re/malloc(): %<PRIu64>, ฅณก free()': %<PRIu64>\n"
-#~ "\n"
-
-#~ msgid "E340: Line is becoming too long"
-#~ msgstr "E340: ฆนฆๆนLช๘"
-
-#~ msgid "E341: Internal error: lalloc(%<PRId64>, )"
-#~ msgstr "E341: คบณกฟ๙ป~: lalloc(%<PRId64>, )"
-
-#~ msgid "E547: Illegal mouseshape"
-#~ msgstr "E547: คฃฅฟฝTชบทฦนซงฮชฌ"
-
-#~ msgid "Enter encryption key: "
-#~ msgstr "ฟ้คJฑKฝX: "
-
-#~ msgid "Enter same key again: "
-#~ msgstr "ฝะฆAฟ้คJค@ฆธ: "
-
-#~ msgid "Keys don't match!"
-#~ msgstr "จโฆธฟ้คJฑKฝXคฃฌฆP!"
-
-#~ msgid "Cannot connect to Netbeans #2"
-#~ msgstr "ตLชkณsฑตจ์ Netbeans #2"
-
-#~ msgid "Cannot connect to Netbeans"
-#~ msgstr "ตLชkณsฑตจ์ Netbeans"
-
-#~ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
-#~ msgstr "E668: NetBeans ณsฝuธ๊ฐTภษฎื: \"%s\" ฆsจ๚ผาฆกคฃฅฟฝT"
-
-#~ msgid "read from Netbeans socket"
-#~ msgstr "ฅั Netbeans socket ลชจ๚"
-
-#~ msgid "E658: NetBeans connection lost for buffer %<PRId64>"
-#~ msgstr "E658: ฝwฝฤฐฯ %<PRId64> ปP NetBeans ชบณsฝuคwคคย_"
-
-#~ msgid "freeing %<PRId64> lines"
-#~ msgstr "ฤภฉ๑ %<PRId64> ฆๆคค "
-
-#~ msgid "E530: Cannot change term in GUI"
-#~ msgstr "E530: ฆbนฯซฌฌษญฑคคตLชkคมดซ term"
-
-#~ msgid "E531: Use \":gui\" to start the GUI"
-#~ msgstr "E531: ฟ้คJ \":gui\" จำฑาฐสนฯงฮฌษญฑ"
-
-#~ msgid "E617: Cannot be changed in the GTK+ 2 GUI"
-#~ msgstr "E617: ฆbนฯซฌฌษญฑคคตLชkคมดซ term"
-
-#~ msgid "E597: can't select fontset"
-#~ msgstr "E597: ตLชkจฯฅฮฆrซฌถฐ(Fontset)"
-
-#~ msgid "E598: Invalid fontset"
-#~ msgstr "E598: คฃฅฟฝTชบฆrซฌถฐ(Fontset)"
-
-#~ msgid "E533: can't select wide font"
-#~ msgstr "E533: ตLชkจฯฅฮณ]ฉwชบคคคๅฆrซฌ(Widefont)"
-
-#~ msgid "E534: Invalid wide font"
-#~ msgstr "E534: คฃฅฟฝTชบฆrซฌ(Widefont)"
-
-#~ msgid "E538: No mouse support"
-#~ msgstr "E538: คฃคไดฉทฦนซ"
-
-#~ msgid "cannot open "
-#~ msgstr "คฃฏเถ}ฑา"
-
-#~ msgid "VIM: Can't open window!\n"
-#~ msgstr "VIM: ตLชkถ}ฑาต๘ตก!\n"
-
-#~ msgid "Need Amigados version 2.04 or later\n"
-#~ msgstr "ปญn Amigados ชฉฅป 2.04 ฅHคW\n"
-
-#~ msgid "Need %s version %<PRId64>\n"
-#~ msgstr "ปญn %s ชฉฅป %<PRId64>\n"
-
-#~ msgid "Cannot open NIL:\n"
-#~ msgstr "ตLชkถ}ฑา NIL:\n"
-
-#~ msgid "Cannot create "
-#~ msgstr "คฃฏเซุฅ฿ "
-
-#~ msgid "Vim exiting with %d\n"
-#~ msgstr "Vim ตฒง๔ถวฆ^ญศ: %d\n"
-
-#~ msgid "cannot change console mode ?!\n"
-#~ msgstr "ตLชkคมดซฅDฑฑฅx(console)ผาฆก !?\n"
-
-#~ msgid "mch_get_shellsize: not a console??\n"
-#~ msgstr "mch_get_shellsize: คฃฌOฅDฑฑฅx(console)??\n"
-
-#~ msgid "Cannot execute "
-#~ msgstr "คฃฏเฐ๕ฆๆ "
-
-#~ msgid "shell "
-#~ msgstr "shell "
-
-#~ msgid " returned\n"
-#~ msgstr " คwช๐ฆ^\n"
-
-#~ msgid "ANCHOR_BUF_SIZE too small."
-#~ msgstr "ANCHOR_BUF_SIZE คำคp"
-
-#~ msgid "I/O ERROR"
-#~ msgstr "I/O ฟ๙ป~"
-
-#~ msgid "...(truncated)"
-#~ msgstr "...(คwคมฑผ)"
-
-#~ msgid "'columns' is not 80, cannot execute external commands"
-#~ msgstr "'columns' คฃฌO 80, ตLชkฐ๕ฆๆฅ~ณกฉRฅO"
-
-#~ msgid "to %s on %s"
-#~ msgstr "จ์ %s on %s"
-
-#~ msgid "E613: Unknown printer font: %s"
-#~ msgstr "E613: คฃฅฟฝTชบฆLชํพ๗ฆrซฌ: %s"
-
-#~ msgid "E238: Print error: %s"
-#~ msgstr "E238: ฆCฆLฟ๙ป~: %s"
-
-#~ msgid "Printing '%s'"
-#~ msgstr "ฆCฆLคค: '%s'"
-
-#~ msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
-#~ msgstr "E244: ฆrคธถฐ \"%s\" ตLชkน๏ภณฆrซฌ\"%s\""
-
-#~ msgid "E245: Illegal char '%c' in font name \"%s\""
-#~ msgstr "E245: คฃฅฟฝTชบฆrคธ '%c' ฅXฒ{ฆbฆrซฌฆWบู \"%s\" คบ"
-
-#~ msgid "Vim: Double signal, exiting\n"
-#~ msgstr "Vim: ย๙ญซsignal, ย๗ถ}คค\n"
-
-#~ msgid "Vim: Caught deadly signal %s\n"
-#~ msgstr "Vim: CVim: ฤdบIจ์ซHธน(signal) %s\n"
-
-#~ msgid "Vim: Caught deadly signal\n"
-#~ msgstr "Vim: ฤdบIจ์ญPฉRชบซHธน(deadly signale)\n"
-
-#~ msgid "Opening the X display took %<PRId64> msec"
-#~ msgstr "ถ}ฑา X Window ฏำฎษ %<PRId64> msec"
-
-#~ msgid ""
-#~ "\n"
-#~ "Vim: Got X error\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Vim: X ฟ๙ป~\n"
-
-#~ msgid "Testing the X display failed"
-#~ msgstr "ด๚ธี X Window ฅขฑั"
-
-#~ msgid "Opening the X display timed out"
-#~ msgstr "ถ}ฑา X Window นOฎษ"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot execute shell sh\n"
-#~ msgstr ""
-#~ "\n"
-#~ "คฃฏเฐ๕ฆๆ shell sh\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot create pipes\n"
-#~ msgstr ""
-#~ "\n"
-#~ "คฃฏเซุฅ฿ pipe บฝu\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Cannot fork\n"
-#~ msgstr ""
-#~ "\n"
-#~ "คฃฏเ fork\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Command terminated\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ฉRฅOคwฒืตฒ\n"
-
-#~ msgid "XSMP lost ICE connection"
-#~ msgstr "XSMP ฅขฅh ICE ณsฝu"
-
-#~ msgid "Opening the X display failed"
-#~ msgstr "ถ}ฑา X Window ฅขฑั"
-
-#~ msgid "XSMP handling save-yourself request"
-#~ msgstr "XSMP ฅฟฆbณBฒzฆงฺภxฆsญnจD"
-
-#~ msgid "XSMP opening connection"
-#~ msgstr "ถ}ฑา XSMP ณsฝuคค"
-
-#~ msgid "XSMP ICE connection watch failed"
-#~ msgstr "XSMP ICE ณsฝuบสฌฅขฑั"
-
-#~ msgid "XSMP SmcOpenConnection failed: %s"
-#~ msgstr "XSMP SmcOpenConnection ฅขฑั: %s"
-
-#~ msgid "At line"
-#~ msgstr "ฆbฆๆธน "
-
-#~ msgid "Could not allocate memory for command line."
-#~ msgstr "ตLชkฌฐฉRฅOฆCฐtธmฐOพะล้กC"
-
-#~ msgid "VIM Error"
-#~ msgstr "VIM ฟ๙ป~"
-
-#~ msgid "Could not load vim32.dll!"
-#~ msgstr "ตLชkธคJ vim32.dllกI"
-
-#~ msgid "Could not fix up function pointers to the DLL!"
-#~ msgstr "คฃฏเญืฅฟจ็ฆกซผะจ์ DLL!"
-
-#~ msgid "shell returned %d"
-#~ msgstr "Shell ถวฆ^ญศ %d"
-
-#~ msgid "Vim: Caught %s event\n"
-#~ msgstr "Vim: ฤdบIจ์ %s \n"
-
-#~ msgid "close"
-#~ msgstr "ร๖ณฌ"
-
-#~ msgid "logoff"
-#~ msgstr "ตnฅX"
-
-#~ msgid "shutdown"
-#~ msgstr "ร๖พ๗"
-
-#~ msgid "E371: Command not found"
-#~ msgstr "E371: งไคฃจ์ฉRฅO"
-
-#~ msgid ""
-#~ "VIMRUN.EXE not found in your $PATH.\n"
-#~ "External commands will not pause after completion.\n"
-#~ "See :help win32-vimrun for more information."
-#~ msgstr ""
-#~ "ฆbงAชบ $PATH คคงไคฃจ์ VIMRUN.EXE.\n"
-#~ "ฅ~ณกฉRฅOฐ๕ฆๆงนฒฆซแฑNคฃท|ผศฐฑ.\n"
-#~ "ถiค@จBปกฉ๚ฝะฐ๕ฆๆ :help win32-vimrun "
-
-#~ msgid "Vim Warning"
-#~ msgstr "Vim ฤตงi"
-
-#~ msgid "E56: %s* operand could be empty"
-#~ msgstr "E56: %s* นBบโคธฅiฅHฌOชลชบ"
-
-#~ msgid "E57: %s+ operand could be empty"
-#~ msgstr "E57: %s+ นBบโคธฅiฅHฌOชลชบ"
-
-#~ msgid "E58: %s{ operand could be empty"
-#~ msgstr "E58: %s{ นBบโคธฅiฅHฌOชลชบ"
-
-#~ msgid "E361: Crash intercepted; regexp too complex?"
-#~ msgstr "E361: ตLชkฐ๕ฆๆ; regular expression คำฝฦย๘?"
-
-#~ msgid "E363: pattern caused out-of-stack error"
-#~ msgstr "E363: regular expression ณyฆจฐ๏ล|ฅฮฅ๚ชบฟ๙ป~"
-
-#~ msgid "E396: containedin argument not accepted here"
-#~ msgstr "E396: จฯฅฮคFคฃฅฟฝTชบฐัผฦ"
-
-#~ msgid "Enter nr of choice (<CR> to abort): "
-#~ msgstr "ฟ้คJ nr ฉฮฟ๏พ (<CR> ย๗ถ}): "
-
-#~ msgid "E430: Tag file path truncated for %s\n"
-#~ msgstr "E430: Tag ภษฎืธ๔ฎ|ณQบIย_ฌฐ %s\n"
-
-#~ msgid "new shell started\n"
-#~ msgstr "ฐ_ฐสทs shell\n"
-
-#~ msgid "No undo possible; continue anyway"
-#~ msgstr "ตLชkมูญ์กFฝะฤ~ฤ๒งVคO"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16/32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 16/32 Bit นฯซฌฌษญฑชฉฅป"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit GUI version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 32 Bit นฯซฌฌษญฑชฉฅป"
-
-#~ msgid " in Win32s mode"
-#~ msgstr "Win32s ผาฆก"
-
-#~ msgid " with OLE support"
-#~ msgstr "คไดฉ OLE"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 32-bit console version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 32 Bit console ชฉฅป"
-
-#~ msgid ""
-#~ "\n"
-#~ "MS-Windows 16-bit version"
-#~ msgstr ""
-#~ "\n"
-#~ "MS-Windows 32 Bit console ชฉฅป"
-
-#~ msgid ""
-#~ "\n"
-#~ "32-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "32 Bit MS-DOS ชฉฅป"
-
-#~ msgid ""
-#~ "\n"
-#~ "16-bit MS-DOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "16 Bit MS-DOS ชฉฅป"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X (unix) version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS X (unix) ชฉฅป"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS X version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS X ชฉฅป"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS version"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS ชฉฅป"
-
-#~ msgid ""
-#~ "\n"
-#~ "RISC OS version"
-#~ msgstr ""
-#~ "\n"
-#~ "RISC OS ชฉฅป"
-
-#~ msgid ""
-#~ "\n"
-#~ "Big version "
-#~ msgstr ""
-#~ "\n"
-#~ "คjซฌชฉฅป "
-
-#~ msgid ""
-#~ "\n"
-#~ "Normal version "
-#~ msgstr ""
-#~ "\n"
-#~ "ค@ฏ๋ชฉฅป "
-
-#~ msgid ""
-#~ "\n"
-#~ "Small version "
-#~ msgstr ""
-#~ "\n"
-#~ "ยฒฉ๖ชฉฅป "
-
-#~ msgid ""
-#~ "\n"
-#~ "Tiny version "
-#~ msgstr ""
-#~ "\n"
-#~ "บ๋ยฒชฉฅป "
-
-#~ msgid "with GTK2-GNOME GUI."
-#~ msgstr "จฯฅฮ GTK2-GNOME นฯซฌฌษญฑกC"
-
-#~ msgid "with GTK-GNOME GUI."
-#~ msgstr "จฯฅฮ GTK-GNOME นฯซฌฌษญฑกC"
-
-#~ msgid "with GTK2 GUI."
-#~ msgstr "จฯฅฮ GTK2 นฯซฌฌษญฑกC"
-
-#~ msgid "with GTK GUI."
-#~ msgstr "จฯฅฮ GTK นฯซฌฌษญฑกC"
-
-#~ msgid "with X11-Motif GUI."
-#~ msgstr "จฯฅฮ X11-Motif นฯซฌฌษญฑกC"
-
-#~ msgid "with X11-neXtaw GUI."
-#~ msgstr "จฯฅฮ X11-neXtaw นฯซฌฌษญฑกC"
-
-#~ msgid "with X11-Athena GUI."
-#~ msgstr "จฯฅฮ X11-Athena นฯซฌฌษญฑกC"
-
-#~ msgid "with BeOS GUI."
-#~ msgstr "จฯฅฮ BeOS นฯซฌฌษญฑกC"
-
-#~ msgid "with Photon GUI."
-#~ msgstr "จฯฅฮPhotonนฯซฌฌษญฑกC"
-
-#~ msgid "with GUI."
-#~ msgstr "จฯฅฮนฯซฌฌษญฑกC"
-
-#~ msgid "with Carbon GUI."
-#~ msgstr "จฯฅฮ Carbon นฯซฌฌษญฑกC"
-
-#~ msgid "with Cocoa GUI."
-#~ msgstr "จฯฅฮ Cocoa นฯซฌฌษญฑกC"
-
-#~ msgid "with (classic) GUI."
-#~ msgstr "จฯฅฮ (ถวฒฮ) นฯซฌฌษญฑกC"
-
-#~ msgid " system gvimrc file: \""
-#~ msgstr " จtฒฮ gvimrc ภษฎื: \""
-
-#~ msgid " user gvimrc file: \""
-#~ msgstr " จฯฅฮชฬญำคH gvimrc ภษ: \""
-
-#~ msgid "2nd user gvimrc file: \""
-#~ msgstr " ฒฤคGฒีญำคH gvimrc ภษฎื: \""
-
-#~ msgid "3rd user gvimrc file: \""
-#~ msgstr " ฒฤคTฒีญำคH gvimrc ภษฎื: \""
-
-#~ msgid " system menu file: \""
-#~ msgstr " จtฒฮฟ๏ณๆณ]ฉwภษ: \""
-
-#~ msgid "Compiler: "
-#~ msgstr "ฝsฤถพน: "
-
-#~ msgid "menu Help->Orphans for information "
-#~ msgstr "ถiค@จBปกฉ๚ฝะฟ๏จ๚ฟ๏ณๆชบ ปฒงUปกฉ๚->ฌ@ฑฯฉtจเ"
-
-#~ msgid "Running modeless, typed text is inserted"
-#~ msgstr "ฐ๕ฆๆ Modeless ผาฆกกAฟ้คJชบคๅฆrท|ฆฐสดกคJ"
-
-#~ msgid "menu Edit->Global Settings->Toggle Insert Mode "
-#~ msgstr "ฟ๏จ๚ฟ๏ณๆชบกuฝsฟ่กvกuฅฐ์ณ]ฉwกvกuคมดซดกคJผาฆกกv"
-
-#~ msgid " for two modes "
-#~ msgstr " จโบุผาฆก "
-
-#~ msgid "menu Edit->Global Settings->Toggle Vi Compatible"
-#~ msgstr "ฟ๏จ๚ฟ๏ณๆชบกuฝsฟ่กvกuฅฐ์ณ]ฉwกvกuคมดซถวฒฮViฌฎeผาฆกกv"
-
-#~ msgid " for Vim defaults "
-#~ msgstr " ฅHฑo Vim นwณ]ญศ "
-
-#~ msgid "WARNING: Windows 95/98/ME detected"
-#~ msgstr "ช`ทN: ฐปด๚จ์ Windows 95/98/ME"
-
-#~ msgid "type :help windows95<Enter> for info on this"
-#~ msgstr "ฆpชGปญnน๏ Windows 95 คไดฉชบง๓ฆhธ๊ฐTฝะฟ้คJ :help windows95<Enter>"
-
-#~ msgid "E370: Could not load library %s"
-#~ msgstr "E370: ตLชkญซทsธคJต{ฆกฎw %s"
-
-#~ msgid ""
-#~ "Sorry, this command is disabled: the Perl library could not be loaded."
-#~ msgstr "ฉ๊บp, ฆนฉRฅOตLชkจฯฅฮ. ญ์ฆ]: ตLชkธคJ Perl ต{ฆกฎw(Library)"
-
-#~ msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
-#~ msgstr "E299: ฆb sandbox คคตL Safe ผาฒีฎษตLชkฐ๕ฆๆ Perl"
-
-#~ msgid "Edit with &multiple Vims"
-#~ msgstr "จฯฅฮฆhญำ Vim session ฝsฟ่(&M)"
-
-#~ msgid "Edit with single &Vim"
-#~ msgstr "ฅuจฯฅฮฆPค@ญำ Vim session ฝsฟ่(&V)"
-
-#~ msgid "&Diff with Vim"
-#~ msgstr "จฯฅฮ Vim จำค๑ธ๛(&Diff)"
-
-#~ msgid "Edit with &Vim"
-#~ msgstr "จฯฅฮ Vim ฝsฟ่ฆนภษ(&V)"
-
-#~ msgid "Edit with existing Vim - &"
-#~ msgstr "จฯฅฮฐ๕ฆๆคคชบ Vim session ฝsฟ่ - &"
-
-#~ msgid "Edits the selected file(s) with Vim"
-#~ msgstr "จฯฅฮ Vim ฝsฟ่คwฟ๏จ๚ชบภษฎื"
-
-#~ msgid "Error creating process: Check if gvim is in your path!"
-#~ msgstr "ตLชkฐ๕ฆๆต{ฆก: ฝะภหฌd gvim ฆณจSฆณฆbงAชบ PATH ลผฦธฬ!"
-
-#~ msgid "gvimext.dll error"
-#~ msgstr "gvimext.dll ฟ๙ป~"
-
-#~ msgid "Path length too long!"
-#~ msgstr "ธ๔ฎ|ช๘ซืคำช๘!"
-
-#~ msgid "E234: Unknown fontset: %s"
-#~ msgstr "E234: คฃฅฟฝTชบฆrคธถฐ (Fontset): %s"
-
-#~ msgid "E235: Unknown font: %s"
-#~ msgstr "E235: คฃฅฟฝTชบฆrซฌฆWบู: %s"
-
-#~ msgid "E448: Could not load library function %s"
-#~ msgstr "E448: ตLชkธคJต{ฆกฎwชบจ็ฆก %s"
-
-#~ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
-#~ msgstr "E26: ฆ]ฌฐฝsฤถฎษจSฆณฅ[คJ Hebrew ชบต{ฆกฝXกAฉาฅHตLชkจฯฅฮ Hebrew\n"
-
-#~ msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
-#~ msgstr "E27: ฆ]ฌฐฝsฤถฎษจSฆณฅ[คJ Farsi ชบต{ฆกฝXกAฉาฅHตLชkจฯฅฮ Farsi\n"
-
-#~ msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
-#~ msgstr "E800: ฆ]ฌฐฝsฤถฎษจSฆณฅ[คJ Arabic ชบต{ฆกฝXกAฉาฅHตLชkจฯฅฮ\n"
-
-#~ msgid "E247: no registered server named \"%s\""
-#~ msgstr "E247: จSฆณต๙ฅUฌฐ \"%s\" ชบฆ๘ชAพน"
-
-#~ msgid "E233: cannot open display"
-#~ msgstr "E233: <คฃฏเถ}ฑา X Server DISPLAY>"
-
-#~ msgid "E463: Region is guarded, cannot modify"
-#~ msgstr "E463: ฐฯฐ์ณQซOล@กAตLชkญืง๏"
-
-#~ msgid "E565: error reading cscope connection %d"
-#~ msgstr "E565: ลชจ๚ cscope ณsฝu %d ฟ๙ป~"
-
-#~ msgid "E260: cscope connection not found"
-#~ msgstr "E260: งไคฃจ์ cscope ณsฝu"
-
-#~ msgid "cscope connection closed"
-#~ msgstr "cscope ณsฝuคwร๖ณฌ"
-
-#~ msgid "couldn't malloc\n"
-#~ msgstr "ตLชkจฯฅฮ malloc\n"
-
-#~ msgid "%2d %-5ld %-34s <none>\n"
-#~ msgstr "%2d %-5ld %-34s <ตL>\n"
-
-#~ msgid "\"\n"
-#~ msgstr "\"\n"
-
-#~ msgid "--help\t\tShow Gnome arguments"
-#~ msgstr "--help\t\tลใฅ Gnome ฌร๖ฐัผฦ"
-
-#~ msgid " BLOCK"
-#~ msgstr " ฐฯถ๔"
-
-#~ msgid " LINE"
-#~ msgstr " ฆๆฟ๏จ๚"
-
-#~ msgid "Linear tag search"
-#~ msgstr "ฝuฉสทjดMผะลา (Tags)"
-
-#~ msgid "Binary tag search"
-#~ msgstr "คGคภทjดM(Binary search) ผะลา(Tags)"
-
-#~ msgid "function "
-#~ msgstr "จ็ฆก "
-
-#~ msgid "Run Macro"
-#~ msgstr "ฐ๕ฆๆฅจถฐ"
-
-#~ msgid "E242: Color name not recognized: %s"
-#~ msgstr "E242: %s ฌฐตLชkรังOชบรCฆโฆWบู"
-
-#~ msgid "error reading cscope connection %d"
-#~ msgstr "ลชจ๚ cscope ณsฝu %d ฎษฟ๙ป~"
-
-#~ msgid "E249: couldn't read VIM instance registry property"
-#~ msgstr "E249: ตLชkลชจ๚ VIM ชบ registry ณ]ฉwถต"
-
-#~ msgid "E241: Unable to send to Vim server"
-#~ msgstr "E241: ตLชkถวฐeจ์ Vim ฆ๘ชAพน"
-
-#~ msgid ""
-#~ "\n"
-#~ "Send failed. No command server present ?\n"
-#~ msgstr ""
-#~ "\n"
-#~ "ถวฐeฅขฑักCจSฆณฉRฅOฆ๘ชAพนฆsฆb ?\n"
-
-#~ msgid "PC (32 bits Vim)"
-#~ msgstr "PC (32 ฆ์คธ Vim)"
-
-#~ msgid "PC (16 bits Vim)"
-#~ msgstr "PC (16 ฆ์คธ Vim)"
-
-#~ msgid "E362: Unsupported screen mode"
-#~ msgstr "E362: ฟรน๕ผาฆกคฃคไดฉ"
-
-#~ msgid "No servers found for this display"
-#~ msgstr "ฆนDisplayจSฆณฆ๘ชAพน(Servers)"
-
-#~ msgid "E258: no matches found in cscope connections"
-#~ msgstr "E258: cscope ณsฝuงไคฃจ์ฒลฆXชบ"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS Carbon"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS Carbon"
-
-#~ msgid ""
-#~ "\n"
-#~ "MacOS 8"
-#~ msgstr ""
-#~ "\n"
-#~ "MacOS 8"
-
-#~ msgid "Retrieve next symbol"
-#~ msgstr "ลชจ๚: ฑqคUญำ symbol"
-
-#~ msgid "-- SNiFF+ commands --"
-#~ msgstr "-- SNiFF+ ฉRฅO --"
-
-#~ msgid "E277: Unrecognized sniff request [%s]"
-#~ msgstr "E277: ตLชkฟ๋รั sniff ฉRฅO [%s]"
diff --git a/src/nvim/popupmnu.c b/src/nvim/popupmnu.c
index 5ad621e666..056770f2c0 100644
--- a/src/nvim/popupmnu.c
+++ b/src/nvim/popupmnu.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/// @file popupmnu.c
///
/// Popup menu (PUM)
@@ -7,12 +10,12 @@
#include <stdbool.h>
#include "nvim/vim.h"
+#include "nvim/api/private/helpers.h"
#include "nvim/ascii.h"
#include "nvim/popupmnu.h"
#include "nvim/charset.h"
#include "nvim/ex_cmds.h"
#include "nvim/memline.h"
-#include "nvim/misc2.h"
#include "nvim/move.h"
#include "nvim/option.h"
#include "nvim/screen.h"
@@ -21,6 +24,7 @@
#include "nvim/memory.h"
#include "nvim/window.h"
#include "nvim/edit.h"
+#include "nvim/ui.h"
static pumitem_T *pum_array = NULL; // items of displayed pum
static int pum_size; // nr of items in "pum_array"
@@ -36,8 +40,8 @@ static int pum_scrollbar; // TRUE when scrollbar present
static int pum_row; // top row of pum
static int pum_col; // left column of pum
-static int pum_do_redraw = FALSE; // do redraw anyway
-
+static bool pum_is_visible = false;
+static bool pum_external = false;
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "popupmnu.c.generated.h"
@@ -53,7 +57,10 @@ static int pum_do_redraw = FALSE; // do redraw anyway
/// @param array
/// @param size
/// @param selected index of initially selected item, none if out of range
-void pum_display(pumitem_T *array, int size, int selected)
+/// @param array_changed if true, array contains different items since last call
+/// if false, a new item is selected, but the array
+/// is the same
+void pum_display(pumitem_T *array, int size, int selected, bool array_changed)
{
int w;
int def_width;
@@ -61,213 +68,250 @@ void pum_display(pumitem_T *array, int size, int selected)
int kind_width;
int extra_width;
int i;
- int top_clear;
- int row;
int context_lines;
- int col;
- int above_row = cmdline_row;
+ int above_row;
+ int below_row;
int redo_count = 0;
+ int row;
+ int col;
-redo:
- def_width = PUM_DEF_WIDTH;
- max_width = 0;
- kind_width = 0;
- extra_width = 0;
-
- // Pretend the pum is already there to avoid that must_redraw is set when
- // 'cuc' is on.
- pum_array = (pumitem_T *)1;
- validate_cursor_col();
- pum_array = NULL;
-
- row = curwin->w_wrow + curwin->w_winrow;
-
- if (firstwin->w_p_pvw) {
- top_clear = firstwin->w_height;
- } else {
- top_clear = 0;
- }
-
- // When the preview window is at the bottom stop just above it. Also
- // avoid drawing over the status line so that it's clear there is a window
- // boundary.
- if (lastwin->w_p_pvw) {
- above_row -= lastwin->w_height + lastwin->w_status_height + 1;
- }
-
- // Figure out the size and position of the pum.
- if (size < PUM_DEF_HEIGHT) {
- pum_height = size;
- } else {
- pum_height = PUM_DEF_HEIGHT;
- }
-
- if ((p_ph > 0) && (pum_height > p_ph)) {
- pum_height = (int)p_ph;
+ if (!pum_is_visible) {
+ // To keep the code simple, we only allow changing the
+ // draw mode when the popup menu is not being displayed
+ pum_external = ui_is_external(kUIPopupmenu);
}
- // Put the pum below "row" if possible. If there are few lines decide on
- // where there is more room.
- if ((row + 2 >= above_row - pum_height)
- && (row > (above_row - top_clear) / 2)) {
- // pum above "row"
+ do {
+ // Mark the pum as visible already here,
+ // to avoid that must_redraw is set when 'cursorcolumn' is on.
+ pum_is_visible = true;
+ validate_cursor_col();
+ above_row = 0;
+ below_row = cmdline_row;
- // Leave two lines of context if possible
- if (curwin->w_wrow - curwin->w_cline_row >= 2) {
- context_lines = 2;
+ // anchor position: the start of the completed word
+ row = curwin->w_wrow;
+ if (curwin->w_p_rl) {
+ col = curwin->w_width - curwin->w_wcol - 1;
} else {
- context_lines = curwin->w_wrow - curwin->w_cline_row;
+ col = curwin->w_wcol;
}
- if (row >= size + context_lines) {
- pum_row = row - size - context_lines;
- pum_height = size;
- } else {
- pum_row = 0;
- pum_height = row - context_lines;
+ int grid = (int)curwin->w_grid.handle;
+ if (!ui_is_external(kUIMultigrid)) {
+ grid = (int)default_grid.handle;
+ row += curwin->w_winrow;
+ col += curwin->w_wincol;
}
- if ((p_ph > 0) && (pum_height > p_ph)) {
- pum_row += pum_height - (int)p_ph;
- pum_height = (int)p_ph;
+ if (pum_external) {
+ if (array_changed) {
+ Array arr = ARRAY_DICT_INIT;
+ for (i = 0; i < size; i++) {
+ Array item = ARRAY_DICT_INIT;
+ ADD(item, STRING_OBJ(cstr_to_string((char *)array[i].pum_text)));
+ ADD(item, STRING_OBJ(cstr_to_string((char *)array[i].pum_kind)));
+ ADD(item, STRING_OBJ(cstr_to_string((char *)array[i].pum_extra)));
+ ADD(item, STRING_OBJ(cstr_to_string((char *)array[i].pum_info)));
+ ADD(arr, ARRAY_OBJ(item));
+ }
+ ui_call_popupmenu_show(arr, selected, row, col, grid);
+ } else {
+ ui_call_popupmenu_select(selected);
+ }
+ return;
}
- } else {
- // pum below "row"
- // Leave two lines of context if possible
- if (curwin->w_cline_row + curwin->w_cline_height - curwin->w_wrow >= 3) {
- context_lines = 3;
- } else {
- context_lines = curwin->w_cline_row
- + curwin->w_cline_height - curwin->w_wrow;
+ def_width = PUM_DEF_WIDTH;
+ max_width = 0;
+ kind_width = 0;
+ extra_width = 0;
+
+ win_T *pvwin = NULL;
+ FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
+ if (wp->w_p_pvw) {
+ pvwin = wp;
+ break;
+ }
}
- pum_row = row + context_lines;
- if (size > above_row - pum_row) {
- pum_height = above_row - pum_row;
- } else {
+ if (pvwin != NULL) {
+ if (pvwin->w_winrow < curwin->w_winrow) {
+ above_row = pvwin->w_winrow + pvwin->w_height;
+ } else if (pvwin->w_winrow > curwin->w_winrow + curwin->w_height) {
+ below_row = pvwin->w_winrow;
+ }
+ }
+
+ // Figure out the size and position of the pum.
+ if (size < PUM_DEF_HEIGHT) {
pum_height = size;
+ } else {
+ pum_height = PUM_DEF_HEIGHT;
}
if ((p_ph > 0) && (pum_height > p_ph)) {
pum_height = (int)p_ph;
}
- }
- // don't display when we only have room for one line
- if ((pum_height < 1) || ((pum_height == 1) && (size > 1))) {
- return;
- }
+ // Put the pum below "row" if possible. If there are few lines decide on
+ // where there is more room.
+ if (row + 2 >= below_row - pum_height
+ && row - above_row > (below_row - above_row) / 2) {
+ // pum above "row"
- // If there is a preview window at the top avoid drawing over it.
- if (firstwin->w_p_pvw
- && (pum_row < firstwin->w_height)
- && (pum_height > firstwin->w_height + 4)) {
- pum_row += firstwin->w_height;
- pum_height -= firstwin->w_height;
- }
+ // Leave two lines of context if possible
+ if (curwin->w_wrow - curwin->w_cline_row >= 2) {
+ context_lines = 2;
+ } else {
+ context_lines = curwin->w_wrow - curwin->w_cline_row;
+ }
- // Compute the width of the widest match and the widest extra.
- for (i = 0; i < size; ++i) {
- w = vim_strsize(array[i].pum_text);
+ if (row >= size + context_lines) {
+ pum_row = row - size - context_lines;
+ pum_height = size;
+ } else {
+ pum_row = 0;
+ pum_height = row - context_lines;
+ }
- if (max_width < w) {
- max_width = w;
- }
+ if ((p_ph > 0) && (pum_height > p_ph)) {
+ pum_row += pum_height - (int)p_ph;
+ pum_height = (int)p_ph;
+ }
+ } else {
+ // pum below "row"
+
+ // Leave two lines of context if possible
+ if (curwin->w_cline_row + curwin->w_cline_height - curwin->w_wrow >= 3) {
+ context_lines = 3;
+ } else {
+ context_lines = curwin->w_cline_row
+ + curwin->w_cline_height - curwin->w_wrow;
+ }
- if (array[i].pum_kind != NULL) {
- w = vim_strsize(array[i].pum_kind) + 1;
+ pum_row = row + context_lines;
+ if (size > below_row - pum_row) {
+ pum_height = below_row - pum_row;
+ } else {
+ pum_height = size;
+ }
- if (kind_width < w) {
- kind_width = w;
+ if ((p_ph > 0) && (pum_height > p_ph)) {
+ pum_height = (int)p_ph;
}
}
- if (array[i].pum_extra != NULL) {
- w = vim_strsize(array[i].pum_extra) + 1;
+ // don't display when we only have room for one line
+ if ((pum_height < 1) || ((pum_height == 1) && (size > 1))) {
+ return;
+ }
- if (extra_width < w) {
- extra_width = w;
+ // If there is a preview window above, avoid drawing over it.
+ // Do keep at least 10 entries.
+ if (pvwin != NULL && pum_row < above_row && pum_height > 10) {
+ if (row - above_row < 10) {
+ pum_row = row - 10;
+ pum_height = 10;
+ } else {
+ pum_row = above_row;
+ pum_height = row - above_row;
}
}
- }
- pum_base_width = max_width;
- pum_kind_width = kind_width;
- // Calculate column
- if (curwin->w_p_rl) {
- col = curwin->w_wincol + curwin->w_width - curwin->w_wcol - 1;
- } else {
- col = curwin->w_wincol + curwin->w_wcol;
- }
+ // Compute the width of the widest match and the widest extra.
+ for (i = 0; i < size; i++) {
+ w = vim_strsize(array[i].pum_text);
- // if there are more items than room we need a scrollbar
- if (pum_height < size) {
- pum_scrollbar = 1;
- max_width++;
- } else {
- pum_scrollbar = 0;
- }
+ if (max_width < w) {
+ max_width = w;
+ }
- if (def_width < max_width) {
- def_width = max_width;
- }
+ if (array[i].pum_kind != NULL) {
+ w = vim_strsize(array[i].pum_kind) + 1;
- if ((((col < Columns - PUM_DEF_WIDTH) || (col < Columns - max_width))
- && !curwin->w_p_rl)
- || (curwin->w_p_rl && ((col > PUM_DEF_WIDTH) || (col > max_width)))) {
- // align pum column with "col"
- pum_col = col;
- if (curwin->w_p_rl) {
- pum_width = pum_col - pum_scrollbar + 1;
- } else {
- assert(Columns - pum_col - pum_scrollbar >= INT_MIN
- && Columns - pum_col - pum_scrollbar <= INT_MAX);
- pum_width = (int)(Columns - pum_col - pum_scrollbar);
- }
+ if (kind_width < w) {
+ kind_width = w;
+ }
+ }
- if ((pum_width > max_width + kind_width + extra_width + 1)
- && (pum_width > PUM_DEF_WIDTH)) {
- pum_width = max_width + kind_width + extra_width + 1;
+ if (array[i].pum_extra != NULL) {
+ w = vim_strsize(array[i].pum_extra) + 1;
- if (pum_width < PUM_DEF_WIDTH) {
- pum_width = PUM_DEF_WIDTH;
+ if (extra_width < w) {
+ extra_width = w;
+ }
}
}
- } else if (Columns < def_width) {
- // not enough room, will use what we have
- if (curwin->w_p_rl) {
- assert(Columns - 1 >= INT_MIN);
- pum_col = (int)(Columns - 1);
+ pum_base_width = max_width;
+ pum_kind_width = kind_width;
+
+ // if there are more items than room we need a scrollbar
+ if (pum_height < size) {
+ pum_scrollbar = 1;
+ max_width++;
} else {
- pum_col = 0;
+ pum_scrollbar = 0;
}
- assert(Columns - 1 >= INT_MIN);
- pum_width = (int)(Columns - 1);
- } else {
- if (max_width > PUM_DEF_WIDTH) {
- // truncate
- max_width = PUM_DEF_WIDTH;
+
+ if (def_width < max_width) {
+ def_width = max_width;
}
- if (curwin->w_p_rl) {
- pum_col = max_width - 1;
+ if ((((col < Columns - PUM_DEF_WIDTH) || (col < Columns - max_width))
+ && !curwin->w_p_rl)
+ || (curwin->w_p_rl && ((col > PUM_DEF_WIDTH) || (col > max_width)))) {
+ // align pum column with "col"
+ pum_col = col;
+ if (curwin->w_p_rl) {
+ pum_width = pum_col - pum_scrollbar + 1;
+ } else {
+ assert(Columns - pum_col - pum_scrollbar >= INT_MIN
+ && Columns - pum_col - pum_scrollbar <= INT_MAX);
+ pum_width = (int)(Columns - pum_col - pum_scrollbar);
+ }
+
+ if ((pum_width > max_width + kind_width + extra_width + 1)
+ && (pum_width > PUM_DEF_WIDTH)) {
+ pum_width = max_width + kind_width + extra_width + 1;
+
+ if (pum_width < PUM_DEF_WIDTH) {
+ pum_width = PUM_DEF_WIDTH;
+ }
+ }
+ } else if (Columns < def_width) {
+ // not enough room, will use what we have
+ if (curwin->w_p_rl) {
+ assert(Columns - 1 >= INT_MIN);
+ pum_col = (int)(Columns - 1);
+ } else {
+ pum_col = 0;
+ }
+ assert(Columns - 1 >= INT_MIN);
+ pum_width = (int)(Columns - 1);
} else {
- assert(Columns - max_width >= INT_MIN && Columns - max_width <= INT_MAX);
- pum_col = (int)(Columns - max_width);
+ if (max_width > PUM_DEF_WIDTH) {
+ // truncate
+ max_width = PUM_DEF_WIDTH;
+ }
+
+ if (curwin->w_p_rl) {
+ pum_col = max_width - 1;
+ } else {
+ assert(Columns - max_width >= INT_MIN
+ && Columns - max_width <= INT_MAX);
+ pum_col = (int)(Columns - max_width);
+ }
+ pum_width = max_width - pum_scrollbar;
}
- pum_width = max_width - pum_scrollbar;
- }
- pum_array = array;
- pum_size = size;
+ pum_array = array;
+ pum_size = size;
- // Set selected item and redraw. If the window size changed need to redo
- // the positioning. Limit this to two times, when there is not much
- // room the window size will keep changing.
- if (pum_set_selected(selected, redo_count) && (++redo_count <= 2)) {
- goto redo;
- }
+ // Set selected item and redraw. If the window size changed need to redo
+ // the positioning. Limit this to two times, when there is not much
+ // room the window size will keep changing.
+ } while (pum_set_selected(selected, redo_count) && (++redo_count <= 2));
}
/// Redraw the popup menu, using "pum_first" and "pum_selected".
@@ -275,10 +319,10 @@ void pum_redraw(void)
{
int row = pum_row;
int col;
- int attr_norm = highlight_attr[HLF_PNI];
- int attr_select = highlight_attr[HLF_PSI];
- int attr_scroll = highlight_attr[HLF_PSB];
- int attr_thumb = highlight_attr[HLF_PST];
+ int attr_norm = win_hl_attr(curwin, HLF_PNI);
+ int attr_select = win_hl_attr(curwin, HLF_PSI);
+ int attr_scroll = win_hl_attr(curwin, HLF_PSB);
+ int attr_thumb = win_hl_attr(curwin, HLF_PST);
int attr;
int i;
int idx;
@@ -309,13 +353,15 @@ void pum_redraw(void)
idx = i + pum_first;
attr = (idx == pum_selected) ? attr_select : attr_norm;
+ screen_puts_line_start(row);
+
// prepend a space if there is room
if (curwin->w_p_rl) {
if (pum_col < curwin->w_wincol + curwin->w_width - 1) {
- screen_putchar(' ', row, pum_col + 1, attr);
+ grid_putchar(&default_grid, ' ', row, pum_col + 1, attr);
}
} else if (pum_col > 0) {
- screen_putchar(' ', row, pum_col - 1, attr);
+ grid_putchar(&default_grid, ' ', row, pum_col - 1, attr);
}
// Display each entry, use two spaces for a Tab.
@@ -342,7 +388,7 @@ void pum_redraw(void)
}
if (p != NULL) {
- for (;; mb_ptr_adv(p)) {
+ for (;; MB_PTR_ADV(p)) {
if (s == NULL) {
s = p;
}
@@ -355,7 +401,7 @@ void pum_redraw(void)
char_u saved = *p;
*p = NUL;
- st = transstr(s);
+ st = (char_u *)transstr((const char *)s);
*p = saved;
if (curwin->w_p_rl) {
@@ -365,8 +411,8 @@ void pum_redraw(void)
if (size > pum_width) {
do {
- size -= has_mbyte ? (*mb_ptr2cells)(rt) : 1;
- mb_ptr_adv(rt);
+ size -= utf_ptr2cells(rt);
+ MB_PTR_ADV(rt);
} while (size > pum_width);
if (size < pum_width) {
@@ -377,12 +423,13 @@ void pum_redraw(void)
size++;
}
}
- screen_puts_len(rt, (int)STRLEN(rt), row, col - size + 1, attr);
+ grid_puts_len(&default_grid, rt, (int)STRLEN(rt), row,
+ col - size + 1, attr);
xfree(rt_start);
xfree(st);
col -= width;
} else {
- screen_puts_len(st, (int)STRLEN(st), row, col, attr);
+ grid_puts_len(&default_grid, st, (int)STRLEN(st), row, col, attr);
xfree(st);
col += width;
}
@@ -393,10 +440,11 @@ void pum_redraw(void)
// Display two spaces for a Tab.
if (curwin->w_p_rl) {
- screen_puts_len((char_u *)" ", 2, row, col - 1, attr);
+ grid_puts_len(&default_grid, (char_u *)" ", 2, row, col - 1,
+ attr);
col -= 2;
} else {
- screen_puts_len((char_u *)" ", 2, row, col, attr);
+ grid_puts_len(&default_grid, (char_u *)" ", 2, row, col, attr);
col += 2;
}
totwidth += 2;
@@ -427,35 +475,37 @@ void pum_redraw(void)
}
if (curwin->w_p_rl) {
- screen_fill(row, row + 1, pum_col - pum_base_width - n + 1,
- col + 1, ' ', ' ', attr);
+ grid_fill(&default_grid, row, row + 1, pum_col - pum_base_width - n + 1,
+ col + 1, ' ', ' ', attr);
col = pum_col - pum_base_width - n + 1;
} else {
- screen_fill(row, row + 1, col, pum_col + pum_base_width + n,
- ' ', ' ', attr);
+ grid_fill(&default_grid, row, row + 1, col,
+ pum_col + pum_base_width + n, ' ', ' ', attr);
col = pum_col + pum_base_width + n;
}
totwidth = pum_base_width + n;
}
if (curwin->w_p_rl) {
- screen_fill(row, row + 1, pum_col - pum_width + 1, col + 1, ' ', ' ',
- attr);
+ grid_fill(&default_grid, row, row + 1, pum_col - pum_width + 1, col + 1,
+ ' ', ' ', attr);
} else {
- screen_fill(row, row + 1, col, pum_col + pum_width, ' ', ' ', attr);
+ grid_fill(&default_grid, row, row + 1, col, pum_col + pum_width, ' ', ' ',
+ attr);
}
if (pum_scrollbar > 0) {
if (curwin->w_p_rl) {
- screen_putchar(' ', row, pum_col - pum_width,
- i >= thumb_pos && i < thumb_pos + thumb_heigth
- ? attr_thumb : attr_scroll);
+ grid_putchar(&default_grid, ' ', row, pum_col - pum_width,
+ i >= thumb_pos && i < thumb_pos + thumb_heigth
+ ? attr_thumb : attr_scroll);
} else {
- screen_putchar(' ', row, pum_col + pum_width,
- i >= thumb_pos && i < thumb_pos + thumb_heigth
- ? attr_thumb : attr_scroll);
+ grid_putchar(&default_grid, ' ', row, pum_col + pum_width,
+ i >= thumb_pos && i < thumb_pos + thumb_heigth
+ ? attr_thumb : attr_scroll);
}
}
+ grid_puts_line_flush(&default_grid, false);
row++;
}
}
@@ -535,6 +585,7 @@ static int pum_set_selected(int n, int repeat)
&& (repeat <= 1)
&& (vim_strchr(p_cot, 'p') != NULL)) {
win_T *curwin_save = curwin;
+ tabpage_T *curtab_save = curtab;
int res = OK;
// Open a preview window. 3 lines by default. Prefer
@@ -554,12 +605,14 @@ static int pum_set_selected(int n, int repeat)
g_do_tagpreview = 0;
if (curwin->w_p_pvw) {
- if ((curbuf->b_fname == NULL)
+ if (!resized
+ && (curbuf->b_nwindows == 1)
+ && (curbuf->b_fname == NULL)
&& (curbuf->b_p_bt[0] == 'n')
&& (curbuf->b_p_bt[2] == 'f')
&& (curbuf->b_p_bh[0] == 'w')) {
// Already a "wipeout" buffer, make it empty.
- while (!bufempty()) {
+ while (!BUFEMPTY()) {
ml_delete((linenr_T)1, FALSE);
}
} else {
@@ -571,13 +624,10 @@ static int pum_set_selected(int n, int repeat)
if (res == OK) {
// Edit a new, empty buffer. Set options for a "wipeout"
// buffer.
- set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL);
- set_option_value((char_u *)"bt", 0L,
- (char_u *)"nofile", OPT_LOCAL);
- set_option_value((char_u *)"bh", 0L,
- (char_u *)"wipe", OPT_LOCAL);
- set_option_value((char_u *)"diff", 0L,
- NULL, OPT_LOCAL);
+ set_option_value("swf", 0L, NULL, OPT_LOCAL);
+ set_option_value("bt", 0L, "nofile", OPT_LOCAL);
+ set_option_value("bh", 0L, "wipe", OPT_LOCAL);
+ set_option_value("diff", 0L, NULL, OPT_LOCAL);
}
}
@@ -616,7 +666,12 @@ static int pum_set_selected(int n, int repeat)
curwin->w_cursor.lnum = 1;
curwin->w_cursor.col = 0;
- if ((curwin != curwin_save) && win_valid(curwin_save)) {
+ if ((curwin != curwin_save && win_valid(curwin_save))
+ || (curtab != curtab_save && valid_tabpage(curtab_save))) {
+ if (curtab != curtab_save && valid_tabpage(curtab_save)) {
+ goto_tabpage_tp(curtab_save, false, false);
+ }
+
// When the first completion is done and the preview
// window is not resized, skip the preview window's
// status line redrawing.
@@ -641,9 +696,9 @@ static int pum_set_selected(int n, int repeat)
// Update the screen before drawing the popup menu.
// Enable updating the status lines.
- pum_do_redraw = TRUE;
+ pum_is_visible = false;
update_screen(0);
- pum_do_redraw = FALSE;
+ pum_is_visible = true;
if (!resized && win_valid(curwin_save)) {
no_u_sync++;
@@ -653,9 +708,9 @@ static int pum_set_selected(int n, int repeat)
// May need to update the screen again when there are
// autocommands involved.
- pum_do_redraw = TRUE;
+ pum_is_visible = false;
update_screen(0);
- pum_do_redraw = FALSE;
+ pum_is_visible = true;
}
}
}
@@ -672,10 +727,16 @@ static int pum_set_selected(int n, int repeat)
/// Undisplay the popup menu (later).
void pum_undisplay(void)
{
+ pum_is_visible = false;
pum_array = NULL;
- redraw_all_later(SOME_VALID);
- redraw_tabline = TRUE;
- status_redraw_all();
+
+ if (pum_external) {
+ ui_call_popupmenu_hide();
+ } else {
+ redraw_all_later(SOME_VALID);
+ redraw_tabline = true;
+ status_redraw_all();
+ }
}
/// Clear the popup menu. Currently only resets the offset to the first
@@ -685,12 +746,16 @@ void pum_clear(void)
pum_first = 0;
}
-/// Overruled when "pum_do_redraw" is set, used to redraw the status lines.
-///
-/// @return TRUE if the popup menu is displayed.
-int pum_visible(void)
+/// @return true if the popup menu is displayed.
+bool pum_visible(void)
+{
+ return pum_is_visible;
+}
+
+/// @return true if the popup menu is displayed and drawn on the grid.
+bool pum_drawn(void)
{
- return !pum_do_redraw && pum_array != NULL;
+ return pum_visible() && !pum_external;
}
/// Gets the height of the menu.
diff --git a/src/nvim/popupmnu.h b/src/nvim/popupmnu.h
index 2b181f2c4a..7e1588dbdd 100644
--- a/src/nvim/popupmnu.h
+++ b/src/nvim/popupmnu.h
@@ -1,6 +1,8 @@
#ifndef NVIM_POPUPMNU_H
#define NVIM_POPUPMNU_H
+#include "nvim/types.h"
+
/// Used for popup menu items.
typedef struct {
char_u *pum_text; // main menu text
diff --git a/src/nvim/pos.h b/src/nvim/pos.h
index 864f3fe866..0a2afd5847 100644
--- a/src/nvim/pos.h
+++ b/src/nvim/pos.h
@@ -2,14 +2,18 @@
#define NVIM_POS_H
typedef long linenr_T; // line number type
+/// Format used to print values which have linenr_T type
+#define PRIdLINENR "ld"
/// Column number type
typedef int colnr_T;
/// Format used to print values which have colnr_T type
#define PRIdCOLNR "d"
-#define MAXLNUM 0x7fffffff // maximum (invalid) line number
-#define MAXCOL 0x7fffffff // maximum column number, 31 bits
+/// Maximal (invalid) line number
+enum { MAXLNUM = 0x7fffffff };
+/// Maximal column number, 31 bits
+enum { MAXCOL = 0x7fffffff };
/*
* position in file or buffer
diff --git a/src/nvim/profile.c b/src/nvim/profile.c
index 97d7d77359..8fb8e92add 100644
--- a/src/nvim/profile.c
+++ b/src/nvim/profile.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <stdio.h>
#include <math.h>
#include <assert.h>
diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c
index dfd795b0ba..4eeddf1d5a 100644
--- a/src/nvim/quickfix.c
+++ b/src/nvim/quickfix.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* quickfix.c: functions for quickfix mode, using a file with error messages
*/
@@ -27,7 +30,6 @@
#include "nvim/memline.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/memory.h"
#include "nvim/move.h"
#include "nvim/normal.h"
@@ -49,8 +51,6 @@ struct dir_stack_T {
char_u *dirname;
};
-static struct dir_stack_T *dir_stack = NULL;
-
/*
* For each error the next struct is allocated and linked in a list.
*/
@@ -76,16 +76,34 @@ struct qfline_S {
*/
#define LISTCOUNT 10
+/// Quickfix/Location list definition
+///
+/// Usually the list contains one or more entries. But an empty list can be
+/// created using setqflist()/setloclist() with a title and/or user context
+/// information and entries can be added later using setqflist()/setloclist().
typedef struct qf_list_S {
- qfline_T *qf_start; /* pointer to the first error */
- qfline_T *qf_ptr; /* pointer to the current error */
- int qf_count; /* number of errors (0 means no error list) */
- int qf_index; /* current index in the error list */
- int qf_nonevalid; /* TRUE if not a single valid entry found */
- char_u *qf_title; /* title derived from the command that created
- * the error list */
+ unsigned qf_id; ///< Unique identifier for this list
+ qfline_T *qf_start; ///< pointer to the first error
+ qfline_T *qf_last; ///< pointer to the last error
+ qfline_T *qf_ptr; ///< pointer to the current error
+ int qf_count; ///< number of errors (0 means empty list)
+ int qf_index; ///< current index in the error list
+ int qf_nonevalid; ///< TRUE if not a single valid entry found
+ char_u *qf_title; ///< title derived from the command that created
+ ///< the error list or set by setqflist
+ typval_T *qf_ctx; ///< context set by setqflist/setloclist
+
+ struct dir_stack_T *qf_dir_stack;
+ char_u *qf_directory;
+ struct dir_stack_T *qf_file_stack;
+ char_u *qf_currfile;
+ bool qf_multiline;
+ bool qf_multiignore;
+ bool qf_multiscan;
} qf_list_T;
+/// Quickfix/Location list stack definition
+/// Contains a list of quickfix/location lists (qf_list_T)
struct qf_info_S {
/*
* Count of references to this list. Used only for location lists.
@@ -99,7 +117,8 @@ struct qf_info_S {
qf_list_T qf_lists[LISTCOUNT];
};
-static qf_info_T ql_info; /* global quickfix list */
+static qf_info_T ql_info; // global quickfix list
+static unsigned last_qf_id = 0; // Last Used quickfix list id
#define FMT_PATTERNS 10 /* maximum number of % recognized */
@@ -130,6 +149,42 @@ struct efm_S {
int conthere; /* %> used */
};
+enum {
+ QF_FAIL = 0,
+ QF_OK = 1,
+ QF_END_OF_INPUT = 2,
+ QF_NOMEM = 3,
+ QF_IGNORE_LINE = 4
+};
+
+typedef struct {
+ char_u *linebuf;
+ size_t linelen;
+ char_u *growbuf;
+ size_t growbufsiz;
+ FILE *fd;
+ typval_T *tv;
+ char_u *p_str;
+ list_T *p_list;
+ listitem_T *p_li;
+ buf_T *buf;
+ linenr_T buflnum;
+ linenr_T lnumlast;
+ vimconv_T vc;
+} qfstate_T;
+
+typedef struct {
+ char_u *namebuf;
+ char_u *errmsg;
+ size_t errmsglen;
+ long lnum;
+ int col;
+ bool use_viscol;
+ char_u *pattern;
+ int enr;
+ char_u type;
+ bool valid;
+} qffields_T;
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "quickfix.c.generated.h"
@@ -144,19 +199,24 @@ struct efm_S {
*/
#define GET_LOC_LIST(wp) (IS_LL_WINDOW(wp) ? wp->w_llist_ref : wp->w_llist)
-/*
- * Read the errorfile "efile" into memory, line by line, building the error
- * list. Set the error list's title to qf_title.
- * Return -1 for error, number of errors for success.
- */
-int
-qf_init (
- win_T *wp,
- char_u *efile,
- char_u *errorformat,
- int newlist, /* TRUE: start a new error list */
- char_u *qf_title
-)
+// Looking up a buffer can be slow if there are many. Remember the last one
+// to make this a lot faster if there are multiple matches in the same file.
+static char_u *qf_last_bufname = NULL;
+static bufref_T qf_last_bufref = { NULL, 0, 0 };
+
+/// Read the errorfile "efile" into memory, line by line, building the error
+/// list. Set the error list's title to qf_title.
+///
+/// @params wp If non-NULL, make a location list
+/// @params efile If non-NULL, errorfile to parse
+/// @params errorformat 'errorformat' string used to parse the error lines
+/// @params newlist If true, create a new error list
+/// @params qf_title If non-NULL, title of the error list
+/// @params enc If non-NULL, encoding used to parse errors
+///
+/// @returns -1 for error, number of errors for success.
+int qf_init(win_T *wp, char_u *efile, char_u *errorformat, int newlist,
+ char_u *qf_title, char_u *enc)
{
qf_info_T *qi = &ql_info;
@@ -164,645 +224,985 @@ qf_init (
qi = ll_get_or_alloc_list(wp);
}
- return qf_init_ext(qi, efile, curbuf, NULL, errorformat, newlist,
- (linenr_T)0, (linenr_T)0,
- qf_title);
+ return qf_init_ext(qi, qi->qf_curlist, efile, curbuf, NULL, errorformat,
+ newlist, (linenr_T)0, (linenr_T)0, qf_title, enc);
}
-/*
- * Read the errorfile "efile" into memory, line by line, building the error
- * list.
- * Alternative: when "efile" is null read errors from buffer "buf".
- * Always use 'errorformat' from "buf" if there is a local value.
- * Then "lnumfirst" and "lnumlast" specify the range of lines to use.
- * Set the title of the list to "qf_title".
- * Return -1 for error, number of errors for success.
- */
-static int
-qf_init_ext (
- qf_info_T *qi,
- char_u *efile,
- buf_T *buf,
- typval_T *tv,
- char_u *errorformat,
- int newlist, /* TRUE: start a new error list */
- linenr_T lnumfirst, /* first line number to use */
- linenr_T lnumlast, /* last line number to use */
- char_u *qf_title
-)
-{
- char_u *namebuf;
- char_u *errmsg;
- char_u *pattern;
- char_u *fmtstr = NULL;
- int col = 0;
- bool use_viscol = false;
- char_u type = 0;
- linenr_T buflnum = lnumfirst;
- long lnum = 0L;
- int enr = 0;
- FILE *fd = NULL;
- qfline_T *qfprev = NULL; /* init to make SASC shut up */
- char_u *efmp;
- efm_T *fmt_first = NULL;
- efm_T *fmt_last = NULL;
- efm_T *fmt_ptr;
- efm_T *fmt_start = NULL;
- char_u *efm;
- char_u *ptr;
- char_u *srcptr;
- int len;
- int i;
- int round;
- int idx = 0;
- bool multiline = false;
- bool multiignore = false;
- bool multiscan = false;
- int retval = -1; // default: return error flag
- char_u *directory = NULL;
- char_u *currfile = NULL;
- char_u *tail = NULL;
- char_u *p_str = NULL;
- listitem_T *p_li = NULL;
- struct dir_stack_T *file_stack = NULL;
- regmatch_T regmatch;
- static struct fmtpattern {
- char_u convchar;
- char *pattern;
- } fmt_pat[FMT_PATTERNS] =
- {
- {'f', ".\\+"}, /* only used when at end */
- {'n', "\\d\\+"},
- {'l', "\\d\\+"},
- {'c', "\\d\\+"},
- {'t', "."},
- {'m', ".\\+"},
- {'r', ".*"},
- {'p', "[- .]*"},
- {'v', "\\d\\+"},
- {'s', ".\\+"}
- };
-
- namebuf = xmalloc(CMDBUFFSIZE + 1);
- errmsg = xmalloc(CMDBUFFSIZE + 1);
- pattern = xmalloc(CMDBUFFSIZE + 1);
-
- if (efile != NULL && (fd = mch_fopen((char *)efile, "r")) == NULL) {
- EMSG2(_(e_openerrf), efile);
- goto qf_init_end;
- }
-
- if (newlist || qi->qf_curlist == qi->qf_listcount)
- /* make place for a new list */
- qf_new_list(qi, qf_title);
- else if (qi->qf_lists[qi->qf_curlist].qf_count > 0)
- /* Adding to existing list, find last entry. */
- for (qfprev = qi->qf_lists[qi->qf_curlist].qf_start;
- qfprev->qf_next != qfprev; qfprev = qfprev->qf_next)
- ;
-
- /*
- * Each part of the format string is copied and modified from errorformat to
- * regex prog. Only a few % characters are allowed.
- */
- /* Use the local value of 'errorformat' if it's set. */
- if (errorformat == p_efm && tv == NULL && *buf->b_p_efm != NUL)
- efm = buf->b_p_efm;
- else
- efm = errorformat;
- /*
- * Get some space to modify the format string into.
- */
- size_t fmtstr_size = 3 * FMT_PATTERNS + 4 * STRLEN(efm);
- for (round = FMT_PATTERNS; round > 0; ) {
- fmtstr_size += STRLEN(fmt_pat[--round].pattern);
- }
-#ifdef COLON_IN_FILENAME
- fmtstr_size += 12; // "%f" can become twelve chars longer
-#else
- fmtstr_size += 2; // "%f" can become two chars longer
-#endif
- fmtstr = xmalloc(fmtstr_size);
+// Maximum number of bytes allowed per line while reading an errorfile.
+static const size_t LINE_MAXLEN = 4096;
- while (efm[0] != NUL) {
- /*
- * Allocate a new eformat structure and put it at the end of the list
- */
- fmt_ptr = xcalloc(1, sizeof(efm_T));
- if (fmt_first == NULL) /* first one */
- fmt_first = fmt_ptr;
- else
- fmt_last->next = fmt_ptr;
- fmt_last = fmt_ptr;
-
- /*
- * Isolate one part in the 'errorformat' option
- */
- for (len = 0; efm[len] != NUL && efm[len] != ','; ++len)
- if (efm[len] == '\\' && efm[len + 1] != NUL)
- ++len;
+static struct fmtpattern
+{
+ char_u convchar;
+ char *pattern;
+} fmt_pat[FMT_PATTERNS] =
+{
+ { 'f', ".\\+" }, // only used when at end
+ { 'n', "\\d\\+" },
+ { 'l', "\\d\\+" },
+ { 'c', "\\d\\+" },
+ { 't', "." },
+ { 'm', ".\\+" },
+ { 'r', ".*" },
+ { 'p', "[- .]*" }, // NOLINT(whitespace/tab)
+ { 'v', "\\d\\+" },
+ { 's', ".\\+" }
+};
- /*
- * Build regexp pattern from current 'errorformat' option
- */
- ptr = fmtstr;
- *ptr++ = '^';
- round = 0;
- for (efmp = efm; efmp < efm + len; ++efmp) {
- if (*efmp == '%') {
- ++efmp;
- for (idx = 0; idx < FMT_PATTERNS; ++idx)
- if (fmt_pat[idx].convchar == *efmp)
- break;
- if (idx < FMT_PATTERNS) {
- if (fmt_ptr->addr[idx]) {
- sprintf((char *)errmsg,
- _("E372: Too many %%%c in format string"), *efmp);
- EMSG(errmsg);
- goto error2;
- }
- if ((idx
- && idx < 6
- && vim_strchr((char_u *)"DXOPQ",
- fmt_ptr->prefix) != NULL)
- || (idx == 6
- && vim_strchr((char_u *)"OPQ",
- fmt_ptr->prefix) == NULL)) {
- sprintf((char *)errmsg,
- _("E373: Unexpected %%%c in format string"), *efmp);
- EMSG(errmsg);
- goto error2;
- }
- fmt_ptr->addr[idx] = (char_u)++ round;
- *ptr++ = '\\';
- *ptr++ = '(';
+// Converts a 'errorformat' string to regular expression pattern
+static int efm_to_regpat(char_u *efm, int len, efm_T *fmt_ptr,
+ char_u *regpat, char_u *errmsg)
+{
+ // Build regexp pattern from current 'errorformat' option
+ char_u *ptr = regpat;
+ *ptr++ = '^';
+ int round = 0;
+ for (char_u *efmp = efm; efmp < efm + len; efmp++) {
+ if (*efmp == '%') {
+ efmp++;
+ int idx;
+ for (idx = 0; idx < FMT_PATTERNS; idx++) {
+ if (fmt_pat[idx].convchar == *efmp) {
+ break;
+ }
+ }
+ if (idx < FMT_PATTERNS) {
+ if (fmt_ptr->addr[idx]) {
+ snprintf((char *)errmsg, CMDBUFFSIZE + 1,
+ _("E372: Too many %%%c in format string"), *efmp);
+ EMSG(errmsg);
+ return -1;
+ }
+ if ((idx
+ && idx < 6
+ && vim_strchr((char_u *)"DXOPQ", fmt_ptr->prefix) != NULL)
+ || (idx == 6
+ && vim_strchr((char_u *)"OPQ", fmt_ptr->prefix) == NULL)) {
+ snprintf((char *)errmsg, CMDBUFFSIZE + 1,
+ _("E373: Unexpected %%%c in format string"), *efmp);
+ EMSG(errmsg);
+ return -1;
+ }
+ round++;
+ fmt_ptr->addr[idx] = (char_u)round;
+ *ptr++ = '\\';
+ *ptr++ = '(';
#ifdef BACKSLASH_IN_FILENAME
- if (*efmp == 'f') {
- /* Also match "c:" in the file name, even when
- * checking for a colon next: "%f:".
- * "\%(\a:\)\=" */
- STRCPY(ptr, "\\%(\\a:\\)\\=");
- ptr += 10;
- }
+ if (*efmp == 'f') {
+ // Also match "c:" in the file name, even when
+ // checking for a colon next: "%f:".
+ // "\%(\a:\)\="
+ STRCPY(ptr, "\\%(\\a:\\)\\=");
+ ptr += 10;
+ }
#endif
- if (*efmp == 'f' && efmp[1] != NUL) {
- if (efmp[1] != '\\' && efmp[1] != '%') {
- /* A file name may contain spaces, but this isn't
- * in "\f". For "%f:%l:%m" there may be a ":" in
- * the file name. Use ".\{-1,}x" instead (x is
- * the next character), the requirement that :999:
- * follows should work. */
- STRCPY(ptr, ".\\{-1,}");
- ptr += 7;
- } else {
- /* File name followed by '\\' or '%': include as
- * many file name chars as possible. */
- STRCPY(ptr, "\\f\\+");
- ptr += 4;
- }
+ if (*efmp == 'f' && efmp[1] != NUL) {
+ if (efmp[1] != '\\' && efmp[1] != '%') {
+ // A file name may contain spaces, but this isn't
+ // in "\f". For "%f:%l:%m" there may be a ":" in
+ // the file name. Use ".\{-1,}x" instead (x is
+ // the next character), the requirement that :999:
+ // follows should work.
+ STRCPY(ptr, ".\\{-1,}");
+ ptr += 7;
} else {
- srcptr = (char_u *)fmt_pat[idx].pattern;
- while ((*ptr = *srcptr++) != NUL)
- ++ptr;
+ // File name followed by '\\' or '%': include as
+ // many file name chars as possible.
+ STRCPY(ptr, "\\f\\+");
+ ptr += 4;
}
- *ptr++ = '\\';
- *ptr++ = ')';
- } else if (*efmp == '*') {
- if (*++efmp == '[' || *efmp == '\\') {
- if ((*ptr++ = *efmp) == '[') { /* %*[^a-z0-9] etc. */
- if (efmp[1] == '^')
- *ptr++ = *++efmp;
- if (efmp < efm + len) {
- *ptr++ = *++efmp; /* could be ']' */
- while (efmp < efm + len
- && (*ptr++ = *++efmp) != ']')
- /* skip */;
- if (efmp == efm + len) {
- EMSG(_("E374: Missing ] in format string"));
- goto error2;
+ } else {
+ char_u *srcptr = (char_u *)fmt_pat[idx].pattern;
+ while ((*ptr = *srcptr++) != NUL) {
+ ptr++;
+ }
+ }
+ *ptr++ = '\\';
+ *ptr++ = ')';
+ } else if (*efmp == '*') {
+ if (*++efmp == '[' || *efmp == '\\') {
+ if ((*ptr++ = *efmp) == '[') { // %*[^a-z0-9] etc.
+ if (efmp[1] == '^') {
+ *ptr++ = *++efmp;
+ }
+ if (efmp < efm + len) {
+ efmp++;
+ *ptr++ = *efmp; // could be ']'
+ while (efmp < efm + len) {
+ efmp++;
+ if ((*ptr++ = *efmp) == ']') {
+ break;
}
}
- } else if (efmp < efm + len) /* %*\D, %*\s etc. */
- *ptr++ = *++efmp;
- *ptr++ = '\\';
- *ptr++ = '+';
- } else {
- /* TODO: scanf()-like: %*ud, %*3c, %*f, ... ? */
- sprintf((char *)errmsg,
- _("E375: Unsupported %%%c in format string"), *efmp);
- EMSG(errmsg);
- goto error2;
- }
- } else if (vim_strchr((char_u *)"%\\.^$~[", *efmp) != NULL)
- *ptr++ = *efmp; /* regexp magic characters */
- else if (*efmp == '#')
- *ptr++ = '*';
- else if (*efmp == '>')
- fmt_ptr->conthere = TRUE;
- else if (efmp == efm + 1) { /* analyse prefix */
- if (vim_strchr((char_u *)"+-", *efmp) != NULL)
- fmt_ptr->flags = *efmp++;
- if (vim_strchr((char_u *)"DXAEWICZGOPQ", *efmp) != NULL)
- fmt_ptr->prefix = *efmp;
- else {
- sprintf((char *)errmsg,
- _("E376: Invalid %%%c in format string prefix"), *efmp);
- EMSG(errmsg);
- goto error2;
+ if (efmp == efm + len) {
+ EMSG(_("E374: Missing ] in format string"));
+ return -1;
+ }
+ }
+ } else if (efmp < efm + len) { // %*\D, %*\s etc.
+ efmp++;
+ *ptr++ = *efmp;
}
+ *ptr++ = '\\';
+ *ptr++ = '+';
+ } else {
+ // TODO(vim): scanf()-like: %*ud, %*3c, %*f, ... ?
+ snprintf((char *)errmsg, CMDBUFFSIZE + 1,
+ _("E375: Unsupported %%%c in format string"), *efmp);
+ EMSG(errmsg);
+ return -1;
+ }
+ } else if (vim_strchr((char_u *)"%\\.^$~[", *efmp) != NULL) {
+ *ptr++ = *efmp; // regexp magic characters
+ } else if (*efmp == '#') {
+ *ptr++ = '*';
+ } else if (*efmp == '>') {
+ fmt_ptr->conthere = true;
+ } else if (efmp == efm + 1) { // analyse prefix
+ if (vim_strchr((char_u *)"+-", *efmp) != NULL) {
+ fmt_ptr->flags = *efmp++;
+ }
+ if (vim_strchr((char_u *)"DXAEWICZGOPQ", *efmp) != NULL) {
+ fmt_ptr->prefix = *efmp;
} else {
- sprintf((char *)errmsg,
- _("E377: Invalid %%%c in format string"), *efmp);
+ snprintf((char *)errmsg, CMDBUFFSIZE + 1,
+ _("E376: Invalid %%%c in format string prefix"), *efmp);
EMSG(errmsg);
- goto error2;
+ return -1;
}
- } else { /* copy normal character */
- if (*efmp == '\\' && efmp + 1 < efm + len)
- ++efmp;
- else if (vim_strchr((char_u *)".*^$~[", *efmp) != NULL)
- *ptr++ = '\\'; /* escape regexp atoms */
- if (*efmp)
- *ptr++ = *efmp;
+ } else {
+ snprintf((char *)errmsg, CMDBUFFSIZE + 1,
+ _("E377: Invalid %%%c in format string"), *efmp);
+ EMSG(errmsg);
+ return -1;
+ }
+ } else { // copy normal character
+ if (*efmp == '\\' && efmp + 1 < efm + len) {
+ efmp++;
+ } else if (vim_strchr((char_u *)".*^$~[", *efmp) != NULL) {
+ *ptr++ = '\\'; // escape regexp atoms
+ }
+ if (*efmp) {
+ *ptr++ = *efmp;
}
}
- *ptr++ = '$';
- *ptr = NUL;
- if ((fmt_ptr->prog = vim_regcomp(fmtstr, RE_MAGIC + RE_STRING)) == NULL)
- goto error2;
- /*
- * Advance to next part
- */
- efm = skip_to_option_part(efm + len); /* skip comma and spaces */
}
- if (fmt_first == NULL) { /* nothing found */
+ *ptr++ = '$';
+ *ptr = NUL;
+
+ return 0;
+}
+
+static efm_T *fmt_start = NULL; // cached across qf_parse_line() calls
+
+static void free_efm_list(efm_T **efm_first)
+{
+ for (efm_T *efm_ptr = *efm_first; efm_ptr != NULL; efm_ptr = *efm_first) {
+ *efm_first = efm_ptr->next;
+ vim_regfree(efm_ptr->prog);
+ xfree(efm_ptr);
+ }
+
+ fmt_start = NULL;
+}
+
+// Parse 'errorformat' option
+static efm_T * parse_efm_option(char_u *efm)
+{
+ efm_T *fmt_ptr = NULL;
+ efm_T *fmt_first = NULL;
+ efm_T *fmt_last = NULL;
+ int len;
+
+ size_t errmsglen = CMDBUFFSIZE + 1;
+ char_u *errmsg = xmalloc(errmsglen);
+
+ // Get some space to modify the format string into.
+ size_t i = (FMT_PATTERNS * 3) + (STRLEN(efm) << 2);
+ for (int round = FMT_PATTERNS - 1; round >= 0; ) {
+ i += STRLEN(fmt_pat[round--].pattern);
+ }
+ i += 2; // "%f" can become two chars longer
+ char_u *fmtstr = xmalloc(i);
+
+ while (efm[0] != NUL) {
+ // Allocate a new eformat structure and put it at the end of the list
+ fmt_ptr = (efm_T *)xcalloc(1, sizeof(efm_T));
+ if (fmt_first == NULL) { // first one
+ fmt_first = fmt_ptr;
+ } else {
+ fmt_last->next = fmt_ptr;
+ }
+ fmt_last = fmt_ptr;
+
+ // Isolate one part in the 'errorformat' option
+ for (len = 0; efm[len] != NUL && efm[len] != ','; len++) {
+ if (efm[len] == '\\' && efm[len + 1] != NUL) {
+ len++;
+ }
+ }
+
+ if (efm_to_regpat(efm, len, fmt_ptr, fmtstr, errmsg) == -1) {
+ goto parse_efm_error;
+ }
+ if ((fmt_ptr->prog = vim_regcomp(fmtstr, RE_MAGIC + RE_STRING)) == NULL) {
+ goto parse_efm_error;
+ }
+ // Advance to next part
+ efm = skip_to_option_part(efm + len); // skip comma and spaces
+ }
+
+ if (fmt_first == NULL) { // nothing found
EMSG(_("E378: 'errorformat' contains no pattern"));
- goto error2;
}
- /*
- * got_int is reset here, because it was probably set when killing the
- * ":make" command, but we still want to read the errorfile then.
- */
- got_int = FALSE;
+ goto parse_efm_end;
- /* Always ignore case when looking for a matching error. */
- regmatch.rm_ic = TRUE;
+parse_efm_error:
+ free_efm_list(&fmt_first);
- if (tv != NULL) {
- if (tv->v_type == VAR_STRING)
- p_str = tv->vval.v_string;
- else if (tv->v_type == VAR_LIST)
- p_li = tv->vval.v_list->lv_first;
+parse_efm_end:
+ xfree(fmtstr);
+ xfree(errmsg);
+
+ return fmt_first;
+}
+
+static char_u *qf_grow_linebuf(qfstate_T *state, size_t newsz)
+{
+ // If the line exceeds LINE_MAXLEN exclude the last
+ // byte since it's not a NL character.
+ state->linelen = newsz > LINE_MAXLEN ? LINE_MAXLEN - 1 : newsz;
+ if (state->growbuf == NULL) {
+ state->growbuf = xmalloc(state->linelen + 1);
+ state->growbufsiz = state->linelen;
+ } else if (state->linelen > state->growbufsiz) {
+ state->growbuf = xrealloc(state->growbuf, state->linelen + 1);
+ state->growbufsiz = state->linelen;
}
+ return state->growbuf;
+}
- /*
- * Read the lines in the error file one by one.
- * Try to recognize one of the error formats in each line.
- */
- while (!got_int) {
- /* Get the next line. */
- if (fd == NULL) {
- if (tv != NULL) {
- if (tv->v_type == VAR_STRING) {
- /* Get the next line from the supplied string */
- char_u *p;
-
- if (!*p_str) /* Reached the end of the string */
- break;
+/// Get the next string (separated by newline) from state->p_str.
+static int qf_get_next_str_line(qfstate_T *state)
+{
+ // Get the next line from the supplied string
+ char_u *p_str = state->p_str;
+ char_u *p;
+ size_t len;
- p = vim_strchr(p_str, '\n');
- if (p)
- len = (int)(p - p_str + 1);
- else
- len = (int)STRLEN(p_str);
+ if (*p_str == NUL) { // Reached the end of the string
+ return QF_END_OF_INPUT;
+ }
- if (len > CMDBUFFSIZE - 2)
- STRLCPY(IObuff, p_str, CMDBUFFSIZE - 1);
- else
- STRLCPY(IObuff, p_str, len + 1);
+ p = vim_strchr(p_str, '\n');
+ if (p != NULL) {
+ len = (size_t)(p - p_str) + 1;
+ } else {
+ len = STRLEN(p_str);
+ }
+
+ if (len > IOSIZE - 2) {
+ state->linebuf = qf_grow_linebuf(state, len);
+ } else {
+ state->linebuf = IObuff;
+ state->linelen = len;
+ }
+ STRLCPY(state->linebuf, p_str, state->linelen + 1);
- p_str += len;
- } else if (tv->v_type == VAR_LIST) {
- /* Get the next line from the supplied list */
- while (p_li && p_li->li_tv.v_type != VAR_STRING)
- p_li = p_li->li_next; /* Skip non-string items */
+ // Increment using len in order to discard the rest of the line if it
+ // exceeds LINE_MAXLEN.
+ p_str += len;
+ state->p_str = p_str;
- if (!p_li) /* End of the list */
- break;
+ return QF_OK;
+}
+
+/// Get the next string from state->p_Li.
+static int qf_get_next_list_line(qfstate_T *state)
+{
+ listitem_T *p_li = state->p_li;
+ size_t len;
+
+ // Get the next line from the supplied list
+ while (p_li != NULL
+ && (TV_LIST_ITEM_TV(p_li)->v_type != VAR_STRING
+ || TV_LIST_ITEM_TV(p_li)->vval.v_string == NULL)) {
+ p_li = TV_LIST_ITEM_NEXT(state->p_list, p_li); // Skip non-string items.
+ }
+
+ if (p_li == NULL) { // End of the list.
+ state->p_li = NULL;
+ return QF_END_OF_INPUT;
+ }
+
+ len = STRLEN(TV_LIST_ITEM_TV(p_li)->vval.v_string);
+ if (len > IOSIZE - 2) {
+ state->linebuf = qf_grow_linebuf(state, len);
+ } else {
+ state->linebuf = IObuff;
+ state->linelen = len;
+ }
+
+ STRLCPY(state->linebuf, TV_LIST_ITEM_TV(p_li)->vval.v_string,
+ state->linelen + 1);
+
+ state->p_li = TV_LIST_ITEM_NEXT(state->p_list, p_li);
+ return QF_OK;
+}
+
+/// Get the next string from state->buf.
+static int qf_get_next_buf_line(qfstate_T *state)
+{
+ char_u *p_buf = NULL;
+ size_t len;
+
+ // Get the next line from the supplied buffer
+ if (state->buflnum > state->lnumlast) {
+ return QF_END_OF_INPUT;
+ }
+ p_buf = ml_get_buf(state->buf, state->buflnum, false);
+ state->buflnum += 1;
+
+ len = STRLEN(p_buf);
+ if (len > IOSIZE - 2) {
+ state->linebuf = qf_grow_linebuf(state, len);
+ } else {
+ state->linebuf = IObuff;
+ state->linelen = len;
+ }
+ STRLCPY(state->linebuf, p_buf, state->linelen + 1);
+
+ return QF_OK;
+}
+
+/// Get the next string from file state->fd.
+static int qf_get_next_file_line(qfstate_T *state)
+{
+ size_t growbuflen;
+
+retry:
+ errno = 0;
+ if (fgets((char *)IObuff, IOSIZE, state->fd) == NULL) {
+ if (errno == EINTR) {
+ goto retry;
+ }
+ return QF_END_OF_INPUT;
+ }
- len = (int)STRLEN(p_li->li_tv.vval.v_string);
- if (len > CMDBUFFSIZE - 2)
- len = CMDBUFFSIZE - 2;
+ bool discard = false;
+ state->linelen = STRLEN(IObuff);
+ if (state->linelen == IOSIZE - 1
+ && !(IObuff[state->linelen - 1] == '\n')) {
+ // The current line exceeds IObuff, continue reading using growbuf
+ // until EOL or LINE_MAXLEN bytes is read.
+ if (state->growbuf == NULL) {
+ state->growbufsiz = 2 * (IOSIZE - 1);
+ state->growbuf = xmalloc(state->growbufsiz);
+ }
- STRLCPY(IObuff, p_li->li_tv.vval.v_string, len + 1);
+ // Copy the read part of the line, excluding null-terminator
+ memcpy(state->growbuf, IObuff, IOSIZE - 1);
+ growbuflen = state->linelen;
- p_li = p_li->li_next; /* next item */
+ for (;;) {
+ errno = 0;
+ if (fgets((char *)state->growbuf + growbuflen,
+ (int)(state->growbufsiz - growbuflen), state->fd) == NULL) {
+ if (errno == EINTR) {
+ continue;
+ }
+ break;
+ }
+ state->linelen = STRLEN(state->growbuf + growbuflen);
+ growbuflen += state->linelen;
+ if (state->growbuf[growbuflen - 1] == '\n') {
+ break;
+ }
+ if (state->growbufsiz == LINE_MAXLEN) {
+ discard = true;
+ break;
+ }
+
+ state->growbufsiz = (2 * state->growbufsiz < LINE_MAXLEN)
+ ? 2 * state->growbufsiz : LINE_MAXLEN;
+ state->growbuf = xrealloc(state->growbuf, state->growbufsiz);
+ }
+
+ while (discard) {
+ // The current line is longer than LINE_MAXLEN, continue reading but
+ // discard everything until EOL or EOF is reached.
+ errno = 0;
+ if (fgets((char *)IObuff, IOSIZE, state->fd) == NULL) {
+ if (errno == EINTR) {
+ continue;
}
+ break;
+ }
+ if (STRLEN(IObuff) < IOSIZE - 1 || IObuff[IOSIZE - 1] == '\n') {
+ break;
+ }
+ }
+
+ state->linebuf = state->growbuf;
+ state->linelen = growbuflen;
+ } else {
+ state->linebuf = IObuff;
+ }
+
+ // Convert a line if it contains a non-ASCII character
+ if (state->vc.vc_type != CONV_NONE && has_non_ascii(state->linebuf)) {
+ char_u *line = string_convert(&state->vc, state->linebuf, &state->linelen);
+ if (line != NULL) {
+ if (state->linelen < IOSIZE) {
+ STRLCPY(state->linebuf, line, state->linelen + 1);
+ xfree(line);
} else {
- /* Get the next line from the supplied buffer */
- if (buflnum > lnumlast)
- break;
- STRLCPY(IObuff, ml_get_buf(buf, buflnum++, FALSE),
- CMDBUFFSIZE - 1);
+ xfree(state->growbuf);
+ state->linebuf = state->growbuf = line;
+ state->growbufsiz = state->linelen < LINE_MAXLEN
+ ? state->linelen : LINE_MAXLEN;
}
- } else if (fgets((char *)IObuff, CMDBUFFSIZE - 2, fd) == NULL)
- break;
+ }
+ }
+ return QF_OK;
+}
- IObuff[CMDBUFFSIZE - 2] = NUL; /* for very long lines */
- remove_bom(IObuff);
+/// Get the next string from a file/buffer/list/string.
+static int qf_get_nextline(qfstate_T *state)
+{
+ int status = QF_FAIL;
+
+ if (state->fd == NULL) {
+ if (state->tv != NULL) {
+ if (state->tv->v_type == VAR_STRING) {
+ // Get the next line from the supplied string
+ status = qf_get_next_str_line(state);
+ } else if (state->tv->v_type == VAR_LIST) {
+ // Get the next line from the supplied list
+ status = qf_get_next_list_line(state);
+ }
+ } else {
+ // Get the next line from the supplied buffer
+ status = qf_get_next_buf_line(state);
+ }
+ } else {
+ // Get the next line from the supplied file
+ status = qf_get_next_file_line(state);
+ }
- if ((efmp = vim_strrchr(IObuff, '\n')) != NULL)
- *efmp = NUL;
+ if (status != QF_OK) {
+ return status;
+ }
+
+ if (state->linelen > 0 && state->linebuf[state->linelen - 1] == '\n') {
+ state->linebuf[state->linelen - 1] = NUL;
#ifdef USE_CRNL
- if ((efmp = vim_strrchr(IObuff, '\r')) != NULL)
- *efmp = NUL;
+ if (state->linelen > 1 && state->linebuf[state->linelen - 2] == '\r') {
+ state->linebuf[state->linelen - 2] = NUL;
+ }
#endif
+ }
- /* If there was no %> item start at the first pattern */
- if (fmt_start == NULL)
- fmt_ptr = fmt_first;
- else {
- fmt_ptr = fmt_start;
- fmt_start = NULL;
- }
+ remove_bom(state->linebuf);
- // Try to match each part of 'errorformat' until we find a complete
- // match or no match.
- bool valid = true;
+ return QF_OK;
+}
+
+
+/// Parse a line and get the quickfix fields.
+/// Return the QF_ status.
+static int qf_parse_line(qf_info_T *qi, int qf_idx, char_u *linebuf,
+ size_t linelen, efm_T *fmt_first, qffields_T *fields)
+{
+ efm_T *fmt_ptr;
+ size_t len;
+ int i;
+ int idx = 0;
+ char_u *tail = NULL;
+ regmatch_T regmatch;
+ qf_list_T *qfl = &qi->qf_lists[qf_idx];
+
+ // Always ignore case when looking for a matching error.
+ regmatch.rm_ic = true;
+
+ // If there was no %> item start at the first pattern
+ if (fmt_start == NULL) {
+ fmt_ptr = fmt_first;
+ } else {
+ fmt_ptr = fmt_start;
+ fmt_start = NULL;
+ }
+
+ // Try to match each part of 'errorformat' until we find a complete
+ // match or no match.
+ fields->valid = true;
restofline:
- for (; fmt_ptr != NULL; fmt_ptr = fmt_ptr->next) {
- idx = fmt_ptr->prefix;
- if (multiscan && vim_strchr((char_u *)"OPQ", idx) == NULL)
+ for (; fmt_ptr != NULL; fmt_ptr = fmt_ptr->next) {
+ idx = fmt_ptr->prefix;
+ if (qfl->qf_multiscan && vim_strchr((char_u *)"OPQ", idx) == NULL) {
+ continue;
+ }
+ fields->namebuf[0] = NUL;
+ fields->pattern[0] = NUL;
+ if (!qfl->qf_multiscan) {
+ fields->errmsg[0] = NUL;
+ }
+ fields->lnum = 0;
+ fields->col = 0;
+ fields->use_viscol = false;
+ fields->enr = -1;
+ fields->type = 0;
+ tail = NULL;
+
+ regmatch.regprog = fmt_ptr->prog;
+ int r = vim_regexec(&regmatch, linebuf, (colnr_T)0);
+ fmt_ptr->prog = regmatch.regprog;
+ if (r) {
+ if ((idx == 'C' || idx == 'Z') && !qfl->qf_multiline) {
continue;
- namebuf[0] = NUL;
- pattern[0] = NUL;
- if (!multiscan)
- errmsg[0] = NUL;
- lnum = 0;
- col = 0;
- use_viscol = false;
- enr = -1;
- type = 0;
- tail = NULL;
-
- regmatch.regprog = fmt_ptr->prog;
- int r = vim_regexec(&regmatch, IObuff, (colnr_T)0);
- fmt_ptr->prog = regmatch.regprog;
- if (r) {
- if ((idx == 'C' || idx == 'Z') && !multiline) {
+ }
+ if (vim_strchr((char_u *)"EWI", idx) != NULL) {
+ fields->type = (char_u)idx;
+ } else {
+ fields->type = 0;
+ }
+ // Extract error message data from matched line.
+ // We check for an actual submatch, because "\[" and "\]" in
+ // the 'errorformat' may cause the wrong submatch to be used.
+ if ((i = (int)fmt_ptr->addr[0]) > 0) { // %f
+ if (regmatch.startp[i] == NULL || regmatch.endp[i] == NULL) {
continue;
}
- if (vim_strchr((char_u *)"EWI", idx) != NULL) {
- type = (char_u)idx;
- } else {
- type = 0;
+ // Expand ~/file and $HOME/file to full path.
+ char_u c = *regmatch.endp[i];
+ *regmatch.endp[i] = NUL;
+ expand_env(regmatch.startp[i], fields->namebuf, CMDBUFFSIZE);
+ *regmatch.endp[i] = c;
+
+ if (vim_strchr((char_u *)"OPQ", idx) != NULL
+ && !os_path_exists(fields->namebuf)) {
+ continue;
}
- // Extract error message data from matched line.
- // We check for an actual submatch, because "\[" and "\]" in
- // the 'errorformat' may cause the wrong submatch to be used.
- if ((i = (int)fmt_ptr->addr[0]) > 0) { // %f
- if (regmatch.startp[i] == NULL || regmatch.endp[i] == NULL) {
- continue;
- }
- // Expand ~/file and $HOME/file to full path.
- char_u c = *regmatch.endp[i];
- *regmatch.endp[i] = NUL;
- expand_env(regmatch.startp[i], namebuf, CMDBUFFSIZE);
- *regmatch.endp[i] = c;
-
- if (vim_strchr((char_u *)"OPQ", idx) != NULL
- && !os_path_exists(namebuf)) {
- continue;
- }
+ }
+ if ((i = (int)fmt_ptr->addr[1]) > 0) { // %n
+ if (regmatch.startp[i] == NULL) {
+ continue;
}
- if ((i = (int)fmt_ptr->addr[1]) > 0) { /* %n */
- if (regmatch.startp[i] == NULL)
- continue;
- enr = (int)atol((char *)regmatch.startp[i]);
+ fields->enr = (int)atol((char *)regmatch.startp[i]);
+ }
+ if ((i = (int)fmt_ptr->addr[2]) > 0) { // %l
+ if (regmatch.startp[i] == NULL) {
+ continue;
}
- if ((i = (int)fmt_ptr->addr[2]) > 0) { /* %l */
- if (regmatch.startp[i] == NULL)
- continue;
- lnum = atol((char *)regmatch.startp[i]);
+ fields->lnum = atol((char *)regmatch.startp[i]);
+ }
+ if ((i = (int)fmt_ptr->addr[3]) > 0) { // %c
+ if (regmatch.startp[i] == NULL) {
+ continue;
}
- if ((i = (int)fmt_ptr->addr[3]) > 0) { /* %c */
- if (regmatch.startp[i] == NULL)
- continue;
- col = (int)atol((char *)regmatch.startp[i]);
+ fields->col = (int)atol((char *)regmatch.startp[i]);
+ }
+ if ((i = (int)fmt_ptr->addr[4]) > 0) { // %t
+ if (regmatch.startp[i] == NULL) {
+ continue;
}
- if ((i = (int)fmt_ptr->addr[4]) > 0) { /* %t */
- if (regmatch.startp[i] == NULL)
- continue;
- type = *regmatch.startp[i];
+ fields->type = *regmatch.startp[i];
+ }
+ if (fmt_ptr->flags == '+' && !qfl->qf_multiscan) { // %+
+ if (linelen >= fields->errmsglen) {
+ // linelen + null terminator
+ fields->errmsg = xrealloc(fields->errmsg, linelen + 1);
+ fields->errmsglen = linelen + 1;
}
- if (fmt_ptr->flags == '+' && !multiscan) /* %+ */
- STRCPY(errmsg, IObuff);
- else if ((i = (int)fmt_ptr->addr[5]) > 0) { /* %m */
- if (regmatch.startp[i] == NULL || regmatch.endp[i] == NULL)
- continue;
- len = (int)(regmatch.endp[i] - regmatch.startp[i]);
- STRLCPY(errmsg, regmatch.startp[i], len + 1);
+ STRLCPY(fields->errmsg, linebuf, linelen + 1);
+ } else if ((i = (int)fmt_ptr->addr[5]) > 0) { // %m
+ if (regmatch.startp[i] == NULL || regmatch.endp[i] == NULL) {
+ continue;
}
- if ((i = (int)fmt_ptr->addr[6]) > 0) { /* %r */
- if (regmatch.startp[i] == NULL)
- continue;
- tail = regmatch.startp[i];
+ len = (size_t)(regmatch.endp[i] - regmatch.startp[i]);
+ if (len >= fields->errmsglen) {
+ // len + null terminator
+ fields->errmsg = xrealloc(fields->errmsg, len + 1);
+ fields->errmsglen = len + 1;
}
- if ((i = (int)fmt_ptr->addr[7]) > 0) { /* %p */
- char_u *match_ptr;
+ STRLCPY(fields->errmsg, regmatch.startp[i], len + 1);
+ }
+ if ((i = (int)fmt_ptr->addr[6]) > 0) { // %r
+ if (regmatch.startp[i] == NULL) {
+ continue;
+ }
+ tail = regmatch.startp[i];
+ }
+ if ((i = (int)fmt_ptr->addr[7]) > 0) { // %p
+ char_u *match_ptr;
- if (regmatch.startp[i] == NULL || regmatch.endp[i] == NULL)
- continue;
- col = 0;
- for (match_ptr = regmatch.startp[i];
- match_ptr != regmatch.endp[i]; ++match_ptr) {
- ++col;
- if (*match_ptr == TAB) {
- col += 7;
- col -= col % 8;
- }
+ if (regmatch.startp[i] == NULL || regmatch.endp[i] == NULL) {
+ continue;
+ }
+ fields->col = 0;
+ for (match_ptr = regmatch.startp[i];
+ match_ptr != regmatch.endp[i]; match_ptr++) {
+ fields->col++;
+ if (*match_ptr == TAB) {
+ fields->col += 7;
+ fields->col -= fields->col % 8;
}
- col++;
- use_viscol = true;
}
- if ((i = (int)fmt_ptr->addr[8]) > 0) { /* %v */
- if (regmatch.startp[i] == NULL)
- continue;
- col = (int)atol((char *)regmatch.startp[i]);
- use_viscol = true;
+ fields->col++;
+ fields->use_viscol = true;
+ }
+ if ((i = (int)fmt_ptr->addr[8]) > 0) { // %v
+ if (regmatch.startp[i] == NULL) {
+ continue;
}
- if ((i = (int)fmt_ptr->addr[9]) > 0) { /* %s */
- if (regmatch.startp[i] == NULL || regmatch.endp[i] == NULL)
- continue;
- len = (int)(regmatch.endp[i] - regmatch.startp[i]);
- if (len > CMDBUFFSIZE - 5)
- len = CMDBUFFSIZE - 5;
- STRCPY(pattern, "^\\V");
- STRNCAT(pattern, regmatch.startp[i], len);
- pattern[len + 3] = '\\';
- pattern[len + 4] = '$';
- pattern[len + 5] = NUL;
+ fields->col = (int)atol((char *)regmatch.startp[i]);
+ fields->use_viscol = true;
+ }
+ if ((i = (int)fmt_ptr->addr[9]) > 0) { // %s
+ if (regmatch.startp[i] == NULL || regmatch.endp[i] == NULL) {
+ continue;
}
- break;
+ len = (size_t)(regmatch.endp[i] - regmatch.startp[i]);
+ if (len > CMDBUFFSIZE - 5) {
+ len = CMDBUFFSIZE - 5;
+ }
+ STRCPY(fields->pattern, "^\\V");
+ xstrlcat((char *)fields->pattern, (char *)regmatch.startp[i],
+ CMDBUFFSIZE+1);
+ fields->pattern[len + 3] = '\\';
+ fields->pattern[len + 4] = '$';
+ fields->pattern[len + 5] = NUL;
}
+ break;
}
- multiscan = false;
-
- if (fmt_ptr == NULL || idx == 'D' || idx == 'X') {
- if (fmt_ptr != NULL) {
- if (idx == 'D') { /* enter directory */
- if (*namebuf == NUL) {
- EMSG(_("E379: Missing or empty directory name"));
- goto error2;
- }
- if ((directory = qf_push_dir(namebuf, &dir_stack)) == NULL)
- goto error2;
- } else if (idx == 'X') /* leave directory */
- directory = qf_pop_dir(&dir_stack);
+ }
+ qfl->qf_multiscan = false;
+
+ if (fmt_ptr == NULL || idx == 'D' || idx == 'X') {
+ if (fmt_ptr != NULL) {
+ if (idx == 'D') { // enter directory
+ if (*fields->namebuf == NUL) {
+ EMSG(_("E379: Missing or empty directory name"));
+ return QF_FAIL;
+ }
+ qfl->qf_directory = qf_push_dir(fields->namebuf, &qfl->qf_dir_stack,
+ false);
+ if (qfl->qf_directory == NULL) {
+ return QF_FAIL;
+ }
+ } else if (idx == 'X') { // leave directory
+ qfl->qf_directory = qf_pop_dir(&qfl->qf_dir_stack);
}
- namebuf[0] = NUL; // no match found, remove file name
- lnum = 0; // don't jump to this line
- valid = false;
- STRCPY(errmsg, IObuff); // copy whole line to error message
- if (fmt_ptr == NULL) {
- multiline = multiignore = false;
- }
- } else if (fmt_ptr != NULL) {
- /* honor %> item */
- if (fmt_ptr->conthere)
- fmt_start = fmt_ptr;
-
- if (vim_strchr((char_u *)"AEWI", idx) != NULL) {
- multiline = true; // start of a multi-line message
- multiignore = false; // reset continuation
- } else if (vim_strchr((char_u *)"CZ", idx)
- != NULL) { /* continuation of multi-line msg */
- if (qfprev == NULL)
- goto error2;
- if (*errmsg && !multiignore) {
- size_t len = STRLEN(qfprev->qf_text);
- qfprev->qf_text = xrealloc(qfprev->qf_text, len + STRLEN(errmsg) + 2);
- qfprev->qf_text[len] = '\n';
- STRCPY(qfprev->qf_text + len + 1, errmsg);
- }
- if (qfprev->qf_nr == -1)
- qfprev->qf_nr = enr;
- if (vim_isprintc(type) && !qfprev->qf_type)
- qfprev->qf_type = type; /* only printable chars allowed */
- if (!qfprev->qf_lnum)
- qfprev->qf_lnum = lnum;
- if (!qfprev->qf_col)
- qfprev->qf_col = col;
- qfprev->qf_viscol = use_viscol;
- if (!qfprev->qf_fnum)
- qfprev->qf_fnum = qf_get_fnum(directory,
- *namebuf
- || directory ? namebuf : currfile
- && valid ? currfile : 0);
- if (idx == 'Z') {
- multiline = multiignore = false;
+ }
+ fields->namebuf[0] = NUL; // no match found, remove file name
+ fields->lnum = 0; // don't jump to this line
+ fields->valid = false;
+ if (linelen >= fields->errmsglen) {
+ // linelen + null terminator
+ fields->errmsg = xrealloc(fields->errmsg, linelen + 1);
+ fields->errmsglen = linelen + 1;
+ }
+ // copy whole line to error message
+ STRLCPY(fields->errmsg, linebuf, linelen + 1);
+ if (fmt_ptr == NULL) {
+ qfl->qf_multiline = qfl->qf_multiignore = false;
+ }
+ } else {
+ // honor %> item
+ if (fmt_ptr->conthere) {
+ fmt_start = fmt_ptr;
+ }
+
+ if (vim_strchr((char_u *)"AEWI", idx) != NULL) {
+ qfl->qf_multiline = true; // start of a multi-line message
+ qfl->qf_multiignore = false; // reset continuation
+ } else if (vim_strchr((char_u *)"CZ", idx)
+ != NULL) { // continuation of multi-line msg
+ if (!qfl->qf_multiignore) {
+ qfline_T *qfprev = qfl->qf_last;
+ if (qfprev == NULL) {
+ return QF_FAIL;
}
- line_breakcheck();
- continue;
- } else if (vim_strchr((char_u *)"OPQ", idx) != NULL) {
- // global file names
- valid = false;
- if (*namebuf == NUL || os_path_exists(namebuf)) {
- if (*namebuf && idx == 'P') {
- currfile = qf_push_dir(namebuf, &file_stack);
- } else if (idx == 'Q') {
- currfile = qf_pop_dir(&file_stack);
- }
- *namebuf = NUL;
- if (tail && *tail) {
- STRMOVE(IObuff, skipwhite(tail));
- multiscan = true;
- goto restofline;
- }
+ if (*fields->errmsg) {
+ size_t textlen = STRLEN(qfprev->qf_text);
+ qfprev->qf_text = xrealloc(qfprev->qf_text,
+ textlen + STRLEN(fields->errmsg) + 2);
+ qfprev->qf_text[textlen] = '\n';
+ STRCPY(qfprev->qf_text + textlen + 1, fields->errmsg);
+ }
+ if (qfprev->qf_nr == -1) {
+ qfprev->qf_nr = fields->enr;
+ }
+ if (vim_isprintc(fields->type) && !qfprev->qf_type) {
+ qfprev->qf_type = fields->type; // only printable chars allowed
+ }
+ if (!qfprev->qf_lnum) {
+ qfprev->qf_lnum = fields->lnum;
+ }
+ if (!qfprev->qf_col) {
+ qfprev->qf_col = fields->col;
}
+ qfprev->qf_viscol = fields->use_viscol;
+ if (!qfprev->qf_fnum) {
+ qfprev->qf_fnum = qf_get_fnum(qi, qf_idx, qfl->qf_directory,
+ *fields->namebuf || qfl->qf_directory
+ ? fields->namebuf
+ : qfl->qf_currfile && fields->valid
+ ? qfl->qf_currfile : 0);
+ }
+ }
+ if (idx == 'Z') {
+ qfl->qf_multiline = qfl->qf_multiignore = false;
}
- if (fmt_ptr->flags == '-') { // generally exclude this line
- if (multiline) {
- multiignore = true; // also exclude continuation lines
+
+ line_breakcheck();
+ return QF_IGNORE_LINE;
+ } else if (vim_strchr((char_u *)"OPQ", idx) != NULL) {
+ // global file names
+ fields->valid = false;
+ if (*fields->namebuf == NUL || os_path_exists(fields->namebuf)) {
+ if (*fields->namebuf && idx == 'P') {
+ qfl->qf_currfile = qf_push_dir(fields->namebuf, &qfl->qf_file_stack,
+ true);
+ } else if (idx == 'Q') {
+ qfl->qf_currfile = qf_pop_dir(&qfl->qf_file_stack);
}
- continue;
+ *fields->namebuf = NUL;
+ if (tail && *tail) {
+ STRMOVE(IObuff, skipwhite(tail));
+ qfl->qf_multiscan = true;
+ goto restofline;
+ }
+ }
+ }
+ if (fmt_ptr->flags == '-') { // generally exclude this line
+ if (qfl->qf_multiline) {
+ // also exclude continuation lines
+ qfl->qf_multiignore = true;
}
+ return QF_IGNORE_LINE;
+ }
+ }
+
+ return QF_OK;
+}
+
+// Read the errorfile "efile" into memory, line by line, building the error
+// list.
+// Alternative: when "efile" is NULL read errors from buffer "buf".
+// Alternative: when "tv" is not NULL get errors from the string or list.
+// Always use 'errorformat' from "buf" if there is a local value.
+// Then "lnumfirst" and "lnumlast" specify the range of lines to use.
+// Set the title of the list to "qf_title".
+// Return -1 for error, number of errors for success.
+static int
+qf_init_ext(
+ qf_info_T *qi,
+ int qf_idx,
+ char_u *efile,
+ buf_T *buf,
+ typval_T *tv,
+ char_u *errorformat,
+ int newlist, // TRUE: start a new error list
+ linenr_T lnumfirst, // first line number to use
+ linenr_T lnumlast, // last line number to use
+ char_u *qf_title,
+ char_u *enc
+)
+{
+ qfstate_T state;
+ qffields_T fields;
+ qfline_T *old_last = NULL;
+ bool adding = false;
+ static efm_T *fmt_first = NULL;
+ char_u *efm;
+ static char_u *last_efm = NULL;
+ int retval = -1; // default: return error flag
+ int status;
+
+ // Do not used the cached buffer, it may have been wiped out.
+ xfree(qf_last_bufname);
+ qf_last_bufname = NULL;
+
+ memset(&state, 0, sizeof(state));
+ memset(&fields, 0, sizeof(fields));
+ state.vc.vc_type = CONV_NONE;
+ if (enc != NULL && *enc != NUL) {
+ convert_setup(&state.vc, enc, p_enc);
+ }
+
+ fields.namebuf = xmalloc(CMDBUFFSIZE + 1);
+ fields.errmsglen = CMDBUFFSIZE + 1;
+ fields.errmsg = xmalloc(fields.errmsglen);
+ fields.pattern = xmalloc(CMDBUFFSIZE + 1);
+
+ if (efile != NULL && (state.fd = mch_fopen((char *)efile, "r")) == NULL) {
+ EMSG2(_(e_openerrf), efile);
+ goto qf_init_end;
+ }
+
+ if (newlist || qf_idx == qi->qf_listcount) {
+ // make place for a new list
+ qf_new_list(qi, qf_title);
+ qf_idx = qi->qf_curlist;
+ } else {
+ // Adding to existing list, use last entry.
+ adding = true;
+ if (qi->qf_lists[qf_idx].qf_count > 0) {
+ old_last = qi->qf_lists[qf_idx].qf_last;
+ }
+ }
+
+ qf_list_T *qfl = &qi->qf_lists[qf_idx];
+
+ // Use the local value of 'errorformat' if it's set.
+ if (errorformat == p_efm && tv == NULL && buf && *buf->b_p_efm != NUL) {
+ efm = buf->b_p_efm;
+ } else {
+ efm = errorformat;
+ }
+
+ // If the errorformat didn't change between calls, then reuse the previously
+ // parsed values.
+ if (last_efm == NULL || (STRCMP(last_efm, efm) != 0)) {
+ // free the previously parsed data
+ xfree(last_efm);
+ last_efm = NULL;
+ free_efm_list(&fmt_first);
+
+ // parse the current 'efm'
+ fmt_first = parse_efm_option(efm);
+ if (fmt_first != NULL) {
+ last_efm = vim_strsave(efm);
+ }
+ }
+
+ if (fmt_first == NULL) { // nothing found
+ goto error2;
+ }
+
+ /*
+ * got_int is reset here, because it was probably set when killing the
+ * ":make" command, but we still want to read the errorfile then.
+ */
+ got_int = FALSE;
+
+ if (tv != NULL) {
+ if (tv->v_type == VAR_STRING) {
+ state.p_str = tv->vval.v_string;
+ } else if (tv->v_type == VAR_LIST) {
+ state.p_list = tv->vval.v_list;
+ state.p_li = tv_list_first(tv->vval.v_list);
+ }
+ state.tv = tv;
+ }
+ state.buf = buf;
+ state.buflnum = lnumfirst;
+ state.lnumlast = lnumlast;
+
+ /*
+ * Read the lines in the error file one by one.
+ * Try to recognize one of the error formats in each line.
+ */
+ while (!got_int) {
+ // Get the next line from a file/buffer/list/string
+ status = qf_get_nextline(&state);
+ if (status == QF_END_OF_INPUT) { // end of input
+ break;
+ }
+
+ status = qf_parse_line(qi, qf_idx, state.linebuf, state.linelen,
+ fmt_first, &fields);
+ if (status == QF_FAIL) {
+ goto error2;
+ }
+ if (status == QF_IGNORE_LINE) {
+ continue;
}
- if (qf_add_entry(qi, &qfprev,
- directory,
- (*namebuf || directory)
- ? namebuf
- : ((currfile && valid) ? currfile : (char_u *)NULL),
- 0,
- errmsg,
- lnum,
- col,
- use_viscol,
- pattern,
- enr,
- type,
- valid) == FAIL)
+ if (qf_add_entry(qi,
+ qf_idx,
+ qfl->qf_directory,
+ (*fields.namebuf || qfl->qf_directory)
+ ? fields.namebuf : ((qfl->qf_currfile && fields.valid)
+ ? qfl->qf_currfile : (char_u *)NULL),
+ 0,
+ fields.errmsg,
+ fields.lnum,
+ fields.col,
+ fields.use_viscol,
+ fields.pattern,
+ fields.enr,
+ fields.type,
+ fields.valid) == FAIL) {
goto error2;
+ }
line_breakcheck();
}
- if (fd == NULL || !ferror(fd)) {
- if (qi->qf_lists[qi->qf_curlist].qf_index == 0) {
- /* no valid entry found */
- qi->qf_lists[qi->qf_curlist].qf_ptr =
- qi->qf_lists[qi->qf_curlist].qf_start;
- qi->qf_lists[qi->qf_curlist].qf_index = 1;
- qi->qf_lists[qi->qf_curlist].qf_nonevalid = TRUE;
+ if (state.fd == NULL || !ferror(state.fd)) {
+ if (qfl->qf_index == 0) {
+ // no valid entry found
+ qfl->qf_ptr = qfl->qf_start;
+ qfl->qf_index = 1;
+ qfl->qf_nonevalid = true;
} else {
- qi->qf_lists[qi->qf_curlist].qf_nonevalid = FALSE;
- if (qi->qf_lists[qi->qf_curlist].qf_ptr == NULL)
- qi->qf_lists[qi->qf_curlist].qf_ptr =
- qi->qf_lists[qi->qf_curlist].qf_start;
+ qfl->qf_nonevalid = false;
+ if (qfl->qf_ptr == NULL) {
+ qfl->qf_ptr = qfl->qf_start;
+ }
}
- /* return number of matches */
- retval = qi->qf_lists[qi->qf_curlist].qf_count;
- goto qf_init_ok;
+ // return number of matches
+ retval = qfl->qf_count;
+ goto qf_init_end;
}
EMSG(_(e_readerrf));
error2:
- qf_free(qi, qi->qf_curlist);
- qi->qf_listcount--;
- if (qi->qf_curlist > 0)
- --qi->qf_curlist;
-qf_init_ok:
- if (fd != NULL)
- fclose(fd);
- for (fmt_ptr = fmt_first; fmt_ptr != NULL; fmt_ptr = fmt_first) {
- fmt_first = fmt_ptr->next;
- vim_regfree(fmt_ptr->prog);
- xfree(fmt_ptr);
- }
- qf_clean_dir_stack(&dir_stack);
- qf_clean_dir_stack(&file_stack);
+ if (!adding) {
+ // Error when creating a new list. Free the new list
+ qf_free(qi, qi->qf_curlist);
+ qi->qf_listcount--;
+ if (qi->qf_curlist > 0) {
+ qi->qf_curlist--;
+ }
+ }
qf_init_end:
- xfree(namebuf);
- xfree(errmsg);
- xfree(pattern);
- xfree(fmtstr);
+ if (state.fd != NULL) {
+ fclose(state.fd);
+ }
+ xfree(fields.namebuf);
+ xfree(fields.errmsg);
+ xfree(fields.pattern);
+ xfree(state.growbuf);
- qf_update_buffer(qi);
+ if (qf_idx == qi->qf_curlist) {
+ qf_update_buffer(qi, old_last);
+ }
+
+ if (state.vc.vc_type != CONV_NONE) {
+ convert_setup(&state.vc, NULL, NULL);
+ }
return retval;
}
-static void qf_store_title(qf_info_T *qi, char_u *title)
+static void qf_store_title(qf_info_T *qi, int qf_idx, char_u *title)
{
+ xfree(qi->qf_lists[qf_idx].qf_title);
+ qi->qf_lists[qf_idx].qf_title = NULL;
+
if (title != NULL) {
- char_u *p = xmalloc(STRLEN(title) + 2);
+ size_t len = STRLEN(title) + 1;
+ char_u *p = xmallocz(len);
- qi->qf_lists[qi->qf_curlist].qf_title = p;
- sprintf((char *)p, ":%s", (char *)title);
+ qi->qf_lists[qf_idx].qf_title = p;
+ snprintf((char *)p, len + 1, ":%s", (char *)title);
}
}
-/*
- * Prepare for adding a new quickfix list.
- */
+// Prepare for adding a new quickfix list. If the current list is in the
+// middle of the stack, then all the following lists are freed and then
+// the new list is added.
static void qf_new_list(qf_info_T *qi, char_u *qf_title)
{
int i;
@@ -825,7 +1225,8 @@ static void qf_new_list(qf_info_T *qi, char_u *qf_title)
} else
qi->qf_curlist = qi->qf_listcount++;
memset(&qi->qf_lists[qi->qf_curlist], 0, (size_t)(sizeof(qf_list_T)));
- qf_store_title(qi, qf_title);
+ qf_store_title(qi, qi->qf_curlist, qf_title);
+ qi->qf_lists[qi->qf_curlist].qf_id = ++last_qf_id;
}
/*
@@ -868,7 +1269,7 @@ void qf_free_all(win_T *wp)
/// Add an entry to the end of the list of errors.
///
/// @param qi quickfix list
-/// @param prevp nonnull pointer (to previously added entry or NULL)
+/// @param qf_idx list index
/// @param dir optional directory name
/// @param fname file name or NULL
/// @param bufnum buffer number or zero
@@ -882,17 +1283,25 @@ void qf_free_all(win_T *wp)
/// @param valid valid entry
///
/// @returns OK or FAIL.
-static int qf_add_entry(qf_info_T *qi, qfline_T **prevp, char_u *dir,
- char_u *fname, int bufnum, char_u *mesg, long lnum,
- int col, char_u vis_col, char_u *pattern, int nr,
- char_u type, char_u valid)
+static int qf_add_entry(qf_info_T *qi, int qf_idx, char_u *dir, char_u *fname,
+ int bufnum, char_u *mesg, long lnum, int col,
+ char_u vis_col, char_u *pattern, int nr, char_u type,
+ char_u valid)
{
qfline_T *qfp = xmalloc(sizeof(qfline_T));
+ qfline_T **lastp; // pointer to qf_last or NULL
+
+ if (bufnum != 0) {
+ buf_T *buf = buflist_findnr(bufnum);
- if (bufnum != 0)
qfp->qf_fnum = bufnum;
- else
- qfp->qf_fnum = qf_get_fnum(dir, fname);
+ if (buf != NULL) {
+ buf->b_has_qf_entry |=
+ (qi == &ql_info) ? BUF_HAS_QF_ENTRY : BUF_HAS_LL_ENTRY;
+ }
+ } else {
+ qfp->qf_fnum = qf_get_fnum(qi, qf_idx, dir, fname);
+ }
qfp->qf_text = vim_strsave(mesg);
qfp->qf_lnum = lnum;
qfp->qf_col = col;
@@ -905,27 +1314,29 @@ static int qf_add_entry(qf_info_T *qi, qfline_T **prevp, char_u *dir,
qfp->qf_nr = nr;
if (type != 1 && !vim_isprintc(type)) /* only printable chars allowed */
type = 0;
- qfp->qf_type = type;
+ qfp->qf_type = (char_u)type;
qfp->qf_valid = valid;
- if (qi->qf_lists[qi->qf_curlist].qf_count == 0) {
- /* first element in the list */
- qi->qf_lists[qi->qf_curlist].qf_start = qfp;
- qfp->qf_prev = qfp; /* first element points to itself */
+ lastp = &qi->qf_lists[qf_idx].qf_last;
+ if (qi->qf_lists[qf_idx].qf_count == 0) {
+ // first element in the list
+ qi->qf_lists[qf_idx].qf_start = qfp;
+ qi->qf_lists[qf_idx].qf_ptr = qfp;
+ qi->qf_lists[qf_idx].qf_index = 0;
+ qfp->qf_prev = NULL;
} else {
- assert(*prevp);
- qfp->qf_prev = *prevp;
- (*prevp)->qf_next = qfp;
+ assert(*lastp);
+ qfp->qf_prev = *lastp;
+ (*lastp)->qf_next = qfp;
}
- qfp->qf_next = qfp; /* last element points to itself */
- qfp->qf_cleared = FALSE;
- *prevp = qfp;
- ++qi->qf_lists[qi->qf_curlist].qf_count;
- if (qi->qf_lists[qi->qf_curlist].qf_index == 0 && qfp->qf_valid) {
- /* first valid entry */
- qi->qf_lists[qi->qf_curlist].qf_index =
- qi->qf_lists[qi->qf_curlist].qf_count;
- qi->qf_lists[qi->qf_curlist].qf_ptr = qfp;
+ qfp->qf_next = NULL;
+ qfp->qf_cleared = false;
+ *lastp = qfp;
+ qi->qf_lists[qf_idx].qf_count++;
+ if (qi->qf_lists[qf_idx].qf_index == 0 && qfp->qf_valid) {
+ // first valid entry
+ qi->qf_lists[qf_idx].qf_index = qi->qf_lists[qf_idx].qf_count;
+ qi->qf_lists[qf_idx].qf_ptr = qfp;
}
return OK;
@@ -1005,31 +1416,41 @@ void copy_loclist(win_T *from, win_T *to)
to_qfl->qf_count = 0;
to_qfl->qf_index = 0;
to_qfl->qf_start = NULL;
+ to_qfl->qf_last = NULL;
to_qfl->qf_ptr = NULL;
if (from_qfl->qf_title != NULL)
to_qfl->qf_title = vim_strsave(from_qfl->qf_title);
else
to_qfl->qf_title = NULL;
+ if (from_qfl->qf_ctx != NULL) {
+ to_qfl->qf_ctx = xcalloc(1, sizeof(typval_T));
+ tv_copy(from_qfl->qf_ctx, to_qfl->qf_ctx);
+ } else {
+ to_qfl->qf_ctx = NULL;
+ }
+
if (from_qfl->qf_count) {
qfline_T *from_qfp;
- qfline_T *prevp = NULL;
-
- /* copy all the location entries in this list */
- for (i = 0, from_qfp = from_qfl->qf_start; i < from_qfl->qf_count;
- ++i, from_qfp = from_qfp->qf_next) {
- if (qf_add_entry(to->w_llist, &prevp,
- NULL,
- NULL,
- 0,
- from_qfp->qf_text,
- from_qfp->qf_lnum,
- from_qfp->qf_col,
- from_qfp->qf_viscol,
- from_qfp->qf_pattern,
- from_qfp->qf_nr,
- 0,
- from_qfp->qf_valid) == FAIL) {
+ qfline_T *prevp;
+
+ // copy all the location entries in this list
+ for (i = 0, from_qfp = from_qfl->qf_start;
+ i < from_qfl->qf_count && from_qfp != NULL;
+ i++, from_qfp = from_qfp->qf_next) {
+ if (qf_add_entry(to->w_llist,
+ to->w_llist->qf_curlist,
+ NULL,
+ NULL,
+ 0,
+ from_qfp->qf_text,
+ from_qfp->qf_lnum,
+ from_qfp->qf_col,
+ from_qfp->qf_viscol,
+ from_qfp->qf_pattern,
+ from_qfp->qf_nr,
+ 0,
+ from_qfp->qf_valid) == FAIL) {
qf_free_all(to);
return;
}
@@ -1038,15 +1459,20 @@ void copy_loclist(win_T *from, win_T *to)
* directory and file names are not supplied. So the qf_fnum
* field is copied here.
*/
- prevp->qf_fnum = from_qfp->qf_fnum; /* file number */
- prevp->qf_type = from_qfp->qf_type; /* error type */
- if (from_qfl->qf_ptr == from_qfp)
- to_qfl->qf_ptr = prevp; /* current location */
+ prevp = to->w_llist->qf_lists[to->w_llist->qf_curlist].qf_last;
+ prevp->qf_fnum = from_qfp->qf_fnum; // file number
+ prevp->qf_type = from_qfp->qf_type; // error type
+ if (from_qfl->qf_ptr == from_qfp) {
+ to_qfl->qf_ptr = prevp; // current location
+ }
}
}
to_qfl->qf_index = from_qfl->qf_index; /* current index in the list */
+ // Assign a new ID for the location list
+ to_qfl->qf_id = ++last_qf_id;
+
/* When no valid entries are present in the list, qf_ptr points to
* the first item in the list */
if (to_qfl->qf_nonevalid) {
@@ -1058,52 +1484,68 @@ void copy_loclist(win_T *from, win_T *to)
to->w_llist->qf_curlist = qi->qf_curlist; /* current list */
}
-/*
- * get buffer number for file "dir.name"
- */
-static int qf_get_fnum(char_u *directory, char_u *fname)
+// Get buffer number for file "directory/fname".
+// Also sets the b_has_qf_entry flag.
+static int qf_get_fnum(qf_info_T *qi, int qf_idx, char_u *directory,
+ char_u *fname)
{
- if (fname == NULL || *fname == NUL) /* no file name */
+ char_u *ptr = NULL;
+ char_u *bufname;
+ buf_T *buf;
+ if (fname == NULL || *fname == NUL) { // no file name
return 0;
- {
- char_u *ptr;
- int fnum;
+ }
#ifdef BACKSLASH_IN_FILENAME
- if (directory != NULL)
- slash_adjust(directory);
- slash_adjust(fname);
+ if (directory != NULL) {
+ slash_adjust(directory);
+ }
+ slash_adjust(fname);
#endif
- if (directory != NULL && !vim_isAbsName(fname)) {
- ptr = (char_u *)concat_fnames((char *)directory, (char *)fname, TRUE);
- /*
- * Here we check if the file really exists.
- * This should normally be true, but if make works without
- * "leaving directory"-messages we might have missed a
- * directory change.
- */
- if (!os_path_exists(ptr)) {
- xfree(ptr);
- directory = qf_guess_filepath(fname);
- if (directory)
- ptr = (char_u *)concat_fnames((char *)directory, (char *)fname, TRUE);
- else
- ptr = vim_strsave(fname);
- }
- /* Use concatenated directory name and file name */
- fnum = buflist_add(ptr, 0);
+ if (directory != NULL && !vim_isAbsName(fname)) {
+ ptr = (char_u *)concat_fnames((char *)directory, (char *)fname, true);
+ // Here we check if the file really exists.
+ // This should normally be true, but if make works without
+ // "leaving directory"-messages we might have missed a
+ // directory change.
+ if (!os_path_exists(ptr)) {
xfree(ptr);
- return fnum;
+ directory = qf_guess_filepath(qi, qf_idx, fname);
+ if (directory) {
+ ptr = (char_u *)concat_fnames((char *)directory, (char *)fname, true);
+ } else {
+ ptr = vim_strsave(fname);
+ }
}
- return buflist_add(fname, 0);
+ // Use concatenated directory name and file name.
+ bufname = ptr;
+ } else {
+ bufname = fname;
+ }
+
+ if (qf_last_bufname != NULL
+ && STRCMP(bufname, qf_last_bufname) == 0
+ && bufref_valid(&qf_last_bufref)) {
+ buf = qf_last_bufref.br_buf;
+ xfree(ptr);
+ } else {
+ xfree(qf_last_bufname);
+ buf = buflist_new(bufname, NULL, (linenr_T)0, BLN_NOOPT);
+ qf_last_bufname = (bufname == ptr) ? bufname : vim_strsave(bufname);
+ set_bufref(&qf_last_bufref, buf);
+ }
+ if (buf == NULL) {
+ return 0;
}
+ buf->b_has_qf_entry =
+ (qi == &ql_info) ? BUF_HAS_QF_ENTRY : BUF_HAS_LL_ENTRY;
+ return buf->b_fnum;
}
-/*
- * push dirbuf onto the directory stack and return pointer to actual dir or
- * NULL on error
- */
-static char_u *qf_push_dir(char_u *dirbuf, struct dir_stack_T **stackptr)
+// Push dirbuf onto the directory stack and return pointer to actual dir or
+// NULL on error.
+static char_u *qf_push_dir(char_u *dirbuf, struct dir_stack_T **stackptr,
+ bool is_file_stack)
{
struct dir_stack_T *ds_ptr;
@@ -1116,7 +1558,7 @@ static char_u *qf_push_dir(char_u *dirbuf, struct dir_stack_T **stackptr)
/* store directory on the stack */
if (vim_isAbsName(dirbuf)
|| (*stackptr)->next == NULL
- || (*stackptr && dir_stack != *stackptr))
+ || (*stackptr && is_file_stack))
(*stackptr)->dirname = vim_strsave(dirbuf);
else {
/* Okay we don't have an absolute path.
@@ -1218,17 +1660,19 @@ static void qf_clean_dir_stack(struct dir_stack_T **stackptr)
* Then qf_push_dir thinks we are in ./aa/bb, but we are in ./bb.
* qf_guess_filepath will return NULL.
*/
-static char_u *qf_guess_filepath(char_u *filename)
+static char_u *qf_guess_filepath(qf_info_T *qi, int qf_idx, char_u *filename)
{
struct dir_stack_T *ds_ptr;
struct dir_stack_T *ds_tmp;
char_u *fullname;
+ qf_list_T *qfl = &qi->qf_lists[qf_idx];
- /* no dirs on the stack - there's nothing we can do */
- if (dir_stack == NULL)
+ // no dirs on the stack - there's nothing we can do
+ if (qfl->qf_dir_stack == NULL) {
return NULL;
+ }
- ds_ptr = dir_stack->next;
+ ds_ptr = qfl->qf_dir_stack->next;
fullname = NULL;
while (ds_ptr) {
xfree(fullname);
@@ -1243,16 +1687,41 @@ static char_u *qf_guess_filepath(char_u *filename)
xfree(fullname);
- /* clean up all dirs we already left */
- while (dir_stack->next != ds_ptr) {
- ds_tmp = dir_stack->next;
- dir_stack->next = dir_stack->next->next;
+ // clean up all dirs we already left
+ while (qfl->qf_dir_stack->next != ds_ptr) {
+ ds_tmp = qfl->qf_dir_stack->next;
+ qfl->qf_dir_stack->next = qfl->qf_dir_stack->next->next;
xfree(ds_tmp->dirname);
xfree(ds_tmp);
}
- return ds_ptr==NULL ? NULL : ds_ptr->dirname;
+ return ds_ptr == NULL ? NULL : ds_ptr->dirname;
+}
+
+/// When loading a file from the quickfix, the auto commands may modify it.
+/// This may invalidate the current quickfix entry. This function checks
+/// whether a entry is still present in the quickfix.
+/// Similar to location list.
+static bool is_qf_entry_present(qf_info_T *qi, qfline_T *qf_ptr)
+{
+ qf_list_T *qfl;
+ qfline_T *qfp;
+ int i;
+
+ qfl = &qi->qf_lists[qi->qf_curlist];
+ // Search for the entry in the current list
+ for (i = 0, qfp = qfl->qf_start; i < qfl->qf_count; i++, qfp = qfp->qf_next) {
+ if (qfp == NULL || qfp == qf_ptr) {
+ break;
+ }
+ }
+
+ if (i == qfl->qf_count) { // Entry is not found
+ return false;
+ }
+
+ return true;
}
/*
@@ -1290,7 +1759,7 @@ void qf_jump(qf_info_T *qi, int dir, int errornr, int forceit)
win_T *oldwin = curwin;
int print_message = TRUE;
int len;
- int old_KeyTyped = KeyTyped; /* getting file may reset it */
+ const bool old_KeyTyped = KeyTyped; // getting file may reset it
int ok = OK;
bool usable_win;
@@ -1376,12 +1845,12 @@ void qf_jump(qf_info_T *qi, int dir, int errornr, int forceit)
/*
* For ":helpgrep" find a help window or open one.
*/
- if (qf_ptr->qf_type == 1 && (!curwin->w_buffer->b_help || cmdmod.tab != 0)) {
+ if (qf_ptr->qf_type == 1 && (!bt_help(curwin->w_buffer) || cmdmod.tab != 0)) {
win_T *wp = NULL;
if (cmdmod.tab == 0) {
FOR_ALL_WINDOWS_IN_TAB(wp2, curtab) {
- if (wp2->w_buffer != NULL && wp2->w_buffer->b_help) {
+ if (bt_help(wp2->w_buffer)) {
wp = wp2;
break;
}
@@ -1478,7 +1947,7 @@ win_found:
* If there is only one window and it is the quickfix window, create a
* new one above the quickfix window.
*/
- if (((firstwin == lastwin) && bt_quickfix(curbuf)) || !usable_win) {
+ if ((ONE_WINDOW && bt_quickfix(curbuf)) || !usable_win) {
flags = WSP_ABOVE;
if (ll_ref != NULL)
flags |= WSP_NEWLOC;
@@ -1586,14 +2055,29 @@ win_found:
oldwin == curwin ? curwin : NULL);
}
} else {
+ int old_qf_curlist = qi->qf_curlist;
+ bool is_abort = false;
+
ok = buflist_getfile(qf_ptr->qf_fnum, (linenr_T)1,
GETF_SETMARK | GETF_SWITCH, forceit);
- if (qi != &ql_info && !win_valid(oldwin)) {
+ if (qi != &ql_info && !win_valid_any_tab(oldwin)) {
EMSG(_("E924: Current window was closed"));
+ is_abort = true;
+ opened_window = false;
+ } else if (old_qf_curlist != qi->qf_curlist // -V560
+ || !is_qf_entry_present(qi, qf_ptr)) {
+ if (qi == &ql_info) {
+ EMSG(_("E925: Current quickfix was changed"));
+ } else {
+ EMSG(_("E926: Current location list was changed"));
+ }
+ is_abort = true;
+ }
+
+ if (is_abort) {
ok = false;
qi = NULL;
qf_ptr = NULL;
- opened_window = false;
}
}
}
@@ -1732,18 +2216,36 @@ void qf_list(exarg_T *eap)
EMSG(_(e_quickfix));
return;
}
+
+ bool plus = false;
+ if (*arg == '+') {
+ arg++;
+ plus = true;
+ }
if (!get_list_range(&arg, &idx1, &idx2) || *arg != NUL) {
EMSG(_(e_trailing));
return;
}
- i = qi->qf_lists[qi->qf_curlist].qf_count;
- if (idx1 < 0)
- idx1 = (-idx1 > i) ? 0 : idx1 + i + 1;
- if (idx2 < 0)
- idx2 = (-idx2 > i) ? 0 : idx2 + i + 1;
+ if (plus) {
+ i = qi->qf_lists[qi->qf_curlist].qf_index;
+ idx2 = i + idx1;
+ idx1 = i;
+ } else {
+ i = qi->qf_lists[qi->qf_curlist].qf_count;
+ if (idx1 < 0) {
+ idx1 = (-idx1 > i) ? 0 : idx1 + i + 1;
+ }
+ if (idx2 < 0) {
+ idx2 = (-idx2 > i) ? 0 : idx2 + i + 1;
+ }
+ }
+
+ // Shorten all the file names, so that it is easy to read.
+ shorten_fnames(false);
- if (qi->qf_lists[qi->qf_curlist].qf_nonevalid)
- all = TRUE;
+ if (qi->qf_lists[qi->qf_curlist].qf_nonevalid) {
+ all = true;
+ }
qfp = qi->qf_lists[qi->qf_curlist].qf_start;
for (i = 1; !got_int && i <= qi->qf_lists[qi->qf_curlist].qf_count; ) {
if ((qfp->qf_valid || all) && idx1 <= i && i <= idx2) {
@@ -1764,23 +2266,24 @@ void qf_list(exarg_T *eap)
vim_snprintf((char *)IObuff, IOSIZE, "%2d %s",
i, (char *)fname);
msg_outtrans_attr(IObuff, i == qi->qf_lists[qi->qf_curlist].qf_index
- ? hl_attr(HLF_L) : hl_attr(HLF_D));
- if (qfp->qf_lnum == 0)
+ ? HL_ATTR(HLF_QFL) : HL_ATTR(HLF_D));
+ if (qfp->qf_lnum == 0) {
IObuff[0] = NUL;
- else if (qfp->qf_col == 0)
- sprintf((char *)IObuff, ":%" PRId64, (int64_t)qfp->qf_lnum);
- else
- sprintf((char *)IObuff, ":%" PRId64 " col %d",
- (int64_t)qfp->qf_lnum, qfp->qf_col);
- sprintf((char *)IObuff + STRLEN(IObuff), "%s:",
- (char *)qf_types(qfp->qf_type, qfp->qf_nr));
- msg_puts_attr(IObuff, hl_attr(HLF_N));
+ } else if (qfp->qf_col == 0) {
+ vim_snprintf((char *)IObuff, IOSIZE, ":%" PRIdLINENR, qfp->qf_lnum);
+ } else {
+ vim_snprintf((char *)IObuff, IOSIZE, ":%" PRIdLINENR " col %d",
+ qfp->qf_lnum, qfp->qf_col);
+ }
+ vim_snprintf((char *)IObuff + STRLEN(IObuff), IOSIZE, "%s:",
+ (char *)qf_types(qfp->qf_type, qfp->qf_nr));
+ msg_puts_attr((const char *)IObuff, HL_ATTR(HLF_N));
if (qfp->qf_pattern != NULL) {
qf_fmt_text(qfp->qf_pattern, IObuff, IOSIZE);
- STRCAT(IObuff, ":");
- msg_puts(IObuff);
+ xstrlcat((char *)IObuff, ":", IOSIZE);
+ msg_puts((const char *)IObuff);
}
- msg_puts((char_u *)" ");
+ msg_puts(" ");
/* Remove newlines and leading whitespace from the text. For an
* unrecognized line keep the indent, the compiler may mark a word
@@ -1793,7 +2296,10 @@ void qf_list(exarg_T *eap)
}
qfp = qfp->qf_next;
- ++i;
+ if (qfp == NULL) {
+ break;
+ }
+ i++;
os_breakcheck();
}
}
@@ -1819,6 +2325,31 @@ static void qf_fmt_text(char_u *text, char_u *buf, int bufsize)
buf[i] = NUL;
}
+static void qf_msg(qf_info_T *qi, int which, char *lead)
+{
+ char *title = (char *)qi->qf_lists[which].qf_title;
+ int count = qi->qf_lists[which].qf_count;
+ char_u buf[IOSIZE];
+
+ vim_snprintf((char *)buf, IOSIZE, _("%serror list %d of %d; %d errors "),
+ lead,
+ which + 1,
+ qi->qf_listcount,
+ count);
+
+ if (title != NULL) {
+ size_t len = STRLEN(buf);
+
+ if (len < 34) {
+ memset(buf + len, ' ', 34 - len);
+ buf[34] = NUL;
+ }
+ xstrlcat((char *)buf, title, IOSIZE);
+ }
+ trunc_string(buf, buf, (int)Columns - 1, IOSIZE);
+ msg(buf);
+}
+
/*
* ":colder [count]": Up in the quickfix stack.
* ":cnewer [count]": Down in the quickfix stack.
@@ -1859,69 +2390,117 @@ void qf_age(exarg_T *eap)
++qi->qf_curlist;
}
}
- qf_msg(qi);
+ qf_msg(qi, qi->qf_curlist, "");
+ qf_update_buffer(qi, NULL);
}
-static void qf_msg(qf_info_T *qi)
+void qf_history(exarg_T *eap)
{
- smsg(_("error list %d of %d; %d errors"),
- qi->qf_curlist + 1, qi->qf_listcount,
- qi->qf_lists[qi->qf_curlist].qf_count);
- qf_update_buffer(qi);
+ qf_info_T *qi = &ql_info;
+ int i;
+
+ if (eap->cmdidx == CMD_lhistory) {
+ qi = GET_LOC_LIST(curwin);
+ }
+ if (qi == NULL || (qi->qf_listcount == 0
+ && qi->qf_lists[qi->qf_curlist].qf_count == 0)) {
+ MSG(_("No entries"));
+ } else {
+ for (i = 0; i < qi->qf_listcount; i++) {
+ qf_msg(qi, i, i == qi->qf_curlist ? "> " : " ");
+ }
+ }
}
-/*
- * Free error list "idx".
- */
-static void qf_free(qf_info_T *qi, int idx)
+/// Free all the entries in the error list "idx". Note that other information
+/// associated with the list like context and title are not freed.
+static void qf_free_items(qf_info_T *qi, int idx)
{
qfline_T *qfp;
- int stop = FALSE;
-
- while (qi->qf_lists[idx].qf_count) {
- qfp = qi->qf_lists[idx].qf_start->qf_next;
- if (qi->qf_lists[idx].qf_title != NULL && !stop) {
- xfree(qi->qf_lists[idx].qf_start->qf_text);
- stop = (qi->qf_lists[idx].qf_start == qfp);
- xfree(qi->qf_lists[idx].qf_start->qf_pattern);
- xfree(qi->qf_lists[idx].qf_start);
- if (stop)
- /* Somehow qf_count may have an incorrect value, set it to 1
- * to avoid crashing when it's wrong.
- * TODO: Avoid qf_count being incorrect. */
- qi->qf_lists[idx].qf_count = 1;
- }
- qi->qf_lists[idx].qf_start = qfp;
- --qi->qf_lists[idx].qf_count;
- }
- xfree(qi->qf_lists[idx].qf_title);
- qi->qf_lists[idx].qf_start = NULL;
- qi->qf_lists[idx].qf_ptr = NULL;
- qi->qf_lists[idx].qf_title = NULL;
- qi->qf_lists[idx].qf_index = 0;
+ qfline_T *qfpnext;
+ bool stop = false;
+ qf_list_T *qfl = &qi->qf_lists[idx];
+
+ while (qfl->qf_count && qfl->qf_start != NULL) {
+ qfp = qfl->qf_start;
+ qfpnext = qfp->qf_next;
+ if (!stop) {
+ xfree(qfp->qf_text);
+ stop = (qfp == qfpnext);
+ xfree(qfp->qf_pattern);
+ xfree(qfp);
+ if (stop) {
+ // Somehow qf_count may have an incorrect value, set it to 1
+ // to avoid crashing when it's wrong.
+ // TODO(vim): Avoid qf_count being incorrect.
+ qfl->qf_count = 1;
+ }
+ }
+ qfl->qf_start = qfpnext;
+ qfl->qf_count--;
+ }
+
+ qfl->qf_start = NULL;
+ qfl->qf_ptr = NULL;
+ qfl->qf_index = 0;
+ qfl->qf_start = NULL;
+ qfl->qf_last = NULL;
+ qfl->qf_ptr = NULL;
+ qfl->qf_nonevalid = true;
+
+ qf_clean_dir_stack(&qfl->qf_dir_stack);
+ qfl->qf_directory = NULL;
+ qf_clean_dir_stack(&qfl->qf_file_stack);
+ qfl->qf_currfile = NULL;
+ qfl->qf_multiline = false;
+ qfl->qf_multiignore = false;
+ qfl->qf_multiscan = false;
+}
+
+/// Free error list "idx". Frees all the entries in the quickfix list,
+/// associated context information and the title.
+static void qf_free(qf_info_T *qi, int idx)
+{
+ qf_list_T *qfl = &qi->qf_lists[idx];
+ qf_free_items(qi, idx);
+
+ xfree(qfl->qf_title);
+ qfl->qf_title = NULL;
+ tv_free(qfl->qf_ctx);
+ qfl->qf_ctx = NULL;
+ qfl->qf_id = 0;
}
/*
* qf_mark_adjust: adjust marks
*/
-void qf_mark_adjust(win_T *wp, linenr_T line1, linenr_T line2, long amount, long amount_after)
+bool qf_mark_adjust(win_T *wp, linenr_T line1, linenr_T line2, long amount,
+ long amount_after)
{
int i;
qfline_T *qfp;
int idx;
qf_info_T *qi = &ql_info;
+ bool found_one = false;
+ int buf_has_flag = wp == NULL ? BUF_HAS_QF_ENTRY : BUF_HAS_LL_ENTRY;
+ if (!(curbuf->b_has_qf_entry & buf_has_flag)) {
+ return false;
+ }
if (wp != NULL) {
- if (wp->w_llist == NULL)
- return;
+ if (wp->w_llist == NULL) {
+ return false;
+ }
qi = wp->w_llist;
}
for (idx = 0; idx < qi->qf_listcount; ++idx)
if (qi->qf_lists[idx].qf_count)
for (i = 0, qfp = qi->qf_lists[idx].qf_start;
- i < qi->qf_lists[idx].qf_count; ++i, qfp = qfp->qf_next)
+ i < qi->qf_lists[idx].qf_count && qfp != NULL;
+ i++, qfp = qfp->qf_next) {
if (qfp->qf_fnum == curbuf->b_fnum) {
+ found_one = true;
if (qfp->qf_lnum >= line1 && qfp->qf_lnum <= line2) {
if (amount == MAXLNUM)
qfp->qf_cleared = TRUE;
@@ -1930,6 +2509,9 @@ void qf_mark_adjust(win_T *wp, linenr_T line1, linenr_T line2, long amount, long
} else if (amount_after && qfp->qf_lnum > line2)
qfp->qf_lnum += amount_after;
}
+ }
+
+ return found_one;
}
/*
@@ -2026,8 +2608,9 @@ void ex_cclose(exarg_T *eap)
/* Find existing quickfix window and close it. */
win = qf_find_win(qi);
- if (win != NULL)
- win_close(win, FALSE);
+ if (win != NULL) {
+ win_close(win, false);
+ }
}
/*
@@ -2078,6 +2661,8 @@ void ex_copen(exarg_T *eap)
}
}
} else {
+ int flags = 0;
+
qf_buf = qf_find_buf(qi);
/* The current window becomes the previous window afterwards. */
@@ -2085,11 +2670,17 @@ void ex_copen(exarg_T *eap)
if ((eap->cmdidx == CMD_copen || eap->cmdidx == CMD_cwindow)
&& cmdmod.split == 0)
- /* Create the new window at the very bottom, except when
- * :belowright or :aboveleft is used. */
+ // Create the new quickfix window at the very bottom, except when
+ // :belowright or :aboveleft is used.
win_goto(lastwin);
- if (win_split(height, WSP_BELOW | WSP_NEWLOC) == FAIL)
- return; /* not enough room for window */
+ // Default is to open the window below the current window
+ if (cmdmod.split == 0) {
+ flags = WSP_BELOW;
+ }
+ flags |= WSP_NEWLOC;
+ if (win_split(height, flags) == FAIL) {
+ return; // not enough room for window
+ }
RESET_BINDING(curwin);
if (eap->cmdidx == CMD_lopen || eap->cmdidx == CMD_lwindow) {
@@ -2110,15 +2701,13 @@ void ex_copen(exarg_T *eap)
else {
/* Create a new quickfix buffer */
(void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, oldwin);
- /* switch off 'swapfile' */
- set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL);
- set_option_value((char_u *)"bt", 0L, (char_u *)"quickfix",
- OPT_LOCAL);
- set_option_value((char_u *)"bh", 0L, (char_u *)"wipe", OPT_LOCAL);
+ // Switch off 'swapfile'.
+ set_option_value("swf", 0L, NULL, OPT_LOCAL);
+ set_option_value("bt", 0L, "quickfix", OPT_LOCAL);
+ set_option_value("bh", 0L, "wipe", OPT_LOCAL);
RESET_BINDING(curwin);
- curwin->w_p_diff = FALSE;
- set_option_value((char_u *)"fdm", 0L, (char_u *)"manual",
- OPT_LOCAL);
+ curwin->w_p_diff = false;
+ set_option_value("fdm", 0L, "manual", OPT_LOCAL);
}
/* Only set the height when still in the same tab page and there is no
@@ -2135,7 +2724,7 @@ void ex_copen(exarg_T *eap)
qf_set_title_var(qi);
// Fill the buffer with the quickfix list.
- qf_fill_buffer(qi);
+ qf_fill_buffer(qi, curbuf, NULL);
curwin->w_cursor.lnum = qi->qf_lists[qi->qf_curlist].qf_index;
curwin->w_cursor.col = 0;
@@ -2143,6 +2732,44 @@ void ex_copen(exarg_T *eap)
update_topline(); /* scroll to show the line */
}
+// Move the cursor in the quickfix window to "lnum".
+static void qf_win_goto(win_T *win, linenr_T lnum)
+{
+ win_T *old_curwin = curwin;
+
+ curwin = win;
+ curbuf = win->w_buffer;
+ curwin->w_cursor.lnum = lnum;
+ curwin->w_cursor.col = 0;
+ curwin->w_cursor.coladd = 0;
+ curwin->w_curswant = 0;
+ update_topline(); // scroll to show the line
+ redraw_later(VALID);
+ curwin->w_redr_status = true; // update ruler
+ curwin = old_curwin;
+ curbuf = curwin->w_buffer;
+}
+
+// :cbottom/:lbottom command.
+void ex_cbottom(exarg_T *eap)
+{
+ qf_info_T *qi = &ql_info;
+
+ if (eap->cmdidx == CMD_lbottom) {
+ qi = GET_LOC_LIST(curwin);
+ if (qi == NULL) {
+ EMSG(_(e_loclist));
+ return;
+ }
+ }
+
+ win_T *win = qf_find_win(qi);
+
+ if (win != NULL && win->w_cursor.lnum != win->w_buffer->b_ml.ml_line_count) {
+ qf_win_goto(win, win->w_buffer->b_ml.ml_line_count);
+ }
+}
+
/*
* Return the number of the current entry (line number in the quickfix
* window).
@@ -2179,24 +2806,14 @@ qf_win_pos_update (
if (win != NULL
&& qf_index <= win->w_buffer->b_ml.ml_line_count
&& old_qf_index != qf_index) {
- win_T *old_curwin = curwin;
-
- curwin = win;
- curbuf = win->w_buffer;
if (qf_index > old_qf_index) {
- curwin->w_redraw_top = old_qf_index;
- curwin->w_redraw_bot = qf_index;
+ win->w_redraw_top = old_qf_index;
+ win->w_redraw_bot = qf_index;
} else {
- curwin->w_redraw_top = qf_index;
- curwin->w_redraw_bot = old_qf_index;
+ win->w_redraw_top = qf_index;
+ win->w_redraw_bot = old_qf_index;
}
- curwin->w_cursor.lnum = qf_index;
- curwin->w_cursor.col = 0;
- update_topline(); /* scroll to show the line */
- redraw_later(VALID);
- curwin->w_redr_status = TRUE; /* update ruler */
- curwin = old_curwin;
- curbuf = curwin->w_buffer;
+ qf_win_goto(win, qf_index);
}
return win != NULL;
}
@@ -2251,34 +2868,55 @@ static buf_T *qf_find_buf(qf_info_T *qi)
return NULL;
}
+/// Update the w:quickfix_title variable in the quickfix/location list window
+static void qf_update_win_titlevar(qf_info_T *qi)
+{
+ win_T *win;
+
+ if ((win = qf_find_win(qi)) != NULL) {
+ win_T *curwin_save = curwin;
+ curwin = win;
+ qf_set_title_var(qi);
+ curwin = curwin_save;
+ }
+}
+
/*
* Find the quickfix buffer. If it exists, update the contents.
*/
-static void qf_update_buffer(qf_info_T *qi)
+static void qf_update_buffer(qf_info_T *qi, qfline_T *old_last)
{
buf_T *buf;
win_T *win;
- win_T *curwin_save;
aco_save_T aco;
/* Check if a buffer for the quickfix list exists. Update it. */
buf = qf_find_buf(qi);
if (buf != NULL) {
- /* set curwin/curbuf to buf and save a few things */
- aucmd_prepbuf(&aco, buf);
+ linenr_T old_line_count = buf->b_ml.ml_line_count;
- if ((win = qf_find_win(qi)) != NULL) {
- curwin_save = curwin;
- curwin = win;
- qf_set_title_var(qi);
- curwin = curwin_save;
+ if (old_last == NULL) {
+ // set curwin/curbuf to buf and save a few things
+ aucmd_prepbuf(&aco, buf);
}
- qf_fill_buffer(qi);
- /* restore curwin/curbuf and a few other things */
- aucmd_restbuf(&aco);
+ qf_update_win_titlevar(qi);
- (void)qf_win_pos_update(qi, 0);
+ qf_fill_buffer(qi, buf, old_last);
+ buf_inc_changedtick(buf);
+
+ if (old_last == NULL) {
+ (void)qf_win_pos_update(qi, 0);
+
+ // restore curwin/curbuf and a few other things
+ aucmd_restbuf(&aco);
+ }
+
+ // Only redraw when added lines are visible. This avoids flickering when
+ // the added lines are not visible.
+ if ((win = qf_find_win(qi)) != NULL && old_line_count < win->w_botline) {
+ redraw_buf_later(buf, NOT_VALID);
+ }
}
}
@@ -2291,33 +2929,60 @@ static void qf_set_title_var(qf_info_T *qi)
}
}
-/*
- * Fill current buffer with quickfix errors, replacing any previous contents.
- * curbuf must be the quickfix buffer!
- */
-static void qf_fill_buffer(qf_info_T *qi)
+// Fill current buffer with quickfix errors, replacing any previous contents.
+// curbuf must be the quickfix buffer!
+// If "old_last" is not NULL append the items after this one.
+// When "old_last" is NULL then "buf" must equal "curbuf"! Because ml_delete()
+// is used and autocommands will be triggered.
+static void qf_fill_buffer(qf_info_T *qi, buf_T *buf, qfline_T *old_last)
{
linenr_T lnum;
qfline_T *qfp;
buf_T *errbuf;
int len;
- int old_KeyTyped = KeyTyped;
+ const bool old_KeyTyped = KeyTyped;
- /* delete all existing lines */
- while ((curbuf->b_ml.ml_flags & ML_EMPTY) == 0)
- (void)ml_delete((linenr_T)1, FALSE);
+ if (old_last == NULL) {
+ if (buf != curbuf) {
+ internal_error("qf_fill_buffer()");
+ return;
+ }
+
+ // delete all existing lines
+ while ((curbuf->b_ml.ml_flags & ML_EMPTY) == 0) {
+ (void)ml_delete((linenr_T)1, false);
+ }
+ }
/* Check if there is anything to display */
if (qi->qf_curlist < qi->qf_listcount) {
- /* Add one line for each error */
- qfp = qi->qf_lists[qi->qf_curlist].qf_start;
- for (lnum = 0; lnum < qi->qf_lists[qi->qf_curlist].qf_count; ++lnum) {
+ char_u dirname[MAXPATHL];
+
+ *dirname = NUL;
+
+ // Add one line for each error
+ if (old_last == NULL) {
+ qfp = qi->qf_lists[qi->qf_curlist].qf_start;
+ lnum = 0;
+ } else {
+ qfp = old_last->qf_next;
+ lnum = buf->b_ml.ml_line_count;
+ }
+ while (lnum < qi->qf_lists[qi->qf_curlist].qf_count) {
if (qfp->qf_fnum != 0
&& (errbuf = buflist_findnr(qfp->qf_fnum)) != NULL
&& errbuf->b_fname != NULL) {
if (qfp->qf_type == 1) { // :helpgrep
STRLCPY(IObuff, path_tail(errbuf->b_fname), sizeof(IObuff));
} else {
+ // shorten the file name if not done already
+ if (errbuf->b_sfname == NULL
+ || path_is_absolute(errbuf->b_sfname)) {
+ if (*dirname == NUL) {
+ os_dirname(dirname, MAXPATHL);
+ }
+ shorten_buf_fname(errbuf, dirname, false);
+ }
STRLCPY(IObuff, errbuf->b_fname, sizeof(IObuff));
}
len = (int)STRLEN(IObuff);
@@ -2351,33 +3016,44 @@ static void qf_fill_buffer(qf_info_T *qi)
qf_fmt_text(len > 3 ? skipwhite(qfp->qf_text) : qfp->qf_text,
IObuff + len, IOSIZE - len);
- if (ml_append(lnum, IObuff, (colnr_T)STRLEN(IObuff) + 1, FALSE)
- == FAIL)
+ if (ml_append_buf(buf, lnum, IObuff, (colnr_T)STRLEN(IObuff) + 1, false)
+ == FAIL) {
break;
+ }
+ lnum++;
qfp = qfp->qf_next;
+ if (qfp == NULL) {
+ break;
+ }
+ }
+ if (old_last == NULL) {
+ // Delete the empty line which is now at the end
+ (void)ml_delete(lnum + 1, false);
}
- /* Delete the empty line which is now at the end */
- (void)ml_delete(lnum + 1, FALSE);
}
- /* correct cursor position */
- check_lnums(TRUE);
-
- /* Set the 'filetype' to "qf" each time after filling the buffer. This
- * resembles reading a file into a buffer, it's more logical when using
- * autocommands. */
- set_option_value((char_u *)"ft", 0L, (char_u *)"qf", OPT_LOCAL);
- curbuf->b_p_ma = FALSE;
-
- keep_filetype = TRUE; /* don't detect 'filetype' */
- apply_autocmds(EVENT_BUFREADPOST, (char_u *)"quickfix", NULL,
- FALSE, curbuf);
- apply_autocmds(EVENT_BUFWINENTER, (char_u *)"quickfix", NULL,
- FALSE, curbuf);
- keep_filetype = FALSE;
-
- /* make sure it will be redrawn */
- redraw_curbuf_later(NOT_VALID);
+ // Correct cursor position.
+ check_lnums(true);
+
+ if (old_last == NULL) {
+ // Set the 'filetype' to "qf" each time after filling the buffer. This
+ // resembles reading a file into a buffer, it's more logical when using
+ // autocommands.
+ curbuf_lock++;
+ set_option_value("ft", 0L, "qf", OPT_LOCAL);
+ curbuf->b_p_ma = false;
+
+ keep_filetype = true; // don't detect 'filetype'
+ apply_autocmds(EVENT_BUFREADPOST, (char_u *)"quickfix", NULL,
+ false, curbuf);
+ apply_autocmds(EVENT_BUFWINENTER, (char_u *)"quickfix", NULL,
+ false, curbuf);
+ keep_filetype = false;
+ curbuf_lock--;
+
+ // make sure it will be redrawn
+ redraw_curbuf_later(NOT_VALID);
+ }
/* Restore KeyTyped, setting 'filetype' may reset it. */
KeyTyped = old_KeyTyped;
@@ -2386,7 +3062,7 @@ static void qf_fill_buffer(qf_info_T *qi)
/*
* Return TRUE if "buf" is the quickfix buffer.
*/
-int bt_quickfix(buf_T *buf)
+int bt_quickfix(const buf_T *const buf)
{
return buf != NULL && buf->b_p_bt[0] == 'q';
}
@@ -2453,6 +3129,7 @@ void ex_make(exarg_T *eap)
qf_info_T *qi = &ql_info;
int res;
char_u *au_name = NULL;
+ char_u *enc = (*curbuf->b_p_menc != NUL) ? curbuf->b_p_menc : p_menc;
/* Redirect ":grep" to ":vimgrep" if 'grepprg' is "internal". */
if (grep_internal(eap->cmdidx)) {
@@ -2469,11 +3146,11 @@ void ex_make(exarg_T *eap)
case CMD_lgrepadd: au_name = (char_u *)"lgrepadd"; break;
default: break;
}
- if (au_name != NULL) {
- apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name,
- curbuf->b_fname, TRUE, curbuf);
- if (did_throw || force_abort)
+ if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name,
+ curbuf->b_fname, true, curbuf)) {
+ if (aborting()) {
return;
+ }
}
if (eap->cmdidx == CMD_lmake || eap->cmdidx == CMD_lgrep
@@ -2504,19 +3181,18 @@ void ex_make(exarg_T *eap)
}
msg_start();
MSG_PUTS(":!");
- msg_outtrans((char_u *) cmd); // show what we are doing
+ msg_outtrans((char_u *)cmd); // show what we are doing
- // let the shell know if we are redirecting output or not
- do_shell((char_u *) cmd, *p_sp != NUL ? kShellOptDoOut : 0);
+ do_shell((char_u *)cmd, 0);
res = qf_init(wp, fname, (eap->cmdidx != CMD_make
&& eap->cmdidx != CMD_lmake) ? p_gefm : p_efm,
- (eap->cmdidx != CMD_grepadd
- && eap->cmdidx != CMD_lgrepadd),
- *eap->cmdlinep);
- if (wp != NULL)
+ (eap->cmdidx != CMD_grepadd && eap->cmdidx != CMD_lgrepadd),
+ *eap->cmdlinep, enc);
+ if (wp != NULL) {
qi = GET_LOC_LIST(wp);
+ }
if (au_name != NULL) {
apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
curbuf->b_fname, TRUE, curbuf);
@@ -2570,7 +3246,7 @@ static char_u *get_mef_name(void)
STRCPY(name, p_mef);
sprintf((char *)name + (p - p_mef), "%d%d", start, off);
STRCAT(name, p + 2);
- // Don't accept a symbolic link, its a security risk.
+ // Don't accept a symbolic link, it's a security risk.
FileInfo file_info;
bool file_or_link_found = os_fileinfo_link((char *)name, &file_info);
if (!file_or_link_found) {
@@ -2743,7 +3419,6 @@ void ex_cc(exarg_T *eap)
|| eap->cmdidx == CMD_lrewind
|| eap->cmdidx == CMD_lfirst
|| eap->cmdidx == CMD_llast
- || eap->cmdidx == CMD_llast
|| eap->cmdidx == CMD_ldo
|| eap->cmdidx == CMD_lfdo) {
qi = GET_LOC_LIST(curwin);
@@ -2800,7 +3475,6 @@ void ex_cnext(exarg_T *eap)
|| eap->cmdidx == CMD_lnfile
|| eap->cmdidx == CMD_lNfile
|| eap->cmdidx == CMD_lpfile
- || eap->cmdidx == CMD_lpfile
|| eap->cmdidx == CMD_ldo
|| eap->cmdidx == CMD_lfdo) {
qi = GET_LOC_LIST(curwin);
@@ -2860,19 +3534,18 @@ void ex_cfile(exarg_T *eap)
if (*eap->arg != NUL)
set_string_option_direct((char_u *)"ef", -1, eap->arg, OPT_FREE, 0);
- /*
- * This function is used by the :cfile, :cgetfile and :caddfile
- * commands.
- * :cfile always creates a new quickfix list and jumps to the
- * first error.
- * :cgetfile creates a new quickfix list but doesn't jump to the
- * first error.
- * :caddfile adds to an existing quickfix list. If there is no
- * quickfix list then a new list is created.
- */
+ char_u *enc = (*curbuf->b_p_menc != NUL) ? curbuf->b_p_menc : p_menc;
+ // This function is used by the :cfile, :cgetfile and :caddfile
+ // commands.
+ // :cfile always creates a new quickfix list and jumps to the
+ // first error.
+ // :cgetfile creates a new quickfix list but doesn't jump to the
+ // first error.
+ // :caddfile adds to an existing quickfix list. If there is no
+ // quickfix list then a new list is created.
if (qf_init(wp, p_ef, p_efm, (eap->cmdidx != CMD_caddfile
&& eap->cmdidx != CMD_laddfile),
- *eap->cmdlinep) > 0
+ *eap->cmdlinep, enc) > 0
&& (eap->cmdidx == CMD_cfile
|| eap->cmdidx == CMD_lfile)) {
if (au_name != NULL)
@@ -2903,7 +3576,6 @@ void ex_vimgrep(exarg_T *eap)
int fi;
qf_info_T *qi = &ql_info;
qfline_T *cur_qf_start;
- qfline_T *prevp = NULL;
long lnum;
buf_T *buf;
int duplicate_name = FALSE;
@@ -2934,11 +3606,11 @@ void ex_vimgrep(exarg_T *eap)
case CMD_lgrepadd: au_name = (char_u *)"lgrepadd"; break;
default: break;
}
- if (au_name != NULL) {
- apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name,
- curbuf->b_fname, TRUE, curbuf);
- if (did_throw || force_abort)
+ if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name,
+ curbuf->b_fname, true, curbuf)) {
+ if (aborting()) {
return;
+ }
}
if (eap->cmdidx == CMD_lgrep
@@ -2955,21 +3627,23 @@ void ex_vimgrep(exarg_T *eap)
/* Get the search pattern: either white-separated or enclosed in // */
regmatch.regprog = NULL;
+ char_u *title = vim_strsave(*eap->cmdlinep);
p = skip_vimgrep_pat(eap->arg, &s, &flags);
if (p == NULL) {
EMSG(_(e_invalpat));
goto theend;
}
- if (s != NULL && *s == NUL) {
- /* Pattern is empty, use last search pattern. */
+ if (s == NULL || *s == NUL) {
+ // Pattern is empty, use last search pattern.
if (last_search_pat() == NULL) {
EMSG(_(e_noprevre));
goto theend;
}
regmatch.regprog = vim_regcomp(last_search_pat(), RE_MAGIC);
- } else
+ } else {
regmatch.regprog = vim_regcomp(s, RE_MAGIC);
+ }
if (regmatch.regprog == NULL)
goto theend;
@@ -2986,13 +3660,7 @@ void ex_vimgrep(exarg_T *eap)
&& eap->cmdidx != CMD_vimgrepadd && eap->cmdidx != CMD_lvimgrepadd)
|| qi->qf_curlist == qi->qf_listcount) {
// make place for a new list
- qf_new_list(qi, *eap->cmdlinep);
- } else if (qi->qf_lists[qi->qf_curlist].qf_count > 0) {
- // Adding to existing list, find last entry.
- for (prevp = qi->qf_lists[qi->qf_curlist].qf_start;
- prevp->qf_next != prevp;
- prevp = prevp->qf_next) {
- }
+ qf_new_list(qi, title);
}
/* parse the list of arguments */
@@ -3015,8 +3683,8 @@ void ex_vimgrep(exarg_T *eap)
cur_qf_start = qi->qf_lists[qi->qf_curlist].qf_start;
seconds = (time_t)0;
- for (fi = 0; fi < fcount && !got_int && tomatch > 0; ++fi) {
- fname = path_shorten_fname_if_possible(fnames[fi]);
+ for (fi = 0; fi < fcount && !got_int && tomatch > 0; fi++) {
+ fname = path_try_shorten_fname(fnames[fi]);
if (time(NULL) > seconds) {
/* Display the file name every second or so, show the user we are
* working on it. */
@@ -3088,23 +3756,26 @@ void ex_vimgrep(exarg_T *eap)
++lnum) {
col = 0;
while (vim_regexec_multi(&regmatch, curwin, buf, lnum,
- col, NULL) > 0) {
- ;
- if (qf_add_entry(qi, &prevp,
- NULL, /* dir */
- fname,
- 0,
- ml_get_buf(buf,
- regmatch.startpos[0].lnum + lnum, FALSE),
- regmatch.startpos[0].lnum + lnum,
- regmatch.startpos[0].col + 1,
- FALSE, /* vis_col */
- NULL, /* search pattern */
- 0, /* nr */
- 0, /* type */
- TRUE /* valid */
- ) == FAIL) {
- got_int = TRUE;
+ col, NULL) > 0) {
+ // Pass the buffer number so that it gets used even for a
+ // dummy buffer, unless duplicate_name is set, then the
+ // buffer will be wiped out below.
+ if (qf_add_entry(qi,
+ qi->qf_curlist,
+ NULL, // dir
+ fname,
+ duplicate_name ? 0 : buf->b_fnum,
+ ml_get_buf(buf,
+ regmatch.startpos[0].lnum + lnum, false),
+ regmatch.startpos[0].lnum + lnum,
+ regmatch.startpos[0].col + 1,
+ false, // vis_col
+ NULL, // search pattern
+ 0, // nr
+ 0, // type
+ true) // valid
+ == FAIL) {
+ got_int = true;
break;
}
found_match = TRUE;
@@ -3147,17 +3818,23 @@ void ex_vimgrep(exarg_T *eap)
buf = NULL;
} else if (buf != first_match_buf || (flags & VGR_NOJUMP)) {
unload_dummy_buffer(buf, dirname_start);
+ // Keeping the buffer, remove the dummy flag.
+ buf->b_flags &= ~BF_DUMMY;
buf = NULL;
}
}
if (buf != NULL) {
- /* If the buffer is still loaded we need to use the
- * directory we jumped to below. */
+ // Keeping the buffer, remove the dummy flag.
+ buf->b_flags &= ~BF_DUMMY;
+
+ // If the buffer is still loaded we need to use the
+ // directory we jumped to below.
if (buf == first_match_buf
&& target_dir == NULL
- && STRCMP(dirname_start, dirname_now) != 0)
+ && STRCMP(dirname_start, dirname_now) != 0) {
target_dir = vim_strsave(dirname_now);
+ }
/* The buffer is still loaded, the Filetype autocommands
* need to be done now, in that buffer. And the modelines
@@ -3179,7 +3856,7 @@ void ex_vimgrep(exarg_T *eap)
qi->qf_lists[qi->qf_curlist].qf_ptr = qi->qf_lists[qi->qf_curlist].qf_start;
qi->qf_lists[qi->qf_curlist].qf_index = 1;
- qf_update_buffer(qi);
+ qf_update_buffer(qi, NULL);
if (au_name != NULL)
apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
@@ -3214,6 +3891,7 @@ void ex_vimgrep(exarg_T *eap)
}
theend:
+ xfree(title);
xfree(dirname_now);
xfree(dirname_start);
xfree(target_dir);
@@ -3221,52 +3899,6 @@ theend:
}
/*
- * Skip over the pattern argument of ":vimgrep /pat/[g][j]".
- * Put the start of the pattern in "*s", unless "s" is NULL.
- * If "flags" is not NULL put the flags in it: VGR_GLOBAL, VGR_NOJUMP.
- * If "s" is not NULL terminate the pattern with a NUL.
- * Return a pointer to the char just past the pattern plus flags.
- */
-char_u *skip_vimgrep_pat(char_u *p, char_u **s, int *flags)
-{
- int c;
-
- if (vim_isIDc(*p)) {
- /* ":vimgrep pattern fname" */
- if (s != NULL)
- *s = p;
- p = skiptowhite(p);
- if (s != NULL && *p != NUL)
- *p++ = NUL;
- } else {
- /* ":vimgrep /pattern/[g][j] fname" */
- if (s != NULL)
- *s = p + 1;
- c = *p;
- p = skip_regexp(p + 1, c, TRUE, NULL);
- if (*p != c)
- return NULL;
-
- /* Truncate the pattern. */
- if (s != NULL)
- *p = NUL;
- ++p;
-
- /* Find the flags */
- while (*p == 'g' || *p == 'j') {
- if (flags != NULL) {
- if (*p == 'g')
- *flags |= VGR_GLOBAL;
- else
- *flags |= VGR_NOJUMP;
- }
- ++p;
- }
- }
- return p;
-}
-
-/*
* Restore current working directory to "dirname_start" if they differ, taking
* into account whether it is set locally or globally.
*/
@@ -3307,21 +3939,27 @@ load_dummy_buffer (
)
{
buf_T *newbuf;
- buf_T *newbuf_to_wipe = NULL;
- int failed = TRUE;
+ bufref_T newbufref;
+ bufref_T newbuf_to_wipe;
+ int failed = true;
aco_save_T aco;
+ int readfile_result;
- /* Allocate a buffer without putting it in the buffer list. */
+ // Allocate a buffer without putting it in the buffer list.
newbuf = buflist_new(NULL, NULL, (linenr_T)1, BLN_DUMMY);
- if (newbuf == NULL)
+ if (newbuf == NULL) {
return NULL;
+ }
+ set_bufref(&newbufref, newbuf);
/* Init the options. */
buf_copy_options(newbuf, BCO_ENTER | BCO_NOHELP);
/* need to open the memfile before putting the buffer in a window */
if (ml_open(newbuf) == OK) {
- /* set curwin/curbuf to buf and save a few things */
+ // Make sure this buffer isn't wiped out by auto commands.
+ newbuf->b_locked++;
+ // set curwin/curbuf to buf and save a few things
aucmd_prepbuf(&aco, newbuf);
/* Need to set the filename for autocommands. */
@@ -3334,26 +3972,34 @@ load_dummy_buffer (
* work. */
curbuf->b_flags &= ~BF_DUMMY;
- if (readfile(fname, NULL,
- (linenr_T)0, (linenr_T)0, (linenr_T)MAXLNUM,
- NULL, READ_NEW | READ_DUMMY) == OK
+ newbuf_to_wipe.br_buf = NULL;
+ readfile_result = readfile(fname, NULL, (linenr_T)0, (linenr_T)0,
+ (linenr_T)MAXLNUM, NULL,
+ READ_NEW | READ_DUMMY);
+ newbuf->b_locked--;
+ if (readfile_result == OK
&& !got_int
&& !(curbuf->b_flags & BF_NEW)) {
failed = FALSE;
if (curbuf != newbuf) {
- /* Bloody autocommands changed the buffer! Can happen when
- * using netrw and editing a remote file. Use the current
- * buffer instead, delete the dummy one after restoring the
- * window stuff. */
- newbuf_to_wipe = newbuf;
+ // Bloody autocommands changed the buffer! Can happen when
+ // using netrw and editing a remote file. Use the current
+ // buffer instead, delete the dummy one after restoring the
+ // window stuff.
+ set_bufref(&newbuf_to_wipe, newbuf);
newbuf = curbuf;
}
}
- /* restore curwin/curbuf and a few other things */
+ // Restore curwin/curbuf and a few other things.
aucmd_restbuf(&aco);
- if (newbuf_to_wipe != NULL && buf_valid(newbuf_to_wipe))
- wipe_buffer(newbuf_to_wipe, FALSE);
+ if (newbuf_to_wipe.br_buf != NULL && bufref_valid(&newbuf_to_wipe)) {
+ wipe_buffer(newbuf_to_wipe.br_buf, false);
+ }
+
+ // Add back the "dummy" flag, otherwise buflist_findname_file_id()
+ // won't skip it.
+ newbuf->b_flags |= BF_DUMMY;
}
/*
@@ -3364,8 +4010,9 @@ load_dummy_buffer (
os_dirname(resulting_dir, MAXPATHL);
restore_start_dir(dirname_start);
- if (!buf_valid(newbuf))
+ if (!bufref_valid(&newbufref)) {
return NULL;
+ }
if (failed) {
wipe_dummy_buffer(newbuf, dirname_start);
return NULL;
@@ -3413,107 +4060,301 @@ static void unload_dummy_buffer(buf_T *buf, char_u *dirname_start)
}
}
-/*
- * Add each quickfix error to list "list" as a dictionary.
- */
-int get_errorlist(win_T *wp, list_T *list)
+/// Add each quickfix error to list "list" as a dictionary.
+/// If qf_idx is -1, use the current list. Otherwise, use the specified list.
+int get_errorlist(const qf_info_T *qi_arg, win_T *wp, int qf_idx, list_T *list)
{
- qf_info_T *qi = &ql_info;
- dict_T *dict;
+ const qf_info_T *qi = qi_arg;
char_u buf[2];
qfline_T *qfp;
int i;
int bufnum;
- if (wp != NULL) {
- qi = GET_LOC_LIST(wp);
- if (qi == NULL)
- return FAIL;
+ if (qi == NULL) {
+ qi = &ql_info;
+ if (wp != NULL) {
+ qi = GET_LOC_LIST(wp);
+ if (qi == NULL) {
+ return FAIL;
+ }
+ }
}
- if (qi->qf_curlist >= qi->qf_listcount
- || qi->qf_lists[qi->qf_curlist].qf_count == 0)
+ if (qf_idx == -1) {
+ qf_idx = qi->qf_curlist;
+ }
+
+ if (qf_idx >= qi->qf_listcount
+ || qi->qf_lists[qf_idx].qf_count == 0) {
return FAIL;
+ }
- qfp = qi->qf_lists[qi->qf_curlist].qf_start;
- for (i = 1; !got_int && i <= qi->qf_lists[qi->qf_curlist].qf_count; ++i) {
- /* Handle entries with a non-existing buffer number. */
+ qfp = qi->qf_lists[qf_idx].qf_start;
+ for (i = 1; !got_int && i <= qi->qf_lists[qf_idx].qf_count; i++) {
+ // Handle entries with a non-existing buffer number.
bufnum = qfp->qf_fnum;
if (bufnum != 0 && (buflist_findnr(bufnum) == NULL))
bufnum = 0;
- dict = dict_alloc();
- list_append_dict(list, dict);
+ dict_T *const dict = tv_dict_alloc();
+ tv_list_append_dict(list, dict);
buf[0] = qfp->qf_type;
buf[1] = NUL;
- if ( dict_add_nr_str(dict, "bufnr", (long)bufnum, NULL) == FAIL
- || dict_add_nr_str(dict, "lnum", (long)qfp->qf_lnum, NULL) == FAIL
- || dict_add_nr_str(dict, "col", (long)qfp->qf_col, NULL) == FAIL
- || dict_add_nr_str(dict, "vcol", (long)qfp->qf_viscol, NULL) == FAIL
- || dict_add_nr_str(dict, "nr", (long)qfp->qf_nr, NULL) == FAIL
- || dict_add_nr_str(dict, "pattern", 0L,
- qfp->qf_pattern == NULL ? (char_u *)"" : qfp->qf_pattern) == FAIL
- || dict_add_nr_str(dict, "text", 0L,
- qfp->qf_text == NULL ? (char_u *)"" : qfp->qf_text) == FAIL
- || dict_add_nr_str(dict, "type", 0L, buf) == FAIL
- || dict_add_nr_str(dict, "valid", (long)qfp->qf_valid, NULL) == FAIL)
- return FAIL;
+ if (tv_dict_add_nr(dict, S_LEN("bufnr"), (varnumber_T)bufnum) == FAIL
+ || (tv_dict_add_nr(dict, S_LEN("lnum"), (varnumber_T)qfp->qf_lnum)
+ == FAIL)
+ || (tv_dict_add_nr(dict, S_LEN("col"), (varnumber_T)qfp->qf_col)
+ == FAIL)
+ || (tv_dict_add_nr(dict, S_LEN("vcol"), (varnumber_T)qfp->qf_viscol)
+ == FAIL)
+ || (tv_dict_add_nr(dict, S_LEN("nr"), (varnumber_T)qfp->qf_nr) == FAIL)
+ || tv_dict_add_str(dict, S_LEN("pattern"),
+ (qfp->qf_pattern == NULL
+ ? ""
+ : (const char *)qfp->qf_pattern)) == FAIL
+ || tv_dict_add_str(dict, S_LEN("text"),
+ (qfp->qf_text == NULL
+ ? ""
+ : (const char *)qfp->qf_text)) == FAIL
+ || tv_dict_add_str(dict, S_LEN("type"), (const char *)buf) == FAIL
+ || (tv_dict_add_nr(dict, S_LEN("valid"), (varnumber_T)qfp->qf_valid)
+ == FAIL)) {
+ // tv_dict_add* fail only if key already exist, but this is a newly
+ // allocated dictionary which is thus guaranteed to have no existing keys.
+ assert(false);
+ }
qfp = qfp->qf_next;
+ if (qfp == NULL) {
+ break;
+ }
}
return OK;
}
-/*
- * Populate the quickfix list with the items supplied in the list
- * of dictionaries. "title" will be copied to w:quickfix_title
- */
-int set_errorlist(win_T *wp, list_T *list, int action, char_u *title)
+/// Flags used by getqflist()/getloclist() to determine which fields to return.
+enum {
+ QF_GETLIST_NONE = 0x0,
+ QF_GETLIST_TITLE = 0x1,
+ QF_GETLIST_ITEMS = 0x2,
+ QF_GETLIST_NR = 0x4,
+ QF_GETLIST_WINID = 0x8,
+ QF_GETLIST_CONTEXT = 0x10,
+ QF_GETLIST_ID = 0x20,
+ QF_GETLIST_ALL = 0xFF
+};
+
+// Parse text from 'di' and return the quickfix list items
+static int qf_get_list_from_lines(dict_T *what, dictitem_T *di, dict_T *retdict)
+{
+ int status = FAIL;
+ char_u *errorformat = p_efm;
+ dictitem_T *efm_di;
+
+ // Only a List value is supported
+ if (di->di_tv.v_type == VAR_LIST && di->di_tv.vval.v_list != NULL) {
+ // If errorformat is supplied then use it, otherwise use the 'efm'
+ // option setting
+ if ((efm_di = tv_dict_find(what, S_LEN("efm"))) != NULL) {
+ if (efm_di->di_tv.v_type != VAR_STRING
+ || efm_di->di_tv.vval.v_string == NULL) {
+ return FAIL;
+ }
+ errorformat = efm_di->di_tv.vval.v_string;
+ }
+
+ list_T *l = tv_list_alloc(kListLenMayKnow);
+ qf_info_T *qi = xmalloc(sizeof(*qi));
+ memset(qi, 0, sizeof(*qi));
+ qi->qf_refcount++;
+
+ if (qf_init_ext(qi, 0, NULL, NULL, &di->di_tv, errorformat,
+ true, (linenr_T)0, (linenr_T)0, NULL, NULL) > 0) {
+ (void)get_errorlist(qi, NULL, 0, l);
+ qf_free(qi, 0);
+ }
+ xfree(qi);
+
+ tv_dict_add_list(retdict, S_LEN("items"), l);
+ status = OK;
+ }
+
+ return status;
+}
+
+/// Return quickfix/location list details (title) as a
+/// dictionary. 'what' contains the details to return. If 'list_idx' is -1,
+/// then current list is used. Otherwise the specified list is used.
+int get_errorlist_properties(win_T *wp, dict_T *what, dict_T *retdict)
{
- listitem_T *li;
- dict_T *d;
- qfline_T *prevp = NULL;
- int retval = OK;
qf_info_T *qi = &ql_info;
- bool did_bufnr_emsg = false;
+ dictitem_T *di;
+
+ if ((di = tv_dict_find(what, S_LEN("lines"))) != NULL) {
+ return qf_get_list_from_lines(what, di, retdict);
+ }
if (wp != NULL) {
- qi = ll_get_or_alloc_list(wp);
+ qi = GET_LOC_LIST(wp);
+ }
+ // List is not present or is empty
+ if (qi == NULL || qi->qf_listcount == 0) {
+ // If querying for the size of the list, return 0
+ if (((di = tv_dict_find(what, S_LEN("nr"))) != NULL)
+ && (di->di_tv.v_type == VAR_STRING)
+ && (STRCMP(di->di_tv.vval.v_string, "$") == 0)) {
+ return tv_dict_add_nr(retdict, S_LEN("nr"), 0);
+ }
+ return FAIL;
+ }
+
+ int status = OK;
+ int flags = QF_GETLIST_NONE;
+
+ int qf_idx = qi->qf_curlist; // default is the current list
+ if ((di = tv_dict_find(what, S_LEN("nr"))) != NULL) {
+ // Use the specified quickfix/location list
+ if (di->di_tv.v_type == VAR_NUMBER) {
+ // for zero use the current list
+ if (di->di_tv.vval.v_number != 0) {
+ qf_idx = (int)di->di_tv.vval.v_number - 1;
+ if (qf_idx < 0 || qf_idx >= qi->qf_listcount) {
+ return FAIL;
+ }
+ }
+ } else if (di->di_tv.v_type == VAR_STRING
+ && strequal((const char *)di->di_tv.vval.v_string, "$")) {
+ // Get the last quickfix list number
+ qf_idx = qi->qf_listcount - 1;
+ } else {
+ return FAIL;
+ }
+ flags |= QF_GETLIST_NR;
+ }
+
+ if ((di = tv_dict_find(what, S_LEN("id"))) != NULL) {
+ // Look for a list with the specified id
+ if (di->di_tv.v_type == VAR_NUMBER) {
+ // For zero, use the current list or the list specifed by 'nr'
+ if (di->di_tv.vval.v_number != 0) {
+ for (qf_idx = 0; qf_idx < qi->qf_listcount; qf_idx++) {
+ if (qi->qf_lists[qf_idx].qf_id == di->di_tv.vval.v_number) {
+ break;
+ }
+ }
+ if (qf_idx == qi->qf_listcount) {
+ return FAIL; // List not found
+ }
+ }
+ flags |= QF_GETLIST_ID;
+ } else {
+ return FAIL;
+ }
+ }
+
+ if (tv_dict_find(what, S_LEN("all")) != NULL) {
+ flags |= QF_GETLIST_ALL;
+ }
+ if (tv_dict_find(what, S_LEN("title")) != NULL) {
+ flags |= QF_GETLIST_TITLE;
+ }
+ if (tv_dict_find(what, S_LEN("winid")) != NULL) {
+ flags |= QF_GETLIST_WINID;
+ }
+ if (tv_dict_find(what, S_LEN("context")) != NULL) {
+ flags |= QF_GETLIST_CONTEXT;
+ }
+ if (tv_dict_find(what, S_LEN("items")) != NULL) {
+ flags |= QF_GETLIST_ITEMS;
+ }
+
+ if (flags & QF_GETLIST_TITLE) {
+ char_u *t = qi->qf_lists[qf_idx].qf_title;
+ if (t == NULL) {
+ t = (char_u *)"";
+ }
+ status = tv_dict_add_str(retdict, S_LEN("title"), (const char *)t);
+ }
+ if ((status == OK) && (flags & QF_GETLIST_NR)) {
+ status = tv_dict_add_nr(retdict, S_LEN("nr"), qf_idx + 1);
+ }
+ if ((status == OK) && (flags & QF_GETLIST_WINID)) {
+ win_T *win = qf_find_win(qi);
+ if (win != NULL) {
+ status = tv_dict_add_nr(retdict, S_LEN("winid"), win->handle);
+ }
+ }
+ if ((status == OK) && (flags & QF_GETLIST_ITEMS)) {
+ list_T *l = tv_list_alloc(kListLenMayKnow);
+ (void)get_errorlist(qi, NULL, qf_idx, l);
+ tv_dict_add_list(retdict, S_LEN("items"), l);
+ }
+
+ if ((status == OK) && (flags & QF_GETLIST_CONTEXT)) {
+ if (qi->qf_lists[qf_idx].qf_ctx != NULL) {
+ di = tv_dict_item_alloc_len(S_LEN("context"));
+ tv_copy(qi->qf_lists[qf_idx].qf_ctx, &di->di_tv);
+ status = tv_dict_add(retdict, di);
+ if (status == FAIL) {
+ tv_dict_item_free(di);
+ }
+ } else {
+ status = tv_dict_add_str(retdict, S_LEN("context"), "");
+ }
+ }
+
+ if ((status == OK) && (flags & QF_GETLIST_ID)) {
+ status = tv_dict_add_nr(retdict, S_LEN("id"), qi->qf_lists[qf_idx].qf_id);
}
- if (action == ' ' || qi->qf_curlist == qi->qf_listcount)
- /* make place for a new list */
+ return status;
+}
+
+/// Add list of entries to quickfix/location list. Each list entry is
+/// a dictionary with item information.
+static int qf_add_entries(qf_info_T *qi, int qf_idx, list_T *list,
+ char_u *title, int action)
+{
+ dict_T *d;
+ qfline_T *old_last = NULL;
+ int retval = OK;
+ bool did_bufnr_emsg = false;
+
+ if (action == ' ' || qf_idx == qi->qf_listcount) {
+ // make place for a new list
qf_new_list(qi, title);
- else if (action == 'a' && qi->qf_lists[qi->qf_curlist].qf_count > 0)
- /* Adding to existing list, find last entry. */
- for (prevp = qi->qf_lists[qi->qf_curlist].qf_start;
- prevp->qf_next != prevp; prevp = prevp->qf_next)
- ;
- else if (action == 'r') {
- qf_free(qi, qi->qf_curlist);
- qf_store_title(qi, title);
+ qf_idx = qi->qf_curlist;
+ } else if (action == 'a' && qi->qf_lists[qf_idx].qf_count > 0) {
+ // Adding to existing list, use last entry.
+ old_last = qi->qf_lists[qf_idx].qf_last;
+ } else if (action == 'r') {
+ qf_free_items(qi, qf_idx);
+ qf_store_title(qi, qf_idx, title);
}
- for (li = list->lv_first; li != NULL; li = li->li_next) {
- if (li->li_tv.v_type != VAR_DICT)
- continue; /* Skip non-dict items */
+ TV_LIST_ITER_CONST(list, li, {
+ if (TV_LIST_ITEM_TV(li)->v_type != VAR_DICT) {
+ continue; // Skip non-dict items.
+ }
- d = li->li_tv.vval.v_dict;
- if (d == NULL)
+ d = TV_LIST_ITEM_TV(li)->vval.v_dict;
+ if (d == NULL) {
continue;
+ }
- char_u *filename = get_dict_string(d, (char_u *)"filename", true);
- int bufnum = (int)get_dict_number(d, (char_u *)"bufnr");
- long lnum = get_dict_number(d, (char_u *)"lnum");
- int col = (int)get_dict_number(d, (char_u *)"col");
- char_u vcol = (char_u)get_dict_number(d, (char_u *)"vcol");
- int nr = (int)get_dict_number(d, (char_u *)"nr");
- char_u *type = get_dict_string(d, (char_u *)"type", true);
- char_u *pattern = get_dict_string(d, (char_u *)"pattern", true);
- char_u *text = get_dict_string(d, (char_u *)"text", true);
+ char *const filename = tv_dict_get_string(d, "filename", true);
+ int bufnum = (int)tv_dict_get_number(d, "bufnr");
+ long lnum = (long)tv_dict_get_number(d, "lnum");
+ int col = (int)tv_dict_get_number(d, "col");
+ char_u vcol = (char_u)tv_dict_get_number(d, "vcol");
+ int nr = (int)tv_dict_get_number(d, "nr");
+ const char *type_str = tv_dict_get_string(d, "type", false);
+ const char_u type = (char_u)(uint8_t)(type_str == NULL ? NUL : *type_str);
+ char *const pattern = tv_dict_get_string(d, "pattern", true);
+ char *text = tv_dict_get_string(d, "text", true);
if (text == NULL) {
- text = vim_strsave((char_u *)"");
+ text = xcalloc(1, 1);
}
bool valid = true;
if ((filename == NULL && bufnum == 0) || (lnum == 0 && pattern == NULL)) {
@@ -3531,44 +4372,296 @@ int set_errorlist(win_T *wp, list_T *list, int action, char_u *title)
bufnum = 0;
}
+ // If the 'valid' field is present it overrules the detected value.
+ if (tv_dict_find(d, "valid", -1) != NULL) {
+ valid = (int)tv_dict_get_number(d, "valid");
+ }
+
int status = qf_add_entry(qi,
- &prevp,
+ qf_idx,
NULL, // dir
- filename,
+ (char_u *)filename,
bufnum,
- text,
+ (char_u *)text,
lnum,
col,
vcol, // vis_col
- pattern, // search pattern
+ (char_u *)pattern, // search pattern
nr,
- (char_u)(type == NULL ? NUL : *type),
+ type,
valid);
xfree(filename);
xfree(pattern);
xfree(text);
- xfree(type);
if (status == FAIL) {
retval = FAIL;
break;
}
+ });
+
+ if (qi->qf_lists[qf_idx].qf_index == 0) {
+ // no valid entry
+ qi->qf_lists[qf_idx].qf_nonevalid = true;
+ } else {
+ qi->qf_lists[qf_idx].qf_nonevalid = false;
+ }
+ if (action != 'a') {
+ qi->qf_lists[qf_idx].qf_ptr = qi->qf_lists[qf_idx].qf_start;
+ if (qi->qf_lists[qf_idx].qf_count > 0) {
+ qi->qf_lists[qf_idx].qf_index = 1;
+ }
}
- if (qi->qf_lists[qi->qf_curlist].qf_index == 0)
- /* no valid entry */
- qi->qf_lists[qi->qf_curlist].qf_nonevalid = TRUE;
- else
- qi->qf_lists[qi->qf_curlist].qf_nonevalid = FALSE;
- qi->qf_lists[qi->qf_curlist].qf_ptr = qi->qf_lists[qi->qf_curlist].qf_start;
- qi->qf_lists[qi->qf_curlist].qf_index = 1;
+ // Don't update the cursor in quickfix window when appending entries
+ qf_update_buffer(qi, old_last);
+
+ return retval;
+}
+
+static int qf_set_properties(qf_info_T *qi, dict_T *what, int action,
+ char_u *title)
+{
+ dictitem_T *di;
+ int retval = FAIL;
+ int newlist = false;
+ char_u *errorformat = p_efm;
+
+ if (action == ' ' || qi->qf_curlist == qi->qf_listcount) {
+ newlist = true;
+ }
+ int qf_idx = qi->qf_curlist; // default is the current list
+ if ((di = tv_dict_find(what, S_LEN("nr"))) != NULL) {
+ // Use the specified quickfix/location list
+ if (di->di_tv.v_type == VAR_NUMBER) {
+ // for zero use the current list
+ if (di->di_tv.vval.v_number != 0) {
+ qf_idx = (int)di->di_tv.vval.v_number - 1;
+ }
+
+ if ((action == ' ' || action == 'a') && qf_idx == qi->qf_listcount) {
+ // When creating a new list, accept qf_idx pointing to the next
+ // non-available list and add the new list at the end of the
+ // stack.
+ newlist = true;
+ qf_idx = qi->qf_listcount - 1;
+ } else if (qf_idx < 0 || qf_idx >= qi->qf_listcount) {
+ return FAIL;
+ } else if (action != ' ') {
+ newlist = false; // use the specified list
+ }
+ } else if (di->di_tv.v_type == VAR_STRING
+ && strequal((const char *)di->di_tv.vval.v_string, "$")) {
+ if (qi->qf_listcount > 0) {
+ qf_idx = qi->qf_listcount - 1;
+ } else if (newlist) {
+ qf_idx = 0;
+ } else {
+ return FAIL;
+ }
+ } else {
+ return FAIL;
+ }
+ }
+
+ if (!newlist && (di = tv_dict_find(what, S_LEN("id"))) != NULL) {
+ // Use the quickfix/location list with the specified id
+ if (di->di_tv.v_type == VAR_NUMBER) {
+ for (qf_idx = 0; qf_idx < qi->qf_listcount; qf_idx++) {
+ if (qi->qf_lists[qf_idx].qf_id == di->di_tv.vval.v_number) {
+ break;
+ }
+ }
+ if (qf_idx == qi->qf_listcount) {
+ return FAIL; // List not found
+ }
+ } else {
+ return FAIL;
+ }
+ }
+
+ if (newlist) {
+ qi->qf_curlist = qf_idx;
+ qf_new_list(qi, title);
+ qf_idx = qi->qf_curlist;
+ }
+
+ if ((di = tv_dict_find(what, S_LEN("title"))) != NULL) {
+ if (di->di_tv.v_type == VAR_STRING) {
+ xfree(qi->qf_lists[qf_idx].qf_title);
+ qi->qf_lists[qf_idx].qf_title = (char_u *)tv_dict_get_string(
+ what, "title", true);
+ if (qf_idx == qi->qf_curlist) {
+ qf_update_win_titlevar(qi);
+ }
+ retval = OK;
+ }
+ }
+ if ((di = tv_dict_find(what, S_LEN("items"))) != NULL) {
+ if (di->di_tv.v_type == VAR_LIST) {
+ assert(qi->qf_lists[qf_idx].qf_title != NULL);
+ char_u *title_save = vim_strsave(qi->qf_lists[qf_idx].qf_title);
+
+ retval = qf_add_entries(qi, qf_idx, di->di_tv.vval.v_list,
+ title_save, action == ' ' ? 'a' : action);
+ xfree(title_save);
+ }
+ }
+
+ if ((di = tv_dict_find(what, S_LEN("efm"))) != NULL) {
+ if (di->di_tv.v_type != VAR_STRING || di->di_tv.vval.v_string == NULL) {
+ return FAIL;
+ }
+ errorformat = di->di_tv.vval.v_string;
+ }
+
+ if ((di = tv_dict_find(what, S_LEN("lines"))) != NULL) {
+ // Only a List value is supported
+ if (di->di_tv.v_type == VAR_LIST && di->di_tv.vval.v_list != NULL) {
+ if (action == 'r') {
+ qf_free_items(qi, qf_idx);
+ }
+ if (qf_init_ext(qi, qf_idx, NULL, NULL, &di->di_tv, errorformat,
+ false, (linenr_T)0, (linenr_T)0, NULL, NULL) > 0) {
+ retval = OK;
+ }
+ } else {
+ return FAIL;
+ }
+ }
+
+ if ((di = tv_dict_find(what, S_LEN("context"))) != NULL) {
+ tv_free(qi->qf_lists[qf_idx].qf_ctx);
+
+ typval_T *ctx = xcalloc(1, sizeof(typval_T));
+ tv_copy(&di->di_tv, ctx);
+ qi->qf_lists[qf_idx].qf_ctx = ctx;
+ retval = OK;
+ }
+
+ return retval;
+}
+
+// Find the non-location list window with the specified location list.
+static win_T * find_win_with_ll(qf_info_T *qi)
+{
+ FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
+ if ((wp->w_llist == qi) && !bt_quickfix(wp->w_buffer)) {
+ return wp;
+ }
+ }
+
+ return NULL;
+}
+
+// Free the entire quickfix/location list stack.
+// If the quickfix/location list window is open, then clear it.
+static void qf_free_stack(win_T *wp, qf_info_T *qi)
+{
+ win_T *qfwin = qf_find_win(qi);
+
+ if (qfwin != NULL) {
+ // If the quickfix/location list window is open, then clear it
+ if (qi->qf_curlist < qi->qf_listcount) {
+ qf_free(qi, qi->qf_curlist);
+ }
+ qf_update_buffer(qi, NULL);
+ }
+
+ win_T *llwin = NULL;
+ win_T *orig_wp = wp;
+ if (wp != NULL && IS_LL_WINDOW(wp)) {
+ // If in the location list window, then use the non-location list
+ // window with this location list (if present)
+ llwin = find_win_with_ll(qi);
+ if (llwin != NULL) {
+ wp = llwin;
+ }
+ }
+
+ qf_free_all(wp);
+ if (wp == NULL) {
+ // quickfix list
+ qi->qf_curlist = 0;
+ qi->qf_listcount = 0;
+ } else if (IS_LL_WINDOW(orig_wp)) {
+ // If the location list window is open, then create a new empty location
+ // list
+ qf_info_T *new_ll = ll_new_list();
+
+ // first free the list reference in the location list window
+ ll_free_all(&orig_wp->w_llist_ref);
+
+ orig_wp->w_llist_ref = new_ll;
+ if (llwin != NULL) {
+ llwin->w_llist = new_ll;
+ new_ll->qf_refcount++;
+ }
+ }
+}
+
+// Populate the quickfix list with the items supplied in the list
+// of dictionaries. "title" will be copied to w:quickfix_title
+// "action" is 'a' for add, 'r' for replace. Otherwise create a new list.
+int set_errorlist(win_T *wp, list_T *list, int action, char_u *title,
+ dict_T *what)
+{
+ qf_info_T *qi = &ql_info;
+ int retval = OK;
- qf_update_buffer(qi);
+ if (wp != NULL) {
+ qi = ll_get_or_alloc_list(wp);
+ }
+
+ if (action == 'f') {
+ // Free the entire quickfix or location list stack
+ qf_free_stack(wp, qi);
+ } else if (what != NULL) {
+ retval = qf_set_properties(qi, what, action, title);
+ } else {
+ retval = qf_add_entries(qi, qi->qf_curlist, list, title, action);
+ }
return retval;
}
+static bool mark_quickfix_ctx(qf_info_T *qi, int copyID)
+{
+ bool abort = false;
+
+ for (int i = 0; i < LISTCOUNT && !abort; i++) {
+ typval_T *ctx = qi->qf_lists[i].qf_ctx;
+ if (ctx != NULL && ctx->v_type != VAR_NUMBER
+ && ctx->v_type != VAR_STRING && ctx->v_type != VAR_FLOAT) {
+ abort = set_ref_in_item(ctx, copyID, NULL, NULL);
+ }
+ }
+
+ return abort;
+}
+
+/// Mark the context of the quickfix list and the location lists (if present) as
+/// "in use". So that garabage collection doesn't free the context.
+bool set_ref_in_quickfix(int copyID)
+{
+ bool abort = mark_quickfix_ctx(&ql_info, copyID);
+ if (abort) {
+ return abort;
+ }
+
+ FOR_ALL_TAB_WINDOWS(tp, win) {
+ if (win->w_llist != NULL) {
+ abort = mark_quickfix_ctx(win->w_llist, copyID);
+ if (abort) {
+ return abort;
+ }
+ }
+ }
+
+ return abort;
+}
+
/*
* ":[range]cbuffer [bufnr]" command.
* ":[range]caddbuffer [bufnr]" command.
@@ -3579,10 +4672,43 @@ int set_errorlist(win_T *wp, list_T *list, int action, char_u *title)
*/
void ex_cbuffer(exarg_T *eap)
{
- buf_T *buf = NULL;
- qf_info_T *qi = &ql_info;
+ buf_T *buf = NULL;
+ qf_info_T *qi = &ql_info;
+ const char *au_name = NULL;
+
+ switch (eap->cmdidx) {
+ case CMD_cbuffer:
+ au_name = "cbuffer";
+ break;
+ case CMD_cgetbuffer:
+ au_name = "cgetbuffer";
+ break;
+ case CMD_caddbuffer:
+ au_name = "caddbuffer";
+ break;
+ case CMD_lbuffer:
+ au_name = "lbuffer";
+ break;
+ case CMD_lgetbuffer:
+ au_name = "lgetbuffer";
+ break;
+ case CMD_laddbuffer:
+ au_name = "laddbuffer";
+ break;
+ default:
+ break;
+ }
+
+ if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, (char_u *)au_name,
+ curbuf->b_fname, true, curbuf)) {
+ if (aborting()) {
+ return;
+ }
+ }
- if (eap->cmdidx == CMD_lbuffer || eap->cmdidx == CMD_lgetbuffer
+ // Must come after autocommands.
+ if (eap->cmdidx == CMD_lbuffer
+ || eap->cmdidx == CMD_lgetbuffer
|| eap->cmdidx == CMD_laddbuffer) {
qi = ll_get_or_alloc_list(curwin);
}
@@ -3612,14 +4738,18 @@ void ex_cbuffer(exarg_T *eap)
qf_title = IObuff;
}
- if (qf_init_ext(qi, NULL, buf, NULL, p_efm,
- (eap->cmdidx != CMD_caddbuffer
- && eap->cmdidx != CMD_laddbuffer),
- eap->line1, eap->line2,
- qf_title) > 0
- && (eap->cmdidx == CMD_cbuffer
- || eap->cmdidx == CMD_lbuffer))
- qf_jump(qi, 0, 0, eap->forceit); /* display first error */
+ if (qf_init_ext(qi, qi->qf_curlist, NULL, buf, NULL, p_efm,
+ (eap->cmdidx != CMD_caddbuffer
+ && eap->cmdidx != CMD_laddbuffer),
+ eap->line1, eap->line2, qf_title, NULL) > 0) {
+ if (au_name != NULL) {
+ apply_autocmds(EVENT_QUICKFIXCMDPOST, (char_u *)au_name,
+ curbuf->b_fname, true, curbuf);
+ }
+ if (eap->cmdidx == CMD_cbuffer || eap->cmdidx == CMD_lbuffer) {
+ qf_jump(qi, 0, 0, eap->forceit); // display first error
+ }
+ }
}
}
}
@@ -3630,30 +4760,65 @@ void ex_cbuffer(exarg_T *eap)
*/
void ex_cexpr(exarg_T *eap)
{
- typval_T *tv;
- qf_info_T *qi = &ql_info;
+ qf_info_T *qi = &ql_info;
+ const char *au_name = NULL;
if (eap->cmdidx == CMD_lexpr || eap->cmdidx == CMD_lgetexpr
|| eap->cmdidx == CMD_laddexpr) {
qi = ll_get_or_alloc_list(curwin);
}
+ switch (eap->cmdidx) {
+ case CMD_cexpr:
+ au_name = "cexpr";
+ break;
+ case CMD_cgetexpr:
+ au_name = "cgetexpr";
+ break;
+ case CMD_caddexpr:
+ au_name = "caddexpr";
+ break;
+ case CMD_lexpr:
+ au_name = "lexpr";
+ break;
+ case CMD_lgetexpr:
+ au_name = "lgetexpr";
+ break;
+ case CMD_laddexpr:
+ au_name = "laddexpr";
+ break;
+ default:
+ break;
+ }
+ if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, (char_u *)au_name,
+ curbuf->b_fname, true, curbuf)) {
+ if (aborting()) {
+ return;
+ }
+ }
+
/* Evaluate the expression. When the result is a string or a list we can
* use it to fill the errorlist. */
- tv = eval_expr(eap->arg, NULL);
- if (tv != NULL) {
- if ((tv->v_type == VAR_STRING && tv->vval.v_string != NULL)
- || (tv->v_type == VAR_LIST && tv->vval.v_list != NULL)) {
- if (qf_init_ext(qi, NULL, NULL, tv, p_efm,
- (eap->cmdidx != CMD_caddexpr
- && eap->cmdidx != CMD_laddexpr),
- (linenr_T)0, (linenr_T)0, *eap->cmdlinep) > 0
- && (eap->cmdidx == CMD_cexpr
- || eap->cmdidx == CMD_lexpr))
- qf_jump(qi, 0, 0, eap->forceit); /* display first error */
- } else
+ typval_T tv;
+ if (eval0(eap->arg, &tv, NULL, true) != FAIL) {
+ if ((tv.v_type == VAR_STRING && tv.vval.v_string != NULL)
+ || tv.v_type == VAR_LIST) {
+ if (qf_init_ext(qi, qi->qf_curlist, NULL, NULL, &tv, p_efm,
+ (eap->cmdidx != CMD_caddexpr
+ && eap->cmdidx != CMD_laddexpr),
+ (linenr_T)0, (linenr_T)0, *eap->cmdlinep, NULL) > 0) {
+ if (au_name != NULL) {
+ apply_autocmds(EVENT_QUICKFIXCMDPOST, (char_u *)au_name,
+ curbuf->b_fname, true, curbuf);
+ }
+ if (eap->cmdidx == CMD_cexpr || eap->cmdidx == CMD_lexpr) {
+ qf_jump(qi, 0, 0, eap->forceit); // display first error
+ }
+ }
+ } else {
EMSG(_("E777: String or List expected"));
- free_tv(tv);
+ }
+ tv_clear(&tv);
}
}
@@ -3669,7 +4834,6 @@ void ex_helpgrep(exarg_T *eap)
char_u **fnames;
FILE *fd;
int fi;
- qfline_T *prevp = NULL;
long lnum;
char_u *lang;
qf_info_T *qi = &ql_info;
@@ -3684,11 +4848,11 @@ void ex_helpgrep(exarg_T *eap)
case CMD_lhelpgrep: au_name = (char_u *)"lhelpgrep"; break;
default: break;
}
- if (au_name != NULL) {
- apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name,
- curbuf->b_fname, TRUE, curbuf);
- if (did_throw || force_abort)
+ if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name,
+ curbuf->b_fname, true, curbuf)) {
+ if (aborting()) {
return;
+ }
}
/* Make 'cpoptions' empty, the 'l' flag should not be used here. */
@@ -3696,16 +4860,26 @@ void ex_helpgrep(exarg_T *eap)
p_cpo = empty_option;
if (eap->cmdidx == CMD_lhelpgrep) {
- qi = NULL;
+ win_T *wp = NULL;
- /* Find an existing help window */
- FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
- if (wp->w_buffer != NULL && wp->w_buffer->b_help) {
- qi = wp->w_llist;
+ // If the current window is a help window, then use it
+ if (bt_help(curwin->w_buffer)) {
+ wp = curwin;
+ } else {
+ // Find an existing help window
+ FOR_ALL_WINDOWS_IN_TAB(wp2, curtab) {
+ if (bt_help(wp2->w_buffer)) {
+ wp = wp2;
+ break;
+ }
}
}
- /* Help window not found */
+ if (wp == NULL) { // Help window not found
+ qi = NULL;
+ } else {
+ qi = wp->w_llist;
+ }
if (qi == NULL) {
/* Allocate a new location list for help text matches */
qi = ll_new_list();
@@ -3713,18 +4887,13 @@ void ex_helpgrep(exarg_T *eap)
}
}
+ // Autocommands may change the list. Save it for later comparison
+ qf_info_T *save_qi = qi;
+
regmatch.regprog = vim_regcomp(eap->arg, RE_MAGIC + RE_STRING);
regmatch.rm_ic = FALSE;
if (regmatch.regprog != NULL) {
- vimconv_T vc;
-
- /* Help files are in utf-8 or latin1, convert lines when 'encoding'
- * differs. */
- vc.vc_type = CONV_NONE;
- if (!enc_utf8)
- convert_setup(&vc, (char_u *)"utf-8", p_enc);
-
- /* create a new quickfix list */
+ // Create a new quickfix list.
qf_new_list(qi, *eap->cmdlinep);
/* Go through all directories in 'runtimepath' */
@@ -3756,15 +4925,6 @@ void ex_helpgrep(exarg_T *eap)
lnum = 1;
while (!vim_fgets(IObuff, IOSIZE, fd) && !got_int) {
char_u *line = IObuff;
- /* Convert a line if 'encoding' is not utf-8 and
- * the line contains a non-ASCII character. */
- if (vc.vc_type != CONV_NONE
- && has_non_ascii(IObuff)) {
- line = string_convert(&vc, IObuff, NULL);
- if (line == NULL)
- line = IObuff;
- }
-
if (vim_regexec(&regmatch, line, (colnr_T)0)) {
int l = (int)STRLEN(line);
@@ -3772,23 +4932,25 @@ void ex_helpgrep(exarg_T *eap)
while (l > 0 && line[l - 1] <= ' ')
line[--l] = NUL;
- if (qf_add_entry(qi, &prevp,
- NULL, /* dir */
- fnames[fi],
- 0,
- line,
- lnum,
- (int)(regmatch.startp[0] - line)
- + 1, /* col */
- FALSE, /* vis_col */
- NULL, /* search pattern */
- 0, /* nr */
- 1, /* type */
- TRUE /* valid */
- ) == FAIL) {
- got_int = TRUE;
- if (line != IObuff)
+ if (qf_add_entry(qi,
+ qi->qf_curlist,
+ NULL, // dir
+ fnames[fi],
+ 0,
+ line,
+ lnum,
+ (int)(regmatch.startp[0] - line)
+ + 1, // col
+ false, // vis_col
+ NULL, // search pattern
+ 0, // nr
+ 1, // type
+ true) // valid
+ == FAIL) {
+ got_int = true;
+ if (line != IObuff) {
xfree(line);
+ }
break;
}
}
@@ -3805,8 +4967,6 @@ void ex_helpgrep(exarg_T *eap)
}
vim_regfree(regmatch.regprog);
- if (vc.vc_type != CONV_NONE)
- convert_setup(&vc, NULL, NULL);
qi->qf_lists[qi->qf_curlist].qf_nonevalid = FALSE;
qi->qf_lists[qi->qf_curlist].qf_ptr =
@@ -3820,14 +4980,15 @@ void ex_helpgrep(exarg_T *eap)
/* Darn, some plugin changed the value. */
free_string_option(save_cpo);
- qf_update_buffer(qi);
+ qf_update_buffer(qi, NULL);
if (au_name != NULL) {
apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
- curbuf->b_fname, TRUE, curbuf);
- if (!new_qi && qi != &ql_info && qf_find_buf(qi) == NULL)
- /* autocommands made "qi" invalid */
+ curbuf->b_fname, true, curbuf);
+ if (!new_qi && qi != save_qi && qf_find_buf(qi) == NULL) {
+ // autocommands made "qi" invalid
return;
+ }
}
/* Jump to first match. */
@@ -3839,11 +5000,13 @@ void ex_helpgrep(exarg_T *eap)
if (eap->cmdidx == CMD_lhelpgrep) {
/* If the help window is not opened or if it already points to the
* correct location list, then free the new location list. */
- if (!curwin->w_buffer->b_help || curwin->w_llist == qi) {
- if (new_qi)
+ if (!bt_help(curwin->w_buffer) || curwin->w_llist == qi) {
+ if (new_qi) {
ll_free_all(&qi);
- } else if (curwin->w_llist == NULL)
+ }
+ } else if (curwin->w_llist == NULL) {
curwin->w_llist = qi;
+ }
}
}
diff --git a/src/nvim/quickfix.h b/src/nvim/quickfix.h
index bb9c2c3193..fdeb8d1a2f 100644
--- a/src/nvim/quickfix.h
+++ b/src/nvim/quickfix.h
@@ -1,6 +1,9 @@
#ifndef NVIM_QUICKFIX_H
#define NVIM_QUICKFIX_H
+#include "nvim/types.h"
+#include "nvim/ex_cmds_defs.h"
+
/* flags for skip_vimgrep_pat() */
#define VGR_GLOBAL 1
#define VGR_NOJUMP 2
diff --git a/src/nvim/rbuffer.c b/src/nvim/rbuffer.c
index a2cc432eca..df9394fbb2 100644
--- a/src/nvim/rbuffer.c
+++ b/src/nvim/rbuffer.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <stddef.h>
#include <string.h>
@@ -18,7 +21,7 @@ RBuffer *rbuffer_new(size_t capacity)
capacity = 0x10000;
}
- RBuffer *rv = xmalloc(sizeof(RBuffer) + capacity);
+ RBuffer *rv = xcalloc(1, sizeof(RBuffer) + capacity);
rv->full_cb = rv->nonfull_cb = NULL;
rv->data = NULL;
rv->size = 0;
@@ -78,7 +81,7 @@ void rbuffer_reset(RBuffer *buf) FUNC_ATTR_NONNULL_ALL
size_t temp_size;
if ((temp_size = rbuffer_size(buf))) {
if (buf->temp == NULL) {
- buf->temp = xmalloc(rbuffer_capacity(buf));
+ buf->temp = xcalloc(1, rbuffer_capacity(buf));
}
rbuffer_read(buf, buf->temp, buf->size);
}
@@ -118,7 +121,7 @@ char *rbuffer_read_ptr(RBuffer *buf, size_t *read_count) FUNC_ATTR_NONNULL_ALL
{
if (!buf->size) {
*read_count = 0;
- return NULL;
+ return buf->read_ptr;
}
if (buf->read_ptr < buf->write_ptr) {
diff --git a/src/nvim/rbuffer.h b/src/nvim/rbuffer.h
index 454972c69d..a8dfcac580 100644
--- a/src/nvim/rbuffer.h
+++ b/src/nvim/rbuffer.h
@@ -1,4 +1,4 @@
-// Ring buffer implementation. This is basically an array that wraps read/write
+// Specialized ring buffer. This is basically an array that wraps read/write
// pointers around the memory region. It should be more efficient than the old
// RBuffer which required memmove() calls to relocate read/write positions.
//
diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c
index 886a48e7c5..0b9e1cfdec 100644
--- a/src/nvim/regexp.c
+++ b/src/nvim/regexp.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* Handling of regular expressions: vim_regcomp(), vim_regexec(), vim_regsub()
*
@@ -59,7 +62,6 @@
#include "nvim/memory.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/garray.h"
#include "nvim/strings.h"
@@ -230,17 +232,17 @@
#define LAST_NL NUPPER + ADD_NL
#define WITH_NL(op) ((op) >= FIRST_NL && (op) <= LAST_NL)
-#define MOPEN 80 /* -89 Mark this point in input as start of
- * \( subexpr. MOPEN + 0 marks start of
- * match. */
-#define MCLOSE 90 /* -99 Analogous to MOPEN. MCLOSE + 0 marks
- * end of match. */
-#define BACKREF 100 /* -109 node Match same string again \1-\9 */
+#define MOPEN 80 // -89 Mark this point in input as start of
+ // \( โ€ฆ \) subexpr. MOPEN + 0 marks start of
+ // match.
+#define MCLOSE 90 // -99 Analogous to MOPEN. MCLOSE + 0 marks
+ // end of match.
+#define BACKREF 100 // -109 node Match same string again \1-\9.
-# define ZOPEN 110 /* -119 Mark this point in input as start of
- * \z( subexpr. */
-# define ZCLOSE 120 /* -129 Analogous to ZOPEN. */
-# define ZREF 130 /* -139 node Match external submatch \z1-\z9 */
+# define ZOPEN 110 // -119 Mark this point in input as start of
+ // \z( โ€ฆ \) subexpr.
+# define ZCLOSE 120 // -129 Analogous to ZOPEN.
+# define ZREF 130 // -139 node Match external submatch \z1-\z9
#define BRACE_COMPLEX 140 /* -149 node Match nodes between m & n times */
@@ -456,18 +458,15 @@ static int toggle_Magic(int x)
/* Used for an error (down from) vim_regcomp(): give the error message, set
* rc_did_emsg and return NULL */
-#define EMSG_RET_NULL(m) return (EMSG(m), rc_did_emsg = TRUE, (void *)NULL)
-#define EMSG_RET_FAIL(m) return (EMSG(m), rc_did_emsg = TRUE, FAIL)
-#define EMSG2_RET_NULL(m, \
- c) return (EMSG2((m), \
- (c) ? "" : "\\"), rc_did_emsg = TRUE, \
- (void *)NULL)
-#define EMSG2_RET_FAIL(m, \
- c) return (EMSG2((m), \
- (c) ? "" : "\\"), rc_did_emsg = TRUE, \
- FAIL)
+#define EMSG_RET_NULL(m) return (EMSG(m), rc_did_emsg = true, (void *)NULL)
+#define IEMSG_RET_NULL(m) return (IEMSG(m), rc_did_emsg = true, (void *)NULL)
+#define EMSG_RET_FAIL(m) return (EMSG(m), rc_did_emsg = true, FAIL)
+#define EMSG2_RET_NULL(m, c) \
+ return (EMSG2((m), (c) ? "" : "\\"), rc_did_emsg = true, (void *)NULL)
+#define EMSG2_RET_FAIL(m, c) \
+ return (EMSG2((m), (c) ? "" : "\\"), rc_did_emsg = true, FAIL)
#define EMSG_ONE_RET_NULL EMSG2_RET_NULL(_( \
- "E369: invalid item in %s%%[]"), reg_magic == MAGIC_ALL)
+ "E369: invalid item in %s%%[]"), reg_magic == MAGIC_ALL)
#define MAX_LIMIT (32767L << 16L)
@@ -480,11 +479,13 @@ static char_u *regprop(char_u *);
#endif
static char_u e_missingbracket[] = N_("E769: Missing ] after %s[");
+static char_u e_reverse_range[] = N_("E944: Reverse range in character class");
+static char_u e_large_class[] = N_("E945: Range too large in character class");
static char_u e_unmatchedpp[] = N_("E53: Unmatched %s%%(");
static char_u e_unmatchedp[] = N_("E54: Unmatched %s(");
static char_u e_unmatchedpar[] = N_("E55: Unmatched %s)");
static char_u e_z_not_allowed[] = N_("E66: \\z( not allowed here");
-static char_u e_z1_not_allowed[] = N_("E67: \\z1 et al. not allowed here");
+static char_u e_z1_not_allowed[] = N_("E67: \\z1 - \\z9 not allowed here");
static char_u e_missing_sb[] = N_("E69: Missing ] after %s%%[");
static char_u e_empty_sb[] = N_("E70: Empty %s%%[]");
#define NOT_MULTI 0
@@ -771,13 +772,9 @@ static int get_equi_class(char_u **pp)
char_u *p = *pp;
if (p[1] == '=') {
- if (has_mbyte)
- l = (*mb_ptr2len)(p + 2);
+ l = (*mb_ptr2len)(p + 2);
if (p[l + 2] == '=' && p[l + 3] == ']') {
- if (has_mbyte)
- c = mb_ptr2char(p + 2);
- else
- c = p[2];
+ c = utf_ptr2char(p + 2);
*pp += l + 4;
return c;
}
@@ -1106,13 +1103,9 @@ static int get_coll_element(char_u **pp)
char_u *p = *pp;
if (p[0] != NUL && p[1] == '.') {
- if (has_mbyte)
- l = (*mb_ptr2len)(p + 2);
+ l = utfc_ptr2len(p + 2);
if (p[l + 2] == '.' && p[l + 3] == ']') {
- if (has_mbyte)
- c = mb_ptr2char(p + 2);
- else
- c = p[2];
+ c = utf_ptr2char(p + 2);
*pp += l + 4;
return c;
}
@@ -1141,24 +1134,28 @@ static char_u *skip_anyof(char_u *p)
if (*p == ']' || *p == '-')
++p;
while (*p != NUL && *p != ']') {
- if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
+ if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1) {
p += l;
- else if (*p == '-') {
- ++p;
- if (*p != ']' && *p != NUL)
- mb_ptr_adv(p);
+ } else if (*p == '-') {
+ p++;
+ if (*p != ']' && *p != NUL) {
+ MB_PTR_ADV(p);
+ }
} else if (*p == '\\'
&& (vim_strchr(REGEXP_INRANGE, p[1]) != NULL
- || (!reg_cpo_lit && vim_strchr(REGEXP_ABBR, p[1]) != NULL)))
+ || (!reg_cpo_lit
+ && vim_strchr(REGEXP_ABBR, p[1]) != NULL))) {
p += 2;
- else if (*p == '[') {
+ } else if (*p == '[') {
if (get_char_class(&p) == CLASS_NONE
&& get_equi_class(&p) == 0
&& get_coll_element(&p) == 0
- && *p != NUL)
- ++p; /* It is not a class name and not NUL */
- } else
- ++p;
+ && *p != NUL) {
+ p++; // It is not a class name and not NUL
+ }
+ } else {
+ p++;
+ }
}
return p;
@@ -1184,9 +1181,10 @@ char_u *skip_regexp(char_u *startp, int dirc, int magic, char_u **newp)
mymagic = MAGIC_OFF;
get_cpo_flags();
- for (; p[0] != NUL; mb_ptr_adv(p)) {
- if (p[0] == dirc) /* found end of regexp */
+ for (; p[0] != NUL; MB_PTR_ADV(p)) {
+ if (p[0] == dirc) { // found end of regexp
break;
+ }
if ((p[0] == '[' && mymagic >= MAGIC_ON)
|| (p[0] == '\\' && p[1] == '[' && mymagic <= MAGIC_OFF)) {
p = skip_anyof(p + 1);
@@ -1293,10 +1291,7 @@ static regprog_T *bt_regcomp(char_u *expr, int re_flags)
}
if (OP(scan) == EXACTLY) {
- if (has_mbyte)
- r->regstart = (*mb_ptr2char)(OPERAND(scan));
- else
- r->regstart = *OPERAND(scan);
+ r->regstart = utf_ptr2char(OPERAND(scan));
} else if (OP(scan) == BOW
|| OP(scan) == EOW
|| OP(scan) == NOTHING
@@ -1304,10 +1299,7 @@ static regprog_T *bt_regcomp(char_u *expr, int re_flags)
|| OP(scan) == MCLOSE + 0 || OP(scan) == NCLOSE) {
char_u *regnext_scan = regnext(scan);
if (OP(regnext_scan) == EXACTLY) {
- if (has_mbyte)
- r->regstart = (*mb_ptr2char)(OPERAND(regnext_scan));
- else
- r->regstart = *OPERAND(regnext_scan);
+ r->regstart = utf_ptr2char(OPERAND(regnext_scan));
}
}
@@ -1389,6 +1381,10 @@ int vim_regcomp_had_eol(void)
return had_eol;
}
+// variables for parsing reginput
+static int at_start; // True when on the first character
+static int prev_at_start; // True when on the second character
+
/*
* Parse regular expression, i.e. main body or parenthesized thing.
*
@@ -1668,9 +1664,8 @@ static char_u *regpiece(int *flagp)
case Magic('@'):
{
int lop = END;
- int nr;
+ int64_t nr = getdecchrs();
- nr = getdecchrs();
switch (no_Magic(getchr())) {
case '=': lop = MATCH; break; /* \@= */
case '!': lop = NOMATCH; break; /* \@! */
@@ -1768,6 +1763,7 @@ static char_u *regatom(int *flagp)
int c;
char_u *p;
int extra = 0;
+ int save_prev_at_start = prev_at_start;
*flagp = WORST; /* Tentatively. */
@@ -1809,8 +1805,8 @@ static char_u *regatom(int *flagp)
if (c == '[')
goto collection;
- /* "\_x" is character class plus newline */
- /*FALLTHROUGH*/
+ // "\_x" is character class plus newline
+ FALLTHROUGH;
/*
* Character classes.
@@ -1884,8 +1880,8 @@ static char_u *regatom(int *flagp)
case Magic(')'):
if (one_exactly)
EMSG_ONE_RET_NULL;
- EMSG_RET_NULL(_(e_internal)); /* Supposed to be caught earlier. */
- /* NOTREACHED */
+ IEMSG_RET_NULL(_(e_internal)); // Supposed to be caught earlier.
+ // NOTREACHED
case Magic('='):
case Magic('?'):
@@ -1956,7 +1952,7 @@ static char_u *regatom(int *flagp)
{
c = no_Magic(getchr());
switch (c) {
- case '(': if (reg_do_extmatch != REX_SET)
+ case '(': if ((reg_do_extmatch & REX_SET) == 0)
EMSG_RET_NULL(_(e_z_not_allowed));
if (one_exactly)
EMSG_ONE_RET_NULL;
@@ -1975,7 +1971,7 @@ static char_u *regatom(int *flagp)
case '6':
case '7':
case '8':
- case '9': if (reg_do_extmatch != REX_USE)
+ case '9': if ((reg_do_extmatch & REX_USE) == 0)
EMSG_RET_NULL(_(e_z1_not_allowed));
ret = regnode(ZREF + c - '0');
re_has_z = REX_USE;
@@ -2090,7 +2086,7 @@ static char_u *regatom(int *flagp)
case 'u': /* %uabcd hex 4 */
case 'U': /* %U1234abcd hex 8 */
{
- int i;
+ int64_t i;
switch (c) {
case 'd': i = getdecchrs(); break;
@@ -2143,17 +2139,21 @@ static char_u *regatom(int *flagp)
}
break;
} else if (c == 'l' || c == 'c' || c == 'v') {
- if (c == 'l')
+ if (c == 'l') {
ret = regnode(RE_LNUM);
- else if (c == 'c')
+ if (save_prev_at_start) {
+ at_start = true;
+ }
+ } else if (c == 'c') {
ret = regnode(RE_COL);
- else
+ } else {
ret = regnode(RE_VCOL);
- if (ret == JUST_CALC_SIZE)
+ }
+ if (ret == JUST_CALC_SIZE) {
regsize += 5;
- else {
- /* put the number and the optional
- * comparator after the opcode */
+ } else {
+ // put the number and the optional
+ // comparator after the opcode
regcode = re_put_uint32(regcode, n);
*regcode++ = cmp;
}
@@ -2213,25 +2213,29 @@ collection:
if (*regparse == '[')
endc = get_coll_element(&regparse);
if (endc == 0) {
- if (has_mbyte)
- endc = mb_ptr2char_adv(&regparse);
- else
+ if (has_mbyte) {
+ endc = mb_ptr2char_adv((const char_u **)&regparse);
+ } else {
endc = *regparse++;
+ }
}
/* Handle \o40, \x20 and \u20AC style sequences */
if (endc == '\\' && !reg_cpo_lit)
endc = coll_get_char();
- if (startc > endc)
- EMSG_RET_NULL(_(e_invrange));
+ if (startc > endc) {
+ EMSG_RET_NULL(_(e_reverse_range));
+ }
if (has_mbyte && ((*mb_char2len)(startc) > 1
|| (*mb_char2len)(endc) > 1)) {
- /* Limit to a range of 256 chars */
- if (endc > startc + 256)
- EMSG_RET_NULL(_(e_invrange));
- while (++startc <= endc)
+ // Limit to a range of 256 chars
+ if (endc > startc + 256) {
+ EMSG_RET_NULL(_(e_large_class));
+ }
+ while (++startc <= endc) {
regmbc(startc);
+ }
} else {
while (++startc <= endc)
regc(startc);
@@ -2301,48 +2305,64 @@ collection:
}
break;
case CLASS_ALNUM:
- for (cu = 1; cu <= 255; cu++)
- if (isalnum(cu))
- regc(cu);
+ for (cu = 1; cu < 128; cu++) {
+ if (isalnum(cu)) {
+ regmbc(cu);
+ }
+ }
break;
case CLASS_ALPHA:
- for (cu = 1; cu <= 255; cu++)
- if (isalpha(cu))
- regc(cu);
+ for (cu = 1; cu < 128; cu++) {
+ if (isalpha(cu)) {
+ regmbc(cu);
+ }
+ }
break;
case CLASS_BLANK:
regc(' ');
regc('\t');
break;
case CLASS_CNTRL:
- for (cu = 1; cu <= 255; cu++)
- if (iscntrl(cu))
- regc(cu);
+ for (cu = 1; cu <= 127; cu++) {
+ if (iscntrl(cu)) {
+ regmbc(cu);
+ }
+ }
break;
case CLASS_DIGIT:
- for (cu = 1; cu <= 255; cu++)
- if (ascii_isdigit(cu))
- regc(cu);
+ for (cu = 1; cu <= 127; cu++) {
+ if (ascii_isdigit(cu)) {
+ regmbc(cu);
+ }
+ }
break;
case CLASS_GRAPH:
- for (cu = 1; cu <= 255; cu++)
- if (isgraph(cu))
- regc(cu);
+ for (cu = 1; cu <= 127; cu++) {
+ if (isgraph(cu)) {
+ regmbc(cu);
+ }
+ }
break;
case CLASS_LOWER:
- for (cu = 1; cu <= 255; cu++)
- if (vim_islower(cu))
- regc(cu);
+ for (cu = 1; cu <= 255; cu++) {
+ if (mb_islower(cu) && cu != 170 && cu != 186) {
+ regmbc(cu);
+ }
+ }
break;
case CLASS_PRINT:
- for (cu = 1; cu <= 255; cu++)
- if (vim_isprintc(cu))
- regc(cu);
+ for (cu = 1; cu <= 255; cu++) {
+ if (vim_isprintc(cu)) {
+ regmbc(cu);
+ }
+ }
break;
case CLASS_PUNCT:
- for (cu = 1; cu <= 255; cu++)
- if (ispunct(cu))
- regc(cu);
+ for (cu = 1; cu < 128; cu++) {
+ if (ispunct(cu)) {
+ regmbc(cu);
+ }
+ }
break;
case CLASS_SPACE:
for (cu = 9; cu <= 13; cu++)
@@ -2350,14 +2370,18 @@ collection:
regc(' ');
break;
case CLASS_UPPER:
- for (cu = 1; cu <= 255; cu++)
- if (vim_isupper(cu))
- regc(cu);
+ for (cu = 1; cu <= 255; cu++) {
+ if (mb_isupper(cu)) {
+ regmbc(cu);
+ }
+ }
break;
case CLASS_XDIGIT:
- for (cu = 1; cu <= 255; cu++)
- if (ascii_isxdigit(cu))
- regc(cu);
+ for (cu = 1; cu <= 255; cu++) {
+ if (ascii_isxdigit(cu)) {
+ regmbc(cu);
+ }
+ }
break;
case CLASS_TAB:
regc('\t');
@@ -2369,24 +2393,20 @@ collection:
regc('\b');
break;
case CLASS_ESCAPE:
- regc('\033');
+ regc(ESC);
break;
}
} else {
- if (has_mbyte) {
- int len;
-
- /* produce a multibyte character, including any
- * following composing characters */
- startc = mb_ptr2char(regparse);
- len = (*mb_ptr2len)(regparse);
- if (enc_utf8 && utf_char2len(startc) != len)
- startc = -1; /* composing chars */
- while (--len >= 0)
- regc(*regparse++);
- } else {
- startc = *regparse++;
- regc(startc);
+ // produce a multibyte character, including any
+ // following composing characters.
+ startc = utf_ptr2char(regparse);
+ int len = utfc_ptr2len(regparse);
+ if (utf_char2len(startc) != len) {
+ // composing chars
+ startc = -1;
+ }
+ while (--len >= 0) {
+ regc(*regparse++);
}
}
}
@@ -2400,7 +2420,7 @@ collection:
} else if (reg_strict)
EMSG2_RET_NULL(_(e_missingbracket), reg_magic > MAGIC_OFF);
}
- /* FALLTHROUGH */
+ FALLTHROUGH;
default:
{
@@ -2518,12 +2538,11 @@ static void regc(int b)
*/
static void regmbc(int c)
{
- if (!has_mbyte && c > 0xff)
- return;
- if (regcode == JUST_CALC_SIZE)
- regsize += (*mb_char2len)(c);
- else
- regcode += (*mb_char2bytes)(c, regcode);
+ if (regcode == JUST_CALC_SIZE) {
+ regsize += utf_char2len(c);
+ } else {
+ regcode += utf_char2bytes(c, regcode);
+ }
}
/*
@@ -2679,9 +2698,6 @@ static void regoptail(char_u *p, char_u *val)
* Functions for getting characters from the regexp input.
*/
-static int at_start; /* True when on the first character */
-static int prev_at_start; /* True when on the second character */
-
/*
* Start parsing at "str".
*/
@@ -2870,17 +2886,13 @@ static int peekchr(void)
* Next character can never be (made) magic?
* Then backslashing it won't do anything.
*/
- if (has_mbyte)
- curchr = (*mb_ptr2char)(regparse + 1);
- else
- curchr = c;
+ curchr = utf_ptr2char(regparse + 1);
}
break;
}
default:
- if (has_mbyte)
- curchr = (*mb_ptr2char)(regparse);
+ curchr = utf_ptr2char(regparse);
}
return curchr;
@@ -2897,13 +2909,8 @@ static void skipchr(void)
else
prevchr_len = 0;
if (regparse[prevchr_len] != NUL) {
- if (enc_utf8)
- /* exclude composing chars that mb_ptr2len does include */
- prevchr_len += utf_ptr2len(regparse + prevchr_len);
- else if (has_mbyte)
- prevchr_len += (*mb_ptr2len)(regparse + prevchr_len);
- else
- ++prevchr_len;
+ // Exclude composing chars that utfc_ptr2len does include.
+ prevchr_len += utf_ptr2len(regparse + prevchr_len);
}
regparse += prevchr_len;
prev_at_start = at_start;
@@ -2967,9 +2974,9 @@ static void ungetchr(void)
* The parameter controls the maximum number of input characters. This will be
* 2 when reading a \%x20 sequence and 4 when reading a \%u20AC sequence.
*/
-static int gethexchrs(int maxinputlen)
+static int64_t gethexchrs(int maxinputlen)
{
- int nr = 0;
+ int64_t nr = 0;
int c;
int i;
@@ -2991,9 +2998,9 @@ static int gethexchrs(int maxinputlen)
* Get and return the value of the decimal string immediately after the
* current position. Return -1 for invalid. Consumes all digits.
*/
-static int getdecchrs(void)
+static int64_t getdecchrs(void)
{
- int nr = 0;
+ int64_t nr = 0;
int c;
int i;
@@ -3020,13 +3027,13 @@ static int getdecchrs(void)
* blahblah\%o210asdf
* before-^ ^-after
*/
-static int getoctchrs(void)
+static int64_t getoctchrs(void)
{
- int nr = 0;
+ int64_t nr = 0;
int c;
int i;
- for (i = 0; i < 3 && nr < 040; ++i) {
+ for (i = 0; i < 3 && nr < 040; i++) { // -V536
c = regparse[0];
if (c < '0' || c > '7')
break;
@@ -3046,7 +3053,7 @@ static int getoctchrs(void)
*/
static int coll_get_char(void)
{
- int nr = -1;
+ int64_t nr = -1;
switch (*regparse++) {
case 'd': nr = getdecchrs(); break;
@@ -3148,61 +3155,56 @@ static int need_clear_zsubexpr = FALSE; /* extmatch subexpressions
int regnarrate = 0;
#endif
-/*
- * Internal copy of 'ignorecase'. It is set at each call to vim_regexec().
- * Normally it gets the value of "rm_ic" or "rmm_ic", but when the pattern
- * contains '\c' or '\C' the value is overruled.
- */
-static int ireg_ic;
-
-/*
- * Similar to ireg_ic, but only for 'combining' characters. Set with \Z flag
- * in the regexp. Defaults to false, always.
- */
-static int ireg_icombine;
-
-/*
- * Copy of "rmm_maxcol": maximum column to search for a match. Zero when
- * there is no maximum.
- */
-static colnr_T ireg_maxcol;
-
-/*
- * Sometimes need to save a copy of a line. Since alloc()/free() is very
- * slow, we keep one allocated piece of memory and only re-allocate it when
- * it's too small. It's freed in bt_regexec_both() when finished.
- */
+// Sometimes need to save a copy of a line. Since alloc()/free() is very
+// slow, we keep one allocated piece of memory and only re-allocate it when
+// it's too small. It's freed in bt_regexec_both() when finished.
static char_u *reg_tofree = NULL;
static unsigned reg_tofreelen;
-/*
- * These variables are set when executing a regexp to speed up the execution.
- * Which ones are set depends on whether a single-line or multi-line match is
- * done:
- * single-line multi-line
- * reg_match &regmatch_T NULL
- * reg_mmatch NULL &regmmatch_T
- * reg_startp reg_match->startp <invalid>
- * reg_endp reg_match->endp <invalid>
- * reg_startpos <invalid> reg_mmatch->startpos
- * reg_endpos <invalid> reg_mmatch->endpos
- * reg_win NULL window in which to search
- * reg_buf curbuf buffer in which to search
- * reg_firstlnum <invalid> first line in which to search
- * reg_maxline 0 last line nr
- * reg_line_lbr FALSE or TRUE FALSE
- */
-static regmatch_T *reg_match;
-static regmmatch_T *reg_mmatch;
-static char_u **reg_startp = NULL;
-static char_u **reg_endp = NULL;
-static lpos_T *reg_startpos = NULL;
-static lpos_T *reg_endpos = NULL;
-static win_T *reg_win;
-static buf_T *reg_buf;
-static linenr_T reg_firstlnum;
-static linenr_T reg_maxline;
-static int reg_line_lbr; /* "\n" in string is line break */
+// Structure used to store the execution state of the regex engine.
+// Which ones are set depends on whether a single-line or multi-line match is
+// done:
+// single-line multi-line
+// reg_match &regmatch_T NULL
+// reg_mmatch NULL &regmmatch_T
+// reg_startp reg_match->startp <invalid>
+// reg_endp reg_match->endp <invalid>
+// reg_startpos <invalid> reg_mmatch->startpos
+// reg_endpos <invalid> reg_mmatch->endpos
+// reg_win NULL window in which to search
+// reg_buf curbuf buffer in which to search
+// reg_firstlnum <invalid> first line in which to search
+// reg_maxline 0 last line nr
+// reg_line_lbr false or true false
+typedef struct {
+ regmatch_T *reg_match;
+ regmmatch_T *reg_mmatch;
+ char_u **reg_startp;
+ char_u **reg_endp;
+ lpos_T *reg_startpos;
+ lpos_T *reg_endpos;
+ win_T *reg_win;
+ buf_T *reg_buf;
+ linenr_T reg_firstlnum;
+ linenr_T reg_maxline;
+ bool reg_line_lbr; // "\n" in string is line break
+
+ // Internal copy of 'ignorecase'. It is set at each call to vim_regexec().
+ // Normally it gets the value of "rm_ic" or "rmm_ic", but when the pattern
+ // contains '\c' or '\C' the value is overruled.
+ bool reg_ic;
+
+ // Similar to rex.reg_ic, but only for 'combining' characters. Set with \Z
+ // flag in the regexp. Defaults to false, always.
+ bool reg_icombine;
+
+ // Copy of "rmm_maxcol": maximum column to search for a match. Zero when
+ // there is no maximum.
+ colnr_T reg_maxcol;
+} regexec_T;
+
+static regexec_T rex;
+static bool rex_in_use = false;
/*
* "regstack" and "backpos" are used by regmatch(). They are kept over calls
@@ -3244,14 +3246,16 @@ void free_regexp_stuff(void)
*/
static char_u *reg_getline(linenr_T lnum)
{
- /* when looking behind for a match/no-match lnum is negative. But we
- * can't go before line 1 */
- if (reg_firstlnum + lnum < 1)
+ // when looking behind for a match/no-match lnum is negative. But we
+ // can't go before line 1
+ if (rex.reg_firstlnum + lnum < 1) {
return NULL;
- if (lnum > reg_maxline)
- /* Must have matched the "\n" in the last line. */
+ }
+ if (lnum > rex.reg_maxline) {
+ // Must have matched the "\n" in the last line.
return (char_u *)"";
- return ml_get_buf(reg_buf, reg_firstlnum + lnum, FALSE);
+ }
+ return ml_get_buf(rex.reg_buf, rex.reg_firstlnum + lnum, false);
}
static regsave_T behind_pos;
@@ -3261,9 +3265,8 @@ static char_u *reg_endzp[NSUBEXP]; /* and end of \z(...\) matches */
static lpos_T reg_startzpos[NSUBEXP]; /* idem, beginning pos */
static lpos_T reg_endzpos[NSUBEXP]; /* idem, end pos */
-/* TRUE if using multi-line regexp. */
-#define REG_MULTI (reg_match == NULL)
-
+// TRUE if using multi-line regexp.
+#define REG_MULTI (rex.reg_match == NULL)
/*
* Match a regexp against a string.
@@ -3281,21 +3284,62 @@ bt_regexec_nl (
bool line_lbr
)
{
- reg_match = rmp;
- reg_mmatch = NULL;
- reg_maxline = 0;
- reg_line_lbr = line_lbr;
- reg_buf = curbuf;
- reg_win = NULL;
- ireg_ic = rmp->rm_ic;
- ireg_icombine = FALSE;
- ireg_maxcol = 0;
+ rex.reg_match = rmp;
+ rex.reg_mmatch = NULL;
+ rex.reg_maxline = 0;
+ rex.reg_line_lbr = line_lbr;
+ rex.reg_buf = curbuf;
+ rex.reg_win = NULL;
+ rex.reg_ic = rmp->rm_ic;
+ rex.reg_icombine = false;
+ rex.reg_maxcol = 0;
long r = bt_regexec_both(line, col, NULL);
assert(r <= INT_MAX);
return (int)r;
}
+/// Wrapper around strchr which accounts for case-insensitive searches and
+/// non-ASCII characters.
+///
+/// This function is used a lot for simple searches, keep it fast!
+///
+/// @param s string to search
+/// @param c character to find in @a s
+///
+/// @return NULL if no match, otherwise pointer to the position in @a s
+static inline char_u *cstrchr(const char_u *const s, const int c)
+ FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
+ FUNC_ATTR_ALWAYS_INLINE
+{
+ if (!rex.reg_ic) {
+ return vim_strchr(s, c);
+ }
+
+ // Use folded case for UTF-8, slow! For ASCII use libc strpbrk which is
+ // expected to be highly optimized.
+ if (c > 0x80) {
+ const int folded_c = utf_fold(c);
+ for (const char_u *p = s; *p != NUL; p += utfc_ptr2len(p)) {
+ if (utf_fold(utf_ptr2char(p)) == folded_c) {
+ return (char_u *)p;
+ }
+ }
+ return NULL;
+ }
+
+ int cc;
+ if (ASCII_ISUPPER(c)) {
+ cc = TOLOWER_ASC(c);
+ } else if (ASCII_ISLOWER(c)) {
+ cc = TOUPPER_ASC(c);
+ } else {
+ return vim_strchr(s, c);
+ }
+
+ char tofind[] = { (char)c, (char)cc, NUL };
+ return (char_u *)strpbrk((const char *)s, tofind);
+}
/// Matches a regexp against multiple lines.
/// "rmp->regprog" is a compiled regexp as returned by vim_regcomp().
@@ -3312,16 +3356,16 @@ bt_regexec_nl (
static long bt_regexec_multi(regmmatch_T *rmp, win_T *win, buf_T *buf,
linenr_T lnum, colnr_T col, proftime_T *tm)
{
- reg_match = NULL;
- reg_mmatch = rmp;
- reg_buf = buf;
- reg_win = win;
- reg_firstlnum = lnum;
- reg_maxline = reg_buf->b_ml.ml_line_count - lnum;
- reg_line_lbr = FALSE;
- ireg_ic = rmp->rmm_ic;
- ireg_icombine = FALSE;
- ireg_maxcol = rmp->rmm_maxcol;
+ rex.reg_match = NULL;
+ rex.reg_mmatch = rmp;
+ rex.reg_buf = buf;
+ rex.reg_win = win;
+ rex.reg_firstlnum = lnum;
+ rex.reg_maxline = rex.reg_buf->b_ml.ml_line_count - lnum;
+ rex.reg_line_lbr = false;
+ rex.reg_ic = rmp->rmm_ic;
+ rex.reg_icombine = false;
+ rex.reg_maxcol = rmp->rmm_maxcol;
return bt_regexec_both(NULL, col, tm);
}
@@ -3359,14 +3403,14 @@ static long bt_regexec_both(char_u *line,
}
if (REG_MULTI) {
- prog = (bt_regprog_T *)reg_mmatch->regprog;
+ prog = (bt_regprog_T *)rex.reg_mmatch->regprog;
line = reg_getline((linenr_T)0);
- reg_startpos = reg_mmatch->startpos;
- reg_endpos = reg_mmatch->endpos;
+ rex.reg_startpos = rex.reg_mmatch->startpos;
+ rex.reg_endpos = rex.reg_mmatch->endpos;
} else {
- prog = (bt_regprog_T *)reg_match->regprog;
- reg_startp = reg_match->startp;
- reg_endp = reg_match->endp;
+ prog = (bt_regprog_T *)rex.reg_match->regprog;
+ rex.reg_startp = rex.reg_match->startp;
+ rex.reg_endp = rex.reg_match->endp;
}
/* Be paranoid... */
@@ -3379,56 +3423,48 @@ static long bt_regexec_both(char_u *line,
if (prog_magic_wrong())
goto theend;
- /* If the start column is past the maximum column: no need to try. */
- if (ireg_maxcol > 0 && col >= ireg_maxcol)
+ // If the start column is past the maximum column: no need to try.
+ if (rex.reg_maxcol > 0 && col >= rex.reg_maxcol) {
goto theend;
+ }
- /* If pattern contains "\c" or "\C": overrule value of ireg_ic */
- if (prog->regflags & RF_ICASE)
- ireg_ic = TRUE;
- else if (prog->regflags & RF_NOICASE)
- ireg_ic = FALSE;
+ // If pattern contains "\c" or "\C": overrule value of rex.reg_ic
+ if (prog->regflags & RF_ICASE) {
+ rex.reg_ic = true;
+ } else if (prog->regflags & RF_NOICASE) {
+ rex.reg_ic = false;
+ }
- /* If pattern contains "\Z" overrule value of ireg_icombine */
- if (prog->regflags & RF_ICOMBINE)
- ireg_icombine = TRUE;
+ // If pattern contains "\Z" overrule value of rex.reg_icombine
+ if (prog->regflags & RF_ICOMBINE) {
+ rex.reg_icombine = true;
+ }
/* If there is a "must appear" string, look for it. */
if (prog->regmust != NULL) {
- int c;
-
- if (has_mbyte)
- c = (*mb_ptr2char)(prog->regmust);
- else
- c = *prog->regmust;
+ int c = utf_ptr2char(prog->regmust);
s = line + col;
- /*
- * This is used very often, esp. for ":global". Use three versions of
- * the loop to avoid overhead of conditions.
- */
- if (!ireg_ic
- && !has_mbyte
- )
- while ((s = vim_strbyte(s, c)) != NULL) {
- if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0)
- break; /* Found it. */
- ++s;
- }
- else if (!ireg_ic || (!enc_utf8 && mb_char2len(c) > 1))
+ // This is used very often, esp. for ":global". Use two versions of
+ // the loop to avoid overhead of conditions.
+ if (!rex.reg_ic) {
while ((s = vim_strchr(s, c)) != NULL) {
- if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0)
- break; /* Found it. */
- mb_ptr_adv(s);
+ if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0) {
+ break; // Found it.
+ }
+ MB_PTR_ADV(s);
}
- else
+ } else {
while ((s = cstrchr(s, c)) != NULL) {
- if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0)
- break; /* Found it. */
- mb_ptr_adv(s);
+ if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0) {
+ break; // Found it.
+ }
+ MB_PTR_ADV(s);
}
- if (s == NULL) /* Not present. */
+ }
+ if (s == NULL) { // Not present.
goto theend;
+ }
}
regline = line;
@@ -3437,18 +3473,13 @@ static long bt_regexec_both(char_u *line,
/* Simplest case: Anchored match need be tried only once. */
if (prog->reganch) {
- int c;
-
- if (has_mbyte)
- c = (*mb_ptr2char)(regline + col);
- else
- c = regline[col];
+ int c = utf_ptr2char(regline + col);
if (prog->regstart == NUL
|| prog->regstart == c
- || (ireg_ic
- && (((enc_utf8 && utf_fold(prog->regstart) == utf_fold(c)))
+ || (rex.reg_ic
+ && (utf_fold(prog->regstart) == utf_fold(c)
|| (c < 255 && prog->regstart < 255
- && vim_tolower(prog->regstart) == vim_tolower(c))))) {
+ && mb_tolower(prog->regstart) == mb_tolower(c))))) {
retval = regtry(prog, col);
} else {
retval = 0;
@@ -3458,14 +3489,8 @@ static long bt_regexec_both(char_u *line,
/* Messy cases: unanchored match. */
while (!got_int) {
if (prog->regstart != NUL) {
- /* Skip until the char we know it must start with.
- * Used often, do some work to avoid call overhead. */
- if (!ireg_ic
- && !has_mbyte
- )
- s = vim_strbyte(regline + col, prog->regstart);
- else
- s = cstrchr(regline + col, prog->regstart);
+ // Skip until the char we know it must start with.
+ s = cstrchr(regline + col, prog->regstart);
if (s == NULL) {
retval = 0;
break;
@@ -3473,8 +3498,8 @@ static long bt_regexec_both(char_u *line,
col = (int)(s - regline);
}
- /* Check for maximum column to try. */
- if (ireg_maxcol > 0 && col >= ireg_maxcol) {
+ // Check for maximum column to try.
+ if (rex.reg_maxcol > 0 && col >= rex.reg_maxcol) {
retval = 0;
break;
}
@@ -3571,21 +3596,24 @@ static long regtry(bt_regprog_T *prog, colnr_T col)
cleanup_subexpr();
if (REG_MULTI) {
- if (reg_startpos[0].lnum < 0) {
- reg_startpos[0].lnum = 0;
- reg_startpos[0].col = col;
+ if (rex.reg_startpos[0].lnum < 0) {
+ rex.reg_startpos[0].lnum = 0;
+ rex.reg_startpos[0].col = col;
+ }
+ if (rex.reg_endpos[0].lnum < 0) {
+ rex.reg_endpos[0].lnum = reglnum;
+ rex.reg_endpos[0].col = (int)(reginput - regline);
+ } else {
+ // Use line number of "\ze".
+ reglnum = rex.reg_endpos[0].lnum;
}
- if (reg_endpos[0].lnum < 0) {
- reg_endpos[0].lnum = reglnum;
- reg_endpos[0].col = (int)(reginput - regline);
- } else
- /* Use line number of "\ze". */
- reglnum = reg_endpos[0].lnum;
} else {
- if (reg_startp[0] == NULL)
- reg_startp[0] = regline + col;
- if (reg_endp[0] == NULL)
- reg_endp[0] = reginput;
+ if (rex.reg_startp[0] == NULL) {
+ rex.reg_startp[0] = regline + col;
+ }
+ if (rex.reg_endp[0] == NULL) {
+ rex.reg_endp[0] = reginput;
+ }
}
/* Package any found \z(...\) matches for export. Default is none. */
unref_extmatch(re_extmatch_out);
@@ -3620,34 +3648,32 @@ static long regtry(bt_regprog_T *prog, colnr_T col)
}
-/*
- * Get class of previous character.
- */
+// Get class of previous character.
static int reg_prev_class(void)
{
- if (reginput > regline)
- return mb_get_class_buf(reginput - 1
- - (*mb_head_off)(regline, reginput - 1), reg_buf);
+ if (reginput > regline) {
+ return mb_get_class_tab(reginput - 1 - utf_head_off(regline, reginput - 1),
+ rex.reg_buf->b_chartab);
+ }
return -1;
}
-/*
- * Return TRUE if the current reginput position matches the Visual area.
- */
+// Return TRUE if the current reginput position matches the Visual area.
static int reg_match_visual(void)
{
pos_T top, bot;
linenr_T lnum;
colnr_T col;
- win_T *wp = reg_win == NULL ? curwin : reg_win;
+ win_T *wp = rex.reg_win == NULL ? curwin : rex.reg_win;
int mode;
colnr_T start, end;
colnr_T start2, end2;
- /* Check if the buffer is the current buffer. */
- if (reg_buf != curbuf || VIsual.lnum == 0)
- return FALSE;
+ // Check if the buffer is the current buffer.
+ if (rex.reg_buf != curbuf || VIsual.lnum == 0) {
+ return false;
+ }
if (VIsual_active) {
if (lt(VIsual, wp->w_cursor)) {
@@ -3668,9 +3694,10 @@ static int reg_match_visual(void)
}
mode = curbuf->b_visual.vi_mode;
}
- lnum = reglnum + reg_firstlnum;
- if (lnum < top.lnum || lnum > bot.lnum)
- return FALSE;
+ lnum = reglnum + rex.reg_firstlnum;
+ if (lnum < top.lnum || lnum > bot.lnum) {
+ return false;
+ }
if (mode == 'v') {
col = (colnr_T)(reginput - regline);
@@ -3696,7 +3723,7 @@ static int reg_match_visual(void)
return TRUE;
}
-#define ADVANCE_REGINPUT() mb_ptr_adv(reginput)
+#define ADVANCE_REGINPUT() MB_PTR_ADV(reginput)
/*
* The arguments from BRACE_LIMITS are stored here. They are actually local
@@ -3789,19 +3816,17 @@ regmatch (
next = regnext(scan);
op = OP(scan);
- /* Check for character class with NL added. */
- if (!reg_line_lbr && WITH_NL(op) && REG_MULTI
- && *reginput == NUL && reglnum <= reg_maxline) {
+ // Check for character class with NL added.
+ if (!rex.reg_line_lbr && WITH_NL(op) && REG_MULTI
+ && *reginput == NUL && reglnum <= rex.reg_maxline) {
reg_nextline();
- } else if (reg_line_lbr && WITH_NL(op) && *reginput == '\n') {
+ } else if (rex.reg_line_lbr && WITH_NL(op) && *reginput == '\n') {
ADVANCE_REGINPUT();
} else {
- if (WITH_NL(op))
+ if (WITH_NL(op)) {
op -= ADD_NL;
- if (has_mbyte)
- c = (*mb_ptr2char)(reginput);
- else
- c = *reginput;
+ }
+ c = utf_ptr2char(reginput);
switch (op) {
case BOL:
if (reginput != regline)
@@ -3814,26 +3839,29 @@ regmatch (
break;
case RE_BOF:
- /* We're not at the beginning of the file when below the first
- * line where we started, not at the start of the line or we
- * didn't start at the first line of the buffer. */
+ // We're not at the beginning of the file when below the first
+ // line where we started, not at the start of the line or we
+ // didn't start at the first line of the buffer.
if (reglnum != 0 || reginput != regline
- || (REG_MULTI && reg_firstlnum > 1))
+ || (REG_MULTI && rex.reg_firstlnum > 1)) {
status = RA_NOMATCH;
+ }
break;
case RE_EOF:
- if (reglnum != reg_maxline || c != NUL)
+ if (reglnum != rex.reg_maxline || c != NUL) {
status = RA_NOMATCH;
+ }
break;
case CURSOR:
- /* Check if the buffer is in a window and compare the
- * reg_win->w_cursor position to the match position. */
- if (reg_win == NULL
- || (reglnum + reg_firstlnum != reg_win->w_cursor.lnum)
- || ((colnr_T)(reginput - regline) != reg_win->w_cursor.col))
+ // Check if the buffer is in a window and compare the
+ // rex.reg_win->w_cursor position to the match position.
+ if (rex.reg_win == NULL
+ || (reglnum + rex.reg_firstlnum != rex.reg_win->w_cursor.lnum)
+ || ((colnr_T)(reginput - regline) != rex.reg_win->w_cursor.col)) {
status = RA_NOMATCH;
+ }
break;
case RE_MARK:
@@ -3843,19 +3871,20 @@ regmatch (
int cmp = OPERAND(scan)[1];
pos_T *pos;
- pos = getmark_buf(reg_buf, mark, FALSE);
- if (pos == NULL /* mark doesn't exist */
- || pos->lnum <= 0 /* mark isn't set in reg_buf */
- || (pos->lnum == reglnum + reg_firstlnum
+ pos = getmark_buf(rex.reg_buf, mark, false);
+ if (pos == NULL // mark doesn't exist
+ || pos->lnum <= 0 // mark isn't set in reg_buf
+ || (pos->lnum == reglnum + rex.reg_firstlnum
? (pos->col == (colnr_T)(reginput - regline)
? (cmp == '<' || cmp == '>')
: (pos->col < (colnr_T)(reginput - regline)
? cmp != '>'
: cmp != '<'))
- : (pos->lnum < reglnum + reg_firstlnum
+ : (pos->lnum < reglnum + rex.reg_firstlnum
? cmp != '>'
- : cmp != '<')))
+ : cmp != '<'))) {
status = RA_NOMATCH;
+ }
}
break;
@@ -3865,11 +3894,12 @@ regmatch (
break;
case RE_LNUM:
- assert(reglnum + reg_firstlnum >= 0
- && (uintmax_t)(reglnum + reg_firstlnum) <= UINT32_MAX);
- if (!REG_MULTI || !re_num_cmp((uint32_t)(reglnum + reg_firstlnum),
- scan))
+ assert(reglnum + rex.reg_firstlnum >= 0
+ && (uintmax_t)(reglnum + rex.reg_firstlnum) <= UINT32_MAX);
+ if (!REG_MULTI
+ || !re_num_cmp((uint32_t)(reglnum + rex.reg_firstlnum), scan)) {
status = RA_NOMATCH;
+ }
break;
case RE_COL:
@@ -3880,11 +3910,13 @@ regmatch (
break;
case RE_VCOL:
- if (!re_num_cmp(win_linetabsize(reg_win == NULL ? curwin : reg_win,
+ if (!re_num_cmp(win_linetabsize(rex.reg_win == NULL
+ ? curwin : rex.reg_win,
regline,
(colnr_T)(reginput - regline)) + 1,
- scan))
+ scan)) {
status = RA_NOMATCH;
+ }
break;
case BOW: /* \<word; reginput points to w */
@@ -3893,17 +3925,19 @@ regmatch (
else if (has_mbyte) {
int this_class;
- /* Get class of current and previous char (if it exists). */
- this_class = mb_get_class_buf(reginput, reg_buf);
- if (this_class <= 1)
- status = RA_NOMATCH; /* not on a word at all */
- else if (reg_prev_class() == this_class)
- status = RA_NOMATCH; /* previous char is in same word */
+ // Get class of current and previous char (if it exists).
+ this_class = mb_get_class_tab(reginput, rex.reg_buf->b_chartab);
+ if (this_class <= 1) {
+ status = RA_NOMATCH; // Not on a word at all.
+ } else if (reg_prev_class() == this_class) {
+ status = RA_NOMATCH; // Previous char is in same word.
+ }
} else {
- if (!vim_iswordc_buf(c, reg_buf) || (reginput > regline
- && vim_iswordc_buf(reginput[-1
- ], reg_buf)))
+ if (!vim_iswordc_buf(c, rex.reg_buf)
+ || (reginput > regline
+ && vim_iswordc_buf(reginput[-1], rex.reg_buf))) {
status = RA_NOMATCH;
+ }
}
break;
@@ -3913,16 +3947,17 @@ regmatch (
else if (has_mbyte) {
int this_class, prev_class;
- /* Get class of current and previous char (if it exists). */
- this_class = mb_get_class_buf(reginput, reg_buf);
+ // Get class of current and previous char (if it exists).
+ this_class = mb_get_class_tab(reginput, rex.reg_buf->b_chartab);
prev_class = reg_prev_class();
if (this_class == prev_class
|| prev_class == 0 || prev_class == 1)
status = RA_NOMATCH;
} else {
- if (!vim_iswordc_buf(reginput[-1], reg_buf)
- || (reginput[0] != NUL && vim_iswordc_buf(c, reg_buf)))
+ if (!vim_iswordc_buf(reginput[-1], rex.reg_buf)
+ || (reginput[0] != NUL && vim_iswordc_buf(c, rex.reg_buf))) {
status = RA_NOMATCH;
+ }
}
break; /* Matched with EOW */
@@ -3949,17 +3984,20 @@ regmatch (
break;
case KWORD:
- if (!vim_iswordp_buf(reginput, reg_buf))
+ if (!vim_iswordp_buf(reginput, rex.reg_buf)) {
status = RA_NOMATCH;
- else
+ } else {
ADVANCE_REGINPUT();
+ }
break;
case SKWORD:
- if (ascii_isdigit(*reginput) || !vim_iswordp_buf(reginput, reg_buf))
+ if (ascii_isdigit(*reginput)
+ || !vim_iswordp_buf(reginput, rex.reg_buf)) {
status = RA_NOMATCH;
- else
+ } else {
ADVANCE_REGINPUT();
+ }
break;
case FNAME:
@@ -4124,16 +4162,16 @@ regmatch (
opnd = OPERAND(scan);
// Inline the first byte, for speed.
if (*opnd != *reginput
- && (!ireg_ic
+ && (!rex.reg_ic
|| (!enc_utf8
- && vim_tolower(*opnd) != vim_tolower(*reginput)))) {
+ && mb_tolower(*opnd) != mb_tolower(*reginput)))) {
status = RA_NOMATCH;
} else if (*opnd == NUL) {
// match empty string always works; happens when "~" is
// empty.
} else {
- if (opnd[1] == NUL && !(enc_utf8 && ireg_ic)) {
- len = 1; /* matched a single byte above */
+ if (opnd[1] == NUL && !(enc_utf8 && rex.reg_ic)) {
+ len = 1; // matched a single byte above
} else {
// Need to match first byte again for multi-byte.
len = (int)STRLEN(opnd);
@@ -4145,7 +4183,7 @@ regmatch (
// follows (skips over all composing chars).
if (status != RA_NOMATCH && enc_utf8
&& UTF_COMPOSINGLIKE(reginput, reginput + len)
- && !ireg_icombine
+ && !rex.reg_icombine
&& OP(next) != RE_COMPOSING) {
// raaron: This code makes a composing character get
// ignored, which is the correct behavior (sometimes)
@@ -4176,26 +4214,28 @@ regmatch (
int opndc = 0, inpc;
opnd = OPERAND(scan);
- /* Safety check (just in case 'encoding' was changed since
- * compiling the program). */
+ // Safety check (just in case 'encoding' was changed since
+ // compiling the program).
if ((len = (*mb_ptr2len)(opnd)) < 2) {
status = RA_NOMATCH;
break;
}
- if (enc_utf8)
- opndc = mb_ptr2char(opnd);
+ if (enc_utf8) {
+ opndc = utf_ptr2char(opnd);
+ }
if (enc_utf8 && utf_iscomposing(opndc)) {
/* When only a composing char is given match at any
* position where that composing char appears. */
status = RA_NOMATCH;
for (i = 0; reginput[i] != NUL; i += utf_ptr2len(reginput + i)) {
- inpc = mb_ptr2char(reginput + i);
+ inpc = utf_ptr2char(reginput + i);
if (!utf_iscomposing(inpc)) {
- if (i > 0)
+ if (i > 0) {
break;
+ }
} else if (opndc == inpc) {
- /* Include all following composing chars. */
- len = i + mb_ptr2len(reginput + i);
+ // Include all following composing chars.
+ len = i + utfc_ptr2len(reginput + i);
status = RA_MATCH;
break;
}
@@ -4215,7 +4255,7 @@ regmatch (
if (enc_utf8) {
// Skip composing characters.
while (utf_iscomposing(utf_ptr2char(reginput))) {
- mb_cptr_adv(reginput);
+ MB_CPTR_ADV(reginput);
}
}
break;
@@ -4269,9 +4309,9 @@ regmatch (
status = RA_FAIL;
else {
rp->rs_no = no;
- save_se(&rp->rs_un.sesave, &reg_startpos[no],
- &reg_startp[no]);
- /* We simply continue and handle the result when done. */
+ save_se(&rp->rs_un.sesave, &rex.reg_startpos[no],
+ &rex.reg_startp[no]);
+ // We simply continue and handle the result when done.
}
}
break;
@@ -4321,12 +4361,12 @@ regmatch (
no = op - MCLOSE;
cleanup_subexpr();
rp = regstack_push(RS_MCLOSE, scan);
- if (rp == NULL)
+ if (rp == NULL) {
status = RA_FAIL;
- else {
+ } else {
rp->rs_no = no;
- save_se(&rp->rs_un.sesave, &reg_endpos[no], &reg_endp[no]);
- /* We simply continue and handle the result when done. */
+ save_se(&rp->rs_un.sesave, &rex.reg_endpos[no], &rex.reg_endp[no]);
+ // We simply continue and handle the result when done.
}
}
break;
@@ -4369,41 +4409,40 @@ regmatch (
no = op - BACKREF;
cleanup_subexpr();
- if (!REG_MULTI) { /* Single-line regexp */
- if (reg_startp[no] == NULL || reg_endp[no] == NULL) {
- /* Backref was not set: Match an empty string. */
+ if (!REG_MULTI) { // Single-line regexp
+ if (rex.reg_startp[no] == NULL || rex.reg_endp[no] == NULL) {
+ // Backref was not set: Match an empty string.
len = 0;
} else {
- /* Compare current input with back-ref in the same
- * line. */
- len = (int)(reg_endp[no] - reg_startp[no]);
- if (cstrncmp(reg_startp[no], reginput, &len) != 0)
+ // Compare current input with back-ref in the same line.
+ len = (int)(rex.reg_endp[no] - rex.reg_startp[no]);
+ if (cstrncmp(rex.reg_startp[no], reginput, &len) != 0) {
status = RA_NOMATCH;
+ }
}
- } else { /* Multi-line regexp */
- if (reg_startpos[no].lnum < 0 || reg_endpos[no].lnum < 0) {
- /* Backref was not set: Match an empty string. */
+ } else { // Multi-line regexp
+ if (rex.reg_startpos[no].lnum < 0 || rex.reg_endpos[no].lnum < 0) {
+ // Backref was not set: Match an empty string.
len = 0;
} else {
- if (reg_startpos[no].lnum == reglnum
- && reg_endpos[no].lnum == reglnum) {
- /* Compare back-ref within the current line. */
- len = reg_endpos[no].col - reg_startpos[no].col;
- if (cstrncmp(regline + reg_startpos[no].col,
- reginput, &len) != 0)
+ if (rex.reg_startpos[no].lnum == reglnum
+ && rex.reg_endpos[no].lnum == reglnum) {
+ // Compare back-ref within the current line.
+ len = rex.reg_endpos[no].col - rex.reg_startpos[no].col;
+ if (cstrncmp(regline + rex.reg_startpos[no].col,
+ reginput, &len) != 0) {
status = RA_NOMATCH;
+ }
} else {
- /* Messy situation: Need to compare between two
- * lines. */
- int r = match_with_backref(
- reg_startpos[no].lnum,
- reg_startpos[no].col,
- reg_endpos[no].lnum,
- reg_endpos[no].col,
- &len);
-
- if (r != RA_MATCH)
+ // Messy situation: Need to compare between two lines.
+ int r = match_with_backref(rex.reg_startpos[no].lnum,
+ rex.reg_startpos[no].col,
+ rex.reg_endpos[no].lnum,
+ rex.reg_endpos[no].col,
+ &len);
+ if (r != RA_MATCH) {
status = r;
+ }
}
}
}
@@ -4467,7 +4506,7 @@ regmatch (
brace_max[no] = OPERAND_MAX(scan);
brace_count[no] = 0;
} else {
- EMSG(_(e_internal)); /* Shouldn't happen */
+ internal_error("BRACE_LIMITS");
status = RA_FAIL;
}
}
@@ -4543,13 +4582,15 @@ regmatch (
*/
if (OP(next) == EXACTLY) {
rst.nextb = *OPERAND(next);
- if (ireg_ic) {
- if (vim_isupper(rst.nextb))
- rst.nextb_ic = vim_tolower(rst.nextb);
- else
- rst.nextb_ic = vim_toupper(rst.nextb);
- } else
+ if (rex.reg_ic) {
+ if (mb_isupper(rst.nextb)) {
+ rst.nextb_ic = mb_tolower(rst.nextb);
+ } else {
+ rst.nextb_ic = mb_toupper(rst.nextb);
+ }
+ } else {
rst.nextb_ic = rst.nextb;
+ }
} else {
rst.nextb = NUL;
rst.nextb_ic = NUL;
@@ -4648,13 +4689,14 @@ regmatch (
break;
case NEWL:
- if ((c != NUL || !REG_MULTI || reglnum > reg_maxline
- || reg_line_lbr) && (c != '\n' || !reg_line_lbr))
+ if ((c != NUL || !REG_MULTI || reglnum > rex.reg_maxline
+ || rex.reg_line_lbr) && (c != '\n' || !rex.reg_line_lbr)) {
status = RA_NOMATCH;
- else if (reg_line_lbr)
+ } else if (rex.reg_line_lbr) {
ADVANCE_REGINPUT();
- else
+ } else {
reg_nextline();
+ }
break;
case END:
@@ -4693,10 +4735,11 @@ regmatch (
break;
case RS_MOPEN:
- /* Pop the state. Restore pointers when there is no match. */
- if (status == RA_NOMATCH)
- restore_se(&rp->rs_un.sesave, &reg_startpos[rp->rs_no],
- &reg_startp[rp->rs_no]);
+ // Pop the state. Restore pointers when there is no match.
+ if (status == RA_NOMATCH) {
+ restore_se(&rp->rs_un.sesave, &rex.reg_startpos[rp->rs_no],
+ &rex.reg_startp[rp->rs_no]);
+ }
regstack_pop(&scan);
break;
@@ -4709,10 +4752,11 @@ regmatch (
break;
case RS_MCLOSE:
- /* Pop the state. Restore pointers when there is no match. */
- if (status == RA_NOMATCH)
- restore_se(&rp->rs_un.sesave, &reg_endpos[rp->rs_no],
- &reg_endp[rp->rs_no]);
+ // Pop the state. Restore pointers when there is no match.
+ if (status == RA_NOMATCH) {
+ restore_se(&rp->rs_un.sesave, &rex.reg_endpos[rp->rs_no],
+ &rex.reg_endp[rp->rs_no]);
+ }
regstack_pop(&scan);
break;
@@ -4875,21 +4919,24 @@ regmatch (
(colnr_T)STRLEN(regline);
}
} else {
- if (has_mbyte)
- rp->rs_un.regsave.rs_u.pos.col -=
- (*mb_head_off)(regline, regline
- + rp->rs_un.regsave.rs_u.pos.col - 1) + 1;
- else
- --rp->rs_un.regsave.rs_u.pos.col;
+ const char_u *const line =
+ reg_getline(rp->rs_un.regsave.rs_u.pos.lnum);
+
+ rp->rs_un.regsave.rs_u.pos.col -=
+ utf_head_off(line,
+ line + rp->rs_un.regsave.rs_u.pos.col - 1)
+ + 1;
}
} else {
- if (rp->rs_un.regsave.rs_u.ptr == regline)
+ if (rp->rs_un.regsave.rs_u.ptr == regline) {
no = FAIL;
- else {
- mb_ptr_back(regline, rp->rs_un.regsave.rs_u.ptr);
- if (limit > 0 && (long)(behind_pos.rs_u.ptr
- - rp->rs_un.regsave.rs_u.ptr) > limit)
+ } else {
+ MB_PTR_BACK(regline, rp->rs_un.regsave.rs_u.ptr);
+ if (limit > 0
+ && (long)(behind_pos.rs_u.ptr
+ - rp->rs_un.regsave.rs_u.ptr) > limit) {
no = FAIL;
+ }
}
}
if (no == OK) {
@@ -4949,17 +4996,18 @@ regmatch (
if (--rst->count < rst->minval)
break;
if (reginput == regline) {
- /* backup to last char of previous line */
- --reglnum;
+ // backup to last char of previous line
+ reglnum--;
regline = reg_getline(reglnum);
- /* Just in case regrepeat() didn't count
- * right. */
- if (regline == NULL)
+ // Just in case regrepeat() didn't count right.
+ if (regline == NULL) {
break;
+ }
reginput = regline + STRLEN(regline);
fast_breakcheck();
- } else
- mb_ptr_back(regline, reginput);
+ } else {
+ MB_PTR_BACK(regline, reginput);
+ }
} else {
/* Range is backwards, use shortest match first.
* Careful: maxval and minval are exchanged!
@@ -5089,13 +5137,14 @@ regrepeat (
/* Matching anything means we continue until end-of-line (or
* end-of-file for ANY + ADD_NL), only limited by maxcount. */
while (*scan != NUL && count < maxcount) {
- ++count;
- mb_ptr_adv(scan);
+ count++;
+ MB_PTR_ADV(scan);
}
- if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > reg_maxline
- || reg_line_lbr || count == maxcount)
+ if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > rex.reg_maxline
+ || rex.reg_line_lbr || count == maxcount) {
break;
- ++count; /* count the line-break */
+ }
+ count++; // count the line-break
reg_nextline();
scan = reginput;
if (got_int)
@@ -5105,103 +5154,114 @@ regrepeat (
case IDENT:
case IDENT + ADD_NL:
- testval = TRUE;
- /*FALLTHROUGH*/
+ testval = 1;
+ FALLTHROUGH;
case SIDENT:
case SIDENT + ADD_NL:
while (count < maxcount) {
if (vim_isIDc(PTR2CHAR(scan)) && (testval || !ascii_isdigit(*scan))) {
- mb_ptr_adv(scan);
+ MB_PTR_ADV(scan);
} else if (*scan == NUL) {
- if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > reg_maxline
- || reg_line_lbr)
+ if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > rex.reg_maxline
+ || rex.reg_line_lbr) {
break;
+ }
reg_nextline();
scan = reginput;
if (got_int)
break;
- } else if (reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
- ++scan;
- else
+ } else if (rex.reg_line_lbr && *scan == '\n' && WITH_NL(OP(p))) {
+ scan++;
+ } else {
break;
+ }
++count;
}
break;
case KWORD:
case KWORD + ADD_NL:
- testval = TRUE;
- /*FALLTHROUGH*/
+ testval = 1;
+ FALLTHROUGH;
case SKWORD:
case SKWORD + ADD_NL:
while (count < maxcount) {
- if (vim_iswordp_buf(scan, reg_buf)
+ if (vim_iswordp_buf(scan, rex.reg_buf)
&& (testval || !ascii_isdigit(*scan))) {
- mb_ptr_adv(scan);
+ MB_PTR_ADV(scan);
} else if (*scan == NUL) {
- if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > reg_maxline
- || reg_line_lbr)
+ if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > rex.reg_maxline
+ || rex.reg_line_lbr) {
break;
+ }
reg_nextline();
scan = reginput;
- if (got_int)
+ if (got_int) {
break;
- } else if (reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
- ++scan;
- else
+ }
+ } else if (rex.reg_line_lbr && *scan == '\n' && WITH_NL(OP(p))) {
+ scan++;
+ } else {
break;
- ++count;
+ }
+ count++;
}
break;
case FNAME:
case FNAME + ADD_NL:
- testval = TRUE;
- /*FALLTHROUGH*/
+ testval = 1;
+ FALLTHROUGH;
case SFNAME:
case SFNAME + ADD_NL:
while (count < maxcount) {
if (vim_isfilec(PTR2CHAR(scan)) && (testval || !ascii_isdigit(*scan))) {
- mb_ptr_adv(scan);
+ MB_PTR_ADV(scan);
} else if (*scan == NUL) {
- if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > reg_maxline
- || reg_line_lbr)
+ if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > rex.reg_maxline
+ || rex.reg_line_lbr) {
break;
+ }
reg_nextline();
scan = reginput;
- if (got_int)
+ if (got_int) {
break;
- } else if (reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
- ++scan;
- else
+ }
+ } else if (rex.reg_line_lbr && *scan == '\n' && WITH_NL(OP(p))) {
+ scan++;
+ } else {
break;
- ++count;
+ }
+ count++;
}
break;
case PRINT:
case PRINT + ADD_NL:
- testval = TRUE;
- /*FALLTHROUGH*/
+ testval = 1;
+ FALLTHROUGH;
case SPRINT:
case SPRINT + ADD_NL:
while (count < maxcount) {
if (*scan == NUL) {
- if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > reg_maxline
- || reg_line_lbr)
+ if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > rex.reg_maxline
+ || rex.reg_line_lbr) {
break;
+ }
reg_nextline();
scan = reginput;
- if (got_int)
+ if (got_int) {
break;
+ }
} else if (vim_isprintc(PTR2CHAR(scan)) == 1
&& (testval || !ascii_isdigit(*scan))) {
- mb_ptr_adv(scan);
- } else if (reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
- ++scan;
- else
+ MB_PTR_ADV(scan);
+ } else if (rex.reg_line_lbr && *scan == '\n' && WITH_NL(OP(p))) {
+ scan++;
+ } else {
break;
- ++count;
+ }
+ count++;
}
break;
@@ -5212,9 +5272,10 @@ do_class:
while (count < maxcount) {
int l;
if (*scan == NUL) {
- if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > reg_maxline
- || reg_line_lbr)
+ if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > rex.reg_maxline
+ || rex.reg_line_lbr) {
break;
+ }
reg_nextline();
scan = reginput;
if (got_int)
@@ -5223,12 +5284,13 @@ do_class:
if (testval != 0)
break;
scan += l;
- } else if ((class_tab[*scan] & mask) == testval)
- ++scan;
- else if (reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
- ++scan;
- else
+ } else if ((class_tab[*scan] & mask) == testval) {
+ scan++;
+ } else if (rex.reg_line_lbr && *scan == '\n' && WITH_NL(OP(p))) {
+ scan++;
+ } else {
break;
+ }
++count;
}
break;
@@ -5306,12 +5368,12 @@ do_class:
{
int cu, cl;
- /* This doesn't do a multi-byte character, because a MULTIBYTECODE
- * would have been used for it. It does handle single-byte
- * characters, such as latin1. */
- if (ireg_ic) {
- cu = vim_toupper(*opnd);
- cl = vim_tolower(*opnd);
+ // This doesn't do a multi-byte character, because a MULTIBYTECODE
+ // would have been used for it. It does handle single-byte
+ // characters, such as latin1.
+ if (rex.reg_ic) {
+ cu = mb_toupper(*opnd);
+ cl = mb_tolower(*opnd);
while (count < maxcount && (*scan == cu || *scan == cl)) {
count++;
scan++;
@@ -5333,17 +5395,19 @@ do_class:
/* Safety check (just in case 'encoding' was changed since
* compiling the program). */
if ((len = (*mb_ptr2len)(opnd)) > 1) {
- if (ireg_ic && enc_utf8)
+ if (rex.reg_ic && enc_utf8) {
cf = utf_fold(utf_ptr2char(opnd));
+ }
while (count < maxcount && (*mb_ptr2len)(scan) >= len) {
for (i = 0; i < len; ++i) {
if (opnd[i] != scan[i]) {
break;
}
}
- if (i < len && (!ireg_ic || !enc_utf8
- || utf_fold(utf_ptr2char(scan)) != cf))
+ if (i < len && (!rex.reg_ic || !enc_utf8
+ || utf_fold(utf_ptr2char(scan)) != cf)) {
break;
+ }
scan += len;
++count;
}
@@ -5353,26 +5417,29 @@ do_class:
case ANYOF:
case ANYOF + ADD_NL:
- testval = TRUE;
- /*FALLTHROUGH*/
+ testval = 1;
+ FALLTHROUGH;
case ANYBUT:
case ANYBUT + ADD_NL:
while (count < maxcount) {
int len;
if (*scan == NUL) {
- if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > reg_maxline
- || reg_line_lbr)
+ if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > rex.reg_maxline
+ || rex.reg_line_lbr) {
break;
+ }
reg_nextline();
scan = reginput;
- if (got_int)
+ if (got_int) {
break;
- } else if (reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
- ++scan;
- else if (has_mbyte && (len = (*mb_ptr2len)(scan)) > 1) {
- if ((cstrchr(opnd, (*mb_ptr2char)(scan)) == NULL) == testval)
+ }
+ } else if (rex.reg_line_lbr && *scan == '\n' && WITH_NL(OP(p))) {
+ scan++;
+ } else if ((len = utfc_ptr2len(scan)) > 1) {
+ if ((cstrchr(opnd, utf_ptr2char(scan)) == NULL) == testval) {
break;
+ }
scan += len;
} else {
if ((cstrchr(opnd, *scan) == NULL) == testval)
@@ -5385,13 +5452,14 @@ do_class:
case NEWL:
while (count < maxcount
- && ((*scan == NUL && reglnum <= reg_maxline && !reg_line_lbr
- && REG_MULTI) || (*scan == '\n' && reg_line_lbr))) {
+ && ((*scan == NUL && reglnum <= rex.reg_maxline && !rex.reg_line_lbr
+ && REG_MULTI) || (*scan == '\n' && rex.reg_line_lbr))) {
count++;
- if (reg_line_lbr)
+ if (rex.reg_line_lbr) {
ADVANCE_REGINPUT();
- else
+ } else {
reg_nextline();
+ }
scan = reginput;
if (got_int)
break;
@@ -5441,10 +5509,11 @@ static int prog_magic_wrong(void)
{
regprog_T *prog;
- prog = REG_MULTI ? reg_mmatch->regprog : reg_match->regprog;
- if (prog->engine == &nfa_regengine)
- /* For NFA matcher we don't check the magic */
- return FALSE;
+ prog = REG_MULTI ? rex.reg_mmatch->regprog : rex.reg_match->regprog;
+ if (prog->engine == &nfa_regengine) {
+ // For NFA matcher we don't check the magic
+ return false;
+ }
if (UCHARAT(((bt_regprog_T *)prog)->program) != REGMAGIC) {
EMSG(_(e_re_corr));
@@ -5462,12 +5531,12 @@ static void cleanup_subexpr(void)
{
if (need_clear_subexpr) {
if (REG_MULTI) {
- /* Use 0xff to set lnum to -1 */
- memset(reg_startpos, 0xff, sizeof(lpos_T) * NSUBEXP);
- memset(reg_endpos, 0xff, sizeof(lpos_T) * NSUBEXP);
+ // Use 0xff to set lnum to -1
+ memset(rex.reg_startpos, 0xff, sizeof(lpos_T) * NSUBEXP);
+ memset(rex.reg_endpos, 0xff, sizeof(lpos_T) * NSUBEXP);
} else {
- memset(reg_startp, 0, sizeof(char_u *) * NSUBEXP);
- memset(reg_endp, 0, sizeof(char_u *) * NSUBEXP);
+ memset(rex.reg_startp, 0, sizeof(char_u *) * NSUBEXP);
+ memset(rex.reg_endp, 0, sizeof(char_u *) * NSUBEXP);
}
need_clear_subexpr = FALSE;
}
@@ -5496,17 +5565,17 @@ static void save_subexpr(regbehind_T *bp)
{
int i;
- /* When "need_clear_subexpr" is set we don't need to save the values, only
- * remember that this flag needs to be set again when restoring. */
+ // When "need_clear_subexpr" is set we don't need to save the values, only
+ // remember that this flag needs to be set again when restoring.
bp->save_need_clear_subexpr = need_clear_subexpr;
if (!need_clear_subexpr) {
for (i = 0; i < NSUBEXP; ++i) {
if (REG_MULTI) {
- bp->save_start[i].se_u.pos = reg_startpos[i];
- bp->save_end[i].se_u.pos = reg_endpos[i];
+ bp->save_start[i].se_u.pos = rex.reg_startpos[i];
+ bp->save_end[i].se_u.pos = rex.reg_endpos[i];
} else {
- bp->save_start[i].se_u.ptr = reg_startp[i];
- bp->save_end[i].se_u.ptr = reg_endp[i];
+ bp->save_start[i].se_u.ptr = rex.reg_startp[i];
+ bp->save_end[i].se_u.ptr = rex.reg_endp[i];
}
}
}
@@ -5524,11 +5593,11 @@ static void restore_subexpr(regbehind_T *bp)
if (!need_clear_subexpr) {
for (i = 0; i < NSUBEXP; ++i) {
if (REG_MULTI) {
- reg_startpos[i] = bp->save_start[i].se_u.pos;
- reg_endpos[i] = bp->save_end[i].se_u.pos;
+ rex.reg_startpos[i] = bp->save_start[i].se_u.pos;
+ rex.reg_endpos[i] = bp->save_end[i].se_u.pos;
} else {
- reg_startp[i] = bp->save_start[i].se_u.ptr;
- reg_endp[i] = bp->save_end[i].se_u.ptr;
+ rex.reg_startp[i] = bp->save_start[i].se_u.ptr;
+ rex.reg_endp[i] = bp->save_end[i].se_u.ptr;
}
}
}
@@ -5664,10 +5733,12 @@ static int match_with_backref(linenr_T start_lnum, colnr_T start_col, linenr_T e
return RA_NOMATCH; /* doesn't match */
if (bytelen != NULL)
*bytelen += len;
- if (clnum == end_lnum)
- break; /* match and at end! */
- if (reglnum >= reg_maxline)
- return RA_NOMATCH; /* text too short */
+ if (clnum == end_lnum) {
+ break; // match and at end!
+ }
+ if (reglnum >= rex.reg_maxline) {
+ return RA_NOMATCH; // text too short
+ }
/* Advance to next line. */
reg_nextline();
@@ -6215,24 +6286,22 @@ static void mb_decompose(int c, int *c1, int *c2, int *c3)
}
}
-/*
- * Compare two strings, ignore case if ireg_ic set.
- * Return 0 if strings match, non-zero otherwise.
- * Correct the length "*n" when composing characters are ignored.
- */
+// Compare two strings, ignore case if rex.reg_ic set.
+// Return 0 if strings match, non-zero otherwise.
+// Correct the length "*n" when composing characters are ignored.
static int cstrncmp(char_u *s1, char_u *s2, int *n)
{
int result;
- if (!ireg_ic)
+ if (!rex.reg_ic) {
result = STRNCMP(s1, s2, *n);
- else {
+ } else {
assert(*n >= 0);
result = mb_strnicmp(s1, s2, (size_t)*n);
}
- /* if it failed and it's utf8 and we want to combineignore: */
- if (result != 0 && enc_utf8 && ireg_icombine) {
+ // if it failed and it's utf8 and we want to combineignore:
+ if (result != 0 && enc_utf8 && rex.reg_icombine) {
char_u *str1, *str2;
int c1, c2, c11, c12;
int junk;
@@ -6243,20 +6312,21 @@ static int cstrncmp(char_u *s1, char_u *s2, int *n)
str2 = s2;
c1 = c2 = 0;
while ((int)(str1 - s1) < *n) {
- c1 = mb_ptr2char_adv(&str1);
- c2 = mb_ptr2char_adv(&str2);
+ c1 = mb_ptr2char_adv((const char_u **)&str1);
+ c2 = mb_ptr2char_adv((const char_u **)&str2);
/* decompose the character if necessary, into 'base' characters
* because I don't care about Arabic, I will hard-code the Hebrew
* which I *do* care about! So sue me... */
- if (c1 != c2 && (!ireg_ic || utf_fold(c1) != utf_fold(c2))) {
- /* decomposition necessary? */
+ if (c1 != c2 && (!rex.reg_ic || utf_fold(c1) != utf_fold(c2))) {
+ // decomposition necessary?
mb_decompose(c1, &c11, &junk, &junk);
mb_decompose(c2, &c12, &junk, &junk);
c1 = c11;
c2 = c12;
- if (c11 != c12 && (!ireg_ic || utf_fold(c11) != utf_fold(c12)))
+ if (c11 != c12 && (!rex.reg_ic || utf_fold(c11) != utf_fold(c12))) {
break;
+ }
}
}
result = c2 - c1;
@@ -6267,48 +6337,6 @@ static int cstrncmp(char_u *s1, char_u *s2, int *n)
return result;
}
-/*
- * cstrchr: This function is used a lot for simple searches, keep it fast!
- */
-static char_u *cstrchr(char_u *s, int c)
-{
- char_u *p;
- int cc;
-
- if (!ireg_ic
- || (!enc_utf8 && mb_char2len(c) > 1)
- )
- return vim_strchr(s, c);
-
- /* tolower() and toupper() can be slow, comparing twice should be a lot
- * faster (esp. when using MS Visual C++!).
- * For UTF-8 need to use folded case. */
- if (enc_utf8 && c > 0x80)
- cc = utf_fold(c);
- else if (vim_isupper(c))
- cc = vim_tolower(c);
- else if (vim_islower(c))
- cc = vim_toupper(c);
- else
- return vim_strchr(s, c);
-
- if (has_mbyte) {
- for (p = s; *p != NUL; p += (*mb_ptr2len)(p)) {
- if (enc_utf8 && c > 0x80) {
- if (utf_fold(utf_ptr2char(p)) == cc)
- return p;
- } else if (*p == c || *p == cc)
- return p;
- }
- } else
- /* Faster version for when there are no multi-byte characters. */
- for (p = s; *p != NUL; ++p)
- if (*p == c || *p == cc)
- return p;
-
- return NULL;
-}
-
/***************************************************************
* regsub stuff *
***************************************************************/
@@ -6319,28 +6347,28 @@ static char_u *cstrchr(char_u *s, int c)
static fptr_T do_upper(int *d, int c)
{
- *d = vim_toupper(c);
+ *d = mb_toupper(c);
return (fptr_T)NULL;
}
static fptr_T do_Upper(int *d, int c)
{
- *d = vim_toupper(c);
+ *d = mb_toupper(c);
return (fptr_T)do_Upper;
}
static fptr_T do_lower(int *d, int c)
{
- *d = vim_tolower(c);
+ *d = mb_tolower(c);
return (fptr_T)NULL;
}
static fptr_T do_Lower(int *d, int c)
{
- *d = vim_tolower(c);
+ *d = mb_tolower(c);
return (fptr_T)do_Lower;
}
@@ -6408,55 +6436,126 @@ char_u *regtilde(char_u *source, int magic)
static int can_f_submatch = FALSE; /* TRUE when submatch() can be used */
-/* These pointers are used instead of reg_match and reg_mmatch for
- * reg_submatch(). Needed for when the substitution string is an expression
- * that contains a call to substitute() and submatch(). */
-static regmatch_T *submatch_match;
-static regmmatch_T *submatch_mmatch;
-static linenr_T submatch_firstlnum;
-static linenr_T submatch_maxline;
-static int submatch_line_lbr;
+// These pointers are used for reg_submatch(). Needed for when the
+// substitution string is an expression that contains a call to substitute()
+// and submatch().
+typedef struct {
+ regmatch_T *sm_match;
+ regmmatch_T *sm_mmatch;
+ linenr_T sm_firstlnum;
+ linenr_T sm_maxline;
+ int sm_line_lbr;
+} regsubmatch_T;
+
+static regsubmatch_T rsm; // can only be used when can_f_submatch is true
+
+/// Put the submatches in "argv[0]" which is a list passed into call_func() by
+/// vim_regsub_both().
+static int fill_submatch_list(int argc, typval_T *argv, int argcount)
+{
+ if (argcount == 0) {
+ // called function doesn't take an argument
+ return 0;
+ }
+
+ // Relies on sl_list to be the first item in staticList10_T.
+ tv_list_init_static10((staticList10_T *)argv->vval.v_list);
-/*
- * vim_regsub() - perform substitutions after a vim_regexec() or
- * vim_regexec_multi() match.
- *
- * If "copy" is TRUE really copy into "dest".
- * If "copy" is FALSE nothing is copied, this is just to find out the length
- * of the result.
- *
- * If "backslash" is TRUE, a backslash will be removed later, need to double
- * them to keep them, and insert a backslash before a CR to avoid it being
- * replaced with a line break later.
- *
- * Note: The matched text must not change between the call of
- * vim_regexec()/vim_regexec_multi() and vim_regsub()! It would make the back
- * references invalid!
- *
- * Returns the size of the replacement, including terminating NUL.
- */
-int vim_regsub(regmatch_T *rmp, char_u *source, char_u *dest, int copy, int magic, int backslash)
+ // There are always 10 list items in staticList10_T.
+ listitem_T *li = tv_list_first(argv->vval.v_list);
+ for (int i = 0; i < 10; i++) {
+ char_u *s = rsm.sm_match->startp[i];
+ if (s == NULL || rsm.sm_match->endp[i] == NULL) {
+ s = NULL;
+ } else {
+ s = vim_strnsave(s, (int)(rsm.sm_match->endp[i] - s));
+ }
+ TV_LIST_ITEM_TV(li)->v_type = VAR_STRING;
+ TV_LIST_ITEM_TV(li)->vval.v_string = s;
+ li = TV_LIST_ITEM_NEXT(argv->vval.v_list, li);
+ }
+ return 1;
+}
+
+static void clear_submatch_list(staticList10_T *sl)
{
- reg_match = rmp;
- reg_mmatch = NULL;
- reg_maxline = 0;
- reg_buf = curbuf;
- reg_line_lbr = TRUE;
- return vim_regsub_both(source, dest, copy, magic, backslash);
+ TV_LIST_ITER(&sl->sl_list, li, {
+ xfree(TV_LIST_ITEM_TV(li)->vval.v_string);
+ });
+}
+
+/// vim_regsub() - perform substitutions after a vim_regexec() or
+/// vim_regexec_multi() match.
+///
+/// If "copy" is TRUE really copy into "dest".
+/// If "copy" is FALSE nothing is copied, this is just to find out the length
+/// of the result.
+///
+/// If "backslash" is TRUE, a backslash will be removed later, need to double
+/// them to keep them, and insert a backslash before a CR to avoid it being
+/// replaced with a line break later.
+///
+/// Note: The matched text must not change between the call of
+/// vim_regexec()/vim_regexec_multi() and vim_regsub()! It would make the back
+/// references invalid!
+///
+/// Returns the size of the replacement, including terminating NUL.
+int vim_regsub(regmatch_T *rmp, char_u *source, typval_T *expr, char_u *dest,
+ int copy, int magic, int backslash)
+{
+ regexec_T rex_save;
+ bool rex_in_use_save = rex_in_use;
+
+ if (rex_in_use) {
+ // Being called recursively, save the state.
+ rex_save = rex;
+ }
+ rex_in_use = true;
+
+ rex.reg_match = rmp;
+ rex.reg_mmatch = NULL;
+ rex.reg_maxline = 0;
+ rex.reg_buf = curbuf;
+ rex.reg_line_lbr = true;
+ int result = vim_regsub_both(source, expr, dest, copy, magic, backslash);
+
+ rex_in_use = rex_in_use_save;
+ if (rex_in_use) {
+ rex = rex_save;
+ }
+
+ return result;
}
int vim_regsub_multi(regmmatch_T *rmp, linenr_T lnum, char_u *source, char_u *dest, int copy, int magic, int backslash)
{
- reg_match = NULL;
- reg_mmatch = rmp;
- reg_buf = curbuf; /* always works on the current buffer! */
- reg_firstlnum = lnum;
- reg_maxline = curbuf->b_ml.ml_line_count - lnum;
- reg_line_lbr = FALSE;
- return vim_regsub_both(source, dest, copy, magic, backslash);
+ regexec_T rex_save;
+ bool rex_in_use_save = rex_in_use;
+
+ if (rex_in_use) {
+ // Being called recursively, save the state.
+ rex_save = rex;
+ }
+ rex_in_use = true;
+
+ rex.reg_match = NULL;
+ rex.reg_mmatch = rmp;
+ rex.reg_buf = curbuf; // always works on the current buffer!
+ rex.reg_firstlnum = lnum;
+ rex.reg_maxline = curbuf->b_ml.ml_line_count - lnum;
+ rex.reg_line_lbr = false;
+ int result = vim_regsub_both(source, NULL, dest, copy, magic, backslash);
+
+ rex_in_use = rex_in_use_save;
+ if (rex_in_use) {
+ rex = rex_save;
+ }
+
+ return result;
}
-static int vim_regsub_both(char_u *source, char_u *dest, int copy, int magic, int backslash)
+static int vim_regsub_both(char_u *source, typval_T *expr, char_u *dest,
+ int copy, int magic, int backslash)
{
char_u *src;
char_u *dst;
@@ -6470,8 +6569,8 @@ static int vim_regsub_both(char_u *source, char_u *dest, int copy, int magic, in
int len = 0; /* init for GCC */
static char_u *eval_result = NULL;
- /* Be paranoid... */
- if (source == NULL || dest == NULL) {
+ // Be paranoid...
+ if ((source == NULL && expr == NULL) || dest == NULL) {
EMSG(_(e_null));
return 0;
}
@@ -6480,16 +6579,12 @@ static int vim_regsub_both(char_u *source, char_u *dest, int copy, int magic, in
src = source;
dst = dest;
- /*
- * When the substitute part starts with "\=" evaluate it as an expression.
- */
- if (source[0] == '\\' && source[1] == '='
- && !can_f_submatch /* can't do this recursively */
- ) {
- /* To make sure that the length doesn't change between checking the
- * length and copying the string, and to speed up things, the
- * resulting string is saved from the call with "copy" == FALSE to the
- * call with "copy" == TRUE. */
+ // When the substitute part starts with "\=" evaluate it as an expression.
+ if (expr != NULL || (source[0] == '\\' && source[1] == '=')) {
+ // To make sure that the length doesn't change between checking the
+ // length and copying the string, and to speed up things, the
+ // resulting string is saved from the call with "copy" == FALSE to the
+ // call with "copy" == TRUE.
if (copy) {
if (eval_result != NULL) {
STRCPY(dest, eval_result);
@@ -6498,45 +6593,82 @@ static int vim_regsub_both(char_u *source, char_u *dest, int copy, int magic, in
eval_result = NULL;
}
} else {
- win_T *save_reg_win;
- int save_ireg_ic;
+ int prev_can_f_submatch = can_f_submatch;
+ regsubmatch_T rsm_save;
xfree(eval_result);
- /* The expression may contain substitute(), which calls us
- * recursively. Make sure submatch() gets the text from the first
- * level. Don't need to save "reg_buf", because
- * vim_regexec_multi() can't be called recursively. */
- submatch_match = reg_match;
- submatch_mmatch = reg_mmatch;
- submatch_firstlnum = reg_firstlnum;
- submatch_maxline = reg_maxline;
- submatch_line_lbr = reg_line_lbr;
- save_reg_win = reg_win;
- save_ireg_ic = ireg_ic;
- can_f_submatch = TRUE;
-
- eval_result = eval_to_string(source + 2, NULL, TRUE);
+ // The expression may contain substitute(), which calls us
+ // recursively. Make sure submatch() gets the text from the first
+ // level.
+ if (can_f_submatch) {
+ rsm_save = rsm;
+ }
+ can_f_submatch = true;
+ rsm.sm_match = rex.reg_match;
+ rsm.sm_mmatch = rex.reg_mmatch;
+ rsm.sm_firstlnum = rex.reg_firstlnum;
+ rsm.sm_maxline = rex.reg_maxline;
+ rsm.sm_line_lbr = rex.reg_line_lbr;
+
+ if (expr != NULL) {
+ typval_T argv[2];
+ int dummy;
+ typval_T rettv;
+ staticList10_T matchList = TV_LIST_STATIC10_INIT;
+
+ rettv.v_type = VAR_STRING;
+ rettv.vval.v_string = NULL;
+ argv[0].v_type = VAR_LIST;
+ 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,
+ 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,
+ fill_submatch_list, 0L, 0L, &dummy,
+ true, partial, NULL);
+ }
+ if (tv_list_len(&matchList.sl_list) > 0) {
+ // fill_submatch_list() was called.
+ clear_submatch_list(&matchList);
+ }
+ char buf[NUMBUFLEN];
+ eval_result = (char_u *)tv_get_string_buf_chk(&rettv, buf);
+ if (eval_result != NULL) {
+ eval_result = vim_strsave(eval_result);
+ }
+ tv_clear(&rettv);
+ } else {
+ eval_result = eval_to_string(source + 2, NULL, true);
+ }
+
if (eval_result != NULL) {
int had_backslash = FALSE;
- for (s = eval_result; *s != NUL; mb_ptr_adv(s)) {
- /* Change NL to CR, so that it becomes a line break,
- * unless called from vim_regexec_nl().
- * Skip over a backslashed character. */
- if (*s == NL && !submatch_line_lbr)
+ for (s = eval_result; *s != NUL; MB_PTR_ADV(s)) {
+ // Change NL to CR, so that it becomes a line break,
+ // unless called from vim_regexec_nl().
+ // Skip over a backslashed character.
+ if (*s == NL && !rsm.sm_line_lbr) {
*s = CAR;
- else if (*s == '\\' && s[1] != NUL) {
- ++s;
+ } else if (*s == '\\' && s[1] != NUL) {
+ s++;
/* Change NL to CR here too, so that this works:
* :s/abc\\\ndef/\="aaa\\\nbbb"/ on text:
* abc\
* def
* Not when called from vim_regexec_nl().
*/
- if (*s == NL && !submatch_line_lbr)
+ if (*s == NL && !rsm.sm_line_lbr) {
*s = CAR;
- had_backslash = TRUE;
+ }
+ had_backslash = true;
}
}
if (had_backslash && backslash) {
@@ -6549,14 +6681,10 @@ static int vim_regsub_both(char_u *source, char_u *dest, int copy, int magic, in
dst += STRLEN(eval_result);
}
- reg_match = submatch_match;
- reg_mmatch = submatch_mmatch;
- reg_firstlnum = submatch_firstlnum;
- reg_maxline = submatch_maxline;
- reg_line_lbr = submatch_line_lbr;
- reg_win = save_reg_win;
- ireg_ic = save_ireg_ic;
- can_f_submatch = FALSE;
+ can_f_submatch = prev_can_f_submatch;
+ if (can_f_submatch) {
+ rsm = rsm_save;
+ }
}
} else
while ((c = *src++) != NUL) {
@@ -6617,80 +6745,83 @@ static int vim_regsub_both(char_u *source, char_u *dest, int copy, int magic, in
}
c = *src++;
}
- } else if (has_mbyte)
- c = mb_ptr2char(src - 1);
-
- /* Write to buffer, if copy is set. */
- if (func_one != (fptr_T)NULL)
- /* Turbo C complains without the typecast */
+ } else {
+ c = utf_ptr2char(src - 1);
+ }
+ // Write to buffer, if copy is set.
+ if (func_one != NULL) {
func_one = (fptr_T)(func_one(&cc, c));
- else if (func_all != (fptr_T)NULL)
- /* Turbo C complains without the typecast */
+ } else if (func_all != NULL) {
func_all = (fptr_T)(func_all(&cc, c));
- else /* just copy */
+ } else {
+ // just copy
cc = c;
+ }
- if (has_mbyte) {
- int totlen = mb_ptr2len(src - 1);
+ int totlen = utfc_ptr2len(src - 1);
- if (copy)
- mb_char2bytes(cc, dst);
- dst += mb_char2len(cc) - 1;
- if (enc_utf8) {
- int clen = utf_ptr2len(src - 1);
+ if (copy) {
+ utf_char2bytes(cc, dst);
+ }
+ dst += utf_char2len(cc) - 1;
+ int clen = utf_ptr2len(src - 1);
- /* If the character length is shorter than "totlen", there
- * are composing characters; copy them as-is. */
- if (clen < totlen) {
- if (copy)
- memmove(dst + 1, src - 1 + clen,
- (size_t)(totlen - clen));
- dst += totlen - clen;
- }
+ // If the character length is shorter than "totlen", there
+ // are composing characters; copy them as-is.
+ if (clen < totlen) {
+ if (copy) {
+ memmove(dst + 1, src - 1 + clen, (size_t)(totlen - clen));
}
- src += totlen - 1;
- } else if (copy)
- *dst = cc;
+ dst += totlen - clen;
+ }
+ src += totlen - 1;
dst++;
} else {
if (REG_MULTI) {
- clnum = reg_mmatch->startpos[no].lnum;
- if (clnum < 0 || reg_mmatch->endpos[no].lnum < 0)
+ clnum = rex.reg_mmatch->startpos[no].lnum;
+ if (clnum < 0 || rex.reg_mmatch->endpos[no].lnum < 0) {
s = NULL;
- else {
- s = reg_getline(clnum) + reg_mmatch->startpos[no].col;
- if (reg_mmatch->endpos[no].lnum == clnum)
- len = reg_mmatch->endpos[no].col
- - reg_mmatch->startpos[no].col;
- else
+ } else {
+ s = reg_getline(clnum) + rex.reg_mmatch->startpos[no].col;
+ if (rex.reg_mmatch->endpos[no].lnum == clnum) {
+ len = rex.reg_mmatch->endpos[no].col
+ - rex.reg_mmatch->startpos[no].col;
+ } else {
len = (int)STRLEN(s);
+ }
}
} else {
- s = reg_match->startp[no];
- if (reg_match->endp[no] == NULL)
+ s = rex.reg_match->startp[no];
+ if (rex.reg_match->endp[no] == NULL) {
s = NULL;
- else
- len = (int)(reg_match->endp[no] - s);
+ } else {
+ len = (int)(rex.reg_match->endp[no] - s);
+ }
}
if (s != NULL) {
for (;; ) {
if (len == 0) {
if (REG_MULTI) {
- if (reg_mmatch->endpos[no].lnum == clnum)
+ if (rex.reg_mmatch->endpos[no].lnum == clnum) {
break;
- if (copy)
+ }
+ if (copy) {
*dst = CAR;
- ++dst;
+ }
+ dst++;
s = reg_getline(++clnum);
- if (reg_mmatch->endpos[no].lnum == clnum)
- len = reg_mmatch->endpos[no].col;
- else
+ if (rex.reg_mmatch->endpos[no].lnum == clnum) {
+ len = rex.reg_mmatch->endpos[no].col;
+ } else {
len = (int)STRLEN(s);
- } else
+ }
+ } else {
break;
- } else if (*s == NUL) { /* we hit NUL. */
- if (copy)
+ }
+ } else if (*s == NUL) { // we hit NUL.
+ if (copy) {
EMSG(_(e_re_damg));
+ }
goto exit;
} else {
if (backslash && (*s == CAR || *s == '\\')) {
@@ -6706,10 +6837,7 @@ static int vim_regsub_both(char_u *source, char_u *dest, int copy, int magic, in
}
dst += 2;
} else {
- if (has_mbyte)
- c = mb_ptr2char(s);
- else
- c = *s;
+ c = utf_ptr2char(s);
if (func_one != (fptr_T)NULL)
/* Turbo C complains without the typecast */
@@ -6723,20 +6851,19 @@ static int vim_regsub_both(char_u *source, char_u *dest, int copy, int magic, in
if (has_mbyte) {
int l;
- /* Copy composing characters separately, one
- * at a time. */
- if (enc_utf8)
- l = utf_ptr2len(s) - 1;
- else
- l = mb_ptr2len(s) - 1;
+ // Copy composing characters separately, one
+ // at a time.
+ l = utf_ptr2len(s) - 1;
s += l;
len -= l;
- if (copy)
- mb_char2bytes(cc, dst);
- dst += mb_char2len(cc) - 1;
- } else if (copy)
+ if (copy) {
+ utf_char2bytes(cc, dst);
+ }
+ dst += utf_char2len(cc) - 1;
+ } else if (copy) {
*dst = cc;
+ }
dst++;
}
@@ -6764,16 +6891,16 @@ exit:
static char_u *reg_getline_submatch(linenr_T lnum)
{
char_u *s;
- linenr_T save_first = reg_firstlnum;
- linenr_T save_max = reg_maxline;
+ linenr_T save_first = rex.reg_firstlnum;
+ linenr_T save_max = rex.reg_maxline;
- reg_firstlnum = submatch_firstlnum;
- reg_maxline = submatch_maxline;
+ rex.reg_firstlnum = rsm.sm_firstlnum;
+ rex.reg_maxline = rsm.sm_maxline;
s = reg_getline(lnum);
- reg_firstlnum = save_first;
- reg_maxline = save_max;
+ rex.reg_firstlnum = save_first;
+ rex.reg_maxline = save_max;
return s;
}
@@ -6792,39 +6919,41 @@ char_u *reg_submatch(int no)
if (!can_f_submatch || no < 0)
return NULL;
- if (submatch_match == NULL) {
+ if (rsm.sm_match == NULL) {
ssize_t len;
/*
* First round: compute the length and allocate memory.
* Second round: copy the text.
*/
- for (round = 1; round <= 2; ++round) {
- lnum = submatch_mmatch->startpos[no].lnum;
- if (lnum < 0 || submatch_mmatch->endpos[no].lnum < 0)
+ for (round = 1; round <= 2; round++) {
+ lnum = rsm.sm_mmatch->startpos[no].lnum;
+ if (lnum < 0 || rsm.sm_mmatch->endpos[no].lnum < 0) {
return NULL;
+ }
- s = reg_getline_submatch(lnum) + submatch_mmatch->startpos[no].col;
- if (s == NULL) /* anti-crash check, cannot happen? */
+ s = reg_getline_submatch(lnum) + rsm.sm_mmatch->startpos[no].col;
+ if (s == NULL) { // anti-crash check, cannot happen?
break;
- if (submatch_mmatch->endpos[no].lnum == lnum) {
- /* Within one line: take form start to end col. */
- len = submatch_mmatch->endpos[no].col
- - submatch_mmatch->startpos[no].col;
- if (round == 2)
+ }
+ if (rsm.sm_mmatch->endpos[no].lnum == lnum) {
+ // Within one line: take form start to end col.
+ len = rsm.sm_mmatch->endpos[no].col - rsm.sm_mmatch->startpos[no].col;
+ if (round == 2) {
STRLCPY(retval, s, len + 1);
- ++len;
+ }
+ len++;
} else {
- /* Multiple lines: take start line from start col, middle
- * lines completely and end line up to end col. */
- len = STRLEN(s);
+ // Multiple lines: take start line from start col, middle
+ // lines completely and end line up to end col.
+ len = (ssize_t)STRLEN(s);
if (round == 2) {
STRCPY(retval, s);
retval[len] = '\n';
}
- ++len;
- ++lnum;
- while (lnum < submatch_mmatch->endpos[no].lnum) {
+ len++;
+ lnum++;
+ while (lnum < rsm.sm_mmatch->endpos[no].lnum) {
s = reg_getline_submatch(lnum++);
if (round == 2)
STRCPY(retval + len, s);
@@ -6833,13 +6962,15 @@ char_u *reg_submatch(int no)
retval[len] = '\n';
++len;
}
- if (round == 2)
+ if (round == 2) {
STRNCPY(retval + len, reg_getline_submatch(lnum),
- submatch_mmatch->endpos[no].col);
- len += submatch_mmatch->endpos[no].col;
- if (round == 2)
- retval[len] = NUL;
- ++len;
+ rsm.sm_mmatch->endpos[no].col);
+ }
+ len += rsm.sm_mmatch->endpos[no].col;
+ if (round == 2) {
+ retval[len] = NUL; // -V595
+ }
+ len++;
}
if (retval == NULL) {
@@ -6847,11 +6978,12 @@ char_u *reg_submatch(int no)
}
}
} else {
- s = submatch_match->startp[no];
- if (s == NULL || submatch_match->endp[no] == NULL)
+ s = rsm.sm_match->startp[no];
+ if (s == NULL || rsm.sm_match->endp[no] == NULL) {
retval = NULL;
- else
- retval = vim_strnsave(s, (int)(submatch_match->endp[no] - s));
+ } else {
+ retval = vim_strnsave(s, (int)(rsm.sm_match->endp[no] - s));
+ }
}
return retval;
@@ -6871,39 +7003,39 @@ list_T *reg_submatch_list(int no)
linenr_T slnum;
linenr_T elnum;
list_T *list;
- char_u *s;
+ const char *s;
- if (submatch_match == NULL) {
- slnum = submatch_mmatch->startpos[no].lnum;
- elnum = submatch_mmatch->endpos[no].lnum;
+ if (rsm.sm_match == NULL) {
+ slnum = rsm.sm_mmatch->startpos[no].lnum;
+ elnum = rsm.sm_mmatch->endpos[no].lnum;
if (slnum < 0 || elnum < 0) {
return NULL;
}
- colnr_T scol = submatch_mmatch->startpos[no].col;
- colnr_T ecol = submatch_mmatch->endpos[no].col;
+ colnr_T scol = rsm.sm_mmatch->startpos[no].col;
+ colnr_T ecol = rsm.sm_mmatch->endpos[no].col;
- list = list_alloc();
+ list = tv_list_alloc(elnum - slnum + 1);
- s = reg_getline_submatch(slnum) + scol;
+ s = (const char *)reg_getline_submatch(slnum) + scol;
if (slnum == elnum) {
- list_append_string(list, s, ecol - scol);
+ tv_list_append_string(list, s, ecol - scol);
} else {
- list_append_string(list, s, -1);
+ tv_list_append_string(list, s, -1);
for (int i = 1; i < elnum - slnum; i++) {
- s = reg_getline_submatch(slnum + i);
- list_append_string(list, s, -1);
+ s = (const char *)reg_getline_submatch(slnum + i);
+ tv_list_append_string(list, s, -1);
}
- s = reg_getline_submatch(elnum);
- list_append_string(list, s, ecol);
+ s = (const char *)reg_getline_submatch(elnum);
+ tv_list_append_string(list, s, ecol);
}
} else {
- s = submatch_match->startp[no];
- if (s == NULL || submatch_match->endp[no] == NULL) {
+ s = (const char *)rsm.sm_match->startp[no];
+ if (s == NULL || rsm.sm_match->endp[no] == NULL) {
return NULL;
}
- list = list_alloc();
- list_append_string(list, s, (int)(submatch_match->endp[no] - s));
+ list = tv_list_alloc(1);
+ tv_list_append_string(list, s, (const char *)rsm.sm_match->endp[no] - s);
}
return list;
@@ -7057,6 +7189,19 @@ static void report_re_switch(char_u *pat)
/// @return TRUE if there is a match, FALSE if not.
static int vim_regexec_both(regmatch_T *rmp, char_u *line, colnr_T col, bool nl)
{
+ regexec_T rex_save;
+ bool rex_in_use_save = rex_in_use;
+
+ if (rex_in_use) {
+ // Being called recursively, save the state.
+ rex_save = rex;
+ }
+ rex_in_use = true;
+ rex.reg_startp = NULL;
+ rex.reg_endp = NULL;
+ rex.reg_startpos = NULL;
+ rex.reg_endpos = NULL;
+
int result = rmp->regprog->engine->regexec_nl(rmp, line, col, nl);
// NFA engine aborted because it's very slow, use backtracking engine instead.
@@ -7078,6 +7223,11 @@ static int vim_regexec_both(regmatch_T *rmp, char_u *line, colnr_T col, bool nl)
p_re = save_p_re;
}
+ rex_in_use = rex_in_use_save;
+ if (rex_in_use) {
+ rex = rex_save;
+ }
+
return result > 0;
}
@@ -7107,15 +7257,13 @@ int vim_regexec_nl(regmatch_T *rmp, char_u *line, colnr_T col)
return vim_regexec_both(rmp, line, col, true);
}
-/*
- * Match a regexp against multiple lines.
- * "rmp->regprog" is a compiled regexp as returned by vim_regcomp().
- * Note: "rmp->regprog" may be freed and changed.
- * Uses curbuf for line count and 'iskeyword'.
- *
- * Return zero if there is no match. Return number of lines contained in the
- * match otherwise.
- */
+/// Match a regexp against multiple lines.
+/// "rmp->regprog" must be a compiled regexp as returned by vim_regcomp().
+/// Note: "rmp->regprog" may be freed and changed, even set to NULL.
+/// Uses curbuf for line count and 'iskeyword'.
+///
+/// Return zero if there is no match. Return number of lines contained in the
+/// match otherwise.
long vim_regexec_multi(
regmmatch_T *rmp,
win_T *win, /* window in which to search or NULL */
@@ -7125,6 +7273,15 @@ long vim_regexec_multi(
proftime_T *tm /* timeout limit or NULL */
)
{
+ regexec_T rex_save;
+ bool rex_in_use_save = rex_in_use;
+
+ if (rex_in_use) {
+ // Being called recursively, save the state.
+ rex_save = rex;
+ }
+ rex_in_use = true;
+
int result = rmp->regprog->engine->regexec_multi(rmp, win, buf, lnum, col,
tm);
@@ -7138,7 +7295,12 @@ long vim_regexec_multi(
p_re = BACKTRACKING_ENGINE;
vim_regfree(rmp->regprog);
report_re_switch(pat);
+ // checking for \z misuse was already done when compiling for NFA,
+ // allow all here
+ reg_do_extmatch = REX_ALL;
rmp->regprog = vim_regcomp(pat, re_flags);
+ reg_do_extmatch = 0;
+
if (rmp->regprog != NULL) {
result = rmp->regprog->engine->regexec_multi(rmp, win, buf, lnum, col,
tm);
@@ -7148,5 +7310,10 @@ long vim_regexec_multi(
p_re = save_p_re;
}
+ rex_in_use = rex_in_use_save;
+ if (rex_in_use) {
+ rex = rex_save;
+ }
+
return result <= 0 ? 0 : result;
}
diff --git a/src/nvim/regexp.h b/src/nvim/regexp.h
index 37513d8c27..74ed34188c 100644
--- a/src/nvim/regexp.h
+++ b/src/nvim/regexp.h
@@ -1,19 +1,24 @@
#ifndef NVIM_REGEXP_H
#define NVIM_REGEXP_H
-/* Second argument for vim_regcomp(). */
-#define RE_MAGIC 1 /* 'magic' option */
-#define RE_STRING 2 /* match in string instead of buffer text */
-#define RE_STRICT 4 /* don't allow [abc] without ] */
-#define RE_AUTO 8 /* automatic engine selection */
+#include "nvim/types.h"
+#include "nvim/buffer_defs.h"
+#include "nvim/regexp_defs.h"
-/* values for reg_do_extmatch */
-#define REX_SET 1 /* to allow \z\(...\), */
-#define REX_USE 2 /* to allow \z\1 et al. */
+// Second argument for vim_regcomp().
+#define RE_MAGIC 1 ///< 'magic' option
+#define RE_STRING 2 ///< match in string instead of buffer text
+#define RE_STRICT 4 ///< don't allow [abc] without ]
+#define RE_AUTO 8 ///< automatic engine selection
-/* regexp.c */
+// values for reg_do_extmatch
+#define REX_SET 1 ///< to allow \z\(...\),
+#define REX_USE 2 ///< to allow \z\1 et al.
+#define REX_ALL (REX_SET | REX_USE)
+
+// regexp.c
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "regexp.h.generated.h"
#endif
-#endif /* NVIM_REGEXP_H */
+#endif // NVIM_REGEXP_H
diff --git a/src/nvim/regexp_defs.h b/src/nvim/regexp_defs.h
index 6426ee441b..b5d56e07fc 100644
--- a/src/nvim/regexp_defs.h
+++ b/src/nvim/regexp_defs.h
@@ -15,6 +15,8 @@
#include <stdbool.h>
#include "nvim/pos.h"
+#include "nvim/types.h"
+#include "nvim/profile.h"
/*
* The number of sub-matches is limited to 10.
@@ -41,18 +43,36 @@
#define NFA_ENGINE 2
typedef struct regengine regengine_T;
+typedef struct regprog regprog_T;
+typedef struct reg_extmatch reg_extmatch_T;
+
+/// Structure to be used for multi-line matching.
+/// Sub-match "no" starts in line "startpos[no].lnum" column "startpos[no].col"
+/// and ends in line "endpos[no].lnum" just before column "endpos[no].col".
+/// The line numbers are relative to the first line, thus startpos[0].lnum is
+/// always 0.
+/// When there is no match, the line number is -1.
+typedef struct {
+ regprog_T *regprog;
+ lpos_T startpos[NSUBEXP];
+ lpos_T endpos[NSUBEXP];
+ int rmm_ic;
+ colnr_T rmm_maxcol; /// when not zero: maximum column
+} regmmatch_T;
+
+#include "nvim/buffer_defs.h"
/*
* Structure returned by vim_regcomp() to pass on to vim_regexec().
* This is the general structure. For the actual matcher, two specific
* structures are used. See code below.
*/
-typedef struct regprog {
+struct regprog {
regengine_T *engine;
unsigned regflags;
unsigned re_engine; ///< Automatic, backtracking or NFA engine.
unsigned re_flags; ///< Second argument for vim_regcomp().
-} regprog_T;
+};
/*
* Structure used by the back track matcher.
@@ -126,30 +146,14 @@ typedef struct {
} regmatch_T;
/*
- * Structure to be used for multi-line matching.
- * Sub-match "no" starts in line "startpos[no].lnum" column "startpos[no].col"
- * and ends in line "endpos[no].lnum" just before column "endpos[no].col".
- * The line numbers are relative to the first line, thus startpos[0].lnum is
- * always 0.
- * When there is no match, the line number is -1.
- */
-typedef struct {
- regprog_T *regprog;
- lpos_T startpos[NSUBEXP];
- lpos_T endpos[NSUBEXP];
- int rmm_ic;
- colnr_T rmm_maxcol; /* when not zero: maximum column */
-} regmmatch_T;
-
-/*
* Structure used to store external references: "\z\(\)" to "\z\1".
* Use a reference count to avoid the need to copy this around. When it goes
* from 1 to zero the matches need to be freed.
*/
-typedef struct {
- short refcnt;
+struct reg_extmatch {
+ int16_t refcnt;
char_u *matches[NSUBEXP];
-} reg_extmatch_T;
+};
struct regengine {
regprog_T *(*regcomp)(char_u*, int);
diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c
index f97dce9e0d..08ef7da9c1 100644
--- a/src/nvim/regexp_nfa.c
+++ b/src/nvim/regexp_nfa.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* NFA regular expression implementation.
*
@@ -11,7 +14,6 @@
#include <limits.h>
#include "nvim/ascii.h"
-#include "nvim/misc2.h"
#include "nvim/garray.h"
/*
@@ -54,13 +56,13 @@ enum {
NFA_RANGE_MIN, /* low end of a range */
NFA_RANGE_MAX, /* high end of a range */
- NFA_CONCAT, /* concatenate two previous items (postfix
- * only) */
- NFA_OR, /* \| (postfix only) */
- NFA_STAR, /* greedy * (posfix only) */
- NFA_STAR_NONGREEDY, /* non-greedy * (postfix only) */
- NFA_QUEST, /* greedy \? (postfix only) */
- NFA_QUEST_NONGREEDY, /* non-greedy \? (postfix only) */
+ NFA_CONCAT, // concatenate two previous items (postfix
+ // only)
+ NFA_OR, // \| (postfix only)
+ NFA_STAR, // greedy * (postfix only)
+ NFA_STAR_NONGREEDY, // non-greedy * (postfix only)
+ NFA_QUEST, // greedy \? (postfix only)
+ NFA_QUEST_NONGREEDY, // non-greedy \? (postfix only)
NFA_BOL, /* ^ Begin line */
NFA_EOL, /* $ End line */
@@ -561,10 +563,7 @@ static char_u *nfa_get_match_text(nfa_state_T *start)
p = start->out->out; /* skip first char, it goes into regstart */
s = ret;
while (p->c > 0) {
- if (has_mbyte)
- s += (*mb_char2bytes)(p->c, s);
- else
- *s++ = p->c;
+ s += utf_char2bytes(p->c, s);
p = p->out;
}
*s = NUL;
@@ -632,6 +631,7 @@ static int nfa_recognize_char_class(char_u *start, char_u *end, int extra_newl)
config |= CLASS_o7;
break;
}
+ return FAIL;
case 'a':
if (*(p + 2) == 'z') {
config |= CLASS_az;
@@ -640,6 +640,7 @@ static int nfa_recognize_char_class(char_u *start, char_u *end, int extra_newl)
config |= CLASS_af;
break;
}
+ return FAIL;
case 'A':
if (*(p + 2) == 'Z') {
config |= CLASS_AZ;
@@ -648,7 +649,7 @@ static int nfa_recognize_char_class(char_u *start, char_u *end, int extra_newl)
config |= CLASS_AF;
break;
}
- /* FALLTHROUGH */
+ return FAIL;
default:
return FAIL;
}
@@ -724,13 +725,70 @@ static void nfa_emit_equi_class(int c)
if (enc_utf8 || STRCMP(p_enc, "latin1") == 0
|| STRCMP(p_enc, "iso-8859-15") == 0) {
+#define A_grave 0xc0
+#define A_acute 0xc1
+#define A_circumflex 0xc2
+#define A_virguilla 0xc3
+#define A_diaeresis 0xc4
+#define A_ring 0xc5
+#define C_cedilla 0xc7
+#define E_grave 0xc8
+#define E_acute 0xc9
+#define E_circumflex 0xca
+#define E_diaeresis 0xcb
+#define I_grave 0xcc
+#define I_acute 0xcd
+#define I_circumflex 0xce
+#define I_diaeresis 0xcf
+#define N_virguilla 0xd1
+#define O_grave 0xd2
+#define O_acute 0xd3
+#define O_circumflex 0xd4
+#define O_virguilla 0xd5
+#define O_diaeresis 0xd6
+#define O_slash 0xd8
+#define U_grave 0xd9
+#define U_acute 0xda
+#define U_circumflex 0xdb
+#define U_diaeresis 0xdc
+#define Y_acute 0xdd
+#define a_grave 0xe0
+#define a_acute 0xe1
+#define a_circumflex 0xe2
+#define a_virguilla 0xe3
+#define a_diaeresis 0xe4
+#define a_ring 0xe5
+#define c_cedilla 0xe7
+#define e_grave 0xe8
+#define e_acute 0xe9
+#define e_circumflex 0xea
+#define e_diaeresis 0xeb
+#define i_grave 0xec
+#define i_acute 0xed
+#define i_circumflex 0xee
+#define i_diaeresis 0xef
+#define n_virguilla 0xf1
+#define o_grave 0xf2
+#define o_acute 0xf3
+#define o_circumflex 0xf4
+#define o_virguilla 0xf5
+#define o_diaeresis 0xf6
+#define o_slash 0xf8
+#define u_grave 0xf9
+#define u_acute 0xfa
+#define u_circumflex 0xfb
+#define u_diaeresis 0xfc
+#define y_acute 0xfd
+#define y_diaeresis 0xff
switch (c) {
- case 'A': case 0300: case 0301: case 0302:
- case 0303: case 0304: case 0305:
- CASEMBC(0x100) CASEMBC(0x102) CASEMBC(0x104) CASEMBC(0x1cd)
- CASEMBC(0x1de) CASEMBC(0x1e0) CASEMBC(0x1ea2)
- EMIT2('A'); EMIT2(0300); EMIT2(0301); EMIT2(0302);
- EMIT2(0303); EMIT2(0304); EMIT2(0305);
+ case 'A': case A_grave: case A_acute: case A_circumflex:
+ case A_virguilla: case A_diaeresis: case A_ring:
+ CASEMBC(0x100) CASEMBC(0x102) CASEMBC(0x104)
+ CASEMBC(0x1cd) CASEMBC(0x1de) CASEMBC(0x1e0)
+ CASEMBC(0x1ea2)
+ EMIT2('A'); EMIT2(A_grave); EMIT2(A_acute);
+ EMIT2(A_circumflex); EMIT2(A_virguilla);
+ EMIT2(A_diaeresis); EMIT2(A_ring);
EMITMBC(0x100) EMITMBC(0x102) EMITMBC(0x104)
EMITMBC(0x1cd) EMITMBC(0x1de) EMITMBC(0x1e0)
EMITMBC(0x1ea2)
@@ -740,23 +798,24 @@ static void nfa_emit_equi_class(int c)
EMIT2('B'); EMITMBC(0x1e02) EMITMBC(0x1e06)
return;
- case 'C': case 0307:
- CASEMBC(0x106) CASEMBC(0x108) CASEMBC(0x10a) CASEMBC(0x10c)
- EMIT2('C'); EMIT2(0307); EMITMBC(0x106) EMITMBC(0x108)
+ case 'C': case C_cedilla: CASEMBC(0x106) CASEMBC(0x108) CASEMBC(0x10a)
+ CASEMBC(0x10c)
+ EMIT2('C'); EMIT2(C_cedilla); EMITMBC(0x106) EMITMBC(0x108)
EMITMBC(0x10a) EMITMBC(0x10c)
return;
case 'D': CASEMBC(0x10e) CASEMBC(0x110) CASEMBC(0x1e0a)
- CASEMBC(0x1e0e) CASEMBC(0x1e10)
+ CASEMBC(0x1e0e) CASEMBC(0x1e10)
EMIT2('D'); EMITMBC(0x10e) EMITMBC(0x110) EMITMBC(0x1e0a)
EMITMBC(0x1e0e) EMITMBC(0x1e10)
return;
- case 'E': case 0310: case 0311: case 0312: case 0313:
- CASEMBC(0x112) CASEMBC(0x114) CASEMBC(0x116) CASEMBC(0x118)
- CASEMBC(0x11a) CASEMBC(0x1eba) CASEMBC(0x1ebc)
- EMIT2('E'); EMIT2(0310); EMIT2(0311); EMIT2(0312);
- EMIT2(0313);
+ case 'E': case E_grave: case E_acute: case E_circumflex:
+ case E_diaeresis: CASEMBC(0x112) CASEMBC(0x114)
+ CASEMBC(0x116) CASEMBC(0x118) CASEMBC(0x11a)
+ CASEMBC(0x1eba) CASEMBC(0x1ebc)
+ EMIT2('E'); EMIT2(E_grave); EMIT2(E_acute);
+ EMIT2(E_circumflex); EMIT2(E_diaeresis);
EMITMBC(0x112) EMITMBC(0x114) EMITMBC(0x116)
EMITMBC(0x118) EMITMBC(0x11a) EMITMBC(0x1eba)
EMITMBC(0x1ebc)
@@ -767,24 +826,26 @@ static void nfa_emit_equi_class(int c)
return;
case 'G': CASEMBC(0x11c) CASEMBC(0x11e) CASEMBC(0x120)
- CASEMBC(0x122) CASEMBC(0x1e4) CASEMBC(0x1e6) CASEMBC(0x1f4)
- CASEMBC(0x1e20)
+ CASEMBC(0x122) CASEMBC(0x1e4) CASEMBC(0x1e6)
+ CASEMBC(0x1f4) CASEMBC(0x1e20)
EMIT2('G'); EMITMBC(0x11c) EMITMBC(0x11e) EMITMBC(0x120)
EMITMBC(0x122) EMITMBC(0x1e4) EMITMBC(0x1e6)
EMITMBC(0x1f4) EMITMBC(0x1e20)
return;
case 'H': CASEMBC(0x124) CASEMBC(0x126) CASEMBC(0x1e22)
- CASEMBC(0x1e26) CASEMBC(0x1e28)
+ CASEMBC(0x1e26) CASEMBC(0x1e28)
EMIT2('H'); EMITMBC(0x124) EMITMBC(0x126) EMITMBC(0x1e22)
EMITMBC(0x1e26) EMITMBC(0x1e28)
return;
- case 'I': case 0314: case 0315: case 0316: case 0317:
- CASEMBC(0x128) CASEMBC(0x12a) CASEMBC(0x12c) CASEMBC(0x12e)
- CASEMBC(0x130) CASEMBC(0x1cf) CASEMBC(0x1ec8)
- EMIT2('I'); EMIT2(0314); EMIT2(0315); EMIT2(0316);
- EMIT2(0317); EMITMBC(0x128) EMITMBC(0x12a)
+ case 'I': case I_grave: case I_acute: case I_circumflex:
+ case I_diaeresis: CASEMBC(0x128) CASEMBC(0x12a)
+ CASEMBC(0x12c) CASEMBC(0x12e) CASEMBC(0x130)
+ CASEMBC(0x1cf) CASEMBC(0x1ec8)
+ EMIT2('I'); EMIT2(I_grave); EMIT2(I_acute);
+ EMIT2(I_circumflex); EMIT2(I_diaeresis);
+ EMITMBC(0x128) EMITMBC(0x12a)
EMITMBC(0x12c) EMITMBC(0x12e) EMITMBC(0x130)
EMITMBC(0x1cf) EMITMBC(0x1ec8)
return;
@@ -794,13 +855,13 @@ static void nfa_emit_equi_class(int c)
return;
case 'K': CASEMBC(0x136) CASEMBC(0x1e8) CASEMBC(0x1e30)
- CASEMBC(0x1e34)
+ CASEMBC(0x1e34)
EMIT2('K'); EMITMBC(0x136) EMITMBC(0x1e8) EMITMBC(0x1e30)
EMITMBC(0x1e34)
return;
case 'L': CASEMBC(0x139) CASEMBC(0x13b) CASEMBC(0x13d)
- CASEMBC(0x13f) CASEMBC(0x141) CASEMBC(0x1e3a)
+ CASEMBC(0x13f) CASEMBC(0x141) CASEMBC(0x1e3a)
EMIT2('L'); EMITMBC(0x139) EMITMBC(0x13b) EMITMBC(0x13d)
EMITMBC(0x13f) EMITMBC(0x141) EMITMBC(0x1e3a)
return;
@@ -809,19 +870,21 @@ static void nfa_emit_equi_class(int c)
EMIT2('M'); EMITMBC(0x1e3e) EMITMBC(0x1e40)
return;
- case 'N': case 0321:
- CASEMBC(0x143) CASEMBC(0x145) CASEMBC(0x147) CASEMBC(0x1e44)
- CASEMBC(0x1e48)
- EMIT2('N'); EMIT2(0321); EMITMBC(0x143) EMITMBC(0x145)
+ case 'N': case N_virguilla: CASEMBC(0x143) CASEMBC(0x145)
+ CASEMBC(0x147) CASEMBC(0x1e44) CASEMBC(0x1e48)
+ EMIT2('N'); EMIT2(N_virguilla);
+ EMITMBC(0x143) EMITMBC(0x145)
EMITMBC(0x147) EMITMBC(0x1e44) EMITMBC(0x1e48)
return;
- case 'O': case 0322: case 0323: case 0324: case 0325:
- case 0326: case 0330:
- CASEMBC(0x14c) CASEMBC(0x14e) CASEMBC(0x150) CASEMBC(0x1a0)
- CASEMBC(0x1d1) CASEMBC(0x1ea) CASEMBC(0x1ec) CASEMBC(0x1ece)
- EMIT2('O'); EMIT2(0322); EMIT2(0323); EMIT2(0324);
- EMIT2(0325); EMIT2(0326); EMIT2(0330);
+ case 'O': case O_grave: case O_acute: case O_circumflex:
+ case O_virguilla: case O_diaeresis: case O_slash:
+ CASEMBC(0x14c) CASEMBC(0x14e) CASEMBC(0x150)
+ CASEMBC(0x1a0) CASEMBC(0x1d1) CASEMBC(0x1ea)
+ CASEMBC(0x1ec) CASEMBC(0x1ece)
+ EMIT2('O'); EMIT2(O_grave); EMIT2(O_acute);
+ EMIT2(O_circumflex); EMIT2(O_virguilla);
+ EMIT2(O_diaeresis); EMIT2(O_slash);
EMITMBC(0x14c) EMITMBC(0x14e) EMITMBC(0x150)
EMITMBC(0x1a0) EMITMBC(0x1d1) EMITMBC(0x1ea)
EMITMBC(0x1ec) EMITMBC(0x1ece)
@@ -832,29 +895,31 @@ static void nfa_emit_equi_class(int c)
return;
case 'R': CASEMBC(0x154) CASEMBC(0x156) CASEMBC(0x158)
- CASEMBC(0x1e58) CASEMBC(0x1e5e)
+ CASEMBC(0x1e58) CASEMBC(0x1e5e)
EMIT2('R'); EMITMBC(0x154) EMITMBC(0x156) EMITMBC(0x158)
EMITMBC(0x1e58) EMITMBC(0x1e5e)
return;
case 'S': CASEMBC(0x15a) CASEMBC(0x15c) CASEMBC(0x15e)
- CASEMBC(0x160) CASEMBC(0x1e60)
+ CASEMBC(0x160) CASEMBC(0x1e60)
EMIT2('S'); EMITMBC(0x15a) EMITMBC(0x15c) EMITMBC(0x15e)
EMITMBC(0x160) EMITMBC(0x1e60)
return;
case 'T': CASEMBC(0x162) CASEMBC(0x164) CASEMBC(0x166)
- CASEMBC(0x1e6a) CASEMBC(0x1e6e)
+ CASEMBC(0x1e6a) CASEMBC(0x1e6e)
EMIT2('T'); EMITMBC(0x162) EMITMBC(0x164) EMITMBC(0x166)
EMITMBC(0x1e6a) EMITMBC(0x1e6e)
return;
- case 'U': case 0331: case 0332: case 0333: case 0334:
- CASEMBC(0x168) CASEMBC(0x16a) CASEMBC(0x16c) CASEMBC(0x16e)
- CASEMBC(0x170) CASEMBC(0x172) CASEMBC(0x1af) CASEMBC(0x1d3)
- CASEMBC(0x1ee6)
- EMIT2('U'); EMIT2(0331); EMIT2(0332); EMIT2(0333);
- EMIT2(0334); EMITMBC(0x168) EMITMBC(0x16a)
+ case 'U': case U_grave: case U_acute: case U_diaeresis:
+ case U_circumflex: CASEMBC(0x168) CASEMBC(0x16a)
+ CASEMBC(0x16c) CASEMBC(0x16e) CASEMBC(0x170)
+ CASEMBC(0x172) CASEMBC(0x1af) CASEMBC(0x1d3)
+ CASEMBC(0x1ee6)
+ EMIT2('U'); EMIT2(U_grave); EMIT2(U_acute);
+ EMIT2(U_diaeresis); EMIT2(U_circumflex);
+ EMITMBC(0x168) EMITMBC(0x16a)
EMITMBC(0x16c) EMITMBC(0x16e) EMITMBC(0x170)
EMITMBC(0x172) EMITMBC(0x1af) EMITMBC(0x1d3)
EMITMBC(0x1ee6)
@@ -865,7 +930,7 @@ static void nfa_emit_equi_class(int c)
return;
case 'W': CASEMBC(0x174) CASEMBC(0x1e80) CASEMBC(0x1e82)
- CASEMBC(0x1e84) CASEMBC(0x1e86)
+ CASEMBC(0x1e84) CASEMBC(0x1e86)
EMIT2('W'); EMITMBC(0x174) EMITMBC(0x1e80) EMITMBC(0x1e82)
EMITMBC(0x1e84) EMITMBC(0x1e86)
return;
@@ -874,26 +939,29 @@ static void nfa_emit_equi_class(int c)
EMIT2('X'); EMITMBC(0x1e8a) EMITMBC(0x1e8c)
return;
- case 'Y': case 0335:
- CASEMBC(0x176) CASEMBC(0x178) CASEMBC(0x1e8e) CASEMBC(0x1ef2)
- CASEMBC(0x1ef6) CASEMBC(0x1ef8)
- EMIT2('Y'); EMIT2(0335); EMITMBC(0x176) EMITMBC(0x178)
+ case 'Y': case Y_acute: CASEMBC(0x176) CASEMBC(0x178)
+ CASEMBC(0x1e8e) CASEMBC(0x1ef2) CASEMBC(0x1ef6)
+ CASEMBC(0x1ef8)
+ EMIT2('Y'); EMIT2(Y_acute);
+ EMITMBC(0x176) EMITMBC(0x178)
EMITMBC(0x1e8e) EMITMBC(0x1ef2) EMITMBC(0x1ef6)
EMITMBC(0x1ef8)
return;
case 'Z': CASEMBC(0x179) CASEMBC(0x17b) CASEMBC(0x17d)
- CASEMBC(0x1b5) CASEMBC(0x1e90) CASEMBC(0x1e94)
+ CASEMBC(0x1b5) CASEMBC(0x1e90) CASEMBC(0x1e94)
EMIT2('Z'); EMITMBC(0x179) EMITMBC(0x17b) EMITMBC(0x17d)
EMITMBC(0x1b5) EMITMBC(0x1e90) EMITMBC(0x1e94)
return;
- case 'a': case 0340: case 0341: case 0342:
- case 0343: case 0344: case 0345:
- CASEMBC(0x101) CASEMBC(0x103) CASEMBC(0x105) CASEMBC(0x1ce)
- CASEMBC(0x1df) CASEMBC(0x1e1) CASEMBC(0x1ea3)
- EMIT2('a'); EMIT2(0340); EMIT2(0341); EMIT2(0342);
- EMIT2(0343); EMIT2(0344); EMIT2(0345);
+ case 'a': case a_grave: case a_acute: case a_circumflex:
+ case a_virguilla: case a_diaeresis: case a_ring:
+ CASEMBC(0x101) CASEMBC(0x103) CASEMBC(0x105)
+ CASEMBC(0x1ce) CASEMBC(0x1df) CASEMBC(0x1e1)
+ CASEMBC(0x1ea3)
+ EMIT2('a'); EMIT2(a_grave); EMIT2(a_acute);
+ EMIT2(a_circumflex); EMIT2(a_virguilla);
+ EMIT2(a_diaeresis); EMIT2(a_ring);
EMITMBC(0x101) EMITMBC(0x103) EMITMBC(0x105)
EMITMBC(0x1ce) EMITMBC(0x1df) EMITMBC(0x1e1)
EMITMBC(0x1ea3)
@@ -903,23 +971,26 @@ static void nfa_emit_equi_class(int c)
EMIT2('b'); EMITMBC(0x1e03) EMITMBC(0x1e07)
return;
- case 'c': case 0347:
- CASEMBC(0x107) CASEMBC(0x109) CASEMBC(0x10b) CASEMBC(0x10d)
- EMIT2('c'); EMIT2(0347); EMITMBC(0x107) EMITMBC(0x109)
+ case 'c': case c_cedilla: CASEMBC(0x107) CASEMBC(0x109)
+ CASEMBC(0x10b) CASEMBC(0x10d)
+ EMIT2('c'); EMIT2(c_cedilla);
+ EMITMBC(0x107) EMITMBC(0x109)
EMITMBC(0x10b) EMITMBC(0x10d)
return;
case 'd': CASEMBC(0x10f) CASEMBC(0x111) CASEMBC(0x1e0b)
- CASEMBC(0x1e0f) CASEMBC(0x1e11)
+ CASEMBC(0x1e0f) CASEMBC(0x1e11)
EMIT2('d'); EMITMBC(0x10f) EMITMBC(0x111) EMITMBC(0x1e0b)
EMITMBC(0x1e0f) EMITMBC(0x1e11)
return;
- case 'e': case 0350: case 0351: case 0352: case 0353:
- CASEMBC(0x113) CASEMBC(0x115) CASEMBC(0x117) CASEMBC(0x119)
- CASEMBC(0x11b) CASEMBC(0x1ebb) CASEMBC(0x1ebd)
- EMIT2('e'); EMIT2(0350); EMIT2(0351); EMIT2(0352);
- EMIT2(0353); EMITMBC(0x113) EMITMBC(0x115)
+ case 'e': case e_grave: case e_acute: case e_circumflex:
+ case e_diaeresis: CASEMBC(0x113) CASEMBC(0x115)
+ CASEMBC(0x117) CASEMBC(0x119) CASEMBC(0x11b)
+ CASEMBC(0x1ebb) CASEMBC(0x1ebd)
+ EMIT2('e'); EMIT2(e_grave); EMIT2(e_acute);
+ EMIT2(e_circumflex); EMIT2(e_diaeresis);
+ EMITMBC(0x113) EMITMBC(0x115)
EMITMBC(0x117) EMITMBC(0x119) EMITMBC(0x11b)
EMITMBC(0x1ebb) EMITMBC(0x1ebd)
return;
@@ -929,24 +1000,26 @@ static void nfa_emit_equi_class(int c)
return;
case 'g': CASEMBC(0x11d) CASEMBC(0x11f) CASEMBC(0x121)
- CASEMBC(0x123) CASEMBC(0x1e5) CASEMBC(0x1e7) CASEMBC(0x1f5)
- CASEMBC(0x1e21)
+ CASEMBC(0x123) CASEMBC(0x1e5) CASEMBC(0x1e7)
+ CASEMBC(0x1f5) CASEMBC(0x1e21)
EMIT2('g'); EMITMBC(0x11d) EMITMBC(0x11f) EMITMBC(0x121)
EMITMBC(0x123) EMITMBC(0x1e5) EMITMBC(0x1e7)
EMITMBC(0x1f5) EMITMBC(0x1e21)
return;
case 'h': CASEMBC(0x125) CASEMBC(0x127) CASEMBC(0x1e23)
- CASEMBC(0x1e27) CASEMBC(0x1e29) CASEMBC(0x1e96)
+ CASEMBC(0x1e27) CASEMBC(0x1e29) CASEMBC(0x1e96)
EMIT2('h'); EMITMBC(0x125) EMITMBC(0x127) EMITMBC(0x1e23)
EMITMBC(0x1e27) EMITMBC(0x1e29) EMITMBC(0x1e96)
return;
- case 'i': case 0354: case 0355: case 0356: case 0357:
- CASEMBC(0x129) CASEMBC(0x12b) CASEMBC(0x12d) CASEMBC(0x12f)
- CASEMBC(0x1d0) CASEMBC(0x1ec9)
- EMIT2('i'); EMIT2(0354); EMIT2(0355); EMIT2(0356);
- EMIT2(0357); EMITMBC(0x129) EMITMBC(0x12b)
+ case 'i': case i_grave: case i_acute: case i_circumflex:
+ case i_diaeresis: CASEMBC(0x129) CASEMBC(0x12b)
+ CASEMBC(0x12d) CASEMBC(0x12f) CASEMBC(0x1d0)
+ CASEMBC(0x1ec9)
+ EMIT2('i'); EMIT2(i_grave); EMIT2(i_acute);
+ EMIT2(i_circumflex); EMIT2(i_diaeresis);
+ EMITMBC(0x129) EMITMBC(0x12b)
EMITMBC(0x12d) EMITMBC(0x12f) EMITMBC(0x1d0)
EMITMBC(0x1ec9)
return;
@@ -956,13 +1029,13 @@ static void nfa_emit_equi_class(int c)
return;
case 'k': CASEMBC(0x137) CASEMBC(0x1e9) CASEMBC(0x1e31)
- CASEMBC(0x1e35)
+ CASEMBC(0x1e35)
EMIT2('k'); EMITMBC(0x137) EMITMBC(0x1e9) EMITMBC(0x1e31)
EMITMBC(0x1e35)
return;
case 'l': CASEMBC(0x13a) CASEMBC(0x13c) CASEMBC(0x13e)
- CASEMBC(0x140) CASEMBC(0x142) CASEMBC(0x1e3b)
+ CASEMBC(0x140) CASEMBC(0x142) CASEMBC(0x1e3b)
EMIT2('l'); EMITMBC(0x13a) EMITMBC(0x13c) EMITMBC(0x13e)
EMITMBC(0x140) EMITMBC(0x142) EMITMBC(0x1e3b)
return;
@@ -971,20 +1044,23 @@ static void nfa_emit_equi_class(int c)
EMIT2('m'); EMITMBC(0x1e3f) EMITMBC(0x1e41)
return;
- case 'n': case 0361:
- CASEMBC(0x144) CASEMBC(0x146) CASEMBC(0x148) CASEMBC(0x149)
- CASEMBC(0x1e45) CASEMBC(0x1e49)
- EMIT2('n'); EMIT2(0361); EMITMBC(0x144) EMITMBC(0x146)
+ case 'n': case n_virguilla: CASEMBC(0x144) CASEMBC(0x146)
+ CASEMBC(0x148) CASEMBC(0x149) CASEMBC(0x1e45)
+ CASEMBC(0x1e49)
+ EMIT2('n'); EMIT2(n_virguilla);
+ EMITMBC(0x144) EMITMBC(0x146)
EMITMBC(0x148) EMITMBC(0x149) EMITMBC(0x1e45)
EMITMBC(0x1e49)
return;
- case 'o': case 0362: case 0363: case 0364: case 0365:
- case 0366: case 0370:
- CASEMBC(0x14d) CASEMBC(0x14f) CASEMBC(0x151) CASEMBC(0x1a1)
- CASEMBC(0x1d2) CASEMBC(0x1eb) CASEMBC(0x1ed) CASEMBC(0x1ecf)
- EMIT2('o'); EMIT2(0362); EMIT2(0363); EMIT2(0364);
- EMIT2(0365); EMIT2(0366); EMIT2(0370);
+ case 'o': case o_grave: case o_acute: case o_circumflex:
+ case o_virguilla: case o_diaeresis: case o_slash:
+ CASEMBC(0x14d) CASEMBC(0x14f) CASEMBC(0x151)
+ CASEMBC(0x1a1) CASEMBC(0x1d2) CASEMBC(0x1eb)
+ CASEMBC(0x1ed) CASEMBC(0x1ecf)
+ EMIT2('o'); EMIT2(o_grave); EMIT2(o_acute);
+ EMIT2(o_circumflex); EMIT2(o_virguilla);
+ EMIT2(o_diaeresis); EMIT2(o_slash);
EMITMBC(0x14d) EMITMBC(0x14f) EMITMBC(0x151)
EMITMBC(0x1a1) EMITMBC(0x1d2) EMITMBC(0x1eb)
EMITMBC(0x1ed) EMITMBC(0x1ecf)
@@ -995,29 +1071,31 @@ static void nfa_emit_equi_class(int c)
return;
case 'r': CASEMBC(0x155) CASEMBC(0x157) CASEMBC(0x159)
- CASEMBC(0x1e59) CASEMBC(0x1e5f)
+ CASEMBC(0x1e59) CASEMBC(0x1e5f)
EMIT2('r'); EMITMBC(0x155) EMITMBC(0x157) EMITMBC(0x159)
EMITMBC(0x1e59) EMITMBC(0x1e5f)
return;
case 's': CASEMBC(0x15b) CASEMBC(0x15d) CASEMBC(0x15f)
- CASEMBC(0x161) CASEMBC(0x1e61)
+ CASEMBC(0x161) CASEMBC(0x1e61)
EMIT2('s'); EMITMBC(0x15b) EMITMBC(0x15d) EMITMBC(0x15f)
EMITMBC(0x161) EMITMBC(0x1e61)
return;
case 't': CASEMBC(0x163) CASEMBC(0x165) CASEMBC(0x167)
- CASEMBC(0x1e6b) CASEMBC(0x1e6f) CASEMBC(0x1e97)
+ CASEMBC(0x1e6b) CASEMBC(0x1e6f) CASEMBC(0x1e97)
EMIT2('t'); EMITMBC(0x163) EMITMBC(0x165) EMITMBC(0x167)
EMITMBC(0x1e6b) EMITMBC(0x1e6f) EMITMBC(0x1e97)
return;
- case 'u': case 0371: case 0372: case 0373: case 0374:
- CASEMBC(0x169) CASEMBC(0x16b) CASEMBC(0x16d) CASEMBC(0x16f)
- CASEMBC(0x171) CASEMBC(0x173) CASEMBC(0x1b0) CASEMBC(0x1d4)
- CASEMBC(0x1ee7)
- EMIT2('u'); EMIT2(0371); EMIT2(0372); EMIT2(0373);
- EMIT2(0374); EMITMBC(0x169) EMITMBC(0x16b)
+ case 'u': case u_grave: case u_acute: case u_circumflex:
+ case u_diaeresis: CASEMBC(0x169) CASEMBC(0x16b)
+ CASEMBC(0x16d) CASEMBC(0x16f) CASEMBC(0x171)
+ CASEMBC(0x173) CASEMBC(0x1b0) CASEMBC(0x1d4)
+ CASEMBC(0x1ee7)
+ EMIT2('u'); EMIT2(u_grave); EMIT2(u_acute);
+ EMIT2(u_circumflex); EMIT2(u_diaeresis);
+ EMITMBC(0x169) EMITMBC(0x16b)
EMITMBC(0x16d) EMITMBC(0x16f) EMITMBC(0x171)
EMITMBC(0x173) EMITMBC(0x1b0) EMITMBC(0x1d4)
EMITMBC(0x1ee7)
@@ -1028,7 +1106,7 @@ static void nfa_emit_equi_class(int c)
return;
case 'w': CASEMBC(0x175) CASEMBC(0x1e81) CASEMBC(0x1e83)
- CASEMBC(0x1e85) CASEMBC(0x1e87) CASEMBC(0x1e98)
+ CASEMBC(0x1e85) CASEMBC(0x1e87) CASEMBC(0x1e98)
EMIT2('w'); EMITMBC(0x175) EMITMBC(0x1e81) EMITMBC(0x1e83)
EMITMBC(0x1e85) EMITMBC(0x1e87) EMITMBC(0x1e98)
return;
@@ -1037,16 +1115,17 @@ static void nfa_emit_equi_class(int c)
EMIT2('x'); EMITMBC(0x1e8b) EMITMBC(0x1e8d)
return;
- case 'y': case 0375: case 0377:
- CASEMBC(0x177) CASEMBC(0x1e8f) CASEMBC(0x1e99)
- CASEMBC(0x1ef3) CASEMBC(0x1ef7) CASEMBC(0x1ef9)
- EMIT2('y'); EMIT2(0375); EMIT2(0377); EMITMBC(0x177)
+ case 'y': case y_acute: case y_diaeresis: CASEMBC(0x177)
+ CASEMBC(0x1e8f) CASEMBC(0x1e99) CASEMBC(0x1ef3)
+ CASEMBC(0x1ef7) CASEMBC(0x1ef9)
+ EMIT2('y'); EMIT2(y_acute); EMIT2(y_diaeresis);
+ EMITMBC(0x177)
EMITMBC(0x1e8f) EMITMBC(0x1e99) EMITMBC(0x1ef3)
EMITMBC(0x1ef7) EMITMBC(0x1ef9)
return;
case 'z': CASEMBC(0x17a) CASEMBC(0x17c) CASEMBC(0x17e)
- CASEMBC(0x1b6) CASEMBC(0x1e91) CASEMBC(0x1e95)
+ CASEMBC(0x1b6) CASEMBC(0x1e91) CASEMBC(0x1e95)
EMIT2('z'); EMITMBC(0x17a) EMITMBC(0x17c) EMITMBC(0x17e)
EMITMBC(0x1b6) EMITMBC(0x1e91) EMITMBC(0x1e95)
return;
@@ -1096,6 +1175,7 @@ static int nfa_regatom(void)
int startc = -1;
int endc = -1;
int oldstartc = -1;
+ int save_prev_at_start = prev_at_start;
c = getchr();
switch (c) {
@@ -1140,8 +1220,8 @@ static int nfa_regatom(void)
if (c == '[')
goto collection;
- /* "\_x" is character class plus newline */
- /*FALLTHROUGH*/
+ // "\_x" is character class plus newline
+ FALLTHROUGH;
/*
* Character classes.
@@ -1180,7 +1260,7 @@ static int nfa_regatom(void)
rc_did_emsg = TRUE;
return FAIL;
}
- EMSGN("INTERNAL: Unknown character class char: %" PRId64, c);
+ IEMSGN("INTERNAL: Unknown character class char: %" PRId64, c);
return FAIL;
}
/* When '.' is followed by a composing char ignore the dot, so that
@@ -1240,7 +1320,7 @@ static int nfa_regatom(void)
EMSG(_(e_nopresub));
return FAIL;
}
- for (lp = reg_prev_sub; *lp != NUL; mb_cptr_adv(lp)) {
+ for (lp = reg_prev_sub; *lp != NUL; MB_CPTR_ADV(lp)) {
EMIT(PTR2CHAR(lp));
if (lp != reg_prev_sub)
EMIT(NFA_CONCAT);
@@ -1287,25 +1367,28 @@ static int nfa_regatom(void)
case '7':
case '8':
case '9':
- /* \z1...\z9 */
- if (reg_do_extmatch != REX_USE)
+ // \z1...\z9
+ if ((reg_do_extmatch & REX_USE) == 0) {
EMSG_RET_FAIL(_(e_z1_not_allowed));
+ }
EMIT(NFA_ZREF1 + (no_Magic(c) - '1'));
/* No need to set nfa_has_backref, the sub-matches don't
* change when \z1 .. \z9 matches or not. */
re_has_z = REX_USE;
break;
case '(':
- /* \z( */
- if (reg_do_extmatch != REX_SET)
+ // \z(
+ if (reg_do_extmatch != REX_SET) {
EMSG_RET_FAIL(_(e_z_not_allowed));
- if (nfa_reg(REG_ZPAREN) == FAIL)
- return FAIL; /* cascaded error */
+ }
+ if (nfa_reg(REG_ZPAREN) == FAIL) {
+ return FAIL; // cascaded error
+ }
re_has_z = REX_SET;
break;
default:
- EMSGN(_("E867: (NFA) Unknown operator '\\z%c'"),
- no_Magic(c));
+ emsgf(_("E867: (NFA) Unknown operator '\\z%c'"),
+ no_Magic(c));
return FAIL;
}
break;
@@ -1326,7 +1409,7 @@ static int nfa_regatom(void)
case 'u': /* %uabcd hex 4 */
case 'U': /* %U1234abcd hex 8 */
{
- int nr;
+ int64_t nr;
switch (c) {
case 'd': nr = getdecchrs(); break;
@@ -1402,7 +1485,7 @@ static int nfa_regatom(void)
default:
{
- int n = 0;
+ long n = 0;
int cmp = c;
if (c == '<' || c == '>')
@@ -1412,19 +1495,29 @@ static int nfa_regatom(void)
c = getchr();
}
if (c == 'l' || c == 'c' || c == 'v') {
- if (c == 'l')
- /* \%{n}l \%{n}<l \%{n}>l */
+ if (c == 'l') {
+ // \%{n}l \%{n}<l \%{n}>l
EMIT(cmp == '<' ? NFA_LNUM_LT :
- cmp == '>' ? NFA_LNUM_GT : NFA_LNUM);
- else if (c == 'c')
- /* \%{n}c \%{n}<c \%{n}>c */
+ cmp == '>' ? NFA_LNUM_GT : NFA_LNUM);
+ if (save_prev_at_start) {
+ at_start = true;
+ }
+ } else if (c == 'c') {
+ // \%{n}c \%{n}<c \%{n}>c
EMIT(cmp == '<' ? NFA_COL_LT :
- cmp == '>' ? NFA_COL_GT : NFA_COL);
- else
- /* \%{n}v \%{n}<v \%{n}>v */
+ cmp == '>' ? NFA_COL_GT : NFA_COL);
+ } else {
+ // \%{n}v \%{n}<v \%{n}>v
EMIT(cmp == '<' ? NFA_VCOL_LT :
- cmp == '>' ? NFA_VCOL_GT : NFA_VCOL);
- EMIT(n);
+ cmp == '>' ? NFA_VCOL_GT : NFA_VCOL);
+ }
+#if SIZEOF_INT < SIZEOF_LONG
+ if (n > INT_MAX) {
+ EMSG(_("E951: \\% value too large"));
+ return FAIL;
+ }
+#endif
+ EMIT((int)n);
break;
} else if (c == '\'' && n == 0) {
/* \%'m \%<'m \%>'m */
@@ -1434,8 +1527,8 @@ static int nfa_regatom(void)
break;
}
}
- EMSGN(_("E867: (NFA) Unknown operator '\\%%%c'"),
- no_Magic(c));
+ emsgf(_("E867: (NFA) Unknown operator '\\%%%c'"),
+ no_Magic(c));
return FAIL;
}
break;
@@ -1470,7 +1563,7 @@ collection:
} else
EMIT(result);
regparse = endp;
- mb_ptr_adv(regparse);
+ MB_PTR_ADV(regparse);
return OK;
}
/*
@@ -1478,10 +1571,10 @@ collection:
* version that turns [abc] into 'a' OR 'b' OR 'c'
*/
startc = endc = oldstartc = -1;
- negated = FALSE;
- if (*regparse == '^') { /* negated range */
- negated = TRUE;
- mb_ptr_adv(regparse);
+ negated = false;
+ if (*regparse == '^') { // negated range
+ negated = true;
+ MB_PTR_ADV(regparse);
EMIT(NFA_START_NEG_COLL);
} else
EMIT(NFA_START_COLL);
@@ -1489,7 +1582,7 @@ collection:
startc = '-';
EMIT(startc);
EMIT(NFA_CONCAT);
- mb_ptr_adv(regparse);
+ MB_PTR_ADV(regparse);
}
/* Emit the OR branches for each character in the [] */
emit_range = FALSE;
@@ -1579,8 +1672,8 @@ collection:
if (*regparse == '-' && oldstartc != -1) {
emit_range = TRUE;
startc = oldstartc;
- mb_ptr_adv(regparse);
- continue; /* reading the end of the range */
+ MB_PTR_ADV(regparse);
+ continue; // reading the end of the range
}
/* Now handle simple and escaped characters.
@@ -1596,7 +1689,7 @@ collection:
!= NULL)
)
) {
- mb_ptr_adv(regparse);
+ MB_PTR_ADV(regparse);
if (*regparse == 'n')
startc = reg_string ? NL : NFA_NEWL;
@@ -1608,8 +1701,8 @@ collection:
) {
/* TODO(RE) This needs more testing */
startc = coll_get_char();
- got_coll_char = TRUE;
- mb_ptr_back(old_regparse, regparse);
+ got_coll_char = true;
+ MB_PTR_BACK(old_regparse, regparse);
} else {
/* \r,\t,\e,\b */
startc = backslash_trans(*regparse);
@@ -1624,8 +1717,9 @@ collection:
if (emit_range) {
endc = startc;
startc = oldstartc;
- if (startc > endc)
- EMSG_RET_FAIL(_(e_invrange));
+ if (startc > endc) {
+ EMSG_RET_FAIL(_(e_reverse_range));
+ }
if (endc > startc + 2) {
/* Emit a range instead of the sequence of
@@ -1680,18 +1774,18 @@ collection:
}
}
- mb_ptr_adv(regparse);
- } /* while (p < endp) */
+ MB_PTR_ADV(regparse);
+ } // while (p < endp)
- mb_ptr_back(old_regparse, regparse);
- if (*regparse == '-') { /* if last, '-' is just a char */
+ MB_PTR_BACK(old_regparse, regparse);
+ if (*regparse == '-') { // if last, '-' is just a char
EMIT('-');
EMIT(NFA_CONCAT);
}
/* skip the trailing ] */
regparse = endp;
- mb_ptr_adv(regparse);
+ MB_PTR_ADV(regparse);
/* Mark end of the collection. */
if (negated == TRUE)
@@ -1710,16 +1804,16 @@ collection:
if (reg_strict)
EMSG_RET_FAIL(_(e_missingbracket));
- /* FALLTHROUGH */
+ FALLTHROUGH;
default:
{
int plen;
nfa_do_multibyte:
- /* plen is length of current char with composing chars */
+ // plen is length of current char with composing chars
if (enc_utf8 && ((*mb_char2len)(c)
- != (plen = (*mb_ptr2len)(old_regparse))
+ != (plen = utfc_ptr2len(old_regparse))
|| utf_iscomposing(c))) {
int i = 0;
@@ -1771,7 +1865,7 @@ static int nfa_regpiece(void)
int greedy = TRUE; /* Braces are prefixed with '-' ? */
parse_state_T old_state;
parse_state_T new_state;
- int c2;
+ int64_t c2;
int old_post_pos;
int my_post_start;
int quest;
@@ -1846,7 +1940,7 @@ static int nfa_regpiece(void)
break;
}
if (i == 0) {
- EMSGN(_("E869: (NFA) Unknown operator '\\@%c'"), op);
+ emsgf(_("E869: (NFA) Unknown operator '\\@%c'"), op);
return FAIL;
}
EMIT(i);
@@ -1901,7 +1995,7 @@ static int nfa_regpiece(void)
// The engine is very inefficient (uses too many states) when the maximum
// is much larger than the minimum and when the maximum is large. Bail out
// if we can use the other engine.
- if ((nfa_re_flags & RE_AUTO) && (maxval > minval + 200 || maxval > 500)) {
+ if ((nfa_re_flags & RE_AUTO) && (maxval > 500 || maxval > minval + 200)) {
return FAIL;
}
@@ -1944,9 +2038,10 @@ static int nfa_regpiece(void)
break;
} /* end switch */
- if (re_multi_type(peekchr()) != NOT_MULTI)
- /* Can't have a multi follow a multi. */
- EMSG_RET_FAIL(_("E871: (NFA regexp) Can't have a multi follow a multi !"));
+ if (re_multi_type(peekchr()) != NOT_MULTI) {
+ // Can't have a multi follow a multi.
+ EMSG_RET_FAIL(_("E871: (NFA regexp) Can't have a multi follow a multi"));
+ }
return OK;
}
@@ -2036,7 +2131,6 @@ static int nfa_regconcat(void)
*/
static int nfa_regbranch(void)
{
- int ch;
int old_post_pos;
old_post_pos = (int)(post_ptr - post_start);
@@ -2045,10 +2139,13 @@ static int nfa_regbranch(void)
if (nfa_regconcat() == FAIL)
return FAIL;
- ch = peekchr();
- /* Try next concats */
- while (ch == Magic('&')) {
+ // Try next concats
+ while (peekchr() == Magic('&')) {
skipchr();
+ // if concat is empty do emit a node
+ if (old_post_pos == (int)(post_ptr - post_start)) {
+ EMIT(NFA_EMPTY);
+ }
EMIT(NFA_NOPEN);
EMIT(NFA_PREV_ATOM_NO_WIDTH);
old_post_pos = (int)(post_ptr - post_start);
@@ -2058,7 +2155,6 @@ static int nfa_regbranch(void)
if (old_post_pos == (int)(post_ptr - post_start))
EMIT(NFA_EMPTY);
EMIT(NFA_CONCAT);
- ch = peekchr();
}
/* if a branch is empty, emit one node for it */
@@ -2359,6 +2455,8 @@ static void nfa_set_code(int c)
}
static FILE *log_fd;
+static char_u e_log_open_failed[] = N_(
+ "Could not open temporary log file for writing, displaying on stderr... ");
/*
* Print the postfix notation of the current regexp.
@@ -2371,10 +2469,11 @@ static void nfa_postfix_dump(char_u *expr, int retval)
f = fopen(NFA_REGEXP_DUMP_LOG, "a");
if (f != NULL) {
fprintf(f, "\n-------------------------\n");
- if (retval == FAIL)
- fprintf(f, ">>> NFA engine failed ... \n");
- else if (retval == OK)
+ if (retval == FAIL) {
+ fprintf(f, ">>> NFA engine failed... \n");
+ } else if (retval == OK) {
fprintf(f, ">>> NFA engine succeeded !\n");
+ }
fprintf(f, "Regexp: \"%s\"\nPostfix notation (char): \"", expr);
for (p = post_start; *p && p < post_ptr; p++) {
nfa_set_code(*p);
@@ -2628,7 +2727,7 @@ static void st_error(int *postfix, int *end, int *p)
fclose(df);
}
#endif
- EMSG(_("E874: (NFA) Could not pop the stack !"));
+ EMSG(_("E874: (NFA) Could not pop the stack!"));
}
/*
@@ -2690,15 +2789,10 @@ static int nfa_max_width(nfa_state_T *startstate, int depth)
case NFA_ANY:
case NFA_START_COLL:
case NFA_START_NEG_COLL:
- /* matches some character, including composing chars */
- if (enc_utf8)
- len += MB_MAXBYTES;
- else if (has_mbyte)
- len += 2;
- else
- ++len;
+ // Matches some character, including composing chars.
+ len += MB_MAXBYTES;
if (state->c != NFA_ANY) {
- /* skip over the characters */
+ // Skip over the characters.
state = state->out1->out;
continue;
}
@@ -3141,7 +3235,13 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size)
if (pattern) {
/* NFA_ZEND -> NFA_END_PATTERN -> NFA_SKIP -> what follows. */
skip = alloc_state(NFA_SKIP, NULL, NULL);
+ if (skip == NULL) {
+ goto theend;
+ }
zend = alloc_state(NFA_ZEND, s1, NULL);
+ if (zend == NULL) {
+ goto theend;
+ }
s1->out= skip;
patch(e.out, zend);
PUSH(frag(s, list1(&skip->out)));
@@ -3159,8 +3259,8 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size)
break;
}
- case NFA_COMPOSING: /* char with composing char */
- /* FALLTHROUGH */
+ case NFA_COMPOSING: // char with composing char
+ FALLTHROUGH;
case NFA_MOPEN: /* \( \) Submatch */
case NFA_MOPEN1:
@@ -3811,23 +3911,27 @@ state_in_list (
return FALSE;
}
-/*
- * Add "state" and possibly what follows to state list ".".
- * Returns "subs_arg", possibly copied into temp_subs.
- */
+// Offset used for "off" by addstate_here().
+#define ADDSTATE_HERE_OFFSET 10
+// Add "state" and possibly what follows to state list ".".
+// Returns "subs_arg", possibly copied into temp_subs.
static regsubs_T *
addstate (
nfa_list_T *l, /* runtime state list */
nfa_state_T *state, /* state to update */
regsubs_T *subs_arg, /* pointers to subexpressions */
nfa_pim_T *pim, /* postponed look-behind match */
- int off /* byte offset, when -1 go to next line */
-)
+ int off_arg) /* byte offset, when -1 go to next line */
{
int subidx;
+ int off = off_arg;
+ int add_here = FALSE;
+ int listindex = 0;
+ int k;
+ int found = FALSE;
nfa_thread_T *thread;
- lpos_T save_lpos;
+ struct multipos save_multipos;
int save_in_use;
char_u *save_ptr;
int i;
@@ -3838,6 +3942,12 @@ addstate (
int did_print = FALSE;
#endif
+ if (off_arg <= -ADDSTATE_HERE_OFFSET) {
+ add_here = true;
+ off = 0;
+ listindex = -(off_arg + ADDSTATE_HERE_OFFSET);
+ }
+
switch (state->c) {
case NFA_NCLOSE:
case NFA_MCLOSE:
@@ -3879,7 +3989,7 @@ addstate (
|| !REG_MULTI
|| reglnum == nfa_endp->se_u.pos.lnum))
goto skip_add;
- /* FALLTHROUGH */
+ FALLTHROUGH;
case NFA_MOPEN1:
case NFA_MOPEN2:
@@ -3914,13 +4024,28 @@ addstate (
* lower position is preferred. */
if (!nfa_has_backref && pim == NULL && !l->has_pim
&& state->c != NFA_MATCH) {
+
+ /* When called from addstate_here() do insert before
+ * existing states. */
+ if (add_here) {
+ for (k = 0; k < l->n && k < listindex; ++k) {
+ if (l->t[k].state->id == state->id) {
+ found = TRUE;
+ break;
+ }
+ }
+ }
+
+ if (!add_here || found) {
skip_add:
#ifdef REGEXP_DEBUG
- nfa_set_code(state->c);
- fprintf(log_fd, "> Not adding state %d to list %d. char %d: %s\n",
- abs(state->id), l->id, state->c, code);
+ nfa_set_code(state->c);
+ fprintf(log_fd, "> Not adding state %d to list %d. char %d: %s pim: %s has_pim: %d found: %d\n",
+ abs(state->id), l->id, state->c, code,
+ pim == NULL ? "NULL" : "yes", l->has_pim, found);
#endif
return subs;
+ }
}
/* Do not add the state again when it exists with the same
@@ -3976,14 +4101,14 @@ skip_add:
case NFA_SPLIT:
/* order matters here */
- subs = addstate(l, state->out, subs, pim, off);
- subs = addstate(l, state->out1, subs, pim, off);
+ subs = addstate(l, state->out, subs, pim, off_arg);
+ subs = addstate(l, state->out1, subs, pim, off_arg);
break;
case NFA_EMPTY:
case NFA_NOPEN:
case NFA_NCLOSE:
- subs = addstate(l, state->out, subs, pim, off);
+ subs = addstate(l, state->out, subs, pim, off_arg);
break;
case NFA_MOPEN:
@@ -4010,7 +4135,7 @@ skip_add:
if (state->c == NFA_ZSTART) {
subidx = 0;
sub = &subs->norm;
- } else if (state->c >= NFA_ZOPEN && state->c <= NFA_ZOPEN9) {
+ } else if (state->c >= NFA_ZOPEN && state->c <= NFA_ZOPEN9) { // -V560
subidx = state->c - NFA_ZOPEN;
sub = &subs->synt;
} else {
@@ -4020,15 +4145,13 @@ skip_add:
/* avoid compiler warnings */
save_ptr = NULL;
- save_lpos.lnum = 0;
- save_lpos.col = 0;
+ memset(&save_multipos, 0, sizeof(save_multipos));
/* Set the position (with "off" added) in the subexpression. Save
* and restore it when it was in use. Otherwise fill any gap. */
if (REG_MULTI) {
if (subidx < sub->in_use) {
- save_lpos.lnum = sub->list.multi[subidx].start_lnum;
- save_lpos.col = sub->list.multi[subidx].start_col;
+ save_multipos = sub->list.multi[subidx];
save_in_use = -1;
} else {
save_in_use = sub->in_use;
@@ -4063,17 +4186,17 @@ skip_add:
sub->list.line[subidx].start = reginput + off;
}
- subs = addstate(l, state->out, subs, pim, off);
- /* "subs" may have changed, need to set "sub" again */
- if (state->c >= NFA_ZOPEN && state->c <= NFA_ZOPEN9)
+ subs = addstate(l, state->out, subs, pim, off_arg);
+ // "subs" may have changed, need to set "sub" again.
+ if (state->c >= NFA_ZOPEN && state->c <= NFA_ZOPEN9) { // -V560
sub = &subs->synt;
- else
+ } else {
sub = &subs->norm;
+ }
if (save_in_use == -1) {
- if (REG_MULTI){
- sub->list.multi[subidx].start_lnum = save_lpos.lnum;
- sub->list.multi[subidx].start_col = save_lpos.col;
+ if (REG_MULTI) {
+ sub->list.multi[subidx] = save_multipos;
}
else
sub->list.line[subidx].start = save_ptr;
@@ -4086,9 +4209,10 @@ skip_add:
? subs->norm.list.multi[0].end_lnum >= 0
: subs->norm.list.line[0].end != NULL)) {
/* Do not overwrite the position set by \ze. */
- subs = addstate(l, state->out, subs, pim, off);
+ subs = addstate(l, state->out, subs, pim, off_arg);
break;
}
+ FALLTHROUGH;
case NFA_MCLOSE1:
case NFA_MCLOSE2:
case NFA_MCLOSE3:
@@ -4112,7 +4236,7 @@ skip_add:
if (state->c == NFA_ZEND) {
subidx = 0;
sub = &subs->norm;
- } else if (state->c >= NFA_ZCLOSE && state->c <= NFA_ZCLOSE9) {
+ } else if (state->c >= NFA_ZCLOSE && state->c <= NFA_ZCLOSE9) { // -V560
subidx = state->c - NFA_ZCLOSE;
sub = &subs->synt;
} else {
@@ -4126,8 +4250,7 @@ skip_add:
if (sub->in_use <= subidx)
sub->in_use = subidx + 1;
if (REG_MULTI) {
- save_lpos.lnum = sub->list.multi[subidx].end_lnum;
- save_lpos.col = sub->list.multi[subidx].end_col;
+ save_multipos = sub->list.multi[subidx];
if (off == -1) {
sub->list.multi[subidx].end_lnum = reglnum + 1;
sub->list.multi[subidx].end_col = 0;
@@ -4141,21 +4264,20 @@ skip_add:
} else {
save_ptr = sub->list.line[subidx].end;
sub->list.line[subidx].end = reginput + off;
- /* avoid compiler warnings */
- save_lpos.lnum = 0;
- save_lpos.col = 0;
+ // avoid compiler warnings
+ memset(&save_multipos, 0, sizeof(save_multipos));
}
- subs = addstate(l, state->out, subs, pim, off);
- /* "subs" may have changed, need to set "sub" again */
- if (state->c >= NFA_ZCLOSE && state->c <= NFA_ZCLOSE9)
+ subs = addstate(l, state->out, subs, pim, off_arg);
+ // "subs" may have changed, need to set "sub" again.
+ if (state->c >= NFA_ZCLOSE && state->c <= NFA_ZCLOSE9) { // -V560
sub = &subs->synt;
- else
+ } else {
sub = &subs->norm;
+ }
- if (REG_MULTI){
- sub->list.multi[subidx].end_lnum = save_lpos.lnum;
- sub->list.multi[subidx].end_col = save_lpos.col;
+ if (REG_MULTI) {
+ sub->list.multi[subidx] = save_multipos;
}
else
sub->list.line[subidx].end = save_ptr;
@@ -4184,8 +4306,10 @@ addstate_here (
int count;
int listidx = *ip;
- /* first add the state(s) at the end, so that we know how many there are */
- addstate(l, state, subs, pim, 0);
+ /* First add the state(s) at the end, so that we know how many there are.
+ * Pass the listidx as offset (avoids adding another argument to
+ * addstate(). */
+ addstate(l, state, subs, pim, -listidx - ADDSTATE_HERE_OFFSET);
/* when "*ip" was at the end of the list, nothing to do */
if (listidx + 1 == tlen)
@@ -4238,48 +4362,55 @@ static int check_char_class(int class, int c)
{
switch (class) {
case NFA_CLASS_ALNUM:
- if (c >= 1 && c <= 255 && isalnum(c))
+ if (c >= 1 && c < 128 && isalnum(c)) {
return OK;
+ }
break;
case NFA_CLASS_ALPHA:
- if (c >= 1 && c <= 255 && isalpha(c))
+ if (c >= 1 && c < 128 && isalpha(c)) {
return OK;
+ }
break;
case NFA_CLASS_BLANK:
if (c == ' ' || c == '\t')
return OK;
break;
case NFA_CLASS_CNTRL:
- if (c >= 1 && c <= 255 && iscntrl(c))
+ if (c >= 1 && c <= 127 && iscntrl(c)) {
return OK;
+ }
break;
case NFA_CLASS_DIGIT:
if (ascii_isdigit(c))
return OK;
break;
case NFA_CLASS_GRAPH:
- if (c >= 1 && c <= 255 && isgraph(c))
+ if (c >= 1 && c <= 127 && isgraph(c)) {
return OK;
+ }
break;
case NFA_CLASS_LOWER:
- if (vim_islower(c))
+ if (mb_islower(c) && c != 170 && c != 186) {
return OK;
+ }
break;
case NFA_CLASS_PRINT:
if (vim_isprintc(c))
return OK;
break;
case NFA_CLASS_PUNCT:
- if (c >= 1 && c <= 255 && ispunct(c))
+ if (c >= 1 && c < 128 && ispunct(c)) {
return OK;
+ }
break;
case NFA_CLASS_SPACE:
if ((c >= 9 && c <= 13) || (c == ' '))
return OK;
break;
case NFA_CLASS_UPPER:
- if (vim_isupper(c))
+ if (mb_isupper(c)) {
return OK;
+ }
break;
case NFA_CLASS_XDIGIT:
if (ascii_isxdigit(c))
@@ -4298,13 +4429,14 @@ static int check_char_class(int class, int c)
return OK;
break;
case NFA_CLASS_ESCAPE:
- if (c == '\033')
+ if (c == ESC) {
return OK;
+ }
break;
default:
- /* should not be here :P */
- EMSGN(_(e_ill_char_class), class);
+ // should not be here :P
+ IEMSGN(_(e_ill_char_class), class);
return FAIL;
}
return FAIL;
@@ -4507,10 +4639,10 @@ static int recursive_regmatch(nfa_state_T *state, nfa_pim_T *pim, nfa_regprog_T
}
if ((int)(reginput - regline) >= state->val) {
reginput -= state->val;
- if (has_mbyte)
- reginput -= mb_head_off(regline, reginput);
- } else
+ reginput -= utf_head_off(regline, reginput);
+ } else {
reginput = regline;
+ }
}
}
@@ -4556,9 +4688,11 @@ static int recursive_regmatch(nfa_state_T *state, nfa_pim_T *pim, nfa_regprog_T
if (REG_MULTI)
regline = reg_getline(reglnum);
reginput = regline + save_reginput_col;
- nfa_match = save_nfa_match;
+ if (result != NFA_TOO_EXPENSIVE) {
+ nfa_match = save_nfa_match;
+ nfa_listid = save_nfa_listid;
+ }
nfa_endp = save_nfa_endp;
- nfa_listid = save_nfa_listid;
#ifdef REGEXP_DEBUG
log_fd = fopen(NFA_REGEXP_RUN_LOG, "a");
@@ -4568,8 +4702,7 @@ static int recursive_regmatch(nfa_state_T *state, nfa_pim_T *pim, nfa_regprog_T
fprintf(log_fd, "MATCH = %s\n", !result ? "FALSE" : "OK");
fprintf(log_fd, "****************************\n");
} else {
- EMSG(_(
- "Could not open temporary log file for writing, displaying on stderr ... "));
+ EMSG(_(e_log_open_failed));
log_fd = stderr;
}
#endif
@@ -4740,17 +4873,10 @@ static int failure_chance(nfa_state_T *state, int depth)
*/
static int skip_to_start(int c, colnr_T *colp)
{
- char_u *s;
-
- /* Used often, do some work to avoid call overhead. */
- if (!ireg_ic
- && !has_mbyte
- )
- s = vim_strbyte(regline + *colp, c);
- else
- s = cstrchr(regline + *colp, c);
- if (s == NULL)
+ const char_u *const s = cstrchr(regline + *colp, c);
+ if (s == NULL) {
return FAIL;
+ }
*colp = (int)(s - regline);
return OK;
}
@@ -4777,7 +4903,7 @@ static long find_match_text(colnr_T startcol, int regstart, char_u *match_text)
int c2_len = PTR2LEN(s2);
int c2 = PTR2CHAR(s2);
- if ((c1 != c2 && (!ireg_ic || vim_tolower(c1) != vim_tolower(c2)))
+ if ((c1 != c2 && (!rex.reg_ic || mb_tolower(c1) != mb_tolower(c2)))
|| c1_len != c2_len) {
match = false;
break;
@@ -4790,13 +4916,13 @@ static long find_match_text(colnr_T startcol, int regstart, char_u *match_text)
&& !(enc_utf8 && utf_iscomposing(PTR2CHAR(s2)))) {
cleanup_subexpr();
if (REG_MULTI) {
- reg_startpos[0].lnum = reglnum;
- reg_startpos[0].col = col;
- reg_endpos[0].lnum = reglnum;
- reg_endpos[0].col = s2 - regline;
+ rex.reg_startpos[0].lnum = reglnum;
+ rex.reg_startpos[0].col = col;
+ rex.reg_endpos[0].lnum = reglnum;
+ rex.reg_endpos[0].col = s2 - regline;
} else {
- reg_startp[0] = regline + col;
- reg_endp[0] = s2;
+ rex.reg_startp[0] = regline + col;
+ rex.reg_endp[0] = s2;
}
return 1L;
}
@@ -4842,7 +4968,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
FILE *debug = fopen(NFA_REGEXP_DEBUG_LOG, "a");
if (debug == NULL) {
- EMSG2(_("(NFA) COULD NOT OPEN %s !"), NFA_REGEXP_DEBUG_LOG);
+ EMSG2("(NFA) COULD NOT OPEN %s!", NFA_REGEXP_DEBUG_LOG);
return false;
}
#endif
@@ -4850,9 +4976,15 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
// recursive_regmatch(). Allow interrupting them with CTRL-C.
fast_breakcheck();
if (got_int) {
+#ifdef NFA_REGEXP_DEBUG_LOG
+ fclose(debug);
+#endif
return false;
}
if (nfa_time_limit != NULL && profile_passed_limit(*nfa_time_limit)) {
+#ifdef NFA_REGEXP_DEBUG_LOG
+ fclose(debug);
+#endif
return false;
}
@@ -4874,8 +5006,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
abs(start->id), code);
fprintf(log_fd, "**********************************\n");
} else {
- EMSG(_(
- "Could not open temporary log file for writing, displaying on stderr ... "));
+ EMSG(_(e_log_open_failed));
log_fd = stderr;
}
#endif
@@ -4914,16 +5045,8 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
* Run for each character.
*/
for (;; ) {
- int curc;
- int clen;
-
- if (has_mbyte) {
- curc = (*mb_ptr2char)(reginput);
- clen = (*mb_ptr2len)(reginput);
- } else {
- curc = *reginput;
- clen = 1;
- }
+ int curc = utf_ptr2char(reginput);
+ int clen = utfc_ptr2len(reginput);
if (curc == NUL) {
clen = 0;
go_to_nextline = false;
@@ -4932,10 +5055,11 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
/* swap lists */
thislist = &list[flag];
nextlist = &list[flag ^= 1];
- nextlist->n = 0; /* clear nextlist */
- nextlist->has_pim = FALSE;
- ++nfa_listid;
- if (prog->re_engine == AUTOMATIC_ENGINE && nfa_listid >= NFA_MAX_STATES) {
+ nextlist->n = 0; // clear nextlist
+ nextlist->has_pim = false;
+ nfa_listid++;
+ if (prog->re_engine == AUTOMATIC_ENGINE
+ && (nfa_listid >= NFA_MAX_STATES)) {
// Too many states, retry with old engine.
nfa_match = NFA_TOO_EXPENSIVE;
goto theend;
@@ -4948,8 +5072,9 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
fprintf(log_fd, "------------------------------------------\n");
fprintf(log_fd, ">>> Reginput is \"%s\"\n", reginput);
fprintf(log_fd,
- ">>> Advanced one character ... Current char is %c (code %d) \n", curc,
- (int)curc);
+ ">>> Advanced one character... Current char is %c (code %d) \n",
+ curc,
+ (int)curc);
fprintf(log_fd, ">>> Thislist has %d states available: ", thislist->n);
{
int i;
@@ -4981,16 +5106,17 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
{
int col;
- if (t->subs.norm.in_use <= 0)
+ if (t->subs.norm.in_use <= 0) {
col = -1;
- else if (REG_MULTI)
+ } else if (REG_MULTI) {
col = t->subs.norm.list.multi[0].start_col;
- else
+ } else {
col = (int)(t->subs.norm.list.line[0].start - regline);
+ }
nfa_set_code(t->state->c);
- fprintf(log_fd, "(%d) char %d %s (start col %d)%s ... \n",
- abs(t->state->id), (int)t->state->c, code, col,
- pim_info(&t->pim));
+ fprintf(log_fd, "(%d) char %d %s (start col %d)%s... \n",
+ abs(t->state->id), (int)t->state->c, code, col,
+ pim_info(&t->pim));
}
#endif
@@ -5005,8 +5131,8 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
case NFA_MATCH:
{
// If the match ends before a composing characters and
- // ireg_icombine is not set, that is not really a match.
- if (enc_utf8 && !ireg_icombine && utf_iscomposing(curc)) {
+ // rex.reg_icombine is not set, that is not really a match.
+ if (enc_utf8 && !rex.reg_icombine && utf_iscomposing(curc)) {
break;
}
nfa_match = true;
@@ -5289,15 +5415,15 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
int this_class;
// Get class of current and previous char (if it exists).
- this_class = mb_get_class_buf(reginput, reg_buf);
+ this_class = mb_get_class_tab(reginput, rex.reg_buf->b_chartab);
if (this_class <= 1) {
result = false;
} else if (reg_prev_class() == this_class) {
result = false;
}
- } else if (!vim_iswordc_buf(curc, reg_buf)
+ } else if (!vim_iswordc_buf(curc, rex.reg_buf)
|| (reginput > regline
- && vim_iswordc_buf(reginput[-1], reg_buf))) {
+ && vim_iswordc_buf(reginput[-1], rex.reg_buf))) {
result = false;
}
if (result) {
@@ -5314,15 +5440,15 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
int this_class, prev_class;
// Get class of current and previous char (if it exists).
- this_class = mb_get_class_buf(reginput, reg_buf);
+ this_class = mb_get_class_tab(reginput, rex.reg_buf->b_chartab);
prev_class = reg_prev_class();
if (this_class == prev_class
|| prev_class == 0 || prev_class == 1) {
result = false;
}
- } else if (!vim_iswordc_buf(reginput[-1], reg_buf)
+ } else if (!vim_iswordc_buf(reginput[-1], rex.reg_buf)
|| (reginput[0] != NUL
- && vim_iswordc_buf(curc, reg_buf))) {
+ && vim_iswordc_buf(curc, rex.reg_buf))) {
result = false;
}
if (result) {
@@ -5333,14 +5459,14 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
case NFA_BOF:
if (reglnum == 0 && reginput == regline
- && (!REG_MULTI || reg_firstlnum == 1)) {
+ && (!REG_MULTI || rex.reg_firstlnum == 1)) {
add_here = true;
add_state = t->state->out;
}
break;
case NFA_EOF:
- if (reglnum == reg_maxline && curc == NUL) {
+ if (reglnum == rex.reg_maxline && curc == NUL) {
add_here = true;
add_state = t->state->out;
}
@@ -5364,7 +5490,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
// (no preceding character).
len += mb_char2len(mc);
}
- if (ireg_icombine && len == 0) {
+ if (rex.reg_icombine && len == 0) {
// If \Z was present, then ignore composing characters.
// When ignoring the base character this always matches.
if (sta->c != curc) {
@@ -5385,7 +5511,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
// We don't care about the order of composing characters.
// Get them into cchars[] first.
while (len < clen) {
- mc = mb_ptr2char(reginput + len);
+ mc = utf_ptr2char(reginput + len);
cchars[ccount++] = mc;
len += mb_char2len(mc);
if (ccount == MAX_MCO)
@@ -5415,14 +5541,14 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
}
case NFA_NEWL:
- if (curc == NUL && !reg_line_lbr && REG_MULTI
- && reglnum <= reg_maxline) {
+ if (curc == NUL && !rex.reg_line_lbr && REG_MULTI
+ && reglnum <= rex.reg_maxline) {
go_to_nextline = true;
// Pass -1 for the offset, which means taking the position
// at the start of the next line.
add_state = t->state->out;
add_off = -1;
- } else if (curc == '\n' && reg_line_lbr) {
+ } else if (curc == '\n' && rex.reg_line_lbr) {
// match \n as if it is an ordinary character
add_state = t->state->out;
add_off = 1;
@@ -5463,23 +5589,25 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
result = result_if_matched;
break;
}
- if (ireg_ic) {
- int curc_low = vim_tolower(curc);
- int done = FALSE;
+ if (rex.reg_ic) {
+ int curc_low = mb_tolower(curc);
+ int done = false;
- for (; c1 <= c2; ++c1)
- if (vim_tolower(c1) == curc_low) {
+ for (; c1 <= c2; c1++) {
+ if (mb_tolower(c1) == curc_low) {
result = result_if_matched;
done = TRUE;
break;
}
- if (done)
+ }
+ if (done) {
break;
+ }
}
} else if (state->c < 0 ? check_char_class(state->c, curc)
: (curc == state->c
- || (ireg_ic && vim_tolower(curc)
- == vim_tolower(state->c)))) {
+ || (rex.reg_ic && mb_tolower(curc)
+ == mb_tolower(state->c)))) {
result = result_if_matched;
break;
}
@@ -5526,13 +5654,13 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
break;
case NFA_KWORD: // \k
- result = vim_iswordp_buf(reginput, reg_buf);
+ result = vim_iswordp_buf(reginput, rex.reg_buf);
ADD_STATE_IF_MATCH(t->state);
break;
case NFA_SKWORD: // \K
result = !ascii_isdigit(curc)
- && vim_iswordp_buf(reginput, reg_buf);
+ && vim_iswordp_buf(reginput, rex.reg_buf);
ADD_STATE_IF_MATCH(t->state);
break;
@@ -5647,24 +5775,24 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
break;
case NFA_LOWER_IC: // [a-z]
- result = ri_lower(curc) || (ireg_ic && ri_upper(curc));
+ result = ri_lower(curc) || (rex.reg_ic && ri_upper(curc));
ADD_STATE_IF_MATCH(t->state);
break;
case NFA_NLOWER_IC: // [^a-z]
result = curc != NUL
- && !(ri_lower(curc) || (ireg_ic && ri_upper(curc)));
+ && !(ri_lower(curc) || (rex.reg_ic && ri_upper(curc)));
ADD_STATE_IF_MATCH(t->state);
break;
case NFA_UPPER_IC: // [A-Z]
- result = ri_upper(curc) || (ireg_ic && ri_lower(curc));
+ result = ri_upper(curc) || (rex.reg_ic && ri_lower(curc));
ADD_STATE_IF_MATCH(t->state);
break;
case NFA_NUPPER_IC: // [^A-Z]
result = curc != NUL
- && !(ri_upper(curc) || (ireg_ic && ri_lower(curc)));
+ && !(ri_upper(curc) || (rex.reg_ic && ri_lower(curc)));
ADD_STATE_IF_MATCH(t->state);
break;
@@ -5738,13 +5866,15 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
case NFA_LNUM_GT:
case NFA_LNUM_LT:
assert(t->state->val >= 0
- && !((reg_firstlnum > 0 && reglnum > LONG_MAX - reg_firstlnum)
- || (reg_firstlnum <0 && reglnum < LONG_MIN + reg_firstlnum))
- && reglnum + reg_firstlnum >= 0);
+ && !((rex.reg_firstlnum > 0
+ && reglnum > LONG_MAX - rex.reg_firstlnum)
+ || (rex.reg_firstlnum < 0
+ && reglnum < LONG_MIN + rex.reg_firstlnum))
+ && reglnum + rex.reg_firstlnum >= 0);
result = (REG_MULTI
&& nfa_re_num_cmp((uintmax_t)t->state->val,
t->state->c - NFA_LNUM,
- (uintmax_t)(reglnum + reg_firstlnum)));
+ (uintmax_t)(reglnum + rex.reg_firstlnum)));
if (result) {
add_here = true;
add_state = t->state->out;
@@ -5780,7 +5910,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
}
result = false;
- win_T *wp = reg_win == NULL ? curwin : reg_win;
+ win_T *wp = rex.reg_win == NULL ? curwin : rex.reg_win;
if (op == 1 && col - 1 > t->state->val && col > 100) {
long ts = wp->w_buffer->b_p_ts;
@@ -5807,18 +5937,18 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
case NFA_MARK_GT:
case NFA_MARK_LT:
{
- pos_T *pos = getmark_buf(reg_buf, t->state->val, FALSE);
+ pos_T *pos = getmark_buf(rex.reg_buf, t->state->val, false);
// Compare the mark position to the match position.
result = (pos != NULL // mark doesn't exist
&& pos->lnum > 0 // mark isn't set in reg_buf
- && (pos->lnum == reglnum + reg_firstlnum
+ && (pos->lnum == reglnum + rex.reg_firstlnum
? (pos->col == (colnr_T)(reginput - regline)
? t->state->c == NFA_MARK
: (pos->col < (colnr_T)(reginput - regline)
? t->state->c == NFA_MARK_GT
: t->state->c == NFA_MARK_LT))
- : (pos->lnum < reglnum + reg_firstlnum
+ : (pos->lnum < reglnum + rex.reg_firstlnum
? t->state->c == NFA_MARK_GT
: t->state->c == NFA_MARK_LT)));
if (result) {
@@ -5829,10 +5959,10 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
}
case NFA_CURSOR:
- result = (reg_win != NULL
- && (reglnum + reg_firstlnum == reg_win->w_cursor.lnum)
+ result = (rex.reg_win != NULL
+ && (reglnum + rex.reg_firstlnum == rex.reg_win->w_cursor.lnum)
&& ((colnr_T)(reginput - regline)
- == reg_win->w_cursor.col));
+ == rex.reg_win->w_cursor.col));
if (result) {
add_here = true;
add_state = t->state->out;
@@ -5877,17 +6007,19 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
int c = t->state->c;
#ifdef REGEXP_DEBUG
- if (c < 0)
- EMSGN("INTERNAL: Negative state char: %" PRId64, c);
+ if (c < 0) {
+ IEMSGN("INTERNAL: Negative state char: %" PRId64, c);
+ }
#endif
result = (c == curc);
- if (!result && ireg_ic)
- result = vim_tolower(c) == vim_tolower(curc);
+ if (!result && rex.reg_ic) {
+ result = mb_tolower(c) == mb_tolower(curc);
+ }
- // If ireg_icombine is not set only skip over the character
+ // If rex.reg_icombine is not set only skip over the character
// itself. When it is set skip over composing characters.
- if (result && enc_utf8 && !ireg_icombine) {
+ if (result && enc_utf8 && !rex.reg_icombine) {
clen = utf_ptr2len(reginput);
}
@@ -5995,8 +6127,8 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
&& ((toplevel
&& reglnum == 0
&& clen != 0
- && (ireg_maxcol == 0
- || (colnr_T)(reginput - regline) < ireg_maxcol))
+ && (rex.reg_maxcol == 0
+ || (colnr_T)(reginput - regline) < rex.reg_maxcol))
|| (nfa_endp != NULL
&& (REG_MULTI
? (reglnum < nfa_endp->se_u.pos.lnum
@@ -6031,8 +6163,8 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
// Checking if the required start character matches is
// cheaper than adding a state that won't match.
c = PTR2CHAR(reginput + clen);
- if (c != prog->regstart && (!ireg_ic || vim_tolower(c)
- != vim_tolower(prog->regstart))) {
+ if (c != prog->regstart && (!rex.reg_ic || mb_tolower(c)
+ != mb_tolower(prog->regstart))) {
#ifdef REGEXP_DEBUG
fprintf(log_fd,
" Skipping start state, regstart does not match\n");
@@ -6138,8 +6270,9 @@ static long nfa_regtry(nfa_regprog_T *prog, colnr_T col, proftime_T *tm)
nfa_print_state(f, start);
fprintf(f, "\n\n");
fclose(f);
- } else
- EMSG(_("Could not open temporary log file for writing "));
+ } else {
+ EMSG("Could not open temporary log file for writing");
+ }
#endif
clear_sub(&subs.norm);
@@ -6157,34 +6290,37 @@ static long nfa_regtry(nfa_regprog_T *prog, colnr_T col, proftime_T *tm)
cleanup_subexpr();
if (REG_MULTI) {
for (i = 0; i < subs.norm.in_use; i++) {
- reg_startpos[i].lnum = subs.norm.list.multi[i].start_lnum;
- reg_startpos[i].col = subs.norm.list.multi[i].start_col;
+ rex.reg_startpos[i].lnum = subs.norm.list.multi[i].start_lnum;
+ rex.reg_startpos[i].col = subs.norm.list.multi[i].start_col;
- reg_endpos[i].lnum = subs.norm.list.multi[i].end_lnum;
- reg_endpos[i].col = subs.norm.list.multi[i].end_col;
+ rex.reg_endpos[i].lnum = subs.norm.list.multi[i].end_lnum;
+ rex.reg_endpos[i].col = subs.norm.list.multi[i].end_col;
}
- if (reg_startpos[0].lnum < 0) {
- reg_startpos[0].lnum = 0;
- reg_startpos[0].col = col;
+ if (rex.reg_startpos[0].lnum < 0) {
+ rex.reg_startpos[0].lnum = 0;
+ rex.reg_startpos[0].col = col;
+ }
+ if (rex.reg_endpos[0].lnum < 0) {
+ // pattern has a \ze but it didn't match, use current end
+ rex.reg_endpos[0].lnum = reglnum;
+ rex.reg_endpos[0].col = (int)(reginput - regline);
+ } else {
+ // Use line number of "\ze".
+ reglnum = rex.reg_endpos[0].lnum;
}
- if (reg_endpos[0].lnum < 0) {
- /* pattern has a \ze but it didn't match, use current end */
- reg_endpos[0].lnum = reglnum;
- reg_endpos[0].col = (int)(reginput - regline);
- } else
- /* Use line number of "\ze". */
- reglnum = reg_endpos[0].lnum;
} else {
for (i = 0; i < subs.norm.in_use; i++) {
- reg_startp[i] = subs.norm.list.line[i].start;
- reg_endp[i] = subs.norm.list.line[i].end;
+ rex.reg_startp[i] = subs.norm.list.line[i].start;
+ rex.reg_endp[i] = subs.norm.list.line[i].end;
}
- if (reg_startp[0] == NULL)
- reg_startp[0] = regline + col;
- if (reg_endp[0] == NULL)
- reg_endp[0] = reginput;
+ if (rex.reg_startp[0] == NULL) {
+ rex.reg_startp[0] = regline + col;
+ }
+ if (rex.reg_endp[0] == NULL) {
+ rex.reg_endp[0] = reginput;
+ }
}
/* Package any found \z(...\) matches for export. Default is none. */
@@ -6238,14 +6374,14 @@ static long nfa_regexec_both(char_u *line, colnr_T startcol, proftime_T *tm)
colnr_T col = startcol;
if (REG_MULTI) {
- prog = (nfa_regprog_T *)reg_mmatch->regprog;
- line = reg_getline((linenr_T)0); /* relative to the cursor */
- reg_startpos = reg_mmatch->startpos;
- reg_endpos = reg_mmatch->endpos;
+ prog = (nfa_regprog_T *)rex.reg_mmatch->regprog;
+ line = reg_getline((linenr_T)0); // relative to the cursor
+ rex.reg_startpos = rex.reg_mmatch->startpos;
+ rex.reg_endpos = rex.reg_mmatch->endpos;
} else {
- prog = (nfa_regprog_T *)reg_match->regprog;
- reg_startp = reg_match->startp;
- reg_endp = reg_match->endp;
+ prog = (nfa_regprog_T *)rex.reg_match->regprog;
+ rex.reg_startp = rex.reg_match->startp;
+ rex.reg_endp = rex.reg_match->endp;
}
/* Be paranoid... */
@@ -6254,15 +6390,17 @@ static long nfa_regexec_both(char_u *line, colnr_T startcol, proftime_T *tm)
goto theend;
}
- /* If pattern contains "\c" or "\C": overrule value of ireg_ic */
- if (prog->regflags & RF_ICASE)
- ireg_ic = TRUE;
- else if (prog->regflags & RF_NOICASE)
- ireg_ic = FALSE;
+ // If pattern contains "\c" or "\C": overrule value of rex.reg_ic
+ if (prog->regflags & RF_ICASE) {
+ rex.reg_ic = true;
+ } else if (prog->regflags & RF_NOICASE) {
+ rex.reg_ic = false;
+ }
- /* If pattern contains "\Z" overrule value of ireg_icombine */
- if (prog->regflags & RF_ICOMBINE)
- ireg_icombine = TRUE;
+ // If pattern contains "\Z" overrule value of rex.reg_icombine
+ if (prog->regflags & RF_ICOMBINE) {
+ rex.reg_icombine = true;
+ }
regline = line;
reglnum = 0; /* relative to line */
@@ -6291,17 +6429,17 @@ static long nfa_regexec_both(char_u *line, colnr_T startcol, proftime_T *tm)
if (skip_to_start(prog->regstart, &col) == FAIL)
return 0L;
- /* If match_text is set it contains the full text that must match.
- * Nothing else to try. Doesn't handle combining chars well. */
- if (prog->match_text != NULL
- && !ireg_icombine
- )
+ // If match_text is set it contains the full text that must match.
+ // Nothing else to try. Doesn't handle combining chars well.
+ if (prog->match_text != NULL && !rex.reg_icombine) {
return find_match_text(col, prog->regstart, prog->match_text);
+ }
}
- /* If the start column is past the maximum column: no need to try. */
- if (ireg_maxcol > 0 && col >= ireg_maxcol)
+ // If the start column is past the maximum column: no need to try.
+ if (rex.reg_maxcol > 0 && col >= rex.reg_maxcol) {
goto theend;
+ }
nstate = prog->nstate;
for (i = 0; i < nstate; ++i) {
@@ -6341,12 +6479,13 @@ static regprog_T *nfa_regcomp(char_u *expr, int re_flags)
* (and count its size). */
postfix = re2post();
if (postfix == NULL) {
- /* TODO: only give this error for debugging? */
- if (post_ptr >= post_end)
- EMSGN("Internal error: estimated max number "
- "of states insufficient: %" PRId64,
- post_end - post_start);
- goto fail; /* Cascaded (syntax?) error */
+ // TODO(vim): only give this error for debugging?
+ if (post_ptr >= post_end) {
+ IEMSGN("Internal error: estimated max number "
+ "of states insufficient: %" PRId64,
+ post_end - post_start);
+ }
+ goto fail; // Cascaded (syntax?) error
}
/*
@@ -6359,10 +6498,10 @@ static regprog_T *nfa_regcomp(char_u *expr, int re_flags)
FILE *f = fopen(NFA_REGEXP_RUN_LOG, "a");
if (f != NULL) {
- fprintf(
- f,
- "\n*****************************\n\n\n\n\tCompiling regexp \"%s\" ... hold on !\n",
- expr);
+ fprintf(f,
+ "\n*****************************\n\n\n\n\t"
+ "Compiling regexp \"%s\"... hold on !\n",
+ expr);
fclose(f);
}
}
@@ -6453,15 +6592,15 @@ nfa_regexec_nl (
bool line_lbr
)
{
- reg_match = rmp;
- reg_mmatch = NULL;
- reg_maxline = 0;
- reg_line_lbr = line_lbr;
- reg_buf = curbuf;
- reg_win = NULL;
- ireg_ic = rmp->rm_ic;
- ireg_icombine = FALSE;
- ireg_maxcol = 0;
+ rex.reg_match = rmp;
+ rex.reg_mmatch = NULL;
+ rex.reg_maxline = 0;
+ rex.reg_line_lbr = line_lbr;
+ rex.reg_buf = curbuf;
+ rex.reg_win = NULL;
+ rex.reg_ic = rmp->rm_ic;
+ rex.reg_icombine = false;
+ rex.reg_maxcol = 0;
return nfa_regexec_both(line, col, NULL);
}
@@ -6502,16 +6641,16 @@ nfa_regexec_nl (
static long nfa_regexec_multi(regmmatch_T *rmp, win_T *win, buf_T *buf,
linenr_T lnum, colnr_T col, proftime_T *tm)
{
- reg_match = NULL;
- reg_mmatch = rmp;
- reg_buf = buf;
- reg_win = win;
- reg_firstlnum = lnum;
- reg_maxline = reg_buf->b_ml.ml_line_count - lnum;
- reg_line_lbr = FALSE;
- ireg_ic = rmp->rmm_ic;
- ireg_icombine = FALSE;
- ireg_maxcol = rmp->rmm_maxcol;
+ rex.reg_match = NULL;
+ rex.reg_mmatch = rmp;
+ rex.reg_buf = buf;
+ rex.reg_win = win;
+ rex.reg_firstlnum = lnum;
+ rex.reg_maxline = rex.reg_buf->b_ml.ml_line_count - lnum;
+ rex.reg_line_lbr = false;
+ rex.reg_ic = rmp->rmm_ic;
+ rex.reg_icombine = false;
+ rex.reg_maxcol = rmp->rmm_maxcol;
return nfa_regexec_both(NULL, col, tm);
}
diff --git a/src/nvim/screen.c b/src/nvim/screen.c
index 34eef83164..2467cf192f 100644
--- a/src/nvim/screen.c
+++ b/src/nvim/screen.c
@@ -1,88 +1,71 @@
-/*
- * screen.c: code for displaying on the screen
- *
- * Output to the screen (console, terminal emulator or GUI window) is minimized
- * by remembering what is already on the screen, and only updating the parts
- * that changed.
- *
- * ScreenLines[off] Contains a copy of the whole screen, as it is currently
- * displayed (excluding text written by external commands).
- * ScreenAttrs[off] Contains the associated attributes.
- * LineOffset[row] Contains the offset into ScreenLines*[] and ScreenAttrs[]
- * for each line.
- * LineWraps[row] Flag for each line whether it wraps to the next line.
- *
- * For double-byte characters, two consecutive bytes in ScreenLines[] can form
- * one character which occupies two display cells.
- * For UTF-8 a multi-byte character is converted to Unicode and stored in
- * ScreenLinesUC[]. ScreenLines[] contains the first byte only. For an ASCII
- * character without composing chars ScreenLinesUC[] will be 0 and
- * ScreenLinesC[][] is not used. When the character occupies two display
- * cells the next byte in ScreenLines[] is 0.
- * ScreenLinesC[][] contain up to 'maxcombine' composing characters
- * (drawn on top of the first character). There is 0 after the last one used.
- * ScreenLines2[] is only used for euc-jp to store the second byte if the
- * first byte is 0x8e (single-width character).
- *
- * The screen_*() functions write to the screen and handle updating
- * ScreenLines[].
- *
- * update_screen() is the function that updates all windows and status lines.
- * It is called form the main loop when must_redraw is non-zero. It may be
- * called from other places when an immediate screen update is needed.
- *
- * The part of the buffer that is displayed in a window is set with:
- * - w_topline (first buffer line in window)
- * - w_topfill (filler lines above the first line)
- * - w_leftcol (leftmost window cell in window),
- * - w_skipcol (skipped window cells of first line)
- *
- * Commands that only move the cursor around in a window, do not need to take
- * action to update the display. The main loop will check if w_topline is
- * valid and update it (scroll the window) when needed.
- *
- * Commands that scroll a window change w_topline and must call
- * check_cursor() to move the cursor into the visible part of the window, and
- * call redraw_later(VALID) to have the window displayed by update_screen()
- * later.
- *
- * Commands that change text in the buffer must call changed_bytes() or
- * changed_lines() to mark the area that changed and will require updating
- * later. The main loop will call update_screen(), which will update each
- * window that shows the changed buffer. This assumes text above the change
- * can remain displayed as it is. Text after the change may need updating for
- * scrolling, folding and syntax highlighting.
- *
- * Commands that change how a window is displayed (e.g., setting 'list') or
- * invalidate the contents of a window in another way (e.g., change fold
- * settings), must call redraw_later(NOT_VALID) to have the whole window
- * redisplayed by update_screen() later.
- *
- * Commands that change how a buffer is displayed (e.g., setting 'tabstop')
- * must call redraw_curbuf_later(NOT_VALID) to have all the windows for the
- * buffer redisplayed by update_screen() later.
- *
- * Commands that change highlighting and possibly cause a scroll too must call
- * redraw_later(SOME_VALID) to update the whole window but still use scrolling
- * to avoid redrawing everything. But the length of displayed lines must not
- * change, use NOT_VALID then.
- *
- * Commands that move the window position must call redraw_later(NOT_VALID).
- * TODO: should minimize redrawing by scrolling when possible.
- *
- * Commands that change everything (e.g., resizing the screen) must call
- * redraw_all_later(NOT_VALID) or redraw_all_later(CLEAR).
- *
- * Things that are handled indirectly:
- * - When messages scroll the screen up, msg_scrolled will be set and
- * update_screen() called to redraw.
- */
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+// screen.c: code for displaying on the screen
+//
+// Output to the screen (console, terminal emulator or GUI window) is minimized
+// by remembering what is already on the screen, and only updating the parts
+// that changed.
+//
+// The grid_*() functions write to the screen and handle updating grid->lines[].
+//
+// update_screen() is the function that updates all windows and status lines.
+// It is called from the main loop when must_redraw is non-zero. It may be
+// called from other places when an immediate screen update is needed.
+//
+// The part of the buffer that is displayed in a window is set with:
+// - w_topline (first buffer line in window)
+// - w_topfill (filler lines above the first line)
+// - w_leftcol (leftmost window cell in window),
+// - w_skipcol (skipped window cells of first line)
+//
+// Commands that only move the cursor around in a window, do not need to take
+// action to update the display. The main loop will check if w_topline is
+// valid and update it (scroll the window) when needed.
+//
+// Commands that scroll a window change w_topline and must call
+// check_cursor() to move the cursor into the visible part of the window, and
+// call redraw_later(VALID) to have the window displayed by update_screen()
+// later.
+//
+// Commands that change text in the buffer must call changed_bytes() or
+// changed_lines() to mark the area that changed and will require updating
+// later. The main loop will call update_screen(), which will update each
+// window that shows the changed buffer. This assumes text above the change
+// can remain displayed as it is. Text after the change may need updating for
+// scrolling, folding and syntax highlighting.
+//
+// Commands that change how a window is displayed (e.g., setting 'list') or
+// invalidate the contents of a window in another way (e.g., change fold
+// settings), must call redraw_later(NOT_VALID) to have the whole window
+// redisplayed by update_screen() later.
+//
+// Commands that change how a buffer is displayed (e.g., setting 'tabstop')
+// must call redraw_curbuf_later(NOT_VALID) to have all the windows for the
+// buffer redisplayed by update_screen() later.
+//
+// Commands that change highlighting and possibly cause a scroll too must call
+// redraw_later(SOME_VALID) to update the whole window but still use scrolling
+// to avoid redrawing everything. But the length of displayed lines must not
+// change, use NOT_VALID then.
+//
+// Commands that move the window position must call redraw_later(NOT_VALID).
+// TODO(neovim): should minimize redrawing by scrolling when possible.
+//
+// Commands that change everything (e.g., resizing the screen) must call
+// redraw_all_later(NOT_VALID) or redraw_all_later(CLEAR).
+//
+// Things that are handled indirectly:
+// - When messages scroll the screen up, msg_scrolled will be set and
+// update_screen() called to redraw.
+///
#include <assert.h>
#include <inttypes.h>
#include <stdbool.h>
#include <string.h>
+#include "nvim/log.h"
#include "nvim/vim.h"
#include "nvim/ascii.h"
#include "nvim/arabic.h"
@@ -90,6 +73,7 @@
#include "nvim/buffer.h"
#include "nvim/charset.h"
#include "nvim/cursor.h"
+#include "nvim/cursor_shape.h"
#include "nvim/diff.h"
#include "nvim/eval.h"
#include "nvim/ex_cmds.h"
@@ -101,14 +85,15 @@
#include "nvim/fold.h"
#include "nvim/indent.h"
#include "nvim/getchar.h"
+#include "nvim/highlight.h"
#include "nvim/main.h"
+#include "nvim/mark.h"
#include "nvim/mbyte.h"
#include "nvim/memline.h"
#include "nvim/memory.h"
#include "nvim/menu.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/garray.h"
#include "nvim/move.h"
#include "nvim/normal.h"
@@ -120,6 +105,7 @@
#include "nvim/regexp.h"
#include "nvim/search.h"
#include "nvim/spell.h"
+#include "nvim/state.h"
#include "nvim/strings.h"
#include "nvim/syntax.h"
#include "nvim/terminal.h"
@@ -128,29 +114,45 @@
#include "nvim/version.h"
#include "nvim/window.h"
#include "nvim/os/time.h"
+#include "nvim/api/private/helpers.h"
#define MB_FILLER_CHAR '<' /* character used when a double-width character
* doesn't fit. */
#define W_ENDCOL(wp) (wp->w_wincol + wp->w_width)
+#define W_ENDROW(wp) (wp->w_winrow + wp->w_height)
-/*
- * The attributes that are actually active for writing to the screen.
- */
-static int screen_attr = 0;
+
+// temporary buffer for rendering a single screenline, so it can be
+// comparared with previous contents to calulate smallest delta.
+static size_t linebuf_size = 0;
+static schar_T *linebuf_char = NULL;
+static sattr_T *linebuf_attr = NULL;
static match_T search_hl; /* used for 'hlsearch' highlight matching */
static foldinfo_T win_foldinfo; /* info for 'foldcolumn' */
-/*
- * Buffer for one screen line (characters and attributes).
- */
-static schar_T *current_ScreenLine;
-
StlClickDefinition *tab_page_click_defs = NULL;
+
long tab_page_click_defs_size = 0;
-# define SCREEN_LINE(r, o, e, c, rl) screen_line((r), (o), (e), (c), (rl))
+// for line_putchar. Contains the state that needs to be remembered from
+// putting one character to the next.
+typedef struct {
+ const char_u *p;
+ int prev_c; // previous Arabic character
+ int prev_c1; // first composing char for prev_c
+} LineState;
+#define LINE_STATE(p) { p, 0, 0 }
+
+/// Whether to call "ui_call_grid_resize" in win_grid_alloc
+static bool send_grid_resize = false;
+
+/// Highlight ids are no longer valid. Force retransmission
+static bool highlights_invalid = false;
+
+static bool conceal_cursor_used = false;
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "screen.c.generated.h"
#endif
@@ -168,7 +170,7 @@ void redraw_later(int type)
void redraw_win_later(win_T *wp, int type)
{
- if (wp->w_redr_type < type) {
+ if (!exiting && wp->w_redr_type < type) {
wp->w_redr_type = type;
if (type >= NOT_VALID)
wp->w_lines_valid = 0;
@@ -178,17 +180,6 @@ void redraw_win_later(win_T *wp, int type)
}
/*
- * Force a complete redraw later. Also resets the highlighting. To be used
- * after executing a shell command that messes up the screen.
- */
-void redraw_later_clear(void)
-{
- redraw_all_later(CLEAR);
- /* Use attributes that is very unlikely to appear in text. */
- screen_attr = HL_BOLD | HL_UNDERLINE | HL_INVERSE;
-}
-
-/*
* Mark all windows to be redrawn later.
*/
void redraw_all_later(int type)
@@ -196,6 +187,16 @@ void redraw_all_later(int type)
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
redraw_win_later(wp, type);
}
+ // This may be needed when switching tabs.
+ if (must_redraw < type) {
+ must_redraw = type;
+ }
+}
+
+void screen_invalidate_highlights(void)
+{
+ redraw_all_later(NOT_VALID);
+ highlights_invalid = true;
}
/*
@@ -215,6 +216,15 @@ void redraw_buf_later(buf_T *buf, int type)
}
}
+void redraw_buf_line_later(buf_T *buf, linenr_T line)
+{
+ FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
+ if (wp->w_buffer == buf) {
+ redrawWinline(wp, line);
+ }
+ }
+}
+
/*
* Changed something in the current window, at buffer line "lnum", that
* requires that line and possibly other lines to be redrawn.
@@ -224,24 +234,20 @@ void redraw_buf_later(buf_T *buf, int type)
* may become invalid and the whole window will have to be redrawn.
*/
void
-redrawWinline (
- linenr_T lnum,
- int invalid /* window line height is invalid now */
+redrawWinline(
+ win_T *wp,
+ linenr_T lnum
)
{
- int i;
-
- if (curwin->w_redraw_top == 0 || curwin->w_redraw_top > lnum)
- curwin->w_redraw_top = lnum;
- if (curwin->w_redraw_bot == 0 || curwin->w_redraw_bot < lnum)
- curwin->w_redraw_bot = lnum;
- redraw_later(VALID);
-
- if (invalid) {
- /* A w_lines[] entry for this lnum has become invalid. */
- i = find_wl_entry(curwin, lnum);
- if (i >= 0)
- curwin->w_lines[i].wl_valid = FALSE;
+ if (lnum >= wp->w_topline
+ && lnum < wp->w_botline) {
+ if (wp->w_redraw_top == 0 || wp->w_redraw_top > lnum) {
+ wp->w_redraw_top = lnum;
+ }
+ if (wp->w_redraw_bot == 0 || wp->w_redraw_bot < lnum) {
+ wp->w_redraw_bot = lnum;
+ }
+ redraw_win_later(wp, VALID);
}
}
@@ -254,12 +260,12 @@ void update_curbuf(int type)
update_screen(type);
}
-/*
- * update_screen()
- *
- * Based on the current value of curwin->w_topline, transfer a screenfull
- * of stuff from Filemem to ScreenLines[], and update curwin->w_botline.
- */
+/// Redraw the parts of the screen that is marked for redraw.
+///
+/// Most code shouldn't call this directly, rather use redraw_later() and
+/// and redraw_all_later() to mark parts of the screen as needing a redraw.
+///
+/// @param type set to a NOT_VALID to force redraw of entire screen
void update_screen(int type)
{
static int did_intro = FALSE;
@@ -302,16 +308,33 @@ void update_screen(int type)
* if the screen was scrolled up when displaying a message, scroll it down
*/
if (msg_scrolled) {
- clear_cmdline = TRUE;
- if (msg_scrolled > Rows - 5) /* clearing is faster */
+ ui_call_win_scroll_over_reset();
+ clear_cmdline = true;
+ if (dy_flags & DY_MSGSEP) {
+ int valid = MAX(Rows - msg_scrollsize(), 0);
+ if (valid == 0) {
+ redraw_tabline = true;
+ }
+ FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
+ if (W_ENDROW(wp) > valid) {
+ wp->w_redr_type = NOT_VALID;
+ wp->w_lines_valid = 0;
+ }
+ if (W_ENDROW(wp) + wp->w_status_height > valid) {
+ wp->w_redr_status = true;
+ }
+ }
+ } else if (msg_scrolled > default_grid.Rows - 5) { // clearing is faster
type = CLEAR;
- else if (type != CLEAR) {
- check_for_delay(FALSE);
- if (screen_ins_lines(0, 0, msg_scrolled, (int)Rows, NULL) == FAIL)
+ } else if (type != CLEAR) {
+ check_for_delay(false);
+ if (grid_ins_lines(&default_grid, 0, msg_scrolled, (int)Rows,
+ 0, (int)Columns) == FAIL) {
type = CLEAR;
+ }
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
if (wp->w_winrow < msg_scrolled) {
- if (wp->w_winrow + wp->w_height > msg_scrolled
+ if (W_ENDROW(wp) > msg_scrolled
&& wp->w_redr_type < REDRAW_TOP
&& wp->w_lines_valid > 0
&& wp->w_topline == wp->w_lines[0].wl_lnum) {
@@ -319,7 +342,7 @@ void update_screen(int type)
wp->w_redr_type = REDRAW_TOP;
} else {
wp->w_redr_type = NOT_VALID;
- if (wp->w_winrow + wp->w_height + wp->w_status_height
+ if (W_ENDROW(wp) + wp->w_status_height
<= msg_scrolled) {
wp->w_redr_status = TRUE;
}
@@ -340,9 +363,14 @@ void update_screen(int type)
if (need_highlight_changed)
highlight_changed();
- if (type == CLEAR) { /* first clear screen */
- screenclear(); /* will reset clear_cmdline */
+ if (type == CLEAR) { // first clear screen
+ screenclear(); // will reset clear_cmdline
+ cmdline_screen_cleared(); // clear external cmdline state
type = NOT_VALID;
+ // must_redraw may be set indirectly, avoid another redraw later
+ must_redraw = 0;
+ } else if (highlights_invalid) {
+ grid_invalidate(&default_grid);
}
if (clear_cmdline) /* going to clear cmdline (done below) */
@@ -375,15 +403,24 @@ void update_screen(int type)
))
curwin->w_redr_type = type;
- /* Redraw the tab pages line if needed. */
- if (redraw_tabline || type >= NOT_VALID)
+ // Redraw the tab pages line if needed.
+ if (redraw_tabline || type >= NOT_VALID) {
+ update_window_hl(curwin, type >= NOT_VALID);
+ FOR_ALL_TABS(tp) {
+ if (tp != curtab) {
+ update_window_hl(tp->tp_curwin, type >= NOT_VALID);
+ }
+ }
draw_tabline();
+ }
/*
* Correct stored syntax highlighting info for changes in each displayed
* buffer. Each buffer must only be done once.
*/
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
+ update_window_hl(wp, type >= NOT_VALID);
+
if (wp->w_buffer->b_mod_set) {
win_T *wwp;
@@ -416,13 +453,16 @@ void update_screen(int type)
/* redraw status line after the window to minimize cursor movement */
if (wp->w_redr_status) {
- win_redr_status(wp);
+ win_redr_status(wp, true); // any popup menu will be redrawn below
}
}
+ send_grid_resize = false;
+ highlights_invalid = false;
end_search_hl();
- /* May need to redraw the popup menu. */
- if (pum_visible())
+ // May need to redraw the popup menu.
+ if (pum_drawn()) {
pum_redraw();
+ }
/* Reset b_mod_set flags. Going through all windows is probably faster
* than going through all buffers (there could be many buffers). */
@@ -467,122 +507,29 @@ int conceal_cursor_line(win_T *wp)
return vim_strchr(wp->w_p_cocu, c) != NULL;
}
-/*
- * Check if the cursor line needs to be redrawn because of 'concealcursor'.
- */
-void conceal_check_cursur_line(void)
+// Check if the cursor line needs to be redrawn because of 'concealcursor'.
+//
+// When cursor is moved at the same time, both lines will be redrawn regardless.
+void conceal_check_cursor_line(void)
{
- if (curwin->w_p_cole > 0 && conceal_cursor_line(curwin)) {
- need_cursor_line_redraw = TRUE;
- /* Need to recompute cursor column, e.g., when starting Visual mode
- * without concealing. */
- curs_columns(TRUE);
+ bool should_conceal = conceal_cursor_line(curwin);
+ if (curwin->w_p_cole > 0 && (conceal_cursor_used != should_conceal)) {
+ redrawWinline(curwin, curwin->w_cursor.lnum);
+ // Need to recompute cursor column, e.g., when starting Visual mode
+ // without concealing. */
+ curs_columns(true);
}
}
-void update_single_line(win_T *wp, linenr_T lnum)
-{
- int row;
- int j;
-
- if (lnum >= wp->w_topline && lnum < wp->w_botline
- && foldedCount(wp, lnum, &win_foldinfo) == 0) {
- row = 0;
- for (j = 0; j < wp->w_lines_valid; ++j) {
- if (lnum == wp->w_lines[j].wl_lnum) {
- init_search_hl(wp);
- start_search_hl();
- prepare_search_hl(wp, lnum);
- win_line(wp, lnum, row, row + wp->w_lines[j].wl_size, false);
- end_search_hl();
- break;
- }
- row += wp->w_lines[j].wl_size;
- }
- }
- need_cursor_line_redraw = FALSE;
-}
-
-
-/*
- * Prepare for updating one or more windows.
- * Caller must check for "updating_screen" already set to avoid recursiveness.
- */
-static void update_prepare(void)
-{
- updating_screen = TRUE;
- start_search_hl();
-}
-
-/*
- * Finish updating one or more windows.
- */
-static void update_finish(void)
-{
- if (redraw_cmdline) {
- showmode();
- }
-
- end_search_hl();
- updating_screen = FALSE;
-}
-
-void update_debug_sign(buf_T *buf, linenr_T lnum)
-{
- int doit = FALSE;
- win_foldinfo.fi_level = 0;
-
- /* update/delete a specific mark */
- FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
- if (buf != NULL && lnum > 0) {
- if (wp->w_buffer == buf && lnum >= wp->w_topline
- && lnum < wp->w_botline) {
- if (wp->w_redraw_top == 0 || wp->w_redraw_top > lnum) {
- wp->w_redraw_top = lnum;
- }
- if (wp->w_redraw_bot == 0 || wp->w_redraw_bot < lnum) {
- wp->w_redraw_bot = lnum;
- }
- redraw_win_later(wp, VALID);
- }
- } else {
- redraw_win_later(wp, VALID);
- }
- if (wp->w_redr_type != 0) {
- doit = TRUE;
- }
- }
-
- /* Return when there is nothing to do, screen updating is already
- * happening (recursive call) or still starting up. */
- if (!doit || updating_screen || starting) {
- return;
- }
-
- /* update all windows that need updating */
- update_prepare();
-
- FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
- if (wp->w_redr_type != 0) {
- win_update(wp);
- }
- if (wp->w_redr_status) {
- win_redr_status(wp);
- }
- }
-
- update_finish();
-}
-
-/*
- * Return TRUE when window "wp" has a column to draw signs in.
- */
-static int draw_signcolumn(win_T *wp)
+/// Whether cursorline is drawn in a special way
+///
+/// If true, both old and new cursorline will need
+/// need to be redrawn when moving cursor within windows.
+bool win_cursorline_standout(win_T *wp)
{
- return (wp->w_buffer->b_signlist != NULL);
+ return wp->w_p_cul || (wp->w_p_cole > 0 && !conceal_cursor_line(wp));
}
-
/*
* Update a single window.
*
@@ -639,11 +586,10 @@ static void win_update(win_T *wp)
static int recursive = FALSE; /* being called recursively */
int old_botline = wp->w_botline;
long fold_count;
- /* remember what happened to the previous line, to know if
- * check_visual_highlight() can be used */
-#define DID_NONE 1 /* didn't update a line */
-#define DID_LINE 2 /* updated a normal line */
-#define DID_FOLD 3 /* updated a folded line */
+ // Remember what happened to the previous line.
+#define DID_NONE 1 // didn't update a line
+#define DID_LINE 2 // updated a normal line
+#define DID_FOLD 3 // updated a folded line
int did_update = DID_NONE;
linenr_T syntax_last_parsed = 0; /* last parsed text line */
linenr_T mod_top = 0;
@@ -652,20 +598,22 @@ static void win_update(win_T *wp)
type = wp->w_redr_type;
- if (type == NOT_VALID) {
- wp->w_redr_status = TRUE;
+ win_grid_alloc(wp);
+
+ if (type >= NOT_VALID) {
+ wp->w_redr_status = true;
wp->w_lines_valid = 0;
}
- /* Window is zero-height: nothing to draw. */
- if (wp->w_height == 0) {
+ // Window is zero-height: nothing to draw.
+ if (wp->w_grid.Rows == 0) {
wp->w_redr_type = 0;
return;
}
- /* Window is zero-width: Only need to draw the separator. */
- if (wp->w_width == 0) {
- /* draw the vertical separator right of this window */
+ // Window is zero-width: Only need to draw the separator.
+ if (wp->w_grid.Columns == 0) {
+ // draw the vertical separator right of this window
draw_vsep_win(wp, 0);
wp->w_redr_type = 0;
return;
@@ -679,12 +627,18 @@ static void win_update(win_T *wp)
if (wp->w_nrwidth != i) {
type = NOT_VALID;
wp->w_nrwidth = i;
- } else if (buf->b_mod_set && buf->b_mod_xlines != 0 && wp->w_redraw_top != 0) {
- /*
- * When there are both inserted/deleted lines and specific lines to be
- * redrawn, w_redraw_top and w_redraw_bot may be invalid, just redraw
- * everything (only happens when redrawing is off for while).
- */
+
+ if (buf->terminal) {
+ terminal_resize(buf->terminal,
+ (uint16_t)(MAX(0, wp->w_grid.Columns - win_col_off(wp))),
+ (uint16_t)wp->w_grid.Rows);
+ }
+ } else if (buf->b_mod_set
+ && buf->b_mod_xlines != 0
+ && wp->w_redraw_top != 0) {
+ // When there are both inserted/deleted lines and specific lines to be
+ // redrawn, w_redraw_top and w_redraw_bot may be invalid, just redraw
+ // everything (only happens when redrawing is off for while).
type = NOT_VALID;
} else {
/*
@@ -764,16 +718,18 @@ static void win_update(win_T *wp)
}
}
- (void)hasFoldingWin(wp, mod_top, &mod_top, NULL, TRUE, NULL);
- if (mod_top > lnumt)
+ (void)hasFoldingWin(wp, mod_top, &mod_top, NULL, true, NULL);
+ if (mod_top > lnumt) {
mod_top = lnumt;
+ }
- /* Now do the same for the bottom line (one above mod_bot). */
- --mod_bot;
- (void)hasFoldingWin(wp, mod_bot, NULL, &mod_bot, TRUE, NULL);
- ++mod_bot;
- if (mod_bot < lnumb)
+ // Now do the same for the bottom line (one above mod_bot).
+ mod_bot--;
+ (void)hasFoldingWin(wp, mod_bot, NULL, &mod_bot, true, NULL);
+ mod_bot++;
+ if (mod_bot < lnumb) {
mod_bot = lnumb;
+ }
}
/* When a change starts above w_topline and the end is below
@@ -814,13 +770,6 @@ static void win_update(win_T *wp)
type = VALID;
}
- /* Trick: we want to avoid clearing the screen twice. screenclear() will
- * set "screen_cleared" to TRUE. The special value MAYBE (which is still
- * non-zero and thus not FALSE) will indicate that screenclear() was not
- * called. */
- if (screen_cleared)
- screen_cleared = MAYBE;
-
/*
* If there are no changes on the screen that require a complete redraw,
* handle three cases:
@@ -852,29 +801,26 @@ static void win_update(win_T *wp)
/* count the number of lines we are off, counting a sequence
* of folded lines as one */
j = 0;
- for (ln = wp->w_topline; ln < wp->w_lines[0].wl_lnum; ++ln) {
- ++j;
- if (j >= wp->w_height - 2)
+ for (ln = wp->w_topline; ln < wp->w_lines[0].wl_lnum; ln++) {
+ j++;
+ if (j >= wp->w_grid.Rows - 2) {
break;
- (void)hasFoldingWin(wp, ln, NULL, &ln, TRUE, NULL);
+ }
+ (void)hasFoldingWin(wp, ln, NULL, &ln, true, NULL);
}
} else
j = wp->w_lines[0].wl_lnum - wp->w_topline;
- if (j < wp->w_height - 2) { /* not too far off */
+ if (j < wp->w_grid.Rows - 2) { // not too far off
i = plines_m_win(wp, wp->w_topline, wp->w_lines[0].wl_lnum - 1);
/* insert extra lines for previously invisible filler lines */
if (wp->w_lines[0].wl_lnum != wp->w_topline)
i += diff_check_fill(wp, wp->w_lines[0].wl_lnum)
- wp->w_old_topfill;
- if (i < wp->w_height - 2) { /* less than a screen off */
- /*
- * Try to insert the correct number of lines.
- * If not the last window, delete the lines at the bottom.
- * win_ins_lines may fail when the terminal can't do it.
- */
- if (i > 0)
- check_for_delay(FALSE);
- if (win_ins_lines(wp, 0, i, FALSE, wp == firstwin) == OK) {
+ if (i < wp->w_grid.Rows - 2) { // less than a screen off
+ // Try to insert the correct number of lines.
+ // If not the last window, delete the lines at the bottom.
+ // win_ins_lines may fail when the terminal can't do it.
+ if (win_ins_lines(wp, 0, i) == OK) {
if (wp->w_lines_valid != 0) {
/* Need to update rows that are new, stop at the
* first one that scrolled down. */
@@ -883,12 +829,15 @@ static void win_update(win_T *wp)
/* Move the entries that were scrolled, disable
* the entries for the lines to be redrawn. */
- if ((wp->w_lines_valid += j) > wp->w_height)
- wp->w_lines_valid = wp->w_height;
- for (idx = wp->w_lines_valid; idx - j >= 0; idx--)
+ if ((wp->w_lines_valid += j) > wp->w_grid.Rows) {
+ wp->w_lines_valid = wp->w_grid.Rows;
+ }
+ for (idx = wp->w_lines_valid; idx - j >= 0; idx--) {
wp->w_lines[idx] = wp->w_lines[idx - j];
- while (idx >= 0)
- wp->w_lines[idx--].wl_valid = FALSE;
+ }
+ while (idx >= 0) {
+ wp->w_lines[idx--].wl_valid = false;
+ }
}
} else
mid_start = 0; /* redraw all lines */
@@ -932,11 +881,11 @@ static void win_update(win_T *wp)
/* ... but don't delete new filler lines. */
row -= wp->w_topfill;
if (row > 0) {
- check_for_delay(FALSE);
- if (win_del_lines(wp, 0, row, FALSE, wp == firstwin) == OK)
- bot_start = wp->w_height - row;
- else
- mid_start = 0; /* redraw all lines */
+ if (win_del_lines(wp, 0, row) == OK) {
+ bot_start = wp->w_grid.Rows - row;
+ } else {
+ mid_start = 0; // redraw all lines
+ }
}
if ((row == 0 || bot_start < 999) && wp->w_lines_valid != 0) {
/*
@@ -952,7 +901,7 @@ static void win_update(win_T *wp)
/* stop at line that didn't fit, unless it is still
* valid (no lines deleted) */
if (row > 0 && bot_start + row
- + (int)wp->w_lines[j].wl_size > wp->w_height) {
+ + (int)wp->w_lines[j].wl_size > wp->w_grid.Rows) {
wp->w_lines_valid = idx + 1;
break;
}
@@ -968,45 +917,26 @@ static void win_update(win_T *wp)
* when it won't get updated below. */
if (wp->w_p_diff && bot_start > 0)
wp->w_lines[0].wl_size =
- plines_win_nofill(wp, wp->w_topline, TRUE)
+ plines_win_nofill(wp, wp->w_topline, true)
+ wp->w_topfill;
}
}
}
- /* When starting redraw in the first line, redraw all lines. When
- * there is only one window it's probably faster to clear the screen
- * first. */
+ // When starting redraw in the first line, redraw all lines.
if (mid_start == 0) {
- mid_end = wp->w_height;
- if (lastwin == firstwin) {
- /* Clear the screen when it was not done by win_del_lines() or
- * win_ins_lines() above, "screen_cleared" is FALSE or MAYBE
- * then. */
- if (screen_cleared != TRUE)
- screenclear();
- /* The screen was cleared, redraw the tab pages line. */
- if (redraw_tabline)
- draw_tabline();
- }
- }
-
- /* When win_del_lines() or win_ins_lines() caused the screen to be
- * cleared (only happens for the first window) or when screenclear()
- * was called directly above, "must_redraw" will have been set to
- * NOT_VALID, need to reset it here to avoid redrawing twice. */
- if (screen_cleared == TRUE)
- must_redraw = 0;
+ mid_end = wp->w_grid.Rows;
+ }
} else {
/* Not VALID or INVERTED: redraw all lines. */
mid_start = 0;
- mid_end = wp->w_height;
+ mid_end = wp->w_grid.Rows;
}
if (type == SOME_VALID) {
/* SOME_VALID: redraw all lines. */
mid_start = 0;
- mid_end = wp->w_height;
+ mid_end = wp->w_grid.Rows;
type = NOT_VALID;
}
@@ -1016,14 +946,10 @@ static void win_update(win_T *wp)
linenr_T from, to;
if (VIsual_active) {
- if (VIsual_active
- && (VIsual_mode != wp->w_old_visual_mode
- || type == INVERTED_ALL)) {
- /*
- * If the type of Visual selection changed, redraw the whole
- * selection. Also when the ownership of the X selection is
- * gained or lost.
- */
+ if (VIsual_mode != wp->w_old_visual_mode || type == INVERTED_ALL) {
+ // If the type of Visual selection changed, redraw the whole
+ // selection. Also when the ownership of the X selection is
+ // gained or lost.
if (curwin->w_cursor.lnum < VIsual.lnum) {
from = curwin->w_cursor.lnum;
to = VIsual.lnum;
@@ -1155,8 +1081,8 @@ static void win_update(win_T *wp)
++lnum;
}
srow += mid_start;
- mid_end = wp->w_height;
- for (; idx < wp->w_lines_valid; ++idx) { /* find end */
+ mid_end = wp->w_grid.Rows;
+ for (; idx < wp->w_lines_valid; idx++) { // find end
if (wp->w_lines[idx].wl_valid
&& wp->w_lines[idx].wl_lnum >= to + 1) {
/* Only update until first row of this line */
@@ -1196,8 +1122,8 @@ static void win_update(win_T *wp)
for (;; ) {
/* stop updating when reached the end of the window (check for _past_
* the end of the window is at the end of the loop) */
- if (row == wp->w_height) {
- didline = TRUE;
+ if (row == wp->w_grid.Rows) {
+ didline = true;
break;
}
@@ -1211,15 +1137,13 @@ static void win_update(win_T *wp)
* with. It is used further down when the line doesn't fit. */
srow = row;
- /*
- * Update a line when it is in an area that needs updating, when it
- * has changes or w_lines[idx] is invalid.
- * bot_start may be halfway through a wrapped line after using
- * win_del_lines(), check if the current line includes it.
- * When syntax folding is being used, the saved syntax states will
- * already have been updated, we can't see where the syntax state is
- * the same again, just update until the end of the window.
- */
+ // Update a line when it is in an area that needs updating, when it
+ // has changes or w_lines[idx] is invalid.
+ // "bot_start" may be halfway a wrapped line after using
+ // win_del_lines(), check if the current line includes it.
+ // When syntax folding is being used, the saved syntax states will
+ // already have been updated, we can't see where the syntax state is
+ // the same again, just update until the end of the window.
if (row < top_end
|| (row >= mid_start && row < mid_end)
|| top_to_mod
@@ -1288,17 +1212,17 @@ static void win_update(win_T *wp)
/* Able to count old number of rows: Count new window
* rows, and may insert/delete lines */
j = idx;
- for (l = lnum; l < mod_bot; ++l) {
- if (hasFoldingWin(wp, l, NULL, &l, TRUE, NULL))
- ++new_rows;
- else if (l == wp->w_topline)
- new_rows += plines_win_nofill(wp, l, TRUE)
- + wp->w_topfill;
- else
- new_rows += plines_win(wp, l, TRUE);
- ++j;
- if (new_rows > wp->w_height - row - 2) {
- /* it's getting too much, must redraw the rest */
+ for (l = lnum; l < mod_bot; l++) {
+ if (hasFoldingWin(wp, l, NULL, &l, true, NULL)) {
+ new_rows++;
+ } else if (l == wp->w_topline) {
+ new_rows += plines_win_nofill(wp, l, true) + wp->w_topfill;
+ } else {
+ new_rows += plines_win(wp, l, true);
+ }
+ j++;
+ if (new_rows > wp->w_grid.Rows - row - 2) {
+ // it's getting too much, must redraw the rest
new_rows = 9999;
break;
}
@@ -1309,31 +1233,29 @@ static void win_update(win_T *wp)
* remaining text or scrolling fails, must redraw the
* rest. If scrolling works, must redraw the text
* below the scrolled text. */
- if (row - xtra_rows >= wp->w_height - 2)
+ if (row - xtra_rows >= wp->w_grid.Rows - 2) {
mod_bot = MAXLNUM;
- else {
- check_for_delay(FALSE);
- if (win_del_lines(wp, row,
- -xtra_rows, FALSE, FALSE) == FAIL)
+ } else {
+ if (win_del_lines(wp, row, -xtra_rows) == FAIL) {
mod_bot = MAXLNUM;
- else
- bot_start = wp->w_height + xtra_rows;
+ } else {
+ bot_start = wp->w_grid.Rows + xtra_rows;
+ }
}
} else if (xtra_rows > 0) {
/* May scroll text down. If there is not enough
* remaining text of scrolling fails, must redraw the
* rest. */
- if (row + xtra_rows >= wp->w_height - 2)
+ if (row + xtra_rows >= wp->w_grid.Rows - 2) {
mod_bot = MAXLNUM;
- else {
- check_for_delay(FALSE);
- if (win_ins_lines(wp, row + old_rows,
- xtra_rows, FALSE, FALSE) == FAIL)
+ } else {
+ if (win_ins_lines(wp, row + old_rows, xtra_rows) == FAIL) {
mod_bot = MAXLNUM;
- else if (top_end > row + old_rows)
- /* Scrolled the part at the top that requires
- * updating down. */
+ } else if (top_end > row + old_rows) {
+ // Scrolled the part at the top that requires
+ // updating down.
top_end += xtra_rows;
+ }
}
}
@@ -1353,7 +1275,7 @@ static void win_update(win_T *wp)
wp->w_lines[j] = wp->w_lines[i];
/* stop at a line that won't fit */
if (x + (int)wp->w_lines[j].wl_size
- > wp->w_height) {
+ > wp->w_grid.Rows) {
wp->w_lines_valid = j + 1;
break;
}
@@ -1366,10 +1288,12 @@ static void win_update(win_T *wp)
/* move entries in w_lines[] downwards */
j -= i;
wp->w_lines_valid += j;
- if (wp->w_lines_valid > wp->w_height)
- wp->w_lines_valid = wp->w_height;
- for (i = wp->w_lines_valid; i - j >= idx; --i)
+ if (wp->w_lines_valid > wp->w_grid.Rows) {
+ wp->w_lines_valid = wp->w_grid.Rows;
+ }
+ for (i = wp->w_lines_valid; i - j >= idx; i--) {
wp->w_lines[i] = wp->w_lines[i - j];
+ }
/* The w_lines[] entries for inserted lines are
* now invalid, but wl_size may be used above.
@@ -1400,13 +1324,13 @@ static void win_update(win_T *wp)
&& wp->w_lines[idx].wl_valid
&& wp->w_lines[idx].wl_lnum == lnum
&& lnum > wp->w_topline
- && !(dy_flags & DY_LASTLINE)
- && srow + wp->w_lines[idx].wl_size > wp->w_height
+ && !(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_height + 1;
+ row = wp->w_grid.Rows + 1;
} else {
prepare_search_hl(wp, lnum);
/* Let the syntax stuff know we skipped a few lines. */
@@ -1417,7 +1341,7 @@ static void win_update(win_T *wp)
/*
* Display one line.
*/
- row = win_line(wp, lnum, srow, wp->w_height, mod_top == 0);
+ row = win_line(wp, lnum, srow, wp->w_grid.Rows, mod_top == 0, false);
wp->w_lines[idx].wl_folded = FALSE;
wp->w_lines[idx].wl_lastlnum = lnum;
@@ -1426,12 +1350,14 @@ static void win_update(win_T *wp)
}
wp->w_lines[idx].wl_lnum = lnum;
- wp->w_lines[idx].wl_valid = TRUE;
- if (row > wp->w_height) { /* past end of screen */
- /* we may need the size of that too long line later on */
- if (dollar_vcol == -1)
- wp->w_lines[idx].wl_size = plines_win(wp, lnum, TRUE);
- ++idx;
+ wp->w_lines[idx].wl_valid = true;
+
+ if (row > wp->w_grid.Rows) { // past end of grid
+ // we may need the size of that too long line later on
+ if (dollar_vcol == -1) {
+ wp->w_lines[idx].wl_size = plines_win(wp, lnum, true);
+ }
+ idx++;
break;
}
if (dollar_vcol == -1)
@@ -1439,10 +1365,22 @@ static void win_update(win_T *wp)
++idx;
lnum += fold_count + 1;
} else {
- /* This line does not need updating, advance to the next one */
+ 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);
+ }
+ }
+
+ // This line does not need to be drawn, advance to the next one.
row += wp->w_lines[idx++].wl_size;
- if (row > wp->w_height) /* past end of screen */
+ if (row > wp->w_grid.Rows) { // past end of screen
break;
+ }
lnum = wp->w_lines[idx - 1].wl_lastlnum + 1;
did_update = DID_NONE;
}
@@ -1473,33 +1411,40 @@ static void win_update(win_T *wp)
wp->w_empty_rows = 0;
wp->w_filler_rows = 0;
if (!eof && !didline) {
+ int at_attr = hl_combine_attr(wp->w_hl_attr_normal,
+ win_hl_attr(wp, HLF_AT));
if (lnum == wp->w_topline) {
/*
* Single line that does not fit!
* Don't overwrite it, it can be edited.
*/
wp->w_botline = lnum + 1;
- } else if (diff_check_fill(wp, lnum) >= wp->w_height - srow) {
- /* Window ends in filler lines. */
+ } else if (diff_check_fill(wp, lnum) >= wp->w_grid.Rows - srow) {
+ // Window ends in filler lines.
wp->w_botline = lnum;
- wp->w_filler_rows = wp->w_height - srow;
- } else if (dy_flags & DY_LASTLINE) { /* 'display' has "lastline" */
- /*
- * Last line isn't finished: Display "@@@" at the end.
- */
- screen_fill(wp->w_winrow + wp->w_height - 1,
- wp->w_winrow + wp->w_height,
- W_ENDCOL(wp) - 3, W_ENDCOL(wp),
- '@', '@', hl_attr(HLF_AT));
+ wp->w_filler_rows = wp->w_grid.Rows - srow;
+ } else if (dy_flags & DY_TRUNCATE) { // 'display' has "truncate"
+ int scr_row = wp->w_grid.Rows - 1;
+
+ // Last line isn't finished: Display "@@@" in the last screen line.
+ grid_puts_len(&wp->w_grid, (char_u *)"@@", 2, scr_row, 0, at_attr);
+
+ grid_fill(&wp->w_grid, scr_row, scr_row + 1, 2, (int)wp->w_grid.Columns,
+ '@', ' ', at_attr);
+ set_empty_rows(wp, srow);
+ wp->w_botline = lnum;
+ } else if (dy_flags & DY_LASTLINE) { // 'display' has "lastline"
+ // Last line isn't finished: Display "@@@" at the end.
+ grid_fill(&wp->w_grid, wp->w_grid.Rows - 1, wp->w_grid.Rows,
+ wp->w_grid.Columns - 3, wp->w_grid.Columns, '@', '@', at_attr);
set_empty_rows(wp, srow);
wp->w_botline = lnum;
} else {
- win_draw_end(wp, '@', ' ', srow, wp->w_height, HLF_AT);
+ win_draw_end(wp, '@', ' ', srow, wp->w_grid.Rows, HLF_AT);
wp->w_botline = lnum;
}
} else {
- draw_vsep_win(wp, row);
- if (eof) { /* we hit the end of the file */
+ if (eof) { // we hit the end of the file
wp->w_botline = buf->b_ml.ml_line_count + 1;
j = diff_check_fill(wp, wp->w_botline);
if (j > 0 && !wp->w_botfill) {
@@ -1510,17 +1455,22 @@ static void win_update(win_T *wp)
i = '-';
else
i = fill_diff;
- if (row + j > wp->w_height)
- j = wp->w_height - row;
+ if (row + j > wp->w_grid.Rows) {
+ j = wp->w_grid.Rows - row;
+ }
win_draw_end(wp, i, i, row, row + (int)j, HLF_DED);
row += j;
}
} else if (dollar_vcol == -1)
wp->w_botline = lnum;
- /* make sure the rest of the screen is blank */
- /* put '~'s on rows that aren't part of the file. */
- win_draw_end(wp, '~', ' ', row, wp->w_height, HLF_EOB);
+ // make sure the rest of the screen is blank
+ // write the 'fill_eob' character to rows that aren't part of the file.
+ win_draw_end(wp, fill_eob, ' ', row, wp->w_grid.Rows, HLF_EOB);
+ }
+
+ if (wp->w_redr_type >= REDRAW_TOP) {
+ draw_vsep_win(wp, 0);
}
/* Reset the type of redrawing required, the window has been updated. */
@@ -1563,6 +1513,20 @@ static void win_update(win_T *wp)
got_int = save_got_int;
}
+/// Returns width of the signcolumn that should be used for the whole window
+///
+/// @param wp window we want signcolumn width from
+/// @return max width of signcolumn (cell unit)
+///
+/// @note Returns a constant for now but hopefully we can improve neovim so that
+/// the returned value width adapts to the maximum number of marks to draw
+/// for the window
+/// TODO(teto)
+int win_signcol_width(win_T *wp)
+{
+ // 2 is vim default value
+ return 2;
+}
/*
* Clear the rest of the window and mark the unused lines with "c1". use "c2"
@@ -1574,77 +1538,74 @@ static void win_draw_end(win_T *wp, int c1, int c2, int row, int endrow, hlf_T h
# define FDC_OFF n
int fdc = compute_foldcolumn(wp, 0);
+ int attr = hl_combine_attr(wp->w_hl_attr_normal, win_hl_attr(wp, hl));
+
if (wp->w_p_rl) {
// No check for cmdline window: should never be right-left.
n = fdc;
if (n > 0) {
- /* draw the fold column at the right */
- if (n > wp->w_width)
- n = wp->w_width;
- screen_fill(wp->w_winrow + row, wp->w_winrow + endrow,
- W_ENDCOL(wp) - n, W_ENDCOL(wp),
- ' ', ' ', hl_attr(HLF_FC));
+ // draw the fold column at the right
+ if (n > wp->w_grid.Columns) {
+ n = wp->w_grid.Columns;
+ }
+ grid_fill(&wp->w_grid, row, endrow, wp->w_grid.Columns - n,
+ wp->w_grid.Columns, ' ', ' ', win_hl_attr(wp, HLF_FC));
}
- if (draw_signcolumn(wp)) {
- int nn = n + 2;
+ if (signcolumn_on(wp)) {
+ int nn = n + win_signcol_width(wp);
- /* draw the sign column left of the fold column */
- if (nn > wp->w_width) {
- nn = wp->w_width;
+ // draw the sign column left of the fold column
+ if (nn > wp->w_grid.Columns) {
+ nn = wp->w_grid.Columns;
}
- screen_fill(wp->w_winrow + row, wp->w_winrow + endrow,
- W_ENDCOL(wp) - nn, W_ENDCOL(wp) - n,
- ' ', ' ', hl_attr(HLF_SC));
+ grid_fill(&wp->w_grid, row, endrow, wp->w_grid.Columns - nn,
+ wp->w_grid.Columns - n, ' ', ' ', win_hl_attr(wp, HLF_SC));
n = nn;
}
- screen_fill(wp->w_winrow + row, wp->w_winrow + endrow,
- wp->w_wincol, W_ENDCOL(wp) - 1 - FDC_OFF,
- c2, c2, hl_attr(hl));
- screen_fill(wp->w_winrow + row, wp->w_winrow + endrow,
- W_ENDCOL(wp) - 1 - FDC_OFF, W_ENDCOL(wp) - FDC_OFF,
- c1, c2, hl_attr(hl));
+ grid_fill(&wp->w_grid, row, endrow, 0, wp->w_grid.Columns - 1 - FDC_OFF,
+ c2, c2, attr);
+ grid_fill(&wp->w_grid, row, endrow,
+ wp->w_grid.Columns - 1 - FDC_OFF, wp->w_grid.Columns - FDC_OFF,
+ c1, c2, attr);
} else {
if (cmdwin_type != 0 && wp == curwin) {
/* draw the cmdline character in the leftmost column */
n = 1;
- if (n > wp->w_width)
- n = wp->w_width;
- screen_fill(wp->w_winrow + row, wp->w_winrow + endrow,
- wp->w_wincol, wp->w_wincol + n,
- cmdwin_type, ' ', hl_attr(HLF_AT));
+ if (n > wp->w_grid.Columns) {
+ n = wp->w_grid.Columns;
+ }
+ grid_fill(&wp->w_grid, row, endrow, 0, n, cmdwin_type, ' ',
+ win_hl_attr(wp, HLF_AT));
}
if (fdc > 0) {
int nn = n + fdc;
- /* draw the fold column at the left */
- if (nn > wp->w_width)
- nn = wp->w_width;
- screen_fill(wp->w_winrow + row, wp->w_winrow + endrow,
- wp->w_wincol + n, wp->w_wincol + nn,
- ' ', ' ', hl_attr(HLF_FC));
+ // draw the fold column at the left
+ if (nn > wp->w_grid.Columns) {
+ nn = wp->w_grid.Columns;
+ }
+ grid_fill(&wp->w_grid, row, endrow, n, nn, ' ', ' ',
+ win_hl_attr(wp, HLF_FC));
n = nn;
}
- if (draw_signcolumn(wp))
- {
- int nn = n + 2;
+ if (signcolumn_on(wp)) {
+ int nn = n + win_signcol_width(wp);
- /* draw the sign column after the fold column */
- if (nn > wp->w_width) {
- nn = wp->w_width;
+ // draw the sign column after the fold column
+ if (nn > wp->w_grid.Columns) {
+ nn = wp->w_grid.Columns;
}
- screen_fill(wp->w_winrow + row, wp->w_winrow + endrow,
- wp->w_wincol + n, wp->w_wincol + nn,
- ' ', ' ', hl_attr(HLF_SC));
+ grid_fill(&wp->w_grid, row, endrow, n, nn, ' ', ' ',
+ win_hl_attr(wp, HLF_SC));
n = nn;
}
- screen_fill(wp->w_winrow + row, wp->w_winrow + endrow,
- wp->w_wincol + FDC_OFF, W_ENDCOL(wp),
- c1, c2, hl_attr(hl));
+ grid_fill(&wp->w_grid, row, endrow, FDC_OFF, wp->w_grid.Columns, c1, c2,
+ attr);
}
set_empty_rows(wp, row);
}
@@ -1666,7 +1627,7 @@ static int compute_foldcolumn(win_T *wp, int col)
{
int fdc = wp->w_p_fdc;
int wmw = wp == curwin && p_wmw == 0 ? 1 : p_wmw;
- int wwidth = wp->w_width;
+ int wwidth = wp->w_grid.Columns;
if (fdc > wwidth - (col + wmw)) {
fdc = wwidth - (col + wmw);
@@ -1674,12 +1635,62 @@ static int compute_foldcolumn(win_T *wp, int col)
return fdc;
}
+/// Put a single char from an UTF-8 buffer into a line buffer.
+///
+/// Handles composing chars and arabic shaping state.
+static int line_putchar(LineState *s, schar_T *dest, int maxcells, bool rl)
+{
+ const char_u *p = s->p;
+ int cells = utf_ptr2cells(p);
+ int c_len = utfc_ptr2len(p);
+ int u8c, u8cc[MAX_MCO];
+ if (cells > maxcells) {
+ return -1;
+ }
+ u8c = utfc_ptr2char(p, u8cc);
+ if (*p < 0x80 && u8cc[0] == 0) {
+ schar_from_ascii(dest[0], *p);
+ s->prev_c = u8c;
+ } else {
+ if (p_arshape && !p_tbidi && arabic_char(u8c)) {
+ // Do Arabic shaping.
+ int pc, pc1, nc;
+ int pcc[MAX_MCO];
+ int firstbyte = *p;
+
+ // The idea of what is the previous and next
+ // character depends on 'rightleft'.
+ if (rl) {
+ pc = s->prev_c;
+ pc1 = s->prev_c1;
+ nc = utf_ptr2char(p + c_len);
+ s->prev_c1 = u8cc[0];
+ } else {
+ pc = utfc_ptr2char(p + c_len, pcc);
+ nc = s->prev_c;
+ pc1 = pcc[0];
+ }
+ s->prev_c = u8c;
+
+ u8c = arabic_shape(u8c, &firstbyte, &u8cc[0], pc, pc1, nc);
+ } else {
+ s->prev_c = u8c;
+ }
+ schar_from_cc(dest[0], u8c, u8cc);
+ }
+ if (cells > 1) {
+ dest[1][0] = 0;
+ }
+ s->p += c_len;
+ 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[51];
+ char_u buf[FOLD_TEXT_LEN];
pos_T *top, *bot;
linenr_T lnume = lnum + fold_count - 1;
int len;
@@ -1687,7 +1698,7 @@ static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T
int fdc;
int col;
int txtcol;
- int off = (int)(current_ScreenLine - ScreenLines);
+ int off;
int ri;
/* Build the fold line:
@@ -1699,17 +1710,16 @@ static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T
* 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) {
- ScreenLines[off] = cmdwin_type;
- ScreenAttrs[off] = hl_attr(HLF_AT);
- if (enc_utf8)
- ScreenLinesUC[off] = 0;
- ++col;
+ schar_from_ascii(linebuf_char[off], cmdwin_type);
+ linebuf_attr[off] = win_hl_attr(wp, HLF_AT);
+ col++;
}
// 2. Add the 'foldcolumn'
@@ -1720,35 +1730,43 @@ static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T
if (wp->w_p_rl) {
int i;
- copy_text_attr(off + wp->w_width - fdc - col, buf, fdc,
- hl_attr(HLF_FC));
- /* reverse the fold column */
- for (i = 0; i < fdc; ++i)
- ScreenLines[off + wp->w_width - i - 1 - col] = buf[i];
- } else
- copy_text_attr(off + col, buf, fdc, hl_attr(HLF_FC));
+ copy_text_attr(off + wp->w_grid.Columns - fdc - col, buf, fdc,
+ win_hl_attr(wp, HLF_FC));
+ // reverse the fold column
+ for (i = 0; i < fdc; i++) {
+ schar_from_ascii(linebuf_char[off + wp->w_grid.Columns - i - 1 - col],
+ buf[i]);
+ }
+ } else {
+ copy_text_attr(off + col, buf, fdc, win_hl_attr(wp, HLF_FC));
+ }
col += fdc;
}
-# define RL_MEMSET(p, v, l) if (wp->w_p_rl) \
- for (ri = 0; ri < l; ++ri) \
- ScreenAttrs[off + (wp->w_width - (p) - (l)) + ri] = v; \
- else \
- for (ri = 0; ri < l; ++ri) \
- ScreenAttrs[off + (p) + ri] = v
+# define RL_MEMSET(p, v, l) if (wp->w_p_rl) { \
+ for (ri = 0; ri < l; ri++) { \
+ linebuf_attr[off + (wp->w_grid.Columns - (p) - (l)) + ri] = v; \
+ } \
+ } else { \
+ for (ri = 0; ri < l; ri++) { \
+ linebuf_attr[off + (p) + ri] = v; \
+ } \
+ }
/* Set all attributes of the 'number' or 'relativenumber' column and the
* text */
- RL_MEMSET(col, hl_attr(HLF_FL), wp->w_width - col);
+ RL_MEMSET(col, win_hl_attr(wp, HLF_FL), wp->w_grid.Columns - col);
- /* If signs are being displayed, add two spaces. */
- if (draw_signcolumn(wp)) {
- len = wp->w_width - col;
+ // If signs are being displayed, add spaces.
+ if (signcolumn_on(wp)) {
+ len = wp->w_grid.Columns - col;
if (len > 0) {
- if (len > 2) {
- len = 2;
+ int len_max = win_signcol_width(wp);
+ if (len > len_max) {
+ len = len_max;
}
- copy_text_attr(off + col, (char_u *)" ", len, hl_attr(HLF_FL));
+ copy_text_attr(off + col, (char_u *)" ", len,
+ win_hl_attr(wp, HLF_FL));
col += len;
}
}
@@ -1757,7 +1775,7 @@ static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T
* 3. Add the 'number' or 'relativenumber' column
*/
if (wp->w_p_nu || wp->w_p_rnu) {
- len = wp->w_width - col;
+ len = wp->w_grid.Columns - col;
if (len > 0) {
int w = number_width(wp);
long num;
@@ -1780,13 +1798,14 @@ static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T
}
}
- sprintf((char *)buf, fmt, w, num);
- if (wp->w_p_rl)
- /* the line number isn't reversed */
- copy_text_attr(off + wp->w_width - len - col, buf, len,
- hl_attr(HLF_FL));
- else
- copy_text_attr(off + col, buf, len, hl_attr(HLF_FL));
+ 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;
}
}
@@ -1798,113 +1817,43 @@ static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T
txtcol = col; /* remember where text starts */
- /*
- * 5. move the text to current_ScreenLine. Fill up with "fill_fold".
- * Right-left text is put in columns 0 - number-col, normal text is put
- * in columns number-col - window-width.
- */
- if (has_mbyte) {
- int cells;
- int u8c, u8cc[MAX_MCO];
- int i;
- int idx;
- int c_len;
- char_u *p;
- int prev_c = 0; /* previous Arabic character */
- int prev_c1 = 0; /* first composing char for prev_c */
-
- if (wp->w_p_rl)
- idx = off;
- else
- idx = off + col;
-
- /* Store multibyte characters in ScreenLines[] et al. correctly. */
- for (p = text; *p != NUL; ) {
- cells = (*mb_ptr2cells)(p);
- c_len = (*mb_ptr2len)(p);
- if (col + cells > wp->w_width
- - (wp->w_p_rl ? col : 0)
- )
- break;
- ScreenLines[idx] = *p;
- if (enc_utf8) {
- u8c = utfc_ptr2char(p, u8cc);
- if (*p < 0x80 && u8cc[0] == 0) {
- ScreenLinesUC[idx] = 0;
- prev_c = u8c;
- } else {
- if (p_arshape && !p_tbidi && arabic_char(u8c)) {
- /* Do Arabic shaping. */
- int pc, pc1, nc;
- int pcc[MAX_MCO];
- int firstbyte = *p;
-
- /* The idea of what is the previous and next
- * character depends on 'rightleft'. */
- if (wp->w_p_rl) {
- pc = prev_c;
- pc1 = prev_c1;
- nc = utf_ptr2char(p + c_len);
- prev_c1 = u8cc[0];
- } else {
- pc = utfc_ptr2char(p + c_len, pcc);
- nc = prev_c;
- pc1 = pcc[0];
- }
- prev_c = u8c;
+ // 5. move the text to linebuf_char[off]. Fill up with "fill_fold".
+ // Right-left text is put in columns 0 - number-col, normal text is put
+ // in columns number-col - window-width.
+ int idx;
- u8c = arabic_shape(u8c, &firstbyte, &u8cc[0],
- pc, pc1, nc);
- ScreenLines[idx] = firstbyte;
- } else
- prev_c = u8c;
- /* Non-BMP character: display as ? or fullwidth ?. */
- ScreenLinesUC[idx] = u8c;
- for (i = 0; i < Screen_mco; ++i) {
- ScreenLinesC[i][idx] = u8cc[i];
- if (u8cc[i] == 0)
- break;
- }
- }
- if (cells > 1)
- ScreenLines[idx + 1] = 0;
- } else if (enc_dbcs == DBCS_JPNU && *p == 0x8e)
- /* double-byte single width character */
- ScreenLines2[idx] = p[1];
- else if (cells > 1)
- /* double-width character */
- ScreenLines[idx + 1] = p[1];
- col += cells;
- idx += cells;
- p += c_len;
- }
+ if (wp->w_p_rl) {
+ idx = off;
} else {
- len = (int)STRLEN(text);
- if (len > wp->w_width - col)
- len = wp->w_width - col;
- if (len > 0) {
- if (wp->w_p_rl)
- STRNCPY(current_ScreenLine, text, len);
- else
- STRNCPY(current_ScreenLine + col, text, len);
- col += len;
+ idx = 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.
+ int maxcells = wp->w_grid.Columns - col - (wp->w_p_rl ? col : 0);
+ int cells = line_putchar(&s, &linebuf_char[idx], maxcells, wp->w_p_rl);
+ if (cells == -1) {
+ break;
}
+ col += cells;
+ idx += cells;
}
/* Fill the rest of the line with the fold filler */
if (wp->w_p_rl)
col -= txtcol;
- while (col < wp->w_width
+
+ schar_T sc;
+ schar_from_char(sc, fill_fold);
+ while (col < wp->w_grid.Columns
- (wp->w_p_rl ? txtcol : 0)
) {
- if (enc_utf8) {
- if (fill_fold >= 0x80) {
- ScreenLinesUC[off + col] = fill_fold;
- ScreenLinesC[0][off + col] = 0;
- } else
- ScreenLinesUC[off + col] = 0;
- }
- ScreenLines[off + col++] = fill_fold;
+ schar_copy(linebuf_char[off+col++], sc);
}
if (text != buf)
@@ -1936,20 +1885,21 @@ static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T
>= (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_width) {
+ // 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_width)
+ < (colnr_T)wp->w_grid.Columns) {
len = wp->w_old_cursor_lcol;
- else
- len = wp->w_width - txtcol;
- RL_MEMSET(wp->w_old_cursor_fcol + txtcol, hl_attr(HLF_V),
- len - (int)wp->w_old_cursor_fcol);
+ } 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, hl_attr(HLF_V), wp->w_width - txtcol);
+ // Set all attributes of the text
+ RL_MEMSET(txtcol, win_hl_attr(wp, HLF_V), wp->w_grid.Columns - txtcol);
}
}
}
@@ -1967,9 +1917,9 @@ static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T
} else {
txtcol -= wp->w_leftcol;
}
- if (txtcol >= 0 && txtcol < wp->w_width) {
- ScreenAttrs[off + txtcol] =
- hl_combine_attr(ScreenAttrs[off + txtcol], hl_attr(HLF_MC));
+ 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];
@@ -1983,13 +1933,14 @@ static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T
txtcol -= wp->w_skipcol;
else
txtcol -= wp->w_leftcol;
- if (txtcol >= 0 && txtcol < wp->w_width)
- ScreenAttrs[off + txtcol] = hl_combine_attr(
- ScreenAttrs[off + txtcol], hl_attr(HLF_CUC));
+ 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));
+ }
}
- SCREEN_LINE(row + wp->w_winrow, wp->w_wincol, wp->w_width,
- wp->w_width, FALSE);
+ 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
@@ -2002,21 +1953,22 @@ static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T
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 ScreenLines["off"] and set attributes to "attr".
- */
+
+/// 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;
- memmove(ScreenLines + off, buf, (size_t)len);
- if (enc_utf8)
- memset(ScreenLinesUC + off, 0, sizeof(u8char_T) * (size_t)len);
- for (i = 0; i < len; ++i)
- ScreenAttrs[off + i] = attr;
+ for (i = 0; i < len; i++) {
+ schar_from_ascii(linebuf_char[off + i], buf[i]);
+ linebuf_attr[off + i] = attr;
+ }
}
/*
@@ -2086,19 +2038,18 @@ win_line (
linenr_T lnum,
int startrow,
int endrow,
- bool nochange /* not updating for changed text */
+ bool nochange, // not updating for changed text
+ bool number_only // only update the number column
)
{
- int col; /* visual column on screen */
- unsigned off; /* offset in ScreenLines/ScreenAttrs */
- int c = 0; /* init for GCC */
- long vcol = 0; /* virtual column (for tabs) */
+ int c = 0; // init for GCC
+ long vcol = 0; // virtual column (for tabs)
long vcol_sbr = -1; // virtual column after showbreak
- long vcol_prev = -1; /* "vcol" of previous character */
- char_u *line; /* current line */
- char_u *ptr; /* current position in "line" */
- int row; /* row in the window, excl w_winrow */
- int screen_row; /* row on the screen, incl w_winrow */
+ long vcol_prev = -1; // "vcol" of previous character
+ char_u *line; // current line
+ char_u *ptr; // current position in "line"
+ int row; // row in the window, excl w_winrow
+ ScreenGrid *grid = &wp->w_grid; // grid specfic to the window
char_u extra[18]; /* line number and 'fdc' must fit in here */
int n_extra = 0; /* number of extra chars */
@@ -2124,11 +2075,11 @@ win_line (
int n_skip = 0; /* nr of chars to skip for 'nowrap' */
- int fromcol, tocol; /* start/end of inverting */
- int fromcol_prev = -2; /* start of inverting after cursor */
- int noinvcur = FALSE; /* don't invert the cursor */
- pos_T *top, *bot;
- int lnum_in_visual_area = FALSE;
+ int fromcol = 0, tocol = 0; // start/end of inverting
+ int fromcol_prev = -2; // start of inverting after cursor
+ int noinvcur = false; // don't invert the cursor
+ pos_T *top, *bot;
+ int lnum_in_visual_area = false;
pos_T pos;
long v;
@@ -2143,10 +2094,10 @@ win_line (
int syntax_attr = 0; /* attributes desired by syntax */
int has_syntax = FALSE; /* this buffer has syntax highl. */
int save_did_emsg;
- int eol_hl_off = 0; /* 1 if highlighted char after EOL */
- int draw_color_col = FALSE; /* highlight colorcolumn */
- int *color_cols = NULL; /* pointer to according columns array */
- bool has_spell = false; /* this buffer has spell checking */
+ int eol_hl_off = 0; // 1 if highlighted char after EOL
+ int draw_color_col = false; // highlight colorcolumn
+ int *color_cols = NULL; // pointer to according columns array
+ bool has_spell = false; // this buffer has spell checking
# define SPWORDLEN 150
char_u nextline[SPWORDLEN * 2]; /* text with start of the next line */
int nextlinecol = 0; /* column where nextline[] starts */
@@ -2157,37 +2108,38 @@ win_line (
static linenr_T checked_lnum = 0; /* line number for "checked_col" */
static int checked_col = 0; /* column in "checked_lnum" up to which
* there are no spell errors */
- static int cap_col = -1; /* column to check for Cap word */
- static linenr_T capcol_lnum = 0; /* line number where "cap_col" used */
- int cur_checked_col = 0; /* checked column for current line */
- int extra_check; /* has syntax or linebreak */
- int multi_attr = 0; /* attributes desired by multibyte */
- int mb_l = 1; /* multi-byte byte length */
- int mb_c = 0; /* decoded multi-byte character */
- int mb_utf8 = FALSE; /* screen char is UTF-8 char */
- int u8cc[MAX_MCO]; /* composing UTF-8 chars */
- int filler_lines; /* nr of filler lines to be drawn */
- int filler_todo; /* nr of filler lines still to do + 1 */
- hlf_T diff_hlf = (hlf_T)0; /* type of diff highlighting */
- int change_start = MAXCOL; /* first col of changed area */
- int change_end = -1; /* last col of changed area */
- colnr_T trailcol = MAXCOL; /* start of trailing spaces */
- int need_showbreak = FALSE;
- int line_attr = 0; /* attribute for the whole line */
- matchitem_T *cur; /* points to the match list */
- match_T *shl; /* points to search_hl or a match */
- int shl_flag; /* flag to indicate whether search_hl
- has been processed or not */
- int prevcol_hl_flag; /* flag to indicate whether prevcol
- equals startcol of search_hl or one
- of the matches */
- int prev_c = 0; /* previous Arabic character */
- int prev_c1 = 0; /* first composing char for prev_c */
- int did_line_attr = 0;
-
- bool has_bufhl = false; // this buffer has highlight matches
- int bufhl_attr = 0; // attributes desired by bufhl
- bufhl_lineinfo_T bufhl_info; // bufhl data for this line
+ static int cap_col = -1; // column to check for Cap word
+ static linenr_T capcol_lnum = 0; // line number where "cap_col"
+ int cur_checked_col = 0; // checked column for current line
+ int extra_check = 0; // has syntax or linebreak
+ int multi_attr = 0; // attributes desired by multibyte
+ int mb_l = 1; // multi-byte byte length
+ int mb_c = 0; // decoded multi-byte character
+ bool mb_utf8 = false; // screen char is UTF-8 char
+ int u8cc[MAX_MCO]; // composing UTF-8 chars
+ int filler_lines; // nr of filler lines to be drawn
+ int filler_todo; // nr of filler lines still to do + 1
+ hlf_T diff_hlf = (hlf_T)0; // type of diff highlighting
+ int change_start = MAXCOL; // first col of changed area
+ int change_end = -1; // last col of changed area
+ colnr_T trailcol = MAXCOL; // start of trailing spaces
+ int need_showbreak = false; // overlong line, skip first x chars
+ int line_attr = 0; // attribute for the whole line
+ int line_attr_lowprio = 0; // low-priority attribute for the line
+ matchitem_T *cur; // points to the match list
+ match_T *shl; // points to search_hl or a match
+ int shl_flag; // flag to indicate whether search_hl
+ // has been processed or not
+ bool prevcol_hl_flag; // flag to indicate whether prevcol
+ // equals startcol of search_hl or one
+ // of the matches
+ int prev_c = 0; // previous Arabic character
+ int prev_c1 = 0; // first composing char for prev_c
+
+ bool search_attr_from_match = false; // if search_attr is from :match
+ BufhlLineInfo bufhl_info; // bufhl data for this line
+ bool has_bufhl = false; // this buffer has highlight matches
+ bool do_virttext = false; // draw virtual text for this line
/* draw_state: items that are drawn in sequence: */
#define WL_START 0 /* nothing done yet */
@@ -2203,14 +2155,14 @@ win_line (
int syntax_flags = 0;
int syntax_seqnr = 0;
int prev_syntax_id = 0;
- int conceal_attr = hl_attr(HLF_CONCEAL);
+ int conceal_attr = win_hl_attr(wp, HLF_CONCEAL);
int is_concealing = false;
int boguscols = 0; ///< nonexistent columns added to
///< force wrapping
int vcol_off = 0; ///< offset for concealed characters
int did_wcol = false;
- int match_conc = false; ///< cchar for match functions
- int has_match_conc = false; ///< match wants to conceal
+ int match_conc = 0; ///< cchar for match functions
+ int has_match_conc = 0; ///< match wants to conceal
int old_boguscols = 0;
# define VCOL_HLC (vcol - vcol_off)
# define FIX_FOR_BOGUSCOLS \
@@ -2227,158 +2179,167 @@ win_line (
return startrow;
row = startrow;
- screen_row = row + wp->w_winrow;
- /*
- * To speed up the loop below, set extra_check when there is linebreak,
- * trailing white space and/or syntax processing to be done.
- */
- extra_check = wp->w_p_lbr;
- if (syntax_present(wp) && !wp->w_s->b_syn_error) {
- /* Prepare for syntax highlighting in this line. When there is an
- * error, stop syntax highlighting. */
- save_did_emsg = did_emsg;
- did_emsg = FALSE;
- syntax_start(wp, lnum);
- if (did_emsg)
- wp->w_s->b_syn_error = TRUE;
- else {
- did_emsg = save_did_emsg;
- has_syntax = TRUE;
- extra_check = TRUE;
- }
- }
-
- if (bufhl_start_line(wp->w_buffer, lnum, &bufhl_info)) {
- has_bufhl = true;
- extra_check = true;
- }
+ if (!number_only) {
+ // To speed up the loop below, set extra_check when there is linebreak,
+ // trailing white space and/or syntax processing to be done.
+ extra_check = wp->w_p_lbr;
+ if (syntax_present(wp) && !wp->w_s->b_syn_error) {
+ // Prepare for syntax highlighting in this line. When there is an
+ // error, stop syntax highlighting.
+ save_did_emsg = did_emsg;
+ did_emsg = false;
+ syntax_start(wp, lnum);
+ if (did_emsg) {
+ wp->w_s->b_syn_error = true;
+ } else {
+ did_emsg = save_did_emsg;
+ has_syntax = true;
+ extra_check = true;
+ }
+ }
- /* Check for columns to display for 'colorcolumn'. */
- color_cols = wp->w_buffer->terminal ? NULL : wp->w_p_cc_cols;
- if (color_cols != NULL)
- draw_color_col = advance_color_col(VCOL_HLC, &color_cols);
-
- if (wp->w_p_spell
- && *wp->w_s->b_p_spl != NUL
- && !GA_EMPTY(&wp->w_s->b_langp)
- && *(char **)(wp->w_s->b_langp.ga_data) != NULL) {
- /* Prepare for spell checking. */
- has_spell = true;
- extra_check = TRUE;
-
- /* Get the start of the next line, so that words that wrap to the next
- * line are found too: "et<line-break>al.".
- * Trick: skip a few chars for C/shell/Vim comments */
- nextline[SPWORDLEN] = NUL;
- if (lnum < wp->w_buffer->b_ml.ml_line_count) {
- line = ml_get_buf(wp->w_buffer, lnum + 1, FALSE);
- spell_cat_line(nextline + SPWORDLEN, line, SPWORDLEN);
- }
-
- /* When a word wrapped from the previous line the start of the current
- * line is valid. */
- if (lnum == checked_lnum)
- cur_checked_col = checked_col;
- checked_lnum = 0;
-
- /* When there was a sentence end in the previous line may require a
- * word starting with capital in this line. In line 1 always check
- * the first word. */
- if (lnum != capcol_lnum)
- cap_col = -1;
- if (lnum == 1)
- cap_col = 0;
- capcol_lnum = 0;
- }
+ if (bufhl_start_line(wp->w_buffer, lnum, &bufhl_info)) {
+ if (kv_size(bufhl_info.line->items)) {
+ has_bufhl = true;
+ extra_check = true;
+ }
+ if (kv_size(bufhl_info.line->virt_text)) {
+ do_virttext = true;
+ }
+ }
- /*
- * handle visual active in this window
- */
- fromcol = -10;
- tocol = MAXCOL;
- if (VIsual_active && wp->w_buffer == curwin->w_buffer) {
- /* Visual is after curwin->w_cursor */
- if (ltoreq(curwin->w_cursor, VIsual)) {
- top = &curwin->w_cursor;
- bot = &VIsual;
- } else { /* Visual is before curwin->w_cursor */
- top = &VIsual;
- bot = &curwin->w_cursor;
+ // Check for columns to display for 'colorcolumn'.
+ color_cols = wp->w_buffer->terminal ? NULL : wp->w_p_cc_cols;
+ if (color_cols != NULL) {
+ draw_color_col = advance_color_col(VCOL_HLC, &color_cols);
}
- lnum_in_visual_area = (lnum >= top->lnum && lnum <= bot->lnum);
- if (VIsual_mode == Ctrl_V) { /* block mode */
- if (lnum_in_visual_area) {
- fromcol = wp->w_old_cursor_fcol;
- tocol = wp->w_old_cursor_lcol;
+
+ if (wp->w_p_spell
+ && *wp->w_s->b_p_spl != NUL
+ && !GA_EMPTY(&wp->w_s->b_langp)
+ && *(char **)(wp->w_s->b_langp.ga_data) != NULL) {
+ // Prepare for spell checking.
+ has_spell = true;
+ extra_check = true;
+
+ // Get the start of the next line, so that words that wrap to the next
+ // line are found too: "et<line-break>al.".
+ // Trick: skip a few chars for C/shell/Vim comments
+ nextline[SPWORDLEN] = NUL;
+ if (lnum < wp->w_buffer->b_ml.ml_line_count) {
+ line = ml_get_buf(wp->w_buffer, lnum + 1, false);
+ spell_cat_line(nextline + SPWORDLEN, line, SPWORDLEN);
}
- } else { /* non-block mode */
- if (lnum > top->lnum && lnum <= bot->lnum)
- fromcol = 0;
- else if (lnum == top->lnum) {
- if (VIsual_mode == 'V') /* linewise */
+
+ // When a word wrapped from the previous line the start of the current
+ // line is valid.
+ if (lnum == checked_lnum) {
+ cur_checked_col = checked_col;
+ }
+ checked_lnum = 0;
+
+ // When there was a sentence end in the previous line may require a
+ // word starting with capital in this line. In line 1 always check
+ // the first word.
+ if (lnum != capcol_lnum) {
+ cap_col = -1;
+ }
+ if (lnum == 1) {
+ cap_col = 0;
+ }
+ capcol_lnum = 0;
+ }
+
+ //
+ // handle visual active in this window
+ //
+ fromcol = -10;
+ tocol = MAXCOL;
+ if (VIsual_active && wp->w_buffer == curwin->w_buffer) {
+ // Visual is after curwin->w_cursor
+ if (ltoreq(curwin->w_cursor, VIsual)) {
+ top = &curwin->w_cursor;
+ bot = &VIsual;
+ } else { // Visual is before curwin->w_cursor
+ top = &VIsual;
+ bot = &curwin->w_cursor;
+ }
+ lnum_in_visual_area = (lnum >= top->lnum && lnum <= bot->lnum);
+ if (VIsual_mode == Ctrl_V) { // block mode
+ if (lnum_in_visual_area) {
+ fromcol = wp->w_old_cursor_fcol;
+ tocol = wp->w_old_cursor_lcol;
+ }
+ } else { // non-block mode
+ if (lnum > top->lnum && lnum <= bot->lnum) {
fromcol = 0;
- else {
- getvvcol(wp, top, (colnr_T *)&fromcol, NULL, NULL);
- if (gchar_pos(top) == NUL)
- tocol = fromcol + 1;
+ } else if (lnum == top->lnum) {
+ if (VIsual_mode == 'V') { // linewise
+ fromcol = 0;
+ } else {
+ getvvcol(wp, top, (colnr_T *)&fromcol, NULL, NULL);
+ if (gchar_pos(top) == NUL) {
+ tocol = fromcol + 1;
+ }
+ }
}
- }
- if (VIsual_mode != 'V' && lnum == bot->lnum) {
- if (*p_sel == 'e' && bot->col == 0
- && bot->coladd == 0
- ) {
- fromcol = -10;
- tocol = MAXCOL;
- } else if (bot->col == MAXCOL)
- tocol = MAXCOL;
- else {
- pos = *bot;
- if (*p_sel == 'e')
- getvvcol(wp, &pos, (colnr_T *)&tocol, NULL, NULL);
- else {
- getvvcol(wp, &pos, NULL, NULL, (colnr_T *)&tocol);
- ++tocol;
+ if (VIsual_mode != 'V' && lnum == bot->lnum) {
+ if (*p_sel == 'e' && bot->col == 0
+ && bot->coladd == 0) {
+ fromcol = -10;
+ tocol = MAXCOL;
+ } else if (bot->col == MAXCOL) {
+ tocol = MAXCOL;
+ } else {
+ pos = *bot;
+ if (*p_sel == 'e') {
+ getvvcol(wp, &pos, (colnr_T *)&tocol, NULL, NULL);
+ } else {
+ getvvcol(wp, &pos, NULL, NULL, (colnr_T *)&tocol);
+ tocol++;
+ }
}
}
}
- }
- /* Check if the character under the cursor should not be inverted */
- if (!highlight_match && lnum == curwin->w_cursor.lnum && wp == curwin
- )
- noinvcur = TRUE;
+ // Check if the char under the cursor should be inverted (highlighted).
+ if (!highlight_match && lnum == curwin->w_cursor.lnum && wp == curwin
+ && cursor_is_block_during_visual(*p_sel == 'e')) {
+ noinvcur = true;
+ }
- /* if inverting in this line set area_highlighting */
- if (fromcol >= 0) {
- area_highlighting = TRUE;
- attr = hl_attr(HLF_V);
+ // if inverting in this line set area_highlighting
+ if (fromcol >= 0) {
+ area_highlighting = true;
+ attr = win_hl_attr(wp, HLF_V);
+ }
+ // handle 'incsearch' and ":s///c" highlighting
+ } else if (highlight_match
+ && wp == curwin
+ && lnum >= curwin->w_cursor.lnum
+ && lnum <= curwin->w_cursor.lnum + search_match_lines) {
+ if (lnum == curwin->w_cursor.lnum) {
+ getvcol(curwin, &(curwin->w_cursor),
+ (colnr_T *)&fromcol, NULL, NULL);
+ } else {
+ fromcol = 0;
+ }
+ if (lnum == curwin->w_cursor.lnum + search_match_lines) {
+ pos.lnum = lnum;
+ pos.col = search_match_endcol;
+ getvcol(curwin, &pos, (colnr_T *)&tocol, NULL, NULL);
+ } else {
+ tocol = MAXCOL;
+ }
+ // do at least one character; happens when past end of line
+ if (fromcol == tocol) {
+ tocol = fromcol + 1;
+ }
+ area_highlighting = true;
+ attr = win_hl_attr(wp, HLF_I);
}
}
- /*
- * handle 'incsearch' and ":s///c" highlighting
- */
- else if (highlight_match
- && wp == curwin
- && lnum >= curwin->w_cursor.lnum
- && lnum <= curwin->w_cursor.lnum + search_match_lines) {
- if (lnum == curwin->w_cursor.lnum)
- getvcol(curwin, &(curwin->w_cursor),
- (colnr_T *)&fromcol, NULL, NULL);
- else
- fromcol = 0;
- if (lnum == curwin->w_cursor.lnum + search_match_lines) {
- pos.lnum = lnum;
- pos.col = search_match_endcol;
- getvcol(curwin, &pos, (colnr_T *)&tocol, NULL, NULL);
- } else
- tocol = MAXCOL;
- /* do at least one character; happens when past end of line */
- if (fromcol == tocol)
- tocol = fromcol + 1;
- area_highlighting = TRUE;
- attr = hl_attr(HLF_I);
- }
filler_lines = diff_check(wp, lnum);
if (filler_lines < 0) {
@@ -2398,24 +2359,52 @@ win_line (
filler_lines = wp->w_topfill;
filler_todo = filler_lines;
- /* If this line has a sign with line highlighting set line_attr. */
+ // Cursor line highlighting for 'cursorline' in the current window. Not
+ // when Visual mode is active, because it's not clear what is selected
+ // then.
+ if (wp->w_p_cul && lnum == wp->w_cursor.lnum
+ && !(wp == curwin && VIsual_active)) {
+ int cul_attr = win_hl_attr(wp, HLF_CUL);
+ HlAttrs ae = syn_attr2entry(cul_attr);
+
+ // We make a compromise here (#7383):
+ // * low-priority CursorLine if fg is not set
+ // * high-priority ("same as Vim" priority) CursorLine if fg is set
+ if (ae.rgb_fg_color == -1 && ae.cterm_fg_color == 0) {
+ line_attr_lowprio = cul_attr;
+ } else {
+ if (!(State & INSERT) && bt_quickfix(wp->w_buffer)
+ && qf_current_entry(wp) == lnum) {
+ line_attr = hl_combine_attr(cul_attr, line_attr);
+ } else {
+ line_attr = cul_attr;
+ }
+ }
+ }
+
+ // If this line has a sign with line highlighting set line_attr.
v = buf_getsigntype(wp->w_buffer, lnum, SIGN_LINEHL);
- if (v != 0)
- line_attr = sign_get_attr((int)v, TRUE);
+ if (v != 0) {
+ line_attr = sign_get_attr((int)v, SIGN_LINEHL);
+ }
- /* Highlight the current line in the quickfix window. */
- if (bt_quickfix(wp->w_buffer) && qf_current_entry(wp) == lnum)
- line_attr = hl_attr(HLF_L);
- if (line_attr != 0)
- area_highlighting = TRUE;
+ // Highlight the current line in the quickfix window.
+ if (bt_quickfix(wp->w_buffer) && qf_current_entry(wp) == lnum) {
+ line_attr = win_hl_attr(wp, HLF_QFL);
+ }
+
+ if (line_attr_lowprio || line_attr) {
+ area_highlighting = true;
+ }
line = ml_get_buf(wp->w_buffer, lnum, FALSE);
ptr = line;
- if (has_spell) {
- /* For checking first word with a capital skip white space. */
- if (cap_col == 0)
- cap_col = (int)(skipwhite(line) - line);
+ if (has_spell && !number_only) {
+ // For checking first word with a capital skip white space.
+ if (cap_col == 0) {
+ cap_col = (int)getwhitecols(line);
+ }
/* To be able to spell-check over line boundaries copy the end of the
* current line into nextline[]. Above the start of the next line was
@@ -2436,7 +2425,7 @@ win_line (
} else {
/* Long line, use only the last SPWORDLEN bytes. */
nextlinecol = v - SPWORDLEN;
- memmove(nextline, line + nextlinecol, SPWORDLEN);
+ memmove(nextline, line + nextlinecol, SPWORDLEN); // -V512
nextline_idx = SPWORDLEN + 1;
}
}
@@ -2464,13 +2453,13 @@ win_line (
v = wp->w_skipcol;
else
v = wp->w_leftcol;
- if (v > 0) {
+ if (v > 0 && !number_only) {
char_u *prev_ptr = ptr;
while (vcol < v && *ptr != NUL) {
c = win_lbr_chartabsize(wp, line, ptr, (colnr_T)vcol, NULL);
vcol += c;
prev_ptr = ptr;
- mb_ptr_adv(ptr);
+ MB_PTR_ADV(ptr);
}
// When:
@@ -2491,7 +2480,11 @@ win_line (
if (vcol > v) {
vcol -= c;
ptr = prev_ptr;
- n_skip = v - vcol;
+ // If the character fits on the screen, don't need to skip it.
+ // Except for a TAB.
+ if (utf_ptr2cells(ptr) >= c || *ptr == TAB) {
+ n_skip = v - vcol;
+ }
}
/*
@@ -2568,21 +2561,24 @@ win_line (
* Do this for both search_hl and the match list.
*/
cur = wp->w_match_head;
- shl_flag = FALSE;
- while (cur != NULL || shl_flag == FALSE) {
- if (shl_flag == FALSE) {
+ shl_flag = false;
+ while ((cur != NULL || !shl_flag) && !number_only) {
+ if (!shl_flag) {
shl = &search_hl;
- shl_flag = TRUE;
- } else
- shl = &cur->hl;
+ shl_flag = true;
+ } else {
+ shl = &cur->hl; // -V595
+ }
shl->startcol = MAXCOL;
shl->endcol = MAXCOL;
shl->attr_cur = 0;
+ shl->is_addpos = false;
v = (long)(ptr - line);
if (cur != NULL) {
cur->pos.cur = 0;
}
- next_search_hl(wp, shl, lnum, (colnr_T)v, cur);
+ next_search_hl(wp, shl, lnum, (colnr_T)v,
+ shl == &search_hl ? NULL : cur);
// Need to get the line again, a multi-line regexp may have made it
// invalid.
@@ -2612,6 +2608,7 @@ win_line (
if ((long)shl->startcol < v) { // match at leftcol
shl->attr_cur = shl->attr;
search_attr = shl->attr;
+ search_attr_from_match = shl != &search_hl;
}
area_highlighting = true;
}
@@ -2619,22 +2616,13 @@ win_line (
cur = cur->next;
}
- /* Cursor line highlighting for 'cursorline' in the current window. Not
- * when Visual mode is active, because it's not clear what is selected
- * then. */
- if (wp->w_p_cul && lnum == wp->w_cursor.lnum
- && !(wp == curwin && VIsual_active)) {
- line_attr = hl_attr(HLF_CUL);
- area_highlighting = true;
- }
-
- off = (unsigned)(current_ScreenLine - ScreenLines);
- col = 0;
+ unsigned off = 0; // Offset relative start of line
+ int col = 0; // Visual column on screen.
if (wp->w_p_rl) {
- /* Rightleft window: process the text in the normal direction, but put
- * it in current_ScreenLine[] from right to left. Start at the
- * rightmost column of the window. */
- col = wp->w_width - 1;
+ // Rightleft window: process the text in the normal direction, but put
+ // it in linebuf_char[off] from right to left. Start at the
+ // rightmost column of the window.
+ col = grid->Columns - 1;
off += col;
}
@@ -2647,7 +2635,7 @@ win_line (
// Repeat for the whole displayed line.
for (;; ) {
- has_match_conc = false;
+ has_match_conc = 0;
// Skip this quickly when working on the text.
if (draw_state != WL_LINE) {
if (draw_state == WL_CMDLINE - 1 && n_extra == 0) {
@@ -2656,7 +2644,7 @@ win_line (
/* Draw the cmdline character. */
n_extra = 1;
c_extra = cmdwin_type;
- char_attr = hl_attr(HLF_AT);
+ char_attr = win_hl_attr(wp, HLF_AT);
}
}
@@ -2665,13 +2653,16 @@ win_line (
draw_state = WL_FOLD;
if (fdc > 0) {
- // Draw the 'foldcolumn'.
- fill_foldcolumn(extra, wp, false, lnum);
+ // Draw the 'foldcolumn'. Allocate a buffer, "extra" may
+ // already be in use.
+ xfree(p_extra_free);
+ p_extra_free = xmalloc(12 + 1);
+ fill_foldcolumn(p_extra_free, wp, false, lnum);
n_extra = fdc;
- p_extra = extra;
- p_extra[n_extra] = NUL;
+ p_extra_free[n_extra] = NUL;
+ p_extra = p_extra_free;
c_extra = NUL;
- char_attr = hl_attr(HLF_FC);
+ char_attr = win_hl_attr(wp, HLF_FC);
}
}
@@ -2680,22 +2671,29 @@ win_line (
draw_state = WL_SIGN;
/* Show the sign column when there are any signs in this
* buffer or when using Netbeans. */
- if (draw_signcolumn(wp)) {
+ if (signcolumn_on(wp)) {
int text_sign;
- /* Draw two cells with the sign value or blank. */
+ // Draw cells with the sign value or blank.
c_extra = ' ';
- char_attr = hl_attr(HLF_SC);
- n_extra = 2;
+ char_attr = win_hl_attr(wp, HLF_SC);
+ n_extra = win_signcol_width(wp);
if (row == startrow + filler_lines && filler_todo <= 0) {
text_sign = buf_getsigntype(wp->w_buffer, lnum, SIGN_TEXT);
if (text_sign != 0) {
p_extra = sign_get_text(text_sign);
+ int symbol_blen = (int)STRLEN(p_extra);
if (p_extra != NULL) {
c_extra = NUL;
- n_extra = (int)STRLEN(p_extra);
+ // symbol(s) bytes + (filling spaces) (one byte each)
+ n_extra = symbol_blen +
+ (win_signcol_width(wp) - mb_string2cells(p_extra));
+ memset(extra, ' ', sizeof(extra));
+ STRNCPY(extra, p_extra, STRLEN(p_extra));
+ p_extra = extra;
+ p_extra[n_extra] = NUL;
}
- char_attr = sign_get_attr(text_sign, FALSE);
+ char_attr = sign_get_attr(text_sign, SIGN_TEXT);
}
}
}
@@ -2741,14 +2739,20 @@ win_line (
} else
c_extra = ' ';
n_extra = number_width(wp) + 1;
- char_attr = hl_attr(HLF_N);
- /* When 'cursorline' is set highlight the line number of
- * the current line differently.
- * TODO: Can we use CursorLine instead of CursorLineNr
- * when CursorLineNr isn't set? */
- if ((wp->w_p_cul || wp->w_p_rnu)
- && lnum == wp->w_cursor.lnum)
- char_attr = hl_attr(HLF_CLN);
+ char_attr = win_hl_attr(wp, HLF_N);
+
+ int num_sign = buf_getsigntype(wp->w_buffer, lnum, SIGN_NUMHL);
+ if (num_sign != 0) {
+ // :sign defined with "numhl" highlight.
+ char_attr = sign_get_attr(num_sign, SIGN_NUMHL);
+ } else if ((wp->w_p_cul || wp->w_p_rnu)
+ && lnum == wp->w_cursor.lnum) {
+ // When 'cursorline' is set highlight the line number of
+ // the current line differently.
+ // TODO(vim): Can we use CursorLine instead of CursorLineNr
+ // when CursorLineNr isn't set?
+ char_attr = win_hl_attr(wp, HLF_CLN);
+ }
}
}
@@ -2761,16 +2765,18 @@ win_line (
draw_state = WL_BRI - 1;
}
- // draw 'breakindent': indent wrapped text accodringly
+ // draw 'breakindent': indent wrapped text accordingly
if (draw_state == WL_BRI - 1 && n_extra == 0) {
draw_state = WL_BRI;
- if (wp->w_p_bri && n_extra == 0 && row != startrow && filler_lines == 0) {
- char_attr = 0; // was: hl_attr(HLF_AT);
+ // if need_showbreak is set, breakindent also applies
+ if (wp->w_p_bri && (row != startrow || need_showbreak)
+ && filler_lines == 0) {
+ char_attr = 0;
if (diff_hlf != (hlf_T)0) {
- char_attr = hl_attr(diff_hlf);
+ char_attr = win_hl_attr(wp, diff_hlf);
if (wp->w_p_cul && lnum == wp->w_cursor.lnum) {
- char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUL));
+ char_attr = hl_combine_attr(char_attr, win_hl_attr(wp, HLF_CUL));
}
}
p_extra = NULL;
@@ -2791,19 +2797,20 @@ win_line (
c_extra = '-';
else
c_extra = fill_diff;
- if (wp->w_p_rl)
+ if (wp->w_p_rl) {
n_extra = col + 1;
- else
- n_extra = wp->w_width - col;
- char_attr = hl_attr(HLF_DED);
+ } else {
+ n_extra = grid->Columns - col;
+ }
+ char_attr = win_hl_attr(wp, HLF_DED);
}
if (*p_sbr != NUL && need_showbreak) {
/* Draw 'showbreak' at the start of each broken line. */
p_extra = p_sbr;
c_extra = NUL;
n_extra = (int)STRLEN(p_sbr);
- char_attr = hl_attr(HLF_AT);
- need_showbreak = FALSE;
+ char_attr = win_hl_attr(wp, HLF_AT);
+ need_showbreak = false;
vcol_sbr = vcol + MB_CHARLEN(p_sbr);
/* Correct end of highlighted area for 'showbreak',
* required when 'linebreak' is also set. */
@@ -2811,7 +2818,7 @@ win_line (
tocol += n_extra;
/* combine 'showbreak' with 'cursorline' */
if (wp->w_p_cul && lnum == wp->w_cursor.lnum) {
- char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUL));
+ char_attr = hl_combine_attr(char_attr, win_hl_attr(wp, HLF_CUL));
}
}
}
@@ -2824,39 +2831,43 @@ win_line (
c_extra = saved_c_extra;
p_extra = saved_p_extra;
char_attr = saved_char_attr;
- } else
+ } else {
char_attr = 0;
+ }
}
}
- /* When still displaying '$' of change command, stop at cursor */
- if (dollar_vcol >= 0 && wp == curwin
- && lnum == wp->w_cursor.lnum && vcol >= (long)wp->w_virtcol
- && filler_todo <= 0
- ) {
- SCREEN_LINE(screen_row, wp->w_wincol, col, -wp->w_width, wp->w_p_rl);
- /* Pretend we have finished updating the window. Except when
- * 'cursorcolumn' is set. */
- if (wp->w_p_cuc)
+ // When still displaying '$' of change command, stop at cursor
+ if ((dollar_vcol >= 0 && wp == curwin
+ && lnum == wp->w_cursor.lnum && vcol >= (long)wp->w_virtcol
+ && filler_todo <= 0)
+ || (number_only && draw_state > WL_NR)) {
+ grid_put_linebuf(grid, row, 0, col, -grid->Columns, wp->w_p_rl, wp,
+ wp->w_hl_attr_normal, false);
+ // Pretend we have finished updating the window. Except when
+ // 'cursorcolumn' is set.
+ if (wp->w_p_cuc) {
row = wp->w_cline_row + wp->w_cline_height;
- else
- row = wp->w_height;
+ } else {
+ row = grid->Rows;
+ }
break;
}
- if (draw_state == WL_LINE && area_highlighting) {
- /* handle Visual or match highlighting in this line */
+ if (draw_state == WL_LINE && (area_highlighting || has_spell)) {
+ // handle Visual or match highlighting in this line
if (vcol == fromcol
- || (has_mbyte && vcol + 1 == fromcol && n_extra == 0
- && (*mb_ptr2cells)(ptr) > 1)
+ || (vcol + 1 == fromcol && n_extra == 0
+ && utf_ptr2cells(ptr) > 1)
|| ((int)vcol_prev == fromcol_prev
- && vcol_prev < vcol /* not at margin */
- && vcol < tocol))
- area_attr = attr; /* start highlighting */
- else if (area_attr != 0
- && (vcol == tocol
- || (noinvcur && (colnr_T)vcol == wp->w_virtcol)))
- area_attr = 0; /* stop highlighting */
+ && vcol_prev < vcol // not at margin
+ && vcol < tocol)) {
+ area_attr = attr; // start highlighting
+ } else if (area_attr != 0 && (vcol == tocol
+ || (noinvcur
+ && (colnr_T)vcol == wp->w_virtcol))) {
+ area_attr = 0; // stop highlighting
+ }
if (!n_extra) {
/*
@@ -2897,16 +2908,16 @@ win_line (
shl->attr_cur = shl->attr;
if (cur != NULL && syn_name2id((char_u *)"Conceal")
== cur->hlg_id) {
- has_match_conc = true;
+ has_match_conc = v == (long)shl->startcol ? 2 : 1;
match_conc = cur->conceal_char;
} else {
- has_match_conc = match_conc = false;
+ has_match_conc = match_conc = 0;
}
} else if (v == (long)shl->endcol) {
shl->attr_cur = 0;
- prev_syntax_id = 0;
- next_search_hl(wp, shl, lnum, (colnr_T)v, cur);
+ next_search_hl(wp, shl, lnum, (colnr_T)v,
+ shl == &search_hl ? NULL : cur);
pos_inprogress = !(cur == NULL || cur->pos.cur == 0);
/* Need to get the line again, a multi-line regexp
@@ -2944,6 +2955,7 @@ win_line (
/* Use attributes from match with highest priority among
* 'search_hl' and the match list. */
+ search_attr_from_match = false;
search_attr = search_hl.attr_cur;
cur = wp->w_match_head;
shl_flag = FALSE;
@@ -2956,23 +2968,37 @@ win_line (
shl_flag = TRUE;
} else
shl = &cur->hl;
- if (shl->attr_cur != 0)
+ if (shl->attr_cur != 0) {
search_attr = shl->attr_cur;
+ search_attr_from_match = shl != &search_hl;
+ }
if (shl != &search_hl && cur != NULL)
cur = cur->next;
}
+ // Only highlight one character after the last column.
+ if (*ptr == NUL
+ && (wp->w_p_list && lcs_eol_one == -1)) {
+ search_attr = 0;
+ }
}
if (diff_hlf != (hlf_T)0) {
if (diff_hlf == HLF_CHD && ptr - line >= change_start
- && n_extra == 0)
- diff_hlf = HLF_TXD; /* changed text */
+ && n_extra == 0) {
+ diff_hlf = HLF_TXD; // changed text
+ }
if (diff_hlf == HLF_TXD && ptr - line > change_end
- && n_extra == 0)
- diff_hlf = HLF_CHD; /* changed line */
- line_attr = hl_attr(diff_hlf);
+ && n_extra == 0) {
+ diff_hlf = HLF_CHD; // changed line
+ }
+ line_attr = win_hl_attr(wp, diff_hlf);
+ // Overlay CursorLine onto diff-mode highlight.
if (wp->w_p_cul && lnum == wp->w_cursor.lnum) {
- line_attr = hl_combine_attr(line_attr, hl_attr(HLF_CUL));
+ line_attr = 0 != line_attr_lowprio // Low-priority CursorLine
+ ? hl_combine_attr(hl_combine_attr(win_hl_attr(wp, HLF_CUL),
+ line_attr),
+ hl_get_underline())
+ : hl_combine_attr(line_attr, win_hl_attr(wp, HLF_CUL));
}
}
@@ -2988,14 +3014,15 @@ win_line (
// (area_attr may be 0 when "noinvcur" is set).
else if (line_attr != 0 && ((fromcol == -10 && tocol == MAXCOL)
|| vcol < fromcol || vcol_prev < fromcol_prev
- || vcol >= tocol))
+ || vcol >= tocol)) {
char_attr = line_attr;
- else {
- attr_pri = FALSE;
- if (has_syntax)
+ } else {
+ attr_pri = false;
+ if (has_syntax) {
char_attr = syntax_attr;
- else
+ } else {
char_attr = 0;
+ }
}
}
@@ -3013,55 +3040,49 @@ win_line (
if (n_extra > 0) {
if (c_extra != NUL) {
c = c_extra;
- mb_c = c; /* doesn't handle non-utf-8 multi-byte! */
- if (enc_utf8 && (*mb_char2len)(c) > 1) {
- mb_utf8 = TRUE;
+ mb_c = c; // doesn't handle non-utf-8 multi-byte!
+ if (enc_utf8 && utf_char2len(c) > 1) {
+ mb_utf8 = true;
u8cc[0] = 0;
c = 0xc0;
- } else
- mb_utf8 = FALSE;
+ } else {
+ mb_utf8 = false;
+ }
} else {
c = *p_extra;
if (has_mbyte) {
mb_c = c;
if (enc_utf8) {
- /* If the UTF-8 character is more than one byte:
- * Decode it into "mb_c". */
- mb_l = (*mb_ptr2len)(p_extra);
- mb_utf8 = FALSE;
- if (mb_l > n_extra)
+ // If the UTF-8 character is more than one byte:
+ // Decode it into "mb_c".
+ mb_l = utfc_ptr2len(p_extra);
+ mb_utf8 = false;
+ if (mb_l > n_extra) {
mb_l = 1;
- else if (mb_l > 1) {
+ } else if (mb_l > 1) {
mb_c = utfc_ptr2char(p_extra, u8cc);
- mb_utf8 = TRUE;
+ mb_utf8 = true;
c = 0xc0;
}
- } else {
- /* if this is a DBCS character, put it in "mb_c" */
- mb_l = MB_BYTE2LEN(c);
- if (mb_l >= n_extra)
- mb_l = 1;
- else if (mb_l > 1)
- mb_c = (c << 8) + p_extra[1];
}
if (mb_l == 0) /* at the NUL at end-of-line */
mb_l = 1;
/* If a double-width char doesn't fit display a '>' in the
* last column. */
- if ((
- wp->w_p_rl ? (col <= 0) :
- (col >= wp->w_width - 1))
+ if ((wp->w_p_rl ? (col <= 0) :
+ (col >= grid->Columns - 1))
&& (*mb_char2cells)(mb_c) == 2) {
c = '>';
mb_c = c;
mb_l = 1;
- mb_utf8 = FALSE;
- multi_attr = hl_attr(HLF_AT);
- /* put the pointer back to output the double-width
- * character at the start of the next line. */
- ++n_extra;
- --p_extra;
+ mb_utf8 = false;
+ multi_attr = win_hl_attr(wp, HLF_AT);
+
+ // put the pointer back to output the double-width
+ // character at the start of the next line.
+ n_extra++;
+ p_extra--;
} else {
n_extra -= mb_l - 1;
p_extra += mb_l - 1;
@@ -3071,36 +3092,39 @@ win_line (
}
--n_extra;
} else {
+ int c0;
+
if (p_extra_free != NULL) {
xfree(p_extra_free);
p_extra_free = NULL;
}
- /*
- * Get a character from the line itself.
- */
- c = *ptr;
+
+ // Get a character from the line itself.
+ c0 = c = *ptr;
if (has_mbyte) {
mb_c = c;
if (enc_utf8) {
- /* If the UTF-8 character is more than one byte: Decode it
- * into "mb_c". */
- mb_l = (*mb_ptr2len)(ptr);
- mb_utf8 = FALSE;
+ // If the UTF-8 character is more than one byte: Decode it
+ // into "mb_c".
+ mb_l = utfc_ptr2len(ptr);
+ mb_utf8 = false;
if (mb_l > 1) {
mb_c = utfc_ptr2char(ptr, u8cc);
- /* Overlong encoded ASCII or ASCII with composing char
- * is displayed normally, except a NUL. */
- if (mb_c < 0x80)
- c = mb_c;
- mb_utf8 = TRUE;
+ // Overlong encoded ASCII or ASCII with composing char
+ // is displayed normally, except a NUL.
+ if (mb_c < 0x80) {
+ c0 = c = mb_c;
+ }
+ mb_utf8 = true;
/* At start of the line we can have a composing char.
* Draw it as a space with a composing char. */
if (utf_iscomposing(mb_c)) {
int i;
- for (i = Screen_mco - 1; i > 0; --i)
+ for (i = MAX_MCO - 1; i > 0; i--) {
u8cc[i] = u8cc[i - 1];
+ }
u8cc[0] = mb_c;
mb_c = ' ';
}
@@ -3111,21 +3135,21 @@ win_line (
|| (mb_l > 1 && (!vim_isprintc(mb_c)))) {
// Illegal UTF-8 byte: display as <xx>.
// Non-BMP character : display as ? or fullwidth ?.
- transchar_hex(extra, mb_c);
- if (wp->w_p_rl) { // reverse
- rl_mirror(extra);
+ transchar_hex((char *)extra, mb_c);
+ if (wp->w_p_rl) { // reverse
+ rl_mirror(extra);
}
p_extra = extra;
c = *p_extra;
- mb_c = mb_ptr2char_adv(&p_extra);
+ mb_c = mb_ptr2char_adv((const char_u **)&p_extra);
mb_utf8 = (c >= 0x80);
n_extra = (int)STRLEN(p_extra);
c_extra = NUL;
if (area_attr == 0 && search_attr == 0) {
n_attr = n_extra + 1;
- extra_attr = hl_attr(HLF_8);
- saved_attr2 = char_attr; /* save current attr */
+ extra_attr = win_hl_attr(wp, HLF_8);
+ saved_attr2 = char_attr; // save current attr
}
} else if (mb_l == 0) /* at the NUL at end-of-line */
mb_l = 1;
@@ -3177,8 +3201,8 @@ win_line (
c = *p_extra++;
if (area_attr == 0 && search_attr == 0) {
n_attr = n_extra + 1;
- extra_attr = hl_attr(HLF_8);
- saved_attr2 = char_attr; /* save current attr */
+ extra_attr = win_hl_attr(wp, HLF_8);
+ saved_attr2 = char_attr; // save current attr
}
mb_c = c;
}
@@ -3187,20 +3211,20 @@ win_line (
/* If a double-width char doesn't fit display a '>' in the
* last column; the character is displayed at the start of the
* next line. */
- if ((
- wp->w_p_rl ? (col <= 0) :
- (col >= wp->w_width - 1))
+ if ((wp->w_p_rl ? (col <= 0) :
+ (col >= grid->Columns - 1))
&& (*mb_char2cells)(mb_c) == 2) {
c = '>';
mb_c = c;
- mb_utf8 = FALSE;
+ mb_utf8 = false;
mb_l = 1;
- multi_attr = hl_attr(HLF_AT);
- /* Put pointer back so that the character will be
- * displayed at the start of the next line. */
- --ptr;
- } else if (*ptr != NUL)
+ multi_attr = win_hl_attr(wp, HLF_AT);
+ // Put pointer back so that the character will be
+ // displayed at the start of the next line.
+ ptr--;
+ } else if (*ptr != NUL) {
ptr += mb_l - 1;
+ }
/* If a double-width char doesn't fit at the left side display
* a '<' in the first column. Don't do this for unprintable
@@ -3211,11 +3235,11 @@ win_line (
c = ' ';
if (area_attr == 0 && search_attr == 0) {
n_attr = n_extra + 1;
- extra_attr = hl_attr(HLF_AT);
- saved_attr2 = char_attr; /* save current attr */
+ extra_attr = win_hl_attr(wp, HLF_AT);
+ saved_attr2 = char_attr; // save current attr
}
mb_c = c;
- mb_utf8 = FALSE;
+ mb_utf8 = false;
mb_l = 1;
}
@@ -3235,8 +3259,7 @@ win_line (
did_emsg = FALSE;
syntax_attr = get_syntax_attr((colnr_T)v - 1,
- has_spell ? &can_spell :
- NULL, FALSE);
+ has_spell ? &can_spell : NULL, false);
if (did_emsg) {
wp->w_s->b_syn_error = TRUE;
@@ -3285,10 +3308,11 @@ win_line (
/* Use nextline[] if possible, it has the start of the
* next line concatenated. */
- if ((prev_ptr - line) - nextlinecol >= 0)
- p = nextline + (prev_ptr - line) - nextlinecol;
- else
+ if ((prev_ptr - line) - nextlinecol >= 0) {
+ p = nextline + ((prev_ptr - line) - nextlinecol);
+ } else {
p = prev_ptr;
+ }
cap_col -= (int)(prev_ptr - line);
size_t tmplen = spell_check(wp, p, &spell_hlf, &cap_col, nochange);
assert(tmplen <= INT_MAX);
@@ -3341,7 +3365,7 @@ win_line (
}
if (has_bufhl && v > 0) {
- bufhl_attr = bufhl_get_attr(&bufhl_info, (colnr_T)v);
+ int bufhl_attr = bufhl_get_attr(&bufhl_info, (colnr_T)v);
if (bufhl_attr != 0) {
if (!attr_pri) {
char_attr = hl_combine_attr(char_attr, bufhl_attr);
@@ -3355,15 +3379,14 @@ win_line (
char_attr = hl_combine_attr(char_attr, term_attrs[vcol]);
}
- /*
- * Found last space before word: check for line break.
- */
- if (wp->w_p_lbr && vim_isbreak(c) && !vim_isbreak(*ptr)) {
- int mb_off = has_mbyte ? (*mb_head_off)(line, ptr - 1) : 0;
+ // Found last space before word: check for line break.
+ if (wp->w_p_lbr && c0 == c && vim_isbreak(c)
+ && !vim_isbreak((int)(*ptr))) {
+ int mb_off = utf_head_off(line, ptr - 1);
char_u *p = ptr - (mb_off + 1);
// TODO: is passing p for start of the line OK?
n_extra = win_lbr_chartabsize(wp, line, p, (colnr_T)vcol, NULL) - 1;
- if (c == TAB && n_extra + col > wp->w_width) {
+ if (c == TAB && n_extra + col > grid->Columns) {
n_extra = (int)wp->w_buffer->b_p_ts
- vcol % (int)wp->w_buffer->b_p_ts - 1;
}
@@ -3386,10 +3409,10 @@ win_line (
|| (c == ' ' && lcs_space && ptr - line <= trailcol))) {
c = (c == ' ') ? lcs_space : lcs_nbsp;
n_attr = 1;
- extra_attr = hl_attr(HLF_8);
+ extra_attr = win_hl_attr(wp, HLF_0);
saved_attr2 = char_attr; // save current attr
mb_c = c;
- if (enc_utf8 && (*mb_char2len)(c) > 1) {
+ if (enc_utf8 && utf_char2len(c) > 1) {
mb_utf8 = true;
u8cc[0] = 0;
c = 0xc0;
@@ -3401,27 +3424,25 @@ win_line (
if (trailcol != MAXCOL && ptr > line + trailcol && c == ' ') {
c = lcs_trail;
n_attr = 1;
- extra_attr = hl_attr(HLF_8);
+ extra_attr = win_hl_attr(wp, HLF_0);
saved_attr2 = char_attr; // save current attr
mb_c = c;
- if (enc_utf8 && (*mb_char2len)(c) > 1) {
- mb_utf8 = TRUE;
+ if (enc_utf8 && utf_char2len(c) > 1) {
+ mb_utf8 = true;
u8cc[0] = 0;
c = 0xc0;
- } else
- mb_utf8 = FALSE;
+ } else {
+ mb_utf8 = false;
+ }
}
}
/*
* Handling of non-printable characters.
*/
- if (!(chartab[c & 0xff] & CT_PRINT_CHAR)) {
- /*
- * when getting a character from the file, we may have to
- * turn it into something else on the way to putting it
- * into "ScreenLines".
- */
+ if (!vim_isprintc(c)) {
+ // when getting a character from the file, we may have to
+ // turn it into something else on the way to putting it on the screen.
if (c == TAB && (!wp->w_p_list || lcs_tab1)) {
int tab_len = 0;
long vcol_adjusted = vcol; // removed showbreak length
@@ -3446,8 +3467,7 @@ win_line (
tab_len += vcol_off;
}
// boguscols before FIX_FOR_BOGUSCOLS macro from above.
- if (wp->w_p_list && lcs_tab1 && old_boguscols > 0
- && n_extra > tab_len) {
+ if (lcs_tab1 && old_boguscols > 0 && n_extra > tab_len) {
tab_len += n_extra - tab_len;
}
@@ -3461,9 +3481,10 @@ win_line (
p = xmalloc(len + 1);
memset(p, ' ', len);
p[len] = NUL;
+ xfree(p_extra_free);
p_extra_free = p;
for (i = 0; i < tab_len; i++) {
- mb_char2bytes(lcs_tab2, p);
+ utf_char2bytes(lcs_tab2, p);
p += mb_char2len(lcs_tab2);
n_extra += mb_char2len(lcs_tab2) - (saved_nextra > 0 ? 1: 0);
}
@@ -3495,7 +3516,7 @@ win_line (
}
}
- mb_utf8 = (int)false; // don't draw as UTF-8
+ mb_utf8 = false; // don't draw as UTF-8
if (wp->w_p_list) {
c = lcs_tab1;
if (wp->w_p_lbr) {
@@ -3504,11 +3525,11 @@ win_line (
c_extra = lcs_tab2;
}
n_attr = tab_len + 1;
- extra_attr = hl_attr(HLF_8);
- saved_attr2 = char_attr; /* save current attr */
+ extra_attr = win_hl_attr(wp, HLF_0);
+ saved_attr2 = char_attr; // save current attr
mb_c = c;
- if (enc_utf8 && (*mb_char2len)(c) > 1) {
- mb_utf8 = TRUE;
+ if (enc_utf8 && utf_char2len(c) > 1) {
+ mb_utf8 = true;
u8cc[0] = 0;
c = 0xc0;
}
@@ -3521,24 +3542,22 @@ win_line (
|| ((fromcol >= 0 || fromcol_prev >= 0)
&& tocol > vcol
&& VIsual_mode != Ctrl_V
- && (
- wp->w_p_rl ? (col >= 0) :
- (col < wp->w_width))
+ && (wp->w_p_rl ? (col >= 0) : (col < grid->Columns))
&& !(noinvcur
&& lnum == wp->w_cursor.lnum
&& (colnr_T)vcol == wp->w_virtcol)))
&& lcs_eol_one > 0) {
// Display a '$' after the line or highlight an extra
// character if the line break is included.
- // For a diff line the highlighting continues after the
- // "$".
- if (diff_hlf == (hlf_T)0 && line_attr == 0) {
- /* In virtualedit, visual selections may extend
- * beyond end of line. */
+ // For a diff line the highlighting continues after the "$".
+ if (diff_hlf == (hlf_T)0
+ && line_attr == 0
+ && line_attr_lowprio == 0) {
+ // In virtualedit, visual selections may extend beyond end of line
if (area_highlighting && virtual_active()
- && tocol != MAXCOL && vcol < tocol)
+ && tocol != MAXCOL && vcol < tocol) {
n_extra = 0;
- else {
+ } else {
p_extra = at_end_str;
n_extra = 1;
c_extra = NUL;
@@ -3551,15 +3570,16 @@ win_line (
}
lcs_eol_one = -1;
ptr--; // put it back at the NUL
- extra_attr = hl_attr(HLF_AT);
+ extra_attr = win_hl_attr(wp, HLF_AT);
n_attr = 1;
mb_c = c;
- if (enc_utf8 && (*mb_char2len)(c) > 1) {
- mb_utf8 = TRUE;
+ if (enc_utf8 && utf_char2len(c) > 1) {
+ mb_utf8 = true;
u8cc[0] = 0;
c = 0xc0;
- } else
- mb_utf8 = FALSE; /* don't draw as UTF-8 */
+ } else {
+ mb_utf8 = false; // don't draw as UTF-8
+ }
} else if (c != NUL) {
p_extra = transchar(c);
if (n_extra == 0) {
@@ -3576,61 +3596,35 @@ win_line (
memset(p, ' ', n_extra);
STRNCPY(p, p_extra + 1, STRLEN(p_extra) - 1);
p[n_extra] = NUL;
+ xfree(p_extra_free);
p_extra_free = p_extra = p;
} else {
n_extra = byte2cells(c) - 1;
c = *p_extra++;
}
n_attr = n_extra + 1;
- extra_attr = hl_attr(HLF_8);
+ extra_attr = win_hl_attr(wp, HLF_8);
saved_attr2 = char_attr; // save current attr
mb_utf8 = false; // don't draw as UTF-8
} else if (VIsual_active
- && (VIsual_mode == Ctrl_V
- || VIsual_mode == 'v')
+ && (VIsual_mode == Ctrl_V || VIsual_mode == 'v')
&& virtual_active()
&& tocol != MAXCOL
&& vcol < tocol
- && (
- wp->w_p_rl ? (col >= 0) :
- (col < wp->w_width))) {
+ && (wp->w_p_rl ? (col >= 0) : (col < grid->Columns))) {
c = ' ';
ptr--; // put it back at the NUL
- } else if ((diff_hlf != (hlf_T)0 || line_attr != 0)
- && (wp->w_p_rl
- ? (col >= 0)
- : (col - boguscols < wp->w_width))) {
- // Highlight until the right side of the window
- c = ' ';
- ptr--; // put it back at the NUL
-
- // Remember we do the char for line highlighting.
- did_line_attr++;
-
- // don't do search HL for the rest of the line
- if (line_attr != 0 && char_attr == search_attr && col > 0) {
- char_attr = line_attr;
- }
- if (diff_hlf == HLF_TXD) {
- diff_hlf = HLF_CHD;
- if (attr == 0 || char_attr != attr) {
- char_attr = hl_attr(diff_hlf);
- if (wp->w_p_cul && lnum == wp->w_cursor.lnum) {
- char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUL));
- }
- }
- }
}
}
if (wp->w_p_cole > 0
&& (wp != curwin || lnum != wp->w_cursor.lnum
|| conceal_cursor_line(wp))
- && ((syntax_flags & HL_CONCEAL) != 0 || has_match_conc)
+ && ((syntax_flags & HL_CONCEAL) != 0 || has_match_conc > 0)
&& !(lnum_in_visual_area
&& vim_strchr(wp->w_p_cocu, 'v') == NULL)) {
char_attr = conceal_attr;
- if (prev_syntax_id != syntax_seqnr
+ if ((prev_syntax_id != syntax_seqnr || has_match_conc > 1)
&& (syn_get_sub_char() != NUL || match_conc
|| wp->w_p_cole == 1)
&& wp->w_p_cole != 3) {
@@ -3667,12 +3661,13 @@ win_line (
n_skip = 1;
}
mb_c = c;
- if (enc_utf8 && (*mb_char2len)(c) > 1) {
- mb_utf8 = TRUE;
+ if (enc_utf8 && utf_char2len(c) > 1) {
+ mb_utf8 = true;
u8cc[0] = 0;
c = 0xc0;
- } else
- mb_utf8 = FALSE; /* don't draw as UTF-8 */
+ } else {
+ mb_utf8 = false; // don't draw as UTF-8
+ }
} else {
prev_syntax_id = 0;
is_concealing = FALSE;
@@ -3686,7 +3681,7 @@ win_line (
&& conceal_cursor_line(wp)
&& (int)wp->w_virtcol <= vcol + n_skip) {
if (wp->w_p_rl) {
- wp->w_wcol = wp->w_width - col + boguscols - 1;
+ wp->w_wcol = grid->Columns - col + boguscols - 1;
} else {
wp->w_wcol = col - boguscols;
}
@@ -3695,7 +3690,7 @@ win_line (
}
// Don't override visual selection highlighting.
- if (n_attr > 0 && draw_state == WL_LINE) {
+ if (n_attr > 0 && draw_state == WL_LINE && !search_attr_from_match) {
char_attr = hl_combine_attr(char_attr, extra_attr);
}
@@ -3718,43 +3713,43 @@ win_line (
c_extra = MB_FILLER_CHAR;
n_extra = 1;
n_attr = 2;
- extra_attr = hl_attr(HLF_AT);
+ extra_attr = win_hl_attr(wp, HLF_AT);
}
mb_c = c;
- if (enc_utf8 && (*mb_char2len)(c) > 1) {
- mb_utf8 = TRUE;
+ if (enc_utf8 && utf_char2len(c) > 1) {
+ mb_utf8 = true;
u8cc[0] = 0;
c = 0xc0;
} else {
mb_utf8 = false; // don't draw as UTF-8
}
saved_attr3 = char_attr; // save current attr
- char_attr = hl_attr(HLF_AT); // later copied to char_attr
+ char_attr = win_hl_attr(wp, HLF_AT); // overwriting char_attr
n_attr3 = 1;
}
/*
* At end of the text line or just after the last character.
*/
- if (c == NUL || did_line_attr == 1) {
+ if (c == NUL) {
long prevcol = (long)(ptr - line) - (c == NUL);
/* we're not really at that column when skipping some text */
if ((long)(wp->w_p_wrap ? wp->w_skipcol : wp->w_leftcol) > prevcol)
++prevcol;
- /* Invert at least one char, used for Visual and empty line or
- * highlight match at end of line. If it's beyond the last
- * char on the screen, just overwrite that one (tricky!) Not
- * needed when a '$' was displayed for 'list'. */
- prevcol_hl_flag = FALSE;
- if (prevcol == (long)search_hl.startcol)
- prevcol_hl_flag = TRUE;
- else {
+ // Invert at least one char, used for Visual and empty line or
+ // highlight match at end of line. If it's beyond the last
+ // char on the screen, just overwrite that one (tricky!) Not
+ // needed when a '$' was displayed for 'list'.
+ prevcol_hl_flag = false;
+ if (!search_hl.is_addpos && prevcol == (long)search_hl.startcol) {
+ prevcol_hl_flag = true;
+ } else {
cur = wp->w_match_head;
while (cur != NULL) {
- if (prevcol == (long)cur->hl.startcol) {
- prevcol_hl_flag = TRUE;
+ if (!cur->hl.is_addpos && prevcol == (long)cur->hl.startcol) {
+ prevcol_hl_flag = true;
break;
}
cur = cur->next;
@@ -3766,17 +3761,17 @@ win_line (
|| lnum == VIsual.lnum
|| lnum == curwin->w_cursor.lnum)
&& c == NUL)
- /* highlight 'hlsearch' match at end of line */
- || (prevcol_hl_flag == TRUE && did_line_attr <= 1)
- )) {
+ // highlight 'hlsearch' match at end of line
+ || prevcol_hl_flag)) {
int n = 0;
if (wp->w_p_rl) {
if (col < 0)
n = 1;
} else {
- if (col >= wp->w_width)
+ if (col >= grid->Columns) {
n = -1;
+ }
}
if (n != 0) {
/* At the window boundary, highlight the last character
@@ -3784,10 +3779,8 @@ win_line (
off += n;
col += n;
} else {
- /* Add a blank character to highlight. */
- ScreenLines[off] = ' ';
- if (enc_utf8)
- ScreenLinesUC[off] = 0;
+ // Add a blank character to highlight.
+ schar_from_ascii(linebuf_char[off], ' ');
}
if (area_attr == 0) {
/* Use attributes from match with highest priority among
@@ -3804,13 +3797,21 @@ win_line (
shl_flag = TRUE;
} else
shl = &cur->hl;
- if ((ptr - line) - 1 == (long)shl->startcol)
+ if ((ptr - line) - 1 == (long)shl->startcol
+ && (shl == &search_hl || !shl->is_addpos)) {
char_attr = shl->attr;
- if (shl != &search_hl && cur != NULL)
+ }
+ if (shl != &search_hl && cur != NULL) {
cur = cur->next;
+ }
}
}
- ScreenAttrs[off] = char_attr;
+
+ int eol_attr = char_attr;
+ if (wp->w_p_cul && lnum == wp->w_cursor.lnum) {
+ eol_attr = hl_combine_attr(win_hl_attr(wp, HLF_CUL), eol_attr);
+ }
+ linebuf_attr[off] = eol_attr;
if (wp->w_p_rl) {
--col;
--off;
@@ -3821,25 +3822,12 @@ win_line (
++vcol;
eol_hl_off = 1;
}
- }
-
- /*
- * At end of the text line.
- */
- if (c == NUL) {
- if (eol_hl_off > 0 && vcol - eol_hl_off == (long)wp->w_virtcol
- && lnum == wp->w_cursor.lnum) {
- /* highlight last char after line */
- --col;
- --off;
- --vcol;
- }
-
- /* Highlight 'cursorcolumn' & 'colorcolumn' past end of the line. */
- if (wp->w_p_wrap)
+ // Highlight 'cursorcolumn' & 'colorcolumn' past end of the line.
+ if (wp->w_p_wrap) {
v = wp->w_skipcol;
- else
+ } else {
v = wp->w_leftcol;
+ }
/* check if line ends before left margin */
if (vcol < v + col - win_col_off(wp))
@@ -3855,58 +3843,124 @@ win_line (
if (((wp->w_p_cuc
&& (int)wp->w_virtcol >= VCOL_HLC - eol_hl_off
&& (int)wp->w_virtcol <
- wp->w_width * (row - startrow + 1) + v
+ grid->Columns * (row - startrow + 1) + v
&& lnum != wp->w_cursor.lnum)
- || draw_color_col)
- && !wp->w_p_rl
- ) {
+ || draw_color_col || line_attr_lowprio || line_attr
+ || diff_hlf != (hlf_T)0 || do_virttext)) {
int rightmost_vcol = 0;
int i;
- if (wp->w_p_cuc)
+ VirtText virt_text = do_virttext ? bufhl_info.line->virt_text
+ : (VirtText)KV_INITIAL_VALUE;
+ size_t virt_pos = 0;
+ LineState s = LINE_STATE((char_u *)"");
+ int virt_attr = 0;
+
+ // Make sure alignment is the same regardless
+ // if listchars=eol:X is used or not.
+ bool delay_virttext = lcs_eol == lcs_eol_one && eol_hl_off == 0;
+
+ if (wp->w_p_cuc) {
rightmost_vcol = wp->w_virtcol;
- if (draw_color_col)
- /* determine rightmost colorcolumn to possibly draw */
- for (i = 0; color_cols[i] >= 0; ++i)
- if (rightmost_vcol < color_cols[i])
+ }
+
+ if (draw_color_col) {
+ // determine rightmost colorcolumn to possibly draw
+ for (i = 0; color_cols[i] >= 0; i++) {
+ if (rightmost_vcol < color_cols[i]) {
rightmost_vcol = color_cols[i];
+ }
+ }
+ }
- while (col < wp->w_width) {
- ScreenLines[off] = ' ';
- if (enc_utf8)
- ScreenLinesUC[off] = 0;
- ++col;
- if (draw_color_col)
- draw_color_col = advance_color_col(VCOL_HLC,
- &color_cols);
-
- if (wp->w_p_cuc && VCOL_HLC == (long)wp->w_virtcol)
- ScreenAttrs[off++] = hl_attr(HLF_CUC);
- else if (draw_color_col && VCOL_HLC == *color_cols)
- ScreenAttrs[off++] = hl_attr(HLF_MC);
- else
- ScreenAttrs[off++] = 0;
+ int cuc_attr = win_hl_attr(wp, HLF_CUC);
+ int mc_attr = win_hl_attr(wp, HLF_MC);
+
+ int diff_attr = 0;
+ if (diff_hlf == HLF_TXD) {
+ diff_hlf = HLF_CHD;
+ }
+ if (diff_hlf != 0) {
+ diff_attr = win_hl_attr(wp, diff_hlf);
+ }
+
+ int base_attr = hl_combine_attr(line_attr_lowprio, diff_attr);
+ if (base_attr || line_attr) {
+ rightmost_vcol = INT_MAX;
+ }
+
+ int col_stride = wp->w_p_rl ? -1 : 1;
+
+ while (wp->w_p_rl ? col >= 0 : col < grid->Columns) {
+ int cells = -1;
+ if (do_virttext && !delay_virttext) {
+ if (*s.p == NUL) {
+ if (virt_pos < virt_text.size) {
+ s.p = (char_u *)kv_A(virt_text, virt_pos).text;
+ int hl_id = kv_A(virt_text, virt_pos).hl_id;
+ virt_attr = hl_id > 0 ? syn_id2attr(hl_id) : 0;
+ virt_pos++;
+ } else {
+ do_virttext = false;
+ }
+ }
+ if (*s.p != NUL) {
+ cells = line_putchar(&s, &linebuf_char[off], grid->Columns - col,
+ false);
+ }
+ }
+ delay_virttext = false;
+
+ if (cells == -1) {
+ schar_from_ascii(linebuf_char[off], ' ');
+ cells = 1;
+ }
+ col += cells * col_stride;
+ if (draw_color_col) {
+ draw_color_col = advance_color_col(VCOL_HLC, &color_cols);
+ }
- if (VCOL_HLC >= rightmost_vcol)
+ int col_attr = base_attr;
+
+ if (wp->w_p_cuc && VCOL_HLC == (long)wp->w_virtcol) {
+ col_attr = cuc_attr;
+ } else if (draw_color_col && VCOL_HLC == *color_cols) {
+ col_attr = mc_attr;
+ }
+
+ if (do_virttext) {
+ col_attr = hl_combine_attr(col_attr, virt_attr);
+ }
+
+ col_attr = hl_combine_attr(col_attr, line_attr);
+
+ linebuf_attr[off] = col_attr;
+ if (cells == 2) {
+ linebuf_attr[off+1] = col_attr;
+ }
+ off += cells * col_stride;
+
+ if (VCOL_HLC >= rightmost_vcol && *s.p == NUL
+ && virt_pos >= virt_text.size) {
break;
+ }
++vcol;
}
}
+ // TODO(bfredl): integrate with the common beyond-the-end-loop
if (wp->w_buffer->terminal) {
// terminal buffers may need to highlight beyond the end of the
// logical line
- while (col < wp->w_width) {
- ScreenLines[off] = ' ';
- if (enc_utf8) {
- ScreenLinesUC[off] = 0;
- }
- ScreenAttrs[off++] = term_attrs[vcol++];
+ while (col < grid->Columns) {
+ schar_from_ascii(linebuf_char[off], ' ');
+ linebuf_attr[off++] = term_attrs[vcol++];
col++;
}
}
- SCREEN_LINE(screen_row, wp->w_wincol, col, wp->w_width, wp->w_p_rl);
+ grid_put_linebuf(grid, row, 0, col, grid->Columns, wp->w_p_rl, wp,
+ wp->w_hl_attr_normal, false);
row++;
/*
@@ -3918,6 +3972,7 @@ win_line (
curwin->w_cline_height = row - startrow;
curwin->w_cline_folded = false;
curwin->w_valid |= (VALID_CHEIGHT|VALID_CROW);
+ conceal_cursor_used = conceal_cursor_line(curwin);
}
break;
@@ -3927,21 +3982,20 @@ win_line (
if (lcs_ext
&& !wp->w_p_wrap
&& filler_todo <= 0
- && (
- wp->w_p_rl ? col == 0 :
- col == wp->w_width - 1)
+ && (wp->w_p_rl ? col == 0 : col == grid->Columns - 1)
&& (*ptr != NUL
|| (wp->w_p_list && lcs_eol_one > 0)
|| (n_extra && (c_extra != NUL || *p_extra != NUL)))) {
c = lcs_ext;
- char_attr = hl_attr(HLF_AT);
+ char_attr = win_hl_attr(wp, HLF_AT);
mb_c = c;
- if (enc_utf8 && (*mb_char2len)(c) > 1) {
- mb_utf8 = TRUE;
+ if (enc_utf8 && utf_char2len(c) > 1) {
+ mb_utf8 = true;
u8cc[0] = 0;
c = 0xc0;
- } else
- mb_utf8 = FALSE;
+ } else {
+ mb_utf8 = false;
+ }
}
/* advance to the next 'colorcolumn' */
@@ -3953,17 +4007,23 @@ win_line (
* Also highlight the 'colorcolumn' if it is different than
* 'cursorcolumn' */
vcol_save_attr = -1;
- if (draw_state == WL_LINE && !lnum_in_visual_area) {
+ if (draw_state == WL_LINE && !lnum_in_visual_area
+ && search_attr == 0 && area_attr == 0) {
if (wp->w_p_cuc && VCOL_HLC == (long)wp->w_virtcol
&& lnum != wp->w_cursor.lnum) {
vcol_save_attr = char_attr;
- char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUC));
+ char_attr = hl_combine_attr(win_hl_attr(wp, HLF_CUC), char_attr);
} else if (draw_color_col && VCOL_HLC == *color_cols) {
vcol_save_attr = char_attr;
- char_attr = hl_combine_attr(char_attr, hl_attr(HLF_MC));
+ char_attr = hl_combine_attr(win_hl_attr(wp, HLF_MC), char_attr);
}
}
+ // Apply lowest-priority line attr now, so everything can override it.
+ if (draw_state == WL_LINE) {
+ char_attr = hl_combine_attr(line_attr_lowprio, char_attr);
+ }
+
/*
* Store character to be displayed.
* Skip characters that are left of the screen for 'nowrap'.
@@ -3978,43 +4038,24 @@ win_line (
--off;
--col;
}
- ScreenLines[off] = c;
- if (enc_dbcs == DBCS_JPNU) {
- if ((mb_c & 0xff00) == 0x8e00)
- ScreenLines[off] = 0x8e;
- ScreenLines2[off] = mb_c & 0xff;
- } else if (enc_utf8) {
- if (mb_utf8) {
- int i;
-
- ScreenLinesUC[off] = mb_c;
- if ((c & 0xff) == 0)
- ScreenLines[off] = 0x80; /* avoid storing zero */
- for (i = 0; i < Screen_mco; ++i) {
- ScreenLinesC[i][off] = u8cc[i];
- if (u8cc[i] == 0)
- break;
- }
- } else
- ScreenLinesUC[off] = 0;
+ if (mb_utf8) {
+ schar_from_cc(linebuf_char[off], mb_c, u8cc);
+ } else {
+ schar_from_ascii(linebuf_char[off], c);
}
if (multi_attr) {
- ScreenAttrs[off] = multi_attr;
+ linebuf_attr[off] = multi_attr;
multi_attr = 0;
- } else
- ScreenAttrs[off] = char_attr;
+ } else {
+ linebuf_attr[off] = char_attr;
+ }
if (has_mbyte && (*mb_char2cells)(mb_c) > 1) {
// Need to fill two screen columns.
off++;
col++;
- if (enc_utf8) {
- // UTF-8: Put a 0 in the second screen char.
- ScreenLines[off] = 0;
- } else {
- // DBCS: Put second byte in the second screen char.
- ScreenLines[off] = mb_c & 0xff;
- }
+ // UTF-8: Put a 0 in the second screen char.
+ linebuf_char[off][0] = 0;
if (draw_state > WL_NR && filler_todo <= 0) {
vcol++;
}
@@ -4120,19 +4161,35 @@ win_line (
* At end of screen line and there is more to come: Display the line
* so far. If there is no more to display it is caught above.
*/
- if ((
- wp->w_p_rl ? (col < 0) :
- (col >= wp->w_width))
+ if ((wp->w_p_rl ? (col < 0) : (col >= grid->Columns))
&& (*ptr != NUL
|| filler_todo > 0
|| (wp->w_p_list && lcs_eol != NUL && p_extra != at_end_str)
|| (n_extra != 0 && (c_extra != NUL || *p_extra != NUL)))
) {
- SCREEN_LINE(screen_row, wp->w_wincol, col - boguscols,
- wp->w_width, wp->w_p_rl);
+ bool wrap = wp->w_p_wrap // Wrapping enabled.
+ && filler_todo <= 0 // Not drawing diff filler lines.
+ && lcs_eol_one != -1 // Haven't printed the lcs_eol character.
+ && row != endrow - 1 // Not the last line being displayed.
+ && (grid->Columns == Columns // Window spans the width of the screen,
+ || ui_is_external(kUIMultigrid)) // or has dedicated grid.
+ && !wp->w_p_rl; // Not right-to-left.
+ grid_put_linebuf(grid, row, 0, col - boguscols, grid->Columns, wp->w_p_rl,
+ wp, wp->w_hl_attr_normal, wrap);
+ if (wrap) {
+ ScreenGrid *current_grid = grid;
+ int current_row = row, dummy_col = 0; // dummy_col unused
+ screen_adjust_grid(&current_grid, &current_row, &dummy_col);
+
+ // Force a redraw of the first column of the next line.
+ current_grid->attrs[current_grid->line_offset[current_row+1]] = -1;
+
+ // Remember that the line wraps, used for modeless copy.
+ current_grid->line_wraps[current_row] = true;
+ }
+
boguscols = 0;
- ++row;
- ++screen_row;
+ row++;
/* When not wrapping and finished diff lines, or when displayed
* '$' and highlighting until last column, break here. */
@@ -4145,8 +4202,7 @@ win_line (
if (draw_state != WL_LINE
&& filler_todo <= 0
) {
- win_draw_end(wp, '@', ' ', row, wp->w_height, HLF_AT);
- draw_vsep_win(wp, row);
+ win_draw_end(wp, '@', ' ', row, wp->w_grid.Rows, HLF_AT);
row = endrow;
}
@@ -4156,59 +4212,10 @@ win_line (
break;
}
- if (ui_current_row() == screen_row - 1
- && filler_todo <= 0
- && wp->w_width == Columns) {
- /* Remember that the line wraps, used for modeless copy. */
- LineWraps[screen_row - 1] = TRUE;
-
- /*
- * Special trick to make copy/paste of wrapped lines work with
- * xterm/screen: write an extra character beyond the end of
- * the line. This will work with all terminal types
- * (regardless of the xn,am settings).
- * Only do this if the cursor is on the current line
- * (something has been written in it).
- * Don't do this for the GUI.
- * Don't do this for double-width characters.
- * Don't do this for a window not at the right screen border.
- */
- if (!(has_mbyte
- && ((*mb_off2cells)(LineOffset[screen_row],
- LineOffset[screen_row] + screen_Columns)
- == 2
- || (*mb_off2cells)(LineOffset[screen_row - 1]
- + (int)Columns - 2,
- LineOffset[screen_row] + screen_Columns)
- == 2))
- ) {
- /* First make sure we are at the end of the screen line,
- * then output the same character again to let the
- * terminal know about the wrap. If the terminal doesn't
- * auto-wrap, we overwrite the character. */
- if (ui_current_col() != wp->w_width)
- screen_char(LineOffset[screen_row - 1]
- + (unsigned)Columns - 1,
- screen_row - 1, (int)(Columns - 1));
-
- /* When there is a multi-byte character, just output a
- * space to keep it simple. */
- if (has_mbyte && MB_BYTE2LEN(ScreenLines[LineOffset[
- screen_row -
- 1] + (Columns - 1)]) > 1) {
- ui_putc(' ');
- } else {
- ui_putc(ScreenLines[LineOffset[screen_row - 1] + (Columns - 1)]);
- }
- /* force a redraw of the first char on the next line */
- ScreenAttrs[LineOffset[screen_row]] = (sattr_T)-1;
- }
- }
-
col = 0;
- off = (unsigned)(current_ScreenLine - ScreenLines);
+ off = 0;
if (wp->w_p_rl) {
- col = wp->w_width - 1; /* col is not used if breaking! */
+ col = grid->Columns - 1; // col is not used if breaking!
off += col;
}
@@ -4237,27 +4244,27 @@ win_line (
cap_col = 0;
}
+ xfree(p_extra_free);
return row;
}
-
-/*
- * Return if the composing characters at "off_from" and "off_to" differ.
- * Only to be used when ScreenLinesUC[off_from] != 0.
- */
-static int comp_char_differs(int off_from, int off_to)
+/// Determine if dedicated window grid should be used or the default_grid
+///
+/// If UI did not request multigrid support, draw all windows on the
+/// default_grid.
+///
+/// If the default_grid is used, adjust window relative positions to global
+/// screen positions.
+static void screen_adjust_grid(ScreenGrid **grid, int *row_off, int *col_off)
{
- int i;
-
- for (i = 0; i < Screen_mco; ++i) {
- if (ScreenLinesC[i][off_from] != ScreenLinesC[i][off_to])
- return TRUE;
- if (ScreenLinesC[i][off_from] == 0)
- break;
+ if (!ui_is_external(kUIMultigrid) && *grid != &default_grid) {
+ *row_off += (*grid)->row_offset;
+ *col_off += (*grid)->col_offset;
+ *grid = &default_grid;
}
- return FALSE;
}
+
/*
* Check whether the given character needs redrawing:
* - the (first byte of the) character is different
@@ -4265,222 +4272,184 @@ static int comp_char_differs(int off_from, int off_to)
* - the character is multi-byte and the next byte is different
* - the character is two cells wide and the second cell differs.
*/
-static int char_needs_redraw(int off_from, int off_to, int cols)
+static int grid_char_needs_redraw(ScreenGrid *grid, int off_from, int off_to,
+ int cols)
{
return (cols > 0
- && ((ScreenLines[off_from] != ScreenLines[off_to]
- || ScreenAttrs[off_from] != ScreenAttrs[off_to])
-
- || (enc_dbcs != 0
- && MB_BYTE2LEN(ScreenLines[off_from]) > 1
- && (enc_dbcs == DBCS_JPNU && ScreenLines[off_from] == 0x8e
- ? ScreenLines2[off_from] != ScreenLines2[off_to]
- : (cols > 1 && ScreenLines[off_from + 1]
- != ScreenLines[off_to + 1])))
- || (enc_utf8
- && (ScreenLinesUC[off_from] != ScreenLinesUC[off_to]
- || (ScreenLinesUC[off_from] != 0
- && comp_char_differs(off_from, off_to))
- || ((*mb_off2cells)(off_from, off_from + cols) > 1
- && ScreenLines[off_from + 1]
- != ScreenLines[off_to + 1])))));
+ && ((schar_cmp(linebuf_char[off_from], grid->chars[off_to])
+ || linebuf_attr[off_from] != grid->attrs[off_to]
+ || (line_off2cells(linebuf_char, off_from, off_from + cols) > 1
+ && schar_cmp(linebuf_char[off_from + 1],
+ grid->chars[off_to + 1])))
+ || p_wd < 0));
}
-/*
- * Move one "cooked" screen line to the screen, but only the characters that
- * have actually changed. Handle insert/delete character.
- * "coloff" gives the first column on the screen for this line.
- * "endcol" gives the columns where valid characters are.
- * "clear_width" is the width of the window. It's > 0 if the rest of the line
- * needs to be cleared, negative otherwise.
- * "rlflag" is TRUE in a rightleft window:
- * When TRUE and "clear_width" > 0, clear columns 0 to "endcol"
- * When FALSE and "clear_width" > 0, clear columns "endcol" to "clear_width"
- */
-static void screen_line(int row, int coloff, int endcol, int clear_width, int rlflag)
+/// Move one buffered line to the window grid, but only the characters that
+/// have actually changed. Handle insert/delete character.
+/// "coloff" gives the first column on the grid for this line.
+/// "endcol" gives the columns where valid characters are.
+/// "clear_width" is the width of the window. It's > 0 if the rest of the line
+/// needs to be cleared, negative otherwise.
+/// "rlflag" is TRUE in a rightleft window:
+/// When TRUE and "clear_width" > 0, clear columns 0 to "endcol"
+/// When FALSE and "clear_width" > 0, clear columns "endcol" to "clear_width"
+/// If "wrap" is true, then hint to the UI that "row" contains a line
+/// which has wrapped into the next row.
+static void grid_put_linebuf(ScreenGrid *grid, int row, int coloff, int endcol,
+ int clear_width, int rlflag, win_T *wp,
+ int bg_attr, bool wrap)
{
unsigned off_from;
unsigned off_to;
unsigned max_off_from;
unsigned max_off_to;
int col = 0;
- int hl;
- int force = FALSE; /* force update rest of the line */
- int redraw_this /* bool: does character need redraw? */
- ;
- int redraw_next; /* redraw_this for next character */
- int clear_next = FALSE;
- int char_cells; /* 1: normal char */
- /* 2: occupies two display cells */
-# define CHAR_CELLS char_cells
-
- /* Check for illegal row and col, just in case. */
- if (row >= Rows)
- row = Rows - 1;
- if (endcol > Columns)
- endcol = Columns;
-
-
- off_from = (unsigned)(current_ScreenLine - ScreenLines);
- off_to = LineOffset[row] + coloff;
- max_off_from = off_from + screen_Columns;
- max_off_to = LineOffset[row] + screen_Columns;
+ bool redraw_this; // Does character need redraw?
+ bool redraw_next; // redraw_this for next character
+ bool clear_next = false;
+ int char_cells; // 1: normal char
+ // 2: occupies two display cells
+ int start_dirty = -1, end_dirty = 0;
+
+ // TODO(bfredl): check all callsites and eliminate
+ // Check for illegal row and col, just in case
+ if (row >= grid->Rows) {
+ row = grid->Rows - 1;
+ }
+ if (endcol > grid->Columns) {
+ endcol = grid->Columns;
+ }
+
+ screen_adjust_grid(&grid, &row, &coloff);
+
+ off_from = 0;
+ off_to = grid->line_offset[row] + coloff;
+ max_off_from = linebuf_size;
+ max_off_to = grid->line_offset[row] + grid->Columns;
if (rlflag) {
/* Clear rest first, because it's left of the text. */
if (clear_width > 0) {
- while (col <= endcol && ScreenLines[off_to] == ' '
- && ScreenAttrs[off_to] == 0
- && (!enc_utf8 || ScreenLinesUC[off_to] == 0)
+ while (col <= endcol && grid->chars[off_to][0] == ' '
+ && grid->chars[off_to][1] == NUL
+ && grid->attrs[off_to] == bg_attr
) {
++off_to;
++col;
}
- if (col <= endcol)
- screen_fill(row, row + 1, col + coloff,
- endcol + coloff + 1, ' ', ' ', 0);
+ if (col <= endcol) {
+ grid_fill(grid, row, row + 1, col + coloff, endcol + coloff + 1,
+ ' ', ' ', bg_attr);
+ }
}
col = endcol + 1;
- off_to = LineOffset[row] + col + coloff;
+ off_to = grid->line_offset[row] + col + coloff;
off_from += col;
endcol = (clear_width > 0 ? clear_width : -clear_width);
}
- redraw_next = char_needs_redraw(off_from, off_to, endcol - col);
+ if (bg_attr) {
+ for (int c = col; c < endcol; c++) {
+ linebuf_attr[off_from+c] =
+ hl_combine_attr(bg_attr, linebuf_attr[off_from+c]);
+ }
+ }
- while (col < endcol) {
- if (has_mbyte && (col + 1 < endcol))
- char_cells = (*mb_off2cells)(off_from, max_off_from);
- else
- char_cells = 1;
+ redraw_next = grid_char_needs_redraw(grid, off_from, off_to, endcol - col);
+ while (col < endcol) {
+ char_cells = 1;
+ if (col + 1 < endcol) {
+ char_cells = line_off2cells(linebuf_char, off_from, max_off_from);
+ }
redraw_this = redraw_next;
- redraw_next = force || char_needs_redraw(off_from + CHAR_CELLS,
- off_to + CHAR_CELLS, endcol - col - CHAR_CELLS);
-
+ redraw_next = grid_char_needs_redraw(grid, off_from + char_cells,
+ off_to + char_cells,
+ endcol - col - char_cells);
if (redraw_this) {
- if (enc_dbcs != 0) {
- /* Check if overwriting a double-byte with a single-byte or
- * the other way around requires another character to be
- * redrawn. For UTF-8 this isn't needed, because comparing
- * ScreenLinesUC[] is sufficient. */
- if (char_cells == 1
- && col + 1 < endcol
- && (*mb_off2cells)(off_to, max_off_to) > 1) {
- /* Writing a single-cell character over a double-cell
- * character: need to redraw the next cell. */
- ScreenLines[off_to + 1] = 0;
- redraw_next = TRUE;
- } else if (char_cells == 2
- && col + 2 < endcol
- && (*mb_off2cells)(off_to, max_off_to) == 1
- && (*mb_off2cells)(off_to + 1, max_off_to) > 1) {
- /* Writing the second half of a double-cell character over
- * a double-cell character: need to redraw the second
- * cell. */
- ScreenLines[off_to + 2] = 0;
- redraw_next = TRUE;
- }
-
- if (enc_dbcs == DBCS_JPNU)
- ScreenLines2[off_to] = ScreenLines2[off_from];
+ if (start_dirty == -1) {
+ start_dirty = col;
}
- /* When writing a single-width character over a double-width
- * character and at the end of the redrawn text, need to clear out
- * the right halve of the old character.
- * Also required when writing the right halve of a double-width
- * char over the left halve of an existing one. */
- if (has_mbyte && col + char_cells == endcol
+ end_dirty = col + char_cells;
+ // When writing a single-width character over a double-width
+ // character and at the end of the redrawn text, need to clear out
+ // the right halve of the old character.
+ // Also required when writing the right halve of a double-width
+ // char over the left halve of an existing one
+ if (col + char_cells == endcol
&& ((char_cells == 1
- && (*mb_off2cells)(off_to, max_off_to) > 1)
+ && grid_off2cells(grid, off_to, max_off_to) > 1)
|| (char_cells == 2
- && (*mb_off2cells)(off_to, max_off_to) == 1
- && (*mb_off2cells)(off_to + 1, max_off_to) > 1)))
- clear_next = TRUE;
-
- ScreenLines[off_to] = ScreenLines[off_from];
- if (enc_utf8) {
- ScreenLinesUC[off_to] = ScreenLinesUC[off_from];
- if (ScreenLinesUC[off_from] != 0) {
- int i;
-
- for (i = 0; i < Screen_mco; ++i)
- ScreenLinesC[i][off_to] = ScreenLinesC[i][off_from];
- }
+ && grid_off2cells(grid, off_to, max_off_to) == 1
+ && grid_off2cells(grid, off_to + 1, max_off_to) > 1))) {
+ clear_next = true;
}
- if (char_cells == 2)
- ScreenLines[off_to + 1] = ScreenLines[off_from + 1];
- ScreenAttrs[off_to] = ScreenAttrs[off_from];
- /* For simplicity set the attributes of second half of a
- * double-wide character equal to the first half. */
- if (char_cells == 2)
- ScreenAttrs[off_to + 1] = ScreenAttrs[off_from];
+ schar_copy(grid->chars[off_to], linebuf_char[off_from]);
+ if (char_cells == 2) {
+ schar_copy(grid->chars[off_to+1], linebuf_char[off_from+1]);
+ }
- if (enc_dbcs != 0 && char_cells == 2)
- screen_char_2(off_to, row, col + coloff);
- else
- screen_char(off_to, row, col + coloff);
+ grid->attrs[off_to] = linebuf_attr[off_from];
+ // For simplicity set the attributes of second half of a
+ // double-wide character equal to the first half.
+ if (char_cells == 2) {
+ grid->attrs[off_to + 1] = linebuf_attr[off_from];
+ }
}
- off_to += CHAR_CELLS;
- off_from += CHAR_CELLS;
- col += CHAR_CELLS;
+ off_to += char_cells;
+ off_from += char_cells;
+ col += char_cells;
}
if (clear_next) {
/* Clear the second half of a double-wide character of which the left
* half was overwritten with a single-wide character. */
- ScreenLines[off_to] = ' ';
- if (enc_utf8)
- ScreenLinesUC[off_to] = 0;
- screen_char(off_to, row, col + coloff);
+ schar_from_ascii(grid->chars[off_to], ' ');
+ end_dirty++;
+ }
+
+ int clear_end = -1;
+ if (clear_width > 0 && !rlflag) {
+ // blank out the rest of the line
+ // TODO(bfredl): we could cache winline widths
+ while (col < clear_width) {
+ if (grid->chars[off_to][0] != ' '
+ || grid->chars[off_to][1] != NUL
+ || grid->attrs[off_to] != bg_attr) {
+ grid->chars[off_to][0] = ' ';
+ grid->chars[off_to][1] = NUL;
+ grid->attrs[off_to] = bg_attr;
+ if (start_dirty == -1) {
+ start_dirty = col;
+ end_dirty = col;
+ } else if (clear_end == -1) {
+ end_dirty = endcol;
+ }
+ clear_end = col+1;
+ }
+ col++;
+ off_to++;
+ }
}
- if (clear_width > 0
- && !rlflag
- ) {
+ if (clear_width > 0 || wp->w_width != grid->Columns) {
+ // If we cleared after the end of the line, it did not wrap.
+ // For vsplit, line wrapping is not possible.
+ grid->line_wraps[row] = false;
+ }
- /* blank out the rest of the line */
- while (col < clear_width && ScreenLines[off_to] == ' '
- && ScreenAttrs[off_to] == 0
- && (!enc_utf8 || ScreenLinesUC[off_to] == 0)
- ) {
- ++off_to;
- ++col;
- }
- if (col < clear_width) {
- screen_fill(row, row + 1, col + coloff, clear_width + coloff,
- ' ', ' ', 0);
- off_to += clear_width - col;
- col = clear_width;
- }
- }
-
- if (clear_width > 0) {
- /* For a window that's left of another, draw the separator char. */
- if (col + coloff < Columns) {
- int c;
-
- c = fillchar_vsep(&hl);
- if (ScreenLines[off_to] != (schar_T)c
- || (enc_utf8 && (int)ScreenLinesUC[off_to]
- != (c >= 0x80 ? c : 0))
- || ScreenAttrs[off_to] != hl) {
- ScreenLines[off_to] = c;
- ScreenAttrs[off_to] = hl;
- if (enc_utf8) {
- if (c >= 0x80) {
- ScreenLinesUC[off_to] = c;
- ScreenLinesC[0][off_to] = 0;
- } else
- ScreenLinesUC[off_to] = 0;
- }
- screen_char(off_to, row, col + coloff);
- }
- } else
- LineWraps[row] = FALSE;
+ if (clear_end < end_dirty) {
+ clear_end = end_dirty;
+ }
+ if (start_dirty == -1) {
+ start_dirty = end_dirty;
+ }
+ if (clear_end > start_dirty) {
+ ui_line(grid, row, coloff+start_dirty, coloff+end_dirty, coloff+clear_end,
+ bg_attr, wrap);
}
}
@@ -4514,14 +4483,18 @@ void status_redraw_all(void)
}
}
-/*
- * mark all status lines of the current buffer for redraw
- */
+/// Marks all status lines of the current buffer for redraw.
void status_redraw_curbuf(void)
{
+ status_redraw_buf(curbuf);
+}
+
+/// Marks all status lines of the specified buffer for redraw.
+void status_redraw_buf(buf_T *buf)
+{
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
- if (wp->w_status_height != 0 && wp->w_buffer == curbuf) {
- wp->w_redr_status = TRUE;
+ if (wp->w_status_height != 0 && wp->w_buffer == buf) {
+ wp->w_redr_status = true;
redraw_later(VALID);
}
}
@@ -4534,7 +4507,7 @@ void redraw_statuslines(void)
{
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
if (wp->w_redr_status) {
- win_redr_status(wp);
+ win_redr_status(wp, false);
}
}
if (redraw_tabline)
@@ -4568,11 +4541,10 @@ static void draw_vsep_win(win_T *wp, int row)
int c;
if (wp->w_vsep_width) {
- /* draw the vertical separator right of this window */
- c = fillchar_vsep(&hl);
- screen_fill(wp->w_winrow + row, wp->w_winrow + wp->w_height,
- W_ENDCOL(wp), W_ENDCOL(wp) + 1,
- c, ' ', hl);
+ // draw the vertical separator right of this window
+ c = fillchar_vsep(wp, &hl);
+ grid_fill(&default_grid, wp->w_winrow + row, W_ENDROW(wp),
+ W_ENDCOL(wp), W_ENDCOL(wp) + 1, c, ' ', hl);
}
}
@@ -4594,7 +4566,7 @@ static int status_match_len(expand_T *xp, char_u *s)
while (*s != NUL) {
s += skip_status_match_char(xp, s);
len += ptr2cells(s);
- mb_ptr_adv(s);
+ MB_PTR_ADV(s);
}
return len;
@@ -4657,7 +4629,8 @@ win_redr_status_matches (
if (matches == NULL) /* interrupted completion? */
return;
- buf = xmalloc(has_mbyte ? Columns * MB_MAXBYTES + 1 : Columns + 1);
+ buf = xmalloc(has_mbyte ? default_grid.Columns * MB_MAXBYTES + 1
+ : default_grid.Columns + 1);
if (match == -1) { /* don't show match but original text */
match = 0;
@@ -4677,15 +4650,16 @@ win_redr_status_matches (
clen += status_match_len(xp, L_MATCH(i)) + 2;
if (first_match > 0)
clen += 2;
- /* jumping right, put match at the left */
- if ((long)clen > Columns) {
+ // jumping right, put match at the left
+ if ((long)clen > default_grid.Columns) {
first_match = match;
/* if showing the last match, we can add some on the left */
clen = 2;
for (i = match; i < num_matches; ++i) {
clen += status_match_len(xp, L_MATCH(i)) + 2;
- if ((long)clen >= Columns)
+ if ((long)clen >= default_grid.Columns) {
break;
+ }
}
if (i == num_matches)
add_left = TRUE;
@@ -4694,12 +4668,13 @@ win_redr_status_matches (
if (add_left)
while (first_match > 0) {
clen += status_match_len(xp, L_MATCH(first_match - 1)) + 2;
- if ((long)clen >= Columns)
+ if ((long)clen >= default_grid.Columns) {
break;
- --first_match;
+ }
+ first_match--;
}
- fillchar = fillchar_status(&attr, TRUE);
+ fillchar = fillchar_status(&attr, curwin);
if (first_match == 0) {
*buf = NUL;
@@ -4711,7 +4686,8 @@ win_redr_status_matches (
clen = len;
i = first_match;
- while ((long)(clen + status_match_len(xp, L_MATCH(i)) + 2) < Columns) {
+ while ((long)(clen + status_match_len(xp, L_MATCH(i)) + 2)
+ < default_grid.Columns) {
if (i == match) {
selstart = buf + len;
selstart_col = clen;
@@ -4762,12 +4738,12 @@ win_redr_status_matches (
if (msg_scrolled > 0) {
/* Put the wildmenu just above the command line. If there is
* no room, scroll the screen one line up. */
- if (cmdline_row == Rows - 1) {
- screen_del_lines(0, 0, 1, (int)Rows, NULL);
- ++msg_scrolled;
+ if (cmdline_row == default_grid.Rows - 1) {
+ grid_del_lines(&default_grid, 0, 1, (int)Rows, 0, (int)Columns);
+ msg_scrolled++;
} else {
- ++cmdline_row;
- ++row;
+ cmdline_row++;
+ row++;
}
wild_menu_showing = WM_SCROLLED;
} else {
@@ -4785,25 +4761,26 @@ win_redr_status_matches (
}
}
- screen_puts(buf, row, 0, attr);
+ grid_puts(&default_grid, buf, row, 0, attr);
if (selstart != NULL && highlight) {
*selend = NUL;
- screen_puts(selstart, row, selstart_col, hl_attr(HLF_WM));
+ grid_puts(&default_grid, selstart, row, selstart_col, HL_ATTR(HLF_WM));
}
- screen_fill(row, row + 1, clen, (int)Columns, fillchar, fillchar, attr);
+ grid_fill(&default_grid, row, row + 1, clen, (int)default_grid.Columns,
+ fillchar, fillchar, attr);
}
win_redraw_last_status(topframe);
xfree(buf);
}
-/*
- * Redraw the status line of window wp.
- *
- * If inversion is possible we use it. Else '=' characters are used.
- */
-void win_redr_status(win_T *wp)
+/// Redraw the status line of window `wp`.
+///
+/// If inversion is possible we use it. Else '=' characters are used.
+/// If "ignore_pum" is true, also redraw statusline when the popup menu is
+/// displayed.
+static void win_redr_status(win_T *wp, int ignore_pum)
{
int row;
char_u *p;
@@ -4813,28 +4790,28 @@ void win_redr_status(win_T *wp)
int this_ru_col;
static int busy = FALSE;
- /* It's possible to get here recursively when 'statusline' (indirectly)
- * invokes ":redrawstatus". Simply ignore the call then. */
- if (busy)
+ // May get here recursively when 'statusline' (indirectly)
+ // invokes ":redrawstatus". Simply ignore the call then.
+ if (busy
+ // Also ignore if wildmenu is showing.
+ || (wild_menu_showing != 0 && !ui_is_external(kUIWildmenu))) {
return;
- busy = TRUE;
+ }
+ busy = true;
wp->w_redr_status = FALSE;
if (wp->w_status_height == 0) {
- /* no status line, can only be last window */
- redraw_cmdline = TRUE;
- } else if (!redrawing()
- /* don't update status line when popup menu is visible and may be
- * drawn over it */
- || pum_visible()
- ) {
- /* Don't redraw right now, do it later. */
- wp->w_redr_status = TRUE;
+ // no status line, can only be last window
+ redraw_cmdline = true;
+ } else if (!redrawing() || (!ignore_pum && pum_drawn())) {
+ // Don't redraw right now, do it later. Don't update status line when
+ // popup menu is visible and may be drawn over it
+ wp->w_redr_status = true;
} else if (*p_stl != NUL || *wp->w_p_stl != NUL) {
/* redraw custom status line */
redraw_custom_statusline(wp);
} else {
- fillchar = fillchar_status(&attr, wp == curwin);
+ fillchar = fillchar_status(&attr, wp);
get_trans_bufname(wp->w_buffer);
p = NameBuff;
@@ -4843,8 +4820,9 @@ void win_redr_status(win_T *wp)
if (wp->w_buffer->b_help
|| wp->w_p_pvw
|| bufIsChanged(wp->w_buffer)
- || wp->w_buffer->b_p_ro)
+ || wp->w_buffer->b_p_ro) {
*(p + len++) = ' ';
+ }
if (wp->w_buffer->b_help) {
STRCPY(p + len, _("[Help]"));
len += (int)STRLEN(p + len);
@@ -4859,48 +4837,45 @@ void win_redr_status(win_T *wp)
}
if (wp->w_buffer->b_p_ro) {
STRCPY(p + len, _("[RO]"));
- len += 4;
+ // len += (int)STRLEN(p + len); // dead assignment
}
this_ru_col = ru_col - (Columns - wp->w_width);
- if (this_ru_col < (wp->w_width + 1) / 2)
+ if (this_ru_col < (wp->w_width + 1) / 2) {
this_ru_col = (wp->w_width + 1) / 2;
+ }
if (this_ru_col <= 1) {
- p = (char_u *)"<"; /* No room for file name! */
+ p = (char_u *)"<"; // No room for file name!
len = 1;
- } else if (has_mbyte) {
+ } else {
int clen = 0, i;
- /* Count total number of display cells. */
- clen = (int) mb_string2cells(p);
+ // Count total number of display cells.
+ clen = (int)mb_string2cells(p);
- /* Find first character that will fit.
- * Going from start to end is much faster for DBCS. */
+ // Find first character that will fit.
+ // Going from start to end is much faster for DBCS.
for (i = 0; p[i] != NUL && clen >= this_ru_col - 1;
- i += (*mb_ptr2len)(p + i))
- clen -= (*mb_ptr2cells)(p + i);
+ i += utfc_ptr2len(p + i)) {
+ clen -= utf_ptr2cells(p + i);
+ }
len = clen;
if (i > 0) {
p = p + i - 1;
*p = '<';
++len;
}
-
- } else if (len > this_ru_col - 1) {
- p += len - (this_ru_col - 1);
- *p = '<';
- len = this_ru_col - 1;
}
- row = wp->w_winrow + wp->w_height;
- screen_puts(p, row, wp->w_wincol, attr);
- screen_fill(row, row + 1, len + wp->w_wincol,
- this_ru_col + wp->w_wincol, fillchar, fillchar, attr);
+ row = W_ENDROW(wp);
+ grid_puts(&default_grid, p, row, wp->w_wincol, attr);
+ grid_fill(&default_grid, row, row + 1, len + wp->w_wincol,
+ this_ru_col + wp->w_wincol, fillchar, fillchar, attr);
- if (get_keymap_str(wp, NameBuff, MAXPATHL)
+ if (get_keymap_str(wp, (char_u *)"<%s>", NameBuff, MAXPATHL)
&& this_ru_col - len > (int)(STRLEN(NameBuff) + 1))
- screen_puts(NameBuff, row, (int)(this_ru_col - STRLEN(NameBuff)
- - 1 + wp->w_wincol), attr);
+ grid_puts(&default_grid, NameBuff, row,
+ (int)(this_ru_col - STRLEN(NameBuff) - 1), attr);
win_redr_ruler(wp, TRUE);
}
@@ -4909,12 +4884,12 @@ void win_redr_status(win_T *wp)
* May need to draw the character below the vertical separator.
*/
if (wp->w_vsep_width != 0 && wp->w_status_height != 0 && redrawing()) {
- if (stl_connected(wp))
- fillchar = fillchar_status(&attr, wp == curwin);
- else
- fillchar = fillchar_vsep(&attr);
- screen_putchar(fillchar, wp->w_winrow + wp->w_height,
- W_ENDCOL(wp), attr);
+ if (stl_connected(wp)) {
+ fillchar = fillchar_status(&attr, wp);
+ } else {
+ fillchar = fillchar_vsep(wp, &attr);
+ }
+ grid_putchar(&default_grid, fillchar, W_ENDROW(wp), W_ENDCOL(wp), attr);
}
busy = FALSE;
}
@@ -4925,8 +4900,8 @@ void win_redr_status(win_T *wp)
*/
static void redraw_custom_statusline(win_T *wp)
{
- static int entered = FALSE;
- int save_called_emsg = called_emsg;
+ static int entered = false;
+ int saved_did_emsg = did_emsg;
/* When called recursively return. This can happen when the statusline
* contains an expression that triggers a redraw. */
@@ -4934,18 +4909,18 @@ static void redraw_custom_statusline(win_T *wp)
return;
entered = TRUE;
- called_emsg = FALSE;
- win_redr_custom(wp, FALSE);
- if (called_emsg) {
- /* When there is an error disable the statusline, otherwise the
- * display is messed up with errors and a redraw triggers the problem
- * again and again. */
+ did_emsg = false;
+ win_redr_custom(wp, false);
+ if (did_emsg) {
+ // When there is an error disable the statusline, otherwise the
+ // display is messed up with errors and a redraw triggers the problem
+ // again and again.
set_string_option_direct((char_u *)"statusline", -1,
(char_u *)"", OPT_FREE | (*wp->w_p_stl != NUL
? OPT_LOCAL : OPT_GLOBAL), SID_ERROR);
}
- called_emsg |= save_called_emsg;
- entered = FALSE;
+ did_emsg |= saved_did_emsg;
+ entered = false;
}
/*
@@ -4978,8 +4953,9 @@ int stl_connected(win_T *wp)
int
get_keymap_str (
win_T *wp,
- char_u *buf, /* buffer for the result */
- int len /* length of buffer */
+ char_u *fmt, // format string containing one %s item
+ char_u *buf, // buffer for the result
+ int len // length of buffer
)
{
char_u *p;
@@ -5006,10 +4982,9 @@ get_keymap_str (
else
p = (char_u *)"lang";
}
- if ((int)(STRLEN(p) + 3) < len)
- sprintf((char *)buf, "<%s>", p);
- else
+ if (vim_snprintf((char *)buf, len, (char *)fmt, p) > len - 1) {
buf[0] = NUL;
+ }
xfree(s);
}
return buf[0] != NUL;
@@ -5057,12 +5032,12 @@ win_redr_custom (
stl = p_tal;
row = 0;
fillchar = ' ';
- attr = hl_attr(HLF_TPF);
- maxwidth = Columns;
+ attr = HL_ATTR(HLF_TPF);
+ maxwidth = default_grid.Columns;
use_sandbox = was_set_insecurely((char_u *)"tabline", 0);
} else {
- row = wp->w_winrow + wp->w_height;
- fillchar = fillchar_status(&attr, wp == curwin);
+ row = W_ENDROW(wp);
+ fillchar = fillchar_status(&attr, wp);
maxwidth = wp->w_width;
if (draw_ruler) {
@@ -5077,13 +5052,14 @@ win_redr_custom (
if (*stl++ != '(')
stl = p_ruf;
}
- col = ru_col - (Columns - wp->w_width);
- if (col < (wp->w_width + 1) / 2)
+ col = ru_col - (default_grid.Columns - wp->w_width);
+ if (col < (wp->w_width + 1) / 2) {
col = (wp->w_width + 1) / 2;
+ }
maxwidth = wp->w_width - col;
if (!wp->w_status_height) {
- row = Rows - 1;
- --maxwidth; /* writing in last column may cause scrolling */
+ row = default_grid.Rows - 1;
+ maxwidth--; // writing in last column may cause scrolling
fillchar = ' ';
attr = 0;
}
@@ -5119,28 +5095,30 @@ win_redr_custom (
xfree(stl);
ewp->w_p_crb = p_crb_save;
- /* Make all characters printable. */
- p = transstr(buf);
+ // Make all characters printable.
+ p = (char_u *)transstr((const char *)buf);
len = STRLCPY(buf, p, sizeof(buf));
len = (size_t)len < sizeof(buf) ? len : (int)sizeof(buf) - 1;
xfree(p);
/* fill up with "fillchar" */
while (width < maxwidth && len < (int)sizeof(buf) - 1) {
- len += (*mb_char2bytes)(fillchar, buf + len);
- ++width;
+ len += utf_char2bytes(fillchar, buf + len);
+ width++;
}
buf[len] = NUL;
/*
* Draw each snippet with the specified highlighting.
*/
+ screen_puts_line_start(row);
+
curattr = attr;
p = buf;
for (n = 0; hltab[n].start != NULL; n++) {
- int len = (int)(hltab[n].start - p);
- screen_puts_len(p, len, row, col, curattr);
- col += vim_strnsize(p, len);
+ int textlen = (int)(hltab[n].start - p);
+ grid_puts_len(&default_grid, p, textlen, row, col, curattr);
+ col += vim_strnsize(p, textlen);
p = hltab[n].start;
if (hltab[n].userhl == 0)
@@ -5153,7 +5131,10 @@ win_redr_custom (
curattr = highlight_user[hltab[n].userhl - 1];
}
// Make sure to use an empty string instead of p, if p is beyond buf + len.
- screen_puts(p >= buf + len ? (char_u *)"" : p, row, col, curattr);
+ grid_puts(&default_grid, p >= buf + len ? (char_u *)"" : p, row, col,
+ curattr);
+
+ grid_puts_line_flush(&default_grid, false);
if (wp == NULL) {
// Fill the tab_page_click_defs array for clicking in the tab pages line.
@@ -5171,7 +5152,7 @@ win_redr_custom (
p = (char_u *) tabtab[n].start;
cur_click_def = tabtab[n].def;
}
- while (col < Columns) {
+ while (col < default_grid.Columns) {
tab_page_click_defs[col++] = cur_click_def;
}
}
@@ -5180,86 +5161,144 @@ theend:
entered = FALSE;
}
+// Low-level functions to manipulate invidual character cells on the
+// screen grid.
-/*
- * Output a single character directly to the screen and update ScreenLines.
- */
-void screen_putchar(int c, int row, int col, int attr)
+/// Put a ASCII character in a screen cell.
+static void schar_from_ascii(char_u *p, const char c)
{
- char_u buf[MB_MAXBYTES + 1];
+ p[0] = c;
+ p[1] = 0;
+}
+
+/// Put a unicode character in a screen cell.
+static int schar_from_char(char_u *p, int c)
+{
+ int len = utf_char2bytes(c, p);
+ p[len] = NUL;
+ return len;
+}
- if (has_mbyte)
- buf[(*mb_char2bytes)(c, buf)] = NUL;
- else {
- buf[0] = c;
- buf[1] = NUL;
+/// Put a unicode char, and up to MAX_MCO composing chars, in a screen cell.
+static int schar_from_cc(char_u *p, int c, int u8cc[MAX_MCO])
+{
+ int len = utf_char2bytes(c, p);
+ for (int i = 0; i < MAX_MCO; i++) {
+ if (u8cc[i] == 0) {
+ break;
+ }
+ len += utf_char2bytes(u8cc[i], p + len);
}
- screen_puts(buf, row, col, attr);
+ p[len] = 0;
+ return len;
}
-/*
- * Get a single character directly from ScreenLines into "bytes[]".
- * Also return its attribute in *attrp;
- */
-void screen_getbytes(int row, int col, char_u *bytes, int *attrp)
+/// compare the contents of two screen cells.
+static int schar_cmp(char_u *sc1, char_u *sc2)
{
- unsigned off;
+ return STRNCMP(sc1, sc2, sizeof(schar_T));
+}
- /* safety check */
- if (ScreenLines != NULL && row < screen_Rows && col < screen_Columns) {
- off = LineOffset[row] + col;
- *attrp = ScreenAttrs[off];
- bytes[0] = ScreenLines[off];
- bytes[1] = NUL;
+/// copy the contents of screen cell `sc2` into cell `sc1`
+static void schar_copy(char_u *sc1, char_u *sc2)
+{
+ STRLCPY(sc1, sc2, sizeof(schar_T));
+}
- if (enc_utf8 && ScreenLinesUC[off] != 0)
- bytes[utfc_char2bytes(off, bytes)] = NUL;
- else if (enc_dbcs == DBCS_JPNU && ScreenLines[off] == 0x8e) {
- bytes[0] = ScreenLines[off];
- bytes[1] = ScreenLines2[off];
- bytes[2] = NUL;
- } else if (enc_dbcs && MB_BYTE2LEN(bytes[0]) > 1) {
- bytes[1] = ScreenLines[off + 1];
- bytes[2] = NUL;
- }
+static int line_off2cells(schar_T *line, size_t off, size_t max_off)
+{
+ return (off + 1 < max_off && line[off + 1][0] == 0) ? 2 : 1;
+}
+
+/// Return number of display cells for char at grid->chars[off].
+/// We make sure that the offset used is less than "max_off".
+static int grid_off2cells(ScreenGrid *grid, size_t off, size_t max_off)
+{
+ return line_off2cells(grid->chars, off, max_off);
+}
+
+/// Return true if the character at "row"/"col" on the screen is the left side
+/// of a double-width character.
+///
+/// Caller must make sure "row" and "col" are not invalid!
+bool grid_lefthalve(ScreenGrid *grid, int row, int col)
+{
+ screen_adjust_grid(&grid, &row, &col);
+
+ return grid_off2cells(grid, grid->line_offset[row] + col,
+ grid->line_offset[row] + grid->Columns) > 1;
+}
+
+/// Correct a position on the screen, if it's the right half of a double-wide
+/// char move it to the left half. Returns the corrected column.
+int grid_fix_col(ScreenGrid *grid, int col, int row)
+{
+ int coloff = 0;
+ screen_adjust_grid(&grid, &row, &coloff);
+
+ col += coloff;
+ if (grid->chars != NULL && col > 0
+ && grid->chars[grid->line_offset[row] + col][0] == 0) {
+ return col - 1 - coloff;
}
+ return col - coloff;
}
+/// output a single character directly to the grid
+void grid_putchar(ScreenGrid *grid, int c, int row, int col, int attr)
+{
+ char_u buf[MB_MAXBYTES + 1];
-/*
- * Return TRUE if composing characters for screen posn "off" differs from
- * composing characters in "u8cc".
- * Only to be used when ScreenLinesUC[off] != 0.
- */
-static int screen_comp_differs(int off, int *u8cc)
+ buf[utf_char2bytes(c, buf)] = NUL;
+ grid_puts(grid, buf, row, col, attr);
+}
+
+/// get a single character directly from grid.chars into "bytes[]".
+/// Also return its attribute in *attrp;
+void grid_getbytes(ScreenGrid *grid, int row, int col, char_u *bytes,
+ int *attrp)
{
- int i;
+ unsigned off;
- for (i = 0; i < Screen_mco; ++i) {
- if (ScreenLinesC[i][off] != (u8char_T)u8cc[i])
- return TRUE;
- if (u8cc[i] == 0)
- break;
+ screen_adjust_grid(&grid, &row, &col);
+
+
+ // safety check
+ if (grid->chars != NULL && row < grid->Rows && col < grid->Columns) {
+ off = grid->line_offset[row] + col;
+ *attrp = grid->attrs[off];
+ schar_copy(bytes, grid->chars[off]);
}
- return FALSE;
}
-/*
- * Put string '*text' on the screen at position 'row' and 'col', with
- * attributes 'attr', and update ScreenLines[] and ScreenAttrs[].
- * Note: only outputs within one row, message is truncated at screen boundary!
- * Note: if ScreenLines[], row and/or col is invalid, nothing is done.
- */
-void screen_puts(char_u *text, int row, int col, int attr)
+
+/// put string '*text' on the window grid at position 'row' and 'col', with
+/// attributes 'attr', and update chars[] and attrs[].
+/// Note: only outputs within one row, message is truncated at grid boundary!
+/// Note: if grid, row and/or col is invalid, nothing is done.
+void grid_puts(ScreenGrid *grid, char_u *text, int row, int col, int attr)
{
- screen_puts_len(text, -1, row, col, attr);
+ grid_puts_len(grid, text, -1, row, col, attr);
}
-/*
- * Like screen_puts(), but output "text[len]". When "len" is -1 output up to
- * a NUL.
- */
-void screen_puts_len(char_u *text, int textlen, int row, int col, int attr)
+static int put_dirty_row = -1;
+static int put_dirty_first = -1;
+static int put_dirty_last = 0;
+
+/// Start a group of screen_puts_len calls that builds a single screen line.
+///
+/// Must be matched with a screen_puts_line_flush call before moving to
+/// another line.
+void screen_puts_line_start(int row)
+{
+ assert(put_dirty_row == -1);
+ put_dirty_row = row;
+}
+
+/// like grid_puts(), but output "text[len]". When "len" is -1 output up to
+/// a NUL.
+void grid_puts_len(ScreenGrid *grid, char_u *text, int textlen, int row,
+ int col, int attr)
{
unsigned off;
char_u *ptr = text;
@@ -5277,181 +5316,160 @@ void screen_puts_len(char_u *text, int textlen, int row, int col, int attr)
int force_redraw_this;
int force_redraw_next = FALSE;
int need_redraw;
+ bool do_flush = false;
- const int l_has_mbyte = has_mbyte;
- const bool l_enc_utf8 = enc_utf8;
- const int l_enc_dbcs = enc_dbcs;
+ screen_adjust_grid(&grid, &row, &col);
- assert((l_has_mbyte == (l_enc_utf8 || l_enc_dbcs))
- && !(l_enc_utf8 && l_enc_dbcs));
-
- if (ScreenLines == NULL || row >= screen_Rows) /* safety check */
+ // safety check
+ if (grid->chars == NULL || row >= grid->Rows || col >= grid->Columns) {
return;
- off = LineOffset[row] + col;
+ }
+
+ if (put_dirty_row == -1) {
+ screen_puts_line_start(row);
+ do_flush = true;
+ } else {
+ if (row != put_dirty_row) {
+ abort();
+ }
+ }
+ off = grid->line_offset[row] + col;
/* When drawing over the right halve of a double-wide char clear out the
* left halve. Only needed in a terminal. */
- if (l_has_mbyte && col > 0 && col < screen_Columns
- && mb_fix_col(col, row) != col) {
- ScreenLines[off - 1] = ' ';
- ScreenAttrs[off - 1] = 0;
- if (l_enc_utf8) {
- ScreenLinesUC[off - 1] = 0;
- ScreenLinesC[0][off - 1] = 0;
- }
- /* redraw the previous cell, make it empty */
- screen_char(off - 1, row, col - 1);
- /* force the cell at "col" to be redrawn */
- force_redraw_next = TRUE;
- }
-
- max_off = LineOffset[row] + screen_Columns;
- while (col < screen_Columns
+ if (col > 0 && col < grid->Columns && grid_fix_col(grid, col, row) != col) {
+ schar_from_ascii(grid->chars[off - 1], ' ');
+ grid->attrs[off - 1] = 0;
+ // redraw the previous cell, make it empty
+ if (put_dirty_first == -1) {
+ put_dirty_first = col-1;
+ }
+ put_dirty_last = col+1;
+ // force the cell at "col" to be redrawn
+ force_redraw_next = true;
+ }
+
+ max_off = grid->line_offset[row] + grid->Columns;
+ while (col < grid->Columns
&& (len < 0 || (int)(ptr - text) < len)
&& *ptr != NUL) {
c = *ptr;
- /* check if this is the first byte of a multibyte */
- if (l_has_mbyte) {
- if (l_enc_utf8 && len > 0)
- mbyte_blen = utfc_ptr2len_len(ptr, (int)((text + len) - ptr));
- else
- mbyte_blen = (*mb_ptr2len)(ptr);
- if (l_enc_dbcs == DBCS_JPNU && c == 0x8e)
- mbyte_cells = 1;
- else if (l_enc_dbcs != 0)
- mbyte_cells = mbyte_blen;
- else { /* enc_utf8 */
- if (len >= 0)
- u8c = utfc_ptr2char_len(ptr, u8cc,
- (int)((text + len) - ptr));
- else
- u8c = utfc_ptr2char(ptr, u8cc);
- mbyte_cells = utf_char2cells(u8c);
- if (p_arshape && !p_tbidi && arabic_char(u8c)) {
- /* Do Arabic shaping. */
- if (len >= 0 && (int)(ptr - text) + mbyte_blen >= len) {
- /* Past end of string to be displayed. */
- nc = NUL;
- nc1 = NUL;
- } else {
- nc = utfc_ptr2char_len(ptr + mbyte_blen, pcc,
- (int)((text + len) - ptr - mbyte_blen));
- nc1 = pcc[0];
- }
- pc = prev_c;
- prev_c = u8c;
- u8c = arabic_shape(u8c, &c, &u8cc[0], nc, nc1, pc);
- } else
- prev_c = u8c;
- if (col + mbyte_cells > screen_Columns) {
- /* Only 1 cell left, but character requires 2 cells:
- * display a '>' in the last column to avoid wrapping. */
- c = '>';
- mbyte_cells = 1;
- }
+ // check if this is the first byte of a multibyte
+ if (len > 0) {
+ mbyte_blen = utfc_ptr2len_len(ptr, (int)((text + len) - ptr));
+ } else {
+ mbyte_blen = utfc_ptr2len(ptr);
+ }
+ if (len >= 0) {
+ u8c = utfc_ptr2char_len(ptr, u8cc, (int)((text + len) - ptr));
+ } else {
+ u8c = utfc_ptr2char(ptr, u8cc);
+ }
+ mbyte_cells = utf_char2cells(u8c);
+ if (p_arshape && !p_tbidi && arabic_char(u8c)) {
+ // Do Arabic shaping.
+ if (len >= 0 && (int)(ptr - text) + mbyte_blen >= len) {
+ // Past end of string to be displayed.
+ nc = NUL;
+ nc1 = NUL;
+ } else {
+ nc = utfc_ptr2char_len(ptr + mbyte_blen, pcc,
+ (int)((text + len) - ptr - mbyte_blen));
+ nc1 = pcc[0];
}
+ pc = prev_c;
+ prev_c = u8c;
+ u8c = arabic_shape(u8c, &c, &u8cc[0], nc, nc1, pc);
+ } else {
+ prev_c = u8c;
+ }
+ if (col + mbyte_cells > grid->Columns) {
+ // Only 1 cell left, but character requires 2 cells:
+ // display a '>' in the last column to avoid wrapping. */
+ c = '>';
+ mbyte_cells = 1;
}
+ schar_T buf;
+ schar_from_cc(buf, u8c, u8cc);
+
+
force_redraw_this = force_redraw_next;
force_redraw_next = FALSE;
- need_redraw = ScreenLines[off] != c
- || (mbyte_cells == 2
- && ScreenLines[off + 1] != (l_enc_dbcs ? ptr[1] : 0))
- || (l_enc_dbcs == DBCS_JPNU
- && c == 0x8e
- && ScreenLines2[off] != ptr[1])
- || (l_enc_utf8
- && (ScreenLinesUC[off] !=
- (u8char_T)(c < 0x80 && u8cc[0] == 0 ? 0 : u8c)
- || (ScreenLinesUC[off] != 0
- && screen_comp_differs(off, u8cc))))
- || ScreenAttrs[off] != attr
+ need_redraw = schar_cmp(grid->chars[off], buf)
+ || (mbyte_cells == 2 && grid->chars[off + 1][0] != 0)
+ || grid->attrs[off] != attr
|| exmode_active;
- if (need_redraw
- || force_redraw_this
- ) {
- /* When at the end of the text and overwriting a two-cell
- * character with a one-cell character, need to clear the next
- * cell. Also when overwriting the left halve of a two-cell char
- * with the right halve of a two-cell char. Do this only once
- * (mb_off2cells() may return 2 on the right halve). */
- if (clear_next_cell)
- clear_next_cell = FALSE;
- else if (l_has_mbyte
- && (len < 0 ? ptr[mbyte_blen] == NUL
- : ptr + mbyte_blen >= text + len)
- && ((mbyte_cells == 1 && (*mb_off2cells)(off, max_off) > 1)
- || (mbyte_cells == 2
- && (*mb_off2cells)(off, max_off) == 1
- && (*mb_off2cells)(off + 1, max_off) > 1)))
- clear_next_cell = TRUE;
-
- /* Make sure we never leave a second byte of a double-byte behind,
- * it confuses mb_off2cells(). */
- if (l_enc_dbcs
- && ((mbyte_cells == 1 && (*mb_off2cells)(off, max_off) > 1)
- || (mbyte_cells == 2
- && (*mb_off2cells)(off, max_off) == 1
- && (*mb_off2cells)(off + 1, max_off) > 1)))
- ScreenLines[off + mbyte_blen] = 0;
- ScreenLines[off] = c;
- ScreenAttrs[off] = attr;
- if (l_enc_utf8) {
- if (c < 0x80 && u8cc[0] == 0)
- ScreenLinesUC[off] = 0;
- else {
- int i;
-
- ScreenLinesUC[off] = u8c;
- for (i = 0; i < Screen_mco; ++i) {
- ScreenLinesC[i][off] = u8cc[i];
- if (u8cc[i] == 0)
- break;
- }
- }
- if (mbyte_cells == 2) {
- ScreenLines[off + 1] = 0;
- ScreenAttrs[off + 1] = attr;
- }
- screen_char(off, row, col);
- } else if (mbyte_cells == 2) {
- ScreenLines[off + 1] = ptr[1];
- ScreenAttrs[off + 1] = attr;
- screen_char_2(off, row, col);
- } else if (l_enc_dbcs == DBCS_JPNU && c == 0x8e) {
- ScreenLines2[off] = ptr[1];
- screen_char(off, row, col);
- } else
- screen_char(off, row, col);
- }
- if (l_has_mbyte) {
- off += mbyte_cells;
- col += mbyte_cells;
- ptr += mbyte_blen;
+ if (need_redraw || force_redraw_this) {
+ // When at the end of the text and overwriting a two-cell
+ // character with a one-cell character, need to clear the next
+ // cell. Also when overwriting the left halve of a two-cell char
+ // with the right halve of a two-cell char. Do this only once
+ // (utf8_off2cells() may return 2 on the right halve).
if (clear_next_cell) {
- // This only happens at the end, display one space next.
- ptr = (char_u *)" ";
- len = -1;
+ clear_next_cell = false;
+ } else if ((len < 0 ? ptr[mbyte_blen] == NUL
+ : ptr + mbyte_blen >= text + len)
+ && ((mbyte_cells == 1
+ && grid_off2cells(grid, off, max_off) > 1)
+ || (mbyte_cells == 2
+ && grid_off2cells(grid, off, max_off) == 1
+ && grid_off2cells(grid, off + 1, max_off) > 1))) {
+ clear_next_cell = true;
}
- } else {
- ++off;
- ++col;
- ++ptr;
+
+ schar_copy(grid->chars[off], buf);
+ grid->attrs[off] = attr;
+ if (mbyte_cells == 2) {
+ grid->chars[off + 1][0] = 0;
+ grid->attrs[off + 1] = attr;
+ }
+ if (put_dirty_first == -1) {
+ put_dirty_first = col;
+ }
+ put_dirty_last = col+mbyte_cells;
+ }
+
+ off += mbyte_cells;
+ col += mbyte_cells;
+ ptr += mbyte_blen;
+ if (clear_next_cell) {
+ // This only happens at the end, display one space next.
+ ptr = (char_u *)" ";
+ len = -1;
}
}
- /* If we detected the next character needs to be redrawn, but the text
- * doesn't extend up to there, update the character here. */
- if (force_redraw_next && col < screen_Columns) {
- if (l_enc_dbcs != 0 && dbcs_off2cells(off, max_off) > 1)
- screen_char_2(off, row, col);
- else
- screen_char(off, row, col);
+ if (do_flush) {
+ grid_puts_line_flush(grid, true);
}
}
+/// End a group of screen_puts_len calls and send the screen buffer to the UI
+/// layer.
+///
+/// @param grid The grid which contains the buffer.
+/// @param set_cursor Move the visible cursor to the end of the changed region.
+/// This is a workaround for not yet refactored code paths
+/// and shouldn't be used in new code.
+void grid_puts_line_flush(ScreenGrid *grid, bool set_cursor)
+{
+ assert(put_dirty_row != -1);
+ if (put_dirty_first != -1) {
+ if (set_cursor) {
+ ui_grid_cursor_goto(grid->handle, put_dirty_row,
+ MIN(put_dirty_last, grid->Columns-1));
+ }
+ ui_line(grid, put_dirty_row, put_dirty_first, put_dirty_last,
+ put_dirty_last, 0, false);
+ put_dirty_first = -1;
+ put_dirty_last = 0;
+ }
+ put_dirty_row = -1;
+}
+
/*
* Prepare for 'hlsearch' highlighting.
*/
@@ -5459,8 +5477,7 @@ static void start_search_hl(void)
{
if (p_hls && !no_hlsearch) {
last_pat_prog(&search_hl.rm);
- search_hl.attr = hl_attr(HLF_L);
- /* Set the time limit to 'redrawtime'. */
+ // Set the time limit to 'redrawtime'.
search_hl.tm = profile_setlimit(p_rdt);
}
}
@@ -5476,6 +5493,7 @@ static void end_search_hl(void)
}
}
+
/*
* Init for calling prepare_search_hl().
*/
@@ -5502,7 +5520,9 @@ static void init_search_hl(win_T *wp)
search_hl.buf = wp->w_buffer;
search_hl.lnum = 0;
search_hl.first_lnum = 0;
- /* time limit is set at the toplevel, for all windows */
+ search_hl.attr = win_hl_attr(wp, HLF_L);
+
+ // time limit is set at the toplevel, for all windows
}
/*
@@ -5522,22 +5542,25 @@ static void prepare_search_hl(win_T *wp, linenr_T lnum)
* Do this both for search_hl and the match list.
*/
cur = wp->w_match_head;
- shl_flag = FALSE;
- while (cur != NULL || shl_flag == FALSE) {
- if (shl_flag == FALSE) {
+ shl_flag = false;
+ while (cur != NULL || shl_flag == false) {
+ if (shl_flag == false) {
shl = &search_hl;
- shl_flag = TRUE;
- } else
- shl = &cur->hl;
+ shl_flag = true;
+ } else {
+ shl = &cur->hl; // -V595
+ }
if (shl->rm.regprog != NULL
&& shl->lnum == 0
&& re_multiline(shl->rm.regprog)) {
if (shl->first_lnum == 0) {
for (shl->first_lnum = lnum;
- shl->first_lnum > wp->w_topline; --shl->first_lnum)
- if (hasFoldingWin(wp, shl->first_lnum - 1,
- NULL, NULL, TRUE, NULL))
+ shl->first_lnum > wp->w_topline;
+ shl->first_lnum--) {
+ if (hasFoldingWin(wp, shl->first_lnum - 1, NULL, NULL, true, NULL)) {
break;
+ }
+ }
}
if (cur != NULL) {
cur->pos.cur = 0;
@@ -5546,8 +5569,9 @@ static void prepare_search_hl(win_T *wp, linenr_T lnum)
// in progress
n = 0;
while (shl->first_lnum < lnum && (shl->rm.regprog != NULL
- || (cur != NULL && pos_inprogress))) {
- next_search_hl(wp, shl, shl->first_lnum, (colnr_T)n, cur);
+ || (cur != NULL && pos_inprogress))) {
+ next_search_hl(wp, shl, shl->first_lnum, (colnr_T)n,
+ shl == &search_hl ? NULL : cur);
pos_inprogress = !(cur == NULL || cur->pos.cur == 0);
if (shl->lnum != 0) {
shl->first_lnum = shl->lnum
@@ -5585,6 +5609,7 @@ next_search_hl (
linenr_T l;
colnr_T matchcol;
long nmatched = 0;
+ int save_called_emsg = called_emsg;
if (shl->lnum != 0) {
/* Check for three situations:
@@ -5677,9 +5702,14 @@ next_search_hl (
shl->lnum += shl->rm.startpos[0].lnum;
break; /* useful match found */
}
+
+ // Restore called_emsg for assert_fails().
+ called_emsg = save_called_emsg;
}
}
+/// If there is a match fill "shl" and return one.
+/// Return zero otherwise.
static int
next_search_hl_pos(
match_T *shl, // points to a match
@@ -5689,254 +5719,148 @@ next_search_hl_pos(
)
{
int i;
- int bot = -1;
+ int found = -1;
shl->lnum = 0;
for (i = posmatch->cur; i < MAXPOSMATCH; i++) {
- if (posmatch->pos[i].lnum == 0) {
+ llpos_T *pos = &posmatch->pos[i];
+
+ if (pos->lnum == 0) {
break;
}
- if (posmatch->pos[i].col < mincol) {
+ if (pos->len == 0 && pos->col < mincol) {
continue;
}
- if (posmatch->pos[i].lnum == lnum) {
- if (bot != -1) {
- // partially sort positions by column numbers
- // on the same line
- if (posmatch->pos[i].col < posmatch->pos[bot].col) {
- llpos_T tmp = posmatch->pos[i];
+ if (pos->lnum == lnum) {
+ if (found >= 0) {
+ // if this match comes before the one at "found" then swap
+ // them
+ if (pos->col < posmatch->pos[found].col) {
+ llpos_T tmp = *pos;
- posmatch->pos[i] = posmatch->pos[bot];
- posmatch->pos[bot] = tmp;
+ *pos = posmatch->pos[found];
+ posmatch->pos[found] = tmp;
}
} else {
- bot = i;
- shl->lnum = lnum;
+ found = i;
}
}
}
posmatch->cur = 0;
- if (bot != -1) {
- colnr_T start = posmatch->pos[bot].col == 0
- ? 0: posmatch->pos[bot].col - 1;
- colnr_T end = posmatch->pos[bot].col == 0
- ? MAXCOL : start + posmatch->pos[bot].len;
+ if (found >= 0) {
+ colnr_T start = posmatch->pos[found].col == 0
+ ? 0: posmatch->pos[found].col - 1;
+ colnr_T end = posmatch->pos[found].col == 0
+ ? MAXCOL : start + posmatch->pos[found].len;
+ shl->lnum = lnum;
shl->rm.startpos[0].lnum = 0;
shl->rm.startpos[0].col = start;
shl->rm.endpos[0].lnum = 0;
shl->rm.endpos[0].col = end;
- posmatch->cur = bot + 1;
- return true;
+ shl->is_addpos = true;
+ posmatch->cur = found + 1;
+ return 1;
}
- return false;
+ return 0;
}
-static void screen_start_highlight(int attr)
-{
- screen_attr = attr;
- ui_start_highlight(attr);
-}
-void screen_stop_highlight(void)
+/// Fill the grid from 'start_row' to 'end_row', from 'start_col' to 'end_col'
+/// with character 'c1' in first column followed by 'c2' in the other columns.
+/// Use attributes 'attr'.
+void grid_fill(ScreenGrid *grid, int start_row, int end_row, int start_col,
+ int end_col, int c1, int c2, int attr)
{
- ui_stop_highlight();
- screen_attr = 0;
-}
+ schar_T sc;
-/*
- * Put character ScreenLines["off"] on the screen at position "row" and "col",
- * using the attributes from ScreenAttrs["off"].
- */
-static void screen_char(unsigned off, int row, int col)
-{
- int attr;
-
- /* Check for illegal values, just in case (could happen just after
- * resizing). */
- if (row >= screen_Rows || col >= screen_Columns)
- return;
+ int row_off = 0, col_off = 0;
+ screen_adjust_grid(&grid, &row_off, &col_off);
+ start_row += row_off;
+ end_row += row_off;
+ start_col += col_off;
+ end_col += col_off;
- /* Outputting the last character on the screen may scrollup the screen.
- * Don't to it! Mark the character invalid (update it when scrolled up) */
- if (row == screen_Rows - 1 && col == screen_Columns - 1
- /* account for first command-line character in rightleft mode */
- && !cmdmsg_rl
- ) {
- ScreenAttrs[off] = (sattr_T)-1;
- return;
+ // safety check
+ if (end_row > grid->Rows) {
+ end_row = grid->Rows;
}
-
- /*
- * Stop highlighting first, so it's easier to move the cursor.
- */
- attr = ScreenAttrs[off];
- if (screen_attr != attr)
- screen_stop_highlight();
-
- ui_cursor_goto(row, col);
-
- if (screen_attr != attr)
- screen_start_highlight(attr);
-
- if (enc_utf8 && ScreenLinesUC[off] != 0) {
- char_u buf[MB_MAXBYTES + 1];
-
- // Convert UTF-8 character to bytes and write it.
- buf[utfc_char2bytes(off, buf)] = NUL;
- ui_puts(buf);
- } else {
- ui_putc(ScreenLines[off]);
- // double-byte character in single-width cell
- if (enc_dbcs == DBCS_JPNU && ScreenLines[off] == 0x8e) {
- ui_putc(ScreenLines2[off]);
- }
+ if (end_col > grid->Columns) {
+ end_col = grid->Columns;
}
-}
-
-/*
- * Used for enc_dbcs only: Put one double-wide character at ScreenLines["off"]
- * on the screen at position 'row' and 'col'.
- * The attributes of the first byte is used for all. This is required to
- * output the two bytes of a double-byte character with nothing in between.
- */
-static void screen_char_2(unsigned off, int row, int col)
-{
- /* Check for illegal values (could be wrong when screen was resized). */
- if (off + 1 >= (unsigned)(screen_Rows * screen_Columns))
- return;
- /* Outputting the last character on the screen may scrollup the screen.
- * Don't to it! Mark the character invalid (update it when scrolled up) */
- if (row == screen_Rows - 1 && col >= screen_Columns - 2) {
- ScreenAttrs[off] = (sattr_T)-1;
+ // nothing to do
+ if (grid->chars == NULL || start_row >= end_row || start_col >= end_col) {
return;
}
- /* Output the first byte normally (positions the cursor), then write the
- * second byte directly. */
- screen_char(off, row, col);
- ui_putc(ScreenLines[off + 1]);
-}
-
-/*
- * Fill the screen from 'start_row' to 'end_row', from 'start_col' to 'end_col'
- * with character 'c1' in first column followed by 'c2' in the other columns.
- * Use attributes 'attr'.
- */
-void screen_fill(int start_row, int end_row, int start_col, int end_col, int c1, int c2, int attr)
-{
- int row;
- int col;
- int off;
- int end_off;
- int did_delete;
- int c;
-
- if (end_row > screen_Rows) /* safety check */
- end_row = screen_Rows;
- if (end_col > screen_Columns) /* safety check */
- end_col = screen_Columns;
- if (ScreenLines == NULL
- || start_row >= end_row
- || start_col >= end_col) /* nothing to do */
- return;
-
- /* it's a "normal" terminal when not in a GUI or cterm */
- for (row = start_row; row < end_row; ++row) {
+ for (int row = start_row; row < end_row; row++) {
if (has_mbyte) {
// When drawing over the right halve of a double-wide char clear
// out the left halve. When drawing over the left halve of a
// double wide-char clear out the right halve. Only needed in a
// terminal.
- if (start_col > 0 && mb_fix_col(start_col, row) != start_col) {
- screen_puts_len((char_u *)" ", 1, row, start_col - 1, 0);
+ if (start_col > 0 && grid_fix_col(grid, start_col, row) != start_col) {
+ grid_puts_len(grid, (char_u *)" ", 1, row, start_col - 1, 0);
}
- if (end_col < screen_Columns && mb_fix_col(end_col, row) != end_col) {
- screen_puts_len((char_u *)" ", 1, row, end_col, 0);
+ if (end_col < grid->Columns
+ && grid_fix_col(grid, end_col, row) != end_col) {
+ grid_puts_len(grid, (char_u *)" ", 1, row, end_col, 0);
}
}
- /*
- * Try to use delete-line termcap code, when no attributes or in a
- * "normal" terminal, where a bold/italic space is just a
- * space.
- */
- did_delete = FALSE;
- if (c2 == ' '
- && end_col == Columns
- && attr == 0) {
- /*
- * check if we really need to clear something
- */
- col = start_col;
- if (c1 != ' ') /* don't clear first char */
- ++col;
-
- off = LineOffset[row] + col;
- end_off = LineOffset[row] + end_col;
- /* skip blanks (used often, keep it fast!) */
- if (enc_utf8)
- while (off < end_off && ScreenLines[off] == ' '
- && ScreenAttrs[off] == 0 && ScreenLinesUC[off] == 0)
- ++off;
- else
- while (off < end_off && ScreenLines[off] == ' '
- && ScreenAttrs[off] == 0)
- ++off;
- if (off < end_off) { /* something to be cleared */
- col = off - LineOffset[row];
- screen_stop_highlight();
- ui_cursor_goto(row, col); // clear rest of this screen line
- ui_eol_clear();
- col = end_col - col;
- while (col--) { /* clear chars in ScreenLines */
- ScreenLines[off] = ' ';
- if (enc_utf8)
- ScreenLinesUC[off] = 0;
- ScreenAttrs[off] = 0;
- ++off;
+ // if grid was resized (in ext_multigrid mode), the UI has no redraw updates
+ // for the newly resized grid. It is better mark everything as dirty and
+ // send all the updates.
+ int dirty_first = INT_MAX;
+ int dirty_last = 0;
+
+ int col = start_col;
+ schar_from_char(sc, c1);
+ int lineoff = grid->line_offset[row];
+ for (col = start_col; col < end_col; col++) {
+ int off = lineoff + col;
+ if (schar_cmp(grid->chars[off], sc)
+ || grid->attrs[off] != attr) {
+ schar_copy(grid->chars[off], sc);
+ grid->attrs[off] = attr;
+ if (dirty_first == INT_MAX) {
+ dirty_first = col;
+ }
+ dirty_last = col+1;
+ }
+ if (col == start_col) {
+ schar_from_char(sc, c2);
+ }
+ }
+ if (dirty_last > dirty_first) {
+ // TODO(bfredl): support a cleared suffix even with a batched line?
+ if (put_dirty_row == row) {
+ if (put_dirty_first == -1) {
+ put_dirty_first = dirty_first;
}
+ put_dirty_last = MAX(put_dirty_last, dirty_last);
+ } else {
+ int last = c2 != ' ' ? dirty_last : dirty_first + (c1 != ' ');
+ ui_line(grid, row, dirty_first, last, dirty_last, attr, false);
}
- did_delete = TRUE; /* the chars are cleared now */
}
- off = LineOffset[row] + start_col;
- c = c1;
- for (col = start_col; col < end_col; ++col) {
- if (ScreenLines[off] != c
- || (enc_utf8 && (int)ScreenLinesUC[off]
- != (c >= 0x80 ? c : 0))
- || ScreenAttrs[off] != attr
- ) {
- ScreenLines[off] = c;
- if (enc_utf8) {
- if (c >= 0x80) {
- ScreenLinesUC[off] = c;
- ScreenLinesC[0][off] = 0;
- } else
- ScreenLinesUC[off] = 0;
- }
- ScreenAttrs[off] = attr;
- if (!did_delete || c != ' ')
- screen_char(off, row, col);
+ if (end_col == grid->Columns) {
+ grid->line_wraps[row] = false;
+ }
+
+ // TODO(bfredl): The relevant caller should do this
+ if (row == default_grid.Rows - 1) { // overwritten the command line
+ redraw_cmdline = true;
+ if (start_col == 0 && end_col == Columns
+ && c1 == ' ' && c2 == ' ' && attr == 0) {
+ clear_cmdline = false; // command line has been cleared
}
- ++off;
- if (col == start_col) {
- if (did_delete)
- break;
- c = c2;
+ if (start_col == 0) {
+ mode_displayed = false; // mode cleared or overwritten
}
}
- if (end_col == Columns)
- LineWraps[row] = FALSE;
- if (row == Rows - 1) { /* overwritten the command line */
- redraw_cmdline = TRUE;
- if (c1 == ' ' && c2 == ' ')
- clear_cmdline = FALSE; /* command line has been cleared */
- if (start_col == 0)
- mode_displayed = FALSE; /* mode cleared or overwritten */
- }
}
}
@@ -5965,57 +5889,106 @@ void check_for_delay(int check_msg_scroll)
*/
int screen_valid(int doclear)
{
- screenalloc(doclear); /* allocate screen buffers if size changed */
- return ScreenLines != NULL;
+ screenalloc(doclear); // allocate screen buffers if size changed
+ return default_grid.chars != NULL;
}
-/*
- * Resize the shell to Rows and Columns.
- * Allocate ScreenLines[] and associated items.
- *
- * There may be some time between setting Rows and Columns and (re)allocating
- * ScreenLines[]. This happens when starting up and when (manually) changing
- * the shell size. Always use screen_Rows and screen_Columns to access items
- * in ScreenLines[]. Use Rows and Columns for positioning text etc. where the
- * final size of the shell is needed.
- */
+/// (Re)allocates a window grid if size changed while in ext_multigrid mode.
+/// Updates size, offsets and handle for the grid regardless.
+///
+/// If "doclear" is true, don't try to copy from the old grid rather clear the
+/// resized grid.
+void win_grid_alloc(win_T *wp)
+{
+ ScreenGrid *grid = &wp->w_grid;
+
+ int rows = grid->requested_rows;
+ if (rows == 0) {
+ rows = wp->w_height;
+ }
+
+ int columns = grid->requested_cols;
+ if (columns == 0) {
+ columns = wp->w_width;
+ }
+
+ // TODO(bfredl): floating windows should force this to true
+ bool want_allocation = ui_is_external(kUIMultigrid);
+ bool has_allocation = (grid->chars != NULL);
+
+ if (want_allocation && has_allocation && highlights_invalid) {
+ grid_invalidate(grid);
+ }
+
+ int was_resized = false;
+ if ((has_allocation != want_allocation)
+ || grid->Rows != rows
+ || grid->Columns != columns) {
+ if (want_allocation) {
+ grid_alloc(grid, rows, columns, true);
+ win_free_lsize(wp);
+ win_alloc_lines(wp);
+ } else {
+ // Single grid mode, all rendering will be redirected to default_grid.
+ // Only keep track of the size and offset of the window.
+ grid_free(grid);
+ grid->Rows = rows;
+ grid->Columns = columns;
+ }
+ was_resized = true;
+ }
+
+ grid->row_offset = wp->w_winrow;
+ grid->col_offset = wp->w_wincol;
+
+ // send grid resize event if:
+ // - a grid was just resized
+ // - screen_resize was called and all grid sizes must be sent
+ // - the UI wants multigrid event (necessary)
+ if ((send_grid_resize || was_resized) && ui_is_external(kUIMultigrid)) {
+ ui_call_grid_resize(grid->handle, grid->Columns, grid->Rows);
+ }
+}
+
+/// assign a handle to the grid. The grid need not be allocated.
+void grid_assign_handle(ScreenGrid *grid)
+{
+ static int last_grid_handle = DEFAULT_GRID_HANDLE;
+
+ // only assign a grid handle if not already
+ if (grid->handle == 0) {
+ grid->handle = ++last_grid_handle;
+ }
+}
+
+/// Resize the screen to Rows and Columns.
+///
+/// Allocate default_grid.chars[] and other grid arrays.
+///
+/// There may be some time between setting Rows and Columns and (re)allocating
+/// default_grid arrays. This happens when starting up and when
+/// (manually) changing the shell size. Always use default_grid.Rows and
+/// default_grid.Columns to access items in default_grid.chars[]. Use Rows
+/// and Columns for positioning text etc. where the final size of the shell is
+/// needed.
void screenalloc(bool doclear)
{
- int new_row, old_row;
- int outofmem = FALSE;
- int len;
- schar_T *new_ScreenLines;
- u8char_T *new_ScreenLinesUC = NULL;
- u8char_T *new_ScreenLinesC[MAX_MCO];
- schar_T *new_ScreenLines2 = NULL;
- int i;
- sattr_T *new_ScreenAttrs;
- unsigned *new_LineOffset;
- char_u *new_LineWraps;
- StlClickDefinition *new_tab_page_click_defs;
static bool entered = false; // avoid recursiveness
- static bool done_outofmem_msg = false;
int retry_count = 0;
- const bool l_enc_utf8 = enc_utf8;
- const int l_enc_dbcs = enc_dbcs;
retry:
- /*
- * Allocation of the screen buffers is done only when the size changes and
- * when Rows and Columns have been set and we have started doing full
- * screen stuff.
- */
- if ((ScreenLines != NULL
- && Rows == screen_Rows
- && Columns == screen_Columns
- && l_enc_utf8 == (ScreenLinesUC != NULL)
- && (l_enc_dbcs == DBCS_JPNU) == (ScreenLines2 != NULL)
- && p_mco == Screen_mco
+ // Allocation of the screen buffers is done only when the size changes and
+ // when Rows and Columns have been set and we have started doing full
+ // screen stuff.
+ if ((default_grid.chars != NULL
+ && Rows == default_grid.Rows
+ && Columns == default_grid.Columns
)
|| Rows == 0
|| Columns == 0
- || (!full_screen && ScreenLines == NULL))
+ || (!full_screen && default_grid.chars == NULL)) {
return;
+ }
/*
* It's possible that we produce an out-of-memory message below, which
@@ -6036,39 +6009,24 @@ retry:
comp_col(); /* recompute columns for shown command and ruler */
- /*
- * We're changing the size of the screen.
- * - Allocate new arrays for ScreenLines and ScreenAttrs.
- * - Move lines from the old arrays into the new arrays, clear extra
- * lines (unless the screen is going to be cleared).
- * - Free the old arrays.
- *
- * If anything fails, make ScreenLines NULL, so we don't do anything!
- * Continuing with the old ScreenLines may result in a crash, because the
- * size is wrong.
- */
+ // We're changing the size of the screen.
+ // - Allocate new arrays for default_grid
+ // - Move lines from the old arrays into the new arrays, clear extra
+ // lines (unless the screen is going to be cleared).
+ // - Free the old arrays.
+ //
+ // If anything fails, make grid arrays NULL, so we don't do anything!
+ // Continuing with the old arrays may result in a crash, because the
+ // size is wrong.
FOR_ALL_TAB_WINDOWS(tp, wp) {
win_free_lsize(wp);
}
if (aucmd_win != NULL)
win_free_lsize(aucmd_win);
- new_ScreenLines = xmalloc((size_t)((Rows + 1) * Columns * sizeof(schar_T)));
- memset(new_ScreenLinesC, 0, sizeof(u8char_T *) * MAX_MCO);
- if (l_enc_utf8) {
- new_ScreenLinesUC = xmalloc(
- (size_t)((Rows + 1) * Columns * sizeof(u8char_T)));
- for (i = 0; i < p_mco; ++i)
- new_ScreenLinesC[i] = xcalloc((Rows + 1) * Columns, sizeof(u8char_T));
- }
- if (l_enc_dbcs == DBCS_JPNU)
- new_ScreenLines2 = xmalloc(
- (size_t)((Rows + 1) * Columns * sizeof(schar_T)));
- new_ScreenAttrs = xmalloc((size_t)((Rows + 1) * Columns * sizeof(sattr_T)));
- new_LineOffset = xmalloc((size_t)(Rows * sizeof(unsigned)));
- new_LineWraps = xmalloc((size_t)(Rows * sizeof(char_u)));
- new_tab_page_click_defs = xcalloc(
- (size_t) Columns, sizeof(*new_tab_page_click_defs));
+ grid_alloc(&default_grid, Rows, Columns, !doclear);
+ StlClickDefinition *new_tab_page_click_defs = xcalloc(
+ (size_t)Columns, sizeof(*new_tab_page_click_defs));
FOR_ALL_TAB_WINDOWS(tp, wp) {
win_alloc_lines(wp);
@@ -6077,128 +6035,15 @@ retry:
win_alloc_lines(aucmd_win);
}
- for (i = 0; i < p_mco; ++i)
- if (new_ScreenLinesC[i] == NULL)
- break;
- if (new_ScreenLines == NULL
- || (l_enc_utf8 && (new_ScreenLinesUC == NULL || i != p_mco))
- || (l_enc_dbcs == DBCS_JPNU && new_ScreenLines2 == NULL)
- || new_ScreenAttrs == NULL
- || new_LineOffset == NULL
- || new_LineWraps == NULL
- || new_tab_page_click_defs == NULL
- || outofmem) {
- if (ScreenLines != NULL || !done_outofmem_msg) {
- /* guess the size */
- do_outofmem_msg((Rows + 1) * Columns);
-
- /* Remember we did this to avoid getting outofmem messages over
- * and over again. */
- done_outofmem_msg = TRUE;
- }
- xfree(new_ScreenLines);
- new_ScreenLines = NULL;
- xfree(new_ScreenLinesUC);
- new_ScreenLinesUC = NULL;
- for (i = 0; i < p_mco; ++i) {
- xfree(new_ScreenLinesC[i]);
- new_ScreenLinesC[i] = NULL;
- }
- xfree(new_ScreenLines2);
- new_ScreenLines2 = NULL;
- xfree(new_ScreenAttrs);
- new_ScreenAttrs = NULL;
- xfree(new_LineOffset);
- new_LineOffset = NULL;
- xfree(new_LineWraps);
- new_LineWraps = NULL;
- xfree(new_tab_page_click_defs);
- new_tab_page_click_defs = NULL;
- } else {
- done_outofmem_msg = FALSE;
-
- for (new_row = 0; new_row < Rows; ++new_row) {
- new_LineOffset[new_row] = new_row * Columns;
- new_LineWraps[new_row] = FALSE;
-
- /*
- * If the screen is not going to be cleared, copy as much as
- * possible from the old screen to the new one and clear the rest
- * (used when resizing the window at the "--more--" prompt or when
- * executing an external command, for the GUI).
- */
- if (!doclear) {
- (void)memset(new_ScreenLines + new_row * Columns,
- ' ', (size_t)Columns * sizeof(schar_T));
- if (l_enc_utf8) {
- (void)memset(new_ScreenLinesUC + new_row * Columns,
- 0, (size_t)Columns * sizeof(u8char_T));
- for (i = 0; i < p_mco; ++i)
- (void)memset(new_ScreenLinesC[i]
- + new_row * Columns,
- 0, (size_t)Columns * sizeof(u8char_T));
- }
- if (l_enc_dbcs == DBCS_JPNU)
- (void)memset(new_ScreenLines2 + new_row * Columns,
- 0, (size_t)Columns * sizeof(schar_T));
- (void)memset(new_ScreenAttrs + new_row * Columns,
- 0, (size_t)Columns * sizeof(sattr_T));
- old_row = new_row + (screen_Rows - Rows);
- if (old_row >= 0 && ScreenLines != NULL) {
- if (screen_Columns < Columns)
- len = screen_Columns;
- else
- len = Columns;
- /* When switching to utf-8 don't copy characters, they
- * may be invalid now. Also when p_mco changes. */
- if (!(l_enc_utf8 && ScreenLinesUC == NULL)
- && p_mco == Screen_mco)
- memmove(new_ScreenLines + new_LineOffset[new_row],
- ScreenLines + LineOffset[old_row],
- (size_t)len * sizeof(schar_T));
- if (l_enc_utf8 && ScreenLinesUC != NULL
- && p_mco == Screen_mco) {
- memmove(new_ScreenLinesUC + new_LineOffset[new_row],
- ScreenLinesUC + LineOffset[old_row],
- (size_t)len * sizeof(u8char_T));
- for (i = 0; i < p_mco; ++i)
- memmove(new_ScreenLinesC[i]
- + new_LineOffset[new_row],
- ScreenLinesC[i] + LineOffset[old_row],
- (size_t)len * sizeof(u8char_T));
- }
- if (l_enc_dbcs == DBCS_JPNU && ScreenLines2 != NULL)
- memmove(new_ScreenLines2 + new_LineOffset[new_row],
- ScreenLines2 + LineOffset[old_row],
- (size_t)len * sizeof(schar_T));
- memmove(new_ScreenAttrs + new_LineOffset[new_row],
- ScreenAttrs + LineOffset[old_row],
- (size_t)len * sizeof(sattr_T));
- }
- }
- }
- /* Use the last line of the screen for the current line. */
- current_ScreenLine = new_ScreenLines + Rows * Columns;
- }
-
- free_screenlines();
+ clear_tab_page_click_defs(tab_page_click_defs, tab_page_click_defs_size);
+ xfree(tab_page_click_defs);
- ScreenLines = new_ScreenLines;
- ScreenLinesUC = new_ScreenLinesUC;
- for (i = 0; i < p_mco; ++i)
- ScreenLinesC[i] = new_ScreenLinesC[i];
- Screen_mco = p_mco;
- ScreenLines2 = new_ScreenLines2;
- ScreenAttrs = new_ScreenAttrs;
- LineOffset = new_LineOffset;
- LineWraps = new_LineWraps;
tab_page_click_defs = new_tab_page_click_defs;
- tab_page_click_defs_size = Columns;
+ tab_page_click_defs_size = default_grid.Columns;
- /* It's important that screen_Rows and screen_Columns reflect the actual
- * size of ScreenLines[]. Set them before calling anything. */
- screen_Rows = Rows;
- screen_Columns = Columns;
+ default_grid.row_offset = 0;
+ default_grid.col_offset = 0;
+ default_grid.handle = DEFAULT_GRID_HANDLE;
must_redraw = CLEAR; /* need to clear the screen later */
if (doclear)
@@ -6220,20 +6065,75 @@ retry:
}
}
-void free_screenlines(void)
+void grid_alloc(ScreenGrid *grid, int rows, int columns, bool copy)
{
- int i;
+ int new_row;
+ ScreenGrid new = *grid;
+
+ size_t ncells = (size_t)((rows+1) * columns);
+ new.chars = xmalloc(ncells * sizeof(schar_T));
+ new.attrs = xmalloc(ncells * sizeof(sattr_T));
+ new.line_offset = xmalloc((size_t)(rows * sizeof(unsigned)));
+ new.line_wraps = xmalloc((size_t)(rows * sizeof(char_u)));
+
+ new.Rows = rows;
+ new.Columns = columns;
+
+ for (new_row = 0; new_row < new.Rows; new_row++) {
+ new.line_offset[new_row] = new_row * new.Columns;
+ new.line_wraps[new_row] = false;
+
+ grid_clear_line(&new, new.line_offset[new_row], columns, true);
+
+ if (copy) {
+ // If the screen is not going to be cleared, copy as much as
+ // possible from the old screen to the new one and clear the rest
+ // (used when resizing the window at the "--more--" prompt or when
+ // executing an external command, for the GUI).
+ if (new_row < grid->Rows && grid->chars != NULL) {
+ int len = MIN(grid->Columns, new.Columns);
+ memmove(new.chars + new.line_offset[new_row],
+ grid->chars + grid->line_offset[new_row],
+ (size_t)len * sizeof(schar_T));
+ memmove(new.attrs + new.line_offset[new_row],
+ grid->attrs + grid->line_offset[new_row],
+ (size_t)len * sizeof(sattr_T));
+ }
+ }
+ }
+ grid_free(grid);
+ *grid = new;
- xfree(ScreenLinesUC);
- for (i = 0; i < Screen_mco; ++i)
- xfree(ScreenLinesC[i]);
- xfree(ScreenLines2);
- xfree(ScreenLines);
- xfree(ScreenAttrs);
- xfree(LineOffset);
- xfree(LineWraps);
- clear_tab_page_click_defs(tab_page_click_defs, tab_page_click_defs_size);
- xfree(tab_page_click_defs);
+ // Share a single scratch buffer for all grids, by
+ // ensuring it is as wide as the widest grid.
+ if (linebuf_size < (size_t)columns) {
+ xfree(linebuf_char);
+ xfree(linebuf_attr);
+ linebuf_char = xmalloc(columns * sizeof(schar_T));
+ linebuf_attr = xmalloc(columns * sizeof(sattr_T));
+ linebuf_size = columns;
+ }
+}
+
+void grid_free(ScreenGrid *grid)
+{
+ xfree(grid->chars);
+ xfree(grid->attrs);
+ xfree(grid->line_offset);
+ xfree(grid->line_wraps);
+
+ grid->chars = NULL;
+ grid->attrs = NULL;
+ grid->line_offset = NULL;
+ grid->line_wraps = NULL;
+}
+
+/// Doesn't allow reinit, so must only be called by free_all_mem!
+void screen_free_all_mem(void)
+{
+ grid_free(&default_grid);
+ xfree(linebuf_char);
+ xfree(linebuf_attr);
}
/// Clear tab_page_click_defs table
@@ -6264,73 +6164,63 @@ static void screenclear2(void)
{
int i;
- if (starting == NO_SCREEN || ScreenLines == NULL) {
+ if (starting == NO_SCREEN || default_grid.chars == NULL) {
return;
}
- screen_stop_highlight(); /* don't want highlighting here */
+ // blank out the default grid
+ for (i = 0; i < default_grid.Rows; i++) {
+ grid_clear_line(&default_grid, default_grid.line_offset[i],
+ (int)default_grid.Columns, true);
+ default_grid.line_wraps[i] = false;
+ }
+ ui_call_grid_clear(1); // clear the display
+ clear_cmdline = false;
+ mode_displayed = false;
- /* blank out ScreenLines */
- for (i = 0; i < Rows; ++i) {
- lineclear(LineOffset[i], (int)Columns);
- LineWraps[i] = FALSE;
+ redraw_all_later(NOT_VALID);
+ redraw_cmdline = true;
+ redraw_tabline = true;
+ if (must_redraw == CLEAR) {
+ must_redraw = NOT_VALID; // no need to clear again
}
-
- ui_clear(); // clear the display
- clear_cmdline = FALSE;
- mode_displayed = FALSE;
- screen_cleared = TRUE; /* can use contents of ScreenLines now */
-
- win_rest_invalid(firstwin);
- redraw_cmdline = TRUE;
- redraw_tabline = TRUE;
- if (must_redraw == CLEAR) /* no need to clear again */
- must_redraw = NOT_VALID;
compute_cmdrow();
- msg_row = cmdline_row; /* put cursor on last line for messages */
+ msg_row = cmdline_row; // put cursor on last line for messages
msg_col = 0;
- msg_scrolled = 0; /* can't scroll back */
- msg_didany = FALSE;
- msg_didout = FALSE;
+ msg_scrolled = 0; // can't scroll back
+ msg_didany = false;
+ msg_didout = false;
}
-/*
- * Clear one line in ScreenLines.
- */
-static void lineclear(unsigned off, int width)
+/// clear a line in the grid starting at "off" until "width" characters
+/// are cleared.
+static void grid_clear_line(ScreenGrid *grid, unsigned off, int width,
+ bool valid)
{
- (void)memset(ScreenLines + off, ' ', (size_t)width * sizeof(schar_T));
- if (enc_utf8)
- (void)memset(ScreenLinesUC + off, 0,
- (size_t)width * sizeof(u8char_T));
- (void)memset(ScreenAttrs + off, 0, (size_t)width * sizeof(sattr_T));
+ for (int col = 0; col < width; col++) {
+ schar_from_ascii(grid->chars[off + col], ' ');
+ }
+ int fill = valid ? 0 : -1;
+ (void)memset(grid->attrs + off, fill, (size_t)width * sizeof(sattr_T));
}
-/*
- * Copy part of a Screenline for vertically split window "wp".
- */
-static void linecopy(int to, int from, win_T *wp)
+static void grid_invalidate(ScreenGrid *grid)
{
- unsigned off_to = LineOffset[to] + wp->w_wincol;
- unsigned off_from = LineOffset[from] + wp->w_wincol;
-
- memmove(ScreenLines + off_to, ScreenLines + off_from,
- wp->w_width * sizeof(schar_T));
- if (enc_utf8) {
- int i;
-
- memmove(ScreenLinesUC + off_to, ScreenLinesUC + off_from,
- wp->w_width * sizeof(u8char_T));
- for (i = 0; i < p_mco; ++i)
- memmove(ScreenLinesC[i] + off_to, ScreenLinesC[i] + off_from,
- wp->w_width * sizeof(u8char_T));
- }
- if (enc_dbcs == DBCS_JPNU)
- memmove(ScreenLines2 + off_to, ScreenLines2 + off_from,
- wp->w_width * sizeof(schar_T));
- memmove(ScreenAttrs + off_to, ScreenAttrs + off_from,
- wp->w_width * sizeof(sattr_T));
+ (void)memset(grid->attrs, -1, grid->Rows * grid->Columns * sizeof(sattr_T));
+}
+
+
+/// Copy part of a grid line for vertically split window.
+static void linecopy(ScreenGrid *grid, int to, int from, int col, int width)
+{
+ unsigned off_to = grid->line_offset[to] + col;
+ unsigned off_from = grid->line_offset[from] + col;
+
+ memmove(grid->chars + off_to, grid->chars + off_from,
+ width * sizeof(schar_T));
+ memmove(grid->attrs + off_to, grid->attrs + off_from,
+ width * sizeof(sattr_T));
}
/*
@@ -6340,186 +6230,62 @@ void setcursor(void)
{
if (redrawing()) {
validate_cursor();
- ui_cursor_goto(curwin->w_winrow + curwin->w_wrow,
- curwin->w_wincol + (
- /* With 'rightleft' set and the cursor on a double-wide
- * character, position it on the leftmost column. */
- curwin->w_p_rl ? (curwin->w_width - curwin->w_wcol - (
- (has_mbyte
- && (*mb_ptr2cells)(get_cursor_pos_ptr()) == 2
- && vim_isprintc(gchar_cursor())) ? 2 :
- 1)) :
- curwin->w_wcol));
- }
-}
-
-/*
- * insert 'line_count' lines at 'row' in window 'wp'
- * if 'invalid' is TRUE the wp->w_lines[].wl_lnum is invalidated.
- * if 'mayclear' is TRUE the screen will be cleared if it is faster than
- * scrolling.
- * Returns FAIL if the lines are not inserted, OK for success.
- */
-int win_ins_lines(win_T *wp, int row, int line_count, int invalid, int mayclear)
-{
- int did_delete;
- int nextrow;
- int lastrow;
- int retval;
-
- if (invalid)
- wp->w_lines_valid = 0;
-
- if (wp->w_height < 5)
- return FAIL;
-
- if (line_count > wp->w_height - row)
- line_count = wp->w_height - row;
-
- retval = win_do_lines(wp, row, line_count, mayclear, FALSE);
- if (retval != MAYBE)
- return retval;
- /*
- * If there is a next window or a status line, we first try to delete the
- * lines at the bottom to avoid messing what is after the window.
- * If this fails and there are following windows, don't do anything to avoid
- * messing up those windows, better just redraw.
- */
- did_delete = FALSE;
- if (wp->w_next != NULL || wp->w_status_height) {
- if (screen_del_lines(0, wp->w_winrow + wp->w_height - line_count,
- line_count, (int)Rows, NULL) == OK)
- did_delete = TRUE;
- else if (wp->w_next)
- return FAIL;
- }
- /*
- * if no lines deleted, blank the lines that will end up below the window
- */
- if (!did_delete) {
- wp->w_redr_status = TRUE;
- redraw_cmdline = TRUE;
- nextrow = wp->w_winrow + wp->w_height + wp->w_status_height;
- lastrow = nextrow + line_count;
- if (lastrow > Rows)
- lastrow = Rows;
- screen_fill(nextrow - line_count, lastrow - line_count,
- wp->w_wincol, W_ENDCOL(wp),
- ' ', ' ', 0);
- }
-
- if (screen_ins_lines(0, wp->w_winrow + row, line_count, (int)Rows, NULL)
- == FAIL) {
- /* deletion will have messed up other windows */
- if (did_delete) {
- wp->w_redr_status = TRUE;
- win_rest_invalid(wp->w_next);
+ ScreenGrid *grid = &curwin->w_grid;
+ int row = curwin->w_wrow;
+ int col = curwin->w_wcol;
+ if (curwin->w_p_rl) {
+ // With 'rightleft' set and the cursor on a double-wide character,
+ // position it on the leftmost column.
+ col = curwin->w_grid.Columns - curwin->w_wcol
+ - ((utf_ptr2cells(get_cursor_pos_ptr()) == 2
+ && vim_isprintc(gchar_cursor())) ? 2 : 1);
}
- return FAIL;
- }
- return OK;
+ screen_adjust_grid(&grid, &row, &col);
+ ui_grid_cursor_goto(grid->handle, row, col);
+ }
}
-/*
- * delete "line_count" window lines at "row" in window "wp"
- * If "invalid" is TRUE curwin->w_lines[] is invalidated.
- * If "mayclear" is TRUE the screen will be cleared if it is faster than
- * scrolling
- * Return OK for success, FAIL if the lines are not deleted.
- */
-int win_del_lines(win_T *wp, int row, int line_count, int invalid, int mayclear)
+/// Insert 'line_count' lines at 'row' in window 'wp'.
+/// Returns FAIL if the lines are not inserted, OK for success.
+int win_ins_lines(win_T *wp, int row, int line_count)
{
- int retval;
-
- if (invalid)
- wp->w_lines_valid = 0;
-
- if (line_count > wp->w_height - row)
- line_count = wp->w_height - row;
-
- retval = win_do_lines(wp, row, line_count, mayclear, TRUE);
- if (retval != MAYBE)
- return retval;
-
- if (screen_del_lines(0, wp->w_winrow + row, line_count,
- (int)Rows, NULL) == FAIL) {
- return FAIL;
- }
+ return win_do_lines(wp, row, line_count, false);
+}
- /*
- * If there are windows or status lines below, try to put them at the
- * correct place. If we can't do that, they have to be redrawn.
- */
- if (wp->w_next || wp->w_status_height || cmdline_row < Rows - 1) {
- if (screen_ins_lines(0, wp->w_winrow + wp->w_height - line_count,
- line_count, (int)Rows, NULL) == FAIL) {
- wp->w_redr_status = TRUE;
- win_rest_invalid(wp->w_next);
- }
- }
- /*
- * If this is the last window and there is no status line, redraw the
- * command line later.
- */
- else
- redraw_cmdline = TRUE;
- return OK;
+/// Delete "line_count" window lines at "row" in window "wp".
+/// Return OK for success, FAIL if the lines are not deleted.
+int win_del_lines(win_T *wp, int row, int line_count)
+{
+ return win_do_lines(wp, row, line_count, true);
}
// Common code for win_ins_lines() and win_del_lines().
// Returns OK or FAIL when the work has been done.
-static int win_do_lines(win_T *wp, int row, int line_count, int mayclear, int del)
+static int win_do_lines(win_T *wp, int row, int line_count, int del)
{
if (!redrawing() || line_count <= 0) {
return FAIL;
}
- // only a few lines left: redraw is faster
- if (mayclear && Rows - line_count < 5 && wp->w_width == Columns) {
- screenclear(); /* will set wp->w_lines_valid to 0 */
- return FAIL;
- }
-
- // Delete all remaining lines
- if (row + line_count >= wp->w_height) {
- screen_fill(wp->w_winrow + row, wp->w_winrow + wp->w_height,
- wp->w_wincol, W_ENDCOL(wp),
- ' ', ' ', 0);
+ // No lines are being moved, just draw over the entire area
+ if (row + line_count >= wp->w_grid.Rows) {
return OK;
}
- // when scrolling, the message on the command line should be cleared,
- // otherwise it will stay there forever.
- clear_cmdline = TRUE;
int retval;
- ui_set_scroll_region(wp, row);
if (del) {
- retval = screen_del_lines(wp->w_winrow + row, 0, line_count,
- wp->w_height - row, wp);
+ retval = grid_del_lines(&wp->w_grid, row, line_count,
+ wp->w_grid.Rows, 0, wp->w_grid.Columns);
} else {
- retval = screen_ins_lines(wp->w_winrow + row, 0, line_count,
- wp->w_height - row, wp);
+ retval = grid_ins_lines(&wp->w_grid, row, line_count,
+ wp->w_grid.Rows, 0, wp->w_grid.Columns);
}
- ui_reset_scroll_region();
return retval;
}
/*
- * window 'wp' and everything after it is messed up, mark it for redraw
- */
-static void win_rest_invalid(win_T *wp)
-{
- while (wp != NULL) {
- redraw_win_later(wp, NOT_VALID);
- wp->w_redr_status = TRUE;
- wp = wp->w_next;
- }
- redraw_cmdline = TRUE;
-}
-
-/*
* The rest of the routines in this file perform screen manipulations. The
* given operation is performed physically on the screen. The corresponding
* change is also made to the internal screen image. In this way, the editor
@@ -6530,115 +6296,114 @@ static void win_rest_invalid(win_T *wp)
*/
-// insert lines on the screen and update ScreenLines[]
-// 'end' is the line after the scrolled part. Normally it is Rows.
-// When scrolling region used 'off' is the offset from the top for the region.
-// 'row' and 'end' are relative to the start of the region.
+/// insert lines on the screen and move the existing lines down
+/// 'line_count' is the number of lines to be inserted.
+/// 'end' is the line after the scrolled part. Normally it is Rows.
+/// 'col' is the column from with we start inserting.
//
-// return FAIL for failure, OK for success.
-int screen_ins_lines (
- int off,
- int row,
- int line_count,
- int end,
- win_T *wp /* NULL or window to use width from */
-)
+/// 'row', 'col' and 'end' are relative to the start of the region.
+///
+/// @return FAIL for failure, OK for success.
+int grid_ins_lines(ScreenGrid *grid, int row, int line_count, int end, int col,
+ int width)
{
int i;
int j;
unsigned temp;
+ int row_off = 0;
+ screen_adjust_grid(&grid, &row_off, &col);
+ row += row_off;
+ end += row_off;
+
if (!screen_valid(TRUE) || line_count <= 0) {
return FAIL;
}
- // Shift LineOffset[] line_count down to reflect the inserted lines.
- // Clear the inserted lines in ScreenLines[].
- row += off;
- end += off;
- for (i = 0; i < line_count; ++i) {
- if (wp != NULL && wp->w_width != Columns) {
+ // Shift line_offset[] line_count down to reflect the inserted lines.
+ // Clear the inserted lines.
+ for (i = 0; i < line_count; i++) {
+ if (width != grid->Columns) {
// need to copy part of a line
j = end - 1 - i;
while ((j -= line_count) >= row) {
- linecopy(j + line_count, j, wp);
+ linecopy(grid, j + line_count, j, col, width);
}
j += line_count;
- lineclear(LineOffset[j] + wp->w_wincol, wp->w_width);
- LineWraps[j] = FALSE;
+ grid_clear_line(grid, grid->line_offset[j] + col, width, false);
+ grid->line_wraps[j] = false;
} else {
j = end - 1 - i;
- temp = LineOffset[j];
+ temp = grid->line_offset[j];
while ((j -= line_count) >= row) {
- LineOffset[j + line_count] = LineOffset[j];
- LineWraps[j + line_count] = LineWraps[j];
+ grid->line_offset[j + line_count] = grid->line_offset[j];
+ grid->line_wraps[j + line_count] = grid->line_wraps[j];
}
- LineOffset[j + line_count] = temp;
- LineWraps[j + line_count] = FALSE;
- lineclear(temp, (int)Columns);
+ grid->line_offset[j + line_count] = temp;
+ grid->line_wraps[j + line_count] = false;
+ grid_clear_line(grid, temp, (int)grid->Columns, false);
}
}
- ui_append_lines(line_count);
+ ui_call_grid_scroll(grid->handle, row, end, col, col+width, -line_count, 0);
return OK;
}
-// delete lines on the screen and update ScreenLines[]
-// 'end' is the line after the scrolled part. Normally it is Rows.
-// When scrolling region used 'off' is the offset from the top for the region.
-// 'row' and 'end' are relative to the start of the region.
-//
-// Return OK for success, FAIL if the lines are not deleted.
-int screen_del_lines (
- int off,
- int row,
- int line_count,
- int end,
- win_T *wp /* NULL or window to use width from */
-)
+/// delete lines on the screen and move lines up.
+/// 'end' is the line after the scrolled part. Normally it is Rows.
+/// When scrolling region used 'off' is the offset from the top for the region.
+/// 'row' and 'end' are relative to the start of the region.
+///
+/// Return OK for success, FAIL if the lines are not deleted.
+int grid_del_lines(ScreenGrid *grid, int row, int line_count, int end, int col,
+ int width)
{
int j;
int i;
unsigned temp;
+ int row_off = 0;
+ screen_adjust_grid(&grid, &row_off, &col);
+ row += row_off;
+ end += row_off;
+
if (!screen_valid(TRUE) || line_count <= 0) {
return FAIL;
}
- // Now shift LineOffset[] line_count up to reflect the deleted lines.
- // Clear the inserted lines in ScreenLines[].
- row += off;
- end += off;
- for (i = 0; i < line_count; ++i) {
- if (wp != NULL && wp->w_width != Columns) {
+ // Now shift line_offset[] line_count up to reflect the deleted lines.
+ // Clear the inserted lines.
+ for (i = 0; i < line_count; i++) {
+ if (width != grid->Columns) {
// need to copy part of a line
j = row + i;
while ((j += line_count) <= end - 1) {
- linecopy(j - line_count, j, wp);
+ linecopy(grid, j - line_count, j, col, width);
}
j -= line_count;
- lineclear(LineOffset[j] + wp->w_wincol, wp->w_width);
- LineWraps[j] = FALSE;
+ grid_clear_line(grid, grid->line_offset[j] + col, width, false);
+ grid->line_wraps[j] = false;
} else {
// whole width, moving the line pointers is faster
j = row + i;
- temp = LineOffset[j];
+ temp = grid->line_offset[j];
while ((j += line_count) <= end - 1) {
- LineOffset[j - line_count] = LineOffset[j];
- LineWraps[j - line_count] = LineWraps[j];
+ grid->line_offset[j - line_count] = grid->line_offset[j];
+ grid->line_wraps[j - line_count] = grid->line_wraps[j];
}
- LineOffset[j - line_count] = temp;
- LineWraps[j - line_count] = FALSE;
- lineclear(temp, (int)Columns);
+ grid->line_offset[j - line_count] = temp;
+ grid->line_wraps[j - line_count] = false;
+ grid_clear_line(grid, temp, (int)grid->Columns, false);
}
}
- ui_delete_lines(line_count);
+ ui_call_grid_scroll(grid->handle, row, end, col, col+width, line_count, 0);
return OK;
}
+
/*
* show the current mode and ruler
*
@@ -6680,36 +6445,47 @@ int showmode(void)
/* if the cmdline is more than one line high, erase top lines */
need_clear = clear_cmdline;
- if (clear_cmdline && cmdline_row < Rows - 1)
- msg_clr_cmdline(); /* will reset clear_cmdline */
+ if (clear_cmdline && cmdline_row < default_grid.Rows - 1) {
+ msg_clr_cmdline(); // will reset clear_cmdline
+ }
/* Position on the last line in the window, column 0 */
msg_pos_mode();
- attr = hl_attr(HLF_CM); /* Highlight mode */
+ attr = HL_ATTR(HLF_CM); // Highlight mode
+
+ // When the screen is too narrow to show the entire mode messsage,
+ // avoid scrolling and truncate instead.
+ msg_no_more = true;
+ int save_lines_left = lines_left;
+ lines_left = 0;
+
if (do_mode) {
MSG_PUTS_ATTR("--", attr);
// CTRL-X in Insert mode
if (edit_submode != NULL && !shortmess(SHM_COMPLETIONMENU)) {
/* These messages can get long, avoid a wrap in a narrow
* window. Prefer showing edit_submode_extra. */
- length = (Rows - msg_row) * Columns - 3;
- if (edit_submode_extra != NULL)
+ length = (default_grid.Rows - msg_row) * default_grid.Columns - 3;
+ if (edit_submode_extra != NULL) {
length -= vim_strsize(edit_submode_extra);
+ }
if (length > 0) {
if (edit_submode_pre != NULL)
length -= vim_strsize(edit_submode_pre);
if (length - vim_strsize(edit_submode) > 0) {
- if (edit_submode_pre != NULL)
- msg_puts_attr(edit_submode_pre, attr);
- msg_puts_attr(edit_submode, attr);
+ if (edit_submode_pre != NULL) {
+ msg_puts_attr((const char *)edit_submode_pre, attr);
+ }
+ msg_puts_attr((const char *)edit_submode, attr);
}
if (edit_submode_extra != NULL) {
- MSG_PUTS_ATTR(" ", attr); /* add a space in between */
- if ((int)edit_submode_highl < (int)HLF_COUNT)
- sub_attr = hl_attr(edit_submode_highl);
- else
+ MSG_PUTS_ATTR(" ", attr); // Add a space in between.
+ if ((int)edit_submode_highl < (int)HLF_COUNT) {
+ sub_attr = win_hl_attr(curwin, edit_submode_highl);
+ } else {
sub_attr = attr;
- msg_puts_attr(edit_submode_extra, sub_attr);
+ }
+ msg_puts_attr((const char *)edit_submode_extra, sub_attr);
}
}
} else {
@@ -6723,21 +6499,27 @@ int showmode(void)
if (p_ri)
MSG_PUTS_ATTR(_(" REVERSE"), attr);
MSG_PUTS_ATTR(_(" INSERT"), attr);
- } else if (restart_edit == 'I')
+ } else if (restart_edit == 'I' || restart_edit == 'i'
+ || restart_edit == 'a') {
MSG_PUTS_ATTR(_(" (insert)"), attr);
- else if (restart_edit == 'R')
+ } else if (restart_edit == 'R') {
MSG_PUTS_ATTR(_(" (replace)"), attr);
- else if (restart_edit == 'V')
+ } else if (restart_edit == 'V') {
MSG_PUTS_ATTR(_(" (vreplace)"), attr);
- if (p_hkmap)
+ }
+ if (p_hkmap) {
MSG_PUTS_ATTR(_(" Hebrew"), attr);
- if (p_fkmap)
+ }
+ if (p_fkmap) {
MSG_PUTS_ATTR(farsi_text_5, attr);
+ }
if (State & LANGMAP) {
- if (curwin->w_p_arab)
+ if (curwin->w_p_arab) {
MSG_PUTS_ATTR(_(" Arabic"), attr);
- else
- MSG_PUTS_ATTR(_(" (lang)"), attr);
+ } else if (get_keymap_str(curwin, (char_u *)" (%s)",
+ NameBuff, MAXPATHL)) {
+ MSG_PUTS_ATTR(NameBuff, attr);
+ }
}
if ((State & INSERT) && p_paste)
MSG_PUTS_ATTR(_(" (paste)"), attr);
@@ -6777,10 +6559,13 @@ int showmode(void)
msg_didout = FALSE; /* overwrite this message */
length = msg_col;
msg_col = 0;
- need_wait_return = nwr_save; /* never ask for hit-return for this */
- } else if (clear_cmdline && msg_silent == 0)
- /* Clear the whole command line. Will reset "clear_cmdline". */
+ msg_no_more = false;
+ lines_left = save_lines_left;
+ need_wait_return = nwr_save; // never ask for hit-return for this
+ } else if (clear_cmdline && msg_silent == 0) {
+ // Clear the whole command line. Will reset "clear_cmdline".
msg_clr_cmdline();
+ }
/* In Visual mode the size of the selected area must be redrawn. */
if (VIsual_active)
@@ -6804,7 +6589,7 @@ int showmode(void)
static void msg_pos_mode(void)
{
msg_col = 0;
- msg_row = Rows - 1;
+ msg_row = default_grid.Rows - 1;
}
/// Delete mode message. Used when ESC is typed which is expected to end
@@ -6816,12 +6601,18 @@ void unshowmode(bool force)
if (!redrawing() || (!force && char_avail() && !KeyTyped)) {
redraw_cmdline = true; // delete mode later
} else {
+ clearmode();
+ }
+}
+
+// Clear the mode message.
+void clearmode(void)
+{
msg_pos_mode();
if (Recording) {
- recording_mode(hl_attr(HLF_CM));
+ recording_mode(HL_ATTR(HLF_CM));
}
msg_clr_eos();
- }
}
static void recording_mode(int attr)
@@ -6850,44 +6641,51 @@ static void draw_tabline(void)
int modified;
int c;
int len;
- int attr_sel = hl_attr(HLF_TPS);
- int attr_nosel = hl_attr(HLF_TP);
- int attr_fill = hl_attr(HLF_TPF);
+ int attr_nosel = HL_ATTR(HLF_TP);
+ int attr_fill = HL_ATTR(HLF_TPF);
char_u *p;
int room;
int use_sep_chars = (t_colors < 8
);
- redraw_tabline = FALSE;
+ if (default_grid.chars == NULL) {
+ return;
+ }
+ redraw_tabline = false;
+ if (ui_is_external(kUITabline)) {
+ ui_ext_tabline_update();
+ return;
+ }
if (tabline_height() < 1)
return;
// Init TabPageIdxs[] to zero: Clicking outside of tabs has no effect.
- assert(Columns == tab_page_click_defs_size);
+ assert(default_grid.Columns == tab_page_click_defs_size);
clear_tab_page_click_defs(tab_page_click_defs, tab_page_click_defs_size);
/* Use the 'tabline' option if it's set. */
if (*p_tal != NUL) {
- int save_called_emsg = called_emsg;
+ int saved_did_emsg = did_emsg;
- /* Check for an error. If there is one we would loop in redrawing the
- * screen. Avoid that by making 'tabline' empty. */
- called_emsg = FALSE;
- win_redr_custom(NULL, FALSE);
- if (called_emsg)
+ // Check for an error. If there is one we would loop in redrawing the
+ // screen. Avoid that by making 'tabline' empty.
+ did_emsg = false;
+ win_redr_custom(NULL, false);
+ if (did_emsg) {
set_string_option_direct((char_u *)"tabline", -1,
- (char_u *)"", OPT_FREE, SID_ERROR);
- called_emsg |= save_called_emsg;
+ (char_u *)"", OPT_FREE, SID_ERROR);
+ }
+ did_emsg |= saved_did_emsg;
} else {
FOR_ALL_TABS(tp) {
++tabcount;
}
if (tabcount > 0) {
- tabwidth = (Columns - 1 + tabcount / 2) / tabcount;
+ tabwidth = (default_grid.Columns - 1 + tabcount / 2) / tabcount;
}
if (tabwidth < 6) {
@@ -6898,22 +6696,12 @@ static void draw_tabline(void)
tabcount = 0;
FOR_ALL_TABS(tp) {
- if (col >= Columns - 4) {
+ if (col >= default_grid.Columns - 4) {
break;
}
scol = col;
- if (tp->tp_topframe == topframe)
- attr = attr_sel;
- if (use_sep_chars && col > 0)
- screen_putchar('|', 0, col++, attr);
-
- if (tp->tp_topframe != topframe)
- attr = attr_nosel;
-
- screen_putchar(' ', 0, col++, attr);
-
if (tp == curtab) {
cwp = curwin;
wp = firstwin;
@@ -6922,23 +6710,44 @@ static void draw_tabline(void)
wp = tp->tp_firstwin;
}
- modified = FALSE;
- for (wincount = 0; wp != NULL; wp = wp->w_next, ++wincount)
- if (bufIsChanged(wp->w_buffer))
- modified = TRUE;
+
+ if (tp->tp_topframe == topframe) {
+ attr = win_hl_attr(cwp, HLF_TPS);
+ }
+ if (use_sep_chars && col > 0) {
+ grid_putchar(&default_grid, '|', 0, col++, attr);
+ }
+
+ if (tp->tp_topframe != topframe) {
+ attr = win_hl_attr(cwp, HLF_TP);
+ }
+
+ grid_putchar(&default_grid, ' ', 0, col++, attr);
+
+ modified = false;
+
+ for (wincount = 0; wp != NULL; wp = wp->w_next, ++wincount) {
+ if (bufIsChanged(wp->w_buffer)) {
+ modified = true;
+ }
+ }
+
+
if (modified || wincount > 1) {
if (wincount > 1) {
vim_snprintf((char *)NameBuff, MAXPATHL, "%d", wincount);
len = (int)STRLEN(NameBuff);
- if (col + len >= Columns - 3)
+ if (col + len >= default_grid.Columns - 3) {
break;
- screen_puts_len(NameBuff, len, 0, col,
- hl_combine_attr(attr, hl_attr(HLF_T)));
+ }
+ grid_puts_len(&default_grid, NameBuff, len, 0, col,
+ hl_combine_attr(attr, win_hl_attr(cwp, HLF_T)));
col += len;
}
- if (modified)
- screen_puts_len((char_u *)"+", 1, 0, col++, attr);
- screen_putchar(' ', 0, col++, attr);
+ if (modified) {
+ grid_puts_len(&default_grid, (char_u *)"+", 1, 0, col++, attr);
+ }
+ grid_putchar(&default_grid, ' ', 0, col++, attr);
}
room = scol - col + tabwidth - 1;
@@ -6951,19 +6760,20 @@ static void draw_tabline(void)
if (has_mbyte)
while (len > room) {
len -= ptr2cells(p);
- mb_ptr_adv(p);
+ MB_PTR_ADV(p);
}
else if (len > room) {
p += len - room;
len = room;
}
- if (len > Columns - col - 1)
- len = Columns - col - 1;
+ if (len > default_grid.Columns - col - 1) {
+ len = default_grid.Columns - col - 1;
+ }
- screen_puts_len(p, (int)STRLEN(p), 0, col, attr);
+ grid_puts_len(&default_grid, p, (int)STRLEN(p), 0, col, attr);
col += len;
}
- screen_putchar(' ', 0, col++, attr);
+ grid_putchar(&default_grid, ' ', 0, col++, attr);
// Store the tab page number in tab_page_click_defs[], so that
// jump_to_mouse() knows where each one is.
@@ -6981,12 +6791,14 @@ static void draw_tabline(void)
c = '_';
else
c = ' ';
- screen_fill(0, 1, col, (int)Columns, c, c, attr_fill);
+ grid_fill(&default_grid, 0, 1, col, (int)default_grid.Columns, c, c,
+ attr_fill);
/* Put an "X" for closing the current tab if there are several. */
if (first_tabpage->tp_next != NULL) {
- screen_putchar('X', 0, (int)Columns - 1, attr_nosel);
- tab_page_click_defs[Columns - 1] = (StlClickDefinition) {
+ grid_putchar(&default_grid, 'X', 0, (int)default_grid.Columns - 1,
+ attr_nosel);
+ tab_page_click_defs[default_grid.Columns - 1] = (StlClickDefinition) {
.type = kStlClickTabClose,
.tabnr = 999,
.func = NULL,
@@ -6999,6 +6811,22 @@ static void draw_tabline(void)
redraw_tabline = FALSE;
}
+void ui_ext_tabline_update(void)
+{
+ Array tabs = ARRAY_DICT_INIT;
+ FOR_ALL_TABS(tp) {
+ Dictionary tab_info = ARRAY_DICT_INIT;
+ PUT(tab_info, "tab", TABPAGE_OBJ(tp->handle));
+
+ win_T *cwp = (tp == curtab) ? curwin : tp->tp_curwin;
+ get_trans_bufname(cwp->w_buffer);
+ PUT(tab_info, "name", STRING_OBJ(cstr_to_string((char *)NameBuff)));
+
+ ADD(tabs, DICTIONARY_OBJ(tab_info));
+ }
+ ui_call_tabline_update(curtab->handle, tabs);
+}
+
/*
* Get buffer name for "buf" into NameBuff[].
* Takes care of special buffer names and translates special characters.
@@ -7015,25 +6843,28 @@ void get_trans_bufname(buf_T *buf)
/*
* Get the character to use in a status line. Get its attributes in "*attr".
*/
-static int fillchar_status(int *attr, int is_curwin)
+static int fillchar_status(int *attr, win_T *wp)
{
int fill;
+ bool is_curwin = (wp == curwin);
if (is_curwin) {
- *attr = hl_attr(HLF_S);
+ *attr = win_hl_attr(wp, HLF_S);
fill = fill_stl;
} else {
- *attr = hl_attr(HLF_SNC);
+ *attr = win_hl_attr(wp, HLF_SNC);
fill = fill_stlnc;
}
/* Use fill when there is highlighting, and highlighting of current
* window differs, or the fillchars differ, or this is not the
* current window */
- if (*attr != 0 && ((hl_attr(HLF_S) != hl_attr(HLF_SNC)
- || !is_curwin || firstwin == lastwin)
- || (fill_stl != fill_stlnc)))
+ if (*attr != 0 && ((win_hl_attr(wp, HLF_S) != win_hl_attr(wp, HLF_SNC)
+ || !is_curwin || ONE_WINDOW)
+ || (fill_stl != fill_stlnc))) {
return fill;
- if (is_curwin)
+ }
+ if (is_curwin) {
return '^';
+ }
return '=';
}
@@ -7041,13 +6872,10 @@ static int fillchar_status(int *attr, int is_curwin)
* Get the character to use in a separator between vertically split windows.
* Get its attributes in "*attr".
*/
-static int fillchar_vsep(int *attr)
+static int fillchar_vsep(win_T *wp, int *attr)
{
- *attr = hl_attr(HLF_C);
- if (*attr == 0 && fill_vert == ' ')
- return '|';
- else
- return fill_vert;
+ *attr = win_hl_attr(wp, HLF_C);
+ return fill_vert;
}
/*
@@ -7075,15 +6903,16 @@ void showruler(int always)
{
if (!always && !redrawing())
return;
- if (pum_visible()) {
- /* Don't redraw right now, do it later. */
- curwin->w_redr_status = TRUE;
+ if (pum_drawn()) {
+ // Don't redraw right now, do it later.
+ curwin->w_redr_status = true;
return;
}
if ((*p_stl != NUL || *curwin->w_p_stl != NUL) && curwin->w_status_height) {
redraw_custom_statusline(curwin);
- } else
+ } else {
win_redr_ruler(curwin, always);
+ }
if (need_maketitle
|| (p_icon && (stl_syntax & STL_IN_ICON))
@@ -7113,9 +6942,10 @@ static void win_redr_ruler(win_T *wp, int always)
if (wp == lastwin && lastwin->w_status_height == 0)
if (edit_submode != NULL)
return;
- /* Don't draw the ruler when the popup menu is visible, it may overlap. */
- if (pum_visible())
+ // Don't draw the ruler when the popup menu is visible, it may overlap.
+ if (pum_drawn()) {
return;
+ }
if (*p_ruf) {
int save_called_emsg = called_emsg;
@@ -7159,15 +6989,15 @@ static void win_redr_ruler(win_T *wp, int always)
int off;
if (wp->w_status_height) {
- row = wp->w_winrow + wp->w_height;
- fillchar = fillchar_status(&attr, wp == curwin);
+ row = W_ENDROW(wp);
+ fillchar = fillchar_status(&attr, wp);
off = wp->w_wincol;
width = wp->w_width;
} else {
- row = Rows - 1;
+ row = default_grid.Rows - 1;
fillchar = ' ';
attr = 0;
- width = Columns;
+ width = default_grid.Columns;
off = 0;
}
@@ -7202,46 +7032,42 @@ static void win_redr_ruler(win_T *wp, int always)
int i = (int)STRLEN(buffer);
get_rel_pos(wp, buffer + i + 1, RULER_BUF_LEN - i - 1);
int o = i + vim_strsize(buffer + i + 1);
- if (wp->w_status_height == 0) /* can't use last char of screen */
- ++o;
- int this_ru_col = ru_col - (Columns - width);
- if (this_ru_col < 0)
+ if (wp->w_status_height == 0) { // can't use last char of screen
+ o++;
+ }
+ int this_ru_col = ru_col - (default_grid.Columns - width);
+ if (this_ru_col < 0) {
this_ru_col = 0;
- /* Never use more than half the window/screen width, leave the other
- * half for the filename. */
- if (this_ru_col < (width + 1) / 2)
+ }
+ // Never use more than half the window/screen width, leave the other half
+ // for the filename.
+ if (this_ru_col < (width + 1) / 2) {
this_ru_col = (width + 1) / 2;
+ }
if (this_ru_col + o < width) {
// Need at least 3 chars left for get_rel_pos() + NUL.
while (this_ru_col + o < width && RULER_BUF_LEN > i + 4) {
- if (has_mbyte)
- i += (*mb_char2bytes)(fillchar, buffer + i);
- else
- buffer[i++] = fillchar;
- ++o;
+ i += utf_char2bytes(fillchar, buffer + i);
+ o++;
}
get_rel_pos(wp, buffer + i, RULER_BUF_LEN - i);
}
- /* Truncate at window boundary. */
- if (has_mbyte) {
- o = 0;
- for (i = 0; buffer[i] != NUL; i += (*mb_ptr2len)(buffer + i)) {
- o += (*mb_ptr2cells)(buffer + i);
- if (this_ru_col + o > width) {
- buffer[i] = NUL;
- break;
- }
+ // Truncate at window boundary.
+ o = 0;
+ for (i = 0; buffer[i] != NUL; i += utfc_ptr2len(buffer + i)) {
+ o += utf_ptr2cells(buffer + i);
+ if (this_ru_col + o > width) {
+ buffer[i] = NUL;
+ break;
}
- } else if (this_ru_col + (int)STRLEN(buffer) > width)
- buffer[width - this_ru_col] = NUL;
+ }
- screen_puts(buffer, row, this_ru_col + off, attr);
+ grid_puts(&default_grid, buffer, row, this_ru_col + off, attr);
i = redraw_cmdline;
- screen_fill(row, row + 1,
- this_ru_col + off + (int)STRLEN(buffer),
- off + width,
- fillchar, fillchar, attr);
- /* don't redraw the cmdline because of showing the ruler */
+ grid_fill(&default_grid, row, row + 1,
+ this_ru_col + off + (int)STRLEN(buffer), off + width, fillchar,
+ fillchar, attr);
+ // don't redraw the cmdline because of showing the ruler
redraw_cmdline = i;
wp->w_ru_cursor = wp->w_cursor;
wp->w_ru_virtcol = wp->w_virtcol;
@@ -7262,12 +7088,13 @@ int number_width(win_T *wp)
int n;
linenr_T lnum;
- if (wp->w_p_rnu && !wp->w_p_nu)
- /* cursor line shows "0" */
- lnum = wp->w_height;
- else
- /* cursor line shows absolute line number */
+ if (wp->w_p_rnu && !wp->w_p_nu) {
+ // cursor line shows "0"
+ lnum = wp->w_grid.Rows;
+ } else {
+ // cursor line shows absolute line number
lnum = wp->w_buffer->b_ml.ml_line_count;
+ }
if (lnum == wp->w_nrwidth_line_count)
return wp->w_nrwidth_width;
@@ -7287,23 +7114,16 @@ int number_width(win_T *wp)
return n;
}
-/*
- * Set size of the Vim shell.
- * If 'mustset' is TRUE, we must set Rows and Columns, do not get the real
- * window size (this is used for the :win command).
- * If 'mustset' is FALSE, we may try to get the real window size and if
- * it fails use 'width' and 'height'.
- */
+/// Set dimensions of the Nvim application "shell".
void screen_resize(int width, int height)
{
static int busy = FALSE;
- /*
- * Avoid recursiveness, can happen when setting the window size causes
- * another window-changed signal.
- */
- if (busy)
+ // Avoid recursiveness, can happen when setting the window size causes
+ // another window-changed signal.
+ if (updating_screen || busy) {
return;
+ }
if (width < 0 || height < 0) /* just checking... */
return;
@@ -7330,6 +7150,8 @@ void screen_resize(int width, int height)
width = Columns;
ui_resize(width, height);
+ send_grid_resize = true;
+
/* The window layout used to be adjusted here, but it now happens in
* screenalloc() (also invoked from screenclear()). That is because the
* "busy" check above may skip this, but not screenalloc(). */
@@ -7351,7 +7173,7 @@ void screen_resize(int width, int height)
* - in Ex mode, don't redraw anything.
* - Otherwise, redraw right now, and position the cursor.
* Always need to call update_screen() or screenalloc(), to make
- * sure Rows/Columns and the size of ScreenLines[] is correct!
+ * sure Rows/Columns and the size of the screen is correct!
*/
if (State == ASKMORE || State == EXTERNCMD || State == CONFIRM
|| exmode_active) {
@@ -7365,13 +7187,14 @@ void screen_resize(int width, int height)
redrawcmdline();
} else {
update_topline();
- if (pum_visible()) {
+ if (pum_drawn()) {
redraw_later(NOT_VALID);
- ins_compl_show_pum(); /* This includes the redraw. */
- } else
- update_screen(NOT_VALID);
- if (redrawing())
+ ins_compl_show_pum();
+ }
+ update_screen(NOT_VALID);
+ if (redrawing()) {
setcursor();
+ }
}
}
}
@@ -7379,8 +7202,8 @@ void screen_resize(int width, int height)
--busy;
}
-// Check if the new shell size is valid, correct it if it's too small or way
-// too big.
+/// Check if the new Nvim application "shell" dimensions are valid.
+/// Correct it if it's too small or way too big.
void check_shellsize(void)
{
if (Rows < min_rows()) {
@@ -7422,3 +7245,13 @@ void win_new_shellsize(void)
shell_new_columns(); // update window sizes
}
}
+
+win_T *get_win_by_grid_handle(handle_T handle)
+{
+ FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
+ if (wp->w_grid.handle == handle) {
+ return wp;
+ }
+ }
+ return NULL;
+}
diff --git a/src/nvim/screen.h b/src/nvim/screen.h
index 81a8b9ed4c..109541ef07 100644
--- a/src/nvim/screen.h
+++ b/src/nvim/screen.h
@@ -3,6 +3,11 @@
#include <stdbool.h>
+#include "nvim/types.h"
+#include "nvim/buffer_defs.h"
+#include "nvim/grid_defs.h"
+#include "nvim/pos.h"
+
/*
* flags for update_screen()
* The higher the value, the higher the priority
@@ -16,6 +21,18 @@
#define NOT_VALID 40 /* buffer needs complete redraw */
#define CLEAR 50 /* screen messed up, clear it */
+/// By default, all widows are draw on a single rectangular grid, represented by
+/// this ScreenGrid instance. In multigrid mode each window will have its own
+/// grid, then this is only used for global screen elements that hasn't been
+/// externalized.
+///
+/// Note: before the screen is initialized and when out of memory these can be
+/// NULL.
+EXTERN ScreenGrid default_grid INIT(= { 0, NULL, NULL, NULL, NULL, 0, 0, 0, 0,
+ 0, 0, 0 });
+
+#define DEFAULT_GRID_HANDLE 1 // handle for the default_grid
+
/// Status line click definition
typedef struct {
enum {
diff --git a/src/nvim/search.c b/src/nvim/search.c
index 6e2b69fff7..cf0f1ea287 100644
--- a/src/nvim/search.c
+++ b/src/nvim/search.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* search.c: code for normal mode searching commands
*/
@@ -31,7 +34,6 @@
#include "nvim/memory.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/move.h"
#include "nvim/mouse.h"
#include "nvim/normal.h"
@@ -94,6 +96,9 @@ 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 saved_last_idx = 0;
static int saved_no_hlsearch = 0;
@@ -125,8 +130,8 @@ typedef struct SearchedFile {
*
* returns FAIL if failed, OK otherwise.
*/
-int
-search_regcomp (
+int
+search_regcomp(
char_u *pat,
int pat_save,
int pat_use,
@@ -283,7 +288,7 @@ void restore_search_patterns(void)
static inline void free_spat(struct spat *const spat)
{
xfree(spat->pat);
- dict_unref(spat->additional_data);
+ tv_dict_unref(spat->additional_data);
}
#if defined(EXITFREE)
@@ -303,19 +308,55 @@ void free_search_patterns(void)
#endif
+/// Save and restore the search pattern for incremental highlight search
+/// feature.
+///
+/// It's similar but different from save_search_patterns() and
+/// restore_search_patterns(), because the search pattern must be restored when
+/// cancelling incremental searching even if it's called inside user functions.
+void save_last_search_pattern(void)
+{
+ saved_last_search_spat = spats[RE_SEARCH];
+ if (spats[RE_SEARCH].pat != NULL) {
+ saved_last_search_spat.pat = vim_strsave(spats[RE_SEARCH].pat);
+ }
+ saved_last_idx = last_idx;
+ saved_no_hlsearch = no_hlsearch;
+}
+
+void restore_last_search_pattern(void)
+{
+ xfree(spats[RE_SEARCH].pat);
+ spats[RE_SEARCH] = saved_last_search_spat;
+ set_vv_searchforward();
+ last_idx = saved_last_idx;
+ SET_NO_HLSEARCH(saved_no_hlsearch);
+}
+
+char_u *last_search_pattern(void)
+{
+ return spats[RE_SEARCH].pat;
+}
+
/*
* Return TRUE when case should be ignored for search pattern "pat".
* Uses the 'ignorecase' and 'smartcase' options.
*/
int ignorecase(char_u *pat)
{
- int ic = p_ic;
+ return ignorecase_opt(pat, p_ic, p_scs);
+}
- if (ic && !no_smartcase && p_scs
+/// As ignorecase() put pass the "ic" and "scs" flags.
+int ignorecase_opt(char_u *pat, int ic_in, int scs)
+{
+ int ic = ic_in;
+ if (ic && !no_smartcase && scs
&& !(ctrl_x_mode && curbuf->b_p_inf)
- )
+ ) {
ic = !pat_has_uppercase(pat);
- no_smartcase = FALSE;
+ }
+ no_smartcase = false;
return ic;
}
@@ -330,30 +371,34 @@ int pat_has_uppercase(char_u *pat)
while (*p != NUL) {
int l;
- if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1) {
- if (enc_utf8 && utf_isupper(utf_ptr2char(p)))
- return TRUE;
+ if ((l = mb_ptr2len(p)) > 1) {
+ if (mb_isupper(utf_ptr2char(p))) {
+ return true;
+ }
p += l;
} else if (*p == '\\') {
- if (p[1] == '_' && p[2] != NUL) /* skip "\_X" */
+ if (p[1] == '_' && p[2] != NUL) { // skip "\_X"
p += 3;
- else if (p[1] == '%' && p[2] != NUL) /* skip "\%X" */
+ } else if (p[1] == '%' && p[2] != NUL) { // skip "\%X"
p += 3;
- else if (p[1] != NUL) /* skip "\X" */
+ } else if (p[1] != NUL) { // skip "\X"
p += 2;
- else
+ } else {
p += 1;
- } else if (vim_isupper(*p))
- return TRUE;
- else
- ++p;
+ }
+ } else if (mb_isupper(*p)) {
+ return true;
+ } else {
+ p++;
+ }
}
return FALSE;
}
-char_u *last_csearch(void)
+const char *last_csearch(void)
+ FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
- return lastc_bytes;
+ return (const char *)lastc_bytes;
}
int last_csearch_forward(void)
@@ -476,7 +521,7 @@ int searchit(
buffer without a window! */
buf_T *buf,
pos_T *pos,
- int dir,
+ Direction dir,
char_u *pat,
long count,
int options,
@@ -525,8 +570,12 @@ int searchit(
&& pos->lnum >= 1 && pos->lnum <= buf->b_ml.ml_line_count
&& pos->col < MAXCOL - 2) {
// Watch out for the "col" being MAXCOL - 2, used in a closed fold.
- ptr = ml_get_buf(buf, pos->lnum, false) + pos->col;
- start_char_len = *ptr == NUL ? 1 : (*mb_ptr2len)(ptr);
+ ptr = ml_get_buf(buf, pos->lnum, false);
+ if ((int)STRLEN(ptr) <= pos->col) {
+ start_char_len = 1;
+ } else {
+ start_char_len = utfc_ptr2len(ptr + pos->col);
+ }
} else {
start_char_len = 1;
}
@@ -604,7 +653,7 @@ int searchit(
* otherwise "/$" will get stuck on end of line.
*/
while (matchpos.lnum == 0
- && ((options & SEARCH_END) && first_match
+ && (((options & SEARCH_END) && first_match)
? (nmatched == 1
&& (int)endpos.col - 1
< (int)start_pos.col + extra_col)
@@ -730,12 +779,17 @@ int searchit(
}
}
if (ptr[matchcol] == NUL
- || (nmatched = vim_regexec_multi(&regmatch,
- win, buf, lnum + matchpos.lnum,
- matchcol,
- tm
- )) == 0)
- break;
+ || (nmatched = vim_regexec_multi(
+ &regmatch, win, buf, lnum + matchpos.lnum, matchcol,
+ tm)) == 0) {
+ // If the search timed out, we did find a match
+ // but it might be the wrong one, so that's not
+ // OK.
+ if (tm != NULL && profile_passed_limit(*tm)) {
+ match_ok = false;
+ }
+ break;
+ }
/* Need to get the line pointer again, a
* multi-line search may have made it invalid. */
@@ -767,11 +821,10 @@ int searchit(
pos->lnum, FALSE));
}
} else {
- --pos->col;
- if (has_mbyte
- && pos->lnum <= buf->b_ml.ml_line_count) {
- ptr = ml_get_buf(buf, pos->lnum, FALSE);
- pos->col -= (*mb_head_off)(ptr, ptr + pos->col);
+ pos->col--;
+ if (pos->lnum <= buf->b_ml.ml_line_count) {
+ ptr = ml_get_buf(buf, pos->lnum, false);
+ pos->col -= utf_head_off(ptr, ptr + pos->col);
}
}
} else {
@@ -993,14 +1046,13 @@ int do_search(
dircp = NULL;
/* use previous pattern */
if (pat == NULL || *pat == NUL || *pat == dirc) {
- if (spats[RE_SEARCH].pat == NULL) { /* no previous pattern */
- pat = spats[RE_SUBST].pat;
- if (pat == NULL) {
+ if (spats[RE_SEARCH].pat == NULL) { // no previous pattern
+ searchstr = spats[RE_SUBST].pat;
+ if (searchstr == NULL) {
EMSG(_(e_noprevre));
retval = 0;
goto end_do_search;
}
- searchstr = pat;
} else {
/* make search_regcomp() use spats[RE_SEARCH].pat */
searchstr = (char_u *)"";
@@ -1071,8 +1123,8 @@ int do_search(
msgbuf = xmalloc(STRLEN(p) + 40);
{
msgbuf[0] = dirc;
- if (enc_utf8 && utf_iscomposing(utf_ptr2char(p))) {
- /* Use a space to draw the composing char on. */
+ if (utf_iscomposing(utf_ptr2char(p))) {
+ // Use a space to draw the composing char on.
msgbuf[1] = ' ';
STRCPY(msgbuf + 2, p);
} else
@@ -1239,9 +1291,9 @@ end_do_search:
* search_for_exact_line(buf, pos, dir, pat)
*
* Search for a line starting with the given pattern (ignoring leading
- * white-space), starting from pos and going in direction dir. pos will
+ * white-space), starting from pos and going in direction "dir". "pos" will
* contain the position of the match found. Blank lines match only if
- * ADDING is set. if p_ic is set then the pattern must be in lowercase.
+ * ADDING is set. If p_ic is set then the pattern must be in lowercase.
* Return OK for success, or FAIL if no line found.
*/
int search_for_exact_line(buf_T *buf, pos_T *pos, int dir, char_u *pat)
@@ -1285,10 +1337,11 @@ int search_for_exact_line(buf_T *buf, pos_T *pos, int dir, char_u *pat)
* ignored because we are interested in the next line -- Acevedo */
if ((compl_cont_status & CONT_ADDING)
&& !(compl_cont_status & CONT_SOL)) {
- if ((p_ic ? mb_stricmp(p, pat) : STRCMP(p, pat)) == 0)
+ if (mb_strcmp_ic((bool)p_ic, (const char *)p, (const char *)pat) == 0) {
return OK;
- } else if (*p != NUL) { /* ignore empty lines */
- /* expanding lines or words */
+ }
+ } else if (*p != NUL) { // Ignore empty lines.
+ // Expanding lines or words.
assert(compl_length >= 0);
if ((p_ic ? mb_strnicmp(p, pat, (size_t)compl_length)
: STRNCMP(p, pat, compl_length)) == 0)
@@ -1323,20 +1376,25 @@ int searchc(cmdarg_T *cap, int t_cmd)
*lastc = c;
set_csearch_direction(dir);
set_csearch_until(t_cmd);
- lastc_bytelen = (*mb_char2bytes)(c, lastc_bytes);
+ lastc_bytelen = utf_char2bytes(c, lastc_bytes);
if (cap->ncharC1 != 0) {
- lastc_bytelen += (*mb_char2bytes)(cap->ncharC1, lastc_bytes + lastc_bytelen);
- if (cap->ncharC2 != 0)
- lastc_bytelen += (*mb_char2bytes)(cap->ncharC2, lastc_bytes + lastc_bytelen);
+ lastc_bytelen += utf_char2bytes(cap->ncharC1,
+ lastc_bytes + lastc_bytelen);
+ if (cap->ncharC2 != 0) {
+ lastc_bytelen += utf_char2bytes(cap->ncharC2,
+ lastc_bytes + lastc_bytelen);
+ }
}
}
- } else { /* repeat previous search */
- if (*lastc == NUL)
+ } else { // repeat previous search
+ if (*lastc == NUL && lastc_bytelen == 1) {
return FAIL;
- if (dir) /* repeat in opposite direction */
+ }
+ if (dir) { // repeat in opposite direction
dir = -lastcdir;
- else
+ } else {
dir = lastcdir;
+ }
t_cmd = last_t_cmd;
c = *lastc;
/* For multi-byte re-use last lastc_bytes[] and lastc_bytelen. */
@@ -1367,16 +1425,16 @@ int searchc(cmdarg_T *cap, int t_cmd)
} else {
if (col == 0)
return FAIL;
- col -= (*mb_head_off)(p, p + col - 1) + 1;
+ col -= utf_head_off(p, p + col - 1) + 1;
}
if (lastc_bytelen == 1) {
- if (p[col] == c && stop)
+ if (p[col] == c && stop) {
break;
- } else {
- if (memcmp(p + col, lastc_bytes, lastc_bytelen) == 0 && stop)
+ }
+ } else if (STRNCMP(p + col, lastc_bytes, lastc_bytelen) == 0 && stop) {
break;
}
- stop = TRUE;
+ stop = true;
}
} else {
for (;; ) {
@@ -1390,15 +1448,14 @@ int searchc(cmdarg_T *cap, int t_cmd)
}
if (t_cmd) {
- /* backup to before the character (possibly double-byte) */
+ // Backup to before the character (possibly double-byte).
col -= dir;
- if (has_mbyte) {
- if (dir < 0)
- /* Landed on the search char which is lastc_bytelen long */
- col += lastc_bytelen - 1;
- else
- /* To previous char, which may be multi-byte. */
- col -= (*mb_head_off)(p, p + col);
+ if (dir < 0) {
+ // Landed on the search char which is lastc_bytelen long.
+ col += lastc_bytelen - 1;
+ } else {
+ // To previous char, which may be multi-byte.
+ col -= utf_head_off(p, p + col);
}
}
curwin->w_cursor.col = col;
@@ -1420,59 +1477,55 @@ pos_T *findmatch(oparg_T *oap, int initc)
return findmatchlimit(oap, initc, 0, 0);
}
-/*
- * Return TRUE if the character before "linep[col]" equals "ch".
- * Return FALSE if "col" is zero.
- * Update "*prevcol" to the column of the previous character, unless "prevcol"
- * is NULL.
- * Handles multibyte string correctly.
- */
-static int check_prevcol(char_u *linep, int col, int ch, int *prevcol)
+// Return true if the character before "linep[col]" equals "ch".
+// Return false if "col" is zero.
+// Update "*prevcol" to the column of the previous character, unless "prevcol"
+// is NULL.
+// Handles multibyte string correctly.
+static bool check_prevcol(char_u *linep, int col, int ch, int *prevcol)
{
- --col;
- if (col > 0 && has_mbyte)
- col -= (*mb_head_off)(linep, linep + col);
- if (prevcol)
+ col--;
+ if (col > 0) {
+ col -= utf_head_off(linep, linep + col);
+ }
+ if (prevcol) {
*prevcol = col;
- return (col >= 0 && linep[col] == ch) ? TRUE : FALSE;
+ }
+ return (col >= 0 && linep[col] == ch) ? true : false;
}
/*
* Raw string start is found at linep[startpos.col - 1].
* Return true if the matching end can be found between startpos and endpos.
*/
-static int find_rawstring_end(char_u *linep, pos_T *startpos, pos_T *endpos)
+static bool find_rawstring_end(char_u *linep, pos_T *startpos, pos_T *endpos)
{
char_u *p;
char_u *delim_copy;
size_t delim_len;
linenr_T lnum;
- int found = false;
- for (p = linep + startpos->col + 1; *p && *p != '('; ++p) {}
+ for (p = linep + startpos->col + 1; *p && *p != '('; p++) {}
delim_len = (p - linep) - startpos->col - 1;
delim_copy = vim_strnsave(linep + startpos->col + 1, delim_len);
- if (delim_copy == NULL)
- return false;
- for (lnum = startpos->lnum; lnum <= endpos->lnum; ++lnum)
- {
+ bool found = false;
+ for (lnum = startpos->lnum; lnum <= endpos->lnum; lnum++) {
char_u *line = ml_get(lnum);
- for (p = line + (lnum == startpos->lnum
- ? startpos->col + 1 : 0); *p; ++p)
- {
- if (lnum == endpos->lnum && (colnr_T)(p - line) >= endpos->col)
+ for (p = line + (lnum == startpos->lnum ? startpos->col + 1 : 0); *p; p++) {
+ if (lnum == endpos->lnum && (colnr_T)(p - line) >= endpos->col) {
break;
+ }
if (*p == ')' && p[delim_len + 1] == '"'
- && STRNCMP(delim_copy, p + 1, delim_len) == 0)
- {
+ && STRNCMP(delim_copy, p + 1, delim_len) == 0) {
found = true;
break;
}
}
- if (found)
+ if (found) {
break;
+ }
}
xfree(delim_copy);
return found;
@@ -1501,37 +1554,31 @@ static int find_rawstring_end(char_u *linep, pos_T *startpos, pos_T *endpos)
pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel)
{
- static pos_T pos; /* current search position */
- int findc = 0; /* matching brace */
- int c;
- int count = 0; /* cumulative number of braces */
- int backwards = false; /* init for gcc */
- int raw_string = false; /* search for raw string */
- int inquote = false; /* true when inside quotes */
- char_u *linep; /* pointer to current line */
+ static pos_T pos; // current search position
+ int findc = 0; // matching brace
+ int count = 0; // cumulative number of braces
+ int backwards = false; // init for gcc
+ bool raw_string = false; // search for raw string
+ bool inquote = false; // true when inside quotes
char_u *ptr;
- int do_quotes; /* check for quotes in current line */
- int at_start; /* do_quotes value at start position */
- int hash_dir = 0; /* Direction searched for # things */
- int comment_dir = 0; /* Direction searched for comments */
- pos_T match_pos; /* Where last slash-star was found */
- int start_in_quotes; /* start position is in quotes */
- int traveled = 0; /* how far we've searched so far */
- int ignore_cend = FALSE; /* ignore comment end */
- int cpo_match; /* vi compatible matching */
- int cpo_bsl; /* don't recognize backslashes */
- int match_escaped = 0; /* search for escaped match */
- int dir; /* Direction to search */
- int comment_col = MAXCOL; /* start of / / comment */
- int lispcomm = FALSE; /* inside of Lisp-style comment */
- int lisp = curbuf->b_p_lisp; /* engage Lisp-specific hacks ;) */
+ int hash_dir = 0; // Direction searched for # things
+ int comment_dir = 0; // Direction searched for comments
+ int traveled = 0; // how far we've searched so far
+ bool ignore_cend = false; // ignore comment end
+ int match_escaped = 0; // search for escaped match
+ int dir; // Direction to search
+ int comment_col = MAXCOL; // start of / / comment
+ bool lispcomm = false; // inside of Lisp-style comment
+ bool lisp = curbuf->b_p_lisp; // engage Lisp-specific hacks ;)
pos = curwin->w_cursor;
pos.coladd = 0;
- linep = ml_get(pos.lnum);
+ char_u *linep = ml_get(pos.lnum); // pointer to current line
- cpo_match = (vim_strchr(p_cpo, CPO_MATCH) != NULL);
- cpo_bsl = (vim_strchr(p_cpo, CPO_MATCHBSL) != NULL);
+ // vi compatible matching
+ bool cpo_match = (vim_strchr(p_cpo, CPO_MATCH) != NULL);
+ // don't recognize backslashes
+ bool cpo_bsl = (vim_strchr(p_cpo, CPO_MATCHBSL) != NULL);
/* Direction to search when initc is '/', '*' or '#' */
if (flags & FM_BACKWARD)
@@ -1700,13 +1747,16 @@ pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel)
}
}
- /* This is just guessing: when 'rightleft' is set, search for a matching
- * paren/brace in the other direction. */
- if (curwin->w_p_rl && vim_strchr((char_u *)"()[]{}<>", initc) != NULL)
+ // This is just guessing: when 'rightleft' is set, search for a matching
+ // paren/brace in the other direction.
+ if (curwin->w_p_rl && vim_strchr((char_u *)"()[]{}<>", initc) != NULL) {
backwards = !backwards;
+ }
- do_quotes = -1;
- start_in_quotes = MAYBE;
+ int do_quotes = -1; // check for quotes in current line
+ int at_start; // do_quotes value at start position
+ TriState start_in_quotes = kNone; // start position is in quotes
+ pos_T match_pos; // Where last slash-star was found
clearpos(&match_pos);
/* backward search: Check if this line contains a single-line comment */
@@ -1714,8 +1764,9 @@ pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel)
|| lisp
)
comment_col = check_linecomment(linep);
- if (lisp && comment_col != MAXCOL && pos.col > (colnr_T)comment_col)
- lispcomm = TRUE; /* find match inside this comment */
+ if (lisp && comment_col != MAXCOL && pos.col > (colnr_T)comment_col) {
+ lispcomm = true; // find match inside this comment
+ }
while (!got_int) {
/*
* Go to the next position, forward or backward. We could use
@@ -1747,9 +1798,8 @@ pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel)
if (lisp && comment_col != MAXCOL)
pos.col = comment_col;
} else {
- --pos.col;
- if (has_mbyte)
- pos.col -= (*mb_head_off)(linep, linep + pos.col);
+ pos.col--;
+ pos.col -= utf_head_off(linep, linep + pos.col);
}
} else { /* forward search */
if (linep[pos.col] == NUL
@@ -1803,7 +1853,7 @@ pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel)
} else { /* Searching backwards */
/*
* A comment may contain / * or / /, it may also start or end
- * with / * /. Ignore a / * after / /.
+ * with / * /. Ignore a / * after / / and after *.
*/
if (pos.col == 0)
continue;
@@ -1828,6 +1878,7 @@ pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel)
}
} else if ( linep[pos.col - 1] == '/'
&& linep[pos.col] == '*'
+ && (pos.col == 1 || linep[pos.col - 2] != '*')
&& (int)pos.col < comment_col) {
count++;
match_pos = pos;
@@ -1877,26 +1928,29 @@ pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel)
* one for a '\' at the end.
*/
if (!do_quotes) {
- inquote = FALSE;
+ inquote = false;
if (ptr[-1] == '\\') {
do_quotes = 1;
- if (start_in_quotes == MAYBE) {
- /* Do we need to use at_start here? */
- inquote = TRUE;
- start_in_quotes = TRUE;
- } else if (backwards)
- inquote = TRUE;
+ if (start_in_quotes == kNone) {
+ // Do we need to use at_start here?
+ inquote = true;
+ start_in_quotes = kTrue;
+ } else if (backwards) {
+ inquote = true;
+ }
}
if (pos.lnum > 1) {
ptr = ml_get(pos.lnum - 1);
if (*ptr && *(ptr + STRLEN(ptr) - 1) == '\\') {
do_quotes = 1;
- if (start_in_quotes == MAYBE) {
+ if (start_in_quotes == kNone) {
inquote = at_start;
- if (inquote)
- start_in_quotes = TRUE;
- } else if (!backwards)
- inquote = TRUE;
+ if (inquote) {
+ start_in_quotes = kTrue;
+ }
+ } else if (!backwards) {
+ inquote = true;
+ }
}
/* ml_get() only keeps one line, need to get linep again */
@@ -1904,8 +1958,9 @@ pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel)
}
}
}
- if (start_in_quotes == MAYBE)
- start_in_quotes = FALSE;
+ if (start_in_quotes == kNone) {
+ start_in_quotes = kFalse;
+ }
/*
* If 'smartmatch' is set:
@@ -1918,13 +1973,13 @@ pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel)
* inquote if the number of quotes in a line is even, unless this
* line or the previous one ends in a '\'. Complicated, isn't it?
*/
- c = PTR2CHAR(linep + pos.col);
+ const int c = PTR2CHAR(linep + pos.col);
switch (c) {
case NUL:
/* at end of line without trailing backslash, reset inquote */
if (pos.col == 0 || linep[pos.col - 1] != '\\') {
- inquote = FALSE;
- start_in_quotes = FALSE;
+ inquote = false;
+ start_in_quotes = kFalse;
}
break;
@@ -1939,7 +1994,7 @@ pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel)
break;
if ((((int)pos.col - 1 - col) & 1) == 0) {
inquote = !inquote;
- start_in_quotes = FALSE;
+ start_in_quotes = kFalse;
}
}
break;
@@ -1975,7 +2030,7 @@ pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel)
}
}
}
- /* FALLTHROUGH */
+ FALLTHROUGH;
default:
/*
@@ -1991,7 +2046,7 @@ pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel)
/* Check for match outside of quotes, and inside of
* quotes when the start is also inside of quotes. */
- if ((!inquote || start_in_quotes == TRUE)
+ if ((!inquote || start_in_quotes == kTrue)
&& (c == initc || c == findc)) {
int col, bslcnt = 0;
@@ -2073,9 +2128,9 @@ static int check_linecomment(char_u *line)
* Show the match only if it is visible on the screen.
* If there isn't a match, then beep.
*/
-void
-showmatch (
- int c /* char to show match for */
+void
+showmatch(
+ int c // char to show match for
)
{
pos_T *lpos, save_cursor;
@@ -2111,9 +2166,10 @@ showmatch (
if (!curwin->w_p_wrap) {
getvcol(curwin, lpos, NULL, &vcol, NULL);
}
- if (curwin->w_p_wrap || (vcol >= curwin->w_leftcol
- && vcol < curwin->w_leftcol + curwin->w_width)) {
- mpos = *lpos; /* save the pos, update_screen() may change it */
+ if (curwin->w_p_wrap
+ || (vcol >= curwin->w_leftcol
+ && vcol < curwin->w_leftcol + curwin->w_grid.Columns)) {
+ mpos = *lpos; // save the pos, update_screen() may change it
save_cursor = curwin->w_cursor;
save_so = p_so;
save_siso = p_siso;
@@ -2156,21 +2212,17 @@ showmatch (
}
}
-/*
- * findsent(dir, count) - Find the start of the next sentence in direction
- * "dir" Sentences are supposed to end in ".", "!" or "?" followed by white
- * space or a line break. Also stop at an empty line.
- * Return OK if the next sentence was found.
- */
-int findsent(int dir, long count)
+// Find the start of the next sentence, searching in the direction specified
+// by the "dir" argument. The cursor is positioned on the start of the next
+// sentence when found. If the next sentence is found, return OK. Return FAIL
+// otherwise. See ":h sentence" for the precise definition of a "sentence"
+// text object.
+int findsent(Direction dir, long count)
{
pos_T pos, tpos;
int c;
int (*func)(pos_T *);
- int startlnum;
- int noskip = FALSE; /* do not skip blanks */
- int cpo_J;
- int found_dot;
+ bool noskip = false; // do not skip blanks
pos = curwin->w_cursor;
if (dir == FORWARD)
@@ -2204,29 +2256,30 @@ int findsent(int dir, long count)
decl(&pos);
}
- // go back to the previous non-blank char
- found_dot = false;
- while ((c = gchar_pos(&pos)) == ' ' || c == '\t'
- || (dir == BACKWARD
- && vim_strchr((char_u *)".!?)]\"'", c) != NULL)) {
- if (vim_strchr((char_u *)".!?", c) != NULL) {
- /* Only skip over a '.', '!' and '?' once. */
- if (found_dot)
- break;
- found_dot = TRUE;
+ // go back to the previous non-white non-punctuation character
+ bool found_dot = false;
+ while (c = gchar_pos(&pos), ascii_iswhite(c)
+ || vim_strchr((char_u *)".!?)]\"'", c) != NULL) {
+ tpos = pos;
+ if (decl(&tpos) == -1 || (LINEEMPTY(tpos.lnum) && dir == FORWARD)) {
+ break;
}
- if (decl(&pos) == -1)
+ if (found_dot) {
+ break;
+ }
+ if (vim_strchr((char_u *) ".!?", c) != NULL) {
+ found_dot = true;
+ }
+ if (vim_strchr((char_u *) ")]\"'", c) != NULL
+ && vim_strchr((char_u *) ".!?)]\"'", gchar_pos(&tpos)) == NULL) {
break;
- /* when going forward: Stop in front of empty line */
- if (lineempty(pos.lnum) && dir == FORWARD) {
- incl(&pos);
- goto found;
}
+ decl(&pos);
}
- /* remember the line where the search started */
- startlnum = pos.lnum;
- cpo_J = vim_strchr(p_cpo, CPO_ENDOFSENT) != NULL;
+ // remember the line where the search started
+ const int startlnum = pos.lnum;
+ const bool cpo_J = vim_strchr(p_cpo, CPO_ENDOFSENT) != NULL;
for (;; ) { /* find end of sentence */
c = gchar_pos(&pos);
@@ -2254,7 +2307,7 @@ int findsent(int dir, long count)
if ((*func)(&pos) == -1) {
if (count)
return FAIL;
- noskip = TRUE;
+ noskip = true;
break;
}
}
@@ -2328,8 +2381,13 @@ findpar (
++curr;
curwin->w_cursor.lnum = curr;
if (curr == curbuf->b_ml.ml_line_count && what != '}') {
- if ((curwin->w_cursor.col = (colnr_T)STRLEN(ml_get(curr))) != 0) {
- --curwin->w_cursor.col;
+ char_u *line = ml_get(curr);
+
+ // Put the cursor on the last character in the last line and make the
+ // motion inclusive.
+ if ((curwin->w_cursor.col = (colnr_T)STRLEN(line)) != 0) {
+ curwin->w_cursor.col--;
+ curwin->w_cursor.col -= utf_head_off(line, line + curwin->w_cursor.col);
*pincl = true;
}
} else
@@ -2412,32 +2470,20 @@ static int cls(void)
int c;
c = gchar_cursor();
- if (p_altkeymap && c == F_BLANK)
+ if (p_altkeymap && c == F_BLANK) {
return 0;
- if (c == ' ' || c == '\t' || c == NUL)
- return 0;
- if (enc_dbcs != 0 && c > 0xFF) {
- /* If cls_bigword, report multi-byte chars as class 1. */
- if (enc_dbcs == DBCS_KOR && cls_bigword)
- return 1;
-
- /* process code leading/trailing bytes */
- return dbcs_class(((unsigned)c >> 8), (c & 0xFF));
}
- if (enc_utf8) {
- c = utf_class(c);
- if (c != 0 && cls_bigword)
- return 1;
- return c;
+ if (c == ' ' || c == '\t' || c == NUL) {
+ return 0;
}
- /* If cls_bigword is TRUE, report all non-blanks as class 1. */
- if (cls_bigword)
- return 1;
+ c = utf_class(c);
- if (vim_iswordc(c))
- return 2;
- return 1;
+ // If cls_bigword is TRUE, report all non-blanks as class 1.
+ if (c != 0 && cls_bigword) {
+ return 1;
+ }
+ return c;
}
/*
@@ -2446,8 +2492,8 @@ static int cls(void)
* Returns FAIL if the cursor was already at the end of the file.
* If eol is TRUE, last word stops at end of line (for operators).
*/
-int
-fwd_word (
+int
+fwd_word(
long count,
int bigword, /* "W", "E" or "B" */
int eol
@@ -2534,10 +2580,12 @@ int bck_word(long count, int bigword, int stop)
*/
while (cls() == 0) {
if (curwin->w_cursor.col == 0
- && lineempty(curwin->w_cursor.lnum))
+ && LINEEMPTY(curwin->w_cursor.lnum)) {
goto finished;
- if (dec_cursor() == -1) /* hit start of file, stop here */
+ }
+ if (dec_cursor() == -1) { // hit start of file, stop here
return OK;
+ }
}
/*
@@ -2601,10 +2649,12 @@ int end_word(long count, int bigword, int stop, int empty)
*/
while (cls() == 0) {
if (empty && curwin->w_cursor.col == 0
- && lineempty(curwin->w_cursor.lnum))
+ && LINEEMPTY(curwin->w_cursor.lnum)) {
goto finished;
- if (inc_cursor() == -1) /* hit end of file, stop here */
+ }
+ if (inc_cursor() == -1) { // hit end of file, stop here
return FAIL;
+ }
}
/*
@@ -2625,8 +2675,8 @@ finished:
*
* Returns FAIL if start of the file was reached.
*/
-int
-bckend_word (
+int
+bckend_word(
long count,
int bigword, /* TRUE for "B" */
int eol /* TRUE: stop at end of line. */
@@ -2657,10 +2707,12 @@ bckend_word (
* Move backward to end of the previous word
*/
while (cls() == 0) {
- if (curwin->w_cursor.col == 0 && lineempty(curwin->w_cursor.lnum))
+ if (curwin->w_cursor.col == 0 && LINEEMPTY(curwin->w_cursor.lnum)) {
break;
- if ((i = dec_cursor()) == -1 || (eol && i == 1))
+ }
+ if ((i = dec_cursor()) == -1 || (eol && i == 1)) {
return OK;
+ }
}
}
return OK;
@@ -2713,8 +2765,8 @@ static void find_first_blank(pos_T *posp)
/*
* Skip count/2 sentences and count/2 separating white spaces.
*/
-static void
-findsent_forward (
+static void
+findsent_forward(
long count,
int at_start_sent /* cursor is at start of sentence */
)
@@ -2733,8 +2785,8 @@ findsent_forward (
* Find word under cursor, cursor at end.
* Used while an operator is pending, and in Visual mode.
*/
-int
-current_word (
+int
+current_word(
oparg_T *oap,
long count,
int include, /* TRUE: include word and white space */
@@ -3023,7 +3075,8 @@ extend:
++curwin->w_cursor.col;
VIsual = start_pos;
VIsual_mode = 'v';
- redraw_curbuf_later(INVERTED); /* update the inversion */
+ redraw_cmdline = true; // show mode later
+ redraw_curbuf_later(INVERTED); // update the inversion
} else {
/* include a newline after the sentence, if there is one */
if (incl(&curwin->w_cursor) == -1)
@@ -3040,8 +3093,8 @@ extend:
* Find block under the cursor, cursor at end.
* "what" and "other" are two matching parenthesis/brace/etc.
*/
-int
-current_block (
+int
+current_block(
oparg_T *oap,
long count,
int include, /* TRUE == include white space */
@@ -3189,35 +3242,41 @@ static int in_html_tag(int end_tag)
/* We search forward until the cursor, because searching backwards is
* very slow for DBCS encodings. */
- for (p = line; p < line + curwin->w_cursor.col; mb_ptr_adv(p))
+ for (p = line; p < line + curwin->w_cursor.col; MB_PTR_ADV(p)) {
if (*p == '>' || *p == '<') {
lc = *p;
lp = p;
}
- if (*p != '<') { /* check for '<' under cursor */
- if (lc != '<')
- return FALSE;
+ }
+ if (*p != '<') { // check for '<' under cursor
+ if (lc != '<') {
+ return false;
+ }
p = lp;
}
} else {
for (p = line + curwin->w_cursor.col; p > line; ) {
- if (*p == '<') /* find '<' under/before cursor */
+ if (*p == '<') { // find '<' under/before cursor
break;
- mb_ptr_back(line, p);
- if (*p == '>') /* find '>' before cursor */
+ }
+ MB_PTR_BACK(line, p);
+ if (*p == '>') { // find '>' before cursor
break;
+ }
+ }
+ if (*p != '<') {
+ return false;
}
- if (*p != '<')
- return FALSE;
}
pos.lnum = curwin->w_cursor.lnum;
pos.col = (colnr_T)(p - line);
- mb_ptr_adv(p);
- if (end_tag)
- /* check that there is a '/' after the '<' */
+ MB_PTR_ADV(p);
+ if (end_tag) {
+ // check that there is a '/' after the '<'
return *p == '/';
+ }
/* check that there is no '/' after the '<' */
if (*p == '/')
@@ -3238,11 +3297,11 @@ static int in_html_tag(int end_tag)
/*
* Find tag block under the cursor, cursor at end.
*/
-int
-current_tagblock (
+int
+current_tagblock(
oparg_T *oap,
long count_arg,
- int include /* TRUE == include white space */
+ bool include // true == include white space
)
{
long count = count_arg;
@@ -3256,7 +3315,7 @@ current_tagblock (
char_u *cp;
int len;
int r;
- int do_include = include;
+ bool do_include = include;
bool save_p_ws = p_ws;
int retval = FAIL;
int is_inclusive = true;
@@ -3321,8 +3380,10 @@ again:
*/
inc_cursor();
p = get_cursor_pos_ptr();
- for (cp = p; *cp != NUL && *cp != '>' && !ascii_iswhite(*cp); mb_ptr_adv(cp))
- ;
+ for (cp = p;
+ *cp != NUL && *cp != '>' && !ascii_iswhite(*cp);
+ MB_PTR_ADV(cp)) {
+ }
len = (int)(cp - p);
if (len == 0) {
curwin->w_cursor = old_pos;
@@ -3348,11 +3409,13 @@ again:
goto again;
}
- if (do_include || r < 1) {
- /* Include up to the '>'. */
- while (*get_cursor_pos_ptr() != '>')
- if (inc_cursor() < 0)
+ if (do_include) {
+ // Include up to the '>'.
+ while (*get_cursor_pos_ptr() != '>') {
+ if (inc_cursor() < 0) {
break;
+ }
+ }
} else {
char_u *c = get_cursor_pos_ptr();
// Exclude the '<' of the end tag.
@@ -3378,10 +3441,12 @@ again:
}
curwin->w_cursor = end_pos;
- /* If we now have the same text as before reset "do_include" and try
- * again. */
- if (equalpos(start_pos, old_start) && equalpos(end_pos, old_end)) {
- do_include = TRUE;
+ // If we are in Visual mode and now have the same text as before set
+ // "do_include" and try again.
+ if (VIsual_active
+ && equalpos(start_pos, old_start)
+ && equalpos(end_pos, old_end)) {
+ do_include = true;
curwin->w_cursor = old_start;
count = count_arg;
goto again;
@@ -3419,8 +3484,8 @@ theend:
return retval;
}
-int
-current_par (
+int
+current_par(
oparg_T *oap,
long count,
int include, /* TRUE == include white space */
@@ -3556,11 +3621,15 @@ extend:
--start_lnum;
if (VIsual_active) {
- /* Problem: when doing "Vipipip" nothing happens in a single white
- * line, we get stuck there. Trap this here. */
- if (VIsual_mode == 'V' && start_lnum == curwin->w_cursor.lnum)
+ // Problem: when doing "Vipipip" nothing happens in a single white
+ // line, we get stuck there. Trap this here.
+ if (VIsual_mode == 'V' && start_lnum == curwin->w_cursor.lnum) {
goto extend;
- VIsual.lnum = start_lnum;
+ }
+ if (VIsual.lnum != start_lnum) {
+ VIsual.lnum = start_lnum;
+ VIsual.col = 0;
+ }
VIsual_mode = 'V';
redraw_curbuf_later(INVERTED); /* update the inversion */
showmode();
@@ -3582,8 +3651,8 @@ extend:
* as a quote.
* Returns column number of "quotechar" or -1 when not found.
*/
-static int
-find_next_quote (
+static int
+find_next_quote(
char_u *line,
int col,
int quotechar,
@@ -3614,8 +3683,8 @@ find_next_quote (
* as a quote.
* Return the found column or zero.
*/
-static int
-find_prev_quote (
+static int
+find_prev_quote(
char_u *line,
int col_start,
int quotechar,
@@ -3625,8 +3694,8 @@ find_prev_quote (
int n;
while (col_start > 0) {
- --col_start;
- col_start -= (*mb_head_off)(line, line + col_start);
+ col_start--;
+ col_start -= utf_head_off(line, line + col_start);
n = 0;
if (escape != NULL)
while (col_start - n > 0 && vim_strchr(escape,
@@ -3644,8 +3713,8 @@ find_prev_quote (
* Find quote under the cursor, cursor at end.
* Returns TRUE if found, else FALSE.
*/
-int
-current_quote (
+int
+current_quote(
oparg_T *oap,
long count,
int include, /* TRUE == include quote char */
@@ -3662,11 +3731,25 @@ current_quote (
int selected_quote = FALSE; /* Has quote inside selection */
int i;
- /* Correct cursor when 'selection' is exclusive */
+ // Correct cursor when 'selection' is "exclusive".
if (VIsual_active) {
+ // this only works within one line
+ if (VIsual.lnum != curwin->w_cursor.lnum) {
+ return false;
+ }
+
vis_bef_curs = lt(VIsual, curwin->w_cursor);
- if (*p_sel == 'e' && vis_bef_curs)
+ if (*p_sel == 'e') {
+ if (!vis_bef_curs) {
+ // VIsual needs to be start of Visual selection.
+ pos_T t = curwin->w_cursor;
+
+ curwin->w_cursor = VIsual;
+ VIsual = t;
+ vis_bef_curs = true;
+ }
dec_cursor();
+ }
vis_empty = equalpos(VIsual, curwin->w_cursor);
}
@@ -3856,8 +3939,8 @@ current_quote (
* Find next search match under cursor, cursor at end.
* Used while an operator is pending, and in Visual mode.
*/
-int
-current_search (
+int
+current_search(
long count,
int forward /* move forward or backwards */
)
@@ -3872,24 +3955,27 @@ current_search (
if (VIsual_active && *p_sel == 'e' && lt(VIsual, curwin->w_cursor))
dec_cursor();
- pos_T orig_pos; /* position of the cursor at beginning */
- pos_T pos; /* position after the pattern */
+ pos_T orig_pos; // position of the cursor at beginning
+ pos_T first_match; // position of first match
+ pos_T pos; // position after the pattern
+ int result; // result of various function calls
if (VIsual_active) {
orig_pos = pos = curwin->w_cursor;
- /* make sure, searching further will extend the match */
- if (VIsual_active) {
- if (forward)
- incl(&pos);
- else
- decl(&pos);
+ // Searching further will extend the match.
+ if (forward) {
+ incl(&pos);
+ } else {
+ decl(&pos);
}
- } else
+ } else {
orig_pos = pos = curwin->w_cursor;
+ }
- /* Is the pattern is zero-width? */
- int one_char = is_one_char(spats[last_idx].pat, true);
+ // Is the pattern is zero-width?, this time, don't care about the direction
+ int one_char = is_one_char(spats[last_idx].pat, true, &curwin->w_cursor,
+ FORWARD);
if (one_char == -1) {
p_ws = old_p_ws;
return FAIL; /* pattern not found */
@@ -3907,9 +3993,9 @@ current_search (
if (!dir && !one_char)
flags = SEARCH_END;
- int result = searchit(curwin, curbuf, &pos, (dir ? FORWARD : BACKWARD),
- spats[last_idx].pat, i ? count : 1,
- SEARCH_KEEP | flags, RE_SEARCH, 0, NULL);
+ result = searchit(curwin, curbuf, &pos, (dir ? FORWARD : BACKWARD),
+ spats[last_idx].pat, i ? count : 1,
+ SEARCH_KEEP | flags, RE_SEARCH, 0, NULL);
/* First search may fail, but then start searching from the
* beginning of the file (cursor might be on the search match)
@@ -3931,43 +4017,67 @@ current_search (
ml_get(curwin->w_buffer->b_ml.ml_line_count));
}
}
+ if (i == 0) {
+ first_match = pos;
+ }
p_ws = old_p_ws;
}
- int flags = forward ? SEARCH_END : 0;
+ const int flags = forward ? SEARCH_END : SEARCH_START;
pos_T start_pos = pos;
+ const Direction direction = forward ? FORWARD : BACKWARD;
- /* Check again from the current cursor position,
- * since the next match might actually be only one char wide */
- one_char = is_one_char(spats[last_idx].pat, false);
+ // Check again from the current cursor position,
+ // since the next match might actually be only one char wide
+ one_char = is_one_char(spats[last_idx].pat, false, &pos, direction);
+ if (one_char < 0) {
+ // search failed, abort
+ return FAIL;
+ }
/* move to match, except for zero-width matches, in which case, we are
* already on the next match */
- if (!one_char)
- searchit(curwin, curbuf, &pos, (forward ? FORWARD : BACKWARD),
- spats[last_idx].pat, 0L, flags | SEARCH_KEEP, RE_SEARCH, 0, NULL);
+ if (!one_char) {
+ p_ws = false;
+ for (int i = 0; i < 2; i++) {
+ result = searchit(curwin, curbuf, &pos, direction,
+ spats[last_idx].pat, 0L, flags | SEARCH_KEEP, RE_SEARCH,
+ 0, NULL);
+ // Search successfull, break out from the loop
+ if (result) {
+ break;
+ }
+ // search failed, try again from the last search position match
+ pos = first_match;
+ }
+ }
+
+ p_ws = old_p_ws;
+ // not found
+ if (!result) {
+ return FAIL;
+ }
if (!VIsual_active)
VIsual = start_pos;
curwin->w_cursor = pos;
- VIsual_active = TRUE;
+ VIsual_active = true;
VIsual_mode = 'v';
- if (VIsual_active) {
- redraw_curbuf_later(INVERTED); /* update the inversion */
- if (*p_sel == 'e') {
- /* Correction for exclusive selection depends on the direction. */
- if (forward && ltoreq(VIsual, curwin->w_cursor))
- inc_cursor();
- else if (!forward && ltoreq(curwin->w_cursor, VIsual))
- inc(&VIsual);
+ redraw_curbuf_later(INVERTED); // Update the inversion.
+ if (*p_sel == 'e') {
+ // Correction for exclusive selection depends on the direction.
+ if (forward && ltoreq(VIsual, curwin->w_cursor)) {
+ inc_cursor();
+ } else if (!forward && ltoreq(curwin->w_cursor, VIsual)) {
+ inc(&VIsual);
}
-
}
- if (fdo_flags & FDO_SEARCH && KeyTyped)
+ if (fdo_flags & FDO_SEARCH && KeyTyped) {
foldOpenCursor();
+ }
may_start_select('c');
setmouse();
@@ -3977,13 +4087,13 @@ current_search (
return OK;
}
-/*
- * Check if the pattern is one character or zero-width.
- * If move is true, check from the beginning of the buffer,
- * else from the current cursor position.
- * Returns TRUE, FALSE or -1 for failure.
- */
-static int is_one_char(char_u *pattern, bool move)
+/// Check if the pattern is one character long or zero-width.
+/// If move is true, check from the beginning of the buffer,
+/// else from position "cur".
+/// "direction" is FORWARD or BACKWARD.
+/// Returns TRUE, FALSE or -1 for failure.
+static int is_one_char(char_u *pattern, bool move, pos_T *cur,
+ Direction direction)
{
regmmatch_T regmatch;
int nmatched = 0;
@@ -3992,33 +4102,49 @@ static int is_one_char(char_u *pattern, bool move)
int save_called_emsg = called_emsg;
int flag = 0;
+ if (pattern == NULL) {
+ pattern = spats[last_idx].pat;
+ }
+
if (search_regcomp(pattern, RE_SEARCH, RE_SEARCH,
SEARCH_KEEP, &regmatch) == FAIL)
return -1;
- /* move to match */
+ // init startcol correctly
+ regmatch.startpos[0].col = -1;
+ // move to match
if (move) {
clearpos(&pos);
} else {
- pos = curwin->w_cursor;
- /* accept a match at the cursor position */
+ pos = *cur;
+ // accept a match at the cursor position
flag = SEARCH_START;
}
- if (searchit(curwin, curbuf, &pos, FORWARD, spats[last_idx].pat, 1,
- SEARCH_KEEP + flag, RE_SEARCH, 0, NULL) != FAIL) {
- /* Zero-width pattern should match somewhere, then we can check if
- * start and end are in the same position. */
- called_emsg = FALSE;
- nmatched = vim_regexec_multi(&regmatch, curwin, curbuf,
- pos.lnum, (colnr_T)0, NULL);
-
- if (!called_emsg)
+ if (searchit(curwin, curbuf, &pos, direction, pattern, 1,
+ SEARCH_KEEP + flag, RE_SEARCH, 0, NULL) != FAIL) {
+ // Zero-width pattern should match somewhere, then we can check if
+ // start and end are in the same position.
+ called_emsg = false;
+ do {
+ regmatch.startpos[0].col++;
+ nmatched = vim_regexec_multi(&regmatch, curwin, curbuf,
+ pos.lnum, regmatch.startpos[0].col, NULL);
+ if (!nmatched) {
+ break;
+ }
+ } while (direction == FORWARD
+ ? regmatch.startpos[0].col < pos.col
+ : regmatch.startpos[0].col > pos.col);
+
+ if (!called_emsg) {
result = (nmatched != 0
&& regmatch.startpos[0].lnum == regmatch.endpos[0].lnum
&& regmatch.startpos[0].col == regmatch.endpos[0].col);
-
- if (!result && inc(&pos) >= 0 && pos.col == regmatch.endpos[0].col)
- result = TRUE;
+ // one char width
+ if (!result && inc(&pos) >= 0 && pos.col == regmatch.endpos[0].col) {
+ result = true;
+ }
+ }
}
called_emsg |= save_called_emsg;
@@ -4041,19 +4167,19 @@ int linewhite(linenr_T lnum)
* Find identifiers or defines in included files.
* If p_ic && (compl_cont_status & CONT_SOL) then ptr must be in lowercase.
*/
-void
-find_pattern_in_path (
- char_u *ptr, /* pointer to search pattern */
- int dir, /* direction of expansion */
- size_t len, /* length of search pattern */
- int whole, /* match whole words only */
- int skip_comments, /* don't match inside comments */
- int type, /* Type of search; are we looking for a type?
- a macro? */
+void
+find_pattern_in_path(
+ char_u *ptr, // pointer to search pattern
+ int dir, // direction of expansion
+ size_t len, // length of search pattern
+ int whole, // match whole words only
+ int skip_comments, // don't match inside comments
+ int type, // Type of search; are we looking for a type?
+ // a macro?
long count,
- int action, /* What to do when we find it */
- linenr_T start_lnum, /* first line to start searching */
- linenr_T end_lnum /* last line for searching */
+ int action, // What to do when we find it
+ linenr_T start_lnum, // first line to start searching
+ linenr_T end_lnum // last line for searching
)
{
SearchedFile *files; /* Stack of included files */
@@ -4207,7 +4333,7 @@ find_pattern_in_path (
if (new_fname != NULL) {
/* using "new_fname" is more reliable, e.g., when
* 'includeexpr' is set. */
- msg_outtrans_attr(new_fname, hl_attr(HLF_D));
+ msg_outtrans_attr(new_fname, HL_ATTR(HLF_D));
} else {
/*
* Isolate the file name.
@@ -4245,7 +4371,7 @@ find_pattern_in_path (
}
save_char = p[i];
p[i] = NUL;
- msg_outtrans_attr(p, hl_attr(HLF_D));
+ msg_outtrans_attr(p, HL_ATTR(HLF_D));
p[i] = save_char;
}
@@ -4292,11 +4418,11 @@ find_pattern_in_path (
files[depth].lnum = 0;
files[depth].matched = FALSE;
if (action == ACTION_EXPAND) {
- msg_hist_off = TRUE; /* reset in msg_trunc_attr() */
- vim_snprintf((char*)IObuff, IOSIZE,
- _("Scanning included file: %s"),
- (char *)new_fname);
- msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R));
+ msg_hist_off = true; // reset in msg_trunc_attr()
+ vim_snprintf((char *)IObuff, IOSIZE,
+ _("Scanning included file: %s"),
+ (char *)new_fname);
+ msg_trunc_attr(IObuff, true, HL_ATTR(HLF_R));
} else if (p_verbose >= 5) {
verbose_enter();
smsg(_("Searching included file %s"),
@@ -4506,20 +4632,24 @@ search_line:
RESET_BINDING(curwin);
}
if (depth == -1) {
- /* match in current file */
+ // match in current file
if (l_g_do_tagpreview != 0) {
- if (getfile(0, curwin_save->w_buffer->b_fname,
- NULL, TRUE, lnum, FALSE) > 0)
- break; /* failed to jump to file */
- } else
+ if (!GETFILE_SUCCESS(getfile(curwin_save->w_buffer->b_fnum, NULL,
+ NULL, true, lnum, false))) {
+ break; // failed to jump to file
+ }
+ } else {
setpcmark();
+ }
curwin->w_cursor.lnum = lnum;
+ check_cursor();
} else {
- if (getfile(0, files[depth].name, NULL, TRUE,
- files[depth].lnum, FALSE) > 0)
- break; /* failed to jump to file */
- /* autocommands may have changed the lnum, we don't
- * want that here */
+ if (!GETFILE_SUCCESS(getfile(0, files[depth].name, NULL, true,
+ files[depth].lnum, false))) {
+ break; // failed to jump to file
+ }
+ // autocommands may have changed the lnum, we don't
+ // want that here
curwin->w_cursor.lnum = files[depth].lnum;
}
}
@@ -4550,7 +4680,7 @@ exit_matched:
}
line_breakcheck();
if (action == ACTION_EXPAND)
- ins_compl_check_keys(30);
+ ins_compl_check_keys(30, false);
if (got_int || compl_interrupted)
break;
@@ -4645,12 +4775,12 @@ static void show_pat_in_path(char_u *line, int type, int did_show, int action, F
*(p + 1) = NUL;
}
if (action == ACTION_SHOW_ALL) {
- sprintf((char *)IObuff, "%3ld: ", count); /* show match nr */
- msg_puts(IObuff);
- sprintf((char *)IObuff, "%4ld", *lnum); /* show line nr */
- /* Highlight line numbers */
- msg_puts_attr(IObuff, hl_attr(HLF_N));
- MSG_PUTS(" ");
+ snprintf((char *)IObuff, IOSIZE, "%3ld: ", count); // Show match nr.
+ msg_puts((const char *)IObuff);
+ snprintf((char *)IObuff, IOSIZE, "%4ld", *lnum); // Show line nr.
+ // Highlight line numbers.
+ msg_puts_attr((const char *)IObuff, HL_ATTR(HLF_N));
+ msg_puts(" ");
}
msg_prt_line(line, FALSE);
ui_flush(); /* show one line at a time */
diff --git a/src/nvim/search.h b/src/nvim/search.h
index d4e40cb287..cb094aab8c 100644
--- a/src/nvim/search.h
+++ b/src/nvim/search.h
@@ -4,6 +4,12 @@
#include <stdbool.h>
#include <stdint.h>
+#include "nvim/vim.h"
+#include "nvim/buffer_defs.h"
+#include "nvim/eval/typval.h"
+#include "nvim/normal.h"
+#include "nvim/os/time.h"
+
/* Values for the find_pattern_in_path() function args 'type' and 'action': */
#define FIND_ANY 1
#define FIND_DEFINE 2
diff --git a/src/nvim/sha256.c b/src/nvim/sha256.c
index 7670b64468..a2378cc202 100644
--- a/src/nvim/sha256.c
+++ b/src/nvim/sha256.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/// @file sha256.c
///
/// FIPS-180-2 compliant SHA-256 implementation
@@ -259,11 +262,11 @@ void sha256_finish(context_sha256_T *ctx, char_u digest[SHA256_SUM_SIZE])
///
/// @returns hex digest of "buf[buf_len]" in a static array.
/// if "salt" is not NULL also do "salt[salt_len]".
-char_u *sha256_bytes(const char_u *restrict buf, size_t buf_len,
- const char_u *restrict salt, size_t salt_len)
+const char *sha256_bytes(const uint8_t *restrict buf, size_t buf_len,
+ const uint8_t *restrict salt, size_t salt_len)
{
char_u sha256sum[SHA256_SUM_SIZE];
- static char_u hexit[SHA256_BUFFER_SIZE + 1]; // buf size + NULL
+ static char hexit[SHA256_BUFFER_SIZE + 1]; // buf size + NULL
context_sha256_T ctx;
sha256_self_test();
@@ -277,7 +280,7 @@ char_u *sha256_bytes(const char_u *restrict buf, size_t buf_len,
sha256_finish(&ctx, sha256sum);
for (size_t j = 0; j < SHA256_SUM_SIZE; j++) {
- snprintf((char *) hexit + j * SHA_STEP, SHA_STEP+1, "%02x", sha256sum[j]);
+ snprintf(hexit + j * SHA_STEP, SHA_STEP + 1, "%02x", sha256sum[j]);
}
hexit[sizeof(hexit) - 1] = '\0';
return hexit;
@@ -308,7 +311,7 @@ bool sha256_self_test(void)
context_sha256_T ctx;
char_u buf[1000];
char_u sha256sum[SHA256_SUM_SIZE];
- char_u *hexit;
+ const char *hexit;
static bool sha256_self_tested = false;
static bool failures = false;
@@ -320,8 +323,8 @@ bool sha256_self_test(void)
for (size_t i = 0; i < 3; i++) {
if (i < 2) {
- hexit = sha256_bytes((char_u *) sha_self_test_msg[i],
- STRLEN(sha_self_test_msg[i]),
+ hexit = sha256_bytes((uint8_t *)sha_self_test_msg[i],
+ strlen(sha_self_test_msg[i]),
NULL, 0);
STRCPY(output, hexit);
} else {
diff --git a/src/nvim/sha256.h b/src/nvim/sha256.h
index a118826542..deb881a288 100644
--- a/src/nvim/sha256.h
+++ b/src/nvim/sha256.h
@@ -2,6 +2,7 @@
#define NVIM_SHA256_H
#include <stdint.h> // for uint32_t
+#include <stddef.h>
#include "nvim/types.h" // for char_u
diff --git a/src/nvim/shada.c b/src/nvim/shada.c
index b5921eb810..8864301e4c 100644
--- a/src/nvim/shada.c
+++ b/src/nvim/shada.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <stdlib.h>
#include <stddef.h>
#include <stdbool.h>
@@ -13,12 +16,14 @@
#include "nvim/os/os.h"
#include "nvim/os/time.h"
#include "nvim/vim.h"
+#include "nvim/pos.h"
#include "nvim/ascii.h"
#include "nvim/shada.h"
#include "nvim/message.h"
#include "nvim/globals.h"
#include "nvim/memory.h"
#include "nvim/mark.h"
+#include "nvim/macros.h"
#include "nvim/ops.h"
#include "nvim/garray.h"
#include "nvim/option.h"
@@ -27,11 +32,10 @@
#include "nvim/api/private/helpers.h"
#include "nvim/buffer.h"
#include "nvim/buffer_defs.h"
-#include "nvim/misc2.h"
#include "nvim/ex_getln.h"
#include "nvim/search.h"
#include "nvim/regexp.h"
-#include "nvim/eval_defs.h"
+#include "nvim/eval/typval.h"
#include "nvim/version.h"
#include "nvim/path.h"
#include "nvim/fileio.h"
@@ -74,17 +78,10 @@ KHASH_SET_INIT_STR(strset)
(vim_rename((char_u *)a, (char_u *)b))
#define mb_strnicmp(a, b, c) \
(mb_strnicmp((char_u *)a, (char_u *)b, c))
-#define has_non_ascii(a) (has_non_ascii((char_u *)a))
-#define string_convert(a, b, c) \
- ((char *)string_convert((vimconv_T *)a, (char_u *)b, c))
-#define path_shorten_fname_if_possible(b) \
- ((char *)path_shorten_fname_if_possible((char_u *)b))
+#define path_try_shorten_fname(b) \
+ ((char *)path_try_shorten_fname((char_u *)b))
#define buflist_new(ffname, sfname, ...) \
(buflist_new((char_u *)ffname, (char_u *)sfname, __VA_ARGS__))
-#define convert_setup(vcp, from, to) \
- (convert_setup(vcp, (char_u *)from, (char_u *)to))
-#define os_getperm(f) \
- (os_getperm((char_u *) f))
#define os_isdir(f) (os_isdir((char_u *) f))
#define regtilde(s, m) ((char *) regtilde((char_u *) s, m))
#define path_tail_with_sep(f) ((char *) path_tail_with_sep((char_u *)f))
@@ -103,6 +100,7 @@ KHASH_SET_INIT_STR(strset)
#define REG_KEY_TYPE "rt"
#define REG_KEY_WIDTH "rw"
#define REG_KEY_CONTENTS "rc"
+#define REG_KEY_UNNAMED "ru"
#define KEY_LNUM "l"
#define KEY_COL "c"
@@ -119,9 +117,10 @@ KHASH_SET_INIT_STR(strset)
// E576: Missing '>'
// E577: Illegal register name
// E886: Can't rename viminfo file to %s!
+// E929: Too many viminfo temp files, like %s!
// Now only six of them are used:
// E137: ShaDa file is not writeable (for pre-open checks)
-// E138: All %s.tmp.X files exist, cannot write ShaDa file!
+// E929: All %s.tmp.X files exist, cannot write ShaDa file!
// RCERR (E576) for critical read errors.
// RNERR (E136) for various errors when renaming.
// RERR (E575) for various errors inside read ShaDa file.
@@ -149,6 +148,9 @@ KHASH_SET_INIT_STR(strset)
/// Common prefix for all ignorable โ€œwriteโ€ errors
#define WERR "E574: "
+/// Callback function for add_search_pattern
+typedef void (*SearchPatternGetter)(SearchPattern *);
+
/// Flags for shada_read_file and children
typedef enum {
kShaDaWantInfo = 1, ///< Load non-mark information
@@ -285,6 +287,7 @@ typedef struct {
char name;
MotionType type;
char **contents;
+ bool is_unnamed;
size_t contents_size;
size_t width;
dict_T *additional_data;
@@ -374,7 +377,8 @@ KHASH_MAP_INIT_STR(file_marks, FileMarks)
/// Before actually writing most of the data is read to this structure.
typedef struct {
HistoryMergerState hms[HIST_COUNT]; ///< Structures for history merging.
- PossiblyFreedShadaEntry global_marks[NGLOBALMARKS]; ///< All global marks.
+ PossiblyFreedShadaEntry global_marks[NMARKS]; ///< Named global marks.
+ PossiblyFreedShadaEntry numbered_marks[EXTRA_MARKS]; ///< Numbered marks.
PossiblyFreedShadaEntry registers[NUM_SAVED_REGISTERS]; ///< All registers.
PossiblyFreedShadaEntry jumps[JUMPLISTSIZE]; ///< All dumped jumps.
size_t jumps_size; ///< Number of jumps occupied.
@@ -412,8 +416,6 @@ typedef struct sd_read_def {
const char *error; ///< Error message in case of error.
uintmax_t fpos; ///< Current position (amount of bytes read since
///< reader structure initialization). May overflow.
- vimconv_T sd_conv; ///< Structure used for converting encodings of some
- ///< items.
} ShaDaReadDef;
struct sd_write_def;
@@ -434,8 +436,6 @@ typedef struct sd_write_def {
ShaDaWriteCloser close; ///< Close function.
void *cookie; ///< Data describing object written to.
const char *error; ///< Error message in case of error.
- vimconv_T sd_conv; ///< Structure used for converting encodings of some
- ///< items.
} ShaDaWriteDef;
#ifdef INCLUDE_GENERATED_DECLARATIONS
@@ -478,6 +478,7 @@ static const ShadaEntry sd_default_values[] = {
.type = kMTCharWise,
.contents = NULL,
.contents_size = 0,
+ .is_unnamed = false,
.width = 0,
.additional_data = NULL),
DEF_SDE(Variable, global_var,
@@ -598,6 +599,7 @@ static inline void hmll_insert(HMLList *const hmll,
if (hmll_entry == hmll->first) {
hmll_entry = NULL;
}
+ assert(hmll->first != NULL);
hmll_remove(hmll, hmll->first);
}
HMLListEntry *target_entry;
@@ -802,7 +804,7 @@ static int open_shada_file_for_reading(const char *const fname,
return error;
}
- convert_setup(&sd_reader->sd_conv, "utf-8", p_enc);
+ assert(STRCMP(p_enc, "utf-8") == 0);
return 0;
}
@@ -810,7 +812,7 @@ static int open_shada_file_for_reading(const char *const fname,
/// Wrapper for closing file descriptors
static void close_file(void *cookie)
{
- const int error = file_free(cookie);
+ const int error = file_free(cookie, !!p_fs);
if (error != 0) {
emsgf(_(SERR "System error while closing ShaDa file: %s"),
os_strerror(error));
@@ -883,7 +885,7 @@ static int shada_read_file(const char *const file, const int flags)
if (p_verbose > 0) {
verbose_enter();
- smsg(_("Reading ShaDa file \"%s\"%s%s%s"),
+ smsg(_("Reading ShaDa file \"%s\"%s%s%s%s"),
fname,
(flags & kShaDaWantInfo) ? _(" info") : "",
(flags & kShaDaWantMarks) ? _(" marks") : "",
@@ -1182,8 +1184,7 @@ static void shada_read(ShaDaReadDef *const sd_reader, const int flags)
list_T *oldfiles_list = get_vim_var_list(VV_OLDFILES);
const bool force = flags & kShaDaForceit;
const bool get_old_files = (flags & (kShaDaGetOldfiles | kShaDaForceit)
- && (force || oldfiles_list == NULL
- || oldfiles_list->lv_len == 0));
+ && (force || tv_list_len(oldfiles_list) == 0));
const bool want_marks = flags & kShaDaWantMarks;
const unsigned srni_flags = (unsigned) (
(flags & kShaDaWantInfo
@@ -1220,7 +1221,7 @@ static void shada_read(ShaDaReadDef *const sd_reader, const int flags)
khash_t(fnamebufs) fname_bufs = KHASH_EMPTY_TABLE(fnamebufs);
khash_t(strset) oldfiles_set = KHASH_EMPTY_TABLE(strset);
if (get_old_files && (oldfiles_list == NULL || force)) {
- oldfiles_list = list_alloc();
+ oldfiles_list = tv_list_alloc(kListLenUnknown);
set_vim_var_list(VV_OLDFILES, oldfiles_list);
}
ShaDaReadResult srni_ret;
@@ -1282,8 +1283,6 @@ static void shada_read(ShaDaReadDef *const sd_reader, const int flags)
if (cur_entry.data.search_pattern.is_last_used) {
set_last_used_pattern(
cur_entry.data.search_pattern.is_substitute_pattern);
- }
- if (cur_entry.data.search_pattern.is_last_used) {
SET_NO_HLSEARCH(!cur_entry.data.search_pattern.highlighted);
}
// Do not free shada entry: its allocated memory was saved above.
@@ -1342,7 +1341,7 @@ static void shada_read(ShaDaReadDef *const sd_reader, const int flags)
.y_width = (colnr_T) cur_entry.data.reg.width,
.timestamp = cur_entry.timestamp,
.additional_data = cur_entry.data.reg.additional_data,
- })) {
+ }, cur_entry.data.reg.is_unnamed)) {
shada_free_shada_entry(&cur_entry);
}
// Do not free shada entry: its allocated memory was saved above.
@@ -1402,7 +1401,7 @@ static void shada_read(ShaDaReadDef *const sd_reader, const int flags)
}
case kSDItemBufferList: {
for (size_t i = 0; i < cur_entry.data.buffer_list.size; i++) {
- char *const sfname = path_shorten_fname_if_possible(
+ char *const sfname = path_try_shorten_fname(
cur_entry.data.buffer_list.buffers[i].fname);
buf_T *const buf = buflist_new(
cur_entry.data.buffer_list.buffers[i].fname, sfname, 0,
@@ -1432,8 +1431,8 @@ static void shada_read(ShaDaReadDef *const sd_reader, const int flags)
fname = xstrdup(fname);
}
int kh_ret;
- (void) kh_put(strset, &oldfiles_set, fname, &kh_ret);
- list_append_allocated_string(oldfiles_list, fname);
+ (void)kh_put(strset, &oldfiles_set, fname, &kh_ret);
+ tv_list_append_allocated_string(oldfiles_list, fname);
if (!want_marks) {
// Avoid free because this string was already used.
cur_entry.data.filemark.fname = NULL;
@@ -1524,7 +1523,7 @@ static const char *shada_get_default_file(void)
FUNC_ATTR_WARN_UNUSED_RESULT
{
if (default_shada_file == NULL) {
- char *shada_dir = stdpaths_user_data_subpath("shada", 0);
+ char *shada_dir = stdpaths_user_data_subpath("shada", 0, false);
default_shada_file = concat_fnames_realloc(shada_dir, "main.shada", true);
}
return default_shada_file;
@@ -1570,13 +1569,17 @@ static char *shada_filename(const char *file)
do { \
const String s_ = (s); \
msgpack_pack_str(spacker, s_.size); \
- msgpack_pack_str_body(spacker, s_.data, s_.size); \
+ if (s_.size) { \
+ msgpack_pack_str_body(spacker, s_.data, s_.size); \
+ } \
} while (0)
#define PACK_BIN(s) \
do { \
const String s_ = (s); \
msgpack_pack_bin(spacker, s_.size); \
- msgpack_pack_bin_body(spacker, s_.data, s_.size); \
+ if (s_.size > 0) { \
+ msgpack_pack_bin_body(spacker, s_.data, s_.size); \
+ } \
} while (0)
/// Write single ShaDa entry
@@ -1599,13 +1602,13 @@ static ShaDaWriteResult shada_pack_entry(msgpack_packer *const packer,
#define DUMP_ADDITIONAL_ELEMENTS(src, what) \
do { \
if ((src) != NULL) { \
- for (listitem_T *li = (src)->lv_first; li != NULL; li = li->li_next) { \
- if (encode_vim_to_msgpack(spacker, &li->li_tv, \
+ TV_LIST_ITER((src), li, { \
+ if (encode_vim_to_msgpack(spacker, TV_LIST_ITEM_TV(li), \
_("additional elements of ShaDa " what)) \
== FAIL) { \
goto shada_pack_entry_error; \
} \
- } \
+ }); \
} \
} while (0)
#define DUMP_ADDITIONAL_DATA(src, what) \
@@ -1616,10 +1619,10 @@ static ShaDaWriteResult shada_pack_entry(msgpack_packer *const packer,
for (const hashitem_T *hi= d->dv_hashtab.ht_array; todo; hi++) { \
if (!HASHITEM_EMPTY(hi)) { \
todo--; \
- dictitem_T *const di = HI2DI(hi); \
- const size_t key_len = strlen((const char *) hi->hi_key); \
+ dictitem_T *const di = TV_DICT_HI2DI(hi); \
+ const size_t key_len = strlen((const char *)hi->hi_key); \
msgpack_pack_str(spacker, key_len); \
- msgpack_pack_str_body(spacker, (const char *) hi->hi_key, key_len); \
+ msgpack_pack_str_body(spacker, (const char *)hi->hi_key, key_len); \
if (encode_vim_to_msgpack(spacker, &di->di_tv, \
_("additional data of ShaDa " what)) \
== FAIL) { \
@@ -1647,25 +1650,21 @@ static ShaDaWriteResult shada_pack_entry(msgpack_packer *const packer,
case kSDItemHistoryEntry: {
const bool is_hist_search =
entry.data.history_item.histtype == HIST_SEARCH;
- const size_t arr_size = 2 + (size_t) is_hist_search + (size_t) (
- entry.data.history_item.additional_elements == NULL
- ? 0
- : entry.data.history_item.additional_elements->lv_len);
+ const size_t arr_size = 2 + (size_t)is_hist_search + (size_t)(
+ tv_list_len(entry.data.history_item.additional_elements));
msgpack_pack_array(spacker, arr_size);
msgpack_pack_uint8(spacker, entry.data.history_item.histtype);
PACK_BIN(cstr_as_string(entry.data.history_item.string));
if (is_hist_search) {
- msgpack_pack_uint8(spacker, (uint8_t) entry.data.history_item.sep);
+ msgpack_pack_uint8(spacker, (uint8_t)entry.data.history_item.sep);
}
DUMP_ADDITIONAL_ELEMENTS(entry.data.history_item.additional_elements,
"history entry item");
break;
}
case kSDItemVariable: {
- const size_t arr_size = 2 + (size_t) (
- entry.data.global_var.additional_elements == NULL
- ? 0
- : entry.data.global_var.additional_elements->lv_len);
+ const size_t arr_size = 2 + (size_t)(
+ tv_list_len(entry.data.global_var.additional_elements));
msgpack_pack_array(spacker, arr_size);
const String varname = cstr_as_string(entry.data.global_var.name);
PACK_BIN(varname);
@@ -1684,10 +1683,8 @@ static ShaDaWriteResult shada_pack_entry(msgpack_packer *const packer,
break;
}
case kSDItemSubString: {
- const size_t arr_size = 1 + (size_t) (
- entry.data.sub_string.additional_elements == NULL
- ? 0
- : entry.data.sub_string.additional_elements->lv_len);
+ const size_t arr_size = 1 + (size_t)(
+ tv_list_len(entry.data.sub_string.additional_elements));
msgpack_pack_array(spacker, arr_size);
PACK_BIN(cstr_as_string(entry.data.sub_string.sub));
DUMP_ADDITIONAL_ELEMENTS(entry.data.sub_string.additional_elements,
@@ -1783,6 +1780,7 @@ static ShaDaWriteResult shada_pack_entry(msgpack_packer *const packer,
2 // Register contents and name
+ ONE_IF_NOT_DEFAULT(entry, reg.type)
+ ONE_IF_NOT_DEFAULT(entry, reg.width)
+ + ONE_IF_NOT_DEFAULT(entry, reg.is_unnamed)
// Additional entries, if any:
+ (size_t) (entry.data.reg.additional_data == NULL
? 0
@@ -1803,6 +1801,14 @@ static ShaDaWriteResult shada_pack_entry(msgpack_packer *const packer,
PACK_STATIC_STR(REG_KEY_WIDTH);
msgpack_pack_uint64(spacker, (uint64_t) entry.data.reg.width);
}
+ if (!CHECK_DEFAULT(entry, reg.is_unnamed)) {
+ PACK_STATIC_STR(REG_KEY_UNNAMED);
+ if (entry.data.reg.is_unnamed) {
+ msgpack_pack_true(spacker);
+ } else {
+ msgpack_pack_false(spacker);
+ }
+ }
DUMP_ADDITIONAL_DATA(entry.data.reg.additional_data, "register item");
break;
}
@@ -1894,127 +1900,24 @@ shada_pack_entry_error:
}
#undef PACK_STRING
-/// Write single ShaDa entry, converting it if needed
+/// Write single ShaDa entry and free it afterwards
///
-/// @warning Frees entry after packing.
+/// Will not free if entry could not be freed.
///
/// @param[in] packer Packer used to write entry.
-/// @param[in] sd_conv Conversion definitions.
-/// @param[in] entry Entry written. If entry.can_free_entry is false then
-/// it assumes that entry was not converted, otherwise it
-/// is assumed that entry was already converted.
+/// @param[in] entry Entry written.
/// @param[in] max_kbyte Maximum size of an item in KiB. Zero means no
/// restrictions.
-static ShaDaWriteResult shada_pack_encoded_entry(msgpack_packer *const packer,
- const vimconv_T *const sd_conv,
- PossiblyFreedShadaEntry entry,
- const size_t max_kbyte)
- FUNC_ATTR_NONNULL_ALL
+static inline ShaDaWriteResult shada_pack_pfreed_entry(
+ msgpack_packer *const packer, PossiblyFreedShadaEntry entry,
+ const size_t max_kbyte)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_ALWAYS_INLINE
{
ShaDaWriteResult ret = kSDWriteSuccessfull;
+ ret = shada_pack_entry(packer, entry.data, max_kbyte);
if (entry.can_free_entry) {
- ret = shada_pack_entry(packer, entry.data, max_kbyte);
shada_free_shada_entry(&entry.data);
- return ret;
}
-#define RUN_WITH_CONVERTED_STRING(cstr, code) \
- do { \
- bool did_convert = false; \
- if (sd_conv->vc_type != CONV_NONE && has_non_ascii((cstr))) { \
- char *const converted_string = string_convert(sd_conv, (cstr), NULL); \
- if (converted_string != NULL) { \
- (cstr) = converted_string; \
- did_convert = true; \
- } \
- } \
- code \
- if (did_convert) { \
- xfree((cstr)); \
- } \
- } while (0)
- switch (entry.data.type) {
- case kSDItemUnknown:
- case kSDItemMissing: {
- assert(false);
- }
- case kSDItemSearchPattern: {
- RUN_WITH_CONVERTED_STRING(entry.data.data.search_pattern.pat, {
- ret = shada_pack_entry(packer, entry.data, max_kbyte);
- });
- break;
- }
- case kSDItemHistoryEntry: {
- RUN_WITH_CONVERTED_STRING(entry.data.data.history_item.string, {
- ret = shada_pack_entry(packer, entry.data, max_kbyte);
- });
- break;
- }
- case kSDItemSubString: {
- RUN_WITH_CONVERTED_STRING(entry.data.data.sub_string.sub, {
- ret = shada_pack_entry(packer, entry.data, max_kbyte);
- });
- break;
- }
- case kSDItemVariable: {
- if (sd_conv->vc_type != CONV_NONE) {
- typval_T tgttv;
- var_item_copy(sd_conv, &entry.data.data.global_var.value, &tgttv,
- true, 0);
- clear_tv(&entry.data.data.global_var.value);
- entry.data.data.global_var.value = tgttv;
- }
- ret = shada_pack_entry(packer, entry.data, max_kbyte);
- break;
- }
- case kSDItemRegister: {
- bool did_convert = false;
- if (sd_conv->vc_type != CONV_NONE) {
- size_t first_non_ascii = 0;
- for (size_t i = 0; i < entry.data.data.reg.contents_size; i++) {
- if (has_non_ascii(entry.data.data.reg.contents[i])) {
- first_non_ascii = i;
- did_convert = true;
- break;
- }
- }
- if (did_convert) {
- entry.data.data.reg.contents =
- xmemdup(entry.data.data.reg.contents,
- (entry.data.data.reg.contents_size
- * sizeof(entry.data.data.reg.contents)));
- for (size_t i = 0; i < entry.data.data.reg.contents_size; i++) {
- if (i >= first_non_ascii) {
- entry.data.data.reg.contents[i] = get_converted_string(
- sd_conv,
- entry.data.data.reg.contents[i],
- strlen(entry.data.data.reg.contents[i]));
- } else {
- entry.data.data.reg.contents[i] =
- xstrdup(entry.data.data.reg.contents[i]);
- }
- }
- }
- }
- ret = shada_pack_entry(packer, entry.data, max_kbyte);
- if (did_convert) {
- for (size_t i = 0; i < entry.data.data.reg.contents_size; i++) {
- xfree(entry.data.data.reg.contents[i]);
- }
- xfree(entry.data.data.reg.contents);
- }
- break;
- }
- case kSDItemHeader:
- case kSDItemGlobalMark:
- case kSDItemJump:
- case kSDItemBufferList:
- case kSDItemLocalMark:
- case kSDItemChange: {
- ret = shada_pack_entry(packer, entry.data, max_kbyte);
- break;
- }
- }
-#undef RUN_WITH_CONVERTED_STRING
return ret;
}
@@ -2121,6 +2024,113 @@ shada_parse_msgpack_extra_bytes:
return ret;
}
+/// Format shada entry for debugging purposes
+///
+/// @param[in] entry ShaDa entry to format.
+///
+/// @return string representing ShaDa entry in a static buffer.
+static const char *shada_format_entry(const ShadaEntry entry)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_UNUSED FUNC_ATTR_NONNULL_RET
+{
+ static char ret[1024];
+ ret[0] = 0;
+ vim_snprintf(S_LEN(ret), "%s", "[ ] ts=%" PRIu64 " ");
+ // ^ Space for `can_free_entry`
+ switch (entry.type) {
+ case kSDItemMissing: {
+ vim_snprintf_add(S_LEN(ret), "Missing");
+ break;
+ }
+ case kSDItemHeader: {
+ vim_snprintf_add(S_LEN(ret), "Header { TODO }");
+ break;
+ }
+ case kSDItemBufferList: {
+ vim_snprintf_add(S_LEN(ret), "BufferList { TODO }");
+ break;
+ }
+ case kSDItemUnknown: {
+ vim_snprintf_add(S_LEN(ret), "Unknown { TODO }");
+ break;
+ }
+ case kSDItemSearchPattern: {
+ vim_snprintf_add(S_LEN(ret), "SearchPattern { TODO }");
+ break;
+ }
+ case kSDItemSubString: {
+ vim_snprintf_add(S_LEN(ret), "SubString { TODO }");
+ break;
+ }
+ case kSDItemHistoryEntry: {
+ vim_snprintf_add(S_LEN(ret), "HistoryEntry { TODO }");
+ break;
+ }
+ case kSDItemRegister: {
+ vim_snprintf_add(S_LEN(ret), "Register { TODO }");
+ break;
+ }
+ case kSDItemVariable: {
+ vim_snprintf_add(S_LEN(ret), "Variable { TODO }");
+ break;
+ }
+#define FORMAT_MARK_ENTRY(entry_name, name_fmt, name_fmt_arg) \
+ do { \
+ typval_T ad_tv = { \
+ .v_type = VAR_DICT, \
+ .vval.v_dict = entry.data.filemark.additional_data \
+ }; \
+ size_t ad_len; \
+ char *const ad = encode_tv2string(&ad_tv, &ad_len); \
+ vim_snprintf_add( \
+ S_LEN(ret), \
+ entry_name " {" name_fmt " file=[%zu]\"%.512s\", " \
+ "pos={l=%" PRIdLINENR ",c=%" PRIdCOLNR ",a=%" PRIdCOLNR "}, " \
+ "ad={%p:[%zu]%.64s} }", \
+ name_fmt_arg, \
+ strlen(entry.data.filemark.fname), \
+ entry.data.filemark.fname, \
+ entry.data.filemark.mark.lnum, \
+ entry.data.filemark.mark.col, \
+ entry.data.filemark.mark.coladd, \
+ (void *)entry.data.filemark.additional_data, \
+ ad_len, \
+ ad); \
+ } while (0)
+ case kSDItemGlobalMark: {
+ FORMAT_MARK_ENTRY("GlobalMark", " name='%c',", entry.data.filemark.name);
+ break;
+ }
+ case kSDItemChange: {
+ FORMAT_MARK_ENTRY("Change", "%s", "");
+ break;
+ }
+ case kSDItemLocalMark: {
+ FORMAT_MARK_ENTRY("LocalMark", " name='%c',", entry.data.filemark.name);
+ break;
+ }
+ case kSDItemJump: {
+ FORMAT_MARK_ENTRY("Jump", "%s", "");
+ break;
+ }
+#undef FORMAT_MARK_ENTRY
+ }
+ return ret;
+}
+
+/// Format possibly freed shada entry for debugging purposes
+///
+/// @param[in] entry ShaDa entry to format.
+///
+/// @return string representing ShaDa entry in a static buffer.
+static const char *shada_format_pfreed_entry(
+ const PossiblyFreedShadaEntry pfs_entry)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_UNUSED FUNC_ATTR_NONNULL_RET
+{
+ char *ret = (char *)shada_format_entry(pfs_entry.data);
+ ret[1] = (pfs_entry.can_free_entry ? 'T' : 'F');
+ return ret;
+}
+
/// Read and merge in ShaDa file, used when writing
///
/// @param[in] sd_reader Structure containing file reader definition.
@@ -2151,7 +2161,7 @@ static inline ShaDaWriteResult shada_read_when_writing(
}
case kSDReadStatusNotShaDa: {
ret = kSDWriteReadNotShada;
- // fallthrough
+ FALLTHROUGH;
}
case kSDReadStatusReadError: {
return ret;
@@ -2172,9 +2182,12 @@ static inline ShaDaWriteResult shada_read_when_writing(
shada_free_shada_entry(&wms_entry->data); \
} \
} \
- wms_entry->can_free_entry = true; \
- wms_entry->data = (entry); \
+ *wms_entry = pfs_entry; \
} while (0)
+ const PossiblyFreedShadaEntry pfs_entry = {
+ .can_free_entry = true,
+ .data = entry,
+ };
switch (entry.type) {
case kSDItemMissing: {
break;
@@ -2226,13 +2239,49 @@ static inline ShaDaWriteResult shada_read_when_writing(
break;
}
case kSDItemGlobalMark: {
- const int idx = mark_global_index(entry.data.filemark.name);
- if (idx < 0) {
- ret = shada_pack_entry(packer, entry, 0);
- shada_free_shada_entry(&entry);
- break;
+ if (ascii_isdigit(entry.data.filemark.name)) {
+ bool processed_mark = false;
+ // Completely ignore numbered mark names, make a list sorted by
+ // timestamp.
+ for (size_t i = ARRAY_SIZE(wms->numbered_marks); i > 0; i--) {
+ ShadaEntry wms_entry = wms->numbered_marks[i - 1].data;
+ if (wms_entry.type != kSDItemGlobalMark) {
+ continue;
+ }
+ // Ignore duplicates.
+ if (wms_entry.timestamp == entry.timestamp
+ && (wms_entry.data.filemark.additional_data == NULL
+ && entry.data.filemark.additional_data == NULL)
+ && marks_equal(wms_entry.data.filemark.mark,
+ entry.data.filemark.mark)
+ && strcmp(wms_entry.data.filemark.fname,
+ entry.data.filemark.fname) == 0) {
+ shada_free_shada_entry(&entry);
+ processed_mark = true;
+ break;
+ }
+ if (wms_entry.timestamp >= entry.timestamp) {
+ processed_mark = true;
+ if (i < ARRAY_SIZE(wms->numbered_marks)) {
+ replace_numbered_mark(wms, i, pfs_entry);
+ } else {
+ shada_free_shada_entry(&entry);
+ }
+ break;
+ }
+ }
+ if (!processed_mark) {
+ replace_numbered_mark(wms, 0, pfs_entry);
+ }
+ } else {
+ const int idx = mark_global_index(entry.data.filemark.name);
+ if (idx < 0) {
+ ret = shada_pack_entry(packer, entry, 0);
+ shada_free_shada_entry(&entry);
+ break;
+ }
+ COMPARE_WITH_ENTRY(&wms->global_marks[idx], entry);
}
- COMPARE_WITH_ENTRY(&wms->global_marks[idx], entry);
break;
}
case kSDItemChange:
@@ -2276,8 +2325,7 @@ static inline ShaDaWriteResult shada_read_when_writing(
shada_free_shada_entry(&wms_entry->data);
}
}
- wms_entry->can_free_entry = true;
- wms_entry->data = entry;
+ *wms_entry = pfs_entry;
}
} else {
#define FREE_POSSIBLY_FREED_SHADA_ENTRY(entry) \
@@ -2317,6 +2365,194 @@ static inline ShaDaWriteResult shada_read_when_writing(
return ret;
}
+/// Check whether buffer should be ignored
+///
+/// @param[in] buf buf_T* to check.
+/// @param[in] removable_bufs Cache of buffers ignored due to their location.
+///
+/// @return true or false.
+static inline bool ignore_buf(const buf_T *const buf,
+ khash_t(bufset) *const removable_bufs)
+ FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_ALWAYS_INLINE
+{
+ return (buf->b_ffname == NULL || !buf->b_p_bl || bt_quickfix(buf) \
+ || in_bufset(removable_bufs, buf));
+}
+
+/// Get list of buffers to write to the shada file
+///
+/// @param[in] removable_bufs Buffers which are ignored
+///
+/// @return ShadaEntry List of buffers to save, kSDItemBufferList entry.
+static inline ShadaEntry shada_get_buflist(
+ khash_t(bufset) *const removable_bufs)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_ALWAYS_INLINE
+{
+ int max_bufs = get_shada_parameter('%');
+ size_t buf_count = 0;
+ FOR_ALL_BUFFERS(buf) {
+ if (!ignore_buf(buf, removable_bufs)
+ && (max_bufs < 0 || buf_count < (size_t)max_bufs)) {
+ buf_count++;
+ }
+ }
+
+ ShadaEntry buflist_entry = (ShadaEntry) {
+ .type = kSDItemBufferList,
+ .timestamp = os_time(),
+ .data = {
+ .buffer_list = {
+ .size = buf_count,
+ .buffers = xmalloc(buf_count
+ * sizeof(*buflist_entry.data.buffer_list.buffers)),
+ },
+ },
+ };
+ size_t i = 0;
+ FOR_ALL_BUFFERS(buf) {
+ if (ignore_buf(buf, removable_bufs)) {
+ continue;
+ }
+ if (i >= buf_count) {
+ break;
+ }
+ buflist_entry.data.buffer_list.buffers[i] = (struct buffer_list_buffer) {
+ .pos = buf->b_last_cursor.mark,
+ .fname = (char *)buf->b_ffname,
+ .additional_data = buf->additional_data,
+ };
+ i++;
+ }
+
+ return buflist_entry;
+}
+
+/// Save search pattern to PossiblyFreedShadaEntry
+///
+/// @param[out] ret_pse Location where result will be saved.
+/// @param[in] get_pattern Function used to get pattern.
+/// @param[in] is_substitute_pattern True if pattern in question is substitute
+/// pattern. Also controls whether some
+/// fields should be initialized to default
+/// or values from get_pattern.
+/// @param[in] search_last_used Result of search_was_last_used().
+/// @param[in] search_highlighted True if search pattern was highlighted by
+/// &hlsearch and this information should be
+/// saved.
+static inline void add_search_pattern(PossiblyFreedShadaEntry *const ret_pse,
+ const SearchPatternGetter get_pattern,
+ const bool is_substitute_pattern,
+ const bool search_last_used,
+ const bool search_highlighted)
+ FUNC_ATTR_ALWAYS_INLINE
+{
+ const ShadaEntry defaults = sd_default_values[kSDItemSearchPattern];
+ SearchPattern pat;
+ get_pattern(&pat);
+ if (pat.pat != NULL) {
+ *ret_pse = (PossiblyFreedShadaEntry) {
+ .can_free_entry = false,
+ .data = {
+ .type = kSDItemSearchPattern,
+ .timestamp = pat.timestamp,
+ .data = {
+ .search_pattern = {
+ .magic = pat.magic,
+ .smartcase = !pat.no_scs,
+ .has_line_offset = (is_substitute_pattern
+ ? defaults.data.search_pattern.has_line_offset
+ : pat.off.line),
+ .place_cursor_at_end = (
+ is_substitute_pattern
+ ? defaults.data.search_pattern.place_cursor_at_end
+ : pat.off.end),
+ .offset = (is_substitute_pattern
+ ? defaults.data.search_pattern.offset
+ : pat.off.off),
+ .is_last_used = (is_substitute_pattern ^ search_last_used),
+ .is_substitute_pattern = is_substitute_pattern,
+ .highlighted = ((is_substitute_pattern ^ search_last_used)
+ && search_highlighted),
+ .pat = (char *)pat.pat,
+ .additional_data = pat.additional_data,
+ .search_backward = (!is_substitute_pattern && pat.off.dir == '?'),
+ }
+ }
+ }
+ };
+ }
+}
+
+/// Initialize registers for writing to the ShaDa file
+///
+/// @param[in] wms The WriteMergerState used when writing.
+/// @param[in] max_reg_lines The maximum number of register lines.
+static inline void shada_initialize_registers(WriteMergerState *const wms,
+ int max_reg_lines)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_ALWAYS_INLINE
+{
+ const void *reg_iter = NULL;
+ const bool limit_reg_lines = max_reg_lines >= 0;
+ do {
+ yankreg_T reg;
+ char name = NUL;
+ bool is_unnamed = false;
+ reg_iter = op_register_iter(reg_iter, &name, &reg, &is_unnamed);
+ if (name == NUL) {
+ break;
+ }
+ if (limit_reg_lines && reg.y_size > (size_t)max_reg_lines) {
+ continue;
+ }
+ wms->registers[op_reg_index(name)] = (PossiblyFreedShadaEntry) {
+ .can_free_entry = false,
+ .data = {
+ .type = kSDItemRegister,
+ .timestamp = reg.timestamp,
+ .data = {
+ .reg = {
+ .contents = (char **)reg.y_array,
+ .contents_size = (size_t)reg.y_size,
+ .type = reg.y_type,
+ .width = (size_t)(reg.y_type == kMTBlockWise ? reg.y_width : 0),
+ .additional_data = reg.additional_data,
+ .name = name,
+ .is_unnamed = is_unnamed,
+ }
+ }
+ }
+ };
+ } while (reg_iter != NULL);
+}
+
+/// Replace numbered mark in WriteMergerState
+///
+/// Frees the last mark, moves (including adjusting mark names) marks from idx
+/// to the last-but-one one and saves the new mark at given index.
+///
+/// @param[out] wms Merger state to adjust.
+/// @param[in] idx Index at which new mark should be placed.
+/// @param[in] entry New mark.
+static inline void replace_numbered_mark(WriteMergerState *const wms,
+ const size_t idx,
+ const PossiblyFreedShadaEntry entry)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_ALWAYS_INLINE
+{
+ if (ARRAY_LAST_ENTRY(wms->numbered_marks).can_free_entry) {
+ shada_free_shada_entry(&ARRAY_LAST_ENTRY(wms->numbered_marks).data);
+ }
+ for (size_t i = idx; i < ARRAY_SIZE(wms->numbered_marks) - 1; i++) {
+ if (wms->numbered_marks[i].data.type == kSDItemGlobalMark) {
+ wms->numbered_marks[i].data.data.filemark.name = (char)('0' + (int)i + 1);
+ }
+ }
+ memmove(wms->numbered_marks + idx + 1, wms->numbered_marks + idx,
+ sizeof(wms->numbered_marks[0])
+ * (ARRAY_SIZE(wms->numbered_marks) - 1 - idx));
+ wms->numbered_marks[idx] = entry;
+ wms->numbered_marks[idx].data.data.filemark.name = (char)('0' + (int)idx);
+}
+
/// Write ShaDa file
///
/// @param[in] sd_writer Structure containing file writer definition.
@@ -2343,7 +2579,6 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer,
if (max_reg_lines < 0) {
max_reg_lines = get_shada_parameter('"');
}
- const bool limit_reg_lines = max_reg_lines >= 0;
const bool dump_registers = (max_reg_lines != 0);
khash_t(bufset) removable_bufs = KHASH_EMPTY_TABLE(bufset);
const size_t max_kbyte = (size_t) max_kbyte_i;
@@ -2423,46 +2658,13 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer,
// Write buffer list
if (find_shada_parameter('%') != NULL) {
- size_t buf_count = 0;
-#define IGNORE_BUF(buf)\
- (buf->b_ffname == NULL || !buf->b_p_bl || bt_quickfix(buf) \
- || in_bufset(&removable_bufs, buf))
- FOR_ALL_BUFFERS(buf) {
- if (!IGNORE_BUF(buf)) {
- buf_count++;
- }
- }
-
- ShadaEntry buflist_entry = (ShadaEntry) {
- .type = kSDItemBufferList,
- .timestamp = os_time(),
- .data = {
- .buffer_list = {
- .size = buf_count,
- .buffers = xmalloc(buf_count
- * sizeof(*buflist_entry.data.buffer_list.buffers)),
- },
- },
- };
- size_t i = 0;
- FOR_ALL_BUFFERS(buf) {
- if (IGNORE_BUF(buf)) {
- continue;
- }
- buflist_entry.data.buffer_list.buffers[i] = (struct buffer_list_buffer) {
- .pos = buf->b_last_cursor.mark,
- .fname = (char *) buf->b_ffname,
- .additional_data = buf->additional_data,
- };
- i++;
- }
+ ShadaEntry buflist_entry = shada_get_buflist(&removable_bufs);
if (shada_pack_entry(packer, buflist_entry, 0) == kSDWriteFailed) {
xfree(buflist_entry.data.buffer_list.buffers);
ret = kSDWriteFailed;
goto shada_write_exit;
}
xfree(buflist_entry.data.buffer_list.buffers);
-#undef IGNORE_BUF
}
// Write some of the variables
@@ -2477,11 +2679,7 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer,
break;
}
typval_T tgttv;
- if (sd_writer->sd_conv.vc_type != CONV_NONE) {
- var_item_copy(&sd_writer->sd_conv, &vartv, &tgttv, true, 0);
- } else {
- copy_tv(&vartv, &tgttv);
- }
+ tv_copy(&vartv, &tgttv);
ShaDaWriteResult spe_ret;
if ((spe_ret = shada_pack_entry(packer, (ShadaEntry) {
.type = kSDItemVariable,
@@ -2494,13 +2692,13 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer,
}
}
}, max_kbyte)) == kSDWriteFailed) {
- clear_tv(&vartv);
- clear_tv(&tgttv);
+ tv_clear(&vartv);
+ tv_clear(&tgttv);
ret = kSDWriteFailed;
goto shada_write_exit;
}
- clear_tv(&vartv);
- clear_tv(&tgttv);
+ tv_clear(&vartv);
+ tv_clear(&tgttv);
if (spe_ret == kSDWriteSuccessfull) {
int kh_ret;
(void) kh_put(strset, &wms->dumped_variables, name, &kh_ret);
@@ -2511,45 +2709,14 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer,
const bool search_highlighted = !(no_hlsearch
|| find_shada_parameter('h') != NULL);
const bool search_last_used = search_was_last_used();
-#define ADD_SEARCH_PAT(func, wms_attr, hlo, pcae, o, is_sub) \
- do { \
- SearchPattern pat; \
- func(&pat); \
- if (pat.pat != NULL) { \
- wms->wms_attr = (PossiblyFreedShadaEntry) { \
- .can_free_entry = false, \
- .data = { \
- .type = kSDItemSearchPattern, \
- .timestamp = pat.timestamp, \
- .data = { \
- .search_pattern = { \
- .magic = pat.magic, \
- .smartcase = !pat.no_scs, \
- .has_line_offset = hlo, \
- .place_cursor_at_end = pcae, \
- .offset = o, \
- .is_last_used = (is_sub ^ search_last_used), \
- .is_substitute_pattern = is_sub, \
- .highlighted = ((is_sub ^ search_last_used) \
- && search_highlighted), \
- .pat = (char *) pat.pat, \
- .additional_data = pat.additional_data, \
- .search_backward = (!is_sub && pat.off.dir == '?'), \
- } \
- } \
- } \
- }; \
- } \
- } while (0)
// Initialize search pattern
- ADD_SEARCH_PAT(get_search_pattern, search_pattern, pat.off.line, \
- pat.off.end, pat.off.off, false);
+ add_search_pattern(&wms->search_pattern, &get_search_pattern, false,
+ search_last_used, search_highlighted);
// Initialize substitute search pattern
- ADD_SEARCH_PAT(get_substitute_pattern, sub_search_pattern, false, false, 0,
- true);
-#undef ADD_SEARCH_PAT
+ add_search_pattern(&wms->sub_search_pattern, &get_substitute_pattern, true,
+ search_last_used, search_highlighted);
// Initialize substitute replacement string
{
@@ -2572,10 +2739,18 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer,
// Initialize jump list
const void *jump_iter = NULL;
+ setpcmark();
+ cleanup_jumplist();
do {
xfmark_T fm;
- cleanup_jumplist();
jump_iter = mark_jumplist_iter(jump_iter, curwin, &fm);
+
+ if (fm.fmark.mark.lnum == 0) {
+ iemsgf("ShaDa: mark lnum zero (ji:%p, js:%p, len:%i)",
+ (void *)jump_iter, (void *)&curwin->w_jumplist[0],
+ curwin->w_jumplistlen);
+ continue;
+ }
const buf_T *const buf = (fm.fmark.fnum == 0
? NULL
: buflist_findnr(fm.fmark.fnum));
@@ -2610,6 +2785,7 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer,
// Initialize global marks
if (dump_global_marks) {
const void *global_mark_iter = NULL;
+ size_t digit_mark_idx = 0;
do {
char name = NUL;
xfmark_T fm;
@@ -2632,7 +2808,7 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer,
}
fname = (const char *) buf->b_ffname;
}
- wms->global_marks[mark_global_index(name)] = (PossiblyFreedShadaEntry) {
+ const PossiblyFreedShadaEntry pf_entry = {
.can_free_entry = false,
.data = {
.type = kSDItemGlobalMark,
@@ -2642,45 +2818,22 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer,
.mark = fm.fmark.mark,
.name = name,
.additional_data = fm.fmark.additional_data,
- .fname = (char *) fname,
+ .fname = (char *)fname,
}
}
},
};
+ if (ascii_isdigit(name)) {
+ replace_numbered_mark(wms, digit_mark_idx++, pf_entry);
+ } else {
+ wms->global_marks[mark_global_index(name)] = pf_entry;
+ }
} while (global_mark_iter != NULL);
}
// Initialize registers
if (dump_registers) {
- const void *reg_iter = NULL;
- do {
- yankreg_T reg;
- char name = NUL;
- reg_iter = op_register_iter(reg_iter, &name, &reg);
- if (name == NUL) {
- break;
- }
- if (limit_reg_lines && reg.y_size > (size_t)max_reg_lines) {
- continue;
- }
- wms->registers[op_reg_index(name)] = (PossiblyFreedShadaEntry) {
- .can_free_entry = false,
- .data = {
- .type = kSDItemRegister,
- .timestamp = reg.timestamp,
- .data = {
- .reg = {
- .contents = (char **) reg.y_array,
- .contents_size = (size_t) reg.y_size,
- .type = reg.y_type,
- .width = (size_t) (reg.y_type == kMTBlockWise ? reg.y_width : 0),
- .additional_data = reg.additional_data,
- .name = name,
- }
- }
- }
- };
- } while (reg_iter != NULL);
+ shada_initialize_registers(wms, max_reg_lines);
}
// Initialize buffers
@@ -2756,14 +2909,33 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer,
}
}
+ // Update numbered marks: '0' should be replaced with the current position,
+ // '9' should be removed and all other marks shifted.
+ if (!ignore_buf(curbuf, &removable_bufs) && curwin->w_cursor.lnum != 0) {
+ replace_numbered_mark(wms, 0, (PossiblyFreedShadaEntry) {
+ .can_free_entry = false,
+ .data = {
+ .type = kSDItemGlobalMark,
+ .timestamp = os_time(),
+ .data = {
+ .filemark = {
+ .mark = curwin->w_cursor,
+ .name = '0',
+ .additional_data = NULL,
+ .fname = (char *)curbuf->b_ffname,
+ }
+ }
+ },
+ });
+ }
+
// Write the rest
#define PACK_WMS_ARRAY(wms_array) \
do { \
for (size_t i_ = 0; i_ < ARRAY_SIZE(wms_array); i_++) { \
if (wms_array[i_].data.type != kSDItemMissing) { \
- if (shada_pack_encoded_entry(packer, &sd_writer->sd_conv, \
- wms_array[i_], \
- max_kbyte) == kSDWriteFailed) { \
+ if (shada_pack_pfreed_entry(packer, wms_array[i_], max_kbyte) \
+ == kSDWriteFailed) { \
ret = kSDWriteFailed; \
goto shada_write_exit; \
} \
@@ -2771,10 +2943,11 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer,
} \
} while (0)
PACK_WMS_ARRAY(wms->global_marks);
+ PACK_WMS_ARRAY(wms->numbered_marks);
PACK_WMS_ARRAY(wms->registers);
for (size_t i = 0; i < wms->jumps_size; i++) {
- if (shada_pack_encoded_entry(packer, &sd_writer->sd_conv, wms->jumps[i],
- max_kbyte) == kSDWriteFailed) {
+ if (shada_pack_pfreed_entry(packer, wms->jumps[i], max_kbyte)
+ == kSDWriteFailed) {
ret = kSDWriteFailed;
goto shada_write_exit;
}
@@ -2782,8 +2955,8 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer,
#define PACK_WMS_ENTRY(wms_entry) \
do { \
if (wms_entry.data.type != kSDItemMissing) { \
- if (shada_pack_encoded_entry(packer, &sd_writer->sd_conv, wms_entry, \
- max_kbyte) == kSDWriteFailed) { \
+ if (shada_pack_pfreed_entry(packer, wms_entry, max_kbyte) \
+ == kSDWriteFailed) { \
ret = kSDWriteFailed; \
goto shada_write_exit; \
} \
@@ -2810,9 +2983,8 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer,
for (size_t i = 0; i < file_markss_to_dump; i++) {
PACK_WMS_ARRAY(all_file_markss[i]->marks);
for (size_t j = 0; j < all_file_markss[i]->changes_size; j++) {
- if (shada_pack_encoded_entry(packer, &sd_writer->sd_conv,
- all_file_markss[i]->changes[j],
- max_kbyte) == kSDWriteFailed) {
+ if (shada_pack_pfreed_entry(packer, all_file_markss[i]->changes[j],
+ max_kbyte) == kSDWriteFailed) {
ret = kSDWriteFailed;
goto shada_write_exit;
}
@@ -2836,8 +3008,8 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer,
if (dump_one_history[i]) {
hms_insert_whole_neovim_history(&wms->hms[i]);
HMS_ITER(&wms->hms[i], cur_entry, {
- if (shada_pack_encoded_entry(
- packer, &sd_writer->sd_conv, (PossiblyFreedShadaEntry) {
+ if (shada_pack_pfreed_entry(
+ packer, (PossiblyFreedShadaEntry) {
.data = cur_entry->data,
.can_free_entry = cur_entry->can_free_entry,
}, max_kbyte) == kSDWriteFailed) {
@@ -2866,6 +3038,7 @@ shada_write_exit:
return ret;
}
+#undef IGNORE_BUF
#undef PACK_STATIC_STR
/// Write ShaDa file to a given location
@@ -2976,7 +3149,7 @@ shada_write_file_nomerge: {}
if (sd_writer.cookie == NULL) {
xfree(fname);
xfree(tempname);
- if (sd_reader.close != NULL) {
+ if (sd_reader.cookie != NULL) {
sd_reader.close(&sd_reader);
}
return FAIL;
@@ -2988,8 +3161,6 @@ shada_write_file_nomerge: {}
verbose_leave();
}
- convert_setup(&sd_writer.sd_conv, p_enc, "utf-8");
-
const ShaDaWriteResult sw_ret = shada_write(&sd_writer, (nomerge
? NULL
: &sd_reader));
@@ -3037,7 +3208,7 @@ shada_write_file_nomerge: {}
} else {
if (sw_ret == kSDWriteReadNotShada) {
EMSG3(_(RNERR "Did not rename %s because %s "
- "does not looks like a ShaDa file"), tempname, fname);
+ "does not look like a ShaDa file"), tempname, fname);
} else {
EMSG3(_(RNERR "Did not rename %s to %s because there were errors "
"during writing it"), tempname, fname);
@@ -3104,17 +3275,17 @@ static void shada_free_shada_entry(ShadaEntry *const entry)
case kSDItemJump:
case kSDItemGlobalMark:
case kSDItemLocalMark: {
- dict_unref(entry->data.filemark.additional_data);
+ tv_dict_unref(entry->data.filemark.additional_data);
xfree(entry->data.filemark.fname);
break;
}
case kSDItemSearchPattern: {
- dict_unref(entry->data.search_pattern.additional_data);
+ tv_dict_unref(entry->data.search_pattern.additional_data);
xfree(entry->data.search_pattern.pat);
break;
}
case kSDItemRegister: {
- dict_unref(entry->data.reg.additional_data);
+ tv_dict_unref(entry->data.reg.additional_data);
for (size_t i = 0; i < entry->data.reg.contents_size; i++) {
xfree(entry->data.reg.contents[i]);
}
@@ -3122,25 +3293,25 @@ static void shada_free_shada_entry(ShadaEntry *const entry)
break;
}
case kSDItemHistoryEntry: {
- list_unref(entry->data.history_item.additional_elements);
+ tv_list_unref(entry->data.history_item.additional_elements);
xfree(entry->data.history_item.string);
break;
}
case kSDItemVariable: {
- list_unref(entry->data.global_var.additional_elements);
+ tv_list_unref(entry->data.global_var.additional_elements);
xfree(entry->data.global_var.name);
- clear_tv(&entry->data.global_var.value);
+ tv_clear(&entry->data.global_var.value);
break;
}
case kSDItemSubString: {
- list_unref(entry->data.sub_string.additional_elements);
+ tv_list_unref(entry->data.sub_string.additional_elements);
xfree(entry->data.sub_string.sub);
break;
}
case kSDItemBufferList: {
for (size_t i = 0; i < entry->data.buffer_list.size; i++) {
xfree(entry->data.buffer_list.buffers[i].fname);
- dict_unref(entry->data.buffer_list.buffers[i].additional_data);
+ tv_dict_unref(entry->data.buffer_list.buffers[i].additional_data);
}
xfree(entry->data.buffer_list.buffers);
break;
@@ -3277,29 +3448,6 @@ static ShaDaReadResult msgpack_read_uint64(ShaDaReadDef *const sd_reader,
return kSDReadStatusSuccess;
}
-/// Convert or copy and return a string
-///
-/// @param[in] sd_conv Conversion definition.
-/// @param[in] str String to convert.
-/// @param[in] len String length.
-///
-/// @return [allocated] converted string or copy of the original string.
-static inline char *get_converted_string(const vimconv_T *const sd_conv,
- const char *const str,
- const size_t len)
- FUNC_ATTR_NONNULL_ALL FUNC_ATTR_MALLOC FUNC_ATTR_WARN_UNUSED_RESULT
-{
- if (!has_non_ascii_len(str, len)) {
- return xmemdupz(str, len);
- }
- size_t new_len = len;
- char *const new_str = string_convert(sd_conv, str, &new_len);
- if (new_str == NULL) {
- return xmemdupz(str, len);
- }
- return new_str;
-}
-
#define READERR(entry_name, error_desc) \
RERR "Error while reading ShaDa file: " \
entry_name " entry at position %" PRIu64 " " \
@@ -3328,59 +3476,58 @@ static inline char *get_converted_string(const vimconv_T *const sd_conv,
} \
tgt = proc(obj.via.attr); \
} while (0)
-#define CHECK_KEY_IS_STR(entry_name) \
- if (unpacked.data.via.map.ptr[i].key.type != MSGPACK_OBJECT_STR) { \
+#define CHECK_KEY_IS_STR(un, entry_name) \
+ if (un.data.via.map.ptr[i].key.type != MSGPACK_OBJECT_STR) { \
emsgf(_(READERR(entry_name, "has key which is not a string")), \
initial_fpos); \
CLEAR_GA_AND_ERROR_OUT(ad_ga); \
- } else if (unpacked.data.via.map.ptr[i].key.via.str.size == 0) { \
+ } else if (un.data.via.map.ptr[i].key.via.str.size == 0) { \
emsgf(_(READERR(entry_name, "has empty key")), initial_fpos); \
CLEAR_GA_AND_ERROR_OUT(ad_ga); \
}
-#define CHECKED_KEY(entry_name, name, error_desc, tgt, condition, attr, proc) \
+#define CHECKED_KEY(un, entry_name, name, error_desc, tgt, condition, attr, \
+ proc) \
else if (CHECK_KEY( /* NOLINT(readability/braces) */ \
- unpacked.data.via.map.ptr[i].key, name)) { \
+ un.data.via.map.ptr[i].key, name)) { \
CHECKED_ENTRY( \
condition, "has " name " key value " error_desc, \
- entry_name, unpacked.data.via.map.ptr[i].val, \
+ entry_name, un.data.via.map.ptr[i].val, \
tgt, attr, proc); \
}
-#define TYPED_KEY(entry_name, name, type_name, tgt, objtype, attr, proc) \
+#define TYPED_KEY(un, entry_name, name, type_name, tgt, objtype, attr, proc) \
CHECKED_KEY( \
- entry_name, name, "which is not " type_name, tgt, \
- unpacked.data.via.map.ptr[i].val.type == MSGPACK_OBJECT_##objtype, \
+ un, entry_name, name, "which is not " type_name, tgt, \
+ un.data.via.map.ptr[i].val.type == MSGPACK_OBJECT_##objtype, \
attr, proc)
-#define BOOLEAN_KEY(entry_name, name, tgt) \
- TYPED_KEY(entry_name, name, "a boolean", tgt, BOOLEAN, boolean, ID)
-#define STRING_KEY(entry_name, name, tgt) \
- TYPED_KEY(entry_name, name, "a binary", tgt, BIN, bin, BINDUP)
-#define CONVERTED_STRING_KEY(entry_name, name, tgt) \
- TYPED_KEY(entry_name, name, "a binary", tgt, BIN, bin, BIN_CONVERTED)
-#define INT_KEY(entry_name, name, tgt, proc) \
+#define BOOLEAN_KEY(un, entry_name, name, tgt) \
+ TYPED_KEY(un, entry_name, name, "a boolean", tgt, BOOLEAN, boolean, ID)
+#define STRING_KEY(un, entry_name, name, tgt) \
+ TYPED_KEY(un, entry_name, name, "a binary", tgt, BIN, bin, BINDUP)
+#define CONVERTED_STRING_KEY(un, entry_name, name, tgt) \
+ TYPED_KEY(un, entry_name, name, "a binary", tgt, BIN, bin, \
+ BIN_CONVERTED)
+#define INT_KEY(un, entry_name, name, tgt, proc) \
CHECKED_KEY( \
- entry_name, name, "which is not an integer", tgt, \
- ((unpacked.data.via.map.ptr[i].val.type \
+ un, entry_name, name, "which is not an integer", tgt, \
+ ((un.data.via.map.ptr[i].val.type \
== MSGPACK_OBJECT_POSITIVE_INTEGER) \
- || (unpacked.data.via.map.ptr[i].val.type \
+ || (un.data.via.map.ptr[i].val.type \
== MSGPACK_OBJECT_NEGATIVE_INTEGER)), \
i64, proc)
-#define INTEGER_KEY(entry_name, name, tgt) \
- INT_KEY(entry_name, name, tgt, TOINT)
-#define LONG_KEY(entry_name, name, tgt) \
- INT_KEY(entry_name, name, tgt, TOLONG)
-#define ADDITIONAL_KEY \
+#define INTEGER_KEY(un, entry_name, name, tgt) \
+ INT_KEY(un, entry_name, name, tgt, TOINT)
+#define LONG_KEY(un, entry_name, name, tgt) \
+ INT_KEY(un, entry_name, name, tgt, TOLONG)
+#define ADDITIONAL_KEY(un) \
else { /* NOLINT(readability/braces) */ \
ga_grow(&ad_ga, 1); \
- memcpy(((char *)ad_ga.ga_data) + ((size_t) ad_ga.ga_len \
- * sizeof(*unpacked.data.via.map.ptr)), \
- unpacked.data.via.map.ptr + i, \
- sizeof(*unpacked.data.via.map.ptr)); \
+ memcpy(((char *)ad_ga.ga_data) + ((size_t)ad_ga.ga_len \
+ * sizeof(*un.data.via.map.ptr)), \
+ un.data.via.map.ptr + i, \
+ sizeof(*un.data.via.map.ptr)); \
ad_ga.ga_len++; \
}
-#define CONVERTED(str, len) ( \
- sd_reader->sd_conv.vc_type != CONV_NONE \
- ? get_converted_string(&sd_reader->sd_conv, (str), (len)) \
- : xmemdupz((str), (len)))
+#define CONVERTED(str, len) (xmemdupz((str), (len)))
#define BIN_CONVERTED(b) CONVERTED(b.ptr, b.size)
#define SET_ADDITIONAL_DATA(tgt, name) \
do { \
@@ -3401,7 +3548,7 @@ static inline char *get_converted_string(const vimconv_T *const sd_conv,
"cannot be converted to a VimL dictionary")), \
initial_fpos); \
ga_clear(&ad_ga); \
- clear_tv(&adtv); \
+ tv_clear(&adtv); \
goto shada_read_next_item_error; \
} \
tgt = adtv.vval.v_dict; \
@@ -3424,7 +3571,7 @@ static inline char *get_converted_string(const vimconv_T *const sd_conv,
if (msgpack_to_vim(obj, &aetv) == FAIL) { \
emsgf(_(READERR(name, "cannot be converted to a VimL list")), \
initial_fpos); \
- clear_tv(&aetv); \
+ tv_clear(&aetv); \
goto shada_read_next_item_error; \
} \
assert(aetv.v_type == VAR_LIST); \
@@ -3483,8 +3630,16 @@ shada_read_next_item_start:
return mru_ret;
}
- const size_t length = (size_t) length_u64;
- entry->timestamp = (Timestamp) timestamp_u64;
+ if (length_u64 > PTRDIFF_MAX) {
+ emsgf(_(RCERR "Error while reading ShaDa file: "
+ "there is an item at position %" PRIu64 " "
+ "that is stated to be too long"),
+ initial_fpos);
+ return kSDReadStatusNotShaDa;
+ }
+
+ const size_t length = (size_t)length_u64;
+ entry->timestamp = (Timestamp)timestamp_u64;
if (type_u64 == 0) {
// kSDItemUnknown cannot possibly pass that far because it is -1 and that
@@ -3574,28 +3729,29 @@ shada_read_next_item_start:
garray_T ad_ga;
ga_init(&ad_ga, sizeof(*(unpacked.data.via.map.ptr)), 1);
for (size_t i = 0; i < unpacked.data.via.map.size; i++) {
- CHECK_KEY_IS_STR("search pattern")
- BOOLEAN_KEY("search pattern", SEARCH_KEY_MAGIC,
+ CHECK_KEY_IS_STR(unpacked, "search pattern")
+ BOOLEAN_KEY(unpacked, "search pattern", SEARCH_KEY_MAGIC,
entry->data.search_pattern.magic)
- BOOLEAN_KEY("search pattern", SEARCH_KEY_SMARTCASE,
+ BOOLEAN_KEY(unpacked, "search pattern", SEARCH_KEY_SMARTCASE,
entry->data.search_pattern.smartcase)
- BOOLEAN_KEY("search pattern", SEARCH_KEY_HAS_LINE_OFFSET,
+ BOOLEAN_KEY(unpacked, "search pattern", SEARCH_KEY_HAS_LINE_OFFSET,
entry->data.search_pattern.has_line_offset)
- BOOLEAN_KEY("search pattern", SEARCH_KEY_PLACE_CURSOR_AT_END,
+ BOOLEAN_KEY(unpacked, "search pattern", SEARCH_KEY_PLACE_CURSOR_AT_END,
entry->data.search_pattern.place_cursor_at_end)
- BOOLEAN_KEY("search pattern", SEARCH_KEY_IS_LAST_USED,
+ BOOLEAN_KEY(unpacked, "search pattern", SEARCH_KEY_IS_LAST_USED,
entry->data.search_pattern.is_last_used)
- BOOLEAN_KEY("search pattern", SEARCH_KEY_IS_SUBSTITUTE_PATTERN,
+ BOOLEAN_KEY(unpacked, "search pattern",
+ SEARCH_KEY_IS_SUBSTITUTE_PATTERN,
entry->data.search_pattern.is_substitute_pattern)
- BOOLEAN_KEY("search pattern", SEARCH_KEY_HIGHLIGHTED,
+ BOOLEAN_KEY(unpacked, "search pattern", SEARCH_KEY_HIGHLIGHTED,
entry->data.search_pattern.highlighted)
- BOOLEAN_KEY("search pattern", SEARCH_KEY_BACKWARD,
+ BOOLEAN_KEY(unpacked, "search pattern", SEARCH_KEY_BACKWARD,
entry->data.search_pattern.search_backward)
- INTEGER_KEY("search pattern", SEARCH_KEY_OFFSET,
+ INTEGER_KEY(unpacked, "search pattern", SEARCH_KEY_OFFSET,
entry->data.search_pattern.offset)
- CONVERTED_STRING_KEY("search pattern", SEARCH_KEY_PAT,
+ CONVERTED_STRING_KEY(unpacked, "search pattern", SEARCH_KEY_PAT,
entry->data.search_pattern.pat)
- ADDITIONAL_KEY
+ ADDITIONAL_KEY(unpacked)
}
if (entry->data.search_pattern.pat == NULL) {
emsgf(_(READERR("search pattern", "has no pattern")), initial_fpos);
@@ -3616,7 +3772,7 @@ shada_read_next_item_start:
garray_T ad_ga;
ga_init(&ad_ga, sizeof(*(unpacked.data.via.map.ptr)), 1);
for (size_t i = 0; i < unpacked.data.via.map.size; i++) {
- CHECK_KEY_IS_STR("mark")
+ CHECK_KEY_IS_STR(unpacked, "mark")
if (CHECK_KEY(unpacked.data.via.map.ptr[i].key, KEY_NAME_CHAR)) {
if (type_u64 == kSDItemJump || type_u64 == kSDItemChange) {
emsgf(_(READERR("mark", "has n key which is only valid for "
@@ -3630,10 +3786,10 @@ shada_read_next_item_start:
"mark", unpacked.data.via.map.ptr[i].val,
entry->data.filemark.name, u64, TOCHAR);
}
- LONG_KEY("mark", KEY_LNUM, entry->data.filemark.mark.lnum)
- INTEGER_KEY("mark", KEY_COL, entry->data.filemark.mark.col)
- STRING_KEY("mark", KEY_FILE, entry->data.filemark.fname)
- ADDITIONAL_KEY
+ LONG_KEY(unpacked, "mark", KEY_LNUM, entry->data.filemark.mark.lnum)
+ INTEGER_KEY(unpacked, "mark", KEY_COL, entry->data.filemark.mark.col)
+ STRING_KEY(unpacked, "mark", KEY_FILE, entry->data.filemark.fname)
+ ADDITIONAL_KEY(unpacked)
}
if (entry->data.filemark.fname == NULL) {
emsgf(_(READERR("mark", "is missing file name")), initial_fpos);
@@ -3658,7 +3814,7 @@ shada_read_next_item_start:
garray_T ad_ga;
ga_init(&ad_ga, sizeof(*(unpacked.data.via.map.ptr)), 1);
for (size_t i = 0; i < unpacked.data.via.map.size; i++) {
- CHECK_KEY_IS_STR("register")
+ CHECK_KEY_IS_STR(unpacked, "register")
if (CHECK_KEY(unpacked.data.via.map.ptr[i].key,
REG_KEY_CONTENTS)) {
if (unpacked.data.via.map.ptr[i].val.type != MSGPACK_OBJECT_ARRAY) {
@@ -3676,8 +3832,8 @@ shada_read_next_item_start:
}
const msgpack_object_array arr =
unpacked.data.via.map.ptr[i].val.via.array;
- for (size_t i = 0; i < arr.size; i++) {
- if (arr.ptr[i].type != MSGPACK_OBJECT_BIN) {
+ for (size_t j = 0; j < arr.size; j++) {
+ if (arr.ptr[j].type != MSGPACK_OBJECT_BIN) {
emsgf(_(READERR("register", "has " REG_KEY_CONTENTS " array "
"with non-binary value")), initial_fpos);
CLEAR_GA_AND_ERROR_OUT(ad_ga);
@@ -3685,17 +3841,19 @@ shada_read_next_item_start:
}
entry->data.reg.contents_size = arr.size;
entry->data.reg.contents = xmalloc(arr.size * sizeof(char *));
- for (size_t i = 0; i < arr.size; i++) {
- entry->data.reg.contents[i] = BIN_CONVERTED(arr.ptr[i].via.bin);
+ for (size_t j = 0; j < arr.size; j++) {
+ entry->data.reg.contents[j] = BIN_CONVERTED(arr.ptr[j].via.bin);
}
}
- TYPED_KEY("register", REG_KEY_TYPE, "an unsigned integer",
+ BOOLEAN_KEY(unpacked, "register", REG_KEY_UNNAMED,
+ entry->data.reg.is_unnamed)
+ TYPED_KEY(unpacked, "register", REG_KEY_TYPE, "an unsigned integer",
entry->data.reg.type, POSITIVE_INTEGER, u64, TOU8)
- TYPED_KEY("register", KEY_NAME_CHAR, "an unsigned integer",
+ TYPED_KEY(unpacked, "register", KEY_NAME_CHAR, "an unsigned integer",
entry->data.reg.name, POSITIVE_INTEGER, u64, TOCHAR)
- TYPED_KEY("register", REG_KEY_WIDTH, "an unsigned integer",
+ TYPED_KEY(unpacked, "register", REG_KEY_WIDTH, "an unsigned integer",
entry->data.reg.width, POSITIVE_INTEGER, u64, TOSIZE)
- ADDITIONAL_KEY
+ ADDITIONAL_KEY(unpacked)
}
if (entry->data.reg.contents == NULL) {
emsgf(_(READERR("register", "has missing " REG_KEY_CONTENTS " array")),
@@ -3753,30 +3911,14 @@ shada_read_next_item_start:
(char) unpacked.data.via.array.ptr[2].via.u64;
}
size_t strsize;
- if (sd_reader->sd_conv.vc_type == CONV_NONE
- || !has_non_ascii_len(unpacked.data.via.array.ptr[1].via.bin.ptr,
- unpacked.data.via.array.ptr[1].via.bin.size)) {
-shada_read_next_item_hist_no_conv:
- strsize = (
- unpacked.data.via.array.ptr[1].via.bin.size
- + 1 // Zero byte
- + 1); // Separator character
- entry->data.history_item.string = xmalloc(strsize);
- memcpy(entry->data.history_item.string,
- unpacked.data.via.array.ptr[1].via.bin.ptr,
- unpacked.data.via.array.ptr[1].via.bin.size);
- } else {
- size_t len = unpacked.data.via.array.ptr[1].via.bin.size;
- char *const converted = string_convert(
- &sd_reader->sd_conv, unpacked.data.via.array.ptr[1].via.bin.ptr,
- &len);
- if (converted != NULL) {
- strsize = len + 2;
- entry->data.history_item.string = xrealloc(converted, strsize);
- } else {
- goto shada_read_next_item_hist_no_conv;
- }
- }
+ strsize = (
+ unpacked.data.via.array.ptr[1].via.bin.size
+ + 1 // Zero byte
+ + 1); // Separator character
+ entry->data.history_item.string = xmalloc(strsize);
+ memcpy(entry->data.history_item.string,
+ unpacked.data.via.array.ptr[1].via.bin.ptr,
+ unpacked.data.via.array.ptr[1].via.bin.size);
entry->data.history_item.string[strsize - 2] = 0;
entry->data.history_item.string[strsize - 1] =
entry->data.history_item.sep;
@@ -3809,16 +3951,6 @@ shada_read_next_item_hist_no_conv:
"be converted to the VimL value")), initial_fpos);
goto shada_read_next_item_error;
}
- if (sd_reader->sd_conv.vc_type != CONV_NONE) {
- typval_T tgttv;
- var_item_copy(&sd_reader->sd_conv,
- &entry->data.global_var.value,
- &tgttv,
- true,
- 0);
- clear_tv(&entry->data.global_var.value);
- entry->data.global_var.value = tgttv;
- }
SET_ADDITIONAL_ELEMENTS(unpacked.data.via.array, 2,
entry->data.global_var.additional_elements,
"variable");
@@ -3863,8 +3995,7 @@ shada_read_next_item_hist_no_conv:
.data = unpacked.data.via.array.ptr[i],
};
{
- msgpack_unpacked unpacked = unpacked_2;
- if (unpacked.data.type != MSGPACK_OBJECT_MAP) {
+ if (unpacked_2.data.type != MSGPACK_OBJECT_MAP) {
emsgf(_(RERR "Error while reading ShaDa file: "
"buffer list at position %" PRIu64 " "
"contains entry that is not a dictionary"),
@@ -3873,21 +4004,23 @@ shada_read_next_item_hist_no_conv:
}
entry->data.buffer_list.buffers[i].pos = default_pos;
garray_T ad_ga;
- ga_init(&ad_ga, sizeof(*(unpacked.data.via.map.ptr)), 1);
+ ga_init(&ad_ga, sizeof(*(unpacked_2.data.via.map.ptr)), 1);
{
+ // XXX: Temporarily reassign `i` because the macros depend on it.
const size_t j = i;
{
- for (size_t i = 0; i < unpacked.data.via.map.size; i++) {
- CHECK_KEY_IS_STR("buffer list entry")
- LONG_KEY("buffer list entry", KEY_LNUM,
+ for (i = 0; i < unpacked_2.data.via.map.size; i++) { // -V535
+ CHECK_KEY_IS_STR(unpacked_2, "buffer list entry")
+ LONG_KEY(unpacked_2, "buffer list entry", KEY_LNUM,
entry->data.buffer_list.buffers[j].pos.lnum)
- INTEGER_KEY("buffer list entry", KEY_COL,
+ INTEGER_KEY(unpacked_2, "buffer list entry", KEY_COL,
entry->data.buffer_list.buffers[j].pos.col)
- STRING_KEY("buffer list entry", KEY_FILE,
+ STRING_KEY(unpacked_2, "buffer list entry", KEY_FILE,
entry->data.buffer_list.buffers[j].fname)
- ADDITIONAL_KEY
+ ADDITIONAL_KEY(unpacked_2)
}
}
+ i = j; // XXX: Restore `i`.
}
if (entry->data.buffer_list.buffers[i].pos.lnum <= 0) {
emsgf(_(RERR "Error while reading ShaDa file: "
diff --git a/src/nvim/sign_defs.h b/src/nvim/sign_defs.h
index 7288a48e21..4443fd8a2e 100644
--- a/src/nvim/sign_defs.h
+++ b/src/nvim/sign_defs.h
@@ -1,23 +1,28 @@
#ifndef NVIM_SIGN_DEFS_H
#define NVIM_SIGN_DEFS_H
+#include "nvim/pos.h"
+
// signs: line annotations
typedef struct signlist signlist_T;
struct signlist
{
- int id; /* unique identifier for each placed sign */
- linenr_T lnum; /* line number which has this sign */
- int typenr; /* typenr of sign */
- signlist_T *next; /* next signlist entry */
+ int id; // unique identifier for each placed sign
+ linenr_T lnum; // line number which has this sign
+ int typenr; // typenr of sign
+ signlist_T *next; // next signlist entry
};
-/* type argument for buf_getsigntype() */
-#define SIGN_ANY 0
-#define SIGN_LINEHL 1
-#define SIGN_ICON 2
-#define SIGN_TEXT 3
+// type argument for buf_getsigntype() and sign_get_attr()
+typedef enum {
+ SIGN_ANY,
+ SIGN_LINEHL,
+ SIGN_ICON,
+ SIGN_TEXT,
+ SIGN_NUMHL,
+} SignType;
diff --git a/src/nvim/spell.c b/src/nvim/spell.c
index 610fb660e7..ff61c2e5de 100644
--- a/src/nvim/spell.c
+++ b/src/nvim/spell.c
@@ -1,5 +1,10 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
// spell.c: code for spell checking
//
+// See spellfile.c for the Vim spell file format.
+//
// The spell checking mechanism uses a tree (aka trie). Each node in the tree
// has a list of bytes that can appear (siblings). For each byte there is a
// pointer to the node with the byte that follows in the word (child).
@@ -63,226 +68,6 @@
// compute the maximum word score that can be used.
#define MAXSCORE(word_score, sound_score) ((4 * word_score - sound_score) / 3)
-// Vim spell file format: <HEADER>
-// <SECTIONS>
-// <LWORDTREE>
-// <KWORDTREE>
-// <PREFIXTREE>
-//
-// <HEADER>: <fileID> <versionnr>
-//
-// <fileID> 8 bytes "VIMspell"
-// <versionnr> 1 byte VIMSPELLVERSION
-//
-//
-// Sections make it possible to add information to the .spl file without
-// making it incompatible with previous versions. There are two kinds of
-// sections:
-// 1. Not essential for correct spell checking. E.g. for making suggestions.
-// These are skipped when not supported.
-// 2. Optional information, but essential for spell checking when present.
-// E.g. conditions for affixes. When this section is present but not
-// supported an error message is given.
-//
-// <SECTIONS>: <section> ... <sectionend>
-//
-// <section>: <sectionID> <sectionflags> <sectionlen> (section contents)
-//
-// <sectionID> 1 byte number from 0 to 254 identifying the section
-//
-// <sectionflags> 1 byte SNF_REQUIRED: this section is required for correct
-// spell checking
-//
-// <sectionlen> 4 bytes length of section contents, MSB first
-//
-// <sectionend> 1 byte SN_END
-//
-//
-// sectionID == SN_INFO: <infotext>
-// <infotext> N bytes free format text with spell file info (version,
-// website, etc)
-//
-// sectionID == SN_REGION: <regionname> ...
-// <regionname> 2 bytes Up to 8 region names: ca, au, etc. Lower case.
-// First <regionname> is region 1.
-//
-// sectionID == SN_CHARFLAGS: <charflagslen> <charflags>
-// <folcharslen> <folchars>
-// <charflagslen> 1 byte Number of bytes in <charflags> (should be 128).
-// <charflags> N bytes List of flags (first one is for character 128):
-// 0x01 word character CF_WORD
-// 0x02 upper-case character CF_UPPER
-// <folcharslen> 2 bytes Number of bytes in <folchars>.
-// <folchars> N bytes Folded characters, first one is for character 128.
-//
-// sectionID == SN_MIDWORD: <midword>
-// <midword> N bytes Characters that are word characters only when used
-// in the middle of a word.
-//
-// sectionID == SN_PREFCOND: <prefcondcnt> <prefcond> ...
-// <prefcondcnt> 2 bytes Number of <prefcond> items following.
-// <prefcond> : <condlen> <condstr>
-// <condlen> 1 byte Length of <condstr>.
-// <condstr> N bytes Condition for the prefix.
-//
-// sectionID == SN_REP: <repcount> <rep> ...
-// <repcount> 2 bytes number of <rep> items, MSB first.
-// <rep> : <repfromlen> <repfrom> <reptolen> <repto>
-// <repfromlen> 1 byte length of <repfrom>
-// <repfrom> N bytes "from" part of replacement
-// <reptolen> 1 byte length of <repto>
-// <repto> N bytes "to" part of replacement
-//
-// sectionID == SN_REPSAL: <repcount> <rep> ...
-// just like SN_REP but for soundfolded words
-//
-// sectionID == SN_SAL: <salflags> <salcount> <sal> ...
-// <salflags> 1 byte flags for soundsalike conversion:
-// SAL_F0LLOWUP
-// SAL_COLLAPSE
-// SAL_REM_ACCENTS
-// <salcount> 2 bytes number of <sal> items following
-// <sal> : <salfromlen> <salfrom> <saltolen> <salto>
-// <salfromlen> 1 byte length of <salfrom>
-// <salfrom> N bytes "from" part of soundsalike
-// <saltolen> 1 byte length of <salto>
-// <salto> N bytes "to" part of soundsalike
-//
-// sectionID == SN_SOFO: <sofofromlen> <sofofrom> <sofotolen> <sofoto>
-// <sofofromlen> 2 bytes length of <sofofrom>
-// <sofofrom> N bytes "from" part of soundfold
-// <sofotolen> 2 bytes length of <sofoto>
-// <sofoto> N bytes "to" part of soundfold
-//
-// sectionID == SN_SUGFILE: <timestamp>
-// <timestamp> 8 bytes time in seconds that must match with .sug file
-//
-// sectionID == SN_NOSPLITSUGS: nothing
-//
-// sectionID == SN_NOCOMPOUNDSUGS: nothing
-//
-// sectionID == SN_WORDS: <word> ...
-// <word> N bytes NUL terminated common word
-//
-// sectionID == SN_MAP: <mapstr>
-// <mapstr> N bytes String with sequences of similar characters,
-// separated by slashes.
-//
-// sectionID == SN_COMPOUND: <compmax> <compminlen> <compsylmax> <compoptions>
-// <comppatcount> <comppattern> ... <compflags>
-// <compmax> 1 byte Maximum nr of words in compound word.
-// <compminlen> 1 byte Minimal word length for compounding.
-// <compsylmax> 1 byte Maximum nr of syllables in compound word.
-// <compoptions> 2 bytes COMP_ flags.
-// <comppatcount> 2 bytes number of <comppattern> following
-// <compflags> N bytes Flags from COMPOUNDRULE items, separated by
-// slashes.
-//
-// <comppattern>: <comppatlen> <comppattext>
-// <comppatlen> 1 byte length of <comppattext>
-// <comppattext> N bytes end or begin chars from CHECKCOMPOUNDPATTERN
-//
-// sectionID == SN_NOBREAK: (empty, its presence is what matters)
-//
-// sectionID == SN_SYLLABLE: <syllable>
-// <syllable> N bytes String from SYLLABLE item.
-//
-// <LWORDTREE>: <wordtree>
-//
-// <KWORDTREE>: <wordtree>
-//
-// <PREFIXTREE>: <wordtree>
-//
-//
-// <wordtree>: <nodecount> <nodedata> ...
-//
-// <nodecount> 4 bytes Number of nodes following. MSB first.
-//
-// <nodedata>: <siblingcount> <sibling> ...
-//
-// <siblingcount> 1 byte Number of siblings in this node. The siblings
-// follow in sorted order.
-//
-// <sibling>: <byte> [ <nodeidx> <xbyte>
-// | <flags> [<flags2>] [<region>] [<affixID>]
-// | [<pflags>] <affixID> <prefcondnr> ]
-//
-// <byte> 1 byte Byte value of the sibling. Special cases:
-// BY_NOFLAGS: End of word without flags and for all
-// regions.
-// For PREFIXTREE <affixID> and
-// <prefcondnr> follow.
-// BY_FLAGS: End of word, <flags> follow.
-// For PREFIXTREE <pflags>, <affixID>
-// and <prefcondnr> follow.
-// BY_FLAGS2: End of word, <flags> and <flags2>
-// follow. Not used in PREFIXTREE.
-// BY_INDEX: Child of sibling is shared, <nodeidx>
-// and <xbyte> follow.
-//
-// <nodeidx> 3 bytes Index of child for this sibling, MSB first.
-//
-// <xbyte> 1 byte Byte value of the sibling.
-//
-// <flags> 1 byte Bitmask of:
-// WF_ALLCAP word must have only capitals
-// WF_ONECAP first char of word must be capital
-// WF_KEEPCAP keep-case word
-// WF_FIXCAP keep-case word, all caps not allowed
-// WF_RARE rare word
-// WF_BANNED bad word
-// WF_REGION <region> follows
-// WF_AFX <affixID> follows
-//
-// <flags2> 1 byte Bitmask of:
-// WF_HAS_AFF >> 8 word includes affix
-// WF_NEEDCOMP >> 8 word only valid in compound
-// WF_NOSUGGEST >> 8 word not used for suggestions
-// WF_COMPROOT >> 8 word already a compound
-// WF_NOCOMPBEF >> 8 no compounding before this word
-// WF_NOCOMPAFT >> 8 no compounding after this word
-//
-// <pflags> 1 byte Bitmask of:
-// WFP_RARE rare prefix
-// WFP_NC non-combining prefix
-// WFP_UP letter after prefix made upper case
-//
-// <region> 1 byte Bitmask for regions in which word is valid. When
-// omitted it's valid in all regions.
-// Lowest bit is for region 1.
-//
-// <affixID> 1 byte ID of affix that can be used with this word. In
-// PREFIXTREE used for the required prefix ID.
-//
-// <prefcondnr> 2 bytes Prefix condition number, index in <prefcond> list
-// from HEADER.
-//
-// All text characters are in 'encoding', but stored as single bytes.
-
-// Vim .sug file format: <SUGHEADER>
-// <SUGWORDTREE>
-// <SUGTABLE>
-//
-// <SUGHEADER>: <fileID> <versionnr> <timestamp>
-//
-// <fileID> 6 bytes "VIMsug"
-// <versionnr> 1 byte VIMSUGVERSION
-// <timestamp> 8 bytes timestamp that must match with .spl file
-//
-//
-// <SUGWORDTREE>: <wordtree> (see above, no flags or region used)
-//
-//
-// <SUGTABLE>: <sugwcount> <sugline> ...
-//
-// <sugwcount> 4 bytes number of <sugline> following
-//
-// <sugline>: <sugnr> ... NUL
-//
-// <sugnr>: X bytes word number that results in this soundfolded word,
-// stored as an offset to the previous number in as
-// few bytes as possible, see offset2bytes())
-
#include <assert.h>
#include <inttypes.h>
#include <limits.h>
@@ -292,6 +77,9 @@
#include <stdlib.h>
#include <wctype.h>
+/* for offsetof() */
+#include <stddef.h>
+
#include "nvim/vim.h"
#include "nvim/ascii.h"
#include "nvim/spell.h"
@@ -307,12 +95,12 @@
#include "nvim/func_attr.h"
#include "nvim/getchar.h"
#include "nvim/hashtab.h"
+#include "nvim/mark.h"
#include "nvim/mbyte.h"
#include "nvim/memline.h"
#include "nvim/memory.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/garray.h"
#include "nvim/normal.h"
#include "nvim/option.h"
@@ -321,254 +109,18 @@
#include "nvim/regexp.h"
#include "nvim/screen.h"
#include "nvim/search.h"
+#include "nvim/spellfile.h"
#include "nvim/strings.h"
#include "nvim/syntax.h"
-#include "nvim/ui.h"
#include "nvim/undo.h"
#include "nvim/os/os.h"
#include "nvim/os/input.h"
-#ifndef UNIX // it's in os/unix_defs.h for Unix
-# include <time.h> // for time_t
-#endif
-
-#define MAXWLEN 254 // Assume max. word len is this many bytes.
- // Some places assume a word length fits in a
- // byte, thus it can't be above 255.
-
-// Type used for indexes in the word tree need to be at least 4 bytes. If int
-// is 8 bytes we could use something smaller, but what?
-typedef int idx_T;
-
-# define SPL_FNAME_TMPL "%s.%s.spl"
-# define SPL_FNAME_ADD ".add."
-# define SPL_FNAME_ASCII ".ascii."
-
-// Flags used for a word. Only the lowest byte can be used, the region byte
-// comes above it.
-#define WF_REGION 0x01 // region byte follows
-#define WF_ONECAP 0x02 // word with one capital (or all capitals)
-#define WF_ALLCAP 0x04 // word must be all capitals
-#define WF_RARE 0x08 // rare word
-#define WF_BANNED 0x10 // bad word
-#define WF_AFX 0x20 // affix ID follows
-#define WF_FIXCAP 0x40 // keep-case word, allcap not allowed
-#define WF_KEEPCAP 0x80 // keep-case word
-
-// for <flags2>, shifted up one byte to be used in wn_flags
-#define WF_HAS_AFF 0x0100 // word includes affix
-#define WF_NEEDCOMP 0x0200 // word only valid in compound
-#define WF_NOSUGGEST 0x0400 // word not to be suggested
-#define WF_COMPROOT 0x0800 // already compounded word, COMPOUNDROOT
-#define WF_NOCOMPBEF 0x1000 // no compounding before this word
-#define WF_NOCOMPAFT 0x2000 // no compounding after this word
-
// only used for su_badflags
#define WF_MIXCAP 0x20 // mix of upper and lower case: macaRONI
#define WF_CAPMASK (WF_ONECAP | WF_ALLCAP | WF_KEEPCAP | WF_FIXCAP)
-// flags for <pflags>
-#define WFP_RARE 0x01 // rare prefix
-#define WFP_NC 0x02 // prefix is not combining
-#define WFP_UP 0x04 // to-upper prefix
-#define WFP_COMPPERMIT 0x08 // prefix with COMPOUNDPERMITFLAG
-#define WFP_COMPFORBID 0x10 // prefix with COMPOUNDFORBIDFLAG
-
-// Flags for postponed prefixes in "sl_pidxs". Must be above affixID (one
-// byte) and prefcondnr (two bytes).
-#define WF_RAREPFX (WFP_RARE << 24) // rare postponed prefix
-#define WF_PFX_NC (WFP_NC << 24) // non-combining postponed prefix
-#define WF_PFX_UP (WFP_UP << 24) // to-upper postponed prefix
-#define WF_PFX_COMPPERMIT (WFP_COMPPERMIT << 24) // postponed prefix with
- // COMPOUNDPERMITFLAG
-#define WF_PFX_COMPFORBID (WFP_COMPFORBID << 24) // postponed prefix with
- // COMPOUNDFORBIDFLAG
-
-
-// flags for <compoptions>
-#define COMP_CHECKDUP 1 // CHECKCOMPOUNDDUP
-#define COMP_CHECKREP 2 // CHECKCOMPOUNDREP
-#define COMP_CHECKCASE 4 // CHECKCOMPOUNDCASE
-#define COMP_CHECKTRIPLE 8 // CHECKCOMPOUNDTRIPLE
-
-// Special byte values for <byte>. Some are only used in the tree for
-// postponed prefixes, some only in the other trees. This is a bit messy...
-#define BY_NOFLAGS 0 // end of word without flags or region; for
- // postponed prefix: no <pflags>
-#define BY_INDEX 1 // child is shared, index follows
-#define BY_FLAGS 2 // end of word, <flags> byte follows; for
- // postponed prefix: <pflags> follows
-#define BY_FLAGS2 3 // end of word, <flags> and <flags2> bytes
- // follow; never used in prefix tree
-#define BY_SPECIAL BY_FLAGS2 // highest special byte value
-
-// Info from "REP", "REPSAL" and "SAL" entries in ".aff" file used in si_rep,
-// si_repsal, sl_rep, and si_sal. Not for sl_sal!
-// One replacement: from "ft_from" to "ft_to".
-typedef struct fromto_S {
- char_u *ft_from;
- char_u *ft_to;
-} fromto_T;
-
-// Info from "SAL" entries in ".aff" file used in sl_sal.
-// The info is split for quick processing by spell_soundfold().
-// Note that "sm_oneof" and "sm_rules" point into sm_lead.
-typedef struct salitem_S {
- char_u *sm_lead; // leading letters
- int sm_leadlen; // length of "sm_lead"
- char_u *sm_oneof; // letters from () or NULL
- char_u *sm_rules; // rules like ^, $, priority
- char_u *sm_to; // replacement.
- int *sm_lead_w; // wide character copy of "sm_lead"
- int *sm_oneof_w; // wide character copy of "sm_oneof"
- int *sm_to_w; // wide character copy of "sm_to"
-} salitem_T;
-
-typedef int salfirst_T;
-
-// Values for SP_*ERROR are negative, positive values are used by
-// read_cnt_string().
-#define SP_TRUNCERROR -1 // spell file truncated error
-#define SP_FORMERROR -2 // format error in spell file
-#define SP_OTHERERROR -3 // other error while reading spell file
-
-// Structure used to store words and other info for one language, loaded from
-// a .spl file.
-// The main access is through the tree in "sl_fbyts/sl_fidxs", storing the
-// case-folded words. "sl_kbyts/sl_kidxs" is for keep-case words.
-//
-// The "byts" array stores the possible bytes in each tree node, preceded by
-// the number of possible bytes, sorted on byte value:
-// <len> <byte1> <byte2> ...
-// The "idxs" array stores the index of the child node corresponding to the
-// byte in "byts".
-// Exception: when the byte is zero, the word may end here and "idxs" holds
-// the flags, region mask and affixID for the word. There may be several
-// zeros in sequence for alternative flag/region/affixID combinations.
-typedef struct slang_S slang_T;
-
-struct slang_S {
- slang_T *sl_next; // next language
- char_u *sl_name; // language name "en", "en.rare", "nl", etc.
- char_u *sl_fname; // name of .spl file
- bool sl_add; // true if it's a .add file.
-
- char_u *sl_fbyts; // case-folded word bytes
- idx_T *sl_fidxs; // case-folded word indexes
- char_u *sl_kbyts; // keep-case word bytes
- idx_T *sl_kidxs; // keep-case word indexes
- char_u *sl_pbyts; // prefix tree word bytes
- idx_T *sl_pidxs; // prefix tree word indexes
-
- char_u *sl_info; // infotext string or NULL
-
- char_u sl_regions[17]; // table with up to 8 region names plus NUL
-
- char_u *sl_midword; // MIDWORD string or NULL
-
- hashtab_T sl_wordcount; // hashtable with word count, wordcount_T
-
- int sl_compmax; // COMPOUNDWORDMAX (default: MAXWLEN)
- int sl_compminlen; // COMPOUNDMIN (default: 0)
- int sl_compsylmax; // COMPOUNDSYLMAX (default: MAXWLEN)
- int sl_compoptions; // COMP_* flags
- garray_T sl_comppat; // CHECKCOMPOUNDPATTERN items
- regprog_T *sl_compprog; // COMPOUNDRULE turned into a regexp progrm
- // (NULL when no compounding)
- char_u *sl_comprules; // all COMPOUNDRULE concatenated (or NULL)
- char_u *sl_compstartflags; // flags for first compound word
- char_u *sl_compallflags; // all flags for compound words
- bool sl_nobreak; // When true: no spaces between words
- char_u *sl_syllable; // SYLLABLE repeatable chars or NULL
- garray_T sl_syl_items; // syllable items
-
- int sl_prefixcnt; // number of items in "sl_prefprog"
- regprog_T **sl_prefprog; // table with regprogs for prefixes
-
- garray_T sl_rep; // list of fromto_T entries from REP lines
- int16_t sl_rep_first[256]; // indexes where byte first appears, -1 if
- // there is none
- garray_T sl_sal; // list of salitem_T entries from SAL lines
- salfirst_T sl_sal_first[256]; // indexes where byte first appears, -1 if
- // there is none
- bool sl_followup; // SAL followup
- bool sl_collapse; // SAL collapse_result
- bool sl_rem_accents; // SAL remove_accents
- bool sl_sofo; // SOFOFROM and SOFOTO instead of SAL items:
- // "sl_sal_first" maps chars, when has_mbyte
- // "sl_sal" is a list of wide char lists.
- garray_T sl_repsal; // list of fromto_T entries from REPSAL lines
- int16_t sl_repsal_first[256]; // sl_rep_first for REPSAL lines
- bool sl_nosplitsugs; // don't suggest splitting a word
- bool sl_nocompoundsugs; // don't suggest compounding
-
- // Info from the .sug file. Loaded on demand.
- time_t sl_sugtime; // timestamp for .sug file
- char_u *sl_sbyts; // soundfolded word bytes
- idx_T *sl_sidxs; // soundfolded word indexes
- buf_T *sl_sugbuf; // buffer with word number table
- bool sl_sugloaded; // true when .sug file was loaded or failed to
- // load
-
- bool sl_has_map; // true, if there is a MAP line
- hashtab_T sl_map_hash; // MAP for multi-byte chars
- int sl_map_array[256]; // MAP for first 256 chars
- hashtab_T sl_sounddone; // table with soundfolded words that have
- // handled, see add_sound_suggest()
-};
-
-// First language that is loaded, start of the linked list of loaded
-// languages.
-static slang_T *first_lang = NULL;
-
-// Flags used in .spl file for soundsalike flags.
-#define SAL_F0LLOWUP 1
-#define SAL_COLLAPSE 2
-#define SAL_REM_ACCENTS 4
-
-// Structure used in "b_langp", filled from 'spelllang'.
-typedef struct langp_S {
- slang_T *lp_slang; // info for this language
- slang_T *lp_sallang; // language used for sound folding or NULL
- slang_T *lp_replang; // language used for REP items or NULL
- int lp_region; // bitmask for region or REGION_ALL
-} langp_T;
-
-#define LANGP_ENTRY(ga, i) (((langp_T *)(ga).ga_data) + (i))
-
-#define REGION_ALL 0xff // word valid in all regions
-
-#define VIMSPELLMAGIC "VIMspell" // string at start of Vim spell file
-#define VIMSPELLMAGICL 8
-#define VIMSPELLVERSION 50
-
-#define VIMSUGMAGIC "VIMsug" // string at start of Vim .sug file
-#define VIMSUGMAGICL 6
-#define VIMSUGVERSION 1
-
-// Section IDs. Only renumber them when VIMSPELLVERSION changes!
-#define SN_REGION 0 // <regionname> section
-#define SN_CHARFLAGS 1 // charflags section
-#define SN_MIDWORD 2 // <midword> section
-#define SN_PREFCOND 3 // <prefcond> section
-#define SN_REP 4 // REP items section
-#define SN_SAL 5 // SAL items section
-#define SN_SOFO 6 // soundfolding section
-#define SN_MAP 7 // MAP items section
-#define SN_COMPOUND 8 // compound words section
-#define SN_SYLLABLE 9 // syllable section
-#define SN_NOBREAK 10 // NOBREAK section
-#define SN_SUGFILE 11 // timestamp for .sug file
-#define SN_REPSAL 12 // REPSAL items section
-#define SN_WORDS 13 // common words
-#define SN_NOSPLITSUGS 14 // don't split word for suggestions
-#define SN_INFO 15 // info section
-#define SN_NOCOMPOUNDSUGS 16 // don't compound for suggestions
-#define SN_END 255 // end of sections
-
-#define SNF_REQUIRED 1 // <sectionflags>: required section
-
// Result values. Lower number is accepted over higher one.
#define SP_BANNED -1
#define SP_RARE 0
@@ -576,17 +128,20 @@ typedef struct langp_S {
#define SP_LOCAL 2
#define SP_BAD 3
+// First language that is loaded, start of the linked list of loaded
+// languages.
+slang_T *first_lang = NULL;
+
// file used for "zG" and "zW"
-static char_u *int_wordlist = NULL;
+char_u *int_wordlist = NULL;
typedef struct wordcount_S {
uint16_t wc_count; // nr of times word was seen
char_u wc_word[1]; // word, actually longer
} wordcount_T;
-static wordcount_T dumwc;
-#define WC_KEY_OFF (unsigned)(dumwc.wc_word - (char_u *)&dumwc)
-#define HI2WC(hi) ((wordcount_T *)((hi)->hi_key - WC_KEY_OFF))
+#define WC_KEY_OFF offsetof(wordcount_T, wc_word)
+#define HI2WC(hi) ((wordcount_T *)((hi)->hi_key - WC_KEY_OFF))
#define MAXWORDCOUNT 0xffff
// Information used when looking for suggestions.
@@ -717,65 +272,6 @@ typedef struct matchinf_S {
char_u *mi_end2; // "mi_end" without following word
} matchinf_T;
-// The tables used for recognizing word characters according to spelling.
-// These are only used for the first 256 characters of 'encoding'.
-typedef struct {
- bool st_isw[256]; // flags: is word char
- bool st_isu[256]; // flags: is uppercase char
- char_u st_fold[256]; // chars: folded case
- char_u st_upper[256]; // chars: upper case
-} spelltab_T;
-
-// For finding suggestions: At each node in the tree these states are tried:
-typedef enum {
- STATE_START = 0, // At start of node check for NUL bytes (goodword
- // ends); if badword ends there is a match, otherwise
- // try splitting word.
- STATE_NOPREFIX, // try without prefix
- STATE_SPLITUNDO, // Undo splitting.
- STATE_ENDNUL, // Past NUL bytes at start of the node.
- STATE_PLAIN, // Use each byte of the node.
- STATE_DEL, // Delete a byte from the bad word.
- STATE_INS_PREP, // Prepare for inserting bytes.
- STATE_INS, // Insert a byte in the bad word.
- STATE_SWAP, // Swap two bytes.
- STATE_UNSWAP, // Undo swap two characters.
- STATE_SWAP3, // Swap two characters over three.
- STATE_UNSWAP3, // Undo Swap two characters over three.
- STATE_UNROT3L, // Undo rotate three characters left
- STATE_UNROT3R, // Undo rotate three characters right
- STATE_REP_INI, // Prepare for using REP items.
- STATE_REP, // Use matching REP items from the .aff file.
- STATE_REP_UNDO, // Undo a REP item replacement.
- STATE_FINAL // End of this node.
-} state_T;
-
-// Struct to keep the state at each level in suggest_try_change().
-typedef struct trystate_S {
- state_T ts_state; // state at this level, STATE_
- int ts_score; // score
- idx_T ts_arridx; // index in tree array, start of node
- short ts_curi; // index in list of child nodes
- char_u ts_fidx; // index in fword[], case-folded bad word
- char_u ts_fidxtry; // ts_fidx at which bytes may be changed
- char_u ts_twordlen; // valid length of tword[]
- char_u ts_prefixdepth; // stack depth for end of prefix or
- // PFD_PREFIXTREE or PFD_NOPREFIX
- char_u ts_flags; // TSF_ flags
- char_u ts_tcharlen; // number of bytes in tword character
- char_u ts_tcharidx; // current byte index in tword character
- char_u ts_isdiff; // DIFF_ values
- char_u ts_fcharstart; // index in fword where badword char started
- char_u ts_prewordlen; // length of word in "preword[]"
- char_u ts_splitoff; // index in "tword" after last split
- char_u ts_splitfidx; // "ts_fidx" at word split
- char_u ts_complen; // nr of compound words used
- char_u ts_compsplit; // index for "compflags" where word was spit
- char_u ts_save_badflags; // su_badflags saved here
- char_u ts_delidx; // index in fword for char that was deleted,
- // valid when "ts_flags" has TSF_DIDDEL
-} trystate_T;
-
// Structure used for the cookie argument of do_in_runtimepath().
typedef struct spelload_S {
char_u sl_lang[MAXWLEN + 1]; // language name
@@ -789,200 +285,8 @@ typedef struct syl_item_S {
int sy_len;
} syl_item_T;
-#define MAXLINELEN 500 // Maximum length in bytes of a line in a .aff
- // and .dic file.
-// Main structure to store the contents of a ".aff" file.
-typedef struct afffile_S {
- char_u *af_enc; // "SET", normalized, alloc'ed string or NULL
- int af_flagtype; // AFT_CHAR, AFT_LONG, AFT_NUM or AFT_CAPLONG
- unsigned af_rare; // RARE ID for rare word
- unsigned af_keepcase; // KEEPCASE ID for keep-case word
- unsigned af_bad; // BAD ID for banned word
- unsigned af_needaffix; // NEEDAFFIX ID
- unsigned af_circumfix; // CIRCUMFIX ID
- unsigned af_needcomp; // NEEDCOMPOUND ID
- unsigned af_comproot; // COMPOUNDROOT ID
- unsigned af_compforbid; // COMPOUNDFORBIDFLAG ID
- unsigned af_comppermit; // COMPOUNDPERMITFLAG ID
- unsigned af_nosuggest; // NOSUGGEST ID
- int af_pfxpostpone; // postpone prefixes without chop string and
- // without flags
- bool af_ignoreextra; // IGNOREEXTRA present
- hashtab_T af_pref; // hashtable for prefixes, affheader_T
- hashtab_T af_suff; // hashtable for suffixes, affheader_T
- hashtab_T af_comp; // hashtable for compound flags, compitem_T
-} afffile_T;
-
-#define AFT_CHAR 0 // flags are one character
-#define AFT_LONG 1 // flags are two characters
-#define AFT_CAPLONG 2 // flags are one or two characters
-#define AFT_NUM 3 // flags are numbers, comma separated
-
-typedef struct affentry_S affentry_T;
-// Affix entry from ".aff" file. Used for prefixes and suffixes.
-struct affentry_S {
- affentry_T *ae_next; // next affix with same name/number
- char_u *ae_chop; // text to chop off basic word (can be NULL)
- char_u *ae_add; // text to add to basic word (can be NULL)
- char_u *ae_flags; // flags on the affix (can be NULL)
- char_u *ae_cond; // condition (NULL for ".")
- regprog_T *ae_prog; // regexp program for ae_cond or NULL
- char ae_compforbid; // COMPOUNDFORBIDFLAG found
- char ae_comppermit; // COMPOUNDPERMITFLAG found
-};
-
-# define AH_KEY_LEN 17 // 2 x 8 bytes + NUL
-
-// Affix header from ".aff" file. Used for af_pref and af_suff.
-typedef struct affheader_S {
- char_u ah_key[AH_KEY_LEN]; // key for hashtab == name of affix
- unsigned ah_flag; // affix name as number, uses "af_flagtype"
- int ah_newID; // prefix ID after renumbering; 0 if not used
- int ah_combine; // suffix may combine with prefix
- int ah_follows; // another affix block should be following
- affentry_T *ah_first; // first affix entry
-} affheader_T;
-
-#define HI2AH(hi) ((affheader_T *)(hi)->hi_key)
-
-// Flag used in compound items.
-typedef struct compitem_S {
- char_u ci_key[AH_KEY_LEN]; // key for hashtab == name of compound
- unsigned ci_flag; // affix name as number, uses "af_flagtype"
- int ci_newID; // affix ID after renumbering.
-} compitem_T;
-
-#define HI2CI(hi) ((compitem_T *)(hi)->hi_key)
-
-// Structure that is used to store the items in the word tree. This avoids
-// the need to keep track of each allocated thing, everything is freed all at
-// once after ":mkspell" is done.
-// Note: "sb_next" must be just before "sb_data" to make sure the alignment of
-// "sb_data" is correct for systems where pointers must be aligned on
-// pointer-size boundaries and sizeof(pointer) > sizeof(int) (e.g., Sparc).
-#define SBLOCKSIZE 16000 // size of sb_data
-typedef struct sblock_S sblock_T;
-struct sblock_S {
- int sb_used; // nr of bytes already in use
- sblock_T *sb_next; // next block in list
- char_u sb_data[1]; // data, actually longer
-};
-
-// A node in the tree.
-typedef struct wordnode_S wordnode_T;
-struct wordnode_S {
- union // shared to save space
- {
- char_u hashkey[6]; // the hash key, only used while compressing
- int index; // index in written nodes (valid after first
- // round)
- } wn_u1;
- union // shared to save space
- {
- wordnode_T *next; // next node with same hash key
- wordnode_T *wnode; // parent node that will write this node
- } wn_u2;
- wordnode_T *wn_child; // child (next byte in word)
- wordnode_T *wn_sibling; // next sibling (alternate byte in word,
- // always sorted)
- int wn_refs; // Nr. of references to this node. Only
- // relevant for first node in a list of
- // siblings, in following siblings it is
- // always one.
- char_u wn_byte; // Byte for this node. NUL for word end
-
- // Info for when "wn_byte" is NUL.
- // In PREFIXTREE "wn_region" is used for the prefcondnr.
- // In the soundfolded word tree "wn_flags" has the MSW of the wordnr and
- // "wn_region" the LSW of the wordnr.
- char_u wn_affixID; // supported/required prefix ID or 0
- uint16_t wn_flags; // WF_ flags
- short wn_region; // region mask
-
-#ifdef SPELL_PRINTTREE
- int wn_nr; // sequence nr for printing
-#endif
-};
-
-#define WN_MASK 0xffff // mask relevant bits of "wn_flags"
-
-#define HI2WN(hi) (wordnode_T *)((hi)->hi_key)
-
-// Info used while reading the spell files.
-typedef struct spellinfo_S {
- wordnode_T *si_foldroot; // tree with case-folded words
- long si_foldwcount; // nr of words in si_foldroot
-
- wordnode_T *si_keeproot; // tree with keep-case words
- long si_keepwcount; // nr of words in si_keeproot
-
- wordnode_T *si_prefroot; // tree with postponed prefixes
-
- long si_sugtree; // creating the soundfolding trie
-
- sblock_T *si_blocks; // memory blocks used
- long si_blocks_cnt; // memory blocks allocated
- int si_did_emsg; // TRUE when ran out of memory
-
- long si_compress_cnt; // words to add before lowering
- // compression limit
- wordnode_T *si_first_free; // List of nodes that have been freed during
- // compression, linked by "wn_child" field.
- long si_free_count; // number of nodes in si_first_free
-#ifdef SPELL_PRINTTREE
- int si_wordnode_nr; // sequence nr for nodes
-#endif
- buf_T *si_spellbuf; // buffer used to store soundfold word table
-
- int si_ascii; // handling only ASCII words
- int si_add; // addition file
- int si_clear_chartab; // when TRUE clear char tables
- int si_region; // region mask
- vimconv_T si_conv; // for conversion to 'encoding'
- int si_memtot; // runtime memory used
- int si_verbose; // verbose messages
- int si_msg_count; // number of words added since last message
- char_u *si_info; // info text chars or NULL
- int si_region_count; // number of regions supported (1 when there
- // are no regions)
- char_u si_region_name[17]; // region names; used only if
- // si_region_count > 1)
-
- garray_T si_rep; // list of fromto_T entries from REP lines
- garray_T si_repsal; // list of fromto_T entries from REPSAL lines
- garray_T si_sal; // list of fromto_T entries from SAL lines
- char_u *si_sofofr; // SOFOFROM text
- char_u *si_sofoto; // SOFOTO text
- int si_nosugfile; // NOSUGFILE item found
- int si_nosplitsugs; // NOSPLITSUGS item found
- int si_nocompoundsugs; // NOCOMPOUNDSUGS item found
- int si_followup; // soundsalike: ?
- int si_collapse; // soundsalike: ?
- hashtab_T si_commonwords; // hashtable for common words
- time_t si_sugtime; // timestamp for .sug file
- int si_rem_accents; // soundsalike: remove accents
- garray_T si_map; // MAP info concatenated
- char_u *si_midword; // MIDWORD chars or NULL
- int si_compmax; // max nr of words for compounding
- int si_compminlen; // minimal length for compounding
- int si_compsylmax; // max nr of syllables for compounding
- int si_compoptions; // COMP_ flags
- garray_T si_comppat; // CHECKCOMPOUNDPATTERN items, each stored as
- // a string
- char_u *si_compflags; // flags used for compounding
- char_u si_nobreak; // NOBREAK
- char_u *si_syllable; // syllable string
- garray_T si_prefcond; // table with conditions for postponed
- // prefixes, each stored as a string
- int si_newprefID; // current value for ah_newID
- int si_newcompID; // current value for compound ID
-} spellinfo_T;
-
-static spelltab_T spelltab;
-static int did_set_spelltab;
-
-#define CF_WORD 0x01
-#define CF_UPPER 0x02
+spelltab_T spelltab;
+int did_set_spelltab;
// structure used to store soundfolded words that add_sound_suggest() has
// handled already.
@@ -1024,34 +328,7 @@ typedef struct {
#define FIND_COMPOUND 3 // find case-folded compound word
#define FIND_KEEPCOMPOUND 4 // find keep-case compound word
-
-// Use our own character-case definitions, because the current locale may
-// differ from what the .spl file uses.
-// These must not be called with negative number!
-#include <wchar.h> // for towupper() and towlower()
-// Multi-byte implementation. For Unicode we can call utf_*(), but don't do
-// that for ASCII, because we don't want to use 'casemap' here. Otherwise use
-// the "w" library function for characters above 255.
-#define SPELL_TOFOLD(c) (enc_utf8 && (c) >= 128 ? utf_fold(c) \
- : (c) < \
- 256 ? (int)spelltab.st_fold[c] : (int)towlower(c))
-
-#define SPELL_TOUPPER(c) (enc_utf8 && (c) >= 128 ? utf_toupper(c) \
- : (c) < \
- 256 ? (int)spelltab.st_upper[c] : (int)towupper(c))
-
-#define SPELL_ISUPPER(c) (enc_utf8 && (c) >= 128 ? utf_isupper(c) \
- : (c) < 256 ? spelltab.st_isu[c] : iswupper(c))
-
-
-static char *e_format = N_("E759: Format error in spell file");
-static char *e_spell_trunc = N_("E758: Truncated spell file");
-static char *e_afftrailing = N_("Trailing text in %s line %d: %s");
-static char *e_affname = N_("Affix name too long in %s line %d: %s");
-static char *e_affform = N_("E761: Format error in affix file FOL, LOW or UPP");
-static char *e_affrange = N_(
- "E762: Character in FOL, LOW or UPP is out of range");
-static char *msg_compressing = N_("Compressing word tree...");
+char *e_format = N_("E759: Format error in spell file");
// Remember what "z?" replaced.
static char_u *repl_from = NULL;
@@ -1118,7 +395,7 @@ size_t spell_check(
mi.mi_fend = ptr;
if (spell_iswordp(mi.mi_fend, wp)) {
do {
- mb_ptr_adv(mi.mi_fend);
+ MB_PTR_ADV(mi.mi_fend);
} while (*mi.mi_fend != NUL && spell_iswordp(mi.mi_fend, wp));
if (capcol != NULL && *capcol == 0 && wp->w_s->b_cap_prog != NULL) {
@@ -1145,7 +422,7 @@ size_t spell_check(
// case-fold the word with one non-word character, so that we can check
// for the word end.
if (*mi.mi_fend != NUL) {
- mb_ptr_adv(mi.mi_fend);
+ MB_PTR_ADV(mi.mi_fend);
}
(void)spell_casefold(ptr, (int)(mi.mi_fend - ptr), mi.mi_fword, MAXWLEN + 1);
@@ -1222,7 +499,7 @@ size_t spell_check(
} else if (mi.mi_end == ptr) {
// Always include at least one character. Required for when there
// is a mixup in "midword".
- mb_ptr_adv(mi.mi_end);
+ MB_PTR_ADV(mi.mi_end);
} else if (mi.mi_result == SP_BAD
&& LANGP_ENTRY(wp->w_s->b_langp, 0)->lp_slang->sl_nobreak) {
char_u *p, *fp;
@@ -1235,8 +512,8 @@ size_t spell_check(
p = mi.mi_word;
fp = mi.mi_fword;
for (;;) {
- mb_ptr_adv(p);
- mb_ptr_adv(fp);
+ MB_PTR_ADV(p);
+ MB_PTR_ADV(fp);
if (p >= mi.mi_end) {
break;
}
@@ -1411,8 +688,9 @@ static void find_word(matchinf_T *mip, int mode)
arridx = endidx[endidxcnt];
wlen = endlen[endidxcnt];
- if ((*mb_head_off)(ptr, ptr + wlen) > 0)
+ if (utf_head_off(ptr, ptr + wlen) > 0) {
continue; // not at first byte of character
+ }
if (spell_iswordp(ptr + wlen, mip->mi_win)) {
if (slang->sl_compprog == NULL && !slang->sl_nobreak)
continue; // next char is a word character
@@ -1429,8 +707,9 @@ static void find_word(matchinf_T *mip, int mode)
// case-folded word is equal to the keep-case word.
p = mip->mi_word;
if (STRNCMP(ptr, p, wlen) != 0) {
- for (char_u *s = ptr; s < ptr + wlen; mb_ptr_adv(s))
- mb_ptr_adv(p);
+ for (char_u *s = ptr; s < ptr + wlen; MB_PTR_ADV(s)) {
+ MB_PTR_ADV(p);
+ }
wlen = (int)(p - mip->mi_word);
}
}
@@ -1537,10 +816,12 @@ static void find_word(matchinf_T *mip, int mode)
mip->mi_compoff) != 0) {
// case folding may have changed the length
p = mip->mi_word;
- for (char_u *s = ptr; s < ptr + mip->mi_compoff; mb_ptr_adv(s))
- mb_ptr_adv(p);
- } else
+ for (char_u *s = ptr; s < ptr + mip->mi_compoff; MB_PTR_ADV(s)) {
+ MB_PTR_ADV(p);
+ }
+ } else {
p = mip->mi_word + mip->mi_compoff;
+ }
capflags = captype(p, mip->mi_word + wlen);
if (capflags == WF_KEEPCAP || (capflags == WF_ALLCAP
&& (flags & WF_FIXCAP) != 0))
@@ -1551,12 +832,13 @@ static void find_word(matchinf_T *mip, int mode)
// character we do not accept a Onecap word. We do
// accept a no-caps word, even when the dictionary
// word specifies ONECAP.
- mb_ptr_back(mip->mi_word, p);
+ MB_PTR_BACK(mip->mi_word, p);
if (spell_iswordp_nmw(p, mip->mi_win)
? capflags == WF_ONECAP
: (flags & WF_ONECAP) != 0
- && capflags != WF_ONECAP)
+ && capflags != WF_ONECAP) {
continue;
+ }
}
}
@@ -1611,8 +893,9 @@ static void find_word(matchinf_T *mip, int mode)
// the case-folded word is equal to the keep-case word.
p = mip->mi_fword;
if (STRNCMP(ptr, p, wlen) != 0) {
- for (char_u *s = ptr; s < ptr + wlen; mb_ptr_adv(s))
- mb_ptr_adv(p);
+ for (char_u *s = ptr; s < ptr + wlen; MB_PTR_ADV(s)) {
+ MB_PTR_ADV(p);
+ }
mip->mi_compoff = (int)(p - mip->mi_fword);
}
}
@@ -1754,8 +1037,9 @@ static bool can_compound(slang_T *slang, char_u *word, char_u *flags)
if (enc_utf8) {
// Need to convert the single byte flags to utf8 characters.
p = uflags;
- for (i = 0; flags[i] != NUL; ++i)
- p += mb_char2bytes(flags[i], p);
+ for (i = 0; flags[i] != NUL; i++) {
+ p += utf_char2bytes(flags[i], p);
+ }
*p = NUL;
p = uflags;
} else
@@ -2010,12 +1294,13 @@ static int fold_more(matchinf_T *mip)
p = mip->mi_fend;
do {
- mb_ptr_adv(mip->mi_fend);
+ MB_PTR_ADV(mip->mi_fend);
} while (*mip->mi_fend != NUL && spell_iswordp(mip->mi_fend, mip->mi_win));
// Include the non-word character so that we can check for the word end.
- if (*mip->mi_fend != NUL)
- mb_ptr_adv(mip->mi_fend);
+ if (*mip->mi_fend != NUL) {
+ MB_PTR_ADV(mip->mi_fend);
+ }
(void)spell_casefold(p, (int)(mip->mi_fend - p),
mip->mi_fword + mip->mi_fwordlen,
@@ -2114,13 +1399,14 @@ spell_move_to (
capcol = 0;
// For checking first word with a capital skip white space.
- if (capcol == 0)
- capcol = (int)(skipwhite(line) - line);
- else if (curline && wp == curwin) {
+ if (capcol == 0) {
+ capcol = (int)getwhitecols(line);
+ } else if (curline && wp == curwin) {
// For spellbadword(): check if first word needs a capital.
- col = (int)(skipwhite(line) - line);
- if (check_need_cap(lnum, col))
+ col = (int)getwhitecols(line);
+ if (check_need_cap(lnum, col)) {
capcol = col;
+ }
// Need to get the line again, may have looked at the previous
// one.
@@ -2156,12 +1442,10 @@ spell_move_to (
// the cursor.
if (dir == BACKWARD
|| lnum != wp->w_cursor.lnum
- || (lnum == wp->w_cursor.lnum
- && (wrapped
- || ((colnr_T)(curline
- ? p - buf + (ptrdiff_t)len
- : p - buf)
- > wp->w_cursor.col)))) {
+ || wrapped
+ || ((colnr_T)(curline
+ ? p - buf + (ptrdiff_t)len
+ : p - buf) > wp->w_cursor.col)) {
if (has_syntax) {
col = (int)(p - buf);
(void)syn_get_id(wp, lnum, (colnr_T)col,
@@ -2209,21 +1493,23 @@ spell_move_to (
return found_len;
}
- if (curline)
+ if (curline) {
break; // only check cursor line
+ }
+
+ // If we are back at the starting line and searched it again there
+ // is no match, give up.
+ if (lnum == wp->w_cursor.lnum && wrapped) {
+ break;
+ }
// Advance to next line.
if (dir == BACKWARD) {
- // If we are back at the starting line and searched it again there
- // is no match, give up.
- if (lnum == wp->w_cursor.lnum && wrapped)
- break;
-
- if (lnum > 1)
- --lnum;
- else if (!p_ws)
+ if (lnum > 1) {
+ lnum--;
+ } else if (!p_ws) {
break; // at first line and 'nowrapscan'
- else {
+ } else {
// Wrap around to the end of the buffer. May search the
// starting line again and accept the last match.
lnum = wp->w_buffer->b_ml.ml_line_count;
@@ -2248,8 +1534,9 @@ spell_move_to (
// If we are back at the starting line and there is no match then
// give up.
- if (lnum == wp->w_cursor.lnum && (!found_one || wrapped))
+ if (lnum == wp->w_cursor.lnum && !found_one) {
break;
+ }
// Skip the characters at the start of the next line that were
// included in a match crossing line boundaries.
@@ -2358,7 +1645,7 @@ static void spell_load_lang(char_u *lang)
// Return the encoding used for spell checking: Use 'encoding', except that we
// use "latin1" for "latin9". And limit to 60 characters (just in case).
-static char_u *spell_enc(void)
+char_u *spell_enc(void)
{
if (STRLEN(p_enc) < 60 && STRCMP(p_enc, "iso-8859-15") != 0)
@@ -2376,7 +1663,7 @@ static void int_wordlist_spl(char_u *fname)
// Allocate a new slang_T for language "lang". "lang" can be NULL.
// Caller must fill "sl_next".
-static slang_T *slang_alloc(char_u *lang)
+slang_T *slang_alloc(char_u *lang)
{
slang_T *lp = xcalloc(1, sizeof(slang_T));
@@ -2392,7 +1679,7 @@ static slang_T *slang_alloc(char_u *lang)
}
// Free the contents of an slang_T and the structure itself.
-static void slang_free(slang_T *lp)
+void slang_free(slang_T *lp)
{
xfree(lp->sl_name);
xfree(lp->sl_fname);
@@ -2417,7 +1704,7 @@ static void free_fromto(fromto_T *ftp) {
}
// Clear an slang_T so that the file can be reloaded.
-static void slang_clear(slang_T *lp)
+void slang_clear(slang_T *lp)
{
garray_T *gap;
@@ -2490,7 +1777,7 @@ static void slang_clear(slang_T *lp)
}
// Clear the info from the .sug file in "lp".
-static void slang_clear_sug(slang_T *lp)
+void slang_clear_sug(slang_T *lp)
{
xfree(lp->sl_sbyts);
lp->sl_sbyts = NULL;
@@ -2522,562 +1809,14 @@ static void spell_load_cb(char_u *fname, void *cookie)
}
}
-// Load one spell file and store the info into a slang_T.
-//
-// This is invoked in three ways:
-// - From spell_load_cb() to load a spell file for the first time. "lang" is
-// the language name, "old_lp" is NULL. Will allocate an slang_T.
-// - To reload a spell file that was changed. "lang" is NULL and "old_lp"
-// points to the existing slang_T.
-// - Just after writing a .spl file; it's read back to produce the .sug file.
-// "old_lp" is NULL and "lang" is NULL. Will allocate an slang_T.
-//
-// Returns the slang_T the spell file was loaded into. NULL for error.
-static slang_T *
-spell_load_file (
- char_u *fname,
- char_u *lang,
- slang_T *old_lp,
- bool silent // no error if file doesn't exist
-)
-{
- FILE *fd;
- char_u buf[VIMSPELLMAGICL];
- char_u *p;
- int i;
- int n;
- int len;
- char_u *save_sourcing_name = sourcing_name;
- linenr_T save_sourcing_lnum = sourcing_lnum;
- slang_T *lp = NULL;
- int c = 0;
- int res;
-
- fd = mch_fopen((char *)fname, "r");
- if (fd == NULL) {
- if (!silent)
- EMSG2(_(e_notopen), fname);
- else if (p_verbose > 2) {
- verbose_enter();
- smsg((char *)e_notopen, fname);
- verbose_leave();
- }
- goto endFAIL;
- }
- if (p_verbose > 2) {
- verbose_enter();
- smsg(_("Reading spell file \"%s\""), fname);
- verbose_leave();
- }
-
- if (old_lp == NULL) {
- lp = slang_alloc(lang);
-
- // Remember the file name, used to reload the file when it's updated.
- lp->sl_fname = vim_strsave(fname);
-
- // Check for .add.spl.
- lp->sl_add = strstr((char *)path_tail(fname), SPL_FNAME_ADD) != NULL;
- } else
- lp = old_lp;
-
- // Set sourcing_name, so that error messages mention the file name.
- sourcing_name = fname;
- sourcing_lnum = 0;
-
- // <HEADER>: <fileID>
- for (i = 0; i < VIMSPELLMAGICL; ++i)
- buf[i] = getc(fd); // <fileID>
- if (STRNCMP(buf, VIMSPELLMAGIC, VIMSPELLMAGICL) != 0) {
- EMSG(_("E757: This does not look like a spell file"));
- goto endFAIL;
- }
- c = getc(fd); // <versionnr>
- if (c < VIMSPELLVERSION) {
- EMSG(_("E771: Old spell file, needs to be updated"));
- goto endFAIL;
- } else if (c > VIMSPELLVERSION) {
- EMSG(_("E772: Spell file is for newer version of Vim"));
- goto endFAIL;
- }
-
-
- // <SECTIONS>: <section> ... <sectionend>
- // <section>: <sectionID> <sectionflags> <sectionlen> (section contents)
- for (;; ) {
- n = getc(fd); // <sectionID> or <sectionend>
- if (n == SN_END)
- break;
- c = getc(fd); // <sectionflags>
- len = get4c(fd); // <sectionlen>
- if (len < 0)
- goto truncerr;
-
- res = 0;
- switch (n) {
- case SN_INFO:
- lp->sl_info = READ_STRING(fd, len); // <infotext>
- if (lp->sl_info == NULL)
- goto endFAIL;
- break;
-
- case SN_REGION:
- res = read_region_section(fd, lp, len);
- break;
-
- case SN_CHARFLAGS:
- res = read_charflags_section(fd);
- break;
-
- case SN_MIDWORD:
- lp->sl_midword = READ_STRING(fd, len); // <midword>
- if (lp->sl_midword == NULL)
- goto endFAIL;
- break;
-
- case SN_PREFCOND:
- res = read_prefcond_section(fd, lp);
- break;
-
- case SN_REP:
- res = read_rep_section(fd, &lp->sl_rep, lp->sl_rep_first);
- break;
-
- case SN_REPSAL:
- res = read_rep_section(fd, &lp->sl_repsal, lp->sl_repsal_first);
- break;
-
- case SN_SAL:
- res = read_sal_section(fd, lp);
- break;
-
- case SN_SOFO:
- res = read_sofo_section(fd, lp);
- break;
-
- case SN_MAP:
- p = READ_STRING(fd, len); // <mapstr>
- if (p == NULL)
- goto endFAIL;
- set_map_str(lp, p);
- xfree(p);
- break;
-
- case SN_WORDS:
- res = read_words_section(fd, lp, len);
- break;
-
- case SN_SUGFILE:
- lp->sl_sugtime = get8ctime(fd); // <timestamp>
- break;
-
- case SN_NOSPLITSUGS:
- lp->sl_nosplitsugs = true;
- break;
-
- case SN_NOCOMPOUNDSUGS:
- lp->sl_nocompoundsugs = true;
- break;
-
- case SN_COMPOUND:
- res = read_compound(fd, lp, len);
- break;
-
- case SN_NOBREAK:
- lp->sl_nobreak = true;
- break;
-
- case SN_SYLLABLE:
- lp->sl_syllable = READ_STRING(fd, len); // <syllable>
- if (lp->sl_syllable == NULL)
- goto endFAIL;
- if (init_syl_tab(lp) == FAIL)
- goto endFAIL;
- break;
-
- default:
- // Unsupported section. When it's required give an error
- // message. When it's not required skip the contents.
- if (c & SNF_REQUIRED) {
- EMSG(_("E770: Unsupported section in spell file"));
- goto endFAIL;
- }
- while (--len >= 0)
- if (getc(fd) < 0)
- goto truncerr;
- break;
- }
-someerror:
- if (res == SP_FORMERROR) {
- EMSG(_(e_format));
- goto endFAIL;
- }
- if (res == SP_TRUNCERROR) {
-truncerr:
- EMSG(_(e_spell_trunc));
- goto endFAIL;
- }
- if (res == SP_OTHERERROR)
- goto endFAIL;
- }
-
- // <LWORDTREE>
- res = spell_read_tree(fd, &lp->sl_fbyts, &lp->sl_fidxs, false, 0);
- if (res != 0)
- goto someerror;
-
- // <KWORDTREE>
- res = spell_read_tree(fd, &lp->sl_kbyts, &lp->sl_kidxs, false, 0);
- if (res != 0)
- goto someerror;
-
- // <PREFIXTREE>
- res = spell_read_tree(fd, &lp->sl_pbyts, &lp->sl_pidxs, true,
- lp->sl_prefixcnt);
- if (res != 0)
- goto someerror;
-
- // For a new file link it in the list of spell files.
- if (old_lp == NULL && lang != NULL) {
- lp->sl_next = first_lang;
- first_lang = lp;
- }
-
- goto endOK;
-
-endFAIL:
- if (lang != NULL)
- // truncating the name signals the error to spell_load_lang()
- *lang = NUL;
- if (lp != NULL && old_lp == NULL)
- slang_free(lp);
- lp = NULL;
-
-endOK:
- if (fd != NULL)
- fclose(fd);
- sourcing_name = save_sourcing_name;
- sourcing_lnum = save_sourcing_lnum;
-
- return lp;
-}
-
-// Read a length field from "fd" in "cnt_bytes" bytes.
-// Allocate memory, read the string into it and add a NUL at the end.
-// Returns NULL when the count is zero.
-// Sets "*cntp" to SP_*ERROR when there is an error, length of the result
-// otherwise.
-static char_u *read_cnt_string(FILE *fd, int cnt_bytes, int *cntp)
-{
- int cnt = 0;
- int i;
- char_u *str;
-
- // read the length bytes, MSB first
- for (i = 0; i < cnt_bytes; ++i)
- cnt = (cnt << 8) + getc(fd);
- if (cnt < 0) {
- *cntp = SP_TRUNCERROR;
- return NULL;
- }
- *cntp = cnt;
- if (cnt == 0)
- return NULL; // nothing to read, return NULL
-
- str = READ_STRING(fd, cnt);
- if (str == NULL)
- *cntp = SP_OTHERERROR;
- return str;
-}
-
-// Read SN_REGION: <regionname> ...
-// Return SP_*ERROR flags.
-static int read_region_section(FILE *fd, slang_T *lp, int len)
-{
- int i;
-
- if (len > 16)
- return SP_FORMERROR;
- for (i = 0; i < len; ++i)
- lp->sl_regions[i] = getc(fd); // <regionname>
- lp->sl_regions[len] = NUL;
- return 0;
-}
-
-// Read SN_CHARFLAGS section: <charflagslen> <charflags>
-// <folcharslen> <folchars>
-// Return SP_*ERROR flags.
-static int read_charflags_section(FILE *fd)
-{
- char_u *flags;
- char_u *fol;
- int flagslen, follen;
-
- // <charflagslen> <charflags>
- flags = read_cnt_string(fd, 1, &flagslen);
- if (flagslen < 0)
- return flagslen;
-
- // <folcharslen> <folchars>
- fol = read_cnt_string(fd, 2, &follen);
- if (follen < 0) {
- xfree(flags);
- return follen;
- }
-
- // Set the word-char flags and fill SPELL_ISUPPER() table.
- if (flags != NULL && fol != NULL)
- set_spell_charflags(flags, flagslen, fol);
-
- xfree(flags);
- xfree(fol);
-
- // When <charflagslen> is zero then <fcharlen> must also be zero.
- if ((flags == NULL) != (fol == NULL))
- return SP_FORMERROR;
- return 0;
-}
-
-// Read SN_PREFCOND section.
-// Return SP_*ERROR flags.
-static int read_prefcond_section(FILE *fd, slang_T *lp)
-{
- int cnt;
- int i;
- int n;
- char_u *p;
- char_u buf[MAXWLEN + 1];
-
- // <prefcondcnt> <prefcond> ...
- cnt = get2c(fd); // <prefcondcnt>
- if (cnt <= 0)
- return SP_FORMERROR;
-
- lp->sl_prefprog = xcalloc(cnt, sizeof(regprog_T *));
- lp->sl_prefixcnt = cnt;
-
- for (i = 0; i < cnt; ++i) {
- // <prefcond> : <condlen> <condstr>
- n = getc(fd); // <condlen>
- if (n < 0 || n >= MAXWLEN)
- return SP_FORMERROR;
-
- // When <condlen> is zero we have an empty condition. Otherwise
- // compile the regexp program used to check for the condition.
- if (n > 0) {
- buf[0] = '^'; // always match at one position only
- p = buf + 1;
- while (n-- > 0)
- *p++ = getc(fd); // <condstr>
- *p = NUL;
- lp->sl_prefprog[i] = vim_regcomp(buf, RE_MAGIC + RE_STRING);
- }
- }
- return 0;
-}
-
-// Read REP or REPSAL items section from "fd": <repcount> <rep> ...
-// Return SP_*ERROR flags.
-static int read_rep_section(FILE *fd, garray_T *gap, int16_t *first)
-{
- int cnt;
- fromto_T *ftp;
-
- cnt = get2c(fd); // <repcount>
- if (cnt < 0)
- return SP_TRUNCERROR;
-
- ga_grow(gap, cnt);
-
- // <rep> : <repfromlen> <repfrom> <reptolen> <repto>
- for (; gap->ga_len < cnt; ++gap->ga_len) {
- int c;
- ftp = &((fromto_T *)gap->ga_data)[gap->ga_len];
- ftp->ft_from = read_cnt_string(fd, 1, &c);
- if (c < 0)
- return c;
- if (c == 0)
- return SP_FORMERROR;
- ftp->ft_to = read_cnt_string(fd, 1, &c);
- if (c <= 0) {
- xfree(ftp->ft_from);
- if (c < 0)
- return c;
- return SP_FORMERROR;
- }
- }
-
- // Fill the first-index table.
- for (int i = 0; i < 256; ++i) {
- first[i] = -1;
- }
- for (int i = 0; i < gap->ga_len; ++i) {
- ftp = &((fromto_T *)gap->ga_data)[i];
- if (first[*ftp->ft_from] == -1)
- first[*ftp->ft_from] = i;
- }
- return 0;
-}
-
-// Read SN_SAL section: <salflags> <salcount> <sal> ...
-// Return SP_*ERROR flags.
-static int read_sal_section(FILE *fd, slang_T *slang)
-{
- int i;
- int cnt;
- garray_T *gap;
- salitem_T *smp;
- int ccnt;
- char_u *p;
- int c = NUL;
-
- slang->sl_sofo = false;
-
- i = getc(fd); // <salflags>
- if (i & SAL_F0LLOWUP)
- slang->sl_followup = true;
- if (i & SAL_COLLAPSE)
- slang->sl_collapse = true;
- if (i & SAL_REM_ACCENTS)
- slang->sl_rem_accents = true;
-
- cnt = get2c(fd); // <salcount>
- if (cnt < 0)
- return SP_TRUNCERROR;
-
- gap = &slang->sl_sal;
- ga_init(gap, sizeof(salitem_T), 10);
- ga_grow(gap, cnt + 1);
-
- // <sal> : <salfromlen> <salfrom> <saltolen> <salto>
- for (; gap->ga_len < cnt; ++gap->ga_len) {
- smp = &((salitem_T *)gap->ga_data)[gap->ga_len];
- ccnt = getc(fd); // <salfromlen>
- if (ccnt < 0)
- return SP_TRUNCERROR;
- p = xmalloc(ccnt + 2);
- smp->sm_lead = p;
-
- // Read up to the first special char into sm_lead.
- for (i = 0; i < ccnt; ++i) {
- c = getc(fd); // <salfrom>
- if (vim_strchr((char_u *)"0123456789(-<^$", c) != NULL)
- break;
- *p++ = c;
- }
- smp->sm_leadlen = (int)(p - smp->sm_lead);
- *p++ = NUL;
-
- // Put (abc) chars in sm_oneof, if any.
- if (c == '(') {
- smp->sm_oneof = p;
- for (++i; i < ccnt; ++i) {
- c = getc(fd); // <salfrom>
- if (c == ')')
- break;
- *p++ = c;
- }
- *p++ = NUL;
- if (++i < ccnt)
- c = getc(fd);
- } else
- smp->sm_oneof = NULL;
-
- // Any following chars go in sm_rules.
- smp->sm_rules = p;
- if (i < ccnt)
- // store the char we got while checking for end of sm_lead
- *p++ = c;
- for (++i; i < ccnt; ++i)
- *p++ = getc(fd); // <salfrom>
- *p++ = NUL;
-
- // <saltolen> <salto>
- smp->sm_to = read_cnt_string(fd, 1, &ccnt);
- if (ccnt < 0) {
- xfree(smp->sm_lead);
- return ccnt;
- }
-
- if (has_mbyte) {
- // convert the multi-byte strings to wide char strings
- smp->sm_lead_w = mb_str2wide(smp->sm_lead);
- smp->sm_leadlen = mb_charlen(smp->sm_lead);
- if (smp->sm_oneof == NULL)
- smp->sm_oneof_w = NULL;
- else
- smp->sm_oneof_w = mb_str2wide(smp->sm_oneof);
- if (smp->sm_to == NULL)
- smp->sm_to_w = NULL;
- else
- smp->sm_to_w = mb_str2wide(smp->sm_to);
- }
- }
-
- if (!GA_EMPTY(gap)) {
- // Add one extra entry to mark the end with an empty sm_lead. Avoids
- // that we need to check the index every time.
- smp = &((salitem_T *)gap->ga_data)[gap->ga_len];
- p = xmalloc(1);
- p[0] = NUL;
- smp->sm_lead = p;
- smp->sm_leadlen = 0;
- smp->sm_oneof = NULL;
- smp->sm_rules = p;
- smp->sm_to = NULL;
- if (has_mbyte) {
- smp->sm_lead_w = mb_str2wide(smp->sm_lead);
- smp->sm_leadlen = 0;
- smp->sm_oneof_w = NULL;
- smp->sm_to_w = NULL;
- }
- ++gap->ga_len;
- }
-
- // Fill the first-index table.
- set_sal_first(slang);
-
- return 0;
-}
-
-// Read SN_WORDS: <word> ...
-// Return SP_*ERROR flags.
-static int read_words_section(FILE *fd, slang_T *lp, int len)
-{
- int done = 0;
- int i;
- int c;
- char_u word[MAXWLEN];
-
- while (done < len) {
- // Read one word at a time.
- for (i = 0;; ++i) {
- c = getc(fd);
- if (c == EOF)
- return SP_TRUNCERROR;
- word[i] = c;
- if (word[i] == NUL)
- break;
- if (i == MAXWLEN - 1)
- return SP_FORMERROR;
- }
-
- // Init the count to 10.
- count_common_word(lp, word, -1, 10);
- done += i + 1;
- }
- return 0;
-}
-
-// Add a word to the hashtable of common words.
-// If it's already there then the counter is increased.
-static void
-count_common_word (
- slang_T *lp,
- char_u *word,
- int len, // word length, -1 for upto NUL
- int count // 1 to count once, 10 to init
-)
+/// Add a word to the hashtable of common words.
+/// If it's already there then the counter is increased.
+///
+/// @param[in] lp
+/// @param[in] word added to common words hashtable
+/// @param[in] len length of word or -1 for NUL terminated
+/// @param[in] count 1 to count once, 10 to init
+void count_common_word(slang_T *lp, char_u *word, int len, int count)
{
hash_T hash;
hashitem_T *hi;
@@ -3093,10 +1832,11 @@ count_common_word (
}
hash = hash_hash(p);
- hi = hash_lookup(&lp->sl_wordcount, p, hash);
+ const size_t p_len = STRLEN(p);
+ hi = hash_lookup(&lp->sl_wordcount, (const char *)p, p_len, hash);
if (HASHITEM_EMPTY(hi)) {
- wc = xmalloc(sizeof(wordcount_T) + STRLEN(p));
- STRCPY(wc->wc_word, p);
+ wc = xmalloc(sizeof(wordcount_T) + p_len);
+ memcpy(wc->wc_word, p, p_len + 1);
wc->wc_count = count;
hash_add_item(&lp->sl_wordcount, hi, wc->wc_word, hash);
} else {
@@ -3140,209 +1880,9 @@ score_wordcount_adj (
return score;
}
-// SN_SOFO: <sofofromlen> <sofofrom> <sofotolen> <sofoto>
-// Return SP_*ERROR flags.
-static int read_sofo_section(FILE *fd, slang_T *slang)
-{
- int cnt;
- char_u *from, *to;
- int res;
-
- slang->sl_sofo = true;
-
- // <sofofromlen> <sofofrom>
- from = read_cnt_string(fd, 2, &cnt);
- if (cnt < 0)
- return cnt;
-
- // <sofotolen> <sofoto>
- to = read_cnt_string(fd, 2, &cnt);
- if (cnt < 0) {
- xfree(from);
- return cnt;
- }
-
- // Store the info in slang->sl_sal and/or slang->sl_sal_first.
- if (from != NULL && to != NULL)
- res = set_sofo(slang, from, to);
- else if (from != NULL || to != NULL)
- res = SP_FORMERROR; // only one of two strings is an error
- else
- res = 0;
-
- xfree(from);
- xfree(to);
- return res;
-}
-
-// Read the compound section from the .spl file:
-// <compmax> <compminlen> <compsylmax> <compoptions> <compflags>
-// Returns SP_*ERROR flags.
-static int read_compound(FILE *fd, slang_T *slang, int len)
-{
- int todo = len;
- int c;
- int atstart;
- char_u *pat;
- char_u *pp;
- char_u *cp;
- char_u *ap;
- char_u *crp;
- int cnt;
- garray_T *gap;
-
- if (todo < 2)
- return SP_FORMERROR; // need at least two bytes
-
- --todo;
- c = getc(fd); // <compmax>
- if (c < 2)
- c = MAXWLEN;
- slang->sl_compmax = c;
-
- --todo;
- c = getc(fd); // <compminlen>
- if (c < 1)
- c = 0;
- slang->sl_compminlen = c;
-
- --todo;
- c = getc(fd); // <compsylmax>
- if (c < 1)
- c = MAXWLEN;
- slang->sl_compsylmax = c;
-
- c = getc(fd); // <compoptions>
- if (c != 0)
- ungetc(c, fd); // be backwards compatible with Vim 7.0b
- else {
- --todo;
- c = getc(fd); // only use the lower byte for now
- --todo;
- slang->sl_compoptions = c;
-
- gap = &slang->sl_comppat;
- c = get2c(fd); // <comppatcount>
- todo -= 2;
- ga_init(gap, sizeof(char_u *), c);
- ga_grow(gap, c);
- while (--c >= 0) {
- ((char_u **)(gap->ga_data))[gap->ga_len++] =
- read_cnt_string(fd, 1, &cnt);
- // <comppatlen> <comppattext>
- if (cnt < 0)
- return cnt;
- todo -= cnt + 1;
- }
- }
- if (todo < 0)
- return SP_FORMERROR;
-
- // Turn the COMPOUNDRULE items into a regexp pattern:
- // "a[bc]/a*b+" -> "^\(a[bc]\|a*b\+\)$".
- // Inserting backslashes may double the length, "^\(\)$<Nul>" is 7 bytes.
- // Conversion to utf-8 may double the size.
- c = todo * 2 + 7;
- if (enc_utf8)
- c += todo * 2;
- pat = xmalloc(c);
-
- // We also need a list of all flags that can appear at the start and one
- // for all flags.
- cp = xmalloc(todo + 1);
- slang->sl_compstartflags = cp;
- *cp = NUL;
-
- ap = xmalloc(todo + 1);
- slang->sl_compallflags = ap;
- *ap = NUL;
-
- // And a list of all patterns in their original form, for checking whether
- // compounding may work in match_compoundrule(). This is freed when we
- // encounter a wildcard, the check doesn't work then.
- crp = xmalloc(todo + 1);
- slang->sl_comprules = crp;
-
- pp = pat;
- *pp++ = '^';
- *pp++ = '\\';
- *pp++ = '(';
-
- atstart = 1;
- while (todo-- > 0) {
- c = getc(fd); // <compflags>
- if (c == EOF) {
- xfree(pat);
- return SP_TRUNCERROR;
- }
-
- // Add all flags to "sl_compallflags".
- if (vim_strchr((char_u *)"?*+[]/", c) == NULL
- && !byte_in_str(slang->sl_compallflags, c)) {
- *ap++ = c;
- *ap = NUL;
- }
-
- if (atstart != 0) {
- // At start of item: copy flags to "sl_compstartflags". For a
- // [abc] item set "atstart" to 2 and copy up to the ']'.
- if (c == '[')
- atstart = 2;
- else if (c == ']')
- atstart = 0;
- else {
- if (!byte_in_str(slang->sl_compstartflags, c)) {
- *cp++ = c;
- *cp = NUL;
- }
- if (atstart == 1)
- atstart = 0;
- }
- }
-
- // Copy flag to "sl_comprules", unless we run into a wildcard.
- if (crp != NULL) {
- if (c == '?' || c == '+' || c == '*') {
- xfree(slang->sl_comprules);
- slang->sl_comprules = NULL;
- crp = NULL;
- } else
- *crp++ = c;
- }
-
- if (c == '/') { // slash separates two items
- *pp++ = '\\';
- *pp++ = '|';
- atstart = 1;
- } else { // normal char, "[abc]" and '*' are copied as-is
- if (c == '?' || c == '+' || c == '~')
- *pp++ = '\\'; // "a?" becomes "a\?", "a+" becomes "a\+"
- if (enc_utf8)
- pp += mb_char2bytes(c, pp);
- else
- *pp++ = c;
- }
- }
-
- *pp++ = '\\';
- *pp++ = ')';
- *pp++ = '$';
- *pp = NUL;
-
- if (crp != NULL)
- *crp = NUL;
-
- slang->sl_compprog = vim_regcomp(pat, RE_MAGIC + RE_STRING + RE_STRICT);
- xfree(pat);
- if (slang->sl_compprog == NULL)
- return SP_FORMERROR;
-
- return 0;
-}
-
// Returns true if byte "n" appears in "str".
// Like strchr() but independent of locale.
-static bool byte_in_str(char_u *str, int n)
+bool byte_in_str(char_u *str, int n)
{
char_u *p;
@@ -3354,7 +1894,7 @@ static bool byte_in_str(char_u *str, int n)
// Truncate "slang->sl_syllable" at the first slash and put the following items
// in "slang->sl_syl_items".
-static int init_syl_tab(slang_T *slang)
+int init_syl_tab(slang_T *slang)
{
char_u *p;
char_u *s;
@@ -3418,7 +1958,7 @@ static int count_syllables(slang_T *slang, char_u *word)
skip = false;
} else {
// No recognized syllable item, at least a syllable char then?
- c = mb_ptr2char(p);
+ c = utf_ptr2char(p);
len = (*mb_ptr2len)(p);
if (vim_strchr(slang->sl_syllable, c) == NULL)
skip = false; // No, search for next syllable
@@ -3431,294 +1971,6 @@ static int count_syllables(slang_T *slang, char_u *word)
return cnt;
}
-// Set the SOFOFROM and SOFOTO items in language "lp".
-// Returns SP_*ERROR flags when there is something wrong.
-static int set_sofo(slang_T *lp, char_u *from, char_u *to)
-{
- int i;
-
- garray_T *gap;
- char_u *s;
- char_u *p;
- int c;
- int *inp;
-
- if (has_mbyte) {
- // Use "sl_sal" as an array with 256 pointers to a list of wide
- // characters. The index is the low byte of the character.
- // The list contains from-to pairs with a terminating NUL.
- // sl_sal_first[] is used for latin1 "from" characters.
- gap = &lp->sl_sal;
- ga_init(gap, sizeof(int *), 1);
- ga_grow(gap, 256);
- memset(gap->ga_data, 0, sizeof(int *) * 256);
- gap->ga_len = 256;
-
- // First count the number of items for each list. Temporarily use
- // sl_sal_first[] for this.
- for (p = from, s = to; *p != NUL && *s != NUL; ) {
- c = mb_cptr2char_adv(&p);
- mb_cptr_adv(s);
- if (c >= 256)
- ++lp->sl_sal_first[c & 0xff];
- }
- if (*p != NUL || *s != NUL) // lengths differ
- return SP_FORMERROR;
-
- // Allocate the lists.
- for (i = 0; i < 256; ++i)
- if (lp->sl_sal_first[i] > 0) {
- p = xmalloc(sizeof(int) * (lp->sl_sal_first[i] * 2 + 1));
- ((int **)gap->ga_data)[i] = (int *)p;
- *(int *)p = 0;
- }
-
- // Put the characters up to 255 in sl_sal_first[] the rest in a sl_sal
- // list.
- memset(lp->sl_sal_first, 0, sizeof(salfirst_T) * 256);
- for (p = from, s = to; *p != NUL && *s != NUL; ) {
- c = mb_cptr2char_adv(&p);
- i = mb_cptr2char_adv(&s);
- if (c >= 256) {
- // Append the from-to chars at the end of the list with
- // the low byte.
- inp = ((int **)gap->ga_data)[c & 0xff];
- while (*inp != 0)
- ++inp;
- *inp++ = c; // from char
- *inp++ = i; // to char
- *inp++ = NUL; // NUL at the end
- } else
- // mapping byte to char is done in sl_sal_first[]
- lp->sl_sal_first[c] = i;
- }
- } else {
- // mapping bytes to bytes is done in sl_sal_first[]
- if (STRLEN(from) != STRLEN(to))
- return SP_FORMERROR;
-
- for (i = 0; to[i] != NUL; ++i)
- lp->sl_sal_first[from[i]] = to[i];
- lp->sl_sal.ga_len = 1; // indicates we have soundfolding
- }
-
- return 0;
-}
-
-// Fill the first-index table for "lp".
-static void set_sal_first(slang_T *lp)
-{
- salfirst_T *sfirst;
- salitem_T *smp;
- int c;
- garray_T *gap = &lp->sl_sal;
-
- sfirst = lp->sl_sal_first;
- for (int i = 0; i < 256; ++i) {
- sfirst[i] = -1;
- }
- smp = (salitem_T *)gap->ga_data;
- for (int i = 0; i < gap->ga_len; ++i) {
- if (has_mbyte)
- // Use the lowest byte of the first character. For latin1 it's
- // the character, for other encodings it should differ for most
- // characters.
- c = *smp[i].sm_lead_w & 0xff;
- else
- c = *smp[i].sm_lead;
- if (sfirst[c] == -1) {
- sfirst[c] = i;
- if (has_mbyte) {
- int n;
-
- // Make sure all entries with this byte are following each
- // other. Move the ones that are in the wrong position. Do
- // keep the same ordering!
- while (i + 1 < gap->ga_len
- && (*smp[i + 1].sm_lead_w & 0xff) == c)
- // Skip over entry with same index byte.
- ++i;
-
- for (n = 1; i + n < gap->ga_len; ++n)
- if ((*smp[i + n].sm_lead_w & 0xff) == c) {
- salitem_T tsal;
-
- // Move entry with same index byte after the entries
- // we already found.
- ++i;
- --n;
- tsal = smp[i + n];
- memmove(smp + i + 1, smp + i,
- sizeof(salitem_T) * n);
- smp[i] = tsal;
- }
- }
- }
- }
-}
-
-// Turn a multi-byte string into a wide character string.
-// Return it in allocated memory.
-static int *mb_str2wide(char_u *s)
-{
- int i = 0;
-
- int *res = xmalloc((mb_charlen(s) + 1) * sizeof(int));
- for (char_u *p = s; *p != NUL; )
- res[i++] = mb_ptr2char_adv(&p);
- res[i] = NUL;
-
- return res;
-}
-
-// Reads a tree from the .spl or .sug file.
-// Allocates the memory and stores pointers in "bytsp" and "idxsp".
-// This is skipped when the tree has zero length.
-// Returns zero when OK, SP_ value for an error.
-static int
-spell_read_tree (
- FILE *fd,
- char_u **bytsp,
- idx_T **idxsp,
- bool prefixtree, // true for the prefix tree
- int prefixcnt // when "prefixtree" is true: prefix count
-)
-{
- int idx;
- char_u *bp;
- idx_T *ip;
-
- // The tree size was computed when writing the file, so that we can
- // allocate it as one long block. <nodecount>
- int len = get4c(fd);
- if (len < 0)
- return SP_TRUNCERROR;
- if (len > 0) {
- // Allocate the byte array.
- bp = xmalloc(len);
- *bytsp = bp;
-
- // Allocate the index array.
- ip = xcalloc(len, sizeof(*ip));
- *idxsp = ip;
-
- // Recursively read the tree and store it in the array.
- idx = read_tree_node(fd, bp, ip, len, 0, prefixtree, prefixcnt);
- if (idx < 0)
- return idx;
- }
- return 0;
-}
-
-// Read one row of siblings from the spell file and store it in the byte array
-// "byts" and index array "idxs". Recursively read the children.
-//
-// NOTE: The code here must match put_node()!
-//
-// Returns the index (>= 0) following the siblings.
-// Returns SP_TRUNCERROR if the file is shorter than expected.
-// Returns SP_FORMERROR if there is a format error.
-static idx_T
-read_tree_node (
- FILE *fd,
- char_u *byts,
- idx_T *idxs,
- int maxidx, // size of arrays
- idx_T startidx, // current index in "byts" and "idxs"
- bool prefixtree, // true for reading PREFIXTREE
- int maxprefcondnr // maximum for <prefcondnr>
-)
-{
- int len;
- int i;
- int n;
- idx_T idx = startidx;
- int c;
- int c2;
-#define SHARED_MASK 0x8000000
-
- len = getc(fd); // <siblingcount>
- if (len <= 0)
- return SP_TRUNCERROR;
-
- if (startidx + len >= maxidx)
- return SP_FORMERROR;
- byts[idx++] = len;
-
- // Read the byte values, flag/region bytes and shared indexes.
- for (i = 1; i <= len; ++i) {
- c = getc(fd); // <byte>
- if (c < 0)
- return SP_TRUNCERROR;
- if (c <= BY_SPECIAL) {
- if (c == BY_NOFLAGS && !prefixtree) {
- // No flags, all regions.
- idxs[idx] = 0;
- c = 0;
- } else if (c != BY_INDEX) {
- if (prefixtree) {
- // Read the optional pflags byte, the prefix ID and the
- // condition nr. In idxs[] store the prefix ID in the low
- // byte, the condition index shifted up 8 bits, the flags
- // shifted up 24 bits.
- if (c == BY_FLAGS)
- c = getc(fd) << 24; // <pflags>
- else
- c = 0;
-
- c |= getc(fd); // <affixID>
-
- n = get2c(fd); // <prefcondnr>
- if (n >= maxprefcondnr)
- return SP_FORMERROR;
- c |= (n << 8);
- } else { // c must be BY_FLAGS or BY_FLAGS2
- // Read flags and optional region and prefix ID. In
- // idxs[] the flags go in the low two bytes, region above
- // that and prefix ID above the region.
- c2 = c;
- c = getc(fd); // <flags>
- if (c2 == BY_FLAGS2)
- c = (getc(fd) << 8) + c; // <flags2>
- if (c & WF_REGION)
- c = (getc(fd) << 16) + c; // <region>
- if (c & WF_AFX)
- c = (getc(fd) << 24) + c; // <affixID>
- }
-
- idxs[idx] = c;
- c = 0;
- } else { // c == BY_INDEX
- // <nodeidx>
- n = get3c(fd);
- if (n < 0 || n >= maxidx)
- return SP_FORMERROR;
- idxs[idx] = n + SHARED_MASK;
- c = getc(fd); // <xbyte>
- }
- }
- byts[idx++] = c;
- }
-
- // Recursively read the children for non-shared siblings.
- // Skip the end-of-word ones (zero byte value) and the shared ones (and
- // remove SHARED_MASK)
- for (i = 1; i <= len; ++i)
- if (byts[startidx + i] != 0) {
- if (idxs[startidx + i] & SHARED_MASK)
- idxs[startidx + i] &= ~SHARED_MASK;
- else {
- idxs[startidx + i] = idx;
- idx = read_tree_node(fd, byts, idxs, maxidx, idx,
- prefixtree, maxprefcondnr);
- if (idx < 0)
- break;
- }
- }
-
- return idx;
-}
-
// Parse 'spelllang' and set w_s->b_langp accordingly.
// Returns NULL if it's OK, an error message otherwise.
char_u *did_set_spelllang(win_T *wp)
@@ -3745,6 +1997,9 @@ char_u *did_set_spelllang(win_T *wp)
char_u *ret_msg = NULL;
char_u *spl_copy;
+ bufref_T bufref;
+ set_bufref(&bufref, wp->w_buffer);
+
// We don't want to do this recursively. May happen when a language is
// not available and the SpellFileMissing autocommand opens a new buffer
// in which 'spell' is set.
@@ -3790,9 +2045,11 @@ char_u *did_set_spelllang(win_T *wp)
dont_use_region = true;
// Check if we loaded this language before.
- for (slang = first_lang; slang != NULL; slang = slang->sl_next)
- if (path_full_compare(lang, slang->sl_fname, FALSE) == kEqualFiles)
+ for (slang = first_lang; slang != NULL; slang = slang->sl_next) {
+ if (path_full_compare(lang, slang->sl_fname, false) == kEqualFiles) {
break;
+ }
+ }
} else {
filename = false;
if (len > 3 && lang[len - 3] == '_') {
@@ -3823,17 +2080,18 @@ char_u *did_set_spelllang(win_T *wp)
spell_load_lang(lang);
// SpellFileMissing autocommands may do anything, including
// destroying the buffer we are using...
- if (!buf_valid(wp->w_buffer)) {
+ if (!bufref_valid(&bufref)) {
ret_msg =
- (char_u *)"E797: SpellFileMissing autocommand deleted buffer";
+ (char_u *)N_("E797: SpellFileMissing autocommand deleted buffer");
goto theend;
}
}
}
// Loop over the languages, there can be several files for "lang".
- for (slang = first_lang; slang != NULL; slang = slang->sl_next)
- if (filename ? path_full_compare(lang, slang->sl_fname, FALSE) == kEqualFiles
+ for (slang = first_lang; slang != NULL; slang = slang->sl_next) {
+ if (filename
+ ? path_full_compare(lang, slang->sl_fname, false) == kEqualFiles
: STRICMP(lang, slang->sl_name) == 0) {
region_mask = REGION_ALL;
if (!filename && region != NULL) {
@@ -3854,15 +2112,16 @@ char_u *did_set_spelllang(win_T *wp)
}
if (region_mask != 0) {
- langp_T *p = GA_APPEND_VIA_PTR(langp_T, &ga);
- p->lp_slang = slang;
- p->lp_region = region_mask;
+ langp_T *p_ = GA_APPEND_VIA_PTR(langp_T, &ga);
+ p_->lp_slang = slang;
+ p_->lp_region = region_mask;
use_midword(slang, wp);
if (slang->sl_nobreak)
nobreak = true;
}
}
+ }
}
// round 0: load int_wordlist, if possible.
@@ -3884,17 +2143,21 @@ char_u *did_set_spelllang(win_T *wp)
// If it was already found above then skip it.
for (c = 0; c < ga.ga_len; ++c) {
p = LANGP_ENTRY(ga, c)->lp_slang->sl_fname;
- if (p != NULL && path_full_compare(spf_name, p, FALSE) == kEqualFiles)
+ if (p != NULL
+ && path_full_compare(spf_name, p, false) == kEqualFiles) {
break;
+ }
}
if (c < ga.ga_len)
continue;
}
// Check if it was loaded already.
- for (slang = first_lang; slang != NULL; slang = slang->sl_next)
- if (path_full_compare(spf_name, slang->sl_fname, FALSE) == kEqualFiles)
+ for (slang = first_lang; slang != NULL; slang = slang->sl_next) {
+ if (path_full_compare(spf_name, slang->sl_fname, false) == kEqualFiles) {
break;
+ }
+ }
if (slang == NULL) {
// Not loaded, try loading it now. The language name includes the
// region name, the region is ignored otherwise. for int_wordlist
@@ -3927,11 +2190,11 @@ char_u *did_set_spelllang(win_T *wp)
}
if (region_mask != 0) {
- langp_T *p = GA_APPEND_VIA_PTR(langp_T, &ga);
- p->lp_slang = slang;
- p->lp_sallang = NULL;
- p->lp_replang = NULL;
- p->lp_region = region_mask;
+ langp_T *p_ = GA_APPEND_VIA_PTR(langp_T, &ga);
+ p_->lp_slang = slang;
+ p_->lp_sallang = NULL;
+ p_->lp_replang = NULL;
+ p_->lp_region = region_mask;
use_midword(slang, wp);
}
@@ -4010,7 +2273,7 @@ static void use_midword(slang_T *lp, win_T *wp)
int c, l, n;
char_u *bp;
- c = mb_ptr2char(p);
+ c = utf_ptr2char(p);
l = (*mb_ptr2len)(p);
if (c < 256 && l <= 2)
wp->w_s->b_spell_ismw[c] = true;
@@ -4046,16 +2309,17 @@ static int find_region(char_u *rp, char_u *region)
return i / 2;
}
-// Return case type of word:
-// w word 0
-// Word WF_ONECAP
-// W WORD WF_ALLCAP
-// WoRd wOrd WF_KEEPCAP
-static int
-captype (
- char_u *word,
- char_u *end // When NULL use up to NUL byte.
-)
+/// Return case type of word:
+/// w word 0
+/// Word WF_ONECAP
+/// W WORD WF_ALLCAP
+/// WoRd wOrd WF_KEEPCAP
+///
+/// @param[in] word
+/// @param[in] end End of word or NULL for NUL delimited string
+///
+/// @returns Case type of word
+int captype(char_u *word, char_u *end)
{
char_u *p;
int c;
@@ -4064,30 +2328,36 @@ captype (
bool past_second = false; // past second word char
// find first letter
- for (p = word; !spell_iswordp_nmw(p, curwin); mb_ptr_adv(p))
- if (end == NULL ? *p == NUL : p >= end)
+ for (p = word; !spell_iswordp_nmw(p, curwin); MB_PTR_ADV(p)) {
+ if (end == NULL ? *p == NUL : p >= end) {
return 0; // only non-word characters, illegal word
- if (has_mbyte)
- c = mb_ptr2char_adv(&p);
- else
+ }
+ }
+ if (has_mbyte) {
+ c = mb_ptr2char_adv((const char_u **)&p);
+ } else {
c = *p++;
+ }
firstcap = allcap = SPELL_ISUPPER(c);
// Need to check all letters to find a word with mixed upper/lower.
// But a word with an upper char only at start is a ONECAP.
- for (; end == NULL ? *p != NUL : p < end; mb_ptr_adv(p))
+ for (; end == NULL ? *p != NUL : p < end; MB_PTR_ADV(p)) {
if (spell_iswordp_nmw(p, curwin)) {
c = PTR2CHAR(p);
if (!SPELL_ISUPPER(c)) {
// UUl -> KEEPCAP
- if (past_second && allcap)
+ if (past_second && allcap) {
return WF_KEEPCAP;
+ }
allcap = false;
- } else if (!allcap)
+ } else if (!allcap) {
// UlU -> KEEPCAP
return WF_KEEPCAP;
+ }
past_second = true;
}
+ }
if (allcap)
return WF_ALLCAP;
@@ -4111,7 +2381,7 @@ static int badword_captype(char_u *word, char_u *end)
// Count the number of UPPER and lower case letters.
l = u = 0;
first = false;
- for (p = word; p < end; mb_ptr_adv(p)) {
+ for (p = word; p < end; MB_PTR_ADV(p)) {
c = PTR2CHAR(p);
if (SPELL_ISUPPER(c)) {
++u;
@@ -4197,3221 +2467,6 @@ void spell_reload(void)
}
}
-// Reload the spell file "fname" if it's loaded.
-static void
-spell_reload_one (
- char_u *fname,
- bool added_word // invoked through "zg"
-)
-{
- slang_T *slang;
- bool didit = false;
-
- for (slang = first_lang; slang != NULL; slang = slang->sl_next) {
- if (path_full_compare(fname, slang->sl_fname, FALSE) == kEqualFiles) {
- slang_clear(slang);
- if (spell_load_file(fname, NULL, slang, false) == NULL)
- // reloading failed, clear the language
- slang_clear(slang);
- redraw_all_later(SOME_VALID);
- didit = true;
- }
- }
-
- // When "zg" was used and the file wasn't loaded yet, should redo
- // 'spelllang' to load it now.
- if (added_word && !didit)
- did_set_spelllang(curwin);
-}
-
-
-// Functions for ":mkspell".
-
-
-// In the postponed prefixes tree wn_flags is used to store the WFP_ flags,
-// but it must be negative to indicate the prefix tree to tree_add_word().
-// Use a negative number with the lower 8 bits zero.
-#define PFX_FLAGS -256
-
-// flags for "condit" argument of store_aff_word()
-#define CONDIT_COMB 1 // affix must combine
-#define CONDIT_CFIX 2 // affix must have CIRCUMFIX flag
-#define CONDIT_SUF 4 // add a suffix for matching flags
-#define CONDIT_AFF 8 // word already has an affix
-
-// Tunable parameters for when the tree is compressed. See 'mkspellmem'.
-static long compress_start = 30000; // memory / SBLOCKSIZE
-static long compress_inc = 100; // memory / SBLOCKSIZE
-static long compress_added = 500000; // word count
-
-#ifdef SPELL_PRINTTREE
-// For debugging the tree code: print the current tree in a (more or less)
-// readable format, so that we can see what happens when adding a word and/or
-// compressing the tree.
-// Based on code from Olaf Seibert.
-#define PRINTLINESIZE 1000
-#define PRINTWIDTH 6
-
-#define PRINTSOME(l, depth, fmt, a1, a2) vim_snprintf(l + depth * PRINTWIDTH, \
- PRINTLINESIZE - PRINTWIDTH * depth, fmt, a1, a2)
-
-static char line1[PRINTLINESIZE];
-static char line2[PRINTLINESIZE];
-static char line3[PRINTLINESIZE];
-
-static void spell_clear_flags(wordnode_T *node)
-{
- wordnode_T *np;
-
- for (np = node; np != NULL; np = np->wn_sibling) {
- np->wn_u1.index = FALSE;
- spell_clear_flags(np->wn_child);
- }
-}
-
-static void spell_print_node(wordnode_T *node, int depth)
-{
- if (node->wn_u1.index) {
- // Done this node before, print the reference.
- PRINTSOME(line1, depth, "(%d)", node->wn_nr, 0);
- PRINTSOME(line2, depth, " ", 0, 0);
- PRINTSOME(line3, depth, " ", 0, 0);
- msg((char_u *)line1);
- msg((char_u *)line2);
- msg((char_u *)line3);
- } else {
- node->wn_u1.index = TRUE;
-
- if (node->wn_byte != NUL) {
- if (node->wn_child != NULL)
- PRINTSOME(line1, depth, " %c -> ", node->wn_byte, 0);
- else
- // Cannot happen?
- PRINTSOME(line1, depth, " %c ???", node->wn_byte, 0);
- } else
- PRINTSOME(line1, depth, " $ ", 0, 0);
-
- PRINTSOME(line2, depth, "%d/%d ", node->wn_nr, node->wn_refs);
-
- if (node->wn_sibling != NULL)
- PRINTSOME(line3, depth, " | ", 0, 0);
- else
- PRINTSOME(line3, depth, " ", 0, 0);
-
- if (node->wn_byte == NUL) {
- msg((char_u *)line1);
- msg((char_u *)line2);
- msg((char_u *)line3);
- }
-
- // do the children
- if (node->wn_byte != NUL && node->wn_child != NULL)
- spell_print_node(node->wn_child, depth + 1);
-
- // do the siblings
- if (node->wn_sibling != NULL) {
- // get rid of all parent details except |
- STRCPY(line1, line3);
- STRCPY(line2, line3);
- spell_print_node(node->wn_sibling, depth);
- }
- }
-}
-
-static void spell_print_tree(wordnode_T *root)
-{
- if (root != NULL) {
- // Clear the "wn_u1.index" fields, used to remember what has been
- // done.
- spell_clear_flags(root);
-
- // Recursively print the tree.
- spell_print_node(root, 0);
- }
-}
-
-#endif // SPELL_PRINTTREE
-
-// Reads the affix file "fname".
-// Returns an afffile_T, NULL for complete failure.
-static afffile_T *spell_read_aff(spellinfo_T *spin, char_u *fname)
-{
- FILE *fd;
- afffile_T *aff;
- char_u rline[MAXLINELEN];
- char_u *line;
- char_u *pc = NULL;
-#define MAXITEMCNT 30
- char_u *(items[MAXITEMCNT]);
- int itemcnt;
- char_u *p;
- int lnum = 0;
- affheader_T *cur_aff = NULL;
- bool did_postpone_prefix = false;
- int aff_todo = 0;
- hashtab_T *tp;
- char_u *low = NULL;
- char_u *fol = NULL;
- char_u *upp = NULL;
- int do_rep;
- int do_repsal;
- int do_sal;
- int do_mapline;
- bool found_map = false;
- hashitem_T *hi;
- int l;
- int compminlen = 0; // COMPOUNDMIN value
- int compsylmax = 0; // COMPOUNDSYLMAX value
- int compoptions = 0; // COMP_ flags
- int compmax = 0; // COMPOUNDWORDMAX value
- char_u *compflags = NULL; // COMPOUNDFLAG and COMPOUNDRULE
- // concatenated
- char_u *midword = NULL; // MIDWORD value
- char_u *syllable = NULL; // SYLLABLE value
- char_u *sofofrom = NULL; // SOFOFROM value
- char_u *sofoto = NULL; // SOFOTO value
-
- // Open the file.
- fd = mch_fopen((char *)fname, "r");
- if (fd == NULL) {
- EMSG2(_(e_notopen), fname);
- return NULL;
- }
-
- vim_snprintf((char *)IObuff, IOSIZE, _("Reading affix file %s ..."), fname);
- spell_message(spin, IObuff);
-
- // Only do REP lines when not done in another .aff file already.
- do_rep = GA_EMPTY(&spin->si_rep);
-
- // Only do REPSAL lines when not done in another .aff file already.
- do_repsal = GA_EMPTY(&spin->si_repsal);
-
- // Only do SAL lines when not done in another .aff file already.
- do_sal = GA_EMPTY(&spin->si_sal);
-
- // Only do MAP lines when not done in another .aff file already.
- do_mapline = GA_EMPTY(&spin->si_map);
-
- // Allocate and init the afffile_T structure.
- aff = (afffile_T *)getroom(spin, sizeof(afffile_T), true);
- if (aff == NULL) {
- fclose(fd);
- return NULL;
- }
- hash_init(&aff->af_pref);
- hash_init(&aff->af_suff);
- hash_init(&aff->af_comp);
-
- // Read all the lines in the file one by one.
- while (!vim_fgets(rline, MAXLINELEN, fd) && !got_int) {
- line_breakcheck();
- ++lnum;
-
- // Skip comment lines.
- if (*rline == '#')
- continue;
-
- // Convert from "SET" to 'encoding' when needed.
- xfree(pc);
- if (spin->si_conv.vc_type != CONV_NONE) {
- pc = string_convert(&spin->si_conv, rline, NULL);
- if (pc == NULL) {
- smsg(_("Conversion failure for word in %s line %d: %s"),
- fname, lnum, rline);
- continue;
- }
- line = pc;
- } else {
- pc = NULL;
- line = rline;
- }
-
- // Split the line up in white separated items. Put a NUL after each
- // item.
- itemcnt = 0;
- for (p = line;; ) {
- while (*p != NUL && *p <= ' ') // skip white space and CR/NL
- ++p;
- if (*p == NUL)
- break;
- if (itemcnt == MAXITEMCNT) // too many items
- break;
- items[itemcnt++] = p;
- // A few items have arbitrary text argument, don't split them.
- if (itemcnt == 2 && spell_info_item(items[0]))
- while (*p >= ' ' || *p == TAB) // skip until CR/NL
- ++p;
- else
- while (*p > ' ') // skip until white space or CR/NL
- ++p;
- if (*p == NUL)
- break;
- *p++ = NUL;
- }
-
- // Handle non-empty lines.
- if (itemcnt > 0) {
- if (is_aff_rule(items, itemcnt, "SET", 2) && aff->af_enc == NULL) {
- // Setup for conversion from "ENC" to 'encoding'.
- aff->af_enc = enc_canonize(items[1]);
- if (!spin->si_ascii
- && convert_setup(&spin->si_conv, aff->af_enc,
- p_enc) == FAIL)
- smsg(_("Conversion in %s not supported: from %s to %s"),
- fname, aff->af_enc, p_enc);
- spin->si_conv.vc_fail = true;
- } else if (is_aff_rule(items, itemcnt, "FLAG", 2)
- && aff->af_flagtype == AFT_CHAR) {
- if (STRCMP(items[1], "long") == 0)
- aff->af_flagtype = AFT_LONG;
- else if (STRCMP(items[1], "num") == 0)
- aff->af_flagtype = AFT_NUM;
- else if (STRCMP(items[1], "caplong") == 0)
- aff->af_flagtype = AFT_CAPLONG;
- else
- smsg(_("Invalid value for FLAG in %s line %d: %s"),
- fname, lnum, items[1]);
- if (aff->af_rare != 0
- || aff->af_keepcase != 0
- || aff->af_bad != 0
- || aff->af_needaffix != 0
- || aff->af_circumfix != 0
- || aff->af_needcomp != 0
- || aff->af_comproot != 0
- || aff->af_nosuggest != 0
- || compflags != NULL
- || aff->af_suff.ht_used > 0
- || aff->af_pref.ht_used > 0)
- smsg(_("FLAG after using flags in %s line %d: %s"),
- fname, lnum, items[1]);
- } else if (spell_info_item(items[0]) && itemcnt > 1) {
- p = (char_u *)getroom(spin,
- (spin->si_info == NULL ? 0 : STRLEN(spin->si_info))
- + STRLEN(items[0])
- + STRLEN(items[1]) + 3, false);
- if (p != NULL) {
- if (spin->si_info != NULL) {
- STRCPY(p, spin->si_info);
- STRCAT(p, "\n");
- }
- STRCAT(p, items[0]);
- STRCAT(p, " ");
- STRCAT(p, items[1]);
- spin->si_info = p;
- }
- } else if (is_aff_rule(items, itemcnt, "MIDWORD", 2)
- && midword == NULL) {
- midword = getroom_save(spin, items[1]);
- } else if (is_aff_rule(items, itemcnt, "TRY", 2)) {
- // ignored, we look in the tree for what chars may appear
- }
- // TODO: remove "RAR" later
- else if ((is_aff_rule(items, itemcnt, "RAR", 2)
- || is_aff_rule(items, itemcnt, "RARE", 2))
- && aff->af_rare == 0) {
- aff->af_rare = affitem2flag(aff->af_flagtype, items[1],
- fname, lnum);
- }
- // TODO: remove "KEP" later
- else if ((is_aff_rule(items, itemcnt, "KEP", 2)
- || is_aff_rule(items, itemcnt, "KEEPCASE", 2))
- && aff->af_keepcase == 0) {
- aff->af_keepcase = affitem2flag(aff->af_flagtype, items[1],
- fname, lnum);
- } else if ((is_aff_rule(items, itemcnt, "BAD", 2)
- || is_aff_rule(items, itemcnt, "FORBIDDENWORD", 2))
- && aff->af_bad == 0) {
- aff->af_bad = affitem2flag(aff->af_flagtype, items[1],
- fname, lnum);
- } else if (is_aff_rule(items, itemcnt, "NEEDAFFIX", 2)
- && aff->af_needaffix == 0) {
- aff->af_needaffix = affitem2flag(aff->af_flagtype, items[1],
- fname, lnum);
- } else if (is_aff_rule(items, itemcnt, "CIRCUMFIX", 2)
- && aff->af_circumfix == 0) {
- aff->af_circumfix = affitem2flag(aff->af_flagtype, items[1],
- fname, lnum);
- } else if (is_aff_rule(items, itemcnt, "NOSUGGEST", 2)
- && aff->af_nosuggest == 0) {
- aff->af_nosuggest = affitem2flag(aff->af_flagtype, items[1],
- fname, lnum);
- } else if ((is_aff_rule(items, itemcnt, "NEEDCOMPOUND", 2)
- || is_aff_rule(items, itemcnt, "ONLYINCOMPOUND", 2))
- && aff->af_needcomp == 0) {
- aff->af_needcomp = affitem2flag(aff->af_flagtype, items[1],
- fname, lnum);
- } else if (is_aff_rule(items, itemcnt, "COMPOUNDROOT", 2)
- && aff->af_comproot == 0) {
- aff->af_comproot = affitem2flag(aff->af_flagtype, items[1],
- fname, lnum);
- } else if (is_aff_rule(items, itemcnt, "COMPOUNDFORBIDFLAG", 2)
- && aff->af_compforbid == 0) {
- aff->af_compforbid = affitem2flag(aff->af_flagtype, items[1],
- fname, lnum);
- if (aff->af_pref.ht_used > 0)
- smsg(_("Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line %d"),
- fname, lnum);
- } else if (is_aff_rule(items, itemcnt, "COMPOUNDPERMITFLAG", 2)
- && aff->af_comppermit == 0) {
- aff->af_comppermit = affitem2flag(aff->af_flagtype, items[1],
- fname, lnum);
- if (aff->af_pref.ht_used > 0)
- smsg(_("Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line %d"),
- fname, lnum);
- } else if (is_aff_rule(items, itemcnt, "COMPOUNDFLAG", 2)
- && compflags == NULL) {
- // Turn flag "c" into COMPOUNDRULE compatible string "c+",
- // "Na" into "Na+", "1234" into "1234+".
- p = getroom(spin, STRLEN(items[1]) + 2, false);
- STRCPY(p, items[1]);
- STRCAT(p, "+");
- compflags = p;
- } else if (is_aff_rule(items, itemcnt, "COMPOUNDRULES", 2)) {
- // We don't use the count, but do check that it's a number and
- // not COMPOUNDRULE mistyped.
- if (atoi((char *)items[1]) == 0)
- smsg(_("Wrong COMPOUNDRULES value in %s line %d: %s"),
- fname, lnum, items[1]);
- } else if (is_aff_rule(items, itemcnt, "COMPOUNDRULE", 2)) {
- // Don't use the first rule if it is a number.
- if (compflags != NULL || *skipdigits(items[1]) != NUL) {
- // Concatenate this string to previously defined ones,
- // using a slash to separate them.
- l = (int)STRLEN(items[1]) + 1;
- if (compflags != NULL)
- l += (int)STRLEN(compflags) + 1;
- p = getroom(spin, l, false);
- if (compflags != NULL) {
- STRCPY(p, compflags);
- STRCAT(p, "/");
- }
- STRCAT(p, items[1]);
- compflags = p;
- }
- } else if (is_aff_rule(items, itemcnt, "COMPOUNDWORDMAX", 2)
- && compmax == 0) {
- compmax = atoi((char *)items[1]);
- if (compmax == 0)
- smsg(_("Wrong COMPOUNDWORDMAX value in %s line %d: %s"),
- fname, lnum, items[1]);
- } else if (is_aff_rule(items, itemcnt, "COMPOUNDMIN", 2)
- && compminlen == 0) {
- compminlen = atoi((char *)items[1]);
- if (compminlen == 0)
- smsg(_("Wrong COMPOUNDMIN value in %s line %d: %s"),
- fname, lnum, items[1]);
- } else if (is_aff_rule(items, itemcnt, "COMPOUNDSYLMAX", 2)
- && compsylmax == 0) {
- compsylmax = atoi((char *)items[1]);
- if (compsylmax == 0)
- smsg(_("Wrong COMPOUNDSYLMAX value in %s line %d: %s"),
- fname, lnum, items[1]);
- } else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDDUP", 1)) {
- compoptions |= COMP_CHECKDUP;
- } else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDREP", 1)) {
- compoptions |= COMP_CHECKREP;
- } else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDCASE", 1)) {
- compoptions |= COMP_CHECKCASE;
- } else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDTRIPLE", 1)) {
- compoptions |= COMP_CHECKTRIPLE;
- } else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDPATTERN", 2)) {
- if (atoi((char *)items[1]) == 0)
- smsg(_("Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"),
- fname, lnum, items[1]);
- } else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDPATTERN", 3)) {
- garray_T *gap = &spin->si_comppat;
- int i;
-
- // Only add the couple if it isn't already there.
- for (i = 0; i < gap->ga_len - 1; i += 2)
- if (STRCMP(((char_u **)(gap->ga_data))[i], items[1]) == 0
- && STRCMP(((char_u **)(gap->ga_data))[i + 1],
- items[2]) == 0)
- break;
- if (i >= gap->ga_len) {
- ga_grow(gap, 2);
- ((char_u **)(gap->ga_data))[gap->ga_len++]
- = getroom_save(spin, items[1]);
- ((char_u **)(gap->ga_data))[gap->ga_len++]
- = getroom_save(spin, items[2]);
- }
- } else if (is_aff_rule(items, itemcnt, "SYLLABLE", 2)
- && syllable == NULL) {
- syllable = getroom_save(spin, items[1]);
- } else if (is_aff_rule(items, itemcnt, "NOBREAK", 1)) {
- spin->si_nobreak = true;
- } else if (is_aff_rule(items, itemcnt, "NOSPLITSUGS", 1)) {
- spin->si_nosplitsugs = true;
- } else if (is_aff_rule(items, itemcnt, "NOCOMPOUNDSUGS", 1)) {
- spin->si_nocompoundsugs = true;
- } else if (is_aff_rule(items, itemcnt, "NOSUGFILE", 1)) {
- spin->si_nosugfile = true;
- } else if (is_aff_rule(items, itemcnt, "PFXPOSTPONE", 1)) {
- aff->af_pfxpostpone = true;
- } else if (is_aff_rule(items, itemcnt, "IGNOREEXTRA", 1)) {
- aff->af_ignoreextra = true;
- } else if ((STRCMP(items[0], "PFX") == 0
- || STRCMP(items[0], "SFX") == 0)
- && aff_todo == 0
- && itemcnt >= 4) {
- int lasti = 4;
- char_u key[AH_KEY_LEN];
-
- if (*items[0] == 'P')
- tp = &aff->af_pref;
- else
- tp = &aff->af_suff;
-
- // Myspell allows the same affix name to be used multiple
- // times. The affix files that do this have an undocumented
- // "S" flag on all but the last block, thus we check for that
- // and store it in ah_follows.
- STRLCPY(key, items[1], AH_KEY_LEN);
- hi = hash_find(tp, key);
- if (!HASHITEM_EMPTY(hi)) {
- cur_aff = HI2AH(hi);
- if (cur_aff->ah_combine != (*items[2] == 'Y'))
- smsg(_("Different combining flag in continued affix block in %s line %d: %s"),
- fname, lnum, items[1]);
- if (!cur_aff->ah_follows)
- smsg(_("Duplicate affix in %s line %d: %s"),
- fname, lnum, items[1]);
- } else {
- // New affix letter.
- cur_aff = (affheader_T *)getroom(spin,
- sizeof(affheader_T), true);
- if (cur_aff == NULL)
- break;
- cur_aff->ah_flag = affitem2flag(aff->af_flagtype, items[1],
- fname, lnum);
- if (cur_aff->ah_flag == 0 || STRLEN(items[1]) >= AH_KEY_LEN)
- break;
- if (cur_aff->ah_flag == aff->af_bad
- || cur_aff->ah_flag == aff->af_rare
- || cur_aff->ah_flag == aff->af_keepcase
- || cur_aff->ah_flag == aff->af_needaffix
- || cur_aff->ah_flag == aff->af_circumfix
- || cur_aff->ah_flag == aff->af_nosuggest
- || cur_aff->ah_flag == aff->af_needcomp
- || cur_aff->ah_flag == aff->af_comproot)
- smsg(_("Affix also used for "
- "BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST"
- "in %s line %d: %s"),
- fname, lnum, items[1]);
- STRCPY(cur_aff->ah_key, items[1]);
- hash_add(tp, cur_aff->ah_key);
-
- cur_aff->ah_combine = (*items[2] == 'Y');
- }
-
- // Check for the "S" flag, which apparently means that another
- // block with the same affix name is following.
- if (itemcnt > lasti && STRCMP(items[lasti], "S") == 0) {
- ++lasti;
- cur_aff->ah_follows = true;
- } else
- cur_aff->ah_follows = false;
-
- // Myspell allows extra text after the item, but that might
- // mean mistakes go unnoticed. Require a comment-starter,
- // unless IGNOREEXTRA is used. Hunspell uses a "-" item.
- if (itemcnt > lasti
- && !aff->af_ignoreextra
- && *items[lasti] != '#')
- smsg(_(e_afftrailing), fname, lnum, items[lasti]);
-
- if (STRCMP(items[2], "Y") != 0 && STRCMP(items[2], "N") != 0)
- smsg(_("Expected Y or N in %s line %d: %s"),
- fname, lnum, items[2]);
-
- if (*items[0] == 'P' && aff->af_pfxpostpone) {
- if (cur_aff->ah_newID == 0) {
- // Use a new number in the .spl file later, to be able
- // to handle multiple .aff files.
- check_renumber(spin);
- cur_aff->ah_newID = ++spin->si_newprefID;
-
- // We only really use ah_newID if the prefix is
- // postponed. We know that only after handling all
- // the items.
- did_postpone_prefix = false;
- } else
- // Did use the ID in a previous block.
- did_postpone_prefix = true;
- }
-
- aff_todo = atoi((char *)items[3]);
- } else if ((STRCMP(items[0], "PFX") == 0
- || STRCMP(items[0], "SFX") == 0)
- && aff_todo > 0
- && STRCMP(cur_aff->ah_key, items[1]) == 0
- && itemcnt >= 5) {
- affentry_T *aff_entry;
- bool upper = false;
- int lasti = 5;
-
- // Myspell allows extra text after the item, but that might
- // mean mistakes go unnoticed. Require a comment-starter.
- // Hunspell uses a "-" item.
- if (itemcnt > lasti && *items[lasti] != '#'
- && (STRCMP(items[lasti], "-") != 0
- || itemcnt != lasti + 1))
- smsg(_(e_afftrailing), fname, lnum, items[lasti]);
-
- // New item for an affix letter.
- --aff_todo;
- aff_entry = (affentry_T *)getroom(spin,
- sizeof(affentry_T), true);
- if (aff_entry == NULL)
- break;
-
- if (STRCMP(items[2], "0") != 0)
- aff_entry->ae_chop = getroom_save(spin, items[2]);
- if (STRCMP(items[3], "0") != 0) {
- aff_entry->ae_add = getroom_save(spin, items[3]);
-
- // Recognize flags on the affix: abcd/XYZ
- aff_entry->ae_flags = vim_strchr(aff_entry->ae_add, '/');
- if (aff_entry->ae_flags != NULL) {
- *aff_entry->ae_flags++ = NUL;
- aff_process_flags(aff, aff_entry);
- }
- }
-
- // Don't use an affix entry with non-ASCII characters when
- // "spin->si_ascii" is true.
- if (!spin->si_ascii || !(has_non_ascii(aff_entry->ae_chop)
- || has_non_ascii(aff_entry->ae_add))) {
- aff_entry->ae_next = cur_aff->ah_first;
- cur_aff->ah_first = aff_entry;
-
- if (STRCMP(items[4], ".") != 0) {
- char_u buf[MAXLINELEN];
-
- aff_entry->ae_cond = getroom_save(spin, items[4]);
- if (*items[0] == 'P')
- sprintf((char *)buf, "^%s", items[4]);
- else
- sprintf((char *)buf, "%s$", items[4]);
- aff_entry->ae_prog = vim_regcomp(buf,
- RE_MAGIC + RE_STRING + RE_STRICT);
- if (aff_entry->ae_prog == NULL)
- smsg(_("Broken condition in %s line %d: %s"),
- fname, lnum, items[4]);
- }
-
- // For postponed prefixes we need an entry in si_prefcond
- // for the condition. Use an existing one if possible.
- // Can't be done for an affix with flags, ignoring
- // COMPOUNDFORBIDFLAG and COMPOUNDPERMITFLAG.
- if (*items[0] == 'P' && aff->af_pfxpostpone
- && aff_entry->ae_flags == NULL) {
- // When the chop string is one lower-case letter and
- // the add string ends in the upper-case letter we set
- // the "upper" flag, clear "ae_chop" and remove the
- // letters from "ae_add". The condition must either
- // be empty or start with the same letter.
- if (aff_entry->ae_chop != NULL
- && aff_entry->ae_add != NULL
- && aff_entry->ae_chop[(*mb_ptr2len)(
- aff_entry->ae_chop)] == NUL
- ) {
- int c, c_up;
-
- c = PTR2CHAR(aff_entry->ae_chop);
- c_up = SPELL_TOUPPER(c);
- if (c_up != c
- && (aff_entry->ae_cond == NULL
- || PTR2CHAR(aff_entry->ae_cond) == c)) {
- p = aff_entry->ae_add
- + STRLEN(aff_entry->ae_add);
- mb_ptr_back(aff_entry->ae_add, p);
- if (PTR2CHAR(p) == c_up) {
- upper = true;
- aff_entry->ae_chop = NULL;
- *p = NUL;
-
- // The condition is matched with the
- // actual word, thus must check for the
- // upper-case letter.
- if (aff_entry->ae_cond != NULL) {
- char_u buf[MAXLINELEN];
- if (has_mbyte) {
- onecap_copy(items[4], buf, true);
- aff_entry->ae_cond = getroom_save(
- spin, buf);
- } else
- *aff_entry->ae_cond = c_up;
- if (aff_entry->ae_cond != NULL) {
- sprintf((char *)buf, "^%s",
- aff_entry->ae_cond);
- vim_regfree(aff_entry->ae_prog);
- aff_entry->ae_prog = vim_regcomp(
- buf, RE_MAGIC + RE_STRING);
- }
- }
- }
- }
- }
-
- if (aff_entry->ae_chop == NULL
- && aff_entry->ae_flags == NULL) {
- int idx;
- char_u **pp;
- int n;
-
- // Find a previously used condition.
- for (idx = spin->si_prefcond.ga_len - 1; idx >= 0;
- --idx) {
- p = ((char_u **)spin->si_prefcond.ga_data)[idx];
- if (str_equal(p, aff_entry->ae_cond))
- break;
- }
- if (idx < 0) {
- // Not found, add a new condition.
- idx = spin->si_prefcond.ga_len;
- pp = GA_APPEND_VIA_PTR(char_u *, &spin->si_prefcond);
- *pp = (aff_entry->ae_cond == NULL) ?
- NULL : getroom_save(spin, aff_entry->ae_cond);
- }
-
- // Add the prefix to the prefix tree.
- if (aff_entry->ae_add == NULL)
- p = (char_u *)"";
- else
- p = aff_entry->ae_add;
-
- // PFX_FLAGS is a negative number, so that
- // tree_add_word() knows this is the prefix tree.
- n = PFX_FLAGS;
- if (!cur_aff->ah_combine)
- n |= WFP_NC;
- if (upper)
- n |= WFP_UP;
- if (aff_entry->ae_comppermit)
- n |= WFP_COMPPERMIT;
- if (aff_entry->ae_compforbid)
- n |= WFP_COMPFORBID;
- tree_add_word(spin, p, spin->si_prefroot, n,
- idx, cur_aff->ah_newID);
- did_postpone_prefix = true;
- }
-
- // Didn't actually use ah_newID, backup si_newprefID.
- if (aff_todo == 0 && !did_postpone_prefix) {
- --spin->si_newprefID;
- cur_aff->ah_newID = 0;
- }
- }
- }
- } else if (is_aff_rule(items, itemcnt, "FOL", 2) && fol == NULL) {
- fol = vim_strsave(items[1]);
- } else if (is_aff_rule(items, itemcnt, "LOW", 2) && low == NULL) {
- low = vim_strsave(items[1]);
- } else if (is_aff_rule(items, itemcnt, "UPP", 2) && upp == NULL) {
- upp = vim_strsave(items[1]);
- } else if (is_aff_rule(items, itemcnt, "REP", 2)
- || is_aff_rule(items, itemcnt, "REPSAL", 2)) {
- /* Ignore REP/REPSAL count */;
- if (!isdigit(*items[1]))
- smsg(_("Expected REP(SAL) count in %s line %d"),
- fname, lnum);
- } else if ((STRCMP(items[0], "REP") == 0
- || STRCMP(items[0], "REPSAL") == 0)
- && itemcnt >= 3) {
- // REP/REPSAL item
- // Myspell ignores extra arguments, we require it starts with
- // # to detect mistakes.
- if (itemcnt > 3 && items[3][0] != '#')
- smsg(_(e_afftrailing), fname, lnum, items[3]);
- if (items[0][3] == 'S' ? do_repsal : do_rep) {
- // Replace underscore with space (can't include a space
- // directly).
- for (p = items[1]; *p != NUL; mb_ptr_adv(p))
- if (*p == '_')
- *p = ' ';
- for (p = items[2]; *p != NUL; mb_ptr_adv(p))
- if (*p == '_')
- *p = ' ';
- add_fromto(spin, items[0][3] == 'S'
- ? &spin->si_repsal
- : &spin->si_rep, items[1], items[2]);
- }
- } else if (is_aff_rule(items, itemcnt, "MAP", 2)) {
- // MAP item or count
- if (!found_map) {
- // First line contains the count.
- found_map = true;
- if (!isdigit(*items[1]))
- smsg(_("Expected MAP count in %s line %d"),
- fname, lnum);
- } else if (do_mapline) {
- int c;
-
- // Check that every character appears only once.
- for (p = items[1]; *p != NUL; ) {
- c = mb_ptr2char_adv(&p);
- if ((!GA_EMPTY(&spin->si_map)
- && vim_strchr(spin->si_map.ga_data, c)
- != NULL)
- || vim_strchr(p, c) != NULL)
- smsg(_("Duplicate character in MAP in %s line %d"),
- fname, lnum);
- }
-
- // We simply concatenate all the MAP strings, separated by
- // slashes.
- ga_concat(&spin->si_map, items[1]);
- ga_append(&spin->si_map, '/');
- }
- }
- // Accept "SAL from to" and "SAL from to #comment".
- else if (is_aff_rule(items, itemcnt, "SAL", 3)) {
- if (do_sal) {
- // SAL item (sounds-a-like)
- // Either one of the known keys or a from-to pair.
- if (STRCMP(items[1], "followup") == 0)
- spin->si_followup = sal_to_bool(items[2]);
- else if (STRCMP(items[1], "collapse_result") == 0)
- spin->si_collapse = sal_to_bool(items[2]);
- else if (STRCMP(items[1], "remove_accents") == 0)
- spin->si_rem_accents = sal_to_bool(items[2]);
- else
- // when "to" is "_" it means empty
- add_fromto(spin, &spin->si_sal, items[1],
- STRCMP(items[2], "_") == 0 ? (char_u *)""
- : items[2]);
- }
- } else if (is_aff_rule(items, itemcnt, "SOFOFROM", 2)
- && sofofrom == NULL) {
- sofofrom = getroom_save(spin, items[1]);
- } else if (is_aff_rule(items, itemcnt, "SOFOTO", 2)
- && sofoto == NULL) {
- sofoto = getroom_save(spin, items[1]);
- } else if (STRCMP(items[0], "COMMON") == 0) {
- int i;
-
- for (i = 1; i < itemcnt; ++i) {
- if (HASHITEM_EMPTY(hash_find(&spin->si_commonwords,
- items[i]))) {
- p = vim_strsave(items[i]);
- hash_add(&spin->si_commonwords, p);
- }
- }
- } else
- smsg(_("Unrecognized or duplicate item in %s line %d: %s"),
- fname, lnum, items[0]);
- }
- }
-
- if (fol != NULL || low != NULL || upp != NULL) {
- if (spin->si_clear_chartab) {
- // Clear the char type tables, don't want to use any of the
- // currently used spell properties.
- init_spell_chartab();
- spin->si_clear_chartab = false;
- }
-
- // Don't write a word table for an ASCII file, so that we don't check
- // for conflicts with a word table that matches 'encoding'.
- // Don't write one for utf-8 either, we use utf_*() and
- // mb_get_class(), the list of chars in the file will be incomplete.
- if (!spin->si_ascii
- && !enc_utf8
- ) {
- if (fol == NULL || low == NULL || upp == NULL)
- smsg(_("Missing FOL/LOW/UPP line in %s"), fname);
- else
- (void)set_spell_chartab(fol, low, upp);
- }
-
- xfree(fol);
- xfree(low);
- xfree(upp);
- }
-
- // Use compound specifications of the .aff file for the spell info.
- if (compmax != 0) {
- aff_check_number(spin->si_compmax, compmax, "COMPOUNDWORDMAX");
- spin->si_compmax = compmax;
- }
-
- if (compminlen != 0) {
- aff_check_number(spin->si_compminlen, compminlen, "COMPOUNDMIN");
- spin->si_compminlen = compminlen;
- }
-
- if (compsylmax != 0) {
- if (syllable == NULL)
- smsg(_("COMPOUNDSYLMAX used without SYLLABLE"));
- aff_check_number(spin->si_compsylmax, compsylmax, "COMPOUNDSYLMAX");
- spin->si_compsylmax = compsylmax;
- }
-
- if (compoptions != 0) {
- aff_check_number(spin->si_compoptions, compoptions, "COMPOUND options");
- spin->si_compoptions |= compoptions;
- }
-
- if (compflags != NULL)
- process_compflags(spin, aff, compflags);
-
- // Check that we didn't use too many renumbered flags.
- if (spin->si_newcompID < spin->si_newprefID) {
- if (spin->si_newcompID == 127 || spin->si_newcompID == 255)
- MSG(_("Too many postponed prefixes"));
- else if (spin->si_newprefID == 0 || spin->si_newprefID == 127)
- MSG(_("Too many compound flags"));
- else
- MSG(_("Too many postponed prefixes and/or compound flags"));
- }
-
- if (syllable != NULL) {
- aff_check_string(spin->si_syllable, syllable, "SYLLABLE");
- spin->si_syllable = syllable;
- }
-
- if (sofofrom != NULL || sofoto != NULL) {
- if (sofofrom == NULL || sofoto == NULL)
- smsg(_("Missing SOFO%s line in %s"),
- sofofrom == NULL ? "FROM" : "TO", fname);
- else if (!GA_EMPTY(&spin->si_sal))
- smsg(_("Both SAL and SOFO lines in %s"), fname);
- else {
- aff_check_string(spin->si_sofofr, sofofrom, "SOFOFROM");
- aff_check_string(spin->si_sofoto, sofoto, "SOFOTO");
- spin->si_sofofr = sofofrom;
- spin->si_sofoto = sofoto;
- }
- }
-
- if (midword != NULL) {
- aff_check_string(spin->si_midword, midword, "MIDWORD");
- spin->si_midword = midword;
- }
-
- xfree(pc);
- fclose(fd);
- return aff;
-}
-
-// Returns true when items[0] equals "rulename", there are "mincount" items or
-// a comment is following after item "mincount".
-static bool is_aff_rule(char_u **items, int itemcnt, char *rulename, int mincount)
-{
- return STRCMP(items[0], rulename) == 0
- && (itemcnt == mincount
- || (itemcnt > mincount && items[mincount][0] == '#'));
-}
-
-// For affix "entry" move COMPOUNDFORBIDFLAG and COMPOUNDPERMITFLAG from
-// ae_flags to ae_comppermit and ae_compforbid.
-static void aff_process_flags(afffile_T *affile, affentry_T *entry)
-{
- char_u *p;
- char_u *prevp;
- unsigned flag;
-
- if (entry->ae_flags != NULL
- && (affile->af_compforbid != 0 || affile->af_comppermit != 0)) {
- for (p = entry->ae_flags; *p != NUL; ) {
- prevp = p;
- flag = get_affitem(affile->af_flagtype, &p);
- if (flag == affile->af_comppermit || flag == affile->af_compforbid) {
- STRMOVE(prevp, p);
- p = prevp;
- if (flag == affile->af_comppermit)
- entry->ae_comppermit = true;
- else
- entry->ae_compforbid = true;
- }
- if (affile->af_flagtype == AFT_NUM && *p == ',')
- ++p;
- }
- if (*entry->ae_flags == NUL)
- entry->ae_flags = NULL; // nothing left
- }
-}
-
-// Returns true if "s" is the name of an info item in the affix file.
-static bool spell_info_item(char_u *s)
-{
- return STRCMP(s, "NAME") == 0
- || STRCMP(s, "HOME") == 0
- || STRCMP(s, "VERSION") == 0
- || STRCMP(s, "AUTHOR") == 0
- || STRCMP(s, "EMAIL") == 0
- || STRCMP(s, "COPYRIGHT") == 0;
-}
-
-// Turn an affix flag name into a number, according to the FLAG type.
-// returns zero for failure.
-static unsigned affitem2flag(int flagtype, char_u *item, char_u *fname, int lnum)
-{
- unsigned res;
- char_u *p = item;
-
- res = get_affitem(flagtype, &p);
- if (res == 0) {
- if (flagtype == AFT_NUM)
- smsg(_("Flag is not a number in %s line %d: %s"),
- fname, lnum, item);
- else
- smsg(_("Illegal flag in %s line %d: %s"),
- fname, lnum, item);
- }
- if (*p != NUL) {
- smsg(_(e_affname), fname, lnum, item);
- return 0;
- }
-
- return res;
-}
-
-// Get one affix name from "*pp" and advance the pointer.
-// Returns zero for an error, still advances the pointer then.
-static unsigned get_affitem(int flagtype, char_u **pp)
-{
- int res;
-
- if (flagtype == AFT_NUM) {
- if (!ascii_isdigit(**pp)) {
- ++*pp; // always advance, avoid getting stuck
- return 0;
- }
- res = getdigits_int(pp);
- } else {
- res = mb_ptr2char_adv(pp);
- if (flagtype == AFT_LONG || (flagtype == AFT_CAPLONG
- && res >= 'A' && res <= 'Z')) {
- if (**pp == NUL)
- return 0;
- res = mb_ptr2char_adv(pp) + (res << 16);
- }
- }
- return res;
-}
-
-// Process the "compflags" string used in an affix file and append it to
-// spin->si_compflags.
-// The processing involves changing the affix names to ID numbers, so that
-// they fit in one byte.
-static void process_compflags(spellinfo_T *spin, afffile_T *aff, char_u *compflags)
-{
- char_u *p;
- char_u *prevp;
- unsigned flag;
- compitem_T *ci;
- int id;
- int len;
- char_u *tp;
- char_u key[AH_KEY_LEN];
- hashitem_T *hi;
-
- // Make room for the old and the new compflags, concatenated with a / in
- // between. Processing it makes it shorter, but we don't know by how
- // much, thus allocate the maximum.
- len = (int)STRLEN(compflags) + 1;
- if (spin->si_compflags != NULL)
- len += (int)STRLEN(spin->si_compflags) + 1;
- p = getroom(spin, len, false);
- if (spin->si_compflags != NULL) {
- STRCPY(p, spin->si_compflags);
- STRCAT(p, "/");
- }
- spin->si_compflags = p;
- tp = p + STRLEN(p);
-
- for (p = compflags; *p != NUL; ) {
- if (vim_strchr((char_u *)"/?*+[]", *p) != NULL)
- // Copy non-flag characters directly.
- *tp++ = *p++;
- else {
- // First get the flag number, also checks validity.
- prevp = p;
- flag = get_affitem(aff->af_flagtype, &p);
- if (flag != 0) {
- // Find the flag in the hashtable. If it was used before, use
- // the existing ID. Otherwise add a new entry.
- STRLCPY(key, prevp, p - prevp + 1);
- hi = hash_find(&aff->af_comp, key);
- if (!HASHITEM_EMPTY(hi))
- id = HI2CI(hi)->ci_newID;
- else {
- ci = (compitem_T *)getroom(spin, sizeof(compitem_T), true);
- if (ci == NULL)
- break;
- STRCPY(ci->ci_key, key);
- ci->ci_flag = flag;
- // Avoid using a flag ID that has a special meaning in a
- // regexp (also inside []).
- do {
- check_renumber(spin);
- id = spin->si_newcompID--;
- } while (vim_strchr((char_u *)"/?*+[]\\-^", id) != NULL);
- ci->ci_newID = id;
- hash_add(&aff->af_comp, ci->ci_key);
- }
- *tp++ = id;
- }
- if (aff->af_flagtype == AFT_NUM && *p == ',')
- ++p;
- }
- }
-
- *tp = NUL;
-}
-
-// Check that the new IDs for postponed affixes and compounding don't overrun
-// each other. We have almost 255 available, but start at 0-127 to avoid
-// using two bytes for utf-8. When the 0-127 range is used up go to 128-255.
-// When that is used up an error message is given.
-static void check_renumber(spellinfo_T *spin)
-{
- if (spin->si_newprefID == spin->si_newcompID && spin->si_newcompID < 128) {
- spin->si_newprefID = 127;
- spin->si_newcompID = 255;
- }
-}
-
-// Returns true if flag "flag" appears in affix list "afflist".
-static bool flag_in_afflist(int flagtype, char_u *afflist, unsigned flag)
-{
- char_u *p;
- unsigned n;
-
- switch (flagtype) {
- case AFT_CHAR:
- return vim_strchr(afflist, flag) != NULL;
-
- case AFT_CAPLONG:
- case AFT_LONG:
- for (p = afflist; *p != NUL; ) {
- n = mb_ptr2char_adv(&p);
- if ((flagtype == AFT_LONG || (n >= 'A' && n <= 'Z'))
- && *p != NUL)
- n = mb_ptr2char_adv(&p) + (n << 16);
- if (n == flag)
- return true;
- }
- break;
-
- case AFT_NUM:
- for (p = afflist; *p != NUL; ) {
- int digits = getdigits_int(&p);
- assert(digits >= 0);
- n = (unsigned int)digits;
- if (n == flag)
- return true;
- if (*p != NUL) // skip over comma
- ++p;
- }
- break;
- }
- return false;
-}
-
-// Give a warning when "spinval" and "affval" numbers are set and not the same.
-static void aff_check_number(int spinval, int affval, char *name)
-{
- if (spinval != 0 && spinval != affval)
- smsg(_("%s value differs from what is used in another .aff file"),
- name);
-}
-
-// Give a warning when "spinval" and "affval" strings are set and not the same.
-static void aff_check_string(char_u *spinval, char_u *affval, char *name)
-{
- if (spinval != NULL && STRCMP(spinval, affval) != 0)
- smsg(_("%s value differs from what is used in another .aff file"),
- name);
-}
-
-// Returns true if strings "s1" and "s2" are equal. Also consider both being
-// NULL as equal.
-static bool str_equal(char_u *s1, char_u *s2)
-{
- if (s1 == NULL || s2 == NULL)
- return s1 == s2;
- return STRCMP(s1, s2) == 0;
-}
-
-// Add a from-to item to "gap". Used for REP and SAL items.
-// They are stored case-folded.
-static void add_fromto(spellinfo_T *spin, garray_T *gap, char_u *from, char_u *to)
-{
- char_u word[MAXWLEN];
-
- fromto_T *ftp = GA_APPEND_VIA_PTR(fromto_T, gap);
- (void)spell_casefold(from, (int)STRLEN(from), word, MAXWLEN);
- ftp->ft_from = getroom_save(spin, word);
- (void)spell_casefold(to, (int)STRLEN(to), word, MAXWLEN);
- ftp->ft_to = getroom_save(spin, word);
-}
-
-// Converts a boolean argument in a SAL line to true or false;
-static bool sal_to_bool(char_u *s)
-{
- return STRCMP(s, "1") == 0 || STRCMP(s, "true") == 0;
-}
-
-// Free the structure filled by spell_read_aff().
-static void spell_free_aff(afffile_T *aff)
-{
- hashtab_T *ht;
- hashitem_T *hi;
- int todo;
- affheader_T *ah;
- affentry_T *ae;
-
- xfree(aff->af_enc);
-
- // All this trouble to free the "ae_prog" items...
- for (ht = &aff->af_pref;; ht = &aff->af_suff) {
- todo = (int)ht->ht_used;
- for (hi = ht->ht_array; todo > 0; ++hi) {
- if (!HASHITEM_EMPTY(hi)) {
- --todo;
- ah = HI2AH(hi);
- for (ae = ah->ah_first; ae != NULL; ae = ae->ae_next)
- vim_regfree(ae->ae_prog);
- }
- }
- if (ht == &aff->af_suff)
- break;
- }
-
- hash_clear(&aff->af_pref);
- hash_clear(&aff->af_suff);
- hash_clear(&aff->af_comp);
-}
-
-// Read dictionary file "fname".
-// Returns OK or FAIL;
-static int spell_read_dic(spellinfo_T *spin, char_u *fname, afffile_T *affile)
-{
- hashtab_T ht;
- char_u line[MAXLINELEN];
- char_u *p;
- char_u *afflist;
- char_u store_afflist[MAXWLEN];
- int pfxlen;
- bool need_affix;
- char_u *dw;
- char_u *pc;
- char_u *w;
- int l;
- hash_T hash;
- hashitem_T *hi;
- FILE *fd;
- int lnum = 1;
- int non_ascii = 0;
- int retval = OK;
- char_u message[MAXLINELEN + MAXWLEN];
- int flags;
- int duplicate = 0;
-
- // Open the file.
- fd = mch_fopen((char *)fname, "r");
- if (fd == NULL) {
- EMSG2(_(e_notopen), fname);
- return FAIL;
- }
-
- // The hashtable is only used to detect duplicated words.
- hash_init(&ht);
-
- vim_snprintf((char *)IObuff, IOSIZE,
- _("Reading dictionary file %s ..."), fname);
- spell_message(spin, IObuff);
-
- // start with a message for the first line
- spin->si_msg_count = 999999;
-
- // Read and ignore the first line: word count.
- (void)vim_fgets(line, MAXLINELEN, fd);
- if (!ascii_isdigit(*skipwhite(line)))
- EMSG2(_("E760: No word count in %s"), fname);
-
- // Read all the lines in the file one by one.
- // The words are converted to 'encoding' here, before being added to
- // the hashtable.
- while (!vim_fgets(line, MAXLINELEN, fd) && !got_int) {
- line_breakcheck();
- ++lnum;
- if (line[0] == '#' || line[0] == '/')
- continue; // comment line
-
- // Remove CR, LF and white space from the end. White space halfway through
- // the word is kept to allow multi-word terms like "et al.".
- l = (int)STRLEN(line);
- while (l > 0 && line[l - 1] <= ' ')
- --l;
- if (l == 0)
- continue; // empty line
- line[l] = NUL;
-
- // Convert from "SET" to 'encoding' when needed.
- if (spin->si_conv.vc_type != CONV_NONE) {
- pc = string_convert(&spin->si_conv, line, NULL);
- if (pc == NULL) {
- smsg(_("Conversion failure for word in %s line %d: %s"),
- fname, lnum, line);
- continue;
- }
- w = pc;
- } else {
- pc = NULL;
- w = line;
- }
-
- // Truncate the word at the "/", set "afflist" to what follows.
- // Replace "\/" by "/" and "\\" by "\".
- afflist = NULL;
- for (p = w; *p != NUL; mb_ptr_adv(p)) {
- if (*p == '\\' && (p[1] == '\\' || p[1] == '/'))
- STRMOVE(p, p + 1);
- else if (*p == '/') {
- *p = NUL;
- afflist = p + 1;
- break;
- }
- }
-
- // Skip non-ASCII words when "spin->si_ascii" is true.
- if (spin->si_ascii && has_non_ascii(w)) {
- ++non_ascii;
- xfree(pc);
- continue;
- }
-
- // This takes time, print a message every 10000 words.
- if (spin->si_verbose && spin->si_msg_count > 10000) {
- spin->si_msg_count = 0;
- vim_snprintf((char *)message, sizeof(message),
- _("line %6d, word %6d - %s"),
- lnum, spin->si_foldwcount + spin->si_keepwcount, w);
- msg_start();
- msg_puts_long_attr(message, 0);
- msg_clr_eos();
- msg_didout = FALSE;
- msg_col = 0;
- ui_flush();
- }
-
- // Store the word in the hashtable to be able to find duplicates.
- dw = getroom_save(spin, w);
- if (dw == NULL) {
- retval = FAIL;
- xfree(pc);
- break;
- }
-
- hash = hash_hash(dw);
- hi = hash_lookup(&ht, dw, hash);
- if (!HASHITEM_EMPTY(hi)) {
- if (p_verbose > 0)
- smsg(_("Duplicate word in %s line %d: %s"),
- fname, lnum, dw);
- else if (duplicate == 0)
- smsg(_("First duplicate word in %s line %d: %s"),
- fname, lnum, dw);
- ++duplicate;
- } else
- hash_add_item(&ht, hi, dw, hash);
-
- flags = 0;
- store_afflist[0] = NUL;
- pfxlen = 0;
- need_affix = false;
- if (afflist != NULL) {
- // Extract flags from the affix list.
- flags |= get_affix_flags(affile, afflist);
-
- if (affile->af_needaffix != 0 && flag_in_afflist(
- affile->af_flagtype, afflist, affile->af_needaffix))
- need_affix = true;
-
- if (affile->af_pfxpostpone)
- // Need to store the list of prefix IDs with the word.
- pfxlen = get_pfxlist(affile, afflist, store_afflist);
-
- if (spin->si_compflags != NULL)
- // Need to store the list of compound flags with the word.
- // Concatenate them to the list of prefix IDs.
- get_compflags(affile, afflist, store_afflist + pfxlen);
- }
-
- // Add the word to the word tree(s).
- if (store_word(spin, dw, flags, spin->si_region,
- store_afflist, need_affix) == FAIL)
- retval = FAIL;
-
- if (afflist != NULL) {
- // Find all matching suffixes and add the resulting words.
- // Additionally do matching prefixes that combine.
- if (store_aff_word(spin, dw, afflist, affile,
- &affile->af_suff, &affile->af_pref,
- CONDIT_SUF, flags, store_afflist, pfxlen) == FAIL)
- retval = FAIL;
-
- // Find all matching prefixes and add the resulting words.
- if (store_aff_word(spin, dw, afflist, affile,
- &affile->af_pref, NULL,
- CONDIT_SUF, flags, store_afflist, pfxlen) == FAIL)
- retval = FAIL;
- }
-
- xfree(pc);
- }
-
- if (duplicate > 0)
- smsg(_("%d duplicate word(s) in %s"), duplicate, fname);
- if (spin->si_ascii && non_ascii > 0)
- smsg(_("Ignored %d word(s) with non-ASCII characters in %s"),
- non_ascii, fname);
- hash_clear(&ht);
-
- fclose(fd);
- return retval;
-}
-
-// Check for affix flags in "afflist" that are turned into word flags.
-// Return WF_ flags.
-static int get_affix_flags(afffile_T *affile, char_u *afflist)
-{
- int flags = 0;
-
- if (affile->af_keepcase != 0 && flag_in_afflist(
- affile->af_flagtype, afflist, affile->af_keepcase))
- flags |= WF_KEEPCAP | WF_FIXCAP;
- if (affile->af_rare != 0 && flag_in_afflist(
- affile->af_flagtype, afflist, affile->af_rare))
- flags |= WF_RARE;
- if (affile->af_bad != 0 && flag_in_afflist(
- affile->af_flagtype, afflist, affile->af_bad))
- flags |= WF_BANNED;
- if (affile->af_needcomp != 0 && flag_in_afflist(
- affile->af_flagtype, afflist, affile->af_needcomp))
- flags |= WF_NEEDCOMP;
- if (affile->af_comproot != 0 && flag_in_afflist(
- affile->af_flagtype, afflist, affile->af_comproot))
- flags |= WF_COMPROOT;
- if (affile->af_nosuggest != 0 && flag_in_afflist(
- affile->af_flagtype, afflist, affile->af_nosuggest))
- flags |= WF_NOSUGGEST;
- return flags;
-}
-
-// Get the list of prefix IDs from the affix list "afflist".
-// Used for PFXPOSTPONE.
-// Put the resulting flags in "store_afflist[MAXWLEN]" with a terminating NUL
-// and return the number of affixes.
-static int get_pfxlist(afffile_T *affile, char_u *afflist, char_u *store_afflist)
-{
- char_u *p;
- char_u *prevp;
- int cnt = 0;
- int id;
- char_u key[AH_KEY_LEN];
- hashitem_T *hi;
-
- for (p = afflist; *p != NUL; ) {
- prevp = p;
- if (get_affitem(affile->af_flagtype, &p) != 0) {
- // A flag is a postponed prefix flag if it appears in "af_pref"
- // and it's ID is not zero.
- STRLCPY(key, prevp, p - prevp + 1);
- hi = hash_find(&affile->af_pref, key);
- if (!HASHITEM_EMPTY(hi)) {
- id = HI2AH(hi)->ah_newID;
- if (id != 0)
- store_afflist[cnt++] = id;
- }
- }
- if (affile->af_flagtype == AFT_NUM && *p == ',')
- ++p;
- }
-
- store_afflist[cnt] = NUL;
- return cnt;
-}
-
-// Get the list of compound IDs from the affix list "afflist" that are used
-// for compound words.
-// Puts the flags in "store_afflist[]".
-static void get_compflags(afffile_T *affile, char_u *afflist, char_u *store_afflist)
-{
- char_u *p;
- char_u *prevp;
- int cnt = 0;
- char_u key[AH_KEY_LEN];
- hashitem_T *hi;
-
- for (p = afflist; *p != NUL; ) {
- prevp = p;
- if (get_affitem(affile->af_flagtype, &p) != 0) {
- // A flag is a compound flag if it appears in "af_comp".
- STRLCPY(key, prevp, p - prevp + 1);
- hi = hash_find(&affile->af_comp, key);
- if (!HASHITEM_EMPTY(hi))
- store_afflist[cnt++] = HI2CI(hi)->ci_newID;
- }
- if (affile->af_flagtype == AFT_NUM && *p == ',')
- ++p;
- }
-
- store_afflist[cnt] = NUL;
-}
-
-// Apply affixes to a word and store the resulting words.
-// "ht" is the hashtable with affentry_T that need to be applied, either
-// prefixes or suffixes.
-// "xht", when not NULL, is the prefix hashtable, to be used additionally on
-// the resulting words for combining affixes.
-//
-// Returns FAIL when out of memory.
-static int
-store_aff_word (
- spellinfo_T *spin, // spell info
- char_u *word, // basic word start
- char_u *afflist, // list of names of supported affixes
- afffile_T *affile,
- hashtab_T *ht,
- hashtab_T *xht,
- int condit, // CONDIT_SUF et al.
- int flags, // flags for the word
- char_u *pfxlist, // list of prefix IDs
- int pfxlen // nr of flags in "pfxlist" for prefixes, rest
- // is compound flags
-)
-{
- int todo;
- hashitem_T *hi;
- affheader_T *ah;
- affentry_T *ae;
- char_u newword[MAXWLEN];
- int retval = OK;
- int i, j;
- char_u *p;
- int use_flags;
- char_u *use_pfxlist;
- int use_pfxlen;
- bool need_affix;
- char_u store_afflist[MAXWLEN];
- char_u pfx_pfxlist[MAXWLEN];
- size_t wordlen = STRLEN(word);
- int use_condit;
-
- todo = (int)ht->ht_used;
- for (hi = ht->ht_array; todo > 0 && retval == OK; ++hi) {
- if (!HASHITEM_EMPTY(hi)) {
- --todo;
- ah = HI2AH(hi);
-
- // Check that the affix combines, if required, and that the word
- // supports this affix.
- if (((condit & CONDIT_COMB) == 0 || ah->ah_combine)
- && flag_in_afflist(affile->af_flagtype, afflist,
- ah->ah_flag)) {
- // Loop over all affix entries with this name.
- for (ae = ah->ah_first; ae != NULL; ae = ae->ae_next) {
- // Check the condition. It's not logical to match case
- // here, but it is required for compatibility with
- // Myspell.
- // Another requirement from Myspell is that the chop
- // string is shorter than the word itself.
- // For prefixes, when "PFXPOSTPONE" was used, only do
- // prefixes with a chop string and/or flags.
- // When a previously added affix had CIRCUMFIX this one
- // must have it too, if it had not then this one must not
- // have one either.
- if ((xht != NULL || !affile->af_pfxpostpone
- || ae->ae_chop != NULL
- || ae->ae_flags != NULL)
- && (ae->ae_chop == NULL
- || STRLEN(ae->ae_chop) < wordlen)
- && (ae->ae_prog == NULL
- || vim_regexec_prog(&ae->ae_prog, false, word, (colnr_T)0))
- && (((condit & CONDIT_CFIX) == 0)
- == ((condit & CONDIT_AFF) == 0
- || ae->ae_flags == NULL
- || !flag_in_afflist(affile->af_flagtype,
- ae->ae_flags, affile->af_circumfix)))) {
- // Match. Remove the chop and add the affix.
- if (xht == NULL) {
- // prefix: chop/add at the start of the word
- if (ae->ae_add == NULL)
- *newword = NUL;
- else
- STRLCPY(newword, ae->ae_add, MAXWLEN);
- p = word;
- if (ae->ae_chop != NULL) {
- // Skip chop string.
- if (has_mbyte) {
- i = mb_charlen(ae->ae_chop);
- for (; i > 0; --i)
- mb_ptr_adv(p);
- } else
- p += STRLEN(ae->ae_chop);
- }
- STRCAT(newword, p);
- } else {
- // suffix: chop/add at the end of the word
- STRLCPY(newword, word, MAXWLEN);
- if (ae->ae_chop != NULL) {
- // Remove chop string.
- p = newword + STRLEN(newword);
- i = (int)MB_CHARLEN(ae->ae_chop);
- for (; i > 0; --i)
- mb_ptr_back(newword, p);
- *p = NUL;
- }
- if (ae->ae_add != NULL)
- STRCAT(newword, ae->ae_add);
- }
-
- use_flags = flags;
- use_pfxlist = pfxlist;
- use_pfxlen = pfxlen;
- need_affix = false;
- use_condit = condit | CONDIT_COMB | CONDIT_AFF;
- if (ae->ae_flags != NULL) {
- // Extract flags from the affix list.
- use_flags |= get_affix_flags(affile, ae->ae_flags);
-
- if (affile->af_needaffix != 0 && flag_in_afflist(
- affile->af_flagtype, ae->ae_flags,
- affile->af_needaffix))
- need_affix = true;
-
- // When there is a CIRCUMFIX flag the other affix
- // must also have it and we don't add the word
- // with one affix.
- if (affile->af_circumfix != 0 && flag_in_afflist(
- affile->af_flagtype, ae->ae_flags,
- affile->af_circumfix)) {
- use_condit |= CONDIT_CFIX;
- if ((condit & CONDIT_CFIX) == 0)
- need_affix = true;
- }
-
- if (affile->af_pfxpostpone
- || spin->si_compflags != NULL) {
- if (affile->af_pfxpostpone)
- // Get prefix IDS from the affix list.
- use_pfxlen = get_pfxlist(affile,
- ae->ae_flags, store_afflist);
- else
- use_pfxlen = 0;
- use_pfxlist = store_afflist;
-
- // Combine the prefix IDs. Avoid adding the
- // same ID twice.
- for (i = 0; i < pfxlen; ++i) {
- for (j = 0; j < use_pfxlen; ++j)
- if (pfxlist[i] == use_pfxlist[j])
- break;
- if (j == use_pfxlen)
- use_pfxlist[use_pfxlen++] = pfxlist[i];
- }
-
- if (spin->si_compflags != NULL)
- // Get compound IDS from the affix list.
- get_compflags(affile, ae->ae_flags,
- use_pfxlist + use_pfxlen);
- else
- use_pfxlist[use_pfxlen] = NUL;
-
- // Combine the list of compound flags.
- // Concatenate them to the prefix IDs list.
- // Avoid adding the same ID twice.
- for (i = pfxlen; pfxlist[i] != NUL; ++i) {
- for (j = use_pfxlen;
- use_pfxlist[j] != NUL; ++j)
- if (pfxlist[i] == use_pfxlist[j])
- break;
- if (use_pfxlist[j] == NUL) {
- use_pfxlist[j++] = pfxlist[i];
- use_pfxlist[j] = NUL;
- }
- }
- }
- }
-
- // Obey a "COMPOUNDFORBIDFLAG" of the affix: don't
- // use the compound flags.
- if (use_pfxlist != NULL && ae->ae_compforbid) {
- STRLCPY(pfx_pfxlist, use_pfxlist, use_pfxlen + 1);
- use_pfxlist = pfx_pfxlist;
- }
-
- // When there are postponed prefixes...
- if (spin->si_prefroot != NULL
- && spin->si_prefroot->wn_sibling != NULL) {
- // ... add a flag to indicate an affix was used.
- use_flags |= WF_HAS_AFF;
-
- // ... don't use a prefix list if combining
- // affixes is not allowed. But do use the
- // compound flags after them.
- if (!ah->ah_combine && use_pfxlist != NULL)
- use_pfxlist += use_pfxlen;
- }
-
- // When compounding is supported and there is no
- // "COMPOUNDPERMITFLAG" then forbid compounding on the
- // side where the affix is applied.
- if (spin->si_compflags != NULL && !ae->ae_comppermit) {
- if (xht != NULL)
- use_flags |= WF_NOCOMPAFT;
- else
- use_flags |= WF_NOCOMPBEF;
- }
-
- // Store the modified word.
- if (store_word(spin, newword, use_flags,
- spin->si_region, use_pfxlist,
- need_affix) == FAIL)
- retval = FAIL;
-
- // When added a prefix or a first suffix and the affix
- // has flags may add a(nother) suffix. RECURSIVE!
- if ((condit & CONDIT_SUF) && ae->ae_flags != NULL)
- if (store_aff_word(spin, newword, ae->ae_flags,
- affile, &affile->af_suff, xht,
- use_condit & (xht == NULL
- ? ~0 : ~CONDIT_SUF),
- use_flags, use_pfxlist, pfxlen) == FAIL)
- retval = FAIL;
-
- // When added a suffix and combining is allowed also
- // try adding a prefix additionally. Both for the
- // word flags and for the affix flags. RECURSIVE!
- if (xht != NULL && ah->ah_combine) {
- if (store_aff_word(spin, newword,
- afflist, affile,
- xht, NULL, use_condit,
- use_flags, use_pfxlist,
- pfxlen) == FAIL
- || (ae->ae_flags != NULL
- && store_aff_word(spin, newword,
- ae->ae_flags, affile,
- xht, NULL, use_condit,
- use_flags, use_pfxlist,
- pfxlen) == FAIL))
- retval = FAIL;
- }
- }
- }
- }
- }
- }
-
- return retval;
-}
-
-// Read a file with a list of words.
-static int spell_read_wordfile(spellinfo_T *spin, char_u *fname)
-{
- FILE *fd;
- long lnum = 0;
- char_u rline[MAXLINELEN];
- char_u *line;
- char_u *pc = NULL;
- char_u *p;
- int l;
- int retval = OK;
- bool did_word = false;
- int non_ascii = 0;
- int flags;
- int regionmask;
-
- // Open the file.
- fd = mch_fopen((char *)fname, "r");
- if (fd == NULL) {
- EMSG2(_(e_notopen), fname);
- return FAIL;
- }
-
- vim_snprintf((char *)IObuff, IOSIZE, _("Reading word file %s ..."), fname);
- spell_message(spin, IObuff);
-
- // Read all the lines in the file one by one.
- while (!vim_fgets(rline, MAXLINELEN, fd) && !got_int) {
- line_breakcheck();
- ++lnum;
-
- // Skip comment lines.
- if (*rline == '#')
- continue;
-
- // Remove CR, LF and white space from the end.
- l = (int)STRLEN(rline);
- while (l > 0 && rline[l - 1] <= ' ')
- --l;
- if (l == 0)
- continue; // empty or blank line
- rline[l] = NUL;
-
- // Convert from "/encoding={encoding}" to 'encoding' when needed.
- xfree(pc);
- if (spin->si_conv.vc_type != CONV_NONE) {
- pc = string_convert(&spin->si_conv, rline, NULL);
- if (pc == NULL) {
- smsg(_("Conversion failure for word in %s line %d: %s"),
- fname, lnum, rline);
- continue;
- }
- line = pc;
- } else {
- pc = NULL;
- line = rline;
- }
-
- if (*line == '/') {
- ++line;
- if (STRNCMP(line, "encoding=", 9) == 0) {
- if (spin->si_conv.vc_type != CONV_NONE)
- smsg(_("Duplicate /encoding= line ignored in %s line %d: %s"),
- fname, lnum, line - 1);
- else if (did_word)
- smsg(_("/encoding= line after word ignored in %s line %d: %s"),
- fname, lnum, line - 1);
- else {
- char_u *enc;
-
- // Setup for conversion to 'encoding'.
- line += 9;
- enc = enc_canonize(line);
- if (!spin->si_ascii
- && convert_setup(&spin->si_conv, enc,
- p_enc) == FAIL)
- smsg(_("Conversion in %s not supported: from %s to %s"),
- fname, line, p_enc);
- xfree(enc);
- spin->si_conv.vc_fail = true;
- }
- continue;
- }
-
- if (STRNCMP(line, "regions=", 8) == 0) {
- if (spin->si_region_count > 1)
- smsg(_("Duplicate /regions= line ignored in %s line %d: %s"),
- fname, lnum, line);
- else {
- line += 8;
- if (STRLEN(line) > 16)
- smsg(_("Too many regions in %s line %d: %s"),
- fname, lnum, line);
- else {
- spin->si_region_count = (int)STRLEN(line) / 2;
- STRCPY(spin->si_region_name, line);
-
- // Adjust the mask for a word valid in all regions.
- spin->si_region = (1 << spin->si_region_count) - 1;
- }
- }
- continue;
- }
-
- smsg(_("/ line ignored in %s line %d: %s"),
- fname, lnum, line - 1);
- continue;
- }
-
- flags = 0;
- regionmask = spin->si_region;
-
- // Check for flags and region after a slash.
- p = vim_strchr(line, '/');
- if (p != NULL) {
- *p++ = NUL;
- while (*p != NUL) {
- if (*p == '=') // keep-case word
- flags |= WF_KEEPCAP | WF_FIXCAP;
- else if (*p == '!') // Bad, bad, wicked word.
- flags |= WF_BANNED;
- else if (*p == '?') // Rare word.
- flags |= WF_RARE;
- else if (ascii_isdigit(*p)) { // region number(s)
- if ((flags & WF_REGION) == 0) // first one
- regionmask = 0;
- flags |= WF_REGION;
-
- l = *p - '0';
- if (l > spin->si_region_count) {
- smsg(_("Invalid region nr in %s line %d: %s"),
- fname, lnum, p);
- break;
- }
- regionmask |= 1 << (l - 1);
- } else {
- smsg(_("Unrecognized flags in %s line %d: %s"),
- fname, lnum, p);
- break;
- }
- ++p;
- }
- }
-
- // Skip non-ASCII words when "spin->si_ascii" is true.
- if (spin->si_ascii && has_non_ascii(line)) {
- ++non_ascii;
- continue;
- }
-
- // Normal word: store it.
- if (store_word(spin, line, flags, regionmask, NULL, false) == FAIL) {
- retval = FAIL;
- break;
- }
- did_word = true;
- }
-
- xfree(pc);
- fclose(fd);
-
- if (spin->si_ascii && non_ascii > 0) {
- vim_snprintf((char *)IObuff, IOSIZE,
- _("Ignored %d words with non-ASCII characters"), non_ascii);
- spell_message(spin, IObuff);
- }
-
- return retval;
-}
-
-/// Get part of an sblock_T, "len" bytes long.
-/// This avoids calling free() for every little struct we use (and keeping
-/// track of them).
-/// The memory is cleared to all zeros.
-///
-/// @param len Length needed (<= SBLOCKSIZE).
-/// @param align Align for pointer.
-/// @return Pointer into block data.
-static void *getroom(spellinfo_T *spin, size_t len, bool align)
- FUNC_ATTR_NONNULL_RET
-{
- char_u *p;
- sblock_T *bl = spin->si_blocks;
-
- assert(len <= SBLOCKSIZE);
-
- if (align && bl != NULL)
- // Round size up for alignment. On some systems structures need to be
- // aligned to the size of a pointer (e.g., SPARC).
- bl->sb_used = (bl->sb_used + sizeof(char *) - 1)
- & ~(sizeof(char *) - 1);
-
- if (bl == NULL || bl->sb_used + len > SBLOCKSIZE) {
- // Allocate a block of memory. It is not freed until much later.
- bl = xcalloc(1, (sizeof(sblock_T) + SBLOCKSIZE));
- bl->sb_next = spin->si_blocks;
- spin->si_blocks = bl;
- bl->sb_used = 0;
- ++spin->si_blocks_cnt;
- }
-
- p = bl->sb_data + bl->sb_used;
- bl->sb_used += (int)len;
-
- return p;
-}
-
-// Make a copy of a string into memory allocated with getroom().
-// Returns NULL when out of memory.
-static char_u *getroom_save(spellinfo_T *spin, char_u *s)
-{
- char_u *sc;
-
- sc = (char_u *)getroom(spin, STRLEN(s) + 1, false);
- if (sc != NULL)
- STRCPY(sc, s);
- return sc;
-}
-
-
-// Free the list of allocated sblock_T.
-static void free_blocks(sblock_T *bl)
-{
- sblock_T *next;
-
- while (bl != NULL) {
- next = bl->sb_next;
- xfree(bl);
- bl = next;
- }
-}
-
-// Allocate the root of a word tree.
-// Returns NULL when out of memory.
-static wordnode_T *wordtree_alloc(spellinfo_T *spin)
-{
- return (wordnode_T *)getroom(spin, sizeof(wordnode_T), true);
-}
-
-// Store a word in the tree(s).
-// Always store it in the case-folded tree. For a keep-case word this is
-// useful when the word can also be used with all caps (no WF_FIXCAP flag) and
-// used to find suggestions.
-// For a keep-case word also store it in the keep-case tree.
-// When "pfxlist" is not NULL store the word for each postponed prefix ID and
-// compound flag.
-static int
-store_word (
- spellinfo_T *spin,
- char_u *word,
- int flags, // extra flags, WF_BANNED
- int region, // supported region(s)
- char_u *pfxlist, // list of prefix IDs or NULL
- bool need_affix // only store word with affix ID
-)
-{
- int len = (int)STRLEN(word);
- int ct = captype(word, word + len);
- char_u foldword[MAXWLEN];
- int res = OK;
- char_u *p;
-
- (void)spell_casefold(word, len, foldword, MAXWLEN);
- for (p = pfxlist; res == OK; ++p) {
- if (!need_affix || (p != NULL && *p != NUL))
- res = tree_add_word(spin, foldword, spin->si_foldroot, ct | flags,
- region, p == NULL ? 0 : *p);
- if (p == NULL || *p == NUL)
- break;
- }
- ++spin->si_foldwcount;
-
- if (res == OK && (ct == WF_KEEPCAP || (flags & WF_KEEPCAP))) {
- for (p = pfxlist; res == OK; ++p) {
- if (!need_affix || (p != NULL && *p != NUL))
- res = tree_add_word(spin, word, spin->si_keeproot, flags,
- region, p == NULL ? 0 : *p);
- if (p == NULL || *p == NUL)
- break;
- }
- ++spin->si_keepwcount;
- }
- return res;
-}
-
-// Add word "word" to a word tree at "root".
-// When "flags" < 0 we are adding to the prefix tree where "flags" is used for
-// "rare" and "region" is the condition nr.
-// Returns FAIL when out of memory.
-static int tree_add_word(spellinfo_T *spin, char_u *word, wordnode_T *root, int flags, int region, int affixID)
-{
- wordnode_T *node = root;
- wordnode_T *np;
- wordnode_T *copyp, **copyprev;
- wordnode_T **prev = NULL;
- int i;
-
- // Add each byte of the word to the tree, including the NUL at the end.
- for (i = 0;; ++i) {
- // When there is more than one reference to this node we need to make
- // a copy, so that we can modify it. Copy the whole list of siblings
- // (we don't optimize for a partly shared list of siblings).
- if (node != NULL && node->wn_refs > 1) {
- --node->wn_refs;
- copyprev = prev;
- for (copyp = node; copyp != NULL; copyp = copyp->wn_sibling) {
- // Allocate a new node and copy the info.
- np = get_wordnode(spin);
- if (np == NULL)
- return FAIL;
- np->wn_child = copyp->wn_child;
- if (np->wn_child != NULL)
- ++np->wn_child->wn_refs; // child gets extra ref
- np->wn_byte = copyp->wn_byte;
- if (np->wn_byte == NUL) {
- np->wn_flags = copyp->wn_flags;
- np->wn_region = copyp->wn_region;
- np->wn_affixID = copyp->wn_affixID;
- }
-
- // Link the new node in the list, there will be one ref.
- np->wn_refs = 1;
- if (copyprev != NULL)
- *copyprev = np;
- copyprev = &np->wn_sibling;
-
- // Let "node" point to the head of the copied list.
- if (copyp == node)
- node = np;
- }
- }
-
- // Look for the sibling that has the same character. They are sorted
- // on byte value, thus stop searching when a sibling is found with a
- // higher byte value. For zero bytes (end of word) the sorting is
- // done on flags and then on affixID.
- while (node != NULL
- && (node->wn_byte < word[i]
- || (node->wn_byte == NUL
- && (flags < 0
- ? node->wn_affixID < (unsigned)affixID
- : (node->wn_flags < (unsigned)(flags & WN_MASK)
- || (node->wn_flags == (flags & WN_MASK)
- && (spin->si_sugtree
- ? (node->wn_region & 0xffff) < region
- : node->wn_affixID
- < (unsigned)affixID))))))) {
- prev = &node->wn_sibling;
- node = *prev;
- }
- if (node == NULL
- || node->wn_byte != word[i]
- || (word[i] == NUL
- && (flags < 0
- || spin->si_sugtree
- || node->wn_flags != (flags & WN_MASK)
- || node->wn_affixID != affixID))) {
- // Allocate a new node.
- np = get_wordnode(spin);
- if (np == NULL)
- return FAIL;
- np->wn_byte = word[i];
-
- // If "node" is NULL this is a new child or the end of the sibling
- // list: ref count is one. Otherwise use ref count of sibling and
- // make ref count of sibling one (matters when inserting in front
- // of the list of siblings).
- if (node == NULL)
- np->wn_refs = 1;
- else {
- np->wn_refs = node->wn_refs;
- node->wn_refs = 1;
- }
- if (prev != NULL)
- *prev = np;
- np->wn_sibling = node;
- node = np;
- }
-
- if (word[i] == NUL) {
- node->wn_flags = flags;
- node->wn_region |= region;
- node->wn_affixID = affixID;
- break;
- }
- prev = &node->wn_child;
- node = *prev;
- }
-#ifdef SPELL_PRINTTREE
- smsg((char_u *)"Added \"%s\"", word);
- spell_print_tree(root->wn_sibling);
-#endif
-
- // count nr of words added since last message
- ++spin->si_msg_count;
-
- if (spin->si_compress_cnt > 1) {
- if (--spin->si_compress_cnt == 1)
- // Did enough words to lower the block count limit.
- spin->si_blocks_cnt += compress_inc;
- }
-
- // When we have allocated lots of memory we need to compress the word tree
- // to free up some room. But compression is slow, and we might actually
- // need that room, thus only compress in the following situations:
- // 1. When not compressed before (si_compress_cnt == 0): when using
- // "compress_start" blocks.
- // 2. When compressed before and used "compress_inc" blocks before
- // adding "compress_added" words (si_compress_cnt > 1).
- // 3. When compressed before, added "compress_added" words
- // (si_compress_cnt == 1) and the number of free nodes drops below the
- // maximum word length.
-#ifndef SPELL_COMPRESS_ALLWAYS
- if (spin->si_compress_cnt == 1 // NOLINT(readability/braces)
- ? spin->si_free_count < MAXWLEN
- : spin->si_blocks_cnt >= compress_start)
-#endif
- {
- // Decrement the block counter. The effect is that we compress again
- // when the freed up room has been used and another "compress_inc"
- // blocks have been allocated. Unless "compress_added" words have
- // been added, then the limit is put back again.
- spin->si_blocks_cnt -= compress_inc;
- spin->si_compress_cnt = compress_added;
-
- if (spin->si_verbose) {
- msg_start();
- msg_puts((char_u *)_(msg_compressing));
- msg_clr_eos();
- msg_didout = FALSE;
- msg_col = 0;
- ui_flush();
- }
-
- // Compress both trees. Either they both have many nodes, which makes
- // compression useful, or one of them is small, which means
- // compression goes fast. But when filling the soundfold word tree
- // there is no keep-case tree.
- wordtree_compress(spin, spin->si_foldroot);
- if (affixID >= 0)
- wordtree_compress(spin, spin->si_keeproot);
- }
-
- return OK;
-}
-
-// Check the 'mkspellmem' option. Return FAIL if it's wrong.
-// Sets "sps_flags".
-int spell_check_msm(void)
-{
- char_u *p = p_msm;
- long start = 0;
- long incr = 0;
- long added = 0;
-
- if (!ascii_isdigit(*p))
- return FAIL;
- // block count = (value * 1024) / SBLOCKSIZE (but avoid overflow)
- start = (getdigits_long(&p) * 10) / (SBLOCKSIZE / 102);
- if (*p != ',')
- return FAIL;
- ++p;
- if (!ascii_isdigit(*p))
- return FAIL;
- incr = (getdigits_long(&p) * 102) / (SBLOCKSIZE / 10);
- if (*p != ',')
- return FAIL;
- ++p;
- if (!ascii_isdigit(*p))
- return FAIL;
- added = getdigits_long(&p) * 1024;
- if (*p != NUL)
- return FAIL;
-
- if (start == 0 || incr == 0 || added == 0 || incr > start)
- return FAIL;
-
- compress_start = start;
- compress_inc = incr;
- compress_added = added;
- return OK;
-}
-
-// Get a wordnode_T, either from the list of previously freed nodes or
-// allocate a new one.
-// Returns NULL when out of memory.
-static wordnode_T *get_wordnode(spellinfo_T *spin)
-{
- wordnode_T *n;
-
- if (spin->si_first_free == NULL)
- n = (wordnode_T *)getroom(spin, sizeof(wordnode_T), true);
- else {
- n = spin->si_first_free;
- spin->si_first_free = n->wn_child;
- memset(n, 0, sizeof(wordnode_T));
- --spin->si_free_count;
- }
-#ifdef SPELL_PRINTTREE
- if (n != NULL)
- n->wn_nr = ++spin->si_wordnode_nr;
-#endif
- return n;
-}
-
-// Decrement the reference count on a node (which is the head of a list of
-// siblings). If the reference count becomes zero free the node and its
-// siblings.
-// Returns the number of nodes actually freed.
-static int deref_wordnode(spellinfo_T *spin, wordnode_T *node)
-{
- wordnode_T *np;
- int cnt = 0;
-
- if (--node->wn_refs == 0) {
- for (np = node; np != NULL; np = np->wn_sibling) {
- if (np->wn_child != NULL)
- cnt += deref_wordnode(spin, np->wn_child);
- free_wordnode(spin, np);
- ++cnt;
- }
- ++cnt; // length field
- }
- return cnt;
-}
-
-// Free a wordnode_T for re-use later.
-// Only the "wn_child" field becomes invalid.
-static void free_wordnode(spellinfo_T *spin, wordnode_T *n)
-{
- n->wn_child = spin->si_first_free;
- spin->si_first_free = n;
- ++spin->si_free_count;
-}
-
-// Compress a tree: find tails that are identical and can be shared.
-static void wordtree_compress(spellinfo_T *spin, wordnode_T *root)
-{
- hashtab_T ht;
- int n;
- int tot = 0;
- int perc;
-
- // Skip the root itself, it's not actually used. The first sibling is the
- // start of the tree.
- if (root->wn_sibling != NULL) {
- hash_init(&ht);
- n = node_compress(spin, root->wn_sibling, &ht, &tot);
-
-#ifndef SPELL_PRINTTREE
- if (spin->si_verbose || p_verbose > 2)
-#endif
- {
- if (tot > 1000000)
- perc = (tot - n) / (tot / 100);
- else if (tot == 0)
- perc = 0;
- else
- perc = (tot - n) * 100 / tot;
- vim_snprintf((char *)IObuff, IOSIZE,
- _("Compressed %d of %d nodes; %d (%d%%) remaining"),
- n, tot, tot - n, perc);
- spell_message(spin, IObuff);
- }
-#ifdef SPELL_PRINTTREE
- spell_print_tree(root->wn_sibling);
-#endif
- hash_clear(&ht);
- }
-}
-
-// Compress a node, its siblings and its children, depth first.
-// Returns the number of compressed nodes.
-static int
-node_compress (
- spellinfo_T *spin,
- wordnode_T *node,
- hashtab_T *ht,
- int *tot // total count of nodes before compressing,
- // incremented while going through the tree
-)
-{
- wordnode_T *np;
- wordnode_T *tp;
- wordnode_T *child;
- hash_T hash;
- hashitem_T *hi;
- int len = 0;
- unsigned nr, n;
- int compressed = 0;
-
- // Go through the list of siblings. Compress each child and then try
- // finding an identical child to replace it.
- // Note that with "child" we mean not just the node that is pointed to,
- // but the whole list of siblings of which the child node is the first.
- for (np = node; np != NULL && !got_int; np = np->wn_sibling) {
- ++len;
- if ((child = np->wn_child) != NULL) {
- // Compress the child first. This fills hashkey.
- compressed += node_compress(spin, child, ht, tot);
-
- // Try to find an identical child.
- hash = hash_hash(child->wn_u1.hashkey);
- hi = hash_lookup(ht, child->wn_u1.hashkey, hash);
- if (!HASHITEM_EMPTY(hi)) {
- // There are children we encountered before with a hash value
- // identical to the current child. Now check if there is one
- // that is really identical.
- for (tp = HI2WN(hi); tp != NULL; tp = tp->wn_u2.next)
- if (node_equal(child, tp)) {
- // Found one! Now use that child in place of the
- // current one. This means the current child and all
- // its siblings is unlinked from the tree.
- ++tp->wn_refs;
- compressed += deref_wordnode(spin, child);
- np->wn_child = tp;
- break;
- }
- if (tp == NULL) {
- // No other child with this hash value equals the child of
- // the node, add it to the linked list after the first
- // item.
- tp = HI2WN(hi);
- child->wn_u2.next = tp->wn_u2.next;
- tp->wn_u2.next = child;
- }
- } else
- // No other child has this hash value, add it to the
- // hashtable.
- hash_add_item(ht, hi, child->wn_u1.hashkey, hash);
- }
- }
- *tot += len + 1; // add one for the node that stores the length
-
- // Make a hash key for the node and its siblings, so that we can quickly
- // find a lookalike node. This must be done after compressing the sibling
- // list, otherwise the hash key would become invalid by the compression.
- node->wn_u1.hashkey[0] = len;
- nr = 0;
- for (np = node; np != NULL; np = np->wn_sibling) {
- if (np->wn_byte == NUL)
- // end node: use wn_flags, wn_region and wn_affixID
- n = np->wn_flags + (np->wn_region << 8) + (np->wn_affixID << 16);
- else
- // byte node: use the byte value and the child pointer
- n = (unsigned)(np->wn_byte + ((uintptr_t)np->wn_child << 8));
- nr = nr * 101 + n;
- }
-
- // Avoid NUL bytes, it terminates the hash key.
- n = nr & 0xff;
- node->wn_u1.hashkey[1] = n == 0 ? 1 : n;
- n = (nr >> 8) & 0xff;
- node->wn_u1.hashkey[2] = n == 0 ? 1 : n;
- n = (nr >> 16) & 0xff;
- node->wn_u1.hashkey[3] = n == 0 ? 1 : n;
- n = (nr >> 24) & 0xff;
- node->wn_u1.hashkey[4] = n == 0 ? 1 : n;
- node->wn_u1.hashkey[5] = NUL;
-
- // Check for CTRL-C pressed now and then.
- fast_breakcheck();
-
- return compressed;
-}
-
-// Returns true when two nodes have identical siblings and children.
-static bool node_equal(wordnode_T *n1, wordnode_T *n2)
-{
- wordnode_T *p1;
- wordnode_T *p2;
-
- for (p1 = n1, p2 = n2; p1 != NULL && p2 != NULL;
- p1 = p1->wn_sibling, p2 = p2->wn_sibling)
- if (p1->wn_byte != p2->wn_byte
- || (p1->wn_byte == NUL
- ? (p1->wn_flags != p2->wn_flags
- || p1->wn_region != p2->wn_region
- || p1->wn_affixID != p2->wn_affixID)
- : (p1->wn_child != p2->wn_child)))
- break;
-
- return p1 == NULL && p2 == NULL;
-}
-
-
-// Function given to qsort() to sort the REP items on "from" string.
-static int rep_compare(const void *s1, const void *s2)
-{
- fromto_T *p1 = (fromto_T *)s1;
- fromto_T *p2 = (fromto_T *)s2;
-
- return STRCMP(p1->ft_from, p2->ft_from);
-}
-
-// Write the Vim .spl file "fname".
-// Return OK/FAIL.
-static int write_vim_spell(spellinfo_T *spin, char_u *fname)
-{
- int retval = OK;
- int regionmask;
-
- FILE *fd = mch_fopen((char *)fname, "w");
- if (fd == NULL) {
- EMSG2(_(e_notopen), fname);
- return FAIL;
- }
-
- // <HEADER>: <fileID> <versionnr>
- // <fileID>
- size_t fwv = fwrite(VIMSPELLMAGIC, VIMSPELLMAGICL, 1, fd);
- if (fwv != (size_t)1)
- // Catch first write error, don't try writing more.
- goto theend;
-
- putc(VIMSPELLVERSION, fd); // <versionnr>
-
- // <SECTIONS>: <section> ... <sectionend>
-
- // SN_INFO: <infotext>
- if (spin->si_info != NULL) {
- putc(SN_INFO, fd); // <sectionID>
- putc(0, fd); // <sectionflags>
- size_t i = STRLEN(spin->si_info);
- put_bytes(fd, i, 4); // <sectionlen>
- fwv &= fwrite(spin->si_info, i, 1, fd); // <infotext>
- }
-
- // SN_REGION: <regionname> ...
- // Write the region names only if there is more than one.
- if (spin->si_region_count > 1) {
- putc(SN_REGION, fd); // <sectionID>
- putc(SNF_REQUIRED, fd); // <sectionflags>
- size_t l = (size_t)spin->si_region_count * 2;
- put_bytes(fd, l, 4); // <sectionlen>
- fwv &= fwrite(spin->si_region_name, l, 1, fd);
- // <regionname> ...
- regionmask = (1 << spin->si_region_count) - 1;
- } else
- regionmask = 0;
-
- // SN_CHARFLAGS: <charflagslen> <charflags> <folcharslen> <folchars>
- //
- // The table with character flags and the table for case folding.
- // This makes sure the same characters are recognized as word characters
- // when generating an when using a spell file.
- // Skip this for ASCII, the table may conflict with the one used for
- // 'encoding'.
- // Also skip this for an .add.spl file, the main spell file must contain
- // the table (avoids that it conflicts). File is shorter too.
- if (!spin->si_ascii && !spin->si_add) {
- char_u folchars[128 * 8];
- int flags;
-
- putc(SN_CHARFLAGS, fd); // <sectionID>
- putc(SNF_REQUIRED, fd); // <sectionflags>
-
- // Form the <folchars> string first, we need to know its length.
- size_t l = 0;
- for (size_t i = 128; i < 256; ++i) {
- if (has_mbyte)
- l += (size_t)mb_char2bytes(spelltab.st_fold[i], folchars + l);
- else
- folchars[l++] = spelltab.st_fold[i];
- }
- put_bytes(fd, 1 + 128 + 2 + l, 4); // <sectionlen>
-
- fputc(128, fd); // <charflagslen>
- for (size_t i = 128; i < 256; ++i) {
- flags = 0;
- if (spelltab.st_isw[i])
- flags |= CF_WORD;
- if (spelltab.st_isu[i])
- flags |= CF_UPPER;
- fputc(flags, fd); // <charflags>
- }
-
- put_bytes(fd, l, 2); // <folcharslen>
- fwv &= fwrite(folchars, l, 1, fd); // <folchars>
- }
-
- // SN_MIDWORD: <midword>
- if (spin->si_midword != NULL) {
- putc(SN_MIDWORD, fd); // <sectionID>
- putc(SNF_REQUIRED, fd); // <sectionflags>
-
- size_t i = STRLEN(spin->si_midword);
- put_bytes(fd, i, 4); // <sectionlen>
- fwv &= fwrite(spin->si_midword, i, 1, fd);
- // <midword>
- }
-
- // SN_PREFCOND: <prefcondcnt> <prefcond> ...
- if (!GA_EMPTY(&spin->si_prefcond)) {
- putc(SN_PREFCOND, fd); // <sectionID>
- putc(SNF_REQUIRED, fd); // <sectionflags>
-
- size_t l = (size_t)write_spell_prefcond(NULL, &spin->si_prefcond);
- put_bytes(fd, l, 4); // <sectionlen>
-
- write_spell_prefcond(fd, &spin->si_prefcond);
- }
-
- // SN_REP: <repcount> <rep> ...
- // SN_SAL: <salflags> <salcount> <sal> ...
- // SN_REPSAL: <repcount> <rep> ...
-
- // round 1: SN_REP section
- // round 2: SN_SAL section (unless SN_SOFO is used)
- // round 3: SN_REPSAL section
- for (unsigned int round = 1; round <= 3; ++round) {
- garray_T *gap;
- if (round == 1)
- gap = &spin->si_rep;
- else if (round == 2) {
- // Don't write SN_SAL when using a SN_SOFO section
- if (spin->si_sofofr != NULL && spin->si_sofoto != NULL)
- continue;
- gap = &spin->si_sal;
- } else
- gap = &spin->si_repsal;
-
- // Don't write the section if there are no items.
- if (GA_EMPTY(gap))
- continue;
-
- // Sort the REP/REPSAL items.
- if (round != 2)
- qsort(gap->ga_data, (size_t)gap->ga_len,
- sizeof(fromto_T), rep_compare);
-
- int i = round == 1 ? SN_REP : (round == 2 ? SN_SAL : SN_REPSAL);
- putc(i, fd); // <sectionID>
-
- // This is for making suggestions, section is not required.
- putc(0, fd); // <sectionflags>
-
- // Compute the length of what follows.
- size_t l = 2; // count <repcount> or <salcount>
- assert(gap->ga_len >= 0);
- for (size_t i = 0; i < (size_t)gap->ga_len; ++i) {
- fromto_T *ftp = &((fromto_T *)gap->ga_data)[i];
- l += 1 + STRLEN(ftp->ft_from); // count <*fromlen> and <*from>
- l += 1 + STRLEN(ftp->ft_to); // count <*tolen> and <*to>
- }
- if (round == 2)
- ++l; // count <salflags>
- put_bytes(fd, l, 4); // <sectionlen>
-
- if (round == 2) {
- int i = 0;
- if (spin->si_followup)
- i |= SAL_F0LLOWUP;
- if (spin->si_collapse)
- i |= SAL_COLLAPSE;
- if (spin->si_rem_accents)
- i |= SAL_REM_ACCENTS;
- putc(i, fd); // <salflags>
- }
-
- put_bytes(fd, (uintmax_t)gap->ga_len, 2); // <repcount> or <salcount>
- for (size_t i = 0; i < (size_t)gap->ga_len; ++i) {
- // <rep> : <repfromlen> <repfrom> <reptolen> <repto>
- // <sal> : <salfromlen> <salfrom> <saltolen> <salto>
- fromto_T *ftp = &((fromto_T *)gap->ga_data)[i];
- for (unsigned int rr = 1; rr <= 2; ++rr) {
- char_u *p = rr == 1 ? ftp->ft_from : ftp->ft_to;
- l = STRLEN(p);
- assert(l < INT_MAX);
- putc((int)l, fd);
- if (l > 0)
- fwv &= fwrite(p, l, 1, fd);
- }
- }
-
- }
-
- // SN_SOFO: <sofofromlen> <sofofrom> <sofotolen> <sofoto>
- // This is for making suggestions, section is not required.
- if (spin->si_sofofr != NULL && spin->si_sofoto != NULL) {
- putc(SN_SOFO, fd); // <sectionID>
- putc(0, fd); // <sectionflags>
-
- size_t l = STRLEN(spin->si_sofofr);
- put_bytes(fd, l + STRLEN(spin->si_sofoto) + 4, 4); // <sectionlen>
-
- put_bytes(fd, l, 2); // <sofofromlen>
- fwv &= fwrite(spin->si_sofofr, l, 1, fd); // <sofofrom>
-
- l = STRLEN(spin->si_sofoto);
- put_bytes(fd, l, 2); // <sofotolen>
- fwv &= fwrite(spin->si_sofoto, l, 1, fd); // <sofoto>
- }
-
- // SN_WORDS: <word> ...
- // This is for making suggestions, section is not required.
- if (spin->si_commonwords.ht_used > 0) {
- putc(SN_WORDS, fd); // <sectionID>
- putc(0, fd); // <sectionflags>
-
- // round 1: count the bytes
- // round 2: write the bytes
- for (unsigned int round = 1; round <= 2; ++round) {
- size_t todo;
- size_t len = 0;
- hashitem_T *hi;
-
- todo = spin->si_commonwords.ht_used;
- for (hi = spin->si_commonwords.ht_array; todo > 0; ++hi)
- if (!HASHITEM_EMPTY(hi)) {
- size_t l = STRLEN(hi->hi_key) + 1;
- len += l;
- if (round == 2) // <word>
- fwv &= fwrite(hi->hi_key, l, 1, fd);
- --todo;
- }
- if (round == 1)
- put_bytes(fd, len, 4); // <sectionlen>
- }
- }
-
- // SN_MAP: <mapstr>
- // This is for making suggestions, section is not required.
- if (!GA_EMPTY(&spin->si_map)) {
- putc(SN_MAP, fd); // <sectionID>
- putc(0, fd); // <sectionflags>
- size_t l = (size_t)spin->si_map.ga_len;
- put_bytes(fd, l, 4); // <sectionlen>
- fwv &= fwrite(spin->si_map.ga_data, l, 1, fd); // <mapstr>
- }
-
- // SN_SUGFILE: <timestamp>
- // This is used to notify that a .sug file may be available and at the
- // same time allows for checking that a .sug file that is found matches
- // with this .spl file. That's because the word numbers must be exactly
- // right.
- if (!spin->si_nosugfile
- && (!GA_EMPTY(&spin->si_sal)
- || (spin->si_sofofr != NULL && spin->si_sofoto != NULL))) {
- putc(SN_SUGFILE, fd); // <sectionID>
- putc(0, fd); // <sectionflags>
- put_bytes(fd, 8, 4); // <sectionlen>
-
- // Set si_sugtime and write it to the file.
- spin->si_sugtime = time(NULL);
- put_time(fd, spin->si_sugtime); // <timestamp>
- }
-
- // SN_NOSPLITSUGS: nothing
- // This is used to notify that no suggestions with word splits are to be
- // made.
- if (spin->si_nosplitsugs) {
- putc(SN_NOSPLITSUGS, fd); // <sectionID>
- putc(0, fd); // <sectionflags>
- put_bytes(fd, 0, 4); // <sectionlen>
- }
-
- // SN_NOCOMPUNDSUGS: nothing
- // This is used to notify that no suggestions with compounds are to be
- // made.
- if (spin->si_nocompoundsugs) {
- putc(SN_NOCOMPOUNDSUGS, fd); // <sectionID>
- putc(0, fd); // <sectionflags>
- put_bytes(fd, 0, 4); // <sectionlen>
- }
-
- // SN_COMPOUND: compound info.
- // We don't mark it required, when not supported all compound words will
- // be bad words.
- if (spin->si_compflags != NULL) {
- putc(SN_COMPOUND, fd); // <sectionID>
- putc(0, fd); // <sectionflags>
-
- size_t l = STRLEN(spin->si_compflags);
- assert(spin->si_comppat.ga_len >= 0);
- for (size_t i = 0; i < (size_t)spin->si_comppat.ga_len; ++i) {
- l += STRLEN(((char_u **)(spin->si_comppat.ga_data))[i]) + 1;
- }
- put_bytes(fd, l + 7, 4); // <sectionlen>
-
- putc(spin->si_compmax, fd); // <compmax>
- putc(spin->si_compminlen, fd); // <compminlen>
- putc(spin->si_compsylmax, fd); // <compsylmax>
- putc(0, fd); // for Vim 7.0b compatibility
- putc(spin->si_compoptions, fd); // <compoptions>
- put_bytes(fd, (uintmax_t)spin->si_comppat.ga_len, 2); // <comppatcount>
- for (size_t i = 0; i < (size_t)spin->si_comppat.ga_len; ++i) {
- char_u *p = ((char_u **)(spin->si_comppat.ga_data))[i];
- assert(STRLEN(p) < INT_MAX);
- putc((int)STRLEN(p), fd); // <comppatlen>
- fwv &= fwrite(p, STRLEN(p), 1, fd); // <comppattext>
- }
- // <compflags>
- fwv &= fwrite(spin->si_compflags, STRLEN(spin->si_compflags), 1, fd);
- }
-
- // SN_NOBREAK: NOBREAK flag
- if (spin->si_nobreak) {
- putc(SN_NOBREAK, fd); // <sectionID>
- putc(0, fd); // <sectionflags>
-
- // It's empty, the presence of the section flags the feature.
- put_bytes(fd, 0, 4); // <sectionlen>
- }
-
- // SN_SYLLABLE: syllable info.
- // We don't mark it required, when not supported syllables will not be
- // counted.
- if (spin->si_syllable != NULL) {
- putc(SN_SYLLABLE, fd); // <sectionID>
- putc(0, fd); // <sectionflags>
-
- size_t l = STRLEN(spin->si_syllable);
- put_bytes(fd, l, 4); // <sectionlen>
- fwv &= fwrite(spin->si_syllable, l, 1, fd); // <syllable>
- }
-
- // end of <SECTIONS>
- putc(SN_END, fd); // <sectionend>
-
-
- // <LWORDTREE> <KWORDTREE> <PREFIXTREE>
- spin->si_memtot = 0;
- for (unsigned int round = 1; round <= 3; ++round) {
- wordnode_T *tree;
- if (round == 1)
- tree = spin->si_foldroot->wn_sibling;
- else if (round == 2)
- tree = spin->si_keeproot->wn_sibling;
- else
- tree = spin->si_prefroot->wn_sibling;
-
- // Clear the index and wnode fields in the tree.
- clear_node(tree);
-
- // Count the number of nodes. Needed to be able to allocate the
- // memory when reading the nodes. Also fills in index for shared
- // nodes.
- size_t nodecount = (size_t)put_node(NULL, tree, 0, regionmask, round == 3);
-
- // number of nodes in 4 bytes
- put_bytes(fd, nodecount, 4); // <nodecount>
- assert(nodecount + nodecount * sizeof(int) < INT_MAX);
- spin->si_memtot += (int)(nodecount + nodecount * sizeof(int));
-
- // Write the nodes.
- (void)put_node(fd, tree, 0, regionmask, round == 3);
- }
-
- // Write another byte to check for errors (file system full).
- if (putc(0, fd) == EOF)
- retval = FAIL;
-theend:
- if (fclose(fd) == EOF)
- retval = FAIL;
-
- if (fwv != (size_t)1)
- retval = FAIL;
- if (retval == FAIL)
- EMSG(_(e_write));
-
- return retval;
-}
-
-// Clear the index and wnode fields of "node", it siblings and its
-// children. This is needed because they are a union with other items to save
-// space.
-static void clear_node(wordnode_T *node)
-{
- wordnode_T *np;
-
- if (node != NULL)
- for (np = node; np != NULL; np = np->wn_sibling) {
- np->wn_u1.index = 0;
- np->wn_u2.wnode = NULL;
-
- if (np->wn_byte != NUL)
- clear_node(np->wn_child);
- }
-}
-
-
-// Dump a word tree at node "node".
-//
-// This first writes the list of possible bytes (siblings). Then for each
-// byte recursively write the children.
-//
-// NOTE: The code here must match the code in read_tree_node(), since
-// assumptions are made about the indexes (so that we don't have to write them
-// in the file).
-//
-// Returns the number of nodes used.
-static int
-put_node (
- FILE *fd, // NULL when only counting
- wordnode_T *node,
- int idx,
- int regionmask,
- bool prefixtree // true for PREFIXTREE
-)
-{
- // If "node" is zero the tree is empty.
- if (node == NULL)
- return 0;
-
- // Store the index where this node is written.
- node->wn_u1.index = idx;
-
- // Count the number of siblings.
- int siblingcount = 0;
- for (wordnode_T *np = node; np != NULL; np = np->wn_sibling)
- ++siblingcount;
-
- // Write the sibling count.
- if (fd != NULL)
- putc(siblingcount, fd); // <siblingcount>
-
- // Write each sibling byte and optionally extra info.
- for (wordnode_T *np = node; np != NULL; np = np->wn_sibling) {
- if (np->wn_byte == 0) {
- if (fd != NULL) {
- // For a NUL byte (end of word) write the flags etc.
- if (prefixtree) {
- // In PREFIXTREE write the required affixID and the
- // associated condition nr (stored in wn_region). The
- // byte value is misused to store the "rare" and "not
- // combining" flags
- if (np->wn_flags == (uint16_t)PFX_FLAGS)
- putc(BY_NOFLAGS, fd); // <byte>
- else {
- putc(BY_FLAGS, fd); // <byte>
- putc(np->wn_flags, fd); // <pflags>
- }
- putc(np->wn_affixID, fd); // <affixID>
- put_bytes(fd, (uintmax_t)np->wn_region, 2); // <prefcondnr>
- } else {
- // For word trees we write the flag/region items.
- int flags = np->wn_flags;
- if (regionmask != 0 && np->wn_region != regionmask)
- flags |= WF_REGION;
- if (np->wn_affixID != 0)
- flags |= WF_AFX;
- if (flags == 0) {
- // word without flags or region
- putc(BY_NOFLAGS, fd); // <byte>
- } else {
- if (np->wn_flags >= 0x100) {
- putc(BY_FLAGS2, fd); // <byte>
- putc(flags, fd); // <flags>
- putc((int)((unsigned)flags >> 8), fd); // <flags2>
- } else {
- putc(BY_FLAGS, fd); // <byte>
- putc(flags, fd); // <flags>
- }
- if (flags & WF_REGION)
- putc(np->wn_region, fd); // <region>
- if (flags & WF_AFX)
- putc(np->wn_affixID, fd); // <affixID>
- }
- }
- }
- } else {
- if (np->wn_child->wn_u1.index != 0
- && np->wn_child->wn_u2.wnode != node) {
- // The child is written elsewhere, write the reference.
- if (fd != NULL) {
- putc(BY_INDEX, fd); // <byte>
- put_bytes(fd, (uintmax_t)np->wn_child->wn_u1.index, 3); // <nodeidx>
- }
- } else if (np->wn_child->wn_u2.wnode == NULL)
- // We will write the child below and give it an index.
- np->wn_child->wn_u2.wnode = node;
-
- if (fd != NULL)
- if (putc(np->wn_byte, fd) == EOF) { // <byte> or <xbyte>
- EMSG(_(e_write));
- return 0;
- }
- }
- }
-
- // Space used in the array when reading: one for each sibling and one for
- // the count.
- int newindex = idx + siblingcount + 1;
-
- // Recursively dump the children of each sibling.
- for (wordnode_T *np = node; np != NULL; np = np->wn_sibling)
- if (np->wn_byte != 0 && np->wn_child->wn_u2.wnode == node)
- newindex = put_node(fd, np->wn_child, newindex, regionmask,
- prefixtree);
-
- return newindex;
-}
-
-
-// ":mkspell [-ascii] outfile infile ..."
-// ":mkspell [-ascii] addfile"
-void ex_mkspell(exarg_T *eap)
-{
- int fcount;
- char_u **fnames;
- char_u *arg = eap->arg;
- bool ascii = false;
-
- if (STRNCMP(arg, "-ascii", 6) == 0) {
- ascii = true;
- arg = skipwhite(arg + 6);
- }
-
- // Expand all the remaining arguments (e.g., $VIMRUNTIME).
- if (get_arglist_exp(arg, &fcount, &fnames, false) == OK) {
- mkspell(fcount, fnames, ascii, eap->forceit, false);
- FreeWild(fcount, fnames);
- }
-}
-
-// Create the .sug file.
-// Uses the soundfold info in "spin".
-// Writes the file with the name "wfname", with ".spl" changed to ".sug".
-static void spell_make_sugfile(spellinfo_T *spin, char_u *wfname)
-{
- char_u *fname = NULL;
- int len;
- slang_T *slang;
- bool free_slang = false;
-
- // Read back the .spl file that was written. This fills the required
- // info for soundfolding. This also uses less memory than the
- // pointer-linked version of the trie. And it avoids having two versions
- // of the code for the soundfolding stuff.
- // It might have been done already by spell_reload_one().
- for (slang = first_lang; slang != NULL; slang = slang->sl_next)
- if (path_full_compare(wfname, slang->sl_fname, FALSE) == kEqualFiles)
- break;
- if (slang == NULL) {
- spell_message(spin, (char_u *)_("Reading back spell file..."));
- slang = spell_load_file(wfname, NULL, NULL, false);
- if (slang == NULL)
- return;
- free_slang = true;
- }
-
- // Clear the info in "spin" that is used.
- spin->si_blocks = NULL;
- spin->si_blocks_cnt = 0;
- spin->si_compress_cnt = 0; // will stay at 0 all the time
- spin->si_free_count = 0;
- spin->si_first_free = NULL;
- spin->si_foldwcount = 0;
-
- // Go through the trie of good words, soundfold each word and add it to
- // the soundfold trie.
- spell_message(spin, (char_u *)_("Performing soundfolding..."));
- if (sug_filltree(spin, slang) == FAIL)
- goto theend;
-
- // Create the table which links each soundfold word with a list of the
- // good words it may come from. Creates buffer "spin->si_spellbuf".
- // This also removes the wordnr from the NUL byte entries to make
- // compression possible.
- if (sug_maketable(spin) == FAIL)
- goto theend;
-
- smsg(_("Number of words after soundfolding: %" PRId64),
- (int64_t)spin->si_spellbuf->b_ml.ml_line_count);
-
- // Compress the soundfold trie.
- spell_message(spin, (char_u *)_(msg_compressing));
- wordtree_compress(spin, spin->si_foldroot);
-
- // Write the .sug file.
- // Make the file name by changing ".spl" to ".sug".
- fname = xmalloc(MAXPATHL);
- STRLCPY(fname, wfname, MAXPATHL);
- len = (int)STRLEN(fname);
- fname[len - 2] = 'u';
- fname[len - 1] = 'g';
- sug_write(spin, fname);
-
-theend:
- xfree(fname);
- if (free_slang)
- slang_free(slang);
- free_blocks(spin->si_blocks);
- close_spellbuf(spin->si_spellbuf);
-}
-
-// Build the soundfold trie for language "slang".
-static int sug_filltree(spellinfo_T *spin, slang_T *slang)
-{
- char_u *byts;
- idx_T *idxs;
- int depth;
- idx_T arridx[MAXWLEN];
- int curi[MAXWLEN];
- char_u tword[MAXWLEN];
- char_u tsalword[MAXWLEN];
- int c;
- idx_T n;
- unsigned words_done = 0;
- int wordcount[MAXWLEN];
-
- // We use si_foldroot for the soundfolded trie.
- spin->si_foldroot = wordtree_alloc(spin);
- if (spin->si_foldroot == NULL)
- return FAIL;
-
- // Let tree_add_word() know we're adding to the soundfolded tree
- spin->si_sugtree = true;
-
- // Go through the whole case-folded tree, soundfold each word and put it
- // in the trie.
- byts = slang->sl_fbyts;
- idxs = slang->sl_fidxs;
-
- arridx[0] = 0;
- curi[0] = 1;
- wordcount[0] = 0;
-
- depth = 0;
- while (depth >= 0 && !got_int) {
- if (curi[depth] > byts[arridx[depth]]) {
- // Done all bytes at this node, go up one level.
- idxs[arridx[depth]] = wordcount[depth];
- if (depth > 0)
- wordcount[depth - 1] += wordcount[depth];
-
- --depth;
- line_breakcheck();
- } else {
-
- // Do one more byte at this node.
- n = arridx[depth] + curi[depth];
- ++curi[depth];
-
- c = byts[n];
- if (c == 0) {
- // Sound-fold the word.
- tword[depth] = NUL;
- spell_soundfold(slang, tword, true, tsalword);
-
- // We use the "flags" field for the MSB of the wordnr,
- // "region" for the LSB of the wordnr.
- if (tree_add_word(spin, tsalword, spin->si_foldroot,
- words_done >> 16, words_done & 0xffff,
- 0) == FAIL)
- return FAIL;
-
- ++words_done;
- ++wordcount[depth];
-
- // Reset the block count each time to avoid compression
- // kicking in.
- spin->si_blocks_cnt = 0;
-
- // Skip over any other NUL bytes (same word with different
- // flags).
- while (byts[n + 1] == 0) {
- ++n;
- ++curi[depth];
- }
- } else {
- // Normal char, go one level deeper.
- tword[depth++] = c;
- arridx[depth] = idxs[n];
- curi[depth] = 1;
- wordcount[depth] = 0;
- }
- }
- }
-
- smsg(_("Total number of words: %d"), words_done);
-
- return OK;
-}
-
-// Make the table that links each word in the soundfold trie to the words it
-// can be produced from.
-// This is not unlike lines in a file, thus use a memfile to be able to access
-// the table efficiently.
-// Returns FAIL when out of memory.
-static int sug_maketable(spellinfo_T *spin)
-{
- garray_T ga;
- int res = OK;
-
- // Allocate a buffer, open a memline for it and create the swap file
- // (uses a temp file, not a .swp file).
- spin->si_spellbuf = open_spellbuf();
-
- // Use a buffer to store the line info, avoids allocating many small
- // pieces of memory.
- ga_init(&ga, 1, 100);
-
- // recursively go through the tree
- if (sug_filltable(spin, spin->si_foldroot->wn_sibling, 0, &ga) == -1)
- res = FAIL;
-
- ga_clear(&ga);
- return res;
-}
-
-// Fill the table for one node and its children.
-// Returns the wordnr at the start of the node.
-// Returns -1 when out of memory.
-static int
-sug_filltable (
- spellinfo_T *spin,
- wordnode_T *node,
- int startwordnr,
- garray_T *gap // place to store line of numbers
-)
-{
- wordnode_T *p, *np;
- int wordnr = startwordnr;
- int nr;
- int prev_nr;
-
- for (p = node; p != NULL; p = p->wn_sibling) {
- if (p->wn_byte == NUL) {
- gap->ga_len = 0;
- prev_nr = 0;
- for (np = p; np != NULL && np->wn_byte == NUL; np = np->wn_sibling) {
- ga_grow(gap, 10);
-
- nr = (np->wn_flags << 16) + (np->wn_region & 0xffff);
- // Compute the offset from the previous nr and store the
- // offset in a way that it takes a minimum number of bytes.
- // It's a bit like utf-8, but without the need to mark
- // following bytes.
- nr -= prev_nr;
- prev_nr += nr;
- gap->ga_len += offset2bytes(nr,
- (char_u *)gap->ga_data + gap->ga_len);
- }
-
- // add the NUL byte
- ((char_u *)gap->ga_data)[gap->ga_len++] = NUL;
-
- if (ml_append_buf(spin->si_spellbuf, (linenr_T)wordnr,
- gap->ga_data, gap->ga_len, TRUE) == FAIL)
- return -1;
- ++wordnr;
-
- // Remove extra NUL entries, we no longer need them. We don't
- // bother freeing the nodes, the won't be reused anyway.
- while (p->wn_sibling != NULL && p->wn_sibling->wn_byte == NUL)
- p->wn_sibling = p->wn_sibling->wn_sibling;
-
- // Clear the flags on the remaining NUL node, so that compression
- // works a lot better.
- p->wn_flags = 0;
- p->wn_region = 0;
- } else {
- wordnr = sug_filltable(spin, p->wn_child, wordnr, gap);
- if (wordnr == -1)
- return -1;
- }
- }
- return wordnr;
-}
-
-// Convert an offset into a minimal number of bytes.
-// Similar to utf_char2byters, but use 8 bits in followup bytes and avoid NUL
-// bytes.
-static int offset2bytes(int nr, char_u *buf)
-{
- int rem;
- int b1, b2, b3, b4;
-
- // Split the number in parts of base 255. We need to avoid NUL bytes.
- b1 = nr % 255 + 1;
- rem = nr / 255;
- b2 = rem % 255 + 1;
- rem = rem / 255;
- b3 = rem % 255 + 1;
- b4 = rem / 255 + 1;
-
- if (b4 > 1 || b3 > 0x1f) { // 4 bytes
- buf[0] = 0xe0 + b4;
- buf[1] = b3;
- buf[2] = b2;
- buf[3] = b1;
- return 4;
- }
- if (b3 > 1 || b2 > 0x3f ) { // 3 bytes
- buf[0] = 0xc0 + b3;
- buf[1] = b2;
- buf[2] = b1;
- return 3;
- }
- if (b2 > 1 || b1 > 0x7f ) { // 2 bytes
- buf[0] = 0x80 + b2;
- buf[1] = b1;
- return 2;
- }
- // 1 byte
- buf[0] = b1;
- return 1;
-}
// Opposite of offset2bytes().
// "pp" points to the bytes and is advanced over it.
@@ -7443,99 +2498,27 @@ static int bytes2offset(char_u **pp)
return nr;
}
-// Write the .sug file in "fname".
-static void sug_write(spellinfo_T *spin, char_u *fname)
-{
- // Create the file. Note that an existing file is silently overwritten!
- FILE *fd = mch_fopen((char *)fname, "w");
- if (fd == NULL) {
- EMSG2(_(e_notopen), fname);
- return;
- }
-
- vim_snprintf((char *)IObuff, IOSIZE,
- _("Writing suggestion file %s ..."), fname);
- spell_message(spin, IObuff);
-
- // <SUGHEADER>: <fileID> <versionnr> <timestamp>
- if (fwrite(VIMSUGMAGIC, VIMSUGMAGICL, (size_t)1, fd) != 1) { // <fileID>
- EMSG(_(e_write));
- goto theend;
- }
- putc(VIMSUGVERSION, fd); // <versionnr>
-
- // Write si_sugtime to the file.
- put_time(fd, spin->si_sugtime); // <timestamp>
-
- // <SUGWORDTREE>
- spin->si_memtot = 0;
- wordnode_T *tree = spin->si_foldroot->wn_sibling;
-
- // Clear the index and wnode fields in the tree.
- clear_node(tree);
-
- // Count the number of nodes. Needed to be able to allocate the
- // memory when reading the nodes. Also fills in index for shared
- // nodes.
- size_t nodecount = (size_t)put_node(NULL, tree, 0, 0, false);
-
- // number of nodes in 4 bytes
- put_bytes(fd, nodecount, 4); // <nodecount>
- assert(nodecount + nodecount * sizeof(int) < INT_MAX);
- spin->si_memtot += (int)(nodecount + nodecount * sizeof(int));
-
- // Write the nodes.
- (void)put_node(fd, tree, 0, 0, false);
-
- // <SUGTABLE>: <sugwcount> <sugline> ...
- linenr_T wcount = spin->si_spellbuf->b_ml.ml_line_count;
- assert(wcount >= 0);
- put_bytes(fd, (uintmax_t)wcount, 4); // <sugwcount>
-
- for (linenr_T lnum = 1; lnum <= wcount; ++lnum) {
- // <sugline>: <sugnr> ... NUL
- char_u *line = ml_get_buf(spin->si_spellbuf, lnum, FALSE);
- size_t len = STRLEN(line) + 1;
- if (fwrite(line, len, 1, fd) == 0) {
- EMSG(_(e_write));
- goto theend;
- }
- assert((size_t)spin->si_memtot + len <= INT_MAX);
- spin->si_memtot += (int)len;
- }
-
- // Write another byte to check for errors.
- if (putc(0, fd) == EOF)
- EMSG(_(e_write));
-
- vim_snprintf((char *)IObuff, IOSIZE,
- _("Estimated runtime memory use: %d bytes"), spin->si_memtot);
- spell_message(spin, IObuff);
-
-theend:
- // close the file
- fclose(fd);
-}
-
// Open a spell buffer. This is a nameless buffer that is not in the buffer
// list and only contains text lines. Can use a swapfile to reduce memory
// use.
// Most other fields are invalid! Esp. watch out for string options being
// NULL and there is no undo info.
-static buf_T *open_spellbuf(void)
+buf_T *open_spellbuf(void)
{
buf_T *buf = xcalloc(1, sizeof(buf_T));
buf->b_spell = true;
buf->b_p_swf = true; // may create a swap file
- ml_open(buf);
+ if (ml_open(buf) == FAIL) {
+ ELOG("Error opening a new memline");
+ }
ml_open_file(buf); // create swap file now
return buf;
}
// Close the buffer used for spell info.
-static void close_spellbuf(buf_T *buf)
+void close_spellbuf(buf_T *buf)
{
if (buf != NULL) {
ml_close(buf, TRUE);
@@ -7543,471 +2526,8 @@ static void close_spellbuf(buf_T *buf)
}
}
-
-// Create a Vim spell file from one or more word lists.
-// "fnames[0]" is the output file name.
-// "fnames[fcount - 1]" is the last input file name.
-// Exception: when "fnames[0]" ends in ".add" it's used as the input file name
-// and ".spl" is appended to make the output file name.
-static void
-mkspell (
- int fcount,
- char_u **fnames,
- bool ascii, // -ascii argument given
- bool over_write, // overwrite existing output file
- bool added_word // invoked through "zg"
-)
-{
- char_u *fname = NULL;
- char_u *wfname;
- char_u **innames;
- int incount;
- afffile_T *(afile[8]);
- int i;
- int len;
- bool error = false;
- spellinfo_T spin;
-
- memset(&spin, 0, sizeof(spin));
- spin.si_verbose = !added_word;
- spin.si_ascii = ascii;
- spin.si_followup = true;
- spin.si_rem_accents = true;
- ga_init(&spin.si_rep, (int)sizeof(fromto_T), 20);
- ga_init(&spin.si_repsal, (int)sizeof(fromto_T), 20);
- ga_init(&spin.si_sal, (int)sizeof(fromto_T), 20);
- ga_init(&spin.si_map, (int)sizeof(char_u), 100);
- ga_init(&spin.si_comppat, (int)sizeof(char_u *), 20);
- ga_init(&spin.si_prefcond, (int)sizeof(char_u *), 50);
- hash_init(&spin.si_commonwords);
- spin.si_newcompID = 127; // start compound ID at first maximum
-
- // default: fnames[0] is output file, following are input files
- innames = &fnames[1];
- incount = fcount - 1;
-
- wfname = xmalloc(MAXPATHL);
-
- if (fcount >= 1) {
- len = (int)STRLEN(fnames[0]);
- if (fcount == 1 && len > 4 && STRCMP(fnames[0] + len - 4, ".add") == 0) {
- // For ":mkspell path/en.latin1.add" output file is
- // "path/en.latin1.add.spl".
- innames = &fnames[0];
- incount = 1;
- vim_snprintf((char *)wfname, MAXPATHL, "%s.spl", fnames[0]);
- } else if (fcount == 1) {
- // For ":mkspell path/vim" output file is "path/vim.latin1.spl".
- innames = &fnames[0];
- incount = 1;
- vim_snprintf((char *)wfname, MAXPATHL, SPL_FNAME_TMPL,
- fnames[0], spin.si_ascii ? (char_u *)"ascii" : spell_enc());
- } else if (len > 4 && STRCMP(fnames[0] + len - 4, ".spl") == 0) {
- // Name ends in ".spl", use as the file name.
- STRLCPY(wfname, fnames[0], MAXPATHL);
- } else
- // Name should be language, make the file name from it.
- vim_snprintf((char *)wfname, MAXPATHL, SPL_FNAME_TMPL,
- fnames[0], spin.si_ascii ? (char_u *)"ascii" : spell_enc());
-
- // Check for .ascii.spl.
- if (strstr((char *)path_tail(wfname), SPL_FNAME_ASCII) != NULL)
- spin.si_ascii = true;
-
- // Check for .add.spl.
- if (strstr((char *)path_tail(wfname), SPL_FNAME_ADD) != NULL)
- spin.si_add = true;
- }
-
- if (incount <= 0)
- EMSG(_(e_invarg)); // need at least output and input names
- else if (vim_strchr(path_tail(wfname), '_') != NULL)
- EMSG(_("E751: Output file name must not have region name"));
- else if (incount > 8)
- EMSG(_("E754: Only up to 8 regions supported"));
- else {
- // Check for overwriting before doing things that may take a lot of
- // time.
- if (!over_write && os_path_exists(wfname)) {
- EMSG(_(e_exists));
- goto theend;
- }
- if (os_isdir(wfname)) {
- EMSG2(_(e_isadir2), wfname);
- goto theend;
- }
-
- fname = xmalloc(MAXPATHL);
-
- // Init the aff and dic pointers.
- // Get the region names if there are more than 2 arguments.
- for (i = 0; i < incount; ++i) {
- afile[i] = NULL;
-
- if (incount > 1) {
- len = (int)STRLEN(innames[i]);
- if (STRLEN(path_tail(innames[i])) < 5
- || innames[i][len - 3] != '_') {
- EMSG2(_("E755: Invalid region in %s"), innames[i]);
- goto theend;
- }
- spin.si_region_name[i * 2] = TOLOWER_ASC(innames[i][len - 2]);
- spin.si_region_name[i * 2 + 1] =
- TOLOWER_ASC(innames[i][len - 1]);
- }
- }
- spin.si_region_count = incount;
-
- spin.si_foldroot = wordtree_alloc(&spin);
- spin.si_keeproot = wordtree_alloc(&spin);
- spin.si_prefroot = wordtree_alloc(&spin);
- if (spin.si_foldroot == NULL
- || spin.si_keeproot == NULL
- || spin.si_prefroot == NULL) {
- free_blocks(spin.si_blocks);
- goto theend;
- }
-
- // When not producing a .add.spl file clear the character table when
- // we encounter one in the .aff file. This means we dump the current
- // one in the .spl file if the .aff file doesn't define one. That's
- // better than guessing the contents, the table will match a
- // previously loaded spell file.
- if (!spin.si_add)
- spin.si_clear_chartab = true;
-
- // Read all the .aff and .dic files.
- // Text is converted to 'encoding'.
- // Words are stored in the case-folded and keep-case trees.
- for (i = 0; i < incount && !error; ++i) {
- spin.si_conv.vc_type = CONV_NONE;
- spin.si_region = 1 << i;
-
- vim_snprintf((char *)fname, MAXPATHL, "%s.aff", innames[i]);
- if (os_path_exists(fname)) {
- // Read the .aff file. Will init "spin->si_conv" based on the
- // "SET" line.
- afile[i] = spell_read_aff(&spin, fname);
- if (afile[i] == NULL)
- error = true;
- else {
- // Read the .dic file and store the words in the trees.
- vim_snprintf((char *)fname, MAXPATHL, "%s.dic",
- innames[i]);
- if (spell_read_dic(&spin, fname, afile[i]) == FAIL)
- error = true;
- }
- } else {
- // No .aff file, try reading the file as a word list. Store
- // the words in the trees.
- if (spell_read_wordfile(&spin, innames[i]) == FAIL)
- error = true;
- }
-
- // Free any conversion stuff.
- convert_setup(&spin.si_conv, NULL, NULL);
- }
-
- if (spin.si_compflags != NULL && spin.si_nobreak)
- MSG(_("Warning: both compounding and NOBREAK specified"));
-
- if (!error && !got_int) {
- // Combine tails in the tree.
- spell_message(&spin, (char_u *)_(msg_compressing));
- wordtree_compress(&spin, spin.si_foldroot);
- wordtree_compress(&spin, spin.si_keeproot);
- wordtree_compress(&spin, spin.si_prefroot);
- }
-
- if (!error && !got_int) {
- // Write the info in the spell file.
- vim_snprintf((char *)IObuff, IOSIZE,
- _("Writing spell file %s ..."), wfname);
- spell_message(&spin, IObuff);
-
- error = write_vim_spell(&spin, wfname) == FAIL;
-
- spell_message(&spin, (char_u *)_("Done!"));
- vim_snprintf((char *)IObuff, IOSIZE,
- _("Estimated runtime memory use: %d bytes"), spin.si_memtot);
- spell_message(&spin, IObuff);
-
- // If the file is loaded need to reload it.
- if (!error)
- spell_reload_one(wfname, added_word);
- }
-
- // Free the allocated memory.
- ga_clear(&spin.si_rep);
- ga_clear(&spin.si_repsal);
- ga_clear(&spin.si_sal);
- ga_clear(&spin.si_map);
- ga_clear(&spin.si_comppat);
- ga_clear(&spin.si_prefcond);
- hash_clear_all(&spin.si_commonwords, 0);
-
- // Free the .aff file structures.
- for (i = 0; i < incount; ++i)
- if (afile[i] != NULL)
- spell_free_aff(afile[i]);
-
- // Free all the bits and pieces at once.
- free_blocks(spin.si_blocks);
-
- // If there is soundfolding info and no NOSUGFILE item create the
- // .sug file with the soundfolded word trie.
- if (spin.si_sugtime != 0 && !error && !got_int)
- spell_make_sugfile(&spin, wfname);
-
- }
-
-theend:
- xfree(fname);
- xfree(wfname);
-}
-
-// Display a message for spell file processing when 'verbose' is set or using
-// ":mkspell". "str" can be IObuff.
-static void spell_message(spellinfo_T *spin, char_u *str)
-{
- if (spin->si_verbose || p_verbose > 2) {
- if (!spin->si_verbose)
- verbose_enter();
- MSG(str);
- ui_flush();
- if (!spin->si_verbose)
- verbose_leave();
- }
-}
-
-// ":[count]spellgood {word}"
-// ":[count]spellwrong {word}"
-// ":[count]spellundo {word}"
-void ex_spell(exarg_T *eap)
-{
- spell_add_word(eap->arg, (int)STRLEN(eap->arg), eap->cmdidx == CMD_spellwrong,
- eap->forceit ? 0 : (int)eap->line2,
- eap->cmdidx == CMD_spellundo);
-}
-
-// Add "word[len]" to 'spellfile' as a good or bad word.
-void
-spell_add_word (
- char_u *word,
- int len,
- int bad,
- int idx, // "zG" and "zW": zero, otherwise index in
- // 'spellfile'
- bool undo // true for "zug", "zuG", "zuw" and "zuW"
-)
-{
- FILE *fd = NULL;
- buf_T *buf = NULL;
- bool new_spf = false;
- char_u *fname;
- char_u *fnamebuf = NULL;
- char_u line[MAXWLEN * 2];
- long fpos, fpos_next = 0;
- int i;
- char_u *spf;
-
- if (idx == 0) { // use internal wordlist
- if (int_wordlist == NULL) {
- int_wordlist = vim_tempname();
- if (int_wordlist == NULL)
- return;
- }
- fname = int_wordlist;
- } else {
- // If 'spellfile' isn't set figure out a good default value.
- if (*curwin->w_s->b_p_spf == NUL) {
- init_spellfile();
- new_spf = true;
- }
-
- if (*curwin->w_s->b_p_spf == NUL) {
- EMSG2(_(e_notset), "spellfile");
- return;
- }
- fnamebuf = xmalloc(MAXPATHL);
-
- for (spf = curwin->w_s->b_p_spf, i = 1; *spf != NUL; ++i) {
- copy_option_part(&spf, fnamebuf, MAXPATHL, ",");
- if (i == idx)
- break;
- if (*spf == NUL) {
- EMSGN(_("E765: 'spellfile' does not have %" PRId64 " entries"), idx);
- xfree(fnamebuf);
- return;
- }
- }
-
- // Check that the user isn't editing the .add file somewhere.
- buf = buflist_findname_exp(fnamebuf);
- if (buf != NULL && buf->b_ml.ml_mfp == NULL)
- buf = NULL;
- if (buf != NULL && bufIsChanged(buf)) {
- EMSG(_(e_bufloaded));
- xfree(fnamebuf);
- return;
- }
-
- fname = fnamebuf;
- }
-
- if (bad || undo) {
- // When the word appears as good word we need to remove that one,
- // since its flags sort before the one with WF_BANNED.
- fd = mch_fopen((char *)fname, "r");
- if (fd != NULL) {
- while (!vim_fgets(line, MAXWLEN * 2, fd)) {
- fpos = fpos_next;
- fpos_next = ftell(fd);
- if (STRNCMP(word, line, len) == 0
- && (line[len] == '/' || line[len] < ' ')) {
- // Found duplicate word. Remove it by writing a '#' at
- // the start of the line. Mixing reading and writing
- // doesn't work for all systems, close the file first.
- fclose(fd);
- fd = mch_fopen((char *)fname, "r+");
- if (fd == NULL)
- break;
- if (fseek(fd, fpos, SEEK_SET) == 0) {
- fputc('#', fd);
- if (undo) {
- home_replace(NULL, fname, NameBuff, MAXPATHL, TRUE);
- smsg(_("Word '%.*s' removed from %s"),
- len, word, NameBuff);
- }
- }
- fseek(fd, fpos_next, SEEK_SET);
- }
- }
- if (fd != NULL)
- fclose(fd);
- }
- }
-
- if (!undo) {
- fd = mch_fopen((char *)fname, "a");
- if (fd == NULL && new_spf) {
- char_u *p;
-
- // We just initialized the 'spellfile' option and can't open the
- // file. We may need to create the "spell" directory first. We
- // already checked the runtime directory is writable in
- // init_spellfile().
- if (!dir_of_file_exists(fname) && (p = path_tail_with_sep(fname)) != fname) {
- int c = *p;
-
- // The directory doesn't exist. Try creating it and opening
- // the file again.
- *p = NUL;
- os_mkdir((char *)fname, 0755);
- *p = c;
- fd = mch_fopen((char *)fname, "a");
- }
- }
-
- if (fd == NULL)
- EMSG2(_(e_notopen), fname);
- else {
- if (bad)
- fprintf(fd, "%.*s/!\n", len, word);
- else
- fprintf(fd, "%.*s\n", len, word);
- fclose(fd);
-
- home_replace(NULL, fname, NameBuff, MAXPATHL, TRUE);
- smsg(_("Word '%.*s' added to %s"), len, word, NameBuff);
- }
- }
-
- if (fd != NULL) {
- // Update the .add.spl file.
- mkspell(1, &fname, false, true, true);
-
- // If the .add file is edited somewhere, reload it.
- if (buf != NULL)
- buf_reload(buf, buf->b_orig_mode);
-
- redraw_all_later(SOME_VALID);
- }
- xfree(fnamebuf);
-}
-
-// Initialize 'spellfile' for the current buffer.
-static void init_spellfile(void)
-{
- char_u *buf;
- int l;
- char_u *fname;
- char_u *rtp;
- char_u *lend;
- bool aspath = false;
- char_u *lstart = curbuf->b_s.b_p_spl;
-
- if (*curwin->w_s->b_p_spl != NUL && !GA_EMPTY(&curwin->w_s->b_langp)) {
- buf = xmalloc(MAXPATHL);
-
- // Find the end of the language name. Exclude the region. If there
- // is a path separator remember the start of the tail.
- for (lend = curwin->w_s->b_p_spl; *lend != NUL
- && vim_strchr((char_u *)",._", *lend) == NULL; ++lend)
- if (vim_ispathsep(*lend)) {
- aspath = true;
- lstart = lend + 1;
- }
-
- // Loop over all entries in 'runtimepath'. Use the first one where we
- // are allowed to write.
- rtp = p_rtp;
- while (*rtp != NUL) {
- if (aspath)
- // Use directory of an entry with path, e.g., for
- // "/dir/lg.utf-8.spl" use "/dir".
- STRLCPY(buf, curbuf->b_s.b_p_spl,
- lstart - curbuf->b_s.b_p_spl);
- else
- // Copy the path from 'runtimepath' to buf[].
- copy_option_part(&rtp, buf, MAXPATHL, ",");
- if (os_file_is_writable((char *)buf) == 2) {
- // Use the first language name from 'spelllang' and the
- // encoding used in the first loaded .spl file.
- if (aspath)
- STRLCPY(buf, curbuf->b_s.b_p_spl,
- lend - curbuf->b_s.b_p_spl + 1);
- else {
- // Create the "spell" directory if it doesn't exist yet.
- l = (int)STRLEN(buf);
- vim_snprintf((char *)buf + l, MAXPATHL - l, "/spell");
- if (os_file_is_writable((char *)buf) != 2) {
- os_mkdir((char *)buf, 0755);
- }
-
- l = (int)STRLEN(buf);
- vim_snprintf((char *)buf + l, MAXPATHL - l,
- "/%.*s", (int)(lend - lstart), lstart);
- }
- l = (int)STRLEN(buf);
- fname = LANGP_ENTRY(curwin->w_s->b_langp, 0)
- ->lp_slang->sl_fname;
- vim_snprintf((char *)buf + l, MAXPATHL - l, ".%s.add",
- fname != NULL
- && strstr((char *)path_tail(fname), ".ascii.") != NULL
- ? (char_u *)"ascii" : spell_enc());
- set_option_value((char_u *)"spellfile", 0L, buf, OPT_LOCAL);
- break;
- }
- aspath = false;
- }
-
- xfree(buf);
- }
-}
-
// Init the chartab used for spelling for ASCII.
-static void clear_spell_chartab(spelltab_T *sp)
+void clear_spell_chartab(spelltab_T *sp)
{
int i;
@@ -8035,8 +2555,7 @@ static void clear_spell_chartab(spelltab_T *sp)
}
}
-// Init the chartab used for spelling. Only depends on 'encoding'.
-// Called once while starting up and when 'encoding' changes.
+// Init the chartab used for spelling. Called once while starting up.
// The default is to use isalpha(), but the spell file should define the word
// characters to make it possible that 'encoding' differs from the current
// locale. For utf-8 we don't use isalpha() but our own functions.
@@ -8046,154 +2565,18 @@ void init_spell_chartab(void)
did_set_spelltab = false;
clear_spell_chartab(&spelltab);
- if (enc_dbcs) {
- // DBCS: assume double-wide characters are word characters.
- for (i = 128; i <= 255; ++i)
- if (MB_BYTE2LEN(i) == 2)
- spelltab.st_isw[i] = true;
- } else if (enc_utf8) {
- for (i = 128; i < 256; ++i) {
- int f = utf_fold(i);
- int u = utf_toupper(i);
-
- spelltab.st_isu[i] = utf_isupper(i);
- spelltab.st_isw[i] = spelltab.st_isu[i] || utf_islower(i);
- // The folded/upper-cased value is different between latin1 and
- // utf8 for 0xb5, causing E763 for no good reason. Use the latin1
- // value for utf-8 to avoid this.
- spelltab.st_fold[i] = (f < 256) ? f : i;
- spelltab.st_upper[i] = (u < 256) ? u : i;
- }
- } else {
- // Rough guess: use locale-dependent library functions.
- for (i = 128; i < 256; ++i) {
- if (vim_isupper(i)) {
- spelltab.st_isw[i] = true;
- spelltab.st_isu[i] = true;
- spelltab.st_fold[i] = vim_tolower(i);
- } else if (vim_islower(i)) {
- spelltab.st_isw[i] = true;
- spelltab.st_upper[i] = vim_toupper(i);
- }
- }
- }
-}
+ for (i = 128; i < 256; i++) {
+ int f = utf_fold(i);
+ int u = mb_toupper(i);
-// Set the spell character tables from strings in the affix file.
-static int set_spell_chartab(char_u *fol, char_u *low, char_u *upp)
-{
- // We build the new tables here first, so that we can compare with the
- // previous one.
- spelltab_T new_st;
- char_u *pf = fol, *pl = low, *pu = upp;
- int f, l, u;
-
- clear_spell_chartab(&new_st);
-
- while (*pf != NUL) {
- if (*pl == NUL || *pu == NUL) {
- EMSG(_(e_affform));
- return FAIL;
- }
- f = mb_ptr2char_adv(&pf);
- l = mb_ptr2char_adv(&pl);
- u = mb_ptr2char_adv(&pu);
- // Every character that appears is a word character.
- if (f < 256)
- new_st.st_isw[f] = true;
- if (l < 256)
- new_st.st_isw[l] = true;
- if (u < 256)
- new_st.st_isw[u] = true;
-
- // if "LOW" and "FOL" are not the same the "LOW" char needs
- // case-folding
- if (l < 256 && l != f) {
- if (f >= 256) {
- EMSG(_(e_affrange));
- return FAIL;
- }
- new_st.st_fold[l] = f;
- }
-
- // if "UPP" and "FOL" are not the same the "UPP" char needs
- // case-folding, it's upper case and the "UPP" is the upper case of
- // "FOL" .
- if (u < 256 && u != f) {
- if (f >= 256) {
- EMSG(_(e_affrange));
- return FAIL;
- }
- new_st.st_fold[u] = f;
- new_st.st_isu[u] = true;
- new_st.st_upper[f] = u;
- }
- }
-
- if (*pl != NUL || *pu != NUL) {
- EMSG(_(e_affform));
- return FAIL;
- }
-
- return set_spell_finish(&new_st);
-}
-
-// Set the spell character tables from strings in the .spl file.
-static void
-set_spell_charflags (
- char_u *flags,
- int cnt, // length of "flags"
- char_u *fol
-)
-{
- // We build the new tables here first, so that we can compare with the
- // previous one.
- spelltab_T new_st;
- int i;
- char_u *p = fol;
- int c;
-
- clear_spell_chartab(&new_st);
-
- for (i = 0; i < 128; ++i) {
- if (i < cnt) {
- new_st.st_isw[i + 128] = (flags[i] & CF_WORD) != 0;
- new_st.st_isu[i + 128] = (flags[i] & CF_UPPER) != 0;
- }
-
- if (*p != NUL) {
- c = mb_ptr2char_adv(&p);
- new_st.st_fold[i + 128] = c;
- if (i + 128 != c && new_st.st_isu[i + 128] && c < 256)
- new_st.st_upper[c] = i + 128;
- }
- }
-
- (void)set_spell_finish(&new_st);
-}
-
-static int set_spell_finish(spelltab_T *new_st)
-{
- int i;
-
- if (did_set_spelltab) {
- // check that it's the same table
- for (i = 0; i < 256; ++i) {
- if (spelltab.st_isw[i] != new_st->st_isw[i]
- || spelltab.st_isu[i] != new_st->st_isu[i]
- || spelltab.st_fold[i] != new_st->st_fold[i]
- || spelltab.st_upper[i] != new_st->st_upper[i]) {
- EMSG(_("E763: Word characters differ between spell files"));
- return FAIL;
- }
- }
- } else {
- // copy the new spelltab into the one being used
- spelltab = *new_st;
- did_set_spelltab = true;
+ spelltab.st_isu[i] = mb_isupper(i);
+ spelltab.st_isw[i] = spelltab.st_isu[i] || mb_islower(i);
+ // The folded/upper-cased value is different between latin1 and
+ // utf8 for 0xb5, causing E763 for no good reason. Use the latin1
+ // value for utf-8 to avoid this.
+ spelltab.st_fold[i] = (f < 256) ? f : i;
+ spelltab.st_upper[i] = (u < 256) ? u : i;
}
-
- return OK;
}
/// Returns true if "p" points to a word character.
@@ -8209,23 +2592,25 @@ static bool spell_iswordp(char_u *p, win_T *wp)
int c;
if (has_mbyte) {
- l = MB_BYTE2LEN(*p);
+ l = MB_PTR2LEN(p);
s = p;
if (l == 1) {
// be quick for ASCII
if (wp->w_s->b_spell_ismw[*p])
s = p + 1; // skip a mid-word character
} else {
- c = mb_ptr2char(p);
+ c = utf_ptr2char(p);
if (c < 256 ? wp->w_s->b_spell_ismw[c]
: (wp->w_s->b_spell_ismw_mb != NULL
- && vim_strchr(wp->w_s->b_spell_ismw_mb, c) != NULL))
+ && vim_strchr(wp->w_s->b_spell_ismw_mb, c) != NULL)) {
s = p + l;
+ }
}
- c = mb_ptr2char(s);
- if (c > 255)
+ c = utf_ptr2char(s);
+ if (c > 255) {
return spell_mb_isword_class(mb_get_class(s), wp);
+ }
return spelltab.st_isw[c];
}
@@ -8234,23 +2619,19 @@ static bool spell_iswordp(char_u *p, win_T *wp)
// Returns true if "p" points to a word character.
// Unlike spell_iswordp() this doesn't check for "midword" characters.
-static bool spell_iswordp_nmw(char_u *p, win_T *wp)
+bool spell_iswordp_nmw(const char_u *p, win_T *wp)
{
- int c;
-
- if (has_mbyte) {
- c = mb_ptr2char(p);
- if (c > 255)
- return spell_mb_isword_class(mb_get_class(p), wp);
- return spelltab.st_isw[c];
+ int c = utf_ptr2char(p);
+ if (c > 255) {
+ return spell_mb_isword_class(mb_get_class(p), wp);
}
- return spelltab.st_isw[*p];
+ return spelltab.st_isw[c];
}
// Returns true if word class indicates a word character.
// Only for characters above 255.
// Unicode subscript and superscript are not considered word characters.
-// See also dbcs_class() and utf_class() in mbyte.c.
+// See also utf_class() in mbyte.c.
static bool spell_mb_isword_class(int cl, win_T *wp)
{
if (wp->w_s->b_cjk)
@@ -8273,51 +2654,16 @@ static bool spell_iswordp_w(int *p, win_T *wp)
s = p;
if (*s > 255) {
- if (enc_utf8)
- return spell_mb_isword_class(utf_class(*s), wp);
- if (enc_dbcs)
- return spell_mb_isword_class(
- dbcs_class((unsigned)*s >> 8, *s & 0xff), wp);
- return false;
+ return spell_mb_isword_class(utf_class(*s), wp);
}
return spelltab.st_isw[*s];
}
-// Write the table with prefix conditions to the .spl file.
-// When "fd" is NULL only count the length of what is written.
-static int write_spell_prefcond(FILE *fd, garray_T *gap)
-{
- assert(gap->ga_len >= 0);
-
- if (fd != NULL)
- put_bytes(fd, (uintmax_t)gap->ga_len, 2); // <prefcondcnt>
-
- size_t totlen = 2 + (size_t)gap->ga_len; // <prefcondcnt> and <condlen> bytes
- size_t x = 1; // collect return value of fwrite()
- for (int i = 0; i < gap->ga_len; ++i) {
- // <prefcond> : <condlen> <condstr>
- char_u *p = ((char_u **)gap->ga_data)[i];
- if (p != NULL) {
- size_t len = STRLEN(p);
- if (fd != NULL) {
- assert(len <= INT_MAX);
- fputc((int)len, fd);
- x &= fwrite(p, len, 1, fd);
- }
- totlen += len;
- } else if (fd != NULL)
- fputc(0, fd);
- }
-
- assert(totlen <= INT_MAX);
- return (int)totlen;
-}
-
// Case-fold "str[len]" into "buf[buflen]". The result is NUL terminated.
// Uses the character definitions from the .spl file.
// When using a multi-byte 'encoding' the length may change!
// Returns FAIL when something wrong.
-static int spell_casefold(char_u *str, int len, char_u *buf, int buflen)
+int spell_casefold(char_u *str, int len, char_u *buf, int buflen)
{
int i;
@@ -8337,8 +2683,8 @@ static int spell_casefold(char_u *str, int len, char_u *buf, int buflen)
buf[outi] = NUL;
return FAIL;
}
- c = mb_cptr2char_adv(&p);
- outi += mb_char2bytes(SPELL_TOFOLD(c), buf + outi);
+ c = mb_cptr2char_adv((const char_u **)&p);
+ outi += utf_char2bytes(SPELL_TOFOLD(c), buf + outi);
}
buf[outi] = NUL;
} else {
@@ -8436,11 +2782,12 @@ void spell_suggest(int count)
return;
}
badlen = (int)curwin->w_cursor.col - (int)VIsual.col;
- if (badlen < 0)
+ if (badlen < 0) {
badlen = -badlen;
- else
+ } else {
curwin->w_cursor.col = VIsual.col;
- ++badlen;
+ }
+ badlen++;
end_visual_mode();
} else
// Find the start of the badly spelled word.
@@ -8452,11 +2799,13 @@ void spell_suggest(int count)
line = get_cursor_line_ptr();
p = line + curwin->w_cursor.col;
// Backup to before start of word.
- while (p > line && spell_iswordp_nmw(p, curwin))
- mb_ptr_back(line, p);
+ while (p > line && spell_iswordp_nmw(p, curwin)) {
+ MB_PTR_BACK(line, p);
+ }
// Forward to start of word.
- while (*p != NUL && !spell_iswordp_nmw(p, curwin))
- mb_ptr_adv(p);
+ while (*p != NUL && !spell_iswordp_nmw(p, curwin)) {
+ MB_PTR_ADV(p);
+ }
if (!spell_iswordp_nmw(p, curwin)) { // No word found.
beep_flush();
@@ -8511,7 +2860,7 @@ void spell_suggest(int count)
vim_snprintf((char *)IObuff, IOSIZE, ":ot \"%.*s\" egnahC",
sug.su_badlen, sug.su_badptr);
}
- msg_puts(IObuff);
+ msg_puts((const char *)IObuff);
msg_clr_eos();
msg_putchar('\n');
@@ -8527,18 +2876,19 @@ void spell_suggest(int count)
sug.su_badptr + stp->st_orglen,
sug.su_badlen - stp->st_orglen + 1);
vim_snprintf((char *)IObuff, IOSIZE, "%2d", i + 1);
- if (cmdmsg_rl)
+ if (cmdmsg_rl) {
rl_mirror(IObuff);
- msg_puts(IObuff);
+ }
+ msg_puts((const char *)IObuff);
vim_snprintf((char *)IObuff, IOSIZE, " \"%s\"", wcopy);
- msg_puts(IObuff);
+ msg_puts((const char *)IObuff);
// The word may replace more than "su_badlen".
if (sug.su_badlen < stp->st_orglen) {
vim_snprintf((char *)IObuff, IOSIZE, _(" < \"%.*s\""),
- stp->st_orglen, sug.su_badptr);
- msg_puts(IObuff);
+ stp->st_orglen, sug.su_badptr);
+ msg_puts((const char *)IObuff);
}
if (p_verbose > 0) {
@@ -8554,7 +2904,7 @@ void spell_suggest(int count)
// Mirror the numbers, but keep the leading space.
rl_mirror(IObuff + 1);
msg_advance(30);
- msg_puts(IObuff);
+ msg_puts((const char *)IObuff);
}
msg_putchar('\n');
}
@@ -8593,12 +2943,12 @@ void spell_suggest(int count)
memmove(p, line, c);
STRCPY(p + c, stp->st_word);
STRCAT(p, sug.su_badptr + stp->st_orglen);
- ml_replace(curwin->w_cursor.lnum, p, FALSE);
+ ml_replace(curwin->w_cursor.lnum, p, false);
curwin->w_cursor.col = c;
// For redo we use a change-word command.
ResetRedobuff();
- AppendToRedobuff((char_u *)"ciw");
+ AppendToRedobuff("ciw");
AppendToRedobuffLit(p + c,
stp->st_wordlen + sug.su_badlen - stp->st_orglen);
AppendCharToRedobuff(ESC);
@@ -8628,7 +2978,7 @@ static bool check_need_cap(linenr_T lnum, colnr_T col)
line = get_cursor_line_ptr();
endcol = 0;
- if ((int)(skipwhite(line) - line) >= (int)col) {
+ if (getwhitecols(line) >= (int)col) {
// At start of line, check if previous line is empty or sentence
// ends there.
if (lnum == 1)
@@ -8644,8 +2994,9 @@ static bool check_need_cap(linenr_T lnum, colnr_T col)
endcol = (colnr_T)STRLEN(line);
}
}
- } else
+ } else {
endcol = col;
+ }
if (endcol > 0) {
// Check if sentence ends before the bad word.
@@ -8653,9 +3004,10 @@ static bool check_need_cap(linenr_T lnum, colnr_T col)
regmatch.rm_ic = FALSE;
p = line + endcol;
for (;; ) {
- mb_ptr_back(line, p);
- if (p == line || spell_iswordp_nmw(p, curwin))
+ MB_PTR_BACK(line, p);
+ if (p == line || spell_iswordp_nmw(p, curwin)) {
break;
+ }
if (vim_regexec(&regmatch, p, 0)
&& regmatch.endp[0] == line + endcol) {
need_cap = true;
@@ -8709,7 +3061,7 @@ void ex_spellrepall(exarg_T *eap)
memmove(p, line, curwin->w_cursor.col);
STRCPY(p + curwin->w_cursor.col, repl_to);
STRCAT(p, line + curwin->w_cursor.col + STRLEN(repl_from));
- ml_replace(curwin->w_cursor.lnum, p, FALSE);
+ ml_replace(curwin->w_cursor.lnum, p, false);
changed_bytes(curwin->w_cursor.lnum, curwin->w_cursor.col);
if (curwin->w_cursor.lnum != prev_lnum) {
@@ -8813,8 +3165,13 @@ spell_find_suggest (
if (su->su_badlen >= MAXWLEN)
su->su_badlen = MAXWLEN - 1; // just in case
STRLCPY(su->su_badword, su->su_badptr, su->su_badlen + 1);
- (void)spell_casefold(su->su_badptr, su->su_badlen,
- su->su_fbadword, MAXWLEN);
+ (void)spell_casefold(su->su_badptr, su->su_badlen, su->su_fbadword, MAXWLEN);
+
+ // TODO(vim): make this work if the case-folded text is longer than the
+ // original text. Currently an illegal byte causes wrong pointer
+ // computations.
+ su->su_fbadword[su->su_badlen] = NUL;
+
// get caps flags for bad word
su->su_badflags = badword_captype(su->su_badptr,
su->su_badptr + su->su_badlen);
@@ -8890,26 +3247,26 @@ spell_find_suggest (
// Find suggestions by evaluating expression "expr".
static void spell_suggest_expr(suginfo_T *su, char_u *expr)
{
- list_T *list;
- listitem_T *li;
int score;
- char_u *p;
+ const char *p;
// The work is split up in a few parts to avoid having to export
// suginfo_T.
// First evaluate the expression and get the resulting list.
- list = eval_spell_expr(su->su_badword, expr);
+ list_T *const list = eval_spell_expr(su->su_badword, expr);
if (list != NULL) {
// Loop over the items in the list.
- for (li = list->lv_first; li != NULL; li = li->li_next)
- if (li->li_tv.v_type == VAR_LIST) {
+ TV_LIST_ITER(list, li, {
+ if (TV_LIST_ITEM_TV(li)->v_type == VAR_LIST) {
// Get the word and the score from the items.
- score = get_spellword(li->li_tv.vval.v_list, &p);
- if (score >= 0 && score <= su->su_maxscore)
- add_suggestion(su, &su->su_ga, p, su->su_badlen,
- score, 0, true, su->su_sallang, false);
+ score = get_spellword(TV_LIST_ITEM_TV(li)->vval.v_list, &p);
+ if (score >= 0 && score <= su->su_maxscore) {
+ add_suggestion(su, &su->su_ga, (const char_u *)p, su->su_badlen,
+ score, 0, true, su->su_sallang, false);
+ }
}
- list_unref(list);
+ });
+ tv_list_unref(list);
}
// Remove bogus suggestions, sort and truncate at "maxcount".
@@ -9040,174 +3397,6 @@ static void spell_suggest_intern(suginfo_T *su, bool interactive)
}
}
-// Load the .sug files for languages that have one and weren't loaded yet.
-static void suggest_load_files(void)
-{
- langp_T *lp;
- slang_T *slang;
- char_u *dotp;
- FILE *fd;
- char_u buf[MAXWLEN];
- int i;
- time_t timestamp;
- int wcount;
- int wordnr;
- garray_T ga;
- int c;
-
- // Do this for all languages that support sound folding.
- for (int lpi = 0; lpi < curwin->w_s->b_langp.ga_len; ++lpi) {
- lp = LANGP_ENTRY(curwin->w_s->b_langp, lpi);
- slang = lp->lp_slang;
- if (slang->sl_sugtime != 0 && !slang->sl_sugloaded) {
- // Change ".spl" to ".sug" and open the file. When the file isn't
- // found silently skip it. Do set "sl_sugloaded" so that we
- // don't try again and again.
- slang->sl_sugloaded = true;
-
- dotp = vim_strrchr(slang->sl_fname, '.');
- if (dotp == NULL || fnamecmp(dotp, ".spl") != 0)
- continue;
- STRCPY(dotp, ".sug");
- fd = mch_fopen((char *)slang->sl_fname, "r");
- if (fd == NULL)
- goto nextone;
-
- // <SUGHEADER>: <fileID> <versionnr> <timestamp>
- for (i = 0; i < VIMSUGMAGICL; ++i)
- buf[i] = getc(fd); // <fileID>
- if (STRNCMP(buf, VIMSUGMAGIC, VIMSUGMAGICL) != 0) {
- EMSG2(_("E778: This does not look like a .sug file: %s"),
- slang->sl_fname);
- goto nextone;
- }
- c = getc(fd); // <versionnr>
- if (c < VIMSUGVERSION) {
- EMSG2(_("E779: Old .sug file, needs to be updated: %s"),
- slang->sl_fname);
- goto nextone;
- } else if (c > VIMSUGVERSION) {
- EMSG2(_("E780: .sug file is for newer version of Vim: %s"),
- slang->sl_fname);
- goto nextone;
- }
-
- // Check the timestamp, it must be exactly the same as the one in
- // the .spl file. Otherwise the word numbers won't match.
- timestamp = get8ctime(fd); // <timestamp>
- if (timestamp != slang->sl_sugtime) {
- EMSG2(_("E781: .sug file doesn't match .spl file: %s"),
- slang->sl_fname);
- goto nextone;
- }
-
- // <SUGWORDTREE>: <wordtree>
- // Read the trie with the soundfolded words.
- if (spell_read_tree(fd, &slang->sl_sbyts, &slang->sl_sidxs,
- false, 0) != 0) {
-someerror:
- EMSG2(_("E782: error while reading .sug file: %s"),
- slang->sl_fname);
- slang_clear_sug(slang);
- goto nextone;
- }
-
- // <SUGTABLE>: <sugwcount> <sugline> ...
- //
- // Read the table with word numbers. We use a file buffer for
- // this, because it's so much like a file with lines. Makes it
- // possible to swap the info and save on memory use.
- slang->sl_sugbuf = open_spellbuf();
-
- // <sugwcount>
- wcount = get4c(fd);
- if (wcount < 0)
- goto someerror;
-
- // Read all the wordnr lists into the buffer, one NUL terminated
- // list per line.
- ga_init(&ga, 1, 100);
- for (wordnr = 0; wordnr < wcount; ++wordnr) {
- ga.ga_len = 0;
- for (;; ) {
- c = getc(fd); // <sugline>
- if (c < 0) {
- goto someerror;
- }
- GA_APPEND(char_u, &ga, c);
- if (c == NUL)
- break;
- }
- if (ml_append_buf(slang->sl_sugbuf, (linenr_T)wordnr,
- ga.ga_data, ga.ga_len, TRUE) == FAIL)
- goto someerror;
- }
- ga_clear(&ga);
-
- // Need to put word counts in the word tries, so that we can find
- // a word by its number.
- tree_count_words(slang->sl_fbyts, slang->sl_fidxs);
- tree_count_words(slang->sl_sbyts, slang->sl_sidxs);
-
-nextone:
- if (fd != NULL)
- fclose(fd);
- STRCPY(dotp, ".spl");
- }
- }
-}
-
-// Fill in the wordcount fields for a trie.
-// Returns the total number of words.
-static void tree_count_words(char_u *byts, idx_T *idxs)
-{
- int depth;
- idx_T arridx[MAXWLEN];
- int curi[MAXWLEN];
- int c;
- idx_T n;
- int wordcount[MAXWLEN];
-
- arridx[0] = 0;
- curi[0] = 1;
- wordcount[0] = 0;
- depth = 0;
- while (depth >= 0 && !got_int) {
- if (curi[depth] > byts[arridx[depth]]) {
- // Done all bytes at this node, go up one level.
- idxs[arridx[depth]] = wordcount[depth];
- if (depth > 0)
- wordcount[depth - 1] += wordcount[depth];
-
- --depth;
- fast_breakcheck();
- } else {
- // Do one more byte at this node.
- n = arridx[depth] + curi[depth];
- ++curi[depth];
-
- c = byts[n];
- if (c == 0) {
- // End of word, count it.
- ++wordcount[depth];
-
- // Skip over any other NUL bytes (same word with different
- // flags).
- while (byts[n + 1] == 0) {
- ++n;
- ++curi[depth];
- }
- } else {
- // Normal char, go one level deeper to count the words.
- ++depth;
- arridx[depth] = idxs[n];
- curi[depth] = 1;
- wordcount[depth] = 0;
- }
- }
- }
-}
-
// Free the info put in "*su" by spell_find_suggest().
static void spell_find_cleanup(suginfo_T *su)
{
@@ -9220,35 +3409,31 @@ static void spell_find_cleanup(suginfo_T *su)
hash_clear_all(&su->su_banned, 0);
}
-// Make a copy of "word", with the first letter upper or lower cased, to
-// "wcopy[MAXWLEN]". "word" must not be empty.
-// The result is NUL terminated.
-static void
-onecap_copy (
- char_u *word,
- char_u *wcopy,
- bool upper // true: first letter made upper case
-)
+/// Make a copy of "word", with the first letter upper or lower cased, to
+/// "wcopy[MAXWLEN]". "word" must not be empty.
+/// The result is NUL terminated.
+///
+/// @param[in] word source string to copy
+/// @param[in,out] wcopy copied string, with case of first letter changed
+/// @param[in] upper True to upper case, otherwise lower case
+void onecap_copy(char_u *word, char_u *wcopy, bool upper)
{
char_u *p;
int c;
int l;
p = word;
- if (has_mbyte)
- c = mb_cptr2char_adv(&p);
- else
+ if (has_mbyte) {
+ c = mb_cptr2char_adv((const char_u **)&p);
+ } else {
c = *p++;
- if (upper)
+ }
+ if (upper) {
c = SPELL_TOUPPER(c);
- else
+ } else {
c = SPELL_TOFOLD(c);
- if (has_mbyte)
- l = mb_char2bytes(c, wcopy);
- else {
- l = 1;
- wcopy[0] = c;
}
+ l = utf_char2bytes(c, wcopy);
STRLCPY(wcopy + l, p, MAXWLEN - l);
}
@@ -9262,14 +3447,13 @@ static void allcap_copy(char_u *word, char_u *wcopy)
d = wcopy;
for (s = word; *s != NUL; ) {
- if (has_mbyte)
- c = mb_cptr2char_adv(&s);
- else
+ if (has_mbyte) {
+ c = mb_cptr2char_adv((const char_u **)&s);
+ } else {
c = *s++;
+ }
- // We only change 0xdf to SS when we are certain latin1 is used. It
- // would cause weird errors in other 8-bit encodings.
- if (enc_latin1like && c == 0xdf) {
+ if (c == 0xdf) {
c = 'S';
if (d - wcopy >= MAXWLEN - 1)
break;
@@ -9277,15 +3461,10 @@ static void allcap_copy(char_u *word, char_u *wcopy)
} else
c = SPELL_TOUPPER(c);
- if (has_mbyte) {
- if (d - wcopy >= MAXWLEN - MB_MAXBYTES)
- break;
- d += mb_char2bytes(c, d);
- } else {
- if (d - wcopy >= MAXWLEN - 1)
- break;
- *d++ = c;
+ if (d - wcopy >= MAXWLEN - MB_MAXBYTES) {
+ break;
}
+ d += utf_char2bytes(c, d);
}
*d = NUL;
}
@@ -9477,7 +3656,7 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so
// word).
depth = 0;
sp = &stack[0];
- memset(sp, 0, sizeof(trystate_T));
+ memset(sp, 0, sizeof(trystate_T)); // -V512
sp->ts_curi = 1;
if (soundfold) {
@@ -9695,7 +3874,7 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so
// Get pointer to last char of previous word.
p = preword + sp->ts_prewordlen;
- mb_ptr_back(preword, p);
+ MB_PTR_BACK(preword, p);
}
}
@@ -9781,12 +3960,13 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so
// Give a penalty when changing non-word char to word
// char, e.g., "thes," -> "these".
p = fword + sp->ts_fidx;
- mb_ptr_back(fword, p);
+ MB_PTR_BACK(fword, p);
if (!spell_iswordp(p, curwin)) {
p = preword + STRLEN(preword);
- mb_ptr_back(preword, p);
- if (spell_iswordp(p, curwin))
+ MB_PTR_BACK(preword, p);
+ if (spell_iswordp(p, curwin)) {
newscore += SCORE_NONWORD;
+ }
}
// Give a bonus to words seen before.
@@ -9952,10 +4132,7 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so
&& goodword_ends) {
int l;
- if (has_mbyte)
- l = MB_BYTE2LEN(fword[sp->ts_fidx]);
- else
- l = 1;
+ l = MB_PTR2LEN(fword + sp->ts_fidx);
if (fword_ends) {
// Copy the skipped character to preword.
memmove(preword + sp->ts_prewordlen,
@@ -10027,7 +4204,7 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so
}
PROF_STORE(sp->ts_state)
sp->ts_state = STATE_PLAIN;
- // FALLTHROUGH
+ FALLTHROUGH;
case STATE_PLAIN:
// Go over all possible bytes at this node, add each to tword[]
@@ -10101,40 +4278,33 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so
// Correct ts_fidx for the byte length of the
// character (we didn't check that before).
sp->ts_fidx = sp->ts_fcharstart
- + MB_BYTE2LEN(
- fword[sp->ts_fcharstart]);
+ + MB_PTR2LEN(fword + sp->ts_fcharstart);
// For changing a composing character adjust
// the score from SCORE_SUBST to
// SCORE_SUBCOMP.
if (enc_utf8
- && utf_iscomposing(
- mb_ptr2char(tword
- + sp->ts_twordlen
- - sp->ts_tcharlen))
- && utf_iscomposing(
- mb_ptr2char(fword
- + sp->ts_fcharstart)))
- sp->ts_score -=
- SCORE_SUBST - SCORE_SUBCOMP;
-
- // For a similar character adjust score from
- // SCORE_SUBST to SCORE_SIMILAR.
- else if (!soundfold
- && slang->sl_has_map
- && similar_chars(slang,
- mb_ptr2char(tword
- + sp->ts_twordlen
- - sp->ts_tcharlen),
- mb_ptr2char(fword
- + sp->ts_fcharstart)))
- sp->ts_score -=
- SCORE_SUBST - SCORE_SIMILAR;
+ && utf_iscomposing(utf_ptr2char(tword + sp->ts_twordlen
+ - sp->ts_tcharlen))
+ && utf_iscomposing(utf_ptr2char(fword
+ + sp->ts_fcharstart))) {
+ sp->ts_score -= SCORE_SUBST - SCORE_SUBCOMP;
+ } else if (
+ !soundfold
+ && slang->sl_has_map
+ && similar_chars(
+ slang,
+ utf_ptr2char(tword + sp->ts_twordlen - sp->ts_tcharlen),
+ utf_ptr2char(fword + sp->ts_fcharstart))) {
+ // For a similar character adjust score from
+ // SCORE_SUBST to SCORE_SIMILAR.
+ sp->ts_score -= SCORE_SUBST - SCORE_SIMILAR;
+ }
} else if (sp->ts_isdiff == DIFF_INSERT
&& sp->ts_twordlen > sp->ts_tcharlen) {
p = tword + sp->ts_twordlen - sp->ts_tcharlen;
- c = mb_ptr2char(p);
- if (enc_utf8 && utf_iscomposing(c)) {
+ c = utf_ptr2char(p);
+ if (utf_iscomposing(c)) {
// Inserting a composing char doesn't
// count that much.
sp->ts_score -= SCORE_INS - SCORE_INSCOMP;
@@ -10144,10 +4314,10 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so
// to the score. Also for the soundfold
// tree (might seem illogical but does
// give better scores).
- mb_ptr_back(tword, p);
- if (c == mb_ptr2char(p))
- sp->ts_score -= SCORE_INS
- - SCORE_INSDUP;
+ MB_PTR_BACK(tword, p);
+ if (c == utf_ptr2char(p)) {
+ sp->ts_score -= SCORE_INS - SCORE_INSDUP;
+ }
}
}
@@ -10206,21 +4376,17 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so
// score if the same character is following "nn" -> "n". It's
// a bit illogical for soundfold tree but it does give better
// results.
- if (has_mbyte) {
- c = mb_ptr2char(fword + sp->ts_fidx);
- stack[depth].ts_fidx += MB_BYTE2LEN(fword[sp->ts_fidx]);
- if (enc_utf8 && utf_iscomposing(c))
- stack[depth].ts_score -= SCORE_DEL - SCORE_DELCOMP;
- else if (c == mb_ptr2char(fword + stack[depth].ts_fidx))
- stack[depth].ts_score -= SCORE_DEL - SCORE_DELDUP;
- } else {
- ++stack[depth].ts_fidx;
- if (fword[sp->ts_fidx] == fword[sp->ts_fidx + 1])
- stack[depth].ts_score -= SCORE_DEL - SCORE_DELDUP;
+ c = utf_ptr2char(fword + sp->ts_fidx);
+ stack[depth].ts_fidx += MB_PTR2LEN(fword + sp->ts_fidx);
+ if (utf_iscomposing(c)) {
+ stack[depth].ts_score -= SCORE_DEL - SCORE_DELCOMP;
+ } else if (c == utf_ptr2char(fword + stack[depth].ts_fidx)) {
+ stack[depth].ts_score -= SCORE_DEL - SCORE_DELDUP;
}
+
break;
}
- // FALLTHROUGH
+ FALLTHROUGH;
case STATE_INS_PREP:
if (sp->ts_flags & TSF_DIDDEL) {
@@ -10250,7 +4416,7 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so
}
break;
- // FALLTHROUGH
+ FALLTHROUGH;
case STATE_INS:
// Insert one byte. Repeat this for each possible byte at this
@@ -10332,22 +4498,14 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so
break;
}
- if (has_mbyte) {
- n = mb_cptr2len(p);
- c = mb_ptr2char(p);
- if (p[n] == NUL)
- c2 = NUL;
- else if (!soundfold && !spell_iswordp(p + n, curwin))
- c2 = c; // don't swap non-word char
- else
- c2 = mb_ptr2char(p + n);
+ n = MB_CPTR2LEN(p);
+ c = utf_ptr2char(p);
+ if (p[n] == NUL) {
+ c2 = NUL;
+ } else if (!soundfold && !spell_iswordp(p + n, curwin)) {
+ c2 = c; // don't swap non-word char
} else {
- if (p[1] == NUL)
- c2 = NUL;
- else if (!soundfold && !spell_iswordp(p + 1, curwin))
- c2 = c; // don't swap non-word char
- else
- c2 = p[1];
+ c2 = utf_ptr2char(p + n);
}
// When the second character is NUL we can't swap.
@@ -10367,64 +4525,47 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so
if (c2 != NUL && TRY_DEEPER(su, stack, depth, SCORE_SWAP)) {
go_deeper(stack, depth, SCORE_SWAP);
#ifdef DEBUG_TRIEWALK
- sprintf(changename[depth], "%.*s-%s: swap %c and %c",
- sp->ts_twordlen, tword, fword + sp->ts_fidx,
- c, c2);
+ snprintf(changename[depth], sizeof(changename[0]),
+ "%.*s-%s: swap %c and %c",
+ sp->ts_twordlen, tword, fword + sp->ts_fidx,
+ c, c2);
#endif
PROF_STORE(sp->ts_state)
sp->ts_state = STATE_UNSWAP;
- ++depth;
- if (has_mbyte) {
- fl = mb_char2len(c2);
- memmove(p, p + n, fl);
- mb_char2bytes(c, p + fl);
- stack[depth].ts_fidxtry = sp->ts_fidx + n + fl;
- } else {
- p[0] = c2;
- p[1] = c;
- stack[depth].ts_fidxtry = sp->ts_fidx + 2;
- }
- } else
+ depth++;
+ fl = mb_char2len(c2);
+ memmove(p, p + n, fl);
+ utf_char2bytes(c, p + fl);
+ stack[depth].ts_fidxtry = sp->ts_fidx + n + fl;
+ } else {
// If this swap doesn't work then SWAP3 won't either.
PROF_STORE(sp->ts_state)
sp->ts_state = STATE_REP_INI;
+ }
break;
case STATE_UNSWAP:
// Undo the STATE_SWAP swap: "21" -> "12".
p = fword + sp->ts_fidx;
- if (has_mbyte) {
- n = MB_BYTE2LEN(*p);
- c = mb_ptr2char(p + n);
- memmove(p + MB_BYTE2LEN(p[n]), p, n);
- mb_char2bytes(c, p);
- } else {
- c = *p;
- *p = p[1];
- p[1] = c;
- }
- // FALLTHROUGH
+ n = MB_PTR2LEN(p);
+ c = utf_ptr2char(p + n);
+ memmove(p + MB_PTR2LEN(p + n), p, n);
+ utf_char2bytes(c, p);
+
+ FALLTHROUGH;
case STATE_SWAP3:
// Swap two bytes, skipping one: "123" -> "321". We change
// "fword" here, it's changed back afterwards at STATE_UNSWAP3.
p = fword + sp->ts_fidx;
- if (has_mbyte) {
- n = mb_cptr2len(p);
- c = mb_ptr2char(p);
- fl = mb_cptr2len(p + n);
- c2 = mb_ptr2char(p + n);
- if (!soundfold && !spell_iswordp(p + n + fl, curwin))
- c3 = c; // don't swap non-word char
- else
- c3 = mb_ptr2char(p + n + fl);
+ n = MB_CPTR2LEN(p);
+ c = utf_ptr2char(p);
+ fl = MB_CPTR2LEN(p + n);
+ c2 = utf_ptr2char(p + n);
+ if (!soundfold && !spell_iswordp(p + n + fl, curwin)) {
+ c3 = c; // don't swap non-word char
} else {
- c = *p;
- c2 = p[1];
- if (!soundfold && !spell_iswordp(p + 2, curwin))
- c3 = c; // don't swap non-word char
- else
- c3 = p[2];
+ c3 = utf_ptr2char(p + n + fl);
}
// When characters are identical: "121" then SWAP3 result is
@@ -10447,18 +4588,12 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so
#endif
PROF_STORE(sp->ts_state)
sp->ts_state = STATE_UNSWAP3;
- ++depth;
- if (has_mbyte) {
- tl = mb_char2len(c3);
- memmove(p, p + n + fl, tl);
- mb_char2bytes(c2, p + tl);
- mb_char2bytes(c, p + fl + tl);
- stack[depth].ts_fidxtry = sp->ts_fidx + n + fl + tl;
- } else {
- p[0] = p[2];
- p[2] = c;
- stack[depth].ts_fidxtry = sp->ts_fidx + 3;
- }
+ depth++;
+ tl = mb_char2len(c3);
+ memmove(p, p + n + fl, tl);
+ utf_char2bytes(c2, p + tl);
+ utf_char2bytes(c, p + fl + tl);
+ stack[depth].ts_fidxtry = sp->ts_fidx + n + fl + tl;
} else {
PROF_STORE(sp->ts_state)
sp->ts_state = STATE_REP_INI;
@@ -10468,22 +4603,15 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so
case STATE_UNSWAP3:
// Undo STATE_SWAP3: "321" -> "123"
p = fword + sp->ts_fidx;
- if (has_mbyte) {
- n = MB_BYTE2LEN(*p);
- c2 = mb_ptr2char(p + n);
- fl = MB_BYTE2LEN(p[n]);
- c = mb_ptr2char(p + n + fl);
- tl = MB_BYTE2LEN(p[n + fl]);
- memmove(p + fl + tl, p, n);
- mb_char2bytes(c, p);
- mb_char2bytes(c2, p + tl);
- p = p + tl;
- } else {
- c = *p;
- *p = p[2];
- p[2] = c;
- ++p;
- }
+ n = MB_PTR2LEN(p);
+ c2 = utf_ptr2char(p + n);
+ fl = MB_PTR2LEN(p + n);
+ c = utf_ptr2char(p + n + fl);
+ tl = MB_PTR2LEN(p + n + fl);
+ memmove(p + fl + tl, p, n);
+ utf_char2bytes(c, p);
+ utf_char2bytes(c2, p + tl);
+ p = p + tl;
if (!soundfold && !spell_iswordp(p, curwin)) {
// Middle char is not a word char, skip the rotate. First and
@@ -10507,21 +4635,13 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so
sp->ts_state = STATE_UNROT3L;
++depth;
p = fword + sp->ts_fidx;
- if (has_mbyte) {
- n = mb_cptr2len(p);
- c = mb_ptr2char(p);
- fl = mb_cptr2len(p + n);
- fl += mb_cptr2len(p + n + fl);
- memmove(p, p + n, fl);
- mb_char2bytes(c, p + fl);
- stack[depth].ts_fidxtry = sp->ts_fidx + n + fl;
- } else {
- c = *p;
- *p = p[1];
- p[1] = p[2];
- p[2] = c;
- stack[depth].ts_fidxtry = sp->ts_fidx + 3;
- }
+ n = MB_CPTR2LEN(p);
+ c = utf_ptr2char(p);
+ fl = MB_CPTR2LEN(p + n);
+ fl += MB_CPTR2LEN(p + n + fl);
+ memmove(p, p + n, fl);
+ utf_char2bytes(c, p + fl);
+ stack[depth].ts_fidxtry = sp->ts_fidx + n + fl;
} else {
PROF_STORE(sp->ts_state)
sp->ts_state = STATE_REP_INI;
@@ -10531,19 +4651,12 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so
case STATE_UNROT3L:
// Undo ROT3L: "231" -> "123"
p = fword + sp->ts_fidx;
- if (has_mbyte) {
- n = MB_BYTE2LEN(*p);
- n += MB_BYTE2LEN(p[n]);
- c = mb_ptr2char(p + n);
- tl = MB_BYTE2LEN(p[n]);
- memmove(p + tl, p, n);
- mb_char2bytes(c, p);
- } else {
- c = p[2];
- p[2] = p[1];
- p[1] = *p;
- *p = c;
- }
+ n = MB_PTR2LEN(p);
+ n += MB_PTR2LEN(p + n);
+ c = utf_ptr2char(p + n);
+ tl = MB_PTR2LEN(p + n);
+ memmove(p + tl, p, n);
+ utf_char2bytes(c, p);
// Rotate three bytes right: "123" -> "312". We change "fword"
// here, it's changed back afterwards at STATE_UNROT3R.
@@ -10559,21 +4672,13 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so
sp->ts_state = STATE_UNROT3R;
++depth;
p = fword + sp->ts_fidx;
- if (has_mbyte) {
- n = mb_cptr2len(p);
- n += mb_cptr2len(p + n);
- c = mb_ptr2char(p + n);
- tl = mb_cptr2len(p + n);
- memmove(p + tl, p, n);
- mb_char2bytes(c, p);
- stack[depth].ts_fidxtry = sp->ts_fidx + n + tl;
- } else {
- c = p[2];
- p[2] = p[1];
- p[1] = *p;
- *p = c;
- stack[depth].ts_fidxtry = sp->ts_fidx + 3;
- }
+ n = MB_CPTR2LEN(p);
+ n += MB_CPTR2LEN(p + n);
+ c = utf_ptr2char(p + n);
+ tl = MB_CPTR2LEN(p + n);
+ memmove(p + tl, p, n);
+ utf_char2bytes(c, p);
+ stack[depth].ts_fidxtry = sp->ts_fidx + n + tl;
} else {
PROF_STORE(sp->ts_state)
sp->ts_state = STATE_REP_INI;
@@ -10583,20 +4688,14 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so
case STATE_UNROT3R:
// Undo ROT3R: "312" -> "123"
p = fword + sp->ts_fidx;
- if (has_mbyte) {
- c = mb_ptr2char(p);
- tl = MB_BYTE2LEN(*p);
- n = MB_BYTE2LEN(p[tl]);
- n += MB_BYTE2LEN(p[tl + n]);
- memmove(p, p + tl, n);
- mb_char2bytes(c, p + n);
- } else {
- c = *p;
- *p = p[1];
- p[1] = p[2];
- p[2] = c;
- }
- // FALLTHROUGH
+ c = utf_ptr2char(p);
+ tl = MB_PTR2LEN(p);
+ n = MB_PTR2LEN(p + tl);
+ n += MB_PTR2LEN(p + tl + n);
+ memmove(p, p + tl, n);
+ utf_char2bytes(c, p + n);
+
+ FALLTHROUGH;
case STATE_REP_INI:
// Check if matching with REP items from the .aff file would work.
@@ -10627,7 +4726,7 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so
PROF_STORE(sp->ts_state)
sp->ts_state = STATE_REP;
- // FALLTHROUGH
+ FALLTHROUGH;
case STATE_REP:
// Try matching with REP items from the .aff file. For each match
@@ -10736,10 +4835,12 @@ static int nofold_len(char_u *fword, int flen, char_u *word)
char_u *p;
int i = 0;
- for (p = fword; p < fword + flen; mb_ptr_adv(p))
- ++i;
- for (p = word; i > 0; mb_ptr_adv(p))
- --i;
+ for (p = fword; p < fword + flen; MB_PTR_ADV(p)) {
+ i++;
+ }
+ for (p = word; i > 0; MB_PTR_ADV(p)) {
+ i--;
+ }
return (int)(p - word);
}
@@ -10806,10 +4907,11 @@ static void find_keepcap_word(slang_T *slang, char_u *fword, char_u *kword)
// round[depth] == 1: Try using the folded-case character.
// round[depth] == 2: Try using the upper-case character.
if (has_mbyte) {
- flen = mb_cptr2len(fword + fwordidx[depth]);
- ulen = mb_cptr2len(uword + uwordidx[depth]);
- } else
+ flen = MB_CPTR2LEN(fword + fwordidx[depth]);
+ ulen = MB_CPTR2LEN(uword + uwordidx[depth]);
+ } else {
ulen = flen = 1;
+ }
if (round[depth] == 1) {
p = fword + fwordidx[depth];
l = flen;
@@ -11180,11 +5282,13 @@ add_sound_suggest (
// the words that have a better score than before. Use a hashtable to
// remember the words that have been done.
hash = hash_hash(goodword);
- hi = hash_lookup(&slang->sl_sounddone, goodword, hash);
+ const size_t goodword_len = STRLEN(goodword);
+ hi = hash_lookup(&slang->sl_sounddone, (const char *)goodword, goodword_len,
+ hash);
if (HASHITEM_EMPTY(hi)) {
- sft = xmalloc(sizeof(sftword_T) + STRLEN(goodword));
+ sft = xmalloc(sizeof(sftword_T) + goodword_len);
sft->sft_score = score;
- STRCPY(sft->sft_word, goodword);
+ memcpy(sft->sft_word, goodword, goodword_len + 1);
hash_add_item(&slang->sl_sounddone, hi, sft->sft_word, hash);
} else {
sft = HI2SFT(hi);
@@ -11196,7 +5300,7 @@ add_sound_suggest (
// Find the word nr in the soundfold tree.
sfwordnr = soundfold_find(slang, goodword);
if (sfwordnr < 0) {
- EMSG2(_(e_intern2), "add_sound_suggest()");
+ internal_error("add_sound_suggest()");
return;
}
@@ -11405,67 +5509,6 @@ static void make_case_word(char_u *fword, char_u *cword, int flags)
STRCPY(cword, fword);
}
-// Use map string "map" for languages "lp".
-static void set_map_str(slang_T *lp, char_u *map)
-{
- char_u *p;
- int headc = 0;
- int c;
- int i;
-
- if (*map == NUL) {
- lp->sl_has_map = false;
- return;
- }
- lp->sl_has_map = true;
-
- // Init the array and hash tables empty.
- for (i = 0; i < 256; ++i)
- lp->sl_map_array[i] = 0;
- hash_init(&lp->sl_map_hash);
-
- // The similar characters are stored separated with slashes:
- // "aaa/bbb/ccc/". Fill sl_map_array[c] with the character before c and
- // before the same slash. For characters above 255 sl_map_hash is used.
- for (p = map; *p != NUL; ) {
- c = mb_cptr2char_adv(&p);
- if (c == '/')
- headc = 0;
- else {
- if (headc == 0)
- headc = c;
-
- // Characters above 255 don't fit in sl_map_array[], put them in
- // the hash table. Each entry is the char, a NUL the headchar and
- // a NUL.
- if (c >= 256) {
- int cl = mb_char2len(c);
- int headcl = mb_char2len(headc);
- char_u *b;
- hash_T hash;
- hashitem_T *hi;
-
- b = xmalloc(cl + headcl + 2);
- mb_char2bytes(c, b);
- b[cl] = NUL;
- mb_char2bytes(headc, b + cl + 1);
- b[cl + 1 + headcl] = NUL;
- hash = hash_hash(b);
- hi = hash_lookup(&lp->sl_map_hash, b, hash);
- if (HASHITEM_EMPTY(hi))
- hash_add_item(&lp->sl_map_hash, hi, b, hash);
- else {
- // This should have been checked when generating the .spl
- // file.
- EMSG(_("E783: duplicate char in MAP entry"));
- xfree(b);
- }
- } else
- lp->sl_map_array[c] = headc;
- }
- }
-}
-
// Returns true if "c1" and "c2" are similar characters according to the MAP
// lines in the .aff file.
static bool similar_chars(slang_T *slang, int c1, int c2)
@@ -11475,27 +5518,31 @@ static bool similar_chars(slang_T *slang, int c1, int c2)
hashitem_T *hi;
if (c1 >= 256) {
- buf[mb_char2bytes(c1, buf)] = 0;
+ buf[utf_char2bytes(c1, buf)] = 0;
hi = hash_find(&slang->sl_map_hash, buf);
- if (HASHITEM_EMPTY(hi))
+ if (HASHITEM_EMPTY(hi)) {
m1 = 0;
- else
- m1 = mb_ptr2char(hi->hi_key + STRLEN(hi->hi_key) + 1);
- } else
+ } else {
+ m1 = utf_ptr2char(hi->hi_key + STRLEN(hi->hi_key) + 1);
+ }
+ } else {
m1 = slang->sl_map_array[c1];
- if (m1 == 0)
+ }
+ if (m1 == 0) {
return false;
-
+ }
if (c2 >= 256) {
- buf[mb_char2bytes(c2, buf)] = 0;
+ buf[utf_char2bytes(c2, buf)] = 0;
hi = hash_find(&slang->sl_map_hash, buf);
- if (HASHITEM_EMPTY(hi))
+ if (HASHITEM_EMPTY(hi)) {
m2 = 0;
- else
- m2 = mb_ptr2char(hi->hi_key + STRLEN(hi->hi_key) + 1);
- } else
+ } else {
+ m2 = utf_ptr2char(hi->hi_key + STRLEN(hi->hi_key) + 1);
+ }
+ } else {
m2 = slang->sl_map_array[c2];
+ }
return m1 == m2;
}
@@ -11506,7 +5553,7 @@ static void
add_suggestion (
suginfo_T *su,
garray_T *gap, // either su_ga or su_sga
- char_u *goodword,
+ const char_u *goodword,
int badlenarg, // len of bad word replaced with "goodword"
int score,
int altscore,
@@ -11520,25 +5567,21 @@ add_suggestion (
int badlen; // len of bad word changed
suggest_T *stp;
suggest_T new_sug;
- int i;
- char_u *pgood, *pbad;
// Minimize "badlen" for consistency. Avoids that changing "the the" to
// "thee the" is added next to changing the first "the" the "thee".
- pgood = goodword + STRLEN(goodword);
- pbad = su->su_badptr + badlenarg;
+ const char_u *pgood = goodword + STRLEN(goodword);
+ char_u *pbad = su->su_badptr + badlenarg;
for (;; ) {
goodlen = (int)(pgood - goodword);
badlen = (int)(pbad - su->su_badptr);
if (goodlen <= 0 || badlen <= 0)
break;
- mb_ptr_back(goodword, pgood);
- mb_ptr_back(su->su_badptr, pbad);
- if (has_mbyte) {
- if (mb_ptr2char(pgood) != mb_ptr2char(pbad))
- break;
- } else if (*pgood != *pbad)
+ MB_PTR_BACK(goodword, pgood);
+ MB_PTR_BACK(su->su_badptr, pbad);
+ if (utf_ptr2char(pgood) != utf_ptr2char(pbad)) {
break;
+ }
}
if (badlen == 0 && goodlen == 0)
@@ -11546,9 +5589,10 @@ add_suggestion (
// the first "the" to itself.
return;
- if (GA_EMPTY(gap))
+ int i;
+ if (GA_EMPTY(gap)) {
i = -1;
- else {
+ } else {
// Check if the word is already there. Also check the length that is
// being replaced "thes," -> "these" is a different suggestion from
// "thes" -> "these".
@@ -11659,9 +5703,10 @@ static void add_banned(suginfo_T *su, char_u *word)
hashitem_T *hi;
hash = hash_hash(word);
- hi = hash_lookup(&su->su_banned, word, hash);
+ const size_t word_len = STRLEN(word);
+ hi = hash_lookup(&su->su_banned, (const char *)word, word_len, hash);
if (HASHITEM_EMPTY(hi)) {
- s = vim_strsave(word);
+ s = xmemdupz(word, word_len);
hash_add_item(&su->su_banned, hi, s, hash);
}
}
@@ -11746,46 +5791,49 @@ cleanup_suggestions (
return maxscore;
}
-// Soundfold a string, for soundfold().
-// Result is in allocated memory, NULL for an error.
-char_u *eval_soundfold(char_u *word)
+/// Soundfold a string, for soundfold()
+///
+/// @param[in] word Word to soundfold.
+///
+/// @return [allocated] soundfolded string or NULL in case of error. May return
+/// copy of the input string if soundfolding is not
+/// supported by any of the languages in &spellang.
+char *eval_soundfold(const char *const word)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_MALLOC FUNC_ATTR_NONNULL_ALL
{
- langp_T *lp;
- char_u sound[MAXWLEN];
-
if (curwin->w_p_spell && *curwin->w_s->b_p_spl != NUL) {
// Use the sound-folding of the first language that supports it.
- for (int lpi = 0; lpi < curwin->w_s->b_langp.ga_len; ++lpi) {
- lp = LANGP_ENTRY(curwin->w_s->b_langp, lpi);
+ for (int lpi = 0; lpi < curwin->w_s->b_langp.ga_len; lpi++) {
+ langp_T *const lp = LANGP_ENTRY(curwin->w_s->b_langp, lpi);
if (!GA_EMPTY(&lp->lp_slang->sl_sal)) {
// soundfold the word
- spell_soundfold(lp->lp_slang, word, false, sound);
- return vim_strsave(sound);
+ char_u sound[MAXWLEN];
+ spell_soundfold(lp->lp_slang, (char_u *)word, false, sound);
+ return xstrdup((const char *)sound);
}
}
}
// No language with sound folding, return word as-is.
- return vim_strsave(word);
+ return xstrdup(word);
}
-// Turn "inword" into its sound-a-like equivalent in "res[MAXWLEN]".
-//
-// There are many ways to turn a word into a sound-a-like representation. The
-// oldest is Soundex (1918!). A nice overview can be found in "Approximate
-// swedish name matching - survey and test of different algorithms" by Klas
-// Erikson.
-//
-// We support two methods:
-// 1. SOFOFROM/SOFOTO do a simple character mapping.
-// 2. SAL items define a more advanced sound-folding (and much slower).
-static void
-spell_soundfold (
- slang_T *slang,
- char_u *inword,
- bool folded, // "inword" is already case-folded
- char_u *res
-)
+/// Turn "inword" into its sound-a-like equivalent in "res[MAXWLEN]".
+///
+/// There are many ways to turn a word into a sound-a-like representation. The
+/// oldest is Soundex (1918!). A nice overview can be found in "Approximate
+/// swedish name matching - survey and test of different algorithms" by Klas
+/// Erikson.
+///
+/// We support two methods:
+/// 1. SOFOFROM/SOFOTO do a simple character mapping.
+/// 2. SAL items define a more advanced sound-folding (and much slower).
+///
+/// @param[in] slang
+/// @param[in] inword word to soundfold
+/// @param[in] folded whether inword is already case-folded
+/// @param[in,out] res destination for soundfolded word
+void spell_soundfold(slang_T *slang, char_u *inword, bool folded, char_u *res)
{
char_u fword[MAXWLEN];
char_u *word;
@@ -11824,12 +5872,12 @@ static void spell_soundfold_sofo(slang_T *slang, char_u *inword, char_u *res)
// The sl_sal_first[] table contains the translation for chars up to
// 255, sl_sal the rest.
for (s = inword; *s != NUL; ) {
- c = mb_cptr2char_adv(&s);
- if (enc_utf8 ? utf_class(c) == 0 : ascii_iswhite(c))
+ c = mb_cptr2char_adv((const char_u **)&s);
+ if (enc_utf8 ? utf_class(c) == 0 : ascii_iswhite(c)) {
c = ' ';
- else if (c < 256)
+ } else if (c < 256) {
c = slang->sl_sal_first[c];
- else {
+ } else {
ip = ((int **)slang->sl_sal.ga_data)[c & 0xff];
if (ip == NULL) // empty list, can't match
c = NUL;
@@ -11848,9 +5896,10 @@ static void spell_soundfold_sofo(slang_T *slang, char_u *inword, char_u *res)
}
if (c != NUL && c != prevc) {
- ri += mb_char2bytes(c, res + ri);
- if (ri + MB_MAXBYTES > MAXWLEN)
+ ri += utf_char2bytes(c, res + ri);
+ if (ri + MB_MAXBYTES > MAXWLEN) {
break;
+ }
prevc = c;
}
}
@@ -12114,9 +6163,7 @@ static void spell_soundfold_wsal(slang_T *slang, char_u *inword, char_u *res)
int word[MAXWLEN];
int wres[MAXWLEN];
int l;
- char_u *s;
int *ws;
- char_u *t;
int *pf;
int i, j, z;
int reslen;
@@ -12136,9 +6183,9 @@ static void spell_soundfold_wsal(slang_T *slang, char_u *inword, char_u *res)
// Remove accents, if wanted. We actually remove all non-word characters.
// But keep white space.
wordlen = 0;
- for (s = inword; *s != NUL; ) {
- t = s;
- c = mb_cptr2char_adv(&s);
+ for (const char_u *s = inword; *s != NUL; ) {
+ const char_u *t = s;
+ c = mb_cptr2char_adv((const char_u **)&s);
if (slang->sl_rem_accents) {
if (enc_utf8 ? utf_class(c) == 0 : ascii_iswhite(c)) {
if (did_white)
@@ -12147,8 +6194,9 @@ static void spell_soundfold_wsal(slang_T *slang, char_u *inword, char_u *res)
did_white = true;
} else {
did_white = false;
- if (!spell_iswordp_nmw(t, curwin))
+ if (!spell_iswordp_nmw(t, curwin)) {
continue;
+ }
}
}
word[wordlen++] = c;
@@ -12195,7 +6243,7 @@ static void spell_soundfold_wsal(slang_T *slang, char_u *inword, char_u *res)
continue;
++k;
}
- s = smp[n].sm_rules;
+ char_u *s = smp[n].sm_rules;
pri = 5; // default priority
p0 = *s;
@@ -12371,10 +6419,11 @@ static void spell_soundfold_wsal(slang_T *slang, char_u *inword, char_u *res)
// Convert wide characters in "wres" to a multi-byte string in "res".
l = 0;
- for (n = 0; n < reslen; ++n) {
- l += mb_char2bytes(wres[n], res + l);
- if (l + MB_MAXBYTES > MAXWLEN)
+ for (n = 0; n < reslen; n++) {
+ l += utf_char2bytes(wres[n], res + l);
+ if (l + MB_MAXBYTES > MAXWLEN) {
break;
+ }
}
res[l] = NUL;
}
@@ -12594,25 +6643,30 @@ soundalike_score (
// support multi-byte characters.
static int spell_edit_score(slang_T *slang, char_u *badword, char_u *goodword)
{
- int *cnt;
- int badlen, goodlen; // lengths including NUL
+ int *cnt;
int j, i;
int t;
int bc, gc;
int pbc, pgc;
- char_u *p;
int wbadword[MAXWLEN];
int wgoodword[MAXWLEN];
- const int l_has_mbyte = has_mbyte;
+ const bool l_has_mbyte = has_mbyte;
+ // Lengths with NUL.
+ int badlen;
+ int goodlen;
if (l_has_mbyte) {
// Get the characters from the multi-byte strings and put them in an
// int array for easy access.
- for (p = badword, badlen = 0; *p != NUL; )
+ badlen = 0;
+ for (const char_u *p = badword; *p != NUL; ) {
wbadword[badlen++] = mb_cptr2char_adv(&p);
+ }
wbadword[badlen++] = 0;
- for (p = goodword, goodlen = 0; *p != NUL; )
+ goodlen = 0;
+ for (const char_u *p = goodword; *p != NUL; ) {
wgoodword[goodlen++] = mb_cptr2char_adv(&p);
+ }
wgoodword[goodlen++] = 0;
} else {
badlen = (int)STRLEN(badword) + 1;
@@ -12846,19 +6900,20 @@ static int spell_edit_score_limit_w(slang_T *slang, char_u *badword, char_u *goo
int score_off;
int minscore;
int round;
- char_u *p;
int wbadword[MAXWLEN];
int wgoodword[MAXWLEN];
// Get the characters from the multi-byte strings and put them in an
// int array for easy access.
bi = 0;
- for (p = badword; *p != NUL; )
+ for (const char_u *p = badword; *p != NUL; ) {
wbadword[bi++] = mb_cptr2char_adv(&p);
+ }
wbadword[bi++] = 0;
gi = 0;
- for (p = goodword; *p != NUL; )
+ for (const char_u *p = goodword; *p != NUL; ) {
wgoodword[gi++] = mb_cptr2char_adv(&p);
+ }
wgoodword[gi++] = 0;
// The idea is to go from start to end over the words. So long as
@@ -12993,19 +7048,17 @@ pop:
// ":spellinfo"
void ex_spellinfo(exarg_T *eap)
{
- langp_T *lp;
- char_u *p;
-
- if (no_spell_checking(curwin))
+ if (no_spell_checking(curwin)) {
return;
+ }
msg_start();
- for (int lpi = 0; lpi < curwin->w_s->b_langp.ga_len && !got_int; ++lpi) {
- lp = LANGP_ENTRY(curwin->w_s->b_langp, lpi);
- msg_puts((char_u *)"file: ");
- msg_puts(lp->lp_slang->sl_fname);
+ for (int lpi = 0; lpi < curwin->w_s->b_langp.ga_len && !got_int; lpi++) {
+ langp_T *const lp = LANGP_ENTRY(curwin->w_s->b_langp, lpi);
+ msg_puts("file: ");
+ msg_puts((const char *)lp->lp_slang->sl_fname);
msg_putchar('\n');
- p = lp->lp_slang->sl_info;
+ const char *const p = (const char *)lp->lp_slang->sl_info;
if (p != NULL) {
msg_puts(p);
msg_putchar('\n');
@@ -13026,20 +7079,22 @@ void ex_spelldump(exarg_T *eap)
char_u *spl;
long dummy;
- if (no_spell_checking(curwin))
+ if (no_spell_checking(curwin)) {
return;
- get_option_value((char_u*)"spl", &dummy, &spl, OPT_LOCAL);
+ }
+ get_option_value((char_u *)"spl", &dummy, &spl, OPT_LOCAL);
// Create a new empty buffer in a new window.
do_cmdline_cmd("new");
// enable spelling locally in the new window
- set_option_value((char_u*)"spell", true, (char_u*)"", OPT_LOCAL);
- set_option_value((char_u*)"spl", dummy, spl, OPT_LOCAL);
+ set_option_value("spell", true, "", OPT_LOCAL);
+ set_option_value("spl", dummy, (char *)spl, OPT_LOCAL);
xfree(spl);
- if (!bufempty() || !buf_valid(curbuf))
+ if (!BUFEMPTY()) {
return;
+ }
spell_dump_compl(NULL, 0, NULL, eap->forceit ? DUMPFLAG_COUNT : 0);
@@ -13163,7 +7218,7 @@ spell_dump_compl (
// Done all bytes at this node, go up one level.
--depth;
line_breakcheck();
- ins_compl_check_keys(50);
+ ins_compl_check_keys(50, false);
} else {
// Do one more byte at this node.
n = arridx[depth] + curi[depth];
@@ -13258,16 +7313,24 @@ static void dump_word(slang_T *slang, char_u *word, char_u *pat, int *dir, int d
if ((flags & (WF_BANNED | WF_RARE | WF_REGION)) || keepcap) {
STRCPY(badword, p);
STRCAT(badword, "/");
- if (keepcap)
+ if (keepcap) {
STRCAT(badword, "=");
- if (flags & WF_BANNED)
+ }
+ if (flags & WF_BANNED) {
STRCAT(badword, "!");
- else if (flags & WF_RARE)
+ } else if (flags & WF_RARE) {
STRCAT(badword, "?");
- if (flags & WF_REGION)
- for (i = 0; i < 7; ++i)
- if (flags & (0x10000 << i))
- sprintf((char *)badword + STRLEN(badword), "%d", i + 1);
+ }
+ if (flags & WF_REGION) {
+ for (i = 0; i < 7; i++) {
+ if (flags & (0x10000 << i)) {
+ const size_t badword_len = STRLEN(badword);
+ snprintf((char *)badword + badword_len,
+ sizeof(badword) - badword_len,
+ "%d", i + 1);
+ }
+ }
+ }
p = badword;
}
@@ -13401,8 +7464,9 @@ char_u *spell_to_word_end(char_u *start, win_T *win)
{
char_u *p = start;
- while (*p != NUL && spell_iswordp(p, win))
- mb_ptr_adv(p);
+ while (*p != NUL && spell_iswordp(p, win)) {
+ MB_PTR_ADV(p);
+ }
return p;
}
@@ -13417,23 +7481,26 @@ int spell_word_start(int startcol)
char_u *p;
int col = 0;
- if (no_spell_checking(curwin))
+ if (no_spell_checking(curwin)) {
return startcol;
+ }
// Find a word character before "startcol".
line = get_cursor_line_ptr();
for (p = line + startcol; p > line; ) {
- mb_ptr_back(line, p);
- if (spell_iswordp_nmw(p, curwin))
+ MB_PTR_BACK(line, p);
+ if (spell_iswordp_nmw(p, curwin)) {
break;
+ }
}
// Go back to start of the word.
while (p > line) {
col = (int)(p - line);
- mb_ptr_back(line, p);
- if (!spell_iswordp(p, curwin))
+ MB_PTR_BACK(line, p);
+ if (!spell_iswordp(p, curwin)) {
break;
+ }
col = 0;
}
@@ -13461,5 +7528,3 @@ int expand_spelling(linenr_T lnum, char_u *pat, char_u ***matchp)
*matchp = ga.ga_data;
return ga.ga_len;
}
-
-
diff --git a/src/nvim/spell.h b/src/nvim/spell.h
index 3a03cb2ef6..ad66df4c5d 100644
--- a/src/nvim/spell.h
+++ b/src/nvim/spell.h
@@ -3,6 +3,10 @@
#include <stdbool.h>
+#include "nvim/spell_defs.h"
+#include "nvim/ex_cmds_defs.h"
+#include "nvim/globals.h"
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "spell.h.generated.h"
#endif
diff --git a/src/nvim/spell_defs.h b/src/nvim/spell_defs.h
new file mode 100644
index 0000000000..e83b21b219
--- /dev/null
+++ b/src/nvim/spell_defs.h
@@ -0,0 +1,291 @@
+#ifndef NVIM_SPELL_DEFS_H
+#define NVIM_SPELL_DEFS_H
+
+#include <stdbool.h>
+#include <stdint.h>
+
+#include "nvim/buffer_defs.h"
+#include "nvim/garray.h"
+#include "nvim/regexp_defs.h"
+#include "nvim/types.h"
+
+#define MAXWLEN 254 // Assume max. word len is this many bytes.
+ // Some places assume a word length fits in a
+ // byte, thus it can't be above 255.
+
+// Number of regions supported.
+#define MAXREGIONS 8
+
+// Type used for indexes in the word tree need to be at least 4 bytes. If int
+// is 8 bytes we could use something smaller, but what?
+typedef int idx_T;
+
+# define SPL_FNAME_TMPL "%s.%s.spl"
+# define SPL_FNAME_ADD ".add."
+# define SPL_FNAME_ASCII ".ascii."
+
+// Flags used for a word. Only the lowest byte can be used, the region byte
+// comes above it.
+#define WF_REGION 0x01 // region byte follows
+#define WF_ONECAP 0x02 // word with one capital (or all capitals)
+#define WF_ALLCAP 0x04 // word must be all capitals
+#define WF_RARE 0x08 // rare word
+#define WF_BANNED 0x10 // bad word
+#define WF_AFX 0x20 // affix ID follows
+#define WF_FIXCAP 0x40 // keep-case word, allcap not allowed
+#define WF_KEEPCAP 0x80 // keep-case word
+
+// for <flags2>, shifted up one byte to be used in wn_flags
+#define WF_HAS_AFF 0x0100 // word includes affix
+#define WF_NEEDCOMP 0x0200 // word only valid in compound
+#define WF_NOSUGGEST 0x0400 // word not to be suggested
+#define WF_COMPROOT 0x0800 // already compounded word, COMPOUNDROOT
+#define WF_NOCOMPBEF 0x1000 // no compounding before this word
+#define WF_NOCOMPAFT 0x2000 // no compounding after this word
+
+// flags for <pflags>
+#define WFP_RARE 0x01 // rare prefix
+#define WFP_NC 0x02 // prefix is not combining
+#define WFP_UP 0x04 // to-upper prefix
+#define WFP_COMPPERMIT 0x08 // prefix with COMPOUNDPERMITFLAG
+#define WFP_COMPFORBID 0x10 // prefix with COMPOUNDFORBIDFLAG
+
+// Flags for postponed prefixes in "sl_pidxs". Must be above affixID (one
+// byte) and prefcondnr (two bytes).
+#define WF_RAREPFX (WFP_RARE << 24) // rare postponed prefix
+#define WF_PFX_NC (WFP_NC << 24) // non-combining postponed prefix
+#define WF_PFX_UP (WFP_UP << 24) // to-upper postponed prefix
+#define WF_PFX_COMPPERMIT (WFP_COMPPERMIT << 24) // postponed prefix with
+ // COMPOUNDPERMITFLAG
+#define WF_PFX_COMPFORBID (WFP_COMPFORBID << 24) // postponed prefix with
+ // COMPOUNDFORBIDFLAG
+
+
+// flags for <compoptions>
+#define COMP_CHECKDUP 1 // CHECKCOMPOUNDDUP
+#define COMP_CHECKREP 2 // CHECKCOMPOUNDREP
+#define COMP_CHECKCASE 4 // CHECKCOMPOUNDCASE
+#define COMP_CHECKTRIPLE 8 // CHECKCOMPOUNDTRIPLE
+
+// Info from "REP", "REPSAL" and "SAL" entries in ".aff" file used in si_rep,
+// si_repsal, sl_rep, and si_sal. Not for sl_sal!
+// One replacement: from "ft_from" to "ft_to".
+typedef struct fromto_S {
+ char_u *ft_from;
+ char_u *ft_to;
+} fromto_T;
+
+// Info from "SAL" entries in ".aff" file used in sl_sal.
+// The info is split for quick processing by spell_soundfold().
+// Note that "sm_oneof" and "sm_rules" point into sm_lead.
+typedef struct salitem_S {
+ char_u *sm_lead; // leading letters
+ int sm_leadlen; // length of "sm_lead"
+ char_u *sm_oneof; // letters from () or NULL
+ char_u *sm_rules; // rules like ^, $, priority
+ char_u *sm_to; // replacement.
+ int *sm_lead_w; // wide character copy of "sm_lead"
+ int *sm_oneof_w; // wide character copy of "sm_oneof"
+ int *sm_to_w; // wide character copy of "sm_to"
+} salitem_T;
+
+typedef int salfirst_T;
+
+// Values for SP_*ERROR are negative, positive values are used by
+// read_cnt_string().
+#define SP_TRUNCERROR -1 // spell file truncated error
+#define SP_FORMERROR -2 // format error in spell file
+#define SP_OTHERERROR -3 // other error while reading spell file
+
+// Structure used to store words and other info for one language, loaded from
+// a .spl file.
+// The main access is through the tree in "sl_fbyts/sl_fidxs", storing the
+// case-folded words. "sl_kbyts/sl_kidxs" is for keep-case words.
+//
+// The "byts" array stores the possible bytes in each tree node, preceded by
+// the number of possible bytes, sorted on byte value:
+// <len> <byte1> <byte2> ...
+// The "idxs" array stores the index of the child node corresponding to the
+// byte in "byts".
+// Exception: when the byte is zero, the word may end here and "idxs" holds
+// the flags, region mask and affixID for the word. There may be several
+// zeros in sequence for alternative flag/region/affixID combinations.
+typedef struct slang_S slang_T;
+
+struct slang_S {
+ slang_T *sl_next; // next language
+ char_u *sl_name; // language name "en", "en.rare", "nl", etc.
+ char_u *sl_fname; // name of .spl file
+ bool sl_add; // true if it's a .add file.
+
+ char_u *sl_fbyts; // case-folded word bytes
+ idx_T *sl_fidxs; // case-folded word indexes
+ char_u *sl_kbyts; // keep-case word bytes
+ idx_T *sl_kidxs; // keep-case word indexes
+ char_u *sl_pbyts; // prefix tree word bytes
+ idx_T *sl_pidxs; // prefix tree word indexes
+
+ char_u *sl_info; // infotext string or NULL
+
+ char_u sl_regions[MAXREGIONS * 2 + 1];
+ // table with up to 8 region names plus NUL
+
+ char_u *sl_midword; // MIDWORD string or NULL
+
+ hashtab_T sl_wordcount; // hashtable with word count, wordcount_T
+
+ int sl_compmax; // COMPOUNDWORDMAX (default: MAXWLEN)
+ int sl_compminlen; // COMPOUNDMIN (default: 0)
+ int sl_compsylmax; // COMPOUNDSYLMAX (default: MAXWLEN)
+ int sl_compoptions; // COMP_* flags
+ garray_T sl_comppat; // CHECKCOMPOUNDPATTERN items
+ regprog_T *sl_compprog; // COMPOUNDRULE turned into a regexp progrm
+ // (NULL when no compounding)
+ char_u *sl_comprules; // all COMPOUNDRULE concatenated (or NULL)
+ char_u *sl_compstartflags; // flags for first compound word
+ char_u *sl_compallflags; // all flags for compound words
+ bool sl_nobreak; // When true: no spaces between words
+ char_u *sl_syllable; // SYLLABLE repeatable chars or NULL
+ garray_T sl_syl_items; // syllable items
+
+ int sl_prefixcnt; // number of items in "sl_prefprog"
+ regprog_T **sl_prefprog; // table with regprogs for prefixes
+
+ garray_T sl_rep; // list of fromto_T entries from REP lines
+ int16_t sl_rep_first[256]; // indexes where byte first appears, -1 if
+ // there is none
+ garray_T sl_sal; // list of salitem_T entries from SAL lines
+ salfirst_T sl_sal_first[256]; // indexes where byte first appears, -1 if
+ // there is none
+ bool sl_followup; // SAL followup
+ bool sl_collapse; // SAL collapse_result
+ bool sl_rem_accents; // SAL remove_accents
+ bool sl_sofo; // SOFOFROM and SOFOTO instead of SAL items:
+ // "sl_sal_first" maps chars, when has_mbyte
+ // "sl_sal" is a list of wide char lists.
+ garray_T sl_repsal; // list of fromto_T entries from REPSAL lines
+ int16_t sl_repsal_first[256]; // sl_rep_first for REPSAL lines
+ bool sl_nosplitsugs; // don't suggest splitting a word
+ bool sl_nocompoundsugs; // don't suggest compounding
+
+ // Info from the .sug file. Loaded on demand.
+ time_t sl_sugtime; // timestamp for .sug file
+ char_u *sl_sbyts; // soundfolded word bytes
+ idx_T *sl_sidxs; // soundfolded word indexes
+ buf_T *sl_sugbuf; // buffer with word number table
+ bool sl_sugloaded; // true when .sug file was loaded or failed to
+ // load
+
+ bool sl_has_map; // true, if there is a MAP line
+ hashtab_T sl_map_hash; // MAP for multi-byte chars
+ int sl_map_array[256]; // MAP for first 256 chars
+ hashtab_T sl_sounddone; // table with soundfolded words that have
+ // handled, see add_sound_suggest()
+};
+
+// Structure used in "b_langp", filled from 'spelllang'.
+typedef struct langp_S {
+ slang_T *lp_slang; // info for this language
+ slang_T *lp_sallang; // language used for sound folding or NULL
+ slang_T *lp_replang; // language used for REP items or NULL
+ int lp_region; // bitmask for region or REGION_ALL
+} langp_T;
+
+#define LANGP_ENTRY(ga, i) (((langp_T *)(ga).ga_data) + (i))
+
+#define VIMSUGMAGIC "VIMsug" // string at start of Vim .sug file
+#define VIMSUGMAGICL 6
+#define VIMSUGVERSION 1
+
+#define REGION_ALL 0xff // word valid in all regions
+
+// The tables used for recognizing word characters according to spelling.
+// These are only used for the first 256 characters of 'encoding'.
+typedef struct {
+ bool st_isw[256]; // flags: is word char
+ bool st_isu[256]; // flags: is uppercase char
+ char_u st_fold[256]; // chars: folded case
+ char_u st_upper[256]; // chars: upper case
+} spelltab_T;
+
+// For finding suggestions: At each node in the tree these states are tried:
+typedef enum {
+ STATE_START = 0, // At start of node check for NUL bytes (goodword
+ // ends); if badword ends there is a match, otherwise
+ // try splitting word.
+ STATE_NOPREFIX, // try without prefix
+ STATE_SPLITUNDO, // Undo splitting.
+ STATE_ENDNUL, // Past NUL bytes at start of the node.
+ STATE_PLAIN, // Use each byte of the node.
+ STATE_DEL, // Delete a byte from the bad word.
+ STATE_INS_PREP, // Prepare for inserting bytes.
+ STATE_INS, // Insert a byte in the bad word.
+ STATE_SWAP, // Swap two bytes.
+ STATE_UNSWAP, // Undo swap two characters.
+ STATE_SWAP3, // Swap two characters over three.
+ STATE_UNSWAP3, // Undo Swap two characters over three.
+ STATE_UNROT3L, // Undo rotate three characters left
+ STATE_UNROT3R, // Undo rotate three characters right
+ STATE_REP_INI, // Prepare for using REP items.
+ STATE_REP, // Use matching REP items from the .aff file.
+ STATE_REP_UNDO, // Undo a REP item replacement.
+ STATE_FINAL // End of this node.
+} state_T;
+
+// Struct to keep the state at each level in suggest_try_change().
+typedef struct trystate_S {
+ state_T ts_state; // state at this level, STATE_
+ int ts_score; // score
+ idx_T ts_arridx; // index in tree array, start of node
+ short ts_curi; // index in list of child nodes
+ char_u ts_fidx; // index in fword[], case-folded bad word
+ char_u ts_fidxtry; // ts_fidx at which bytes may be changed
+ char_u ts_twordlen; // valid length of tword[]
+ char_u ts_prefixdepth; // stack depth for end of prefix or
+ // PFD_PREFIXTREE or PFD_NOPREFIX
+ char_u ts_flags; // TSF_ flags
+ char_u ts_tcharlen; // number of bytes in tword character
+ char_u ts_tcharidx; // current byte index in tword character
+ char_u ts_isdiff; // DIFF_ values
+ char_u ts_fcharstart; // index in fword where badword char started
+ char_u ts_prewordlen; // length of word in "preword[]"
+ char_u ts_splitoff; // index in "tword" after last split
+ char_u ts_splitfidx; // "ts_fidx" at word split
+ char_u ts_complen; // nr of compound words used
+ char_u ts_compsplit; // index for "compflags" where word was spit
+ char_u ts_save_badflags; // su_badflags saved here
+ char_u ts_delidx; // index in fword for char that was deleted,
+ // valid when "ts_flags" has TSF_DIDDEL
+} trystate_T;
+
+// Use our own character-case definitions, because the current locale may
+// differ from what the .spl file uses.
+// These must not be called with negative number!
+#include <wchar.h> // for towupper() and towlower()
+// Multi-byte implementation. For Unicode we can call utf_*(), but don't do
+// that for ASCII, because we don't want to use 'casemap' here. Otherwise use
+// the "w" library function for characters above 255.
+#define SPELL_TOFOLD(c) (enc_utf8 && (c) >= 128 ? utf_fold(c) \
+ : (c) < \
+ 256 ? (int)spelltab.st_fold[c] : (int)towlower(c))
+
+#define SPELL_TOUPPER(c) (enc_utf8 && (c) >= 128 ? mb_toupper(c) \
+ : (c) < \
+ 256 ? (int)spelltab.st_upper[c] : (int)towupper(c))
+
+#define SPELL_ISUPPER(c) (enc_utf8 && (c) >= 128 ? mb_isupper(c) \
+ : (c) < 256 ? spelltab.st_isu[c] : iswupper(c))
+
+// First language that is loaded, start of the linked list of loaded
+// languages.
+extern slang_T *first_lang;
+
+// file used for "zG" and "zW"
+extern char_u *int_wordlist;
+
+extern spelltab_T spelltab;
+extern int did_set_spelltab;
+
+extern char *e_format;
+
+#endif // NVIM_SPELL_DEFS_H
diff --git a/src/nvim/spellfile.c b/src/nvim/spellfile.c
new file mode 100644
index 0000000000..7a6f2fce39
--- /dev/null
+++ b/src/nvim/spellfile.c
@@ -0,0 +1,5727 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+// spellfile.c: code for reading and writing spell files.
+//
+// See spell.c for information about spell checking.
+
+// Vim spell file format: <HEADER>
+// <SECTIONS>
+// <LWORDTREE>
+// <KWORDTREE>
+// <PREFIXTREE>
+//
+// <HEADER>: <fileID> <versionnr>
+//
+// <fileID> 8 bytes "VIMspell"
+// <versionnr> 1 byte VIMSPELLVERSION
+//
+//
+// Sections make it possible to add information to the .spl file without
+// making it incompatible with previous versions. There are two kinds of
+// sections:
+// 1. Not essential for correct spell checking. E.g. for making suggestions.
+// These are skipped when not supported.
+// 2. Optional information, but essential for spell checking when present.
+// E.g. conditions for affixes. When this section is present but not
+// supported an error message is given.
+//
+// <SECTIONS>: <section> ... <sectionend>
+//
+// <section>: <sectionID> <sectionflags> <sectionlen> (section contents)
+//
+// <sectionID> 1 byte number from 0 to 254 identifying the section
+//
+// <sectionflags> 1 byte SNF_REQUIRED: this section is required for correct
+// spell checking
+//
+// <sectionlen> 4 bytes length of section contents, MSB first
+//
+// <sectionend> 1 byte SN_END
+//
+//
+// sectionID == SN_INFO: <infotext>
+// <infotext> N bytes free format text with spell file info (version,
+// website, etc)
+//
+// sectionID == SN_REGION: <regionname> ...
+// <regionname> 2 bytes Up to MAXREGIONS region names: ca, au, etc.
+// Lower case.
+// First <regionname> is region 1.
+//
+// sectionID == SN_CHARFLAGS: <charflagslen> <charflags>
+// <folcharslen> <folchars>
+// <charflagslen> 1 byte Number of bytes in <charflags> (should be 128).
+// <charflags> N bytes List of flags (first one is for character 128):
+// 0x01 word character CF_WORD
+// 0x02 upper-case character CF_UPPER
+// <folcharslen> 2 bytes Number of bytes in <folchars>.
+// <folchars> N bytes Folded characters, first one is for character 128.
+//
+// sectionID == SN_MIDWORD: <midword>
+// <midword> N bytes Characters that are word characters only when used
+// in the middle of a word.
+//
+// sectionID == SN_PREFCOND: <prefcondcnt> <prefcond> ...
+// <prefcondcnt> 2 bytes Number of <prefcond> items following.
+// <prefcond> : <condlen> <condstr>
+// <condlen> 1 byte Length of <condstr>.
+// <condstr> N bytes Condition for the prefix.
+//
+// sectionID == SN_REP: <repcount> <rep> ...
+// <repcount> 2 bytes number of <rep> items, MSB first.
+// <rep> : <repfromlen> <repfrom> <reptolen> <repto>
+// <repfromlen> 1 byte length of <repfrom>
+// <repfrom> N bytes "from" part of replacement
+// <reptolen> 1 byte length of <repto>
+// <repto> N bytes "to" part of replacement
+//
+// sectionID == SN_REPSAL: <repcount> <rep> ...
+// just like SN_REP but for soundfolded words
+//
+// sectionID == SN_SAL: <salflags> <salcount> <sal> ...
+// <salflags> 1 byte flags for soundsalike conversion:
+// SAL_F0LLOWUP
+// SAL_COLLAPSE
+// SAL_REM_ACCENTS
+// <salcount> 2 bytes number of <sal> items following
+// <sal> : <salfromlen> <salfrom> <saltolen> <salto>
+// <salfromlen> 1 byte length of <salfrom>
+// <salfrom> N bytes "from" part of soundsalike
+// <saltolen> 1 byte length of <salto>
+// <salto> N bytes "to" part of soundsalike
+//
+// sectionID == SN_SOFO: <sofofromlen> <sofofrom> <sofotolen> <sofoto>
+// <sofofromlen> 2 bytes length of <sofofrom>
+// <sofofrom> N bytes "from" part of soundfold
+// <sofotolen> 2 bytes length of <sofoto>
+// <sofoto> N bytes "to" part of soundfold
+//
+// sectionID == SN_SUGFILE: <timestamp>
+// <timestamp> 8 bytes time in seconds that must match with .sug file
+//
+// sectionID == SN_NOSPLITSUGS: nothing
+//
+// sectionID == SN_NOCOMPOUNDSUGS: nothing
+//
+// sectionID == SN_WORDS: <word> ...
+// <word> N bytes NUL terminated common word
+//
+// sectionID == SN_MAP: <mapstr>
+// <mapstr> N bytes String with sequences of similar characters,
+// separated by slashes.
+//
+// sectionID == SN_COMPOUND: <compmax> <compminlen> <compsylmax> <compoptions>
+// <comppatcount> <comppattern> ... <compflags>
+// <compmax> 1 byte Maximum nr of words in compound word.
+// <compminlen> 1 byte Minimal word length for compounding.
+// <compsylmax> 1 byte Maximum nr of syllables in compound word.
+// <compoptions> 2 bytes COMP_ flags.
+// <comppatcount> 2 bytes number of <comppattern> following
+// <compflags> N bytes Flags from COMPOUNDRULE items, separated by
+// slashes.
+//
+// <comppattern>: <comppatlen> <comppattext>
+// <comppatlen> 1 byte length of <comppattext>
+// <comppattext> N bytes end or begin chars from CHECKCOMPOUNDPATTERN
+//
+// sectionID == SN_NOBREAK: (empty, its presence is what matters)
+//
+// sectionID == SN_SYLLABLE: <syllable>
+// <syllable> N bytes String from SYLLABLE item.
+//
+// <LWORDTREE>: <wordtree>
+//
+// <KWORDTREE>: <wordtree>
+//
+// <PREFIXTREE>: <wordtree>
+//
+//
+// <wordtree>: <nodecount> <nodedata> ...
+//
+// <nodecount> 4 bytes Number of nodes following. MSB first.
+//
+// <nodedata>: <siblingcount> <sibling> ...
+//
+// <siblingcount> 1 byte Number of siblings in this node. The siblings
+// follow in sorted order.
+//
+// <sibling>: <byte> [ <nodeidx> <xbyte>
+// | <flags> [<flags2>] [<region>] [<affixID>]
+// | [<pflags>] <affixID> <prefcondnr> ]
+//
+// <byte> 1 byte Byte value of the sibling. Special cases:
+// BY_NOFLAGS: End of word without flags and for all
+// regions.
+// For PREFIXTREE <affixID> and
+// <prefcondnr> follow.
+// BY_FLAGS: End of word, <flags> follow.
+// For PREFIXTREE <pflags>, <affixID>
+// and <prefcondnr> follow.
+// BY_FLAGS2: End of word, <flags> and <flags2>
+// follow. Not used in PREFIXTREE.
+// BY_INDEX: Child of sibling is shared, <nodeidx>
+// and <xbyte> follow.
+//
+// <nodeidx> 3 bytes Index of child for this sibling, MSB first.
+//
+// <xbyte> 1 byte Byte value of the sibling.
+//
+// <flags> 1 byte Bitmask of:
+// WF_ALLCAP word must have only capitals
+// WF_ONECAP first char of word must be capital
+// WF_KEEPCAP keep-case word
+// WF_FIXCAP keep-case word, all caps not allowed
+// WF_RARE rare word
+// WF_BANNED bad word
+// WF_REGION <region> follows
+// WF_AFX <affixID> follows
+//
+// <flags2> 1 byte Bitmask of:
+// WF_HAS_AFF >> 8 word includes affix
+// WF_NEEDCOMP >> 8 word only valid in compound
+// WF_NOSUGGEST >> 8 word not used for suggestions
+// WF_COMPROOT >> 8 word already a compound
+// WF_NOCOMPBEF >> 8 no compounding before this word
+// WF_NOCOMPAFT >> 8 no compounding after this word
+//
+// <pflags> 1 byte Bitmask of:
+// WFP_RARE rare prefix
+// WFP_NC non-combining prefix
+// WFP_UP letter after prefix made upper case
+//
+// <region> 1 byte Bitmask for regions in which word is valid. When
+// omitted it's valid in all regions.
+// Lowest bit is for region 1.
+//
+// <affixID> 1 byte ID of affix that can be used with this word. In
+// PREFIXTREE used for the required prefix ID.
+//
+// <prefcondnr> 2 bytes Prefix condition number, index in <prefcond> list
+// from HEADER.
+//
+// All text characters are in 'encoding', but stored as single bytes.
+
+// Vim .sug file format: <SUGHEADER>
+// <SUGWORDTREE>
+// <SUGTABLE>
+//
+// <SUGHEADER>: <fileID> <versionnr> <timestamp>
+//
+// <fileID> 6 bytes "VIMsug"
+// <versionnr> 1 byte VIMSUGVERSION
+// <timestamp> 8 bytes timestamp that must match with .spl file
+//
+//
+// <SUGWORDTREE>: <wordtree> (see above, no flags or region used)
+//
+//
+// <SUGTABLE>: <sugwcount> <sugline> ...
+//
+// <sugwcount> 4 bytes number of <sugline> following
+//
+// <sugline>: <sugnr> ... NUL
+//
+// <sugnr>: X bytes word number that results in this soundfolded word,
+// stored as an offset to the previous number in as
+// few bytes as possible, see offset2bytes())
+
+#include <stdio.h>
+#include <stdint.h>
+#include <wctype.h>
+
+#include "nvim/vim.h"
+#include "nvim/spell_defs.h"
+#include "nvim/ascii.h"
+#include "nvim/buffer.h"
+#include "nvim/charset.h"
+#include "nvim/ex_cmds2.h"
+#include "nvim/fileio.h"
+#include "nvim/memory.h"
+#include "nvim/memline.h"
+#include "nvim/misc1.h"
+#include "nvim/option.h"
+#include "nvim/os/os.h"
+#include "nvim/path.h"
+#include "nvim/regexp.h"
+#include "nvim/screen.h"
+#include "nvim/spell.h"
+#include "nvim/spellfile.h"
+#include "nvim/ui.h"
+#include "nvim/undo.h"
+
+#ifndef UNIX // it's in os/unix_defs.h for Unix
+# include <time.h> // for time_t
+#endif
+
+// Special byte values for <byte>. Some are only used in the tree for
+// postponed prefixes, some only in the other trees. This is a bit messy...
+#define BY_NOFLAGS 0 // end of word without flags or region; for
+ // postponed prefix: no <pflags>
+#define BY_INDEX 1 // child is shared, index follows
+#define BY_FLAGS 2 // end of word, <flags> byte follows; for
+ // postponed prefix: <pflags> follows
+#define BY_FLAGS2 3 // end of word, <flags> and <flags2> bytes
+ // follow; never used in prefix tree
+#define BY_SPECIAL BY_FLAGS2 // highest special byte value
+
+// Flags used in .spl file for soundsalike flags.
+#define SAL_F0LLOWUP 1
+#define SAL_COLLAPSE 2
+#define SAL_REM_ACCENTS 4
+
+#define VIMSPELLMAGIC "VIMspell" // string at start of Vim spell file
+#define VIMSPELLMAGICL (sizeof(VIMSPELLMAGIC) - 1)
+#define VIMSPELLVERSION 50
+
+// Section IDs. Only renumber them when VIMSPELLVERSION changes!
+#define SN_REGION 0 // <regionname> section
+#define SN_CHARFLAGS 1 // charflags section
+#define SN_MIDWORD 2 // <midword> section
+#define SN_PREFCOND 3 // <prefcond> section
+#define SN_REP 4 // REP items section
+#define SN_SAL 5 // SAL items section
+#define SN_SOFO 6 // soundfolding section
+#define SN_MAP 7 // MAP items section
+#define SN_COMPOUND 8 // compound words section
+#define SN_SYLLABLE 9 // syllable section
+#define SN_NOBREAK 10 // NOBREAK section
+#define SN_SUGFILE 11 // timestamp for .sug file
+#define SN_REPSAL 12 // REPSAL items section
+#define SN_WORDS 13 // common words
+#define SN_NOSPLITSUGS 14 // don't split word for suggestions
+#define SN_INFO 15 // info section
+#define SN_NOCOMPOUNDSUGS 16 // don't compound for suggestions
+#define SN_END 255 // end of sections
+
+#define SNF_REQUIRED 1 // <sectionflags>: required section
+
+#define CF_WORD 0x01
+#define CF_UPPER 0x02
+
+static char *e_spell_trunc = N_("E758: Truncated spell file");
+static char *e_afftrailing = N_("Trailing text in %s line %d: %s");
+static char *e_affname = N_("Affix name too long in %s line %d: %s");
+static char *e_affform = N_("E761: Format error in affix file FOL, LOW or UPP");
+static char *e_affrange = N_(
+ "E762: Character in FOL, LOW or UPP is out of range");
+static char *msg_compressing = N_("Compressing word tree...");
+
+#define MAXLINELEN 500 // Maximum length in bytes of a line in a .aff
+ // and .dic file.
+// Main structure to store the contents of a ".aff" file.
+typedef struct afffile_S {
+ char_u *af_enc; // "SET", normalized, alloc'ed string or NULL
+ int af_flagtype; // AFT_CHAR, AFT_LONG, AFT_NUM or AFT_CAPLONG
+ unsigned af_rare; // RARE ID for rare word
+ unsigned af_keepcase; // KEEPCASE ID for keep-case word
+ unsigned af_bad; // BAD ID for banned word
+ unsigned af_needaffix; // NEEDAFFIX ID
+ unsigned af_circumfix; // CIRCUMFIX ID
+ unsigned af_needcomp; // NEEDCOMPOUND ID
+ unsigned af_comproot; // COMPOUNDROOT ID
+ unsigned af_compforbid; // COMPOUNDFORBIDFLAG ID
+ unsigned af_comppermit; // COMPOUNDPERMITFLAG ID
+ unsigned af_nosuggest; // NOSUGGEST ID
+ int af_pfxpostpone; // postpone prefixes without chop string and
+ // without flags
+ bool af_ignoreextra; // IGNOREEXTRA present
+ hashtab_T af_pref; // hashtable for prefixes, affheader_T
+ hashtab_T af_suff; // hashtable for suffixes, affheader_T
+ hashtab_T af_comp; // hashtable for compound flags, compitem_T
+} afffile_T;
+
+#define AFT_CHAR 0 // flags are one character
+#define AFT_LONG 1 // flags are two characters
+#define AFT_CAPLONG 2 // flags are one or two characters
+#define AFT_NUM 3 // flags are numbers, comma separated
+
+typedef struct affentry_S affentry_T;
+// Affix entry from ".aff" file. Used for prefixes and suffixes.
+struct affentry_S {
+ affentry_T *ae_next; // next affix with same name/number
+ char_u *ae_chop; // text to chop off basic word (can be NULL)
+ char_u *ae_add; // text to add to basic word (can be NULL)
+ char_u *ae_flags; // flags on the affix (can be NULL)
+ char_u *ae_cond; // condition (NULL for ".")
+ regprog_T *ae_prog; // regexp program for ae_cond or NULL
+ char ae_compforbid; // COMPOUNDFORBIDFLAG found
+ char ae_comppermit; // COMPOUNDPERMITFLAG found
+};
+
+# define AH_KEY_LEN 17 // 2 x 8 bytes + NUL
+
+// Affix header from ".aff" file. Used for af_pref and af_suff.
+typedef struct affheader_S {
+ char_u ah_key[AH_KEY_LEN]; // key for hashtab == name of affix
+ unsigned ah_flag; // affix name as number, uses "af_flagtype"
+ int ah_newID; // prefix ID after renumbering; 0 if not used
+ int ah_combine; // suffix may combine with prefix
+ int ah_follows; // another affix block should be following
+ affentry_T *ah_first; // first affix entry
+} affheader_T;
+
+#define HI2AH(hi) ((affheader_T *)(hi)->hi_key)
+
+// Flag used in compound items.
+typedef struct compitem_S {
+ char_u ci_key[AH_KEY_LEN]; // key for hashtab == name of compound
+ unsigned ci_flag; // affix name as number, uses "af_flagtype"
+ int ci_newID; // affix ID after renumbering.
+} compitem_T;
+
+#define HI2CI(hi) ((compitem_T *)(hi)->hi_key)
+
+// Structure that is used to store the items in the word tree. This avoids
+// the need to keep track of each allocated thing, everything is freed all at
+// once after ":mkspell" is done.
+// Note: "sb_next" must be just before "sb_data" to make sure the alignment of
+// "sb_data" is correct for systems where pointers must be aligned on
+// pointer-size boundaries and sizeof(pointer) > sizeof(int) (e.g., Sparc).
+#define SBLOCKSIZE 16000 // size of sb_data
+typedef struct sblock_S sblock_T;
+struct sblock_S {
+ int sb_used; // nr of bytes already in use
+ sblock_T *sb_next; // next block in list
+ char_u sb_data[1]; // data, actually longer
+};
+
+// A node in the tree.
+typedef struct wordnode_S wordnode_T;
+struct wordnode_S {
+ union { // shared to save space
+ char_u hashkey[6]; // the hash key, only used while compressing
+ int index; // index in written nodes (valid after first
+ // round)
+ } wn_u1;
+ union { // shared to save space
+ wordnode_T *next; // next node with same hash key
+ wordnode_T *wnode; // parent node that will write this node
+ } wn_u2;
+ wordnode_T *wn_child; // child (next byte in word)
+ wordnode_T *wn_sibling; // next sibling (alternate byte in word,
+ // always sorted)
+ int wn_refs; // Nr. of references to this node. Only
+ // relevant for first node in a list of
+ // siblings, in following siblings it is
+ // always one.
+ char_u wn_byte; // Byte for this node. NUL for word end
+
+ // Info for when "wn_byte" is NUL.
+ // In PREFIXTREE "wn_region" is used for the prefcondnr.
+ // In the soundfolded word tree "wn_flags" has the MSW of the wordnr and
+ // "wn_region" the LSW of the wordnr.
+ char_u wn_affixID; // supported/required prefix ID or 0
+ uint16_t wn_flags; // WF_ flags
+ short wn_region; // region mask
+
+#ifdef SPELL_PRINTTREE
+ int wn_nr; // sequence nr for printing
+#endif
+};
+
+#define WN_MASK 0xffff // mask relevant bits of "wn_flags"
+
+#define HI2WN(hi) (wordnode_T *)((hi)->hi_key)
+
+// Info used while reading the spell files.
+typedef struct spellinfo_S {
+ wordnode_T *si_foldroot; // tree with case-folded words
+ long si_foldwcount; // nr of words in si_foldroot
+
+ wordnode_T *si_keeproot; // tree with keep-case words
+ long si_keepwcount; // nr of words in si_keeproot
+
+ wordnode_T *si_prefroot; // tree with postponed prefixes
+
+ long si_sugtree; // creating the soundfolding trie
+
+ sblock_T *si_blocks; // memory blocks used
+ long si_blocks_cnt; // memory blocks allocated
+ int si_did_emsg; // TRUE when ran out of memory
+
+ long si_compress_cnt; // words to add before lowering
+ // compression limit
+ wordnode_T *si_first_free; // List of nodes that have been freed during
+ // compression, linked by "wn_child" field.
+ long si_free_count; // number of nodes in si_first_free
+#ifdef SPELL_PRINTTREE
+ int si_wordnode_nr; // sequence nr for nodes
+#endif
+ buf_T *si_spellbuf; // buffer used to store soundfold word table
+
+ int si_ascii; // handling only ASCII words
+ int si_add; // addition file
+ int si_clear_chartab; // when TRUE clear char tables
+ int si_region; // region mask
+ vimconv_T si_conv; // for conversion to 'encoding'
+ int si_memtot; // runtime memory used
+ int si_verbose; // verbose messages
+ int si_msg_count; // number of words added since last message
+ char_u *si_info; // info text chars or NULL
+ int si_region_count; // number of regions supported (1 when there
+ // are no regions)
+ char_u si_region_name[MAXREGIONS * 2 + 1];
+ // region names; used only if
+ // si_region_count > 1)
+
+ garray_T si_rep; // list of fromto_T entries from REP lines
+ garray_T si_repsal; // list of fromto_T entries from REPSAL lines
+ garray_T si_sal; // list of fromto_T entries from SAL lines
+ char_u *si_sofofr; // SOFOFROM text
+ char_u *si_sofoto; // SOFOTO text
+ int si_nosugfile; // NOSUGFILE item found
+ int si_nosplitsugs; // NOSPLITSUGS item found
+ int si_nocompoundsugs; // NOCOMPOUNDSUGS item found
+ int si_followup; // soundsalike: ?
+ int si_collapse; // soundsalike: ?
+ hashtab_T si_commonwords; // hashtable for common words
+ time_t si_sugtime; // timestamp for .sug file
+ int si_rem_accents; // soundsalike: remove accents
+ garray_T si_map; // MAP info concatenated
+ char_u *si_midword; // MIDWORD chars or NULL
+ int si_compmax; // max nr of words for compounding
+ int si_compminlen; // minimal length for compounding
+ int si_compsylmax; // max nr of syllables for compounding
+ int si_compoptions; // COMP_ flags
+ garray_T si_comppat; // CHECKCOMPOUNDPATTERN items, each stored as
+ // a string
+ char_u *si_compflags; // flags used for compounding
+ char_u si_nobreak; // NOBREAK
+ char_u *si_syllable; // syllable string
+ garray_T si_prefcond; // table with conditions for postponed
+ // prefixes, each stored as a string
+ int si_newprefID; // current value for ah_newID
+ int si_newcompID; // current value for compound ID
+} spellinfo_T;
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "spellfile.c.generated.h"
+#endif
+
+/// Read n bytes from fd to buf, returning on errors
+///
+/// @param[out] buf Buffer to read to, must be at least n bytes long.
+/// @param[in] n Amount of bytes to read.
+/// @param fd FILE* to read from.
+/// @param exit_code Code to run before returning.
+///
+/// @return Allows to proceed if everything is OK, returns SP_TRUNCERROR if
+/// there are not enough bytes, returns SP_OTHERERROR if reading failed.
+#define SPELL_READ_BYTES(buf, n, fd, exit_code) \
+ do { \
+ const size_t n__SPRB = (n); \
+ FILE *const fd__SPRB = (fd); \
+ char *const buf__SPRB = (buf); \
+ const size_t read_bytes__SPRB = fread(buf__SPRB, 1, n__SPRB, fd__SPRB); \
+ if (read_bytes__SPRB != n__SPRB) { \
+ exit_code; \
+ return feof(fd__SPRB) ? SP_TRUNCERROR : SP_OTHERERROR; \
+ } \
+ } while (0)
+
+/// Like #SPELL_READ_BYTES, but also error out if NUL byte was read
+///
+/// @return Allows to proceed if everything is OK, returns SP_TRUNCERROR if
+/// there are not enough bytes, returns SP_OTHERERROR if reading failed,
+/// returns SP_FORMERROR if read out a NUL byte.
+#define SPELL_READ_NONNUL_BYTES(buf, n, fd, exit_code) \
+ do { \
+ const size_t n__SPRNB = (n); \
+ FILE *const fd__SPRNB = (fd); \
+ char *const buf__SPRNB = (buf); \
+ SPELL_READ_BYTES(buf__SPRNB, n__SPRNB, fd__SPRNB, exit_code); \
+ if (memchr(buf__SPRNB, NUL, (size_t)n__SPRNB)) { \
+ exit_code; \
+ return SP_FORMERROR; \
+ } \
+ } while (0)
+
+/// Check that spell file starts with a magic string
+///
+/// Does not check for version of the file.
+///
+/// @param fd File to check.
+///
+/// @return 0 in case of success, SP_TRUNCERROR if file contains not enough
+/// bytes, SP_FORMERROR if it does not match magic string and
+/// SP_OTHERERROR if reading file failed.
+static inline int spell_check_magic_string(FILE *const fd)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_ALWAYS_INLINE
+{
+ char buf[VIMSPELLMAGICL];
+ SPELL_READ_BYTES(buf, VIMSPELLMAGICL, fd, ;);
+ if (memcmp(buf, VIMSPELLMAGIC, VIMSPELLMAGICL) != 0) {
+ return SP_FORMERROR;
+ }
+ return 0;
+}
+
+// Load one spell file and store the info into a slang_T.
+//
+// This is invoked in three ways:
+// - From spell_load_cb() to load a spell file for the first time. "lang" is
+// the language name, "old_lp" is NULL. Will allocate an slang_T.
+// - To reload a spell file that was changed. "lang" is NULL and "old_lp"
+// points to the existing slang_T.
+// - Just after writing a .spl file; it's read back to produce the .sug file.
+// "old_lp" is NULL and "lang" is NULL. Will allocate an slang_T.
+//
+// Returns the slang_T the spell file was loaded into. NULL for error.
+slang_T *
+spell_load_file (
+ char_u *fname,
+ char_u *lang,
+ slang_T *old_lp,
+ bool silent // no error if file doesn't exist
+)
+{
+ FILE *fd;
+ char_u *p;
+ int n;
+ int len;
+ char_u *save_sourcing_name = sourcing_name;
+ linenr_T save_sourcing_lnum = sourcing_lnum;
+ slang_T *lp = NULL;
+ int c = 0;
+ int res;
+
+ fd = mch_fopen((char *)fname, "r");
+ if (fd == NULL) {
+ if (!silent)
+ EMSG2(_(e_notopen), fname);
+ else if (p_verbose > 2) {
+ verbose_enter();
+ smsg((char *)e_notopen, fname);
+ verbose_leave();
+ }
+ goto endFAIL;
+ }
+ if (p_verbose > 2) {
+ verbose_enter();
+ smsg(_("Reading spell file \"%s\""), fname);
+ verbose_leave();
+ }
+
+ if (old_lp == NULL) {
+ lp = slang_alloc(lang);
+
+ // Remember the file name, used to reload the file when it's updated.
+ lp->sl_fname = vim_strsave(fname);
+
+ // Check for .add.spl.
+ lp->sl_add = strstr((char *)path_tail(fname), SPL_FNAME_ADD) != NULL;
+ } else
+ lp = old_lp;
+
+ // Set sourcing_name, so that error messages mention the file name.
+ sourcing_name = fname;
+ sourcing_lnum = 0;
+
+ // <HEADER>: <fileID>
+ const int scms_ret = spell_check_magic_string(fd);
+ switch (scms_ret) {
+ case SP_FORMERROR:
+ case SP_TRUNCERROR: {
+ emsgf(_("E757: This does not look like a spell file"));
+ goto endFAIL;
+ }
+ case SP_OTHERERROR: {
+ emsgf(_("E5042: Failed to read spell file %s: %s"),
+ fname, strerror(ferror(fd)));
+ }
+ case 0: {
+ break;
+ }
+ }
+ c = getc(fd); // <versionnr>
+ if (c < VIMSPELLVERSION) {
+ EMSG(_("E771: Old spell file, needs to be updated"));
+ goto endFAIL;
+ } else if (c > VIMSPELLVERSION) {
+ EMSG(_("E772: Spell file is for newer version of Vim"));
+ goto endFAIL;
+ }
+
+
+ // <SECTIONS>: <section> ... <sectionend>
+ // <section>: <sectionID> <sectionflags> <sectionlen> (section contents)
+ for (;; ) {
+ n = getc(fd); // <sectionID> or <sectionend>
+ if (n == SN_END)
+ break;
+ c = getc(fd); // <sectionflags>
+ len = get4c(fd); // <sectionlen>
+ if (len < 0)
+ goto truncerr;
+
+ res = 0;
+ switch (n) {
+ case SN_INFO:
+ lp->sl_info = READ_STRING(fd, len); // <infotext>
+ if (lp->sl_info == NULL)
+ goto endFAIL;
+ break;
+
+ case SN_REGION:
+ res = read_region_section(fd, lp, len);
+ break;
+
+ case SN_CHARFLAGS:
+ res = read_charflags_section(fd);
+ break;
+
+ case SN_MIDWORD:
+ lp->sl_midword = READ_STRING(fd, len); // <midword>
+ if (lp->sl_midword == NULL)
+ goto endFAIL;
+ break;
+
+ case SN_PREFCOND:
+ res = read_prefcond_section(fd, lp);
+ break;
+
+ case SN_REP:
+ res = read_rep_section(fd, &lp->sl_rep, lp->sl_rep_first);
+ break;
+
+ case SN_REPSAL:
+ res = read_rep_section(fd, &lp->sl_repsal, lp->sl_repsal_first);
+ break;
+
+ case SN_SAL:
+ res = read_sal_section(fd, lp);
+ break;
+
+ case SN_SOFO:
+ res = read_sofo_section(fd, lp);
+ break;
+
+ case SN_MAP:
+ p = READ_STRING(fd, len); // <mapstr>
+ if (p == NULL)
+ goto endFAIL;
+ set_map_str(lp, p);
+ xfree(p);
+ break;
+
+ case SN_WORDS:
+ res = read_words_section(fd, lp, len);
+ break;
+
+ case SN_SUGFILE:
+ lp->sl_sugtime = get8ctime(fd); // <timestamp>
+ break;
+
+ case SN_NOSPLITSUGS:
+ lp->sl_nosplitsugs = true;
+ break;
+
+ case SN_NOCOMPOUNDSUGS:
+ lp->sl_nocompoundsugs = true;
+ break;
+
+ case SN_COMPOUND:
+ res = read_compound(fd, lp, len);
+ break;
+
+ case SN_NOBREAK:
+ lp->sl_nobreak = true;
+ break;
+
+ case SN_SYLLABLE:
+ lp->sl_syllable = READ_STRING(fd, len); // <syllable>
+ if (lp->sl_syllable == NULL)
+ goto endFAIL;
+ if (init_syl_tab(lp) == FAIL)
+ goto endFAIL;
+ break;
+
+ default:
+ // Unsupported section. When it's required give an error
+ // message. When it's not required skip the contents.
+ if (c & SNF_REQUIRED) {
+ EMSG(_("E770: Unsupported section in spell file"));
+ goto endFAIL;
+ }
+ while (--len >= 0)
+ if (getc(fd) < 0)
+ goto truncerr;
+ break;
+ }
+someerror:
+ if (res == SP_FORMERROR) {
+ EMSG(_(e_format));
+ goto endFAIL;
+ }
+ if (res == SP_TRUNCERROR) {
+truncerr:
+ EMSG(_(e_spell_trunc));
+ goto endFAIL;
+ }
+ if (res == SP_OTHERERROR)
+ goto endFAIL;
+ }
+
+ // <LWORDTREE>
+ res = spell_read_tree(fd, &lp->sl_fbyts, &lp->sl_fidxs, false, 0);
+ if (res != 0)
+ goto someerror;
+
+ // <KWORDTREE>
+ res = spell_read_tree(fd, &lp->sl_kbyts, &lp->sl_kidxs, false, 0);
+ if (res != 0)
+ goto someerror;
+
+ // <PREFIXTREE>
+ res = spell_read_tree(fd, &lp->sl_pbyts, &lp->sl_pidxs, true,
+ lp->sl_prefixcnt);
+ if (res != 0)
+ goto someerror;
+
+ // For a new file link it in the list of spell files.
+ if (old_lp == NULL && lang != NULL) {
+ lp->sl_next = first_lang;
+ first_lang = lp;
+ }
+
+ goto endOK;
+
+endFAIL:
+ if (lang != NULL)
+ // truncating the name signals the error to spell_load_lang()
+ *lang = NUL;
+ if (lp != NULL && old_lp == NULL)
+ slang_free(lp);
+ lp = NULL;
+
+endOK:
+ if (fd != NULL)
+ fclose(fd);
+ sourcing_name = save_sourcing_name;
+ sourcing_lnum = save_sourcing_lnum;
+
+ return lp;
+}
+
+// Fill in the wordcount fields for a trie.
+// Returns the total number of words.
+static void tree_count_words(char_u *byts, idx_T *idxs)
+{
+ int depth;
+ idx_T arridx[MAXWLEN];
+ int curi[MAXWLEN];
+ int c;
+ idx_T n;
+ int wordcount[MAXWLEN];
+
+ arridx[0] = 0;
+ curi[0] = 1;
+ wordcount[0] = 0;
+ depth = 0;
+ while (depth >= 0 && !got_int) {
+ if (curi[depth] > byts[arridx[depth]]) {
+ // Done all bytes at this node, go up one level.
+ idxs[arridx[depth]] = wordcount[depth];
+ if (depth > 0)
+ wordcount[depth - 1] += wordcount[depth];
+
+ --depth;
+ fast_breakcheck();
+ } else {
+ // Do one more byte at this node.
+ n = arridx[depth] + curi[depth];
+ ++curi[depth];
+
+ c = byts[n];
+ if (c == 0) {
+ // End of word, count it.
+ ++wordcount[depth];
+
+ // Skip over any other NUL bytes (same word with different
+ // flags).
+ while (byts[n + 1] == 0) {
+ ++n;
+ ++curi[depth];
+ }
+ } else {
+ // Normal char, go one level deeper to count the words.
+ ++depth;
+ arridx[depth] = idxs[n];
+ curi[depth] = 1;
+ wordcount[depth] = 0;
+ }
+ }
+ }
+}
+
+// Load the .sug files for languages that have one and weren't loaded yet.
+void suggest_load_files(void)
+{
+ langp_T *lp;
+ slang_T *slang;
+ char_u *dotp;
+ FILE *fd;
+ char_u buf[MAXWLEN];
+ int i;
+ time_t timestamp;
+ int wcount;
+ int wordnr;
+ garray_T ga;
+ int c;
+
+ // Do this for all languages that support sound folding.
+ for (int lpi = 0; lpi < curwin->w_s->b_langp.ga_len; ++lpi) {
+ lp = LANGP_ENTRY(curwin->w_s->b_langp, lpi);
+ slang = lp->lp_slang;
+ if (slang->sl_sugtime != 0 && !slang->sl_sugloaded) {
+ // Change ".spl" to ".sug" and open the file. When the file isn't
+ // found silently skip it. Do set "sl_sugloaded" so that we
+ // don't try again and again.
+ slang->sl_sugloaded = true;
+
+ dotp = STRRCHR(slang->sl_fname, '.');
+ if (dotp == NULL || fnamecmp(dotp, ".spl") != 0) {
+ continue;
+ }
+ STRCPY(dotp, ".sug");
+ fd = mch_fopen((char *)slang->sl_fname, "r");
+ if (fd == NULL)
+ goto nextone;
+
+ // <SUGHEADER>: <fileID> <versionnr> <timestamp>
+ for (i = 0; i < VIMSUGMAGICL; ++i)
+ buf[i] = getc(fd); // <fileID>
+ if (STRNCMP(buf, VIMSUGMAGIC, VIMSUGMAGICL) != 0) {
+ EMSG2(_("E778: This does not look like a .sug file: %s"),
+ slang->sl_fname);
+ goto nextone;
+ }
+ c = getc(fd); // <versionnr>
+ if (c < VIMSUGVERSION) {
+ EMSG2(_("E779: Old .sug file, needs to be updated: %s"),
+ slang->sl_fname);
+ goto nextone;
+ } else if (c > VIMSUGVERSION) {
+ EMSG2(_("E780: .sug file is for newer version of Vim: %s"),
+ slang->sl_fname);
+ goto nextone;
+ }
+
+ // Check the timestamp, it must be exactly the same as the one in
+ // the .spl file. Otherwise the word numbers won't match.
+ timestamp = get8ctime(fd); // <timestamp>
+ if (timestamp != slang->sl_sugtime) {
+ EMSG2(_("E781: .sug file doesn't match .spl file: %s"),
+ slang->sl_fname);
+ goto nextone;
+ }
+
+ // <SUGWORDTREE>: <wordtree>
+ // Read the trie with the soundfolded words.
+ if (spell_read_tree(fd, &slang->sl_sbyts, &slang->sl_sidxs,
+ false, 0) != 0) {
+someerror:
+ EMSG2(_("E782: error while reading .sug file: %s"),
+ slang->sl_fname);
+ slang_clear_sug(slang);
+ goto nextone;
+ }
+
+ // <SUGTABLE>: <sugwcount> <sugline> ...
+ //
+ // Read the table with word numbers. We use a file buffer for
+ // this, because it's so much like a file with lines. Makes it
+ // possible to swap the info and save on memory use.
+ slang->sl_sugbuf = open_spellbuf();
+
+ // <sugwcount>
+ wcount = get4c(fd);
+ if (wcount < 0)
+ goto someerror;
+
+ // Read all the wordnr lists into the buffer, one NUL terminated
+ // list per line.
+ ga_init(&ga, 1, 100);
+ for (wordnr = 0; wordnr < wcount; ++wordnr) {
+ ga.ga_len = 0;
+ for (;; ) {
+ c = getc(fd); // <sugline>
+ if (c < 0) {
+ goto someerror;
+ }
+ GA_APPEND(char_u, &ga, c);
+ if (c == NUL)
+ break;
+ }
+ if (ml_append_buf(slang->sl_sugbuf, (linenr_T)wordnr,
+ ga.ga_data, ga.ga_len, TRUE) == FAIL)
+ goto someerror;
+ }
+ ga_clear(&ga);
+
+ // Need to put word counts in the word tries, so that we can find
+ // a word by its number.
+ tree_count_words(slang->sl_fbyts, slang->sl_fidxs);
+ tree_count_words(slang->sl_sbyts, slang->sl_sidxs);
+
+nextone:
+ if (fd != NULL)
+ fclose(fd);
+ STRCPY(dotp, ".spl");
+ }
+ }
+}
+
+
+// Read a length field from "fd" in "cnt_bytes" bytes.
+// Allocate memory, read the string into it and add a NUL at the end.
+// Returns NULL when the count is zero.
+// Sets "*cntp" to SP_*ERROR when there is an error, length of the result
+// otherwise.
+static char_u *read_cnt_string(FILE *fd, int cnt_bytes, int *cntp)
+{
+ int cnt = 0;
+ int i;
+ char_u *str;
+
+ // read the length bytes, MSB first
+ for (i = 0; i < cnt_bytes; ++i)
+ cnt = (cnt << 8) + getc(fd);
+ if (cnt < 0) {
+ *cntp = SP_TRUNCERROR;
+ return NULL;
+ }
+ *cntp = cnt;
+ if (cnt == 0)
+ return NULL; // nothing to read, return NULL
+
+ str = READ_STRING(fd, cnt);
+ if (str == NULL)
+ *cntp = SP_OTHERERROR;
+ return str;
+}
+
+// Read SN_REGION: <regionname> ...
+// Return SP_*ERROR flags.
+static int read_region_section(FILE *fd, slang_T *lp, int len)
+{
+ if (len > MAXREGIONS * 2) {
+ return SP_FORMERROR;
+ }
+ SPELL_READ_NONNUL_BYTES((char *)lp->sl_regions, (size_t)len, fd, ;);
+ lp->sl_regions[len] = NUL;
+ return 0;
+}
+
+// Read SN_CHARFLAGS section: <charflagslen> <charflags>
+// <folcharslen> <folchars>
+// Return SP_*ERROR flags.
+static int read_charflags_section(FILE *fd)
+{
+ char_u *flags;
+ char_u *fol;
+ int flagslen, follen;
+
+ // <charflagslen> <charflags>
+ flags = read_cnt_string(fd, 1, &flagslen);
+ if (flagslen < 0)
+ return flagslen;
+
+ // <folcharslen> <folchars>
+ fol = read_cnt_string(fd, 2, &follen);
+ if (follen < 0) {
+ xfree(flags);
+ return follen;
+ }
+
+ // Set the word-char flags and fill SPELL_ISUPPER() table.
+ if (flags != NULL && fol != NULL)
+ set_spell_charflags(flags, flagslen, fol);
+
+ xfree(flags);
+ xfree(fol);
+
+ // When <charflagslen> is zero then <fcharlen> must also be zero.
+ if ((flags == NULL) != (fol == NULL))
+ return SP_FORMERROR;
+ return 0;
+}
+
+// Read SN_PREFCOND section.
+// Return SP_*ERROR flags.
+static int read_prefcond_section(FILE *fd, slang_T *lp)
+{
+ // <prefcondcnt> <prefcond> ...
+ const int cnt = get2c(fd); // <prefcondcnt>
+ if (cnt <= 0) {
+ return SP_FORMERROR;
+ }
+
+ lp->sl_prefprog = xcalloc(cnt, sizeof(regprog_T *));
+ lp->sl_prefixcnt = cnt;
+
+ for (int i = 0; i < cnt; i++) {
+ // <prefcond> : <condlen> <condstr>
+ const int n = getc(fd); // <condlen>
+ if (n < 0 || n >= MAXWLEN) {
+ return SP_FORMERROR;
+ }
+
+ // When <condlen> is zero we have an empty condition. Otherwise
+ // compile the regexp program used to check for the condition.
+ if (n > 0) {
+ char buf[MAXWLEN + 1];
+ buf[0] = '^'; // always match at one position only
+ SPELL_READ_NONNUL_BYTES(buf + 1, (size_t)n, fd, ;);
+ buf[n + 1] = NUL;
+ lp->sl_prefprog[i] = vim_regcomp((char_u *)buf, RE_MAGIC | RE_STRING);
+ }
+ }
+ return 0;
+}
+
+// Read REP or REPSAL items section from "fd": <repcount> <rep> ...
+// Return SP_*ERROR flags.
+static int read_rep_section(FILE *fd, garray_T *gap, int16_t *first)
+{
+ int cnt;
+ fromto_T *ftp;
+
+ cnt = get2c(fd); // <repcount>
+ if (cnt < 0)
+ return SP_TRUNCERROR;
+
+ ga_grow(gap, cnt);
+
+ // <rep> : <repfromlen> <repfrom> <reptolen> <repto>
+ for (; gap->ga_len < cnt; ++gap->ga_len) {
+ int c;
+ ftp = &((fromto_T *)gap->ga_data)[gap->ga_len];
+ ftp->ft_from = read_cnt_string(fd, 1, &c);
+ if (c < 0)
+ return c;
+ if (c == 0)
+ return SP_FORMERROR;
+ ftp->ft_to = read_cnt_string(fd, 1, &c);
+ if (c <= 0) {
+ xfree(ftp->ft_from);
+ if (c < 0)
+ return c;
+ return SP_FORMERROR;
+ }
+ }
+
+ // Fill the first-index table.
+ for (int i = 0; i < 256; ++i) {
+ first[i] = -1;
+ }
+ for (int i = 0; i < gap->ga_len; ++i) {
+ ftp = &((fromto_T *)gap->ga_data)[i];
+ if (first[*ftp->ft_from] == -1)
+ first[*ftp->ft_from] = i;
+ }
+ return 0;
+}
+
+// Read SN_SAL section: <salflags> <salcount> <sal> ...
+// Return SP_*ERROR flags.
+static int read_sal_section(FILE *fd, slang_T *slang)
+{
+ int cnt;
+ garray_T *gap;
+ salitem_T *smp;
+ int ccnt;
+ char_u *p;
+ int c = NUL;
+
+ slang->sl_sofo = false;
+
+ const int flags = getc(fd); // <salflags>
+ if (flags & SAL_F0LLOWUP) {
+ slang->sl_followup = true;
+ }
+ if (flags & SAL_COLLAPSE) {
+ slang->sl_collapse = true;
+ }
+ if (flags & SAL_REM_ACCENTS) {
+ slang->sl_rem_accents = true;
+ }
+
+ cnt = get2c(fd); // <salcount>
+ if (cnt < 0)
+ return SP_TRUNCERROR;
+
+ gap = &slang->sl_sal;
+ ga_init(gap, sizeof(salitem_T), 10);
+ ga_grow(gap, cnt + 1);
+
+ // <sal> : <salfromlen> <salfrom> <saltolen> <salto>
+ for (; gap->ga_len < cnt; ++gap->ga_len) {
+ smp = &((salitem_T *)gap->ga_data)[gap->ga_len];
+ ccnt = getc(fd); // <salfromlen>
+ if (ccnt < 0)
+ return SP_TRUNCERROR;
+ p = xmalloc(ccnt + 2);
+ smp->sm_lead = p;
+
+ // Read up to the first special char into sm_lead.
+ int i = 0;
+ for (; i < ccnt; ++i) {
+ c = getc(fd); // <salfrom>
+ if (vim_strchr((char_u *)"0123456789(-<^$", c) != NULL)
+ break;
+ *p++ = c;
+ }
+ smp->sm_leadlen = (int)(p - smp->sm_lead);
+ *p++ = NUL;
+
+ // Put (abc) chars in sm_oneof, if any.
+ if (c == '(') {
+ smp->sm_oneof = p;
+ for (++i; i < ccnt; ++i) {
+ c = getc(fd); // <salfrom>
+ if (c == ')')
+ break;
+ *p++ = c;
+ }
+ *p++ = NUL;
+ if (++i < ccnt)
+ c = getc(fd);
+ } else
+ smp->sm_oneof = NULL;
+
+ // Any following chars go in sm_rules.
+ smp->sm_rules = p;
+ if (i < ccnt) {
+ // store the char we got while checking for end of sm_lead
+ *p++ = c;
+ }
+ i++;
+ if (i < ccnt) {
+ SPELL_READ_NONNUL_BYTES( // <salfrom>
+ (char *)p, (size_t)(ccnt - i), fd, xfree(smp->sm_lead));
+ p += (ccnt - i);
+ }
+ *p++ = NUL;
+
+ // <saltolen> <salto>
+ smp->sm_to = read_cnt_string(fd, 1, &ccnt);
+ if (ccnt < 0) {
+ xfree(smp->sm_lead);
+ return ccnt;
+ }
+
+ if (has_mbyte) {
+ // convert the multi-byte strings to wide char strings
+ smp->sm_lead_w = mb_str2wide(smp->sm_lead);
+ smp->sm_leadlen = mb_charlen(smp->sm_lead);
+ if (smp->sm_oneof == NULL)
+ smp->sm_oneof_w = NULL;
+ else
+ smp->sm_oneof_w = mb_str2wide(smp->sm_oneof);
+ if (smp->sm_to == NULL)
+ smp->sm_to_w = NULL;
+ else
+ smp->sm_to_w = mb_str2wide(smp->sm_to);
+ }
+ }
+
+ if (!GA_EMPTY(gap)) {
+ // Add one extra entry to mark the end with an empty sm_lead. Avoids
+ // that we need to check the index every time.
+ smp = &((salitem_T *)gap->ga_data)[gap->ga_len];
+ p = xmalloc(1);
+ p[0] = NUL;
+ smp->sm_lead = p;
+ smp->sm_leadlen = 0;
+ smp->sm_oneof = NULL;
+ smp->sm_rules = p;
+ smp->sm_to = NULL;
+ if (has_mbyte) {
+ smp->sm_lead_w = mb_str2wide(smp->sm_lead);
+ smp->sm_leadlen = 0;
+ smp->sm_oneof_w = NULL;
+ smp->sm_to_w = NULL;
+ }
+ ++gap->ga_len;
+ }
+
+ // Fill the first-index table.
+ set_sal_first(slang);
+
+ return 0;
+}
+
+// Read SN_WORDS: <word> ...
+// Return SP_*ERROR flags.
+static int read_words_section(FILE *fd, slang_T *lp, int len)
+{
+ int done = 0;
+ int i;
+ int c;
+ char_u word[MAXWLEN];
+
+ while (done < len) {
+ // Read one word at a time.
+ for (i = 0;; ++i) {
+ c = getc(fd);
+ if (c == EOF)
+ return SP_TRUNCERROR;
+ word[i] = c;
+ if (word[i] == NUL)
+ break;
+ if (i == MAXWLEN - 1)
+ return SP_FORMERROR;
+ }
+
+ // Init the count to 10.
+ count_common_word(lp, word, -1, 10);
+ done += i + 1;
+ }
+ return 0;
+}
+
+// SN_SOFO: <sofofromlen> <sofofrom> <sofotolen> <sofoto>
+// Return SP_*ERROR flags.
+static int read_sofo_section(FILE *fd, slang_T *slang)
+{
+ int cnt;
+ char_u *from, *to;
+ int res;
+
+ slang->sl_sofo = true;
+
+ // <sofofromlen> <sofofrom>
+ from = read_cnt_string(fd, 2, &cnt);
+ if (cnt < 0)
+ return cnt;
+
+ // <sofotolen> <sofoto>
+ to = read_cnt_string(fd, 2, &cnt);
+ if (cnt < 0) {
+ xfree(from);
+ return cnt;
+ }
+
+ // Store the info in slang->sl_sal and/or slang->sl_sal_first.
+ if (from != NULL && to != NULL)
+ res = set_sofo(slang, from, to);
+ else if (from != NULL || to != NULL)
+ res = SP_FORMERROR; // only one of two strings is an error
+ else
+ res = 0;
+
+ xfree(from);
+ xfree(to);
+ return res;
+}
+
+// Read the compound section from the .spl file:
+// <compmax> <compminlen> <compsylmax> <compoptions> <compflags>
+// Returns SP_*ERROR flags.
+static int read_compound(FILE *fd, slang_T *slang, int len)
+{
+ int todo = len;
+ int c;
+ int atstart;
+ char_u *pat;
+ char_u *pp;
+ char_u *cp;
+ char_u *ap;
+ char_u *crp;
+ int cnt;
+ garray_T *gap;
+
+ if (todo < 2)
+ return SP_FORMERROR; // need at least two bytes
+
+ --todo;
+ c = getc(fd); // <compmax>
+ if (c < 2)
+ c = MAXWLEN;
+ slang->sl_compmax = c;
+
+ --todo;
+ c = getc(fd); // <compminlen>
+ if (c < 1)
+ c = 0;
+ slang->sl_compminlen = c;
+
+ --todo;
+ c = getc(fd); // <compsylmax>
+ if (c < 1)
+ c = MAXWLEN;
+ slang->sl_compsylmax = c;
+
+ c = getc(fd); // <compoptions>
+ if (c != 0)
+ ungetc(c, fd); // be backwards compatible with Vim 7.0b
+ else {
+ --todo;
+ c = getc(fd); // only use the lower byte for now
+ --todo;
+ slang->sl_compoptions = c;
+
+ gap = &slang->sl_comppat;
+ c = get2c(fd); // <comppatcount>
+ todo -= 2;
+ ga_init(gap, sizeof(char_u *), c);
+ ga_grow(gap, c);
+ while (--c >= 0) {
+ ((char_u **)(gap->ga_data))[gap->ga_len++] =
+ read_cnt_string(fd, 1, &cnt);
+ // <comppatlen> <comppattext>
+ if (cnt < 0)
+ return cnt;
+ todo -= cnt + 1;
+ }
+ }
+ if (todo < 0)
+ return SP_FORMERROR;
+
+ // Turn the COMPOUNDRULE items into a regexp pattern:
+ // "a[bc]/a*b+" -> "^\(a[bc]\|a*b\+\)$".
+ // Inserting backslashes may double the length, "^\(\)$<Nul>" is 7 bytes.
+ // Conversion to utf-8 may double the size.
+ c = todo * 2 + 7;
+ if (enc_utf8)
+ c += todo * 2;
+ pat = xmalloc(c);
+
+ // We also need a list of all flags that can appear at the start and one
+ // for all flags.
+ cp = xmalloc(todo + 1);
+ slang->sl_compstartflags = cp;
+ *cp = NUL;
+
+ ap = xmalloc(todo + 1);
+ slang->sl_compallflags = ap;
+ *ap = NUL;
+
+ // And a list of all patterns in their original form, for checking whether
+ // compounding may work in match_compoundrule(). This is freed when we
+ // encounter a wildcard, the check doesn't work then.
+ crp = xmalloc(todo + 1);
+ slang->sl_comprules = crp;
+
+ pp = pat;
+ *pp++ = '^';
+ *pp++ = '\\';
+ *pp++ = '(';
+
+ atstart = 1;
+ while (todo-- > 0) {
+ c = getc(fd); // <compflags>
+ if (c == EOF) {
+ xfree(pat);
+ return SP_TRUNCERROR;
+ }
+
+ // Add all flags to "sl_compallflags".
+ if (vim_strchr((char_u *)"?*+[]/", c) == NULL
+ && !byte_in_str(slang->sl_compallflags, c)) {
+ *ap++ = c;
+ *ap = NUL;
+ }
+
+ if (atstart != 0) {
+ // At start of item: copy flags to "sl_compstartflags". For a
+ // [abc] item set "atstart" to 2 and copy up to the ']'.
+ if (c == '[')
+ atstart = 2;
+ else if (c == ']')
+ atstart = 0;
+ else {
+ if (!byte_in_str(slang->sl_compstartflags, c)) {
+ *cp++ = c;
+ *cp = NUL;
+ }
+ if (atstart == 1)
+ atstart = 0;
+ }
+ }
+
+ // Copy flag to "sl_comprules", unless we run into a wildcard.
+ if (crp != NULL) {
+ if (c == '?' || c == '+' || c == '*') {
+ xfree(slang->sl_comprules);
+ slang->sl_comprules = NULL;
+ crp = NULL;
+ } else
+ *crp++ = c;
+ }
+
+ if (c == '/') { // slash separates two items
+ *pp++ = '\\';
+ *pp++ = '|';
+ atstart = 1;
+ } else { // normal char, "[abc]" and '*' are copied as-is
+ if (c == '?' || c == '+' || c == '~') {
+ *pp++ = '\\'; // "a?" becomes "a\?", "a+" becomes "a\+"
+ }
+ pp += utf_char2bytes(c, pp);
+ }
+ }
+
+ *pp++ = '\\';
+ *pp++ = ')';
+ *pp++ = '$';
+ *pp = NUL;
+
+ if (crp != NULL)
+ *crp = NUL;
+
+ slang->sl_compprog = vim_regcomp(pat, RE_MAGIC + RE_STRING + RE_STRICT);
+ xfree(pat);
+ if (slang->sl_compprog == NULL)
+ return SP_FORMERROR;
+
+ return 0;
+}
+
+// Set the SOFOFROM and SOFOTO items in language "lp".
+// Returns SP_*ERROR flags when there is something wrong.
+static int set_sofo(slang_T *lp, char_u *from, char_u *to)
+{
+ int i;
+
+ garray_T *gap;
+ char_u *s;
+ char_u *p;
+ int c;
+ int *inp;
+
+ if (has_mbyte) {
+ // Use "sl_sal" as an array with 256 pointers to a list of wide
+ // characters. The index is the low byte of the character.
+ // The list contains from-to pairs with a terminating NUL.
+ // sl_sal_first[] is used for latin1 "from" characters.
+ gap = &lp->sl_sal;
+ ga_init(gap, sizeof(int *), 1);
+ ga_grow(gap, 256);
+ memset(gap->ga_data, 0, sizeof(int *) * 256);
+ gap->ga_len = 256;
+
+ // First count the number of items for each list. Temporarily use
+ // sl_sal_first[] for this.
+ for (p = from, s = to; *p != NUL && *s != NUL; ) {
+ c = mb_cptr2char_adv((const char_u **)&p);
+ MB_CPTR_ADV(s);
+ if (c >= 256) {
+ lp->sl_sal_first[c & 0xff]++;
+ }
+ }
+ if (*p != NUL || *s != NUL) // lengths differ
+ return SP_FORMERROR;
+
+ // Allocate the lists.
+ for (i = 0; i < 256; ++i)
+ if (lp->sl_sal_first[i] > 0) {
+ p = xmalloc(sizeof(int) * (lp->sl_sal_first[i] * 2 + 1));
+ ((int **)gap->ga_data)[i] = (int *)p;
+ *(int *)p = 0;
+ }
+
+ // Put the characters up to 255 in sl_sal_first[] the rest in a sl_sal
+ // list.
+ memset(lp->sl_sal_first, 0, sizeof(salfirst_T) * 256);
+ for (p = from, s = to; *p != NUL && *s != NUL; ) {
+ c = mb_cptr2char_adv((const char_u **)&p);
+ i = mb_cptr2char_adv((const char_u **)&s);
+ if (c >= 256) {
+ // Append the from-to chars at the end of the list with
+ // the low byte.
+ inp = ((int **)gap->ga_data)[c & 0xff];
+ while (*inp != 0)
+ ++inp;
+ *inp++ = c; // from char
+ *inp++ = i; // to char
+ *inp++ = NUL; // NUL at the end
+ } else
+ // mapping byte to char is done in sl_sal_first[]
+ lp->sl_sal_first[c] = i;
+ }
+ } else {
+ // mapping bytes to bytes is done in sl_sal_first[]
+ if (STRLEN(from) != STRLEN(to))
+ return SP_FORMERROR;
+
+ for (i = 0; to[i] != NUL; ++i)
+ lp->sl_sal_first[from[i]] = to[i];
+ lp->sl_sal.ga_len = 1; // indicates we have soundfolding
+ }
+
+ return 0;
+}
+
+// Fill the first-index table for "lp".
+static void set_sal_first(slang_T *lp)
+{
+ salfirst_T *sfirst;
+ salitem_T *smp;
+ int c;
+ garray_T *gap = &lp->sl_sal;
+
+ sfirst = lp->sl_sal_first;
+ for (int i = 0; i < 256; ++i) {
+ sfirst[i] = -1;
+ }
+ smp = (salitem_T *)gap->ga_data;
+ for (int i = 0; i < gap->ga_len; ++i) {
+ if (has_mbyte)
+ // Use the lowest byte of the first character. For latin1 it's
+ // the character, for other encodings it should differ for most
+ // characters.
+ c = *smp[i].sm_lead_w & 0xff;
+ else
+ c = *smp[i].sm_lead;
+ if (sfirst[c] == -1) {
+ sfirst[c] = i;
+ if (has_mbyte) {
+ int n;
+
+ // Make sure all entries with this byte are following each
+ // other. Move the ones that are in the wrong position. Do
+ // keep the same ordering!
+ while (i + 1 < gap->ga_len
+ && (*smp[i + 1].sm_lead_w & 0xff) == c)
+ // Skip over entry with same index byte.
+ ++i;
+
+ for (n = 1; i + n < gap->ga_len; ++n)
+ if ((*smp[i + n].sm_lead_w & 0xff) == c) {
+ salitem_T tsal;
+
+ // Move entry with same index byte after the entries
+ // we already found.
+ ++i;
+ --n;
+ tsal = smp[i + n];
+ memmove(smp + i + 1, smp + i,
+ sizeof(salitem_T) * n);
+ smp[i] = tsal;
+ }
+ }
+ }
+ }
+}
+
+// Turn a multi-byte string into a wide character string.
+// Return it in allocated memory.
+static int *mb_str2wide(char_u *s)
+{
+ int i = 0;
+
+ int *res = xmalloc((mb_charlen(s) + 1) * sizeof(int));
+ for (char_u *p = s; *p != NUL; ) {
+ res[i++] = mb_ptr2char_adv((const char_u **)&p);
+ }
+ res[i] = NUL;
+
+ return res;
+}
+
+// Reads a tree from the .spl or .sug file.
+// Allocates the memory and stores pointers in "bytsp" and "idxsp".
+// This is skipped when the tree has zero length.
+// Returns zero when OK, SP_ value for an error.
+static int
+spell_read_tree (
+ FILE *fd,
+ char_u **bytsp,
+ idx_T **idxsp,
+ bool prefixtree, // true for the prefix tree
+ int prefixcnt // when "prefixtree" is true: prefix count
+)
+{
+ int idx;
+ char_u *bp;
+ idx_T *ip;
+
+ // The tree size was computed when writing the file, so that we can
+ // allocate it as one long block. <nodecount>
+ long len = get4c(fd);
+ if (len < 0) {
+ return SP_TRUNCERROR;
+ }
+ if ((size_t)len >= SIZE_MAX / sizeof(int)) { // -V547
+ // Invalid length, multiply with sizeof(int) would overflow.
+ return SP_FORMERROR;
+ }
+ if (len > 0) {
+ // Allocate the byte array.
+ bp = xmalloc(len);
+ *bytsp = bp;
+
+ // Allocate the index array.
+ ip = xcalloc(len, sizeof(*ip));
+ *idxsp = ip;
+
+ // Recursively read the tree and store it in the array.
+ idx = read_tree_node(fd, bp, ip, len, 0, prefixtree, prefixcnt);
+ if (idx < 0)
+ return idx;
+ }
+ return 0;
+}
+
+// Read one row of siblings from the spell file and store it in the byte array
+// "byts" and index array "idxs". Recursively read the children.
+//
+// NOTE: The code here must match put_node()!
+//
+// Returns the index (>= 0) following the siblings.
+// Returns SP_TRUNCERROR if the file is shorter than expected.
+// Returns SP_FORMERROR if there is a format error.
+static idx_T
+read_tree_node (
+ FILE *fd,
+ char_u *byts,
+ idx_T *idxs,
+ int maxidx, // size of arrays
+ idx_T startidx, // current index in "byts" and "idxs"
+ bool prefixtree, // true for reading PREFIXTREE
+ int maxprefcondnr // maximum for <prefcondnr>
+)
+{
+ int len;
+ int i;
+ int n;
+ idx_T idx = startidx;
+ int c;
+ int c2;
+#define SHARED_MASK 0x8000000
+
+ len = getc(fd); // <siblingcount>
+ if (len <= 0)
+ return SP_TRUNCERROR;
+
+ if (startidx + len >= maxidx)
+ return SP_FORMERROR;
+ byts[idx++] = len;
+
+ // Read the byte values, flag/region bytes and shared indexes.
+ for (i = 1; i <= len; ++i) {
+ c = getc(fd); // <byte>
+ if (c < 0)
+ return SP_TRUNCERROR;
+ if (c <= BY_SPECIAL) {
+ if (c == BY_NOFLAGS && !prefixtree) {
+ // No flags, all regions.
+ idxs[idx] = 0;
+ c = 0;
+ } else if (c != BY_INDEX) {
+ if (prefixtree) {
+ // Read the optional pflags byte, the prefix ID and the
+ // condition nr. In idxs[] store the prefix ID in the low
+ // byte, the condition index shifted up 8 bits, the flags
+ // shifted up 24 bits.
+ if (c == BY_FLAGS)
+ c = getc(fd) << 24; // <pflags>
+ else
+ c = 0;
+
+ c |= getc(fd); // <affixID>
+
+ n = get2c(fd); // <prefcondnr>
+ if (n >= maxprefcondnr)
+ return SP_FORMERROR;
+ c |= (n << 8);
+ } else { // c must be BY_FLAGS or BY_FLAGS2
+ // Read flags and optional region and prefix ID. In
+ // idxs[] the flags go in the low two bytes, region above
+ // that and prefix ID above the region.
+ c2 = c;
+ c = getc(fd); // <flags>
+ if (c2 == BY_FLAGS2)
+ c = (getc(fd) << 8) + c; // <flags2>
+ if (c & WF_REGION)
+ c = (getc(fd) << 16) + c; // <region>
+ if (c & WF_AFX)
+ c = (getc(fd) << 24) + c; // <affixID>
+ }
+
+ idxs[idx] = c;
+ c = 0;
+ } else { // c == BY_INDEX
+ // <nodeidx>
+ n = get3c(fd);
+ if (n < 0 || n >= maxidx)
+ return SP_FORMERROR;
+ idxs[idx] = n + SHARED_MASK;
+ c = getc(fd); // <xbyte>
+ }
+ }
+ byts[idx++] = c;
+ }
+
+ // Recursively read the children for non-shared siblings.
+ // Skip the end-of-word ones (zero byte value) and the shared ones (and
+ // remove SHARED_MASK)
+ for (i = 1; i <= len; ++i)
+ if (byts[startidx + i] != 0) {
+ if (idxs[startidx + i] & SHARED_MASK)
+ idxs[startidx + i] &= ~SHARED_MASK;
+ else {
+ idxs[startidx + i] = idx;
+ idx = read_tree_node(fd, byts, idxs, maxidx, idx,
+ prefixtree, maxprefcondnr);
+ if (idx < 0)
+ break;
+ }
+ }
+
+ return idx;
+}
+
+// Reload the spell file "fname" if it's loaded.
+static void
+spell_reload_one (
+ char_u *fname,
+ bool added_word // invoked through "zg"
+)
+{
+ slang_T *slang;
+ bool didit = false;
+
+ for (slang = first_lang; slang != NULL; slang = slang->sl_next) {
+ if (path_full_compare(fname, slang->sl_fname, false) == kEqualFiles) {
+ slang_clear(slang);
+ if (spell_load_file(fname, NULL, slang, false) == NULL)
+ // reloading failed, clear the language
+ slang_clear(slang);
+ redraw_all_later(SOME_VALID);
+ didit = true;
+ }
+ }
+
+ // When "zg" was used and the file wasn't loaded yet, should redo
+ // 'spelllang' to load it now.
+ if (added_word && !didit)
+ did_set_spelllang(curwin);
+}
+
+// Functions for ":mkspell".
+
+// In the postponed prefixes tree wn_flags is used to store the WFP_ flags,
+// but it must be negative to indicate the prefix tree to tree_add_word().
+// Use a negative number with the lower 8 bits zero.
+#define PFX_FLAGS -256
+
+// flags for "condit" argument of store_aff_word()
+#define CONDIT_COMB 1 // affix must combine
+#define CONDIT_CFIX 2 // affix must have CIRCUMFIX flag
+#define CONDIT_SUF 4 // add a suffix for matching flags
+#define CONDIT_AFF 8 // word already has an affix
+
+// Tunable parameters for when the tree is compressed. See 'mkspellmem'.
+static long compress_start = 30000; // memory / SBLOCKSIZE
+static long compress_inc = 100; // memory / SBLOCKSIZE
+static long compress_added = 500000; // word count
+
+// Check the 'mkspellmem' option. Return FAIL if it's wrong.
+// Sets "sps_flags".
+int spell_check_msm(void)
+{
+ char_u *p = p_msm;
+ long start = 0;
+ long incr = 0;
+ long added = 0;
+
+ if (!ascii_isdigit(*p))
+ return FAIL;
+ // block count = (value * 1024) / SBLOCKSIZE (but avoid overflow)
+ start = (getdigits_long(&p) * 10) / (SBLOCKSIZE / 102);
+ if (*p != ',')
+ return FAIL;
+ ++p;
+ if (!ascii_isdigit(*p))
+ return FAIL;
+ incr = (getdigits_long(&p) * 102) / (SBLOCKSIZE / 10);
+ if (*p != ',')
+ return FAIL;
+ ++p;
+ if (!ascii_isdigit(*p))
+ return FAIL;
+ added = getdigits_long(&p) * 1024;
+ if (*p != NUL)
+ return FAIL;
+
+ if (start == 0 || incr == 0 || added == 0 || incr > start)
+ return FAIL;
+
+ compress_start = start;
+ compress_inc = incr;
+ compress_added = added;
+ return OK;
+}
+
+#ifdef SPELL_PRINTTREE
+// For debugging the tree code: print the current tree in a (more or less)
+// readable format, so that we can see what happens when adding a word and/or
+// compressing the tree.
+// Based on code from Olaf Seibert.
+#define PRINTLINESIZE 1000
+#define PRINTWIDTH 6
+
+#define PRINTSOME(l, depth, fmt, a1, a2) vim_snprintf(l + depth * PRINTWIDTH, \
+ PRINTLINESIZE - PRINTWIDTH * depth, fmt, a1, a2)
+
+static char line1[PRINTLINESIZE];
+static char line2[PRINTLINESIZE];
+static char line3[PRINTLINESIZE];
+
+static void spell_clear_flags(wordnode_T *node)
+{
+ wordnode_T *np;
+
+ for (np = node; np != NULL; np = np->wn_sibling) {
+ np->wn_u1.index = FALSE;
+ spell_clear_flags(np->wn_child);
+ }
+}
+
+static void spell_print_node(wordnode_T *node, int depth)
+{
+ if (node->wn_u1.index) {
+ // Done this node before, print the reference.
+ PRINTSOME(line1, depth, "(%d)", node->wn_nr, 0);
+ PRINTSOME(line2, depth, " ", 0, 0);
+ PRINTSOME(line3, depth, " ", 0, 0);
+ msg((char_u *)line1);
+ msg((char_u *)line2);
+ msg((char_u *)line3);
+ } else {
+ node->wn_u1.index = TRUE;
+
+ if (node->wn_byte != NUL) {
+ if (node->wn_child != NULL)
+ PRINTSOME(line1, depth, " %c -> ", node->wn_byte, 0);
+ else
+ // Cannot happen?
+ PRINTSOME(line1, depth, " %c ???", node->wn_byte, 0);
+ } else
+ PRINTSOME(line1, depth, " $ ", 0, 0);
+
+ PRINTSOME(line2, depth, "%d/%d ", node->wn_nr, node->wn_refs);
+
+ if (node->wn_sibling != NULL)
+ PRINTSOME(line3, depth, " | ", 0, 0);
+ else
+ PRINTSOME(line3, depth, " ", 0, 0);
+
+ if (node->wn_byte == NUL) {
+ msg((char_u *)line1);
+ msg((char_u *)line2);
+ msg((char_u *)line3);
+ }
+
+ // do the children
+ if (node->wn_byte != NUL && node->wn_child != NULL)
+ spell_print_node(node->wn_child, depth + 1);
+
+ // do the siblings
+ if (node->wn_sibling != NULL) {
+ // get rid of all parent details except |
+ STRCPY(line1, line3);
+ STRCPY(line2, line3);
+ spell_print_node(node->wn_sibling, depth);
+ }
+ }
+}
+
+static void spell_print_tree(wordnode_T *root)
+{
+ if (root != NULL) {
+ // Clear the "wn_u1.index" fields, used to remember what has been
+ // done.
+ spell_clear_flags(root);
+
+ // Recursively print the tree.
+ spell_print_node(root, 0);
+ }
+}
+
+#endif // SPELL_PRINTTREE
+
+// Reads the affix file "fname".
+// Returns an afffile_T, NULL for complete failure.
+static afffile_T *spell_read_aff(spellinfo_T *spin, char_u *fname)
+{
+ FILE *fd;
+ char_u rline[MAXLINELEN];
+ char_u *line;
+ char_u *pc = NULL;
+#define MAXITEMCNT 30
+ char_u *(items[MAXITEMCNT]);
+ int itemcnt;
+ char_u *p;
+ int lnum = 0;
+ affheader_T *cur_aff = NULL;
+ bool did_postpone_prefix = false;
+ int aff_todo = 0;
+ hashtab_T *tp;
+ char_u *low = NULL;
+ char_u *fol = NULL;
+ char_u *upp = NULL;
+ int do_rep;
+ int do_repsal;
+ int do_sal;
+ int do_mapline;
+ bool found_map = false;
+ hashitem_T *hi;
+ int l;
+ int compminlen = 0; // COMPOUNDMIN value
+ int compsylmax = 0; // COMPOUNDSYLMAX value
+ int compoptions = 0; // COMP_ flags
+ int compmax = 0; // COMPOUNDWORDMAX value
+ char_u *compflags = NULL; // COMPOUNDFLAG and COMPOUNDRULE
+ // concatenated
+ char_u *midword = NULL; // MIDWORD value
+ char_u *syllable = NULL; // SYLLABLE value
+ char_u *sofofrom = NULL; // SOFOFROM value
+ char_u *sofoto = NULL; // SOFOTO value
+
+ // Open the file.
+ fd = mch_fopen((char *)fname, "r");
+ if (fd == NULL) {
+ EMSG2(_(e_notopen), fname);
+ return NULL;
+ }
+
+ vim_snprintf((char *)IObuff, IOSIZE, _("Reading affix file %s..."), fname);
+ spell_message(spin, IObuff);
+
+ // Only do REP lines when not done in another .aff file already.
+ do_rep = GA_EMPTY(&spin->si_rep);
+
+ // Only do REPSAL lines when not done in another .aff file already.
+ do_repsal = GA_EMPTY(&spin->si_repsal);
+
+ // Only do SAL lines when not done in another .aff file already.
+ do_sal = GA_EMPTY(&spin->si_sal);
+
+ // Only do MAP lines when not done in another .aff file already.
+ do_mapline = GA_EMPTY(&spin->si_map);
+
+ // Allocate and init the afffile_T structure.
+ afffile_T *aff = getroom(spin, sizeof(*aff), true);
+ hash_init(&aff->af_pref);
+ hash_init(&aff->af_suff);
+ hash_init(&aff->af_comp);
+
+ // Read all the lines in the file one by one.
+ while (!vim_fgets(rline, MAXLINELEN, fd) && !got_int) {
+ line_breakcheck();
+ ++lnum;
+
+ // Skip comment lines.
+ if (*rline == '#')
+ continue;
+
+ // Convert from "SET" to 'encoding' when needed.
+ xfree(pc);
+ if (spin->si_conv.vc_type != CONV_NONE) {
+ pc = string_convert(&spin->si_conv, rline, NULL);
+ if (pc == NULL) {
+ smsg(_("Conversion failure for word in %s line %d: %s"),
+ fname, lnum, rline);
+ continue;
+ }
+ line = pc;
+ } else {
+ pc = NULL;
+ line = rline;
+ }
+
+ // Split the line up in white separated items. Put a NUL after each
+ // item.
+ itemcnt = 0;
+ for (p = line;; ) {
+ while (*p != NUL && *p <= ' ') // skip white space and CR/NL
+ ++p;
+ if (*p == NUL)
+ break;
+ if (itemcnt == MAXITEMCNT) // too many items
+ break;
+ items[itemcnt++] = p;
+ // A few items have arbitrary text argument, don't split them.
+ if (itemcnt == 2 && spell_info_item(items[0]))
+ while (*p >= ' ' || *p == TAB) // skip until CR/NL
+ ++p;
+ else
+ while (*p > ' ') // skip until white space or CR/NL
+ ++p;
+ if (*p == NUL)
+ break;
+ *p++ = NUL;
+ }
+
+ // Handle non-empty lines.
+ if (itemcnt > 0) {
+ if (is_aff_rule(items, itemcnt, "SET", 2) && aff->af_enc == NULL) {
+ // Setup for conversion from "ENC" to 'encoding'.
+ aff->af_enc = enc_canonize(items[1]);
+ if (!spin->si_ascii
+ && convert_setup(&spin->si_conv, aff->af_enc,
+ p_enc) == FAIL)
+ smsg(_("Conversion in %s not supported: from %s to %s"),
+ fname, aff->af_enc, p_enc);
+ spin->si_conv.vc_fail = true;
+ } else if (is_aff_rule(items, itemcnt, "FLAG", 2)
+ && aff->af_flagtype == AFT_CHAR) {
+ if (STRCMP(items[1], "long") == 0)
+ aff->af_flagtype = AFT_LONG;
+ else if (STRCMP(items[1], "num") == 0)
+ aff->af_flagtype = AFT_NUM;
+ else if (STRCMP(items[1], "caplong") == 0)
+ aff->af_flagtype = AFT_CAPLONG;
+ else
+ smsg(_("Invalid value for FLAG in %s line %d: %s"),
+ fname, lnum, items[1]);
+ if (aff->af_rare != 0
+ || aff->af_keepcase != 0
+ || aff->af_bad != 0
+ || aff->af_needaffix != 0
+ || aff->af_circumfix != 0
+ || aff->af_needcomp != 0
+ || aff->af_comproot != 0
+ || aff->af_nosuggest != 0
+ || compflags != NULL
+ || aff->af_suff.ht_used > 0
+ || aff->af_pref.ht_used > 0)
+ smsg(_("FLAG after using flags in %s line %d: %s"),
+ fname, lnum, items[1]);
+ } else if (spell_info_item(items[0]) && itemcnt > 1) {
+ p = getroom(spin,
+ (spin->si_info == NULL ? 0 : STRLEN(spin->si_info))
+ + STRLEN(items[0])
+ + STRLEN(items[1]) + 3, false);
+ if (spin->si_info != NULL) {
+ STRCPY(p, spin->si_info);
+ STRCAT(p, "\n");
+ }
+ STRCAT(p, items[0]);
+ STRCAT(p, " ");
+ STRCAT(p, items[1]);
+ spin->si_info = p;
+ } else if (is_aff_rule(items, itemcnt, "MIDWORD", 2)
+ && midword == NULL) {
+ midword = getroom_save(spin, items[1]);
+ } else if (is_aff_rule(items, itemcnt, "TRY", 2)) {
+ // ignored, we look in the tree for what chars may appear
+ }
+ // TODO: remove "RAR" later
+ else if ((is_aff_rule(items, itemcnt, "RAR", 2)
+ || is_aff_rule(items, itemcnt, "RARE", 2))
+ && aff->af_rare == 0) {
+ aff->af_rare = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ }
+ // TODO: remove "KEP" later
+ else if ((is_aff_rule(items, itemcnt, "KEP", 2)
+ || is_aff_rule(items, itemcnt, "KEEPCASE", 2))
+ && aff->af_keepcase == 0) {
+ aff->af_keepcase = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ } else if ((is_aff_rule(items, itemcnt, "BAD", 2)
+ || is_aff_rule(items, itemcnt, "FORBIDDENWORD", 2))
+ && aff->af_bad == 0) {
+ aff->af_bad = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ } else if (is_aff_rule(items, itemcnt, "NEEDAFFIX", 2)
+ && aff->af_needaffix == 0) {
+ aff->af_needaffix = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ } else if (is_aff_rule(items, itemcnt, "CIRCUMFIX", 2)
+ && aff->af_circumfix == 0) {
+ aff->af_circumfix = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ } else if (is_aff_rule(items, itemcnt, "NOSUGGEST", 2)
+ && aff->af_nosuggest == 0) {
+ aff->af_nosuggest = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ } else if ((is_aff_rule(items, itemcnt, "NEEDCOMPOUND", 2)
+ || is_aff_rule(items, itemcnt, "ONLYINCOMPOUND", 2))
+ && aff->af_needcomp == 0) {
+ aff->af_needcomp = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ } else if (is_aff_rule(items, itemcnt, "COMPOUNDROOT", 2)
+ && aff->af_comproot == 0) {
+ aff->af_comproot = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ } else if (is_aff_rule(items, itemcnt, "COMPOUNDFORBIDFLAG", 2)
+ && aff->af_compforbid == 0) {
+ aff->af_compforbid = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ if (aff->af_pref.ht_used > 0)
+ smsg(_("Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line %d"),
+ fname, lnum);
+ } else if (is_aff_rule(items, itemcnt, "COMPOUNDPERMITFLAG", 2)
+ && aff->af_comppermit == 0) {
+ aff->af_comppermit = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ if (aff->af_pref.ht_used > 0)
+ smsg(_("Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line %d"),
+ fname, lnum);
+ } else if (is_aff_rule(items, itemcnt, "COMPOUNDFLAG", 2)
+ && compflags == NULL) {
+ // Turn flag "c" into COMPOUNDRULE compatible string "c+",
+ // "Na" into "Na+", "1234" into "1234+".
+ p = getroom(spin, STRLEN(items[1]) + 2, false);
+ STRCPY(p, items[1]);
+ STRCAT(p, "+");
+ compflags = p;
+ } else if (is_aff_rule(items, itemcnt, "COMPOUNDRULES", 2)) {
+ // We don't use the count, but do check that it's a number and
+ // not COMPOUNDRULE mistyped.
+ if (atoi((char *)items[1]) == 0)
+ smsg(_("Wrong COMPOUNDRULES value in %s line %d: %s"),
+ fname, lnum, items[1]);
+ } else if (is_aff_rule(items, itemcnt, "COMPOUNDRULE", 2)) {
+ // Don't use the first rule if it is a number.
+ if (compflags != NULL || *skipdigits(items[1]) != NUL) {
+ // Concatenate this string to previously defined ones,
+ // using a slash to separate them.
+ l = (int)STRLEN(items[1]) + 1;
+ if (compflags != NULL)
+ l += (int)STRLEN(compflags) + 1;
+ p = getroom(spin, l, false);
+ if (compflags != NULL) {
+ STRCPY(p, compflags);
+ STRCAT(p, "/");
+ }
+ STRCAT(p, items[1]);
+ compflags = p;
+ }
+ } else if (is_aff_rule(items, itemcnt, "COMPOUNDWORDMAX", 2)
+ && compmax == 0) {
+ compmax = atoi((char *)items[1]);
+ if (compmax == 0)
+ smsg(_("Wrong COMPOUNDWORDMAX value in %s line %d: %s"),
+ fname, lnum, items[1]);
+ } else if (is_aff_rule(items, itemcnt, "COMPOUNDMIN", 2)
+ && compminlen == 0) {
+ compminlen = atoi((char *)items[1]);
+ if (compminlen == 0)
+ smsg(_("Wrong COMPOUNDMIN value in %s line %d: %s"),
+ fname, lnum, items[1]);
+ } else if (is_aff_rule(items, itemcnt, "COMPOUNDSYLMAX", 2)
+ && compsylmax == 0) {
+ compsylmax = atoi((char *)items[1]);
+ if (compsylmax == 0)
+ smsg(_("Wrong COMPOUNDSYLMAX value in %s line %d: %s"),
+ fname, lnum, items[1]);
+ } else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDDUP", 1)) {
+ compoptions |= COMP_CHECKDUP;
+ } else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDREP", 1)) {
+ compoptions |= COMP_CHECKREP;
+ } else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDCASE", 1)) {
+ compoptions |= COMP_CHECKCASE;
+ } else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDTRIPLE", 1)) {
+ compoptions |= COMP_CHECKTRIPLE;
+ } else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDPATTERN", 2)) {
+ if (atoi((char *)items[1]) == 0)
+ smsg(_("Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"),
+ fname, lnum, items[1]);
+ } else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDPATTERN", 3)) {
+ garray_T *gap = &spin->si_comppat;
+ int i;
+
+ // Only add the couple if it isn't already there.
+ for (i = 0; i < gap->ga_len - 1; i += 2)
+ if (STRCMP(((char_u **)(gap->ga_data))[i], items[1]) == 0
+ && STRCMP(((char_u **)(gap->ga_data))[i + 1],
+ items[2]) == 0)
+ break;
+ if (i >= gap->ga_len) {
+ ga_grow(gap, 2);
+ ((char_u **)(gap->ga_data))[gap->ga_len++]
+ = getroom_save(spin, items[1]);
+ ((char_u **)(gap->ga_data))[gap->ga_len++]
+ = getroom_save(spin, items[2]);
+ }
+ } else if (is_aff_rule(items, itemcnt, "SYLLABLE", 2)
+ && syllable == NULL) {
+ syllable = getroom_save(spin, items[1]);
+ } else if (is_aff_rule(items, itemcnt, "NOBREAK", 1)) {
+ spin->si_nobreak = true;
+ } else if (is_aff_rule(items, itemcnt, "NOSPLITSUGS", 1)) {
+ spin->si_nosplitsugs = true;
+ } else if (is_aff_rule(items, itemcnt, "NOCOMPOUNDSUGS", 1)) {
+ spin->si_nocompoundsugs = true;
+ } else if (is_aff_rule(items, itemcnt, "NOSUGFILE", 1)) {
+ spin->si_nosugfile = true;
+ } else if (is_aff_rule(items, itemcnt, "PFXPOSTPONE", 1)) {
+ aff->af_pfxpostpone = true;
+ } else if (is_aff_rule(items, itemcnt, "IGNOREEXTRA", 1)) {
+ aff->af_ignoreextra = true;
+ } else if ((STRCMP(items[0], "PFX") == 0
+ || STRCMP(items[0], "SFX") == 0)
+ && aff_todo == 0
+ && itemcnt >= 4) {
+ int lasti = 4;
+ char_u key[AH_KEY_LEN];
+
+ if (*items[0] == 'P')
+ tp = &aff->af_pref;
+ else
+ tp = &aff->af_suff;
+
+ // Myspell allows the same affix name to be used multiple
+ // times. The affix files that do this have an undocumented
+ // "S" flag on all but the last block, thus we check for that
+ // and store it in ah_follows.
+ STRLCPY(key, items[1], AH_KEY_LEN);
+ hi = hash_find(tp, key);
+ if (!HASHITEM_EMPTY(hi)) {
+ cur_aff = HI2AH(hi);
+ if (cur_aff->ah_combine != (*items[2] == 'Y'))
+ smsg(_("Different combining flag in continued affix block in %s line %d: %s"),
+ fname, lnum, items[1]);
+ if (!cur_aff->ah_follows)
+ smsg(_("Duplicate affix in %s line %d: %s"),
+ fname, lnum, items[1]);
+ } else {
+ // New affix letter.
+ cur_aff = getroom(spin, sizeof(*cur_aff), true);
+ cur_aff->ah_flag = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ if (cur_aff->ah_flag == 0 || STRLEN(items[1]) >= AH_KEY_LEN) {
+ break;
+ }
+ if (cur_aff->ah_flag == aff->af_bad
+ || cur_aff->ah_flag == aff->af_rare
+ || cur_aff->ah_flag == aff->af_keepcase
+ || cur_aff->ah_flag == aff->af_needaffix
+ || cur_aff->ah_flag == aff->af_circumfix
+ || cur_aff->ah_flag == aff->af_nosuggest
+ || cur_aff->ah_flag == aff->af_needcomp
+ || cur_aff->ah_flag == aff->af_comproot) {
+ smsg(_("Affix also used for "
+ "BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST"
+ "in %s line %d: %s"),
+ fname, lnum, items[1]);
+ }
+ STRCPY(cur_aff->ah_key, items[1]);
+ hash_add(tp, cur_aff->ah_key);
+
+ cur_aff->ah_combine = (*items[2] == 'Y');
+ }
+
+ // Check for the "S" flag, which apparently means that another
+ // block with the same affix name is following.
+ if (itemcnt > lasti && STRCMP(items[lasti], "S") == 0) {
+ ++lasti;
+ cur_aff->ah_follows = true;
+ } else
+ cur_aff->ah_follows = false;
+
+ // Myspell allows extra text after the item, but that might
+ // mean mistakes go unnoticed. Require a comment-starter,
+ // unless IGNOREEXTRA is used. Hunspell uses a "-" item.
+ if (itemcnt > lasti
+ && !aff->af_ignoreextra
+ && *items[lasti] != '#')
+ smsg(_(e_afftrailing), fname, lnum, items[lasti]);
+
+ if (STRCMP(items[2], "Y") != 0 && STRCMP(items[2], "N") != 0)
+ smsg(_("Expected Y or N in %s line %d: %s"),
+ fname, lnum, items[2]);
+
+ if (*items[0] == 'P' && aff->af_pfxpostpone) {
+ if (cur_aff->ah_newID == 0) {
+ // Use a new number in the .spl file later, to be able
+ // to handle multiple .aff files.
+ check_renumber(spin);
+ cur_aff->ah_newID = ++spin->si_newprefID;
+
+ // We only really use ah_newID if the prefix is
+ // postponed. We know that only after handling all
+ // the items.
+ did_postpone_prefix = false;
+ } else
+ // Did use the ID in a previous block.
+ did_postpone_prefix = true;
+ }
+
+ aff_todo = atoi((char *)items[3]);
+ } else if ((STRCMP(items[0], "PFX") == 0
+ || STRCMP(items[0], "SFX") == 0)
+ && aff_todo > 0
+ && STRCMP(cur_aff->ah_key, items[1]) == 0
+ && itemcnt >= 5) {
+ affentry_T *aff_entry;
+ bool upper = false;
+ int lasti = 5;
+
+ // Myspell allows extra text after the item, but that might
+ // mean mistakes go unnoticed. Require a comment-starter.
+ // Hunspell uses a "-" item.
+ if (itemcnt > lasti && *items[lasti] != '#'
+ && (STRCMP(items[lasti], "-") != 0
+ || itemcnt != lasti + 1))
+ smsg(_(e_afftrailing), fname, lnum, items[lasti]);
+
+ // New item for an affix letter.
+ aff_todo--;
+ aff_entry = getroom(spin, sizeof(*aff_entry), true);
+
+ if (STRCMP(items[2], "0") != 0)
+ aff_entry->ae_chop = getroom_save(spin, items[2]);
+ if (STRCMP(items[3], "0") != 0) {
+ aff_entry->ae_add = getroom_save(spin, items[3]);
+
+ // Recognize flags on the affix: abcd/XYZ
+ aff_entry->ae_flags = vim_strchr(aff_entry->ae_add, '/');
+ if (aff_entry->ae_flags != NULL) {
+ *aff_entry->ae_flags++ = NUL;
+ aff_process_flags(aff, aff_entry);
+ }
+ }
+
+ // Don't use an affix entry with non-ASCII characters when
+ // "spin->si_ascii" is true.
+ if (!spin->si_ascii || !(has_non_ascii(aff_entry->ae_chop)
+ || has_non_ascii(aff_entry->ae_add))) {
+ aff_entry->ae_next = cur_aff->ah_first;
+ cur_aff->ah_first = aff_entry;
+
+ if (STRCMP(items[4], ".") != 0) {
+ char_u buf[MAXLINELEN];
+
+ aff_entry->ae_cond = getroom_save(spin, items[4]);
+ if (*items[0] == 'P')
+ sprintf((char *)buf, "^%s", items[4]);
+ else
+ sprintf((char *)buf, "%s$", items[4]);
+ aff_entry->ae_prog = vim_regcomp(buf,
+ RE_MAGIC + RE_STRING + RE_STRICT);
+ if (aff_entry->ae_prog == NULL)
+ smsg(_("Broken condition in %s line %d: %s"),
+ fname, lnum, items[4]);
+ }
+
+ // For postponed prefixes we need an entry in si_prefcond
+ // for the condition. Use an existing one if possible.
+ // Can't be done for an affix with flags, ignoring
+ // COMPOUNDFORBIDFLAG and COMPOUNDPERMITFLAG.
+ if (*items[0] == 'P' && aff->af_pfxpostpone
+ && aff_entry->ae_flags == NULL) {
+ // When the chop string is one lower-case letter and
+ // the add string ends in the upper-case letter we set
+ // the "upper" flag, clear "ae_chop" and remove the
+ // letters from "ae_add". The condition must either
+ // be empty or start with the same letter.
+ if (aff_entry->ae_chop != NULL
+ && aff_entry->ae_add != NULL
+ && aff_entry->ae_chop[(*mb_ptr2len)(
+ aff_entry->ae_chop)] == NUL
+ ) {
+ int c, c_up;
+
+ c = PTR2CHAR(aff_entry->ae_chop);
+ c_up = SPELL_TOUPPER(c);
+ if (c_up != c
+ && (aff_entry->ae_cond == NULL
+ || PTR2CHAR(aff_entry->ae_cond) == c)) {
+ p = aff_entry->ae_add
+ + STRLEN(aff_entry->ae_add);
+ MB_PTR_BACK(aff_entry->ae_add, p);
+ if (PTR2CHAR(p) == c_up) {
+ upper = true;
+ aff_entry->ae_chop = NULL;
+ *p = NUL;
+
+ // The condition is matched with the
+ // actual word, thus must check for the
+ // upper-case letter.
+ if (aff_entry->ae_cond != NULL) {
+ char_u buf[MAXLINELEN];
+ if (has_mbyte) {
+ onecap_copy(items[4], buf, true);
+ aff_entry->ae_cond = getroom_save(
+ spin, buf);
+ } else
+ *aff_entry->ae_cond = c_up;
+ if (aff_entry->ae_cond != NULL) {
+ sprintf((char *)buf, "^%s",
+ aff_entry->ae_cond);
+ vim_regfree(aff_entry->ae_prog);
+ aff_entry->ae_prog = vim_regcomp(
+ buf, RE_MAGIC + RE_STRING);
+ }
+ }
+ }
+ }
+ }
+
+ if (aff_entry->ae_chop == NULL) {
+ int idx;
+ char_u **pp;
+ int n;
+
+ // Find a previously used condition.
+ for (idx = spin->si_prefcond.ga_len - 1; idx >= 0;
+ --idx) {
+ p = ((char_u **)spin->si_prefcond.ga_data)[idx];
+ if (str_equal(p, aff_entry->ae_cond))
+ break;
+ }
+ if (idx < 0) {
+ // Not found, add a new condition.
+ idx = spin->si_prefcond.ga_len;
+ pp = GA_APPEND_VIA_PTR(char_u *, &spin->si_prefcond);
+ *pp = (aff_entry->ae_cond == NULL) ?
+ NULL : getroom_save(spin, aff_entry->ae_cond);
+ }
+
+ // Add the prefix to the prefix tree.
+ if (aff_entry->ae_add == NULL)
+ p = (char_u *)"";
+ else
+ p = aff_entry->ae_add;
+
+ // PFX_FLAGS is a negative number, so that
+ // tree_add_word() knows this is the prefix tree.
+ n = PFX_FLAGS;
+ if (!cur_aff->ah_combine)
+ n |= WFP_NC;
+ if (upper)
+ n |= WFP_UP;
+ if (aff_entry->ae_comppermit)
+ n |= WFP_COMPPERMIT;
+ if (aff_entry->ae_compforbid)
+ n |= WFP_COMPFORBID;
+ tree_add_word(spin, p, spin->si_prefroot, n,
+ idx, cur_aff->ah_newID);
+ did_postpone_prefix = true;
+ }
+
+ // Didn't actually use ah_newID, backup si_newprefID.
+ if (aff_todo == 0 && !did_postpone_prefix) {
+ --spin->si_newprefID;
+ cur_aff->ah_newID = 0;
+ }
+ }
+ }
+ } else if (is_aff_rule(items, itemcnt, "FOL", 2) && fol == NULL) {
+ fol = vim_strsave(items[1]);
+ } else if (is_aff_rule(items, itemcnt, "LOW", 2) && low == NULL) {
+ low = vim_strsave(items[1]);
+ } else if (is_aff_rule(items, itemcnt, "UPP", 2) && upp == NULL) {
+ upp = vim_strsave(items[1]);
+ } else if (is_aff_rule(items, itemcnt, "REP", 2)
+ || is_aff_rule(items, itemcnt, "REPSAL", 2)) {
+ /* Ignore REP/REPSAL count */;
+ if (!isdigit(*items[1]))
+ smsg(_("Expected REP(SAL) count in %s line %d"),
+ fname, lnum);
+ } else if ((STRCMP(items[0], "REP") == 0
+ || STRCMP(items[0], "REPSAL") == 0)
+ && itemcnt >= 3) {
+ // REP/REPSAL item
+ // Myspell ignores extra arguments, we require it starts with
+ // # to detect mistakes.
+ if (itemcnt > 3 && items[3][0] != '#')
+ smsg(_(e_afftrailing), fname, lnum, items[3]);
+ if (items[0][3] == 'S' ? do_repsal : do_rep) {
+ // Replace underscore with space (can't include a space
+ // directly).
+ for (p = items[1]; *p != NUL; MB_PTR_ADV(p)) {
+ if (*p == '_') {
+ *p = ' ';
+ }
+ }
+ for (p = items[2]; *p != NUL; MB_PTR_ADV(p)) {
+ if (*p == '_') {
+ *p = ' ';
+ }
+ }
+ add_fromto(spin, items[0][3] == 'S'
+ ? &spin->si_repsal
+ : &spin->si_rep, items[1], items[2]);
+ }
+ } else if (is_aff_rule(items, itemcnt, "MAP", 2)) {
+ // MAP item or count
+ if (!found_map) {
+ // First line contains the count.
+ found_map = true;
+ if (!isdigit(*items[1]))
+ smsg(_("Expected MAP count in %s line %d"),
+ fname, lnum);
+ } else if (do_mapline) {
+ int c;
+
+ // Check that every character appears only once.
+ for (p = items[1]; *p != NUL; ) {
+ c = mb_ptr2char_adv((const char_u **)&p);
+ if ((!GA_EMPTY(&spin->si_map)
+ && vim_strchr(spin->si_map.ga_data, c)
+ != NULL)
+ || vim_strchr(p, c) != NULL) {
+ smsg(_("Duplicate character in MAP in %s line %d"),
+ fname, lnum);
+ }
+ }
+
+ // We simply concatenate all the MAP strings, separated by
+ // slashes.
+ ga_concat(&spin->si_map, items[1]);
+ ga_append(&spin->si_map, '/');
+ }
+ }
+ // Accept "SAL from to" and "SAL from to #comment".
+ else if (is_aff_rule(items, itemcnt, "SAL", 3)) {
+ if (do_sal) {
+ // SAL item (sounds-a-like)
+ // Either one of the known keys or a from-to pair.
+ if (STRCMP(items[1], "followup") == 0)
+ spin->si_followup = sal_to_bool(items[2]);
+ else if (STRCMP(items[1], "collapse_result") == 0)
+ spin->si_collapse = sal_to_bool(items[2]);
+ else if (STRCMP(items[1], "remove_accents") == 0)
+ spin->si_rem_accents = sal_to_bool(items[2]);
+ else
+ // when "to" is "_" it means empty
+ add_fromto(spin, &spin->si_sal, items[1],
+ STRCMP(items[2], "_") == 0 ? (char_u *)""
+ : items[2]);
+ }
+ } else if (is_aff_rule(items, itemcnt, "SOFOFROM", 2)
+ && sofofrom == NULL) {
+ sofofrom = getroom_save(spin, items[1]);
+ } else if (is_aff_rule(items, itemcnt, "SOFOTO", 2)
+ && sofoto == NULL) {
+ sofoto = getroom_save(spin, items[1]);
+ } else if (STRCMP(items[0], "COMMON") == 0) {
+ int i;
+
+ for (i = 1; i < itemcnt; ++i) {
+ if (HASHITEM_EMPTY(hash_find(&spin->si_commonwords,
+ items[i]))) {
+ p = vim_strsave(items[i]);
+ hash_add(&spin->si_commonwords, p);
+ }
+ }
+ } else
+ smsg(_("Unrecognized or duplicate item in %s line %d: %s"),
+ fname, lnum, items[0]);
+ }
+ }
+
+ if (fol != NULL || low != NULL || upp != NULL) {
+ if (spin->si_clear_chartab) {
+ // Clear the char type tables, don't want to use any of the
+ // currently used spell properties.
+ init_spell_chartab();
+ spin->si_clear_chartab = false;
+ }
+
+ // Don't write a word table for an ASCII file, so that we don't check
+ // for conflicts with a word table that matches 'encoding'.
+ // Don't write one for utf-8 either, we use utf_*() and
+ // mb_get_class(), the list of chars in the file will be incomplete.
+ if (!spin->si_ascii
+ && !enc_utf8
+ ) {
+ if (fol == NULL || low == NULL || upp == NULL)
+ smsg(_("Missing FOL/LOW/UPP line in %s"), fname);
+ else
+ (void)set_spell_chartab(fol, low, upp);
+ }
+
+ xfree(fol);
+ xfree(low);
+ xfree(upp);
+ }
+
+ // Use compound specifications of the .aff file for the spell info.
+ if (compmax != 0) {
+ aff_check_number(spin->si_compmax, compmax, "COMPOUNDWORDMAX");
+ spin->si_compmax = compmax;
+ }
+
+ if (compminlen != 0) {
+ aff_check_number(spin->si_compminlen, compminlen, "COMPOUNDMIN");
+ spin->si_compminlen = compminlen;
+ }
+
+ if (compsylmax != 0) {
+ if (syllable == NULL)
+ smsg(_("COMPOUNDSYLMAX used without SYLLABLE"));
+ aff_check_number(spin->si_compsylmax, compsylmax, "COMPOUNDSYLMAX");
+ spin->si_compsylmax = compsylmax;
+ }
+
+ if (compoptions != 0) {
+ aff_check_number(spin->si_compoptions, compoptions, "COMPOUND options");
+ spin->si_compoptions |= compoptions;
+ }
+
+ if (compflags != NULL)
+ process_compflags(spin, aff, compflags);
+
+ // Check that we didn't use too many renumbered flags.
+ if (spin->si_newcompID < spin->si_newprefID) {
+ if (spin->si_newcompID == 127 || spin->si_newcompID == 255)
+ MSG(_("Too many postponed prefixes"));
+ else if (spin->si_newprefID == 0 || spin->si_newprefID == 127)
+ MSG(_("Too many compound flags"));
+ else
+ MSG(_("Too many postponed prefixes and/or compound flags"));
+ }
+
+ if (syllable != NULL) {
+ aff_check_string(spin->si_syllable, syllable, "SYLLABLE");
+ spin->si_syllable = syllable;
+ }
+
+ if (sofofrom != NULL || sofoto != NULL) {
+ if (sofofrom == NULL || sofoto == NULL)
+ smsg(_("Missing SOFO%s line in %s"),
+ sofofrom == NULL ? "FROM" : "TO", fname);
+ else if (!GA_EMPTY(&spin->si_sal))
+ smsg(_("Both SAL and SOFO lines in %s"), fname);
+ else {
+ aff_check_string(spin->si_sofofr, sofofrom, "SOFOFROM");
+ aff_check_string(spin->si_sofoto, sofoto, "SOFOTO");
+ spin->si_sofofr = sofofrom;
+ spin->si_sofoto = sofoto;
+ }
+ }
+
+ if (midword != NULL) {
+ aff_check_string(spin->si_midword, midword, "MIDWORD");
+ spin->si_midword = midword;
+ }
+
+ xfree(pc);
+ fclose(fd);
+ return aff;
+}
+
+// Returns true when items[0] equals "rulename", there are "mincount" items or
+// a comment is following after item "mincount".
+static bool is_aff_rule(char_u **items, int itemcnt, char *rulename, int mincount)
+{
+ return STRCMP(items[0], rulename) == 0
+ && (itemcnt == mincount
+ || (itemcnt > mincount && items[mincount][0] == '#'));
+}
+
+// For affix "entry" move COMPOUNDFORBIDFLAG and COMPOUNDPERMITFLAG from
+// ae_flags to ae_comppermit and ae_compforbid.
+static void aff_process_flags(afffile_T *affile, affentry_T *entry)
+{
+ char_u *p;
+ char_u *prevp;
+ unsigned flag;
+
+ if (entry->ae_flags != NULL
+ && (affile->af_compforbid != 0 || affile->af_comppermit != 0)) {
+ for (p = entry->ae_flags; *p != NUL; ) {
+ prevp = p;
+ flag = get_affitem(affile->af_flagtype, &p);
+ if (flag == affile->af_comppermit || flag == affile->af_compforbid) {
+ STRMOVE(prevp, p);
+ p = prevp;
+ if (flag == affile->af_comppermit)
+ entry->ae_comppermit = true;
+ else
+ entry->ae_compforbid = true;
+ }
+ if (affile->af_flagtype == AFT_NUM && *p == ',')
+ ++p;
+ }
+ if (*entry->ae_flags == NUL)
+ entry->ae_flags = NULL; // nothing left
+ }
+}
+
+// Returns true if "s" is the name of an info item in the affix file.
+static bool spell_info_item(char_u *s)
+{
+ return STRCMP(s, "NAME") == 0
+ || STRCMP(s, "HOME") == 0
+ || STRCMP(s, "VERSION") == 0
+ || STRCMP(s, "AUTHOR") == 0
+ || STRCMP(s, "EMAIL") == 0
+ || STRCMP(s, "COPYRIGHT") == 0;
+}
+
+// Turn an affix flag name into a number, according to the FLAG type.
+// returns zero for failure.
+static unsigned affitem2flag(int flagtype, char_u *item, char_u *fname, int lnum)
+{
+ unsigned res;
+ char_u *p = item;
+
+ res = get_affitem(flagtype, &p);
+ if (res == 0) {
+ if (flagtype == AFT_NUM)
+ smsg(_("Flag is not a number in %s line %d: %s"),
+ fname, lnum, item);
+ else
+ smsg(_("Illegal flag in %s line %d: %s"),
+ fname, lnum, item);
+ }
+ if (*p != NUL) {
+ smsg(_(e_affname), fname, lnum, item);
+ return 0;
+ }
+
+ return res;
+}
+
+// Get one affix name from "*pp" and advance the pointer.
+// Returns zero for an error, still advances the pointer then.
+static unsigned get_affitem(int flagtype, char_u **pp)
+{
+ int res;
+
+ if (flagtype == AFT_NUM) {
+ if (!ascii_isdigit(**pp)) {
+ ++*pp; // always advance, avoid getting stuck
+ return 0;
+ }
+ res = getdigits_int(pp);
+ } else {
+ res = mb_ptr2char_adv((const char_u **)pp);
+ if (flagtype == AFT_LONG || (flagtype == AFT_CAPLONG
+ && res >= 'A' && res <= 'Z')) {
+ if (**pp == NUL)
+ return 0;
+ res = mb_ptr2char_adv((const char_u **)pp) + (res << 16);
+ }
+ }
+ return res;
+}
+
+// Process the "compflags" string used in an affix file and append it to
+// spin->si_compflags.
+// The processing involves changing the affix names to ID numbers, so that
+// they fit in one byte.
+static void process_compflags(spellinfo_T *spin, afffile_T *aff, char_u *compflags)
+{
+ char_u *p;
+ char_u *prevp;
+ unsigned flag;
+ compitem_T *ci;
+ int id;
+ int len;
+ char_u *tp;
+ char_u key[AH_KEY_LEN];
+ hashitem_T *hi;
+
+ // Make room for the old and the new compflags, concatenated with a / in
+ // between. Processing it makes it shorter, but we don't know by how
+ // much, thus allocate the maximum.
+ len = (int)STRLEN(compflags) + 1;
+ if (spin->si_compflags != NULL)
+ len += (int)STRLEN(spin->si_compflags) + 1;
+ p = getroom(spin, len, false);
+ if (spin->si_compflags != NULL) {
+ STRCPY(p, spin->si_compflags);
+ STRCAT(p, "/");
+ }
+ spin->si_compflags = p;
+ tp = p + STRLEN(p);
+
+ for (p = compflags; *p != NUL; ) {
+ if (vim_strchr((char_u *)"/?*+[]", *p) != NULL)
+ // Copy non-flag characters directly.
+ *tp++ = *p++;
+ else {
+ // First get the flag number, also checks validity.
+ prevp = p;
+ flag = get_affitem(aff->af_flagtype, &p);
+ if (flag != 0) {
+ // Find the flag in the hashtable. If it was used before, use
+ // the existing ID. Otherwise add a new entry.
+ STRLCPY(key, prevp, p - prevp + 1);
+ hi = hash_find(&aff->af_comp, key);
+ if (!HASHITEM_EMPTY(hi)) {
+ id = HI2CI(hi)->ci_newID;
+ } else {
+ ci = getroom(spin, sizeof(compitem_T), true);
+ STRCPY(ci->ci_key, key);
+ ci->ci_flag = flag;
+ // Avoid using a flag ID that has a special meaning in a
+ // regexp (also inside []).
+ do {
+ check_renumber(spin);
+ id = spin->si_newcompID--;
+ } while (vim_strchr((char_u *)"/?*+[]\\-^", id) != NULL);
+ ci->ci_newID = id;
+ hash_add(&aff->af_comp, ci->ci_key);
+ }
+ *tp++ = id;
+ }
+ if (aff->af_flagtype == AFT_NUM && *p == ',')
+ ++p;
+ }
+ }
+
+ *tp = NUL;
+}
+
+// Check that the new IDs for postponed affixes and compounding don't overrun
+// each other. We have almost 255 available, but start at 0-127 to avoid
+// using two bytes for utf-8. When the 0-127 range is used up go to 128-255.
+// When that is used up an error message is given.
+static void check_renumber(spellinfo_T *spin)
+{
+ if (spin->si_newprefID == spin->si_newcompID && spin->si_newcompID < 128) {
+ spin->si_newprefID = 127;
+ spin->si_newcompID = 255;
+ }
+}
+
+// Returns true if flag "flag" appears in affix list "afflist".
+static bool flag_in_afflist(int flagtype, char_u *afflist, unsigned flag)
+{
+ char_u *p;
+ unsigned n;
+
+ switch (flagtype) {
+ case AFT_CHAR:
+ return vim_strchr(afflist, flag) != NULL;
+
+ case AFT_CAPLONG:
+ case AFT_LONG:
+ for (p = afflist; *p != NUL; ) {
+ n = mb_ptr2char_adv((const char_u **)&p);
+ if ((flagtype == AFT_LONG || (n >= 'A' && n <= 'Z'))
+ && *p != NUL) {
+ n = mb_ptr2char_adv((const char_u **)&p) + (n << 16);
+ }
+ if (n == flag) {
+ return true;
+ }
+ }
+ break;
+
+ case AFT_NUM:
+ for (p = afflist; *p != NUL; ) {
+ int digits = getdigits_int(&p);
+ assert(digits >= 0);
+ n = (unsigned int)digits;
+ if (n == flag)
+ return true;
+ if (*p != NUL) // skip over comma
+ ++p;
+ }
+ break;
+ }
+ return false;
+}
+
+// Give a warning when "spinval" and "affval" numbers are set and not the same.
+static void aff_check_number(int spinval, int affval, char *name)
+{
+ if (spinval != 0 && spinval != affval)
+ smsg(_("%s value differs from what is used in another .aff file"),
+ name);
+}
+
+// Give a warning when "spinval" and "affval" strings are set and not the same.
+static void aff_check_string(char_u *spinval, char_u *affval, char *name)
+{
+ if (spinval != NULL && STRCMP(spinval, affval) != 0)
+ smsg(_("%s value differs from what is used in another .aff file"),
+ name);
+}
+
+// Returns true if strings "s1" and "s2" are equal. Also consider both being
+// NULL as equal.
+static bool str_equal(char_u *s1, char_u *s2)
+{
+ if (s1 == NULL || s2 == NULL)
+ return s1 == s2;
+ return STRCMP(s1, s2) == 0;
+}
+
+// Add a from-to item to "gap". Used for REP and SAL items.
+// They are stored case-folded.
+static void add_fromto(spellinfo_T *spin, garray_T *gap, char_u *from, char_u *to)
+{
+ char_u word[MAXWLEN];
+
+ fromto_T *ftp = GA_APPEND_VIA_PTR(fromto_T, gap);
+ (void)spell_casefold(from, (int)STRLEN(from), word, MAXWLEN);
+ ftp->ft_from = getroom_save(spin, word);
+ (void)spell_casefold(to, (int)STRLEN(to), word, MAXWLEN);
+ ftp->ft_to = getroom_save(spin, word);
+}
+
+// Converts a boolean argument in a SAL line to true or false;
+static bool sal_to_bool(char_u *s)
+{
+ return STRCMP(s, "1") == 0 || STRCMP(s, "true") == 0;
+}
+
+// Free the structure filled by spell_read_aff().
+static void spell_free_aff(afffile_T *aff)
+{
+ hashtab_T *ht;
+ hashitem_T *hi;
+ int todo;
+ affheader_T *ah;
+ affentry_T *ae;
+
+ xfree(aff->af_enc);
+
+ // All this trouble to free the "ae_prog" items...
+ for (ht = &aff->af_pref;; ht = &aff->af_suff) {
+ todo = (int)ht->ht_used;
+ for (hi = ht->ht_array; todo > 0; ++hi) {
+ if (!HASHITEM_EMPTY(hi)) {
+ --todo;
+ ah = HI2AH(hi);
+ for (ae = ah->ah_first; ae != NULL; ae = ae->ae_next)
+ vim_regfree(ae->ae_prog);
+ }
+ }
+ if (ht == &aff->af_suff)
+ break;
+ }
+
+ hash_clear(&aff->af_pref);
+ hash_clear(&aff->af_suff);
+ hash_clear(&aff->af_comp);
+}
+
+// Read dictionary file "fname".
+// Returns OK or FAIL;
+static int spell_read_dic(spellinfo_T *spin, char_u *fname, afffile_T *affile)
+{
+ hashtab_T ht;
+ char_u line[MAXLINELEN];
+ char_u *p;
+ char_u *afflist;
+ char_u store_afflist[MAXWLEN];
+ int pfxlen;
+ bool need_affix;
+ char_u *dw;
+ char_u *pc;
+ char_u *w;
+ int l;
+ hash_T hash;
+ hashitem_T *hi;
+ FILE *fd;
+ int lnum = 1;
+ int non_ascii = 0;
+ int retval = OK;
+ char_u message[MAXLINELEN + MAXWLEN];
+ int flags;
+ int duplicate = 0;
+
+ // Open the file.
+ fd = mch_fopen((char *)fname, "r");
+ if (fd == NULL) {
+ EMSG2(_(e_notopen), fname);
+ return FAIL;
+ }
+
+ // The hashtable is only used to detect duplicated words.
+ hash_init(&ht);
+
+ vim_snprintf((char *)IObuff, IOSIZE,
+ _("Reading dictionary file %s..."), fname);
+ spell_message(spin, IObuff);
+
+ // start with a message for the first line
+ spin->si_msg_count = 999999;
+
+ // Read and ignore the first line: word count.
+ (void)vim_fgets(line, MAXLINELEN, fd);
+ if (!ascii_isdigit(*skipwhite(line)))
+ EMSG2(_("E760: No word count in %s"), fname);
+
+ // Read all the lines in the file one by one.
+ // The words are converted to 'encoding' here, before being added to
+ // the hashtable.
+ while (!vim_fgets(line, MAXLINELEN, fd) && !got_int) {
+ line_breakcheck();
+ ++lnum;
+ if (line[0] == '#' || line[0] == '/')
+ continue; // comment line
+
+ // Remove CR, LF and white space from the end. White space halfway through
+ // the word is kept to allow multi-word terms like "et al.".
+ l = (int)STRLEN(line);
+ while (l > 0 && line[l - 1] <= ' ')
+ --l;
+ if (l == 0)
+ continue; // empty line
+ line[l] = NUL;
+
+ // Convert from "SET" to 'encoding' when needed.
+ if (spin->si_conv.vc_type != CONV_NONE) {
+ pc = string_convert(&spin->si_conv, line, NULL);
+ if (pc == NULL) {
+ smsg(_("Conversion failure for word in %s line %d: %s"),
+ fname, lnum, line);
+ continue;
+ }
+ w = pc;
+ } else {
+ pc = NULL;
+ w = line;
+ }
+
+ // Truncate the word at the "/", set "afflist" to what follows.
+ // Replace "\/" by "/" and "\\" by "\".
+ afflist = NULL;
+ for (p = w; *p != NUL; MB_PTR_ADV(p)) {
+ if (*p == '\\' && (p[1] == '\\' || p[1] == '/')) {
+ STRMOVE(p, p + 1);
+ } else if (*p == '/') {
+ *p = NUL;
+ afflist = p + 1;
+ break;
+ }
+ }
+
+ // Skip non-ASCII words when "spin->si_ascii" is true.
+ if (spin->si_ascii && has_non_ascii(w)) {
+ ++non_ascii;
+ xfree(pc);
+ continue;
+ }
+
+ // This takes time, print a message every 10000 words.
+ if (spin->si_verbose && spin->si_msg_count > 10000) {
+ spin->si_msg_count = 0;
+ vim_snprintf((char *)message, sizeof(message),
+ _("line %6d, word %6ld - %s"),
+ lnum, spin->si_foldwcount + spin->si_keepwcount, w);
+ msg_start();
+ msg_puts_long_attr(message, 0);
+ msg_clr_eos();
+ msg_didout = FALSE;
+ msg_col = 0;
+ ui_flush();
+ }
+
+ // Store the word in the hashtable to be able to find duplicates.
+ dw = getroom_save(spin, w);
+ if (dw == NULL) {
+ retval = FAIL;
+ xfree(pc);
+ break;
+ }
+
+ hash = hash_hash(dw);
+ hi = hash_lookup(&ht, (const char *)dw, STRLEN(dw), hash);
+ if (!HASHITEM_EMPTY(hi)) {
+ if (p_verbose > 0)
+ smsg(_("Duplicate word in %s line %d: %s"),
+ fname, lnum, dw);
+ else if (duplicate == 0)
+ smsg(_("First duplicate word in %s line %d: %s"),
+ fname, lnum, dw);
+ ++duplicate;
+ } else
+ hash_add_item(&ht, hi, dw, hash);
+
+ flags = 0;
+ store_afflist[0] = NUL;
+ pfxlen = 0;
+ need_affix = false;
+ if (afflist != NULL) {
+ // Extract flags from the affix list.
+ flags |= get_affix_flags(affile, afflist);
+
+ if (affile->af_needaffix != 0 && flag_in_afflist(
+ affile->af_flagtype, afflist, affile->af_needaffix))
+ need_affix = true;
+
+ if (affile->af_pfxpostpone)
+ // Need to store the list of prefix IDs with the word.
+ pfxlen = get_pfxlist(affile, afflist, store_afflist);
+
+ if (spin->si_compflags != NULL)
+ // Need to store the list of compound flags with the word.
+ // Concatenate them to the list of prefix IDs.
+ get_compflags(affile, afflist, store_afflist + pfxlen);
+ }
+
+ // Add the word to the word tree(s).
+ if (store_word(spin, dw, flags, spin->si_region,
+ store_afflist, need_affix) == FAIL)
+ retval = FAIL;
+
+ if (afflist != NULL) {
+ // Find all matching suffixes and add the resulting words.
+ // Additionally do matching prefixes that combine.
+ if (store_aff_word(spin, dw, afflist, affile,
+ &affile->af_suff, &affile->af_pref,
+ CONDIT_SUF, flags, store_afflist, pfxlen) == FAIL)
+ retval = FAIL;
+
+ // Find all matching prefixes and add the resulting words.
+ if (store_aff_word(spin, dw, afflist, affile,
+ &affile->af_pref, NULL,
+ CONDIT_SUF, flags, store_afflist, pfxlen) == FAIL)
+ retval = FAIL;
+ }
+
+ xfree(pc);
+ }
+
+ if (duplicate > 0)
+ smsg(_("%d duplicate word(s) in %s"), duplicate, fname);
+ if (spin->si_ascii && non_ascii > 0)
+ smsg(_("Ignored %d word(s) with non-ASCII characters in %s"),
+ non_ascii, fname);
+ hash_clear(&ht);
+
+ fclose(fd);
+ return retval;
+}
+
+// Check for affix flags in "afflist" that are turned into word flags.
+// Return WF_ flags.
+static int get_affix_flags(afffile_T *affile, char_u *afflist)
+{
+ int flags = 0;
+
+ if (affile->af_keepcase != 0 && flag_in_afflist(
+ affile->af_flagtype, afflist, affile->af_keepcase))
+ flags |= WF_KEEPCAP | WF_FIXCAP;
+ if (affile->af_rare != 0 && flag_in_afflist(
+ affile->af_flagtype, afflist, affile->af_rare))
+ flags |= WF_RARE;
+ if (affile->af_bad != 0 && flag_in_afflist(
+ affile->af_flagtype, afflist, affile->af_bad))
+ flags |= WF_BANNED;
+ if (affile->af_needcomp != 0 && flag_in_afflist(
+ affile->af_flagtype, afflist, affile->af_needcomp))
+ flags |= WF_NEEDCOMP;
+ if (affile->af_comproot != 0 && flag_in_afflist(
+ affile->af_flagtype, afflist, affile->af_comproot))
+ flags |= WF_COMPROOT;
+ if (affile->af_nosuggest != 0 && flag_in_afflist(
+ affile->af_flagtype, afflist, affile->af_nosuggest))
+ flags |= WF_NOSUGGEST;
+ return flags;
+}
+
+// Get the list of prefix IDs from the affix list "afflist".
+// Used for PFXPOSTPONE.
+// Put the resulting flags in "store_afflist[MAXWLEN]" with a terminating NUL
+// and return the number of affixes.
+static int get_pfxlist(afffile_T *affile, char_u *afflist, char_u *store_afflist)
+{
+ char_u *p;
+ char_u *prevp;
+ int cnt = 0;
+ int id;
+ char_u key[AH_KEY_LEN];
+ hashitem_T *hi;
+
+ for (p = afflist; *p != NUL; ) {
+ prevp = p;
+ if (get_affitem(affile->af_flagtype, &p) != 0) {
+ // A flag is a postponed prefix flag if it appears in "af_pref"
+ // and it's ID is not zero.
+ STRLCPY(key, prevp, p - prevp + 1);
+ hi = hash_find(&affile->af_pref, key);
+ if (!HASHITEM_EMPTY(hi)) {
+ id = HI2AH(hi)->ah_newID;
+ if (id != 0)
+ store_afflist[cnt++] = id;
+ }
+ }
+ if (affile->af_flagtype == AFT_NUM && *p == ',')
+ ++p;
+ }
+
+ store_afflist[cnt] = NUL;
+ return cnt;
+}
+
+// Get the list of compound IDs from the affix list "afflist" that are used
+// for compound words.
+// Puts the flags in "store_afflist[]".
+static void get_compflags(afffile_T *affile, char_u *afflist, char_u *store_afflist)
+{
+ char_u *p;
+ char_u *prevp;
+ int cnt = 0;
+ char_u key[AH_KEY_LEN];
+ hashitem_T *hi;
+
+ for (p = afflist; *p != NUL; ) {
+ prevp = p;
+ if (get_affitem(affile->af_flagtype, &p) != 0) {
+ // A flag is a compound flag if it appears in "af_comp".
+ STRLCPY(key, prevp, p - prevp + 1);
+ hi = hash_find(&affile->af_comp, key);
+ if (!HASHITEM_EMPTY(hi))
+ store_afflist[cnt++] = HI2CI(hi)->ci_newID;
+ }
+ if (affile->af_flagtype == AFT_NUM && *p == ',')
+ ++p;
+ }
+
+ store_afflist[cnt] = NUL;
+}
+
+// Apply affixes to a word and store the resulting words.
+// "ht" is the hashtable with affentry_T that need to be applied, either
+// prefixes or suffixes.
+// "xht", when not NULL, is the prefix hashtable, to be used additionally on
+// the resulting words for combining affixes.
+//
+// Returns FAIL when out of memory.
+static int
+store_aff_word (
+ spellinfo_T *spin, // spell info
+ char_u *word, // basic word start
+ char_u *afflist, // list of names of supported affixes
+ afffile_T *affile,
+ hashtab_T *ht,
+ hashtab_T *xht,
+ int condit, // CONDIT_SUF et al.
+ int flags, // flags for the word
+ char_u *pfxlist, // list of prefix IDs
+ int pfxlen // nr of flags in "pfxlist" for prefixes, rest
+ // is compound flags
+)
+{
+ int todo;
+ hashitem_T *hi;
+ affheader_T *ah;
+ affentry_T *ae;
+ char_u newword[MAXWLEN];
+ int retval = OK;
+ int i, j;
+ char_u *p;
+ int use_flags;
+ char_u *use_pfxlist;
+ int use_pfxlen;
+ bool need_affix;
+ char_u store_afflist[MAXWLEN];
+ char_u pfx_pfxlist[MAXWLEN];
+ size_t wordlen = STRLEN(word);
+ int use_condit;
+
+ todo = (int)ht->ht_used;
+ for (hi = ht->ht_array; todo > 0 && retval == OK; ++hi) {
+ if (!HASHITEM_EMPTY(hi)) {
+ --todo;
+ ah = HI2AH(hi);
+
+ // Check that the affix combines, if required, and that the word
+ // supports this affix.
+ if (((condit & CONDIT_COMB) == 0 || ah->ah_combine)
+ && flag_in_afflist(affile->af_flagtype, afflist,
+ ah->ah_flag)) {
+ // Loop over all affix entries with this name.
+ for (ae = ah->ah_first; ae != NULL; ae = ae->ae_next) {
+ // Check the condition. It's not logical to match case
+ // here, but it is required for compatibility with
+ // Myspell.
+ // Another requirement from Myspell is that the chop
+ // string is shorter than the word itself.
+ // For prefixes, when "PFXPOSTPONE" was used, only do
+ // prefixes with a chop string and/or flags.
+ // When a previously added affix had CIRCUMFIX this one
+ // must have it too, if it had not then this one must not
+ // have one either.
+ if ((xht != NULL || !affile->af_pfxpostpone
+ || ae->ae_chop != NULL
+ || ae->ae_flags != NULL)
+ && (ae->ae_chop == NULL
+ || STRLEN(ae->ae_chop) < wordlen)
+ && (ae->ae_prog == NULL
+ || vim_regexec_prog(&ae->ae_prog, false, word, (colnr_T)0))
+ && (((condit & CONDIT_CFIX) == 0)
+ == ((condit & CONDIT_AFF) == 0
+ || ae->ae_flags == NULL
+ || !flag_in_afflist(affile->af_flagtype,
+ ae->ae_flags, affile->af_circumfix)))) {
+ // Match. Remove the chop and add the affix.
+ if (xht == NULL) {
+ // prefix: chop/add at the start of the word
+ if (ae->ae_add == NULL) {
+ *newword = NUL;
+ } else {
+ STRLCPY(newword, ae->ae_add, MAXWLEN);
+ }
+ p = word;
+ if (ae->ae_chop != NULL) {
+ // Skip chop string.
+ if (has_mbyte) {
+ i = mb_charlen(ae->ae_chop);
+ for (; i > 0; i--) {
+ MB_PTR_ADV(p);
+ }
+ } else {
+ p += STRLEN(ae->ae_chop);
+ }
+ }
+ STRCAT(newword, p);
+ } else {
+ // suffix: chop/add at the end of the word
+ STRLCPY(newword, word, MAXWLEN);
+ if (ae->ae_chop != NULL) {
+ // Remove chop string.
+ p = newword + STRLEN(newword);
+ i = (int)MB_CHARLEN(ae->ae_chop);
+ for (; i > 0; i--) {
+ MB_PTR_BACK(newword, p);
+ }
+ *p = NUL;
+ }
+ if (ae->ae_add != NULL)
+ STRCAT(newword, ae->ae_add);
+ }
+
+ use_flags = flags;
+ use_pfxlist = pfxlist;
+ use_pfxlen = pfxlen;
+ need_affix = false;
+ use_condit = condit | CONDIT_COMB | CONDIT_AFF;
+ if (ae->ae_flags != NULL) {
+ // Extract flags from the affix list.
+ use_flags |= get_affix_flags(affile, ae->ae_flags);
+
+ if (affile->af_needaffix != 0 && flag_in_afflist(
+ affile->af_flagtype, ae->ae_flags,
+ affile->af_needaffix))
+ need_affix = true;
+
+ // When there is a CIRCUMFIX flag the other affix
+ // must also have it and we don't add the word
+ // with one affix.
+ if (affile->af_circumfix != 0 && flag_in_afflist(
+ affile->af_flagtype, ae->ae_flags,
+ affile->af_circumfix)) {
+ use_condit |= CONDIT_CFIX;
+ if ((condit & CONDIT_CFIX) == 0)
+ need_affix = true;
+ }
+
+ if (affile->af_pfxpostpone
+ || spin->si_compflags != NULL) {
+ if (affile->af_pfxpostpone)
+ // Get prefix IDS from the affix list.
+ use_pfxlen = get_pfxlist(affile,
+ ae->ae_flags, store_afflist);
+ else
+ use_pfxlen = 0;
+ use_pfxlist = store_afflist;
+
+ // Combine the prefix IDs. Avoid adding the
+ // same ID twice.
+ for (i = 0; i < pfxlen; ++i) {
+ for (j = 0; j < use_pfxlen; ++j)
+ if (pfxlist[i] == use_pfxlist[j])
+ break;
+ if (j == use_pfxlen)
+ use_pfxlist[use_pfxlen++] = pfxlist[i];
+ }
+
+ if (spin->si_compflags != NULL)
+ // Get compound IDS from the affix list.
+ get_compflags(affile, ae->ae_flags,
+ use_pfxlist + use_pfxlen);
+ else
+ use_pfxlist[use_pfxlen] = NUL;
+
+ // Combine the list of compound flags.
+ // Concatenate them to the prefix IDs list.
+ // Avoid adding the same ID twice.
+ for (i = pfxlen; pfxlist[i] != NUL; ++i) {
+ for (j = use_pfxlen;
+ use_pfxlist[j] != NUL; ++j)
+ if (pfxlist[i] == use_pfxlist[j])
+ break;
+ if (use_pfxlist[j] == NUL) {
+ use_pfxlist[j++] = pfxlist[i];
+ use_pfxlist[j] = NUL;
+ }
+ }
+ }
+ }
+
+ // Obey a "COMPOUNDFORBIDFLAG" of the affix: don't
+ // use the compound flags.
+ if (use_pfxlist != NULL && ae->ae_compforbid) {
+ STRLCPY(pfx_pfxlist, use_pfxlist, use_pfxlen + 1);
+ use_pfxlist = pfx_pfxlist;
+ }
+
+ // When there are postponed prefixes...
+ if (spin->si_prefroot != NULL
+ && spin->si_prefroot->wn_sibling != NULL) {
+ // ... add a flag to indicate an affix was used.
+ use_flags |= WF_HAS_AFF;
+
+ // ... don't use a prefix list if combining
+ // affixes is not allowed. But do use the
+ // compound flags after them.
+ if (!ah->ah_combine && use_pfxlist != NULL)
+ use_pfxlist += use_pfxlen;
+ }
+
+ // When compounding is supported and there is no
+ // "COMPOUNDPERMITFLAG" then forbid compounding on the
+ // side where the affix is applied.
+ if (spin->si_compflags != NULL && !ae->ae_comppermit) {
+ if (xht != NULL)
+ use_flags |= WF_NOCOMPAFT;
+ else
+ use_flags |= WF_NOCOMPBEF;
+ }
+
+ // Store the modified word.
+ if (store_word(spin, newword, use_flags,
+ spin->si_region, use_pfxlist,
+ need_affix) == FAIL)
+ retval = FAIL;
+
+ // When added a prefix or a first suffix and the affix
+ // has flags may add a(nother) suffix. RECURSIVE!
+ if ((condit & CONDIT_SUF) && ae->ae_flags != NULL)
+ if (store_aff_word(spin, newword, ae->ae_flags,
+ affile, &affile->af_suff, xht,
+ use_condit & (xht == NULL
+ ? ~0 : ~CONDIT_SUF),
+ use_flags, use_pfxlist, pfxlen) == FAIL)
+ retval = FAIL;
+
+ // When added a suffix and combining is allowed also
+ // try adding a prefix additionally. Both for the
+ // word flags and for the affix flags. RECURSIVE!
+ if (xht != NULL && ah->ah_combine) {
+ if (store_aff_word(spin, newword,
+ afflist, affile,
+ xht, NULL, use_condit,
+ use_flags, use_pfxlist,
+ pfxlen) == FAIL
+ || (ae->ae_flags != NULL
+ && store_aff_word(spin, newword,
+ ae->ae_flags, affile,
+ xht, NULL, use_condit,
+ use_flags, use_pfxlist,
+ pfxlen) == FAIL))
+ retval = FAIL;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return retval;
+}
+
+// Read a file with a list of words.
+static int spell_read_wordfile(spellinfo_T *spin, char_u *fname)
+{
+ FILE *fd;
+ long lnum = 0;
+ char_u rline[MAXLINELEN];
+ char_u *line;
+ char_u *pc = NULL;
+ char_u *p;
+ int l;
+ int retval = OK;
+ bool did_word = false;
+ int non_ascii = 0;
+ int flags;
+ int regionmask;
+
+ // Open the file.
+ fd = mch_fopen((char *)fname, "r");
+ if (fd == NULL) {
+ EMSG2(_(e_notopen), fname);
+ return FAIL;
+ }
+
+ vim_snprintf((char *)IObuff, IOSIZE, _("Reading word file %s..."), fname);
+ spell_message(spin, IObuff);
+
+ // Read all the lines in the file one by one.
+ while (!vim_fgets(rline, MAXLINELEN, fd) && !got_int) {
+ line_breakcheck();
+ ++lnum;
+
+ // Skip comment lines.
+ if (*rline == '#')
+ continue;
+
+ // Remove CR, LF and white space from the end.
+ l = (int)STRLEN(rline);
+ while (l > 0 && rline[l - 1] <= ' ')
+ --l;
+ if (l == 0)
+ continue; // empty or blank line
+ rline[l] = NUL;
+
+ // Convert from "/encoding={encoding}" to 'encoding' when needed.
+ xfree(pc);
+ if (spin->si_conv.vc_type != CONV_NONE) {
+ pc = string_convert(&spin->si_conv, rline, NULL);
+ if (pc == NULL) {
+ smsg(_("Conversion failure for word in %s line %ld: %s"),
+ fname, lnum, rline);
+ continue;
+ }
+ line = pc;
+ } else {
+ pc = NULL;
+ line = rline;
+ }
+
+ if (*line == '/') {
+ ++line;
+ if (STRNCMP(line, "encoding=", 9) == 0) {
+ if (spin->si_conv.vc_type != CONV_NONE) {
+ smsg(_("Duplicate /encoding= line ignored in %s line %ld: %s"),
+ fname, lnum, line - 1);
+ } else if (did_word) {
+ smsg(_("/encoding= line after word ignored in %s line %ld: %s"),
+ fname, lnum, line - 1);
+ } else {
+ char_u *enc;
+
+ // Setup for conversion to 'encoding'.
+ line += 9;
+ enc = enc_canonize(line);
+ if (!spin->si_ascii
+ && convert_setup(&spin->si_conv, enc,
+ p_enc) == FAIL)
+ smsg(_("Conversion in %s not supported: from %s to %s"),
+ fname, line, p_enc);
+ xfree(enc);
+ spin->si_conv.vc_fail = true;
+ }
+ continue;
+ }
+
+ if (STRNCMP(line, "regions=", 8) == 0) {
+ if (spin->si_region_count > 1) {
+ smsg(_("Duplicate /regions= line ignored in %s line %ld: %s"),
+ fname, lnum, line);
+ } else {
+ line += 8;
+ if (STRLEN(line) > MAXREGIONS * 2) {
+ smsg(_("Too many regions in %s line %ld: %s"),
+ fname, lnum, line);
+ } else {
+ spin->si_region_count = (int)STRLEN(line) / 2;
+ STRCPY(spin->si_region_name, line);
+
+ // Adjust the mask for a word valid in all regions.
+ spin->si_region = (1 << spin->si_region_count) - 1;
+ }
+ }
+ continue;
+ }
+
+ smsg(_("/ line ignored in %s line %ld: %s"),
+ fname, lnum, line - 1);
+ continue;
+ }
+
+ flags = 0;
+ regionmask = spin->si_region;
+
+ // Check for flags and region after a slash.
+ p = vim_strchr(line, '/');
+ if (p != NULL) {
+ *p++ = NUL;
+ while (*p != NUL) {
+ if (*p == '=') // keep-case word
+ flags |= WF_KEEPCAP | WF_FIXCAP;
+ else if (*p == '!') // Bad, bad, wicked word.
+ flags |= WF_BANNED;
+ else if (*p == '?') // Rare word.
+ flags |= WF_RARE;
+ else if (ascii_isdigit(*p)) { // region number(s)
+ if ((flags & WF_REGION) == 0) // first one
+ regionmask = 0;
+ flags |= WF_REGION;
+
+ l = *p - '0';
+ if (l == 0 || l > spin->si_region_count) {
+ smsg(_("Invalid region nr in %s line %ld: %s"),
+ fname, lnum, p);
+ break;
+ }
+ regionmask |= 1 << (l - 1);
+ } else {
+ smsg(_("Unrecognized flags in %s line %ld: %s"),
+ fname, lnum, p);
+ break;
+ }
+ ++p;
+ }
+ }
+
+ // Skip non-ASCII words when "spin->si_ascii" is true.
+ if (spin->si_ascii && has_non_ascii(line)) {
+ ++non_ascii;
+ continue;
+ }
+
+ // Normal word: store it.
+ if (store_word(spin, line, flags, regionmask, NULL, false) == FAIL) {
+ retval = FAIL;
+ break;
+ }
+ did_word = true;
+ }
+
+ xfree(pc);
+ fclose(fd);
+
+ if (spin->si_ascii && non_ascii > 0) {
+ vim_snprintf((char *)IObuff, IOSIZE,
+ _("Ignored %d words with non-ASCII characters"), non_ascii);
+ spell_message(spin, IObuff);
+ }
+
+ return retval;
+}
+
+/// Get part of an sblock_T, "len" bytes long.
+/// This avoids calling free() for every little struct we use (and keeping
+/// track of them).
+/// The memory is cleared to all zeros.
+///
+/// @param len Length needed (<= SBLOCKSIZE).
+/// @param align Align for pointer.
+/// @return Pointer into block data.
+static void *getroom(spellinfo_T *spin, size_t len, bool align)
+ FUNC_ATTR_NONNULL_RET
+{
+ char_u *p;
+ sblock_T *bl = spin->si_blocks;
+
+ assert(len <= SBLOCKSIZE);
+
+ if (align && bl != NULL)
+ // Round size up for alignment. On some systems structures need to be
+ // aligned to the size of a pointer (e.g., SPARC).
+ bl->sb_used = (bl->sb_used + sizeof(char *) - 1)
+ & ~(sizeof(char *) - 1);
+
+ if (bl == NULL || bl->sb_used + len > SBLOCKSIZE) {
+ // Allocate a block of memory. It is not freed until much later.
+ bl = xcalloc(1, (sizeof(sblock_T) + SBLOCKSIZE));
+ bl->sb_next = spin->si_blocks;
+ spin->si_blocks = bl;
+ bl->sb_used = 0;
+ ++spin->si_blocks_cnt;
+ }
+
+ p = bl->sb_data + bl->sb_used;
+ bl->sb_used += (int)len;
+
+ return p;
+}
+
+// Make a copy of a string into memory allocated with getroom().
+// Returns NULL when out of memory.
+static char_u *getroom_save(spellinfo_T *spin, char_u *s)
+{
+ const size_t s_size = STRLEN(s) + 1;
+ return memcpy(getroom(spin, s_size, false), s, s_size);
+}
+
+
+// Free the list of allocated sblock_T.
+static void free_blocks(sblock_T *bl)
+{
+ sblock_T *next;
+
+ while (bl != NULL) {
+ next = bl->sb_next;
+ xfree(bl);
+ bl = next;
+ }
+}
+
+// Allocate the root of a word tree.
+// Returns NULL when out of memory.
+static wordnode_T *wordtree_alloc(spellinfo_T *spin)
+ FUNC_ATTR_NONNULL_RET
+{
+ return (wordnode_T *)getroom(spin, sizeof(wordnode_T), true);
+}
+
+// Store a word in the tree(s).
+// Always store it in the case-folded tree. For a keep-case word this is
+// useful when the word can also be used with all caps (no WF_FIXCAP flag) and
+// used to find suggestions.
+// For a keep-case word also store it in the keep-case tree.
+// When "pfxlist" is not NULL store the word for each postponed prefix ID and
+// compound flag.
+static int
+store_word (
+ spellinfo_T *spin,
+ char_u *word,
+ int flags, // extra flags, WF_BANNED
+ int region, // supported region(s)
+ char_u *pfxlist, // list of prefix IDs or NULL
+ bool need_affix // only store word with affix ID
+)
+{
+ int len = (int)STRLEN(word);
+ int ct = captype(word, word + len);
+ char_u foldword[MAXWLEN];
+ int res = OK;
+ char_u *p;
+
+ (void)spell_casefold(word, len, foldword, MAXWLEN);
+ for (p = pfxlist; res == OK; ++p) {
+ if (!need_affix || (p != NULL && *p != NUL))
+ res = tree_add_word(spin, foldword, spin->si_foldroot, ct | flags,
+ region, p == NULL ? 0 : *p);
+ if (p == NULL || *p == NUL)
+ break;
+ }
+ ++spin->si_foldwcount;
+
+ if (res == OK && (ct == WF_KEEPCAP || (flags & WF_KEEPCAP))) {
+ for (p = pfxlist; res == OK; ++p) {
+ if (!need_affix || (p != NULL && *p != NUL))
+ res = tree_add_word(spin, word, spin->si_keeproot, flags,
+ region, p == NULL ? 0 : *p);
+ if (p == NULL || *p == NUL)
+ break;
+ }
+ ++spin->si_keepwcount;
+ }
+ return res;
+}
+
+// Add word "word" to a word tree at "root".
+// When "flags" < 0 we are adding to the prefix tree where "flags" is used for
+// "rare" and "region" is the condition nr.
+// Returns FAIL when out of memory.
+static int tree_add_word(spellinfo_T *spin, char_u *word, wordnode_T *root, int flags, int region, int affixID)
+{
+ wordnode_T *node = root;
+ wordnode_T *np;
+ wordnode_T *copyp, **copyprev;
+ wordnode_T **prev = NULL;
+ int i;
+
+ // Add each byte of the word to the tree, including the NUL at the end.
+ for (i = 0;; ++i) {
+ // When there is more than one reference to this node we need to make
+ // a copy, so that we can modify it. Copy the whole list of siblings
+ // (we don't optimize for a partly shared list of siblings).
+ if (node != NULL && node->wn_refs > 1) {
+ --node->wn_refs;
+ copyprev = prev;
+ for (copyp = node; copyp != NULL; copyp = copyp->wn_sibling) {
+ // Allocate a new node and copy the info.
+ np = get_wordnode(spin);
+ if (np == NULL)
+ return FAIL;
+ np->wn_child = copyp->wn_child;
+ if (np->wn_child != NULL)
+ ++np->wn_child->wn_refs; // child gets extra ref
+ np->wn_byte = copyp->wn_byte;
+ if (np->wn_byte == NUL) {
+ np->wn_flags = copyp->wn_flags;
+ np->wn_region = copyp->wn_region;
+ np->wn_affixID = copyp->wn_affixID;
+ }
+
+ // Link the new node in the list, there will be one ref.
+ np->wn_refs = 1;
+ if (copyprev != NULL)
+ *copyprev = np;
+ copyprev = &np->wn_sibling;
+
+ // Let "node" point to the head of the copied list.
+ if (copyp == node)
+ node = np;
+ }
+ }
+
+ // Look for the sibling that has the same character. They are sorted
+ // on byte value, thus stop searching when a sibling is found with a
+ // higher byte value. For zero bytes (end of word) the sorting is
+ // done on flags and then on affixID.
+ while (node != NULL
+ && (node->wn_byte < word[i]
+ || (node->wn_byte == NUL
+ && (flags < 0
+ ? node->wn_affixID < (unsigned)affixID
+ : (node->wn_flags < (unsigned)(flags & WN_MASK)
+ || (node->wn_flags == (flags & WN_MASK)
+ && (spin->si_sugtree
+ ? (node->wn_region & 0xffff) < region
+ : node->wn_affixID
+ < (unsigned)affixID))))))) {
+ prev = &node->wn_sibling;
+ node = *prev;
+ }
+ if (node == NULL
+ || node->wn_byte != word[i]
+ || (word[i] == NUL
+ && (flags < 0
+ || spin->si_sugtree
+ || node->wn_flags != (flags & WN_MASK)
+ || node->wn_affixID != affixID))) {
+ // Allocate a new node.
+ np = get_wordnode(spin);
+ if (np == NULL)
+ return FAIL;
+ np->wn_byte = word[i];
+
+ // If "node" is NULL this is a new child or the end of the sibling
+ // list: ref count is one. Otherwise use ref count of sibling and
+ // make ref count of sibling one (matters when inserting in front
+ // of the list of siblings).
+ if (node == NULL)
+ np->wn_refs = 1;
+ else {
+ np->wn_refs = node->wn_refs;
+ node->wn_refs = 1;
+ }
+ if (prev != NULL)
+ *prev = np;
+ np->wn_sibling = node;
+ node = np;
+ }
+
+ if (word[i] == NUL) {
+ node->wn_flags = flags;
+ node->wn_region |= region;
+ node->wn_affixID = affixID;
+ break;
+ }
+ prev = &node->wn_child;
+ node = *prev;
+ }
+#ifdef SPELL_PRINTTREE
+ smsg((char_u *)"Added \"%s\"", word);
+ spell_print_tree(root->wn_sibling);
+#endif
+
+ // count nr of words added since last message
+ ++spin->si_msg_count;
+
+ if (spin->si_compress_cnt > 1) {
+ if (--spin->si_compress_cnt == 1)
+ // Did enough words to lower the block count limit.
+ spin->si_blocks_cnt += compress_inc;
+ }
+
+ // When we have allocated lots of memory we need to compress the word tree
+ // to free up some room. But compression is slow, and we might actually
+ // need that room, thus only compress in the following situations:
+ // 1. When not compressed before (si_compress_cnt == 0): when using
+ // "compress_start" blocks.
+ // 2. When compressed before and used "compress_inc" blocks before
+ // adding "compress_added" words (si_compress_cnt > 1).
+ // 3. When compressed before, added "compress_added" words
+ // (si_compress_cnt == 1) and the number of free nodes drops below the
+ // maximum word length.
+#ifndef SPELL_COMPRESS_ALLWAYS
+ if (spin->si_compress_cnt == 1 // NOLINT(readability/braces)
+ ? spin->si_free_count < MAXWLEN
+ : spin->si_blocks_cnt >= compress_start)
+#endif
+ {
+ // Decrement the block counter. The effect is that we compress again
+ // when the freed up room has been used and another "compress_inc"
+ // blocks have been allocated. Unless "compress_added" words have
+ // been added, then the limit is put back again.
+ spin->si_blocks_cnt -= compress_inc;
+ spin->si_compress_cnt = compress_added;
+
+ if (spin->si_verbose) {
+ msg_start();
+ msg_puts(_(msg_compressing));
+ msg_clr_eos();
+ msg_didout = FALSE;
+ msg_col = 0;
+ ui_flush();
+ }
+
+ // Compress both trees. Either they both have many nodes, which makes
+ // compression useful, or one of them is small, which means
+ // compression goes fast. But when filling the soundfold word tree
+ // there is no keep-case tree.
+ wordtree_compress(spin, spin->si_foldroot);
+ if (affixID >= 0)
+ wordtree_compress(spin, spin->si_keeproot);
+ }
+
+ return OK;
+}
+
+// Get a wordnode_T, either from the list of previously freed nodes or
+// allocate a new one.
+// Returns NULL when out of memory.
+static wordnode_T *get_wordnode(spellinfo_T *spin)
+{
+ wordnode_T *n;
+
+ if (spin->si_first_free == NULL)
+ n = (wordnode_T *)getroom(spin, sizeof(wordnode_T), true);
+ else {
+ n = spin->si_first_free;
+ spin->si_first_free = n->wn_child;
+ memset(n, 0, sizeof(wordnode_T));
+ --spin->si_free_count;
+ }
+#ifdef SPELL_PRINTTREE
+ if (n != NULL)
+ n->wn_nr = ++spin->si_wordnode_nr;
+#endif
+ return n;
+}
+
+// Decrement the reference count on a node (which is the head of a list of
+// siblings). If the reference count becomes zero free the node and its
+// siblings.
+// Returns the number of nodes actually freed.
+static int deref_wordnode(spellinfo_T *spin, wordnode_T *node)
+{
+ wordnode_T *np;
+ int cnt = 0;
+
+ if (--node->wn_refs == 0) {
+ for (np = node; np != NULL; np = np->wn_sibling) {
+ if (np->wn_child != NULL)
+ cnt += deref_wordnode(spin, np->wn_child);
+ free_wordnode(spin, np);
+ ++cnt;
+ }
+ ++cnt; // length field
+ }
+ return cnt;
+}
+
+// Free a wordnode_T for re-use later.
+// Only the "wn_child" field becomes invalid.
+static void free_wordnode(spellinfo_T *spin, wordnode_T *n)
+{
+ n->wn_child = spin->si_first_free;
+ spin->si_first_free = n;
+ ++spin->si_free_count;
+}
+
+// Compress a tree: find tails that are identical and can be shared.
+static void wordtree_compress(spellinfo_T *spin, wordnode_T *root)
+{
+ hashtab_T ht;
+ int n;
+ int tot = 0;
+ int perc;
+
+ // Skip the root itself, it's not actually used. The first sibling is the
+ // start of the tree.
+ if (root->wn_sibling != NULL) {
+ hash_init(&ht);
+ n = node_compress(spin, root->wn_sibling, &ht, &tot);
+
+#ifndef SPELL_PRINTTREE
+ if (spin->si_verbose || p_verbose > 2)
+#endif
+ {
+ if (tot > 1000000)
+ perc = (tot - n) / (tot / 100);
+ else if (tot == 0)
+ perc = 0;
+ else
+ perc = (tot - n) * 100 / tot;
+ vim_snprintf((char *)IObuff, IOSIZE,
+ _("Compressed %d of %d nodes; %d (%d%%) remaining"),
+ n, tot, tot - n, perc);
+ spell_message(spin, IObuff);
+ }
+#ifdef SPELL_PRINTTREE
+ spell_print_tree(root->wn_sibling);
+#endif
+ hash_clear(&ht);
+ }
+}
+
+// Compress a node, its siblings and its children, depth first.
+// Returns the number of compressed nodes.
+static int
+node_compress (
+ spellinfo_T *spin,
+ wordnode_T *node,
+ hashtab_T *ht,
+ int *tot // total count of nodes before compressing,
+ // incremented while going through the tree
+)
+{
+ wordnode_T *np;
+ wordnode_T *tp;
+ wordnode_T *child;
+ hash_T hash;
+ hashitem_T *hi;
+ int len = 0;
+ unsigned nr, n;
+ int compressed = 0;
+
+ // Go through the list of siblings. Compress each child and then try
+ // finding an identical child to replace it.
+ // Note that with "child" we mean not just the node that is pointed to,
+ // but the whole list of siblings of which the child node is the first.
+ for (np = node; np != NULL && !got_int; np = np->wn_sibling) {
+ ++len;
+ if ((child = np->wn_child) != NULL) {
+ // Compress the child first. This fills hashkey.
+ compressed += node_compress(spin, child, ht, tot);
+
+ // Try to find an identical child.
+ hash = hash_hash(child->wn_u1.hashkey);
+ hi = hash_lookup(ht, (const char *)child->wn_u1.hashkey,
+ STRLEN(child->wn_u1.hashkey), hash);
+ if (!HASHITEM_EMPTY(hi)) {
+ // There are children we encountered before with a hash value
+ // identical to the current child. Now check if there is one
+ // that is really identical.
+ for (tp = HI2WN(hi); tp != NULL; tp = tp->wn_u2.next)
+ if (node_equal(child, tp)) {
+ // Found one! Now use that child in place of the
+ // current one. This means the current child and all
+ // its siblings is unlinked from the tree.
+ ++tp->wn_refs;
+ compressed += deref_wordnode(spin, child);
+ np->wn_child = tp;
+ break;
+ }
+ if (tp == NULL) {
+ // No other child with this hash value equals the child of
+ // the node, add it to the linked list after the first
+ // item.
+ tp = HI2WN(hi);
+ child->wn_u2.next = tp->wn_u2.next;
+ tp->wn_u2.next = child;
+ }
+ } else
+ // No other child has this hash value, add it to the
+ // hashtable.
+ hash_add_item(ht, hi, child->wn_u1.hashkey, hash);
+ }
+ }
+ *tot += len + 1; // add one for the node that stores the length
+
+ // Make a hash key for the node and its siblings, so that we can quickly
+ // find a lookalike node. This must be done after compressing the sibling
+ // list, otherwise the hash key would become invalid by the compression.
+ node->wn_u1.hashkey[0] = len;
+ nr = 0;
+ for (np = node; np != NULL; np = np->wn_sibling) {
+ if (np->wn_byte == NUL)
+ // end node: use wn_flags, wn_region and wn_affixID
+ n = np->wn_flags + (np->wn_region << 8) + (np->wn_affixID << 16);
+ else
+ // byte node: use the byte value and the child pointer
+ n = (unsigned)(np->wn_byte + ((uintptr_t)np->wn_child << 8));
+ nr = nr * 101 + n;
+ }
+
+ // Avoid NUL bytes, it terminates the hash key.
+ n = nr & 0xff;
+ node->wn_u1.hashkey[1] = n == 0 ? 1 : n;
+ n = (nr >> 8) & 0xff;
+ node->wn_u1.hashkey[2] = n == 0 ? 1 : n;
+ n = (nr >> 16) & 0xff;
+ node->wn_u1.hashkey[3] = n == 0 ? 1 : n;
+ n = (nr >> 24) & 0xff;
+ node->wn_u1.hashkey[4] = n == 0 ? 1 : n;
+ node->wn_u1.hashkey[5] = NUL;
+
+ // Check for CTRL-C pressed now and then.
+ fast_breakcheck();
+
+ return compressed;
+}
+
+// Returns true when two nodes have identical siblings and children.
+static bool node_equal(wordnode_T *n1, wordnode_T *n2)
+{
+ wordnode_T *p1;
+ wordnode_T *p2;
+
+ for (p1 = n1, p2 = n2; p1 != NULL && p2 != NULL;
+ p1 = p1->wn_sibling, p2 = p2->wn_sibling)
+ if (p1->wn_byte != p2->wn_byte
+ || (p1->wn_byte == NUL
+ ? (p1->wn_flags != p2->wn_flags
+ || p1->wn_region != p2->wn_region
+ || p1->wn_affixID != p2->wn_affixID)
+ : (p1->wn_child != p2->wn_child)))
+ break;
+
+ return p1 == NULL && p2 == NULL;
+}
+
+
+// Function given to qsort() to sort the REP items on "from" string.
+static int rep_compare(const void *s1, const void *s2)
+{
+ fromto_T *p1 = (fromto_T *)s1;
+ fromto_T *p2 = (fromto_T *)s2;
+
+ return STRCMP(p1->ft_from, p2->ft_from);
+}
+
+// Write the Vim .spl file "fname".
+// Return OK/FAIL.
+static int write_vim_spell(spellinfo_T *spin, char_u *fname)
+{
+ int retval = OK;
+ int regionmask;
+
+ FILE *fd = mch_fopen((char *)fname, "w");
+ if (fd == NULL) {
+ EMSG2(_(e_notopen), fname);
+ return FAIL;
+ }
+
+ // <HEADER>: <fileID> <versionnr>
+ // <fileID>
+ size_t fwv = fwrite(VIMSPELLMAGIC, VIMSPELLMAGICL, 1, fd);
+ if (fwv != (size_t)1)
+ // Catch first write error, don't try writing more.
+ goto theend;
+
+ putc(VIMSPELLVERSION, fd); // <versionnr>
+
+ // <SECTIONS>: <section> ... <sectionend>
+
+ // SN_INFO: <infotext>
+ if (spin->si_info != NULL) {
+ putc(SN_INFO, fd); // <sectionID>
+ putc(0, fd); // <sectionflags>
+ size_t i = STRLEN(spin->si_info);
+ put_bytes(fd, i, 4); // <sectionlen>
+ fwv &= fwrite(spin->si_info, i, 1, fd); // <infotext>
+ }
+
+ // SN_REGION: <regionname> ...
+ // Write the region names only if there is more than one.
+ if (spin->si_region_count > 1) {
+ putc(SN_REGION, fd); // <sectionID>
+ putc(SNF_REQUIRED, fd); // <sectionflags>
+ size_t l = (size_t)spin->si_region_count * 2;
+ put_bytes(fd, l, 4); // <sectionlen>
+ fwv &= fwrite(spin->si_region_name, l, 1, fd);
+ // <regionname> ...
+ regionmask = (1 << spin->si_region_count) - 1;
+ } else
+ regionmask = 0;
+
+ // SN_CHARFLAGS: <charflagslen> <charflags> <folcharslen> <folchars>
+ //
+ // The table with character flags and the table for case folding.
+ // This makes sure the same characters are recognized as word characters
+ // when generating an when using a spell file.
+ // Skip this for ASCII, the table may conflict with the one used for
+ // 'encoding'.
+ // Also skip this for an .add.spl file, the main spell file must contain
+ // the table (avoids that it conflicts). File is shorter too.
+ if (!spin->si_ascii && !spin->si_add) {
+ char_u folchars[128 * 8];
+ int flags;
+
+ putc(SN_CHARFLAGS, fd); // <sectionID>
+ putc(SNF_REQUIRED, fd); // <sectionflags>
+
+ // Form the <folchars> string first, we need to know its length.
+ size_t l = 0;
+ for (size_t i = 128; i < 256; i++) {
+ l += (size_t)utf_char2bytes(spelltab.st_fold[i], folchars + l);
+ }
+ put_bytes(fd, 1 + 128 + 2 + l, 4); // <sectionlen>
+
+ fputc(128, fd); // <charflagslen>
+ for (size_t i = 128; i < 256; ++i) {
+ flags = 0;
+ if (spelltab.st_isw[i])
+ flags |= CF_WORD;
+ if (spelltab.st_isu[i])
+ flags |= CF_UPPER;
+ fputc(flags, fd); // <charflags>
+ }
+
+ put_bytes(fd, l, 2); // <folcharslen>
+ fwv &= fwrite(folchars, l, 1, fd); // <folchars>
+ }
+
+ // SN_MIDWORD: <midword>
+ if (spin->si_midword != NULL) {
+ putc(SN_MIDWORD, fd); // <sectionID>
+ putc(SNF_REQUIRED, fd); // <sectionflags>
+
+ size_t i = STRLEN(spin->si_midword);
+ put_bytes(fd, i, 4); // <sectionlen>
+ fwv &= fwrite(spin->si_midword, i, 1, fd);
+ // <midword>
+ }
+
+ // SN_PREFCOND: <prefcondcnt> <prefcond> ...
+ if (!GA_EMPTY(&spin->si_prefcond)) {
+ putc(SN_PREFCOND, fd); // <sectionID>
+ putc(SNF_REQUIRED, fd); // <sectionflags>
+
+ size_t l = (size_t)write_spell_prefcond(NULL, &spin->si_prefcond);
+ put_bytes(fd, l, 4); // <sectionlen>
+
+ write_spell_prefcond(fd, &spin->si_prefcond);
+ }
+
+ // SN_REP: <repcount> <rep> ...
+ // SN_SAL: <salflags> <salcount> <sal> ...
+ // SN_REPSAL: <repcount> <rep> ...
+
+ // round 1: SN_REP section
+ // round 2: SN_SAL section (unless SN_SOFO is used)
+ // round 3: SN_REPSAL section
+ for (unsigned int round = 1; round <= 3; ++round) {
+ garray_T *gap;
+ if (round == 1)
+ gap = &spin->si_rep;
+ else if (round == 2) {
+ // Don't write SN_SAL when using a SN_SOFO section
+ if (spin->si_sofofr != NULL && spin->si_sofoto != NULL)
+ continue;
+ gap = &spin->si_sal;
+ } else
+ gap = &spin->si_repsal;
+
+ // Don't write the section if there are no items.
+ if (GA_EMPTY(gap))
+ continue;
+
+ // Sort the REP/REPSAL items.
+ if (round != 2)
+ qsort(gap->ga_data, (size_t)gap->ga_len,
+ sizeof(fromto_T), rep_compare);
+
+ int sect_id = round == 1 ? SN_REP : (round == 2 ? SN_SAL : SN_REPSAL);
+ putc(sect_id, fd); // <sectionID>
+
+ // This is for making suggestions, section is not required.
+ putc(0, fd); // <sectionflags>
+
+ // Compute the length of what follows.
+ size_t l = 2; // count <repcount> or <salcount>
+ assert(gap->ga_len >= 0);
+ for (size_t i = 0; i < (size_t)gap->ga_len; ++i) {
+ fromto_T *ftp = &((fromto_T *)gap->ga_data)[i];
+ l += 1 + STRLEN(ftp->ft_from); // count <*fromlen> and <*from>
+ l += 1 + STRLEN(ftp->ft_to); // count <*tolen> and <*to>
+ }
+ if (round == 2)
+ ++l; // count <salflags>
+ put_bytes(fd, l, 4); // <sectionlen>
+
+ if (round == 2) {
+ int i = 0;
+ if (spin->si_followup)
+ i |= SAL_F0LLOWUP;
+ if (spin->si_collapse)
+ i |= SAL_COLLAPSE;
+ if (spin->si_rem_accents)
+ i |= SAL_REM_ACCENTS;
+ putc(i, fd); // <salflags>
+ }
+
+ put_bytes(fd, (uintmax_t)gap->ga_len, 2); // <repcount> or <salcount>
+ for (size_t i = 0; i < (size_t)gap->ga_len; ++i) {
+ // <rep> : <repfromlen> <repfrom> <reptolen> <repto>
+ // <sal> : <salfromlen> <salfrom> <saltolen> <salto>
+ fromto_T *ftp = &((fromto_T *)gap->ga_data)[i];
+ for (unsigned int rr = 1; rr <= 2; ++rr) {
+ char_u *p = rr == 1 ? ftp->ft_from : ftp->ft_to;
+ l = STRLEN(p);
+ assert(l < INT_MAX);
+ putc((int)l, fd);
+ if (l > 0)
+ fwv &= fwrite(p, l, 1, fd);
+ }
+ }
+
+ }
+
+ // SN_SOFO: <sofofromlen> <sofofrom> <sofotolen> <sofoto>
+ // This is for making suggestions, section is not required.
+ if (spin->si_sofofr != NULL && spin->si_sofoto != NULL) {
+ putc(SN_SOFO, fd); // <sectionID>
+ putc(0, fd); // <sectionflags>
+
+ size_t l = STRLEN(spin->si_sofofr);
+ put_bytes(fd, l + STRLEN(spin->si_sofoto) + 4, 4); // <sectionlen>
+
+ put_bytes(fd, l, 2); // <sofofromlen>
+ fwv &= fwrite(spin->si_sofofr, l, 1, fd); // <sofofrom>
+
+ l = STRLEN(spin->si_sofoto);
+ put_bytes(fd, l, 2); // <sofotolen>
+ fwv &= fwrite(spin->si_sofoto, l, 1, fd); // <sofoto>
+ }
+
+ // SN_WORDS: <word> ...
+ // This is for making suggestions, section is not required.
+ if (spin->si_commonwords.ht_used > 0) {
+ putc(SN_WORDS, fd); // <sectionID>
+ putc(0, fd); // <sectionflags>
+
+ // round 1: count the bytes
+ // round 2: write the bytes
+ for (unsigned int round = 1; round <= 2; ++round) {
+ size_t todo;
+ size_t len = 0;
+ hashitem_T *hi;
+
+ todo = spin->si_commonwords.ht_used;
+ for (hi = spin->si_commonwords.ht_array; todo > 0; ++hi)
+ if (!HASHITEM_EMPTY(hi)) {
+ size_t l = STRLEN(hi->hi_key) + 1;
+ len += l;
+ if (round == 2) // <word>
+ fwv &= fwrite(hi->hi_key, l, 1, fd);
+ --todo;
+ }
+ if (round == 1)
+ put_bytes(fd, len, 4); // <sectionlen>
+ }
+ }
+
+ // SN_MAP: <mapstr>
+ // This is for making suggestions, section is not required.
+ if (!GA_EMPTY(&spin->si_map)) {
+ putc(SN_MAP, fd); // <sectionID>
+ putc(0, fd); // <sectionflags>
+ size_t l = (size_t)spin->si_map.ga_len;
+ put_bytes(fd, l, 4); // <sectionlen>
+ fwv &= fwrite(spin->si_map.ga_data, l, 1, fd); // <mapstr>
+ }
+
+ // SN_SUGFILE: <timestamp>
+ // This is used to notify that a .sug file may be available and at the
+ // same time allows for checking that a .sug file that is found matches
+ // with this .spl file. That's because the word numbers must be exactly
+ // right.
+ if (!spin->si_nosugfile
+ && (!GA_EMPTY(&spin->si_sal)
+ || (spin->si_sofofr != NULL && spin->si_sofoto != NULL))) {
+ putc(SN_SUGFILE, fd); // <sectionID>
+ putc(0, fd); // <sectionflags>
+ put_bytes(fd, 8, 4); // <sectionlen>
+
+ // Set si_sugtime and write it to the file.
+ spin->si_sugtime = time(NULL);
+ put_time(fd, spin->si_sugtime); // <timestamp>
+ }
+
+ // SN_NOSPLITSUGS: nothing
+ // This is used to notify that no suggestions with word splits are to be
+ // made.
+ if (spin->si_nosplitsugs) {
+ putc(SN_NOSPLITSUGS, fd); // <sectionID>
+ putc(0, fd); // <sectionflags>
+ put_bytes(fd, 0, 4); // <sectionlen>
+ }
+
+ // SN_NOCOMPUNDSUGS: nothing
+ // This is used to notify that no suggestions with compounds are to be
+ // made.
+ if (spin->si_nocompoundsugs) {
+ putc(SN_NOCOMPOUNDSUGS, fd); // <sectionID>
+ putc(0, fd); // <sectionflags>
+ put_bytes(fd, 0, 4); // <sectionlen>
+ }
+
+ // SN_COMPOUND: compound info.
+ // We don't mark it required, when not supported all compound words will
+ // be bad words.
+ if (spin->si_compflags != NULL) {
+ putc(SN_COMPOUND, fd); // <sectionID>
+ putc(0, fd); // <sectionflags>
+
+ size_t l = STRLEN(spin->si_compflags);
+ assert(spin->si_comppat.ga_len >= 0);
+ for (size_t i = 0; i < (size_t)spin->si_comppat.ga_len; ++i) {
+ l += STRLEN(((char_u **)(spin->si_comppat.ga_data))[i]) + 1;
+ }
+ put_bytes(fd, l + 7, 4); // <sectionlen>
+
+ putc(spin->si_compmax, fd); // <compmax>
+ putc(spin->si_compminlen, fd); // <compminlen>
+ putc(spin->si_compsylmax, fd); // <compsylmax>
+ putc(0, fd); // for Vim 7.0b compatibility
+ putc(spin->si_compoptions, fd); // <compoptions>
+ put_bytes(fd, (uintmax_t)spin->si_comppat.ga_len, 2); // <comppatcount>
+ for (size_t i = 0; i < (size_t)spin->si_comppat.ga_len; ++i) {
+ char_u *p = ((char_u **)(spin->si_comppat.ga_data))[i];
+ assert(STRLEN(p) < INT_MAX);
+ putc((int)STRLEN(p), fd); // <comppatlen>
+ fwv &= fwrite(p, STRLEN(p), 1, fd); // <comppattext>
+ }
+ // <compflags>
+ fwv &= fwrite(spin->si_compflags, STRLEN(spin->si_compflags), 1, fd);
+ }
+
+ // SN_NOBREAK: NOBREAK flag
+ if (spin->si_nobreak) {
+ putc(SN_NOBREAK, fd); // <sectionID>
+ putc(0, fd); // <sectionflags>
+
+ // It's empty, the presence of the section flags the feature.
+ put_bytes(fd, 0, 4); // <sectionlen>
+ }
+
+ // SN_SYLLABLE: syllable info.
+ // We don't mark it required, when not supported syllables will not be
+ // counted.
+ if (spin->si_syllable != NULL) {
+ putc(SN_SYLLABLE, fd); // <sectionID>
+ putc(0, fd); // <sectionflags>
+
+ size_t l = STRLEN(spin->si_syllable);
+ put_bytes(fd, l, 4); // <sectionlen>
+ fwv &= fwrite(spin->si_syllable, l, 1, fd); // <syllable>
+ }
+
+ // end of <SECTIONS>
+ putc(SN_END, fd); // <sectionend>
+
+
+ // <LWORDTREE> <KWORDTREE> <PREFIXTREE>
+ spin->si_memtot = 0;
+ for (unsigned int round = 1; round <= 3; ++round) {
+ wordnode_T *tree;
+ if (round == 1)
+ tree = spin->si_foldroot->wn_sibling;
+ else if (round == 2)
+ tree = spin->si_keeproot->wn_sibling;
+ else
+ tree = spin->si_prefroot->wn_sibling;
+
+ // Clear the index and wnode fields in the tree.
+ clear_node(tree);
+
+ // Count the number of nodes. Needed to be able to allocate the
+ // memory when reading the nodes. Also fills in index for shared
+ // nodes.
+ size_t nodecount = (size_t)put_node(NULL, tree, 0, regionmask, round == 3);
+
+ // number of nodes in 4 bytes
+ put_bytes(fd, nodecount, 4); // <nodecount>
+ assert(nodecount + nodecount * sizeof(int) < INT_MAX);
+ spin->si_memtot += (int)(nodecount + nodecount * sizeof(int));
+
+ // Write the nodes.
+ (void)put_node(fd, tree, 0, regionmask, round == 3);
+ }
+
+ // Write another byte to check for errors (file system full).
+ if (putc(0, fd) == EOF)
+ retval = FAIL;
+theend:
+ if (fclose(fd) == EOF)
+ retval = FAIL;
+
+ if (fwv != (size_t)1)
+ retval = FAIL;
+ if (retval == FAIL)
+ EMSG(_(e_write));
+
+ return retval;
+}
+
+// Clear the index and wnode fields of "node", it siblings and its
+// children. This is needed because they are a union with other items to save
+// space.
+static void clear_node(wordnode_T *node)
+{
+ wordnode_T *np;
+
+ if (node != NULL)
+ for (np = node; np != NULL; np = np->wn_sibling) {
+ np->wn_u1.index = 0;
+ np->wn_u2.wnode = NULL;
+
+ if (np->wn_byte != NUL)
+ clear_node(np->wn_child);
+ }
+}
+
+
+// Dump a word tree at node "node".
+//
+// This first writes the list of possible bytes (siblings). Then for each
+// byte recursively write the children.
+//
+// NOTE: The code here must match the code in read_tree_node(), since
+// assumptions are made about the indexes (so that we don't have to write them
+// in the file).
+//
+// Returns the number of nodes used.
+static int
+put_node (
+ FILE *fd, // NULL when only counting
+ wordnode_T *node,
+ int idx,
+ int regionmask,
+ bool prefixtree // true for PREFIXTREE
+)
+{
+ // If "node" is zero the tree is empty.
+ if (node == NULL)
+ return 0;
+
+ // Store the index where this node is written.
+ node->wn_u1.index = idx;
+
+ // Count the number of siblings.
+ int siblingcount = 0;
+ for (wordnode_T *np = node; np != NULL; np = np->wn_sibling)
+ ++siblingcount;
+
+ // Write the sibling count.
+ if (fd != NULL)
+ putc(siblingcount, fd); // <siblingcount>
+
+ // Write each sibling byte and optionally extra info.
+ for (wordnode_T *np = node; np != NULL; np = np->wn_sibling) {
+ if (np->wn_byte == 0) {
+ if (fd != NULL) {
+ // For a NUL byte (end of word) write the flags etc.
+ if (prefixtree) {
+ // In PREFIXTREE write the required affixID and the
+ // associated condition nr (stored in wn_region). The
+ // byte value is misused to store the "rare" and "not
+ // combining" flags
+ if (np->wn_flags == (uint16_t)PFX_FLAGS)
+ putc(BY_NOFLAGS, fd); // <byte>
+ else {
+ putc(BY_FLAGS, fd); // <byte>
+ putc(np->wn_flags, fd); // <pflags>
+ }
+ putc(np->wn_affixID, fd); // <affixID>
+ put_bytes(fd, (uintmax_t)np->wn_region, 2); // <prefcondnr>
+ } else {
+ // For word trees we write the flag/region items.
+ int flags = np->wn_flags;
+ if (regionmask != 0 && np->wn_region != regionmask)
+ flags |= WF_REGION;
+ if (np->wn_affixID != 0)
+ flags |= WF_AFX;
+ if (flags == 0) {
+ // word without flags or region
+ putc(BY_NOFLAGS, fd); // <byte>
+ } else {
+ if (np->wn_flags >= 0x100) {
+ putc(BY_FLAGS2, fd); // <byte>
+ putc(flags, fd); // <flags>
+ putc((int)((unsigned)flags >> 8), fd); // <flags2>
+ } else {
+ putc(BY_FLAGS, fd); // <byte>
+ putc(flags, fd); // <flags>
+ }
+ if (flags & WF_REGION)
+ putc(np->wn_region, fd); // <region>
+ if (flags & WF_AFX)
+ putc(np->wn_affixID, fd); // <affixID>
+ }
+ }
+ }
+ } else {
+ if (np->wn_child->wn_u1.index != 0
+ && np->wn_child->wn_u2.wnode != node) {
+ // The child is written elsewhere, write the reference.
+ if (fd != NULL) {
+ putc(BY_INDEX, fd); // <byte>
+ put_bytes(fd, (uintmax_t)np->wn_child->wn_u1.index, 3); // <nodeidx>
+ }
+ } else if (np->wn_child->wn_u2.wnode == NULL)
+ // We will write the child below and give it an index.
+ np->wn_child->wn_u2.wnode = node;
+
+ if (fd != NULL)
+ if (putc(np->wn_byte, fd) == EOF) { // <byte> or <xbyte>
+ EMSG(_(e_write));
+ return 0;
+ }
+ }
+ }
+
+ // Space used in the array when reading: one for each sibling and one for
+ // the count.
+ int newindex = idx + siblingcount + 1;
+
+ // Recursively dump the children of each sibling.
+ for (wordnode_T *np = node; np != NULL; np = np->wn_sibling)
+ if (np->wn_byte != 0 && np->wn_child->wn_u2.wnode == node)
+ newindex = put_node(fd, np->wn_child, newindex, regionmask,
+ prefixtree);
+
+ return newindex;
+}
+
+
+// ":mkspell [-ascii] outfile infile ..."
+// ":mkspell [-ascii] addfile"
+void ex_mkspell(exarg_T *eap)
+{
+ int fcount;
+ char_u **fnames;
+ char_u *arg = eap->arg;
+ bool ascii = false;
+
+ if (STRNCMP(arg, "-ascii", 6) == 0) {
+ ascii = true;
+ arg = skipwhite(arg + 6);
+ }
+
+ // Expand all the remaining arguments (e.g., $VIMRUNTIME).
+ if (get_arglist_exp(arg, &fcount, &fnames, false) == OK) {
+ mkspell(fcount, fnames, ascii, eap->forceit, false);
+ FreeWild(fcount, fnames);
+ }
+}
+
+// Create the .sug file.
+// Uses the soundfold info in "spin".
+// Writes the file with the name "wfname", with ".spl" changed to ".sug".
+static void spell_make_sugfile(spellinfo_T *spin, char_u *wfname)
+{
+ char_u *fname = NULL;
+ int len;
+ slang_T *slang;
+ bool free_slang = false;
+
+ // Read back the .spl file that was written. This fills the required
+ // info for soundfolding. This also uses less memory than the
+ // pointer-linked version of the trie. And it avoids having two versions
+ // of the code for the soundfolding stuff.
+ // It might have been done already by spell_reload_one().
+ for (slang = first_lang; slang != NULL; slang = slang->sl_next) {
+ if (path_full_compare(wfname, slang->sl_fname, false) == kEqualFiles) {
+ break;
+ }
+ }
+ if (slang == NULL) {
+ spell_message(spin, (char_u *)_("Reading back spell file..."));
+ slang = spell_load_file(wfname, NULL, NULL, false);
+ if (slang == NULL)
+ return;
+ free_slang = true;
+ }
+
+ // Clear the info in "spin" that is used.
+ spin->si_blocks = NULL;
+ spin->si_blocks_cnt = 0;
+ spin->si_compress_cnt = 0; // will stay at 0 all the time
+ spin->si_free_count = 0;
+ spin->si_first_free = NULL;
+ spin->si_foldwcount = 0;
+
+ // Go through the trie of good words, soundfold each word and add it to
+ // the soundfold trie.
+ spell_message(spin, (char_u *)_("Performing soundfolding..."));
+ if (sug_filltree(spin, slang) == FAIL)
+ goto theend;
+
+ // Create the table which links each soundfold word with a list of the
+ // good words it may come from. Creates buffer "spin->si_spellbuf".
+ // This also removes the wordnr from the NUL byte entries to make
+ // compression possible.
+ if (sug_maketable(spin) == FAIL)
+ goto theend;
+
+ smsg(_("Number of words after soundfolding: %" PRId64),
+ (int64_t)spin->si_spellbuf->b_ml.ml_line_count);
+
+ // Compress the soundfold trie.
+ spell_message(spin, (char_u *)_(msg_compressing));
+ wordtree_compress(spin, spin->si_foldroot);
+
+ // Write the .sug file.
+ // Make the file name by changing ".spl" to ".sug".
+ fname = xmalloc(MAXPATHL);
+ STRLCPY(fname, wfname, MAXPATHL);
+ len = (int)STRLEN(fname);
+ fname[len - 2] = 'u';
+ fname[len - 1] = 'g';
+ sug_write(spin, fname);
+
+theend:
+ xfree(fname);
+ if (free_slang)
+ slang_free(slang);
+ free_blocks(spin->si_blocks);
+ close_spellbuf(spin->si_spellbuf);
+}
+
+// Build the soundfold trie for language "slang".
+static int sug_filltree(spellinfo_T *spin, slang_T *slang)
+{
+ char_u *byts;
+ idx_T *idxs;
+ int depth;
+ idx_T arridx[MAXWLEN];
+ int curi[MAXWLEN];
+ char_u tword[MAXWLEN];
+ char_u tsalword[MAXWLEN];
+ int c;
+ idx_T n;
+ unsigned words_done = 0;
+ int wordcount[MAXWLEN];
+
+ // We use si_foldroot for the soundfolded trie.
+ spin->si_foldroot = wordtree_alloc(spin);
+
+ // Let tree_add_word() know we're adding to the soundfolded tree
+ spin->si_sugtree = true;
+
+ // Go through the whole case-folded tree, soundfold each word and put it
+ // in the trie.
+ byts = slang->sl_fbyts;
+ idxs = slang->sl_fidxs;
+
+ arridx[0] = 0;
+ curi[0] = 1;
+ wordcount[0] = 0;
+
+ depth = 0;
+ while (depth >= 0 && !got_int) {
+ if (curi[depth] > byts[arridx[depth]]) {
+ // Done all bytes at this node, go up one level.
+ idxs[arridx[depth]] = wordcount[depth];
+ if (depth > 0)
+ wordcount[depth - 1] += wordcount[depth];
+
+ --depth;
+ line_breakcheck();
+ } else {
+
+ // Do one more byte at this node.
+ n = arridx[depth] + curi[depth];
+ ++curi[depth];
+
+ c = byts[n];
+ if (c == 0) {
+ // Sound-fold the word.
+ tword[depth] = NUL;
+ spell_soundfold(slang, tword, true, tsalword);
+
+ // We use the "flags" field for the MSB of the wordnr,
+ // "region" for the LSB of the wordnr.
+ if (tree_add_word(spin, tsalword, spin->si_foldroot,
+ words_done >> 16, words_done & 0xffff,
+ 0) == FAIL)
+ return FAIL;
+
+ ++words_done;
+ ++wordcount[depth];
+
+ // Reset the block count each time to avoid compression
+ // kicking in.
+ spin->si_blocks_cnt = 0;
+
+ // Skip over any other NUL bytes (same word with different
+ // flags).
+ while (byts[n + 1] == 0) {
+ ++n;
+ ++curi[depth];
+ }
+ } else {
+ // Normal char, go one level deeper.
+ tword[depth++] = c;
+ arridx[depth] = idxs[n];
+ curi[depth] = 1;
+ wordcount[depth] = 0;
+ }
+ }
+ }
+
+ smsg(_("Total number of words: %d"), words_done);
+
+ return OK;
+}
+
+// Make the table that links each word in the soundfold trie to the words it
+// can be produced from.
+// This is not unlike lines in a file, thus use a memfile to be able to access
+// the table efficiently.
+// Returns FAIL when out of memory.
+static int sug_maketable(spellinfo_T *spin)
+{
+ garray_T ga;
+ int res = OK;
+
+ // Allocate a buffer, open a memline for it and create the swap file
+ // (uses a temp file, not a .swp file).
+ spin->si_spellbuf = open_spellbuf();
+
+ // Use a buffer to store the line info, avoids allocating many small
+ // pieces of memory.
+ ga_init(&ga, 1, 100);
+
+ // recursively go through the tree
+ if (sug_filltable(spin, spin->si_foldroot->wn_sibling, 0, &ga) == -1)
+ res = FAIL;
+
+ ga_clear(&ga);
+ return res;
+}
+
+// Fill the table for one node and its children.
+// Returns the wordnr at the start of the node.
+// Returns -1 when out of memory.
+static int
+sug_filltable (
+ spellinfo_T *spin,
+ wordnode_T *node,
+ int startwordnr,
+ garray_T *gap // place to store line of numbers
+)
+{
+ wordnode_T *p, *np;
+ int wordnr = startwordnr;
+ int nr;
+ int prev_nr;
+
+ for (p = node; p != NULL; p = p->wn_sibling) {
+ if (p->wn_byte == NUL) {
+ gap->ga_len = 0;
+ prev_nr = 0;
+ for (np = p; np != NULL && np->wn_byte == NUL; np = np->wn_sibling) {
+ ga_grow(gap, 10);
+
+ nr = (np->wn_flags << 16) + (np->wn_region & 0xffff);
+ // Compute the offset from the previous nr and store the
+ // offset in a way that it takes a minimum number of bytes.
+ // It's a bit like utf-8, but without the need to mark
+ // following bytes.
+ nr -= prev_nr;
+ prev_nr += nr;
+ gap->ga_len += offset2bytes(nr,
+ (char_u *)gap->ga_data + gap->ga_len);
+ }
+
+ // add the NUL byte
+ ((char_u *)gap->ga_data)[gap->ga_len++] = NUL;
+
+ if (ml_append_buf(spin->si_spellbuf, (linenr_T)wordnr,
+ gap->ga_data, gap->ga_len, TRUE) == FAIL)
+ return -1;
+ ++wordnr;
+
+ // Remove extra NUL entries, we no longer need them. We don't
+ // bother freeing the nodes, the won't be reused anyway.
+ while (p->wn_sibling != NULL && p->wn_sibling->wn_byte == NUL)
+ p->wn_sibling = p->wn_sibling->wn_sibling;
+
+ // Clear the flags on the remaining NUL node, so that compression
+ // works a lot better.
+ p->wn_flags = 0;
+ p->wn_region = 0;
+ } else {
+ wordnr = sug_filltable(spin, p->wn_child, wordnr, gap);
+ if (wordnr == -1)
+ return -1;
+ }
+ }
+ return wordnr;
+}
+
+// Convert an offset into a minimal number of bytes.
+// Similar to utf_char2byters, but use 8 bits in followup bytes and avoid NUL
+// bytes.
+static int offset2bytes(int nr, char_u *buf)
+{
+ int rem;
+ int b1, b2, b3, b4;
+
+ // Split the number in parts of base 255. We need to avoid NUL bytes.
+ b1 = nr % 255 + 1;
+ rem = nr / 255;
+ b2 = rem % 255 + 1;
+ rem = rem / 255;
+ b3 = rem % 255 + 1;
+ b4 = rem / 255 + 1;
+
+ if (b4 > 1 || b3 > 0x1f) { // 4 bytes
+ buf[0] = 0xe0 + b4;
+ buf[1] = b3;
+ buf[2] = b2;
+ buf[3] = b1;
+ return 4;
+ }
+ if (b3 > 1 || b2 > 0x3f ) { // 3 bytes
+ buf[0] = 0xc0 + b3;
+ buf[1] = b2;
+ buf[2] = b1;
+ return 3;
+ }
+ if (b2 > 1 || b1 > 0x7f ) { // 2 bytes
+ buf[0] = 0x80 + b2;
+ buf[1] = b1;
+ return 2;
+ }
+ // 1 byte
+ buf[0] = b1;
+ return 1;
+}
+
+// Write the .sug file in "fname".
+static void sug_write(spellinfo_T *spin, char_u *fname)
+{
+ // Create the file. Note that an existing file is silently overwritten!
+ FILE *fd = mch_fopen((char *)fname, "w");
+ if (fd == NULL) {
+ EMSG2(_(e_notopen), fname);
+ return;
+ }
+
+ vim_snprintf((char *)IObuff, IOSIZE,
+ _("Writing suggestion file %s..."), fname);
+ spell_message(spin, IObuff);
+
+ // <SUGHEADER>: <fileID> <versionnr> <timestamp>
+ if (fwrite(VIMSUGMAGIC, VIMSUGMAGICL, (size_t)1, fd) != 1) { // <fileID>
+ EMSG(_(e_write));
+ goto theend;
+ }
+ putc(VIMSUGVERSION, fd); // <versionnr>
+
+ // Write si_sugtime to the file.
+ put_time(fd, spin->si_sugtime); // <timestamp>
+
+ // <SUGWORDTREE>
+ spin->si_memtot = 0;
+ wordnode_T *tree = spin->si_foldroot->wn_sibling;
+
+ // Clear the index and wnode fields in the tree.
+ clear_node(tree);
+
+ // Count the number of nodes. Needed to be able to allocate the
+ // memory when reading the nodes. Also fills in index for shared
+ // nodes.
+ size_t nodecount = (size_t)put_node(NULL, tree, 0, 0, false);
+
+ // number of nodes in 4 bytes
+ put_bytes(fd, nodecount, 4); // <nodecount>
+ assert(nodecount + nodecount * sizeof(int) < INT_MAX);
+ spin->si_memtot += (int)(nodecount + nodecount * sizeof(int));
+
+ // Write the nodes.
+ (void)put_node(fd, tree, 0, 0, false);
+
+ // <SUGTABLE>: <sugwcount> <sugline> ...
+ linenr_T wcount = spin->si_spellbuf->b_ml.ml_line_count;
+ assert(wcount >= 0);
+ put_bytes(fd, (uintmax_t)wcount, 4); // <sugwcount>
+
+ for (linenr_T lnum = 1; lnum <= wcount; ++lnum) {
+ // <sugline>: <sugnr> ... NUL
+ char_u *line = ml_get_buf(spin->si_spellbuf, lnum, FALSE);
+ size_t len = STRLEN(line) + 1;
+ if (fwrite(line, len, 1, fd) == 0) {
+ EMSG(_(e_write));
+ goto theend;
+ }
+ assert((size_t)spin->si_memtot + len <= INT_MAX);
+ spin->si_memtot += (int)len;
+ }
+
+ // Write another byte to check for errors.
+ if (putc(0, fd) == EOF)
+ EMSG(_(e_write));
+
+ vim_snprintf((char *)IObuff, IOSIZE,
+ _("Estimated runtime memory use: %d bytes"), spin->si_memtot);
+ spell_message(spin, IObuff);
+
+theend:
+ // close the file
+ fclose(fd);
+}
+
+
+// Create a Vim spell file from one or more word lists.
+// "fnames[0]" is the output file name.
+// "fnames[fcount - 1]" is the last input file name.
+// Exception: when "fnames[0]" ends in ".add" it's used as the input file name
+// and ".spl" is appended to make the output file name.
+static void
+mkspell (
+ int fcount,
+ char_u **fnames,
+ bool ascii, // -ascii argument given
+ bool over_write, // overwrite existing output file
+ bool added_word // invoked through "zg"
+)
+{
+ char_u *fname = NULL;
+ char_u *wfname;
+ char_u **innames;
+ int incount;
+ afffile_T *(afile[MAXREGIONS]);
+ int i;
+ int len;
+ bool error = false;
+ spellinfo_T spin;
+
+ memset(&spin, 0, sizeof(spin));
+ spin.si_verbose = !added_word;
+ spin.si_ascii = ascii;
+ spin.si_followup = true;
+ spin.si_rem_accents = true;
+ ga_init(&spin.si_rep, (int)sizeof(fromto_T), 20);
+ ga_init(&spin.si_repsal, (int)sizeof(fromto_T), 20);
+ ga_init(&spin.si_sal, (int)sizeof(fromto_T), 20);
+ ga_init(&spin.si_map, (int)sizeof(char_u), 100);
+ ga_init(&spin.si_comppat, (int)sizeof(char_u *), 20);
+ ga_init(&spin.si_prefcond, (int)sizeof(char_u *), 50);
+ hash_init(&spin.si_commonwords);
+ spin.si_newcompID = 127; // start compound ID at first maximum
+
+ // default: fnames[0] is output file, following are input files
+ innames = &fnames[1];
+ incount = fcount - 1;
+
+ wfname = xmalloc(MAXPATHL);
+
+ if (fcount >= 1) {
+ len = (int)STRLEN(fnames[0]);
+ if (fcount == 1 && len > 4 && STRCMP(fnames[0] + len - 4, ".add") == 0) {
+ // For ":mkspell path/en.latin1.add" output file is
+ // "path/en.latin1.add.spl".
+ innames = &fnames[0];
+ incount = 1;
+ vim_snprintf((char *)wfname, MAXPATHL, "%s.spl", fnames[0]);
+ } else if (fcount == 1) {
+ // For ":mkspell path/vim" output file is "path/vim.latin1.spl".
+ innames = &fnames[0];
+ incount = 1;
+ vim_snprintf((char *)wfname, MAXPATHL, SPL_FNAME_TMPL,
+ fnames[0], spin.si_ascii ? (char_u *)"ascii" : spell_enc());
+ } else if (len > 4 && STRCMP(fnames[0] + len - 4, ".spl") == 0) {
+ // Name ends in ".spl", use as the file name.
+ STRLCPY(wfname, fnames[0], MAXPATHL);
+ } else
+ // Name should be language, make the file name from it.
+ vim_snprintf((char *)wfname, MAXPATHL, SPL_FNAME_TMPL,
+ fnames[0], spin.si_ascii ? (char_u *)"ascii" : spell_enc());
+
+ // Check for .ascii.spl.
+ if (strstr((char *)path_tail(wfname), SPL_FNAME_ASCII) != NULL)
+ spin.si_ascii = true;
+
+ // Check for .add.spl.
+ if (strstr((char *)path_tail(wfname), SPL_FNAME_ADD) != NULL)
+ spin.si_add = true;
+ }
+
+ if (incount <= 0) {
+ EMSG(_(e_invarg)); // need at least output and input names
+ } else if (vim_strchr(path_tail(wfname), '_') != NULL) {
+ EMSG(_("E751: Output file name must not have region name"));
+ } else if (incount > MAXREGIONS) {
+ emsgf(_("E754: Only up to %d regions supported"), MAXREGIONS);
+ } else {
+ // Check for overwriting before doing things that may take a lot of
+ // time.
+ if (!over_write && os_path_exists(wfname)) {
+ EMSG(_(e_exists));
+ goto theend;
+ }
+ if (os_isdir(wfname)) {
+ EMSG2(_(e_isadir2), wfname);
+ goto theend;
+ }
+
+ fname = xmalloc(MAXPATHL);
+
+ // Init the aff and dic pointers.
+ // Get the region names if there are more than 2 arguments.
+ for (i = 0; i < incount; ++i) {
+ afile[i] = NULL;
+
+ if (incount > 1) {
+ len = (int)STRLEN(innames[i]);
+ if (STRLEN(path_tail(innames[i])) < 5
+ || innames[i][len - 3] != '_') {
+ EMSG2(_("E755: Invalid region in %s"), innames[i]);
+ goto theend;
+ }
+ spin.si_region_name[i * 2] = TOLOWER_ASC(innames[i][len - 2]);
+ spin.si_region_name[i * 2 + 1] =
+ TOLOWER_ASC(innames[i][len - 1]);
+ }
+ }
+ spin.si_region_count = incount;
+
+ spin.si_foldroot = wordtree_alloc(&spin);
+ spin.si_keeproot = wordtree_alloc(&spin);
+ spin.si_prefroot = wordtree_alloc(&spin);
+
+ // When not producing a .add.spl file clear the character table when
+ // we encounter one in the .aff file. This means we dump the current
+ // one in the .spl file if the .aff file doesn't define one. That's
+ // better than guessing the contents, the table will match a
+ // previously loaded spell file.
+ if (!spin.si_add)
+ spin.si_clear_chartab = true;
+
+ // Read all the .aff and .dic files.
+ // Text is converted to 'encoding'.
+ // Words are stored in the case-folded and keep-case trees.
+ for (i = 0; i < incount && !error; ++i) {
+ spin.si_conv.vc_type = CONV_NONE;
+ spin.si_region = 1 << i;
+
+ vim_snprintf((char *)fname, MAXPATHL, "%s.aff", innames[i]);
+ if (os_path_exists(fname)) {
+ // Read the .aff file. Will init "spin->si_conv" based on the
+ // "SET" line.
+ afile[i] = spell_read_aff(&spin, fname);
+ if (afile[i] == NULL)
+ error = true;
+ else {
+ // Read the .dic file and store the words in the trees.
+ vim_snprintf((char *)fname, MAXPATHL, "%s.dic",
+ innames[i]);
+ if (spell_read_dic(&spin, fname, afile[i]) == FAIL)
+ error = true;
+ }
+ } else {
+ // No .aff file, try reading the file as a word list. Store
+ // the words in the trees.
+ if (spell_read_wordfile(&spin, innames[i]) == FAIL)
+ error = true;
+ }
+
+ // Free any conversion stuff.
+ convert_setup(&spin.si_conv, NULL, NULL);
+ }
+
+ if (spin.si_compflags != NULL && spin.si_nobreak)
+ MSG(_("Warning: both compounding and NOBREAK specified"));
+
+ if (!error && !got_int) {
+ // Combine tails in the tree.
+ spell_message(&spin, (char_u *)_(msg_compressing));
+ wordtree_compress(&spin, spin.si_foldroot);
+ wordtree_compress(&spin, spin.si_keeproot);
+ wordtree_compress(&spin, spin.si_prefroot);
+ }
+
+ if (!error && !got_int) {
+ // Write the info in the spell file.
+ vim_snprintf((char *)IObuff, IOSIZE,
+ _("Writing spell file %s..."), wfname);
+ spell_message(&spin, IObuff);
+
+ error = write_vim_spell(&spin, wfname) == FAIL;
+
+ spell_message(&spin, (char_u *)_("Done!"));
+ vim_snprintf((char *)IObuff, IOSIZE,
+ _("Estimated runtime memory use: %d bytes"), spin.si_memtot);
+ spell_message(&spin, IObuff);
+
+ // If the file is loaded need to reload it.
+ if (!error)
+ spell_reload_one(wfname, added_word);
+ }
+
+ // Free the allocated memory.
+ ga_clear(&spin.si_rep);
+ ga_clear(&spin.si_repsal);
+ ga_clear(&spin.si_sal);
+ ga_clear(&spin.si_map);
+ ga_clear(&spin.si_comppat);
+ ga_clear(&spin.si_prefcond);
+ hash_clear_all(&spin.si_commonwords, 0);
+
+ // Free the .aff file structures.
+ for (i = 0; i < incount; ++i)
+ if (afile[i] != NULL)
+ spell_free_aff(afile[i]);
+
+ // Free all the bits and pieces at once.
+ free_blocks(spin.si_blocks);
+
+ // If there is soundfolding info and no NOSUGFILE item create the
+ // .sug file with the soundfolded word trie.
+ if (spin.si_sugtime != 0 && !error && !got_int)
+ spell_make_sugfile(&spin, wfname);
+
+ }
+
+theend:
+ xfree(fname);
+ xfree(wfname);
+}
+
+// Display a message for spell file processing when 'verbose' is set or using
+// ":mkspell". "str" can be IObuff.
+static void spell_message(spellinfo_T *spin, char_u *str)
+{
+ if (spin->si_verbose || p_verbose > 2) {
+ if (!spin->si_verbose)
+ verbose_enter();
+ MSG(str);
+ ui_flush();
+ if (!spin->si_verbose)
+ verbose_leave();
+ }
+}
+
+// ":[count]spellgood {word}"
+// ":[count]spellwrong {word}"
+// ":[count]spellundo {word}"
+void ex_spell(exarg_T *eap)
+{
+ spell_add_word(eap->arg, (int)STRLEN(eap->arg), eap->cmdidx == CMD_spellwrong,
+ eap->forceit ? 0 : (int)eap->line2,
+ eap->cmdidx == CMD_spellundo);
+}
+
+// Add "word[len]" to 'spellfile' as a good or bad word.
+void
+spell_add_word (
+ char_u *word,
+ int len,
+ int bad,
+ int idx, // "zG" and "zW": zero, otherwise index in
+ // 'spellfile'
+ bool undo // true for "zug", "zuG", "zuw" and "zuW"
+)
+{
+ FILE *fd = NULL;
+ buf_T *buf = NULL;
+ bool new_spf = false;
+ char_u *fname;
+ char_u *fnamebuf = NULL;
+ char_u line[MAXWLEN * 2];
+ long fpos, fpos_next = 0;
+ int i;
+ char_u *spf;
+
+ if (idx == 0) { // use internal wordlist
+ if (int_wordlist == NULL) {
+ int_wordlist = vim_tempname();
+ if (int_wordlist == NULL)
+ return;
+ }
+ fname = int_wordlist;
+ } else {
+ // If 'spellfile' isn't set figure out a good default value.
+ if (*curwin->w_s->b_p_spf == NUL) {
+ init_spellfile();
+ new_spf = true;
+ }
+
+ if (*curwin->w_s->b_p_spf == NUL) {
+ EMSG2(_(e_notset), "spellfile");
+ return;
+ }
+ fnamebuf = xmalloc(MAXPATHL);
+
+ for (spf = curwin->w_s->b_p_spf, i = 1; *spf != NUL; ++i) {
+ copy_option_part(&spf, fnamebuf, MAXPATHL, ",");
+ if (i == idx)
+ break;
+ if (*spf == NUL) {
+ EMSGN(_("E765: 'spellfile' does not have %" PRId64 " entries"), idx);
+ xfree(fnamebuf);
+ return;
+ }
+ }
+
+ // Check that the user isn't editing the .add file somewhere.
+ buf = buflist_findname_exp(fnamebuf);
+ if (buf != NULL && buf->b_ml.ml_mfp == NULL)
+ buf = NULL;
+ if (buf != NULL && bufIsChanged(buf)) {
+ EMSG(_(e_bufloaded));
+ xfree(fnamebuf);
+ return;
+ }
+
+ fname = fnamebuf;
+ }
+
+ if (bad || undo) {
+ // When the word appears as good word we need to remove that one,
+ // since its flags sort before the one with WF_BANNED.
+ fd = mch_fopen((char *)fname, "r");
+ if (fd != NULL) {
+ while (!vim_fgets(line, MAXWLEN * 2, fd)) {
+ fpos = fpos_next;
+ fpos_next = ftell(fd);
+ if (STRNCMP(word, line, len) == 0
+ && (line[len] == '/' || line[len] < ' ')) {
+ // Found duplicate word. Remove it by writing a '#' at
+ // the start of the line. Mixing reading and writing
+ // doesn't work for all systems, close the file first.
+ fclose(fd);
+ fd = mch_fopen((char *)fname, "r+");
+ if (fd == NULL) {
+ break;
+ }
+ if (fseek(fd, fpos, SEEK_SET) == 0) {
+ fputc('#', fd);
+ if (undo) {
+ home_replace(NULL, fname, NameBuff, MAXPATHL, TRUE);
+ smsg(_("Word '%.*s' removed from %s"),
+ len, word, NameBuff);
+ }
+ }
+ if (fseek(fd, fpos_next, SEEK_SET) <= 0) {
+ break;
+ }
+ }
+ }
+ if (fd != NULL)
+ fclose(fd);
+ }
+ }
+
+ if (!undo) {
+ fd = mch_fopen((char *)fname, "a");
+ if (fd == NULL && new_spf) {
+ char_u *p;
+
+ // We just initialized the 'spellfile' option and can't open the
+ // file. We may need to create the "spell" directory first. We
+ // already checked the runtime directory is writable in
+ // init_spellfile().
+ if (!dir_of_file_exists(fname) && (p = path_tail_with_sep(fname)) != fname) {
+ int c = *p;
+
+ // The directory doesn't exist. Try creating it and opening
+ // the file again.
+ *p = NUL;
+ os_mkdir((char *)fname, 0755);
+ *p = c;
+ fd = mch_fopen((char *)fname, "a");
+ }
+ }
+
+ if (fd == NULL)
+ EMSG2(_(e_notopen), fname);
+ else {
+ if (bad)
+ fprintf(fd, "%.*s/!\n", len, word);
+ else
+ fprintf(fd, "%.*s\n", len, word);
+ fclose(fd);
+
+ home_replace(NULL, fname, NameBuff, MAXPATHL, TRUE);
+ smsg(_("Word '%.*s' added to %s"), len, word, NameBuff);
+ }
+ }
+
+ if (fd != NULL) {
+ // Update the .add.spl file.
+ mkspell(1, &fname, false, true, true);
+
+ // If the .add file is edited somewhere, reload it.
+ if (buf != NULL)
+ buf_reload(buf, buf->b_orig_mode);
+
+ redraw_all_later(SOME_VALID);
+ }
+ xfree(fnamebuf);
+}
+
+// Initialize 'spellfile' for the current buffer.
+static void init_spellfile(void)
+{
+ char_u *buf;
+ int l;
+ char_u *fname;
+ char_u *rtp;
+ char_u *lend;
+ bool aspath = false;
+ char_u *lstart = curbuf->b_s.b_p_spl;
+
+ if (*curwin->w_s->b_p_spl != NUL && !GA_EMPTY(&curwin->w_s->b_langp)) {
+ buf = xmalloc(MAXPATHL);
+
+ // Find the end of the language name. Exclude the region. If there
+ // is a path separator remember the start of the tail.
+ for (lend = curwin->w_s->b_p_spl; *lend != NUL
+ && vim_strchr((char_u *)",._", *lend) == NULL; ++lend)
+ if (vim_ispathsep(*lend)) {
+ aspath = true;
+ lstart = lend + 1;
+ }
+
+ // Loop over all entries in 'runtimepath'. Use the first one where we
+ // are allowed to write.
+ rtp = p_rtp;
+ while (*rtp != NUL) {
+ if (aspath)
+ // Use directory of an entry with path, e.g., for
+ // "/dir/lg.utf-8.spl" use "/dir".
+ STRLCPY(buf, curbuf->b_s.b_p_spl,
+ lstart - curbuf->b_s.b_p_spl);
+ else
+ // Copy the path from 'runtimepath' to buf[].
+ copy_option_part(&rtp, buf, MAXPATHL, ",");
+ if (os_file_is_writable((char *)buf) == 2) {
+ // Use the first language name from 'spelllang' and the
+ // encoding used in the first loaded .spl file.
+ if (aspath)
+ STRLCPY(buf, curbuf->b_s.b_p_spl,
+ lend - curbuf->b_s.b_p_spl + 1);
+ else {
+ // Create the "spell" directory if it doesn't exist yet.
+ l = (int)STRLEN(buf);
+ vim_snprintf((char *)buf + l, MAXPATHL - l, "/spell");
+ if (os_file_is_writable((char *)buf) != 2) {
+ os_mkdir((char *)buf, 0755);
+ }
+
+ l = (int)STRLEN(buf);
+ vim_snprintf((char *)buf + l, MAXPATHL - l,
+ "/%.*s", (int)(lend - lstart), lstart);
+ }
+ l = (int)STRLEN(buf);
+ fname = LANGP_ENTRY(curwin->w_s->b_langp, 0)
+ ->lp_slang->sl_fname;
+ vim_snprintf((char *)buf + l, MAXPATHL - l, ".%s.add",
+ ((fname != NULL
+ && strstr((char *)path_tail(fname), ".ascii.") != NULL)
+ ? "ascii"
+ : (const char *)spell_enc()));
+ set_option_value("spellfile", 0L, (const char *)buf, OPT_LOCAL);
+ break;
+ }
+ aspath = false;
+ }
+
+ xfree(buf);
+ }
+}
+
+// Set the spell character tables from strings in the affix file.
+static int set_spell_chartab(char_u *fol, char_u *low, char_u *upp)
+{
+ // We build the new tables here first, so that we can compare with the
+ // previous one.
+ spelltab_T new_st;
+ char_u *pf = fol, *pl = low, *pu = upp;
+ int f, l, u;
+
+ clear_spell_chartab(&new_st);
+
+ while (*pf != NUL) {
+ if (*pl == NUL || *pu == NUL) {
+ EMSG(_(e_affform));
+ return FAIL;
+ }
+ f = mb_ptr2char_adv((const char_u **)&pf);
+ l = mb_ptr2char_adv((const char_u **)&pl);
+ u = mb_ptr2char_adv((const char_u **)&pu);
+ // Every character that appears is a word character.
+ if (f < 256)
+ new_st.st_isw[f] = true;
+ if (l < 256)
+ new_st.st_isw[l] = true;
+ if (u < 256)
+ new_st.st_isw[u] = true;
+
+ // if "LOW" and "FOL" are not the same the "LOW" char needs
+ // case-folding
+ if (l < 256 && l != f) {
+ if (f >= 256) {
+ EMSG(_(e_affrange));
+ return FAIL;
+ }
+ new_st.st_fold[l] = f;
+ }
+
+ // if "UPP" and "FOL" are not the same the "UPP" char needs
+ // case-folding, it's upper case and the "UPP" is the upper case of
+ // "FOL" .
+ if (u < 256 && u != f) {
+ if (f >= 256) {
+ EMSG(_(e_affrange));
+ return FAIL;
+ }
+ new_st.st_fold[u] = f;
+ new_st.st_isu[u] = true;
+ new_st.st_upper[f] = u;
+ }
+ }
+
+ if (*pl != NUL || *pu != NUL) {
+ EMSG(_(e_affform));
+ return FAIL;
+ }
+
+ return set_spell_finish(&new_st);
+}
+
+// Set the spell character tables from strings in the .spl file.
+static void
+set_spell_charflags (
+ char_u *flags,
+ int cnt, // length of "flags"
+ char_u *fol
+)
+{
+ // We build the new tables here first, so that we can compare with the
+ // previous one.
+ spelltab_T new_st;
+ int i;
+ char_u *p = fol;
+ int c;
+
+ clear_spell_chartab(&new_st);
+
+ for (i = 0; i < 128; ++i) {
+ if (i < cnt) {
+ new_st.st_isw[i + 128] = (flags[i] & CF_WORD) != 0;
+ new_st.st_isu[i + 128] = (flags[i] & CF_UPPER) != 0;
+ }
+
+ if (*p != NUL) {
+ c = mb_ptr2char_adv((const char_u **)&p);
+ new_st.st_fold[i + 128] = c;
+ if (i + 128 != c && new_st.st_isu[i + 128] && c < 256)
+ new_st.st_upper[c] = i + 128;
+ }
+ }
+
+ (void)set_spell_finish(&new_st);
+}
+
+static int set_spell_finish(spelltab_T *new_st)
+{
+ int i;
+
+ if (did_set_spelltab) {
+ // check that it's the same table
+ for (i = 0; i < 256; ++i) {
+ if (spelltab.st_isw[i] != new_st->st_isw[i]
+ || spelltab.st_isu[i] != new_st->st_isu[i]
+ || spelltab.st_fold[i] != new_st->st_fold[i]
+ || spelltab.st_upper[i] != new_st->st_upper[i]) {
+ EMSG(_("E763: Word characters differ between spell files"));
+ return FAIL;
+ }
+ }
+ } else {
+ // copy the new spelltab into the one being used
+ spelltab = *new_st;
+ did_set_spelltab = true;
+ }
+
+ return OK;
+}
+
+// Write the table with prefix conditions to the .spl file.
+// When "fd" is NULL only count the length of what is written.
+static int write_spell_prefcond(FILE *fd, garray_T *gap)
+{
+ assert(gap->ga_len >= 0);
+
+ if (fd != NULL)
+ put_bytes(fd, (uintmax_t)gap->ga_len, 2); // <prefcondcnt>
+
+ size_t totlen = 2 + (size_t)gap->ga_len; // <prefcondcnt> and <condlen> bytes
+ size_t x = 1; // collect return value of fwrite()
+ for (int i = 0; i < gap->ga_len; ++i) {
+ // <prefcond> : <condlen> <condstr>
+ char_u *p = ((char_u **)gap->ga_data)[i];
+ if (p != NULL) {
+ size_t len = STRLEN(p);
+ if (fd != NULL) {
+ assert(len <= INT_MAX);
+ fputc((int)len, fd);
+ x &= fwrite(p, len, 1, fd);
+ }
+ totlen += len;
+ } else if (fd != NULL)
+ fputc(0, fd);
+ }
+
+ assert(totlen <= INT_MAX);
+ return (int)totlen;
+}
+
+// Use map string "map" for languages "lp".
+static void set_map_str(slang_T *lp, char_u *map)
+{
+ char_u *p;
+ int headc = 0;
+ int c;
+ int i;
+
+ if (*map == NUL) {
+ lp->sl_has_map = false;
+ return;
+ }
+ lp->sl_has_map = true;
+
+ // Init the array and hash tables empty.
+ for (i = 0; i < 256; ++i)
+ lp->sl_map_array[i] = 0;
+ hash_init(&lp->sl_map_hash);
+
+ // The similar characters are stored separated with slashes:
+ // "aaa/bbb/ccc/". Fill sl_map_array[c] with the character before c and
+ // before the same slash. For characters above 255 sl_map_hash is used.
+ for (p = map; *p != NUL; ) {
+ c = mb_cptr2char_adv((const char_u **)&p);
+ if (c == '/') {
+ headc = 0;
+ } else {
+ if (headc == 0) {
+ headc = c;
+ }
+
+ // Characters above 255 don't fit in sl_map_array[], put them in
+ // the hash table. Each entry is the char, a NUL the headchar and
+ // a NUL.
+ if (c >= 256) {
+ int cl = mb_char2len(c);
+ int headcl = mb_char2len(headc);
+ char_u *b;
+ hash_T hash;
+ hashitem_T *hi;
+
+ b = xmalloc(cl + headcl + 2);
+ utf_char2bytes(c, b);
+ b[cl] = NUL;
+ utf_char2bytes(headc, b + cl + 1);
+ b[cl + 1 + headcl] = NUL;
+ hash = hash_hash(b);
+ hi = hash_lookup(&lp->sl_map_hash, (const char *)b, STRLEN(b), hash);
+ if (HASHITEM_EMPTY(hi)) {
+ hash_add_item(&lp->sl_map_hash, hi, b, hash);
+ } else {
+ // This should have been checked when generating the .spl
+ // file.
+ EMSG(_("E783: duplicate char in MAP entry"));
+ xfree(b);
+ }
+ } else
+ lp->sl_map_array[c] = headc;
+ }
+ }
+}
+
diff --git a/src/nvim/spellfile.h b/src/nvim/spellfile.h
new file mode 100644
index 0000000000..633ee014a7
--- /dev/null
+++ b/src/nvim/spellfile.h
@@ -0,0 +1,13 @@
+#ifndef NVIM_SPELLFILE_H
+#define NVIM_SPELLFILE_H
+
+#include <stdbool.h>
+
+#include "nvim/spell_defs.h"
+#include "nvim/types.h"
+#include "nvim/ex_cmds_defs.h"
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "spellfile.h.generated.h"
+#endif
+#endif // NVIM_SPELLFILE_H
diff --git a/src/nvim/state.c b/src/nvim/state.c
index 30133e2201..bfd73050c3 100644
--- a/src/nvim/state.c
+++ b/src/nvim/state.c
@@ -1,13 +1,21 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include "nvim/lib/kvec.h"
+#include "nvim/ascii.h"
+#include "nvim/log.h"
#include "nvim/state.h"
#include "nvim/vim.h"
#include "nvim/main.h"
#include "nvim/getchar.h"
+#include "nvim/option_defs.h"
#include "nvim/ui.h"
#include "nvim/os/input.h"
+#include "nvim/ex_docmd.h"
+#include "nvim/edit.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "state.c.generated.h"
@@ -20,10 +28,11 @@ void state_enter(VimState *s)
int check_result = s->check ? s->check(s) : 1;
if (!check_result) {
- break;
+ break; // Terminate this state.
} else if (check_result == -1) {
- continue;
+ continue; // check() again.
}
+ // Execute this state.
int key;
@@ -33,8 +42,8 @@ getkey:
// processing. Characters can come from mappings, scripts and other
// sources, so this scenario is very common.
key = safe_vgetc();
- } else if (!queue_empty(main_loop.events)) {
- // Event was made available after the last queue_process_events call
+ } else if (!multiqueue_empty(main_loop.events)) {
+ // Event was made available after the last multiqueue_process_events call
key = K_EVENT;
} else {
input_enable_events();
@@ -42,17 +51,25 @@ getkey:
ui_flush();
// Call `os_inchar` directly to block for events or user input without
// consuming anything from `input_buffer`(os/input.c) or calling the
- // mapping engine. If an event was put into the queue, we send K_EVENT
- // directly.
+ // mapping engine.
(void)os_inchar(NULL, 0, -1, 0);
input_disable_events();
- key = !queue_empty(main_loop.events) ? K_EVENT : safe_vgetc();
+ // If an event was put into the queue, we send K_EVENT directly.
+ key = !multiqueue_empty(main_loop.events)
+ ? K_EVENT
+ : safe_vgetc();
}
if (key == K_EVENT) {
may_sync_undo();
}
+#if MIN_LOG_LEVEL <= DEBUG_LOG_LEVEL
+ char *keyname = key == K_EVENT
+ ? "K_EVENT" : (char *)get_special_key_name(key, mod_mask);
+ DLOG("input: %s", keyname);
+#endif
+
int execute_result = s->execute(s, key);
if (!execute_result) {
break;
@@ -61,3 +78,92 @@ getkey:
}
}
}
+
+/// Return true if in the current mode we need to use virtual.
+bool virtual_active(void)
+{
+ // While an operator is being executed we return "virtual_op", because
+ // VIsual_active has already been reset, thus we can't check for "block"
+ // being used.
+ if (virtual_op != kNone) {
+ return virtual_op;
+ }
+ return ve_flags == VE_ALL
+ || ((ve_flags & VE_BLOCK) && VIsual_active && VIsual_mode == Ctrl_V)
+ || ((ve_flags & VE_INSERT) && (State & INSERT));
+}
+
+/// VISUAL, SELECTMODE and OP_PENDING State are never set, they are equal to
+/// NORMAL State with a condition. This function returns the real State.
+int get_real_state(void)
+{
+ if (State & NORMAL) {
+ if (VIsual_active) {
+ if (VIsual_select) {
+ return SELECTMODE;
+ }
+ return VISUAL;
+ } else if (finish_op) {
+ return OP_PENDING;
+ }
+ }
+ return State;
+}
+
+/// @returns[allocated] mode string
+char *get_mode(void)
+{
+ char *buf = xcalloc(4, sizeof(char));
+
+ if (VIsual_active) {
+ if (VIsual_select) {
+ buf[0] = (char)(VIsual_mode + 's' - 'v');
+ } else {
+ buf[0] = (char)VIsual_mode;
+ }
+ } else if (State == HITRETURN || State == ASKMORE || State == SETWSIZE
+ || State == CONFIRM) {
+ buf[0] = 'r';
+ if (State == ASKMORE) {
+ buf[1] = 'm';
+ } else if (State == CONFIRM) {
+ buf[1] = '?';
+ }
+ } else if (State == EXTERNCMD) {
+ buf[0] = '!';
+ } else if (State & INSERT) {
+ if (State & VREPLACE_FLAG) {
+ buf[0] = 'R';
+ buf[1] = 'v';
+ } else {
+ if (State & REPLACE_FLAG) {
+ buf[0] = 'R';
+ } else {
+ buf[0] = 'i';
+ }
+ if (ins_compl_active()) {
+ buf[1] = 'c';
+ } else if (ctrl_x_mode == 1) {
+ buf[1] = 'x';
+ }
+ }
+ } else if ((State & CMDLINE) || exmode_active) {
+ buf[0] = 'c';
+ if (exmode_active == EXMODE_VIM) {
+ buf[1] = 'v';
+ } else if (exmode_active == EXMODE_NORMAL) {
+ buf[1] = 'e';
+ }
+ } else if (State & TERM_FOCUS) {
+ buf[0] = 't';
+ } else {
+ buf[0] = 'n';
+ if (finish_op) {
+ buf[1] = 'o';
+ // to be able to detect force-linewise/blockwise/characterwise operations
+ buf[2] = (char)motion_force;
+ }
+ }
+
+ return buf;
+}
diff --git a/src/nvim/strings.c b/src/nvim/strings.c
index 37a0fb82da..4921824316 100644
--- a/src/nvim/strings.c
+++ b/src/nvim/strings.c
@@ -1,11 +1,17 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <inttypes.h>
+#include <stdarg.h>
#include <stdbool.h>
#include <string.h>
+#include <math.h>
+#include <assert.h>
+#include "nvim/assert.h"
#include "nvim/vim.h"
#include "nvim/ascii.h"
#include "nvim/strings.h"
-#include "nvim/misc2.h"
#include "nvim/file_search.h"
#include "nvim/buffer.h"
#include "nvim/charset.h"
@@ -42,6 +48,14 @@
#include "nvim/window.h"
#include "nvim/os/os.h"
#include "nvim/os/shell.h"
+#include "nvim/eval/encode.h"
+
+#ifdef __MINGW32__
+# undef fpclassify
+# define fpclassify __fpclassify
+# undef isnan
+# define isnan _isnan
+#endif
/*
* Copy "string" into newly allocated memory.
@@ -52,15 +66,14 @@ char_u *vim_strsave(const char_u *string)
return (char_u *)xstrdup((char *)string);
}
-/*
- * Copy up to "len" bytes of "string" into newly allocated memory and
- * terminate with a NUL.
- * The allocated memory always has size "len + 1", also when "string" is
- * shorter.
- */
+/// Copy up to `len` bytes of `string` into newly allocated memory and
+/// terminate with a NUL. The allocated memory always has size `len + 1`, even
+/// when `string` is shorter.
char_u *vim_strnsave(const char_u *string, size_t len)
FUNC_ATTR_NONNULL_RET FUNC_ATTR_MALLOC FUNC_ATTR_NONNULL_ALL
{
+ // strncpy is intentional: some parts of Vim use `string` shorter than `len`
+ // and expect the remainder to be zeroed out.
return (char_u *)strncpy(xmallocz(len), (char *)string, len);
}
@@ -194,9 +207,17 @@ char_u *vim_strsave_shellescape(const char_u *string,
/* First count the number of extra bytes required. */
size_t length = STRLEN(string) + 3; // two quotes and a trailing NUL
- for (const char_u *p = string; *p != NUL; mb_ptr_adv(p)) {
- if (*p == '\'')
- length += 3; /* ' => '\'' */
+ for (const char_u *p = string; *p != NUL; MB_PTR_ADV(p)) {
+#ifdef WIN32
+ if (!p_ssl) {
+ if (*p == '"') {
+ length++; // " -> ""
+ }
+ } else
+#endif
+ if (*p == '\'') {
+ length += 3; // ' => '\''
+ }
if ((*p == '\n' && (csh_like || do_newline))
|| (*p == '!' && (csh_like || do_special))) {
++length; /* insert backslash */
@@ -213,10 +234,25 @@ char_u *vim_strsave_shellescape(const char_u *string,
escaped_string = xmalloc(length);
d = escaped_string;
- /* add opening quote */
+ // add opening quote
+#ifdef WIN32
+ if (!p_ssl) {
+ *d++ = '"';
+ } else
+#endif
*d++ = '\'';
for (const char_u *p = string; *p != NUL; ) {
+#ifdef WIN32
+ if (!p_ssl) {
+ if (*p == '"') {
+ *d++ = '"';
+ *d++ = '"';
+ p++;
+ continue;
+ }
+ } else
+#endif
if (*p == '\'') {
*d++ = '\'';
*d++ = '\\';
@@ -243,7 +279,12 @@ char_u *vim_strsave_shellescape(const char_u *string,
MB_COPY_CHAR(p, d);
}
- /* add terminating quote and finish with a NUL */
+ // add terminating quote and finish with a NUL
+# ifdef WIN32
+ if (!p_ssl) {
+ *d++ = '"';
+ } else
+# endif
*d++ = '\'';
*d = NUL;
@@ -288,45 +329,45 @@ void vim_strup(char_u *p)
}
}
-/*
- * Make string "s" all upper-case and return it in allocated memory.
- * Handles multi-byte characters as well as possible.
- */
-char_u *strup_save(const char_u *orig)
+/// Make given string all upper-case or all lower-case
+///
+/// Handles multi-byte characters as good as possible.
+///
+/// @param[in] orig Input string.
+/// @param[in] upper If true make uppercase, otherwise lowercase
+///
+/// @return [allocated] upper-cased string.
+char *strcase_save(const char *const orig, bool upper)
FUNC_ATTR_NONNULL_RET FUNC_ATTR_MALLOC FUNC_ATTR_NONNULL_ALL
{
- char_u *res = vim_strsave(orig);
+ char *res = xstrdup(orig);
- char_u *p = res;
+ char *p = res;
while (*p != NUL) {
- int l;
-
- if (enc_utf8) {
- int c = utf_ptr2char(p);
- int uc = utf_toupper(c);
-
- /* Reallocate string when byte count changes. This is rare,
- * thus it's OK to do another malloc()/free(). */
- l = utf_ptr2len(p);
- int newl = utf_char2len(uc);
- if (newl != l) {
- // TODO(philix): use xrealloc() in strup_save()
- char_u *s = xmalloc(STRLEN(res) + (size_t)(1 + newl - l));
- memcpy(s, res, (size_t)(p - res));
- STRCPY(s + (p - res) + newl, p + l);
- p = s + (p - res);
- xfree(res);
- res = s;
- }
+ int c = utf_ptr2char((const char_u *)p);
+ int l = utf_ptr2len((const char_u *)p);
+ if (c == 0) {
+ // overlong sequence, use only the first byte
+ c = *p;
+ l = 1;
+ }
+ int uc = upper ? mb_toupper(c) : mb_tolower(c);
- utf_char2bytes(uc, p);
- p += newl;
- } else if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
- p += l; /* skip multi-byte character */
- else {
- *p = (char_u) TOUPPER_LOC(*p); // note that toupper() can be a macro
- p++;
+ // Reallocate string when byte count changes. This is rare,
+ // thus it's OK to do another malloc()/free().
+ int newl = utf_char2len(uc);
+ if (newl != l) {
+ // TODO(philix): use xrealloc() in strup_save()
+ char *s = xmalloc(STRLEN(res) + (size_t)(1 + newl - l));
+ memcpy(s, res, (size_t)(p - res));
+ STRCPY(s + (p - res) + newl, p + l);
+ p = s + (p - res);
+ xfree(res);
+ res = s;
}
+
+ utf_char2bytes(uc, (char_u *)p);
+ p += newl;
}
return res;
@@ -345,24 +386,6 @@ void del_trailing_spaces(char_u *ptr)
*q = NUL;
}
-/*
- * Like strcat(), but make sure the result fits in "tosize" bytes and is
- * always NUL terminated.
- */
-void vim_strcat(char_u *restrict to, const char_u *restrict from,
- size_t tosize)
- FUNC_ATTR_NONNULL_ALL
-{
- size_t tolen = STRLEN(to);
- size_t fromlen = STRLEN(from);
-
- if (tolen + fromlen + 1 > tosize) {
- memcpy(to + tolen, from, tosize - tolen - 1);
- to[tosize - 1] = NUL;
- } else
- STRCPY(to + tolen, from);
-}
-
#if (!defined(HAVE_STRCASECMP) && !defined(HAVE_STRICMP))
/*
* Compare two strings, ignoring case, using current locale.
@@ -412,91 +435,27 @@ int vim_strnicmp(const char *s1, const char *s2, size_t len)
}
#endif
-/*
- * Version of strchr() and strrchr() that handle unsigned char strings
- * with characters from 128 to 255 correctly. It also doesn't return a
- * pointer to the NUL at the end of the string.
- */
-char_u *vim_strchr(const char_u *string, int c)
- FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE
+/// strchr() version which handles multibyte strings
+///
+/// @param[in] string String to search in.
+/// @param[in] c Character to search for.
+///
+/// @return Pointer to the first byte of the found character in string or NULL
+/// if it was not found or character is invalid. NUL character is never
+/// found, use `strlen()` instead.
+char_u *vim_strchr(const char_u *const string, const int c)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
- int b;
-
- const char_u *p = string;
- if (enc_utf8 && c >= 0x80) {
- while (*p != NUL) {
- int l = (*mb_ptr2len)(p);
-
- // Avoid matching an illegal byte here.
- if (l > 1 && utf_ptr2char(p) == c) {
- return (char_u *) p;
- }
- p += l;
- }
- return NULL;
- }
- if (enc_dbcs != 0 && c > 255) {
- int n2 = c & 0xff;
-
- c = ((unsigned)c >> 8) & 0xff;
- while ((b = *p) != NUL) {
- if (b == c && p[1] == n2)
- return (char_u *) p;
- p += (*mb_ptr2len)(p);
- }
- return NULL;
- }
- if (has_mbyte) {
- while ((b = *p) != NUL) {
- if (b == c)
- return (char_u *) p;
- p += (*mb_ptr2len)(p);
- }
+ if (c <= 0) {
return NULL;
+ } else if (c < 0x80) {
+ return (char_u *)strchr((const char *)string, c);
+ } else {
+ char u8char[MB_MAXBYTES + 1];
+ const int len = utf_char2bytes(c, (char_u *)u8char);
+ u8char[len] = NUL;
+ return (char_u *)strstr((const char *)string, u8char);
}
- while ((b = *p) != NUL) {
- if (b == c)
- return (char_u *) p;
- ++p;
- }
- return NULL;
-}
-
-/*
- * Version of strchr() that only works for bytes and handles unsigned char
- * strings with characters above 128 correctly. It also doesn't return a
- * pointer to the NUL at the end of the string.
- */
-char_u *vim_strbyte(const char_u *string, int c)
- FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE
-{
- const char_u *p = string;
-
- while (*p != NUL) {
- if (*p == c)
- return (char_u *) p;
- ++p;
- }
- return NULL;
-}
-
-/*
- * Search for last occurrence of "c" in "string".
- * Return NULL if not found.
- * Does not handle multi-byte char for "c"!
- */
-char_u *vim_strrchr(const char_u *string, int c)
- FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE
-{
- const char_u *retval = NULL;
- const char_u *p = string;
-
- while (*p) {
- if (*p == c)
- retval = p;
- mb_ptr_adv(p);
- }
- return (char_u *) retval;
}
/*
@@ -561,3 +520,913 @@ char_u *concat_str(const char_u *restrict str1, const char_u *restrict str2)
return dest;
}
+
+static const char *const e_printf =
+ N_("E766: Insufficient arguments for printf()");
+
+/// Get number argument from idxp entry in tvs
+///
+/// Will give an error message for VimL entry with invalid type or for
+/// insufficient entries.
+///
+/// @param[in] tvs List of VimL values. List is terminated by VAR_UNKNOWN
+/// value.
+/// @param[in,out] idxp Index in a list. Will be incremented. Indexing starts
+/// at 1.
+///
+/// @return Number value or 0 in case of error.
+static varnumber_T tv_nr(typval_T *tvs, int *idxp)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ int idx = *idxp - 1;
+ varnumber_T n = 0;
+
+ if (tvs[idx].v_type == VAR_UNKNOWN) {
+ EMSG(_(e_printf));
+ } else {
+ (*idxp)++;
+ bool err = false;
+ n = tv_get_number_chk(&tvs[idx], &err);
+ if (err) {
+ n = 0;
+ }
+ }
+ return n;
+}
+
+/// Get string argument from idxp entry in tvs
+///
+/// Will give an error message for VimL entry with invalid type or for
+/// insufficient entries.
+///
+/// @param[in] tvs List of VimL values. List is terminated by VAR_UNKNOWN
+/// value.
+/// @param[in,out] idxp Index in a list. Will be incremented.
+/// @param[out] tofree If the idxp entry in tvs is not a String or a Number,
+/// it will be converted to String in the same format
+/// as ":echo" and stored in "*tofree". The caller must
+/// free "*tofree".
+///
+/// @return String value or NULL in case of error.
+static const char *tv_str(typval_T *tvs, int *idxp, char **const tofree)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ int idx = *idxp - 1;
+ const char *s = NULL;
+
+ if (tvs[idx].v_type == VAR_UNKNOWN) {
+ EMSG(_(e_printf));
+ } else {
+ (*idxp)++;
+ if (tvs[idx].v_type == VAR_STRING || tvs[idx].v_type == VAR_NUMBER) {
+ s = tv_get_string_chk(&tvs[idx]);
+ *tofree = NULL;
+ } else {
+ s = *tofree = encode_tv2echo(&tvs[idx], NULL);
+ }
+ }
+ return s;
+}
+
+/// Get pointer argument from the next entry in tvs
+///
+/// Will give an error message for VimL entry with invalid type or for
+/// insufficient entries.
+///
+/// @param[in] tvs List of typval_T values.
+/// @param[in,out] idxp Pointer to the index of the current value.
+///
+/// @return Pointer stored in typval_T or NULL.
+static const void *tv_ptr(const typval_T *const tvs, int *const idxp)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+#define OFF(attr) offsetof(union typval_vval_union, attr)
+ STATIC_ASSERT(
+ OFF(v_string) == OFF(v_list)
+ && OFF(v_string) == OFF(v_dict)
+ && OFF(v_string) == OFF(v_partial)
+ && sizeof(tvs[0].vval.v_string) == sizeof(tvs[0].vval.v_list)
+ && sizeof(tvs[0].vval.v_string) == sizeof(tvs[0].vval.v_dict)
+ && sizeof(tvs[0].vval.v_string) == sizeof(tvs[0].vval.v_partial),
+ "Strings, dictionaries, lists and partials are expected to be pointers, "
+ "so that all three of them can be accessed via v_string");
+#undef OFF
+ const int idx = *idxp - 1;
+ if (tvs[idx].v_type == VAR_UNKNOWN) {
+ EMSG(_(e_printf));
+ return NULL;
+ } else {
+ (*idxp)++;
+ return tvs[idx].vval.v_string;
+ }
+}
+
+/// Get float argument from idxp entry in tvs
+///
+/// Will give an error message for VimL entry with invalid type or for
+/// insufficient entries.
+///
+/// @param[in] tvs List of VimL values. List is terminated by VAR_UNKNOWN
+/// value.
+/// @param[in,out] idxp Index in a list. Will be incremented.
+///
+/// @return Floating-point value or zero in case of error.
+static float_T tv_float(typval_T *const tvs, int *const idxp)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ int idx = *idxp - 1;
+ float_T f = 0;
+
+ if (tvs[idx].v_type == VAR_UNKNOWN) {
+ EMSG(_(e_printf));
+ } else {
+ (*idxp)++;
+ if (tvs[idx].v_type == VAR_FLOAT) {
+ f = tvs[idx].vval.v_float;
+ } else if (tvs[idx].v_type == VAR_NUMBER) {
+ f = (float_T)tvs[idx].vval.v_number;
+ } else {
+ EMSG(_("E807: Expected Float argument for printf()"));
+ }
+ }
+ return f;
+}
+
+// This code was included to provide a portable vsnprintf() and snprintf().
+// Some systems may provide their own, but we always use this one for
+// consistency.
+//
+// This code is based on snprintf.c - a portable implementation of snprintf
+// by Mark Martinec <mark.martinec@ijs.si>, Version 2.2, 2000-10-06.
+// Included with permission. It was heavily modified to fit in Vim.
+// The original code, including useful comments, can be found here:
+//
+// http://www.ijs.si/software/snprintf/
+//
+// This snprintf() only supports the following conversion specifiers:
+// s, c, b, B, d, u, o, x, X, p (and synonyms: i, D, U, O - see below)
+// with flags: '-', '+', ' ', '0' and '#'.
+// An asterisk is supported for field width as well as precision.
+//
+// Limited support for floating point was added: 'f', 'e', 'E', 'g', 'G'.
+//
+// Length modifiers 'h' (short int), 'l' (long int) and "ll" (long long int) are
+// supported.
+//
+// The locale is not used, the string is used as a byte string. This is only
+// relevant for double-byte encodings where the second byte may be '%'.
+//
+// It is permitted for "str_m" to be zero, and it is permitted to specify NULL
+// pointer for resulting string argument if "str_m" is zero (as per ISO C99).
+//
+// The return value is the number of characters which would be generated
+// for the given input, excluding the trailing NUL. If this value
+// is greater or equal to "str_m", not all characters from the result
+// have been stored in str, output bytes beyond the ("str_m"-1) -th character
+// are discarded. If "str_m" is greater than zero it is guaranteed
+// the resulting string will be NUL-terminated.
+
+// vim_vsnprintf() can be invoked with either "va_list" or a list of
+// "typval_T". When the latter is not used it must be NULL.
+
+/// Append a formatted value to the string
+///
+/// @see vim_vsnprintf().
+int vim_snprintf_add(char *str, size_t str_m, char *fmt, ...)
+ FUNC_ATTR_PRINTF(3, 4)
+{
+ const size_t len = strlen(str);
+ size_t space;
+
+ if (str_m <= len) {
+ space = 0;
+ } else {
+ space = str_m - len;
+ }
+ va_list ap;
+ va_start(ap, fmt);
+ const int str_l = vim_vsnprintf(str + len, space, fmt, ap, NULL);
+ va_end(ap);
+ return str_l;
+}
+
+/// Write formatted value to the string
+///
+/// @param[out] str String to write to.
+/// @param[in] str_m String length.
+/// @param[in] fmt String format.
+///
+/// @return Number of bytes excluding NUL byte that would be written to the
+/// string if str_m was greater or equal to the return value.
+int vim_snprintf(char *str, size_t str_m, const char *fmt, ...)
+ FUNC_ATTR_PRINTF(3, 4)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ const int str_l = vim_vsnprintf(str, str_m, fmt, ap, NULL);
+ va_end(ap);
+ return str_l;
+}
+
+// Return the representation of infinity for printf() function:
+// "-inf", "inf", "+inf", " inf", "-INF", "INF", "+INF" or " INF".
+static const char *infinity_str(bool positive, char fmt_spec,
+ int force_sign, int space_for_positive)
+{
+ static const char *table[] = {
+ "-inf", "inf", "+inf", " inf",
+ "-INF", "INF", "+INF", " INF"
+ };
+ int idx = positive * (1 + force_sign + force_sign * space_for_positive);
+ if (ASCII_ISUPPER(fmt_spec)) {
+ idx += 4;
+ }
+ return table[idx];
+}
+
+
+/// Write formatted value to the string
+///
+/// @param[out] str String to write to.
+/// @param[in] str_m String length.
+/// @param[in] fmt String format.
+/// @param[in] ap Values that should be formatted. Ignored if tvs is not NULL.
+/// @param[in] tvs Values that should be formatted, for printf() VimL
+/// function. Must be NULL in other cases.
+///
+/// @return Number of bytes excluding NUL byte that would be written to the
+/// string if str_m was greater or equal to the return value.
+int vim_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap,
+ typval_T *const tvs)
+{
+ size_t str_l = 0;
+ bool str_avail = str_l < str_m;
+ const char *p = fmt;
+ int arg_idx = 1;
+
+ if (!p) {
+ p = "";
+ }
+ while (*p) {
+ if (*p != '%') {
+ // copy up to the next '%' or NUL without any changes
+ size_t n = (size_t)(xstrchrnul(p + 1, '%') - p);
+ if (str_avail) {
+ size_t avail = str_m - str_l;
+ memmove(str + str_l, p, MIN(n, avail));
+ str_avail = n < avail;
+ }
+ p += n;
+ assert(n <= SIZE_MAX - str_l);
+ str_l += n;
+ } else {
+ size_t min_field_width = 0, precision = 0;
+ int zero_padding = 0, precision_specified = 0, justify_left = 0;
+ int alternate_form = 0, force_sign = 0;
+
+ // if both ' ' and '+' flags appear, ' ' flag should be ignored
+ int space_for_positive = 1;
+
+ // allowed values: \0, h, l, 2 (for ll), z, L
+ char length_modifier = '\0';
+
+ // temporary buffer for simple numeric->string conversion
+# define TMP_LEN 350 // 1e308 seems reasonable as the maximum printable
+ char tmp[TMP_LEN];
+
+ // string address in case of string argument
+ const char *str_arg = NULL;
+
+ // natural field width of arg without padding and sign
+ size_t str_arg_l;
+
+ // unsigned char argument value (only defined for c conversion);
+ // standard explicitly states the char argument for the c
+ // conversion is unsigned
+ unsigned char uchar_arg;
+
+ // number of zeros to be inserted for numeric conversions as
+ // required by the precision or minimal field width
+ size_t number_of_zeros_to_pad = 0;
+
+ // index into tmp where zero padding is to be inserted
+ size_t zero_padding_insertion_ind = 0;
+
+ // current conversion specifier character
+ char fmt_spec = '\0';
+
+ // buffer for 's' and 'S' specs
+ char *tofree = NULL;
+
+ p++; // skip '%'
+
+ // parse flags
+ while (true) {
+ switch (*p) {
+ case '0': zero_padding = 1; p++; continue;
+ case '-': justify_left = 1; p++; continue;
+ // if both '0' and '-' flags appear, '0' should be ignored
+ case '+': force_sign = 1; space_for_positive = 0; p++; continue;
+ case ' ': force_sign = 1; p++; continue;
+ // if both ' ' and '+' flags appear, ' ' should be ignored
+ case '#': alternate_form = 1; p++; continue;
+ case '\'': p++; continue;
+ default: break;
+ }
+ break;
+ }
+
+ // parse field width
+ if (*p == '*') {
+ p++;
+ const int j = tvs ? (int)tv_nr(tvs, &arg_idx) : va_arg(ap, int);
+ if (j >= 0) {
+ min_field_width = (size_t)j;
+ } else {
+ min_field_width = (size_t)-j;
+ justify_left = 1;
+ }
+ } else if (ascii_isdigit((int)(*p))) {
+ // size_t could be wider than unsigned int; make sure we treat
+ // argument like common implementations do
+ unsigned int uj = (unsigned)(*p++ - '0');
+
+ while (ascii_isdigit((int)(*p))) {
+ uj = 10 * uj + (unsigned int)(*p++ - '0');
+ }
+ min_field_width = uj;
+ }
+
+ // parse precision
+ if (*p == '.') {
+ p++;
+ precision_specified = 1;
+ if (*p == '*') {
+ const int j = tvs ? (int)tv_nr(tvs, &arg_idx) : va_arg(ap, int);
+ p++;
+ if (j >= 0) {
+ precision = (size_t)j;
+ } else {
+ precision_specified = 0;
+ precision = 0;
+ }
+ } else if (ascii_isdigit((int)(*p))) {
+ // size_t could be wider than unsigned int; make sure we
+ // treat argument like common implementations do
+ unsigned int uj = (unsigned)(*p++ - '0');
+
+ while (ascii_isdigit((int)(*p))) {
+ uj = 10 * uj + (unsigned int)(*p++ - '0');
+ }
+ precision = uj;
+ }
+ }
+
+ // parse 'h', 'l', 'll' and 'z' length modifiers
+ if (*p == 'h' || *p == 'l' || *p == 'z') {
+ length_modifier = *p;
+ p++;
+ if (length_modifier == 'l' && *p == 'l') { // ll, encoded as 2
+ length_modifier = '2';
+ p++;
+ }
+ }
+
+ fmt_spec = *p;
+
+ // common synonyms
+ switch (fmt_spec) {
+ case 'i': fmt_spec = 'd'; break;
+ case 'D': fmt_spec = 'd'; length_modifier = 'l'; break;
+ case 'U': fmt_spec = 'u'; length_modifier = 'l'; break;
+ case 'O': fmt_spec = 'o'; length_modifier = 'l'; break;
+ default: break;
+ }
+
+ switch (fmt_spec) {
+ case 'd': case 'u': case 'o': case 'x': case 'X':
+ if (tvs && length_modifier == '\0') {
+ length_modifier = '2';
+ }
+ }
+
+ // get parameter value, do initial processing
+ switch (fmt_spec) {
+ // '%' and 'c' behave similar to 's' regarding flags and field widths
+ case '%': case 'c': case 's': case 'S':
+ str_arg_l = 1;
+ switch (fmt_spec) {
+ case '%':
+ str_arg = p;
+ break;
+
+ case 'c': {
+ const int j = tvs ? (int)tv_nr(tvs, &arg_idx) : va_arg(ap, int);
+ // standard demands unsigned char
+ uchar_arg = (unsigned char)j;
+ str_arg = (char *)&uchar_arg;
+ break;
+ }
+
+ case 's':
+ case 'S':
+ str_arg = tvs ? tv_str(tvs, &arg_idx, &tofree)
+ : va_arg(ap, const char *);
+ if (!str_arg) {
+ str_arg = "[NULL]";
+ str_arg_l = 6;
+ } else if (!precision_specified) {
+ // make sure not to address string beyond the specified
+ // precision
+ str_arg_l = strlen(str_arg);
+ } else if (precision == 0) {
+ // truncate string if necessary as requested by precision
+ str_arg_l = 0;
+ } else {
+ // memchr on HP does not like n > 2^31
+ // TODO(elmart): check if this still holds / is relevant
+ str_arg_l = (size_t)((char *)xmemscan(str_arg,
+ NUL,
+ MIN(precision,
+ 0x7fffffff))
+ - str_arg);
+ }
+ if (fmt_spec == 'S') {
+ if (min_field_width != 0) {
+ min_field_width += (strlen(str_arg)
+ - mb_string2cells((char_u *)str_arg));
+ }
+ if (precision) {
+ const char *p1 = str_arg;
+ for (size_t i = 0; i < precision && *p1; i++) {
+ p1 += mb_ptr2len((const char_u *)p1);
+ }
+ str_arg_l = precision = (size_t)(p1 - str_arg);
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case 'd':
+ case 'u':
+ case 'b': case 'B':
+ case 'o':
+ case 'x': case 'X':
+ case 'p': {
+ // u, b, B, o, x, X and p conversion specifiers imply
+ // the value is unsigned; d implies a signed value
+
+ // 0 if numeric argument is zero (or if pointer is NULL for 'p'),
+ // +1 if greater than zero (or non NULL for 'p'),
+ // -1 if negative (unsigned argument is never negative)
+ int arg_sign = 0;
+
+ intmax_t arg = 0;
+ uintmax_t uarg = 0;
+
+ // only defined for p conversion
+ const void *ptr_arg = NULL;
+
+ if (fmt_spec == 'p') {
+ ptr_arg = tvs ? tv_ptr(tvs, &arg_idx) : va_arg(ap, void *);
+ if (ptr_arg) {
+ arg_sign = 1;
+ }
+ } else if (fmt_spec == 'd') {
+ // signed
+ switch (length_modifier) {
+ case '\0': {
+ arg = (int)(tvs ? tv_nr(tvs, &arg_idx) : va_arg(ap, int));
+ break;
+ }
+ case 'h': {
+ // char and short arguments are passed as int16_t
+ arg = (int16_t)(tvs ? tv_nr(tvs, &arg_idx) : va_arg(ap, int));
+ break;
+ }
+ case 'l': {
+ arg = (tvs ? (long)tv_nr(tvs, &arg_idx) : va_arg(ap, long));
+ break;
+ }
+ case '2': {
+ arg = (
+ tvs
+ ? (long long)tv_nr(tvs, &arg_idx) // NOLINT (runtime/int)
+ : va_arg(ap, long long)); // NOLINT (runtime/int)
+ break;
+ }
+ case 'z': {
+ arg = (tvs
+ ? (ptrdiff_t)tv_nr(tvs, &arg_idx)
+ : va_arg(ap, ptrdiff_t));
+ break;
+ }
+ }
+ if (arg > 0) {
+ arg_sign = 1;
+ } else if (arg < 0) {
+ arg_sign = -1;
+ }
+ } else {
+ // unsigned
+ switch (length_modifier) {
+ case '\0': {
+ uarg = (unsigned int)(tvs
+ ? tv_nr(tvs, &arg_idx)
+ : va_arg(ap, unsigned int));
+ break;
+ }
+ case 'h': {
+ uarg = (uint16_t)(tvs
+ ? tv_nr(tvs, &arg_idx)
+ : va_arg(ap, unsigned int));
+ break;
+ }
+ case 'l': {
+ uarg = (tvs
+ ? (unsigned long)tv_nr(tvs, &arg_idx)
+ : va_arg(ap, unsigned long));
+ break;
+ }
+ case '2': {
+ uarg = (uintmax_t)(unsigned long long)( // NOLINT (runtime/int)
+ tvs
+ ? ((unsigned long long) // NOLINT (runtime/int)
+ tv_nr(tvs, &arg_idx))
+ : va_arg(ap, unsigned long long)); // NOLINT (runtime/int)
+ break;
+ }
+ case 'z': {
+ uarg = (tvs
+ ? (size_t)tv_nr(tvs, &arg_idx)
+ : va_arg(ap, size_t));
+ break;
+ }
+ }
+ arg_sign = (uarg != 0);
+ }
+
+ str_arg = tmp;
+ str_arg_l = 0;
+
+ // For d, i, u, o, x, and X conversions, if precision is specified,
+ // '0' flag should be ignored. This is so with Solaris 2.6, Digital
+ // UNIX 4.0, HPUX 10, Linux, FreeBSD, NetBSD; but not with Perl.
+ if (precision_specified) {
+ zero_padding = 0;
+ }
+
+ if (fmt_spec == 'd') {
+ if (force_sign && arg_sign >= 0) {
+ tmp[str_arg_l++] = space_for_positive ? ' ' : '+';
+ }
+ // leave negative numbers for snprintf to handle, to
+ // avoid handling tricky cases like (short int)-32768
+ } else if (alternate_form) {
+ if (arg_sign != 0 && (fmt_spec == 'x' || fmt_spec == 'X'
+ || fmt_spec == 'b' || fmt_spec == 'B')) {
+ tmp[str_arg_l++] = '0';
+ tmp[str_arg_l++] = fmt_spec;
+ }
+ // alternate form should have no effect for p * conversion, but ...
+ }
+
+ zero_padding_insertion_ind = str_arg_l;
+ if (!precision_specified) {
+ precision = 1; // default precision is 1
+ }
+ if (precision == 0 && arg_sign == 0) {
+ // when zero value is formatted with an explicit precision 0,
+ // resulting formatted string is empty (d, i, u, b, B, o, x, X, p)
+ } else {
+ switch (fmt_spec) {
+ case 'p': { // pointer
+ str_arg_l += (size_t)snprintf(tmp + str_arg_l,
+ sizeof(tmp) - str_arg_l,
+ "%p", ptr_arg);
+ break;
+ }
+ case 'd': { // signed
+ str_arg_l += (size_t)snprintf(tmp + str_arg_l,
+ sizeof(tmp) - str_arg_l,
+ "%" PRIdMAX, arg);
+ break;
+ }
+ case 'b': case 'B': { // binary
+ size_t bits = 0;
+ for (bits = sizeof(uintmax_t) * 8; bits > 0; bits--) {
+ if ((uarg >> (bits - 1)) & 0x1) {
+ break;
+ }
+ }
+
+ while (bits > 0) {
+ tmp[str_arg_l++] = ((uarg >> --bits) & 0x1) ? '1' : '0';
+ }
+ break;
+ }
+ default: { // unsigned
+ // construct a simple format string for snprintf
+ char f[] = "%" PRIuMAX;
+ f[sizeof("%" PRIuMAX) - 1 - 1] = fmt_spec;
+ assert(PRIuMAX[sizeof(PRIuMAX) - 1 - 1] == 'u');
+ str_arg_l += (size_t)snprintf(tmp + str_arg_l,
+ sizeof(tmp) - str_arg_l,
+ f, uarg);
+ break;
+ }
+ }
+ assert(str_arg_l < sizeof(tmp));
+
+ // include the optional minus sign and possible "0x" in the region
+ // before the zero padding insertion point
+ if (zero_padding_insertion_ind < str_arg_l
+ && tmp[zero_padding_insertion_ind] == '-') {
+ zero_padding_insertion_ind++;
+ }
+ if (zero_padding_insertion_ind + 1 < str_arg_l
+ && tmp[zero_padding_insertion_ind] == '0'
+ && (tmp[zero_padding_insertion_ind + 1] == 'x'
+ || tmp[zero_padding_insertion_ind + 1] == 'X'
+ || tmp[zero_padding_insertion_ind + 1] == 'b'
+ || tmp[zero_padding_insertion_ind + 1] == 'B')) {
+ zero_padding_insertion_ind += 2;
+ }
+ }
+
+ {
+ size_t num_of_digits = str_arg_l - zero_padding_insertion_ind;
+
+ if (alternate_form && fmt_spec == 'o'
+ // unless zero is already the first character
+ && !(zero_padding_insertion_ind < str_arg_l
+ && tmp[zero_padding_insertion_ind] == '0')) {
+ // assure leading zero for alternate-form octal numbers
+ if (!precision_specified
+ || precision < num_of_digits + 1) {
+ // precision is increased to force the first character to be
+ // zero, except if a zero value is formatted with an explicit
+ // precision of zero
+ precision = num_of_digits + 1;
+ }
+ }
+ // zero padding to specified precision?
+ if (num_of_digits < precision) {
+ number_of_zeros_to_pad = precision - num_of_digits;
+ }
+ }
+ // zero padding to specified minimal field width?
+ if (!justify_left && zero_padding) {
+ const int n = (int)(min_field_width - (str_arg_l
+ + number_of_zeros_to_pad));
+ if (n > 0) {
+ number_of_zeros_to_pad += (size_t)n;
+ }
+ }
+ break;
+ }
+
+ case 'f':
+ case 'F':
+ case 'e':
+ case 'E':
+ case 'g':
+ case 'G':
+ {
+ // floating point
+ char format[40];
+ int remove_trailing_zeroes = false;
+
+ double f = tvs ? tv_float(tvs, &arg_idx) : va_arg(ap, double);
+ double abs_f = f < 0 ? -f : f;
+
+ if (fmt_spec == 'g' || fmt_spec == 'G') {
+ // can't use %g directly, cause it prints "1.0" as "1"
+ if ((abs_f >= 0.001 && abs_f < 10000000.0) || abs_f == 0.0) {
+ fmt_spec = ASCII_ISUPPER(fmt_spec) ? 'F' : 'f';
+ } else {
+ fmt_spec = fmt_spec == 'g' ? 'e' : 'E';
+ }
+ remove_trailing_zeroes = true;
+ }
+
+ if (isinf(f)
+ || (strchr("fF", fmt_spec) != NULL && abs_f > 1.0e307)) {
+ xstrlcpy(tmp, infinity_str(f > 0.0, fmt_spec,
+ force_sign, space_for_positive),
+ sizeof(tmp));
+ str_arg_l = strlen(tmp);
+ zero_padding = 0;
+ } else if (isnan(f)) {
+ // Not a number: nan or NAN
+ memmove(tmp, ASCII_ISUPPER(fmt_spec) ? "NAN" : "nan", 4);
+ str_arg_l = 3;
+ zero_padding = 0;
+ } else {
+ // Regular float number
+ format[0] = '%';
+ size_t l = 1;
+ if (force_sign) {
+ format[l++] = space_for_positive ? ' ' : '+';
+ }
+ if (precision_specified) {
+ size_t max_prec = TMP_LEN - 10;
+
+ // make sure we don't get more digits than we have room for
+ if ((fmt_spec == 'f' || fmt_spec == 'F') && abs_f > 1.0) {
+ max_prec -= (size_t)log10(abs_f);
+ }
+ if (precision > max_prec) {
+ precision = max_prec;
+ }
+ l += (size_t)snprintf(format + l, sizeof(format) - l, ".%d",
+ (int)precision);
+ }
+
+ // Cast to char to avoid a conversion warning on Ubuntu 12.04.
+ assert(l + 1 < sizeof(format));
+ format[l] = (char)(fmt_spec == 'F' ? 'f' : fmt_spec);
+ format[l + 1] = NUL;
+
+ str_arg_l = (size_t)snprintf(tmp, sizeof(tmp), format, f);
+ assert(str_arg_l < sizeof(tmp));
+
+ if (remove_trailing_zeroes) {
+ int i;
+ char *tp;
+
+ // using %g or %G: remove superfluous zeroes
+ if (fmt_spec == 'f' || fmt_spec == 'F') {
+ tp = tmp + str_arg_l - 1;
+ } else {
+ tp = (char *)vim_strchr((char_u *)tmp,
+ fmt_spec == 'e' ? 'e' : 'E');
+ if (tp) {
+ // remove superfluous '+' and leading zeroes from exponent
+ if (tp[1] == '+') {
+ // change "1.0e+07" to "1.0e07"
+ STRMOVE(tp + 1, tp + 2);
+ str_arg_l--;
+ }
+ i = (tp[1] == '-') ? 2 : 1;
+ while (tp[i] == '0') {
+ // change "1.0e07" to "1.0e7"
+ STRMOVE(tp + i, tp + i + 1);
+ str_arg_l--;
+ }
+ tp--;
+ }
+ }
+
+ if (tp != NULL && !precision_specified) {
+ // remove trailing zeroes, but keep the one just after a dot
+ while (tp > tmp + 2 && *tp == '0' && tp[-1] != '.') {
+ STRMOVE(tp, tp + 1);
+ tp--;
+ str_arg_l--;
+ }
+ }
+ } else {
+ // Be consistent: some printf("%e") use 1.0e+12 and some
+ // 1.0e+012; remove one zero in the last case.
+ char *tp = (char *)vim_strchr((char_u *)tmp,
+ fmt_spec == 'e' ? 'e' : 'E');
+ if (tp && (tp[1] == '+' || tp[1] == '-') && tp[2] == '0'
+ && ascii_isdigit(tp[3]) && ascii_isdigit(tp[4])) {
+ STRMOVE(tp + 2, tp + 3);
+ str_arg_l--;
+ }
+ }
+ }
+ if (zero_padding && min_field_width > str_arg_l
+ && (tmp[0] == '-' || force_sign)) {
+ // Padding 0's should be inserted after the sign.
+ number_of_zeros_to_pad = min_field_width - str_arg_l;
+ zero_padding_insertion_ind = 1;
+ }
+ str_arg = tmp;
+ break;
+ }
+
+ default:
+ // unrecognized conversion specifier, keep format string as-is
+ zero_padding = 0; // turn zero padding off for non-numeric conversion
+ justify_left = 1;
+ min_field_width = 0; // reset flags
+
+ // discard the unrecognized conversion, just keep
+ // the unrecognized conversion character
+ str_arg = p;
+ str_arg_l = 0;
+ if (*p) {
+ str_arg_l++; // include invalid conversion specifier
+ }
+ // unchanged if not at end-of-string
+ break;
+ }
+
+ if (*p) {
+ p++; // step over the just processed conversion specifier
+ }
+
+ // insert padding to the left as requested by min_field_width;
+ // this does not include the zero padding in case of numerical conversions
+ if (!justify_left) {
+ assert(str_arg_l <= SIZE_MAX - number_of_zeros_to_pad);
+ if (min_field_width > str_arg_l + number_of_zeros_to_pad) {
+ // left padding with blank or zero
+ size_t pn = min_field_width - (str_arg_l + number_of_zeros_to_pad);
+ if (str_avail) {
+ size_t avail = str_m - str_l;
+ memset(str + str_l, zero_padding ? '0' : ' ', MIN(pn, avail));
+ str_avail = pn < avail;
+ }
+ assert(pn <= SIZE_MAX - str_l);
+ str_l += pn;
+ }
+ }
+
+ // zero padding as requested by the precision or by the minimal
+ // field width for numeric conversions required?
+ if (number_of_zeros_to_pad == 0) {
+ // will not copy first part of numeric right now,
+ // force it to be copied later in its entirety
+ zero_padding_insertion_ind = 0;
+ } else {
+ // insert first part of numerics (sign or '0x') before zero padding
+ if (zero_padding_insertion_ind > 0) {
+ size_t zn = zero_padding_insertion_ind;
+ if (str_avail) {
+ size_t avail = str_m - str_l;
+ memmove(str + str_l, str_arg, MIN(zn, avail));
+ str_avail = zn < avail;
+ }
+ assert(zn <= SIZE_MAX - str_l);
+ str_l += zn;
+ }
+
+ // insert zero padding as requested by precision or min field width
+ size_t zn = number_of_zeros_to_pad;
+ if (str_avail) {
+ size_t avail = str_m - str_l;
+ memset(str + str_l, '0', MIN(zn, avail));
+ str_avail = zn < avail;
+ }
+ assert(zn <= SIZE_MAX - str_l);
+ str_l += zn;
+ }
+
+ // insert formatted string
+ // (or as-is conversion specifier for unknown conversions)
+ if (str_arg_l > zero_padding_insertion_ind) {
+ size_t sn = str_arg_l - zero_padding_insertion_ind;
+ if (str_avail) {
+ size_t avail = str_m - str_l;
+ memmove(str + str_l,
+ str_arg + zero_padding_insertion_ind,
+ MIN(sn, avail));
+ str_avail = sn < avail;
+ }
+ assert(sn <= SIZE_MAX - str_l);
+ str_l += sn;
+ }
+
+ // insert right padding
+ if (justify_left) {
+ assert(str_arg_l <= SIZE_MAX - number_of_zeros_to_pad);
+ if (min_field_width > str_arg_l + number_of_zeros_to_pad) {
+ // right blank padding to the field width
+ size_t pn = min_field_width - (str_arg_l + number_of_zeros_to_pad);
+ if (str_avail) {
+ size_t avail = str_m - str_l;
+ memset(str + str_l, ' ', MIN(pn, avail));
+ str_avail = pn < avail;
+ }
+ assert(pn <= SIZE_MAX - str_l);
+ str_l += pn;
+ }
+ }
+
+ xfree(tofree);
+ }
+ }
+
+ if (str_m > 0) {
+ // make sure the string is nul-terminated even at the expense of
+ // overwriting the last character (shouldn't happen, but just in case)
+ str[str_l <= str_m - 1 ? str_l : str_m - 1] = '\0';
+ }
+
+ if (tvs && tvs[arg_idx - 1].v_type != VAR_UNKNOWN) {
+ EMSG(_("E767: Too many arguments to printf()"));
+ }
+
+ // return the number of characters formatted (excluding trailing nul
+ // character); that is, the number of characters that would have been
+ // written to the buffer if it were large enough.
+ return (int)str_l;
+}
diff --git a/src/nvim/strings.h b/src/nvim/strings.h
index 3f0f0c8d6a..f2876c6307 100644
--- a/src/nvim/strings.h
+++ b/src/nvim/strings.h
@@ -2,6 +2,28 @@
#define NVIM_STRINGS_H
#include <stdbool.h>
+#include <stdarg.h>
+#include <string.h>
+
+#include "nvim/types.h"
+#include "nvim/eval/typval.h"
+
+/// Append string to string and return pointer to the next byte
+///
+/// Unlike strcat, this one does *not* add NUL byte and returns pointer to the
+/// past of the added string.
+///
+/// @param[out] dst String to append to.
+/// @param[in] src String to append.
+///
+/// @return pointer to the byte just past the appended byte.
+static inline char *strappend(char *const dst, const char *const src)
+ FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+ FUNC_ATTR_NONNULL_RET
+{
+ const size_t src_len = strlen(src);
+ return (char *)memmove(dst, src, src_len) + src_len;
+}
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "strings.h.generated.h"
diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c
index 27855184df..81c78ca6a9 100644
--- a/src/nvim/syntax.c
+++ b/src/nvim/syntax.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* syntax.c: code for syntax highlighting
*/
@@ -13,19 +16,20 @@
#include "nvim/ascii.h"
#include "nvim/syntax.h"
#include "nvim/charset.h"
+#include "nvim/cursor_shape.h"
#include "nvim/eval.h"
#include "nvim/ex_cmds2.h"
#include "nvim/ex_docmd.h"
#include "nvim/fileio.h"
#include "nvim/fold.h"
#include "nvim/hashtab.h"
+#include "nvim/highlight.h"
#include "nvim/indent_c.h"
#include "nvim/mbyte.h"
#include "nvim/memline.h"
#include "nvim/memory.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/keymap.h"
#include "nvim/garray.h"
#include "nvim/option.h"
@@ -40,42 +44,52 @@
#include "nvim/ui.h"
#include "nvim/os/os.h"
#include "nvim/os/time.h"
+#include "nvim/buffer.h"
static bool did_syntax_onoff = false;
-// Structure that stores information about a highlight group.
-// The ID of a highlight group is also called group ID. It is the index in
-// the highlight_ga array PLUS ONE.
+/// Structure that stores information about a highlight group.
+/// The ID of a highlight group is also called group ID. It is the index in
+/// the highlight_ga array PLUS ONE.
struct hl_group {
- char_u *sg_name; // highlight group name
- char_u *sg_name_u; // uppercase of sg_name
- int sg_attr; // Screen attr
- int sg_link; // link to this highlight group ID
- int sg_set; // combination of SG_* flags
- scid_T sg_scriptID; // script in which the group was last set
+ char_u *sg_name; ///< highlight group name
+ char_u *sg_name_u; ///< uppercase of sg_name
+ bool sg_cleared; ///< "hi clear" was used
+ int sg_attr; ///< Screen attr @see ATTR_ENTRY
+ int sg_link; ///< link to this highlight group ID
+ int sg_set; ///< combination of flags in \ref SG_SET
+ scid_T sg_scriptID; ///< script in which the group was last set
// for terminal UIs
- int sg_cterm; // "cterm=" highlighting attr
- int sg_cterm_fg; // terminal fg color number + 1
- int sg_cterm_bg; // terminal bg color number + 1
- int sg_cterm_bold; // bold attr was set for light color
+ int sg_cterm; ///< "cterm=" highlighting attr
+ ///< (combination of \ref HlAttrFlags)
+ int sg_cterm_fg; ///< terminal fg color number + 1
+ int sg_cterm_bg; ///< terminal bg color number + 1
+ bool sg_cterm_bold; ///< bold attr was set for light color
// for RGB UIs
- int sg_gui; // "gui=" highlighting attributes
- RgbValue sg_rgb_fg; // RGB foreground color
- RgbValue sg_rgb_bg; // RGB background color
- RgbValue sg_rgb_sp; // RGB special color
- uint8_t *sg_rgb_fg_name; // RGB foreground color name
- uint8_t *sg_rgb_bg_name; // RGB background color name
- uint8_t *sg_rgb_sp_name; // RGB special color name
+ int sg_gui; ///< "gui=" highlighting attributes
+ ///< (combination of \ref HlAttrFlags)
+ RgbValue sg_rgb_fg; ///< RGB foreground color
+ RgbValue sg_rgb_bg; ///< RGB background color
+ RgbValue sg_rgb_sp; ///< RGB special color
+ uint8_t *sg_rgb_fg_name; ///< RGB foreground color name
+ uint8_t *sg_rgb_bg_name; ///< RGB background color name
+ uint8_t *sg_rgb_sp_name; ///< RGB special color name
};
+/// \addtogroup SG_SET
+/// @{
#define SG_CTERM 2 // cterm has been set
#define SG_GUI 4 // gui has been set
#define SG_LINK 8 // link has been set
+/// @}
-// highlight groups for 'highlight' option
+// builtin |highlight-groups|
static garray_T highlight_ga = GA_EMPTY_INIT_VALUE;
-#define HL_TABLE() ((struct hl_group *)((highlight_ga.ga_data)))
+static inline struct hl_group * HL_TABLE(void)
+{
+ return ((struct hl_group *)((highlight_ga.ga_data)));
+}
#define MAX_HL_ID 20000 /* maximum value for a highlight ID. */
@@ -94,10 +108,8 @@ static int include_none = 0; /* when 1 include "nvim/None" */
static int include_default = 0; /* when 1 include "nvim/default" */
static int include_link = 0; /* when 2 include "nvim/link" and "clear" */
-/*
- * The "term", "cterm" and "gui" arguments can be any combination of the
- * following names, separated by commas (but no spaces!).
- */
+/// The "term", "cterm" and "gui" arguments can be any combination of the
+/// following names, separated by commas (but no spaces!).
static char *(hl_name_table[]) =
{"bold", "standout", "underline", "undercurl",
"italic", "reverse", "inverse", "NONE"};
@@ -105,42 +117,42 @@ static int hl_attr_table[] =
{HL_BOLD, HL_STANDOUT, HL_UNDERLINE, HL_UNDERCURL, HL_ITALIC, HL_INVERSE,
HL_INVERSE, 0};
-/*
- * The patterns that are being searched for are stored in a syn_pattern.
- * A match item consists of one pattern.
- * A start/end item consists of n start patterns and m end patterns.
- * A start/skip/end item consists of n start patterns, one skip pattern and m
- * end patterns.
- * For the latter two, the patterns are always consecutive: start-skip-end.
- *
- * A character offset can be given for the matched text (_m_start and _m_end)
- * and for the actually highlighted text (_h_start and _h_end).
- */
+// The patterns that are being searched for are stored in a syn_pattern.
+// A match item consists of one pattern.
+// A start/end item consists of n start patterns and m end patterns.
+// A start/skip/end item consists of n start patterns, one skip pattern and m
+// end patterns.
+// For the latter two, the patterns are always consecutive: start-skip-end.
+//
+// A character offset can be given for the matched text (_m_start and _m_end)
+// and for the actually highlighted text (_h_start and _h_end).
+//
+// Note that ordering of members is optimized to reduce padding.
typedef struct syn_pattern {
- char sp_type; /* see SPTYPE_ defines below */
- char sp_syncing; /* this item used for syncing */
- int sp_flags; /* see HL_ defines below */
- int sp_cchar; /* conceal substitute character */
- struct sp_syn sp_syn; /* struct passed to in_id_list() */
- short sp_syn_match_id; /* highlight group ID of pattern */
- char_u *sp_pattern; /* regexp to match, pattern */
- regprog_T *sp_prog; /* regexp to match, program */
+ char sp_type; // see SPTYPE_ defines below
+ bool sp_syncing; // this item used for syncing
+ int16_t sp_syn_match_id; // highlight group ID of pattern
+ int16_t sp_off_flags; // see below
+ int sp_offsets[SPO_COUNT]; // offsets
+ int sp_flags; // see HL_ defines below
+ int sp_cchar; // conceal substitute character
+ int sp_ic; // ignore-case flag for sp_prog
+ int sp_sync_idx; // sync item index (syncing only)
+ int sp_line_id; // ID of last line where tried
+ int sp_startcol; // next match in sp_line_id line
+ int16_t *sp_cont_list; // cont. group IDs, if non-zero
+ int16_t *sp_next_list; // next group IDs, if non-zero
+ struct sp_syn sp_syn; // struct passed to in_id_list()
+ char_u *sp_pattern; // regexp to match, pattern
+ regprog_T *sp_prog; // regexp to match, program
syn_time_T sp_time;
- int sp_ic; /* ignore-case flag for sp_prog */
- short sp_off_flags; /* see below */
- int sp_offsets[SPO_COUNT]; /* offsets */
- short *sp_cont_list; /* cont. group IDs, if non-zero */
- short *sp_next_list; /* next group IDs, if non-zero */
- int sp_sync_idx; /* sync item index (syncing only) */
- int sp_line_id; /* ID of last line where tried */
- int sp_startcol; /* next match in sp_line_id line */
} synpat_T;
typedef struct syn_cluster_S {
- char_u *scl_name; /* syntax cluster name */
- char_u *scl_name_u; /* uppercase of scl_name */
- short *scl_list; /* IDs in this syntax cluster */
+ char_u *scl_name; // syntax cluster name
+ char_u *scl_name_u; // uppercase of scl_name
+ int16_t *scl_list; // IDs in this syntax cluster
} syn_cluster_T;
/*
@@ -149,27 +161,27 @@ typedef struct syn_cluster_S {
* (The end positions have the column number of the next char)
*/
typedef struct state_item {
- int si_idx; /* index of syntax pattern or
- KEYWORD_IDX */
- int si_id; /* highlight group ID for keywords */
- int si_trans_id; /* idem, transparency removed */
- int si_m_lnum; /* lnum of the match */
- int si_m_startcol; /* starting column of the match */
- lpos_T si_m_endpos; /* just after end posn of the match */
- lpos_T si_h_startpos; /* start position of the highlighting */
- lpos_T si_h_endpos; /* end position of the highlighting */
- lpos_T si_eoe_pos; /* end position of end pattern */
- int si_end_idx; /* group ID for end pattern or zero */
- int si_ends; /* if match ends before si_m_endpos */
- int si_attr; /* attributes in this state */
- long si_flags; /* HL_HAS_EOL flag in this state, and
- * HL_SKIP* for si_next_list */
- int si_seqnr; /* sequence number */
- int si_cchar; /* substitution character for conceal */
- short *si_cont_list; /* list of contained groups */
- short *si_next_list; /* nextgroup IDs after this item ends */
- reg_extmatch_T *si_extmatch; /* \z(...\) matches from start
- * pattern */
+ int si_idx; // index of syntax pattern or
+ // KEYWORD_IDX
+ int si_id; // highlight group ID for keywords
+ int si_trans_id; // idem, transparency removed
+ int si_m_lnum; // lnum of the match
+ int si_m_startcol; // starting column of the match
+ lpos_T si_m_endpos; // just after end posn of the match
+ lpos_T si_h_startpos; // start position of the highlighting
+ lpos_T si_h_endpos; // end position of the highlighting
+ lpos_T si_eoe_pos; // end position of end pattern
+ int si_end_idx; // group ID for end pattern or zero
+ int si_ends; // if match ends before si_m_endpos
+ int si_attr; // attributes in this state
+ long si_flags; // HL_HAS_EOL flag in this state, and
+ // HL_SKIP* for si_next_list
+ int si_seqnr; // sequence number
+ int si_cchar; // substitution character for conceal
+ int16_t *si_cont_list; // list of contained groups
+ int16_t *si_next_list; // nextgroup IDs after this item ends
+ reg_extmatch_T *si_extmatch; // \z(...\) matches from start
+ // pattern
} stateitem_T;
/*
@@ -177,14 +189,14 @@ typedef struct state_item {
* very often.
*/
typedef struct {
- int flags; /* flags for contained and transparent */
- int keyword; /* TRUE for ":syn keyword" */
- int *sync_idx; /* syntax item for "grouphere" argument, NULL
- if not allowed */
- char has_cont_list; /* TRUE if "cont_list" can be used */
- short *cont_list; /* group IDs for "contains" argument */
- short *cont_in_list; /* group IDs for "containedin" argument */
- short *next_list; /* group IDs for "nextgroup" argument */
+ int flags; // flags for contained and transparent
+ bool keyword; // true for ":syn keyword"
+ int *sync_idx; // syntax item for "grouphere" argument, NULL
+ // if not allowed
+ bool has_cont_list; // true if "cont_list" can be used
+ int16_t *cont_list; // group IDs for "contains" argument
+ int16_t *cont_in_list; // group IDs for "containedin" argument
+ int16_t *next_list; // group IDs for "nextgroup" argument
} syn_opt_arg_T;
typedef struct {
@@ -206,12 +218,6 @@ struct name_list {
# include "syntax.c.generated.h"
#endif
-/*
- * An attribute number is the index in attr_table plus ATTR_OFF.
- */
-#define ATTR_OFF 1
-
-
static char *(spo_name_tab[SPO_COUNT]) =
{"ms=", "me=", "hs=", "he=", "rs=", "re=", "lc="};
@@ -303,6 +309,8 @@ static keyentry_T dumkey;
#define HIKEY2KE(p) ((keyentry_T *)((p) - (dumkey.keyword - (char_u *)&dumkey)))
#define HI2KE(hi) HIKEY2KE((hi)->hi_key)
+// -V:HI2KE:782
+
/*
* To reduce the time spent in keepend(), remember at which level in the state
* stack the first item with "keepend" is present. When "-1", there is no
@@ -312,9 +320,10 @@ static int keepend_level = -1;
static char msg_no_items[] = N_("No Syntax items defined for this buffer");
-#define KEYWORD_IDX -1 /* value of si_idx for keywords */
-#define ID_LIST_ALL (short *)-1 /* valid of si_cont_list for containing all
- but contained groups */
+// value of si_idx for keywords
+#define KEYWORD_IDX -1
+// valid of si_cont_list for containing all but contained groups
+#define ID_LIST_ALL (int16_t *)-1
static int next_seqnr = 1; /* value to use for si_seqnr */
@@ -357,9 +366,9 @@ static int current_state_stored = 0; /* TRUE if stored current state
static int current_finished = 0; /* current line has been finished */
static garray_T current_state /* current stack of state_items */
= GA_EMPTY_INIT_VALUE;
-static short *current_next_list = NULL; /* when non-zero, nextgroup list */
-static int current_next_flags = 0; /* flags for current_next_list */
-static int current_line_id = 0; /* unique number for current line */
+static int16_t *current_next_list = NULL; // when non-zero, nextgroup list
+static int current_next_flags = 0; // flags for current_next_list
+static int current_line_id = 0; // unique number for current line
#define CUR_STATE(idx) ((stateitem_T *)(current_state.ga_data))[idx]
@@ -393,12 +402,14 @@ void syntax_start(win_T *wp, linenr_T lnum)
* Also do this when a change was made, the current state may be invalid
* then.
*/
- if (syn_block != wp->w_s || changedtick != syn_buf->b_changedtick) {
+ if (syn_block != wp->w_s
+ || syn_buf != wp->w_buffer
+ || changedtick != buf_get_changedtick(syn_buf)) {
invalidate_current_state();
syn_buf = wp->w_buffer;
syn_block = wp->w_s;
}
- changedtick = syn_buf->b_changedtick;
+ changedtick = buf_get_changedtick(syn_buf);
syn_win = wp;
/*
@@ -415,7 +426,7 @@ void syntax_start(win_T *wp, linenr_T lnum)
if (VALID_STATE(&current_state)
&& current_lnum < lnum
&& current_lnum < syn_buf->b_ml.ml_line_count) {
- (void)syn_finish_line(FALSE);
+ (void)syn_finish_line(false);
if (!current_state_stored) {
++current_lnum;
(void)store_current_state();
@@ -438,9 +449,10 @@ void syntax_start(win_T *wp, linenr_T lnum)
if (INVALID_STATE(&current_state) && syn_block->b_sst_array != NULL) {
/* Find last valid saved state before start_lnum. */
for (p = syn_block->b_sst_first; p != NULL; p = p->sst_next) {
- if (p->sst_lnum > lnum)
+ if (p->sst_lnum > lnum) {
break;
- if (p->sst_lnum <= lnum && p->sst_change_lnum == 0) {
+ }
+ if (p->sst_change_lnum == 0) {
last_valid = p;
if (p->sst_lnum >= lnum - syn_block->b_syn_sync_minlines)
last_min_valid = p;
@@ -476,8 +488,8 @@ void syntax_start(win_T *wp, linenr_T lnum)
dist = syn_buf->b_ml.ml_line_count / (syn_block->b_sst_len - Rows) + 1;
while (current_lnum < lnum) {
syn_start_line();
- (void)syn_finish_line(FALSE);
- ++current_lnum;
+ (void)syn_finish_line(false);
+ current_lnum++;
/* If we parsed at least "minlines" lines or started at a valid
* state, the current state is considered valid. */
@@ -574,7 +586,7 @@ static void syn_sync(win_T *wp, linenr_T start_lnum, synstate_T *last_valid)
linenr_T lnum;
linenr_T end_lnum;
linenr_T break_lnum;
- int had_sync_point;
+ bool had_sync_point;
stateitem_T *cur_si;
synpat_T *spp;
char_u *line;
@@ -708,11 +720,9 @@ static void syn_sync(win_T *wp, linenr_T start_lnum, synstate_T *last_valid)
for (current_lnum = lnum; current_lnum < end_lnum; ++current_lnum) {
syn_start_line();
for (;; ) {
- had_sync_point = syn_finish_line(TRUE);
- /*
- * When a sync point has been found, remember where, and
- * continue to look for another one, further on in the line.
- */
+ had_sync_point = syn_finish_line(true);
+ // When a sync point has been found, remember where, and
+ // continue to look for another one, further on in the line.
if (had_sync_point && current_state.ga_len) {
cur_si = &CUR_STATE(current_state.ga_len - 1);
if (cur_si->si_m_endpos.lnum > start_lnum) {
@@ -790,10 +800,11 @@ static void syn_sync(win_T *wp, linenr_T start_lnum, synstate_T *last_valid)
}
current_col = found_m_endpos.col;
current_lnum = found_m_endpos.lnum;
- (void)syn_finish_line(FALSE);
- ++current_lnum;
- } else
+ (void)syn_finish_line(false);
+ current_lnum++;
+ } else {
current_lnum = start_lnum;
+ }
break;
}
@@ -868,7 +879,8 @@ static void syn_start_line(void)
}
next_match_idx = -1;
- ++current_line_id;
+ current_line_id++;
+ next_seqnr = 1;
}
/*
@@ -1405,14 +1417,14 @@ static int syn_stack_equal(synstate_T *sp)
/* If the pointer is different it can still be the
* same text. Compare the strings, ignore case when
* the start item has the sp_ic flag set. */
- if (bsx->matches[j] == NULL
- || six->matches[j] == NULL)
+ if (bsx->matches[j] == NULL || six->matches[j] == NULL) {
break;
- if ((SYN_ITEMS(syn_block)[CUR_STATE(i).si_idx]).sp_ic
- ? mb_stricmp(bsx->matches[j],
- six->matches[j]) != 0
- : STRCMP(bsx->matches[j], six->matches[j]) != 0)
+ }
+ if (mb_strcmp_ic((SYN_ITEMS(syn_block)[CUR_STATE(i).si_idx]).sp_ic,
+ (const char *)bsx->matches[j],
+ (const char *)six->matches[j]) != 0) {
break;
+ }
}
}
if (j != NSUBEXP)
@@ -1488,7 +1500,7 @@ int syntax_check_changed(linenr_T lnum)
* finish the previous line (needed when not all of the line was
* drawn)
*/
- (void)syn_finish_line(FALSE);
+ (void)syn_finish_line(false);
/*
* Compare the current state with the previously saved state of
@@ -1514,41 +1526,37 @@ int syntax_check_changed(linenr_T lnum)
* the line. It can start anywhere in the line, as long as the current state
* is valid.
*/
-static int
-syn_finish_line (
- int syncing /* called for syncing */
+static bool
+syn_finish_line(
+ const bool syncing // called for syncing
)
{
- stateitem_T *cur_si;
- colnr_T prev_current_col;
-
while (!current_finished) {
- (void)syn_current_attr(syncing, FALSE, NULL, FALSE);
- /*
- * When syncing, and found some item, need to check the item.
- */
+ (void)syn_current_attr(syncing, false, NULL, false);
+
+ // When syncing, and found some item, need to check the item.
if (syncing && current_state.ga_len) {
- /*
- * Check for match with sync item.
- */
- cur_si = &CUR_STATE(current_state.ga_len - 1);
+ // Check for match with sync item.
+ const stateitem_T *const cur_si = &CUR_STATE(current_state.ga_len - 1);
if (cur_si->si_idx >= 0
&& (SYN_ITEMS(syn_block)[cur_si->si_idx].sp_flags
- & (HL_SYNC_HERE|HL_SYNC_THERE)))
- return TRUE;
-
- /* syn_current_attr() will have skipped the check for an item
- * that ends here, need to do that now. Be careful not to go
- * past the NUL. */
- prev_current_col = current_col;
- if (syn_getcurline()[current_col] != NUL)
- ++current_col;
+ & (HL_SYNC_HERE|HL_SYNC_THERE))) {
+ return true;
+ }
+
+ // syn_current_attr() will have skipped the check for an item
+ // that ends here, need to do that now. Be careful not to go
+ // past the NUL.
+ const colnr_T prev_current_col = current_col;
+ if (syn_getcurline()[current_col] != NUL) {
+ current_col++;
+ }
check_state_ends();
current_col = prev_current_col;
}
- ++current_col;
+ current_col++;
}
- return FALSE;
+ return false;
}
/*
@@ -1560,11 +1568,11 @@ syn_finish_line (
* When "can_spell" is not NULL set it to TRUE when spell-checking should be
* done.
*/
-int
-get_syntax_attr (
- colnr_T col,
- bool *can_spell,
- int keep_state /* keep state of char at "col" */
+int
+get_syntax_attr(
+ const colnr_T col,
+ bool *const can_spell,
+ const bool keep_state // keep state of char at "col"
)
{
int attr = 0;
@@ -1586,6 +1594,7 @@ get_syntax_attr (
current_id = 0;
current_trans_id = 0;
current_flags = 0;
+ current_seqnr = 0;
return 0;
}
@@ -1597,9 +1606,9 @@ get_syntax_attr (
* Skip from the current column to "col", get the attributes for "col".
*/
while (current_col <= col) {
- attr = syn_current_attr(FALSE, TRUE, can_spell,
- current_col == col ? keep_state : FALSE);
- ++current_col;
+ attr = syn_current_attr(false, true, can_spell,
+ current_col == col ? keep_state : false);
+ current_col++;
}
return attr;
@@ -1608,42 +1617,37 @@ get_syntax_attr (
/*
* Get syntax attributes for current_lnum, current_col.
*/
-static int
-syn_current_attr (
- int syncing, /* When 1: called for syncing */
- int displaying, /* result will be displayed */
- bool *can_spell, /* return: do spell checking */
- int keep_state /* keep syntax stack afterwards */
+static int syn_current_attr(
+ const bool syncing, // When true: called for syncing
+ const bool displaying, // result will be displayed
+ bool *const can_spell, // return: do spell checking
+ const bool keep_state // keep syntax stack afterwards
)
{
- int syn_id;
- lpos_T endpos; /* was: char_u *endp; */
- lpos_T hl_startpos; /* was: int hl_startcol; */
+ lpos_T endpos; // was: char_u *endp;
+ lpos_T hl_startpos; // was: int hl_startcol;
lpos_T hl_endpos;
- lpos_T eos_pos; /* end-of-start match (start region) */
- lpos_T eoe_pos; /* end-of-end pattern */
- int end_idx; /* group ID for end pattern */
- synpat_T *spp;
+ lpos_T eos_pos; // end-of-start match (start region)
+ lpos_T eoe_pos; // end-of-end pattern
+ int end_idx; // group ID for end pattern
stateitem_T *cur_si, *sip = NULL;
int startcol;
int endcol;
long flags;
int cchar;
- short *next_list;
- int found_match; /* found usable match */
- static int try_next_column = FALSE; /* must try in next col */
- int do_keywords;
+ int16_t *next_list;
+ bool found_match; // found usable match
+ static bool try_next_column = false; // must try in next col
regmmatch_T regmatch;
lpos_T pos;
- int lc_col;
reg_extmatch_T *cur_extmatch = NULL;
char_u buf_chartab[32]; // chartab array for syn iskeyword
char_u *line; // current line. NOTE: becomes invalid after
// looking for a pattern match!
- /* variables for zero-width matches that have a "nextgroup" argument */
- int keep_next_list;
- int zero_width_next_list = FALSE;
+ // variables for zero-width matches that have a "nextgroup" argument
+ bool keep_next_list;
+ bool zero_width_next_list = false;
garray_T zero_width_next_ga;
/*
@@ -1656,8 +1660,9 @@ syn_current_attr (
* If we found a match after the last column, use it.
*/
if (next_match_idx >= 0 && next_match_col >= (int)current_col
- && next_match_col != MAXCOL)
- (void)push_next_match(NULL);
+ && next_match_col != MAXCOL) {
+ (void)push_next_match();
+ }
current_finished = TRUE;
current_state_stored = FALSE;
@@ -1677,13 +1682,13 @@ syn_current_attr (
*/
if (try_next_column) {
next_match_idx = -1;
- try_next_column = FALSE;
+ try_next_column = false;
}
- /* Only check for keywords when not syncing and there are some. */
- do_keywords = !syncing
- && (syn_block->b_keywtab.ht_used > 0
- || syn_block->b_keywtab_ic.ht_used > 0);
+ // Only check for keywords when not syncing and there are some.
+ const bool do_keywords = !syncing
+ && (syn_block->b_keywtab.ht_used > 0
+ || syn_block->b_keywtab_ic.ht_used > 0);
/* Init the list of zero-width matches with a nextlist. This is used to
* avoid matching the same item in the same position twice. */
@@ -1698,9 +1703,9 @@ syn_current_attr (
* column.
*/
do {
- found_match = FALSE;
- keep_next_list = FALSE;
- syn_id = 0;
+ found_match = false;
+ keep_next_list = false;
+ int syn_id = 0;
/*
* 1. Check for a current state.
@@ -1722,16 +1727,12 @@ syn_current_attr (
*/
if (do_keywords) {
line = syn_getcurline();
- if (vim_iswordp_buf(line + current_col, syn_buf)
- && (current_col == 0
- || !vim_iswordp_buf(line + current_col - 1
- - (has_mbyte
- ? (*mb_head_off)(line, line + current_col - 1)
- : 0)
- , syn_buf))) {
- syn_id = check_keyword_id(line, (int)current_col,
- &endcol, &flags, &next_list, cur_si,
- &cchar);
+ const char_u *cur_pos = line + current_col;
+ if (vim_iswordp_buf(cur_pos, syn_buf)
+ && (current_col == 0 || !vim_iswordp_buf(
+ cur_pos - 1 - utf_head_off(line, cur_pos - 1), syn_buf))) {
+ syn_id = check_keyword_id(line, (int)current_col, &endcol, &flags,
+ &next_list, cur_si, &cchar);
if (syn_id != 0) {
push_current_state(KEYWORD_IDX);
{
@@ -1764,8 +1765,9 @@ syn_current_attr (
cur_si->si_trans_id = CUR_STATE(
current_state.ga_len - 2).si_trans_id;
}
- } else
+ } else {
cur_si->si_attr = syn_id2attr(syn_id);
+ }
cur_si->si_cont_list = NULL;
cur_si->si_next_list = next_list;
check_keepend();
@@ -1792,7 +1794,7 @@ syn_current_attr (
next_match_idx = 0; /* no match in this line yet */
next_match_col = MAXCOL;
for (int idx = syn_block->b_syn_patterns.ga_len; --idx >= 0; ) {
- spp = &(SYN_ITEMS(syn_block)[idx]);
+ synpat_T *const spp = &(SYN_ITEMS(syn_block)[idx]);
if ( spp->sp_syncing == syncing
&& (displaying || !(spp->sp_flags & HL_DISPLAY))
&& (spp->sp_type == SPTYPE_MATCH
@@ -1813,13 +1815,14 @@ syn_current_attr (
continue;
spp->sp_line_id = current_line_id;
- lc_col = current_col - spp->sp_offsets[SPO_LC_OFF];
- if (lc_col < 0)
+ colnr_T lc_col = current_col - spp->sp_offsets[SPO_LC_OFF];
+ if (lc_col < 0) {
lc_col = 0;
+ }
regmatch.rmm_ic = spp->sp_ic;
regmatch.regprog = spp->sp_prog;
- int r = syn_regexec(&regmatch, current_lnum, (colnr_T)lc_col,
+ int r = syn_regexec(&regmatch, current_lnum, lc_col,
IF_SYN_TIME(&spp->sp_time));
spp->sp_prog = regmatch.regprog;
if (!r) {
@@ -1858,7 +1861,7 @@ syn_current_attr (
* column, because it may match from there.
*/
if (did_match_already(idx, &zero_width_next_ga)) {
- try_next_column = TRUE;
+ try_next_column = true;
continue;
}
@@ -1920,9 +1923,9 @@ syn_current_attr (
* If an empty string is matched, may need
* to try matching again at next column.
*/
- if (regmatch.startpos[0].col
- == regmatch.endpos[0].col)
- try_next_column = TRUE;
+ if (regmatch.startpos[0].col == regmatch.endpos[0].col) {
+ try_next_column = true;
+ }
continue;
}
}
@@ -1967,17 +1970,18 @@ syn_current_attr (
&& lspp->sp_next_list != NULL) {
current_next_list = lspp->sp_next_list;
current_next_flags = lspp->sp_flags;
- keep_next_list = TRUE;
- zero_width_next_list = TRUE;
+ keep_next_list = true;
+ zero_width_next_list = true;
/* Add the index to a list, so that we can check
* later that we don't match it again (and cause an
* endless loop). */
GA_APPEND(int, &zero_width_next_ga, next_match_idx);
next_match_idx = -1;
- } else
- cur_si = push_next_match(cur_si);
- found_match = TRUE;
+ } else {
+ cur_si = push_next_match();
+ }
+ found_match = true;
}
}
}
@@ -2010,8 +2014,9 @@ syn_current_attr (
*/
current_next_list = NULL;
next_match_idx = -1;
- if (!zero_width_next_list)
- found_match = TRUE;
+ if (!zero_width_next_list) {
+ found_match = true;
+ }
}
} while (found_match);
@@ -2026,6 +2031,7 @@ syn_current_attr (
current_id = 0;
current_trans_id = 0;
current_flags = 0;
+ current_seqnr = 0;
if (cur_si != NULL) {
for (int idx = current_state.ga_len - 1; idx >= 0; --idx) {
sip = &CUR_STATE(idx);
@@ -2114,9 +2120,11 @@ syn_current_attr (
/* nextgroup ends at end of line, unless "skipnl" or "skipempty" present */
if (current_next_list != NULL
- && syn_getcurline()[current_col + 1] == NUL
- && !(current_next_flags & (HL_SKIPNL | HL_SKIPEMPTY)))
+ && (line = syn_getcurline())[current_col] != NUL
+ && line[current_col + 1] == NUL
+ && !(current_next_flags & (HL_SKIPNL | HL_SKIPEMPTY))) {
current_next_list = NULL;
+ }
if (!GA_EMPTY(&zero_width_next_ga))
ga_clear(&zero_width_next_ga);
@@ -2157,9 +2165,10 @@ static int did_match_already(int idx, garray_T *gap)
/*
* Push the next match onto the stack.
*/
-static stateitem_T *push_next_match(stateitem_T *cur_si)
+static stateitem_T *push_next_match(void)
{
- synpat_T *spp;
+ stateitem_T *cur_si;
+ synpat_T *spp;
int save_flags;
spp = &(SYN_ITEMS(syn_block)[next_match_idx]);
@@ -2435,8 +2444,8 @@ static void check_keepend(void)
*
* Return the flags for the matched END.
*/
-static void
-update_si_end (
+static void
+update_si_end(
stateitem_T *sip,
int startcol, /* where to start searching for the end */
int force /* when TRUE overrule a previous end */
@@ -2528,16 +2537,16 @@ static void pop_current_state(void)
* If found, the end of the region and the end of the highlighting is
* computed.
*/
-static void
-find_endpos (
- int idx, /* index of the pattern */
- lpos_T *startpos, /* where to start looking for an END match */
- lpos_T *m_endpos, /* return: end of match */
- lpos_T *hl_endpos, /* return: end of highlighting */
- long *flagsp, /* return: flags of matching END */
- lpos_T *end_endpos, /* return: end of end pattern match */
- int *end_idx, /* return: group ID for end pat. match, or 0 */
- reg_extmatch_T *start_ext /* submatches from the start pattern */
+static void
+find_endpos(
+ int idx, // index of the pattern
+ lpos_T *startpos, // where to start looking for an END match
+ lpos_T *m_endpos, // return: end of match
+ lpos_T *hl_endpos, // return: end of highlighting
+ long *flagsp, // return: flags of matching END
+ lpos_T *end_endpos, // return: end of end pattern match
+ int *end_idx, // return: group ID for end pat. match, or 0
+ reg_extmatch_T *start_ext // submatches from the start pattern
)
{
colnr_T matchcol;
@@ -2770,13 +2779,13 @@ static void limit_pos_zero(lpos_T *pos, lpos_T *limit)
/*
* Add offset to matched text for end of match or highlight.
*/
-static void
-syn_add_end_off (
- lpos_T *result, /* returned position */
- regmmatch_T *regmatch, /* start/end of match */
- synpat_T *spp, /* matched pattern */
- int idx, /* index of offset */
- int extra /* extra chars for offset to start */
+static void
+syn_add_end_off(
+ lpos_T *result, // returned position
+ regmmatch_T *regmatch, // start/end of match
+ synpat_T *spp, // matched pattern
+ int idx, // index of offset
+ int extra // extra chars for offset to start
)
{
int col;
@@ -2801,11 +2810,13 @@ syn_add_end_off (
base = ml_get_buf(syn_buf, result->lnum, FALSE);
p = base + col;
if (off > 0) {
- while (off-- > 0 && *p != NUL)
- mb_ptr_adv(p);
- } else if (off < 0) {
- while (off++ < 0 && base < p)
- mb_ptr_back(base, p);
+ while (off-- > 0 && *p != NUL) {
+ MB_PTR_ADV(p);
+ }
+ } else {
+ while (off++ < 0 && base < p) {
+ MB_PTR_BACK(base, p);
+ }
}
col = (int)(p - base);
}
@@ -2816,13 +2827,13 @@ syn_add_end_off (
* Add offset to matched text for start of match or highlight.
* Avoid resulting column to become negative.
*/
-static void
-syn_add_start_off (
- lpos_T *result, /* returned position */
- regmmatch_T *regmatch, /* start/end of match */
+static void
+syn_add_start_off(
+ lpos_T *result, // returned position
+ regmmatch_T *regmatch, // start/end of match
synpat_T *spp,
int idx,
- int extra /* extra chars for offset to end */
+ int extra // extra chars for offset to end
)
{
int col;
@@ -2848,11 +2859,13 @@ syn_add_start_off (
base = ml_get_buf(syn_buf, result->lnum, FALSE);
p = base + col;
if (off > 0) {
- while (off-- && *p != NUL)
- mb_ptr_adv(p);
- } else if (off < 0) {
- while (off++ && base < p)
- mb_ptr_back(base, p);
+ while (off-- && *p != NUL) {
+ MB_PTR_ADV(p);
+ }
+ } else {
+ while (off++ && base < p) {
+ MB_PTR_BACK(base, p);
+ }
}
col = (int)(p - base);
}
@@ -2881,6 +2894,13 @@ static int syn_regexec(regmmatch_T *rmp, linenr_T lnum, colnr_T col, syn_time_T
pt = profile_start();
}
+ if (rmp->regprog == NULL) {
+ // This can happen if a previous call to vim_regexec_multi() tried to
+ // use the NFA engine, which resulted in NFA_TOO_EXPENSIVE, and
+ // compiling the pattern with the other engine fails.
+ return false;
+ }
+
rmp->rmm_maxcol = syn_buf->b_p_smc;
r = vim_regexec_multi(rmp, syn_win, syn_buf, lnum, col, NULL);
@@ -2906,41 +2926,37 @@ static int syn_regexec(regmmatch_T *rmp, linenr_T lnum, colnr_T col, syn_time_T
/*
* Check one position in a line for a matching keyword.
* The caller must check if a keyword can start at startcol.
- * Return it's ID if found, 0 otherwise.
- */
-static int
-check_keyword_id (
- char_u *line,
- int startcol, /* position in line to check for keyword */
- int *endcolp, /* return: character after found keyword */
- long *flagsp, /* return: flags of matching keyword */
- short **next_listp, /* return: next_list of matching keyword */
- stateitem_T *cur_si, /* item at the top of the stack */
- int *ccharp /* conceal substitution char */
+ * Return its ID if found, 0 otherwise.
+ */
+static int check_keyword_id(
+ char_u *const line,
+ const int startcol, // position in line to check for keyword
+ int *const endcolp, // return: character after found keyword
+ long *const flagsp, // return: flags of matching keyword
+ int16_t **const next_listp, // return: next_list of matching keyword
+ stateitem_T *const cur_si, // item at the top of the stack
+ int *const ccharp // conceal substitution char
)
{
- char_u *kwp;
- int kwlen;
- char_u keyword[MAXKEYWLEN + 1]; /* assume max. keyword len is 80 */
-
- /* Find first character after the keyword. First character was already
- * checked. */
- kwp = line + startcol;
- kwlen = 0;
+ // Find first character after the keyword. First character was already
+ // checked.
+ char_u *const kwp = line + startcol;
+ int kwlen = 0;
do {
- if (has_mbyte)
+ if (has_mbyte) {
kwlen += (*mb_ptr2len)(kwp + kwlen);
- else
- ++kwlen;
+ } else {
+ kwlen++;
+ }
} while (vim_iswordp_buf(kwp + kwlen, syn_buf));
- if (kwlen > MAXKEYWLEN)
+ if (kwlen > MAXKEYWLEN) {
return 0;
+ }
- /*
- * Must make a copy of the keyword, so we can add a NUL and make it
- * lowercase.
- */
+ // Must make a copy of the keyword, so we can add a NUL and make it
+ // lowercase.
+ char_u keyword[MAXKEYWLEN + 1]; // assume max. keyword len is 80
STRLCPY(keyword, kwp, kwlen + 1);
keyentry_T *kp = NULL;
@@ -3003,12 +3019,19 @@ static void syn_cmd_conceal(exarg_T *eap, int syncing)
return;
next = skiptowhite(arg);
- if (STRNICMP(arg, "on", 2) == 0 && next - arg == 2)
- curwin->w_s->b_syn_conceal = TRUE;
- else if (STRNICMP(arg, "off", 3) == 0 && next - arg == 3)
- curwin->w_s->b_syn_conceal = FALSE;
- else
+ if (*arg == NUL) {
+ if (curwin->w_s->b_syn_conceal) {
+ MSG(_("syntax conceal on"));
+ } else {
+ MSG(_("syntax conceal off"));
+ }
+ } else if (STRNICMP(arg, "on", 2) == 0 && next - arg == 2) {
+ curwin->w_s->b_syn_conceal = true;
+ } else if (STRNICMP(arg, "off", 3) == 0 && next - arg == 3) {
+ curwin->w_s->b_syn_conceal = false;
+ } else {
EMSG2(_("E390: Illegal argument: %s"), arg);
+ }
}
/*
@@ -3024,12 +3047,19 @@ static void syn_cmd_case(exarg_T *eap, int syncing)
return;
next = skiptowhite(arg);
- if (STRNICMP(arg, "match", 5) == 0 && next - arg == 5)
- curwin->w_s->b_syn_ic = FALSE;
- else if (STRNICMP(arg, "ignore", 6) == 0 && next - arg == 6)
- curwin->w_s->b_syn_ic = TRUE;
- else
+ if (*arg == NUL) {
+ if (curwin->w_s->b_syn_ic) {
+ MSG(_("syntax case ignore"));
+ } else {
+ MSG(_("syntax case match"));
+ }
+ } else if (STRNICMP(arg, "match", 5) == 0 && next - arg == 5) {
+ curwin->w_s->b_syn_ic = false;
+ } else if (STRNICMP(arg, "ignore", 6) == 0 && next - arg == 6) {
+ curwin->w_s->b_syn_ic = true;
+ } else {
EMSG2(_("E390: Illegal argument: %s"), arg);
+ }
}
/*
@@ -3045,7 +3075,15 @@ static void syn_cmd_spell(exarg_T *eap, int syncing)
return;
next = skiptowhite(arg);
- if (STRNICMP(arg, "toplevel", 8) == 0 && next - arg == 8) {
+ if (*arg == NUL) {
+ if (curwin->w_s->b_syn_spell == SYNSPL_TOP) {
+ MSG(_("syntax spell toplevel"));
+ } else if (curwin->w_s->b_syn_spell == SYNSPL_NOTOP) {
+ MSG(_("syntax spell notoplevel"));
+ } else {
+ MSG(_("syntax spell default"));
+ }
+ } else if (STRNICMP(arg, "toplevel", 8) == 0 && next - arg == 8) {
curwin->w_s->b_syn_spell = SYNSPL_TOP;
} else if (STRNICMP(arg, "notoplevel", 10) == 0 && next - arg == 10) {
curwin->w_s->b_syn_spell = SYNSPL_NOTOP;
@@ -3105,10 +3143,11 @@ static void syn_cmd_iskeyword(exarg_T *eap, int syncing)
*/
void syntax_clear(synblock_T *block)
{
- block->b_syn_error = FALSE; /* clear previous error */
- block->b_syn_ic = FALSE; /* Use case, by default */
- block->b_syn_spell = SYNSPL_DEFAULT; /* default spell checking */
- block->b_syn_containedin = FALSE;
+ block->b_syn_error = false; // clear previous error
+ block->b_syn_ic = false; // Use case, by default
+ block->b_syn_spell = SYNSPL_DEFAULT; // default spell checking
+ block->b_syn_containedin = false;
+ block->b_syn_conceal = false;
/* free the keywords */
clear_keywtab(&block->b_keywtab);
@@ -3258,9 +3297,10 @@ static void syn_cmd_clear(exarg_T *eap, int syncing)
syntax_sync_clear();
else {
syntax_clear(curwin->w_s);
- if (curwin->w_s == &curwin->w_buffer->b_s)
- do_unlet((char_u *)"b:current_syntax", TRUE);
- do_unlet((char_u *)"w:current_syntax", TRUE);
+ if (curwin->w_s == &curwin->w_buffer->b_s) {
+ do_unlet(S_LEN("b:current_syntax"), true);
+ }
+ do_unlet(S_LEN("w:current_syntax"), true);
}
} else {
/*
@@ -3274,12 +3314,10 @@ static void syn_cmd_clear(exarg_T *eap, int syncing)
EMSG2(_("E391: No such syntax cluster: %s"), arg);
break;
} else {
- /*
- * We can't physically delete a cluster without changing
- * the IDs of other clusters, so we do the next best thing
- * and make it empty.
- */
- short scl_id = id - SYNID_CLUSTER;
+ // We can't physically delete a cluster without changing
+ // the IDs of other clusters, so we do the next best thing
+ // and make it empty.
+ int scl_id = id - SYNID_CLUSTER;
xfree(SYN_CLSTR(curwin->w_s)[scl_id].scl_list);
SYN_CLSTR(curwin->w_s)[scl_id].scl_list = NULL;
@@ -3302,7 +3340,7 @@ static void syn_cmd_clear(exarg_T *eap, int syncing)
/*
* Clear one syntax group for the current buffer.
*/
-static void syn_clear_one(int id, int syncing)
+static void syn_clear_one(const int id, const bool syncing)
{
synpat_T *spp;
@@ -3336,7 +3374,7 @@ static void syn_cmd_enable(exarg_T *eap, int syncing)
{
set_internal_string_var((char_u *)"syntax_cmd", (char_u *)"enable");
syn_cmd_onoff(eap, "syntax");
- do_unlet((char_u *)"g:syntax_cmd", TRUE);
+ do_unlet(S_LEN("g:syntax_cmd"), true);
}
/*
@@ -3349,7 +3387,7 @@ static void syn_cmd_reset(exarg_T *eap, int syncing)
if (!eap->skip) {
set_internal_string_var((char_u *)"syntax_cmd", (char_u *)"reset");
do_cmdline_cmd("runtime! syntax/syncolor.vim");
- do_unlet((char_u *)"g:syntax_cmd", TRUE);
+ do_unlet(S_LEN("g:syntax_cmd"), true);
}
}
@@ -3372,11 +3410,11 @@ static void syn_cmd_off(exarg_T *eap, int syncing)
static void syn_cmd_onoff(exarg_T *eap, char *name)
FUNC_ATTR_NONNULL_ALL
{
- did_syntax_onoff = true;
eap->nextcmd = check_nextcmd(eap->arg);
if (!eap->skip) {
+ did_syntax_onoff = true;
char buf[100];
- strncpy(buf, "so ", 4);
+ memcpy(buf, "so ", 4);
vim_snprintf(buf + 3, sizeof(buf) - 3, SYNTAX_FNAME, name);
do_cmdline_cmd(buf);
}
@@ -3395,8 +3433,8 @@ void syn_maybe_on(void)
/*
* Handle ":syntax [list]" command: list current syntax words.
*/
-static void
-syn_cmd_list (
+static void
+syn_cmd_list(
exarg_T *eap,
int syncing /* when TRUE: list syncing items */
)
@@ -3444,8 +3482,8 @@ syn_cmd_list (
/*
* No argument: List all group IDs and all syntax clusters.
*/
- for (int id = 1; id <= highlight_ga.ga_len && !got_int; ++id) {
- syn_list_one(id, syncing, FALSE);
+ for (int id = 1; id <= highlight_ga.ga_len && !got_int; id++) {
+ syn_list_one(id, syncing, false);
}
for (int id = 0; id < curwin->w_s->b_syn_clusters.ga_len && !got_int; ++id) {
syn_list_cluster(id);
@@ -3464,10 +3502,11 @@ syn_cmd_list (
syn_list_cluster(id - SYNID_CLUSTER);
} else {
int id = syn_namen2id(arg, (int)(arg_end - arg));
- if (id == 0)
+ if (id == 0) {
EMSG2(_(e_nogroup), arg);
- else
- syn_list_one(id, syncing, TRUE);
+ } else {
+ syn_list_one(id, syncing, true);
+ }
}
arg = skipwhite(arg_end);
}
@@ -3509,16 +3548,14 @@ static int last_matchgroup;
/*
* List one syntax item, for ":syntax" or "syntax list syntax_name".
*/
-static void
-syn_list_one (
- int id,
- int syncing, /* when TRUE: list syncing items */
- int link_only /* when TRUE; list link-only too */
+static void
+syn_list_one(
+ const int id,
+ const bool syncing, // when true: list syncing items
+ const bool link_only // when true; list link-only too
)
{
- int attr;
- int did_header = FALSE;
- synpat_T *spp;
+ bool did_header = false;
static struct name_list namelist1[] =
{
{HL_DISPLAY, "display"},
@@ -3541,23 +3578,26 @@ syn_list_one (
{0, NULL}
};
- attr = hl_attr(HLF_D); /* highlight like directories */
+ const int attr = HL_ATTR(HLF_D); // highlight like directories
- /* list the keywords for "id" */
+ // list the keywords for "id"
if (!syncing) {
- did_header = syn_list_keywords(id, &curwin->w_s->b_keywtab, FALSE, attr);
+ did_header = syn_list_keywords(id, &curwin->w_s->b_keywtab, false, attr);
did_header = syn_list_keywords(id, &curwin->w_s->b_keywtab_ic,
- did_header, attr);
+ did_header, attr);
}
- /* list the patterns for "id" */
- for (int idx = 0; idx < curwin->w_s->b_syn_patterns.ga_len && !got_int; ++idx) {
- spp = &(SYN_ITEMS(curwin->w_s)[idx]);
- if (spp->sp_syn.id != id || spp->sp_syncing != syncing)
+ // list the patterns for "id"
+ for (int idx = 0;
+ idx < curwin->w_s->b_syn_patterns.ga_len && !got_int;
+ idx++) {
+ const synpat_T *const spp = &(SYN_ITEMS(curwin->w_s)[idx]);
+ if (spp->sp_syn.id != id || spp->sp_syncing != syncing) {
continue;
+ }
(void)syn_list_header(did_header, 999, id);
- did_header = TRUE;
+ did_header = true;
last_matchgroup = 0;
if (spp->sp_type == SPTYPE_MATCH) {
put_pattern("match", ' ', spp, attr);
@@ -3575,22 +3615,24 @@ syn_list_one (
}
syn_list_flags(namelist1, spp->sp_flags, attr);
- if (spp->sp_cont_list != NULL)
- put_id_list((char_u *)"contains", spp->sp_cont_list, attr);
+ if (spp->sp_cont_list != NULL) {
+ put_id_list("contains", spp->sp_cont_list, attr);
+ }
- if (spp->sp_syn.cont_in_list != NULL)
- put_id_list((char_u *)"containedin",
- spp->sp_syn.cont_in_list, attr);
+ if (spp->sp_syn.cont_in_list != NULL) {
+ put_id_list("containedin", spp->sp_syn.cont_in_list, attr);
+ }
if (spp->sp_next_list != NULL) {
- put_id_list((char_u *)"nextgroup", spp->sp_next_list, attr);
+ put_id_list("nextgroup", spp->sp_next_list, attr);
syn_list_flags(namelist2, spp->sp_flags, attr);
}
if (spp->sp_flags & (HL_SYNC_HERE|HL_SYNC_THERE)) {
- if (spp->sp_flags & HL_SYNC_HERE)
- msg_puts_attr((char_u *)"grouphere", attr);
- else
- msg_puts_attr((char_u *)"groupthere", attr);
+ if (spp->sp_flags & HL_SYNC_HERE) {
+ msg_puts_attr("grouphere", attr);
+ } else {
+ msg_puts_attr("groupthere", attr);
+ }
msg_putchar(' ');
if (spp->sp_sync_idx >= 0)
msg_outtrans(HL_TABLE()[SYN_ITEMS(curwin->w_s)
@@ -3604,7 +3646,7 @@ syn_list_one (
/* list the link, if there is one */
if (HL_TABLE()[id - 1].sg_link && (did_header || link_only) && !got_int) {
(void)syn_list_header(did_header, 999, id);
- msg_puts_attr((char_u *)"links to", attr);
+ msg_puts_attr("links to", attr);
msg_putchar(' ');
msg_outtrans(HL_TABLE()[HL_TABLE()[id - 1].sg_link - 1].sg_name);
}
@@ -3616,7 +3658,7 @@ static void syn_list_flags(struct name_list *nlist, int flags, int attr)
for (i = 0; nlist[i].flag != 0; ++i)
if (flags & nlist[i].flag) {
- msg_puts_attr((char_u *)nlist[i].name, attr);
+ msg_puts_attr(nlist[i].name, attr);
msg_putchar(' ');
}
}
@@ -3639,32 +3681,32 @@ static void syn_list_cluster(int id)
msg_advance(endcol);
if (SYN_CLSTR(curwin->w_s)[id].scl_list != NULL) {
- put_id_list((char_u *)"cluster", SYN_CLSTR(curwin->w_s)[id].scl_list,
- hl_attr(HLF_D));
+ put_id_list("cluster", SYN_CLSTR(curwin->w_s)[id].scl_list, HL_ATTR(HLF_D));
} else {
- msg_puts_attr((char_u *)"cluster", hl_attr(HLF_D));
- msg_puts((char_u *)"=NONE");
+ msg_puts_attr("cluster", HL_ATTR(HLF_D));
+ msg_puts("=NONE");
}
}
-static void put_id_list(char_u *name, short *list, int attr)
+static void put_id_list(const char *const name,
+ const int16_t *const list,
+ const int attr)
{
- short *p;
-
msg_puts_attr(name, attr);
msg_putchar('=');
- for (p = list; *p; ++p) {
+ for (const int16_t *p = list; *p; p++) {
if (*p >= SYNID_ALLBUT && *p < SYNID_TOP) {
- if (p[1])
- MSG_PUTS("ALLBUT");
- else
- MSG_PUTS("ALL");
+ if (p[1]) {
+ msg_puts("ALLBUT");
+ } else {
+ msg_puts("ALL");
+ }
} else if (*p >= SYNID_TOP && *p < SYNID_CONTAINED) {
- MSG_PUTS("TOP");
+ msg_puts("TOP");
} else if (*p >= SYNID_CONTAINED && *p < SYNID_CLUSTER) {
- MSG_PUTS("CONTAINED");
+ msg_puts("CONTAINED");
} else if (*p >= SYNID_CLUSTER) {
- short scl_id = *p - SYNID_CLUSTER;
+ int scl_id = *p - SYNID_CLUSTER;
msg_putchar('@');
msg_outtrans(SYN_CLSTR(curwin->w_s)[scl_id].scl_name);
@@ -3676,18 +3718,16 @@ static void put_id_list(char_u *name, short *list, int attr)
msg_putchar(' ');
}
-static void put_pattern(char *s, int c, synpat_T *spp, int attr)
+static void put_pattern(const char *const s, const int c,
+ const synpat_T *const spp, const int attr)
{
- long n;
- int mask;
- int first;
- static char *sepchars = "/+=-#@\"|'^&";
+ static const char *const sepchars = "/+=-#@\"|'^&";
int i;
/* May have to write "matchgroup=group" */
if (last_matchgroup != spp->sp_syn_match_id) {
last_matchgroup = spp->sp_syn_match_id;
- msg_puts_attr((char_u *)"matchgroup", attr);
+ msg_puts_attr("matchgroup", attr);
msg_putchar('=');
if (last_matchgroup == 0)
msg_outtrans((char_u *)"NONE");
@@ -3696,8 +3736,8 @@ static void put_pattern(char *s, int c, synpat_T *spp, int attr)
msg_putchar(' ');
}
- /* output the name of the pattern and an '=' or ' ' */
- msg_puts_attr((char_u *)s, attr);
+ // Output the name of the pattern and an '=' or ' '.
+ msg_puts_attr(s, attr);
msg_putchar(c);
/* output the pattern, in between a char that is not in the pattern */
@@ -3710,17 +3750,18 @@ static void put_pattern(char *s, int c, synpat_T *spp, int attr)
msg_outtrans(spp->sp_pattern);
msg_putchar(sepchars[i]);
- /* output any pattern options */
- first = TRUE;
- for (i = 0; i < SPO_COUNT; ++i) {
- mask = (1 << i);
+ // output any pattern options
+ bool first = true;
+ for (i = 0; i < SPO_COUNT; i++) {
+ const int mask = (1 << i);
if (!(spp->sp_off_flags & (mask + (mask << SPO_COUNT)))) {
continue;
}
- if (!first)
- msg_putchar(','); /* separate with commas */
- msg_puts((char_u *)spo_name_tab[i]);
- n = spp->sp_offsets[i];
+ if (!first) {
+ msg_putchar(','); // Separate with commas.
+ }
+ msg_puts(spo_name_tab[i]);
+ const long n = spp->sp_offsets[i];
if (i != SPO_LC_OFF) {
if (spp->sp_off_flags & mask)
msg_putchar('s');
@@ -3729,47 +3770,40 @@ static void put_pattern(char *s, int c, synpat_T *spp, int attr)
if (n > 0)
msg_putchar('+');
}
- if (n || i == SPO_LC_OFF)
+ if (n || i == SPO_LC_OFF) {
msg_outnum(n);
- first = FALSE;
+ }
+ first = false;
}
msg_putchar(' ');
}
-/*
- * List or clear the keywords for one syntax group.
- * Return TRUE if the header has been printed.
- */
-static int
-syn_list_keywords (
- int id,
- hashtab_T *ht,
- int did_header, /* header has already been printed */
- int attr
+// List or clear the keywords for one syntax group.
+// Return true if the header has been printed.
+static bool syn_list_keywords(
+ const int id,
+ const hashtab_T *const ht,
+ bool did_header, // header has already been printed
+ const int attr
)
{
int outlen;
- hashitem_T *hi;
- keyentry_T *kp;
- int todo;
int prev_contained = 0;
- short *prev_next_list = NULL;
- short *prev_cont_in_list = NULL;
+ const int16_t *prev_next_list = NULL;
+ const int16_t *prev_cont_in_list = NULL;
int prev_skipnl = 0;
int prev_skipwhite = 0;
int prev_skipempty = 0;
- /*
- * Unfortunately, this list of keywords is not sorted on alphabet but on
- * hash value...
- */
- todo = (int)ht->ht_used;
- for (hi = ht->ht_array; todo > 0 && !got_int; ++hi) {
+ // Unfortunately, this list of keywords is not sorted on alphabet but on
+ // hash value...
+ size_t todo = ht->ht_used;
+ for (const hashitem_T *hi = ht->ht_array; todo > 0 && !got_int; hi++) {
if (HASHITEM_EMPTY(hi)) {
continue;
}
- --todo;
- for (kp = HI2KE(hi); kp != NULL && !got_int; kp = kp->ke_next) {
+ todo--;
+ for (keyentry_T *kp = HI2KE(hi); kp != NULL && !got_int; kp = kp->ke_next) {
if (kp->k_syn.id == id) {
if (prev_contained != (kp->flags & HL_CONTAINED)
|| prev_skipnl != (kp->flags & HL_SKIPNL)
@@ -3789,34 +3823,33 @@ syn_list_keywords (
prev_skipwhite = 0;
prev_skipempty = 0;
}
- did_header = TRUE;
+ did_header = true;
if (prev_contained != (kp->flags & HL_CONTAINED)) {
- msg_puts_attr((char_u *)"contained", attr);
+ msg_puts_attr("contained", attr);
msg_putchar(' ');
prev_contained = (kp->flags & HL_CONTAINED);
}
if (kp->k_syn.cont_in_list != prev_cont_in_list) {
- put_id_list((char_u *)"containedin",
- kp->k_syn.cont_in_list, attr);
+ put_id_list("containedin", kp->k_syn.cont_in_list, attr);
msg_putchar(' ');
prev_cont_in_list = kp->k_syn.cont_in_list;
}
if (kp->next_list != prev_next_list) {
- put_id_list((char_u *)"nextgroup", kp->next_list, attr);
+ put_id_list("nextgroup", kp->next_list, attr);
msg_putchar(' ');
prev_next_list = kp->next_list;
if (kp->flags & HL_SKIPNL) {
- msg_puts_attr((char_u *)"skipnl", attr);
+ msg_puts_attr("skipnl", attr);
msg_putchar(' ');
prev_skipnl = (kp->flags & HL_SKIPNL);
}
if (kp->flags & HL_SKIPWHITE) {
- msg_puts_attr((char_u *)"skipwhite", attr);
+ msg_puts_attr("skipwhite", attr);
msg_putchar(' ');
prev_skipwhite = (kp->flags & HL_SKIPWHITE);
}
if (kp->flags & HL_SKIPEMPTY) {
- msg_puts_attr((char_u *)"skipempty", attr);
+ msg_puts_attr("skipempty", attr);
msg_putchar(' ');
prev_skipempty = (kp->flags & HL_SKIPEMPTY);
}
@@ -3901,19 +3934,19 @@ static void clear_keywtab(hashtab_T *ht)
/// @param flags flags for this keyword
/// @param cont_in_list containedin for this keyword
/// @param next_list nextgroup for this keyword
-static void add_keyword(char_u *name,
- int id,
- int flags,
- short *cont_in_list,
- short *next_list,
- int conceal_char)
+static void add_keyword(char_u *const name,
+ const int id,
+ const int flags,
+ int16_t *const cont_in_list,
+ int16_t *const next_list,
+ const int conceal_char)
{
char_u name_folded[MAXKEYWLEN + 1];
- char_u *name_ic = (curwin->w_s->b_syn_ic)
- ? str_foldcase(name, (int)STRLEN(name), name_folded, sizeof(name_folded))
- : name;
+ const char_u *const name_ic = (curwin->w_s->b_syn_ic)
+ ? str_foldcase(name, (int)STRLEN(name), name_folded, sizeof(name_folded))
+ : name;
- keyentry_T *kp = xmalloc(sizeof(keyentry_T) + STRLEN(name_ic));
+ keyentry_T *const kp = xmalloc(sizeof(keyentry_T) + STRLEN(name_ic));
STRCPY(kp->keyword, name_ic);
kp->k_syn.id = id;
kp->k_syn.inc_tag = current_syn_inc_tag;
@@ -3925,10 +3958,12 @@ static void add_keyword(char_u *name,
}
kp->next_list = copy_id_list(next_list);
- hash_T hash = hash_hash(kp->keyword);
- hashtab_T *ht = (curwin->w_s->b_syn_ic) ? &curwin->w_s->b_keywtab_ic
- : &curwin->w_s->b_keywtab;
- hashitem_T *hi = hash_lookup(ht, kp->keyword, hash);
+ const hash_T hash = hash_hash(kp->keyword);
+ hashtab_T *const ht = (curwin->w_s->b_syn_ic)
+ ? &curwin->w_s->b_keywtab_ic
+ : &curwin->w_s->b_keywtab;
+ hashitem_T *const hi = hash_lookup(ht, (const char *)kp->keyword,
+ STRLEN(kp->keyword), hash);
// even though it looks like only the kp->keyword member is
// being used here, vim uses some pointer trickery to get the orignal
@@ -3979,18 +4014,19 @@ get_group_name (
* Return NULL for any error;
*/
static char_u *
-get_syn_options (
- char_u *arg, /* next argument to be checked */
- syn_opt_arg_T *opt, /* various things */
- int *conceal_char
+get_syn_options(
+ char_u *arg, // next argument to be checked
+ syn_opt_arg_T *opt, // various things
+ int *conceal_char,
+ int skip // TRUE if skipping over command
)
{
char_u *gname_start, *gname;
int syn_id;
- int len;
+ int len = 0;
char *p;
int fidx;
- static struct flag {
+ static const struct flag {
char *name;
int argtype;
int flags;
@@ -4013,7 +4049,7 @@ get_syn_options (
{"cCoOnNtTaAiInNsS", 1, 0},
{"cCoOnNtTaAiInNeEdDiInN", 2, 0},
{"nNeExXtTgGrRoOuUpP", 3, 0},};
- static char *first_letters = "cCoOkKeEtTsSgGdDfFnN";
+ static const char *const first_letters = "cCoOkKeEtTsSgGdDfFnN";
if (arg == NULL) /* already detected error */
return NULL;
@@ -4033,9 +4069,10 @@ get_syn_options (
for (fidx = ARRAY_SIZE(flagtab); --fidx >= 0; ) {
p = flagtab[fidx].name;
int i;
- for (i = 0, len = 0; p[i] != NUL; i += 2, ++len)
+ for (i = 0, len = 0; p[i] != NUL; i += 2, ++len) {
if (arg[len] != p[i] && arg[len] != p[i + 1])
break;
+ }
if (p[i] == NUL && (ascii_iswhite(arg[len])
|| (flagtab[fidx].argtype > 0
? arg[len] == '='
@@ -4057,22 +4094,21 @@ get_syn_options (
EMSG(_("E395: contains argument not accepted here"));
return NULL;
}
- if (get_id_list(&arg, 8, &opt->cont_list) == FAIL)
+ if (get_id_list(&arg, 8, &opt->cont_list, skip) == FAIL) {
return NULL;
+ }
} else if (flagtab[fidx].argtype == 2) {
- if (get_id_list(&arg, 11, &opt->cont_in_list) == FAIL)
+ if (get_id_list(&arg, 11, &opt->cont_in_list, skip) == FAIL) {
return NULL;
+ }
} else if (flagtab[fidx].argtype == 3) {
- if (get_id_list(&arg, 9, &opt->next_list) == FAIL)
+ if (get_id_list(&arg, 9, &opt->next_list, skip) == FAIL) {
return NULL;
- } else if (flagtab[fidx].argtype == 11 && arg[5] == '=') {
- /* cchar=? */
- if (has_mbyte) {
- *conceal_char = mb_ptr2char(arg + 6);
- arg += mb_ptr2len(arg + 6) - 1;
- } else {
- *conceal_char = arg[6];
}
+ } else if (flagtab[fidx].argtype == 11 && arg[5] == '=') {
+ // cchar=?
+ *conceal_char = utf_ptr2char(arg + 6);
+ arg += mb_ptr2len(arg + 6) - 1;
if (!vim_isprintc_strict(*conceal_char)) {
EMSG(_("E844: invalid cchar value"));
return NULL;
@@ -4134,8 +4170,8 @@ static void syn_incl_toplevel(int id, int *flagsp)
return;
*flagsp |= HL_CONTAINED;
if (curwin->w_s->b_syn_topgrp >= SYNID_CLUSTER) {
- /* We have to alloc this, because syn_combine_list() will free it. */
- short *grp_list = xmalloc(2 * sizeof(short));
+ // We have to alloc this, because syn_combine_list() will free it.
+ int16_t *grp_list = xmalloc(2 * sizeof(*grp_list));
int tlg_id = curwin->w_s->b_syn_topgrp - SYNID_CLUSTER;
grp_list[0] = id;
@@ -4183,11 +4219,11 @@ static void syn_cmd_include(exarg_T *eap, int syncing)
*/
eap->argt |= (XFILE | NOSPC);
separate_nextcmd(eap);
- if (*eap->arg == '<' || *eap->arg == '$' || path_is_absolute_path(eap->arg)) {
- /* For an absolute path, "$VIM/..." or "<sfile>.." we ":source" the
- * file. Need to expand the file name first. In other cases
- * ":runtime!" is used. */
- source = TRUE;
+ if (*eap->arg == '<' || *eap->arg == '$' || path_is_absolute(eap->arg)) {
+ // For an absolute path, "$VIM/..." or "<sfile>.." we ":source" the
+ // file. Need to expand the file name first. In other cases
+ // ":runtime!" is used.
+ source = true;
if (expand_filename(eap, syn_cmdlinep, &errormsg) == FAIL) {
if (errormsg != NULL)
EMSG(errormsg);
@@ -4234,84 +4270,86 @@ static void syn_cmd_keyword(exarg_T *eap, int syncing)
rest = get_group_name(arg, &group_name_end);
if (rest != NULL) {
- syn_id = syn_check_group(arg, (int)(group_name_end - arg));
- if (syn_id != 0)
- /* allocate a buffer, for removing backslashes in the keyword */
+ if (eap->skip) {
+ syn_id = -1;
+ } else {
+ syn_id = syn_check_group(arg, (int)(group_name_end - arg));
+ }
+ if (syn_id != 0) {
+ // Allocate a buffer, for removing backslashes in the keyword.
keyword_copy = xmalloc(STRLEN(rest) + 1);
- syn_opt_arg.flags = 0;
- syn_opt_arg.keyword = TRUE;
- syn_opt_arg.sync_idx = NULL;
- syn_opt_arg.has_cont_list = FALSE;
- syn_opt_arg.cont_in_list = NULL;
- syn_opt_arg.next_list = NULL;
-
- /*
- * The options given apply to ALL keywords, so all options must be
- * found before keywords can be created.
- * 1: collect the options and copy the keywords to keyword_copy.
- */
- cnt = 0;
- p = keyword_copy;
- for (; rest != NULL && !ends_excmd(*rest); rest = skipwhite(rest)) {
- rest = get_syn_options(rest, &syn_opt_arg, &conceal_char);
- if (rest == NULL || ends_excmd(*rest))
- break;
- /* Copy the keyword, removing backslashes, and add a NUL. */
- while (*rest != NUL && !ascii_iswhite(*rest)) {
- if (*rest == '\\' && rest[1] != NUL)
- ++rest;
- *p++ = *rest++;
- }
- *p++ = NUL;
- ++cnt;
}
+ if (keyword_copy != NULL) {
+ syn_opt_arg.flags = 0;
+ syn_opt_arg.keyword = true;
+ syn_opt_arg.sync_idx = NULL;
+ syn_opt_arg.has_cont_list = false;
+ syn_opt_arg.cont_in_list = NULL;
+ syn_opt_arg.next_list = NULL;
+
+ // The options given apply to ALL keywords, so all options must be
+ // found before keywords can be created.
+ // 1: collect the options and copy the keywords to keyword_copy.
+ cnt = 0;
+ p = keyword_copy;
+ for (; rest != NULL && !ends_excmd(*rest); rest = skipwhite(rest)) {
+ rest = get_syn_options(rest, &syn_opt_arg, &conceal_char, eap->skip);
+ if (rest == NULL || ends_excmd(*rest)) {
+ break;
+ }
+ // Copy the keyword, removing backslashes, and add a NUL.
+ while (*rest != NUL && !ascii_iswhite(*rest)) {
+ if (*rest == '\\' && rest[1] != NUL) {
+ rest++;
+ }
+ *p++ = *rest++;
+ }
+ *p++ = NUL;
+ cnt++;
+ }
- if (!eap->skip) {
- /* Adjust flags for use of ":syn include". */
- syn_incl_toplevel(syn_id, &syn_opt_arg.flags);
+ if (!eap->skip) {
+ // Adjust flags for use of ":syn include".
+ syn_incl_toplevel(syn_id, &syn_opt_arg.flags);
- /*
- * 2: Add an entry for each keyword.
- */
- for (kw = keyword_copy; --cnt >= 0; kw += STRLEN(kw) + 1) {
- for (p = vim_strchr(kw, '[');; ) {
- if (p != NULL)
- *p = NUL;
- add_keyword(kw, syn_id, syn_opt_arg.flags,
- syn_opt_arg.cont_in_list,
- syn_opt_arg.next_list, conceal_char);
- if (p == NULL)
- break;
- if (p[1] == NUL) {
- EMSG2(_("E789: Missing ']': %s"), kw);
- goto error;
- }
- if (p[1] == ']') {
- if (p[2] != NUL) {
- EMSG3(_("E890: trailing char after ']': %s]%s"),
- kw, &p[2]);
+ // 2: Add an entry for each keyword.
+ for (kw = keyword_copy; --cnt >= 0; kw += STRLEN(kw) + 1) {
+ for (p = vim_strchr(kw, '[');; ) {
+ if (p != NULL) {
+ *p = NUL;
+ }
+ add_keyword(kw, syn_id, syn_opt_arg.flags,
+ syn_opt_arg.cont_in_list,
+ syn_opt_arg.next_list, conceal_char);
+ if (p == NULL) {
+ break;
+ }
+ if (p[1] == NUL) {
+ emsgf(_("E789: Missing ']': %s"), kw);
goto error;
}
- kw = p + 1;
- break; // skip over the "]"
- }
- if (has_mbyte) {
- int l = (*mb_ptr2len)(p + 1);
+ if (p[1] == ']') {
+ if (p[2] != NUL) {
+ emsgf(_("E890: trailing char after ']': %s]%s"),
+ kw, &p[2]);
+ goto error;
+ }
+ kw = p + 1;
+ break; // skip over the "]"
+ }
+ const int l = (*mb_ptr2len)(p + 1);
memmove(p, p + 1, l);
p += l;
- } else {
- p[0] = p[1];
- ++p;
}
}
}
- }
error:
- xfree(keyword_copy);
- xfree(syn_opt_arg.cont_in_list);
- xfree(syn_opt_arg.next_list);
+ xfree(keyword_copy);
+ xfree(syn_opt_arg.cont_in_list);
+ xfree(syn_opt_arg.next_list);
+ }
}
if (rest != NULL)
@@ -4328,8 +4366,8 @@ error:
*
* Also ":syntax sync match {name} [[grouphere | groupthere] {group-name}] .."
*/
-static void
-syn_cmd_match (
+static void
+syn_cmd_match(
exarg_T *eap,
int syncing /* TRUE for ":syntax sync match .. " */
)
@@ -4348,23 +4386,24 @@ syn_cmd_match (
/* Get options before the pattern */
syn_opt_arg.flags = 0;
- syn_opt_arg.keyword = FALSE;
+ syn_opt_arg.keyword = false;
syn_opt_arg.sync_idx = syncing ? &sync_idx : NULL;
- syn_opt_arg.has_cont_list = TRUE;
+ syn_opt_arg.has_cont_list = true;
syn_opt_arg.cont_list = NULL;
syn_opt_arg.cont_in_list = NULL;
syn_opt_arg.next_list = NULL;
- rest = get_syn_options(rest, &syn_opt_arg, &conceal_char);
+ rest = get_syn_options(rest, &syn_opt_arg, &conceal_char, eap->skip);
/* get the pattern. */
init_syn_patterns();
memset(&item, 0, sizeof(item));
rest = get_syn_pattern(rest, &item);
- if (vim_regcomp_had_eol() && !(syn_opt_arg.flags & HL_EXCLUDENL))
+ if (vim_regcomp_had_eol() && !(syn_opt_arg.flags & HL_EXCLUDENL)) {
syn_opt_arg.flags |= HL_HAS_EOL;
+ }
- /* Get options after the pattern */
- rest = get_syn_options(rest, &syn_opt_arg, &conceal_char);
+ // Get options after the pattern
+ rest = get_syn_options(rest, &syn_opt_arg, &conceal_char, eap->skip);
if (rest != NULL) { /* all arguments are valid */
/*
@@ -4425,8 +4464,8 @@ syn_cmd_match (
* Handle ":syntax region {group-name} [matchgroup={group-name}]
* start {start} .. [skip {skip}] end {end} .. [{options}]".
*/
-static void
-syn_cmd_region (
+static void
+syn_cmd_region(
exarg_T *eap,
int syncing /* TRUE for ":syntax sync region .." */
)
@@ -4469,21 +4508,20 @@ syn_cmd_region (
init_syn_patterns();
syn_opt_arg.flags = 0;
- syn_opt_arg.keyword = FALSE;
+ syn_opt_arg.keyword = false;
syn_opt_arg.sync_idx = NULL;
- syn_opt_arg.has_cont_list = TRUE;
+ syn_opt_arg.has_cont_list = true;
syn_opt_arg.cont_list = NULL;
syn_opt_arg.cont_in_list = NULL;
syn_opt_arg.next_list = NULL;
- /*
- * get the options, patterns and matchgroup.
- */
+ // get the options, patterns and matchgroup.
while (rest != NULL && !ends_excmd(*rest)) {
- /* Check for option arguments */
- rest = get_syn_options(rest, &syn_opt_arg, &conceal_char);
- if (rest == NULL || ends_excmd(*rest))
+ // Check for option arguments
+ rest = get_syn_options(rest, &syn_opt_arg, &conceal_char, eap->skip);
+ if (rest == NULL || ends_excmd(*rest)) {
break;
+ }
/* must be a pattern or matchgroup then */
key_end = rest;
@@ -4491,20 +4529,21 @@ syn_cmd_region (
++key_end;
xfree(key);
key = vim_strnsave_up(rest, (int)(key_end - rest));
- if (STRCMP(key, "MATCHGROUP") == 0)
+ if (STRCMP(key, "MATCHGROUP") == 0) {
item = ITEM_MATCHGROUP;
- else if (STRCMP(key, "START") == 0)
+ } else if (STRCMP(key, "START") == 0) {
item = ITEM_START;
- else if (STRCMP(key, "END") == 0)
+ } else if (STRCMP(key, "END") == 0) {
item = ITEM_END;
- else if (STRCMP(key, "SKIP") == 0) {
- if (pat_ptrs[ITEM_SKIP] != NULL) { /* one skip pattern allowed */
- illegal = TRUE;
+ } else if (STRCMP(key, "SKIP") == 0) {
+ if (pat_ptrs[ITEM_SKIP] != NULL) { // One skip pattern allowed.
+ illegal = true;
break;
}
item = ITEM_SKIP;
- } else
+ } else {
break;
+ }
rest = skipwhite(key_end);
if (*rest != '=') {
rest = NULL;
@@ -4540,21 +4579,23 @@ syn_cmd_region (
pat_ptrs[item] = ppp;
ppp->pp_synp = xcalloc(1, sizeof(synpat_T));
- /*
- * Get the syntax pattern and the following offset(s).
- */
- /* Enable the appropriate \z specials. */
- if (item == ITEM_START)
+ // Get the syntax pattern and the following offset(s).
+
+ // Enable the appropriate \z specials.
+ if (item == ITEM_START) {
reg_do_extmatch = REX_SET;
- else if (item == ITEM_SKIP || item == ITEM_END)
+ } else {
+ assert(item == ITEM_SKIP || item == ITEM_END);
reg_do_extmatch = REX_USE;
+ }
rest = get_syn_pattern(rest, ppp->pp_synp);
reg_do_extmatch = 0;
if (item == ITEM_END && vim_regcomp_had_eol()
- && !(syn_opt_arg.flags & HL_EXCLUDENL))
+ && !(syn_opt_arg.flags & HL_EXCLUDENL)) {
ppp->pp_synp->sp_flags |= HL_HAS_EOL;
+ }
ppp->pp_matchgroup_id = matchgroup_id;
- ++pat_count;
+ pat_count++;
}
}
xfree(key);
@@ -4647,30 +4688,25 @@ syn_cmd_region (
}
}
-/*
- * A simple syntax group ID comparison function suitable for use in qsort()
- */
-static int syn_compare_stub(const void *v1, const void *v2)
+// A simple syntax group ID comparison function suitable for use in qsort()
+static int syn_compare_stub(const void *const v1, const void *const v2)
{
- const short *s1 = v1;
- const short *s2 = v2;
+ const int16_t *const s1 = v1;
+ const int16_t *const s2 = v2;
return *s1 > *s2 ? 1 : *s1 < *s2 ? -1 : 0;
}
-/*
- * Combines lists of syntax clusters.
- * *clstr1 and *clstr2 must both be allocated memory; they will be consumed.
- */
-static void syn_combine_list(short **clstr1, short **clstr2, int list_op)
+// Combines lists of syntax clusters.
+// *clstr1 and *clstr2 must both be allocated memory; they will be consumed.
+static void syn_combine_list(int16_t **const clstr1, int16_t **const clstr2,
+ const int list_op)
{
- int count1 = 0;
- int count2 = 0;
- short *g1;
- short *g2;
- short *clstr = NULL;
- int count;
- int round;
+ size_t count1 = 0;
+ size_t count2 = 0;
+ const int16_t *g1;
+ const int16_t *g2;
+ int16_t *clstr = NULL;
/*
* Handle degenerate cases.
@@ -4687,27 +4723,25 @@ static void syn_combine_list(short **clstr1, short **clstr2, int list_op)
return;
}
- for (g1 = *clstr1; *g1; g1++)
- ++count1;
- for (g2 = *clstr2; *g2; g2++)
- ++count2;
+ for (g1 = *clstr1; *g1; g1++) {
+ count1++;
+ }
+ for (g2 = *clstr2; *g2; g2++) {
+ count2++;
+ }
- /*
- * For speed purposes, sort both lists.
- */
- qsort(*clstr1, (size_t)count1, sizeof(short), syn_compare_stub);
- qsort(*clstr2, (size_t)count2, sizeof(short), syn_compare_stub);
+ // For speed purposes, sort both lists.
+ qsort(*clstr1, count1, sizeof(**clstr1), syn_compare_stub);
+ qsort(*clstr2, count2, sizeof(**clstr2), syn_compare_stub);
- /*
- * We proceed in two passes; in round 1, we count the elements to place
- * in the new list, and in round 2, we allocate and populate the new
- * list. For speed, we use a mergesort-like method, adding the smaller
- * of the current elements in each list to the new list.
- */
- for (round = 1; round <= 2; round++) {
+ // We proceed in two passes; in round 1, we count the elements to place
+ // in the new list, and in round 2, we allocate and populate the new
+ // list. For speed, we use a mergesort-like method, adding the smaller
+ // of the current elements in each list to the new list.
+ for (int round = 1; round <= 2; round++) {
g1 = *clstr1;
g2 = *clstr2;
- count = 0;
+ int count = 0;
/*
* First, loop through the lists until one of them is empty.
@@ -4759,7 +4793,7 @@ static void syn_combine_list(short **clstr1, short **clstr2, int list_op)
clstr = NULL;
break;
}
- clstr = xmalloc((count + 1) * sizeof(short));
+ clstr = xmalloc((count + 1) * sizeof(*clstr));
clstr[count] = 0;
}
}
@@ -4772,10 +4806,8 @@ static void syn_combine_list(short **clstr1, short **clstr2, int list_op)
*clstr1 = clstr;
}
-/*
- * Lookup a syntax cluster name and return it's ID.
- * If it is not found, 0 is returned.
- */
+// Lookup a syntax cluster name and return its ID.
+// If it is not found, 0 is returned.
static int syn_scl_name2id(char_u *name)
{
// Avoid using stricmp() too much, it's slow on some systems
@@ -4803,12 +4835,10 @@ static int syn_scl_namen2id(char_u *linep, int len)
return id;
}
-/*
- * Find syntax cluster name in the table and return it's ID.
- * The argument is a pointer to the name and the length of the name.
- * If it doesn't exist yet, a new entry is created.
- * Return 0 for failure.
- */
+// Find syntax cluster name in the table and return its ID.
+// The argument is a pointer to the name and the length of the name.
+// If it doesn't exist yet, a new entry is created.
+// Return 0 for failure.
static int syn_check_cluster(char_u *pp, int len)
{
int id;
@@ -4824,11 +4854,9 @@ static int syn_check_cluster(char_u *pp, int len)
return id;
}
-/*
- * Add new syntax cluster and return it's ID.
- * "name" must be an allocated string, it will be consumed.
- * Return 0 for failure.
- */
+// Add new syntax cluster and return its ID.
+// "name" must be an allocated string, it will be consumed.
+// Return 0 for failure.
static int syn_add_cluster(char_u *name)
{
/*
@@ -4870,9 +4898,7 @@ static void syn_cmd_cluster(exarg_T *eap, int syncing)
char_u *arg = eap->arg;
char_u *group_name_end;
char_u *rest;
- int scl_id;
- short *clstr_list;
- int got_clstr = FALSE;
+ bool got_clstr = false;
int opt_len;
int list_op;
@@ -4883,9 +4909,10 @@ static void syn_cmd_cluster(exarg_T *eap, int syncing)
rest = get_group_name(arg, &group_name_end);
if (rest != NULL) {
- scl_id = syn_check_cluster(arg, (int)(group_name_end - arg));
- if (scl_id == 0)
+ int scl_id = syn_check_cluster(arg, (int)(group_name_end - arg));
+ if (scl_id == 0) {
return;
+ }
scl_id -= SYNID_CLUSTER;
for (;; ) {
@@ -4904,14 +4931,18 @@ static void syn_cmd_cluster(exarg_T *eap, int syncing)
} else
break;
- clstr_list = NULL;
- if (get_id_list(&rest, opt_len, &clstr_list) == FAIL) {
+ int16_t *clstr_list = NULL;
+ if (get_id_list(&rest, opt_len, &clstr_list, eap->skip) == FAIL) {
EMSG2(_(e_invarg2), rest);
break;
}
- syn_combine_list(&SYN_CLSTR(curwin->w_s)[scl_id].scl_list,
- &clstr_list, list_op);
- got_clstr = TRUE;
+ if (scl_id >= 0) {
+ syn_combine_list(&SYN_CLSTR(curwin->w_s)[scl_id].scl_list,
+ &clstr_list, list_op);
+ } else {
+ xfree(clstr_list);
+ }
+ got_clstr = true;
}
if (got_clstr) {
@@ -5156,36 +5187,30 @@ static void syn_cmd_sync(exarg_T *eap, int syncing)
* Careful: the argument is modified (NULs added).
* returns FAIL for some error, OK for success.
*/
-static int
-get_id_list (
- char_u **arg,
- int keylen, /* length of keyword */
- short **list /* where to store the resulting list, if not
- NULL, the list is silently skipped! */
+static int
+get_id_list(
+ char_u **const arg,
+ const int keylen, // length of keyword
+ int16_t **const list, // where to store the resulting list, if not
+ // NULL, the list is silently skipped!
+ const bool skip
)
{
char_u *p = NULL;
char_u *end;
- int round;
- int count;
int total_count = 0;
- short *retval = NULL;
- char_u *name;
+ int16_t *retval = NULL;
regmatch_T regmatch;
int id;
- int failed = FALSE;
-
- /*
- * We parse the list twice:
- * round == 1: count the number of items, allocate the array.
- * round == 2: fill the array with the items.
- * In round 1 new groups may be added, causing the number of items to
- * grow when a regexp is used. In that case round 1 is done once again.
- */
- for (round = 1; round <= 2; ++round) {
- /*
- * skip "contains"
- */
+ bool failed = false;
+
+ // We parse the list twice:
+ // round == 1: count the number of items, allocate the array.
+ // round == 2: fill the array with the items.
+ // In round 1 new groups may be added, causing the number of items to
+ // grow when a regexp is used. In that case round 1 is done once again.
+ for (int round = 1; round <= 2; round++) {
+ // skip "contains"
p = skipwhite(*arg + keylen);
if (*p != '=') {
EMSG2(_("E405: Missing equal sign: %s"), *arg);
@@ -5197,14 +5222,12 @@ get_id_list (
break;
}
- /*
- * parse the arguments after "contains"
- */
- count = 0;
+ // parse the arguments after "contains"
+ int count = 0;
do {
- for (end = p; *end && !ascii_iswhite(*end) && *end != ','; ++end)
- ;
- name = xmalloc((int)(end - p + 3)); /* leave room for "^$" */
+ for (end = p; *end && !ascii_iswhite(*end) && *end != ','; end++) {
+ }
+ char_u *const name = xmalloc((int)(end - p + 3)); // leave room for "^$"
STRLCPY(name + 1, p, end - p + 1);
if ( STRCMP(name + 1, "ALLBUT") == 0
|| STRCMP(name + 1, "ALL") == 0
@@ -5212,13 +5235,14 @@ get_id_list (
|| STRCMP(name + 1, "CONTAINED") == 0) {
if (TOUPPER_ASC(**arg) != 'C') {
EMSG2(_("E407: %s not allowed here"), name + 1);
- failed = TRUE;
+ failed = true;
xfree(name);
break;
}
if (count != 0) {
- EMSG2(_("E408: %s must be first in contains list"), name + 1);
- failed = TRUE;
+ EMSG2(_("E408: %s must be first in contains list"),
+ name + 1);
+ failed = true;
xfree(name);
break;
}
@@ -5230,22 +5254,24 @@ get_id_list (
id = SYNID_CONTAINED;
id += current_syn_inc_tag;
} else if (name[1] == '@') {
- id = syn_check_cluster(name + 2, (int)(end - p - 1));
+ if (skip) {
+ id = -1;
+ } else {
+ id = syn_check_cluster(name + 2, (int)(end - p - 1));
+ }
} else {
/*
* Handle full group name.
*/
- if (vim_strpbrk(name + 1, (char_u *)"\\.*^$~[") == NULL)
+ if (vim_strpbrk(name + 1, (char_u *)"\\.*^$~[") == NULL) {
id = syn_check_group(name + 1, (int)(end - p));
- else {
- /*
- * Handle match of regexp with group names.
- */
+ } else {
+ // Handle match of regexp with group names.
*name = '^';
STRCAT(name, "$");
regmatch.regprog = vim_regcomp(name, RE_MAGIC);
if (regmatch.regprog == NULL) {
- failed = TRUE;
+ failed = true;
xfree(name);
break;
}
@@ -5255,18 +5281,19 @@ get_id_list (
for (int i = highlight_ga.ga_len; --i >= 0; ) {
if (vim_regexec(&regmatch, HL_TABLE()[i].sg_name, (colnr_T)0)) {
if (round == 2) {
- /* Got more items than expected; can happen
- * when adding items that match:
- * "contains=a.*b,axb".
- * Go back to first round */
+ // Got more items than expected; can happen
+ // when adding items that match:
+ // "contains=a.*b,axb".
+ // Go back to first round.
if (count >= total_count) {
xfree(retval);
round = 1;
- } else
- retval[count] = i + 1;
+ } else {
+ retval[count] = i + 1; // -V522
+ }
}
- ++count;
- id = -1; /* remember that we found one */
+ count++;
+ id = -1; // Remember that we found one.
}
}
vim_regfree(regmatch.regprog);
@@ -5275,17 +5302,18 @@ get_id_list (
xfree(name);
if (id == 0) {
EMSG2(_("E409: Unknown group name: %s"), p);
- failed = TRUE;
+ failed = true;
break;
}
if (id > 0) {
if (round == 2) {
- /* Got more items than expected, go back to first round */
+ // Got more items than expected, go back to first round.
if (count >= total_count) {
xfree(retval);
round = 1;
- } else
+ } else {
retval[count] = id;
+ }
}
++count;
}
@@ -5297,8 +5325,8 @@ get_id_list (
if (failed)
break;
if (round == 1) {
- retval = xmalloc((count + 1) * sizeof(short));
- retval[count] = 0; /* zero means end of the list */
+ retval = xmalloc((count + 1) * sizeof(*retval));
+ retval[count] = 0; // zero means end of the list
total_count = count;
}
}
@@ -5320,20 +5348,18 @@ get_id_list (
/*
* Make a copy of an ID list.
*/
-static short *copy_id_list(short *list)
+static int16_t *copy_id_list(const int16_t *const list)
{
- int len;
- int count;
- short *retval;
-
- if (list == NULL)
+ if (list == NULL) {
return NULL;
+ }
- for (count = 0; list[count]; ++count)
- ;
- len = (count + 1) * sizeof(short);
- retval = xmalloc(len);
- memmove(retval, list, (size_t)len);
+ int count;
+ for (count = 0; list[count]; count++) {
+ }
+ const size_t len = (count + 1) * sizeof(int16_t);
+ int16_t *const retval = xmalloc(len);
+ memmove(retval, list, len);
return retval;
}
@@ -5345,18 +5371,18 @@ static short *copy_id_list(short *list)
* the current item.
* This function is called very often, keep it fast!!
*/
-static int
-in_id_list (
- stateitem_T *cur_si, /* current item or NULL */
- short *list, /* id list */
- struct sp_syn *ssp, /* group id and ":syn include" tag of group */
- int contained /* group id is contained */
+static int
+in_id_list(
+ stateitem_T *cur_si, // current item or NULL
+ int16_t *list, // id list
+ struct sp_syn *ssp, // group id and ":syn include" tag of group
+ int contained // group id is contained
)
{
int retval;
- short *scl_list;
- short item;
- short id = ssp->id;
+ int16_t *scl_list;
+ int16_t item;
+ int16_t id = ssp->id;
static int depth = 0;
int r;
@@ -5515,30 +5541,32 @@ void ex_ownsyntax(exarg_T *eap)
clear_string_option(&curwin->w_s->b_syn_isk);
}
- /* save value of b:current_syntax */
- old_value = get_var_value((char_u *)"b:current_syntax");
- if (old_value != NULL)
+ // Save value of b:current_syntax.
+ old_value = get_var_value("b:current_syntax");
+ if (old_value != NULL) {
old_value = vim_strsave(old_value);
+ }
/* Apply the "syntax" autocommand event, this finds and loads the syntax
* file. */
apply_autocmds(EVENT_SYNTAX, eap->arg, curbuf->b_fname, TRUE, curbuf);
- /* move value of b:current_syntax to w:current_syntax */
- new_value = get_var_value((char_u *)"b:current_syntax");
- if (new_value != NULL)
+ // Move value of b:current_syntax to w:current_syntax.
+ new_value = get_var_value("b:current_syntax");
+ if (new_value != NULL) {
set_internal_string_var((char_u *)"w:current_syntax", new_value);
+ }
- /* restore value of b:current_syntax */
- if (old_value == NULL)
- do_unlet((char_u *)"b:current_syntax", TRUE);
- else {
+ // Restore value of b:current_syntax.
+ if (old_value == NULL) {
+ do_unlet(S_LEN("b:current_syntax"), true);
+ } else {
set_internal_string_var((char_u *)"b:current_syntax", old_value);
xfree(old_value);
}
}
-int syntax_present(win_T *win)
+bool syntax_present(win_T *win)
{
return win->w_s->b_syn_patterns.ga_len != 0
|| win->w_s->b_syn_clusters.ga_len != 0
@@ -5548,8 +5576,10 @@ int syntax_present(win_T *win)
static enum {
- EXP_SUBCMD, /* expand ":syn" sub-commands */
- EXP_CASE /* expand ":syn case" arguments */
+ EXP_SUBCMD, // expand ":syn" sub-commands
+ EXP_CASE, // expand ":syn case" arguments
+ EXP_SPELL, // expand ":syn spell" arguments
+ EXP_SYNC // expand ":syn sync" arguments
} expand_what;
/*
@@ -5565,58 +5595,77 @@ void reset_expand_highlight(void)
* Handle command line completion for :match and :echohl command: Add "None"
* as highlight group.
*/
-void set_context_in_echohl_cmd(expand_T *xp, char_u *arg)
+void set_context_in_echohl_cmd(expand_T *xp, const char *arg)
{
xp->xp_context = EXPAND_HIGHLIGHT;
- xp->xp_pattern = arg;
+ xp->xp_pattern = (char_u *)arg;
include_none = 1;
}
/*
* Handle command line completion for :syntax command.
*/
-void set_context_in_syntax_cmd(expand_T *xp, char_u *arg)
+void set_context_in_syntax_cmd(expand_T *xp, const char *arg)
{
- char_u *p;
-
- /* Default: expand subcommands */
+ // Default: expand subcommands.
xp->xp_context = EXPAND_SYNTAX;
expand_what = EXP_SUBCMD;
- xp->xp_pattern = arg;
+ xp->xp_pattern = (char_u *)arg;
include_link = 0;
include_default = 0;
/* (part of) subcommand already typed */
if (*arg != NUL) {
- p = skiptowhite(arg);
- if (*p != NUL) { /* past first word */
- xp->xp_pattern = skipwhite(p);
- if (*skiptowhite(xp->xp_pattern) != NUL)
+ const char *p = (const char *)skiptowhite((const char_u *)arg);
+ if (*p != NUL) { // Past first word.
+ xp->xp_pattern = skipwhite((const char_u *)p);
+ if (*skiptowhite(xp->xp_pattern) != NUL) {
xp->xp_context = EXPAND_NOTHING;
- else if (STRNICMP(arg, "case", p - arg) == 0)
+ } else if (STRNICMP(arg, "case", p - arg) == 0) {
expand_what = EXP_CASE;
- else if ( STRNICMP(arg, "keyword", p - arg) == 0
+ } else if (STRNICMP(arg, "spell", p - arg) == 0) {
+ expand_what = EXP_SPELL;
+ } else if (STRNICMP(arg, "sync", p - arg) == 0) {
+ expand_what = EXP_SYNC;
+ } else if (STRNICMP(arg, "keyword", p - arg) == 0
|| STRNICMP(arg, "region", p - arg) == 0
|| STRNICMP(arg, "match", p - arg) == 0
- || STRNICMP(arg, "list", p - arg) == 0)
+ || STRNICMP(arg, "list", p - arg) == 0) {
xp->xp_context = EXPAND_HIGHLIGHT;
- else
+ } else {
xp->xp_context = EXPAND_NOTHING;
+ }
}
}
}
-static char *(case_args[]) = {"match", "ignore", NULL};
-
/*
* Function given to ExpandGeneric() to obtain the list syntax names for
* expansion.
*/
char_u *get_syntax_name(expand_T *xp, int idx)
{
- if (expand_what == EXP_SUBCMD)
- return (char_u *)subcommands[idx].name;
- return (char_u *)case_args[idx];
+ switch (expand_what) {
+ case EXP_SUBCMD:
+ return (char_u *)subcommands[idx].name;
+ case EXP_CASE: {
+ static char *case_args[] = { "match", "ignore", NULL };
+ return (char_u *)case_args[idx];
+ }
+ case EXP_SPELL: {
+ static char *spell_args[] =
+ { "toplevel", "notoplevel", "default", NULL };
+ return (char_u *)spell_args[idx];
+ }
+ case EXP_SYNC: {
+ static char *sync_args[] =
+ { "ccomment", "clear", "fromstart",
+ "linebreaks=", "linecont", "lines=", "match",
+ "maxlines=", "minlines=", "region", NULL };
+ return (char_u *)sync_args[idx];
+ }
+ }
+ return NULL;
}
@@ -5632,13 +5681,9 @@ int syn_get_id(
{
// When the position is not after the current position and in the same
// line of the same buffer, need to restart parsing.
- if (wp->w_buffer != syn_buf
- || lnum != current_lnum
- || col < current_col) {
+ if (wp->w_buffer != syn_buf || lnum != current_lnum || col < current_col) {
syntax_start(wp, lnum);
- } else if (wp->w_buffer == syn_buf
- && lnum == current_lnum
- && col > current_col) {
+ } else if (col > current_col) {
// next_match may not be correct when moving around, e.g. with the
// "skip" expression in searchpair()
next_match_idx = -1;
@@ -5661,6 +5706,24 @@ int get_syntax_info(int *seqnrp)
return current_flags;
}
+
+/// Get the sequence number of the concealed file position.
+///
+/// @return seqnr if the file position is concealed, 0 otherwise.
+int syn_get_concealed_id(win_T *wp, linenr_T lnum, colnr_T col)
+{
+ int seqnr;
+ int syntax_flags;
+
+ (void)syn_get_id(wp, lnum, col, false, NULL, false);
+ syntax_flags = get_syntax_info(&seqnr);
+
+ if (syntax_flags & HL_CONCEAL) {
+ return seqnr;
+ }
+ return 0;
+}
+
/*
* Return conceal substitution character
*/
@@ -5809,9 +5872,12 @@ static void syntime_report(void)
}
}
- /* sort on total time */
- qsort(ga.ga_data, (size_t)ga.ga_len, sizeof(time_entry_T),
- syn_compare_syntime);
+ // Sort on total time. Skip if there are no items to avoid passing NULL
+ // pointer to qsort().
+ if (ga.ga_len > 1) {
+ qsort(ga.ga_data, (size_t)ga.ga_len, sizeof(time_entry_T),
+ syn_compare_syntime);
+ }
MSG_PUTS_TITLE(_(
" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"));
@@ -5867,9 +5933,11 @@ static void syntime_report(void)
//
// When making changes here, also change runtime/colors/default.vim!
-static char *highlight_init_both[] =
-{
- "Conceal ctermbg=DarkGrey ctermfg=LightGrey guibg=DarkGrey guifg=LightGrey",
+static const char *highlight_init_both[] = {
+ "Conceal "
+ "ctermbg=DarkGrey ctermfg=LightGrey guibg=DarkGrey guifg=LightGrey",
+ "Cursor guibg=fg guifg=bg",
+ "lCursor guibg=fg guifg=bg",
"DiffText cterm=bold ctermbg=Red gui=bold guibg=Red",
"ErrorMsg ctermbg=DarkRed ctermfg=White guibg=Red guifg=White",
"IncSearch cterm=reverse gui=reverse",
@@ -5884,11 +5952,14 @@ static char *highlight_init_both[] =
"VertSplit cterm=reverse gui=reverse",
"WildMenu ctermbg=Yellow ctermfg=Black guibg=Yellow guifg=Black",
"default link EndOfBuffer NonText",
+ "default link QuickFixLine Search",
+ "default link Substitute Search",
+ "default link Whitespace NonText",
+ "default link MsgSeparator StatusLine",
NULL
};
-static char *highlight_init_light[] =
-{
+static const char *highlight_init_light[] = {
"ColorColumn ctermbg=LightRed guibg=LightRed",
"CursorColumn ctermbg=LightGrey guibg=Grey90",
"CursorLine cterm=underline guibg=Grey90",
@@ -5917,11 +5988,11 @@ static char *highlight_init_light[] =
"Title ctermfg=DarkMagenta gui=bold guifg=Magenta",
"Visual guibg=LightGrey",
"WarningMsg ctermfg=DarkRed guifg=Red",
+ "Normal gui=NONE",
NULL
};
-static char *highlight_init_dark[] =
-{
+static const char *highlight_init_dark[] = {
"ColorColumn ctermbg=DarkRed guibg=DarkRed",
"CursorColumn ctermbg=DarkGrey guibg=Grey40",
"CursorLine cterm=underline guibg=Grey40",
@@ -5950,24 +6021,231 @@ static char *highlight_init_dark[] =
"Title ctermfg=LightMagenta gui=bold guifg=Magenta",
"Visual guibg=DarkGrey",
"WarningMsg ctermfg=LightRed guifg=Red",
+ "Normal gui=NONE",
NULL
};
-void
-init_highlight (
- int both, /* include groups where 'bg' doesn't matter */
- int reset /* clear group first */
-)
+const char *const highlight_init_cmdline[] = {
+ // XXX When modifying a list modify it in both valid and invalid halfs.
+ // TODO(ZyX-I): merge valid and invalid groups via a macros.
+
+ // NvimInternalError should appear only when highlighter has a bug.
+ "NvimInternalError ctermfg=Red ctermbg=Red guifg=Red guibg=Red",
+
+ // Highlight groups (links) used by parser:
+
+ "default link NvimAssignment Operator",
+ "default link NvimPlainAssignment NvimAssignment",
+ "default link NvimAugmentedAssignment NvimAssignment",
+ "default link NvimAssignmentWithAddition NvimAugmentedAssignment",
+ "default link NvimAssignmentWithSubtraction NvimAugmentedAssignment",
+ "default link NvimAssignmentWithConcatenation NvimAugmentedAssignment",
+
+ "default link NvimOperator Operator",
+
+ "default link NvimUnaryOperator NvimOperator",
+ "default link NvimUnaryPlus NvimUnaryOperator",
+ "default link NvimUnaryMinus NvimUnaryOperator",
+ "default link NvimNot NvimUnaryOperator",
+
+ "default link NvimBinaryOperator NvimOperator",
+ "default link NvimComparison NvimBinaryOperator",
+ "default link NvimComparisonModifier NvimComparison",
+ "default link NvimBinaryPlus NvimBinaryOperator",
+ "default link NvimBinaryMinus NvimBinaryOperator",
+ "default link NvimConcat NvimBinaryOperator",
+ "default link NvimConcatOrSubscript NvimConcat",
+ "default link NvimOr NvimBinaryOperator",
+ "default link NvimAnd NvimBinaryOperator",
+ "default link NvimMultiplication NvimBinaryOperator",
+ "default link NvimDivision NvimBinaryOperator",
+ "default link NvimMod NvimBinaryOperator",
+
+ "default link NvimTernary NvimOperator",
+ "default link NvimTernaryColon NvimTernary",
+
+ "default link NvimParenthesis Delimiter",
+ "default link NvimLambda NvimParenthesis",
+ "default link NvimNestingParenthesis NvimParenthesis",
+ "default link NvimCallingParenthesis NvimParenthesis",
+
+ "default link NvimSubscript NvimParenthesis",
+ "default link NvimSubscriptBracket NvimSubscript",
+ "default link NvimSubscriptColon NvimSubscript",
+ "default link NvimCurly NvimSubscript",
+
+ "default link NvimContainer NvimParenthesis",
+ "default link NvimDict NvimContainer",
+ "default link NvimList NvimContainer",
+
+ "default link NvimIdentifier Identifier",
+ "default link NvimIdentifierScope NvimIdentifier",
+ "default link NvimIdentifierScopeDelimiter NvimIdentifier",
+ "default link NvimIdentifierName NvimIdentifier",
+ "default link NvimIdentifierKey NvimIdentifier",
+
+ "default link NvimColon Delimiter",
+ "default link NvimComma Delimiter",
+ "default link NvimArrow Delimiter",
+
+ "default link NvimRegister SpecialChar",
+ "default link NvimNumber Number",
+ "default link NvimFloat NvimNumber",
+ "default link NvimNumberPrefix Type",
+
+ "default link NvimOptionSigil Type",
+ "default link NvimOptionName NvimIdentifier",
+ "default link NvimOptionScope NvimIdentifierScope",
+ "default link NvimOptionScopeDelimiter NvimIdentifierScopeDelimiter",
+
+ "default link NvimEnvironmentSigil NvimOptionSigil",
+ "default link NvimEnvironmentName NvimIdentifier",
+
+ "default link NvimString String",
+ "default link NvimStringBody NvimString",
+ "default link NvimStringQuote NvimString",
+ "default link NvimStringSpecial SpecialChar",
+
+ "default link NvimSingleQuote NvimStringQuote",
+ "default link NvimSingleQuotedBody NvimStringBody",
+ "default link NvimSingleQuotedQuote NvimStringSpecial",
+
+ "default link NvimDoubleQuote NvimStringQuote",
+ "default link NvimDoubleQuotedBody NvimStringBody",
+ "default link NvimDoubleQuotedEscape NvimStringSpecial",
+
+ "default link NvimFigureBrace NvimInternalError",
+ "default link NvimSingleQuotedUnknownEscape NvimInternalError",
+
+ "default link NvimSpacing Normal",
+
+ // NvimInvalid groups:
+
+ "default link NvimInvalidSingleQuotedUnknownEscape NvimInternalError",
+
+ "default link NvimInvalid Error",
+
+ "default link NvimInvalidAssignment NvimInvalid",
+ "default link NvimInvalidPlainAssignment NvimInvalidAssignment",
+ "default link NvimInvalidAugmentedAssignment NvimInvalidAssignment",
+ "default link NvimInvalidAssignmentWithAddition "
+ "NvimInvalidAugmentedAssignment",
+ "default link NvimInvalidAssignmentWithSubtraction "
+ "NvimInvalidAugmentedAssignment",
+ "default link NvimInvalidAssignmentWithConcatenation "
+ "NvimInvalidAugmentedAssignment",
+
+ "default link NvimInvalidOperator NvimInvalid",
+
+ "default link NvimInvalidUnaryOperator NvimInvalidOperator",
+ "default link NvimInvalidUnaryPlus NvimInvalidUnaryOperator",
+ "default link NvimInvalidUnaryMinus NvimInvalidUnaryOperator",
+ "default link NvimInvalidNot NvimInvalidUnaryOperator",
+
+ "default link NvimInvalidBinaryOperator NvimInvalidOperator",
+ "default link NvimInvalidComparison NvimInvalidBinaryOperator",
+ "default link NvimInvalidComparisonModifier NvimInvalidComparison",
+ "default link NvimInvalidBinaryPlus NvimInvalidBinaryOperator",
+ "default link NvimInvalidBinaryMinus NvimInvalidBinaryOperator",
+ "default link NvimInvalidConcat NvimInvalidBinaryOperator",
+ "default link NvimInvalidConcatOrSubscript NvimInvalidConcat",
+ "default link NvimInvalidOr NvimInvalidBinaryOperator",
+ "default link NvimInvalidAnd NvimInvalidBinaryOperator",
+ "default link NvimInvalidMultiplication NvimInvalidBinaryOperator",
+ "default link NvimInvalidDivision NvimInvalidBinaryOperator",
+ "default link NvimInvalidMod NvimInvalidBinaryOperator",
+
+ "default link NvimInvalidTernary NvimInvalidOperator",
+ "default link NvimInvalidTernaryColon NvimInvalidTernary",
+
+ "default link NvimInvalidDelimiter NvimInvalid",
+
+ "default link NvimInvalidParenthesis NvimInvalidDelimiter",
+ "default link NvimInvalidLambda NvimInvalidParenthesis",
+ "default link NvimInvalidNestingParenthesis NvimInvalidParenthesis",
+ "default link NvimInvalidCallingParenthesis NvimInvalidParenthesis",
+
+ "default link NvimInvalidSubscript NvimInvalidParenthesis",
+ "default link NvimInvalidSubscriptBracket NvimInvalidSubscript",
+ "default link NvimInvalidSubscriptColon NvimInvalidSubscript",
+ "default link NvimInvalidCurly NvimInvalidSubscript",
+
+ "default link NvimInvalidContainer NvimInvalidParenthesis",
+ "default link NvimInvalidDict NvimInvalidContainer",
+ "default link NvimInvalidList NvimInvalidContainer",
+
+ "default link NvimInvalidValue NvimInvalid",
+
+ "default link NvimInvalidIdentifier NvimInvalidValue",
+ "default link NvimInvalidIdentifierScope NvimInvalidIdentifier",
+ "default link NvimInvalidIdentifierScopeDelimiter NvimInvalidIdentifier",
+ "default link NvimInvalidIdentifierName NvimInvalidIdentifier",
+ "default link NvimInvalidIdentifierKey NvimInvalidIdentifier",
+
+ "default link NvimInvalidColon NvimInvalidDelimiter",
+ "default link NvimInvalidComma NvimInvalidDelimiter",
+ "default link NvimInvalidArrow NvimInvalidDelimiter",
+
+ "default link NvimInvalidRegister NvimInvalidValue",
+ "default link NvimInvalidNumber NvimInvalidValue",
+ "default link NvimInvalidFloat NvimInvalidNumber",
+ "default link NvimInvalidNumberPrefix NvimInvalidNumber",
+
+ "default link NvimInvalidOptionSigil NvimInvalidIdentifier",
+ "default link NvimInvalidOptionName NvimInvalidIdentifier",
+ "default link NvimInvalidOptionScope NvimInvalidIdentifierScope",
+ "default link NvimInvalidOptionScopeDelimiter "
+ "NvimInvalidIdentifierScopeDelimiter",
+
+ "default link NvimInvalidEnvironmentSigil NvimInvalidOptionSigil",
+ "default link NvimInvalidEnvironmentName NvimInvalidIdentifier",
+
+ // Invalid string bodies and specials are still highlighted as valid ones to
+ // minimize the red area.
+ "default link NvimInvalidString NvimInvalidValue",
+ "default link NvimInvalidStringBody NvimStringBody",
+ "default link NvimInvalidStringQuote NvimInvalidString",
+ "default link NvimInvalidStringSpecial NvimStringSpecial",
+
+ "default link NvimInvalidSingleQuote NvimInvalidStringQuote",
+ "default link NvimInvalidSingleQuotedBody NvimInvalidStringBody",
+ "default link NvimInvalidSingleQuotedQuote NvimInvalidStringSpecial",
+
+ "default link NvimInvalidDoubleQuote NvimInvalidStringQuote",
+ "default link NvimInvalidDoubleQuotedBody NvimInvalidStringBody",
+ "default link NvimInvalidDoubleQuotedEscape NvimInvalidStringSpecial",
+ "default link NvimInvalidDoubleQuotedUnknownEscape NvimInvalidValue",
+
+ "default link NvimInvalidFigureBrace NvimInvalidDelimiter",
+
+ "default link NvimInvalidSpacing ErrorMsg",
+
+ // Not actually invalid, but we highlight user that he is doing something
+ // wrong.
+ "default link NvimDoubleQuotedUnknownEscape NvimInvalidValue",
+ NULL,
+};
+
+/// Create default links for Nvim* highlight groups used for cmdline coloring
+void syn_init_cmdline_highlight(bool reset, bool init)
{
- int i;
- char **pp;
- static int had_both = FALSE;
+ for (size_t i = 0 ; highlight_init_cmdline[i] != NULL ; i++) {
+ do_highlight(highlight_init_cmdline[i], reset, init);
+ }
+}
- /*
- * Try finding the color scheme file. Used when a color file was loaded
- * and 'background' or 't_Co' is changed.
- */
- char_u *p = get_var_value((char_u *)"g:colors_name");
+/// Load colors from a file if "g:colors_name" is set, otherwise load builtin
+/// colors
+///
+/// @param both include groups where 'bg' doesn't matter
+/// @param reset clear groups first
+void init_highlight(bool both, bool reset)
+{
+ static int had_both = false;
+
+ // Try finding the color scheme file. Used when a color file was loaded
+ // and 'background' or 't_Co' is changed.
+ char_u *p = get_var_value("g:colors_name");
if (p != NULL) {
// Value of g:colors_name could be freed in load_colors() and make
// p invalid, so copy it.
@@ -5983,45 +6261,46 @@ init_highlight (
* Didn't use a color file, use the compiled-in colors.
*/
if (both) {
- had_both = TRUE;
- pp = highlight_init_both;
- for (i = 0; pp[i] != NULL; ++i)
- do_highlight((char_u *)pp[i], reset, TRUE);
- } else if (!had_both)
- /* Don't do anything before the call with both == TRUE from main().
- * Not everything has been setup then, and that call will overrule
- * everything anyway. */
+ had_both = true;
+ const char *const *const pp = highlight_init_both;
+ for (size_t i = 0; pp[i] != NULL; i++) {
+ do_highlight(pp[i], reset, true);
+ }
+ } else if (!had_both) {
+ // Don't do anything before the call with both == TRUE from main().
+ // Not everything has been setup then, and that call will overrule
+ // everything anyway.
return;
+ }
- if (*p_bg == 'l')
- pp = highlight_init_light;
- else
- pp = highlight_init_dark;
- for (i = 0; pp[i] != NULL; ++i)
- do_highlight((char_u *)pp[i], reset, TRUE);
+ const char *const *const pp = ((*p_bg == 'l')
+ ? highlight_init_light
+ : highlight_init_dark);
+ for (size_t i = 0; pp[i] != NULL; i++) {
+ do_highlight(pp[i], reset, true);
+ }
/* Reverse looks ugly, but grey may not work for 8 colors. Thus let it
* depend on the number of colors available.
* With 8 colors brown is equal to yellow, need to use black for Search fg
* to avoid Statement highlighted text disappears.
* Clear the attributes, needed when changing the t_Co value. */
- if (t_colors > 8)
+ if (t_colors > 8) {
do_highlight(
- (char_u *)(*p_bg == 'l'
- ? "Visual cterm=NONE ctermbg=LightGrey"
- : "Visual cterm=NONE ctermbg=DarkGrey"), FALSE,
- TRUE);
- else {
- do_highlight((char_u *)"Visual cterm=reverse ctermbg=NONE",
- FALSE, TRUE);
- if (*p_bg == 'l')
- do_highlight((char_u *)"Search ctermfg=black", FALSE, TRUE);
+ (*p_bg == 'l'
+ ? "Visual cterm=NONE ctermbg=LightGrey"
+ : "Visual cterm=NONE ctermbg=DarkGrey"), false, true);
+ } else {
+ do_highlight("Visual cterm=reverse ctermbg=NONE", false, true);
+ if (*p_bg == 'l') {
+ do_highlight("Search ctermfg=black", false, true);
+ }
}
/*
* If syntax highlighting is enabled load the highlighting for it.
*/
- if (get_var_value((char_u *)"g:syntax_on") != NULL) {
+ if (get_var_value("g:syntax_on") != NULL) {
static int recursive = 0;
if (recursive >= 5) {
@@ -6032,6 +6311,7 @@ init_highlight (
recursive--;
}
}
+ syn_init_cmdline_highlight(false, false);
}
/*
@@ -6054,201 +6334,285 @@ int load_colors(char_u *name)
recursive = true;
size_t buflen = STRLEN(name) + 12;
buf = xmalloc(buflen);
+ apply_autocmds(EVENT_COLORSCHEMEPRE, name, curbuf->b_fname, false, curbuf);
snprintf((char *)buf, buflen, "colors/%s.vim", name);
retval = source_runtime(buf, DIP_START + DIP_OPT);
xfree(buf);
apply_autocmds(EVENT_COLORSCHEME, name, curbuf->b_fname, FALSE, curbuf);
recursive = false;
- ui_refresh();
return retval;
}
-/*
- * Handle the ":highlight .." command.
- * When using ":hi clear" this is called recursively for each group with
- * "forceit" and "init" both TRUE.
- */
-void
-do_highlight (
- char_u *line,
- int forceit,
- int init /* TRUE when called for initializing */
-)
+static char *(color_names[28]) = {
+ "Black", "DarkBlue", "DarkGreen", "DarkCyan",
+ "DarkRed", "DarkMagenta", "Brown", "DarkYellow",
+ "Gray", "Grey", "LightGray", "LightGrey",
+ "DarkGray", "DarkGrey",
+ "Blue", "LightBlue", "Green", "LightGreen",
+ "Cyan", "LightCyan", "Red", "LightRed", "Magenta",
+ "LightMagenta", "Yellow", "LightYellow", "White", "NONE" };
+ // indices:
+ // 0, 1, 2, 3,
+ // 4, 5, 6, 7,
+ // 8, 9, 10, 11,
+ // 12, 13,
+ // 14, 15, 16, 17,
+ // 18, 19, 20, 21, 22,
+ // 23, 24, 25, 26, 27
+static int color_numbers_16[28] = { 0, 1, 2, 3,
+ 4, 5, 6, 6,
+ 7, 7, 7, 7,
+ 8, 8,
+ 9, 9, 10, 10,
+ 11, 11, 12, 12, 13,
+ 13, 14, 14, 15, -1 };
+// for xterm with 88 colors...
+static int color_numbers_88[28] = { 0, 4, 2, 6,
+ 1, 5, 32, 72,
+ 84, 84, 7, 7,
+ 82, 82,
+ 12, 43, 10, 61,
+ 14, 63, 9, 74, 13,
+ 75, 11, 78, 15, -1 };
+// for xterm with 256 colors...
+static int color_numbers_256[28] = { 0, 4, 2, 6,
+ 1, 5, 130, 130,
+ 248, 248, 7, 7,
+ 242, 242,
+ 12, 81, 10, 121,
+ 14, 159, 9, 224, 13,
+ 225, 11, 229, 15, -1 };
+// for terminals with less than 16 colors...
+static int color_numbers_8[28] = { 0, 4, 2, 6,
+ 1, 5, 3, 3,
+ 7, 7, 7, 7,
+ 0+8, 0+8,
+ 4+8, 4+8, 2+8, 2+8,
+ 6+8, 6+8, 1+8, 1+8, 5+8,
+ 5+8, 3+8, 3+8, 7+8, -1 };
+
+// Lookup the "cterm" value to be used for color with index "idx" in
+// color_names[].
+// "boldp" will be set to TRUE or FALSE for a foreground color when using 8
+// colors, otherwise it will be unchanged.
+int lookup_color(const int idx, const bool foreground, TriState *const boldp)
+{
+ int color = color_numbers_16[idx];
+
+ // Use the _16 table to check if it's a valid color name.
+ if (color < 0) {
+ return -1;
+ }
+
+ if (t_colors == 8) {
+ // t_Co is 8: use the 8 colors table
+ color = color_numbers_8[idx];
+ if (foreground) {
+ // set/reset bold attribute to get light foreground
+ // colors (on some terminals, e.g. "linux")
+ if (color & 8) {
+ *boldp = kTrue;
+ } else {
+ *boldp = kFalse;
+ }
+ }
+ color &= 7; // truncate to 8 colors
+ } else if (t_colors == 16) {
+ color = color_numbers_8[idx];
+ } else if (t_colors == 88) {
+ color = color_numbers_88[idx];
+ } else if (t_colors >= 256) {
+ color = color_numbers_256[idx];
+ }
+ return color;
+}
+
+
+/// Handle ":highlight" command
+///
+/// When using ":highlight clear" this is called recursively for each group with
+/// forceit and init being both true.
+///
+/// @param[in] line Command arguments.
+/// @param[in] forceit True when bang is given, allows to link group even if
+/// it has its own settings.
+/// @param[in] init True when initializing.
+void do_highlight(const char *line, const bool forceit, const bool init)
+ FUNC_ATTR_NONNULL_ALL
{
- char_u *name_end;
- char_u *linep;
- char_u *key_start;
- char_u *arg_start;
- char_u *key = NULL, *arg = NULL;
+ const char *name_end;
+ const char *linep;
+ const char *key_start;
+ const char *arg_start;
long i;
int off;
int len;
int attr;
int id;
int idx;
- int dodefault = FALSE;
- int doclear = FALSE;
- int dolink = FALSE;
- int error = FALSE;
+ struct hl_group item_before;
+ bool dodefault = false;
+ bool doclear = false;
+ bool dolink = false;
+ bool error = false;
int color;
- int is_normal_group = FALSE; /* "Normal" group */
+ bool is_normal_group = false; // "Normal" group
+ bool did_highlight_changed = false;
- /*
- * If no argument, list current highlighting.
- */
- if (ends_excmd(*line)) {
- for (int i = 1; i <= highlight_ga.ga_len && !got_int; ++i)
- /* TODO: only call when the group has attributes set */
+ // If no argument, list current highlighting.
+ if (ends_excmd((uint8_t)(*line))) {
+ for (i = 1; i <= highlight_ga.ga_len && !got_int; i++) {
+ // TODO(brammool): only call when the group has attributes set
highlight_list_one(i);
+ }
return;
}
- /*
- * Isolate the name.
- */
- name_end = skiptowhite(line);
- linep = skipwhite(name_end);
+ // Isolate the name.
+ name_end = (const char *)skiptowhite((const char_u *)line);
+ linep = (const char *)skipwhite((const char_u *)name_end);
- /*
- * Check for "default" argument.
- */
- if (STRNCMP(line, "default", name_end - line) == 0) {
- dodefault = TRUE;
+ // Check for "default" argument.
+ if (strncmp(line, "default", name_end - line) == 0) {
+ dodefault = true;
line = linep;
- name_end = skiptowhite(line);
- linep = skipwhite(name_end);
+ name_end = (const char *)skiptowhite((const char_u *)line);
+ linep = (const char *)skipwhite((const char_u *)name_end);
}
- /*
- * Check for "clear" or "link" argument.
- */
- if (STRNCMP(line, "clear", name_end - line) == 0)
- doclear = TRUE;
- if (STRNCMP(line, "link", name_end - line) == 0)
- dolink = TRUE;
+ // Check for "clear" or "link" argument.
+ if (strncmp(line, "clear", name_end - line) == 0) {
+ doclear = true;
+ } else if (strncmp(line, "link", name_end - line) == 0) {
+ dolink = true;
+ }
- /*
- * ":highlight {group-name}": list highlighting for one group.
- */
- if (!doclear && !dolink && ends_excmd(*linep)) {
- id = syn_namen2id(line, (int)(name_end - line));
- if (id == 0)
- EMSG2(_("E411: highlight group not found: %s"), line);
- else
+ // ":highlight {group-name}": list highlighting for one group.
+ if (!doclear && !dolink && ends_excmd((uint8_t)(*linep))) {
+ id = syn_namen2id((const char_u *)line, (int)(name_end - line));
+ if (id == 0) {
+ emsgf(_("E411: highlight group not found: %s"), line);
+ } else {
highlight_list_one(id);
+ }
return;
}
- /*
- * Handle ":highlight link {from} {to}" command.
- */
+ // Handle ":highlight link {from} {to}" command.
if (dolink) {
- char_u *from_start = linep;
- char_u *from_end;
- char_u *to_start;
- char_u *to_end;
+ const char *from_start = linep;
+ const char *from_end;
+ const char *to_start;
+ const char *to_end;
int from_id;
int to_id;
- from_end = skiptowhite(from_start);
- to_start = skipwhite(from_end);
- to_end = skiptowhite(to_start);
+ from_end = (const char *)skiptowhite((const char_u *)from_start);
+ to_start = (const char *)skipwhite((const char_u *)from_end);
+ to_end = (const char *)skiptowhite((const char_u *)to_start);
- if (ends_excmd(*from_start) || ends_excmd(*to_start)) {
- EMSG2(_("E412: Not enough arguments: \":highlight link %s\""),
- from_start);
+ if (ends_excmd((uint8_t)(*from_start))
+ || ends_excmd((uint8_t)(*to_start))) {
+ emsgf(_("E412: Not enough arguments: \":highlight link %s\""),
+ from_start);
return;
}
- if (!ends_excmd(*skipwhite(to_end))) {
- EMSG2(_("E413: Too many arguments: \":highlight link %s\""), from_start);
+ if (!ends_excmd(*skipwhite((const char_u *)to_end))) {
+ emsgf(_("E413: Too many arguments: \":highlight link %s\""), from_start);
return;
}
- from_id = syn_check_group(from_start, (int)(from_end - from_start));
- if (STRNCMP(to_start, "NONE", 4) == 0)
+ from_id = syn_check_group((const char_u *)from_start,
+ (int)(from_end - from_start));
+ if (strncmp(to_start, "NONE", 4) == 0) {
to_id = 0;
- else
- to_id = syn_check_group(to_start, (int)(to_end - to_start));
+ } else {
+ to_id = syn_check_group((const char_u *)to_start,
+ (int)(to_end - to_start));
+ }
if (from_id > 0 && (!init || HL_TABLE()[from_id - 1].sg_set == 0)) {
- /*
- * Don't allow a link when there already is some highlighting
- * for the group, unless '!' is used
- */
+ // Don't allow a link when there already is some highlighting
+ // for the group, unless '!' is used
if (to_id > 0 && !forceit && !init
&& hl_has_settings(from_id - 1, dodefault)) {
- if (sourcing_name == NULL && !dodefault)
+ if (sourcing_name == NULL && !dodefault) {
EMSG(_("E414: group has settings, highlight link ignored"));
- } else {
- if (!init)
+ }
+ } else if (HL_TABLE()[from_id - 1].sg_link != to_id
+ || HL_TABLE()[from_id - 1].sg_scriptID != current_SID
+ || HL_TABLE()[from_id - 1].sg_cleared) {
+ if (!init) {
HL_TABLE()[from_id - 1].sg_set |= SG_LINK;
+ }
HL_TABLE()[from_id - 1].sg_link = to_id;
HL_TABLE()[from_id - 1].sg_scriptID = current_SID;
+ HL_TABLE()[from_id - 1].sg_cleared = false;
redraw_all_later(SOME_VALID);
+
+ // Only call highlight changed() once after multiple changes
+ need_highlight_changed = true;
}
}
- /* Only call highlight_changed() once, after sourcing a syntax file */
- need_highlight_changed = TRUE;
-
return;
}
if (doclear) {
- /*
- * ":highlight clear [group]" command.
- */
+ // ":highlight clear [group]" command.
line = linep;
- if (ends_excmd(*line)) {
- do_unlet((char_u *)"colors_name", TRUE);
+ if (ends_excmd((uint8_t)(*line))) {
+ do_unlet(S_LEN("colors_name"), true);
restore_cterm_colors();
- /*
- * Clear all default highlight groups and load the defaults.
- */
- for (int idx = 0; idx < highlight_ga.ga_len; ++idx) {
- highlight_clear(idx);
+ // Clear all default highlight groups and load the defaults.
+ for (int j = 0; j < highlight_ga.ga_len; j++) {
+ highlight_clear(j);
}
- init_highlight(TRUE, TRUE);
+ init_highlight(true, true);
highlight_changed();
- redraw_later_clear();
+ redraw_all_later(NOT_VALID);
return;
}
- name_end = skiptowhite(line);
- linep = skipwhite(name_end);
+ name_end = (const char *)skiptowhite((const char_u *)line);
+ linep = (const char *)skipwhite((const char_u *)name_end);
}
- /*
- * Find the group name in the table. If it does not exist yet, add it.
- */
- id = syn_check_group(line, (int)(name_end - line));
- if (id == 0) /* failed (out of memory) */
+ // Find the group name in the table. If it does not exist yet, add it.
+ id = syn_check_group((const char_u *)line, (int)(name_end - line));
+ if (id == 0) { // Failed (out of memory).
return;
- idx = id - 1; /* index is ID minus one */
+ }
+ idx = id - 1; // Index is ID minus one.
- /* Return if "default" was used and the group already has settings. */
- if (dodefault && hl_has_settings(idx, TRUE))
+ // Return if "default" was used and the group already has settings
+ if (dodefault && hl_has_settings(idx, true)) {
return;
+ }
- if (STRCMP(HL_TABLE()[idx].sg_name_u, "NORMAL") == 0)
- is_normal_group = TRUE;
+ // Make a copy so we can check if any attribute actually changed
+ item_before = HL_TABLE()[idx];
+ is_normal_group = (STRCMP(HL_TABLE()[idx].sg_name_u, "NORMAL") == 0);
- /* Clear the highlighting for ":hi clear {group}" and ":hi clear". */
+ // Clear the highlighting for ":hi clear {group}" and ":hi clear".
if (doclear || (forceit && init)) {
highlight_clear(idx);
- if (!doclear)
+ if (!doclear) {
HL_TABLE()[idx].sg_set = 0;
+ }
}
- if (!doclear)
- while (!ends_excmd(*linep)) {
+ char *key = NULL;
+ char *arg = NULL;
+ if (!doclear) {
+ while (!ends_excmd((uint8_t)(*linep))) {
key_start = linep;
if (*linep == '=') {
- EMSG2(_("E415: unexpected equal sign: %s"), key_start);
- error = TRUE;
+ emsgf(_("E415: unexpected equal sign: %s"), key_start);
+ error = true;
break;
}
@@ -6258,61 +6622,58 @@ do_highlight (
linep++;
}
xfree(key);
- key = vim_strnsave_up(key_start, (int)(linep - key_start));
- linep = skipwhite(linep);
+ key = (char *)vim_strnsave_up((const char_u *)key_start,
+ (int)(linep - key_start));
+ linep = (const char *)skipwhite((const char_u *)linep);
- if (STRCMP(key, "NONE") == 0) {
+ if (strcmp(key, "NONE") == 0) {
if (!init || HL_TABLE()[idx].sg_set == 0) {
- if (!init)
+ if (!init) {
HL_TABLE()[idx].sg_set |= SG_CTERM+SG_GUI;
+ }
highlight_clear(idx);
}
continue;
}
- /*
- * Check for the equal sign.
- */
+ // Check for the equal sign.
if (*linep != '=') {
- EMSG2(_("E416: missing equal sign: %s"), key_start);
- error = TRUE;
+ emsgf(_("E416: missing equal sign: %s"), key_start);
+ error = true;
break;
}
- ++linep;
+ linep++;
- /*
- * Isolate the argument.
- */
- linep = skipwhite(linep);
- if (*linep == '\'') { /* guifg='color name' */
+ // Isolate the argument.
+ linep = (const char *)skipwhite((const char_u *)linep);
+ if (*linep == '\'') { // guifg='color name'
arg_start = ++linep;
- linep = vim_strchr(linep, '\'');
+ linep = strchr(linep, '\'');
if (linep == NULL) {
- EMSG2(_(e_invarg2), key_start);
- error = TRUE;
+ emsgf(_(e_invarg2), key_start);
+ error = true;
break;
}
} else {
arg_start = linep;
- linep = skiptowhite(linep);
+ linep = (const char *)skiptowhite((const char_u *)linep);
}
if (linep == arg_start) {
- EMSG2(_("E417: missing argument: %s"), key_start);
- error = TRUE;
+ emsgf(_("E417: missing argument: %s"), key_start);
+ error = true;
break;
}
xfree(arg);
- arg = vim_strnsave(arg_start, (int)(linep - arg_start));
+ arg = xstrndup(arg_start, (size_t)(linep - arg_start));
- if (*linep == '\'')
- ++linep;
+ if (*linep == '\'') {
+ linep++;
+ }
- /*
- * Store the argument.
- */
- if ( STRCMP(key, "TERM") == 0
- || STRCMP(key, "CTERM") == 0
- || STRCMP(key, "GUI") == 0) {
+ // Store the argument.
+ if (strcmp(key, "TERM") == 0
+ || strcmp(key, "CTERM") == 0
+ || strcmp(key, "GUI") == 0) {
attr = 0;
off = 0;
while (arg[off] != NUL) {
@@ -6325,52 +6686,56 @@ do_highlight (
}
}
if (i < 0) {
- EMSG2(_("E418: Illegal value: %s"), arg);
- error = TRUE;
+ emsgf(_("E418: Illegal value: %s"), arg);
+ error = true;
break;
}
- if (arg[off] == ',') /* another one follows */
- ++off;
+ if (arg[off] == ',') { // Another one follows.
+ off++;
+ }
}
- if (error)
+ if (error) {
break;
+ }
if (*key == 'C') {
if (!init || !(HL_TABLE()[idx].sg_set & SG_CTERM)) {
- if (!init)
+ if (!init) {
HL_TABLE()[idx].sg_set |= SG_CTERM;
+ }
HL_TABLE()[idx].sg_cterm = attr;
- HL_TABLE()[idx].sg_cterm_bold = FALSE;
+ HL_TABLE()[idx].sg_cterm_bold = false;
}
} else if (*key == 'G') {
if (!init || !(HL_TABLE()[idx].sg_set & SG_GUI)) {
- if (!init)
+ if (!init) {
HL_TABLE()[idx].sg_set |= SG_GUI;
+ }
HL_TABLE()[idx].sg_gui = attr;
}
}
} else if (STRCMP(key, "FONT") == 0) {
- /* in non-GUI fonts are simply ignored */
- } else if (STRCMP(key,
- "CTERMFG") == 0 || STRCMP(key, "CTERMBG") == 0) {
+ // in non-GUI fonts are simply ignored
+ } else if (STRCMP(key, "CTERMFG") == 0 || STRCMP(key, "CTERMBG") == 0) {
if (!init || !(HL_TABLE()[idx].sg_set & SG_CTERM)) {
- if (!init)
+ if (!init) {
HL_TABLE()[idx].sg_set |= SG_CTERM;
+ }
/* When setting the foreground color, and previously the "bold"
* flag was set for a light color, reset it now */
if (key[5] == 'F' && HL_TABLE()[idx].sg_cterm_bold) {
HL_TABLE()[idx].sg_cterm &= ~HL_BOLD;
- HL_TABLE()[idx].sg_cterm_bold = FALSE;
+ HL_TABLE()[idx].sg_cterm_bold = false;
}
- if (ascii_isdigit(*arg))
+ if (ascii_isdigit(*arg)) {
color = atoi((char *)arg);
- else if (STRICMP(arg, "fg") == 0) {
- if (cterm_normal_fg_color)
+ } else if (STRICMP(arg, "fg") == 0) {
+ if (cterm_normal_fg_color) {
color = cterm_normal_fg_color - 1;
- else {
+ } else {
EMSG(_("E419: FG color unknown"));
- error = TRUE;
+ error = true;
break;
}
} else if (STRICMP(arg, "bg") == 0) {
@@ -6378,134 +6743,81 @@ do_highlight (
color = cterm_normal_bg_color - 1;
else {
EMSG(_("E420: BG color unknown"));
- error = TRUE;
+ error = true;
break;
}
} else {
- static char *(color_names[28]) = {
- "Black", "DarkBlue", "DarkGreen", "DarkCyan",
- "DarkRed", "DarkMagenta", "Brown", "DarkYellow",
- "Gray", "Grey",
- "LightGray", "LightGrey", "DarkGray", "DarkGrey",
- "Blue", "LightBlue", "Green", "LightGreen",
- "Cyan", "LightCyan", "Red", "LightRed", "Magenta",
- "LightMagenta", "Yellow", "LightYellow", "White", "NONE"
- };
- static int color_numbers_16[28] = {0, 1, 2, 3,
- 4, 5, 6, 6,
- 7, 7,
- 7, 7, 8, 8,
- 9, 9, 10, 10,
- 11, 11, 12, 12, 13,
- 13, 14, 14, 15, -1};
- /* for xterm with 88 colors... */
- static int color_numbers_88[28] = {0, 4, 2, 6,
- 1, 5, 32, 72,
- 84, 84,
- 7, 7, 82, 82,
- 12, 43, 10, 61,
- 14, 63, 9, 74, 13,
- 75, 11, 78, 15, -1};
- /* for xterm with 256 colors... */
- static int color_numbers_256[28] = {0, 4, 2, 6,
- 1, 5, 130, 130,
- 248, 248,
- 7, 7, 242, 242,
- 12, 81, 10, 121,
- 14, 159, 9, 224, 13,
- 225, 11, 229, 15, -1};
- /* for terminals with less than 16 colors... */
- static int color_numbers_8[28] = {0, 4, 2, 6,
- 1, 5, 3, 3,
- 7, 7,
- 7, 7, 0+8, 0+8,
- 4+8, 4+8, 2+8, 2+8,
- 6+8, 6+8, 1+8, 1+8, 5+8,
- 5+8, 3+8, 3+8, 7+8, -1};
-
- /* reduce calls to STRICMP a bit, it can be slow */
+ // Reduce calls to STRICMP a bit, it can be slow.
off = TOUPPER_ASC(*arg);
- for (i = ARRAY_SIZE(color_names); --i >= 0; )
+ for (i = ARRAY_SIZE(color_names); --i >= 0; ) {
if (off == color_names[i][0]
- && STRICMP(arg + 1, color_names[i] + 1) == 0)
+ && STRICMP(arg + 1, color_names[i] + 1) == 0) {
break;
+ }
+ }
if (i < 0) {
- EMSG2(_(
- "E421: Color name or number not recognized: %s"),
- key_start);
- error = TRUE;
+ emsgf(_("E421: Color name or number not recognized: %s"),
+ key_start);
+ error = true;
break;
}
- /* Use the _16 table to check if its a valid color name. */
- color = color_numbers_16[i];
- if (color >= 0) {
- if (t_colors == 8) {
- /* t_Co is 8: use the 8 colors table */
- color = color_numbers_8[i];
- if (key[5] == 'F') {
- /* set/reset bold attribute to get light foreground
- * colors (on some terminals, e.g. "linux") */
- if (color & 8) {
- HL_TABLE()[idx].sg_cterm |= HL_BOLD;
- HL_TABLE()[idx].sg_cterm_bold = TRUE;
- } else
- HL_TABLE()[idx].sg_cterm &= ~HL_BOLD;
- }
- color &= 7; // truncate to 8 colors
- } else if (t_colors == 16 || t_colors == 88 || t_colors >= 256) {
- if (t_colors == 88) {
- color = color_numbers_88[i];
- } else if (t_colors >= 256) {
- color = color_numbers_256[i];
- } else {
- color = color_numbers_8[i];
- }
- }
+ TriState bold = kNone;
+ color = lookup_color(i, key[5] == 'F', &bold);
+
+ // set/reset bold attribute to get light foreground
+ // colors (on some terminals, e.g. "linux")
+ if (bold == kTrue) {
+ HL_TABLE()[idx].sg_cterm |= HL_BOLD;
+ HL_TABLE()[idx].sg_cterm_bold = true;
+ } else if (bold == kFalse) {
+ HL_TABLE()[idx].sg_cterm &= ~HL_BOLD;
}
}
- /* Add one to the argument, to avoid zero. Zero is used for
- * "NONE", then "color" is -1. */
+ // Add one to the argument, to avoid zero. Zero is used for
+ // "NONE", then "color" is -1.
if (key[5] == 'F') {
HL_TABLE()[idx].sg_cterm_fg = color + 1;
if (is_normal_group) {
cterm_normal_fg_color = color + 1;
- cterm_normal_fg_bold = (HL_TABLE()[idx].sg_cterm & HL_BOLD);
- {
- must_redraw = CLEAR;
- }
}
} else {
HL_TABLE()[idx].sg_cterm_bg = color + 1;
if (is_normal_group) {
cterm_normal_bg_color = color + 1;
if (!ui_rgb_attached()) {
- must_redraw = CLEAR;
if (color >= 0) {
- if (t_colors < 16)
- i = (color == 0 || color == 4);
- else
- i = (color < 7 || color == 8);
- /* Set the 'background' option if the value is
- * wrong. */
- if (i != (*p_bg == 'd'))
- set_option_value((char_u *)"bg", 0L,
- i ? (char_u *)"dark"
- : (char_u *)"light", 0);
+ int dark = -1;
+
+ if (t_colors < 16) {
+ dark = (color == 0 || color == 4);
+ } else if (color < 16) {
+ // Limit the heuristic to the standard 16 colors
+ dark = (color < 7 || color == 8);
+ }
+ // Set the 'background' option if the value is
+ // wrong.
+ if (dark != -1
+ && dark != (*p_bg == 'd')
+ && !option_was_set("bg")) {
+ set_option_value("bg", 0L, (dark ? "dark" : "light"), 0);
+ reset_option_was_set("bg");
+ }
}
}
}
}
}
- } else if (STRCMP(key, "GUIFG") == 0) {
+ } else if (strcmp(key, "GUIFG") == 0) {
if (!init || !(HL_TABLE()[idx].sg_set & SG_GUI)) {
- if (!init)
+ if (!init) {
HL_TABLE()[idx].sg_set |= SG_GUI;
+ }
xfree(HL_TABLE()[idx].sg_rgb_fg_name);
- if (STRCMP(arg, "NONE")) {
- HL_TABLE()[idx].sg_rgb_fg_name = (uint8_t *)xstrdup((char *)arg);
- HL_TABLE()[idx].sg_rgb_fg = name_to_color(arg);
+ if (strcmp(arg, "NONE")) {
+ HL_TABLE()[idx].sg_rgb_fg_name = (char_u *)xstrdup((char *)arg);
+ HL_TABLE()[idx].sg_rgb_fg = name_to_color((const char_u *)arg);
} else {
HL_TABLE()[idx].sg_rgb_fg_name = NULL;
HL_TABLE()[idx].sg_rgb_fg = -1;
@@ -6517,13 +6829,14 @@ do_highlight (
}
} else if (STRCMP(key, "GUIBG") == 0) {
if (!init || !(HL_TABLE()[idx].sg_set & SG_GUI)) {
- if (!init)
+ if (!init) {
HL_TABLE()[idx].sg_set |= SG_GUI;
+ }
xfree(HL_TABLE()[idx].sg_rgb_bg_name);
if (STRCMP(arg, "NONE") != 0) {
- HL_TABLE()[idx].sg_rgb_bg_name = (uint8_t *)xstrdup((char *)arg);
- HL_TABLE()[idx].sg_rgb_bg = name_to_color(arg);
+ HL_TABLE()[idx].sg_rgb_bg_name = (char_u *)xstrdup((char *)arg);
+ HL_TABLE()[idx].sg_rgb_bg = name_to_color((const char_u *)arg);
} else {
HL_TABLE()[idx].sg_rgb_bg_name = NULL;
HL_TABLE()[idx].sg_rgb_bg = -1;
@@ -6533,15 +6846,16 @@ do_highlight (
if (is_normal_group) {
normal_bg = HL_TABLE()[idx].sg_rgb_bg;
}
- } else if (STRCMP(key, "GUISP") == 0) {
+ } else if (strcmp(key, "GUISP") == 0) {
if (!init || !(HL_TABLE()[idx].sg_set & SG_GUI)) {
- if (!init)
+ if (!init) {
HL_TABLE()[idx].sg_set |= SG_GUI;
+ }
xfree(HL_TABLE()[idx].sg_rgb_sp_name);
- if (STRCMP(arg, "NONE") != 0) {
- HL_TABLE()[idx].sg_rgb_sp_name = (uint8_t *)xstrdup((char *)arg);
- HL_TABLE()[idx].sg_rgb_sp = name_to_color(arg);
+ if (strcmp(arg, "NONE") != 0) {
+ HL_TABLE()[idx].sg_rgb_sp_name = (char_u *)xstrdup((char *)arg);
+ HL_TABLE()[idx].sg_rgb_sp = name_to_color((const char_u *)arg);
} else {
HL_TABLE()[idx].sg_rgb_sp_name = NULL;
HL_TABLE()[idx].sg_rgb_sp = -1;
@@ -6551,46 +6865,60 @@ do_highlight (
if (is_normal_group) {
normal_sp = HL_TABLE()[idx].sg_rgb_sp;
}
- } else if (STRCMP(key, "START") == 0 || STRCMP(key, "STOP") == 0) {
+ } else if (strcmp(key, "START") == 0 || strcmp(key, "STOP") == 0) {
// Ignored for now
} else {
- EMSG2(_("E423: Illegal argument: %s"), key_start);
- error = TRUE;
+ emsgf(_("E423: Illegal argument: %s"), key_start);
+ error = true;
break;
}
+ HL_TABLE()[idx].sg_cleared = false;
- /*
- * When highlighting has been given for a group, don't link it.
- */
- if (!init || !(HL_TABLE()[idx].sg_set & SG_LINK))
+ // When highlighting has been given for a group, don't link it.
+ if (!init || !(HL_TABLE()[idx].sg_set & SG_LINK)) {
HL_TABLE()[idx].sg_link = 0;
+ }
- /*
- * Continue with next argument.
- */
- linep = skipwhite(linep);
+ // Continue with next argument.
+ linep = (const char *)skipwhite((const char_u *)linep);
}
+ }
- /*
- * If there is an error, and it's a new entry, remove it from the table.
- */
- if (error && idx == highlight_ga.ga_len)
+ // If there is an error, and it's a new entry, remove it from the table.
+ if (error && idx == highlight_ga.ga_len) {
syn_unadd_group();
- else {
- if (is_normal_group) {
- HL_TABLE()[idx].sg_attr = 0;
- // If the normal group has changed, it is simpler to refresh every UI
- ui_refresh();
- } else
+ } else {
+ if (!error && is_normal_group) {
+ // Need to update all groups, because they might be using "bg" and/or
+ // "fg", which have been changed now.
+ highlight_attr_set_all();
+
+ if (!ui_is_external(kUILinegrid) && starting == 0) {
+ // Older UIs assume that we clear the screen after normal group is
+ // changed
+ ui_refresh();
+ } else {
+ // TUI and newer UIs will repaint the screen themselves. NOT_VALID
+ // redraw below will still handle usages of guibg=fg etc.
+ ui_default_colors_set();
+ }
+ did_highlight_changed = true;
+ redraw_all_later(NOT_VALID);
+ } else {
set_hl_attr(idx);
+ }
HL_TABLE()[idx].sg_scriptID = current_SID;
- redraw_all_later(NOT_VALID);
}
xfree(key);
xfree(arg);
- /* Only call highlight_changed() once, after sourcing a syntax file */
- need_highlight_changed = TRUE;
+ // Only call highlight_changed() once, after a sequence of highlight
+ // commands, and only if an attribute actually changed
+ if (memcmp(&HL_TABLE()[idx], &item_before, sizeof(item_before)) != 0
+ && !did_highlight_changed) {
+ redraw_all_later(NOT_VALID);
+ need_highlight_changed = true;
+ }
}
#if defined(EXITFREE)
@@ -6616,7 +6944,6 @@ void restore_cterm_colors(void)
normal_bg = -1;
normal_sp = -1;
cterm_normal_fg_color = 0;
- cterm_normal_fg_bold = 0;
cterm_normal_bg_color = 0;
}
@@ -6640,9 +6967,11 @@ static int hl_has_settings(int idx, int check_link)
*/
static void highlight_clear(int idx)
{
+ HL_TABLE()[idx].sg_cleared = true;
+
HL_TABLE()[idx].sg_attr = 0;
HL_TABLE()[idx].sg_cterm = 0;
- HL_TABLE()[idx].sg_cterm_bold = FALSE;
+ HL_TABLE()[idx].sg_cterm_bold = false;
HL_TABLE()[idx].sg_cterm_fg = 0;
HL_TABLE()[idx].sg_cterm_bg = 0;
HL_TABLE()[idx].sg_gui = 0;
@@ -6663,171 +6992,17 @@ static void highlight_clear(int idx)
}
-/*
- * Table with the specifications for an attribute number.
- * Note that this table is used by ALL buffers. This is required because the
- * GUI can redraw at any time for any buffer.
- */
-static garray_T attr_table = GA_EMPTY_INIT_VALUE;
-
-#define ATTR_ENTRY(idx) ((attrentry_T *)attr_table.ga_data)[idx]
-
-
-/*
- * Return the attr number for a set of colors and font.
- * Add a new entry to the term_attr_table, attr_table or gui_attr_table
- * if the combination is new.
- * Return 0 for error.
- */
-int get_attr_entry(attrentry_T *aep)
-{
- garray_T *table = &attr_table;
- attrentry_T *taep;
- static int recursive = FALSE;
-
- /*
- * Init the table, in case it wasn't done yet.
- */
- table->ga_itemsize = sizeof(attrentry_T);
- ga_set_growsize(table, 7);
-
- /*
- * Try to find an entry with the same specifications.
- */
- for (int i = 0; i < table->ga_len; ++i) {
- taep = &(((attrentry_T *)table->ga_data)[i]);
- if (aep->cterm_ae_attr == taep->cterm_ae_attr
- && aep->cterm_fg_color == taep->cterm_fg_color
- && aep->cterm_bg_color == taep->cterm_bg_color
- && aep->rgb_ae_attr == taep->rgb_ae_attr
- && aep->rgb_fg_color == taep->rgb_fg_color
- && aep->rgb_bg_color == taep->rgb_bg_color
- && aep->rgb_sp_color == taep->rgb_sp_color) {
- return i + ATTR_OFF;
- }
- }
-
- if (table->ga_len + ATTR_OFF > MAX_TYPENR) {
- /*
- * Running out of attribute entries! remove all attributes, and
- * compute new ones for all groups.
- * When called recursively, we are really out of numbers.
- */
- if (recursive) {
- EMSG(_("E424: Too many different highlighting attributes in use"));
- return 0;
- }
- recursive = TRUE;
-
- clear_hl_tables();
-
- must_redraw = CLEAR;
-
- for (int i = 0; i < highlight_ga.ga_len; ++i) {
- set_hl_attr(i);
- }
-
- recursive = FALSE;
- }
-
-
- // This is a new combination of colors and font, add an entry.
- taep = GA_APPEND_VIA_PTR(attrentry_T, table);
- memset(taep, 0, sizeof(*taep));
- taep->cterm_ae_attr = aep->cterm_ae_attr;
- taep->cterm_fg_color = aep->cterm_fg_color;
- taep->cterm_bg_color = aep->cterm_bg_color;
- taep->rgb_ae_attr = aep->rgb_ae_attr;
- taep->rgb_fg_color = aep->rgb_fg_color;
- taep->rgb_bg_color = aep->rgb_bg_color;
- taep->rgb_sp_color = aep->rgb_sp_color;
-
- return table->ga_len - 1 + ATTR_OFF;
-}
-
-// Clear all highlight tables.
-void clear_hl_tables(void)
-{
- ga_clear(&attr_table);
-}
-
-// Combine special attributes (e.g., for spelling) with other attributes
-// (e.g., for syntax highlighting).
-// "prim_attr" overrules "char_attr".
-// This creates a new group when required.
-// Since we expect there to be few spelling mistakes we don't cache the
-// result.
-// Return the resulting attributes.
-int hl_combine_attr(int char_attr, int prim_attr)
-{
- attrentry_T *char_aep = NULL;
- attrentry_T *spell_aep;
- attrentry_T new_en;
-
- if (char_attr == 0) {
- return prim_attr;
- }
-
- if (prim_attr == 0) {
- return char_attr;
- }
-
- // Find the entry for char_attr
- char_aep = syn_cterm_attr2entry(char_attr);
-
- if (char_aep != NULL) {
- // Copy all attributes from char_aep to the new entry
- new_en = *char_aep;
- } else {
- memset(&new_en, 0, sizeof(new_en));
- }
-
- spell_aep = syn_cterm_attr2entry(prim_attr);
- if (spell_aep != NULL) {
- new_en.cterm_ae_attr |= spell_aep->cterm_ae_attr;
- new_en.rgb_ae_attr |= spell_aep->rgb_ae_attr;
-
- if (spell_aep->cterm_fg_color > 0) {
- new_en.cterm_fg_color = spell_aep->cterm_fg_color;
- }
-
- if (spell_aep->cterm_bg_color > 0) {
- new_en.cterm_bg_color = spell_aep->cterm_bg_color;
- }
-
- if (spell_aep->rgb_fg_color >= 0) {
- new_en.rgb_fg_color = spell_aep->rgb_fg_color;
- }
-
- if (spell_aep->rgb_bg_color >= 0) {
- new_en.rgb_bg_color = spell_aep->rgb_bg_color;
- }
-
- if (spell_aep->rgb_sp_color >= 0) {
- new_en.rgb_sp_color = spell_aep->rgb_sp_color;
- }
- }
- return get_attr_entry(&new_en);
-}
-
-attrentry_T *syn_cterm_attr2entry(int attr)
-{
- attr -= ATTR_OFF;
- if (attr >= attr_table.ga_len) /* did ":syntax clear" */
- return NULL;
- return &(ATTR_ENTRY(attr));
-}
-
+/// \addtogroup LIST_XXX
+/// @{
#define LIST_ATTR 1
#define LIST_STRING 2
#define LIST_INT 3
+/// @}
-static void highlight_list_one(int id)
+static void highlight_list_one(const int id)
{
- struct hl_group *sgp;
- int didh = FALSE;
-
- sgp = &HL_TABLE()[id - 1]; /* index is ID minus one */
+ struct hl_group *const sgp = &HL_TABLE()[id - 1]; // index is ID minus one
+ bool didh = false;
didh = highlight_list_arg(id, didh, LIST_ATTR,
sgp->sg_cterm, NULL, "cterm");
@@ -6847,8 +7022,8 @@ static void highlight_list_one(int id)
if (sgp->sg_link && !got_int) {
(void)syn_list_header(didh, 9999, id);
- didh = TRUE;
- msg_puts_attr((char_u *)"links to", hl_attr(HLF_D));
+ didh = true;
+ msg_puts_attr("links to", HL_ATTR(HLF_D));
msg_putchar(' ');
msg_outtrans(HL_TABLE()[HL_TABLE()[id - 1].sg_link - 1].sg_name);
}
@@ -6859,39 +7034,44 @@ static void highlight_list_one(int id)
last_set_msg(sgp->sg_scriptID);
}
-static int highlight_list_arg(int id, int didh, int type, int iarg, char_u *sarg, char *name)
+/// Outputs a highlight when doing ":hi MyHighlight"
+///
+/// @param type one of \ref LIST_XXX
+/// @param iarg integer argument used if \p type == LIST_INT
+/// @param sarg string used if \p type == LIST_STRING
+static bool highlight_list_arg(
+ const int id, bool didh, const int type, int iarg,
+ char_u *const sarg, const char *const name)
{
char_u buf[100];
- char_u *ts;
- int i;
- if (got_int)
- return FALSE;
+ if (got_int) {
+ return false;
+ }
if (type == LIST_STRING ? (sarg != NULL) : (iarg != 0)) {
- ts = buf;
- if (type == LIST_INT)
- sprintf((char *)buf, "%d", iarg - 1);
- else if (type == LIST_STRING)
+ char_u *ts = buf;
+ if (type == LIST_INT) {
+ snprintf((char *)buf, sizeof(buf), "%d", iarg - 1);
+ } else if (type == LIST_STRING) {
ts = sarg;
- else { /* type == LIST_ATTR */
+ } else { // type == LIST_ATTR
buf[0] = NUL;
- for (i = 0; hl_attr_table[i] != 0; ++i) {
+ for (int i = 0; hl_attr_table[i] != 0; i++) {
if (iarg & hl_attr_table[i]) {
if (buf[0] != NUL)
- vim_strcat(buf, (char_u *)",", 100);
- vim_strcat(buf, (char_u *)hl_name_table[i], 100);
+ xstrlcat((char *)buf, ",", 100);
+ xstrlcat((char *)buf, hl_name_table[i], 100);
iarg &= ~hl_attr_table[i]; /* don't want "inverse" */
}
}
}
- (void)syn_list_header(didh,
- (int)(vim_strsize(ts) + STRLEN(name) + 1), id);
- didh = TRUE;
+ (void)syn_list_header(didh, (int)(vim_strsize(ts) + STRLEN(name) + 1), id);
+ didh = true;
if (!got_int) {
if (*name != NUL) {
- MSG_PUTS_ATTR(name, hl_attr(HLF_D));
- MSG_PUTS_ATTR("=", hl_attr(HLF_D));
+ MSG_PUTS_ATTR(name, HL_ATTR(HLF_D));
+ MSG_PUTS_ATTR("=", HL_ATTR(HLF_D));
}
msg_outtrans(ts);
}
@@ -6899,21 +7079,21 @@ static int highlight_list_arg(int id, int didh, int type, int iarg, char_u *sarg
return didh;
}
-/*
- * Return "1" if highlight group "id" has attribute "flag".
- * Return NULL otherwise.
- */
-char_u *
-highlight_has_attr (
- int id,
- int flag,
- int modec // 'g' for GUI, 'c' for cterm
-)
+/// Check whether highlight group has attribute
+///
+/// @param[in] id Highlight group to check.
+/// @param[in] flag Attribute to check.
+/// @param[in] modec 'g' for GUI, 'c' for term.
+///
+/// @return "1" if highlight group has attribute, NULL otherwise.
+const char *highlight_has_attr(const int id, const int flag, const int modec)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_PURE
{
int attr;
- if (id <= 0 || id > highlight_ga.ga_len)
+ if (id <= 0 || id > highlight_ga.ga_len) {
return NULL;
+ }
if (modec == 'g') {
attr = HL_TABLE()[id - 1].sg_gui;
@@ -6921,39 +7101,42 @@ highlight_has_attr (
attr = HL_TABLE()[id - 1].sg_cterm;
}
- if (attr & flag)
- return (char_u *)"1";
- return NULL;
+ return (attr & flag) ? "1" : NULL;
}
-/*
- * Return color name of highlight group "id".
- */
-char_u *
-highlight_color (
- int id,
- char_u *what, /* "font", "fg", "bg", "sp", "fg#", "bg#" or "sp#" */
- int modec /* 'g' for GUI, 'c' for cterm, 't' for term */
-)
+/// Return color name of the given highlight group
+///
+/// @param[in] id Highlight group to work with.
+/// @param[in] what What to return: one of "font", "fg", "bg", "sp", "fg#",
+/// "bg#" or "sp#".
+/// @param[in] modec 'g' for GUI, 'c' for cterm and 't' for term.
+///
+/// @return color name, possibly in a static buffer. Buffer will be overwritten
+/// on next highlight_color() call. May return NULL.
+const char *highlight_color(const int id, const char *const what,
+ const int modec)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
{
- static char_u name[20];
+ static char name[20];
int n;
- int fg = FALSE;
- int sp = FALSE;
- int font = FALSE;
+ bool fg = false;
+ bool sp = false;
+ bool font = false;
- if (id <= 0 || id > highlight_ga.ga_len)
+ if (id <= 0 || id > highlight_ga.ga_len) {
return NULL;
+ }
- if (TOLOWER_ASC(what[0]) == 'f' && TOLOWER_ASC(what[1]) == 'g')
- fg = TRUE;
- else if (TOLOWER_ASC(what[0]) == 'f' && TOLOWER_ASC(what[1]) == 'o'
- && TOLOWER_ASC(what[2]) == 'n' && TOLOWER_ASC(what[3]) == 't')
- font = TRUE;
- else if (TOLOWER_ASC(what[0]) == 's' && TOLOWER_ASC(what[1]) == 'p')
- sp = TRUE;
- else if (!(TOLOWER_ASC(what[0]) == 'b' && TOLOWER_ASC(what[1]) == 'g'))
+ if (TOLOWER_ASC(what[0]) == 'f' && TOLOWER_ASC(what[1]) == 'g') {
+ fg = true;
+ } else if (TOLOWER_ASC(what[0]) == 'f' && TOLOWER_ASC(what[1]) == 'o'
+ && TOLOWER_ASC(what[2]) == 'n' && TOLOWER_ASC(what[3]) == 't') {
+ font = true;
+ } else if (TOLOWER_ASC(what[0]) == 's' && TOLOWER_ASC(what[1]) == 'p') {
+ sp = true;
+ } else if (!(TOLOWER_ASC(what[0]) == 'b' && TOLOWER_ASC(what[1]) == 'g')) {
return NULL;
+ }
if (modec == 'g') {
if (what[2] == '#' && ui_rgb_attached()) {
if (fg) {
@@ -6966,58 +7149,64 @@ highlight_color (
if (n < 0 || n > 0xffffff) {
return NULL;
}
- snprintf((char *)name, sizeof(name), "#%06x", n);
+ snprintf(name, sizeof(name), "#%06x", n);
return name;
}
if (fg) {
- return HL_TABLE()[id - 1].sg_rgb_fg_name;
+ return (const char *)HL_TABLE()[id - 1].sg_rgb_fg_name;
}
if (sp) {
- return HL_TABLE()[id - 1].sg_rgb_sp_name;
+ return (const char *)HL_TABLE()[id - 1].sg_rgb_sp_name;
}
- return HL_TABLE()[id - 1].sg_rgb_bg_name;
+ return (const char *)HL_TABLE()[id - 1].sg_rgb_bg_name;
}
- if (font || sp)
+ if (font || sp) {
return NULL;
+ }
if (modec == 'c') {
- if (fg)
+ if (fg) {
n = HL_TABLE()[id - 1].sg_cterm_fg - 1;
- else
+ } else {
n = HL_TABLE()[id - 1].sg_cterm_bg - 1;
- sprintf((char *)name, "%d", n);
+ }
+ if (n < 0) {
+ return NULL;
+ }
+ snprintf(name, sizeof(name), "%d", n);
return name;
}
- /* term doesn't have color */
+ // term doesn't have color.
return NULL;
}
-/*
- * Output the syntax list header.
- * Return TRUE when started a new line.
- */
-static int
-syn_list_header (
- int did_header, /* did header already */
- int outlen, /* length of string that comes */
- int id /* highlight group id */
-)
+/// Output the syntax list header.
+///
+/// @param did_header did header already
+/// @param outlen length of string that comes
+/// @param id highlight group id
+/// @return true when started a new line.
+static bool syn_list_header(const bool did_header, const int outlen,
+ const int id)
{
int endcol = 19;
- int newline = TRUE;
+ bool newline = true;
if (!did_header) {
msg_putchar('\n');
- if (got_int)
- return TRUE;
+ if (got_int) {
+ return true;
+ }
msg_outtrans(HL_TABLE()[id - 1].sg_name);
endcol = 15;
} else if (msg_col + outlen + 1 >= Columns) {
msg_putchar('\n');
- if (got_int)
- return TRUE;
+ if (got_int) {
+ return true;
+ }
} else {
- if (msg_col >= endcol) /* wrap around is like starting a new line */
- newline = FALSE;
+ if (msg_col >= endcol) { // wrap around is like starting a new line
+ newline = false;
+ }
}
if (msg_col >= endcol) /* output at least one space */
@@ -7029,29 +7218,21 @@ syn_list_header (
/* Show "xxx" with the attributes. */
if (!did_header) {
- msg_puts_attr((char_u *)"xxx", syn_id2attr(id));
+ msg_puts_attr("xxx", syn_id2attr(id));
msg_putchar(' ');
}
return newline;
}
-/*
- * Set the attribute numbers for a highlight group.
- * Called after one of the attributes has changed.
- */
-static void
-set_hl_attr (
- int idx /* index in array */
-)
+/// Set the attribute numbers for a highlight group.
+/// Called after one of the attributes has changed.
+/// @param idx corrected highlight index
+static void set_hl_attr(int idx)
{
- attrentry_T at_en;
+ HlAttrs at_en = HLATTRS_INIT;
struct hl_group *sgp = HL_TABLE() + idx;
- /* The "Normal" group doesn't need an attribute number */
- if (sgp->sg_name_u != NULL && STRCMP(sgp->sg_name_u, "NORMAL") == 0)
- return;
-
at_en.cterm_ae_attr = sgp->sg_cterm;
at_en.cterm_fg_color = sgp->sg_cterm_fg;
at_en.cterm_bg_color = sgp->sg_cterm_bg;
@@ -7063,22 +7244,19 @@ set_hl_attr (
at_en.rgb_bg_color = sgp->sg_rgb_bg_name ? sgp->sg_rgb_bg : -1;
at_en.rgb_sp_color = sgp->sg_rgb_sp_name ? sgp->sg_rgb_sp : -1;
- if (at_en.cterm_fg_color != 0 || at_en.cterm_bg_color != 0
- || at_en.rgb_fg_color != -1 || at_en.rgb_bg_color != -1
- || at_en.rgb_sp_color != -1 || at_en.cterm_ae_attr != 0
- || at_en.rgb_ae_attr != 0) {
- sgp->sg_attr = get_attr_entry(&at_en);
- } else {
- // If all the fields are cleared, clear the attr field back to default value
- sgp->sg_attr = 0;
+ sgp->sg_attr = hl_get_syn_attr(idx+1, at_en);
+
+ // a cursor style uses this syn_id, make sure its atribute is updated.
+ if (cursor_mode_uses_syn_id(idx+1)) {
+ ui_mode_info_set();
}
}
-/*
- * Lookup a highlight group name and return it's ID.
- * If it is not found, 0 is returned.
- */
-int syn_name2id(char_u *name)
+/// Lookup a highlight group name and return its ID.
+///
+/// @param highlight name e.g. 'Cursor', 'Normal'
+/// @return the highlight id, else 0 if \p name does not exist
+int syn_name2id(const char_u *name)
{
int i;
char_u name_u[200];
@@ -7098,7 +7276,7 @@ int syn_name2id(char_u *name)
/*
* Return TRUE if highlight group "name" exists.
*/
-int highlight_exists(char_u *name)
+int highlight_exists(const char_u *name)
{
return syn_name2id(name) > 0;
}
@@ -7117,7 +7295,7 @@ char_u *syn_id2name(int id)
/*
* Like syn_name2id(), but take a pointer + length argument.
*/
-int syn_namen2id(char_u *linep, int len)
+int syn_namen2id(const char_u *linep, int len)
{
char_u *name = vim_strnsave(linep, len);
int id = syn_name2id(name);
@@ -7126,32 +7304,30 @@ int syn_namen2id(char_u *linep, int len)
return id;
}
-/*
- * Find highlight group name in the table and return it's ID.
- * The argument is a pointer to the name and the length of the name.
- * If it doesn't exist yet, a new entry is created.
- * Return 0 for failure.
- */
-int syn_check_group(char_u *pp, int len)
+/// Find highlight group name in the table and return its ID.
+/// If it doesn't exist yet, a new entry is created.
+///
+/// @param pp Highlight group name
+/// @param len length of \p pp
+///
+/// @return 0 for failure else the id of the group
+int syn_check_group(const char_u *pp, int len)
{
- int id;
- char_u *name;
-
- name = vim_strnsave(pp, len);
-
- id = syn_name2id(name);
- if (id == 0) /* doesn't exist yet */
+ char_u *name = vim_strnsave(pp, len);
+ int id = syn_name2id(name);
+ if (id == 0) { // doesn't exist yet
id = syn_add_group(name);
- else
+ } else {
xfree(name);
+ }
return id;
}
-/*
- * Add new highlight group and return it's ID.
- * "name" must be an allocated string, it will be consumed.
- * Return 0 for failure.
- */
+/// Add new highlight group and return its ID.
+///
+/// @param name must be an allocated string, it will be consumed.
+/// @return 0 for failure, else the allocated group id
+/// @see syn_check_group syn_unadd_group
static int syn_add_group(char_u *name)
{
char_u *p;
@@ -7165,7 +7341,7 @@ static int syn_add_group(char_u *name)
} else if (!ASCII_ISALNUM(*p) && *p != '_') {
/* This is an error, but since there previously was no check only
* give a warning. */
- msg_source(hl_attr(HLF_W));
+ msg_source(HL_ATTR(HLF_W));
MSG(_("W18: Invalid character in group name"));
break;
}
@@ -7189,25 +7365,26 @@ static int syn_add_group(char_u *name)
struct hl_group* hlgp = GA_APPEND_VIA_PTR(struct hl_group, &highlight_ga);
memset(hlgp, 0, sizeof(*hlgp));
hlgp->sg_name = name;
+ hlgp->sg_rgb_bg = -1;
+ hlgp->sg_rgb_fg = -1;
+ hlgp->sg_rgb_sp = -1;
hlgp->sg_name_u = vim_strsave_up(name);
return highlight_ga.ga_len; /* ID is index plus one */
}
-/*
- * When, just after calling syn_add_group(), an error is discovered, this
- * function deletes the new name.
- */
+/// When, just after calling syn_add_group(), an error is discovered, this
+/// function deletes the new name.
static void syn_unadd_group(void)
{
- --highlight_ga.ga_len;
+ highlight_ga.ga_len--;
xfree(HL_TABLE()[highlight_ga.ga_len].sg_name);
xfree(HL_TABLE()[highlight_ga.ga_len].sg_name_u);
}
-/*
- * Translate a group ID to highlight attributes.
- */
+
+/// Translate a group ID to highlight attributes.
+/// @see syn_attr2entry
int syn_id2attr(int hl_id)
{
struct hl_group *sgp;
@@ -7243,111 +7420,53 @@ int syn_get_final_id(int hl_id)
return hl_id;
}
+/// Refresh the color attributes of all highlight groups.
+void highlight_attr_set_all(void)
+{
+ for (int idx = 0; idx < highlight_ga.ga_len; idx++) {
+ struct hl_group *sgp = &HL_TABLE()[idx];
+ if (sgp->sg_rgb_bg_name != NULL) {
+ sgp->sg_rgb_bg = name_to_color(sgp->sg_rgb_bg_name);
+ }
+ if (sgp->sg_rgb_fg_name != NULL) {
+ sgp->sg_rgb_fg = name_to_color(sgp->sg_rgb_fg_name);
+ }
+ if (sgp->sg_rgb_sp_name != NULL) {
+ sgp->sg_rgb_sp = name_to_color(sgp->sg_rgb_sp_name);
+ }
+ set_hl_attr(idx);
+ }
+}
-/*
- * Translate the 'highlight' option into attributes in highlight_attr[] and
- * set up the user highlights User1..9. A set of
- * corresponding highlights to use on top of HLF_SNC is computed.
- * Called only when the 'highlight' option has been changed and upon first
- * screen redraw after any :highlight command.
- * Return FAIL when an invalid flag is found in 'highlight'. OK otherwise.
- */
-int highlight_changed(void)
+/// Tranlate highlight groups into attributes in highlight_attr[] and set up
+/// the user highlights User1..9. A set of corresponding highlights to use on
+/// top of HLF_SNC is computed. Called only when nvim starts and upon first
+/// screen redraw after any :highlight command.
+void highlight_changed(void)
{
- int hlf;
- int i;
- char_u *p;
- int attr;
- char_u *end;
int id;
char_u userhl[10];
int id_SNC = -1;
int id_S = -1;
int hlcnt;
- static int hl_flags[HLF_COUNT] = HL_FLAGS;
need_highlight_changed = FALSE;
- /*
- * Clear all attributes.
- */
- for (hlf = 0; hlf < (int)HLF_COUNT; ++hlf)
- highlight_attr[hlf] = 0;
-
- /*
- * First set all attributes to their default value.
- * Then use the attributes from the 'highlight' option.
- */
- for (i = 0; i < 2; ++i) {
- if (i)
- p = p_hl;
- else
- p = get_highlight_default();
- if (p == NULL) /* just in case */
- continue;
-
- while (*p) {
- for (hlf = 0; hlf < (int)HLF_COUNT; ++hlf)
- if (hl_flags[hlf] == *p)
- break;
- ++p;
- if (hlf == (int)HLF_COUNT || *p == NUL)
- return FAIL;
-
- /*
- * Allow several hl_flags to be combined, like "bu" for
- * bold-underlined.
- */
- attr = 0;
- bool colon = false;
- for (; *p && *p != ','; ++p) { // parse upto comma
- if (ascii_iswhite(*p)) { // ignore white space
- continue;
- }
-
- if (colon) /* Combination with ':' is not allowed. */
- return FAIL;
-
- switch (*p) {
- case 'b': attr |= HL_BOLD;
- break;
- case 'i': attr |= HL_ITALIC;
- break;
- case '-':
- case 'n': /* no highlighting */
- break;
- case 'r': attr |= HL_INVERSE;
- break;
- case 's': attr |= HL_STANDOUT;
- break;
- case 'u': attr |= HL_UNDERLINE;
- break;
- case 'c': attr |= HL_UNDERCURL;
- break;
- case ':': ++p; /* highlight group name */
- if (attr || *p == NUL) /* no combinations */
- return FAIL;
- colon = true;
- end = vim_strchr(p, ',');
- if (end == NULL)
- end = p + STRLEN(p);
- id = syn_check_group(p, (int)(end - p));
- if (id == 0)
- return FAIL;
- attr = syn_id2attr(id);
- p = end - 1;
- if (hlf == (int)HLF_SNC)
- id_SNC = syn_get_final_id(id);
- else if (hlf == (int)HLF_S)
- id_S = syn_get_final_id(id);
- break;
- default: return FAIL;
- }
- }
- highlight_attr[hlf] = attr;
-
- p = skip_to_option_part(p); /* skip comma and spaces */
+ /// Translate builtin highlight groups into attributes for quick lookup.
+ for (int hlf = 0; hlf < (int)HLF_COUNT; hlf++) {
+ id = syn_check_group((char_u *)hlf_names[hlf], STRLEN(hlf_names[hlf]));
+ if (id == 0) {
+ abort();
+ }
+ int final_id = syn_get_final_id(id);
+ if (hlf == (int)HLF_SNC) {
+ id_SNC = final_id;
+ } else if (hlf == (int)HLF_S) {
+ id_S = final_id;
}
+
+ highlight_attr[hlf] = hl_get_ui_attr(hlf, final_id,
+ hlf == (int)HLF_INACTIVE);
}
/* Setup the user highlights
@@ -7412,49 +7531,47 @@ int highlight_changed(void)
}
}
highlight_ga.ga_len = hlcnt;
-
- return OK;
}
/*
* Handle command line completion for :highlight command.
*/
-void set_context_in_highlight_cmd(expand_T *xp, char_u *arg)
+void set_context_in_highlight_cmd(expand_T *xp, const char *arg)
{
- char_u *p;
-
- /* Default: expand group names */
+ // Default: expand group names.
xp->xp_context = EXPAND_HIGHLIGHT;
- xp->xp_pattern = arg;
+ xp->xp_pattern = (char_u *)arg;
include_link = 2;
include_default = 1;
/* (part of) subcommand already typed */
if (*arg != NUL) {
- p = skiptowhite(arg);
- if (*p != NUL) { /* past "default" or group name */
+ const char *p = (const char *)skiptowhite((const char_u *)arg);
+ if (*p != NUL) { // Past "default" or group name.
include_default = 0;
- if (STRNCMP("default", arg, p - arg) == 0) {
- arg = skipwhite(p);
- xp->xp_pattern = arg;
- p = skiptowhite(arg);
+ if (strncmp("default", arg, p - arg) == 0) {
+ arg = (const char *)skipwhite((const char_u *)p);
+ xp->xp_pattern = (char_u *)arg;
+ p = (const char *)skiptowhite((const char_u *)arg);
}
if (*p != NUL) { /* past group name */
include_link = 0;
- if (arg[1] == 'i' && arg[0] == 'N')
+ if (arg[1] == 'i' && arg[0] == 'N') {
highlight_list();
- if (STRNCMP("link", arg, p - arg) == 0
- || STRNCMP("clear", arg, p - arg) == 0) {
- xp->xp_pattern = skipwhite(p);
- p = skiptowhite(xp->xp_pattern);
- if (*p != NUL) { /* past first group name */
- xp->xp_pattern = skipwhite(p);
- p = skiptowhite(xp->xp_pattern);
+ }
+ if (strncmp("link", arg, p - arg) == 0
+ || strncmp("clear", arg, p - arg) == 0) {
+ xp->xp_pattern = skipwhite((const char_u *)p);
+ p = (const char *)skiptowhite(xp->xp_pattern);
+ if (*p != NUL) { // Past first group name.
+ xp->xp_pattern = skipwhite((const char_u *)p);
+ p = (const char *)skiptowhite(xp->xp_pattern);
}
}
- if (*p != NUL) /* past group name(s) */
+ if (*p != NUL) { // Past group name(s).
xp->xp_context = EXPAND_NOTHING;
+ }
}
}
}
@@ -7467,216 +7584,754 @@ static void highlight_list(void)
{
int i;
- for (i = 10; --i >= 0; )
- highlight_list_two(i, hl_attr(HLF_D));
- for (i = 40; --i >= 0; )
+ for (i = 10; --i >= 0; ) {
+ highlight_list_two(i, HL_ATTR(HLF_D));
+ }
+ for (i = 40; --i >= 0; ) {
highlight_list_two(99, 0);
+ }
}
static void highlight_list_two(int cnt, int attr)
{
- msg_puts_attr((char_u *)&("N \bI \b! \b"[cnt / 11]), attr);
+ msg_puts_attr(&("N \bI \b! \b"[cnt / 11]), attr);
msg_clr_eos();
ui_flush();
os_delay(cnt == 99 ? 40L : (long)cnt * 50L, false);
}
-/*
- * Function given to ExpandGeneric() to obtain the list of group names.
- * Also used for synIDattr() function.
- */
-char_u *get_highlight_name(expand_T *xp, int idx)
-{
- //TODO: 'xp' is unused
- if (idx == highlight_ga.ga_len && include_none != 0)
- return (char_u *)"none";
- if (idx == highlight_ga.ga_len + include_none && include_default != 0)
- return (char_u *)"default";
- if (idx == highlight_ga.ga_len + include_none + include_default
- && include_link != 0)
- return (char_u *)"link";
- if (idx == highlight_ga.ga_len + include_none + include_default + 1
- && include_link != 0)
- return (char_u *)"clear";
- if (idx < 0 || idx >= highlight_ga.ga_len)
+/// Function given to ExpandGeneric() to obtain the list of group names.
+const char *get_highlight_name(expand_T *const xp, int idx)
+ FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ return get_highlight_name_ext(xp, idx, true);
+}
+
+
+/// Obtain a highlight group name.
+/// When "skip_cleared" is TRUE don't return a cleared entry.
+const char *get_highlight_name_ext(expand_T *xp, int idx, int skip_cleared)
+ FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ if (idx < 0) {
return NULL;
- return HL_TABLE()[idx].sg_name;
+ }
+
+ // Items are never removed from the table, skip the ones that were cleared.
+ if (skip_cleared && idx < highlight_ga.ga_len && HL_TABLE()[idx].sg_cleared) {
+ return "";
+ }
+
+ if (idx == highlight_ga.ga_len && include_none != 0) {
+ return "none";
+ } else if (idx == highlight_ga.ga_len + include_none
+ && include_default != 0) {
+ return "default";
+ } else if (idx == highlight_ga.ga_len + include_none + include_default
+ && include_link != 0) {
+ return "link";
+ } else if (idx == highlight_ga.ga_len + include_none + include_default + 1
+ && include_link != 0) {
+ return "clear";
+ } else if (idx >= highlight_ga.ga_len) {
+ return NULL;
+ }
+ return (const char *)HL_TABLE()[idx].sg_name;
}
color_name_table_T color_name_table[] = {
- // Color names taken from
- // http://www.rapidtables.com/web/color/RGB_Color.htm
- {"Maroon", RGB(0x80, 0x00, 0x00)},
- {"DarkRed", RGB(0x8b, 0x00, 0x00)},
- {"Brown", RGB(0xa5, 0x2a, 0x2a)},
- {"Firebrick", RGB(0xb2, 0x22, 0x22)},
- {"Crimson", RGB(0xdc, 0x14, 0x3c)},
- {"Red", RGB(0xff, 0x00, 0x00)},
- {"Tomato", RGB(0xff, 0x63, 0x47)},
- {"Coral", RGB(0xff, 0x7f, 0x50)},
- {"IndianRed", RGB(0xcd, 0x5c, 0x5c)},
- {"LightCoral", RGB(0xf0, 0x80, 0x80)},
- {"DarkSalmon", RGB(0xe9, 0x96, 0x7a)},
- {"Salmon", RGB(0xfa, 0x80, 0x72)},
- {"LightSalmon", RGB(0xff, 0xa0, 0x7a)},
- {"OrangeRed", RGB(0xff, 0x45, 0x00)},
- {"DarkOrange", RGB(0xff, 0x8c, 0x00)},
- {"Orange", RGB(0xff, 0xa5, 0x00)},
- {"Gold", RGB(0xff, 0xd7, 0x00)},
- {"DarkGoldenRod", RGB(0xb8, 0x86, 0x0b)},
- {"GoldenRod", RGB(0xda, 0xa5, 0x20)},
- {"PaleGoldenRod", RGB(0xee, 0xe8, 0xaa)},
- {"DarkKhaki", RGB(0xbd, 0xb7, 0x6b)},
- {"Khaki", RGB(0xf0, 0xe6, 0x8c)},
- {"Olive", RGB(0x80, 0x80, 0x00)},
- {"Yellow", RGB(0xff, 0xff, 0x00)},
- {"YellowGreen", RGB(0x9a, 0xcd, 0x32)},
- {"DarkOliveGreen", RGB(0x55, 0x6b, 0x2f)},
- {"OliveDrab", RGB(0x6b, 0x8e, 0x23)},
- {"LawnGreen", RGB(0x7c, 0xfc, 0x00)},
- {"ChartReuse", RGB(0x7f, 0xff, 0x00)},
- {"GreenYellow", RGB(0xad, 0xff, 0x2f)},
- {"DarkGreen", RGB(0x00, 0x64, 0x00)},
- {"Green", RGB(0x00, 0x80, 0x00)},
- {"ForestGreen", RGB(0x22, 0x8b, 0x22)},
- {"Lime", RGB(0x00, 0xff, 0x00)},
- {"LimeGreen", RGB(0x32, 0xcd, 0x32)},
- {"LightGreen", RGB(0x90, 0xee, 0x90)},
- {"PaleGreen", RGB(0x98, 0xfb, 0x98)},
- {"DarkSeaGreen", RGB(0x8f, 0xbc, 0x8f)},
- {"MediumSpringGreen", RGB(0x00, 0xfa, 0x9a)},
- {"SpringGreen", RGB(0x00, 0xff, 0x7f)},
- {"SeaGreen", RGB(0x2e, 0x8b, 0x57)},
- {"MediumAquamarine", RGB(0x66, 0xcd, 0xaa)},
- {"MediumSeaGreen", RGB(0x3c, 0xb3, 0x71)},
- {"LightSeaGreen", RGB(0x20, 0xb2, 0xaa)},
- {"DarkSlateGray", RGB(0x2f, 0x4f, 0x4f)},
- {"Teal", RGB(0x00, 0x80, 0x80)},
- {"DarkCyan", RGB(0x00, 0x8b, 0x8b)},
- {"Aqua", RGB(0x00, 0xff, 0xff)},
- {"Cyan", RGB(0x00, 0xff, 0xff)},
- {"LightCyan", RGB(0xe0, 0xff, 0xff)},
- {"DarkTurquoise", RGB(0x00, 0xce, 0xd1)},
- {"Turquoise", RGB(0x40, 0xe0, 0xd0)},
- {"MediumTurquoise", RGB(0x48, 0xd1, 0xcc)},
- {"PaleTurquoise", RGB(0xaf, 0xee, 0xee)},
- {"Aquamarine", RGB(0x7f, 0xff, 0xd4)},
- {"PowderBlue", RGB(0xb0, 0xe0, 0xe6)},
- {"CadetBlue", RGB(0x5f, 0x9e, 0xa0)},
- {"SteelBlue", RGB(0x46, 0x82, 0xb4)},
- {"CornFlowerBlue", RGB(0x64, 0x95, 0xed)},
- {"DeepSkyBlue", RGB(0x00, 0xbf, 0xff)},
- {"DodgerBlue", RGB(0x1e, 0x90, 0xff)},
- {"LightBlue", RGB(0xad, 0xd8, 0xe6)},
- {"SkyBlue", RGB(0x87, 0xce, 0xeb)},
- {"LightSkyBlue", RGB(0x87, 0xce, 0xfa)},
- {"MidnightBlue", RGB(0x19, 0x19, 0x70)},
- {"Navy", RGB(0x00, 0x00, 0x80)},
- {"DarkBlue", RGB(0x00, 0x00, 0x8b)},
- {"MediumBlue", RGB(0x00, 0x00, 0xcd)},
- {"Blue", RGB(0x00, 0x00, 0xff)},
- {"RoyalBlue", RGB(0x41, 0x69, 0xe1)},
- {"BlueViolet", RGB(0x8a, 0x2b, 0xe2)},
- {"Indigo", RGB(0x4b, 0x00, 0x82)},
- {"DarkSlateBlue", RGB(0x48, 0x3d, 0x8b)},
- {"SlateBlue", RGB(0x6a, 0x5a, 0xcd)},
- {"MediumSlateBlue", RGB(0x7b, 0x68, 0xee)},
- {"MediumPurple", RGB(0x93, 0x70, 0xdb)},
- {"DarkMagenta", RGB(0x8b, 0x00, 0x8b)},
- {"DarkViolet", RGB(0x94, 0x00, 0xd3)},
- {"DarkOrchid", RGB(0x99, 0x32, 0xcc)},
- {"MediumOrchid", RGB(0xba, 0x55, 0xd3)},
- {"Purple", RGB(0x80, 0x00, 0x80)},
- {"Thistle", RGB(0xd8, 0xbf, 0xd8)},
- {"Plum", RGB(0xdd, 0xa0, 0xdd)},
- {"Violet", RGB(0xee, 0x82, 0xee)},
- {"Magenta", RGB(0xff, 0x00, 0xff)},
- {"Fuchsia", RGB(0xff, 0x00, 0xff)},
- {"Orchid", RGB(0xda, 0x70, 0xd6)},
- {"MediumVioletRed", RGB(0xc7, 0x15, 0x85)},
- {"PaleVioletRed", RGB(0xdb, 0x70, 0x93)},
- {"DeepPink", RGB(0xff, 0x14, 0x93)},
- {"HotPink", RGB(0xff, 0x69, 0xb4)},
- {"LightPink", RGB(0xff, 0xb6, 0xc1)},
- {"Pink", RGB(0xff, 0xc0, 0xcb)},
- {"AntiqueWhite", RGB(0xfa, 0xeb, 0xd7)},
- {"Beige", RGB(0xf5, 0xf5, 0xdc)},
- {"Bisque", RGB(0xff, 0xe4, 0xc4)},
- {"BlanchedAlmond", RGB(0xff, 0xeb, 0xcd)},
- {"Wheat", RGB(0xf5, 0xde, 0xb3)},
- {"Cornsilk", RGB(0xff, 0xf8, 0xdc)},
- {"LemonChiffon", RGB(0xff, 0xfa, 0xcd)},
- {"LightGoldenRodYellow", RGB(0xfa, 0xfa, 0xd2)},
- {"LightYellow", RGB(0xff, 0xff, 0xe0)},
- {"SaddleBrown", RGB(0x8b, 0x45, 0x13)},
- {"Sienna", RGB(0xa0, 0x52, 0x2d)},
- {"Chocolate", RGB(0xd2, 0x69, 0x1e)},
- {"Peru", RGB(0xcd, 0x85, 0x3f)},
- {"SandyBrown", RGB(0xf4, 0xa4, 0x60)},
- {"BurlyWood", RGB(0xde, 0xb8, 0x87)},
- {"Tan", RGB(0xd2, 0xb4, 0x8c)},
- {"RosyBrown", RGB(0xbc, 0x8f, 0x8f)},
- {"Moccasin", RGB(0xff, 0xe4, 0xb5)},
- {"NavajoWhite", RGB(0xff, 0xde, 0xad)},
- {"PeachPuff", RGB(0xff, 0xda, 0xb9)},
- {"MistyRose", RGB(0xff, 0xe4, 0xe1)},
- {"LavenderBlush", RGB(0xff, 0xf0, 0xf5)},
- {"Linen", RGB(0xfa, 0xf0, 0xe6)},
- {"Oldlace", RGB(0xfd, 0xf5, 0xe6)},
- {"PapayaWhip", RGB(0xff, 0xef, 0xd5)},
- {"SeaShell", RGB(0xff, 0xf5, 0xee)},
- {"MintCream", RGB(0xf5, 0xff, 0xfa)},
- {"SlateGray", RGB(0x70, 0x80, 0x90)},
- {"LightSlateGray", RGB(0x77, 0x88, 0x99)},
- {"LightSteelBlue", RGB(0xb0, 0xc4, 0xde)},
- {"Lavender", RGB(0xe6, 0xe6, 0xfa)},
- {"FloralWhite", RGB(0xff, 0xfa, 0xf0)},
- {"AliceBlue", RGB(0xf0, 0xf8, 0xff)},
- {"GhostWhite", RGB(0xf8, 0xf8, 0xff)},
- {"Honeydew", RGB(0xf0, 0xff, 0xf0)},
- {"Ivory", RGB(0xff, 0xff, 0xf0)},
- {"Azure", RGB(0xf0, 0xff, 0xff)},
- {"Snow", RGB(0xff, 0xfa, 0xfa)},
- {"Black", RGB(0x00, 0x00, 0x00)},
- {"DimGray", RGB(0x69, 0x69, 0x69)},
- {"DimGrey", RGB(0x69, 0x69, 0x69)},
- {"Gray", RGB(0x80, 0x80, 0x80)},
- {"Grey", RGB(0x80, 0x80, 0x80)},
- {"DarkGray", RGB(0xa9, 0xa9, 0xa9)},
- {"DarkGrey", RGB(0xa9, 0xa9, 0xa9)},
- {"Silver", RGB(0xc0, 0xc0, 0xc0)},
- {"LightGray", RGB(0xd3, 0xd3, 0xd3)},
- {"LightGrey", RGB(0xd3, 0xd3, 0xd3)},
- {"Gainsboro", RGB(0xdc, 0xdc, 0xdc)},
- {"WhiteSmoke", RGB(0xf5, 0xf5, 0xf5)},
- {"White", RGB(0xff, 0xff, 0xff)},
- // The color names below were taken from gui_x11.c in vim source
- {"LightRed", RGB(0xff, 0xbb, 0xbb)},
- {"LightMagenta",RGB(0xff, 0xbb, 0xff)},
- {"DarkYellow", RGB(0xbb, 0xbb, 0x00)},
- {"Gray10", RGB(0x1a, 0x1a, 0x1a)},
- {"Grey10", RGB(0x1a, 0x1a, 0x1a)},
- {"Gray20", RGB(0x33, 0x33, 0x33)},
- {"Grey20", RGB(0x33, 0x33, 0x33)},
- {"Gray30", RGB(0x4d, 0x4d, 0x4d)},
- {"Grey30", RGB(0x4d, 0x4d, 0x4d)},
- {"Gray40", RGB(0x66, 0x66, 0x66)},
- {"Grey40", RGB(0x66, 0x66, 0x66)},
- {"Gray50", RGB(0x7f, 0x7f, 0x7f)},
- {"Grey50", RGB(0x7f, 0x7f, 0x7f)},
- {"Gray60", RGB(0x99, 0x99, 0x99)},
- {"Grey60", RGB(0x99, 0x99, 0x99)},
- {"Gray70", RGB(0xb3, 0xb3, 0xb3)},
- {"Grey70", RGB(0xb3, 0xb3, 0xb3)},
- {"Gray80", RGB(0xcc, 0xcc, 0xcc)},
- {"Grey80", RGB(0xcc, 0xcc, 0xcc)},
- {"Gray90", RGB(0xe5, 0xe5, 0xe5)},
- {"Grey90", RGB(0xe5, 0xe5, 0xe5)},
- {NULL, 0},
+ // Colors from rgb.txt
+ { "AliceBlue", RGB_(0xf0, 0xf8, 0xff) },
+ { "AntiqueWhite", RGB_(0xfa, 0xeb, 0xd7) },
+ { "AntiqueWhite1", RGB_(0xff, 0xef, 0xdb) },
+ { "AntiqueWhite2", RGB_(0xee, 0xdf, 0xcc) },
+ { "AntiqueWhite3", RGB_(0xcd, 0xc0, 0xb0) },
+ { "AntiqueWhite4", RGB_(0x8b, 0x83, 0x78) },
+ { "Aqua", RGB_(0x00, 0xff, 0xff) },
+ { "Aquamarine", RGB_(0x7f, 0xff, 0xd4) },
+ { "Aquamarine1", RGB_(0x7f, 0xff, 0xd4) },
+ { "Aquamarine2", RGB_(0x76, 0xee, 0xc6) },
+ { "Aquamarine3", RGB_(0x66, 0xcd, 0xaa) },
+ { "Aquamarine4", RGB_(0x45, 0x8b, 0x74) },
+ { "Azure", RGB_(0xf0, 0xff, 0xff) },
+ { "Azure1", RGB_(0xf0, 0xff, 0xff) },
+ { "Azure2", RGB_(0xe0, 0xee, 0xee) },
+ { "Azure3", RGB_(0xc1, 0xcd, 0xcd) },
+ { "Azure4", RGB_(0x83, 0x8b, 0x8b) },
+ { "Beige", RGB_(0xf5, 0xf5, 0xdc) },
+ { "Bisque", RGB_(0xff, 0xe4, 0xc4) },
+ { "Bisque1", RGB_(0xff, 0xe4, 0xc4) },
+ { "Bisque2", RGB_(0xee, 0xd5, 0xb7) },
+ { "Bisque3", RGB_(0xcd, 0xb7, 0x9e) },
+ { "Bisque4", RGB_(0x8b, 0x7d, 0x6b) },
+ { "Black", RGB_(0x00, 0x00, 0x00) },
+ { "BlanchedAlmond", RGB_(0xff, 0xeb, 0xcd) },
+ { "Blue", RGB_(0x00, 0x00, 0xff) },
+ { "Blue1", RGB_(0x0, 0x0, 0xff) },
+ { "Blue2", RGB_(0x0, 0x0, 0xee) },
+ { "Blue3", RGB_(0x0, 0x0, 0xcd) },
+ { "Blue4", RGB_(0x0, 0x0, 0x8b) },
+ { "BlueViolet", RGB_(0x8a, 0x2b, 0xe2) },
+ { "Brown", RGB_(0xa5, 0x2a, 0x2a) },
+ { "Brown1", RGB_(0xff, 0x40, 0x40) },
+ { "Brown2", RGB_(0xee, 0x3b, 0x3b) },
+ { "Brown3", RGB_(0xcd, 0x33, 0x33) },
+ { "Brown4", RGB_(0x8b, 0x23, 0x23) },
+ { "BurlyWood", RGB_(0xde, 0xb8, 0x87) },
+ { "Burlywood1", RGB_(0xff, 0xd3, 0x9b) },
+ { "Burlywood2", RGB_(0xee, 0xc5, 0x91) },
+ { "Burlywood3", RGB_(0xcd, 0xaa, 0x7d) },
+ { "Burlywood4", RGB_(0x8b, 0x73, 0x55) },
+ { "CadetBlue", RGB_(0x5f, 0x9e, 0xa0) },
+ { "CadetBlue1", RGB_(0x98, 0xf5, 0xff) },
+ { "CadetBlue2", RGB_(0x8e, 0xe5, 0xee) },
+ { "CadetBlue3", RGB_(0x7a, 0xc5, 0xcd) },
+ { "CadetBlue4", RGB_(0x53, 0x86, 0x8b) },
+ { "ChartReuse", RGB_(0x7f, 0xff, 0x00) },
+ { "Chartreuse1", RGB_(0x7f, 0xff, 0x0) },
+ { "Chartreuse2", RGB_(0x76, 0xee, 0x0) },
+ { "Chartreuse3", RGB_(0x66, 0xcd, 0x0) },
+ { "Chartreuse4", RGB_(0x45, 0x8b, 0x0) },
+ { "Chocolate", RGB_(0xd2, 0x69, 0x1e) },
+ { "Chocolate1", RGB_(0xff, 0x7f, 0x24) },
+ { "Chocolate2", RGB_(0xee, 0x76, 0x21) },
+ { "Chocolate3", RGB_(0xcd, 0x66, 0x1d) },
+ { "Chocolate4", RGB_(0x8b, 0x45, 0x13) },
+ { "Coral", RGB_(0xff, 0x7f, 0x50) },
+ { "Coral1", RGB_(0xff, 0x72, 0x56) },
+ { "Coral2", RGB_(0xee, 0x6a, 0x50) },
+ { "Coral3", RGB_(0xcd, 0x5b, 0x45) },
+ { "Coral4", RGB_(0x8b, 0x3e, 0x2f) },
+ { "CornFlowerBlue", RGB_(0x64, 0x95, 0xed) },
+ { "Cornsilk", RGB_(0xff, 0xf8, 0xdc) },
+ { "Cornsilk1", RGB_(0xff, 0xf8, 0xdc) },
+ { "Cornsilk2", RGB_(0xee, 0xe8, 0xcd) },
+ { "Cornsilk3", RGB_(0xcd, 0xc8, 0xb1) },
+ { "Cornsilk4", RGB_(0x8b, 0x88, 0x78) },
+ { "Crimson", RGB_(0xdc, 0x14, 0x3c) },
+ { "Cyan", RGB_(0x00, 0xff, 0xff) },
+ { "Cyan1", RGB_(0x0, 0xff, 0xff) },
+ { "Cyan2", RGB_(0x0, 0xee, 0xee) },
+ { "Cyan3", RGB_(0x0, 0xcd, 0xcd) },
+ { "Cyan4", RGB_(0x0, 0x8b, 0x8b) },
+ { "DarkBlue", RGB_(0x00, 0x00, 0x8b) },
+ { "DarkCyan", RGB_(0x00, 0x8b, 0x8b) },
+ { "DarkGoldenRod", RGB_(0xb8, 0x86, 0x0b) },
+ { "DarkGoldenrod1", RGB_(0xff, 0xb9, 0xf) },
+ { "DarkGoldenrod2", RGB_(0xee, 0xad, 0xe) },
+ { "DarkGoldenrod3", RGB_(0xcd, 0x95, 0xc) },
+ { "DarkGoldenrod4", RGB_(0x8b, 0x65, 0x8) },
+ { "DarkGray", RGB_(0xa9, 0xa9, 0xa9) },
+ { "DarkGreen", RGB_(0x00, 0x64, 0x00) },
+ { "DarkGrey", RGB_(0xa9, 0xa9, 0xa9) },
+ { "DarkKhaki", RGB_(0xbd, 0xb7, 0x6b) },
+ { "DarkMagenta", RGB_(0x8b, 0x00, 0x8b) },
+ { "DarkOliveGreen", RGB_(0x55, 0x6b, 0x2f) },
+ { "DarkOliveGreen1", RGB_(0xca, 0xff, 0x70) },
+ { "DarkOliveGreen2", RGB_(0xbc, 0xee, 0x68) },
+ { "DarkOliveGreen3", RGB_(0xa2, 0xcd, 0x5a) },
+ { "DarkOliveGreen4", RGB_(0x6e, 0x8b, 0x3d) },
+ { "DarkOrange", RGB_(0xff, 0x8c, 0x00) },
+ { "DarkOrange1", RGB_(0xff, 0x7f, 0x0) },
+ { "DarkOrange2", RGB_(0xee, 0x76, 0x0) },
+ { "DarkOrange3", RGB_(0xcd, 0x66, 0x0) },
+ { "DarkOrange4", RGB_(0x8b, 0x45, 0x0) },
+ { "DarkOrchid", RGB_(0x99, 0x32, 0xcc) },
+ { "DarkOrchid1", RGB_(0xbf, 0x3e, 0xff) },
+ { "DarkOrchid2", RGB_(0xb2, 0x3a, 0xee) },
+ { "DarkOrchid3", RGB_(0x9a, 0x32, 0xcd) },
+ { "DarkOrchid4", RGB_(0x68, 0x22, 0x8b) },
+ { "DarkRed", RGB_(0x8b, 0x00, 0x00) },
+ { "DarkSalmon", RGB_(0xe9, 0x96, 0x7a) },
+ { "DarkSeaGreen", RGB_(0x8f, 0xbc, 0x8f) },
+ { "DarkSeaGreen1", RGB_(0xc1, 0xff, 0xc1) },
+ { "DarkSeaGreen2", RGB_(0xb4, 0xee, 0xb4) },
+ { "DarkSeaGreen3", RGB_(0x9b, 0xcd, 0x9b) },
+ { "DarkSeaGreen4", RGB_(0x69, 0x8b, 0x69) },
+ { "DarkSlateBlue", RGB_(0x48, 0x3d, 0x8b) },
+ { "DarkSlateGray", RGB_(0x2f, 0x4f, 0x4f) },
+ { "DarkSlateGray1", RGB_(0x97, 0xff, 0xff) },
+ { "DarkSlateGray2", RGB_(0x8d, 0xee, 0xee) },
+ { "DarkSlateGray3", RGB_(0x79, 0xcd, 0xcd) },
+ { "DarkSlateGray4", RGB_(0x52, 0x8b, 0x8b) },
+ { "DarkSlateGrey", RGB_(0x2f, 0x4f, 0x4f) },
+ { "DarkTurquoise", RGB_(0x00, 0xce, 0xd1) },
+ { "DarkViolet", RGB_(0x94, 0x00, 0xd3) },
+ { "DarkYellow", RGB_(0xbb, 0xbb, 0x00) },
+ { "DeepPink", RGB_(0xff, 0x14, 0x93) },
+ { "DeepPink1", RGB_(0xff, 0x14, 0x93) },
+ { "DeepPink2", RGB_(0xee, 0x12, 0x89) },
+ { "DeepPink3", RGB_(0xcd, 0x10, 0x76) },
+ { "DeepPink4", RGB_(0x8b, 0xa, 0x50) },
+ { "DeepSkyBlue", RGB_(0x00, 0xbf, 0xff) },
+ { "DeepSkyBlue1", RGB_(0x0, 0xbf, 0xff) },
+ { "DeepSkyBlue2", RGB_(0x0, 0xb2, 0xee) },
+ { "DeepSkyBlue3", RGB_(0x0, 0x9a, 0xcd) },
+ { "DeepSkyBlue4", RGB_(0x0, 0x68, 0x8b) },
+ { "DimGray", RGB_(0x69, 0x69, 0x69) },
+ { "DimGrey", RGB_(0x69, 0x69, 0x69) },
+ { "DodgerBlue", RGB_(0x1e, 0x90, 0xff) },
+ { "DodgerBlue1", RGB_(0x1e, 0x90, 0xff) },
+ { "DodgerBlue2", RGB_(0x1c, 0x86, 0xee) },
+ { "DodgerBlue3", RGB_(0x18, 0x74, 0xcd) },
+ { "DodgerBlue4", RGB_(0x10, 0x4e, 0x8b) },
+ { "Firebrick", RGB_(0xb2, 0x22, 0x22) },
+ { "Firebrick1", RGB_(0xff, 0x30, 0x30) },
+ { "Firebrick2", RGB_(0xee, 0x2c, 0x2c) },
+ { "Firebrick3", RGB_(0xcd, 0x26, 0x26) },
+ { "Firebrick4", RGB_(0x8b, 0x1a, 0x1a) },
+ { "FloralWhite", RGB_(0xff, 0xfa, 0xf0) },
+ { "ForestGreen", RGB_(0x22, 0x8b, 0x22) },
+ { "Fuchsia", RGB_(0xff, 0x00, 0xff) },
+ { "Gainsboro", RGB_(0xdc, 0xdc, 0xdc) },
+ { "GhostWhite", RGB_(0xf8, 0xf8, 0xff) },
+ { "Gold", RGB_(0xff, 0xd7, 0x00) },
+ { "Gold1", RGB_(0xff, 0xd7, 0x0) },
+ { "Gold2", RGB_(0xee, 0xc9, 0x0) },
+ { "Gold3", RGB_(0xcd, 0xad, 0x0) },
+ { "Gold4", RGB_(0x8b, 0x75, 0x0) },
+ { "GoldenRod", RGB_(0xda, 0xa5, 0x20) },
+ { "Goldenrod1", RGB_(0xff, 0xc1, 0x25) },
+ { "Goldenrod2", RGB_(0xee, 0xb4, 0x22) },
+ { "Goldenrod3", RGB_(0xcd, 0x9b, 0x1d) },
+ { "Goldenrod4", RGB_(0x8b, 0x69, 0x14) },
+ { "Gray", RGB_(0x80, 0x80, 0x80) },
+ { "Gray0", RGB_(0x0, 0x0, 0x0) },
+ { "Gray1", RGB_(0x3, 0x3, 0x3) },
+ { "Gray10", RGB_(0x1a, 0x1a, 0x1a) },
+ { "Gray100", RGB_(0xff, 0xff, 0xff) },
+ { "Gray11", RGB_(0x1c, 0x1c, 0x1c) },
+ { "Gray12", RGB_(0x1f, 0x1f, 0x1f) },
+ { "Gray13", RGB_(0x21, 0x21, 0x21) },
+ { "Gray14", RGB_(0x24, 0x24, 0x24) },
+ { "Gray15", RGB_(0x26, 0x26, 0x26) },
+ { "Gray16", RGB_(0x29, 0x29, 0x29) },
+ { "Gray17", RGB_(0x2b, 0x2b, 0x2b) },
+ { "Gray18", RGB_(0x2e, 0x2e, 0x2e) },
+ { "Gray19", RGB_(0x30, 0x30, 0x30) },
+ { "Gray2", RGB_(0x5, 0x5, 0x5) },
+ { "Gray20", RGB_(0x33, 0x33, 0x33) },
+ { "Gray21", RGB_(0x36, 0x36, 0x36) },
+ { "Gray22", RGB_(0x38, 0x38, 0x38) },
+ { "Gray23", RGB_(0x3b, 0x3b, 0x3b) },
+ { "Gray24", RGB_(0x3d, 0x3d, 0x3d) },
+ { "Gray25", RGB_(0x40, 0x40, 0x40) },
+ { "Gray26", RGB_(0x42, 0x42, 0x42) },
+ { "Gray27", RGB_(0x45, 0x45, 0x45) },
+ { "Gray28", RGB_(0x47, 0x47, 0x47) },
+ { "Gray29", RGB_(0x4a, 0x4a, 0x4a) },
+ { "Gray3", RGB_(0x8, 0x8, 0x8) },
+ { "Gray30", RGB_(0x4d, 0x4d, 0x4d) },
+ { "Gray31", RGB_(0x4f, 0x4f, 0x4f) },
+ { "Gray32", RGB_(0x52, 0x52, 0x52) },
+ { "Gray33", RGB_(0x54, 0x54, 0x54) },
+ { "Gray34", RGB_(0x57, 0x57, 0x57) },
+ { "Gray35", RGB_(0x59, 0x59, 0x59) },
+ { "Gray36", RGB_(0x5c, 0x5c, 0x5c) },
+ { "Gray37", RGB_(0x5e, 0x5e, 0x5e) },
+ { "Gray38", RGB_(0x61, 0x61, 0x61) },
+ { "Gray39", RGB_(0x63, 0x63, 0x63) },
+ { "Gray4", RGB_(0xa, 0xa, 0xa) },
+ { "Gray40", RGB_(0x66, 0x66, 0x66) },
+ { "Gray41", RGB_(0x69, 0x69, 0x69) },
+ { "Gray42", RGB_(0x6b, 0x6b, 0x6b) },
+ { "Gray43", RGB_(0x6e, 0x6e, 0x6e) },
+ { "Gray44", RGB_(0x70, 0x70, 0x70) },
+ { "Gray45", RGB_(0x73, 0x73, 0x73) },
+ { "Gray46", RGB_(0x75, 0x75, 0x75) },
+ { "Gray47", RGB_(0x78, 0x78, 0x78) },
+ { "Gray48", RGB_(0x7a, 0x7a, 0x7a) },
+ { "Gray49", RGB_(0x7d, 0x7d, 0x7d) },
+ { "Gray5", RGB_(0xd, 0xd, 0xd) },
+ { "Gray50", RGB_(0x7f, 0x7f, 0x7f) },
+ { "Gray51", RGB_(0x82, 0x82, 0x82) },
+ { "Gray52", RGB_(0x85, 0x85, 0x85) },
+ { "Gray53", RGB_(0x87, 0x87, 0x87) },
+ { "Gray54", RGB_(0x8a, 0x8a, 0x8a) },
+ { "Gray55", RGB_(0x8c, 0x8c, 0x8c) },
+ { "Gray56", RGB_(0x8f, 0x8f, 0x8f) },
+ { "Gray57", RGB_(0x91, 0x91, 0x91) },
+ { "Gray58", RGB_(0x94, 0x94, 0x94) },
+ { "Gray59", RGB_(0x96, 0x96, 0x96) },
+ { "Gray6", RGB_(0xf, 0xf, 0xf) },
+ { "Gray60", RGB_(0x99, 0x99, 0x99) },
+ { "Gray61", RGB_(0x9c, 0x9c, 0x9c) },
+ { "Gray62", RGB_(0x9e, 0x9e, 0x9e) },
+ { "Gray63", RGB_(0xa1, 0xa1, 0xa1) },
+ { "Gray64", RGB_(0xa3, 0xa3, 0xa3) },
+ { "Gray65", RGB_(0xa6, 0xa6, 0xa6) },
+ { "Gray66", RGB_(0xa8, 0xa8, 0xa8) },
+ { "Gray67", RGB_(0xab, 0xab, 0xab) },
+ { "Gray68", RGB_(0xad, 0xad, 0xad) },
+ { "Gray69", RGB_(0xb0, 0xb0, 0xb0) },
+ { "Gray7", RGB_(0x12, 0x12, 0x12) },
+ { "Gray70", RGB_(0xb3, 0xb3, 0xb3) },
+ { "Gray71", RGB_(0xb5, 0xb5, 0xb5) },
+ { "Gray72", RGB_(0xb8, 0xb8, 0xb8) },
+ { "Gray73", RGB_(0xba, 0xba, 0xba) },
+ { "Gray74", RGB_(0xbd, 0xbd, 0xbd) },
+ { "Gray75", RGB_(0xbf, 0xbf, 0xbf) },
+ { "Gray76", RGB_(0xc2, 0xc2, 0xc2) },
+ { "Gray77", RGB_(0xc4, 0xc4, 0xc4) },
+ { "Gray78", RGB_(0xc7, 0xc7, 0xc7) },
+ { "Gray79", RGB_(0xc9, 0xc9, 0xc9) },
+ { "Gray8", RGB_(0x14, 0x14, 0x14) },
+ { "Gray80", RGB_(0xcc, 0xcc, 0xcc) },
+ { "Gray81", RGB_(0xcf, 0xcf, 0xcf) },
+ { "Gray82", RGB_(0xd1, 0xd1, 0xd1) },
+ { "Gray83", RGB_(0xd4, 0xd4, 0xd4) },
+ { "Gray84", RGB_(0xd6, 0xd6, 0xd6) },
+ { "Gray85", RGB_(0xd9, 0xd9, 0xd9) },
+ { "Gray86", RGB_(0xdb, 0xdb, 0xdb) },
+ { "Gray87", RGB_(0xde, 0xde, 0xde) },
+ { "Gray88", RGB_(0xe0, 0xe0, 0xe0) },
+ { "Gray89", RGB_(0xe3, 0xe3, 0xe3) },
+ { "Gray9", RGB_(0x17, 0x17, 0x17) },
+ { "Gray90", RGB_(0xe5, 0xe5, 0xe5) },
+ { "Gray91", RGB_(0xe8, 0xe8, 0xe8) },
+ { "Gray92", RGB_(0xeb, 0xeb, 0xeb) },
+ { "Gray93", RGB_(0xed, 0xed, 0xed) },
+ { "Gray94", RGB_(0xf0, 0xf0, 0xf0) },
+ { "Gray95", RGB_(0xf2, 0xf2, 0xf2) },
+ { "Gray96", RGB_(0xf5, 0xf5, 0xf5) },
+ { "Gray97", RGB_(0xf7, 0xf7, 0xf7) },
+ { "Gray98", RGB_(0xfa, 0xfa, 0xfa) },
+ { "Gray99", RGB_(0xfc, 0xfc, 0xfc) },
+ { "Green", RGB_(0x00, 0x80, 0x00) },
+ { "Green1", RGB_(0x0, 0xff, 0x0) },
+ { "Green2", RGB_(0x0, 0xee, 0x0) },
+ { "Green3", RGB_(0x0, 0xcd, 0x0) },
+ { "Green4", RGB_(0x0, 0x8b, 0x0) },
+ { "GreenYellow", RGB_(0xad, 0xff, 0x2f) },
+ { "Grey", RGB_(0x80, 0x80, 0x80) },
+ { "Grey0", RGB_(0x0, 0x0, 0x0) },
+ { "Grey1", RGB_(0x3, 0x3, 0x3) },
+ { "Grey10", RGB_(0x1a, 0x1a, 0x1a) },
+ { "Grey100", RGB_(0xff, 0xff, 0xff) },
+ { "Grey11", RGB_(0x1c, 0x1c, 0x1c) },
+ { "Grey12", RGB_(0x1f, 0x1f, 0x1f) },
+ { "Grey13", RGB_(0x21, 0x21, 0x21) },
+ { "Grey14", RGB_(0x24, 0x24, 0x24) },
+ { "Grey15", RGB_(0x26, 0x26, 0x26) },
+ { "Grey16", RGB_(0x29, 0x29, 0x29) },
+ { "Grey17", RGB_(0x2b, 0x2b, 0x2b) },
+ { "Grey18", RGB_(0x2e, 0x2e, 0x2e) },
+ { "Grey19", RGB_(0x30, 0x30, 0x30) },
+ { "Grey2", RGB_(0x5, 0x5, 0x5) },
+ { "Grey20", RGB_(0x33, 0x33, 0x33) },
+ { "Grey21", RGB_(0x36, 0x36, 0x36) },
+ { "Grey22", RGB_(0x38, 0x38, 0x38) },
+ { "Grey23", RGB_(0x3b, 0x3b, 0x3b) },
+ { "Grey24", RGB_(0x3d, 0x3d, 0x3d) },
+ { "Grey25", RGB_(0x40, 0x40, 0x40) },
+ { "Grey26", RGB_(0x42, 0x42, 0x42) },
+ { "Grey27", RGB_(0x45, 0x45, 0x45) },
+ { "Grey28", RGB_(0x47, 0x47, 0x47) },
+ { "Grey29", RGB_(0x4a, 0x4a, 0x4a) },
+ { "Grey3", RGB_(0x8, 0x8, 0x8) },
+ { "Grey30", RGB_(0x4d, 0x4d, 0x4d) },
+ { "Grey31", RGB_(0x4f, 0x4f, 0x4f) },
+ { "Grey32", RGB_(0x52, 0x52, 0x52) },
+ { "Grey33", RGB_(0x54, 0x54, 0x54) },
+ { "Grey34", RGB_(0x57, 0x57, 0x57) },
+ { "Grey35", RGB_(0x59, 0x59, 0x59) },
+ { "Grey36", RGB_(0x5c, 0x5c, 0x5c) },
+ { "Grey37", RGB_(0x5e, 0x5e, 0x5e) },
+ { "Grey38", RGB_(0x61, 0x61, 0x61) },
+ { "Grey39", RGB_(0x63, 0x63, 0x63) },
+ { "Grey4", RGB_(0xa, 0xa, 0xa) },
+ { "Grey40", RGB_(0x66, 0x66, 0x66) },
+ { "Grey41", RGB_(0x69, 0x69, 0x69) },
+ { "Grey42", RGB_(0x6b, 0x6b, 0x6b) },
+ { "Grey43", RGB_(0x6e, 0x6e, 0x6e) },
+ { "Grey44", RGB_(0x70, 0x70, 0x70) },
+ { "Grey45", RGB_(0x73, 0x73, 0x73) },
+ { "Grey46", RGB_(0x75, 0x75, 0x75) },
+ { "Grey47", RGB_(0x78, 0x78, 0x78) },
+ { "Grey48", RGB_(0x7a, 0x7a, 0x7a) },
+ { "Grey49", RGB_(0x7d, 0x7d, 0x7d) },
+ { "Grey5", RGB_(0xd, 0xd, 0xd) },
+ { "Grey50", RGB_(0x7f, 0x7f, 0x7f) },
+ { "Grey51", RGB_(0x82, 0x82, 0x82) },
+ { "Grey52", RGB_(0x85, 0x85, 0x85) },
+ { "Grey53", RGB_(0x87, 0x87, 0x87) },
+ { "Grey54", RGB_(0x8a, 0x8a, 0x8a) },
+ { "Grey55", RGB_(0x8c, 0x8c, 0x8c) },
+ { "Grey56", RGB_(0x8f, 0x8f, 0x8f) },
+ { "Grey57", RGB_(0x91, 0x91, 0x91) },
+ { "Grey58", RGB_(0x94, 0x94, 0x94) },
+ { "Grey59", RGB_(0x96, 0x96, 0x96) },
+ { "Grey6", RGB_(0xf, 0xf, 0xf) },
+ { "Grey60", RGB_(0x99, 0x99, 0x99) },
+ { "Grey61", RGB_(0x9c, 0x9c, 0x9c) },
+ { "Grey62", RGB_(0x9e, 0x9e, 0x9e) },
+ { "Grey63", RGB_(0xa1, 0xa1, 0xa1) },
+ { "Grey64", RGB_(0xa3, 0xa3, 0xa3) },
+ { "Grey65", RGB_(0xa6, 0xa6, 0xa6) },
+ { "Grey66", RGB_(0xa8, 0xa8, 0xa8) },
+ { "Grey67", RGB_(0xab, 0xab, 0xab) },
+ { "Grey68", RGB_(0xad, 0xad, 0xad) },
+ { "Grey69", RGB_(0xb0, 0xb0, 0xb0) },
+ { "Grey7", RGB_(0x12, 0x12, 0x12) },
+ { "Grey70", RGB_(0xb3, 0xb3, 0xb3) },
+ { "Grey71", RGB_(0xb5, 0xb5, 0xb5) },
+ { "Grey72", RGB_(0xb8, 0xb8, 0xb8) },
+ { "Grey73", RGB_(0xba, 0xba, 0xba) },
+ { "Grey74", RGB_(0xbd, 0xbd, 0xbd) },
+ { "Grey75", RGB_(0xbf, 0xbf, 0xbf) },
+ { "Grey76", RGB_(0xc2, 0xc2, 0xc2) },
+ { "Grey77", RGB_(0xc4, 0xc4, 0xc4) },
+ { "Grey78", RGB_(0xc7, 0xc7, 0xc7) },
+ { "Grey79", RGB_(0xc9, 0xc9, 0xc9) },
+ { "Grey8", RGB_(0x14, 0x14, 0x14) },
+ { "Grey80", RGB_(0xcc, 0xcc, 0xcc) },
+ { "Grey81", RGB_(0xcf, 0xcf, 0xcf) },
+ { "Grey82", RGB_(0xd1, 0xd1, 0xd1) },
+ { "Grey83", RGB_(0xd4, 0xd4, 0xd4) },
+ { "Grey84", RGB_(0xd6, 0xd6, 0xd6) },
+ { "Grey85", RGB_(0xd9, 0xd9, 0xd9) },
+ { "Grey86", RGB_(0xdb, 0xdb, 0xdb) },
+ { "Grey87", RGB_(0xde, 0xde, 0xde) },
+ { "Grey88", RGB_(0xe0, 0xe0, 0xe0) },
+ { "Grey89", RGB_(0xe3, 0xe3, 0xe3) },
+ { "Grey9", RGB_(0x17, 0x17, 0x17) },
+ { "Grey90", RGB_(0xe5, 0xe5, 0xe5) },
+ { "Grey91", RGB_(0xe8, 0xe8, 0xe8) },
+ { "Grey92", RGB_(0xeb, 0xeb, 0xeb) },
+ { "Grey93", RGB_(0xed, 0xed, 0xed) },
+ { "Grey94", RGB_(0xf0, 0xf0, 0xf0) },
+ { "Grey95", RGB_(0xf2, 0xf2, 0xf2) },
+ { "Grey96", RGB_(0xf5, 0xf5, 0xf5) },
+ { "Grey97", RGB_(0xf7, 0xf7, 0xf7) },
+ { "Grey98", RGB_(0xfa, 0xfa, 0xfa) },
+ { "Grey99", RGB_(0xfc, 0xfc, 0xfc) },
+ { "Honeydew", RGB_(0xf0, 0xff, 0xf0) },
+ { "Honeydew1", RGB_(0xf0, 0xff, 0xf0) },
+ { "Honeydew2", RGB_(0xe0, 0xee, 0xe0) },
+ { "Honeydew3", RGB_(0xc1, 0xcd, 0xc1) },
+ { "Honeydew4", RGB_(0x83, 0x8b, 0x83) },
+ { "HotPink", RGB_(0xff, 0x69, 0xb4) },
+ { "HotPink1", RGB_(0xff, 0x6e, 0xb4) },
+ { "HotPink2", RGB_(0xee, 0x6a, 0xa7) },
+ { "HotPink3", RGB_(0xcd, 0x60, 0x90) },
+ { "HotPink4", RGB_(0x8b, 0x3a, 0x62) },
+ { "IndianRed", RGB_(0xcd, 0x5c, 0x5c) },
+ { "IndianRed1", RGB_(0xff, 0x6a, 0x6a) },
+ { "IndianRed2", RGB_(0xee, 0x63, 0x63) },
+ { "IndianRed3", RGB_(0xcd, 0x55, 0x55) },
+ { "IndianRed4", RGB_(0x8b, 0x3a, 0x3a) },
+ { "Indigo", RGB_(0x4b, 0x00, 0x82) },
+ { "Ivory", RGB_(0xff, 0xff, 0xf0) },
+ { "Ivory1", RGB_(0xff, 0xff, 0xf0) },
+ { "Ivory2", RGB_(0xee, 0xee, 0xe0) },
+ { "Ivory3", RGB_(0xcd, 0xcd, 0xc1) },
+ { "Ivory4", RGB_(0x8b, 0x8b, 0x83) },
+ { "Khaki", RGB_(0xf0, 0xe6, 0x8c) },
+ { "Khaki1", RGB_(0xff, 0xf6, 0x8f) },
+ { "Khaki2", RGB_(0xee, 0xe6, 0x85) },
+ { "Khaki3", RGB_(0xcd, 0xc6, 0x73) },
+ { "Khaki4", RGB_(0x8b, 0x86, 0x4e) },
+ { "Lavender", RGB_(0xe6, 0xe6, 0xfa) },
+ { "LavenderBlush", RGB_(0xff, 0xf0, 0xf5) },
+ { "LavenderBlush1", RGB_(0xff, 0xf0, 0xf5) },
+ { "LavenderBlush2", RGB_(0xee, 0xe0, 0xe5) },
+ { "LavenderBlush3", RGB_(0xcd, 0xc1, 0xc5) },
+ { "LavenderBlush4", RGB_(0x8b, 0x83, 0x86) },
+ { "LawnGreen", RGB_(0x7c, 0xfc, 0x00) },
+ { "LemonChiffon", RGB_(0xff, 0xfa, 0xcd) },
+ { "LemonChiffon1", RGB_(0xff, 0xfa, 0xcd) },
+ { "LemonChiffon2", RGB_(0xee, 0xe9, 0xbf) },
+ { "LemonChiffon3", RGB_(0xcd, 0xc9, 0xa5) },
+ { "LemonChiffon4", RGB_(0x8b, 0x89, 0x70) },
+ { "LightBlue", RGB_(0xad, 0xd8, 0xe6) },
+ { "LightBlue1", RGB_(0xbf, 0xef, 0xff) },
+ { "LightBlue2", RGB_(0xb2, 0xdf, 0xee) },
+ { "LightBlue3", RGB_(0x9a, 0xc0, 0xcd) },
+ { "LightBlue4", RGB_(0x68, 0x83, 0x8b) },
+ { "LightCoral", RGB_(0xf0, 0x80, 0x80) },
+ { "LightCyan", RGB_(0xe0, 0xff, 0xff) },
+ { "LightCyan1", RGB_(0xe0, 0xff, 0xff) },
+ { "LightCyan2", RGB_(0xd1, 0xee, 0xee) },
+ { "LightCyan3", RGB_(0xb4, 0xcd, 0xcd) },
+ { "LightCyan4", RGB_(0x7a, 0x8b, 0x8b) },
+ { "LightGoldenrod", RGB_(0xee, 0xdd, 0x82) },
+ { "LightGoldenrod1", RGB_(0xff, 0xec, 0x8b) },
+ { "LightGoldenrod2", RGB_(0xee, 0xdc, 0x82) },
+ { "LightGoldenrod3", RGB_(0xcd, 0xbe, 0x70) },
+ { "LightGoldenrod4", RGB_(0x8b, 0x81, 0x4c) },
+ { "LightGoldenRodYellow", RGB_(0xfa, 0xfa, 0xd2) },
+ { "LightGray", RGB_(0xd3, 0xd3, 0xd3) },
+ { "LightGreen", RGB_(0x90, 0xee, 0x90) },
+ { "LightGrey", RGB_(0xd3, 0xd3, 0xd3) },
+ { "LightMagenta", RGB_(0xff, 0xbb, 0xff) },
+ { "LightPink", RGB_(0xff, 0xb6, 0xc1) },
+ { "LightPink1", RGB_(0xff, 0xae, 0xb9) },
+ { "LightPink2", RGB_(0xee, 0xa2, 0xad) },
+ { "LightPink3", RGB_(0xcd, 0x8c, 0x95) },
+ { "LightPink4", RGB_(0x8b, 0x5f, 0x65) },
+ { "LightRed", RGB_(0xff, 0xbb, 0xbb) },
+ { "LightSalmon", RGB_(0xff, 0xa0, 0x7a) },
+ { "LightSalmon1", RGB_(0xff, 0xa0, 0x7a) },
+ { "LightSalmon2", RGB_(0xee, 0x95, 0x72) },
+ { "LightSalmon3", RGB_(0xcd, 0x81, 0x62) },
+ { "LightSalmon4", RGB_(0x8b, 0x57, 0x42) },
+ { "LightSeaGreen", RGB_(0x20, 0xb2, 0xaa) },
+ { "LightSkyBlue", RGB_(0x87, 0xce, 0xfa) },
+ { "LightSkyBlue1", RGB_(0xb0, 0xe2, 0xff) },
+ { "LightSkyBlue2", RGB_(0xa4, 0xd3, 0xee) },
+ { "LightSkyBlue3", RGB_(0x8d, 0xb6, 0xcd) },
+ { "LightSkyBlue4", RGB_(0x60, 0x7b, 0x8b) },
+ { "LightSlateBlue", RGB_(0x84, 0x70, 0xff) },
+ { "LightSlateGray", RGB_(0x77, 0x88, 0x99) },
+ { "LightSlateGrey", RGB_(0x77, 0x88, 0x99) },
+ { "LightSteelBlue", RGB_(0xb0, 0xc4, 0xde) },
+ { "LightSteelBlue1", RGB_(0xca, 0xe1, 0xff) },
+ { "LightSteelBlue2", RGB_(0xbc, 0xd2, 0xee) },
+ { "LightSteelBlue3", RGB_(0xa2, 0xb5, 0xcd) },
+ { "LightSteelBlue4", RGB_(0x6e, 0x7b, 0x8b) },
+ { "LightYellow", RGB_(0xff, 0xff, 0xe0) },
+ { "LightYellow1", RGB_(0xff, 0xff, 0xe0) },
+ { "LightYellow2", RGB_(0xee, 0xee, 0xd1) },
+ { "LightYellow3", RGB_(0xcd, 0xcd, 0xb4) },
+ { "LightYellow4", RGB_(0x8b, 0x8b, 0x7a) },
+ { "Lime", RGB_(0x00, 0xff, 0x00) },
+ { "LimeGreen", RGB_(0x32, 0xcd, 0x32) },
+ { "Linen", RGB_(0xfa, 0xf0, 0xe6) },
+ { "Magenta", RGB_(0xff, 0x00, 0xff) },
+ { "Magenta1", RGB_(0xff, 0x0, 0xff) },
+ { "Magenta2", RGB_(0xee, 0x0, 0xee) },
+ { "Magenta3", RGB_(0xcd, 0x0, 0xcd) },
+ { "Magenta4", RGB_(0x8b, 0x0, 0x8b) },
+ { "Maroon", RGB_(0x80, 0x00, 0x00) },
+ { "Maroon1", RGB_(0xff, 0x34, 0xb3) },
+ { "Maroon2", RGB_(0xee, 0x30, 0xa7) },
+ { "Maroon3", RGB_(0xcd, 0x29, 0x90) },
+ { "Maroon4", RGB_(0x8b, 0x1c, 0x62) },
+ { "MediumAquamarine", RGB_(0x66, 0xcd, 0xaa) },
+ { "MediumBlue", RGB_(0x00, 0x00, 0xcd) },
+ { "MediumOrchid", RGB_(0xba, 0x55, 0xd3) },
+ { "MediumOrchid1", RGB_(0xe0, 0x66, 0xff) },
+ { "MediumOrchid2", RGB_(0xd1, 0x5f, 0xee) },
+ { "MediumOrchid3", RGB_(0xb4, 0x52, 0xcd) },
+ { "MediumOrchid4", RGB_(0x7a, 0x37, 0x8b) },
+ { "MediumPurple", RGB_(0x93, 0x70, 0xdb) },
+ { "MediumPurple1", RGB_(0xab, 0x82, 0xff) },
+ { "MediumPurple2", RGB_(0x9f, 0x79, 0xee) },
+ { "MediumPurple3", RGB_(0x89, 0x68, 0xcd) },
+ { "MediumPurple4", RGB_(0x5d, 0x47, 0x8b) },
+ { "MediumSeaGreen", RGB_(0x3c, 0xb3, 0x71) },
+ { "MediumSlateBlue", RGB_(0x7b, 0x68, 0xee) },
+ { "MediumSpringGreen", RGB_(0x00, 0xfa, 0x9a) },
+ { "MediumTurquoise", RGB_(0x48, 0xd1, 0xcc) },
+ { "MediumVioletRed", RGB_(0xc7, 0x15, 0x85) },
+ { "MidnightBlue", RGB_(0x19, 0x19, 0x70) },
+ { "MintCream", RGB_(0xf5, 0xff, 0xfa) },
+ { "MistyRose", RGB_(0xff, 0xe4, 0xe1) },
+ { "MistyRose1", RGB_(0xff, 0xe4, 0xe1) },
+ { "MistyRose2", RGB_(0xee, 0xd5, 0xd2) },
+ { "MistyRose3", RGB_(0xcd, 0xb7, 0xb5) },
+ { "MistyRose4", RGB_(0x8b, 0x7d, 0x7b) },
+ { "Moccasin", RGB_(0xff, 0xe4, 0xb5) },
+ { "NavajoWhite", RGB_(0xff, 0xde, 0xad) },
+ { "NavajoWhite1", RGB_(0xff, 0xde, 0xad) },
+ { "NavajoWhite2", RGB_(0xee, 0xcf, 0xa1) },
+ { "NavajoWhite3", RGB_(0xcd, 0xb3, 0x8b) },
+ { "NavajoWhite4", RGB_(0x8b, 0x79, 0x5e) },
+ { "Navy", RGB_(0x00, 0x00, 0x80) },
+ { "NavyBlue", RGB_(0x0, 0x0, 0x80) },
+ { "OldLace", RGB_(0xfd, 0xf5, 0xe6) },
+ { "Olive", RGB_(0x80, 0x80, 0x00) },
+ { "OliveDrab", RGB_(0x6b, 0x8e, 0x23) },
+ { "OliveDrab1", RGB_(0xc0, 0xff, 0x3e) },
+ { "OliveDrab2", RGB_(0xb3, 0xee, 0x3a) },
+ { "OliveDrab3", RGB_(0x9a, 0xcd, 0x32) },
+ { "OliveDrab4", RGB_(0x69, 0x8b, 0x22) },
+ { "Orange", RGB_(0xff, 0xa5, 0x00) },
+ { "Orange1", RGB_(0xff, 0xa5, 0x0) },
+ { "Orange2", RGB_(0xee, 0x9a, 0x0) },
+ { "Orange3", RGB_(0xcd, 0x85, 0x0) },
+ { "Orange4", RGB_(0x8b, 0x5a, 0x0) },
+ { "OrangeRed", RGB_(0xff, 0x45, 0x00) },
+ { "OrangeRed1", RGB_(0xff, 0x45, 0x0) },
+ { "OrangeRed2", RGB_(0xee, 0x40, 0x0) },
+ { "OrangeRed3", RGB_(0xcd, 0x37, 0x0) },
+ { "OrangeRed4", RGB_(0x8b, 0x25, 0x0) },
+ { "Orchid", RGB_(0xda, 0x70, 0xd6) },
+ { "Orchid1", RGB_(0xff, 0x83, 0xfa) },
+ { "Orchid2", RGB_(0xee, 0x7a, 0xe9) },
+ { "Orchid3", RGB_(0xcd, 0x69, 0xc9) },
+ { "Orchid4", RGB_(0x8b, 0x47, 0x89) },
+ { "PaleGoldenRod", RGB_(0xee, 0xe8, 0xaa) },
+ { "PaleGreen", RGB_(0x98, 0xfb, 0x98) },
+ { "PaleGreen1", RGB_(0x9a, 0xff, 0x9a) },
+ { "PaleGreen2", RGB_(0x90, 0xee, 0x90) },
+ { "PaleGreen3", RGB_(0x7c, 0xcd, 0x7c) },
+ { "PaleGreen4", RGB_(0x54, 0x8b, 0x54) },
+ { "PaleTurquoise", RGB_(0xaf, 0xee, 0xee) },
+ { "PaleTurquoise1", RGB_(0xbb, 0xff, 0xff) },
+ { "PaleTurquoise2", RGB_(0xae, 0xee, 0xee) },
+ { "PaleTurquoise3", RGB_(0x96, 0xcd, 0xcd) },
+ { "PaleTurquoise4", RGB_(0x66, 0x8b, 0x8b) },
+ { "PaleVioletRed", RGB_(0xdb, 0x70, 0x93) },
+ { "PaleVioletRed1", RGB_(0xff, 0x82, 0xab) },
+ { "PaleVioletRed2", RGB_(0xee, 0x79, 0x9f) },
+ { "PaleVioletRed3", RGB_(0xcd, 0x68, 0x89) },
+ { "PaleVioletRed4", RGB_(0x8b, 0x47, 0x5d) },
+ { "PapayaWhip", RGB_(0xff, 0xef, 0xd5) },
+ { "PeachPuff", RGB_(0xff, 0xda, 0xb9) },
+ { "PeachPuff1", RGB_(0xff, 0xda, 0xb9) },
+ { "PeachPuff2", RGB_(0xee, 0xcb, 0xad) },
+ { "PeachPuff3", RGB_(0xcd, 0xaf, 0x95) },
+ { "PeachPuff4", RGB_(0x8b, 0x77, 0x65) },
+ { "Peru", RGB_(0xcd, 0x85, 0x3f) },
+ { "Pink", RGB_(0xff, 0xc0, 0xcb) },
+ { "Pink1", RGB_(0xff, 0xb5, 0xc5) },
+ { "Pink2", RGB_(0xee, 0xa9, 0xb8) },
+ { "Pink3", RGB_(0xcd, 0x91, 0x9e) },
+ { "Pink4", RGB_(0x8b, 0x63, 0x6c) },
+ { "Plum", RGB_(0xdd, 0xa0, 0xdd) },
+ { "Plum1", RGB_(0xff, 0xbb, 0xff) },
+ { "Plum2", RGB_(0xee, 0xae, 0xee) },
+ { "Plum3", RGB_(0xcd, 0x96, 0xcd) },
+ { "Plum4", RGB_(0x8b, 0x66, 0x8b) },
+ { "PowderBlue", RGB_(0xb0, 0xe0, 0xe6) },
+ { "Purple", RGB_(0x80, 0x00, 0x80) },
+ { "Purple1", RGB_(0x9b, 0x30, 0xff) },
+ { "Purple2", RGB_(0x91, 0x2c, 0xee) },
+ { "Purple3", RGB_(0x7d, 0x26, 0xcd) },
+ { "Purple4", RGB_(0x55, 0x1a, 0x8b) },
+ { "RebeccaPurple", RGB_(0x66, 0x33, 0x99) },
+ { "Red", RGB_(0xff, 0x00, 0x00) },
+ { "Red1", RGB_(0xff, 0x0, 0x0) },
+ { "Red2", RGB_(0xee, 0x0, 0x0) },
+ { "Red3", RGB_(0xcd, 0x0, 0x0) },
+ { "Red4", RGB_(0x8b, 0x0, 0x0) },
+ { "RosyBrown", RGB_(0xbc, 0x8f, 0x8f) },
+ { "RosyBrown1", RGB_(0xff, 0xc1, 0xc1) },
+ { "RosyBrown2", RGB_(0xee, 0xb4, 0xb4) },
+ { "RosyBrown3", RGB_(0xcd, 0x9b, 0x9b) },
+ { "RosyBrown4", RGB_(0x8b, 0x69, 0x69) },
+ { "RoyalBlue", RGB_(0x41, 0x69, 0xe1) },
+ { "RoyalBlue1", RGB_(0x48, 0x76, 0xff) },
+ { "RoyalBlue2", RGB_(0x43, 0x6e, 0xee) },
+ { "RoyalBlue3", RGB_(0x3a, 0x5f, 0xcd) },
+ { "RoyalBlue4", RGB_(0x27, 0x40, 0x8b) },
+ { "SaddleBrown", RGB_(0x8b, 0x45, 0x13) },
+ { "Salmon", RGB_(0xfa, 0x80, 0x72) },
+ { "Salmon1", RGB_(0xff, 0x8c, 0x69) },
+ { "Salmon2", RGB_(0xee, 0x82, 0x62) },
+ { "Salmon3", RGB_(0xcd, 0x70, 0x54) },
+ { "Salmon4", RGB_(0x8b, 0x4c, 0x39) },
+ { "SandyBrown", RGB_(0xf4, 0xa4, 0x60) },
+ { "SeaGreen", RGB_(0x2e, 0x8b, 0x57) },
+ { "SeaGreen1", RGB_(0x54, 0xff, 0x9f) },
+ { "SeaGreen2", RGB_(0x4e, 0xee, 0x94) },
+ { "SeaGreen3", RGB_(0x43, 0xcd, 0x80) },
+ { "SeaGreen4", RGB_(0x2e, 0x8b, 0x57) },
+ { "SeaShell", RGB_(0xff, 0xf5, 0xee) },
+ { "Seashell1", RGB_(0xff, 0xf5, 0xee) },
+ { "Seashell2", RGB_(0xee, 0xe5, 0xde) },
+ { "Seashell3", RGB_(0xcd, 0xc5, 0xbf) },
+ { "Seashell4", RGB_(0x8b, 0x86, 0x82) },
+ { "Sienna", RGB_(0xa0, 0x52, 0x2d) },
+ { "Sienna1", RGB_(0xff, 0x82, 0x47) },
+ { "Sienna2", RGB_(0xee, 0x79, 0x42) },
+ { "Sienna3", RGB_(0xcd, 0x68, 0x39) },
+ { "Sienna4", RGB_(0x8b, 0x47, 0x26) },
+ { "Silver", RGB_(0xc0, 0xc0, 0xc0) },
+ { "SkyBlue", RGB_(0x87, 0xce, 0xeb) },
+ { "SkyBlue1", RGB_(0x87, 0xce, 0xff) },
+ { "SkyBlue2", RGB_(0x7e, 0xc0, 0xee) },
+ { "SkyBlue3", RGB_(0x6c, 0xa6, 0xcd) },
+ { "SkyBlue4", RGB_(0x4a, 0x70, 0x8b) },
+ { "SlateBlue", RGB_(0x6a, 0x5a, 0xcd) },
+ { "SlateBlue1", RGB_(0x83, 0x6f, 0xff) },
+ { "SlateBlue2", RGB_(0x7a, 0x67, 0xee) },
+ { "SlateBlue3", RGB_(0x69, 0x59, 0xcd) },
+ { "SlateBlue4", RGB_(0x47, 0x3c, 0x8b) },
+ { "SlateGray", RGB_(0x70, 0x80, 0x90) },
+ { "SlateGray1", RGB_(0xc6, 0xe2, 0xff) },
+ { "SlateGray2", RGB_(0xb9, 0xd3, 0xee) },
+ { "SlateGray3", RGB_(0x9f, 0xb6, 0xcd) },
+ { "SlateGray4", RGB_(0x6c, 0x7b, 0x8b) },
+ { "SlateGrey", RGB_(0x70, 0x80, 0x90) },
+ { "Snow", RGB_(0xff, 0xfa, 0xfa) },
+ { "Snow1", RGB_(0xff, 0xfa, 0xfa) },
+ { "Snow2", RGB_(0xee, 0xe9, 0xe9) },
+ { "Snow3", RGB_(0xcd, 0xc9, 0xc9) },
+ { "Snow4", RGB_(0x8b, 0x89, 0x89) },
+ { "SpringGreen", RGB_(0x00, 0xff, 0x7f) },
+ { "SpringGreen1", RGB_(0x0, 0xff, 0x7f) },
+ { "SpringGreen2", RGB_(0x0, 0xee, 0x76) },
+ { "SpringGreen3", RGB_(0x0, 0xcd, 0x66) },
+ { "SpringGreen4", RGB_(0x0, 0x8b, 0x45) },
+ { "SteelBlue", RGB_(0x46, 0x82, 0xb4) },
+ { "SteelBlue1", RGB_(0x63, 0xb8, 0xff) },
+ { "SteelBlue2", RGB_(0x5c, 0xac, 0xee) },
+ { "SteelBlue3", RGB_(0x4f, 0x94, 0xcd) },
+ { "SteelBlue4", RGB_(0x36, 0x64, 0x8b) },
+ { "Tan", RGB_(0xd2, 0xb4, 0x8c) },
+ { "Tan1", RGB_(0xff, 0xa5, 0x4f) },
+ { "Tan2", RGB_(0xee, 0x9a, 0x49) },
+ { "Tan3", RGB_(0xcd, 0x85, 0x3f) },
+ { "Tan4", RGB_(0x8b, 0x5a, 0x2b) },
+ { "Teal", RGB_(0x00, 0x80, 0x80) },
+ { "Thistle", RGB_(0xd8, 0xbf, 0xd8) },
+ { "Thistle1", RGB_(0xff, 0xe1, 0xff) },
+ { "Thistle2", RGB_(0xee, 0xd2, 0xee) },
+ { "Thistle3", RGB_(0xcd, 0xb5, 0xcd) },
+ { "Thistle4", RGB_(0x8b, 0x7b, 0x8b) },
+ { "Tomato", RGB_(0xff, 0x63, 0x47) },
+ { "Tomato1", RGB_(0xff, 0x63, 0x47) },
+ { "Tomato2", RGB_(0xee, 0x5c, 0x42) },
+ { "Tomato3", RGB_(0xcd, 0x4f, 0x39) },
+ { "Tomato4", RGB_(0x8b, 0x36, 0x26) },
+ { "Turquoise", RGB_(0x40, 0xe0, 0xd0) },
+ { "Turquoise1", RGB_(0x0, 0xf5, 0xff) },
+ { "Turquoise2", RGB_(0x0, 0xe5, 0xee) },
+ { "Turquoise3", RGB_(0x0, 0xc5, 0xcd) },
+ { "Turquoise4", RGB_(0x0, 0x86, 0x8b) },
+ { "Violet", RGB_(0xee, 0x82, 0xee) },
+ { "VioletRed", RGB_(0xd0, 0x20, 0x90) },
+ { "VioletRed1", RGB_(0xff, 0x3e, 0x96) },
+ { "VioletRed2", RGB_(0xee, 0x3a, 0x8c) },
+ { "VioletRed3", RGB_(0xcd, 0x32, 0x78) },
+ { "VioletRed4", RGB_(0x8b, 0x22, 0x52) },
+ { "WebGray", RGB_(0x80, 0x80, 0x80) },
+ { "WebGreen", RGB_(0x0, 0x80, 0x0) },
+ { "WebGrey", RGB_(0x80, 0x80, 0x80) },
+ { "WebMaroon", RGB_(0x80, 0x0, 0x0) },
+ { "WebPurple", RGB_(0x80, 0x0, 0x80) },
+ { "Wheat", RGB_(0xf5, 0xde, 0xb3) },
+ { "Wheat1", RGB_(0xff, 0xe7, 0xba) },
+ { "Wheat2", RGB_(0xee, 0xd8, 0xae) },
+ { "Wheat3", RGB_(0xcd, 0xba, 0x96) },
+ { "Wheat4", RGB_(0x8b, 0x7e, 0x66) },
+ { "White", RGB_(0xff, 0xff, 0xff) },
+ { "WhiteSmoke", RGB_(0xf5, 0xf5, 0xf5) },
+ { "X11Gray", RGB_(0xbe, 0xbe, 0xbe) },
+ { "X11Green", RGB_(0x0, 0xff, 0x0) },
+ { "X11Grey", RGB_(0xbe, 0xbe, 0xbe) },
+ { "X11Maroon", RGB_(0xb0, 0x30, 0x60) },
+ { "X11Purple", RGB_(0xa0, 0x20, 0xf0) },
+ { "Yellow", RGB_(0xff, 0xff, 0x00) },
+ { "Yellow1", RGB_(0xff, 0xff, 0x0) },
+ { "Yellow2", RGB_(0xee, 0xee, 0x0) },
+ { "Yellow3", RGB_(0xcd, 0xcd, 0x0) },
+ { "Yellow4", RGB_(0x8b, 0x8b, 0x0) },
+ { "YellowGreen", RGB_(0x9a, 0xcd, 0x32) },
+ { NULL, 0 },
};
-RgbValue name_to_color(uint8_t *name)
+
+/// Translate to RgbValue if \p name is an hex value (e.g. #XXXXXX),
+/// else look into color_name_table to translate a color name to its
+/// hex value
+///
+/// @param[in] name string value to convert to RGB
+/// return the hex value or -1 if could not find a correct value
+RgbValue name_to_color(const char_u *name)
{
if (name[0] == '#' && isxdigit(name[1]) && isxdigit(name[2])
@@ -7684,6 +8339,10 @@ RgbValue name_to_color(uint8_t *name)
&& isxdigit(name[6]) && name[7] == NUL) {
// rgb hex string
return strtol((char *)(name + 1), NULL, 16);
+ } else if (!STRICMP(name, "bg") || !STRICMP(name, "background")) {
+ return normal_bg;
+ } else if (!STRICMP(name, "fg") || !STRICMP(name, "foreground")) {
+ return normal_fg;
}
for (int i = 0; color_name_table[i].name != NULL; i++) {
@@ -7695,6 +8354,7 @@ RgbValue name_to_color(uint8_t *name)
return -1;
}
+
/**************************************
* End of Highlighting stuff *
**************************************/
diff --git a/src/nvim/syntax.h b/src/nvim/syntax.h
index af2ac719c6..9fbad74f64 100644
--- a/src/nvim/syntax.h
+++ b/src/nvim/syntax.h
@@ -3,19 +3,9 @@
#include <stdbool.h>
+#include "nvim/globals.h"
#include "nvim/buffer_defs.h"
-
-/*
- * Terminal highlighting attribute bits.
- * Attributes above HL_ALL are used for syntax highlighting.
- */
-#define HL_NORMAL 0x00
-#define HL_INVERSE 0x01
-#define HL_BOLD 0x02
-#define HL_ITALIC 0x04
-#define HL_UNDERLINE 0x08
-#define HL_UNDERCURL 0x10
-#define HL_STANDOUT 0x20
+#include "nvim/ex_cmds_defs.h"
#define HL_CONTAINED 0x01 /* not used on toplevel */
#define HL_TRANSP 0x02 /* has no highlighting */
@@ -43,6 +33,9 @@ typedef struct {
} color_name_table_T;
extern color_name_table_T color_name_table[];
+/// Array of highlight definitions, used for unit testing
+extern const char *const highlight_init_cmdline[];
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "syntax.h.generated.h"
#endif
diff --git a/src/nvim/syntax_defs.h b/src/nvim/syntax_defs.h
index 8d207e6286..5ee0611d58 100644
--- a/src/nvim/syntax_defs.h
+++ b/src/nvim/syntax_defs.h
@@ -1,9 +1,7 @@
#ifndef NVIM_SYNTAX_DEFS_H
#define NVIM_SYNTAX_DEFS_H
-#include "nvim/regexp_defs.h"
-
-typedef int32_t RgbValue;
+#include "nvim/highlight_defs.h"
# define SST_MIN_ENTRIES 150 /* minimal size for state stack array */
# define SST_MAX_ENTRIES 1000 /* maximal size for state stack array */
@@ -11,13 +9,16 @@ typedef int32_t RgbValue;
# define SST_DIST 16 /* normal distance between entries */
# define SST_INVALID (synstate_T *)-1 /* invalid syn_state pointer */
-typedef unsigned short disptick_T; /* display tick type */
+typedef struct syn_state synstate_T;
+
+#include "nvim/buffer_defs.h"
+#include "nvim/regexp_defs.h"
/* struct passed to in_id_list() */
struct sp_syn {
- int inc_tag; /* ":syn include" unique tag */
- short id; /* highlight group ID of item */
- short *cont_in_list; /* cont.in group IDs, if non-zero */
+ int inc_tag; // ":syn include" unique tag
+ int16_t id; // highlight group ID of item
+ int16_t *cont_in_list; // cont.in group IDs, if non-zero
};
/*
@@ -26,12 +27,12 @@ struct sp_syn {
typedef struct keyentry keyentry_T;
struct keyentry {
- keyentry_T *ke_next; /* next entry with identical "keyword[]" */
- struct sp_syn k_syn; /* struct passed to in_id_list() */
- short *next_list; /* ID list for next match (if non-zero) */
+ keyentry_T *ke_next; // next entry with identical "keyword[]"
+ struct sp_syn k_syn; // struct passed to in_id_list()
+ int16_t *next_list; // ID list for next match (if non-zero)
int flags;
- int k_char; /* conceal substitute character */
- char_u keyword[1]; /* actually longer */
+ int k_char; // conceal substitute character
+ char_u keyword[1]; // actually longer
};
/*
@@ -49,8 +50,6 @@ typedef struct buf_state {
* syn_state contains the syntax state stack for the start of one line.
* Used by b_sst_array[].
*/
-typedef struct syn_state synstate_T;
-
struct syn_state {
synstate_T *sst_next; /* next entry in used or free list */
linenr_T sst_lnum; /* line number for this state */
@@ -58,20 +57,13 @@ struct syn_state {
bufstate_T sst_stack[SST_FIX_STATES]; /* short state stack */
garray_T sst_ga; /* growarray for long state stack */
} sst_union;
- int sst_next_flags; /* flags for sst_next_list */
- int sst_stacksize; /* number of states on the stack */
- short *sst_next_list; /* "nextgroup" list in this state
- * (this is a copy, don't free it! */
- disptick_T sst_tick; /* tick when last displayed */
- linenr_T sst_change_lnum; /* when non-zero, change in this line
- * may have made the state invalid */
+ int sst_next_flags; // flags for sst_next_list
+ int sst_stacksize; // number of states on the stack
+ int16_t *sst_next_list; // "nextgroup" list in this state
+ // (this is a copy, don't free it!
+ disptick_T sst_tick; // tick when last displayed
+ linenr_T sst_change_lnum; // when non-zero, change in this line
+ // may have made the state invalid
};
-// Structure shared between syntax.c, screen.c
-typedef struct attr_entry {
- int16_t rgb_ae_attr, cterm_ae_attr; // HL_BOLD, etc.
- RgbValue rgb_fg_color, rgb_bg_color, rgb_sp_color;
- int cterm_fg_color, cterm_bg_color;
-} attrentry_T;
-
#endif // NVIM_SYNTAX_DEFS_H
diff --git a/src/nvim/tag.c b/src/nvim/tag.c
index dfecfb776d..50397d40e6 100644
--- a/src/nvim/tag.c
+++ b/src/nvim/tag.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* Code to handle tags and the tag stack
*/
@@ -26,7 +29,6 @@
#include "nvim/mbyte.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/file_search.h"
#include "nvim/garray.h"
#include "nvim/memory.h"
@@ -73,23 +75,18 @@ typedef struct {
regmatch_T regmatch; /* regexp program, may be NULL */
} pat_T;
-/*
- * The matching tags are first stored in ga_match[]. In which one depends on
- * the priority of the match.
- * At the end, the matches from ga_match[] are concatenated, to make a list
- * sorted on priority.
- */
-#define MT_ST_CUR 0 /* static match in current file */
-#define MT_GL_CUR 1 /* global match in current file */
-#define MT_GL_OTH 2 /* global match in other file */
-#define MT_ST_OTH 3 /* static match in other file */
-#define MT_IC_ST_CUR 4 /* icase static match in current file */
-#define MT_IC_GL_CUR 5 /* icase global match in current file */
-#define MT_IC_GL_OTH 6 /* icase global match in other file */
-#define MT_IC_ST_OTH 7 /* icase static match in other file */
-#define MT_IC_OFF 4 /* add for icase match */
-#define MT_RE_OFF 8 /* add for regexp match */
-#define MT_MASK 7 /* mask for printing priority */
+// The matching tags are first stored in one of the hash tables. In
+// which one depends on the priority of the match.
+// ht_match[] is used to find duplicates, ga_match[] to keep them in sequence.
+// At the end, the matches from ga_match[] are concatenated, to make a list
+// sorted on priority.
+#define MT_ST_CUR 0 // static match in current file
+#define MT_GL_CUR 1 // global match in current file
+#define MT_GL_OTH 2 // global match in other file
+#define MT_ST_OTH 3 // static match in other file
+#define MT_IC_OFF 4 // add for icase match
+#define MT_RE_OFF 8 // add for regexp match
+#define MT_MASK 7 // mask for printing priority
#define MT_COUNT 16
static char *mt_names[MT_COUNT/2] =
@@ -109,15 +106,6 @@ static char_u *topmsg = (char_u *)N_("E556: at top of tag stack");
static char_u *tagmatchname = NULL; /* name of last used tag */
/*
- * We use ftello() here, if available. It returns off_t instead of long,
- * which helps if long is 32 bit and off_t is 64 bit.
- * We assume that when fseeko() is available then ftello() is too.
- */
-#ifdef HAVE_FSEEKO
-# define ftell ftello
-#endif
-
-/*
* Tag for preview window is remembered separately, to avoid messing up the
* normal tagstack.
*/
@@ -211,12 +199,15 @@ do_tag (
clearpos(&saved_fmark.mark); /* shutup gcc 4.0 */
saved_fmark.fnum = 0;
- /*
- * Don't add a tag to the tagstack if 'tagstack' has been reset.
- */
- if (!p_tgst && *tag != NUL) {
- use_tagstack = FALSE;
- new_tag = TRUE;
+ // Don't add a tag to the tagstack if 'tagstack' has been reset.
+ assert(tag != NULL);
+ if (!p_tgst && *tag != NUL) { // -V522
+ use_tagstack = false;
+ new_tag = true;
+ if (g_do_tagpreview != 0) {
+ xfree(ptag_entry.tagname);
+ ptag_entry.tagname = vim_strsave(tag);
+ }
} else {
if (g_do_tagpreview != 0)
use_tagstack = FALSE;
@@ -275,8 +266,8 @@ do_tag (
goto end_do_tag;
}
- if (type == DT_POP) { /* go to older position */
- int old_KeyTyped = KeyTyped;
+ if (type == DT_POP) { // go to older position
+ const bool old_KeyTyped = KeyTyped;
if ((tagstackidx -= count) < 0) {
EMSG(_(bottommsg));
if (tagstackidx + count == 0) {
@@ -521,10 +512,10 @@ do_tag (
if (msg_col == 0)
msg_didout = FALSE; /* overwrite previous message */
msg_start();
- MSG_PUTS_ATTR(_(" # pri kind tag"), hl_attr(HLF_T));
+ MSG_PUTS_ATTR(_(" # pri kind tag"), HL_ATTR(HLF_T));
msg_clr_eos();
taglen_advance(taglen);
- MSG_PUTS_ATTR(_("file\n"), hl_attr(HLF_T));
+ MSG_PUTS_ATTR(_("file\n"), HL_ATTR(HLF_T));
for (i = 0; i < num_matches && !got_int; i++) {
parse_match(matches[i], &tagp);
@@ -537,21 +528,22 @@ do_tag (
}
vim_snprintf((char *)IObuff + 1, IOSIZE - 1, "%2d %s ", i + 1,
mt_names[matches[i][0] & MT_MASK]);
- msg_puts(IObuff);
- if (tagp.tagkind != NULL)
+ msg_puts((const char *)IObuff);
+ if (tagp.tagkind != NULL) {
msg_outtrans_len(tagp.tagkind,
- (int)(tagp.tagkind_end - tagp.tagkind));
+ (int)(tagp.tagkind_end - tagp.tagkind));
+ }
msg_advance(13);
msg_outtrans_len_attr(tagp.tagname,
- (int)(tagp.tagname_end - tagp.tagname),
- hl_attr(HLF_T));
+ (int)(tagp.tagname_end - tagp.tagname),
+ HL_ATTR(HLF_T));
msg_putchar(' ');
taglen_advance(taglen);
/* Find out the actual file name. If it is long, truncate
* it and put "..." in the middle */
p = tag_full_fname(&tagp);
- msg_puts_long_attr(p, hl_attr(HLF_D));
+ msg_puts_long_attr(p, HL_ATTR(HLF_D));
xfree(p);
if (msg_col > 0)
@@ -581,8 +573,8 @@ do_tag (
p = tagp.tagkind_end;
continue;
}
- /* print all other extra fields */
- attr = hl_attr(HLF_CM);
+ // print all other extra fields
+ attr = HL_ATTR(HLF_CM);
while (*p && *p != '\r' && *p != '\n') {
if (msg_col + ptr2cells(p) >= Columns) {
msg_putchar('\n');
@@ -592,7 +584,7 @@ do_tag (
}
p = msg_outtrans_one(p, attr);
if (*p == TAB) {
- msg_puts_attr((char_u *)" ", attr);
+ msg_puts_attr(" ", attr);
break;
}
if (*p == ':')
@@ -675,7 +667,7 @@ do_tag (
fname = xmalloc(MAXPATHL + 1);
cmd = xmalloc(CMDBUFFSIZE + 1);
- list = list_alloc();
+ list = tv_list_alloc(num_matches);
for (i = 0; i < num_matches; ++i) {
int len, cmd_len;
@@ -774,20 +766,21 @@ do_tag (
cmd[len] = NUL;
}
- dict = dict_alloc();
- list_append_dict(list, dict);
+ dict = tv_dict_alloc();
+ tv_list_append_dict(list, dict);
- dict_add_nr_str(dict, "text", 0L, tag_name);
- dict_add_nr_str(dict, "filename", 0L, fname);
- dict_add_nr_str(dict, "lnum", lnum, NULL);
- if (lnum == 0)
- dict_add_nr_str(dict, "pattern", 0L, cmd);
+ tv_dict_add_str(dict, S_LEN("text"), (const char *)tag_name);
+ tv_dict_add_str(dict, S_LEN("filename"), (const char *)fname);
+ tv_dict_add_nr(dict, S_LEN("lnum"), lnum);
+ if (lnum == 0) {
+ tv_dict_add_str(dict, S_LEN("pattern"), (const char *)cmd);
+ }
}
vim_snprintf((char *)IObuff, IOSIZE, "ltag %s", tag);
- set_errorlist(curwin, list, ' ', IObuff);
+ set_errorlist(curwin, list, ' ', IObuff, NULL);
- list_free(list, TRUE);
+ tv_list_free(list);
xfree(fname);
xfree(cmd);
@@ -855,13 +848,15 @@ do_tag (
STRCAT(IObuff, _(" Using tag with different case!"));
if ((num_matches > prev_num_matches || new_tag)
&& num_matches > 1) {
- if (ic)
- msg_attr(IObuff, hl_attr(HLF_W));
- else
+ if (ic) {
+ msg_attr((const char *)IObuff, HL_ATTR(HLF_W));
+ } else {
msg(IObuff);
- msg_scroll = TRUE; /* don't overwrite this message */
- } else
+ }
+ msg_scroll = true; // Don't overwrite this message.
+ } else {
give_warning(IObuff, ic);
+ }
if (ic && !msg_scrolled && msg_silent == 0) {
ui_flush();
os_delay(1000L, true);
@@ -913,7 +908,8 @@ end_do_tag:
/* Only store the new index when using the tagstack and it's valid. */
if (use_tagstack && tagstackidx <= curwin->w_tagstacklen)
curwin->w_tagstackidx = tagstackidx;
- postponed_split = 0; /* don't split next time */
+ postponed_split = 0; // don't split next time
+ g_do_tagpreview = 0; // don't do tag preview next time
return jumped_to_tag;
}
@@ -956,15 +952,15 @@ void do_tags(exarg_T *eap)
continue;
msg_putchar('\n');
- sprintf((char *)IObuff, "%c%2d %2d %-15s %5ld ",
- i == tagstackidx ? '>' : ' ',
- i + 1,
- tagstack[i].cur_match + 1,
- tagstack[i].tagname,
- tagstack[i].fmark.mark.lnum);
+ vim_snprintf((char *)IObuff, IOSIZE, "%c%2d %2d %-15s %5ld ",
+ i == tagstackidx ? '>' : ' ',
+ i + 1,
+ tagstack[i].cur_match + 1,
+ tagstack[i].tagname,
+ tagstack[i].fmark.mark.lnum);
msg_outtrans(IObuff);
msg_outtrans_attr(name, tagstack[i].fmark.fnum == curbuf->b_fnum
- ? hl_attr(HLF_D) : 0);
+ ? HL_ATTR(HLF_D) : 0);
xfree(name);
}
ui_flush(); /* show one line at a time */
@@ -1054,6 +1050,7 @@ static void prepare_pats(pat_T *pats, int has_re)
* TAG_REGEXP use "pat" as a regexp
* TAG_NOIC don't always ignore case
* TAG_KEEP_LANG keep language
+ * TAG_CSCOPE use cscope results for tags
*/
int
find_tags (
@@ -1082,22 +1079,21 @@ find_tags (
char_u *p;
char_u *s;
int i;
- int tag_file_sorted = NUL; /* !_TAG_FILE_SORTED value */
- struct tag_search_info /* Binary search file offsets */
- {
- off_t low_offset; /* offset for first char of first line that
- could match */
- off_t high_offset; /* offset of char after last line that could
- match */
- off_t curr_offset; /* Current file offset in search range */
- off_t curr_offset_used; /* curr_offset used when skipping back */
- off_t match_offset; /* Where the binary search found a tag */
- int low_char; /* first char at low_offset */
- int high_char; /* first char at high_offset */
+ int tag_file_sorted = NUL; // !_TAG_FILE_SORTED value
+ struct tag_search_info { // Binary search file offsets
+ off_T low_offset; // offset for first char of first line that
+ // could match
+ off_T high_offset; // offset of char after last line that could
+ // match
+ off_T curr_offset; // Current file offset in search range
+ off_T curr_offset_used; // curr_offset used when skipping back
+ off_T match_offset; // Where the binary search found a tag
+ int low_char; // first char at low_offset
+ int high_char; // first char at high_offset
} search_info;
- off_t filesize;
+ off_T filesize;
int tagcmp;
- off_t offset;
+ off_T offset;
int round;
enum {
TS_START, /* at start of file */
@@ -1115,19 +1111,19 @@ find_tags (
int save_emsg_off;
- struct match_found {
- int len; /* nr of chars of match[] to be compared */
- char_u match[1]; /* actually longer */
- } *mfp, *mfp2;
- garray_T ga_match[MT_COUNT];
- int match_count = 0; /* number of matches found */
+ char_u *mfp;
+ garray_T ga_match[MT_COUNT]; // stores matches in sequence
+ hashtab_T ht_match[MT_COUNT]; // stores matches by key
+ hash_T hash = 0;
+ int match_count = 0; // number of matches found
char_u **matches;
int mtt;
int help_save;
int help_pri = 0;
- char_u *help_lang_find = NULL; /* lang to be found */
- char_u help_lang[3]; /* lang of current tags file */
- char_u *saved_pat = NULL; /* copy of pat[] */
+ char_u *help_lang_find = NULL; // lang to be found
+ char_u help_lang[3]; // lang of current tags file
+ char_u *saved_pat = NULL; // copy of pat[]
+ bool is_txt = false;
pat_T orgpat; /* holds unconverted pattern info */
vimconv_T vimconv;
@@ -1158,6 +1154,12 @@ find_tags (
case TC_MATCH:
p_ic = false;
break;
+ case TC_FOLLOWSCS:
+ p_ic = ignorecase(pat);
+ break;
+ case TC_SMART:
+ p_ic = ignorecase_opt(pat, true, true);
+ break;
default:
assert(false);
}
@@ -1171,16 +1173,23 @@ find_tags (
*/
lbuf = xmalloc(lbuf_size);
tag_fname = xmalloc(MAXPATHL + 1);
- for (mtt = 0; mtt < MT_COUNT; ++mtt)
- ga_init(&ga_match[mtt], (int)sizeof(struct match_found *), 100);
+ for (mtt = 0; mtt < MT_COUNT; mtt++) {
+ ga_init(&ga_match[mtt], sizeof(char_u *), 100);
+ hash_init(&ht_match[mtt]);
+ }
STRCPY(tag_fname, "from cscope"); /* for error messages */
/*
* Initialize a few variables
*/
- if (help_only) /* want tags from help file */
- curbuf->b_help = true; /* will be restored later */
+ if (help_only) { // want tags from help file
+ curbuf->b_help = true; // will be restored later
+ } else if (use_cscope) {
+ // Make sure we don't mix help and cscope, confuses Coverity.
+ help_only = false;
+ curbuf->b_help = false;
+ }
orgpat.len = (int)STRLEN(pat);
if (curbuf->b_help) {
@@ -1205,9 +1214,9 @@ find_tags (
if (has_re && orgpat.regmatch.regprog == NULL)
goto findtag_end;
- /* This is only to avoid a compiler warning for using search_info
- * uninitialised. */
- memset(&search_info, 0, (size_t)1);
+ // This is only to avoid a compiler warning for using search_info
+ // uninitialised.
+ memset(&search_info, 0, 1); // -V512
/*
* When finding a specified number of matches, first try with matching
@@ -1219,6 +1228,14 @@ find_tags (
* When the tag file is case-fold sorted, it is either one or the other.
* Only ignore case when TAG_NOIC not used or 'ignorecase' set.
*/
+ // Set a flag if the file extension is .txt
+ if ((flags & TAG_KEEP_LANG)
+ && help_lang_find == NULL
+ && curbuf->b_fname != NULL
+ && (i = (int)STRLEN(curbuf->b_fname)) > 4
+ && STRICMP(curbuf->b_fname + i - 4, ".txt") == 0) {
+ is_txt = true;
+ }
orgpat.regmatch.rm_ic = ((p_ic || !noic)
&& (findall || orgpat.headlen == 0 || !p_tbs));
for (round = 1; round <= 2; ++round) {
@@ -1234,13 +1251,19 @@ find_tags (
fp = NULL; // avoid GCC warning
} else {
if (curbuf->b_help) {
- /* Prefer help tags according to 'helplang'. Put the
- * two-letter language name in help_lang[]. */
- i = (int)STRLEN(tag_fname);
- if (i > 3 && tag_fname[i - 3] == '-')
- STRCPY(help_lang, tag_fname + i - 2);
- else
+ // Keep en if the file extension is .txt
+ if (is_txt) {
STRCPY(help_lang, "en");
+ } else {
+ // Prefer help tags according to 'helplang'. Put the
+ // two-letter language name in help_lang[].
+ i = (int)STRLEN(tag_fname);
+ if (i > 3 && tag_fname[i - 3] == '-') {
+ STRCPY(help_lang, tag_fname + i - 2);
+ } else {
+ STRCPY(help_lang, "en");
+ }
+ }
/* When searching for a specific language skip tags files
* for other languages. */
@@ -1294,9 +1317,14 @@ find_tags (
* Read and parse the lines in the file one by one
*/
for (;; ) {
- line_breakcheck(); /* check for CTRL-C typed */
+ // check for CTRL-C typed, more often when jumping around
+ if (state == TS_BINARY || state == TS_SKIP_BACK) {
+ line_breakcheck();
+ } else {
+ fast_breakcheck();
+ }
if ((flags & TAG_INS_COMP)) /* Double brackets for gcc */
- ins_compl_check_keys(30);
+ ins_compl_check_keys(30, false);
if (got_int || compl_interrupted) {
stop_searching = TRUE;
break;
@@ -1340,36 +1368,28 @@ find_tags (
if (state == TS_BINARY || state == TS_SKIP_BACK) {
/* Adjust the search file offset to the correct position */
search_info.curr_offset_used = search_info.curr_offset;
-#ifdef HAVE_FSEEKO
- fseeko(fp, search_info.curr_offset, SEEK_SET);
-#else
- fseek(fp, (long)search_info.curr_offset, SEEK_SET);
-#endif
+ vim_fseek(fp, search_info.curr_offset, SEEK_SET);
eof = vim_fgets(lbuf, LSIZE, fp);
if (!eof && search_info.curr_offset != 0) {
/* The explicit cast is to work around a bug in gcc 3.4.2
* (repeated below). */
- search_info.curr_offset = ftell(fp);
+ search_info.curr_offset = vim_ftell(fp);
if (search_info.curr_offset == search_info.high_offset) {
- /* oops, gone a bit too far; try from low offset */
-#ifdef HAVE_FSEEKO
- fseeko(fp, search_info.low_offset, SEEK_SET);
-#else
- fseek(fp, (long)search_info.low_offset, SEEK_SET);
-#endif
+ // oops, gone a bit too far; try from low offset
+ vim_fseek(fp, search_info.low_offset, SEEK_SET);
search_info.curr_offset = search_info.low_offset;
}
eof = vim_fgets(lbuf, LSIZE, fp);
}
/* skip empty and blank lines */
while (!eof && vim_isblankline(lbuf)) {
- search_info.curr_offset = ftell(fp);
+ search_info.curr_offset = vim_ftell(fp);
eof = vim_fgets(lbuf, LSIZE, fp);
}
if (eof) {
/* Hit end of file. Skip backwards. */
state = TS_SKIP_BACK;
- search_info.match_offset = ftell(fp);
+ search_info.match_offset = vim_ftell(fp);
search_info.curr_offset = search_info.curr_offset_used;
continue;
}
@@ -1485,10 +1505,10 @@ line_read_in:
*/
if (state == TS_BINARY) {
// Get the tag file size.
- if ((filesize = lseek(fileno(fp), (off_t)0L, SEEK_END)) <= 0) {
+ if ((filesize = vim_lseek(fileno(fp), (off_T)0L, SEEK_END)) <= 0) {
state = TS_LINEAR;
} else {
- lseek(fileno(fp), (off_t)0L, SEEK_SET);
+ vim_lseek(fileno(fp), (off_T)0L, SEEK_SET);
/* Calculate the first read offset in the file. Start
* the search in the middle of the file. */
@@ -1526,11 +1546,7 @@ parse_line:
/* Avoid getting stuck. */
linear = TRUE;
state = TS_LINEAR;
-# ifdef HAVE_FSEEKO
- fseeko(fp, search_info.low_offset, SEEK_SET);
-# else
- fseek(fp, (long)search_info.low_offset, SEEK_SET);
-# endif
+ vim_fseek(fp, search_info.low_offset, SEEK_SET);
}
continue;
}
@@ -1609,7 +1625,7 @@ parse_line:
continue;
}
if (tagcmp < 0) {
- search_info.curr_offset = ftell(fp);
+ search_info.curr_offset = vim_ftell(fp);
if (search_info.curr_offset < search_info.high_offset) {
search_info.low_offset = search_info.curr_offset;
if (sortic)
@@ -1645,10 +1661,11 @@ parse_line:
} else if (state == TS_STEP_FORWARD) {
assert(cmplen >= 0);
if (mb_strnicmp(tagp.tagname, orgpat.head, (size_t)cmplen) != 0) {
- if ((off_t)ftell(fp) > search_info.match_offset)
- break; /* past last match */
- else
- continue; /* before first match */
+ if ((off_T)vim_ftell(fp) > search_info.match_offset) {
+ break; // past last match
+ } else {
+ continue; // before first match
+ }
}
} else
/* skip this match if it can't match */
@@ -1719,10 +1736,10 @@ parse_line:
match_re = TRUE;
}
- /*
- * If a match is found, add it to ga_match[].
- */
+ // If a match is found, add it to ht_match[] and ga_match[].
if (match) {
+ int len = 0;
+
if (use_cscope) {
/* Don't change the ordering, always use the same table. */
mtt = MT_GL_OTH;
@@ -1757,116 +1774,109 @@ parse_line:
mtt += MT_RE_OFF;
}
- /*
- * Add the found match in ga_match[mtt], avoiding duplicates.
- * Store the info we need later, which depends on the kind of
- * tags we are dealing with.
- */
- ga_grow(&ga_match[mtt], 1);
- {
- int len;
-
- if (help_only) {
+ // Add the found match in ht_match[mtt] and ga_match[mtt].
+ // Store the info we need later, which depends on the kind of
+ // tags we are dealing with.
+ if (help_only) {
# define ML_EXTRA 3
- /*
- * Append the help-heuristic number after the
- * tagname, for sorting it later.
- */
- *tagp.tagname_end = NUL;
- len = (int)(tagp.tagname_end - tagp.tagname);
- mfp = xmalloc(sizeof(struct match_found) + len + 10 + ML_EXTRA);
- /* "len" includes the language and the NUL, but
- * not the priority. */
- mfp->len = len + ML_EXTRA + 1;
-#define ML_HELP_LEN 6
- p = mfp->match;
- STRCPY(p, tagp.tagname);
- p[len] = '@';
- STRCPY(p + len + 1, help_lang);
- sprintf((char *)p + len + 1 + ML_EXTRA, "%06d",
- help_heuristic(tagp.tagname,
- match_re ? matchoff : 0, !match_no_ic)
- + help_pri
- );
-
- *tagp.tagname_end = TAB;
- } else if (name_only) {
- if (get_it_again) {
- char_u *temp_end = tagp.command;
-
- if (*temp_end == '/')
- while (*temp_end && *temp_end != '\r'
- && *temp_end != '\n'
- && *temp_end != '$')
- temp_end++;
-
- if (tagp.command + 2 < temp_end) {
- len = (int)(temp_end - tagp.command - 2);
- mfp = xmalloc(sizeof(struct match_found) + len);
- mfp->len = len + 1; /* include the NUL */
- p = mfp->match;
- STRLCPY(p, tagp.command + 2, len + 1);
- } else
- mfp = NULL;
- get_it_again = FALSE;
+ // Append the help-heuristic number after the tagname, for
+ // sorting it later. The heuristic is ignored for
+ // detecting duplicates.
+ // The format is {tagname}@{lang}NUL{heuristic}NUL
+ *tagp.tagname_end = NUL;
+ len = (int)(tagp.tagname_end - tagp.tagname);
+ mfp = xmalloc(sizeof(char_u) + len + 10 + ML_EXTRA + 1);
+
+ p = mfp;
+ STRCPY(p, tagp.tagname);
+ p[len] = '@';
+ STRCPY(p + len + 1, help_lang);
+ snprintf((char *)p + len + 1 + ML_EXTRA, 10, "%06d",
+ help_heuristic(tagp.tagname,
+ match_re ? matchoff : 0, !match_no_ic)
+ + help_pri);
+
+ *tagp.tagname_end = TAB;
+ } else if (name_only) {
+ if (get_it_again) {
+ char_u *temp_end = tagp.command;
+
+ if (*temp_end == '/') {
+ while (*temp_end && *temp_end != '\r'
+ && *temp_end != '\n'
+ && *temp_end != '$') {
+ temp_end++;
+ }
+ }
+
+ if (tagp.command + 2 < temp_end) {
+ len = (int)(temp_end - tagp.command - 2);
+ mfp = xmalloc(len + 2);
+ STRLCPY(mfp, tagp.command + 2, len + 1);
} else {
- len = (int)(tagp.tagname_end - tagp.tagname);
- mfp = xmalloc(sizeof(struct match_found) + len);
- mfp->len = len + 1; /* include the NUL */
- p = mfp->match;
- STRLCPY(p, tagp.tagname, len + 1);
-
- /* if wanted, re-read line to get long form too */
- if (State & INSERT)
- get_it_again = p_sft;
+ mfp = NULL;
}
+ get_it_again = false;
} else {
- /* Save the tag in a buffer.
- * Emacs tag: <mtt><tag_fname><NUL><ebuf><NUL><lbuf>
- * other tag: <mtt><tag_fname><NUL><NUL><lbuf>
- * without Emacs tags: <mtt><tag_fname><NUL><lbuf>
- */
- len = (int)STRLEN(tag_fname)
- + (int)STRLEN(lbuf) + 3;
- mfp = xmalloc(sizeof(struct match_found) + len);
- mfp->len = len;
- p = mfp->match;
- p[0] = mtt;
- STRCPY(p + 1, tag_fname);
+ len = (int)(tagp.tagname_end - tagp.tagname);
+ mfp = xmalloc(sizeof(char_u) + len + 1);
+ STRLCPY(mfp, tagp.tagname, len + 1);
+
+ // if wanted, re-read line to get long form too
+ if (State & INSERT) {
+ get_it_again = p_sft;
+ }
+ }
+ } else {
+#define TAG_SEP 0x02
+ size_t tag_fname_len = STRLEN(tag_fname);
+ // Save the tag in a buffer.
+ // Use 0x02 to separate fields (Can't use NUL, because the
+ // hash key is terminated by NUL).
+ // Emacs tag: <mtt><tag_fname><0x02><ebuf><0x02><lbuf><NUL>
+ // other tag: <mtt><tag_fname><0x02><0x02><lbuf><NUL>
+ // without Emacs tags: <mtt><tag_fname><0x02><lbuf><NUL>
+ // Here <mtt> is the "mtt" value plus 1 to avoid NUL.
+ len = (int)tag_fname_len + (int)STRLEN(lbuf) + 3;
+ mfp = xmalloc(sizeof(char_u) + len + 1);
+ p = mfp;
+ p[0] = mtt + 1;
+ STRCPY(p + 1, tag_fname);
#ifdef BACKSLASH_IN_FILENAME
- /* Ignore differences in slashes, avoid adding
- * both path/file and path\file. */
- slash_adjust(p + 1);
+ // Ignore differences in slashes, avoid adding
+ // both path/file and path\file.
+ slash_adjust(p + 1);
#endif
- s = p + 1 + STRLEN(tag_fname) + 1;
- STRCPY(s, lbuf);
- }
+ p[tag_fname_len + 1] = TAG_SEP;
+ s = p + 1 + tag_fname_len + 1;
+ STRCPY(s, lbuf);
+ }
- if (mfp != NULL) {
- /*
- * Don't add identical matches.
- * This can take a lot of time when finding many
- * matches, check for CTRL-C now and then.
- * Add all cscope tags, because they are all listed.
- */
- if (use_cscope)
- i = -1;
- else
- for (i = ga_match[mtt].ga_len; --i >= 0 && !got_int; ) {
- mfp2 = ((struct match_found **)
- (ga_match[mtt].ga_data))[i];
- if (mfp2->len == mfp->len
- && memcmp(mfp2->match, mfp->match,
- (size_t)mfp->len) == 0)
- break;
- line_breakcheck();
- }
- if (i < 0) {
- ((struct match_found **)(ga_match[mtt].ga_data))
+ if (mfp != NULL) {
+ hashitem_T *hi;
+
+ // Don't add identical matches.
+ // Add all cscope tags, because they are all listed.
+ // "mfp" is used as a hash key, there is a NUL byte to end
+ // the part matters for comparing, more bytes may follow
+ // after it. E.g. help tags store the priority after the
+ // NUL.
+ if (use_cscope) {
+ hash++;
+ } else {
+ hash = hash_hash(mfp);
+ }
+ hi = hash_lookup(&ht_match[mtt], (const char *)mfp,
+ STRLEN(mfp), hash);
+ if (HASHITEM_EMPTY(hi)) {
+ hash_add_item(&ht_match[mtt], hi, mfp, hash);
+ ga_grow(&ga_match[mtt], 1);
+ ((char_u **)(ga_match[mtt].ga_data))
[ga_match[mtt].ga_len++] = mfp;
- ++match_count;
- } else
- xfree(mfp);
+ match_count++;
+ } else {
+ // duplicate tag, drop it
+ xfree(mfp);
}
}
}
@@ -1876,10 +1886,11 @@ parse_line:
if (line_error) {
EMSG2(_("E431: Format error in tags file \"%s\""), tag_fname);
- if (!use_cscope)
- EMSGN(_("Before byte %" PRId64), ftell(fp));
- stop_searching = TRUE;
- line_error = FALSE;
+ if (!use_cscope) {
+ EMSGN(_("Before byte %" PRId64), vim_ftell(fp));
+ }
+ stop_searching = true;
+ line_error = false;
}
if (!use_cscope)
@@ -1941,21 +1952,29 @@ findtag_end:
else
matches = NULL;
match_count = 0;
- for (mtt = 0; mtt < MT_COUNT; ++mtt) {
- for (int i = 0; i < ga_match[mtt].ga_len; ++i) {
- mfp = ((struct match_found **)(ga_match[mtt].ga_data))[i];
- if (matches == NULL)
+ for (mtt = 0; mtt < MT_COUNT; mtt++) {
+ for (i = 0; i < ga_match[mtt].ga_len; i++) {
+ mfp = ((char_u **)(ga_match[mtt].ga_data))[i];
+ if (matches == NULL) {
xfree(mfp);
- else {
- /* To avoid allocating memory again we turn the struct
- * match_found into a string. For help the priority was not
- * included in the length. */
- memmove(mfp, mfp->match,
- (size_t)(mfp->len + (help_only ? ML_HELP_LEN : 0)));
+ } else {
+ if (!name_only) {
+ // Change mtt back to zero-based.
+ *mfp = *mfp - 1;
+
+ // change the TAG_SEP back to NUL
+ for (p = mfp + 1; *p != NUL; p++) {
+ if (*p == TAG_SEP) {
+ *p = NUL;
+ }
+ }
+ }
matches[match_count++] = (char_u *)mfp;
}
}
+
ga_clear(&ga_match[mtt]);
+ hash_clear(&ht_match[mtt]);
}
*matchesp = matches;
@@ -2167,7 +2186,7 @@ parse_tag_line (
* Return TRUE if it is a static tag and adjust *tagname to the real tag.
* Return FALSE if it is not a static tag.
*/
-static int test_for_static(tagptrs_T *tagp)
+static bool test_for_static(tagptrs_T *tagp)
{
char_u *p;
@@ -2198,6 +2217,16 @@ static int test_for_static(tagptrs_T *tagp)
return FALSE;
}
+// Returns the length of a matching tag line.
+static size_t matching_line_len(const char_u *const lbuf)
+{
+ const char_u *p = lbuf + 1;
+
+ // does the same thing as parse_match()
+ p += STRLEN(p) + 1;
+ return (p - lbuf) + STRLEN(p);
+}
+
/*
* Parse a line from a matching tag. Does not change the line itself.
*
@@ -2270,7 +2299,7 @@ static char_u *tag_full_fname(tagptrs_T *tagp)
{
int c = *tagp->fname_end;
*tagp->fname_end = NUL;
- char_u *fullname = expand_tag_fname(tagp->fname, tagp->tag_fname, FALSE);
+ char_u *fullname = expand_tag_fname(tagp->fname, tagp->tag_fname, false);
*tagp->fname_end = c;
return fullname;
@@ -2281,11 +2310,10 @@ static char_u *tag_full_fname(tagptrs_T *tagp)
*
* returns OK for success, NOTAGFILE when file not found, FAIL otherwise.
*/
-static int
-jumpto_tag (
- char_u *lbuf, /* line from the tags file for this tag */
- int forceit, /* :ta with ! */
- int keep_help /* keep help flag (FALSE for cscope) */
+static int jumpto_tag(
+ const char_u *lbuf_arg, // line from the tags file for this tag
+ int forceit, // :ta with !
+ int keep_help // keep help flag (FALSE for cscope)
)
{
int save_secure;
@@ -2293,7 +2321,6 @@ jumpto_tag (
bool save_p_ws;
int save_p_scs, save_p_ic;
linenr_T save_lnum;
- int csave = 0;
char_u *str;
char_u *pbuf; /* search pattern buffer */
char_u *pbuf_end;
@@ -2301,13 +2328,16 @@ jumpto_tag (
char_u *fname;
tagptrs_T tagp;
int retval = FAIL;
- int getfile_result;
+ int getfile_result = GETFILE_UNUSED;
int search_options;
int save_no_hlsearch;
win_T *curwin_save = NULL;
char_u *full_fname = NULL;
- int old_KeyTyped = KeyTyped; /* getting the file may reset it */
+ const bool old_KeyTyped = KeyTyped; // getting the file may reset it
const int l_g_do_tagpreview = g_do_tagpreview;
+ const size_t len = matching_line_len(lbuf_arg) + 1;
+ char_u *lbuf = xmalloc(len);
+ memmove(lbuf, lbuf_arg, len);
pbuf = xmalloc(LSIZE);
@@ -2317,8 +2347,7 @@ jumpto_tag (
goto erret;
}
- /* truncate the file name, so it can be used as a string */
- csave = *tagp.fname_end;
+ // truncate the file name, so it can be used as a string
*tagp.fname_end = NUL;
fname = tagp.fname;
@@ -2344,8 +2373,8 @@ jumpto_tag (
* Expand file name, when needed (for environment variables).
* If 'tagrelative' option set, may change file name.
*/
- fname = expand_tag_fname(fname, tagp.tag_fname, TRUE);
- tofree_fname = fname; /* free() it later */
+ fname = expand_tag_fname(fname, tagp.tag_fname, true);
+ tofree_fname = fname; // free() it later
/*
* Check if the file with the tag exists before abandoning the current
@@ -2385,11 +2414,38 @@ jumpto_tag (
}
}
- /* If it was a CTRL-W CTRL-] command split window now. For ":tab tag"
- * open a new tab page. */
- if (postponed_split || cmdmod.tab != 0) {
- win_split(postponed_split > 0 ? postponed_split : 0,
- postponed_split_flags);
+ // If it was a CTRL-W CTRL-] command split window now. For ":tab tag"
+ // open a new tab page.
+ if (postponed_split && (swb_flags & (SWB_USEOPEN | SWB_USETAB))) {
+ buf_T *const existing_buf = buflist_findname_exp(fname);
+
+ if (existing_buf != NULL) {
+ const win_T *wp = NULL;
+
+ if (swb_flags & SWB_USEOPEN) {
+ wp = buf_jump_open_win(existing_buf);
+ }
+
+ // If 'switchbuf' contains "usetab": jump to first window in any tab
+ // page containing "existing_buf" if one exists
+ if (wp == NULL && (swb_flags & SWB_USETAB)) {
+ wp = buf_jump_open_tab(existing_buf);
+ }
+
+ // We've switched to the buffer, the usual loading of the file must
+ // be skipped.
+ if (wp != NULL) {
+ getfile_result = GETFILE_SAME_FILE;
+ }
+ }
+ }
+ if (getfile_result == GETFILE_UNUSED
+ && (postponed_split || cmdmod.tab != 0)) {
+ if (win_split(postponed_split > 0 ? postponed_split : 0,
+ postponed_split_flags) == FAIL) {
+ RedrawingDisabled--;
+ goto erret;
+ }
RESET_BINDING(curwin);
}
@@ -2401,11 +2457,16 @@ jumpto_tag (
else
keep_help_flag = curbuf->b_help;
}
- getfile_result = getfile(0, fname, NULL, TRUE, (linenr_T)0, forceit);
- keep_help_flag = FALSE;
- if (getfile_result <= 0) { /* got to the right file */
- curwin->w_set_curswant = TRUE;
+ if (getfile_result == GETFILE_UNUSED) {
+ // Careful: getfile() may trigger autocommands and call jumpto_tag()
+ // recursively.
+ getfile_result = getfile(0, fname, NULL, true, (linenr_T)0, forceit);
+ }
+ keep_help_flag = false;
+
+ if (GETFILE_SUCCESS(getfile_result)) { // got to the right file
+ curwin->w_set_curswant = true;
postponed_split = 0;
save_secure = secure;
@@ -2497,7 +2558,7 @@ jumpto_tag (
}
}
p_ws = save_p_ws;
- p_ic = save_p_ic;
+ p_ic = save_p_ic; // -V519
p_scs = save_p_scs;
/* A search command may have positioned the cursor beyond the end
@@ -2523,9 +2584,10 @@ jumpto_tag (
SET_NO_HLSEARCH(save_no_hlsearch);
}
- /* Return OK if jumped to another file (at least we found the file!). */
- if (getfile_result == -1)
+ // Return OK if jumped to another file (at least we found the file!).
+ if (getfile_result == GETFILE_OPEN_OTHER) {
retval = OK;
+ }
if (retval == OK) {
/*
@@ -2546,19 +2608,18 @@ jumpto_tag (
win_enter(curwin_save, true);
}
- --RedrawingDisabled;
+ RedrawingDisabled--;
} else {
- --RedrawingDisabled;
- if (postponed_split) { /* close the window */
- win_close(curwin, FALSE);
+ RedrawingDisabled--;
+ if (postponed_split) { // close the window
+ win_close(curwin, false);
postponed_split = 0;
}
}
erret:
- g_do_tagpreview = 0; /* For next time */
- if (tagp.fname_end != NULL)
- *tagp.fname_end = csave;
+ g_do_tagpreview = 0; // For next time
+ xfree(lbuf);
xfree(pbuf);
xfree(tofree_fname);
xfree(full_fname);
@@ -2566,13 +2627,12 @@ erret:
return retval;
}
-/*
- * If "expand" is TRUE, expand wildcards in fname.
- * If 'tagrelative' option set, change fname (name of file containing tag)
- * according to tag_fname (name of tag file containing fname).
- * Returns a pointer to allocated memory.
- */
-static char_u *expand_tag_fname(char_u *fname, char_u *tag_fname, int expand)
+// If "expand" is true, expand wildcards in fname.
+// If 'tagrelative' option set, change fname (name of file containing tag)
+// according to tag_fname (name of tag file containing fname).
+// Returns a pointer to allocated memory.
+static char_u *expand_tag_fname(char_u *fname, char_u *const tag_fname,
+ const bool expand)
{
char_u *p;
char_u *expanded_fname = NULL;
@@ -2627,8 +2687,8 @@ static int test_for_current(char_u *fname, char_u *fname_end, char_u *tag_fname,
c = *fname_end;
*fname_end = NUL;
}
- fullname = expand_tag_fname(fname, tag_fname, TRUE);
- retval = (path_full_compare(fullname, buf_ffname, TRUE) & kEqualFiles);
+ fullname = expand_tag_fname(fname, tag_fname, true);
+ retval = (path_full_compare(fullname, buf_ffname, true) & kEqualFiles);
xfree(fullname);
*fname_end = c;
}
@@ -2732,8 +2792,8 @@ add_tag_field (
int len = 0;
int retval;
- /* check that the field name doesn't exist yet */
- if (dict_find(dict, (char_u *)field_name, -1) != NULL) {
+ // Check that the field name doesn't exist yet.
+ if (tv_dict_find(dict, field_name, -1) != NULL) {
if (p_verbose > 0) {
verbose_enter();
smsg(_("Duplicate field name: %s"), field_name);
@@ -2754,26 +2814,25 @@ add_tag_field (
STRLCPY(buf, start, len + 1);
}
buf[len] = NUL;
- retval = dict_add_nr_str(dict, field_name, 0L, buf);
+ retval = tv_dict_add_str(dict, field_name, STRLEN(field_name),
+ (const char *)buf);
xfree(buf);
return retval;
}
-/*
- * Add the tags matching the specified pattern to the list "list"
- * as a dictionary
- */
-int get_tags(list_T *list, char_u *pat)
+/// Add the tags matching the specified pattern "pat" to the list "list"
+/// as a dictionary. Use "buf_fname" for priority, unless NULL.
+int get_tags(list_T *list, char_u *pat, char_u *buf_fname)
{
int num_matches, i, ret;
char_u **matches, *p;
char_u *full_fname;
dict_T *dict;
tagptrs_T tp;
- long is_static;
+ bool is_static;
ret = find_tags(pat, &num_matches, &matches,
- TAG_REGEXP | TAG_NOIC, (int)MAXCOL, NULL);
+ TAG_REGEXP | TAG_NOIC, (int)MAXCOL, buf_fname);
if (ret == OK && num_matches > 0) {
for (i = 0; i < num_matches; ++i) {
int parse_result = parse_match(matches[i], &tp);
@@ -2788,19 +2847,18 @@ int get_tags(list_T *list, char_u *pat)
if (STRNCMP(tp.tagname, "!_TAG_", 6) == 0)
continue;
- dict = dict_alloc();
- list_append_dict(list, dict);
+ dict = tv_dict_alloc();
+ tv_list_append_dict(list, dict);
full_fname = tag_full_fname(&tp);
if (add_tag_field(dict, "name", tp.tagname, tp.tagname_end) == FAIL
- || add_tag_field(dict, "filename", full_fname,
- NULL) == FAIL
- || add_tag_field(dict, "cmd", tp.command,
- tp.command_end) == FAIL
+ || add_tag_field(dict, "filename", full_fname, NULL) == FAIL
+ || add_tag_field(dict, "cmd", tp.command, tp.command_end) == FAIL
|| add_tag_field(dict, "kind", tp.tagkind,
- tp.tagkind ? tp.tagkind_end : NULL) == FAIL
- || dict_add_nr_str(dict, "static", is_static, NULL) == FAIL)
+ tp.tagkind ? tp.tagkind_end : NULL) == FAIL
+ || tv_dict_add_nr(dict, S_LEN("static"), is_static) == FAIL) {
ret = FAIL;
+ }
xfree(full_fname);
diff --git a/src/nvim/tag.h b/src/nvim/tag.h
index 5d4bcddf94..a8fddd05da 100644
--- a/src/nvim/tag.h
+++ b/src/nvim/tag.h
@@ -1,6 +1,9 @@
#ifndef NVIM_TAG_H
#define NVIM_TAG_H
+#include "nvim/types.h"
+#include "nvim/ex_cmds_defs.h"
+
/*
* Values for do_tag().
*/
diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c
index fd416b3dcc..51bf22b31c 100644
--- a/src/nvim/terminal.c
+++ b/src/nvim/terminal.c
@@ -1,18 +1,20 @@
-// VT220/xterm-like terminal emulator implementation for nvim. Powered by
-// libvterm (http://www.leonerd.org.uk/code/libvterm/).
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+// VT220/xterm-like terminal emulator.
+// Powered by libvterm http://www.leonerd.org.uk/code/libvterm
//
// libvterm is a pure C99 terminal emulation library with abstract input and
// display. This means that the library needs to read data from the master fd
// and feed VTerm instances, which will invoke user callbacks with screen
// update instructions that must be mirrored to the real display.
//
-// Keys are pressed in VTerm instances by calling
+// Keys are sent to VTerm instances by calling
// vterm_keyboard_key/vterm_keyboard_unichar, which generates byte streams that
// must be fed back to the master fd.
//
-// This implementation uses nvim buffers as the display mechanism for both
-// the visible screen and the scrollback buffer. When focused, the window
-// "pins" to the bottom of the buffer and mirrors libvterm screen state.
+// Nvim buffers are used as the display mechanism for both the visible screen
+// and the scrollback buffer.
//
// When a line becomes invisible due to a decrease in screen height or because
// a line was pushed up during normal terminal output, we store the line
@@ -23,18 +25,17 @@
// scrollback buffer, which is mirrored in the nvim buffer displaying lines
// that were previously invisible.
//
-// The vterm->nvim synchronization is performed in intervals of 10
-// milliseconds. This is done to minimize screen updates when receiving large
-// bursts of data.
+// The vterm->nvim synchronization is performed in intervals of 10 milliseconds,
+// to minimize screen updates when receiving large bursts of data.
//
// This module is decoupled from the processes that normally feed it data, so
// it's possible to use it as a general purpose console buffer (possibly as a
// log/display mechanism for nvim in the future)
//
-// Inspired by vimshell (http://www.wana.at/vimshell/) and
-// Conque (https://code.google.com/p/conque/). Libvterm usage instructions (plus
-// some extra code) were taken from
-// pangoterm (http://www.leonerd.org.uk/code/pangoterm/)
+// Inspired by: vimshell http://www.wana.at/vimshell
+// Conque https://code.google.com/p/conque
+// Some code from pangoterm http://www.leonerd.org.uk/code/pangoterm
+
#include <assert.h>
#include <stdio.h>
#include <stdint.h>
@@ -42,11 +43,13 @@
#include <vterm.h>
+#include "nvim/log.h"
#include "nvim/vim.h"
#include "nvim/terminal.h"
#include "nvim/message.h"
#include "nvim/memory.h"
#include "nvim/option.h"
+#include "nvim/highlight.h"
#include "nvim/macros.h"
#include "nvim/mbyte.h"
#include "nvim/buffer.h"
@@ -59,7 +62,6 @@
#include "nvim/edit.h"
#include "nvim/mouse.h"
#include "nvim/memline.h"
-#include "nvim/mark.h"
#include "nvim/map.h"
#include "nvim/misc1.h"
#include "nvim/move.h"
@@ -80,17 +82,15 @@ typedef struct terminal_state {
Terminal *term;
int save_rd; // saved value of RedrawingDisabled
bool close;
- bool got_bs; // if the last input was <C-\>
+ bool got_bsl; // if the last input was <C-\>
} TerminalState;
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "terminal.c.generated.h"
#endif
-#define SCROLLBACK_BUFFER_DEFAULT_SIZE 1000
// Delay for refreshing the terminal buffer after receiving updates from
-// libvterm. This is greatly improves performance when receiving large bursts
-// of data.
+// libvterm. Improves performance when receiving large bursts of data.
#define REFRESH_DELAY 10
static TimeWatcher refresh_timer;
@@ -102,48 +102,42 @@ typedef struct {
} ScrollbackLine;
struct terminal {
- // options passed to terminal_open
- TerminalOptions opts;
- // libvterm structures
+ TerminalOptions opts; // options passed to terminal_open
VTerm *vt;
VTermScreen *vts;
// buffer used to:
// - convert VTermScreen cell arrays into utf8 strings
// - receive data from libvterm as a result of key presses.
char textbuf[0x1fff];
- // Scrollback buffer storage for libvterm.
- // TODO(tarruda): Use a doubly-linked list
- ScrollbackLine **sb_buffer;
- // number of rows pushed to sb_buffer
- size_t sb_current;
- // sb_buffer size;
- size_t sb_size;
+
+ ScrollbackLine **sb_buffer; // Scrollback buffer storage for libvterm
+ size_t sb_current; // number of rows pushed to sb_buffer
+ size_t sb_size; // sb_buffer size
// "virtual index" that points to the first sb_buffer row that we need to
// push to the terminal buffer when refreshing the scrollback. When negative,
// it actually points to entries that are no longer in sb_buffer (because the
// window height has increased) and must be deleted from the terminal buffer
int sb_pending;
+
// buf_T instance that acts as a "drawing surface" for libvterm
// we can't store a direct reference to the buffer because the
// refresh_timer_cb may be called after the buffer was freed, and there's
// no way to know if the memory was reused.
- uint64_t buf_handle;
+ handle_T buf_handle;
// program exited
bool closed, destroy;
+
// some vterm properties
bool forward_mouse;
- // invalid rows libvterm screen
- int invalid_start, invalid_end;
+ int invalid_start, invalid_end; // invalid rows in libvterm screen
struct {
int row, col;
bool visible;
} cursor;
- // which mouse button is pressed
- int pressed_button;
- // pending width/height
- bool pending_resize;
- // With a reference count of 0 the terminal can be freed.
- size_t refcount;
+ int pressed_button; // which mouse button is pressed
+ bool pending_resize; // pending width/height
+
+ size_t refcount; // reference count
};
static VTermScreenCallbacks vterm_screen_callbacks = {
@@ -166,7 +160,7 @@ void terminal_init(void)
invalidated_terminals = pmap_new(ptr_t)();
time_watcher_init(&main_loop, &refresh_timer, NULL);
// refresh_timer_cb will redraw the screen which can call vimscript
- refresh_timer.events = queue_new_child(main_loop.events);
+ refresh_timer.events = multiqueue_new_child(main_loop.events);
// initialize a rgb->color index map for cterm attributes(VTermScreenCell
// only has RGB information and we need color indexes for terminal UIs)
@@ -174,7 +168,7 @@ void terminal_init(void)
VTerm *vt = vterm_new(24, 80);
VTermState *state = vterm_obtain_state(vt);
- for (int color_index = 0; color_index < 256; color_index++) {
+ for (int color_index = 255; color_index >= 0; color_index--) {
VTermColor color;
// Some of the default 16 colors has the same color as the later
// 240 colors. To avoid collisions, we will use the custom colors
@@ -187,13 +181,14 @@ void terminal_init(void)
vterm_state_get_palette_color(state, color_index, &color);
}
map_put(int, int)(color_indexes,
- RGB(color.red, color.green, color.blue), color_index + 1);
+ RGB_(color.red, color.green, color.blue),
+ color_index + 1);
}
VTermColor fg, bg;
vterm_state_get_default_colors(state, &fg, &bg);
- default_vt_fg = RGB(fg.red, fg.green, fg.blue);
- default_vt_bg = RGB(bg.red, bg.green, bg.blue);
+ default_vt_fg = RGB_(fg.red, fg.green, fg.blue);
+ default_vt_bg = RGB_(bg.red, bg.green, bg.blue);
default_vt_bg_rgb = bg;
vterm_free(vt);
}
@@ -201,7 +196,7 @@ void terminal_init(void)
void terminal_teardown(void)
{
time_watcher_stop(&refresh_timer);
- queue_free(refresh_timer.events);
+ multiqueue_free(refresh_timer.events);
time_watcher_close(&refresh_timer, NULL);
pmap_free(ptr_t)(invalidated_terminals);
map_free(int, int)(color_indexes);
@@ -236,25 +231,26 @@ Terminal *terminal_open(TerminalOptions opts)
rv->invalid_start = 0;
rv->invalid_end = opts.height;
refresh_screen(rv, curbuf);
- set_option_value((uint8_t *)"buftype", 0, (uint8_t *)"terminal", OPT_LOCAL);
- // some sane settings for terminal buffers
- set_option_value((uint8_t *)"wrap", false, NULL, OPT_LOCAL);
- set_option_value((uint8_t *)"number", false, NULL, OPT_LOCAL);
- set_option_value((uint8_t *)"relativenumber", false, NULL, OPT_LOCAL);
+ set_option_value("buftype", 0, "terminal", OPT_LOCAL); // -V666
+
+ // Default settings for terminal buffers
+ curbuf->b_p_ma = false; // 'nomodifiable'
+ curbuf->b_p_ul = -1; // 'undolevels'
+ curbuf->b_p_scbk = p_scbk; // 'scrollback'
+ curbuf->b_p_tw = 0; // 'textwidth'
+ set_option_value("wrap", false, NULL, OPT_LOCAL);
+ set_option_value("list", false, NULL, OPT_LOCAL);
+ buf_set_term_title(curbuf, (char *)curbuf->b_ffname);
RESET_BINDING(curwin);
- // Apply TermOpen autocmds so the user can configure the terminal
+ // Reset cursor in current window.
+ curwin->w_cursor = (pos_T){ .lnum = 1, .col = 0, .coladd = 0 };
+
+ // Apply TermOpen autocmds _before_ configuring the scrollback buffer.
apply_autocmds(EVENT_TERMOPEN, NULL, NULL, false, curbuf);
- // Configure the scrollback buffer. Try to get the size from:
- //
- // - b:terminal_scrollback_buffer_size
- // - g:terminal_scrollback_buffer_size
- // - SCROLLBACK_BUFFER_DEFAULT_SIZE
- //
- // but limit to 100k.
- int size = get_config_int("terminal_scrollback_buffer_size");
- rv->sb_size = size > 0 ? (size_t)size : SCROLLBACK_BUFFER_DEFAULT_SIZE;
- rv->sb_size = MIN(rv->sb_size, 100000);
+ // Configure the scrollback buffer.
+ rv->sb_size = curbuf->b_p_scbk < 0
+ ? SB_MAX : (size_t)MAX(1, curbuf->b_p_scbk);
rv->sb_buffer = xmalloc(sizeof(ScrollbackLine *) * rv->sb_size);
if (!true_color) {
@@ -306,8 +302,16 @@ void terminal_close(Terminal *term, char *msg)
}
term->forward_mouse = false;
- term->closed = true;
+
+ // flush any pending changes to the buffer
+ if (!exiting) {
+ block_autocmds();
+ refresh_terminal(term);
+ unblock_autocmds();
+ }
+
buf_T *buf = handle_get_buffer(term->buf_handle);
+ term->closed = true;
if (!msg || exiting) {
// If no msg was given, this was called by close_buffer(buffer.c). Or if
@@ -333,22 +337,22 @@ void terminal_close(Terminal *term, char *msg)
void terminal_resize(Terminal *term, uint16_t width, uint16_t height)
{
if (term->closed) {
- // will be called after exited if two windows display the same terminal and
- // one of the is closed as a consequence of pressing a key.
+ // If two windows display the same terminal and one is closed by keypress.
return;
}
+ bool force = width == UINT16_MAX || height == UINT16_MAX;
int curwidth, curheight;
vterm_get_size(term->vt, &curheight, &curwidth);
- if (!width) {
+ if (force || !width) {
width = (uint16_t)curwidth;
}
- if (!height) {
+ if (force || !height) {
height = (uint16_t)curheight;
}
- if (curheight == height && curwidth == width) {
+ if (!force && curheight == height && curwidth == width) {
return;
}
@@ -356,6 +360,15 @@ void terminal_resize(Terminal *term, uint16_t width, uint16_t height)
return;
}
+ FOR_ALL_TAB_WINDOWS(tp, wp) {
+ if (wp->w_buffer && wp->w_buffer->terminal == term) {
+ const uint16_t win_width =
+ (uint16_t)(MAX(0, wp->w_width - win_col_off(wp)));
+ width = MAX(width, win_width);
+ height = (uint16_t)MAX(height, wp->w_height);
+ }
+ }
+
vterm_set_size(term->vt, height, width);
vterm_screen_flush_damage(term->vts);
term->pending_resize = true;
@@ -365,26 +378,33 @@ void terminal_resize(Terminal *term, uint16_t width, uint16_t height)
void terminal_enter(void)
{
buf_T *buf = curbuf;
+ assert(buf->terminal); // Should only be called when curbuf has a terminal.
TerminalState state, *s = &state;
memset(s, 0, sizeof(TerminalState));
s->term = buf->terminal;
- assert(s->term && "should only be called when curbuf has a terminal");
// Ensure the terminal is properly sized.
terminal_resize(s->term, 0, 0);
- checkpcmark();
- setpcmark();
int save_state = State;
s->save_rd = RedrawingDisabled;
State = TERM_FOCUS;
mapped_ctrl_c |= TERM_FOCUS; // Always map CTRL-C to avoid interrupt.
RedrawingDisabled = false;
- // go to the bottom when the terminal is focused
- adjust_topline(s->term, buf, false);
+
+ // Disable these options in terminal-mode. They are nonsense because cursor is
+ // placed at end of buffer to "follow" output.
+ win_T *save_curwin = curwin;
+ int save_w_p_cul = curwin->w_p_cul;
+ int save_w_p_cuc = curwin->w_p_cuc;
+ curwin->w_p_cul = false;
+ curwin->w_p_cuc = false;
+
+ adjust_topline(s->term, buf, 0); // scroll to end
// erase the unfocused cursor
invalidate_terminal(s->term, s->term->cursor.row, s->term->cursor.row + 1);
showmode();
+ curwin->w_redr_status = true; // For mode() in statusline. #8323
ui_busy_start();
redraw(false);
@@ -394,6 +414,11 @@ void terminal_enter(void)
restart_edit = 0;
State = save_state;
RedrawingDisabled = s->save_rd;
+ if (save_curwin == curwin) { // save_curwin may be invalid (window closed)!
+ curwin->w_p_cul = save_w_p_cul;
+ curwin->w_p_cuc = save_w_p_cuc;
+ }
+
// draw the unfocused cursor
invalidate_terminal(s->term, s->term->cursor.row, s->term->cursor.row + 1);
unshowmode(true);
@@ -413,14 +438,6 @@ static int terminal_execute(VimState *state, int key)
TerminalState *s = (TerminalState *)state;
switch (key) {
- case K_FOCUSGAINED: // nvim has been given focus
- apply_autocmds(EVENT_FOCUSGAINED, NULL, NULL, false, curbuf);
- break;
-
- case K_FOCUSLOST: // nvim has lost focus
- apply_autocmds(EVENT_FOCUSLOST, NULL, NULL, false, curbuf);
- break;
-
// Temporary fix until paste events gets implemented
case K_PASTE:
break;
@@ -444,7 +461,7 @@ static int terminal_execute(VimState *state, int key)
case K_EVENT:
// We cannot let an event free the terminal yet. It is still needed.
s->term->refcount++;
- queue_process_events(main_loop.events);
+ multiqueue_process_events(main_loop.events);
s->term->refcount--;
if (s->term->buf_handle == 0) {
s->close = true;
@@ -452,15 +469,19 @@ static int terminal_execute(VimState *state, int key)
}
break;
+ case K_COMMAND:
+ do_cmdline(NULL, getcmdkeycmd, NULL, 0);
+ break;
+
case Ctrl_N:
- if (s->got_bs) {
+ if (s->got_bsl) {
return 0;
}
- // FALLTHROUGH
+ FALLTHROUGH;
default:
- if (key == Ctrl_BSL && !s->got_bs) {
- s->got_bs = true;
+ if (key == Ctrl_BSL && !s->got_bsl) {
+ s->got_bsl = true;
break;
}
if (s->term->closed) {
@@ -468,7 +489,7 @@ static int terminal_execute(VimState *state, int key)
return 0;
}
- s->got_bs = false;
+ s->got_bsl = false;
terminal_send_key(s->term, key);
}
@@ -508,9 +529,36 @@ void terminal_send(Terminal *term, char *data, size_t size)
term->opts.write_cb(data, size, term->opts.data);
}
+void terminal_paste(long count, char_u **y_array, size_t y_size)
+{
+ for (int i = 0; i < count; i++) { // -V756
+ // feed the lines to the terminal
+ for (size_t j = 0; j < y_size; j++) {
+ if (j) {
+ // terminate the previous line
+ terminal_send(curbuf->terminal, "\n", 1);
+ }
+ terminal_send(curbuf->terminal, (char *)y_array[j], STRLEN(y_array[j]));
+ }
+ }
+}
+
+void terminal_flush_output(Terminal *term)
+{
+ size_t len = vterm_output_read(term->vt, term->textbuf,
+ sizeof(term->textbuf));
+ terminal_send(term, term->textbuf, len);
+}
+
void terminal_send_key(Terminal *term, int c)
{
VTermModifier mod = VTERM_MOD_NONE;
+
+ // Convert K_ZERO back to ASCII
+ if (c == K_ZERO) {
+ c = Ctrl_AT;
+ }
+
VTermKey key = convert_key(c, &mod);
if (key) {
@@ -519,9 +567,7 @@ void terminal_send_key(Terminal *term, int c)
vterm_keyboard_unichar(term->vt, (uint32_t)c, mod);
}
- size_t len = vterm_output_read(term->vt, term->textbuf,
- sizeof(term->textbuf));
- terminal_send(term, term->textbuf, (size_t)len);
+ terminal_flush_output(term);
}
void terminal_receive(Terminal *term, char *data, size_t len)
@@ -535,7 +581,7 @@ void terminal_receive(Terminal *term, char *data, size_t len)
}
void terminal_get_line_attributes(Terminal *term, win_T *wp, int linenr,
- int *term_attrs)
+ int *term_attrs)
{
int height, width;
vterm_get_size(term->vt, &height, &width);
@@ -551,8 +597,8 @@ void terminal_get_line_attributes(Terminal *term, win_T *wp, int linenr,
VTermScreenCell cell;
fetch_cell(term, row, col, &cell);
// Get the rgb value set by libvterm.
- int vt_fg = RGB(cell.fg.red, cell.fg.green, cell.fg.blue);
- int vt_bg = RGB(cell.bg.red, cell.bg.green, cell.bg.blue);
+ int vt_fg = RGB_(cell.fg.red, cell.fg.green, cell.fg.blue);
+ int vt_bg = RGB_(cell.bg.red, cell.bg.green, cell.bg.blue);
vt_fg = vt_fg != default_vt_fg ? vt_fg : - 1;
vt_bg = vt_bg != default_vt_bg ? vt_bg : - 1;
// Since libvterm does not expose the color index used by the program, we
@@ -571,26 +617,34 @@ void terminal_get_line_attributes(Terminal *term, win_T *wp, int linenr,
int attr_id = 0;
if (hl_attrs || vt_fg != -1 || vt_bg != -1) {
- attr_id = get_attr_entry(&(attrentry_T) {
+ attr_id = hl_get_term_attr(&(HlAttrs) {
.cterm_ae_attr = (int16_t)hl_attrs,
.cterm_fg_color = vt_fg_idx,
.cterm_bg_color = vt_bg_idx,
.rgb_ae_attr = (int16_t)hl_attrs,
.rgb_fg_color = vt_fg,
.rgb_bg_color = vt_bg,
+ .rgb_sp_color = -1,
});
}
if (term->cursor.visible && term->cursor.row == row
&& term->cursor.col == col) {
- attr_id = hl_combine_attr(attr_id, is_focused(term) && wp == curwin ?
- hl_attr(HLF_TERM) : hl_attr(HLF_TERMNC));
+ attr_id = hl_combine_attr(attr_id,
+ is_focused(term) && wp == curwin
+ ? win_hl_attr(wp, HLF_TERM)
+ : win_hl_attr(wp, HLF_TERMNC));
}
term_attrs[col] = attr_id;
}
}
+Buffer terminal_buf(const Terminal *term)
+{
+ return term->buf_handle;
+}
+
// }}}
// libvterm callbacks {{{
@@ -618,6 +672,20 @@ static int term_movecursor(VTermPos new, VTermPos old, int visible,
return 1;
}
+static void buf_set_term_title(buf_T *buf, char *title)
+ FUNC_ATTR_NONNULL_ALL
+{
+ Error err = ERROR_INIT;
+ dict_set_var(buf->b_vars,
+ STATIC_CSTR_AS_STRING("term_title"),
+ STRING_OBJ(cstr_as_string(title)),
+ false,
+ false,
+ &err);
+ api_clear_error(&err);
+ status_redraw_buf(buf);
+}
+
static int term_settermprop(VTermProp prop, VTermValue *val, void *data)
{
Terminal *term = data;
@@ -633,12 +701,7 @@ static int term_settermprop(VTermProp prop, VTermValue *val, void *data)
case VTERM_PROP_TITLE: {
buf_T *buf = handle_get_buffer(term->buf_handle);
- Error err;
- api_free_object(dict_set_value(buf->b_vars,
- cstr_as_string("term_title"),
- STRING_OBJ(cstr_as_string(val->string)),
- false,
- &err));
+ buf_set_term_title(buf, val->string);
break;
}
@@ -655,14 +718,19 @@ static int term_settermprop(VTermProp prop, VTermValue *val, void *data)
static int term_bell(void *data)
{
- ui_putc('\x07');
+ ui_call_bell();
return 1;
}
-// the scrollback push/pop handlers were copied almost verbatim from pangoterm
+// Scrollback push handler (from pangoterm).
static int term_sb_push(int cols, const VTermScreenCell *cells, void *data)
{
Terminal *term = data;
+
+ if (!term->sb_size) {
+ return 0;
+ }
+
// copy vterm cells into sb_buffer
size_t c = (size_t)cols;
ScrollbackLine *sbrow = NULL;
@@ -674,10 +742,12 @@ static int term_sb_push(int cols, const VTermScreenCell *cells, void *data)
xfree(term->sb_buffer[term->sb_current - 1]);
}
+ // Make room at the start by shifting to the right.
memmove(term->sb_buffer + 1, term->sb_buffer,
sizeof(term->sb_buffer[0]) * (term->sb_current - 1));
} else if (term->sb_current > 0) {
+ // Make room at the start by shifting to the right.
memmove(term->sb_buffer + 1, term->sb_buffer,
sizeof(term->sb_buffer[0]) * term->sb_current);
}
@@ -687,6 +757,7 @@ static int term_sb_push(int cols, const VTermScreenCell *cells, void *data)
sbrow->cols = c;
}
+ // New row is added at the start of the storage buffer.
term->sb_buffer[0] = sbrow;
if (term->sb_current < term->sb_size) {
term->sb_current++;
@@ -702,6 +773,11 @@ static int term_sb_push(int cols, const VTermScreenCell *cells, void *data)
return 1;
}
+/// Scrollback pop handler (from pangoterm).
+///
+/// @param cols
+/// @param cells VTerm state to update.
+/// @param data Terminal
static int term_sb_pop(int cols, VTermScreenCell *cells, void *data)
{
Terminal *term = data;
@@ -714,24 +790,24 @@ static int term_sb_pop(int cols, VTermScreenCell *cells, void *data)
term->sb_pending--;
}
- // restore vterm state
- size_t c = (size_t)cols;
ScrollbackLine *sbrow = term->sb_buffer[0];
term->sb_current--;
+ // Forget the "popped" row by shifting the rest onto it.
memmove(term->sb_buffer, term->sb_buffer + 1,
sizeof(term->sb_buffer[0]) * (term->sb_current));
- size_t cols_to_copy = c;
+ size_t cols_to_copy = (size_t)cols;
if (cols_to_copy > sbrow->cols) {
cols_to_copy = sbrow->cols;
}
// copy to vterm state
memcpy(cells, sbrow->cells, sizeof(cells[0]) * cols_to_copy);
- for (size_t col = cols_to_copy; col < c; col++) {
+ for (size_t col = cols_to_copy; col < (size_t)cols; col++) {
cells[col].chars[0] = 0;
cells[col].width = 1;
}
+
xfree(sbrow);
pmap_put(ptr_t)(invalidated_terminals, term, NULL);
@@ -741,26 +817,60 @@ static int term_sb_pop(int cols, VTermScreenCell *cells, void *data)
// }}}
// input handling {{{
-static void convert_modifiers(VTermModifier *statep)
+static void convert_modifiers(int key, VTermModifier *statep)
{
if (mod_mask & MOD_MASK_SHIFT) { *statep |= VTERM_MOD_SHIFT; }
if (mod_mask & MOD_MASK_CTRL) { *statep |= VTERM_MOD_CTRL; }
if (mod_mask & MOD_MASK_ALT) { *statep |= VTERM_MOD_ALT; }
+
+ switch (key) {
+ case K_S_TAB:
+ case K_S_UP:
+ case K_S_DOWN:
+ case K_S_LEFT:
+ case K_S_RIGHT:
+ case K_S_F1:
+ case K_S_F2:
+ case K_S_F3:
+ case K_S_F4:
+ case K_S_F5:
+ case K_S_F6:
+ case K_S_F7:
+ case K_S_F8:
+ case K_S_F9:
+ case K_S_F10:
+ case K_S_F11:
+ case K_S_F12:
+ *statep |= VTERM_MOD_SHIFT;
+ break;
+
+ case K_C_LEFT:
+ case K_C_RIGHT:
+ *statep |= VTERM_MOD_CTRL;
+ break;
+ }
}
static VTermKey convert_key(int key, VTermModifier *statep)
{
- convert_modifiers(statep);
+ convert_modifiers(key, statep);
switch (key) {
case K_BS: return VTERM_KEY_BACKSPACE;
+ case K_S_TAB: FALLTHROUGH;
case TAB: return VTERM_KEY_TAB;
case Ctrl_M: return VTERM_KEY_ENTER;
case ESC: return VTERM_KEY_ESCAPE;
+ case K_S_UP: FALLTHROUGH;
case K_UP: return VTERM_KEY_UP;
+ case K_S_DOWN: FALLTHROUGH;
case K_DOWN: return VTERM_KEY_DOWN;
+ case K_S_LEFT: FALLTHROUGH;
+ case K_C_LEFT: FALLTHROUGH;
case K_LEFT: return VTERM_KEY_LEFT;
+ case K_S_RIGHT: FALLTHROUGH;
+ case K_C_RIGHT: FALLTHROUGH;
case K_RIGHT: return VTERM_KEY_RIGHT;
case K_INS: return VTERM_KEY_INS;
@@ -770,22 +880,22 @@ static VTermKey convert_key(int key, VTermModifier *statep)
case K_PAGEUP: return VTERM_KEY_PAGEUP;
case K_PAGEDOWN: return VTERM_KEY_PAGEDOWN;
- case K_K0:
+ case K_K0: FALLTHROUGH;
case K_KINS: return VTERM_KEY_KP_0;
- case K_K1:
+ case K_K1: FALLTHROUGH;
case K_KEND: return VTERM_KEY_KP_1;
case K_K2: return VTERM_KEY_KP_2;
- case K_K3:
+ case K_K3: FALLTHROUGH;
case K_KPAGEDOWN: return VTERM_KEY_KP_3;
case K_K4: return VTERM_KEY_KP_4;
case K_K5: return VTERM_KEY_KP_5;
case K_K6: return VTERM_KEY_KP_6;
- case K_K7:
+ case K_K7: FALLTHROUGH;
case K_KHOME: return VTERM_KEY_KP_7;
case K_K8: return VTERM_KEY_KP_8;
- case K_K9:
+ case K_K9: FALLTHROUGH;
case K_KPAGEUP: return VTERM_KEY_KP_9;
- case K_KDEL:
+ case K_KDEL: FALLTHROUGH;
case K_KPOINT: return VTERM_KEY_KP_PERIOD;
case K_KENTER: return VTERM_KEY_KP_ENTER;
case K_KPLUS: return VTERM_KEY_KP_PLUS;
@@ -793,6 +903,57 @@ static VTermKey convert_key(int key, VTermModifier *statep)
case K_KMULTIPLY: return VTERM_KEY_KP_MULT;
case K_KDIVIDE: return VTERM_KEY_KP_DIVIDE;
+ case K_S_F1: FALLTHROUGH;
+ case K_F1: return VTERM_KEY_FUNCTION(1);
+ case K_S_F2: FALLTHROUGH;
+ case K_F2: return VTERM_KEY_FUNCTION(2);
+ case K_S_F3: FALLTHROUGH;
+ case K_F3: return VTERM_KEY_FUNCTION(3);
+ case K_S_F4: FALLTHROUGH;
+ case K_F4: return VTERM_KEY_FUNCTION(4);
+ case K_S_F5: FALLTHROUGH;
+ case K_F5: return VTERM_KEY_FUNCTION(5);
+ case K_S_F6: FALLTHROUGH;
+ case K_F6: return VTERM_KEY_FUNCTION(6);
+ case K_S_F7: FALLTHROUGH;
+ case K_F7: return VTERM_KEY_FUNCTION(7);
+ case K_S_F8: FALLTHROUGH;
+ case K_F8: return VTERM_KEY_FUNCTION(8);
+ case K_S_F9: FALLTHROUGH;
+ case K_F9: return VTERM_KEY_FUNCTION(9);
+ case K_S_F10: FALLTHROUGH;
+ case K_F10: return VTERM_KEY_FUNCTION(10);
+ case K_S_F11: FALLTHROUGH;
+ case K_F11: return VTERM_KEY_FUNCTION(11);
+ case K_S_F12: FALLTHROUGH;
+ case K_F12: return VTERM_KEY_FUNCTION(12);
+
+ case K_F13: return VTERM_KEY_FUNCTION(13);
+ case K_F14: return VTERM_KEY_FUNCTION(14);
+ case K_F15: return VTERM_KEY_FUNCTION(15);
+ case K_F16: return VTERM_KEY_FUNCTION(16);
+ case K_F17: return VTERM_KEY_FUNCTION(17);
+ case K_F18: return VTERM_KEY_FUNCTION(18);
+ case K_F19: return VTERM_KEY_FUNCTION(19);
+ case K_F20: return VTERM_KEY_FUNCTION(20);
+ case K_F21: return VTERM_KEY_FUNCTION(21);
+ case K_F22: return VTERM_KEY_FUNCTION(22);
+ case K_F23: return VTERM_KEY_FUNCTION(23);
+ case K_F24: return VTERM_KEY_FUNCTION(24);
+ case K_F25: return VTERM_KEY_FUNCTION(25);
+ case K_F26: return VTERM_KEY_FUNCTION(26);
+ case K_F27: return VTERM_KEY_FUNCTION(27);
+ case K_F28: return VTERM_KEY_FUNCTION(28);
+ case K_F29: return VTERM_KEY_FUNCTION(29);
+ case K_F30: return VTERM_KEY_FUNCTION(30);
+ case K_F31: return VTERM_KEY_FUNCTION(31);
+ case K_F32: return VTERM_KEY_FUNCTION(32);
+ case K_F33: return VTERM_KEY_FUNCTION(33);
+ case K_F34: return VTERM_KEY_FUNCTION(34);
+ case K_F35: return VTERM_KEY_FUNCTION(35);
+ case K_F36: return VTERM_KEY_FUNCTION(36);
+ case K_F37: return VTERM_KEY_FUNCTION(37);
+
default: return VTERM_KEY_NONE;
}
}
@@ -830,11 +991,11 @@ static bool send_mouse_event(Terminal *term, int c)
bool drag = false;
switch (c) {
- case K_LEFTDRAG: drag = true; // FALLTHROUGH
+ case K_LEFTDRAG: drag = true; FALLTHROUGH;
case K_LEFTMOUSE: button = 1; break;
- case K_MIDDLEDRAG: drag = true; // FALLTHROUGH
+ case K_MIDDLEDRAG: drag = true; FALLTHROUGH;
case K_MIDDLEMOUSE: button = 2; break;
- case K_RIGHTDRAG: drag = true; // FALLTHROUGH
+ case K_RIGHTDRAG: drag = true; FALLTHROUGH;
case K_RIGHTMOUSE: button = 3; break;
case K_MOUSEDOWN: button = 4; break;
case K_MOUSEUP: button = 5; break;
@@ -843,7 +1004,7 @@ static bool send_mouse_event(Terminal *term, int c)
mouse_action(term, button, row, col, drag, 0);
size_t len = vterm_output_read(term->vt, term->textbuf,
- sizeof(term->textbuf));
+ sizeof(term->textbuf));
terminal_send(term, term->textbuf, (size_t)len);
return false;
}
@@ -877,7 +1038,7 @@ static bool send_mouse_event(Terminal *term, int c)
// terminal buffer refresh & misc {{{
-void fetch_row(Terminal *term, int row, int end_col)
+static void fetch_row(Terminal *term, int row, int end_col)
{
int col = 0;
size_t line_len = 0;
@@ -947,33 +1108,34 @@ static void invalidate_terminal(Terminal *term, int start_row, int end_row)
static void refresh_terminal(Terminal *term)
{
- // TODO(SplinterOfChaos): Find the condition that makes term->buf invalid.
buf_T *buf = handle_get_buffer(term->buf_handle);
bool valid = true;
if (!buf || !(valid = buf_valid(buf))) {
- // destroyed by `close_buffer`. Dont do anything else
+ // Destroyed by `close_buffer`. Do not do anything else.
if (!valid) {
term->buf_handle = 0;
}
return;
}
- bool pending_resize = term->pending_resize;
+ long ml_before = buf->b_ml.ml_line_count;
WITH_BUFFER(buf, {
refresh_size(term, buf);
refresh_scrollback(term, buf);
refresh_screen(term, buf);
- redraw_buf_later(buf, NOT_VALID);
});
- adjust_topline(term, buf, pending_resize);
+ long ml_added = buf->b_ml.ml_line_count - ml_before;
+ adjust_topline(term, buf, ml_added);
}
-// libuv timer callback. This will enqueue on_refresh to be processed as an
-// event.
+// Calls refresh_terminal() on all invalidated_terminals.
static void refresh_timer_cb(TimeWatcher *watcher, void *data)
{
- if (exiting) {
- // bad things can happen if we redraw when exiting, and there's no need to
- // update the buffer.
- goto end;
+ refresh_pending = false;
+ if (exiting // Cannot redraw (requires event loop) during teardown/exit.
+ || (State & CMDPREVIEW)
+ // WM_LIST (^D) is not redrawn, unlike the normal wildmenu. So we must
+ // skip redraws to keep it visible.
+ || wild_menu_showing == WM_LIST) {
+ return;
}
Terminal *term;
void *stub; (void)(stub);
@@ -982,11 +1144,12 @@ static void refresh_timer_cb(TimeWatcher *watcher, void *data)
map_foreach(invalidated_terminals, term, stub, {
refresh_terminal(term);
});
+ bool any_visible = is_term_visible();
pmap_clear(ptr_t)(invalidated_terminals);
unblock_autocmds();
- redraw(true);
-end:
- refresh_pending = false;
+ if (any_visible) {
+ redraw(true);
+ }
}
static void refresh_size(Terminal *term, buf_T *buf)
@@ -1003,7 +1166,37 @@ static void refresh_size(Terminal *term, buf_T *buf)
term->opts.resize_cb((uint16_t)width, (uint16_t)height, term->opts.data);
}
-// Refresh the scrollback of a invalidated terminal
+/// Adjusts scrollback storage after 'scrollback' option changed.
+static void on_scrollback_option_changed(Terminal *term, buf_T *buf)
+{
+ const size_t scbk = curbuf->b_p_scbk < 0
+ ? SB_MAX : (size_t)MAX(1, curbuf->b_p_scbk);
+ assert(term->sb_current < SIZE_MAX);
+ if (term->sb_pending > 0) { // Pending rows must be processed first.
+ abort();
+ }
+
+ // Delete lines exceeding the new 'scrollback' limit.
+ if (scbk < term->sb_current) {
+ size_t diff = term->sb_current - scbk;
+ for (size_t i = 0; i < diff; i++) {
+ ml_delete(1, false);
+ term->sb_current--;
+ xfree(term->sb_buffer[term->sb_current]);
+ }
+ deleted_lines(1, (long)diff);
+ }
+
+ // Resize the scrollback storage.
+ size_t sb_region = sizeof(ScrollbackLine *) * scbk;
+ if (scbk != term->sb_size) {
+ term->sb_buffer = xrealloc(term->sb_buffer, sb_region);
+ }
+
+ term->sb_size = scbk;
+}
+
+// Refresh the scrollback of an invalidated terminal.
static void refresh_scrollback(Terminal *term, buf_T *buf)
{
int width, height;
@@ -1032,9 +1225,11 @@ static void refresh_scrollback(Terminal *term, buf_T *buf)
ml_delete(buf->b_ml.ml_line_count, false);
deleted_lines(buf->b_ml.ml_line_count, 1);
}
+
+ on_scrollback_option_changed(term, buf);
}
-// Refresh the screen(visible part of the buffer when the terminal is
+// Refresh the screen (visible part of the buffer when the terminal is
// focused) of a invalidated terminal
static void refresh_screen(Terminal *term, buf_T *buf)
{
@@ -1043,8 +1238,7 @@ static void refresh_screen(Terminal *term, buf_T *buf)
int height;
int width;
vterm_get_size(term->vt, &height, &width);
- // It's possible that the terminal height decreased and `term->invalid_end`
- // doesn't reflect it yet
+ // Terminal height may have decreased before `invalid_end` reflects it.
term->invalid_end = MIN(term->invalid_end, height);
for (int r = term->invalid_start, linenr = row_to_linenr(term, r);
@@ -1062,11 +1256,23 @@ static void refresh_screen(Terminal *term, buf_T *buf)
int change_start = row_to_linenr(term, term->invalid_start);
int change_end = change_start + changed;
- changed_lines(change_start, 0, change_end, added);
+ changed_lines(change_start, 0, change_end, added, true);
term->invalid_start = INT_MAX;
term->invalid_end = -1;
}
+/// @return true if any invalidated terminal buffer is visible to the user
+static bool is_term_visible(void)
+{
+ FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
+ if (wp->w_buffer->terminal
+ && pmap_has(ptr_t)(invalidated_terminals, wp->w_buffer->terminal)) {
+ return true;
+ }
+ }
+ return false;
+}
+
static void redraw(bool restore_cursor)
{
Terminal *term = curbuf->terminal;
@@ -1074,7 +1280,8 @@ static void redraw(bool restore_cursor)
restore_cursor = true;
}
- int save_row, save_col;
+ int save_row = 0;
+ int save_col = 0;
if (restore_cursor) {
// save the current row/col to restore after updating screen when not
// focused
@@ -1082,55 +1289,51 @@ static void redraw(bool restore_cursor)
save_col = ui_current_col();
}
block_autocmds();
- validate_cursor();
if (must_redraw) {
update_screen(0);
}
- redraw_statuslines();
-
- if (need_maketitle) {
+ if (need_maketitle) { // Update title in terminal-mode. #7248
maketitle();
}
- showruler(false);
-
- if (term && is_focused(term)) {
- curwin->w_wrow = term->cursor.row;
- curwin->w_wcol = term->cursor.col + win_col_off(curwin);
- setcursor();
- } else if (restore_cursor) {
+ if (restore_cursor) {
ui_cursor_goto(save_row, save_col);
} else if (term) {
- // exiting terminal focus, put the window cursor in a valid position
- int height, width;
- vterm_get_size(term->vt, &height, &width);
- curwin->w_wrow = height - 1;
- curwin->w_wcol = 0;
- setcursor();
+ curwin->w_wrow = term->cursor.row;
+ curwin->w_wcol = term->cursor.col + win_col_off(curwin);
+ curwin->w_cursor.lnum = MIN(curbuf->b_ml.ml_line_count,
+ row_to_linenr(term, term->cursor.row));
+ // Nudge cursor when returning to normal-mode.
+ int off = is_focused(term) ? 0 : (curwin->w_p_rl ? 1 : -1);
+ curwin->w_cursor.col = MAX(0, term->cursor.col + win_col_off(curwin) + off);
+ curwin->w_cursor.coladd = 0;
+ mb_check_adjust_col(curwin);
}
unblock_autocmds();
ui_flush();
}
-static void adjust_topline(Terminal *term, buf_T *buf, bool force)
+static void adjust_topline(Terminal *term, buf_T *buf, long added)
{
int height, width;
vterm_get_size(term->vt, &height, &width);
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
if (wp->w_buffer == buf) {
- // for every window that displays a terminal, ensure the cursor is in a
- // valid line
- wp->w_cursor.lnum = MIN(wp->w_cursor.lnum, buf->b_ml.ml_line_count);
- if (force || curbuf != buf || is_focused(term)) {
- // if the terminal is not in the current window or if it's focused,
- // adjust topline/cursor so the window will "follow" the terminal
- // output
- wp->w_cursor.lnum = buf->b_ml.ml_line_count;
+ linenr_T ml_end = buf->b_ml.ml_line_count;
+ bool following = ml_end == wp->w_cursor.lnum + added; // cursor at end?
+
+ if (following || (wp == curwin && is_focused(term))) {
+ // "Follow" the terminal output
+ wp->w_cursor.lnum = ml_end;
set_topline(wp, MAX(wp->w_cursor.lnum - height + 1, 1));
+ } else {
+ // Ensure valid cursor for each window displaying this terminal.
+ wp->w_cursor.lnum = MIN(wp->w_cursor.lnum, ml_end);
}
+ mb_check_adjust_col(wp);
}
}
}
@@ -1152,12 +1355,14 @@ static bool is_focused(Terminal *term)
#define GET_CONFIG_VALUE(k, o) \
do { \
- Error err; \
+ Error err = ERROR_INIT; \
/* Only called from terminal_open where curbuf->terminal is the */ \
/* context */ \
o = dict_get_value(curbuf->b_vars, cstr_as_string(k), &err); \
+ api_clear_error(&err); \
if (o.type == kObjectTypeNil) { \
o = dict_get_value(&globvardict, cstr_as_string(k), &err); \
+ api_clear_error(&err); \
} \
} while (0)
@@ -1172,17 +1377,6 @@ static char *get_config_string(char *key)
return NULL;
}
-static int get_config_int(char *key)
-{
- Object obj;
- GET_CONFIG_VALUE(key, obj);
- if (obj.type == kObjectTypeInteger) {
- return (int)obj.data.integer;
- }
- api_free_object(obj);
- return 0;
-}
-
// }}}
// vim: foldmethod=marker
diff --git a/src/nvim/terminal.h b/src/nvim/terminal.h
index 25e609fb68..f2b0e232c3 100644
--- a/src/nvim/terminal.h
+++ b/src/nvim/terminal.h
@@ -10,6 +10,8 @@ typedef void (*terminal_write_cb)(char *buffer, size_t size, void *data);
typedef void (*terminal_resize_cb)(uint16_t width, uint16_t height, void *data);
typedef void (*terminal_close_cb)(void *data);
+#include "nvim/buffer_defs.h"
+
typedef struct {
void *data;
uint16_t width, height;
diff --git a/src/nvim/testdir/Makefile b/src/nvim/testdir/Makefile
index 4b0b5e8d26..fac27aa346 100644
--- a/src/nvim/testdir/Makefile
+++ b/src/nvim/testdir/Makefile
@@ -1,48 +1,54 @@
-#
+# vim: noet ts=8
# Makefile to run all tests for Vim
#
+ifeq ($(OS),Windows_NT)
+ NVIM_PRG ?= ../../../build/bin/nvim.exe
+else
+ NVIM_PRG ?= ../../../build/bin/nvim
+endif
+ROOT := ../../..
+
export SHELL := sh
+export NVIM_PRG := $(NVIM_PRG)
+export TMPDIR := $(abspath ../../../Xtest-tmpdir)
+
+SCRIPTS_DEFAULT = \
+ test14.out \
+ test37.out \
+ test42.out \
+ test48.out \
+ test52.out \
+ test64.out \
+
+ifneq ($(OS),Windows_NT)
+ SCRIPTS_DEFAULTS := $(SCRIPTS_DEFAULT) \
+ test17.out \
+ test49.out \
+
+endif
-VIMPROG := ../../../build/bin/nvim
-SCRIPTSOURCE := ../../../runtime
-
-SCRIPTS := \
- test8.out \
- test12.out \
- test13.out \
- test14.out \
- test17.out \
- test24.out \
- test30.out \
- test32.out \
- test37.out \
- test40.out \
- test42.out \
- test47.out \
- test48.out \
- test49.out \
- test52.out \
- test53.out \
- test64.out \
- test69.out \
- test73.out \
- test79.out \
- test_marks.out \
-
-# Tests using runtest.vim.vim.
-# Keep test_alot*.res as the last one, sort the others.
-NEW_TESTS = \
- test_cursor_func.res \
- test_hardcopy.res \
- test_help_tagjump.res \
- test_langmap.res \
- test_menu.res \
- test_syntax.res \
- test_timers.res \
- test_unlet.res \
- test_viml.res \
- test_alot.res
+SCRIPTS ?= $(SCRIPTS_DEFAULT)
+
+# Tests using runtest.vim.
+NEW_TESTS_ALOT := test_alot_utf8 test_alot
+NEW_TESTS_IN_ALOT := $(shell sed '/^source/ s/^source //;s/\.vim$$//' test_alot*.vim)
+# Ignored tests.
+# test_alot_latin: Nvim does not allow setting encoding.
+# test_arglist: ported to Lua, but kept for easier merging.
+# test_autochdir: ported to Lua, but kept for easier merging.
+# test_eval_func: used as include in old-style test (test_eval.in).
+# test_listlbr: Nvim does not allow setting encoding.
+# test_largefile: uses too much resources to run on CI.
+NEW_TESTS_IGNORE := $(NEW_TESTS_IN_ALOT) $(NEW_TESTS_ALOT) \
+ test_alot_latin \
+ test_arglist \
+ test_autochdir \
+ test_eval_func \
+ test_listlbr \
+ test_largefile \
+
+NEW_TESTS ?= $(addsuffix .res,$(sort $(filter-out $(NEW_TESTS_IGNORE),$(basename $(notdir $(wildcard test_*.vim))))) $(NEW_TESTS_ALOT))
SCRIPTS_GUI := test16.out
@@ -62,7 +68,7 @@ ifdef USE_VALGRIND
$(VALGRIND_TOOL) \
--suppressions=../../.valgrind.supp \
--error-exitcode=123 \
- --log-file=valgrind.\%p.$* \
+ --log-file=valgrind-\%p.$* \
$(VGDB) \
--trace-children=yes
else
@@ -80,7 +86,8 @@ nongui: nolog $(SCRIPTS) newtests report
gui: nolog $(SCRIPTS) $(SCRIPTS_GUI) newtests report
.gdbinit:
- echo 'set $$_exitcode = -1\nrun\nif $$_exitcode != -1\n quit\nend' > .gdbinit
+ @echo "[OLDTEST-PREP] Setting up .gdbinit"
+ @echo 'set $$_exitcode = -1\nrun\nif $$_exitcode != -1\n quit\nend' > .gdbinit
report:
@echo
@@ -93,13 +100,13 @@ report:
echo ALL DONE; \
fi"
-test1.out: $(VIMPROG)
+test1.out: $(NVIM_PRG)
-$(SCRIPTS) $(SCRIPTS_GUI): $(VIMPROG) test1.out
+$(SCRIPTS) $(SCRIPTS_GUI): $(NVIM_PRG) test1.out
RM_ON_RUN := test.out X* viminfo
RM_ON_START := test.ok
-RUN_VIM := VIMRUNTIME=$(SCRIPTSOURCE); export VIMRUNTIME; $(TOOL) $(VIMPROG) -u unix.vim -U NONE -i viminfo --noplugin -s dotest.in
+RUN_VIM := $(TOOL) $(NVIM_PRG) -u unix.vim -U NONE -i viminfo --headless --noplugin -s dotest.in
clean:
-rm -rf *.out \
@@ -107,6 +114,7 @@ clean:
*.res \
*.rej \
*.orig \
+ *.tlog \
test.log \
messages \
$(RM_ON_RUN) \
@@ -114,60 +122,38 @@ clean:
valgrind.* \
.*.swp \
.*.swo \
+ .gdbinit \
+ $(TMPDIR) \
del
test1.out: .gdbinit test1.in
- -rm -rf $*.failed $(RM_ON_RUN) $(RM_ON_START) wrongtermsize
- $(RUN_VIM) $*.in
- @/bin/sh -c "if test -e wrongtermsize; then \
- echo; \
- echo test1 FAILED - terminal size must be 80x24 or larger; \
- echo; exit 1; \
- elif diff test.out $*.ok; then \
- mv -f test.out $*.out; \
- else \
- echo; \
- echo test1 FAILED - Something basic is wrong; \
- echo; \
- exit 1; \
- fi"
- -rm -rf X* viminfo
+ @echo "[OLDTEST-PREP] Running test1"
+ @rm -rf $*.failed $(RM_ON_RUN) $(RM_ON_START) wrongtermsize
+ @mkdir -p $(TMPDIR)
+ @/bin/sh runnvim.sh $(ROOT) $(NVIM_PRG) $* $(RUN_VIM) $*.in
+ @rm -f wrongtermsize
+ @rm -rf X* viminfo
%.out: %.in .gdbinit
- -rm -rf $*.failed test.ok $(RM_ON_RUN)
- cp $*.ok test.ok
- # Sleep a moment to avoid that the xterm title is messed up.
- # 200 msec is sufficient, but only modern sleep supports a fraction of
- # a second, fall back to a second if it fails.
- @-/bin/sh -c "sleep .2 > /dev/null 2>&1 || sleep 1"
- $(RUN_VIM) $*.in
-
- # Check if the test.out file matches test.ok.
- @/bin/sh -c "if test -f test.out; then \
- if diff -u test.out $*.ok; then \
- mv -f test.out $*.out; \
- else \
- echo $* FAILED >> test.log; \
- mv -f test.out $*.failed; \
- fi; \
- else \
- echo $* NO OUTPUT >>test.log; \
- fi"
- @/bin/sh -c "if test -f valgrind; then \
- mv -f valgrind valgrind.$*; \
- fi"
- -rm -rf X* test.ok viminfo
-
+ @echo "[OLDESTTEST] Running" $*
+ @rm -rf $*.failed test.ok $(RM_ON_RUN)
+ @mkdir -p $(TMPDIR)
+ @cp $*.ok test.ok
+ @/bin/sh runnvim.sh --oldesttest $(ROOT) $(NVIM_PRG) $* $(RUN_VIM) $*.in
+ @rm -rf X* test.ok viminfo
+
+# Explicit dependencies.
test49.out: test49.vim
nolog:
- -rm -f test.log messages
+ @echo "[OLDTEST-PREP] Removing test.log and messages"
+ @rm -f test.log messages
# New style of tests uses Vim script with assert calls. These are easier
# to write and a lot easier to read and debug.
# Limitation: Only works with the +eval feature.
-RUN_VIMTEST = VIMRUNTIME=$(SCRIPTSOURCE); export VIMRUNTIME; $(VALGRIND) $(VIMPROG) -u unix.vim -U NONE --noplugin
+RUN_VIMTEST = $(TOOL) $(NVIM_PRG) -u unix.vim -U NONE -i viminfo --headless --noplugin
newtests: newtestssilent
@/bin/sh -c "if test -f messages && grep -q 'FAILED' messages; then \
@@ -177,4 +163,6 @@ newtests: newtestssilent
newtestssilent: $(NEW_TESTS)
%.res: %.vim .gdbinit
- $(RUN_VIMTEST) -u NONE -S runtest.vim $*.vim
+ @echo "[OLDTEST] Running" $*
+ @mkdir -p $(TMPDIR)
+ @/bin/sh runnvim.sh $(ROOT) $(NVIM_PRG) $* $(RUN_VIMTEST) -u NONE -S runtest.vim $*.vim
diff --git a/src/nvim/testdir/pyxfile/py2_magic.py b/src/nvim/testdir/pyxfile/py2_magic.py
new file mode 100644
index 0000000000..819892fd16
--- /dev/null
+++ b/src/nvim/testdir/pyxfile/py2_magic.py
@@ -0,0 +1,4 @@
+# requires python 2.x
+
+import sys
+print(sys.version)
diff --git a/src/nvim/testdir/pyxfile/py2_shebang.py b/src/nvim/testdir/pyxfile/py2_shebang.py
new file mode 100644
index 0000000000..13bfc491ec
--- /dev/null
+++ b/src/nvim/testdir/pyxfile/py2_shebang.py
@@ -0,0 +1,4 @@
+#!/usr/bin/python2
+
+import sys
+print(sys.version)
diff --git a/src/nvim/testdir/pyxfile/py3_magic.py b/src/nvim/testdir/pyxfile/py3_magic.py
new file mode 100644
index 0000000000..d4b7ee0071
--- /dev/null
+++ b/src/nvim/testdir/pyxfile/py3_magic.py
@@ -0,0 +1,4 @@
+# requires python 3.x
+
+import sys
+print(sys.version)
diff --git a/src/nvim/testdir/pyxfile/py3_shebang.py b/src/nvim/testdir/pyxfile/py3_shebang.py
new file mode 100644
index 0000000000..ec05808ca4
--- /dev/null
+++ b/src/nvim/testdir/pyxfile/py3_shebang.py
@@ -0,0 +1,4 @@
+#!/usr/bin/python3
+
+import sys
+print(sys.version)
diff --git a/src/nvim/testdir/pyxfile/pyx.py b/src/nvim/testdir/pyxfile/pyx.py
new file mode 100644
index 0000000000..261a6512c0
--- /dev/null
+++ b/src/nvim/testdir/pyxfile/pyx.py
@@ -0,0 +1,2 @@
+import sys
+print(sys.version)
diff --git a/src/nvim/testdir/runnvim.sh b/src/nvim/testdir/runnvim.sh
new file mode 100755
index 0000000000..43556f3ad3
--- /dev/null
+++ b/src/nvim/testdir/runnvim.sh
@@ -0,0 +1,82 @@
+#!/bin/sh
+
+main() {(
+ local separator="================================================================================"
+ local oldesttest=
+ if test "$1" = "--oldesttest" ; then
+ shift
+ oldesttest=1
+ fi
+ local root="$1" ; shift
+ local nvim_prg="$1" ; shift
+ local test_name="$1" ; shift
+
+ local tlog="$test_name.tlog"
+
+ export NVIM_TEST_ARGC=$#
+ local arg
+ local i=0
+ for arg ; do
+ eval "export NVIM_TEST_ARG$i=\"\$arg\""
+ i=$(( i+1 ))
+ done
+
+ export CI_DIR="$root/ci"
+ export BUILD_DIR="$(dirname "$nvim_prg")/.."
+ export FAILED=0
+
+ . "$CI_DIR/common/suite.sh"
+ . "$CI_DIR/common/test.sh"
+
+ export VIMRUNTIME="$root/runtime"
+ if ! "$nvim_prg" \
+ -u NONE -i NONE \
+ --headless \
+ --cmd 'set shortmess+=I noswapfile noundofile nomore' \
+ -S runnvim.vim \
+ "$tlog" > "out-$tlog" 2> "err-$tlog"
+ then
+ fail "$test_name" F "Nvim exited with non-zero code"
+ fi
+ echo "Stdout of :terminal runner" >> "$tlog"
+ echo "$separator" >> "$tlog"
+ cat "out-$tlog" >> "$tlog"
+ echo "$separator" >> "$tlog"
+ echo "Stderr of :terminal runner" >> "$tlog"
+ echo "$separator" >> "$tlog"
+ cat "err-$tlog" >> "$tlog"
+ echo "$separator" >> "$tlog"
+ if test "$oldesttest" = 1 ; then
+ if ! diff -q test.out "$test_name.ok" > /dev/null 2>&1 ; then
+ if test -f test.out ; then
+ fail "$test_name" F "Oldest test .out file differs from .ok file"
+ echo "Diff between test.out and $test_name.ok" >> "$tlog"
+ echo "$separator" >> "$tlog"
+ diff -a test.out "$test_name.ok" >> "$tlog"
+ echo "$separator" >> "$tlog"
+ else
+ echo "No output in test.out" >> "$tlog"
+ fi
+ fi
+ fi
+ if test "$FAILED" = 1 ; then
+ travis_fold start "$NVIM_TEST_CURRENT_SUITE/$test_name"
+ fi
+ valgrind_check .
+ if test -n "$LOG_DIR" ; then
+ asan_check "$LOG_DIR"
+ fi
+ check_core_dumps
+ if test "$FAILED" = 1 ; then
+ cat "$tlog"
+ fi
+ rm -f "$tlog"
+ if test "$FAILED" = 1 ; then
+ travis_fold end "$NVIM_TEST_CURRENT_SUITE/$test_name"
+ fi
+ if test "$FAILED" = 1 ; then
+ echo "Test $test_name failed, see output above and summary for more details" >> test.log
+ fi
+)}
+
+main "$@"
diff --git a/src/nvim/testdir/runnvim.vim b/src/nvim/testdir/runnvim.vim
new file mode 100644
index 0000000000..396a3a6477
--- /dev/null
+++ b/src/nvim/testdir/runnvim.vim
@@ -0,0 +1,55 @@
+let s:logger = {'d_events': []}
+function s:logger.on_stdout(id, data, event)
+ call add(self.d_events, [a:event, a:data])
+endfunction
+let s:logger.on_stderr = s:logger.on_stdout
+function s:logger.on_exit(id, data, event)
+ call add(self.d_events, [a:event, ['']])
+endfunction
+
+function Main()
+ let argc = +$NVIM_TEST_ARGC
+ let args = []
+ for i in range(argc)
+ call add(args, eval("$NVIM_TEST_ARG" . i))
+ endfor
+ set lines=25
+ set columns=80
+ enew
+ let job = termopen(args, s:logger)
+ let results = jobwait([job], 5 * 60 * 1000)
+ " TODO(ZyX-I): Get colors
+ let screen = getline(1, '$')
+ bwipeout!
+ let stringified_events = map(s:logger.d_events,
+ \'v:val[0] . ": " . ' .
+ \'join(map(v:val[1], '.
+ \ '''substitute(v:val, '.
+ \ '"\\v\\C(\\p@!.|\\<)", '.
+ \ '"\\=printf(\"<%x>\", '.
+ \ 'char2nr(submatch(0)))", '.
+ \ '"")''), '.
+ \ '''\n'')')
+ call setline(1, [
+ \ 'Job exited with code ' . results[0],
+ \ printf('Screen (%u lines)', len(screen)),
+ \ repeat('=', 80),
+ \] + screen + [
+ \ repeat('=', 80),
+ \ printf('Events (%u lines):', len(stringified_events)),
+ \ repeat('=', 80),
+ \] + stringified_events + [
+ \ repeat('=', 80),
+ \])
+ write
+ if results[0] != 0
+ if results[0] != -1
+ call jobstop(job)
+ endif
+ cquit
+ else
+ qall
+ endif
+endfunction
+
+call Main()
diff --git a/src/nvim/testdir/runtest.vim b/src/nvim/testdir/runtest.vim
index 1b1f5d7688..bfd6240f0c 100644
--- a/src/nvim/testdir/runtest.vim
+++ b/src/nvim/testdir/runtest.vim
@@ -2,6 +2,11 @@
" When the script is successful the .res file will be created.
" Errors are appended to the test.log file.
"
+" To execute only specific test functions, add a second argument. It will be
+" matched against the names of the Test_ function. E.g.:
+" ../vim -u NONE -S runtest.vim test_channel.vim open_delay
+" The output can be found in the "messages" file.
+"
" The test script may contain anything, only functions that start with
" "Test_" are special. These will be invoked and should contain assert
" functions. See test_assert.vim for an example.
@@ -19,6 +24,10 @@
"
" If cleanup after each Test_ function is needed, define a TearDown function.
" It will be called after each Test_ function.
+"
+" When debugging a test it can be useful to add messages to v:errors:
+" call add(v:errors, "this happened")
+
" Check that the screen size is at least 24 x 80 characters.
if &lines < 24 || &columns < 80
@@ -30,8 +39,20 @@ if &lines < 24 || &columns < 80
cquit
endif
+" Common with all tests on all systems.
+source setup.vim
+
+" For consistency run all tests with 'nocompatible' set.
" This also enables use of line continuation.
-set viminfo+=nviminfo
+set nocp viminfo+=nviminfo
+
+" Use utf-8 or latin1 by default, instead of whatever the system default
+" happens to be. Individual tests can overrule this at the top of the file.
+if has('multi_byte')
+ set encoding=utf-8
+else
+ set encoding=latin1
+endif
" Avoid stopping at the "hit enter" prompt
set nomore
@@ -40,91 +61,248 @@ set nomore
lang mess C
" Always use forward slashes.
-set shellslash
+" set shellslash
+
+" Prepare for calling test_garbagecollect_now().
+let v:testing = 1
+
+" Support function: get the alloc ID by name.
+func GetAllocId(name)
+ exe 'split ' . s:srcdir . '/alloc.h'
+ let top = search('typedef enum')
+ if top == 0
+ call add(v:errors, 'typedef not found in alloc.h')
+ endif
+ let lnum = search('aid_' . a:name . ',')
+ if lnum == 0
+ call add(v:errors, 'Alloc ID ' . a:name . ' not defined')
+ endif
+ close
+ return lnum - top - 1
+endfunc
+
+func CanRunVimInTerminal()
+ " Nvim: always false, we use Lua screen-tests instead.
+ return 0
+endfunc
+
+func RunTheTest(test)
+ echo 'Executing ' . a:test
+
+ " Avoid stopping at the "hit enter" prompt
+ set nomore
+
+ " Avoid a three second wait when a message is about to be overwritten by the
+ " mode message.
+ set noshowmode
+
+ " Some tests wipe out buffers. To be consistent, always wipe out all
+ " buffers.
+ %bwipe!
+
+ " The test may change the current directory. Save and restore the
+ " directory after executing the test.
+ let save_cwd = getcwd()
+
+ if exists("*SetUp")
+ try
+ call SetUp()
+ catch
+ call add(v:errors, 'Caught exception in SetUp() before ' . a:test . ': ' . v:exception . ' @ ' . v:throwpoint)
+ endtry
+ endif
+
+ call add(s:messages, 'Executing ' . a:test)
+ let s:done += 1
+
+ if a:test =~ 'Test_nocatch_'
+ " Function handles errors itself. This avoids skipping commands after the
+ " error.
+ exe 'call ' . a:test
+ else
+ try
+ exe 'call ' . a:test
+ catch /^\cskipped/
+ call add(s:messages, ' Skipped')
+ call add(s:skipped, 'SKIPPED ' . a:test . ': ' . substitute(v:exception, '^\S*\s\+', '', ''))
+ catch
+ call add(v:errors, 'Caught exception in ' . a:test . ': ' . v:exception . ' @ ' . v:throwpoint)
+ endtry
+ endif
+
+ " In case 'insertmode' was set and something went wrong, make sure it is
+ " reset to avoid trouble with anything else.
+ set noinsertmode
+
+ if exists("*TearDown")
+ try
+ call TearDown()
+ catch
+ call add(v:errors, 'Caught exception in TearDown() after ' . a:test . ': ' . v:exception . ' @ ' . v:throwpoint)
+ endtry
+ endif
+
+ " Clear any autocommands
+ au!
+
+ " Close any extra tab pages and windows and make the current one not modified.
+ while tabpagenr('$') > 1
+ quit!
+ endwhile
+
+ while 1
+ let wincount = winnr('$')
+ if wincount == 1
+ break
+ endif
+ bwipe!
+ if wincount == winnr('$')
+ " Did not manage to close a window.
+ only!
+ break
+ endif
+ endwhile
+
+ exe 'cd ' . save_cwd
+endfunc
+
+func AfterTheTest()
+ if len(v:errors) > 0
+ let s:fail += 1
+ call add(s:errors, 'Found errors in ' . s:test . ':')
+ call extend(s:errors, v:errors)
+ let v:errors = []
+ endif
+endfunc
+
+" This function can be called by a test if it wants to abort testing.
+func FinishTesting()
+ call AfterTheTest()
+
+ " Don't write viminfo on exit.
+ set viminfo=
+
+ " Clean up files created by setup.vim
+ call delete('XfakeHOME', 'rf')
+
+ if s:fail == 0
+ " Success, create the .res file so that make knows it's done.
+ exe 'split ' . fnamemodify(g:testname, ':r') . '.res'
+ write
+ endif
+
+ if len(s:errors) > 0
+ " Append errors to test.log
+ split test.log
+ call append(line('$'), '')
+ call append(line('$'), 'From ' . g:testname . ':')
+ call append(line('$'), s:errors)
+ write
+ endif
+
+ let message = 'Executed ' . s:done . (s:done > 1 ? ' tests' : ' test')
+ echo message
+ call add(s:messages, message)
+ if s:fail > 0
+ let message = s:fail . ' FAILED:'
+ echo message
+ call add(s:messages, message)
+ call extend(s:messages, s:errors)
+ endif
+
+ " Add SKIPPED messages
+ call extend(s:messages, s:skipped)
+
+ " Append messages to the file "messages"
+ split messages
+ call append(line('$'), '')
+ call append(line('$'), 'From ' . g:testname . ':')
+ call append(line('$'), s:messages)
+ write
+
+ qall!
+endfunc
" Source the test script. First grab the file name, in case the script
-" navigates away.
-let testname = expand('%')
-let done = 0
-let fail = 0
-let errors = []
-let messages = []
-if expand('%') =~ 'test_viml.vim'
- " this test has intentional errors, don't use try/catch.
+" navigates away. g:testname can be used by the tests.
+let g:testname = expand('%')
+let s:done = 0
+let s:fail = 0
+let s:errors = []
+let s:messages = []
+let s:skipped = []
+if expand('%') =~ 'test_vimscript.vim'
+ " this test has intentional s:errors, don't use try/catch.
source %
else
try
source %
catch
- let fail += 1
- call add(errors, 'Caught exception: ' . v:exception . ' @ ' . v:throwpoint)
+ let s:fail += 1
+ call add(s:errors, 'Caught exception: ' . v:exception . ' @ ' . v:throwpoint)
endtry
endif
+" Names of flaky tests.
+let s:flaky = [
+ \ 'Test_exit_callback_interval()',
+ \ 'Test_oneshot()',
+ \ 'Test_out_cb()',
+ \ 'Test_paused()',
+ \ 'Test_popup_and_window_resize()',
+ \ 'Test_quoteplus()',
+ \ 'Test_quotestar()',
+ \ 'Test_reltime()',
+ \ 'Test_repeat_three()',
+ \ 'Test_terminal_composing_unicode()',
+ \ 'Test_terminal_redir_file()',
+ \ 'Test_terminal_tmap()',
+ \ 'Test_with_partial_callback()',
+ \ 'Test_lambda_with_timer()',
+ \ ]
+
" Locate Test_ functions and execute them.
-set nomore
redir @q
silent function /^Test_
redir END
-let tests = split(substitute(@q, 'function \(\k*()\)', '\1', 'g'))
+let s:tests = split(substitute(@q, 'function \(\k*()\)', '\1', 'g'))
+
+" If there is an extra argument filter the function names against it.
+if argc() > 1
+ let s:tests = filter(s:tests, 'v:val =~ argv(1)')
+endif
" Execute the tests in alphabetical order.
-for test in sort(tests)
- echo 'Executing ' . test
- if exists("*SetUp")
- call SetUp()
- endif
+for s:test in sort(s:tests)
+ " Silence, please!
+ set belloff=all
- call add(messages, 'Executing ' . test)
- let done += 1
- try
- exe 'call ' . test
- catch
- let fail += 1
- call add(v:errors, 'Caught exception in ' . test . ': ' . v:exception . ' @ ' . v:throwpoint)
- endtry
+ call RunTheTest(s:test)
+
+ if len(v:errors) > 0 && index(s:flaky, s:test) >= 0
+ call add(s:messages, 'Found errors in ' . s:test . ':')
+ call extend(s:messages, v:errors)
+ call add(s:messages, 'Flaky test failed, running it again')
+ let first_run = v:errors
+
+ " Flakiness is often caused by the system being very busy. Sleep a couple
+ " of seconds to have a higher chance of succeeding the second time.
+ sleep 2
- if len(v:errors) > 0
- let fail += 1
- call add(errors, 'Found errors in ' . test . ':')
- call extend(errors, v:errors)
let v:errors = []
+ call RunTheTest(s:test)
+ if len(v:errors) > 0
+ let second_run = v:errors
+ let v:errors = ['First run:']
+ call extend(v:errors, first_run)
+ call add(v:errors, 'Second run:')
+ call extend(v:errors, second_run)
+ endif
endif
- if exists("*TearDown")
- call TearDown()
- endif
+ call AfterTheTest()
endfor
-if fail == 0
- " Success, create the .res file so that make knows it's done.
- exe 'split ' . fnamemodify(testname, ':r') . '.res'
- write
-endif
-
-if len(errors) > 0
- " Append errors to test.log
- split test.log
- call append(line('$'), '')
- call append(line('$'), 'From ' . testname . ':')
- call append(line('$'), errors)
- write
-endif
-
-let message = 'Executed ' . done . (done > 1 ? ' tests': ' test')
-echo message
-call add(messages, message)
-if fail > 0
- let message = fail . ' FAILED'
- echo message
- call add(messages, message)
-endif
-
-" Append messages to "messages"
-split messages
-call append(line('$'), '')
-call append(line('$'), 'From ' . testname . ':')
-call append(line('$'), messages)
-write
+call FinishTesting()
-qall!
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/samples/memfile_test.c b/src/nvim/testdir/samples/memfile_test.c
new file mode 100644
index 0000000000..3c8f108255
--- /dev/null
+++ b/src/nvim/testdir/samples/memfile_test.c
@@ -0,0 +1,146 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+/* vi:set ts=8 sts=4 sw=4 noet:
+ *
+ * VIM - Vi IMproved by Bram Moolenaar
+ *
+ * Do ":help uganda" in Vim to read copying and usage conditions.
+ * Do ":help credits" in Vim to see a list of people who contributed.
+ * See README.txt for an overview of the Vim source code.
+ */
+
+/*
+ * memfile_test.c: Unittests for memfile.c
+ * Mostly by Ivan Krasilnikov.
+ */
+
+#undef NDEBUG
+#include <assert.h>
+
+/* Must include main.c because it contains much more than just main() */
+#define NO_VIM_MAIN
+#include "main.c"
+
+/* This file has to be included because the tested functions are static */
+#include "memfile.c"
+
+#define index_to_key(i) ((i) ^ 15167)
+#define TEST_COUNT 50000
+
+/*
+ * Test mf_hash_*() functions.
+ */
+ static void
+test_mf_hash(void)
+{
+ mf_hashtab_T ht;
+ mf_hashitem_T *item;
+ blocknr_T key;
+ long_u i;
+ long_u num_buckets;
+
+ mf_hash_init(&ht);
+
+ /* insert some items and check invariants */
+ for (i = 0; i < TEST_COUNT; i++)
+ {
+ assert(ht.mht_count == i);
+
+ /* check that number of buckets is a power of 2 */
+ num_buckets = ht.mht_mask + 1;
+ assert(num_buckets > 0 && (num_buckets & (num_buckets - 1)) == 0);
+
+ /* check load factor */
+ assert(ht.mht_count <= (num_buckets << MHT_LOG_LOAD_FACTOR));
+
+ if (i < (MHT_INIT_SIZE << MHT_LOG_LOAD_FACTOR))
+ {
+ /* first expansion shouldn't have occurred yet */
+ assert(num_buckets == MHT_INIT_SIZE);
+ assert(ht.mht_buckets == ht.mht_small_buckets);
+ }
+ else
+ {
+ assert(num_buckets > MHT_INIT_SIZE);
+ assert(ht.mht_buckets != ht.mht_small_buckets);
+ }
+
+ key = index_to_key(i);
+ assert(mf_hash_find(&ht, key) == NULL);
+
+ /* allocate and add new item */
+ item = (mf_hashitem_T *)lalloc_clear(sizeof(mf_hashtab_T), FALSE);
+ assert(item != NULL);
+ item->mhi_key = key;
+ mf_hash_add_item(&ht, item);
+
+ assert(mf_hash_find(&ht, key) == item);
+
+ if (ht.mht_mask + 1 != num_buckets)
+ {
+ /* hash table was expanded */
+ assert(ht.mht_mask + 1 == num_buckets * MHT_GROWTH_FACTOR);
+ assert(i + 1 == (num_buckets << MHT_LOG_LOAD_FACTOR));
+ }
+ }
+
+ /* check presence of inserted items */
+ for (i = 0; i < TEST_COUNT; i++)
+ {
+ key = index_to_key(i);
+ item = mf_hash_find(&ht, key);
+ assert(item != NULL);
+ assert(item->mhi_key == key);
+ }
+
+ /* delete some items */
+ for (i = 0; i < TEST_COUNT; i++)
+ {
+ if (i % 100 < 70)
+ {
+ key = index_to_key(i);
+ item = mf_hash_find(&ht, key);
+ assert(item != NULL);
+ assert(item->mhi_key == key);
+
+ mf_hash_rem_item(&ht, item);
+ assert(mf_hash_find(&ht, key) == NULL);
+
+ mf_hash_add_item(&ht, item);
+ assert(mf_hash_find(&ht, key) == item);
+
+ mf_hash_rem_item(&ht, item);
+ assert(mf_hash_find(&ht, key) == NULL);
+
+ vim_free(item);
+ }
+ }
+
+ /* check again */
+ for (i = 0; i < TEST_COUNT; i++)
+ {
+ key = index_to_key(i);
+ item = mf_hash_find(&ht, key);
+
+ if (i % 100 < 70)
+ {
+ assert(item == NULL);
+ }
+ else
+ {
+ assert(item != NULL);
+ assert(item->mhi_key == key);
+ }
+ }
+
+ /* free hash table and all remaining items */
+ mf_hash_free_all(&ht);
+}
+
+ int
+main(void)
+{
+ test_mf_hash();
+ return 0;
+}
diff --git a/src/nvim/testdir/samples/quickfix.txt b/src/nvim/testdir/samples/quickfix.txt
new file mode 100644
index 0000000000..2de3835473
--- /dev/null
+++ b/src/nvim/testdir/samples/quickfix.txt
@@ -0,0 +1,4 @@
+samples/quickfix.txt:1:1:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+samples/quickfix.txt:2:1:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+samples/quickfix.txt:3:1:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
+samples/quickfix.txt:4:1:dddddddddd
diff --git a/src/nvim/testdir/sautest/autoload/foo.vim b/src/nvim/testdir/sautest/autoload/foo.vim
new file mode 100644
index 0000000000..d7dcd5ce3d
--- /dev/null
+++ b/src/nvim/testdir/sautest/autoload/foo.vim
@@ -0,0 +1,7 @@
+let g:loaded_foo_vim += 1
+
+let foo#bar = {}
+
+func foo#bar.echo()
+ let g:called_foo_bar_echo += 1
+endfunc
diff --git a/src/nvim/testdir/sautest/autoload/footest.vim b/src/nvim/testdir/sautest/autoload/footest.vim
index f467bc376d..1e78963a10 100644
--- a/src/nvim/testdir/sautest/autoload/footest.vim
+++ b/src/nvim/testdir/sautest/autoload/footest.vim
@@ -1,4 +1,4 @@
-" Autoload script used by test55 and test60
+" Autoload script used by test_listdict.vim, test_exists.vim and test_let.vim
let footest#x = 1
func footest#F()
return 0
diff --git a/src/nvim/testdir/sautest/autoload/globone.vim b/src/nvim/testdir/sautest/autoload/globone.vim
new file mode 100644
index 0000000000..98c9a10582
--- /dev/null
+++ b/src/nvim/testdir/sautest/autoload/globone.vim
@@ -0,0 +1 @@
+" used by Test_globpath()
diff --git a/src/nvim/testdir/sautest/autoload/globtwo.vim b/src/nvim/testdir/sautest/autoload/globtwo.vim
new file mode 100644
index 0000000000..98c9a10582
--- /dev/null
+++ b/src/nvim/testdir/sautest/autoload/globtwo.vim
@@ -0,0 +1 @@
+" used by Test_globpath()
diff --git a/src/nvim/testdir/sautest/autoload/sourced.vim b/src/nvim/testdir/sautest/autoload/sourced.vim
new file mode 100644
index 0000000000..f69f00cb53
--- /dev/null
+++ b/src/nvim/testdir/sautest/autoload/sourced.vim
@@ -0,0 +1,3 @@
+let g:loaded_sourced_vim += 1
+func! sourced#something()
+endfunc
diff --git a/src/nvim/testdir/setup.vim b/src/nvim/testdir/setup.vim
new file mode 100644
index 0000000000..c7c3b378cc
--- /dev/null
+++ b/src/nvim/testdir/setup.vim
@@ -0,0 +1,40 @@
+" Common preparations for running tests.
+
+" Only load this once.
+if exists('s:did_load')
+ finish
+endif
+let s:did_load = 1
+
+" Align Nvim defaults to Vim.
+set sidescroll=0
+set directory^=.
+set undodir^=.
+set backspace=
+set nrformats+=octal
+set nohidden smarttab noautoindent noautoread complete-=i noruler noshowcmd
+set listchars=eol:$
+set fillchars=vert:\|,fold:-
+set shortmess-=F
+" Prevent Nvim log from writing to stderr.
+let $NVIM_LOG_FILE = exists($NVIM_LOG_FILE) ? $NVIM_LOG_FILE : 'Xnvim.log'
+
+
+" Make sure 'runtimepath' and 'packpath' does not include $HOME.
+set rtp=$VIM/vimfiles,$VIMRUNTIME,$VIM/vimfiles/after
+let &packpath = &rtp
+
+" Make sure $HOME does not get read or written.
+let $HOME = expand(getcwd() . '/XfakeHOME')
+if !isdirectory($HOME)
+ call mkdir($HOME)
+endif
+
+" Use default shell on Windows to avoid segfault, caused by TUI
+if has('win32')
+ let $SHELL = ''
+ let $TERM = ''
+ let &shell = empty($COMSPEC) ? exepath('cmd.exe') : $COMSPEC
+ set shellcmdflag=/s/c shellxquote=\" shellredir=>%s\ 2>&1
+ let &shellpipe = &shellredir
+endif
diff --git a/src/nvim/testdir/shared.vim b/src/nvim/testdir/shared.vim
new file mode 100644
index 0000000000..eb6798f353
--- /dev/null
+++ b/src/nvim/testdir/shared.vim
@@ -0,0 +1,248 @@
+" Functions shared by several tests.
+
+" Only load this script once.
+if exists('*WaitFor')
+ finish
+endif
+
+" {Nvim}
+" Filepath captured from output may be truncated, like this:
+" /home/va...estdir/Xtest-tmpdir/nvimxbXN4i/10
+" Get last 2 segments, then combine with $TMPDIR.
+func! Fix_truncated_tmpfile(fname)
+ " sanity check
+ if $TMPDIR ==# ''
+ throw '$TMPDIR is empty'
+ endif
+ let tmpdir_tail = fnamemodify(substitute($TMPDIR, '[\/]\+$', '', 'g'), ':t')
+ if tmpdir_tail ==# ''
+ throw 'empty tmpdir_tail'
+ endif
+ if a:fname !~# tmpdir_tail
+ throw printf('$TMPDIR (%s) not in fname: %s', tmpdir_tail, a:fname)
+ endif
+ let last2segments = matchstr(a:fname, '[\/][^\/]\+[\/][^\/]\+$')
+ return $TMPDIR.last2segments
+endfunc
+
+" Get the name of the Python executable.
+" Also keeps it in s:python.
+func PythonProg()
+ " This test requires the Python command to run the test server.
+ " This most likely only works on Unix and Windows.
+ if has('unix')
+ " We also need the job feature or the pkill command to make sure the server
+ " can be stopped.
+ if !(executable('python') && (has('job') || executable('pkill')))
+ return ''
+ endif
+ let s:python = 'python'
+ elseif has('win32')
+ " Use Python Launcher for Windows (py.exe) if available.
+ if executable('py.exe')
+ let s:python = 'py.exe'
+ elseif executable('python.exe')
+ let s:python = 'python.exe'
+ else
+ return ''
+ endif
+ else
+ return ''
+ endif
+ return s:python
+endfunc
+
+" Run "cmd". Returns the job if using a job.
+func RunCommand(cmd)
+ let job = 0
+ if has('job')
+ let job = job_start(a:cmd, {"stoponexit": "hup"})
+ call job_setoptions(job, {"stoponexit": "kill"})
+ elseif has('win32')
+ exe 'silent !start cmd /c start "test_channel" ' . a:cmd
+ else
+ exe 'silent !' . a:cmd . '&'
+ endif
+ return job
+endfunc
+
+" Read the port number from the Xportnr file.
+func GetPort()
+ let l = []
+ for i in range(200)
+ try
+ let l = readfile("Xportnr")
+ catch
+ endtry
+ if len(l) >= 1
+ break
+ endif
+ sleep 10m
+ endfor
+ call delete("Xportnr")
+
+ if len(l) == 0
+ " Can't make the connection, give up.
+ return 0
+ endif
+ return l[0]
+endfunc
+
+" Run a Python server for "cmd" and call "testfunc".
+" Always kills the server before returning.
+func RunServer(cmd, testfunc, args)
+ " The Python program writes the port number in Xportnr.
+ call delete("Xportnr")
+
+ if len(a:args) == 1
+ let arg = ' ' . a:args[0]
+ else
+ let arg = ''
+ endif
+ let pycmd = s:python . " " . a:cmd . arg
+
+ try
+ let g:currentJob = RunCommand(pycmd)
+
+ " Wait for up to 2 seconds for the port number to be there.
+ let port = GetPort()
+ if port == 0
+ call assert_false(1, "Can't start " . a:cmd)
+ return
+ endif
+
+ call call(function(a:testfunc), [port])
+ catch
+ call assert_false(1, 'Caught exception: "' . v:exception . '" in ' . v:throwpoint)
+ finally
+ call s:kill_server(a:cmd)
+ endtry
+endfunc
+
+func s:kill_server(cmd)
+ if has('job')
+ if exists('g:currentJob')
+ call job_stop(g:currentJob)
+ unlet g:currentJob
+ endif
+ elseif has('win32')
+ let cmd = substitute(a:cmd, ".py", '', '')
+ call system('taskkill /IM ' . s:python . ' /T /F /FI "WINDOWTITLE eq ' . cmd . '"')
+ else
+ call system("pkill -f " . a:cmd)
+ endif
+endfunc
+
+" Wait for up to a second for "expr" to become true.
+" Return time slept in milliseconds. With the +reltime feature this can be
+" more than the actual waiting time. Without +reltime it can also be less.
+func WaitFor(expr, ...)
+ let timeout = get(a:000, 0, 1000)
+ " using reltime() is more accurate, but not always available
+ if has('reltime')
+ let start = reltime()
+ else
+ let slept = 0
+ endif
+ for i in range(timeout / 10)
+ if eval(a:expr)
+ if has('reltime')
+ return float2nr(reltimefloat(reltime(start)) * 1000)
+ endif
+ return slept
+ endif
+ if !has('reltime')
+ let slept += 10
+ endif
+ sleep 10m
+ endfor
+ return timeout
+endfunc
+
+" Wait for up to a given milliseconds.
+" With the +timers feature this waits for key-input by getchar(), Resume()
+" feeds key-input and resumes process. Return time waited in milliseconds.
+" Without +timers it uses simply :sleep.
+func Standby(msec)
+ if has('timers')
+ let start = reltime()
+ let g:_standby_timer = timer_start(a:msec, function('s:feedkeys'))
+ call getchar()
+ return float2nr(reltimefloat(reltime(start)) * 1000)
+ else
+ execute 'sleep ' a:msec . 'm'
+ return a:msec
+ endif
+endfunc
+
+func Resume()
+ if exists('g:_standby_timer')
+ call timer_stop(g:_standby_timer)
+ call s:feedkeys(0)
+ unlet g:_standby_timer
+ endif
+endfunc
+
+func s:feedkeys(timer)
+ call feedkeys('x', 'nt')
+endfunc
+
+" Get the command to run Vim, with -u NONE and --headless arguments.
+" Returns an empty string on error.
+func GetVimCommand()
+ let cmd = v:progpath
+ let cmd = substitute(cmd, '-u \f\+', '-u NONE', '')
+ if cmd !~ '-u NONE'
+ let cmd = cmd . ' -u NONE'
+ endif
+ let cmd .= ' --headless -i NONE'
+ let cmd = substitute(cmd, 'VIMRUNTIME=.*VIMRUNTIME;', '', '')
+ return cmd
+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.
+" Plugins are not loaded, unless 'loadplugins' is set in "before".
+" Return 1 if Vim could be executed.
+func RunVim(before, after, arguments)
+ return RunVimPiped(a:before, a:after, a:arguments, '')
+endfunc
+
+func RunVimPiped(before, after, arguments, pipecmd)
+ let $NVIM_LOG_FILE = exists($NVIM_LOG_FILE) ? $NVIM_LOG_FILE : 'Xnvim.log'
+ let cmd = GetVimCommand()
+ if cmd == ''
+ return 0
+ endif
+ let args = ''
+ if len(a:before) > 0
+ call writefile(a:before, 'Xbefore.vim')
+ let args .= ' --cmd "so Xbefore.vim"'
+ endif
+ if len(a:after) > 0
+ call writefile(a:after, 'Xafter.vim')
+ let args .= ' -S Xafter.vim'
+ endif
+
+ exe "silent !" . a:pipecmd . cmd . args . ' ' . a:arguments
+
+ if len(a:before) > 0
+ call delete('Xbefore.vim')
+ endif
+ if len(a:after) > 0
+ call delete('Xafter.vim')
+ endif
+ return 1
+endfunc
+
+" Get line "lnum" as displayed on the screen.
+" Trailing white space is trimmed.
+func! Screenline(lnum)
+ let chars = []
+ for c in range(1, winwidth(0))
+ call add(chars, nr2char(screenchar(a:lnum, c)))
+ endfor
+ let line = join(chars, '')
+ return matchstr(line, '^.\{-}\ze\s*$')
+endfunc
diff --git a/src/nvim/testdir/test12.in b/src/nvim/testdir/test12.in
deleted file mode 100644
index 0c0623e5d4..0000000000
--- a/src/nvim/testdir/test12.in
+++ /dev/null
@@ -1,50 +0,0 @@
-Tests for 'directory' option.
-- ".", in same dir as file
-- "./dir", in directory relative to file
-- "dir", in directory relative to current dir
-
-STARTTEST
-:set dir=.,~
-:/start of testfile/,/end of testfile/w! Xtest1
-:" do an ls of the current dir to find the swap file (should not be there)
-:if has("unix")
-: !ls .X*.swp >test.out
-:else
-: r !ls X*.swp >test.out
-:endif
-:!echo first line >>test.out
-:e Xtest1
-:if has("unix")
-:" Do an ls of the current dir to find the swap file, remove the leading dot
-:" to make the result the same for all systems.
-: r!ls .X*.swp
-: s/\.*X/X/
-: .w >>test.out
-: undo
-:else
-: !ls X*.swp >>test.out
-:endif
-:!echo under Xtest1.swp >>test.out
-:!mkdir Xtest2
-:set dir=./Xtest2,.,~
-:e Xtest1
-:!ls X*.swp >>test.out
-:!echo under under >>test.out
-:!ls Xtest2 >>test.out
-:!echo under Xtest1.swp >>test.out
-:!mkdir Xtest.je
-:/start of testfile/,/end of testfile/w! Xtest2/Xtest3
-:set dir=Xtest.je,~
-:e Xtest2/Xtest3
-:swap
-:!ls Xtest2 >>test.out
-:!echo under Xtest3 >>test.out
-:!ls Xtest.je >>test.out
-:!echo under Xtest3.swp >>test.out
-:qa!
-ENDTEST
-
-start of testfile
-line 2 Abcdefghij
-line 3 Abcdefghij
-end of testfile
diff --git a/src/nvim/testdir/test12.ok b/src/nvim/testdir/test12.ok
deleted file mode 100644
index 605623b117..0000000000
--- a/src/nvim/testdir/test12.ok
+++ /dev/null
@@ -1,10 +0,0 @@
-first line
-Xtest1.swp
-under Xtest1.swp
-under under
-Xtest1.swp
-under Xtest1.swp
-Xtest3
-under Xtest3
-Xtest3.swp
-under Xtest3.swp
diff --git a/src/nvim/testdir/test13.in b/src/nvim/testdir/test13.in
deleted file mode 100644
index fa9ba312b7..0000000000
--- a/src/nvim/testdir/test13.in
+++ /dev/null
@@ -1,63 +0,0 @@
-Tests for autocommands on :close command
-
-Write three files and open them, each in a window.
-Then go to next window, with autocommand that deletes the previous one.
-Do this twice, writing the file.
-
-Also test deleting the buffer on a Unload event. If this goes wrong there
-will be the ATTENTION prompt.
-
-Also test changing buffers in a BufDel autocommand. If this goes wrong there
-are ml_line errors and/or a Crash.
-
-STARTTEST
-:/^start of testfile/,/^end of testfile/w! Xtestje1
-:/^start of testfile/,/^end of testfile/w! Xtestje2
-:/^start of testfile/,/^end of testfile/w! Xtestje3
-:e Xtestje1
-otestje1
-:w
-:sp Xtestje2
-otestje2
-:w
-:sp Xtestje3
-otestje3
-:w
-
-:au WinLeave Xtestje2 bwipe
-
-:w! test.out
-:au WinLeave Xtestje1 bwipe Xtestje3
-:close
-:w >>test.out
-:e Xtestje1
-:bwipe Xtestje2 Xtestje3 test.out
-:au!
-:au! BufUnload Xtestje1 bwipe
-:e Xtestje3
-:w >>test.out
-:e Xtestje2
-:sp Xtestje1
-:e
-:w >>test.out
-:au!
-:only
-:e Xtestje1
-:bwipe Xtestje2 Xtestje3 test.out test13.in
-:au BufWipeout Xtestje1 buf Xtestje1
-:bwipe
-:w >>test.out
-:only
-:new|set buftype=help
-:wincmd w
-:1quit
-:$put ='Final line'
-:$w >>test.out
-:qa!
-ENDTEST
-
-start of testfile
- contents
- contents
- contents
-end of testfile
diff --git a/src/nvim/testdir/test13.ok b/src/nvim/testdir/test13.ok
deleted file mode 100644
index 66ebce63f7..0000000000
--- a/src/nvim/testdir/test13.ok
+++ /dev/null
@@ -1,31 +0,0 @@
-start of testfile
-testje1
- contents
- contents
- contents
-end of testfile
-start of testfile
-testje1
- contents
- contents
- contents
-end of testfile
-start of testfile
-testje3
- contents
- contents
- contents
-end of testfile
-start of testfile
-testje2
- contents
- contents
- contents
-end of testfile
-start of testfile
-testje1
- contents
- contents
- contents
-end of testfile
-Final line
diff --git a/src/nvim/testdir/test17.in b/src/nvim/testdir/test17.in
index 83abe17770..1a4ac6b6d1 100644
--- a/src/nvim/testdir/test17.in
+++ b/src/nvim/testdir/test17.in
@@ -4,13 +4,7 @@ Tests for:
STARTTEST
:set isfname=@,48-57,/,.,-,_,+,,,$,:,~,{,}
-:function! DeleteDirectory(dir)
-: if has("win16") || has("win32") || has("win64") || has("dos16") || has("dos32")
-: exec "silent !rmdir /Q /S " . a:dir
-: else
-: exec "silent !rm -rf " . a:dir
-: endif
-:endfun
+:"
:if has("unix")
:let $CDIR = "."
/CDIR
@@ -36,7 +30,7 @@ STARTTEST
:" check for 'include' without \zs or \ze
:lang C
:call delete("./Xbase.a")
-:call DeleteDirectory("Xdir1")
+:call delete("Xdir1", "rf")
:!mkdir Xdir1
:!mkdir "Xdir1/dir2"
:e! Xdir1/dir2/foo.a
@@ -61,7 +55,7 @@ ENDTEST
STARTTEST
:" check for 'include' with \zs and \ze
:call delete("./Xbase.b")
-:call DeleteDirectory("Xdir1")
+:call delete("Xdir1", "rf")
:!mkdir Xdir1
:!mkdir "Xdir1/dir2"
:let &include='^\s*%inc\s*/\zs[^/]\+\ze'
@@ -91,7 +85,7 @@ ENDTEST
STARTTEST
:" check for 'include' with \zs and no \ze
:call delete("./Xbase.c")
-:call DeleteDirectory("Xdir1")
+:call delete("Xdir1", "rf")
:!mkdir Xdir1
:!mkdir "Xdir1/dir2"
:let &include='^\s*%inc\s*\%([[:upper:]][^[:space:]]*\s\+\)\?\zs\S\+\ze'
diff --git a/src/nvim/testdir/test24.in b/src/nvim/testdir/test24.in
deleted file mode 100644
index 292f403048..0000000000
--- a/src/nvim/testdir/test24.in
+++ /dev/null
Binary files differ
diff --git a/src/nvim/testdir/test24.ok b/src/nvim/testdir/test24.ok
deleted file mode 100644
index cd61210968..0000000000
--- a/src/nvim/testdir/test24.ok
+++ /dev/null
@@ -1,32 +0,0 @@
-start
-test text test text
-test text test text
-test text test text
-test text test text
-test text test text
-test text test text
-test text test text x61
-test text test text x60-x64
-test text test text x78 5
-test text test text o143
-test text test text o140-o144
-test text test text o41 7
-test text test text \%x42
-test text test text \%o103
-test text test text [\x00]
-test text test text [\x00-\x10]
-test text test text [\x-z]
-test text test text [\u-z]
-xx xx a
-xx aaaaa xx a
-xx aaaaa xx a
-xx Aaa xx
-xx Aaaa xx
-xx Aaa xx
-xx foobar xA xx
-xx an A xx
-XX 9;
-YY 77;
- xyz
- bcd
- BB
diff --git a/src/nvim/testdir/test30.in b/src/nvim/testdir/test30.in
deleted file mode 100644
index 56d5d5c6c2..0000000000
--- a/src/nvim/testdir/test30.in
+++ /dev/null
@@ -1,230 +0,0 @@
-Test for a lot of variations of the 'fileformats' option
-
-Note: This test will fail if "cat" is not available.
-
-STARTTEST
-:" first write three test files, one in each format
-:set fileformat=unix
-:set fileformats=
-:/^unix/;/eof/-1w! XXUnix
-:/^dos/;/eof/-1w! XXDos
-:set bin noeol
-:$w! XXMac
-Gonoeol
-:$w! XXEol
-:set nobin eol
-:enew!
-:bwipe XXUnix XXDos XXMac
-:" create mixed format files
-:if has("win32")
-: !copy /b XXUnix+XXDos XXUxDs
-: !copy /b XXUnix+XXMac XXUxMac
-: !copy /b XXDos+XXMac XXDosMac
-: !copy /b XXMac+XXEol XXMacEol
-: !copy /b XXUnix+XXDos+XXMac XXUxDsMc
-:else
-: !cat XXUnix XXDos >XXUxDs
-: !cat XXUnix XXMac >XXUxMac
-: !cat XXDos XXMac >XXDosMac
-: !cat XXMac XXEol >XXMacEol
-: !cat XXUnix XXDos XXMac >XXUxDsMc
-:endif
-:"
-:" try reading and writing with 'fileformats' empty
-:set fileformat=unix
-:e! XXUnix
-:w! test.out
-:e! XXDos
-:w! XXtt01
-:e! XXMac
-:w! XXtt02
-:bwipe XXUnix XXDos XXMac
-:set fileformat=dos
-:e! XXUnix
-:w! XXtt11
-:e! XXDos
-:w! XXtt12
-:e! XXMac
-:w! XXtt13
-:bwipe XXUnix XXDos XXMac
-:set fileformat=mac
-:e! XXUnix
-:w! XXtt21
-:e! XXDos
-:w! XXtt22
-:e! XXMac
-:w! XXtt23
-:bwipe XXUnix XXDos XXMac
-:"
-:" try reading and writing with 'fileformats' set to one format
-:set fileformats=unix
-:e! XXUxDsMc
-:w! XXtt31
-:bwipe XXUxDsMc
-:set fileformats=dos
-:e! XXUxDsMc
-:w! XXtt32
-:bwipe XXUxDsMc
-:set fileformats=mac
-:e! XXUxDsMc
-:w! XXtt33
-:bwipe XXUxDsMc
-:"
-:" try reading and writing with 'fileformats' set to two formats
-:set fileformats=unix,dos
-:e! XXUxDsMc
-:w! XXtt41
-:bwipe XXUxDsMc
-:e! XXUxMac
-:w! XXtt42
-:bwipe XXUxMac
-:e! XXDosMac
-:w! XXtt43
-:bwipe XXDosMac
-:set fileformats=unix,mac
-:e! XXUxDs
-:w! XXtt51
-:bwipe XXUxDs
-:e! XXUxDsMc
-:w! XXtt52
-:bwipe XXUxDsMc
-:e! XXDosMac
-:w! XXtt53
-:bwipe XXDosMac
-:e! XXEol
-ggO=&ffs
-:=&ff
-:w! XXtt54
-:bwipe XXEol
-:set fileformats=dos,mac
-:e! XXUxDs
-:w! XXtt61
-:bwipe XXUxDs
-:e! XXUxMac
-ggO=&ffs
-:=&ff
-:w! XXtt62
-:bwipe XXUxMac
-:e! XXUxDsMc
-:w! XXtt63
-:bwipe XXUxDsMc
-:e! XXMacEol
-ggO=&ffs
-:=&ff
-:w! XXtt64
-:bwipe XXMacEol
-:"
-:" try reading and writing with 'fileformats' set to three formats
-:set fileformats=unix,dos,mac
-:e! XXUxDsMc
-:w! XXtt71
-:bwipe XXUxDsMc
-:e! XXEol
-ggO=&ffs
-:=&ff
-:w! XXtt72
-:bwipe XXEol
-:set fileformats=mac,dos,unix
-:e! XXUxDsMc
-:w! XXtt81
-:bwipe XXUxDsMc
-:e! XXEol
-ggO=&ffs
-:=&ff
-:w! XXtt82
-:bwipe XXEol
-:" try with 'binary' set
-:set fileformats=mac,unix,dos
-:set binary
-:e! XXUxDsMc
-:w! XXtt91
-:bwipe XXUxDsMc
-:set fileformats=mac
-:e! XXUxDsMc
-:w! XXtt92
-:bwipe XXUxDsMc
-:set fileformats=dos
-:e! XXUxDsMc
-:w! XXtt93
-:"
-:" Append "END" to each file so that we can see what the last written char was.
-:set fileformat=unix nobin
-ggdGaEND:w >>XXtt01
-:w >>XXtt02
-:w >>XXtt11
-:w >>XXtt12
-:w >>XXtt13
-:w >>XXtt21
-:w >>XXtt22
-:w >>XXtt23
-:w >>XXtt31
-:w >>XXtt32
-:w >>XXtt33
-:w >>XXtt41
-:w >>XXtt42
-:w >>XXtt43
-:w >>XXtt51
-:w >>XXtt52
-:w >>XXtt53
-:w >>XXtt54
-:w >>XXtt61
-:w >>XXtt62
-:w >>XXtt63
-:w >>XXtt64
-:w >>XXtt71
-:w >>XXtt72
-:w >>XXtt81
-:w >>XXtt82
-:w >>XXtt91
-:w >>XXtt92
-:w >>XXtt93
-:"
-:" Concatenate the results.
-:" Make fileformat of test.out the native fileformat.
-:" Add a newline at the end.
-:set binary
-:e! test.out
-:$r XXtt01
-:$r XXtt02
-Go1:$r XXtt11
-:$r XXtt12
-:$r XXtt13
-Go2:$r XXtt21
-:$r XXtt22
-:$r XXtt23
-Go3:$r XXtt31
-:$r XXtt32
-:$r XXtt33
-Go4:$r XXtt41
-:$r XXtt42
-:$r XXtt43
-Go5:$r XXtt51
-:$r XXtt52
-:$r XXtt53
-:$r XXtt54
-Go6:$r XXtt61
-:$r XXtt62
-:$r XXtt63
-:$r XXtt64
-Go7:$r XXtt71
-:$r XXtt72
-Go8:$r XXtt81
-:$r XXtt82
-Go9:$r XXtt91
-:$r XXtt92
-:$r XXtt93
-Go10:$r XXUnix
-:set nobinary ff&
-:w
-:qa!
-ENDTEST
-
-unix
-unix
-eof
-
-dos
-dos
-eof
-
-mac mac
diff --git a/src/nvim/testdir/test30.ok b/src/nvim/testdir/test30.ok
deleted file mode 100644
index b35f4f5904..0000000000
--- a/src/nvim/testdir/test30.ok
+++ /dev/null
@@ -1,130 +0,0 @@
-unix
-unix
-dos
-dos
-END
-mac mac
-END
-1
-unix
-unix
-END
-dos
-dos
-END
-mac mac
-END
-2
-unix
-unix
- END
-dos
-dos
- END
-mac mac END
-3
-unix
-unix
-dos
-dos
-mac mac
-END
-unix
-unix
-dos
-dos
-mac mac
-END
-unix
-unix
-dos
-dos
-mac mac END
-4
-unix
-unix
-dos
-dos
-mac mac
-END
-unix
-unix
-mac mac
-END
-dos
-dos
-mac mac
-END
-5
-unix
-unix
-dos
-dos
-END
-unix
-unix
-dos
-dos
-mac mac
-END
-dos
-dos
-mac mac END
-unix,mac:unix
-noeol
-END
-6
-unix
-unix
-dos
-dos
-END
-dos,mac:dos
-unix
-unix
-mac mac
-END
-unix
-unix
-dos
-dos
-mac mac
-END
-dos,mac:mac mac mac noeol END
-7
-unix
-unix
-dos
-dos
-mac mac
-END
-unix,dos,mac:unix
-noeol
-END
-8
-unix
-unix
-dos
-dos
-mac mac
-END
-mac,dos,unix:mac noeol END
-9
-unix
-unix
-dos
-dos
-mac mac END
-unix
-unix
-dos
-dos
-mac mac END
-unix
-unix
-dos
-dos
-mac mac END
-10
-unix
-unix
diff --git a/src/nvim/testdir/test32.in b/src/nvim/testdir/test32.in
deleted file mode 100644
index 76bd9be889..0000000000
--- a/src/nvim/testdir/test32.in
+++ /dev/null
@@ -1,60 +0,0 @@
-Test for insert expansion
-
-:se cpt=.,w
-* add-expands (word from next line) from other window
-* add-expands (current buffer first)
-* Local expansion, ends in an empty line (unless it becomes a global expansion)
-* starts Local and switches to global add-expansion
-:se cpt=.,w,i
-* i-add-expands and switches to local
-* add-expands lines (it would end in an empty line if it didn't ignored it self)
-:se cpt=kXtestfile
-* checks k-expansion, and file expansion (use Xtest11 instead of test11,
-* because TEST11.OUT may match first on DOS)
-:se cpt=w
-* checks make_cyclic in other window
-:se cpt=u nohid
-* checks unloaded buffer expansion
-* checks adding mode abortion
-:se cpt=t,d
-* tag expansion, define add-expansion interrupted
-* t-expansion
-
-STARTTEST
-:se backspace=""
-:se cpt=.,w ff=unix | $-2,$w!Xtestfile | set ff&
-:se cot=
-nO#include "Xtestfile"
-ru
-O
-
-
-:se cpt=.,w,i
-kOM
-  
-:se cpt=kXtestfile
-:w Xtest11.one
-:w Xtest11.two
-OIXA
-:" use CTRL-X CTRL-F to complete Xtest11.one, remove it and then use
-:" CTRL-X CTRL-F again to verify this doesn't cause trouble.
-OXddk
-:se cpt=w
-OST
-:se cpt=u nohid
-oOEN
-unl
-:se cpt=t,d def=^\\k* tags=Xtestfile notagbsearch
-O
-a
-:wq! test.out
-ENDTEST
-
-start of testfile
-run1
-run2
-end of testfile
-
-test11 36Gepeto /Tag/
-asd test11file 36G
-Makefile to run
diff --git a/src/nvim/testdir/test32.ok b/src/nvim/testdir/test32.ok
deleted file mode 100644
index afc4463fac..0000000000
--- a/src/nvim/testdir/test32.ok
+++ /dev/null
@@ -1,15 +0,0 @@
-#include "Xtestfile"
-run1 run3
-run3 run3
-
-Makefile to run3
-Makefile to run3
-Makefile to run3
-Xtest11.two
-STARTTEST
-ENDTEST
-unless
-test11file 36Gepeto /Tag/ asd
-asd
-run1 run2
-
diff --git a/src/nvim/testdir/test40.in b/src/nvim/testdir/test40.in
deleted file mode 100644
index b0285709e5..0000000000
--- a/src/nvim/testdir/test40.in
+++ /dev/null
@@ -1,63 +0,0 @@
-Test for "*Cmd" autocommands
-
-STARTTEST
-:set wildchar=^E
-:/^start/,$w! Xxx " write lines below to Xxx
-:au BufReadCmd XtestA 0r Xxx|$del
-:e XtestA " will read text of Xxd instead
-:au BufWriteCmd XtestA call append(line("$"), "write")
-:w " will append a line to the file
-:r XtestA " should not read anything
-: " now we have:
-: " 1 start of Xxx
-: " 2 test40
-: " 3 end of Xxx
-: " 4 write
-:au FileReadCmd XtestB '[r Xxx
-:2r XtestB " will read Xxx below line 2 instead
-: " 1 start of Xxx
-: " 2 test40
-: " 3 start of Xxx
-: " 4 test40
-: " 5 end of Xxx
-: " 6 end of Xxx
-: " 7 write
-:au FileWriteCmd XtestC '[,']copy $
-4GA1
-:4,5w XtestC " will copy lines 4 and 5 to the end
-:r XtestC " should not read anything
-: " 1 start of Xxx
-: " 2 test40
-: " 3 start of Xxx
-: " 4 test401
-: " 5 end of Xxx
-: " 6 end of Xxx
-: " 7 write
-: " 8 test401
-: " 9 end of Xxx
-:au FILEAppendCmd XtestD '[,']w! test.out
-:w >>XtestD " will write all lines to test.out
-:$r XtestD " should not read anything
-:$w >>test.out " append "end of Xxx" to test.out
-:au BufReadCmd XtestE 0r test.out|$del
-:sp XtestE " split window with test.out
-5Goasdf:"
-:au BufWriteCmd XtestE w! test.out
-:wall " will write other window to test.out
-: " 1 start of Xxx
-: " 2 test40
-: " 3 start of Xxx
-: " 4 test401
-: " 5 end of Xxx
-: " 6 asdf
-: " 7 end of Xxx
-: " 8 write
-: " 9 test401
-: " 10 end of Xxx
-: " 11 end of Xxx
-:qa!
-ENDTEST
-
-start of Xxx
- test40
-end of Xxx
diff --git a/src/nvim/testdir/test40.ok b/src/nvim/testdir/test40.ok
deleted file mode 100644
index b6501394f9..0000000000
--- a/src/nvim/testdir/test40.ok
+++ /dev/null
@@ -1,11 +0,0 @@
-start of Xxx
- test40
-start of Xxx
- test401
-end of Xxx
-asdf
-end of Xxx
-write
- test401
-end of Xxx
-end of Xxx
diff --git a/src/nvim/testdir/test47.in b/src/nvim/testdir/test47.in
deleted file mode 100644
index c95c6a6850..0000000000
--- a/src/nvim/testdir/test47.in
+++ /dev/null
@@ -1,102 +0,0 @@
-Tests for vertical splits and filler lines in diff mode
-
-Also tests restoration of saved options by :diffoff.
-
-STARTTEST
-:" Disable the title to avoid xterm keeping the wrong one.
-:set notitle noicon
-/^1
-yG:new
-pkdd:w! Xtest
-ddGpkkrXoxxx:w! Xtest2
-:file Nop
-ggoyyyjjjozzzz
-:set foldmethod=marker foldcolumn=4
-:redir => nodiffsettings
-:silent! :set diff? fdm? fdc? scb? crb? wrap?
-:redir END
-:vert diffsplit Xtest
-:vert diffsplit Xtest2
-:redir => diffsettings
-:silent! :set diff? fdm? fdc? scb? crb? wrap?
-:redir END
-:let diff_fdm = &fdm
-:let diff_fdc = &fdc
-:" repeat entering diff mode here to see if this saves the wrong settings
-:diffthis
-:" jump to second window for a moment to have filler line appear at start of
-:" first window
-ggpgg:let one = winline()
-j:let one = one . "-" . winline()
-j:let one = one . "-" . winline()
-j:let one = one . "-" . winline()
-j:let one = one . "-" . winline()
-j:let one = one . "-" . winline()
-gg:let two = winline()
-j:let two = two . "-" . winline()
-j:let two = two . "-" . winline()
-j:let two = two . "-" . winline()
-j:let two = two . "-" . winline()
-gg:let three = winline()
-j:let three = three . "-" . winline()
-j:let three = three . "-" . winline()
-j:let three = three . "-" . winline()
-j:let three = three . "-" . winline()
-j:let three = three . "-" . winline()
-j:let three = three . "-" . winline()
-:call append("$", one)
-:call append("$", two)
-:call append("$", three)
-:$-2,$w! test.out
-:"
-:" Test diffoff
-:diffoff!
-1
-:let &diff = 1
-:let &fdm = diff_fdm
-:let &fdc = diff_fdc
-4
-:diffoff!
-:$put =nodiffsettings
-:$put =diffsettings
-1
-:redir => nd1
-:silent! :set diff? fdm? fdc? scb? crb? wrap?
-:redir END
-
-:redir => nd2
-:silent! :set diff? fdm? fdc? scb? crb? wrap?
-:redir END
-
-:redir => nd3
-:silent! :set diff? fdm? fdc? scb? crb? wrap?
-:redir END
-
-:$put =nd1
-:$put =nd2
-:$put =nd3
-:$-39,$w >> test.out
-:"
-:" Test that diffing shows correct filler lines
-:windo :bw!
-:enew
-:put =range(4,10)
-:1d _
-:vnew
-:put =range(1,10)
-:1d _
-:windo :diffthis
-:wincmd h
-:let w0=line('w0')
-:enew
-:put =w0
-:.w >> test.out
-:unlet! one two three nodiffsettings diffsettings diff_fdm diff_fdc nd1 nd2 nd3 w0
-:qa!
-ENDTEST
-
-1 aa
-2 bb
-3 cc
-4 dd
-5 ee
diff --git a/src/nvim/testdir/test47.ok b/src/nvim/testdir/test47.ok
deleted file mode 100644
index 83e96571ad..0000000000
--- a/src/nvim/testdir/test47.ok
+++ /dev/null
@@ -1,44 +0,0 @@
-2-4-5-6-8-9
-1-2-4-5-8
-2-3-4-5-6-7-8
-
-
-nodiff
- foldmethod=marker
- foldcolumn=4
-noscrollbind
-nocursorbind
- wrap
-
-
- diff
- foldmethod=diff
- foldcolumn=2
- scrollbind
- cursorbind
-nowrap
-
-
-nodiff
- foldmethod=marker
- foldcolumn=4
-noscrollbind
-nocursorbind
- wrap
-
-
-nodiff
- foldmethod=marker
- foldcolumn=4
-noscrollbind
-nocursorbind
- wrap
-
-
-nodiff
- foldmethod=marker
- foldcolumn=4
-noscrollbind
-nocursorbind
- wrap
-1
diff --git a/src/nvim/testdir/test49.vim b/src/nvim/testdir/test49.vim
index edd49a2b63..467abcd9b9 100644
--- a/src/nvim/testdir/test49.vim
+++ b/src/nvim/testdir/test49.vim
@@ -456,7 +456,7 @@ function! ExtraVim(...)
" messing up the user's viminfo file.
let redirect = a:0 ?
\ " -c 'au VimLeave * redir END' -c 'redir\\! >" . a:1 . "'" : ""
- exec "!echo '" . debug_quits . "q' | ../../../build/bin/nvim -u NONE -N -es" . redirect .
+ exec "!echo '" . debug_quits . "q' | $NVIM_PRG -u NONE -N -es" . redirect .
\ " -c 'debuggreedy|set viminfo+=nviminfo'" .
\ " -c 'let ExtraVimBegin = " . extra_begin . "'" .
\ " -c 'let ExtraVimResult = \"" . resultfile . "\"'" . breakpoints .
@@ -608,7 +608,7 @@ com! -nargs=1 -bar ExecAsScript call ExecAsScript(<f-args>)
" END_OF_TEST_ENVIRONMENT - do not change or remove this line.
-" Tests 1 to 15 were moved to test_viml.vim
+" Tests 1 to 15 were moved to test_vimscript.vim
let Xtest = 16
"-------------------------------------------------------------------------------
diff --git a/src/nvim/testdir/test53.in b/src/nvim/testdir/test53.in
deleted file mode 100644
index f3778c5192..0000000000
--- a/src/nvim/testdir/test53.in
+++ /dev/null
@@ -1,133 +0,0 @@
-Tests for string and html text objects. vim: set ft=vim :
-
-Note that the end-of-line moves the cursor to the next test line.
-
-Also test match() and matchstr()
-
-Also test the gn command and repeating it.
-
-STARTTEST
-/^start:/
-da"
-0va'a'rx
-02f`da`
-0fXdi"
-03f'vi'ry
-:set quoteescape=+*-
-di`
-$F"va"oha"i"rz
-:"
-/^<begin
-jfXdit
-0fXdit
-fXdat
-0fXdat
-dit
-:"
-:put =matchstr(\"abcd\", \".\", 0, 2) " b
-:put =matchstr(\"abcd\", \"..\", 0, 2) " bc
-:put =matchstr(\"abcd\", \".\", 2, 0) " c (zero and negative -> first match)
-:put =matchstr(\"abcd\", \".\", 0, -1) " a
-:put =match(\"abcd\", \".\", 0, 5) " -1
-:put =match(\"abcd\", \".\", 0, -1) " 0
-:put =match('abc', '.', 0, 1) " 0
-:put =match('abc', '.', 0, 2) " 1
-:put =match('abc', '.', 0, 3) " 2
-:put =match('abc', '.', 0, 4) " -1
-:put =match('abc', '.', 1, 1) " 1
-:put =match('abc', '.', 2, 1) " 2
-:put =match('abc', '.', 3, 1) " -1
-:put =match('abc', '$', 0, 1) " 3
-:put =match('abc', '$', 0, 2) " -1
-:put =match('abc', '$', 1, 1) " 3
-:put =match('abc', '$', 2, 1) " 3
-:put =match('abc', '$', 3, 1) " 3
-:put =match('abc', '$', 4, 1) " -1
-:put =match('abc', '\zs', 0, 1) " 0
-:put =match('abc', '\zs', 0, 2) " 1
-:put =match('abc', '\zs', 0, 3) " 2
-:put =match('abc', '\zs', 0, 4) " 3
-:put =match('abc', '\zs', 0, 5) " -1
-:put =match('abc', '\zs', 1, 1) " 1
-:put =match('abc', '\zs', 2, 1) " 2
-:put =match('abc', '\zs', 3, 1) " 3
-:put =match('abc', '\zs', 4, 1) " -1
-/^foobar
-gncsearchmatch/one\_s*two\_s
-:1
-gnd
-/[a]bcdx
-:1
-2gnd/join
-/$
-0gnd
-/\>\zs
-0gnd/^
-gnd$h/\zs
-gnd/[u]niquepattern/s
-vlgnd
-/mother
-:set selection=exclusive
-$cgNmongoose/i
-cgnj
-:" Make sure there is no other match y uppercase.
-/x59
-gggnd
-:" test repeating dgn
-/^Johnny
-ggdgn.
-:" test repeating gUgn
-/^Depp
-gggUgn.
-gg/a:0\@!\zs\d\+
-nygnop
-:/^start:/,/^end:/wq! test.out
-ENDTEST
-
-start: "wo\"rd\\" foo
-'foo' 'bar' 'piep'
-bla bla `quote` blah
-out " in "noXno"
-"'" 'blah' rep 'buh'
-bla `s*`d-`+++`l**` b`la
-voo "nah" sdf " asdf" sdf " sdf" sd
-
-<begin>
--<b>asdf<i>Xasdf</i>asdf</b>-
--<b>asdX<i>a<i />sdf</i>asdf</b>-
--<b>asdf<i>Xasdf</i>asdf</b>-
--<b>asdX<i>as<b />df</i>asdf</b>-
--<b>
-innertext object
-</b>
-</begin>
-SEARCH:
-foobar
-one
-two
-abcdx | abcdx | abcdx
-join
-lines
-zero width pattern
-delete first and last chars
-uniquepattern uniquepattern
-my very excellent mother just served us nachos
-for (i=0; i<=10; i++)
-a:10
-
-a:1
-
-a:20
-Y
-text
-Y
---1
-Johnny
---2
-Johnny
---3
-Depp
---4
-Depp
---5
-end:
diff --git a/src/nvim/testdir/test53.ok b/src/nvim/testdir/test53.ok
deleted file mode 100644
index 05206972a4..0000000000
--- a/src/nvim/testdir/test53.ok
+++ /dev/null
@@ -1,71 +0,0 @@
-start: foo
-xxxxxxxxxxxx'piep'
-bla bla blah
-out " in ""
-"'" 'blah'yyyyy'buh'
-bla `` b`la
-voo "zzzzzzzzzzzzzzzzzzzzzzzzzzzzsd
-
-<begin>
--<b>asdf<i></i>asdf</b>-
--<b></b>-
--<b>asdfasdf</b>-
---
--<b></b>
-</begin>
-b
-bc
-c
-a
--1
-0
-0
-1
-2
--1
-1
-2
--1
-3
--1
-3
-3
-3
--1
-0
-1
-2
-3
--1
-1
-2
-3
--1
-SEARCH:
-searchmatch
-abcdx | | abcdx
-join lines
-zerowidth pattern
-elete first and last char
- uniquepattern
-my very excellent mongoose just served us nachos
-for (j=0; i<=10; i++)
-a:10
-
-a:1
-1
-
-a:20
-
-text
-Y
---1
-
---2
-
---3
-DEPP
---4
-DEPP
---5
-end:
diff --git a/src/nvim/testdir/test64.in b/src/nvim/testdir/test64.in
index c4585ecbce..ec11e15e35 100644
--- a/src/nvim/testdir/test64.in
+++ b/src/nvim/testdir/test64.in
@@ -20,6 +20,7 @@ STARTTEST
:"""" Previously written tests """"""""""""""""""""""""""""""""
:""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
:"
+:set noautoindent
:call add(tl, [2, 'ab', 'aab', 'ab'])
:call add(tl, [2, 'b', 'abcdef', 'b'])
:call add(tl, [2, 'bc*', 'abccccdef', 'bcccc'])
@@ -577,7 +578,7 @@ Gop:"
:" Check patterns matching cursor position.
:func! Postest()
new
- call setline(1, ['ffooooo', 'boboooo', 'zoooooo', 'koooooo', 'moooooo', "\t\t\tfoo", 'abababababababfoo', 'bababababababafoo', '********_'])
+ call setline(1, ['ffooooo', 'boboooo', 'zoooooo', 'koooooo', 'moooooo', "\t\t\tfoo", 'abababababababfoo', 'bababababababafoo', '********_', ' xxxxxxxxxxxx xxxx xxxxxx xxxxxxx x xxxxxxxxx xx xxxxxx xxxxxx xxxxx xxxxxxx xx xxxx xxxxxxxx xxxx xxxxxxxxxxx xxx xxxxxxx xxxxxxxxx xx xxxxxx xx xxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxx xxx xxxxxxxx xxxxxxxxx xxxx xxx xxxx xxx xxx xxxxx xxxxxxxxxxxx xxxx xxxxxxxxx xxxxxxxxxxx xx xxxxx xxx xxxxxxxx xxxxxx xxx xxx xxxxxxxxx xxxxxxx x xxxxxxxxx xx xxxxxx xxxxxxx xxxxxxxxxxxxxxxxxx xxxxxxx xxxxxxx xxx xxx xxxxxxxx xxxxxxx xxxx xxx xxxxxx xxxxx xxxxx xx xxxxxx xxxxxxx xxx xxxxxxxxxxxx xxxx xxxxxxxxx xxxxxx xxxxxx xxxxx xxx xxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxx xxxxxxxxxx xxxx xx xxxxxxxx xxx xxxxxxxxxxx xxxxx'])
call setpos('.', [0, 1, 0, 0])
s/\%>3c.//g
call setpos('.', [0, 2, 4, 0])
@@ -589,6 +590,7 @@ Gop:"
%s/\%>6l\%3c./!/g
%s/\%>7l\%12c./?/g
%s/\%>7l\%<9l\%>5v\%<8v./#/g
+ $s/\%(|\u.*\)\@<=[^|\t]\+$//ge
1,$yank
quit!
endfunc
diff --git a/src/nvim/testdir/test64.ok b/src/nvim/testdir/test64.ok
index 92f06ea9f3..c218f8ea17 100644
--- a/src/nvim/testdir/test64.ok
+++ b/src/nvim/testdir/test64.ok
@@ -1076,6 +1076,7 @@ moooooo
ab!babababababfoo
ba!ab##abab?bafoo
**!*****_
+ ! xxx?xxxxxxxx xxxx xxxxxx xxxxxxx x xxxxxxxxx xx xxxxxx xxxxxx xxxxx xxxxxxx xx xxxx xxxxxxxx xxxx xxxxxxxxxxx xxx xxxxxxx xxxxxxxxx xx xxxxxx xx xxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxx xxx xxxxxxxx xxxxxxxxx xxxx xxx xxxx xxx xxx xxxxx xxxxxxxxxxxx xxxx xxxxxxxxx xxxxxxxxxxx xx xxxxx xxx xxxxxxxx xxxxxx xxx xxx xxxxxxxxx xxxxxxx x xxxxxxxxx xx xxxxxx xxxxxxx xxxxxxxxxxxxxxxxxx xxxxxxx xxxxxxx xxx xxx xxxxxxxx xxxxxxx xxxx xxx xxxxxx xxxxx xxxxx xx xxxxxx xxxxxxx xxx xxxxxxxxxxxx xxxx xxxxxxxxx xxxxxx xxxxxx xxxxx xxx xxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxx xxxxxxxxxx xxxx xx xxxxxxxx xxx xxxxxxxxxxx xxxxx
-1-
ffo
bob
@@ -1086,6 +1087,7 @@ moooooo
ab!babababababfoo
ba!ab##abab?bafoo
**!*****_
+ ! xxx?xxxxxxxx xxxx xxxxxx xxxxxxx x xxxxxxxxx xx xxxxxx xxxxxx xxxxx xxxxxxx xx xxxx xxxxxxxx xxxx xxxxxxxxxxx xxx xxxxxxx xxxxxxxxx xx xxxxxx xx xxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxx xxx xxxxxxxx xxxxxxxxx xxxx xxx xxxx xxx xxx xxxxx xxxxxxxxxxxx xxxx xxxxxxxxx xxxxxxxxxxx xx xxxxx xxx xxxxxxxx xxxxxx xxx xxx xxxxxxxxx xxxxxxx x xxxxxxxxx xx xxxxxx xxxxxxx xxxxxxxxxxxxxxxxxx xxxxxxx xxxxxxx xxx xxx xxxxxxxx xxxxxxx xxxx xxx xxxxxx xxxxx xxxxx xx xxxxxx xxxxxxx xxx xxxxxxxxxxxx xxxx xxxxxxxxx xxxxxx xxxxxx xxxxx xxx xxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxx xxxxxxxxxx xxxx xx xxxxxxxx xxx xxxxxxxxxxx xxxxx
-2-
ffo
bob
@@ -1096,6 +1098,7 @@ moooooo
ab!babababababfoo
ba!ab##abab?bafoo
**!*****_
+ ! xxx?xxxxxxxx xxxx xxxxxx xxxxxxx x xxxxxxxxx xx xxxxxx xxxxxx xxxxx xxxxxxx xx xxxx xxxxxxxx xxxx xxxxxxxxxxx xxx xxxxxxx xxxxxxxxx xx xxxxxx xx xxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxx xxx xxxxxxxx xxxxxxxxx xxxx xxx xxxx xxx xxx xxxxx xxxxxxxxxxxx xxxx xxxxxxxxx xxxxxxxxxxx xx xxxxx xxx xxxxxxxx xxxxxx xxx xxx xxxxxxxxx xxxxxxx x xxxxxxxxx xx xxxxxx xxxxxxx xxxxxxxxxxxxxxxxxx xxxxxxx xxxxxxx xxx xxx xxxxxxxx xxxxxxx xxxx xxx xxxxxx xxxxx xxxxx xx xxxxxx xxxxxxx xxx xxxxxxxxxxxx xxxx xxxxxxxxx xxxxxx xxxxxx xxxxx xxx xxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxx xxxxxxxxxx xxxx xx xxxxxxxx xxx xxxxxxxxxxx xxxxx
Test
Test END
EN
diff --git a/src/nvim/testdir/test69.in b/src/nvim/testdir/test69.in
deleted file mode 100644
index 39b360fc81..0000000000
--- a/src/nvim/testdir/test69.in
+++ /dev/null
@@ -1,191 +0,0 @@
-Test for multi-byte text formatting.
-Also test, that 'mps' with multibyte chars works.
-And test "ra" on multi-byte characters.
-Also test byteidx() and byteidxcomp()
-
-STARTTEST
-:
-ENDTEST
-
-Results of test69:
-
-STARTTEST
-/^{/+1
-:set tw=2 fo=t
-gqgqjgqgqo
-๏ผธ๏ผน๏ผบ
-abc ๏ผธ๏ผน๏ผบ
-ENDTEST
-
-{
-๏ผธ๏ผน๏ผบ
-abc ๏ผธ๏ผน๏ผบ
-}
-
-STARTTEST
-/^{/+1
-:set tw=1 fo=tm
-gqgqjgqgqjgqgqjgqgqjgqgqo
-๏ผธ
-๏ผธa
-๏ผธ a
-๏ผธ๏ผน
-๏ผธ ๏ผน
-ENDTEST
-
-{
-๏ผธ
-๏ผธa
-๏ผธ a
-๏ผธ๏ผน
-๏ผธ ๏ผน
-}
-
-STARTTEST
-/^{/+1
-:set tw=2 fo=tm
-gqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqo
-๏ผธ
-๏ผธa
-๏ผธ a
-๏ผธ๏ผน
-๏ผธ ๏ผน
-a๏ผธ
-ab๏ผธ
-abc๏ผธ
-ab๏ผธ c
-ab๏ผธ๏ผน
-ENDTEST
-
-{
-๏ผธ
-๏ผธa
-๏ผธ a
-๏ผธ๏ผน
-๏ผธ ๏ผน
-a๏ผธ
-ab๏ผธ
-abc๏ผธ
-ab๏ผธ c
-ab๏ผธ๏ผน
-}
-
-STARTTEST
-/^{/+1
-:set ai tw=2 fo=tm
-gqgqjgqgqo
-๏ผธ
-๏ผธa
-ENDTEST
-
-{
- ๏ผธ
- ๏ผธa
-}
-
-STARTTEST
-/^{/+1
-:set noai tw=2 fo=tm
-gqgqjgqgqo
- ๏ผธ
- ๏ผธa
-ENDTEST
-
-{
- ๏ผธ
- ๏ผธa
-}
-
-STARTTEST
-/^{/+1
-:set tw=2 fo=cqm comments=n:๏ผธ
-gqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqo
-๏ผธ
-๏ผธa
-๏ผธa๏ผน
-๏ผธ๏ผน
-๏ผธ๏ผน๏ผบ
-๏ผธ ๏ผน
-๏ผธ ๏ผน๏ผบ
-๏ผธ๏ผธ
-๏ผธ๏ผธa
-๏ผธ๏ผธ๏ผน
-ENDTEST
-
-{
-๏ผธ
-๏ผธa
-๏ผธa๏ผน
-๏ผธ๏ผน
-๏ผธ๏ผน๏ผบ
-๏ผธ ๏ผน
-๏ผธ ๏ผน๏ผบ
-๏ผธ๏ผธ
-๏ผธ๏ผธa
-๏ผธ๏ผธ๏ผน
-}
-
-STARTTEST
-/^{/+1
-:set tw=2 fo=tm
-R๏ผธa
-ENDTEST
-
-{
-
-}
-
-STARTTEST
-/^{/+1
-:set mps+=u2018:u2019
-d%
-ENDTEST
-
-{
-โ€˜ two three โ€™ four
-}
-STARTTEST
-/^ra test
-jVjra
-ENDTEST
-
-ra test
-๏ฝbb๏ฝ
-๏ฝ๏ฝb
-
-STARTTEST
-:set whichwrap+=h
-/^x
-dh
-:set whichwrap-=h
-ENDTEST
-
-รก
-x
-
-STARTTEST
-:let a = '.รฉ.' " one char of two bytes
-:let b = '.eฬ.' " normal e with composing char
-/^byteidx
-:put =string([byteidx(a, 0), byteidx(a, 1), byteidx(a, 2), byteidx(a, 3), byteidx(a, 4)])
-:put =string([byteidx(b, 0), byteidx(b, 1), byteidx(b, 2), byteidx(b, 3), byteidx(b, 4)])
-/^byteidxcomp
-:put =string([byteidxcomp(a, 0), byteidxcomp(a, 1), byteidxcomp(a, 2), byteidxcomp(a, 3), byteidxcomp(a, 4)])
-:let b = '.eฬ.'
-:put =string([byteidxcomp(b, 0), byteidxcomp(b, 1), byteidxcomp(b, 2), byteidxcomp(b, 3), byteidxcomp(b, 4), byteidxcomp(b, 5)])
-ENDTEST
-
-byteidx
-byteidxcomp
-
-STARTTEST
-/^substitute
-:let y = substitute('๏ผ‘๏ผ’๏ผ“', '\zs', 'a', 'g') | put =y
-ENDTEST
-
-substitute
-
-STARTTEST
-:g/^STARTTEST/.,/^ENDTEST/d
-:1;/^Results/,$wq! test.out
-ENDTEST
diff --git a/src/nvim/testdir/test69.ok b/src/nvim/testdir/test69.ok
deleted file mode 100644
index af8befb0c7..0000000000
--- a/src/nvim/testdir/test69.ok
+++ /dev/null
@@ -1,166 +0,0 @@
-Results of test69:
-
-
-{
-๏ผธ๏ผน๏ผบ
-abc
-๏ผธ๏ผน๏ผบ
-
-๏ผธ๏ผน๏ผบ
-abc
-๏ผธ๏ผน๏ผบ
-}
-
-
-{
-๏ผธ
-๏ผธ
-a
-๏ผธ
-a
-๏ผธ
-๏ผน
-๏ผธ
-๏ผน
-
-๏ผธ
-๏ผธ
-a
-๏ผธ
-a
-๏ผธ
-๏ผน
-๏ผธ
-๏ผน
-}
-
-
-{
-๏ผธ
-๏ผธ
-a
-๏ผธ
-a
-๏ผธ
-๏ผน
-๏ผธ
-๏ผน
-a
-๏ผธ
-ab
-๏ผธ
-abc
-๏ผธ
-ab
-๏ผธ
-c
-ab
-๏ผธ
-๏ผน
-
-๏ผธ
-๏ผธ
-a
-๏ผธ
-a
-๏ผธ
-๏ผน
-๏ผธ
-๏ผน
-a
-๏ผธ
-ab
-๏ผธ
-abc
-๏ผธ
-ab
-๏ผธ
-c
-ab
-๏ผธ
-๏ผน
-}
-
-
-{
- ๏ผธ
- ๏ผธ
- a
-
- ๏ผธ
- ๏ผธ
- a
-}
-
-
-{
- ๏ผธ
- ๏ผธ
-a
-
- ๏ผธ
- ๏ผธ
-a
-}
-
-
-{
-๏ผธ
-๏ผธa
-๏ผธa
-๏ผธ๏ผน
-๏ผธ๏ผน
-๏ผธ๏ผน
-๏ผธ๏ผบ
-๏ผธ ๏ผน
-๏ผธ ๏ผน
-๏ผธ ๏ผบ
-๏ผธ๏ผธ
-๏ผธ๏ผธa
-๏ผธ๏ผธ๏ผน
-
-๏ผธ
-๏ผธa
-๏ผธa
-๏ผธ๏ผน
-๏ผธ๏ผน
-๏ผธ๏ผน
-๏ผธ๏ผบ
-๏ผธ ๏ผน
-๏ผธ ๏ผน
-๏ผธ ๏ผบ
-๏ผธ๏ผธ
-๏ผธ๏ผธa
-๏ผธ๏ผธ๏ผน
-}
-
-
-{
-๏ผธ
-a
-}
-
-
-{
- four
-}
-
-ra test
-aaaa
-aaa
-
-
-รกx
-
-
-byteidx
-[0, 1, 3, 4, -1]
-[0, 1, 4, 5, -1]
-byteidxcomp
-[0, 1, 3, 4, -1]
-[0, 1, 2, 4, 5, -1]
-
-
-substitute
-a๏ผ‘a๏ผ’a๏ผ“a
-
diff --git a/src/nvim/testdir/test73.in b/src/nvim/testdir/test73.in
deleted file mode 100644
index 7d6c7287a5..0000000000
--- a/src/nvim/testdir/test73.in
+++ /dev/null
@@ -1,175 +0,0 @@
-Tests for find completion.
-
-STARTTEST
-:set wildmode=full
-:" Do all test in a separate window to avoid E211 when we recursively
-:" delete the Xfind directory during cleanup
-:"
-:" This will cause a few errors, do it silently.
-:set visualbell
-:"
-:function! DeleteDirectory(dir)
-: if has("win16") || has("win32") || has("win64") || has("dos16") || has("dos32")
-: exec "silent !rmdir /Q /S " . a:dir
-: else
-: exec "silent !rm -rf " . a:dir
-: endif
-:endfun
-:" On windows a stale "Xfind" directory may exist, remove it so that
-:" we start from a clean state.
-:call DeleteDirectory("Xfind")
-:new
-:let cwd=getcwd()
-:let test_out = cwd . '/test.out'
-:call mkdir('Xfind')
-:cd Xfind
-:set path=
-:find
-:exec "w! " . test_out
-:close
-:new
-:set path=.
-:find
-:exec "w >>" . test_out
-:close
-:new
-:set path=.,,
-:find
-:exec "w >>" . test_out
-:close
-:new
-:set path=./**
-:find
-:exec "w >>" . test_out
-:close
-:new
-:" We shouldn't find any file at this point, test.out must be empty.
-:call mkdir('in')
-:cd in
-:call mkdir('path')
-:exec "cd " . cwd
-:e Xfind/file.txt
-SHoly Grail:w
-:e Xfind/in/file.txt
-SJimmy Hoffa:w
-:e Xfind/in/stuff.txt
-SAnother Holy Grail:w
-:e Xfind/in/path/file.txt
-SE.T.:w
-:set path=Xfind/**
-:find file
-:exec "w >>" . test_out
-:find file
-:exec "w >>" . test_out
-:find file
-:exec "w >>" . test_out
-:" Rerun the previous three find completions, using fullpath in 'path'
-:exec "set path=" . cwd . "/Xfind/**"
-:find file
-:exec "w >>" . test_out
-:find file
-:exec "w >>" . test_out
-:find file
-:exec "w >>" . test_out
-:" Same steps again, using relative and fullpath items that point to the same
-:" recursive location.
-:" This is to test that there are no duplicates in the completion list.
-:exec "set path+=Xfind/**"
-:find file
-:exec "w >>" . test_out
-:find file
-:exec "w >>" . test_out
-:find file
-:exec "w >>" . test_out
-:find file
-:" Test find completion for directory of current buffer, which at this point
-:" is Xfind/in/file.txt.
-:set path=.
-:find st
-:exec "w >>" . test_out
-:" Test find completion for empty path item ",," which is the current directory
-:cd Xfind
-:set path=,,
-:find f
-:exec "w >>" . test_out
-:" Test shortening of
-:"
-:" foo/x/bar/voyager.txt
-:" foo/y/bar/voyager.txt
-:"
-:" When current directory is above foo/ they should be shortened to (in order
-:" of appearance):
-:"
-:" x/bar/voyager.txt
-:" y/bar/voyager.txt
-:call mkdir('foo')
-:cd foo
-:call mkdir('x')
-:call mkdir('y')
-:cd x
-:call mkdir('bar')
-:cd ..
-:cd y
-:call mkdir('bar')
-:cd ..
-:cd ..
-:" We should now be in the Xfind directory
-:e foo/x/bar/voyager.txt
-SVoyager 1:w
-:e foo/y/bar/voyager.txt
-SVoyager 2:w
-:exec "set path=" . cwd . "/Xfind/**"
-:find voyager
-:exec "w >>" . test_out
-:find voyager
-:exec "w >>" . test_out
-:"
-:" When current directory is .../foo/y/bar they should be shortened to (in
-:" order of appearance):
-:"
-:" ./voyager.txt
-:" x/bar/voyager.txt
-:cd foo
-:cd y
-:cd bar
-:find voyager
-:exec "w >> " . test_out
-:find voyager
-:exec "w >> " . test_out
-:" Check the opposite too:
-:cd ..
-:cd ..
-:cd x
-:cd bar
-:find voyager
-:exec "w >> " . test_out
-:find voyager
-:exec "w >> " . test_out
-:" Check for correct handling of shorten_fname()'s behavior on windows
-:exec "cd " . cwd . "/Xfind/in"
-:find file
-:exec "w >>" . test_out
-:" Test for relative to current buffer 'path' item
-:exec "cd " . cwd . "/Xfind/"
-:set path=./path
-:" Open the file where Jimmy Hoffa is found
-:e in/file.txt
-:" Find the file containing 'E.T.' in the Xfind/in/path directory
-:find file
-:exec "w >>" . test_out
-:"
-:" Test that completion works when path=.,,
-:"
-:set path=.,,
-:" Open Jimmy Hoffa file
-:e in/file.txt
-:exec "w >>" . test_out
-:" Search for the file containing Holy Grail in same directory as in/path.txt
-:find stu
-:exec "w >>" . test_out
-:q
-:exec "cd " . cwd
-:call DeleteDirectory("Xfind")
-:qa!
-ENDTEST
-
diff --git a/src/nvim/testdir/test73.ok b/src/nvim/testdir/test73.ok
deleted file mode 100644
index 90efab756f..0000000000
--- a/src/nvim/testdir/test73.ok
+++ /dev/null
@@ -1,21 +0,0 @@
-Holy Grail
-Jimmy Hoffa
-E.T.
-Holy Grail
-Jimmy Hoffa
-E.T.
-Holy Grail
-Jimmy Hoffa
-E.T.
-Another Holy Grail
-Holy Grail
-Voyager 1
-Voyager 2
-Voyager 2
-Voyager 1
-Voyager 1
-Voyager 2
-Jimmy Hoffa
-E.T.
-Jimmy Hoffa
-Another Holy Grail
diff --git a/src/nvim/testdir/test79.in b/src/nvim/testdir/test79.in
deleted file mode 100644
index afbf2083d2..0000000000
--- a/src/nvim/testdir/test79.in
+++ /dev/null
Binary files differ
diff --git a/src/nvim/testdir/test79.ok b/src/nvim/testdir/test79.ok
deleted file mode 100644
index d4e0ae8819..0000000000
--- a/src/nvim/testdir/test79.ok
+++ /dev/null
Binary files differ
diff --git a/src/nvim/testdir/test8.in b/src/nvim/testdir/test8.in
deleted file mode 100644
index a5e6034782..0000000000
--- a/src/nvim/testdir/test8.in
+++ /dev/null
@@ -1,43 +0,0 @@
-Test for BufWritePre autocommand that deletes or unloads the buffer.
-Test for BufUnload autocommand that unloads all other buffers.
-
-STARTTEST
-:au BufWritePre Xxx1 bunload
-:au BufWritePre Xxx2 bwipe
-/^start of
-A1:.,/end of/w! Xxx1 " write test file Xxx1
-$r2:.,/end of/w! Xxx2 " write test file Xxx2
-:e! Xxx2 " edit Xxx2
-:bdel test8.in " delete this file from the buffer list
-:e Xxx1 " edit Xxx1
-:w " write it, will unload it and give an error msg
-:w! test.out " Write contents of this file
-:e! Xxx2 " start editing Xxx2
-:bwipe test.out " remove test.out from the buffer list
-:w " write it, will delete the buffer and give an error msg
-:w >>test.out " Append contents of this file
-:au! BufWritePre
-:func CloseAll()
- let i = 0
- while i <= bufnr('$')
- if i != bufnr('%') && bufloaded(i)
- exe i . "bunload"
- endif
- let i += 1
- endwhile
-endfunc
-:func WriteToOut()
- edit! test.out
- $put ='VimLeave done'
- write
-endfunc
-:set shada='100
-:au BufUnload * call CloseAll()
-:au VimLeave * call WriteToOut()
-:q
-:qa!
-ENDTEST
-
-start of Xxx
- test
-end of Xxx
diff --git a/src/nvim/testdir/test8.ok b/src/nvim/testdir/test8.ok
deleted file mode 100644
index adecb2f4be..0000000000
--- a/src/nvim/testdir/test8.ok
+++ /dev/null
@@ -1,7 +0,0 @@
-start of Xxx2
- test
-end of Xxx
-start of Xxx1
- test
-end of Xxx
-VimLeave done
diff --git a/src/nvim/testdir/test_alot.vim b/src/nvim/testdir/test_alot.vim
index 1d1da94bac..0602ff6a45 100644
--- a/src/nvim/testdir/test_alot.vim
+++ b/src/nvim/testdir/test_alot.vim
@@ -1,3 +1,53 @@
" A series of tests that can run in one Vim invocation.
" This makes testing go faster, since Vim doesn't need to restart.
+source test_assign.vim
+source test_behave.vim
+source test_cd.vim
+source test_changedtick.vim
+source test_compiler.vim
+source test_cursor_func.vim
+source test_ex_undo.vim
+source test_ex_z.vim
+source test_execute_func.vim
+source test_expr.vim
+source test_feedkeys.vim
+source test_filter_cmd.vim
+source test_filter_map.vim
+source test_findfile.vim
+source test_float_func.vim
+source test_functions.vim
+source test_ga.vim
+source test_global.vim
+source test_goto.vim
+source test_join.vim
+source test_jumps.vim
+source test_fileformat.vim
+source test_filetype.vim
+source test_lambda.vim
+source test_mapping.vim
+source test_menu.vim
+source test_messages.vim
+source test_move.vim
+source test_partial.vim
+source test_popup.vim
+source test_put.vim
+source test_recover.vim
+source test_regexp_utf8.vim
+source test_scroll_opt.vim
+source test_sort.vim
+source test_source_utf8.vim
+source test_sha256.vim
+source test_statusline.vim
+source test_suspend.vim
+source test_syn_attr.vim
+source test_tabline.vim
+" source test_tabpage.vim
+source test_tagcase.vim
+source test_tagjump.vim
+source test_taglist.vim
+source test_true_false.vim
+source test_unlet.vim
+source test_utf8.vim
+source test_virtualedit.vim
+source test_window_cmd.vim
diff --git a/src/nvim/testdir/test_alot_latin.vim b/src/nvim/testdir/test_alot_latin.vim
new file mode 100644
index 0000000000..ebb3bde4ce
--- /dev/null
+++ b/src/nvim/testdir/test_alot_latin.vim
@@ -0,0 +1,10 @@
+" A series of tests that can run in one Vim invocation.
+" This makes testing go faster, since Vim doesn't need to restart.
+
+" These tests use latin1 'encoding'. Setting 'encoding' is in the individual
+" files, so that they can be run by themselves.
+
+" Nvim does not allow setting 'encoding', so skip this test group.
+finish
+
+source test_regexp_latin.vim
diff --git a/src/nvim/testdir/test_alot_utf8.vim b/src/nvim/testdir/test_alot_utf8.vim
new file mode 100644
index 0000000000..648d806a94
--- /dev/null
+++ b/src/nvim/testdir/test_alot_utf8.vim
@@ -0,0 +1,17 @@
+" A series of tests that can run in one Vim invocation.
+" This makes testing go faster, since Vim doesn't need to restart.
+
+" These tests use utf8 'encoding'. Setting 'encoding' is already done in
+" runtest.vim. Checking for the multi_byte feature is in the individual
+" files, so that they can be run by themselves.
+
+source test_charsearch_utf8.vim
+source test_expr_utf8.vim
+source test_listlbr_utf8.vim
+source test_matchadd_conceal_utf8.vim
+source test_mksession_utf8.vim
+source test_regexp_utf8.vim
+source test_source_utf8.vim
+source test_startup_utf8.vim
+source test_utf8.vim
+source test_utf8_comparisons.vim
diff --git a/src/nvim/testdir/test_arabic.vim b/src/nvim/testdir/test_arabic.vim
new file mode 100644
index 0000000000..17e925ee7f
--- /dev/null
+++ b/src/nvim/testdir/test_arabic.vim
@@ -0,0 +1,613 @@
+" Simplistic testing of Arabic mode.
+" NOTE: This just checks if the code works. If you know Arabic please add
+" functional tests that check the shaping works with real text.
+
+if !has('arabic') || !has('multi_byte')
+ finish
+endif
+
+source view_util.vim
+
+" Return list of Unicode characters at line lnum.
+" Combining characters are treated as a single item.
+func s:get_chars(lnum)
+ call cursor(a:lnum, 1)
+ let chars = []
+ let numchars = strchars(getline('.'), 1)
+ for i in range(1, numchars)
+ exe 'norm ' i . '|'
+ let c = execute('ascii')
+ let c = substitute(c, '\n\?<.\{-}Hex\s*', 'U+', 'g')
+ let c = substitute(c, ',\s*Oct\(al\)\=\s\d*\(, Digr ..\)\=', '', 'g')
+ call add(chars, c)
+ endfor
+ return chars
+endfunc
+
+func Test_arabic_toggle()
+ set arabic
+ call assert_equal(1, &rightleft)
+ call assert_equal(1, &arabicshape)
+ call assert_equal('arabic', &keymap)
+ call assert_equal(1, &delcombine)
+
+ set iminsert=1 imsearch=1
+ set arabic&
+ call assert_equal(0, &rightleft)
+ call assert_equal(1, &arabicshape)
+ call assert_equal('arabic', &keymap)
+ call assert_equal(1, &delcombine)
+ call assert_equal(0, &iminsert)
+ call assert_equal(-1, &imsearch)
+
+ set arabicshape& keymap= delcombine&
+endfunc
+
+func Test_arabic_input()
+ new
+ set arabic
+ " Typing sghl in Arabic insert mode should show the
+ " Arabic word 'Salaam' i.e. 'peace', spelled:
+ " SEEN, LAM, ALEF, MEEM.
+ " See: https://www.mediawiki.org/wiki/VisualEditor/Typing/Right-to-left
+ call feedkeys('isghl!', 'tx')
+ call assert_match("^ *!\uFEE1\uFEFC\uFEB3$", ScreenLines(1, &columns)[0])
+ call assert_equal([
+ \ 'U+0633',
+ \ 'U+0644 U+0627',
+ \ 'U+0645',
+ \ 'U+21'], s:get_chars(1))
+
+ " Without shaping, it should give individual Arabic letters.
+ set noarabicshape
+ call assert_match("^ *!\u0645\u0627\u0644\u0633$", ScreenLines(1, &columns)[0])
+ call assert_equal([
+ \ 'U+0633',
+ \ 'U+0644',
+ \ 'U+0627',
+ \ 'U+0645',
+ \ 'U+21'], s:get_chars(1))
+
+ set arabic& arabicshape&
+ bwipe!
+endfunc
+
+func Test_arabic_toggle_keymap()
+ new
+ set arabic
+ call feedkeys("i12\<C-^>12\<C-^>12", 'tx')
+ call assert_match("^ *ูขูก21ูขูก$", ScreenLines(1, &columns)[0])
+ call assert_equal('ูกูข12ูกูข', getline('.'))
+ set arabic&
+ bwipe!
+endfunc
+
+func Test_delcombine()
+ new
+ set arabic
+ call feedkeys("isghl\<BS>\<BS>", 'tx')
+ call assert_match("^ *\uFEDE\uFEB3$", ScreenLines(1, &columns)[0])
+ call assert_equal(['U+0633', 'U+0644'], s:get_chars(1))
+
+ " Now the same with 'nodelcombine'
+ set nodelcombine
+ %d
+ call feedkeys("isghl\<BS>\<BS>", 'tx')
+ call assert_match("^ *\uFEB1$", ScreenLines(1, &columns)[0])
+ call assert_equal(['U+0633'], s:get_chars(1))
+ set arabic&
+ bwipe!
+endfunc
+
+" Values from src/arabic.h (not all used yet)
+let s:a_COMMA = "\u060C"
+let s:a_SEMICOLON = "\u061B"
+let s:a_QUESTION = "\u061F"
+let s:a_HAMZA = "\u0621"
+let s:a_ALEF_MADDA = "\u0622"
+let s:a_ALEF_HAMZA_ABOVE = "\u0623"
+let s:a_WAW_HAMZA = "\u0624"
+let s:a_ALEF_HAMZA_BELOW = "\u0625"
+let s:a_YEH_HAMZA = "\u0626"
+let s:a_ALEF = "\u0627"
+let s:a_BEH = "\u0628"
+let s:a_TEH_MARBUTA = "\u0629"
+let s:a_TEH = "\u062a"
+let s:a_THEH = "\u062b"
+let s:a_JEEM = "\u062c"
+let s:a_HAH = "\u062d"
+let s:a_KHAH = "\u062e"
+let s:a_DAL = "\u062f"
+let s:a_THAL = "\u0630"
+let s:a_REH = "\u0631"
+let s:a_ZAIN = "\u0632"
+let s:a_SEEN = "\u0633"
+let s:a_SHEEN = "\u0634"
+let s:a_SAD = "\u0635"
+let s:a_DAD = "\u0636"
+let s:a_TAH = "\u0637"
+let s:a_ZAH = "\u0638"
+let s:a_AIN = "\u0639"
+let s:a_GHAIN = "\u063a"
+let s:a_TATWEEL = "\u0640"
+let s:a_FEH = "\u0641"
+let s:a_QAF = "\u0642"
+let s:a_KAF = "\u0643"
+let s:a_LAM = "\u0644"
+let s:a_MEEM = "\u0645"
+let s:a_NOON = "\u0646"
+let s:a_HEH = "\u0647"
+let s:a_WAW = "\u0648"
+let s:a_ALEF_MAKSURA = "\u0649"
+let s:a_YEH = "\u064a"
+
+let s:a_FATHATAN = "\u064b"
+let s:a_DAMMATAN = "\u064c"
+let s:a_KASRATAN = "\u064d"
+let s:a_FATHA = "\u064e"
+let s:a_DAMMA = "\u064f"
+let s:a_KASRA = "\u0650"
+let s:a_SHADDA = "\u0651"
+let s:a_SUKUN = "\u0652"
+
+let s:a_MADDA_ABOVE = "\u0653"
+let s:a_HAMZA_ABOVE = "\u0654"
+let s:a_HAMZA_BELOW = "\u0655"
+
+let s:a_ZERO = "\u0660"
+let s:a_ONE = "\u0661"
+let s:a_TWO = "\u0662"
+let s:a_THREE = "\u0663"
+let s:a_FOUR = "\u0664"
+let s:a_FIVE = "\u0665"
+let s:a_SIX = "\u0666"
+let s:a_SEVEN = "\u0667"
+let s:a_EIGHT = "\u0668"
+let s:a_NINE = "\u0669"
+let s:a_PERCENT = "\u066a"
+let s:a_DECIMAL = "\u066b"
+let s:a_THOUSANDS = "\u066c"
+let s:a_STAR = "\u066d"
+let s:a_MINI_ALEF = "\u0670"
+
+let s:a_s_FATHATAN = "\ufe70"
+let s:a_m_TATWEEL_FATHATAN = "\ufe71"
+let s:a_s_DAMMATAN = "\ufe72"
+
+let s:a_s_KASRATAN = "\ufe74"
+
+let s:a_s_FATHA = "\ufe76"
+let s:a_m_FATHA = "\ufe77"
+let s:a_s_DAMMA = "\ufe78"
+let s:a_m_DAMMA = "\ufe79"
+let s:a_s_KASRA = "\ufe7a"
+let s:a_m_KASRA = "\ufe7b"
+let s:a_s_SHADDA = "\ufe7c"
+let s:a_m_SHADDA = "\ufe7d"
+let s:a_s_SUKUN = "\ufe7e"
+let s:a_m_SUKUN = "\ufe7f"
+
+let s:a_s_HAMZA = "\ufe80"
+let s:a_s_ALEF_MADDA = "\ufe81"
+let s:a_f_ALEF_MADDA = "\ufe82"
+let s:a_s_ALEF_HAMZA_ABOVE = "\ufe83"
+let s:a_f_ALEF_HAMZA_ABOVE = "\ufe84"
+let s:a_s_WAW_HAMZA = "\ufe85"
+let s:a_f_WAW_HAMZA = "\ufe86"
+let s:a_s_ALEF_HAMZA_BELOW = "\ufe87"
+let s:a_f_ALEF_HAMZA_BELOW = "\ufe88"
+let s:a_s_YEH_HAMZA = "\ufe89"
+let s:a_f_YEH_HAMZA = "\ufe8a"
+let s:a_i_YEH_HAMZA = "\ufe8b"
+let s:a_m_YEH_HAMZA = "\ufe8c"
+let s:a_s_ALEF = "\ufe8d"
+let s:a_f_ALEF = "\ufe8e"
+let s:a_s_BEH = "\ufe8f"
+let s:a_f_BEH = "\ufe90"
+let s:a_i_BEH = "\ufe91"
+let s:a_m_BEH = "\ufe92"
+let s:a_s_TEH_MARBUTA = "\ufe93"
+let s:a_f_TEH_MARBUTA = "\ufe94"
+let s:a_s_TEH = "\ufe95"
+let s:a_f_TEH = "\ufe96"
+let s:a_i_TEH = "\ufe97"
+let s:a_m_TEH = "\ufe98"
+let s:a_s_THEH = "\ufe99"
+let s:a_f_THEH = "\ufe9a"
+let s:a_i_THEH = "\ufe9b"
+let s:a_m_THEH = "\ufe9c"
+let s:a_s_JEEM = "\ufe9d"
+let s:a_f_JEEM = "\ufe9e"
+let s:a_i_JEEM = "\ufe9f"
+let s:a_m_JEEM = "\ufea0"
+let s:a_s_HAH = "\ufea1"
+let s:a_f_HAH = "\ufea2"
+let s:a_i_HAH = "\ufea3"
+let s:a_m_HAH = "\ufea4"
+let s:a_s_KHAH = "\ufea5"
+let s:a_f_KHAH = "\ufea6"
+let s:a_i_KHAH = "\ufea7"
+let s:a_m_KHAH = "\ufea8"
+let s:a_s_DAL = "\ufea9"
+let s:a_f_DAL = "\ufeaa"
+let s:a_s_THAL = "\ufeab"
+let s:a_f_THAL = "\ufeac"
+let s:a_s_REH = "\ufead"
+let s:a_f_REH = "\ufeae"
+let s:a_s_ZAIN = "\ufeaf"
+let s:a_f_ZAIN = "\ufeb0"
+let s:a_s_SEEN = "\ufeb1"
+let s:a_f_SEEN = "\ufeb2"
+let s:a_i_SEEN = "\ufeb3"
+let s:a_m_SEEN = "\ufeb4"
+let s:a_s_SHEEN = "\ufeb5"
+let s:a_f_SHEEN = "\ufeb6"
+let s:a_i_SHEEN = "\ufeb7"
+let s:a_m_SHEEN = "\ufeb8"
+let s:a_s_SAD = "\ufeb9"
+let s:a_f_SAD = "\ufeba"
+let s:a_i_SAD = "\ufebb"
+let s:a_m_SAD = "\ufebc"
+let s:a_s_DAD = "\ufebd"
+let s:a_f_DAD = "\ufebe"
+let s:a_i_DAD = "\ufebf"
+let s:a_m_DAD = "\ufec0"
+let s:a_s_TAH = "\ufec1"
+let s:a_f_TAH = "\ufec2"
+let s:a_i_TAH = "\ufec3"
+let s:a_m_TAH = "\ufec4"
+let s:a_s_ZAH = "\ufec5"
+let s:a_f_ZAH = "\ufec6"
+let s:a_i_ZAH = "\ufec7"
+let s:a_m_ZAH = "\ufec8"
+let s:a_s_AIN = "\ufec9"
+let s:a_f_AIN = "\ufeca"
+let s:a_i_AIN = "\ufecb"
+let s:a_m_AIN = "\ufecc"
+let s:a_s_GHAIN = "\ufecd"
+let s:a_f_GHAIN = "\ufece"
+let s:a_i_GHAIN = "\ufecf"
+let s:a_m_GHAIN = "\ufed0"
+let s:a_s_FEH = "\ufed1"
+let s:a_f_FEH = "\ufed2"
+let s:a_i_FEH = "\ufed3"
+let s:a_m_FEH = "\ufed4"
+let s:a_s_QAF = "\ufed5"
+let s:a_f_QAF = "\ufed6"
+let s:a_i_QAF = "\ufed7"
+let s:a_m_QAF = "\ufed8"
+let s:a_s_KAF = "\ufed9"
+let s:a_f_KAF = "\ufeda"
+let s:a_i_KAF = "\ufedb"
+let s:a_m_KAF = "\ufedc"
+let s:a_s_LAM = "\ufedd"
+let s:a_f_LAM = "\ufede"
+let s:a_i_LAM = "\ufedf"
+let s:a_m_LAM = "\ufee0"
+let s:a_s_MEEM = "\ufee1"
+let s:a_f_MEEM = "\ufee2"
+let s:a_i_MEEM = "\ufee3"
+let s:a_m_MEEM = "\ufee4"
+let s:a_s_NOON = "\ufee5"
+let s:a_f_NOON = "\ufee6"
+let s:a_i_NOON = "\ufee7"
+let s:a_m_NOON = "\ufee8"
+let s:a_s_HEH = "\ufee9"
+let s:a_f_HEH = "\ufeea"
+let s:a_i_HEH = "\ufeeb"
+let s:a_m_HEH = "\ufeec"
+let s:a_s_WAW = "\ufeed"
+let s:a_f_WAW = "\ufeee"
+let s:a_s_ALEF_MAKSURA = "\ufeef"
+let s:a_f_ALEF_MAKSURA = "\ufef0"
+let s:a_s_YEH = "\ufef1"
+let s:a_f_YEH = "\ufef2"
+let s:a_i_YEH = "\ufef3"
+let s:a_m_YEH = "\ufef4"
+let s:a_s_LAM_ALEF_MADDA_ABOVE = "\ufef5"
+let s:a_f_LAM_ALEF_MADDA_ABOVE = "\ufef6"
+let s:a_s_LAM_ALEF_HAMZA_ABOVE = "\ufef7"
+let s:a_f_LAM_ALEF_HAMZA_ABOVE = "\ufef8"
+let s:a_s_LAM_ALEF_HAMZA_BELOW = "\ufef9"
+let s:a_f_LAM_ALEF_HAMZA_BELOW = "\ufefa"
+let s:a_s_LAM_ALEF = "\ufefb"
+let s:a_f_LAM_ALEF = "\ufefc"
+
+let s:a_BYTE_ORDER_MARK = "\ufeff"
+
+func Test_shape_initial()
+ new
+ set arabicshape
+
+ " Shaping arabic {testchar} non-arabic Tests chg_c_a2i().
+ " pair[0] = testchar, pair[1] = next-result, pair[2] = current-result
+ for pair in [[s:a_YEH_HAMZA, s:a_f_GHAIN, s:a_i_YEH_HAMZA],
+ \ [s:a_HAMZA, s:a_s_GHAIN, s:a_s_HAMZA],
+ \ [s:a_ALEF_MADDA, s:a_s_GHAIN, s:a_s_ALEF_MADDA],
+ \ [s:a_ALEF_HAMZA_ABOVE, s:a_s_GHAIN, s:a_s_ALEF_HAMZA_ABOVE],
+ \ [s:a_WAW_HAMZA, s:a_s_GHAIN, s:a_s_WAW_HAMZA],
+ \ [s:a_ALEF_HAMZA_BELOW, s:a_s_GHAIN, s:a_s_ALEF_HAMZA_BELOW],
+ \ [s:a_ALEF, s:a_s_GHAIN, s:a_s_ALEF],
+ \ [s:a_TEH_MARBUTA, s:a_s_GHAIN, s:a_s_TEH_MARBUTA],
+ \ [s:a_DAL, s:a_s_GHAIN, s:a_s_DAL],
+ \ [s:a_THAL, s:a_s_GHAIN, s:a_s_THAL],
+ \ [s:a_REH, s:a_s_GHAIN, s:a_s_REH],
+ \ [s:a_ZAIN, s:a_s_GHAIN, s:a_s_ZAIN],
+ \ [s:a_TATWEEL, s:a_f_GHAIN, s:a_TATWEEL],
+ \ [s:a_WAW, s:a_s_GHAIN, s:a_s_WAW],
+ \ [s:a_ALEF_MAKSURA, s:a_s_GHAIN, s:a_s_ALEF_MAKSURA],
+ \ [s:a_BEH, s:a_f_GHAIN, s:a_i_BEH],
+ \ [s:a_TEH, s:a_f_GHAIN, s:a_i_TEH],
+ \ [s:a_THEH, s:a_f_GHAIN, s:a_i_THEH],
+ \ [s:a_JEEM, s:a_f_GHAIN, s:a_i_JEEM],
+ \ [s:a_HAH, s:a_f_GHAIN, s:a_i_HAH],
+ \ [s:a_KHAH, s:a_f_GHAIN, s:a_i_KHAH],
+ \ [s:a_SEEN, s:a_f_GHAIN, s:a_i_SEEN],
+ \ [s:a_SHEEN, s:a_f_GHAIN, s:a_i_SHEEN],
+ \ [s:a_SAD, s:a_f_GHAIN, s:a_i_SAD],
+ \ [s:a_DAD, s:a_f_GHAIN, s:a_i_DAD],
+ \ [s:a_TAH, s:a_f_GHAIN, s:a_i_TAH],
+ \ [s:a_ZAH, s:a_f_GHAIN, s:a_i_ZAH],
+ \ [s:a_AIN, s:a_f_GHAIN, s:a_i_AIN],
+ \ [s:a_GHAIN, s:a_f_GHAIN, s:a_i_GHAIN],
+ \ [s:a_FEH, s:a_f_GHAIN, s:a_i_FEH],
+ \ [s:a_QAF, s:a_f_GHAIN, s:a_i_QAF],
+ \ [s:a_KAF, s:a_f_GHAIN, s:a_i_KAF],
+ \ [s:a_LAM, s:a_f_GHAIN, s:a_i_LAM],
+ \ [s:a_MEEM, s:a_f_GHAIN, s:a_i_MEEM],
+ \ [s:a_NOON, s:a_f_GHAIN, s:a_i_NOON],
+ \ [s:a_HEH, s:a_f_GHAIN, s:a_i_HEH],
+ \ [s:a_YEH, s:a_f_GHAIN, s:a_i_YEH],
+ \ ]
+ call setline(1, s:a_GHAIN . pair[0] . ' ')
+ call assert_equal([pair[1] . pair[2] . ' '], ScreenLines(1, 3))
+ endfor
+
+ set arabicshape&
+ bwipe!
+endfunc
+
+func Test_shape_isolated()
+ new
+ set arabicshape
+
+ " Shaping non-arabic {testchar} non-arabic Tests chg_c_a2s().
+ " pair[0] = testchar, pair[1] = current-result
+ for pair in [[s:a_HAMZA, s:a_s_HAMZA],
+ \ [s:a_ALEF_MADDA, s:a_s_ALEF_MADDA],
+ \ [s:a_ALEF_HAMZA_ABOVE, s:a_s_ALEF_HAMZA_ABOVE],
+ \ [s:a_WAW_HAMZA, s:a_s_WAW_HAMZA],
+ \ [s:a_ALEF_HAMZA_BELOW, s:a_s_ALEF_HAMZA_BELOW],
+ \ [s:a_YEH_HAMZA, s:a_s_YEH_HAMZA],
+ \ [s:a_ALEF, s:a_s_ALEF],
+ \ [s:a_TEH_MARBUTA, s:a_s_TEH_MARBUTA],
+ \ [s:a_DAL, s:a_s_DAL],
+ \ [s:a_THAL, s:a_s_THAL],
+ \ [s:a_REH, s:a_s_REH],
+ \ [s:a_ZAIN, s:a_s_ZAIN],
+ \ [s:a_TATWEEL, s:a_TATWEEL],
+ \ [s:a_WAW, s:a_s_WAW],
+ \ [s:a_ALEF_MAKSURA, s:a_s_ALEF_MAKSURA],
+ \ [s:a_BEH, s:a_s_BEH],
+ \ [s:a_TEH, s:a_s_TEH],
+ \ [s:a_THEH, s:a_s_THEH],
+ \ [s:a_JEEM, s:a_s_JEEM],
+ \ [s:a_HAH, s:a_s_HAH],
+ \ [s:a_KHAH, s:a_s_KHAH],
+ \ [s:a_SEEN, s:a_s_SEEN],
+ \ [s:a_SHEEN, s:a_s_SHEEN],
+ \ [s:a_SAD, s:a_s_SAD],
+ \ [s:a_DAD, s:a_s_DAD],
+ \ [s:a_TAH, s:a_s_TAH],
+ \ [s:a_ZAH, s:a_s_ZAH],
+ \ [s:a_AIN, s:a_s_AIN],
+ \ [s:a_GHAIN, s:a_s_GHAIN],
+ \ [s:a_FEH, s:a_s_FEH],
+ \ [s:a_QAF, s:a_s_QAF],
+ \ [s:a_KAF, s:a_s_KAF],
+ \ [s:a_LAM, s:a_s_LAM],
+ \ [s:a_MEEM, s:a_s_MEEM],
+ \ [s:a_NOON, s:a_s_NOON],
+ \ [s:a_HEH, s:a_s_HEH],
+ \ [s:a_YEH, s:a_s_YEH],
+ \ ]
+ call setline(1, ' ' . pair[0] . ' ')
+ call assert_equal([' ' . pair[1] . ' '], ScreenLines(1, 3))
+ endfor
+
+ set arabicshape&
+ bwipe!
+endfunc
+
+func Test_shape_iso_to_medial()
+ new
+ set arabicshape
+
+ " Shaping arabic {testchar} arabic Tests chg_c_a2m().
+ " pair[0] = testchar, pair[1] = next-result, pair[2] = current-result,
+ " pair[3] = previous-result
+ for pair in [[s:a_HAMZA, s:a_s_GHAIN, s:a_s_HAMZA, s:a_s_BEH],
+ \[s:a_ALEF_MADDA, s:a_s_GHAIN, s:a_f_ALEF_MADDA, s:a_i_BEH],
+ \[s:a_ALEF_HAMZA_ABOVE, s:a_s_GHAIN, s:a_f_ALEF_HAMZA_ABOVE, s:a_i_BEH],
+ \[s:a_WAW_HAMZA, s:a_s_GHAIN, s:a_f_WAW_HAMZA, s:a_i_BEH],
+ \[s:a_ALEF_HAMZA_BELOW, s:a_s_GHAIN, s:a_f_ALEF_HAMZA_BELOW, s:a_i_BEH],
+ \[s:a_YEH_HAMZA, s:a_f_GHAIN, s:a_m_YEH_HAMZA, s:a_i_BEH],
+ \[s:a_ALEF, s:a_s_GHAIN, s:a_f_ALEF, s:a_i_BEH],
+ \[s:a_BEH, s:a_f_GHAIN, s:a_m_BEH, s:a_i_BEH],
+ \[s:a_TEH_MARBUTA, s:a_s_GHAIN, s:a_f_TEH_MARBUTA, s:a_i_BEH],
+ \[s:a_TEH, s:a_f_GHAIN, s:a_m_TEH, s:a_i_BEH],
+ \[s:a_THEH, s:a_f_GHAIN, s:a_m_THEH, s:a_i_BEH],
+ \[s:a_JEEM, s:a_f_GHAIN, s:a_m_JEEM, s:a_i_BEH],
+ \[s:a_HAH, s:a_f_GHAIN, s:a_m_HAH, s:a_i_BEH],
+ \[s:a_KHAH, s:a_f_GHAIN, s:a_m_KHAH, s:a_i_BEH],
+ \[s:a_DAL, s:a_s_GHAIN, s:a_f_DAL, s:a_i_BEH],
+ \[s:a_THAL, s:a_s_GHAIN, s:a_f_THAL, s:a_i_BEH],
+ \[s:a_REH, s:a_s_GHAIN, s:a_f_REH, s:a_i_BEH],
+ \[s:a_ZAIN, s:a_s_GHAIN, s:a_f_ZAIN, s:a_i_BEH],
+ \[s:a_SEEN, s:a_f_GHAIN, s:a_m_SEEN, s:a_i_BEH],
+ \[s:a_SHEEN, s:a_f_GHAIN, s:a_m_SHEEN, s:a_i_BEH],
+ \[s:a_SAD, s:a_f_GHAIN, s:a_m_SAD, s:a_i_BEH],
+ \[s:a_DAD, s:a_f_GHAIN, s:a_m_DAD, s:a_i_BEH],
+ \[s:a_TAH, s:a_f_GHAIN, s:a_m_TAH, s:a_i_BEH],
+ \[s:a_ZAH, s:a_f_GHAIN, s:a_m_ZAH, s:a_i_BEH],
+ \[s:a_AIN, s:a_f_GHAIN, s:a_m_AIN, s:a_i_BEH],
+ \[s:a_GHAIN, s:a_f_GHAIN, s:a_m_GHAIN, s:a_i_BEH],
+ \[s:a_TATWEEL, s:a_f_GHAIN, s:a_TATWEEL, s:a_i_BEH],
+ \[s:a_FEH, s:a_f_GHAIN, s:a_m_FEH, s:a_i_BEH],
+ \[s:a_QAF, s:a_f_GHAIN, s:a_m_QAF, s:a_i_BEH],
+ \[s:a_KAF, s:a_f_GHAIN, s:a_m_KAF, s:a_i_BEH],
+ \[s:a_LAM, s:a_f_GHAIN, s:a_m_LAM, s:a_i_BEH],
+ \[s:a_MEEM, s:a_f_GHAIN, s:a_m_MEEM, s:a_i_BEH],
+ \[s:a_NOON, s:a_f_GHAIN, s:a_m_NOON, s:a_i_BEH],
+ \[s:a_HEH, s:a_f_GHAIN, s:a_m_HEH, s:a_i_BEH],
+ \[s:a_WAW, s:a_s_GHAIN, s:a_f_WAW, s:a_i_BEH],
+ \[s:a_ALEF_MAKSURA, s:a_s_GHAIN, s:a_f_ALEF_MAKSURA, s:a_i_BEH],
+ \[s:a_YEH, s:a_f_GHAIN, s:a_m_YEH, s:a_i_BEH],
+ \ ]
+ call setline(1, s:a_GHAIN . pair[0] . s:a_BEH)
+ call assert_equal([pair[1] . pair[2] . pair[3]], ScreenLines(1, 3))
+ endfor
+
+ set arabicshape&
+ bwipe!
+endfunc
+
+func Test_shape_final()
+ new
+ set arabicshape
+
+ " Shaping arabic {testchar} arabic Tests chg_c_a2f().
+ " pair[0] = testchar, pair[1] = current-result, pair[2] = previous-result
+ for pair in [[s:a_HAMZA, s:a_s_HAMZA, s:a_s_BEH],
+ \[s:a_ALEF_MADDA, s:a_f_ALEF_MADDA, s:a_i_BEH],
+ \[s:a_ALEF_HAMZA_ABOVE, s:a_f_ALEF_HAMZA_ABOVE, s:a_i_BEH],
+ \[s:a_WAW_HAMZA, s:a_f_WAW_HAMZA, s:a_i_BEH],
+ \[s:a_ALEF_HAMZA_BELOW, s:a_f_ALEF_HAMZA_BELOW, s:a_i_BEH],
+ \[s:a_YEH_HAMZA, s:a_f_YEH_HAMZA, s:a_i_BEH],
+ \[s:a_ALEF, s:a_f_ALEF, s:a_i_BEH],
+ \[s:a_BEH, s:a_f_BEH, s:a_i_BEH],
+ \[s:a_TEH_MARBUTA, s:a_f_TEH_MARBUTA, s:a_i_BEH],
+ \[s:a_TEH, s:a_f_TEH, s:a_i_BEH],
+ \[s:a_THEH, s:a_f_THEH, s:a_i_BEH],
+ \[s:a_JEEM, s:a_f_JEEM, s:a_i_BEH],
+ \[s:a_HAH, s:a_f_HAH, s:a_i_BEH],
+ \[s:a_KHAH, s:a_f_KHAH, s:a_i_BEH],
+ \[s:a_DAL, s:a_f_DAL, s:a_i_BEH],
+ \[s:a_THAL, s:a_f_THAL, s:a_i_BEH],
+ \[s:a_REH, s:a_f_REH, s:a_i_BEH],
+ \[s:a_ZAIN, s:a_f_ZAIN, s:a_i_BEH],
+ \[s:a_SEEN, s:a_f_SEEN, s:a_i_BEH],
+ \[s:a_SHEEN, s:a_f_SHEEN, s:a_i_BEH],
+ \[s:a_SAD, s:a_f_SAD, s:a_i_BEH],
+ \[s:a_DAD, s:a_f_DAD, s:a_i_BEH],
+ \[s:a_TAH, s:a_f_TAH, s:a_i_BEH],
+ \[s:a_ZAH, s:a_f_ZAH, s:a_i_BEH],
+ \[s:a_AIN, s:a_f_AIN, s:a_i_BEH],
+ \[s:a_GHAIN, s:a_f_GHAIN, s:a_i_BEH],
+ \[s:a_TATWEEL, s:a_TATWEEL, s:a_i_BEH],
+ \[s:a_FEH, s:a_f_FEH, s:a_i_BEH],
+ \[s:a_QAF, s:a_f_QAF, s:a_i_BEH],
+ \[s:a_KAF, s:a_f_KAF, s:a_i_BEH],
+ \[s:a_LAM, s:a_f_LAM, s:a_i_BEH],
+ \[s:a_MEEM, s:a_f_MEEM, s:a_i_BEH],
+ \[s:a_NOON, s:a_f_NOON, s:a_i_BEH],
+ \[s:a_HEH, s:a_f_HEH, s:a_i_BEH],
+ \[s:a_WAW, s:a_f_WAW, s:a_i_BEH],
+ \[s:a_ALEF_MAKSURA, s:a_f_ALEF_MAKSURA, s:a_i_BEH],
+ \[s:a_YEH, s:a_f_YEH, s:a_i_BEH],
+ \ ]
+ call setline(1, ' ' . pair[0] . s:a_BEH)
+ call assert_equal([' ' . pair[1] . pair[2]], ScreenLines(1, 3))
+ endfor
+
+ set arabicshape&
+ bwipe!
+endfunc
+
+func Test_shape_final_to_medial()
+ new
+ set arabicshape
+
+ " Shaping arabic {testchar} arabic Tests chg_c_f2m().
+ " This does not test much...
+ " pair[0] = testchar, pair[1] = current-result
+ for pair in [[s:a_f_YEH_HAMZA, s:a_f_BEH],
+ \[s:a_f_WAW_HAMZA, s:a_s_BEH],
+ \[s:a_f_ALEF, s:a_s_BEH],
+ \[s:a_f_TEH_MARBUTA, s:a_s_BEH],
+ \[s:a_f_DAL, s:a_s_BEH],
+ \[s:a_f_THAL, s:a_s_BEH],
+ \[s:a_f_REH, s:a_s_BEH],
+ \[s:a_f_ZAIN, s:a_s_BEH],
+ \[s:a_f_WAW, s:a_s_BEH],
+ \[s:a_f_ALEF_MAKSURA, s:a_s_BEH],
+ \[s:a_f_BEH, s:a_f_BEH],
+ \[s:a_f_TEH, s:a_f_BEH],
+ \[s:a_f_THEH, s:a_f_BEH],
+ \[s:a_f_JEEM, s:a_f_BEH],
+ \[s:a_f_HAH, s:a_f_BEH],
+ \[s:a_f_KHAH, s:a_f_BEH],
+ \[s:a_f_SEEN, s:a_f_BEH],
+ \[s:a_f_SHEEN, s:a_f_BEH],
+ \[s:a_f_SAD, s:a_f_BEH],
+ \[s:a_f_DAD, s:a_f_BEH],
+ \[s:a_f_TAH, s:a_f_BEH],
+ \[s:a_f_ZAH, s:a_f_BEH],
+ \[s:a_f_AIN, s:a_f_BEH],
+ \[s:a_f_GHAIN, s:a_f_BEH],
+ \[s:a_f_FEH, s:a_f_BEH],
+ \[s:a_f_QAF, s:a_f_BEH],
+ \[s:a_f_KAF, s:a_f_BEH],
+ \[s:a_f_LAM, s:a_f_BEH],
+ \[s:a_f_MEEM, s:a_f_BEH],
+ \[s:a_f_NOON, s:a_f_BEH],
+ \[s:a_f_HEH, s:a_f_BEH],
+ \[s:a_f_YEH, s:a_f_BEH],
+ \ ]
+ call setline(1, ' ' . s:a_BEH . pair[0])
+ call assert_equal([' ' . pair[1] . pair[0]], ScreenLines(1, 3))
+ endfor
+
+ set arabicshape&
+ bwipe!
+endfunc
+
+func Test_shape_combination_final()
+ new
+ set arabicshape
+
+ " Shaping arabic {testchar} arabic Tests chg_c_laa2f().
+ " pair[0] = testchar, pair[1] = current-result
+ for pair in [[s:a_ALEF_MADDA, s:a_f_LAM_ALEF_MADDA_ABOVE],
+ \ [s:a_ALEF_HAMZA_ABOVE, s:a_f_LAM_ALEF_HAMZA_ABOVE],
+ \ [s:a_ALEF_HAMZA_BELOW, s:a_f_LAM_ALEF_HAMZA_BELOW],
+ \ [s:a_ALEF, s:a_f_LAM_ALEF],
+ \ ]
+ " The test char is a composing char, put on s:a_LAM.
+ call setline(1, ' ' . s:a_LAM . pair[0] . s:a_BEH)
+ call assert_equal([' ' . pair[1] . s:a_i_BEH], ScreenLines(1, 3))
+ endfor
+
+ set arabicshape&
+ bwipe!
+endfunc
+
+func Test_shape_combination_isolated()
+ new
+ set arabicshape
+
+ " Shaping arabic {testchar} arabic Tests chg_c_laa2i().
+ " pair[0] = testchar, pair[1] = current-result
+ for pair in [[s:a_ALEF_MADDA, s:a_s_LAM_ALEF_MADDA_ABOVE],
+ \ [s:a_ALEF_HAMZA_ABOVE, s:a_s_LAM_ALEF_HAMZA_ABOVE],
+ \ [s:a_ALEF_HAMZA_BELOW, s:a_s_LAM_ALEF_HAMZA_BELOW],
+ \ [s:a_ALEF, s:a_s_LAM_ALEF],
+ \ ]
+ " The test char is a composing char, put on s:a_LAM.
+ call setline(1, ' ' . s:a_LAM . pair[0] . ' ')
+ call assert_equal([' ' . pair[1] . ' '], ScreenLines(1, 3))
+ endfor
+
+ set arabicshape&
+ bwipe!
+endfunc
diff --git a/src/nvim/testdir/test_arglist.vim b/src/nvim/testdir/test_arglist.vim
new file mode 100644
index 0000000000..368fc9810d
--- /dev/null
+++ b/src/nvim/testdir/test_arglist.vim
@@ -0,0 +1,376 @@
+" Test argument list commands
+
+func Test_argidx()
+ args a b c
+ last
+ call assert_equal(2, argidx())
+ %argdelete
+ call assert_equal(0, argidx())
+ " doing it again doesn't result in an error
+ %argdelete
+ call assert_equal(0, argidx())
+ call assert_fails('2argdelete', 'E16:')
+
+ args a b c
+ call assert_equal(0, argidx())
+ next
+ call assert_equal(1, argidx())
+ next
+ call assert_equal(2, argidx())
+ 1argdelete
+ call assert_equal(1, argidx())
+ 1argdelete
+ call assert_equal(0, argidx())
+ 1argdelete
+ call assert_equal(0, argidx())
+endfunc
+
+func Test_argadd()
+ %argdelete
+ argadd a b c
+ call assert_equal(0, argidx())
+
+ %argdelete
+ argadd a
+ call assert_equal(0, argidx())
+ argadd b c d
+ call assert_equal(0, argidx())
+
+ call Init_abc()
+ argadd x
+ call Assert_argc(['a', 'b', 'x', 'c'])
+ call assert_equal(1, argidx())
+
+ call Init_abc()
+ 0argadd x
+ call Assert_argc(['x', 'a', 'b', 'c'])
+ call assert_equal(2, argidx())
+
+ call Init_abc()
+ 1argadd x
+ call Assert_argc(['a', 'x', 'b', 'c'])
+ call assert_equal(2, argidx())
+
+ call Init_abc()
+ $argadd x
+ call Assert_argc(['a', 'b', 'c', 'x'])
+ call assert_equal(1, argidx())
+
+ call Init_abc()
+ $argadd x
+ +2argadd y
+ call Assert_argc(['a', 'b', 'c', 'x', 'y'])
+ call assert_equal(1, argidx())
+
+ %argd
+ edit d
+ arga
+ call assert_equal(1, len(argv()))
+ call assert_equal('d', get(argv(), 0, ''))
+
+ %argd
+ edit some\ file
+ arga
+ call assert_equal(1, len(argv()))
+ call assert_equal('some file', get(argv(), 0, ''))
+
+ %argd
+ new
+ arga
+ call assert_equal(0, len(argv()))
+endfunc
+
+func Init_abc()
+ args a b c
+ next
+endfunc
+
+func Assert_argc(l)
+ call assert_equal(len(a:l), argc())
+ let i = 0
+ while i < len(a:l) && i < argc()
+ call assert_equal(a:l[i], argv(i))
+ let i += 1
+ endwhile
+endfunc
+
+" Test for [count]argument and [count]argdelete commands
+" Ported from the test_argument_count.in test script
+func Test_argument()
+ " Clean the argument list
+ arga a | %argd
+
+ let save_hidden = &hidden
+ set hidden
+
+ let g:buffers = []
+ augroup TEST
+ au BufEnter * call add(buffers, expand('%:t'))
+ augroup END
+
+ argadd a b c d
+ $argu
+ $-argu
+ -argu
+ 1argu
+ +2argu
+
+ augroup TEST
+ au!
+ augroup END
+
+ call assert_equal(['d', 'c', 'b', 'a', 'c'], g:buffers)
+
+ redir => result
+ ar
+ redir END
+ call assert_true(result =~# 'a b \[c] d')
+
+ .argd
+ call assert_equal(['a', 'b', 'd'], argv())
+
+ -argd
+ call assert_equal(['a', 'd'], argv())
+
+ $argd
+ call assert_equal(['a'], argv())
+
+ 1arga c
+ 1arga b
+ $argu
+ $arga x
+ call assert_equal(['a', 'b', 'c', 'x'], argv())
+
+ 0arga y
+ call assert_equal(['y', 'a', 'b', 'c', 'x'], argv())
+
+ %argd
+ call assert_equal([], argv())
+
+ arga a b c d e f
+ 2,$-argd
+ call assert_equal(['a', 'f'], argv())
+
+ let &hidden = save_hidden
+
+ " Setting argument list should fail when the current buffer has unsaved
+ " changes
+ %argd
+ enew!
+ set modified
+ call assert_fails('args x y z', 'E37:')
+ args! x y z
+ call assert_equal(['x', 'y', 'z'], argv())
+ call assert_equal('x', expand('%:t'))
+
+ last | enew | argu
+ call assert_equal('z', expand('%:t'))
+
+ %argdelete
+ call assert_fails('argument', 'E163:')
+endfunc
+
+func Test_args_with_quote()
+ " Only on Unix can a file name include a double quote.
+ if has('unix')
+ args \"foobar
+ call assert_equal('"foobar', argv(0))
+ %argdelete
+ endif
+endfunc
+
+" Test for 0argadd and 0argedit
+" Ported from the test_argument_0count.in test script
+func Test_zero_argadd()
+ " Clean the argument list
+ arga a | %argd
+
+ arga a b c d
+ 2argu
+ 0arga added
+ call assert_equal(['added', 'a', 'b', 'c', 'd'], argv())
+
+ 2argu
+ arga third
+ call assert_equal(['added', 'a', 'third', 'b', 'c', 'd'], argv())
+
+ %argd
+ arga a b c d
+ 2argu
+ 0arge edited
+ call assert_equal(['edited', 'a', 'b', 'c', 'd'], argv())
+
+ 2argu
+ arga third
+ call assert_equal(['edited', 'a', 'third', 'b', 'c', 'd'], argv())
+
+ 2argu
+ argedit file\ with\ spaces another file
+ call assert_equal(['edited', 'a', 'file with spaces', 'another', 'file', 'third', 'b', 'c', 'd'], argv())
+ call assert_equal('file with spaces', expand('%'))
+endfunc
+
+func Reset_arglist()
+ args a | %argd
+endfunc
+
+" Test for argc()
+func Test_argc()
+ call Reset_arglist()
+ call assert_equal(0, argc())
+ argadd a b
+ call assert_equal(2, argc())
+endfunc
+
+" Test for arglistid()
+func Test_arglistid()
+ call Reset_arglist()
+ arga a b
+ call assert_equal(0, arglistid())
+ split
+ arglocal
+ call assert_equal(1, arglistid())
+ tabnew | tabfirst
+ call assert_equal(0, arglistid(2))
+ call assert_equal(1, arglistid(1, 1))
+ call assert_equal(0, arglistid(2, 1))
+ call assert_equal(1, arglistid(1, 2))
+ tabonly | only | enew!
+ argglobal
+ call assert_equal(0, arglistid())
+endfunc
+
+" Test for argv()
+func Test_argv()
+ call Reset_arglist()
+ call assert_equal([], argv())
+ call assert_equal("", argv(2))
+ argadd a b c d
+ call assert_equal('c', argv(2))
+endfunc
+
+" Test for the :argedit command
+func Test_argedit()
+ call Reset_arglist()
+ argedit a
+ call assert_equal(['a'], argv())
+ call assert_equal('a', expand('%:t'))
+ argedit b
+ call assert_equal(['a', 'b'], argv())
+ call assert_equal('b', expand('%:t'))
+ argedit a
+ call assert_equal(['a', 'b', 'a'], argv())
+ call assert_equal('a', expand('%:t'))
+ " When file name case is ignored, an existing buffer with only case
+ " difference is re-used.
+ argedit C D
+ call assert_equal('C', expand('%:t'))
+ call assert_equal(['a', 'b', 'a', 'C', 'D'], argv())
+ argedit c
+ if has('fname_case')
+ call assert_equal(['a', 'b', 'a', 'C', 'c', 'D'], argv())
+ else
+ call assert_equal(['a', 'b', 'a', 'C', 'C', 'D'], argv())
+ endif
+ 0argedit x
+ if has('fname_case')
+ call assert_equal(['x', 'a', 'b', 'a', 'C', 'c', 'D'], argv())
+ else
+ call assert_equal(['x', 'a', 'b', 'a', 'C', 'C', 'D'], argv())
+ endif
+ enew! | set modified
+ call assert_fails('argedit y', 'E37:')
+ argedit! y
+ if has('fname_case')
+ call assert_equal(['x', 'y', 'y', 'a', 'b', 'a', 'C', 'c', 'D'], argv())
+ else
+ call assert_equal(['x', 'y', 'y', 'a', 'b', 'a', 'C', 'C', 'D'], argv())
+ endif
+ %argd
+ bwipe! C
+ bwipe! D
+endfunc
+
+" Test for the :argdelete command
+func Test_argdelete()
+ call Reset_arglist()
+ args aa a aaa b bb
+ argdelete a*
+ call assert_equal(['b', 'bb'], argv())
+ call assert_equal('aa', expand('%:t'))
+ last
+ argdelete %
+ call assert_equal(['b'], argv())
+ call assert_fails('argdelete', 'E471:')
+ call assert_fails('1,100argdelete', 'E16:')
+ %argd
+endfunc
+
+func Test_argdelete_completion()
+ args foo bar
+
+ call feedkeys(":argdelete \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"argdelete bar foo', @:)
+
+ call feedkeys(":argdelete x \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"argdelete x bar foo', @:)
+
+ %argd
+endfunc
+
+" Tests for the :next, :prev, :first, :last, :rewind commands
+func Test_argpos()
+ call Reset_arglist()
+ args a b c d
+ last
+ call assert_equal(3, argidx())
+ call assert_fails('next', 'E165:')
+ prev
+ call assert_equal(2, argidx())
+ Next
+ call assert_equal(1, argidx())
+ first
+ call assert_equal(0, argidx())
+ call assert_fails('prev', 'E164:')
+ 3next
+ call assert_equal(3, argidx())
+ rewind
+ call assert_equal(0, argidx())
+ %argd
+endfunc
+
+" Test for autocommand that redefines the argument list, when doing ":all".
+func Test_arglist_autocmd()
+ autocmd BufReadPost Xxx2 next Xxx2 Xxx1
+ call writefile(['test file Xxx1'], 'Xxx1')
+ call writefile(['test file Xxx2'], 'Xxx2')
+ call writefile(['test file Xxx3'], 'Xxx3')
+
+ new
+ " redefine arglist; go to Xxx1
+ next! Xxx1 Xxx2 Xxx3
+ " open window for all args
+ all
+ call assert_equal('test file Xxx1', getline(1))
+ wincmd w
+ wincmd w
+ call assert_equal('test file Xxx1', getline(1))
+ " should now be in Xxx2
+ rewind
+ call assert_equal('test file Xxx2', getline(1))
+
+ autocmd! BufReadPost Xxx2
+ enew! | only
+ call delete('Xxx1')
+ call delete('Xxx2')
+ call delete('Xxx3')
+ argdelete Xxx*
+ bwipe! Xxx1 Xxx2 Xxx3
+endfunc
+
+func Test_arg_all_expand()
+ call writefile(['test file Xxx1'], 'Xx x')
+ next notexist Xx\ x runtest.vim
+ call assert_equal('notexist Xx\ x runtest.vim', expand('##'))
+ call delete('Xx x')
+endfunc
diff --git a/src/nvim/testdir/test_assign.vim b/src/nvim/testdir/test_assign.vim
new file mode 100644
index 0000000000..50415ad6fd
--- /dev/null
+++ b/src/nvim/testdir/test_assign.vim
@@ -0,0 +1,47 @@
+" Test for assignment
+
+func Test_no_type_checking()
+ let v = 1
+ let v = [1,2,3]
+ let v = {'a': 1, 'b': 2}
+ let v = 3.4
+ let v = 'hello'
+endfunc
+
+func Test_let_termcap()
+ " Nvim does not support `:set termcap`.
+ return
+ " Terminal code
+ let old_t_te = &t_te
+ let &t_te = "\<Esc>[yes;"
+ call assert_match('t_te.*^[[yes;', execute("set termcap"))
+ let &t_te = old_t_te
+
+ if exists("+t_k1")
+ " Key code
+ let old_t_k1 = &t_k1
+ let &t_k1 = "that"
+ call assert_match('t_k1.*that', execute("set termcap"))
+ let &t_k1 = old_t_k1
+ endif
+
+ call assert_fails('let x = &t_xx', 'E15')
+ let &t_xx = "yes"
+ call assert_equal("yes", &t_xx)
+ let &t_xx = ""
+ call assert_fails('let x = &t_xx', 'E15')
+endfunc
+
+func Test_let_option_error()
+ let _w = &tw
+ let &tw = 80
+ call assert_fails('let &tw .= 1', 'E734')
+ call assert_equal(80, &tw)
+ let &tw = _w
+
+ let _w = &fillchars
+ let &fillchars = "vert:|"
+ call assert_fails('let &fillchars += "diff:-"', 'E734')
+ call assert_equal("vert:|", &fillchars)
+ let &fillchars = _w
+endfunc
diff --git a/src/nvim/testdir/test_autochdir.vim b/src/nvim/testdir/test_autochdir.vim
new file mode 100644
index 0000000000..05d69631c4
--- /dev/null
+++ b/src/nvim/testdir/test_autochdir.vim
@@ -0,0 +1,19 @@
+" Test 'autochdir' behavior
+
+if !exists("+autochdir")
+ finish
+endif
+
+func Test_set_filename()
+ let cwd = getcwd()
+ call test_autochdir()
+ set acd
+ new
+ w samples/Xtest
+ call assert_equal("Xtest", expand('%'))
+ call assert_equal("samples", substitute(getcwd(), '.*/\(\k*\)', '\1', ''))
+ bwipe!
+ set noacd
+ exe 'cd ' . cwd
+ call delete('samples/Xtest')
+endfunc
diff --git a/src/nvim/testdir/test_autocmd.vim b/src/nvim/testdir/test_autocmd.vim
new file mode 100644
index 0000000000..253d6750ed
--- /dev/null
+++ b/src/nvim/testdir/test_autocmd.vim
@@ -0,0 +1,1308 @@
+" Tests for autocommands
+
+source shared.vim
+
+func! s:cleanup_buffers() abort
+ for bnr in range(1, bufnr('$'))
+ if bufloaded(bnr) && bufnr('%') != bnr
+ execute 'bd! ' . bnr
+ endif
+ endfor
+endfunc
+
+func Test_vim_did_enter()
+ call assert_false(v:vim_did_enter)
+
+ " This script will never reach the main loop, can't check if v:vim_did_enter
+ " becomes one.
+endfunc
+
+if has('timers')
+ func ExitInsertMode(id)
+ call feedkeys("\<Esc>")
+ endfunc
+
+ func Test_cursorhold_insert()
+ " Need to move the cursor.
+ call feedkeys("ggG", "xt")
+
+ let g:triggered = 0
+ au CursorHoldI * let g:triggered += 1
+ set updatetime=20
+ call timer_start(100, 'ExitInsertMode')
+ call feedkeys('a', 'x!')
+ call assert_equal(1, g:triggered)
+ au! CursorHoldI
+ set updatetime&
+ endfunc
+
+ func Test_cursorhold_insert_ctrl_x()
+ let g:triggered = 0
+ au CursorHoldI * let g:triggered += 1
+ set updatetime=20
+ call timer_start(100, 'ExitInsertMode')
+ " CursorHoldI does not trigger after CTRL-X
+ call feedkeys("a\<C-X>", 'x!')
+ call assert_equal(0, g:triggered)
+ au! CursorHoldI
+ set updatetime&
+ endfunc
+endif
+
+func Test_bufunload()
+ augroup test_bufunload_group
+ autocmd!
+ autocmd BufUnload * call add(s:li, "bufunload")
+ autocmd BufDelete * call add(s:li, "bufdelete")
+ autocmd BufWipeout * call add(s:li, "bufwipeout")
+ augroup END
+
+ let s:li=[]
+ new
+ setlocal bufhidden=
+ bunload
+ call assert_equal(["bufunload", "bufdelete"], s:li)
+
+ let s:li=[]
+ new
+ setlocal bufhidden=delete
+ bunload
+ call assert_equal(["bufunload", "bufdelete"], s:li)
+
+ let s:li=[]
+ new
+ setlocal bufhidden=unload
+ bwipeout
+ call assert_equal(["bufunload", "bufdelete", "bufwipeout"], s:li)
+
+ au! test_bufunload_group
+ augroup! test_bufunload_group
+endfunc
+
+" SEGV occurs in older versions. (At least 7.4.2005 or older)
+func Test_autocmd_bufunload_with_tabnext()
+ tabedit
+ tabfirst
+
+ augroup test_autocmd_bufunload_with_tabnext_group
+ autocmd!
+ autocmd BufUnload <buffer> tabnext
+ augroup END
+
+ quit
+ call assert_equal(2, tabpagenr('$'))
+
+ autocmd! test_autocmd_bufunload_with_tabnext_group
+ augroup! test_autocmd_bufunload_with_tabnext_group
+ tablast
+ quit
+endfunc
+
+func Test_autocmd_bufwinleave_with_tabfirst()
+ tabedit
+ augroup sample
+ autocmd!
+ autocmd BufWinLeave <buffer> tabfirst
+ augroup END
+ call setline(1, ['a', 'b', 'c'])
+ edit! a.txt
+ tabclose
+endfunc
+
+" SEGV occurs in older versions. (At least 7.4.2321 or older)
+func Test_autocmd_bufunload_avoiding_SEGV_01()
+ split aa.txt
+ let lastbuf = bufnr('$')
+
+ augroup test_autocmd_bufunload
+ autocmd!
+ exe 'autocmd BufUnload <buffer> ' . (lastbuf + 1) . 'bwipeout!'
+ augroup END
+
+ call assert_fails('edit bb.txt', 'E937:')
+
+ autocmd! test_autocmd_bufunload
+ augroup! test_autocmd_bufunload
+ bwipe! aa.txt
+ bwipe! bb.txt
+endfunc
+
+" SEGV occurs in older versions. (At least 7.4.2321 or older)
+func Test_autocmd_bufunload_avoiding_SEGV_02()
+ setlocal buftype=nowrite
+ let lastbuf = bufnr('$')
+
+ augroup test_autocmd_bufunload
+ autocmd!
+ exe 'autocmd BufUnload <buffer> ' . (lastbuf + 1) . 'bwipeout!'
+ augroup END
+
+ normal! i1
+ call assert_fails('edit a.txt', 'E517:')
+ call feedkeys("\<CR>")
+
+ autocmd! test_autocmd_bufunload
+ augroup! test_autocmd_bufunload
+ bwipe! a.txt
+endfunc
+
+func Test_win_tab_autocmd()
+ let g:record = []
+
+ augroup testing
+ au WinNew * call add(g:record, 'WinNew')
+ au WinEnter * call add(g:record, 'WinEnter')
+ au WinLeave * call add(g:record, 'WinLeave')
+ au TabNew * call add(g:record, 'TabNew')
+ au TabClosed * call add(g:record, 'TabClosed')
+ au TabEnter * call add(g:record, 'TabEnter')
+ au TabLeave * call add(g:record, 'TabLeave')
+ augroup END
+
+ split
+ tabnew
+ close
+ close
+
+ call assert_equal([
+ \ 'WinLeave', 'WinNew', 'WinEnter',
+ \ 'WinLeave', 'TabLeave', 'WinNew', 'WinEnter', 'TabNew', 'TabEnter',
+ \ 'WinLeave', 'TabLeave', 'TabClosed', 'WinEnter', 'TabEnter',
+ \ 'WinLeave', 'WinEnter'
+ \ ], g:record)
+
+ let g:record = []
+ tabnew somefile
+ tabnext
+ bwipe somefile
+
+ call assert_equal([
+ \ 'WinLeave', 'TabLeave', 'WinNew', 'WinEnter', 'TabNew', 'TabEnter',
+ \ 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter',
+ \ 'TabClosed'
+ \ ], g:record)
+
+ augroup testing
+ au!
+ augroup END
+ unlet g:record
+endfunc
+
+func s:AddAnAutocmd()
+ augroup vimBarTest
+ au BufReadCmd * echo 'hello'
+ augroup END
+ call assert_equal(3, len(split(execute('au vimBarTest'), "\n")))
+endfunc
+
+func Test_early_bar()
+ " test that a bar is recognized before the {event}
+ call s:AddAnAutocmd()
+ augroup vimBarTest | au! | augroup END
+ call assert_equal(1, len(split(execute('au vimBarTest'), "\n")))
+
+ call s:AddAnAutocmd()
+ augroup vimBarTest| au!| augroup END
+ call assert_equal(1, len(split(execute('au vimBarTest'), "\n")))
+
+ " test that a bar is recognized after the {event}
+ call s:AddAnAutocmd()
+ augroup vimBarTest| au!BufReadCmd| augroup END
+ call assert_equal(1, len(split(execute('au vimBarTest'), "\n")))
+
+ " test that a bar is recognized after the {group}
+ call s:AddAnAutocmd()
+ au! vimBarTest|echo 'hello'
+ call assert_equal(1, len(split(execute('au vimBarTest'), "\n")))
+endfunc
+
+func RemoveGroup()
+ autocmd! StartOK
+ augroup! StartOK
+endfunc
+
+func Test_augroup_warning()
+ augroup TheWarning
+ au VimEnter * echo 'entering'
+ augroup END
+ call assert_true(match(execute('au VimEnter'), "TheWarning.*VimEnter") >= 0)
+ redir => res
+ augroup! TheWarning
+ redir END
+ call assert_true(match(res, "W19:") >= 0)
+ call assert_true(match(execute('au VimEnter'), "-Deleted-.*VimEnter") >= 0)
+
+ " check "Another" does not take the pace of the deleted entry
+ augroup Another
+ augroup END
+ call assert_true(match(execute('au VimEnter'), "-Deleted-.*VimEnter") >= 0)
+ augroup! Another
+
+ " no warning for postpone aucmd delete
+ augroup StartOK
+ au VimEnter * call RemoveGroup()
+ augroup END
+ call assert_true(match(execute('au VimEnter'), "StartOK.*VimEnter") >= 0)
+ redir => res
+ doautocmd VimEnter
+ redir END
+ call assert_true(match(res, "W19:") < 0)
+ au! VimEnter
+endfunc
+
+func Test_BufReadCmdHelp()
+ helptags ALL
+ " This used to cause access to free memory
+ au BufReadCmd * e +h
+ help
+
+ au! BufReadCmd
+endfunc
+
+func Test_BufReadCmdHelpJump()
+ " This used to cause access to free memory
+ au BufReadCmd * e +h{
+ " } to fix highlighting
+ call assert_fails('help', 'E434:')
+
+ au! BufReadCmd
+endfunc
+
+func Test_augroup_deleted()
+ " This caused a crash before E936 was introduced
+ augroup x
+ call assert_fails('augroup! x', 'E936:')
+ au VimEnter * echo
+ augroup end
+ augroup! x
+ call assert_true(match(execute('au VimEnter'), "-Deleted-.*VimEnter") >= 0)
+ au! VimEnter
+endfunc
+
+" Tests for autocommands on :close command.
+" This used to be in test13.
+func Test_three_windows()
+ " Clean up buffers, because in some cases this function fails.
+ call s:cleanup_buffers()
+
+ " Write three files and open them, each in a window.
+ " Then go to next window, with autocommand that deletes the previous one.
+ " Do this twice, writing the file.
+ e! Xtestje1
+ call setline(1, 'testje1')
+ w
+ sp Xtestje2
+ call setline(1, 'testje2')
+ w
+ sp Xtestje3
+ call setline(1, 'testje3')
+ w
+ wincmd w
+ au WinLeave Xtestje2 bwipe
+ wincmd w
+ call assert_equal('Xtestje1', expand('%'))
+
+ au WinLeave Xtestje1 bwipe Xtestje3
+ close
+ call assert_equal('Xtestje1', expand('%'))
+
+ " Test deleting the buffer on a Unload event. If this goes wrong there
+ " will be the ATTENTION prompt.
+ e Xtestje1
+ au!
+ au! BufUnload Xtestje1 bwipe
+ call assert_fails('e Xtestje3', 'E937:')
+ call assert_equal('Xtestje3', expand('%'))
+
+ e Xtestje2
+ sp Xtestje1
+ call assert_fails('e', 'E937:')
+ call assert_equal('Xtestje2', expand('%'))
+
+ " Test changing buffers in a BufWipeout autocommand. If this goes wrong
+ " there are ml_line errors and/or a Crash.
+ au!
+ only
+ e Xanother
+ e Xtestje1
+ bwipe Xtestje2
+ bwipe Xtestje3
+ au BufWipeout Xtestje1 buf Xtestje1
+ bwipe
+ call assert_equal('Xanother', expand('%'))
+
+ only
+
+ helptags ALL
+ help
+ wincmd w
+ 1quit
+ call assert_equal('Xanother', expand('%'))
+
+ au!
+ enew
+ bwipe! Xtestje1
+ call delete('Xtestje1')
+ call delete('Xtestje2')
+ call delete('Xtestje3')
+endfunc
+
+func Test_BufEnter()
+ au! BufEnter
+ au Bufenter * let val = val . '+'
+ let g:val = ''
+ split NewFile
+ call assert_equal('+', g:val)
+ bwipe!
+ call assert_equal('++', g:val)
+
+ " Also get BufEnter when editing a directory
+ call mkdir('Xdir')
+ split Xdir
+ call assert_equal('+++', g:val)
+
+ " On MS-Windows we can't edit the directory, make sure we wipe the right
+ " buffer.
+ bwipe! Xdir
+
+ call delete('Xdir', 'd')
+ au! BufEnter
+endfunc
+
+" Closing a window might cause an endless loop
+" E814 for older Vims
+func Test_autocmd_bufwipe_in_SessLoadPost()
+ edit Xtest
+ tabnew
+ file Xsomething
+ set noswapfile
+ mksession!
+
+ let content = ['set nocp noswapfile',
+ \ 'let v:swapchoice="e"',
+ \ 'augroup test_autocmd_sessionload',
+ \ 'autocmd!',
+ \ 'autocmd SessionLoadPost * exe bufnr("Xsomething") . "bw!"',
+ \ 'augroup END',
+ \ '',
+ \ 'func WriteErrors()',
+ \ ' call writefile([execute("messages")], "Xerrors")',
+ \ 'endfunc',
+ \ 'au VimLeave * call WriteErrors()',
+ \ ]
+ call writefile(content, 'Xvimrc')
+ call system(v:progpath. ' --headless -i NONE -u Xvimrc --noplugins -S Session.vim -c cq')
+ let errors = join(readfile('Xerrors'))
+ call assert_match('E814', errors)
+
+ set swapfile
+ for file in ['Session.vim', 'Xvimrc', 'Xerrors']
+ call delete(file)
+ endfor
+endfunc
+
+" SEGV occurs in older versions.
+func Test_autocmd_bufwipe_in_SessLoadPost2()
+ tabnew
+ set noswapfile
+ mksession!
+
+ let content = ['set nocp noswapfile',
+ \ 'function! DeleteInactiveBufs()',
+ \ ' tabfirst',
+ \ ' let tabblist = []',
+ \ ' for i in range(1, tabpagenr(''$''))',
+ \ ' call extend(tabblist, tabpagebuflist(i))',
+ \ ' endfor',
+ \ ' for b in range(1, bufnr(''$''))',
+ \ ' if bufexists(b) && buflisted(b) && (index(tabblist, b) == -1 || bufname(b) =~# ''^$'')',
+ \ ' exec ''bwipeout '' . b',
+ \ ' endif',
+ \ ' endfor',
+ \ ' echomsg "SessionLoadPost DONE"',
+ \ 'endfunction',
+ \ 'au SessionLoadPost * call DeleteInactiveBufs()',
+ \ '',
+ \ 'func WriteErrors()',
+ \ ' call writefile([execute("messages")], "Xerrors")',
+ \ 'endfunc',
+ \ 'au VimLeave * call WriteErrors()',
+ \ ]
+ call writefile(content, 'Xvimrc')
+ call system(v:progpath. ' --headless -i NONE -u Xvimrc --noplugins -S Session.vim -c cq')
+ let errors = join(readfile('Xerrors'))
+ " This probably only ever matches on unix.
+ call assert_notmatch('Caught deadly signal SEGV', errors)
+ call assert_match('SessionLoadPost DONE', errors)
+
+ set swapfile
+ for file in ['Session.vim', 'Xvimrc', 'Xerrors']
+ call delete(file)
+ endfor
+endfunc
+
+func Test_empty_doau()
+ doau \|
+endfunc
+
+func s:AutoCommandOptionSet(match)
+ let item = remove(g:options, 0)
+ let expected = printf("Option: <%s>, Oldval: <%s>, NewVal: <%s>, Scope: <%s>\n", item[0], item[1], item[2], item[3])
+ let actual = printf("Option: <%s>, Oldval: <%s>, NewVal: <%s>, Scope: <%s>\n", a:match, v:option_old, v:option_new, v:option_type)
+ let g:opt = [expected, actual]
+ "call assert_equal(expected, actual)
+endfunc
+
+func Test_OptionSet()
+ throw 'skipped: Nvim does not support test_override()'
+ if !has("eval") || !has("autocmd") || !exists("+autochdir")
+ return
+ endif
+
+ call test_override('starting', 1)
+ set nocp
+ au OptionSet * :call s:AutoCommandOptionSet(expand("<amatch>"))
+
+ " 1: Setting number option"
+ let g:options=[['number', 0, 1, 'global']]
+ set nu
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 2: Setting local number option"
+ let g:options=[['number', 1, 0, 'local']]
+ setlocal nonu
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 3: Setting global number option"
+ let g:options=[['number', 1, 0, 'global']]
+ setglobal nonu
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 4: Setting local autoindent option"
+ let g:options=[['autoindent', 0, 1, 'local']]
+ setlocal ai
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 5: Setting global autoindent option"
+ let g:options=[['autoindent', 0, 1, 'global']]
+ setglobal ai
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 6: Setting global autoindent option"
+ let g:options=[['autoindent', 1, 0, 'global']]
+ set ai!
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " Should not print anything, use :noa
+ " 7: don't trigger OptionSet"
+ let g:options=[['invalid', 1, 1, 'invalid']]
+ noa set nonu
+ call assert_equal([['invalid', 1, 1, 'invalid']], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 8: Setting several global list and number option"
+ let g:options=[['list', 0, 1, 'global'], ['number', 0, 1, 'global']]
+ set list nu
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 9: don't trigger OptionSet"
+ let g:options=[['invalid', 1, 1, 'invalid'], ['invalid', 1, 1, 'invalid']]
+ noa set nolist nonu
+ call assert_equal([['invalid', 1, 1, 'invalid'], ['invalid', 1, 1, 'invalid']], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 10: Setting global acd"
+ let g:options=[['autochdir', 0, 1, 'local']]
+ setlocal acd
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 11: Setting global autoread (also sets local value)"
+ let g:options=[['autoread', 0, 1, 'global']]
+ set ar
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 12: Setting local autoread"
+ let g:options=[['autoread', 1, 1, 'local']]
+ setlocal ar
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 13: Setting global autoread"
+ let g:options=[['autoread', 1, 0, 'global']]
+ setglobal invar
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 14: Setting option backspace through :let"
+ let g:options=[['backspace', '', 'eol,indent,start', 'global']]
+ let &bs="eol,indent,start"
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 15: Setting option backspace through setbufvar()"
+ let g:options=[['backup', 0, 1, 'local']]
+ " try twice, first time, shouldn't trigger because option name is invalid,
+ " second time, it should trigger
+ call assert_fails("call setbufvar(1, '&l:bk', 1)", "E355")
+ " should trigger, use correct option name
+ call setbufvar(1, '&backup', 1)
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 16: Setting number option using setwinvar"
+ let g:options=[['number', 0, 1, 'local']]
+ call setwinvar(0, '&number', 1)
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 17: Setting key option, shouldn't trigger"
+ let g:options=[['key', 'invalid', 'invalid1', 'invalid']]
+ setlocal key=blah
+ setlocal key=
+ call assert_equal([['key', 'invalid', 'invalid1', 'invalid']], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 18: Setting string option"
+ let oldval = &tags
+ let g:options=[['tags', oldval, 'tagpath', 'global']]
+ set tags=tagpath
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 1l: Resetting string option"
+ let g:options=[['tags', 'tagpath', oldval, 'global']]
+ set tags&
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " Cleanup
+ au! OptionSet
+ for opt in ['nu', 'ai', 'acd', 'ar', 'bs', 'backup', 'cul', 'cp']
+ exe printf(":set %s&vim", opt)
+ endfor
+ call test_override('starting', 0)
+ delfunc! AutoCommandOptionSet
+endfunc
+
+func Test_OptionSet_diffmode()
+ throw 'skipped: Nvim does not support test_override()'
+ call test_override('starting', 1)
+ " 18: Changing an option when enetering diff mode
+ new
+ au OptionSet diff :let &l:cul=v:option_new
+
+ call setline(1, ['buffer 1', 'line2', 'line3', 'line4'])
+ call assert_equal(0, &l:cul)
+ diffthis
+ call assert_equal(1, &l:cul)
+
+ vnew
+ call setline(1, ['buffer 2', 'line 2', 'line 3', 'line4'])
+ call assert_equal(0, &l:cul)
+ diffthis
+ call assert_equal(1, &l:cul)
+
+ diffoff
+ call assert_equal(0, &l:cul)
+ call assert_equal(1, getwinvar(2, '&l:cul'))
+ bw!
+
+ call assert_equal(1, &l:cul)
+ diffoff!
+ call assert_equal(0, &l:cul)
+ call assert_equal(0, getwinvar(1, '&l:cul'))
+ bw!
+
+ " Cleanup
+ au! OptionSet
+ call test_override('starting', 0)
+endfunc
+
+func Test_OptionSet_diffmode_close()
+ throw 'skipped: Nvim does not support test_override()'
+ call test_override('starting', 1)
+ " 19: Try to close the current window when entering diff mode
+ " should not segfault
+ new
+ au OptionSet diff close
+
+ call setline(1, ['buffer 1', 'line2', 'line3', 'line4'])
+ call assert_fails(':diffthis', 'E788')
+ call assert_equal(1, &diff)
+ vnew
+ call setline(1, ['buffer 2', 'line 2', 'line 3', 'line4'])
+ call assert_fails(':diffthis', 'E788')
+ call assert_equal(1, &diff)
+ bw!
+ call assert_fails(':diffoff!', 'E788')
+ bw!
+
+ " Cleanup
+ au! OptionSet
+ call test_override('starting', 0)
+ "delfunc! AutoCommandOptionSet
+endfunc
+
+" Test for Bufleave autocommand that deletes the buffer we are about to edit.
+func Test_BufleaveWithDelete()
+ new | edit Xfile1
+
+ augroup test_bufleavewithdelete
+ autocmd!
+ autocmd BufLeave Xfile1 bwipe Xfile2
+ augroup END
+
+ call assert_fails('edit Xfile2', 'E143:')
+ call assert_equal('Xfile1', bufname('%'))
+
+ autocmd! test_bufleavewithdelete BufLeave Xfile1
+ augroup! test_bufleavewithdelete
+
+ new
+ bwipe! Xfile1
+endfunc
+
+" Test for autocommand that changes the buffer list, when doing ":ball".
+func Test_Acmd_BufAll()
+ enew!
+ %bwipe!
+ call writefile(['Test file Xxx1'], 'Xxx1')
+ call writefile(['Test file Xxx2'], 'Xxx2')
+ call writefile(['Test file Xxx3'], 'Xxx3')
+
+ " Add three files to the buffer list
+ split Xxx1
+ close
+ split Xxx2
+ close
+ split Xxx3
+ close
+
+ " Wipe the buffer when the buffer is opened
+ au BufReadPost Xxx2 bwipe
+
+ call append(0, 'Test file Xxx4')
+ ball
+
+ call assert_equal(2, winnr('$'))
+ call assert_equal('Xxx1', bufname(winbufnr(winnr('$'))))
+ wincmd t
+
+ au! BufReadPost
+ %bwipe!
+ call delete('Xxx1')
+ call delete('Xxx2')
+ call delete('Xxx3')
+ enew! | only
+endfunc
+
+" Test for autocommand that changes current buffer on BufEnter event.
+" Check if modelines are interpreted for the correct buffer.
+func Test_Acmd_BufEnter()
+ %bwipe!
+ call writefile(['start of test file Xxx1',
+ \ "\<Tab>this is a test",
+ \ 'end of test file Xxx1'], 'Xxx1')
+ call writefile(['start of test file Xxx2',
+ \ 'vim: set noai :',
+ \ "\<Tab>this is a test",
+ \ 'end of test file Xxx2'], 'Xxx2')
+
+ au BufEnter Xxx2 brew
+ set ai modeline modelines=3
+ edit Xxx1
+ " edit Xxx2, autocmd will do :brew
+ edit Xxx2
+ exe "normal G?this is a\<CR>"
+ " Append text with autoindent to this file
+ normal othis should be auto-indented
+ call assert_equal("\<Tab>this should be auto-indented", getline('.'))
+ call assert_equal(3, line('.'))
+ " Remove autocmd and edit Xxx2 again
+ au! BufEnter Xxx2
+ buf! Xxx2
+ exe "normal G?this is a\<CR>"
+ " append text without autoindent to Xxx
+ normal othis should be in column 1
+ call assert_equal("this should be in column 1", getline('.'))
+ call assert_equal(4, line('.'))
+
+ %bwipe!
+ call delete('Xxx1')
+ call delete('Xxx2')
+ set ai&vim modeline&vim modelines&vim
+endfunc
+
+" Test for issue #57
+" do not move cursor on <c-o> when autoindent is set
+func Test_ai_CTRL_O()
+ enew!
+ set ai
+ let save_fo = &fo
+ set fo+=r
+ exe "normal o# abcdef\<Esc>2hi\<CR>\<C-O>d0\<Esc>"
+ exe "normal o# abcdef\<Esc>2hi\<C-O>d0\<Esc>"
+ call assert_equal(['# abc', 'def', 'def'], getline(2, 4))
+
+ set ai&vim
+ let &fo = save_fo
+ enew!
+endfunc
+
+" Test for autocommand that deletes the current buffer on BufLeave event.
+" Also test deleting the last buffer, should give a new, empty buffer.
+func Test_BufLeave_Wipe()
+ throw 'skipped: TODO: '
+ %bwipe!
+ let content = ['start of test file Xxx',
+ \ 'this is a test',
+ \ 'end of test file Xxx']
+ call writefile(content, 'Xxx1')
+ call writefile(content, 'Xxx2')
+
+ au BufLeave Xxx2 bwipe
+ edit Xxx1
+ split Xxx2
+ " delete buffer Xxx2, we should be back to Xxx1
+ bwipe
+ call assert_equal('Xxx1', bufname('%'))
+ call assert_equal(1, winnr('$'))
+
+ " Create an alternate buffer
+ %write! test.out
+ call assert_equal('test.out', bufname('#'))
+ " delete alternate buffer
+ bwipe test.out
+ call assert_equal('Xxx1', bufname('%'))
+ call assert_equal('', bufname('#'))
+
+ au BufLeave Xxx1 bwipe
+ " delete current buffer, get an empty one
+ bwipe!
+ call assert_equal(1, line('$'))
+ call assert_equal('', bufname('%'))
+ let g:bufinfo = getbufinfo()
+ call assert_equal(1, len(g:bufinfo))
+
+ call delete('Xxx1')
+ call delete('Xxx2')
+ call delete('test.out')
+ %bwipe
+ au! BufLeave
+
+ " check that bufinfo doesn't contain a pointer to freed memory
+ call test_garbagecollect_now()
+endfunc
+
+func Test_QuitPre()
+ edit Xfoo
+ let winid = win_getid(winnr())
+ split Xbar
+ au! QuitPre * let g:afile = expand('<afile>')
+ " Close the other window, <afile> should be correct.
+ exe win_id2win(winid) . 'q'
+ call assert_equal('Xfoo', g:afile)
+
+ unlet g:afile
+ bwipe Xfoo
+ bwipe Xbar
+endfunc
+
+func Test_Cmdline()
+ au! CmdlineChanged : let g:text = getcmdline()
+ let g:text = 0
+ call feedkeys(":echom 'hello'\<CR>", 'xt')
+ call assert_equal("echom 'hello'", g:text)
+ au! CmdlineChanged
+
+ au! CmdlineChanged : let g:entered = expand('<afile>')
+ let g:entered = 0
+ call feedkeys(":echom 'hello'\<CR>", 'xt')
+ call assert_equal(':', g:entered)
+ au! CmdlineChanged
+
+ au! CmdlineEnter : let g:entered = expand('<afile>')
+ au! CmdlineLeave : let g:left = expand('<afile>')
+ let g:entered = 0
+ let g:left = 0
+ call feedkeys(":echo 'hello'\<CR>", 'xt')
+ call assert_equal(':', g:entered)
+ call assert_equal(':', g:left)
+ au! CmdlineEnter
+ au! CmdlineLeave
+
+ let save_shellslash = &shellslash
+ set noshellslash
+ au! CmdlineEnter / let g:entered = expand('<afile>')
+ au! CmdlineLeave / let g:left = expand('<afile>')
+ let g:entered = 0
+ let g:left = 0
+ new
+ call setline(1, 'hello')
+ call feedkeys("/hello\<CR>", 'xt')
+ call assert_equal('/', g:entered)
+ call assert_equal('/', g:left)
+ bwipe!
+ au! CmdlineEnter
+ au! CmdlineLeave
+ let &shellslash = save_shellslash
+endfunc
+
+" Test for BufWritePre autocommand that deletes or unloads the buffer.
+func Test_BufWritePre()
+ %bwipe
+ au BufWritePre Xxx1 bunload
+ au BufWritePre Xxx2 bwipe
+
+ call writefile(['start of Xxx1', 'test', 'end of Xxx1'], 'Xxx1')
+ call writefile(['start of Xxx2', 'test', 'end of Xxx2'], 'Xxx2')
+
+ edit Xtest
+ e! Xxx2
+ bdel Xtest
+ e Xxx1
+ " write it, will unload it and give an error msg
+ call assert_fails('w', 'E203')
+ call assert_equal('Xxx2', bufname('%'))
+ edit Xtest
+ e! Xxx2
+ bwipe Xtest
+ " write it, will delete the buffer and give an error msg
+ call assert_fails('w', 'E203')
+ call assert_equal('Xxx1', bufname('%'))
+ au! BufWritePre
+ call delete('Xxx1')
+ call delete('Xxx2')
+endfunc
+
+" Test for BufUnload autocommand that unloads all the other buffers
+func Test_bufunload_all()
+ call writefile(['Test file Xxx1'], 'Xxx1')"
+ call writefile(['Test file Xxx2'], 'Xxx2')"
+
+ let content = [
+ \ "func UnloadAllBufs()",
+ \ " let i = 1",
+ \ " while i <= bufnr('$')",
+ \ " if i != bufnr('%') && bufloaded(i)",
+ \ " exe i . 'bunload'",
+ \ " endif",
+ \ " let i += 1",
+ \ " endwhile",
+ \ "endfunc",
+ \ "au BufUnload * call UnloadAllBufs()",
+ \ "au VimLeave * call writefile(['Test Finished'], 'Xout')",
+ \ "edit Xxx1",
+ \ "split Xxx2",
+ \ "q"]
+ call writefile(content, 'Xtest')
+
+ call delete('Xout')
+ call system(v:progpath. ' -u NORC -i NONE -N -S Xtest')
+ call assert_true(filereadable('Xout'))
+
+ call delete('Xxx1')
+ call delete('Xxx2')
+ call delete('Xtest')
+ call delete('Xout')
+endfunc
+
+" Some tests for buffer-local autocommands
+func Test_buflocal_autocmd()
+ let g:bname = ''
+ edit xx
+ au BufLeave <buffer> let g:bname = expand("%")
+ " here, autocommand for xx should trigger.
+ " but autocommand shall not apply to buffer named <buffer>.
+ edit somefile
+ call assert_equal('xx', g:bname)
+ let g:bname = ''
+ " here, autocommand shall be auto-deleted
+ bwipe xx
+ " autocmd should not trigger
+ edit xx
+ call assert_equal('', g:bname)
+ " autocmd should not trigger
+ edit somefile
+ call assert_equal('', g:bname)
+ enew
+ unlet g:bname
+endfunc
+
+" Test for "*Cmd" autocommands
+func Test_Cmd_Autocmds()
+ call writefile(['start of Xxx', "\tabc2", 'end of Xxx'], 'Xxx')
+
+ enew!
+ au BufReadCmd XtestA 0r Xxx|$del
+ edit XtestA " will read text of Xxd instead
+ call assert_equal('start of Xxx', getline(1))
+
+ au BufWriteCmd XtestA call append(line("$"), "write")
+ write " will append a line to the file
+ call assert_equal('write', getline('$'))
+ call assert_fails('read XtestA', 'E484') " should not read anything
+ call assert_equal('write', getline(4))
+
+ " now we have:
+ " 1 start of Xxx
+ " 2 abc2
+ " 3 end of Xxx
+ " 4 write
+
+ au FileReadCmd XtestB '[r Xxx
+ 2r XtestB " will read Xxx below line 2 instead
+ call assert_equal('start of Xxx', getline(3))
+
+ " now we have:
+ " 1 start of Xxx
+ " 2 abc2
+ " 3 start of Xxx
+ " 4 abc2
+ " 5 end of Xxx
+ " 6 end of Xxx
+ " 7 write
+
+ au FileWriteCmd XtestC '[,']copy $
+ normal 4GA1
+ 4,5w XtestC " will copy lines 4 and 5 to the end
+ call assert_equal("\tabc21", getline(8))
+ call assert_fails('r XtestC', 'E484') " should not read anything
+ call assert_equal("end of Xxx", getline(9))
+
+ " now we have:
+ " 1 start of Xxx
+ " 2 abc2
+ " 3 start of Xxx
+ " 4 abc21
+ " 5 end of Xxx
+ " 6 end of Xxx
+ " 7 write
+ " 8 abc21
+ " 9 end of Xxx
+
+ let g:lines = []
+ au FileAppendCmd XtestD call extend(g:lines, getline(line("'["), line("']")))
+ w >>XtestD " will add lines to 'lines'
+ call assert_equal(9, len(g:lines))
+ call assert_fails('$r XtestD', 'E484') " should not read anything
+ call assert_equal(9, line('$'))
+ call assert_equal('end of Xxx', getline('$'))
+
+ au BufReadCmd XtestE 0r Xxx|$del
+ sp XtestE " split window with test.out
+ call assert_equal('end of Xxx', getline(3))
+
+ let g:lines = []
+ exe "normal 2Goasdf\<Esc>\<C-W>\<C-W>"
+ au BufWriteCmd XtestE call extend(g:lines, getline(0, '$'))
+ wall " will write other window to 'lines'
+ call assert_equal(4, len(g:lines), g:lines)
+ call assert_equal("\tasdf", g:lines[2])
+
+ au! BufReadCmd
+ au! BufWriteCmd
+ au! FileReadCmd
+ au! FileWriteCmd
+ au! FileAppendCmd
+ %bwipe!
+ call delete('Xxx')
+ enew!
+endfunc
+
+func SetChangeMarks(start, end)
+ exe a:start. 'mark ['
+ exe a:end. 'mark ]'
+endfunc
+
+" Verify the effects of autocmds on '[ and ']
+func Test_change_mark_in_autocmds()
+ edit! Xtest
+ call feedkeys("ia\<CR>b\<CR>c\<CR>d\<C-g>u", 'xtn')
+
+ call SetChangeMarks(2, 3)
+ write
+ call assert_equal([1, 4], [line("'["), line("']")])
+
+ call SetChangeMarks(2, 3)
+ au BufWritePre * call assert_equal([1, 4], [line("'["), line("']")])
+ write
+ au! BufWritePre
+
+ if executable('cat')
+ write XtestFilter
+ write >> XtestFilter
+
+ call SetChangeMarks(2, 3)
+ " Marks are set to the entire range of the write
+ au FilterWritePre * call assert_equal([1, 4], [line("'["), line("']")])
+ " '[ is adjusted to just before the line that will receive the filtered
+ " data
+ au FilterReadPre * call assert_equal([4, 4], [line("'["), line("']")])
+ " The filtered data is read into the buffer, and the source lines are
+ " still present, so the range is after the source lines
+ au FilterReadPost * call assert_equal([5, 12], [line("'["), line("']")])
+ %!cat XtestFilter
+ " After the filtered data is read, the original lines are deleted
+ call assert_equal([1, 8], [line("'["), line("']")])
+ au! FilterWritePre,FilterReadPre,FilterReadPost
+ undo
+
+ call SetChangeMarks(1, 4)
+ au FilterWritePre * call assert_equal([2, 3], [line("'["), line("']")])
+ au FilterReadPre * call assert_equal([3, 3], [line("'["), line("']")])
+ au FilterReadPost * call assert_equal([4, 11], [line("'["), line("']")])
+ 2,3!cat XtestFilter
+ call assert_equal([2, 9], [line("'["), line("']")])
+ au! FilterWritePre,FilterReadPre,FilterReadPost
+ undo
+
+ call delete('XtestFilter')
+ endif
+
+ call SetChangeMarks(1, 4)
+ au FileWritePre * call assert_equal([2, 3], [line("'["), line("']")])
+ 2,3write Xtest2
+ au! FileWritePre
+
+ call SetChangeMarks(2, 3)
+ au FileAppendPre * call assert_equal([1, 4], [line("'["), line("']")])
+ write >> Xtest2
+ au! FileAppendPre
+
+ call SetChangeMarks(1, 4)
+ au FileAppendPre * call assert_equal([2, 3], [line("'["), line("']")])
+ 2,3write >> Xtest2
+ au! FileAppendPre
+
+ call SetChangeMarks(1, 1)
+ au FileReadPre * call assert_equal([3, 1], [line("'["), line("']")])
+ au FileReadPost * call assert_equal([4, 11], [line("'["), line("']")])
+ 3read Xtest2
+ au! FileReadPre,FileReadPost
+ undo
+
+ call SetChangeMarks(4, 4)
+ " When the line is 0, it's adjusted to 1
+ au FileReadPre * call assert_equal([1, 4], [line("'["), line("']")])
+ au FileReadPost * call assert_equal([1, 8], [line("'["), line("']")])
+ 0read Xtest2
+ au! FileReadPre,FileReadPost
+ undo
+
+ call SetChangeMarks(4, 4)
+ " When the line is 0, it's adjusted to 1
+ au FileReadPre * call assert_equal([1, 4], [line("'["), line("']")])
+ au FileReadPost * call assert_equal([2, 9], [line("'["), line("']")])
+ 1read Xtest2
+ au! FileReadPre,FileReadPost
+ undo
+
+ bwipe!
+ call delete('Xtest')
+ call delete('Xtest2')
+endfunc
+
+func Test_Filter_noshelltemp()
+ if !executable('cat')
+ return
+ endif
+
+ enew!
+ call setline(1, ['a', 'b', 'c', 'd'])
+
+ let shelltemp = &shelltemp
+ set shelltemp
+
+ let g:filter_au = 0
+ au FilterWritePre * let g:filter_au += 1
+ au FilterReadPre * let g:filter_au += 1
+ au FilterReadPost * let g:filter_au += 1
+ %!cat
+ call assert_equal(3, g:filter_au)
+
+ if has('filterpipe')
+ set noshelltemp
+
+ let g:filter_au = 0
+ au FilterWritePre * let g:filter_au += 1
+ au FilterReadPre * let g:filter_au += 1
+ au FilterReadPost * let g:filter_au += 1
+ %!cat
+ call assert_equal(0, g:filter_au)
+ endif
+
+ au! FilterWritePre,FilterReadPre,FilterReadPost
+ let &shelltemp = shelltemp
+ bwipe!
+endfunc
+
+func Test_TextYankPost()
+ enew!
+ call setline(1, ['foo'])
+
+ let g:event = []
+ au TextYankPost * let g:event = copy(v:event)
+
+ call assert_equal({}, v:event)
+ call assert_fails('let v:event = {}', 'E46:')
+ call assert_fails('let v:event.mykey = 0', 'E742:')
+
+ norm "ayiw
+ call assert_equal(
+ \{'regcontents': ['foo'], 'regname': 'a', 'operator': 'y', 'regtype': 'v'},
+ \g:event)
+ norm y_
+ call assert_equal(
+ \{'regcontents': ['foo'], 'regname': '', 'operator': 'y', 'regtype': 'V'},
+ \g:event)
+ call feedkeys("\<C-V>y", 'x')
+ call assert_equal(
+ \{'regcontents': ['f'], 'regname': '', 'operator': 'y', 'regtype': "\x161"},
+ \g:event)
+ norm "xciwbar
+ call assert_equal(
+ \{'regcontents': ['foo'], 'regname': 'x', 'operator': 'c', 'regtype': 'v'},
+ \g:event)
+ norm "bdiw
+ call assert_equal(
+ \{'regcontents': ['bar'], 'regname': 'b', 'operator': 'd', 'regtype': 'v'},
+ \g:event)
+
+ call assert_equal({}, v:event)
+
+ au! TextYankPost
+ unlet g:event
+ bwipe!
+endfunc
+
+func Test_nocatch_wipe_all_buffers()
+ " Real nasty autocommand: wipe all buffers on any event.
+ au * * bwipe *
+ call assert_fails('next x', 'E93')
+ bwipe
+ au!
+endfunc
+
+func Test_nocatch_wipe_dummy_buffer()
+ " Nasty autocommand: wipe buffer on any event.
+ au * x bwipe
+ call assert_fails('lvยฝ /x', 'E480')
+ au!
+endfunc
+
+func Test_wipe_cbuffer()
+ sv x
+ au * * bw
+ lb
+ au!
+endfunc
+
+" Test TextChangedI and TextChangedP
+func Test_ChangedP()
+ " Nvim does not support test_override().
+ throw 'skipped: see test/functional/viml/completion_spec.lua'
+ new
+ call setline(1, ['foo', 'bar', 'foobar'])
+ call test_override("char_avail", 1)
+ set complete=. completeopt=menuone
+
+ func! TextChangedAutocmd(char)
+ let g:autocmd .= a:char
+ endfunc
+
+ au! TextChanged <buffer> :call TextChangedAutocmd('N')
+ au! TextChangedI <buffer> :call TextChangedAutocmd('I')
+ au! TextChangedP <buffer> :call TextChangedAutocmd('P')
+
+ call cursor(3, 1)
+ let g:autocmd = ''
+ call feedkeys("o\<esc>", 'tnix')
+ call assert_equal('I', g:autocmd)
+
+ let g:autocmd = ''
+ call feedkeys("Sf", 'tnix')
+ call assert_equal('II', g:autocmd)
+
+ let g:autocmd = ''
+ call feedkeys("Sf\<C-N>", 'tnix')
+ call assert_equal('IIP', g:autocmd)
+
+ let g:autocmd = ''
+ call feedkeys("Sf\<C-N>\<C-N>", 'tnix')
+ call assert_equal('IIPP', g:autocmd)
+
+ let g:autocmd = ''
+ call feedkeys("Sf\<C-N>\<C-N>\<C-N>", 'tnix')
+ call assert_equal('IIPPP', g:autocmd)
+
+ let g:autocmd = ''
+ call feedkeys("Sf\<C-N>\<C-N>\<C-N>\<C-N>", 'tnix')
+ call assert_equal('IIPPPP', g:autocmd)
+
+ call assert_equal(['foo', 'bar', 'foobar', 'foo'], getline(1, '$'))
+ " TODO: how should it handle completeopt=noinsert,noselect?
+
+ " CleanUp
+ call test_override("char_avail", 0)
+ au! TextChanged
+ au! TextChangedI
+ au! TextChangedP
+ delfu TextChangedAutocmd
+ unlet! g:autocmd
+ set complete&vim completeopt&vim
+
+ bw!
+endfunc
+
+let g:setline_handled = v:false
+func! SetLineOne()
+ if !g:setline_handled
+ call setline(1, "(x)")
+ let g:setline_handled = v:true
+ endif
+endfunc
+
+func Test_TextChangedI_with_setline()
+ throw 'skipped: Nvim does not support test_override()'
+ new
+ call test_override('char_avail', 1)
+ autocmd TextChangedI <buffer> call SetLineOne()
+ call feedkeys("i(\<CR>\<Esc>", 'tx')
+ call assert_equal('(', getline(1))
+ call assert_equal('x)', getline(2))
+ undo
+ call assert_equal('', getline(1))
+ call assert_equal('', getline(2))
+
+ call test_override('starting', 0)
+ bwipe!
+endfunc
+
+func Test_Changed_FirstTime()
+ if !has('terminal') || has('gui_running')
+ return
+ endif
+ " Prepare file for TextChanged event.
+ call writefile([''], 'Xchanged.txt')
+ let buf = term_start([GetVimProg(), '--clean', '-c', 'set noswapfile'], {'term_rows': 3})
+ call assert_equal('running', term_getstatus(buf))
+ " It's only adding autocmd, so that no event occurs.
+ call term_sendkeys(buf, ":au! TextChanged <buffer> call writefile(['No'], 'Xchanged.txt')\<cr>")
+ call term_sendkeys(buf, "\<C-\\>\<C-N>:qa!\<cr>")
+ call WaitFor({-> term_getstatus(buf) == 'finished'})
+ call assert_equal([''], readfile('Xchanged.txt'))
+
+ " clean up
+ call delete('Xchanged.txt')
+ bwipe!
+endfunc
diff --git a/src/nvim/testdir/test_autoload.vim b/src/nvim/testdir/test_autoload.vim
new file mode 100644
index 0000000000..7396c227c9
--- /dev/null
+++ b/src/nvim/testdir/test_autoload.vim
@@ -0,0 +1,17 @@
+" Tests for autoload
+
+set runtimepath=./sautest
+
+func Test_autoload_dict_func()
+ let g:loaded_foo_vim = 0
+ let g:called_foo_bar_echo = 0
+ call g:foo#bar.echo()
+ call assert_equal(1, g:loaded_foo_vim)
+ call assert_equal(1, g:called_foo_bar_echo)
+endfunc
+
+func Test_source_autoload()
+ let g:loaded_sourced_vim = 0
+ source sautest/autoload/sourced.vim
+ call assert_equal(1, g:loaded_sourced_vim)
+endfunc
diff --git a/src/nvim/testdir/test_behave.vim b/src/nvim/testdir/test_behave.vim
new file mode 100644
index 0000000000..c26bfe7ce3
--- /dev/null
+++ b/src/nvim/testdir/test_behave.vim
@@ -0,0 +1,29 @@
+" Test the :behave command
+
+func Test_behave()
+ behave mswin
+ call assert_equal('mouse,key', &selectmode)
+ call assert_equal('popup', &mousemodel)
+ call assert_equal('startsel,stopsel', &keymodel)
+ call assert_equal('exclusive', &selection)
+
+ behave xterm
+ call assert_equal('', &selectmode)
+ call assert_equal('extend', &mousemodel)
+ call assert_equal('', &keymodel)
+ call assert_equal('inclusive', &selection)
+
+ set selection&
+ set mousemodel&
+ set keymodel&
+ set selection&
+endfunc
+
+func Test_behave_completion()
+ call feedkeys(":behave \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"behave mswin xterm', @:)
+endfunc
+
+func Test_behave_error()
+ call assert_fails('behave x', 'E475:')
+endfunc
diff --git a/src/nvim/testdir/test_blockedit.vim b/src/nvim/testdir/test_blockedit.vim
new file mode 100644
index 0000000000..527224ccd2
--- /dev/null
+++ b/src/nvim/testdir/test_blockedit.vim
@@ -0,0 +1,33 @@
+" Test for block inserting
+"
+" TODO: rewrite test39.in into this new style test
+
+func Test_blockinsert_indent()
+ new
+ filetype plugin indent on
+ setlocal sw=2 et ft=vim
+ call setline(1, ['let a=[', ' ''eins'',', ' ''zwei'',', ' ''drei'']'])
+ call cursor(2, 3)
+ exe "norm! \<c-v>2jI\\ \<esc>"
+ call assert_equal(['let a=[', ' \ ''eins'',', ' \ ''zwei'',', ' \ ''drei'']'],
+ \ getline(1,'$'))
+ " reset to sane state
+ filetype off
+ bwipe!
+endfunc
+
+func Test_blockinsert_delete()
+ new
+ let _bs = &bs
+ set bs=2
+ call setline(1, ['case Arg is ', ' when Name_Async,', ' when Name_Num_Gangs,', 'end if;'])
+ exe "norm! ggjVj\<c-v>$o$A\<bs>\<esc>"
+ "call feedkeys("Vj\<c-v>$o$A\<bs>\<esc>", 'ti')
+ call assert_equal(["case Arg is ", " when Name_Async", " when Name_Num_Gangs,", "end if;"],
+ \ getline(1,'$'))
+ " reset to sane state
+ let &bs = _bs
+ bwipe!
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_breakindent.vim b/src/nvim/testdir/test_breakindent.vim
new file mode 100644
index 0000000000..7deffbe452
--- /dev/null
+++ b/src/nvim/testdir/test_breakindent.vim
@@ -0,0 +1,298 @@
+" Test for breakindent
+"
+" Note: if you get strange failures when adding new tests, it might be that
+" while the test is run, the breakindent cacheing gets in its way.
+" It helps to change the tabstop setting and force a redraw (e.g. see
+" Test_breakindent08())
+if !exists('+breakindent')
+ finish
+endif
+
+source view_util.vim
+
+let s:input ="\tabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP"
+
+function s:screen_lines(lnum, width) abort
+ return ScreenLines([a:lnum, a:lnum + 2], a:width)
+endfunction
+
+function! s:compare_lines(expect, actual)
+ call assert_equal(join(a:expect, "\n"), join(a:actual, "\n"))
+endfunction
+
+function s:test_windows(...)
+ call NewWindow(10, 20)
+ setl ts=4 sw=4 sts=4 breakindent
+ put =s:input
+ exe get(a:000, 0, '')
+endfunction
+
+function s:close_windows(...)
+ call CloseWindow()
+ exe get(a:000, 0, '')
+endfunction
+
+function Test_breakindent01()
+ " simple breakindent test
+ call s:test_windows('setl briopt=min:0')
+ let lines=s:screen_lines(line('.'),8)
+ let expect=[
+\ " abcd",
+\ " qrst",
+\ " GHIJ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunction
+
+function Test_breakindent02()
+ " simple breakindent test with showbreak set
+ call s:test_windows('setl briopt=min:0 sbr=>>')
+ let lines=s:screen_lines(line('.'),8)
+ let expect=[
+\ " abcd",
+\ " >>qr",
+\ " >>EF",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set sbr=')
+endfunction
+
+function Test_breakindent03()
+ " simple breakindent test with showbreak set and briopt including sbr
+ call s:test_windows('setl briopt=sbr,min:0 sbr=++')
+ let lines=s:screen_lines(line('.'),8)
+ let expect=[
+\ " abcd",
+\ "++ qrst",
+\ "++ GHIJ",
+\ ]
+ call s:compare_lines(expect, lines)
+ " clean up
+ call s:close_windows('set sbr=')
+endfunction
+
+function Test_breakindent04()
+ " breakindent set with min width 18
+ call s:test_windows('setl sbr= briopt=min:18')
+ let lines=s:screen_lines(line('.'),8)
+ let expect=[
+\ " abcd",
+\ " qrstuv",
+\ " IJKLMN",
+\ ]
+ call s:compare_lines(expect, lines)
+ " clean up
+ call s:close_windows('set sbr=')
+endfunction
+
+function Test_breakindent05()
+ " breakindent set and shift by 2
+ call s:test_windows('setl briopt=shift:2,min:0')
+ let lines=s:screen_lines(line('.'),8)
+ let expect=[
+\ " abcd",
+\ " qr",
+\ " EF",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunction
+
+function Test_breakindent06()
+ " breakindent set and shift by -1
+ call s:test_windows('setl briopt=shift:-1,min:0')
+ let lines=s:screen_lines(line('.'),8)
+ let expect=[
+\ " abcd",
+\ " qrstu",
+\ " HIJKL",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunction
+
+function Test_breakindent07()
+ " breakindent set and shift by 1, Number set sbr=? and briopt:sbr
+ call s:test_windows('setl briopt=shift:1,sbr,min:0 nu sbr=? nuw=4 cpo+=n')
+ let lines=s:screen_lines(line('.'),10)
+ let expect=[
+\ " 2 ab",
+\ "? m",
+\ "? x",
+\ ]
+ call s:compare_lines(expect, lines)
+ " clean up
+ call s:close_windows('set sbr= cpo-=n')
+endfunction
+
+function Test_breakindent07a()
+ " breakindent set and shift by 1, Number set sbr=? and briopt:sbr
+ call s:test_windows('setl briopt=shift:1,sbr,min:0 nu sbr=? nuw=4')
+ let lines=s:screen_lines(line('.'),10)
+ let expect=[
+\ " 2 ab",
+\ " ? m",
+\ " ? x",
+\ ]
+ call s:compare_lines(expect, lines)
+ " clean up
+ call s:close_windows('set sbr=')
+endfunction
+
+function Test_breakindent08()
+ " breakindent set and shift by 1, Number and list set sbr=# and briopt:sbr
+ call s:test_windows('setl briopt=shift:1,sbr,min:0 nu nuw=4 sbr=# list cpo+=n ts=4')
+ " make sure, cache is invalidated!
+ set ts=8
+ redraw!
+ set ts=4
+ redraw!
+ let lines=s:screen_lines(line('.'),10)
+ let expect=[
+\ " 2 ^Iabcd",
+\ "# opq",
+\ "# BCD",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set sbr= cpo-=n')
+endfunction
+
+function Test_breakindent08a()
+ " breakindent set and shift by 1, Number and list set sbr=# and briopt:sbr
+ call s:test_windows('setl briopt=shift:1,sbr,min:0 nu nuw=4 sbr=# list')
+ let lines=s:screen_lines(line('.'),10)
+ let expect=[
+\ " 2 ^Iabcd",
+\ " # opq",
+\ " # BCD",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set sbr=')
+endfunction
+
+function Test_breakindent09()
+ " breakindent set and shift by 1, Number and list set sbr=#
+ call s:test_windows('setl briopt=shift:1,min:0 nu nuw=4 sbr=# list')
+ let lines=s:screen_lines(line('.'),10)
+ let expect=[
+\ " 2 ^Iabcd",
+\ " #op",
+\ " #AB",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set sbr=')
+endfunction
+
+function Test_breakindent10()
+ " breakindent set, Number set sbr=~
+ call s:test_windows('setl cpo+=n sbr=~ nu nuw=4 nolist briopt=sbr,min:0')
+ " make sure, cache is invalidated!
+ set ts=8
+ redraw!
+ set ts=4
+ redraw!
+ let lines=s:screen_lines(line('.'),10)
+ let expect=[
+\ " 2 ab",
+\ "~ mn",
+\ "~ yz",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set sbr= cpo-=n')
+endfunction
+
+function Test_breakindent11()
+ " test strdisplaywidth()
+ call s:test_windows('setl cpo-=n sbr=>> nu nuw=4 nolist briopt= ts=4')
+ let text=getline(2)
+ let width = strlen(text[1:])+indent(2)+strlen(&sbr)*3 " text wraps 3 times
+ call assert_equal(width, strdisplaywidth(text))
+ call s:close_windows('set sbr=')
+endfunction
+
+function Test_breakindent12()
+ " test breakindent with long indent
+ let s:input="\t\t\t\t\t{"
+ call s:test_windows('setl breakindent linebreak briopt=min:10 nu numberwidth=3 ts=4 list listchars=tab:>-')
+ let lines=s:screen_lines(2,16)
+ let expect=[
+\ " 2 >--->--->--->",
+\ " ---{ ",
+\ "~ ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set nuw=4 listchars=')
+endfunction
+
+function Test_breakindent13()
+ let s:input=""
+ call s:test_windows('setl breakindent briopt=min:10 ts=8')
+ vert resize 20
+ call setline(1, [" a\tb\tc\td\te", " z y x w v"])
+ 1
+ norm! fbgj"ayl
+ 2
+ norm! fygj"byl
+ call assert_equal('d', @a)
+ call assert_equal('w', @b)
+ call s:close_windows()
+endfunction
+
+function Test_breakindent14()
+ let s:input=""
+ call s:test_windows('setl breakindent briopt= ts=8')
+ vert resize 30
+ norm! 3a1234567890
+ norm! a abcde
+ exec "norm! 0\<C-V>tex"
+ let lines=s:screen_lines(line('.'),8)
+ let expect=[
+\ "e ",
+\ "~ ",
+\ "~ ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunction
+
+function Test_breakindent15()
+ let s:input=""
+ call s:test_windows('setl breakindent briopt= ts=8 sw=8')
+ vert resize 30
+ norm! 4a1234567890
+ exe "normal! >>\<C-V>3f0x"
+ let lines=s:screen_lines(line('.'),20)
+ let expect=[
+\ " 1234567890 ",
+\ "~ ",
+\ "~ ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunction
+
+function Test_breakindent16()
+ " Check that overlong lines are indented correctly.
+ let s:input=""
+ call s:test_windows('setl breakindent briopt=min:0 ts=4')
+ call setline(1, "\t".repeat("1234567890", 10))
+ resize 6
+ norm! 1gg$
+ redraw!
+ let lines=s:screen_lines(1,10)
+ let expect=[
+\ " 789012",
+\ " 345678",
+\ " 901234",
+\ ]
+ call s:compare_lines(expect, lines)
+ let lines=s:screen_lines(4,10)
+ let expect=[
+\ " 567890",
+\ " 123456",
+\ " 7890 ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunction
diff --git a/src/nvim/testdir/test_bufwintabinfo.vim b/src/nvim/testdir/test_bufwintabinfo.vim
new file mode 100644
index 0000000000..a6b4524cc0
--- /dev/null
+++ b/src/nvim/testdir/test_bufwintabinfo.vim
@@ -0,0 +1,133 @@
+" Tests for the getbufinfo(), getwininfo() and gettabinfo() functions
+
+function Test_getbufwintabinfo()
+ edit Xtestfile1
+ edit Xtestfile2
+ let buflist = getbufinfo()
+ call assert_equal(2, len(buflist))
+ call assert_match('Xtestfile1', buflist[0].name)
+ call assert_match('Xtestfile2', getbufinfo('Xtestfile2')[0].name)
+ call assert_equal([], getbufinfo(2016))
+ edit Xtestfile1
+ hide edit Xtestfile2
+ hide enew
+ call assert_equal(3, len(getbufinfo({'bufloaded':1})))
+
+ set tabstop&vim
+ let b:editor = 'vim'
+ let l = getbufinfo('%')
+ call assert_equal(bufnr('%'), l[0].bufnr)
+ call assert_equal('vim', l[0].variables.editor)
+ call assert_notequal(-1, index(l[0].windows, bufwinid('%')))
+
+ if has('signs')
+ call append(0, ['Linux', 'Windows', 'Mac'])
+ sign define Mark text=>> texthl=Search
+ exe "sign place 2 line=3 name=Mark buffer=" . bufnr('%')
+ let l = getbufinfo('%')
+ call assert_equal(2, l[0].signs[0].id)
+ call assert_equal(3, l[0].signs[0].lnum)
+ call assert_equal('Mark', l[0].signs[0].name)
+ sign unplace *
+ sign undefine Mark
+ enew!
+ endif
+
+ only
+ let w1_id = win_getid()
+ new
+ let w2_id = win_getid()
+ tabnew | let w3_id = win_getid()
+ new | let w4_id = win_getid()
+ vert new | let w5_id = win_getid()
+ call setwinvar(0, 'signal', 'green')
+ tabfirst
+ let winlist = getwininfo()
+ call assert_equal(5, len(winlist))
+ call assert_equal(winwidth(1), winlist[0].width)
+ call assert_equal(0, winlist[0].wincol)
+ let tablineheight = winlist[0].winrow == 1 ? 1 : 0
+ call assert_equal(tablineheight, winlist[0].winrow) " tabline adds one
+
+ call assert_equal(winbufnr(2), winlist[1].bufnr)
+ call assert_equal(winheight(2), winlist[1].height)
+ call assert_equal(0, winlist[1].wincol)
+ call assert_equal(tablineheight + winheight(1) + 1, winlist[1].winrow)
+
+ call assert_equal(1, winlist[2].winnr)
+ call assert_equal(tablineheight, winlist[2].winrow)
+ call assert_equal(0, winlist[2].wincol)
+
+ call assert_equal(winlist[2].width + 1, winlist[3].wincol)
+ call assert_equal(0, winlist[4].wincol)
+
+ call assert_equal(1, winlist[0].tabnr)
+ call assert_equal(1, winlist[1].tabnr)
+ call assert_equal(2, winlist[2].tabnr)
+ call assert_equal(2, winlist[3].tabnr)
+ call assert_equal(2, winlist[4].tabnr)
+
+ call assert_equal('green', winlist[2].variables.signal)
+ call assert_equal(w4_id, winlist[3].winid)
+ let winfo = getwininfo(w5_id)[0]
+ call assert_equal(2, winfo.tabnr)
+ call assert_equal([], getwininfo(3))
+
+ call settabvar(1, 'space', 'build')
+ let tablist = gettabinfo()
+ call assert_equal(2, len(tablist))
+ call assert_equal(3, len(tablist[1].windows))
+ call assert_equal(2, tablist[1].tabnr)
+ call assert_equal('build', tablist[0].variables.space)
+ call assert_equal(w2_id, tablist[0].windows[0])
+ call assert_equal([], gettabinfo(3))
+
+ tabonly | only
+
+ lexpr ''
+ lopen
+ copen
+ let winlist = getwininfo()
+ call assert_false(winlist[0].quickfix)
+ call assert_false(winlist[0].loclist)
+ call assert_true(winlist[1].quickfix)
+ call assert_true(winlist[1].loclist)
+ call assert_true(winlist[2].quickfix)
+ call assert_false(winlist[2].loclist)
+ wincmd t | only
+endfunction
+
+function Test_get_buf_options()
+ let opts = getbufvar(bufnr('%'), '&')
+ call assert_equal(v:t_dict, type(opts))
+ call assert_equal(8, opts.tabstop)
+endfunc
+
+function Test_get_win_options()
+ if has('folding')
+ set foldlevel=999
+ endif
+ set list
+ let opts = getwinvar(1, '&')
+ call assert_equal(v:t_dict, type(opts))
+ call assert_equal(0, opts.linebreak)
+ call assert_equal(1, opts.list)
+ if has('folding')
+ call assert_equal(999, opts.foldlevel)
+ endif
+ if has('signs')
+ call assert_equal('auto', opts.signcolumn)
+ endif
+
+ let opts = gettabwinvar(1, 1, '&')
+ call assert_equal(v:t_dict, type(opts))
+ call assert_equal(0, opts.linebreak)
+ call assert_equal(1, opts.list)
+ if has('signs')
+ call assert_equal('auto', opts.signcolumn)
+ endif
+ set list&
+ if has('folding')
+ set foldlevel=0
+ endif
+endfunc
diff --git a/src/nvim/testdir/test_cd.vim b/src/nvim/testdir/test_cd.vim
new file mode 100644
index 0000000000..770ed55b8d
--- /dev/null
+++ b/src/nvim/testdir/test_cd.vim
@@ -0,0 +1,67 @@
+" Test for :cd
+
+func Test_cd_large_path()
+ " This used to crash with a heap write overflow.
+ call assert_fails('cd ' . repeat('x', 5000), 'E472:')
+endfunc
+
+func Test_cd_up_and_down()
+ let path = getcwd()
+ cd ..
+ call assert_notequal(path, getcwd())
+ exe 'cd ' . path
+ call assert_equal(path, getcwd())
+endfunc
+
+func Test_cd_no_arg()
+ if has('unix')
+ " Test that cd without argument goes to $HOME directory on Unix systems.
+ let path = getcwd()
+ cd
+ call assert_equal($HOME, getcwd())
+ call assert_notequal(path, getcwd())
+ exe 'cd ' . path
+ call assert_equal(path, getcwd())
+ else
+ " Test that cd without argument echoes cwd on non-Unix systems.
+ call assert_match(getcwd(), execute('cd'))
+ endif
+endfunc
+
+func Test_cd_minus()
+ " Test the :cd - goes back to the previous directory.
+ let path = getcwd()
+ cd ..
+ let path_dotdot = getcwd()
+ call assert_notequal(path, path_dotdot)
+ cd -
+ call assert_equal(path, getcwd())
+ cd -
+ call assert_equal(path_dotdot, getcwd())
+ cd -
+ call assert_equal(path, getcwd())
+endfunc
+
+func Test_cd_with_cpo_chdir()
+ e Xfoo
+ call setline(1, 'foo')
+ let path = getcwd()
+ " set cpo+=.
+
+ " :cd should fail when buffer is modified and 'cpo' contains dot.
+ " call assert_fails('cd ..', 'E747:')
+ call assert_equal(path, getcwd())
+
+ " :cd with exclamation mark should succeed.
+ cd! ..
+ call assert_notequal(path, getcwd())
+
+ " :cd should succeed when buffer has been written.
+ w!
+ exe 'cd ' . path
+ call assert_equal(path, getcwd())
+
+ call delete('Xfoo')
+ set cpo&
+ bw!
+endfunc
diff --git a/src/nvim/testdir/test_changedtick.vim b/src/nvim/testdir/test_changedtick.vim
new file mode 100644
index 0000000000..3a91bb54aa
--- /dev/null
+++ b/src/nvim/testdir/test_changedtick.vim
@@ -0,0 +1,57 @@
+" Tests for b:changedtick
+
+func Test_changedtick_increments()
+ new
+ " New buffer has an empty line, tick starts at 2.
+ let expected = 2
+ call assert_equal(expected, b:changedtick)
+ call assert_equal(expected, b:['changedtick'])
+ call setline(1, 'hello')
+ let expected += 1
+ call assert_equal(expected, b:changedtick)
+ call assert_equal(expected, b:['changedtick'])
+ undo
+ " Somehow undo counts as two changes.
+ let expected += 2
+ call assert_equal(expected, b:changedtick)
+ call assert_equal(expected, b:['changedtick'])
+ bwipe!
+endfunc
+
+func Test_changedtick_dict_entry()
+ let d = b:
+ call assert_equal(b:changedtick, d['changedtick'])
+endfunc
+
+func Test_changedtick_bdel()
+ new
+ let bnr = bufnr('%')
+ let v = b:changedtick
+ bdel
+ " Delete counts as a change too.
+ call assert_equal(v + 1, getbufvar(bnr, 'changedtick'))
+endfunc
+
+func Test_changedtick_islocked()
+ call assert_equal(0, islocked('b:changedtick'))
+ let d = b:
+ call assert_equal(0, islocked('d.changedtick'))
+endfunc
+
+func Test_changedtick_fixed()
+ call assert_fails('let b:changedtick = 4', 'E46:')
+ call assert_fails('let b:["changedtick"] = 4', 'E46:')
+
+ call assert_fails('lockvar b:changedtick', 'E940:')
+ call assert_fails('lockvar b:["changedtick"]', 'E46:')
+ call assert_fails('unlockvar b:changedtick', 'E940:')
+ call assert_fails('unlockvar b:["changedtick"]', 'E46:')
+ call assert_fails('unlet b:changedtick', 'E795:')
+ call assert_fails('unlet b:["changedtick"]', 'E46:')
+
+ let d = b:
+ call assert_fails('lockvar d["changedtick"]', 'E46:')
+ call assert_fails('unlockvar d["changedtick"]', 'E46:')
+ call assert_fails('unlet d["changedtick"]', 'E46:')
+
+endfunc
diff --git a/src/nvim/testdir/test_charsearch.vim b/src/nvim/testdir/test_charsearch.vim
new file mode 100644
index 0000000000..8b313b5a35
--- /dev/null
+++ b/src/nvim/testdir/test_charsearch.vim
@@ -0,0 +1,62 @@
+
+function! Test_charsearch()
+ enew!
+ call append(0, ['Xabcdefghijkemnopqretuvwxyz',
+ \ 'Yabcdefghijkemnopqretuvwxyz',
+ \ 'Zabcdefghijkemnokqretkvwxyz'])
+ " check that "fe" and ";" work
+ 1
+ normal! ylfep;;p,,p
+ call assert_equal('XabcdeXfghijkeXmnopqreXtuvwxyz', getline(1))
+ " check that save/restore works
+ 2
+ normal! ylfep
+ let csave = getcharsearch()
+ normal! fip
+ call setcharsearch(csave)
+ normal! ;p;p
+ call assert_equal('YabcdeYfghiYjkeYmnopqreYtuvwxyz', getline(2))
+
+ " check that setcharsearch() changes the settings.
+ 3
+ normal! ylfep
+ call setcharsearch({'char': 'k'})
+ normal! ;p
+ call setcharsearch({'forward': 0})
+ normal! $;p
+ call setcharsearch({'until': 1})
+ set cpo-=;
+ normal! ;;p
+ call assert_equal('ZabcdeZfghijkZZemnokqretkZvwxyz', getline(3))
+ enew!
+endfunction
+
+" Test for t,f,F,T movement commands and 'cpo-;' setting
+function! Test_search_cmds()
+ enew!
+ call append(0, ["aaa two three four", " zzz", "yyy ",
+ \ "bbb yee yoo four", "ccc two three four",
+ \ "ddd yee yoo four"])
+ set cpo-=;
+ 1
+ normal! 0tt;D
+ 2
+ normal! 0fz;D
+ 3
+ normal! $Fy;D
+ 4
+ normal! $Ty;D
+ set cpo+=;
+ 5
+ normal! 0tt;;D
+ 6
+ normal! $Ty;;D
+
+ call assert_equal('aaa two', getline(1))
+ call assert_equal(' z', getline(2))
+ call assert_equal('y', getline(3))
+ call assert_equal('bbb y', getline(4))
+ call assert_equal('ccc', getline(5))
+ call assert_equal('ddd yee y', getline(6))
+ enew!
+endfunction
diff --git a/src/nvim/testdir/test_charsearch_utf8.vim b/src/nvim/testdir/test_charsearch_utf8.vim
new file mode 100644
index 0000000000..ade7dd408c
--- /dev/null
+++ b/src/nvim/testdir/test_charsearch_utf8.vim
@@ -0,0 +1,22 @@
+" Tests for related f{char} and t{char} using utf-8.
+if !has('multi_byte')
+ finish
+endif
+
+" Test for t,f,F,T movement commands
+function! Test_search_cmds()
+ new!
+ call setline(1, "ใƒปๆœ€ๅˆใ‹ใ‚‰ๆœ€ๅพŒใพใงๆœ€ๅผทใฎVimใฏๆœ€้ซ˜")
+ 1
+ normal! fๆœ€
+ call assert_equal([0, 1, 4, 0], getpos('.'))
+ normal! ;
+ call assert_equal([0, 1, 16, 0], getpos('.'))
+ normal! 2;
+ call assert_equal([0, 1, 43, 0], getpos('.'))
+ normal! ,
+ call assert_equal([0, 1, 28, 0], getpos('.'))
+ bw!
+endfunction
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_cindent.vim b/src/nvim/testdir/test_cindent.vim
new file mode 100644
index 0000000000..7c2c5e341c
--- /dev/null
+++ b/src/nvim/testdir/test_cindent.vim
@@ -0,0 +1,105 @@
+" Test for cinoptions and cindent
+"
+" TODO: rewrite test3.in into this new style test
+
+func Test_cino_hash()
+ " Test that curbuf->b_ind_hash_comment is correctly reset
+ new
+ setlocal cindent cinoptions=#1
+ setlocal cinoptions=
+ call setline(1, ["#include <iostream>"])
+ call cursor(1, 1)
+ norm! o#include
+ "call feedkeys("o#include\<esc>", 't')
+ call assert_equal(["#include <iostream>", "#include"], getline(1,2))
+ bwipe!
+endfunc
+
+func Test_cino_extern_c()
+ " Test for cino-E
+
+ let without_ind = [
+ \ '#ifdef __cplusplus',
+ \ 'extern "C" {',
+ \ '#endif',
+ \ 'int func_a(void);',
+ \ '#ifdef __cplusplus',
+ \ '}',
+ \ '#endif'
+ \ ]
+
+ let with_ind = [
+ \ '#ifdef __cplusplus',
+ \ 'extern "C" {',
+ \ '#endif',
+ \ "\tint func_a(void);",
+ \ '#ifdef __cplusplus',
+ \ '}',
+ \ '#endif'
+ \ ]
+ new
+ setlocal cindent cinoptions=E0
+ call setline(1, without_ind)
+ call feedkeys("gg=G", 'tx')
+ call assert_equal(with_ind, getline(1, '$'))
+
+ setlocal cinoptions=E-s
+ call setline(1, with_ind)
+ call feedkeys("gg=G", 'tx')
+ call assert_equal(without_ind, getline(1, '$'))
+
+ setlocal cinoptions=Es
+ let tests = [
+ \ ['recognized', ['extern "C" {'], "\t\t;"],
+ \ ['recognized', ['extern "C++" {'], "\t\t;"],
+ \ ['recognized', ['extern /* com */ "C"{'], "\t\t;"],
+ \ ['recognized', ['extern"C"{'], "\t\t;"],
+ \ ['recognized', ['extern "C"', '{'], "\t\t;"],
+ \ ['not recognized', ['extern {'], "\t;"],
+ \ ['not recognized', ['extern /*"C"*/{'], "\t;"],
+ \ ['not recognized', ['extern "C" //{'], ";"],
+ \ ['not recognized', ['extern "C" /*{*/'], ";"],
+ \ ]
+
+ for pair in tests
+ let lines = pair[1]
+ call setline(1, lines)
+ call feedkeys(len(lines) . "Go;", 'tx')
+ call assert_equal(pair[2], getline(len(lines) + 1), 'Failed for "' . string(lines) . '"')
+ endfor
+
+ bwipe!
+endfunc
+
+func Test_cindent_rawstring()
+ new
+ setl cindent
+ call feedkeys("i" .
+ \ "int main() {\<CR>" .
+ \ "R\"(\<CR>" .
+ \ ")\";\<CR>" .
+ \ "statement;\<Esc>", "x")
+ call assert_equal("\tstatement;", getline(line('.')))
+ bw!
+endfunc
+
+func Test_cindent_expr()
+ new
+ func! MyIndentFunction()
+ return v:lnum == 1 ? shiftwidth() : 0
+ endfunc
+ setl expandtab sw=8 indentkeys+=; indentexpr=MyIndentFunction()
+ call setline(1, ['var_a = something()', 'b = something()'])
+ call cursor(1, 1)
+ call feedkeys("^\<c-v>j$A;\<esc>", 'tnix')
+ call assert_equal([' var_a = something();', 'b = something();'], getline(1, '$'))
+
+ %d
+ call setline(1, [' var_a = something()', ' b = something()'])
+ call cursor(1, 1)
+ call feedkeys("^\<c-v>j$A;\<esc>", 'tnix')
+ call assert_equal([' var_a = something();', ' b = something()'], getline(1, '$'))
+ bw!
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_clientserver.vim b/src/nvim/testdir/test_clientserver.vim
new file mode 100644
index 0000000000..60ef20e0b2
--- /dev/null
+++ b/src/nvim/testdir/test_clientserver.vim
@@ -0,0 +1,107 @@
+" Tests for the +clientserver feature.
+
+if !has('job') || !has('clientserver')
+ finish
+endif
+
+source shared.vim
+
+func Test_client_server()
+ let cmd = GetVimCommand()
+ if cmd == ''
+ return
+ endif
+ if has('x11')
+ if empty($DISPLAY)
+ throw 'Skipped: $DISPLAY is not set'
+ endif
+ try
+ call remote_send('xxx', '')
+ catch
+ if v:exception =~ 'E240:'
+ throw 'Skipped: no connection to the X server'
+ endif
+ " ignore other errors
+ endtry
+ endif
+
+ let name = 'XVIMTEST'
+ let cmd .= ' --servername ' . name
+ let g:job = job_start(cmd, {'stoponexit': 'kill', 'out_io': 'null'})
+ call WaitFor('job_status(g:job) == "run"')
+ if job_status(g:job) != 'run'
+ call assert_report('Cannot run the Vim server')
+ return
+ endif
+
+ " Takes a short while for the server to be active.
+ call WaitFor('serverlist() =~ "' . name . '"')
+ call assert_match(name, serverlist())
+
+ call remote_foreground(name)
+
+ call remote_send(name, ":let testvar = 'yes'\<CR>")
+ call WaitFor('remote_expr("' . name . '", "exists(\"testvar\") ? testvar : \"\"", "", 1) == "yes"')
+ call assert_equal('yes', remote_expr(name, "testvar", "", 2))
+
+ if has('unix') && has('gui') && !has('gui_running')
+ " Running in a terminal and the GUI is available: Tell the server to open
+ " the GUI and check that the remote command still works.
+ " Need to wait for the GUI to start up, otherwise the send hangs in trying
+ " to send to the terminal window.
+ if has('gui_athena') || has('gui_motif')
+ " For those GUIs, ignore the 'failed to create input context' error.
+ call remote_send(name, ":call test_ignore_error('E285') | gui -f\<CR>")
+ else
+ call remote_send(name, ":gui -f\<CR>")
+ endif
+ " Wait for the server to be up and answering requests.
+ sleep 100m
+ call WaitFor('remote_expr("' . name . '", "v:version", "", 1) != ""')
+ call assert_true(remote_expr(name, "v:version", "", 1) != "")
+
+ call remote_send(name, ":let testvar = 'maybe'\<CR>")
+ call WaitFor('remote_expr("' . name . '", "testvar", "", 1) == "maybe"')
+ call assert_equal('maybe', remote_expr(name, "testvar", "", 2))
+ endif
+
+ call assert_fails('call remote_send("XXX", ":let testvar = ''yes''\<CR>")', 'E241')
+
+ " Expression evaluated locally.
+ if v:servername == ''
+ call remote_startserver('MYSELF')
+ " May get MYSELF1 when running the test again.
+ call assert_match('MYSELF', v:servername)
+ endif
+ let g:testvar = 'myself'
+ call assert_equal('myself', remote_expr(v:servername, 'testvar'))
+
+ call remote_send(name, ":call server2client(expand('<client>'), 'got it')\<CR>", 'g:myserverid')
+ call assert_equal('got it', remote_read(g:myserverid, 2))
+
+ call remote_send(name, ":call server2client(expand('<client>'), 'another')\<CR>", 'g:myserverid')
+ let peek_result = 'nothing'
+ let r = remote_peek(g:myserverid, 'peek_result')
+ " unpredictable whether the result is already avaialble.
+ if r > 0
+ call assert_equal('another', peek_result)
+ elseif r == 0
+ call assert_equal('nothing', peek_result)
+ else
+ call assert_report('remote_peek() failed')
+ endif
+ let g:peek_result = 'empty'
+ call WaitFor('remote_peek(g:myserverid, "g:peek_result") > 0')
+ call assert_equal('another', g:peek_result)
+ call assert_equal('another', remote_read(g:myserverid, 2))
+
+ call remote_send(name, ":qa!\<CR>")
+ call WaitFor('job_status(g:job) == "dead"')
+ if job_status(g:job) != 'dead'
+ call assert_report('Server did not exit')
+ call job_stop(g:job, 'kill')
+ endif
+endfunc
+
+" Uncomment this line to get a debugging log
+" call ch_logfile('channellog', 'w')
diff --git a/src/nvim/testdir/test_close_count.vim b/src/nvim/testdir/test_close_count.vim
new file mode 100644
index 0000000000..1f9adba32d
--- /dev/null
+++ b/src/nvim/testdir/test_close_count.vim
@@ -0,0 +1,174 @@
+
+" Tests for :[count]close! command
+func Test_close_count()
+ enew! | only
+
+ let wids = [win_getid()]
+ for i in range(5)
+ new
+ call add(wids, win_getid())
+ endfor
+
+ 4wincmd w
+ close!
+ let ids = []
+ windo call add(ids, win_getid())
+ call assert_equal([wids[5], wids[4], wids[3], wids[1], wids[0]], ids)
+
+ 1close!
+ let ids = []
+ windo call add(ids, win_getid())
+ call assert_equal([wids[4], wids[3], wids[1], wids[0]], ids)
+
+ $close!
+ let ids = []
+ windo call add(ids, win_getid())
+ call assert_equal([wids[4], wids[3], wids[1]], ids)
+
+ 1wincmd w
+ 2close!
+ let ids = []
+ windo call add(ids, win_getid())
+ call assert_equal([wids[4], wids[1]], ids)
+
+ 1wincmd w
+ new
+ call add(wids, win_getid())
+ new
+ call add(wids, win_getid())
+ 2wincmd w
+ -1close!
+ let ids = []
+ windo call add(ids, win_getid())
+ call assert_equal([wids[6], wids[4], wids[1]], ids)
+
+ 2wincmd w
+ +1close!
+ let ids = []
+ windo call add(ids, win_getid())
+ call assert_equal([wids[6], wids[4]], ids)
+
+ only!
+endfunc
+
+" Tests for :[count]hide command
+func Test_hide_count()
+ enew! | only
+
+ let wids = [win_getid()]
+ for i in range(5)
+ new
+ call add(wids, win_getid())
+ endfor
+
+ 4wincmd w
+ .hide
+ let ids = []
+ windo call add(ids, win_getid())
+ call assert_equal([wids[5], wids[4], wids[3], wids[1], wids[0]], ids)
+
+ 1hide
+ let ids = []
+ windo call add(ids, win_getid())
+ call assert_equal([wids[4], wids[3], wids[1], wids[0]], ids)
+
+ $hide
+ let ids = []
+ windo call add(ids, win_getid())
+ call assert_equal([wids[4], wids[3], wids[1]], ids)
+
+ 1wincmd w
+ 2hide
+ let ids = []
+ windo call add(ids, win_getid())
+ call assert_equal([wids[4], wids[1]], ids)
+
+ 1wincmd w
+ new
+ call add(wids, win_getid())
+ new
+ call add(wids, win_getid())
+ 3wincmd w
+ -hide
+ let ids = []
+ windo call add(ids, win_getid())
+ call assert_equal([wids[7], wids[4], wids[1]], ids)
+
+ 2wincmd w
+ +hide
+ let ids = []
+ windo call add(ids, win_getid())
+ call assert_equal([wids[7], wids[4]], ids)
+
+ only!
+endfunc
+
+" Tests for :[count]close! command with 'hidden'
+func Test_hidden_close_count()
+ enew! | only
+
+ let wids = [win_getid()]
+ for i in range(5)
+ new
+ call add(wids, win_getid())
+ endfor
+
+ set hidden
+
+ $ hide
+ let ids = []
+ windo call add(ids, win_getid())
+ call assert_equal([wids[5], wids[4], wids[3], wids[2], wids[1]], ids)
+
+ $-1 close!
+ let ids = []
+ windo call add(ids, win_getid())
+ call assert_equal([wids[5], wids[4], wids[3], wids[1]], ids)
+
+ 1wincmd w
+ .+close!
+ let ids = []
+ windo call add(ids, win_getid())
+ call assert_equal([wids[5], wids[3], wids[1]], ids)
+
+ set nohidden
+ only!
+endfunc
+
+" Tests for 'CTRL-W c' command to close windows.
+func Test_winclose_command()
+ enew! | only
+
+ let wids = [win_getid()]
+ for i in range(5)
+ new
+ call add(wids, win_getid())
+ endfor
+
+ set hidden
+
+ 4wincmd w
+ exe "normal \<C-W>c"
+ let ids = []
+ windo call add(ids, win_getid())
+ call assert_equal([wids[5], wids[4], wids[3], wids[1], wids[0]], ids)
+
+ exe "normal 1\<C-W>c"
+ let ids = []
+ windo call add(ids, win_getid())
+ call assert_equal([wids[4], wids[3], wids[1], wids[0]], ids)
+
+ exe "normal 9\<C-W>c"
+ let ids = []
+ windo call add(ids, win_getid())
+ call assert_equal([wids[4], wids[3], wids[1]], ids)
+
+ 1wincmd w
+ exe "normal 2\<C-W>c"
+ let ids = []
+ windo call add(ids, win_getid())
+ call assert_equal([wids[4], wids[1]], ids)
+
+ set nohidden
+ only!
+endfunc
diff --git a/src/nvim/testdir/test_cmdline.vim b/src/nvim/testdir/test_cmdline.vim
new file mode 100644
index 0000000000..26f1dcc333
--- /dev/null
+++ b/src/nvim/testdir/test_cmdline.vim
@@ -0,0 +1,525 @@
+" Tests for editing the command line.
+
+
+func Test_complete_tab()
+ call writefile(['testfile'], 'Xtestfile')
+ call feedkeys(":e Xtestf\t\r", "tx")
+ call assert_equal('testfile', getline(1))
+ call delete('Xtestfile')
+endfunc
+
+func Test_complete_list()
+ " We can't see the output, but at least we check the code runs properly.
+ call feedkeys(":e test\<C-D>\r", "tx")
+ call assert_equal('test', expand('%:t'))
+endfunc
+
+func Test_complete_wildmenu()
+ call writefile(['testfile1'], 'Xtestfile1')
+ call writefile(['testfile2'], 'Xtestfile2')
+ set wildmenu
+ call feedkeys(":e Xtestf\t\t\r", "tx")
+ call assert_equal('testfile2', getline(1))
+
+ call delete('Xtestfile1')
+ call delete('Xtestfile2')
+ set nowildmenu
+endfunc
+
+func Test_map_completion()
+ if !has('cmdline_compl')
+ return
+ endif
+ call feedkeys(":map <unique> <si\<Tab>\<Home>\"\<CR>", 'xt')
+ call assert_equal('"map <unique> <silent>', getreg(':'))
+ call feedkeys(":map <script> <un\<Tab>\<Home>\"\<CR>", 'xt')
+ call assert_equal('"map <script> <unique>', getreg(':'))
+ call feedkeys(":map <expr> <sc\<Tab>\<Home>\"\<CR>", 'xt')
+ call assert_equal('"map <expr> <script>', getreg(':'))
+ call feedkeys(":map <buffer> <e\<Tab>\<Home>\"\<CR>", 'xt')
+ call assert_equal('"map <buffer> <expr>', getreg(':'))
+ call feedkeys(":map <nowait> <b\<Tab>\<Home>\"\<CR>", 'xt')
+ call assert_equal('"map <nowait> <buffer>', getreg(':'))
+ call feedkeys(":map <special> <no\<Tab>\<Home>\"\<CR>", 'xt')
+ call assert_equal('"map <special> <nowait>', getreg(':'))
+ call feedkeys(":map <silent> <sp\<Tab>\<Home>\"\<CR>", 'xt')
+ call assert_equal('"map <silent> <special>', getreg(':'))
+endfunc
+
+func Test_match_completion()
+ if !has('cmdline_compl')
+ return
+ endif
+ hi Aardig ctermfg=green
+ call feedkeys(":match \<Tab>\<Home>\"\<CR>", 'xt')
+ call assert_equal('"match Aardig', getreg(':'))
+ call feedkeys(":match \<S-Tab>\<Home>\"\<CR>", 'xt')
+ call assert_equal('"match none', getreg(':'))
+endfunc
+
+func Test_highlight_completion()
+ if !has('cmdline_compl')
+ return
+ endif
+ hi Aardig ctermfg=green
+ call feedkeys(":hi \<Tab>\<Home>\"\<CR>", 'xt')
+ call assert_equal('"hi Aardig', getreg(':'))
+ call feedkeys(":hi default \<Tab>\<Home>\"\<CR>", 'xt')
+ call assert_equal('"hi default Aardig', getreg(':'))
+ call feedkeys(":hi clear Aa\<Tab>\<Home>\"\<CR>", 'xt')
+ call assert_equal('"hi clear Aardig', getreg(':'))
+ call feedkeys(":hi li\<S-Tab>\<Home>\"\<CR>", 'xt')
+ call assert_equal('"hi link', getreg(':'))
+ call feedkeys(":hi d\<S-Tab>\<Home>\"\<CR>", 'xt')
+ call assert_equal('"hi default', getreg(':'))
+ call feedkeys(":hi c\<S-Tab>\<Home>\"\<CR>", 'xt')
+ call assert_equal('"hi clear', getreg(':'))
+
+ " A cleared group does not show up in completions.
+ hi Anders ctermfg=green
+ call assert_equal(['Aardig', 'Anders'], getcompletion('A', 'highlight'))
+ hi clear Aardig
+ call assert_equal(['Anders'], getcompletion('A', 'highlight'))
+ hi clear Anders
+ call assert_equal([], getcompletion('A', 'highlight'))
+endfunc
+
+func Test_expr_completion()
+ if !has('cmdline_compl')
+ return
+ endif
+ for cmd in [
+ \ 'let a = ',
+ \ 'if',
+ \ 'elseif',
+ \ 'while',
+ \ 'for',
+ \ 'echo',
+ \ 'echon',
+ \ 'execute',
+ \ 'echomsg',
+ \ 'echoerr',
+ \ 'call',
+ \ 'return',
+ \ 'cexpr',
+ \ 'caddexpr',
+ \ 'cgetexpr',
+ \ 'lexpr',
+ \ 'laddexpr',
+ \ 'lgetexpr']
+ call feedkeys(":" . cmd . " getl\<Tab>\<Home>\"\<CR>", 'xt')
+ call assert_equal('"' . cmd . ' getline(', getreg(':'))
+ endfor
+endfunc
+
+func Test_getcompletion()
+ if !has('cmdline_compl')
+ return
+ endif
+ let groupcount = len(getcompletion('', 'event'))
+ call assert_true(groupcount > 0)
+ let matchcount = len(getcompletion('File', 'event'))
+ call assert_true(matchcount > 0)
+ call assert_true(groupcount > matchcount)
+
+ if has('menu')
+ source $VIMRUNTIME/menu.vim
+ let matchcount = len(getcompletion('', 'menu'))
+ call assert_true(matchcount > 0)
+ call assert_equal(['File.'], getcompletion('File', 'menu'))
+ call assert_true(matchcount > 0)
+ let matchcount = len(getcompletion('File.', 'menu'))
+ call assert_true(matchcount > 0)
+ endif
+
+ let l = getcompletion('v:n', 'var')
+ call assert_true(index(l, 'v:null') >= 0)
+ let l = getcompletion('v:notexists', 'var')
+ call assert_equal([], l)
+
+ args a.c b.c
+ let l = getcompletion('', 'arglist')
+ call assert_equal(['a.c', 'b.c'], l)
+ %argdelete
+
+ let l = getcompletion('', 'augroup')
+ call assert_true(index(l, 'END') >= 0)
+ let l = getcompletion('blahblah', 'augroup')
+ call assert_equal([], l)
+
+ let l = getcompletion('', 'behave')
+ call assert_true(index(l, 'mswin') >= 0)
+ let l = getcompletion('not', 'behave')
+ call assert_equal([], l)
+
+ let l = getcompletion('', 'color')
+ call assert_true(index(l, 'default') >= 0)
+ let l = getcompletion('dirty', 'color')
+ call assert_equal([], l)
+
+ let l = getcompletion('', 'command')
+ call assert_true(index(l, 'sleep') >= 0)
+ let l = getcompletion('awake', 'command')
+ call assert_equal([], l)
+
+ let l = getcompletion('', 'dir')
+ call assert_true(index(l, expand('sautest/')) >= 0)
+ let l = getcompletion('NoMatch', 'dir')
+ call assert_equal([], l)
+
+ let l = getcompletion('exe', 'expression')
+ call assert_true(index(l, 'executable(') >= 0)
+ let l = getcompletion('kill', 'expression')
+ call assert_equal([], l)
+
+ let l = getcompletion('tag', 'function')
+ call assert_true(index(l, 'taglist(') >= 0)
+ let l = getcompletion('paint', 'function')
+ call assert_equal([], l)
+
+ let Flambda = {-> 'hello'}
+ let l = getcompletion('', 'function')
+ let l = filter(l, {i, v -> v =~ 'lambda'})
+ call assert_equal(0, len(l))
+
+ let l = getcompletion('run', 'file')
+ call assert_true(index(l, 'runtest.vim') >= 0)
+ let l = getcompletion('walk', 'file')
+ call assert_equal([], l)
+ set wildignore=*.vim
+ let l = getcompletion('run', 'file', 1)
+ call assert_true(index(l, 'runtest.vim') < 0)
+ set wildignore&
+
+ let l = getcompletion('ha', 'filetype')
+ call assert_true(index(l, 'hamster') >= 0)
+ let l = getcompletion('horse', 'filetype')
+ call assert_equal([], l)
+
+ let l = getcompletion('z', 'syntax')
+ call assert_true(index(l, 'zimbu') >= 0)
+ let l = getcompletion('emacs', 'syntax')
+ call assert_equal([], l)
+
+ let l = getcompletion('jikes', 'compiler')
+ call assert_true(index(l, 'jikes') >= 0)
+ let l = getcompletion('break', 'compiler')
+ call assert_equal([], l)
+
+ helptags ALL
+ let l = getcompletion('last', 'help')
+ call assert_true(index(l, ':tablast') >= 0)
+ let l = getcompletion('giveup', 'help')
+ call assert_equal([], l)
+
+ let l = getcompletion('time', 'option')
+ call assert_true(index(l, 'timeoutlen') >= 0)
+ let l = getcompletion('space', 'option')
+ call assert_equal([], l)
+
+ let l = getcompletion('er', 'highlight')
+ call assert_true(index(l, 'ErrorMsg') >= 0)
+ let l = getcompletion('dark', 'highlight')
+ call assert_equal([], l)
+
+ let l = getcompletion('', 'messages')
+ call assert_true(index(l, 'clear') >= 0)
+ let l = getcompletion('not', 'messages')
+ call assert_equal([], l)
+
+ let l = getcompletion('', 'mapclear')
+ call assert_true(index(l, '<buffer>') >= 0)
+ let l = getcompletion('not', 'mapclear')
+ call assert_equal([], l)
+
+ if has('cscope')
+ let l = getcompletion('', 'cscope')
+ let cmds = ['add', 'find', 'help', 'kill', 'reset', 'show']
+ call assert_equal(cmds, l)
+ " using cmdline completion must not change the result
+ call feedkeys(":cscope find \<c-d>\<c-c>", 'xt')
+ let l = getcompletion('', 'cscope')
+ call assert_equal(cmds, l)
+ let keys = ['a', 'c', 'd', 'e', 'f', 'g', 'i', 's', 't']
+ let l = getcompletion('find ', 'cscope')
+ call assert_equal(keys, l)
+ endif
+
+ if has('signs')
+ sign define Testing linehl=Comment
+ let l = getcompletion('', 'sign')
+ let cmds = ['define', 'jump', 'list', 'place', 'undefine', 'unplace']
+ call assert_equal(cmds, l)
+ " using cmdline completion must not change the result
+ call feedkeys(":sign list \<c-d>\<c-c>", 'xt')
+ let l = getcompletion('', 'sign')
+ call assert_equal(cmds, l)
+ let l = getcompletion('list ', 'sign')
+ call assert_equal(['Testing'], l)
+ endif
+
+ " Command line completion tests
+ let l = getcompletion('cd ', 'cmdline')
+ call assert_true(index(l, expand('sautest/')) >= 0)
+ let l = getcompletion('cd NoMatch', 'cmdline')
+ call assert_equal([], l)
+ let l = getcompletion('let v:n', 'cmdline')
+ call assert_true(index(l, 'v:null') >= 0)
+ let l = getcompletion('let v:notexists', 'cmdline')
+ call assert_equal([], l)
+ let l = getcompletion('call tag', 'cmdline')
+ call assert_true(index(l, 'taglist(') >= 0)
+ let l = getcompletion('call paint', 'cmdline')
+ call assert_equal([], l)
+
+ " For others test if the name is recognized.
+ let names = ['buffer', 'environment', 'file_in_path',
+ \ 'mapping', 'shellcmd', 'tag', 'tag_listfiles', 'user']
+ if has('cmdline_hist')
+ call add(names, 'history')
+ endif
+ if has('gettext')
+ call add(names, 'locale')
+ endif
+ if has('profile')
+ call add(names, 'syntime')
+ endif
+
+ set tags=Xtags
+ call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//", "word\tfile\tcmd"], 'Xtags')
+
+ for name in names
+ let matchcount = len(getcompletion('', name))
+ call assert_true(matchcount >= 0, 'No matches for ' . name)
+ endfor
+
+ call delete('Xtags')
+
+ call assert_fails('call getcompletion("", "burp")', 'E475:')
+endfunc
+
+func Test_expand_star_star()
+ call mkdir('a/b', 'p')
+ call writefile(['asdfasdf'], 'a/b/fileXname')
+ call feedkeys(":find **/fileXname\<Tab>\<CR>", 'xt')
+ call assert_equal('find '.expand('a/b/fileXname'), getreg(':'))
+ bwipe!
+ call delete('a', 'rf')
+endfunc
+
+func Test_paste_in_cmdline()
+ let @a = "def"
+ call feedkeys(":abc \<C-R>a ghi\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"abc def ghi', @:)
+
+ new
+ call setline(1, 'asdf.x /tmp/some verylongword a;b-c*d ')
+
+ call feedkeys(":aaa \<C-R>\<C-W> bbb\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"aaa asdf bbb', @:)
+
+ call feedkeys("ft:aaa \<C-R>\<C-F> bbb\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"aaa /tmp/some bbb', @:)
+
+ call feedkeys(":aaa \<C-R>\<C-L> bbb\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"aaa '.getline(1).' bbb', @:)
+
+ set incsearch
+ call feedkeys("fy:aaa veryl\<C-R>\<C-W> bbb\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"aaa verylongword bbb', @:)
+
+ call feedkeys("f;:aaa \<C-R>\<C-A> bbb\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"aaa a;b-c*d bbb', @:)
+
+ call feedkeys(":\<C-\>etoupper(getline(1))\<CR>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"ASDF.X /TMP/SOME VERYLONGWORD A;B-C*D ', @:)
+ bwipe!
+
+ " Error while typing a command used to cause that it was not executed
+ " in the end.
+ new
+ try
+ call feedkeys(":file \<C-R>%Xtestfile\<CR>", 'tx')
+ catch /^Vim\%((\a\+)\)\=:E32/
+ " ignore error E32
+ endtry
+ call assert_equal("Xtestfile", bufname("%"))
+ bwipe!
+endfunc
+
+func Test_remove_char_in_cmdline()
+ call feedkeys(":abc def\<S-Left>\<Del>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"abc ef', @:)
+
+ call feedkeys(":abc def\<S-Left>\<BS>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"abcdef', @:)
+
+ call feedkeys(":abc def ghi\<S-Left>\<C-W>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"abc ghi', @:)
+
+ call feedkeys(":abc def\<S-Left>\<C-U>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"def', @:)
+endfunc
+
+func Test_illegal_address1()
+ new
+ 2;'(
+ 2;')
+ quit
+endfunc
+
+func Test_illegal_address2()
+ call writefile(['c', 'x', ' x', '.', '1;y'], 'Xtest.vim')
+ new
+ source Xtest.vim
+ " Trigger calling validate_cursor()
+ diffsp Xtest.vim
+ quit!
+ bwipe!
+ call delete('Xtest.vim')
+endfunc
+
+func Test_cmdline_complete_wildoptions()
+ help
+ call feedkeys(":tag /\<c-a>\<c-b>\"\<cr>", 'tx')
+ let a = join(sort(split(@:)),' ')
+ set wildoptions=tagfile
+ call feedkeys(":tag /\<c-a>\<c-b>\"\<cr>", 'tx')
+ let b = join(sort(split(@:)),' ')
+ call assert_equal(a, b)
+ bw!
+endfunc
+
+func Test_cmdline_complete_user_cmd()
+ command! -complete=color -nargs=1 Foo :
+ call feedkeys(":Foo \<Tab>\<Home>\"\<cr>", 'tx')
+ call assert_equal('"Foo blue', @:)
+ call feedkeys(":Foo b\<Tab>\<Home>\"\<cr>", 'tx')
+ call assert_equal('"Foo blue', @:)
+ delcommand Foo
+endfunc
+
+func Test_cmdline_write_alternatefile()
+ new
+ call setline('.', ['one', 'two'])
+ f foo.txt
+ new
+ f #-A
+ call assert_equal('foo.txt-A', expand('%'))
+ f #<-B.txt
+ call assert_equal('foo-B.txt', expand('%'))
+ f %<
+ call assert_equal('foo-B', expand('%'))
+ new
+ call assert_fails('f #<', 'E95')
+ bw!
+ f foo-B.txt
+ f %<-A
+ call assert_equal('foo-B-A', expand('%'))
+ bw!
+ bw!
+endfunc
+
+" using a leading backslash here
+set cpo+=C
+
+func Test_cmdline_search_range()
+ new
+ call setline(1, ['a', 'b', 'c', 'd'])
+ /d
+ 1,\/s/b/B/
+ call assert_equal('B', getline(2))
+
+ /a
+ $
+ \?,4s/c/C/
+ call assert_equal('C', getline(3))
+
+ call setline(1, ['a', 'b', 'c', 'd'])
+ %s/c/c/
+ 1,\&s/b/B/
+ call assert_equal('B', getline(2))
+
+ bwipe!
+endfunc
+
+" Tests for getcmdline(), getcmdpos() and getcmdtype()
+func Check_cmdline(cmdtype)
+ call assert_equal('MyCmd a', getcmdline())
+ call assert_equal(8, getcmdpos())
+ call assert_equal(a:cmdtype, getcmdtype())
+ return ''
+endfunc
+
+func Test_getcmdtype()
+ call feedkeys(":MyCmd a\<C-R>=Check_cmdline(':')\<CR>\<Esc>", "xt")
+
+ let cmdtype = ''
+ debuggreedy
+ call feedkeys(":debug echo 'test'\<CR>", "t")
+ call feedkeys("let cmdtype = \<C-R>=string(getcmdtype())\<CR>\<CR>", "t")
+ call feedkeys("cont\<CR>", "xt")
+ 0debuggreedy
+ call assert_equal('>', cmdtype)
+
+ call feedkeys("/MyCmd a\<C-R>=Check_cmdline('/')\<CR>\<Esc>", "xt")
+ call feedkeys("?MyCmd a\<C-R>=Check_cmdline('?')\<CR>\<Esc>", "xt")
+
+ call feedkeys(":call input('Answer?')\<CR>", "t")
+ call feedkeys("MyCmd a\<C-R>=Check_cmdline('@')\<CR>\<C-C>", "xt")
+
+ call feedkeys(":insert\<CR>MyCmd a\<C-R>=Check_cmdline('-')\<CR>\<Esc>", "xt")
+
+ cnoremap <expr> <F6> Check_cmdline('=')
+ call feedkeys("a\<C-R>=MyCmd a\<F6>\<Esc>\<Esc>", "xt")
+ cunmap <F6>
+endfunc
+
+func Test_getcmdwintype()
+ call feedkeys("q/:let a = getcmdwintype()\<CR>:q\<CR>", 'x!')
+ call assert_equal('/', a)
+
+ call feedkeys("q?:let a = getcmdwintype()\<CR>:q\<CR>", 'x!')
+ call assert_equal('?', a)
+
+ call feedkeys("q::let a = getcmdwintype()\<CR>:q\<CR>", 'x!')
+ call assert_equal(':', a)
+
+ call feedkeys(":\<C-F>:let a = getcmdwintype()\<CR>:q\<CR>", 'x!')
+ call assert_equal(':', a)
+
+ call assert_equal('', getcmdwintype())
+endfunc
+
+func Test_verbosefile()
+ set verbosefile=Xlog
+ echomsg 'foo'
+ echomsg 'bar'
+ set verbosefile=
+ let log = readfile('Xlog')
+ call assert_match("foo\nbar", join(log, "\n"))
+ call delete('Xlog')
+endfunc
+
+func Test_setcmdpos()
+ func InsertTextAtPos(text, pos)
+ call assert_equal(0, setcmdpos(a:pos))
+ return a:text
+ endfunc
+
+ " setcmdpos() with position in the middle of the command line.
+ call feedkeys(":\"12\<C-R>=InsertTextAtPos('a', 3)\<CR>b\<CR>", 'xt')
+ call assert_equal('"1ab2', @:)
+
+ call feedkeys(":\"12\<C-R>\<C-R>=InsertTextAtPos('a', 3)\<CR>b\<CR>", 'xt')
+ call assert_equal('"1b2a', @:)
+
+ " setcmdpos() with position beyond the end of the command line.
+ call feedkeys(":\"12\<C-B>\<C-R>=InsertTextAtPos('a', 10)\<CR>b\<CR>", 'xt')
+ call assert_equal('"12ab', @:)
+
+ " setcmdpos() returns 1 when not editing the command line.
+ call assert_equal(1, setcmdpos(3))
+endfunc
+
+set cpo&
diff --git a/src/nvim/testdir/test_command_count.vim b/src/nvim/testdir/test_command_count.vim
new file mode 100644
index 0000000000..2d793ed88f
--- /dev/null
+++ b/src/nvim/testdir/test_command_count.vim
@@ -0,0 +1,195 @@
+" Test for user command counts.
+
+func Test_command_count_0()
+ let bufnr = bufnr('%')
+ set hidden
+ set noswapfile
+
+ split DoesNotExistEver
+ let lastbuf = bufnr('$')
+ call setline(1, 'asdf')
+ quit!
+
+ command! -range -addr=loaded_buffers RangeLoadedBuffers :let lines = [<line1>, <line2>]
+ command! -range=% -addr=loaded_buffers RangeLoadedBuffersAll :let lines = [<line1>, <line2>]
+ command! -range -addr=buffers RangeBuffers :let lines = [<line1>, <line2>]
+ command! -range=% -addr=buffers RangeBuffersAll :let lines = [<line1>, <line2>]
+
+ .,$RangeLoadedBuffers
+ call assert_equal([bufnr, bufnr], lines)
+ %RangeLoadedBuffers
+ call assert_equal([bufnr, bufnr], lines)
+ RangeLoadedBuffersAll
+ call assert_equal([bufnr, bufnr], lines)
+ .,$RangeBuffers
+ call assert_equal([bufnr, lastbuf], lines)
+ %RangeBuffers
+ call assert_equal([bufnr, lastbuf], lines)
+ RangeBuffersAll
+ call assert_equal([bufnr, lastbuf], lines)
+
+ delcommand RangeLoadedBuffers
+ delcommand RangeLoadedBuffersAll
+ delcommand RangeBuffers
+ delcommand RangeBuffersAll
+
+ set hidden&
+ set swapfile&
+endfunc
+
+func Test_command_count_1()
+ silent! %argd
+ arga a b c d e
+ argdo echo "loading buffers"
+ argu 3
+ command! -range -addr=arguments RangeArguments :let lines = [<line1>, <line2>]
+ command! -range=% -addr=arguments RangeArgumentsAll :let lines = [<line1>, <line2>]
+ .-,$-RangeArguments
+ call assert_equal([2, 4], lines)
+ %RangeArguments
+ call assert_equal([1, 5], lines)
+ RangeArgumentsAll
+ call assert_equal([1, 5], lines)
+ N
+ .RangeArguments
+ call assert_equal([2, 2], lines)
+ delcommand RangeArguments
+ delcommand RangeArgumentsAll
+
+ split|split|split|split
+ 3wincmd w
+ command! -range -addr=windows RangeWindows :let lines = [<line1>, <line2>]
+ .,$RangeWindows
+ call assert_equal([3, 5], lines)
+ %RangeWindows
+ call assert_equal([1, 5], lines)
+ delcommand RangeWindows
+
+ command! -range=% -addr=windows RangeWindowsAll :let lines = [<line1>, <line2>]
+ RangeWindowsAll
+ call assert_equal([1, 5], lines)
+ delcommand RangeWindowsAll
+ only
+ blast|bd
+
+ tabe|tabe|tabe|tabe
+ normal 2gt
+ command! -range -addr=tabs RangeTabs :let lines = [<line1>, <line2>]
+ .,$RangeTabs
+ call assert_equal([2, 5], lines)
+ %RangeTabs
+ call assert_equal([1, 5], lines)
+ delcommand RangeTabs
+
+ command! -range=% -addr=tabs RangeTabsAll :let lines = [<line1>, <line2>]
+ RangeTabsAll
+ call assert_equal([1, 5], lines)
+ delcommand RangeTabsAll
+ 1tabonly
+
+ s/\n/\r\r\r\r\r/
+ 2ma<
+ $-ma>
+ command! -range=% RangeLines :let lines = [<line1>, <line2>]
+ '<,'>RangeLines
+ call assert_equal([2, 5], lines)
+ delcommand RangeLines
+
+ command! -range=% -buffer LocalRangeLines :let lines = [<line1>, <line2>]
+ '<,'>LocalRangeLines
+ call assert_equal([2, 5], lines)
+ delcommand LocalRangeLines
+endfunc
+
+func Test_command_count_2()
+ silent! %argd
+ arga a b c d
+ call assert_fails('5argu', 'E16:')
+
+ $argu
+ call assert_equal('d', expand('%:t'))
+
+ 1argu
+ call assert_equal('a', expand('%:t'))
+
+ call assert_fails('300b', 'E16:')
+
+ split|split|split|split
+ 0close
+
+ $wincmd w
+ $close
+ call assert_equal(3, winnr())
+
+ call assert_fails('$+close', 'E16:')
+
+ $tabe
+ call assert_equal(2, tabpagenr())
+
+ call assert_fails('$+tabe', 'E16:')
+
+ only!
+ e x
+ 0tabm
+ normal 1gt
+ call assert_equal('x', expand('%:t'))
+
+ tabonly!
+ only!
+endfunc
+
+func Test_command_count_3()
+ let bufnr = bufnr('%')
+ se nohidden
+ e aaa
+ let buf_aaa = bufnr('%')
+ e bbb
+ let buf_bbb = bufnr('%')
+ e ccc
+ let buf_ccc = bufnr('%')
+ exe bufnr . 'buf'
+ call assert_equal([1, 1, 1], [buflisted(buf_aaa), buflisted(buf_bbb), buflisted(buf_ccc)])
+ exe buf_bbb . "," . buf_ccc . "bdelete"
+ call assert_equal([1, 0, 0], [buflisted(buf_aaa), buflisted(buf_bbb), buflisted(buf_ccc)])
+ exe buf_aaa . "bdelete"
+ call assert_equal([0, 0, 0], [buflisted(buf_aaa), buflisted(buf_bbb), buflisted(buf_ccc)])
+endfunc
+
+func Test_command_count_4()
+ %argd
+ let bufnr = bufnr('$')
+ arga aa bb cc dd ee ff
+ 3argu
+ let args = []
+ .,$-argdo call add(args, expand('%'))
+ call assert_equal(['cc', 'dd', 'ee'], args)
+
+ " create windows to get 5
+ split|split|split|split
+ 2wincmd w
+ let windows = []
+ .,$-windo call add(windows, winnr())
+ call assert_equal([2, 3, 4], windows)
+ only!
+
+ exe bufnr . 'buf'
+ bnext
+ let bufnr = bufnr('%')
+ let buffers = []
+ .,$-bufdo call add(buffers, bufnr('%'))
+ call assert_equal([bufnr, bufnr + 1, bufnr + 2, bufnr + 3, bufnr + 4], buffers)
+
+ exe (bufnr + 3) . 'bdel'
+ let buffers = []
+ exe (bufnr + 2) . ',' . (bufnr + 5) . "bufdo call add(buffers, bufnr('%'))"
+ call assert_equal([bufnr + 2, bufnr + 4, bufnr + 5], buffers)
+
+ " create tabpages to get 5
+ tabe|tabe|tabe|tabe
+ normal! 2gt
+ let tabpages = []
+ .,$-tabdo call add(tabpages, tabpagenr())
+ call assert_equal([2, 3, 4], tabpages)
+ tabonly!
+ bwipe!
+endfunc
diff --git a/src/nvim/testdir/test_comparators.vim b/src/nvim/testdir/test_comparators.vim
new file mode 100644
index 0000000000..87be006cf2
--- /dev/null
+++ b/src/nvim/testdir/test_comparators.vim
@@ -0,0 +1,9 @@
+function Test_Comparators()
+ try
+ let oldisident=&isident
+ set isident+=#
+ call assert_equal(1, 1 is#1)
+ finally
+ let &isident=oldisident
+ endtry
+endfunction
diff --git a/src/nvim/testdir/test_compiler.vim b/src/nvim/testdir/test_compiler.vim
new file mode 100644
index 0000000000..4600a28da5
--- /dev/null
+++ b/src/nvim/testdir/test_compiler.vim
@@ -0,0 +1,54 @@
+" Test the :compiler command
+
+func Test_compiler()
+ if !executable('perl')
+ return
+ endif
+
+ " $LANG changes the output of Perl.
+ if $LANG != ''
+ unlet $LANG
+ endif
+
+ e Xfoo.pl
+ compiler perl
+ call assert_equal('perl', b:current_compiler)
+ call assert_fails('let g:current_compiler', 'E121:')
+
+ call setline(1, ['#!/usr/bin/perl -w', 'use strict;', 'my $foo=1'])
+ w!
+ call feedkeys(":make\<CR>\<CR>", 'tx')
+ call assert_fails('clist', 'E42:')
+
+ call setline(1, ['#!/usr/bin/perl -w', 'use strict;', '$foo=1'])
+ w!
+ call feedkeys(":make\<CR>\<CR>", 'tx')
+ let a=execute('clist')
+ call assert_match("\n 1 Xfoo.pl:3: Global symbol \"\$foo\" "
+ \ . "requires explicit package name", a)
+
+ call delete('Xfoo.pl')
+ bw!
+endfunc
+
+func Test_compiler_without_arg()
+ let a=split(execute('compiler'))
+ call assert_match(expand('^.*runtime/compiler/ant.vim$'), a[0])
+ call assert_match(expand('^.*runtime/compiler/bcc.vim$'), a[1])
+ call assert_match(expand('^.*runtime/compiler/xmlwf.vim$'), a[-1])
+endfunc
+
+func Test_compiler_completion()
+ call feedkeys(":compiler \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_match('^"compiler ant bcc .* xmlwf$', @:)
+
+ call feedkeys(":compiler p\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"compiler pbx perl php pylint pyunit', @:)
+
+ call feedkeys(":compiler! p\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"compiler! pbx perl php pylint pyunit', @:)
+endfunc
+
+func Test_compiler_error()
+ call assert_fails('compiler doesnotexist', 'E666:')
+endfunc
diff --git a/src/nvim/testdir/test_cscope.vim b/src/nvim/testdir/test_cscope.vim
new file mode 100644
index 0000000000..01a9a3f9ad
--- /dev/null
+++ b/src/nvim/testdir/test_cscope.vim
@@ -0,0 +1,279 @@
+" Test for cscope commands.
+
+if !has('cscope') || !executable('cscope') || !has('quickfix')
+ finish
+endif
+
+func CscopeSetupOrClean(setup)
+ if a:setup
+ noa sp samples/memfile_test.c
+ saveas! Xmemfile_test.c
+ call system('cscope -bk -fXcscope.out Xmemfile_test.c')
+ call system('cscope -bk -fXcscope2.out Xmemfile_test.c')
+ cscope add Xcscope.out
+ set cscopequickfix=s-,g-,d-,c-,t-,e-,f-,i-,a-
+ else
+ cscope kill -1
+ for file in ['Xcscope.out', 'Xcscope2.out', 'Xmemfile_test.c']
+ call delete(file)
+ endfo
+ endif
+endfunc
+
+func Test_cscopeWithCscopeConnections()
+ call CscopeSetupOrClean(1)
+ " Test 0: E568: duplicate cscope database not added
+ try
+ set nocscopeverbose
+ cscope add Xcscope.out
+ set cscopeverbose
+ catch
+ call assert_report('exception thrown')
+ endtry
+ call assert_fails('cscope add', 'E560')
+ call assert_fails('cscope add Xcscope.out', 'E568')
+ call assert_fails('cscope add doesnotexist.out', 'E563')
+
+ " Test 1: Find this C-Symbol
+ for cmd in ['cs find s main', 'cs find 0 main']
+ let a=execute(cmd)
+ " Test 1.1 test where it moves the cursor
+ call assert_equal('main(void)', getline('.'))
+ " Test 1.2 test the output of the :cs command
+ call assert_match('\n(1 of 1): <<main>> main(void )', a)
+ endfor
+
+ " Test 2: Find this definition
+ for cmd in ['cs find g test_mf_hash', 'cs find 1 test_mf_hash']
+ exe cmd
+ call assert_equal(['', '/*', ' * Test mf_hash_*() functions.', ' */', ' static void', 'test_mf_hash(void)', '{'], getline(line('.')-5, line('.')+1))
+ endfor
+
+ " Test 3: Find functions called by this function
+ for cmd in ['cs find d test_mf_hash', 'cs find 2 test_mf_hash']
+ let a=execute(cmd)
+ call assert_match('\n(1 of 42): <<mf_hash_init>> mf_hash_init(&ht);', a)
+ call assert_equal(' mf_hash_init(&ht);', getline('.'))
+ endfor
+
+ " Test 4: Find functions calling this function
+ for cmd in ['cs find c test_mf_hash', 'cs find 3 test_mf_hash']
+ let a=execute(cmd)
+ call assert_match('\n(1 of 1): <<main>> test_mf_hash();', a)
+ call assert_equal(' test_mf_hash();', getline('.'))
+ endfor
+
+ " Test 5: Find this text string
+ for cmd in ['cs find t Bram', 'cs find 4 Bram']
+ let a=execute(cmd)
+ call assert_match('(1 of 1): <<<unknown>>> \* VIM - Vi IMproved^Iby Bram Moolenaar', a)
+ call assert_equal(' * VIM - Vi IMproved by Bram Moolenaar', getline('.'))
+ endfor
+
+ " Test 6: Find this egrep pattern
+ " test all matches returned by cscope
+ for cmd in ['cs find e ^\#includ.', 'cs find 6 ^\#includ.']
+ let a=execute(cmd)
+ call assert_match('\n(1 of 3): <<<unknown>>> #include <assert.h>', a)
+ call assert_equal('#include <assert.h>', getline('.'))
+ cnext
+ call assert_equal('#include "main.c"', getline('.'))
+ cnext
+ call assert_equal('#include "memfile.c"', getline('.'))
+ call assert_fails('cnext', 'E553:')
+ endfor
+
+ " Test 7: Find the same egrep pattern using lcscope this time.
+ let a=execute('lcs find e ^\#includ.')
+ call assert_match('\n(1 of 3): <<<unknown>>> #include <assert.h>', a)
+ call assert_equal('#include <assert.h>', getline('.'))
+ lnext
+ call assert_equal('#include "main.c"', getline('.'))
+ lnext
+ call assert_equal('#include "memfile.c"', getline('.'))
+ call assert_fails('lnext', 'E553:')
+
+ " Test 8: Find this file
+ for cmd in ['cs find f Xmemfile_test.c', 'cs find 7 Xmemfile_test.c']
+ enew
+ let a=execute(cmd)
+ call assert_true(a =~ '"Xmemfile_test.c" \d\+L, \d\+C')
+ call assert_equal('Xmemfile_test.c', @%)
+ endfor
+
+ " Test 9: Find files #including this file
+ for cmd in ['cs find i assert.h', 'cs find 8 assert.h']
+ enew
+ let a=execute(cmd)
+ let alines = split(a, '\n', 1)
+ call assert_equal('', alines[0])
+ call assert_true(alines[1] =~ '"Xmemfile_test.c" \d\+L, \d\+C')
+ call assert_equal('(1 of 1): <<global>> #include <assert.h>', alines[2])
+ call assert_equal('#include <assert.h>', getline('.'))
+ endfor
+
+ " Test 10: Invalid find command
+ call assert_fails('cs find x', 'E560:')
+
+ " Test 11: Find places where this symbol is assigned a value
+ " this needs a cscope >= 15.8
+ " unfortunately, Travis has cscope version 15.7
+ let cscope_version=systemlist('cscope --version')[0]
+ let cs_version=str2float(matchstr(cscope_version, '\d\+\(\.\d\+\)\?'))
+ if cs_version >= 15.8
+ for cmd in ['cs find a item', 'cs find 9 item']
+ let a=execute(cmd)
+ call assert_equal(['', '(1 of 4): <<test_mf_hash>> item = (mf_hashitem_T *)lalloc_clear(sizeof(mf_hashtab_T), FALSE);'], split(a, '\n', 1))
+ call assert_equal(' item = (mf_hashitem_T *)lalloc_clear(sizeof(mf_hashtab_T), FALSE);', getline('.'))
+ cnext
+ call assert_equal(' item = mf_hash_find(&ht, key);', getline('.'))
+ cnext
+ call assert_equal(' item = mf_hash_find(&ht, key);', getline('.'))
+ cnext
+ call assert_equal(' item = mf_hash_find(&ht, key);', getline('.'))
+ endfor
+ endif
+
+ " Test 12: leading whitespace is not removed for cscope find text
+ let a=execute('cscope find t test_mf_hash')
+ call assert_equal(['', '(1 of 1): <<<unknown>>> test_mf_hash();'], split(a, '\n', 1))
+ call assert_equal(' test_mf_hash();', getline('.'))
+
+ " Test 13: test with scscope
+ let a=execute('scs find t Bram')
+ call assert_match('(1 of 1): <<<unknown>>> \* VIM - Vi IMproved^Iby Bram Moolenaar', a)
+ call assert_equal(' * VIM - Vi IMproved by Bram Moolenaar', getline('.'))
+
+ " Test 14: cscope help
+ for cmd in ['cs', 'cs help', 'cs xxx']
+ let a=execute(cmd)
+ call assert_match('^cscope commands:\n', a)
+ call assert_match('\nadd :', a)
+ call assert_match('\nfind :', a)
+ call assert_match('\nhelp : Show this message', a)
+ call assert_match('\nkill : Kill a connection', a)
+ call assert_match('\nreset: Reinit all connections', a)
+ call assert_match('\nshow : Show connections', a)
+ endfor
+ let a=execute('scscope help')
+ call assert_match('This cscope command does not support splitting the window\.', a)
+
+ " Test 15: reset connections
+ let a=execute('cscope reset')
+ call assert_match('\nAdded cscope database.*Xcscope.out (#0)', a)
+ call assert_match('\nAll cscope databases reset', a)
+
+ " Test 16: cscope show
+ let a=execute('cscope show')
+ call assert_match('\n 0 \d\+.*Xcscope.out\s*<none>', a)
+
+ " Test 17: cstag and 'csto' option
+ set csto=0
+ let a=execute('cstag TEST_COUNT')
+ call assert_match('(1 of 1): <<TEST_COUNT>> #define TEST_COUNT 50000', a)
+ call assert_equal('#define TEST_COUNT 50000', getline('.'))
+ set csto=1
+ let a=execute('cstag index_to_key')
+ call assert_match('(1 of 1): <<index_to_key>> #define index_to_key(i) ((i) ^ 15167)', a)
+ call assert_equal('#define index_to_key(i) ((i) ^ 15167)', getline('.'))
+ call assert_fails('cstag xxx', 'E257:')
+ call assert_fails('cstag', 'E562:')
+
+ " Test 18: 'cst' option
+ set nocst
+ call assert_fails('tag TEST_COUNT', 'E426:')
+ set cst
+ let a=execute('tag TEST_COUNT')
+ call assert_match('(1 of 1): <<TEST_COUNT>> #define TEST_COUNT 50000', a)
+ call assert_equal('#define TEST_COUNT 50000', getline('.'))
+ let a=execute('tags')
+ call assert_match('1 1 TEST_COUNT\s\+\d\+\s\+#define index_to_key', a)
+
+ " Test 19: this should trigger call to cs_print_tags()
+ " Unclear how to check result though, we just exercise the code.
+ set cst cscopequickfix=s0
+ call feedkeys(":cs find s main\<CR>", 't')
+
+ " Test 20: cscope kill
+ call assert_fails('cscope kill 2', 'E261:')
+ call assert_fails('cscope kill xxx', 'E261:')
+
+ let a=execute('cscope kill 0')
+ call assert_match('cscope connection 0 closed', a)
+
+ cscope add Xcscope.out
+ let a=execute('cscope kill Xcscope.out')
+ call assert_match('cscope connection Xcscope.out closed', a)
+
+ cscope add Xcscope.out .
+ let a=execute('cscope kill -1')
+ call assert_match('cscope connection .*Xcscope.out closed', a)
+ let a=execute('cscope kill -1')
+ call assert_equal('', a)
+
+ " Test 21: 'csprg' option
+ call assert_equal('cscope', &csprg)
+ set csprg=doesnotexist
+ call assert_fails('cscope add Xcscope2.out', 'E609:')
+ set csprg=cscope
+
+ " Test 22: multiple cscope connections
+ cscope add Xcscope.out
+ cscope add Xcscope2.out . -C
+ let a=execute('cscope show')
+ call assert_match('\n 0 \d\+.*Xcscope.out\s*<none>', a)
+ call assert_match('\n 1 \d\+.*Xcscope2.out\s*\.', a)
+
+ " Test 23: test Ex command line completion
+ call feedkeys(":cs \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"cs add find help kill reset show', @:)
+
+ call feedkeys(":scs \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"scs find', @:)
+
+ call feedkeys(":cs find \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"cs find a c d e f g i s t', @:)
+
+ call feedkeys(":cs kill \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"cs kill -1 0 1', @:)
+
+ call feedkeys(":cs add Xcscope\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"cs add Xcscope.out Xcscope2.out', @:)
+
+ " Test 24: cscope_connection()
+ call assert_equal(cscope_connection(), 1)
+ call assert_equal(cscope_connection(0, 'out'), 1)
+ call assert_equal(cscope_connection(0, 'xxx'), 1)
+ call assert_equal(cscope_connection(1, 'out'), 1)
+ call assert_equal(cscope_connection(1, 'xxx'), 0)
+ call assert_equal(cscope_connection(2, 'out'), 0)
+ call assert_equal(cscope_connection(3, 'xxx', '..'), 0)
+ call assert_equal(cscope_connection(3, 'out', 'xxx'), 0)
+ call assert_equal(cscope_connection(3, 'out', '.'), 1)
+ call assert_equal(cscope_connection(4, 'out', '.'), 0)
+
+ " CleanUp
+ call CscopeSetupOrClean(0)
+
+endfunc
+
+func Test_cscopequickfix()
+ set cscopequickfix=s-,g-,d+,c-,t+,e-,f0,i-,a-
+ call assert_equal('s-,g-,d+,c-,t+,e-,f0,i-,a-', &cscopequickfix)
+
+ call assert_fails('set cscopequickfix=x-', 'E474:')
+ call assert_fails('set cscopequickfix=s', 'E474:')
+ call assert_fails('set cscopequickfix=s7', 'E474:')
+ call assert_fails('set cscopequickfix=s-a', 'E474:')
+endfunc
+
+func Test_withoutCscopeConnection()
+ call assert_equal(cscope_connection(), 0)
+
+ call assert_fails('cscope find s main', 'E567:')
+ let a=execute('cscope show')
+ call assert_match('no cscope connections', a)
+endfunc
+
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_cursor_func.vim b/src/nvim/testdir/test_cursor_func.vim
index d819b7b092..e1b9651c84 100644
--- a/src/nvim/testdir/test_cursor_func.vim
+++ b/src/nvim/testdir/test_cursor_func.vim
@@ -1,13 +1,7 @@
" Tests for cursor().
func Test_wrong_arguments()
- try
- call cursor(1. 3)
- " not reached
- call assert_false(1)
- catch
- call assert_exception('E474:')
- endtry
+ call assert_fails('call cursor(1. 3)', 'E474:')
endfunc
func Test_move_cursor()
diff --git a/src/nvim/testdir/test_curswant.vim b/src/nvim/testdir/test_curswant.vim
new file mode 100644
index 0000000000..e54cd4b280
--- /dev/null
+++ b/src/nvim/testdir/test_curswant.vim
@@ -0,0 +1,23 @@
+" Tests for curswant not changing when setting an option
+
+func Test_curswant()
+ new
+ call append(0, ['1234567890', '12345'])
+
+ normal! ggf8j
+ call assert_equal(7, winsaveview().curswant)
+ let &tabstop=&tabstop
+ call assert_equal(4, winsaveview().curswant)
+
+ normal! ggf8j
+ call assert_equal(7, winsaveview().curswant)
+ let &timeoutlen=&timeoutlen
+ call assert_equal(7, winsaveview().curswant)
+
+ normal! ggf8j
+ call assert_equal(7, winsaveview().curswant)
+ let &ttimeoutlen=&ttimeoutlen
+ call assert_equal(7, winsaveview().curswant)
+
+ enew!
+endfunc
diff --git a/src/nvim/testdir/test_diffmode.vim b/src/nvim/testdir/test_diffmode.vim
new file mode 100644
index 0000000000..ad3eec3274
--- /dev/null
+++ b/src/nvim/testdir/test_diffmode.vim
@@ -0,0 +1,740 @@
+" Tests for diff mode
+
+func Test_diff_fold_sync()
+ enew!
+ let g:update_count = 0
+ au DiffUpdated * let g:update_count += 1
+
+ let l = range(50)
+ call setline(1, l)
+ diffthis
+ let winone = win_getid()
+ new
+ let l[25] = 'diff'
+ call setline(1, l)
+ diffthis
+ let wintwo = win_getid()
+ " line 15 is inside the closed fold
+ call assert_equal(19, foldclosedend(10))
+ call win_gotoid(winone)
+ call assert_equal(19, foldclosedend(10))
+ " open the fold
+ normal zv
+ call assert_equal(-1, foldclosedend(10))
+ " fold in other window must have opened too
+ call win_gotoid(wintwo)
+ call assert_equal(-1, foldclosedend(10))
+
+ " cursor position is in sync
+ normal 23G
+ call win_gotoid(winone)
+ call assert_equal(23, getcurpos()[1])
+
+ call assert_equal(1, g:update_count)
+ au! DiffUpdated
+
+ windo diffoff
+ close!
+ set nomodified
+endfunc
+
+func Test_vert_split()
+ set diffopt=filler
+ call Common_vert_split()
+ set diffopt&
+endfunc
+
+func Test_vert_split_internal()
+ set diffopt=internal,filler
+ call Common_vert_split()
+ set diffopt&
+endfunc
+
+func Common_vert_split()
+ " Disable the title to avoid xterm keeping the wrong one.
+ set notitle noicon
+ new
+ let l = ['1 aa', '2 bb', '3 cc', '4 dd', '5 ee']
+ call setline(1, l)
+ w! Xtest
+ normal dd
+ $
+ put
+ normal kkrXoxxx
+ w! Xtest2
+ file Nop
+ normal ggoyyyjjjozzzz
+ set foldmethod=marker foldcolumn=4
+ call assert_equal(0, &diff)
+ call assert_equal('marker', &foldmethod)
+ call assert_equal(4, &foldcolumn)
+ call assert_equal(0, &scrollbind)
+ call assert_equal(0, &cursorbind)
+ call assert_equal(1, &wrap)
+
+ vert diffsplit Xtest
+ vert diffsplit Xtest2
+ call assert_equal(1, &diff)
+ call assert_equal('diff', &foldmethod)
+ call assert_equal(2, &foldcolumn)
+ call assert_equal(1, &scrollbind)
+ call assert_equal(1, &cursorbind)
+ call assert_equal(0, &wrap)
+
+ let diff_fdm = &fdm
+ let diff_fdc = &fdc
+ " repeat entering diff mode here to see if this saves the wrong settings
+ diffthis
+ " jump to second window for a moment to have filler line appear at start of
+ " first window
+ wincmd w
+ normal gg
+ wincmd p
+ normal gg
+ call assert_equal(2, winline())
+ normal j
+ call assert_equal(4, winline())
+ normal j
+ call assert_equal(5, winline())
+ normal j
+ call assert_equal(6, winline())
+ normal j
+ call assert_equal(8, winline())
+ normal j
+ call assert_equal(9, winline())
+
+ wincmd w
+ normal gg
+ call assert_equal(1, winline())
+ normal j
+ call assert_equal(2, winline())
+ normal j
+ call assert_equal(4, winline())
+ normal j
+ call assert_equal(5, winline())
+ normal j
+ call assert_equal(8, winline())
+
+ wincmd w
+ normal gg
+ call assert_equal(2, winline())
+ normal j
+ call assert_equal(3, winline())
+ normal j
+ call assert_equal(4, winline())
+ normal j
+ call assert_equal(5, winline())
+ normal j
+ call assert_equal(6, winline())
+ normal j
+ call assert_equal(7, winline())
+ normal j
+ call assert_equal(8, winline())
+
+ " Test diffoff
+ diffoff!
+ 1wincmd 2
+ let &diff = 1
+ let &fdm = diff_fdm
+ let &fdc = diff_fdc
+ 4wincmd w
+ diffoff!
+ 1wincmd w
+ call assert_equal(0, &diff)
+ call assert_equal('marker', &foldmethod)
+ call assert_equal(4, &foldcolumn)
+ call assert_equal(0, &scrollbind)
+ call assert_equal(0, &cursorbind)
+ call assert_equal(1, &wrap)
+
+ wincmd w
+ call assert_equal(0, &diff)
+ call assert_equal('marker', &foldmethod)
+ call assert_equal(4, &foldcolumn)
+ call assert_equal(0, &scrollbind)
+ call assert_equal(0, &cursorbind)
+ call assert_equal(1, &wrap)
+
+ wincmd w
+ call assert_equal(0, &diff)
+ call assert_equal('marker', &foldmethod)
+ call assert_equal(4, &foldcolumn)
+ call assert_equal(0, &scrollbind)
+ call assert_equal(0, &cursorbind)
+ call assert_equal(1, &wrap)
+
+ call delete('Xtest')
+ call delete('Xtest2')
+ windo bw!
+endfunc
+
+func Test_filler_lines()
+ " Test that diffing shows correct filler lines
+ enew!
+ put =range(4,10)
+ 1d _
+ vnew
+ put =range(1,10)
+ 1d _
+ windo diffthis
+ wincmd h
+ call assert_equal(1, line('w0'))
+ unlet! diff_fdm diff_fdc
+ windo diffoff
+ bwipe!
+ enew!
+endfunc
+
+func Test_diffget_diffput()
+ enew!
+ let l = range(50)
+ call setline(1, l)
+ call assert_fails('diffget', 'E99:')
+ diffthis
+ call assert_fails('diffget', 'E100:')
+ new
+ let l[10] = 'one'
+ let l[20] = 'two'
+ let l[30] = 'three'
+ let l[40] = 'four'
+ call setline(1, l)
+ diffthis
+ call assert_equal('one', getline(11))
+ 11diffget
+ call assert_equal('10', getline(11))
+ 21diffput
+ wincmd w
+ call assert_equal('two', getline(21))
+ normal 31Gdo
+ call assert_equal('three', getline(31))
+ call assert_equal('40', getline(41))
+ normal 41Gdp
+ wincmd w
+ call assert_equal('40', getline(41))
+ new
+ diffthis
+ call assert_fails('diffget', 'E101:')
+
+ windo diffoff
+ %bwipe!
+endfunc
+
+" Test putting two changes from one buffer to another
+func Test_diffput_two()
+ new a
+ let win_a = win_getid()
+ call setline(1, range(1, 10))
+ diffthis
+ new b
+ let win_b = win_getid()
+ call setline(1, range(1, 10))
+ 8del
+ 5del
+ diffthis
+ call win_gotoid(win_a)
+ %diffput
+ call win_gotoid(win_b)
+ call assert_equal(map(range(1, 10), 'string(v:val)'), getline(1, '$'))
+ bwipe! a
+ bwipe! b
+endfunc
+
+func Test_dp_do_buffer()
+ e! one
+ let bn1=bufnr('%')
+ let l = range(60)
+ call setline(1, l)
+ diffthis
+
+ new two
+ let l[10] = 'one'
+ let l[20] = 'two'
+ let l[30] = 'three'
+ let l[40] = 'four'
+ let l[50] = 'five'
+ call setline(1, l)
+ diffthis
+
+ " dp and do with invalid buffer number.
+ 11
+ call assert_fails('norm 99999dp', 'E102:')
+ call assert_fails('norm 99999do', 'E102:')
+ call assert_fails('diffput non_existing_buffer', 'E94:')
+ call assert_fails('diffget non_existing_buffer', 'E94:')
+
+ " dp and do with valid buffer number.
+ call assert_equal('one', getline('.'))
+ exe 'norm ' . bn1 . 'do'
+ call assert_equal('10', getline('.'))
+ 21
+ call assert_equal('two', getline('.'))
+ diffget one
+ call assert_equal('20', getline('.'))
+
+ 31
+ exe 'norm ' . bn1 . 'dp'
+ 41
+ diffput one
+ wincmd w
+ 31
+ call assert_equal('three', getline('.'))
+ 41
+ call assert_equal('four', getline('.'))
+
+ " dp and do with buffer number which is not in diff mode.
+ new not_in_diff_mode
+ let bn3=bufnr('%')
+ wincmd w
+ 51
+ call assert_fails('exe "norm" . bn3 . "dp"', 'E103:')
+ call assert_fails('exe "norm" . bn3 . "do"', 'E103:')
+ call assert_fails('diffput not_in_diff_mode', 'E94:')
+ call assert_fails('diffget not_in_diff_mode', 'E94:')
+
+ windo diffoff
+ %bwipe!
+endfunc
+
+func Test_do_lastline()
+ e! one
+ call setline(1, ['1','2','3','4','5','6'])
+ diffthis
+
+ new two
+ call setline(1, ['2','4','5'])
+ diffthis
+
+ 1
+ norm dp]c
+ norm dp]c
+ wincmd w
+ call assert_equal(4, line('$'))
+ norm G
+ norm do
+ call assert_equal(3, line('$'))
+
+ windo diffoff
+ %bwipe!
+endfunc
+
+func Test_diffoff()
+ enew!
+ call setline(1, ['Two', 'Three'])
+ redraw
+ let normattr = screenattr(1, 1)
+ diffthis
+ botright vert new
+ call setline(1, ['One', '', 'Two', 'Three'])
+ diffthis
+ redraw
+ call assert_notequal(normattr, screenattr(1, 1))
+ diffoff!
+ redraw
+ call assert_equal(normattr, screenattr(1, 1))
+ bwipe!
+ bwipe!
+endfunc
+
+func Common_icase_test()
+ edit one
+ call setline(1, ['One', 'Two', 'Three', 'Four', 'Fi#ve'])
+ redraw
+ let normattr = screenattr(1, 1)
+ diffthis
+
+ botright vert new two
+ call setline(1, ['one', 'TWO', 'Three ', 'Four', 'fI=VE'])
+ diffthis
+
+ redraw
+ call assert_equal(normattr, screenattr(1, 1))
+ call assert_equal(normattr, screenattr(2, 1))
+ call assert_notequal(normattr, screenattr(3, 1))
+ call assert_equal(normattr, screenattr(4, 1))
+
+ let dtextattr = screenattr(5, 3)
+ call assert_notequal(dtextattr, screenattr(5, 1))
+ call assert_notequal(dtextattr, screenattr(5, 5))
+
+ diffoff!
+ %bwipe!
+endfunc
+
+func Test_diffopt_icase()
+ set diffopt=icase,foldcolumn:0
+ call Common_icase_test()
+ set diffopt&
+endfunc
+
+func Test_diffopt_icase_internal()
+ set diffopt=icase,foldcolumn:0,internal
+ call Common_icase_test()
+ set diffopt&
+endfunc
+
+func Common_iwhite_test()
+ edit one
+ " Difference in trailing spaces and amount of spaces should be ignored,
+ " but not other space differences.
+ call setline(1, ["One \t", 'Two', 'Three', 'one two', 'one two', 'Four'])
+ redraw
+ let normattr = screenattr(1, 1)
+ diffthis
+
+ botright vert new two
+ call setline(1, ["One\t ", "Two\t ", 'Three', 'one two', 'onetwo', ' Four'])
+ diffthis
+
+ redraw
+ call assert_equal(normattr, screenattr(1, 1))
+ call assert_equal(normattr, screenattr(2, 1))
+ call assert_equal(normattr, screenattr(3, 1))
+ call assert_equal(normattr, screenattr(4, 1))
+ call assert_notequal(normattr, screenattr(5, 1))
+ call assert_notequal(normattr, screenattr(6, 1))
+
+ diffoff!
+ %bwipe!
+endfunc
+
+func Test_diffopt_iwhite()
+ set diffopt=iwhite,foldcolumn:0
+ call Common_iwhite_test()
+ set diffopt&
+endfunc
+
+func Test_diffopt_iwhite_internal()
+ set diffopt=internal,iwhite,foldcolumn:0
+ call Common_iwhite_test()
+ set diffopt&
+endfunc
+
+func Test_diffopt_context()
+ enew!
+ call setline(1, ['1', '2', '3', '4', '5', '6', '7'])
+ diffthis
+ new
+ call setline(1, ['1', '2', '3', '4', '5x', '6', '7'])
+ diffthis
+
+ set diffopt=context:2
+ call assert_equal('+-- 2 lines: 1', foldtextresult(1))
+ set diffopt=internal,context:2
+ call assert_equal('+-- 2 lines: 1', foldtextresult(1))
+
+ set diffopt=context:1
+ call assert_equal('+-- 3 lines: 1', foldtextresult(1))
+ set diffopt=internal,context:1
+ call assert_equal('+-- 3 lines: 1', foldtextresult(1))
+
+ diffoff!
+ %bwipe!
+ set diffopt&
+endfunc
+
+func Test_diffopt_horizontal()
+ set diffopt=internal,horizontal
+ diffsplit
+
+ call assert_equal(&columns, winwidth(1))
+ call assert_equal(&columns, winwidth(2))
+ call assert_equal(&lines, winheight(1) + winheight(2) + 3)
+ call assert_inrange(0, 1, winheight(1) - winheight(2))
+
+ set diffopt&
+ diffoff!
+ %bwipe
+endfunc
+
+func Test_diffopt_vertical()
+ set diffopt=internal,vertical
+ diffsplit
+
+ call assert_equal(&lines - 2, winheight(1))
+ call assert_equal(&lines - 2, winheight(2))
+ call assert_equal(&columns, winwidth(1) + winwidth(2) + 1)
+ call assert_inrange(0, 1, winwidth(1) - winwidth(2))
+
+ set diffopt&
+ diffoff!
+ %bwipe
+endfunc
+
+func Test_diffopt_hiddenoff()
+ set diffopt=internal,filler,foldcolumn:0,hiddenoff
+ e! one
+ call setline(1, ['Two', 'Three'])
+ redraw
+ let normattr = screenattr(1, 1)
+ diffthis
+ botright vert new two
+ call setline(1, ['One', 'Four'])
+ diffthis
+ redraw
+ call assert_notequal(normattr, screenattr(1, 1))
+ set hidden
+ close
+ redraw
+ " should not diffing with hidden buffer two while 'hiddenoff' is enabled
+ call assert_equal(normattr, screenattr(1, 1))
+
+ bwipe!
+ bwipe!
+ set hidden& diffopt&
+endfunc
+
+func Test_diffoff_hidden()
+ set diffopt=internal,filler,foldcolumn:0
+ e! one
+ call setline(1, ['Two', 'Three'])
+ redraw
+ let normattr = screenattr(1, 1)
+ diffthis
+ botright vert new two
+ call setline(1, ['One', 'Four'])
+ diffthis
+ redraw
+ call assert_notequal(normattr, screenattr(1, 1))
+ set hidden
+ close
+ redraw
+ " diffing with hidden buffer two
+ call assert_notequal(normattr, screenattr(1, 1))
+ diffoff
+ redraw
+ call assert_equal(normattr, screenattr(1, 1))
+ diffthis
+ redraw
+ " still diffing with hidden buffer two
+ call assert_notequal(normattr, screenattr(1, 1))
+ diffoff!
+ redraw
+ call assert_equal(normattr, screenattr(1, 1))
+ diffthis
+ redraw
+ " no longer diffing with hidden buffer two
+ call assert_equal(normattr, screenattr(1, 1))
+
+ bwipe!
+ bwipe!
+ set hidden& diffopt&
+endfunc
+
+func Test_setting_cursor()
+ new Xtest1
+ put =range(1,90)
+ wq
+ new Xtest2
+ put =range(1,100)
+ wq
+
+ tabe Xtest2
+ $
+ diffsp Xtest1
+ tabclose
+
+ call delete('Xtest1')
+ call delete('Xtest2')
+endfunc
+
+func Test_diff_move_to()
+ new
+ call setline(1, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
+ diffthis
+ vnew
+ call setline(1, [1, '2x', 3, 4, 4, 5, '6x', 7, '8x', 9, '10x'])
+ diffthis
+ norm ]c
+ call assert_equal(2, line('.'))
+ norm 3]c
+ call assert_equal(9, line('.'))
+ norm 10]c
+ call assert_equal(11, line('.'))
+ norm [c
+ call assert_equal(9, line('.'))
+ norm 2[c
+ call assert_equal(5, line('.'))
+ norm 10[c
+ call assert_equal(2, line('.'))
+ %bwipe!
+endfunc
+
+func Test_diffexpr()
+ if !executable('diff')
+ return
+ endif
+
+ func DiffExpr()
+ " Prepend some text to check diff type detection
+ call writefile(['warning', ' message'], v:fname_out)
+ silent exe '!diff ' . v:fname_in . ' ' . v:fname_new . '>>' . v:fname_out
+ endfunc
+ set diffexpr=DiffExpr()
+ set diffopt=foldcolumn:0
+
+ enew!
+ call setline(1, ['one', 'two', 'three'])
+ redraw
+ let normattr = screenattr(1, 1)
+ diffthis
+
+ botright vert new
+ call setline(1, ['one', 'two', 'three.'])
+ diffthis
+
+ redraw
+ call assert_equal(normattr, screenattr(1, 1))
+ call assert_equal(normattr, screenattr(2, 1))
+ call assert_notequal(normattr, screenattr(3, 1))
+
+ diffoff!
+ %bwipe!
+ set diffexpr& diffopt&
+endfunc
+
+func Test_diffpatch()
+ " The patch program on MS-Windows may fail or hang.
+ if !executable('patch') || !has('unix')
+ return
+ endif
+ new
+ insert
+***************
+*** 1,3 ****
+ 1
+! 2
+ 3
+--- 1,4 ----
+ 1
+! 2x
+ 3
++ 4
+.
+ saveas! Xpatch
+ bwipe!
+ new
+ call assert_fails('diffpatch Xpatch', 'E816:')
+
+ for name in ['Xpatch', 'Xpatch$HOME', 'Xpa''tch']
+ call setline(1, ['1', '2', '3'])
+ if name != 'Xpatch'
+ call rename('Xpatch', name)
+ endif
+ exe 'diffpatch ' . escape(name, '$')
+ call assert_equal(['1', '2x', '3', '4'], getline(1, '$'))
+ if name != 'Xpatch'
+ call rename(name, 'Xpatch')
+ endif
+ bwipe!
+ endfor
+
+ call delete('Xpatch')
+ bwipe!
+endfunc
+
+func Test_diff_too_many_buffers()
+ for i in range(1, 8)
+ exe "new Xtest" . i
+ diffthis
+ endfor
+ new Xtest9
+ call assert_fails('diffthis', 'E96:')
+ %bwipe!
+endfunc
+
+func Test_diff_nomodifiable()
+ new
+ call setline(1, [1, 2, 3, 4])
+ setl nomodifiable
+ diffthis
+ vnew
+ call setline(1, ['1x', 2, 3, 3, 4])
+ diffthis
+ call assert_fails('norm dp', 'E793:')
+ setl nomodifiable
+ call assert_fails('norm do', 'E21:')
+ %bwipe!
+endfunc
+
+func Test_diff_filler()
+ new
+ call setline(1, [1, 2, 3, 'x', 4])
+ diffthis
+ vnew
+ call setline(1, [1, 2, 'y', 'y', 3, 4])
+ diffthis
+ redraw
+
+ call assert_equal([0, 0, 0, 0, 0, 0, 0, 1, 0], map(range(-1, 7), 'diff_filler(v:val)'))
+ wincmd w
+ call assert_equal([0, 0, 0, 0, 2, 0, 0, 0], map(range(-1, 6), 'diff_filler(v:val)'))
+
+ %bwipe!
+endfunc
+
+func Test_diff_lastline()
+ enew!
+ only!
+ call setline(1, ['This is a ', 'line with five ', 'rows'])
+ diffthis
+ botright vert new
+ call setline(1, ['This is', 'a line with ', 'four rows'])
+ diffthis
+ 1
+ call feedkeys("Je a\<CR>", 'tx')
+ call feedkeys("Je a\<CR>", 'tx')
+ let w1lines = winline()
+ wincmd w
+ $
+ let w2lines = winline()
+ call assert_equal(w2lines, w1lines)
+ bwipe!
+ bwipe!
+endfunc
+
+func Test_diff_with_cursorline()
+ if !CanRunVimInTerminal()
+ return
+ endif
+
+ call writefile([
+ \ 'hi CursorLine ctermbg=red ctermfg=white',
+ \ 'set cursorline',
+ \ 'call setline(1, ["foo","foo","foo","bar"])',
+ \ 'vnew',
+ \ 'call setline(1, ["bee","foo","foo","baz"])',
+ \ 'windo diffthis',
+ \ '2wincmd w',
+ \ ], 'Xtest_diff_cursorline')
+ let buf = RunVimInTerminal('-S Xtest_diff_cursorline', {})
+
+ call VerifyScreenDump(buf, 'Test_diff_with_cursorline_01', {})
+ call term_sendkeys(buf, "j")
+ call VerifyScreenDump(buf, 'Test_diff_with_cursorline_02', {})
+ call term_sendkeys(buf, "j")
+ call VerifyScreenDump(buf, 'Test_diff_with_cursorline_03', {})
+
+ " clean up
+ call StopVimInTerminal(buf)
+ call delete('Xtest_diff_cursorline')
+endfunc
+
+func Test_diff_of_diff()
+ if !CanRunVimInTerminal()
+ return
+ endif
+
+ call writefile([
+ \ 'call setline(1, ["aa","bb","cc","@@ -3,2 +5,7 @@","dd","ee","ff"])',
+ \ 'vnew',
+ \ 'call setline(1, ["aa","bb","cc"])',
+ \ 'windo diffthis',
+ \ ], 'Xtest_diff_diff')
+ let buf = RunVimInTerminal('-S Xtest_diff_diff', {})
+
+ call VerifyScreenDump(buf, 'Test_diff_of_diff_01', {})
+
+ " clean up
+ call StopVimInTerminal(buf)
+ call delete('Xtest_diff_diff')
+endfunc
diff --git a/src/nvim/testdir/test_digraph.vim b/src/nvim/testdir/test_digraph.vim
new file mode 100644
index 0000000000..271066df41
--- /dev/null
+++ b/src/nvim/testdir/test_digraph.vim
@@ -0,0 +1,468 @@
+" Tests for digraphs
+
+if !has("digraphs") || !has("multi_byte")
+ finish
+endif
+
+func Put_Dig(chars)
+ exe "norm! o\<c-k>".a:chars
+endfu
+
+func Put_Dig_BS(char1, char2)
+ exe "norm! o".a:char1."\<bs>".a:char2
+endfu
+
+func Test_digraphs()
+ new
+ call Put_Dig("00")
+ call assert_equal("โˆž", getline('.'))
+ " not a digraph
+ call Put_Dig("el")
+ call assert_equal("l", getline('.'))
+ call Put_Dig("ht")
+ call assert_equal("รพ", getline('.'))
+ " digraph "ab" is the same as "ba"
+ call Put_Dig("ab")
+ call Put_Dig("ba")
+ call assert_equal(["ใฐ","ใฐ"], getline(line('.')-1,line('.')))
+ " Euro sign
+ call Put_Dig("e=")
+ call Put_Dig("=e")
+ call Put_Dig("Eu")
+ call Put_Dig("uE")
+ call assert_equal(['ะต']+repeat(["โ‚ฌ"],3), getline(line('.')-3,line('.')))
+ " Rouble sign
+ call Put_Dig("R=")
+ call Put_Dig("=R")
+ call Put_Dig("=P")
+ call Put_Dig("P=")
+ call assert_equal(['ะ ']+repeat(["โ‚ฝ"],2)+['ะŸ'], getline(line('.')-3,line('.')))
+ " Not a digraph
+ call Put_Dig("a\<bs>")
+ call Put_Dig("\<bs>a")
+ call assert_equal(["<BS>", "<BS>a"], getline(line('.')-1,line('.')))
+ " Grave
+ call Put_Dig("a!")
+ call Put_Dig("!e")
+ call Put_Dig("b!") " not defined
+ call assert_equal(["ร ", "รจ", "!"], getline(line('.')-2,line('.')))
+ " Acute accent
+ call Put_Dig("a'")
+ call Put_Dig("'e")
+ call Put_Dig("b'") " not defined
+ call assert_equal(["รก", "รฉ", "'"], getline(line('.')-2,line('.')))
+ " Cicumflex
+ call Put_Dig("a>")
+ call Put_Dig(">e")
+ call Put_Dig("b>") " not defined
+ call assert_equal(['รข', 'รช', '>'], getline(line('.')-2,line('.')))
+ " Tilde
+ call Put_Dig("o~")
+ call Put_Dig("~u") " not defined
+ call Put_Dig("z~") " not defined
+ call assert_equal(['รต', 'u', '~'], getline(line('.')-2,line('.')))
+ " Tilde
+ call Put_Dig("o?")
+ call Put_Dig("?u")
+ call Put_Dig("z?") " not defined
+ call assert_equal(['รต', 'ลฉ', '?'], getline(line('.')-2,line('.')))
+ " Macron
+ call Put_Dig("o-")
+ call Put_Dig("-u")
+ call Put_Dig("z-") " not defined
+ call assert_equal(['ล', 'ลซ', '-'], getline(line('.')-2,line('.')))
+ " Breve
+ call Put_Dig("o(")
+ call Put_Dig("(u")
+ call Put_Dig("z(") " not defined
+ call assert_equal(['ล', 'ลญ', '('], getline(line('.')-2,line('.')))
+ " Dot above
+ call Put_Dig("b.")
+ call Put_Dig(".e")
+ call Put_Dig("a.") " not defined
+ call assert_equal(['แธƒ', 'ฤ—', '.'], getline(line('.')-2,line('.')))
+ " Diaresis
+ call Put_Dig("a:")
+ call Put_Dig(":u")
+ call Put_Dig("b:") " not defined
+ call assert_equal(['รค', 'รผ', ':'], getline(line('.')-2,line('.')))
+ " Cedilla
+ call Put_Dig("',")
+ call Put_Dig(",C")
+ call Put_Dig("b,") " not defined
+ call assert_equal(['ยธ', 'ร‡', ','], getline(line('.')-2,line('.')))
+ " Underline
+ call Put_Dig("B_")
+ call Put_Dig("_t")
+ call Put_Dig("a_") " not defined
+ call assert_equal(['แธ†', 'แนฏ', '_'], getline(line('.')-2,line('.')))
+ " Stroke
+ call Put_Dig("j/")
+ call Put_Dig("/l")
+ call Put_Dig("b/") " not defined
+ call assert_equal(['/', 'ล‚', '/'], getline(line('.')-2,line('.')))
+ " Double acute
+ call Put_Dig('O"')
+ call Put_Dig('"y')
+ call Put_Dig('b"') " not defined
+ call assert_equal(['ล', 'รฟ', '"'], getline(line('.')-2,line('.')))
+ " Ogonek
+ call Put_Dig('u;')
+ call Put_Dig(';E')
+ call Put_Dig('b;') " not defined
+ call assert_equal(['ลณ', 'ฤ˜', ';'], getline(line('.')-2,line('.')))
+ " Caron
+ call Put_Dig('u<')
+ call Put_Dig('<E')
+ call Put_Dig('b<') " not defined
+ call assert_equal(['ว”', 'ฤš', '<'], getline(line('.')-2,line('.')))
+ " Ring above
+ call Put_Dig('u0')
+ call Put_Dig('0E') " not defined
+ call Put_Dig('b0') " not defined
+ call assert_equal(['ลฏ', 'E', '0'], getline(line('.')-2,line('.')))
+ " Hook
+ call Put_Dig('u2')
+ call Put_Dig('2E')
+ call Put_Dig('b2') " not defined
+ call assert_equal(['แปง', 'แบบ', '2'], getline(line('.')-2,line('.')))
+ " Horn
+ call Put_Dig('u9')
+ call Put_Dig('9E') " not defined
+ call Put_Dig('b9') " not defined
+ call assert_equal(['ฦฐ', 'E', '9'], getline(line('.')-2,line('.')))
+ " Cyrillic
+ call Put_Dig('u=')
+ call Put_Dig('=b')
+ call Put_Dig('=_')
+ call assert_equal(['ัƒ', 'ะฑ', 'ใ€“'], getline(line('.')-2,line('.')))
+ " Greek
+ call Put_Dig('u*')
+ call Put_Dig('*b')
+ call Put_Dig('*_')
+ call assert_equal(['ฯ…', 'ฮฒ', 'ใ€…'], getline(line('.')-2,line('.')))
+ " Greek/Cyrillic special
+ call Put_Dig('u%')
+ call Put_Dig('%b') " not defined
+ call Put_Dig('%_') " not defined
+ call assert_equal(['ฯ', 'b', '_'], getline(line('.')-2,line('.')))
+ " Arabic
+ call Put_Dig('u+')
+ call Put_Dig('+b')
+ call Put_Dig('+_') " japanese industrial symbol
+ call assert_equal(['+', 'ุจ', 'ใ€„'], getline(line('.')-2,line('.')))
+ " Hebrew
+ call Put_Dig('Q+')
+ call Put_Dig('+B')
+ call Put_Dig('+X')
+ call assert_equal(['ืง', 'ื‘', 'ื—'], getline(line('.')-2,line('.')))
+ " Latin
+ call Put_Dig('a3')
+ call Put_Dig('A3')
+ call Put_Dig('3X')
+ call assert_equal(['วฃ', 'วข', 'X'], getline(line('.')-2,line('.')))
+ " Bopomofo
+ call Put_Dig('a4')
+ call Put_Dig('A4')
+ call Put_Dig('4X')
+ call assert_equal(['ใ„š', '4', 'X'], getline(line('.')-2,line('.')))
+ " Hiragana
+ call Put_Dig('a5')
+ call Put_Dig('A5')
+ call Put_Dig('5X')
+ call assert_equal(['ใ‚', 'ใ', 'X'], getline(line('.')-2,line('.')))
+ " Katakana
+ call Put_Dig('a6')
+ call Put_Dig('A6')
+ call Put_Dig('6X')
+ call assert_equal(['ใ‚ก', 'ใ‚ข', 'X'], getline(line('.')-2,line('.')))
+ " Superscripts
+ call Put_Dig('1S')
+ call Put_Dig('2S')
+ call Put_Dig('3S')
+ call assert_equal(['ยน', 'ยฒ', 'ยณ'], getline(line('.')-2,line('.')))
+ " Subscripts
+ call Put_Dig('1s')
+ call Put_Dig('2s')
+ call Put_Dig('3s')
+ call assert_equal(['โ‚', 'โ‚‚', 'โ‚ƒ'], getline(line('.')-2,line('.')))
+ " Eszet (only lowercase)
+ call Put_Dig("ss")
+ call Put_Dig("SS") " start of string
+ call assert_equal(["รŸ", "ย˜"], getline(line('.')-1,line('.')))
+ " High bit set
+ call Put_Dig("a ")
+ call Put_Dig(" A")
+ call assert_equal(['รก', 'ร'], getline(line('.')-1,line('.')))
+ " Escape is not part of a digraph
+ call Put_Dig("a\<esc>")
+ call Put_Dig("\<esc>A")
+ call assert_equal(['', 'A'], getline(line('.')-1,line('.')))
+ " define some custom digraphs
+ " old: 00 โˆž
+ " old: el l
+ digraph 00 9216
+ digraph el 0252
+ call Put_Dig("00")
+ call Put_Dig("el")
+ " Reset digraphs
+ digraph 00 8734
+ digraph el 108
+ call Put_Dig("00")
+ call Put_Dig("el")
+ call assert_equal(['โ€', 'รผ', 'โˆž', 'l'], getline(line('.')-3,line('.')))
+ bw!
+endfunc
+
+func Test_digraphs_option()
+ " reset whichwrap option, so that testing <esc><bs>A works,
+ " without moving up a line
+ set digraph ww=
+ new
+ call Put_Dig_BS("0","0")
+ call assert_equal("โˆž", getline('.'))
+ " not a digraph
+ call Put_Dig_BS("e","l")
+ call assert_equal("l", getline('.'))
+ call Put_Dig_BS("h","t")
+ call assert_equal("รพ", getline('.'))
+ " digraph "ab" is the same as "ba"
+ call Put_Dig_BS("a","b")
+ call Put_Dig_BS("b","a")
+ call assert_equal(["ใฐ","ใฐ"], getline(line('.')-1,line('.')))
+ " Euro sign
+ call Put_Dig_BS("e","=")
+ call Put_Dig_BS("=","e")
+ call Put_Dig_BS("E","u")
+ call Put_Dig_BS("u","E")
+ call assert_equal(['ะต']+repeat(["โ‚ฌ"],3), getline(line('.')-3,line('.')))
+ " Rouble sign
+ call Put_Dig_BS("R","=")
+ call Put_Dig_BS("=","R")
+ call Put_Dig_BS("=","P")
+ call Put_Dig_BS("P","=")
+ call assert_equal(['ะ ']+repeat(["โ‚ฝ"],2)+['ะŸ'], getline(line('.')-3,line('.')))
+ " Not a digraph: this is different from <c-k>!
+ call Put_Dig_BS("a","\<bs>")
+ call Put_Dig_BS("\<bs>","a")
+ call assert_equal(['','a'], getline(line('.')-1,line('.')))
+ " Grave
+ call Put_Dig_BS("a","!")
+ call Put_Dig_BS("!","e")
+ call Put_Dig_BS("b","!") " not defined
+ call assert_equal(["ร ", "รจ", "!"], getline(line('.')-2,line('.')))
+ " Acute accent
+ call Put_Dig_BS("a","'")
+ call Put_Dig_BS("'","e")
+ call Put_Dig_BS("b","'") " not defined
+ call assert_equal(["รก", "รฉ", "'"], getline(line('.')-2,line('.')))
+ " Cicumflex
+ call Put_Dig_BS("a",">")
+ call Put_Dig_BS(">","e")
+ call Put_Dig_BS("b",">") " not defined
+ call assert_equal(['รข', 'รช', '>'], getline(line('.')-2,line('.')))
+ " Tilde
+ call Put_Dig_BS("o","~")
+ call Put_Dig_BS("~","u") " not defined
+ call Put_Dig_BS("z","~") " not defined
+ call assert_equal(['รต', 'u', '~'], getline(line('.')-2,line('.')))
+ " Tilde
+ call Put_Dig_BS("o","?")
+ call Put_Dig_BS("?","u")
+ call Put_Dig_BS("z","?") " not defined
+ call assert_equal(['รต', 'ลฉ', '?'], getline(line('.')-2,line('.')))
+ " Macron
+ call Put_Dig_BS("o","-")
+ call Put_Dig_BS("-","u")
+ call Put_Dig_BS("z","-") " not defined
+ call assert_equal(['ล', 'ลซ', '-'], getline(line('.')-2,line('.')))
+ " Breve
+ call Put_Dig_BS("o","(")
+ call Put_Dig_BS("(","u")
+ call Put_Dig_BS("z","(") " not defined
+ call assert_equal(['ล', 'ลญ', '('], getline(line('.')-2,line('.')))
+ " Dot above
+ call Put_Dig_BS("b",".")
+ call Put_Dig_BS(".","e")
+ call Put_Dig_BS("a",".") " not defined
+ call assert_equal(['แธƒ', 'ฤ—', '.'], getline(line('.')-2,line('.')))
+ " Diaresis
+ call Put_Dig_BS("a",":")
+ call Put_Dig_BS(":","u")
+ call Put_Dig_BS("b",":") " not defined
+ call assert_equal(['รค', 'รผ', ':'], getline(line('.')-2,line('.')))
+ " Cedilla
+ call Put_Dig_BS("'",",")
+ call Put_Dig_BS(",","C")
+ call Put_Dig_BS("b",",") " not defined
+ call assert_equal(['ยธ', 'ร‡', ','], getline(line('.')-2,line('.')))
+ " Underline
+ call Put_Dig_BS("B","_")
+ call Put_Dig_BS("_","t")
+ call Put_Dig_BS("a","_") " not defined
+ call assert_equal(['แธ†', 'แนฏ', '_'], getline(line('.')-2,line('.')))
+ " Stroke
+ call Put_Dig_BS("j","/")
+ call Put_Dig_BS("/","l")
+ call Put_Dig_BS("b","/") " not defined
+ call assert_equal(['/', 'ล‚', '/'], getline(line('.')-2,line('.')))
+ " Double acute
+ call Put_Dig_BS('O','"')
+ call Put_Dig_BS('"','y')
+ call Put_Dig_BS('b','"') " not defined
+ call assert_equal(['ล', 'รฟ', '"'], getline(line('.')-2,line('.')))
+ " Ogonek
+ call Put_Dig_BS('u',';')
+ call Put_Dig_BS(';','E')
+ call Put_Dig_BS('b',';') " not defined
+ call assert_equal(['ลณ', 'ฤ˜', ';'], getline(line('.')-2,line('.')))
+ " Caron
+ call Put_Dig_BS('u','<')
+ call Put_Dig_BS('<','E')
+ call Put_Dig_BS('b','<') " not defined
+ call assert_equal(['ว”', 'ฤš', '<'], getline(line('.')-2,line('.')))
+ " Ring above
+ call Put_Dig_BS('u','0')
+ call Put_Dig_BS('0','E') " not defined
+ call Put_Dig_BS('b','0') " not defined
+ call assert_equal(['ลฏ', 'E', '0'], getline(line('.')-2,line('.')))
+ " Hook
+ call Put_Dig_BS('u','2')
+ call Put_Dig_BS('2','E')
+ call Put_Dig_BS('b','2') " not defined
+ call assert_equal(['แปง', 'แบบ', '2'], getline(line('.')-2,line('.')))
+ " Horn
+ call Put_Dig_BS('u','9')
+ call Put_Dig_BS('9','E') " not defined
+ call Put_Dig_BS('b','9') " not defined
+ call assert_equal(['ฦฐ', 'E', '9'], getline(line('.')-2,line('.')))
+ " Cyrillic
+ call Put_Dig_BS('u','=')
+ call Put_Dig_BS('=','b')
+ call Put_Dig_BS('=','_')
+ call assert_equal(['ัƒ', 'ะฑ', 'ใ€“'], getline(line('.')-2,line('.')))
+ " Greek
+ call Put_Dig_BS('u','*')
+ call Put_Dig_BS('*','b')
+ call Put_Dig_BS('*','_')
+ call assert_equal(['ฯ…', 'ฮฒ', 'ใ€…'], getline(line('.')-2,line('.')))
+ " Greek/Cyrillic special
+ call Put_Dig_BS('u','%')
+ call Put_Dig_BS('%','b') " not defined
+ call Put_Dig_BS('%','_') " not defined
+ call assert_equal(['ฯ', 'b', '_'], getline(line('.')-2,line('.')))
+ " Arabic
+ call Put_Dig_BS('u','+')
+ call Put_Dig_BS('+','b')
+ call Put_Dig_BS('+','_') " japanese industrial symbol
+ call assert_equal(['+', 'ุจ', 'ใ€„'], getline(line('.')-2,line('.')))
+ " Hebrew
+ call Put_Dig_BS('Q','+')
+ call Put_Dig_BS('+','B')
+ call Put_Dig_BS('+','X')
+ call assert_equal(['ืง', 'ื‘', 'ื—'], getline(line('.')-2,line('.')))
+ " Latin
+ call Put_Dig_BS('a','3')
+ call Put_Dig_BS('A','3')
+ call Put_Dig_BS('3','X')
+ call assert_equal(['วฃ', 'วข', 'X'], getline(line('.')-2,line('.')))
+ " Bopomofo
+ call Put_Dig_BS('a','4')
+ call Put_Dig_BS('A','4')
+ call Put_Dig_BS('4','X')
+ call assert_equal(['ใ„š', '4', 'X'], getline(line('.')-2,line('.')))
+ " Hiragana
+ call Put_Dig_BS('a','5')
+ call Put_Dig_BS('A','5')
+ call Put_Dig_BS('5','X')
+ call assert_equal(['ใ‚', 'ใ', 'X'], getline(line('.')-2,line('.')))
+ " Katakana
+ call Put_Dig_BS('a','6')
+ call Put_Dig_BS('A','6')
+ call Put_Dig_BS('6','X')
+ call assert_equal(['ใ‚ก', 'ใ‚ข', 'X'], getline(line('.')-2,line('.')))
+ " Superscripts
+ call Put_Dig_BS('1','S')
+ call Put_Dig_BS('2','S')
+ call Put_Dig_BS('3','S')
+ call assert_equal(['ยน', 'ยฒ', 'ยณ'], getline(line('.')-2,line('.')))
+ " Subscripts
+ call Put_Dig_BS('1','s')
+ call Put_Dig_BS('2','s')
+ call Put_Dig_BS('3','s')
+ call assert_equal(['โ‚', 'โ‚‚', 'โ‚ƒ'], getline(line('.')-2,line('.')))
+ " Eszet (only lowercase)
+ call Put_Dig_BS("s","s")
+ call Put_Dig_BS("S","S") " start of string
+ call assert_equal(["รŸ", "ย˜"], getline(line('.')-1,line('.')))
+ " High bit set (different from <c-k>)
+ call Put_Dig_BS("a"," ")
+ call Put_Dig_BS(" ","A")
+ call assert_equal([' ', 'A'], getline(line('.')-1,line('.')))
+ " Escape is not part of a digraph (different from <c-k>)
+ call Put_Dig_BS("a","\<esc>")
+ call Put_Dig_BS("\<esc>","A")
+ call assert_equal(['', ''], getline(line('.')-1,line('.')))
+ " define some custom digraphs
+ " old: 00 โˆž
+ " old: el l
+ digraph 00 9216
+ digraph el 0252
+ call Put_Dig_BS("0","0")
+ call Put_Dig_BS("e","l")
+ " Reset digraphs
+ digraph 00 8734
+ digraph el 108
+ call Put_Dig_BS("0","0")
+ call Put_Dig_BS("e","l")
+ call assert_equal(['โ€', 'รผ', 'โˆž', 'l'], getline(line('.')-3,line('.')))
+ set nodigraph ww&vim
+ bw!
+endfunc
+
+func Test_digraphs_output()
+ new
+ let out = execute(':digraph')
+ call assert_equal('Eu โ‚ฌ 8364', matchstr(out, '\C\<Eu\D*8364\>'))
+ call assert_equal('=e โ‚ฌ 8364', matchstr(out, '\C=e\D*8364\>'))
+ call assert_equal('=R โ‚ฝ 8381', matchstr(out, '\C=R\D*8381\>'))
+ call assert_equal('=P โ‚ฝ 8381', matchstr(out, '\C=P\D*8381\>'))
+ call assert_equal('o: รถ 246', matchstr(out, '\C\<o:\D*246\>'))
+ call assert_equal('v4 ใ„ช 12586', matchstr(out, '\C\<v4\D*12586\>'))
+ call assert_equal("'0 หš 730", matchstr(out, '\C''0\D*730\>'))
+ call assert_equal('Z% ะ– 1046', matchstr(out, '\C\<Z%\D*1046\>'))
+ call assert_equal('u- ลซ 363', matchstr(out, '\C\<u-\D*363\>'))
+ call assert_equal('SH ^A 1', matchstr(out, '\C\<SH\D*1\>'))
+ bw!
+endfunc
+
+func Test_loadkeymap()
+ if !has('keymap')
+ return
+ endif
+ new
+ set keymap=czech
+ set iminsert=0
+ call feedkeys("o|\<c-^>|01234567890|\<esc>", 'tx')
+ call assert_equal("|'รฉ+ฤ›ลกฤล™ลพรฝรกรญรฉ'", getline('.'))
+ " reset keymap and encoding option
+ set keymap=
+ bw!
+endfunc
+
+func Test_digraph_cmndline()
+ " Create digraph on commandline
+ " This is a hack, to let Vim create the digraph in commandline mode
+ let s = ''
+ exe "sil! norm! :let s.='\<c-k>Eu'\<cr>"
+ call assert_equal("โ‚ฌ", s)
+endfunc
+
+func Test_show_digraph()
+ new
+ call Put_Dig("e=")
+ call assert_equal("\n<ะต> 1077, Hex 0435, Oct 2065, Digr e=", execute('ascii'))
+ bwipe!
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_display.vim b/src/nvim/testdir/test_display.vim
new file mode 100644
index 0000000000..0ed672d577
--- /dev/null
+++ b/src/nvim/testdir/test_display.vim
@@ -0,0 +1,71 @@
+" Test for displaying stuff
+
+" Nvim: `:set term` is not supported.
+" if !has('gui_running') && has('unix')
+" set term=ansi
+" endif
+
+source view_util.vim
+
+func! Test_display_foldcolumn()
+ if !has("folding")
+ return
+ endif
+ new
+ vnew
+ vert resize 25
+ call assert_equal(25, winwidth(winnr()))
+ set isprint=@
+
+ 1put='e more noise blah blahย‚ more stuff here'
+
+ let expect = [
+ \ "e more noise blah blah<82",
+ \ "> more stuff here "
+ \ ]
+
+ call cursor(2, 1)
+ norm! zt
+ let lines=ScreenLines([1,2], winwidth(0))
+ call assert_equal(expect, lines)
+ set fdc=2
+ let lines=ScreenLines([1,2], winwidth(0))
+ let expect = [
+ \ " e more noise blah blah<",
+ \ " 82> more stuff here "
+ \ ]
+ call assert_equal(expect, lines)
+
+ quit!
+ quit!
+endfunc
+
+func! Test_display_foldtext_mbyte()
+ if !has("folding") || !has("multi_byte")
+ return
+ endif
+ call NewWindow(10, 40)
+ call append(0, range(1,20))
+ exe "set foldmethod=manual foldtext=foldtext() fillchars=fold:\u2500,vert:\u2502 fdc=2"
+ call cursor(2, 1)
+ norm! zf13G
+ let lines=ScreenLines([1,3], winwidth(0)+1)
+ let expect=[
+ \ " 1 \u2502",
+ \ "+ +-- 12 lines: 2". repeat("\u2500", 23). "\u2502",
+ \ " 14 \u2502",
+ \ ]
+ call assert_equal(expect, lines)
+
+ set fillchars=fold:-,vert:\|
+ let lines=ScreenLines([1,3], winwidth(0)+1)
+ let expect=[
+ \ " 1 |",
+ \ "+ +-- 12 lines: 2". repeat("-", 23). "|",
+ \ " 14 |",
+ \ ]
+ call assert_equal(expect, lines)
+
+ set foldtext& fillchars& foldmethod& fdc&
+ bw!
+endfunc
diff --git a/src/nvim/testdir/test_edit.vim b/src/nvim/testdir/test_edit.vim
new file mode 100644
index 0000000000..f8946c6929
--- /dev/null
+++ b/src/nvim/testdir/test_edit.vim
@@ -0,0 +1,1445 @@
+" Test for edit functions
+"
+if exists("+t_kD")
+ let &t_kD="[3;*~"
+endif
+
+" Needed for testing basic rightleft: Test_edit_rightleft
+source view_util.vim
+
+" Needs to come first until the bug in getchar() is
+" fixed: https://groups.google.com/d/msg/vim_dev/fXL9yme4H4c/bOR-U6_bAQAJ
+func! Test_edit_00b()
+ new
+ call setline(1, ['abc '])
+ inoreabbr <buffer> h here some more
+ call cursor(1, 4)
+ " <c-l> expands the abbreviation and ends insertmode
+ call feedkeys(":set im\<cr> h\<c-l>:set noim\<cr>", 'tix')
+ call assert_equal(['abc here some more '], getline(1,'$'))
+ iunabbr <buffer> h
+ bw!
+endfunc
+
+func! Test_edit_01()
+ " set for Travis CI?
+ " set nocp noesckeys
+ new
+ " 1) empty buffer
+ call assert_equal([''], getline(1,'$'))
+ " 2) delete in an empty line
+ call feedkeys("i\<del>\<esc>", 'tnix')
+ call assert_equal([''], getline(1,'$'))
+ %d
+ " 3) delete one character
+ call setline(1, 'a')
+ call feedkeys("i\<del>\<esc>", 'tnix')
+ call assert_equal([''], getline(1,'$'))
+ %d
+ " 4) delete a multibyte character
+ if has("multi_byte")
+ call setline(1, "\u0401")
+ call feedkeys("i\<del>\<esc>", 'tnix')
+ call assert_equal([''], getline(1,'$'))
+ %d
+ endif
+ " 5.1) delete linebreak with 'bs' option containing eol
+ let _bs=&bs
+ set bs=eol
+ call setline(1, ["abc def", "ghi jkl"])
+ call cursor(1, 1)
+ call feedkeys("A\<del>\<esc>", 'tnix')
+ call assert_equal(['abc defghi jkl'], getline(1, 2))
+ %d
+ " 5.2) delete linebreak with backspace option w/out eol
+ set bs=
+ call setline(1, ["abc def", "ghi jkl"])
+ call cursor(1, 1)
+ call feedkeys("A\<del>\<esc>", 'tnix')
+ call assert_equal(["abc def", "ghi jkl"], getline(1, 2))
+ let &bs=_bs
+ bw!
+endfunc
+
+func! Test_edit_02()
+ " Change cursor position in InsertCharPre command
+ new
+ call setline(1, 'abc')
+ call cursor(1, 1)
+ fu! DoIt(...)
+ call cursor(1, 4)
+ if len(a:000)
+ let v:char=a:1
+ endif
+ endfu
+ au InsertCharPre <buffer> :call DoIt('y')
+ call feedkeys("ix\<esc>", 'tnix')
+ call assert_equal(['abcy'], getline(1, '$'))
+ " Setting <Enter> in InsertCharPre
+ au! InsertCharPre <buffer> :call DoIt("\n")
+ call setline(1, 'abc')
+ call cursor(1, 1)
+ call feedkeys("ix\<esc>", 'tnix')
+ call assert_equal(['abc', ''], getline(1, '$'))
+ %d
+ au! InsertCharPre
+ " Change cursor position in InsertEnter command
+ " 1) when setting v:char, keeps changed cursor position
+ au! InsertEnter <buffer> :call DoIt('y')
+ call setline(1, 'abc')
+ call cursor(1, 1)
+ call feedkeys("ix\<esc>", 'tnix')
+ call assert_equal(['abxc'], getline(1, '$'))
+ " 2) when not setting v:char, restores changed cursor position
+ au! InsertEnter <buffer> :call DoIt()
+ call setline(1, 'abc')
+ call cursor(1, 1)
+ call feedkeys("ix\<esc>", 'tnix')
+ call assert_equal(['xabc'], getline(1, '$'))
+ au! InsertEnter
+ delfu DoIt
+ bw!
+endfunc
+
+func! Test_edit_03()
+ " Change cursor after <c-o> command to end of line
+ new
+ call setline(1, 'abc')
+ call cursor(1, 1)
+ call feedkeys("i\<c-o>$y\<esc>", 'tnix')
+ call assert_equal(['abcy'], getline(1, '$'))
+ %d
+ call setline(1, 'abc')
+ call cursor(1, 1)
+ call feedkeys("i\<c-o>80|y\<esc>", 'tnix')
+ call assert_equal(['abcy'], getline(1, '$'))
+ %d
+ call setline(1, 'abc')
+ call feedkeys("Ad\<c-o>:s/$/efg/\<cr>hij", 'tnix')
+ call assert_equal(['hijabcdefg'], getline(1, '$'))
+ bw!
+endfunc
+
+func! Test_edit_04()
+ " test for :stopinsert
+ new
+ call setline(1, 'abc')
+ call cursor(1, 1)
+ call feedkeys("i\<c-o>:stopinsert\<cr>$", 'tnix')
+ call feedkeys("aX\<esc>", 'tnix')
+ call assert_equal(['abcX'], getline(1, '$'))
+ %d
+ bw!
+endfunc
+
+func! Test_edit_05()
+ " test for folds being opened
+ new
+ call setline(1, ['abcX', 'abcX', 'zzzZ'])
+ call cursor(1, 1)
+ set foldmethod=manual foldopen+=insert
+ " create fold for those two lines
+ norm! Vjzf
+ call feedkeys("$ay\<esc>", 'tnix')
+ call assert_equal(['abcXy', 'abcX', 'zzzZ'], getline(1, '$'))
+ %d
+ call setline(1, ['abcX', 'abcX', 'zzzZ'])
+ call cursor(1, 1)
+ set foldmethod=manual foldopen-=insert
+ " create fold for those two lines
+ norm! Vjzf
+ call feedkeys("$ay\<esc>", 'tnix')
+ call assert_equal(['abcXy', 'abcX', 'zzzZ'], getline(1, '$'))
+ %d
+ bw!
+endfunc
+
+func! Test_edit_06()
+ " Test in diff mode
+ if !has("diff") || !executable("diff")
+ return
+ endif
+ new
+ call setline(1, ['abc', 'xxx', 'yyy'])
+ vnew
+ call setline(1, ['abc', 'zzz', 'xxx', 'yyy'])
+ wincmd p
+ diffthis
+ wincmd p
+ diffthis
+ wincmd p
+ call cursor(2, 1)
+ norm! zt
+ call feedkeys("Ozzz\<esc>", 'tnix')
+ call assert_equal(['abc', 'zzz', 'xxx', 'yyy'], getline(1,'$'))
+ bw!
+ bw!
+endfunc
+
+func! Test_edit_07()
+ " 1) Test with completion <c-l> when popupmenu is visible
+ new
+ call setline(1, 'J')
+
+ func! ListMonths()
+ call complete(col('.')-1, ['January', 'February', 'March',
+ \ 'April', 'May', 'June', 'July', 'August', 'September',
+ \ 'October', 'November', 'December'])
+ return ''
+ endfunc
+ inoremap <buffer> <F5> <C-R>=ListMonths()<CR>
+
+ call feedkeys("A\<f5>\<c-p>". repeat("\<down>", 6)."\<c-l>\<down>\<c-l>\<cr>", 'tx')
+ call assert_equal(['July'], getline(1,'$'))
+ " 1) Test completion when InsertCharPre kicks in
+ %d
+ call setline(1, 'J')
+ fu! DoIt()
+ if v:char=='u'
+ let v:char='an'
+ endif
+ endfu
+ au InsertCharPre <buffer> :call DoIt()
+ call feedkeys("A\<f5>\<c-p>u\<cr>\<c-l>\<cr>", 'tx')
+ call assert_equal(["Jan\<c-l>",''], getline(1,'$'))
+ %d
+ call setline(1, 'J')
+ call feedkeys("A\<f5>\<c-p>u\<down>\<c-l>\<cr>", 'tx')
+ call assert_equal(["January"], getline(1,'$'))
+
+ delfu ListMonths
+ delfu DoIt
+ iunmap <buffer> <f5>
+ bw!
+endfunc
+
+func! Test_edit_08()
+ throw 'skipped: moved to test/functional/legacy/edit_spec.lua'
+ " reset insertmode from i_ctrl-r_=
+ let g:bufnr = bufnr('%')
+ new
+ call setline(1, ['abc'])
+ call cursor(1, 4)
+ call feedkeys(":set im\<cr>ZZZ\<c-r>=setbufvar(g:bufnr,'&im', 0)\<cr>",'tnix')
+ call assert_equal(['abZZZc'], getline(1,'$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+ call assert_false(0, '&im')
+ bw!
+ unlet g:bufnr
+endfunc
+
+func! Test_edit_09()
+ " test i_CTRL-\ combinations
+ new
+ call setline(1, ['abc', 'def', 'ghi'])
+ call cursor(1, 1)
+ " 1) CTRL-\ CTLR-N
+ call feedkeys(":set im\<cr>\<c-\>\<c-n>ccABC\<c-l>", 'txin')
+ call assert_equal(['ABC', 'def', 'ghi'], getline(1,'$'))
+ call setline(1, ['ABC', 'def', 'ghi'])
+ " 2) CTRL-\ CTLR-G
+ call feedkeys("j0\<c-\>\<c-g>ZZZ\<cr>\<c-l>", 'txin')
+ call assert_equal(['ABC', 'ZZZ', 'def', 'ghi'], getline(1,'$'))
+ call feedkeys("I\<c-\>\<c-g>YYY\<c-l>", 'txin')
+ call assert_equal(['ABC', 'ZZZ', 'YYYdef', 'ghi'], getline(1,'$'))
+ set noinsertmode
+ " 3) CTRL-\ CTRL-O
+ call setline(1, ['ABC', 'ZZZ', 'def', 'ghi'])
+ call cursor(1, 1)
+ call feedkeys("A\<c-o>ix", 'txin')
+ call assert_equal(['ABxC', 'ZZZ', 'def', 'ghi'], getline(1,'$'))
+ call feedkeys("A\<c-\>\<c-o>ix", 'txin')
+ call assert_equal(['ABxCx', 'ZZZ', 'def', 'ghi'], getline(1,'$'))
+ " 4) CTRL-\ a (should be inserted literally, not special after <c-\>
+ call setline(1, ['ABC', 'ZZZ', 'def', 'ghi'])
+ call cursor(1, 1)
+ call feedkeys("A\<c-\>a", 'txin')
+ call assert_equal(["ABC\<c-\>a", 'ZZZ', 'def', 'ghi'], getline(1, '$'))
+ bw!
+endfunc
+
+func! Test_edit_10()
+ " Test for starting selectmode
+ new
+ set selectmode=key keymodel=startsel
+ call setline(1, ['abc', 'def', 'ghi'])
+ call cursor(1, 4)
+ call feedkeys("A\<s-home>start\<esc>", 'txin')
+ call assert_equal(['startdef', 'ghi'], getline(1, '$'))
+ set selectmode= keymodel=
+ bw!
+endfunc
+
+func! Test_edit_11()
+ " Test that indenting kicks in
+ new
+ set cindent
+ call setline(1, ['{', '', ''])
+ call cursor(2, 1)
+ call feedkeys("i\<c-f>int c;\<esc>", 'tnix')
+ call cursor(3, 1)
+ call feedkeys("i/* comment */", 'tnix')
+ call assert_equal(['{', "\<tab>int c;", "/* comment */"], getline(1, '$'))
+ " added changed cindentkeys slightly
+ set cindent cinkeys+=*/
+ call setline(1, ['{', '', ''])
+ call cursor(2, 1)
+ call feedkeys("i\<c-f>int c;\<esc>", 'tnix')
+ call cursor(3, 1)
+ call feedkeys("i/* comment */", 'tnix')
+ call assert_equal(['{', "\<tab>int c;", "\<tab>/* comment */"], getline(1, '$'))
+ set cindent cinkeys+==end
+ call feedkeys("oend\<cr>\<esc>", 'tnix')
+ call assert_equal(['{', "\<tab>int c;", "\<tab>/* comment */", "\tend", ''], getline(1, '$'))
+ set cinkeys-==end
+ %d
+ " Use indentexpr instead of cindenting
+ func! Do_Indent()
+ if v:lnum == 3
+ return 3*shiftwidth()
+ else
+ return 2*shiftwidth()
+ endif
+ endfunc
+ setl indentexpr=Do_Indent() indentkeys+=*/
+ call setline(1, ['{', '', ''])
+ call cursor(2, 1)
+ call feedkeys("i\<c-f>int c;\<esc>", 'tnix')
+ call cursor(3, 1)
+ call feedkeys("i/* comment */", 'tnix')
+ call assert_equal(['{', "\<tab>\<tab>int c;", "\<tab>\<tab>\<tab>/* comment */"], getline(1, '$'))
+ set cinkeys&vim indentkeys&vim
+ set nocindent indentexpr=
+ delfu Do_Indent
+ bw!
+endfunc
+
+func! Test_edit_11_indentexpr()
+ " Test that indenting kicks in
+ new
+ " Use indentexpr instead of cindenting
+ func! Do_Indent()
+ let pline=prevnonblank(v:lnum)
+ if empty(getline(v:lnum))
+ if getline(pline) =~ 'if\|then'
+ return shiftwidth()
+ else
+ return 0
+ endif
+ else
+ return 0
+ endif
+ endfunc
+ setl indentexpr=Do_Indent() indentkeys+=0=then,0=fi
+ call setline(1, ['if [ $this ]'])
+ call cursor(1, 1)
+ call feedkeys("othen\<cr>that\<cr>fi", 'tnix')
+ call assert_equal(['if [ $this ]', "then", "\<tab>that", "fi"], getline(1, '$'))
+ set cinkeys&vim indentkeys&vim
+ set nocindent indentexpr=
+ delfu Do_Indent
+ bw!
+endfunc
+
+func! Test_edit_12()
+ " Test changing indent in replace mode
+ new
+ call setline(1, ["\tabc", "\tdef"])
+ call cursor(2, 4)
+ call feedkeys("R^\<c-d>", 'tnix')
+ call assert_equal(["\tabc", "def"], getline(1, '$'))
+ call assert_equal([0, 2, 2, 0], getpos('.'))
+ %d
+ call setline(1, ["\tabc", "\t\tdef"])
+ call cursor(2, 2)
+ call feedkeys("R^\<c-d>", 'tnix')
+ call assert_equal(["\tabc", "def"], getline(1, '$'))
+ call assert_equal([0, 2, 1, 0], getpos('.'))
+ %d
+ call setline(1, ["\tabc", "\t\tdef"])
+ call cursor(2, 2)
+ call feedkeys("R\<c-t>", 'tnix')
+ call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$'))
+ call assert_equal([0, 2, 2, 0], getpos('.'))
+ bw!
+ 10vnew
+ call setline(1, ["\tabc", "\t\tdef"])
+ call cursor(2, 2)
+ call feedkeys("R\<c-t>", 'tnix')
+ call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$'))
+ call assert_equal([0, 2, 2, 0], getpos('.'))
+ %d
+ set sw=4
+ call setline(1, ["\tabc", "\t\tdef"])
+ call cursor(2, 2)
+ call feedkeys("R\<c-t>\<c-t>", 'tnix')
+ call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$'))
+ call assert_equal([0, 2, 2, 0], getpos('.'))
+ %d
+ call setline(1, ["\tabc", "\t\tdef"])
+ call cursor(2, 2)
+ call feedkeys("R\<c-t>\<c-t>", 'tnix')
+ call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$'))
+ call assert_equal([0, 2, 2, 0], getpos('.'))
+ set et
+ set sw& et&
+ %d
+ call setline(1, ["\t/*"])
+ set formatoptions=croql
+ call cursor(1, 3)
+ call feedkeys("A\<cr>\<cr>/", 'tnix')
+ call assert_equal(["\t/*", " *", " */"], getline(1, '$'))
+ set formatoptions&
+ bw!
+endfunc
+
+func! Test_edit_13()
+ " Test smartindenting
+ if exists("+smartindent")
+ new
+ set smartindent autoindent
+ call setline(1, ["\tabc"])
+ call feedkeys("A {\<cr>more\<cr>}\<esc>", 'tnix')
+ call assert_equal(["\tabc {", "\t\tmore", "\t}"], getline(1, '$'))
+ set smartindent& autoindent&
+ bw!
+ endif
+endfunc
+
+func! Test_edit_CR()
+ " Test for <CR> in insert mode
+ " basically only in quickfix mode ist tested, the rest
+ " has been taken care of by other tests
+ if !has("quickfix")
+ return
+ endif
+ botright new
+ call writefile(range(1, 10), 'Xqflist.txt')
+ call setqflist([{'filename': 'Xqflist.txt', 'lnum': 2}])
+ copen
+ set modifiable
+ call feedkeys("A\<cr>", 'tnix')
+ call assert_equal('Xqflist.txt', bufname(''))
+ call assert_equal(2, line('.'))
+ cclose
+ botright new
+ call setloclist(0, [{'filename': 'Xqflist.txt', 'lnum': 10}])
+ lopen
+ set modifiable
+ call feedkeys("A\<cr>", 'tnix')
+ call assert_equal('Xqflist.txt', bufname(''))
+ call assert_equal(10, line('.'))
+ call feedkeys("A\<Enter>", 'tnix')
+ call feedkeys("A\<kEnter>", 'tnix')
+ call feedkeys("A\n", 'tnix')
+ call feedkeys("A\r", 'tnix')
+ call assert_equal(map(range(1, 10), 'string(v:val)') + ['', '', '', ''], getline(1, '$'))
+ bw!
+ lclose
+ call delete('Xqflist.txt')
+endfunc
+
+func! Test_edit_CTRL_()
+ " disabled for Windows builds, why?
+ if !has("multi_byte") || !has("rightleft") || has("win32")
+ return
+ endif
+ let _encoding=&encoding
+ set encoding=utf-8
+ " Test for CTRL-_
+ new
+ call setline(1, ['abc'])
+ call cursor(1, 1)
+ call feedkeys("i\<c-_>xyz\<esc>", 'tnix')
+ call assert_equal(["\<C-_>xyzabc"], getline(1, '$'))
+ call assert_false(&revins)
+ set ari
+ call setline(1, ['abc'])
+ call cursor(1, 1)
+ call feedkeys("i\<c-_>xyz\<esc>", 'tnix')
+ call assert_equal(["รฆรจรฑabc"], getline(1, '$'))
+ call assert_true(&revins)
+ call setline(1, ['abc'])
+ call cursor(1, 1)
+ call feedkeys("i\<c-_>xyz\<esc>", 'tnix')
+ call assert_equal(["xyzabc"], getline(1, '$'))
+ call assert_false(&revins)
+ set noari
+ let &encoding=_encoding
+ bw!
+endfunc
+
+" needs to come first, to have the @. register empty
+func! Test_edit_00a_CTRL_A()
+ " Test pressing CTRL-A
+ new
+ call setline(1, repeat([''], 5))
+ call cursor(1, 1)
+ try
+ call feedkeys("A\<NUL>", 'tnix')
+ catch /^Vim\%((\a\+)\)\=:E29/
+ call assert_true(1, 'E29 error caught')
+ endtry
+ call cursor(1, 1)
+ call feedkeys("Afoobar \<esc>", 'tnix')
+ call cursor(2, 1)
+ call feedkeys("A\<c-a>more\<esc>", 'tnix')
+ call cursor(3, 1)
+ call feedkeys("A\<NUL>and more\<esc>", 'tnix')
+ call assert_equal(['foobar ', 'foobar more', 'foobar morend more', '', ''], getline(1, '$'))
+ bw!
+endfunc
+
+func! Test_edit_CTRL_EY()
+ " Ctrl-E/ Ctrl-Y in insert mode completion to scroll
+ 10new
+ call setline(1, range(1, 100))
+ call cursor(30, 1)
+ norm! z.
+ call feedkeys("A\<c-x>\<c-e>\<c-e>\<c-e>\<c-e>\<c-e>", 'tnix')
+ call assert_equal(30, winsaveview()['topline'])
+ call assert_equal([0, 30, 2, 0], getpos('.'))
+ call feedkeys("A\<c-x>\<c-e>\<c-e>\<c-e>\<c-e>\<c-e>", 'tnix')
+ call feedkeys("A\<c-x>".repeat("\<c-y>", 10), 'tnix')
+ call assert_equal(21, winsaveview()['topline'])
+ call assert_equal([0, 30, 2, 0], getpos('.'))
+ bw!
+endfunc
+
+func! Test_edit_CTRL_G()
+ new
+ call setline(1, ['foobar', 'foobar', 'foobar'])
+ call cursor(2, 4)
+ call feedkeys("ioooooooo\<c-g>k\<c-r>.\<esc>", 'tnix')
+ call assert_equal(['foooooooooobar', 'foooooooooobar', 'foobar'], getline(1, '$'))
+ call assert_equal([0, 1, 11, 0], getpos('.'))
+ call feedkeys("i\<c-g>k\<esc>", 'tnix')
+ call assert_equal([0, 1, 10, 0], getpos('.'))
+ call cursor(2, 4)
+ call feedkeys("i\<c-g>jzzzz\<esc>", 'tnix')
+ call assert_equal(['foooooooooobar', 'foooooooooobar', 'foozzzzbar'], getline(1, '$'))
+ call assert_equal([0, 3, 7, 0], getpos('.'))
+ call feedkeys("i\<c-g>j\<esc>", 'tnix')
+ call assert_equal([0, 3, 6, 0], getpos('.'))
+ bw!
+endfunc
+
+func! Test_edit_CTRL_I()
+ " Tab in completion mode
+ let path=expand("%:p:h")
+ new
+ call setline(1, [path."/", ''])
+ call feedkeys("Arunt\<c-x>\<c-f>\<tab>\<cr>\<esc>", 'tnix')
+ call assert_match('runtest\.vim', getline(1))
+ %d
+ call writefile(['one', 'two', 'three'], 'Xinclude.txt')
+ let include='#include Xinclude.txt'
+ call setline(1, [include, ''])
+ call cursor(2, 1)
+ call feedkeys("A\<c-x>\<tab>\<cr>\<esc>", 'tnix')
+ call assert_equal([include, 'one', ''], getline(1, '$'))
+ call feedkeys("2ggC\<c-x>\<tab>\<down>\<cr>\<esc>", 'tnix')
+ call assert_equal([include, 'two', ''], getline(1, '$'))
+ call feedkeys("2ggC\<c-x>\<tab>\<down>\<down>\<cr>\<esc>", 'tnix')
+ call assert_equal([include, 'three', ''], getline(1, '$'))
+ call feedkeys("2ggC\<c-x>\<tab>\<down>\<down>\<down>\<cr>\<esc>", 'tnix')
+ call assert_equal([include, '', ''], getline(1, '$'))
+ call delete("Xinclude.txt")
+ bw!
+endfunc
+
+func! Test_edit_CTRL_K()
+ " Test pressing CTRL-K (basically only dictionary completion and digraphs
+ " the rest is already covered
+ call writefile(['A', 'AA', 'AAA', 'AAAA'], 'Xdictionary.txt')
+ set dictionary=Xdictionary.txt
+ new
+ call setline(1, 'A')
+ call cursor(1, 1)
+ call feedkeys("A\<c-x>\<c-k>\<cr>\<esc>", 'tnix')
+ call assert_equal(['AA', ''], getline(1, '$'))
+ %d
+ call setline(1, 'A')
+ call cursor(1, 1)
+ call feedkeys("A\<c-x>\<c-k>\<down>\<cr>\<esc>", 'tnix')
+ call assert_equal(['AAA'], getline(1, '$'))
+ %d
+ call setline(1, 'A')
+ call cursor(1, 1)
+ call feedkeys("A\<c-x>\<c-k>\<down>\<down>\<cr>\<esc>", 'tnix')
+ call assert_equal(['AAAA'], getline(1, '$'))
+ %d
+ call setline(1, 'A')
+ call cursor(1, 1)
+ call feedkeys("A\<c-x>\<c-k>\<down>\<down>\<down>\<cr>\<esc>", 'tnix')
+ call assert_equal(['A'], getline(1, '$'))
+ %d
+ call setline(1, 'A')
+ call cursor(1, 1)
+ call feedkeys("A\<c-x>\<c-k>\<down>\<down>\<down>\<down>\<cr>\<esc>", 'tnix')
+ call assert_equal(['AA'], getline(1, '$'))
+
+ " press an unexecpted key after dictionary completion
+ %d
+ call setline(1, 'A')
+ call cursor(1, 1)
+ call feedkeys("A\<c-x>\<c-k>\<c-]>\<cr>\<esc>", 'tnix')
+ call assert_equal(['AA', ''], getline(1, '$'))
+ %d
+ call setline(1, 'A')
+ call cursor(1, 1)
+ call feedkeys("A\<c-x>\<c-k>\<c-s>\<cr>\<esc>", 'tnix')
+ call assert_equal(["AA\<c-s>", ''], getline(1, '$'))
+ %d
+ call setline(1, 'A')
+ call cursor(1, 1)
+ call feedkeys("A\<c-x>\<c-k>\<c-f>\<cr>\<esc>", 'tnix')
+ call assert_equal(["AA\<c-f>", ''], getline(1, '$'))
+
+ set dictionary=
+ %d
+ call setline(1, 'A')
+ call cursor(1, 1)
+ let v:testing = 1
+ try
+ call feedkeys("A\<c-x>\<c-k>\<esc>", 'tnix')
+ catch
+ " error sleeps 2 seconds, when v:testing is not set
+ let v:testing = 0
+ endtry
+ call delete('Xdictionary.txt')
+
+ if has("multi_byte") && !has("nvim")
+ call test_override("char_avail", 1)
+ set showcmd
+ %d
+ call feedkeys("A\<c-k>a:\<esc>", 'tnix')
+ call assert_equal(['รค'], getline(1, '$'))
+ call test_override("char_avail", 0)
+ set noshowcmd
+ endif
+ bw!
+endfunc
+
+func! Test_edit_CTRL_L()
+ " Test Ctrl-X Ctrl-L (line completion)
+ new
+ set complete=.
+ call setline(1, ['one', 'two', 'three', '', '', '', ''])
+ call cursor(4, 1)
+ call feedkeys("A\<c-x>\<c-l>\<esc>", 'tnix')
+ call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$'))
+ call feedkeys("cct\<c-x>\<c-l>\<c-n>\<esc>", 'tnix')
+ call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$'))
+ call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<esc>", 'tnix')
+ call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$'))
+ call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<c-n>\<esc>", 'tnix')
+ call assert_equal(['one', 'two', 'three', 'two', '', '', ''], getline(1, '$'))
+ call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<c-n>\<c-n>\<esc>", 'tnix')
+ call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$'))
+ call feedkeys("cct\<c-x>\<c-l>\<c-p>\<esc>", 'tnix')
+ call assert_equal(['one', 'two', 'three', 'two', '', '', ''], getline(1, '$'))
+ call feedkeys("cct\<c-x>\<c-l>\<c-p>\<c-p>\<esc>", 'tnix')
+ call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$'))
+ call feedkeys("cct\<c-x>\<c-l>\<c-p>\<c-p>\<c-p>\<esc>", 'tnix')
+ call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$'))
+ set complete=
+ call cursor(5, 1)
+ call feedkeys("A\<c-x>\<c-l>\<c-p>\<c-n>\<esc>", 'tnix')
+ call assert_equal(['one', 'two', 'three', 'three', "\<c-l>\<c-p>\<c-n>", '', ''], getline(1, '$'))
+ set complete&
+ %d
+ if has("conceal") && has("syntax") && !has("nvim")
+ call setline(1, ['foo', 'bar', 'foobar'])
+ call test_override("char_avail", 1)
+ set conceallevel=2 concealcursor=n
+ syn on
+ syn match ErrorMsg "^bar"
+ call matchadd("Conceal", 'oo', 10, -1, {'conceal': 'X'})
+ func! DoIt()
+ let g:change=1
+ endfunc
+ au! TextChangedI <buffer> :call DoIt()
+
+ call cursor(2, 1)
+ call assert_false(exists("g:change"))
+ call feedkeys("A \<esc>", 'tnix')
+ call assert_equal(['foo', 'bar ', 'foobar'], getline(1, '$'))
+ call assert_equal(1, g:change)
+
+ call test_override("char_avail", 0)
+ call clearmatches()
+ syn off
+ au! TextChangedI
+ delfu DoIt
+ unlet! g:change
+ endif
+ bw!
+endfunc
+
+func! Test_edit_CTRL_N()
+ " Check keyword completion
+ new
+ set complete=.
+ call setline(1, ['INFER', 'loWER', '', '', ])
+ call cursor(3, 1)
+ call feedkeys("Ai\<c-n>\<cr>\<esc>", "tnix")
+ call feedkeys("ILO\<c-n>\<cr>\<esc>", 'tnix')
+ call assert_equal(['INFER', 'loWER', 'i', 'LO', '', ''], getline(1, '$'))
+ %d
+ call setline(1, ['INFER', 'loWER', '', '', ])
+ call cursor(3, 1)
+ set ignorecase infercase
+ call feedkeys("Ii\<c-n>\<cr>\<esc>", "tnix")
+ call feedkeys("ILO\<c-n>\<cr>\<esc>", 'tnix')
+ call assert_equal(['INFER', 'loWER', 'infer', 'LOWER', '', ''], getline(1, '$'))
+
+ set noignorecase noinfercase complete&
+ bw!
+endfunc
+
+func! Test_edit_CTRL_O()
+ " Check for CTRL-O in insert mode
+ new
+ inoreabbr <buffer> h here some more
+ call setline(1, ['abc', 'def'])
+ call cursor(1, 1)
+ " Ctrl-O after an abbreviation
+ exe "norm A h\<c-o>:set nu\<cr> text"
+ call assert_equal(['abc here some more text', 'def'], getline(1, '$'))
+ call assert_true(&nu)
+ set nonu
+ iunabbr <buffer> h
+ " Ctrl-O at end of line with 've'=onemore
+ call cursor(1, 1)
+ call feedkeys("A\<c-o>:let g:a=getpos('.')\<cr>\<esc>", 'tnix')
+ call assert_equal([0, 1, 23, 0], g:a)
+ call cursor(1, 1)
+ set ve=onemore
+ call feedkeys("A\<c-o>:let g:a=getpos('.')\<cr>\<esc>", 'tnix')
+ call assert_equal([0, 1, 24, 0], g:a)
+ set ve=
+ unlet! g:a
+ bw!
+endfunc
+
+func! Test_edit_CTRL_R()
+ throw 'skipped: Nvim does not support test_override()'
+ " Insert Register
+ new
+ 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)
+ set noshowcmd
+ bw!
+endfunc
+
+func! Test_edit_CTRL_S()
+ " Test pressing CTRL-S (basically only spellfile completion)
+ " the rest is already covered
+ new
+ if !has("spell")
+ call setline(1, 'vim')
+ call feedkeys("A\<c-x>ss\<cr>\<esc>", 'tnix')
+ call assert_equal(['vims', ''], getline(1, '$'))
+ bw!
+ return
+ endif
+ call setline(1, 'vim')
+ " spell option not yet set
+ try
+ call feedkeys("A\<c-x>\<c-s>\<cr>\<esc>", 'tnix')
+ catch /^Vim\%((\a\+)\)\=:E756/
+ call assert_true(1, 'error caught')
+ endtry
+ call assert_equal(['vim', ''], getline(1, '$'))
+ %d
+ setl spell spelllang=en
+ call setline(1, 'vim')
+ call cursor(1, 1)
+ call feedkeys("A\<c-x>\<c-s>\<cr>\<esc>", 'tnix')
+ call assert_equal(['Vim', ''], getline(1, '$'))
+ %d
+ call setline(1, 'vim')
+ call cursor(1, 1)
+ call feedkeys("A\<c-x>\<c-s>\<down>\<cr>\<esc>", 'tnix')
+ call assert_equal(['Aim'], getline(1, '$'))
+ %d
+ call setline(1, 'vim')
+ call cursor(1, 1)
+ call feedkeys("A\<c-x>\<c-s>\<c-p>\<cr>\<esc>", 'tnix')
+ call assert_equal(['vim', ''], getline(1, '$'))
+ %d
+ " empty buffer
+ call cursor(1, 1)
+ call feedkeys("A\<c-x>\<c-s>\<c-p>\<cr>\<esc>", 'tnix')
+ call assert_equal(['', ''], getline(1, '$'))
+ setl nospell
+ bw!
+endfunc
+
+func! Test_edit_CTRL_T()
+ " Check for CTRL-T and CTRL-X CTRL-T in insert mode
+ " 1) increase indent
+ new
+ call setline(1, "abc")
+ call cursor(1, 1)
+ call feedkeys("A\<c-t>xyz", 'tnix')
+ call assert_equal(["\<tab>abcxyz"], getline(1, '$'))
+ " 2) also when paste option is set
+ set paste
+ call setline(1, "abc")
+ call cursor(1, 1)
+ call feedkeys("A\<c-t>xyz", 'tnix')
+ call assert_equal(["\<tab>abcxyz"], getline(1, '$'))
+ set nopaste
+ " CTRL-X CTRL-T (thesaurus complete)
+ call writefile(['angry furious mad enraged'], 'Xthesaurus')
+ set thesaurus=Xthesaurus
+ call setline(1, 'mad')
+ call cursor(1, 1)
+ call feedkeys("A\<c-x>\<c-t>\<cr>\<esc>", 'tnix')
+ call assert_equal(['mad', ''], getline(1, '$'))
+ %d
+ call setline(1, 'mad')
+ call cursor(1, 1)
+ call feedkeys("A\<c-x>\<c-t>\<c-n>\<cr>\<esc>", 'tnix')
+ call assert_equal(['angry', ''], getline(1, '$'))
+ %d
+ call setline(1, 'mad')
+ call cursor(1, 1)
+ call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<cr>\<esc>", 'tnix')
+ call assert_equal(['furious', ''], getline(1, '$'))
+ %d
+ call setline(1, 'mad')
+ call cursor(1, 1)
+ call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<c-n>\<cr>\<esc>", 'tnix')
+ call assert_equal(['enraged', ''], getline(1, '$'))
+ %d
+ call setline(1, 'mad')
+ call cursor(1, 1)
+ call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<c-n>\<c-n>\<cr>\<esc>", 'tnix')
+ call assert_equal(['mad', ''], getline(1, '$'))
+ %d
+ call setline(1, 'mad')
+ call cursor(1, 1)
+ call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<c-n>\<c-n>\<c-n>\<cr>\<esc>", 'tnix')
+ call assert_equal(['mad', ''], getline(1, '$'))
+ " Using <c-p> <c-n> when 'complete' is empty
+ set complete=
+ %d
+ call setline(1, 'mad')
+ call cursor(1, 1)
+ call feedkeys("A\<c-x>\<c-t>\<c-n>\<cr>\<esc>", 'tnix')
+ call assert_equal(['angry', ''], getline(1, '$'))
+ %d
+ call setline(1, 'mad')
+ call cursor(1, 1)
+ call feedkeys("A\<c-x>\<c-t>\<c-p>\<cr>\<esc>", 'tnix')
+ call assert_equal(['mad', ''], getline(1, '$'))
+ set complete&
+
+ set thesaurus=
+ %d
+ call setline(1, 'mad')
+ call cursor(1, 1)
+ let v:testing = 1
+ try
+ call feedkeys("A\<c-x>\<c-t>\<esc>", 'tnix')
+ catch
+ " error sleeps 2 seconds, when v:testing is not set
+ let v:testing = 0
+ endtry
+ call assert_equal(['mad'], getline(1, '$'))
+ call delete('Xthesaurus')
+ bw!
+endfunc
+
+func! Test_edit_CTRL_U()
+ " Test 'completefunc'
+ new
+ " -1, -2 and -3 are special return values
+ let g:special=0
+ fun! CompleteMonths(findstart, base)
+ if a:findstart
+ " locate the start of the word
+ return g:special
+ else
+ " find months matching with "a:base"
+ let res = []
+ for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec")
+ if m =~ '^\c'.a:base
+ call add(res, {'word': m, 'abbr': m.' Month', 'icase': 0})
+ endif
+ endfor
+ return {'words': res, 'refresh': 'always'}
+ endif
+ endfun
+ set completefunc=CompleteMonths
+ call setline(1, ['', ''])
+ call cursor(1, 1)
+ call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix')
+ call assert_equal(['X', '', ''], getline(1, '$'))
+ %d
+ let g:special=-1
+ call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix')
+ call assert_equal(['XJan', ''], getline(1, '$'))
+ %d
+ let g:special=-2
+ call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix')
+ call assert_equal(['X', ''], getline(1, '$'))
+ %d
+ let g:special=-3
+ call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix')
+ call assert_equal(['X', ''], getline(1, '$'))
+ %d
+ let g:special=0
+ call feedkeys("AM\<c-x>\<c-u>\<cr>\<esc>", 'tnix')
+ call assert_equal(['Mar', ''], getline(1, '$'))
+ %d
+ call feedkeys("AM\<c-x>\<c-u>\<c-n>\<cr>\<esc>", 'tnix')
+ call assert_equal(['May', ''], getline(1, '$'))
+ %d
+ call feedkeys("AM\<c-x>\<c-u>\<c-n>\<c-n>\<cr>\<esc>", 'tnix')
+ call assert_equal(['M', ''], getline(1, '$'))
+ delfu CompleteMonths
+ %d
+ try
+ call feedkeys("A\<c-x>\<c-u>", 'tnix')
+ call assert_fails(1, 'unknown completion function')
+ catch /^Vim\%((\a\+)\)\=:E117/
+ call assert_true(1, 'E117 error caught')
+ endtry
+ set completefunc=
+ bw!
+endfunc
+
+func! Test_edit_CTRL_Z()
+ " Ctrl-Z when insertmode is not set inserts it literally
+ new
+ call setline(1, 'abc')
+ call feedkeys("A\<c-z>\<esc>", 'tnix')
+ call assert_equal(["abc\<c-z>"], getline(1,'$'))
+ bw!
+ " TODO: How to Test Ctrl-Z in insert mode, e.g. suspend?
+endfunc
+
+func! Test_edit_DROP()
+ if !has("dnd")
+ return
+ endif
+ new
+ call setline(1, ['abc def ghi'])
+ call cursor(1, 1)
+ try
+ call feedkeys("i\<Drop>\<Esc>", 'tnix')
+ call assert_fails(1, 'Invalid register name')
+ catch /^Vim\%((\a\+)\)\=:E353/
+ call assert_true(1, 'error caught')
+ endtry
+ bw!
+endfunc
+
+func! Test_edit_CTRL_V()
+ throw 'skipped: Nvim does not support test_override()'
+ if has("ebcdic")
+ return
+ endif
+ new
+ call setline(1, ['abc'])
+ call cursor(2, 1)
+ " force some redraws
+ set showmode showcmd
+ "call test_override_char_avail(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, '$'))
+
+ if has("rightleft") && exists("+rl")
+ set rl
+ call setline(1, ['abc'])
+ call cursor(2, 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, '$'))
+ set norl
+ endif
+
+ call test_override('ALL', 0)
+ set noshowmode showcmd
+ bw!
+endfunc
+
+func! Test_edit_F1()
+ " Pressing <f1>
+ new
+ call feedkeys(":set im\<cr>\<f1>\<c-l>", 'tnix')
+ set noinsertmode
+ call assert_equal('help', &buftype)
+ bw
+ bw
+endfunc
+
+func! Test_edit_F21()
+ " Pressing <f21>
+ " sends a netbeans command
+ if has("netbeans_intg")
+ new
+ " I have no idea what this is supposed to do :)
+ call feedkeys("A\<F21>\<F1>\<esc>", 'tnix')
+ bw
+ endif
+endfunc
+
+func! Test_edit_HOME_END()
+ " Test Home/End Keys
+ new
+ set foldopen+=hor
+ call setline(1, ['abc', 'def'])
+ call cursor(1, 1)
+ call feedkeys("AX\<Home>Y\<esc>", 'tnix')
+ call cursor(2, 1)
+ call feedkeys("iZ\<End>Y\<esc>", 'tnix')
+ call assert_equal(['YabcX', 'ZdefY'], getline(1, '$'))
+
+ set foldopen-=hor
+ bw!
+endfunc
+
+func! Test_edit_INS()
+ " Test for Pressing <Insert>
+ new
+ call setline(1, ['abc', 'def'])
+ call cursor(1, 1)
+ call feedkeys("i\<Insert>ZYX>", 'tnix')
+ call assert_equal(['ZYX>', 'def'], getline(1, '$'))
+ call setline(1, ['abc', 'def'])
+ call cursor(1, 1)
+ call feedkeys("i\<Insert>Z\<Insert>YX>", 'tnix')
+ call assert_equal(['ZYX>bc', 'def'], getline(1, '$'))
+ bw!
+endfunc
+
+func! Test_edit_LEFT_RIGHT()
+ " Left, Shift-Left, Right, Shift-Right
+ new
+ call setline(1, ['abc def ghi', 'ABC DEF GHI', 'ZZZ YYY XXX'])
+ let _ww=&ww
+ set ww=
+ call cursor(2, 1)
+ call feedkeys("i\<left>\<esc>", 'tnix')
+ call assert_equal([0, 2, 1, 0], getpos('.'))
+ " Is this a bug, <s-left> does not respect whichwrap option
+ call feedkeys("i\<s-left>\<esc>", 'tnix')
+ call assert_equal([0, 1, 8, 0], getpos('.'))
+ call feedkeys("i". repeat("\<s-left>", 3). "\<esc>", 'tnix')
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+ call feedkeys("i\<right>\<esc>", 'tnix')
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+ call feedkeys("i\<right>\<right>\<esc>", 'tnix')
+ call assert_equal([0, 1, 2, 0], getpos('.'))
+ call feedkeys("A\<right>\<esc>", 'tnix')
+ call assert_equal([0, 1, 11, 0], getpos('.'))
+ call feedkeys("A\<s-right>\<esc>", 'tnix')
+ call assert_equal([0, 2, 1, 0], getpos('.'))
+ call feedkeys("i\<s-right>\<esc>", 'tnix')
+ call assert_equal([0, 2, 4, 0], getpos('.'))
+ call cursor(3, 11)
+ call feedkeys("A\<right>\<esc>", 'tnix')
+ call feedkeys("A\<s-right>\<esc>", 'tnix')
+ call assert_equal([0, 3, 11, 0], getpos('.'))
+ call cursor(2, 11)
+ " <S-Right> does not respect 'whichwrap' option
+ call feedkeys("A\<s-right>\<esc>", 'tnix')
+ call assert_equal([0, 3, 1, 0], getpos('.'))
+ " Check motion when 'whichwrap' contains cursor keys for insert mode
+ set ww+=[,]
+ call cursor(2, 1)
+ call feedkeys("i\<left>\<esc>", 'tnix')
+ call assert_equal([0, 1, 11, 0], getpos('.'))
+ call cursor(2, 11)
+ call feedkeys("A\<right>\<esc>", 'tnix')
+ call assert_equal([0, 3, 1, 0], getpos('.'))
+ call cursor(2, 11)
+ call feedkeys("A\<s-right>\<esc>", 'tnix')
+ call assert_equal([0, 3, 1, 0], getpos('.'))
+ let &ww = _ww
+ bw!
+endfunc
+
+func! Test_edit_MOUSE()
+ " This is a simple test, since we not really using the mouse here
+ if !has("mouse")
+ return
+ endif
+ 10new
+ call setline(1, range(1, 100))
+ call cursor(1, 1)
+ set mouse=a
+ call feedkeys("A\<ScrollWheelDown>\<esc>", 'tnix')
+ call assert_equal([0, 4, 1, 0], getpos('.'))
+ " This should move by one pageDown, but only moves
+ " by one line when the test is run...
+ call feedkeys("A\<S-ScrollWheelDown>\<esc>", 'tnix')
+ call assert_equal([0, 5, 1, 0], getpos('.'))
+ set nostartofline
+ call feedkeys("A\<C-ScrollWheelDown>\<esc>", 'tnix')
+ call assert_equal([0, 6, 1, 0], getpos('.'))
+ call feedkeys("A\<LeftMouse>\<esc>", 'tnix')
+ call assert_equal([0, 6, 1, 0], getpos('.'))
+ call feedkeys("A\<RightMouse>\<esc>", 'tnix')
+ call assert_equal([0, 6, 1, 0], getpos('.'))
+ call cursor(1, 100)
+ norm! zt
+ " this should move by a screen up, but when the test
+ " is run, it moves up to the top of the buffer...
+ call feedkeys("A\<ScrollWheelUp>\<esc>", 'tnix')
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+ call cursor(1, 30)
+ norm! zt
+ call feedkeys("A\<S-ScrollWheelUp>\<esc>", 'tnix')
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+ call cursor(1, 30)
+ norm! zt
+ call feedkeys("A\<C-ScrollWheelUp>\<esc>", 'tnix')
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+ %d
+ call setline(1, repeat(["12345678901234567890"], 100))
+ call cursor(2, 1)
+ call feedkeys("A\<ScrollWheelRight>\<esc>", 'tnix')
+ call assert_equal([0, 2, 20, 0], getpos('.'))
+ call feedkeys("A\<ScrollWheelLeft>\<esc>", 'tnix')
+ call assert_equal([0, 2, 20, 0], getpos('.'))
+ call feedkeys("A\<S-ScrollWheelRight>\<esc>", 'tnix')
+ call assert_equal([0, 2, 20, 0], getpos('.'))
+ call feedkeys("A\<S-ScrollWheelLeft>\<esc>", 'tnix')
+ call assert_equal([0, 2, 20, 0], getpos('.'))
+ call feedkeys("A\<C-ScrollWheelRight>\<esc>", 'tnix')
+ call assert_equal([0, 2, 20, 0], getpos('.'))
+ call feedkeys("A\<C-ScrollWheelLeft>\<esc>", 'tnix')
+ call assert_equal([0, 2, 20, 0], getpos('.'))
+ set mouse& startofline
+ bw!
+endfunc
+
+func! Test_edit_PAGEUP_PAGEDOWN()
+ 10new
+ call setline(1, repeat(['abc def ghi'], 30))
+ call cursor(1, 1)
+ call feedkeys("i\<PageDown>\<esc>", 'tnix')
+ call assert_equal([0, 9, 1, 0], getpos('.'))
+ call feedkeys("i\<PageDown>\<esc>", 'tnix')
+ call assert_equal([0, 17, 1, 0], getpos('.'))
+ call feedkeys("i\<PageDown>\<esc>", 'tnix')
+ call assert_equal([0, 25, 1, 0], getpos('.'))
+ call feedkeys("i\<PageDown>\<esc>", 'tnix')
+ call assert_equal([0, 30, 1, 0], getpos('.'))
+ call feedkeys("i\<PageDown>\<esc>", 'tnix')
+ call assert_equal([0, 30, 1, 0], getpos('.'))
+ call feedkeys("A\<PageUp>\<esc>", 'tnix')
+ call assert_equal([0, 29, 1, 0], getpos('.'))
+ call feedkeys("A\<PageUp>\<esc>", 'tnix')
+ call assert_equal([0, 21, 1, 0], getpos('.'))
+ call feedkeys("A\<PageUp>\<esc>", 'tnix')
+ call assert_equal([0, 13, 1, 0], getpos('.'))
+ call feedkeys("A\<PageUp>\<esc>", 'tnix')
+ call assert_equal([0, 5, 1, 0], getpos('.'))
+ call feedkeys("A\<PageUp>\<esc>", 'tnix')
+ call assert_equal([0, 5, 11, 0], getpos('.'))
+ " <S-Up> is the same as <PageUp>
+ " <S-Down> is the same as <PageDown>
+ call cursor(1, 1)
+ call feedkeys("i\<S-Down>\<esc>", 'tnix')
+ call assert_equal([0, 9, 1, 0], getpos('.'))
+ call feedkeys("i\<S-Down>\<esc>", 'tnix')
+ call assert_equal([0, 17, 1, 0], getpos('.'))
+ call feedkeys("i\<S-Down>\<esc>", 'tnix')
+ call assert_equal([0, 25, 1, 0], getpos('.'))
+ call feedkeys("i\<S-Down>\<esc>", 'tnix')
+ call assert_equal([0, 30, 1, 0], getpos('.'))
+ call feedkeys("i\<S-Down>\<esc>", 'tnix')
+ call assert_equal([0, 30, 1, 0], getpos('.'))
+ call feedkeys("A\<S-Up>\<esc>", 'tnix')
+ call assert_equal([0, 29, 1, 0], getpos('.'))
+ call feedkeys("A\<S-Up>\<esc>", 'tnix')
+ call assert_equal([0, 21, 1, 0], getpos('.'))
+ call feedkeys("A\<S-Up>\<esc>", 'tnix')
+ call assert_equal([0, 13, 1, 0], getpos('.'))
+ call feedkeys("A\<S-Up>\<esc>", 'tnix')
+ call assert_equal([0, 5, 1, 0], getpos('.'))
+ call feedkeys("A\<S-Up>\<esc>", 'tnix')
+ call assert_equal([0, 5, 11, 0], getpos('.'))
+ set nostartofline
+ call cursor(30, 11)
+ norm! zt
+ call feedkeys("A\<PageUp>\<esc>", 'tnix')
+ call assert_equal([0, 29, 11, 0], getpos('.'))
+ call feedkeys("A\<PageUp>\<esc>", 'tnix')
+ call assert_equal([0, 21, 11, 0], getpos('.'))
+ call feedkeys("A\<PageUp>\<esc>", 'tnix')
+ call assert_equal([0, 13, 11, 0], getpos('.'))
+ call feedkeys("A\<PageUp>\<esc>", 'tnix')
+ call assert_equal([0, 5, 11, 0], getpos('.'))
+ call feedkeys("A\<PageUp>\<esc>", 'tnix')
+ call assert_equal([0, 5, 11, 0], getpos('.'))
+ call cursor(1, 1)
+ call feedkeys("A\<PageDown>\<esc>", 'tnix')
+ call assert_equal([0, 9, 11, 0], getpos('.'))
+ call feedkeys("A\<PageDown>\<esc>", 'tnix')
+ call assert_equal([0, 17, 11, 0], getpos('.'))
+ call feedkeys("A\<PageDown>\<esc>", 'tnix')
+ call assert_equal([0, 25, 11, 0], getpos('.'))
+ call feedkeys("A\<PageDown>\<esc>", 'tnix')
+ call assert_equal([0, 30, 11, 0], getpos('.'))
+ call feedkeys("A\<PageDown>\<esc>", 'tnix')
+ call assert_equal([0, 30, 11, 0], getpos('.'))
+ " <S-Up> is the same as <PageUp>
+ " <S-Down> is the same as <PageDown>
+ call cursor(30, 11)
+ norm! zt
+ call feedkeys("A\<S-Up>\<esc>", 'tnix')
+ call assert_equal([0, 29, 11, 0], getpos('.'))
+ call feedkeys("A\<S-Up>\<esc>", 'tnix')
+ call assert_equal([0, 21, 11, 0], getpos('.'))
+ call feedkeys("A\<S-Up>\<esc>", 'tnix')
+ call assert_equal([0, 13, 11, 0], getpos('.'))
+ call feedkeys("A\<S-Up>\<esc>", 'tnix')
+ call assert_equal([0, 5, 11, 0], getpos('.'))
+ call feedkeys("A\<S-Up>\<esc>", 'tnix')
+ call assert_equal([0, 5, 11, 0], getpos('.'))
+ call cursor(1, 1)
+ call feedkeys("A\<S-Down>\<esc>", 'tnix')
+ call assert_equal([0, 9, 11, 0], getpos('.'))
+ call feedkeys("A\<S-Down>\<esc>", 'tnix')
+ call assert_equal([0, 17, 11, 0], getpos('.'))
+ call feedkeys("A\<S-Down>\<esc>", 'tnix')
+ call assert_equal([0, 25, 11, 0], getpos('.'))
+ call feedkeys("A\<S-Down>\<esc>", 'tnix')
+ call assert_equal([0, 30, 11, 0], getpos('.'))
+ call feedkeys("A\<S-Down>\<esc>", 'tnix')
+ call assert_equal([0, 30, 11, 0], getpos('.'))
+ bw!
+endfunc
+
+func! Test_edit_forbidden()
+ new
+ " 1) edit in the sandbox is not allowed
+ call setline(1, 'a')
+ com! Sandbox :sandbox call feedkeys("i\<del>\<esc>", 'tnix')
+ call assert_fails(':Sandbox', 'E48:')
+ com! Sandbox :sandbox exe "norm! i\<del>"
+ call assert_fails(':Sandbox', 'E48:')
+ delcom Sandbox
+ call assert_equal(['a'], getline(1,'$'))
+ " 2) edit with textlock set
+ fu! DoIt()
+ call feedkeys("i\<del>\<esc>", 'tnix')
+ endfu
+ au InsertCharPre <buffer> :call DoIt()
+ try
+ call feedkeys("ix\<esc>", 'tnix')
+ call assert_fails(1, 'textlock')
+ catch /^Vim\%((\a\+)\)\=:E523/ " catch E523: not allowed here
+ endtry
+ " TODO: Might be a bug: should x really be inserted here
+ call assert_equal(['xa'], getline(1, '$'))
+ delfu DoIt
+ try
+ call feedkeys("ix\<esc>", 'tnix')
+ call assert_fails(1, 'unknown function')
+ catch /^Vim\%((\a\+)\)\=:E117/ " catch E117: unknown function
+ endtry
+ au! InsertCharPre
+ " 3) edit when completion is shown
+ fun! Complete(findstart, base)
+ if a:findstart
+ return col('.')
+ else
+ call feedkeys("i\<del>\<esc>", 'tnix')
+ return []
+ endif
+ endfun
+ set completefunc=Complete
+ try
+ call feedkeys("i\<c-x>\<c-u>\<esc>", 'tnix')
+ call assert_fails(1, 'change in complete function')
+ catch /^Vim\%((\a\+)\)\=:E523/ " catch E523
+ endtry
+ delfu Complete
+ set completefunc=
+ if has("rightleft") && exists("+fkmap")
+ " 4) 'R' when 'fkmap' and 'revins' is set.
+ set revins fkmap
+ try
+ normal Ri
+ call assert_fails(1, "R with 'fkmap' and 'ri' set")
+ catch
+ finally
+ set norevins nofkmap
+ endtry
+ endif
+ bw!
+endfunc
+
+func! Test_edit_rightleft()
+ " Cursor in rightleft mode moves differently
+ if !exists("+rightleft")
+ return
+ endif
+ call NewWindow(10, 20)
+ call setline(1, ['abc', 'def', 'ghi'])
+ call cursor(1, 2)
+ set rightleft
+ " Screen looks as expected
+ let lines = ScreenLines([1, 4], winwidth(0))
+ let expect = [
+ \" cba",
+ \" fed",
+ \" ihg",
+ \" ~"]
+ call assert_equal(join(expect, "\n"), join(lines, "\n"))
+ " 2) right moves to the left
+ call feedkeys("i\<right>\<esc>x", 'txin')
+ call assert_equal(['bc', 'def', 'ghi'], getline(1,'$'))
+ call cursor(1, 2)
+ call feedkeys("i\<s-right>\<esc>", 'txin')
+ call cursor(1, 2)
+ call feedkeys("i\<c-right>\<esc>", 'txin')
+ " Screen looks as expected
+ let lines = ScreenLines([1, 4], winwidth(0))
+ let expect = [
+ \" cb",
+ \" fed",
+ \" ihg",
+ \" ~"]
+ call assert_equal(join(expect, "\n"), join(lines, "\n"))
+ " 2) left moves to the right
+ call setline(1, ['abc', 'def', 'ghi'])
+ call cursor(1, 2)
+ call feedkeys("i\<left>\<esc>x", 'txin')
+ call assert_equal(['ac', 'def', 'ghi'], getline(1,'$'))
+ call cursor(1, 2)
+ call feedkeys("i\<s-left>\<esc>", 'txin')
+ call cursor(1, 2)
+ call feedkeys("i\<c-left>\<esc>", 'txin')
+ " Screen looks as expected
+ let lines = ScreenLines([1, 4], winwidth(0))
+ let expect = [
+ \" ca",
+ \" fed",
+ \" ihg",
+ \" ~"]
+ call assert_equal(join(expect, "\n"), join(lines, "\n"))
+ set norightleft
+ bw!
+endfunc
+
+func Test_edit_backtick()
+ next a\`b c
+ call assert_equal('a`b', expand('%'))
+ next
+ call assert_equal('c', expand('%'))
+ call assert_equal('a\`b c', expand('##'))
+endfunc
+
+func Test_edit_quit()
+ edit foo.txt
+ split
+ new
+ call setline(1, 'hello')
+ 3wincmd w
+ redraw!
+ call assert_fails('1q', 'E37:')
+ bwipe! foo.txt
+ only
+endfunc
+
+func Test_edit_complete_very_long_name()
+ if !has('unix')
+ " Long directory names only work on Unix.
+ return
+ endif
+
+ let dirname = getcwd() . "/Xdir"
+ let longdirname = dirname . repeat('/' . repeat('d', 255), 4)
+ try
+ call mkdir(longdirname, 'p')
+ catch /E739:/
+ " Long directory name probably not supported.
+ call delete(dirname, 'rf')
+ return
+ endtry
+
+ " Try to get the Vim window position before setting 'columns'.
+ let winposx = getwinposx()
+ let winposy = getwinposy()
+ let save_columns = &columns
+ " Need at least about 1100 columns to reproduce the problem.
+ set columns=2000
+ call assert_equal(2000, &columns)
+ set noswapfile
+
+ let longfilename = longdirname . '/' . repeat('a', 255)
+ call writefile(['Totum', 'Table'], longfilename)
+ new
+ exe "next Xfile " . longfilename
+ exe "normal iT\<C-N>"
+
+ bwipe!
+ exe 'bwipe! ' . longfilename
+ call delete(dirname, 'rf')
+ let &columns = save_columns
+ if winposx >= 0 && winposy >= 0
+ exe 'winpos ' . winposx . ' ' . winposy
+ endif
+ set swapfile&
+endfunc
+
+func Test_edit_alt()
+ " Keeping the cursor line didn't happen when the first line has indent.
+ new
+ call setline(1, [' one', 'two', 'three'])
+ w XAltFile
+ $
+ call assert_equal(3, line('.'))
+ e Xother
+ e #
+ call assert_equal(3, line('.'))
+
+ bwipe XAltFile
+ call delete('XAltFile')
+endfunc
+
+func Test_leave_insert_autocmd()
+ new
+ au InsertLeave * let g:did_au = 1
+ let g:did_au = 0
+ call feedkeys("afoo\<Esc>", 'tx')
+ call assert_equal(1, g:did_au)
+ call assert_equal('foo', getline(1))
+
+ let g:did_au = 0
+ call feedkeys("Sbar\<C-C>", 'tx')
+ call assert_equal(0, g:did_au)
+ call assert_equal('bar', getline(1))
+
+ inoremap x xx<Esc>
+ let g:did_au = 0
+ call feedkeys("Saax", 'tx')
+ call assert_equal(1, g:did_au)
+ call assert_equal('aaxx', getline(1))
+
+ inoremap x xx<C-C>
+ let g:did_au = 0
+ call feedkeys("Sbbx", 'tx')
+ call assert_equal(0, g:did_au)
+ call assert_equal('bbxx', getline(1))
+
+ bwipe!
+ au! InsertLeave
+ iunmap x
+endfunc
diff --git a/src/nvim/testdir/test_erasebackword.vim b/src/nvim/testdir/test_erasebackword.vim
new file mode 100644
index 0000000000..098d6edfcb
--- /dev/null
+++ b/src/nvim/testdir/test_erasebackword.vim
@@ -0,0 +1,25 @@
+
+func Test_erasebackword()
+ if !has('multi_byte')
+ return
+ endif
+
+ set encoding=utf-8
+ enew
+
+ exe "normal o wwwใ“ใ‚“ใซใกใ‚ไธ–็•Œใƒฏใƒผใƒซใƒ‰vim \<C-W>"
+ call assert_equal(' wwwใ“ใ‚“ใซใกใ‚ไธ–็•Œใƒฏใƒผใƒซใƒ‰', getline('.'))
+ exe "normal o wwwใ“ใ‚“ใซใกใ‚ไธ–็•Œใƒฏใƒผใƒซใƒ‰vim \<C-W>\<C-W>"
+ call assert_equal(' wwwใ“ใ‚“ใซใกใ‚ไธ–็•Œ', getline('.'))
+ exe "normal o wwwใ“ใ‚“ใซใกใ‚ไธ–็•Œใƒฏใƒผใƒซใƒ‰vim \<C-W>\<C-W>\<C-W>"
+ call assert_equal(' wwwใ“ใ‚“ใซใกใ‚', getline('.'))
+ exe "normal o wwwใ“ใ‚“ใซใกใ‚ไธ–็•Œใƒฏใƒผใƒซใƒ‰vim \<C-W>\<C-W>\<C-W>\<C-W>"
+ call assert_equal(' www', getline('.'))
+ exe "normal o wwwใ“ใ‚“ใซใกใ‚ไธ–็•Œใƒฏใƒผใƒซใƒ‰vim \<C-W>\<C-W>\<C-W>\<C-W>\<C-W>"
+ call assert_equal(' ', getline('.'))
+ exe "normal o wwwใ“ใ‚“ใซใกใ‚ไธ–็•Œใƒฏใƒผใƒซใƒ‰vim \<C-W>\<C-W>\<C-W>\<C-W>\<C-W>\<C-W>"
+ call assert_equal('', getline('.'))
+
+ enew!
+ set encoding&
+endfunc
diff --git a/src/nvim/testdir/test_escaped_glob.vim b/src/nvim/testdir/test_escaped_glob.vim
new file mode 100644
index 0000000000..aad3a1e835
--- /dev/null
+++ b/src/nvim/testdir/test_escaped_glob.vim
@@ -0,0 +1,34 @@
+" Test whether glob()/globpath() return correct results with certain escaped
+" characters.
+
+function SetUp()
+ " consistent sorting of file names
+ set nofileignorecase
+endfunction
+
+function Test_glob()
+ if !has('unix')
+ " This test fails on Windows because of the special characters in the
+ " filenames. Disable the test on non-Unix systems for now.
+ return
+ endif
+
+ " Execute these commands in the sandbox, so that using the shell fails.
+ " Setting 'shell' to an invalid name causes a memory leak.
+ sandbox call assert_equal("", glob('Xxx\{'))
+ sandbox call assert_equal("", glob('Xxx\$'))
+ w! Xxx{
+ " } to fix highlighting
+ w! Xxx\$
+ sandbox call assert_equal("Xxx{", glob('Xxx\{'))
+ sandbox call assert_equal("Xxx$", glob('Xxx\$'))
+ call delete('Xxx{')
+ call delete('Xxx$')
+endfunction
+
+function Test_globpath()
+ sandbox call assert_equal(expand("sautest/autoload/globone.vim\nsautest/autoload/globtwo.vim"),
+ \ globpath('sautest/autoload', 'glob*.vim'))
+ sandbox call assert_equal([expand('sautest/autoload/globone.vim'), expand('sautest/autoload/globtwo.vim')],
+ \ globpath('sautest/autoload', 'glob*.vim', 0, 1))
+endfunction
diff --git a/src/nvim/testdir/test_eval_stuff.vim b/src/nvim/testdir/test_eval_stuff.vim
new file mode 100644
index 0000000000..111c85bb95
--- /dev/null
+++ b/src/nvim/testdir/test_eval_stuff.vim
@@ -0,0 +1,23 @@
+" Tests for various eval things.
+
+function s:foo() abort
+ try
+ return [] == 0
+ catch
+ return 1
+ endtry
+endfunction
+
+func Test_catch_return_with_error()
+ call assert_equal(1, s:foo())
+endfunc
+
+func Test_E963()
+ " These commands used to cause an internal error prior to vim 8.1.0563
+ let v_e = v:errors
+ let v_o = v:oldfiles
+ call assert_fails("let v:errors=''", 'E963:')
+ call assert_equal(v_e, v:errors)
+ call assert_fails("let v:oldfiles=''", 'E963:')
+ call assert_equal(v_o, v:oldfiles)
+endfunc
diff --git a/src/nvim/testdir/test_ex_undo.vim b/src/nvim/testdir/test_ex_undo.vim
new file mode 100644
index 0000000000..44feb3680a
--- /dev/null
+++ b/src/nvim/testdir/test_ex_undo.vim
@@ -0,0 +1,19 @@
+" Tests for :undo
+
+func Test_ex_undo()
+ new ex-undo
+ setlocal ul=10
+ exe "normal ione\n\<Esc>"
+ setlocal ul=10
+ exe "normal itwo\n\<Esc>"
+ setlocal ul=10
+ exe "normal ithree\n\<Esc>"
+ call assert_equal(4, line('$'))
+ undo
+ call assert_equal(3, line('$'))
+ undo 1
+ call assert_equal(2, line('$'))
+ undo 0
+ call assert_equal(1, line('$'))
+ quit!
+endfunc
diff --git a/src/nvim/testdir/test_ex_z.vim b/src/nvim/testdir/test_ex_z.vim
new file mode 100644
index 0000000000..608a36c490
--- /dev/null
+++ b/src/nvim/testdir/test_ex_z.vim
@@ -0,0 +1,78 @@
+" Test :z
+
+func Test_z()
+ call setline(1, range(1, 100))
+
+ let a = execute('20z3')
+ call assert_equal("\n20\n21\n22", a)
+ call assert_equal(22, line('.'))
+ " 'window' should be set to the {count} value.
+ call assert_equal(3, &window)
+
+ " If there is only one window, then twice the amount of 'scroll' is used.
+ set scroll=2
+ let a = execute('20z')
+ call assert_equal("\n20\n21\n22\n23", a)
+ call assert_equal(23, line('.'))
+
+ let a = execute('20z+3')
+ " FIXME: I would expect the same result as '20z3' but it
+ " gives "\n21\n22\n23" instead. Bug in Vim or in ":help :z"?
+ "call assert_equal("\n20\n21\n22", a)
+ "call assert_equal(22, line('.'))
+
+ let a = execute('20z-3')
+ call assert_equal("\n18\n19\n20", a)
+ call assert_equal(20, line('.'))
+
+ let a = execute('20z=3')
+ call assert_match("^\n18\n19\n-\\+\n20\n-\\+\n21\n22$", a)
+ call assert_equal(20, line('.'))
+
+ let a = execute('20z^3')
+ call assert_equal("\n14\n15\n16\n17", a)
+ call assert_equal(17, line('.'))
+
+ let a = execute('20z.3')
+ call assert_equal("\n19\n20\n21", a)
+ call assert_equal(21, line('.'))
+
+ let a = execute('20z#3')
+ call assert_equal("\n 20 20\n 21 21\n 22 22", a)
+ call assert_equal(22, line('.'))
+
+ let a = execute('20z#-3')
+ call assert_equal("\n 18 18\n 19 19\n 20 20", a)
+ call assert_equal(20, line('.'))
+
+ let a = execute('20z#=3')
+ call assert_match("^\n 18 18\n 19 19\n-\\+\n 20 20\n-\\+\n 21 21\n 22 22$", a)
+ call assert_equal(20, line('.'))
+
+ " Test with {count} bigger than the number of lines in buffer.
+ let a = execute('20z1000')
+ call assert_match("^\n20\n21\n.*\n99\n100$", a)
+ call assert_equal(100, line('.'))
+
+ let a = execute('20z-1000')
+ call assert_match("^\n1\n2\n.*\n19\n20$", a)
+ call assert_equal(20, line('.'))
+
+ let a = execute('20z=1000')
+ call assert_match("^\n1\n.*\n-\\+\n20\n-\\\+\n.*\n100$", a)
+ call assert_equal(20, line('.'))
+
+ call assert_fails('20z=a', 'E144:')
+
+ set window& scroll&
+ bw!
+endfunc
+
+func Test_z_bug()
+ " This used to access invalid memory as a result of an integer overflow
+ " and freeze vim.
+ normal ox
+ normal Heat
+ z777777776666666
+ ')
+endfunc
diff --git a/src/nvim/testdir/test_exec_while_if.vim b/src/nvim/testdir/test_exec_while_if.vim
new file mode 100644
index 0000000000..d6afabff45
--- /dev/null
+++ b/src/nvim/testdir/test_exec_while_if.vim
@@ -0,0 +1,53 @@
+" Test for :execute, :while and :if
+
+function Test_exec_while_if()
+ new
+
+ let i = 0
+ while i < 12
+ let i = i + 1
+ if has("ebcdic")
+ execute "normal o" . i . "\047"
+ else
+ execute "normal o" . i . "\033"
+ endif
+ if i % 2
+ normal Ax
+ if i == 9
+ break
+ endif
+ if i == 5
+ continue
+ else
+ let j = 9
+ while j > 0
+ if has("ebcdic")
+ execute "normal" j . "a" . j . "\x27"
+ else
+ execute "normal" j . "a" . j . "\x1b"
+ endif
+ let j = j - 1
+ endwhile
+ endif
+ endif
+ if i == 9
+ if has("ebcdic")
+ execute "normal Az\047"
+ else
+ execute "normal Az\033"
+ endif
+ endif
+ endwhile
+ unlet i j
+
+ call assert_equal(["",
+ \ "1x999999999888888887777777666666555554444333221",
+ \ "2",
+ \ "3x999999999888888887777777666666555554444333221",
+ \ "4",
+ \ "5x",
+ \ "6",
+ \ "7x999999999888888887777777666666555554444333221",
+ \ "8",
+ \ "9x"], getline(1, 10))
+endfunction
diff --git a/src/nvim/testdir/test_execute_func.vim b/src/nvim/testdir/test_execute_func.vim
new file mode 100644
index 0000000000..6f61bede93
--- /dev/null
+++ b/src/nvim/testdir/test_execute_func.vim
@@ -0,0 +1,55 @@
+" test execute()
+
+func NestedEval()
+ let nested = execute('echo "nested\nlines"')
+ echo 'got: "' . nested . '"'
+endfunc
+
+func NestedRedir()
+ redir => var
+ echo 'broken'
+ redir END
+endfunc
+
+func Test_execute_string()
+ call assert_equal("\nnocompatible", execute('set compatible?'))
+ call assert_equal("\nsomething\nnice", execute('echo "something\nnice"'))
+ call assert_equal("noendofline", execute('echon "noendofline"'))
+ call assert_equal("", execute(123))
+
+ call assert_equal("\ngot: \"\nnested\nlines\"", execute('call NestedEval()'))
+ redir => redired
+ echo 'this'
+ let evaled = execute('echo "that"')
+ echo 'theend'
+ redir END
+" Nvim supports execute('... :redir ...'), so this test is intentionally
+" disabled.
+" call assert_equal("\nthis\ntheend", redired)
+ call assert_equal("\nthat", evaled)
+
+ call assert_fails('call execute("doesnotexist")', 'E492:')
+ call assert_fails('call execute(3.4)', 'E806:')
+" Nvim supports execute('... :redir ...'), so this test is intentionally
+" disabled.
+" call assert_fails('call execute("call NestedRedir()")', 'E930:')
+
+ call assert_equal("\nsomething", execute('echo "something"', ''))
+ call assert_equal("\nsomething", execute('echo "something"', 'silent'))
+ call assert_equal("\nsomething", execute('echo "something"', 'silent!'))
+ call assert_equal("", execute('burp', 'silent!'))
+ call assert_fails('call execute("echo \"x\"", 3.4)', 'E806:')
+
+ call assert_equal("", execute(""))
+endfunc
+
+func Test_execute_list()
+ call assert_equal("\nsomething\nnice", execute(['echo "something"', 'echo "nice"']))
+ let l = ['for n in range(0, 3)',
+ \ 'echo n',
+ \ 'endfor']
+ call assert_equal("\n0\n1\n2\n3", execute(l))
+
+ call assert_equal("", execute([]))
+ call assert_equal("", execute(v:_null_list))
+endfunc
diff --git a/src/nvim/testdir/test_exists.vim b/src/nvim/testdir/test_exists.vim
new file mode 100644
index 0000000000..fd34be83b0
--- /dev/null
+++ b/src/nvim/testdir/test_exists.vim
@@ -0,0 +1,321 @@
+" Tests for the exists() function
+func Test_exists()
+ augroup myagroup
+ autocmd! BufEnter *.my echo "myfile edited"
+ autocmd! FuncUndefined UndefFun exec "fu UndefFun()\nendfu"
+ augroup END
+ set rtp+=./sautest
+
+ " valid autocmd group
+ call assert_equal(1, exists('#myagroup'))
+ " valid autocmd group with garbage
+ call assert_equal(0, exists('#myagroup+b'))
+ " Valid autocmd group and event
+ call assert_equal(1, exists('#myagroup#BufEnter'))
+ " Valid autocmd group, event and pattern
+ call assert_equal(1, exists('#myagroup#BufEnter#*.my'))
+ " Valid autocmd event
+ call assert_equal(1, exists('#BufEnter'))
+ " Valid autocmd event and pattern
+ call assert_equal(1, exists('#BufEnter#*.my'))
+ " Non-existing autocmd group or event
+ call assert_equal(0, exists('#xyzagroup'))
+ " Non-existing autocmd group and valid autocmd event
+ call assert_equal(0, exists('#xyzagroup#BufEnter'))
+ " Valid autocmd group and event with no matching pattern
+ call assert_equal(0, exists('#myagroup#CmdwinEnter'))
+ " Valid autocmd group and non-existing autocmd event
+ call assert_equal(0, exists('#myagroup#xyzacmd'))
+ " Valid autocmd group and event and non-matching pattern
+ call assert_equal(0, exists('#myagroup#BufEnter#xyzpat'))
+ " Valid autocmd event and non-matching pattern
+ call assert_equal(0, exists('#BufEnter#xyzpat'))
+ " Empty autocmd group, event and pattern
+ call assert_equal(0, exists('###'))
+ " Empty autocmd group and event or empty event and pattern
+ call assert_equal(0, exists('##'))
+ " Valid autocmd event
+ call assert_equal(1, exists('##FileReadCmd'))
+ " Non-existing autocmd event
+ call assert_equal(0, exists('##MySpecialCmd'))
+
+ " Existing and working option (long form)
+ call assert_equal(1, exists('&textwidth'))
+ " Existing and working option (short form)
+ call assert_equal(1, exists('&tw'))
+ " Existing and working option with garbage
+ call assert_equal(0, exists('&tw-'))
+ " Global option
+ call assert_equal(1, exists('&g:errorformat'))
+ " Local option
+ call assert_equal(1, exists('&l:errorformat'))
+ " Negative form of existing and working option (long form)
+ call assert_equal(0, exists('&nojoinspaces'))
+ " Negative form of existing and working option (short form)
+ call assert_equal(0, exists('&nojs'))
+ " Non-existing option
+ call assert_equal(0, exists('&myxyzoption'))
+
+ " Existing and working option (long form)
+ call assert_equal(1, exists('+incsearch'))
+ " Existing and working option with garbage
+ call assert_equal(0, exists('+incsearch!1'))
+ " Existing and working option (short form)
+ call assert_equal(1, exists('+is'))
+ " Existing option that is hidden.
+ call assert_equal(0, exists('+autoprint'))
+
+ " Existing environment variable
+ let $EDITOR_NAME = 'Vim Editor'
+ call assert_equal(1, exists('$EDITOR_NAME'))
+ " Non-existing environment variable
+ call assert_equal(0, exists('$NON_ENV_VAR'))
+
+ " Valid internal function
+ call assert_equal(1, exists('*bufnr'))
+ " Valid internal function with ()
+ call assert_equal(1, exists('*bufnr()'))
+ " Non-existing internal function
+ call assert_equal(0, exists('*myxyzfunc'))
+ " Valid internal function with garbage
+ call assert_equal(0, exists('*bufnr&6'))
+ " Valid user defined function
+ call assert_equal(1, exists('*Test_exists'))
+ " Non-existing user defined function
+ call assert_equal(0, exists('*MyxyzFunc'))
+ " Function that may be created by FuncUndefined event
+ call assert_equal(0, exists('*UndefFun'))
+ " Function that may be created by script autoloading
+ call assert_equal(0, exists('*footest#F'))
+
+ " Valid internal command (full match)
+ call assert_equal(2, exists(':edit'))
+ " Valid internal command (full match) with garbage
+ call assert_equal(0, exists(':edit/a'))
+ " Valid internal command (partial match)
+ call assert_equal(1, exists(':q'))
+ " Non-existing internal command
+ call assert_equal(0, exists(':invalidcmd'))
+
+ " User defined command (full match)
+ command! MyCmd :echo 'My command'
+ call assert_equal(2, exists(':MyCmd'))
+ " User defined command (partial match)
+ command! MyOtherCmd :echo 'Another command'
+ call assert_equal(3, exists(':My'))
+
+ " Command modifier
+ call assert_equal(2, exists(':rightbelow'))
+
+ " Non-existing user defined command (full match)
+ delcommand MyCmd
+ call assert_equal(0, exists(':MyCmd'))
+
+ " Non-existing user defined command (partial match)
+ delcommand MyOtherCmd
+ call assert_equal(0, exists(':My'))
+
+ " Valid local variable
+ let local_var = 1
+ call assert_equal(1, exists('local_var'))
+ " Valid local variable with garbage
+ call assert_equal(0, exists('local_var%n'))
+ " Non-existing local variable
+ unlet local_var
+ call assert_equal(0, exists('local_var'))
+
+ " Non-existing autoload variable that may be autoloaded
+ call assert_equal(0, exists('footest#x'))
+
+ " Valid local list
+ let local_list = ["blue", "orange"]
+ call assert_equal(1, exists('local_list'))
+ " Valid local list item
+ call assert_equal(1, exists('local_list[1]'))
+ " Valid local list item with garbage
+ call assert_equal(0, exists('local_list[1]+5'))
+ " Invalid local list item
+ call assert_equal(0, exists('local_list[2]'))
+ " Non-existing local list
+ unlet local_list
+ call assert_equal(0, exists('local_list'))
+ " Valid local dictionary
+ let local_dict = {"xcord":100, "ycord":2}
+ call assert_equal(1, exists('local_dict'))
+ " Non-existing local dictionary
+ unlet local_dict
+ call assert_equal(0, exists('local_dict'))
+ " Existing local curly-brace variable
+ let str = "local"
+ let curly_{str}_var = 1
+ call assert_equal(1, exists('curly_{str}_var'))
+ " Non-existing local curly-brace variable
+ unlet curly_{str}_var
+ call assert_equal(0, exists('curly_{str}_var'))
+
+ " Existing global variable
+ let g:global_var = 1
+ call assert_equal(1, exists('g:global_var'))
+ " Existing global variable with garbage
+ call assert_equal(0, exists('g:global_var-n'))
+ " Non-existing global variable
+ unlet g:global_var
+ call assert_equal(0, exists('g:global_var'))
+ " Existing global list
+ let g:global_list = ["blue", "orange"]
+ call assert_equal(1, exists('g:global_list'))
+ " Non-existing global list
+ unlet g:global_list
+ call assert_equal(0, exists('g:global_list'))
+ " Existing global dictionary
+ let g:global_dict = {"xcord":100, "ycord":2}
+ call assert_equal(1, exists('g:global_dict'))
+ " Non-existing global dictionary
+ unlet g:global_dict
+ call assert_equal(0, exists('g:global_dict'))
+ " Existing global curly-brace variable
+ let str = "global"
+ let g:curly_{str}_var = 1
+ call assert_equal(1, exists('g:curly_{str}_var'))
+ " Non-existing global curly-brace variable
+ unlet g:curly_{str}_var
+ call assert_equal(0, exists('g:curly_{str}_var'))
+
+ " Existing window variable
+ let w:window_var = 1
+ call assert_equal(1, exists('w:window_var'))
+ " Non-existing window variable
+ unlet w:window_var
+ call assert_equal(0, exists('w:window_var'))
+ " Existing window list
+ let w:window_list = ["blue", "orange"]
+ call assert_equal(1, exists('w:window_list'))
+ " Non-existing window list
+ unlet w:window_list
+ call assert_equal(0, exists('w:window_list'))
+ " Existing window dictionary
+ let w:window_dict = {"xcord":100, "ycord":2}
+ call assert_equal(1, exists('w:window_dict'))
+ " Non-existing window dictionary
+ unlet w:window_dict
+ call assert_equal(0, exists('w:window_dict'))
+ " Existing window curly-brace variable
+ let str = "window"
+ let w:curly_{str}_var = 1
+ call assert_equal(1, exists('w:curly_{str}_var'))
+ " Non-existing window curly-brace variable
+ unlet w:curly_{str}_var
+ call assert_equal(0, exists('w:curly_{str}_var'))
+
+ " Existing tab variable
+ let t:tab_var = 1
+ call assert_equal(1, exists('t:tab_var'))
+ " Non-existing tab variable
+ unlet t:tab_var
+ call assert_equal(0, exists('t:tab_var'))
+ " Existing tab list
+ let t:tab_list = ["blue", "orange"]
+ call assert_equal(1, exists('t:tab_list'))
+ " Non-existing tab list
+ unlet t:tab_list
+ call assert_equal(0, exists('t:tab_list'))
+ " Existing tab dictionary
+ let t:tab_dict = {"xcord":100, "ycord":2}
+ call assert_equal(1, exists('t:tab_dict'))
+ " Non-existing tab dictionary
+ unlet t:tab_dict
+ call assert_equal(0, exists('t:tab_dict'))
+ " Existing tab curly-brace variable
+ let str = "tab"
+ let t:curly_{str}_var = 1
+ call assert_equal(1, exists('t:curly_{str}_var'))
+ " Non-existing tab curly-brace variable
+ unlet t:curly_{str}_var
+ call assert_equal(0, exists('t:curly_{str}_var'))
+
+ " Existing buffer variable
+ let b:buffer_var = 1
+ call assert_equal(1, exists('b:buffer_var'))
+ " Non-existing buffer variable
+ unlet b:buffer_var
+ call assert_equal(0, exists('b:buffer_var'))
+ " Existing buffer list
+ let b:buffer_list = ["blue", "orange"]
+ call assert_equal(1, exists('b:buffer_list'))
+ " Non-existing buffer list
+ unlet b:buffer_list
+ call assert_equal(0, exists('b:buffer_list'))
+ " Existing buffer dictionary
+ let b:buffer_dict = {"xcord":100, "ycord":2}
+ call assert_equal(1, exists('b:buffer_dict'))
+ " Non-existing buffer dictionary
+ unlet b:buffer_dict
+ call assert_equal(0, exists('b:buffer_dict'))
+ " Existing buffer curly-brace variable
+ let str = "buffer"
+ let b:curly_{str}_var = 1
+ call assert_equal(1, exists('b:curly_{str}_var'))
+ " Non-existing buffer curly-brace variable
+ unlet b:curly_{str}_var
+ call assert_equal(0, exists('b:curly_{str}_var'))
+
+ " Existing Vim internal variable
+ call assert_equal(1, exists('v:version'))
+ " Non-existing Vim internal variable
+ call assert_equal(0, exists('v:non_exists_var'))
+
+ " Existing script-local variable
+ let s:script_var = 1
+ call assert_equal(1, exists('s:script_var'))
+ " Non-existing script-local variable
+ unlet s:script_var
+ call assert_equal(0, exists('s:script_var'))
+ " Existing script-local list
+ let s:script_list = ["blue", "orange"]
+ call assert_equal(1, exists('s:script_list'))
+ " Non-existing script-local list
+ unlet s:script_list
+ call assert_equal(0, exists('s:script_list'))
+ " Existing script-local dictionary
+ let s:script_dict = {"xcord":100, "ycord":2}
+ call assert_equal(1, exists('s:script_dict'))
+ " Non-existing script-local dictionary
+ unlet s:script_dict
+ call assert_equal(0, exists('s:script_dict'))
+ " Existing script curly-brace variable
+ let str = "script"
+ let s:curly_{str}_var = 1
+ call assert_equal(1, exists('s:curly_{str}_var'))
+ " Non-existing script-local curly-brace variable
+ unlet s:curly_{str}_var
+ call assert_equal(0, exists('s:curly_{str}_var'))
+
+ " Existing script-local function
+ function! s:my_script_func()
+ endfunction
+
+ echo '*s:my_script_func: 1'
+ call assert_equal(1, exists('*s:my_script_func'))
+
+ " Non-existing script-local function
+ delfunction s:my_script_func
+
+ call assert_equal(0, exists('*s:my_script_func'))
+ unlet str
+
+ call assert_equal(1, g:footest#x)
+ call assert_equal(0, footest#F())
+ call assert_equal(0, UndefFun())
+endfunc
+
+" exists() test for Function arguments
+func FuncArg_Tests(func_arg, ...)
+ call assert_equal(1, exists('a:func_arg'))
+ call assert_equal(0, exists('a:non_exists_arg'))
+ call assert_equal(1, exists('a:1'))
+ call assert_equal(0, exists('a:2'))
+endfunc
+
+func Test_exists_funcarg()
+ call FuncArg_Tests("arg1", "arg2")
+endfunc
diff --git a/src/nvim/testdir/test_exists_autocmd.vim b/src/nvim/testdir/test_exists_autocmd.vim
new file mode 100644
index 0000000000..7e44a72653
--- /dev/null
+++ b/src/nvim/testdir/test_exists_autocmd.vim
@@ -0,0 +1,26 @@
+" Test that groups and patterns are tested correctly when calling exists() for
+" autocommands.
+
+function Test_AutoCommands()
+ let results=[]
+ augroup auexists
+ augroup END
+ call assert_true(exists("##BufEnter"))
+ call assert_false(exists("#BufEnter"))
+ au BufEnter * let g:entered=1
+ call assert_true(exists("#BufEnter"))
+ call assert_false(exists("#auexists#BufEnter"))
+ augroup auexists
+ au BufEnter * let g:entered=1
+ augroup END
+ call assert_true(exists("#auexists#BufEnter"))
+ call assert_false(exists("#BufEnter#*.test"))
+ au BufEnter *.test let g:entered=1
+ call assert_true(exists("#BufEnter#*.test"))
+ edit testfile.test
+ call assert_false(exists("#BufEnter#<buffer>"))
+ au BufEnter <buffer> let g:entered=1
+ call assert_true(exists("#BufEnter#<buffer>"))
+ edit testfile2.test
+ call assert_false(exists("#BufEnter#<buffer>"))
+endfunction
diff --git a/src/nvim/testdir/test_exit.vim b/src/nvim/testdir/test_exit.vim
new file mode 100644
index 0000000000..8f02fd29e3
--- /dev/null
+++ b/src/nvim/testdir/test_exit.vim
@@ -0,0 +1,57 @@
+" Tests for exiting Vim.
+
+source shared.vim
+
+func Test_exiting()
+ let after = [
+ \ 'au QuitPre * call writefile(["QuitPre"], "Xtestout")',
+ \ 'au ExitPre * call writefile(["ExitPre"], "Xtestout", "a")',
+ \ 'quit',
+ \ ]
+ if RunVim([], after, '')
+ call assert_equal(['QuitPre', 'ExitPre'], readfile('Xtestout'))
+ endif
+ call delete('Xtestout')
+
+ let after = [
+ \ 'au QuitPre * call writefile(["QuitPre"], "Xtestout")',
+ \ 'au ExitPre * call writefile(["ExitPre"], "Xtestout", "a")',
+ \ 'help',
+ \ 'wincmd w',
+ \ 'quit',
+ \ ]
+ if RunVim([], after, '')
+ call assert_equal(['QuitPre', 'ExitPre'], readfile('Xtestout'))
+ endif
+ call delete('Xtestout')
+
+ let after = [
+ \ 'au QuitPre * call writefile(["QuitPre"], "Xtestout")',
+ \ 'au ExitPre * call writefile(["ExitPre"], "Xtestout", "a")',
+ \ 'split',
+ \ 'new',
+ \ 'qall',
+ \ ]
+ if RunVim([], after, '')
+ call assert_equal(['QuitPre', 'ExitPre'], readfile('Xtestout'))
+ endif
+ call delete('Xtestout')
+
+ let after = [
+ \ 'au QuitPre * call writefile(["QuitPre"], "Xtestout", "a")',
+ \ 'au ExitPre * call writefile(["ExitPre"], "Xtestout", "a")',
+ \ 'augroup nasty',
+ \ ' au ExitPre * split',
+ \ 'augroup END',
+ \ 'quit',
+ \ 'augroup nasty',
+ \ ' au! ExitPre',
+ \ 'augroup END',
+ \ 'quit',
+ \ ]
+ if RunVim([], after, '')
+ call assert_equal(['QuitPre', 'ExitPre', 'QuitPre', 'ExitPre'],
+ \ readfile('Xtestout'))
+ endif
+ call delete('Xtestout')
+endfunc
diff --git a/src/nvim/testdir/test_expr.vim b/src/nvim/testdir/test_expr.vim
new file mode 100644
index 0000000000..4f99625e73
--- /dev/null
+++ b/src/nvim/testdir/test_expr.vim
@@ -0,0 +1,480 @@
+" Tests for expressions.
+
+func Test_equal()
+ let base = {}
+ func base.method()
+ return 1
+ endfunc
+ func base.other() dict
+ return 1
+ endfunc
+ let instance = copy(base)
+ call assert_true(base.method == instance.method)
+ call assert_true([base.method] == [instance.method])
+ call assert_true(base.other == instance.other)
+ call assert_true([base.other] == [instance.other])
+
+ call assert_false(base.method == base.other)
+ call assert_false([base.method] == [base.other])
+ call assert_false(base.method == instance.other)
+ call assert_false([base.method] == [instance.other])
+
+ call assert_fails('echo base.method > instance.method')
+endfunc
+
+func Test_version()
+ call assert_true(has('patch-7.4.001'))
+ call assert_true(has('patch-7.4.01'))
+ call assert_true(has('patch-7.4.1'))
+ call assert_true(has('patch-6.9.999'))
+ call assert_true(has('patch-7.1.999'))
+ call assert_true(has('patch-7.4.123'))
+
+ call assert_false(has('patch-7'))
+ call assert_false(has('patch-7.4'))
+ call assert_false(has('patch-7.4.'))
+ call assert_false(has('patch-9.1.0'))
+ call assert_false(has('patch-9.9.1'))
+endfunc
+
+func Test_dict()
+ let d = {'': 'empty', 'a': 'a', 0: 'zero'}
+ call assert_equal('empty', d[''])
+ call assert_equal('a', d['a'])
+ call assert_equal('zero', d[0])
+ call assert_true(has_key(d, ''))
+ call assert_true(has_key(d, 'a'))
+
+ let d[''] = 'none'
+ let d['a'] = 'aaa'
+ call assert_equal('none', d[''])
+ call assert_equal('aaa', d['a'])
+endfunc
+
+func Test_strgetchar()
+ call assert_equal(char2nr('a'), strgetchar('axb', 0))
+ call assert_equal(char2nr('x'), strgetchar('axb', 1))
+ call assert_equal(char2nr('b'), strgetchar('axb', 2))
+
+ call assert_equal(-1, strgetchar('axb', -1))
+ call assert_equal(-1, strgetchar('axb', 3))
+ call assert_equal(-1, strgetchar('', 0))
+endfunc
+
+func Test_strcharpart()
+ call assert_equal('a', strcharpart('axb', 0, 1))
+ call assert_equal('x', strcharpart('axb', 1, 1))
+ call assert_equal('b', strcharpart('axb', 2, 1))
+ call assert_equal('xb', strcharpart('axb', 1))
+
+ call assert_equal('', strcharpart('axb', 1, 0))
+ call assert_equal('', strcharpart('axb', 1, -1))
+ call assert_equal('', strcharpart('axb', -1, 1))
+ call assert_equal('', strcharpart('axb', -2, 2))
+
+ call assert_equal('a', strcharpart('axb', -1, 2))
+endfunc
+
+func Test_loop_over_null_list()
+ let null_list = submatch(1, 1)
+ for i in null_list
+ call assert_report('should not get here')
+ endfor
+endfunc
+
+func Test_compare_null_dict()
+ call assert_fails('let x = v:_null_dict[10]')
+ call assert_equal({}, {})
+ call assert_equal(v:_null_dict, v:_null_dict)
+ call assert_notequal({}, v:_null_dict)
+endfunc
+
+func Test_set_reg_null_list()
+ call setreg('x', v:_null_list)
+endfunc
+
+func Test_special_char()
+ " The failure is only visible using valgrind.
+ call assert_fails('echo "\<C-">')
+endfunc
+
+func Test_option_value()
+ " boolean
+ set bri
+ call assert_equal(1, &bri)
+ set nobri
+ call assert_equal(0, &bri)
+
+ " number
+ set ts=1
+ call assert_equal(1, &ts)
+ set ts=8
+ call assert_equal(8, &ts)
+
+ " string
+ exe "set cedit=\<Esc>"
+ call assert_equal("\<Esc>", &cedit)
+ set cpo=
+ call assert_equal("", &cpo)
+ set cpo=abcdefi
+ call assert_equal("abcdefi", &cpo)
+ set cpo&vim
+endfunc
+
+function Test_printf_64bit()
+ if has('num64')
+ call assert_equal("123456789012345", printf('%d', 123456789012345))
+ endif
+endfunc
+
+func Test_setmatches()
+ hi def link 1 Comment
+ hi def link 2 PreProc
+ let set = [{"group": 1, "pattern": 2, "id": 3, "priority": 4}]
+ let exp = [{"group": '1', "pattern": '2', "id": 3, "priority": 4}]
+ if has('conceal')
+ let set[0]['conceal'] = 5
+ let exp[0]['conceal'] = '5'
+ endif
+ call setmatches(set)
+ call assert_equal(exp, getmatches())
+endfunc
+
+function Test_printf_spec_s()
+ " number
+ call assert_equal("1234567890", printf('%s', 1234567890))
+
+ " string
+ call assert_equal("abcdefgi", printf('%s', "abcdefgi"))
+
+ " float
+ call assert_equal("1.23", printf('%s', 1.23))
+
+ " list
+ let value = [1, 'two', ['three', 4]]
+ call assert_equal(string(value), printf('%s', value))
+
+ " dict
+ let value = {'key1' : 'value1', 'key2' : ['list', 'value'], 'key3' : {'dict' : 'value'}}
+ call assert_equal(string(value), printf('%s', value))
+
+ " funcref
+ call assert_equal('printf', printf('%s', function('printf')))
+
+ " partial
+ call assert_equal(string(function('printf', ['%s'])), printf('%s', function('printf', ['%s'])))
+endfunc
+
+function Test_printf_misc()
+ call assert_equal('123', printf('123'))
+ call assert_fails("call printf('123', 3)", "E767:")
+
+ call assert_equal('123', printf('%d', 123))
+ call assert_equal('123', printf('%i', 123))
+ call assert_equal('123', printf('%D', 123))
+ call assert_equal('123', printf('%U', 123))
+ call assert_equal('173', printf('%o', 123))
+ call assert_equal('173', printf('%O', 123))
+ call assert_equal('7b', printf('%x', 123))
+ call assert_equal('7B', printf('%X', 123))
+
+ call assert_equal('123', printf('%hd', 123))
+ call assert_equal('-123', printf('%hd', -123))
+ call assert_equal('-1', printf('%hd', 0xFFFF))
+ call assert_equal('-1', printf('%hd', 0x1FFFFF))
+
+ call assert_equal('123', printf('%hu', 123))
+ call assert_equal('65413', printf('%hu', -123))
+ call assert_equal('65535', printf('%hu', 0xFFFF))
+ call assert_equal('65535', printf('%hu', 0x1FFFFF))
+
+ call assert_equal('123', printf('%ld', 123))
+ call assert_equal('-123', printf('%ld', -123))
+ call assert_equal('65535', printf('%ld', 0xFFFF))
+ call assert_equal('131071', printf('%ld', 0x1FFFF))
+
+ call assert_equal('{', printf('%c', 123))
+ call assert_equal('abc', printf('%s', 'abc'))
+ call assert_equal('abc', printf('%S', 'abc'))
+
+ call assert_equal('+123', printf('%+d', 123))
+ call assert_equal('-123', printf('%+d', -123))
+ call assert_equal('+123', printf('%+ d', 123))
+ call assert_equal(' 123', printf('% d', 123))
+ call assert_equal(' 123', printf('% d', 123))
+ call assert_equal('-123', printf('% d', -123))
+
+ call assert_equal('123', printf('%2d', 123))
+ call assert_equal(' 123', printf('%6d', 123))
+ call assert_equal('000123', printf('%06d', 123))
+ call assert_equal('+00123', printf('%+06d', 123))
+ call assert_equal(' 00123', printf('% 06d', 123))
+ call assert_equal(' +123', printf('%+6d', 123))
+ call assert_equal(' 123', printf('% 6d', 123))
+ call assert_equal(' -123', printf('% 6d', -123))
+
+ " Test left adjusted.
+ call assert_equal('123 ', printf('%-6d', 123))
+ call assert_equal('+123 ', printf('%-+6d', 123))
+ call assert_equal(' 123 ', printf('%- 6d', 123))
+ call assert_equal('-123 ', printf('%- 6d', -123))
+
+ call assert_equal(' 00123', printf('%7.5d', 123))
+ call assert_equal(' -00123', printf('%7.5d', -123))
+ call assert_equal(' +00123', printf('%+7.5d', 123))
+ " Precision field should not be used when combined with %0
+ call assert_equal(' 00123', printf('%07.5d', 123))
+ call assert_equal(' -00123', printf('%07.5d', -123))
+
+ call assert_equal(' 123', printf('%*d', 5, 123))
+ call assert_equal('123 ', printf('%*d', -5, 123))
+ call assert_equal('00123', printf('%.*d', 5, 123))
+ call assert_equal(' 123', printf('% *d', 5, 123))
+ call assert_equal(' +123', printf('%+ *d', 5, 123))
+
+ call assert_equal('foobar', printf('%.*s', 9, 'foobar'))
+ call assert_equal('foo', printf('%.*s', 3, 'foobar'))
+ call assert_equal('', printf('%.*s', 0, 'foobar'))
+ call assert_equal('foobar', printf('%.*s', -1, 'foobar'))
+
+ " Simple quote (thousand grouping char) is ignored.
+ call assert_equal('+00123456', printf("%+'09d", 123456))
+
+ " Unrecognized format specifier kept as-is.
+ call assert_equal('_123', printf("%_%d", 123))
+
+ " Test alternate forms.
+ call assert_equal('0x7b', printf('%#x', 123))
+ call assert_equal('0X7B', printf('%#X', 123))
+ call assert_equal('0173', printf('%#o', 123))
+ call assert_equal('0173', printf('%#O', 123))
+ call assert_equal('abc', printf('%#s', 'abc'))
+ call assert_equal('abc', printf('%#S', 'abc'))
+ call assert_equal(' 0173', printf('%#6o', 123))
+ call assert_equal(' 00173', printf('%#6.5o', 123))
+ call assert_equal(' 0173', printf('%#6.2o', 123))
+ call assert_equal(' 0173', printf('%#6.2o', 123))
+ call assert_equal('0173', printf('%#2.2o', 123))
+
+ call assert_equal(' 00123', printf('%6.5d', 123))
+ call assert_equal(' 0007b', printf('%6.5x', 123))
+
+ call assert_equal('123', printf('%.2d', 123))
+ call assert_equal('0123', printf('%.4d', 123))
+ call assert_equal('0000000123', printf('%.10d', 123))
+ call assert_equal('123', printf('%.0d', 123))
+
+ call assert_equal('abc', printf('%2s', 'abc'))
+ call assert_equal('abc', printf('%2S', 'abc'))
+ call assert_equal('abc', printf('%.4s', 'abc'))
+ call assert_equal('abc', printf('%.4S', 'abc'))
+ call assert_equal('ab', printf('%.2s', 'abc'))
+ call assert_equal('ab', printf('%.2S', 'abc'))
+ call assert_equal('', printf('%.0s', 'abc'))
+ call assert_equal('', printf('%.s', 'abc'))
+ call assert_equal(' abc', printf('%4s', 'abc'))
+ call assert_equal(' abc', printf('%4S', 'abc'))
+ call assert_equal('0abc', printf('%04s', 'abc'))
+ call assert_equal('0abc', printf('%04S', 'abc'))
+ call assert_equal('abc ', printf('%-4s', 'abc'))
+ call assert_equal('abc ', printf('%-4S', 'abc'))
+
+ call assert_equal('1%', printf('%d%%', 1))
+endfunc
+
+function Test_printf_float()
+ call assert_equal('1.000000', printf('%f', 1))
+ call assert_equal('1.230000', printf('%f', 1.23))
+ call assert_equal('1.230000', printf('%F', 1.23))
+ call assert_equal('9999999.9', printf('%g', 9999999.9))
+ call assert_equal('9999999.9', printf('%G', 9999999.9))
+ call assert_equal('1.00000001e7', printf('%.8g', 10000000.1))
+ call assert_equal('1.00000001E7', printf('%.8G', 10000000.1))
+ call assert_equal('1.230000e+00', printf('%e', 1.23))
+ call assert_equal('1.230000E+00', printf('%E', 1.23))
+ call assert_equal('1.200000e-02', printf('%e', 0.012))
+ call assert_equal('-1.200000e-02', printf('%e', -0.012))
+ call assert_equal('0.33', printf('%.2f', 1.0/3.0))
+ call assert_equal(' 0.33', printf('%6.2f', 1.0/3.0))
+ call assert_equal(' -0.33', printf('%6.2f', -1.0/3.0))
+ call assert_equal('000.33', printf('%06.2f', 1.0/3.0))
+ call assert_equal('-00.33', printf('%06.2f', -1.0/3.0))
+ call assert_equal('-00.33', printf('%+06.2f', -1.0/3.0))
+ call assert_equal('+00.33', printf('%+06.2f', 1.0/3.0))
+ call assert_equal(' 00.33', printf('% 06.2f', 1.0/3.0))
+ call assert_equal('000.33', printf('%06.2g', 1.0/3.0))
+ call assert_equal('-00.33', printf('%06.2g', -1.0/3.0))
+ call assert_equal('0.33', printf('%3.2f', 1.0/3.0))
+ call assert_equal('003.33e-01', printf('%010.2e', 1.0/3.0))
+ call assert_equal(' 03.33e-01', printf('% 010.2e', 1.0/3.0))
+ call assert_equal('+03.33e-01', printf('%+010.2e', 1.0/3.0))
+ call assert_equal('-03.33e-01', printf('%010.2e', -1.0/3.0))
+
+ " When precision is 0, the dot should be omitted.
+ call assert_equal(' 2', printf('%3.f', 7.0/3.0))
+ call assert_equal(' 2', printf('%3.g', 7.0/3.0))
+ call assert_equal(' 2e+00', printf('%7.e', 7.0/3.0))
+
+ " Float zero can be signed.
+ call assert_equal('+0.000000', printf('%+f', 0.0))
+ call assert_equal('0.000000', printf('%f', 1.0/(1.0/0.0)))
+ call assert_equal('-0.000000', printf('%f', 1.0/(-1.0/0.0)))
+ call assert_equal('0.0', printf('%s', 1.0/(1.0/0.0)))
+ call assert_equal('-0.0', printf('%s', 1.0/(-1.0/0.0)))
+ call assert_equal('0.0', printf('%S', 1.0/(1.0/0.0)))
+ call assert_equal('-0.0', printf('%S', 1.0/(-1.0/0.0)))
+
+ " Float infinity can be signed.
+ call assert_equal('inf', printf('%f', 1.0/0.0))
+ call assert_equal('-inf', printf('%f', -1.0/0.0))
+ call assert_equal('inf', printf('%g', 1.0/0.0))
+ call assert_equal('-inf', printf('%g', -1.0/0.0))
+ call assert_equal('inf', printf('%e', 1.0/0.0))
+ call assert_equal('-inf', printf('%e', -1.0/0.0))
+ call assert_equal('INF', printf('%F', 1.0/0.0))
+ call assert_equal('-INF', printf('%F', -1.0/0.0))
+ call assert_equal('INF', printf('%E', 1.0/0.0))
+ call assert_equal('-INF', printf('%E', -1.0/0.0))
+ call assert_equal('INF', printf('%E', 1.0/0.0))
+ call assert_equal('-INF', printf('%G', -1.0/0.0))
+ call assert_equal('+inf', printf('%+f', 1.0/0.0))
+ call assert_equal('-inf', printf('%+f', -1.0/0.0))
+ call assert_equal(' inf', printf('% f', 1.0/0.0))
+ call assert_equal(' inf', printf('%6f', 1.0/0.0))
+ call assert_equal(' -inf', printf('%6f', -1.0/0.0))
+ call assert_equal(' inf', printf('%6g', 1.0/0.0))
+ call assert_equal(' -inf', printf('%6g', -1.0/0.0))
+ call assert_equal(' +inf', printf('%+6f', 1.0/0.0))
+ call assert_equal(' inf', printf('% 6f', 1.0/0.0))
+ call assert_equal(' +inf', printf('%+06f', 1.0/0.0))
+ call assert_equal('inf ', printf('%-6f', 1.0/0.0))
+ call assert_equal('-inf ', printf('%-6f', -1.0/0.0))
+ call assert_equal('+inf ', printf('%-+6f', 1.0/0.0))
+ call assert_equal(' inf ', printf('%- 6f', 1.0/0.0))
+ call assert_equal('-INF ', printf('%-6F', -1.0/0.0))
+ call assert_equal('+INF ', printf('%-+6F', 1.0/0.0))
+ call assert_equal(' INF ', printf('%- 6F', 1.0/0.0))
+ call assert_equal('INF ', printf('%-6G', 1.0/0.0))
+ call assert_equal('-INF ', printf('%-6G', -1.0/0.0))
+ call assert_equal('INF ', printf('%-6E', 1.0/0.0))
+ call assert_equal('-INF ', printf('%-6E', -1.0/0.0))
+ call assert_equal("str2float('inf')", printf('%s', 1.0/0.0))
+ call assert_equal("-str2float('inf')", printf('%s', -1.0/0.0))
+
+ " Test special case where max precision is truncated at 340.
+ call assert_equal('1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', printf('%.330f', 1.0))
+ call assert_equal('1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', printf('%.340f', 1.0))
+ call assert_equal('1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', printf('%.350f', 1.0))
+
+ " Float nan (not a number) has no sign.
+ call assert_equal('nan', printf('%f', sqrt(-1.0)))
+ call assert_equal('nan', printf('%f', 0.0/0.0))
+ call assert_equal('nan', printf('%f', -0.0/0.0))
+ call assert_equal('nan', printf('%g', 0.0/0.0))
+ call assert_equal('nan', printf('%e', 0.0/0.0))
+ call assert_equal('NAN', printf('%F', 0.0/0.0))
+ call assert_equal('NAN', printf('%G', 0.0/0.0))
+ call assert_equal('NAN', printf('%E', 0.0/0.0))
+ call assert_equal('NAN', printf('%F', -0.0/0.0))
+ call assert_equal('NAN', printf('%G', -0.0/0.0))
+ call assert_equal('NAN', printf('%E', -0.0/0.0))
+ call assert_equal(' nan', printf('%6f', 0.0/0.0))
+ call assert_equal(' nan', printf('%06f', 0.0/0.0))
+ call assert_equal('nan ', printf('%-6f', 0.0/0.0))
+ call assert_equal('nan ', printf('%- 6f', 0.0/0.0))
+ call assert_equal("str2float('nan')", printf('%s', 0.0/0.0))
+ call assert_equal("str2float('nan')", printf('%s', -0.0/0.0))
+ call assert_equal("str2float('nan')", printf('%S', 0.0/0.0))
+ call assert_equal("str2float('nan')", printf('%S', -0.0/0.0))
+
+ call assert_fails('echo printf("%f", "a")', 'E807:')
+endfunc
+
+function Test_printf_errors()
+ call assert_fails('echo printf("%d", {})', 'E728:')
+ call assert_fails('echo printf("%d", [])', 'E745:')
+ call assert_fails('echo printf("%d", 1, 2)', 'E767:')
+ call assert_fails('echo printf("%*d", 1)', 'E766:')
+ call assert_fails('echo printf("%d", 1.2)', 'E805:')
+endfunc
+
+function Test_max_min_errors()
+ call assert_fails('call max(v:true)', 'E712:')
+ call assert_fails('call max(v:true)', 'max()')
+ call assert_fails('call min(v:true)', 'E712:')
+ call assert_fails('call min(v:true)', 'min()')
+endfunc
+
+func Test_substitute_expr()
+ let g:val = 'XXX'
+ call assert_equal('XXX', substitute('yyy', 'y*', '\=g:val', ''))
+ call assert_equal('XXX', substitute('yyy', 'y*', {-> g:val}, ''))
+ call assert_equal("-\u1b \uf2-", substitute("-%1b %f2-", '%\(\x\x\)',
+ \ '\=nr2char("0x" . submatch(1))', 'g'))
+ call assert_equal("-\u1b \uf2-", substitute("-%1b %f2-", '%\(\x\x\)',
+ \ {-> nr2char("0x" . submatch(1))}, 'g'))
+
+ call assert_equal('231', substitute('123', '\(.\)\(.\)\(.\)',
+ \ {-> submatch(2) . submatch(3) . submatch(1)}, ''))
+
+ func Recurse()
+ return substitute('yyy', 'y\(.\)y', {-> submatch(1)}, '')
+ endfunc
+ " recursive call works
+ call assert_equal('-y-x-', substitute('xxx', 'x\(.\)x', {-> '-' . Recurse() . '-' . submatch(1) . '-'}, ''))
+endfunc
+
+func Test_invalid_submatch()
+ " This was causing invalid memory access in Vim-7.4.2232 and older
+ call assert_fails("call substitute('x', '.', {-> submatch(10)}, '')", 'E935:')
+endfunc
+
+func Test_substitute_expr_arg()
+ call assert_equal('123456789-123456789=', substitute('123456789',
+ \ '\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)',
+ \ {m -> m[0] . '-' . m[1] . m[2] . m[3] . m[4] . m[5] . m[6] . m[7] . m[8] . m[9] . '='}, ''))
+
+ call assert_equal('123456-123456=789', substitute('123456789',
+ \ '\(.\)\(.\)\(.\)\(a*\)\(n*\)\(.\)\(.\)\(.\)\(x*\)',
+ \ {m -> m[0] . '-' . m[1] . m[2] . m[3] . m[4] . m[5] . m[6] . m[7] . m[8] . m[9] . '='}, ''))
+
+ call assert_equal('123456789-123456789x=', substitute('123456789',
+ \ '\(.\)\(.\)\(.*\)',
+ \ {m -> m[0] . '-' . m[1] . m[2] . m[3] . 'x' . m[4] . m[5] . m[6] . m[7] . m[8] . m[9] . '='}, ''))
+
+ call assert_fails("call substitute('xxx', '.', {m -> string(add(m, 'x'))}, '')", 'E742:')
+ call assert_fails("call substitute('xxx', '.', {m -> string(insert(m, 'x'))}, '')", 'E742:')
+ call assert_fails("call substitute('xxx', '.', {m -> string(extend(m, ['x']))}, '')", 'E742:')
+ call assert_fails("call substitute('xxx', '.', {m -> string(remove(m, 1))}, '')", 'E742:')
+endfunc
+
+func Test_function_with_funcref()
+ let s:f = function('type')
+ let s:fref = function(s:f)
+ call assert_equal(v:t_string, s:fref('x'))
+ call assert_fails("call function('s:f')", 'E700:')
+
+ call assert_fails("call function('foo()')", 'E475:')
+ call assert_fails("call function('foo()')", 'foo()')
+endfunc
+
+func Test_funcref()
+ func! One()
+ return 1
+ endfunc
+ let OneByName = function('One')
+ let OneByRef = funcref('One')
+ func! One()
+ return 2
+ endfunc
+ call assert_equal(2, OneByName())
+ call assert_equal(1, OneByRef())
+ let OneByRef = funcref('One')
+ call assert_equal(2, OneByRef())
+ call assert_fails('echo funcref("{")', 'E475:')
+endfunc
+
+func Test_empty_concatenate()
+ call assert_equal('b', 'a'[4:0] . 'b')
+ call assert_equal('b', 'b' . 'a'[4:0])
+endfunc
diff --git a/src/nvim/testdir/test_expr_utf8.vim b/src/nvim/testdir/test_expr_utf8.vim
new file mode 100644
index 0000000000..1737a9f745
--- /dev/null
+++ b/src/nvim/testdir/test_expr_utf8.vim
@@ -0,0 +1,37 @@
+" Tests for expressions using utf-8.
+if !has('multi_byte')
+ finish
+endif
+
+func Test_strgetchar()
+ call assert_equal(char2nr('รก'), strgetchar('รกxb', 0))
+ call assert_equal(char2nr('x'), strgetchar('รกxb', 1))
+
+ call assert_equal(char2nr('a'), strgetchar('aฬ€xb', 0))
+ call assert_equal(char2nr('ฬ€'), strgetchar('aฬ€xb', 1))
+ call assert_equal(char2nr('x'), strgetchar('aฬ€xb', 2))
+
+ call assert_equal(char2nr('ใ‚'), strgetchar('ใ‚aใ„', 0))
+ call assert_equal(char2nr('a'), strgetchar('ใ‚aใ„', 1))
+ call assert_equal(char2nr('ใ„'), strgetchar('ใ‚aใ„', 2))
+endfunc
+
+func Test_strcharpart()
+ call assert_equal('รกxb', strcharpart('รกxb', 0))
+ call assert_equal('รก', strcharpart('รกxb', 0, 1))
+ call assert_equal('x', strcharpart('รกxb', 1, 1))
+
+ call assert_equal('ใ„ใ†eใŠ', strcharpart('ใ‚ใ„ใ†eใŠ', 1))
+ call assert_equal('ใ„', strcharpart('ใ‚ใ„ใ†eใŠ', 1, 1))
+ call assert_equal('ใ„ใ†', strcharpart('ใ‚ใ„ใ†eใŠ', 1, 2))
+ call assert_equal('ใ„ใ†e', strcharpart('ใ‚ใ„ใ†eใŠ', 1, 3))
+ call assert_equal('ใ„ใ†eใŠ', strcharpart('ใ‚ใ„ใ†eใŠ', 1, 4))
+ call assert_equal('eใŠ', strcharpart('ใ‚ใ„ใ†eใŠ', 3))
+ call assert_equal('e', strcharpart('ใ‚ใ„ใ†eใŠ', 3, 1))
+
+ call assert_equal('ใ‚', strcharpart('ใ‚ใ„ใ†eใŠ', -3, 4))
+
+ call assert_equal('a', strcharpart('aฬ€xb', 0, 1))
+ call assert_equal('ฬ€', strcharpart('aฬ€xb', 1, 1))
+ call assert_equal('x', strcharpart('aฬ€xb', 2, 1))
+endfunc
diff --git a/src/nvim/testdir/test_farsi.vim b/src/nvim/testdir/test_farsi.vim
new file mode 100644
index 0000000000..9ff2653af4
--- /dev/null
+++ b/src/nvim/testdir/test_farsi.vim
@@ -0,0 +1,133 @@
+" Simplistic testing of Farsi mode.
+" Note: must be edited with latin1 encoding.
+
+if !has('farsi') || has('nvim') " Not supported in Nvim. #6192
+ finish
+endif
+" Farsi uses a single byte encoding.
+set enc=latin1
+
+func Test_farsi_toggle()
+ new
+
+ set altkeymap
+ call assert_equal(0, &fkmap)
+ call assert_equal(0, &rl)
+ call feedkeys("\<F8>", 'x')
+ call assert_equal(1, &fkmap)
+ call assert_equal(1, &rl)
+ call feedkeys("\<F8>", 'x')
+ call assert_equal(0, &fkmap)
+ call assert_equal(0, &rl)
+
+ set rl
+ " conversion from Farsi 3342 to Farsi VIM.
+ call setline(1, join(map(range(0x80, 0xff), 'nr2char(v:val)'), ''))
+ call feedkeys("\<F9>", 'x')
+ let exp = [0xfc, 0xf8, 0xc1, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+ \ 0xc8, 0xc9, 0xca, 0xd0, 0xd1, 0xd2, 0xd3, 0xd6,
+ \ 0xd6, 0xd6, 0xd7, 0xd7, 0xd7, 0xd8, 0xd9, 0xda,
+ \ 0xdb, 0xdc, 0xdc, 0xc1, 0xdd, 0xde, 0xe0, 0xe0,
+ \ 0xe1, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6,
+ \ 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae,
+ \ 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
+ \ 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe,
+ \ 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6,
+ \ 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce,
+ \ 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
+ \ 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde,
+ \ 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6,
+ \ 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xfb, 0xfb, 0xfe,
+ \ 0xfe, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6,
+ \ 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xe1,
+ \ ]
+ call assert_equal(join(map(exp, 'nr2char(v:val)'), ''), getline(1))
+
+ " conversion from Farsi VIM to Farsi 3342.
+ call setline(1, join(map(range(0x80, 0xff), 'nr2char(v:val)'), ''))
+ call feedkeys("\<F9>", 'x')
+ let exp = [0xfc, 0xf8, 0xc1, 0x83, 0x84, 0x85, 0x86, 0x87,
+ \ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x90,
+ \ 0x90, 0x90, 0x92, 0x93, 0x93, 0x95, 0x96, 0x97,
+ \ 0x98, 0xdc, 0x9a, 0x9b, 0x9c, 0x9e, 0x9e, 0xff,
+ \ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+ \ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+ \ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+ \ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+ \ 0xc0, 0xc1, 0xc2, 0x83, 0x84, 0x85, 0x86, 0x87,
+ \ 0x88, 0x89, 0x8a, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
+ \ 0x8b, 0x8c, 0x8d, 0x8e, 0xd4, 0xd5, 0x90, 0x93,
+ \ 0x95, 0x96, 0x97, 0x98, 0x99, 0x9b, 0x9c, 0xdf,
+ \ 0x9d, 0xff, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+ \ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xec, 0xee, 0xef,
+ \ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+ \ 0xf8, 0xf9, 0xfa, 0xec, 0x80, 0xfd, 0xee, 0xff,
+ \ ]
+ call assert_equal(join(map(exp, 'nr2char(v:val)'), ''), getline(1))
+
+ bwipe!
+endfunc
+
+func Test_farsi_map()
+ new
+
+ set altkeymap
+ set rl
+ " RHS of mapping is reversed.
+ imap xyz abc
+ call feedkeys("axyz\<Esc>", 'tx')
+ call assert_equal('cba', getline(1))
+
+ set norl
+ iunmap xyz
+ set noaltkeymap
+ bwipe!
+endfunc
+
+func Test_input_farsi()
+ new
+ setlocal rightleft fkmap
+ " numbers switch input direction
+ call feedkeys("aabc0123456789.+-^%#=xyz\<Esc>", 'tx')
+ call assert_equal("\x8cฬฮฝฎฅชญซฆนธทถตดณฒฑฐิ\x93ี", getline('.'))
+
+ " all non-number special chars with spaces
+ call feedkeys("oB E F H I K L M O P Q R T U W Y ` ! @ # $ % ^ & * () - _ = + \\ | : \" . / < > ? \<Esc>", 'tx')
+ call assert_equal("ก ๔ ๚ ภ ๖ ๆ ็ ย [ ] ๗ ๓ ๒ ๐ ๕ ๑ ข ฃ  ง ฎ ค ฅ ช ฌ ่ จฉ ญ ้ ฝ ซ ๋ ๊ บ ป ฆ  ฏ พ ผ ฟ ", getline('.'))
+
+ " all non-number special chars without spaces
+ call feedkeys("oBEFHIKLMOPQRTUWY`!@#$%^&*()-_=+\\|:\"./<>?\<Esc>",'tx')
+ call assert_equal("ก๔๚ภ๖ๆ็ย[]๗๓๒๐๕๑ขฃงฎคฅชฌ่จฉญ้ฝซ๋๊บปฆฏพผฟ", getline('.'))
+
+ " all letter chars with spaces
+ call feedkeys("oa A b c C d D e f g G h i j J k l m n N o p q r s S t u v V w x X y z Z ; \ , [ ] \<Esc>", 'tx')
+ call assert_equal("ั ๙ ฬ ฮ ฯ แ  ฦ ร  ๘ ม เ ล    ฤ ห ห ส ษ ำ ู ะ ๛ ุ ึ อ อ า ิ ิ ื ี  ฺ  ฿ ว ศ ", getline('.'))
+
+ " all letter chars without spaces
+ call feedkeys("oaAbcCdDefgGhijJklmnNopqrsStuvVwxXyzZ;\,[]\<Esc>", 'tx')
+ call assert_equal("\x8c๙ฬฮฯ\x9f๎\x86\x83๘ม\x9d\x85\x80\x9c\x9b\x84หห\x8a\x89\x8e\x96\x8b์\x95\x90ออ\x8dิิ\x93ี\x97฿\x87\x88", getline('.'))
+
+ bwipe!
+endfunc
+
+func Test_command_line_farsi()
+ set allowrevins altkeymap
+
+ " letter characters with spaces
+ call feedkeys(":\"\<C-_>a A b c C d D e f g G h i j J k l m n N o p q r s S t u v V w x X y z Z ; \\ , [ ]\<CR>", 'tx')
+ call assert_equal("\"\x88 ว ฿ ๋ ฺ ี ี ื ิ ิ า อ อ ึ ุ ๛ ะ ู ำ ษ ส ห ห ฤ    ล เ ม ๘  ร ฦ  แ ฯ ฮ ฬ ๙ ั", getreg(':'))
+
+ " letter characters without spaces
+ call feedkeys(":\"\<C-_>aAbcCdDefgGhijJklmnNopqrsStuvVwxXyzZ;\\,[]\<CR>", 'tx')
+ call assert_equal("\"\x88\x87฿ฺ๋ีี\x93ิิ\x8dออ\x90\x95์\x8b\x96\x8e\x89\x8aหห\x84\x9b\x9c\x80\x85\x9dม๘\x83\x86๎\x9fฯฮฬ๙\x8c", getreg(':'))
+
+ " other characters with spaces
+ call feedkeys(":\"\<C-_>0 1 2 3 4 5 6 7 8 9 ` . ! \" $ % ^ & / () = \\ ? + - _ * : # ~ @ < > { } | B E F H I K L M O P Q R T U W Y\<CR>", 'tx')
+ call assert_equal("\"๑ ๕ ๐ ๒ ๓ ๗ ] [ ย ็ ๆ ๖ ภ ๚ ๔ ก ๊ } { ผ พ ง ~ ฎ บ ่ ้ ญ ซ  ฟ ๋ ฝ ฉจ ฏ ฌ ช ฅ ค ป  ฃ  ฆ ข น ธ ท ถ ต ด ณ ฒ ฑ ฐ", getreg(':'))
+
+ " other characters without spaces
+ call feedkeys(":\"\<C-_>0123456789`.!\"$%^&/()=\\?+-_*:#~@<>{}|BEFHIKLMOPQRTUWY\<CR>", 'tx')
+ call assert_equal("\"๑๕๐๒๓๗][ย็ๆ๖ภ๚๔ก๊}{ผพง~ฎบ่้ญซฟ๋ฝฉจฏฌชฅคปฃฆขนธทถตดณฒฑฐ", getreg(':'))
+
+ set noallowrevins noaltkeymap
+endfunc
diff --git a/src/nvim/testdir/test_feedkeys.vim b/src/nvim/testdir/test_feedkeys.vim
new file mode 100644
index 0000000000..70500f2bb5
--- /dev/null
+++ b/src/nvim/testdir/test_feedkeys.vim
@@ -0,0 +1,14 @@
+" Test feedkeys() function.
+
+func Test_feedkeys_x_with_empty_string()
+ new
+ call feedkeys("ifoo\<Esc>")
+ call assert_equal('', getline('.'))
+ call feedkeys('', 'x')
+ call assert_equal('foo', getline('.'))
+
+ " check it goes back to normal mode immediately.
+ call feedkeys('i', 'x')
+ call assert_equal('foo', getline('.'))
+ quit!
+endfunc
diff --git a/src/nvim/testdir/test_file_size.vim b/src/nvim/testdir/test_file_size.vim
new file mode 100644
index 0000000000..3e78a7b23c
--- /dev/null
+++ b/src/nvim/testdir/test_file_size.vim
@@ -0,0 +1,58 @@
+" Inserts 2 million lines with consecutive integers starting from 1
+" (essentially, the output of GNU's seq 1 2000000), writes them to Xtest
+" and writes its cksum to test.out.
+"
+" We need 2 million lines to trigger a call to mf_hash_grow(). If it would mess
+" up the lines the checksum would differ.
+"
+" cksum is part of POSIX and so should be available on most Unixes.
+" If it isn't available then the test will be skipped.
+func Test_File_Size()
+ if !executable('cksum')
+ return
+ endif
+
+ new
+ set fileformat=unix undolevels=-1
+ for i in range(1, 2000000, 100)
+ call append(i, range(i, i + 99))
+ endfor
+
+ 1delete
+ w! Xtest
+ let res = systemlist('cksum Xtest')[0]
+ let res = substitute(res, "\r", "", "")
+ call assert_equal('3678979763 14888896 Xtest', res)
+
+ enew!
+ call delete('Xtest')
+ set fileformat& undolevels&
+endfunc
+
+" Test for writing and reading a file of over 100 Kbyte
+func Test_File_Read_Write()
+ enew!
+
+ " Create a file with the following contents
+ " 1 line: "This is the start"
+ " 3001 lines: "This is the leader"
+ " 1 line: "This is the middle"
+ " 3001 lines: "This is the trailer"
+ " 1 line: "This is the end"
+ call append(0, "This is the start")
+ call append(1, repeat(["This is the leader"], 3001))
+ call append(3002, "This is the middle")
+ call append(3003, repeat(["This is the trailer"], 3001))
+ call append(6004, "This is the end")
+
+ write! Xtest
+ enew!
+ edit! Xtest
+
+ call assert_equal("This is the start", getline(1))
+ call assert_equal("This is the middle", getline(3003))
+ call assert_equal("This is the end", getline(6005))
+
+ enew!
+ call delete("Xtest")
+endfunc
diff --git a/src/nvim/testdir/test_fileformat.vim b/src/nvim/testdir/test_fileformat.vim
new file mode 100644
index 0000000000..8dc25f62b1
--- /dev/null
+++ b/src/nvim/testdir/test_fileformat.vim
@@ -0,0 +1,33 @@
+" Test behavior of fileformat after bwipeout of last buffer
+
+func Test_fileformat_after_bw()
+ bwipeout
+ set fileformat&
+ if &fileformat == 'dos'
+ let test_fileformats = 'unix'
+ elseif &fileformat == 'unix'
+ let test_fileformats = 'mac'
+ else " must be mac
+ let test_fileformats = 'dos'
+ endif
+ exec 'set fileformats='.test_fileformats
+ bwipeout!
+ call assert_equal(test_fileformats, &fileformat)
+ set fileformats&
+endfunc
+
+func Test_fileformat_autocommand()
+ let filecnt = ["", "foobar\<CR>", "eins\<CR>", "\<CR>", "zwei\<CR>", "drei", "vier", "fรผnf", ""]
+ let ffs = &ffs
+ call writefile(filecnt, 'Xfile', 'b')
+ au BufReadPre Xfile set ffs=dos ff=dos
+ new Xfile
+ call assert_equal('dos', &l:ff)
+ call assert_equal('dos', &ffs)
+
+ " cleanup
+ call delete('Xfile')
+ let &ffs = ffs
+ au! BufReadPre Xfile
+ bw!
+endfunc
diff --git a/src/nvim/testdir/test_filetype.vim b/src/nvim/testdir/test_filetype.vim
new file mode 100644
index 0000000000..5d4a0ff3cb
--- /dev/null
+++ b/src/nvim/testdir/test_filetype.vim
@@ -0,0 +1,602 @@
+" Test :setfiletype
+
+func Test_detection()
+ filetype on
+ augroup filetypedetect
+ au BufNewFile,BufRead * call assert_equal(1, did_filetype())
+ augroup END
+ new something.vim
+ call assert_equal('vim', &filetype)
+
+ bwipe!
+ filetype off
+endfunc
+
+func Test_conf_type()
+ filetype on
+ call writefile(['# some comment', 'must be conf'], 'Xfile')
+ augroup filetypedetect
+ au BufNewFile,BufRead * call assert_equal(0, did_filetype())
+ augroup END
+ split Xfile
+ call assert_equal('conf', &filetype)
+
+ bwipe!
+ call delete('Xfile')
+ filetype off
+endfunc
+
+func Test_other_type()
+ filetype on
+ augroup filetypedetect
+ au BufNewFile,BufRead * call assert_equal(0, did_filetype())
+ au BufNewFile,BufRead Xfile setf testfile
+ au BufNewFile,BufRead * call assert_equal(1, did_filetype())
+ augroup END
+ call writefile(['# some comment', 'must be conf'], 'Xfile')
+ split Xfile
+ call assert_equal('testfile', &filetype)
+
+ bwipe!
+ call delete('Xfile')
+ filetype off
+endfunc
+
+" Filetypes detected just from matching the file name.
+let s:filename_checks = {
+ \ 'a2ps': ['/etc/a2ps.cfg', '/etc/a2ps/file.cfg', 'a2psrc', '.a2psrc'],
+ \ 'a65': ['file.a65'],
+ \ 'abap': ['file.abap'],
+ \ 'abc': ['file.abc'],
+ \ 'abel': ['file.abl'],
+ \ 'acedb': ['file.wrm'],
+ \ 'ada': ['file.adb', 'file.ads', 'file.ada', 'file.gpr'],
+ \ 'ahdl': ['file.tdf'],
+ \ 'alsaconf': ['.asoundrc', '/usr/share/alsa/alsa.conf', '/etc/asound.conf'],
+ \ 'aml': ['file.aml'],
+ \ 'ampl': ['file.run'],
+ \ 'ant': ['build.xml'],
+ \ 'apache': ['.htaccess', '/etc/httpd/file.conf'],
+ \ 'applescript': ['file.scpt'],
+ \ 'aptconf': ['apt.conf', '/.aptitude/config'],
+ \ 'arch': ['.arch-inventory'],
+ \ 'arduino': ['file.ino', 'file.pde'],
+ \ 'art': ['file.art'],
+ \ 'asciidoc': ['file.asciidoc', 'file.adoc'],
+ \ 'asn': ['file.asn', 'file.asn1'],
+ \ 'atlas': ['file.atl', 'file.as'],
+ \ 'autohotkey': ['file.ahk'],
+ \ 'autoit': ['file.au3'],
+ \ 'automake': ['GNUmakefile.am'],
+ \ 'ave': ['file.ave'],
+ \ 'awk': ['file.awk'],
+ \ 'b': ['file.mch', 'file.ref', 'file.imp'],
+ \ 'bc': ['file.bc'],
+ \ 'bdf': ['file.bdf'],
+ \ 'bib': ['file.bib'],
+ \ 'bindzone': ['named.root'],
+ \ 'blank': ['file.bl'],
+ \ 'bst': ['file.bst'],
+ \ 'bzr': ['bzr_log.any'],
+ \ 'c': ['enlightenment/file.cfg', 'file.qc', 'file.c'],
+ \ 'cabal': ['file.cabal'],
+ \ 'calendar': ['calendar'],
+ \ 'catalog': ['catalog'],
+ \ 'cdl': ['file.cdl'],
+ \ 'cdrdaoconf': ['/etc/cdrdao.conf', '/etc/defaults/cdrdao', '/etc/default/cdrdao', '.cdrdao'],
+ \ 'cdrtoc': ['file.toc'],
+ \ 'cf': ['file.cfm', 'file.cfi', 'file.cfc'],
+ \ 'cfengine': ['cfengine.conf'],
+ \ 'cfg': ['file.cfg', 'file.hgrc', 'filehgrc'],
+ \ 'ch': ['file.chf'],
+ \ 'chaiscript': ['file.chai'],
+ \ 'chaskell': ['file.chs'],
+ \ 'chill': ['file..ch'],
+ \ 'chordpro': ['file.chopro', 'file.crd', 'file.cho', 'file.crdpro', 'file.chordpro'],
+ \ 'cl': ['file.eni'],
+ \ 'clean': ['file.dcl', 'file.icl'],
+ \ 'clojure': ['file.clj', 'file.cljs', 'file.cljx', 'file.cljc'],
+ \ 'cmake': ['CMakeLists.txt', 'file.cmake', 'file.cmake.in'],
+ \ 'cmusrc': ['any/.cmus/autosave', 'any/.cmus/rc', 'any/.cmus/command-history', 'any/.cmus/file.theme', 'any/cmus/rc', 'any/cmus/file.theme'],
+ \ 'cobol': ['file.cbl', 'file.cob', 'file.lib'],
+ \ 'coco': ['file.atg'],
+ \ 'conaryrecipe': ['file.recipe'],
+ \ 'conf': ['auto.master'],
+ \ 'config': ['configure.in', 'configure.ac'],
+ \ 'context': ['tex/context/any/file.tex', 'file.mkii', 'file.mkiv', 'file.mkvi'],
+ \ 'cpp': ['file.cxx', 'file.c++', 'file.hh', 'file.hxx', 'file.hpp', 'file.ipp', 'file.moc', 'file.tcc', 'file.inl', 'file.tlh'],
+ \ 'crm': ['file.crm'],
+ \ 'cs': ['file.cs'],
+ \ 'csc': ['file.csc'],
+ \ 'csdl': ['file.csdl'],
+ \ 'csp': ['file.csp', 'file.fdr'],
+ \ 'css': ['file.css'],
+ \ 'cterm': ['file.con'],
+ \ 'cucumber': ['file.feature'],
+ \ 'cuda': ['file.cu'],
+ \ 'cupl': ['file.pld'],
+ \ 'cuplsim': ['file.si'],
+ \ 'cvs': ['cvs123'],
+ \ 'cvsrc': ['.cvsrc'],
+ \ 'cynpp': ['file.cyn'],
+ \ 'datascript': ['file.ds'],
+ \ 'dcd': ['file.dcd'],
+ \ 'debcontrol': ['/debian/control'],
+ \ 'debsources': ['/etc/apt/sources.list', '/etc/apt/sources.list.d/file.list'],
+ \ 'def': ['file.def'],
+ \ 'denyhosts': ['denyhosts.conf'],
+ \ 'desc': ['file.desc'],
+ \ 'desktop': ['file.desktop', '.directory'],
+ \ 'dictconf': ['dict.conf', '.dictrc'],
+ \ 'dictdconf': ['dictd.conf'],
+ \ 'diff': ['file.diff', 'file.rej'],
+ \ 'dircolors': ['.dir_colors', '.dircolors', '/etc/DIR_COLORS'],
+ \ 'dnsmasq': ['/etc/dnsmasq.conf'],
+ \ 'dockerfile': ['Dockerfile', 'file.Dockerfile'],
+ \ 'dosbatch': ['file.bat', 'file.sys'],
+ \ 'dosini': ['.editorconfig', '/etc/yum.conf', 'file.ini'],
+ \ 'dot': ['file.dot'],
+ \ 'dracula': ['file.drac', 'file.drc', 'filelvs', 'filelpe'],
+ \ 'dsl': ['file.dsl'],
+ \ 'dtd': ['file.dtd'],
+ \ 'dts': ['file.dts', 'file.dtsi'],
+ \ 'dylan': ['file.dylan'],
+ \ 'dylanintr': ['file.intr'],
+ \ 'dylanlid': ['file.lid'],
+ \ 'ecd': ['file.ecd'],
+ \ 'edif': ['file.edf', 'file.edif', 'file.edo'],
+ \ 'elinks': ['/etc/elinks.conf', '/.elinks/elinks.conf'],
+ \ 'elmfilt': ['filter-rules'],
+ \ 'erlang': ['file.erl', 'file.hrl', 'file.yaws'],
+ \ 'eruby': ['file.erb', 'file.rhtml'],
+ \ 'esmtprc': ['anyesmtprc'],
+ \ 'esqlc': ['file.ec', 'file.EC'],
+ \ 'esterel': ['file.strl'],
+ \ 'eterm': ['anyEterm/file.cfg'],
+ \ 'exim': ['exim.conf'],
+ \ 'expect': ['file.exp'],
+ \ 'exports': ['exports'],
+ \ 'factor': ['file.factor'],
+ \ 'falcon': ['file.fal'],
+ \ 'fan': ['file.fan', 'file.fwt'],
+ \ 'fetchmail': ['.fetchmailrc'],
+ \ 'fgl': ['file.4gl', 'file.4gh', 'file.m4gl'],
+ \ 'focexec': ['file.fex', 'file.focexec'],
+ \ 'forth': ['file.fs', 'file.ft', 'file.fth'],
+ \ 'fortran': ['file.f', 'file.for', 'file.fortran', 'file.fpp', 'file.ftn', 'file.f77', 'file.f90', 'file.f95', 'file.f03', 'file.f08'],
+ \ 'framescript': ['file.fsl'],
+ \ 'freebasic': ['file.fb', 'file.bi'],
+ \ 'fstab': ['fstab', 'mtab'],
+ \ 'gdb': ['.gdbinit'],
+ \ 'gdmo': ['file.mo', 'file.gdmo'],
+ \ 'gedcom': ['file.ged', 'lltxxxxx.txt'],
+ \ 'gitcommit': ['COMMIT_EDITMSG', 'MERGE_MSG', 'TAG_EDITMSG'],
+ \ 'gitconfig': ['file.git/config', '.gitconfig', '.gitmodules', 'file.git/modules//config', '/.config/git/config', '/etc/gitconfig'],
+ \ 'gitolite': ['gitolite.conf'],
+ \ 'gitrebase': ['git-rebase-todo'],
+ \ 'gitsendemail': ['.gitsendemail.msg.xxxxxx'],
+ \ 'gkrellmrc': ['gkrellmrc', 'gkrellmrc_x'],
+ \ 'gnash': ['gnashrc', '.gnashrc', 'gnashpluginrc', '.gnashpluginrc'],
+ \ 'gnuplot': ['file.gpi'],
+ \ 'go': ['file.go'],
+ \ 'gp': ['file.gp', '.gprc'],
+ \ 'gpg': ['/.gnupg/options', '/.gnupg/gpg.conf', '/usr/any/gnupg/options.skel'],
+ \ 'grads': ['file.gs'],
+ \ 'gretl': ['file.gretl'],
+ \ 'groovy': ['file.gradle', 'file.groovy'],
+ \ 'group': ['any/etc/group', 'any/etc/group-', 'any/etc/group.edit', 'any/etc/gshadow', 'any/etc/gshadow-', 'any/etc/gshadow.edit', 'any/var/backups/group.bak', 'any/var/backups/gshadow.bak'],
+ \ 'grub': ['/boot/grub/menu.lst', '/boot/grub/grub.conf', '/etc/grub.conf'],
+ \ 'gsp': ['file.gsp'],
+ \ 'gtkrc': ['.gtkrc', 'gtkrc'],
+ \ 'haml': ['file.haml'],
+ \ 'hamster': ['file.hsc', 'file.hsm'],
+ \ 'haskell': ['file.hs', 'file.hs-boot'],
+ \ 'haste': ['file.ht'],
+ \ 'hastepreproc': ['file.htpp'],
+ \ 'hb': ['file.hb'],
+ \ 'hercules': ['file.vc', 'file.ev', 'file.sum', 'file.errsum'],
+ \ 'hex': ['file.hex', 'file.h32'],
+ \ 'hgcommit': ['hg-editor-file.txt'],
+ \ 'hog': ['file.hog', 'snort.conf', 'vision.conf'],
+ \ 'hostconf': ['/etc/host.conf'],
+ \ 'hostsaccess': ['/etc/hosts.allow', '/etc/hosts.deny'],
+ \ 'htmlcheetah': ['file.tmpl'],
+ \ 'htmlm4': ['file.html.m4'],
+ \ 'httest': ['file.htt', 'file.htb'],
+ \ 'ibasic': ['file.iba', 'file.ibi'],
+ \ 'icemenu': ['/.icewm/menu'],
+ \ 'icon': ['file.icn'],
+ \ 'indent': ['.indent.pro', 'indentrc'],
+ \ 'inform': ['file.inf', 'file.INF'],
+ \ 'initng': ['/etc/initng/any/file.i', 'file.ii'],
+ \ 'inittab': ['inittab'],
+ \ 'ipfilter': ['ipf.conf', 'ipf6.conf', 'ipf.rules'],
+ \ 'iss': ['file.iss'],
+ \ 'ist': ['file.ist', 'file.mst'],
+ \ 'j': ['file.ijs'],
+ \ 'jal': ['file.jal', 'file.JAL'],
+ \ 'jam': ['file.jpl', 'file.jpr'],
+ \ 'java': ['file.java', 'file.jav'],
+ \ 'javacc': ['file.jj', 'file.jjt'],
+ \ 'javascript': ['file.js', 'file.javascript', 'file.es', 'file.jsx', 'file.mjs'],
+ \ 'jess': ['file.clp'],
+ \ 'jgraph': ['file.jgr'],
+ \ 'jovial': ['file.jov', 'file.j73', 'file.jovial'],
+ \ 'jproperties': ['file.properties', 'file.properties_xx', 'file.properties_xx_xx'],
+ \ 'json': ['file.json', 'file.jsonp', 'file.webmanifest'],
+ \ 'jsp': ['file.jsp'],
+ \ 'kconfig': ['Kconfig', 'Kconfig.debug'],
+ \ 'kivy': ['file.kv'],
+ \ 'kix': ['file.kix'],
+ \ 'kscript': ['file.ks'],
+ \ 'kwt': ['file.k'],
+ \ 'lace': ['file.ace', 'file.ACE'],
+ \ 'latte': ['file.latte', 'file.lte'],
+ \ 'ld': ['file.ld'],
+ \ 'ldif': ['file.ldif'],
+ \ 'less': ['file.less'],
+ \ 'lex': ['file.lex', 'file.l', 'file.lxx', 'file.l++'],
+ \ 'lftp': ['lftp.conf', '.lftprc', 'anylftp/rc'],
+ \ 'lhaskell': ['file.lhs'],
+ \ 'libao': ['/etc/libao.conf', '/.libao'],
+ \ 'lifelines': ['file.ll'],
+ \ 'lilo': ['lilo.conf'],
+ \ 'limits': ['/etc/limits', '/etc/anylimits.conf', '/etc/anylimits.d/file.conf'],
+ \ 'liquid': ['file.liquid'],
+ \ 'lisp': ['sbclrc', '.sbclrc'],
+ \ 'lite': ['file.lite', 'file.lt'],
+ \ 'litestep': ['/LiteStep/any/file.rc'],
+ \ 'loginaccess': ['/etc/login.access'],
+ \ 'logindefs': ['/etc/login.defs'],
+ \ 'logtalk': ['file.lgt'],
+ \ 'lotos': ['file.lot', 'file.lotos'],
+ \ 'lout': ['file.lou', 'file.lout'],
+ \ 'lprolog': ['file.sig'],
+ \ 'lsl': ['file.lsl'],
+ \ 'lss': ['file.lss'],
+ \ 'lua': ['file.lua', 'file.rockspec', 'file.nse'],
+ \ 'lynx': ['lynx.cfg'],
+ \ 'm4': ['file.at'],
+ \ 'mail': ['snd.123', '.letter', '.letter.123', '.followup', '.article', '.article.123', 'pico.123', 'mutt-xx-xxx', 'muttng-xx-xxx', 'ae123.txt', 'file.eml'],
+ \ 'mailaliases': ['/etc/mail/aliases', '/etc/aliases'],
+ \ 'mailcap': ['.mailcap', 'mailcap'],
+ \ 'make': ['file.mk', 'file.mak', 'file.dsp'],
+ \ 'mallard': ['file.page'],
+ \ 'manconf': ['/etc/man.conf', 'man.config'],
+ \ 'map': ['file.map'],
+ \ 'maple': ['file.mv', 'file.mpl', 'file.mws'],
+ \ 'markdown': ['file.markdown', 'file.mdown', 'file.mkd', 'file.mkdn', 'file.mdwn', 'file.md'],
+ \ 'mason': ['file.mason', 'file.mhtml', 'file.comp'],
+ \ 'master': ['file.mas', 'file.master'],
+ \ 'mel': ['file.mel'],
+ \ 'messages': ['/log/auth', '/log/cron', '/log/daemon', '/log/debug', '/log/kern', '/log/lpr', '/log/mail', '/log/messages', '/log/news/news', '/log/syslog', '/log/user',
+ \ '/log/auth.log', '/log/cron.log', '/log/daemon.log', '/log/debug.log', '/log/kern.log', '/log/lpr.log', '/log/mail.log', '/log/messages.log', '/log/news/news.log', '/log/syslog.log', '/log/user.log',
+ \ '/log/auth.err', '/log/cron.err', '/log/daemon.err', '/log/debug.err', '/log/kern.err', '/log/lpr.err', '/log/mail.err', '/log/messages.err', '/log/news/news.err', '/log/syslog.err', '/log/user.err',
+ \ '/log/auth.info', '/log/cron.info', '/log/daemon.info', '/log/debug.info', '/log/kern.info', '/log/lpr.info', '/log/mail.info', '/log/messages.info', '/log/news/news.info', '/log/syslog.info', '/log/user.info',
+ \ '/log/auth.warn', '/log/cron.warn', '/log/daemon.warn', '/log/debug.warn', '/log/kern.warn', '/log/lpr.warn', '/log/mail.warn', '/log/messages.warn', '/log/news/news.warn', '/log/syslog.warn', '/log/user.warn',
+ \ '/log/auth.crit', '/log/cron.crit', '/log/daemon.crit', '/log/debug.crit', '/log/kern.crit', '/log/lpr.crit', '/log/mail.crit', '/log/messages.crit', '/log/news/news.crit', '/log/syslog.crit', '/log/user.crit',
+ \ '/log/auth.notice', '/log/cron.notice', '/log/daemon.notice', '/log/debug.notice', '/log/kern.notice', '/log/lpr.notice', '/log/mail.notice', '/log/messages.notice', '/log/news/news.notice', '/log/syslog.notice', '/log/user.notice'],
+ \ 'mf': ['file.mf'],
+ \ 'mgl': ['file.mgl'],
+ \ 'mgp': ['file.mgp'],
+ \ 'mib': ['file.mib', 'file.my'],
+ \ 'mix': ['file.mix', 'file.mixal'],
+ \ 'mma': ['file.nb'],
+ \ 'mmp': ['file.mmp'],
+ \ 'modconf': ['/etc/modules.conf', '/etc/modules', '/etc/conf.modules'],
+ \ 'modula2': ['file.m2', 'file.mi'],
+ \ 'monk': ['file.isc', 'file.monk', 'file.ssc', 'file.tsc'],
+ \ 'moo': ['file.moo'],
+ \ 'mp': ['file.mp'],
+ \ 'mplayerconf': ['mplayer.conf', '/.mplayer/config'],
+ \ 'mrxvtrc': ['mrxvtrc', '.mrxvtrc'],
+ \ 'msidl': ['file.odl', 'file.mof'],
+ \ 'msql': ['file.msql'],
+ \ 'mupad': ['file.mu'],
+ \ 'mush': ['file.mush'],
+ \ 'muttrc': ['Muttngrc', 'Muttrc'],
+ \ 'mysql': ['file.mysql'],
+ \ 'n1ql': ['file.n1ql', 'file.nql'],
+ \ 'named': ['namedfile.conf', 'rndcfile.conf'],
+ \ 'nanorc': ['/etc/nanorc', 'file.nanorc'],
+ \ 'ncf': ['file.ncf'],
+ \ 'netrc': ['.netrc'],
+ \ 'ninja': ['file.ninja'],
+ \ 'nqc': ['file.nqc'],
+ \ 'nroff': ['file.tr', 'file.nr', 'file.roff', 'file.tmac', 'file.mom'],
+ \ 'nsis': ['file.nsi', 'file.nsh'],
+ \ 'obj': ['file.obj'],
+ \ 'ocaml': ['file.ml', 'file.mli', 'file.mll', 'file.mly', '.ocamlinit'],
+ \ 'occam': ['file.occ'],
+ \ 'omnimark': ['file.xom', 'file.xin'],
+ \ 'openroad': ['file.or'],
+ \ 'ora': ['file.ora'],
+ \ 'pamconf': ['/etc/pam.conf'],
+ \ 'papp': ['file.papp', 'file.pxml', 'file.pxsl'],
+ \ 'pascal': ['file.pas', 'file.dpr'],
+ \ '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'],
+ \ 'perl': ['file.plx', 'file.al', 'file.psgi', 'gitolite.rc', '.gitolite.rc', 'example.gitolite.rc'],
+ \ 'perl6': ['file.p6', 'file.pm6', 'file.pl6'],
+ \ 'pf': ['pf.conf'],
+ \ 'pfmain': ['main.cf'],
+ \ 'php': ['file.php', 'file.php9', 'file.phtml', 'file.ctp'],
+ \ 'lpc': ['file.lpc', 'file.ulpc'],
+ \ 'pike': ['file.pike', 'file.pmod'],
+ \ 'cmod': ['file.cmod'],
+ \ 'pilrc': ['file.rcp'],
+ \ 'pine': ['.pinerc', 'pinerc', '.pinercex', 'pinercex'],
+ \ 'pinfo': ['/etc/pinforc', '/.pinforc'],
+ \ 'pli': ['file.pli', 'file.pl1'],
+ \ 'plm': ['file.plm', 'file.p36', 'file.pac'],
+ \ 'plp': ['file.plp'],
+ \ 'plsql': ['file.pls', 'file.plsql'],
+ \ 'po': ['file.po', 'file.pot'],
+ \ 'pod': ['file.pod'],
+ \ 'pod6': ['file.pod6'],
+ \ 'postscr': ['file.ps', 'file.pfa', 'file.afm', 'file.eps', 'file.epsf', 'file.epsi', 'file.ai'],
+ \ 'pov': ['file.pov'],
+ \ 'povini': ['.povrayrc'],
+ \ 'ppd': ['file.ppd'],
+ \ 'ppwiz': ['file.it', 'file.ih'],
+ \ 'privoxy': ['file.action'],
+ \ 'proc': ['file.pc'],
+ \ 'procmail': ['.procmail', '.procmailrc'],
+ \ 'prolog': ['file.pdb'],
+ \ 'promela': ['file.pml'],
+ \ 'proto': ['file.proto'],
+ \ 'protocols': ['/etc/protocols'],
+ \ 'psf': ['file.psf'],
+ \ 'pyrex': ['file.pyx', 'file.pxd'],
+ \ 'python': ['file.py', 'file.pyw', '.pythonstartup', '.pythonrc', 'file.ptl', 'file.pyi'],
+ \ 'quake': ['anybaseq2/file.cfg', 'anyid1/file.cfg', 'quake3/file.cfg'],
+ \ 'radiance': ['file.rad', 'file.mat'],
+ \ 'ratpoison': ['.ratpoisonrc', 'ratpoisonrc'],
+ \ 'rc': ['file.rc', 'file.rch'],
+ \ 'rcs': ['file,v'],
+ \ 'readline': ['.inputrc', 'inputrc'],
+ \ 'remind': ['.reminders', 'file.remind', 'file.rem'],
+ \ 'resolv': ['resolv.conf'],
+ \ 'reva': ['file.frt'],
+ \ 'rexx': ['file.rex', 'file.orx', 'file.rxo', 'file.rxj', 'file.jrexx', 'file.rexxj', 'file.rexx', 'file.testGroup', 'file.testUnit'],
+ \ 'rib': ['file.rib'],
+ \ 'rnc': ['file.rnc'],
+ \ 'rng': ['file.rng'],
+ \ 'robots': ['robots.txt'],
+ \ 'rpcgen': ['file.x'],
+ \ 'rpl': ['file.rpl'],
+ \ 'rst': ['file.rst'],
+ \ 'rtf': ['file.rtf'],
+ \ 'ruby': ['.irbrc', 'irbrc', 'file.rb', 'file.rbw', 'file.gemspec', 'file.ru', 'Gemfile', 'file.builder', 'file.rxml', 'file.rjs', 'file.rant', 'file.rake'],
+ \ 'rust': ['file.rs'],
+ \ 'samba': ['smb.conf'],
+ \ 'sas': ['file.sas'],
+ \ 'sass': ['file.sass'],
+ \ 'sather': ['file.sa'],
+ \ 'sbt': ['file.sbt'],
+ \ 'scala': ['file.scala'],
+ \ 'scheme': ['file.scm', 'file.ss', 'file.rkt'],
+ \ 'scilab': ['file.sci', 'file.sce'],
+ \ 'screen': ['.screenrc', 'screenrc'],
+ \ 'scss': ['file.scss'],
+ \ 'sd': ['file.sd'],
+ \ 'sdc': ['file.sdc'],
+ \ 'sdl': ['file.sdl', 'file.pr'],
+ \ 'sed': ['file.sed'],
+ \ 'sensors': ['/etc/sensors.conf', '/etc/sensors3.conf'],
+ \ 'services': ['/etc/services'],
+ \ 'setserial': ['/etc/serial.conf'],
+ \ 'sh': ['/etc/udev/cdsymlinks.conf'],
+ \ 'sieve': ['file.siv', 'file.sieve'],
+ \ 'simula': ['file.sim'],
+ \ 'sinda': ['file.sin', 'file.s85'],
+ \ 'sisu': ['file.sst', 'file.ssm', 'file.ssi', 'file.-sst', 'file._sst', 'file.sst.meta', 'file.-sst.meta', 'file._sst.meta'],
+ \ 'skill': ['file.il', 'file.ils', 'file.cdf'],
+ \ 'slang': ['file.sl'],
+ \ 'slice': ['file.ice'],
+ \ 'slpconf': ['/etc/slp.conf'],
+ \ 'slpreg': ['/etc/slp.reg'],
+ \ 'slpspi': ['/etc/slp.spi'],
+ \ 'slrnrc': ['.slrnrc'],
+ \ 'slrnsc': ['file.score'],
+ \ 'sm': ['sendmail.cf'],
+ \ 'smarty': ['file.tpl'],
+ \ 'smcl': ['file.hlp', 'file.ihlp', 'file.smcl'],
+ \ 'smith': ['file.smt', 'file.smith'],
+ \ 'sml': ['file.sml'],
+ \ 'snobol4': ['file.sno', 'file.spt'],
+ \ 'spec': ['file.spec'],
+ \ 'spice': ['file.sp', 'file.spice'],
+ \ 'spup': ['file.speedup', 'file.spdata', 'file.spd'],
+ \ 'spyce': ['file.spy', 'file.spi'],
+ \ 'sql': ['file.tyb', 'file.typ', 'file.tyc', 'file.pkb', 'file.pks'],
+ \ 'sqlj': ['file.sqlj'],
+ \ 'sqr': ['file.sqr', 'file.sqi'],
+ \ 'squid': ['squid.conf'],
+ \ 'srec': ['file.s19', 'file.s28', 'file.s37', 'file.mot', 'file.srec'],
+ \ 'sshconfig': ['ssh_config', '/.ssh/config'],
+ \ 'sshdconfig': ['sshd_config'],
+ \ 'st': ['file.st'],
+ \ 'stata': ['file.ado', 'file.do', 'file.imata', 'file.mata'],
+ \ 'stp': ['file.stp'],
+ \ 'sudoers': ['any/etc/sudoers', 'sudoers.tmp'],
+ \ 'svg': ['file.svg'],
+ \ 'svn': ['svn-commitfile.tmp'],
+ \ 'sysctl': ['/etc/sysctl.conf', '/etc/sysctl.d/file.conf'],
+ \ 'systemd': ['any/systemd/file.automount', 'any/systemd/file.mount', 'any/systemd/file.path', 'any/systemd/file.service', 'any/systemd/file.socket', 'any/systemd/file.swap', 'any/systemd/file.target', 'any/systemd/file.timer'],
+ \ 'systemverilog': ['file.sv', 'file.svh'],
+ \ 'tags': ['tags'],
+ \ 'tak': ['file.tak'],
+ \ 'taskdata': ['pending.data', 'completed.data', 'undo.data'],
+ \ 'taskedit': ['file.task'],
+ \ 'tcl': ['file.tcl', 'file.tk', 'file.itcl', 'file.itk', 'file.jacl'],
+ \ 'teraterm': ['file.ttl'],
+ \ 'terminfo': ['file.ti'],
+ \ 'tex': ['file.latex', 'file.sty', 'file.dtx', 'file.ltx', 'file.bbl'],
+ \ 'texinfo': ['file.texinfo', 'file.texi', 'file.txi'],
+ \ 'texmf': ['texmf.cnf'],
+ \ 'text': ['file.text', 'README'],
+ \ 'tf': ['file.tf', '.tfrc', 'tfrc'],
+ \ 'tidy': ['.tidyrc', 'tidyrc'],
+ \ 'tilde': ['file.t.html'],
+ \ 'tli': ['file.tli'],
+ \ 'tmux': ['tmuxfile.conf', '.tmuxfile.conf'],
+ \ 'tpp': ['file.tpp'],
+ \ 'treetop': ['file.treetop'],
+ \ 'trustees': ['trustees.conf'],
+ \ 'tsalt': ['file.slt'],
+ \ 'tsscl': ['file.tsscl'],
+ \ 'tssgm': ['file.tssgm'],
+ \ 'tssop': ['file.tssop'],
+ \ 'twig': ['file.twig'],
+ \ 'uc': ['file.uc'],
+ \ 'udevconf': ['/etc/udev/udev.conf'],
+ \ 'udevperm': ['/etc/udev/permissions.d/file.permissions'],
+ \ 'uil': ['file.uit', 'file.uil'],
+ \ 'updatedb': ['/etc/updatedb.conf'],
+ \ 'upstart': ['/usr/share/upstart/file.conf', '/usr/share/upstart/file.override', '/etc/init/file.conf', '/etc/init/file.override', '/.init/file.conf', '/.init/file.override', '/.config/upstart/file.conf', '/.config/upstart/file.override'],
+ \ 'upstreamdat': ['upstream.dat', 'UPSTREAM.DAT', 'upstream.file.dat', 'UPSTREAM.FILE.DAT', 'file.upstream.dat', 'FILE.UPSTREAM.DAT'],
+ \ 'upstreaminstalllog': ['upstreaminstall.log', 'UPSTREAMINSTALL.LOG', 'upstreaminstall.file.log', 'UPSTREAMINSTALL.FILE.LOG', 'file.upstreaminstall.log', 'FILE.UPSTREAMINSTALL.LOG'],
+ \ 'upstreamlog': ['fdrupstream.log', 'upstream.log', 'UPSTREAM.LOG', 'upstream.file.log', 'UPSTREAM.FILE.LOG', 'file.upstream.log', 'FILE.UPSTREAM.LOG', 'UPSTREAM-file.log', 'UPSTREAM-FILE.LOG'],
+ \ 'usserverlog': ['usserver.log', 'USSERVER.LOG', 'usserver.file.log', 'USSERVER.FILE.LOG', 'file.usserver.log', 'FILE.USSERVER.LOG'],
+ \ 'usw2kagtlog': ['usw2kagt.log', 'USW2KAGT.LOG', 'usw2kagt.file.log', 'USW2KAGT.FILE.LOG', 'file.usw2kagt.log', 'FILE.USW2KAGT.LOG'],
+ \ 'vb': ['file.sba', 'file.vb', 'file.vbs', 'file.dsm', 'file.ctl'],
+ \ 'vera': ['file.vr', 'file.vri', 'file.vrh'],
+ \ 'verilog': ['file.v'],
+ \ 'verilogams': ['file.va', 'file.vams'],
+ \ 'vgrindefs': ['vgrindefs'],
+ \ 'vhdl': ['file.hdl', 'file.vhd', 'file.vhdl', 'file.vbe', 'file.vst'],
+ \ 'vim': ['file.vim', 'file.vba', '.exrc', '_exrc'],
+ \ 'viminfo': ['.viminfo', '_viminfo'],
+ \ 'vmasm': ['file.mar'],
+ \ 'voscm': ['file.cm'],
+ \ 'vrml': ['file.wrl'],
+ \ 'vroom': ['file.vroom'],
+ \ 'wast': ['file.wast', 'file.wat'],
+ \ 'webmacro': ['file.wm'],
+ \ 'wget': ['.wgetrc', 'wgetrc'],
+ \ 'winbatch': ['file.wbt'],
+ \ 'wml': ['file.wml'],
+ \ 'wsml': ['file.wsml'],
+ \ 'wvdial': ['wvdial.conf', '.wvdialrc'],
+ \ 'xdefaults': ['.Xdefaults', '.Xpdefaults', '.Xresources', 'xdm-config', 'file.ad'],
+ \ 'xhtml': ['file.xhtml', 'file.xht'],
+ \ 'xinetd': ['/etc/xinetd.conf'],
+ \ 'xmath': ['file.msc', 'file.msf'],
+ \ 'xml': ['/etc/blkid.tab', '/etc/blkid.tab.old', 'file.xmi', 'file.csproj', 'file.csproj.user', 'file.ts', 'file.ui', 'file.tpm', '/etc/xdg/menus/file.menu', 'fglrxrc', 'file.xlf', 'file.xliff', 'file.xul', 'file.wsdl'],
+ \ 'xmodmap': ['anyXmodmap'],
+ \ 'xf86conf': ['xorg.conf', 'xorg.conf-4'],
+ \ 'xpm2': ['file.xpm2'],
+ \ 'xquery': ['file.xq', 'file.xql', 'file.xqm', 'file.xquery', 'file.xqy'],
+ \ 'xs': ['file.xs'],
+ \ 'xsd': ['file.xsd'],
+ \ 'xslt': ['file.xsl', 'file.xslt'],
+ \ 'yacc': ['file.yy', 'file.yxx', 'file.y++'],
+ \ 'yaml': ['file.yaml', 'file.yml'],
+ \ 'raml': ['file.raml'],
+ \ 'z8a': ['file.z8a'],
+ \ 'zimbu': ['file.zu'],
+ \ 'zimbutempl': ['file.zut'],
+ \ 'zsh': ['.zprofile', '/etc/zprofile', '.zfbfmarks', 'file.zsh'],
+ \
+ \ 'aap': ['file.aap'],
+ \ 'help': [$VIMRUNTIME . '/doc/help.txt'],
+ \ 'xpm': ['file.xpm'],
+ \ }
+
+let s:filename_case_checks = {
+ \ 'modula2': ['file.DEF', 'file.MOD'],
+ \ }
+
+func CheckItems(checks)
+ for [ft, names] in items(a:checks)
+ for i in range(0, len(names) - 1)
+ new
+ try
+ exe 'edit ' . names[i]
+ catch
+ call assert_report('cannot edit "' . names[i] . '": ' . v:errmsg)
+ endtry
+ call assert_equal(ft, &filetype, 'with file name: ' . names[i])
+ bwipe!
+ endfor
+ endfor
+endfunc
+
+func Test_filetype_detection()
+ filetype on
+ call CheckItems(s:filename_checks)
+ if has('fname_case')
+ call CheckItems(s:filename_case_checks)
+ endif
+ filetype off
+endfunc
+
+" Filetypes detected from the file contents by scripts.vim
+let s:script_checks = {
+ \ 'virata': [['% Virata'],
+ \ ['', '% Virata'],
+ \ ['', '', '% Virata'],
+ \ ['', '', '', '% Virata'],
+ \ ['', '', '', '', '% Virata']],
+ \ 'strace': [['execve("/usr/bin/pstree", ["pstree"], 0x7ff0 /* 63 vars */) = 0'],
+ \ ['15:17:47 execve("/usr/bin/pstree", ["pstree"], ... "_=/usr/bin/strace"]) = 0'],
+ \ ['__libc_start_main and something']],
+ \ 'clojure': [['#!/path/clojure']],
+ \ 'scala': [['#!/path/scala']],
+ \ 'tcsh': [['#!/path/tcsh']],
+ \ 'zsh': [['#!/path/zsh']],
+ \ 'tcl': [['#!/path/tclsh'],
+ \ ['#!/path/wish'],
+ \ ['#!/path/expectk'],
+ \ ['#!/path/itclsh'],
+ \ ['#!/path/itkwish']],
+ \ 'expect': [['#!/path/expect']],
+ \ 'gnuplot': [['#!/path/gnuplot']],
+ \ 'make': [['#!/path/make']],
+ \ 'pike': [['#!/path/pike'],
+ \ ['#!/path/pike0'],
+ \ ['#!/path/pike9']],
+ \ 'lua': [['#!/path/lua']],
+ \ 'perl6': [['#!/path/perl6']],
+ \ 'perl': [['#!/path/perl']],
+ \ 'php': [['#!/path/php']],
+ \ 'python': [['#!/path/python'],
+ \ ['#!/path/python2'],
+ \ ['#!/path/python3']],
+ \ 'groovy': [['#!/path/groovy']],
+ \ 'ruby': [['#!/path/ruby']],
+ \ 'javascript': [['#!/path/node'],
+ \ ['#!/path/js'],
+ \ ['#!/path/nodejs'],
+ \ ['#!/path/rhino']],
+ \ 'bc': [['#!/path/bc']],
+ \ 'sed': [['#!/path/sed']],
+ \ 'ocaml': [['#!/path/ocaml']],
+ \ 'awk': [['#!/path/awk']],
+ \ 'wml': [['#!/path/wml']],
+ \ 'scheme': [['#!/path/scheme']],
+ \ 'cfengine': [['#!/path/cfengine']],
+ \ 'erlang': [['#!/path/escript']],
+ \ 'haskell': [['#!/path/haskell']],
+ \ }
+
+func Test_script_detection()
+ filetype on
+ for [ft, files] in items(s:script_checks)
+ for file in files
+ call writefile(file, 'Xtest')
+ split Xtest
+ call assert_equal(ft, &filetype, 'for text: ' . string(file))
+ bwipe!
+ endfor
+ endfor
+ call delete('Xtest')
+ filetype off
+endfunc
+
+func Test_setfiletype_completion()
+ call feedkeys(":setfiletype java\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"setfiletype java javacc javascript', @:)
+endfunc
diff --git a/src/nvim/testdir/test_filter_cmd.vim b/src/nvim/testdir/test_filter_cmd.vim
new file mode 100644
index 0000000000..86347ab77f
--- /dev/null
+++ b/src/nvim/testdir/test_filter_cmd.vim
@@ -0,0 +1,89 @@
+" Test the :filter command modifier
+
+func Test_filter()
+ edit Xdoesnotmatch
+ edit Xwillmatch
+ call assert_equal('"Xwillmatch"', substitute(execute('filter willma ls'), '[^"]*\(".*"\)[^"]*', '\1', ''))
+ bwipe Xdoesnotmatch
+ bwipe Xwillmatch
+
+ new
+ call setline(1, ['foo1', 'foo2', 'foo3', 'foo4', 'foo5'])
+ call assert_equal("\nfoo2\nfoo4", execute('filter /foo[24]/ 1,$print'))
+ call assert_equal("\n 2 foo2\n 4 foo4", execute('filter /foo[24]/ 1,$number'))
+ call assert_equal("\nfoo2$\nfoo4$", execute('filter /foo[24]/ 1,$list'))
+
+ call assert_equal("\nfoo1$\nfoo3$\nfoo5$", execute('filter! /foo[24]/ 1,$list'))
+ bwipe!
+
+ command XTryThis echo 'this'
+ command XTryThat echo 'that'
+ command XDoThat echo 'that'
+ let lines = split(execute('filter XTry command'), "\n")
+ call assert_equal(3, len(lines))
+ call assert_match("XTryThat", lines[1])
+ call assert_match("XTryThis", lines[2])
+ delcommand XTryThis
+ delcommand XTryThat
+ delcommand XDoThat
+
+ map f1 the first key
+ map f2 the second key
+ map f3 not a key
+ let lines = split(execute('filter the map f'), "\n")
+ call assert_equal(2, len(lines))
+ call assert_match("f2", lines[0])
+ call assert_match("f1", lines[1])
+ unmap f1
+ unmap f2
+ unmap f3
+endfunc
+
+func Test_filter_fails()
+ call assert_fails('filter', 'E471:')
+ call assert_fails('filter pat', 'E476:')
+ call assert_fails('filter /pat', 'E476:')
+ call assert_fails('filter /pat/', 'E476:')
+ call assert_fails('filter /pat/ asdf', 'E492:')
+
+ call assert_fails('filter!', 'E471:')
+ call assert_fails('filter! pat', 'E476:')
+ call assert_fails('filter! /pat', 'E476:')
+ call assert_fails('filter! /pat/', 'E476:')
+ call assert_fails('filter! /pat/ asdf', 'E492:')
+endfunc
+
+function s:complete_filter_cmd(filtcmd)
+ let keystroke = "\<TAB>\<C-R>=execute('let cmdline = getcmdline()')\<CR>\<C-C>"
+ let cmdline = ''
+ call feedkeys(':' . a:filtcmd . keystroke, 'ntx')
+ return cmdline
+endfunction
+
+func Test_filter_cmd_completion()
+ " Do not complete pattern
+ call assert_equal("filter \t", s:complete_filter_cmd('filter '))
+ call assert_equal("filter pat\t", s:complete_filter_cmd('filter pat'))
+ call assert_equal("filter /pat\t", s:complete_filter_cmd('filter /pat'))
+ call assert_equal("filter /pat/\t", s:complete_filter_cmd('filter /pat/'))
+
+ " Complete after string pattern
+ call assert_equal('filter pat print', s:complete_filter_cmd('filter pat pri'))
+
+ " Complete after regexp pattern
+ call assert_equal('filter /pat/ print', s:complete_filter_cmd('filter /pat/ pri'))
+ call assert_equal('filter #pat# print', s:complete_filter_cmd('filter #pat# pri'))
+endfunc
+
+func Test_filter_cmd_with_filter()
+ new
+ set shelltemp
+ %!echo "a|b"
+ let out = getline(1)
+ bw!
+ if has('win32')
+ let out = trim(out, '" ')
+ endif
+ call assert_equal('a|b', out)
+ set shelltemp&
+endfunction
diff --git a/src/nvim/testdir/test_filter_map.vim b/src/nvim/testdir/test_filter_map.vim
new file mode 100644
index 0000000000..c8d64ce0a4
--- /dev/null
+++ b/src/nvim/testdir/test_filter_map.vim
@@ -0,0 +1,81 @@
+" Test filter() and map()
+
+" list with expression string
+func Test_filter_map_list_expr_string()
+ " filter()
+ call assert_equal([2, 3, 4], filter([1, 2, 3, 4], 'v:val > 1'))
+ call assert_equal([3, 4], filter([1, 2, 3, 4], 'v:key > 1'))
+ call assert_equal([], filter([1, 2, 3, 4], 0))
+
+ " map()
+ call assert_equal([2, 4, 6, 8], map([1, 2, 3, 4], 'v:val * 2'))
+ call assert_equal([0, 2, 4, 6], map([1, 2, 3, 4], 'v:key * 2'))
+ call assert_equal([9, 9, 9, 9], map([1, 2, 3, 4], 9))
+endfunc
+
+" dict with expression string
+func Test_filter_map_dict_expr_string()
+ let dict = {"foo": 1, "bar": 2, "baz": 3}
+
+ " filter()
+ call assert_equal({"bar": 2, "baz": 3}, filter(copy(dict), 'v:val > 1'))
+ call assert_equal({"foo": 1, "baz": 3}, filter(copy(dict), 'v:key > "bar"'))
+ call assert_equal({}, filter(copy(dict), 0))
+
+ " map()
+ call assert_equal({"foo": 2, "bar": 4, "baz": 6}, map(copy(dict), 'v:val * 2'))
+ call assert_equal({"foo": "f", "bar": "b", "baz": "b"}, map(copy(dict), 'v:key[0]'))
+ call assert_equal({"foo": 9, "bar": 9, "baz": 9}, map(copy(dict), 9))
+endfunc
+
+" list with funcref
+func Test_filter_map_list_expr_funcref()
+ " filter()
+ func! s:filter1(index, val) abort
+ return a:val > 1
+ endfunc
+ call assert_equal([2, 3, 4], filter([1, 2, 3, 4], function('s:filter1')))
+
+ func! s:filter2(index, val) abort
+ return a:index > 1
+ endfunc
+ call assert_equal([3, 4], filter([1, 2, 3, 4], function('s:filter2')))
+
+ " map()
+ func! s:filter3(index, val) abort
+ return a:val * 2
+ endfunc
+ call assert_equal([2, 4, 6, 8], map([1, 2, 3, 4], function('s:filter3')))
+
+ func! s:filter4(index, val) abort
+ return a:index * 2
+ endfunc
+ call assert_equal([0, 2, 4, 6], map([1, 2, 3, 4], function('s:filter4')))
+endfunc
+
+" dict with funcref
+func Test_filter_map_dict_expr_funcref()
+ let dict = {"foo": 1, "bar": 2, "baz": 3}
+
+ " filter()
+ func! s:filter1(key, val) abort
+ return a:val > 1
+ endfunc
+ call assert_equal({"bar": 2, "baz": 3}, filter(copy(dict), function('s:filter1')))
+
+ func! s:filter2(key, val) abort
+ return a:key > "bar"
+ endfunc
+ call assert_equal({"foo": 1, "baz": 3}, filter(copy(dict), function('s:filter2')))
+
+ " map()
+ func! s:filter3(key, val) abort
+ return a:val * 2
+ endfunc
+ call assert_equal({"foo": 2, "bar": 4, "baz": 6}, map(copy(dict), function('s:filter3')))
+
+ func! s:filter4(key, val) abort
+ return a:key[0]
+ endfunc
+ call assert_equal({"foo": "f", "bar": "b", "baz": "b"}, map(copy(dict), function('s:filter4')))
+endfunc
diff --git a/src/nvim/testdir/test_find_complete.vim b/src/nvim/testdir/test_find_complete.vim
new file mode 100644
index 0000000000..7592b16192
--- /dev/null
+++ b/src/nvim/testdir/test_find_complete.vim
@@ -0,0 +1,166 @@
+" Tests for the 'find' command completion.
+
+" Do all the tests in a separate window to avoid E211 when we recursively
+" delete the Xfind directory during cleanup
+func Test_find_complete()
+ let shellslash = &shellslash
+ set shellslash
+ set belloff=all
+
+ " On windows a stale "Xfind" directory may exist, remove it so that
+ " we start from a clean state.
+ call delete("Xfind", "rf")
+ let cwd = getcwd()
+ let test_out = cwd . '/test.out'
+ call mkdir('Xfind')
+ cd Xfind
+
+ new
+ set path=
+ call assert_fails('call feedkeys(":find\t\n", "xt")', 'E345:')
+ close
+
+ new
+ set path=.
+ call assert_fails('call feedkeys(":find\t\n", "xt")', 'E32:')
+ close
+
+ new
+ set path=.,,
+ call assert_fails('call feedkeys(":find\t\n", "xt")', 'E32:')
+ close
+
+ new
+ set path=./**
+ call assert_fails('call feedkeys(":find\t\n", "xt")', 'E32:')
+ close
+
+ " We shouldn't find any file till this point
+
+ call mkdir('in/path', 'p')
+ exe 'cd ' . cwd
+ call writefile(['Holy Grail'], 'Xfind/file.txt')
+ call writefile(['Jimmy Hoffa'], 'Xfind/in/file.txt')
+ call writefile(['Another Holy Grail'], 'Xfind/in/stuff.txt')
+ call writefile(['E.T.'], 'Xfind/in/path/file.txt')
+
+ new
+ set path=Xfind/**
+ call feedkeys(":find file\t\n", "xt")
+ call assert_equal('Holy Grail', getline(1))
+ call feedkeys(":find file\t\t\n", "xt")
+ call assert_equal('Jimmy Hoffa', getline(1))
+ call feedkeys(":find file\t\t\t\n", "xt")
+ call assert_equal('E.T.', getline(1))
+
+ " Rerun the previous three find completions, using fullpath in 'path'
+ exec "set path=" . cwd . "/Xfind/**"
+
+ call feedkeys(":find file\t\n", "xt")
+ call assert_equal('Holy Grail', getline(1))
+ call feedkeys(":find file\t\t\n", "xt")
+ call assert_equal('Jimmy Hoffa', getline(1))
+ call feedkeys(":find file\t\t\t\n", "xt")
+ call assert_equal('E.T.', getline(1))
+
+ " Same steps again, using relative and fullpath items that point to the same
+ " recursive location.
+ " This is to test that there are no duplicates in the completion list.
+ set path+=Xfind/**
+ call feedkeys(":find file\t\n", "xt")
+ call assert_equal('Holy Grail', getline(1))
+ call feedkeys(":find file\t\t\n", "xt")
+ call assert_equal('Jimmy Hoffa', getline(1))
+ call feedkeys(":find file\t\t\t\n", "xt")
+ call assert_equal('E.T.', getline(1))
+ call feedkeys(":find file\t\t\n", "xt")
+
+ " Test find completion for directory of current buffer, which at this point
+ " is Xfind/in/file.txt.
+ set path=.
+ call feedkeys(":find st\t\n", "xt")
+ call assert_equal('Another Holy Grail', getline(1))
+
+ " Test find completion for empty path item ",," which is the current
+ " directory
+ cd Xfind
+ set path=,,
+ call feedkeys(":find f\t\n", "xt")
+ call assert_equal('Holy Grail', getline(1))
+
+ " Test that find completion on directory appends a slash
+ call feedkeys(":find in/pa\tfile.txt\n", "xt")
+ call assert_equal('E.T.', getline(1))
+ call feedkeys(":find ./i\tstuff.txt\n", "xt")
+ call assert_equal('Another Holy Grail', getline(1))
+
+ " Test shortening of
+ "
+ " foo/x/bar/voyager.txt
+ " foo/y/bar/voyager.txt
+ "
+ " When current directory is above foo/ they should be shortened to (in order
+ " of appearance):
+ "
+ " x/bar/voyager.txt
+ " y/bar/voyager.txt
+ call mkdir('foo/x/bar', 'p')
+ call mkdir('foo/y/bar', 'p')
+ call writefile(['Voyager 1'], 'foo/x/bar/voyager.txt')
+ call writefile(['Voyager 2'], 'foo/y/bar/voyager.txt')
+
+ exec "set path=" . cwd . "/Xfind/**"
+ call feedkeys(":find voyager\t\n", "xt")
+ call assert_equal('Voyager 1', getline(1))
+ call feedkeys(":find voyager\t\t\n", "xt")
+ call assert_equal('Voyager 2', getline(1))
+
+ "
+ " When current directory is .../foo/y/bar they should be shortened to (in
+ " order of appearance):
+ "
+ " ./voyager.txt
+ " x/bar/voyager.txt
+ cd foo/y/bar
+ call feedkeys(":find voyager\t\n", "xt")
+ call assert_equal('Voyager 2', getline(1))
+ call feedkeys(":find voyager\t\t\n", "xt")
+ call assert_equal('Voyager 1', getline(1))
+
+ " Check the opposite too:
+ cd ../../x/bar
+ call feedkeys(":find voyager\t\n", "xt")
+ call assert_equal('Voyager 1', getline(1))
+ call feedkeys(":find voyager\t\t\n", "xt")
+ call assert_equal('Voyager 2', getline(1))
+
+ " Check for correct handling of shorten_fname()'s behavior on windows
+ exec "cd " . cwd . "/Xfind/in"
+ call feedkeys(":find file\t\n", "xt")
+ call assert_equal('Jimmy Hoffa', getline(1))
+
+ " Test for relative to current buffer 'path' item
+ exec "cd " . cwd . "/Xfind/"
+ set path=./path
+ " Open the file where Jimmy Hoffa is found
+ e in/file.txt
+ " Find the file containing 'E.T.' in the Xfind/in/path directory
+ call feedkeys(":find file\t\n", "xt")
+ call assert_equal('E.T.', getline(1))
+
+ " Test that completion works when path=.,,
+ set path=.,,
+ " Open Jimmy Hoffa file
+ e in/file.txt
+ call assert_equal('Jimmy Hoffa', getline(1))
+
+ " Search for the file containing Holy Grail in same directory as in/path.txt
+ call feedkeys(":find stu\t\n", "xt")
+ call assert_equal('Another Holy Grail', getline(1))
+
+ enew | only
+ exe 'cd ' . cwd
+ call delete('Xfind', 'rf')
+ set path&
+ let &shellslash = shellslash
+endfunc
diff --git a/src/nvim/testdir/test_findfile.vim b/src/nvim/testdir/test_findfile.vim
new file mode 100644
index 0000000000..d9a89801ea
--- /dev/null
+++ b/src/nvim/testdir/test_findfile.vim
@@ -0,0 +1,25 @@
+" Test for findfile()
+"
+func Test_findfile()
+ new
+ let cwd=getcwd()
+ cd ..
+
+ " Tests may be run from a shadow directory, so an extra cd needs to be done to
+ " get above src/
+ if fnamemodify(getcwd(), ':t') != 'src'
+ cd ../..
+ else
+ cd ..
+ endif
+ set ssl
+
+ call assert_equal('src/nvim/testdir/test_findfile.vim', findfile('test_findfile.vim','src/nvim/test*'))
+ exe "cd" cwd
+ cd ..
+ call assert_equal('testdir/test_findfile.vim', findfile('test_findfile.vim','test*'))
+ call assert_equal('testdir/test_findfile.vim', findfile('test_findfile.vim','testdir'))
+
+ exe "cd" cwd
+ q!
+endfunc
diff --git a/src/nvim/testdir/test_fixeol.vim b/src/nvim/testdir/test_fixeol.vim
new file mode 100644
index 0000000000..32cb059e26
--- /dev/null
+++ b/src/nvim/testdir/test_fixeol.vim
@@ -0,0 +1,48 @@
+" Tests for 'fixeol' and 'eol'
+func Test_fixeol()
+ " first write two test files โ€“ with and without trailing EOL
+ " use Unix fileformat for consistency
+ set ff=unix
+ enew!
+ call setline('.', 'with eol')
+ w! XXEol
+ enew!
+ set noeol nofixeol
+ call setline('.', 'without eol')
+ w! XXNoEol
+ set eol fixeol
+ bwipe XXEol XXNoEol
+
+ " try editing files with 'fixeol' disabled
+ e! XXEol
+ normal ostays eol
+ set nofixeol
+ w! XXTestEol
+ e! XXNoEol
+ normal ostays without
+ set nofixeol
+ w! XXTestNoEol
+ bwipe! XXEol XXNoEol XXTestEol XXTestNoEol
+ set fixeol
+
+ " Append "END" to each file so that we can see what the last written char
+ " was.
+ normal ggdGaEND
+ w >>XXEol
+ w >>XXNoEol
+ w >>XXTestEol
+ w >>XXTestNoEol
+
+ call assert_equal(['with eol', 'END'], readfile('XXEol'))
+ call assert_equal(['without eolEND'], readfile('XXNoEol'))
+ call assert_equal(['with eol', 'stays eol', 'END'], readfile('XXTestEol'))
+ call assert_equal(['without eol', 'stays withoutEND'],
+ \ readfile('XXTestNoEol'))
+
+ call delete('XXEol')
+ call delete('XXNoEol')
+ call delete('XXTestEol')
+ call delete('XXTestNoEol')
+ set ff& fixeol& eol&
+ enew!
+endfunc
diff --git a/src/nvim/testdir/test_float_func.vim b/src/nvim/testdir/test_float_func.vim
new file mode 100644
index 0000000000..5ea5192994
--- /dev/null
+++ b/src/nvim/testdir/test_float_func.vim
@@ -0,0 +1,332 @@
+" test float functions
+
+if !has('float')
+ finish
+end
+
+func Test_abs()
+ call assert_equal('1.23', string(abs(1.23)))
+ call assert_equal('1.23', string(abs(-1.23)))
+ call assert_equal('0.0', string(abs(0.0)))
+ call assert_equal('0.0', string(abs(1.0/(1.0/0.0))))
+ call assert_equal('0.0', string(abs(-1.0/(1.0/0.0))))
+ call assert_equal("str2float('inf')", string(abs(1.0/0.0)))
+ call assert_equal("str2float('inf')", string(abs(-1.0/0.0)))
+ call assert_equal("str2float('nan')", string(abs(0.0/0.0)))
+ call assert_equal('12', string(abs('-12abc')))
+ call assert_fails("call abs([])", 'E745:')
+ call assert_fails("call abs({})", 'E728:')
+ call assert_fails("call abs(function('string'))", 'E703:')
+endfunc
+
+func Test_sqrt()
+ call assert_equal('0.0', string(sqrt(0.0)))
+ call assert_equal('1.414214', string(sqrt(2.0)))
+ call assert_equal("str2float('inf')", string(sqrt(1.0/0.0)))
+ call assert_equal("str2float('nan')", string(sqrt(-1.0)))
+ call assert_equal("str2float('nan')", string(sqrt(0.0/0.0)))
+ call assert_fails('call sqrt("")', 'E808:')
+endfunc
+
+func Test_log()
+ call assert_equal('0.0', string(log(1.0)))
+ call assert_equal('-0.693147', string(log(0.5)))
+ call assert_equal("-str2float('inf')", string(log(0.0)))
+ call assert_equal("str2float('nan')", string(log(-1.0)))
+ call assert_equal("str2float('inf')", string(log(1.0/0.0)))
+ call assert_equal("str2float('nan')", string(log(0.0/0.0)))
+ call assert_fails('call log("")', 'E808:')
+endfunc
+
+func Test_log10()
+ call assert_equal('0.0', string(log10(1.0)))
+ call assert_equal('2.0', string(log10(100.0)))
+ call assert_equal('2.079181', string(log10(120.0)))
+ call assert_equal("-str2float('inf')", string(log10(0.0)))
+ call assert_equal("str2float('nan')", string(log10(-1.0)))
+ call assert_equal("str2float('inf')", string(log10(1.0/0.0)))
+ call assert_equal("str2float('nan')", string(log10(0.0/0.0)))
+ call assert_fails('call log10("")', 'E808:')
+endfunc
+
+func Test_exp()
+ call assert_equal('1.0', string(exp(0.0)))
+ call assert_equal('7.389056', string(exp(2.0)))
+ call assert_equal('0.367879', string(exp(-1.0)))
+ call assert_equal("str2float('inf')", string(exp(1.0/0.0)))
+ call assert_equal('0.0', string(exp(-1.0/0.0)))
+ call assert_equal("str2float('nan')", string(exp(0.0/0.0)))
+ call assert_fails('call exp("")', 'E808:')
+endfunc
+
+func Test_sin()
+ call assert_equal('0.0', string(sin(0.0)))
+ call assert_equal('0.841471', string(sin(1.0)))
+ call assert_equal('-0.479426', string(sin(-0.5)))
+ call assert_equal("str2float('nan')", string(sin(0.0/0.0)))
+ call assert_equal("str2float('nan')", string(sin(1.0/0.0)))
+ call assert_equal('0.0', string(sin(1.0/(1.0/0.0))))
+ call assert_equal('-0.0', string(sin(-1.0/(1.0/0.0))))
+ call assert_fails('call sin("")', 'E808:')
+endfunc
+
+func Test_asin()
+ call assert_equal('0.0', string(asin(0.0)))
+ call assert_equal('1.570796', string(asin(1.0)))
+ call assert_equal('-0.523599', string(asin(-0.5)))
+ call assert_equal("str2float('nan')", string(asin(1.1)))
+ call assert_equal("str2float('nan')", string(asin(1.0/0.0)))
+ call assert_equal("str2float('nan')", string(asin(0.0/0.0)))
+ call assert_fails('call asin("")', 'E808:')
+endfunc
+
+func Test_sinh()
+ call assert_equal('0.0', string(sinh(0.0)))
+ call assert_equal('0.521095', string(sinh(0.5)))
+ call assert_equal('-1.026517', string(sinh(-0.9)))
+ call assert_equal("str2float('inf')", string(sinh(1.0/0.0)))
+ call assert_equal("-str2float('inf')", string(sinh(-1.0/0.0)))
+ call assert_equal("str2float('nan')", string(sinh(0.0/0.0)))
+ call assert_fails('call sinh("")', 'E808:')
+endfunc
+
+func Test_cos()
+ call assert_equal('1.0', string(cos(0.0)))
+ call assert_equal('0.540302', string(cos(1.0)))
+ call assert_equal('0.877583', string(cos(-0.5)))
+ call assert_equal("str2float('nan')", string(cos(0.0/0.0)))
+ call assert_equal("str2float('nan')", string(cos(1.0/0.0)))
+ call assert_fails('call cos("")', 'E808:')
+endfunc
+
+func Test_acos()
+ call assert_equal('1.570796', string(acos(0.0)))
+ call assert_equal('0.0', string(acos(1.0)))
+ call assert_equal('3.141593', string(acos(-1.0)))
+ call assert_equal('2.094395', string(acos(-0.5)))
+ call assert_equal("str2float('nan')", string(acos(1.1)))
+ call assert_equal("str2float('nan')", string(acos(1.0/0.0)))
+ call assert_equal("str2float('nan')", string(acos(0.0/0.0)))
+ call assert_fails('call acos("")', 'E808:')
+endfunc
+
+func Test_cosh()
+ call assert_equal('1.0', string(cosh(0.0)))
+ call assert_equal('1.127626', string(cosh(0.5)))
+ call assert_equal("str2float('inf')", string(cosh(1.0/0.0)))
+ call assert_equal("str2float('inf')", string(cosh(-1.0/0.0)))
+ call assert_equal("str2float('nan')", string(cosh(0.0/0.0)))
+ call assert_fails('call cosh("")', 'E808:')
+endfunc
+
+func Test_tan()
+ call assert_equal('0.0', string(tan(0.0)))
+ call assert_equal('0.546302', string(tan(0.5)))
+ call assert_equal('-0.546302', string(tan(-0.5)))
+ call assert_equal("str2float('nan')", string(tan(1.0/0.0)))
+ call assert_equal("str2float('nan')", string(cos(0.0/0.0)))
+ call assert_equal('0.0', string(tan(1.0/(1.0/0.0))))
+ call assert_equal('-0.0', string(tan(-1.0/(1.0/0.0))))
+ call assert_fails('call tan("")', 'E808:')
+endfunc
+
+func Test_atan()
+ call assert_equal('0.0', string(atan(0.0)))
+ call assert_equal('0.463648', string(atan(0.5)))
+ call assert_equal('-0.785398', string(atan(-1.0)))
+ call assert_equal('1.570796', string(atan(1.0/0.0)))
+ call assert_equal('-1.570796', string(atan(-1.0/0.0)))
+ call assert_equal("str2float('nan')", string(atan(0.0/0.0)))
+ call assert_fails('call atan("")', 'E808:')
+endfunc
+
+func Test_atan2()
+ call assert_equal('-2.356194', string(atan2(-1, -1)))
+ call assert_equal('2.356194', string(atan2(1, -1)))
+ call assert_equal('0.0', string(atan2(1.0, 1.0/0.0)))
+ call assert_equal('1.570796', string(atan2(1.0/0.0, 1.0)))
+ call assert_equal("str2float('nan')", string(atan2(0.0/0.0, 1.0)))
+ call assert_fails('call atan2("", -1)', 'E808:')
+ call assert_fails('call atan2(-1, "")', 'E808:')
+endfunc
+
+func Test_tanh()
+ call assert_equal('0.0', string(tanh(0.0)))
+ call assert_equal('0.462117', string(tanh(0.5)))
+ call assert_equal('-0.761594', string(tanh(-1.0)))
+ call assert_equal('1.0', string(tanh(1.0/0.0)))
+ call assert_equal('-1.0', string(tanh(-1.0/0.0)))
+ call assert_equal("str2float('nan')", string(tanh(0.0/0.0)))
+ call assert_fails('call tanh("")', 'E808:')
+endfunc
+
+func Test_fmod()
+ call assert_equal('0.13', string(fmod(12.33, 1.22)))
+ call assert_equal('-0.13', string(fmod(-12.33, 1.22)))
+ call assert_equal("str2float('nan')", string(fmod(1.0/0.0, 1.0)))
+ " On Windows we get "nan" instead of 1.0, accept both.
+ let res = string(fmod(1.0, 1.0/0.0))
+ if res != "str2float('nan')"
+ call assert_equal('1.0', res)
+ endif
+ call assert_equal("str2float('nan')", string(fmod(1.0, 0.0)))
+ call assert_fails("call fmod('', 1.22)", 'E808:')
+ call assert_fails("call fmod(12.33, '')", 'E808:')
+endfunc
+
+func Test_pow()
+ call assert_equal('1.0', string(pow(0.0, 0.0)))
+ call assert_equal('8.0', string(pow(2.0, 3.0)))
+ call assert_equal("str2float('nan')", string(pow(2.0, 0.0/0.0)))
+ call assert_equal("str2float('nan')", string(pow(0.0/0.0, 3.0)))
+ call assert_equal("str2float('nan')", string(pow(0.0/0.0, 3.0)))
+ call assert_equal("str2float('inf')", string(pow(2.0, 1.0/0.0)))
+ call assert_equal("str2float('inf')", string(pow(1.0/0.0, 3.0)))
+ call assert_fails("call pow('', 2.0)", 'E808:')
+ call assert_fails("call pow(2.0, '')", 'E808:')
+endfunc
+
+func Test_str2float()
+ call assert_equal('1.0', string(str2float('1')))
+ call assert_equal('1.0', string(str2float(' 1 ')))
+ call assert_equal('1.0', string(str2float(' 1.0 ')))
+ call assert_equal('1.23', string(str2float('1.23')))
+ call assert_equal('1.23', string(str2float('1.23abc')))
+ call assert_equal('1.0e40', string(str2float('1e40')))
+ call assert_equal('-1.23', string(str2float('-1.23')))
+ call assert_equal('1.23', string(str2float(' + 1.23 ')))
+
+ call assert_equal('1.0', string(str2float('+1')))
+ call assert_equal('1.0', string(str2float('+1')))
+ call assert_equal('1.0', string(str2float(' +1 ')))
+ call assert_equal('1.0', string(str2float(' + 1 ')))
+
+ call assert_equal('-1.0', string(str2float('-1')))
+ call assert_equal('-1.0', string(str2float('-1')))
+ call assert_equal('-1.0', string(str2float(' -1 ')))
+ call assert_equal('-1.0', string(str2float(' - 1 ')))
+
+ call assert_equal('0.0', string(str2float('+0.0')))
+ call assert_equal('-0.0', string(str2float('-0.0')))
+ call assert_equal("str2float('inf')", string(str2float('1e1000')))
+ call assert_equal("str2float('inf')", string(str2float('inf')))
+ call assert_equal("-str2float('inf')", string(str2float('-inf')))
+ call assert_equal("str2float('inf')", string(str2float('+inf')))
+ call assert_equal("str2float('inf')", string(str2float('Inf')))
+ call assert_equal("str2float('inf')", string(str2float(' +inf ')))
+ call assert_equal("str2float('nan')", string(str2float('nan')))
+ call assert_equal("str2float('nan')", string(str2float('NaN')))
+ call assert_equal("str2float('nan')", string(str2float(' nan ')))
+
+ call assert_fails("call str2float(1.2)", 'E806:')
+ call assert_fails("call str2float([])", 'E730:')
+ call assert_fails("call str2float({})", 'E731:')
+ call assert_fails("call str2float(function('string'))", 'E729:')
+endfunc
+
+func Test_float2nr()
+ call assert_equal(1, float2nr(1.234))
+ call assert_equal(123, float2nr(1.234e2))
+ call assert_equal(12, float2nr(123.4e-1))
+ let max_number = 1/0
+ let min_number = -max_number
+ call assert_equal(max_number/2+1, float2nr(pow(2, 62)))
+ call assert_equal(max_number, float2nr(pow(2, 63)))
+ call assert_equal(max_number, float2nr(pow(2, 64)))
+ call assert_equal(min_number/2-1, float2nr(-pow(2, 62)))
+ call assert_equal(min_number, float2nr(-pow(2, 63)))
+ call assert_equal(min_number, float2nr(-pow(2, 64)))
+endfunc
+
+func Test_floor()
+ call assert_equal('2.0', string(floor(2.0)))
+ call assert_equal('2.0', string(floor(2.11)))
+ call assert_equal('2.0', string(floor(2.99)))
+ call assert_equal('-3.0', string(floor(-2.11)))
+ call assert_equal('-3.0', string(floor(-2.99)))
+ call assert_equal("str2float('nan')", string(floor(0.0/0.0)))
+ call assert_equal("str2float('inf')", string(floor(1.0/0.0)))
+ call assert_equal("-str2float('inf')", string(floor(-1.0/0.0)))
+ call assert_fails("call floor('')", 'E808:')
+endfunc
+
+func Test_ceil()
+ call assert_equal('2.0', string(ceil(2.0)))
+ call assert_equal('3.0', string(ceil(2.11)))
+ call assert_equal('3.0', string(ceil(2.99)))
+ call assert_equal('-2.0', string(ceil(-2.11)))
+ call assert_equal('-2.0', string(ceil(-2.99)))
+ call assert_equal("str2float('nan')", string(ceil(0.0/0.0)))
+ call assert_equal("str2float('inf')", string(ceil(1.0/0.0)))
+ call assert_equal("-str2float('inf')", string(ceil(-1.0/0.0)))
+ call assert_fails("call ceil('')", 'E808:')
+endfunc
+
+func Test_round()
+ call assert_equal('2.0', string(round(2.1)))
+ call assert_equal('3.0', string(round(2.5)))
+ call assert_equal('3.0', string(round(2.9)))
+ call assert_equal('-2.0', string(round(-2.1)))
+ call assert_equal('-3.0', string(round(-2.5)))
+ call assert_equal('-3.0', string(round(-2.9)))
+ call assert_equal("str2float('nan')", string(round(0.0/0.0)))
+ call assert_equal("str2float('inf')", string(round(1.0/0.0)))
+ call assert_equal("-str2float('inf')", string(round(-1.0/0.0)))
+ call assert_fails("call round('')", 'E808:')
+endfunc
+
+func Test_trunc()
+ call assert_equal('2.0', string(trunc(2.1)))
+ call assert_equal('2.0', string(trunc(2.5)))
+ call assert_equal('2.0', string(trunc(2.9)))
+ call assert_equal('-2.0', string(trunc(-2.1)))
+ call assert_equal('-2.0', string(trunc(-2.5)))
+ call assert_equal('-2.0', string(trunc(-2.9)))
+ call assert_equal("str2float('nan')", string(trunc(0.0/0.0)))
+ call assert_equal("str2float('inf')", string(trunc(1.0/0.0)))
+ call assert_equal("-str2float('inf')", string(trunc(-1.0/0.0)))
+ call assert_fails("call trunc('')", 'E808:')
+endfunc
+
+func Test_isnan()
+ throw 'skipped: Nvim does not support isnan()'
+ call assert_equal(0, isnan(1.0))
+ call assert_equal(1, isnan(0.0/0.0))
+ call assert_equal(0, isnan(1.0/0.0))
+ call assert_equal(0, isnan('a'))
+ call assert_equal(0, isnan([]))
+ call assert_equal(0, isnan({}))
+endfunc
+
+" This was converted from test65
+func Test_float_misc()
+ call assert_equal('123.456000', printf('%f', 123.456))
+ call assert_equal('1.234560e+02', printf('%e', 123.456))
+ call assert_equal('123.456', printf('%g', 123.456))
+ " +=
+ let v = 1.234
+ let v += 6.543
+ call assert_equal('7.777', printf('%g', v))
+ let v = 1.234
+ let v += 5
+ call assert_equal('6.234', printf('%g', v))
+ let v = 5
+ let v += 3.333
+ call assert_equal('8.333', string(v))
+ " ==
+ let v = 1.234
+ call assert_true(v == 1.234)
+ call assert_false(v == 1.2341)
+ " add-subtract
+ call assert_equal('5.234', printf('%g', 4 + 1.234))
+ call assert_equal('-6.766', printf('%g', 1.234 - 8))
+ " mult-div
+ call assert_equal('4.936', printf('%g', 4 * 1.234))
+ call assert_equal('0.003241', printf('%g', 4.0 / 1234))
+ " dict
+ call assert_equal("{'x': 1.234, 'y': -2.0e20}", string({'x': 1.234, 'y': -2.0e20}))
+ " list
+ call assert_equal('[-123.4, 2.0e-20]', string([-123.4, 2.0e-20]))
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_fnameescape.vim b/src/nvim/testdir/test_fnameescape.vim
new file mode 100644
index 0000000000..cdff0dfbd9
--- /dev/null
+++ b/src/nvim/testdir/test_fnameescape.vim
@@ -0,0 +1,21 @@
+
+" Test if fnameescape is correct for special chars like !
+function! Test_fnameescape()
+ let fname = 'Xspa ce'
+ let status = v:false
+ try
+ exe "w! " . fnameescape(fname)
+ let status = v:true
+ endtry
+ call assert_true(status, "Space")
+ call delete(fname)
+
+ let fname = 'Xemark!'
+ let status = v:false
+ try
+ exe "w! " . fnameescape(fname)
+ let status = v:true
+ endtry
+ call assert_true(status, "ExclamationMark")
+ call delete(fname)
+endfunction
diff --git a/src/nvim/testdir/test_fold.vim b/src/nvim/testdir/test_fold.vim
new file mode 100644
index 0000000000..df3d691d85
--- /dev/null
+++ b/src/nvim/testdir/test_fold.vim
@@ -0,0 +1,742 @@
+" Test for folding
+
+source view_util.vim
+
+func PrepIndent(arg)
+ return [a:arg] + repeat(["\t".a:arg], 5)
+endfu
+
+func Test_address_fold()
+ new
+ call setline(1, ['int FuncName() {/*{{{*/', 1, 2, 3, 4, 5, '}/*}}}*/',
+ \ 'after fold 1', 'after fold 2', 'after fold 3'])
+ setl fen fdm=marker
+ " The next commands should all copy the same part of the buffer,
+ " regardless of the addressing type, since the part to be copied
+ " is folded away
+ :1y
+ call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
+ :.y
+ call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
+ :.+y
+ call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
+ :.,.y
+ call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
+ :sil .1,.y
+ call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
+ " use silent to make E493 go away
+ :sil .+,.y
+ call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
+ :,y
+ call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
+ :,+y
+ call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/','after fold 1'], getreg(0,1,1))
+ " using .+3 as second address should copy the whole folded line + the next 3
+ " lines
+ :.,+3y
+ call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/',
+ \ 'after fold 1', 'after fold 2', 'after fold 3'], getreg(0,1,1))
+ :sil .,-2y
+ call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
+
+ " now test again with folding disabled
+ set nofoldenable
+ :1y
+ call assert_equal(['int FuncName() {/*{{{*/'], getreg(0,1,1))
+ :.y
+ call assert_equal(['int FuncName() {/*{{{*/'], getreg(0,1,1))
+ :.+y
+ call assert_equal(['1'], getreg(0,1,1))
+ :.,.y
+ call assert_equal(['int FuncName() {/*{{{*/'], getreg(0,1,1))
+ " use silent to make E493 go away
+ :sil .1,.y
+ call assert_equal(['int FuncName() {/*{{{*/', '1'], getreg(0,1,1))
+ " use silent to make E493 go away
+ :sil .+,.y
+ call assert_equal(['int FuncName() {/*{{{*/', '1'], getreg(0,1,1))
+ :,y
+ call assert_equal(['int FuncName() {/*{{{*/'], getreg(0,1,1))
+ :,+y
+ call assert_equal(['int FuncName() {/*{{{*/', '1'], getreg(0,1,1))
+ " using .+3 as second address should copy the whole folded line + the next 3
+ " lines
+ :.,+3y
+ call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3'], getreg(0,1,1))
+ :7
+ :sil .,-2y
+ call assert_equal(['4', '5', '}/*}}}*/'], getreg(0,1,1))
+
+ quit!
+endfunc
+
+func Test_indent_fold()
+ new
+ call setline(1, ['', 'a', ' b', ' c'])
+ setl fen fdm=indent
+ 2
+ norm! >>
+ let a=map(range(1,4), 'foldclosed(v:val)')
+ call assert_equal([-1,-1,-1,-1], a)
+ bw!
+endfunc
+
+func Test_indent_fold2()
+ new
+ call setline(1, ['', '{{{', '}}}', '{{{', '}}}'])
+ setl fen fdm=marker
+ 2
+ norm! >>
+ let a=map(range(1,5), 'foldclosed(v:val)')
+ call assert_equal([-1,-1,-1,4,4], a)
+ bw!
+endfunc
+
+func Test_manual_fold_with_filter()
+ if !executable('cat')
+ return
+ endif
+ for type in ['manual', 'marker']
+ exe 'set foldmethod=' . type
+ new
+ call setline(1, range(1, 20))
+ 4,$fold
+ %foldopen
+ 10,$fold
+ %foldopen
+ " This filter command should not have an effect
+ 1,8! cat
+ call feedkeys('5ggzdzMGdd', 'xt')
+ call assert_equal(['1', '2', '3', '4', '5', '6', '7', '8', '9'], getline(1, '$'))
+
+ bwipe!
+ set foldmethod&
+ endfor
+endfunc
+
+func Test_indent_fold_with_read()
+ new
+ set foldmethod=indent
+ call setline(1, repeat(["\<Tab>a"], 4))
+ for n in range(1, 4)
+ call assert_equal(1, foldlevel(n))
+ endfor
+
+ call writefile(["a", "", "\<Tab>a"], 'Xfile')
+ foldopen
+ 2read Xfile
+ %foldclose
+ call assert_equal(1, foldlevel(1))
+ call assert_equal(2, foldclosedend(1))
+ call assert_equal(0, foldlevel(3))
+ call assert_equal(0, foldlevel(4))
+ call assert_equal(1, foldlevel(5))
+ call assert_equal(7, foldclosedend(5))
+
+ bwipe!
+ set foldmethod&
+ call delete('Xfile')
+endfunc
+
+func Test_combining_folds_indent()
+ new
+ let one = "\<Tab>a"
+ let zero = 'a'
+ call setline(1, [one, one, zero, zero, zero, one, one, one])
+ set foldmethod=indent
+ 3,5d
+ %foldclose
+ call assert_equal(5, foldclosedend(1))
+
+ set foldmethod&
+ bwipe!
+endfunc
+
+func Test_combining_folds_marker()
+ new
+ call setline(1, ['{{{', '}}}', '', '', '', '{{{', '', '}}}'])
+ set foldmethod=marker
+ 3,5d
+ %foldclose
+ call assert_equal(2, foldclosedend(1))
+
+ set foldmethod&
+ bwipe!
+endfunc
+
+func Test_folds_marker_in_comment()
+ new
+ call setline(1, ['" foo', 'bar', 'baz'])
+ setl fen fdm=marker
+ setl com=sO:\"\ -,mO:\"\ \ ,eO:\"\",:\" cms=\"%s
+ norm! zf2j
+ setl nofen
+ :1y
+ call assert_equal(['" foo{{{'], getreg(0,1,1))
+ :+2y
+ call assert_equal(['baz"}}}'], getreg(0,1,1))
+
+ set foldmethod&
+ bwipe!
+endfunc
+
+func s:TestFoldExpr(lnum)
+ let thisline = getline(a:lnum)
+ if thisline == 'a'
+ return 1
+ elseif thisline == 'b'
+ return 0
+ elseif thisline == 'c'
+ return '<1'
+ elseif thisline == 'd'
+ return '>1'
+ endif
+ return 0
+endfunction
+
+func Test_update_folds_expr_read()
+ new
+ call setline(1, ['a', 'a', 'a', 'a', 'a', 'a'])
+ set foldmethod=expr
+ set foldexpr=s:TestFoldExpr(v:lnum)
+ 2
+ foldopen
+ call writefile(['b', 'b', 'a', 'a', 'd', 'a', 'a', 'c'], 'Xfile')
+ read Xfile
+ %foldclose
+ call assert_equal(2, foldclosedend(1))
+ call assert_equal(0, foldlevel(3))
+ call assert_equal(0, foldlevel(4))
+ call assert_equal(6, foldclosedend(5))
+ call assert_equal(10, foldclosedend(7))
+ call assert_equal(14, foldclosedend(11))
+
+ call delete('Xfile')
+ bwipe!
+ set foldmethod& foldexpr&
+endfunc
+
+func Check_foldlevels(expected)
+ call assert_equal(a:expected, map(range(1, line('$')), 'foldlevel(v:val)'))
+endfunc
+
+func Test_move_folds_around_manual()
+ new
+ let input = PrepIndent("a") + PrepIndent("b") + PrepIndent("c")
+ call setline(1, PrepIndent("a") + PrepIndent("b") + PrepIndent("c"))
+ let folds=[-1, 2, 2, 2, 2, 2, -1, 8, 8, 8, 8, 8, -1, 14, 14, 14, 14, 14]
+ " all folds closed
+ set foldenable foldlevel=0 fdm=indent
+ " needs a forced redraw
+ redraw!
+ set fdm=manual
+ call assert_equal(folds, map(range(1, line('$')), 'foldclosed(v:val)'))
+ call assert_equal(input, getline(1, '$'))
+ 7,12m0
+ call assert_equal(PrepIndent("b") + PrepIndent("a") + PrepIndent("c"), getline(1, '$'))
+ call assert_equal(folds, map(range(1, line('$')), 'foldclosed(v:val)'))
+ 10,12m0
+ call assert_equal(PrepIndent("a")[1:] + PrepIndent("b") + ["a"] + PrepIndent("c"), getline(1, '$'))
+ call assert_equal([1, 1, 1, 1, 1, -1, 7, 7, 7, 7, 7, -1, -1, 14, 14, 14, 14, 14], map(range(1, line('$')), 'foldclosed(v:val)'))
+ " moving should not close the folds
+ %d
+ call setline(1, PrepIndent("a") + PrepIndent("b") + PrepIndent("c"))
+ set fdm=indent
+ redraw!
+ set fdm=manual
+ call cursor(2, 1)
+ %foldopen
+ 7,12m0
+ let folds=repeat([-1], 18)
+ call assert_equal(PrepIndent("b") + PrepIndent("a") + PrepIndent("c"), getline(1, '$'))
+ call assert_equal(folds, map(range(1, line('$')), 'foldclosed(v:val)'))
+ norm! zM
+ " folds are not corrupted and all have been closed
+ call assert_equal([-1, 2, 2, 2, 2, 2, -1, 8, 8, 8, 8, 8, -1, 14, 14, 14, 14, 14], map(range(1, line('$')), 'foldclosed(v:val)'))
+ %d
+ call setline(1, ["a", "\tb", "\tc", "\td", "\te"])
+ set fdm=indent
+ redraw!
+ set fdm=manual
+ %foldopen
+ 3m4
+ %foldclose
+ call assert_equal(["a", "\tb", "\td", "\tc", "\te"], getline(1, '$'))
+ call assert_equal([-1, 5, 5, 5, 5], map(range(1, line('$')), 'foldclosedend(v:val)'))
+ %d
+ call setline(1, ["a", "\tb", "\tc", "\td", "\te", "z", "\ty", "\tx", "\tw", "\tv"])
+ set fdm=indent foldlevel=0
+ set fdm=manual
+ %foldopen
+ 3m1
+ %foldclose
+ call assert_equal(["a", "\tc", "\tb", "\td", "\te", "z", "\ty", "\tx", "\tw", "\tv"], getline(1, '$'))
+ call assert_equal(0, foldlevel(2))
+ call assert_equal(5, foldclosedend(3))
+ call assert_equal([-1, -1, 3, 3, 3, -1, 7, 7, 7, 7], map(range(1, line('$')), 'foldclosed(v:val)'))
+ 2,6m$
+ %foldclose
+ call assert_equal(5, foldclosedend(2))
+ call assert_equal(0, foldlevel(6))
+ call assert_equal(9, foldclosedend(7))
+ call assert_equal([-1, 2, 2, 2, 2, -1, 7, 7, 7, -1], map(range(1, line('$')), 'foldclosed(v:val)'))
+
+ %d
+ " Ensure moving around the edges still works.
+ call setline(1, PrepIndent("a") + repeat(["a"], 3) + ["\ta"])
+ set fdm=indent foldlevel=0
+ set fdm=manual
+ %foldopen
+ 6m$
+ " The first fold has been truncated to the 5'th line.
+ " Second fold has been moved up because the moved line is now below it.
+ call Check_foldlevels([0, 1, 1, 1, 1, 0, 0, 0, 1, 0])
+
+ %delete
+ set fdm=indent foldlevel=0
+ call setline(1, [
+ \ "a",
+ \ "\ta",
+ \ "\t\ta",
+ \ "\t\ta",
+ \ "\t\ta",
+ \ "a",
+ \ "a"])
+ set fdm=manual
+ %foldopen!
+ 4,5m6
+ call Check_foldlevels([0, 1, 2, 0, 0, 0, 0])
+
+ %delete
+ set fdm=indent
+ call setline(1, [
+ \ "\ta",
+ \ "\t\ta",
+ \ "\t\ta",
+ \ "\t\ta",
+ \ "\ta",
+ \ "\t\ta",
+ \ "\t\ta",
+ \ "\t\ta",
+ \ "\ta",
+ \ "\t\ta",
+ \ "\t\ta",
+ \ "\t\ta",
+ \ "\t\ta",
+ \ "\ta",
+ \ "a"])
+ set fdm=manual
+ %foldopen!
+ 13m7
+ call Check_foldlevels([1, 2, 2, 2, 1, 2, 2, 1, 1, 1, 2, 2, 2, 1, 0])
+
+ bw!
+endfunc
+
+func Test_move_folds_around_indent()
+ new
+ let input = PrepIndent("a") + PrepIndent("b") + PrepIndent("c")
+ call setline(1, PrepIndent("a") + PrepIndent("b") + PrepIndent("c"))
+ let folds=[-1, 2, 2, 2, 2, 2, -1, 8, 8, 8, 8, 8, -1, 14, 14, 14, 14, 14]
+ " all folds closed
+ set fdm=indent
+ call assert_equal(folds, map(range(1, line('$')), 'foldclosed(v:val)'))
+ call assert_equal(input, getline(1, '$'))
+ 7,12m0
+ call assert_equal(PrepIndent("b") + PrepIndent("a") + PrepIndent("c"), getline(1, '$'))
+ call assert_equal(folds, map(range(1, line('$')), 'foldclosed(v:val)'))
+ 10,12m0
+ call assert_equal(PrepIndent("a")[1:] + PrepIndent("b") + ["a"] + PrepIndent("c"), getline(1, '$'))
+ call assert_equal([1, 1, 1, 1, 1, -1, 7, 7, 7, 7, 7, -1, -1, 14, 14, 14, 14, 14], map(range(1, line('$')), 'foldclosed(v:val)'))
+ " moving should not close the folds
+ %d
+ call setline(1, PrepIndent("a") + PrepIndent("b") + PrepIndent("c"))
+ set fdm=indent
+ call cursor(2, 1)
+ %foldopen
+ 7,12m0
+ let folds=repeat([-1], 18)
+ call assert_equal(PrepIndent("b") + PrepIndent("a") + PrepIndent("c"), getline(1, '$'))
+ call assert_equal(folds, map(range(1, line('$')), 'foldclosed(v:val)'))
+ norm! zM
+ " folds are not corrupted and all have been closed
+ call assert_equal([-1, 2, 2, 2, 2, 2, -1, 8, 8, 8, 8, 8, -1, 14, 14, 14, 14, 14], map(range(1, line('$')), 'foldclosed(v:val)'))
+ %d
+ call setline(1, ["a", "\tb", "\tc", "\td", "\te"])
+ set fdm=indent
+ %foldopen
+ 3m4
+ %foldclose
+ call assert_equal(["a", "\tb", "\td", "\tc", "\te"], getline(1, '$'))
+ call assert_equal([-1, 5, 5, 5, 5], map(range(1, line('$')), 'foldclosedend(v:val)'))
+ %d
+ call setline(1, ["a", "\tb", "\tc", "\td", "\te", "z", "\ty", "\tx", "\tw", "\tv"])
+ set fdm=indent foldlevel=0
+ %foldopen
+ 3m1
+ %foldclose
+ call assert_equal(["a", "\tc", "\tb", "\td", "\te", "z", "\ty", "\tx", "\tw", "\tv"], getline(1, '$'))
+ call assert_equal(1, foldlevel(2))
+ call assert_equal(5, foldclosedend(3))
+ call assert_equal([-1, 2, 2, 2, 2, -1, 7, 7, 7, 7], map(range(1, line('$')), 'foldclosed(v:val)'))
+ 2,6m$
+ %foldclose
+ call assert_equal(9, foldclosedend(2))
+ call assert_equal(1, foldlevel(6))
+ call assert_equal(9, foldclosedend(7))
+ call assert_equal([-1, 2, 2, 2, 2, 2, 2, 2, 2, -1], map(range(1, line('$')), 'foldclosed(v:val)'))
+ " Ensure moving around the edges still works.
+ %d
+ call setline(1, PrepIndent("a") + repeat(["a"], 3) + ["\ta"])
+ set fdm=indent foldlevel=0
+ %foldopen
+ 6m$
+ " The first fold has been truncated to the 5'th line.
+ " Second fold has been moved up because the moved line is now below it.
+ call Check_foldlevels([0, 1, 1, 1, 1, 0, 0, 0, 1, 1])
+ bw!
+endfunc
+
+" test for patch 7.3.637
+" Cannot catch the error caused by a foldopen when there is no fold.
+func Test_foldopen_exception()
+ enew!
+ let a = 'No error caught'
+ try
+ foldopen
+ catch
+ let a = matchstr(v:exception,'^[^ ]*')
+ endtry
+ call assert_equal('Vim(foldopen):E490:', a)
+
+ let a = 'No error caught'
+ try
+ foobar
+ catch
+ let a = matchstr(v:exception,'^[^ ]*')
+ endtry
+ call assert_match('E492:', a)
+endfunc
+
+func Test_folddoopen_folddoclosed()
+ new
+ call setline(1, range(1, 9))
+ set foldmethod=manual
+ 1,3 fold
+ 6,8 fold
+
+ " Test without range.
+ folddoopen s/$/o/
+ folddoclosed s/$/c/
+ call assert_equal(['1c', '2c', '3c',
+ \ '4o', '5o',
+ \ '6c', '7c', '8c',
+ \ '9o'], getline(1, '$'))
+
+ " Test with range.
+ call setline(1, range(1, 9))
+ 1,8 folddoopen s/$/o/
+ 4,$ folddoclosed s/$/c/
+ call assert_equal(['1', '2', '3',
+ \ '4o', '5o',
+ \ '6c', '7c', '8c',
+ \ '9'], getline(1, '$'))
+
+ set foldmethod&
+ bw!
+endfunc
+
+func Test_fold_error()
+ new
+ call setline(1, [1, 2])
+
+ for fm in ['indent', 'expr', 'syntax', 'diff']
+ exe 'set foldmethod=' . fm
+ call assert_fails('norm zf', 'E350:')
+ call assert_fails('norm zd', 'E351:')
+ call assert_fails('norm zE', 'E352:')
+ endfor
+
+ set foldmethod=manual
+ call assert_fails('norm zd', 'E490:')
+ call assert_fails('norm zo', 'E490:')
+ call assert_fails('3fold', 'E16:')
+
+ set foldmethod=marker
+ set nomodifiable
+ call assert_fails('1,2fold', 'E21:')
+
+ set modifiable&
+ set foldmethod&
+ bw!
+endfunc
+
+" Various fold related tests
+
+" Basic test if a fold can be created, opened, moving to the end and closed
+func Test_fold_manual()
+ enew!
+ set fdm=manual
+
+ let content = ['1 aa', '2 bb', '3 cc']
+ call append(0, content)
+ call cursor(1, 1)
+ normal zf2j
+ call assert_equal('1 aa', getline(foldclosed('.')))
+ normal zo
+ call assert_equal(-1, foldclosed('.'))
+ normal ]z
+ call assert_equal('3 cc', getline('.'))
+ normal zc
+ call assert_equal('1 aa', getline(foldclosed('.')))
+
+ set fdm&
+ enew!
+endfunc
+
+" test folding with markers.
+func Test_fold_marker()
+ enew!
+ set fdm=marker fdl=1 fdc=3
+
+ let content = ['4 dd {{{', '5 ee {{{ }}}', '6 ff }}}']
+ call append(0, content)
+ call cursor(2, 1)
+ call assert_equal(2, foldlevel('.'))
+ normal [z
+ call assert_equal(1, foldlevel('.'))
+ exe "normal jo{{ \<Esc>r{jj"
+ call assert_equal(1, foldlevel('.'))
+ normal kYpj
+ call assert_equal(0, foldlevel('.'))
+
+ set fdm& fdl& fdc&
+ enew!
+endfunc
+
+" test create fold markers with C filetype
+func Test_fold_create_marker_in_C()
+ enew!
+ set fdm=marker fdl=9
+ set filetype=c
+
+ let content = [
+ \ '/*',
+ \ ' * comment',
+ \ ' * ',
+ \ ' *',
+ \ ' */',
+ \ 'int f(int* p) {',
+ \ ' *p = 3;',
+ \ ' return 0;',
+ \ '}'
+ \]
+ for c in range(len(content) - 1)
+ bw!
+ call append(0, content)
+ call cursor(c + 1, 1)
+ norm! zfG
+ call assert_equal(content[c] . (c < 4 ? '{{{' : '/*{{{*/'), getline(c + 1))
+ endfor
+
+ set fdm& fdl&
+ enew!
+endfunc
+
+" test folding with indent
+func Test_fold_indent()
+ enew!
+ set fdm=indent sw=2
+
+ let content = ['1 aa', '2 bb', '3 cc']
+ call append(0, content)
+ call cursor(2, 1)
+ exe "normal i \<Esc>jI "
+ call assert_equal(2, foldlevel('.'))
+ normal k
+ call assert_equal(1, foldlevel('.'))
+
+ set fdm& sw&
+ enew!
+endfunc
+
+" test syntax folding
+func Test_fold_syntax()
+ if !has('syntax')
+ return
+ endif
+
+ enew!
+ set fdm=syntax fdl=0
+
+ syn region Hup start="dd" end="ii" fold contains=Fd1,Fd2,Fd3
+ syn region Fd1 start="ee" end="ff" fold contained
+ syn region Fd2 start="gg" end="hh" fold contained
+ syn region Fd3 start="commentstart" end="commentend" fold contained
+ let content = ['3 cc', '4 dd {{{', '5 ee {{{ }}}', '{{{{', '6 ff }}}',
+ \ '6 ff }}}', '7 gg', '8 hh', '9 ii']
+ call append(0, content)
+ normal Gzk
+ call assert_equal('9 ii', getline('.'))
+ normal k
+ call assert_equal('3 cc', getline('.'))
+ exe "normal jAcommentstart \<Esc>Acommentend"
+ set fdl=1
+ normal 3j
+ call assert_equal('7 gg', getline('.'))
+ set fdl=0
+ exe "normal zO\<C-L>j"
+ call assert_equal('8 hh', getline('.'))
+ syn clear Fd1 Fd2 Fd3 Hup
+
+ set fdm& fdl&
+ enew!
+endfunc
+
+func Flvl()
+ let l = getline(v:lnum)
+ if l =~ "bb$"
+ return 2
+ elseif l =~ "gg$"
+ return "s1"
+ elseif l =~ "ii$"
+ return ">2"
+ elseif l =~ "kk$"
+ return "0"
+ endif
+ return "="
+endfun
+
+" test expression folding
+func Test_fold_expr()
+ enew!
+ set fdm=expr fde=Flvl()
+
+ let content = ['1 aa',
+ \ '2 bb',
+ \ '3 cc',
+ \ '4 dd {{{commentstart commentend',
+ \ '5 ee {{{ }}}',
+ \ '{{{',
+ \ '6 ff }}}',
+ \ '6 ff }}}',
+ \ ' 7 gg',
+ \ ' 8 hh',
+ \ '9 ii',
+ \ 'a jj',
+ \ 'b kk']
+ call append(0, content)
+ call cursor(1, 1)
+ exe "normal /bb$\<CR>"
+ call assert_equal(2, foldlevel('.'))
+ exe "normal /hh$\<CR>"
+ call assert_equal(1, foldlevel('.'))
+ exe "normal /ii$\<CR>"
+ call assert_equal(2, foldlevel('.'))
+ exe "normal /kk$\<CR>"
+ call assert_equal(0, foldlevel('.'))
+
+ set fdm& fde&
+ enew!
+endfunc
+
+" Bug with fdm=indent and moving folds
+" Moving a fold a few times, messes up the folds below the moved fold.
+" Fixed by 7.4.700
+func Test_fold_move()
+ enew!
+ set fdm=indent sw=2 fdl=0
+
+ let content = ['', '', 'Line1', ' Line2', ' Line3',
+ \ 'Line4', ' Line5', ' Line6',
+ \ 'Line7', ' Line8', ' Line9']
+ call append(0, content)
+ normal zM
+ call cursor(4, 1)
+ move 2
+ move 1
+ call assert_equal(7, foldclosed(7))
+ call assert_equal(8, foldclosedend(7))
+ call assert_equal(0, foldlevel(9))
+ call assert_equal(10, foldclosed(10))
+ call assert_equal(11, foldclosedend(10))
+ call assert_equal('+-- 2 lines: Line2', foldtextresult(2))
+ call assert_equal('+-- 2 lines: Line8', foldtextresult(10))
+
+ set fdm& sw& fdl&
+ enew!
+endfunc
+
+func Test_foldtext_recursive()
+ new
+ call setline(1, ['{{{', 'some text', '}}}'])
+ setlocal foldenable foldmethod=marker foldtext=foldtextresult(v\:foldstart)
+ " This was crashing because of endless recursion.
+ 2foldclose
+ redraw
+ call assert_equal(1, foldlevel(2))
+ call assert_equal(1, foldclosed(2))
+ call assert_equal(3, foldclosedend(2))
+ bwipe!
+endfunc
+
+func Test_fold_last_line_with_pagedown()
+ enew!
+ set fdm=manual
+
+ let expect = '+-- 11 lines: 9---'
+ let content = range(1,19)
+ call append(0, content)
+ normal dd9G
+ normal zfG
+ normal zt
+ call assert_equal('9', getline(foldclosed('.')))
+ call assert_equal('19', getline(foldclosedend('.')))
+ call assert_equal(expect, ScreenLines(1, len(expect))[0])
+ call feedkeys("\<C-F>", 'xt')
+ call assert_equal(expect, ScreenLines(1, len(expect))[0])
+ call feedkeys("\<C-F>", 'xt')
+ call assert_equal(expect, ScreenLines(1, len(expect))[0])
+ call feedkeys("\<C-B>\<C-F>\<C-F>", 'xt')
+ call assert_equal(expect, ScreenLines(1, len(expect))[0])
+
+ set fdm&
+ enew!
+endfunc
+
+func Test_folds_with_rnu()
+ if !CanRunVimInTerminal()
+ return
+ endif
+
+ call writefile([
+ \ 'set fdm=marker rnu foldcolumn=2',
+ \ 'call setline(1, ["{{{1", "nline 1", "{{{1", "line 2"])',
+ \ ], 'Xtest_folds_with_rnu')
+ let buf = RunVimInTerminal('-S Xtest_folds_with_rnu', {})
+
+ call VerifyScreenDump(buf, 'Test_folds_with_rnu_01', {})
+ call term_sendkeys(buf, "j")
+ call VerifyScreenDump(buf, 'Test_folds_with_rnu_02', {})
+
+ " clean up
+ call StopVimInTerminal(buf)
+ call delete('Xtest_folds_with_rnu')
+endfunc
+
+func Test_folds_marker_in_comment2()
+ new
+ call setline(1, ['Lorem ipsum dolor sit', 'Lorem ipsum dolor sit', 'Lorem ipsum dolor sit'])
+ setl fen fdm=marker
+ setl commentstring=<!--%s-->
+ setl comments=s:<!--,m:\ \ \ \ ,e:-->
+ norm! zf2j
+ setl nofen
+ :1y
+ call assert_equal(['Lorem ipsum dolor sit<!--{{{-->'], getreg(0,1,1))
+ :+2y
+ call assert_equal(['Lorem ipsum dolor sit<!--}}}-->'], getreg(0,1,1))
+
+ set foldmethod&
+ bwipe!
+endfunc
diff --git a/src/nvim/testdir/test_functions.vim b/src/nvim/testdir/test_functions.vim
new file mode 100644
index 0000000000..7dc9f31ce7
--- /dev/null
+++ b/src/nvim/testdir/test_functions.vim
@@ -0,0 +1,1039 @@
+" Tests for various functions.
+
+" Must be done first, since the alternate buffer must be unset.
+func Test_00_bufexists()
+ call assert_equal(0, bufexists('does_not_exist'))
+ call assert_equal(1, bufexists(bufnr('%')))
+ call assert_equal(0, bufexists(0))
+ new Xfoo
+ let bn = bufnr('%')
+ call assert_equal(1, bufexists(bn))
+ call assert_equal(1, bufexists('Xfoo'))
+ call assert_equal(1, bufexists(getcwd() . '/Xfoo'))
+ call assert_equal(1, bufexists(0))
+ bw
+ call assert_equal(0, bufexists(bn))
+ call assert_equal(0, bufexists('Xfoo'))
+endfunc
+
+func Test_empty()
+ call assert_equal(1, empty(''))
+ call assert_equal(0, empty('a'))
+
+ call assert_equal(1, empty(0))
+ call assert_equal(1, empty(-0))
+ call assert_equal(0, empty(1))
+ call assert_equal(0, empty(-1))
+
+ call assert_equal(1, empty(0.0))
+ call assert_equal(1, empty(-0.0))
+ call assert_equal(0, empty(1.0))
+ call assert_equal(0, empty(-1.0))
+ call assert_equal(0, empty(1.0/0.0))
+ call assert_equal(0, empty(0.0/0.0))
+
+ call assert_equal(1, empty([]))
+ call assert_equal(0, empty(['a']))
+
+ call assert_equal(1, empty({}))
+ call assert_equal(0, empty({'a':1}))
+
+ call assert_equal(1, empty(v:null))
+ " call assert_equal(1, empty(v:none))
+ call assert_equal(1, empty(v:false))
+ call assert_equal(0, empty(v:true))
+
+ if has('channel')
+ call assert_equal(1, empty(test_null_channel()))
+ endif
+ if has('job')
+ call assert_equal(1, empty(test_null_job()))
+ endif
+
+ call assert_equal(0, empty(function('Test_empty')))
+endfunc
+
+func Test_len()
+ call assert_equal(1, len(0))
+ call assert_equal(2, len(12))
+
+ call assert_equal(0, len(''))
+ call assert_equal(2, len('ab'))
+
+ call assert_equal(0, len([]))
+ call assert_equal(2, len([2, 1]))
+
+ call assert_equal(0, len({}))
+ call assert_equal(2, len({'a': 1, 'b': 2}))
+
+ " call assert_fails('call len(v:none)', 'E701:')
+ call assert_fails('call len({-> 0})', 'E701:')
+endfunc
+
+func Test_max()
+ call assert_equal(0, max([]))
+ call assert_equal(2, max([2]))
+ call assert_equal(2, max([1, 2]))
+ call assert_equal(2, max([1, 2, v:null]))
+
+ call assert_equal(0, max({}))
+ call assert_equal(2, max({'a':1, 'b':2}))
+
+ call assert_fails('call max(1)', 'E712:')
+ " call assert_fails('call max(v:none)', 'E712:')
+endfunc
+
+func Test_min()
+ call assert_equal(0, min([]))
+ call assert_equal(2, min([2]))
+ call assert_equal(1, min([1, 2]))
+ call assert_equal(0, min([1, 2, v:null]))
+
+ call assert_equal(0, min({}))
+ call assert_equal(1, min({'a':1, 'b':2}))
+
+ call assert_fails('call min(1)', 'E712:')
+ " call assert_fails('call min(v:none)', 'E712:')
+endfunc
+
+func Test_strwidth()
+ for aw in ['single', 'double']
+ exe 'set ambiwidth=' . aw
+ call assert_equal(0, strwidth(''))
+ call assert_equal(1, strwidth("\t"))
+ call assert_equal(3, strwidth('Vim'))
+ call assert_equal(4, strwidth(1234))
+ call assert_equal(5, strwidth(-1234))
+
+ if has('multi_byte')
+ call assert_equal(2, strwidth('๐Ÿ˜‰'))
+ call assert_equal(17, strwidth('Eฤฅoลanฤo ฤ‰iuฤตaลญde'))
+ call assert_equal((aw == 'single') ? 6 : 7, strwidth('StraรŸe'))
+ endif
+
+ call assert_fails('call strwidth({->0})', 'E729:')
+ call assert_fails('call strwidth([])', 'E730:')
+ call assert_fails('call strwidth({})', 'E731:')
+ call assert_fails('call strwidth(1.2)', 'E806:')
+ endfor
+
+ set ambiwidth&
+endfunc
+
+func Test_str2nr()
+ call assert_equal(0, str2nr(''))
+ call assert_equal(1, str2nr('1'))
+ call assert_equal(1, str2nr(' 1 '))
+
+ call assert_equal(1, str2nr('+1'))
+ call assert_equal(1, str2nr('+ 1'))
+ call assert_equal(1, str2nr(' + 1 '))
+
+ call assert_equal(-1, str2nr('-1'))
+ call assert_equal(-1, str2nr('- 1'))
+ call assert_equal(-1, str2nr(' - 1 '))
+
+ call assert_equal(123456789, str2nr('123456789'))
+ call assert_equal(-123456789, str2nr('-123456789'))
+
+ call assert_equal(5, str2nr('101', 2))
+ call assert_equal(5, str2nr('0b101', 2))
+ call assert_equal(5, str2nr('0B101', 2))
+ call assert_equal(-5, str2nr('-101', 2))
+ call assert_equal(-5, str2nr('-0b101', 2))
+ call assert_equal(-5, str2nr('-0B101', 2))
+
+ call assert_equal(65, str2nr('101', 8))
+ call assert_equal(65, str2nr('0101', 8))
+ call assert_equal(-65, str2nr('-101', 8))
+ call assert_equal(-65, str2nr('-0101', 8))
+
+ call assert_equal(11259375, str2nr('abcdef', 16))
+ call assert_equal(11259375, str2nr('ABCDEF', 16))
+ call assert_equal(-11259375, str2nr('-ABCDEF', 16))
+ call assert_equal(11259375, str2nr('0xabcdef', 16))
+ call assert_equal(11259375, str2nr('0Xabcdef', 16))
+ call assert_equal(11259375, str2nr('0XABCDEF', 16))
+ call assert_equal(-11259375, str2nr('-0xABCDEF', 16))
+
+ call assert_equal(0, str2nr('0x10'))
+ call assert_equal(0, str2nr('0b10'))
+ call assert_equal(1, str2nr('12', 2))
+ call assert_equal(1, str2nr('18', 8))
+ call assert_equal(1, str2nr('1g', 16))
+
+ call assert_equal(0, str2nr(v:null))
+ " call assert_equal(0, str2nr(v:none))
+
+ call assert_fails('call str2nr([])', 'E730:')
+ call assert_fails('call str2nr({->2})', 'E729:')
+ call assert_fails('call str2nr(1.2)', 'E806:')
+ call assert_fails('call str2nr(10, [])', 'E474:')
+endfunc
+
+func Test_strftime()
+ if !exists('*strftime')
+ return
+ endif
+ " Format of strftime() depends on system. We assume
+ " that basic formats tested here are available and
+ " identical on all systems which support strftime().
+ "
+ " The 2nd parameter of strftime() is a local time, so the output day
+ " of strftime() can be 17 or 18, depending on timezone.
+ call assert_match('^2017-01-1[78]$', strftime('%Y-%m-%d', 1484695512))
+ "
+ call assert_match('^\d\d\d\d-\(0\d\|1[012]\)-\([012]\d\|3[01]\) \([01]\d\|2[0-3]\):[0-5]\d:\([0-5]\d\|60\)$', strftime('%Y-%m-%d %H:%M:%S'))
+
+ call assert_fails('call strftime([])', 'E730:')
+ call assert_fails('call strftime("%Y", [])', 'E745:')
+endfunc
+
+func Test_resolve()
+ if !has('unix')
+ return
+ endif
+
+ " Xlink1 -> Xlink2
+ " Xlink2 -> Xlink3
+ silent !ln -s -f Xlink2 Xlink1
+ silent !ln -s -f Xlink3 Xlink2
+ call assert_equal('Xlink3', resolve('Xlink1'))
+ call assert_equal('./Xlink3', resolve('./Xlink1'))
+ call assert_equal('Xlink3/', resolve('Xlink2/'))
+ " FIXME: these tests result in things like "Xlink2/" instead of "Xlink3/"?!
+ "call assert_equal('Xlink3/', resolve('Xlink1/'))
+ "call assert_equal('./Xlink3/', resolve('./Xlink1/'))
+ "call assert_equal(getcwd() . '/Xlink3/', resolve(getcwd() . '/Xlink1/'))
+ call assert_equal(getcwd() . '/Xlink3', resolve(getcwd() . '/Xlink1'))
+
+ " Test resolve() with a symlink cycle.
+ " Xlink1 -> Xlink2
+ " Xlink2 -> Xlink3
+ " Xlink3 -> Xlink1
+ silent !ln -s -f Xlink1 Xlink3
+ call assert_fails('call resolve("Xlink1")', 'E655:')
+ call assert_fails('call resolve("./Xlink1")', 'E655:')
+ call assert_fails('call resolve("Xlink2")', 'E655:')
+ call assert_fails('call resolve("Xlink3")', 'E655:')
+ call delete('Xlink1')
+ call delete('Xlink2')
+ call delete('Xlink3')
+
+ silent !ln -s -f Xdir//Xfile Xlink
+ call assert_equal('Xdir/Xfile', resolve('Xlink'))
+ call delete('Xlink')
+
+ silent !ln -s -f Xlink2/ Xlink1
+ call assert_equal('Xlink2', resolve('Xlink1'))
+ call assert_equal('Xlink2/', resolve('Xlink1/'))
+ call delete('Xlink1')
+
+ silent !ln -s -f ./Xlink2 Xlink1
+ call assert_equal('Xlink2', resolve('Xlink1'))
+ call assert_equal('./Xlink2', resolve('./Xlink1'))
+ call delete('Xlink1')
+endfunc
+
+func Test_simplify()
+ call assert_equal('', simplify(''))
+ call assert_equal('/', simplify('/'))
+ call assert_equal('/', simplify('/.'))
+ call assert_equal('/', simplify('/..'))
+ call assert_equal('/...', simplify('/...'))
+ call assert_equal('./dir/file', simplify('./dir/file'))
+ call assert_equal('./dir/file', simplify('.///dir//file'))
+ call assert_equal('./dir/file', simplify('./dir/./file'))
+ call assert_equal('./file', simplify('./dir/../file'))
+ call assert_equal('../dir/file', simplify('dir/../../dir/file'))
+ call assert_equal('./file', simplify('dir/.././file'))
+
+ call assert_fails('call simplify({->0})', 'E729:')
+ call assert_fails('call simplify([])', 'E730:')
+ call assert_fails('call simplify({})', 'E731:')
+ call assert_fails('call simplify(1.2)', 'E806:')
+endfunc
+
+func Test_setbufvar_options()
+ " This tests that aucmd_prepbuf() and aucmd_restbuf() properly restore the
+ " window layout.
+ call assert_equal(1, winnr('$'))
+ split dummy_preview
+ resize 2
+ set winfixheight winfixwidth
+ let prev_id = win_getid()
+
+ wincmd j
+ let wh = winheight('.')
+ let dummy_buf = bufnr('dummy_buf1', v:true)
+ call setbufvar(dummy_buf, '&buftype', 'nofile')
+ execute 'belowright vertical split #' . dummy_buf
+ call assert_equal(wh, winheight('.'))
+ let dum1_id = win_getid()
+
+ wincmd h
+ let wh = winheight('.')
+ let dummy_buf = bufnr('dummy_buf2', v:true)
+ call setbufvar(dummy_buf, '&buftype', 'nofile')
+ execute 'belowright vertical split #' . dummy_buf
+ call assert_equal(wh, winheight('.'))
+
+ bwipe!
+ call win_gotoid(prev_id)
+ bwipe!
+ call win_gotoid(dum1_id)
+ bwipe!
+endfunc
+
+func Test_pathshorten()
+ call assert_equal('', pathshorten(''))
+ call assert_equal('foo', pathshorten('foo'))
+ call assert_equal('/foo', pathshorten('/foo'))
+ call assert_equal('f/', pathshorten('foo/'))
+ call assert_equal('f/bar', pathshorten('foo/bar'))
+ call assert_equal('f/b/foobar', pathshorten('foo/bar/foobar'))
+ call assert_equal('/f/b/foobar', pathshorten('/foo/bar/foobar'))
+ call assert_equal('.f/bar', pathshorten('.foo/bar'))
+ call assert_equal('~f/bar', pathshorten('~foo/bar'))
+ call assert_equal('~.f/bar', pathshorten('~.foo/bar'))
+ call assert_equal('.~f/bar', pathshorten('.~foo/bar'))
+ call assert_equal('~/f/bar', pathshorten('~/foo/bar'))
+endfunc
+
+func Test_strpart()
+ call assert_equal('de', strpart('abcdefg', 3, 2))
+ call assert_equal('ab', strpart('abcdefg', -2, 4))
+ call assert_equal('abcdefg', strpart('abcdefg', -2))
+ call assert_equal('fg', strpart('abcdefg', 5, 4))
+ call assert_equal('defg', strpart('abcdefg', 3))
+
+ if has('multi_byte')
+ call assert_equal('lรฉp', strpart('รฉlรฉphant', 2, 4))
+ call assert_equal('lรฉphant', strpart('รฉlรฉphant', 2))
+ endif
+endfunc
+
+func Test_tolower()
+ call assert_equal("", tolower(""))
+
+ " Test with all printable ASCII characters.
+ call assert_equal(' !"#$%&''()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~',
+ \ tolower(' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'))
+
+ if !has('multi_byte')
+ return
+ endif
+
+ " Test with a few uppercase diacritics.
+ call assert_equal("aร รกรขรฃรครฅฤฤƒฤ…วŽวŸวกแบฃ", tolower("Aร€รร‚รƒร„ร…ฤ€ฤ‚ฤ„ววžว แบข"))
+ call assert_equal("bแธƒแธ‡", tolower("Bแธ‚แธ†"))
+ call assert_equal("cรงฤ‡ฤ‰ฤ‹ฤ", tolower("Cร‡ฤ†ฤˆฤŠฤŒ"))
+ call assert_equal("dฤฤ‘แธ‹แธแธ‘", tolower("DฤŽฤแธŠแธŽแธ"))
+ call assert_equal("eรจรฉรชรซฤ“ฤ•ฤ—ฤ™ฤ›แบปแบฝ", tolower("Eรˆร‰รŠร‹ฤ’ฤ”ฤ–ฤ˜ฤšแบบแบผ"))
+ call assert_equal("fแธŸ ", tolower("Fแธž "))
+ call assert_equal("gฤฤŸฤกฤฃวฅวงวตแธก", tolower("Gฤœฤžฤ ฤขวควฆวดแธ "))
+ call assert_equal("hฤฅฤงแธฃแธงแธฉ", tolower("Hฤคฤฆแธขแธฆแธจ"))
+ call assert_equal("iรฌรญรฎรฏฤฉฤซฤญฤฏiวแป‰", tolower("IรŒรรŽรฤจฤชฤฌฤฎฤฐวแปˆ"))
+ call assert_equal("jฤต", tolower("Jฤด"))
+ call assert_equal("kฤทวฉแธฑแธต", tolower("Kฤถวจแธฐแธด"))
+ call assert_equal("lฤบฤผฤพล€ล‚แธป", tolower("Lฤนฤปฤฝฤฟลแธบ"))
+ call assert_equal("mแธฟแน", tolower("Mแธพแน€"))
+ call assert_equal("nรฑล„ล†ลˆแน…แน‰", tolower("Nร‘ลƒล…ล‡แน„แนˆ"))
+ call assert_equal("oรฒรณรดรตรถรธลลล‘ฦกว’วซวญแป", tolower("Oร’ร“ร”ร•ร–ร˜ลŒลŽลฦ ว‘วชวฌแปŽ"))
+ call assert_equal("pแน•แน—", tolower("Pแน”แน–"))
+ call assert_equal("q", tolower("Q"))
+ call assert_equal("rล•ล—ล™แน™แนŸ", tolower("Rล”ล–ล˜แน˜แนž"))
+ call assert_equal("sล›ลลŸลกแนก", tolower("Sลšลœลžล แน "))
+ call assert_equal("tลฃลฅลงแนซแนฏ", tolower("Tลขลคลฆแนชแนฎ"))
+ call assert_equal("uรนรบรปรผลฉลซลญลฏลฑลณฦฐว”แปง", tolower("Uร™รšร›รœลจลชลฌลฎลฐลฒฦฏว“แปฆ"))
+ call assert_equal("vแนฝ", tolower("Vแนผ"))
+ call assert_equal("wลตแบแบƒแบ…แบ‡", tolower("Wลดแบ€แบ‚แบ„แบ†"))
+ call assert_equal("xแบ‹แบ", tolower("XแบŠแบŒ"))
+ call assert_equal("yรฝลทรฟแบแปณแปทแปน", tolower("YรลถลธแบŽแปฒแปถแปธ"))
+ call assert_equal("zลบลผลพฦถแบ‘แบ•", tolower("Zลนลปลฝฦตแบแบ”"))
+
+ " Test with a few lowercase diacritics, which should remain unchanged.
+ call assert_equal("aร รกรขรฃรครฅฤฤƒฤ…วŽวŸวกแบฃ", tolower("aร รกรขรฃรครฅฤฤƒฤ…วŽวŸวกแบฃ"))
+ call assert_equal("bแธƒแธ‡", tolower("bแธƒแธ‡"))
+ call assert_equal("cรงฤ‡ฤ‰ฤ‹ฤ", tolower("cรงฤ‡ฤ‰ฤ‹ฤ"))
+ call assert_equal("dฤฤ‘แธ‹แธแธ‘", tolower("dฤฤ‘แธ‹แธแธ‘"))
+ call assert_equal("eรจรฉรชรซฤ“ฤ•ฤ—ฤ™ฤ›แบปแบฝ", tolower("eรจรฉรชรซฤ“ฤ•ฤ—ฤ™ฤ›แบปแบฝ"))
+ call assert_equal("fแธŸ", tolower("fแธŸ"))
+ call assert_equal("gฤฤŸฤกฤฃวฅวงวตแธก", tolower("gฤฤŸฤกฤฃวฅวงวตแธก"))
+ call assert_equal("hฤฅฤงแธฃแธงแธฉแบ–", tolower("hฤฅฤงแธฃแธงแธฉแบ–"))
+ call assert_equal("iรฌรญรฎรฏฤฉฤซฤญฤฏวแป‰", tolower("iรฌรญรฎรฏฤฉฤซฤญฤฏวแป‰"))
+ call assert_equal("jฤตวฐ", tolower("jฤตวฐ"))
+ call assert_equal("kฤทวฉแธฑแธต", tolower("kฤทวฉแธฑแธต"))
+ call assert_equal("lฤบฤผฤพล€ล‚แธป", tolower("lฤบฤผฤพล€ล‚แธป"))
+ call assert_equal("mแธฟแน ", tolower("mแธฟแน "))
+ call assert_equal("nรฑล„ล†ลˆล‰แน…แน‰", tolower("nรฑล„ล†ลˆล‰แน…แน‰"))
+ call assert_equal("oรฒรณรดรตรถรธลลล‘ฦกว’วซวญแป", tolower("oรฒรณรดรตรถรธลลล‘ฦกว’วซวญแป"))
+ call assert_equal("pแน•แน—", tolower("pแน•แน—"))
+ call assert_equal("q", tolower("q"))
+ call assert_equal("rล•ล—ล™แน™แนŸ", tolower("rล•ล—ล™แน™แนŸ"))
+ call assert_equal("sล›ลลŸลกแนก", tolower("sล›ลลŸลกแนก"))
+ call assert_equal("tลฃลฅลงแนซแนฏแบ—", tolower("tลฃลฅลงแนซแนฏแบ—"))
+ call assert_equal("uรนรบรปรผลฉลซลญลฏลฑลณฦฐว”แปง", tolower("uรนรบรปรผลฉลซลญลฏลฑลณฦฐว”แปง"))
+ call assert_equal("vแนฝ", tolower("vแนฝ"))
+ call assert_equal("wลตแบแบƒแบ…แบ‡แบ˜", tolower("wลตแบแบƒแบ…แบ‡แบ˜"))
+ call assert_equal("แบ‹แบ", tolower("แบ‹แบ"))
+ call assert_equal("yรฝรฟลทแบแบ™แปณแปทแปน", tolower("yรฝรฟลทแบแบ™แปณแปทแปน"))
+ call assert_equal("zลบลผลพฦถแบ‘แบ•", tolower("zลบลผลพฦถแบ‘แบ•"))
+
+ " According to https://twitter.com/jifa/status/625776454479970304
+ " ศบ (U+023A) and ศพ (U+023E) are the *only* code points to increase
+ " in length (2 to 3 bytes) when lowercased. So let's test them.
+ call assert_equal("โฑฅ โฑฆ", tolower("ศบ ศพ"))
+
+ " This call to tolower with invalid utf8 sequence used to cause access to
+ " invalid memory.
+ call tolower("\xC0\x80\xC0")
+ call tolower("123\xC0\x80\xC0")
+endfunc
+
+func Test_toupper()
+ call assert_equal("", toupper(""))
+
+ " Test with all printable ASCII characters.
+ call assert_equal(' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~',
+ \ toupper(' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'))
+
+ if !has('multi_byte')
+ return
+ endif
+
+ " Test with a few lowercase diacritics.
+ call assert_equal("Aร€รร‚รƒร„ร…ฤ€ฤ‚ฤ„ววžว แบข", toupper("aร รกรขรฃรครฅฤฤƒฤ…วŽวŸวกแบฃ"))
+ call assert_equal("Bแธ‚แธ†", toupper("bแธƒแธ‡"))
+ call assert_equal("Cร‡ฤ†ฤˆฤŠฤŒ", toupper("cรงฤ‡ฤ‰ฤ‹ฤ"))
+ call assert_equal("DฤŽฤแธŠแธŽแธ", toupper("dฤฤ‘แธ‹แธแธ‘"))
+ call assert_equal("Eรˆร‰รŠร‹ฤ’ฤ”ฤ–ฤ˜ฤšแบบแบผ", toupper("eรจรฉรชรซฤ“ฤ•ฤ—ฤ™ฤ›แบปแบฝ"))
+ call assert_equal("Fแธž", toupper("fแธŸ"))
+ call assert_equal("Gฤœฤžฤ ฤขวควฆวดแธ ", toupper("gฤฤŸฤกฤฃวฅวงวตแธก"))
+ call assert_equal("Hฤคฤฆแธขแธฆแธจแบ–", toupper("hฤฅฤงแธฃแธงแธฉแบ–"))
+ call assert_equal("IรŒรรŽรฤจฤชฤฌฤฎวแปˆ", toupper("iรฌรญรฎรฏฤฉฤซฤญฤฏวแป‰"))
+ call assert_equal("Jฤดวฐ", toupper("jฤตวฐ"))
+ call assert_equal("Kฤถวจแธฐแธด", toupper("kฤทวฉแธฑแธต"))
+ call assert_equal("Lฤนฤปฤฝฤฟลแธบ", toupper("lฤบฤผฤพล€ล‚แธป"))
+ call assert_equal("Mแธพแน€ ", toupper("mแธฟแน "))
+ call assert_equal("Nร‘ลƒล…ล‡ล‰แน„แนˆ", toupper("nรฑล„ล†ลˆล‰แน…แน‰"))
+ call assert_equal("Oร’ร“ร”ร•ร–ร˜ลŒลŽลฦ ว‘วชวฌแปŽ", toupper("oรฒรณรดรตรถรธลลล‘ฦกว’วซวญแป"))
+ call assert_equal("Pแน”แน–", toupper("pแน•แน—"))
+ call assert_equal("Q", toupper("q"))
+ call assert_equal("Rล”ล–ล˜แน˜แนž", toupper("rล•ล—ล™แน™แนŸ"))
+ call assert_equal("Sลšลœลžล แน ", toupper("sล›ลลŸลกแนก"))
+ call assert_equal("Tลขลคลฆแนชแนฎแบ—", toupper("tลฃลฅลงแนซแนฏแบ—"))
+ call assert_equal("Uร™รšร›รœลจลชลฌลฎลฐลฒฦฏว“แปฆ", toupper("uรนรบรปรผลฉลซลญลฏลฑลณฦฐว”แปง"))
+ call assert_equal("Vแนผ", toupper("vแนฝ"))
+ call assert_equal("Wลดแบ€แบ‚แบ„แบ†แบ˜", toupper("wลตแบแบƒแบ…แบ‡แบ˜"))
+ call assert_equal("แบŠแบŒ", toupper("แบ‹แบ"))
+ call assert_equal("YรลธลถแบŽแบ™แปฒแปถแปธ", toupper("yรฝรฟลทแบแบ™แปณแปทแปน"))
+ call assert_equal("Zลนลปลฝฦตแบแบ”", toupper("zลบลผลพฦถแบ‘แบ•"))
+
+ " Test that uppercase diacritics, which should remain unchanged.
+ call assert_equal("Aร€รร‚รƒร„ร…ฤ€ฤ‚ฤ„ววžว แบข", toupper("Aร€รร‚รƒร„ร…ฤ€ฤ‚ฤ„ววžว แบข"))
+ call assert_equal("Bแธ‚แธ†", toupper("Bแธ‚แธ†"))
+ call assert_equal("Cร‡ฤ†ฤˆฤŠฤŒ", toupper("Cร‡ฤ†ฤˆฤŠฤŒ"))
+ call assert_equal("DฤŽฤแธŠแธŽแธ", toupper("DฤŽฤแธŠแธŽแธ"))
+ call assert_equal("Eรˆร‰รŠร‹ฤ’ฤ”ฤ–ฤ˜ฤšแบบแบผ", toupper("Eรˆร‰รŠร‹ฤ’ฤ”ฤ–ฤ˜ฤšแบบแบผ"))
+ call assert_equal("Fแธž ", toupper("Fแธž "))
+ call assert_equal("Gฤœฤžฤ ฤขวควฆวดแธ ", toupper("Gฤœฤžฤ ฤขวควฆวดแธ "))
+ call assert_equal("Hฤคฤฆแธขแธฆแธจ", toupper("Hฤคฤฆแธขแธฆแธจ"))
+ call assert_equal("IรŒรรŽรฤจฤชฤฌฤฎฤฐวแปˆ", toupper("IรŒรรŽรฤจฤชฤฌฤฎฤฐวแปˆ"))
+ call assert_equal("Jฤด", toupper("Jฤด"))
+ call assert_equal("Kฤถวจแธฐแธด", toupper("Kฤถวจแธฐแธด"))
+ call assert_equal("Lฤนฤปฤฝฤฟลแธบ", toupper("Lฤนฤปฤฝฤฟลแธบ"))
+ call assert_equal("Mแธพแน€", toupper("Mแธพแน€"))
+ call assert_equal("Nร‘ลƒล…ล‡แน„แนˆ", toupper("Nร‘ลƒล…ล‡แน„แนˆ"))
+ call assert_equal("Oร’ร“ร”ร•ร–ร˜ลŒลŽลฦ ว‘วชวฌแปŽ", toupper("Oร’ร“ร”ร•ร–ร˜ลŒลŽลฦ ว‘วชวฌแปŽ"))
+ call assert_equal("Pแน”แน–", toupper("Pแน”แน–"))
+ call assert_equal("Q", toupper("Q"))
+ call assert_equal("Rล”ล–ล˜แน˜แนž", toupper("Rล”ล–ล˜แน˜แนž"))
+ call assert_equal("Sลšลœลžล แน ", toupper("Sลšลœลžล แน "))
+ call assert_equal("Tลขลคลฆแนชแนฎ", toupper("Tลขลคลฆแนชแนฎ"))
+ call assert_equal("Uร™รšร›รœลจลชลฌลฎลฐลฒฦฏว“แปฆ", toupper("Uร™รšร›รœลจลชลฌลฎลฐลฒฦฏว“แปฆ"))
+ call assert_equal("Vแนผ", toupper("Vแนผ"))
+ call assert_equal("Wลดแบ€แบ‚แบ„แบ†", toupper("Wลดแบ€แบ‚แบ„แบ†"))
+ call assert_equal("XแบŠแบŒ", toupper("XแบŠแบŒ"))
+ call assert_equal("YรลถลธแบŽแปฒแปถแปธ", toupper("YรลถลธแบŽแปฒแปถแปธ"))
+ call assert_equal("Zลนลปลฝฦตแบแบ”", toupper("Zลนลปลฝฦตแบแบ”"))
+
+ call assert_equal("ศบ ศพ", toupper("โฑฅ โฑฆ"))
+
+ " This call to toupper with invalid utf8 sequence used to cause access to
+ " invalid memory.
+ call toupper("\xC0\x80\xC0")
+ call toupper("123\xC0\x80\xC0")
+endfunc
+
+" Tests for the mode() function
+let current_modes = ''
+func Save_mode()
+ let g:current_modes = mode(0) . '-' . mode(1)
+ return ''
+endfunc
+
+func Test_mode()
+ new
+ call append(0, ["Blue Ball Black", "Brown Band Bowl", ""])
+
+ " Only complete from the current buffer.
+ set complete=.
+
+ inoremap <F2> <C-R>=Save_mode()<CR>
+
+ normal! 3G
+ exe "normal i\<F2>\<Esc>"
+ call assert_equal('i-i', g:current_modes)
+ " i_CTRL-P: Multiple matches
+ exe "normal i\<C-G>uBa\<C-P>\<F2>\<Esc>u"
+ call assert_equal('i-ic', g:current_modes)
+ " i_CTRL-P: Single match
+ exe "normal iBro\<C-P>\<F2>\<Esc>u"
+ call assert_equal('i-ic', g:current_modes)
+ " i_CTRL-X
+ exe "normal iBa\<C-X>\<F2>\<Esc>u"
+ call assert_equal('i-ix', g:current_modes)
+ " i_CTRL-X CTRL-P: Multiple matches
+ exe "normal iBa\<C-X>\<C-P>\<F2>\<Esc>u"
+ call assert_equal('i-ic', g:current_modes)
+ " i_CTRL-X CTRL-P: Single match
+ exe "normal iBro\<C-X>\<C-P>\<F2>\<Esc>u"
+ call assert_equal('i-ic', g:current_modes)
+ " i_CTRL-X CTRL-P + CTRL-P: Single match
+ exe "normal iBro\<C-X>\<C-P>\<C-P>\<F2>\<Esc>u"
+ call assert_equal('i-ic', g:current_modes)
+ " i_CTRL-X CTRL-L: Multiple matches
+ exe "normal i\<C-X>\<C-L>\<F2>\<Esc>u"
+ call assert_equal('i-ic', g:current_modes)
+ " i_CTRL-X CTRL-L: Single match
+ exe "normal iBlu\<C-X>\<C-L>\<F2>\<Esc>u"
+ call assert_equal('i-ic', g:current_modes)
+ " i_CTRL-P: No match
+ exe "normal iCom\<C-P>\<F2>\<Esc>u"
+ call assert_equal('i-ic', g:current_modes)
+ " i_CTRL-X CTRL-P: No match
+ exe "normal iCom\<C-X>\<C-P>\<F2>\<Esc>u"
+ call assert_equal('i-ic', g:current_modes)
+ " i_CTRL-X CTRL-L: No match
+ exe "normal iabc\<C-X>\<C-L>\<F2>\<Esc>u"
+ call assert_equal('i-ic', g:current_modes)
+
+ " R_CTRL-P: Multiple matches
+ exe "normal RBa\<C-P>\<F2>\<Esc>u"
+ call assert_equal('R-Rc', g:current_modes)
+ " R_CTRL-P: Single match
+ exe "normal RBro\<C-P>\<F2>\<Esc>u"
+ call assert_equal('R-Rc', g:current_modes)
+ " R_CTRL-X
+ exe "normal RBa\<C-X>\<F2>\<Esc>u"
+ call assert_equal('R-Rx', g:current_modes)
+ " R_CTRL-X CTRL-P: Multiple matches
+ exe "normal RBa\<C-X>\<C-P>\<F2>\<Esc>u"
+ call assert_equal('R-Rc', g:current_modes)
+ " R_CTRL-X CTRL-P: Single match
+ exe "normal RBro\<C-X>\<C-P>\<F2>\<Esc>u"
+ call assert_equal('R-Rc', g:current_modes)
+ " R_CTRL-X CTRL-P + CTRL-P: Single match
+ exe "normal RBro\<C-X>\<C-P>\<C-P>\<F2>\<Esc>u"
+ call assert_equal('R-Rc', g:current_modes)
+ " R_CTRL-X CTRL-L: Multiple matches
+ exe "normal R\<C-X>\<C-L>\<F2>\<Esc>u"
+ call assert_equal('R-Rc', g:current_modes)
+ " R_CTRL-X CTRL-L: Single match
+ exe "normal RBlu\<C-X>\<C-L>\<F2>\<Esc>u"
+ call assert_equal('R-Rc', g:current_modes)
+ " R_CTRL-P: No match
+ exe "normal RCom\<C-P>\<F2>\<Esc>u"
+ call assert_equal('R-Rc', g:current_modes)
+ " R_CTRL-X CTRL-P: No match
+ exe "normal RCom\<C-X>\<C-P>\<F2>\<Esc>u"
+ call assert_equal('R-Rc', g:current_modes)
+ " R_CTRL-X CTRL-L: No match
+ exe "normal Rabc\<C-X>\<C-L>\<F2>\<Esc>u"
+ call assert_equal('R-Rc', g:current_modes)
+
+ call assert_equal('n', mode(0))
+ call assert_equal('n', mode(1))
+
+ " How to test operator-pending mode?
+
+ call feedkeys("v", 'xt')
+ call assert_equal('v', mode())
+ call assert_equal('v', mode(1))
+ call feedkeys("\<Esc>V", 'xt')
+ call assert_equal('V', mode())
+ call assert_equal('V', mode(1))
+ call feedkeys("\<Esc>\<C-V>", 'xt')
+ call assert_equal("\<C-V>", mode())
+ call assert_equal("\<C-V>", mode(1))
+ call feedkeys("\<Esc>", 'xt')
+
+ call feedkeys("gh", 'xt')
+ call assert_equal('s', mode())
+ call assert_equal('s', mode(1))
+ call feedkeys("\<Esc>gH", 'xt')
+ call assert_equal('S', mode())
+ call assert_equal('S', mode(1))
+ call feedkeys("\<Esc>g\<C-H>", 'xt')
+ call assert_equal("\<C-S>", mode())
+ call assert_equal("\<C-S>", mode(1))
+ call feedkeys("\<Esc>", 'xt')
+
+ call feedkeys(":echo \<C-R>=Save_mode()\<C-U>\<CR>", 'xt')
+ call assert_equal('c-c', g:current_modes)
+ call feedkeys("gQecho \<C-R>=Save_mode()\<CR>\<CR>vi\<CR>", 'xt')
+ call assert_equal('c-cv', g:current_modes)
+ " How to test Ex mode?
+
+ bwipe!
+ iunmap <F2>
+ set complete&
+endfunc
+
+func Test_getbufvar()
+ let bnr = bufnr('%')
+ let b:var_num = '1234'
+ let def_num = '5678'
+ call assert_equal('1234', getbufvar(bnr, 'var_num'))
+ call assert_equal('1234', getbufvar(bnr, 'var_num', def_num))
+
+ let bd = getbufvar(bnr, '')
+ call assert_equal('1234', bd['var_num'])
+ call assert_true(exists("bd['changedtick']"))
+ call assert_equal(2, len(bd))
+
+ let bd2 = getbufvar(bnr, '', def_num)
+ call assert_equal(bd, bd2)
+
+ unlet b:var_num
+ call assert_equal(def_num, getbufvar(bnr, 'var_num', def_num))
+ call assert_equal('', getbufvar(bnr, 'var_num'))
+
+ let bd = getbufvar(bnr, '')
+ call assert_equal(1, len(bd))
+ let bd = getbufvar(bnr, '',def_num)
+ call assert_equal(1, len(bd))
+
+ call assert_equal('', getbufvar(9999, ''))
+ call assert_equal(def_num, getbufvar(9999, '', def_num))
+ unlet def_num
+
+ call assert_equal(0, getbufvar(bnr, '&autoindent'))
+ call assert_equal(0, getbufvar(bnr, '&autoindent', 1))
+
+ " Open new window with forced option values
+ set fileformats=unix,dos
+ new ++ff=dos ++bin ++enc=iso-8859-2
+ call assert_equal('dos', getbufvar(bufnr('%'), '&fileformat'))
+ call assert_equal(1, getbufvar(bufnr('%'), '&bin'))
+ call assert_equal('iso-8859-2', getbufvar(bufnr('%'), '&fenc'))
+ close
+
+ set fileformats&
+endfunc
+
+func Test_last_buffer_nr()
+ call assert_equal(bufnr('$'), last_buffer_nr())
+endfunc
+
+func Test_stridx()
+ call assert_equal(-1, stridx('', 'l'))
+ call assert_equal(0, stridx('', ''))
+ call assert_equal(0, stridx('hello', ''))
+ call assert_equal(-1, stridx('hello', 'L'))
+ call assert_equal(2, stridx('hello', 'l', -1))
+ call assert_equal(2, stridx('hello', 'l', 0))
+ call assert_equal(2, stridx('hello', 'l', 1))
+ call assert_equal(3, stridx('hello', 'l', 3))
+ call assert_equal(-1, stridx('hello', 'l', 4))
+ call assert_equal(-1, stridx('hello', 'l', 10))
+ call assert_equal(2, stridx('hello', 'll'))
+ call assert_equal(-1, stridx('hello', 'hello world'))
+endfunc
+
+func Test_strridx()
+ call assert_equal(-1, strridx('', 'l'))
+ call assert_equal(0, strridx('', ''))
+ call assert_equal(5, strridx('hello', ''))
+ call assert_equal(-1, strridx('hello', 'L'))
+ call assert_equal(3, strridx('hello', 'l'))
+ call assert_equal(3, strridx('hello', 'l', 10))
+ call assert_equal(3, strridx('hello', 'l', 3))
+ call assert_equal(2, strridx('hello', 'l', 2))
+ call assert_equal(-1, strridx('hello', 'l', 1))
+ call assert_equal(-1, strridx('hello', 'l', 0))
+ call assert_equal(-1, strridx('hello', 'l', -1))
+ call assert_equal(2, strridx('hello', 'll'))
+ call assert_equal(-1, strridx('hello', 'hello world'))
+endfunc
+
+func Test_match_func()
+ call assert_equal(4, match('testing', 'ing'))
+ call assert_equal(4, match('testing', 'ing', 2))
+ call assert_equal(-1, match('testing', 'ing', 5))
+ call assert_equal(-1, match('testing', 'ing', 8))
+ call assert_equal(1, match(['vim', 'testing', 'execute'], 'ing'))
+ call assert_equal(-1, match(['vim', 'testing', 'execute'], 'img'))
+endfunc
+
+func Test_matchend()
+ call assert_equal(7, matchend('testing', 'ing'))
+ call assert_equal(7, matchend('testing', 'ing', 2))
+ call assert_equal(-1, matchend('testing', 'ing', 5))
+ call assert_equal(-1, matchend('testing', 'ing', 8))
+ call assert_equal(match(['vim', 'testing', 'execute'], 'ing'), matchend(['vim', 'testing', 'execute'], 'ing'))
+ call assert_equal(match(['vim', 'testing', 'execute'], 'img'), matchend(['vim', 'testing', 'execute'], 'img'))
+endfunc
+
+func Test_matchlist()
+ call assert_equal(['acd', 'a', '', 'c', 'd', '', '', '', '', ''], matchlist('acd', '\(a\)\?\(b\)\?\(c\)\?\(.*\)'))
+ call assert_equal(['d', '', '', '', 'd', '', '', '', '', ''], matchlist('acd', '\(a\)\?\(b\)\?\(c\)\?\(.*\)', 2))
+ call assert_equal([], matchlist('acd', '\(a\)\?\(b\)\?\(c\)\?\(.*\)', 4))
+endfunc
+
+func Test_matchstr()
+ call assert_equal('ing', matchstr('testing', 'ing'))
+ call assert_equal('ing', matchstr('testing', 'ing', 2))
+ call assert_equal('', matchstr('testing', 'ing', 5))
+ call assert_equal('', matchstr('testing', 'ing', 8))
+ call assert_equal('testing', matchstr(['vim', 'testing', 'execute'], 'ing'))
+ call assert_equal('', matchstr(['vim', 'testing', 'execute'], 'img'))
+endfunc
+
+func Test_matchstrpos()
+ call assert_equal(['ing', 4, 7], matchstrpos('testing', 'ing'))
+ call assert_equal(['ing', 4, 7], matchstrpos('testing', 'ing', 2))
+ call assert_equal(['', -1, -1], matchstrpos('testing', 'ing', 5))
+ call assert_equal(['', -1, -1], matchstrpos('testing', 'ing', 8))
+ call assert_equal(['ing', 1, 4, 7], matchstrpos(['vim', 'testing', 'execute'], 'ing'))
+ call assert_equal(['', -1, -1, -1], matchstrpos(['vim', 'testing', 'execute'], 'img'))
+endfunc
+
+func Test_nextnonblank_prevnonblank()
+ new
+insert
+This
+
+
+is
+
+a
+Test
+.
+ call assert_equal(0, nextnonblank(-1))
+ call assert_equal(0, nextnonblank(0))
+ call assert_equal(1, nextnonblank(1))
+ call assert_equal(4, nextnonblank(2))
+ call assert_equal(4, nextnonblank(3))
+ call assert_equal(4, nextnonblank(4))
+ call assert_equal(6, nextnonblank(5))
+ call assert_equal(6, nextnonblank(6))
+ call assert_equal(7, nextnonblank(7))
+ call assert_equal(0, nextnonblank(8))
+
+ call assert_equal(0, prevnonblank(-1))
+ call assert_equal(0, prevnonblank(0))
+ call assert_equal(1, prevnonblank(1))
+ call assert_equal(1, prevnonblank(2))
+ call assert_equal(1, prevnonblank(3))
+ call assert_equal(4, prevnonblank(4))
+ call assert_equal(4, prevnonblank(5))
+ call assert_equal(6, prevnonblank(6))
+ call assert_equal(7, prevnonblank(7))
+ call assert_equal(0, prevnonblank(8))
+ bw!
+endfunc
+
+func Test_byte2line_line2byte()
+ new
+ set endofline
+ call setline(1, ['a', 'bc', 'd'])
+
+ set fileformat=unix
+ call assert_equal([-1, -1, 1, 1, 2, 2, 2, 3, 3, -1],
+ \ map(range(-1, 8), 'byte2line(v:val)'))
+ call assert_equal([-1, -1, 1, 3, 6, 8, -1],
+ \ map(range(-1, 5), 'line2byte(v:val)'))
+
+ set fileformat=mac
+ call assert_equal([-1, -1, 1, 1, 2, 2, 2, 3, 3, -1],
+ \ map(range(-1, 8), 'byte2line(v:val)'))
+ call assert_equal([-1, -1, 1, 3, 6, 8, -1],
+ \ map(range(-1, 5), 'line2byte(v:val)'))
+
+ set fileformat=dos
+ call assert_equal([-1, -1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, -1],
+ \ map(range(-1, 11), 'byte2line(v:val)'))
+ call assert_equal([-1, -1, 1, 4, 8, 11, -1],
+ \ map(range(-1, 5), 'line2byte(v:val)'))
+
+ bw!
+ set noendofline nofixendofline
+ normal a-
+ for ff in ["unix", "mac", "dos"]
+ let &fileformat = ff
+ call assert_equal(1, line2byte(1))
+ call assert_equal(2, line2byte(2)) " line2byte(line("$") + 1) is the buffer size plus one (as per :help line2byte).
+ endfor
+
+ set endofline& fixendofline& fileformat&
+ bw!
+endfunc
+
+func Test_count()
+ let l = ['a', 'a', 'A', 'b']
+ call assert_equal(2, count(l, 'a'))
+ call assert_equal(1, count(l, 'A'))
+ call assert_equal(1, count(l, 'b'))
+ call assert_equal(0, count(l, 'B'))
+
+ call assert_equal(2, count(l, 'a', 0))
+ call assert_equal(1, count(l, 'A', 0))
+ call assert_equal(1, count(l, 'b', 0))
+ call assert_equal(0, count(l, 'B', 0))
+
+ call assert_equal(3, count(l, 'a', 1))
+ call assert_equal(3, count(l, 'A', 1))
+ call assert_equal(1, count(l, 'b', 1))
+ call assert_equal(1, count(l, 'B', 1))
+ call assert_equal(0, count(l, 'c', 1))
+
+ call assert_equal(1, count(l, 'a', 0, 1))
+ call assert_equal(2, count(l, 'a', 1, 1))
+ call assert_fails('call count(l, "a", 0, 10)', 'E684:')
+
+ let d = {1: 'a', 2: 'a', 3: 'A', 4: 'b'}
+ call assert_equal(2, count(d, 'a'))
+ call assert_equal(1, count(d, 'A'))
+ call assert_equal(1, count(d, 'b'))
+ call assert_equal(0, count(d, 'B'))
+
+ call assert_equal(2, count(d, 'a', 0))
+ call assert_equal(1, count(d, 'A', 0))
+ call assert_equal(1, count(d, 'b', 0))
+ call assert_equal(0, count(d, 'B', 0))
+
+ call assert_equal(3, count(d, 'a', 1))
+ call assert_equal(3, count(d, 'A', 1))
+ call assert_equal(1, count(d, 'b', 1))
+ call assert_equal(1, count(d, 'B', 1))
+ call assert_equal(0, count(d, 'c', 1))
+
+ call assert_fails('call count(d, "a", 0, 1)', 'E474:')
+
+ call assert_equal(0, count("foo", "bar"))
+ call assert_equal(1, count("foo", "oo"))
+ call assert_equal(2, count("foo", "o"))
+ call assert_equal(0, count("foo", "O"))
+ call assert_equal(2, count("foo", "O", 1))
+ call assert_equal(2, count("fooooo", "oo"))
+ call assert_equal(0, count("foo", ""))
+endfunc
+
+func Test_changenr()
+ new Xchangenr
+ call assert_equal(0, changenr())
+ norm ifoo
+ call assert_equal(1, changenr())
+ set undolevels=10
+ norm Sbar
+ call assert_equal(2, changenr())
+ undo
+ call assert_equal(1, changenr())
+ redo
+ call assert_equal(2, changenr())
+ bw!
+ set undolevels&
+endfunc
+
+func Test_filewritable()
+ new Xfilewritable
+ write!
+ call assert_equal(1, filewritable('Xfilewritable'))
+
+ call assert_notequal(0, setfperm('Xfilewritable', 'r--r-----'))
+ call assert_equal(0, filewritable('Xfilewritable'))
+
+ call assert_notequal(0, setfperm('Xfilewritable', 'rw-r-----'))
+ call assert_equal(1, filewritable('Xfilewritable'))
+
+ call assert_equal(0, filewritable('doesnotexist'))
+
+ call delete('Xfilewritable')
+ bw!
+endfunc
+
+func Test_Executable()
+ if has('win32')
+ call assert_equal(1, executable('notepad'))
+ call assert_equal(1, executable('notepad.exe'))
+ call assert_equal(0, executable('notepad.exe.exe'))
+ call assert_equal(1, executable('shell32.dll'))
+ call assert_equal(1, executable('win.ini'))
+ elseif has('unix')
+ call assert_equal(1, executable('cat'))
+ call assert_equal(0, executable('nodogshere'))
+ endif
+endfunc
+
+func Test_hostname()
+ let hostname_vim = hostname()
+ if has('unix')
+ let hostname_system = systemlist('uname -n')[0]
+ call assert_equal(hostname_vim, hostname_system)
+ endif
+endfunc
+
+func Test_getpid()
+ " getpid() always returns the same value within a vim instance.
+ call assert_equal(getpid(), getpid())
+ if has('unix')
+ call assert_equal(systemlist('echo $PPID')[0], string(getpid()))
+ endif
+endfunc
+
+func Test_hlexists()
+ call assert_equal(0, hlexists('does_not_exist'))
+ " call assert_equal(0, hlexists('Number'))
+ call assert_equal(0, highlight_exists('does_not_exist'))
+ " call assert_equal(0, highlight_exists('Number'))
+ syntax on
+ call assert_equal(0, hlexists('does_not_exist'))
+ " call assert_equal(1, hlexists('Number'))
+ call assert_equal(0, highlight_exists('does_not_exist'))
+ " call assert_equal(1, highlight_exists('Number'))
+ syntax off
+endfunc
+
+func Test_col()
+ new
+ call setline(1, 'abcdef')
+ norm gg4|mx6|mY2|
+ call assert_equal(2, col('.'))
+ call assert_equal(7, col('$'))
+ call assert_equal(4, col("'x"))
+ call assert_equal(6, col("'Y"))
+ call assert_equal(2, col([1, 2]))
+ call assert_equal(7, col([1, '$']))
+
+ call assert_equal(0, col(''))
+ call assert_equal(0, col('x'))
+ call assert_equal(0, col([2, '$']))
+ call assert_equal(0, col([1, 100]))
+ call assert_equal(0, col([1]))
+ bw!
+endfunc
+
+func Test_inputlist()
+ call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>1\<cr>", 'tx')
+ call assert_equal(1, c)
+ call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>2\<cr>", 'tx')
+ call assert_equal(2, c)
+ call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>3\<cr>", 'tx')
+ call assert_equal(3, c)
+
+ call assert_fails('call inputlist("")', 'E686:')
+endfunc
+
+func Test_balloon_show()
+ if has('balloon_eval')
+ " This won't do anything but must not crash either.
+ call balloon_show('hi!')
+ endif
+endfunc
+
+func Test_shellescape()
+ let save_shell = &shell
+ set shell=bash
+ call assert_equal("'text'", shellescape('text'))
+ call assert_equal("'te\"xt'", shellescape('te"xt'))
+ call assert_equal("'te'\\''xt'", shellescape("te'xt"))
+
+ call assert_equal("'te%xt'", shellescape("te%xt"))
+ call assert_equal("'te\\%xt'", shellescape("te%xt", 1))
+ call assert_equal("'te#xt'", shellescape("te#xt"))
+ call assert_equal("'te\\#xt'", shellescape("te#xt", 1))
+ call assert_equal("'te!xt'", shellescape("te!xt"))
+ call assert_equal("'te\\!xt'", shellescape("te!xt", 1))
+
+ call assert_equal("'te\nxt'", shellescape("te\nxt"))
+ call assert_equal("'te\\\nxt'", shellescape("te\nxt", 1))
+ set shell=tcsh
+ call assert_equal("'te\\!xt'", shellescape("te!xt"))
+ call assert_equal("'te\\\\!xt'", shellescape("te!xt", 1))
+ call assert_equal("'te\\\nxt'", shellescape("te\nxt"))
+ call assert_equal("'te\\\\\nxt'", shellescape("te\nxt", 1))
+
+ let &shell = save_shell
+endfunc
+
+func Test_redo_in_nested_functions()
+ nnoremap g. :set opfunc=Operator<CR>g@
+ function Operator( type, ... )
+ let @x = 'XXX'
+ execute 'normal! g`[' . (a:type ==# 'line' ? 'V' : 'v') . 'g`]' . '"xp'
+ endfunction
+
+ function! Apply()
+ 5,6normal! .
+ endfunction
+
+ new
+ call setline(1, repeat(['some "quoted" text', 'more "quoted" text'], 3))
+ 1normal g.i"
+ call assert_equal('some "XXX" text', getline(1))
+ 3,4normal .
+ call assert_equal('some "XXX" text', getline(3))
+ call assert_equal('more "XXX" text', getline(4))
+ call Apply()
+ call assert_equal('some "XXX" text', getline(5))
+ call assert_equal('more "XXX" text', getline(6))
+ bwipe!
+
+ nunmap g.
+ delfunc Operator
+ delfunc Apply
+endfunc
+
+func Test_trim()
+ call assert_equal("Testing", trim(" \t\r\r\x0BTesting \t\n\r\n\t\x0B\x0B"))
+ call assert_equal("Testing", trim(" \t \r\r\n\n\x0BTesting \t\n\r\n\t\x0B\x0B"))
+ call assert_equal("RESERVE", trim("xyz \twwRESERVEzyww \t\t", " wxyz\t"))
+ call assert_equal("wRE \tSERVEzyww", trim("wRE \tSERVEzyww"))
+ call assert_equal("abcd\t xxxx tail", trim(" \tabcd\t xxxx tail"))
+ call assert_equal("\tabcd\t xxxx tail", trim(" \tabcd\t xxxx tail", " "))
+ call assert_equal(" \tabcd\t xxxx tail", trim(" \tabcd\t xxxx tail", "abx"))
+ call assert_equal("RESERVE", trim("ไฝ RESERVEๅฅฝ", "ไฝ ๅฅฝ"))
+ call assert_equal("ๆ‚จR E SER V Eๆ—ฉ", trim("ไฝ ๅฅฝๆ‚จR E SER V Eๆ—ฉๅฅฝไฝ ไฝ ", "ไฝ ๅฅฝ"))
+ call assert_equal("ไฝ ๅฅฝๆ‚จR E SER V Eๆ—ฉๅฅฝไฝ ไฝ ", trim(" \n\r\r ไฝ ๅฅฝๆ‚จR E SER V Eๆ—ฉๅฅฝไฝ ไฝ  \t \x0B", ))
+ call assert_equal("ๆ‚จR E SER V Eๆ—ฉๅฅฝไฝ ไฝ  \t \x0B", trim(" ไฝ ๅฅฝๆ‚จR E SER V Eๆ—ฉๅฅฝไฝ ไฝ  \t \x0B", " ไฝ ๅฅฝ"))
+ call assert_equal("ๆ‚จR E SER V Eๆ—ฉๅฅฝไฝ ไฝ  \t \x0B", trim(" tteessttttไฝ ๅฅฝๆ‚จR E SER V Eๆ—ฉๅฅฝไฝ ไฝ  \t \x0B ttestt", " ไฝ ๅฅฝtes"))
+ call assert_equal("ๆ‚จR E SER V Eๆ—ฉๅฅฝไฝ ไฝ  \t \x0B", trim(" tteessttttไฝ ๅฅฝๆ‚จR E SER V Eๆ—ฉๅฅฝไฝ ไฝ  \t \x0B ttestt", " ไฝ ไฝ ไฝ ๅฅฝๅฅฝๅฅฝtttsses"))
+ call assert_equal("็•™ไธ‹", trim("่ฟ™ไบ›ไบ›ไธ่ฆ่ฟ™ไบ›็•™ไธ‹่ฟ™ไบ›", "่ฟ™ไบ›ไธ่ฆ"))
+ call assert_equal("", trim("", ""))
+ call assert_equal("a", trim("a", ""))
+ call assert_equal("", trim("", "a"))
+
+ let chars = join(map(range(1, 0x20) + [0xa0], {n -> nr2char(n)}), '')
+ call assert_equal("x", trim(chars . "x" . chars))
+endfunc
+
+func EditAnotherFile()
+ let word = expand('<cword>')
+ edit Xfuncrange2
+endfunc
+
+func Test_func_range_with_edit()
+ " Define a function that edits another buffer, then call it with a range that
+ " is invalid in that buffer.
+ call writefile(['just one line'], 'Xfuncrange2')
+ new
+ call setline(1, range(10))
+ write Xfuncrange1
+ call assert_fails('5,8call EditAnotherFile()', 'E16:')
+
+ call delete('Xfuncrange1')
+ call delete('Xfuncrange2')
+ bwipe!
+endfunc
diff --git a/src/nvim/testdir/test_ga.vim b/src/nvim/testdir/test_ga.vim
new file mode 100644
index 0000000000..6a7cba28f0
--- /dev/null
+++ b/src/nvim/testdir/test_ga.vim
@@ -0,0 +1,37 @@
+" Test ga normal command, and :ascii Ex command.
+func Do_ga(c)
+ call setline(1, a:c)
+ let l:a = execute("norm 1goga")
+ let l:b = execute("ascii")
+ call assert_equal(l:a, l:b)
+ return l:a
+endfunc
+
+func Test_ga_command()
+ new
+ set display=uhex
+ call assert_equal("\nNUL", Do_ga(''))
+ call assert_equal("\n<<01>> 1, Hex 01, Oct 001, Digr SH", Do_ga("\x01"))
+ call assert_equal("\n<<09>> 9, Hex 09, Oct 011, Digr HT", Do_ga("\t"))
+
+ set display=
+ call assert_equal("\nNUL", Do_ga(''))
+ call assert_equal("\n<^A> 1, Hex 01, Oct 001, Digr SH", Do_ga("\x01"))
+ call assert_equal("\n<^I> 9, Hex 09, Oct 011, Digr HT", Do_ga("\t"))
+
+ call assert_equal("\n<e> 101, Hex 65, Octal 145", Do_ga('e'))
+
+ if !has('multi_byte')
+ return
+ endif
+
+ " Test a few multi-bytes characters.
+ call assert_equal("\n<รฉ> 233, Hex 00e9, Oct 351, Digr e'", Do_ga('รฉ'))
+ call assert_equal("\n<แบป> 7867, Hex 1ebb, Oct 17273, Digr e2", Do_ga('แบป'))
+
+ " Test with combining characters.
+ call assert_equal("\n<e> 101, Hex 65, Octal 145 < ฬ> 769, Hex 0301, Octal 1401", Do_ga("e\u0301"))
+ call assert_equal("\n<e> 101, Hex 65, Octal 145 < ฬ> 769, Hex 0301, Octal 1401 < ฬฑ> 817, Hex 0331, Octal 1461", Do_ga("e\u0301\u0331"))
+ call assert_equal("\n<e> 101, Hex 65, Octal 145 < ฬ> 769, Hex 0301, Octal 1401 < ฬฑ> 817, Hex 0331, Octal 1461 < ฬธ> 824, Hex 0338, Octal 1470", Do_ga("e\u0301\u0331\u0338"))
+ bwipe!
+endfunc
diff --git a/src/nvim/testdir/test_getcwd.vim b/src/nvim/testdir/test_getcwd.vim
new file mode 100644
index 0000000000..5d97295e9a
--- /dev/null
+++ b/src/nvim/testdir/test_getcwd.vim
@@ -0,0 +1,112 @@
+function! GetCwdInfo(win, tab)
+ let tab_changed = 0
+ let mod = ":t"
+ if a:tab > 0 && a:tab != tabpagenr()
+ let tab_changed = 1
+ exec "tabnext " . a:tab
+ endif
+ let bufname = fnamemodify(bufname(winbufnr(a:win)), mod)
+ if tab_changed
+ tabprevious
+ endif
+ if a:win == 0 && a:tab == 0
+ let dirname = fnamemodify(getcwd(), mod)
+ let lflag = haslocaldir()
+ elseif a:tab == 0
+ let dirname = fnamemodify(getcwd(a:win), mod)
+ let lflag = haslocaldir(a:win)
+ else
+ let dirname = fnamemodify(getcwd(a:win, a:tab), mod)
+ let lflag = haslocaldir(a:win, a:tab)
+ endif
+ return bufname . ' ' . dirname . ' ' . lflag
+endfunction
+
+" Do all test in a separate window to avoid E211 when we recursively
+" delete the Xtopdir directory during cleanup
+function SetUp()
+ set visualbell
+ set nocp viminfo+=nviminfo
+
+ " On windows a swapfile in Xtopdir prevents it from being cleaned up.
+ set noswapfile
+
+ " On windows a stale "Xtopdir" directory may exist, remove it so that
+ " we start from a clean state.
+ call delete("Xtopdir", "rf")
+ new
+ call mkdir('Xtopdir')
+ cd Xtopdir
+ let g:topdir = getcwd()
+ call mkdir('Xdir1')
+ call mkdir('Xdir2')
+ call mkdir('Xdir3')
+endfunction
+
+let g:cwd=getcwd()
+function TearDown()
+ q
+ exec "cd " . g:cwd
+ call delete("Xtopdir", "rf")
+endfunction
+
+function Test_GetCwd()
+ new a
+ new b
+ new c
+ 3wincmd w
+ lcd Xdir1
+ call assert_equal("a Xdir1 1", GetCwdInfo(0, 0))
+ call assert_equal(g:topdir, getcwd(-1))
+ wincmd W
+ call assert_equal("b Xtopdir 0", GetCwdInfo(0, 0))
+ call assert_equal(g:topdir, getcwd(-1))
+ wincmd W
+ lcd Xdir3
+ call assert_equal("c Xdir3 1", GetCwdInfo(0, 0))
+ call assert_equal("a Xdir1 1", GetCwdInfo(bufwinnr("a"), 0))
+ call assert_equal("b Xtopdir 0", GetCwdInfo(bufwinnr("b"), 0))
+ call assert_equal("c Xdir3 1", GetCwdInfo(bufwinnr("c"), 0))
+ call assert_equal(g:topdir, getcwd(-1))
+ wincmd W
+ call assert_equal("a Xdir1 1", GetCwdInfo(bufwinnr("a"), tabpagenr()))
+ call assert_equal("b Xtopdir 0", GetCwdInfo(bufwinnr("b"), tabpagenr()))
+ call assert_equal("c Xdir3 1", GetCwdInfo(bufwinnr("c"), tabpagenr()))
+ call assert_equal(g:topdir, getcwd(-1))
+
+ tabnew x
+ new y
+ new z
+ 3wincmd w
+ call assert_equal("x Xtopdir 0", GetCwdInfo(0, 0))
+ call assert_equal(g:topdir, getcwd(-1))
+ wincmd W
+ lcd Xdir2
+ call assert_equal("y Xdir2 1", GetCwdInfo(0, 0))
+ call assert_equal(g:topdir, getcwd(-1))
+ wincmd W
+ lcd Xdir3
+ call assert_equal("z Xdir3 1", GetCwdInfo(0, 0))
+ call assert_equal("x Xtopdir 0", GetCwdInfo(bufwinnr("x"), 0))
+ call assert_equal("y Xdir2 1", GetCwdInfo(bufwinnr("y"), 0))
+ call assert_equal("z Xdir3 1", GetCwdInfo(bufwinnr("z"), 0))
+ call assert_equal(g:topdir, getcwd(-1))
+ let tp_nr = tabpagenr()
+ tabrewind
+ call assert_equal("x Xtopdir 0", GetCwdInfo(3, tp_nr))
+ call assert_equal("y Xdir2 1", GetCwdInfo(2, tp_nr))
+ call assert_equal("z Xdir3 1", GetCwdInfo(1, tp_nr))
+ call assert_equal(g:topdir, getcwd(-1))
+endfunc
+
+function Test_GetCwd_lcd_shellslash()
+ new
+ let root = fnamemodify('/', ':p')
+ exe 'lcd '.root
+ let cwd = getcwd()
+ if !exists('+shellslash') || &shellslash
+ call assert_equal(cwd[-1:], '/')
+ else
+ call assert_equal(cwd[-1:], '\')
+ endif
+endfunc
diff --git a/src/nvim/testdir/test_getvar.vim b/src/nvim/testdir/test_getvar.vim
new file mode 100644
index 0000000000..d6b6b69aa8
--- /dev/null
+++ b/src/nvim/testdir/test_getvar.vim
@@ -0,0 +1,104 @@
+" Tests for getwinvar(), gettabvar() and gettabwinvar().
+func Test_var()
+ " Use strings to test for memory leaks. First, check that in an empty
+ " window, gettabvar() returns the correct value
+ let t:testvar='abcd'
+ call assert_equal('abcd', gettabvar(1, 'testvar'))
+ call assert_equal('abcd', gettabvar(1, 'testvar'))
+
+ " test for getwinvar()
+ let w:var_str = "Dance"
+ let def_str = "Chance"
+ call assert_equal('Dance', getwinvar(1, 'var_str'))
+ call assert_equal('Dance', getwinvar(1, 'var_str', def_str))
+ call assert_equal({'var_str': 'Dance'}, getwinvar(1, ''))
+ call assert_equal({'var_str': 'Dance'}, getwinvar(1, '', def_str))
+ unlet w:var_str
+ call assert_equal('Chance', getwinvar(1, 'var_str', def_str))
+ call assert_equal({}, getwinvar(1, ''))
+ call assert_equal({}, getwinvar(1, '', def_str))
+ call assert_equal('', getwinvar(9, ''))
+ call assert_equal('Chance', getwinvar(9, '', def_str))
+ call assert_equal(0, getwinvar(1, '&nu'))
+ call assert_equal(0, getwinvar(1, '&nu', 1))
+ unlet def_str
+
+ " test for gettabvar()
+ tabnew
+ tabnew
+ let t:var_list = [1, 2, 3]
+ let t:other = 777
+ let def_list = [4, 5, 6, 7]
+ tabrewind
+ call assert_equal([1, 2, 3], gettabvar(3, 'var_list'))
+ call assert_equal([1, 2, 3], gettabvar(3, 'var_list', def_list))
+ call assert_equal({'var_list': [1, 2, 3], 'other': 777}, gettabvar(3, ''))
+ call assert_equal({'var_list': [1, 2, 3], 'other': 777},
+ \ gettabvar(3, '', def_list))
+
+ tablast
+ unlet t:var_list
+ tabrewind
+ call assert_equal([4, 5, 6, 7], gettabvar(3, 'var_list', def_list))
+ call assert_equal('', gettabvar(9, ''))
+ call assert_equal([4, 5, 6, 7], gettabvar(9, '', def_list))
+ call assert_equal('', gettabvar(3, '&nu'))
+ call assert_equal([4, 5, 6, 7], gettabvar(3, '&nu', def_list))
+ unlet def_list
+ tabonly
+
+ " test for gettabwinvar()
+ tabnew
+ tabnew
+ tabprev
+ split
+ split
+ wincmd w
+ vert split
+ wincmd w
+ let w:var_dict = {'dict': 'tabwin'}
+ let def_dict = {'dict2': 'newval'}
+ wincmd b
+ tabrewind
+ call assert_equal({'dict': 'tabwin'}, gettabwinvar(2, 3, 'var_dict'))
+ call assert_equal({'dict': 'tabwin'},
+ \ gettabwinvar(2, 3, 'var_dict', def_dict))
+ call assert_equal({'var_dict': {'dict': 'tabwin'}}, gettabwinvar(2, 3, ''))
+ call assert_equal({'var_dict': {'dict': 'tabwin'}},
+ \ gettabwinvar(2, 3, '', def_dict))
+
+ tabnext
+ 3wincmd w
+ unlet w:var_dict
+ tabrewind
+ call assert_equal({'dict2': 'newval'},
+ \ gettabwinvar(2, 3, 'var_dict', def_dict))
+ call assert_equal({}, gettabwinvar(2, 3, ''))
+ call assert_equal({}, gettabwinvar(2, 3, '', def_dict))
+ call assert_equal("", gettabwinvar(2, 9, ''))
+ call assert_equal({'dict2': 'newval'}, gettabwinvar(2, 9, '', def_dict))
+ call assert_equal('', gettabwinvar(9, 3, ''))
+ call assert_equal({'dict2': 'newval'}, gettabwinvar(9, 3, '', def_dict))
+
+ unlet def_dict
+
+ call assert_equal('', gettabwinvar(2, 3, '&nux'))
+ call assert_equal(1, gettabwinvar(2, 3, '&nux', 1))
+ tabonly
+endfunc
+
+" It was discovered that "gettabvar()" would fail if called from within the
+" tabline when the user closed a window. This test confirms the fix.
+func Test_gettabvar_in_tabline()
+ let t:var_str = 'value'
+
+ set tabline=%{assert_equal('value',gettabvar(1,'var_str'))}
+ set showtabline=2
+
+ " Simulate the user opening a split (which becomes window #1) and then
+ " closing the split, which triggers the redrawing of the tabline.
+ leftabove split
+ redrawstatus!
+ close
+ redrawstatus!
+endfunc
diff --git a/src/nvim/testdir/test_gf.vim b/src/nvim/testdir/test_gf.vim
new file mode 100644
index 0000000000..c352379697
--- /dev/null
+++ b/src/nvim/testdir/test_gf.vim
@@ -0,0 +1,61 @@
+
+" This is a test if a URL is recognized by "gf", with the cursor before and
+" after the "://". Also test ":\\".
+func Test_gf_url()
+ enew!
+ call append(0, [
+ \ "first test for URL://machine.name/tmp/vimtest2a and other text",
+ \ "second test for URL://machine.name/tmp/vimtest2b. And other text",
+ \ "third test for URL:\\\\machine.name\\vimtest2c and other text",
+ \ "fourth test for URL:\\\\machine.name\\tmp\\vimtest2d, and other text",
+ \ "fifth test for URL://machine.name/tmp?q=vim&opt=yes and other text",
+ \ ])
+ call cursor(1,1)
+ call search("^first")
+ call search("tmp")
+ call assert_equal("URL://machine.name/tmp/vimtest2a", expand("<cfile>"))
+ call search("^second")
+ call search("URL")
+ call assert_equal("URL://machine.name/tmp/vimtest2b", expand("<cfile>"))
+ if has("ebcdic")
+ set isf=@,240-249,/,.,-,_,+,,,$,:,~,\
+ else
+ set isf=@,48-57,/,.,-,_,+,,,$,:,~,\
+ endif
+ call search("^third")
+ call search("name")
+ call assert_equal("URL:\\\\machine.name\\vimtest2c", expand("<cfile>"))
+ call search("^fourth")
+ call search("URL")
+ call assert_equal("URL:\\\\machine.name\\tmp\\vimtest2d", expand("<cfile>"))
+
+ call search("^fifth")
+ call search("URL")
+ call assert_equal("URL://machine.name/tmp?q=vim&opt=yes", expand("<cfile>"))
+
+ set isf&vim
+ enew!
+endfunc
+
+func Test_gF()
+ new
+ call setline(1, ['111', '222', '333', '444'])
+ w! Xfile
+ close
+ new
+ set isfname-=:
+ call setline(1, ['one', 'Xfile:3', 'three'])
+ 2
+ call assert_fails('normal gF', 'E37:')
+ call assert_equal(2, getcurpos()[1])
+ w! Xfile2
+ normal gF
+ call assert_equal('Xfile', bufname('%'))
+ call assert_equal(3, getcurpos()[1])
+
+ set isfname&
+ call delete('Xfile')
+ call delete('Xfile2')
+ bwipe Xfile
+ bwipe Xfile2
+endfunc
diff --git a/src/nvim/testdir/test_glob2regpat.vim b/src/nvim/testdir/test_glob2regpat.vim
new file mode 100644
index 0000000000..fdf17946b6
--- /dev/null
+++ b/src/nvim/testdir/test_glob2regpat.vim
@@ -0,0 +1,30 @@
+" Test glob2regpat()
+
+func Test_invalid()
+ call assert_fails('call glob2regpat(1.33)', 'E806:')
+ call assert_fails('call glob2regpat("}")', 'E219:')
+ call assert_fails('call glob2regpat("{")', 'E220:')
+endfunc
+
+func Test_valid()
+ call assert_equal('^foo\.', glob2regpat('foo.*'))
+ call assert_equal('^foo.$', glob2regpat('foo?'))
+ call assert_equal('\.vim$', glob2regpat('*.vim'))
+ call assert_equal('^[abc]$', glob2regpat('[abc]'))
+ call assert_equal('^foo bar$', glob2regpat('foo\ bar'))
+ call assert_equal('^foo,bar$', glob2regpat('foo,bar'))
+ call assert_equal('^\(foo\|bar\)$', glob2regpat('{foo,bar}'))
+ call assert_equal('.*', glob2regpat('**'))
+
+ if exists('+shellslash')
+ call assert_equal('^foo[\/].$', glob2regpat('foo\?'))
+ call assert_equal('^\(foo[\/]\|bar\|foobar\)$', glob2regpat('{foo\,bar,foobar}'))
+ call assert_equal('^[\/]\(foo\|bar[\/]\)$', glob2regpat('\{foo,bar\}'))
+ call assert_equal('^[\/][\/]\(foo\|bar[\/][\/]\)$', glob2regpat('\\{foo,bar\\}'))
+ else
+ call assert_equal('^foo?$', glob2regpat('foo\?'))
+ call assert_equal('^\(foo,bar\|foobar\)$', glob2regpat('{foo\,bar,foobar}'))
+ call assert_equal('^{foo,bar}$', glob2regpat('\{foo,bar\}'))
+ call assert_equal('^\\\(foo\|bar\\\)$', glob2regpat('\\{foo,bar\\}'))
+ endif
+endfunc
diff --git a/src/nvim/testdir/test_global.vim b/src/nvim/testdir/test_global.vim
new file mode 100644
index 0000000000..bdeaf8e2cf
--- /dev/null
+++ b/src/nvim/testdir/test_global.vim
@@ -0,0 +1,20 @@
+
+func Test_yank_put_clipboard()
+ new
+ call setline(1, ['a', 'b', 'c'])
+ set clipboard=unnamed
+ g/^/normal yyp
+ call assert_equal(['a', 'a', 'b', 'b', 'c', 'c'], getline(1, 6))
+
+ set clipboard&
+ bwipe!
+endfunc
+
+func Test_nested_global()
+ new
+ call setline(1, ['nothing', 'found', 'found bad', 'bad'])
+ call assert_fails('g/found/3v/bad/s/^/++/', 'E147')
+ g/found/v/bad/s/^/++/
+ call assert_equal(['nothing', '++found', 'found bad', 'bad'], getline(1, 4))
+ bwipe!
+endfunc
diff --git a/src/nvim/testdir/test_gn.vim b/src/nvim/testdir/test_gn.vim
new file mode 100644
index 0000000000..405425a42b
--- /dev/null
+++ b/src/nvim/testdir/test_gn.vim
@@ -0,0 +1,136 @@
+" Test for gn command
+
+func Test_gn_command()
+ set belloff=all
+ noautocmd new
+ " replace a single char by itsself quoted:
+ call setline('.', 'abc x def x ghi x jkl')
+ let @/ = 'x'
+ exe "norm! cgn'x'\<esc>.."
+ call assert_equal("abc 'x' def 'x' ghi 'x' jkl", getline('.'))
+ sil! %d_
+
+ " simple search match
+ call setline('.', 'foobar')
+ let @/ = 'foobar'
+ exe "norm! gncsearchmatch"
+ call assert_equal('searchmatch', getline('.'))
+ sil! %d _
+
+ " replace a multi-line match
+ call setline('.', ['', 'one', 'two'])
+ let @/ = 'one\_s*two\_s'
+ exe "norm! gnceins\<CR>zwei"
+ call assert_equal(['','eins','zwei'], getline(1,'$'))
+ sil! %d _
+
+ " test count argument
+ call setline('.', ['', 'abcdx | abcdx | abcdx'])
+ let @/ = '[a]bcdx'
+ exe "norm! 2gnd"
+ call assert_equal(['','abcdx | | abcdx'], getline(1,'$'))
+ sil! %d _
+
+ " join lines
+ call setline('.', ['join ', 'lines'])
+ let @/ = '$'
+ exe "norm! 0gnd"
+ call assert_equal(['join lines'], getline(1,'$'))
+ sil! %d _
+
+ " zero-width match
+ call setline('.', ['', 'zero width pattern'])
+ let @/ = '\>\zs'
+ exe "norm! 0gnd"
+ call assert_equal(['', 'zerowidth pattern'], getline(1,'$'))
+ sil! %d _
+
+ " delete first and last chars
+ call setline('.', ['delete first and last chars'])
+ let @/ = '^'
+ exe "norm! 0gnd$"
+ let @/ = '\zs'
+ exe "norm! gnd"
+ call assert_equal(['elete first and last char'], getline(1,'$'))
+ sil! %d _
+
+ " using visual mode
+ call setline('.', ['', 'uniquepattern uniquepattern'])
+ exe "norm! /[u]niquepattern/s\<cr>vlgnd"
+ call assert_equal(['', ' uniquepattern'], getline(1,'$'))
+ sil! %d _
+
+ " backwards search
+ call setline('.', ['my very excellent mother just served us nachos'])
+ let @/ = 'mother'
+ exe "norm! $cgNmongoose"
+ call assert_equal(['my very excellent mongoose just served us nachos'], getline(1,'$'))
+ sil! %d _
+
+ " search for single char
+ call setline('.', ['','for (i=0; i<=10; i++)'])
+ let @/ = 'i'
+ exe "norm! cgnj"
+ call assert_equal(['','for (j=0; i<=10; i++)'], getline(1,'$'))
+ sil! %d _
+
+ " search hex char
+ call setline('.', ['','Y'])
+ set noignorecase
+ let @/ = '\%x59'
+ exe "norm! gnd"
+ call assert_equal(['',''], getline(1,'$'))
+ sil! %d _
+
+ " test repeating gdn
+ call setline('.', ['', '1', 'Johnny', '2', 'Johnny', '3'])
+ let @/ = 'Johnny'
+ exe "norm! dgn."
+ call assert_equal(['','1', '', '2', '', '3'], getline(1,'$'))
+ sil! %d _
+
+ " test repeating gUgn
+ call setline('.', ['', '1', 'Depp', '2', 'Depp', '3'])
+ let @/ = 'Depp'
+ exe "norm! gUgn."
+ call assert_equal(['', '1', 'DEPP', '2', 'DEPP', '3'], getline(1,'$'))
+ sil! %d _
+
+ " test using look-ahead assertions
+ call setline('.', ['a:10', '', 'a:1', '', 'a:20'])
+ let @/ = 'a:0\@!\zs\d\+'
+ exe "norm! 2nygno\<esc>p"
+ call assert_equal(['a:10', '', 'a:1', '1', '', 'a:20'], getline(1,'$'))
+ sil! %d _
+
+ " test using nowrapscan
+ set nowrapscan
+ call setline(1, 'foo bar baz')
+ exe "norm! /bar/e\<cr>"
+ exe "norm! gnd"
+ call assert_equal(['foo baz'], getline(1,'$'))
+ sil! %d_
+
+ " search upwards with nowrapscan set
+ call setline('.', ['foo', 'bar', 'foo', 'baz'])
+ set nowrapscan
+ let @/ = 'foo'
+ $
+ norm! dgN
+ call assert_equal(['foo', 'bar', '', 'baz'], getline(1,'$'))
+ sil! %d_
+
+ " search using the \zs atom
+ call setline(1, [' nnoremap', '' , 'nnoremap'])
+ set wrapscan&vim
+ let @/ = '\_s\zsnnoremap'
+ $
+ norm! cgnmatch
+ call assert_equal([' nnoremap', '', 'match'], getline(1,'$'))
+ sil! %d_
+
+ set wrapscan&vim
+ set belloff&vim
+endfu
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_goto.vim b/src/nvim/testdir/test_goto.vim
new file mode 100644
index 0000000000..c0235b1707
--- /dev/null
+++ b/src/nvim/testdir/test_goto.vim
@@ -0,0 +1,373 @@
+" Test commands that jump somewhere.
+
+" Create a new buffer using "lines" and place the cursor on the word after the
+" first occurrence of return and invoke "cmd". The cursor should now be
+" positioned at the given line and col.
+func XTest_goto_decl(cmd, lines, line, col)
+ new
+ call setline(1, a:lines)
+ /return/
+ normal! W
+ execute 'norm! ' . a:cmd
+ call assert_equal(a:line, line('.'))
+ call assert_equal(a:col, col('.'))
+ quit!
+endfunc
+
+func Test_gD()
+ let lines = [
+ \ 'int x;',
+ \ '',
+ \ 'int func(void)',
+ \ '{',
+ \ ' return x;',
+ \ '}',
+ \ ]
+ call XTest_goto_decl('gD', lines, 1, 5)
+endfunc
+
+func Test_gD_too()
+ let lines = [
+ \ 'Filename x;',
+ \ '',
+ \ 'int Filename',
+ \ 'int func() {',
+ \ ' Filename x;',
+ \ ' return x;',
+ \ ]
+ call XTest_goto_decl('gD', lines, 1, 10)
+endfunc
+
+func Test_gD_comment()
+ let lines = [
+ \ '/* int x; */',
+ \ 'int x;',
+ \ '',
+ \ 'int func(void)',
+ \ '{',
+ \ ' return x;',
+ \ '}',
+ \ ]
+ call XTest_goto_decl('gD', lines, 2, 5)
+endfunc
+
+func Test_gD_inline_comment()
+ let lines = [
+ \ 'int y /* , x */;',
+ \ 'int x;',
+ \ '',
+ \ 'int func(void)',
+ \ '{',
+ \ ' return x;',
+ \ '}',
+ \ ]
+ call XTest_goto_decl('gD', lines, 2, 5)
+endfunc
+
+func Test_gD_string()
+ let lines = [
+ \ 'char *s[] = "x";',
+ \ 'int x = 1;',
+ \ '',
+ \ 'int func(void)',
+ \ '{',
+ \ ' return x;',
+ \ '}',
+ \ ]
+ call XTest_goto_decl('gD', lines, 2, 5)
+endfunc
+
+func Test_gD_string_same_line()
+ let lines = [
+ \ 'char *s[] = "x", int x = 1;',
+ \ '',
+ \ 'int func(void)',
+ \ '{',
+ \ ' return x;',
+ \ '}',
+ \ ]
+ call XTest_goto_decl('gD', lines, 1, 22)
+endfunc
+
+func Test_gD_char()
+ let lines = [
+ \ "char c = 'x';",
+ \ 'int x = 1;',
+ \ '',
+ \ 'int func(void)',
+ \ '{',
+ \ ' return x;',
+ \ '}',
+ \ ]
+ call XTest_goto_decl('gD', lines, 2, 5)
+endfunc
+
+func Test_gd()
+ let lines = [
+ \ 'int x;',
+ \ '',
+ \ 'int func(int x)',
+ \ '{',
+ \ ' return x;',
+ \ '}',
+ \ ]
+ call XTest_goto_decl('gd', lines, 3, 14)
+endfunc
+
+func Test_gd_not_local()
+ let lines = [
+ \ 'int func1(void)',
+ \ '{',
+ \ ' return x;',
+ \ '}',
+ \ '',
+ \ 'int func2(int x)',
+ \ '{',
+ \ ' return x;',
+ \ '}',
+ \ ]
+ call XTest_goto_decl('gd', lines, 3, 10)
+endfunc
+
+func Test_gd_kr_style()
+ let lines = [
+ \ 'int func(x)',
+ \ ' int x;',
+ \ '{',
+ \ ' return x;',
+ \ '}',
+ \ ]
+ call XTest_goto_decl('gd', lines, 2, 7)
+endfunc
+
+func Test_gd_missing_braces()
+ let lines = [
+ \ 'def func1(a)',
+ \ ' a + 1',
+ \ 'end',
+ \ '',
+ \ 'a = 1',
+ \ '',
+ \ 'def func2()',
+ \ ' return a',
+ \ 'end',
+ \ ]
+ call XTest_goto_decl('gd', lines, 1, 11)
+endfunc
+
+func Test_gd_comment()
+ let lines = [
+ \ 'int func(void)',
+ \ '{',
+ \ ' /* int x; */',
+ \ ' int x;',
+ \ ' return x;',
+ \ '}',
+ \]
+ call XTest_goto_decl('gd', lines, 4, 7)
+endfunc
+
+func Test_gd_comment_in_string()
+ let lines = [
+ \ 'int func(void)',
+ \ '{',
+ \ ' char *s ="//"; int x;',
+ \ ' int x;',
+ \ ' return x;',
+ \ '}',
+ \]
+ call XTest_goto_decl('gd', lines, 3, 22)
+endfunc
+
+func Test_gd_string_in_comment()
+ set comments=
+ let lines = [
+ \ 'int func(void)',
+ \ '{',
+ \ ' /* " */ int x;',
+ \ ' int x;',
+ \ ' return x;',
+ \ '}',
+ \]
+ call XTest_goto_decl('gd', lines, 3, 15)
+ set comments&
+endfunc
+
+func Test_gd_inline_comment()
+ let lines = [
+ \ 'int func(/* x is an int */ int x)',
+ \ '{',
+ \ ' return x;',
+ \ '}',
+ \ ]
+ call XTest_goto_decl('gd', lines, 1, 32)
+endfunc
+
+func Test_gd_inline_comment_only()
+ let lines = [
+ \ 'int func(void) /* one lonely x */',
+ \ '{',
+ \ ' return x;',
+ \ '}',
+ \ ]
+ call XTest_goto_decl('gd', lines, 3, 10)
+endfunc
+
+func Test_gd_inline_comment_body()
+ let lines = [
+ \ 'int func(void)',
+ \ '{',
+ \ ' int y /* , x */;',
+ \ '',
+ \ ' for (/* int x = 0 */; y < 2; y++);',
+ \ '',
+ \ ' int x = 0;',
+ \ '',
+ \ ' return x;',
+ \ '}',
+ \ ]
+ call XTest_goto_decl('gd', lines, 7, 7)
+endfunc
+
+func Test_gd_trailing_multiline_comment()
+ let lines = [
+ \ 'int func(int x) /* x is an int */',
+ \ '{',
+ \ ' return x;',
+ \ '}',
+ \ ]
+ call XTest_goto_decl('gd', lines, 1, 14)
+endfunc
+
+func Test_gd_trailing_comment()
+ let lines = [
+ \ 'int func(int x) // x is an int',
+ \ '{',
+ \ ' return x;',
+ \ '}',
+ \ ]
+ call XTest_goto_decl('gd', lines, 1, 14)
+endfunc
+
+func Test_gd_string()
+ let lines = [
+ \ 'int func(void)',
+ \ '{',
+ \ ' char *s = "x";',
+ \ ' int x = 1;',
+ \ '',
+ \ ' return x;',
+ \ '}',
+ \ ]
+ call XTest_goto_decl('gd', lines, 4, 7)
+endfunc
+
+func Test_gd_string_only()
+ let lines = [
+ \ 'int func(void)',
+ \ '{',
+ \ ' char *s = "x";',
+ \ '',
+ \ ' return x;',
+ \ '}',
+ \ ]
+ call XTest_goto_decl('gd', lines, 5, 10)
+endfunc
+
+" Check that setting 'cursorline' does not change curswant
+func Test_cursorline_keep_col()
+ new
+ call setline(1, ['long long long line', 'short line'])
+ normal ggfi
+ let pos = getcurpos()
+ normal j
+ set cursorline
+ normal k
+ call assert_equal(pos, getcurpos())
+ bwipe!
+ set nocursorline
+endfunc
+
+func Test_gd_local_block()
+ let lines = [
+ \ ' int main()',
+ \ '{',
+ \ ' char *a = "NOT NULL";',
+ \ ' if(a)',
+ \ ' {',
+ \ ' char *b = a;',
+ \ ' printf("%s\n", b);',
+ \ ' }',
+ \ ' else',
+ \ ' {',
+ \ ' char *b = "NULL";',
+ \ ' return b;',
+ \ ' }',
+ \ '',
+ \ ' return 0;',
+ \ '}',
+ \ ]
+ call XTest_goto_decl('1gd', lines, 11, 11)
+endfunc
+
+func Test_motion_if_elif_else_endif()
+ new
+ a
+/* Test pressing % on #if, #else #elsif and #endif,
+ * with nested #if
+ */
+#if FOO
+/* ... */
+# if BAR
+/* ... */
+# endif
+#elif BAR
+/* ... */
+#else
+/* ... */
+#endif
+.
+ /#if FOO
+ norm %
+ call assert_equal([9, 1], getpos('.')[1:2])
+ norm %
+ call assert_equal([11, 1], getpos('.')[1:2])
+ norm %
+ call assert_equal([13, 1], getpos('.')[1:2])
+ norm %
+ call assert_equal([4, 1], getpos('.')[1:2])
+ /# if BAR
+ norm $%
+ call assert_equal([8, 1], getpos('.')[1:2])
+ norm $%
+ call assert_equal([6, 1], getpos('.')[1:2])
+
+ bw!
+endfunc
+
+func Test_motion_c_comment()
+ new
+ a
+/*
+ * Test pressing % on beginning/end
+ * of C comments.
+ */
+/* Another comment */
+.
+ norm gg0%
+ call assert_equal([4, 3], getpos('.')[1:2])
+ norm %
+ call assert_equal([1, 1], getpos('.')[1:2])
+ norm gg0l%
+ call assert_equal([4, 3], getpos('.')[1:2])
+ norm h%
+ call assert_equal([1, 1], getpos('.')[1:2])
+
+ norm G^
+ norm %
+ call assert_equal([5, 21], getpos('.')[1:2])
+ norm %
+ call assert_equal([5, 1], getpos('.')[1:2])
+
+ bw!
+endfunc
diff --git a/src/nvim/testdir/test_hardcopy.vim b/src/nvim/testdir/test_hardcopy.vim
index 4629d17dd2..ced13b107c 100644
--- a/src/nvim/testdir/test_hardcopy.vim
+++ b/src/nvim/testdir/test_hardcopy.vim
@@ -23,6 +23,10 @@ func Test_printoptions_parsing()
set printoptions=formfeed:y
set printoptions=
set printoptions&
+
+ call assert_fails('set printoptions=paper', 'E550:')
+ call assert_fails('set printoptions=shredder:on', 'E551:')
+ call assert_fails('set printoptions=left:no', 'E552:')
endfunc
func Test_printmbfont_parsing()
@@ -46,6 +50,7 @@ endfunc
" We don't check much of the contents.
func Test_with_syntax()
if has('postscript')
+ edit test_hardcopy.vim
set printoptions=syntax:y
syn on
hardcopy > Xhardcopy
@@ -56,3 +61,29 @@ func Test_with_syntax()
set printoptions&
endif
endfunc
+
+func Test_fname_with_spaces()
+ if !has('postscript')
+ return
+ endif
+ split t\ e\ s\ t.txt
+ call setline(1, ['just', 'some', 'text'])
+ hardcopy > %.ps
+ call assert_true(filereadable('t e s t.txt.ps'))
+ call delete('t e s t.txt.ps')
+ bwipe!
+endfunc
+
+func Test_illegal_byte()
+ if !has('postscript') || &enc != 'utf-8'
+ return
+ endif
+ new
+ " conversion of 0xff will fail, this used to cause a crash
+ call setline(1, "\xff")
+ hardcopy >Xpstest
+
+ bwipe!
+ call delete('Xpstest')
+endfunc
+
diff --git a/src/nvim/testdir/test_help.vim b/src/nvim/testdir/test_help.vim
new file mode 100644
index 0000000000..ed3181564c
--- /dev/null
+++ b/src/nvim/testdir/test_help.vim
@@ -0,0 +1,52 @@
+
+" Tests for :help
+
+func Test_help_restore_snapshot()
+ help
+ set buftype=
+ help
+ edit x
+ help
+ helpclose
+endfunc
+
+func Test_help_errors()
+ call assert_fails('help doesnotexist', 'E149:')
+ call assert_fails('help!', 'E478:')
+
+ new
+ set keywordprg=:help
+ call setline(1, " ")
+ call assert_fails('normal VK', 'E349:')
+ bwipe!
+endfunc
+
+func Test_help_keyword()
+ new
+ set keywordprg=:help
+ call setline(1, " Visual ")
+ normal VK
+ call assert_match('^Visual mode', getline('.'))
+ call assert_equal('help', &ft)
+ close
+ bwipe!
+endfunc
+
+func Test_help_local_additions()
+ call mkdir('Xruntime/doc', 'p')
+ call writefile(['*mydoc.txt* my awesome doc'], 'Xruntime/doc/mydoc.txt')
+ call writefile(['*mydoc-ext.txt* my extended awesome doc'], 'Xruntime/doc/mydoc-ext.txt')
+ let rtp_save = &rtp
+ set rtp+=./Xruntime
+ help
+ 1
+ call search('mydoc.txt')
+ call assert_equal('|mydoc.txt| my awesome doc', getline('.'))
+ 1
+ call search('mydoc-ext.txt')
+ call assert_equal('|mydoc-ext.txt| my extended awesome doc', getline('.'))
+ close
+
+ call delete('Xruntime', 'rf')
+ let &rtp = rtp_save
+endfunc
diff --git a/src/nvim/testdir/test_help_tagjump.vim b/src/nvim/testdir/test_help_tagjump.vim
index 9f9207d27d..c873487b92 100644
--- a/src/nvim/testdir/test_help_tagjump.vim
+++ b/src/nvim/testdir/test_help_tagjump.vim
@@ -18,6 +18,80 @@ func Test_help_tagjump()
call assert_true(getline('.') =~ '\*help.txt\*')
helpclose
+ help |
+ call assert_equal("help", &filetype)
+ call assert_true(getline('.') =~ '\*bar\*')
+ helpclose
+
+ help "*
+ call assert_equal("help", &filetype)
+ call assert_true(getline('.') =~ '\*quotestar\*')
+ helpclose
+
+ help sp?it
+ call assert_equal("help", &filetype)
+ call assert_true(getline('.') =~ '\*'.(has('win32') ? 'split()' : ':split').'\*')
+ helpclose
+
+ help :?
+ call assert_equal("help", &filetype)
+ call assert_true(getline('.') =~ '\*:?\*')
+ helpclose
+
+ help q?
+ call assert_equal("help", &filetype)
+ call assert_true(getline('.') =~ '\*q?\*')
+ call assert_true(expand('<cword>') == 'q?')
+ helpclose
+
+ help -?
+ call assert_equal("help", &filetype)
+ call assert_true(getline('.') =~ '\*-?\*')
+ helpclose
+
+ help v_g?
+ call assert_equal("help", &filetype)
+ call assert_true(getline('.') =~ '\*v_g?\*')
+ helpclose
+
+ help expr-!=?
+ call assert_equal("help", &filetype)
+ call assert_true(getline('.') =~ '\*expr-!=?\*')
+ call assert_true(expand('<cword>') == 'expr-!=?')
+ helpclose
+
+ help expr-isnot?
+ call assert_equal("help", &filetype)
+ call assert_true(getline('.') =~ '\*expr-isnot?\*')
+ call assert_true(expand('<cword>') == 'expr-isnot?')
+ helpclose
+
+ help FileW*Post
+ call assert_equal("help", &filetype)
+ call assert_true(getline('.') =~ '\*FileWritePost\*')
+ helpclose
+
+ help `ls`
+ call assert_equal("help", &filetype)
+ call assert_true(getline('.') =~ '\*:ls\*')
+ helpclose
+
+ help ^X
+ call assert_equal("help", &filetype)
+ call assert_true(getline('.') =~ '\*CTRL-X\*')
+ helpclose
+
+ help i_^_CTRL-D
+ call assert_equal("help", &filetype)
+ call assert_true(getline('.') =~ '\*i_^_CTRL-D\*')
+ helpclose
+
+ exec "help \<C-V>"
+ call assert_equal("help", &filetype)
+ call assert_true(getline('.') =~ '\*CTRL-V\*')
+ helpclose
+
+
exec "help! ('textwidth'"
call assert_equal("help", &filetype)
call assert_true(getline('.') =~ "\\*'textwidth'\\*")
@@ -37,4 +111,162 @@ func Test_help_tagjump()
call assert_equal("help", &filetype)
call assert_true(getline('.') =~ '\*arglistid()\*')
helpclose
+
+ exec "help! 'autoindent'."
+ call assert_equal("help", &filetype)
+ call assert_true(getline('.') =~ "\\*'autoindent'\\*")
+ helpclose
+
+ exec "help! {address}."
+ call assert_equal("help", &filetype)
+ call assert_true(getline('.') =~ '\*{address}\*')
+ helpclose
+
+ exusage
+ call assert_equal("help", &filetype)
+ call assert_true(getline('.') =~ '\*:index\*')
+ helpclose
+
+ viusage
+ call assert_equal("help", &filetype)
+ call assert_true(getline('.') =~ '\*normal-index\*')
+ helpclose
+endfunc
+
+let s:langs = ['en', 'ab', 'ja']
+
+func s:doc_config_setup()
+ let s:helpfile_save = &helpfile
+ let &helpfile="Xdir1/doc-en/doc/testdoc.txt"
+ let s:rtp_save = &rtp
+ let &rtp="Xdir1/doc-en"
+ if has('multi_lang')
+ let s:helplang_save=&helplang
+ endif
+
+ call delete('Xdir1', 'rf')
+
+ for lang in s:langs
+ if lang ==# 'en'
+ let tagfname = 'tags'
+ let docfname = 'testdoc.txt'
+ else
+ let tagfname = 'tags-' . lang
+ let docfname = 'testdoc.' . lang . 'x'
+ endif
+ let docdir = "Xdir1/doc-" . lang . "/doc"
+ call mkdir(docdir, "p")
+ call writefile(["\t*test-char*", "\t*test-col*"], docdir . '/' . docfname)
+ call writefile(["test-char\t" . docfname . "\t/*test-char*",
+ \ "test-col\t" . docfname . "\t/*test-col*"],
+ \ docdir . '/' . tagfname)
+ endfor
endfunc
+
+func s:doc_config_teardown()
+ call delete('Xdir1', 'rf')
+
+ let &helpfile = s:helpfile_save
+ let &rtp = s:rtp_save
+ if has('multi_lang')
+ let &helplang = s:helplang_save
+ endif
+endfunc
+
+func s:get_help_compl_list(cmd)
+ return getcompletion(a:cmd, 'help')
+endfunc
+
+func Test_help_complete()
+ try
+ let list = []
+ call s:doc_config_setup()
+
+ " 'helplang=' and help file lang is 'en'
+ if has('multi_lang')
+ set helplang=
+ endif
+ let list = s:get_help_compl_list("test")
+ call assert_equal(['test-col', 'test-char'], list)
+
+ if has('multi_lang')
+ " 'helplang=ab' and help file lang is 'en'
+ set helplang=ab
+ let list = s:get_help_compl_list("test")
+ call assert_equal(['test-col', 'test-char'], list)
+
+ " 'helplang=' and help file lang is 'en' and 'ab'
+ set rtp+=Xdir1/doc-ab
+ set helplang=
+ let list = s:get_help_compl_list("test")
+ call assert_equal(sort(['test-col@en', 'test-col@ab',
+ \ 'test-char@en', 'test-char@ab']), sort(list))
+
+ " 'helplang=ab' and help file lang is 'en' and 'ab'
+ set helplang=ab
+ let list = s:get_help_compl_list("test")
+ call assert_equal(sort(['test-col', 'test-col@en',
+ \ 'test-char', 'test-char@en']), sort(list))
+
+ " 'helplang=' and help file lang is 'en', 'ab' and 'ja'
+ set rtp+=Xdir1/doc-ja
+ set helplang=
+ let list = s:get_help_compl_list("test")
+ call assert_equal(sort(['test-col@en', 'test-col@ab',
+ \ 'test-col@ja', 'test-char@en',
+ \ 'test-char@ab', 'test-char@ja']), sort(list))
+
+ " 'helplang=ab' and help file lang is 'en', 'ab' and 'ja'
+ set helplang=ab
+ let list = s:get_help_compl_list("test")
+ call assert_equal(sort(['test-col', 'test-col@en',
+ \ 'test-col@ja', 'test-char',
+ \ 'test-char@en', 'test-char@ja']), sort(list))
+
+ " 'helplang=ab,ja' and help file lang is 'en', 'ab' and 'ja'
+ set helplang=ab,ja
+ let list = s:get_help_compl_list("test")
+ call assert_equal(sort(['test-col', 'test-col@ja',
+ \ 'test-col@en', 'test-char',
+ \ 'test-char@ja', 'test-char@en']), sort(list))
+ endif
+ catch
+ call assert_exception('X')
+ finally
+ call s:doc_config_teardown()
+ endtry
+endfunc
+
+func Test_help_respect_current_file_lang()
+ try
+ let list = []
+ call s:doc_config_setup()
+
+ if has('multi_lang')
+ function s:check_help_file_ext(help_keyword, ext)
+ exec 'help ' . a:help_keyword
+ call assert_equal(a:ext, expand('%:e'))
+ call feedkeys("\<C-]>", 'tx')
+ call assert_equal(a:ext, expand('%:e'))
+ pop
+ helpclose
+ endfunc
+
+ set rtp+=Xdir1/doc-ab
+ set rtp+=Xdir1/doc-ja
+
+ set helplang=ab
+ call s:check_help_file_ext('test-char', 'abx')
+ call s:check_help_file_ext('test-char@ja', 'jax')
+ set helplang=ab,ja
+ call s:check_help_file_ext('test-char@ja', 'jax')
+ call s:check_help_file_ext('test-char@en', 'txt')
+ endif
+ catch
+ call assert_exception('X')
+ finally
+ call s:doc_config_teardown()
+ endtry
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_hide.vim b/src/nvim/testdir/test_hide.vim
new file mode 100644
index 0000000000..128b8ff945
--- /dev/null
+++ b/src/nvim/testdir/test_hide.vim
@@ -0,0 +1,97 @@
+" Tests for :hide command/modifier and 'hidden' option
+
+function SetUp()
+ let s:save_hidden = &hidden
+ let s:save_bufhidden = &bufhidden
+ let s:save_autowrite = &autowrite
+ set nohidden
+ set bufhidden=
+ set noautowrite
+endfunc
+
+function TearDown()
+ let &hidden = s:save_hidden
+ let &bufhidden = s:save_bufhidden
+ let &autowrite = s:save_autowrite
+endfunc
+
+function Test_hide()
+ let orig_bname = bufname('')
+ let orig_winnr = winnr('$')
+
+ new Xf1
+ set modified
+ call assert_fails('edit Xf2')
+ bwipeout! Xf1
+
+ new Xf1
+ set modified
+ edit! Xf2
+ call assert_equal(['Xf2', 2], [bufname(''), winnr('$')])
+ call assert_equal([1, 0], [buflisted('Xf1'), bufloaded('Xf1')])
+ bwipeout! Xf1
+ bwipeout! Xf2
+
+ new Xf1
+ set modified
+ " :hide as a command
+ hide
+ call assert_equal([orig_bname, orig_winnr], [bufname(''), winnr('$')])
+ call assert_equal([1, 1], [buflisted('Xf1'), bufloaded('Xf1')])
+ bwipeout! Xf1
+
+ new Xf1
+ set modified
+ " :hide as a command with trailing comment
+ hide " comment
+ call assert_equal([orig_bname, orig_winnr], [bufname(''), winnr('$')])
+ call assert_equal([1, 1], [buflisted('Xf1'), bufloaded('Xf1')])
+ bwipeout! Xf1
+
+ new Xf1
+ set modified
+ " :hide as a command with bar
+ hide | new Xf2 " comment
+ call assert_equal(['Xf2', 2], [bufname(''), winnr('$')])
+ call assert_equal([1, 1], [buflisted('Xf1'), bufloaded('Xf1')])
+ bwipeout! Xf1
+ bwipeout! Xf2
+
+ new Xf1
+ set modified
+ " :hide as a modifier with trailing comment
+ hide edit Xf2 " comment
+ call assert_equal(['Xf2', 2], [bufname(''), winnr('$')])
+ call assert_equal([1, 1], [buflisted('Xf1'), bufloaded('Xf1')])
+ bwipeout! Xf1
+ bwipeout! Xf2
+
+ new Xf1
+ set modified
+ " To check that the bar is not recognized to separate commands
+ hide echo "one|two"
+ call assert_equal(['Xf1', 2], [bufname(''), winnr('$')])
+ call assert_equal([1, 1], [buflisted('Xf1'), bufloaded('Xf1')])
+ bwipeout! Xf1
+
+ " set hidden
+ new Xf1
+ set hidden
+ set modified
+ edit Xf2 " comment
+ call assert_equal(['Xf2', 2], [bufname(''), winnr('$')])
+ call assert_equal([1, 1], [buflisted('Xf1'), bufloaded('Xf1')])
+ bwipeout! Xf1
+ bwipeout! Xf2
+
+ " set hidden bufhidden=wipe
+ new Xf1
+ set bufhidden=wipe
+ set modified
+ hide edit! Xf2 " comment
+ call assert_equal(['Xf2', 2], [bufname(''), winnr('$')])
+ call assert_equal([0, 0], [buflisted('Xf1'), bufloaded('Xf1')])
+ bwipeout! Xf2
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_highlight.vim b/src/nvim/testdir/test_highlight.vim
new file mode 100644
index 0000000000..33df79581c
--- /dev/null
+++ b/src/nvim/testdir/test_highlight.vim
@@ -0,0 +1,535 @@
+" Tests for ":highlight" and highlighting.
+
+source view_util.vim
+
+func Test_highlight()
+ " basic test if ":highlight" doesn't crash
+ highlight
+ hi Search
+
+ " test setting colors.
+ " test clearing one color and all doesn't generate error or warning
+ silent! hi NewGroup term=bold cterm=italic ctermfg=DarkBlue ctermbg=Grey gui= guifg=#00ff00 guibg=Cyan
+ silent! hi Group2 term= cterm=
+ hi Group3 term=underline cterm=bold
+
+ let res = split(execute("hi NewGroup"), "\n")[0]
+ " filter ctermfg and ctermbg, the numbers depend on the terminal
+ let res = substitute(res, 'ctermfg=\d*', 'ctermfg=2', '')
+ let res = substitute(res, 'ctermbg=\d*', 'ctermbg=3', '')
+ call assert_equal("NewGroup xxx cterm=italic ctermfg=2 ctermbg=3",
+ \ res)
+ call assert_equal("Group2 xxx cleared",
+ \ split(execute("hi Group2"), "\n")[0])
+ call assert_equal("Group3 xxx cterm=bold",
+ \ split(execute("hi Group3"), "\n")[0])
+
+ hi clear NewGroup
+ call assert_equal("NewGroup xxx cleared",
+ \ split(execute("hi NewGroup"), "\n")[0])
+ call assert_equal("Group2 xxx cleared",
+ \ split(execute("hi Group2"), "\n")[0])
+ hi Group2 NONE
+ call assert_equal("Group2 xxx cleared",
+ \ split(execute("hi Group2"), "\n")[0])
+ hi clear
+ call assert_equal("Group3 xxx cleared",
+ \ split(execute("hi Group3"), "\n")[0])
+ call assert_fails("hi Crash term='asdf", "E475:")
+endfunc
+
+function! HighlightArgs(name)
+ return 'hi ' . substitute(split(execute('hi ' . a:name), '\n')[0], '\<xxx\>', '', '')
+endfunction
+
+function! IsColorable()
+ return has('gui_running') || str2nr(&t_Co) >= 8
+endfunction
+
+function! HiCursorLine()
+ let hiCursorLine = HighlightArgs('CursorLine')
+ if has('gui_running')
+ let guibg = matchstr(hiCursorLine, 'guibg=\w\+')
+ let hi_ul = 'hi CursorLine gui=underline guibg=NONE'
+ let hi_bg = 'hi CursorLine gui=NONE ' . guibg
+ else
+ let hi_ul = 'hi CursorLine cterm=underline ctermbg=NONE'
+ let hi_bg = 'hi CursorLine cterm=NONE ctermbg=Gray'
+ endif
+ return [hiCursorLine, hi_ul, hi_bg]
+endfunction
+
+function! Check_lcs_eol_attrs(attrs, row, col)
+ let save_lcs = &lcs
+ set list
+
+ call assert_equal(a:attrs, ScreenAttrs(a:row, a:col)[0])
+
+ set nolist
+ let &lcs = save_lcs
+endfunction
+
+func Test_highlight_eol_with_cursorline()
+ let [hiCursorLine, hi_ul, hi_bg] = HiCursorLine()
+
+ call NewWindow('topleft 5', 20)
+ call setline(1, 'abcd')
+ call matchadd('Search', '\n')
+
+ " expected:
+ " 'abcd '
+ " ^^^^ ^^^^^ no highlight
+ " ^ 'Search' highlight
+ let attrs0 = ScreenAttrs(1, 10)[0]
+ call assert_equal(repeat([attrs0[0]], 4), attrs0[0:3])
+ call assert_equal(repeat([attrs0[0]], 5), attrs0[5:9])
+ call assert_notequal(attrs0[0], attrs0[4])
+
+ setlocal cursorline
+
+ " underline
+ exe hi_ul
+
+ " expected:
+ " 'abcd '
+ " ^^^^ underline
+ " ^ 'Search' highlight with underline
+ " ^^^^^ underline
+ let attrs = ScreenAttrs(1, 10)[0]
+ call assert_equal(repeat([attrs[0]], 4), attrs[0:3])
+ call assert_equal([attrs[4]] + repeat([attrs[5]], 5), attrs[4:9])
+ call assert_notequal(attrs[0], attrs[4])
+ call assert_notequal(attrs[4], attrs[5])
+ call assert_notequal(attrs0[0], attrs[0])
+ call assert_notequal(attrs0[4], attrs[4])
+ call Check_lcs_eol_attrs(attrs, 1, 10)
+
+ if IsColorable()
+ " bg-color
+ exe hi_bg
+
+ " expected:
+ " 'abcd '
+ " ^^^^ bg-color of 'CursorLine'
+ " ^ 'Search' highlight
+ " ^^^^^ bg-color of 'CursorLine'
+ let attrs = ScreenAttrs(1, 10)[0]
+ call assert_equal(repeat([attrs[0]], 4), attrs[0:3])
+ call assert_equal(repeat([attrs[5]], 5), attrs[5:9])
+ call assert_equal(attrs0[4], attrs[4])
+ call assert_notequal(attrs[0], attrs[4])
+ call assert_notequal(attrs[4], attrs[5])
+ call assert_notequal(attrs0[0], attrs[0])
+ call assert_notequal(attrs0[5], attrs[5])
+ call Check_lcs_eol_attrs(attrs, 1, 10)
+ endif
+
+ call CloseWindow()
+ exe hiCursorLine
+endfunc
+
+func Test_highlight_eol_with_cursorline_vertsplit()
+ if !has('vertsplit')
+ return
+ endif
+
+ let [hiCursorLine, hi_ul, hi_bg] = HiCursorLine()
+
+ call NewWindow('topleft 5', 5)
+ call setline(1, 'abcd')
+ call matchadd('Search', '\n')
+
+ let expected = "abcd |abcd "
+ let actual = ScreenLines(1, 15)[0]
+ call assert_equal(expected, actual)
+
+ " expected:
+ " 'abcd |abcd '
+ " ^^^^ ^^^^^^^^^ no highlight
+ " ^ 'Search' highlight
+ " ^ 'VertSplit' highlight
+ let attrs0 = ScreenAttrs(1, 15)[0]
+ call assert_equal(repeat([attrs0[0]], 4), attrs0[0:3])
+ call assert_equal(repeat([attrs0[0]], 9), attrs0[6:14])
+ call assert_notequal(attrs0[0], attrs0[4])
+ call assert_notequal(attrs0[0], attrs0[5])
+ call assert_notequal(attrs0[4], attrs0[5])
+
+ setlocal cursorline
+
+ " expected:
+ " 'abcd |abcd '
+ " ^^^^ underline
+ " ^ 'Search' highlight with underline
+ " ^ 'VertSplit' highlight
+ " ^^^^^^^^^ no highlight
+
+ " underline
+ exe hi_ul
+
+ let actual = ScreenLines(1, 15)[0]
+ call assert_equal(expected, actual)
+
+ let attrs = ScreenAttrs(1, 15)[0]
+ call assert_equal(repeat([attrs[0]], 4), attrs[0:3])
+ call assert_equal(repeat([attrs[6]], 9), attrs[6:14])
+ call assert_equal(attrs0[5:14], attrs[5:14])
+ call assert_notequal(attrs[0], attrs[4])
+ call assert_notequal(attrs[0], attrs[5])
+ call assert_notequal(attrs[0], attrs[6])
+ call assert_notequal(attrs[4], attrs[5])
+ call assert_notequal(attrs[5], attrs[6])
+ call assert_notequal(attrs0[0], attrs[0])
+ call assert_notequal(attrs0[4], attrs[4])
+ call Check_lcs_eol_attrs(attrs, 1, 15)
+
+ if IsColorable()
+ " bg-color
+ exe hi_bg
+
+ let actual = ScreenLines(1, 15)[0]
+ call assert_equal(expected, actual)
+
+ let attrs = ScreenAttrs(1, 15)[0]
+ call assert_equal(repeat([attrs[0]], 4), attrs[0:3])
+ call assert_equal(repeat([attrs[6]], 9), attrs[6:14])
+ call assert_equal(attrs0[5:14], attrs[5:14])
+ call assert_notequal(attrs[0], attrs[4])
+ call assert_notequal(attrs[0], attrs[5])
+ call assert_notequal(attrs[0], attrs[6])
+ call assert_notequal(attrs[4], attrs[5])
+ call assert_notequal(attrs[5], attrs[6])
+ call assert_notequal(attrs0[0], attrs[0])
+ call assert_equal(attrs0[4], attrs[4])
+ call Check_lcs_eol_attrs(attrs, 1, 15)
+ endif
+
+ call CloseWindow()
+ exe hiCursorLine
+endfunc
+
+func Test_highlight_eol_with_cursorline_rightleft()
+ if !has('rightleft')
+ return
+ endif
+
+ let [hiCursorLine, hi_ul, hi_bg] = HiCursorLine()
+
+ call NewWindow('topleft 5', 10)
+ setlocal rightleft
+ call setline(1, 'abcd')
+ call matchadd('Search', '\n')
+ let attrs0 = ScreenAttrs(1, 10)[0]
+
+ setlocal cursorline
+
+ " underline
+ exe hi_ul
+
+ " expected:
+ " ' dcba'
+ " ^^^^ underline
+ " ^ 'Search' highlight with underline
+ " ^^^^^ underline
+ let attrs = ScreenAttrs(1, 10)[0]
+ call assert_equal(repeat([attrs[9]], 4), attrs[6:9])
+ call assert_equal(repeat([attrs[4]], 5) + [attrs[5]], attrs[0:5])
+ call assert_notequal(attrs[9], attrs[5])
+ call assert_notequal(attrs[4], attrs[5])
+ call assert_notequal(attrs0[9], attrs[9])
+ call assert_notequal(attrs0[5], attrs[5])
+ call Check_lcs_eol_attrs(attrs, 1, 10)
+
+ if IsColorable()
+ " bg-color
+ exe hi_bg
+
+ " expected:
+ " ' dcba'
+ " ^^^^ bg-color of 'CursorLine'
+ " ^ 'Search' highlight
+ " ^^^^^ bg-color of 'CursorLine'
+ let attrs = ScreenAttrs(1, 10)[0]
+ call assert_equal(repeat([attrs[9]], 4), attrs[6:9])
+ call assert_equal(repeat([attrs[4]], 5), attrs[0:4])
+ call assert_equal(attrs0[5], attrs[5])
+ call assert_notequal(attrs[9], attrs[5])
+ call assert_notequal(attrs[5], attrs[4])
+ call assert_notequal(attrs0[9], attrs[9])
+ call assert_notequal(attrs0[4], attrs[4])
+ call Check_lcs_eol_attrs(attrs, 1, 10)
+ endif
+
+ call CloseWindow()
+ exe hiCursorLine
+endfunc
+
+func Test_highlight_eol_with_cursorline_linewrap()
+ let [hiCursorLine, hi_ul, hi_bg] = HiCursorLine()
+
+ call NewWindow('topleft 5', 10)
+ call setline(1, [repeat('a', 51) . 'bcd', ''])
+ call matchadd('Search', '\n')
+
+ setlocal wrap
+ normal! gg$
+ let attrs0 = ScreenAttrs(5, 10)[0]
+ setlocal cursorline
+
+ " underline
+ exe hi_ul
+
+ " expected:
+ " 'abcd '
+ " ^^^^ underline
+ " ^ 'Search' highlight with underline
+ " ^^^^^ underline
+ let attrs = ScreenAttrs(5, 10)[0]
+ call assert_equal(repeat([attrs[0]], 4), attrs[0:3])
+ call assert_equal([attrs[4]] + repeat([attrs[5]], 5), attrs[4:9])
+ call assert_notequal(attrs[0], attrs[4])
+ call assert_notequal(attrs[4], attrs[5])
+ call assert_notequal(attrs0[0], attrs[0])
+ call assert_notequal(attrs0[4], attrs[4])
+ call Check_lcs_eol_attrs(attrs, 5, 10)
+
+ if IsColorable()
+ " bg-color
+ exe hi_bg
+
+ " expected:
+ " 'abcd '
+ " ^^^^ bg-color of 'CursorLine'
+ " ^ 'Search' highlight
+ " ^^^^^ bg-color of 'CursorLine'
+ let attrs = ScreenAttrs(5, 10)[0]
+ call assert_equal(repeat([attrs[0]], 4), attrs[0:3])
+ call assert_equal(repeat([attrs[5]], 5), attrs[5:9])
+ call assert_equal(attrs0[4], attrs[4])
+ call assert_notequal(attrs[0], attrs[4])
+ call assert_notequal(attrs[4], attrs[5])
+ call assert_notequal(attrs0[0], attrs[0])
+ call assert_notequal(attrs0[5], attrs[5])
+ call Check_lcs_eol_attrs(attrs, 5, 10)
+ endif
+
+ setlocal nocursorline nowrap
+ normal! gg$
+ let attrs0 = ScreenAttrs(1, 10)[0]
+ setlocal cursorline
+
+ " underline
+ exe hi_ul
+
+ " expected:
+ " 'aaabcd '
+ " ^^^^^^ underline
+ " ^ 'Search' highlight with underline
+ " ^^^ underline
+ let attrs = ScreenAttrs(1, 10)[0]
+ call assert_equal(repeat([attrs[0]], 6), attrs[0:5])
+ call assert_equal([attrs[6]] + repeat([attrs[7]], 3), attrs[6:9])
+ call assert_notequal(attrs[0], attrs[6])
+ call assert_notequal(attrs[6], attrs[7])
+ call assert_notequal(attrs0[0], attrs[0])
+ call assert_notequal(attrs0[6], attrs[6])
+ call Check_lcs_eol_attrs(attrs, 1, 10)
+
+ if IsColorable()
+ " bg-color
+ exe hi_bg
+
+ " expected:
+ " 'aaabcd '
+ " ^^^^^^ bg-color of 'CursorLine'
+ " ^ 'Search' highlight
+ " ^^^ bg-color of 'CursorLine'
+ let attrs = ScreenAttrs(1, 10)[0]
+ call assert_equal(repeat([attrs[0]], 6), attrs[0:5])
+ call assert_equal(repeat([attrs[7]], 3), attrs[7:9])
+ call assert_equal(attrs0[6], attrs[6])
+ call assert_notequal(attrs[0], attrs[6])
+ call assert_notequal(attrs[6], attrs[7])
+ call assert_notequal(attrs0[0], attrs[0])
+ call assert_notequal(attrs0[7], attrs[7])
+ call Check_lcs_eol_attrs(attrs, 1, 10)
+ endif
+
+ call CloseWindow()
+ exe hiCursorLine
+endfunc
+
+func Test_highlight_eol_with_cursorline_sign()
+ if !has('signs')
+ return
+ endif
+
+ let [hiCursorLine, hi_ul, hi_bg] = HiCursorLine()
+
+ call NewWindow('topleft 5', 10)
+ call setline(1, 'abcd')
+ call matchadd('Search', '\n')
+
+ sign define Sign text=>>
+ exe 'sign place 1 line=1 name=Sign buffer=' . bufnr('')
+ let attrs0 = ScreenAttrs(1, 10)[0]
+ setlocal cursorline
+
+ " underline
+ exe hi_ul
+
+ " expected:
+ " '>>abcd '
+ " ^^ sign
+ " ^^^^ underline
+ " ^ 'Search' highlight with underline
+ " ^^^ underline
+ let attrs = ScreenAttrs(1, 10)[0]
+ call assert_equal(repeat([attrs[2]], 4), attrs[2:5])
+ call assert_equal([attrs[6]] + repeat([attrs[7]], 3), attrs[6:9])
+ call assert_notequal(attrs[2], attrs[6])
+ call assert_notequal(attrs[6], attrs[7])
+ call assert_notequal(attrs0[2], attrs[2])
+ call assert_notequal(attrs0[6], attrs[6])
+ call Check_lcs_eol_attrs(attrs, 1, 10)
+
+ if IsColorable()
+ " bg-color
+ exe hi_bg
+
+ " expected:
+ " '>>abcd '
+ " ^^ sign
+ " ^^^^ bg-color of 'CursorLine'
+ " ^ 'Search' highlight
+ " ^^^ bg-color of 'CursorLine'
+ let attrs = ScreenAttrs(1, 10)[0]
+ call assert_equal(repeat([attrs[2]], 4), attrs[2:5])
+ call assert_equal(repeat([attrs[7]], 3), attrs[7:9])
+ call assert_equal(attrs0[6], attrs[6])
+ call assert_notequal(attrs[2], attrs[6])
+ call assert_notequal(attrs[6], attrs[7])
+ call assert_notequal(attrs0[2], attrs[2])
+ call assert_notequal(attrs0[7], attrs[7])
+ call Check_lcs_eol_attrs(attrs, 1, 10)
+ endif
+
+ sign unplace 1
+ call CloseWindow()
+ exe hiCursorLine
+endfunc
+
+func Test_highlight_eol_with_cursorline_breakindent()
+ if !has('linebreak')
+ return
+ endif
+
+ let [hiCursorLine, hi_ul, hi_bg] = HiCursorLine()
+
+ call NewWindow('topleft 5', 10)
+ setlocal breakindent breakindentopt=min:0,shift:1 showbreak=>
+ call setline(1, ' ' . repeat('a', 9) . 'bcd')
+ call matchadd('Search', '\n')
+ let attrs0 = ScreenAttrs(2, 10)[0]
+ setlocal cursorline
+
+ " underline
+ exe hi_ul
+
+ " expected:
+ " ' >bcd '
+ " ^^^ breakindent and showbreak
+ " ^^^ underline
+ " ^ 'Search' highlight with underline
+ " ^^^ underline
+ let attrs = ScreenAttrs(2, 10)[0]
+ call assert_equal(repeat([attrs[0]], 2), attrs[0:1])
+ call assert_equal(repeat([attrs[3]], 3), attrs[3:5])
+ call assert_equal([attrs[6]] + repeat([attrs[7]], 3), attrs[6:9])
+ call assert_equal(attrs0[0], attrs[0])
+ call assert_notequal(attrs[0], attrs[2])
+ call assert_notequal(attrs[2], attrs[3])
+ call assert_notequal(attrs[3], attrs[6])
+ call assert_notequal(attrs[6], attrs[7])
+ call assert_notequal(attrs0[2], attrs[2])
+ call assert_notequal(attrs0[3], attrs[3])
+ call assert_notequal(attrs0[6], attrs[6])
+ call Check_lcs_eol_attrs(attrs, 2, 10)
+
+ if IsColorable()
+ " bg-color
+ exe hi_bg
+
+ " expected:
+ " ' >bcd '
+ " ^^^ breakindent and showbreak
+ " ^^^ bg-color of 'CursorLine'
+ " ^ 'Search' highlight
+ " ^^^ bg-color of 'CursorLine'
+ let attrs = ScreenAttrs(2, 10)[0]
+ call assert_equal(repeat([attrs[0]], 2), attrs[0:1])
+ call assert_equal(repeat([attrs[3]], 3), attrs[3:5])
+ call assert_equal(repeat([attrs[7]], 3), attrs[7:9])
+ call assert_equal(attrs0[0], attrs[0])
+ call assert_equal(attrs0[6], attrs[6])
+ call assert_notequal(attrs[0], attrs[2])
+ call assert_notequal(attrs[2], attrs[3])
+ call assert_notequal(attrs[3], attrs[6])
+ call assert_notequal(attrs[6], attrs[7])
+ call assert_notequal(attrs0[2], attrs[2])
+ call assert_notequal(attrs0[3], attrs[3])
+ call assert_notequal(attrs0[7], attrs[7])
+ call Check_lcs_eol_attrs(attrs, 2, 10)
+ endif
+
+ call CloseWindow()
+ set showbreak=
+ exe hiCursorLine
+endfunc
+
+func Test_highlight_eol_on_diff()
+ call setline(1, ['abcd', ''])
+ call matchadd('Search', '\n')
+ let attrs0 = ScreenAttrs(1, 10)[0]
+
+ diffthis
+ botright new
+ diffthis
+
+ " expected:
+ " ' abcd '
+ " ^^ sign
+ " ^^^^ ^^^ 'DiffAdd' highlight
+ " ^ 'Search' highlight
+ let attrs = ScreenAttrs(1, 10)[0]
+ call assert_equal(repeat([attrs[0]], 2), attrs[0:1])
+ call assert_equal(repeat([attrs[2]], 4), attrs[2:5])
+ call assert_equal(repeat([attrs[2]], 3), attrs[7:9])
+ call assert_equal(attrs0[4], attrs[6])
+ call assert_notequal(attrs[0], attrs[2])
+ call assert_notequal(attrs[0], attrs[6])
+ call assert_notequal(attrs[2], attrs[6])
+ call Check_lcs_eol_attrs(attrs, 1, 10)
+
+ bwipe!
+ diffoff
+endfunc
+
+func Test_termguicolors()
+ if !exists('+termguicolors')
+ return
+ endif
+ if has('vtp') && !has('vcon')
+ " Win32: 'guicolors' doesn't work without virtual console.
+ call assert_fails('set termguicolors', 'E954:')
+ return
+ endif
+
+ " Basic test that setting 'termguicolors' works with one color.
+ set termguicolors
+ redraw
+ set t_Co=1
+ redraw
+ set t_Co=0
+ redraw
+endfunc
diff --git a/src/nvim/testdir/test_history.vim b/src/nvim/testdir/test_history.vim
new file mode 100644
index 0000000000..16aad9889e
--- /dev/null
+++ b/src/nvim/testdir/test_history.vim
@@ -0,0 +1,111 @@
+" Tests for the history functions
+
+if !has('cmdline_hist')
+ finish
+endif
+
+set history=7
+
+function History_Tests(hist)
+ " First clear the history
+ call histadd(a:hist, 'dummy')
+ call assert_true(histdel(a:hist))
+ call assert_equal(-1, histnr(a:hist))
+ call assert_equal('', histget(a:hist))
+
+ call assert_true(histadd(a:hist, 'ls'))
+ call assert_true(histadd(a:hist, 'buffers'))
+ call assert_equal('buffers', histget(a:hist))
+ call assert_equal('ls', histget(a:hist, -2))
+ call assert_equal('ls', histget(a:hist, 1))
+ call assert_equal('', histget(a:hist, 5))
+ call assert_equal('', histget(a:hist, -5))
+ call assert_equal(2, histnr(a:hist))
+ call assert_true(histdel(a:hist, 2))
+ call assert_false(histdel(a:hist, 7))
+ call assert_equal(1, histnr(a:hist))
+ call assert_equal('ls', histget(a:hist, -1))
+
+ call assert_true(histadd(a:hist, 'buffers'))
+ call assert_true(histadd(a:hist, 'ls'))
+ call assert_equal('ls', histget(a:hist, -1))
+ call assert_equal(4, histnr(a:hist))
+
+ let a=execute('history ' . a:hist)
+ call assert_match("^\n # \\S* history\n 3 buffers\n> 4 ls$", a)
+ let a=execute('history all')
+ call assert_match("^\n # .* history\n 3 buffers\n> 4 ls", a)
+
+ if len(a:hist) > 0
+ let a=execute('history ' . a:hist . ' 2')
+ call assert_match("^\n # \\S* history$", a)
+ let a=execute('history ' . a:hist . ' 3')
+ call assert_match("^\n # \\S* history\n 3 buffers$", a)
+ let a=execute('history ' . a:hist . ' 4')
+ call assert_match("^\n # \\S* history\n> 4 ls$", a)
+ let a=execute('history ' . a:hist . ' 3,4')
+ call assert_match("^\n # \\S* history\n 3 buffers\n> 4 ls$", a)
+ let a=execute('history ' . a:hist . ' -1')
+ call assert_match("^\n # \\S* history\n> 4 ls$", a)
+ let a=execute('history ' . a:hist . ' -2')
+ call assert_match("^\n # \\S* history\n 3 buffers$", a)
+ let a=execute('history ' . a:hist . ' -2,')
+ call assert_match("^\n # \\S* history\n 3 buffers\n> 4 ls$", a)
+ let a=execute('history ' . a:hist . ' -3')
+ call assert_match("^\n # \\S* history$", a)
+ endif
+
+ " Test for removing entries matching a pattern
+ for i in range(1, 3)
+ call histadd(a:hist, 'text_' . i)
+ endfor
+ call assert_true(histdel(a:hist, 'text_\d\+'))
+ call assert_equal('ls', histget(a:hist, -1))
+
+ " Test for freeing the entire history list
+ for i in range(1, 7)
+ call histadd(a:hist, 'text_' . i)
+ endfor
+ call histdel(a:hist)
+ for i in range(1, 7)
+ call assert_equal('', histget(a:hist, i))
+ call assert_equal('', histget(a:hist, i - 7 - 1))
+ endfor
+endfunction
+
+function Test_History()
+ for h in ['cmd', ':', '', 'search', '/', '?', 'expr', '=', 'input', '@', 'debug', '>']
+ call History_Tests(h)
+ endfor
+
+ " Negative tests
+ call assert_false(histdel('abc'))
+ call assert_equal('', histget('abc'))
+ call assert_fails('call histdel([])', 'E730:')
+ call assert_equal('', histget(10))
+ call assert_fails('call histget([])', 'E730:')
+ call assert_equal(-1, histnr('abc'))
+ call assert_fails('call histnr([])', 'E730:')
+endfunction
+
+function Test_Search_history_window()
+ new
+ call setline(1, ['a', 'b', 'a', 'b'])
+ 1
+ call feedkeys("/a\<CR>", 'xt')
+ call assert_equal('a', getline('.'))
+ 1
+ call feedkeys("/b\<CR>", 'xt')
+ call assert_equal('b', getline('.'))
+ 1
+ " select the previous /a command
+ call feedkeys("q/kk\<CR>", 'x!')
+ call assert_equal('a', getline('.'))
+ call assert_equal('a', @/)
+ bwipe!
+endfunc
+
+function Test_history_completion()
+ call feedkeys(":history \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"history / : = > ? @ all cmd debug expr input search', @:)
+endfunc
diff --git a/src/nvim/testdir/test_hlsearch.vim b/src/nvim/testdir/test_hlsearch.vim
new file mode 100644
index 0000000000..1fc7b04f88
--- /dev/null
+++ b/src/nvim/testdir/test_hlsearch.vim
@@ -0,0 +1,46 @@
+" Test for v:hlsearch
+
+function! Test_hlsearch()
+ new
+ call setline(1, repeat(['aaa'], 10))
+ set hlsearch nolazyredraw
+ " redraw is needed to make hlsearch highlight the matches
+ exe "normal! /aaa\<CR>" | redraw
+ let r1 = screenattr(1, 1)
+ nohlsearch | redraw
+ call assert_notequal(r1, screenattr(1,1))
+ let v:hlsearch=1 | redraw
+ call assert_equal(r1, screenattr(1,1))
+ let v:hlsearch=0 | redraw
+ call assert_notequal(r1, screenattr(1,1))
+ set hlsearch | redraw
+ call assert_equal(r1, screenattr(1,1))
+ let v:hlsearch=0 | redraw
+ call assert_notequal(r1, screenattr(1,1))
+ exe "normal! n" | redraw
+ call assert_equal(r1, screenattr(1,1))
+ let v:hlsearch=0 | redraw
+ call assert_notequal(r1, screenattr(1,1))
+ exe "normal! /\<CR>" | redraw
+ call assert_equal(r1, screenattr(1,1))
+ set nohls
+ exe "normal! /\<CR>" | redraw
+ call assert_notequal(r1, screenattr(1,1))
+ call assert_fails('let v:hlsearch=[]', 'E745')
+ call garbagecollect(1)
+ call getchar(1)
+ enew!
+endfunction
+
+func Test_hlsearch_eol_highlight()
+ new
+ call append(1, repeat([''], 9))
+ set hlsearch nolazyredraw
+ exe "normal! /$\<CR>" | redraw
+ let attr = screenattr(1, 1)
+ for row in range(2, 10)
+ call assert_equal(attr, screenattr(row, 1), 'in line ' . row)
+ endfor
+ set nohlsearch
+ bwipe!
+endfunc
diff --git a/src/nvim/testdir/test_increment.vim b/src/nvim/testdir/test_increment.vim
new file mode 100644
index 0000000000..ab11d943d9
--- /dev/null
+++ b/src/nvim/testdir/test_increment.vim
@@ -0,0 +1,782 @@
+" Tests for using Ctrl-A/Ctrl-X on visual selections
+
+func SetUp()
+ new dummy
+ set nrformats&vim
+ set nrformats+=octal
+endfunc
+
+func TearDown()
+ bwipe!
+endfunc
+
+" 1) Ctrl-A on visually selected number
+" Text:
+" foobar-10
+" Expected:
+" 1) Ctrl-A on start of line:
+" foobar-9
+" 2) Ctrl-A on visually selected "-10":
+" foobar-9
+" 3) Ctrl-A on visually selected "10":
+" foobar-11
+" 4) Ctrl-X on visually selected "-10"
+" foobar-11
+" 5) Ctrl-X on visually selected "10"
+" foobar-9
+func Test_visual_increment_01()
+ call setline(1, repeat(["foobaar-10"], 5))
+
+ call cursor(1, 1)
+ exec "norm! \<C-A>"
+ call assert_equal("foobaar-9", getline('.'))
+ call assert_equal([0, 1, 9, 0], getpos('.'))
+
+ call cursor(2, 1)
+ exec "norm! f-v$\<C-A>"
+ call assert_equal("foobaar-9", getline('.'))
+ call assert_equal([0, 2, 8, 0], getpos('.'))
+
+ call cursor(3, 1)
+ exec "norm! f1v$\<C-A>"
+ call assert_equal("foobaar-11", getline('.'))
+ call assert_equal([0, 3, 9, 0], getpos('.'))
+
+ call cursor(4, 1)
+ exec "norm! f-v$\<C-X>"
+ call assert_equal("foobaar-11", getline('.'))
+ call assert_equal([0, 4, 8, 0], getpos('.'))
+
+ call cursor(5, 1)
+ exec "norm! f1v$\<C-X>"
+ call assert_equal("foobaar-9", getline('.'))
+ call assert_equal([0, 5, 9, 0], getpos('.'))
+endfunc
+
+" 2) Ctrl-A on visually selected lines
+" Text:
+" 10
+" 20
+" 30
+" 40
+"
+" Expected:
+" 1) Ctrl-A on visually selected lines:
+" 11
+" 21
+" 31
+" 41
+"
+" 2) Ctrl-X on visually selected lines:
+" 9
+" 19
+" 29
+" 39
+func Test_visual_increment_02()
+ call setline(1, ["10", "20", "30", "40"])
+ exec "norm! GV3k$\<C-A>"
+ call assert_equal(["11", "21", "31", "41"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+
+ call setline(1, ["10", "20", "30", "40"])
+ exec "norm! GV3k$\<C-X>"
+ call assert_equal(["9", "19", "29", "39"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+endfunc
+
+" 3) g Ctrl-A on visually selected lines, with non-numbers in between
+" Text:
+" 10
+"
+" 20
+"
+" 30
+"
+" 40
+"
+" Expected:
+" 1) 2 g Ctrl-A on visually selected lines:
+" 12
+"
+" 24
+"
+" 36
+"
+" 48
+" 2) 2 g Ctrl-X on visually selected lines
+" 8
+"
+" 16
+"
+" 24
+"
+" 32
+func Test_visual_increment_03()
+ call setline(1, ["10", "", "20", "", "30", "", "40"])
+ exec "norm! GV6k2g\<C-A>"
+ call assert_equal(["12", "", "24", "", "36", "", "48"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+
+ call setline(1, ["10", "", "20", "", "30", "", "40"])
+ exec "norm! GV6k2g\<C-X>"
+ call assert_equal(["8", "", "16", "", "24", "", "32"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+endfunc
+
+" 4) Ctrl-A on non-number
+" Text:
+" foobar-10
+" Expected:
+" 1) visually select foobar:
+" foobar-10
+func Test_visual_increment_04()
+ call setline(1, ["foobar-10"])
+ exec "norm! vf-\<C-A>"
+ call assert_equal(["foobar-10"], getline(1, '$'))
+ " NOTE: I think this is correct behavior...
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+endfunc
+
+" 5) g<Ctrl-A> on letter
+" Test:
+" a
+" a
+" a
+" a
+" Expected:
+" 1) g Ctrl-A on visually selected lines
+" b
+" c
+" d
+" e
+func Test_visual_increment_05()
+ set nrformats+=alpha
+ call setline(1, repeat(["a"], 4))
+ exec "norm! GV3kg\<C-A>"
+ call assert_equal(["b", "c", "d", "e"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+endfunc
+
+" 6) g<Ctrl-A> on letter
+" Test:
+" z
+" z
+" z
+" z
+" Expected:
+" 1) g Ctrl-X on visually selected lines
+" y
+" x
+" w
+" v
+func Test_visual_increment_06()
+ set nrformats+=alpha
+ call setline(1, repeat(["z"], 4))
+ exec "norm! GV3kg\<C-X>"
+ call assert_equal(["y", "x", "w", "v"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+endfunc
+
+" 7) <Ctrl-A> on letter
+" Test:
+" 2
+" 1
+" 0
+" -1
+" -2
+"
+" Expected:
+" 1) Ctrl-A on visually selected lines
+" 3
+" 2
+" 1
+" 0
+" -1
+"
+" 2) Ctrl-X on visually selected lines
+" 1
+" 0
+" -1
+" -2
+" -3
+func Test_visual_increment_07()
+ call setline(1, ["2", "1", "0", "-1", "-2"])
+ exec "norm! GV4k\<C-A>"
+ call assert_equal(["3", "2", "1", "0", "-1"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+
+ call setline(1, ["2", "1", "0", "-1", "-2"])
+ exec "norm! GV4k\<C-X>"
+ call assert_equal(["1", "0", "-1", "-2", "-3"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+endfunc
+
+" 8) Block increment on 0x9
+" Text:
+" 0x9
+" 0x9
+" Expected:
+" 1) Ctrl-A on visually block selected region (cursor at beginning):
+" 0xa
+" 0xa
+" 2) Ctrl-A on visually block selected region (cursor at end)
+" 0xa
+" 0xa
+func Test_visual_increment_08()
+ call setline(1, repeat(["0x9"], 2))
+ exec "norm! \<C-V>j$\<C-A>"
+ call assert_equal(["0xa", "0xa"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+
+ call setline(1, repeat(["0x9"], 2))
+ exec "norm! gg$\<C-V>+\<C-A>"
+ call assert_equal(["0xa", "0xa"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+endfunc
+
+" 9) Increment and redo
+" Text:
+" 2
+" 2
+"
+" 3
+" 3
+"
+" Expected:
+" 1) 2 Ctrl-A on first 2 visually selected lines
+" 4
+" 4
+" 2) redo (.) on 3
+" 5
+" 5
+func Test_visual_increment_09()
+ call setline(1, ["2", "2", "", "3", "3", ""])
+ exec "norm! ggVj2\<C-A>"
+ call assert_equal(["4", "4", "", "3", "3", ""], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+
+ exec "norm! 3j."
+ call assert_equal(["4", "4", "", "5", "5", ""], getline(1, '$'))
+ call assert_equal([0, 4, 1, 0], getpos('.'))
+endfunc
+
+" 10) sequentially decrement 1
+" Text:
+" 1
+" 1
+" 1
+" 1
+" Expected:
+" 1) g Ctrl-X on visually selected lines
+" 0
+" -1
+" -2
+" -3
+func Test_visual_increment_10()
+ call setline(1, repeat(["1"], 4))
+ exec "norm! GV3kg\<C-X>"
+ call assert_equal(["0", "-1", "-2", "-3"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+endfunc
+
+" 11) visually block selected indented lines
+" Text:
+" 1
+" 1
+" 1
+" 1
+" Expexted:
+" 1) g Ctrl-A on block selected indented lines
+" 2
+" 1
+" 3
+" 4
+func Test_visual_increment_11()
+ call setline(1, [" 1", "1", " 1", " 1"])
+ exec "norm! f1\<C-V>3jg\<C-A>"
+ call assert_equal([" 2", "1", " 3", " 4"], getline(1, '$'))
+ call assert_equal([0, 1, 5, 0], getpos('.'))
+endfunc
+
+" 12) visually selected several columns
+" Text:
+" 0 0
+" 0 0
+" 0 0
+" Expected:
+" 1) 'v' select last zero and first zeroes
+" 0 1
+" 1 0
+" 1 0
+func Test_visual_increment_12()
+ call setline(1, repeat(["0 0"], 3))
+ exec "norm! $v++\<C-A>"
+ call assert_equal(["0 1", "1 0", "1 0"], getline(1, '$'))
+ call assert_equal([0, 1, 3, 0], getpos('.'))
+endfunc
+
+" 13) visually selected part of columns
+" Text:
+" max: 100px
+" max: 200px
+" max: 300px
+" max: 400px
+" Expected:
+" 1) 'v' on first two numbers Ctrl-A
+" max: 110px
+" max: 220px
+" max: 330px
+" max: 400px
+" 2) 'v' on first two numbers Ctrl-X
+" max: 90px
+" max: 190px
+" max: 290px
+" max: 400px
+func Test_visual_increment_13()
+ call setline(1, ["max: 100px", "max: 200px", "max: 300px", "max: 400px"])
+ exec "norm! f1\<C-V>l2j\<C-A>"
+ call assert_equal(["max: 110px", "max: 210px", "max: 310px", "max: 400px"], getline(1, '$'))
+ call assert_equal([0, 1, 6, 0], getpos('.'))
+
+ call setline(1, ["max: 100px", "max: 200px", "max: 300px", "max: 400px"])
+ exec "norm! ggf1\<C-V>l2j\<C-X>"
+ call assert_equal(["max: 90px", "max: 190px", "max: 290px", "max: 400px"], getline(1, '$'))
+ call assert_equal([0, 1, 6, 0], getpos('.'))
+endfunc
+
+" 14) redo in block mode
+" Text:
+" 1 1
+" 1 1
+" Expected:
+" 1) Ctrl-a on first column, redo on second column
+" 2 2
+" 2 2
+func Test_visual_increment_14()
+ call setline(1, repeat(["1 1"], 2))
+ exec "norm! G\<C-V>k\<C-A>w."
+ call assert_equal(["2 2", "2 2"], getline(1, '$'))
+ call assert_equal([0, 1, 3, 0], getpos('.'))
+endfunc
+
+" 15) block select single numbers
+" Text:
+" 101
+" Expected:
+" 1) Ctrl-a on visually selected zero
+" 111
+"
+" Also: 019 with "01" selected increments to "029".
+func Test_visual_increment_15()
+ call setline(1, ["101"])
+ exec "norm! lv\<C-A>"
+ call assert_equal(["111"], getline(1, '$'))
+ call assert_equal([0, 1, 2, 0], getpos('.'))
+
+ call setline(1, ["019"])
+ exec "norm! 0vl\<C-A>"
+ call assert_equal("029", getline(1))
+
+ call setline(1, ["01239"])
+ exec "norm! 0vlll\<C-A>"
+ call assert_equal("01249", getline(1))
+
+ call setline(1, ["01299"])
+ exec "norm! 0vlll\<C-A>"
+ call assert_equal("1309", getline(1))
+endfunc
+
+" 16) increment right aligned numbers
+" Text:
+" 1
+" 19
+" 119
+" Expected:
+" 1) Ctrl-a on line selected region
+" 2
+" 20
+" 120
+func Test_visual_increment_16()
+ call setline(1, [" 1", " 19", " 119"])
+ exec "norm! VG\<C-A>"
+ call assert_equal([" 2", " 20", " 120"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+endfunc
+
+" 17) block-wise increment and redo
+" Text:
+" 100
+" 1
+"
+" 100
+" 1
+"
+" Expected:
+" 1) Ctrl-V j $ on first block, afterwards '.' on second
+" 101
+" 2
+"
+" 101
+" 2
+func Test_visual_increment_17()
+ call setline(1, [" 100", " 1", "", " 100", " 1"])
+ exec "norm! \<C-V>j$\<C-A>2j."
+ call assert_equal([" 101", " 2", "", " 101", " 1"], getline(1, '$'))
+ call assert_equal([0, 3, 1, 0], getpos('.'))
+endfunc
+
+" 18) repeat of g<Ctrl-a>
+" Text:
+" 0
+" 0
+" 0
+" 0
+"
+" Expected:
+" 1) V 4j g<ctrl-a>, repeat twice afterwards with .
+" 3
+" 6
+" 9
+" 12
+func Test_visual_increment_18()
+ call setline(1, repeat(["0"], 4))
+ exec "norm! GV3kg\<C-A>"
+ exec "norm! .."
+ call assert_equal(["3", "6", "9", "12"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+endfunc
+
+" 19) increment on number with nrformat including alpha
+" Text:
+" 1
+" 1a
+"
+" Expected:
+" 1) <Ctrl-V>j$ <ctrl-a>
+" 2
+" 2a
+func Test_visual_increment_19()
+ set nrformats+=alpha
+ call setline(1, ["1", "1a"])
+ exec "norm! \<C-V>G$\<C-A>"
+ call assert_equal(["2", "2a"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+endfunc
+
+" 20) increment a single letter
+" Text:
+" a
+"
+" Expected:
+" 1) <Ctrl-a> and cursor is on a
+" b
+func Test_visual_increment_20()
+ set nrformats+=alpha
+ call setline(1, ["a"])
+ exec "norm! \<C-A>"
+ call assert_equal(["b"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+endfunc
+
+" 21) block-wise increment on part of hexadecimal
+" Text:
+" 0x123456
+"
+" Expected:
+" 1) Ctrl-V f3 <ctrl-a>
+" 0x124456
+func Test_visual_increment_21()
+ call setline(1, ["0x123456"])
+ exec "norm! \<C-V>f3\<C-A>"
+ call assert_equal(["0x124456"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+endfunc
+
+" 22) Block increment on 0b0
+" Text:
+" 0b1
+" 0b1
+" Expected:
+" 1) Ctrl-A on visually block selected region (cursor at beginning):
+" 0b10
+" 0b10
+" 2) Ctrl-A on visually block selected region (cursor at end)
+" 0b10
+" 0b10
+func Test_visual_increment_22()
+ call setline(1, repeat(["0b1"], 2))
+ exec "norm! \<C-V>j$\<C-A>"
+ call assert_equal(repeat(["0b10"], 2), getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+
+ call setline(1, repeat(["0b1"], 2))
+ exec "norm! $\<C-V>+\<C-A>"
+ call assert_equal(repeat(["0b10"], 2), getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+endfunc
+
+" 23) block-wise increment on part of binary
+" Text:
+" 0b1001
+"
+" Expected:
+" 1) Ctrl-V 5l <ctrl-a>
+" 0b1011
+func Test_visual_increment_23()
+ call setline(1, ["0b1001"])
+ exec "norm! \<C-V>4l\<C-A>"
+ call assert_equal(["0b1011"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+endfunc
+
+" 24) increment hexadecimal
+" Text:
+" 0x0b1001
+"
+" Expected:
+" 1) <ctrl-a>
+" 0x0b1002
+func Test_visual_increment_24()
+ call setline(1, ["0x0b1001"])
+ exec "norm! \<C-V>$\<C-A>"
+ call assert_equal(["0x0b1002"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+endfunc
+
+" 25) increment binary with nrformats including alpha
+" Text:
+" 0b1001a
+"
+" Expected:
+" 1) <ctrl-a>
+" 0b1010a
+func Test_visual_increment_25()
+ set nrformats+=alpha
+ call setline(1, ["0b1001a"])
+ exec "norm! \<C-V>$\<C-A>"
+ call assert_equal(["0b1010a"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+endfunc
+
+" 26) increment binary with 32 bits
+" Text:
+" 0b11111111111111111111111111111110
+"
+" Expected:
+" 1) <ctrl-a>
+" 0b11111111111111111111111111111111
+func Test_visual_increment_26()
+ set nrformats+=alpha
+ call setline(1, ["0b11111111111111111111111111111110"])
+ exec "norm! \<C-V>$\<C-A>"
+ call assert_equal(["0b11111111111111111111111111111111"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+ set nrformats-=alpha
+endfunc
+
+" 27) increment with 'rightreft', if supported
+func Test_visual_increment_27()
+ if exists('+rightleft')
+ set rightleft
+ call setline(1, ["1234 56"])
+
+ exec "norm! $\<C-A>"
+ call assert_equal(["1234 57"], getline(1, '$'))
+ call assert_equal([0, 1, 7, 0], getpos('.'))
+
+ exec "norm! \<C-A>"
+ call assert_equal(["1234 58"], getline(1, '$'))
+ call assert_equal([0, 1, 7, 0], getpos('.'))
+ set norightleft
+ endif
+endfunc
+
+" Tab code and linewise-visual inc/dec
+func Test_visual_increment_28()
+ call setline(1, ["x\<TAB>10", "\<TAB>-1"])
+ exec "norm! Vj\<C-A>"
+ call assert_equal(["x\<TAB>11", "\<TAB>0"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+
+ call setline(1, ["x\<TAB>10", "\<TAB>-1"])
+ exec "norm! ggVj\<C-X>"
+ call assert_equal(["x\<TAB>9", "\<TAB>-2"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+endfunc
+
+" Tab code and linewise-visual inc/dec with 'nrformats'+=alpha
+func Test_visual_increment_29()
+ set nrformats+=alpha
+ call setline(1, ["x\<TAB>10", "\<TAB>-1"])
+ exec "norm! Vj\<C-A>"
+ call assert_equal(["y\<TAB>10", "\<TAB>0"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+
+ call setline(1, ["x\<TAB>10", "\<TAB>-1"])
+ exec "norm! ggVj\<C-X>"
+ call assert_equal(["w\<TAB>10", "\<TAB>-2"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+endfunc
+
+" Tab code and character-visual inc/dec
+func Test_visual_increment_30()
+ call setline(1, ["x\<TAB>10", "\<TAB>-1"])
+ exec "norm! f1vjf1\<C-A>"
+ call assert_equal(["x\<TAB>11", "\<TAB>0"], getline(1, '$'))
+ call assert_equal([0, 1, 3, 0], getpos('.'))
+
+ call setline(1, ["x\<TAB>10", "\<TAB>-1"])
+ exec "norm! ggf1vjf1\<C-X>"
+ call assert_equal(["x\<TAB>9", "\<TAB>-2"], getline(1, '$'))
+ call assert_equal([0, 1, 3, 0], getpos('.'))
+endfunc
+
+" Tab code and blockwise-visual inc/dec
+func Test_visual_increment_31()
+ call setline(1, ["x\<TAB>10", "\<TAB>-1"])
+ exec "norm! f1\<C-V>jl\<C-A>"
+ call assert_equal(["x\<TAB>11", "\<TAB>0"], getline(1, '$'))
+ call assert_equal([0, 1, 3, 0], getpos('.'))
+
+ call setline(1, ["x\<TAB>10", "\<TAB>-1"])
+ exec "norm! ggf1\<C-V>jl\<C-X>"
+ call assert_equal(["x\<TAB>9", "\<TAB>-2"], getline(1, '$'))
+ call assert_equal([0, 1, 3, 0], getpos('.'))
+endfunc
+
+" Tab code and blockwise-visual decrement with 'linebreak' and 'showbreak'
+func Test_visual_increment_32()
+ 28vnew dummy_31
+ set linebreak showbreak=+
+ call setline(1, ["x\<TAB>\<TAB>\<TAB>10", "\<TAB>\<TAB>\<TAB>\<TAB>-1"])
+ exec "norm! ggf0\<C-V>jg_\<C-X>"
+ call assert_equal(["x\<TAB>\<TAB>\<TAB>1-1", "\<TAB>\<TAB>\<TAB>\<TAB>-2"], getline(1, '$'))
+ call assert_equal([0, 1, 6, 0], getpos('.'))
+ bwipe!
+endfunc
+
+" Tab code and blockwise-visual increment with $
+func Test_visual_increment_33()
+ call setline(1, ["\<TAB>123", "456"])
+ exec "norm! gg0\<C-V>j$\<C-A>"
+ call assert_equal(["\<TAB>124", "457"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+endfunc
+
+" Tab code and blockwise-visual increment and redo
+func Test_visual_increment_34()
+ call setline(1, ["\<TAB>123", " 456789"])
+ exec "norm! gg0\<C-V>j\<C-A>"
+ call assert_equal(["\<TAB>123", " 457789"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+
+ exec "norm! .."
+ call assert_equal(["\<TAB>123", " 459789"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+endfunc
+
+" Tab code, spaces and character-visual increment and redo
+func Test_visual_increment_35()
+ call setline(1, ["\<TAB>123", " 123", "\<TAB>123", "\<TAB>123"])
+ exec "norm! ggvjf3\<C-A>..."
+ call assert_equal(["\<TAB>127", " 127", "\<TAB>123", "\<TAB>123"], getline(1, '$'))
+ call assert_equal([0, 1, 2, 0], getpos('.'))
+endfunc
+
+" Tab code, spaces and blockwise-visual increment and redo
+func Test_visual_increment_36()
+ call setline(1, [" 123", "\<TAB>456789"])
+ exec "norm! G0\<C-V>kl\<C-A>"
+ call assert_equal([" 123", "\<TAB>556789"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+
+ exec "norm! ..."
+ call assert_equal([" 123", "\<TAB>856789"], getline(1, '$'))
+ call assert_equal([0, 1, 1, 0], getpos('.'))
+endfunc
+
+" block-wise increment and dot-repeat
+" Text:
+" 1 23
+" 4 56
+"
+" Expected:
+" 1) f2 Ctrl-V jl <ctrl-a>, repeat twice afterwards with .
+" 1 26
+" 4 59
+"
+" Try with and without indent.
+func Test_visual_increment_37()
+ call setline(1, [" 1 23", " 4 56"])
+ exec "norm! ggf2\<C-V>jl\<C-A>.."
+ call assert_equal([" 1 26", " 4 59"], getline(1, 2))
+
+ call setline(1, ["1 23", "4 56"])
+ exec "norm! ggf2\<C-V>jl\<C-A>.."
+ call assert_equal(["1 26", "4 59"], getline(1, 2))
+endfunc
+
+" Check redo after the normal mode increment
+func Test_visual_increment_38()
+ exec "norm! i10\<ESC>5\<C-A>."
+ call assert_equal(["20"], getline(1, '$'))
+ call assert_equal([0, 1, 2, 0], getpos('.'))
+endfunc
+
+" Test what patch 7.3.414 fixed. Ctrl-A on "000" drops the leading zeros.
+func Test_normal_increment_01()
+ call setline(1, "000")
+ exec "norm! gg0\<C-A>"
+ call assert_equal("001", getline(1))
+
+ call setline(1, "000")
+ exec "norm! gg$\<C-A>"
+ call assert_equal("001", getline(1))
+
+ call setline(1, "001")
+ exec "norm! gg0\<C-A>"
+ call assert_equal("002", getline(1))
+
+ call setline(1, "001")
+ exec "norm! gg$\<C-A>"
+ call assert_equal("002", getline(1))
+endfunc
+
+" Test a regression of patch 7.4.1087 fixed.
+func Test_normal_increment_02()
+ call setline(1, ["hello 10", "world"])
+ exec "norm! ggl\<C-A>jx"
+ call assert_equal(["hello 11", "worl"], getline(1, '$'))
+ call assert_equal([0, 2, 4, 0], getpos('.'))
+endfunc
+
+" The test35 unified to this file.
+func Test_normal_increment_03()
+ call setline(1, ["100 0x100 077 0",
+ \ "100 0x100 077 ",
+ \ "100 0x100 077 0xfF 0xFf",
+ \ "100 0x100 077 "])
+ set nrformats=octal,hex
+ exec "norm! gg\<C-A>102\<C-X>\<C-A>l\<C-X>l\<C-A>64\<C-A>128\<C-X>$\<C-X>"
+ set nrformats=octal
+ exec "norm! j0\<C-A>102\<C-X>\<C-A>l\<C-X>2\<C-A>w65\<C-A>129\<C-X>blx6lD"
+ set nrformats=hex
+ exec "norm! j0101\<C-X>l257\<C-X>\<C-A>Txldt \<C-A> \<C-X> \<C-X>"
+ set nrformats=
+ exec "norm! j0200\<C-X>l100\<C-X>w78\<C-X>\<C-A>k"
+ call assert_equal(["0 0x0ff 0000 -1",
+ \ "0 1x100 0777777",
+ \ "-1 0x0 078 0xFE 0xfe",
+ \ "-100 -100x100 000 "], getline(1, '$'))
+ call assert_equal([0, 3, 25, 0], getpos('.'))
+endfunc
+
+func Test_increment_empty_line()
+ new
+ call setline(1, ['0', '0', '0', '0', '0', '0', ''])
+ exe "normal Gvgg\<C-A>"
+ call assert_equal(['1', '1', '1', '1', '1', '1', ''], getline(1, 7))
+ bwipe!
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_increment_dbcs.vim b/src/nvim/testdir/test_increment_dbcs.vim
new file mode 100644
index 0000000000..474a16feeb
--- /dev/null
+++ b/src/nvim/testdir/test_increment_dbcs.vim
@@ -0,0 +1,29 @@
+" Tests for using Ctrl-A/Ctrl-X using DBCS.
+if !has('multi_byte')
+ finish
+endif
+scriptencoding cp932
+
+func SetUp()
+ new
+ set nrformats&
+endfunc
+
+func TearDown()
+ bwipe!
+endfunc
+
+func Test_increment_dbcs_1()
+ set nrformats+=alpha
+ call setline(1, ["ŽR1"])
+ exec "norm! 0\<C-A>"
+ call assert_equal(["ŽR2"], getline(1, '$'))
+ call assert_equal([0, 1, 4, 0], getpos('.'))
+
+ call setline(1, ["‚`‚a‚b0xDE‚e"])
+ exec "norm! 0\<C-X>"
+ call assert_equal(["‚`‚a‚b0xDD‚e"], getline(1, '$'))
+ call assert_equal([0, 1, 13, 0], getpos('.'))
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_ins_complete.vim b/src/nvim/testdir/test_ins_complete.vim
new file mode 100644
index 0000000000..d3429617d0
--- /dev/null
+++ b/src/nvim/testdir/test_ins_complete.vim
@@ -0,0 +1,251 @@
+
+" Test for insert expansion
+func Test_ins_complete()
+ edit test_ins_complete.vim
+ " The files in the current directory interferes with the files
+ " used by this test. So use a separate directory for the test.
+ call mkdir('Xdir')
+ cd Xdir
+
+ set ff=unix
+ call writefile(["test11\t36Gepeto\t/Tag/",
+ \ "asd\ttest11file\t36G",
+ \ "Makefile\tto\trun"], 'Xtestfile')
+ call writefile(['', 'start of testfile',
+ \ 'ru',
+ \ 'run1',
+ \ 'run2',
+ \ 'STARTTEST',
+ \ 'ENDTEST',
+ \ 'end of testfile'], 'Xtestdata')
+ set ff&
+
+ enew!
+ edit Xtestdata
+ new
+ call append(0, ['#include "Xtestfile"', ''])
+ call cursor(2, 1)
+
+ set cot=
+ set cpt=.,w
+ " add-expands (word from next line) from other window
+ exe "normal iru\<C-N>\<C-N>\<C-X>\<C-N>\<Esc>\<C-A>"
+ call assert_equal('run1 run3', getline('.'))
+ " add-expands (current buffer first)
+ exe "normal o\<C-P>\<C-X>\<C-N>"
+ call assert_equal('run3 run3', getline('.'))
+ " Local expansion, ends in an empty line (unless it becomes a global
+ " expansion)
+ exe "normal o\<C-X>\<C-P>\<C-P>\<C-P>\<C-P>\<C-P>"
+ call assert_equal('', getline('.'))
+ " starts Local and switches to global add-expansion
+ exe "normal o\<C-X>\<C-P>\<C-P>\<C-X>\<C-X>\<C-N>\<C-X>\<C-N>\<C-N>"
+ call assert_equal('run1 run2', getline('.'))
+
+ set cpt=.,w,i
+ " i-add-expands and switches to local
+ exe "normal OM\<C-N>\<C-X>\<C-N>\<C-X>\<C-N>\<C-X>\<C-X>\<C-X>\<C-P>"
+ call assert_equal("Makefile\tto\trun3", getline('.'))
+ " add-expands lines (it would end in an empty line if it didn't ignored
+ " itself)
+ exe "normal o\<C-X>\<C-L>\<C-X>\<C-L>\<C-P>\<C-P>"
+ call assert_equal("Makefile\tto\trun3", getline('.'))
+ call assert_equal("Makefile\tto\trun3", getline(line('.') - 1))
+
+ set cpt=kXtestfile
+ " checks k-expansion, and file expansion (use Xtest11 instead of test11,
+ " because TEST11.OUT may match first on DOS)
+ write Xtest11.one
+ write Xtest11.two
+ exe "normal o\<C-N>\<Esc>IX\<Esc>A\<C-X>\<C-F>\<C-N>"
+ call assert_equal('Xtest11.two', getline('.'))
+
+ " use CTRL-X CTRL-F to complete Xtest11.one, remove it and then use CTRL-X
+ " CTRL-F again to verify this doesn't cause trouble.
+ exe "normal oXt\<C-X>\<C-F>\<BS>\<BS>\<BS>\<BS>\<BS>\<BS>\<BS>\<BS>\<C-X>\<C-F>"
+ call assert_equal('Xtest11.one', getline('.'))
+ normal ddk
+
+ set cpt=w
+ " checks make_cyclic in other window
+ exe "normal oST\<C-N>\<C-P>\<C-P>\<C-P>\<C-P>"
+ call assert_equal('STARTTEST', getline('.'))
+
+ set cpt=u nohid
+ " checks unloaded buffer expansion
+ only
+ exe "normal oEN\<C-N>"
+ call assert_equal('ENDTEST', getline('.'))
+ " checks adding mode abortion
+ exe "normal ounl\<C-N>\<C-X>\<C-X>\<C-P>"
+ call assert_equal('unless', getline('.'))
+
+ set cpt=t,d def=^\\k* tags=Xtestfile notagbsearch
+ " tag expansion, define add-expansion interrupted
+ exe "normal o\<C-X>\<C-]>\<C-X>\<C-D>\<C-X>\<C-D>\<C-X>\<C-X>\<C-D>\<C-X>\<C-D>\<C-X>\<C-D>\<C-X>\<C-D>"
+ call assert_equal('test11file 36Gepeto /Tag/ asd', getline('.'))
+ " t-expansion
+ exe "normal oa\<C-N>\<Esc>"
+ call assert_equal('asd', getline('.'))
+
+ %bw!
+ call delete('Xtestfile')
+ call delete('Xtest11.one')
+ call delete('Xtest11.two')
+ call delete('Xtestdata')
+ set cpt& cot& def& tags& tagbsearch& hidden&
+ cd ..
+ call delete('Xdir', 'rf')
+endfunc
+
+function! s:CompleteDone_CompleteFuncDict( findstart, base )
+ if a:findstart
+ return 0
+ endif
+
+ return {
+ \ 'words': [
+ \ {
+ \ 'word': 'aword',
+ \ 'abbr': 'wrd',
+ \ 'menu': 'extra text',
+ \ 'info': 'words are cool',
+ \ 'kind': 'W',
+ \ 'user_data': 'test'
+ \ }
+ \ ]
+ \ }
+endfunction
+
+function! s:CompleteDone_CheckCompletedItemDict()
+ call assert_equal( 'aword', v:completed_item[ 'word' ] )
+ call assert_equal( 'wrd', v:completed_item[ 'abbr' ] )
+ call assert_equal( 'extra text', v:completed_item[ 'menu' ] )
+ call assert_equal( 'words are cool', v:completed_item[ 'info' ] )
+ call assert_equal( 'W', v:completed_item[ 'kind' ] )
+ call assert_equal( 'test', v:completed_item[ 'user_data' ] )
+
+ let s:called_completedone = 1
+endfunction
+
+function Test_CompleteDoneDict()
+ au CompleteDone * :call <SID>CompleteDone_CheckCompletedItemDict()
+
+ set completefunc=<SID>CompleteDone_CompleteFuncDict
+ execute "normal a\<C-X>\<C-U>\<C-Y>"
+ set completefunc&
+
+ call assert_equal( 'test', v:completed_item[ 'user_data' ] )
+ call assert_true( s:called_completedone )
+
+ let s:called_completedone = 0
+ au! CompleteDone
+endfunc
+
+func Test_CompleteDone_undo()
+ au CompleteDone * call append(0, "prepend1")
+ new
+ call setline(1, ["line1", "line2"])
+ call feedkeys("Go\<C-X>\<C-N>\<CR>\<ESC>", "tx")
+ call assert_equal(["prepend1", "line1", "line2", "line1", ""],
+ \ getline(1, '$'))
+ undo
+ call assert_equal(["line1", "line2"], getline(1, '$'))
+ bwipe!
+ au! CompleteDone
+endfunc
+
+function! s:CompleteDone_CompleteFuncDictNoUserData( findstart, base )
+ if a:findstart
+ return 0
+ endif
+
+ return {
+ \ 'words': [
+ \ {
+ \ 'word': 'aword',
+ \ 'abbr': 'wrd',
+ \ 'menu': 'extra text',
+ \ 'info': 'words are cool',
+ \ 'kind': 'W'
+ \ }
+ \ ]
+ \ }
+endfunction
+
+function! s:CompleteDone_CheckCompletedItemDictNoUserData()
+ call assert_equal( 'aword', v:completed_item[ 'word' ] )
+ call assert_equal( 'wrd', v:completed_item[ 'abbr' ] )
+ call assert_equal( 'extra text', v:completed_item[ 'menu' ] )
+ call assert_equal( 'words are cool', v:completed_item[ 'info' ] )
+ call assert_equal( 'W', v:completed_item[ 'kind' ] )
+ call assert_equal( '', v:completed_item[ 'user_data' ] )
+
+ let s:called_completedone = 1
+endfunction
+
+function Test_CompleteDoneDictNoUserData()
+ au CompleteDone * :call <SID>CompleteDone_CheckCompletedItemDictNoUserData()
+
+ set completefunc=<SID>CompleteDone_CompleteFuncDictNoUserData
+ execute "normal a\<C-X>\<C-U>\<C-Y>"
+ set completefunc&
+
+ call assert_equal( '', v:completed_item[ 'user_data' ] )
+ call assert_true( s:called_completedone )
+
+ let s:called_completedone = 0
+ au! CompleteDone
+endfunc
+
+function! s:CompleteDone_CompleteFuncList( findstart, base )
+ if a:findstart
+ return 0
+ endif
+
+ return [ 'aword' ]
+endfunction
+
+function! s:CompleteDone_CheckCompletedItemList()
+ call assert_equal( 'aword', v:completed_item[ 'word' ] )
+ call assert_equal( '', v:completed_item[ 'abbr' ] )
+ call assert_equal( '', v:completed_item[ 'menu' ] )
+ call assert_equal( '', v:completed_item[ 'info' ] )
+ call assert_equal( '', v:completed_item[ 'kind' ] )
+ call assert_equal( '', v:completed_item[ 'user_data' ] )
+
+ let s:called_completedone = 1
+endfunction
+
+function Test_CompleteDoneList()
+ au CompleteDone * :call <SID>CompleteDone_CheckCompletedItemList()
+
+ set completefunc=<SID>CompleteDone_CompleteFuncList
+ execute "normal a\<C-X>\<C-U>\<C-Y>"
+ set completefunc&
+
+ call assert_equal( '', v:completed_item[ 'user_data' ] )
+ call assert_true( s:called_completedone )
+
+ let s:called_completedone = 0
+ au! CompleteDone
+endfunc
+
+func Test_omni_dash()
+ func Omni(findstart, base)
+ if a:findstart
+ return 5
+ else
+ echom a:base
+ return ['-help', '-v']
+ endif
+ endfunc
+ set omnifunc=Omni
+ new
+ exe "normal Gofind -\<C-x>\<C-o>"
+ call assert_equal("\n-\nmatch 1 of 2", execute(':2mess'))
+
+ bwipe!
+ delfunc Omni
+ set omnifunc=
+endfunc
diff --git a/src/nvim/testdir/test_join.vim b/src/nvim/testdir/test_join.vim
new file mode 100644
index 0000000000..1c97414164
--- /dev/null
+++ b/src/nvim/testdir/test_join.vim
@@ -0,0 +1,35 @@
+" Test for joining lines.
+
+func Test_join_with_count()
+ new
+ call setline(1, ['one', 'two', 'three', 'four'])
+ normal J
+ call assert_equal('one two', getline(1))
+ %del
+ call setline(1, ['one', 'two', 'three', 'four'])
+ normal 10J
+ call assert_equal('one two three four', getline(1))
+ quit!
+endfunc
+
+" Tests for setting the '[,'] marks when joining lines.
+func Test_join_marks()
+ enew
+ call append(0, [
+ \ "\t\tO sodales, ludite, vos qui",
+ \ "attamen consulite per voster honur. Tua pulchra " .
+ \ "facies me fay planszer milies",
+ \ "",
+ \ "This line.",
+ \ "Should be joined with the next line",
+ \ "and with this line"])
+
+ normal gg0gqj
+ call assert_equal([0, 1, 1, 0], getpos("'["))
+ call assert_equal([0, 2, 1, 0], getpos("']"))
+
+ /^This line/;'}-join
+ call assert_equal([0, 4, 11, 0], getpos("'["))
+ call assert_equal([0, 4, 67, 0], getpos("']"))
+ enew!
+endfunc
diff --git a/src/nvim/testdir/test_jumps.vim b/src/nvim/testdir/test_jumps.vim
new file mode 100644
index 0000000000..5a3717d165
--- /dev/null
+++ b/src/nvim/testdir/test_jumps.vim
@@ -0,0 +1,11 @@
+func Test_empty_buffer()
+ new
+ insert
+a
+b
+c
+d
+.
+ call assert_equal(1, line("''"))
+ bwipe!
+endfunc
diff --git a/src/nvim/testdir/test_lambda.vim b/src/nvim/testdir/test_lambda.vim
new file mode 100644
index 0000000000..6e07c874b4
--- /dev/null
+++ b/src/nvim/testdir/test_lambda.vim
@@ -0,0 +1,287 @@
+" Test for lambda and closure
+
+function! Test_lambda_feature()
+ call assert_equal(1, has('lambda'))
+endfunction
+
+function! Test_lambda_with_filter()
+ let s:x = 2
+ call assert_equal([2, 3], filter([1, 2, 3], {i, v -> v >= s:x}))
+endfunction
+
+function! Test_lambda_with_map()
+ let s:x = 1
+ call assert_equal([2, 3, 4], map([1, 2, 3], {i, v -> v + s:x}))
+endfunction
+
+function! Test_lambda_with_sort()
+ call assert_equal([1, 2, 3, 4, 7], sort([3,7,2,1,4], {a, b -> a - b}))
+endfunction
+
+function! Test_lambda_with_timer()
+ if !has('timers')
+ return
+ endif
+
+ let s:n = 0
+ let s:timer_id = 0
+ function! s:Foo()
+ "let n = 0
+ let s:timer_id = timer_start(50, {-> execute("let s:n += 1 | echo s:n", "")}, {"repeat": -1})
+ endfunction
+
+ call s:Foo()
+ sleep 210ms
+ " do not collect lambda
+ call test_garbagecollect_now()
+ let m = s:n
+ sleep 230ms
+ call timer_stop(s:timer_id)
+ call assert_true(m > 1)
+ call assert_true(s:n > m + 1)
+ call assert_true(s:n < 9)
+endfunction
+
+function! Test_lambda_with_partial()
+ let l:Cb = function({... -> ['zero', a:1, a:2, a:3]}, ['one', 'two'])
+ call assert_equal(['zero', 'one', 'two', 'three'], l:Cb('three'))
+endfunction
+
+function Test_lambda_fails()
+ call assert_equal(3, {a, b -> a + b}(1, 2))
+ call assert_fails('echo {a, a -> a + a}(1, 2)', 'E15:')
+ call assert_fails('echo {a, b -> a + b)}(1, 2)', 'E15:')
+endfunc
+
+func Test_not_lambda()
+ let x = {'>' : 'foo'}
+ call assert_equal('foo', x['>'])
+endfunc
+
+function! Test_lambda_capture_by_reference()
+ let v = 1
+ let l:F = {x -> x + v}
+ let v = 2
+ call assert_equal(12, l:F(10))
+endfunction
+
+function! Test_lambda_side_effect()
+ function! s:update_and_return(arr)
+ let a:arr[1] = 5
+ return a:arr
+ endfunction
+
+ function! s:foo(arr)
+ return {-> s:update_and_return(a:arr)}
+ endfunction
+
+ let arr = [3,2,1]
+ call assert_equal([3, 5, 1], s:foo(arr)())
+endfunction
+
+function! Test_lambda_refer_local_variable_from_other_scope()
+ function! s:foo(X)
+ return a:X() " refer l:x in s:bar()
+ endfunction
+
+ function! s:bar()
+ let x = 123
+ return s:foo({-> x})
+ endfunction
+
+ call assert_equal(123, s:bar())
+endfunction
+
+function! Test_lambda_do_not_share_local_variable()
+ function! s:define_funcs()
+ let l:One = {-> split(execute("let a = 'abc' | echo a"))[0]}
+ let l:Two = {-> exists("a") ? a : "no"}
+ return [l:One, l:Two]
+ endfunction
+
+ let l:F = s:define_funcs()
+
+ call assert_equal('no', l:F[1]())
+ call assert_equal('abc', l:F[0]())
+ call assert_equal('no', l:F[1]())
+endfunction
+
+function! Test_lambda_closure_counter()
+ function! s:foo()
+ let x = 0
+ return {-> [execute("let x += 1"), x][-1]}
+ endfunction
+
+ let l:F = s:foo()
+ call garbagecollect()
+ call assert_equal(1, l:F())
+ call assert_equal(2, l:F())
+ call assert_equal(3, l:F())
+ call assert_equal(4, l:F())
+endfunction
+
+function! Test_lambda_with_a_var()
+ function! s:foo()
+ let x = 2
+ return {... -> a:000 + [x]}
+ endfunction
+ function! s:bar()
+ return s:foo()(1)
+ endfunction
+
+ call assert_equal([1, 2], s:bar())
+endfunction
+
+function! Test_lambda_call_lambda_from_lambda()
+ function! s:foo(x)
+ let l:F1 = {-> {-> a:x}}
+ return {-> l:F1()}
+ endfunction
+
+ let l:F = s:foo(1)
+ call assert_equal(1, l:F()())
+endfunction
+
+function! Test_lambda_delfunc()
+ function! s:gen()
+ let pl = l:
+ let l:Foo = {-> get(pl, "Foo", get(pl, "Bar", {-> 0}))}
+ let l:Bar = l:Foo
+ delfunction l:Foo
+ return l:Bar
+ endfunction
+
+ let l:F = s:gen()
+ call assert_fails(':call l:F()', 'E933:')
+endfunction
+
+function! Test_lambda_scope()
+ function! s:NewCounter()
+ let c = 0
+ return {-> [execute('let c += 1'), c][-1]}
+ endfunction
+
+ function! s:NewCounter2()
+ return {-> [execute('let c += 100'), c][-1]}
+ endfunction
+
+ let l:C = s:NewCounter()
+ let l:D = s:NewCounter2()
+
+ call assert_equal(1, l:C())
+ call assert_fails(':call l:D()', 'E15:') " E121: then E15:
+ call assert_equal(2, l:C())
+endfunction
+
+function! Test_lambda_share_scope()
+ function! s:New()
+ let c = 0
+ let l:Inc0 = {-> [execute('let c += 1'), c][-1]}
+ let l:Dec0 = {-> [execute('let c -= 1'), c][-1]}
+ return [l:Inc0, l:Dec0]
+ endfunction
+
+ let [l:Inc, l:Dec] = s:New()
+
+ call assert_equal(1, l:Inc())
+ call assert_equal(2, l:Inc())
+ call assert_equal(1, l:Dec())
+endfunction
+
+function! Test_lambda_circular_reference()
+ function! s:Foo()
+ let d = {}
+ let d.f = {-> d}
+ return d.f
+ endfunction
+
+ call s:Foo()
+ call garbagecollect()
+ let i = 0 | while i < 10000 | call s:Foo() | let i+= 1 | endwhile
+ call garbagecollect()
+endfunction
+
+function! Test_lambda_combination()
+ call assert_equal(2, {x -> {x -> x}}(1)(2))
+ call assert_equal(10, {y -> {x -> x(y)(10)}({y -> y})}({z -> z}))
+ call assert_equal(5.0, {x -> {y -> x / y}}(10)(2.0))
+ call assert_equal(6, {x -> {y -> {z -> x + y + z}}}(1)(2)(3))
+
+ call assert_equal(6, {x -> {f -> f(x)}}(3)({x -> x * 2}))
+ call assert_equal(6, {f -> {x -> f(x)}}({x -> x * 2})(3))
+
+ " Z combinator
+ let Z = {f -> {x -> f({y -> x(x)(y)})}({x -> f({y -> x(x)(y)})})}
+ let Fact = {f -> {x -> x == 0 ? 1 : x * f(x - 1)}}
+ call assert_equal(120, Z(Fact)(5))
+endfunction
+
+function! Test_closure_counter()
+ function! s:foo()
+ let x = 0
+ function! s:bar() closure
+ let x += 1
+ return x
+ endfunction
+ return function('s:bar')
+ endfunction
+
+ let l:F = s:foo()
+ call garbagecollect()
+ call assert_equal(1, l:F())
+ call assert_equal(2, l:F())
+ call assert_equal(3, l:F())
+ call assert_equal(4, l:F())
+endfunction
+
+function! Test_closure_unlet()
+ function! s:foo()
+ let x = 1
+ function! s:bar() closure
+ unlet x
+ endfunction
+ call s:bar()
+ return l:
+ endfunction
+
+ call assert_false(has_key(s:foo(), 'x'))
+ call garbagecollect()
+endfunction
+
+function! LambdaFoo()
+ let x = 0
+ function! LambdaBar() closure
+ let x += 1
+ return x
+ endfunction
+ return function('LambdaBar')
+endfunction
+
+func Test_closure_refcount()
+ let g:Count = LambdaFoo()
+ call test_garbagecollect_now()
+ call assert_equal(1, g:Count())
+ let g:Count2 = LambdaFoo()
+ call test_garbagecollect_now()
+ call assert_equal(1, g:Count2())
+ call assert_equal(2, g:Count())
+ call assert_equal(3, g:Count2())
+
+ delfunc LambdaFoo
+ delfunc LambdaBar
+endfunc
+
+" This test is causing a use-after-free on shutdown.
+func Test_named_function_closure()
+ func! Afoo()
+ let x = 14
+ func! s:Abar() closure
+ return x
+ endfunc
+ call assert_equal(14, s:Abar())
+ endfunc
+ call Afoo()
+ call assert_equal(14, s:Abar())
+ call garbagecollect()
+ call assert_equal(14, s:Abar())
+endfunc
diff --git a/src/nvim/testdir/test_largefile.vim b/src/nvim/testdir/test_largefile.vim
new file mode 100644
index 0000000000..3f9c2dc150
--- /dev/null
+++ b/src/nvim/testdir/test_largefile.vim
@@ -0,0 +1,34 @@
+" Tests for large files
+" This is only executed manually: "TEST_FILE=test_largefile.res make oldtest".
+" This is not run as part of "make test".
+
+func Test_largefile()
+ let fname = 'Xlarge.txt'
+
+ call delete(fname)
+ exe "e" fname
+ " Make sure that a line break is 1 byte (LF).
+ set ff=unix
+ set undolevels=-1
+ " Input 99 'A's. The line becomes 100 bytes including a line break.
+ exe "normal 99iA\<Esc>"
+ yank
+ " Put 39,999,999 times. The file becomes 4,000,000,000 bytes.
+ normal 39999999p
+ " Moving around in the file randomly.
+ normal G
+ normal 10%
+ normal 90%
+ normal 50%
+ normal gg
+ w
+ " Check if the file size is 4,000,000,000 bytes.
+ let fsize=getfsize(fname)
+ if has('num64')
+ call assert_true(fsize == 4000000000)
+ else
+ " getfsize() returns -2 if a Number is 32 bits.
+ call assert_true(fsize == -2)
+ endif
+ call delete(fname)
+endfunc
diff --git a/src/nvim/testdir/test_let.vim b/src/nvim/testdir/test_let.vim
new file mode 100644
index 0000000000..24c6ef5e01
--- /dev/null
+++ b/src/nvim/testdir/test_let.vim
@@ -0,0 +1,27 @@
+" Tests for the :let command.
+
+func Test_let()
+ " Test to not autoload when assigning. It causes internal error.
+ set runtimepath+=./sautest
+ let Test104#numvar = function('tr')
+ call assert_equal("function('tr')", string(Test104#numvar))
+
+ let a = 1
+ let b = 2
+
+ let out = execute('let a b')
+ let s = "\na #1\nb #2"
+ call assert_equal(s, out)
+
+ let out = execute('let {0 == 1 ? "a" : "b"}')
+ let s = "\nb #2"
+ call assert_equal(s, out)
+
+ let out = execute('let {0 == 1 ? "a" : "b"} a')
+ let s = "\nb #2\na #1"
+ call assert_equal(s, out)
+
+ let out = execute('let a {0 == 1 ? "a" : "b"}')
+ let s = "\na #1\nb #2"
+ call assert_equal(s, out)
+endfunc
diff --git a/src/nvim/testdir/test_lineending.vim b/src/nvim/testdir/test_lineending.vim
new file mode 100644
index 0000000000..5be3be8db3
--- /dev/null
+++ b/src/nvim/testdir/test_lineending.vim
@@ -0,0 +1,19 @@
+" Tests for saving/loading a file with some lines ending in
+" CTRL-M, some not
+func Test_lineending()
+ let l = ["this line ends in a\<CR>",
+ \ "this one doesn't",
+ \ "this one does\<CR>",
+ \ "and the last one doesn't"]
+ set fileformat=dos
+ enew!
+ call append(0, l)
+ $delete
+ write Xfile1
+ bwipe Xfile1
+ edit Xfile1
+ let t = getline(1, '$')
+ call assert_equal(l, t)
+ new | only
+ call delete('Xfile1')
+endfunc
diff --git a/src/nvim/testdir/test_lispwords.vim b/src/nvim/testdir/test_lispwords.vim
new file mode 100644
index 0000000000..4c05504cf1
--- /dev/null
+++ b/src/nvim/testdir/test_lispwords.vim
@@ -0,0 +1,82 @@
+" Tests for 'lispwords' settings being global-local
+
+set nocompatible viminfo+=nviminfo
+
+func Test_global_local_lispwords()
+ setglobal lispwords=foo,bar,baz
+ setlocal lispwords-=foo | setlocal lispwords+=quux
+ call assert_equal('foo,bar,baz', &g:lispwords)
+ call assert_equal('bar,baz,quux', &l:lispwords)
+ call assert_equal('bar,baz,quux', &lispwords)
+
+ setlocal lispwords<
+ call assert_equal('foo,bar,baz', &g:lispwords)
+ call assert_equal('foo,bar,baz', &l:lispwords)
+ call assert_equal('foo,bar,baz', &lispwords)
+endfunc
+
+func Test_lisp_indent()
+ enew!
+
+ call append(0, [
+ \ '(defun html-file (base)',
+ \ '(format nil "~(~A~).html" base))',
+ \ '',
+ \ '(defmacro page (name title &rest body)',
+ \ '(let ((ti (gensym)))',
+ \ '`(with-open-file (*standard-output*',
+ \ '(html-file ,name)',
+ \ ':direction :output',
+ \ ':if-exists :supersede)',
+ \ '(let ((,ti ,title))',
+ \ '(as title ,ti)',
+ \ '(with center ',
+ \ '(as h2 (string-upcase ,ti)))',
+ \ '(brs 3)',
+ \ ',@body))))',
+ \ '',
+ \ ';;; Utilities for generating links',
+ \ '',
+ \ '(defmacro with-link (dest &rest body)',
+ \ '`(progn',
+ \ '(format t "<a href=\"~A\">" (html-file ,dest))',
+ \ ',@body',
+ \ '(princ "</a>")))'
+ \ ])
+ set lisp
+ set lispwords&
+ let save_copt = &cpoptions
+ set cpoptions+=p
+ normal 1G=G
+
+ call assert_equal([
+ \ '(defun html-file (base)',
+ \ ' (format nil "~(~A~).html" base))',
+ \ '',
+ \ '(defmacro page (name title &rest body)',
+ \ ' (let ((ti (gensym)))',
+ \ ' `(with-open-file (*standard-output*',
+ \ ' (html-file ,name)',
+ \ ' :direction :output',
+ \ ' :if-exists :supersede)',
+ \ ' (let ((,ti ,title))',
+ \ ' (as title ,ti)',
+ \ ' (with center ',
+ \ ' (as h2 (string-upcase ,ti)))',
+ \ ' (brs 3)',
+ \ ' ,@body))))',
+ \ '',
+ \ ';;; Utilities for generating links',
+ \ '',
+ \ '(defmacro with-link (dest &rest body)',
+ \ ' `(progn',
+ \ ' (format t "<a href=\"~A\">" (html-file ,dest))',
+ \ ' ,@body',
+ \ ' (princ "</a>")))',
+ \ ''
+ \ ], getline(1, "$"))
+
+ enew!
+ let &cpoptions=save_copt
+ set nolisp
+endfunc
diff --git a/src/nvim/testdir/test_listchars.vim b/src/nvim/testdir/test_listchars.vim
new file mode 100644
index 0000000000..57ea7ca5a9
--- /dev/null
+++ b/src/nvim/testdir/test_listchars.vim
@@ -0,0 +1,63 @@
+" Tests for 'listchars' display with 'list' and :list
+
+source view_util.vim
+
+func Test_listchars()
+ enew!
+ set ff=unix
+ set list
+
+ set listchars+=tab:>-,space:.,trail:<
+ call append(0, [
+ \ ' aa ',
+ \ ' bb ',
+ \ ' cccc ',
+ \ 'dd ee ',
+ \ ' '
+ \ ])
+ let expected = [
+ \ '>-------aa>-----$',
+ \ '..bb>---<<$',
+ \ '...cccc><$',
+ \ 'dd........ee<<>-$',
+ \ '<$'
+ \ ]
+ redraw!
+ for i in range(1, 5)
+ call cursor(i, 1)
+ call assert_equal([expected[i - 1]], ScreenLines(i, virtcol('$')))
+ endfor
+
+ set listchars-=trail:<
+ let expected = [
+ \ '>-------aa>-----$',
+ \ '..bb>---..$',
+ \ '...cccc>.$',
+ \ 'dd........ee..>-$',
+ \ '.$'
+ \ ]
+ redraw!
+ for i in range(1, 5)
+ call cursor(i, 1)
+ call assert_equal([expected[i - 1]], ScreenLines(i, virtcol('$')))
+ endfor
+
+ set listchars+=trail:<
+ set nolist
+ normal ggdG
+ call append(0, [
+ \ ' fff ',
+ \ ' gg ',
+ \ ' h ',
+ \ 'iii ',
+ \ ])
+ let l = split(execute("%list"), "\n")
+ call assert_equal([
+ \ '..fff>--<<$',
+ \ '>-------gg>-----$',
+ \ '.....h>-$',
+ \ 'iii<<<<><<$', '$'], l)
+
+ enew!
+ set listchars& ff&
+endfunc
diff --git a/src/nvim/testdir/test_listdict.vim b/src/nvim/testdir/test_listdict.vim
new file mode 100644
index 0000000000..999d4dbd4a
--- /dev/null
+++ b/src/nvim/testdir/test_listdict.vim
@@ -0,0 +1,651 @@
+" Tests for the List and Dict types
+
+func TearDown()
+ " Run garbage collection after every test
+ call test_garbagecollect_now()
+endfunc
+
+" Tests for List type
+
+" List creation
+func Test_list_create()
+ " Creating List directly with different types
+ let l = [1, 'as''d', [1, 2, function("strlen")], {'a': 1},]
+ call assert_equal("[1, 'as''d', [1, 2, function('strlen')], {'a': 1}]", string(l))
+ call assert_equal({'a' : 1}, l[-1])
+ call assert_equal(1, l[-4])
+ let x = 10
+ try
+ let x = l[-5]
+ catch
+ call assert_match('E684:', v:exception)
+ endtry
+ call assert_equal(10, x)
+endfunc
+
+" List slices
+func Test_list_slice()
+ let l = [1, 'as''d', [1, 2, function("strlen")], {'a': 1},]
+ call assert_equal([1, 'as''d', [1, 2, function('strlen')], {'a': 1}], l[:])
+ call assert_equal(['as''d', [1, 2, function('strlen')], {'a': 1}], l[1:])
+ call assert_equal([1, 'as''d', [1, 2, function('strlen')]], l[:-2])
+ call assert_equal([1, 'as''d', [1, 2, function('strlen')], {'a': 1}], l[0:8])
+ call assert_equal([], l[8:-1])
+endfunc
+
+" List identity
+func Test_list_identity()
+ let l = [1, 'as''d', [1, 2, function("strlen")], {'a': 1},]
+ let ll = l
+ let lx = copy(l)
+ call assert_true(l == ll)
+ call assert_false(l isnot ll)
+ call assert_true(l is ll)
+ call assert_true(l == lx)
+ call assert_false(l is lx)
+ call assert_true(l isnot lx)
+endfunc
+
+" removing items with :unlet
+func Test_list_unlet()
+ let l = [1, 'as''d', [1, 2, function("strlen")], {'a': 1},]
+ unlet l[2]
+ call assert_equal([1, 'as''d', {'a': 1}], l)
+ let l = range(8)
+ unlet l[:3]
+ unlet l[1:]
+ call assert_equal([4], l)
+
+ " removing items out of range: silently skip items that don't exist
+ let l = [0, 1, 2, 3]
+ call assert_fails('unlet l[2:1]', 'E684')
+ let l = [0, 1, 2, 3]
+ unlet l[2:2]
+ call assert_equal([0, 1, 3], l)
+ let l = [0, 1, 2, 3]
+ unlet l[2:3]
+ call assert_equal([0, 1], l)
+ let l = [0, 1, 2, 3]
+ unlet l[2:4]
+ call assert_equal([0, 1], l)
+ let l = [0, 1, 2, 3]
+ unlet l[2:5]
+ call assert_equal([0, 1], l)
+ let l = [0, 1, 2, 3]
+ call assert_fails('unlet l[-1:2]', 'E684')
+ let l = [0, 1, 2, 3]
+ unlet l[-2:2]
+ call assert_equal([0, 1, 3], l)
+ let l = [0, 1, 2, 3]
+ unlet l[-3:2]
+ call assert_equal([0, 3], l)
+ let l = [0, 1, 2, 3]
+ unlet l[-4:2]
+ call assert_equal([3], l)
+ let l = [0, 1, 2, 3]
+ unlet l[-5:2]
+ call assert_equal([3], l)
+ let l = [0, 1, 2, 3]
+ unlet l[-6:2]
+ call assert_equal([3], l)
+endfunc
+
+" assignment to a list
+func Test_list_assign()
+ let l = [0, 1, 2, 3]
+ let [va, vb] = l[2:3]
+ call assert_equal([2, 3], [va, vb])
+ call assert_fails('let [va, vb] = l', 'E687')
+ call assert_fails('let [va, vb] = l[1:1]', 'E688')
+endfunc
+
+" test for range assign
+func Test_list_range_assign()
+ let l = [0]
+ let l[:] = [1, 2]
+ call assert_equal([1, 2], l)
+endfunc
+
+" Test removing items in list
+func Test_list_func_remove()
+ " Test removing 1 element
+ let l = [1, 2, 3, 4]
+ call assert_equal(1, remove(l, 0))
+ call assert_equal([2, 3, 4], l)
+
+ let l = [1, 2, 3, 4]
+ call assert_equal(2, remove(l, 1))
+ call assert_equal([1, 3, 4], l)
+
+ let l = [1, 2, 3, 4]
+ call assert_equal(4, remove(l, -1))
+ call assert_equal([1, 2, 3], l)
+
+ " Test removing range of element(s)
+ let l = [1, 2, 3, 4]
+ call assert_equal([3], remove(l, 2, 2))
+ call assert_equal([1, 2, 4], l)
+
+ let l = [1, 2, 3, 4]
+ call assert_equal([2, 3], remove(l, 1, 2))
+ call assert_equal([1, 4], l)
+
+ let l = [1, 2, 3, 4]
+ call assert_equal([2, 3], remove(l, -3, -2))
+ call assert_equal([1, 4], l)
+
+ " Test invalid cases
+ let l = [1, 2, 3, 4]
+ call assert_fails("call remove(l, 5)", 'E684:')
+ call assert_fails("call remove(l, 1, 5)", 'E684:')
+ call assert_fails("call remove(l, 3, 2)", 'E16:')
+ call assert_fails("call remove(1, 0)", 'E712:')
+ call assert_fails("call remove(l, l)", 'E745:')
+endfunc
+
+" Tests for Dictionary type
+
+func Test_dict()
+ " Creating Dictionary directly with different types
+ let d = {001: 'asd', 'b': [1, 2, function('strlen')], -1: {'a': 1},}
+ call assert_equal("{'1': 'asd', 'b': [1, 2, function('strlen')], '-1': {'a': 1}}", string(d))
+ call assert_equal('asd', d.1)
+ call assert_equal(['-1', '1', 'b'], sort(keys(d)))
+ call assert_equal(['asd', [1, 2, function('strlen')], {'a': 1}], values(d))
+ let v = []
+ for [key, val] in items(d)
+ call extend(v, [key, val])
+ unlet key val
+ endfor
+ call assert_equal(['1','asd','b',[1, 2, function('strlen')],'-1',{'a': 1}], v)
+
+ call extend(d, {3:33, 1:99})
+ call extend(d, {'b':'bbb', 'c':'ccc'}, "keep")
+ call assert_fails("call extend(d, {3:333,4:444}, 'error')", 'E737')
+ call assert_equal({'c': 'ccc', '1': 99, 'b': [1, 2, function('strlen')], '3': 33, '-1': {'a': 1}}, d)
+ call filter(d, 'v:key =~ ''[ac391]''')
+ call assert_equal({'c': 'ccc', '1': 99, '3': 33, '-1': {'a': 1}}, d)
+endfunc
+
+" Dictionary identity
+func Test_dict_identity()
+ let d = {001: 'asd', 'b': [1, 2, function('strlen')], -1: {'a': 1},}
+ let dd = d
+ let dx = copy(d)
+ call assert_true(d == dd)
+ call assert_false(d isnot dd)
+ call assert_true(d is dd)
+ call assert_true(d == dx)
+ call assert_false(d is dx)
+ call assert_true(d isnot dx)
+endfunc
+
+" removing items with :unlet
+func Test_dict_unlet()
+ let d = {'b':'bbb', '1': 99, '3': 33, '-1': {'a': 1}}
+ unlet d.b
+ unlet d[-1]
+ call assert_equal({'1': 99, '3': 33}, d)
+endfunc
+
+" manipulating a big Dictionary (hashtable.c has a border of 1000 entries)
+func Test_dict_big()
+ let d = {}
+ for i in range(1500)
+ let d[i] = 3000 - i
+ endfor
+ call assert_equal([3000, 2900, 2001, 1600, 1501], [d[0], d[100], d[999], d[1400], d[1499]])
+ let str = ''
+ try
+ let n = d[1500]
+ catch
+ let str=substitute(v:exception, '\v(.{14}).*( \d{4}).*', '\1\2', '')
+ endtry
+ call assert_equal('Vim(let):E716: 1500', str)
+
+ " lookup each items
+ for i in range(1500)
+ call assert_equal(3000 - i, d[i])
+ endfor
+ let i += 1
+
+ " delete even items
+ while i >= 2
+ let i -= 2
+ unlet d[i]
+ endwhile
+ call assert_equal('NONE', get(d, 1500 - 100, 'NONE'))
+ call assert_equal(2999, d[1])
+
+ " delete odd items, checking value, one intentionally wrong
+ let d[33] = 999
+ let i = 1
+ while i < 1500
+ if i != 33
+ call assert_equal(3000 - i, d[i])
+ else
+ call assert_equal(999, d[i])
+ endif
+ unlet d[i]
+ let i += 2
+ endwhile
+ call assert_equal({}, d)
+ unlet d
+endfunc
+
+" Dictionary function
+func Test_dict_func()
+ let d = {}
+ func d.func(a) dict
+ return a:a . len(self.data)
+ endfunc
+ let d.data = [1,2,3]
+ call assert_equal('len: 3', d.func('len: '))
+ let x = d.func('again: ')
+ call assert_equal('again: 3', x)
+ let Fn = d.func
+ call assert_equal('xxx3', Fn('xxx'))
+endfunc
+
+" Function in script-local List or Dict
+func Test_script_local_dict_func()
+ let g:dict = {}
+ function g:dict.func() dict
+ return 'g:dict.func' . self.foo[1] . self.foo[0]('asdf')
+ endfunc
+ let g:dict.foo = ['-', 2, 3]
+ call insert(g:dict.foo, function('strlen'))
+ call assert_equal('g:dict.func-4', g:dict.func())
+ unlet g:dict
+endfunc
+
+" Test removing items in la dictionary
+func Test_dict_func_remove()
+ let d = {1:'a', 2:'b', 3:'c'}
+ call assert_equal('b', remove(d, 2))
+ call assert_equal({1:'a', 3:'c'}, d)
+
+ call assert_fails("call remove(d, 1, 2)", 'E118:')
+ call assert_fails("call remove(d, 'a')", 'E716:')
+ call assert_fails("call remove(d, [])", 'E730:')
+endfunc
+
+" Nasty: remove func from Dict that's being called (works)
+func Test_dict_func_remove_in_use()
+ let d = {1:1}
+ func d.func(a)
+ return "a:" . a:a
+ endfunc
+ let expected = 'a:' . string(get(d, 'func'))
+ call assert_equal(expected, d.func(string(remove(d, 'func'))))
+endfunc
+
+" Nasty: deepcopy() dict that refers to itself (fails when noref used)
+func Test_dict_deepcopy()
+ let d = {1:1, 2:2}
+ let l = [4, d, 6]
+ let d[3] = l
+ let dc = deepcopy(d)
+ call assert_fails('call deepcopy(d, 1)', 'E698')
+ let l2 = [0, l, l, 3]
+ let l[1] = l2
+ let l3 = deepcopy(l2)
+ call assert_true(l3[1] is l3[2])
+endfunc
+
+" Locked variables
+func Test_list_locked_var()
+ let expected = [
+ \ [['0000-000', 'ppppppp'],
+ \ ['0000-000', 'ppppppp'],
+ \ ['0000-000', 'ppppppp']],
+ \ [['1000-000', 'ppppppF'],
+ \ ['0000-000', 'ppppppp'],
+ \ ['0000-000', 'ppppppp']],
+ \ [['1100-100', 'ppFppFF'],
+ \ ['0000-000', 'ppppppp'],
+ \ ['0000-000', 'ppppppp']],
+ \ [['1110-110', 'pFFpFFF'],
+ \ ['0010-010', 'pFppFpp'],
+ \ ['0000-000', 'ppppppp']],
+ \ [['1111-111', 'FFFFFFF'],
+ \ ['0011-011', 'FFpFFpp'],
+ \ ['0000-000', 'ppppppp']]
+ \ ]
+ for depth in range(5)
+ for u in range(3)
+ unlet! l
+ let l = [0, [1, [2, 3]], {4: 5, 6: {7: 8}}]
+ exe "lockvar " . depth . " l"
+ if u == 1
+ exe "unlockvar l"
+ elseif u == 2
+ exe "unlockvar " . depth . " l"
+ endif
+ let ps = islocked("l").islocked("l[1]").islocked("l[1][1]").islocked("l[1][1][0]").'-'.islocked("l[2]").islocked("l[2]['6']").islocked("l[2]['6'][7]")
+ call assert_equal(expected[depth][u][0], ps)
+ let ps = ''
+ try
+ let l[1][1][0] = 99
+ let ps .= 'p'
+ catch
+ let ps .= 'F'
+ endtry
+ try
+ let l[1][1] = [99]
+ let ps .= 'p'
+ catch
+ let ps .= 'F'
+ endtry
+ try
+ let l[1] = [99]
+ let ps .= 'p'
+ catch
+ let ps .= 'F'
+ endtry
+ try
+ let l[2]['6'][7] = 99
+ let ps .= 'p'
+ catch
+ let ps .= 'F'
+ endtry
+ try
+ let l[2][6] = {99: 99}
+ let ps .= 'p'
+ catch
+ let ps .= 'F'
+ endtry
+ try
+ let l[2] = {99: 99}
+ let ps .= 'p'
+ catch
+ let ps .= 'F'
+ endtry
+ try
+ let l = [99]
+ let ps .= 'p'
+ catch
+ let ps .= 'F'
+ endtry
+ call assert_equal(expected[depth][u][1], ps)
+ endfor
+ endfor
+endfunc
+
+" Unletting locked variables
+func Test_list_locked_var_unlet()
+ let expected = [
+ \ [['0000-000', 'ppppppp'],
+ \ ['0000-000', 'ppppppp'],
+ \ ['0000-000', 'ppppppp']],
+ \ [['1000-000', 'ppFppFp'],
+ \ ['0000-000', 'ppppppp'],
+ \ ['0000-000', 'ppppppp']],
+ \ [['1100-100', 'pFFpFFp'],
+ \ ['0000-000', 'ppppppp'],
+ \ ['0000-000', 'ppppppp']],
+ \ [['1110-110', 'FFFFFFp'],
+ \ ['0010-010', 'FppFppp'],
+ \ ['0000-000', 'ppppppp']],
+ \ [['1111-111', 'FFFFFFp'],
+ \ ['0011-011', 'FppFppp'],
+ \ ['0000-000', 'ppppppp']]
+ \ ]
+
+ for depth in range(5)
+ for u in range(3)
+ unlet! l
+ let l = [0, [1, [2, 3]], {4: 5, 6: {7: 8}}]
+ exe "lockvar " . depth . " l"
+ if u == 1
+ exe "unlockvar l"
+ elseif u == 2
+ exe "unlockvar " . depth . " l"
+ endif
+ let ps = islocked("l").islocked("l[1]").islocked("l[1][1]").islocked("l[1][1][0]").'-'.islocked("l[2]").islocked("l[2]['6']").islocked("l[2]['6'][7]")
+ call assert_equal(expected[depth][u][0], ps)
+ let ps = ''
+ try
+ unlet l[2]['6'][7]
+ let ps .= 'p'
+ catch
+ let ps .= 'F'
+ endtry
+ try
+ unlet l[2][6]
+ let ps .= 'p'
+ catch
+ let ps .= 'F'
+ endtry
+ try
+ unlet l[2]
+ let ps .= 'p'
+ catch
+ let ps .= 'F'
+ endtry
+ try
+ unlet l[1][1][0]
+ let ps .= 'p'
+ catch
+ let ps .= 'F'
+ endtry
+ try
+ unlet l[1][1]
+ let ps .= 'p'
+ catch
+ let ps .= 'F'
+ endtry
+ try
+ unlet l[1]
+ let ps .= 'p'
+ catch
+ let ps .= 'F'
+ endtry
+ try
+ unlet l
+ let ps .= 'p'
+ catch
+ let ps .= 'F'
+ endtry
+ call assert_equal(expected[depth][u][1], ps)
+ endfor
+ endfor
+endfunc
+
+" Locked variables and :unlet or list / dict functions
+
+" No :unlet after lock on dict:
+func Test_dict_lock_unlet()
+ unlet! d
+ let d = {'a': 99, 'b': 100}
+ lockvar 1 d
+ call assert_fails('unlet d.a', 'E741')
+endfunc
+
+" unlet after lock on dict item
+func Test_dict_item_lock_unlet()
+ unlet! d
+ let d = {'a': 99, 'b': 100}
+ lockvar d.a
+ unlet d.a
+ call assert_equal({'b' : 100}, d)
+endfunc
+
+" filter() after lock on dict item
+func Test_dict_lock_filter()
+ unlet! d
+ let d = {'a': 99, 'b': 100}
+ lockvar d.a
+ call filter(d, 'v:key != "a"')
+ call assert_equal({'b' : 100}, d)
+endfunc
+
+" map() after lock on dict
+func Test_dict_lock_map()
+ unlet! d
+ let d = {'a': 99, 'b': 100}
+ lockvar 1 d
+ call map(d, 'v:val + 200')
+ call assert_equal({'a' : 299, 'b' : 300}, d)
+endfunc
+
+" No extend() after lock on dict item
+func Test_dict_lock_extend()
+ unlet! d
+ let d = {'a': 99, 'b': 100}
+ lockvar d.a
+ call assert_fails("call extend(d, {'a' : 123})", 'E741')
+ call assert_equal({'a': 99, 'b': 100}, d)
+endfunc
+
+" No remove() of write-protected scope-level variable
+func! Tfunc(this_is_a_long_parameter_name)
+ call assert_fails("call remove(a:, 'this_is_a_long_parameter_name')", 'E795')
+endfun
+func Test_dict_scope_var_remove()
+ call Tfunc('testval')
+endfunc
+
+" No extend() of write-protected scope-level variable
+func! Tfunc(this_is_a_long_parameter_name)
+ call assert_fails("call extend(a:, {'this_is_a_long_parameter_name': 1234})", 'E742')
+endfunc
+func Test_dict_scope_var_extend()
+ call Tfunc('testval')
+endfunc
+
+" No :unlet of variable in locked scope
+func Test_lock_var_unlet()
+ let b:testvar = 123
+ lockvar 1 b:
+ call assert_fails('unlet b:testvar', 'E741:')
+ unlockvar 1 b:
+ unlet! b:testvar
+endfunc
+
+" No :let += of locked list variable
+func Test_let_lock_list()
+ let l = ['a', 'b', 3]
+ lockvar 1 l
+ call assert_fails("let l += ['x']", 'E741:')
+ call assert_equal(['a', 'b', 3], l)
+
+ unlet l
+ let l = [1, 2, 3, 4]
+ lockvar! l
+ call assert_equal([1, 2, 3, 4], l)
+ unlockvar l[1]
+ call assert_fails('unlet l[0:1]', 'E741:')
+ call assert_equal([1, 2, 3, 4], l)
+ call assert_fails('unlet l[1:2]', 'E741:')
+ call assert_equal([1, 2, 3, 4], l)
+ unlockvar l[1]
+ call assert_fails('let l[0:1] = [0, 1]', 'E741:')
+ call assert_equal([1, 2, 3, 4], l)
+ call assert_fails('let l[1:2] = [0, 1]', 'E741:')
+ call assert_equal([1, 2, 3, 4], l)
+ unlet l
+endfunc
+
+" lockvar/islocked() triggering script autoloading
+func Test_lockvar_script_autoload()
+ let old_rtp = &rtp
+ set rtp+=./sautest
+ lockvar g:footest#x
+ unlockvar g:footest#x
+ call assert_equal(-1, islocked('g:footest#x'))
+ call assert_equal(0, exists('g:footest#x'))
+ call assert_equal(1, g:footest#x)
+ let &rtp = old_rtp
+endfunc
+
+" a:000 function argument test
+func s:arg_list_test(...)
+ call assert_fails('let a:000 = [1, 2]', 'E46:')
+ call assert_fails('let a:000[0] = 9', 'E742:')
+ call assert_fails('let a:000[2] = [9, 10]', 'E742:')
+ call assert_fails('let a:000[3] = {9 : 10}', 'E742:')
+
+ " now the tests that should pass
+ let a:000[2][1] = 9
+ call extend(a:000[2], [5, 6])
+ let a:000[3][5] = 8
+ let a:000[3]['a'] = 12
+ call assert_equal([1, 2, [3, 9, 5, 6], {'a': 12, '5': 8}], a:000)
+endfunc
+
+func Test_func_arg_list()
+ call s:arg_list_test(1, 2, [3, 4], {5: 6})
+endfunc
+
+" Tests for reverse(), sort(), uniq()
+func Test_reverse_sort_uniq()
+ let l = ['-0', 'A11', 2, 2, 'xaaa', 4, 'foo', 'foo6', 'foo', [0, 1, 2], 'x8', [0, 1, 2], 1.5]
+ call assert_equal(['-0', 'A11', 2, 'xaaa', 4, 'foo', 'foo6', 'foo', [0, 1, 2], 'x8', [0, 1, 2], 1.5], uniq(copy(l)))
+ call assert_equal([1.5, [0, 1, 2], 'x8', [0, 1, 2], 'foo', 'foo6', 'foo', 4, 'xaaa', 2, 2, 'A11', '-0'], reverse(l))
+ call assert_equal([1.5, [0, 1, 2], 'x8', [0, 1, 2], 'foo', 'foo6', 'foo', 4, 'xaaa', 2, 2, 'A11', '-0'], reverse(reverse(l)))
+ call assert_equal(['-0', 'A11', 'foo', 'foo', 'foo6', 'x8', 'xaaa', 1.5, 2, 2, 4, [0, 1, 2], [0, 1, 2]], sort(l))
+ call assert_equal([[0, 1, 2], [0, 1, 2], 4, 2, 2, 1.5, 'xaaa', 'x8', 'foo6', 'foo', 'foo', 'A11', '-0'], reverse(sort(l)))
+ call assert_equal(['-0', 'A11', 'foo', 'foo', 'foo6', 'x8', 'xaaa', 1.5, 2, 2, 4, [0, 1, 2], [0, 1, 2]], sort(reverse(sort(l))))
+ call assert_equal(['-0', 'A11', 'foo', 'foo6', 'x8', 'xaaa', 1.5, 2, 4, [0, 1, 2]], uniq(sort(l)))
+
+ let l=[7, 9, 'one', 18, 12, 22, 'two', 10.0e-16, -1, 'three', 0xff, 0.22, 'four']
+ call assert_equal([-1, 'one', 'two', 'three', 'four', 1.0e-15, 0.22, 7, 9, 12, 18, 22, 255], sort(copy(l), 'n'))
+
+ let l=[7, 9, 18, 12, 22, 10.0e-16, -1, 0xff, 0, -0, 0.22, 'bar', 'BAR', 'Bar', 'Foo', 'FOO', 'foo', 'FOOBAR', {}, []]
+ call assert_equal(['bar', 'BAR', 'Bar', 'Foo', 'FOO', 'foo', 'FOOBAR', -1, 0, 0, 0.22, 1.0e-15, 12, 18, 22, 255, 7, 9, [], {}], sort(copy(l), 1))
+ call assert_equal(['bar', 'BAR', 'Bar', 'Foo', 'FOO', 'foo', 'FOOBAR', -1, 0, 0, 0.22, 1.0e-15, 12, 18, 22, 255, 7, 9, [], {}], sort(copy(l), 'i'))
+ call assert_equal(['BAR', 'Bar', 'FOO', 'FOOBAR', 'Foo', 'bar', 'foo', -1, 0, 0, 0.22, 1.0e-15, 12, 18, 22, 255, 7, 9, [], {}], sort(copy(l)))
+endfunc
+
+" splitting a string to a List
+func Test_str_split()
+ call assert_equal(['aa', 'bb'], split(' aa bb '))
+ call assert_equal(['aa', 'bb'], split(' aa bb ', '\W\+', 0))
+ call assert_equal(['', 'aa', 'bb', ''], split(' aa bb ', '\W\+', 1))
+ call assert_equal(['', '', 'aa', '', 'bb', '', ''], split(' aa bb ', '\W', 1))
+ call assert_equal(['aa', '', 'bb'], split(':aa::bb:', ':', 0))
+ call assert_equal(['', 'aa', '', 'bb', ''], split(':aa::bb:', ':', 1))
+ call assert_equal(['aa', '', 'bb', 'cc', ''], split('aa,,bb, cc,', ',\s*', 1))
+ call assert_equal(['a', 'b', 'c'], split('abc', '\zs'))
+ call assert_equal(['', 'a', '', 'b', '', 'c', ''], split('abc', '\zs', 1))
+endfunc
+
+" compare recursively linked list and dict
+func Test_listdict_compare()
+ let l = [1, 2, 3, 4]
+ let d = {'1': 1, '2': l, '3': 3}
+ let l[1] = d
+ call assert_true(l == l)
+ call assert_true(d == d)
+ call assert_false(l != deepcopy(l))
+ call assert_false(d != deepcopy(d))
+endfunc
+
+ " compare complex recursively linked list and dict
+func Test_listdict_compare_complex()
+ let l = []
+ call add(l, l)
+ let dict4 = {"l": l}
+ call add(dict4.l, dict4)
+ let lcopy = deepcopy(l)
+ let dict4copy = deepcopy(dict4)
+ call assert_true(l == lcopy)
+ call assert_true(dict4 == dict4copy)
+endfunc
+
+func Test_listdict_extend()
+ " Pass the same List to extend()
+ let l = [1, 2, 3, 4, 5]
+ call extend(l, l)
+ call assert_equal([1, 2, 3, 4, 5, 1, 2, 3, 4, 5], l)
+
+ " Pass the same Dict to extend()
+ let d = { 'a': {'b': 'B'}}
+ call extend(d, d)
+ call assert_equal({'a': {'b': 'B'}}, d)
+
+ " Pass the same Dict to extend() with "error"
+ call assert_fails("call extend(d, d, 'error')", 'E737:')
+ call assert_equal({'a': {'b': 'B'}}, d)
+endfunc
diff --git a/src/nvim/testdir/test_listlbr.vim b/src/nvim/testdir/test_listlbr.vim
new file mode 100644
index 0000000000..d28dbc444c
--- /dev/null
+++ b/src/nvim/testdir/test_listlbr.vim
@@ -0,0 +1,238 @@
+" Test for linebreak and list option (non-utf8)
+
+" Nvim does not allow setting 'encoding', so skip this test.
+finish
+
+set encoding=latin1
+scriptencoding latin1
+
+if !exists("+linebreak") || !has("conceal")
+ finish
+endif
+
+source view_util.vim
+
+function s:screen_lines(lnum, width) abort
+ return ScreenLines(a:lnum, a:width)
+endfunction
+
+function! s:compare_lines(expect, actual)
+ call assert_equal(join(a:expect, "\n"), join(a:actual, "\n"))
+endfunction
+
+function s:test_windows(...)
+ call NewWindow(10, 20)
+ setl ts=8 sw=4 sts=4 linebreak sbr= wrap
+ exe get(a:000, 0, '')
+endfunction
+
+function s:close_windows(...)
+ call CloseWindow()
+ exe get(a:000, 0, '')
+endfunction
+
+func Test_set_linebreak()
+ call s:test_windows('setl ts=4 sbr=+')
+ call setline(1, "\tabcdef hijklmn\tpqrstuvwxyz_1060ABCDEFGHIJKLMNOP ")
+ let lines = s:screen_lines([1, 4], winwidth(0))
+ let expect = [
+\ " abcdef ",
+\ "+hijklmn ",
+\ "+pqrstuvwxyz_1060ABC",
+\ "+DEFGHIJKLMNOP ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_linebreak_with_list()
+ call s:test_windows('setl ts=4 sbr=+ list listchars=')
+ call setline(1, "\tabcdef hijklmn\tpqrstuvwxyz_1060ABCDEFGHIJKLMNOP ")
+ let lines = s:screen_lines([1, 4], winwidth(0))
+ let expect = [
+\ "^Iabcdef hijklmn^I ",
+\ "+pqrstuvwxyz_1060ABC",
+\ "+DEFGHIJKLMNOP ",
+\ "~ ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_linebreak_with_nolist()
+ call s:test_windows('setl ts=4 sbr=+ nolist')
+ call setline(1, "\tabcdef hijklmn\tpqrstuvwxyz_1060ABCDEFGHIJKLMNOP ")
+ let lines = s:screen_lines([1, 4], winwidth(0))
+ let expect = [
+\ " abcdef ",
+\ "+hijklmn ",
+\ "+pqrstuvwxyz_1060ABC",
+\ "+DEFGHIJKLMNOP ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_should_break()
+ call s:test_windows('setl sbr=+ nolist')
+ call setline(1, "1\t" . repeat('a', winwidth(0)-2))
+ let lines = s:screen_lines([1, 4], winwidth(0))
+ let expect = [
+\ "1 ",
+\ "+aaaaaaaaaaaaaaaaaa ",
+\ "~ ",
+\ "~ ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_linebreak_with_conceal()
+ call s:test_windows('setl cpo&vim sbr=+ list conceallevel=2 concealcursor=nv listchars=tab:ab')
+ call setline(1, "_S_\t bla")
+ syn match ConcealVar contained /_/ conceal
+ syn match All /.*/ contains=ConcealVar
+ let lines = s:screen_lines([1, 4], winwidth(0))
+ let expect = [
+\ "Sabbbbbb bla ",
+\ "~ ",
+\ "~ ",
+\ "~ ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_virtual_block()
+ call s:test_windows('setl sbr=+')
+ call setline(1, [
+\ "REMOVE: this not",
+\ "REMOVE: aaaaaaaaaaaaa",
+\ ])
+ exe "norm! 1/^REMOVE:"
+ exe "norm! 0\<C-V>jf x"
+ $put
+ let lines = s:screen_lines([1, 4], winwidth(0))
+ let expect = [
+\ "this not ",
+\ "aaaaaaaaaaaaa ",
+\ "REMOVE: ",
+\ "REMOVE: ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_virtual_block_and_vbA()
+ call s:test_windows()
+ call setline(1, "long line: " . repeat("foobar ", 40) . "TARGET at end")
+ exe "norm! $3B\<C-v>eAx\<Esc>"
+ let lines = s:screen_lines([1, 10], winwidth(0))
+ let expect = [
+\ "foobar foobar ",
+\ "foobar foobar ",
+\ "foobar foobar ",
+\ "foobar foobar ",
+\ "foobar foobar ",
+\ "foobar foobar ",
+\ "foobar foobar ",
+\ "foobar foobar ",
+\ "foobar foobar ",
+\ "foobar TARGETx at ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_virtual_char_and_block()
+ call s:test_windows()
+ call setline(1, "1111-1111-1111-11-1111-1111-1111")
+ exe "norm! 0f-lv3lc2222\<Esc>bgj."
+ let lines = s:screen_lines([1, 2], winwidth(0))
+ let expect = [
+\ "1111-2222-1111-11- ",
+\ "1111-2222-1111 ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_undo_after_block_visual()
+ call s:test_windows()
+ call setline(1, ["aaa", "aaa", "a"])
+ exe "norm! gg\<C-V>2j~e."
+ let lines = s:screen_lines([1, 3], winwidth(0))
+ let expect = [
+\ "AaA ",
+\ "AaA ",
+\ "A ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_norm_after_block_visual()
+ call s:test_windows()
+ call setline(1, ["abcd{ef", "ghijklm", "no}pgrs"])
+ exe "norm! ggf{\<C-V>\<C-V>c%"
+ let lines = s:screen_lines([1, 3], winwidth(0))
+ let expect = [
+\ "abcdpgrs ",
+\ "~ ",
+\ "~ ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_block_replace_after_wrapping()
+ call s:test_windows()
+ call setline(1, repeat("a", 150))
+ exe "norm! 0yypk147|\<C-V>jr0"
+ call assert_equal(repeat("a", 146) . "0aaa", getline(1))
+ call assert_equal(repeat("a", 146) . "0aaa", getline(2))
+ let lines = s:screen_lines([1, 10], winwidth(0))
+ let expect = [
+\ "aaaaaaaaaaaaaaaaaaaa",
+\ "aaaaaaaaaaaaaaaaaaaa",
+\ "aaaaaaaaaaaaaaaaaaaa",
+\ "aaaaaaaaaaaaaaaaaaaa",
+\ "aaaaaaaaaaaaaaaaaaaa",
+\ "aaaaaaaaaaaaaaaaaaaa",
+\ "aaaaaaaaaaaaaaaaaaaa",
+\ "aaaaaa0aaa ",
+\ "@ ",
+\ "@ ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_list_with_listchars()
+ call s:test_windows('setl list listchars=space:_,trail:-,tab:>-,eol:$')
+ call setline(1, "a aaaaaaaaaaaaaaaaaaaaaa\ta ")
+ let lines = s:screen_lines([1, 3], winwidth(0))
+ let expect = [
+\ "a_ ",
+\ "aaaaaaaaaaaaaaaaaaaa",
+\ "aa>-----a-$ ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_list_with_tab_and_skipping_first_chars()
+ call s:test_windows('setl list listchars=tab:>- ts=70 nowrap')
+ call setline(1, ["iiiiiiiiiiiiiiii\taaaaaaaaaaaaaaaaaa", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii\taaaaaaaaaaaaaaaaaa", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii\taaaaaaaaaaaaaaaaaa", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii\taaaaaaaaaaaaaaaaaa"])
+ call cursor(4,64)
+ norm! 2zl
+ let lines = s:screen_lines([1, 4], winwidth(0))
+ let expect = [
+\ "---------------aaaaa",
+\ "---------------aaaaa",
+\ "---------------aaaaa",
+\ "iiiiiiiii>-----aaaaa",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfu
diff --git a/src/nvim/testdir/test_listlbr_utf8.vim b/src/nvim/testdir/test_listlbr_utf8.vim
new file mode 100644
index 0000000000..b648a3361b
--- /dev/null
+++ b/src/nvim/testdir/test_listlbr_utf8.vim
@@ -0,0 +1,271 @@
+" Test for linebreak and list option in utf-8 mode
+
+set encoding=utf-8
+scriptencoding utf-8
+
+if !exists("+linebreak") || !has("conceal") || !has("signs")
+ finish
+endif
+
+source view_util.vim
+
+function s:screen_lines(lnum, width) abort
+ return ScreenLines(a:lnum, a:width)
+endfunction
+
+function! s:compare_lines(expect, actual)
+ call assert_equal(a:expect, a:actual)
+endfunction
+
+function s:screen_attr(lnum, chars, ...) abort
+ let line = getline(a:lnum)
+ let attr = []
+ let prefix = get(a:000, 0, 0)
+ for i in range(a:chars[0], a:chars[1])
+ let scol = strdisplaywidth(strcharpart(line, 0, i-1)) + 1
+ let attr += [screenattr(a:lnum, scol + prefix)]
+ endfor
+ return attr
+endfunction
+
+function s:test_windows(...)
+ call NewWindow(10, 20)
+ setl ts=4 sw=4 sts=4 linebreak sbr=+ wrap
+ exe get(a:000, 0, '')
+endfunction
+
+function s:close_windows(...)
+ call CloseWindow()
+ exe get(a:000, 0, '')
+endfunction
+
+func Test_linebreak_with_fancy_listchars()
+ call s:test_windows("setl list listchars=nbsp:\u2423,tab:\u2595\u2014,trail:\u02d1,eol:\ub6")
+ call setline(1, "\tabcdef hijklmn\tpqrstuvwxyz\u00a01060ABCDEFGHIJKLMNOP ")
+ redraw!
+ let lines = s:screen_lines([1, 4], winwidth(0))
+ let expect = [
+\ "โ–•โ€”โ€”โ€”abcdef ",
+\ "+hijklmnโ–•โ€”โ€”โ€” ",
+\ "+pqrstuvwxyzโฃ1060ABC",
+\ "+DEFGHIJKLMNOPห‘ยถ ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_nolinebreak_with_list()
+ call s:test_windows("setl nolinebreak list listchars=nbsp:\u2423,tab:\u2595\u2014,trail:\u02d1,eol:\ub6")
+ call setline(1, "\tabcdef hijklmn\tpqrstuvwxyz\u00a01060ABCDEFGHIJKLMNOP ")
+ redraw!
+ let lines = s:screen_lines([1, 4], winwidth(0))
+ let expect = [
+\ "โ–•โ€”โ€”โ€”abcdef hijklmnโ–•โ€”",
+\ "+pqrstuvwxyzโฃ1060ABC",
+\ "+DEFGHIJKLMNOPห‘ยถ ",
+\ "~ ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_linebreak_with_nolist()
+ call s:test_windows('setl nolist')
+ call setline(1, "\t*mask = nil;")
+ redraw!
+ let lines = s:screen_lines([1, 4], winwidth(0))
+ let expect = [
+\ " *mask = nil; ",
+\ "~ ",
+\ "~ ",
+\ "~ ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_list_and_concealing1()
+ call s:test_windows('setl list listchars=tab:>- cole=1')
+ call setline(1, [
+\ "#define ABCDE\t\t1",
+\ "#define ABCDEF\t\t1",
+\ "#define ABCDEFG\t\t1",
+\ "#define ABCDEFGH\t1",
+\ "#define MSG_MODE_FILE\t\t\t1",
+\ "#define MSG_MODE_CONSOLE\t\t2",
+\ "#define MSG_MODE_FILE_AND_CONSOLE\t3",
+\ "#define MSG_MODE_FILE_THEN_CONSOLE\t4",
+\ ])
+ vert resize 40
+ syn match Conceal conceal cchar=>'AB\|MSG_MODE'
+ redraw!
+ let lines = s:screen_lines([1, 7], winwidth(0))
+ let expect = [
+\ "#define ABCDE>-->---1 ",
+\ "#define >CDEF>-->---1 ",
+\ "#define >CDEFG>->---1 ",
+\ "#define >CDEFGH>----1 ",
+\ "#define >_FILE>--------->--->---1 ",
+\ "#define >_CONSOLE>---------->---2 ",
+\ "#define >_FILE_AND_CONSOLE>---------3 ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_list_and_concealing2()
+ call s:test_windows('setl nowrap ts=2 list listchars=tab:>- cole=2 concealcursor=n')
+ call setline(1, "bbeeeeee\t\t;\tsome text")
+ vert resize 40
+ syn clear
+ syn match meaning /;\s*\zs.*/
+ syn match hasword /^\x\{8}/ contains=word
+ syn match word /\<\x\{8}\>/ contains=beginword,endword contained
+ syn match beginword /\<\x\x/ contained conceal
+ syn match endword /\x\{6}\>/ contained
+ hi meaning guibg=blue
+ hi beginword guibg=green
+ hi endword guibg=red
+ redraw!
+ let lines = s:screen_lines([1, 1], winwidth(0))
+ let expect = [
+\ "eeeeee>--->-;>some text ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_screenattr_for_comment()
+ call s:test_windows("setl ft=c ts=7 list listchars=nbsp:\u2423,tab:\u2595\u2014,trail:\u02d1,eol:\ub6")
+ call setline(1, " /*\t\t and some more */")
+ norm! gg0
+ syntax on
+ hi SpecialKey term=underline ctermfg=red guifg=red
+ redraw!
+ let line = getline(1)
+ let attr = s:screen_attr(1, [1, 6])
+ call assert_notequal(attr[0], attr[1])
+ call assert_notequal(attr[1], attr[3])
+ call assert_notequal(attr[3], attr[5])
+ call s:close_windows()
+endfunc
+
+func Test_visual_block_and_selection_exclusive()
+ call s:test_windows('setl selection=exclusive')
+ call setline(1, "long line: " . repeat("foobar ", 40) . "TARGETรƒ' at end")
+ exe "norm! $3B\<C-v>eAx\<Esc>"
+ let lines = s:screen_lines([1, 10], winwidth(0))
+ let expect = [
+\ "+foobar foobar ",
+\ "+foobar foobar ",
+\ "+foobar foobar ",
+\ "+foobar foobar ",
+\ "+foobar foobar ",
+\ "+foobar foobar ",
+\ "+foobar foobar ",
+\ "+foobar foobar ",
+\ "+foobar foobar ",
+\ "+foobar TARGETรƒx' ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_multibyte_sign_and_colorcolumn()
+ call s:test_windows("setl nolinebreak cc=3 list listchars=nbsp:\u2423,tab:\u2595\u2014,trail:\u02d1,eol:\ub6")
+ call setline(1, ["", "a b c", "a b c"])
+ exe "sign define foo text=\uff0b"
+ exe "sign place 1 name=foo line=2 buffer=" . bufnr('%')
+ redraw!
+ norm! ggj0
+ let signwidth = strdisplaywidth("\uff0b")
+ let attr1 = s:screen_attr(2, [1, 3], signwidth)
+ let attr2 = s:screen_attr(3, [1, 3], signwidth)
+ call assert_equal(attr1[0], attr2[0])
+ call assert_equal(attr1[1], attr2[1])
+ call assert_equal(attr1[2], attr2[2])
+ let lines = s:screen_lines([1, 3], winwidth(0))
+ let expect = [
+\ " ยถ ",
+\ "๏ผ‹a b cยถ ",
+\ " a b cยถ ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_colorcolumn_priority()
+ call s:test_windows('setl cc=4 cuc hls')
+ call setline(1, ["xxyy", ""])
+ norm! gg
+ exe "normal! /xxyy\<CR>"
+ norm! G
+ redraw!
+ let line_attr = s:screen_attr(1, [1, &cc])
+ " Search wins over CursorColumn
+ call assert_equal(line_attr[1], line_attr[0])
+ " Search wins over Colorcolumn
+ call assert_equal(line_attr[2], line_attr[3])
+ call s:close_windows('setl hls&vim')
+endfunc
+
+func Test_illegal_byte_and_breakat()
+ call s:test_windows("setl sbr= brk+=<")
+ vert resize 18
+ call setline(1, repeat("\x80", 6))
+ redraw!
+ let lines = s:screen_lines([1, 2], winwidth(0))
+ let expect = [
+\ "<80><80><80><80><8",
+\ "0><80> ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('setl brk&vim')
+endfunc
+
+func Test_multibyte_wrap_and_breakat()
+ call s:test_windows("setl sbr= brk+=>")
+ call setline(1, repeat('a', 17) . repeat('ใ‚', 2))
+ redraw!
+ let lines = s:screen_lines([1, 2], winwidth(0))
+ let expect = [
+\ "aaaaaaaaaaaaaaaaaใ‚>",
+\ "ใ‚ ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('setl brk&vim')
+endfunc
+
+func Test_chinese_char_on_wrap_column()
+ call s:test_windows("setl nolbr wrap sbr=")
+ syntax off
+ call setline(1, [
+\ 'aaaaaaaaaaaaaaaaaaaไธญ'.
+\ 'aaaaaaaaaaaaaaaaaไธญ'.
+\ 'aaaaaaaaaaaaaaaaaไธญ'.
+\ 'aaaaaaaaaaaaaaaaaไธญ'.
+\ 'aaaaaaaaaaaaaaaaaไธญ'.
+\ 'aaaaaaaaaaaaaaaaaไธญ'.
+\ 'aaaaaaaaaaaaaaaaaไธญ'.
+\ 'aaaaaaaaaaaaaaaaaไธญ'.
+\ 'aaaaaaaaaaaaaaaaaไธญ'.
+\ 'aaaaaaaaaaaaaaaaaไธญ'.
+\ 'hello'])
+ call cursor(1,1)
+ norm! $
+ redraw!
+ let expect=[
+\ 'ไธญaaaaaaaaaaaaaaaaa>',
+\ 'ไธญaaaaaaaaaaaaaaaaa>',
+\ 'ไธญaaaaaaaaaaaaaaaaa>',
+\ 'ไธญaaaaaaaaaaaaaaaaa>',
+\ 'ไธญaaaaaaaaaaaaaaaaa>',
+\ 'ไธญaaaaaaaaaaaaaaaaa>',
+\ 'ไธญaaaaaaaaaaaaaaaaa>',
+\ 'ไธญaaaaaaaaaaaaaaaaa>',
+\ 'ไธญaaaaaaaaaaaaaaaaa>',
+\ 'ไธญhello ']
+ let lines = s:screen_lines([1, 10], winwidth(0))
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfu
diff --git a/src/nvim/testdir/test_makeencoding.py b/src/nvim/testdir/test_makeencoding.py
new file mode 100644
index 0000000000..041edadc0a
--- /dev/null
+++ b/src/nvim/testdir/test_makeencoding.py
@@ -0,0 +1,67 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Test program for :make, :grep and :cgetfile.
+
+from __future__ import print_function, unicode_literals
+import locale
+import io
+import sys
+
+def set_output_encoding(enc=None):
+ """Set the encoding of stdout and stderr
+
+ arguments:
+ enc -- Encoding name.
+ If omitted, locale.getpreferredencoding() is used.
+ """
+ if enc is None:
+ enc = locale.getpreferredencoding()
+
+ def get_text_writer(fo, **kwargs):
+ kw = dict(kwargs)
+ kw.setdefault('errors', 'backslashreplace') # use \uXXXX style
+ kw.setdefault('closefd', False)
+
+ if sys.version_info[0] < 3:
+ # Work around for Python 2.x
+ # New line conversion isn't needed here. Done in somewhere else.
+ writer = io.open(fo.fileno(), mode='w', newline='', **kw)
+ write = writer.write # save the original write() function
+ enc = locale.getpreferredencoding()
+ def convwrite(s):
+ if isinstance(s, bytes):
+ write(s.decode(enc)) # convert to unistr
+ else:
+ write(s)
+ try:
+ writer.flush() # needed on Windows
+ except IOError:
+ pass
+ writer.write = convwrite
+ else:
+ writer = io.open(fo.fileno(), mode='w', **kw)
+ return writer
+
+ sys.stdout = get_text_writer(sys.stdout, encoding=enc)
+ sys.stderr = get_text_writer(sys.stderr, encoding=enc)
+
+
+def main():
+ enc = 'utf-8'
+ if len(sys.argv) > 1:
+ enc = sys.argv[1]
+ set_output_encoding(enc)
+
+ message_tbl = {
+ 'utf-8': 'ร€รˆรŒร’ร™ ใ“ใ‚“ใซใกใฏ ไฝ ๅฅฝ',
+ 'latin1': 'ร€รˆรŒร’ร™',
+ 'cp932': 'ใ“ใ‚“ใซใกใฏ',
+ 'cp936': 'ไฝ ๅฅฝ',
+ }
+
+ print('Xfoobar.c(10) : %s (%s)' % (message_tbl[enc], enc))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/src/nvim/testdir/test_makeencoding.vim b/src/nvim/testdir/test_makeencoding.vim
new file mode 100644
index 0000000000..6e4c7af821
--- /dev/null
+++ b/src/nvim/testdir/test_makeencoding.vim
@@ -0,0 +1,113 @@
+" Tests for 'makeencoding'.
+if !has('multi_byte')
+ finish
+endif
+
+source shared.vim
+
+let s:python = PythonProg()
+if s:python == ''
+ " Can't run this test.
+ finish
+endif
+
+let s:script = 'test_makeencoding.py'
+
+if has('iconv')
+ let s:message_tbl = {
+ \ 'utf-8': 'ร€รˆรŒร’ร™ ใ“ใ‚“ใซใกใฏ ไฝ ๅฅฝ',
+ \ 'latin1': 'ร€รˆรŒร’ร™',
+ \ 'cp932': 'ใ“ใ‚“ใซใกใฏ',
+ \ 'cp936': 'ไฝ ๅฅฝ',
+ \}
+else
+ let s:message_tbl = {
+ \ 'utf-8': 'ร€รˆรŒร’ร™ ใ“ใ‚“ใซใกใฏ ไฝ ๅฅฝ',
+ \ 'latin1': 'ร€รˆรŒร’ร™',
+ \}
+endif
+
+
+" Tests for :cgetfile and :lgetfile.
+func Test_getfile()
+ set errorfile=Xerror.txt
+ set errorformat=%f(%l)\ :\ %m
+
+ " :cgetfile
+ for enc in keys(s:message_tbl)
+ let &makeencoding = enc
+ exec "silent !" . s:python . " " . s:script . " " . enc . " > " . &errorfile
+ cgetfile
+ copen
+ call assert_equal("Xfoobar.c|10| " . s:message_tbl[enc] . " (" . enc . ")",
+ \ getline('.'))
+ cclose
+ endfor
+
+ " :lgetfile
+ for enc in keys(s:message_tbl)
+ let &makeencoding = enc
+ exec "silent !" . s:python . " " . s:script . " " . enc . " > " . &errorfile
+ lgetfile
+ lopen
+ call assert_equal("Xfoobar.c|10| " . s:message_tbl[enc] . " (" . enc . ")",
+ \ getline('.'))
+ lclose
+ endfor
+
+ call delete(&errorfile)
+endfunc
+
+
+" Tests for :grep and :lgrep.
+func Test_grep()
+ let &grepprg = s:python
+ set grepformat=%f(%l)\ :\ %m
+
+ " :grep
+ for enc in keys(s:message_tbl)
+ let &makeencoding = enc
+ exec "silent grep! " . s:script . " " . enc
+ copen
+ call assert_equal("Xfoobar.c|10| " . s:message_tbl[enc] . " (" . enc . ")",
+ \ getline('.'))
+ cclose
+ endfor
+
+ " :lgrep
+ for enc in keys(s:message_tbl)
+ let &makeencoding = enc
+ exec "silent lgrep! " . s:script . " " . enc
+ lopen
+ call assert_equal("Xfoobar.c|10| " . s:message_tbl[enc] . " (" . enc . ")",
+ \ getline('.'))
+ lclose
+ endfor
+endfunc
+
+
+" Tests for :make and :lmake.
+func Test_make()
+ let &makeprg = s:python
+ set errorformat=%f(%l)\ :\ %m
+
+ " :make
+ for enc in keys(s:message_tbl)
+ let &makeencoding = enc
+ exec "silent make! " . s:script . " " . enc
+ copen
+ call assert_equal("Xfoobar.c|10| " . s:message_tbl[enc] . " (" . enc . ")",
+ \ getline('.'))
+ cclose
+ endfor
+
+ " :lmake
+ for enc in keys(s:message_tbl)
+ let &makeencoding = enc
+ exec "silent lmake! " . s:script . " " . enc
+ lopen
+ call assert_equal("Xfoobar.c|10| " . s:message_tbl[enc] . " (" . enc . ")",
+ \ getline('.'))
+ lclose
+ endfor
+endfunc
diff --git a/src/nvim/testdir/test_maparg.vim b/src/nvim/testdir/test_maparg.vim
new file mode 100644
index 0000000000..0fb878b04a
--- /dev/null
+++ b/src/nvim/testdir/test_maparg.vim
@@ -0,0 +1,56 @@
+" Tests for maparg().
+" Also test utf8 map with a 0x80 byte.
+if !has("multi_byte")
+ finish
+endif
+
+function s:SID()
+ return str2nr(matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze_SID$'))
+endfun
+
+function Test_maparg()
+ new
+ set cpo-=<
+ set encoding=utf8
+ " Test maparg() with a string result
+ map foo<C-V> is<F4>foo
+ vnoremap <script> <buffer> <expr> <silent> bar isbar
+ let sid = s:SID()
+ call assert_equal("is<F4>foo", maparg('foo<C-V>'))
+ call assert_equal({'silent': 0, 'noremap': 0, 'lhs': 'foo<C-V>',
+ \ 'mode': ' ', 'nowait': 0, 'expr': 0, 'sid': sid, 'rhs': 'is<F4>foo',
+ \ 'buffer': 0}, maparg('foo<C-V>', '', 0, 1))
+ call assert_equal({'silent': 1, 'noremap': 1, 'lhs': 'bar', 'mode': 'v',
+ \ 'nowait': 0, 'expr': 1, 'sid': sid, 'rhs': 'isbar', 'buffer': 1},
+ \ maparg('bar', '', 0, 1))
+ map <buffer> <nowait> foo bar
+ call assert_equal({'silent': 0, 'noremap': 0, 'lhs': 'foo', 'mode': ' ',
+ \ 'nowait': 1, 'expr': 0, 'sid': sid, 'rhs': 'bar', 'buffer': 1},
+ \ maparg('foo', '', 0, 1))
+
+ map abc x<char-114>x
+ call assert_equal("xrx", maparg('abc'))
+ map abc y<S-char-114>y
+ call assert_equal("yRy", maparg('abc'))
+
+ map abc <Nop>
+ call assert_equal("<Nop>", maparg('abc'))
+ unmap abc
+endfunction
+
+function Test_range_map()
+ new
+ " Outside of the range, minimum
+ inoremap <Char-0x1040> a
+ execute "normal a\u1040\<Esc>"
+ " Inside of the range, minimum
+ inoremap <Char-0x103f> b
+ execute "normal a\u103f\<Esc>"
+ " Inside of the range, maximum
+ inoremap <Char-0xf03f> c
+ execute "normal a\uf03f\<Esc>"
+ " Outside of the range, maximum
+ inoremap <Char-0xf040> d
+ execute "normal a\uf040\<Esc>"
+ call assert_equal("abcd", getline(1))
+endfunction
diff --git a/src/nvim/testdir/test_mapping.vim b/src/nvim/testdir/test_mapping.vim
new file mode 100644
index 0000000000..32593a423a
--- /dev/null
+++ b/src/nvim/testdir/test_mapping.vim
@@ -0,0 +1,286 @@
+" Tests for mappings and abbreviations
+
+if !has('multi_byte')
+ finish
+endif
+
+func Test_abbreviation()
+ " abbreviation with 0x80 should work
+ inoreab ั‡ะบะฟั€ vim
+ call feedkeys("Goั‡ะบะฟั€ \<Esc>", "xt")
+ call assert_equal('vim ', getline('$'))
+ iunab ั‡ะบะฟั€
+ set nomodified
+endfunc
+
+func Test_map_ctrl_c_insert()
+ " mapping of ctrl-c in Insert mode
+ set cpo-=< cpo-=k
+ inoremap <c-c> <ctrl-c>
+ cnoremap <c-c> dummy
+ cunmap <c-c>
+ call feedkeys("GoTEST2: CTRL-C |\<C-C>A|\<Esc>", "xt")
+ call assert_equal('TEST2: CTRL-C |<ctrl-c>A|', getline('$'))
+ unmap! <c-c>
+ set nomodified
+endfunc
+
+func Test_map_ctrl_c_visual()
+ " mapping of ctrl-c in Visual mode
+ vnoremap <c-c> :<C-u>$put ='vmap works'
+ call feedkeys("GV\<C-C>\<CR>", "xt")
+ call assert_equal('vmap works', getline('$'))
+ vunmap <c-c>
+ set nomodified
+endfunc
+
+func Test_map_langmap()
+ if !has('langmap')
+ return
+ endif
+
+ " check langmap applies in normal mode
+ set langmap=+- nolangremap
+ new
+ call setline(1, ['a', 'b', 'c'])
+ 2
+ call assert_equal('b', getline('.'))
+ call feedkeys("+", "xt")
+ call assert_equal('a', getline('.'))
+
+ " check no remapping
+ map x +
+ 2
+ call feedkeys("x", "xt")
+ call assert_equal('c', getline('.'))
+
+ " check with remapping
+ set langremap
+ 2
+ call feedkeys("x", "xt")
+ call assert_equal('a', getline('.'))
+
+ unmap x
+ bwipe!
+
+ " 'langnoremap' follows 'langremap' and vise versa
+ set langremap
+ set langnoremap
+ call assert_equal(0, &langremap)
+ set langremap
+ call assert_equal(0, &langnoremap)
+ set nolangremap
+ call assert_equal(1, &langnoremap)
+
+ " check default values
+ set langnoremap&
+ call assert_equal(1, &langnoremap)
+ call assert_equal(0, &langremap)
+ set langremap&
+ call assert_equal(1, &langnoremap)
+ call assert_equal(0, &langremap)
+
+ " langmap should not apply in insert mode, 'langremap' doesn't matter
+ set langmap=+{ nolangremap
+ call feedkeys("Go+\<Esc>", "xt")
+ call assert_equal('+', getline('$'))
+ set langmap=+{ langremap
+ call feedkeys("Go+\<Esc>", "xt")
+ call assert_equal('+', getline('$'))
+
+ " langmap used for register name in insert mode.
+ call setreg('a', 'aaaa')
+ call setreg('b', 'bbbb')
+ call setreg('c', 'cccc')
+ set langmap=ab langremap
+ call feedkeys("Go\<C-R>a\<Esc>", "xt")
+ call assert_equal('bbbb', getline('$'))
+ call feedkeys("Go\<C-R>\<C-R>a\<Esc>", "xt")
+ call assert_equal('bbbb', getline('$'))
+ " mapping does not apply
+ imap c a
+ call feedkeys("Go\<C-R>c\<Esc>", "xt")
+ call assert_equal('cccc', getline('$'))
+ imap a c
+ call feedkeys("Go\<C-R>a\<Esc>", "xt")
+ call assert_equal('bbbb', getline('$'))
+
+ " langmap should not apply in Command-line mode
+ set langmap=+{ nolangremap
+ call feedkeys(":call append(line('$'), '+')\<CR>", "xt")
+ call assert_equal('+', getline('$'))
+
+ iunmap a
+ iunmap c
+ set nomodified
+endfunc
+
+func Test_map_feedkeys()
+ " issue #212 (feedkeys insert mapping at current position)
+ nnoremap . :call feedkeys(".", "in")<cr>
+ call setline('$', ['a b c d', 'a b c d'])
+ $-1
+ call feedkeys("0qqdw.ifoo\<Esc>qj0@q\<Esc>", "xt")
+ call assert_equal(['fooc d', 'fooc d'], getline(line('$') - 1, line('$')))
+ nunmap .
+ set nomodified
+endfunc
+
+func Test_map_cursor()
+ " <c-g>U<cursor> works only within a single line
+ imapclear
+ imap ( ()<c-g>U<left>
+ call feedkeys("G2o\<Esc>ki\<CR>Test1: text with a (here some more text\<Esc>k.", "xt")
+ call assert_equal('Test1: text with a (here some more text)', getline(line('$') - 2))
+ call assert_equal('Test1: text with a (here some more text)', getline(line('$') - 1))
+
+ " test undo
+ call feedkeys("G2o\<Esc>ki\<CR>Test2: text wit a (here some more text [und undo]\<C-G>u\<Esc>k.u", "xt")
+ call assert_equal('', getline(line('$') - 2))
+ call assert_equal('Test2: text wit a (here some more text [und undo])', getline(line('$') - 1))
+ set nomodified
+ imapclear
+endfunc
+
+" This isn't actually testing a mapping, but similar use of CTRL-G U as above.
+func Test_break_undo()
+ :set whichwrap=<,>,[,]
+ call feedkeys("G4o2k", "xt")
+ exe ":norm! iTest3: text with a (parenthesis here\<C-G>U\<Right>new line here\<esc>\<up>\<up>."
+ call assert_equal('new line here', getline(line('$') - 3))
+ call assert_equal('Test3: text with a (parenthesis here', getline(line('$') - 2))
+ call assert_equal('new line here', getline(line('$') - 1))
+ set nomodified
+endfunc
+
+func Test_map_meta_quotes()
+ imap <M-"> foo
+ call feedkeys("Go-\<M-\">-\<Esc>", "xt")
+ call assert_equal("-foo-", getline('$'))
+ set nomodified
+ iunmap <M-">
+endfunc
+
+func Test_abbr_after_line_join()
+ new
+ abbr foo bar
+ set backspace=indent,eol,start
+ exe "normal o\<BS>foo "
+ call assert_equal("bar ", getline(1))
+ bwipe!
+ unabbr foo
+ set backspace&
+endfunc
+
+func Test_map_timeout()
+ nnoremap aaaa :let got_aaaa = 1<CR>
+ nnoremap bb :let got_bb = 1<CR>
+ nmap b aaa
+ new
+ func ExitInsert(timer)
+ let g:line = getline(1)
+ call feedkeys("\<Esc>", "t")
+ endfunc
+ set timeout timeoutlen=200
+ call timer_start(300, 'ExitInsert')
+ " After the 'b' Vim waits for another character to see if it matches 'bb'.
+ " When it times out it is expanded to "aaa", but there is no wait for
+ " "aaaa". Can't check that reliably though.
+ call feedkeys("b", "xt!")
+ call assert_equal("aa", g:line)
+ call assert_false(exists('got_aaa'))
+ call assert_false(exists('got_bb'))
+
+ bwipe!
+ nunmap aaaa
+ nunmap bb
+ nunmap b
+ set timeoutlen&
+ delfunc ExitInsert
+endfunc
+
+func Test_cabbr_visual_mode()
+ cabbr s su
+ call feedkeys(":s \<c-B>\"\<CR>", 'itx')
+ call assert_equal('"su ', getreg(':'))
+ call feedkeys(":'<,'>s \<c-B>\"\<CR>", 'itx')
+ let expected = '"'. "'<,'>su "
+ call assert_equal(expected, getreg(':'))
+ call feedkeys(": '<,'>s \<c-B>\"\<CR>", 'itx')
+ let expected = '" '. "'<,'>su "
+ call assert_equal(expected, getreg(':'))
+ call feedkeys(":'a,'bs \<c-B>\"\<CR>", 'itx')
+ let expected = '"'. "'a,'bsu "
+ call assert_equal(expected, getreg(':'))
+ cunabbr s
+endfunc
+
+func Test_abbreviation_CR()
+ new
+ func Eatchar(pat)
+ let c = nr2char(getchar(0))
+ return (c =~ a:pat) ? '' : c
+ endfunc
+ iabbrev <buffer><silent> ~~7 <c-r>=repeat('~', 7)<CR><c-r>=Eatchar('\s')<cr>
+ call feedkeys("GA~~7 \<esc>", 'xt')
+ call assert_equal('~~~~~~~', getline('$'))
+ %d
+ call feedkeys("GA~~7\<cr>\<esc>", 'xt')
+ call assert_equal(['~~~~~~~', ''], getline(1,'$'))
+ delfunc Eatchar
+ bw!
+endfunc
+
+func Test_motionforce_omap()
+ func GetCommand()
+ let g:m=mode(1)
+ let [g:lnum1, g:col1] = searchpos('-', 'Wb')
+ if g:lnum1 == 0
+ return "\<Esc>"
+ endif
+ let [g:lnum2, g:col2] = searchpos('-', 'W')
+ if g:lnum2 == 0
+ return "\<Esc>"
+ endif
+ return ":call Select()\<CR>"
+ endfunc
+ func Select()
+ call cursor([g:lnum1, g:col1])
+ exe "normal! 1 ". (strlen(g:m) == 2 ? 'v' : g:m[2])
+ call cursor([g:lnum2, g:col2])
+ execute "normal! \<BS>"
+ endfunc
+ new
+ onoremap <buffer><expr> i- GetCommand()
+ " 1) default omap mapping
+ %d_
+ call setline(1, ['aaa - bbb', 'x', 'ddd - eee'])
+ call cursor(2, 1)
+ norm di-
+ call assert_equal('no', g:m)
+ call assert_equal(['aaa -- eee'], getline(1, '$'))
+ " 2) forced characterwise operation
+ %d_
+ call setline(1, ['aaa - bbb', 'x', 'ddd - eee'])
+ call cursor(2, 1)
+ norm dvi-
+ call assert_equal('nov', g:m)
+ call assert_equal(['aaa -- eee'], getline(1, '$'))
+ " 3) forced linewise operation
+ %d_
+ call setline(1, ['aaa - bbb', 'x', 'ddd - eee'])
+ call cursor(2, 1)
+ norm dVi-
+ call assert_equal('noV', g:m)
+ call assert_equal([''], getline(1, '$'))
+ " 4) forced blockwise operation
+ %d_
+ call setline(1, ['aaa - bbb', 'x', 'ddd - eee'])
+ call cursor(2, 1)
+ exe "norm d\<C-V>i-"
+ call assert_equal("no\<C-V>", g:m)
+ call assert_equal(['aaabbb', 'x', 'dddeee'], getline(1, '$'))
+ bwipe!
+ delfunc Select
+ delfunc GetCommand
+endfunc
diff --git a/src/nvim/testdir/test_marks.vim b/src/nvim/testdir/test_marks.vim
new file mode 100644
index 0000000000..8858cd22b8
--- /dev/null
+++ b/src/nvim/testdir/test_marks.vim
@@ -0,0 +1,138 @@
+
+" Test that a deleted mark is restored after delete-undo-redo-undo.
+function! Test_Restore_DelMark()
+ enew!
+ call append(0, [" textline A", " textline B", " textline C"])
+ normal! 2gg
+ set nocp viminfo+=nviminfo
+ exe "normal! i\<C-G>u\<Esc>"
+ exe "normal! maddu\<C-R>u"
+ let pos = getpos("'a")
+ call assert_equal(2, pos[1])
+ call assert_equal(1, pos[2])
+ enew!
+endfunction
+
+" Test that CTRL-A and CTRL-X updates last changed mark '[, '].
+function! Test_Incr_Marks()
+ enew!
+ call append(0, ["123 123 123", "123 123 123", "123 123 123"])
+ normal! gg
+ execute "normal! \<C-A>`[v`]rAjwvjw\<C-X>`[v`]rX"
+ call assert_equal("AAA 123 123", getline(1))
+ call assert_equal("123 XXXXXXX", getline(2))
+ call assert_equal("XXX 123 123", getline(3))
+ enew!
+endfunction
+
+func Test_setpos()
+ new one
+ let onebuf = bufnr('%')
+ let onewin = win_getid()
+ call setline(1, ['aaa', 'bbb', 'ccc'])
+ new two
+ let twobuf = bufnr('%')
+ let twowin = win_getid()
+ call setline(1, ['aaa', 'bbb', 'ccc'])
+
+ " for the cursor the buffer number is ignored
+ call setpos(".", [0, 2, 1, 0])
+ call assert_equal([0, 2, 1, 0], getpos("."))
+ call setpos(".", [onebuf, 3, 3, 0])
+ call assert_equal([0, 3, 3, 0], getpos("."))
+
+ call setpos("''", [0, 1, 3, 0])
+ call assert_equal([0, 1, 3, 0], getpos("''"))
+ call setpos("''", [onebuf, 2, 2, 0])
+ call assert_equal([0, 2, 2, 0], getpos("''"))
+
+ " buffer-local marks
+ for mark in ["'a", "'\"", "'[", "']", "'<", "'>"]
+ call win_gotoid(twowin)
+ call setpos(mark, [0, 2, 1, 0])
+ call assert_equal([0, 2, 1, 0], getpos(mark), "for mark " . mark)
+ call setpos(mark, [onebuf, 1, 3, 0])
+ call win_gotoid(onewin)
+ call assert_equal([0, 1, 3, 0], getpos(mark), "for mark " . mark)
+ endfor
+
+ " global marks
+ call win_gotoid(twowin)
+ call setpos("'N", [0, 2, 1, 0])
+ call assert_equal([twobuf, 2, 1, 0], getpos("'N"))
+ call setpos("'N", [onebuf, 1, 3, 0])
+ call assert_equal([onebuf, 1, 3, 0], getpos("'N"))
+
+ call win_gotoid(onewin)
+ bwipe!
+ call win_gotoid(twowin)
+ bwipe!
+endfunc
+
+func Test_marks_cmd()
+ new Xone
+ call setline(1, ['aaa', 'bbb'])
+ norm! maG$mB
+ w!
+ new Xtwo
+ call setline(1, ['ccc', 'ddd'])
+ norm! $mcGmD
+ w!
+
+ b Xone
+ let a = split(execute('marks'), "\n")
+ call assert_equal(9, len(a))
+ call assert_equal('mark line col file/text', a[0])
+ call assert_equal(" ' 2 0 bbb", a[1])
+ call assert_equal(' a 1 0 aaa', a[2])
+ call assert_equal(' B 2 2 bbb', a[3])
+ call assert_equal(' D 2 0 Xtwo', a[4])
+ call assert_equal(' " 1 0 aaa', a[5])
+ call assert_equal(' [ 1 0 aaa', a[6])
+ call assert_equal(' ] 2 0 bbb', a[7])
+ call assert_equal(' . 2 0 bbb', a[8])
+
+ b Xtwo
+ let a = split(execute('marks'), "\n")
+ call assert_equal(9, len(a))
+ call assert_equal('mark line col file/text', a[0])
+ call assert_equal(" ' 1 0 ccc", a[1])
+ call assert_equal(' c 1 2 ccc', a[2])
+ call assert_equal(' B 2 2 Xone', a[3])
+ call assert_equal(' D 2 0 ddd', a[4])
+ call assert_equal(' " 2 0 ddd', a[5])
+ call assert_equal(' [ 1 0 ccc', a[6])
+ call assert_equal(' ] 2 0 ddd', a[7])
+ call assert_equal(' . 2 0 ddd', a[8])
+
+ b Xone
+ delmarks aB
+ let a = split(execute('marks aBcD'), "\n")
+ call assert_equal(2, len(a))
+ call assert_equal('mark line col file/text', a[0])
+ call assert_equal(' D 2 0 Xtwo', a[1])
+
+ b Xtwo
+ delmarks cD
+ call assert_fails('marks aBcD', 'E283:')
+
+ call delete('Xone')
+ call delete('Xtwo')
+ %bwipe
+endfunc
+
+func Test_marks_cmd_multibyte()
+ if !has('multi_byte')
+ return
+ endif
+ new Xone
+ call setline(1, [repeat('รก', &columns)])
+ norm! ma
+
+ let a = split(execute('marks a'), "\n")
+ call assert_equal(2, len(a))
+ let expected = ' a 1 0 ' . repeat('รก', &columns - 16)
+ call assert_equal(expected, a[1])
+
+ bwipe!
+endfunc
diff --git a/src/nvim/testdir/test_match.vim b/src/nvim/testdir/test_match.vim
new file mode 100644
index 0000000000..e608a2e58b
--- /dev/null
+++ b/src/nvim/testdir/test_match.vim
@@ -0,0 +1,232 @@
+" Test for :match, :2match, :3match, clearmatches(), getmatches(), matchadd(),
+" matchaddpos(), matcharg(), matchdelete(), and setmatches().
+
+function Test_match()
+ highlight MyGroup1 term=bold ctermbg=red guibg=red
+ highlight MyGroup2 term=italic ctermbg=green guibg=green
+ highlight MyGroup3 term=underline ctermbg=blue guibg=blue
+
+ " --- Check that "matcharg()" returns the correct group and pattern if a match
+ " --- is defined.
+ match MyGroup1 /TODO/
+ 2match MyGroup2 /FIXME/
+ 3match MyGroup3 /XXX/
+ call assert_equal(['MyGroup1', 'TODO'], matcharg(1))
+ call assert_equal(['MyGroup2', 'FIXME'], matcharg(2))
+ call assert_equal(['MyGroup3', 'XXX'], matcharg(3))
+
+ " --- Check that "matcharg()" returns an empty list if the argument is not 1,
+ " --- 2 or 3 (only 0 and 4 are tested).
+ call assert_equal([], matcharg(0))
+ call assert_equal([], matcharg(4))
+
+ " --- Check that "matcharg()" returns ['', ''] if a match is not defined.
+ match
+ 2match
+ 3match
+ call assert_equal(['', ''], matcharg(1))
+ call assert_equal(['', ''], matcharg(2))
+ call assert_equal(['', ''], matcharg(3))
+
+ " --- Check that "matchadd()" and "getmatches()" agree on added matches and
+ " --- that default values apply.
+ let m1 = matchadd("MyGroup1", "TODO")
+ let m2 = matchadd("MyGroup2", "FIXME", 42)
+ let m3 = matchadd("MyGroup3", "XXX", 60, 17)
+ let ans = [{'group': 'MyGroup1', 'pattern': 'TODO', 'priority': 10, 'id': 4},
+ \ {'group': 'MyGroup2', 'pattern': 'FIXME', 'priority': 42, 'id': 5},
+ \ {'group': 'MyGroup3', 'pattern': 'XXX', 'priority': 60, 'id': 17}]
+ call assert_equal(ans, getmatches())
+
+ " --- Check that "matchdelete()" deletes the matches defined in the previous
+ " --- test correctly.
+ call matchdelete(m1)
+ call matchdelete(m2)
+ call matchdelete(m3)
+ call assert_equal([], getmatches())
+
+ " --- Check that "matchdelete()" returns 0 if successful and otherwise -1.
+ let m = matchadd("MyGroup1", "TODO")
+ call assert_equal(0, matchdelete(m))
+ call assert_fails('call matchdelete(42)', 'E803:')
+
+ " --- Check that "clearmatches()" clears all matches defined by ":match" and
+ " --- "matchadd()".
+ let m1 = matchadd("MyGroup1", "TODO")
+ let m2 = matchadd("MyGroup2", "FIXME", 42)
+ let m3 = matchadd("MyGroup3", "XXX", 60, 17)
+ match MyGroup1 /COFFEE/
+ 2match MyGroup2 /HUMPPA/
+ 3match MyGroup3 /VIM/
+ call clearmatches()
+ call assert_equal([], getmatches())
+
+ " --- Check that "setmatches()" restores a list of matches saved by
+ " --- "getmatches()" without changes. (Matches with equal priority must also
+ " --- remain in the same order.)
+ let m1 = matchadd("MyGroup1", "TODO")
+ let m2 = matchadd("MyGroup2", "FIXME", 42)
+ let m3 = matchadd("MyGroup3", "XXX", 60, 17)
+ match MyGroup1 /COFFEE/
+ 2match MyGroup2 /HUMPPA/
+ 3match MyGroup3 /VIM/
+ let ml = getmatches()
+ call clearmatches()
+ call setmatches(ml)
+ call assert_equal(ml, getmatches())
+ call clearmatches()
+
+ " --- Check that "setmatches()" will not add two matches with the same ID. The
+ " --- expected behaviour (for now) is to add the first match but not the
+ " --- second and to return 0 (even though it is a matter of debate whether
+ " --- this can be considered successful behaviour).
+ let data = [{'group': 'MyGroup1', 'pattern': 'TODO', 'priority': 10, 'id': 1},
+ \ {'group': 'MyGroup2', 'pattern': 'FIXME', 'priority': 10, 'id': 1}]
+ call assert_fails('call setmatches(data)', 'E801:')
+ call assert_equal([data[0]], getmatches())
+ call clearmatches()
+
+ " --- Check that "setmatches()" returns 0 if successful and otherwise -1.
+ " --- (A range of valid and invalid input values are tried out to generate the
+ " --- return values.)
+ call assert_equal(0, setmatches([]))
+ call assert_equal(0, setmatches([{'group': 'MyGroup1', 'pattern': 'TODO', 'priority': 10, 'id': 1}]))
+ call clearmatches()
+ call assert_fails('call setmatches(0)', 'E714:')
+ call assert_fails('call setmatches([0])', 'E474:')
+ call assert_fails("call setmatches([{'wrong key': 'wrong value'}])", 'E474:')
+
+ call setline(1, 'abcdefghijklmnopq')
+ call matchaddpos("MyGroup1", [[1, 5], [1, 8, 3]], 10, 3)
+ 1
+ redraw!
+ let v1 = screenattr(1, 1)
+ let v5 = screenattr(1, 5)
+ let v6 = screenattr(1, 6)
+ let v8 = screenattr(1, 8)
+ let v10 = screenattr(1, 10)
+ let v11 = screenattr(1, 11)
+ call assert_notequal(v1, v5)
+ call assert_equal(v6, v1)
+ call assert_equal(v8, v5)
+ call assert_equal(v10, v5)
+ call assert_equal(v11, v1)
+ call assert_equal([{'group': 'MyGroup1', 'id': 3, 'priority': 10, 'pos1': [1, 5, 1], 'pos2': [1, 8, 3]}], getmatches())
+ call clearmatches()
+
+ "
+ if has('multi_byte')
+ call setline(1, 'abcdฮฃabcdef')
+ call matchaddpos("MyGroup1", [[1, 4, 2], [1, 9, 2]])
+ 1
+ redraw!
+ let v1 = screenattr(1, 1)
+ let v4 = screenattr(1, 4)
+ let v5 = screenattr(1, 5)
+ let v6 = screenattr(1, 6)
+ let v7 = screenattr(1, 7)
+ let v8 = screenattr(1, 8)
+ let v9 = screenattr(1, 9)
+ let v10 = screenattr(1, 10)
+ call assert_equal([{'group': 'MyGroup1', 'id': 11, 'priority': 10, 'pos1': [1, 4, 2], 'pos2': [1, 9, 2]}], getmatches())
+ call assert_notequal(v1, v4)
+ call assert_equal(v5, v4)
+ call assert_equal(v6, v1)
+ call assert_equal(v7, v1)
+ call assert_equal(v8, v4)
+ call assert_equal(v9, v4)
+ call assert_equal(v10, v1)
+
+ " Check, that setmatches() can correctly restore the matches from matchaddpos()
+ call matchadd('MyGroup1', '\%2lmatchadd')
+ let m=getmatches()
+ call clearmatches()
+ call setmatches(m)
+ call assert_equal([{'group': 'MyGroup1', 'id': 11, 'priority': 10, 'pos1': [1, 4, 2], 'pos2': [1,9, 2]}, {'group': 'MyGroup1', 'pattern': '\%2lmatchadd', 'priority': 10, 'id': 12}], getmatches())
+ endif
+
+ highlight MyGroup1 NONE
+ highlight MyGroup2 NONE
+ highlight MyGroup3 NONE
+endfunc
+
+func Test_matchaddpos()
+ syntax on
+ set hlsearch
+
+ call setline(1, ['12345', 'NP'])
+ call matchaddpos('Error', [[1,2], [1,6], [2,2]])
+ redraw!
+ call assert_notequal(screenattr(2,2), 0)
+ call assert_equal(screenattr(2,2), screenattr(1,2))
+ call assert_notequal(screenattr(2,2), screenattr(1,6))
+ 1
+ call matchadd('Search', 'N\|\n')
+ redraw!
+ call assert_notequal(screenattr(2,1), 0)
+ call assert_equal(screenattr(2,1), screenattr(1,6))
+ exec "norm! i0\<Esc>"
+ redraw!
+ call assert_equal(screenattr(2,2), screenattr(1,6))
+
+ " Check overlapping pos
+ call clearmatches()
+ call setline(1, ['1234567890', 'NH'])
+ call matchaddpos('Error', [[1,1,5], [1,3,5], [2,2]])
+ redraw!
+ call assert_notequal(screenattr(2,2), 0)
+ call assert_equal(screenattr(2,2), screenattr(1,5))
+ call assert_equal(screenattr(2,2), screenattr(1,7))
+ call assert_notequal(screenattr(2,2), screenattr(1,8))
+
+ call clearmatches()
+ call matchaddpos('Error', [[1], [2,2]])
+ redraw!
+ call assert_equal(screenattr(2,2), screenattr(1,1))
+ call assert_equal(screenattr(2,2), screenattr(1,10))
+ call assert_notequal(screenattr(2,2), screenattr(1,11))
+
+ " Check overlapping pos
+ call clearmatches()
+ call setline(1, ['1234567890', 'NH'])
+ call matchaddpos('Error', [[1,1,5], [1,3,5], [2,2]])
+ redraw!
+ call assert_notequal(screenattr(2,2), 0)
+ call assert_equal(screenattr(2,2), screenattr(1,5))
+ call assert_equal(screenattr(2,2), screenattr(1,7))
+ call assert_notequal(screenattr(2,2), screenattr(1,8))
+
+ nohl
+ call clearmatches()
+ syntax off
+ set hlsearch&
+endfunc
+
+func Test_matchaddpos_using_negative_priority()
+ set hlsearch
+
+ call clearmatches()
+
+ call setline(1, 'x')
+ let @/='x'
+ redraw!
+ let search_attr = screenattr(1,1)
+
+ let @/=''
+ call matchaddpos('Error', [1], 10)
+ redraw!
+ let error_attr = screenattr(1,1)
+
+ call setline(2, '-1 match priority')
+ call matchaddpos('Error', [2], -1)
+ redraw!
+ let negative_match_priority_attr = screenattr(2,1)
+
+ call assert_notequal(negative_match_priority_attr, search_attr, "Match with negative priority is incorrectly highlighted with Search highlight.")
+ call assert_equal(negative_match_priority_attr, error_attr)
+
+ nohl
+ set hlsearch&
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_matchadd_conceal.vim b/src/nvim/testdir/test_matchadd_conceal.vim
new file mode 100644
index 0000000000..b918525dbc
--- /dev/null
+++ b/src/nvim/testdir/test_matchadd_conceal.vim
@@ -0,0 +1,275 @@
+" Test for matchadd() and conceal feature
+if !has('conceal')
+ finish
+endif
+
+source shared.vim
+
+function! Test_simple_matchadd()
+ new
+
+ 1put='# This is a Test'
+ " 1234567890123456
+ let expect = '# This is a Test'
+
+ call cursor(1, 1)
+ call matchadd('Conceal', '\%2l ')
+ redraw!
+ let lnum = 2
+ call assert_equal(expect, Screenline(lnum))
+ call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2))
+ call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12))
+ call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16))
+
+ quit!
+endfunction
+
+function! Test_simple_matchadd_and_conceal()
+ new
+ setlocal concealcursor=n conceallevel=1
+
+ 1put='# This is a Test'
+ " 1234567890123456
+ let expect = '#XThisXisXaXTest'
+
+ call cursor(1, 1)
+ call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'X'})
+ redraw!
+ let lnum = 2
+ call assert_equal(expect, Screenline(lnum))
+ call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12))
+ call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16))
+
+ quit!
+endfunction
+
+function! Test_matchadd_and_conceallevel_3()
+ new
+
+ setlocal conceallevel=3
+ " set filetype and :syntax on to change screenattr()
+ setlocal filetype=conf
+ syntax on
+
+ 1put='# This is a Test'
+ " 1234567890123456
+ let expect = '#ThisisaTest'
+
+ call cursor(1, 1)
+ call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'X'})
+ redraw!
+ let lnum = 2
+ call assert_equal(expect, Screenline(lnum))
+ call assert_equal(screenattr(lnum, 1), screenattr(lnum, 2))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12))
+ call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 16))
+
+ " more matchadd()
+ " 1234567890123456
+ let expect = '#Thisisa Test'
+
+ call matchadd('ErrorMsg', '\%2l Test', 20, -1, {'conceal': 'X'})
+ redraw!
+ call assert_equal(expect, Screenline(lnum))
+ call assert_equal(screenattr(lnum, 1) , screenattr(lnum, 2))
+ call assert_equal(screenattr(lnum, 2) , screenattr(lnum, 7))
+ call assert_notequal(screenattr(lnum, 1) , screenattr(lnum, 10))
+ call assert_equal(screenattr(lnum, 10), screenattr(lnum, 12))
+ call assert_notequal(screenattr(lnum, 1) , screenattr(lnum, 16))
+ call assert_notequal(screenattr(lnum, 10), screenattr(lnum, 16))
+
+ syntax off
+ quit!
+endfunction
+
+function! Test_default_conceal_char()
+ new
+ setlocal concealcursor=n conceallevel=1
+
+ 1put='# This is a Test'
+ " 1234567890123456
+ let expect = '# This is a Test'
+
+ call cursor(1, 1)
+ call matchadd('Conceal', '\%2l ', 10, -1, {})
+ redraw!
+ let lnum = 2
+ call assert_equal(expect, Screenline(lnum))
+ call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12))
+ call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16))
+
+ " 1234567890123456
+ let expect = '#+This+is+a+Test'
+ let listchars_save = &listchars
+ set listchars=conceal:+
+ redraw!
+
+ call assert_equal(expect, Screenline(lnum))
+ call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12))
+ call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16))
+
+ let &listchars = listchars_save
+ quit!
+endfunction
+
+function! Test_syn_and_match_conceal()
+ new
+ setlocal concealcursor=n conceallevel=1
+
+ 1put='# This is a Test'
+ " 1234567890123456
+ let expect = '#ZThisZisZaZTest'
+
+ call cursor(1, 1)
+ call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'Z'})
+ syntax match MyConceal /\%2l / conceal containedin=ALL cchar=*
+ redraw!
+ let lnum = 2
+ call assert_equal(expect, Screenline(lnum))
+ call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12))
+ call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16))
+
+ " 1234567890123456
+ let expect = '#*This*is*a*Test'
+ call clearmatches()
+ redraw!
+
+ call assert_equal(expect, Screenline(lnum))
+ call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12))
+ call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16))
+
+ syntax off
+ quit!
+endfunction
+
+function! Test_clearmatches()
+ new
+ setlocal concealcursor=n conceallevel=1
+
+ 1put='# This is a Test'
+ " 1234567890123456
+ let expect = '# This is a Test'
+
+ call cursor(1, 1)
+ call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'Z'})
+ let a = getmatches()
+ call clearmatches()
+ redraw!
+
+ let lnum = 2
+ call assert_equal(expect, Screenline(lnum))
+ call assert_equal(screenattr(lnum, 1), screenattr(lnum, 2))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12))
+ call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16))
+
+ " reset match using setmatches()
+ " 1234567890123456
+ let expect = '#ZThisZisZaZTest'
+ call setmatches(a)
+ redraw!
+
+ call assert_equal(expect, Screenline(lnum))
+ call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12))
+ call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16))
+ call assert_equal({'group': 'Conceal', 'pattern': '\%2l ', 'priority': 10, 'id': a[0].id, 'conceal': 'Z'}, a[0])
+
+ quit!
+endfunction
+
+function! Test_using_matchaddpos()
+ new
+ setlocal concealcursor=n conceallevel=1
+ " set filetype and :syntax on to change screenattr()
+ setlocal filetype=conf
+ syntax on
+
+ 1put='# This is a Test'
+ " 1234567890123456
+ let expect = '#Pis a Test'
+
+ call cursor(1, 1)
+ call matchaddpos('Conceal', [[2,2,6]], 10, -1, {'conceal': 'P'})
+ let a = getmatches()
+ redraw!
+
+ let lnum = 2
+ call assert_equal(expect, Screenline(lnum))
+ call assert_notequal(screenattr(lnum, 1) , screenattr(lnum, 2))
+ call assert_notequal(screenattr(lnum, 2) , screenattr(lnum, 7))
+ call assert_equal(screenattr(lnum, 1) , screenattr(lnum, 7))
+ call assert_equal(screenattr(lnum, 1) , screenattr(lnum, 10))
+ call assert_notequal(screenattr(lnum, 1) , screenattr(lnum, 12))
+ call assert_notequal(screenattr(lnum, 1) , screenattr(lnum, 16))
+ call assert_equal(screenattr(lnum, 12), screenattr(lnum, 16))
+ call assert_equal({'group': 'Conceal', 'id': a[0].id, 'priority': 10, 'pos1': [2, 2, 6], 'conceal': 'P'}, a[0])
+
+ syntax off
+ quit!
+endfunction
+
+function! Test_matchadd_repeat_conceal_with_syntax_off()
+ new
+
+ " To test targets in the same line string is replaced with conceal char
+ " correctly, repeat 'TARGET'
+ 1put ='TARGET_TARGETTARGET'
+ call cursor(1, 1)
+ redraw
+ call assert_equal('TARGET_TARGETTARGET', Screenline(2))
+
+ setlocal conceallevel=2
+ call matchadd('Conceal', 'TARGET', 10, -1, {'conceal': 't'})
+
+ redraw
+ call assert_equal('t_tt', Screenline(2))
+
+ quit!
+endfunction
+
+function! Test_matchadd_and_syn_conceal()
+ new
+ let cnt='Inductive bool : Type := | true : bool | false : bool.'
+ let expect = 'Inductive - : Type := | true : - | false : -.'
+ 0put =cnt
+ " set filetype and :syntax on to change screenattr()
+ set cole=1 cocu=nv
+ hi link CheckedByCoq WarningMsg
+ syntax on
+ syntax keyword coqKwd bool conceal cchar=-
+ redraw!
+ call assert_equal(expect, Screenline(1))
+ call assert_notequal(screenattr(1, 10) , screenattr(1, 11))
+ call assert_notequal(screenattr(1, 11) , screenattr(1, 12))
+ call assert_equal(screenattr(1, 11) , screenattr(1, 32))
+ call matchadd('CheckedByCoq', '\%<2l\%>9c\%<16c')
+ redraw!
+ call assert_equal(expect, Screenline(1))
+ call assert_notequal(screenattr(1, 10) , screenattr(1, 11))
+ call assert_notequal(screenattr(1, 11) , screenattr(1, 12))
+ call assert_equal(screenattr(1, 11) , screenattr(1, 32))
+endfunction
diff --git a/src/nvim/testdir/test_matchadd_conceal_utf8.vim b/src/nvim/testdir/test_matchadd_conceal_utf8.vim
new file mode 100644
index 0000000000..24c848a99c
--- /dev/null
+++ b/src/nvim/testdir/test_matchadd_conceal_utf8.vim
@@ -0,0 +1,39 @@
+" Test for matchadd() and conceal feature using utf-8.
+if !has('conceal') || !has('multi_byte')
+ finish
+endif
+
+function! s:screenline(lnum) abort
+ let line = []
+ for c in range(1, winwidth(0))
+ call add(line, nr2char(screenchar(a:lnum, c)))
+ endfor
+ return s:trim(join(line, ''))
+endfunction
+
+function! s:trim(str) abort
+ return matchstr(a:str,'^\s*\zs.\{-}\ze\s*$')
+endfunction
+
+function! Test_match_using_multibyte_conceal_char()
+ new
+ setlocal concealcursor=n conceallevel=1
+
+ 1put='# This is a Test'
+ " 1234567890123456
+ let expect = '#ห‘Thisห‘isห‘aห‘Test'
+
+ call cursor(1, 1)
+ call matchadd('Conceal', '\%2l ', 20, -1, {'conceal': "\u02d1"})
+ redraw!
+
+ let lnum = 2
+ call assert_equal(expect, s:screenline(lnum))
+ call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10))
+ call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12))
+ call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16))
+
+ quit!
+endfunction
diff --git a/src/nvim/testdir/test_menu.vim b/src/nvim/testdir/test_menu.vim
index be559467c8..af18760065 100644
--- a/src/nvim/testdir/test_menu.vim
+++ b/src/nvim/testdir/test_menu.vim
@@ -4,6 +4,6 @@ func Test_load_menu()
try
source $VIMRUNTIME/menu.vim
catch
- call assert_false(1, 'error while loading menus: ' . v:exception)
+ call assert_report('error while loading menus: ' . v:exception)
endtry
endfunc
diff --git a/src/nvim/testdir/test_messages.vim b/src/nvim/testdir/test_messages.vim
new file mode 100644
index 0000000000..12101ec1f8
--- /dev/null
+++ b/src/nvim/testdir/test_messages.vim
@@ -0,0 +1,45 @@
+" Tests for :messages
+
+function Test_messages()
+ let oldmore = &more
+ try
+ set nomore
+ " Avoid the "message maintainer" line.
+ let $LANG = ''
+
+ let arr = map(range(10), '"hello" . v:val')
+ for s in arr
+ echomsg s | redraw
+ endfor
+ let result = ''
+
+ " get last two messages
+ redir => result
+ 2messages | redraw
+ redir END
+ let msg_list = split(result, "\n")
+ call assert_equal(["hello8", "hello9"], msg_list)
+
+ " clear messages without last one
+ 1messages clear
+ redir => result
+ redraw | messages
+ redir END
+ let msg_list = split(result, "\n")
+ call assert_equal(['hello9'], msg_list)
+
+ " clear all messages
+ messages clear
+ redir => result
+ redraw | messages
+ redir END
+ call assert_equal('', result)
+ finally
+ let &more = oldmore
+ endtry
+endfunction
+
+func Test_message_completion()
+ call feedkeys(":message \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"message clear', @:)
+endfunc
diff --git a/src/nvim/testdir/test_mksession.vim b/src/nvim/testdir/test_mksession.vim
new file mode 100644
index 0000000000..9ba264deb6
--- /dev/null
+++ b/src/nvim/testdir/test_mksession.vim
@@ -0,0 +1,241 @@
+" Test for :mksession, :mkview and :loadview in latin1 encoding
+
+scriptencoding latin1
+
+if !has('multi_byte') || !has('mksession')
+ finish
+endif
+
+func Test_mksession()
+ tabnew
+ let wrap_save = &wrap
+ set sessionoptions=buffers splitbelow fileencoding=latin1
+ call setline(1, [
+ \ 'start:',
+ \ 'no multibyte chAracter',
+ \ ' one leaDing tab',
+ \ ' four leadinG spaces',
+ \ 'two consecutive tabs',
+ \ 'two tabs in one line',
+ \ 'one ไ multibyteCharacter',
+ \ 'aไ ฤ two multiByte characters',
+ \ 'Aไ๖ three mulTibyte characters',
+ \ 'short line',
+ \ ])
+ let tmpfile = 'Xtemp'
+ exec 'w! ' . tmpfile
+ /^start:
+ set wrap
+ vsplit
+ norm! j16|
+ split
+ norm! j16|
+ split
+ norm! j16|
+ split
+ norm! j8|
+ split
+ norm! j8|
+ split
+ norm! j16|
+ split
+ norm! j16|
+ split
+ norm! j16|
+ split
+ norm! j$
+ wincmd l
+
+ set nowrap
+ /^start:
+ norm! j16|3zl
+ split
+ norm! j016|3zl
+ split
+ norm! j016|3zl
+ split
+ norm! j08|3zl
+ split
+ norm! j08|3zl
+ split
+ norm! j016|3zl
+ split
+ norm! j016|3zl
+ split
+ norm! j016|3zl
+ split
+ call wincol()
+ mksession! Xtest_mks.out
+ let li = filter(readfile('Xtest_mks.out'), 'v:val =~# "\\(^ *normal! [0$]\\|^ *exe ''normal!\\)"')
+ let expected = [
+ \ 'normal! 016|',
+ \ 'normal! 016|',
+ \ 'normal! 016|',
+ \ 'normal! 08|',
+ \ 'normal! 08|',
+ \ 'normal! 016|',
+ \ 'normal! 016|',
+ \ 'normal! 016|',
+ \ 'normal! $',
+ \ " exe 'normal! ' . s:c . '|zs' . 16 . '|'",
+ \ " normal! 016|",
+ \ " exe 'normal! ' . s:c . '|zs' . 16 . '|'",
+ \ " normal! 016|",
+ \ " exe 'normal! ' . s:c . '|zs' . 16 . '|'",
+ \ " normal! 016|",
+ \ " exe 'normal! ' . s:c . '|zs' . 8 . '|'",
+ \ " normal! 08|",
+ \ " exe 'normal! ' . s:c . '|zs' . 8 . '|'",
+ \ " normal! 08|",
+ \ " exe 'normal! ' . s:c . '|zs' . 16 . '|'",
+ \ " normal! 016|",
+ \ " exe 'normal! ' . s:c . '|zs' . 16 . '|'",
+ \ " normal! 016|",
+ \ " exe 'normal! ' . s:c . '|zs' . 16 . '|'",
+ \ " normal! 016|",
+ \ " exe 'normal! ' . s:c . '|zs' . 16 . '|'",
+ \ " normal! 016|"
+ \ ]
+ call assert_equal(expected, li)
+ tabclose!
+
+ call delete('Xtest_mks.out')
+ call delete(tmpfile)
+ let &wrap = wrap_save
+endfunc
+
+func Test_mksession_winheight()
+ new
+ set winheight=10 winminheight=2
+ mksession! Xtest_mks.out
+ source Xtest_mks.out
+
+ call delete('Xtest_mks.out')
+endfunc
+
+" Verify that arglist is stored correctly to the session file.
+func Test_mksession_arglist()
+ argdel *
+ next file1 file2 file3 file4
+ mksession! Xtest_mks.out
+ source Xtest_mks.out
+ call assert_equal(['file1', 'file2', 'file3', 'file4'], argv())
+
+ call delete('Xtest_mks.out')
+ argdel *
+endfunc
+
+
+func Test_mksession_one_buffer_two_windows()
+ edit Xtest1
+ new Xtest2
+ split
+ mksession! Xtest_mks.out
+ let lines = readfile('Xtest_mks.out')
+ let count1 = 0
+ let count2 = 0
+ let count2buf = 0
+ for line in lines
+ if line =~ 'edit \f*Xtest1$'
+ let count1 += 1
+ endif
+ if line =~ 'edit \f\{-}Xtest2'
+ let count2 += 1
+ endif
+ if line =~ 'buffer \f\{-}Xtest2'
+ let count2buf += 1
+ endif
+ endfor
+ call assert_equal(1, count1, 'Xtest1 count')
+ call assert_equal(2, count2, 'Xtest2 count')
+ call assert_equal(2, count2buf, 'Xtest2 buffer count')
+
+ close
+ bwipe!
+ call delete('Xtest_mks.out')
+endfunc
+
+" Test :mkview with a file argument.
+func Test_mkview_file()
+ " Create a view with line number and a fold.
+ help :mkview
+ set number
+ norm! V}zf0
+ let pos = getpos('.')
+ let linefoldclosed1 = foldclosed('.')
+ mkview! Xview
+ set nonumber
+ norm! zrj
+ " We can close the help window, as mkview with a file name should
+ " generate a command to edit the file.
+ helpclose
+
+ source Xview
+ call assert_equal(1, &number)
+ call assert_match('\*:mkview\*$', getline('.'))
+ call assert_equal(pos, getpos('.'))
+ call assert_equal(linefoldclosed1, foldclosed('.'))
+
+ " Creating a view again with the same file name should fail (file
+ " already exists). But with a !, the previous view should be
+ " overwritten without error.
+ help :loadview
+ call assert_fails('mkview Xview', 'E189:')
+ call assert_match('\*:loadview\*$', getline('.'))
+ mkview! Xview
+ call assert_match('\*:loadview\*$', getline('.'))
+
+ call delete('Xview')
+ bwipe
+endfunc
+
+" Test :mkview and :loadview with a custom 'viewdir'.
+func Test_mkview_loadview_with_viewdir()
+ set viewdir=Xviewdir
+
+ help :mkview
+ set number
+ norm! V}zf
+ let pos = getpos('.')
+ let linefoldclosed1 = foldclosed('.')
+ mkview 1
+ set nonumber
+ norm! zrj
+
+ loadview 1
+
+ " The directory Xviewdir/ should have been created and the view
+ " should be stored in that directory.
+ let pathsep = has('win32') ? '\' : '/'
+ call assert_equal('Xviewdir' . pathsep .
+ \ substitute(
+ \ substitute(
+ \ expand('%:p'), pathsep, '=+', 'g'), ':', '=-', 'g') . '=1.vim',
+ \ glob('Xviewdir/*'))
+ call assert_equal(1, &number)
+ call assert_match('\*:mkview\*$', getline('.'))
+ call assert_equal(pos, getpos('.'))
+ call assert_equal(linefoldclosed1, foldclosed('.'))
+
+ call delete('Xviewdir', 'rf')
+ set viewdir&
+ helpclose
+endfunc
+
+func Test_mkview_no_file_name()
+ new
+ " :mkview or :mkview {nr} should fail in a unnamed buffer.
+ call assert_fails('mkview', 'E32:')
+ call assert_fails('mkview 1', 'E32:')
+
+ " :mkview {file} should succeed in a unnamed buffer.
+ mkview Xview
+ help
+ source Xview
+ call assert_equal('', bufname('%'))
+
+ call delete('Xview')
+ %bwipe
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_mksession_utf8.vim b/src/nvim/testdir/test_mksession_utf8.vim
new file mode 100644
index 0000000000..8ffbba2a1c
--- /dev/null
+++ b/src/nvim/testdir/test_mksession_utf8.vim
@@ -0,0 +1,105 @@
+" Test for :mksession, :mkview and :loadview in utf-8 encoding
+
+set encoding=utf-8
+scriptencoding utf-8
+
+if !has('multi_byte') || !has('mksession')
+ finish
+endif
+
+func Test_mksession_utf8()
+ tabnew
+ let wrap_save = &wrap
+ set sessionoptions=buffers splitbelow fileencoding=utf-8
+ call setline(1, [
+ \ 'start:',
+ \ 'no multibyte chAracter',
+ \ ' one leaDing tab',
+ \ ' four leadinG spaces',
+ \ 'two consecutive tabs',
+ \ 'two tabs in one line',
+ \ 'one โ€ฆ multibyteCharacter',
+ \ 'a โ€œbโ€ two multiByte characters',
+ \ 'โ€œcโ€1โ‚ฌ three mulTibyte characters'
+ \ ])
+ let tmpfile = tempname()
+ exec 'w! ' . tmpfile
+ /^start:
+ set wrap
+ vsplit
+ norm! j16|
+ split
+ norm! j16|
+ split
+ norm! j16|
+ split
+ norm! j8|
+ split
+ norm! j8|
+ split
+ norm! j16|
+ split
+ norm! j16|
+ split
+ norm! j16|
+ wincmd l
+
+ set nowrap
+ /^start:
+ norm! j16|3zl
+ split
+ norm! j016|3zl
+ split
+ norm! j016|3zl
+ split
+ norm! j08|3zl
+ split
+ norm! j08|3zl
+ split
+ norm! j016|3zl
+ split
+ norm! j016|3zl
+ split
+ norm! j016|3zl
+ split
+ call wincol()
+ mksession! test_mks.out
+ let li = filter(readfile('test_mks.out'), 'v:val =~# "\\(^ *normal! 0\\|^ *exe ''normal!\\)"')
+ let expected = [
+ \ 'normal! 016|',
+ \ 'normal! 016|',
+ \ 'normal! 016|',
+ \ 'normal! 08|',
+ \ 'normal! 08|',
+ \ 'normal! 016|',
+ \ 'normal! 016|',
+ \ 'normal! 016|',
+ \ " exe 'normal! ' . s:c . '|zs' . 16 . '|'",
+ \ " normal! 016|",
+ \ " exe 'normal! ' . s:c . '|zs' . 16 . '|'",
+ \ " normal! 016|",
+ \ " exe 'normal! ' . s:c . '|zs' . 16 . '|'",
+ \ " normal! 016|",
+ \ " exe 'normal! ' . s:c . '|zs' . 8 . '|'",
+ \ " normal! 08|",
+ \ " exe 'normal! ' . s:c . '|zs' . 8 . '|'",
+ \ " normal! 08|",
+ \ " exe 'normal! ' . s:c . '|zs' . 16 . '|'",
+ \ " normal! 016|",
+ \ " exe 'normal! ' . s:c . '|zs' . 16 . '|'",
+ \ " normal! 016|",
+ \ " exe 'normal! ' . s:c . '|zs' . 16 . '|'",
+ \ " normal! 016|",
+ \ " exe 'normal! ' . s:c . '|zs' . 16 . '|'",
+ \ " normal! 016|"
+ \ ]
+ call assert_equal(expected, li)
+ tabclose!
+
+ call delete('test_mks.out')
+ call delete(tmpfile)
+ let &wrap = wrap_save
+ set sessionoptions& splitbelow& fileencoding&
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_move.vim b/src/nvim/testdir/test_move.vim
new file mode 100644
index 0000000000..d774c93dbd
--- /dev/null
+++ b/src/nvim/testdir/test_move.vim
@@ -0,0 +1,40 @@
+" Test the ":move" command.
+
+func Test_move()
+ enew!
+ call append(0, ['line 1', 'line 2', 'line 3'])
+ g /^$/ delete _
+ set nomodified
+
+ move .
+ call assert_equal(['line 1', 'line 2', 'line 3'], getline(1, 3))
+ call assert_false(&modified)
+
+ 1,2move 0
+ call assert_equal(['line 1', 'line 2', 'line 3'], getline(1, 3))
+ call assert_false(&modified)
+
+ 1,3move 3
+ call assert_equal(['line 1', 'line 2', 'line 3'], getline(1, 3))
+ call assert_false(&modified)
+
+ 1move 2
+ call assert_equal(['line 2', 'line 1', 'line 3'], getline(1, 3))
+ call assert_true(&modified)
+ set nomodified
+
+ 3move 0
+ call assert_equal(['line 3', 'line 2', 'line 1'], getline(1, 3))
+ call assert_true(&modified)
+ set nomodified
+
+ 2,3move 0
+ call assert_equal(['line 2', 'line 1', 'line 3'], getline(1, 3))
+ call assert_true(&modified)
+ set nomodified
+
+ call assert_fails('1,2move 1', 'E134')
+ call assert_fails('2,3move 2', 'E134')
+
+ %bwipeout!
+endfunc
diff --git a/src/nvim/testdir/test_nested_function.vim b/src/nvim/testdir/test_nested_function.vim
new file mode 100644
index 0000000000..afaaea6ceb
--- /dev/null
+++ b/src/nvim/testdir/test_nested_function.vim
@@ -0,0 +1,63 @@
+"Tests for nested functions
+"
+func NestedFunc()
+ func! Func1()
+ let g:text .= 'Func1 '
+ endfunc
+ call Func1()
+ func! s:func2()
+ let g:text .= 's:func2 '
+ endfunc
+ call s:func2()
+ func! s:_func3()
+ let g:text .= 's:_func3 '
+ endfunc
+ call s:_func3()
+ let fn = 'Func4'
+ func! {fn}()
+ let g:text .= 'Func4 '
+ endfunc
+ call {fn}()
+ let fn = 'func5'
+ func! s:{fn}()
+ let g:text .= 's:func5'
+ endfunc
+ call s:{fn}()
+endfunc
+
+func Test_nested_functions()
+ let g:text = ''
+ call NestedFunc()
+ call assert_equal('Func1 s:func2 s:_func3 Func4 s:func5', g:text)
+endfunction
+
+func Test_nested_argument()
+ func g:X()
+ let g:Y = function('sort')
+ endfunc
+ let g:Y = function('sort')
+ echo g:Y([], g:X())
+ delfunc g:X
+ unlet g:Y
+endfunc
+
+func Recurse(count)
+ if a:count > 0
+ call Recurse(a:count - 1)
+ endif
+endfunc
+
+func Test_max_nesting()
+ let call_depth_here = 2
+ let ex_depth_here = 5
+ set mfd&
+
+ call Recurse(99 - call_depth_here)
+ call assert_fails('call Recurse(' . (100 - call_depth_here) . ')', 'E132:')
+
+ set mfd=210
+ call Recurse(209 - ex_depth_here)
+ call assert_fails('call Recurse(' . (210 - ex_depth_here) . ')', 'E169:')
+
+ set mfd&
+endfunc
diff --git a/src/nvim/testdir/test_normal.vim b/src/nvim/testdir/test_normal.vim
new file mode 100644
index 0000000000..d07b3fdbce
--- /dev/null
+++ b/src/nvim/testdir/test_normal.vim
@@ -0,0 +1,2542 @@
+" Test for various Normal mode commands
+
+source shared.vim
+
+func! Setup_NewWindow()
+ 10new
+ call setline(1, range(1,100))
+endfunc
+
+func! MyFormatExpr()
+ " Adds '->$' at lines having numbers followed by trailing whitespace
+ for ln in range(v:lnum, v:lnum+v:count-1)
+ let line = getline(ln)
+ if getline(ln) =~# '\d\s\+$'
+ call setline(ln, substitute(line, '\s\+$', '', '') . '->$')
+ endif
+ endfor
+endfunc
+
+func! CountSpaces(type, ...)
+ " for testing operatorfunc
+ " will count the number of spaces
+ " and return the result in g:a
+ let sel_save = &selection
+ let &selection = "inclusive"
+ let reg_save = @@
+
+ if a:0 " Invoked from Visual mode, use gv command.
+ silent exe "normal! gvy"
+ elseif a:type == 'line'
+ silent exe "normal! '[V']y"
+ else
+ silent exe "normal! `[v`]y"
+ endif
+ let g:a=strlen(substitute(@@, '[^ ]', '', 'g'))
+ let &selection = sel_save
+ let @@ = reg_save
+endfunc
+
+func! OpfuncDummy(type, ...)
+ " for testing operatorfunc
+ let g:opt=&linebreak
+
+ if a:0 " Invoked from Visual mode, use gv command.
+ silent exe "normal! gvy"
+ elseif a:type == 'line'
+ silent exe "normal! '[V']y"
+ else
+ silent exe "normal! `[v`]y"
+ endif
+ " Create a new dummy window
+ new
+ let g:bufnr=bufnr('%')
+endfunc
+
+fun! Test_normal00_optrans()
+ new
+ call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line'])
+ 1
+ exe "norm! Sfoobar\<esc>"
+ call assert_equal(['foobar', '2 This is the second line', '3 this is the third line', ''], getline(1,'$'))
+ 2
+ exe "norm! $vbsone"
+ call assert_equal(['foobar', '2 This is the second one', '3 this is the third line', ''], getline(1,'$'))
+ norm! VS Second line here
+ call assert_equal(['foobar', ' Second line here', '3 this is the third line', ''], getline(1, '$'))
+ %d
+ call append(0, ['4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line'])
+ call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line'])
+
+ 1
+ norm! 2D
+ call assert_equal(['3 this is the third line', '4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line', ''], getline(1,'$'))
+ " Nvim: no "#" flag in 'cpoptions'.
+ " set cpo+=#
+ " norm! 4D
+ " call assert_equal(['', '4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line', ''], getline(1,'$'))
+
+ " clean up
+ set cpo-=#
+ bw!
+endfunc
+
+func! Test_normal01_keymodel()
+ throw "skipped: Nvim regression: 'keymodel'"
+ call Setup_NewWindow()
+ " Test 1: depending on 'keymodel' <s-down> does something different
+ 50
+ call feedkeys("V\<S-Up>y", 'tx')
+ call assert_equal(['47', '48', '49', '50'], getline("'<", "'>"))
+ set keymodel=startsel
+ 50
+ call feedkeys("V\<S-Up>y", 'tx')
+ call assert_equal(['49', '50'], getline("'<", "'>"))
+ " Start visual mode when keymodel = startsel
+ 50
+ call feedkeys("\<S-Up>y", 'tx')
+ call assert_equal(['49', '5'], getreg(0, 0, 1))
+ " Do not start visual mode when keymodel=
+ set keymodel=
+ 50
+ call feedkeys("\<S-Up>y$", 'tx')
+ call assert_equal(['42'], getreg(0, 0, 1))
+ " Stop visual mode when keymodel=stopsel
+ set keymodel=stopsel
+ 50
+ call feedkeys("Vkk\<Up>yy", 'tx')
+ call assert_equal(['47'], getreg(0, 0, 1))
+
+ set keymodel=
+ 50
+ call feedkeys("Vkk\<Up>yy", 'tx')
+ call assert_equal(['47', '48', '49', '50'], getreg(0, 0, 1))
+
+ " clean up
+ bw!
+endfunc
+
+func! Test_normal02_selectmode()
+ " some basic select mode tests
+ call Setup_NewWindow()
+ 50
+ norm! gHy
+ call assert_equal('y51', getline('.'))
+ call setline(1, range(1,100))
+ 50
+ exe ":norm! V9jo\<c-g>y"
+ call assert_equal('y60', getline('.'))
+ " clean up
+ bw!
+endfunc
+
+func! Test_normal02_selectmode2()
+ " some basic select mode tests
+ call Setup_NewWindow()
+ 50
+ call feedkeys(":set im\n\<c-o>gHc\<c-o>:set noim\n", 'tx')
+ call assert_equal('c51', getline('.'))
+ " clean up
+ bw!
+endfunc
+
+func! Test_normal03_join()
+ " basic join test
+ call Setup_NewWindow()
+ 50
+ norm! VJ
+ call assert_equal('50 51', getline('.'))
+ $
+ norm! J
+ call assert_equal('100', getline('.'))
+ $
+ norm! V9-gJ
+ call assert_equal('919293949596979899100', getline('.'))
+ call setline(1, range(1,100))
+ $
+ :j 10
+ call assert_equal('100', getline('.'))
+ " clean up
+ bw!
+endfunc
+
+func! Test_normal04_filter()
+ " basic filter test
+ " only test on non windows platform
+ if has('win32')
+ return
+ endif
+ call Setup_NewWindow()
+ 1
+ call feedkeys("!!sed -e 's/^/| /'\n", 'tx')
+ call assert_equal('| 1', getline('.'))
+ 90
+ :sil :!echo one
+ call feedkeys('.', 'tx')
+ call assert_equal('| 90', getline('.'))
+ 95
+ set cpo+=!
+ " 2 <CR>, 1: for executing the command,
+ " 2: clear hit-enter-prompt
+ call feedkeys("!!\n", 'tx')
+ call feedkeys(":!echo one\n\n", 'tx')
+ call feedkeys(".", 'tx')
+ call assert_equal('one', getline('.'))
+ set cpo-=!
+ bw!
+endfunc
+
+func! Test_normal05_formatexpr()
+ " basic formatexpr test
+ call Setup_NewWindow()
+ %d_
+ call setline(1, ['here: 1 ', '2', 'here: 3 ', '4', 'not here: '])
+ 1
+ set formatexpr=MyFormatExpr()
+ norm! gqG
+ call assert_equal(['here: 1->$', '2', 'here: 3->$', '4', 'not here: '], getline(1,'$'))
+ set formatexpr=
+ bw!
+endfunc
+
+func Test_normal05_formatexpr_newbuf()
+ " Edit another buffer in the 'formatexpr' function
+ new
+ func! Format()
+ edit another
+ endfunc
+ set formatexpr=Format()
+ norm gqG
+ bw!
+ set formatexpr=
+endfunc
+
+func Test_normal05_formatexpr_setopt()
+ " Change the 'formatexpr' value in the function
+ new
+ func! Format()
+ set formatexpr=
+ endfunc
+ set formatexpr=Format()
+ norm gqG
+ bw!
+ set formatexpr=
+endfunc
+
+func! Test_normal06_formatprg()
+ " basic test for formatprg
+ " only test on non windows platform
+ if has('win32')
+ return
+ endif
+
+ " uses sed to number non-empty lines
+ call writefile(['#!/bin/sh', 'sed ''/./=''|sed ''/./{', 'N', 's/\n/ /', '}'''], 'Xsed_format.sh')
+ call system('chmod +x ./Xsed_format.sh')
+ let text = ['a', '', 'c', '', ' ', 'd', 'e']
+ let expected = ['1 a', '', '3 c', '', '5 ', '6 d', '7 e']
+
+ 10new
+ call setline(1, text)
+ set formatprg=./Xsed_format.sh
+ norm! gggqG
+ call assert_equal(expected, getline(1, '$'))
+ bw!
+
+ 10new
+ call setline(1, text)
+ set formatprg=donothing
+ setlocal formatprg=./Xsed_format.sh
+ norm! gggqG
+ call assert_equal(expected, getline(1, '$'))
+ bw!
+
+ " clean up
+ set formatprg=
+ setlocal formatprg=
+ call delete('Xsed_format.sh')
+endfunc
+
+func! Test_normal07_internalfmt()
+ " basic test for internal formmatter to textwidth of 12
+ let list=range(1,11)
+ call map(list, 'v:val." "')
+ 10new
+ call setline(1, list)
+ set tw=12
+ norm! gggqG
+ call assert_equal(['1 2 3', '4 5 6', '7 8 9', '10 11 '], getline(1, '$'))
+ " clean up
+ set tw=0
+ bw!
+endfunc
+
+func! Test_normal08_fold()
+ " basic tests for foldopen/folddelete
+ if !has("folding")
+ return
+ endif
+ call Setup_NewWindow()
+ 50
+ setl foldenable fdm=marker
+ " First fold
+ norm! V4jzf
+ " check that folds have been created
+ call assert_equal(['50/*{{{*/', '51', '52', '53', '54/*}}}*/'], getline(50,54))
+ " Second fold
+ 46
+ norm! V10jzf
+ " check that folds have been created
+ call assert_equal('46/*{{{*/', getline(46))
+ call assert_equal('60/*}}}*/', getline(60))
+ norm! k
+ call assert_equal('45', getline('.'))
+ norm! j
+ call assert_equal('46/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('61', getline('.'))
+ norm! k
+ " open a fold
+ norm! Vzo
+ norm! k
+ call assert_equal('45', getline('.'))
+ norm! j
+ call assert_equal('46/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('47', getline('.'))
+ norm! k
+ norm! zcVzO
+ call assert_equal('46/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('47', getline('.'))
+ norm! j
+ call assert_equal('48', getline('.'))
+ norm! j
+ call assert_equal('49', getline('.'))
+ norm! j
+ call assert_equal('50/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('51', getline('.'))
+ " delete folds
+ :46
+ " collapse fold
+ norm! V14jzC
+ " delete all folds recursively
+ norm! VzD
+ call assert_equal(['46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60'], getline(46,60))
+
+ " clean up
+ setl nofoldenable fdm=marker
+ bw!
+endfunc
+
+func! Test_normal09_operatorfunc()
+ " Test operatorfunc
+ call Setup_NewWindow()
+ " Add some spaces for counting
+ 50,60s/$/ /
+ unlet! g:a
+ let g:a=0
+ nmap <buffer><silent> ,, :set opfunc=CountSpaces<CR>g@
+ vmap <buffer><silent> ,, :<C-U>call CountSpaces(visualmode(), 1)<CR>
+ 50
+ norm V2j,,
+ call assert_equal(6, g:a)
+ norm V,,
+ call assert_equal(2, g:a)
+ norm ,,l
+ call assert_equal(0, g:a)
+ 50
+ exe "norm 0\<c-v>10j2l,,"
+ call assert_equal(11, g:a)
+ 50
+ norm V10j,,
+ call assert_equal(22, g:a)
+
+ " clean up
+ unmap <buffer> ,,
+ set opfunc=
+ unlet! g:a
+ bw!
+endfunc
+
+func! Test_normal09a_operatorfunc()
+ " Test operatorfunc
+ call Setup_NewWindow()
+ " Add some spaces for counting
+ 50,60s/$/ /
+ unlet! g:opt
+ set linebreak
+ nmap <buffer><silent> ,, :set opfunc=OpfuncDummy<CR>g@
+ 50
+ norm ,,j
+ exe "bd!" g:bufnr
+ call assert_true(&linebreak)
+ call assert_equal(g:opt, &linebreak)
+ set nolinebreak
+ norm ,,j
+ exe "bd!" g:bufnr
+ call assert_false(&linebreak)
+ call assert_equal(g:opt, &linebreak)
+
+ " clean up
+ unmap <buffer> ,,
+ set opfunc=
+ bw!
+ unlet! g:opt
+endfunc
+
+func! Test_normal10_expand()
+ " Test for expand()
+ 10new
+ call setline(1, ['1', 'ifooar,,cbar'])
+ 2
+ norm! $
+ call assert_equal('cbar', expand('<cword>'))
+ call assert_equal('ifooar,,cbar', expand('<cWORD>'))
+
+ call setline(1, ['prx = list[idx];'])
+ 1
+ let expected = ['', 'prx', 'prx', 'prx',
+ \ 'list', 'list', 'list', 'list', 'list', 'list', 'list',
+ \ 'idx', 'idx', 'idx', 'idx',
+ \ 'list[idx]',
+ \ '];',
+ \ ]
+ for i in range(1, 16)
+ exe 'norm ' . i . '|'
+ call assert_equal(expected[i], expand('<cexpr>'), 'i == ' . i)
+ endfor
+
+ if executable('echo')
+ " Test expand(`...`) i.e. backticks command expansion.
+ " MS-Windows has a trailing space.
+ call assert_match('^abcde *$', expand('`echo abcde`'))
+ endif
+
+ " Test expand(`=...`) i.e. backticks expression expansion
+ call assert_equal('5', expand('`=2+3`'))
+
+ " clean up
+ bw!
+endfunc
+
+func! Test_normal11_showcmd()
+ " test for 'showcmd'
+ 10new
+ exe "norm! ofoobar\<esc>"
+ call assert_equal(2, line('$'))
+ set showcmd
+ exe "norm! ofoobar2\<esc>"
+ call assert_equal(3, line('$'))
+ exe "norm! VAfoobar3\<esc>"
+ call assert_equal(3, line('$'))
+ exe "norm! 0d3\<del>2l"
+ call assert_equal('obar2foobar3', getline('.'))
+ bw!
+endfunc
+
+func! Test_normal12_nv_error()
+ " Test for nv_error
+ 10new
+ call setline(1, range(1,5))
+ " should not do anything, just beep
+ exe "norm! <c-k>"
+ call assert_equal(map(range(1,5), 'string(v:val)'), getline(1,'$'))
+ bw!
+endfunc
+
+func! Test_normal13_help()
+ " Test for F1
+ call assert_equal(1, winnr())
+ call feedkeys("\<f1>", 'txi')
+ call assert_match('help\.txt', bufname('%'))
+ call assert_equal(2, winnr('$'))
+ bw!
+endfunc
+
+func! Test_normal14_page()
+ " basic test for Ctrl-F and Ctrl-B
+ call Setup_NewWindow()
+ exe "norm! \<c-f>"
+ call assert_equal('9', getline('.'))
+ exe "norm! 2\<c-f>"
+ call assert_equal('25', getline('.'))
+ exe "norm! 2\<c-b>"
+ call assert_equal('18', getline('.'))
+ 1
+ set scrolloff=5
+ exe "norm! 2\<c-f>"
+ call assert_equal('21', getline('.'))
+ exe "norm! \<c-b>"
+ call assert_equal('13', getline('.'))
+ 1
+ set scrolloff=99
+ exe "norm! \<c-f>"
+ call assert_equal('13', getline('.'))
+ set scrolloff=0
+ 100
+ exe "norm! $\<c-b>"
+ call assert_equal('92', getline('.'))
+ call assert_equal([0, 92, 1, 0, 1], getcurpos())
+ 100
+ set nostartofline
+ exe "norm! $\<c-b>"
+ call assert_equal('92', getline('.'))
+ call assert_equal([0, 92, 2, 0, 2147483647], getcurpos())
+ " cleanup
+ set startofline
+ bw!
+endfunc
+
+func! Test_normal14_page_eol()
+ 10new
+ norm oxxxxxxx
+ exe "norm 2\<c-f>"
+ " check with valgrind that cursor is put back in column 1
+ exe "norm 2\<c-b>"
+ bw!
+endfunc
+
+func! Test_normal15_z_scroll_vert()
+ " basic test for z commands that scroll the window
+ call Setup_NewWindow()
+ 100
+ norm! >>
+ " Test for z<cr>
+ exe "norm! z\<cr>"
+ call assert_equal(' 100', getline('.'))
+ call assert_equal(100, winsaveview()['topline'])
+ call assert_equal([0, 100, 2, 0, 9], getcurpos())
+
+ " Test for zt
+ 21
+ norm! >>0zt
+ call assert_equal(' 21', getline('.'))
+ call assert_equal(21, winsaveview()['topline'])
+ call assert_equal([0, 21, 1, 0, 8], getcurpos())
+
+ " Test for zb
+ 30
+ norm! >>$ztzb
+ call assert_equal(' 30', getline('.'))
+ call assert_equal(30, winsaveview()['topline']+winheight(0)-1)
+ call assert_equal([0, 30, 3, 0, 2147483647], getcurpos())
+
+ " Test for z-
+ 1
+ 30
+ norm! 0z-
+ call assert_equal(' 30', getline('.'))
+ call assert_equal(30, winsaveview()['topline']+winheight(0)-1)
+ call assert_equal([0, 30, 2, 0, 9], getcurpos())
+
+ " Test for z{height}<cr>
+ call assert_equal(10, winheight(0))
+ exe "norm! z12\<cr>"
+ call assert_equal(12, winheight(0))
+ exe "norm! z10\<cr>"
+ call assert_equal(10, winheight(0))
+
+ " Test for z.
+ 1
+ 21
+ norm! 0z.
+ call assert_equal(' 21', getline('.'))
+ call assert_equal(17, winsaveview()['topline'])
+ call assert_equal([0, 21, 2, 0, 9], getcurpos())
+
+ " Test for zz
+ 1
+ 21
+ norm! 0zz
+ call assert_equal(' 21', getline('.'))
+ call assert_equal(17, winsaveview()['topline'])
+ call assert_equal([0, 21, 1, 0, 8], getcurpos())
+
+ " Test for z+
+ 11
+ norm! zt
+ norm! z+
+ call assert_equal(' 21', getline('.'))
+ call assert_equal(21, winsaveview()['topline'])
+ call assert_equal([0, 21, 2, 0, 9], getcurpos())
+
+ " Test for [count]z+
+ 1
+ norm! 21z+
+ call assert_equal(' 21', getline('.'))
+ call assert_equal(21, winsaveview()['topline'])
+ call assert_equal([0, 21, 2, 0, 9], getcurpos())
+
+ " Test for z^
+ norm! 22z+0
+ norm! z^
+ call assert_equal(' 21', getline('.'))
+ call assert_equal(12, winsaveview()['topline'])
+ call assert_equal([0, 21, 2, 0, 9], getcurpos())
+
+ " Test for [count]z^
+ 1
+ norm! 30z^
+ call assert_equal(' 21', getline('.'))
+ call assert_equal(12, winsaveview()['topline'])
+ call assert_equal([0, 21, 2, 0, 9], getcurpos())
+
+ " cleanup
+ bw!
+endfunc
+
+func! Test_normal16_z_scroll_hor()
+ " basic test for z commands that scroll the window
+ 10new
+ 15vsp
+ set nowrap listchars=
+ let lineA='abcdefghijklmnopqrstuvwxyz'
+ let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+ $put =lineA
+ $put =lineB
+ 1d
+
+ " Test for zl
+ 1
+ norm! 5zl
+ call assert_equal(lineA, getline('.'))
+ call assert_equal(6, col('.'))
+ call assert_equal(5, winsaveview()['leftcol'])
+ norm! yl
+ call assert_equal('f', @0)
+
+ " Test for zh
+ norm! 2zh
+ call assert_equal(lineA, getline('.'))
+ call assert_equal(6, col('.'))
+ norm! yl
+ call assert_equal('f', @0)
+ call assert_equal(3, winsaveview()['leftcol'])
+
+ " Test for zL
+ norm! zL
+ call assert_equal(11, col('.'))
+ norm! yl
+ call assert_equal('k', @0)
+ call assert_equal(10, winsaveview()['leftcol'])
+ norm! 2zL
+ call assert_equal(25, col('.'))
+ norm! yl
+ call assert_equal('y', @0)
+ call assert_equal(24, winsaveview()['leftcol'])
+
+ " Test for zH
+ norm! 2zH
+ call assert_equal(25, col('.'))
+ call assert_equal(10, winsaveview()['leftcol'])
+ norm! yl
+ call assert_equal('y', @0)
+
+ " Test for zs
+ norm! $zs
+ call assert_equal(26, col('.'))
+ call assert_equal(25, winsaveview()['leftcol'])
+ norm! yl
+ call assert_equal('z', @0)
+
+ " Test for ze
+ norm! ze
+ call assert_equal(26, col('.'))
+ call assert_equal(11, winsaveview()['leftcol'])
+ norm! yl
+ call assert_equal('z', @0)
+
+ " cleanup
+ set wrap listchars=eol:$
+ bw!
+endfunc
+
+func! Test_normal17_z_scroll_hor2()
+ " basic test for z commands that scroll the window
+ " using 'sidescrolloff' setting
+ 10new
+ 20vsp
+ set nowrap listchars= sidescrolloff=5
+ let lineA='abcdefghijklmnopqrstuvwxyz'
+ let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+ $put =lineA
+ $put =lineB
+ 1d
+
+ " Test for zl
+ 1
+ norm! 5zl
+ call assert_equal(lineA, getline('.'))
+ call assert_equal(11, col('.'))
+ call assert_equal(5, winsaveview()['leftcol'])
+ norm! yl
+ call assert_equal('k', @0)
+
+ " Test for zh
+ norm! 2zh
+ call assert_equal(lineA, getline('.'))
+ call assert_equal(11, col('.'))
+ norm! yl
+ call assert_equal('k', @0)
+ call assert_equal(3, winsaveview()['leftcol'])
+
+ " Test for zL
+ norm! 0zL
+ call assert_equal(16, col('.'))
+ norm! yl
+ call assert_equal('p', @0)
+ call assert_equal(10, winsaveview()['leftcol'])
+ norm! 2zL
+ call assert_equal(26, col('.'))
+ norm! yl
+ call assert_equal('z', @0)
+ call assert_equal(15, winsaveview()['leftcol'])
+
+ " Test for zH
+ norm! 2zH
+ call assert_equal(15, col('.'))
+ call assert_equal(0, winsaveview()['leftcol'])
+ norm! yl
+ call assert_equal('o', @0)
+
+ " Test for zs
+ norm! $zs
+ call assert_equal(26, col('.'))
+ call assert_equal(20, winsaveview()['leftcol'])
+ norm! yl
+ call assert_equal('z', @0)
+
+ " Test for ze
+ norm! ze
+ call assert_equal(26, col('.'))
+ call assert_equal(11, winsaveview()['leftcol'])
+ norm! yl
+ call assert_equal('z', @0)
+
+ " cleanup
+ set wrap listchars=eol:$ sidescrolloff=0
+ bw!
+endfunc
+
+func! Test_normal18_z_fold()
+ " basic tests for foldopen/folddelete
+ if !has("folding")
+ return
+ endif
+ call Setup_NewWindow()
+ 50
+ setl foldenable fdm=marker foldlevel=5
+
+ " Test for zF
+ " First fold
+ norm! 4zF
+ " check that folds have been created
+ call assert_equal(['50/*{{{*/', '51', '52', '53/*}}}*/'], getline(50,53))
+
+ " Test for zd
+ 51
+ norm! 2zF
+ call assert_equal(2, foldlevel('.'))
+ norm! kzd
+ call assert_equal(['50', '51/*{{{*/', '52/*}}}*/', '53'], getline(50,53))
+ norm! j
+ call assert_equal(1, foldlevel('.'))
+
+ " Test for zD
+ " also deletes partially selected folds recursively
+ 51
+ norm! zF
+ call assert_equal(2, foldlevel('.'))
+ norm! kV2jzD
+ call assert_equal(['50', '51', '52', '53'], getline(50,53))
+
+ " Test for zE
+ 85
+ norm! 4zF
+ 86
+ norm! 2zF
+ 90
+ norm! 4zF
+ call assert_equal(['85/*{{{*/', '86/*{{{*/', '87/*}}}*/', '88/*}}}*/', '89', '90/*{{{*/', '91', '92', '93/*}}}*/'], getline(85,93))
+ norm! zE
+ call assert_equal(['85', '86', '87', '88', '89', '90', '91', '92', '93'], getline(85,93))
+
+ " Test for zn
+ 50
+ set foldlevel=0
+ norm! 2zF
+ norm! zn
+ norm! k
+ call assert_equal('49', getline('.'))
+ norm! j
+ call assert_equal('50/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('51/*}}}*/', getline('.'))
+ norm! j
+ call assert_equal('52', getline('.'))
+ call assert_equal(0, &foldenable)
+
+ " Test for zN
+ 49
+ norm! zN
+ call assert_equal('49', getline('.'))
+ norm! j
+ call assert_equal('50/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('52', getline('.'))
+ call assert_equal(1, &foldenable)
+
+ " Test for zi
+ norm! zi
+ call assert_equal(0, &foldenable)
+ norm! zi
+ call assert_equal(1, &foldenable)
+ norm! zi
+ call assert_equal(0, &foldenable)
+ norm! zi
+ call assert_equal(1, &foldenable)
+
+ " Test for za
+ 50
+ norm! za
+ norm! k
+ call assert_equal('49', getline('.'))
+ norm! j
+ call assert_equal('50/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('51/*}}}*/', getline('.'))
+ norm! j
+ call assert_equal('52', getline('.'))
+ 50
+ norm! za
+ norm! k
+ call assert_equal('49', getline('.'))
+ norm! j
+ call assert_equal('50/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('52', getline('.'))
+
+ 49
+ norm! 5zF
+ norm! k
+ call assert_equal('48', getline('.'))
+ norm! j
+ call assert_equal('49/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('55', getline('.'))
+ 49
+ norm! za
+ call assert_equal('49/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('50/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('52', getline('.'))
+ set nofoldenable
+ " close fold and set foldenable
+ norm! za
+ call assert_equal(1, &foldenable)
+
+ 50
+ " have to use {count}za to open all folds and make the cursor visible
+ norm! 2za
+ norm! 2k
+ call assert_equal('48', getline('.'))
+ norm! j
+ call assert_equal('49/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('50/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('51/*}}}*/', getline('.'))
+ norm! j
+ call assert_equal('52', getline('.'))
+
+ " Test for zA
+ 49
+ set foldlevel=0
+ 50
+ norm! zA
+ norm! 2k
+ call assert_equal('48', getline('.'))
+ norm! j
+ call assert_equal('49/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('50/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('51/*}}}*/', getline('.'))
+ norm! j
+ call assert_equal('52', getline('.'))
+
+ " zA on a opened fold when foldenable is not set
+ 50
+ set nofoldenable
+ norm! zA
+ call assert_equal(1, &foldenable)
+ norm! k
+ call assert_equal('48', getline('.'))
+ norm! j
+ call assert_equal('49/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('55', getline('.'))
+
+ " Test for zc
+ norm! zE
+ 50
+ norm! 2zF
+ 49
+ norm! 5zF
+ set nofoldenable
+ 50
+ " There most likely is a bug somewhere:
+ " https://groups.google.com/d/msg/vim_dev/v2EkfJ_KQjI/u-Cvv94uCAAJ
+ " TODO: Should this only close the inner most fold or both folds?
+ norm! zc
+ call assert_equal(1, &foldenable)
+ norm! k
+ call assert_equal('48', getline('.'))
+ norm! j
+ call assert_equal('49/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('55', getline('.'))
+ set nofoldenable
+ 50
+ norm! Vjzc
+ norm! k
+ call assert_equal('48', getline('.'))
+ norm! j
+ call assert_equal('49/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('55', getline('.'))
+
+ " Test for zC
+ set nofoldenable
+ 50
+ norm! zCk
+ call assert_equal('48', getline('.'))
+ norm! j
+ call assert_equal('49/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('55', getline('.'))
+
+ " Test for zx
+ " 1) close folds at line 49-54
+ set nofoldenable
+ 48
+ norm! zx
+ call assert_equal(1, &foldenable)
+ norm! j
+ call assert_equal('49/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('55', getline('.'))
+
+ " 2) do not close fold under cursor
+ 51
+ set nofoldenable
+ norm! zx
+ call assert_equal(1, &foldenable)
+ norm! 3k
+ call assert_equal('48', getline('.'))
+ norm! j
+ call assert_equal('49/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('50/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('51/*}}}*/', getline('.'))
+ norm! j
+ call assert_equal('52', getline('.'))
+ norm! j
+ call assert_equal('53', getline('.'))
+ norm! j
+ call assert_equal('54/*}}}*/', getline('.'))
+ norm! j
+ call assert_equal('55', getline('.'))
+
+ " 3) close one level of folds
+ 48
+ set nofoldenable
+ set foldlevel=1
+ norm! zx
+ call assert_equal(1, &foldenable)
+ call assert_equal('48', getline('.'))
+ norm! j
+ call assert_equal('49/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('50/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('52', getline('.'))
+ norm! j
+ call assert_equal('53', getline('.'))
+ norm! j
+ call assert_equal('54/*}}}*/', getline('.'))
+ norm! j
+ call assert_equal('55', getline('.'))
+
+ " Test for zX
+ " Close all folds
+ set foldlevel=0 nofoldenable
+ 50
+ norm! zX
+ call assert_equal(1, &foldenable)
+ norm! k
+ call assert_equal('48', getline('.'))
+ norm! j
+ call assert_equal('49/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('55', getline('.'))
+
+ " Test for zm
+ 50
+ set nofoldenable foldlevel=2
+ norm! zm
+ call assert_equal(1, &foldenable)
+ call assert_equal(1, &foldlevel)
+ norm! zm
+ call assert_equal(0, &foldlevel)
+ norm! zm
+ call assert_equal(0, &foldlevel)
+ norm! k
+ call assert_equal('48', getline('.'))
+ norm! j
+ call assert_equal('49/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('55', getline('.'))
+
+ " Test for zM
+ 48
+ set nofoldenable foldlevel=99
+ norm! zM
+ call assert_equal(1, &foldenable)
+ call assert_equal(0, &foldlevel)
+ call assert_equal('48', getline('.'))
+ norm! j
+ call assert_equal('49/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('55', getline('.'))
+
+ " Test for zr
+ 48
+ set nofoldenable foldlevel=0
+ norm! zr
+ call assert_equal(0, &foldenable)
+ call assert_equal(1, &foldlevel)
+ set foldlevel=0 foldenable
+ norm! zr
+ call assert_equal(1, &foldenable)
+ call assert_equal(1, &foldlevel)
+ norm! zr
+ call assert_equal(2, &foldlevel)
+ call assert_equal('48', getline('.'))
+ norm! j
+ call assert_equal('49/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('50/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('51/*}}}*/', getline('.'))
+ norm! j
+ call assert_equal('52', getline('.'))
+
+ " Test for zR
+ 48
+ set nofoldenable foldlevel=0
+ norm! zR
+ call assert_equal(0, &foldenable)
+ call assert_equal(2, &foldlevel)
+ set foldenable foldlevel=0
+ norm! zR
+ call assert_equal(1, &foldenable)
+ call assert_equal(2, &foldlevel)
+ call assert_equal('48', getline('.'))
+ norm! j
+ call assert_equal('49/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('50/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('51/*}}}*/', getline('.'))
+ norm! j
+ call assert_equal('52', getline('.'))
+ call append(50, ['a /*{{{*/', 'b /*}}}*/'])
+ 48
+ call assert_equal('48', getline('.'))
+ norm! j
+ call assert_equal('49/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('50/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('a /*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('51/*}}}*/', getline('.'))
+ norm! j
+ call assert_equal('52', getline('.'))
+ 48
+ norm! zR
+ call assert_equal(1, &foldenable)
+ call assert_equal(3, &foldlevel)
+ call assert_equal('48', getline('.'))
+ norm! j
+ call assert_equal('49/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('50/*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('a /*{{{*/', getline('.'))
+ norm! j
+ call assert_equal('b /*}}}*/', getline('.'))
+ norm! j
+ call assert_equal('51/*}}}*/', getline('.'))
+ norm! j
+ call assert_equal('52', getline('.'))
+
+ " clean up
+ setl nofoldenable fdm=marker foldlevel=0
+ bw!
+endfunc
+
+func! Test_normal19_z_spell()
+ if !has("spell") || !has('syntax')
+ return
+ endif
+ new
+ call append(0, ['1 good', '2 goood', '3 goood'])
+ set spell spellfile=./Xspellfile.add spelllang=en
+ let oldlang=v:lang
+ lang C
+
+ " Test for zg
+ 1
+ norm! ]s
+ call assert_equal('2 goood', getline('.'))
+ norm! zg
+ 1
+ let a=execute('unsilent :norm! ]s')
+ call assert_equal('1 good', getline('.'))
+ call assert_equal('search hit BOTTOM, continuing at TOP', a[1:])
+ let cnt=readfile('./Xspellfile.add')
+ call assert_equal('goood', cnt[0])
+
+ " Test for zw
+ 2
+ norm! $zw
+ 1
+ norm! ]s
+ call assert_equal('2 goood', getline('.'))
+ let cnt=readfile('./Xspellfile.add')
+ call assert_equal('#oood', cnt[0])
+ call assert_equal('goood/!', cnt[1])
+
+ " Test for zg in visual mode
+ let a=execute('unsilent :norm! V$zg')
+ call assert_equal("Word '2 goood' added to ./Xspellfile.add", a[1:])
+ 1
+ norm! ]s
+ call assert_equal('3 goood', getline('.'))
+ let cnt=readfile('./Xspellfile.add')
+ call assert_equal('2 goood', cnt[2])
+ " Remove "2 good" from spellfile
+ 2
+ let a=execute('unsilent norm! V$zw')
+ call assert_equal("Word '2 goood' added to ./Xspellfile.add", a[1:])
+ let cnt=readfile('./Xspellfile.add')
+ call assert_equal('2 goood/!', cnt[3])
+
+ " Test for zG
+ let a=execute('unsilent norm! V$zG')
+ call assert_match("Word '2 goood' added to .*", a)
+ let fname=matchstr(a, 'to\s\+\zs\f\+$')
+ let fname=Fix_truncated_tmpfile(fname)
+ let cnt=readfile(fname)
+ call assert_equal('2 goood', cnt[0])
+
+ " Test for zW
+ let a=execute('unsilent norm! V$zW')
+ call assert_match("Word '2 goood' added to .*", a)
+ let cnt=readfile(fname)
+ call assert_equal('# goood', cnt[0])
+ call assert_equal('2 goood/!', cnt[1])
+
+ " Test for zuW
+ let a=execute('unsilent norm! V$zuW')
+ call assert_match("Word '2 goood' removed from .*", a)
+ let cnt=readfile(fname)
+ call assert_equal('# goood', cnt[0])
+ call assert_equal('# goood/!', cnt[1])
+
+ " Test for zuG
+ let a=execute('unsilent norm! $zG')
+ call assert_match("Word 'goood' added to .*", a)
+ let cnt=readfile(fname)
+ call assert_equal('# goood', cnt[0])
+ call assert_equal('# goood/!', cnt[1])
+ call assert_equal('goood', cnt[2])
+ let a=execute('unsilent norm! $zuG')
+ let cnt=readfile(fname)
+ call assert_match("Word 'goood' removed from .*", a)
+ call assert_equal('# goood', cnt[0])
+ call assert_equal('# goood/!', cnt[1])
+ call assert_equal('#oood', cnt[2])
+ " word not found in wordlist
+ let a=execute('unsilent norm! V$zuG')
+ let cnt=readfile(fname)
+ call assert_match("", a)
+ call assert_equal('# goood', cnt[0])
+ call assert_equal('# goood/!', cnt[1])
+ call assert_equal('#oood', cnt[2])
+
+ " Test for zug
+ call delete('./Xspellfile.add')
+ 2
+ let a=execute('unsilent norm! $zg')
+ let cnt=readfile('./Xspellfile.add')
+ call assert_equal('goood', cnt[0])
+ let a=execute('unsilent norm! $zug')
+ call assert_match("Word 'goood' removed from \./Xspellfile.add", a)
+ let cnt=readfile('./Xspellfile.add')
+ call assert_equal('#oood', cnt[0])
+ " word not in wordlist
+ let a=execute('unsilent norm! V$zug')
+ call assert_match('', a)
+ let cnt=readfile('./Xspellfile.add')
+ call assert_equal('#oood', cnt[0])
+
+ " Test for zuw
+ call delete('./Xspellfile.add')
+ 2
+ let a=execute('unsilent norm! Vzw')
+ let cnt=readfile('./Xspellfile.add')
+ call assert_equal('2 goood/!', cnt[0])
+ let a=execute('unsilent norm! Vzuw')
+ call assert_match("Word '2 goood' removed from \./Xspellfile.add", a)
+ let cnt=readfile('./Xspellfile.add')
+ call assert_equal('# goood/!', cnt[0])
+ " word not in wordlist
+ let a=execute('unsilent norm! $zug')
+ call assert_match('', a)
+ let cnt=readfile('./Xspellfile.add')
+ call assert_equal('# goood/!', cnt[0])
+
+ " add second entry to spellfile setting
+ set spellfile=./Xspellfile.add,./Xspellfile2.add
+ call delete('./Xspellfile.add')
+ 2
+ let a=execute('unsilent norm! $2zg')
+ let cnt=readfile('./Xspellfile2.add')
+ call assert_match("Word 'goood' added to ./Xspellfile2.add", a)
+ call assert_equal('goood', cnt[0])
+
+ " Test for :spellgood!
+ let temp = execute(':spe!0/0')
+ call assert_match('Invalid region', temp)
+ let spellfile = matchstr(temp, 'Invalid region nr in \zs.*\ze line \d: 0')
+ call assert_equal(['# goood', '# goood/!', '#oood', '0/0'], readfile(spellfile))
+ call delete(spellfile)
+
+ " clean up
+ exe "lang" oldlang
+ call delete("./Xspellfile.add")
+ call delete("./Xspellfile2.add")
+ call delete("./Xspellfile.add.spl")
+ call delete("./Xspellfile2.add.spl")
+
+ " zux -> no-op
+ 2
+ norm! $zux
+ call assert_equal([], glob('Xspellfile.add',0,1))
+ call assert_equal([], glob('Xspellfile2.add',0,1))
+
+ set spellfile=
+ bw!
+endfunc
+
+func! Test_normal20_exmode()
+ if !has("unix")
+ " Reading from redirected file doesn't work on MS-Windows
+ return
+ endif
+ call writefile(['1a', 'foo', 'bar', '.', 'w! Xfile2', 'q!'], 'Xscript')
+ call writefile(['1', '2'], 'Xfile')
+ call system(v:progpath .' -e -s < Xscript Xfile')
+ let a=readfile('Xfile2')
+ call assert_equal(['1', 'foo', 'bar', '2'], a)
+
+ " clean up
+ for file in ['Xfile', 'Xfile2', 'Xscript']
+ call delete(file)
+ endfor
+ bw!
+endfunc
+
+func! Test_normal21_nv_hat()
+ set hidden
+ new
+ " to many buffers opened already, will not work
+ "call assert_fails(":b#", 'E23')
+ "call assert_equal('', @#)
+ e Xfoobar
+ e Xfile2
+ call feedkeys("\<c-^>", 't')
+ call assert_equal("Xfile2", fnamemodify(bufname('%'), ':t'))
+ call feedkeys("f\<c-^>", 't')
+ call assert_equal("Xfile2", fnamemodify(bufname('%'), ':t'))
+ " clean up
+ set nohidden
+ bw!
+endfunc
+
+func! Test_normal22_zet()
+ " Test for ZZ
+ " let shell = &shell
+ " let &shell = 'sh'
+
+ " Remove any stale test files from previous run.
+ for file in ['Xfile_Test_normal22_zet']
+ call delete(file)
+ endfor
+
+ call writefile(['1', '2'], 'Xfile_Test_normal22_zet')
+ let args = ' --headless -u NONE -N -U NONE -i NONE --noplugins'
+ call system(v:progpath . args . ' -c "%d" -c ":norm! ZZ" Xfile_Test_normal22_zet')
+ let a = readfile('Xfile_Test_normal22_zet')
+ call assert_equal([], a)
+ " Test for ZQ
+ call writefile(['1', '2'], 'Xfile_Test_normal22_zet')
+ call system(v:progpath . args . ' -c "%d" -c ":norm! ZQ" Xfile_Test_normal22_zet')
+ let a = readfile('Xfile_Test_normal22_zet')
+ call assert_equal(['1', '2'], a)
+
+ " Nvim: This sometimes hangs the TSAN build.
+ " for file in ['Xfile_Test_normal22_zet']
+ " call delete(file)
+ " endfor
+ " let &shell = shell
+endfunc
+
+func! Test_normal23_K()
+ " Test for K command
+ new
+ call append(0, ['helphelp.txt', 'man', 'aa%bb', 'cc|dd'])
+ let k = &keywordprg
+ set keywordprg=:help
+ 1
+ norm! VK
+ call assert_equal('helphelp.txt', fnamemodify(bufname('%'), ':t'))
+ call assert_equal('help', &ft)
+ call assert_match('\*helphelp.txt\*', getline('.'))
+ helpclose
+ norm! 0K
+ call assert_equal('helphelp.txt', fnamemodify(bufname('%'), ':t'))
+ call assert_equal('help', &ft)
+ call assert_match('Help on help files', getline('.'))
+ helpclose
+
+ set keywordprg=:new
+ set iskeyword+=%
+ set iskeyword+=\|
+ 2
+ norm! K
+ call assert_equal('man', fnamemodify(bufname('%'), ':t'))
+ bwipe!
+ 3
+ norm! K
+ call assert_equal('aa%bb', fnamemodify(bufname('%'), ':t'))
+ bwipe!
+ if !has('win32')
+ 4
+ norm! K
+ call assert_equal('cc|dd', fnamemodify(bufname('%'), ':t'))
+ bwipe!
+ endif
+ set iskeyword-=%
+ set iskeyword-=\|
+
+ " Only expect "man" to work on Unix
+ if !has("unix")
+ let &keywordprg = k
+ bw!
+ return
+ endif
+ set keywordprg=man\ --pager=cat
+ " Test for using man
+ 2
+ let a = execute('unsilent norm! K')
+ call assert_match("man --pager=cat 'man'", a)
+
+ " clean up
+ let &keywordprg = k
+ bw!
+endfunc
+
+func! Test_normal24_rot13()
+ " This test uses multi byte characters
+ if !has("multi_byte")
+ return
+ endif
+ " Testing for g?? g?g?
+ new
+ call append(0, 'abcdefghijklmnopqrstuvwxyzรครผรถ')
+ 1
+ norm! g??
+ call assert_equal('nopqrstuvwxyzabcdefghijklmรครผรถ', getline('.'))
+ norm! g?g?
+ call assert_equal('abcdefghijklmnopqrstuvwxyzรครผรถ', getline('.'))
+
+ " clean up
+ bw!
+endfunc
+
+func! Test_normal25_tag()
+ " Testing for CTRL-] g CTRL-] g]
+ " CTRL-W g] CTRL-W CTRL-] CTRL-W g CTRL-]
+ h
+ " Test for CTRL-]
+ call search('\<x\>$')
+ exe "norm! \<c-]>"
+ call assert_equal("change.txt", fnamemodify(bufname('%'), ':t'))
+ norm! yiW
+ call assert_equal("*x*", @0)
+ exe ":norm \<c-o>"
+
+ " Test for g_CTRL-]
+ call search('\<v_u\>$')
+ exe "norm! g\<c-]>"
+ call assert_equal("change.txt", fnamemodify(bufname('%'), ':t'))
+ norm! yiW
+ call assert_equal("*v_u*", @0)
+ exe ":norm \<c-o>"
+
+ " Test for g]
+ call search('\<i_<Esc>$')
+ let a = execute(":norm! g]")
+ call assert_match('i_<Esc>.*insert.txt', a)
+
+ if !empty(exepath('cscope')) && has('cscope')
+ " setting cscopetag changes how g] works
+ set cst
+ exe "norm! g]"
+ call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
+ norm! yiW
+ call assert_equal("*i_<Esc>*", @0)
+ exe ":norm \<c-o>"
+ " Test for CTRL-W g]
+ exe "norm! \<C-W>g]"
+ call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
+ norm! yiW
+ call assert_equal("*i_<Esc>*", @0)
+ call assert_equal(3, winnr('$'))
+ helpclose
+ set nocst
+ endif
+
+ " Test for CTRL-W g]
+ let a = execute("norm! \<C-W>g]")
+ call assert_match('i_<Esc>.*insert.txt', a)
+
+ " Test for CTRL-W CTRL-]
+ exe "norm! \<C-W>\<C-]>"
+ call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
+ norm! yiW
+ call assert_equal("*i_<Esc>*", @0)
+ call assert_equal(3, winnr('$'))
+ helpclose
+
+ " Test for CTRL-W g CTRL-]
+ exe "norm! \<C-W>g\<C-]>"
+ call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
+ norm! yiW
+ call assert_equal("*i_<Esc>*", @0)
+ call assert_equal(3, winnr('$'))
+ helpclose
+
+ " clean up
+ helpclose
+endfunc
+
+func! Test_normal26_put()
+ " Test for ]p ]P [p and [P
+ new
+ call append(0, ['while read LINE', 'do', ' ((count++))', ' if [ $? -ne 0 ]; then', " echo 'Error writing file'", ' fi', 'done'])
+ 1
+ /Error/y a
+ 2
+ norm! "a]pj"a[p
+ call assert_equal(['do', "echo 'Error writing file'", " echo 'Error writing file'", ' ((count++))'], getline(2,5))
+ 1
+ /^\s\{4}/
+ exe "norm! \"a]P3Eldt'"
+ exe "norm! j\"a[P2Eldt'"
+ call assert_equal([' if [ $? -ne 0 ]; then', " echo 'Error writing'", " echo 'Error'", " echo 'Error writing file'", ' fi'], getline(6,10))
+
+ " clean up
+ bw!
+endfunc
+
+func! Test_normal27_bracket()
+ " Test for [' [` ]' ]`
+ call Setup_NewWindow()
+ 1,21s/.\+/ & b/
+ 1
+ norm! $ma
+ 5
+ norm! $mb
+ 10
+ norm! $mc
+ 15
+ norm! $md
+ 20
+ norm! $me
+
+ " Test for ['
+ 9
+ norm! 2['
+ call assert_equal(' 1 b', getline('.'))
+ call assert_equal(1, line('.'))
+ call assert_equal(3, col('.'))
+
+ " Test for ]'
+ norm! ]'
+ call assert_equal(' 5 b', getline('.'))
+ call assert_equal(5, line('.'))
+ call assert_equal(3, col('.'))
+
+ " No mark after line 21, cursor moves to first non blank on current line
+ 21
+ norm! $]'
+ call assert_equal(' 21 b', getline('.'))
+ call assert_equal(21, line('.'))
+ call assert_equal(3, col('.'))
+
+ " Test for [`
+ norm! 2[`
+ call assert_equal(' 15 b', getline('.'))
+ call assert_equal(15, line('.'))
+ call assert_equal(8, col('.'))
+
+ " Test for ]`
+ norm! ]`
+ call assert_equal(' 20 b', getline('.'))
+ call assert_equal(20, line('.'))
+ call assert_equal(8, col('.'))
+
+ " clean up
+ bw!
+endfunc
+
+func! Test_normal28_parenthesis()
+ " basic testing for ( and )
+ new
+ call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here'])
+
+ $
+ norm! d(
+ call assert_equal(['This is a test. With some sentences!', '', 'Even with a question? And one more. ', ''], getline(1, '$'))
+ norm! 2d(
+ call assert_equal(['This is a test. With some sentences!', '', ' ', ''], getline(1, '$'))
+ 1
+ norm! 0d)
+ call assert_equal(['With some sentences!', '', ' ', ''], getline(1, '$'))
+
+ call append('$', ['This is a long sentence', '', 'spanning', 'over several lines. '])
+ $
+ norm! $d(
+ call assert_equal(['With some sentences!', '', ' ', '', 'This is a long sentence', ''], getline(1, '$'))
+
+ " clean up
+ bw!
+endfunc
+
+fun! Test_normal29_brace()
+ " basic test for { and } movements
+ let text= ['A paragraph begins after each empty line, and also at each of a set of',
+ \ 'paragraph macros, specified by the pairs of characters in the ''paragraphs''',
+ \ 'option. The default is "IPLPPPQPP TPHPLIPpLpItpplpipbp", which corresponds to',
+ \ 'the macros ".IP", ".LP", etc. (These are nroff macros, so the dot must be in',
+ \ 'the first column). A section boundary is also a paragraph boundary.',
+ \ 'Note that a blank line (only containing white space) is NOT a paragraph',
+ \ 'boundary.',
+ \ '',
+ \ '',
+ \ 'Also note that this does not include a ''{'' or ''}'' in the first column. When',
+ \ 'the ''{'' flag is in ''cpoptions'' then ''{'' in the first column is used as a',
+ \ 'paragraph boundary |posix|.',
+ \ '{',
+ \ 'This is no paragraph',
+ \ 'unless the ''{'' is set',
+ \ 'in ''cpoptions''',
+ \ '}',
+ \ '.IP',
+ \ 'The nroff macros IP separates a paragraph',
+ \ 'That means, it must be a ''.''',
+ \ 'followed by IP',
+ \ '.LPIt does not matter, if afterwards some',
+ \ 'more characters follow.',
+ \ '.SHAlso section boundaries from the nroff',
+ \ 'macros terminate a paragraph. That means',
+ \ 'a character like this:',
+ \ '.NH',
+ \ 'End of text here']
+ new
+ call append(0, text)
+ 1
+ norm! 0d2}
+ call assert_equal(['.IP',
+ \ 'The nroff macros IP separates a paragraph', 'That means, it must be a ''.''', 'followed by IP',
+ \ '.LPIt does not matter, if afterwards some', 'more characters follow.', '.SHAlso section boundaries from the nroff',
+ \ 'macros terminate a paragraph. That means', 'a character like this:', '.NH', 'End of text here', ''], getline(1,'$'))
+ norm! 0d}
+ call assert_equal(['.LPIt does not matter, if afterwards some', 'more characters follow.',
+ \ '.SHAlso section boundaries from the nroff', 'macros terminate a paragraph. That means',
+ \ 'a character like this:', '.NH', 'End of text here', ''], getline(1, '$'))
+ $
+ norm! d{
+ call assert_equal(['.LPIt does not matter, if afterwards some', 'more characters follow.',
+ \ '.SHAlso section boundaries from the nroff', 'macros terminate a paragraph. That means', 'a character like this:', ''], getline(1, '$'))
+ norm! d{
+ call assert_equal(['.LPIt does not matter, if afterwards some', 'more characters follow.', ''], getline(1,'$'))
+ " Test with { in cpooptions
+ %d
+ call append(0, text)
+ " Nvim: no "{" flag in 'cpoptions'.
+ " set cpo+={
+ " 1
+ " norm! 0d2}
+ " call assert_equal(['{', 'This is no paragraph', 'unless the ''{'' is set', 'in ''cpoptions''', '}',
+ " \ '.IP', 'The nroff macros IP separates a paragraph', 'That means, it must be a ''.''',
+ " \ 'followed by IP', '.LPIt does not matter, if afterwards some', 'more characters follow.',
+ " \ '.SHAlso section boundaries from the nroff', 'macros terminate a paragraph. That means',
+ " \ 'a character like this:', '.NH', 'End of text here', ''], getline(1,'$'))
+ " $
+ " norm! d}
+ " call assert_equal(['{', 'This is no paragraph', 'unless the ''{'' is set', 'in ''cpoptions''', '}',
+ " \ '.IP', 'The nroff macros IP separates a paragraph', 'That means, it must be a ''.''',
+ " \ 'followed by IP', '.LPIt does not matter, if afterwards some', 'more characters follow.',
+ " \ '.SHAlso section boundaries from the nroff', 'macros terminate a paragraph. That means',
+ " \ 'a character like this:', '.NH', 'End of text here', ''], getline(1,'$'))
+ " norm! gg}
+ " norm! d5}
+ " call assert_equal(['{', 'This is no paragraph', 'unless the ''{'' is set', 'in ''cpoptions''', '}', ''], getline(1,'$'))
+
+ " clean up
+ set cpo-={
+ bw!
+endfunc
+
+fun! Test_normal30_changecase()
+ " This test uses multi byte characters
+ if !has("multi_byte")
+ return
+ endif
+ new
+ call append(0, 'This is a simple test: รครผรถรŸ')
+ norm! 1ggVu
+ call assert_equal('this is a simple test: รครผรถรŸ', getline('.'))
+ norm! VU
+ call assert_equal('THIS IS A SIMPLE TEST: ร„รœร–SS', getline('.'))
+ norm! guu
+ call assert_equal('this is a simple test: รครผรถss', getline('.'))
+ norm! gUgU
+ call assert_equal('THIS IS A SIMPLE TEST: ร„รœร–SS', getline('.'))
+ norm! gugu
+ call assert_equal('this is a simple test: รครผรถss', getline('.'))
+ norm! gUU
+ call assert_equal('THIS IS A SIMPLE TEST: ร„รœร–SS', getline('.'))
+ norm! 010~
+ call assert_equal('this is a SIMPLE TEST: ร„รœร–SS', getline('.'))
+ norm! V~
+ call assert_equal('THIS IS A simple test: รครผรถss', getline('.'))
+
+ " Turkish ASCII turns to multi-byte. On some systems Turkish locale
+ " is available but toupper()/tolower() don't do the right thing.
+ try
+ lang tr_TR.UTF-8
+ set casemap=
+ let iupper = toupper('i')
+ if iupper == "\u0130"
+ call setline(1, 'iI')
+ 1normal gUU
+ call assert_equal("\u0130I", getline(1))
+ call assert_equal("\u0130I", toupper("iI"))
+
+ call setline(1, 'iI')
+ 1normal guu
+ call assert_equal("i\u0131", getline(1))
+ call assert_equal("i\u0131", tolower("iI"))
+ elseif iupper == "I"
+ call setline(1, 'iI')
+ 1normal gUU
+ call assert_equal("II", getline(1))
+ call assert_equal("II", toupper("iI"))
+
+ call setline(1, 'iI')
+ 1normal guu
+ call assert_equal("ii", getline(1))
+ call assert_equal("ii", tolower("iI"))
+ else
+ call assert_true(false, "expected toupper('i') to be either 'I' or '\u0131'")
+ endif
+ set casemap&
+ call setline(1, 'iI')
+ 1normal gUU
+ call assert_equal("II", getline(1))
+ call assert_equal("II", toupper("iI"))
+
+ call setline(1, 'iI')
+ 1normal guu
+ call assert_equal("ii", getline(1))
+ call assert_equal("ii", tolower("iI"))
+
+ lang en_US.UTF-8
+ catch /E197:/
+ " can't use Turkish locale
+ throw 'Skipped: Turkish locale not available'
+ endtry
+
+ " clean up
+ bw!
+endfunc
+
+fun! Test_normal31_r_cmd()
+ " Test for r command
+ new
+ call append(0, 'This is a simple test: abcd')
+ exe "norm! 1gg$r\<cr>"
+ call assert_equal(['This is a simple test: abc', '', ''], getline(1,'$'))
+ exe "norm! 1gg2wlr\<cr>"
+ call assert_equal(['This is a', 'simple test: abc', '', ''], getline(1,'$'))
+ exe "norm! 2gg0W5r\<cr>"
+ call assert_equal(['This is a', 'simple ', ' abc', '', ''], getline('1', '$'))
+ set autoindent
+ call setline(2, ['simple test: abc', ''])
+ exe "norm! 2gg0W5r\<cr>"
+ call assert_equal(['This is a', 'simple ', 'abc', '', '', ''], getline('1', '$'))
+ exe "norm! 1ggVr\<cr>"
+ call assert_equal('^M^M^M^M^M^M^M^M^M', strtrans(getline(1)))
+ call setline(1, 'This is a')
+ exe "norm! 1gg05rf"
+ call assert_equal('fffffis a', getline(1))
+
+ " clean up
+ set noautoindent
+ bw!
+endfunc
+
+func! Test_normal32_g_cmd1()
+ " Test for g*, g#
+ new
+ call append(0, ['abc.x_foo', 'x_foobar.abc'])
+ 1
+ norm! $g*
+ call assert_equal('x_foo', @/)
+ call assert_equal('x_foobar.abc', getline('.'))
+ norm! $g#
+ call assert_equal('abc', @/)
+ call assert_equal('abc.x_foo', getline('.'))
+
+ " clean up
+ bw!
+endfunc
+
+fun! Test_normal33_g_cmd2()
+ if !has("jumplist")
+ return
+ endif
+ " Tests for g cmds
+ call Setup_NewWindow()
+ " Test for g`
+ clearjumps
+ norm! ma10j
+ let a=execute(':jumps')
+ " empty jumplist
+ call assert_equal('>', a[-1:])
+ norm! g`a
+ call assert_equal('>', a[-1:])
+ call assert_equal(1, line('.'))
+ call assert_equal('1', getline('.'))
+
+ " Test for g; and g,
+ norm! g;
+ " there is only one change in the changelist
+ " currently, when we setup the window
+ call assert_equal(2, line('.'))
+ call assert_fails(':norm! g;', 'E662')
+ call assert_fails(':norm! g,', 'E663')
+ let &ul=&ul
+ call append('$', ['a', 'b', 'c', 'd'])
+ let &ul=&ul
+ call append('$', ['Z', 'Y', 'X', 'W'])
+ let a = execute(':changes')
+ call assert_match('2\s\+0\s\+2', a)
+ call assert_match('101\s\+0\s\+a', a)
+ call assert_match('105\s\+0\s\+Z', a)
+ norm! 3g;
+ call assert_equal(2, line('.'))
+ norm! 2g,
+ call assert_equal(105, line('.'))
+
+ " Test for g& - global substitute
+ %d
+ call setline(1, range(1,10))
+ call append('$', ['a', 'b', 'c', 'd'])
+ $s/\w/&&/g
+ exe "norm! /[1-8]\<cr>"
+ norm! g&
+ call assert_equal(['11', '22', '33', '44', '55', '66', '77', '88', '9', '110', 'a', 'b', 'c', 'dd'], getline(1, '$'))
+
+ " Test for gv
+ %d
+ call append('$', repeat(['abcdefgh'], 8))
+ exe "norm! 2gg02l\<c-v>2j2ly"
+ call assert_equal(['cde', 'cde', 'cde'], getreg(0, 1, 1))
+ " in visual mode, gv swaps current and last selected region
+ exe "norm! G0\<c-v>4k4lgvd"
+ call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh'], getline(1,'$'))
+ exe "norm! G0\<c-v>4k4ly"
+ exe "norm! gvood"
+ call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'fgh', 'fgh', 'fgh', 'fgh', 'fgh'], getline(1,'$'))
+
+ " Test for gk/gj
+ %d
+ 15vsp
+ set wrap listchars= sbr=
+ let lineA='abcdefghijklmnopqrstuvwxyz'
+ let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+ $put =lineA
+ $put =lineB
+
+ norm! 3gg0dgk
+ call assert_equal(['', 'abcdefghijklmno', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'], getline(1, '$'))
+ set nu
+ norm! 3gg0gjdgj
+ call assert_equal(['', 'abcdefghijklmno', '0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
+
+ " Test for gJ
+ norm! 2gggJ
+ call assert_equal(['', 'abcdefghijklmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
+ call assert_equal(16, col('.'))
+ " shouldn't do anything
+ norm! 10gJ
+ call assert_equal(1, col('.'))
+
+ " Test for g0 g^ gm g$
+ exe "norm! 2gg0gji "
+ call assert_equal(['', 'abcdefghijk lmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
+ norm! g0yl
+ call assert_equal(12, col('.'))
+ call assert_equal(' ', getreg(0))
+ norm! g$yl
+ call assert_equal(22, col('.'))
+ call assert_equal('3', getreg(0))
+ norm! gmyl
+ call assert_equal(17, col('.'))
+ call assert_equal('n', getreg(0))
+ norm! g^yl
+ call assert_equal(15, col('.'))
+ call assert_equal('l', getreg(0))
+
+ " Test for gI
+ norm! gIfoo
+ call assert_equal(['', 'fooabcdefghijk lmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
+
+ " Test for gi
+ wincmd c
+ %d
+ set tw=0
+ call setline(1, ['foobar', 'new line'])
+ norm! A next word
+ $put ='third line'
+ norm! gi another word
+ call assert_equal(['foobar next word another word', 'new line', 'third line'], getline(1,'$'))
+
+ " clean up
+ bw!
+endfunc
+
+func! Test_g_ctrl_g()
+ new
+
+ let a = execute(":norm! g\<c-g>")
+ call assert_equal("\n--No lines in buffer--", a)
+
+ call setline(1, ['first line', 'second line'])
+
+ " Test g CTRL-g with dos, mac and unix file type.
+ norm! gojll
+ set ff=dos
+ let a = execute(":norm! g\<c-g>")
+ call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 15 of 25", a)
+
+ set ff=mac
+ let a = execute(":norm! g\<c-g>")
+ call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 14 of 23", a)
+
+ set ff=unix
+ let a = execute(":norm! g\<c-g>")
+ call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 14 of 23", a)
+
+ " Test g CTRL-g in visual mode (v)
+ let a = execute(":norm! gojllvlg\<c-g>")
+ call assert_equal("\nSelected 1 of 2 Lines; 1 of 4 Words; 2 of 23 Bytes", a)
+
+ " Test g CTRL-g in visual mode (CTRL-V) with end col > start col
+ let a = execute(":norm! \<Esc>gojll\<C-V>kllg\<c-g>")
+ call assert_equal("\nSelected 3 Cols; 2 of 2 Lines; 2 of 4 Words; 6 of 23 Bytes", a)
+
+ " Test g_CTRL-g in visual mode (CTRL-V) with end col < start col
+ let a = execute(":norm! \<Esc>goll\<C-V>jhhg\<c-g>")
+ call assert_equal("\nSelected 3 Cols; 2 of 2 Lines; 2 of 4 Words; 6 of 23 Bytes", a)
+
+ " Test g CTRL-g in visual mode (CTRL-V) with end_vcol being MAXCOL
+ let a = execute(":norm! \<Esc>gojll\<C-V>k$g\<c-g>")
+ call assert_equal("\nSelected 2 of 2 Lines; 4 of 4 Words; 17 of 23 Bytes", a)
+
+ " There should be one byte less with noeol
+ set bin noeol
+ let a = execute(":norm! \<Esc>gog\<c-g>")
+ call assert_equal("\nCol 1 of 10; Line 1 of 2; Word 1 of 4; Char 1 of 23; Byte 1 of 22", a)
+ set bin & eol&
+
+ if has('multi_byte')
+ call setline(1, ['Franรงais', 'ๆ—ฅๆœฌ่ชž'])
+
+ let a = execute(":norm! \<Esc>gojlg\<c-g>")
+ call assert_equal("\nCol 4-3 of 9-6; Line 2 of 2; Word 2 of 2; Char 11 of 13; Byte 16 of 20", a)
+
+ let a = execute(":norm! \<Esc>gojvlg\<c-g>")
+ call assert_equal("\nSelected 1 of 2 Lines; 1 of 2 Words; 2 of 13 Chars; 6 of 20 Bytes", a)
+
+ let a = execute(":norm! \<Esc>goll\<c-v>jlg\<c-g>")
+ call assert_equal("\nSelected 4 Cols; 2 of 2 Lines; 2 of 2 Words; 6 of 13 Chars; 11 of 20 Bytes", a)
+
+ set fenc=utf8 bomb
+ let a = execute(":norm! \<Esc>gojlg\<c-g>")
+ call assert_equal("\nCol 4-3 of 9-6; Line 2 of 2; Word 2 of 2; Char 11 of 13; Byte 16 of 20(+3 for BOM)", a)
+
+ set fenc=utf16 bomb
+ let a = execute(":norm! g\<c-g>")
+ call assert_equal("\nCol 4-3 of 9-6; Line 2 of 2; Word 2 of 2; Char 11 of 13; Byte 16 of 20(+2 for BOM)", a)
+
+ set fenc=utf32 bomb
+ let a = execute(":norm! g\<c-g>")
+ call assert_equal("\nCol 4-3 of 9-6; Line 2 of 2; Word 2 of 2; Char 11 of 13; Byte 16 of 20(+4 for BOM)", a)
+
+ set fenc& bomb&
+ endif
+
+ set ff&
+ bwipe!
+endfunc
+
+fun! Test_normal34_g_cmd3()
+ if !has("multi_byte")
+ return
+ endif
+
+ " Test for g8
+ new
+ let a=execute(':norm! 1G0g8')
+ call assert_equal("\nNUL", a)
+
+ call setline(1, 'abcdefghijklmnopqrstuvwxyzรครผรถ')
+ let a=execute(':norm! 1G$g8')
+ call assert_equal("\nc3 b6 ", a)
+
+ call setline(1, "a\u0302")
+ let a=execute(':norm! 1G0g8')
+ call assert_equal("\n61 + cc 82 ", a)
+
+ " clean up
+ bw!
+endfunc
+
+func Test_normal_8g8()
+ if !has("multi_byte")
+ return
+ endif
+ new
+
+ " Test 8g8 which finds invalid utf8 at or after the cursor.
+
+ " With invalid byte.
+ call setline(1, "___\xff___")
+ norm! 1G08g8g
+ call assert_equal([0, 1, 4, 0, 1], getcurpos())
+
+ " With invalid byte before the cursor.
+ call setline(1, "___\xff___")
+ norm! 1G$h8g8g
+ call assert_equal([0, 1, 6, 0, 9], getcurpos())
+
+ " With truncated sequence.
+ call setline(1, "___\xE2\x82___")
+ norm! 1G08g8g
+ call assert_equal([0, 1, 4, 0, 1], getcurpos())
+
+ " With overlong sequence.
+ call setline(1, "___\xF0\x82\x82\xAC___")
+ norm! 1G08g8g
+ call assert_equal([0, 1, 4, 0, 1], getcurpos())
+
+ " With valid utf8.
+ call setline(1, "cafรฉ")
+ norm! 1G08g8
+ call assert_equal([0, 1, 1, 0, 1], getcurpos())
+
+ bw!
+endfunc
+
+fun! Test_normal35_g_cmd4()
+ " Test for g<
+ " Cannot capture its output,
+ " probably a bug, therefore, test disabled:
+ throw "Skipped: output of g< can't be tested currently"
+ echo "a\nb\nc\nd"
+ let b=execute(':norm! g<')
+ call assert_true(!empty(b), 'failed `execute(g<)`')
+endfunc
+
+fun! Test_normal36_g_cmd5()
+ new
+ call append(0, 'abcdefghijklmnopqrstuvwxyz')
+ set ff=unix
+ " Test for gp gP
+ call append(1, range(1,10))
+ 1
+ norm! 1yy
+ 3
+ norm! gp
+ call assert_equal([0, 5, 1, 0, 1], getcurpos())
+ $
+ norm! gP
+ call assert_equal([0, 14, 1, 0, 1], getcurpos())
+
+ " Test for go
+ norm! 26go
+ call assert_equal([0, 1, 26, 0, 26], getcurpos())
+ norm! 27go
+ call assert_equal([0, 1, 26, 0, 26], getcurpos())
+ norm! 28go
+ call assert_equal([0, 2, 1, 0, 1], getcurpos())
+ set ff=dos
+ norm! 29go
+ call assert_equal([0, 2, 1, 0, 1], getcurpos())
+ set ff=unix
+ norm! gg0
+ norm! 101go
+ call assert_equal([0, 13, 26, 0, 26], getcurpos())
+ norm! 103go
+ call assert_equal([0, 14, 1, 0, 1], getcurpos())
+ " count > buffer content
+ norm! 120go
+ call assert_equal([0, 14, 1, 0, 2147483647], getcurpos())
+ " clean up
+ bw!
+endfunc
+
+fun! Test_normal37_g_cmd6()
+ " basic test for gt and gT
+ tabnew 1.txt
+ tabnew 2.txt
+ tabnew 3.txt
+ norm! 1gt
+ call assert_equal(1, tabpagenr())
+ norm! 3gt
+ call assert_equal(3, tabpagenr())
+ norm! 1gT
+ " count gT goes not to the absolute tabpagenumber
+ " but, but goes to the count previous tabpagenumber
+ call assert_equal(2, tabpagenr())
+ " wrap around
+ norm! 3gT
+ call assert_equal(3, tabpagenr())
+ " gt does not wrap around
+ norm! 5gt
+ call assert_equal(3, tabpagenr())
+
+ for i in range(3)
+ tabclose
+ endfor
+ " clean up
+ call assert_fails(':tabclose', 'E784')
+endfunc
+
+fun! Test_normal38_nvhome()
+ " Test for <Home> and <C-Home> key
+ new
+ call setline(1, range(10))
+ $
+ setl et sw=2
+ norm! V10>$
+ " count is ignored
+ exe "norm! 10\<home>"
+ call assert_equal(1, col('.'))
+ exe "norm! \<home>"
+ call assert_equal([0, 10, 1, 0, 1], getcurpos())
+ exe "norm! 5\<c-home>"
+ call assert_equal([0, 5, 1, 0, 1], getcurpos())
+ exe "norm! \<c-home>"
+ call assert_equal([0, 1, 1, 0, 1], getcurpos())
+
+ " clean up
+ bw!
+endfunc
+
+fun! Test_normal39_cw()
+ " Test for cw and cW on whitespace
+ " and cpo+=w setting
+ new
+ set tw=0
+ call append(0, 'here are some words')
+ norm! 1gg0elcwZZZ
+ call assert_equal('hereZZZare some words', getline('.'))
+ norm! 1gg0elcWYYY
+ call assert_equal('hereZZZareYYYsome words', getline('.'))
+ " Nvim: no "w" flag in 'cpoptions'.
+ " set cpo+=w
+ " call setline(1, 'here are some words')
+ " norm! 1gg0elcwZZZ
+ " call assert_equal('hereZZZ are some words', getline('.'))
+ " norm! 1gg2elcWYYY
+ " call assert_equal('hereZZZ areYYY some words', getline('.'))
+ set cpo-=w
+ norm! 2gg0cwfoo
+ call assert_equal('foo', getline('.'))
+
+ " clean up
+ bw!
+endfunc
+
+fun! Test_normal40_ctrl_bsl()
+ " Basic test for CTRL-\ commands
+ new
+ call append(0, 'here are some words')
+ exe "norm! 1gg0a\<C-\>\<C-N>"
+ call assert_equal('n', mode())
+ call assert_equal(1, col('.'))
+ call assert_equal('', visualmode())
+ exe "norm! 1gg0viw\<C-\>\<C-N>"
+ call assert_equal('n', mode())
+ call assert_equal(4, col('.'))
+ exe "norm! 1gg0a\<C-\>\<C-G>"
+ call assert_equal('n', mode())
+ call assert_equal(1, col('.'))
+ "imap <buffer> , <c-\><c-n>
+ set im
+ exe ":norm! \<c-\>\<c-n>dw"
+ set noim
+ call assert_equal('are some words', getline(1))
+ call assert_false(&insertmode)
+
+ " clean up
+ bw!
+endfunc
+
+fun! Test_normal41_insert_reg()
+ " Test for <c-r>=, <c-r><c-r>= and <c-r><c-o>=
+ " in insert mode
+ new
+ set sts=2 sw=2 ts=8 tw=0
+ call append(0, ["aaa\tbbb\tccc", '', '', ''])
+ let a=getline(1)
+ norm! 2gg0
+ exe "norm! a\<c-r>=a\<cr>"
+ norm! 3gg0
+ exe "norm! a\<c-r>\<c-r>=a\<cr>"
+ norm! 4gg0
+ exe "norm! a\<c-r>\<c-o>=a\<cr>"
+ call assert_equal(['aaa bbb ccc', 'aaa bbb ccc', 'aaa bbb ccc', 'aaa bbb ccc', ''], getline(1, '$'))
+
+ " clean up
+ set sts=0 sw=8 ts=8
+ bw!
+endfunc
+
+func! Test_normal42_halfpage()
+ " basic test for Ctrl-D and Ctrl-U
+ call Setup_NewWindow()
+ call assert_equal(5, &scroll)
+ exe "norm! \<c-d>"
+ call assert_equal('6', getline('.'))
+ exe "norm! 2\<c-d>"
+ call assert_equal('8', getline('.'))
+ call assert_equal(2, &scroll)
+ set scroll=5
+ exe "norm! \<c-u>"
+ call assert_equal('3', getline('.'))
+ 1
+ set scrolloff=5
+ exe "norm! \<c-d>"
+ call assert_equal('10', getline('.'))
+ exe "norm! \<c-u>"
+ call assert_equal('5', getline('.'))
+ 1
+ set scrolloff=99
+ exe "norm! \<c-d>"
+ call assert_equal('10', getline('.'))
+ set scrolloff=0
+ 100
+ exe "norm! $\<c-u>"
+ call assert_equal('95', getline('.'))
+ call assert_equal([0, 95, 1, 0, 1], getcurpos())
+ 100
+ set nostartofline
+ exe "norm! $\<c-u>"
+ call assert_equal('95', getline('.'))
+ call assert_equal([0, 95, 2, 0, 2147483647], getcurpos())
+ " cleanup
+ set startofline
+ bw!
+endfunc
+
+fun! Test_normal43_textobject1()
+ " basic tests for text object aw
+ new
+ call append(0, ['foobar,eins,foobar', 'foo,zwei,foo '])
+ " diw
+ norm! 1gg0diw
+ call assert_equal([',eins,foobar', 'foo,zwei,foo ', ''], getline(1,'$'))
+ " daw
+ norm! 2ggEdaw
+ call assert_equal([',eins,foobar', 'foo,zwei,', ''], getline(1, '$'))
+ %d
+ call append(0, ["foo\teins\tfoobar", "foo\tzwei\tfoo "])
+ " diW
+ norm! 2ggwd2iW
+ call assert_equal(['foo eins foobar', 'foo foo ', ''], getline(1,'$'))
+ " daW
+ norm! 1ggd2aW
+ call assert_equal(['foobar', 'foo foo ', ''], getline(1,'$'))
+
+ %d
+ call append(0, ["foo\teins\tfoobar", "foo\tzwei\tfoo "])
+ " aw in visual line mode switches to characterwise mode
+ norm! 2gg$Vawd
+ call assert_equal(['foo eins foobar', 'foo zwei foo'], getline(1,'$'))
+ norm! 1gg$Viwd
+ call assert_equal(['foo eins ', 'foo zwei foo'], getline(1,'$'))
+
+ " clean up
+ bw!
+endfunc
+
+func! Test_normal44_textobjects2()
+ " basic testing for is and as text objects
+ new
+ call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here'])
+ " Test for dis - does not remove trailing whitespace
+ norm! 1gg0dis
+ call assert_equal([' With some sentences!', '', 'Even with a question? And one more. And no sentence here', ''], getline(1,'$'))
+ " Test for das - removes leading whitespace
+ norm! 3ggf?ldas
+ call assert_equal([' With some sentences!', '', 'Even with a question? And no sentence here', ''], getline(1,'$'))
+ " when used in visual mode, is made characterwise
+ norm! 3gg$Visy
+ call assert_equal('v', visualmode())
+ " reset visualmode()
+ norm! 3ggVy
+ norm! 3gg$Vasy
+ call assert_equal('v', visualmode())
+ " basic testing for textobjects a< and at
+ %d
+ call setline(1, ['<div> ','<a href="foobar" class="foo">xyz</a>',' </div>', ' '])
+ " a<
+ norm! 1gg0da<
+ call assert_equal([' ', '<a href="foobar" class="foo">xyz</a>', ' </div>', ' '], getline(1,'$'))
+ norm! 1pj
+ call assert_equal([' <div>', '<a href="foobar" class="foo">xyz</a>', ' </div>', ' '], getline(1,'$'))
+ " at
+ norm! d2at
+ call assert_equal([' '], getline(1,'$'))
+ %d
+ call setline(1, ['<div> ','<a href="foobar" class="foo">xyz</a>',' </div>', ' '])
+ " i<
+ norm! 1gg0di<
+ call assert_equal(['<> ', '<a href="foobar" class="foo">xyz</a>', ' </div>', ' '], getline(1,'$'))
+ norm! 1Pj
+ call assert_equal(['<div> ', '<a href="foobar" class="foo">xyz</a>', ' </div>', ' '], getline(1,'$'))
+ norm! d2it
+ call assert_equal(['<div></div>',' '], getline(1,'$'))
+ " basic testing for a[ and i[ text object
+ %d
+ call setline(1, [' ', '[', 'one [two]', 'thre', ']'])
+ norm! 3gg0di[
+ call assert_equal([' ', '[', ']'], getline(1,'$'))
+ call setline(1, [' ', '[', 'one [two]', 'thre', ']'])
+ norm! 3gg0ftd2a[
+ call assert_equal([' '], getline(1,'$'))
+ %d
+ " Test for i" when cursor is in front of a quoted object
+ call append(0, 'foo "bar"')
+ norm! 1gg0di"
+ call assert_equal(['foo ""', ''], getline(1,'$'))
+
+ " clean up
+ bw!
+endfunc
+
+func! Test_normal45_drop()
+ if !has('dnd')
+ return
+ endif
+
+ " basic test for drag-n-drop
+ " unfortunately, without a gui, we can't really test much here,
+ " so simply test that ~p fails (which uses the drop register)
+ new
+ call assert_fails(':norm! "~p', 'E353')
+ call assert_equal([], getreg('~', 1, 1))
+ " the ~ register is read only
+ call assert_fails(':let @~="1"', 'E354')
+ bw!
+endfunc
+
+func! Test_normal46_ignore()
+ " This test uses multi byte characters
+ if !has("multi_byte")
+ return
+ endif
+
+ new
+ " How to test this?
+ " let's just for now test, that the buffer
+ " does not change
+ call feedkeys("\<c-s>", 't')
+ call assert_equal([''], getline(1,'$'))
+
+ " no valid commands
+ exe "norm! \<char-0x100>"
+ call assert_equal([''], getline(1,'$'))
+
+ exe "norm! รค"
+ call assert_equal([''], getline(1,'$'))
+
+ " clean up
+ bw!
+endfunc
+
+func! Test_normal47_visual_buf_wipe()
+ " This was causing a crash or ml_get error.
+ enew!
+ call setline(1,'xxx')
+ normal $
+ new
+ call setline(1, range(1,2))
+ 2
+ exe "norm \<C-V>$"
+ bw!
+ norm yp
+ set nomodified
+endfunc
+
+func! Test_normal47_autocmd()
+ " disabled, does not seem to be possible currently
+ throw "Skipped: not possible to test cursorhold autocmd while waiting for input in normal_cmd"
+ new
+ call append(0, repeat('-',20))
+ au CursorHold * call feedkeys('2l', '')
+ 1
+ set updatetime=20
+ " should delete 12 chars (d12l)
+ call feedkeys('d1', '!')
+ call assert_equal('--------', getline(1))
+
+ " clean up
+ au! CursorHold
+ set updatetime=4000
+ bw!
+endfunc
+
+func! Test_normal48_wincmd()
+ new
+ exe "norm! \<c-w>c"
+ call assert_equal(1, winnr('$'))
+ call assert_fails(":norm! \<c-w>c", "E444")
+endfunc
+
+func! Test_normal49_counts()
+ new
+ call setline(1, 'one two three four five six seven eight nine ten')
+ 1
+ norm! 3d2w
+ call assert_equal('seven eight nine ten', getline(1))
+ bw!
+endfunc
+
+func! Test_normal50_commandline()
+ if !has("timers") || !has("cmdline_hist") || !has("vertsplit")
+ return
+ endif
+ func! DoTimerWork(id)
+ call assert_equal('[Command Line]', bufname(''))
+ " should fail, with E11, but does fail with E23?
+ "call feedkeys("\<c-^>", 'tm')
+
+ " should also fail with E11
+ call assert_fails(":wincmd p", 'E11')
+ " return from commandline window
+ call feedkeys("\<cr>")
+ endfunc
+
+ let oldlang=v:lang
+ lang C
+ set updatetime=20
+ call timer_start(100, 'DoTimerWork')
+ try
+ " throws E23, for whatever reason...
+ call feedkeys('q:', 'x!')
+ catch /E23/
+ " no-op
+ endtry
+ " clean up
+ set updatetime=4000
+ exe "lang" oldlang
+ bw!
+endfunc
+
+func! Test_normal51_FileChangedRO()
+ if !has("autocmd")
+ return
+ endif
+ call writefile(['foo'], 'Xreadonly.log')
+ new Xreadonly.log
+ setl ro
+ au FileChangedRO <buffer> :call feedkeys("\<c-^>", 'tix')
+ call assert_fails(":norm! Af", 'E788')
+ call assert_equal(['foo'], getline(1,'$'))
+ call assert_equal('Xreadonly.log', bufname(''))
+
+ " cleanup
+ bw!
+ call delete("Xreadonly.log")
+endfunc
+
+func! Test_normal52_rl()
+ if !has("rightleft")
+ return
+ endif
+ new
+ call setline(1, 'abcde fghij klmnopq')
+ norm! 1gg$
+ set rl
+ call assert_equal(19, col('.'))
+ call feedkeys('l', 'tx')
+ call assert_equal(18, col('.'))
+ call feedkeys('h', 'tx')
+ call assert_equal(19, col('.'))
+ call feedkeys("\<right>", 'tx')
+ call assert_equal(18, col('.'))
+ call feedkeys("\<s-right>", 'tx')
+ call assert_equal(13, col('.'))
+ call feedkeys("\<c-right>", 'tx')
+ call assert_equal(7, col('.'))
+ call feedkeys("\<c-left>", 'tx')
+ call assert_equal(13, col('.'))
+ call feedkeys("\<s-left>", 'tx')
+ call assert_equal(19, col('.'))
+ call feedkeys("<<", 'tx')
+ call assert_equal(' abcde fghij klmnopq',getline(1))
+ call feedkeys(">>", 'tx')
+ call assert_equal('abcde fghij klmnopq',getline(1))
+
+ " cleanup
+ set norl
+ bw!
+endfunc
+
+func! Test_normal53_digraph()
+ if !has('digraphs')
+ return
+ endif
+ new
+ call setline(1, 'abcdefgh|')
+ exe "norm! 1gg0f\<c-k>!!"
+ call assert_equal(9, col('.'))
+ set cpo+=D
+ exe "norm! 1gg0f\<c-k>!!"
+ call assert_equal(1, col('.'))
+
+ set cpo-=D
+ bw!
+endfunc
+
+func Test_normal54_Ctrl_bsl()
+ new
+ call setline(1, 'abcdefghijklmn')
+ exe "norm! df\<c-\>\<c-n>"
+ call assert_equal(['abcdefghijklmn'], getline(1,'$'))
+ exe "norm! df\<c-\>\<c-g>"
+ call assert_equal(['abcdefghijklmn'], getline(1,'$'))
+ exe "norm! df\<c-\>m"
+ call assert_equal(['abcdefghijklmn'], getline(1,'$'))
+ if !has("multi_byte")
+ return
+ endif
+ call setline(2, 'abcdefghijklmnฤf')
+ norm! 2gg0
+ exe "norm! df\<Char-0x101>"
+ call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$'))
+ norm! 1gg0
+ exe "norm! df\<esc>"
+ call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$'))
+
+ " clean up
+ bw!
+endfunc
+
+func Test_normal_large_count()
+ " This may fail with 32bit long, how do we detect that?
+ new
+ normal o
+ normal 6666666666dL
+ bwipe!
+endfunc
+
+" Test for the gr (virtual replace) command
+" Test for the bug fixed by 7.4.387
+func Test_gr_command()
+ enew!
+ let save_cpo = &cpo
+ call append(0, ['First line', 'Second line', 'Third line'])
+ exe "normal i\<C-G>u"
+ call cursor(2, 1)
+ set cpo-=X
+ normal 4gro
+ call assert_equal('oooond line', getline(2))
+ undo
+ set cpo+=X
+ normal 4gro
+ call assert_equal('ooooecond line', getline(2))
+ let &cpo = save_cpo
+ enew!
+endfunc
+
+" When splitting a window the changelist position is wrong.
+" Test the changelist position after splitting a window.
+" Test for the bug fixed by 7.4.386
+func Test_changelist()
+ let save_ul = &ul
+ enew!
+ call append('$', ['1', '2'])
+ exe "normal i\<C-G>u"
+ exe "normal Gkylpa\<C-G>u"
+ set ul=100
+ exe "normal Gylpa\<C-G>u"
+ set ul=100
+ normal gg
+ vsplit
+ normal g;
+ call assert_equal([3, 2], [line('.'), col('.')])
+ normal g;
+ call assert_equal([2, 2], [line('.'), col('.')])
+ call assert_fails('normal g;', 'E662:')
+ %bwipe!
+ let &ul = save_ul
+endfunc
+
+func Test_delete_until_paragraph()
+ if !has('multi_byte')
+ return
+ endif
+ new
+ normal grรกdv}
+ call assert_equal('รก', getline(1))
+ normal grรกd}
+ call assert_equal('', getline(1))
+ bwipe!
+endfunc
diff --git a/src/nvim/testdir/test_number.vim b/src/nvim/testdir/test_number.vim
new file mode 100644
index 0000000000..59debcea0d
--- /dev/null
+++ b/src/nvim/testdir/test_number.vim
@@ -0,0 +1,254 @@
+" Test for 'number' and 'relativenumber'
+
+source view_util.vim
+
+func! s:screen_lines(start, end) abort
+ return ScreenLines([a:start, a:end], 8)
+endfunc
+
+func! s:compare_lines(expect, actual)
+ call assert_equal(a:expect, a:actual)
+endfunc
+
+func! s:test_windows(h, w) abort
+ call NewWindow(a:h, a:w)
+endfunc
+
+func! s:close_windows() abort
+ call CloseWindow()
+endfunc
+
+func! s:validate_cursor() abort
+ " update skipcol.
+ " wincol():
+ " f_wincol
+ " -> validate_cursor
+ " -> curs_columns
+ call wincol()
+endfunc
+
+func Test_set_options()
+ set nu rnu
+ call assert_equal(1, &nu)
+ call assert_equal(1, &rnu)
+
+ call s:test_windows(10, 20)
+ call assert_equal(1, &nu)
+ call assert_equal(1, &rnu)
+ call s:close_windows()
+
+ set nu& rnu&
+endfunc
+
+func Test_set_global_and_local()
+ " setlocal must NOT reset the other global value
+ set nonu nornu
+ setglobal nu
+ setlocal rnu
+ call assert_equal(1, &g:nu)
+
+ set nonu nornu
+ setglobal rnu
+ setlocal nu
+ call assert_equal(1, &g:rnu)
+
+ " setglobal MUST reset the other global value
+ set nonu nornu
+ setglobal nu
+ setglobal rnu
+ call assert_equal(1, &g:nu)
+
+ set nonu nornu
+ setglobal rnu
+ setglobal nu
+ call assert_equal(1, &g:rnu)
+
+ " set MUST reset the other global value
+ set nonu nornu
+ set nu
+ set rnu
+ call assert_equal(1, &g:nu)
+
+ set nonu nornu
+ set rnu
+ set nu
+ call assert_equal(1, &g:rnu)
+
+ set nu& rnu&
+endfunc
+
+func Test_number()
+ call s:test_windows(10, 20)
+ call setline(1, ["abcdefghij", "klmnopqrst", "uvwxyzABCD", "EFGHIJKLMN", "OPQRSTUVWX", "YZ"])
+ setl number
+ let lines = s:screen_lines(1, 4)
+ let expect = [
+\ " 1 abcd",
+\ " 2 klmn",
+\ " 3 uvwx",
+\ " 4 EFGH",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_relativenumber()
+ call s:test_windows(10, 20)
+ call setline(1, ["abcdefghij", "klmnopqrst", "uvwxyzABCD", "EFGHIJKLMN", "OPQRSTUVWX", "YZ"])
+ 3
+ setl relativenumber
+ let lines = s:screen_lines(1, 6)
+ let expect = [
+\ " 2 abcd",
+\ " 1 klmn",
+\ " 0 uvwx",
+\ " 1 EFGH",
+\ " 2 OPQR",
+\ " 3 YZ ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_number_with_relativenumber()
+ call s:test_windows(10, 20)
+ call setline(1, ["abcdefghij", "klmnopqrst", "uvwxyzABCD", "EFGHIJKLMN", "OPQRSTUVWX", "YZ"])
+ 4
+ setl number relativenumber
+ let lines = s:screen_lines(1, 6)
+ let expect = [
+\ " 3 abcd",
+\ " 2 klmn",
+\ " 1 uvwx",
+\ "4 EFGH",
+\ " 1 OPQR",
+\ " 2 YZ ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_number_with_linewrap1()
+ call s:test_windows(3, 20)
+ normal! 61ia
+ setl number wrap
+ call s:validate_cursor()
+ let lines = s:screen_lines(1, 3)
+ let expect = [
+\ "--1 aaaa",
+\ " aaaa",
+\ " aaaa",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+" Pending: https://groups.google.com/forum/#!topic/vim_dev/tzNKP7EDWYI
+func XTest_number_with_linewrap2()
+ call s:test_windows(3, 20)
+ normal! 61ia
+ setl number wrap
+ call s:validate_cursor()
+ 0
+ call s:validate_cursor()
+ let lines = s:screen_lines(1, 3)
+ let expect = [
+\ " 1 aaaa",
+\ " aaaa",
+\ " aaaa",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+" Pending: https://groups.google.com/forum/#!topic/vim_dev/tzNKP7EDWYI
+func XTest_number_with_linewrap3()
+ call s:test_windows(4, 20)
+ normal! 81ia
+ setl number wrap
+ call s:validate_cursor()
+ setl nonumber
+ call s:validate_cursor()
+ let lines = s:screen_lines(1, 4)
+ let expect = [
+\ "aaaaaaaa",
+\ "aaaaaaaa",
+\ "aaaaaaaa",
+\ "a ",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_numberwidth()
+ call s:test_windows(10, 20)
+ call setline(1, repeat(['aaaa'], 10))
+ setl number numberwidth=6
+ let lines = s:screen_lines(1, 3)
+ let expect = [
+\ " 1 aa",
+\ " 2 aa",
+\ " 3 aa",
+\ ]
+ call s:compare_lines(expect, lines)
+
+ set relativenumber
+ let lines = s:screen_lines(1, 3)
+ let expect = [
+\ "1 aa",
+\ " 1 aa",
+\ " 2 aa",
+\ ]
+ call s:compare_lines(expect, lines)
+
+ set nonumber
+ let lines = s:screen_lines(1, 3)
+ let expect = [
+\ " 0 aa",
+\ " 1 aa",
+\ " 2 aa",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
+
+func Test_numberwidth_adjusted()
+ call s:test_windows(10, 20)
+ call setline(1, repeat(['aaaa'], 10000))
+ setl number numberwidth=4
+ let lines = s:screen_lines(1, 3)
+ let expect = [
+\ " 1 aa",
+\ " 2 aa",
+\ " 3 aa",
+\ ]
+ call s:compare_lines(expect, lines)
+
+ $
+ let lines = s:screen_lines(8, 10)
+ let expect = [
+\ " 9998 aa",
+\ " 9999 aa",
+\ "10000 aa",
+\ ]
+ call s:compare_lines(expect, lines)
+
+ setl relativenumber
+ let lines = s:screen_lines(8, 10)
+ let expect = [
+\ " 2 aa",
+\ " 1 aa",
+\ "10000 aa",
+\ ]
+ call s:compare_lines(expect, lines)
+
+ setl nonumber
+ let lines = s:screen_lines(8, 10)
+ let expect = [
+\ " 2 aaaa",
+\ " 1 aaaa",
+\ " 0 aaaa",
+\ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+endfunc
diff --git a/src/nvim/testdir/test_options.vim b/src/nvim/testdir/test_options.vim
new file mode 100644
index 0000000000..7b640ee2ff
--- /dev/null
+++ b/src/nvim/testdir/test_options.vim
@@ -0,0 +1,412 @@
+" Test for options
+
+function! Test_whichwrap()
+ set whichwrap=b,s
+ call assert_equal('b,s', &whichwrap)
+
+ set whichwrap+=h,l
+ call assert_equal('b,s,h,l', &whichwrap)
+
+ set whichwrap+=h,l
+ call assert_equal('b,s,h,l', &whichwrap)
+
+ set whichwrap+=h,l
+ call assert_equal('b,s,h,l', &whichwrap)
+
+ set whichwrap=h,h
+ call assert_equal('h', &whichwrap)
+
+ set whichwrap=h,h,h
+ call assert_equal('h', &whichwrap)
+
+ set whichwrap&
+endfunction
+
+function! Test_isfname()
+ " This used to cause Vim to access uninitialized memory.
+ set isfname=
+ call assert_equal("~X", expand("~X"))
+ set isfname&
+endfunction
+
+function Test_wildchar()
+ " Empty 'wildchar' used to access invalid memory.
+ call assert_fails('set wildchar=', 'E521:')
+ call assert_fails('set wildchar=abc', 'E521:')
+ set wildchar=<Esc>
+ let a=execute('set wildchar?')
+ call assert_equal("\n wildchar=<Esc>", a)
+ set wildchar=27
+ let a=execute('set wildchar?')
+ call assert_equal("\n wildchar=<Esc>", a)
+ set wildchar&
+endfunction
+
+function! Test_options()
+ let caught = 'ok'
+ try
+ options
+ catch
+ let caught = v:throwpoint . "\n" . v:exception
+ endtry
+ call assert_equal('ok', caught)
+
+ " close option-window
+ close
+endfunction
+
+function! Test_path_keep_commas()
+ " Test that changing 'path' keeps two commas.
+ set path=foo,,bar
+ set path-=bar
+ set path+=bar
+ call assert_equal('foo,,bar', &path)
+
+ set path&
+endfunction
+
+func Test_filetype_valid()
+ if !has('autocmd')
+ return
+ endif
+ set ft=valid_name
+ call assert_equal("valid_name", &filetype)
+ set ft=valid-name
+ call assert_equal("valid-name", &filetype)
+
+ call assert_fails(":set ft=wrong;name", "E474:")
+ call assert_fails(":set ft=wrong\\\\name", "E474:")
+ call assert_fails(":set ft=wrong\\|name", "E474:")
+ call assert_fails(":set ft=wrong/name", "E474:")
+ call assert_fails(":set ft=wrong\\\nname", "E474:")
+ call assert_equal("valid-name", &filetype)
+
+ exe "set ft=trunc\x00name"
+ call assert_equal("trunc", &filetype)
+endfunc
+
+func Test_syntax_valid()
+ if !has('syntax')
+ return
+ endif
+ set syn=valid_name
+ call assert_equal("valid_name", &syntax)
+ set syn=valid-name
+ call assert_equal("valid-name", &syntax)
+
+ call assert_fails(":set syn=wrong;name", "E474:")
+ call assert_fails(":set syn=wrong\\\\name", "E474:")
+ call assert_fails(":set syn=wrong\\|name", "E474:")
+ call assert_fails(":set syn=wrong/name", "E474:")
+ call assert_fails(":set syn=wrong\\\nname", "E474:")
+ call assert_equal("valid-name", &syntax)
+
+ exe "set syn=trunc\x00name"
+ call assert_equal("trunc", &syntax)
+endfunc
+
+func Test_keymap_valid()
+ if !has('keymap')
+ return
+ endif
+ call assert_fails(":set kmp=valid_name", "E544:")
+ call assert_fails(":set kmp=valid_name", "valid_name")
+ call assert_fails(":set kmp=valid-name", "E544:")
+ call assert_fails(":set kmp=valid-name", "valid-name")
+
+ call assert_fails(":set kmp=wrong;name", "E474:")
+ call assert_fails(":set kmp=wrong\\\\name", "E474:")
+ call assert_fails(":set kmp=wrong\\|name", "E474:")
+ call assert_fails(":set kmp=wrong/name", "E474:")
+ call assert_fails(":set kmp=wrong\\\nname", "E474:")
+
+ call assert_fails(":set kmp=trunc\x00name", "E544:")
+ call assert_fails(":set kmp=trunc\x00name", "trunc")
+endfunc
+
+func Check_dir_option(name)
+ " Check that it's possible to set the option.
+ exe 'set ' . a:name . '=/usr/share/dict/words'
+ call assert_equal('/usr/share/dict/words', eval('&' . a:name))
+ exe 'set ' . a:name . '=/usr/share/dict/words,/and/there'
+ call assert_equal('/usr/share/dict/words,/and/there', eval('&' . a:name))
+ exe 'set ' . a:name . '=/usr/share/dict\ words'
+ call assert_equal('/usr/share/dict words', eval('&' . a:name))
+
+ " Check rejecting weird characters.
+ call assert_fails("set " . a:name . "=/not&there", "E474:")
+ call assert_fails("set " . a:name . "=/not>there", "E474:")
+ call assert_fails("set " . a:name . "=/not.*there", "E474:")
+endfunc
+
+func Test_cinkeys()
+ " This used to cause invalid memory access
+ set cindent cinkeys=0
+ norm a
+ set cindent& cinkeys&
+endfunc
+
+func Test_dictionary()
+ call Check_dir_option('dictionary')
+endfunc
+
+func Test_thesaurus()
+ call Check_dir_option('thesaurus')
+endfun
+
+func Test_set_completion()
+ call feedkeys(":set di\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"set dictionary diff diffexpr diffopt digraph directory display', @:)
+
+ " Expand boolan options. When doing :set no<Tab>
+ " vim displays the options names without "no" but completion uses "no...".
+ call feedkeys(":set nodi\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"set nodiff digraph', @:)
+
+ call feedkeys(":set invdi\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"set invdiff digraph', @:)
+
+ " Expand abbreviation of options.
+ call feedkeys(":set ts\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"set tabstop thesaurus', @:)
+
+ " Expand current value
+ call feedkeys(":set fileencodings=\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"set fileencodings=ucs-bom,utf-8,default,latin1', @:)
+
+ call feedkeys(":set fileencodings:\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"set fileencodings:ucs-bom,utf-8,default,latin1', @:)
+
+ " Expand directories.
+ let shellslash = &shellslash
+ set shellslash
+ call feedkeys(":set cdpath=./\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_match('./samples/ ', @:)
+ call assert_notmatch('./small.vim ', @:)
+
+ " Expand files and directories.
+ call feedkeys(":set tags=./\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_match('./samples/ ./sautest/ ./setup.vim ./shared.vim', @:)
+
+ call feedkeys(":set tags=./\\\\ dif\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"set tags=./\\ diff diffexpr diffopt', @:)
+ let &shellslash = shellslash
+endfunc
+
+func Test_set_errors()
+ call assert_fails('set scroll=-1', 'E49:')
+ call assert_fails('set backupcopy=', 'E474:')
+ call assert_fails('set regexpengine=3', 'E474:')
+ call assert_fails('set history=10001', 'E474:')
+ call assert_fails('set numberwidth=11', 'E474:')
+ call assert_fails('set colorcolumn=-a')
+ call assert_fails('set colorcolumn=a')
+ call assert_fails('set colorcolumn=1,')
+ call assert_fails('set cmdheight=-1', 'E487:')
+ call assert_fails('set cmdwinheight=-1', 'E487:')
+ if has('conceal')
+ call assert_fails('set conceallevel=-1', 'E487:')
+ call assert_fails('set conceallevel=4', 'E474:')
+ endif
+ call assert_fails('set helpheight=-1', 'E487:')
+ call assert_fails('set history=-1', 'E487:')
+ call assert_fails('set report=-1', 'E487:')
+ call assert_fails('set shiftwidth=-1', 'E487:')
+ call assert_fails('set sidescroll=-1', 'E487:')
+ call assert_fails('set tabstop=-1', 'E487:')
+ call assert_fails('set textwidth=-1', 'E487:')
+ call assert_fails('set timeoutlen=-1', 'E487:')
+ call assert_fails('set updatecount=-1', 'E487:')
+ call assert_fails('set updatetime=-1', 'E487:')
+ call assert_fails('set winheight=-1', 'E487:')
+ call assert_fails('set tabstop!', 'E488:')
+ call assert_fails('set xxx', 'E518:')
+ call assert_fails('set beautify?', 'E518:')
+ call assert_fails('set undolevels=x', 'E521:')
+ call assert_fails('set tabstop=', 'E521:')
+ call assert_fails('set comments=-', 'E524:')
+ call assert_fails('set comments=a', 'E525:')
+ call assert_fails('set foldmarker=x', 'E536:')
+ call assert_fails('set commentstring=x', 'E537:')
+ call assert_fails('set complete=x', 'E539:')
+ call assert_fails('set statusline=%{', 'E540:')
+ call assert_fails('set statusline=' . repeat("%p", 81), 'E541:')
+ call assert_fails('set statusline=%(', 'E542:')
+ if has('cursorshape')
+ " This invalid value for 'guicursor' used to cause Vim to crash.
+ call assert_fails('set guicursor=i-ci,r-cr:h', 'E545:')
+ call assert_fails('set guicursor=i-ci', 'E545:')
+ call assert_fails('set guicursor=x', 'E545:')
+ call assert_fails('set guicursor=r-cr:horx', 'E548:')
+ call assert_fails('set guicursor=r-cr:hor0', 'E549:')
+ endif
+ call assert_fails('set backupext=~ patchmode=~', 'E589:')
+ call assert_fails('set winminheight=10 winheight=9', 'E591:')
+ call assert_fails('set winminwidth=10 winwidth=9', 'E592:')
+ call assert_fails("set showbreak=\x01", 'E595:')
+ call assert_fails('set t_foo=', 'E846:')
+endfunc
+
+func Test_set_ttytype()
+ " Nvim does not support 'ttytype'.
+ if !has('nvim') && !has('gui_running') && has('unix')
+ " Setting 'ttytype' used to cause a double-free when exiting vim and
+ " when vim is compiled with -DEXITFREE.
+ set ttytype=ansi
+ call assert_equal('ansi', &ttytype)
+ call assert_equal(&ttytype, &term)
+ set ttytype=xterm
+ call assert_equal('xterm', &ttytype)
+ call assert_equal(&ttytype, &term)
+ " "set ttytype=" gives E522 instead of E529
+ " in travis on some builds. Why? Catch both for now
+ try
+ set ttytype=
+ call assert_report('set ttytype= did not fail')
+ catch /E529\|E522/
+ endtry
+
+ " Some systems accept any terminal name and return dumb settings,
+ " check for failure of finding the entry and for missing 'cm' entry.
+ try
+ set ttytype=xxx
+ call assert_report('set ttytype=xxx did not fail')
+ catch /E522\|E437/
+ endtry
+
+ set ttytype&
+ call assert_equal(&ttytype, &term)
+ endif
+endfunc
+
+func Test_complete()
+ " Trailing single backslash used to cause invalid memory access.
+ set complete=s\
+ new
+ call feedkeys("i\<C-N>\<Esc>", 'xt')
+ bwipe!
+ set complete&
+endfun
+
+func ResetIndentexpr()
+ set indentexpr=
+endfunc
+
+func Test_set_indentexpr()
+ " this was causing usage of freed memory
+ set indentexpr=ResetIndentexpr()
+ new
+ call feedkeys("i\<c-f>", 'x')
+ call assert_equal('', &indentexpr)
+ bwipe!
+endfunc
+
+func Test_copy_winopt()
+ set hidden
+
+ " Test copy option from current buffer in window
+ split
+ enew
+ setlocal numberwidth=5
+ wincmd w
+ call assert_equal(4,&numberwidth)
+ bnext
+ call assert_equal(5,&numberwidth)
+ bw!
+ call assert_equal(4,&numberwidth)
+
+ " Test copy value from window that used to be display the buffer
+ split
+ enew
+ setlocal numberwidth=6
+ bnext
+ wincmd w
+ call assert_equal(4,&numberwidth)
+ bnext
+ call assert_equal(6,&numberwidth)
+ bw!
+
+ " Test that if buffer is current, don't use the stale cached value
+ " from the last time the buffer was displayed.
+ split
+ enew
+ setlocal numberwidth=7
+ bnext
+ bnext
+ setlocal numberwidth=8
+ wincmd w
+ call assert_equal(4,&numberwidth)
+ bnext
+ call assert_equal(8,&numberwidth)
+ bw!
+
+ " Test value is not copied if window already has seen the buffer
+ enew
+ split
+ setlocal numberwidth=9
+ bnext
+ setlocal numberwidth=10
+ wincmd w
+ call assert_equal(4,&numberwidth)
+ bnext
+ call assert_equal(4,&numberwidth)
+ bw!
+
+ set hidden&
+endfunc
+
+func Test_shortmess_F()
+ new
+ call assert_match('\[No Name\]', execute('file'))
+ set shortmess+=F
+ call assert_match('\[No Name\]', execute('file'))
+ call assert_match('^\s*$', execute('file foo'))
+ call assert_match('foo', execute('file'))
+ set shortmess-=F
+ call assert_match('bar', execute('file bar'))
+ call assert_match('bar', execute('file'))
+ set shortmess&
+ bwipe
+endfunc
+
+func Test_set_all()
+ set tw=75
+ set iskeyword=a-z,A-Z
+ set nosplitbelow
+ let out = execute('set all')
+ call assert_match('textwidth=75', out)
+ call assert_match('iskeyword=a-z,A-Z', out)
+ call assert_match('nosplitbelow', out)
+ set tw& iskeyword& splitbelow&
+endfunc
+
+func Test_set_values()
+ " The file is only generated when running "make test" in the src directory.
+ if filereadable('opt_test.vim')
+ source opt_test.vim
+ endif
+endfunc
+
+func Test_shortmess_F2()
+ e file1
+ e file2
+ " Accommodate Nvim default.
+ set shortmess-=F
+ call assert_match('file1', execute('bn', ''))
+ call assert_match('file2', execute('bn', ''))
+ set shortmess+=F
+ call assert_true(empty(execute('bn', '')))
+ call assert_true(empty(execute('bn', '')))
+ set hidden
+ call assert_true(empty(execute('bn', '')))
+ call assert_true(empty(execute('bn', '')))
+ set nohidden
+ call assert_true(empty(execute('bn', '')))
+ call assert_true(empty(execute('bn', '')))
+ " Accommodate Nvim default.
+ set shortmess-=F
+ call assert_match('file1', execute('bn', ''))
+ call assert_match('file2', execute('bn', ''))
+ bwipe
+ bwipe
+endfunc
diff --git a/src/nvim/testdir/test_partial.vim b/src/nvim/testdir/test_partial.vim
new file mode 100644
index 0000000000..de5c26c2dd
--- /dev/null
+++ b/src/nvim/testdir/test_partial.vim
@@ -0,0 +1,351 @@
+" Test binding arguments to a Funcref.
+
+func MyFunc(arg1, arg2, arg3)
+ return a:arg1 . '/' . a:arg2 . '/' . a:arg3
+endfunc
+
+func MySort(up, one, two)
+ if a:one == a:two
+ return 0
+ endif
+ if a:up
+ return a:one > a:two ? 1 : -1
+ endif
+ return a:one < a:two ? 1 : -1
+endfunc
+
+func MyMap(sub, index, val)
+ return a:val - a:sub
+endfunc
+
+func MyFilter(threshold, index, val)
+ return a:val > a:threshold
+endfunc
+
+func Test_partial_args()
+ let Cb = function('MyFunc', ["foo", "bar"])
+
+ call Cb("zzz")
+ call assert_equal("foo/bar/xxx", Cb("xxx"))
+ call assert_equal("foo/bar/yyy", call(Cb, ["yyy"]))
+ let Cb2 = function(Cb)
+ call assert_equal("foo/bar/zzz", Cb2("zzz"))
+ let Cb3 = function(Cb, ["www"])
+ call assert_equal("foo/bar/www", Cb3())
+
+ let Cb = function('MyFunc', [])
+ call assert_equal("a/b/c", Cb("a", "b", "c"))
+ let Cb2 = function(Cb, [])
+ call assert_equal("a/b/d", Cb2("a", "b", "d"))
+ let Cb3 = function(Cb, ["a", "b"])
+ call assert_equal("a/b/e", Cb3("e"))
+
+ let Sort = function('MySort', [1])
+ call assert_equal([1, 2, 3], sort([3, 1, 2], Sort))
+ let Sort = function('MySort', [0])
+ call assert_equal([3, 2, 1], sort([3, 1, 2], Sort))
+
+ let Map = function('MyMap', [2])
+ call assert_equal([-1, 0, 1], map([1, 2, 3], Map))
+ let Map = function('MyMap', [3])
+ call assert_equal([-2, -1, 0], map([1, 2, 3], Map))
+
+ let Filter = function('MyFilter', [1])
+ call assert_equal([2, 3], filter([1, 2, 3], Filter))
+ let Filter = function('MyFilter', [2])
+ call assert_equal([3], filter([1, 2, 3], Filter))
+endfunc
+
+func MyDictFunc(arg1, arg2) dict
+ return self.name . '/' . a:arg1 . '/' . a:arg2
+endfunc
+
+func Test_partial_dict()
+ let dict = {'name': 'hello'}
+ let Cb = function('MyDictFunc', ["foo", "bar"], dict)
+ call assert_equal("hello/foo/bar", Cb())
+ call assert_fails('Cb("xxx")', 'E492:')
+
+ let Cb = function('MyDictFunc', [], dict)
+ call assert_equal("hello/ttt/xxx", Cb("ttt", "xxx"))
+ call assert_fails('Cb("yyy")', 'E492:')
+
+ let Cb = function('MyDictFunc', ["foo"], dict)
+ call assert_equal("hello/foo/xxx", Cb("xxx"))
+ call assert_fails('Cb()', 'E492:')
+ let Cb = function('MyDictFunc', dict)
+ call assert_equal("hello/xxx/yyy", Cb("xxx", "yyy"))
+ call assert_fails('Cb("fff")', 'E492:')
+
+ let Cb = function('MyDictFunc', dict)
+ call assert_equal({"foo": "hello/foo/1", "bar": "hello/bar/2"}, map({"foo": 1, "bar": 2}, Cb))
+
+ let dict = {"tr": function('tr', ['hello', 'h', 'H'])}
+ call assert_equal("Hello", dict.tr())
+endfunc
+
+func Test_partial_implicit()
+ let dict = {'name': 'foo'}
+ func dict.MyFunc(arg) dict
+ return self.name . '/' . a:arg
+ endfunc
+
+ call assert_equal('foo/bar', dict.MyFunc('bar'))
+
+ call assert_fails('let func = dict.MyFunc', 'E704:')
+ let Func = dict.MyFunc
+ call assert_equal('foo/aaa', Func('aaa'))
+
+ let Func = function(dict.MyFunc, ['bbb'])
+ call assert_equal('foo/bbb', Func())
+endfunc
+
+fun InnerCall(funcref)
+ return a:funcref
+endfu
+
+fun OuterCall()
+ let opt = { 'func' : function('sin') }
+ call InnerCall(opt.func)
+endfu
+
+func Test_function_in_dict()
+ call OuterCall()
+endfunc
+
+function! s:cache_clear() dict
+ return self.name
+endfunction
+
+func Test_script_function_in_dict()
+ let s:obj = {'name': 'foo'}
+ let s:obj2 = {'name': 'bar'}
+
+ let s:obj['clear'] = function('s:cache_clear')
+
+ call assert_equal('foo', s:obj.clear())
+ let F = s:obj.clear
+ call assert_equal('foo', F())
+ call assert_equal('foo', call(s:obj.clear, [], s:obj))
+ call assert_equal('bar', call(s:obj.clear, [], s:obj2))
+
+ let s:obj2['clear'] = function('s:cache_clear')
+ call assert_equal('bar', s:obj2.clear())
+ let B = s:obj2.clear
+ call assert_equal('bar', B())
+endfunc
+
+function! s:cache_arg(arg) dict
+ let s:result = self.name . '/' . a:arg
+ return s:result
+endfunction
+
+func Test_script_function_in_dict_arg()
+ let s:obj = {'name': 'foo'}
+ let s:obj['clear'] = function('s:cache_arg')
+
+ call assert_equal('foo/bar', s:obj.clear('bar'))
+ let F = s:obj.clear
+ let s:result = ''
+ call assert_equal('foo/bar', F('bar'))
+ call assert_equal('foo/bar', s:result)
+
+ let s:obj['clear'] = function('s:cache_arg', ['bar'])
+ call assert_equal('foo/bar', s:obj.clear())
+ let s:result = ''
+ call s:obj.clear()
+ call assert_equal('foo/bar', s:result)
+
+ let F = s:obj.clear
+ call assert_equal('foo/bar', F())
+ let s:result = ''
+ call F()
+ call assert_equal('foo/bar', s:result)
+
+ call assert_equal('foo/bar', call(s:obj.clear, [], s:obj))
+endfunc
+
+func Test_partial_exists()
+ let F = function('MyFunc')
+ call assert_true(exists('*F'))
+ let lF = [F]
+ call assert_true(exists('*lF[0]'))
+
+ let F = function('MyFunc', ['arg'])
+ call assert_true(exists('*F'))
+ let lF = [F]
+ call assert_true(exists('*lF[0]'))
+endfunc
+
+func Test_partial_string()
+ let F = function('MyFunc')
+ call assert_equal("function('MyFunc')", string(F))
+ let F = function('MyFunc', ['foo'])
+ call assert_equal("function('MyFunc', ['foo'])", string(F))
+ let F = function('MyFunc', ['foo', 'bar'])
+ call assert_equal("function('MyFunc', ['foo', 'bar'])", string(F))
+ let d = {'one': 1}
+ let F = function('MyFunc', d)
+ call assert_equal("function('MyFunc', {'one': 1})", string(F))
+ let F = function('MyFunc', ['foo'], d)
+ call assert_equal("function('MyFunc', ['foo'], {'one': 1})", string(F))
+endfunc
+
+func Test_func_unref()
+ let obj = {}
+ function! obj.func() abort
+ endfunction
+ let funcnumber = matchstr(string(obj.func), '^function(''\zs.\{-}\ze''')
+ call assert_true(exists('*{' . funcnumber . '}'))
+ unlet obj
+ call assert_false(exists('*{' . funcnumber . '}'))
+endfunc
+
+func Test_redefine_dict_func()
+ let d = {}
+ function d.test4()
+ endfunction
+ let d.test4 = d.test4
+ try
+ function! d.test4(name)
+ endfunction
+ catch
+ call assert_true(v:errmsg, v:exception)
+ endtry
+endfunc
+
+" This caused double free on exit if EXITFREE is defined.
+func Test_cyclic_list_arg()
+ let l = []
+ let Pt = function('string', [l])
+ call add(l, Pt)
+ unlet l
+ unlet Pt
+endfunc
+
+" This caused double free on exit if EXITFREE is defined.
+func Test_cyclic_dict_arg()
+ let d = {}
+ let Pt = function('string', [d])
+ let d.Pt = Pt
+ unlet d
+ unlet Pt
+endfunc
+
+func Ignored(job1, job2, status)
+endfunc
+
+" func Test_cycle_partial_job()
+" let job = job_start('echo')
+" call job_setoptions(job, {'exit_cb': function('Ignored', [job])})
+" unlet job
+" endfunc
+
+" func Test_ref_job_partial_dict()
+" let g:ref_job = job_start('echo')
+" let d = {'a': 'b'}
+" call job_setoptions(g:ref_job, {'exit_cb': function('string', [], d)})
+" endfunc
+
+func Test_auto_partial_rebind()
+ let dict1 = {'name': 'dict1'}
+ func! dict1.f1()
+ return self.name
+ endfunc
+ let dict1.f2 = function(dict1.f1, dict1)
+
+ call assert_equal('dict1', dict1.f1())
+ call assert_equal('dict1', dict1['f1']())
+ call assert_equal('dict1', dict1.f2())
+ call assert_equal('dict1', dict1['f2']())
+
+ let dict2 = {'name': 'dict2'}
+ let dict2.f1 = dict1.f1
+ let dict2.f2 = dict1.f2
+
+ call assert_equal('dict2', dict2.f1())
+ call assert_equal('dict2', dict2['f1']())
+ call assert_equal('dict1', dict2.f2())
+ call assert_equal('dict1', dict2['f2']())
+endfunc
+
+func Test_get_partial_items()
+ let dict = {'name': 'hello'}
+ let args = ["foo", "bar"]
+ let Func = function('MyDictFunc')
+ let Cb = function('MyDictFunc', args, dict)
+
+ call assert_equal(Func, get(Cb, 'func'))
+ call assert_equal('MyDictFunc', get(Cb, 'name'))
+ call assert_equal(args, get(Cb, 'args'))
+ call assert_equal(dict, get(Cb, 'dict'))
+ call assert_fails('call get(Cb, "xxx")', 'E475:')
+
+ call assert_equal(Func, get(Func, 'func'))
+ call assert_equal('MyDictFunc', get(Func, 'name'))
+ call assert_equal([], get(Func, 'args'))
+ call assert_true(empty( get(Func, 'dict')))
+endfunc
+
+func Test_compare_partials()
+ let d1 = {}
+ let d2 = {}
+
+ function d1.f1() dict
+ endfunction
+
+ function d1.f2() dict
+ endfunction
+
+ let F1 = get(d1, 'f1')
+ let F2 = get(d1, 'f2')
+
+ let F1d1 = function(F1, d1)
+ let F2d1 = function(F2, d2)
+ let F1d1a1 = function(F1d1, [1])
+ let F1d1a12 = function(F1d1, [1, 2])
+ let F1a1 = function(F1, [1])
+ let F1a2 = function(F1, [2])
+ let F1d2 = function(F1, d2)
+ let d3 = {'f1': F1, 'f2': F2}
+ let F1d3 = function(F1, d3)
+ let F1ad1 = function(F1, [d1])
+ let F1ad3 = function(F1, [d3])
+
+ call assert_match('^function(''\d\+'')$', string(F1)) " Not a partial
+ call assert_match('^function(''\d\+'')$', string(F2)) " Not a partial
+ call assert_match('^function(''\d\+'', {.*})$', string(F1d1)) " A partial
+ call assert_match('^function(''\d\+'', {.*})$', string(F2d1)) " A partial
+ call assert_match('^function(''\d\+'', \[.*\])$', string(F1a1)) " No dict
+
+ " !=
+ let X = F1
+ call assert_false(F1 != X) " same function
+ let X = F1d1
+ call assert_false(F1d1 != X) " same partial
+ let X = F1d1a1
+ call assert_false(F1d1a1 != X) " same partial
+ let X = F1a1
+ call assert_false(F1a1 != X) " same partial
+
+ call assert_true(F1 != F2) " Different functions
+ call assert_true(F1 != F1d1) " Partial /= non-partial
+ call assert_true(F1d1a1 != F1d1a12) " Different number of arguments
+ call assert_true(F1a1 != F1d1a12) " One has no dict
+ call assert_true(F1a1 != F1a2) " Different arguments
+ call assert_true(F1d2 != F1d1) " Different dictionaries
+ call assert_false(F1d1 != F1d3) " Equal dictionaries, even though d1 isnot d3
+
+ " isnot, option 1
+ call assert_true(F1 isnot# F2) " Different functions
+ call assert_true(F1 isnot# F1d1) " Partial /= non-partial
+ call assert_true(F1d1 isnot# F1d3) " d1 isnot d3, even though d1 == d3
+ call assert_true(F1a1 isnot# F1d1a12) " One has no dict
+ call assert_true(F1a1 isnot# F1a2) " Different number of arguments
+ call assert_true(F1ad1 isnot# F1ad3) " In arguments d1 isnot d3
+
+ " isnot, option 2
+ call assert_true(F1 isnot# F2) " Different functions
+ call assert_true(F1 isnot# F1d1) " Partial /= non-partial
+ call assert_true(d1.f1 isnot# d1.f1) " handle_subscript creates new partial each time
+endfunc
diff --git a/src/nvim/testdir/test_plus_arg_edit.vim b/src/nvim/testdir/test_plus_arg_edit.vim
new file mode 100644
index 0000000000..71dbea1991
--- /dev/null
+++ b/src/nvim/testdir/test_plus_arg_edit.vim
@@ -0,0 +1,10 @@
+" Tests for complicated + argument to :edit command
+function Test_edit()
+ call writefile(["foo|bar"], "Xfile1")
+ call writefile(["foo/bar"], "Xfile2")
+ edit +1|s/|/PIPE/|w Xfile1| e Xfile2|1 | s/\//SLASH/|w
+ call assert_equal(["fooPIPEbar"], readfile("Xfile1"))
+ call assert_equal(["fooSLASHbar"], readfile("Xfile2"))
+ call delete('Xfile1')
+ call delete('Xfile2')
+endfunction
diff --git a/src/nvim/testdir/test_popup.vim b/src/nvim/testdir/test_popup.vim
new file mode 100644
index 0000000000..6c43cbc1dc
--- /dev/null
+++ b/src/nvim/testdir/test_popup.vim
@@ -0,0 +1,715 @@
+" Test for completion menu
+
+source shared.vim
+
+let g:months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
+let g:setting = ''
+
+func! ListMonths()
+ if g:setting != ''
+ exe ":set" g:setting
+ endif
+ let mth = copy(g:months)
+ let entered = strcharpart(getline('.'),0,col('.'))
+ if !empty(entered)
+ let mth = filter(mth, 'v:val=~"^".entered')
+ endif
+ call complete(1, mth)
+ return ''
+endfunc
+
+func! Test_popup_complete2()
+ " Although the popupmenu is not visible, this does not mean completion mode
+ " has ended. After pressing <f5> to complete the currently typed char, Vim
+ " still stays in the first state of the completion (:h ins-completion-menu),
+ " although the popupmenu wasn't shown <c-e> will remove the inserted
+ " completed text (:h complete_CTRL-E), while the following <c-e> will behave
+ " like expected (:h i_CTRL-E)
+ new
+ inoremap <f5> <c-r>=ListMonths()<cr>
+ call append(1, ["December2015"])
+ :1
+ call feedkeys("aD\<f5>\<C-E>\<C-E>\<C-E>\<C-E>\<enter>\<esc>", 'tx')
+ call assert_equal(["Dece", "", "December2015"], getline(1,3))
+ %d
+ bw!
+endfu
+
+func! Test_popup_complete()
+ new
+ inoremap <f5> <c-r>=ListMonths()<cr>
+
+ " <C-E> - select original typed text before the completion started
+ call feedkeys("aJu\<f5>\<down>\<c-e>\<esc>", 'tx')
+ call assert_equal(["Ju"], getline(1,2))
+ %d
+
+ " <C-Y> - accept current match
+ call feedkeys("a\<f5>". repeat("\<down>",7). "\<c-y>\<esc>", 'tx')
+ call assert_equal(["August"], getline(1,2))
+ %d
+
+ " <BS> - Delete one character from the inserted text (state: 1)
+ " TODO: This should not end the completion, but it does.
+ " This should according to the documentation:
+ " January
+ " but instead, this does
+ " Januar
+ " (idea is, C-L inserts the match from the popup menu
+ " but if the menu is closed, it will insert the character <c-l>
+ call feedkeys("aJ\<f5>\<bs>\<c-l>\<esc>", 'tx')
+ call assert_equal(["Januar "], getline(1,2))
+ %d
+
+ " any-non special character: Stop completion without changing the match
+ " and insert the typed character
+ call feedkeys("a\<f5>20", 'tx')
+ call assert_equal(["January20"], getline(1,2))
+ %d
+
+ " any-non printable, non-white character: Add this character and
+ " reduce number of matches
+ call feedkeys("aJu\<f5>\<c-p>l\<c-y>", 'tx')
+ call assert_equal(["Jul"], getline(1,2))
+ %d
+
+ " any-non printable, non-white character: Add this character and
+ " reduce number of matches
+ call feedkeys("aJu\<f5>\<c-p>l\<c-n>\<c-y>", 'tx')
+ call assert_equal(["July"], getline(1,2))
+ %d
+
+ " any-non printable, non-white character: Add this character and
+ " reduce number of matches
+ call feedkeys("aJu\<f5>\<c-p>l\<c-e>", 'tx')
+ call assert_equal(["Jul"], getline(1,2))
+ %d
+
+ " <BS> - Delete one character from the inserted text (state: 2)
+ call feedkeys("a\<f5>\<c-n>\<bs>", 'tx')
+ call assert_equal(["Februar"], getline(1,2))
+ %d
+
+ " <c-l> - Insert one character from the current match
+ call feedkeys("aJ\<f5>".repeat("\<c-n>",3)."\<c-l>\<esc>", 'tx')
+ call assert_equal(["J "], getline(1,2))
+ %d
+
+ " <c-l> - Insert one character from the current match
+ call feedkeys("aJ\<f5>".repeat("\<c-n>",4)."\<c-l>\<esc>", 'tx')
+ call assert_equal(["January "], getline(1,2))
+ %d
+
+ " <c-y> - Accept current selected match
+ call feedkeys("aJ\<f5>\<c-y>\<esc>", 'tx')
+ call assert_equal(["January"], getline(1,2))
+ %d
+
+ " <c-e> - End completion, go back to what was there before selecting a match
+ call feedkeys("aJu\<f5>\<c-e>\<esc>", 'tx')
+ call assert_equal(["Ju"], getline(1,2))
+ %d
+
+ " <PageUp> - Select a match several entries back
+ call feedkeys("a\<f5>\<PageUp>\<c-y>\<esc>", 'tx')
+ call assert_equal([""], getline(1,2))
+ %d
+
+ " <PageUp><PageUp> - Select a match several entries back
+ call feedkeys("a\<f5>\<PageUp>\<PageUp>\<c-y>\<esc>", 'tx')
+ call assert_equal(["December"], getline(1,2))
+ %d
+
+ " <PageUp><PageUp><PageUp> - Select a match several entries back
+ call feedkeys("a\<f5>\<PageUp>\<PageUp>\<PageUp>\<c-y>\<esc>", 'tx')
+ call assert_equal(["February"], getline(1,2))
+ %d
+
+ " <PageDown> - Select a match several entries further
+ call feedkeys("a\<f5>\<PageDown>\<c-y>\<esc>", 'tx')
+ call assert_equal(["November"], getline(1,2))
+ %d
+
+ " <PageDown><PageDown> - Select a match several entries further
+ call feedkeys("a\<f5>\<PageDown>\<PageDown>\<c-y>\<esc>", 'tx')
+ call assert_equal(["December"], getline(1,2))
+ %d
+
+ " <PageDown><PageDown><PageDown> - Select a match several entries further
+ call feedkeys("a\<f5>\<PageDown>\<PageDown>\<PageDown>\<c-y>\<esc>", 'tx')
+ call assert_equal([""], getline(1,2))
+ %d
+
+ " <PageDown><PageDown><PageDown><PageDown> - Select a match several entries further
+ call feedkeys("a\<f5>".repeat("\<PageDown>",4)."\<c-y>\<esc>", 'tx')
+ call assert_equal(["October"], getline(1,2))
+ %d
+
+ " <Up> - Select a match don't insert yet
+ call feedkeys("a\<f5>\<Up>\<c-y>\<esc>", 'tx')
+ call assert_equal([""], getline(1,2))
+ %d
+
+ " <Up><Up> - Select a match don't insert yet
+ call feedkeys("a\<f5>\<Up>\<Up>\<c-y>\<esc>", 'tx')
+ call assert_equal(["December"], getline(1,2))
+ %d
+
+ " <Up><Up><Up> - Select a match don't insert yet
+ call feedkeys("a\<f5>\<Up>\<Up>\<Up>\<c-y>\<esc>", 'tx')
+ call assert_equal(["November"], getline(1,2))
+ %d
+
+ " <Tab> - Stop completion and insert the match
+ call feedkeys("a\<f5>\<Tab>\<c-y>\<esc>", 'tx')
+ call assert_equal(["January "], getline(1,2))
+ %d
+
+ " <Space> - Stop completion and insert the match
+ call feedkeys("a\<f5>".repeat("\<c-p>",5)." \<esc>", 'tx')
+ call assert_equal(["September "], getline(1,2))
+ %d
+
+ " <Enter> - Use the text and insert line break (state: 1)
+ call feedkeys("a\<f5>\<enter>\<esc>", 'tx')
+ call assert_equal(["January", ''], getline(1,2))
+ %d
+
+ " <Enter> - Insert the current selected text (state: 2)
+ call feedkeys("a\<f5>".repeat("\<Up>",5)."\<enter>\<esc>", 'tx')
+ call assert_equal(["September"], getline(1,2))
+ %d
+
+ " Insert match immediately, if there is only one match
+ " <c-y> selects a character from the line above
+ call append(0, ["December2015"])
+ call feedkeys("aD\<f5>\<C-Y>\<C-Y>\<C-Y>\<C-Y>\<enter>\<esc>", 'tx')
+ call assert_equal(["December2015", "December2015", ""], getline(1,3))
+ %d
+
+ " use menuone for 'completeopt'
+ " Since for the first <c-y> the menu is still shown, will only select
+ " three letters from the line above
+ set completeopt&vim
+ set completeopt+=menuone
+ call append(0, ["December2015"])
+ call feedkeys("aD\<f5>\<C-Y>\<C-Y>\<C-Y>\<C-Y>\<enter>\<esc>", 'tx')
+ call assert_equal(["December2015", "December201", ""], getline(1,3))
+ %d
+
+ " use longest for 'completeopt'
+ set completeopt&vim
+ call feedkeys("aM\<f5>\<C-N>\<C-P>\<c-e>\<enter>\<esc>", 'tx')
+ set completeopt+=longest
+ call feedkeys("aM\<f5>\<C-N>\<C-P>\<c-e>\<enter>\<esc>", 'tx')
+ call assert_equal(["M", "Ma", ""], getline(1,3))
+ %d
+
+ " use noselect/noinsert for 'completeopt'
+ set completeopt&vim
+ call feedkeys("aM\<f5>\<enter>\<esc>", 'tx')
+ set completeopt+=noselect
+ call feedkeys("aM\<f5>\<enter>\<esc>", 'tx')
+ set completeopt-=noselect completeopt+=noinsert
+ call feedkeys("aM\<f5>\<enter>\<esc>", 'tx')
+ call assert_equal(["March", "M", "March"], getline(1,4))
+ %d
+endfu
+
+
+func! Test_popup_completion_insertmode()
+ new
+ inoremap <F5> <C-R>=ListMonths()<CR>
+
+ call feedkeys("a\<f5>\<down>\<enter>\<esc>", 'tx')
+ call assert_equal('February', getline(1))
+ %d
+ " Set noinsertmode
+ let g:setting = 'noinsertmode'
+ call feedkeys("a\<f5>\<down>\<enter>\<esc>", 'tx')
+ call assert_equal('February', getline(1))
+ call assert_false(pumvisible())
+ %d
+ " Go through all matches, until none is selected
+ let g:setting = ''
+ call feedkeys("a\<f5>". repeat("\<c-n>",12)."\<enter>\<esc>", 'tx')
+ call assert_equal('', getline(1))
+ %d
+ " select previous entry
+ call feedkeys("a\<f5>\<c-p>\<enter>\<esc>", 'tx')
+ call assert_equal('', getline(1))
+ %d
+ " select last entry
+ call feedkeys("a\<f5>\<c-p>\<c-p>\<enter>\<esc>", 'tx')
+ call assert_equal('December', getline(1))
+
+ iunmap <F5>
+endfunc
+
+" TODO: Fix what breaks after this line.
+" - Do not use "q!", it may exit Vim if there is an error
+finish
+
+func Test_noinsert_complete()
+ function! s:complTest1() abort
+ call complete(1, ['source', 'soundfold'])
+ return ''
+ endfunction
+
+ function! s:complTest2() abort
+ call complete(1, ['source', 'soundfold'])
+ return ''
+ endfunction
+
+ new
+ set completeopt+=noinsert
+ inoremap <F5> <C-R>=s:complTest1()<CR>
+ call feedkeys("i\<F5>soun\<CR>\<CR>\<ESC>.", 'tx')
+ call assert_equal('soundfold', getline(1))
+ call assert_equal('soundfold', getline(2))
+ bwipe!
+
+ new
+ inoremap <F5> <C-R>=s:complTest2()<CR>
+ call feedkeys("i\<F5>\<CR>\<ESC>", 'tx')
+ call assert_equal('source', getline(1))
+ bwipe!
+
+ set completeopt-=noinsert
+ iunmap <F5>
+endfunc
+
+func Test_compl_vim_cmds_after_register_expr()
+ function! s:test_func()
+ return 'autocmd '
+ endfunction
+ augroup AAAAA_Group
+ au!
+ augroup END
+
+ new
+ call feedkeys("i\<c-r>=s:test_func()\<CR>\<C-x>\<C-v>\<Esc>", 'tx')
+ call assert_equal('autocmd AAAAA_Group', getline(1))
+ autocmd! AAAAA_Group
+ augroup! AAAAA_Group
+ bwipe!
+endfunc
+
+func DummyCompleteOne(findstart, base)
+ if a:findstart
+ return 0
+ else
+ wincmd n
+ return ['onedef', 'oneDEF']
+ endif
+endfunc
+
+" Test that nothing happens if the 'completefunc' opens
+" a new window (no completion, no crash)
+func Test_completefunc_opens_new_window_one()
+ new
+ let winid = win_getid()
+ setlocal completefunc=DummyCompleteOne
+ call setline(1, 'one')
+ /^one
+ call assert_fails('call feedkeys("A\<C-X>\<C-U>\<C-N>\<Esc>", "x")', 'E839:')
+ call assert_notequal(winid, win_getid())
+ q!
+ call assert_equal(winid, win_getid())
+ call assert_equal('', getline(1))
+ q!
+endfunc
+
+" Test that nothing happens if the 'completefunc' opens
+" a new window (no completion, no crash)
+func DummyCompleteTwo(findstart, base)
+ if a:findstart
+ wincmd n
+ return 0
+ else
+ return ['twodef', 'twoDEF']
+ endif
+endfunction
+
+" Test that nothing happens if the 'completefunc' opens
+" a new window (no completion, no crash)
+func Test_completefunc_opens_new_window_two()
+ new
+ let winid = win_getid()
+ setlocal completefunc=DummyCompleteTwo
+ call setline(1, 'two')
+ /^two
+ call assert_fails('call feedkeys("A\<C-X>\<C-U>\<C-N>\<Esc>", "x")', 'E764:')
+ call assert_notequal(winid, win_getid())
+ q!
+ call assert_equal(winid, win_getid())
+ call assert_equal('two', getline(1))
+ q!
+endfunc
+
+func DummyCompleteThree(findstart, base)
+ if a:findstart
+ return 0
+ else
+ return ['threedef', 'threeDEF']
+ endif
+endfunc
+
+:"Test that 'completefunc' works when it's OK.
+func Test_completefunc_works()
+ new
+ let winid = win_getid()
+ setlocal completefunc=DummyCompleteThree
+ call setline(1, 'three')
+ /^three
+ call feedkeys("A\<C-X>\<C-U>\<C-N>\<Esc>", "x")
+ call assert_equal(winid, win_getid())
+ call assert_equal('threeDEF', getline(1))
+ q!
+endfunc
+
+func DummyCompleteFour(findstart, base)
+ if a:findstart
+ return 0
+ else
+ call complete_add('four1')
+ call complete_add('four2')
+ call complete_check()
+ call complete_add('four3')
+ call complete_add('four4')
+ call complete_check()
+ call complete_add('four5')
+ call complete_add('four6')
+ return []
+ endif
+endfunc
+
+" Test that 'omnifunc' works when it's OK.
+func Test_omnifunc_with_check()
+ new
+ setlocal omnifunc=DummyCompleteFour
+ call setline(1, 'four')
+ /^four
+ call feedkeys("A\<C-X>\<C-O>\<C-N>\<Esc>", "x")
+ call assert_equal('four2', getline(1))
+
+ call setline(1, 'four')
+ /^four
+ call feedkeys("A\<C-X>\<C-O>\<C-N>\<C-N>\<Esc>", "x")
+ call assert_equal('four3', getline(1))
+
+ call setline(1, 'four')
+ /^four
+ call feedkeys("A\<C-X>\<C-O>\<C-N>\<C-N>\<C-N>\<C-N>\<Esc>", "x")
+ call assert_equal('four5', getline(1))
+
+ q!
+endfunc
+
+function UndoComplete()
+ call complete(1, ['January', 'February', 'March',
+ \ 'April', 'May', 'June', 'July', 'August', 'September',
+ \ 'October', 'November', 'December'])
+ return ''
+endfunc
+
+" Test that no undo item is created when no completion is inserted
+func Test_complete_no_undo()
+ set completeopt=menu,preview,noinsert,noselect
+ inoremap <Right> <C-R>=UndoComplete()<CR>
+ new
+ call feedkeys("ixxx\<CR>\<CR>yyy\<Esc>k", 'xt')
+ call feedkeys("iaaa\<Esc>0", 'xt')
+ call assert_equal('aaa', getline(2))
+ call feedkeys("i\<Right>\<Esc>", 'xt')
+ call assert_equal('aaa', getline(2))
+ call feedkeys("u", 'xt')
+ call assert_equal('', getline(2))
+
+ call feedkeys("ibbb\<Esc>0", 'xt')
+ call assert_equal('bbb', getline(2))
+ call feedkeys("A\<Right>\<Down>\<CR>\<Esc>", 'xt')
+ call assert_equal('January', getline(2))
+ call feedkeys("u", 'xt')
+ call assert_equal('bbb', getline(2))
+
+ call feedkeys("A\<Right>\<C-N>\<Esc>", 'xt')
+ call assert_equal('January', getline(2))
+ call feedkeys("u", 'xt')
+ call assert_equal('bbb', getline(2))
+
+ iunmap <Right>
+ set completeopt&
+ q!
+endfunc
+
+function! DummyCompleteFive(findstart, base)
+ if a:findstart
+ return 0
+ else
+ return [
+ \ { 'word': 'January', 'info': "info1-1\n1-2\n1-3" },
+ \ { 'word': 'February', 'info': "info2-1\n2-2\n2-3" },
+ \ { 'word': 'March', 'info': "info3-1\n3-2\n3-3" },
+ \ { 'word': 'April', 'info': "info4-1\n4-2\n4-3" },
+ \ { 'word': 'May', 'info': "info5-1\n5-2\n5-3" },
+ \ ]
+ endif
+endfunc
+
+" Test that 'completefunc' on Scratch buffer with preview window works when
+" it's OK.
+func Test_completefunc_with_scratch_buffer()
+ new +setlocal\ buftype=nofile\ bufhidden=wipe\ noswapfile
+ set completeopt+=preview
+ setlocal completefunc=DummyCompleteFive
+ call feedkeys("A\<C-X>\<C-U>\<C-N>\<C-N>\<C-N>\<Esc>", "x")
+ call assert_equal(['April'], getline(1, '$'))
+ pclose
+ q!
+ set completeopt&
+endfunc
+
+" <C-E> - select original typed text before the completion started without
+" auto-wrap text.
+func Test_completion_ctrl_e_without_autowrap()
+ new
+ let tw_save = &tw
+ set tw=78
+ let li = [
+ \ '" zzz',
+ \ '" zzzyyyyyyyyyyyyyyyyyyy']
+ call setline(1, li)
+ 0
+ call feedkeys("A\<C-X>\<C-N>\<C-E>\<Esc>", "tx")
+ call assert_equal(li, getline(1, '$'))
+
+ let &tw = tw_save
+ q!
+endfunc
+
+func Test_completion_respect_bs_option()
+ new
+ let li = ["aaa", "aaa12345", "aaaabcdef", "aaaABC"]
+
+ set bs=indent,eol
+ call setline(1, li)
+ 1
+ call feedkeys("A\<C-X>\<C-N>\<C-P>\<BS>\<BS>\<BS>\<Esc>", "tx")
+ call assert_equal('aaa', getline(1))
+
+ %d
+ set bs=indent,eol,start
+ call setline(1, li)
+ 1
+ call feedkeys("A\<C-X>\<C-N>\<C-P>\<BS>\<BS>\<BS>\<Esc>", "tx")
+ call assert_equal('', getline(1))
+
+ bw!
+endfunc
+
+func CompleteUndo() abort
+ call complete(1, g:months)
+ return ''
+endfunc
+
+func Test_completion_can_undo()
+ inoremap <Right> <c-r>=CompleteUndo()<cr>
+ set completeopt+=noinsert,noselect
+
+ new
+ call feedkeys("a\<Right>a\<Esc>", 'xt')
+ call assert_equal('a', getline(1))
+ undo
+ call assert_equal('', getline(1))
+
+ bwipe!
+ set completeopt&
+ iunmap <Right>
+endfunc
+
+func Test_completion_comment_formatting()
+ new
+ setl formatoptions=tcqro
+ call feedkeys("o/*\<cr>\<cr>/\<esc>", 'tx')
+ call assert_equal(['', '/*', ' *', ' */'], getline(1,4))
+ %d
+ call feedkeys("o/*\<cr>foobar\<cr>/\<esc>", 'tx')
+ call assert_equal(['', '/*', ' * foobar', ' */'], getline(1,4))
+ %d
+ try
+ call feedkeys("o/*\<cr>\<cr>\<c-x>\<c-u>/\<esc>", 'tx')
+ call assert_report('completefunc not set, should have failed')
+ catch
+ call assert_exception('E764:')
+ endtry
+ call assert_equal(['', '/*', ' *', ' */'], getline(1,4))
+ bwipe!
+endfunc
+
+function! DummyCompleteSix()
+ call complete(1, ['Hello', 'World'])
+ return ''
+endfunction
+
+" complete() correctly clears the list of autocomplete candidates
+func Test_completion_clear_candidate_list()
+ new
+ %d
+ " select first entry from the completion popup
+ call feedkeys("a xxx\<C-N>\<C-R>=DummyCompleteSix()\<CR>", "tx")
+ call assert_equal('Hello', getline(1))
+ %d
+ " select second entry from the completion popup
+ call feedkeys("a xxx\<C-N>\<C-R>=DummyCompleteSix()\<CR>\<C-N>", "tx")
+ call assert_equal('World', getline(1))
+ %d
+ " select original text
+ call feedkeys("a xxx\<C-N>\<C-R>=DummyCompleteSix()\<CR>\<C-N>\<C-N>", "tx")
+ call assert_equal(' xxx', getline(1))
+ %d
+ " back at first entry from completion list
+ call feedkeys("a xxx\<C-N>\<C-R>=DummyCompleteSix()\<CR>\<C-N>\<C-N>\<C-N>", "tx")
+ call assert_equal('Hello', getline(1))
+
+ bw!
+endfunc
+
+func Test_popup_complete_backwards()
+ new
+ call setline(1, ['Post', 'Port', 'Po'])
+ let expected=['Post', 'Port', 'Port']
+ call cursor(3,2)
+ call feedkeys("A\<C-X>". repeat("\<C-P>", 3). "rt\<cr>", 'tx')
+ call assert_equal(expected, getline(1,'$'))
+ bwipe!
+endfunc
+
+func Test_popup_and_preview_autocommand()
+ " This used to crash Vim
+ if !has('python')
+ return
+ endif
+ let h = winheight(0)
+ if h < 15
+ return
+ endif
+ new
+ augroup MyBufAdd
+ au!
+ au BufAdd * nested tab sball
+ augroup END
+ set omnifunc=pythoncomplete#Complete
+ call setline(1, 'import os')
+ " make the line long
+ call setline(2, ' os.')
+ $
+ call feedkeys("A\<C-X>\<C-O>\<C-N>\<C-N>\<C-N>\<enter>\<esc>", 'tx')
+ call assert_equal("import os", getline(1))
+ call assert_match(' os.\(EX_IOERR\|O_CREAT\)$', getline(2))
+ call assert_equal(1, winnr('$'))
+ " previewwindow option is not set
+ call assert_equal(0, &previewwindow)
+ norm! gt
+ call assert_equal(0, &previewwindow)
+ norm! gT
+ call assert_equal(12, tabpagenr('$'))
+ tabonly
+ pclose
+ augroup MyBufAdd
+ au!
+ augroup END
+ augroup! MyBufAdd
+ bw!
+endfunc
+
+fun MessCompleteMonths()
+ for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep")
+ call complete_add(m)
+ if complete_check()
+ break
+ endif
+ endfor
+ return []
+endfun
+
+fun MessCompleteMore()
+ call complete(1, split("Oct Nov Dec"))
+ return []
+endfun
+
+fun MessComplete(findstart, base)
+ if a:findstart
+ let line = getline('.')
+ let start = col('.') - 1
+ while start > 0 && line[start - 1] =~ '\a'
+ let start -= 1
+ endwhile
+ return start
+ else
+ call MessCompleteMonths()
+ call MessCompleteMore()
+ return []
+ endif
+endf
+
+func Test_complete_func_mess()
+ " Calling complete() after complete_add() in 'completefunc' is wrong, but it
+ " should not crash.
+ set completefunc=MessComplete
+ new
+ call setline(1, 'Ju')
+ call feedkeys("A\<c-x>\<c-u>/\<esc>", 'tx')
+ call assert_equal('Oct/Oct', getline(1))
+ bwipe!
+ set completefunc=
+endfunc
+
+func Test_complete_CTRLN_startofbuffer()
+ new
+ call setline(1, [ 'organize(cupboard, 3, 2);',
+ \ 'prioritize(bureau, 8, 7);',
+ \ 'realize(bannister, 4, 4);',
+ \ 'moralize(railing, 3,9);'])
+ let expected=['cupboard.organize(3, 2);',
+ \ 'bureau.prioritize(8, 7);',
+ \ 'bannister.realize(4, 4);',
+ \ 'railing.moralize(3,9);']
+ call feedkeys("qai\<c-n>\<c-n>.\<esc>3wdW\<cr>q3@a", 'tx')
+ call assert_equal(expected, getline(1,'$'))
+ bwipe!
+endfunc
+
+func Test_popup_and_window_resize()
+ if !has('terminal') || has('gui_running')
+ return
+ endif
+ let h = winheight(0)
+ if h < 15
+ return
+ endif
+ let g:buf = term_start([$NVIM_PRG, '--clean', '-c', 'set noswapfile'], {'term_rows': h / 3})
+ call term_sendkeys(g:buf, (h / 3 - 1)."o\<esc>G")
+ call term_sendkeys(g:buf, "i\<c-x>")
+ call term_wait(g:buf, 200)
+ call term_sendkeys(g:buf, "\<c-v>")
+ call term_wait(g:buf, 100)
+ " popup first entry "!" must be at the top
+ call WaitFor('term_getline(g:buf, 1) =~ "^!"')
+ call assert_match('^!\s*$', term_getline(g:buf, 1))
+ exe 'resize +' . (h - 1)
+ call term_wait(g:buf, 100)
+ redraw!
+ " popup shifted down, first line is now empty
+ call WaitFor('term_getline(g:buf, 1) == ""')
+ call assert_equal('', term_getline(g:buf, 1))
+ sleep 100m
+ " popup is below cursor line and shows first match "!"
+ call WaitFor('term_getline(g:buf, term_getcursor(g:buf)[0] + 1) =~ "^!"')
+ call assert_match('^!\s*$', term_getline(g:buf, term_getcursor(g:buf)[0] + 1))
+ " cursor line also shows !
+ call assert_match('^!\s*$', term_getline(g:buf, term_getcursor(g:buf)[0]))
+ bwipe!
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_preview.vim b/src/nvim/testdir/test_preview.vim
new file mode 100644
index 0000000000..91923fb1e9
--- /dev/null
+++ b/src/nvim/testdir/test_preview.vim
@@ -0,0 +1,13 @@
+" Tests for the preview window
+
+func Test_Psearch()
+ " this used to cause ml_get errors
+ help
+ let wincount = winnr('$')
+ 0f
+ ps.
+ call assert_equal(wincount + 1, winnr('$'))
+ pclose
+ call assert_equal(wincount, winnr('$'))
+ bwipe
+endfunc
diff --git a/src/nvim/testdir/test_profile.vim b/src/nvim/testdir/test_profile.vim
new file mode 100644
index 0000000000..4cbd800da5
--- /dev/null
+++ b/src/nvim/testdir/test_profile.vim
@@ -0,0 +1,183 @@
+" Test Vim profiler
+if !has('profile')
+ finish
+endif
+
+func Test_profile_func()
+ let lines = [
+ \ "func! Foo1()",
+ \ "endfunc",
+ \ "func! Foo2()",
+ \ " let l:count = 100",
+ \ " while l:count > 0",
+ \ " let l:count = l:count - 1",
+ \ " endwhile",
+ \ "endfunc",
+ \ "func! Foo3()",
+ \ "endfunc",
+ \ "func! Bar()",
+ \ "endfunc",
+ \ "call Foo1()",
+ \ "call Foo1()",
+ \ "profile pause",
+ \ "call Foo1()",
+ \ "profile continue",
+ \ "call Foo2()",
+ \ "call Foo3()",
+ \ "call Bar()",
+ \ "if !v:profiling",
+ \ " delfunc Foo2",
+ \ "endif",
+ \ "delfunc Foo3",
+ \ ]
+
+ call writefile(lines, 'Xprofile_func.vim')
+ call system(v:progpath
+ \ . ' -es -u NONE -U NONE -i NONE --noplugin'
+ \ . ' -c "profile start Xprofile_func.log"'
+ \ . ' -c "profile func Foo*"'
+ \ . ' -c "so Xprofile_func.vim"'
+ \ . ' -c "qall!"')
+ call assert_equal(0, v:shell_error)
+
+ let lines = readfile('Xprofile_func.log')
+
+ " - Foo1() is called 3 times but should be reported as called twice
+ " since one call is in between "profile pause" .. "profile continue".
+ " - Foo2() should come before Foo1() since Foo1() does much more work.
+ " - Foo3() is not reported because function is deleted.
+ " - Unlike Foo3(), Foo2() should not be deleted since there is a check
+ " for v:profiling.
+ " - Bar() is not reported since it does not match "profile func Foo*".
+ call assert_equal(28, len(lines))
+
+ call assert_equal('FUNCTION Foo1()', lines[0])
+ call assert_equal('Called 2 times', lines[1])
+ call assert_match('^Total time:\s\+\d\+\.\d\+$', lines[2])
+ call assert_match('^ Self time:\s\+\d\+\.\d\+$', lines[3])
+ call assert_equal('', lines[4])
+ call assert_equal('count total (s) self (s)', lines[5])
+ call assert_equal('', lines[6])
+ call assert_equal('FUNCTION Foo2()', lines[7])
+ call assert_equal('Called 1 time', lines[8])
+ call assert_match('^Total time:\s\+\d\+\.\d\+$', lines[9])
+ call assert_match('^ Self time:\s\+\d\+\.\d\+$', lines[10])
+ call assert_equal('', lines[11])
+ call assert_equal('count total (s) self (s)', lines[12])
+ call assert_match('^\s*1\s\+.*\slet l:count = 100$', lines[13])
+ call assert_match('^\s*101\s\+.*\swhile l:count > 0$', lines[14])
+ call assert_match('^\s*100\s\+.*\s let l:count = l:count - 1$', lines[15])
+ call assert_match('^\s*100\s\+.*\sendwhile$', lines[16])
+ call assert_equal('', lines[17])
+ call assert_equal('FUNCTIONS SORTED ON TOTAL TIME', lines[18])
+ call assert_equal('count total (s) self (s) function', lines[19])
+ call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo2()$', lines[20])
+ call assert_match('^\s*2\s\+\d\+\.\d\+\s\+Foo1()$', lines[21])
+ call assert_equal('', lines[22])
+ call assert_equal('FUNCTIONS SORTED ON SELF TIME', lines[23])
+ call assert_equal('count total (s) self (s) function', lines[24])
+ call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo2()$', lines[25])
+ call assert_match('^\s*2\s\+\d\+\.\d\+\s\+Foo1()$', lines[26])
+ call assert_equal('', lines[27])
+
+ call delete('Xprofile_func.vim')
+ call delete('Xprofile_func.log')
+endfunc
+
+func Test_profile_file()
+ let lines = [
+ \ 'func! Foo()',
+ \ 'endfunc',
+ \ 'for i in range(10)',
+ \ ' " a comment',
+ \ ' call Foo()',
+ \ 'endfor',
+ \ 'call Foo()',
+ \ ]
+
+ call writefile(lines, 'Xprofile_file.vim')
+ call system(v:progpath
+ \ . ' -es -u NONE -U NONE -i NONE --noplugin'
+ \ . ' -c "profile start Xprofile_file.log"'
+ \ . ' -c "profile file Xprofile_file.vim"'
+ \ . ' -c "so Xprofile_file.vim"'
+ \ . ' -c "so Xprofile_file.vim"'
+ \ . ' -c "qall!"')
+ call assert_equal(0, v:shell_error)
+
+ let lines = readfile('Xprofile_file.log')
+
+ call assert_equal(14, len(lines))
+
+ call assert_match('^SCRIPT .*Xprofile_file.vim$', lines[0])
+ call assert_equal('Sourced 2 times', lines[1])
+ call assert_match('^Total time:\s\+\d\+\.\d\+$', lines[2])
+ call assert_match('^ Self time:\s\+\d\+\.\d\+$', lines[3])
+ call assert_equal('', lines[4])
+ call assert_equal('count total (s) self (s)', lines[5])
+ call assert_match(' 2 0.\d\+ func! Foo()', lines[6])
+ call assert_equal(' endfunc', lines[7])
+ " Loop iterates 10 times. Since script runs twice, body executes 20 times.
+ " First line of loop executes one more time than body to detect end of loop.
+ call assert_match('^\s*22\s\+\d\+\.\d\+\s\+for i in range(10)$', lines[8])
+ call assert_equal(' " a comment', lines[9])
+ " if self and total are equal we only get one number
+ call assert_match('^\s*20\s\+\(\d\+\.\d\+\s\+\)\=\d\+\.\d\+\s\+call Foo()$', lines[10])
+ call assert_match('^\s*20\s\+\d\+\.\d\+\s\+endfor$', lines[11])
+ " if self and total are equal we only get one number
+ call assert_match('^\s*2\s\+\(\d\+\.\d\+\s\+\)\=\d\+\.\d\+\s\+call Foo()$', lines[12])
+ call assert_equal('', lines[13])
+
+ call delete('Xprofile_file.vim')
+ call delete('Xprofile_file.log')
+endfunc
+
+func Test_profile_file_with_cont()
+ let lines = [
+ \ 'echo "hello',
+ \ ' \ world"',
+ \ 'echo "foo ',
+ \ ' \bar"',
+ \ ]
+
+ call writefile(lines, 'Xprofile_file.vim')
+ call system(v:progpath
+ \ . ' -es -u NONE -U NONE -i NONE --noplugin'
+ \ . ' -c "profile start Xprofile_file.log"'
+ \ . ' -c "profile file Xprofile_file.vim"'
+ \ . ' -c "so Xprofile_file.vim"'
+ \ . ' -c "qall!"')
+ call assert_equal(0, v:shell_error)
+
+ let lines = readfile('Xprofile_file.log')
+ call assert_equal(11, len(lines))
+
+ call assert_match('^SCRIPT .*Xprofile_file.vim$', lines[0])
+ call assert_equal('Sourced 1 time', lines[1])
+ call assert_match('^Total time:\s\+\d\+\.\d\+$', lines[2])
+ call assert_match('^ Self time:\s\+\d\+\.\d\+$', lines[3])
+ call assert_equal('', lines[4])
+ call assert_equal('count total (s) self (s)', lines[5])
+ call assert_match(' 1 0.\d\+ echo "hello', lines[6])
+ call assert_equal(' \ world"', lines[7])
+ call assert_match(' 1 0.\d\+ echo "foo ', lines[8])
+ call assert_equal(' \bar"', lines[9])
+ call assert_equal('', lines[10])
+
+ call delete('Xprofile_file.vim')
+ call delete('Xprofile_file.log')
+endfunc
+
+func Test_profile_completion()
+ call feedkeys(":profile \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"profile continue dump file func pause start stop', @:)
+
+ call feedkeys(":profile start test_prof\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_match('^"profile start.* test_profile\.vim', @:)
+endfunc
+
+func Test_profile_errors()
+ call assert_fails("profile func Foo", 'E750:')
+ call assert_fails("profile pause", 'E750:')
+ call assert_fails("profile continue", 'E750:')
+endfunc
diff --git a/src/nvim/testdir/test_put.vim b/src/nvim/testdir/test_put.vim
new file mode 100644
index 0000000000..0b8961c52b
--- /dev/null
+++ b/src/nvim/testdir/test_put.vim
@@ -0,0 +1,49 @@
+
+func Test_put_block()
+ if !has('multi_byte')
+ return
+ endif
+ new
+ call feedkeys("i\<C-V>u2500\<CR>x\<ESC>", 'x')
+ call feedkeys("\<C-V>y", 'x')
+ call feedkeys("gg0p", 'x')
+ call assert_equal("\u2500x", getline(1))
+ bwipe!
+endfunc
+
+func Test_put_char_block()
+ new
+ call setline(1, ['Line 1', 'Line 2'])
+ f Xfile_put
+ " visually select both lines and put the cursor at the top of the visual
+ " selection and then put the buffer name over it
+ exe "norm! G0\<c-v>ke\"%p"
+ call assert_equal(['Xfile_put 1', 'Xfile_put 2'], getline(1,2))
+ bw!
+endfunc
+
+func Test_put_char_block2()
+ new
+ let a = [ getreg('a'), getregtype('a') ]
+ call setreg('a', ' one ', 'v')
+ call setline(1, ['Line 1', '', 'Line 3', ''])
+ " visually select the first 3 lines and put register a over it
+ exe "norm! ggl\<c-v>2j2l\"ap"
+ call assert_equal(['L one 1', '', 'L one 3', ''], getline(1,4))
+ " clean up
+ bw!
+ call setreg('a', a[0], a[1])
+endfunc
+
+func Test_put_expr()
+ new
+ call setline(1, repeat(['A'], 6))
+ exec "1norm! \"=line('.')\<cr>p"
+ norm! j0.
+ norm! j0.
+ exec "4norm! \"=\<cr>P"
+ norm! j0.
+ norm! j0.
+ call assert_equal(['A1','A2','A3','4A','5A','6A'], getline(1,'$'))
+ bw!
+endfunc
diff --git a/src/nvim/testdir/test_python2.vim b/src/nvim/testdir/test_python2.vim
new file mode 100644
index 0000000000..5ba9fd68cf
--- /dev/null
+++ b/src/nvim/testdir/test_python2.vim
@@ -0,0 +1,54 @@
+" Test for python 2 commands.
+" TODO: move tests from test87.in here.
+
+if !has('python')
+ finish
+endif
+
+func Test_pydo()
+ " Check deleting lines does not trigger ml_get error.
+ py import vim
+ new
+ call setline(1, ['one', 'two', 'three'])
+ pydo vim.command("%d_")
+ bwipe!
+
+ " Disabled until neovim/neovim#8554 is resolved
+ if 0
+ " Check switching to another buffer does not trigger ml_get error.
+ new
+ let wincount = winnr('$')
+ call setline(1, ['one', 'two', 'three'])
+ pydo vim.command("new")
+ call assert_equal(wincount + 1, winnr('$'))
+ bwipe!
+ bwipe!
+ endif
+endfunc
+
+func Test_vim_function()
+ " Check creating vim.Function object
+ py import vim
+
+ func s:foo()
+ return matchstr(expand('<sfile>'), '<SNR>\zs\d\+_foo$')
+ endfunc
+ let name = '<SNR>' . s:foo()
+
+ try
+ py f = vim.bindeval('function("s:foo")')
+ call assert_equal(name, pyeval('f.name'))
+ catch
+ call assert_false(v:exception)
+ endtry
+
+ try
+ py f = vim.Function('\x80\xfdR' + vim.eval('s:foo()'))
+ call assert_equal(name, pyeval('f.name'))
+ catch
+ call assert_false(v:exception)
+ endtry
+
+ py del f
+ delfunc s:foo
+endfunc
diff --git a/src/nvim/testdir/test_python3.vim b/src/nvim/testdir/test_python3.vim
new file mode 100644
index 0000000000..2e3fc93674
--- /dev/null
+++ b/src/nvim/testdir/test_python3.vim
@@ -0,0 +1,54 @@
+" Test for python 2 commands.
+" TODO: move tests from test88.in here.
+
+if !has('python3')
+ finish
+endif
+
+func Test_py3do()
+ " Check deleting lines does not trigger an ml_get error.
+ py3 import vim
+ new
+ call setline(1, ['one', 'two', 'three'])
+ py3do vim.command("%d_")
+ bwipe!
+
+ " Disabled until neovim/neovim#8554 is resolved
+ if 0
+ " Check switching to another buffer does not trigger an ml_get error.
+ new
+ let wincount = winnr('$')
+ call setline(1, ['one', 'two', 'three'])
+ py3do vim.command("new")
+ call assert_equal(wincount + 1, winnr('$'))
+ bwipe!
+ bwipe!
+ endif
+endfunc
+
+func Test_vim_function()
+ " Check creating vim.Function object
+ py3 import vim
+
+ func s:foo()
+ return matchstr(expand('<sfile>'), '<SNR>\zs\d\+_foo$')
+ endfunc
+ let name = '<SNR>' . s:foo()
+
+ try
+ py3 f = vim.bindeval('function("s:foo")')
+ call assert_equal(name, py3eval('f.name'))
+ catch
+ call assert_false(v:exception)
+ endtry
+
+ try
+ py3 f = vim.Function(b'\x80\xfdR' + vim.eval('s:foo()').encode())
+ call assert_equal(name, py3eval('f.name'))
+ catch
+ call assert_false(v:exception)
+ endtry
+
+ py3 del f
+ delfunc s:foo
+endfunc
diff --git a/src/nvim/testdir/test_pyx2.vim b/src/nvim/testdir/test_pyx2.vim
new file mode 100644
index 0000000000..50e57c3bfb
--- /dev/null
+++ b/src/nvim/testdir/test_pyx2.vim
@@ -0,0 +1,74 @@
+" Test for pyx* commands and functions with Python 2.
+
+set pyx=2
+if !has('python')
+ finish
+endif
+
+let s:py2pattern = '^2\.[0-7]\.\d\+'
+let s:py3pattern = '^3\.\d\+\.\d\+'
+
+
+func Test_has_pythonx()
+ call assert_true(has('pythonx'))
+endfunc
+
+
+func Test_pyx()
+ redir => var
+ pyx << EOF
+import sys
+print(sys.version)
+EOF
+ redir END
+ call assert_match(s:py2pattern, split(var)[0])
+endfunc
+
+
+func Test_pyxdo()
+ pyx import sys
+ enew
+ pyxdo return sys.version.split("\n")[0]
+ call assert_match(s:py2pattern, split(getline('.'))[0])
+endfunc
+
+
+func Test_pyxeval()
+ pyx import sys
+ call assert_match(s:py2pattern, split(pyxeval('sys.version'))[0])
+endfunc
+
+
+func Test_pyxfile()
+ " No special comments nor shebangs
+ redir => var
+ pyxfile pyxfile/pyx.py
+ redir END
+ call assert_match(s:py2pattern, split(var)[0])
+
+ " Python 2 special comment
+ redir => var
+ pyxfile pyxfile/py2_magic.py
+ redir END
+ call assert_match(s:py2pattern, split(var)[0])
+
+ " Python 2 shebang
+ redir => var
+ pyxfile pyxfile/py2_shebang.py
+ redir END
+ call assert_match(s:py2pattern, split(var)[0])
+
+ if has('python3')
+ " Python 3 special comment
+ redir => var
+ pyxfile pyxfile/py3_magic.py
+ redir END
+ call assert_match(s:py3pattern, split(var)[0])
+
+ " Python 3 shebang
+ redir => var
+ pyxfile pyxfile/py3_shebang.py
+ redir END
+ call assert_match(s:py3pattern, split(var)[0])
+ endif
+endfunc
diff --git a/src/nvim/testdir/test_pyx3.vim b/src/nvim/testdir/test_pyx3.vim
new file mode 100644
index 0000000000..64546b4688
--- /dev/null
+++ b/src/nvim/testdir/test_pyx3.vim
@@ -0,0 +1,74 @@
+" Test for pyx* commands and functions with Python 3.
+
+set pyx=3
+if !has('python3')
+ finish
+endif
+
+let s:py2pattern = '^2\.[0-7]\.\d\+'
+let s:py3pattern = '^3\.\d\+\.\d\+'
+
+
+func Test_has_pythonx()
+ call assert_true(has('pythonx'))
+endfunc
+
+
+func Test_pyx()
+ redir => var
+ pyx << EOF
+import sys
+print(sys.version)
+EOF
+ redir END
+ call assert_match(s:py3pattern, split(var)[0])
+endfunc
+
+
+func Test_pyxdo()
+ pyx import sys
+ enew
+ pyxdo return sys.version.split("\n")[0]
+ call assert_match(s:py3pattern, split(getline('.'))[0])
+endfunc
+
+
+func Test_pyxeval()
+ pyx import sys
+ call assert_match(s:py3pattern, split(pyxeval('sys.version'))[0])
+endfunc
+
+
+func Test_pyxfile()
+ " No special comments nor shebangs
+ redir => var
+ pyxfile pyxfile/pyx.py
+ redir END
+ call assert_match(s:py3pattern, split(var)[0])
+
+ " Python 3 special comment
+ redir => var
+ pyxfile pyxfile/py3_magic.py
+ redir END
+ call assert_match(s:py3pattern, split(var)[0])
+
+ " Python 3 shebang
+ redir => var
+ pyxfile pyxfile/py3_shebang.py
+ redir END
+ call assert_match(s:py3pattern, split(var)[0])
+
+ if has('python')
+ " Python 2 special comment
+ redir => var
+ pyxfile pyxfile/py2_magic.py
+ redir END
+ call assert_match(s:py2pattern, split(var)[0])
+
+ " Python 2 shebang
+ redir => var
+ pyxfile pyxfile/py2_shebang.py
+ redir END
+ call assert_match(s:py2pattern, split(var)[0])
+ endif
+endfunc
diff --git a/src/nvim/testdir/test_quickfix.vim b/src/nvim/testdir/test_quickfix.vim
new file mode 100644
index 0000000000..cb3e7ca8f6
--- /dev/null
+++ b/src/nvim/testdir/test_quickfix.vim
@@ -0,0 +1,2666 @@
+" Test for the quickfix commands.
+
+if !has('quickfix')
+ finish
+endif
+
+set encoding=utf-8
+
+func s:setup_commands(cchar)
+ if a:cchar == 'c'
+ command! -nargs=* -bang Xlist <mods>clist<bang> <args>
+ command! -nargs=* Xgetexpr <mods>cgetexpr <args>
+ command! -nargs=* Xaddexpr <mods>caddexpr <args>
+ command! -nargs=* -count Xolder <mods><count>colder <args>
+ command! -nargs=* Xnewer <mods>cnewer <args>
+ command! -nargs=* Xopen <mods>copen <args>
+ command! -nargs=* Xwindow <mods>cwindow <args>
+ command! -nargs=* Xbottom <mods>cbottom <args>
+ command! -nargs=* Xclose <mods>cclose <args>
+ command! -nargs=* -bang Xfile <mods>cfile<bang> <args>
+ command! -nargs=* Xgetfile <mods>cgetfile <args>
+ command! -nargs=* Xaddfile <mods>caddfile <args>
+ command! -nargs=* -bang Xbuffer <mods>cbuffer<bang> <args>
+ command! -nargs=* Xgetbuffer <mods>cgetbuffer <args>
+ command! -nargs=* Xaddbuffer <mods>caddbuffer <args>
+ command! -nargs=* Xrewind <mods>crewind <args>
+ command! -count -nargs=* -bang Xnext <mods><count>cnext<bang> <args>
+ command! -count -nargs=* -bang Xprev <mods><count>cprev<bang> <args>
+ command! -nargs=* -bang Xfirst <mods>cfirst<bang> <args>
+ command! -nargs=* -bang Xlast <mods>clast<bang> <args>
+ command! -nargs=* -bang Xnfile <mods>cnfile<bang> <args>
+ command! -nargs=* -bang Xpfile <mods>cpfile<bang> <args>
+ command! -nargs=* Xexpr <mods>cexpr <args>
+ command! -range -nargs=* Xvimgrep <mods><count>vimgrep <args>
+ command! -nargs=* Xvimgrepadd <mods>vimgrepadd <args>
+ command! -nargs=* Xgrep <mods> grep <args>
+ command! -nargs=* Xgrepadd <mods> grepadd <args>
+ command! -nargs=* Xhelpgrep helpgrep <args>
+ let g:Xgetlist = function('getqflist')
+ let g:Xsetlist = function('setqflist')
+ call setqflist([], 'f')
+ else
+ command! -nargs=* -bang Xlist <mods>llist<bang> <args>
+ command! -nargs=* Xgetexpr <mods>lgetexpr <args>
+ command! -nargs=* Xaddexpr <mods>laddexpr <args>
+ command! -nargs=* -count Xolder <mods><count>lolder <args>
+ command! -nargs=* Xnewer <mods>lnewer <args>
+ command! -nargs=* Xopen <mods>lopen <args>
+ command! -nargs=* Xwindow <mods>lwindow <args>
+ command! -nargs=* Xbottom <mods>lbottom <args>
+ command! -nargs=* Xclose <mods>lclose <args>
+ command! -nargs=* -bang Xfile <mods>lfile<bang> <args>
+ command! -nargs=* Xgetfile <mods>lgetfile <args>
+ command! -nargs=* Xaddfile <mods>laddfile <args>
+ command! -nargs=* -bang Xbuffer <mods>lbuffer<bang> <args>
+ command! -nargs=* Xgetbuffer <mods>lgetbuffer <args>
+ command! -nargs=* Xaddbuffer <mods>laddbuffer <args>
+ command! -nargs=* Xrewind <mods>lrewind <args>
+ command! -count -nargs=* -bang Xnext <mods><count>lnext<bang> <args>
+ command! -count -nargs=* -bang Xprev <mods><count>lprev<bang> <args>
+ command! -nargs=* -bang Xfirst <mods>lfirst<bang> <args>
+ command! -nargs=* -bang Xlast <mods>llast<bang> <args>
+ command! -nargs=* -bang Xnfile <mods>lnfile<bang> <args>
+ command! -nargs=* -bang Xpfile <mods>lpfile<bang> <args>
+ command! -nargs=* Xexpr <mods>lexpr <args>
+ command! -range -nargs=* Xvimgrep <mods><count>lvimgrep <args>
+ command! -nargs=* Xvimgrepadd <mods>lvimgrepadd <args>
+ command! -nargs=* Xgrep <mods> lgrep <args>
+ command! -nargs=* Xgrepadd <mods> lgrepadd <args>
+ command! -nargs=* Xhelpgrep lhelpgrep <args>
+ let g:Xgetlist = function('getloclist', [0])
+ let g:Xsetlist = function('setloclist', [0])
+ call setloclist(0, [], 'f')
+ endif
+endfunc
+
+" Tests for the :clist and :llist commands
+func XlistTests(cchar)
+ call s:setup_commands(a:cchar)
+
+ if a:cchar == 'l'
+ call assert_fails('llist', 'E776:')
+ endif
+ " With an empty list, command should return error
+ Xgetexpr []
+ silent! Xlist
+ call assert_true(v:errmsg ==# 'E42: No Errors')
+
+ " 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']
+
+ " List only valid entries
+ let l = split(execute('Xlist', ''), "\n")
+ call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
+ \ ' 4 Xtestfile2:2 col 2: Line2',
+ \ ' 6 Xtestfile3:3 col 1: Line3'], l)
+
+ " List all the entries
+ 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)
+
+ " List a range of errors
+ let l = split(execute('Xlist 3,6', ''), "\n")
+ call assert_equal([' 4 Xtestfile2:2 col 2: Line2',
+ \ ' 6 Xtestfile3:3 col 1: Line3'], l)
+
+ let l = split(execute('Xlist! 3,4', ''), "\n")
+ call assert_equal([' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
+
+ let l = split(execute('Xlist -6,-4', ''), "\n")
+ call assert_equal([' 2 Xtestfile1:1 col 3: Line1'], l)
+
+ let l = split(execute('Xlist! -5,-3', ''), "\n")
+ call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
+ \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
+
+ " Test for '+'
+ let l = split(execute('Xlist! +2', ''), "\n")
+ call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
+ \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
+
+ " Different types of errors
+ call g:Xsetlist([{'lnum':10,'col':5,'type':'W', 'text':'Warning','nr':11},
+ \ {'lnum':20,'col':10,'type':'e','text':'Error','nr':22},
+ \ {'lnum':30,'col':15,'type':'i','text':'Info','nr':33},
+ \ {'lnum':40,'col':20,'type':'x', 'text':'Other','nr':44},
+ \ {'lnum':50,'col':25,'type':"\<C-A>",'text':'one','nr':55}])
+ let l = split(execute('Xlist', ""), "\n")
+ call assert_equal([' 1:10 col 5 warning 11: Warning',
+ \ ' 2:20 col 10 error 22: Error',
+ \ ' 3:30 col 15 info 33: Info',
+ \ ' 4:40 col 20 x 44: Other',
+ \ ' 5:50 col 25 55: one'], l)
+
+ " Error cases
+ call assert_fails('Xlist abc', 'E488:')
+endfunc
+
+func Test_clist()
+ call XlistTests('c')
+ call XlistTests('l')
+endfunc
+
+" Tests for the :colder, :cnewer, :lolder and :lnewer commands
+" Note that this test assumes that a quickfix/location list is
+" already set by the caller.
+func XageTests(cchar)
+ call s:setup_commands(a:cchar)
+
+ let list = [{'bufnr': bufnr('%'), 'lnum': 1}]
+ call g:Xsetlist(list)
+
+ " Jumping to a non existent list should return error
+ silent! Xolder 99
+ call assert_true(v:errmsg ==# 'E380: At bottom of quickfix stack')
+
+ silent! Xnewer 99
+ call assert_true(v:errmsg ==# 'E381: At top of quickfix stack')
+
+ " Add three quickfix/location lists
+ Xgetexpr ['Xtestfile1:1:3:Line1']
+ Xgetexpr ['Xtestfile2:2:2:Line2']
+ Xgetexpr ['Xtestfile3:3:1:Line3']
+
+ " Go back two lists
+ Xolder
+ let l = g:Xgetlist()
+ call assert_equal('Line2', l[0].text)
+
+ " Go forward two lists
+ Xnewer
+ let l = g:Xgetlist()
+ call assert_equal('Line3', l[0].text)
+
+ " Test for the optional count argument
+ Xolder 2
+ let l = g:Xgetlist()
+ call assert_equal('Line1', l[0].text)
+
+ Xnewer 2
+ let l = g:Xgetlist()
+ call assert_equal('Line3', l[0].text)
+endfunc
+
+func Test_cage()
+ call XageTests('c')
+ call XageTests('l')
+endfunc
+
+" Tests for the :cwindow, :lwindow :cclose, :lclose, :copen and :lopen
+" commands
+func XwindowTests(cchar)
+ call s:setup_commands(a:cchar)
+
+ " Opening the location list window without any errors should fail
+ if a:cchar == 'l'
+ call assert_fails('lopen', 'E776:')
+ endif
+
+ " Create a list with no valid entries
+ Xgetexpr ['non-error 1', 'non-error 2', 'non-error 3']
+
+ " Quickfix/Location window should not open with no valid errors
+ Xwindow
+ call assert_true(winnr('$') == 1)
+
+ " Create a list with valid entries
+ Xgetexpr ['Xtestfile1:1:3:Line1', 'Xtestfile2:2:2:Line2',
+ \ 'Xtestfile3:3:1:Line3']
+
+ " Open the window
+ Xwindow
+ call assert_true(winnr('$') == 2 && winnr() == 2 &&
+ \ getline('.') ==# 'Xtestfile1|1 col 3| Line1')
+ redraw!
+
+ " Close the window
+ Xclose
+ call assert_true(winnr('$') == 1)
+
+ " Create a list with no valid entries
+ Xgetexpr ['non-error 1', 'non-error 2', 'non-error 3']
+
+ " Open the window
+ Xopen 5
+ call assert_true(winnr('$') == 2 && getline('.') ==# '|| non-error 1'
+ \ && winheight('.') == 5)
+
+ " Opening the window again, should move the cursor to that window
+ wincmd t
+ Xopen 7
+ call assert_true(winnr('$') == 2 && winnr() == 2 &&
+ \ winheight('.') == 7 &&
+ \ getline('.') ==# '|| non-error 1')
+
+
+ " Calling cwindow should close the quickfix window with no valid errors
+ Xwindow
+ call assert_true(winnr('$') == 1)
+
+ if a:cchar == 'c'
+ " Opening the quickfix window in multiple tab pages should reuse the
+ " quickfix buffer
+ Xgetexpr ['Xtestfile1:1:3:Line1', 'Xtestfile2:2:2:Line2',
+ \ 'Xtestfile3:3:1:Line3']
+ Xopen
+ let qfbufnum = bufnr('%')
+ tabnew
+ Xopen
+ call assert_equal(qfbufnum, bufnr('%'))
+ new | only | tabonly
+ endif
+endfunc
+
+func Test_cwindow()
+ call XwindowTests('c')
+ call XwindowTests('l')
+endfunc
+
+" Tests for the :cfile, :lfile, :caddfile, :laddfile, :cgetfile and :lgetfile
+" commands.
+func XfileTests(cchar)
+ call s:setup_commands(a:cchar)
+
+ call writefile(['Xtestfile1:700:10:Line 700',
+ \ 'Xtestfile2:800:15:Line 800'], 'Xqftestfile1')
+
+ enew!
+ Xfile Xqftestfile1
+ let l = g:Xgetlist()
+ call assert_true(len(l) == 2 &&
+ \ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
+ \ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
+
+ " Test with a non existent file
+ call assert_fails('Xfile non_existent_file', 'E40')
+
+ " Run cfile/lfile from a modified buffer
+ enew!
+ silent! put ='Quickfix'
+ silent! Xfile Xqftestfile1
+ call assert_true(v:errmsg ==# 'E37: No write since last change (add ! to override)')
+
+ call writefile(['Xtestfile3:900:30:Line 900'], 'Xqftestfile1')
+ Xaddfile Xqftestfile1
+ let l = g:Xgetlist()
+ call assert_true(len(l) == 3 &&
+ \ l[2].lnum == 900 && l[2].col == 30 && l[2].text ==# 'Line 900')
+
+ call writefile(['Xtestfile1:222:77:Line 222',
+ \ 'Xtestfile2:333:88:Line 333'], 'Xqftestfile1')
+
+ enew!
+ Xgetfile Xqftestfile1
+ let l = g:Xgetlist()
+ call assert_true(len(l) == 2 &&
+ \ l[0].lnum == 222 && l[0].col == 77 && l[0].text ==# 'Line 222' &&
+ \ l[1].lnum == 333 && l[1].col == 88 && l[1].text ==# 'Line 333')
+
+ call delete('Xqftestfile1')
+endfunc
+
+func Test_cfile()
+ call XfileTests('c')
+ call XfileTests('l')
+endfunc
+
+" Tests for the :cbuffer, :lbuffer, :caddbuffer, :laddbuffer, :cgetbuffer and
+" :lgetbuffer commands.
+func XbufferTests(cchar)
+ call s:setup_commands(a:cchar)
+
+ enew!
+ silent! call setline(1, ['Xtestfile7:700:10:Line 700',
+ \ 'Xtestfile8:800:15:Line 800'])
+ Xbuffer!
+ let l = g:Xgetlist()
+ call assert_true(len(l) == 2 &&
+ \ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
+ \ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
+
+ enew!
+ silent! call setline(1, ['Xtestfile9:900:55:Line 900',
+ \ 'Xtestfile10:950:66:Line 950'])
+ Xgetbuffer
+ let l = g:Xgetlist()
+ call assert_true(len(l) == 2 &&
+ \ l[0].lnum == 900 && l[0].col == 55 && l[0].text ==# 'Line 900' &&
+ \ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950')
+
+ enew!
+ silent! call setline(1, ['Xtestfile11:700:20:Line 700',
+ \ 'Xtestfile12:750:25:Line 750'])
+ Xaddbuffer
+ let l = g:Xgetlist()
+ call assert_true(len(l) == 4 &&
+ \ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950' &&
+ \ l[2].lnum == 700 && l[2].col == 20 && l[2].text ==# 'Line 700' &&
+ \ l[3].lnum == 750 && l[3].col == 25 && l[3].text ==# 'Line 750')
+ enew!
+
+ " Check for invalid buffer
+ call assert_fails('Xbuffer 199', 'E474:')
+
+ " Check for unloaded buffer
+ edit Xtestfile1
+ let bnr = bufnr('%')
+ enew!
+ call assert_fails('Xbuffer ' . bnr, 'E681:')
+
+ " Check for invalid range
+ " Using Xbuffer will not run the range check in the cbuffer/lbuffer
+ " commands. So directly call the commands.
+ if (a:cchar == 'c')
+ call assert_fails('900,999cbuffer', 'E16:')
+ else
+ call assert_fails('900,999lbuffer', 'E16:')
+ endif
+endfunc
+
+func Test_cbuffer()
+ call XbufferTests('c')
+ call XbufferTests('l')
+endfunc
+
+func XexprTests(cchar)
+ call s:setup_commands(a:cchar)
+
+ call assert_fails('Xexpr 10', 'E777:')
+endfunc
+
+func Test_cexpr()
+ call XexprTests('c')
+ call XexprTests('l')
+endfunc
+
+" Tests for :cnext, :cprev, :cfirst, :clast commands
+func Xtest_browse(cchar)
+ call s:setup_commands(a:cchar)
+
+ " Jumping to first or next location list entry without any error should
+ " result in failure
+ if a:cchar == 'l'
+ call assert_fails('lfirst', 'E776:')
+ call assert_fails('lnext', 'E776:')
+ endif
+
+ call s:create_test_file('Xqftestfile1')
+ call s:create_test_file('Xqftestfile2')
+
+ Xgetexpr ['Xqftestfile1:5:Line5',
+ \ 'Xqftestfile1:6:Line6',
+ \ 'Xqftestfile2:10:Line10',
+ \ 'Xqftestfile2:11:Line11',
+ \ 'RegularLine1',
+ \ 'RegularLine2']
+
+ Xfirst
+ call assert_fails('Xprev', 'E553')
+ call assert_fails('Xpfile', 'E553')
+ Xnfile
+ call assert_equal('Xqftestfile2', bufname('%'))
+ call assert_equal(10, line('.'))
+ Xpfile
+ call assert_equal('Xqftestfile1', bufname('%'))
+ call assert_equal(6, line('.'))
+ Xlast
+ Xprev
+ call assert_equal('Xqftestfile2', bufname('%'))
+ call assert_equal(11, line('.'))
+ call assert_fails('Xnext', 'E553')
+ call assert_fails('Xnfile', 'E553')
+ Xrewind
+ call assert_equal('Xqftestfile1', bufname('%'))
+ call assert_equal(5, line('.'))
+
+ 10Xnext
+ call assert_equal('Xqftestfile2', bufname('%'))
+ call assert_equal(11, line('.'))
+ 10Xprev
+ call assert_equal('Xqftestfile1', bufname('%'))
+ call assert_equal(5, line('.'))
+
+ Xexpr ""
+ call assert_fails('Xnext', 'E42:')
+
+ call delete('Xqftestfile1')
+ call delete('Xqftestfile2')
+endfunc
+
+func Test_browse()
+ call Xtest_browse('c')
+ call Xtest_browse('l')
+endfunc
+
+func s:test_xhelpgrep(cchar)
+ call s:setup_commands(a:cchar)
+ Xhelpgrep quickfix
+ Xopen
+ if a:cchar == 'c'
+ let title_text = ':helpgrep quickfix'
+ else
+ let title_text = ':lhelpgrep quickfix'
+ endif
+ call assert_true(w:quickfix_title =~ title_text, w:quickfix_title)
+
+ " Jumping to a help topic should open the help window
+ only
+ Xnext
+ call assert_true(&buftype == 'help')
+ call assert_true(winnr('$') == 2)
+ " Jumping to the next match should reuse the help window
+ Xnext
+ call assert_true(&buftype == 'help')
+ call assert_true(winnr() == 1)
+ call assert_true(winnr('$') == 2)
+ " Jumping to the next match from the quickfix window should reuse the help
+ " window
+ Xopen
+ Xnext
+ call assert_true(&buftype == 'help')
+ call assert_true(winnr() == 1)
+ call assert_true(winnr('$') == 2)
+
+ " This wipes out the buffer, make sure that doesn't cause trouble.
+ Xclose
+
+ new | only
+
+ " Search for non existing help string
+ call assert_fails('Xhelpgrep a1b2c3', 'E480:')
+endfunc
+
+func Test_helpgrep()
+ call s:test_xhelpgrep('c')
+ helpclose
+ call s:test_xhelpgrep('l')
+endfunc
+
+func Test_errortitle()
+ augroup QfBufWinEnter
+ au!
+ au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
+ augroup END
+ copen
+ let a=[{'lnum': 308, 'bufnr': bufnr(''), 'col': 58, 'valid': 1, 'vcol': 0, 'nr': 0, 'type': '', 'pattern': '', 'text': ' au BufWinEnter * :let g:a=get(w:, ''quickfix_title'', ''NONE'')'}]
+ call setqflist(a)
+ call assert_equal(':setqflist()', g:a)
+ augroup QfBufWinEnter
+ au!
+ augroup END
+ augroup! QfBufWinEnter
+endfunc
+
+func Test_vimgreptitle()
+ augroup QfBufWinEnter
+ au!
+ au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
+ augroup END
+ try
+ vimgrep /pattern/j file
+ catch /E480/
+ endtry
+ copen
+ call assert_equal(': vimgrep /pattern/j file', g:a)
+ augroup QfBufWinEnter
+ au!
+ augroup END
+ augroup! QfBufWinEnter
+endfunc
+
+func XqfTitleTests(cchar)
+ call s:setup_commands(a:cchar)
+
+ Xgetexpr ['file:1:1:message']
+ let l = g:Xgetlist()
+ if a:cchar == 'c'
+ call setqflist(l, 'r')
+ else
+ call setloclist(0, l, 'r')
+ endif
+
+ Xopen
+ if a:cchar == 'c'
+ let title = ':setqflist()'
+ else
+ let title = ':setloclist()'
+ endif
+ call assert_equal(title, w:quickfix_title)
+ Xclose
+endfunc
+
+" Tests for quickfix window's title
+func Test_qf_title()
+ call XqfTitleTests('c')
+ call XqfTitleTests('l')
+endfunc
+
+" Tests for 'errorformat'
+func Test_efm()
+ let save_efm = &efm
+ set efm=%EEEE%m,%WWWW%m,%+CCCC%.%#,%-GGGG%.%#
+ cgetexpr ['WWWW', 'EEEE', 'CCCC']
+ let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
+ call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
+ cgetexpr ['WWWW', 'GGGG', 'EEEE', 'CCCC']
+ let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
+ call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
+ cgetexpr ['WWWW', 'GGGG', 'ZZZZ', 'EEEE', 'CCCC', 'YYYY']
+ let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
+ call assert_equal("[['W', 1], ['ZZZZ', 0], ['E^@CCCC', 1], ['YYYY', 0]]", l)
+ let &efm = save_efm
+endfunc
+
+" This will test for problems in quickfix:
+" A. incorrectly copying location lists which caused the location list to show
+" a different name than the file that was actually being displayed.
+" B. not reusing the window for which the location list window is opened but
+" instead creating new windows.
+" C. make sure that the location list window is not reused instead of the
+" window it belongs to.
+"
+" Set up the test environment:
+func ReadTestProtocol(name)
+ let base = substitute(a:name, '\v^test://(.*)%(\.[^.]+)?', '\1', '')
+ let word = substitute(base, '\v(.*)\..*', '\1', '')
+
+ setl modifiable
+ setl noreadonly
+ setl noswapfile
+ setl bufhidden=delete
+ %del _
+ " For problem 2:
+ " 'buftype' has to be set to reproduce the constant opening of new windows
+ setl buftype=nofile
+
+ call setline(1, word)
+
+ setl nomodified
+ setl nomodifiable
+ setl readonly
+ exe 'doautocmd BufRead ' . substitute(a:name, '\v^test://(.*)', '\1', '')
+endfunc
+
+func Test_locationlist()
+ enew
+
+ augroup testgroup
+ au!
+ autocmd BufReadCmd test://* call ReadTestProtocol(expand("<amatch>"))
+ augroup END
+
+ let words = [ "foo", "bar", "baz", "quux", "shmoo", "spam", "eggs" ]
+
+ let qflist = []
+ for word in words
+ call add(qflist, {'filename': 'test://' . word . '.txt', 'text': 'file ' . word . '.txt', })
+ " NOTE: problem 1:
+ " intentionally not setting 'lnum' so that the quickfix entries are not
+ " valid
+ call setloclist(0, qflist, ' ')
+ endfor
+
+ " Test A
+ lrewind
+ enew
+ lopen
+ 4lnext
+ vert split
+ wincmd L
+ lopen
+ wincmd p
+ lnext
+ let fileName = expand("%")
+ wincmd p
+ let locationListFileName = substitute(getline(line('.')), '\([^|]*\)|.*', '\1', '')
+ let fileName = substitute(fileName, '\\', '/', 'g')
+ let locationListFileName = substitute(locationListFileName, '\\', '/', 'g')
+ call assert_equal("test://bar.txt", fileName)
+ call assert_equal("test://bar.txt", locationListFileName)
+
+ wincmd n | only
+
+ " Test B:
+ lrewind
+ lopen
+ 2
+ exe "normal \<CR>"
+ wincmd p
+ 3
+ exe "normal \<CR>"
+ wincmd p
+ 4
+ exe "normal \<CR>"
+ call assert_equal(2, winnr('$'))
+ wincmd n | only
+
+ " Test C:
+ lrewind
+ lopen
+ " Let's move the location list window to the top to check whether it (the
+ " first window found) will be reused when we try to open new windows:
+ wincmd K
+ 2
+ exe "normal \<CR>"
+ wincmd p
+ 3
+ exe "normal \<CR>"
+ wincmd p
+ 4
+ exe "normal \<CR>"
+ 1wincmd w
+ call assert_equal('quickfix', &buftype)
+ 2wincmd w
+ let bufferName = expand("%")
+ let bufferName = substitute(bufferName, '\\', '/', 'g')
+ call assert_equal('test://quux.txt', bufferName)
+
+ wincmd n | only
+
+ augroup! testgroup
+endfunc
+
+func Test_locationlist_curwin_was_closed()
+ augroup testgroup
+ au!
+ autocmd BufReadCmd test_curwin.txt call R(expand("<amatch>"))
+ augroup END
+
+ func! R(n)
+ quit
+ endfunc
+
+ new
+ let q = []
+ call add(q, {'filename': 'test_curwin.txt' })
+ call setloclist(0, q)
+ call assert_fails('lrewind', 'E924:')
+
+ augroup! testgroup
+endfunc
+
+func Test_locationlist_cross_tab_jump()
+ call writefile(['loclistfoo'], 'loclistfoo')
+ call writefile(['loclistbar'], 'loclistbar')
+ set switchbuf=usetab
+
+ edit loclistfoo
+ tabedit loclistbar
+ silent lgrep loclistfoo loclist*
+ call assert_equal(1, tabpagenr())
+
+ enew | only | tabonly
+ set switchbuf&vim
+ call delete('loclistfoo')
+ call delete('loclistbar')
+endfunc
+
+" More tests for 'errorformat'
+func Test_efm1()
+ if !has('unix')
+ " The 'errorformat' setting is different on non-Unix systems.
+ " This test works only on Unix-like systems.
+ return
+ endif
+
+ let l = [
+ \ '"Xtestfile", line 4.12: 1506-045 (S) Undeclared identifier fd_set.',
+ \ '๏ปฟ"Xtestfile", line 6 col 19; this is an error',
+ \ 'gcc -c -DHAVE_CONFIsing-prototypes -I/usr/X11R6/include version.c',
+ \ 'Xtestfile:9: parse error before `asd''',
+ \ 'make: *** [vim] Error 1',
+ \ 'in file "Xtestfile" linenr 10: there is an error',
+ \ '',
+ \ '2 returned',
+ \ '"Xtestfile", line 11 col 1; this is an error',
+ \ '"Xtestfile", line 12 col 2; this is another error',
+ \ '"Xtestfile", line 14:10; this is an error in column 10',
+ \ '=Xtestfile=, line 15:10; this is another error, but in vcol 10 this time',
+ \ '"Xtestfile", linenr 16: yet another problem',
+ \ 'Error in "Xtestfile" at line 17:',
+ \ 'x should be a dot',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17',
+ \ ' ^',
+ \ 'Error in "Xtestfile" at line 18:',
+ \ 'x should be a dot',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18',
+ \ '.............^',
+ \ 'Error in "Xtestfile" at line 19:',
+ \ 'x should be a dot',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19',
+ \ '--------------^',
+ \ 'Error in "Xtestfile" at line 20:',
+ \ 'x should be a dot',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20',
+ \ ' ^',
+ \ '',
+ \ 'Does anyone know what is the problem and how to correction it?',
+ \ '"Xtestfile", line 21 col 9: What is the title of the quickfix window?',
+ \ '"Xtestfile", line 22 col 9: What is the title of the quickfix window?'
+ \ ]
+
+ call writefile(l, 'Xerrorfile1')
+ call writefile(l[:-2], 'Xerrorfile2')
+
+ let m = [
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 2',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 3',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 4',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 5',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 6',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 7',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 8',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 9',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 10',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 11',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 12',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 13',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 14',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 15',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 16',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 21',
+ \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 22'
+ \ ]
+ call writefile(m, 'Xtestfile')
+
+ let save_efm = &efm
+ set efm+==%f=\\,\ line\ %l%*\\D%v%*[^\ ]\ %m
+ set efm^=%AError\ in\ \"%f\"\ at\ line\ %l:,%Z%p^,%C%m
+
+ exe 'cf Xerrorfile2'
+ clast
+ copen
+ call assert_equal(':cf Xerrorfile2', w:quickfix_title)
+ wincmd p
+
+ exe 'cf Xerrorfile1'
+ call assert_equal([4, 12], [line('.'), col('.')])
+ cn
+ call assert_equal([6, 19], [line('.'), col('.')])
+ cn
+ call assert_equal([9, 2], [line('.'), col('.')])
+ cn
+ call assert_equal([10, 2], [line('.'), col('.')])
+ cn
+ call assert_equal([11, 1], [line('.'), col('.')])
+ cn
+ call assert_equal([12, 2], [line('.'), col('.')])
+ cn
+ call assert_equal([14, 10], [line('.'), col('.')])
+ cn
+ call assert_equal([15, 3, 10], [line('.'), col('.'), virtcol('.')])
+ cn
+ call assert_equal([16, 2], [line('.'), col('.')])
+ cn
+ call assert_equal([17, 6], [line('.'), col('.')])
+ cn
+ call assert_equal([18, 7], [line('.'), col('.')])
+ cn
+ call assert_equal([19, 8], [line('.'), col('.')])
+ cn
+ call assert_equal([20, 9], [line('.'), col('.')])
+ clast
+ cprev
+ cprev
+ wincmd w
+ call assert_equal(':cf Xerrorfile1', w:quickfix_title)
+ wincmd p
+
+ let &efm = save_efm
+ call delete('Xerrorfile1')
+ call delete('Xerrorfile2')
+ call delete('Xtestfile')
+endfunc
+
+" Test for quickfix directory stack support
+func s:dir_stack_tests(cchar)
+ call s:setup_commands(a:cchar)
+
+ let save_efm=&efm
+ set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
+
+ let lines = ["Entering dir 'dir1/a'",
+ \ 'habits2.txt:1:Nine Healthy Habits',
+ \ "Entering dir 'b'",
+ \ 'habits3.txt:2:0 Hours of television',
+ \ 'habits2.txt:7:5 Small meals',
+ \ "Entering dir 'dir1/c'",
+ \ 'habits4.txt:3:1 Hour of exercise',
+ \ "Leaving dir 'dir1/c'",
+ \ "Leaving dir 'dir1/a'",
+ \ 'habits1.txt:4:2 Liters of water',
+ \ "Entering dir 'dir2'",
+ \ 'habits5.txt:5:3 Cups of hot green tea',
+ \ "Leaving dir 'dir2'"
+ \]
+
+ Xexpr ""
+ for l in lines
+ Xaddexpr l
+ endfor
+
+ let qf = g:Xgetlist()
+
+ call assert_equal(expand('dir1/a/habits2.txt'), bufname(qf[1].bufnr))
+ call assert_equal(1, qf[1].lnum)
+ call assert_equal(expand('dir1/a/b/habits3.txt'), bufname(qf[3].bufnr))
+ call assert_equal(2, qf[3].lnum)
+ call assert_equal(expand('dir1/a/habits2.txt'), bufname(qf[4].bufnr))
+ call assert_equal(7, qf[4].lnum)
+ call assert_equal(expand('dir1/c/habits4.txt'), bufname(qf[6].bufnr))
+ call assert_equal(3, qf[6].lnum)
+ call assert_equal('habits1.txt', bufname(qf[9].bufnr))
+ call assert_equal(4, qf[9].lnum)
+ call assert_equal(expand('dir2/habits5.txt'), bufname(qf[11].bufnr))
+ call assert_equal(5, qf[11].lnum)
+
+ let &efm=save_efm
+endfunc
+
+" Tests for %D and %X errorformat options
+func Test_efm_dirstack()
+ " Create the directory stack and files
+ call mkdir('dir1')
+ call mkdir('dir1/a')
+ call mkdir('dir1/a/b')
+ call mkdir('dir1/c')
+ call mkdir('dir2')
+
+ let lines = ["Nine Healthy Habits",
+ \ "0 Hours of television",
+ \ "1 Hour of exercise",
+ \ "2 Liters of water",
+ \ "3 Cups of hot green tea",
+ \ "4 Short mental breaks",
+ \ "5 Small meals",
+ \ "6 AM wake up time",
+ \ "7 Minutes of laughter",
+ \ "8 Hours of sleep (at least)",
+ \ "9 PM end of the day and off to bed"
+ \ ]
+ call writefile(lines, 'habits1.txt')
+ call writefile(lines, 'dir1/a/habits2.txt')
+ call writefile(lines, 'dir1/a/b/habits3.txt')
+ call writefile(lines, 'dir1/c/habits4.txt')
+ call writefile(lines, 'dir2/habits5.txt')
+
+ call s:dir_stack_tests('c')
+ call s:dir_stack_tests('l')
+
+ call delete('dir1', 'rf')
+ call delete('dir2', 'rf')
+ call delete('habits1.txt')
+endfunc
+
+" Test for resync after continuing an ignored message
+func Xefm_ignore_continuations(cchar)
+ call s:setup_commands(a:cchar)
+
+ let save_efm = &efm
+
+ let &efm =
+ \ '%Eerror %m %l,' .
+ \ '%-Wignored %m %l,' .
+ \ '%+Cmore ignored %m %l,' .
+ \ '%Zignored end'
+ Xgetexpr ['ignored warning 1', 'more ignored continuation 2', 'ignored end', 'error resync 4']
+ let l = map(g:Xgetlist(), '[v:val.text, v:val.valid, v:val.lnum, v:val.type]')
+ call assert_equal([['resync', 1, 4, 'E']], l)
+
+ let &efm = save_efm
+endfunc
+
+func Test_efm_ignore_continuations()
+ call Xefm_ignore_continuations('c')
+ call Xefm_ignore_continuations('l')
+endfunc
+
+" Tests for invalid error format specifies
+func Xinvalid_efm_Tests(cchar)
+ call s:setup_commands(a:cchar)
+
+ let save_efm = &efm
+
+ set efm=%f:%l:%m,%f:%f:%l:%m
+ call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E372:')
+
+ set efm=%f:%l:%m,%f:%l:%r:%m
+ call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
+
+ set efm=%f:%l:%m,%O:%f:%l:%m
+ call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
+
+ set efm=%f:%l:%m,%f:%l:%*[^a-z
+ call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E374:')
+
+ set efm=%f:%l:%m,%f:%l:%*c
+ call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E375:')
+
+ set efm=%f:%l:%m,%L%M%N
+ call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E376:')
+
+ set efm=%f:%l:%m,%f:%l:%m:%R
+ call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E377:')
+
+ set efm=
+ call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E378:')
+
+ set efm=%DEntering\ dir\ abc,%f:%l:%m
+ call assert_fails('Xexpr ["Entering dir abc", "abc.txt:1:Hello world"]', 'E379:')
+
+ let &efm = save_efm
+endfunc
+
+func Test_invalid_efm()
+ call Xinvalid_efm_Tests('c')
+ call Xinvalid_efm_Tests('l')
+endfunc
+
+" TODO:
+" Add tests for the following formats in 'errorformat'
+" %r %O
+func Test_efm2()
+ let save_efm = &efm
+
+ " Test for %s format in efm
+ set efm=%f:%s
+ cexpr 'Xtestfile:Line search text'
+ let l = getqflist()
+ call assert_equal(l[0].pattern, '^\VLine search text\$')
+ call assert_equal(l[0].lnum, 0)
+
+ let l = split(execute('clist', ''), "\n")
+ call assert_equal([' 1 Xtestfile:^\VLine search text\$: '], l)
+
+ " Test for %P, %Q and %t format specifiers
+ let lines=["[Xtestfile1]",
+ \ "(1,17) error: ';' missing",
+ \ "(21,2) warning: variable 'z' not defined",
+ \ "(67,3) error: end of file found before string ended",
+ \ "--",
+ \ "",
+ \ "[Xtestfile2]",
+ \ "--",
+ \ "",
+ \ "[Xtestfile3]",
+ \ "NEW compiler v1.1",
+ \ "(2,2) warning: variable 'x' not defined",
+ \ "(67,3) warning: 's' already defined",
+ \ "--"
+ \]
+ set efm=%+P[%f]%r,(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%+Q--%r
+ " To exercise the push/pop file functionality in quickfix, the test files
+ " need to be created.
+ call writefile(['Line1'], 'Xtestfile1')
+ call writefile(['Line2'], 'Xtestfile2')
+ call writefile(['Line3'], 'Xtestfile3')
+ cexpr ""
+ for l in lines
+ caddexpr l
+ endfor
+ let l = getqflist()
+ call assert_equal(12, len(l))
+ call assert_equal(21, l[2].lnum)
+ call assert_equal(2, l[2].col)
+ call assert_equal('w', l[2].type)
+ call assert_equal('e', l[3].type)
+ call delete('Xtestfile1')
+ call delete('Xtestfile2')
+ call delete('Xtestfile3')
+
+ " Tests for %E, %C and %Z format specifiers
+ let lines = ["Error 275",
+ \ "line 42",
+ \ "column 3",
+ \ "' ' expected after '--'"
+ \]
+ set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m
+ cgetexpr lines
+ let l = getqflist()
+ call assert_equal(275, l[0].nr)
+ call assert_equal(42, l[0].lnum)
+ call assert_equal(3, l[0].col)
+ call assert_equal('E', l[0].type)
+ call assert_equal("\n' ' expected after '--'", l[0].text)
+
+ " Test for %>
+ let lines = ["Error in line 147 of foo.c:",
+ \"unknown variable 'i'"
+ \]
+ set efm=unknown\ variable\ %m,%E%>Error\ in\ line\ %l\ of\ %f:,%Z%m
+ cgetexpr lines
+ let l = getqflist()
+ call assert_equal(147, l[0].lnum)
+ call assert_equal('E', l[0].type)
+ call assert_equal("\nunknown variable 'i'", l[0].text)
+
+ " Test for %A, %C and other formats
+ let lines = [
+ \"==============================================================",
+ \"FAIL: testGetTypeIdCachesResult (dbfacadeTest.DjsDBFacadeTest)",
+ \"--------------------------------------------------------------",
+ \"Traceback (most recent call last):",
+ \' File "unittests/dbfacadeTest.py", line 89, in testFoo',
+ \" self.assertEquals(34, dtid)",
+ \' File "/usr/lib/python2.2/unittest.py", line 286, in',
+ \" failUnlessEqual",
+ \" raise self.failureException, \\",
+ \"AssertionError: 34 != 33",
+ \"",
+ \"--------------------------------------------------------------",
+ \"Ran 27 tests in 0.063s"
+ \]
+ set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m
+ cgetexpr lines
+ let l = getqflist()
+ call assert_equal(8, len(l))
+ call assert_equal(89, l[4].lnum)
+ call assert_equal(1, l[4].valid)
+ call assert_equal(expand('unittests/dbfacadeTest.py'), bufname(l[4].bufnr))
+
+ " The following sequence of commands used to crash Vim
+ set efm=%W%m
+ cgetexpr ['msg1']
+ let l = getqflist()
+ call assert_equal(1, len(l), string(l))
+ call assert_equal('msg1', l[0].text)
+ set efm=%C%m
+ lexpr 'msg2'
+ let l = getloclist(0)
+ call assert_equal(1, len(l), string(l))
+ call assert_equal('msg2', l[0].text)
+ lopen
+ call setqflist([], 'r')
+ caddbuf
+ let l = getqflist()
+ call assert_equal(1, len(l), string(l))
+ call assert_equal('|| msg2', l[0].text)
+
+ new | only
+ let &efm = save_efm
+endfunc
+
+func XquickfixChangedByAutocmd(cchar)
+ call s:setup_commands(a:cchar)
+ if a:cchar == 'c'
+ let ErrorNr = 'E925'
+ func! ReadFunc()
+ colder
+ cgetexpr []
+ endfunc
+ else
+ let ErrorNr = 'E926'
+ func! ReadFunc()
+ lolder
+ lgetexpr []
+ endfunc
+ endif
+
+ augroup testgroup
+ au!
+ autocmd BufReadCmd test_changed.txt call ReadFunc()
+ augroup END
+
+ new | only
+ let words = [ "a", "b" ]
+ let qflist = []
+ for word in words
+ call add(qflist, {'filename': 'test_changed.txt'})
+ call g:Xsetlist(qflist, ' ')
+ endfor
+ call assert_fails('Xrewind', ErrorNr . ':')
+
+ augroup! testgroup
+endfunc
+
+func Test_quickfix_was_changed_by_autocmd()
+ call XquickfixChangedByAutocmd('c')
+ call XquickfixChangedByAutocmd('l')
+endfunc
+
+func Test_caddbuffer_to_empty()
+ helpgr quickfix
+ call setqflist([], 'r')
+ cad
+ try
+ cn
+ catch
+ " number of matches is unknown
+ call assert_true(v:exception =~ 'E553:')
+ endtry
+ quit!
+endfunc
+
+func Test_cgetexpr_works()
+ " this must not crash Vim
+ cgetexpr [$x]
+ lgetexpr [$x]
+endfunc
+
+" Tests for the setqflist() and setloclist() functions
+func SetXlistTests(cchar, bnum)
+ call s:setup_commands(a:cchar)
+
+ call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 1},
+ \ {'bufnr': a:bnum, 'lnum': 2}])
+ let l = g:Xgetlist()
+ call assert_equal(2, len(l))
+ call assert_equal(2, l[1].lnum)
+
+ Xnext
+ call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3}], 'a')
+ let l = g:Xgetlist()
+ call assert_equal(3, len(l))
+ Xnext
+ call assert_equal(3, line('.'))
+
+ " Appending entries to the list should not change the cursor position
+ " in the quickfix window
+ Xwindow
+ 1
+ call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 4},
+ \ {'bufnr': a:bnum, 'lnum': 5}], 'a')
+ call assert_equal(1, line('.'))
+ close
+
+ call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3},
+ \ {'bufnr': a:bnum, 'lnum': 4},
+ \ {'bufnr': a:bnum, 'lnum': 5}], 'r')
+ let l = g:Xgetlist()
+ call assert_equal(3, len(l))
+ call assert_equal(5, l[2].lnum)
+
+ call g:Xsetlist([])
+ let l = g:Xgetlist()
+ call assert_equal(0, len(l))
+
+ " Tests for setting the 'valid' flag
+ call g:Xsetlist([{'bufnr':a:bnum, 'lnum':4, 'valid':0}])
+ Xwindow
+ call assert_equal(1, winnr('$'))
+ let l = g:Xgetlist()
+ call g:Xsetlist(l)
+ call assert_equal(0, g:Xgetlist()[0].valid)
+ call g:Xsetlist([{'text':'Text1', 'valid':1}])
+ Xwindow
+ call assert_equal(2, winnr('$'))
+ Xclose
+ let save_efm = &efm
+ set efm=%m
+ Xgetexpr 'TestMessage'
+ let l = g:Xgetlist()
+ call g:Xsetlist(l)
+ call assert_equal(1, g:Xgetlist()[0].valid)
+ let &efm = save_efm
+
+ " Error cases:
+ " Refer to a non-existing buffer and pass a non-dictionary type
+ call assert_fails("call g:Xsetlist([{'bufnr':998, 'lnum':4}," .
+ \ " {'bufnr':999, 'lnum':5}])", 'E92:')
+ call g:Xsetlist([[1, 2,3]])
+ call assert_equal(0, len(g:Xgetlist()))
+endfunc
+
+func Test_setqflist()
+ new Xtestfile | only
+ let bnum = bufnr('%')
+ call setline(1, range(1,5))
+
+ call SetXlistTests('c', bnum)
+ call SetXlistTests('l', bnum)
+
+ enew!
+ call delete('Xtestfile')
+endfunc
+
+func Xlist_empty_middle(cchar)
+ call s:setup_commands(a:cchar)
+
+ " create three quickfix lists
+ let @/ = 'Test_'
+ Xvimgrep // test_quickfix.vim
+ let testlen = len(g:Xgetlist())
+ call assert_true(testlen > 0)
+ Xvimgrep empty test_quickfix.vim
+ call assert_true(len(g:Xgetlist()) > 0)
+ Xvimgrep matches test_quickfix.vim
+ let matchlen = len(g:Xgetlist())
+ call assert_true(matchlen > 0)
+ Xolder
+ " make the middle list empty
+ call g:Xsetlist([], 'r')
+ call assert_true(len(g:Xgetlist()) == 0)
+ Xolder
+ call assert_equal(testlen, len(g:Xgetlist()))
+ Xnewer
+ Xnewer
+ call assert_equal(matchlen, len(g:Xgetlist()))
+endfunc
+
+func Test_setqflist_empty_middle()
+ call Xlist_empty_middle('c')
+ call Xlist_empty_middle('l')
+endfunc
+
+func Xlist_empty_older(cchar)
+ call s:setup_commands(a:cchar)
+
+ " create three quickfix lists
+ Xvimgrep one test_quickfix.vim
+ let onelen = len(g:Xgetlist())
+ call assert_true(onelen > 0)
+ Xvimgrep two test_quickfix.vim
+ let twolen = len(g:Xgetlist())
+ call assert_true(twolen > 0)
+ Xvimgrep three test_quickfix.vim
+ let threelen = len(g:Xgetlist())
+ call assert_true(threelen > 0)
+ Xolder 2
+ " make the first list empty, check the others didn't change
+ call g:Xsetlist([], 'r')
+ call assert_true(len(g:Xgetlist()) == 0)
+ Xnewer
+ call assert_equal(twolen, len(g:Xgetlist()))
+ Xnewer
+ call assert_equal(threelen, len(g:Xgetlist()))
+endfunc
+
+func Test_setqflist_empty_older()
+ call Xlist_empty_older('c')
+ call Xlist_empty_older('l')
+endfunc
+
+func XquickfixSetListWithAct(cchar)
+ call s:setup_commands(a:cchar)
+
+ let list1 = [{'filename': 'fnameA', 'text': 'A'},
+ \ {'filename': 'fnameB', 'text': 'B'}]
+ let list2 = [{'filename': 'fnameC', 'text': 'C'},
+ \ {'filename': 'fnameD', 'text': 'D'},
+ \ {'filename': 'fnameE', 'text': 'E'}]
+
+ " {action} is unspecified. Same as specifing ' '.
+ new | only
+ silent! Xnewer 99
+ call g:Xsetlist(list1)
+ call g:Xsetlist(list2)
+ let li = g:Xgetlist()
+ call assert_equal(3, len(li))
+ call assert_equal('C', li[0]['text'])
+ call assert_equal('D', li[1]['text'])
+ call assert_equal('E', li[2]['text'])
+ silent! Xolder
+ let li = g:Xgetlist()
+ call assert_equal(2, len(li))
+ call assert_equal('A', li[0]['text'])
+ call assert_equal('B', li[1]['text'])
+
+ " {action} is specified ' '.
+ new | only
+ silent! Xnewer 99
+ call g:Xsetlist(list1)
+ call g:Xsetlist(list2, ' ')
+ let li = g:Xgetlist()
+ call assert_equal(3, len(li))
+ call assert_equal('C', li[0]['text'])
+ call assert_equal('D', li[1]['text'])
+ call assert_equal('E', li[2]['text'])
+ silent! Xolder
+ let li = g:Xgetlist()
+ call assert_equal(2, len(li))
+ call assert_equal('A', li[0]['text'])
+ call assert_equal('B', li[1]['text'])
+
+ " {action} is specified 'a'.
+ new | only
+ silent! Xnewer 99
+ call g:Xsetlist(list1)
+ call g:Xsetlist(list2, 'a')
+ let li = g:Xgetlist()
+ call assert_equal(5, len(li))
+ call assert_equal('A', li[0]['text'])
+ call assert_equal('B', li[1]['text'])
+ call assert_equal('C', li[2]['text'])
+ call assert_equal('D', li[3]['text'])
+ call assert_equal('E', li[4]['text'])
+
+ " {action} is specified 'r'.
+ new | only
+ silent! Xnewer 99
+ call g:Xsetlist(list1)
+ call g:Xsetlist(list2, 'r')
+ let li = g:Xgetlist()
+ call assert_equal(3, len(li))
+ call assert_equal('C', li[0]['text'])
+ call assert_equal('D', li[1]['text'])
+ call assert_equal('E', li[2]['text'])
+
+ " Test for wrong value.
+ new | only
+ call assert_fails("call g:Xsetlist(0)", 'E714:')
+ call assert_fails("call g:Xsetlist(list1, '')", 'E927:')
+ call assert_fails("call g:Xsetlist(list1, 'aa')", 'E927:')
+ call assert_fails("call g:Xsetlist(list1, ' a')", 'E927:')
+ call assert_fails("call g:Xsetlist(list1, 0)", 'E928:')
+endfunc
+
+func Test_quickfix_set_list_with_act()
+ call XquickfixSetListWithAct('c')
+ call XquickfixSetListWithAct('l')
+endfunc
+
+func XLongLinesTests(cchar)
+ let l = g:Xgetlist()
+
+ call assert_equal(4, len(l))
+ call assert_equal(1, l[0].lnum)
+ call assert_equal(1, l[0].col)
+ call assert_equal(1975, len(l[0].text))
+ call assert_equal(2, l[1].lnum)
+ call assert_equal(1, l[1].col)
+ call assert_equal(4070, len(l[1].text))
+ call assert_equal(3, l[2].lnum)
+ call assert_equal(1, l[2].col)
+ call assert_equal(4070, len(l[2].text))
+ call assert_equal(4, l[3].lnum)
+ call assert_equal(1, l[3].col)
+ call assert_equal(10, len(l[3].text))
+
+ call g:Xsetlist([], 'r')
+endfunc
+
+func s:long_lines_tests(cchar)
+ call s:setup_commands(a:cchar)
+
+ let testfile = 'samples/quickfix.txt'
+
+ " file
+ exe 'Xgetfile' testfile
+ call XLongLinesTests(a:cchar)
+
+ " list
+ Xexpr readfile(testfile)
+ call XLongLinesTests(a:cchar)
+
+ " string
+ Xexpr join(readfile(testfile), "\n")
+ call XLongLinesTests(a:cchar)
+
+ " buffer
+ exe 'edit' testfile
+ exe 'Xbuffer' bufnr('%')
+ call XLongLinesTests(a:cchar)
+endfunc
+
+func Test_long_lines()
+ call s:long_lines_tests('c')
+ call s:long_lines_tests('l')
+endfunc
+
+func s:create_test_file(filename)
+ let l = []
+ for i in range(1, 20)
+ call add(l, 'Line' . i)
+ endfor
+ call writefile(l, a:filename)
+endfunc
+
+func Test_switchbuf()
+ call s:create_test_file('Xqftestfile1')
+ call s:create_test_file('Xqftestfile2')
+ call s:create_test_file('Xqftestfile3')
+
+ new | only
+ edit Xqftestfile1
+ let file1_winid = win_getid()
+ new Xqftestfile2
+ let file2_winid = win_getid()
+ cgetexpr ['Xqftestfile1:5:Line5',
+ \ 'Xqftestfile1:6:Line6',
+ \ 'Xqftestfile2:10:Line10',
+ \ 'Xqftestfile2:11:Line11',
+ \ 'Xqftestfile3:15:Line15',
+ \ 'Xqftestfile3:16:Line16']
+
+ new
+ let winid = win_getid()
+ cfirst | cnext
+ call assert_equal(winid, win_getid())
+ 2cnext
+ call assert_equal(winid, win_getid())
+ 2cnext
+ call assert_equal(winid, win_getid())
+ enew
+
+ set switchbuf=useopen
+ cfirst | cnext
+ call assert_equal(file1_winid, win_getid())
+ 2cnext
+ call assert_equal(file2_winid, win_getid())
+ 2cnext
+ call assert_equal(file2_winid, win_getid())
+
+ enew | only
+ set switchbuf=usetab
+ tabedit Xqftestfile1
+ tabedit Xqftestfile2
+ tabfirst
+ cfirst | cnext
+ call assert_equal(2, tabpagenr())
+ 2cnext
+ call assert_equal(3, tabpagenr())
+ 2cnext
+ call assert_equal(3, tabpagenr())
+ tabfirst | tabonly | enew
+
+ set switchbuf=split
+ cfirst | cnext
+ call assert_equal(1, winnr('$'))
+ cnext | cnext
+ call assert_equal(2, winnr('$'))
+ cnext | cnext
+ call assert_equal(3, winnr('$'))
+ enew | only
+
+ set switchbuf=newtab
+ cfirst | cnext
+ call assert_equal(1, tabpagenr('$'))
+ cnext | cnext
+ call assert_equal(2, tabpagenr('$'))
+ cnext | cnext
+ call assert_equal(3, tabpagenr('$'))
+ tabfirst | enew | tabonly | only
+
+ set switchbuf=
+ edit Xqftestfile1
+ let file1_winid = win_getid()
+ new Xqftestfile2
+ let file2_winid = win_getid()
+ copen
+ exe "normal 1G\<CR>"
+ call assert_equal(file1_winid, win_getid())
+ copen
+ exe "normal 3G\<CR>"
+ call assert_equal(file2_winid, win_getid())
+ copen | only
+ exe "normal 5G\<CR>"
+ call assert_equal(2, winnr('$'))
+ call assert_equal(1, bufwinnr('Xqftestfile3'))
+
+ " If only quickfix window is open in the current tabpage, jumping to an
+ " entry with 'switchubf' set to 'usetab' should search in other tabpages.
+ enew | only
+ set switchbuf=usetab
+ tabedit Xqftestfile1
+ tabedit Xqftestfile2
+ tabedit Xqftestfile3
+ tabfirst
+ copen | only
+ clast
+ call assert_equal(4, tabpagenr())
+ tabfirst | tabonly | enew | only
+
+ call delete('Xqftestfile1')
+ call delete('Xqftestfile2')
+ call delete('Xqftestfile3')
+ set switchbuf&vim
+
+ enew | only
+endfunc
+
+func Xadjust_qflnum(cchar)
+ call s:setup_commands(a:cchar)
+
+ enew | only
+
+ let fname = 'Xqftestfile' . a:cchar
+ call s:create_test_file(fname)
+ exe 'edit ' . fname
+
+ Xgetexpr [fname . ':5:Line5',
+ \ fname . ':10:Line10',
+ \ fname . ':15:Line15',
+ \ fname . ':20:Line20']
+
+ 6,14delete
+ call append(6, ['Buffer', 'Window'])
+
+ let l = g:Xgetlist()
+
+ call assert_equal(5, l[0].lnum)
+ call assert_equal(6, l[2].lnum)
+ call assert_equal(13, l[3].lnum)
+
+ enew!
+ call delete(fname)
+endfunc
+
+func Test_adjust_lnum()
+ call setloclist(0, [])
+ call Xadjust_qflnum('c')
+ call setqflist([])
+ call Xadjust_qflnum('l')
+endfunc
+
+" Tests for the :grep/:lgrep and :grepadd/:lgrepadd commands
+func s:test_xgrep(cchar)
+ call s:setup_commands(a:cchar)
+
+ " The following lines are used for the grep test. Don't remove.
+ " Grep_Test_Text: Match 1
+ " Grep_Test_Text: Match 2
+ " GrepAdd_Test_Text: Match 1
+ " GrepAdd_Test_Text: Match 2
+ enew! | only
+ set makeef&vim
+ silent Xgrep Grep_Test_Text: test_quickfix.vim
+ call assert_true(len(g:Xgetlist()) == 3)
+ Xopen
+ call assert_true(w:quickfix_title =~ '^:grep')
+ Xclose
+ enew
+ set makeef=Temp_File_##
+ silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
+ call assert_true(len(g:Xgetlist()) == 6)
+endfunc
+
+func Test_grep()
+ if !has('unix')
+ " The grepprg may not be set on non-Unix systems
+ return
+ endif
+
+ call s:test_xgrep('c')
+ call s:test_xgrep('l')
+endfunc
+
+func Test_two_windows()
+ " Use one 'errorformat' for two windows. Add an expression to each of them,
+ " make sure they each keep their own state.
+ set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
+ call mkdir('Xone/a', 'p')
+ call mkdir('Xtwo/a', 'p')
+ let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
+ call writefile(lines, 'Xone/a/one.txt')
+ call writefile(lines, 'Xtwo/a/two.txt')
+
+ new one
+ let one_id = win_getid()
+ lexpr ""
+ new two
+ let two_id = win_getid()
+ lexpr ""
+
+ laddexpr "Entering dir 'Xtwo/a'"
+ call win_gotoid(one_id)
+ laddexpr "Entering dir 'Xone/a'"
+ call win_gotoid(two_id)
+ laddexpr 'two.txt:5:two two two'
+ call win_gotoid(one_id)
+ laddexpr 'one.txt:3:one one one'
+
+ let loc_one = getloclist(one_id)
+ call assert_equal(expand('Xone/a/one.txt'), bufname(loc_one[1].bufnr))
+ call assert_equal(3, loc_one[1].lnum)
+
+ let loc_two = getloclist(two_id)
+ call assert_equal(expand('Xtwo/a/two.txt'), bufname(loc_two[1].bufnr))
+ call assert_equal(5, loc_two[1].lnum)
+
+ call win_gotoid(one_id)
+ bwipe!
+ call win_gotoid(two_id)
+ bwipe!
+ call delete('Xone', 'rf')
+ call delete('Xtwo', 'rf')
+endfunc
+
+func XbottomTests(cchar)
+ call s:setup_commands(a:cchar)
+
+ " Calling lbottom without any errors should fail
+ if a:cchar == 'l'
+ call assert_fails('lbottom', 'E776:')
+ endif
+
+ call g:Xsetlist([{'filename': 'foo', 'lnum': 42}])
+ Xopen
+ let wid = win_getid()
+ call assert_equal(1, line('.'))
+ wincmd w
+ call g:Xsetlist([{'filename': 'var', 'lnum': 24}], 'a')
+ Xbottom
+ call win_gotoid(wid)
+ call assert_equal(2, line('.'))
+ Xclose
+endfunc
+
+" Tests for the :cbottom and :lbottom commands
+func Test_cbottom()
+ call XbottomTests('c')
+ call XbottomTests('l')
+endfunc
+
+func HistoryTest(cchar)
+ call s:setup_commands(a:cchar)
+
+ " clear all lists after the first one, then replace the first one.
+ call g:Xsetlist([])
+ call assert_fails('Xolder 99', 'E380:')
+ let entry = {'filename': 'foo', 'lnum': 42}
+ call g:Xsetlist([entry], 'r')
+ call g:Xsetlist([entry, entry])
+ call g:Xsetlist([entry, entry, entry])
+ let res = split(execute(a:cchar . 'hist'), "\n")
+ call assert_equal(3, len(res))
+ let common = 'errors :set' . (a:cchar == 'c' ? 'qf' : 'loc') . 'list()'
+ call assert_equal(' error list 1 of 3; 1 ' . common, res[0])
+ call assert_equal(' error list 2 of 3; 2 ' . common, res[1])
+ call assert_equal('> error list 3 of 3; 3 ' . common, res[2])
+endfunc
+
+func Test_history()
+ call HistoryTest('c')
+ call HistoryTest('l')
+endfunc
+
+func Test_duplicate_buf()
+ " make sure we can get the highest buffer number
+ edit DoesNotExist
+ edit DoesNotExist2
+ let last_buffer = bufnr("$")
+
+ " make sure only one buffer is created
+ call writefile(['this one', 'that one'], 'Xgrepthis')
+ vimgrep one Xgrepthis
+ vimgrep one Xgrepthis
+ call assert_equal(last_buffer + 1, bufnr("$"))
+
+ call delete('Xgrepthis')
+endfunc
+
+" Quickfix/Location list set/get properties tests
+func Xproperty_tests(cchar)
+ call s:setup_commands(a:cchar)
+
+ " Error cases
+ call assert_fails('call g:Xgetlist(99)', 'E715:')
+ call assert_fails('call g:Xsetlist(99)', 'E714:')
+ call assert_fails('call g:Xsetlist([], "a", [])', 'E715:')
+
+ " Set and get the title
+ call g:Xsetlist([])
+ Xopen
+ wincmd p
+ call g:Xsetlist([{'filename':'foo', 'lnum':27}])
+ let s = g:Xsetlist([], 'a', {'title' : 'Sample'})
+ call assert_equal(0, s)
+ let d = g:Xgetlist({"title":1})
+ call assert_equal('Sample', d.title)
+
+ Xopen
+ call assert_equal('Sample', w:quickfix_title)
+ Xclose
+
+ " Tests for action argument
+ silent! Xolder 999
+ let qfnr = g:Xgetlist({'all':1}).nr
+ call g:Xsetlist([], 'r', {'title' : 'N1'})
+ call assert_equal('N1', g:Xgetlist({'all':1}).title)
+ call g:Xsetlist([], ' ', {'title' : 'N2'})
+ call assert_equal(qfnr + 1, g:Xgetlist({'all':1}).nr)
+
+ let res = g:Xgetlist({'nr': 0})
+ call assert_equal(qfnr + 1, res.nr)
+ call assert_equal(['nr'], keys(res))
+
+ call g:Xsetlist([], ' ', {'title' : 'N3'})
+ call assert_equal('N2', g:Xgetlist({'nr':2, 'title':1}).title)
+
+ " Changing the title of an earlier quickfix list
+ call g:Xsetlist([], 'r', {'title' : 'NewTitle', 'nr' : 2})
+ call assert_equal('NewTitle', g:Xgetlist({'nr':2, 'title':1}).title)
+
+ " Changing the title of an invalid quickfix list
+ call assert_equal(-1, g:Xsetlist([], ' ',
+ \ {'title' : 'SomeTitle', 'nr' : 99}))
+ call assert_equal(-1, g:Xsetlist([], ' ',
+ \ {'title' : 'SomeTitle', 'nr' : 'abc'}))
+
+ if a:cchar == 'c'
+ copen
+ call assert_equal({'winid':win_getid()}, getqflist({'winid':1}))
+ cclose
+ endif
+
+ " Invalid arguments
+ call assert_fails('call g:Xgetlist([])', 'E715')
+ call assert_fails('call g:Xsetlist([], "a", [])', 'E715')
+ let s = g:Xsetlist([], 'a', {'abc':1})
+ call assert_equal(-1, s)
+
+ call assert_equal({}, g:Xgetlist({'abc':1}))
+ call assert_equal({}, g:Xgetlist({'nr':99, 'title':1}))
+ call assert_equal({}, g:Xgetlist({'nr':[], 'title':1}))
+
+ if a:cchar == 'l'
+ call assert_equal({}, getloclist(99, {'title': 1}))
+ endif
+
+ " Context related tests
+ let s = g:Xsetlist([], 'a', {'context':[1,2,3]})
+ call assert_equal(0, s)
+ call test_garbagecollect_now()
+ let d = g:Xgetlist({'context':1})
+ call assert_equal([1,2,3], d.context)
+ call g:Xsetlist([], 'a', {'context':{'color':'green'}})
+ let d = g:Xgetlist({'context':1})
+ call assert_equal({'color':'green'}, d.context)
+ call g:Xsetlist([], 'a', {'context':"Context info"})
+ let d = g:Xgetlist({'context':1})
+ call assert_equal("Context info", d.context)
+ call g:Xsetlist([], 'a', {'context':246})
+ let d = g:Xgetlist({'context':1})
+ call assert_equal(246, d.context)
+ if a:cchar == 'l'
+ " Test for copying context across two different location lists
+ new | only
+ let w1_id = win_getid()
+ let l = [1]
+ call setloclist(0, [], 'a', {'context':l})
+ new
+ let w2_id = win_getid()
+ call add(l, 2)
+ call assert_equal([1, 2], getloclist(w1_id, {'context':1}).context)
+ call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
+ unlet! l
+ call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
+ only
+ call setloclist(0, [], 'f')
+ call assert_equal({}, getloclist(0, {'context':1}))
+ endif
+
+ " Test for changing the context of previous quickfix lists
+ call g:Xsetlist([], 'f')
+ Xexpr "One"
+ Xexpr "Two"
+ Xexpr "Three"
+ call g:Xsetlist([], 'r', {'context' : [1], 'nr' : 1})
+ call g:Xsetlist([], 'a', {'context' : [2], 'nr' : 2})
+ " Also, check for setting the context using quickfix list number zero.
+ call g:Xsetlist([], 'r', {'context' : [3], 'nr' : 0})
+ call test_garbagecollect_now()
+ let l = g:Xgetlist({'nr' : 1, 'context' : 1})
+ call assert_equal([1], l.context)
+ let l = g:Xgetlist({'nr' : 2, 'context' : 1})
+ call assert_equal([2], l.context)
+ let l = g:Xgetlist({'nr' : 3, 'context' : 1})
+ call assert_equal([3], l.context)
+
+ " Test for changing the context through reference and for garbage
+ " collection of quickfix context
+ let l = ["red"]
+ call g:Xsetlist([], ' ', {'context' : l})
+ call add(l, "blue")
+ let x = g:Xgetlist({'context' : 1})
+ call add(x.context, "green")
+ call assert_equal(["red", "blue", "green"], l)
+ call assert_equal(["red", "blue", "green"], x.context)
+ unlet l
+ call test_garbagecollect_now()
+ let m = g:Xgetlist({'context' : 1})
+ call assert_equal(["red", "blue", "green"], m.context)
+
+ " Test for setting/getting items
+ Xexpr ""
+ let qfprev = g:Xgetlist({'nr':0})
+ let s = g:Xsetlist([], ' ', {'title':'Green',
+ \ 'items' : [{'filename':'F1', 'lnum':10}]})
+ call assert_equal(0, s)
+ let qfcur = g:Xgetlist({'nr':0})
+ call assert_true(qfcur.nr == qfprev.nr + 1)
+ let l = g:Xgetlist({'items':1})
+ call assert_equal('F1', bufname(l.items[0].bufnr))
+ call assert_equal(10, l.items[0].lnum)
+ call g:Xsetlist([], 'a', {'items' : [{'filename':'F2', 'lnum':20},
+ \ {'filename':'F2', 'lnum':30}]})
+ let l = g:Xgetlist({'items':1})
+ call assert_equal('F2', bufname(l.items[2].bufnr))
+ call assert_equal(30, l.items[2].lnum)
+ call g:Xsetlist([], 'r', {'items' : [{'filename':'F3', 'lnum':40}]})
+ let l = g:Xgetlist({'items':1})
+ call assert_equal('F3', bufname(l.items[0].bufnr))
+ call assert_equal(40, l.items[0].lnum)
+ call g:Xsetlist([], 'r', {'items' : []})
+ let l = g:Xgetlist({'items':1})
+ call assert_equal(0, len(l.items))
+
+ " The following used to crash Vim with address sanitizer
+ call g:Xsetlist([], 'f')
+ call g:Xsetlist([], 'a', {'items' : [{'filename':'F1', 'lnum':10}]})
+ call assert_equal(10, g:Xgetlist({'items':1}).items[0].lnum)
+
+ " Save and restore the quickfix stack
+ call g:Xsetlist([], 'f')
+ call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
+ Xexpr "File1:10:Line1"
+ Xexpr "File2:20:Line2"
+ Xexpr "File3:30:Line3"
+ let last_qf = g:Xgetlist({'nr':'$'}).nr
+ call assert_equal(3, last_qf)
+ let qstack = []
+ for i in range(1, last_qf)
+ let qstack = add(qstack, g:Xgetlist({'nr':i, 'all':1}))
+ endfor
+ call g:Xsetlist([], 'f')
+ for i in range(len(qstack))
+ call g:Xsetlist([], ' ', qstack[i])
+ endfor
+ call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
+ call assert_equal(10, g:Xgetlist({'nr':1, 'items':1}).items[0].lnum)
+ call assert_equal(20, g:Xgetlist({'nr':2, 'items':1}).items[0].lnum)
+ call assert_equal(30, g:Xgetlist({'nr':3, 'items':1}).items[0].lnum)
+ call g:Xsetlist([], 'f')
+
+ " Swap two quickfix lists
+ Xexpr "File1:10:Line10"
+ Xexpr "File2:20:Line20"
+ Xexpr "File3:30:Line30"
+ call g:Xsetlist([], 'r', {'nr':1,'title':'Colors','context':['Colors']})
+ call g:Xsetlist([], 'r', {'nr':2,'title':'Fruits','context':['Fruits']})
+ let l1=g:Xgetlist({'nr':1,'all':1})
+ let l2=g:Xgetlist({'nr':2,'all':1})
+ let save_id = l1.id
+ let l1.id=l2.id
+ let l2.id=save_id
+ call g:Xsetlist([], 'r', l1)
+ call g:Xsetlist([], 'r', l2)
+ let newl1=g:Xgetlist({'nr':1,'all':1})
+ let newl2=g:Xgetlist({'nr':2,'all':1})
+ call assert_equal(':Fruits', newl1.title)
+ call assert_equal(['Fruits'], newl1.context)
+ call assert_equal('Line20', newl1.items[0].text)
+ call assert_equal(':Colors', newl2.title)
+ call assert_equal(['Colors'], newl2.context)
+ call assert_equal('Line10', newl2.items[0].text)
+ call g:Xsetlist([], 'f')
+endfunc
+
+func Test_qf_property()
+ call Xproperty_tests('c')
+ call Xproperty_tests('l')
+endfunc
+
+" Tests for the QuickFixCmdPre/QuickFixCmdPost autocommands
+func QfAutoCmdHandler(loc, cmd)
+ call add(g:acmds, a:loc . a:cmd)
+endfunc
+
+func Test_Autocmd()
+ autocmd QuickFixCmdPre * call QfAutoCmdHandler('pre', expand('<amatch>'))
+ autocmd QuickFixCmdPost * call QfAutoCmdHandler('post', expand('<amatch>'))
+
+ let g:acmds = []
+ cexpr "F1:10:Line 10"
+ caddexpr "F1:20:Line 20"
+ cgetexpr "F1:30:Line 30"
+ enew! | call append(0, "F2:10:Line 10")
+ cbuffer!
+ enew! | call append(0, "F2:20:Line 20")
+ cgetbuffer
+ enew! | call append(0, "F2:30:Line 30")
+ caddbuffer
+
+ let l = ['precexpr',
+ \ 'postcexpr',
+ \ 'precaddexpr',
+ \ 'postcaddexpr',
+ \ 'precgetexpr',
+ \ 'postcgetexpr',
+ \ 'precbuffer',
+ \ 'postcbuffer',
+ \ 'precgetbuffer',
+ \ 'postcgetbuffer',
+ \ 'precaddbuffer',
+ \ 'postcaddbuffer']
+ call assert_equal(l, g:acmds)
+endfunc
+
+func Test_Autocmd_Exception()
+ set efm=%m
+ lgetexpr '?'
+
+ try
+ call DoesNotExit()
+ catch
+ lgetexpr '1'
+ finally
+ lgetexpr '1'
+ endtry
+
+ call assert_equal('1', getloclist(0)[0].text)
+
+ set efm&vim
+endfunc
+
+func Test_caddbuffer_wrong()
+ " This used to cause a memory access in freed memory.
+ let save_efm = &efm
+ set efm=%EEEE%m,%WWWW,%+CCCC%>%#,%GGGG%.#
+ cgetexpr ['WWWW', 'EEEE', 'CCCC']
+ let &efm = save_efm
+ caddbuffer
+ bwipe!
+endfunc
+
+func Test_caddexpr_wrong()
+ " This used to cause a memory access in freed memory.
+ cbuffer
+ cbuffer
+ copen
+ let save_efm = &efm
+ set efm=%
+ call assert_fails('caddexpr ""', 'E376:')
+ let &efm = save_efm
+endfunc
+
+func Test_dirstack_cleanup()
+ " This used to cause a memory access in freed memory.
+ let save_efm = &efm
+ lexpr '0'
+ lopen
+ fun X(c)
+ let save_efm=&efm
+ set efm=%D%f
+ if a:c == 'c'
+ caddexpr '::'
+ else
+ laddexpr ':0:0'
+ endif
+ let &efm=save_efm
+ endfun
+ call X('c')
+ call X('l')
+ call setqflist([], 'r')
+ caddbuffer
+ let &efm = save_efm
+endfunc
+
+" Tests for jumping to entries from the location list window and quickfix
+" window
+func Test_cwindow_jump()
+ set efm=%f%%%l%%%m
+ lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
+ lopen | only
+ lfirst
+ call assert_true(winnr('$') == 2)
+ call assert_true(winnr() == 1)
+ " Location list for the new window should be set
+ call assert_true(getloclist(0)[2].text == 'Line 30')
+
+ " Open a scratch buffer
+ " Open a new window and create a location list
+ " Open the location list window and close the other window
+ " Jump to an entry.
+ " Should create a new window and jump to the entry. The scrtach buffer
+ " should not be used.
+ enew | only
+ set buftype=nofile
+ below new
+ lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
+ lopen
+ 2wincmd c
+ lnext
+ call assert_true(winnr('$') == 3)
+ call assert_true(winnr() == 2)
+
+ " Open two windows with two different location lists
+ " Open the location list window and close the previous window
+ " Jump to an entry in the location list window
+ " Should open the file in the first window and not set the location list.
+ enew | only
+ lgetexpr ["F1%5%Line 5"]
+ below new
+ lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
+ lopen
+ 2wincmd c
+ lnext
+ call assert_true(winnr() == 1)
+ call assert_true(getloclist(0)[0].text == 'Line 5')
+
+ enew | only
+ cgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
+ copen
+ cnext
+ call assert_true(winnr('$') == 2)
+ call assert_true(winnr() == 1)
+
+ enew | only
+ set efm&vim
+endfunc
+
+func XvimgrepTests(cchar)
+ call s:setup_commands(a:cchar)
+
+ call writefile(['Editor:VIM vim',
+ \ 'Editor:Emacs EmAcS',
+ \ 'Editor:Notepad NOTEPAD'], 'Xtestfile1')
+ call writefile(['Linux', 'MacOS', 'MS-Windows'], 'Xtestfile2')
+
+ " Error cases
+ call assert_fails('Xvimgrep /abc *', 'E682:')
+
+ let @/=''
+ call assert_fails('Xvimgrep // *', 'E35:')
+
+ call assert_fails('Xvimgrep abc', 'E683:')
+ call assert_fails('Xvimgrep a1b2c3 Xtestfile1', 'E480:')
+ call assert_fails('Xvimgrep pat Xa1b2c3', 'E480:')
+
+ Xexpr ""
+ Xvimgrepadd Notepad Xtestfile1
+ Xvimgrepadd MacOS Xtestfile2
+ let l = g:Xgetlist()
+ call assert_equal(2, len(l))
+ call assert_equal('Editor:Notepad NOTEPAD', l[0].text)
+
+ Xvimgrep #\cvim#g Xtestfile?
+ let l = g:Xgetlist()
+ call assert_equal(2, len(l))
+ call assert_equal(8, l[0].col)
+ call assert_equal(12, l[1].col)
+
+ 1Xvimgrep ?Editor? Xtestfile*
+ let l = g:Xgetlist()
+ call assert_equal(1, len(l))
+ call assert_equal('Editor:VIM vim', l[0].text)
+
+ edit +3 Xtestfile2
+ Xvimgrep +\cemacs+j Xtestfile1
+ let l = g:Xgetlist()
+ call assert_equal('Xtestfile2', bufname(''))
+ call assert_equal('Editor:Emacs EmAcS', l[0].text)
+
+ call delete('Xtestfile1')
+ call delete('Xtestfile2')
+endfunc
+
+" Tests for the :vimgrep command
+func Test_vimgrep()
+ call XvimgrepTests('c')
+ call XvimgrepTests('l')
+endfunc
+
+func XfreeTests(cchar)
+ call s:setup_commands(a:cchar)
+
+ enew | only
+
+ " Deleting the quickfix stack should work even When the current list is
+ " somewhere in the middle of the stack
+ Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
+ Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
+ Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
+ Xolder
+ call g:Xsetlist([], 'f')
+ call assert_equal(0, len(g:Xgetlist()))
+
+ " After deleting the stack, adding a new list should create a stack with a
+ " single list.
+ Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
+ call assert_equal(1, g:Xgetlist({'all':1}).nr)
+
+ " Deleting the stack from a quickfix window should update/clear the
+ " quickfix/location list window.
+ Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
+ Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
+ Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
+ Xolder
+ Xwindow
+ call g:Xsetlist([], 'f')
+ call assert_equal(2, winnr('$'))
+ call assert_equal(1, line('$'))
+ Xclose
+
+ " Deleting the stack from a non-quickfix window should update/clear the
+ " quickfix/location list window.
+ Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
+ Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
+ Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
+ Xolder
+ Xwindow
+ wincmd p
+ call g:Xsetlist([], 'f')
+ call assert_equal(0, len(g:Xgetlist()))
+ wincmd p
+ call assert_equal(2, winnr('$'))
+ call assert_equal(1, line('$'))
+
+ " After deleting the location list stack, if the location list window is
+ " opened, then a new location list should be created. So opening the
+ " location list window again should not create a new window.
+ if a:cchar == 'l'
+ lexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
+ wincmd p
+ lopen
+ call assert_equal(2, winnr('$'))
+ endif
+ Xclose
+endfunc
+
+" Tests for the quickifx free functionality
+func Test_qf_free()
+ call XfreeTests('c')
+ call XfreeTests('l')
+endfunc
+
+" Test for buffer overflow when parsing lines and adding new entries to
+" the quickfix list.
+func Test_bufoverflow()
+ set efm=%f:%l:%m
+ cgetexpr ['File1:100:' . repeat('x', 1025)]
+
+ set efm=%+GCompiler:\ %.%#,%f:%l:%m
+ cgetexpr ['Compiler: ' . repeat('a', 1015), 'File1:10:Hello World']
+
+ set efm=%DEntering\ directory\ %f,%f:%l:%m
+ cgetexpr ['Entering directory ' . repeat('a', 1006),
+ \ 'File1:10:Hello World']
+ set efm&vim
+endfunc
+
+" Tests for getting the quickfix stack size
+func XsizeTests(cchar)
+ call s:setup_commands(a:cchar)
+
+ call g:Xsetlist([], 'f')
+ call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
+ call assert_equal(1, len(g:Xgetlist({'nr':'$', 'all':1})))
+ call assert_equal(0, len(g:Xgetlist({'nr':0})))
+
+ Xexpr "File1:10:Line1"
+ Xexpr "File2:20:Line2"
+ Xexpr "File3:30:Line3"
+ Xolder | Xolder
+ call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
+ call g:Xsetlist([], 'f')
+
+ Xexpr "File1:10:Line1"
+ Xexpr "File2:20:Line2"
+ Xexpr "File3:30:Line3"
+ Xolder | Xolder
+ call g:Xsetlist([], 'a', {'nr':'$', 'title':'Compiler'})
+ call assert_equal('Compiler', g:Xgetlist({'nr':3, 'all':1}).title)
+endfunc
+
+func Test_Qf_Size()
+ call XsizeTests('c')
+ call XsizeTests('l')
+endfunc
+
+func Test_cclose_from_copen()
+ augroup QF_Test
+ au!
+ au FileType qf :call assert_fails(':cclose', 'E788')
+ augroup END
+ copen
+ augroup QF_Test
+ au!
+ augroup END
+ augroup! QF_Test
+endfunc
+
+func Test_cclose_in_autocmd()
+ " Problem is only triggered if "starting" is zero, so that the OptionsSet
+ " event will be triggered.
+ " call test_override('starting', 1)
+ augroup QF_Test
+ au!
+ au FileType qf :call assert_fails(':cclose', 'E788')
+ augroup END
+ copen
+ augroup QF_Test
+ au!
+ augroup END
+ augroup! QF_Test
+ " call test_override('starting', 0)
+endfunc
+
+" Check that ":file" without an argument is possible even when "curbuf_lock"
+" is set.
+func Test_file_from_copen()
+ " Works without argument.
+ augroup QF_Test
+ au!
+ au FileType qf file
+ augroup END
+ copen
+
+ augroup QF_Test
+ au!
+ augroup END
+ cclose
+
+ " Fails with argument.
+ augroup QF_Test
+ au!
+ au FileType qf call assert_fails(':file foo', 'E788')
+ augroup END
+ copen
+ augroup QF_Test
+ au!
+ augroup END
+ cclose
+
+ augroup! QF_Test
+endfunction
+
+func Test_resize_from_copen()
+ augroup QF_Test
+ au!
+ au FileType qf resize 5
+ augroup END
+ try
+ " This should succeed without any exception. No other buffers are
+ " involved in the autocmd.
+ copen
+ finally
+ augroup QF_Test
+ au!
+ augroup END
+ augroup! QF_Test
+ endtry
+endfunc
+
+" Tests for the quickfix buffer b:changedtick variable
+func Xchangedtick_tests(cchar)
+ call s:setup_commands(a:cchar)
+
+ new | only
+
+ Xexpr "" | Xexpr "" | Xexpr ""
+
+ Xopen
+ Xolder
+ Xolder
+ Xaddexpr "F1:10:Line10"
+ Xaddexpr "F2:20:Line20"
+ call g:Xsetlist([{"filename":"F3", "lnum":30, "text":"Line30"}], 'a')
+ call g:Xsetlist([], 'f')
+ call assert_equal(8, getbufvar('%', 'changedtick'))
+ Xclose
+endfunc
+
+func Test_changedtick()
+ call Xchangedtick_tests('c')
+ call Xchangedtick_tests('l')
+endfunc
+
+" Tests for parsing an expression using setqflist()
+func Xsetexpr_tests(cchar)
+ call s:setup_commands(a:cchar)
+
+ let t = ["File1:10:Line10", "File1:20:Line20"]
+ call g:Xsetlist([], ' ', {'lines' : t})
+ call g:Xsetlist([], 'a', {'lines' : ["File1:30:Line30"]})
+
+ let l = g:Xgetlist()
+ call assert_equal(3, len(l))
+ call assert_equal(20, l[1].lnum)
+ call assert_equal('Line30', l[2].text)
+ call g:Xsetlist([], 'r', {'lines' : ["File2:5:Line5"]})
+ let l = g:Xgetlist()
+ call assert_equal(1, len(l))
+ call assert_equal('Line5', l[0].text)
+ call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : 10}))
+ call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : "F1:10:L10"}))
+
+ call g:Xsetlist([], 'f')
+ " Add entries to multiple lists
+ call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:10:Line10"]})
+ call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:20:Line20"]})
+ call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:15:Line15"]})
+ call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:25:Line25"]})
+ call assert_equal('Line15', g:Xgetlist({'nr':1, 'items':1}).items[1].text)
+ call assert_equal('Line25', g:Xgetlist({'nr':2, 'items':1}).items[1].text)
+
+ " Adding entries using a custom efm
+ set efm&
+ call g:Xsetlist([], ' ', {'efm' : '%f#%l#%m',
+ \ 'lines' : ["F1#10#L10", "F2#20#L20"]})
+ call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum)
+ call g:Xsetlist([], 'a', {'efm' : '%f#%l#%m', 'lines' : ["F3:30:L30"]})
+ call assert_equal('F3:30:L30', g:Xgetlist({'items':1}).items[2].text)
+ call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum)
+ call assert_equal(-1, g:Xsetlist([], 'a', {'efm' : [],
+ \ 'lines' : ['F1:10:L10']}))
+endfunc
+
+func Test_setexpr()
+ call Xsetexpr_tests('c')
+ call Xsetexpr_tests('l')
+endfunc
+
+" Tests for per quickfix/location list directory stack
+func Xmultidirstack_tests(cchar)
+ call s:setup_commands(a:cchar)
+
+ call g:Xsetlist([], 'f')
+ Xexpr "" | Xexpr ""
+
+ call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["Entering dir 'Xone/a'"]})
+ call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["Entering dir 'Xtwo/a'"]})
+ call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["one.txt:3:one one one"]})
+ call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["two.txt:5:two two two"]})
+
+ let l1 = g:Xgetlist({'nr':1, 'items':1})
+ let l2 = g:Xgetlist({'nr':2, 'items':1})
+ call assert_equal(expand('Xone/a/one.txt'), bufname(l1.items[1].bufnr))
+ call assert_equal(3, l1.items[1].lnum)
+ call assert_equal(expand('Xtwo/a/two.txt'), bufname(l2.items[1].bufnr))
+ call assert_equal(5, l2.items[1].lnum)
+endfunc
+
+func Test_multidirstack()
+ call mkdir('Xone/a', 'p')
+ call mkdir('Xtwo/a', 'p')
+ let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
+ call writefile(lines, 'Xone/a/one.txt')
+ call writefile(lines, 'Xtwo/a/two.txt')
+ let save_efm = &efm
+ set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
+
+ call Xmultidirstack_tests('c')
+ call Xmultidirstack_tests('l')
+
+ let &efm = save_efm
+ call delete('Xone', 'rf')
+ call delete('Xtwo', 'rf')
+endfunc
+
+" Tests for per quickfix/location list file stack
+func Xmultifilestack_tests(cchar)
+ call s:setup_commands(a:cchar)
+
+ call g:Xsetlist([], 'f')
+ Xexpr "" | Xexpr ""
+
+ call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["[one.txt]"]})
+ call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["[two.txt]"]})
+ call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["(3,5) one one one"]})
+ call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["(5,9) two two two"]})
+
+ let l1 = g:Xgetlist({'nr':1, 'items':1})
+ let l2 = g:Xgetlist({'nr':2, 'items':1})
+ call assert_equal('one.txt', bufname(l1.items[1].bufnr))
+ call assert_equal(3, l1.items[1].lnum)
+ call assert_equal('two.txt', bufname(l2.items[1].bufnr))
+ call assert_equal(5, l2.items[1].lnum)
+endfunc
+
+func Test_multifilestack()
+ let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
+ call writefile(lines, 'one.txt')
+ call writefile(lines, 'two.txt')
+ let save_efm = &efm
+ set efm=%+P[%f],(%l\\,%c)\ %m,%-Q
+
+ call Xmultifilestack_tests('c')
+ call Xmultifilestack_tests('l')
+
+ let &efm = save_efm
+ call delete('one.txt')
+ call delete('two.txt')
+endfunc
+
+" Tests for per buffer 'efm' setting
+func Test_perbuf_efm()
+ call writefile(["File1-10-Line10"], 'one.txt')
+ call writefile(["File2#20#Line20"], 'two.txt')
+ set efm=%f#%l#%m
+ new | only
+ new
+ setlocal efm=%f-%l-%m
+ cfile one.txt
+ wincmd w
+ caddfile two.txt
+
+ let l = getqflist()
+ call assert_equal(10, l[0].lnum)
+ call assert_equal('Line20', l[1].text)
+
+ set efm&
+ new | only
+ call delete('one.txt')
+ call delete('two.txt')
+endfunc
+
+" Open multiple help windows using ":lhelpgrep
+" This test used to crash Vim
+func Test_Multi_LL_Help()
+ new | only
+ lhelpgrep window
+ lopen
+ e#
+ lhelpgrep buffer
+ call assert_equal(3, winnr('$'))
+ call assert_true(len(getloclist(1)) != 0)
+ call assert_true(len(getloclist(2)) != 0)
+ new | only
+endfunc
+
+" Tests for adding new quickfix lists using setqflist()
+func XaddQf_tests(cchar)
+ call s:setup_commands(a:cchar)
+
+ " Create a new list using ' ' for action
+ call g:Xsetlist([], 'f')
+ call g:Xsetlist([], ' ', {'title' : 'Test1'})
+ let l = g:Xgetlist({'nr' : '$', 'all' : 1})
+ call assert_equal(1, l.nr)
+ call assert_equal('Test1', l.title)
+
+ " Create a new list using ' ' for action and '$' for 'nr'
+ call g:Xsetlist([], 'f')
+ call g:Xsetlist([], ' ', {'title' : 'Test2', 'nr' : '$'})
+ let l = g:Xgetlist({'nr' : '$', 'all' : 1})
+ call assert_equal(1, l.nr)
+ call assert_equal('Test2', l.title)
+
+ " Create a new list using 'a' for action
+ call g:Xsetlist([], 'f')
+ call g:Xsetlist([], 'a', {'title' : 'Test3'})
+ let l = g:Xgetlist({'nr' : '$', 'all' : 1})
+ call assert_equal(1, l.nr)
+ call assert_equal('Test3', l.title)
+
+ " Create a new list using 'a' for action and '$' for 'nr'
+ call g:Xsetlist([], 'f')
+ call g:Xsetlist([], 'a', {'title' : 'Test3', 'nr' : '$'})
+ call g:Xsetlist([], 'a', {'title' : 'Test4'})
+ let l = g:Xgetlist({'nr' : '$', 'all' : 1})
+ call assert_equal(1, l.nr)
+ call assert_equal('Test4', l.title)
+
+ " Adding a quickfix list should remove all the lists following the current
+ " list.
+ Xexpr "" | Xexpr "" | Xexpr ""
+ silent! 10Xolder
+ call g:Xsetlist([], ' ', {'title' : 'Test5'})
+ let l = g:Xgetlist({'nr' : '$', 'all' : 1})
+ call assert_equal(2, l.nr)
+ call assert_equal('Test5', l.title)
+
+ " Add a quickfix list using '$' as the list number.
+ let lastqf = g:Xgetlist({'nr':'$'}).nr
+ silent! 99Xolder
+ call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test6'})
+ let l = g:Xgetlist({'nr' : '$', 'all' : 1})
+ call assert_equal(lastqf + 1, l.nr)
+ call assert_equal('Test6', l.title)
+
+ " Add a quickfix list using 'nr' set to one more than the quickfix
+ " list size.
+ let lastqf = g:Xgetlist({'nr':'$'}).nr
+ silent! 99Xolder
+ call g:Xsetlist([], ' ', {'nr' : lastqf + 1, 'title' : 'Test7'})
+ let l = g:Xgetlist({'nr' : '$', 'all' : 1})
+ call assert_equal(lastqf + 1, l.nr)
+ call assert_equal('Test7', l.title)
+
+ " Add a quickfix list to a stack with 10 lists using 'nr' set to '$'
+ exe repeat('Xexpr "" |', 9) . 'Xexpr ""'
+ silent! 99Xolder
+ call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test8'})
+ let l = g:Xgetlist({'nr' : '$', 'all' : 1})
+ call assert_equal(10, l.nr)
+ call assert_equal('Test8', l.title)
+
+ " Add a quickfix list using 'nr' set to a value greater than 10
+ call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 12, 'title' : 'Test9'}))
+
+ " Try adding a quickfix list with 'nr' set to a value greater than the
+ " quickfix list size but less than 10.
+ call g:Xsetlist([], 'f')
+ Xexpr "" | Xexpr "" | Xexpr ""
+ silent! 99Xolder
+ call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 8, 'title' : 'Test10'}))
+
+ " Add a quickfix list using 'nr' set to a some string or list
+ call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : [1,2], 'title' : 'Test11'}))
+endfunc
+
+func Test_add_qf()
+ call XaddQf_tests('c')
+ call XaddQf_tests('l')
+endfunc
+
+" Test for getting the quickfix list items from some text without modifying
+" the quickfix stack
+func XgetListFromLines(cchar)
+ call s:setup_commands(a:cchar)
+ call g:Xsetlist([], 'f')
+
+ let l = g:Xgetlist({'lines' : ["File2:20:Line20", "File2:30:Line30"]}).items
+ call assert_equal(2, len(l))
+ call assert_equal(30, l[1].lnum)
+
+ call assert_equal({}, g:Xgetlist({'lines' : 10}))
+ call assert_equal({}, g:Xgetlist({'lines' : 'File1:10:Line10'}))
+ call assert_equal([], g:Xgetlist({'lines' : []}).items)
+ call assert_equal([], g:Xgetlist({'lines' : [10, 20]}).items)
+
+ " Parse text using a custom efm
+ set efm&
+ let l = g:Xgetlist({'lines':['File3#30#Line30'], 'efm' : '%f#%l#%m'}).items
+ call assert_equal('Line30', l[0].text)
+ let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : '%f-%l-%m'}).items
+ call assert_equal('File3:30:Line30', l[0].text)
+ let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : [1,2]})
+ call assert_equal({}, l)
+ call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':'%2'})", 'E376:')
+ call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':''})", 'E378:')
+
+ " Make sure that the quickfix stack is not modified
+ call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
+endfunc
+
+func Test_get_list_from_lines()
+ call XgetListFromLines('c')
+ call XgetListFromLines('l')
+endfunc
+
+" Tests for the quickfix list id
+func Xqfid_tests(cchar)
+ call s:setup_commands(a:cchar)
+
+ call g:Xsetlist([], 'f')
+ call assert_equal({}, g:Xgetlist({'id':0}))
+ Xexpr ''
+ let start_id = g:Xgetlist({'id' : 0}).id
+ Xexpr '' | Xexpr ''
+ Xolder
+ call assert_equal(start_id, g:Xgetlist({'id':0, 'nr':1}).id)
+ call assert_equal(start_id + 1, g:Xgetlist({'id':0, 'nr':0}).id)
+ call assert_equal(start_id + 2, g:Xgetlist({'id':0, 'nr':'$'}).id)
+ call assert_equal({}, g:Xgetlist({'id':0, 'nr':99}))
+ call assert_equal(2, g:Xgetlist({'id':start_id + 1, 'nr':0}).nr)
+ call assert_equal({}, g:Xgetlist({'id':99, 'nr':0}))
+ call assert_equal({}, g:Xgetlist({'id':"abc", 'nr':0}))
+
+ call g:Xsetlist([], 'a', {'id':start_id, 'context':[1,2]})
+ call assert_equal([1,2], g:Xgetlist({'nr':1, 'context':1}).context)
+ call g:Xsetlist([], 'a', {'id':start_id+1, 'lines':['F1:10:L10']})
+ call assert_equal('L10', g:Xgetlist({'nr':2, 'items':1}).items[0].text)
+ call assert_equal(-1, g:Xsetlist([], 'a', {'id':999, 'title':'Vim'}))
+ call assert_equal(-1, g:Xsetlist([], 'a', {'id':'abc', 'title':'Vim'}))
+
+ let qfid = g:Xgetlist({'id':0, 'nr':0})
+ call g:Xsetlist([], 'f')
+ call assert_equal({}, g:Xgetlist({'id':qfid, 'nr':0}))
+endfunc
+
+func Test_qf_id()
+ call Xqfid_tests('c')
+ call Xqfid_tests('l')
+endfunc
+
+" Test for shortening/simplifying the file name when opening the
+" quickfix window or when displaying the quickfix list
+func Test_shorten_fname()
+ if !has('unix')
+ return
+ endif
+ %bwipe
+ " Create a quickfix list with a absolute path filename
+ let fname = getcwd() . '/test_quickfix.vim'
+ call setqflist([], ' ', {'lines':[fname . ":20:Line20"], 'efm':'%f:%l:%m'})
+ call assert_equal(fname, bufname('test_quickfix.vim'))
+ " Opening the quickfix window should simplify the file path
+ cwindow
+ call assert_equal('test_quickfix.vim', bufname('test_quickfix.vim'))
+ cclose
+ %bwipe
+ " Create a quickfix list with a absolute path filename
+ call setqflist([], ' ', {'lines':[fname . ":20:Line20"], 'efm':'%f:%l:%m'})
+ call assert_equal(fname, bufname('test_quickfix.vim'))
+ " Displaying the quickfix list should simplify the file path
+ silent! clist
+ call assert_equal('test_quickfix.vim', bufname('test_quickfix.vim'))
+endfunc
+
+" Test for the position of the quickfix and location list window
+func Test_qfwin_pos()
+ " Open two windows
+ new | only
+ new
+ cexpr ['F1:10:L10']
+ copen
+ " Quickfix window should be the bottom most window
+ call assert_equal(3, winnr())
+ close
+ " Open at the very top
+ wincmd t
+ topleft copen
+ call assert_equal(1, winnr())
+ close
+ " open left of the current window
+ wincmd t
+ below new
+ leftabove copen
+ call assert_equal(2, winnr())
+ close
+ " open right of the current window
+ rightbelow copen
+ call assert_equal(3, winnr())
+ close
+endfunc
diff --git a/src/nvim/testdir/test_quotestar.vim b/src/nvim/testdir/test_quotestar.vim
new file mode 100644
index 0000000000..3ce1a84281
--- /dev/null
+++ b/src/nvim/testdir/test_quotestar.vim
@@ -0,0 +1,157 @@
+" *-register (quotestar) tests
+
+if !has('clipboard')
+ finish
+endif
+
+source shared.vim
+
+func Do_test_quotestar_for_macunix()
+ if empty(exepath('pbcopy')) || empty(exepath('pbpaste'))
+ return 'Test requires pbcopy(1) and pbpaste(1)'
+ endif
+
+ let @* = ''
+
+ " Test #1: Pasteboard to Vim
+ let test_msg = "text from pasteboard to vim via quotestar"
+ " Write a piece of text to the pasteboard.
+ call system('/bin/echo -n "' . test_msg . '" | pbcopy')
+ " See if the *-register is changed as expected.
+ call assert_equal(test_msg, @*)
+
+ " Test #2: Vim to Pasteboard
+ let test_msg = "text from vim to pasteboard via quotestar"
+ " Write a piece of text to the *-register.
+ let @* = test_msg
+ " See if the pasteboard is changed as expected.
+ call assert_equal(test_msg, system('pbpaste'))
+
+ return ''
+endfunc
+
+func Do_test_quotestar_for_x11()
+ if !has('clientserver') || !has('job')
+ return 'Test requires the client-server and job features'
+ endif
+
+ let cmd = GetVimCommand()
+ if cmd == ''
+ return 'GetVimCommand() failed'
+ endif
+ try
+ call remote_send('xxx', '')
+ catch
+ if v:exception =~ 'E240:'
+ " No connection to the X server, give up.
+ return
+ endif
+ " ignore other errors
+ endtry
+
+ let name = 'XVIMCLIPBOARD'
+
+ " Make sure a previous server has exited
+ try
+ call remote_send(name, ":qa!\<CR>")
+ call WaitFor('serverlist() !~ "' . name . '"')
+ catch /E241:/
+ endtry
+ call assert_notmatch(name, serverlist())
+
+ let cmd .= ' --servername ' . name
+ let g:job = job_start(cmd, {'stoponexit': 'kill', 'out_io': 'null'})
+ call WaitFor('job_status(g:job) == "run"')
+ if job_status(g:job) != 'run'
+ call assert_report('Cannot run the Vim server')
+ return ''
+ endif
+
+ " Takes a short while for the server to be active.
+ call WaitFor('serverlist() =~ "' . name . '"')
+
+ " Wait for the server to be up and answering requests. One second is not
+ " always sufficient.
+ call WaitFor('remote_expr("' . name . '", "v:version", "", 2) != ""')
+
+ " Clear the *-register of this vim instance and wait for it to be picked up
+ " by the server.
+ let @* = 'no'
+ call remote_foreground(name)
+ call WaitFor('remote_expr("' . name . '", "@*", "", 1) == "no"', 3000)
+
+ " Set the * register on the server.
+ call remote_send(name, ":let @* = 'yes'\<CR>")
+ call WaitFor('remote_expr("' . name . '", "@*", "", 1) == "yes"', 3000)
+
+ " Check that the *-register of this vim instance is changed as expected.
+ call WaitFor('@* == "yes"', 3000)
+
+ " Handle the large selection over 262040 byte.
+ let length = 262044
+ let sample = 'a' . repeat('b', length - 2) . 'c'
+ let @* = sample
+ call WaitFor('remote_expr("' . name . '", "len(@*) >= ' . length . '", "", 1)', 3000)
+ let res = remote_expr(name, "@*", "", 2)
+ call assert_equal(length, len(res))
+ " Check length to prevent a large amount of output at assertion failure.
+ if length == len(res)
+ call assert_equal(sample, res)
+ endif
+
+ if has('unix') && has('gui') && !has('gui_running')
+ let @* = ''
+
+ " Running in a terminal and the GUI is avaiable: Tell the server to open
+ " the GUI and check that the remote command still works.
+ " Need to wait for the GUI to start up, otherwise the send hangs in trying
+ " to send to the terminal window.
+ if has('gui_athena') || has('gui_motif')
+ " For those GUIs, ignore the 'failed to create input context' error.
+ call remote_send(name, ":call test_ignore_error('E285') | gui -f\<CR>")
+ else
+ call remote_send(name, ":gui -f\<CR>")
+ endif
+ " Wait for the server in the GUI to be up and answering requests.
+ call WaitFor('remote_expr("' . name . '", "has(\"gui_running\")", "", 1) =~ "1"')
+
+ call remote_send(name, ":let @* = 'maybe'\<CR>")
+ call WaitFor('remote_expr("' . name . '", "@*", "", 1) == "maybe"')
+ call assert_equal('maybe', remote_expr(name, "@*", "", 2))
+
+ call assert_equal('maybe', @*)
+ endif
+
+ call remote_send(name, ":qa!\<CR>")
+ call WaitFor('job_status(g:job) == "dead"')
+ if job_status(g:job) != 'dead'
+ call assert_report('Server did not exit')
+ call job_stop(g:job, 'kill')
+ endif
+
+ return ''
+endfunc
+
+func Test_quotestar()
+ let skipped = ''
+
+ let quotestar_saved = @*
+
+ if has('macunix')
+ let skipped = Do_test_quotestar_for_macunix()
+ elseif has('x11')
+ if empty($DISPLAY)
+ let skipped = "Test can only run when $DISPLAY is set."
+ else
+ let skipped = Do_test_quotestar_for_x11()
+ endif
+ else
+ let skipped = "Test is not implemented yet for this platform."
+ endif
+
+ let @* = quotestar_saved
+
+ if !empty(skipped)
+ throw 'Skipped: ' . skipped
+ endif
+endfunc
diff --git a/src/nvim/testdir/test_recover.vim b/src/nvim/testdir/test_recover.vim
new file mode 100644
index 0000000000..beecb4cd0d
--- /dev/null
+++ b/src/nvim/testdir/test_recover.vim
@@ -0,0 +1,58 @@
+" Test :recover
+
+func Test_recover_root_dir()
+ " This used to access invalid memory.
+ split Xtest
+ set dir=/
+ call assert_fails('recover', 'E305:')
+ close!
+ call assert_fails('split Xtest', 'E303:')
+ set dir&
+endfunc
+
+" Inserts 10000 lines with text to fill the swap file with two levels of pointer
+" blocks. Then recovers from the swap file and checks all text is restored.
+"
+" We need about 10000 lines of 100 characters to get two levels of pointer
+" blocks.
+func Test_swap_file()
+ set directory=.
+ set fileformat=unix undolevels=-1
+ edit! Xtest
+ let text = "\tabcdefghijklmnoparstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnoparstuvwxyz0123456789"
+ let i = 1
+ let linecount = 10000
+ while i <= linecount
+ call append(i - 1, i . text)
+ let i += 1
+ endwhile
+ $delete
+ preserve
+ " get the name of the swap file
+ let swname = split(execute("swapname"))[0]
+ let swname = substitute(swname, '[[:blank:][:cntrl:]]*\(.\{-}\)[[:blank:][:cntrl:]]*$', '\1', '')
+ " make a copy of the swap file in Xswap
+ set binary
+ exe 'sp ' . swname
+ w! Xswap
+ set nobinary
+ new
+ only!
+ bwipe! Xtest
+ call rename('Xswap', swname)
+ recover Xtest
+ call delete(swname)
+ let linedollar = line('$')
+ call assert_equal(linecount, linedollar)
+ if linedollar < linecount
+ let linecount = linedollar
+ endif
+ let i = 1
+ while i <= linecount
+ call assert_equal(i . text, getline(i))
+ let i += 1
+ endwhile
+
+ set undolevels&
+ enew! | only
+endfunc
diff --git a/src/nvim/testdir/test_regex_char_classes.vim b/src/nvim/testdir/test_regex_char_classes.vim
new file mode 100644
index 0000000000..2192b5e8fc
--- /dev/null
+++ b/src/nvim/testdir/test_regex_char_classes.vim
@@ -0,0 +1,58 @@
+" Tests for regexp with backslash and other special characters inside []
+" Also test backslash for hex/octal numbered character.
+
+function RunSTest(value, calls, expected)
+ new
+ call feedkeys("i" . a:value, "mx")
+ exec a:calls
+ call assert_equal(a:expected, getline(1), printf("wrong result for %s", a:calls))
+ quit!
+endfunction
+
+function RunXTest(value, search_exp, expected)
+ new
+ call feedkeys("i" . a:value, "mx")
+ call feedkeys("gg" . a:search_exp . "\nx", "mx")
+ call assert_equal(a:expected, getline(1), printf("wrong result for %s", a:search_exp))
+ quit!
+endfunction
+
+
+function Test_x_search()
+ let res = "test text test text"
+ call RunXTest("test \\text test text", "/[\\x]", res)
+ call RunXTest("test \ttext test text", "/[\\t\\]]", res)
+ call RunXTest("test text ]test text", "/[]y]", res)
+ call RunXTest("test ]text test text", "/[\\]]", res)
+ call RunXTest("test text te^st text", "/[y^]", res)
+ call RunXTest("test te$xt test text", "/[$y]", res)
+ call RunXTest("test taext test text", "/[\\x61]", res)
+ call RunXTest("test tbext test text","/[\\x60-\\x64]", res)
+ call RunXTest("test 5text test text","/[\\x785]", res)
+ call RunXTest("testc text test text","/[\\o143]", res)
+ call RunXTest("tesdt text test text","/[\\o140-\\o144]", res)
+ call RunXTest("test7 text test text", "/[\\o417]", res)
+ call RunXTest("test text tBest text", "/\\%x42", res)
+ call RunXTest("test text teCst text", "/\\%o103", res)
+ call RunXTest("test text \<C-V>x00test text", "/[\\x00]", res)
+endfunction
+
+function Test_s_search()
+ let res = "test text test text"
+ call RunSTest("test te\<C-V>x00xt t\<C-V>x04est t\<C-V>x10ext", "s/[\\x00-\\x10]//g", res)
+ call RunSTest("test \\xyztext test text", "s/[\\x-z]\\+//", res)
+ call RunSTest("test text tev\\uyst text", "s/[\\u-z]\\{2,}//", res)
+ call RunSTest("xx aaaaa xx a", "s/\\(a\\)\\+//", "xx xx a")
+ call RunSTest("xx aaaaa xx a", "s/\\(a*\\)\\+//", "xx aaaaa xx a")
+ call RunSTest("xx aaaaa xx a", "s/\\(a*\\)*//", "xx aaaaa xx a")
+ call RunSTest("xx aaaaa xx", "s/\\(a\\)\\{2,3}/A/", "xx Aaa xx")
+ call RunSTest("xx aaaaa xx", "s/\\(a\\)\\{-2,3}/A/", "xx Aaaa xx")
+ call RunSTest("xx aaa12aa xx", "s/\\(a\\)*\\(12\\)\\@>/A/", "xx Aaa xx")
+ call RunSTest("xx foobar xbar xx", "s/\\(foo\\)\\@<!bar/A/", "xx foobar xA xx")
+ call RunSTest("xx an file xx", "s/\\(an\\_s\\+\\)\\@<=file/A/", "xx an A xx")
+ call RunSTest("x= 9;", "s/^\\(\\h\\w*\\%(->\\|\\.\\)\\=\\)\\+=/XX/", "XX 9;")
+ call RunSTest("hh= 77;", "s/^\\(\\h\\w*\\%(->\\|\\.\\)\\=\\)\\+=/YY/", "YY 77;")
+ call RunSTest(" aaa ", "s/aaa/xyz/", " xyz ")
+ call RunSTest(" xyz", "s/~/bcd/", " bcd")
+ call RunSTest(" bcdbcdbcd", "s/~\\+/BB/", " BB")
+endfunction
diff --git a/src/nvim/testdir/test_regexp_latin.vim b/src/nvim/testdir/test_regexp_latin.vim
new file mode 100644
index 0000000000..8528412806
--- /dev/null
+++ b/src/nvim/testdir/test_regexp_latin.vim
@@ -0,0 +1,32 @@
+" Tests for regexp in latin1 encoding
+set encoding=latin1
+scriptencoding latin1
+
+func s:equivalence_test()
+ let str = "Aภมยรฤล B C D Eศษสห F G H Iฬอฮฯ J K L M Nั Oาำิีึุ P Q R S T Uฺู V W X Y Z aเแโใไๅ b c d e่้๊๋ f g h i์ํ๎๏ j k l m n๑ o๒๓๔๕๖๘ p q r s t u๙๚๛ v w x y z"
+ let groups = split(str)
+ for group1 in groups
+ for c in split(group1, '\zs')
+ " next statement confirms that equivalence class matches every
+ " character in group
+ call assert_match('^[[=' . c . '=]]*$', group1)
+ for group2 in groups
+ if group2 != group1
+ " next statement converts that equivalence class doesn't match
+ " a character in any other group
+ call assert_equal(-1, match(group2, '[[=' . c . '=]]'))
+ endif
+ endfor
+ endfor
+ endfor
+endfunc
+
+func Test_equivalence_re1()
+ set re=1
+ call s:equivalence_test()
+endfunc
+
+func Test_equivalence_re2()
+ set re=2
+ call s:equivalence_test()
+endfunc
diff --git a/src/nvim/testdir/test_regexp_utf8.vim b/src/nvim/testdir/test_regexp_utf8.vim
new file mode 100644
index 0000000000..97638e9aac
--- /dev/null
+++ b/src/nvim/testdir/test_regexp_utf8.vim
@@ -0,0 +1,185 @@
+" Tests for regexp in utf8 encoding
+
+func s:equivalence_test()
+ let str = "Aร€รร‚รƒร„ร…ฤ€ฤ‚ฤ„ววžว แบข Bแธ‚แธ† Cร‡ฤ†ฤˆฤŠฤŒ DฤŽฤแธŠแธŽแธ Eรˆร‰รŠร‹ฤ’ฤ”ฤ–ฤ˜ฤšแบบแบผ Fแธž Gฤœฤžฤ ฤขวควฆวดแธ  Hฤคฤฆแธขแธฆแธจ IรŒรรŽรฤจฤชฤฌฤฎฤฐวแปˆ Jฤด Kฤถวจแธฐแธด Lฤนฤปฤฝฤฟลแธบ Mแธพแน€ Nร‘ลƒล…ล‡แน„แนˆ Oร’ร“ร”ร•ร–ร˜ลŒลŽลฦ ว‘วชวฌแปŽ Pแน”แน– Q Rล”ล–ล˜แน˜แนž Sลšลœลžล แน  Tลขลคลฆแนชแนฎ Uร™รšร›รœลจลชลฌลฎลฐลฒฦฏว“แปฆ Vแนผ Wลดแบ€แบ‚แบ„แบ† XแบŠแบŒ YรลถลธแบŽแปฒแปถแปธ Zลนลปลฝฦตแบแบ” aร รกรขรฃรครฅฤฤƒฤ…วŽวŸวกแบฃ bแธƒแธ‡ cรงฤ‡ฤ‰ฤ‹ฤ dฤฤ‘แธ‹แธแธ‘ eรจรฉรชรซฤ“ฤ•ฤ—ฤ™ฤ›แบปแบฝ fแธŸ gฤฤŸฤกฤฃวฅวงวตแธก hฤฅฤงแธฃแธงแธฉแบ– iรฌรญรฎรฏฤฉฤซฤญฤฏวแป‰ jฤตวฐ kฤทวฉแธฑแธต lฤบฤผฤพล€ล‚แธป mแธฟแน nรฑล„ล†ลˆล‰แน…แน‰ oรฒรณรดรตรถรธลลล‘ฦกว’วซวญแป pแน•แน— q rล•ล—ล™แน™แนŸ sล›ลลŸลกแนก tลฃลฅลงแนซแนฏแบ— uรนรบรปรผลฉลซลญลฏลฑลณฦฐว”แปง vแนฝ wลตแบแบƒแบ…แบ‡แบ˜ xแบ‹แบ yรฝรฟลทแบแบ™แปณแปทแปน zลบลผลพฦถแบ‘แบ•"
+ let groups = split(str)
+ for group1 in groups
+ for c in split(group1, '\zs')
+ " next statement confirms that equivalence class matches every
+ " character in group
+ call assert_match('^[[=' . c . '=]]*$', group1)
+ for group2 in groups
+ if group2 != group1
+ " next statement converts that equivalence class doesn't match
+ " character in any other group
+ call assert_equal(-1, match(group2, '[[=' . c . '=]]'))
+ endif
+ endfor
+ endfor
+ endfor
+endfunc
+
+func Test_equivalence_re1()
+ set re=1
+ call s:equivalence_test()
+ set re=0
+endfunc
+
+func Test_equivalence_re2()
+ set re=2
+ call s:equivalence_test()
+ set re=0
+endfunc
+
+func s:classes_test()
+ set isprint=@,161-255
+ call assert_equal('Motรถrhead', matchstr('Motรถrhead', '[[:print:]]\+'))
+
+ let alnumchars = ''
+ let alphachars = ''
+ let backspacechar = ''
+ let blankchars = ''
+ let cntrlchars = ''
+ let digitchars = ''
+ let escapechar = ''
+ let graphchars = ''
+ let lowerchars = ''
+ let printchars = ''
+ let punctchars = ''
+ let returnchar = ''
+ let spacechars = ''
+ let tabchar = ''
+ let upperchars = ''
+ let xdigitchars = ''
+ let i = 1
+ while i <= 255
+ let c = nr2char(i)
+ if c =~ '[[:alpha:]]'
+ let alphachars .= c
+ endif
+ if c =~ '[[:alnum:]]'
+ let alnumchars .= c
+ endif
+ if c =~ '[[:backspace:]]'
+ let backspacechar .= c
+ endif
+ if c =~ '[[:blank:]]'
+ let blankchars .= c
+ endif
+ if c =~ '[[:cntrl:]]'
+ let cntrlchars .= c
+ endif
+ if c =~ '[[:digit:]]'
+ let digitchars .= c
+ endif
+ if c =~ '[[:escape:]]'
+ let escapechar .= c
+ endif
+ if c =~ '[[:graph:]]'
+ let graphchars .= c
+ endif
+ if c =~ '[[:lower:]]'
+ let lowerchars .= c
+ endif
+ if c =~ '[[:print:]]'
+ let printchars .= c
+ endif
+ if c =~ '[[:punct:]]'
+ let punctchars .= c
+ endif
+ if c =~ '[[:return:]]'
+ let returnchar .= c
+ endif
+ if c =~ '[[:space:]]'
+ let spacechars .= c
+ endif
+ if c =~ '[[:tab:]]'
+ let tabchar .= c
+ endif
+ if c =~ '[[:upper:]]'
+ let upperchars .= c
+ endif
+ if c =~ '[[:xdigit:]]'
+ let xdigitchars .= c
+ endif
+ let i += 1
+ endwhile
+
+ call assert_equal('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', alphachars)
+ call assert_equal('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', alnumchars)
+ call assert_equal("\b", backspacechar)
+ call assert_equal("\t ", blankchars)
+ call assert_equal("\x01\x02\x03\x04\x05\x06\x07\b\t\n\x0b\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\e\x1c\x1d\x1e\x1f\x7f", cntrlchars)
+ call assert_equal("0123456789", digitchars)
+ call assert_equal("\<Esc>", escapechar)
+ call assert_equal('!"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~', graphchars)
+ call assert_equal('abcdefghijklmnopqrstuvwxyzยตรŸร รกรขรฃรครฅรฆรงรจรฉรชรซรฌรญรฎรฏรฐรฑรฒรณรดรตรถรธรนรบรปรผรฝรพรฟ', lowerchars)
+ call assert_equal(' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ย ยกยขยฃยคยฅยฆยงยจยฉยชยซยฌยญยฎยฏยฐยฑยฒยณยดยตยถยทยธยนยบยปยผยฝยพยฟร€รร‚รƒร„ร…ร†ร‡รˆร‰รŠร‹รŒรรŽรรร‘ร’ร“ร”ร•ร–ร—ร˜ร™รšร›รœรรžรŸร รกรขรฃรครฅรฆรงรจรฉรชรซรฌรญรฎรฏรฐรฑรฒรณรดรตรถรทรธรนรบรปรผรฝรพรฟ', printchars)
+ call assert_equal('!"#$%&''()*+,-./:;<=>?@[\]^_`{|}~', punctchars)
+ call assert_equal('ABCDEFGHIJKLMNOPQRSTUVWXYZร€รร‚รƒร„ร…ร†ร‡รˆร‰รŠร‹รŒรรŽรรร‘ร’ร“ร”ร•ร–ร˜ร™รšร›รœรรž', upperchars)
+ call assert_equal("\r", returnchar)
+ call assert_equal("\t\n\x0b\f\r ", spacechars)
+ call assert_equal("\t", tabchar)
+ call assert_equal('0123456789ABCDEFabcdef', xdigitchars)
+endfunc
+
+func Test_classes_re1()
+ set re=1
+ call s:classes_test()
+ set re=0
+endfunc
+
+func Test_classes_re2()
+ set re=2
+ call s:classes_test()
+ set re=0
+endfunc
+
+func Test_recursive_substitute()
+ new
+ s/^/\=execute("s#^##gn")
+ " check we are now not in the sandbox
+ call setwinvar(1, 'myvar', 1)
+ bwipe!
+endfunc
+
+func Test_nested_backrefs()
+ " Check example in change.txt.
+ new
+ for re in range(0, 2)
+ exe 'set re=' . re
+ call setline(1, 'aa ab x')
+ 1s/\(\(a[a-d] \)*\)\(x\)/-\1- -\2- -\3-/
+ call assert_equal('-aa ab - -ab - -x-', getline(1))
+
+ call assert_equal('-aa ab - -ab - -x-', substitute('aa ab x', '\(\(a[a-d] \)*\)\(x\)', '-\1- -\2- -\3-', ''))
+ endfor
+ bwipe!
+ set re=0
+endfunc
+
+func Test_eow_with_optional()
+ let expected = ['abc def', 'abc', 'def', '', '', '', '', '', '', '']
+ for re in range(0, 2)
+ exe 'set re=' . re
+ let actual = matchlist('abc def', '\(abc\>\)\?\s*\(def\)')
+ call assert_equal(expected, actual)
+ endfor
+endfunc
+
+func Test_reversed_range()
+ for re in range(0, 2)
+ exe 'set re=' . re
+ call assert_fails('call match("abc def", "[c-a]")', 'E944:')
+ endfor
+ set re=0
+endfunc
+
+func Test_large_class()
+ set re=1
+ call assert_fails('call match("abc def", "[\u3000-\u4000]")', 'E945:')
+ set re=2
+ call assert_equal(0, 'abc def' =~# '[\u3000-\u4000]')
+ call assert_equal(1, "\u3042" =~# '[\u3000-\u4000]')
+ set re=0
+endfunc
diff --git a/src/nvim/testdir/test_registers.vim b/src/nvim/testdir/test_registers.vim
new file mode 100644
index 0000000000..d7b6de5652
--- /dev/null
+++ b/src/nvim/testdir/test_registers.vim
@@ -0,0 +1,65 @@
+
+func Test_yank_shows_register()
+ enew
+ set report=0
+ call setline(1, ['foo', 'bar'])
+ " Line-wise
+ exe 'norm! yy'
+ call assert_equal('1 line yanked', v:statusmsg)
+ exe 'norm! "zyy'
+ call assert_equal('1 line yanked into "z', v:statusmsg)
+ exe 'norm! yj'
+ call assert_equal('2 lines yanked', v:statusmsg)
+ exe 'norm! "zyj'
+ call assert_equal('2 lines yanked into "z', v:statusmsg)
+
+ " Block-wise
+ exe "norm! \<C-V>y"
+ call assert_equal('block of 1 line yanked', v:statusmsg)
+ exe "norm! \<C-V>\"zy"
+ call assert_equal('block of 1 line yanked into "z', v:statusmsg)
+ exe "norm! \<C-V>jy"
+ call assert_equal('block of 2 lines yanked', v:statusmsg)
+ exe "norm! \<C-V>j\"zy"
+ call assert_equal('block of 2 lines yanked into "z', v:statusmsg)
+
+ bwipe!
+endfunc
+
+func Test_display_registers()
+ e file1
+ e file2
+ call setline(1, ['foo', 'bar'])
+ /bar
+ exe 'norm! y2l"axx'
+ call feedkeys("i\<C-R>=2*4\n\<esc>")
+ call feedkeys(":ls\n", 'xt')
+
+ let a = execute('display')
+ let b = execute('registers')
+
+ call assert_equal(a, b)
+ call assert_match('^\n--- Registers ---\n'
+ \ . '"" a\n'
+ \ . '"0 ba\n'
+ \ . '"1 b\n'
+ \ . '"a b\n'
+ \ . '.*'
+ \ . '"- a\n'
+ \ . '.*'
+ \ . '": ls\n'
+ \ . '"% file2\n'
+ \ . '"# file1\n'
+ \ . '"/ bar\n'
+ \ . '"= 2\*4', a)
+
+ let a = execute('registers a')
+ call assert_match('^\n--- Registers ---\n'
+ \ . '"a b', a)
+
+ let a = execute('registers :')
+ call assert_match('^\n--- Registers ---\n'
+ \ . '": ls', a)
+
+ bwipe!
+endfunc
diff --git a/src/nvim/testdir/test_retab.vim b/src/nvim/testdir/test_retab.vim
new file mode 100644
index 0000000000..f11a32bade
--- /dev/null
+++ b/src/nvim/testdir/test_retab.vim
@@ -0,0 +1,77 @@
+" Test :retab
+func SetUp()
+ new
+ call setline(1, "\ta \t b c ")
+endfunc
+
+func TearDown()
+ bwipe!
+endfunc
+
+func Retab(bang, n)
+ let l:old_tabstop = &tabstop
+ let l:old_line = getline(1)
+ exe "retab" . a:bang . a:n
+ let l:line = getline(1)
+ call setline(1, l:old_line)
+ if a:n > 0
+ " :retab changes 'tabstop' to n with argument n > 0.
+ call assert_equal(a:n, &tabstop)
+ exe 'set tabstop=' . l:old_tabstop
+ else
+ " :retab does not change 'tabstop' with empty or n <= 0.
+ call assert_equal(l:old_tabstop, &tabstop)
+ endif
+ return l:line
+endfunc
+
+func Test_retab()
+ set tabstop=8 noexpandtab
+ call assert_equal("\ta\t b c ", Retab('', ''))
+ call assert_equal("\ta\t b c ", Retab('', 0))
+ call assert_equal("\ta\t b c ", Retab('', 8))
+ call assert_equal("\ta\t b\t c\t ", Retab('!', ''))
+ call assert_equal("\ta\t b\t c\t ", Retab('!', 0))
+ call assert_equal("\ta\t b\t c\t ", Retab('!', 8))
+
+ call assert_equal("\t\ta\t\t\tb c ", Retab('', 4))
+ call assert_equal("\t\ta\t\t\tb\t\t c\t ", Retab('!', 4))
+
+ call assert_equal(" a\t\tb c ", Retab('', 10))
+ call assert_equal(" a\t\tb c ", Retab('!', 10))
+
+ set tabstop=8 expandtab
+ call assert_equal(" a b c ", Retab('', ''))
+ call assert_equal(" a b c ", Retab('', 0))
+ call assert_equal(" a b c ", Retab('', 8))
+ call assert_equal(" a b c ", Retab('!', ''))
+ call assert_equal(" a b c ", Retab('!', 0))
+ call assert_equal(" a b c ", Retab('!', 8))
+
+ call assert_equal(" a b c ", Retab(' ', 4))
+ call assert_equal(" a b c ", Retab('!', 4))
+
+ call assert_equal(" a b c ", Retab(' ', 10))
+ call assert_equal(" a b c ", Retab('!', 10))
+
+ set tabstop=4 noexpandtab
+ call assert_equal("\ta\t\tb c ", Retab('', ''))
+ call assert_equal("\ta\t\tb\t\t c\t ", Retab('!', ''))
+ call assert_equal("\t a\t\t\tb c ", Retab('', 3))
+ call assert_equal("\t a\t\t\tb\t\t\tc\t ", Retab('!', 3))
+ call assert_equal(" a\t b c ", Retab('', 5))
+ call assert_equal(" a\t b\t\t c\t ", Retab('!', 5))
+
+ set tabstop=4 expandtab
+ call assert_equal(" a b c ", Retab('', ''))
+ call assert_equal(" a b c ", Retab('!', ''))
+ call assert_equal(" a b c ", Retab('', 3))
+ call assert_equal(" a b c ", Retab('!', 3))
+ call assert_equal(" a b c ", Retab('', 5))
+ call assert_equal(" a b c ", Retab('!', 5))
+endfunc
+
+func Test_retab_error()
+ call assert_fails('retab -1', 'E487:')
+ call assert_fails('retab! -1', 'E487:')
+endfunc
diff --git a/src/nvim/testdir/test_scriptnames.vim b/src/nvim/testdir/test_scriptnames.vim
new file mode 100644
index 0000000000..fc6c910bfa
--- /dev/null
+++ b/src/nvim/testdir/test_scriptnames.vim
@@ -0,0 +1,26 @@
+" Test for :scriptnames
+
+func Test_scriptnames()
+ call writefile(['let did_load_script = 123'], 'Xscripting')
+ source Xscripting
+ call assert_equal(123, g:did_load_script)
+
+ let scripts = split(execute('scriptnames'), "\n")
+ let last = scripts[-1]
+ call assert_match('\<Xscripting\>', last)
+ let lastnr = substitute(last, '\D*\(\d\+\):.*', '\1', '')
+ exe 'script ' . lastnr
+ call assert_equal('Xscripting', expand('%:t'))
+
+ call assert_fails('script ' . (lastnr + 1), 'E474:')
+ call assert_fails('script 0', 'E939:')
+
+ new
+ call setline(1, 'nothing')
+ call assert_fails('script ' . lastnr, 'E37:')
+ exe 'script! ' . lastnr
+ call assert_equal('Xscripting', expand('%:t'))
+
+ bwipe
+ call delete('Xscripting')
+endfunc
diff --git a/src/nvim/testdir/test_scroll_opt.vim b/src/nvim/testdir/test_scroll_opt.vim
new file mode 100644
index 0000000000..77920eb8b0
--- /dev/null
+++ b/src/nvim/testdir/test_scroll_opt.vim
@@ -0,0 +1,36 @@
+" Test for reset 'scroll'
+"
+
+func Test_reset_scroll()
+ let scr = &l:scroll
+
+ setlocal scroll=1
+ setlocal scroll&
+ call assert_equal(scr, &l:scroll)
+
+ setlocal scroll=1
+ setlocal scroll=0
+ call assert_equal(scr, &l:scroll)
+
+ try
+ execute 'setlocal scroll=' . (winheight(0) + 1)
+ " not reached
+ call assert_false(1)
+ catch
+ call assert_exception('E49:')
+ endtry
+
+ split
+
+ let scr = &l:scroll
+
+ setlocal scroll=1
+ setlocal scroll&
+ call assert_equal(scr, &l:scroll)
+
+ setlocal scroll=1
+ setlocal scroll=0
+ call assert_equal(scr, &l:scroll)
+
+ quit!
+endfunc
diff --git a/src/nvim/testdir/test_scrollbind.vim b/src/nvim/testdir/test_scrollbind.vim
new file mode 100644
index 0000000000..baa24f1979
--- /dev/null
+++ b/src/nvim/testdir/test_scrollbind.vim
@@ -0,0 +1,32 @@
+" Test for 'scrollbind' causing an unexpected scroll of one of the windows.
+func Test_scrollbind()
+ " We don't want the status line to cause problems:
+ set laststatus=0
+ let totalLines = &lines * 20
+ let middle = totalLines / 2
+ new | only
+ for i in range(1, totalLines)
+ call setline(i, 'LINE ' . i)
+ endfor
+ exe string(middle)
+ normal zt
+ normal M
+ aboveleft vert new
+ for i in range(1, totalLines)
+ call setline(i, 'line ' . i)
+ endfor
+ exe string(middle)
+ normal zt
+ normal M
+ " Execute the following two commands at once to reproduce the problem.
+ setl scb | wincmd p
+ setl scb
+ wincmd w
+ let topLineLeft = line('w0')
+ wincmd p
+ let topLineRight = line('w0')
+ setl noscrollbind
+ wincmd p
+ setl noscrollbind
+ call assert_equal(0, topLineLeft - topLineRight)
+endfunc
diff --git a/src/nvim/testdir/test_search.vim b/src/nvim/testdir/test_search.vim
new file mode 100644
index 0000000000..ecd840d40c
--- /dev/null
+++ b/src/nvim/testdir/test_search.vim
@@ -0,0 +1,491 @@
+" Test for the search command
+
+func Test_search_cmdline()
+ " See test/functional/legacy/search_spec.lua
+ throw 'skipped: Nvim does not support test_override()'
+ if !exists('+incsearch')
+ return
+ endif
+ " need to disable char_avail,
+ " so that expansion of commandline works
+ call test_override("char_avail", 1)
+ new
+ call setline(1, [' 1', ' 2 these', ' 3 the', ' 4 their', ' 5 there', ' 6 their', ' 7 the', ' 8 them', ' 9 these', ' 10 foobar'])
+ " Test 1
+ " CTRL-N / CTRL-P skips through the previous search history
+ set noincsearch
+ :1
+ call feedkeys("/foobar\<cr>", 'tx')
+ call feedkeys("/the\<cr>",'tx')
+ call assert_equal('the', @/)
+ call feedkeys("/thes\<C-P>\<C-P>\<cr>",'tx')
+ call assert_equal('foobar', @/)
+
+ " Test 2
+ " Ctrl-G goes from one match to the next
+ " until the end of the buffer
+ set incsearch nowrapscan
+ :1
+ " first match
+ call feedkeys("/the\<cr>", 'tx')
+ call assert_equal(' 2 these', getline('.'))
+ :1
+ " second match
+ call feedkeys("/the\<C-G>\<cr>", 'tx')
+ call assert_equal(' 3 the', getline('.'))
+ call assert_equal([0, 0, 0, 0], getpos('"'))
+ :1
+ " third match
+ call feedkeys("/the".repeat("\<C-G>", 2)."\<cr>", 'tx')
+ call assert_equal(' 4 their', getline('.'))
+ :1
+ " fourth match
+ call feedkeys("/the".repeat("\<C-G>", 3)."\<cr>", 'tx')
+ call assert_equal(' 5 there', getline('.'))
+ :1
+ " fifth match
+ call feedkeys("/the".repeat("\<C-G>", 4)."\<cr>", 'tx')
+ call assert_equal(' 6 their', getline('.'))
+ :1
+ " sixth match
+ call feedkeys("/the".repeat("\<C-G>", 5)."\<cr>", 'tx')
+ call assert_equal(' 7 the', getline('.'))
+ :1
+ " seventh match
+ call feedkeys("/the".repeat("\<C-G>", 6)."\<cr>", 'tx')
+ call assert_equal(' 8 them', getline('.'))
+ :1
+ " eigth match
+ call feedkeys("/the".repeat("\<C-G>", 7)."\<cr>", 'tx')
+ call assert_equal(' 9 these', getline('.'))
+ :1
+ " no further match
+ call feedkeys("/the".repeat("\<C-G>", 8)."\<cr>", 'tx')
+ call assert_equal(' 9 these', getline('.'))
+ call assert_equal([0, 0, 0, 0], getpos('"'))
+
+ " Test 3
+ " Ctrl-G goes from one match to the next
+ " and continues back at the top
+ set incsearch wrapscan
+ :1
+ " first match
+ call feedkeys("/the\<cr>", 'tx')
+ call assert_equal(' 2 these', getline('.'))
+ :1
+ " second match
+ call feedkeys("/the\<C-G>\<cr>", 'tx')
+ call assert_equal(' 3 the', getline('.'))
+ :1
+ " third match
+ call feedkeys("/the".repeat("\<C-G>", 2)."\<cr>", 'tx')
+ call assert_equal(' 4 their', getline('.'))
+ :1
+ " fourth match
+ call feedkeys("/the".repeat("\<C-G>", 3)."\<cr>", 'tx')
+ call assert_equal(' 5 there', getline('.'))
+ :1
+ " fifth match
+ call feedkeys("/the".repeat("\<C-G>", 4)."\<cr>", 'tx')
+ call assert_equal(' 6 their', getline('.'))
+ :1
+ " sixth match
+ call feedkeys("/the".repeat("\<C-G>", 5)."\<cr>", 'tx')
+ call assert_equal(' 7 the', getline('.'))
+ :1
+ " seventh match
+ call feedkeys("/the".repeat("\<C-G>", 6)."\<cr>", 'tx')
+ call assert_equal(' 8 them', getline('.'))
+ :1
+ " eigth match
+ call feedkeys("/the".repeat("\<C-G>", 7)."\<cr>", 'tx')
+ call assert_equal(' 9 these', getline('.'))
+ :1
+ " back at first match
+ call feedkeys("/the".repeat("\<C-G>", 8)."\<cr>", 'tx')
+ call assert_equal(' 2 these', getline('.'))
+
+ " Test 4
+ " CTRL-T goes to the previous match
+ set incsearch nowrapscan
+ $
+ " first match
+ call feedkeys("?the\<cr>", 'tx')
+ call assert_equal(' 9 these', getline('.'))
+ $
+ " first match
+ call feedkeys("?the\<C-G>\<cr>", 'tx')
+ call assert_equal(' 9 these', getline('.'))
+ $
+ " second match
+ call feedkeys("?the".repeat("\<C-T>", 1)."\<cr>", 'tx')
+ call assert_equal(' 8 them', getline('.'))
+ $
+ " last match
+ call feedkeys("?the".repeat("\<C-T>", 7)."\<cr>", 'tx')
+ call assert_equal(' 2 these', getline('.'))
+ $
+ " last match
+ call feedkeys("?the".repeat("\<C-T>", 8)."\<cr>", 'tx')
+ call assert_equal(' 2 these', getline('.'))
+
+ " Test 5
+ " CTRL-T goes to the previous match
+ set incsearch wrapscan
+ $
+ " first match
+ call feedkeys("?the\<cr>", 'tx')
+ call assert_equal(' 9 these', getline('.'))
+ $
+ " first match at the top
+ call feedkeys("?the\<C-G>\<cr>", 'tx')
+ call assert_equal(' 2 these', getline('.'))
+ $
+ " second match
+ call feedkeys("?the".repeat("\<C-T>", 1)."\<cr>", 'tx')
+ call assert_equal(' 8 them', getline('.'))
+ $
+ " last match
+ call feedkeys("?the".repeat("\<C-T>", 7)."\<cr>", 'tx')
+ call assert_equal(' 2 these', getline('.'))
+ $
+ " back at the bottom of the buffer
+ call feedkeys("?the".repeat("\<C-T>", 8)."\<cr>", 'tx')
+ call assert_equal(' 9 these', getline('.'))
+
+ " Test 6
+ " CTRL-L adds to the search pattern
+ set incsearch wrapscan
+ 1
+ " first match
+ call feedkeys("/the\<c-l>\<cr>", 'tx')
+ call assert_equal(' 2 these', getline('.'))
+ 1
+ " go to next match of 'thes'
+ call feedkeys("/the\<c-l>\<C-G>\<cr>", 'tx')
+ call assert_equal(' 9 these', getline('.'))
+ 1
+ " wrap around
+ call feedkeys("/the\<c-l>\<C-G>\<C-G>\<cr>", 'tx')
+ call assert_equal(' 2 these', getline('.'))
+ 1
+ " wrap around
+ set nowrapscan
+ call feedkeys("/the\<c-l>\<C-G>\<C-G>\<cr>", 'tx')
+ call assert_equal(' 9 these', getline('.'))
+
+ " Test 7
+ " <bs> remove from match, but stay at current match
+ set incsearch wrapscan
+ 1
+ " first match
+ call feedkeys("/thei\<cr>", 'tx')
+ call assert_equal(' 4 their', getline('.'))
+ 1
+ " delete one char, add another
+ call feedkeys("/thei\<bs>s\<cr>", 'tx')
+ call assert_equal(' 2 these', getline('.'))
+ 1
+ " delete one char, add another, go to previous match, add one char
+ call feedkeys("/thei\<bs>s\<bs>\<C-T>\<c-l>\<cr>", 'tx')
+ call assert_equal(' 9 these', getline('.'))
+ 1
+ " delete all chars, start from the beginning again
+ call feedkeys("/them". repeat("\<bs>",4).'the\>'."\<cr>", 'tx')
+ call assert_equal(' 3 the', getline('.'))
+
+ " clean up
+ call test_override("char_avail", 0)
+ bw!
+endfunc
+
+func Test_search_cmdline2()
+ " See test/functional/legacy/search_spec.lua
+ throw 'skipped: Nvim does not support test_override()'
+ if !exists('+incsearch')
+ return
+ endif
+ " need to disable char_avail,
+ " so that expansion of commandline works
+ call test_override("char_avail", 1)
+ new
+ call setline(1, [' 1', ' 2 these', ' 3 the theother'])
+ " Test 1
+ " Ctrl-T goes correctly back and forth
+ set incsearch
+ 1
+ " first match
+ call feedkeys("/the\<cr>", 'tx')
+ call assert_equal(' 2 these', getline('.'))
+ 1
+ " go to next match (on next line)
+ call feedkeys("/the\<C-G>\<cr>", 'tx')
+ call assert_equal(' 3 the theother', getline('.'))
+ 1
+ " go to next match (still on line 3)
+ call feedkeys("/the\<C-G>\<C-G>\<cr>", 'tx')
+ call assert_equal(' 3 the theother', getline('.'))
+ 1
+ " go to next match (still on line 3)
+ call feedkeys("/the\<C-G>\<C-G>\<C-G>\<cr>", 'tx')
+ call assert_equal(' 3 the theother', getline('.'))
+ 1
+ " go to previous match (on line 3)
+ call feedkeys("/the\<C-G>\<C-G>\<C-G>\<C-T>\<cr>", 'tx')
+ call assert_equal(' 3 the theother', getline('.'))
+ 1
+ " go to previous match (on line 3)
+ call feedkeys("/the\<C-G>\<C-G>\<C-G>\<C-T>\<C-T>\<cr>", 'tx')
+ call assert_equal(' 3 the theother', getline('.'))
+ 1
+ " 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('.'))
+
+ " Test 2: keep the view,
+ " after deleting a character from the search cmd
+ call setline(1, [' 1', ' 2 these', ' 3 the', ' 4 their', ' 5 there', ' 6 their', ' 7 the', ' 8 them', ' 9 these', ' 10 foobar'])
+ resize 5
+ 1
+ call feedkeys("/foo\<bs>\<cr>", 'tx')
+ redraw
+ 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)
+ call histdel('/')
+ endfor
+
+ " Test 3: reset the view,
+ " after deleting all characters from the search cmd
+ norm! 1gg0
+ " unfortunately, neither "/foo\<c-w>\<cr>", nor "/foo\<bs>\<bs>\<bs>\<cr>",
+ " nor "/foo\<c-u>\<cr>" works to delete the commandline.
+ " In that case Vim should return "E35 no previous regular expression",
+ " but it looks like Vim still sees /foo and therefore the test fails.
+ " Therefore, disableing this test
+ "call assert_fails(feedkeys("/foo\<c-w>\<cr>", 'tx'), 'E35')
+ "call assert_equal({'lnum': 1, 'leftcol': 0, 'col': 0, 'topfill': 0, 'topline': 1, 'coladd': 0, 'skipcol': 0, 'curswant': 0}, winsaveview())
+
+ " clean up
+ set noincsearch
+ call test_override("char_avail", 0)
+ bw!
+endfunc
+
+func Test_use_sub_pat()
+ split
+ let @/ = ''
+ func X()
+ s/^/a/
+ /
+ endfunc
+ call X()
+ bwipe!
+endfunc
+
+func Test_searchpair()
+ new
+ call setline(1, ['other code here', '', '[', '" cursor here', ']'])
+ 4
+ let a=searchpair('\[','',']','bW')
+ call assert_equal(3, a)
+ set nomagic
+ 4
+ let a=searchpair('\[','',']','bW')
+ call assert_equal(3, a)
+ set magic
+ q!
+endfunc
+
+func Test_searchc()
+ " These commands used to cause memory overflow in searchc().
+ new
+ norm ixx
+ exe "norm 0t\u93cf"
+ bw!
+endfunc
+
+func Test_search_cmdline3()
+ throw 'skipped: Nvim does not support test_override()'
+ if !exists('+incsearch')
+ return
+ endif
+ " need to disable char_avail,
+ " so that expansion of commandline works
+ call test_override("char_avail", 1)
+ new
+ call setline(1, [' 1', ' 2 the~e', ' 3 the theother'])
+ set incsearch
+ 1
+ " first match
+ call feedkeys("/the\<c-l>\<cr>", 'tx')
+ call assert_equal(' 2 the~e', getline('.'))
+ " clean up
+ set noincsearch
+ call test_override("char_avail", 0)
+ bw!
+endfunc
+
+func Test_search_cmdline4()
+ " See test/functional/legacy/search_spec.lua
+ throw 'skipped: Nvim does not support test_override()'
+ if !exists('+incsearch')
+ return
+ endif
+ " need to disable char_avail,
+ " so that expansion of commandline works
+ call test_override("char_avail", 1)
+ new
+ call setline(1, [' 1 the first', ' 2 the second', ' 3 the third'])
+ set incsearch
+ $
+ call feedkeys("?the\<c-g>\<cr>", 'tx')
+ call assert_equal(' 3 the third', getline('.'))
+ $
+ call feedkeys("?the\<c-g>\<c-g>\<cr>", 'tx')
+ call assert_equal(' 1 the first', getline('.'))
+ $
+ call feedkeys("?the\<c-g>\<c-g>\<c-g>\<cr>", 'tx')
+ call assert_equal(' 2 the second', getline('.'))
+ $
+ call feedkeys("?the\<c-t>\<cr>", 'tx')
+ call assert_equal(' 1 the first', getline('.'))
+ $
+ call feedkeys("?the\<c-t>\<c-t>\<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('.'))
+ " clean up
+ set noincsearch
+ call test_override("char_avail", 0)
+ bw!
+endfunc
+
+func Test_search_cmdline5()
+ if !exists('+incsearch')
+ return
+ endif
+ " 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'])
+ 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('.'))
+ " clean up
+ set noincsearch
+ bw!
+endfunc
+
+" Tests for regexp with various magic settings
+func Test_search_regexp()
+ enew!
+
+ put ='1 a aa abb abbccc'
+ exe 'normal! /a*b\{2}c\+/e' . "\<CR>"
+ call assert_equal([0, 2, 17, 0], getpos('.'))
+
+ put ='2 d dd dee deefff'
+ exe 'normal! /\Md\*e\{2}f\+/e' . "\<CR>"
+ call assert_equal([0, 3, 17, 0], getpos('.'))
+
+ set nomagic
+ put ='3 g gg ghh ghhiii'
+ exe 'normal! /g\*h\{2}i\+/e' . "\<CR>"
+ call assert_equal([0, 4, 17, 0], getpos('.'))
+
+ put ='4 j jj jkk jkklll'
+ exe 'normal! /\mj*k\{2}l\+/e' . "\<CR>"
+ call assert_equal([0, 5, 17, 0], getpos('.'))
+
+ put ='5 m mm mnn mnnooo'
+ exe 'normal! /\vm*n{2}o+/e' . "\<CR>"
+ call assert_equal([0, 6, 17, 0], getpos('.'))
+
+ put ='6 x ^aa$ x'
+ exe 'normal! /\V^aa$' . "\<CR>"
+ call assert_equal([0, 7, 5, 0], getpos('.'))
+
+ set magic
+ put ='7 (a)(b) abbaa'
+ exe 'normal! /\v(a)(b)\2\1\1/e' . "\<CR>"
+ call assert_equal([0, 8, 14, 0], getpos('.'))
+
+ put ='8 axx [ab]xx'
+ exe 'normal! /\V[ab]\(\[xy]\)\1' . "\<CR>"
+ call assert_equal([0, 9, 7, 0], getpos('.'))
+
+ set undolevels=100
+ put ='9 foobar'
+ put =''
+ exe "normal! a\<C-G>u\<Esc>"
+ normal G
+ exe 'normal! dv?bar?' . "\<CR>"
+ call assert_equal('9 foo', getline('.'))
+ call assert_equal([0, 10, 5, 0], getpos('.'))
+ call assert_equal(10, line('$'))
+ normal u
+ call assert_equal('9 foobar', getline('.'))
+ call assert_equal([0, 10, 6, 0], getpos('.'))
+ call assert_equal(11, line('$'))
+
+ set undolevels&
+ enew!
+endfunc
+
+" Test for search('multi-byte char', 'bce')
+func Test_search_multibyte()
+ if !has('multi_byte')
+ return
+ endif
+ let save_enc = &encoding
+ set encoding=utf8
+ enew!
+ call append('$', '๏ผก')
+ call cursor(2, 1)
+ call assert_equal(2, search('๏ผก', 'bce', line('.')))
+ enew!
+ let &encoding = save_enc
+endfunc
+
+func Test_search_undefined_behaviour()
+ if !has("terminal")
+ return
+ endif
+ let h = winheight(0)
+ if h < 3
+ return
+ endif
+ " did cause an undefined left shift
+ let g:buf = term_start([GetVimProg(), '--clean', '-e', '-s', '-c', 'call search(getline("."))', 'samples/test000'], {'term_rows': 3})
+ call assert_equal([''], getline(1, '$'))
+ call term_sendkeys(g:buf, ":qa!\<cr>")
+ bwipe!
+endfunc
+
+func Test_search_undefined_behaviour2()
+ call search("\%UC0000000")
+endfunc
+
+" This was causing E874. Also causes an invalid read?
+func Test_look_behind()
+ new
+ call setline(1, '0\|\&\n\@<=')
+ call search(getline("."))
+ bwipe!
+endfunc
+
+func Test_search_sentence()
+ new
+ " this used to cause a crash
+ call assert_fails("/\\%')", 'E486')
+ call assert_fails("/", 'E486')
+ /\%'(
+ /
+endfunc
diff --git a/src/nvim/testdir/test_sha256.vim b/src/nvim/testdir/test_sha256.vim
new file mode 100644
index 0000000000..dd4707977e
--- /dev/null
+++ b/src/nvim/testdir/test_sha256.vim
@@ -0,0 +1,22 @@
+" Tests for the sha256() function.
+
+if !has('cryptv') || !exists('*sha256')
+ finish
+endif
+
+function Test_sha256()
+ " test for empty string:
+ call assert_equal(sha256(""), 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855')
+
+ "'test for 1 char:
+ call assert_equal(sha256("a"), 'ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb')
+ "
+ "test for 3 chars:
+ call assert_equal(sha256("abc"), 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad')
+
+ " test for contains meta char:
+ call assert_equal(sha256("foo\nbar"), '807eff6267f3f926a21d234f7b0cf867a86f47e07a532f15e8cc39ed110ca776')
+
+ " test for contains non-ascii char:
+ call assert_equal(sha256("\xde\xad\xbe\xef"), '5f78c33274e43fa9de5659265c1d917e25c03722dcb0b8d27db8d5feaa813953')
+endfunction
diff --git a/src/nvim/testdir/test_signs.vim b/src/nvim/testdir/test_signs.vim
new file mode 100644
index 0000000000..3960177acd
--- /dev/null
+++ b/src/nvim/testdir/test_signs.vim
@@ -0,0 +1,226 @@
+" Test for signs
+
+if !has('signs')
+ finish
+endif
+
+func Test_sign()
+ new
+ call setline(1, ['a', 'b', 'c', 'd'])
+
+ " Define some signs.
+ " We can specify icons even if not all versions of vim support icons as
+ " icon is ignored when not supported. "(not supported)" is shown after
+ " the icon name when listing signs.
+ sign define Sign1 text=x
+ try
+ sign define Sign2 text=xy texthl=Title linehl=Error numhl=Number icon=../../pixmaps/stock_vim_find_help.png
+ catch /E255:/
+ " ignore error: E255: Couldn't read in sign data!
+ " This error can happen when running in gui.
+ " Some gui like Motif do not support the png icon format.
+ endtry
+
+ " Test listing signs.
+ let a=execute('sign list')
+ call assert_match("^\nsign Sign1 text=x \nsign Sign2 icon=../../pixmaps/stock_vim_find_help.png .*text=xy linehl=Error texthl=Title numhl=Number$", a)
+
+ let a=execute('sign list Sign1')
+ call assert_equal("\nsign Sign1 text=x ", a)
+
+ " Split the window to the bottom to verify sign jump will stay in the current window
+ " if the buffer is displayed there.
+ let bn = bufnr('%')
+ let wn = winnr()
+ exe 'sign place 41 line=3 name=Sign1 buffer=' . bn
+ 1
+ bot split
+ exe 'sign jump 41 buffer=' . bufnr('%')
+ call assert_equal('c', getline('.'))
+ call assert_equal(3, winnr())
+ call assert_equal(bn, bufnr('%'))
+ call assert_notequal(wn, winnr())
+
+ " Create a new buffer and check that ":sign jump" switches to the old buffer.
+ 1
+ new foo
+ call assert_notequal(bn, bufnr('%'))
+ exe 'sign jump 41 buffer=' . bn
+ call assert_equal(bn, bufnr('%'))
+ call assert_equal('c', getline('.'))
+
+ " Redraw to make sure that screen redraw with sign gets exercised,
+ " with and without 'rightleft'.
+ if has('rightleft')
+ set rightleft
+ redraw
+ set norightleft
+ endif
+ redraw
+
+ " Check that we can't change sign.
+ call assert_fails("exe 'sign place 40 name=Sign1 buffer=' . bufnr('%')", 'E885:')
+
+ " Check placed signs
+ let a=execute('sign place')
+ call assert_equal("\n--- Signs ---\nSigns for [NULL]:\n line=3 id=41 name=Sign1\n", a)
+
+ " Unplace the sign and try jumping to it again should fail.
+ sign unplace 41
+ 1
+ call assert_fails("exe 'sign jump 41 buffer=' . bufnr('%')", 'E157:')
+ call assert_equal('a', getline('.'))
+
+ " Unplace sign on current line.
+ exe 'sign place 42 line=4 name=Sign2 buffer=' . bufnr('%')
+ 4
+ sign unplace
+ let a=execute('sign place')
+ call assert_equal("\n--- Signs ---\n", a)
+
+ " Try again to unplace sign on current line, it should fail this time.
+ call assert_fails('sign unplace', 'E159:')
+
+ " Unplace all signs.
+ exe 'sign place 41 line=3 name=Sign1 buffer=' . bufnr('%')
+ sign unplace *
+ let a=execute('sign place')
+ call assert_equal("\n--- Signs ---\n", a)
+
+ " Check :jump with file=...
+ edit foo
+ call setline(1, ['A', 'B', 'C', 'D'])
+
+ try
+ sign define Sign3 text=y texthl=DoesNotExist linehl=DoesNotExist icon=doesnotexist.xpm
+ catch /E255:/
+ " ignore error: E255: it can happens for guis.
+ endtry
+
+ let fn = expand('%:p')
+ exe 'sign place 43 line=2 name=Sign3 file=' . fn
+ edit bar
+ call assert_notequal(fn, expand('%:p'))
+ exe 'sign jump 43 file=' . fn
+ call assert_equal('B', getline('.'))
+
+ " can't define a sign with a non-printable character as text
+ call assert_fails("sign define Sign4 text=\e linehl=Comment", 'E239:')
+ call assert_fails("sign define Sign4 text=a\e linehl=Comment", 'E239:')
+ call assert_fails("sign define Sign4 text=\ea linehl=Comment", 'E239:')
+
+ " Only 1 or 2 character text is allowed
+ call assert_fails("sign define Sign4 text=abc linehl=Comment", 'E239:')
+ call assert_fails("sign define Sign4 text= linehl=Comment", 'E239:')
+ call assert_fails("sign define Sign4 text=\ ab linehl=Comment", 'E239:')
+
+ " define sign with whitespace
+ sign define Sign4 text=\ X linehl=Comment
+ sign undefine Sign4
+ sign define Sign4 linehl=Comment text=\ X
+ sign undefine Sign4
+
+ sign define Sign5 text=X\ linehl=Comment
+ sign undefine Sign5
+ sign define Sign5 linehl=Comment text=X\
+ sign undefine Sign5
+
+ " define sign with backslash
+ sign define Sign4 text=\\\\ linehl=Comment
+ sign undefine Sign4
+ sign define Sign4 text=\\ linehl=Comment
+ sign undefine Sign4
+
+ " After undefining the sign, we should no longer be able to place it.
+ sign undefine Sign1
+ sign undefine Sign2
+ sign undefine Sign3
+ call assert_fails("exe 'sign place 41 line=3 name=Sign1 buffer=' . bufnr('%')", 'E155:')
+endfunc
+
+" Undefining placed sign is not recommended.
+" Quoting :help sign
+"
+" :sign undefine {name}
+" Deletes a previously defined sign. If signs with this {name}
+" are still placed this will cause trouble.
+func Test_sign_undefine_still_placed()
+ new foobar
+ sign define Sign text=x
+ exe 'sign place 41 line=1 name=Sign buffer=' . bufnr('%')
+ sign undefine Sign
+
+ " Listing placed sign should show that sign is deleted.
+ let a=execute('sign place')
+ call assert_equal("\n--- Signs ---\nSigns for foobar:\n line=1 id=41 name=[Deleted]\n", a)
+
+ sign unplace 41
+ let a=execute('sign place')
+ call assert_equal("\n--- Signs ---\n", a)
+endfunc
+
+func Test_sign_completion()
+ sign define Sign1 text=x
+ sign define Sign2 text=y
+
+ call feedkeys(":sign \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"sign define jump list place undefine unplace', @:)
+
+ call feedkeys(":sign define Sign \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"sign define Sign icon= linehl= numhl= text= texthl=', @:)
+
+ call feedkeys(":sign define Sign linehl=Spell\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"sign define Sign linehl=SpellBad SpellCap SpellLocal SpellRare', @:)
+
+ call writefile(['foo'], 'XsignOne')
+ call writefile(['bar'], 'XsignTwo')
+ call feedkeys(":sign define Sign icon=Xsig\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"sign define Sign icon=XsignOne XsignTwo', @:)
+ call delete('XsignOne')
+ call delete('XsignTwo')
+
+ call feedkeys(":sign undefine \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"sign undefine Sign1 Sign2', @:)
+
+ call feedkeys(":sign place 1 \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"sign place 1 buffer= file= line= name=', @:)
+
+ call feedkeys(":sign place 1 name=\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"sign place 1 name=Sign1 Sign2', @:)
+
+ call feedkeys(":sign unplace 1 \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"sign unplace 1 buffer= file=', @:)
+
+ call feedkeys(":sign list \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"sign list Sign1 Sign2', @:)
+
+ call feedkeys(":sign jump 1 \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"sign jump 1 buffer= file=', @:)
+
+ sign undefine Sign1
+ sign undefine Sign2
+endfunc
+
+func Test_sign_invalid_commands()
+ call assert_fails('sign', 'E471:')
+ call assert_fails('sign jump', 'E471:')
+ call assert_fails('sign xxx', 'E160:')
+ call assert_fails('sign define', 'E156:')
+ call assert_fails('sign define Sign1 xxx', 'E475:')
+ call assert_fails('sign undefine', 'E156:')
+ call assert_fails('sign list xxx', 'E155:')
+ call assert_fails('sign place 1 buffer=999', 'E158:')
+ call assert_fails('sign define Sign2 text=', 'E239:')
+endfunc
+
+func Test_sign_delete_buffer()
+ new
+ sign define Sign text=x
+ let bufnr = bufnr('%')
+ new
+ exe 'bd ' . bufnr
+ exe 'sign place 61 line=3 name=Sign buffer=' . bufnr
+ call assert_fails('sign jump 61 buffer=' . bufnr, 'E934:')
+ sign unplace 61
+ sign undefine Sign
+endfunc
diff --git a/src/nvim/testdir/test_smartindent.vim b/src/nvim/testdir/test_smartindent.vim
new file mode 100644
index 0000000000..9e93a55eb0
--- /dev/null
+++ b/src/nvim/testdir/test_smartindent.vim
@@ -0,0 +1,41 @@
+" Tests for smartindent
+
+" Tests for not doing smart indenting when it isn't set.
+function! Test_nosmartindent()
+ new
+ call append(0, [" some test text",
+ \ " test text",
+ \ "test text",
+ \ " test text"])
+ set nocindent nosmartindent autoindent
+ exe "normal! gg/some\<CR>"
+ exe "normal! 2cc#test\<Esc>"
+ call assert_equal(" #test", getline(1))
+ enew! | close
+endfunction
+
+function MyIndent()
+endfunction
+
+" When 'indentexpr' is set, setting 'si' has no effect.
+function Test_smartindent_has_no_effect()
+ new
+ exe "normal! i\<Tab>one\<Esc>"
+ set noautoindent
+ set smartindent
+ set indentexpr=
+ exe "normal! Gotwo\<Esc>"
+ call assert_equal("\ttwo", getline("$"))
+
+ set indentexpr=MyIndent
+ exe "normal! Gothree\<Esc>"
+ call assert_equal("three", getline("$"))
+
+ delfunction! MyIndent
+ set autoindent&
+ set smartindent&
+ set indentexpr&
+ bwipe!
+endfunction
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_sort.vim b/src/nvim/testdir/test_sort.vim
new file mode 100644
index 0000000000..14d008a17f
--- /dev/null
+++ b/src/nvim/testdir/test_sort.vim
@@ -0,0 +1,1253 @@
+" Tests for the "sort()" function and for the ":sort" command.
+
+func Compare1(a, b) abort
+ call sort(range(3), 'Compare2')
+ return a:a - a:b
+endfunc
+
+func Compare2(a, b) abort
+ return a:a - a:b
+endfunc
+
+func Test_sort_strings()
+ " numbers compared as strings
+ call assert_equal([1, 2, 3], sort([3, 2, 1]))
+ call assert_equal([13, 28, 3], sort([3, 28, 13]))
+endfunc
+
+func Test_sort_numeric()
+ call assert_equal([1, 2, 3], sort([3, 2, 1], 'n'))
+ call assert_equal([3, 13, 28], sort([13, 28, 3], 'n'))
+ " strings are not sorted
+ call assert_equal(['13', '28', '3'], sort(['13', '28', '3'], 'n'))
+endfunc
+
+func Test_sort_numbers()
+ call assert_equal([3, 13, 28], sort([13, 28, 3], 'N'))
+ call assert_equal(['3', '13', '28'], sort(['13', '28', '3'], 'N'))
+endfunc
+
+func Test_sort_float()
+ call assert_equal([0.28, 3, 13.5], sort([13.5, 0.28, 3], 'f'))
+endfunc
+
+func Test_sort_nested()
+ " test ability to call sort() from a compare function
+ call assert_equal([1, 3, 5], sort([3, 1, 5], 'Compare1'))
+endfunc
+
+func Test_sort_default()
+ " docs say omitted, empty or zero argument sorts on string representation.
+ call assert_equal(['2', 'A', 'AA', 'a', 1, 3.3], sort([3.3, 1, "2", "A", "a", "AA"]))
+ call assert_equal(['2', 'A', 'AA', 'a', 1, 3.3], sort([3.3, 1, "2", "A", "a", "AA"], ''))
+ call assert_equal(['2', 'A', 'AA', 'a', 1, 3.3], sort([3.3, 1, "2", "A", "a", "AA"], 0))
+ call assert_equal(['2', 'A', 'a', 'AA', 1, 3.3], sort([3.3, 1, "2", "A", "a", "AA"], 1))
+ call assert_fails('call sort([3.3, 1, "2"], 3)', "E474")
+endfunc
+
+" Tests for the ":sort" command.
+func Test_sort_cmd()
+ let tests = [
+ \ {
+ \ 'name' : 'Alphabetical sort',
+ \ 'cmd' : '%sort',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b'
+ \ ],
+ \ 'expected' : [
+ \ ' 123b',
+ \ 'a',
+ \ 'a122',
+ \ 'a123',
+ \ 'a321',
+ \ 'ab',
+ \ 'abc',
+ \ 'b123',
+ \ 'b321',
+ \ 'b321',
+ \ 'b321b',
+ \ 'b322b',
+ \ 'c123d',
+ \ 'c321d'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'Numeric sort',
+ \ 'cmd' : '%sort n',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'a',
+ \ 'x-22',
+ \ 'b321',
+ \ 'b123',
+ \ '',
+ \ 'c123d',
+ \ '-24',
+ \ ' 123b',
+ \ 'c321d',
+ \ '0',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b'
+ \ ],
+ \ 'expected' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ '',
+ \ '-24',
+ \ 'x-22',
+ \ '0',
+ \ 'a122',
+ \ 'a123',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'a321',
+ \ 'b321',
+ \ 'c321d',
+ \ 'b321',
+ \ 'b321b',
+ \ 'b322b'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'Hexadecimal sort',
+ \ 'cmd' : '%sort x',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b'
+ \ ],
+ \ 'expected' : [
+ \ 'a',
+ \ 'ab',
+ \ 'abc',
+ \ ' 123b',
+ \ 'a122',
+ \ 'a123',
+ \ 'a321',
+ \ 'b123',
+ \ 'b321',
+ \ 'b321',
+ \ 'b321b',
+ \ 'b322b',
+ \ 'c123d',
+ \ 'c321d'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'Alphabetical unique sort',
+ \ 'cmd' : '%sort u',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b'
+ \ ],
+ \ 'expected' : [
+ \ ' 123b',
+ \ 'a',
+ \ 'a122',
+ \ 'a123',
+ \ 'a321',
+ \ 'ab',
+ \ 'abc',
+ \ 'b123',
+ \ 'b321',
+ \ 'b321b',
+ \ 'b322b',
+ \ 'c123d',
+ \ 'c321d'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'Alphabetical reverse sort',
+ \ 'cmd' : '%sort!',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b'
+ \ ],
+ \ 'expected' : [
+ \ 'c321d',
+ \ 'c123d',
+ \ 'b322b',
+ \ 'b321b',
+ \ 'b321',
+ \ 'b321',
+ \ 'b123',
+ \ 'abc',
+ \ 'ab',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'a',
+ \ ' 123b',
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'Numeric reverse sort',
+ \ 'cmd' : '%sort! n',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b'
+ \ ],
+ \ 'expected' : [
+ \ 'b322b',
+ \ 'b321b',
+ \ 'b321',
+ \ 'c321d',
+ \ 'b321',
+ \ 'a321',
+ \ ' 123b',
+ \ 'c123d',
+ \ 'b123',
+ \ 'a123',
+ \ 'a122',
+ \ 'a',
+ \ 'ab',
+ \ 'abc'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'Unique reverse sort',
+ \ 'cmd' : 'sort! u',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b'
+ \ ],
+ \ 'expected' : [
+ \ 'c321d',
+ \ 'c123d',
+ \ 'b322b',
+ \ 'b321b',
+ \ 'b321',
+ \ 'b123',
+ \ 'abc',
+ \ 'ab',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'a',
+ \ ' 123b',
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'Octal sort',
+ \ 'cmd' : 'sort o',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b',
+ \ '',
+ \ ''
+ \ ],
+ \ 'expected' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ '',
+ \ '',
+ \ 'a122',
+ \ 'a123',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'a321',
+ \ 'b321',
+ \ 'c321d',
+ \ 'b321',
+ \ 'b321b',
+ \ 'b322b'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'Reverse hexadecimal sort',
+ \ 'cmd' : 'sort! x',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b',
+ \ '',
+ \ ''
+ \ ],
+ \ 'expected' : [
+ \ 'c321d',
+ \ 'c123d',
+ \ 'b322b',
+ \ 'b321b',
+ \ 'b321',
+ \ 'b321',
+ \ 'b123',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ ' 123b',
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ '',
+ \ ''
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'Alpha (skip first character) sort',
+ \ 'cmd' : 'sort/./',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b',
+ \ '',
+ \ ''
+ \ ],
+ \ 'expected' : [
+ \ 'a',
+ \ '',
+ \ '',
+ \ 'a122',
+ \ 'a123',
+ \ 'b123',
+ \ ' 123b',
+ \ 'c123d',
+ \ 'a321',
+ \ 'b321',
+ \ 'b321',
+ \ 'b321b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'ab',
+ \ 'abc'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'Alpha (skip first 2 characters) sort',
+ \ 'cmd' : 'sort/../',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b',
+ \ '',
+ \ ''
+ \ ],
+ \ 'expected' : [
+ \ 'ab',
+ \ 'a',
+ \ '',
+ \ '',
+ \ 'a321',
+ \ 'b321',
+ \ 'b321',
+ \ 'b321b',
+ \ 'c321d',
+ \ 'a122',
+ \ 'b322b',
+ \ 'a123',
+ \ 'b123',
+ \ ' 123b',
+ \ 'c123d',
+ \ 'abc'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'alpha, unique, skip first 2 characters',
+ \ 'cmd' : 'sort/../u',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b',
+ \ '',
+ \ ''
+ \ ],
+ \ 'expected' : [
+ \ 'ab',
+ \ 'a',
+ \ '',
+ \ 'a321',
+ \ 'b321',
+ \ 'b321b',
+ \ 'c321d',
+ \ 'a122',
+ \ 'b322b',
+ \ 'a123',
+ \ 'b123',
+ \ ' 123b',
+ \ 'c123d',
+ \ 'abc'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'numeric, skip first character',
+ \ 'cmd' : 'sort/./n',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b',
+ \ '',
+ \ ''
+ \ ],
+ \ 'expected' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ '',
+ \ '',
+ \ 'a122',
+ \ 'a123',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'a321',
+ \ 'b321',
+ \ 'c321d',
+ \ 'b321',
+ \ 'b321b',
+ \ 'b322b'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'alpha, sort on first character',
+ \ 'cmd' : 'sort/./r',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b',
+ \ '',
+ \ ''
+ \ ],
+ \ 'expected' : [
+ \ '',
+ \ '',
+ \ ' 123b',
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b',
+ \ 'c123d',
+ \ 'c321d'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'alpha, sort on first 2 characters',
+ \ 'cmd' : 'sort/../r',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b',
+ \ '',
+ \ ''
+ \ ],
+ \ 'expected' : [
+ \ 'a',
+ \ '',
+ \ '',
+ \ ' 123b',
+ \ 'a123',
+ \ 'a122',
+ \ 'a321',
+ \ 'abc',
+ \ 'ab',
+ \ 'b123',
+ \ 'b321',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b',
+ \ 'c123d',
+ \ 'c321d'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'numeric, sort on first character',
+ \ 'cmd' : 'sort/./rn',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b',
+ \ '',
+ \ ''
+ \ ],
+ \ 'expected' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b',
+ \ '',
+ \ ''
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'alpha, skip past first digit',
+ \ 'cmd' : 'sort/\d/',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b',
+ \ '',
+ \ ''
+ \ ],
+ \ 'expected' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ '',
+ \ '',
+ \ 'a321',
+ \ 'b321',
+ \ 'b321',
+ \ 'b321b',
+ \ 'c321d',
+ \ 'a122',
+ \ 'b322b',
+ \ 'a123',
+ \ 'b123',
+ \ ' 123b',
+ \ 'c123d'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'alpha, sort on first digit',
+ \ 'cmd' : 'sort/\d/r',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b',
+ \ '',
+ \ ''
+ \ ],
+ \ 'expected' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ '',
+ \ '',
+ \ 'a123',
+ \ 'a122',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'a321',
+ \ 'b321',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'numeric, skip past first digit',
+ \ 'cmd' : 'sort/\d/n',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b',
+ \ '',
+ \ ''
+ \ ],
+ \ 'expected' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ '',
+ \ '',
+ \ 'a321',
+ \ 'b321',
+ \ 'c321d',
+ \ 'b321',
+ \ 'b321b',
+ \ 'a122',
+ \ 'b322b',
+ \ 'a123',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'numeric, sort on first digit',
+ \ 'cmd' : 'sort/\d/rn',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b',
+ \ '',
+ \ ''
+ \ ],
+ \ 'expected' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ '',
+ \ '',
+ \ 'a123',
+ \ 'a122',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'a321',
+ \ 'b321',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'alpha, skip past first 2 digits',
+ \ 'cmd' : 'sort/\d\d/',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b',
+ \ '',
+ \ ''
+ \ ],
+ \ 'expected' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ '',
+ \ '',
+ \ 'a321',
+ \ 'b321',
+ \ 'b321',
+ \ 'b321b',
+ \ 'c321d',
+ \ 'a122',
+ \ 'b322b',
+ \ 'a123',
+ \ 'b123',
+ \ ' 123b',
+ \ 'c123d'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'numeric, skip past first 2 digits',
+ \ 'cmd' : 'sort/\d\d/n',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b',
+ \ '',
+ \ ''
+ \ ],
+ \ 'expected' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ '',
+ \ '',
+ \ 'a321',
+ \ 'b321',
+ \ 'c321d',
+ \ 'b321',
+ \ 'b321b',
+ \ 'a122',
+ \ 'b322b',
+ \ 'a123',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'hexadecimal, skip past first 2 digits',
+ \ 'cmd' : 'sort/\d\d/x',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b',
+ \ '',
+ \ ''
+ \ ],
+ \ 'expected' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ '',
+ \ '',
+ \ 'a321',
+ \ 'b321',
+ \ 'b321',
+ \ 'a122',
+ \ 'a123',
+ \ 'b123',
+ \ 'b321b',
+ \ 'c321d',
+ \ 'b322b',
+ \ ' 123b',
+ \ 'c123d'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'alpha, sort on first 2 digits',
+ \ 'cmd' : 'sort/\d\d/r',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b',
+ \ '',
+ \ ''
+ \ ],
+ \ 'expected' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ '',
+ \ '',
+ \ 'a123',
+ \ 'a122',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'a321',
+ \ 'b321',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'numeric, sort on first 2 digits',
+ \ 'cmd' : 'sort/\d\d/rn',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b',
+ \ '',
+ \ ''
+ \ ],
+ \ 'expected' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ '',
+ \ '',
+ \ 'a123',
+ \ 'a122',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'a321',
+ \ 'b321',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'hexadecimal, sort on first 2 digits',
+ \ 'cmd' : 'sort/\d\d/rx',
+ \ 'input' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ 'a321',
+ \ 'a123',
+ \ 'a122',
+ \ 'b321',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b',
+ \ '',
+ \ ''
+ \ ],
+ \ 'expected' : [
+ \ 'abc',
+ \ 'ab',
+ \ 'a',
+ \ '',
+ \ '',
+ \ 'a123',
+ \ 'a122',
+ \ 'b123',
+ \ 'c123d',
+ \ ' 123b',
+ \ 'a321',
+ \ 'b321',
+ \ 'c321d',
+ \ 'b322b',
+ \ 'b321',
+ \ 'b321b'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'binary',
+ \ 'cmd' : 'sort b',
+ \ 'input' : [
+ \ '0b111000',
+ \ '0b101100',
+ \ '0b101001',
+ \ '0b101001',
+ \ '0b101000',
+ \ '0b000000',
+ \ '0b001000',
+ \ '0b010000',
+ \ '0b101000',
+ \ '0b100000',
+ \ '0b101010',
+ \ '0b100010',
+ \ '0b100100',
+ \ '0b100010',
+ \ '',
+ \ ''
+ \ ],
+ \ 'expected' : [
+ \ '',
+ \ '',
+ \ '0b000000',
+ \ '0b001000',
+ \ '0b010000',
+ \ '0b100000',
+ \ '0b100010',
+ \ '0b100010',
+ \ '0b100100',
+ \ '0b101000',
+ \ '0b101000',
+ \ '0b101001',
+ \ '0b101001',
+ \ '0b101010',
+ \ '0b101100',
+ \ '0b111000'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'binary with leading characters',
+ \ 'cmd' : 'sort b',
+ \ 'input' : [
+ \ '0b100010',
+ \ '0b010000',
+ \ ' 0b101001',
+ \ 'b0b101100',
+ \ '0b100010',
+ \ ' 0b100100',
+ \ 'a0b001000',
+ \ '0b101000',
+ \ '0b101000',
+ \ 'a0b101001',
+ \ 'ab0b100000',
+ \ '0b101010',
+ \ '0b000000',
+ \ 'b0b111000',
+ \ '',
+ \ ''
+ \ ],
+ \ 'expected' : [
+ \ '',
+ \ '',
+ \ '0b000000',
+ \ 'a0b001000',
+ \ '0b010000',
+ \ 'ab0b100000',
+ \ '0b100010',
+ \ '0b100010',
+ \ ' 0b100100',
+ \ '0b101000',
+ \ '0b101000',
+ \ ' 0b101001',
+ \ 'a0b101001',
+ \ '0b101010',
+ \ 'b0b101100',
+ \ 'b0b111000'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'float',
+ \ 'cmd' : 'sort f',
+ \ 'input' : [
+ \ '1.234',
+ \ '0.88',
+ \ '123.456',
+ \ '1.15e-6',
+ \ '-1.1e3',
+ \ '-1.01e3',
+ \ '',
+ \ ''
+ \ ],
+ \ 'expected' : [
+ \ '',
+ \ '',
+ \ '-1.1e3',
+ \ '-1.01e3',
+ \ '1.15e-6',
+ \ '0.88',
+ \ '1.234',
+ \ '123.456'
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'alphabetical, sorted input',
+ \ 'cmd' : 'sort',
+ \ 'input' : [
+ \ 'a',
+ \ 'b',
+ \ 'c',
+ \ ],
+ \ 'expected' : [
+ \ 'a',
+ \ 'b',
+ \ 'c',
+ \ ]
+ \ },
+ \ {
+ \ 'name' : 'alphabetical, sorted input, unique at end',
+ \ 'cmd' : 'sort u',
+ \ 'input' : [
+ \ 'aa',
+ \ 'bb',
+ \ 'cc',
+ \ 'cc',
+ \ ],
+ \ 'expected' : [
+ \ 'aa',
+ \ 'bb',
+ \ 'cc',
+ \ ]
+ \ },
+ \ ]
+
+ for t in tests
+ enew!
+ call append(0, t.input)
+ $delete _
+ setlocal nomodified
+ execute t.cmd
+
+ call assert_equal(t.expected, getline(1, '$'), t.name)
+
+ " Previously, the ":sort" command would set 'modified' even if the buffer
+ " contents did not change. Here, we check that this problem is fixed.
+ if t.input == t.expected
+ call assert_false(&modified, t.name . ': &mod is not correct')
+ else
+ call assert_true(&modified, t.name . ': &mod is not correct')
+ endif
+ endfor
+
+ call assert_fails('sort no', 'E474')
+
+ enew!
+endfunc
+
+func Test_sort_cmd_report()
+ enew!
+ call append(0, repeat([1], 3) + repeat([2], 3) + repeat([3], 3))
+ $delete _
+ setlocal nomodified
+ let res = execute('%sort u')
+
+ call assert_equal([1,2,3], map(getline(1, '$'), 'v:val+0'))
+ call assert_match("6 fewer lines", res)
+ enew!
+ call append(0, repeat([1], 3) + repeat([2], 3) + repeat([3], 3))
+ $delete _
+ setlocal nomodified report=10
+ let res = execute('%sort u')
+
+ call assert_equal([1,2,3], map(getline(1, '$'), 'v:val+0'))
+ call assert_equal("", res)
+ enew!
+ call append(0, repeat([1], 3) + repeat([2], 3) + repeat([3], 3))
+ $delete _
+ setl report&vim
+ setlocal nomodified
+ let res = execute('1g/^/%sort u')
+
+ call assert_equal([1,2,3], map(getline(1, '$'), 'v:val+0'))
+ " the output comes from the :g command, not from the :sort
+ call assert_match("6 fewer lines", res)
+ enew!
+ endfunc
diff --git a/src/nvim/testdir/test_source_utf8.vim b/src/nvim/testdir/test_source_utf8.vim
new file mode 100644
index 0000000000..c29c2ec1f3
--- /dev/null
+++ b/src/nvim/testdir/test_source_utf8.vim
@@ -0,0 +1,63 @@
+" Test the :source! command
+if !has('multi_byte')
+ finish
+endif
+
+func Test_source_utf8()
+ " check that sourcing a script with 0x80 as second byte works
+ new
+ call setline(1, [':%s/ร x/--ร 1234--/g', ':%s/ร€x/--ร€1234--/g'])
+ write! Xscript
+ bwipe!
+ new
+ call setline(1, [' ร x ', ' ร€x '])
+ source! Xscript | echo
+ call assert_equal(' --ร 1234-- ', getline(1))
+ call assert_equal(' --ร€1234-- ', getline(2))
+ bwipe!
+ call delete('Xscript')
+endfunc
+
+func Test_source_latin()
+ " check that sourcing a latin1 script with a 0xc0 byte works
+ new
+ call setline(1, ["call feedkeys('r')", "call feedkeys('\xc0', 'xt')"])
+ write! Xscript
+ bwipe!
+ new
+ call setline(1, ['xxx'])
+ source Xscript
+ call assert_equal("\u00c0xx", getline(1))
+ bwipe!
+ call delete('Xscript')
+endfunc
+
+" Test for sourcing a file with CTRL-V's at the end of the line
+func Test_source_ctrl_v()
+ call writefile(['map __1 afirst',
+ \ 'map __2 asecond',
+ \ 'map __3 athird',
+ \ 'map __4 afourth',
+ \ 'map __5 afifth',
+ \ "map __1 asd\<C-V>",
+ \ "map __2 asd\<C-V>\<C-V>",
+ \ "map __3 asd\<C-V>\<C-V>",
+ \ "map __4 asd\<C-V>\<C-V>\<C-V>",
+ \ "map __5 asd\<C-V>\<C-V>\<C-V>",
+ \ ], 'Xtestfile')
+ source Xtestfile
+ enew!
+ exe "normal __1\<Esc>\<Esc>__2\<Esc>__3\<Esc>\<Esc>__4\<Esc>__5\<Esc>"
+ exe "%s/\<C-J>/0/g"
+ call assert_equal(['sd',
+ \ "map __2 asd\<Esc>secondsd\<Esc>sd0map __5 asd0fifth"],
+ \ getline(1, 2))
+
+ enew!
+ call delete('Xtestfile')
+ unmap __1
+ unmap __2
+ unmap __3
+ unmap __4
+ unmap __5
+endfunc
diff --git a/src/nvim/testdir/test_spell.vim b/src/nvim/testdir/test_spell.vim
new file mode 100644
index 0000000000..b3438cc649
--- /dev/null
+++ b/src/nvim/testdir/test_spell.vim
@@ -0,0 +1,851 @@
+" Test spell checking
+
+if !has('spell')
+ finish
+endif
+
+func TearDown()
+ set nospell
+ call delete('Xtest.aff')
+ call delete('Xtest.dic')
+ call delete('Xtest.latin1.add')
+ call delete('Xtest.latin1.add.spl')
+ call delete('Xtest.latin1.spl')
+ call delete('Xtest.latin1.sug')
+endfunc
+
+func Test_wrap_search()
+ new
+ call setline(1, ['The', '', 'A plong line with two zpelling mistakes', '', 'End'])
+ set spell wrapscan
+ normal ]s
+ call assert_equal('plong', expand('<cword>'))
+ normal ]s
+ call assert_equal('zpelling', expand('<cword>'))
+ normal ]s
+ call assert_equal('plong', expand('<cword>'))
+ bwipe!
+ set nospell
+endfunc
+
+func Test_curswant()
+ new
+ call setline(1, ['Another plong line', 'abcdefghijklmnopq'])
+ set spell wrapscan
+ normal 0]s
+ call assert_equal('plong', expand('<cword>'))
+ normal j
+ call assert_equal(9, getcurpos()[2])
+ normal 0[s
+ call assert_equal('plong', expand('<cword>'))
+ normal j
+ call assert_equal(9, getcurpos()[2])
+
+ normal 0]S
+ call assert_equal('plong', expand('<cword>'))
+ normal j
+ call assert_equal(9, getcurpos()[2])
+ normal 0[S
+ call assert_equal('plong', expand('<cword>'))
+ normal j
+ call assert_equal(9, getcurpos()[2])
+
+ normal 1G0
+ call assert_equal('plong', spellbadword()[0])
+ normal j
+ call assert_equal(9, getcurpos()[2])
+
+ bwipe!
+ set nospell
+endfunc
+
+func Test_z_equal_on_invalid_utf8_word()
+ split
+ set spell
+ call setline(1, "\xff")
+ norm z=
+ set nospell
+ bwipe!
+endfunc
+
+func Test_spellreall()
+ new
+ set spell
+ call assert_fails('spellrepall', 'E752:')
+ call setline(1, ['A speling mistake. The same speling mistake.',
+ \ 'Another speling mistake.'])
+ call feedkeys(']s1z=', 'tx')
+ call assert_equal('A spelling mistake. The same speling mistake.', getline(1))
+ call assert_equal('Another speling mistake.', getline(2))
+ spellrepall
+ call assert_equal('A spelling mistake. The same spelling mistake.', getline(1))
+ call assert_equal('Another spelling mistake.', getline(2))
+ call assert_fails('spellrepall', 'E753:')
+ set spell&
+ bwipe!
+endfunc
+
+func Test_spellinfo()
+ throw 'skipped: Nvim does not support enc=latin1'
+ new
+
+ set enc=latin1 spell spelllang=en
+ call assert_match("^\nfile: .*/runtime/spell/en.latin1.spl\n$", execute('spellinfo'))
+
+ set enc=cp1250 spell spelllang=en
+ call assert_match("^\nfile: .*/runtime/spell/en.ascii.spl\n$", execute('spellinfo'))
+
+ if has('multi_byte')
+ set enc=utf-8 spell spelllang=en
+ call assert_match("^\nfile: .*/runtime/spell/en.utf-8.spl\n$", execute('spellinfo'))
+ endif
+
+ set enc=latin1 spell spelllang=en_us,en_nz
+ call assert_match("^\n" .
+ \ "file: .*/runtime/spell/en.latin1.spl\n" .
+ \ "file: .*/runtime/spell/en.latin1.spl\n$", execute('spellinfo'))
+
+ set spell spelllang=
+ call assert_fails('spellinfo', 'E756:')
+
+ set nospell spelllang=en
+ call assert_fails('spellinfo', 'E756:')
+
+ set enc& spell& spelllang&
+ bwipe
+endfunc
+
+func Test_zz_basic()
+ call LoadAffAndDic(g:test_data_aff1, g:test_data_dic1)
+ call RunGoodBad("wrong OK puts. Test the end",
+ \ "bad: inputs comment ok Ok. test d\xE9\xF4l end the",
+ \["Comment", "deol", "d\xE9\xF4r", "input", "OK", "output", "outputs", "outtest", "put", "puts",
+ \ "test", "testen", "testn", "the end", "uk", "wrong"],
+ \[
+ \ ["bad", ["put", "uk", "OK"]],
+ \ ["inputs", ["input", "puts", "outputs"]],
+ \ ["comment", ["Comment", "outtest", "the end"]],
+ \ ["ok", ["OK", "uk", "put"]],
+ \ ["Ok", ["OK", "Uk", "Put"]],
+ \ ["test", ["Test", "testn", "testen"]],
+ \ ["d\xE9\xF4l", ["deol", "d\xE9\xF4r", "test"]],
+ \ ["end", ["put", "uk", "test"]],
+ \ ["the", ["put", "uk", "test"]],
+ \ ]
+ \ )
+
+ call assert_equal("gebletegek", soundfold('goobledygoook'))
+ call assert_equal("kepereneven", soundfold('k๓op๋rn๔ven'))
+ call assert_equal("everles gesvets etele", soundfold('oeverloos gezwets edale'))
+endfunc
+
+" Postponed prefixes
+func Test_zz_prefixes()
+ call LoadAffAndDic(g:test_data_aff2, g:test_data_dic1)
+ call RunGoodBad("puts",
+ \ "bad: inputs comment ok Ok end the. test d\xE9\xF4l",
+ \ ["Comment", "deol", "d\xE9\xF4r", "OK", "put", "input", "output", "puts", "outputs", "test", "outtest", "testen", "testn", "the end", "uk", "wrong"],
+ \ [
+ \ ["bad", ["put", "uk", "OK"]],
+ \ ["inputs", ["input", "puts", "outputs"]],
+ \ ["comment", ["Comment"]],
+ \ ["ok", ["OK", "uk", "put"]],
+ \ ["Ok", ["OK", "Uk", "Put"]],
+ \ ["end", ["put", "uk", "deol"]],
+ \ ["the", ["put", "uk", "test"]],
+ \ ["test", ["Test", "testn", "testen"]],
+ \ ["d\xE9\xF4l", ["deol", "d\xE9\xF4r", "test"]],
+ \ ])
+endfunc
+
+"Compound words
+func Test_zz_compound()
+ call LoadAffAndDic(g:test_data_aff3, g:test_data_dic3)
+ call RunGoodBad("foo m\xEF foobar foofoobar barfoo barbarfoo",
+ \ "bad: bar la foom\xEF barm\xEF m\xEFfoo m\xEFbar m\xEFm\xEF lala m\xEFla lam\xEF foola labar",
+ \ ["foo", "m\xEF"],
+ \ [
+ \ ["bad", ["foo", "m\xEF"]],
+ \ ["bar", ["barfoo", "foobar", "foo"]],
+ \ ["la", ["m\xEF", "foo"]],
+ \ ["foom\xEF", ["foo m\xEF", "foo", "foofoo"]],
+ \ ["barm\xEF", ["barfoo", "m\xEF", "barbar"]],
+ \ ["m\xEFfoo", ["m\xEF foo", "foo", "foofoo"]],
+ \ ["m\xEFbar", ["foobar", "barbar", "m\xEF"]],
+ \ ["m\xEFm\xEF", ["m\xEF m\xEF", "m\xEF"]],
+ \ ["lala", []],
+ \ ["m\xEFla", ["m\xEF", "m\xEF m\xEF"]],
+ \ ["lam\xEF", ["m\xEF", "m\xEF m\xEF"]],
+ \ ["foola", ["foo", "foobar", "foofoo"]],
+ \ ["labar", ["barbar", "foobar"]],
+ \ ])
+
+ call LoadAffAndDic(g:test_data_aff4, g:test_data_dic4)
+ call RunGoodBad("word util bork prebork start end wordutil wordutils pro-ok bork borkbork borkborkbork borkborkborkbork borkborkborkborkbork tomato tomatotomato startend startword startwordword startwordend startwordwordend startwordwordwordend prebork preborkbork preborkborkbork nouword",
+ \ "bad: wordutilize pro borkborkborkborkborkbork tomatotomatotomato endstart endend startstart wordend wordstart preborkprebork preborkpreborkbork startwordwordwordwordend borkpreborkpreborkbork utilsbork startnouword",
+ \ ["bork", "prebork", "end", "pro-ok", "start", "tomato", "util", "utilize", "utils", "word", "nouword"],
+ \ [
+ \ ["bad", ["end", "bork", "word"]],
+ \ ["wordutilize", ["word utilize", "wordutils", "wordutil"]],
+ \ ["pro", ["bork", "word", "end"]],
+ \ ["borkborkborkborkborkbork", ["bork borkborkborkborkbork", "borkbork borkborkborkbork", "borkborkbork borkborkbork"]],
+ \ ["tomatotomatotomato", ["tomato tomatotomato", "tomatotomato tomato", "tomato tomato tomato"]],
+ \ ["endstart", ["end start", "start"]],
+ \ ["endend", ["end end", "end"]],
+ \ ["startstart", ["start start"]],
+ \ ["wordend", ["word end", "word", "wordword"]],
+ \ ["wordstart", ["word start", "bork start"]],
+ \ ["preborkprebork", ["prebork prebork", "preborkbork", "preborkborkbork"]],
+ \ ["preborkpreborkbork", ["prebork preborkbork", "preborkborkbork", "preborkborkborkbork"]],
+ \ ["startwordwordwordwordend", ["startwordwordwordword end", "startwordwordwordword", "start wordwordwordword end"]],
+ \ ["borkpreborkpreborkbork", ["bork preborkpreborkbork", "bork prebork preborkbork", "bork preborkprebork bork"]],
+ \ ["utilsbork", ["utilbork", "utils bork", "util bork"]],
+ \ ["startnouword", ["start nouword", "startword", "startborkword"]],
+ \ ])
+
+endfunc
+
+"Test affix flags with two characters
+func Test_zz_affix()
+ call LoadAffAndDic(g:test_data_aff5, g:test_data_dic5)
+ call RunGoodBad("fooa1 fooa\xE9 bar prebar barbork prebarbork startprebar start end startend startmiddleend nouend",
+ \ "bad: foo fooa2 prabar probarbirk middle startmiddle middleend endstart startprobar startnouend",
+ \ ["bar", "barbork", "end", "fooa1", "fooa\xE9", "nouend", "prebar", "prebarbork", "start"],
+ \ [
+ \ ["bad", ["bar", "end", "fooa1"]],
+ \ ["foo", ["fooa1", "fooa\xE9", "bar"]],
+ \ ["fooa2", ["fooa1", "fooa\xE9", "bar"]],
+ \ ["prabar", ["prebar", "bar", "bar bar"]],
+ \ ["probarbirk", ["prebarbork"]],
+ \ ["middle", []],
+ \ ["startmiddle", ["startmiddleend", "startmiddlebar"]],
+ \ ["middleend", []],
+ \ ["endstart", ["end start", "start"]],
+ \ ["startprobar", ["startprebar", "start prebar", "startbar"]],
+ \ ["startnouend", ["start nouend", "startend"]],
+ \ ])
+
+ call LoadAffAndDic(g:test_data_aff6, g:test_data_dic6)
+ call RunGoodBad("meea1 meea\xE9 bar prebar barbork prebarbork leadprebar lead end leadend leadmiddleend",
+ \ "bad: mee meea2 prabar probarbirk middle leadmiddle middleend endlead leadprobar",
+ \ ["bar", "barbork", "end", "lead", "meea1", "meea\xE9", "prebar", "prebarbork"],
+ \ [
+ \ ["bad", ["bar", "end", "lead"]],
+ \ ["mee", ["meea1", "meea\xE9", "bar"]],
+ \ ["meea2", ["meea1", "meea\xE9", "lead"]],
+ \ ["prabar", ["prebar", "bar", "leadbar"]],
+ \ ["probarbirk", ["prebarbork"]],
+ \ ["middle", []],
+ \ ["leadmiddle", ["leadmiddleend", "leadmiddlebar"]],
+ \ ["middleend", []],
+ \ ["endlead", ["end lead", "lead", "end end"]],
+ \ ["leadprobar", ["leadprebar", "lead prebar", "leadbar"]],
+ \ ])
+
+ call LoadAffAndDic(g:test_data_aff7, g:test_data_dic7)
+ call RunGoodBad("meea1 meea\xE9 bar prebar barmeat prebarmeat leadprebar lead tail leadtail leadmiddletail",
+ \ "bad: mee meea2 prabar probarmaat middle leadmiddle middletail taillead leadprobar",
+ \ ["bar", "barmeat", "lead", "meea1", "meea\xE9", "prebar", "prebarmeat", "tail"],
+ \ [
+ \ ["bad", ["bar", "lead", "tail"]],
+ \ ["mee", ["meea1", "meea\xE9", "bar"]],
+ \ ["meea2", ["meea1", "meea\xE9", "lead"]],
+ \ ["prabar", ["prebar", "bar", "leadbar"]],
+ \ ["probarmaat", ["prebarmeat"]],
+ \ ["middle", []],
+ \ ["leadmiddle", ["leadmiddlebar"]],
+ \ ["middletail", []],
+ \ ["taillead", ["tail lead", "tail"]],
+ \ ["leadprobar", ["leadprebar", "lead prebar", "leadbar"]],
+ \ ])
+endfunc
+
+func Test_zz_NOSLITSUGS()
+ call LoadAffAndDic(g:test_data_aff8, g:test_data_dic8)
+ call RunGoodBad("foo bar faabar", "bad: foobar barfoo",
+ \ ["bar", "faabar", "foo"],
+ \ [
+ \ ["bad", ["bar", "foo"]],
+ \ ["foobar", ["faabar", "foo bar", "bar"]],
+ \ ["barfoo", ["bar foo", "bar", "foo"]],
+ \ ])
+endfunc
+
+" Numbers
+func Test_zz_Numbers()
+ call LoadAffAndDic(g:test_data_aff9, g:test_data_dic9)
+ call RunGoodBad("0b1011 0777 1234 0x01ff", "",
+ \ ["bar", "foo"],
+ \ [
+ \ ])
+endfunc
+
+function FirstSpellWord()
+ call feedkeys("/^start:\n", 'tx')
+ normal ]smm
+ let [str, a] = spellbadword()
+ return str
+endfunc
+
+function SecondSpellWord()
+ normal `m]s
+ let [str, a] = spellbadword()
+ return str
+endfunc
+
+"Test with SAL instead of SOFO items; test automatic reloading
+func Test_zz_sal_and_addition()
+ throw 'skipped: Nvim does not support enc=latin1'
+ set enc=latin1
+ set spellfile=
+ call writefile(g:test_data_dic1, "Xtest.dic")
+ call writefile(g:test_data_aff_sal, "Xtest.aff")
+ mkspell! Xtest Xtest
+ set spl=Xtest.latin1.spl spell
+ call assert_equal('kbltykk', soundfold('goobledygoook'))
+ call assert_equal('kprnfn', soundfold('k๓op๋rn๔ven'))
+ call assert_equal('*fls kswts tl', soundfold('oeverloos gezwets edale'))
+
+ "also use an addition file
+ call writefile(["/regions=usgbnz", "elequint/2", "elekwint/3"], "Xtest.latin1.add")
+ mkspell! Xtest.latin1.add.spl Xtest.latin1.add
+
+ bwipe!
+ call setline(1, ["start: elequint test elekwint test elekwent asdf"])
+
+ set spellfile=Xtest.latin1.add
+ call assert_equal("elekwent", FirstSpellWord())
+
+ set spl=Xtest_us.latin1.spl
+ call assert_equal("elequint", FirstSpellWord())
+ call assert_equal("elekwint", SecondSpellWord())
+
+ set spl=Xtest_gb.latin1.spl
+ call assert_equal("elekwint", FirstSpellWord())
+ call assert_equal("elekwent", SecondSpellWord())
+
+ set spl=Xtest_nz.latin1.spl
+ call assert_equal("elequint", FirstSpellWord())
+ call assert_equal("elekwent", SecondSpellWord())
+
+ set spl=Xtest_ca.latin1.spl
+ call assert_equal("elequint", FirstSpellWord())
+ call assert_equal("elekwint", SecondSpellWord())
+endfunc
+
+func Test_region_error()
+ messages clear
+ call writefile(["/regions=usgbnz", "elequint/0"], "Xtest.latin1.add")
+ mkspell! Xtest.latin1.add.spl Xtest.latin1.add
+ call assert_match('Invalid region nr in Xtest.latin1.add line 2: 0', execute('messages'))
+ call delete('Xtest.latin1.add')
+ call delete('Xtest.latin1.add.spl')
+endfunc
+
+" Check using z= in new buffer (crash fixed by patch 7.4a.028).
+func Test_zeq_crash()
+ new
+ set spell
+ call feedkeys('iasdz=:\"', 'tx')
+
+ bwipe!
+endfunc
+
+func LoadAffAndDic(aff_contents, dic_contents)
+ throw 'skipped: Nvim does not support enc=latin1'
+ set enc=latin1
+ set spellfile=
+ call writefile(a:aff_contents, "Xtest.aff")
+ call writefile(a:dic_contents, "Xtest.dic")
+ " Generate a .spl file from a .dic and .aff file.
+ mkspell! Xtest Xtest
+ " use that spell file
+ set spl=Xtest.latin1.spl spell
+endfunc
+
+func ListWords()
+ spelldump
+ %yank
+ quit
+ return split(@", "\n")
+endfunc
+
+func TestGoodBadBase()
+ exe '1;/^good:'
+ normal 0f:]s
+ let prevbad = ''
+ let result = []
+ while 1
+ let [bad, a] = spellbadword()
+ if bad == '' || bad == prevbad || bad == 'badend'
+ break
+ endif
+ let prevbad = bad
+ let lst = spellsuggest(bad, 3)
+ normal mm
+
+ call add(result, [bad, lst])
+ normal `m]s
+ endwhile
+ return result
+endfunc
+
+func RunGoodBad(good, bad, expected_words, expected_bad_words)
+ bwipe!
+ call setline(1, ["good: ", a:good, a:bad, " badend "])
+ let words = ListWords()
+ call assert_equal(a:expected_words, words[1:-1])
+ let bad_words = TestGoodBadBase()
+ call assert_equal(a:expected_bad_words, bad_words)
+ bwipe!
+endfunc
+
+let g:test_data_aff1 = [
+ \"SET ISO8859-1",
+ \"TRY esianrtolcdugmphbyfvkwjkqxz-\xEB\xE9\xE8\xEA\xEF\xEE\xE4\xE0\xE2\xF6\xFC\xFB'ESIANRTOLCDUGMPHBYFVKWJKQXZ",
+ \"",
+ \"FOL \xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xDF\xFF",
+ \"LOW \xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xDF\xFF",
+ \"UPP \xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xFF",
+ \"",
+ \"SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xDF\xFF\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xBF",
+ \"SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?",
+ \"",
+ \"MIDWORD\t'-",
+ \"",
+ \"KEP =",
+ \"RAR ?",
+ \"BAD !",
+ \"",
+ \"PFX I N 1",
+ \"PFX I 0 in .",
+ \"",
+ \"PFX O Y 1",
+ \"PFX O 0 out .",
+ \"",
+ \"SFX S Y 2",
+ \"SFX S 0 s [^s]",
+ \"SFX S 0 es s",
+ \"",
+ \"SFX N N 3",
+ \"SFX N 0 en [^n]",
+ \"SFX N 0 nen n",
+ \"SFX N 0 n .",
+ \"",
+ \"REP 3",
+ \"REP g ch",
+ \"REP ch g",
+ \"REP svp s.v.p.",
+ \"",
+ \"MAP 9",
+ \"MAP a\xE0\xE1\xE2\xE3\xE4\xE5",
+ \"MAP e\xE8\xE9\xEA\xEB",
+ \"MAP i\xEC\xED\xEE\xEF",
+ \"MAP o\xF2\xF3\xF4\xF5\xF6",
+ \"MAP u\xF9\xFA\xFB\xFC",
+ \"MAP n\xF1",
+ \"MAP c\xE7",
+ \"MAP y\xFF\xFD",
+ \"MAP s\xDF",
+ \ ]
+let g:test_data_dic1 = [
+ \"123456",
+ \"test/NO",
+ \"# comment",
+ \"wrong",
+ \"Comment",
+ \"OK",
+ \"uk",
+ \"put/ISO",
+ \"the end",
+ \"deol",
+ \"d\xE9\xF4r",
+ \ ]
+let g:test_data_aff2 = [
+ \"SET ISO8859-1",
+ \"",
+ \"FOL \xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xDF\xFF",
+ \"LOW \xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xDF\xFF",
+ \"UPP \xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xFF",
+ \"",
+ \"PFXPOSTPONE",
+ \"",
+ \"MIDWORD\t'-",
+ \"",
+ \"KEP =",
+ \"RAR ?",
+ \"BAD !",
+ \"",
+ \"PFX I N 1",
+ \"PFX I 0 in .",
+ \"",
+ \"PFX O Y 1",
+ \"PFX O 0 out [a-z]",
+ \"",
+ \"SFX S Y 2",
+ \"SFX S 0 s [^s]",
+ \"SFX S 0 es s",
+ \"",
+ \"SFX N N 3",
+ \"SFX N 0 en [^n]",
+ \"SFX N 0 nen n",
+ \"SFX N 0 n .",
+ \"",
+ \"REP 3",
+ \"REP g ch",
+ \"REP ch g",
+ \"REP svp s.v.p.",
+ \"",
+ \"MAP 9",
+ \"MAP a\xE0\xE1\xE2\xE3\xE4\xE5",
+ \"MAP e\xE8\xE9\xEA\xEB",
+ \"MAP i\xEC\xED\xEE\xEF",
+ \"MAP o\xF2\xF3\xF4\xF5\xF6",
+ \"MAP u\xF9\xFA\xFB\xFC",
+ \"MAP n\xF1",
+ \"MAP c\xE7",
+ \"MAP y\xFF\xFD",
+ \"MAP s\xDF",
+ \ ]
+let g:test_data_aff3 = [
+ \"SET ISO8859-1",
+ \"",
+ \"COMPOUNDMIN 3",
+ \"COMPOUNDRULE m*",
+ \"NEEDCOMPOUND x",
+ \ ]
+let g:test_data_dic3 = [
+ \"1234",
+ \"foo/m",
+ \"bar/mx",
+ \"m\xEF/m",
+ \"la/mx",
+ \ ]
+let g:test_data_aff4 = [
+ \"SET ISO8859-1",
+ \"",
+ \"FOL \xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xDF\xFF",
+ \"LOW \xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xDF\xFF",
+ \"UPP \xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xFF",
+ \"",
+ \"COMPOUNDRULE m+",
+ \"COMPOUNDRULE sm*e",
+ \"COMPOUNDRULE sm+",
+ \"COMPOUNDMIN 3",
+ \"COMPOUNDWORDMAX 3",
+ \"COMPOUNDFORBIDFLAG t",
+ \"",
+ \"COMPOUNDSYLMAX 5",
+ \"SYLLABLE a\xE1e\xE9i\xEDo\xF3\xF6\xF5u\xFA\xFC\xFBy/aa/au/ea/ee/ei/ie/oa/oe/oo/ou/uu/ui",
+ \"",
+ \"MAP 9",
+ \"MAP a\xE0\xE1\xE2\xE3\xE4\xE5",
+ \"MAP e\xE8\xE9\xEA\xEB",
+ \"MAP i\xEC\xED\xEE\xEF",
+ \"MAP o\xF2\xF3\xF4\xF5\xF6",
+ \"MAP u\xF9\xFA\xFB\xFC",
+ \"MAP n\xF1",
+ \"MAP c\xE7",
+ \"MAP y\xFF\xFD",
+ \"MAP s\xDF",
+ \"",
+ \"NEEDAFFIX x",
+ \"",
+ \"PFXPOSTPONE",
+ \"",
+ \"MIDWORD '-",
+ \"",
+ \"SFX q N 1",
+ \"SFX q 0 -ok .",
+ \"",
+ \"SFX a Y 2",
+ \"SFX a 0 s .",
+ \"SFX a 0 ize/t .",
+ \"",
+ \"PFX p N 1",
+ \"PFX p 0 pre .",
+ \"",
+ \"PFX P N 1",
+ \"PFX P 0 nou .",
+ \ ]
+let g:test_data_dic4 = [
+ \"1234",
+ \"word/mP",
+ \"util/am",
+ \"pro/xq",
+ \"tomato/m",
+ \"bork/mp",
+ \"start/s",
+ \"end/e",
+ \ ]
+let g:test_data_aff5 = [
+ \"SET ISO8859-1",
+ \"",
+ \"FLAG long",
+ \"",
+ \"NEEDAFFIX !!",
+ \"",
+ \"COMPOUNDRULE ssmm*ee",
+ \"",
+ \"NEEDCOMPOUND xx",
+ \"COMPOUNDPERMITFLAG pp",
+ \"",
+ \"SFX 13 Y 1",
+ \"SFX 13 0 bork .",
+ \"",
+ \"SFX a1 Y 1",
+ \"SFX a1 0 a1 .",
+ \"",
+ \"SFX a\xE9 Y 1",
+ \"SFX a\xE9 0 a\xE9 .",
+ \"",
+ \"PFX zz Y 1",
+ \"PFX zz 0 pre/pp .",
+ \"",
+ \"PFX yy Y 1",
+ \"PFX yy 0 nou .",
+ \ ]
+let g:test_data_dic5 = [
+ \"1234",
+ \"foo/a1a\xE9!!",
+ \"bar/zz13ee",
+ \"start/ss",
+ \"end/eeyy",
+ \"middle/mmxx",
+ \ ]
+let g:test_data_aff6 = [
+ \"SET ISO8859-1",
+ \"",
+ \"FLAG caplong",
+ \"",
+ \"NEEDAFFIX A!",
+ \"",
+ \"COMPOUNDRULE sMm*Ee",
+ \"",
+ \"NEEDCOMPOUND Xx",
+ \"",
+ \"COMPOUNDPERMITFLAG p",
+ \"",
+ \"SFX N3 Y 1",
+ \"SFX N3 0 bork .",
+ \"",
+ \"SFX A1 Y 1",
+ \"SFX A1 0 a1 .",
+ \"",
+ \"SFX A\xE9 Y 1",
+ \"SFX A\xE9 0 a\xE9 .",
+ \"",
+ \"PFX Zz Y 1",
+ \"PFX Zz 0 pre/p .",
+ \ ]
+let g:test_data_dic6 = [
+ \"1234",
+ \"mee/A1A\xE9A!",
+ \"bar/ZzN3Ee",
+ \"lead/s",
+ \"end/Ee",
+ \"middle/MmXx",
+ \ ]
+let g:test_data_aff7 = [
+ \"SET ISO8859-1",
+ \"",
+ \"FLAG num",
+ \"",
+ \"NEEDAFFIX 9999",
+ \"",
+ \"COMPOUNDRULE 2,77*123",
+ \"",
+ \"NEEDCOMPOUND 1",
+ \"COMPOUNDPERMITFLAG 432",
+ \"",
+ \"SFX 61003 Y 1",
+ \"SFX 61003 0 meat .",
+ \"",
+ \"SFX 391 Y 1",
+ \"SFX 391 0 a1 .",
+ \"",
+ \"SFX 111 Y 1",
+ \"SFX 111 0 a\xE9 .",
+ \"",
+ \"PFX 17 Y 1",
+ \"PFX 17 0 pre/432 .",
+ \ ]
+let g:test_data_dic7 = [
+ \"1234",
+ \"mee/391,111,9999",
+ \"bar/17,61003,123",
+ \"lead/2",
+ \"tail/123",
+ \"middle/77,1",
+ \ ]
+let g:test_data_aff8 = [
+ \"SET ISO8859-1",
+ \"",
+ \"NOSPLITSUGS",
+ \ ]
+let g:test_data_dic8 = [
+ \"1234",
+ \"foo",
+ \"bar",
+ \"faabar",
+ \ ]
+let g:test_data_aff9 = [
+ \ ]
+let g:test_data_dic9 = [
+ \"1234",
+ \"foo",
+ \"bar",
+ \ ]
+let g:test_data_aff_sal = [
+ \"SET ISO8859-1",
+ \"TRY esianrtolcdugmphbyfvkwjkqxz-\xEB\xE9\xE8\xEA\xEF\xEE\xE4\xE0\xE2\xF6\xFC\xFB'ESIANRTOLCDUGMPHBYFVKWJKQXZ",
+ \"",
+ \"FOL \xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xDF\xFF",
+ \"LOW \xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xDF\xFF",
+ \"UPP \xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xFF",
+ \"",
+ \"MIDWORD\t'-",
+ \"",
+ \"KEP =",
+ \"RAR ?",
+ \"BAD !",
+ \"",
+ \"PFX I N 1",
+ \"PFX I 0 in .",
+ \"",
+ \"PFX O Y 1",
+ \"PFX O 0 out .",
+ \"",
+ \"SFX S Y 2",
+ \"SFX S 0 s [^s]",
+ \"SFX S 0 es s",
+ \"",
+ \"SFX N N 3",
+ \"SFX N 0 en [^n]",
+ \"SFX N 0 nen n",
+ \"SFX N 0 n .",
+ \"",
+ \"REP 3",
+ \"REP g ch",
+ \"REP ch g",
+ \"REP svp s.v.p.",
+ \"",
+ \"MAP 9",
+ \"MAP a\xE0\xE1\xE2\xE3\xE4\xE5",
+ \"MAP e\xE8\xE9\xEA\xEB",
+ \"MAP i\xEC\xED\xEE\xEF",
+ \"MAP o\xF2\xF3\xF4\xF5\xF6",
+ \"MAP u\xF9\xFA\xFB\xFC",
+ \"MAP n\xF1",
+ \"MAP c\xE7",
+ \"MAP y\xFF\xFD",
+ \"MAP s\xDF",
+ \"",
+ \"SAL AH(AEIOUY)-^ *H",
+ \"SAL AR(AEIOUY)-^ *R",
+ \"SAL A(HR)^ *",
+ \"SAL A^ *",
+ \"SAL AH(AEIOUY)- H",
+ \"SAL AR(AEIOUY)- R",
+ \"SAL A(HR) _",
+ \"SAL \xC0^ *",
+ \"SAL \xC5^ *",
+ \"SAL BB- _",
+ \"SAL B B",
+ \"SAL CQ- _",
+ \"SAL CIA X",
+ \"SAL CH X",
+ \"SAL C(EIY)- S",
+ \"SAL CK K",
+ \"SAL COUGH^ KF",
+ \"SAL CC< C",
+ \"SAL C K",
+ \"SAL DG(EIY) K",
+ \"SAL DD- _",
+ \"SAL D T",
+ \"SAL \xC9< E",
+ \"SAL EH(AEIOUY)-^ *H",
+ \"SAL ER(AEIOUY)-^ *R",
+ \"SAL E(HR)^ *",
+ \"SAL ENOUGH^$ *NF",
+ \"SAL E^ *",
+ \"SAL EH(AEIOUY)- H",
+ \"SAL ER(AEIOUY)- R",
+ \"SAL E(HR) _",
+ \"SAL FF- _",
+ \"SAL F F",
+ \"SAL GN^ N",
+ \"SAL GN$ N",
+ \"SAL GNS$ NS",
+ \"SAL GNED$ N",
+ \"SAL GH(AEIOUY)- K",
+ \"SAL GH _",
+ \"SAL GG9 K",
+ \"SAL G K",
+ \"SAL H H",
+ \"SAL IH(AEIOUY)-^ *H",
+ \"SAL IR(AEIOUY)-^ *R",
+ \"SAL I(HR)^ *",
+ \"SAL I^ *",
+ \"SAL ING6 N",
+ \"SAL IH(AEIOUY)- H",
+ \"SAL IR(AEIOUY)- R",
+ \"SAL I(HR) _",
+ \"SAL J K",
+ \"SAL KN^ N",
+ \"SAL KK- _",
+ \"SAL K K",
+ \"SAL LAUGH^ LF",
+ \"SAL LL- _",
+ \"SAL L L",
+ \"SAL MB$ M",
+ \"SAL MM M",
+ \"SAL M M",
+ \"SAL NN- _",
+ \"SAL N N",
+ \"SAL OH(AEIOUY)-^ *H",
+ \"SAL OR(AEIOUY)-^ *R",
+ \"SAL O(HR)^ *",
+ \"SAL O^ *",
+ \"SAL OH(AEIOUY)- H",
+ \"SAL OR(AEIOUY)- R",
+ \"SAL O(HR) _",
+ \"SAL PH F",
+ \"SAL PN^ N",
+ \"SAL PP- _",
+ \"SAL P P",
+ \"SAL Q K",
+ \"SAL RH^ R",
+ \"SAL ROUGH^ RF",
+ \"SAL RR- _",
+ \"SAL R R",
+ \"SAL SCH(EOU)- SK",
+ \"SAL SC(IEY)- S",
+ \"SAL SH X",
+ \"SAL SI(AO)- X",
+ \"SAL SS- _",
+ \"SAL S S",
+ \"SAL TI(AO)- X",
+ \"SAL TH @",
+ \"SAL TCH-- _",
+ \"SAL TOUGH^ TF",
+ \"SAL TT- _",
+ \"SAL T T",
+ \"SAL UH(AEIOUY)-^ *H",
+ \"SAL UR(AEIOUY)-^ *R",
+ \"SAL U(HR)^ *",
+ \"SAL U^ *",
+ \"SAL UH(AEIOUY)- H",
+ \"SAL UR(AEIOUY)- R",
+ \"SAL U(HR) _",
+ \"SAL V^ W",
+ \"SAL V F",
+ \"SAL WR^ R",
+ \"SAL WH^ W",
+ \"SAL W(AEIOU)- W",
+ \"SAL X^ S",
+ \"SAL X KS",
+ \"SAL Y(AEIOU)- Y",
+ \"SAL ZZ- _",
+ \"SAL Z S",
+ \ ]
diff --git a/src/nvim/testdir/test_startup.vim b/src/nvim/testdir/test_startup.vim
new file mode 100644
index 0000000000..3bc9eaf756
--- /dev/null
+++ b/src/nvim/testdir/test_startup.vim
@@ -0,0 +1,367 @@
+" Tests for startup.
+
+source shared.vim
+
+" Check that loading startup.vim works.
+func Test_startup_script()
+ throw 'skipped: Nvim does not need defaults.vim'
+ set compatible
+ source $VIMRUNTIME/defaults.vim
+
+ call assert_equal(0, &compatible)
+endfunc
+
+" Verify the order in which plugins are loaded:
+" 1. plugins in non-after directories
+" 2. packages
+" 3. plugins in after directories
+func Test_after_comes_later()
+ if !has('packages')
+ return
+ endif
+ let before = [
+ \ 'set nocp viminfo+=nviminfo',
+ \ 'set guioptions+=M',
+ \ 'let $HOME = "/does/not/exist"',
+ \ 'set loadplugins',
+ \ 'set rtp=Xhere,Xafter,Xanother',
+ \ 'set packpath=Xhere,Xafter',
+ \ 'set nomore',
+ \ 'let g:sequence = ""',
+ \ ]
+ let after = [
+ \ 'redir! > Xtestout',
+ \ 'scriptnames',
+ \ 'redir END',
+ \ 'redir! > Xsequence',
+ \ 'echo g:sequence',
+ \ 'redir END',
+ \ 'quit',
+ \ ]
+ call mkdir('Xhere/plugin', 'p')
+ call writefile(['let g:sequence .= "here "'], 'Xhere/plugin/here.vim')
+ call mkdir('Xanother/plugin', 'p')
+ call writefile(['let g:sequence .= "another "'], 'Xanother/plugin/another.vim')
+ call mkdir('Xhere/pack/foo/start/foobar/plugin', 'p')
+ call writefile(['let g:sequence .= "pack "'], 'Xhere/pack/foo/start/foobar/plugin/foo.vim')
+
+ call mkdir('Xafter/plugin', 'p')
+ call writefile(['let g:sequence .= "after "'], 'Xafter/plugin/later.vim')
+
+ if RunVim(before, after, '')
+
+ let lines = readfile('Xtestout')
+ let expected = ['Xbefore.vim', 'here.vim', 'another.vim', 'foo.vim', 'later.vim', 'Xafter.vim']
+ let found = []
+ for line in lines
+ for one in expected
+ if line =~ one
+ call add(found, one)
+ endif
+ endfor
+ endfor
+ call assert_equal(expected, found)
+ endif
+
+ call assert_equal('here another pack after', substitute(join(readfile('Xsequence', 1), ''), '\s\+$', '', ''))
+
+ call delete('Xtestout')
+ call delete('Xsequence')
+ call delete('Xhere', 'rf')
+ call delete('Xanother', 'rf')
+ call delete('Xafter', 'rf')
+endfunc
+
+func Test_pack_in_rtp_when_plugins_run()
+ if !has('packages')
+ return
+ endif
+ let before = [
+ \ 'set nocp viminfo+=nviminfo',
+ \ 'set guioptions+=M',
+ \ 'let $HOME = "/does/not/exist"',
+ \ 'set loadplugins',
+ \ 'set rtp=Xhere',
+ \ 'set packpath=Xhere',
+ \ 'set nomore',
+ \ ]
+ let after = [
+ \ 'quit',
+ \ ]
+ call mkdir('Xhere/plugin', 'p')
+ call writefile(['redir! > Xtestout', 'silent set runtimepath?', 'silent! call foo#Trigger()', 'redir END'], 'Xhere/plugin/here.vim')
+ call mkdir('Xhere/pack/foo/start/foobar/autoload', 'p')
+ call writefile(['function! foo#Trigger()', 'echo "autoloaded foo"', 'endfunction'], 'Xhere/pack/foo/start/foobar/autoload/foo.vim')
+
+ if RunVim(before, after, '')
+
+ let lines = filter(readfile('Xtestout'), '!empty(v:val)')
+ call assert_match('Xhere[/\\]pack[/\\]foo[/\\]start[/\\]foobar', get(lines, 0))
+ call assert_match('autoloaded foo', get(lines, 1))
+ endif
+
+ call delete('Xtestout')
+ call delete('Xhere', 'rf')
+endfunc
+
+func Test_help_arg()
+ if !has('unix') && has('gui')
+ " this doesn't work with gvim on MS-Windows
+ return
+ endif
+ if RunVim([], [], '--help >Xtestout')
+ let lines = readfile('Xtestout')
+ call assert_true(len(lines) > 20)
+ call assert_match('Usage:', lines[0])
+
+ " check if couple of lines are there
+ let found = []
+ for line in lines
+ if line =~ '-R.*Read-only mode'
+ call add(found, 'Readonly mode')
+ endif
+ " Watch out for a second --version line in the Gnome version.
+ if line =~ '--version.*Print version information'
+ call add(found, "--version")
+ endif
+ endfor
+ call assert_equal(['Readonly mode', '--version'], found)
+ endif
+ call delete('Xtestout')
+endfunc
+
+func Test_compatible_args()
+ throw "skipped: Nvim is always 'nocompatible'"
+ let after = [
+ \ 'call writefile([string(&compatible)], "Xtestout")',
+ \ 'set viminfo+=nviminfo',
+ \ 'quit',
+ \ ]
+ if RunVim([], after, '-C')
+ let lines = readfile('Xtestout')
+ call assert_equal('1', lines[0])
+ endif
+
+ if RunVim([], after, '-N')
+ let lines = readfile('Xtestout')
+ call assert_equal('0', lines[0])
+ endif
+
+ call delete('Xtestout')
+endfunc
+
+" Test the -o[N] and -O[N] arguments to open N windows split
+" horizontally or vertically.
+func Test_o_arg()
+ let after = [
+ \ 'call writefile([winnr("$"),
+ \ winheight(1), winheight(2), &lines,
+ \ winwidth(1), winwidth(2), &columns,
+ \ bufname(winbufnr(1)), bufname(winbufnr(2))],
+ \ "Xtestout")',
+ \ 'qall',
+ \ ]
+ if RunVim([], after, '-o2')
+ " Open 2 windows split horizontally. Expect:
+ " - 2 windows
+ " - both windows should have the same or almost the same height
+ " - sum of both windows height (+ 3 for both statusline and Ex command)
+ " should be equal to the number of lines
+ " - both windows should have the same width which should be equal to the
+ " number of columns
+ " - buffer of both windows should have no name
+ let [wn, wh1, wh2, ln, ww1, ww2, cn, bn1, bn2] = readfile('Xtestout')
+ call assert_equal('2', wn)
+ call assert_inrange(0, 1, wh1 - wh2)
+ call assert_equal(string(wh1 + wh2 + 3), ln)
+ call assert_equal(ww1, ww2)
+ call assert_equal(ww1, cn)
+ call assert_equal('', bn1)
+ call assert_equal('', bn2)
+ endif
+
+ if RunVim([], after, '-o foo bar')
+ " Same expectations as for -o2 but buffer names should be foo and bar
+ let [wn, wh1, wh2, ln, ww1, ww2, cn, bn1, bn2] = readfile('Xtestout')
+ call assert_equal('2', wn)
+ call assert_inrange(0, 1, wh1 - wh2)
+ call assert_equal(string(wh1 + wh2 + 3), ln)
+ call assert_equal(ww1, ww2)
+ call assert_equal(ww1, cn)
+ call assert_equal('foo', bn1)
+ call assert_equal('bar', bn2)
+ endif
+
+ if RunVim([], after, '-O2')
+ " Open 2 windows split vertically. Expect:
+ " - 2 windows
+ " - both windows should have the same or almost the same width
+ " - sum of both windows width (+ 1 separator) should be equal to the
+ " number of columns
+ " - both windows should have the same height
+ " - window height (+ 2 for the statusline and Ex command) should be equal
+ " to the number of lines
+ " - buffer of both windowns should have no name
+ let [wn, wh1, wh2, ln, ww1, ww2, cn, bn1, bn2] = readfile('Xtestout')
+ call assert_equal('2', wn)
+ call assert_inrange(0, 1, ww1 - ww2)
+ call assert_equal(string(ww1 + ww2 + 1), cn)
+ call assert_equal(wh1, wh2)
+ call assert_equal(string(wh1 + 2), ln)
+ call assert_equal('', bn1)
+ call assert_equal('', bn2)
+ endif
+
+ if RunVim([], after, '-O foo bar')
+ " Same expectations as for -O2 but buffer names should be foo and bar
+ let [wn, wh1, wh2, ln, ww1, ww2, cn, bn1, bn2] = readfile('Xtestout')
+ call assert_equal('2', wn)
+ call assert_inrange(0, 1, ww1 - ww2)
+ call assert_equal(string(ww1 + ww2 + 1), cn)
+ call assert_equal(wh1, wh2)
+ call assert_equal(string(wh1 + 2), ln)
+ call assert_equal('foo', bn1)
+ call assert_equal('bar', bn2)
+ endif
+
+ call delete('Xtestout')
+endfunc
+
+func Test_file_args()
+ let after = [
+ \ 'call writefile(argv(), "Xtestout")',
+ \ 'qall',
+ \ ]
+ if RunVim([], after, '')
+ let lines = readfile('Xtestout')
+ call assert_equal(0, len(lines))
+ endif
+
+ if RunVim([], after, 'one')
+ let lines = readfile('Xtestout')
+ call assert_equal(1, len(lines))
+ call assert_equal('one', lines[0])
+ endif
+
+ if RunVim([], after, 'one two three')
+ let lines = readfile('Xtestout')
+ call assert_equal(3, len(lines))
+ call assert_equal('one', lines[0])
+ call assert_equal('two', lines[1])
+ call assert_equal('three', lines[2])
+ endif
+
+ if RunVim([], after, 'one -c echo two')
+ let lines = readfile('Xtestout')
+ call assert_equal(2, len(lines))
+ call assert_equal('one', lines[0])
+ call assert_equal('two', lines[1])
+ endif
+
+ if RunVim([], after, 'one -- -c echo two')
+ let lines = readfile('Xtestout')
+ call assert_equal(4, len(lines))
+ call assert_equal('one', lines[0])
+ call assert_equal('-c', lines[1])
+ call assert_equal('echo', lines[2])
+ call assert_equal('two', lines[3])
+ endif
+
+ call delete('Xtestout')
+endfunc
+
+func Test_startuptime()
+ if !has('startuptime')
+ return
+ endif
+ let after = ['qall']
+ if RunVim([], after, '--startuptime Xtestout one')
+ let lines = readfile('Xtestout')
+ let expected = ['parsing arguments', 'inits 3', 'opening buffers']
+ let found = []
+ for line in lines
+ for exp in expected
+ if line =~ exp
+ call add(found, exp)
+ endif
+ endfor
+ endfor
+ call assert_equal(expected, found)
+ endif
+ call delete('Xtestout')
+endfunc
+
+func Test_read_stdin()
+ let after = [
+ \ 'write Xtestout',
+ \ 'quit!',
+ \ ]
+ if RunVimPiped([], after, '-', 'echo something | ')
+ let lines = readfile('Xtestout')
+ " MS-Windows adds a space after the word
+ call assert_equal(['something'], split(lines[0]))
+ endif
+ call delete('Xtestout')
+endfunc
+
+func Test_progpath()
+ " Tests normally run with "./vim" or "../vim", these must have been expanded
+ " to a full path.
+ if has('unix')
+ call assert_equal('/', v:progpath[0])
+ elseif has('win32')
+ call assert_equal(':', v:progpath[1])
+ call assert_match('[/\\]', v:progpath[2])
+ endif
+
+ " Only expect "vim" to appear in v:progname.
+ call assert_match('vim\c', v:progname)
+endfunc
+
+func Test_silent_ex_mode()
+ if !has('unix') || has('gui_running')
+ " can't get output of Vim.
+ return
+ endif
+
+ " This caused an ml_get error.
+ let out = system(GetVimCommand() . ' -u NONE -es -c''set verbose=1|h|exe "%norm\<c-y>\<c-d>"'' -c cq')
+ call assert_notmatch('E315:', out)
+endfunc
+
+func Test_default_term()
+ if !has('unix') || has('gui_running')
+ " can't get output of Vim.
+ return
+ endif
+
+ let save_term = $TERM
+ let $TERM = 'unknownxxx'
+ let out = system(GetVimCommand() . ' -c ''echo &term'' -c cq')
+ call assert_match('nvim', out)
+ let $TERM = save_term
+endfunc
+
+func Test_zzz_startinsert()
+ " Test :startinsert
+ call writefile(['123456'], 'Xtestout')
+ let after = [
+ \ ':startinsert',
+ \ 'call feedkeys("foobar\<c-o>:wq\<cr>","t")'
+ \ ]
+ if RunVim([], after, 'Xtestout')
+ let lines = readfile('Xtestout')
+ call assert_equal(['foobar123456'], lines)
+ endif
+ " Test :startinsert!
+ call writefile(['123456'], 'Xtestout')
+ let after = [
+ \ ':startinsert!',
+ \ 'call feedkeys("foobar\<c-o>:wq\<cr>","t")'
+ \ ]
+ if RunVim([], after, 'Xtestout')
+ let lines = readfile('Xtestout')
+ call assert_equal(['123456foobar'], lines)
+ endif
+ call delete('Xtestout')
+endfunc
diff --git a/src/nvim/testdir/test_startup_utf8.vim b/src/nvim/testdir/test_startup_utf8.vim
new file mode 100644
index 0000000000..d179a4cc79
--- /dev/null
+++ b/src/nvim/testdir/test_startup_utf8.vim
@@ -0,0 +1,64 @@
+" Tests for startup using utf-8.
+if !has('multi_byte')
+ finish
+endif
+
+source shared.vim
+
+func Test_read_stdin_utf8()
+ let linesin = ['ใƒ†ใ‚นใƒˆ', 'โ‚ฌร€รˆรŒร’ร™']
+ call writefile(linesin, 'Xtestin')
+ let before = [
+ \ 'set enc=utf-8',
+ \ 'set fencs=cp932,utf-8',
+ \ ]
+ let after = [
+ \ 'write ++enc=utf-8 Xtestout',
+ \ 'quit!',
+ \ ]
+ if has('win32')
+ let pipecmd = 'type Xtestin | '
+ else
+ let pipecmd = 'cat Xtestin | '
+ endif
+ if RunVimPiped(before, after, '-', pipecmd)
+ let lines = readfile('Xtestout')
+ call assert_equal(linesin, lines)
+ else
+ call assert_equal('', 'RunVimPiped failed.')
+ endif
+ call delete('Xtestout')
+ call delete('Xtestin')
+endfunc
+
+func Test_read_fifo_utf8()
+ if !has('unix')
+ return
+ endif
+ " Using bash/zsh's process substitution.
+ if executable('bash')
+ set shell=bash
+ elseif executable('zsh')
+ set shell=zsh
+ else
+ return
+ endif
+ let linesin = ['ใƒ†ใ‚นใƒˆ', 'โ‚ฌร€รˆรŒร’ร™']
+ call writefile(linesin, 'Xtestin')
+ let before = [
+ \ 'set enc=utf-8',
+ \ 'set fencs=cp932,utf-8',
+ \ ]
+ let after = [
+ \ 'write ++enc=utf-8 Xtestout',
+ \ 'quit!',
+ \ ]
+ if RunVim(before, after, '<(cat Xtestin)')
+ let lines = readfile('Xtestout')
+ call assert_equal(linesin, lines)
+ else
+ call assert_equal('', 'RunVim failed.')
+ endif
+ call delete('Xtestout')
+ call delete('Xtestin')
+endfunc
diff --git a/src/nvim/testdir/test_stat.vim b/src/nvim/testdir/test_stat.vim
new file mode 100644
index 0000000000..253f74c2ad
--- /dev/null
+++ b/src/nvim/testdir/test_stat.vim
@@ -0,0 +1,185 @@
+" Tests for stat functions and checktime
+
+func CheckFileTime(doSleep)
+ let fnames = ['Xtest1.tmp', 'Xtest2.tmp', 'Xtest3.tmp']
+ let times = []
+ let result = 0
+
+ " Use three files istead of localtim(), with a network filesystem the file
+ " times may differ at bit
+ let fl = ['Hello World!']
+ for fname in fnames
+ call writefile(fl, fname)
+ call add(times, getftime(fname))
+ if a:doSleep
+ sleep 1
+ endif
+ endfor
+
+ let time_correct = (times[0] <= times[1] && times[1] <= times[2])
+ if a:doSleep || time_correct
+ call assert_true(time_correct, printf('Expected %s <= %s <= %s', times[0], times[1], times[2]))
+ call assert_equal(strlen(fl[0] . "\n"), getfsize(fnames[0]))
+ call assert_equal('file', getftype(fnames[0]))
+ call assert_equal('rw-', getfperm(fnames[0])[0:2])
+ let result = 1
+ endif
+
+ for fname in fnames
+ call delete(fname)
+ endfor
+ return result
+endfunc
+
+func Test_existent_file()
+ " On some systems the file timestamp is rounded to a multiple of 2 seconds.
+ " We need to sleep to handle that, but that makes the test slow. First try
+ " without the sleep, and if it fails try again with the sleep.
+ if CheckFileTime(0) == 0
+ call CheckFileTime(1)
+ endif
+endfunc
+
+func Test_existent_directory()
+ let dname = '.'
+
+ call assert_equal(0, getfsize(dname))
+ call assert_equal('dir', getftype(dname))
+ call assert_equal(has('win32') ? 'rw-' : 'rwx', getfperm(dname)[0:2])
+endfunc
+
+func SleepForTimestamp()
+ " FAT has a granularity of 2 seconds, otherwise it's usually 1 second
+ if has('win32')
+ sleep 2
+ else
+ sleep 2
+ endif
+endfunc
+
+func Test_checktime()
+ let fname = 'Xtest.tmp'
+
+ let fl = ['Hello World!']
+ call writefile(fl, fname)
+ set autoread
+ exec 'e' fname
+ call SleepForTimestamp()
+ let fl = readfile(fname)
+ let fl[0] .= ' - checktime'
+ call writefile(fl, fname)
+ checktime
+ call assert_equal(fl[0], getline(1))
+
+ call delete(fname)
+endfunc
+
+func Test_autoread_file_deleted()
+ new Xautoread
+ set autoread
+ call setline(1, 'original')
+ w!
+
+ call SleepForTimestamp()
+ if has('win32')
+ silent !echo changed > Xautoread
+ else
+ silent !echo 'changed' > Xautoread
+ endif
+ checktime
+ call assert_equal('changed', trim(getline(1)))
+
+ call SleepForTimestamp()
+ messages clear
+ if has('win32')
+ silent !del Xautoread
+ else
+ silent !rm Xautoread
+ endif
+ checktime
+ call assert_match('E211:', execute('messages'))
+ call assert_equal('changed', trim(getline(1)))
+
+ call SleepForTimestamp()
+ if has('win32')
+ silent !echo recreated > Xautoread
+ else
+ silent !echo 'recreated' > Xautoread
+ endif
+ checktime
+ call assert_equal('recreated', trim(getline(1)))
+
+ call delete('Xautoread')
+ bwipe!
+endfunc
+
+
+func Test_nonexistent_file()
+ let fname = 'Xtest.tmp'
+
+ call delete(fname)
+ call assert_equal(-1, getftime(fname))
+ call assert_equal(-1, getfsize(fname))
+ call assert_equal('', getftype(fname))
+ call assert_equal('', getfperm(fname))
+endfunc
+
+func Test_getftype()
+ call assert_equal('file', getftype(v:progpath))
+ call assert_equal('dir', getftype('.'))
+
+ if !has('unix')
+ return
+ endif
+
+ silent !ln -s Xfile Xlink
+ call assert_equal('link', getftype('Xlink'))
+ call delete('Xlink')
+
+ if executable('mkfifo')
+ silent !mkfifo Xfifo
+ call assert_equal('fifo', getftype('Xfifo'))
+ call delete('Xfifo')
+ endif
+
+ for cdevfile in systemlist('find /dev -type c -maxdepth 2 2>/dev/null')
+ let type = getftype(cdevfile)
+ " ignore empty result, can happen if the file disappeared
+ if type != ''
+ call assert_equal('cdev', type)
+ endif
+ endfor
+
+ for bdevfile in systemlist('find /dev -type b -maxdepth 2 2>/dev/null')
+ let type = getftype(bdevfile)
+ " ignore empty result, can happen if the file disappeared
+ if type != ''
+ call assert_equal('bdev', type)
+ endif
+ endfor
+
+ " The /run/ directory typically contains socket files.
+ " If it does not, test won't fail but will not test socket files.
+ for socketfile in systemlist('find /run -type s -maxdepth 2 2>/dev/null')
+ let type = getftype(socketfile)
+ " ignore empty result, can happen if the file disappeared
+ if type != ''
+ call assert_equal('socket', type)
+ endif
+ endfor
+
+ " TODO: file type 'other' is not tested. How can we test it?
+endfunc
+
+func Test_win32_symlink_dir()
+ " On Windows, non-admin users cannot create symlinks.
+ " So we use an existing symlink for this test.
+ if has('win32')
+ " Check if 'C:\Users\All Users' is a symlink to a directory.
+ let res = system('dir C:\Users /a')
+ if match(res, '\C<SYMLINKD> *All Users') >= 0
+ " Get the filetype of the symlink.
+ call assert_equal('link', getftype('C:\Users\All Users'))
+ endif
+ endif
+endfunc
diff --git a/src/nvim/testdir/test_statusline.vim b/src/nvim/testdir/test_statusline.vim
new file mode 100644
index 0000000000..cf85bd58ac
--- /dev/null
+++ b/src/nvim/testdir/test_statusline.vim
@@ -0,0 +1,274 @@
+" Test 'statusline'
+"
+" Not tested yet:
+" %a
+" %N
+" %T
+" %X
+" %*
+
+source view_util.vim
+
+func s:get_statusline()
+ return ScreenLines(&lines - 1, &columns)[0]
+endfunc
+
+func StatuslineWithCaughtError()
+ let s:func_in_statusline_called = 1
+ try
+ call eval('unknown expression')
+ catch
+ endtry
+ return ''
+endfunc
+
+func StatuslineWithError()
+ let s:func_in_statusline_called = 1
+ call eval('unknown expression')
+ return ''
+endfunc
+
+" Function used to display syntax group.
+func SyntaxItem()
+ return synIDattr(synID(line("."),col("."),1),"name")
+endfunc
+
+func Test_caught_error_in_statusline()
+ let s:func_in_statusline_called = 0
+ set laststatus=2
+ let statusline = '%{StatuslineWithCaughtError()}'
+ let &statusline = statusline
+ redrawstatus
+ call assert_true(s:func_in_statusline_called)
+ call assert_equal(statusline, &statusline)
+ set statusline=
+endfunc
+
+func Test_statusline_will_be_disabled_with_error()
+ let s:func_in_statusline_called = 0
+ set laststatus=2
+ let statusline = '%{StatuslineWithError()}'
+ try
+ let &statusline = statusline
+ redrawstatus
+ catch
+ endtry
+ call assert_true(s:func_in_statusline_called)
+ call assert_equal('', &statusline)
+ set statusline=
+endfunc
+
+func Test_statusline()
+ new Xstatusline
+ only
+ set laststatus=2
+ set splitbelow
+ call setline(1, range(1, 200))
+
+ " %b: Value of character under cursor.
+ " %B: As above, in hexadecimal.
+ call cursor(180, 2)
+ set statusline=%b,%B
+ call assert_match('^56,38\s*$', s:get_statusline())
+
+ " %o: Byte number in file of byte under cursor, first byte is 1.
+ " %O: As above, in hexadecimal.
+ set statusline=%o,%O
+ set fileformat=dos
+ call assert_match('^789,315\s*$', s:get_statusline())
+ set fileformat=mac
+ call assert_match('^610,262\s*$', s:get_statusline())
+ set fileformat=unix
+ call assert_match('^610,262\s*$', s:get_statusline())
+ set fileformat&
+
+ " %f: Path to the file in the buffer, as typed or relative to current dir.
+ set statusline=%f
+ call assert_match('^Xstatusline\s*$', s:get_statusline())
+
+ " %F: Full path to the file in the buffer.
+ set statusline=%F
+ call assert_match('/testdir/Xstatusline\s*$', s:get_statusline())
+
+ " %h: Help buffer flag, text is "[help]".
+ " %H: Help buffer flag, text is ",HLP".
+ set statusline=%h,%H
+ call assert_match('^,\s*$', s:get_statusline())
+ help
+ call assert_match('^\[Help\],HLP\s*$', s:get_statusline())
+ helpclose
+
+ " %k: Value of "b:keymap_name" or 'keymap'
+ " when :lmap mappings are being used: <keymap>"
+ set statusline=%k
+ if has('keymap')
+ set keymap=esperanto
+ call assert_match('^<Eo>\s*$', s:get_statusline())
+ set keymap&
+ else
+ call assert_match('^\s*$', s:get_statusline())
+ endif
+
+ " %l: Line number.
+ " %L: Number of line in buffer.
+ " %c: Column number.
+ set statusline=%l/%L,%c
+ call assert_match('^180/200,2\s*$', s:get_statusline())
+
+ " %m: Modified flag, text is "[+]", "[-]" if 'modifiable' is off.
+ " %M: Modified flag, text is ",+" or ",-".
+ set statusline=%m%M
+ call assert_match('^\[+\],+\s*$', s:get_statusline())
+ set nomodifiable
+ call assert_match('^\[+-\],+-\s*$', s:get_statusline())
+ write
+ call assert_match('^\[-\],-\s*$', s:get_statusline())
+ set modifiable&
+ call assert_match('^\s*$', s:get_statusline())
+
+ " %n: Buffer number.
+ set statusline=%n
+ call assert_match('^'.bufnr('%').'\s*$', s:get_statusline())
+
+ " %p: Percentage through file in lines as in CTRL-G.
+ " %P: Percentage through file of displayed window.
+ set statusline=%p,%P
+ 0
+ call assert_match('^0,Top\s*$', s:get_statusline())
+ norm G
+ call assert_match('^100,Bot\s*$', s:get_statusline())
+ 180
+ " Don't check the exact percentage as it depends on the window size
+ call assert_match('^90,\(Top\|Bot\|\d\+%\)\s*$', s:get_statusline())
+
+ " %q: "[Quickfix List]", "[Location List]" or empty.
+ set statusline=%q
+ call assert_match('^\s*$', s:get_statusline())
+ copen
+ call assert_match('^\[Quickfix List\]\s*$', s:get_statusline())
+ cclose
+ lexpr getline(1, 2)
+ lopen
+ call assert_match('^\[Location List\]\s*$', s:get_statusline())
+ lclose
+
+ " %r: Readonly flag, text is "[RO]".
+ " %R: Readonly flag, text is ",RO".
+ set statusline=%r,%R
+ call assert_match('^,\s*$', s:get_statusline())
+ help
+ call assert_match('^\[RO\],RO\s*$', s:get_statusline())
+ helpclose
+
+ " %t: File name (tail) of file in the buffer.
+ set statusline=%t
+ call assert_match('^Xstatusline\s*$', s:get_statusline())
+
+ " %v: Virtual column number.
+ " %V: Virtual column number as -{num}. Not displayed if equal to 'c'.
+ call cursor(180, 2)
+ set statusline=%v,%V
+ call assert_match('^2,\s*$', s:get_statusline())
+ set virtualedit=all
+ norm 10|
+ call assert_match('^10,-10\s*$', s:get_statusline())
+ set virtualedit&
+
+ " %w: Preview window flag, text is "[Preview]".
+ " %W: Preview window flag, text is ",PRV".
+ set statusline=%w%W
+ call assert_match('^\s*$', s:get_statusline())
+ pedit
+ wincmd j
+ call assert_match('^\[Preview\],PRV\s*$', s:get_statusline())
+ pclose
+
+ " %y: Type of file in the buffer, e.g., "[vim]". See 'filetype'.
+ " %Y: Type of file in the buffer, e.g., ",VIM". See 'filetype'.
+ set statusline=%y\ %Y
+ call assert_match('^\s*$', s:get_statusline())
+ setfiletype vim
+ call assert_match('^\[vim\] VIM\s*$', s:get_statusline())
+
+ " %=: Separation point between left and right aligned items.
+ set statusline=foo%=bar
+ call assert_match('^foo\s\+bar\s*$', s:get_statusline())
+
+ " Test min/max width, leading zeroes, left/right justify.
+ set statusline=%04B
+ call cursor(180, 2)
+ call assert_match('^0038\s*$', s:get_statusline())
+ set statusline=#%4B#
+ call assert_match('^# 38#\s*$', s:get_statusline())
+ set statusline=#%-4B#
+ call assert_match('^#38 #\s*$', s:get_statusline())
+ set statusline=%.6f
+ call assert_match('^<sline\s*$', s:get_statusline())
+
+ " %<: Where to truncate.
+ exe 'set statusline=a%<b' . repeat('c', 1000) . 'd'
+ call assert_match('^a<c*d$', s:get_statusline())
+ exe 'set statusline=a' . repeat('b', 1000) . '%<c'
+ call assert_match('^ab*>$', s:get_statusline())
+
+ "%{: Evaluate expression between '%{' and '}' and substitute result.
+ syntax on
+ set statusline=%{SyntaxItem()}
+ call assert_match('^vimNumber\s*$', s:get_statusline())
+ s/^/"/
+ call assert_match('^vimLineComment\s*$', s:get_statusline())
+ syntax off
+
+ "%(: Start of item group.
+ set statusline=ab%(cd%q%)de
+ call assert_match('^abde\s*$', s:get_statusline())
+ copen
+ call assert_match('^abcd\[Quickfix List\1]de\s*$', s:get_statusline())
+ cclose
+
+ " %#: Set highlight group. The name must follow and then a # again.
+ set statusline=ab%#Todo#cd%#Error#ef
+ call assert_match('^abcdef\s*$', s:get_statusline())
+ let sa1=screenattr(&lines - 1, 1)
+ let sa2=screenattr(&lines - 1, 3)
+ let sa3=screenattr(&lines - 1, 5)
+ call assert_notequal(sa1, sa2)
+ call assert_notequal(sa1, sa3)
+ call assert_notequal(sa2, sa3)
+ call assert_equal(sa1, screenattr(&lines - 1, 2))
+ call assert_equal(sa2, screenattr(&lines - 1, 4))
+ call assert_equal(sa3, screenattr(&lines - 1, 6))
+ call assert_equal(sa3, screenattr(&lines - 1, 7))
+
+ " %*: Set highlight group to User{N}
+ set statusline=a%1*b%0*c
+ call assert_match('^abc\s*$', s:get_statusline())
+ let sa1=screenattr(&lines - 1, 1)
+ let sa2=screenattr(&lines - 1, 2)
+ let sa3=screenattr(&lines - 1, 3)
+ call assert_equal(sa1, sa3)
+ call assert_notequal(sa1, sa2)
+
+ " %%: a percent sign.
+ set statusline=10%%
+ call assert_match('^10%\s*$', s:get_statusline())
+
+ " %!: evaluated expression is used as the option value
+ set statusline=%!2*3+1
+ call assert_match('7\s*$', s:get_statusline())
+
+ " Check statusline in current and non-current window
+ " with the 'fillchars' option.
+ set fillchars=stl:^,stlnc:=,vert:\|,fold:-,diff:-
+ vsplit
+ set statusline=x%=y
+ call assert_match('^x^\+y^x=\+y$', s:get_statusline())
+ set fillchars&
+ close
+
+ %bw!
+ call delete('Xstatusline')
+ set statusline&
+ set laststatus&
+ set splitbelow&
+endfunc
diff --git a/src/nvim/testdir/test_substitute.vim b/src/nvim/testdir/test_substitute.vim
new file mode 100644
index 0000000000..dbd26be089
--- /dev/null
+++ b/src/nvim/testdir/test_substitute.vim
@@ -0,0 +1,503 @@
+" Tests for multi-line regexps with ":s".
+
+function! Test_multiline_subst()
+ enew!
+ call append(0, ["1 aa",
+ \ "bb",
+ \ "cc",
+ \ "2 dd",
+ \ "ee",
+ \ "3 ef",
+ \ "gh",
+ \ "4 ij",
+ \ "5 a8",
+ \ "8b c9",
+ \ "9d",
+ \ "6 e7",
+ \ "77f",
+ \ "xxxxx"])
+
+ 1
+ " test if replacing a line break works with a back reference
+ /^1/,/^2/s/\n\(.\)/ \1/
+ " test if inserting a line break works with a back reference
+ /^3/,/^4/s/\(.\)$/\r\1/
+ " test if replacing a line break with another line break works
+ /^5/,/^6/s/\(\_d\{3}\)/x\1x/
+ call assert_equal('1 aa bb cc 2 dd ee', getline(1))
+ call assert_equal('3 e', getline(2))
+ call assert_equal('f', getline(3))
+ call assert_equal('g', getline(4))
+ call assert_equal('h', getline(5))
+ call assert_equal('4 i', getline(6))
+ call assert_equal('j', getline(7))
+ call assert_equal('5 ax8', getline(8))
+ call assert_equal('8xb cx9', getline(9))
+ call assert_equal('9xd', getline(10))
+ call assert_equal('6 ex7', getline(11))
+ call assert_equal('7x7f', getline(12))
+ call assert_equal('xxxxx', getline(13))
+ enew!
+endfunction
+
+function! Test_substitute_variants()
+ " Validate that all the 2-/3-letter variants which embed the flags into the
+ " command name actually work.
+ enew!
+ let ln = 'Testing string'
+ let variants = [
+ \ { 'cmd': ':s/Test/test/c', 'exp': 'testing string', 'prompt': 'y' },
+ \ { 'cmd': ':s/foo/bar/ce', 'exp': ln },
+ \ { 'cmd': ':s/t/r/cg', 'exp': 'Tesring srring', 'prompt': 'a' },
+ \ { 'cmd': ':s/t/r/ci', 'exp': 'resting string', 'prompt': 'y' },
+ \ { 'cmd': ':s/t/r/cI', 'exp': 'Tesring string', 'prompt': 'y' },
+ \ { 'cmd': ':s/t/r/cn', 'exp': ln },
+ \ { 'cmd': ':s/t/r/cp', 'exp': 'Tesring string', 'prompt': 'y' },
+ \ { 'cmd': ':s/t/r/cl', 'exp': 'Tesring string', 'prompt': 'y' },
+ \ { 'cmd': ':s/t/r/gc', 'exp': 'Tesring srring', 'prompt': 'a' },
+ \ { 'cmd': ':s/foo/bar/ge', 'exp': ln },
+ \ { 'cmd': ':s/t/r/g', 'exp': 'Tesring srring' },
+ \ { 'cmd': ':s/t/r/gi', 'exp': 'resring srring' },
+ \ { 'cmd': ':s/t/r/gI', 'exp': 'Tesring srring' },
+ \ { 'cmd': ':s/t/r/gn', 'exp': ln },
+ \ { 'cmd': ':s/t/r/gp', 'exp': 'Tesring srring' },
+ \ { 'cmd': ':s/t/r/gl', 'exp': 'Tesring srring' },
+ \ { 'cmd': ':s//r/gr', 'exp': 'Testr strr' },
+ \ { 'cmd': ':s/t/r/ic', 'exp': 'resting string', 'prompt': 'y' },
+ \ { 'cmd': ':s/foo/bar/ie', 'exp': ln },
+ \ { 'cmd': ':s/t/r/i', 'exp': 'resting string' },
+ \ { 'cmd': ':s/t/r/iI', 'exp': 'Tesring string' },
+ \ { 'cmd': ':s/t/r/in', 'exp': ln },
+ \ { 'cmd': ':s/t/r/ip', 'exp': 'resting string' },
+ \ { 'cmd': ':s//r/ir', 'exp': 'Testr string' },
+ \ { 'cmd': ':s/t/r/Ic', 'exp': 'Tesring string', 'prompt': 'y' },
+ \ { 'cmd': ':s/foo/bar/Ie', 'exp': ln },
+ \ { 'cmd': ':s/t/r/Ig', 'exp': 'Tesring srring' },
+ \ { 'cmd': ':s/t/r/Ii', 'exp': 'resting string' },
+ \ { 'cmd': ':s/t/r/I', 'exp': 'Tesring string' },
+ \ { 'cmd': ':s/t/r/Ip', 'exp': 'Tesring string' },
+ \ { 'cmd': ':s/t/r/Il', 'exp': 'Tesring string' },
+ \ { 'cmd': ':s//r/Ir', 'exp': 'Testr string' },
+ \ { 'cmd': ':s//r/rc', 'exp': 'Testr string', 'prompt': 'y' },
+ \ { 'cmd': ':s//r/rg', 'exp': 'Testr strr' },
+ \ { 'cmd': ':s//r/ri', 'exp': 'Testr string' },
+ \ { 'cmd': ':s//r/rI', 'exp': 'Testr string' },
+ \ { 'cmd': ':s//r/rn', 'exp': 'Testing string' },
+ \ { 'cmd': ':s//r/rp', 'exp': 'Testr string' },
+ \ { 'cmd': ':s//r/rl', 'exp': 'Testr string' },
+ \ { 'cmd': ':s//r/r', 'exp': 'Testr string' },
+ \]
+
+ for var in variants
+ for run in [1, 2]
+ let cmd = var.cmd
+ if run == 2 && cmd =~ "/.*/.*/."
+ " Change :s/from/to/{flags} to :s{flags}
+ let cmd = substitute(cmd, '/.*/', '', '')
+ endif
+ call setline(1, [ln])
+ let msg = printf('using "%s"', cmd)
+ let @/='ing'
+ let v:errmsg = ''
+ call feedkeys(cmd . "\<CR>" . get(var, 'prompt', ''), 'ntx')
+ " No error should exist (matters for testing e flag)
+ call assert_equal('', v:errmsg, msg)
+ call assert_equal(var.exp, getline('.'), msg)
+ endfor
+ endfor
+endfunction
+
+func Test_substitute_repeat()
+ " This caused an invalid memory access.
+ split Xfile
+ s/^/x
+ call feedkeys("Qsc\<CR>y", 'tx')
+ bwipe!
+endfunc
+
+" Tests for *sub-replace-special* and *sub-replace-expression* on :substitute.
+
+" Execute a list of :substitute command tests
+func Run_SubCmd_Tests(tests)
+ enew!
+ for t in a:tests
+ let start = line('.') + 1
+ let end = start + len(t[2]) - 1
+ exe "normal o" . t[0]
+ call cursor(start, 1)
+ exe t[1]
+ call assert_equal(t[2], getline(start, end), t[1])
+ endfor
+ enew!
+endfunc
+
+func Test_sub_cmd_1()
+ set magic
+ set cpo&
+
+ " List entry format: [input, cmd, output]
+ let tests = [['A', 's/A/&&/', ['AA']],
+ \ ['B', 's/B/\&/', ['&']],
+ \ ['C123456789', 's/C\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)/\0\9\8\7\6\5\4\3\2\1/', ['C123456789987654321']],
+ \ ['D', 's/D/d/', ['d']],
+ \ ['E', 's/E/~/', ['d']],
+ \ ['F', 's/F/\~/', ['~']],
+ \ ['G', 's/G/\ugg/', ['Gg']],
+ \ ['H', 's/H/\Uh\Eh/', ['Hh']],
+ \ ['I', 's/I/\lII/', ['iI']],
+ \ ['J', 's/J/\LJ\EJ/', ['jJ']],
+ \ ['K', 's/K/\Uk\ek/', ['Kk']],
+ \ ['lLl', "s/L/\<C-V>\<C-M>/", ["l\<C-V>", 'l']],
+ \ ['mMm', 's/M/\r/', ['m', 'm']],
+ \ ['nNn', "s/N/\\\<C-V>\<C-M>/", ["n\<C-V>", 'n']],
+ \ ['oOo', 's/O/\n/', ["o\no"]],
+ \ ['pPp', 's/P/\b/', ["p\<C-H>p"]],
+ \ ['qQq', 's/Q/\t/', ["q\tq"]],
+ \ ['rRr', 's/R/\\/', ['r\r']],
+ \ ['sSs', 's/S/\c/', ['scs']],
+ \ ['tTt', "s/T/\<C-V>\<C-J>/", ["t\<C-V>\<C-J>t"]],
+ \ ['U', 's/U/\L\uuUu\l\EU/', ['UuuU']],
+ \ ['V', 's/V/\U\lVvV\u\Ev/', ['vVVv']]
+ \ ]
+ call Run_SubCmd_Tests(tests)
+endfunc
+
+func Test_sub_cmd_2()
+ set nomagic
+ set cpo&
+
+ " List entry format: [input, cmd, output]
+ let tests = [['A', 's/A/&&/', ['&&']],
+ \ ['B', 's/B/\&/', ['B']],
+ \ ['C123456789', 's/\mC\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)/\0\9\8\7\6\5\4\3\2\1/', ['C123456789987654321']],
+ \ ['D', 's/D/d/', ['d']],
+ \ ['E', 's/E/~/', ['~']],
+ \ ['F', 's/F/\~/', ['~']],
+ \ ['G', 's/G/\ugg/', ['Gg']],
+ \ ['H', 's/H/\Uh\Eh/', ['Hh']],
+ \ ['I', 's/I/\lII/', ['iI']],
+ \ ['J', 's/J/\LJ\EJ/', ['jJ']],
+ \ ['K', 's/K/\Uk\ek/', ['Kk']],
+ \ ['lLl', "s/L/\<C-V>\<C-M>/", ["l\<C-V>", 'l']],
+ \ ['mMm', 's/M/\r/', ['m', 'm']],
+ \ ['nNn', "s/N/\\\<C-V>\<C-M>/", ["n\<C-V>", 'n']],
+ \ ['oOo', 's/O/\n/', ["o\no"]],
+ \ ['pPp', 's/P/\b/', ["p\<C-H>p"]],
+ \ ['qQq', 's/Q/\t/', ["q\tq"]],
+ \ ['rRr', 's/R/\\/', ['r\r']],
+ \ ['sSs', 's/S/\c/', ['scs']],
+ \ ['tTt', "s/T/\<C-V>\<C-J>/", ["t\<C-V>\<C-J>t"]],
+ \ ['U', 's/U/\L\uuUu\l\EU/', ['UuuU']],
+ \ ['V', 's/V/\U\lVvV\u\Ev/', ['vVVv']]
+ \ ]
+ call Run_SubCmd_Tests(tests)
+endfunc
+
+func Test_sub_cmd_3()
+ set nomagic
+ set cpo&
+
+ " List entry format: [input, cmd, output]
+ let tests = [['aAa', "s/A/\\='\\'/", ['a\a']],
+ \ ['bBb', "s/B/\\='\\\\'/", ['b\\b']],
+ \ ['cCc', "s/C/\\='\<C-V>\<C-M>'/", ["c\<C-V>", 'c']],
+ \ ['dDd', "s/D/\\='\\\<C-V>\<C-M>'/", ["d\\\<C-V>", 'd']],
+ \ ['eEe', "s/E/\\='\\\\\<C-V>\<C-M>'/", ["e\\\\\<C-V>", 'e']],
+ \ ['fFf', "s/F/\\='\r'/", ['f', 'f']],
+ \ ['gGg', "s/G/\\='\<C-V>\<C-J>'/", ["g\<C-V>", 'g']],
+ \ ['hHh', "s/H/\\='\\\<C-V>\<C-J>'/", ["h\\\<C-V>", 'h']],
+ \ ['iIi', "s/I/\\='\\\\\<C-V>\<C-J>'/", ["i\\\\\<C-V>", 'i']],
+ \ ['jJj', "s/J/\\='\n'/", ['j', 'j']],
+ \ ['kKk', 's/K/\="\r"/', ['k', 'k']],
+ \ ['lLl', 's/L/\="\n"/', ['l', 'l']]
+ \ ]
+ call Run_SubCmd_Tests(tests)
+endfunc
+
+" Test for submatch() on :substitue.
+func Test_sub_cmd_4()
+ set magic&
+ set cpo&
+
+ " List entry format: [input, cmd, output]
+ let tests = [ ['aAa', "s/A/\\=substitute(submatch(0), '.', '\\', '')/",
+ \ ['a\a']],
+ \ ['bBb', "s/B/\\=substitute(submatch(0), '.', '\\', '')/",
+ \ ['b\b']],
+ \ ['cCc', "s/C/\\=substitute(submatch(0), '.', '\<C-V>\<C-M>', '')/",
+ \ ["c\<C-V>", 'c']],
+ \ ['dDd', "s/D/\\=substitute(submatch(0), '.', '\\\<C-V>\<C-M>', '')/",
+ \ ["d\<C-V>", 'd']],
+ \ ['eEe', "s/E/\\=substitute(submatch(0), '.', '\\\\\<C-V>\<C-M>', '')/",
+ \ ["e\\\<C-V>", 'e']],
+ \ ['fFf', "s/F/\\=substitute(submatch(0), '.', '\\r', '')/",
+ \ ['f', 'f']],
+ \ ['gGg', 's/G/\=substitute(submatch(0), ".", "\<C-V>\<C-J>", "")/',
+ \ ["g\<C-V>", 'g']],
+ \ ['hHh', 's/H/\=substitute(submatch(0), ".", "\\\<C-V>\<C-J>", "")/',
+ \ ["h\<C-V>", 'h']],
+ \ ['iIi', 's/I/\=substitute(submatch(0), ".", "\\\\\<C-V>\<C-J>", "")/',
+ \ ["i\\\<C-V>", 'i']],
+ \ ['jJj', "s/J/\\=substitute(submatch(0), '.', '\\n', '')/",
+ \ ['j', 'j']],
+ \ ['kKk', "s/K/\\=substitute(submatch(0), '.', '\\r', '')/",
+ \ ['k', 'k']],
+ \ ['lLl', "s/L/\\=substitute(submatch(0), '.', '\\n', '')/",
+ \ ['l', 'l']],
+ \ ]
+ call Run_SubCmd_Tests(tests)
+endfunc
+
+func Test_sub_cmd_5()
+ set magic&
+ set cpo&
+
+ " List entry format: [input, cmd, output]
+ let tests = [ ['A123456789', 's/A\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)/\=submatch(0) . submatch(9) . submatch(8) . submatch(7) . submatch(6) . submatch(5) . submatch(4) . submatch(3) . submatch(2) . submatch(1)/', ['A123456789987654321']],
+ \ ['B123456789', 's/B\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)/\=string([submatch(0, 1), submatch(9, 1), submatch(8, 1), submatch(7, 1), submatch(6, 1), submatch(5, 1), submatch(4, 1), submatch(3, 1), submatch(2, 1), submatch(1, 1)])/', ["[['B123456789'], ['9'], ['8'], ['7'], ['6'], ['5'], ['4'], ['3'], ['2'], ['1']]"]],
+ \ ]
+ call Run_SubCmd_Tests(tests)
+endfunc
+
+" Test for *:s%* on :substitute.
+func Test_sub_cmd_6()
+ throw "skipped: Nvim removed POSIX-related 'cpoptions' flags"
+ set magic&
+ set cpo+=/
+
+ " List entry format: [input, cmd, output]
+ let tests = [ ['A', 's/A/a/', ['a']],
+ \ ['B', 's/B/%/', ['a']],
+ \ ]
+ call Run_SubCmd_Tests(tests)
+
+ set cpo-=/
+ let tests = [ ['C', 's/C/c/', ['c']],
+ \ ['D', 's/D/%/', ['%']],
+ \ ]
+ call Run_SubCmd_Tests(tests)
+
+ set cpo&
+endfunc
+
+" Test for :s replacing \n with line break.
+func Test_sub_cmd_7()
+ set magic&
+ set cpo&
+
+ " List entry format: [input, cmd, output]
+ let tests = [ ["A\<C-V>\<C-M>A", 's/A./\=submatch(0)/', ['A', 'A']],
+ \ ["B\<C-V>\<C-J>B", 's/B./\=submatch(0)/', ['B', 'B']],
+ \ ["C\<C-V>\<C-J>C", 's/C./\=strtrans(string(submatch(0, 1)))/', [strtrans("['C\<C-J>']C")]],
+ \ ["D\<C-V>\<C-J>\nD", 's/D.\nD/\=strtrans(string(submatch(0, 1)))/', [strtrans("['D\<C-J>', 'D']")]],
+ \ ["E\<C-V>\<C-J>\n\<C-V>\<C-J>\n\<C-V>\<C-J>\n\<C-V>\<C-J>\n\<C-V>\<C-J>E", 's/E\_.\{-}E/\=strtrans(string(submatch(0, 1)))/', [strtrans("['E\<C-J>', '\<C-J>', '\<C-J>', '\<C-J>', '\<C-J>E']")]],
+ \ ]
+ call Run_SubCmd_Tests(tests)
+
+ exe "normal oQ\nQ\<Esc>k"
+ call assert_fails('s/Q[^\n]Q/\=submatch(0)."foobar"/', 'E486')
+ enew!
+endfunc
+
+func TitleString()
+ let check = 'foo' =~ 'bar'
+ return ""
+endfunc
+
+func Test_sub_cmd_8()
+ set titlestring=%{TitleString()}
+
+ enew!
+ call append(0, ['', 'test_one', 'test_two'])
+ call cursor(1,1)
+ /^test_one/s/.*/\="foo\nbar"/
+ call assert_equal('foo', getline(2))
+ call assert_equal('bar', getline(3))
+ call feedkeys(':/^test_two/s/.*/\="foo\nbar"/c', "t")
+ call feedkeys("\<CR>y", "xt")
+ call assert_equal('foo', getline(4))
+ call assert_equal('bar', getline(5))
+
+ enew!
+ set titlestring&
+endfunc
+
+" Test for *sub-replace-special* and *sub-replace-expression* on substitute().
+func Test_sub_replace_1()
+ " Run the tests with 'magic' on
+ set magic
+ set cpo&
+ call assert_equal('AA', substitute('A', 'A', '&&', ''))
+ call assert_equal('&', substitute('B', 'B', '\&', ''))
+ call assert_equal('C123456789987654321', substitute('C123456789', 'C\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)', '\0\9\8\7\6\5\4\3\2\1', ''))
+ call assert_equal('d', substitute('D', 'D', 'd', ''))
+ call assert_equal('~', substitute('E', 'E', '~', ''))
+ call assert_equal('~', substitute('F', 'F', '\~', ''))
+ call assert_equal('Gg', substitute('G', 'G', '\ugg', ''))
+ call assert_equal('Hh', substitute('H', 'H', '\Uh\Eh', ''))
+ call assert_equal('iI', substitute('I', 'I', '\lII', ''))
+ call assert_equal('jJ', substitute('J', 'J', '\LJ\EJ', ''))
+ call assert_equal('Kk', substitute('K', 'K', '\Uk\ek', ''))
+ call assert_equal("l\<C-V>\<C-M>l",
+ \ substitute('lLl', 'L', "\<C-V>\<C-M>", ''))
+ call assert_equal("m\<C-M>m", substitute('mMm', 'M', '\r', ''))
+ call assert_equal("n\<C-V>\<C-M>n",
+ \ substitute('nNn', 'N', "\\\<C-V>\<C-M>", ''))
+ call assert_equal("o\no", substitute('oOo', 'O', '\n', ''))
+ call assert_equal("p\<C-H>p", substitute('pPp', 'P', '\b', ''))
+ call assert_equal("q\tq", substitute('qQq', 'Q', '\t', ''))
+ call assert_equal('r\r', substitute('rRr', 'R', '\\', ''))
+ call assert_equal('scs', substitute('sSs', 'S', '\c', ''))
+ call assert_equal("u\nu", substitute('uUu', 'U', "\n", ''))
+ call assert_equal("v\<C-H>v", substitute('vVv', 'V', "\b", ''))
+ call assert_equal("w\\w", substitute('wWw', 'W', "\\", ''))
+ call assert_equal("x\<C-M>x", substitute('xXx', 'X', "\r", ''))
+ call assert_equal("YyyY", substitute('Y', 'Y', '\L\uyYy\l\EY', ''))
+ call assert_equal("zZZz", substitute('Z', 'Z', '\U\lZzZ\u\Ez', ''))
+endfunc
+
+func Test_sub_replace_2()
+ " Run the tests with 'magic' off
+ set nomagic
+ set cpo&
+ call assert_equal('AA', substitute('A', 'A', '&&', ''))
+ call assert_equal('&', substitute('B', 'B', '\&', ''))
+ call assert_equal('C123456789987654321', substitute('C123456789', 'C\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)', '\0\9\8\7\6\5\4\3\2\1', ''))
+ call assert_equal('d', substitute('D', 'D', 'd', ''))
+ call assert_equal('~', substitute('E', 'E', '~', ''))
+ call assert_equal('~', substitute('F', 'F', '\~', ''))
+ call assert_equal('Gg', substitute('G', 'G', '\ugg', ''))
+ call assert_equal('Hh', substitute('H', 'H', '\Uh\Eh', ''))
+ call assert_equal('iI', substitute('I', 'I', '\lII', ''))
+ call assert_equal('jJ', substitute('J', 'J', '\LJ\EJ', ''))
+ call assert_equal('Kk', substitute('K', 'K', '\Uk\ek', ''))
+ call assert_equal("l\<C-V>\<C-M>l",
+ \ substitute('lLl', 'L', "\<C-V>\<C-M>", ''))
+ call assert_equal("m\<C-M>m", substitute('mMm', 'M', '\r', ''))
+ call assert_equal("n\<C-V>\<C-M>n",
+ \ substitute('nNn', 'N', "\\\<C-V>\<C-M>", ''))
+ call assert_equal("o\no", substitute('oOo', 'O', '\n', ''))
+ call assert_equal("p\<C-H>p", substitute('pPp', 'P', '\b', ''))
+ call assert_equal("q\tq", substitute('qQq', 'Q', '\t', ''))
+ call assert_equal('r\r', substitute('rRr', 'R', '\\', ''))
+ call assert_equal('scs', substitute('sSs', 'S', '\c', ''))
+ call assert_equal("t\<C-M>t", substitute('tTt', 'T', "\r", ''))
+ call assert_equal("u\nu", substitute('uUu', 'U', "\n", ''))
+ call assert_equal("v\<C-H>v", substitute('vVv', 'V', "\b", ''))
+ call assert_equal('w\w', substitute('wWw', 'W', "\\", ''))
+ call assert_equal('XxxX', substitute('X', 'X', '\L\uxXx\l\EX', ''))
+ call assert_equal('yYYy', substitute('Y', 'Y', '\U\lYyY\u\Ey', ''))
+endfunc
+
+func Test_sub_replace_3()
+ set magic&
+ set cpo&
+ call assert_equal('a\a', substitute('aAa', 'A', '\="\\"', ''))
+ call assert_equal('b\\b', substitute('bBb', 'B', '\="\\\\"', ''))
+ call assert_equal("c\rc", substitute('cCc', 'C', "\\=\"\r\"", ''))
+ call assert_equal("d\\\rd", substitute('dDd', 'D', "\\=\"\\\\\r\"", ''))
+ call assert_equal("e\\\\\re", substitute('eEe', 'E', "\\=\"\\\\\\\\\r\"", ''))
+ call assert_equal('f\rf', substitute('fFf', 'F', '\="\\r"', ''))
+ call assert_equal('j\nj', substitute('jJj', 'J', '\="\\n"', ''))
+ call assert_equal("k\<C-M>k", substitute('kKk', 'K', '\="\r"', ''))
+ call assert_equal("l\nl", substitute('lLl', 'L', '\="\n"', ''))
+endfunc
+
+" Test for submatch() on substitute().
+func Test_sub_replace_4()
+ set magic&
+ set cpo&
+ call assert_equal('a\a', substitute('aAa', 'A',
+ \ '\=substitute(submatch(0), ".", "\\", "")', ''))
+ call assert_equal('b\b', substitute('bBb', 'B',
+ \ '\=substitute(submatch(0), ".", "\\\\", "")', ''))
+ call assert_equal("c\<C-V>\<C-M>c", substitute('cCc', 'C', '\=substitute(submatch(0), ".", "\<C-V>\<C-M>", "")', ''))
+ call assert_equal("d\<C-V>\<C-M>d", substitute('dDd', 'D', '\=substitute(submatch(0), ".", "\\\<C-V>\<C-M>", "")', ''))
+ call assert_equal("e\\\<C-V>\<C-M>e", substitute('eEe', 'E', '\=substitute(submatch(0), ".", "\\\\\<C-V>\<C-M>", "")', ''))
+ call assert_equal("f\<C-M>f", substitute('fFf', 'F', '\=substitute(submatch(0), ".", "\\r", "")', ''))
+ call assert_equal("j\nj", substitute('jJj', 'J', '\=substitute(submatch(0), ".", "\\n", "")', ''))
+ call assert_equal("k\rk", substitute('kKk', 'K', '\=substitute(submatch(0), ".", "\r", "")', ''))
+ call assert_equal("l\nl", substitute('lLl', 'L', '\=substitute(submatch(0), ".", "\n", "")', ''))
+endfunc
+
+func Test_sub_replace_5()
+ set magic&
+ set cpo&
+ call assert_equal('A123456789987654321', substitute('A123456789',
+ \ 'A\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)',
+ \ '\=submatch(0) . submatch(9) . submatch(8) . ' .
+ \ 'submatch(7) . submatch(6) . submatch(5) . ' .
+ \ 'submatch(4) . submatch(3) . submatch(2) . submatch(1)',
+ \ ''))
+ call assert_equal("[['A123456789'], ['9'], ['8'], ['7'], ['6'], " .
+ \ "['5'], ['4'], ['3'], ['2'], ['1']]",
+ \ substitute('A123456789',
+ \ 'A\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)',
+ \ '\=string([submatch(0, 1), submatch(9, 1), ' .
+ \ 'submatch(8, 1), submatch(7, 1), submatch(6, 1), ' .
+ \ 'submatch(5, 1), submatch(4, 1), submatch(3, 1), ' .
+ \ 'submatch(2, 1), submatch(1, 1)])',
+ \ ''))
+endfunc
+
+func Test_sub_replace_6()
+ set magic&
+ " set cpo+=/
+ call assert_equal('a', substitute('A', 'A', 'a', ''))
+ call assert_equal('%', substitute('B', 'B', '%', ''))
+ " set cpo-=/
+ call assert_equal('c', substitute('C', 'C', 'c', ''))
+ call assert_equal('%', substitute('D', 'D', '%', ''))
+endfunc
+
+func Test_sub_replace_7()
+ set magic&
+ set cpo&
+ call assert_equal('AA', substitute('AA', 'A.', '\=submatch(0)', ''))
+ call assert_equal("B\nB", substitute("B\nB", 'B.', '\=submatch(0)', ''))
+ call assert_equal("['B\n']B", substitute("B\nB", 'B.', '\=string(submatch(0, 1))', ''))
+ call assert_equal('-abab', substitute('-bb', '\zeb', 'a', 'g'))
+ call assert_equal('c-cbcbc', substitute('-bb', '\ze', 'c', 'g'))
+endfunc
+
+" Test for *:s%* on :substitute.
+func Test_sub_replace_8()
+ new
+ set magic&
+ set cpo&
+ $put =',,X'
+ s/\(^\|,\)\ze\(,\|X\)/\1N/g
+ call assert_equal('N,,NX', getline("$"))
+ $put =',,Y'
+ let cmd = ':s/\(^\|,\)\ze\(,\|Y\)/\1N/gc'
+ call feedkeys(cmd . "\<CR>a", "xt")
+ call assert_equal('N,,NY', getline("$"))
+ :$put =',,Z'
+ let cmd = ':s/\(^\|,\)\ze\(,\|Z\)/\1N/gc'
+ call feedkeys(cmd . "\<CR>yy", "xt")
+ call assert_equal('N,,NZ', getline("$"))
+ enew! | close
+endfunc
+
+func Test_sub_replace_9()
+ new
+ set magic&
+ set cpo&
+ $put ='xxx'
+ call feedkeys(":s/x/X/gc\<CR>yyq", "xt")
+ call assert_equal('XXx', getline("$"))
+ enew! | close
+endfunc
+
+func Test_sub_replace_10()
+ set magic&
+ set cpo&
+ call assert_equal('a1a2a3a', substitute('123', '\zs', 'a', 'g'))
+ call assert_equal('aaa', substitute('123', '\zs.', 'a', 'g'))
+ call assert_equal('1a2a3a', substitute('123', '.\zs', 'a', 'g'))
+ call assert_equal('a1a2a3a', substitute('123', '\ze', 'a', 'g'))
+ call assert_equal('a1a2a3', substitute('123', '\ze.', 'a', 'g'))
+ call assert_equal('aaa', substitute('123', '.\ze', 'a', 'g'))
+ call assert_equal('aa2a3a', substitute('123', '1\|\ze', 'a', 'g'))
+ call assert_equal('1aaa', substitute('123', '1\zs\|[23]', 'a', 'g'))
+endfunc
diff --git a/src/nvim/testdir/test_suspend.vim b/src/nvim/testdir/test_suspend.vim
new file mode 100644
index 0000000000..a9964b0400
--- /dev/null
+++ b/src/nvim/testdir/test_suspend.vim
@@ -0,0 +1,51 @@
+" Test :suspend
+
+source shared.vim
+
+func Test_suspend()
+ if !has('terminal') || !executable('/bin/sh')
+ return
+ endif
+
+ let buf = term_start('/bin/sh')
+ " Wait for shell prompt.
+ call WaitForAssert({-> assert_match('[$#] $', term_getline(buf, '.'))})
+
+ call term_sendkeys(buf, v:progpath
+ \ . " --clean -X"
+ \ . " -c 'set nu'"
+ \ . " -c 'call setline(1, \"foo\")'"
+ \ . " Xfoo\<CR>")
+ " Cursor in terminal buffer should be on first line in spawned vim.
+ call WaitForAssert({-> assert_equal(' 1 foo', term_getline(buf, '.'))})
+
+ for suspend_cmd in [":suspend\<CR>",
+ \ ":stop\<CR>",
+ \ ":suspend!\<CR>",
+ \ ":stop!\<CR>",
+ \ "\<C-Z>"]
+ " Suspend and wait for shell prompt.
+ call term_sendkeys(buf, suspend_cmd)
+ call WaitForAssert({-> assert_match('[$#] $', term_getline(buf, '.'))})
+
+ " Without 'autowrite', buffer should not be written.
+ call assert_equal(0, filereadable('Xfoo'))
+
+ call term_sendkeys(buf, "fg\<CR>")
+ call WaitForAssert({-> assert_equal(' 1 foo', term_getline(buf, '.'))})
+ endfor
+
+ " Test that :suspend! with 'autowrite' writes content of buffers if modified.
+ call term_sendkeys(buf, ":set autowrite\<CR>")
+ call assert_equal(0, filereadable('Xfoo'))
+ call term_sendkeys(buf, ":suspend\<CR>")
+ " Wait for shell prompt.
+ call WaitForAssert({-> assert_match('[$#] $', term_getline(buf, '.'))})
+ call assert_equal(['foo'], readfile('Xfoo'))
+ call term_sendkeys(buf, "fg\<CR>")
+ call WaitForAssert({-> assert_equal(' 1 foo', term_getline(buf, '.'))})
+
+ exe buf . 'bwipe!'
+ call delete('Xfoo')
+ set autowrite&
+endfunc
diff --git a/src/nvim/testdir/test_swap.vim b/src/nvim/testdir/test_swap.vim
new file mode 100644
index 0000000000..bc7b7c00d3
--- /dev/null
+++ b/src/nvim/testdir/test_swap.vim
@@ -0,0 +1,63 @@
+" Tests for the swap feature
+
+" Tests for 'directory' option.
+func Test_swap_directory()
+ if !has("unix")
+ return
+ endif
+ let content = ['start of testfile',
+ \ 'line 2 Abcdefghij',
+ \ 'line 3 Abcdefghij',
+ \ 'end of testfile']
+ call writefile(content, 'Xtest1')
+
+ " '.', swap file in the same directory as file
+ set dir=.,~
+
+ " Verify that the swap file doesn't exist in the current directory
+ call assert_equal([], glob(".Xtest1*.swp", 1, 1, 1))
+ edit Xtest1
+ let swfname = split(execute("swapname"))[0]
+ call assert_equal([swfname], glob(swfname, 1, 1, 1))
+
+ " './dir', swap file in a directory relative to the file
+ set dir=./Xtest2,.,~
+
+ call mkdir("Xtest2")
+ edit Xtest1
+ call assert_equal([], glob(swfname, 1, 1, 1))
+ let swfname = "Xtest2/Xtest1.swp"
+ call assert_equal(swfname, split(execute("swapname"))[0])
+ call assert_equal([swfname], glob("Xtest2/*", 1, 1, 1))
+
+ " 'dir', swap file in directory relative to the current dir
+ set dir=Xtest.je,~
+
+ call mkdir("Xtest.je")
+ call writefile(content, 'Xtest2/Xtest3')
+ edit Xtest2/Xtest3
+ call assert_equal(["Xtest2/Xtest3"], glob("Xtest2/*", 1, 1, 1))
+ let swfname = "Xtest.je/Xtest3.swp"
+ call assert_equal(swfname, split(execute("swapname"))[0])
+ call assert_equal([swfname], glob("Xtest.je/*", 1, 1, 1))
+
+ set dir&
+ call delete("Xtest1")
+ call delete("Xtest2", "rf")
+ call delete("Xtest.je", "rf")
+endfunc
+
+func Test_missing_dir()
+ call mkdir('Xswapdir')
+ exe 'set directory=' . getcwd() . '/Xswapdir'
+
+ call assert_equal('', glob('foo'))
+ call assert_equal('', glob('bar'))
+ edit foo/x.txt
+ " This should not give a warning for an existing swap file.
+ split bar/x.txt
+ only
+
+ set directory&
+ call delete('Xswapdir', 'rf')
+endfunc
diff --git a/src/nvim/testdir/test_syn_attr.vim b/src/nvim/testdir/test_syn_attr.vim
new file mode 100644
index 0000000000..64aab3411d
--- /dev/null
+++ b/src/nvim/testdir/test_syn_attr.vim
@@ -0,0 +1,28 @@
+" Test syntax highlighting functions.
+
+func Test_missing_attr()
+ hi Mine cterm=italic
+ call assert_equal('Mine', synIDattr(hlID("Mine"), "name"))
+ call assert_equal('1', synIDattr(hlID("Mine"), "italic", 'cterm'))
+ hi Mine cterm=inverse
+ call assert_equal('1', synIDattr(hlID("Mine"), "inverse", 'cterm'))
+ hi Mine cterm=standout gui=undercurl
+ call assert_equal('1', synIDattr(hlID("Mine"), "standout", 'cterm'))
+ call assert_equal('1', synIDattr(hlID("Mine"), "undercurl", 'gui'))
+ hi Mine cterm=NONE gui=NONE
+ call assert_equal('', synIDattr(hlID("Mine"), "italic", 'cterm'))
+ call assert_equal('', synIDattr(hlID("Mine"), "inverse", 'cterm'))
+ call assert_equal('', synIDattr(hlID("Mine"), "standout", 'cterm'))
+ call assert_equal('', synIDattr(hlID("Mine"), "undercurl", 'gui'))
+
+ if has('gui')
+ let fontname = getfontname()
+ if fontname == ''
+ let fontname = 'something'
+ endif
+ exe "hi Mine guifg=blue guibg=red font='" . fontname . "'"
+ call assert_equal('blue', synIDattr(hlID("Mine"), "fg", 'gui'))
+ call assert_equal('red', synIDattr(hlID("Mine"), "bg", 'gui'))
+ call assert_equal(fontname, synIDattr(hlID("Mine"), "font", 'gui'))
+ endif
+endfunc
diff --git a/src/nvim/testdir/test_syntax.vim b/src/nvim/testdir/test_syntax.vim
index 309c0f460b..6978faeb7b 100644
--- a/src/nvim/testdir/test_syntax.vim
+++ b/src/nvim/testdir/test_syntax.vim
@@ -1,5 +1,7 @@
" Test for syntax and syntax iskeyword option
+source view_util.vim
+
func GetSyntaxItem(pat)
let c = ''
let a = ['a', getreg('a'), getregtype('a')]
@@ -50,7 +52,7 @@ func Test_syn_iskeyword()
setlocal isk-=_
call assert_equal('DLTD_BY', GetSyntaxItem('DLTD'))
/\<D\k\+\>/:norm! ygn
- let b2=@0
+ let b2 = @0
call assert_equal('DLTD', @0)
syn iskeyword clear
@@ -61,3 +63,443 @@ func Test_syn_iskeyword()
quit!
endfunc
+
+func Test_syntax_after_reload()
+ split Xsomefile
+ call setline(1, ['hello', 'there'])
+ w!
+ only!
+ setl filetype=hello
+ au FileType hello let g:gotit = 1
+ call assert_false(exists('g:gotit'))
+ edit other
+ buf Xsomefile
+ call assert_equal('hello', &filetype)
+ call assert_true(exists('g:gotit'))
+ call delete('Xsomefile')
+endfunc
+
+func Test_syntime()
+ if !has('profile')
+ return
+ endif
+
+ syntax on
+ syntime on
+ let a = execute('syntime report')
+ call assert_equal("\nNo Syntax items defined for this buffer", a)
+
+ view ../memfile_test.c
+ setfiletype cpp
+ redraw
+ let a = execute('syntime report')
+ call assert_match('^ TOTAL *COUNT *MATCH *SLOWEST *AVERAGE *NAME *PATTERN', a)
+ call assert_match(' \d*\.\d* \+[^0]\d* .* cppRawString ', a)
+ call assert_match(' \d*\.\d* \+[^0]\d* .* cppNumber ', a)
+
+ syntime off
+ syntime clear
+ let a = execute('syntime report')
+ call assert_match('^ TOTAL *COUNT *MATCH *SLOWEST *AVERAGE *NAME *PATTERN', a)
+ call assert_notmatch('.* cppRawString *', a)
+ call assert_notmatch('.* cppNumber*', a)
+ call assert_notmatch('[1-9]', a)
+
+ call assert_fails('syntime abc', 'E475')
+
+ syntax clear
+ let a = execute('syntime report')
+ call assert_equal("\nNo Syntax items defined for this buffer", a)
+
+ bd
+endfunc
+
+func Test_syntime_completion()
+ if !has('profile')
+ return
+ endif
+
+ call feedkeys(":syntime \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"syntime clear off on report', @:)
+endfunc
+
+func Test_syntax_list()
+ syntax on
+ let a = execute('syntax list')
+ call assert_equal("\nNo Syntax items defined for this buffer", a)
+
+ view ../memfile_test.c
+ setfiletype c
+
+ let a = execute('syntax list')
+ call assert_match('cInclude*', a)
+ call assert_match('cDefine', a)
+
+ let a = execute('syntax list cDefine')
+ call assert_notmatch('cInclude*', a)
+ call assert_match('cDefine', a)
+ call assert_match(' links to Macro$', a)
+
+ call assert_fails('syntax list ABCD', 'E28:')
+ call assert_fails('syntax list @ABCD', 'E392:')
+
+ syntax clear
+ let a = execute('syntax list')
+ call assert_equal("\nNo Syntax items defined for this buffer", a)
+
+ bd
+endfunc
+
+func Test_syntax_completion()
+ call feedkeys(":syn \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"syn case clear cluster conceal enable include iskeyword keyword list manual match off on region reset spell sync', @:)
+
+ call feedkeys(":syn case \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"syn case ignore match', @:)
+
+ call feedkeys(":syn spell \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"syn spell default notoplevel toplevel', @:)
+
+ call feedkeys(":syn sync \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"syn sync ccomment clear fromstart linebreaks= linecont lines= match maxlines= minlines= region', @:)
+
+ " Check that clearing "Aap" avoids it showing up before Boolean.
+ hi Aap ctermfg=blue
+ call feedkeys(":syn list \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_match('^"syn list Aap Boolean Character ', @:)
+ hi clear Aap
+
+ call feedkeys(":syn list \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_match('^"syn list Boolean Character ', @:)
+
+ call feedkeys(":syn match \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_match('^"syn match Boolean Character ', @:)
+endfunc
+
+func Test_syntax_arg_skipped()
+ syn clear
+ syntax case ignore
+ if 0
+ syntax case match
+ endif
+ call assert_match('case ignore', execute('syntax case'))
+
+ syn keyword Foo foo
+ call assert_match('Foo', execute('syntax'))
+ syn clear
+ call assert_match('case match', execute('syntax case'))
+ call assert_notmatch('Foo', execute('syntax'))
+
+ if has('conceal')
+ syn clear
+ syntax conceal on
+ if 0
+ syntax conceal off
+ endif
+ call assert_match('conceal on', execute('syntax conceal'))
+ syn clear
+ call assert_match('conceal off', execute('syntax conceal'))
+ endif
+
+ syntax conceal on
+ syntax conceal off
+ call assert_match('conceal off', execute('syntax conceal'))
+
+ syntax region Bar start=/</ end=/>/
+ if 0
+ syntax region NotTest start=/</ end=/>/ contains=@Spell
+ endif
+ call assert_match('Bar', execute('syntax'))
+ call assert_notmatch('NotTest', execute('syntax'))
+ call assert_notmatch('Spell', execute('syntax'))
+
+ hi Foo ctermfg=blue
+ let a = execute('hi Foo')
+ if 0
+ syntax rest
+ endif
+ call assert_equal(a, execute('hi Foo'))
+ hi clear Bar
+ hi clear Foo
+
+ set ft=tags
+ syn off
+ if 0
+ syntax enable
+ endif
+ call assert_match('No Syntax items defined', execute('syntax'))
+ syntax enable
+ call assert_match('tagComment', execute('syntax'))
+ set ft=
+
+ syn clear
+ if 0
+ syntax include @Spell nothing
+ endif
+ call assert_notmatch('Spell', execute('syntax'))
+
+ syn clear
+ syn iskeyword 48-57,$,_
+ call assert_match('48-57,$,_', execute('syntax iskeyword'))
+ if 0
+ syn clear
+ syn iskeyword clear
+ endif
+ call assert_match('48-57,$,_', execute('syntax iskeyword'))
+ syn iskeyword clear
+ call assert_match('not set', execute('syntax iskeyword'))
+ syn iskeyword 48-57,$,_
+ syn clear
+ call assert_match('not set', execute('syntax iskeyword'))
+
+ syn clear
+ syn keyword Foo foo
+ if 0
+ syn keyword NotAdded bar
+ endif
+ call assert_match('Foo', execute('syntax'))
+ call assert_notmatch('NotAdded', execute('highlight'))
+
+ syn clear
+ syn keyword Foo foo
+ call assert_match('Foo', execute('syntax'))
+ call assert_match('Foo', execute('syntax list'))
+ call assert_notmatch('Foo', execute('if 0 | syntax | endif'))
+ call assert_notmatch('Foo', execute('if 0 | syntax list | endif'))
+
+ syn clear
+ syn match Fopi /asdf/
+ if 0
+ syn match Fopx /asdf/
+ endif
+ call assert_match('Fopi', execute('syntax'))
+ call assert_notmatch('Fopx', execute('syntax'))
+
+ syn clear
+ syn spell toplevel
+ call assert_match('spell toplevel', execute('syntax spell'))
+ if 0
+ syn spell notoplevel
+ endif
+ call assert_match('spell toplevel', execute('syntax spell'))
+ syn spell notoplevel
+ call assert_match('spell notoplevel', execute('syntax spell'))
+ syn spell default
+ call assert_match('spell default', execute('syntax spell'))
+
+ syn clear
+ if 0
+ syntax cluster Spell
+ endif
+ call assert_notmatch('Spell', execute('syntax'))
+
+ syn clear
+ syn keyword Foo foo
+ syn sync ccomment
+ syn sync maxlines=5
+ if 0
+ syn sync maxlines=11
+ endif
+ call assert_match('on C-style comments', execute('syntax sync'))
+ call assert_match('maximal 5 lines', execute('syntax sync'))
+ syn sync clear
+ if 0
+ syn sync ccomment
+ endif
+ call assert_notmatch('on C-style comments', execute('syntax sync'))
+
+ syn clear
+endfunc
+
+func Test_syntax_invalid_arg()
+ call assert_fails('syntax case asdf', 'E390:')
+ if has('conceal')
+ call assert_fails('syntax conceal asdf', 'E390:')
+ endif
+ call assert_fails('syntax spell asdf', 'E390:')
+ call assert_fails('syntax clear @ABCD', 'E391:')
+ call assert_fails('syntax include @Xxx', 'E397:')
+ call assert_fails('syntax region X start="{"', 'E399:')
+ call assert_fails('syntax sync x', 'E404:')
+ call assert_fails('syntax keyword Abc a[', 'E789:')
+ call assert_fails('syntax keyword Abc a[bc]d', 'E890:')
+endfunc
+
+func Test_syn_sync()
+ syntax region HereGroup start=/this/ end=/that/
+ syntax sync match SyncHere grouphere HereGroup "pattern"
+ call assert_match('SyncHere', execute('syntax sync'))
+ syn sync clear
+ call assert_notmatch('SyncHere', execute('syntax sync'))
+ syn clear
+endfunc
+
+func Test_syn_clear()
+ syntax keyword Foo foo
+ syntax keyword Bar tar
+ call assert_match('Foo', execute('syntax'))
+ call assert_match('Bar', execute('syntax'))
+ call assert_equal('Foo', synIDattr(hlID("Foo"), "name"))
+ syn clear Foo
+ call assert_notmatch('Foo', execute('syntax'))
+ call assert_match('Bar', execute('syntax'))
+ call assert_equal('Foo', synIDattr(hlID("Foo"), "name"))
+ syn clear Foo Bar
+ call assert_notmatch('Foo', execute('syntax'))
+ call assert_notmatch('Bar', execute('syntax'))
+ hi clear Foo
+ call assert_equal('Foo', synIDattr(hlID("Foo"), "name"))
+ hi clear Bar
+endfunc
+
+func Test_invalid_name()
+ syn clear
+ syn keyword Nop yes
+ call assert_fails("syntax keyword Wr\x17ong bar", 'E669:')
+ syntax keyword @Wrong bar
+ call assert_match('W18:', execute('1messages'))
+ syn clear
+ hi clear Nop
+ hi clear @Wrong
+endfunc
+
+func Test_ownsyntax()
+ new Xfoo
+ call setline(1, '#define FOO')
+ syntax on
+ set filetype=c
+ ownsyntax perl
+ call assert_equal('perlComment', synIDattr(synID(line('.'), col('.'), 1), 'name'))
+ call assert_equal('c', b:current_syntax)
+ call assert_equal('perl', w:current_syntax)
+
+ " A new split window should have the original syntax.
+ split
+ call assert_equal('cDefine', synIDattr(synID(line('.'), col('.'), 1), 'name'))
+ call assert_equal('c', b:current_syntax)
+ call assert_equal(0, exists('w:current_syntax'))
+
+ wincmd x
+ call assert_equal('perlComment', synIDattr(synID(line("."), col("."), 1), "name"))
+
+ syntax off
+ set filetype&
+ %bw!
+endfunc
+
+func Test_ownsyntax_completion()
+ call feedkeys(":ownsyntax java\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"ownsyntax java javacc javascript', @:)
+endfunc
+
+func Test_highlight_invalid_arg()
+ if has('gui_running')
+ call assert_fails('hi XXX guifg=xxx', 'E254:')
+ endif
+ call assert_fails('hi DoesNotExist', 'E411:')
+ call assert_fails('hi link', 'E412:')
+ call assert_fails('hi link a', 'E412:')
+ call assert_fails('hi link a b c', 'E413:')
+ call assert_fails('hi XXX =', 'E415:')
+ call assert_fails('hi XXX cterm', 'E416:')
+ call assert_fails('hi XXX cterm=', 'E417:')
+ call assert_fails('hi XXX cterm=DoesNotExist', 'E418:')
+ call assert_fails('hi XXX ctermfg=DoesNotExist', 'E421:')
+ call assert_fails('hi XXX xxx=White', 'E423:')
+endfunc
+
+func Test_conceal()
+ if !has('conceal')
+ return
+ endif
+
+ new
+ call setline(1, ['', '123456'])
+ syn match test23 "23" conceal cchar=X
+ syn match test45 "45" conceal
+
+ set conceallevel=0
+ call assert_equal('123456 ', ScreenLines(2, 7)[0])
+ call assert_equal([[0, '', 0], [0, '', 0], [0, '', 0], [0, '', 0], [0, '', 0], [0, '', 0]], map(range(1, 6), 'synconcealed(2, v:val)'))
+
+ set conceallevel=1
+ call assert_equal('1X 6 ', ScreenLines(2, 7)[0])
+ call assert_equal([[0, '', 0], [1, 'X', 1], [1, 'X', 1], [1, ' ', 2], [1, ' ', 2], [0, '', 0]], map(range(1, 6), 'synconcealed(2, v:val)'))
+
+ set conceallevel=1
+ set listchars=conceal:Y
+ call assert_equal([[0, '', 0], [1, 'X', 1], [1, 'X', 1], [1, 'Y', 2], [1, 'Y', 2], [0, '', 0]], map(range(1, 6), 'synconcealed(2, v:val)'))
+ call assert_equal('1XY6 ', ScreenLines(2, 7)[0])
+
+ set conceallevel=2
+ call assert_match('1X6 ', ScreenLines(2, 7)[0])
+ call assert_equal([[0, '', 0], [1, 'X', 1], [1, 'X', 1], [1, '', 2], [1, '', 2], [0, '', 0]], map(range(1, 6), 'synconcealed(2, v:val)'))
+
+ set conceallevel=3
+ call assert_match('16 ', ScreenLines(2, 7)[0])
+ call assert_equal([[0, '', 0], [1, '', 1], [1, '', 1], [1, '', 2], [1, '', 2], [0, '', 0]], map(range(1, 6), 'synconcealed(2, v:val)'))
+
+ syn clear
+ set conceallevel&
+ bw!
+endfunc
+
+func Test_bg_detection()
+ if has('gui_running')
+ return
+ endif
+ " auto-detection of &bg, make sure sure it isn't set anywhere before
+ " this test
+ hi Normal ctermbg=0
+ call assert_equal('dark', &bg)
+ hi Normal ctermbg=4
+ call assert_equal('dark', &bg)
+ hi Normal ctermbg=12
+ call assert_equal('light', &bg)
+ hi Normal ctermbg=15
+ call assert_equal('light', &bg)
+
+ " manually-set &bg takes precedence over auto-detection
+ set bg=light
+ hi Normal ctermbg=4
+ call assert_equal('light', &bg)
+ set bg=dark
+ hi Normal ctermbg=12
+ call assert_equal('dark', &bg)
+endfunc
+
+fun Test_synstack_synIDtrans()
+ new
+ setfiletype c
+ syntax on
+ call setline(1, ' /* A comment with a TODO */')
+
+ call assert_equal([], synstack(1, 1))
+
+ norm f/
+ call assert_equal(['cComment', 'cCommentStart'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")'))
+ call assert_equal(['Comment', 'Comment'], map(synstack(line("."), col(".")), 'synIDattr(synIDtrans(v:val), "name")'))
+
+ norm fA
+ call assert_equal(['cComment'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")'))
+ call assert_equal(['Comment'], map(synstack(line("."), col(".")), 'synIDattr(synIDtrans(v:val), "name")'))
+
+ norm fT
+ call assert_equal(['cComment', 'cTodo'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")'))
+ call assert_equal(['Comment', 'Todo'], map(synstack(line("."), col(".")), 'synIDattr(synIDtrans(v:val), "name")'))
+
+ syn clear
+ bw!
+endfunc
+
+" Using \z() in a region with NFA failing should not crash.
+func Test_syn_wrong_z_one()
+ new
+ call setline(1, ['just some text', 'with foo and bar to match with'])
+ syn region FooBar start="foo\z(.*\)bar" end="\z1"
+ " call test_override("nfa_fail", 1)
+ redraw!
+ redraw!
+ " call test_override("ALL", 0)
+ bwipe!
+endfunc
diff --git a/src/nvim/testdir/test_system.vim b/src/nvim/testdir/test_system.vim
new file mode 100644
index 0000000000..d3c0594c03
--- /dev/null
+++ b/src/nvim/testdir/test_system.vim
@@ -0,0 +1,90 @@
+" Tests for system() and systemlist()
+
+function! Test_System()
+ if !executable('echo') || !executable('cat') || !executable('wc')
+ return
+ endif
+ let out = system('echo 123')
+ call assert_equal("123\n", out)
+
+ let out = systemlist('echo 123')
+ if &shell =~# 'cmd.exe$'
+ call assert_equal(["123\r"], out)
+ else
+ call assert_equal(['123'], out)
+ endif
+
+ call assert_equal('123', system('cat', '123'))
+ call assert_equal(['123'], systemlist('cat', '123'))
+ call assert_equal(["as\<NL>df"], systemlist('cat', ["as\<NL>df"]))
+
+ new Xdummy
+ call setline(1, ['asdf', "pw\<NL>er", 'xxxx'])
+ let out = system('wc -l', bufnr('%'))
+ " On OS/X we get leading spaces
+ let out = substitute(out, '^ *', '', '')
+ call assert_equal("3\n", out)
+
+ let out = systemlist('wc -l', bufnr('%'))
+ " On Windows we may get a trailing CR.
+ if out != ["3\r"]
+ " On OS/X we get leading spaces
+ if type(out) == v:t_list
+ let out[0] = substitute(out[0], '^ *', '', '')
+ endif
+ call assert_equal(['3'], out)
+ endif
+
+ let out = systemlist('cat', bufnr('%'))
+ " On Windows we may get a trailing CR.
+ if out != ["asdf\r", "pw\<NL>er\r", "xxxx\r"]
+ call assert_equal(['asdf', "pw\<NL>er", 'xxxx'], out)
+ endif
+ bwipe!
+
+ call assert_fails('call system("wc -l", 99999)', 'E86:')
+endfunction
+
+function! Test_system_exmode()
+ if has('unix') " echo $? only works on Unix
+ let cmd = ' -es --headless -u NONE -c "source Xscript" +q; echo "result=$?"'
+ " Need to put this in a script, "catch" isn't found after an unknown
+ " function.
+ call writefile(['try', 'call doesnotexist()', 'catch', 'endtry'], 'Xscript')
+ let a = system(v:progpath . cmd)
+ call assert_match('result=0', a)
+ call assert_equal(0, v:shell_error)
+ endif
+
+ " Error before try does set error flag.
+ call writefile(['call nosuchfunction()', 'try', 'call doesnotexist()', 'catch', 'endtry'], 'Xscript')
+ if has('unix') " echo $? only works on Unix
+ let a = system(v:progpath . cmd)
+ call assert_notequal('0', a[0])
+ endif
+
+ let cmd = ' -es --headless -u NONE -c "source Xscript" +q'
+ let a = system(v:progpath . cmd)
+ call assert_notequal(0, v:shell_error)
+ call delete('Xscript')
+
+ if has('unix') " echo $? only works on Unix
+ let cmd = ' -es --headless -u NONE -c "call doesnotexist()" +q; echo $?'
+ let a = system(v:progpath. cmd)
+ call assert_notequal(0, a[0])
+ endif
+
+ let cmd = ' -es --headless -u NONE -c "call doesnotexist()" +q'
+ let a = system(v:progpath. cmd)
+ call assert_notequal(0, v:shell_error)
+
+ if has('unix') " echo $? only works on Unix
+ let cmd = ' -es --headless -u NONE -c "call doesnotexist()|let a=1" +q; echo $?'
+ let a = system(v:progpath. cmd)
+ call assert_notequal(0, a[0])
+ endif
+
+ let cmd = ' -es --headless -u NONE -c "call doesnotexist()|let a=1" +q'
+ let a = system(v:progpath. cmd)
+ call assert_notequal(0, v:shell_error)
+endfunc
diff --git a/src/nvim/testdir/test_tab.vim b/src/nvim/testdir/test_tab.vim
new file mode 100644
index 0000000000..b847dbd962
--- /dev/null
+++ b/src/nvim/testdir/test_tab.vim
@@ -0,0 +1,45 @@
+
+" Tests for "r<Tab>" with 'smarttab' and 'expandtab' set/not set.
+" Also test that dv_ works correctly
+func Test_smarttab()
+ enew!
+ set smarttab expandtab ts=8 sw=4
+ " make sure that backspace works, no matter what termcap is used
+ exe "set t_kD=\<C-V>x7f t_kb=\<C-V>x08"
+ call append(0, ['start text',
+ \ "\t\tsome test text",
+ \ 'test text',
+ \ "\t\tother test text",
+ \ ' a cde',
+ \ ' f ghi',
+ \ 'test text',
+ \ ' Second line beginning with whitespace'
+ \ ])
+ call cursor(1, 1)
+ exe "normal /some\<CR>"
+ exe "normal r\t"
+ call assert_equal("\t\t ome test text", getline('.'))
+ set noexpandtab
+ exe "normal /other\<CR>"
+ exe "normal r\t"
+ call assert_equal("\t\t ther test text", getline('.'))
+
+ " Test replacing with Tabs and then backspacing to undo it
+ exe "normal j0wR\t\t\t\<BS>\<BS>\<BS>"
+ call assert_equal(" a cde", getline('.'))
+ " Test replacing with Tabs
+ exe "normal j0wR\t\t\t"
+ call assert_equal(" \t\thi", getline('.'))
+
+ " Test that copyindent works with expandtab set
+ set expandtab smartindent copyindent ts=8 sw=8 sts=8
+ exe "normal jo{\<CR>x"
+ call assert_equal('{', getline(line('.') - 1))
+ call assert_equal(' x', getline('.'))
+ set nosol
+ exe "normal /Second line/\<CR>"
+ exe "normal fwdv_"
+ call assert_equal(' with whitespace', getline('.'))
+ enew!
+ set expandtab& smartindent& copyindent& ts& sw& sts&
+endfunc
diff --git a/src/nvim/testdir/test_tabline.vim b/src/nvim/testdir/test_tabline.vim
new file mode 100644
index 0000000000..6c7a02d650
--- /dev/null
+++ b/src/nvim/testdir/test_tabline.vim
@@ -0,0 +1,43 @@
+function! TablineWithCaughtError()
+ let s:func_in_tabline_called = 1
+ try
+ call eval('unknown expression')
+ catch
+ endtry
+ return ''
+endfunction
+
+function! TablineWithError()
+ let s:func_in_tabline_called = 1
+ call eval('unknown expression')
+ return ''
+endfunction
+
+function! Test_caught_error_in_tabline()
+ let showtabline_save = &showtabline
+ set showtabline=2
+ let s:func_in_tabline_called = 0
+ let tabline = '%{TablineWithCaughtError()}'
+ let &tabline = tabline
+ redraw!
+ call assert_true(s:func_in_tabline_called)
+ call assert_equal(tabline, &tabline)
+ set tabline=
+ let &showtabline = showtabline_save
+endfunction
+
+function! Test_tabline_will_be_disabled_with_error()
+ let showtabline_save = &showtabline
+ set showtabline=2
+ let s:func_in_tabline_called = 0
+ let tabline = '%{TablineWithError()}'
+ try
+ let &tabline = tabline
+ redraw!
+ catch
+ endtry
+ call assert_true(s:func_in_tabline_called)
+ call assert_equal('', &tabline)
+ set tabline=
+ let &showtabline = showtabline_save
+endfunction
diff --git a/src/nvim/testdir/test_tabpage.vim b/src/nvim/testdir/test_tabpage.vim
new file mode 100644
index 0000000000..add9b3d7cf
--- /dev/null
+++ b/src/nvim/testdir/test_tabpage.vim
@@ -0,0 +1,550 @@
+" Tests for tabpage
+
+
+function Test_tabpage()
+ bw!
+ " Simple test for opening and closing a tab page
+ tabnew
+ call assert_equal(2, tabpagenr())
+ quit
+
+ " Open three tab pages and use ":tabdo"
+ 0tabnew
+ 1tabnew
+ $tabnew
+ %del
+ tabdo call append(line('$'), tabpagenr())
+ tabclose! 2
+ tabrewind
+ let line1 = getline('$')
+ undo
+ q
+ tablast
+ let line2 = getline('$')
+ q!
+ call append(line('$'), line1)
+ call append(line('$'), line2)
+ unlet line1 line2
+ call assert_equal(['', '3', '1', '4'], getline(1, '$'))
+ "
+ " Test for settabvar() and gettabvar() functions. Open a new tab page and
+ " set 3 variables to a number, string and a list. Verify that the variables
+ " are correctly set.
+ tabnew
+ tabfirst
+ call settabvar(2, 'val_num', 100)
+ call settabvar(2, 'val_str', 'SetTabVar test')
+ call settabvar(2, 'val_list', ['red', 'blue', 'green'])
+ "
+ call assert_true(gettabvar(2, 'val_num') == 100 && gettabvar(2, 'val_str') == 'SetTabVar test' && gettabvar(2, 'val_list') == ['red', 'blue', 'green'])
+
+ tabnext 2
+ call assert_true(t:val_num == 100 && t:val_str == 'SetTabVar test' && t:val_list == ['red', 'blue', 'green'])
+ tabclose
+
+ " Test for ":tab drop exist-file" to keep current window.
+ sp test1
+ tab drop test1
+ call assert_true(tabpagenr('$') == 1 && winnr('$') == 2 && winnr() == 1)
+ close
+ "
+ "
+ " Test for ":tab drop new-file" to keep current window of tabpage 1.
+ split
+ tab drop newfile
+ call assert_true(tabpagenr('$') == 2 && tabpagewinnr(1, '$') == 2 && tabpagewinnr(1) == 1)
+ tabclose
+ q
+ "
+ "
+ " Test for ":tab drop multi-opend-file" to keep current tabpage and window.
+ new test1
+ tabnew
+ new test1
+ tab drop test1
+ call assert_true(tabpagenr() == 2 && tabpagewinnr(2, '$') == 2 && tabpagewinnr(2) == 1)
+ tabclose
+ q
+ "
+ "
+ " Test for ":tab drop vertical-split-window" to jump test1 buffer
+ tabedit test1
+ vnew
+ tabfirst
+ tab drop test1
+ call assert_equal([2, 2, 2, 2], [tabpagenr('$'), tabpagenr(), tabpagewinnr(2, '$'), tabpagewinnr(2)])
+ 1tabonly
+ "
+ "
+ for i in range(9) | tabnew | endfor
+ normal! 1gt
+ call assert_equal(1, tabpagenr())
+ tabmove 5
+ call assert_equal(5, tabpagenr())
+ .tabmove
+ call assert_equal(5, tabpagenr())
+ tabmove -
+ call assert_equal(4, tabpagenr())
+ tabmove +
+ call assert_equal(5, tabpagenr())
+ tabmove -2
+ call assert_equal(3, tabpagenr())
+ tabmove +4
+ call assert_equal(7, tabpagenr())
+ tabmove
+ call assert_equal(10, tabpagenr())
+ 0tabmove
+ call assert_equal(1, tabpagenr())
+ $tabmove
+ call assert_equal(10, tabpagenr())
+ tabmove 0
+ call assert_equal(1, tabpagenr())
+ tabmove $
+ call assert_equal(10, tabpagenr())
+ 3tabmove
+ call assert_equal(4, tabpagenr())
+ 7tabmove 5
+ call assert_equal(5, tabpagenr())
+
+ " The following are a no-op
+ norm! 2gt
+ call assert_equal(2, tabpagenr())
+ tabmove 2
+ call assert_equal(2, tabpagenr())
+ 2tabmove
+ call assert_equal(2, tabpagenr())
+ tabmove 1
+ call assert_equal(2, tabpagenr())
+ 1tabmove
+ call assert_equal(2, tabpagenr())
+
+ call assert_fails("99tabmove", 'E16:')
+ call assert_fails("+99tabmove", 'E16:')
+ call assert_fails("-99tabmove", 'E16:')
+ call assert_fails("tabmove foo", 'E474:')
+ call assert_fails("tabmove 99", 'E474:')
+ call assert_fails("tabmove +99", 'E474:')
+ call assert_fails("tabmove -99", 'E474:')
+ call assert_fails("tabmove -3+", 'E474:')
+ call assert_fails("tabmove $3", 'E474:')
+ 1tabonly!
+endfunc
+
+" Test autocommands
+function Test_tabpage_with_autocmd()
+ if !has('autocmd')
+ return
+ endif
+ command -nargs=1 -bar C :call add(s:li, '=== ' . <q-args> . ' ===')|<args>
+ augroup TestTabpageGroup
+ au!
+ autocmd TabEnter * call add(s:li, 'TabEnter')
+ autocmd WinEnter * call add(s:li, 'WinEnter')
+ autocmd BufEnter * call add(s:li, 'BufEnter')
+ autocmd TabLeave * call add(s:li, 'TabLeave')
+ autocmd WinLeave * call add(s:li, 'WinLeave')
+ autocmd BufLeave * call add(s:li, 'BufLeave')
+ augroup END
+
+ let s:li = []
+ let t:a='a'
+ C tab split
+ call assert_equal(['=== tab split ===', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter'], s:li)
+ let s:li = []
+ let t:a='b'
+ C tabnew
+ call assert_equal(['=== tabnew ===', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', 'BufLeave', 'BufEnter'], s:li)
+ let t:a='c'
+ let s:li = split(join(map(range(1, tabpagenr('$')), 'gettabvar(v:val, "a")')) , '\s\+')
+ call assert_equal(['a', 'b', 'c'], s:li)
+
+ let s:li = []
+ C call map(range(1, tabpagenr('$')), 'settabvar(v:val, ''a'', v:val*2)')
+ call assert_equal(["=== call map(range(1, tabpagenr('$')), 'settabvar(v:val, ''a'', v:val*2)') ==="], s:li)
+ let s:li = split(join(map(range(1, tabpagenr('$')), 'gettabvar(v:val, "a")')) , '\s\+')
+ call assert_equal(['2', '4', '6'], s:li)
+
+ let s:li = []
+ let w:a='a'
+ C vsplit
+ call assert_equal(['=== vsplit ===', 'WinLeave', 'WinEnter'], s:li)
+ let s:li = []
+ let w:a='a'
+ let tabn=tabpagenr()
+ let winr=range(1, winnr('$'))
+ C tabnext 1
+ call assert_equal(['=== tabnext 1 ===', 'BufLeave', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', 'BufEnter'], s:li)
+ let s:li = split(join(map(copy(winr), 'gettabwinvar('.tabn.', v:val, "a")')), '\s\+')
+ call assert_equal(['a', 'a'], s:li)
+ let s:li = []
+ C call map(copy(winr), 'settabwinvar('.tabn.', v:val, ''a'', v:val*2)')
+ let s:li = split(join(map(copy(winr), 'gettabwinvar('.tabn.', v:val, "a")')), '\s\+')
+ call assert_equal(['2', '4'], s:li)
+
+ augroup TabDestructive
+ autocmd TabEnter * :C tabnext 2 | C tabclose 3
+ augroup END
+ let s:li = []
+ C tabnext 3
+ call assert_equal(['=== tabnext 3 ===', 'BufLeave', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', '=== tabnext 2 ===', '=== tabclose 3 ==='], s:li)
+ call assert_equal(['2/2'], [tabpagenr().'/'.tabpagenr('$')])
+
+ autocmd! TabDestructive TabEnter
+ let s:li = []
+ C tabnew
+ call assert_equal(['=== tabnew ===', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', 'BufLeave', 'BufEnter'], s:li)
+ let s:li = []
+ C tabnext 1
+ call assert_equal(['=== tabnext 1 ===', 'BufLeave', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', 'BufEnter'], s:li)
+
+ autocmd TabDestructive TabEnter * nested :C tabnext 2 | C tabclose 3
+ let s:li = []
+ call assert_equal(3, tabpagenr('$'))
+ C tabnext 2
+ call assert_equal(2, tabpagenr('$'))
+ call assert_equal(['=== tabnext 2 ===', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', '=== tabnext 2 ===', '=== tabclose 3 ==='], s:li)
+ call assert_equal(['2/2'], [tabpagenr().'/'.tabpagenr('$')])
+
+ delcommand C
+ autocmd! TabDestructive
+ augroup! TabDestructive
+ autocmd! TestTabpageGroup
+ augroup! TestTabpageGroup
+ 1tabonly!
+endfunction
+
+function Test_tabpage_with_tab_modifier()
+ for n in range(4)
+ tabedit
+ endfor
+
+ function s:check_tab(pre_nr, cmd, post_nr)
+ exec 'tabnext ' . a:pre_nr
+ exec a:cmd
+ call assert_equal(a:post_nr, tabpagenr())
+ call assert_equal('help', &buftype)
+ helpclose
+ endfunc
+
+ call s:check_tab(1, 'tab help', 2)
+ call s:check_tab(1, '3tab help', 4)
+ call s:check_tab(1, '.tab help', 2)
+ call s:check_tab(1, '.+1tab help', 3)
+ call s:check_tab(1, '0tab help', 1)
+ call s:check_tab(2, '+tab help', 4)
+ call s:check_tab(2, '+2tab help', 5)
+ call s:check_tab(4, '-tab help', 4)
+ call s:check_tab(4, '-2tab help', 3)
+ call s:check_tab(3, '$tab help', 6)
+ call assert_fails('99tab help', 'E16:')
+ call assert_fails('+99tab help', 'E16:')
+ call assert_fails('-99tab help', 'E16:')
+
+ delfunction s:check_tab
+ 1tabonly!
+endfunction
+
+function Check_tab_count(pre_nr, cmd, post_nr)
+ exec 'tabnext' a:pre_nr
+ normal! G
+ exec a:cmd
+ call assert_equal(a:post_nr, tabpagenr(), a:cmd)
+endfunc
+
+" Test for [count] of tabnext
+function Test_tabpage_with_tabnext()
+ for n in range(4)
+ tabedit
+ call setline(1, ['', '', '3'])
+ endfor
+
+ call Check_tab_count(1, 'tabnext', 2)
+ call Check_tab_count(1, '3tabnext', 3)
+ call Check_tab_count(1, '.tabnext', 1)
+ call Check_tab_count(1, '.+1tabnext', 2)
+ call Check_tab_count(2, '+tabnext', 3)
+ call Check_tab_count(2, '+2tabnext', 4)
+ call Check_tab_count(4, '-tabnext', 3)
+ call Check_tab_count(4, '-2tabnext', 2)
+ call Check_tab_count(3, '$tabnext', 5)
+ call assert_fails('0tabnext', 'E16:')
+ call assert_fails('99tabnext', 'E16:')
+ call assert_fails('+99tabnext', 'E16:')
+ call assert_fails('-99tabnext', 'E16:')
+ call Check_tab_count(1, 'tabnext 3', 3)
+ call Check_tab_count(2, 'tabnext +', 3)
+ call Check_tab_count(2, 'tabnext +2', 4)
+ call Check_tab_count(4, 'tabnext -', 3)
+ call Check_tab_count(4, 'tabnext -2', 2)
+ call Check_tab_count(3, 'tabnext $', 5)
+ call assert_fails('tabnext 0', 'E474:')
+ call assert_fails('tabnext .', 'E474:')
+ call assert_fails('tabnext -+', 'E474:')
+ call assert_fails('tabnext +2-', 'E474:')
+ call assert_fails('tabnext $3', 'E474:')
+ call assert_fails('tabnext 99', 'E474:')
+ call assert_fails('tabnext +99', 'E474:')
+ call assert_fails('tabnext -99', 'E474:')
+
+ 1tabonly!
+endfunction
+
+" Test for [count] of tabprevious
+function Test_tabpage_with_tabprevious()
+ for n in range(5)
+ tabedit
+ call setline(1, ['', '', '3'])
+ endfor
+
+ for cmd in ['tabNext', 'tabprevious']
+ call Check_tab_count(6, cmd, 5)
+ call Check_tab_count(6, '3' . cmd, 3)
+ call Check_tab_count(6, '8' . cmd, 4)
+ call Check_tab_count(6, cmd . ' 3', 3)
+ call Check_tab_count(6, cmd . ' 8', 4)
+ for n in range(2)
+ for c in ['0', '.+3', '+', '+2' , '-', '-2' , '$', '+99', '-99']
+ if n == 0 " pre count
+ let entire_cmd = c . cmd
+ let err_code = 'E16:'
+ else
+ let entire_cmd = cmd . ' ' . c
+ let err_code = 'E474:'
+ endif
+ call assert_fails(entire_cmd, err_code)
+ endfor
+ endfor
+ endfor
+
+ 1tabonly!
+endfunction
+
+function s:reconstruct_tabpage_for_test(nr)
+ let n = (a:nr > 2) ? a:nr - 2 : 1
+ 1tabonly!
+ 0tabedit n0
+ for n in range(1, n)
+ exec '$tabedit n' . n
+ if n == 1
+ call setline(1, ['', '', '3'])
+ endif
+ endfor
+endfunc
+
+func Test_tabpage_ctrl_pgup_pgdown()
+ enew!
+ tabnew tab1
+ tabnew tab2
+
+ call assert_equal(3, tabpagenr())
+ exe "norm! \<C-PageUp>"
+ call assert_equal(2, tabpagenr())
+ exe "norm! \<C-PageDown>"
+ call assert_equal(3, tabpagenr())
+
+ " Check wrapping at last or first page.
+ exe "norm! \<C-PageDown>"
+ call assert_equal(1, tabpagenr())
+ exe "norm! \<C-PageUp>"
+ call assert_equal(3, tabpagenr())
+
+ " With a count, <C-PageUp> and <C-PageDown> are not symmetrical somehow:
+ " - {count}<C-PageUp> goes {count} pages downward (relative count)
+ " - {count}<C-PageDown> goes to page number {count} (absolute count)
+ exe "norm! 2\<C-PageUp>"
+ call assert_equal(1, tabpagenr())
+ exe "norm! 2\<C-PageDown>"
+ call assert_equal(2, tabpagenr())
+
+ 1tabonly!
+endfunc
+
+" Test for [count] of tabclose
+function Test_tabpage_with_tabclose()
+
+ " pre count
+ call s:reconstruct_tabpage_for_test(6)
+ call Check_tab_count(3, 'tabclose!', 3)
+ call Check_tab_count(1, '3tabclose', 1)
+ call Check_tab_count(4, '4tabclose', 3)
+ call Check_tab_count(3, '1tabclose', 2)
+ call Check_tab_count(2, 'tabclose', 1)
+ call assert_equal(1, tabpagenr('$'))
+ call assert_equal('', bufname(''))
+
+ call s:reconstruct_tabpage_for_test(6)
+ call Check_tab_count(2, '$tabclose', 2)
+ call Check_tab_count(4, '.tabclose', 4)
+ call Check_tab_count(3, '.+tabclose', 3)
+ call Check_tab_count(3, '.-2tabclose', 2)
+ call Check_tab_count(1, '.+1tabclose!', 1)
+ call assert_equal(1, tabpagenr('$'))
+ call assert_equal('', bufname(''))
+
+ " post count
+ call s:reconstruct_tabpage_for_test(6)
+ call Check_tab_count(3, 'tabclose!', 3)
+ call Check_tab_count(1, 'tabclose 3', 1)
+ call Check_tab_count(4, 'tabclose 4', 3)
+ call Check_tab_count(3, 'tabclose 1', 2)
+ call Check_tab_count(2, 'tabclose', 1)
+ call assert_equal(1, tabpagenr('$'))
+ call assert_equal('', bufname(''))
+
+ call s:reconstruct_tabpage_for_test(6)
+ call Check_tab_count(2, 'tabclose $', 2)
+ call Check_tab_count(4, 'tabclose', 4)
+ call Check_tab_count(3, 'tabclose +', 3)
+ call Check_tab_count(3, 'tabclose -2', 2)
+ call Check_tab_count(1, 'tabclose! +1', 1)
+ call assert_equal(1, tabpagenr('$'))
+ call assert_equal('', bufname(''))
+
+ call s:reconstruct_tabpage_for_test(6)
+ for n in range(2)
+ for c in ['0', '$3', '99', '+99', '-99']
+ if n == 0 " pre count
+ let entire_cmd = c . 'tabclose'
+ let err_code = 'E16:'
+ else
+ let entire_cmd = 'tabclose ' . c
+ let err_code = 'E474:'
+ endif
+ call assert_fails(entire_cmd, err_code)
+ call assert_equal(6, tabpagenr('$'))
+ endfor
+ endfor
+
+ call assert_fails('3tabclose', 'E37:')
+ call assert_fails('tabclose 3', 'E37:')
+ call assert_fails('tabclose -+', 'E474:')
+ call assert_fails('tabclose +2-', 'E474:')
+ call assert_equal(6, tabpagenr('$'))
+
+ 1tabonly!
+endfunction
+
+" Test for [count] of tabonly
+function Test_tabpage_with_tabonly()
+
+ " Test for the normal behavior (pre count only)
+ let tc = [ [4, '.', '!'], [2, '.+', ''], [3, '.-2', '!'], [1, '.+1', '!'] ]
+ for c in tc
+ call s:reconstruct_tabpage_for_test(6)
+ let entire_cmd = c[1] . 'tabonly' . c[2]
+ call Check_tab_count(c[0], entire_cmd, 1)
+ call assert_equal(1, tabpagenr('$'))
+ endfor
+
+ " Test for the normal behavior
+ let tc2 = [ [3, '', ''], [1, '3', ''], [4, '4', '!'], [3, '1', '!'],
+ \ [2, '', '!'],
+ \ [2, '$', '!'], [3, '+', '!'], [3, '-2', '!'], [3, '+1', '!']
+ \ ]
+ for n in range(2)
+ for c in tc2
+ call s:reconstruct_tabpage_for_test(6)
+ if n == 0 " pre count
+ let entire_cmd = c[1] . 'tabonly' . c[2]
+ else
+ let entire_cmd = 'tabonly' . c[2] . ' ' . c[1]
+ endif
+ call Check_tab_count(c[0], entire_cmd, 1)
+ call assert_equal(1, tabpagenr('$'))
+ endfor
+ endfor
+
+ " Test for the error behavior
+ for n in range(2)
+ for c in ['0', '$3', '99', '+99', '-99']
+ call s:reconstruct_tabpage_for_test(6)
+ if n == 0 " pre count
+ let entire_cmd = c . 'tabonly'
+ let err_code = 'E16:'
+ else
+ let entire_cmd = 'tabonly ' . c
+ let err_code = 'E474:'
+ endif
+ call assert_fails(entire_cmd, err_code)
+ call assert_equal(6, tabpagenr('$'))
+ endfor
+ endfor
+
+ " Test for the error behavior (post count only)
+ for c in tc
+ call s:reconstruct_tabpage_for_test(6)
+ let entire_cmd = 'tabonly' . c[2] . ' ' . c[1]
+ let err_code = 'E474:'
+ call assert_fails(entire_cmd, err_code)
+ call assert_equal(6, tabpagenr('$'))
+ endfor
+
+ call assert_fails('tabonly -+', 'E474:')
+ call assert_fails('tabonly +2-', 'E474:')
+ call assert_equal(6, tabpagenr('$'))
+
+ 1tabonly!
+ new
+ only!
+endfunction
+
+func Test_tabnext_on_buf_unload1()
+ " This once caused a crash
+ new
+ tabedit
+ tabfirst
+ au BufUnload <buffer> tabnext
+ q
+
+ while tabpagenr('$') > 1
+ bwipe!
+ endwhile
+endfunc
+
+func Test_tabnext_on_buf_unload2()
+ " This once caused a crash
+ tabedit
+ autocmd BufUnload <buffer> tabnext
+ file x
+ edit y
+
+ while tabpagenr('$') > 1
+ bwipe!
+ endwhile
+endfunc
+
+func Test_close_on_quitpre()
+ " This once caused a crash
+ edit Xtest
+ new
+ only
+ set bufhidden=delete
+ au QuitPre <buffer> close
+ tabnew tab1
+ tabnew tab2
+ 1tabn
+ q!
+ call assert_equal(1, tabpagenr())
+ call assert_equal(2, tabpagenr('$'))
+ " clean up
+ while tabpagenr('$') > 1
+ bwipe!
+ endwhile
+ buf Xtest
+endfunc
+
+func Test_tabs()
+ enew!
+ tabnew tab1
+ norm ixxx
+ let a=split(execute(':tabs'), "\n")
+ call assert_equal(['Tab page 1',
+ \ ' [No Name]',
+ \ 'Tab page 2',
+ \ '> + tab1'], a)
+
+ 1tabonly!
+ bw!
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_tagcase.vim b/src/nvim/testdir/test_tagcase.vim
new file mode 100644
index 0000000000..833cb9f990
--- /dev/null
+++ b/src/nvim/testdir/test_tagcase.vim
@@ -0,0 +1,73 @@
+" test 'tagcase' option
+
+func Test_tagcase()
+ call writefile(["Bar\tXtext\t3", "Foo\tXtext\t2", "foo\tXtext\t4"], 'Xtags')
+ set tags=Xtags
+ e Xtext
+
+ for &ic in [0, 1]
+ for &scs in [0, 1]
+ for &g:tc in ["followic", "ignore", "match", "followscs", "smart"]
+ for &l:tc in ["", "followic", "ignore", "match", "followscs", "smart"]
+ let smart = 0
+ if &l:tc != ''
+ let tc = &l:tc
+ else
+ let tc = &g:tc
+ endif
+ if tc == 'followic'
+ let ic = &ic
+ elseif tc == 'ignore'
+ let ic = 1
+ elseif tc == 'followscs'
+ let ic = &ic
+ let smart = &scs
+ elseif tc == 'smart'
+ let ic = 1
+ let smart = 1
+ else
+ let ic = 0
+ endif
+ if ic && smart
+ call assert_equal(['foo', 'Foo'], map(taglist("^foo$"), {i, v -> v.name}))
+ call assert_equal(['Foo'], map(taglist("^Foo$"), {i, v -> v.name}))
+ elseif ic
+ call assert_equal(['foo', 'Foo'], map(taglist("^foo$"), {i, v -> v.name}))
+ call assert_equal(['Foo', 'foo'], map(taglist("^Foo$"), {i, v -> v.name}))
+ else
+ call assert_equal(['foo'], map(taglist("^foo$"), {i, v -> v.name}))
+ call assert_equal(['Foo'], map(taglist("^Foo$"), {i, v -> v.name}))
+ endif
+ endfor
+ endfor
+ endfor
+ endfor
+
+ call delete('Xtags')
+ set ic&
+ setg tc&
+ setl tc&
+ set scs&
+endfunc
+
+func Test_set_tagcase()
+ " Verify default values.
+ set ic&
+ setg tc&
+ setl tc&
+ call assert_equal(0, &ic)
+ call assert_equal('followic', &g:tc)
+ call assert_equal('followic', &l:tc)
+ call assert_equal('followic', &tc)
+
+ " Verify that the local setting accepts <empty> but that the global setting
+ " does not. The first of these (setting the local value to <empty>) should
+ " succeed; the other two should fail.
+ setl tc=
+ call assert_fails('setg tc=', 'E474:')
+ call assert_fails('set tc=', 'E474:')
+
+ set ic&
+ setg tc&
+ setl tc&
+endfunc
diff --git a/src/nvim/testdir/test_tagjump.vim b/src/nvim/testdir/test_tagjump.vim
new file mode 100644
index 0000000000..f9bd8b5246
--- /dev/null
+++ b/src/nvim/testdir/test_tagjump.vim
@@ -0,0 +1,261 @@
+" Tests for tagjump (tags and special searches)
+
+" SEGV occurs in older versions. (At least 7.4.1748 or older)
+func Test_ptag_with_notagstack()
+ set notagstack
+ call assert_fails('ptag does_not_exist_tag_name', 'E426')
+ set tagstack&vim
+endfunc
+
+func Test_cancel_ptjump()
+ set tags=Xtags
+ call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
+ \ "word\tfile1\tcmd1",
+ \ "word\tfile2\tcmd2"],
+ \ 'Xtags')
+
+ only!
+ call feedkeys(":ptjump word\<CR>\<CR>", "xt")
+ help
+ call assert_equal(2, winnr('$'))
+
+ call delete('Xtags')
+ quit
+endfunc
+
+func Test_static_tagjump()
+ set tags=Xtags
+ call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
+ \ "one\tXfile1\t/^one/;\"\tf\tfile:\tsignature:(void)",
+ \ "word\tXfile2\tcmd2"],
+ \ 'Xtags')
+ new Xfile1
+ call setline(1, ['empty', 'one()', 'empty'])
+ write
+ tag one
+ call assert_equal(2, line('.'))
+
+ bwipe!
+ set tags&
+ call delete('Xtags')
+ call delete('Xfile1')
+endfunc
+
+func Test_duplicate_tagjump()
+ set tags=Xtags
+ call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
+ \ "thesame\tXfile1\t1;\"\td\tfile:",
+ \ "thesame\tXfile1\t2;\"\td\tfile:",
+ \ "thesame\tXfile1\t3;\"\td\tfile:",
+ \ ],
+ \ 'Xtags')
+ new Xfile1
+ call setline(1, ['thesame one', 'thesame two', 'thesame three'])
+ write
+ tag thesame
+ call assert_equal(1, line('.'))
+ tnext
+ call assert_equal(2, line('.'))
+ tnext
+ call assert_equal(3, line('.'))
+
+ bwipe!
+ set tags&
+ call delete('Xtags')
+ call delete('Xfile1')
+endfunc
+
+func Test_tagjump_switchbuf()
+ set tags=Xtags
+ call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
+ \ "second\tXfile1\t2",
+ \ "third\tXfile1\t3",],
+ \ 'Xtags')
+ call writefile(['first', 'second', 'third'], 'Xfile1')
+
+ enew | only
+ set switchbuf=
+ stag second
+ call assert_equal(2, winnr('$'))
+ call assert_equal(2, line('.'))
+ stag third
+ call assert_equal(3, winnr('$'))
+ call assert_equal(3, line('.'))
+
+ enew | only
+ set switchbuf=useopen
+ stag second
+ call assert_equal(2, winnr('$'))
+ call assert_equal(2, line('.'))
+ stag third
+ call assert_equal(2, winnr('$'))
+ call assert_equal(3, line('.'))
+
+ enew | only
+ set switchbuf=usetab
+ tab stag second
+ call assert_equal(2, tabpagenr('$'))
+ call assert_equal(2, line('.'))
+ 1tabnext | stag third
+ call assert_equal(2, tabpagenr('$'))
+ call assert_equal(3, line('.'))
+
+ tabclose!
+ enew | only
+ call delete('Xfile1')
+ call delete('Xtags')
+ set switchbuf&vim
+endfunc
+
+" Tests for [ CTRL-I and CTRL-W CTRL-I commands
+function Test_keyword_jump()
+ call writefile(["#include Xinclude", "",
+ \ "",
+ \ "/* test text test tex start here",
+ \ " some text",
+ \ " test text",
+ \ " start OK if found this line",
+ \ " start found wrong line",
+ \ "test text"], 'Xtestfile')
+ call writefile(["/* test text test tex start here",
+ \ " some text",
+ \ " test text",
+ \ " start OK if found this line",
+ \ " start found wrong line",
+ \ "test text"], 'Xinclude')
+ new Xtestfile
+ call cursor(1,1)
+ call search("start")
+ exe "normal! 5[\<C-I>"
+ call assert_equal(" start OK if found this line", getline('.'))
+ call cursor(1,1)
+ call search("start")
+ exe "normal! 5\<C-W>\<C-I>"
+ call assert_equal(" start OK if found this line", getline('.'))
+ enew! | only
+ call delete('Xtestfile')
+ call delete('Xinclude')
+endfunction
+
+" Test for jumping to a tag with 'hidden' set, with symbolic link in path of
+" tag. This only works for Unix, because of the symbolic link.
+func Test_tag_symbolic()
+ if !has('unix')
+ return
+ endif
+ set hidden
+ call delete("Xtest.dir", "rf")
+ call system("ln -s . Xtest.dir")
+ " Create a tags file with the current directory name inserted.
+ call writefile([
+ \ "SECTION_OFF " . getcwd() . "/Xtest.dir/Xtest.c /^#define SECTION_OFF 3$/",
+ \ '',
+ \ ], 'Xtags')
+ call writefile(['#define SECTION_OFF 3',
+ \ '#define NUM_SECTIONS 3'], 'Xtest.c')
+
+ " Try jumping to a tag, but with a path that contains a symbolic link. When
+ " wrong, this will give the ATTENTION message. The next space will then be
+ " eaten by hit-return, instead of moving the cursor to 'd'.
+ set tags=Xtags
+ enew!
+ call append(0, 'SECTION_OFF')
+ call cursor(1,1)
+ exe "normal \<C-]> "
+ call assert_equal('Xtest.c', expand('%:t'))
+ call assert_equal(2, col('.'))
+
+ set hidden&
+ set tags&
+ enew!
+ call delete('Xtags')
+ call delete('Xtest.c')
+ call delete("Xtest.dir", "rf")
+ %bwipe!
+endfunc
+
+" Tests for tag search with !_TAG_FILE_ENCODING.
+" Depends on the test83-tags2 and test83-tags3 files.
+func Test_tag_file_encoding()
+ throw 'skipped: Nvim removed test83-tags2, test83-tags3'
+ if has('vms')
+ return
+ endif
+
+ if !has('iconv') || iconv("\x82\x60", "cp932", "utf-8") != "\uff21"
+ return
+ endif
+
+ let save_enc = &encoding
+ set encoding=utf8
+
+ let content = ['text for tags1', 'abcdefghijklmnopqrs']
+ call writefile(content, 'Xtags1.txt')
+ let content = ['text for tags2', '๏ผก๏ผข๏ผฃ']
+ call writefile(content, 'Xtags2.txt')
+ let content = ['text for tags3', '๏ผก๏ผข๏ผฃ']
+ call writefile(content, 'Xtags3.txt')
+ let content = ['!_TAG_FILE_ENCODING utf-8 //', 'abcdefghijklmnopqrs Xtags1.txt /abcdefghijklmnopqrs']
+ call writefile(content, 'Xtags1')
+
+ " case1:
+ new
+ set tags=Xtags1
+ tag abcdefghijklmnopqrs
+ call assert_equal('Xtags1.txt', expand('%:t'))
+ call assert_equal('abcdefghijklmnopqrs', getline('.'))
+ close
+
+ " case2:
+ new
+ set tags=test83-tags2
+ tag /.๏ผข๏ผฃ
+ call assert_equal('Xtags2.txt', expand('%:t'))
+ call assert_equal('๏ผก๏ผข๏ผฃ', getline('.'))
+ close
+
+ " case3:
+ new
+ set tags=test83-tags3
+ tag abc50
+ call assert_equal('Xtags3.txt', expand('%:t'))
+ call assert_equal('๏ผก๏ผข๏ผฃ', getline('.'))
+ close
+
+ set tags&
+ let &encoding = save_enc
+ call delete('Xtags1.txt')
+ call delete('Xtags2.txt')
+ call delete('Xtags3.txt')
+ call delete('Xtags1')
+endfunc
+
+func Test_tagjump_etags()
+ if !has('emacs_tags')
+ return
+ endif
+ call writefile([
+ \ "void foo() {}",
+ \ "int main(int argc, char **argv)",
+ \ "{",
+ \ "\tfoo();",
+ \ "\treturn 0;",
+ \ "}",
+ \ ], 'Xmain.c')
+
+ call writefile([
+ \ "\x0c",
+ \ "Xmain.c,64",
+ \ "void foo() {}\x7ffoo\x011,0",
+ \ "int main(int argc, char **argv)\x7fmain\x012,14",
+ \ ], 'Xtags')
+ set tags=Xtags
+ ta foo
+ call assert_equal('void foo() {}', getline('.'))
+
+ call delete('Xtags')
+ call delete('Xmain.c')
+ bwipe!
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_taglist.vim b/src/nvim/testdir/test_taglist.vim
new file mode 100644
index 0000000000..3ad2025915
--- /dev/null
+++ b/src/nvim/testdir/test_taglist.vim
@@ -0,0 +1,63 @@
+" test 'taglist' function and :tags command
+
+func Test_taglist()
+ call writefile([
+ \ "FFoo\tXfoo\t1",
+ \ "FBar\tXfoo\t2",
+ \ "BFoo\tXbar\t1",
+ \ "BBar\tXbar\t2"
+ \ ], 'Xtags')
+ set tags=Xtags
+ split Xtext
+
+ call assert_equal(['FFoo', 'BFoo'], map(taglist("Foo"), {i, v -> v.name}))
+ call assert_equal(['FFoo', 'BFoo'], map(taglist("Foo", "Xtext"), {i, v -> v.name}))
+ call assert_equal(['FFoo', 'BFoo'], map(taglist("Foo", "Xfoo"), {i, v -> v.name}))
+ call assert_equal(['BFoo', 'FFoo'], map(taglist("Foo", "Xbar"), {i, v -> v.name}))
+
+ call delete('Xtags')
+ bwipe
+endfunc
+
+func Test_taglist_native_etags()
+ if !has('emacs_tags')
+ return
+ endif
+ call writefile([
+ \ "\x0c",
+ \ "src/os_unix.c,13491",
+ \ "set_signals(\x7f1335,32699",
+ \ "reset_signals(\x7f1407,34136",
+ \ ], 'Xtags')
+
+ set tags=Xtags
+
+ call assert_equal([['set_signals', '1335,32699'], ['reset_signals', '1407,34136']],
+ \ map(taglist('set_signals'), {i, v -> [v.name, v.cmd]}))
+
+ call delete('Xtags')
+endfunc
+
+func Test_taglist_ctags_etags()
+ if !has('emacs_tags')
+ return
+ endif
+ call writefile([
+ \ "\x0c",
+ \ "src/os_unix.c,13491",
+ \ "set_signals(void)\x7fset_signals\x011335,32699",
+ \ "reset_signals(void)\x7freset_signals\x011407,34136",
+ \ ], 'Xtags')
+
+ set tags=Xtags
+
+ call assert_equal([['set_signals', '1335,32699'], ['reset_signals', '1407,34136']],
+ \ map(taglist('set_signals'), {i, v -> [v.name, v.cmd]}))
+
+ call delete('Xtags')
+endfunc
+
+func Test_tags_too_long()
+ call assert_fails('tag ' . repeat('x', 1020), 'E426')
+ tags
+endfunc
diff --git a/src/nvim/testdir/test_textformat.vim b/src/nvim/testdir/test_textformat.vim
new file mode 100644
index 0000000000..999566c6ac
--- /dev/null
+++ b/src/nvim/testdir/test_textformat.vim
@@ -0,0 +1,168 @@
+" Tests for the various 'formatoptions' settings
+func Test_text_format()
+ enew!
+
+ setl noai tw=2 fo=t
+ call append('$', [
+ \ '{',
+ \ ' ',
+ \ '',
+ \ '}'])
+ exe "normal /^{/+1\n0"
+ normal gRa b
+ let lnum = line('.')
+ call assert_equal([
+ \ 'a',
+ \ 'b'], getline(lnum - 1, lnum))
+
+ normal ggdG
+ setl ai tw=2 fo=tw
+ call append('$', [
+ \ '{',
+ \ 'a b ',
+ \ '',
+ \ 'a ',
+ \ '}'])
+ exe "normal /^{/+1\n0"
+ normal gqgqjjllab
+ let lnum = line('.')
+ call assert_equal([
+ \ 'a ',
+ \ 'b ',
+ \ '',
+ \ 'a ',
+ \ 'b'], getline(lnum - 4, lnum))
+
+ normal ggdG
+ setl tw=3 fo=t
+ call append('$', [
+ \ '{',
+ \ "a \<C-A>",
+ \ '}'])
+ exe "normal /^{/+1\n0"
+ exe "normal gqgqo\na \<C-V>\<C-A>"
+ let lnum = line('.')
+ call assert_equal([
+ \ 'a',
+ \ "\<C-A>",
+ \ '',
+ \ 'a',
+ \ "\<C-A>"], getline(lnum - 4, lnum))
+
+ normal ggdG
+ setl tw=2 fo=tcq1 comments=:#
+ call append('$', [
+ \ '{',
+ \ 'a b',
+ \ '#a b',
+ \ '}'])
+ exe "normal /^{/+1\n0"
+ exe "normal gqgqjgqgqo\na b\n#a b"
+ let lnum = line('.')
+ call assert_equal([
+ \ 'a b',
+ \ '#a b',
+ \ '',
+ \ 'a b',
+ \ '#a b'], getline(lnum - 4, lnum))
+
+ normal ggdG
+ setl tw=5 fo=tcn comments=:#
+ call append('$', [
+ \ '{',
+ \ ' 1 a',
+ \ '# 1 a',
+ \ '}'])
+ exe "normal /^{/+1\n0"
+ exe "normal A b\<Esc>jA b"
+ let lnum = line('.')
+ call assert_equal([
+ \ ' 1 a',
+ \ ' b',
+ \ '# 1 a',
+ \ '# b'], getline(lnum - 3, lnum))
+
+ normal ggdG
+ setl tw=5 fo=t2a si
+ call append('$', [
+ \ '{',
+ \ '',
+ \ ' x a',
+ \ ' b',
+ \ ' c',
+ \ '',
+ \ '}'])
+ exe "normal /^{/+3\n0"
+ exe "normal i \<Esc>A_"
+ let lnum = line('.')
+ call assert_equal([
+ \ '',
+ \ ' x a',
+ \ ' b_',
+ \ ' c',
+ \ ''], getline(lnum - 2, lnum + 2))
+
+ normal ggdG
+ setl tw=5 fo=qn comments=:#
+ call append('$', [
+ \ '{',
+ \ '# 1 a b',
+ \ '}'])
+ exe "normal /^{/+1\n5|"
+ normal gwap
+ call assert_equal(5, col('.'))
+ let lnum = line('.')
+ call assert_equal([
+ \ '# 1 a',
+ \ '# b'], getline(lnum, lnum + 1))
+
+ normal ggdG
+ setl tw=5 fo=q2 comments=:#
+ call append('$', [
+ \ '{',
+ \ '# x',
+ \ '# a b',
+ \ '}'])
+ exe "normal /^{/+1\n0"
+ normal gwap
+ let lnum = line('.')
+ call assert_equal([
+ \ '# x a',
+ \ '# b'], getline(lnum, lnum + 1))
+
+ normal ggdG
+ setl tw& fo=a
+ call append('$', [
+ \ '{',
+ \ ' 1aa',
+ \ ' 2bb',
+ \ '}'])
+ exe "normal /^{/+2\n0"
+ normal I^^
+ call assert_equal('{ 1aa ^^2bb }', getline('.'))
+
+ normal ggdG
+ setl tw=20 fo=an12wcq comments=s1:/*,mb:*,ex:*/
+ call append('$', [
+ \ '/* abc def ghi jkl ',
+ \ ' * mno pqr stu',
+ \ ' */'])
+ exe "normal /mno pqr/\n"
+ normal A vwx yz
+ let lnum = line('.')
+ call assert_equal([
+ \ ' * mno pqr stu ',
+ \ ' * vwx yz',
+ \ ' */'], getline(lnum - 1, lnum + 1))
+
+ normal ggdG
+ setl tw=12 fo=tqnc comments=:#
+ call setline('.', '# 1 xxxxx')
+ normal A foobar
+ call assert_equal([
+ \ '# 1 xxxxx',
+ \ '# foobar'], getline(1, 2))
+
+ setl ai& tw& fo& si& comments&
+ enew!
+endfunc
diff --git a/src/nvim/testdir/test_textobjects.vim b/src/nvim/testdir/test_textobjects.vim
new file mode 100644
index 0000000000..6a2f5044cc
--- /dev/null
+++ b/src/nvim/testdir/test_textobjects.vim
@@ -0,0 +1,259 @@
+" Test for textobjects
+
+if !has('textobjects')
+ finish
+endif
+
+func CpoM(line, useM, expected)
+ new
+
+ if a:useM
+ set cpoptions+=M
+ else
+ set cpoptions-=M
+ endif
+
+ call setline(1, a:line)
+
+ call setreg('"', '')
+ normal! ggfrmavi)y
+ call assert_equal(getreg('"'), a:expected[0])
+
+ call setreg('"', '')
+ normal! `afbmavi)y
+ call assert_equal(getreg('"'), a:expected[1])
+
+ call setreg('"', '')
+ normal! `afgmavi)y
+ call assert_equal(getreg('"'), a:expected[2])
+
+ q!
+endfunc
+
+func Test_inner_block_without_cpo_M()
+ call CpoM('(red \(blue) green)', 0, ['red \(blue', 'red \(blue', ''])
+endfunc
+
+func Test_inner_block_with_cpo_M_left_backslash()
+ call CpoM('(red \(blue) green)', 1, ['red \(blue) green', 'blue', 'red \(blue) green'])
+endfunc
+
+func Test_inner_block_with_cpo_M_right_backslash()
+ call CpoM('(red (blue\) green)', 1, ['red (blue\) green', 'blue\', 'red (blue\) green'])
+endfunc
+
+func Test_quote_selection_selection_exclusive()
+ new
+ call setline(1, "a 'bcde' f")
+ set selection=exclusive
+ exe "norm! fdvhi'y"
+ call assert_equal('bcde', @")
+ set selection&vim
+ bw!
+endfunc
+
+" Tests for string and html text objects
+func Test_string_html_objects()
+ enew!
+
+ let t = '"wo\"rd\\" foo'
+ put =t
+ normal! da"
+ call assert_equal('foo', getline('.'))
+
+ let t = "'foo' 'bar' 'piep'"
+ put =t
+ normal! 0va'a'rx
+ call assert_equal("xxxxxxxxxxxx'piep'", getline('.'))
+
+ let t = "bla bla `quote` blah"
+ put =t
+ normal! 02f`da`
+ call assert_equal("bla bla blah", getline('.'))
+
+ let t = 'out " in "noXno"'
+ put =t
+ normal! 0fXdi"
+ call assert_equal('out " in ""', getline('.'))
+
+ let t = "\"'\" 'blah' rep 'buh'"
+ put =t
+ normal! 03f'vi'ry
+ call assert_equal("\"'\" 'blah'yyyyy'buh'", getline('.'))
+
+ set quoteescape=+*-
+ let t = "bla `s*`d-`+++`l**` b`la"
+ put =t
+ normal! di`
+ call assert_equal("bla `` b`la", getline('.'))
+
+ let t = 'voo "nah" sdf " asdf" sdf " sdf" sd'
+ put =t
+ normal! $F"va"oha"i"rz
+ call assert_equal('voo "zzzzzzzzzzzzzzzzzzzzzzzzzzzzsd', getline('.'))
+
+ let t = "-<b>asdf<i>Xasdf</i>asdf</b>-"
+ put =t
+ normal! fXdit
+ call assert_equal('-<b>asdf<i></i>asdf</b>-', getline('.'))
+
+ let t = "-<b>asdX<i>a<i />sdf</i>asdf</b>-"
+ put =t
+ normal! 0fXdit
+ call assert_equal('-<b></b>-', getline('.'))
+
+ let t = "-<b>asdf<i>Xasdf</i>asdf</b>-"
+ put =t
+ normal! fXdat
+ call assert_equal('-<b>asdfasdf</b>-', getline('.'))
+
+ let t = "-<b>asdX<i>as<b />df</i>asdf</b>-"
+ put =t
+ normal! 0fXdat
+ call assert_equal('--', getline('.'))
+
+ let t = "-<b>\ninnertext object\n</b>"
+ put =t
+ normal! dit
+ call assert_equal('-<b></b>', getline('.'))
+
+ set quoteescape&
+ enew!
+endfunc
+
+func Test_empty_html_tag()
+ new
+ call setline(1, '<div></div>')
+ normal 0citxxx
+ call assert_equal('<div>xxx</div>', getline(1))
+
+ call setline(1, '<div></div>')
+ normal 0f<cityyy
+ call assert_equal('<div>yyy</div>', getline(1))
+
+ call setline(1, '<div></div>')
+ normal 0f<vitsaaa
+ call assert_equal('aaa', getline(1))
+
+ bwipe!
+endfunc
+
+" Tests for match() and matchstr()
+func Test_match()
+ call assert_equal("b", matchstr("abcd", ".", 0, 2))
+ call assert_equal("bc", matchstr("abcd", "..", 0, 2))
+ call assert_equal("c", matchstr("abcd", ".", 2, 0))
+ call assert_equal("a", matchstr("abcd", ".", 0, -1))
+ call assert_equal(-1, match("abcd", ".", 0, 5))
+ call assert_equal(0 , match("abcd", ".", 0, -1))
+ call assert_equal(0 , match('abc', '.', 0, 1))
+ call assert_equal(1 , match('abc', '.', 0, 2))
+ call assert_equal(2 , match('abc', '.', 0, 3))
+ call assert_equal(-1, match('abc', '.', 0, 4))
+ call assert_equal(1 , match('abc', '.', 1, 1))
+ call assert_equal(2 , match('abc', '.', 2, 1))
+ call assert_equal(-1, match('abc', '.', 3, 1))
+ call assert_equal(3 , match('abc', '$', 0, 1))
+ call assert_equal(-1, match('abc', '$', 0, 2))
+ call assert_equal(3 , match('abc', '$', 1, 1))
+ call assert_equal(3 , match('abc', '$', 2, 1))
+ call assert_equal(3 , match('abc', '$', 3, 1))
+ call assert_equal(-1, match('abc', '$', 4, 1))
+ call assert_equal(0 , match('abc', '\zs', 0, 1))
+ call assert_equal(1 , match('abc', '\zs', 0, 2))
+ call assert_equal(2 , match('abc', '\zs', 0, 3))
+ call assert_equal(3 , match('abc', '\zs', 0, 4))
+ call assert_equal(-1, match('abc', '\zs', 0, 5))
+ call assert_equal(1 , match('abc', '\zs', 1, 1))
+ call assert_equal(2 , match('abc', '\zs', 2, 1))
+ call assert_equal(3 , match('abc', '\zs', 3, 1))
+ call assert_equal(-1, match('abc', '\zs', 4, 1))
+endfunc
+
+" This was causing an illegal memory access
+func Test_inner_tag()
+ new
+ norm ixxx
+ call feedkeys("v", 'xt')
+ insert
+x
+x
+.
+ norm it
+ q!
+endfunc
+
+func Test_sentence()
+ enew!
+ call setline(1, 'A sentence. A sentence? A sentence!')
+
+ normal yis
+ call assert_equal('A sentence.', @")
+ normal yas
+ call assert_equal('A sentence. ', @")
+
+ normal )
+
+ normal yis
+ call assert_equal('A sentence?', @")
+ normal yas
+ call assert_equal('A sentence? ', @")
+
+ normal )
+
+ normal yis
+ call assert_equal('A sentence!', @")
+ normal yas
+ call assert_equal(' A sentence!', @")
+
+ normal 0
+ normal 2yis
+ call assert_equal('A sentence. ', @")
+ normal 3yis
+ call assert_equal('A sentence. A sentence?', @")
+ normal 2yas
+ call assert_equal('A sentence. A sentence? ', @")
+
+ %delete _
+endfunc
+
+func Test_sentence_with_quotes()
+ enew!
+ call setline(1, 'A "sentence." A sentence.')
+
+ normal yis
+ call assert_equal('A "sentence."', @")
+ normal yas
+ call assert_equal('A "sentence." ', @")
+
+ normal )
+
+ normal yis
+ call assert_equal('A sentence.', @")
+ normal yas
+ call assert_equal(' A sentence.', @")
+
+ %delete _
+endfunc
+
+func! Test_sentence_with_cursor_on_delimiter()
+ enew!
+ call setline(1, "A '([sentence.])' A sentence.")
+
+ normal! 15|yis
+ call assert_equal("A '([sentence.])'", @")
+ normal! 15|yas
+ call assert_equal("A '([sentence.])' ", @")
+
+ normal! 16|yis
+ call assert_equal("A '([sentence.])'", @")
+ normal! 16|yas
+ call assert_equal("A '([sentence.])' ", @")
+
+ normal! 17|yis
+ call assert_equal("A '([sentence.])'", @")
+ normal! 17|yas
+ call assert_equal("A '([sentence.])' ", @")
+
+ %delete _
+endfunc
diff --git a/src/nvim/testdir/test_timers.vim b/src/nvim/testdir/test_timers.vim
index 9f58a35909..cdfdd473b9 100644
--- a/src/nvim/testdir/test_timers.vim
+++ b/src/nvim/testdir/test_timers.vim
@@ -4,29 +4,231 @@ if !has('timers')
finish
endif
+source shared.vim
+
func MyHandler(timer)
- let s:val += 1
+ let g:val += 1
+endfunc
+
+func MyHandlerWithLists(lists, timer)
+ let x = string(a:lists)
endfunc
func Test_oneshot()
- let s:val = 0
+ let g:val = 0
let timer = timer_start(50, 'MyHandler')
- sleep 200m
- call assert_equal(1, s:val)
+ let slept = WaitFor('g:val == 1')
+ call assert_equal(1, g:val)
+ if has('reltime')
+ call assert_inrange(40, 120, slept)
+ else
+ call assert_inrange(20, 120, slept)
+ endif
endfunc
func Test_repeat_three()
- let s:val = 0
+ let g:val = 0
let timer = timer_start(50, 'MyHandler', {'repeat': 3})
- sleep 500m
- call assert_equal(3, s:val)
+ let slept = WaitFor('g:val == 3')
+ call assert_equal(3, g:val)
+ if has('reltime')
+ call assert_inrange(120, 250, slept)
+ else
+ call assert_inrange(80, 200, slept)
+ endif
endfunc
func Test_repeat_many()
- let s:val = 0
+ call timer_stopall()
+ let g:val = 0
let timer = timer_start(50, 'MyHandler', {'repeat': -1})
sleep 200m
call timer_stop(timer)
- call assert_true(s:val > 1)
- call assert_true(s:val < 5)
+ call assert_inrange((has('mac') ? 1 : 2), 4, g:val)
+endfunc
+
+func Test_with_partial_callback()
+ let g:val = 0
+ let meow = {'one': 1}
+ function meow.bite(...)
+ let g:val += self.one
+ endfunction
+
+ call timer_start(50, meow.bite)
+ let slept = WaitFor('g:val == 1')
+ call assert_equal(1, g:val)
+ if has('reltime')
+ call assert_inrange(40, 130, slept)
+ else
+ call assert_inrange(20, 100, slept)
+ endif
+endfunc
+
+func Test_retain_partial()
+ call timer_start(50, function('MyHandlerWithLists', [['a']]))
+ call garbagecollect()
+ sleep 100m
+endfunc
+
+func Test_info()
+ let id = timer_start(1000, 'MyHandler')
+ let info = timer_info(id)
+ call assert_equal(id, info[0]['id'])
+ call assert_equal(1000, info[0]['time'])
+ call assert_equal("function('MyHandler')", string(info[0]['callback']))
+
+ let found = 0
+ for info in timer_info()
+ if info['id'] == id
+ let found += 1
+ endif
+ endfor
+ call assert_equal(1, found)
+
+ call timer_stop(id)
+ call assert_equal([], timer_info(id))
+endfunc
+
+func Test_stopall()
+ call timer_stopall()
+ let id1 = timer_start(1000, 'MyHandler')
+ let id2 = timer_start(2000, 'MyHandler')
+ let info = timer_info()
+ call assert_equal(2, len(info))
+
+ call timer_stopall()
+ let info = timer_info()
+ call assert_equal(0, len(info))
+endfunc
+
+func Test_paused()
+ let g:val = 0
+
+ let id = timer_start(50, 'MyHandler')
+ let info = timer_info(id)
+ call assert_equal(0, info[0]['paused'])
+
+ call timer_pause(id, 1)
+ let info = timer_info(id)
+ call assert_equal(1, info[0]['paused'])
+ sleep 200m
+ call assert_equal(0, g:val)
+
+ call timer_pause(id, 0)
+ let info = timer_info(id)
+ call assert_equal(0, info[0]['paused'])
+
+ let slept = WaitFor('g:val == 1')
+ call assert_equal(1, g:val)
+ if has('reltime')
+ call assert_inrange(0, 140, slept)
+ else
+ call assert_inrange(0, 10, slept)
+ endif
+endfunc
+
+func StopMyself(timer)
+ let g:called += 1
+ if g:called == 2
+ call timer_stop(a:timer)
+ endif
+endfunc
+
+func Test_delete_myself()
+ let g:called = 0
+ let t = timer_start(10, 'StopMyself', {'repeat': -1})
+ call WaitFor('g:called == 2')
+ call assert_equal(2, g:called)
+ call assert_equal([], timer_info(t))
endfunc
+
+func StopTimer1(timer)
+ let g:timer2 = timer_start(10, 'StopTimer2')
+ " avoid maxfuncdepth error
+ call timer_pause(g:timer1, 1)
+ sleep 40m
+endfunc
+
+func StopTimer2(timer)
+ call timer_stop(g:timer1)
+endfunc
+
+func Test_stop_in_callback()
+ let g:timer1 = timer_start(10, 'StopTimer1')
+ sleep 40m
+endfunc
+
+func StopTimerAll(timer)
+ call timer_stopall()
+endfunc
+
+func Test_stop_all_in_callback()
+ call timer_stopall()
+ let g:timer1 = timer_start(10, 'StopTimerAll')
+ let info = timer_info()
+ call assert_equal(1, len(info))
+ if has('mac')
+ sleep 100m
+ endif
+ sleep 40m
+ let info = timer_info()
+ call assert_equal(0, len(info))
+endfunc
+
+func FeedkeysCb(timer)
+ call feedkeys("hello\<CR>", 'nt')
+endfunc
+
+func InputCb(timer)
+ call timer_start(10, 'FeedkeysCb')
+ let g:val = input('?')
+ call Resume()
+endfunc
+
+func Test_input_in_timer()
+ let g:val = ''
+ call timer_start(10, 'InputCb')
+ call Standby(1000)
+ call assert_equal('hello', g:val)
+endfunc
+
+func FuncWithCaughtError(timer)
+ let g:call_count += 1
+ try
+ doesnotexist
+ catch
+ " nop
+ endtry
+endfunc
+
+func Test_timer_catch_error()
+ let g:call_count = 0
+ let timer = timer_start(10, 'FuncWithCaughtError', {'repeat': 4})
+ " Timer will not be stopped.
+ call WaitFor('g:call_count == 4')
+ sleep 50m
+ call assert_equal(4, g:call_count)
+endfunc
+
+func FeedAndPeek(timer)
+ call test_feedinput('a')
+ call getchar(1)
+endfunc
+
+func Interrupt(timer)
+ call test_feedinput("\<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
+ call timer_start(0, 'FeedAndPeek')
+ let intr = timer_start(100, 'Interrupt')
+ let c = getchar()
+ call assert_equal(char2nr('a'), c)
+ call timer_stop(intr)
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_true_false.vim b/src/nvim/testdir/test_true_false.vim
new file mode 100644
index 0000000000..84aca737ac
--- /dev/null
+++ b/src/nvim/testdir/test_true_false.vim
@@ -0,0 +1,150 @@
+" Test behavior of boolean-like values.
+
+" Test what is explained at ":help TRUE" and ":help FALSE".
+func Test_if()
+ if v:false
+ call assert_true(false, 'v:false is false')
+ endif
+ if 0
+ call assert_true(false, 'zero is false')
+ endif
+ if "0"
+ call assert_true(false, 'zero string is false')
+ endif
+ if "foo"
+ call assert_true(false, 'foo is false')
+ endif
+ if " "
+ call assert_true(false, 'space is false')
+ endif
+ if empty("foo")
+ call assert_true(false, 'foo is not empty')
+ endif
+
+ if v:true
+ else
+ call assert_true(false, 'v:true is true')
+ endif
+ if 1
+ else
+ call assert_true(false, 'one is true')
+ endif
+ if "1"
+ else
+ call assert_true(false, 'one string is true')
+ endif
+ if "1foo"
+ else
+ call assert_true(false, 'one in string is true')
+ endif
+
+ call assert_fails('if [1]', 'E745')
+ call assert_fails('if {1: 1}', 'E728')
+ call assert_fails('if function("string")', 'E703')
+ call assert_fails('if 1.3")', 'E805')
+endfunc
+
+function Try_arg_true_false(expr, false_val, true_val)
+ for v in ['v:false', '0', '"0"', '"foo"', '" "']
+ let r = eval(substitute(a:expr, '%v%', v, ''))
+ call assert_equal(a:false_val, r, 'result for ' . v . ' is not ' . string(a:false_val) . ' but ' . string(r))
+ endfor
+ for v in ['v:true', '1', '"1"', '"1foo"']
+ let r = eval(substitute(a:expr, '%v%', v, ''))
+ call assert_equal(a:true_val, r, 'result for ' . v . ' is not ' . string(a:true_val) . ' but ' . string(r))
+ endfor
+endfunc
+
+" Test using TRUE or FALSE values for an argument.
+func Test_true_false_arg()
+ call Try_arg_true_false('count(["a", "A"], "a", %v%)', 1, 2)
+
+ set wildignore=*.swp
+ call Try_arg_true_false('expand("foo.swp", %v%)', "", "foo.swp")
+ call Try_arg_true_false('expand("foo.vim", 0, %v%)', "foo.vim", ["foo.vim"])
+
+ call setreg('a', ['x', 'y'])
+ call Try_arg_true_false('getreg("a", 1, %v%)', "x\ny\n", ['x', 'y'])
+
+ set wildignore=*.vim
+ call Try_arg_true_false('glob("runtest.vim", %v%)', "", "runtest.vim")
+ set wildignore=*.swp
+ call Try_arg_true_false('glob("runtest.vim", 0, %v%)', "runtest.vim", ["runtest.vim"])
+ if has('unix')
+ silent !ln -s doesntexit Xlink
+ call Try_arg_true_false('glob("Xlink", 0, 0, %v%)', "", "Xlink")
+ silent !rm Xlink
+ endif
+
+ set wildignore=*.vim
+ call Try_arg_true_false('globpath(".", "runtest.vim", %v%)', "", "./runtest.vim")
+ set wildignore=*.swp
+ call Try_arg_true_false('globpath(".", "runtest.vim", 0, %v%)', "./runtest.vim", ["./runtest.vim"])
+ if has('unix')
+ silent !ln -s doesntexit Xlink
+ call Try_arg_true_false('globpath(".", "Xlink", 0, 0, %v%)', "", "./Xlink")
+ silent !rm Xlink
+ endif
+
+ abbr asdf asdff
+ call Try_arg_true_false('hasmapto("asdff", "i", %v%)', 0, 1)
+
+ call Try_arg_true_false('index(["a", "A"], "A", 0, %v%)', 1, 0)
+
+ function FilterMapArg(d)
+ if type(a:d) == type({})
+ return filter(a:d, 'v:key == "rhs"')
+ endif
+ return a:d
+ endfunction
+ call Try_arg_true_false('maparg("asdf", "i", %v%)', "", "asdff")
+ call Try_arg_true_false('FilterMapArg(maparg("asdf", "i", 1, %v%))', "asdff", {'rhs': 'asdff'})
+
+ call Try_arg_true_false('hasmapto("asdf", "i", %v%)', 0, 1)
+
+ new colored
+ call setline(1, '<here>')
+ syn match brackets "<.*>"
+ syn match here "here" transparent
+ let brackets_id = synID(1, 1, 0)
+ let here_id = synID(1, 3, 0)
+ call Try_arg_true_false('synID(1, 3, %v%)', here_id, brackets_id)
+ bwipe!
+endfunc
+
+function Try_arg_non_zero(expr, false_val, true_val)
+ for v in ['v:false', '0', '[1]', '{2:3}', '3.4']
+ let r = eval(substitute(a:expr, '%v%', v, ''))
+ call assert_equal(a:false_val, r, 'result for ' . v . ' is not ' . a:false_val . ' but ' . r)
+ endfor
+ for v in ['v:true', '1', '" "', '"0"']
+ let r = eval(substitute(a:expr, '%v%', v, ''))
+ call assert_equal(a:true_val, r, 'result for ' . v . ' is not ' . a:true_val . ' but ' . r)
+ endfor
+endfunc
+
+
+" Test using non-zero-arg for an argument.
+func Test_non_zero_arg()
+ " call test_settime(93784)
+ " call Try_arg_non_zero("mode(%v%)", 'x', 'x!')
+ " call test_settime(0)
+
+ call Try_arg_non_zero("shellescape('foo%', %v%)", "'foo%'", "'foo\\%'")
+
+ " visualmode() needs to be called twice to check
+ for v in [v:false, 0, [1], {2:3}, 3.4]
+ normal vv
+ let r = visualmode(v)
+ call assert_equal('v', r, 'result for ' . string(v) . ' is not "v" but ' . r)
+ let r = visualmode(v)
+ call assert_equal('v', r, 'result for ' . string(v) . ' is not "v" but ' . r)
+ endfor
+ for v in [v:true, 1, " ", "0"]
+ normal vv
+ let r = visualmode(v)
+ call assert_equal('v', r, 'result for ' . v . ' is not "v" but ' . r)
+ let r = visualmode(v)
+ call assert_equal('', r, 'result for ' . v . ' is not "" but ' . r)
+ endfor
+endfunc
diff --git a/src/nvim/testdir/test_undo.vim b/src/nvim/testdir/test_undo.vim
new file mode 100644
index 0000000000..9729ca9f57
--- /dev/null
+++ b/src/nvim/testdir/test_undo.vim
@@ -0,0 +1,436 @@
+" Tests for the undo tree.
+" Since this script is sourced we need to explicitly break changes up in
+" undo-able pieces. Do that by setting 'undolevels'.
+" Also tests :earlier and :later.
+
+func Test_undotree()
+ new
+
+ normal! Aabc
+ set ul=100
+ let d = undotree()
+ call assert_equal(1, d.seq_last)
+ call assert_equal(1, d.seq_cur)
+ call assert_equal(0, d.save_last)
+ call assert_equal(0, d.save_cur)
+ call assert_equal(1, len(d.entries))
+ call assert_equal(1, d.entries[0].newhead)
+ call assert_equal(1, d.entries[0].seq)
+ call assert_true(d.entries[0].time <= d.time_cur)
+
+ normal! Adef
+ set ul=100
+ let d = undotree()
+ call assert_equal(2, d.seq_last)
+ call assert_equal(2, d.seq_cur)
+ call assert_equal(0, d.save_last)
+ call assert_equal(0, d.save_cur)
+ call assert_equal(2, len(d.entries))
+ call assert_equal(1, d.entries[0].seq)
+ call assert_equal(1, d.entries[1].newhead)
+ call assert_equal(2, d.entries[1].seq)
+ call assert_true(d.entries[1].time <= d.time_cur)
+
+ undo
+ set ul=100
+ let d = undotree()
+ call assert_equal(2, d.seq_last)
+ call assert_equal(1, d.seq_cur)
+ call assert_equal(0, d.save_last)
+ call assert_equal(0, d.save_cur)
+ call assert_equal(2, len(d.entries))
+ call assert_equal(1, d.entries[0].seq)
+ call assert_equal(1, d.entries[1].curhead)
+ call assert_equal(1, d.entries[1].newhead)
+ call assert_equal(2, d.entries[1].seq)
+ call assert_true(d.entries[1].time == d.time_cur)
+
+ normal! Aghi
+ set ul=100
+ let d = undotree()
+ call assert_equal(3, d.seq_last)
+ call assert_equal(3, d.seq_cur)
+ call assert_equal(0, d.save_last)
+ call assert_equal(0, d.save_cur)
+ call assert_equal(2, len(d.entries))
+ call assert_equal(1, d.entries[0].seq)
+ call assert_equal(2, d.entries[1].alt[0].seq)
+ call assert_equal(1, d.entries[1].newhead)
+ call assert_equal(3, d.entries[1].seq)
+ call assert_true(d.entries[1].time <= d.time_cur)
+
+ undo
+ set ul=100
+ let d = undotree()
+ call assert_equal(3, d.seq_last)
+ call assert_equal(1, d.seq_cur)
+ call assert_equal(0, d.save_last)
+ call assert_equal(0, d.save_cur)
+ call assert_equal(2, len(d.entries))
+ call assert_equal(1, d.entries[0].seq)
+ call assert_equal(2, d.entries[1].alt[0].seq)
+ call assert_equal(1, d.entries[1].curhead)
+ call assert_equal(1, d.entries[1].newhead)
+ call assert_equal(3, d.entries[1].seq)
+ call assert_true(d.entries[1].time == d.time_cur)
+
+ w! Xtest
+ let d = undotree()
+ call assert_equal(1, d.save_cur)
+ call assert_equal(1, d.save_last)
+ call delete('Xtest')
+ bwipe! Xtest
+endfunc
+
+func FillBuffer()
+ for i in range(1,13)
+ put=i
+ " Set 'undolevels' to split undo.
+ exe "setg ul=" . &g:ul
+ endfor
+endfunc
+
+func Test_global_local_undolevels()
+ new one
+ set undolevels=5
+ call FillBuffer()
+ " will only undo the last 5 changes, end up with 13 - (5 + 1) = 7 lines
+ earlier 10
+ call assert_equal(5, &g:undolevels)
+ call assert_equal(-123456, &l:undolevels)
+ call assert_equal('7', getline('$'))
+
+ new two
+ setlocal undolevels=2
+ call FillBuffer()
+ " will only undo the last 2 changes, end up with 13 - (2 + 1) = 10 lines
+ earlier 10
+ call assert_equal(5, &g:undolevels)
+ call assert_equal(2, &l:undolevels)
+ call assert_equal('10', getline('$'))
+
+ setlocal ul=10
+ call assert_equal(5, &g:undolevels)
+ call assert_equal(10, &l:undolevels)
+
+ " Setting local value in "two" must not change local value in "one"
+ wincmd p
+ call assert_equal(5, &g:undolevels)
+ call assert_equal(-123456, &l:undolevels)
+
+ new three
+ setglobal ul=50
+ call assert_equal(50, &g:undolevels)
+ call assert_equal(-123456, &l:undolevels)
+
+ " Drop created windows
+ set ul&
+ new
+ only!
+endfunc
+
+func BackOne(expected)
+ call feedkeys('g-', 'xt')
+ call assert_equal(a:expected, getline(1))
+endfunc
+
+func Test_undo_del_chars()
+ throw 'skipped: Nvim does not support test_settime()'
+
+ " Setup a buffer without creating undo entries
+ new
+ set ul=-1
+ call setline(1, ['123-456'])
+ set ul=100
+ 1
+ call test_settime(100)
+
+ " Delete three characters and undo with g-
+ call feedkeys('x', 'xt')
+ call feedkeys('x', 'xt')
+ call feedkeys('x', 'xt')
+ call assert_equal('-456', getline(1))
+ call BackOne('3-456')
+ call BackOne('23-456')
+ call BackOne('123-456')
+ call assert_fails("BackOne('123-456')")
+
+ :" Delete three other characters and go back in time with g-
+ call feedkeys('$x', 'xt')
+ call feedkeys('x', 'xt')
+ call feedkeys('x', 'xt')
+ call assert_equal('123-', getline(1))
+ call test_settime(101)
+
+ call BackOne('123-4')
+ call BackOne('123-45')
+ " skips '123-456' because it's older
+ call BackOne('-456')
+ call BackOne('3-456')
+ call BackOne('23-456')
+ call BackOne('123-456')
+ call assert_fails("BackOne('123-456')")
+ normal 10g+
+ call assert_equal('123-', getline(1))
+
+ :" Jump two seconds and go some seconds forward and backward
+ call test_settime(103)
+ call feedkeys("Aa\<Esc>", 'xt')
+ call feedkeys("Ab\<Esc>", 'xt')
+ call feedkeys("Ac\<Esc>", 'xt')
+ call assert_equal('123-abc', getline(1))
+ earlier 1s
+ call assert_equal('123-', getline(1))
+ earlier 3s
+ call assert_equal('123-456', getline(1))
+ later 1s
+ call assert_equal('123-', getline(1))
+ later 1h
+ call assert_equal('123-abc', getline(1))
+
+ close!
+endfunc
+
+func Test_undolist()
+ new
+ set ul=100
+
+ let a = execute('undolist')
+ call assert_equal("\nNothing to undo", a)
+
+ " 1 leaf (2 changes).
+ call feedkeys('achange1', 'xt')
+ call feedkeys('achange2', 'xt')
+ let a = execute('undolist')
+ call assert_match("^\nnumber changes when *saved\n *2 *2 .*$", a)
+
+ " 2 leaves.
+ call feedkeys('u', 'xt')
+ call feedkeys('achange3\<Esc>', 'xt')
+ let a = execute('undolist')
+ call assert_match("^\nnumber changes when *saved\n *2 *2 *.*\n *3 *2 .*$", a)
+ close!
+endfunc
+
+func Test_U_command()
+ new
+ set ul=100
+ call feedkeys("achange1\<Esc>", 'xt')
+ call feedkeys("achange2\<Esc>", 'xt')
+ norm! U
+ call assert_equal('', getline(1))
+ norm! U
+ call assert_equal('change1change2', getline(1))
+ close!
+endfunc
+
+func Test_undojoin()
+ new
+ call feedkeys("Goaaaa\<Esc>", 'xt')
+ call feedkeys("obbbb\<Esc>", 'xt')
+ call assert_equal(['aaaa', 'bbbb'], getline(2, '$'))
+ call feedkeys("u", 'xt')
+ call assert_equal(['aaaa'], getline(2, '$'))
+ call feedkeys("obbbb\<Esc>", 'xt')
+ undojoin
+ " Note: next change must not be as if typed
+ call feedkeys("occcc\<Esc>", 'x')
+ call assert_equal(['aaaa', 'bbbb', 'cccc'], getline(2, '$'))
+ call feedkeys("u", 'xt')
+ call assert_equal(['aaaa'], getline(2, '$'))
+ close!
+endfunc
+
+func Test_undo_write()
+ split Xtest
+ call feedkeys("ione one one\<Esc>", 'xt')
+ w!
+ call feedkeys("otwo\<Esc>", 'xt')
+ call feedkeys("otwo\<Esc>", 'xt')
+ w
+ call feedkeys("othree\<Esc>", 'xt')
+ call assert_equal(['one one one', 'two', 'two', 'three'], getline(1, '$'))
+ earlier 1f
+ call assert_equal(['one one one', 'two', 'two'], getline(1, '$'))
+ earlier 1f
+ call assert_equal(['one one one'], getline(1, '$'))
+ earlier 1f
+ call assert_equal([''], getline(1, '$'))
+ later 1f
+ call assert_equal(['one one one'], getline(1, '$'))
+ later 1f
+ call assert_equal(['one one one', 'two', 'two'], getline(1, '$'))
+ later 1f
+ call assert_equal(['one one one', 'two', 'two', 'three'], getline(1, '$'))
+
+ close!
+ call delete('Xtest')
+ bwipe! Xtest
+endfunc
+
+func Test_insert_expr()
+ new
+ " calling setline() triggers undo sync
+ call feedkeys("oa\<Esc>", 'xt')
+ call feedkeys("ob\<Esc>", 'xt')
+ set ul=100
+ call feedkeys("o1\<Esc>a2\<C-R>=setline('.','1234')\<CR>\<CR>\<Esc>", 'x')
+ call assert_equal(['a', 'b', '120', '34'], getline(2, '$'))
+ call feedkeys("u", 'x')
+ call assert_equal(['a', 'b', '12'], getline(2, '$'))
+ call feedkeys("u", 'x')
+ call assert_equal(['a', 'b'], getline(2, '$'))
+
+ call feedkeys("oc\<Esc>", 'xt')
+ set ul=100
+ call feedkeys("o1\<Esc>a2\<C-R>=setline('.','1234')\<CR>\<CR>\<Esc>", 'x')
+ call assert_equal(['a', 'b', 'c', '120', '34'], getline(2, '$'))
+ call feedkeys("u", 'x')
+ call assert_equal(['a', 'b', 'c', '12'], getline(2, '$'))
+
+ call feedkeys("od\<Esc>", 'xt')
+ set ul=100
+ call feedkeys("o1\<Esc>a2\<C-R>=string(123)\<CR>\<Esc>", 'x')
+ call assert_equal(['a', 'b', 'c', '12', 'd', '12123'], getline(2, '$'))
+ call feedkeys("u", 'x')
+ call assert_equal(['a', 'b', 'c', '12', 'd'], getline(2, '$'))
+
+ close!
+endfunc
+
+func Test_undofile_earlier()
+ throw 'skipped: Nvim does not support test_settime()'
+
+ let t0 = localtime() - 43200
+ call test_settime(t0)
+ new Xfile
+ call feedkeys("ione\<Esc>", 'xt')
+ set ul=100
+ call test_settime(t0 + 1)
+ call feedkeys("otwo\<Esc>", 'xt')
+ set ul=100
+ call test_settime(t0 + 2)
+ call feedkeys("othree\<Esc>", 'xt')
+ set ul=100
+ w
+ wundo Xundofile
+ bwipe!
+ " restore normal timestamps.
+ call test_settime(0)
+ new Xfile
+ rundo Xundofile
+ earlier 1d
+ call assert_equal('', getline(1))
+ bwipe!
+ call delete('Xfile')
+ call delete('Xundofile')
+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()
+ enew!
+ let @a = "Ox\<Esc>jAy\<Esc>kdd"
+ edit +/^$ test_undo.vim
+ normal @au
+ call assert_equal(0, &modified)
+ return
+ new
+ normal @au
+ call assert_equal(0, &modified)
+ only!
+ let @a = ''
+endfunc
+
+func Test_redo_empty_line()
+ new
+ exe "norm\x16r\x160"
+ exe "norm."
+ bwipe!
+endfunc
+
+" This used to cause an illegal memory access
+func Test_undo_append()
+ new
+ call feedkeys("axx\<Esc>v", 'xt')
+ undo
+ norm o
+ quit
+endfunc
+
+funct Test_undofile()
+ " Test undofile() without setting 'undodir'.
+ if has('persistent_undo')
+ call assert_equal(fnamemodify('.Xundofoo.un~', ':p'), undofile('Xundofoo'))
+ else
+ call assert_equal('', undofile('Xundofoo'))
+ endif
+ call assert_equal('', undofile(''))
+
+ " Test undofile() with 'undodir' set to to an existing directory.
+ call mkdir('Xundodir')
+ set undodir=Xundodir
+ let cwd = getcwd()
+ if has('win32')
+ " Replace windows drive such as C:... into C%...
+ let cwd = substitute(cwd, '^\([a-zA-Z]\):', '\1%', 'g')
+ endif
+ let pathsep = has('win32') ? '\' : '/'
+ let cwd = substitute(cwd . pathsep . 'Xundofoo', pathsep, '%', 'g')
+ if has('persistent_undo')
+ call assert_equal('Xundodir' . pathsep . cwd, undofile('Xundofoo'))
+ else
+ call assert_equal('', undofile('Xundofoo'))
+ endif
+ call assert_equal('', undofile(''))
+ call delete('Xundodir', 'd')
+
+ " Test undofile() with 'undodir' set to a non-existing directory.
+ " call assert_equal('', undofile('Xundofoo'))
+
+ set undodir&
+endfunc
+
+func Test_undo_0()
+ new
+ set ul=100
+ normal i1
+ undo
+ normal i2
+ undo
+ normal i3
+
+ undo 0
+ let d = undotree()
+ call assert_equal('', getline(1))
+ call assert_equal(0, d.seq_cur)
+
+ redo
+ let d = undotree()
+ call assert_equal('3', getline(1))
+ call assert_equal(3, d.seq_cur)
+
+ undo 2
+ undo 0
+ let d = undotree()
+ call assert_equal('', getline(1))
+ call assert_equal(0, d.seq_cur)
+
+ redo
+ let d = undotree()
+ call assert_equal('2', getline(1))
+ call assert_equal(2, d.seq_cur)
+
+ undo 1
+ undo 0
+ let d = undotree()
+ call assert_equal('', getline(1))
+ call assert_equal(0, d.seq_cur)
+
+ redo
+ let d = undotree()
+ call assert_equal('1', getline(1))
+ call assert_equal(1, d.seq_cur)
+
+ bwipe!
+endfunc
diff --git a/src/nvim/testdir/test_unlet.vim b/src/nvim/testdir/test_unlet.vim
index f6705997a9..b02bdaab3b 100644
--- a/src/nvim/testdir/test_unlet.vim
+++ b/src/nvim/testdir/test_unlet.vim
@@ -3,7 +3,7 @@
func Test_read_only()
try
" this caused a crash
- unlet count
+ unlet v:count
catch
call assert_true(v:exception =~ ':E795:')
endtry
@@ -24,3 +24,41 @@ func Test_not_existing()
call assert_true(v:exception =~ ':E108:')
endtry
endfunc
+
+func Test_unlet_fails()
+ call assert_fails('unlet v:["count"]', 'E46:')
+endfunc
+
+func Test_unlet_env()
+ let envcmd = has('win32') ? 'set' : 'env'
+
+ let $FOOBAR = 'test'
+ let found = 0
+ for kv in split(system(envcmd), "\r*\n")
+ if kv == 'FOOBAR=test'
+ let found = 1
+ endif
+ endfor
+ call assert_equal(1, found)
+
+ unlet $FOOBAR
+ let found = 0
+ for kv in split(system(envcmd), "\r*\n")
+ if kv == 'FOOBAR=test'
+ let found = 1
+ endif
+ endfor
+ call assert_equal(0, found)
+
+ unlet $MUST_NOT_BE_AN_ERROR
+endfunc
+
+func Test_unlet_complete()
+ let g:FOOBAR = 1
+ call feedkeys(":unlet g:FOO\t\n", 'tx')
+ call assert_true(!exists('g:FOOBAR'))
+
+ let $FOOBAR = 1
+ call feedkeys(":unlet $FOO\t\n", 'tx')
+ call assert_true(!exists('$FOOBAR') || empty($FOOBAR))
+endfunc
diff --git a/src/nvim/testdir/test_user_func.vim b/src/nvim/testdir/test_user_func.vim
new file mode 100644
index 0000000000..e7a3701386
--- /dev/null
+++ b/src/nvim/testdir/test_user_func.vim
@@ -0,0 +1,96 @@
+" Test for user functions.
+" Also test an <expr> mapping calling a function.
+" Also test that a builtin function cannot be replaced.
+" Also test for regression when calling arbitrary expression.
+
+func Table(title, ...)
+ let ret = a:title
+ let idx = 1
+ while idx <= a:0
+ exe "let ret = ret . a:" . idx
+ let idx = idx + 1
+ endwhile
+ return ret
+endfunc
+
+func Compute(n1, n2, divname)
+ if a:n2 == 0
+ return "fail"
+ endif
+ exe "let g:" . a:divname . " = ". a:n1 / a:n2
+ return "ok"
+endfunc
+
+func Expr1()
+ silent! normal! v
+ return "111"
+endfunc
+
+func Expr2()
+ call search('XX', 'b')
+ return "222"
+endfunc
+
+func ListItem()
+ let g:counter += 1
+ return g:counter . '. '
+endfunc
+
+func ListReset()
+ let g:counter = 0
+ return ''
+endfunc
+
+func FuncWithRef(a)
+ unlet g:FuncRef
+ return a:a
+endfunc
+
+func Test_user_func()
+ let g:FuncRef=function("FuncWithRef")
+ let g:counter = 0
+ inoremap <expr> ( ListItem()
+ inoremap <expr> [ ListReset()
+ imap <expr> + Expr1()
+ imap <expr> * Expr2()
+ let g:retval = "nop"
+
+ call assert_equal('xxx4asdf', Table("xxx", 4, "asdf"))
+ call assert_equal('fail', Compute(45, 0, "retval"))
+ call assert_equal('nop', g:retval)
+ call assert_equal('ok', Compute(45, 5, "retval"))
+ call assert_equal(9, g:retval)
+ call assert_equal(333, g:FuncRef(333))
+
+ enew
+
+ normal oXX+-XX
+ call assert_equal('XX111-XX', getline('.'))
+ normal o---*---
+ call assert_equal('---222---', getline('.'))
+ normal o(one
+ call assert_equal('1. one', getline('.'))
+ normal o(two
+ call assert_equal('2. two', getline('.'))
+ normal o[(one again
+ call assert_equal('1. one again', getline('.'))
+
+ call assert_equal(3, max([1, 2, 3]))
+ call assert_fails("call extend(g:, {'max': function('min')})", 'E704')
+ call assert_equal(3, max([1, 2, 3]))
+
+ " Regression: the first line below used to throw ?E110: Missing ')'?
+ " Second is here just to prove that this line is correct when not skipping
+ " rhs of &&.
+ call assert_equal(0, (0 && (function('tr'))(1, 2, 3)))
+ call assert_equal(1, (1 && (function('tr'))(1, 2, 3)))
+
+ delfunc Table
+ delfunc Compute
+ delfunc Expr1
+ delfunc Expr2
+ delfunc ListItem
+ delfunc ListReset
+ unlet g:retval g:counter
+ enew!
+endfunc
diff --git a/src/nvim/testdir/test_usercommands.vim b/src/nvim/testdir/test_usercommands.vim
new file mode 100644
index 0000000000..1520c2f32a
--- /dev/null
+++ b/src/nvim/testdir/test_usercommands.vim
@@ -0,0 +1,220 @@
+" Tests for user defined commands
+
+" Test for <mods> in user defined commands
+function Test_cmdmods()
+ let g:mods = ''
+
+ command! -nargs=* MyCmd let g:mods .= '<mods> '
+
+ MyCmd
+ aboveleft MyCmd
+ abo MyCmd
+ belowright MyCmd
+ bel MyCmd
+ botright MyCmd
+ bo MyCmd
+ browse MyCmd
+ bro MyCmd
+ confirm MyCmd
+ conf MyCmd
+ hide MyCmd
+ hid MyCmd
+ keepalt MyCmd
+ keepa MyCmd
+ keepjumps MyCmd
+ keepj MyCmd
+ keepmarks MyCmd
+ kee MyCmd
+ keeppatterns MyCmd
+ keepp MyCmd
+ leftabove MyCmd " results in :aboveleft
+ lefta MyCmd
+ lockmarks MyCmd
+ loc MyCmd
+ " noautocmd MyCmd
+ noswapfile MyCmd
+ nos MyCmd
+ rightbelow MyCmd " results in :belowright
+ rightb MyCmd
+ " sandbox MyCmd
+ silent MyCmd
+ sil MyCmd
+ tab MyCmd
+ topleft MyCmd
+ to MyCmd
+ " unsilent MyCmd
+ verbose MyCmd
+ verb MyCmd
+ vertical MyCmd
+ vert MyCmd
+
+ aboveleft belowright botright browse confirm hide keepalt keepjumps
+ \ keepmarks keeppatterns lockmarks noswapfile silent tab
+ \ topleft verbose vertical MyCmd
+
+ call assert_equal(' aboveleft aboveleft belowright belowright botright ' .
+ \ 'botright browse browse confirm confirm hide hide ' .
+ \ 'keepalt keepalt keepjumps keepjumps keepmarks keepmarks ' .
+ \ 'keeppatterns keeppatterns aboveleft aboveleft lockmarks lockmarks noswapfile ' .
+ \ 'noswapfile belowright belowright silent silent tab topleft topleft verbose verbose ' .
+ \ 'vertical vertical ' .
+ \ 'aboveleft belowright botright browse confirm hide keepalt keepjumps ' .
+ \ 'keepmarks keeppatterns lockmarks noswapfile silent tab topleft ' .
+ \ 'verbose vertical ', g:mods)
+
+ let g:mods = ''
+ command! -nargs=* MyQCmd let g:mods .= '<q-mods> '
+
+ vertical MyQCmd
+ call assert_equal('"vertical" ', g:mods)
+
+ delcommand MyCmd
+ delcommand MyQCmd
+ unlet g:mods
+endfunction
+
+func Test_Ambiguous()
+ command Doit let g:didit = 'yes'
+ command Dothat let g:didthat = 'also'
+ call assert_fails('Do', 'E464:')
+ Doit
+ call assert_equal('yes', g:didit)
+ Dothat
+ call assert_equal('also', g:didthat)
+ unlet g:didit
+ unlet g:didthat
+
+ delcommand Doit
+ Do
+ call assert_equal('also', g:didthat)
+ delcommand Dothat
+endfunc
+
+func Test_CmdUndefined()
+ call assert_fails('Doit', 'E492:')
+ au CmdUndefined Doit :command Doit let g:didit = 'yes'
+ Doit
+ call assert_equal('yes', g:didit)
+ delcommand Doit
+
+ call assert_fails('Dothat', 'E492:')
+ au CmdUndefined * let g:didnot = 'yes'
+ call assert_fails('Dothat', 'E492:')
+ call assert_equal('yes', g:didnot)
+endfunc
+
+func Test_CmdErrors()
+ call assert_fails('com! docmd :', 'E183:')
+ call assert_fails('com! \<Tab> :', 'E182:')
+ call assert_fails('com! _ :', 'E182:')
+ call assert_fails('com! X :', 'E841:')
+ call assert_fails('com! - DoCmd :', 'E175:')
+ call assert_fails('com! -xxx DoCmd :', 'E181:')
+ call assert_fails('com! -addr DoCmd :', 'E179:')
+ call assert_fails('com! -complete DoCmd :', 'E179:')
+ call assert_fails('com! -complete=xxx DoCmd :', 'E180:')
+ call assert_fails('com! -complete=custom DoCmd :', 'E467:')
+ call assert_fails('com! -complete=customlist DoCmd :', 'E467:')
+ call assert_fails('com! -complete=behave,CustomComplete DoCmd :', 'E468:')
+ call assert_fails('com! -nargs=x DoCmd :', 'E176:')
+ call assert_fails('com! -count=1 -count=2 DoCmd :', 'E177:')
+ call assert_fails('com! -count=x DoCmd :', 'E178:')
+ call assert_fails('com! -range=x DoCmd :', 'E178:')
+
+ com! -nargs=0 DoCmd :
+ call assert_fails('DoCmd x', 'E488:')
+
+ com! -nargs=1 DoCmd :
+ call assert_fails('DoCmd', 'E471:')
+
+ com! -nargs=+ DoCmd :
+ call assert_fails('DoCmd', 'E471:')
+
+ call assert_fails('com DoCmd :', 'E174:')
+ comclear
+ call assert_fails('delcom DoCmd', 'E184:')
+endfunc
+
+func CustomComplete(A, L, P)
+ return "January\nFebruary\nMars\n"
+endfunc
+
+func CustomCompleteList(A, L, P)
+ return [ "Monday", "Tuesday", "Wednesday" ]
+endfunc
+
+func Test_CmdCompletion()
+ call feedkeys(":com -\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"com -addr bang bar buffer complete count nargs range register', @:)
+
+ call feedkeys(":com -nargs=0 -\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"com -nargs=0 -addr bang bar buffer complete count nargs range register', @:)
+
+ call feedkeys(":com -nargs=\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"com -nargs=* + 0 1 ?', @:)
+
+ call feedkeys(":com -addr=\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"com -addr=arguments buffers lines loaded_buffers quickfix tabs windows', @:)
+
+ call feedkeys(":com -complete=co\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"com -complete=color command compiler', @:)
+
+ command! DoCmd1 :
+ command! DoCmd2 :
+ call feedkeys(":com \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"com DoCmd1 DoCmd2', @:)
+
+ call feedkeys(":DoC\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"DoCmd1 DoCmd2', @:)
+
+ call feedkeys(":delcom DoC\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"delcom DoCmd1 DoCmd2', @:)
+
+ delcom DoCmd1
+ call feedkeys(":delcom DoC\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"delcom DoCmd2', @:)
+
+ call feedkeys(":com DoC\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"com DoCmd2', @:)
+
+ delcom DoCmd2
+ call feedkeys(":delcom DoC\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"delcom DoC', @:)
+
+ call feedkeys(":com DoC\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"com DoC', @:)
+
+ com! -complete=behave DoCmd :
+ call feedkeys(":DoCmd \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"DoCmd mswin xterm', @:)
+
+ " This does not work. Why?
+ "call feedkeys(":DoCmd x\<C-A>\<C-B>\"\<CR>", 'tx')
+ "call assert_equal('"DoCmd xterm', @:)
+
+ com! -complete=custom,CustomComplete DoCmd :
+ call feedkeys(":DoCmd \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"DoCmd January February Mars', @:)
+
+ com! -complete=customlist,CustomCompleteList DoCmd :
+ call feedkeys(":DoCmd \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"DoCmd Monday Tuesday Wednesday', @:)
+
+ com! -complete=custom,CustomCompleteList DoCmd :
+ call assert_fails("call feedkeys(':DoCmd \<C-D>', 'tx')", 'E730:')
+
+ com! -complete=customlist,CustomComp DoCmd :
+ call assert_fails("call feedkeys(':DoCmd \<C-D>', 'tx')", 'E117:')
+endfunc
+
+func CallExecute(A, L, P)
+ " Drop first '\n'
+ return execute('echo "hi"')[1:]
+endfunc
+
+func Test_use_execute_in_completion()
+ command! -nargs=* -complete=custom,CallExecute DoExec :
+ call feedkeys(":DoExec \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"DoExec hi', @:)
+ delcommand DoExec
+endfunc
diff --git a/src/nvim/testdir/test_utf8.vim b/src/nvim/testdir/test_utf8.vim
new file mode 100644
index 0000000000..24e3db86fb
--- /dev/null
+++ b/src/nvim/testdir/test_utf8.vim
@@ -0,0 +1,65 @@
+" Tests for Unicode manipulations
+if !has('multi_byte')
+ finish
+endif
+
+
+" Visual block Insert adjusts for multi-byte char
+func Test_visual_block_insert()
+ new
+ call setline(1, ["aaa", "ใ‚ใ‚ใ‚", "bbb"])
+ exe ":norm! gg0l\<C-V>jjIx\<Esc>"
+ call assert_equal(['axaa', 'xใ‚ใ‚ใ‚', 'bxbb'], getline(1, '$'))
+ bwipeout!
+endfunc
+
+" Test for built-in function strchars()
+func Test_strchars()
+ let inp = ["a", "ใ‚ใ„a", "A\u20dd", "A\u20dd\u20dd", "\u20dd"]
+ let exp = [[1, 1, 1], [3, 3, 3], [2, 2, 1], [3, 3, 1], [1, 1, 1]]
+ for i in range(len(inp))
+ call assert_equal(exp[i][0], strchars(inp[i]))
+ call assert_equal(exp[i][1], strchars(inp[i], 0))
+ call assert_equal(exp[i][2], strchars(inp[i], 1))
+ endfor
+endfunc
+
+" Test for customlist completion
+function! CustomComplete1(lead, line, pos)
+ return ['ใ‚', 'ใ„']
+endfunction
+
+function! CustomComplete2(lead, line, pos)
+ return ['ใ‚ใŸใ—', 'ใ‚ใŸใพ', 'ใ‚ใŸใ‚Šใ‚']
+endfunction
+
+function! CustomComplete3(lead, line, pos)
+ return ['Nใ“', 'Nใ‚“', 'Nใถ']
+endfunction
+
+func Test_customlist_completion()
+ command -nargs=1 -complete=customlist,CustomComplete1 Test1 echo
+ call feedkeys(":Test1 \<C-L>\<C-B>\"\<CR>", 'itx')
+ call assert_equal('"Test1 ', getreg(':'))
+
+ command -nargs=1 -complete=customlist,CustomComplete2 Test2 echo
+ call feedkeys(":Test2 \<C-L>\<C-B>\"\<CR>", 'itx')
+ call assert_equal('"Test2 ใ‚ใŸ', getreg(':'))
+
+ command -nargs=1 -complete=customlist,CustomComplete3 Test3 echo
+ call feedkeys(":Test3 \<C-L>\<C-B>\"\<CR>", 'itx')
+ call assert_equal('"Test3 N', getreg(':'))
+
+ call garbagecollect(1)
+endfunc
+
+" Yank one 3 byte character and check the mark columns.
+func Test_getvcol()
+ new
+ call setline(1, "x\u2500x")
+ normal 0lvy
+ call assert_equal(2, col("'["))
+ call assert_equal(4, col("']"))
+ call assert_equal(2, virtcol("'["))
+ call assert_equal(2, virtcol("']"))
+endfunc
diff --git a/src/nvim/testdir/test_utf8_comparisons.vim b/src/nvim/testdir/test_utf8_comparisons.vim
new file mode 100644
index 0000000000..576e86142f
--- /dev/null
+++ b/src/nvim/testdir/test_utf8_comparisons.vim
@@ -0,0 +1,95 @@
+" Tests for case-insensitive UTF-8 comparisons (utf_strnicmp() in mbyte.c)
+" Also test "g~ap".
+
+if !has("multi_byte")
+ finish
+endif
+
+function! Ch(a, op, b, expected)
+ call assert_equal(eval(printf('"%s" %s "%s"', a:a, a:op, a:b)), a:expected,
+ \ printf('"%s" %s "%s" should return %d', a:a, a:op, a:b, a:expected))
+endfunction
+
+function! Chk(a, b, result)
+ if a:result == 0
+ call Ch(a:a, '==?', a:b, 1)
+ call Ch(a:a, '!=?', a:b, 0)
+ call Ch(a:a, '<=?', a:b, 1)
+ call Ch(a:a, '>=?', a:b, 1)
+ call Ch(a:a, '<?', a:b, 0)
+ call Ch(a:a, '>?', a:b, 0)
+ elseif a:result > 0
+ call Ch(a:a, '==?', a:b, 0)
+ call Ch(a:a, '!=?', a:b, 1)
+ call Ch(a:a, '<=?', a:b, 0)
+ call Ch(a:a, '>=?', a:b, 1)
+ call Ch(a:a, '<?', a:b, 0)
+ call Ch(a:a, '>?', a:b, 1)
+ else
+ call Ch(a:a, '==?', a:b, 0)
+ call Ch(a:a, '!=?', a:b, 1)
+ call Ch(a:a, '<=?', a:b, 1)
+ call Ch(a:a, '>=?', a:b, 0)
+ call Ch(a:a, '<?', a:b, 1)
+ call Ch(a:a, '>?', a:b, 0)
+ endif
+endfunction
+
+function! Check(a, b, result)
+ call Chk(a:a, a:b, a:result)
+ call Chk(a:b, a:a, -a:result)
+endfunction
+
+function! LT(a, b)
+ call Check(a:a, a:b, -1)
+endfunction
+
+function! GT(a, b)
+ call Check(a:a, a:b, 1)
+endfunction
+
+function! EQ(a, b)
+ call Check(a:a, a:b, 0)
+endfunction
+
+function Test_comparisons()
+ call EQ('', '')
+ call LT('', 'a')
+ call EQ('abc', 'abc')
+ call EQ('Abc', 'abC')
+ call LT('ab', 'abc')
+ call LT('AB', 'abc')
+ call LT('ab', 'aBc')
+ call EQ('\xd0\xb9\xd1\x86\xd1\x83\xd0\xba\xd0\xb5\xd0\xbd', '\xd0\xb9\xd0\xa6\xd0\xa3\xd0\xba\xd0\x95\xd0\xbd')
+ call LT('\xd0\xb9\xd1\x86\xd1\x83\xd0\xba\xd0\xb5\xd0\xbd', '\xd0\xaf\xd1\x86\xd1\x83\xd0\xba\xd0\xb5\xd0\xbd')
+ call EQ('\xe2\x84\xaa', 'k')
+ call LT('\xe2\x84\xaa', 'kkkkkk')
+ call EQ('\xe2\x84\xaa\xe2\x84\xaa\xe2\x84\xaa', 'kkk')
+ call LT('kk', '\xe2\x84\xaa\xe2\x84\xaa\xe2\x84\xaa')
+ call EQ('\xe2\x84\xaa\xe2\x84\xa6k\xe2\x84\xaak\xcf\x89', 'k\xcf\x89\xe2\x84\xaakk\xe2\x84\xa6')
+ call EQ('Abc\x80', 'AbC\x80')
+ call LT('Abc\x80', 'AbC\x81')
+ call LT('Abc', 'AbC\x80')
+ call LT('abc\x80DEF', 'abc\x80def') " case folding stops at the first bad character
+ call LT('\xc3XYZ', '\xc3xyz')
+ call EQ('\xef\xbc\xba', '\xef\xbd\x9a') " FF3A (upper), FF5A (lower)
+ call GT('\xef\xbc\xba', '\xef\xbc\xff') " first string is ok and equals \xef\xbd\x9a after folding, second string is illegal and was left unchanged, then the strings were bytewise compared
+ call LT('\xc3', '\xc3\x83')
+ call EQ('\xc3\xa3xYz', '\xc3\x83XyZ')
+ for n in range(0x60, 0xFF)
+ call LT(printf('xYz\x%.2X', n-1), printf('XyZ\x%.2X', n))
+ endfor
+ for n in range(0x80, 0xBF)
+ call EQ(printf('xYz\xc2\x%.2XUvW', n), printf('XyZ\xc2\x%.2XuVw', n))
+ endfor
+ for n in range(0xC0, 0xFF)
+ call LT(printf('xYz\xc2\x%.2XUvW', n), printf('XyZ\xc2\x%.2XuVw', n))
+ endfor
+endfunction
+
+" test that g~ap changes one paragraph only.
+function Test_gap()
+ new
+ call feedkeys("iabcd\n\ndefggg0g~ap", "tx")
+ call assert_equal(["ABCD", "", "defg"], getline(1,3))
+endfunction
diff --git a/src/nvim/testdir/test_viml.vim b/src/nvim/testdir/test_vimscript.vim
index 2d989cdad9..5b16f6d205 100644
--- a/src/nvim/testdir/test_viml.vim
+++ b/src/nvim/testdir/test_vimscript.vim
@@ -55,16 +55,26 @@ endfunction
" ExecAsScript - Source a temporary script made from a function. {{{2
"
" Make a temporary script file from the function a:funcname, ":source" it, and
-" delete it afterwards.
+" delete it afterwards. However, if an exception is thrown the file may remain,
+" the caller should call DeleteTheScript() afterwards.
+let s:script_name = ''
function! ExecAsScript(funcname)
" Make a script from the function passed as argument.
- let script = MakeScript(a:funcname)
+ let s:script_name = MakeScript(a:funcname)
" Source and delete the script.
- exec "source" script
- call delete(script)
+ exec "source" s:script_name
+ call delete(s:script_name)
+ let s:script_name = ''
endfunction
+function! DeleteTheScript()
+ if s:script_name
+ call delete(s:script_name)
+ let s:script_name = ''
+ endif
+endfunc
+
com! -nargs=1 -bar ExecAsScript call ExecAsScript(<f-args>)
@@ -143,6 +153,7 @@ func Test_endwhile_script()
XpathINIT
ExecAsScript T1_F
Xpath 'F'
+ call DeleteTheScript()
try
ExecAsScript T1_G
@@ -152,6 +163,7 @@ func Test_endwhile_script()
Xpath 'x'
endtry
Xpath 'G'
+ call DeleteTheScript()
call assert_equal('abcFhijxG', g:Xpath)
endfunc
@@ -260,6 +272,7 @@ function Test_finish()
XpathINIT
ExecAsScript T4_F
Xpath '5'
+ call DeleteTheScript()
call assert_equal('ab3e3b2c25', g:Xpath)
endfunction
@@ -930,12 +943,21 @@ func Test_type()
call assert_equal(0, type(0))
call assert_equal(1, type(""))
call assert_equal(2, type(function("tr")))
+ call assert_equal(2, type(function("tr", [8])))
call assert_equal(3, type([]))
call assert_equal(4, type({}))
call assert_equal(5, type(0.0))
call assert_equal(6, type(v:false))
call assert_equal(6, type(v:true))
call assert_equal(7, type(v:null))
+ call assert_equal(v:t_number, type(0))
+ call assert_equal(v:t_string, type(""))
+ call assert_equal(v:t_func, type(function("tr")))
+ call assert_equal(v:t_list, type([]))
+ call assert_equal(v:t_dict, type({}))
+ call assert_equal(v:t_float, type(0.0))
+ call assert_equal(v:t_bool, type(v:false))
+ call assert_equal(v:t_bool, type(v:true))
endfunc
"-------------------------------------------------------------------------------
@@ -963,6 +985,316 @@ func Test_skip()
endfunc
"-------------------------------------------------------------------------------
+" Test 93: :echo and string() {{{1
+"-------------------------------------------------------------------------------
+
+func Test_echo_and_string()
+ " String
+ let a = 'foo bar'
+ redir => result
+ echo a
+ echo string(a)
+ redir END
+ let l = split(result, "\n")
+ call assert_equal(["foo bar",
+ \ "'foo bar'"], l)
+
+ " Float
+ if has('float')
+ let a = -1.2e0
+ redir => result
+ echo a
+ echo string(a)
+ redir END
+ let l = split(result, "\n")
+ call assert_equal(["-1.2",
+ \ "-1.2"], l)
+ endif
+
+ " Funcref
+ redir => result
+ echo function('string')
+ echo string(function('string'))
+ redir END
+ let l = split(result, "\n")
+ call assert_equal(["string",
+ \ "function('string')"], l)
+
+ " Empty dictionaries in a list
+ let a = {}
+ redir => result
+ echo [a, a, a]
+ echo string([a, a, a])
+ redir END
+ let l = split(result, "\n")
+ call assert_equal(["[{}, {}, {}]",
+ \ "[{}, {}, {}]"], l)
+
+ " Empty dictionaries in a dictionary
+ let a = {}
+ let b = {"a": a, "b": a}
+ redir => result
+ echo b
+ echo string(b)
+ redir END
+ let l = split(result, "\n")
+ call assert_equal(["{'a': {}, 'b': {}}",
+ \ "{'a': {}, 'b': {}}"], l)
+
+ " Empty lists in a list
+ let a = []
+ redir => result
+ echo [a, a, a]
+ echo string([a, a, a])
+ redir END
+ let l = split(result, "\n")
+ call assert_equal(["[[], [], []]",
+ \ "[[], [], []]"], l)
+
+ " Empty lists in a dictionary
+ let a = []
+ let b = {"a": a, "b": a}
+ redir => result
+ echo b
+ echo string(b)
+ redir END
+ let l = split(result, "\n")
+ call assert_equal(["{'a': [], 'b': []}",
+ \ "{'a': [], 'b': []}"], l)
+endfunc
+
+"-------------------------------------------------------------------------------
+" Test 94: 64-bit Numbers {{{1
+"-------------------------------------------------------------------------------
+
+func Test_num64()
+ if !has('num64')
+ return
+ endif
+
+ call assert_notequal( 4294967296, 0)
+ call assert_notequal(-4294967296, 0)
+ call assert_equal( 4294967296, 0xFFFFffff + 1)
+ call assert_equal(-4294967296, -0xFFFFffff - 1)
+
+ call assert_equal( 9223372036854775807, 1 / 0)
+ call assert_equal(-9223372036854775807, -1 / 0)
+ call assert_equal(-9223372036854775807 - 1, 0 / 0)
+
+ call assert_equal( 0x7FFFffffFFFFffff, float2nr( 1.0e150))
+ call assert_equal(-0x7FFFffffFFFFffff, float2nr(-1.0e150))
+
+ let rng = range(0xFFFFffff, 0x100000001)
+ call assert_equal([0xFFFFffff, 0x100000000, 0x100000001], rng)
+ call assert_equal(0x100000001, max(rng))
+ call assert_equal(0xFFFFffff, min(rng))
+ call assert_equal(rng, sort(range(0x100000001, 0xFFFFffff, -1), 'N'))
+endfunc
+
+"-------------------------------------------------------------------------------
+" Test 95: lines of :append, :change, :insert {{{1
+"-------------------------------------------------------------------------------
+
+function! DefineFunction(name, body)
+ let func = join(['function! ' . a:name . '()'] + a:body + ['endfunction'], "\n")
+ exec func
+endfunction
+
+func Test_script_lines()
+ " :append
+ try
+ call DefineFunction('T_Append', [
+ \ 'append',
+ \ 'py <<EOS',
+ \ '.',
+ \ ])
+ catch
+ call assert_report("Can't define function")
+ endtry
+ try
+ call DefineFunction('T_Append', [
+ \ 'append',
+ \ 'abc',
+ \ ])
+ call assert_report("Shouldn't be able to define function")
+ catch
+ call assert_exception('Vim(function):E126: Missing :endfunction')
+ endtry
+
+ " :change
+ try
+ call DefineFunction('T_Change', [
+ \ 'change',
+ \ 'py <<EOS',
+ \ '.',
+ \ ])
+ catch
+ call assert_report("Can't define function")
+ endtry
+ try
+ call DefineFunction('T_Change', [
+ \ 'change',
+ \ 'abc',
+ \ ])
+ call assert_report("Shouldn't be able to define function")
+ catch
+ call assert_exception('Vim(function):E126: Missing :endfunction')
+ endtry
+
+ " :insert
+ try
+ call DefineFunction('T_Insert', [
+ \ 'insert',
+ \ 'py <<EOS',
+ \ '.',
+ \ ])
+ catch
+ call assert_report("Can't define function")
+ endtry
+ try
+ call DefineFunction('T_Insert', [
+ \ 'insert',
+ \ 'abc',
+ \ ])
+ call assert_report("Shouldn't be able to define function")
+ catch
+ call assert_exception('Vim(function):E126: Missing :endfunction')
+ endtry
+endfunc
+
+"-------------------------------------------------------------------------------
+" Test 96: line continuation {{{1
+"
+" Undefined behavior was detected by ubsan with line continuation
+" after an empty line.
+"-------------------------------------------------------------------------------
+func Test_script_emty_line_continuation()
+
+ \
+endfunc
+
+"-------------------------------------------------------------------------------
+" Test 97: bitwise functions {{{1
+"-------------------------------------------------------------------------------
+func Test_bitwise_functions()
+ " and
+ call assert_equal(127, and(127, 127))
+ call assert_equal(16, and(127, 16))
+ call assert_equal(0, and(127, 128))
+ call assert_fails("call and(1.0, 1)", 'E805:')
+ call assert_fails("call and([], 1)", 'E745:')
+ call assert_fails("call and({}, 1)", 'E728:')
+ call assert_fails("call and(1, 1.0)", 'E805:')
+ call assert_fails("call and(1, [])", 'E745:')
+ call assert_fails("call and(1, {})", 'E728:')
+ " or
+ call assert_equal(23, or(16, 7))
+ call assert_equal(15, or(8, 7))
+ call assert_equal(123, or(0, 123))
+ call assert_fails("call or(1.0, 1)", 'E805:')
+ call assert_fails("call or([], 1)", 'E745:')
+ call assert_fails("call or({}, 1)", 'E728:')
+ call assert_fails("call or(1, 1.0)", 'E805:')
+ call assert_fails("call or(1, [])", 'E745:')
+ call assert_fails("call or(1, {})", 'E728:')
+ " xor
+ call assert_equal(0, xor(127, 127))
+ call assert_equal(111, xor(127, 16))
+ call assert_equal(255, xor(127, 128))
+ call assert_fails("call xor(1.0, 1)", 'E805:')
+ call assert_fails("call xor([], 1)", 'E745:')
+ call assert_fails("call xor({}, 1)", 'E728:')
+ call assert_fails("call xor(1, 1.0)", 'E805:')
+ call assert_fails("call xor(1, [])", 'E745:')
+ call assert_fails("call xor(1, {})", 'E728:')
+ " invert
+ call assert_equal(65408, and(invert(127), 65535))
+ call assert_equal(65519, and(invert(16), 65535))
+ call assert_equal(65407, and(invert(128), 65535))
+ call assert_fails("call invert(1.0)", 'E805:')
+ call assert_fails("call invert([])", 'E745:')
+ call assert_fails("call invert({})", 'E728:')
+endfunc
+
+" Test trailing text after :endfunction {{{1
+func Test_endfunction_trailing()
+ call assert_false(exists('*Xtest'))
+
+ exe "func Xtest()\necho 'hello'\nendfunc\nlet done = 'yes'"
+ call assert_true(exists('*Xtest'))
+ call assert_equal('yes', done)
+ delfunc Xtest
+ unlet done
+
+ exe "func Xtest()\necho 'hello'\nendfunc|let done = 'yes'"
+ call assert_true(exists('*Xtest'))
+ call assert_equal('yes', done)
+ delfunc Xtest
+ unlet done
+
+ " trailing line break
+ exe "func Xtest()\necho 'hello'\nendfunc\n"
+ call assert_true(exists('*Xtest'))
+ delfunc Xtest
+
+ set verbose=1
+ exe "func Xtest()\necho 'hello'\nendfunc \" garbage"
+ call assert_notmatch('W22:', split(execute('1messages'), "\n")[0])
+ call assert_true(exists('*Xtest'))
+ delfunc Xtest
+
+ exe "func Xtest()\necho 'hello'\nendfunc garbage"
+ call assert_match('W22:', split(execute('1messages'), "\n")[0])
+ call assert_true(exists('*Xtest'))
+ delfunc Xtest
+ set verbose=0
+
+ function Foo()
+ echo 'hello'
+ endfunction | echo 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
+ delfunc Foo
+endfunc
+
+func Test_delfunction_force()
+ delfunc! Xtest
+ delfunc! Xtest
+ func Xtest()
+ echo 'nothing'
+ endfunc
+ delfunc! Xtest
+ delfunc! Xtest
+endfunc
+
+" Test using bang after user command {{{1
+func Test_user_command_with_bang()
+ command -bang Nieuw let nieuw = 1
+ Ni!
+ call assert_equal(1, nieuw)
+ unlet nieuw
+ delcommand Nieuw
+endfunc
+
+" Test for script-local function
+func <SID>DoLast()
+ call append(line('$'), "last line")
+endfunc
+
+func s:DoNothing()
+ call append(line('$'), "nothing line")
+endfunc
+
+func Test_script_local_func()
+ set nocp viminfo+=nviminfo
+ new
+ nnoremap <buffer> _x :call <SID>DoNothing()<bar>call <SID>DoLast()<bar>delfunc <SID>DoNothing<bar>delfunc <SID>DoLast<cr>
+
+ normal _x
+ call assert_equal('nothing line', getline(2))
+ call assert_equal('last line', getline(3))
+ enew! | close
+endfunc
+
+"-------------------------------------------------------------------------------
" Modelines {{{1
" vim: ts=8 sw=4 tw=80 fdm=marker
" vim: fdt=substitute(substitute(foldtext(),\ '\\%(^+--\\)\\@<=\\(\\s*\\)\\(.\\{-}\\)\:\ \\%(\"\ \\)\\=\\(Test\ \\d*\\)\:\\s*',\ '\\3\ (\\2)\:\ \\1',\ \"\"),\ '\\(Test\\s*\\)\\(\\d\\)\\D\\@=',\ '\\1\ \\2',\ "")
diff --git a/src/nvim/testdir/test_virtualedit.vim b/src/nvim/testdir/test_virtualedit.vim
new file mode 100644
index 0000000000..d49025237b
--- /dev/null
+++ b/src/nvim/testdir/test_virtualedit.vim
@@ -0,0 +1,61 @@
+" Tests for 'virtualedit'.
+
+func Test_yank_move_change()
+ new
+ call setline(1, [
+ \ "func foo() error {",
+ \ "\tif n, err := bar();",
+ \ "\terr != nil {",
+ \ "\t\treturn err",
+ \ "\t}",
+ \ "\tn = n * n",
+ \ ])
+ set virtualedit=all
+ set ts=4
+ function! MoveSelectionDown(count) abort
+ normal! m`
+ silent! exe "'<,'>move'>+".a:count
+ norm! ``
+ endfunction
+
+ xmap ]e :<C-U>call MoveSelectionDown(v:count1)<CR>
+ 2
+ normal 2gg
+ normal J
+ normal jVj
+ normal ]e
+ normal ce
+ bwipe!
+ set virtualedit=
+ set ts=8
+endfunc
+
+func Test_paste_end_of_line()
+ new
+ set virtualedit=all
+ call setline(1, ['456', '123'])
+ normal! gg0"ay$
+ exe "normal! 2G$lllA\<C-O>:normal! \"agP\r"
+ call assert_equal('123456', getline(2))
+
+ bwipe!
+ set virtualedit=
+endfunc
+
+func Test_edit_CTRL_G()
+ new
+ set virtualedit=insert
+ call setline(1, ['123', '1', '12'])
+ exe "normal! ggA\<c-g>jx\<c-g>jx"
+ call assert_equal(['123', '1 x', '12 x'], getline(1,'$'))
+
+ set virtualedit=all
+ %d_
+ call setline(1, ['1', '12'])
+ exe "normal! ggllix\<c-g>jx"
+ call assert_equal(['1 x', '12x'], getline(1,'$'))
+
+
+ bwipe!
+ set virtualedit=
+endfunc
diff --git a/src/nvim/testdir/test_visual.vim b/src/nvim/testdir/test_visual.vim
new file mode 100644
index 0000000000..4a143d665d
--- /dev/null
+++ b/src/nvim/testdir/test_visual.vim
@@ -0,0 +1,320 @@
+" Tests for various Visual mode.
+if !has('visual')
+ finish
+endif
+
+
+func Test_block_shift_multibyte()
+ " Uses double-wide character.
+ if !has('multi_byte')
+ return
+ endif
+ split
+ call setline(1, ['xใƒนxxx', 'ใƒนxxx'])
+ exe "normal 1G0l\<C-V>jl>"
+ call assert_equal('x ใƒนxxx', getline(1))
+ call assert_equal(' ใƒนxxx', getline(2))
+ q!
+endfunc
+
+func Test_block_shift_overflow()
+ " This used to cause a multiplication overflow followed by a crash.
+ new
+ normal ii
+ exe "normal \<C-V>876543210>"
+ q!
+endfunc
+
+func Test_Visual_ctrl_o()
+ new
+ call setline(1, ['one', 'two', 'three'])
+ call cursor(1,2)
+ set noshowmode
+ set tw=0
+ call feedkeys("\<c-v>jjlIa\<c-\>\<c-o>:set tw=88\<cr>\<esc>", 'tx')
+ call assert_equal(['oane', 'tawo', 'tahree'], getline(1, 3))
+ call assert_equal(88, &tw)
+ set tw&
+ bw!
+endfu
+
+func Test_Visual_vapo()
+ new
+ normal oxx
+ normal vapo
+ bwipe!
+endfunc
+
+func Test_dotregister_paste()
+ new
+ exe "norm! ihello world\<esc>"
+ norm! 0ve".p
+ call assert_equal('hello world world', getline(1))
+ q!
+endfunc
+
+func Test_Visual_inner_quote()
+ new
+ normal oxX
+ normal vki'
+ bwipe!
+endfunc
+
+" Test for visual block shift and tab characters.
+func Test_block_shift_tab()
+ enew!
+ call append(0, repeat(['one two three'], 5))
+ call cursor(1,1)
+ exe "normal i\<C-G>u"
+ exe "normal fe\<C-V>4jR\<Esc>ugvr1"
+ call assert_equal('on1 two three', getline(1))
+ call assert_equal('on1 two three', getline(2))
+ call assert_equal('on1 two three', getline(5))
+
+ enew!
+ call append(0, repeat(['abcdefghijklmnopqrstuvwxyz'], 5))
+ call cursor(1,1)
+ exe "normal \<C-V>4jI \<Esc>j<<11|D"
+ exe "normal j7|a\<Tab>\<Tab>"
+ exe "normal j7|a\<Tab>\<Tab> "
+ exe "normal j7|a\<Tab> \<Tab>\<Esc>4k13|\<C-V>4j<"
+ call assert_equal(' abcdefghijklmnopqrstuvwxyz', getline(1))
+ call assert_equal('abcdefghij', getline(2))
+ call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(3))
+ call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(4))
+ call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(5))
+
+ %s/\s\+//g
+ call cursor(1,1)
+ exe "normal \<C-V>4jI \<Esc>j<<"
+ exe "normal j7|a\<Tab>\<Tab>"
+ exe "normal j7|a\<Tab>\<Tab>\<Tab>\<Tab>\<Tab>"
+ exe "normal j7|a\<Tab> \<Tab>\<Tab>\<Esc>4k13|\<C-V>4j3<"
+ call assert_equal(' abcdefghijklmnopqrstuvwxyz', getline(1))
+ call assert_equal('abcdefghij', getline(2))
+ call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(3))
+ call assert_equal(" abc\<Tab>\<Tab>defghijklmnopqrstuvwxyz", getline(4))
+ call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(5))
+
+ enew!
+endfunc
+
+" Tests Blockwise Visual when there are TABs before the text.
+func Test_blockwise_visual()
+ enew!
+ call append(0, ['123456',
+ \ '234567',
+ \ '345678',
+ \ '',
+ \ 'test text test tex start here',
+ \ "\t\tsome text",
+ \ "\t\ttest text",
+ \ 'test text'])
+ call cursor(1,1)
+ exe "normal /start here$\<CR>"
+ exe 'normal "by$' . "\<C-V>jjlld"
+ exe "normal /456$\<CR>"
+ exe "normal \<C-V>jj" . '"bP'
+ call assert_equal(['123start here56',
+ \ '234start here67',
+ \ '345start here78',
+ \ '',
+ \ 'test text test tex rt here',
+ \ "\t\tsomext",
+ \ "\t\ttesext"], getline(1, 7))
+
+ enew!
+endfunc
+
+" Test swapping corners in blockwise visual mode with o and O
+func Test_blockwise_visual_o_O()
+ enew!
+
+ exe "norm! 10i.\<Esc>Y4P3lj\<C-V>4l2jr "
+ exe "norm! gvO\<Esc>ra"
+ exe "norm! gvO\<Esc>rb"
+ exe "norm! gvo\<C-c>rc"
+ exe "norm! gvO\<C-c>rd"
+
+ call assert_equal(['..........',
+ \ '...c d..',
+ \ '... ..',
+ \ '...a b..',
+ \ '..........'], getline(1, '$'))
+
+ enew!
+endfun
+
+" Test Virtual replace mode.
+func Test_virtual_replace()
+ throw 'skipped: TODO: '
+ if exists('&t_kD')
+ let save_t_kD = &t_kD
+ endif
+ if exists('&t_kb')
+ let save_t_kb = &t_kb
+ endif
+ exe "set t_kD=\<C-V>x7f t_kb=\<C-V>x08"
+ enew!
+ exe "normal a\nabcdefghi\njk\tlmn\n opq rst\n\<C-D>uvwxyz"
+ call cursor(1,1)
+ set ai bs=2
+ exe "normal gR0\<C-D> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR"
+ call assert_equal([' 1',
+ \ ' A',
+ \ ' BCDEFGHIJ',
+ \ ' KL',
+ \ ' MNO',
+ \ ' PQR',
+ \ ], getline(1, 6))
+ normal G
+ mark a
+ inoremap <C-D> <Del>
+ exe "normal o0\<C-D>\nabcdefghi\njk\tlmn\n opq\trst\n\<C-D>uvwxyz\n"
+ exe "normal 'ajgR0\<C-D> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR" . repeat("\<BS>", 29)
+ call assert_equal([' 1',
+ \ 'abcdefghi',
+ \ 'jk lmn',
+ \ ' opq rst',
+ \ 'uvwxyz'], getline(7, 11))
+ normal G
+ exe "normal iab\tcdefghi\tjkl"
+ exe "normal 0gRAB......CDEFGHI.J\<Esc>o"
+ exe "normal iabcdefghijklmnopqrst\<Esc>0gRAB\tIJKLMNO\tQR"
+ call assert_equal(['AB......CDEFGHI.Jkl',
+ \ 'AB IJKLMNO QRst'], getline(12, 13))
+ enew!
+ set noai bs&vim
+ if exists('save_t_kD')
+ let &t_kD = save_t_kD
+ endif
+ if exists('save_t_kb')
+ let &t_kb = save_t_kb
+ endif
+endfunc
+
+" Test Virtual replace mode.
+func Test_virtual_replace2()
+ enew!
+ set bs=2
+ exe "normal a\nabcdefghi\njk\tlmn\n opq rst\n\<C-D>uvwxyz"
+ call cursor(1,1)
+ " Test 1: Test that del deletes the newline
+ exe "normal gR0\<del> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR"
+ call assert_equal(['0 1',
+ \ 'A',
+ \ 'BCDEFGHIJ',
+ \ ' KL',
+ \ 'MNO',
+ \ 'PQR',
+ \ ], getline(1, 6))
+ " Test 2:
+ " a newline is not deleted, if no newline has been added in virtual replace mode
+ %d_
+ call setline(1, ['abcd', 'efgh', 'ijkl'])
+ call cursor(2,1)
+ exe "norm! gR1234\<cr>5\<bs>\<bs>\<bs>"
+ call assert_equal(['abcd',
+ \ '123h',
+ \ 'ijkl'], getline(1, '$'))
+ " Test 3:
+ " a newline is deleted, if a newline has been inserted before in virtual replace mode
+ %d_
+ call setline(1, ['abcd', 'efgh', 'ijkl'])
+ call cursor(2,1)
+ exe "norm! gR1234\<cr>\<cr>56\<bs>\<bs>\<bs>"
+ call assert_equal(['abcd',
+ \ '1234',
+ \ 'ijkl'], getline(1, '$'))
+ " Test 4:
+ " delete add a newline, delete it, add it again and check undo
+ %d_
+ call setline(1, ['abcd', 'efgh', 'ijkl'])
+ call cursor(2,1)
+ " break undo sequence explicitly
+ let &ul = &ul
+ exe "norm! gR1234\<cr>\<bs>\<del>56\<cr>"
+ let &ul = &ul
+ call assert_equal(['abcd',
+ \ '123456',
+ \ ''], getline(1, '$'))
+ norm! u
+ call assert_equal(['abcd',
+ \ 'efgh',
+ \ 'ijkl'], getline(1, '$'))
+ " clean up
+ %d_
+ set bs&vim
+endfunc
+
+" Test for Visual mode not being reset causing E315 error.
+func TriggerTheProblem()
+ " At this point there is no visual selection because :call reset it.
+ " Let's restore the selection:
+ normal gv
+ '<,'>del _
+ try
+ exe "normal \<Esc>"
+ catch /^Vim\%((\a\+)\)\=:E315/
+ echom 'Snap! E315 error!'
+ let g:msg = 'Snap! E315 error!'
+ endtry
+endfunc
+
+func Test_visual_mode_reset()
+ set belloff=all
+ enew
+ let g:msg = "Everything's fine."
+ enew
+ setl buftype=nofile
+ call append(line('$'), 'Delete this line.')
+
+ " NOTE: this has to be done by a call to a function because executing :del
+ " the ex-way will require the colon operator which resets the visual mode
+ " thus preventing the problem:
+ exe "normal! GV:call TriggerTheProblem()\<CR>"
+ call assert_equal("Everything's fine.", g:msg)
+
+ set belloff&
+endfunc
+
+func Test_Visual_sentence_textobject()
+ new
+ call setline(1, ['First sentence. Second sentence. Third', 'sentence. Fouth sentence'])
+
+ " When start and end of visual area are identical, 'as' or 'is' select
+ " the whole sentence.
+ norm! 1gofdvasy
+ call assert_equal('Second sentence. ', @")
+ norm! 1gofdvisy
+ call assert_equal('Second sentence.', @")
+
+ " When start and end of visual area are not identical, 'as' or 'is'
+ " extend the sentence in direction of the end of the visual area.
+ norm! 1gofdvlasy
+ call assert_equal('d sentence. ', @")
+ norm! gvasy
+ call assert_equal("d sentence. Third\nsentence. ", @")
+
+ norm! 1gofdvlisy
+ call assert_equal('d sentence.', @")
+ norm! gvisy
+ call assert_equal('d sentence. ', @")
+ norm! gvisy
+ call assert_equal("d sentence. Third\nsentence.", @")
+
+ " Extend visual area in opposite direction.
+ norm! 1gofdvhasy
+ call assert_equal(' Second', @")
+ norm! gvasy
+ call assert_equal("First sentence. Second", @")
+
+ norm! 1gofdvhisy
+ call assert_equal('Second', @")
+ norm! gvisy
+ call assert_equal(' Second', @")
+ norm! gvisy
+ call assert_equal('First sentence. Second', @")
+
+ bwipe!
+endfunc
diff --git a/src/nvim/testdir/test_winbuf_close.vim b/src/nvim/testdir/test_winbuf_close.vim
new file mode 100644
index 0000000000..e4618610cd
--- /dev/null
+++ b/src/nvim/testdir/test_winbuf_close.vim
@@ -0,0 +1,160 @@
+" Test for commands that close windows and/or buffers:
+" :quit
+" :close
+" :hide
+" :only
+" :sall
+" :all
+" :ball
+" :buf
+" :edit
+"
+func Test_winbuf_close()
+ enew | only
+
+ call writefile(['testtext 1'], 'Xtest1')
+ call writefile(['testtext 2'], 'Xtest2')
+ call writefile(['testtext 3'], 'Xtest3')
+
+ next! Xtest1 Xtest2
+ call setline(1, 'testtext 1 1')
+
+ " test for working :n when hidden set
+ set hidden
+ next
+ call assert_equal('Xtest2', bufname('%'))
+
+ " test for failing :rew when hidden not set
+ set nohidden
+ call setline(1, 'testtext 2 2')
+ call assert_fails('rewind', 'E37')
+ call assert_equal('Xtest2', bufname('%'))
+ call assert_equal('testtext 2 2', getline(1))
+
+ " test for working :rew when hidden set
+ set hidden
+ rewind
+ call assert_equal('Xtest1', bufname('%'))
+ call assert_equal('testtext 1 1', getline(1))
+
+ " test for :all keeping a buffer when it's modified
+ set nohidden
+ call setline(1, 'testtext 1 1 1')
+ split
+ next Xtest2 Xtest3
+ all
+ 1wincmd w
+ call assert_equal('Xtest1', bufname('%'))
+ call assert_equal('testtext 1 1 1', getline(1))
+
+ " test abandoning changed buffer, should be unloaded even when 'hidden' set
+ set hidden
+ call setline(1, 'testtext 1 1 1 1')
+ quit!
+ call assert_equal('Xtest2', bufname('%'))
+ call assert_equal('testtext 2 2', getline(1))
+ unhide
+ call assert_equal('Xtest2', bufname('%'))
+ call assert_equal('testtext 2 2', getline(1))
+
+ " test ":hide" hides anyway when 'hidden' not set
+ set nohidden
+ call setline(1, 'testtext 2 2 2')
+ hide
+ call assert_equal('Xtest3', bufname('%'))
+ call assert_equal('testtext 3', getline(1))
+
+ " test ":edit" failing in modified buffer when 'hidden' not set
+ call setline(1, 'testtext 3 3')
+ call assert_fails('edit Xtest1', 'E37')
+ call assert_equal('Xtest3', bufname('%'))
+ call assert_equal('testtext 3 3', getline(1))
+
+ " test ":edit" working in modified buffer when 'hidden' set
+ set hidden
+ edit Xtest1
+ call assert_equal('Xtest1', bufname('%'))
+ call assert_equal('testtext 1', getline(1))
+
+ " test ":close" not hiding when 'hidden' not set in modified buffer
+ split Xtest3
+ set nohidden
+ call setline(1, 'testtext 3 3 3')
+ call assert_fails('close', 'E37')
+ call assert_equal('Xtest3', bufname('%'))
+ call assert_equal('testtext 3 3 3', getline(1))
+
+ " test ":close!" does hide when 'hidden' not set in modified buffer;
+ call setline(1, 'testtext 3 3 3 3')
+ close!
+ call assert_equal('Xtest1', bufname('%'))
+ call assert_equal('testtext 1', getline(1))
+
+ set nohidden
+
+ " test ":all!" hides changed buffer
+ split Xtest4
+ call setline(1, 'testtext 4')
+ all!
+ 1wincmd w
+ call assert_equal('Xtest2', bufname('%'))
+ call assert_equal('testtext 2 2 2', getline(1))
+
+ " test ":q!" and hidden buffer.
+ bwipe! Xtest1 Xtest2 Xtest3 Xtest4
+ split Xtest1
+ wincmd w
+ bwipe!
+ set modified
+ bot split Xtest2
+ set modified
+ bot split Xtest3
+ set modified
+ wincmd t
+ hide
+ call assert_equal('Xtest2', bufname('%'))
+ quit!
+ call assert_equal('Xtest3', bufname('%'))
+ call assert_fails('silent! quit!', 'E162')
+ call assert_equal('Xtest1', bufname('%'))
+
+ call delete('Xtest1')
+ call delete('Xtest2')
+ call delete('Xtest3')
+endfunc
+
+" Test that ":close" will respect 'winfixheight' when possible.
+func Test_winfixheight_on_close()
+ set nosplitbelow nosplitright
+
+ split | split | vsplit
+
+ $wincmd w
+ setlocal winfixheight
+ let l:height = winheight(0)
+
+ 3close
+
+ call assert_equal(l:height, winheight(0))
+
+ %bwipeout!
+ setlocal nowinfixheight splitbelow& splitright&
+endfunc
+
+" Test that ":close" will respect 'winfixwidth' when possible.
+func Test_winfixwidth_on_close()
+ set nosplitbelow nosplitright
+
+ vsplit | vsplit | split
+
+ $wincmd w
+ setlocal winfixwidth
+ let l:width = winwidth(0)
+
+ 3close
+
+ call assert_equal(l:width, winwidth(0))
+
+ %bwipeout!
+ setlocal nowinfixwidth splitbelow& splitright&
+endfunction
diff --git a/src/nvim/testdir/test_window_cmd.vim b/src/nvim/testdir/test_window_cmd.vim
new file mode 100644
index 0000000000..b3ab6957dc
--- /dev/null
+++ b/src/nvim/testdir/test_window_cmd.vim
@@ -0,0 +1,521 @@
+" Tests for window cmd (:wincmd, :split, :vsplit, :resize and etc...)
+
+func Test_window_cmd_ls0_with_split()
+ set ls=0
+ set splitbelow
+ split
+ quit
+ call assert_equal(0, &lines - &cmdheight - winheight(0))
+ new | only!
+ "
+ set splitbelow&vim
+ botright split
+ quit
+ call assert_equal(0, &lines - &cmdheight - winheight(0))
+ new | only!
+ set ls&vim
+endfunc
+
+func Test_window_cmd_cmdwin_with_vsp()
+ let efmt = 'Expected 0 but got %d (in ls=%d, %s window)'
+ for v in range(0, 2)
+ exec "set ls=" . v
+ vsplit
+ call feedkeys("q:\<CR>")
+ let ac = &lines - (&cmdheight + winheight(0) + !!v)
+ let emsg = printf(efmt, ac, v, 'left')
+ call assert_equal(0, ac, emsg)
+ wincmd w
+ let ac = &lines - (&cmdheight + winheight(0) + !!v)
+ let emsg = printf(efmt, ac, v, 'right')
+ call assert_equal(0, ac, emsg)
+ new | only!
+ endfor
+ set ls&vim
+endfunc
+
+function Test_window_cmd_wincmd_gf()
+ let fname = 'test_gf.txt'
+ let swp_fname = '.' . fname . '.swp'
+ call writefile([], fname)
+ call writefile([], swp_fname)
+ function s:swap_exists()
+ let v:swapchoice = s:swap_choice
+ endfunc
+ augroup test_window_cmd_wincmd_gf
+ autocmd!
+ exec "autocmd SwapExists " . fname . " call s:swap_exists()"
+ augroup END
+
+ call setline(1, fname)
+ " (E)dit anyway
+ let s:swap_choice = 'e'
+ wincmd gf
+ call assert_equal(2, tabpagenr())
+ call assert_equal(fname, bufname("%"))
+ quit!
+
+ " (Q)uit
+ let s:swap_choice = 'q'
+ wincmd gf
+ call assert_equal(1, tabpagenr())
+ call assert_notequal(fname, bufname("%"))
+ new | only!
+
+ call delete(fname)
+ call delete(swp_fname)
+ augroup! test_window_cmd_wincmd_gf
+endfunc
+
+func Test_next_split_all()
+ " This was causing an illegal memory access.
+ n x
+ norm axxx
+ split
+ split
+ s/x
+ s/x
+ all
+ bwipe!
+endfunc
+
+func Test_window_quit()
+ e Xa
+ split Xb
+ call assert_equal(2, winnr('$'))
+ call assert_equal('Xb', bufname(winbufnr(1)))
+ call assert_equal('Xa', bufname(winbufnr(2)))
+
+ wincmd q
+ call assert_equal(1, winnr('$'))
+ call assert_equal('Xa', bufname(winbufnr(1)))
+
+ bw Xa Xb
+endfunc
+
+func Test_window_horizontal_split()
+ call assert_equal(1, winnr('$'))
+ 3wincmd s
+ call assert_equal(2, winnr('$'))
+ call assert_equal(3, winheight(0))
+ call assert_equal(winwidth(1), winwidth(2))
+
+ call assert_fails('botright topleft wincmd s', 'E442:')
+ bw
+endfunc
+
+func Test_window_vertical_split()
+ call assert_equal(1, winnr('$'))
+ 3wincmd v
+ call assert_equal(2, winnr('$'))
+ call assert_equal(3, winwidth(0))
+ call assert_equal(winheight(1), winheight(2))
+
+ call assert_fails('botright topleft wincmd v', 'E442:')
+ bw
+endfunc
+
+func Test_window_split_edit_alternate()
+ e Xa
+ e Xb
+
+ wincmd ^
+ call assert_equal('Xa', bufname(winbufnr(1)))
+ call assert_equal('Xb', bufname(winbufnr(2)))
+
+ bw Xa Xb
+endfunc
+
+func Test_window_preview()
+ " Open a preview window
+ pedit Xa
+ call assert_equal(2, winnr('$'))
+ call assert_equal(0, &previewwindow)
+
+ " Go to the preview window
+ wincmd P
+ call assert_equal(1, &previewwindow)
+
+ " Close preview window
+ wincmd z
+ call assert_equal(1, winnr('$'))
+ call assert_equal(0, &previewwindow)
+
+ call assert_fails('wincmd P', 'E441:')
+endfunc
+
+func Test_window_exchange()
+ e Xa
+
+ " Nothing happens with window exchange when there is 1 window
+ wincmd x
+ call assert_equal(1, winnr('$'))
+
+ split Xb
+ split Xc
+
+ call assert_equal('Xc', bufname(winbufnr(1)))
+ call assert_equal('Xb', bufname(winbufnr(2)))
+ call assert_equal('Xa', bufname(winbufnr(3)))
+
+ " Exchange current window 1 with window 3
+ 3wincmd x
+ call assert_equal('Xa', bufname(winbufnr(1)))
+ call assert_equal('Xb', bufname(winbufnr(2)))
+ call assert_equal('Xc', bufname(winbufnr(3)))
+
+ " Exchange window with next when at the top window
+ wincmd x
+ call assert_equal('Xb', bufname(winbufnr(1)))
+ call assert_equal('Xa', bufname(winbufnr(2)))
+ call assert_equal('Xc', bufname(winbufnr(3)))
+
+ " Exchange window with next when at the middle window
+ wincmd j
+ wincmd x
+ call assert_equal('Xb', bufname(winbufnr(1)))
+ call assert_equal('Xc', bufname(winbufnr(2)))
+ call assert_equal('Xa', bufname(winbufnr(3)))
+
+ " Exchange window with next when at the bottom window.
+ " When there is no next window, it exchanges with the previous window.
+ wincmd j
+ wincmd x
+ call assert_equal('Xb', bufname(winbufnr(1)))
+ call assert_equal('Xa', bufname(winbufnr(2)))
+ call assert_equal('Xc', bufname(winbufnr(3)))
+
+ bw Xa Xb Xc
+endfunc
+
+func Test_window_rotate()
+ e Xa
+ split Xb
+ split Xc
+ call assert_equal('Xc', bufname(winbufnr(1)))
+ call assert_equal('Xb', bufname(winbufnr(2)))
+ call assert_equal('Xa', bufname(winbufnr(3)))
+
+ " Rotate downwards
+ wincmd r
+ call assert_equal('Xa', bufname(winbufnr(1)))
+ call assert_equal('Xc', bufname(winbufnr(2)))
+ call assert_equal('Xb', bufname(winbufnr(3)))
+
+ 2wincmd r
+ call assert_equal('Xc', bufname(winbufnr(1)))
+ call assert_equal('Xb', bufname(winbufnr(2)))
+ call assert_equal('Xa', bufname(winbufnr(3)))
+
+ " Rotate upwards
+ wincmd R
+ call assert_equal('Xb', bufname(winbufnr(1)))
+ call assert_equal('Xa', bufname(winbufnr(2)))
+ call assert_equal('Xc', bufname(winbufnr(3)))
+
+ 2wincmd R
+ call assert_equal('Xc', bufname(winbufnr(1)))
+ call assert_equal('Xb', bufname(winbufnr(2)))
+ call assert_equal('Xa', bufname(winbufnr(3)))
+
+ bot vsplit
+ call assert_fails('wincmd R', 'E443:')
+
+ bw Xa Xb Xc
+endfunc
+
+func Test_window_height()
+ e Xa
+ split Xb
+
+ let [wh1, wh2] = [winheight(1), winheight(2)]
+ " Active window (1) should have the same height or 1 more
+ " than the other window.
+ call assert_inrange(wh2, wh2 + 1, wh1)
+
+ wincmd -
+ call assert_equal(wh1 - 1, winheight(1))
+ call assert_equal(wh2 + 1, winheight(2))
+
+ wincmd +
+ call assert_equal(wh1, winheight(1))
+ call assert_equal(wh2, winheight(2))
+
+ 2wincmd _
+ call assert_equal(2, winheight(1))
+ call assert_equal(wh1 + wh2 - 2, winheight(2))
+
+ wincmd =
+ call assert_equal(wh1, winheight(1))
+ call assert_equal(wh2, winheight(2))
+
+ 2wincmd _
+ set winfixheight
+ split Xc
+ let [wh1, wh2, wh3] = [winheight(1), winheight(2), winheight(3)]
+ call assert_equal(2, winheight(2))
+ call assert_inrange(wh3, wh3 + 1, wh1)
+ 3wincmd +
+ call assert_equal(2, winheight(2))
+ call assert_equal(wh1 + 3, winheight(1))
+ call assert_equal(wh3 - 3, winheight(3))
+ wincmd =
+ call assert_equal(2, winheight(2))
+ call assert_equal(wh1, winheight(1))
+ call assert_equal(wh3, winheight(3))
+
+ wincmd j
+ set winfixheight&
+
+ wincmd =
+ let [wh1, wh2, wh3] = [winheight(1), winheight(2), winheight(3)]
+ " Current window (2) should have the same height or 1 more
+ " than the other windows.
+ call assert_inrange(wh1, wh1 + 1, wh2)
+ call assert_inrange(wh3, wh3 + 1, wh2)
+
+ bw Xa Xb Xc
+endfunc
+
+func Test_window_width()
+ e Xa
+ vsplit Xb
+
+ let [ww1, ww2] = [winwidth(1), winwidth(2)]
+ " Active window (1) should have the same width or 1 more
+ " than the other window.
+ call assert_inrange(ww2, ww2 + 1, ww1)
+
+ wincmd <
+ call assert_equal(ww1 - 1, winwidth(1))
+ call assert_equal(ww2 + 1, winwidth(2))
+
+ wincmd >
+ call assert_equal(ww1, winwidth(1))
+ call assert_equal(ww2, winwidth(2))
+
+ 2wincmd |
+ call assert_equal(2, winwidth(1))
+ call assert_equal(ww1 + ww2 - 2, winwidth(2))
+
+ wincmd =
+ call assert_equal(ww1, winwidth(1))
+ call assert_equal(ww2, winwidth(2))
+
+ 2wincmd |
+ set winfixwidth
+ vsplit Xc
+ let [ww1, ww2, ww3] = [winwidth(1), winwidth(2), winwidth(3)]
+ call assert_equal(2, winwidth(2))
+ call assert_inrange(ww3, ww3 + 1, ww1)
+ 3wincmd >
+ call assert_equal(2, winwidth(2))
+ call assert_equal(ww1 + 3, winwidth(1))
+ call assert_equal(ww3 - 3, winwidth(3))
+ wincmd =
+ call assert_equal(2, winwidth(2))
+ call assert_equal(ww1, winwidth(1))
+ call assert_equal(ww3, winwidth(3))
+
+ wincmd l
+ set winfixwidth&
+
+ wincmd =
+ let [ww1, ww2, ww3] = [winwidth(1), winwidth(2), winwidth(3)]
+ " Current window (2) should have the same width or 1 more
+ " than the other windows.
+ call assert_inrange(ww1, ww1 + 1, ww2)
+ call assert_inrange(ww3, ww3 + 1, ww2)
+
+ bw Xa Xb Xc
+endfunc
+
+func Test_equalalways_on_close()
+ set equalalways
+ vsplit
+ windo split
+ split
+ wincmd J
+ " now we have a frame top-left with two windows, a frame top-right with two
+ " windows and a frame at the bottom, full-width.
+ let height_1 = winheight(1)
+ let height_2 = winheight(2)
+ let height_3 = winheight(3)
+ let height_4 = winheight(4)
+ " closing the bottom window causes all windows to be resized.
+ close
+ call assert_notequal(height_1, winheight(1))
+ call assert_notequal(height_2, winheight(2))
+ call assert_notequal(height_3, winheight(3))
+ call assert_notequal(height_4, winheight(4))
+ call assert_equal(winheight(1), winheight(3))
+ call assert_equal(winheight(2), winheight(4))
+
+ 1wincmd w
+ split
+ 4wincmd w
+ resize + 5
+ " left column has three windows, equalized heights.
+ " right column has two windows, top one a bit higher
+ let height_1 = winheight(1)
+ let height_2 = winheight(2)
+ let height_4 = winheight(4)
+ let height_5 = winheight(5)
+ 3wincmd w
+ " closing window in left column equalizes heights in left column but not in
+ " the right column
+ close
+ call assert_notequal(height_1, winheight(1))
+ call assert_notequal(height_2, winheight(2))
+ call assert_equal(height_4, winheight(3))
+ call assert_equal(height_5, winheight(4))
+
+ only
+ set equalalways&
+endfunc
+
+func Test_win_screenpos()
+ call assert_equal(1, winnr('$'))
+ split
+ vsplit
+ 10wincmd _
+ 30wincmd |
+ call assert_equal([1, 1], win_screenpos(1))
+ call assert_equal([1, 32], win_screenpos(2))
+ call assert_equal([12, 1], win_screenpos(3))
+ call assert_equal([0, 0], win_screenpos(4))
+ only
+endfunc
+
+func Test_window_jump_tag()
+ help
+ /iccf
+ call assert_match('^|iccf|', getline('.'))
+ call assert_equal(2, winnr('$'))
+ 2wincmd }
+ call assert_equal(3, winnr('$'))
+ call assert_match('^|iccf|', getline('.'))
+ wincmd k
+ call assert_match('\*iccf\*', getline('.'))
+ call assert_equal(2, winheight(0))
+
+ wincmd z
+ set previewheight=4
+ help
+ /bugs
+ wincmd }
+ wincmd k
+ call assert_match('\*bugs\*', getline('.'))
+ call assert_equal(4, winheight(0))
+ set previewheight&
+
+ %bw!
+endfunc
+
+func Test_window_newtab()
+ e Xa
+
+ call assert_equal(1, tabpagenr('$'))
+ call assert_equal("\nAlready only one window", execute('wincmd T'))
+
+ split Xb
+ split Xc
+
+ wincmd T
+ call assert_equal(2, tabpagenr('$'))
+ call assert_equal(['Xb', 'Xa'], map(tabpagebuflist(1), 'bufname(v:val)'))
+ call assert_equal(['Xc' ], map(tabpagebuflist(2), 'bufname(v:val)'))
+
+ %bw!
+endfunc
+
+
+" Tests for adjusting window and contents
+func GetScreenStr(row)
+ let str = ""
+ for c in range(1,3)
+ let str .= nr2char(screenchar(a:row, c))
+ endfor
+ return str
+endfunc
+
+func Test_window_contents()
+ enew! | only | new
+ call setline(1, range(1,256))
+
+ exe "norm! \<C-W>t\<C-W>=1Gzt\<C-W>w\<C-W>+"
+ redraw
+ let s3 = GetScreenStr(1)
+ wincmd p
+ call assert_equal(1, line("w0"))
+ call assert_equal('1 ', s3)
+
+ exe "norm! \<C-W>t\<C-W>=50Gzt\<C-W>w\<C-W>+"
+ redraw
+ let s3 = GetScreenStr(1)
+ wincmd p
+ call assert_equal(50, line("w0"))
+ call assert_equal('50 ', s3)
+
+ exe "norm! \<C-W>t\<C-W>=59Gzt\<C-W>w\<C-W>+"
+ redraw
+ let s3 = GetScreenStr(1)
+ wincmd p
+ call assert_equal(59, line("w0"))
+ call assert_equal('59 ', s3)
+
+ bwipeout!
+ call test_garbagecollect_now()
+endfunc
+
+func Test_access_freed_mem()
+ " This was accessing freed memory
+ au * 0 vs xxx
+ arg 0
+ argadd
+ all
+ all
+ au!
+ bwipe xxx
+endfunc
+
+func Test_visual_cleared_after_window_split()
+ new | only!
+ let smd_save = &showmode
+ set showmode
+ let ls_save = &laststatus
+ set laststatus=1
+ call setline(1, ['a', 'b', 'c', 'd', ''])
+ norm! G
+ exe "norm! kkvk"
+ redraw
+ exe "norm! \<C-W>v"
+ redraw
+ " check if '-- VISUAL --' disappeared from command line
+ let columns = range(1, &columns)
+ let cmdlinechars = map(columns, 'nr2char(screenchar(&lines, v:val))')
+ let cmdline = join(cmdlinechars, '')
+ let cmdline_ltrim = substitute(cmdline, '^\s*', "", "")
+ let mode_shown = substitute(cmdline_ltrim, '\s*$', "", "")
+ call assert_equal('', mode_shown)
+ let &showmode = smd_save
+ let &laststatus = ls_save
+ bwipe!
+endfunc
+
+func Test_winrestcmd()
+ 2split
+ 3vsplit
+ let a = winrestcmd()
+ call assert_equal(2, winheight(0))
+ call assert_equal(3, winwidth(0))
+ wincmd =
+ call assert_notequal(2, winheight(0))
+ call assert_notequal(3, winwidth(0))
+ exe a
+ call assert_equal(2, winheight(0))
+ call assert_equal(3, winwidth(0))
+ only
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_window_id.vim b/src/nvim/testdir/test_window_id.vim
new file mode 100644
index 0000000000..b3b506d04d
--- /dev/null
+++ b/src/nvim/testdir/test_window_id.vim
@@ -0,0 +1,103 @@
+" Test using the window ID.
+
+func Test_win_getid()
+ edit one
+ let id1 = win_getid()
+ let w:one = 'one'
+ split two
+ let id2 = win_getid()
+ let bufnr2 = bufnr('%')
+ let w:two = 'two'
+ split three
+ let id3 = win_getid()
+ let w:three = 'three'
+ tabnew
+ edit four
+ let id4 = win_getid()
+ let w:four = 'four'
+ split five
+ let id5 = win_getid()
+ let bufnr5 = bufnr('%')
+ let w:five = 'five'
+ tabnext
+
+ wincmd w
+ call assert_equal("two", expand("%"))
+ call assert_equal(id2, win_getid())
+ let nr2 = winnr()
+ wincmd w
+ call assert_equal("one", expand("%"))
+ call assert_equal(id1, win_getid())
+ let nr1 = winnr()
+ wincmd w
+ call assert_equal("three", expand("%"))
+ call assert_equal(id3, win_getid())
+ let nr3 = winnr()
+ call assert_equal('one', getwinvar(id1, 'one'))
+ call assert_equal('two', getwinvar(id2, 'two'))
+ call assert_equal('three', getwinvar(id3, 'three'))
+ tabnext
+ call assert_equal("five", expand("%"))
+ call assert_equal(id5, win_getid())
+ let nr5 = winnr()
+ wincmd w
+ call assert_equal("four", expand("%"))
+ call assert_equal(id4, win_getid())
+ let nr4 = winnr()
+ call assert_equal('four', getwinvar(id4, 'four'))
+ call assert_equal('five', getwinvar(id5, 'five'))
+ call settabwinvar(1, id2, 'two', '2')
+ call setwinvar(id4, 'four', '4')
+ tabnext
+ call assert_equal('4', gettabwinvar(2, id4, 'four'))
+ call assert_equal('five', gettabwinvar(2, id5, 'five'))
+ call assert_equal('2', getwinvar(id2, 'two'))
+
+ exe nr1 . "wincmd w"
+ call assert_equal(id1, win_getid())
+ exe nr2 . "wincmd w"
+ call assert_equal(id2, win_getid())
+ exe nr3 . "wincmd w"
+ call assert_equal(id3, win_getid())
+ tabnext
+ exe nr4 . "wincmd w"
+ call assert_equal(id4, win_getid())
+ exe nr5 . "wincmd w"
+ call assert_equal(id5, win_getid())
+
+ call win_gotoid(id2)
+ call assert_equal("two", expand("%"))
+ call win_gotoid(id4)
+ call assert_equal("four", expand("%"))
+ call win_gotoid(id1)
+ call assert_equal("one", expand("%"))
+ call win_gotoid(id5)
+ call assert_equal("five", expand("%"))
+
+ call assert_equal(0, win_id2win(9999))
+ call assert_equal(nr5, win_id2win(id5))
+ call assert_equal(0, win_id2win(id1))
+ tabnext
+ call assert_equal(nr1, win_id2win(id1))
+
+ call assert_equal([0, 0], win_id2tabwin(9999))
+ call assert_equal([1, nr2], win_id2tabwin(id2))
+ call assert_equal([2, nr4], win_id2tabwin(id4))
+
+ call assert_equal([], win_findbuf(9999))
+ call assert_equal([id2], win_findbuf(bufnr2))
+ call win_gotoid(id5)
+ split
+ call assert_equal(sort([id5, win_getid()]), sort(win_findbuf(bufnr5)))
+
+ only!
+endfunc
+
+func Test_win_getid_curtab()
+ tabedit X
+ tabfirst
+ copen
+ only
+ call assert_equal(win_getid(1), win_getid(1, 1))
+ tabclose!
+endfunc
diff --git a/src/nvim/testdir/test_windows_home.vim b/src/nvim/testdir/test_windows_home.vim
new file mode 100644
index 0000000000..bbcbf96050
--- /dev/null
+++ b/src/nvim/testdir/test_windows_home.vim
@@ -0,0 +1,121 @@
+" Test for $HOME on Windows.
+
+if !has('win32')
+ finish
+endif
+
+let s:env = {}
+
+func s:restore_env()
+ for i in keys(s:env)
+ exe 'let ' . i . '=s:env["' . i . '"]'
+ endfor
+endfunc
+
+func s:save_env(...)
+ for i in a:000
+ exe 'let s:env["' . i . '"]=' . i
+ endfor
+endfunc
+
+func s:unlet_env(...)
+ for i in a:000
+ exe 'let ' . i . '=""'
+ endfor
+endfunc
+
+func CheckHomeIsMissingFromSubprocessEnvironment()
+ silent! let out = system('set')
+ let env = filter(split(out, "\n"), 'v:val=~"^HOME="')
+ call assert_equal(0, len(env))
+endfunc
+
+func CheckHomeIsInSubprocessEnvironment(exp)
+ silent! let out = system('set')
+ let env = filter(split(out, "\n"), 'v:val=~"^HOME="')
+ let home = len(env) == 0 ? "" : substitute(env[0], '[^=]\+=', '', '')
+ call assert_equal(a:exp, home)
+endfunc
+
+func CheckHome(exp, ...)
+ call assert_equal(a:exp, $HOME)
+ call assert_equal(a:exp, expand('~', ':p'))
+ if !a:0
+ call CheckHomeIsMissingFromSubprocessEnvironment()
+ else
+ call CheckHomeIsInSubprocessEnvironment(a:1)
+ endif
+endfunc
+
+func Test_WindowsHome()
+ command! -nargs=* SaveEnv call <SID>save_env(<f-args>)
+ command! -nargs=* RestoreEnv call <SID>restore_env()
+ command! -nargs=* UnletEnv call <SID>unlet_env(<f-args>)
+ set noshellslash
+
+ let save_home = $HOME
+ SaveEnv $USERPROFILE $HOMEDRIVE $HOMEPATH
+ try
+ " Normal behavior: use $HOMEDRIVE and $HOMEPATH, ignore $USERPROFILE
+ let $USERPROFILE = 'unused'
+ let $HOMEDRIVE = 'C:'
+ let $HOMEPATH = '\foobar'
+ let $HOME = '' " Force recomputing "homedir"
+ call CheckHome('C:\foobar')
+
+ " Same, but with $HOMEPATH not set
+ UnletEnv $HOMEPATH
+ let $HOME = '' " Force recomputing "homedir"
+ call CheckHome('C:\')
+
+ " Use $USERPROFILE if $HOMEPATH and $HOMEDRIVE are empty
+ UnletEnv $HOMEDRIVE $HOMEPATH
+ let $USERPROFILE = 'C:\foo'
+ let $HOME = '' " Force recomputing "homedir"
+ call CheckHome('C:\foo')
+
+ " If $HOME is set the others don't matter
+ let $HOME = 'C:\bar'
+ let $USERPROFILE = 'unused'
+ let $HOMEDRIVE = 'unused'
+ let $HOMEPATH = 'unused'
+ call CheckHome('C:\bar', 'C:\bar')
+
+ " If $HOME contains %USERPROFILE% it is expanded
+ let $USERPROFILE = 'C:\foo'
+ let $HOME = '%USERPROFILE%\bar'
+ let $HOMEDRIVE = 'unused'
+ let $HOMEPATH = 'unused'
+ " call CheckHome('C:\foo\bar', '%USERPROFILE%\bar')
+
+ " Invalid $HOME is kept
+ let $USERPROFILE = 'C:\foo'
+ let $HOME = '%USERPROFILE'
+ let $HOMEDRIVE = 'unused'
+ let $HOMEPATH = 'unused'
+ call CheckHome('%USERPROFILE', '%USERPROFILE')
+
+ " %USERPROFILE% not at start of $HOME is not expanded
+ let $USERPROFILE = 'unused'
+ let $HOME = 'C:\%USERPROFILE%'
+ let $HOMEDRIVE = 'unused'
+ let $HOMEPATH = 'unused'
+ call CheckHome('C:\%USERPROFILE%', 'C:\%USERPROFILE%')
+
+ if has('channel')
+ RestoreEnv
+ let $HOME = save_home
+ let env = ''
+ let job = job_start('cmd /c set', {'out_cb': {ch,x->[env,execute('let env=x')]}})
+ sleep 1
+ let env = filter(split(env, "\n"), 'v:val=="HOME"')
+ let home = len(env) == 0 ? "" : env[0]
+ call assert_equal('', home)
+ endif
+ finally
+ RestoreEnv
+ delcommand SaveEnv
+ delcommand RestoreEnv
+ delcommand UnletEnv
+ endtry
+endfunc
diff --git a/src/nvim/testdir/test_wordcount.vim b/src/nvim/testdir/test_wordcount.vim
new file mode 100644
index 0000000000..75c4e4bffa
--- /dev/null
+++ b/src/nvim/testdir/test_wordcount.vim
@@ -0,0 +1,108 @@
+" Test for wordcount() function
+
+if !has('multi_byte')
+ finish
+endif
+
+func Test_wordcount()
+ let save_enc = &enc
+ set encoding=utf-8
+ set selection=inclusive fileformat=unix fileformats=unix
+
+ new
+
+ " Test 1: empty window
+ call assert_equal({'chars': 0, 'cursor_chars': 0, 'words': 0, 'cursor_words': 0,
+ \ 'bytes': 0, 'cursor_bytes': 0}, wordcount())
+
+ " Test 2: some words, cursor at start
+ call append(1, 'one two three')
+ call cursor([1, 1, 0])
+ call assert_equal({'chars': 15, 'cursor_chars': 1, 'words': 3, 'cursor_words': 0,
+ \ 'bytes': 15, 'cursor_bytes': 1}, wordcount())
+
+ " Test 3: some words, cursor at end
+ %d _
+ call append(1, 'one two three')
+ call cursor([2, 99, 0])
+ call assert_equal({'chars': 15, 'cursor_chars': 14, 'words': 3, 'cursor_words': 3,
+ \ 'bytes': 15, 'cursor_bytes': 14}, wordcount())
+
+ " Test 4: some words, cursor at end, ve=all
+ set ve=all
+ %d _
+ call append(1, 'one two three')
+ call cursor([2, 99, 0])
+ call assert_equal({'chars': 15, 'cursor_chars': 15, 'words': 3, 'cursor_words': 3,
+ \ 'bytes': 15, 'cursor_bytes': 15}, wordcount())
+ set ve=
+
+ " Test 5: several lines with words
+ %d _
+ call append(1, ['one two three', 'one two three', 'one two three'])
+ call cursor([4, 99, 0])
+ call assert_equal({'chars': 43, 'cursor_chars': 42, 'words': 9, 'cursor_words': 9,
+ \ 'bytes': 43, 'cursor_bytes': 42}, wordcount())
+
+ " Test 6: one line with BOM set
+ %d _
+ call append(1, 'one two three')
+ set bomb
+ w! Xtest
+ call cursor([2, 99, 0])
+ call assert_equal({'chars': 15, 'cursor_chars': 14, 'words': 3, 'cursor_words': 3,
+ \ 'bytes': 18, 'cursor_bytes': 14}, wordcount())
+ set nobomb
+ w!
+ call delete('Xtest')
+
+ " Test 7: one line with multibyte words
+ %d _
+ call append(1, ['ร„ne Mยคne Mรผh'])
+ call cursor([2, 99, 0])
+ call assert_equal({'chars': 14, 'cursor_chars': 13, 'words': 3, 'cursor_words': 3,
+ \ 'bytes': 17, 'cursor_bytes': 16}, wordcount())
+
+ " Test 8: several lines with multibyte words
+ %d _
+ call append(1, ['ร„ne Mยคne Mรผh', 'und raus bist dรผ!'])
+ call cursor([3, 99, 0])
+ call assert_equal({'chars': 32, 'cursor_chars': 31, 'words': 7, 'cursor_words': 7,
+ \ 'bytes': 36, 'cursor_bytes': 35}, wordcount())
+
+ " Visual map to capture wordcount() in visual mode
+ vnoremap <expr> <F2> execute("let g:visual_stat = wordcount()")
+
+ " Test 9: visual mode, complete buffer
+ let g:visual_stat = {}
+ %d _
+ call append(1, ['ร„ne Mยคne Mรผh', 'und raus bist dรผ!'])
+ " start visual mode and select the complete buffer
+ 0
+ exe "normal V2j\<F2>y"
+ call assert_equal({'chars': 32, 'words': 7, 'bytes': 36, 'visual_chars': 32,
+ \ 'visual_words': 7, 'visual_bytes': 36}, g:visual_stat)
+
+ " Test 10: visual mode (empty)
+ %d _
+ call append(1, ['ร„ne Mยคne Mรผh', 'und raus bist dรผ!'])
+ " start visual mode and select the complete buffer
+ 0
+ exe "normal v$\<F2>y"
+ call assert_equal({'chars': 32, 'words': 7, 'bytes': 36, 'visual_chars': 1,
+ \ 'visual_words': 0, 'visual_bytes': 1}, g:visual_stat)
+
+ " Test 11: visual mode, single line
+ %d _
+ call append(1, ['ร„ne Mยคne Mรผh', 'und raus bist dรผ!'])
+ " start visual mode and select the complete buffer
+ 2
+ exe "normal 0v$\<F2>y"
+ call assert_equal({'chars': 32, 'words': 7, 'bytes': 36, 'visual_chars': 13,
+ \ 'visual_words': 3, 'visual_bytes': 16}, g:visual_stat)
+
+ set selection& fileformat& fileformats&
+ let &enc = save_enc
+ enew!
+ close
+endfunc
diff --git a/src/nvim/testdir/test_writefile.vim b/src/nvim/testdir/test_writefile.vim
new file mode 100644
index 0000000000..1cd5fb306a
--- /dev/null
+++ b/src/nvim/testdir/test_writefile.vim
@@ -0,0 +1,133 @@
+" Tests for the writefile() function.
+
+func Test_writefile()
+ let f = tempname()
+ call writefile(["over","written"], f, "b")
+ call writefile(["hello","world"], f, "b")
+ call writefile(["!", "good"], f, "a")
+ call writefile(["morning"], f, "ab")
+ call writefile(["", "vimmers"], f, "ab")
+ let l = readfile(f)
+ call assert_equal("hello", l[0])
+ call assert_equal("world!", l[1])
+ call assert_equal("good", l[2])
+ call assert_equal("morning", l[3])
+ call assert_equal("vimmers", l[4])
+ call delete(f)
+endfunc
+
+func Test_writefile_fails_gently()
+ call assert_fails('call writefile(["test"], "Xfile", [])', 'E730:')
+ call assert_false(filereadable("Xfile"))
+ call delete("Xfile")
+
+ call assert_fails('call writefile(["test", [], [], [], "tset"], "Xfile")', 'E745:')
+ call assert_false(filereadable("Xfile"))
+ call delete("Xfile")
+
+ call assert_fails('call writefile([], "Xfile", [])', 'E730:')
+ call assert_false(filereadable("Xfile"))
+ call delete("Xfile")
+
+ call assert_fails('call writefile([], [])', 'E730:')
+endfunc
+
+func Test_writefile_fails_conversion()
+ if !has('multi_byte') || !has('iconv')
+ return
+ endif
+ set nobackup nowritebackup
+ new
+ let contents = ["line one", "line two"]
+ call writefile(contents, 'Xfile')
+ edit Xfile
+ call setline(1, ["first line", "cannot convert \u010b", "third line"])
+ call assert_fails('write ++enc=cp932')
+ call assert_equal(contents, readfile('Xfile'))
+
+ call delete('Xfile')
+ bwipe!
+ set backup& writebackup&
+endfunc
+
+func SetFlag(timer)
+ let g:flag = 1
+endfunc
+
+func Test_write_quit_split()
+ " Prevent exiting by splitting window on file write.
+ augroup testgroup
+ autocmd BufWritePre * split
+ augroup END
+ e! Xfile
+ call setline(1, 'nothing')
+ wq
+
+ if has('timers')
+ " timer will not run if "exiting" is still set
+ let g:flag = 0
+ call timer_start(1, 'SetFlag')
+ sleep 50m
+ call assert_equal(1, g:flag)
+ unlet g:flag
+ endif
+ au! testgroup
+ bwipe Xfile
+ call delete('Xfile')
+endfunc
+
+func Test_nowrite_quit_split()
+ " Prevent exiting by opening a help window.
+ e! Xfile
+ help
+ wincmd w
+ exe winnr() . 'q'
+
+ if has('timers')
+ " timer will not run if "exiting" is still set
+ let g:flag = 0
+ call timer_start(1, 'SetFlag')
+ sleep 50m
+ call assert_equal(1, g:flag)
+ unlet g:flag
+ endif
+ bwipe Xfile
+endfunc
+
+func Test_writefile_autowrite()
+ set autowrite
+ new
+ next Xa Xb Xc
+ call setline(1, 'aaa')
+ next
+ call assert_equal(['aaa'], readfile('Xa'))
+ call setline(1, 'bbb')
+ call assert_fails('edit XX')
+ call assert_false(filereadable('Xb'))
+
+ set autowriteall
+ edit XX
+ call assert_equal(['bbb'], readfile('Xb'))
+
+ bwipe!
+ call delete('Xa')
+ call delete('Xb')
+ set noautowrite
+endfunc
+
+func Test_writefile_autowrite_nowrite()
+ set autowrite
+ new
+ next Xa Xb Xc
+ set buftype=nowrite
+ call setline(1, 'aaa')
+ let buf = bufnr('%')
+ " buffer contents silently lost
+ edit XX
+ call assert_false(filereadable('Xa'))
+ rewind
+ call assert_equal('', getline(1))
+
+ bwipe!
+ set noautowrite
+endfunc
diff --git a/src/nvim/testdir/unix.vim b/src/nvim/testdir/unix.vim
index a7daacf8cf..ce2beff7fe 100644
--- a/src/nvim/testdir/unix.vim
+++ b/src/nvim/testdir/unix.vim
@@ -2,6 +2,12 @@
" Always use "sh", don't use the value of "$SHELL".
set shell=sh
+if has('win32')
+ set shellcmdflag=-c shellxquote= shellxescape= shellquote=
+ let &shellredir = '>%s 2>&1'
+ set shellslash
+endif
+
" Don't depend on system locale, always use utf-8
set encoding=utf-8
diff --git a/src/nvim/testdir/view_util.vim b/src/nvim/testdir/view_util.vim
new file mode 100644
index 0000000000..29ea073f97
--- /dev/null
+++ b/src/nvim/testdir/view_util.vim
@@ -0,0 +1,51 @@
+" Functions about view shared by several tests
+
+" Only load this script once.
+if exists('*ScreenLines')
+ finish
+endif
+
+" ScreenLines(lnum, width) or
+" ScreenLines([start, end], width)
+function! ScreenLines(lnum, width) abort
+ redraw!
+ if type(a:lnum) == v:t_list
+ let start = a:lnum[0]
+ let end = a:lnum[1]
+ else
+ let start = a:lnum
+ let end = a:lnum
+ endif
+ let lines = []
+ for l in range(start, end)
+ let lines += [join(map(range(1, a:width), 'nr2char(screenchar(l, v:val))'), '')]
+ endfor
+ return lines
+endfunction
+
+function! ScreenAttrs(lnum, width) abort
+ redraw!
+ if type(a:lnum) == v:t_list
+ let start = a:lnum[0]
+ let end = a:lnum[1]
+ else
+ let start = a:lnum
+ let end = a:lnum
+ endif
+ let attrs = []
+ for l in range(start, end)
+ let attrs += [map(range(1, a:width), 'screenattr(l, v:val)')]
+ endfor
+ return attrs
+endfunction
+
+function! NewWindow(height, width) abort
+ exe a:height . 'new'
+ exe a:width . 'vsp'
+ redraw!
+endfunction
+
+function! CloseWindow() abort
+ bw!
+ redraw!
+endfunction
diff --git a/src/nvim/tui/input.c b/src/nvim/tui/input.c
index c41107d4d3..e0dd4022ed 100644
--- a/src/nvim/tui/input.c
+++ b/src/nvim/tui/input.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include "nvim/tui/input.h"
#include "nvim/vim.h"
@@ -6,15 +9,13 @@
#include "nvim/ascii.h"
#include "nvim/charset.h"
#include "nvim/main.h"
-#include "nvim/misc2.h"
+#include "nvim/aucmd.h"
#include "nvim/option.h"
#include "nvim/os/os.h"
#include "nvim/os/input.h"
#include "nvim/event/rstream.h"
#define PASTETOGGLE_KEY "<Paste>"
-#define FOCUSGAINED_KEY "<FocusGained>"
-#define FOCUSLOST_KEY "<FocusLost>"
#define KEY_BUFFER_SIZE 0xfff
#ifdef INCLUDE_GENERATED_DECLARATIONS
@@ -34,13 +35,28 @@ void term_input_init(TermInput *input, Loop *loop)
if (!term) {
term = ""; // termkey_new_abstract assumes non-null (#2745)
}
- int enc_flag = enc_utf8 ? TERMKEY_FLAG_UTF8 : TERMKEY_FLAG_RAW;
- input->tk = termkey_new_abstract(term, enc_flag);
+
+#if TERMKEY_VERSION_MAJOR > 0 || TERMKEY_VERSION_MINOR > 18
+ input->tk = termkey_new_abstract(term,
+ TERMKEY_FLAG_UTF8 | TERMKEY_FLAG_NOSTART);
+ termkey_hook_terminfo_getstr(input->tk, input->tk_ti_hook_fn, NULL);
+ termkey_start(input->tk);
+#else
+ input->tk = termkey_new_abstract(term, TERMKEY_FLAG_UTF8);
+#endif
int curflags = termkey_get_canonflags(input->tk);
termkey_set_canonflags(input->tk, curflags | TERMKEY_CANON_DELBS);
// setup input handle
- rstream_init_fd(loop, &input->read_stream, input->in_fd, 0xfff, input);
+#ifdef WIN32
+ uv_tty_init(&loop->uv, &input->tty_in, 0, 1);
+ uv_tty_set_mode(&input->tty_in, UV_TTY_MODE_RAW);
+ rstream_init_stream(&input->read_stream,
+ (uv_stream_t *)&input->tty_in,
+ 0xfff);
+#else
+ rstream_init_fd(loop, &input->read_stream, input->in_fd, 0xfff);
+#endif
// initialize a timer handle for handling ESC with libtermkey
time_watcher_init(loop, &input->timer_handle, input);
}
@@ -51,13 +67,13 @@ void term_input_destroy(TermInput *input)
uv_mutex_destroy(&input->key_buffer_mutex);
uv_cond_destroy(&input->key_buffer_cond);
time_watcher_close(&input->timer_handle, NULL);
- stream_close(&input->read_stream, NULL);
+ stream_close(&input->read_stream, NULL, NULL);
termkey_destroy(input->tk);
}
void term_input_start(TermInput *input)
{
- rstream_start(&input->read_stream, read_cb);
+ rstream_start(&input->read_stream, read_cb, input);
}
void term_input_stop(TermInput *input)
@@ -95,7 +111,7 @@ static void flush_input(TermInput *input, bool wait_until_empty)
size_t drain_boundary = wait_until_empty ? 0 : 0xff;
do {
uv_mutex_lock(&input->key_buffer_mutex);
- loop_schedule(&main_loop, event_create(1, wait_input_enqueue, 1, input));
+ loop_schedule(&main_loop, event_create(wait_input_enqueue, 1, input));
input->waiting = true;
while (input->waiting) {
uv_cond_wait(&input->key_buffer_cond, &input->key_buffer_mutex);
@@ -156,11 +172,21 @@ static void forward_mouse_event(TermInput *input, TermKeyKey *key)
char buf[64];
size_t len = 0;
int button, row, col;
+ static int last_pressed_button = 0;
TermKeyMouseEvent ev;
termkey_interpret_mouse(input->tk, key, &ev, &button, &row, &col);
- if (ev != TERMKEY_MOUSE_PRESS && ev != TERMKEY_MOUSE_DRAG
- && ev != TERMKEY_MOUSE_RELEASE) {
+ if ((ev == TERMKEY_MOUSE_RELEASE || ev == TERMKEY_MOUSE_DRAG)
+ && button == 0) {
+ // Some terminals (like urxvt) don't report which button was released.
+ // libtermkey reports button 0 in this case.
+ // For drag and release, we can reasonably infer the button to be the last
+ // pressed one.
+ button = last_pressed_button;
+ }
+
+ if (button == 0 || (ev != TERMKEY_MOUSE_PRESS && ev != TERMKEY_MOUSE_DRAG
+ && ev != TERMKEY_MOUSE_RELEASE)) {
return;
}
@@ -187,18 +213,26 @@ static void forward_mouse_event(TermInput *input, TermKeyKey *key)
len += (size_t)snprintf(buf + len, sizeof(buf) - len, "Right");
}
- if (ev == TERMKEY_MOUSE_PRESS) {
- if (button == 4) {
- len += (size_t)snprintf(buf + len, sizeof(buf) - len, "ScrollWheelUp");
- } else if (button == 5) {
- len += (size_t)snprintf(buf + len, sizeof(buf) - len, "ScrollWheelDown");
- } else {
- len += (size_t)snprintf(buf + len, sizeof(buf) - len, "Mouse");
- }
- } else if (ev == TERMKEY_MOUSE_DRAG) {
- len += (size_t)snprintf(buf + len, sizeof(buf) - len, "Drag");
- } else if (ev == TERMKEY_MOUSE_RELEASE) {
- len += (size_t)snprintf(buf + len, sizeof(buf) - len, "Release");
+ switch (ev) {
+ case TERMKEY_MOUSE_PRESS:
+ if (button == 4) {
+ len += (size_t)snprintf(buf + len, sizeof(buf) - len, "ScrollWheelUp");
+ } else if (button == 5) {
+ len += (size_t)snprintf(buf + len, sizeof(buf) - len,
+ "ScrollWheelDown");
+ } else {
+ len += (size_t)snprintf(buf + len, sizeof(buf) - len, "Mouse");
+ last_pressed_button = button;
+ }
+ break;
+ case TERMKEY_MOUSE_DRAG:
+ len += (size_t)snprintf(buf + len, sizeof(buf) - len, "Drag");
+ break;
+ case TERMKEY_MOUSE_RELEASE:
+ len += (size_t)snprintf(buf + len, sizeof(buf) - len, "Release");
+ break;
+ case TERMKEY_MOUSE_UNKNOWN:
+ assert(false);
}
len += (size_t)snprintf(buf + len, sizeof(buf) - len, "><%d,%d>", col, row);
@@ -216,12 +250,14 @@ static int get_key_code_timeout(void)
{
Integer ms = -1;
// Check 'ttimeout' to determine if we should send ESC after 'ttimeoutlen'.
- // See :help 'ttimeout' for more information
Error err = ERROR_INIT;
- if (vim_get_option(cstr_as_string("ttimeout"), &err).data.boolean) {
- ms = vim_get_option(cstr_as_string("ttimeoutlen"), &err).data.integer;
+ if (nvim_get_option(cstr_as_string("ttimeout"), &err).data.boolean) {
+ Object rv = nvim_get_option(cstr_as_string("ttimeoutlen"), &err);
+ if (!ERROR_SET(&err)) {
+ ms = rv.data.integer;
+ }
}
-
+ api_clear_error(&err);
return (int)ms;
}
@@ -265,9 +301,9 @@ static void timer_cb(TimeWatcher *watcher, void *data)
/// Handle focus events.
///
-/// If the upcoming sequence of bytes in the input stream matches either the
-/// escape code for focus gained `<ESC>[I` or focus lost `<ESC>[O` then consume
-/// that sequence and push the appropriate event into the input queue
+/// If the upcoming sequence of bytes in the input stream matches the termcode
+/// for "focus gained" or "focus lost", consume that sequence and schedule an
+/// event on the main loop.
///
/// @param input the input stream
/// @return true iff handle_focus_event consumed some input
@@ -279,11 +315,7 @@ static bool handle_focus_event(TermInput *input)
// Advance past the sequence
bool focus_gained = *rbuffer_get(input->read_stream.buffer, 2) == 'I';
rbuffer_consumed(input->read_stream.buffer, 3);
- if (focus_gained) {
- enqueue_input(input, FOCUSGAINED_KEY, sizeof(FOCUSGAINED_KEY) - 1);
- } else {
- enqueue_input(input, FOCUSLOST_KEY, sizeof(FOCUSLOST_KEY) - 1);
- }
+ aucmd_schedule_focusgained(focus_gained);
return true;
}
return false;
@@ -326,8 +358,8 @@ static void set_bg_deferred(void **argv)
{
char *bgvalue = argv[0];
set_string_default("bg", bgvalue, false);
- if (!option_was_set((char_u *)"bg")) {
- set_option_value((char_u *)"bg", 0, (char_u *)bgvalue, 0);
+ if (!option_was_set("bg")) {
+ set_option_value("bg", 0, bgvalue, 0);
}
}
@@ -373,19 +405,17 @@ static bool handle_background_color(TermInput *input)
double r = (double)rgb[0] / (double)rgb_max[0];
double g = (double)rgb[1] / (double)rgb_max[1];
double b = (double)rgb[2] / (double)rgb_max[2];
- double luminance = 0.299*r + 0.587*g + 0.114*b; // CCIR 601
+ double luminance = (0.299 * r) + (0.587 * g) + (0.114 * b); // CCIR 601
char *bgvalue = luminance < 0.5 ? "dark" : "light";
- loop_schedule(&main_loop, event_create(1, set_bg_deferred, 1, bgvalue));
+ loop_schedule(&main_loop, event_create(set_bg_deferred, 1, bgvalue));
}
return true;
}
return false;
}
-static void restart_reading(void **argv);
-
-static void read_cb(Stream *stream, RBuffer *buf, size_t c, void *data,
- bool eof)
+static void read_cb(Stream *stream, RBuffer *buf, size_t count_, void *data,
+ bool eof)
{
TermInput *input = data;
@@ -402,10 +432,10 @@ static void read_cb(Stream *stream, RBuffer *buf, size_t c, void *data,
//
// ls *.md | xargs nvim
input->in_fd = 2;
- stream_close(&input->read_stream, NULL);
- queue_put(input->loop->fast_events, restart_reading, 1, input);
+ stream_close(&input->read_stream, NULL, NULL);
+ multiqueue_put(input->loop->fast_events, restart_reading, 1, input);
} else {
- loop_schedule(&main_loop, event_create(1, input_done_event, 0));
+ loop_schedule(&main_loop, event_create(input_done_event, 0));
}
return;
}
@@ -454,6 +484,6 @@ static void read_cb(Stream *stream, RBuffer *buf, size_t c, void *data,
static void restart_reading(void **argv)
{
TermInput *input = argv[0];
- rstream_init_fd(input->loop, &input->read_stream, input->in_fd, 0xfff, input);
- rstream_start(&input->read_stream, read_cb);
+ rstream_init_fd(input->loop, &input->read_stream, input->in_fd, 0xfff);
+ rstream_start(&input->read_stream, read_cb, input);
}
diff --git a/src/nvim/tui/input.h b/src/nvim/tui/input.h
index d7ee2b9e52..573cc9d683 100644
--- a/src/nvim/tui/input.h
+++ b/src/nvim/tui/input.h
@@ -12,8 +12,14 @@ typedef struct term_input {
bool paste_enabled;
bool waiting;
TermKey *tk;
+#if TERMKEY_VERSION_MAJOR > 0 || TERMKEY_VERSION_MINOR > 18
+ TermKey_Terminfo_Getstr_Hook *tk_ti_hook_fn; ///< libtermkey terminfo hook
+#endif
TimeWatcher timer_handle;
Loop *loop;
+#ifdef WIN32
+ uv_tty_t tty_in;
+#endif
Stream read_stream;
RBuffer *key_buffer;
uv_mutex_t key_buffer_mutex;
diff --git a/src/nvim/tui/terminfo.c b/src/nvim/tui/terminfo.c
new file mode 100644
index 0000000000..14023ce2cb
--- /dev/null
+++ b/src/nvim/tui/terminfo.c
@@ -0,0 +1,225 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+// Built-in fallback terminfo entries.
+
+#include <stdbool.h>
+#include <string.h>
+
+#include <unibilium.h>
+
+#include "nvim/log.h"
+#include "nvim/globals.h"
+#include "nvim/memory.h"
+#include "nvim/message.h"
+#include "nvim/option.h"
+#include "nvim/os/os.h"
+#include "nvim/tui/terminfo.h"
+#include "nvim/tui/terminfo_defs.h"
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "tui/terminfo.c.generated.h"
+#endif
+
+bool terminfo_is_term_family(const char *term, const char *family)
+{
+ if (!term) {
+ return false;
+ }
+ size_t tlen = strlen(term);
+ size_t flen = strlen(family);
+ return tlen >= flen
+ && 0 == memcmp(term, family, flen)
+ // Per commentary in terminfo, minus is the only valid suffix separator.
+ && ('\0' == term[flen] || '-' == term[flen]);
+}
+
+bool terminfo_is_bsd_console(const char *term)
+{
+#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) \
+ || defined(__DragonFly__)
+ if (strequal(term, "vt220") // OpenBSD
+ || strequal(term, "vt100")) { // NetBSD
+ return true;
+ }
+# if defined(__FreeBSD__)
+ // FreeBSD console sets TERM=xterm, but it does not support xterm features
+ // like cursor-shaping. Assume that TERM=xterm is degraded. #8644
+ return strequal(term, "xterm") && !!os_getenv("XTERM_VERSION");
+# endif
+#else
+ return false;
+#endif
+}
+
+/// Loads a built-in terminfo db when we (unibilium) failed to load a terminfo
+/// record from the environment (termcap systems, unrecognized $TERM, โ€ฆ).
+/// We do not attempt to detect xterm pretenders here.
+///
+/// @param term $TERM value
+/// @param[out,allocated] termname decided builtin 'term' name
+/// @return [allocated] terminfo structure
+static unibi_term *terminfo_builtin(const char *term, char **termname)
+{
+ if (terminfo_is_term_family(term, "xterm")) {
+ *termname = xstrdup("builtin_xterm");
+ return unibi_from_mem((const char *)xterm_256colour_terminfo,
+ sizeof xterm_256colour_terminfo);
+ } else if (terminfo_is_term_family(term, "screen")) {
+ *termname = xstrdup("builtin_screen");
+ return unibi_from_mem((const char *)screen_256colour_terminfo,
+ sizeof screen_256colour_terminfo);
+ } else if (terminfo_is_term_family(term, "tmux")) {
+ *termname = xstrdup("builtin_tmux");
+ return unibi_from_mem((const char *)tmux_256colour_terminfo,
+ sizeof tmux_256colour_terminfo);
+ } else if (terminfo_is_term_family(term, "rxvt")) {
+ *termname = xstrdup("builtin_rxvt");
+ return unibi_from_mem((const char *)rxvt_256colour_terminfo,
+ sizeof rxvt_256colour_terminfo);
+ } else if (terminfo_is_term_family(term, "putty")) {
+ *termname = xstrdup("builtin_putty");
+ return unibi_from_mem((const char *)putty_256colour_terminfo,
+ sizeof putty_256colour_terminfo);
+ } else if (terminfo_is_term_family(term, "linux")) {
+ *termname = xstrdup("builtin_linux");
+ return unibi_from_mem((const char *)linux_16colour_terminfo,
+ sizeof linux_16colour_terminfo);
+ } else if (terminfo_is_term_family(term, "interix")) {
+ *termname = xstrdup("builtin_interix");
+ return unibi_from_mem((const char *)interix_8colour_terminfo,
+ sizeof interix_8colour_terminfo);
+ } else if (terminfo_is_term_family(term, "iterm")
+ || terminfo_is_term_family(term, "iterm2")
+ || terminfo_is_term_family(term, "iTerm.app")
+ || terminfo_is_term_family(term, "iTerm2.app")) {
+ *termname = xstrdup("builtin_iterm");
+ return unibi_from_mem((const char *)iterm_256colour_terminfo,
+ sizeof iterm_256colour_terminfo);
+ } else if (terminfo_is_term_family(term, "st")) {
+ *termname = xstrdup("builtin_st");
+ return unibi_from_mem((const char *)st_256colour_terminfo,
+ sizeof st_256colour_terminfo);
+ } else if (terminfo_is_term_family(term, "gnome")
+ || terminfo_is_term_family(term, "vte")) {
+ *termname = xstrdup("builtin_vte");
+ return unibi_from_mem((const char *)vte_256colour_terminfo,
+ sizeof vte_256colour_terminfo);
+ } else if (terminfo_is_term_family(term, "cygwin")) {
+ *termname = xstrdup("builtin_cygwin");
+ return unibi_from_mem((const char *)cygwin_terminfo,
+ sizeof cygwin_terminfo);
+ } else if (terminfo_is_term_family(term, "win32con")) {
+ *termname = xstrdup("builtin_win32con");
+ return unibi_from_mem((const char *)win32con_terminfo,
+ sizeof win32con_terminfo);
+ } else if (terminfo_is_term_family(term, "conemu")) {
+ *termname = xstrdup("builtin_conemu");
+ return unibi_from_mem((const char *)conemu_terminfo,
+ sizeof conemu_terminfo);
+ } else if (terminfo_is_term_family(term, "vtpcon")) {
+ *termname = xstrdup("builtin_vtpcon");
+ return unibi_from_mem((const char *)vtpcon_terminfo,
+ sizeof vtpcon_terminfo);
+ } else {
+ *termname = xstrdup("builtin_ansi");
+ return unibi_from_mem((const char *)ansi_terminfo,
+ sizeof ansi_terminfo);
+ }
+}
+
+/// @param term $TERM value
+/// @param[out,allocated] termname decided builtin 'term' name
+/// @return [allocated] terminfo structure
+unibi_term *terminfo_from_builtin(const char *term, char **termname)
+{
+ unibi_term *ut = terminfo_builtin(term, termname);
+ if (*termname == NULL) {
+ *termname = xstrdup("builtin_?");
+ }
+ return ut;
+}
+
+/// Dumps termcap info to the messages area.
+/// Serves a similar purpose as Vim `:set termcap` (removed in Nvim).
+///
+/// @note adapted from unibilium unibi-dump.c
+void terminfo_info_msg(const unibi_term *const ut)
+{
+ if (exiting) {
+ return;
+ }
+ msg_puts_title("\n\n--- Terminal info --- {{{\n");
+
+ char *term;
+ get_tty_option("term", &term);
+ msg_printf_attr(0, "&term: %s\n", term);
+ msg_printf_attr(0, "Description: %s\n", unibi_get_name(ut));
+ const char **a = unibi_get_aliases(ut);
+ if (*a) {
+ msg_puts("Aliases: ");
+ do {
+ msg_printf_attr(0, "%s%s\n", *a, a[1] ? " | " : "");
+ a++;
+ } while (*a);
+ }
+
+ msg_puts("Boolean capabilities:\n");
+ for (enum unibi_boolean i = unibi_boolean_begin_ + 1;
+ i < unibi_boolean_end_; i++) {
+ msg_printf_attr(0, " %-25s %-10s = %s\n", unibi_name_bool(i),
+ unibi_short_name_bool(i),
+ unibi_get_bool(ut, i) ? "true" : "false");
+ }
+
+ msg_puts("Numeric capabilities:\n");
+ for (enum unibi_numeric i = unibi_numeric_begin_ + 1;
+ i < unibi_numeric_end_; i++) {
+ int n = unibi_get_num(ut, i); // -1 means "empty"
+ msg_printf_attr(0, " %-25s %-10s = %d\n", unibi_name_num(i),
+ unibi_short_name_num(i), n);
+ }
+
+ msg_puts("String capabilities:\n");
+ for (enum unibi_string i = unibi_string_begin_ + 1;
+ i < unibi_string_end_; i++) {
+ const char *s = unibi_get_str(ut, i);
+ if (s) {
+ msg_printf_attr(0, " %-25s %-10s = ", unibi_name_str(i),
+ unibi_short_name_str(i));
+ // Most of these strings will contain escape sequences.
+ msg_outtrans_special((char_u *)s, false);
+ msg_putchar('\n');
+ }
+ }
+
+ if (unibi_count_ext_bool(ut)) {
+ msg_puts("Extended boolean capabilities:\n");
+ for (size_t i = 0; i < unibi_count_ext_bool(ut); i++) {
+ msg_printf_attr(0, " %-25s = %s\n",
+ unibi_get_ext_bool_name(ut, i),
+ unibi_get_ext_bool(ut, i) ? "true" : "false");
+ }
+ }
+
+ if (unibi_count_ext_num(ut)) {
+ msg_puts("Extended numeric capabilities:\n");
+ for (size_t i = 0; i < unibi_count_ext_num(ut); i++) {
+ msg_printf_attr(0, " %-25s = %d\n",
+ unibi_get_ext_num_name(ut, i),
+ unibi_get_ext_num(ut, i));
+ }
+ }
+
+ if (unibi_count_ext_str(ut)) {
+ msg_puts("Extended string capabilities:\n");
+ for (size_t i = 0; i < unibi_count_ext_str(ut); i++) {
+ msg_printf_attr(0, " %-25s = ", unibi_get_ext_str_name(ut, i));
+ msg_outtrans_special((char_u *)unibi_get_ext_str(ut, i), false);
+ msg_putchar('\n');
+ }
+ }
+
+ msg_puts("}}}\n");
+ xfree(term);
+}
diff --git a/src/nvim/tui/terminfo.h b/src/nvim/tui/terminfo.h
new file mode 100644
index 0000000000..099df8967f
--- /dev/null
+++ b/src/nvim/tui/terminfo.h
@@ -0,0 +1,10 @@
+#ifndef NVIM_TUI_TERMINFO_H
+#define NVIM_TUI_TERMINFO_H
+
+#include <unibilium.h>
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "tui/terminfo.h.generated.h"
+#endif
+
+#endif // NVIM_TUI_TERMINFO_H
diff --git a/src/nvim/tui/terminfo_defs.h b/src/nvim/tui/terminfo_defs.h
new file mode 100644
index 0000000000..8d77dc7225
--- /dev/null
+++ b/src/nvim/tui/terminfo_defs.h
@@ -0,0 +1,2276 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+//
+// Generated by scripts/update_terminfo.sh and ncurses 6.1.20180127
+//
+
+#ifndef NVIM_TUI_TERMINFO_DEFS_H
+#define NVIM_TUI_TERMINFO_DEFS_H
+
+#include <stdint.h>
+
+// ansi|ansi/pc-term compatible with color,
+// auto_right_margin,
+// backspaces_with_bs,
+// move_insert_mode,
+// move_standout_mode,
+// prtr_silent,
+// columns#80,
+// init_tabs#8,
+// lines#24,
+// max_colors#8,
+// max_pairs#64,
+// no_color_video#3,
+// acs_chars=+^P\054^Q-^X.^Y0\333`^Da\261f\370g\361h\260j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w\302x\263y\363z\362{\343|\330}\234~\376,
+// back_tab=\E[Z,
+// bell=^G,
+// carriage_return=\r,
+// clear_all_tabs=\E[3g,
+// clear_screen=\E[H\E[J,
+// clr_bol=\E[1K,
+// clr_eol=\E[K,
+// clr_eos=\E[J,
+// column_address=\E[%i%p1%dG,
+// cursor_address=\E[%i%p1%d;%p2%dH,
+// cursor_down=\E[B,
+// cursor_home=\E[H,
+// cursor_left=\E[D,
+// cursor_right=\E[C,
+// cursor_up=\E[A,
+// delete_character=\E[P,
+// delete_line=\E[M,
+// enter_alt_charset_mode=\E[11m,
+// enter_blink_mode=\E[5m,
+// enter_bold_mode=\E[1m,
+// enter_pc_charset_mode=\E[11m,
+// enter_reverse_mode=\E[7m,
+// enter_secure_mode=\E[8m,
+// enter_standout_mode=\E[7m,
+// enter_underline_mode=\E[4m,
+// erase_chars=\E[%p1%dX,
+// exit_alt_charset_mode=\E[10m,
+// exit_attribute_mode=\E[0;10m,
+// exit_pc_charset_mode=\E[10m,
+// exit_standout_mode=\E[m,
+// exit_underline_mode=\E[m,
+// insert_line=\E[L,
+// key_backspace=^H,
+// key_btab=\E[Z,
+// key_down=\E[B,
+// key_home=\E[H,
+// key_ic=\E[L,
+// key_left=\E[D,
+// key_right=\E[C,
+// key_up=\E[A,
+// newline=\r\E[S,
+// orig_pair=\E[39;49m,
+// parm_dch=\E[%p1%dP,
+// parm_delete_line=\E[%p1%dM,
+// parm_down_cursor=\E[%p1%dB,
+// parm_ich=\E[%p1%d@,
+// parm_index=\E[%p1%dS,
+// parm_insert_line=\E[%p1%dL,
+// parm_left_cursor=\E[%p1%dD,
+// parm_right_cursor=\E[%p1%dC,
+// parm_rindex=\E[%p1%dT,
+// parm_up_cursor=\E[%p1%dA,
+// prtr_off=\E[4i,
+// prtr_on=\E[5i,
+// repeat_char=%p1%c\E[%p2%{1}%-%db,
+// row_address=\E[%i%p1%dd,
+// scroll_forward=\n,
+// set0_des_seq=\E(B,
+// set1_des_seq=\E)B,
+// set2_des_seq=\E*B,
+// set3_des_seq=\E+B,
+// set_a_background=\E[4%p1%dm,
+// set_a_foreground=\E[3%p1%dm,
+// set_attributes=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m,
+// set_tab=\EH,
+// tab=\E[I,
+// user6=\E[%i%d;%dR,
+// user7=\E[6n,
+// user8=\E[?%[;0123456789]c,
+// user9=\E[c,
+static const int8_t ansi_terminfo[] = {
+ 26,1,40,0,38,0,16,0,125,1,68,2,97,110,115,105,124,97,110,115,105,47,112,99,45,116,101,114,109,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,99,111,108,111,114,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,80,0,8,0,24,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,3,0,0,0,4,0,6,0,-1,-1,8,0,13,0,20,0,24,0,28,0,-1,-1,39,0,56,0,60,0,-1,-1,64,0,-1,-1,-1,-1,68,0,-1,-1,72,0,-1,-1,76,0,80,0,-1,-1,-1,-1,84,0,90,0,95,0,-1,-1,-1,-1,-1,-1,-1,-1,100,0,-1,-1,105,0,110,0,115,0,120,0,-127,0,-121,0,-1,-1,-1,-1,-1,-1,-113,0,-109,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-105,0,-1,-1,-101,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-99,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-95,0,-91,0,-1,-1,-87,0,-1,-1,-1,-1,-1,-1,-83,0,-1,-1,-1,-1,-1,-1,-79,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-75,0,-1,-1,-70,0,-61,0,-52,0,-43,0,-34,0,-25,0,-16,0,-7,0,2,1,11,1,-1,-1,-1,-1,-1,-1,-1,-1,20,1,25,1,30,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,1,-1,-1,61,1,-1,-1,63,1,-107,1,-1,-1,-104,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-100,1,-1,-1,-37,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-33,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-28,1,-17,1,-12,1,7,2,11,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,20,2,30,2,-1,-1,-1,-1,-1,-1,40,2,44,2,48,2,52,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,56,2,62,2,27,91,90,0,7,0,13,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,27,91,68,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,91,49,49,109,0,27,91,53,109,0,27,91,49,109,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,91,49,48,109,0,27,91,48,59,49,48,109,0,27,91,109,0,27,91,109,0,27,91,76,0,8,0,27,91,66,0,27,91,72,0,27,91,76,0,27,91,68,0,27,91,67,0,27,91,65,0,13,27,91,83,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,91,52,105,0,27,91,53,105,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,91,37,105,37,112,49,37,100,100,0,10,0,27,91,48,59,49,48,37,63,37,112,49,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,55,37,116,59,56,37,59,37,63,37,112,57,37,116,59,49,49,37,59,109,0,27,72,0,27,91,73,0,43,16,44,17,45,24,46,25,48,-37,96,4,97,-79,102,-8,103,-15,104,-80,106,-39,107,-65,108,-38,109,-64,110,-59,111,126,112,-60,113,-60,114,-60,115,95,116,-61,117,-76,118,-63,119,-62,120,-77,121,-13,122,-14,123,-29,124,-40,125,-100,126,-2,0,27,91,90,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,37,91,59,48,49,50,51,52,53,54,55,56,57,93,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0,27,40,66,0,27,41,66,0,27,42,66,0,27,43,66,0,27,91,49,49,109,0,27,91,49,48,109,0,1,0,0,0,0,0,1,0,3,0,1,0,0,0,65,88,0 // NOLINT
+};
+
+// conemu|ANIS X3.64 and Xterm 256 colors for ConEmu with libuv,
+// auto_right_margin,
+// back_color_erase,
+// backspaces_with_bs,
+// has_meta_key,
+// move_insert_mode,
+// move_standout_mode,
+// no_pad_char,
+// columns#80,
+// init_tabs#8,
+// lines#24,
+// max_colors#0x100,
+// max_pairs#0x10000,
+// acs_chars@,
+// back_tab@,
+// bell=^G,
+// carriage_return=\r,
+// change_scroll_region=\E[%i%p1%d;%p2%dr,
+// clear_all_tabs@,
+// clear_screen=\E[H\E[2J,
+// clr_bol=\E[1K,
+// clr_eol=\E[K,
+// clr_eos=\E[J,
+// column_address=\E[%i%p1%dG,
+// cursor_address=\E[%i%p1%d;%p2%dH,
+// cursor_down=\E[B,
+// cursor_home=\E[H,
+// cursor_invisible=\E[?25l,
+// cursor_left=^H,
+// cursor_normal=\E[?25h,
+// cursor_right=\E[C,
+// cursor_up=\E[A,
+// cursor_visible@,
+// delete_character=\E[P,
+// delete_line=\E[M,
+// enter_alt_charset_mode@,
+// enter_am_mode@,
+// enter_blink_mode@,
+// enter_bold_mode=\E[1m,
+// enter_ca_mode=\E[?1049h,
+// enter_dim_mode@,
+// enter_insert_mode@,
+// enter_italics_mode=\E[3m,
+// enter_reverse_mode=\E[7m,
+// enter_secure_mode@,
+// enter_standout_mode=\E[7m,
+// enter_underline_mode=\E[4m,
+// erase_chars=\E[%p1%dX,
+// exit_alt_charset_mode@,
+// exit_am_mode@,
+// exit_attribute_mode=\E[0m,
+// exit_ca_mode=\E[?1049l,
+// exit_insert_mode@,
+// exit_italics_mode=\E[23m,
+// exit_standout_mode=\E[27m,
+// exit_underline_mode=\E[24m,
+// flash_screen@,
+// init_2string@,
+// initialize_color@,
+// insert_line=\E[L,
+// key_b2=\E[G,
+// key_backspace=^H,
+// key_btab=\E[Z,
+// key_dc=\E[3~,
+// key_down=\E[B,
+// key_end=\E[4~,
+// key_enter=\EOM,
+// key_f1=\E[[A,
+// key_f10=\E[21~,
+// key_f11=\E[23~,
+// key_f12=\E[24~,
+// key_f13=\E[25~,
+// key_f14=\E[26~,
+// key_f15=\E[28~,
+// key_f16=\E[29~,
+// key_f17=\E[31~,
+// key_f18=\E[32~,
+// key_f19=\E[33~,
+// key_f2=\E[[B,
+// key_f20=\E[34~,
+// key_f21=\E[23$,
+// key_f22=\E[24$,
+// key_f23=\E[11\136,
+// key_f24=\E[12\136,
+// key_f25=\E[13\136,
+// key_f26=\E[14\136,
+// key_f27=\E[15\136,
+// key_f28=\E[17\136,
+// key_f29=\E[18\136,
+// key_f3=\E[[C,
+// key_f30=\E[19\136,
+// key_f31=\E[20\136,
+// key_f32=\E[21\136,
+// key_f33=\E[23\136,
+// key_f34=\E[24\136,
+// key_f35=\E[25\136,
+// key_f36=\E[26\136,
+// key_f37=\E[28\136,
+// key_f38=\E[29\136,
+// key_f39=\E[31\136,
+// key_f4=\E[[D,
+// key_f40=\E[1;6S,
+// key_f41=\E[32\136,
+// key_f42=\E[33\136,
+// key_f43=\E[34\136,
+// key_f44=\E[23@,
+// key_f45=\E[24@,
+// key_f46@,
+// key_f47@,
+// key_f48@,
+// key_f49@,
+// key_f5=\E[[E,
+// key_f50@,
+// key_f51@,
+// key_f52@,
+// key_f53@,
+// key_f54@,
+// key_f55@,
+// key_f56@,
+// key_f57@,
+// key_f58@,
+// key_f59@,
+// key_f6=\E[17~,
+// key_f60@,
+// key_f61@,
+// key_f62@,
+// key_f63@,
+// key_f7=\E[18~,
+// key_f8=\E[19~,
+// key_f9=\E[20~,
+// key_home=\E[1~,
+// key_ic=\E[2~,
+// key_left=\E[D,
+// key_mouse@,
+// key_npage=\E[6~,
+// key_ppage=\E[5~,
+// key_right=\E[C,
+// key_sdc=\E[3;2~,
+// key_send=\E[4;2~,
+// key_sf=\E[1;2B,
+// key_shome=\E[1;2~,
+// key_sic=\E[2;2~,
+// key_sleft=\E[1;2D,
+// key_snext=\E[6;2~,
+// key_sprevious=\E[5;2~,
+// key_sr=\E[1;2A,
+// key_sright=\E[1;2C,
+// key_up=\E[A,
+// keypad_local@,
+// keypad_xmit@,
+// memory_lock@,
+// memory_unlock@,
+// meta_off@,
+// meta_on@,
+// orig_colors@,
+// orig_pair=\E[39;49m,
+// parm_dch=\E[%p1%dP,
+// parm_delete_line=\E[%p1%dM,
+// parm_down_cursor=\E[%p1%dB,
+// parm_ich=\E[%p1%d@,
+// parm_index=\E[%p1%dS,
+// parm_insert_line=\E[%p1%dL,
+// parm_left_cursor=\E[%p1%dD,
+// parm_right_cursor=\E[%p1%dC,
+// parm_rindex=\E[%p1%dT,
+// parm_up_cursor=\E[%p1%dA,
+// print_screen@,
+// prtr_off@,
+// prtr_on@,
+// repeat_char=%p1%c\E[%p2%{1}%-%db,
+// reset_1string@,
+// reset_2string@,
+// restore_cursor=\E8,
+// row_address=\E[%i%p1%dd,
+// save_cursor=\E7,
+// scroll_forward=\n,
+// scroll_reverse=\EM,
+// set_a_background=\E[48;5;%p1%dm,
+// set_a_foreground=\E[38;5;%p1%dm,
+// set_attributes=\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p6%t;1%;m,
+// set_tab@,
+// tab=^I,
+// user6@,
+// user7@,
+// user8@,
+// user9@,
+static const int8_t conemu_terminfo[] = {
+ 30,2,61,0,38,0,15,0,-99,1,31,3,99,111,110,101,109,117,124,65,78,73,83,32,88,51,46,54,52,32,97,110,100,32,88,116,101,114,109,32,50,53,54,32,99,111,108,111,114,115,32,102,111,114,32,67,111,110,69,109,117,32,119,105,116,104,32,108,105,98,117,118,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,-2,-1,0,0,2,0,4,0,-2,-1,21,0,29,0,33,0,37,0,-1,-1,48,0,65,0,69,0,73,0,80,0,-1,-1,82,0,89,0,-1,-1,93,0,-2,-1,97,0,101,0,-1,-1,-1,-1,-2,-1,-2,-1,105,0,110,0,-1,-1,-2,-1,-2,-1,-2,-1,-1,-1,119,0,124,0,-127,0,-122,0,-2,-1,-113,0,-108,0,-1,-1,-2,-1,-99,0,-93,0,-2,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-87,0,-1,-1,-83,0,-1,-1,-1,-1,-1,-1,-81,0,-1,-1,-76,0,-1,-1,-1,-1,-1,-1,-1,-1,-72,0,-67,0,-61,0,-56,0,-51,0,-46,0,-41,0,-35,0,-29,0,-23,0,-17,0,-12,0,-1,-1,-7,0,-1,-1,-3,0,2,1,7,1,11,1,18,1,-1,-1,25,1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,-1,-1,29,1,38,1,47,1,56,1,65,1,74,1,83,1,92,1,101,1,110,1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,119,1,-2,-1,-2,-1,-1,-1,-1,-1,-117,1,-114,1,-103,1,-100,1,-98,1,-95,1,-2,-1,-1,-1,-52,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-50,1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-46,1,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-42,1,-37,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-33,1,-1,-1,-1,-1,-26,1,-1,-1,-1,-1,-1,-1,-1,-1,-19,1,-12,1,-5,1,-1,-1,-1,-1,2,2,-1,-1,9,2,-1,-1,-1,-1,-1,-1,16,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,23,2,29,2,35,2,41,2,47,2,53,2,59,2,65,2,71,2,77,2,83,2,89,2,95,2,101,2,107,2,113,2,119,2,125,2,-125,2,-119,2,-113,2,-107,2,-101,2,-95,2,-89,2,-83,2,-77,2,-71,2,-65,2,-59,2,-52,2,-46,2,-40,2,-34,2,-28,2,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-22,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-17,2,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-8,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-3,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,3,3,17,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,91,48,109,0,27,91,63,49,48,52,57,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,76,0,8,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,91,65,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,54,37,116,59,49,37,59,109,0,9,0,27,91,71,0,27,91,90,0,27,91,52,126,0,27,79,77,0,27,91,51,59,50,126,0,27,91,52,59,50,126,0,27,91,49,59,50,126,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,50,51,36,0,27,91,50,52,36,0,27,91,49,49,94,0,27,91,49,50,94,0,27,91,49,51,94,0,27,91,49,52,94,0,27,91,49,53,94,0,27,91,49,55,94,0,27,91,49,56,94,0,27,91,49,57,94,0,27,91,50,48,94,0,27,91,50,49,94,0,27,91,50,51,94,0,27,91,50,52,94,0,27,91,50,53,94,0,27,91,50,54,94,0,27,91,50,56,94,0,27,91,50,57,94,0,27,91,51,49,94,0,27,91,49,59,54,83,0,27,91,51,50,94,0,27,91,51,51,94,0,27,91,51,52,94,0,27,91,50,51,64,0,27,91,50,52,64,0,27,91,49,75,0,27,91,51,57,59,52,57,109,0,27,91,51,109,0,27,91,50,51,109,0,27,91,51,56,59,53,59,37,112,49,37,100,109,0,27,91,52,56,59,53,59,37,112,49,37,100,109,0,0,3,0,1,0,74,0,-104,0,-95,1,1,0,1,0,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,0,0,-2,-1,-1,-1,5,0,-1,-1,11,0,-1,-1,-2,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,21,0,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,33,0,39,0,42,0,45,0,48,0,54,0,60,0,65,0,70,0,75,0,80,0,85,0,89,0,94,0,99,0,104,0,109,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-100,0,-94,0,-88,0,-82,0,-76,0,-70,0,-65,0,-60,0,-55,0,-50,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,27,1,33,1,39,1,45,1,51,1,57,1,63,1,69,1,75,1,79,1,84,1,89,1,94,1,99,1,104,1,108,1,112,1,116,1,120,1,125,1,-126,1,27,91,51,74,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,91,49,59,50,65,0,65,88,0,71,48,0,88,84,0,85,56,0,67,114,0,67,115,0,69,48,0,69,51,0,77,115,0,83,48,0,83,101,0,83,109,117,108,120,0,83,115,0,84,83,0,88,77,0,103,114,98,111,109,0,103,115,98,111,109,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,114,109,120,120,0,115,109,120,120,0,120,109,0 // NOLINT
+};
+
+// cygwin|ANSI emulation for Cygwin,
+// auto_right_margin,
+// has_status_line,
+// move_insert_mode,
+// move_standout_mode,
+// xon_xoff,
+// init_tabs#8,
+// max_colors#8,
+// max_pairs#64,
+// acs_chars=+^P\054^Q-^X.^Y0\333`^Da\261f\370g\361h\260j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w\302x\263y\363z\362{\343|\330}\234~\376,
+// bell=^G,
+// carriage_return=\r,
+// clear_screen=\E[H\E[J,
+// clr_bol=\E[1K,
+// clr_eol=\E[K,
+// clr_eos=\E[J,
+// column_address=\E[%i%p1%dG,
+// cursor_address=\E[%i%p1%d;%p2%dH,
+// cursor_down=\E[B,
+// cursor_home=\E[H,
+// cursor_left=^H,
+// cursor_right=\E[C,
+// cursor_up=\E[A,
+// delete_character=\E[P,
+// delete_line=\E[M,
+// enter_alt_charset_mode=\E[11m,
+// enter_bold_mode=\E[1m,
+// enter_ca_mode=\E7\E[?47h,
+// enter_insert_mode=\E[4h,
+// enter_pc_charset_mode=\E[11m,
+// enter_reverse_mode=\E[7m,
+// enter_secure_mode=\E[8m,
+// enter_standout_mode=\E[7m,
+// enter_underline_mode=\E[4m,
+// exit_alt_charset_mode=\E[10m,
+// exit_attribute_mode=\E[0;10m,
+// exit_ca_mode=\E[2J\E[?47l\E8,
+// exit_insert_mode=\E[4l,
+// exit_pc_charset_mode=\E[10m,
+// exit_standout_mode=\E[27m,
+// exit_underline_mode=\E[24m,
+// from_status_line=^G,
+// insert_character=\E[@,
+// insert_line=\E[L,
+// key_b2=\E[G,
+// key_backspace=^H,
+// key_dc=\E[3~,
+// key_down=\E[B,
+// key_end=\E[4~,
+// key_f1=\E[[A,
+// key_f10=\E[21~,
+// key_f11=\E[23~,
+// key_f12=\E[24~,
+// key_f13=\E[25~,
+// key_f14=\E[26~,
+// key_f15=\E[28~,
+// key_f16=\E[29~,
+// key_f17=\E[31~,
+// key_f18=\E[32~,
+// key_f19=\E[33~,
+// key_f2=\E[[B,
+// key_f20=\E[34~,
+// key_f3=\E[[C,
+// key_f4=\E[[D,
+// key_f5=\E[[E,
+// key_f6=\E[17~,
+// key_f7=\E[18~,
+// key_f8=\E[19~,
+// key_f9=\E[20~,
+// key_home=\E[1~,
+// key_ic=\E[2~,
+// key_left=\E[D,
+// key_npage=\E[6~,
+// key_ppage=\E[5~,
+// key_right=\E[C,
+// key_suspend=^Z,
+// key_up=\E[A,
+// newline=\r\n,
+// orig_pair=\E[39;49m,
+// parm_dch=\E[%p1%dP,
+// parm_delete_line=\E[%p1%dM,
+// parm_down_cursor=\E[%p1%dB,
+// parm_ich=\E[%p1%d@,
+// parm_insert_line=\E[%p1%dL,
+// parm_left_cursor=\E[%p1%dD,
+// parm_right_cursor=\E[%p1%dC,
+// parm_up_cursor=\E[%p1%dA,
+// reset_1string=\Ec\E]R,
+// restore_cursor=\E8,
+// row_address=\E[%i%p1%dd,
+// save_cursor=\E7,
+// scroll_forward=\n,
+// scroll_reverse=\EM,
+// set_a_background=\E[4%p1%dm,
+// set_a_foreground=\E[3%p1%dm,
+// set_attributes=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m,
+// tab=^I,
+// to_status_line=\E];,
+// user6=\E[%i%d;%dR,
+// user7=\E[6n,
+// user8=\E[?6c,
+// user9=\E[c,
+static const int8_t cygwin_terminfo[] = {
+ 26,1,33,0,21,0,15,0,125,1,-108,2,99,121,103,119,105,110,124,65,78,83,73,32,101,109,117,108,97,116,105,111,110,32,102,111,114,32,67,121,103,119,105,110,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,-1,-1,8,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,-1,-1,0,0,2,0,-1,-1,-1,-1,4,0,11,0,15,0,19,0,-1,-1,30,0,47,0,51,0,-1,-1,55,0,-1,-1,-1,-1,57,0,-1,-1,61,0,-1,-1,65,0,69,0,-1,-1,-1,-1,73,0,-1,-1,79,0,84,0,-1,-1,-1,-1,93,0,98,0,-1,-1,103,0,108,0,113,0,-1,-1,118,0,124,0,-124,0,-1,-1,-111,0,-106,0,-100,0,-1,-1,-1,-1,-94,0,-1,-1,-1,-1,-1,-1,-1,-1,-92,0,-88,0,-1,-1,-84,0,-1,-1,-1,-1,-1,-1,-82,0,-1,-1,-77,0,-1,-1,-1,-1,-1,-1,-1,-1,-73,0,-68,0,-62,0,-57,0,-52,0,-47,0,-42,0,-36,0,-30,0,-24,0,-18,0,-13,0,-1,-1,-8,0,-1,-1,-4,0,1,1,6,1,-1,-1,-1,-1,-1,-1,10,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,14,1,-1,-1,17,1,26,1,35,1,44,1,-1,-1,53,1,62,1,71,1,-1,-1,80,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,89,1,-1,-1,-1,-1,-1,-1,95,1,98,1,109,1,112,1,114,1,117,1,-1,-1,-1,-1,-64,1,-62,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-58,1,-1,-1,-1,-1,-1,-1,-1,-1,-54,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,14,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,16,2,22,2,28,2,34,2,40,2,46,2,52,2,58,2,64,2,70,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,76,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,81,2,92,2,97,2,103,2,107,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,116,2,126,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-120,2,-114,2,7,0,13,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,8,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,91,49,49,109,0,27,91,49,109,0,27,55,27,91,63,52,55,104,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,49,48,109,0,27,91,48,59,49,48,109,0,27,91,50,74,27,91,63,52,55,108,27,56,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,7,0,27,91,64,0,27,91,76,0,8,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,65,0,13,10,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,99,27,93,82,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,59,49,48,37,63,37,112,49,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,55,37,116,59,56,37,59,37,63,37,112,57,37,116,59,49,49,37,59,109,0,9,0,27,93,59,0,27,91,71,0,43,16,44,17,45,24,46,25,48,-37,96,4,97,-79,102,-8,103,-15,104,-80,106,-39,107,-65,108,-38,109,-64,110,-59,111,126,112,-60,113,-60,114,-60,115,95,116,-61,117,-76,118,-63,119,-62,120,-77,121,-13,122,-14,123,-29,124,-40,125,-100,126,-2,0,27,91,52,126,0,26,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,54,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0,27,91,49,49,109,0,27,91,49,48,109,0 // NOLINT
+};
+
+// interix|opennt|opennt-25|ntconsole|ntconsole-25|OpenNT-term compatible with color,
+// auto_right_margin,
+// back_color_erase,
+// move_standout_mode,
+// columns#80,
+// init_tabs#8,
+// lines#25,
+// max_colors#8,
+// max_pairs#64,
+// no_color_video#3,
+// acs_chars=+^P\054^Q-^X.^Y0\333`^Da\261f\370g\361h\260j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w\302x\263y\363z\362{\343|\330}\234~\376,
+// bell=^G,
+// carriage_return=\r,
+// clear_screen=\E[2J,
+// clr_eol=\E[K,
+// clr_eos=\E[J,
+// cursor_address=\E[%i%p1%d;%p2%dH,
+// cursor_down=\n,
+// cursor_home=\E[H,
+// cursor_left=\E[D,
+// cursor_right=\E[C,
+// cursor_to_ll=\E[U,
+// cursor_up=\E[A,
+// delete_line=\E[M,
+// enter_bold_mode=\E[1m,
+// enter_ca_mode=\E[s\E[1b,
+// enter_reverse_mode=\E[7m,
+// enter_standout_mode=\E[7m,
+// enter_underline_mode=\E[4m,
+// exit_attribute_mode=\E[0m,
+// exit_ca_mode=\E[2b\E[u\r\E[K,
+// exit_standout_mode=\E[m,
+// exit_underline_mode=\E[m,
+// insert_line=\E[L,
+// key_backspace=^H,
+// key_btab=\E[Z,
+// key_dc=\177,
+// key_down=\E[B,
+// key_end=\E[U,
+// key_f0=\EFA,
+// key_f1=\EF1,
+// key_f10=\EFA,
+// key_f11=\EFB,
+// key_f12=\EFC,
+// key_f13=\EFD,
+// key_f14=\EFE,
+// key_f15=\EFF,
+// key_f16=\EFG,
+// key_f17=\EFH,
+// key_f18=\EFI,
+// key_f19=\EFJ,
+// key_f2=\EF2,
+// key_f20=\EFK,
+// key_f21=\EFL,
+// key_f22=\EFM,
+// key_f23=\EFN,
+// key_f24=\EFO,
+// key_f25=\EFP,
+// key_f26=\EFQ,
+// key_f27=\EFR,
+// key_f28=\EFS,
+// key_f29=\EFT,
+// key_f3=\EF3,
+// key_f30=\EFU,
+// key_f31=\EFV,
+// key_f32=\EFW,
+// key_f33=\EFX,
+// key_f34=\EFY,
+// key_f35=\EFZ,
+// key_f36=\EFa,
+// key_f37=\EFb,
+// key_f38=\EFc,
+// key_f39=\EFd,
+// key_f4=\EF4,
+// key_f40=\EFe,
+// key_f41=\EFf,
+// key_f42=\EFg,
+// key_f43=\EFh,
+// key_f44=\EFi,
+// key_f45=\EFj,
+// key_f46=\EFk,
+// key_f47=\EFm,
+// key_f48=\EFn,
+// key_f49=\EFo,
+// key_f5=\EF5,
+// key_f50=\EFp,
+// key_f51=\EFq,
+// key_f52=\EFr,
+// key_f53=\EFs,
+// key_f54=\EFt,
+// key_f55=\EFu,
+// key_f56=\EFv,
+// key_f57=\EFw,
+// key_f58=\EFx,
+// key_f59=\EFy,
+// key_f6=\EF6,
+// key_f60=\EFz,
+// key_f7=\EF7,
+// key_f8=\EF8,
+// key_f9=\EF9,
+// key_home=\E[H,
+// key_ic=\E[L,
+// key_left=\E[D,
+// key_ll=\E[U,
+// key_npage=\E[T,
+// key_ppage=\E[S,
+// key_right=\E[C,
+// key_sf=\EF+,
+// key_sleft=\EF\136,
+// key_sr=\EF-,
+// key_sright=\EF$,
+// key_up=\E[A,
+// newline=\r\n,
+// orig_pair=\E[m,
+// parm_delete_line=\E[%p1%dM,
+// parm_down_cursor=\E[%p1%dB,
+// parm_index=\E[%p1%dS,
+// parm_insert_line=\E[%p1%dL,
+// parm_left_cursor=\E[%p1%dD,
+// parm_right_cursor=\E[%p1%dC,
+// parm_rindex=\E[%p1%dT,
+// parm_up_cursor=\E[%p1%dA,
+// repeat_char=%p1%c\E[%p2%{1}%-%db,
+// reset_1string=\Ec,
+// restore_cursor=\E[u,
+// save_cursor=\E[s,
+// scroll_forward=\E[S,
+// scroll_reverse=\E[T,
+// set_a_background=\E[4%p1%dm,
+// set_a_foreground=\E[3%p1%dm,
+// tab=^I,
+static const int8_t interix_8colour_terminfo[] = {
+ 26,1,82,0,29,0,16,0,105,1,116,2,105,110,116,101,114,105,120,124,111,112,101,110,110,116,124,111,112,101,110,110,116,45,50,53,124,110,116,99,111,110,115,111,108,101,124,110,116,99,111,110,115,111,108,101,45,50,53,124,79,112,101,110,78,84,45,116,101,114,109,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,99,111,108,111,114,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,80,0,8,0,25,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,3,0,-1,-1,0,0,2,0,-1,-1,-1,-1,4,0,9,0,13,0,-1,-1,-1,-1,17,0,34,0,36,0,-1,-1,40,0,-1,-1,-1,-1,44,0,48,0,52,0,-1,-1,-1,-1,56,0,-1,-1,-1,-1,-1,-1,-1,-1,60,0,65,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,73,0,78,0,83,0,-1,-1,-1,-1,88,0,93,0,-1,-1,-1,-1,105,0,109,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,113,0,-1,-1,117,0,-1,-1,-1,-1,-1,-1,119,0,-1,-1,121,0,-1,-1,-1,-1,-1,-1,125,0,-127,0,-123,0,-119,0,-115,0,-111,0,-107,0,-103,0,-99,0,-95,0,-91,0,-87,0,-83,0,-1,-1,-79,0,-75,0,-71,0,-67,0,-63,0,-59,0,-55,0,-1,-1,-51,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-47,0,-1,-1,-1,-1,-44,0,-35,0,-1,-1,-26,0,-17,0,-8,0,1,1,10,1,19,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,28,1,48,1,-1,-1,-1,-1,-1,-1,51,1,-1,-1,55,1,59,1,63,1,-1,-1,-1,-1,-1,-1,67,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,69,1,-1,-1,-124,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-120,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-116,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-112,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-108,1,-104,1,-100,1,-96,1,-92,1,-88,1,-84,1,-80,1,-76,1,-72,1,-68,1,-64,1,-60,1,-56,1,-52,1,-48,1,-44,1,-40,1,-36,1,-32,1,-28,1,-24,1,-20,1,-16,1,-12,1,-8,1,-4,1,0,2,4,2,8,2,12,2,16,2,20,2,24,2,28,2,32,2,36,2,40,2,44,2,48,2,52,2,56,2,60,2,64,2,68,2,72,2,76,2,80,2,84,2,88,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,92,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,96,2,106,2,7,0,13,0,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,68,0,27,91,67,0,27,91,85,0,27,91,65,0,27,91,77,0,27,91,49,109,0,27,91,115,27,91,49,98,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,48,109,0,27,91,50,98,27,91,117,13,27,91,75,0,27,91,109,0,27,91,109,0,27,91,76,0,8,0,127,0,27,91,66,0,27,70,65,0,27,70,49,0,27,70,65,0,27,70,50,0,27,70,51,0,27,70,52,0,27,70,53,0,27,70,54,0,27,70,55,0,27,70,56,0,27,70,57,0,27,91,72,0,27,91,76,0,27,91,68,0,27,91,85,0,27,91,84,0,27,91,83,0,27,91,67,0,27,70,43,0,27,70,45,0,27,91,65,0,13,10,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,99,0,27,91,117,0,27,91,115,0,27,91,83,0,27,91,84,0,9,0,43,16,44,17,45,24,46,25,48,-37,96,4,97,-79,102,-8,103,-15,104,-80,106,-39,107,-65,108,-38,109,-64,110,-59,111,126,112,-60,113,-60,114,-60,115,95,116,-61,117,-76,118,-63,119,-62,120,-77,121,-13,122,-14,123,-29,124,-40,125,-100,126,-2,0,27,91,90,0,27,91,85,0,27,70,94,0,27,70,36,0,27,70,66,0,27,70,67,0,27,70,68,0,27,70,69,0,27,70,70,0,27,70,71,0,27,70,72,0,27,70,73,0,27,70,74,0,27,70,75,0,27,70,76,0,27,70,77,0,27,70,78,0,27,70,79,0,27,70,80,0,27,70,81,0,27,70,82,0,27,70,83,0,27,70,84,0,27,70,85,0,27,70,86,0,27,70,87,0,27,70,88,0,27,70,89,0,27,70,90,0,27,70,97,0,27,70,98,0,27,70,99,0,27,70,100,0,27,70,101,0,27,70,102,0,27,70,103,0,27,70,104,0,27,70,105,0,27,70,106,0,27,70,107,0,27,70,109,0,27,70,110,0,27,70,111,0,27,70,112,0,27,70,113,0,27,70,114,0,27,70,115,0,27,70,116,0,27,70,117,0,27,70,118,0,27,70,119,0,27,70,120,0,27,70,121,0,27,70,122,0,27,91,109,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0 // NOLINT
+};
+
+// iTerm2.app|iterm2|terminal emulator for Mac OS X,
+// auto_right_margin,
+// back_color_erase,
+// eat_newline_glitch,
+// has_status_line,
+// move_insert_mode,
+// move_standout_mode,
+// no_pad_char,
+// xon_xoff,
+// columns#80,
+// init_tabs#8,
+// lines#24,
+// max_colors#0x100,
+// max_pairs#0x10000,
+// width_status_line#50,
+// acs_chars=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+// back_tab=\E[Z,
+// bell=^G,
+// carriage_return=\r,
+// change_scroll_region=\E[%i%p1%d;%p2%dr,
+// clear_all_tabs=\E[3g,
+// clear_screen=\E[H\E[J,
+// clr_bol=\E[1K,
+// clr_eol=\E[K,
+// clr_eos=\E[J,
+// column_address=\E[%i%p1%dG,
+// cursor_address=\E[%i%p1%d;%p2%dH,
+// cursor_down=\n,
+// cursor_home=\E[H,
+// cursor_invisible=\E[?25l,
+// cursor_left=^H,
+// cursor_normal=\E[?25h,
+// cursor_right=\E[C,
+// cursor_up=\E[A,
+// delete_character=\E[P,
+// delete_line=\E[M,
+// dis_status_line=\E]2;^G,
+// ena_acs=\E(B\E)0,
+// enter_alt_charset_mode=^N,
+// enter_am_mode=\E[?7h,
+// enter_blink_mode=\E[5m,
+// enter_bold_mode=\E[1m,
+// enter_ca_mode=\E[?1049h\E[22;0;0t,
+// enter_dim_mode=\E[2m,
+// enter_insert_mode=\E[4h,
+// enter_italics_mode=\E[3m,
+// enter_reverse_mode=\E[7m,
+// enter_standout_mode=\E[7m,
+// enter_underline_mode=\E[4m,
+// exit_alt_charset_mode=^O,
+// exit_am_mode=\E[?7l,
+// exit_attribute_mode=\E[m^O,
+// exit_ca_mode=\E[?1049l\E[23;0;0t,
+// exit_insert_mode=\E[4l,
+// exit_italics_mode=\E[23m,
+// exit_standout_mode=\E[27m,
+// exit_underline_mode=\E[24m,
+// flash_screen=\E[?5h$<200/>\E[?5l,
+// from_status_line=^G,
+// insert_character=\E[@,
+// insert_line=\E[L,
+// key_a1@,
+// key_a3@,
+// key_b2@,
+// key_backspace=\177,
+// key_btab=\E[Z,
+// key_c1@,
+// key_c3@,
+// key_dc=\E[3~,
+// key_down=\EOB,
+// key_end=\EOF,
+// key_enter@,
+// key_f1=\EOP,
+// key_f10=\E[21~,
+// key_f11=\E[23~,
+// key_f12=\E[24~,
+// key_f13=\E[1;2P,
+// key_f14=\E[1;2Q,
+// key_f15=\E[1;2R,
+// key_f16=\E[1;2S,
+// key_f17=\E[15;2~,
+// key_f18=\E[17;2~,
+// key_f19=\E[18;2~,
+// key_f2=\EOQ,
+// key_f20=\E[19;2~,
+// key_f21=\E[20;2~,
+// key_f22=\E[21;2~,
+// key_f23=\E[23;2~,
+// key_f24=\E[24;2~,
+// key_f3=\EOR,
+// key_f4=\EOS,
+// key_f5=\E[15~,
+// key_f6=\E[17~,
+// key_f7=\E[18~,
+// key_f8=\E[19~,
+// key_f9=\E[20~,
+// key_home=\EOH,
+// key_left=\EOD,
+// key_mouse=\E[M,
+// key_npage=\E[6~,
+// key_ppage=\E[5~,
+// key_right=\EOC,
+// key_send=\E[1;2F,
+// key_sf=\E[1;2B,
+// key_shome=\E[1;2H,
+// key_sleft=\E[1;2D,
+// key_sr=\E[1;2A,
+// key_sright=\E[1;2C,
+// key_up=\EOA,
+// keypad_local=\E[?1l\E>,
+// keypad_xmit=\E[?1h\E=,
+// newline=\EE,
+// orig_pair=\E[39;49m,
+// parm_dch=\E[%p1%dP,
+// parm_delete_line=\E[%p1%dM,
+// parm_down_cursor=\E[%p1%dB,
+// parm_ich=\E[%p1%d@,
+// parm_index=\E[%p1%dS,
+// parm_insert_line=\E[%p1%dL,
+// parm_left_cursor=\E[%p1%dD,
+// parm_right_cursor=\E[%p1%dC,
+// parm_rindex=\E[%p1%dT,
+// parm_up_cursor=\E[%p1%dA,
+// reset_2string=\E[\041p\E[?3;4l\E[4l\E>\E[?1000l,
+// restore_cursor=\E8,
+// row_address=\E[%i%p1%dd,
+// save_cursor=\E7,
+// scroll_forward=\n,
+// scroll_reverse=\EM,
+// set_a_background=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
+// set_a_foreground=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
+// set_attributes=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;m%?%p9%t^N%e^O%;,
+// set_tab=\EH,
+// tab=^I,
+// to_status_line=\E]2;,
+// user6=\E[%i%d;%dR,
+// user7=\E[6n,
+// user8=\E[?%[;0123456789]c,
+// user9=\E[c,
+static const int8_t iterm_256colour_terminfo[] = {
+ 30,2,49,0,29,0,15,0,105,1,-29,3,105,84,101,114,109,50,46,97,112,112,124,105,116,101,114,109,50,124,116,101,114,109,105,110,97,108,32,101,109,117,108,97,116,111,114,32,102,111,114,32,77,97,99,32,79,83,32,88,0,0,1,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,1,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,37,0,41,0,45,0,-1,-1,56,0,73,0,75,0,79,0,86,0,-1,-1,88,0,95,0,-1,-1,99,0,-1,-1,103,0,107,0,111,0,-1,-1,117,0,119,0,124,0,-127,0,-1,-1,-109,0,-104,0,-1,-1,-1,-1,-99,0,-94,0,-89,0,-1,-1,-84,0,-82,0,-77,0,-1,-1,-59,0,-54,0,-48,0,-42,0,-1,-1,-24,0,-1,-1,-1,-1,-1,-1,-1,-1,-22,0,-18,0,-1,-1,-14,0,-1,-1,-1,-1,-1,-1,-12,0,-1,-1,-7,0,-1,-1,-1,-1,-1,-1,-1,-1,-3,0,1,1,7,1,11,1,15,1,19,1,25,1,31,1,37,1,43,1,49,1,-1,-1,-1,-1,53,1,-1,-1,57,1,62,1,67,1,71,1,78,1,-1,-1,85,1,89,1,97,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,1,-1,-1,108,1,117,1,126,1,-121,1,-112,1,-103,1,-94,1,-85,1,-76,1,-67,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-58,1,-1,-1,-1,-1,-32,1,-29,1,-18,1,-15,1,-13,1,-10,1,68,2,-1,-1,71,2,73,2,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-1,-1,78,2,-1,-1,-127,2,-1,-1,-1,-1,-123,2,-117,2,-1,-1,-1,-1,-111,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-104,2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-100,2,-1,-1,-1,-1,-1,-1,-1,-1,-93,2,-1,-1,-86,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-79,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-72,2,-66,2,-60,2,-53,2,-46,2,-39,2,-32,2,-24,2,-16,2,-8,2,0,3,8,3,16,3,24,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,32,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,37,3,48,3,53,3,72,3,76,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,85,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,90,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,96,3,-1,-1,-1,-1,-1,-1,100,3,-93,3,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,93,50,59,7,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,27,91,50,50,59,48,59,48,116,0,27,91,50,109,0,27,91,52,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,15,0,27,91,109,15,0,27,91,63,49,48,52,57,108,27,91,50,51,59,48,59,48,116,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,50,48,48,47,62,27,91,63,53,108,0,7,0,27,91,64,0,27,91,76,0,127,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,79,72,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,69,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,91,33,112,27,91,63,51,59,52,108,27,91,52,108,27,62,27,91,63,49,48,48,48,108,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,93,50,59,0,96,96,97,97,102,102,103,103,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,40,66,27,41,48,0,27,79,70,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,49,59,50,68,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,37,91,59,48,49,50,51,52,53,54,55,56,57,93,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,91,51,109,0,27,91,50,51,109,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,0,1,0,0,0,33,0,67,0,-37,1,0,0,0,0,5,0,32,0,37,0,45,0,52,0,59,0,66,0,74,0,81,0,88,0,96,0,104,0,111,0,119,0,126,0,-123,0,-115,0,-107,0,-102,0,-94,0,-87,0,-80,0,-74,0,-68,0,-63,0,-55,0,-48,0,-41,0,-36,0,-28,0,-21,0,-14,0,0,0,3,0,6,0,9,0,14,0,19,0,24,0,29,0,35,0,41,0,47,0,53,0,59,0,65,0,71,0,77,0,83,0,89,0,95,0,101,0,107,0,113,0,119,0,125,0,-125,0,-119,0,-113,0,-107,0,-101,0,-95,0,-90,0,-85,0,-80,0,-75,0,27,93,50,59,0,27,91,63,49,48,48,48,37,63,37,112,49,37,123,49,125,37,61,37,116,104,37,101,108,37,59,0,27,27,91,66,0,27,91,49,59,49,48,66,0,27,91,49,59,53,66,0,27,91,49,59,54,66,0,27,91,49,59,57,70,0,27,91,49,59,49,48,70,0,27,91,49,59,53,70,0,27,91,49,59,54,70,0,27,91,49,59,49,51,70,0,27,91,49,59,49,52,70,0,27,91,49,59,57,72,0,27,91,49,59,49,48,72,0,27,91,49,59,53,72,0,27,91,49,59,54,72,0,27,91,49,59,49,51,72,0,27,91,49,59,49,52,72,0,27,27,91,68,0,27,91,49,59,49,48,68,0,27,91,49,59,53,68,0,27,91,49,59,54,68,0,27,27,91,54,126,0,27,27,91,53,126,0,27,27,91,67,0,27,91,49,59,49,48,67,0,27,91,49,59,53,67,0,27,91,49,59,54,67,0,27,27,91,65,0,27,91,49,59,49,48,65,0,27,91,49,59,53,65,0,27,91,49,59,54,65,0,27,91,77,37,63,37,112,52,37,116,51,37,101,37,112,51,37,39,32,39,37,43,37,99,37,59,37,112,50,37,39,33,39,37,43,37,99,37,112,49,37,39,33,39,37,43,37,99,0,65,88,0,84,83,0,88,77,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,78,88,84,51,0,107,80,82,86,51,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,120,109,0 // NOLINT
+};
+
+// linux|linux console,
+// auto_right_margin,
+// back_color_erase,
+// can_change,
+// eat_newline_glitch,
+// erase_overstrike,
+// move_insert_mode,
+// move_standout_mode,
+// xon_xoff,
+// init_tabs#8,
+// max_colors#8,
+// max_pairs#64,
+// no_color_video#18,
+// acs_chars=++\054\054--..00__``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}c~~,
+// bell=^G,
+// carriage_return=\r,
+// change_scroll_region=\E[%i%p1%d;%p2%dr,
+// clear_all_tabs=\E[3g,
+// clear_screen=\E[H\E[J,
+// clr_bol=\E[1K,
+// clr_eol=\E[K,
+// clr_eos=\E[J,
+// column_address=\E[%i%p1%dG,
+// cursor_address=\E[%i%p1%d;%p2%dH,
+// cursor_down=\n,
+// cursor_home=\E[H,
+// cursor_invisible=\E[?25l\E[?1c,
+// cursor_left=^H,
+// cursor_normal=\E[?25h\E[?0c,
+// cursor_right=\E[C,
+// cursor_up=\E[A,
+// cursor_visible=\E[?25h\E[?8c,
+// delete_character=\E[P,
+// delete_line=\E[M,
+// ena_acs=\E)0,
+// enter_alt_charset_mode=^N,
+// enter_am_mode=\E[?7h,
+// enter_blink_mode=\E[5m,
+// enter_bold_mode=\E[1m,
+// enter_dim_mode=\E[2m,
+// enter_insert_mode=\E[4h,
+// enter_pc_charset_mode=\E[11m,
+// enter_reverse_mode=\E[7m,
+// enter_standout_mode=\E[7m,
+// enter_underline_mode=\E[4m,
+// erase_chars=\E[%p1%dX,
+// exit_alt_charset_mode=^O,
+// exit_am_mode=\E[?7l,
+// exit_attribute_mode=\E[m^O,
+// exit_insert_mode=\E[4l,
+// exit_pc_charset_mode=\E[10m,
+// exit_standout_mode=\E[27m,
+// exit_underline_mode=\E[24m,
+// flash_screen=\E[?5h$<200/>\E[?5l,
+// initialize_color=\E]P%p1%x%p2%{255}%*%{1000}%/%02x%p3%{255}%*%{1000}%/%02x%p4%{255}%*%{1000}%/%02x,
+// insert_character=\E[@,
+// insert_line=\E[L,
+// key_b2=\E[G,
+// key_backspace=\177,
+// key_btab=\E[Z,
+// key_dc=\E[3~,
+// key_down=\E[B,
+// key_end=\E[4~,
+// key_f1=\E[[A,
+// key_f10=\E[21~,
+// key_f11=\E[23~,
+// key_f12=\E[24~,
+// key_f13=\E[25~,
+// key_f14=\E[26~,
+// key_f15=\E[28~,
+// key_f16=\E[29~,
+// key_f17=\E[31~,
+// key_f18=\E[32~,
+// key_f19=\E[33~,
+// key_f2=\E[[B,
+// key_f20=\E[34~,
+// key_f3=\E[[C,
+// key_f4=\E[[D,
+// key_f5=\E[[E,
+// key_f6=\E[17~,
+// key_f7=\E[18~,
+// key_f8=\E[19~,
+// key_f9=\E[20~,
+// key_home=\E[1~,
+// key_ic=\E[2~,
+// key_left=\E[D,
+// key_mouse=\E[M,
+// key_npage=\E[6~,
+// key_ppage=\E[5~,
+// key_right=\E[C,
+// key_suspend=^Z,
+// key_up=\E[A,
+// newline=\r\n,
+// orig_colors=\E]R,
+// orig_pair=\E[39;49m,
+// parm_dch=\E[%p1%dP,
+// parm_delete_line=\E[%p1%dM,
+// parm_down_cursor=\E[%p1%dB,
+// parm_ich=\E[%p1%d@,
+// parm_insert_line=\E[%p1%dL,
+// parm_left_cursor=\E[%p1%dD,
+// parm_right_cursor=\E[%p1%dC,
+// parm_up_cursor=\E[%p1%dA,
+// reset_1string=\Ec\E]R,
+// restore_cursor=\E8,
+// row_address=\E[%i%p1%dd,
+// save_cursor=\E7,
+// scroll_forward=\n,
+// scroll_reverse=\EM,
+// set_a_background=\E[4%p1%dm,
+// set_a_foreground=\E[3%p1%dm,
+// set_attributes=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p6%t;1%;m%?%p9%t^N%e^O%;,
+// set_tab=\EH,
+// tab=^I,
+// user6=\E[%i%d;%dR,
+// user7=\E[6n,
+// user8=\E[?6c,
+// user9=\E[c,
+static const int8_t linux_16colour_terminfo[] = {
+ 26,1,20,0,29,0,16,0,125,1,69,3,108,105,110,117,120,124,108,105,110,117,120,32,99,111,110,115,111,108,101,0,0,1,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,-1,-1,8,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,18,0,-1,-1,0,0,2,0,4,0,21,0,26,0,33,0,37,0,41,0,-1,-1,52,0,69,0,71,0,75,0,87,0,-1,-1,89,0,101,0,-1,-1,105,0,109,0,121,0,125,0,-1,-1,-1,-1,-127,0,-125,0,-120,0,-1,-1,-1,-1,-115,0,-110,0,-1,-1,-1,-1,-105,0,-100,0,-95,0,-90,0,-81,0,-79,0,-1,-1,-1,-1,-74,0,-69,0,-63,0,-57,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-39,0,-35,0,-1,-1,-31,0,-1,-1,-1,-1,-1,-1,-29,0,-1,-1,-24,0,-1,-1,-1,-1,-1,-1,-1,-1,-20,0,-15,0,-9,0,-4,0,1,1,6,1,11,1,17,1,23,1,29,1,35,1,40,1,-1,-1,45,1,-1,-1,49,1,54,1,59,1,-1,-1,-1,-1,-1,-1,63,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,67,1,-1,-1,70,1,79,1,88,1,97,1,-1,-1,106,1,115,1,124,1,-1,-1,-123,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-114,1,-1,-1,-1,-1,-1,-1,-108,1,-105,1,-94,1,-91,1,-89,1,-86,1,1,2,-1,-1,4,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6,2,-1,-1,-1,-1,-1,-1,-1,-1,10,2,-1,-1,77,2,-1,-1,-1,-1,81,2,87,2,-1,-1,-1,-1,93,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,97,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,102,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,104,2,110,2,116,2,122,2,-128,2,-122,2,-116,2,-110,2,-104,2,-98,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-92,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-87,2,-76,2,-71,2,-65,2,-61,2,-52,2,-48,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,33,3,-1,-1,-1,-1,-1,-1,37,3,47,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,57,3,63,3,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,27,91,63,49,99,0,8,0,27,91,63,50,53,104,27,91,63,48,99,0,27,91,67,0,27,91,65,0,27,91,63,50,53,104,27,91,63,56,99,0,27,91,80,0,27,91,77,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,50,109,0,27,91,52,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,15,0,27,91,109,15,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,50,48,48,47,62,27,91,63,53,108,0,27,91,64,0,27,91,76,0,127,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,65,0,13,10,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,99,27,93,82,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,59,49,48,37,63,37,112,49,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,54,37,116,59,49,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,91,71,0,43,43,44,44,45,45,46,46,48,48,95,95,96,96,97,97,102,102,103,103,104,104,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,99,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,41,48,0,27,91,52,126,0,26,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,54,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,82,0,27,93,80,37,112,49,37,120,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,48,50,120,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,48,50,120,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,48,50,120,0,27,91,77,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0,27,91,49,49,109,0,27,91,49,48,109,0,0,3,0,1,0,12,0,28,0,63,0,1,0,0,0,1,0,-1,-1,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,33,0,39,0,43,0,47,0,51,0,55,0,27,91,51,74,0,65,88,0,71,48,0,88,84,0,85,56,0,69,48,0,69,51,0,83,48,0,84,83,0,88,77,0,107,69,78,68,53,0,107,72,79,77,53,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,120,109,0 // NOLINT
+};
+
+// putty-256color|PuTTY 0.58 with xterm 256-colors,
+// auto_left_margin,
+// auto_right_margin,
+// back_color_erase,
+// eat_newline_glitch,
+// has_status_line,
+// move_insert_mode,
+// move_standout_mode,
+// xon_xoff,
+// init_tabs#8,
+// max_colors#0x100,
+// max_pairs#0x10000,
+// no_color_video#22,
+// acs_chars=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+// back_tab=\E[Z,
+// bell=^G,
+// carriage_return=\r,
+// change_scroll_region=\E[%i%p1%d;%p2%dr,
+// clear_all_tabs=\E[3g,
+// clear_screen=\E[H\E[J,
+// clr_bol=\E[1K,
+// clr_eol=\E[K,
+// clr_eos=\E[J,
+// column_address=\E[%i%p1%dG,
+// cursor_address=\E[%i%p1%d;%p2%dH,
+// cursor_down=\ED,
+// cursor_home=\E[H,
+// cursor_invisible=\E[?25l,
+// cursor_left=^H,
+// cursor_normal=\E[?25h,
+// cursor_right=\E[C,
+// cursor_up=\EM,
+// delete_character=\E[P,
+// delete_line=\E[M,
+// dis_status_line=\E]0;^G,
+// display_pc_char=%?%p1%{8}%=%t\E%%G\342\227\230\E%%@%e%p1%{10}%=%t\E%%G\342\227\231\E%%@%e%p1%{12}%=%t\E%%G\342\231\0\E%%@%e%p1%{13}%=%t\E%%G\342\231\252\E%%@%e%p1%{14}%=%t\E%%G\342\231\253\E%%@%e%p1%{15}%=%t\E%%G\342\230\274\E%%@%e%p1%{27}%=%t\E%%G\342\206\220\E%%@%e%p1%{155}%=%t\E%%G\340\202\242\E%%@%e%p1%c%;,
+// ena_acs=\E(B\E)0,
+// enter_alt_charset_mode=^N,
+// enter_am_mode=\E[?7h,
+// enter_blink_mode=\E[5m,
+// enter_bold_mode=\E[1m,
+// enter_ca_mode=\E[?47h,
+// enter_insert_mode=\E[4h,
+// enter_pc_charset_mode=\E[11m,
+// enter_reverse_mode=\E[7m,
+// enter_standout_mode=\E[7m,
+// enter_underline_mode=\E[4m,
+// erase_chars=\E[%p1%dX,
+// exit_alt_charset_mode=^O,
+// exit_am_mode=\E[?7l,
+// exit_attribute_mode=\E[m^O,
+// exit_ca_mode=\E[2J\E[?47l,
+// exit_insert_mode=\E[4l,
+// exit_pc_charset_mode=\E[10m,
+// exit_standout_mode=\E[27m,
+// exit_underline_mode=\E[24m,
+// flash_screen=\E[?5h$<100/>\E[?5l,
+// from_status_line=^G,
+// init_2string=\E7\E[r\E[m\E[?7h\E[?1;4;6l\E[4l\E8\E>\E]R,
+// insert_line=\E[L,
+// key_b2=\E[G,
+// key_backspace=\177,
+// key_btab=\E[Z,
+// key_dc=\E[3~,
+// key_down=\EOB,
+// key_end=\E[4~,
+// key_f1=\E[11~,
+// key_f10=\E[21~,
+// key_f11=\E[23~,
+// key_f12=\E[24~,
+// key_f13=\E[25~,
+// key_f14=\E[26~,
+// key_f15=\E[28~,
+// key_f16=\E[29~,
+// key_f17=\E[31~,
+// key_f18=\E[32~,
+// key_f19=\E[33~,
+// key_f2=\E[12~,
+// key_f20=\E[34~,
+// key_f3=\E[13~,
+// key_f4=\E[14~,
+// key_f5=\E[15~,
+// key_f6=\E[17~,
+// key_f7=\E[18~,
+// key_f8=\E[19~,
+// key_f9=\E[20~,
+// key_home=\E[1~,
+// key_ic=\E[2~,
+// key_left=\EOD,
+// key_mouse=\E[M,
+// key_npage=\E[6~,
+// key_ppage=\E[5~,
+// key_right=\EOC,
+// key_sf=\E[B,
+// key_sleft=\E[D,
+// key_sr=\E[A,
+// key_sright=\E[C,
+// key_suspend=^Z,
+// key_up=\EOA,
+// keypad_local=\E[?1l\E>,
+// keypad_xmit=\E[?1h\E=,
+// newline=\r\n,
+// orig_colors=\E]R,
+// orig_pair=\E[39;49m,
+// parm_dch=\E[%p1%dP,
+// parm_delete_line=\E[%p1%dM,
+// parm_down_cursor=\E[%p1%dB,
+// parm_index=\E[%p1%dS,
+// parm_insert_line=\E[%p1%dL,
+// parm_left_cursor=\E[%p1%dD,
+// parm_right_cursor=\E[%p1%dC,
+// parm_rindex=\E[%p1%dT,
+// parm_up_cursor=\E[%p1%dA,
+// reset_2string=\E<\E["p\E[50;6"p\Ec\E[?3l\E]R\E[?1000l,
+// restore_cursor=\E8,
+// row_address=\E[%i%p1%dd,
+// save_cursor=\E7,
+// scroll_forward=\n,
+// scroll_reverse=\EM,
+// set0_des_seq=\E[10m,
+// set1_des_seq=\E[11m,
+// set2_des_seq=\E[12m,
+// set_a_background=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
+// set_a_foreground=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
+// set_attributes=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t^N%e^O%;,
+// set_tab=\EH,
+// tab=^I,
+// to_status_line=\E]0;,
+// user6=\E[%i%d;%dR,
+// user7=\E[6n,
+// user8=\E[?6c,
+// user9=\E[c,
+static const int8_t putty_256colour_terminfo[] = {
+ 30,2,48,0,29,0,16,0,125,1,-106,4,112,117,116,116,121,45,50,53,54,99,111,108,111,114,124,80,117,84,84,89,32,48,46,53,56,32,119,105,116,104,32,120,116,101,114,109,32,50,53,54,45,99,111,108,111,114,115,0,1,1,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,-1,-1,-1,-1,8,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,22,0,0,0,0,0,4,0,6,0,8,0,25,0,30,0,37,0,41,0,45,0,-1,-1,56,0,73,0,76,0,80,0,87,0,-1,-1,89,0,96,0,-1,-1,100,0,-1,-1,103,0,107,0,111,0,-1,-1,117,0,119,0,124,0,-127,0,-1,-1,-1,-1,-120,0,-1,-1,-1,-1,-115,0,-110,0,-105,0,-100,0,-91,0,-89,0,-84,0,-1,-1,-73,0,-68,0,-62,0,-56,0,-1,-1,-38,0,-1,-1,-36,0,-1,-1,-1,-1,-1,-1,-2,0,-1,-1,2,1,-1,-1,-1,-1,-1,-1,4,1,-1,-1,9,1,-1,-1,-1,-1,-1,-1,-1,-1,13,1,19,1,25,1,31,1,37,1,43,1,49,1,55,1,61,1,67,1,73,1,78,1,-1,-1,83,1,-1,-1,87,1,92,1,97,1,101,1,105,1,-1,-1,109,1,113,1,121,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-127,1,-1,-1,-124,1,-115,1,-106,1,-1,-1,-97,1,-88,1,-79,1,-70,1,-61,1,-52,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-43,1,-1,-1,-1,-1,-10,1,-7,1,4,2,7,2,9,2,12,2,84,2,-1,-1,87,2,89,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,94,2,-1,-1,-1,-1,-1,-1,-1,-1,98,2,-1,-1,-107,2,-1,-1,-1,-1,-103,2,-97,2,-1,-1,-1,-1,-91,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-84,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-79,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-77,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-73,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-69,2,-63,2,-57,2,-51,2,-45,2,-39,2,-33,2,-27,2,-21,2,-15,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-9,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-4,2,7,3,12,3,18,3,22,3,31,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,35,3,-1,-1,-1,-1,-1,-1,39,3,102,3,-1,-1,-1,-1,-1,-1,-90,3,-84,3,-78,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-72,3,-118,4,-112,4,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,68,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,77,0,27,91,80,0,27,91,77,0,27,93,48,59,7,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,63,52,55,104,0,27,91,52,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,15,0,27,91,109,15,0,27,91,50,74,27,91,63,52,55,108,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,7,0,27,55,27,91,114,27,91,109,27,91,63,55,104,27,91,63,49,59,52,59,54,108,27,91,52,108,27,56,27,62,27,93,82,0,27,91,76,0,127,0,27,91,51,126,0,27,79,66,0,27,91,49,49,126,0,27,91,50,49,126,0,27,91,49,50,126,0,27,91,49,51,126,0,27,91,49,52,126,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,66,0,27,91,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,13,10,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,60,27,91,34,112,27,91,53,48,59,54,34,112,27,99,27,91,63,51,108,27,93,82,27,91,63,49,48,48,48,108,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,49,37,112,54,37,124,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,93,48,59,0,27,91,71,0,96,96,97,97,102,102,103,103,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,40,66,27,41,48,0,27,91,52,126,0,26,0,27,91,68,0,27,91,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,54,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,82,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,49,48,109,0,27,91,49,49,109,0,27,91,49,50,109,0,37,63,37,112,49,37,123,56,125,37,61,37,116,27,37,37,71,-30,-105,-104,27,37,37,64,37,101,37,112,49,37,123,49,48,125,37,61,37,116,27,37,37,71,-30,-105,-103,27,37,37,64,37,101,37,112,49,37,123,49,50,125,37,61,37,116,27,37,37,71,-30,-103,-128,27,37,37,64,37,101,37,112,49,37,123,49,51,125,37,61,37,116,27,37,37,71,-30,-103,-86,27,37,37,64,37,101,37,112,49,37,123,49,52,125,37,61,37,116,27,37,37,71,-30,-103,-85,27,37,37,64,37,101,37,112,49,37,123,49,53,125,37,61,37,116,27,37,37,71,-30,-104,-68,27,37,37,64,37,101,37,112,49,37,123,50,55,125,37,61,37,116,27,37,37,71,-30,-122,-112,27,37,37,64,37,101,37,112,49,37,123,49,53,53,125,37,61,37,116,27,37,37,71,-32,-126,-94,27,37,37,64,37,101,37,112,49,37,99,37,59,0,27,91,49,49,109,0,27,91,49,48,109,0,3,0,1,0,60,0,124,0,74,1,0,0,1,0,1,0,0,0,-1,-1,0,0,-1,-1,-1,-1,-1,-1,5,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,33,0,39,0,45,0,50,0,55,0,60,0,65,0,70,0,74,0,79,0,84,0,89,0,94,0,99,0,105,0,111,0,117,0,123,0,-127,0,-121,0,-115,0,-109,0,-103,0,-97,0,-91,0,-85,0,-80,0,-75,0,-69,0,-63,0,-57,0,-51,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,25,1,30,1,35,1,40,1,45,1,49,1,53,1,57,1,61,1,27,91,51,74,0,27,93,48,59,0,65,88,0,71,48,0,88,84,0,85,56,0,69,48,0,69,51,0,83,48,0,83,101,0,83,115,0,84,83,0,88,77,0,103,114,98,111,109,0,103,115,98,111,109,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,73,67,53,0,107,73,67,54,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,53,0,107,78,88,84,54,0,107,80,82,86,51,0,107,80,82,86,53,0,107,80,82,86,54,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,120,109,0 // NOLINT
+};
+
+// rxvt-256color|rxvt 2.7.9 with xterm 256-colors,
+// auto_right_margin,
+// back_color_erase,
+// backspaces_with_bs,
+// can_change,
+// eat_newline_glitch,
+// erase_overstrike,
+// move_insert_mode,
+// move_standout_mode,
+// xon_xoff,
+// columns#80,
+// init_tabs#8,
+// lines#24,
+// max_colors#0x100,
+// max_pairs#0x10000,
+// acs_chars=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+// bell=^G,
+// carriage_return=\r,
+// change_scroll_region=\E[%i%p1%d;%p2%dr,
+// clear_all_tabs=\E[3g,
+// clear_screen=\E[H\E[2J,
+// clr_bol=\E[1K,
+// clr_eol=\E[K,
+// clr_eos=\E[J,
+// column_address=\E[%i%p1%dG,
+// cursor_address=\E[%i%p1%d;%p2%dH,
+// cursor_down=\n,
+// cursor_home=\E[H,
+// cursor_invisible=\E[?25l,
+// cursor_left=^H,
+// cursor_normal=\E[?25h,
+// cursor_right=\E[C,
+// cursor_up=\E[A,
+// delete_line=\E[M,
+// ena_acs=\E(B\E)0,
+// enter_alt_charset_mode=^N,
+// enter_blink_mode=\E[5m,
+// enter_bold_mode=\E[1m,
+// enter_ca_mode=\E7\E[?47h,
+// enter_insert_mode=\E[4h,
+// enter_reverse_mode=\E[7m,
+// enter_standout_mode=\E[7m,
+// enter_underline_mode=\E[4m,
+// exit_alt_charset_mode=^O,
+// exit_attribute_mode=\E[m^O,
+// exit_ca_mode=\E[2J\E[?47l\E8,
+// exit_insert_mode=\E[4l,
+// exit_standout_mode=\E[27m,
+// exit_underline_mode=\E[24m,
+// flash_screen=\E[?5h$<100/>\E[?5l,
+// init_1string=\E[?47l\E=\E[?1l,
+// init_2string=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l,
+// initialize_color=\E]4;%p1%d;rgb\072%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\,
+// insert_character=\E[@,
+// insert_line=\E[L,
+// key_a1=\EOw,
+// key_a3=\EOy,
+// key_b2=\EOu,
+// key_backspace=^H,
+// key_btab=\E[Z,
+// key_c1=\EOq,
+// key_c3=\EOs,
+// key_dc=\E[3~,
+// key_down=\E[B,
+// key_end=\E[8~,
+// key_enter=\EOM,
+// key_eol=\E[8\136,
+// key_f0=\E[21~,
+// key_f1=\E[11~,
+// key_f10=\E[21~,
+// key_f11=\E[23~,
+// key_f12=\E[24~,
+// key_f13=\E[25~,
+// key_f14=\E[26~,
+// key_f15=\E[28~,
+// key_f16=\E[29~,
+// key_f17=\E[31~,
+// key_f18=\E[32~,
+// key_f19=\E[33~,
+// key_f2=\E[12~,
+// key_f20=\E[34~,
+// key_f21=\E[23$,
+// key_f22=\E[24$,
+// key_f23=\E[11\136,
+// key_f24=\E[12\136,
+// key_f25=\E[13\136,
+// key_f26=\E[14\136,
+// key_f27=\E[15\136,
+// key_f28=\E[17\136,
+// key_f29=\E[18\136,
+// key_f3=\E[13~,
+// key_f30=\E[19\136,
+// key_f31=\E[20\136,
+// key_f32=\E[21\136,
+// key_f33=\E[23\136,
+// key_f34=\E[24\136,
+// key_f35=\E[25\136,
+// key_f36=\E[26\136,
+// key_f37=\E[28\136,
+// key_f38=\E[29\136,
+// key_f39=\E[31\136,
+// key_f4=\E[14~,
+// key_f40=\E[32\136,
+// key_f41=\E[33\136,
+// key_f42=\E[34\136,
+// key_f43=\E[23@,
+// key_f44=\E[24@,
+// key_f5=\E[15~,
+// key_f6=\E[17~,
+// key_f7=\E[18~,
+// key_f8=\E[19~,
+// key_f9=\E[20~,
+// key_find=\E[1~,
+// key_home=\E[7~,
+// key_ic=\E[2~,
+// key_left=\E[D,
+// key_mouse=\E[M,
+// key_npage=\E[6~,
+// key_ppage=\E[5~,
+// key_right=\E[C,
+// key_sdc=\E[3$,
+// key_select=\E[4~,
+// key_send=\E[8$,
+// key_sf=\E[a,
+// key_shome=\E[7$,
+// key_sic=\E[2$,
+// key_sleft=\E[d,
+// key_snext=\E[6$,
+// key_sprevious=\E[5$,
+// key_sr=\E[b,
+// key_sright=\E[c,
+// key_up=\E[A,
+// keypad_local=\E>,
+// keypad_xmit=\E=,
+// orig_colors=\E]104^G,
+// orig_pair=\E[39;49m,
+// parm_delete_line=\E[%p1%dM,
+// parm_down_cursor=\E[%p1%dB,
+// parm_ich=\E[%p1%d@,
+// parm_insert_line=\E[%p1%dL,
+// parm_left_cursor=\E[%p1%dD,
+// parm_right_cursor=\E[%p1%dC,
+// parm_up_cursor=\E[%p1%dA,
+// reset_1string=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H,
+// reset_2string=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l\E>\E[?1000l\E[?25h,
+// restore_cursor=\E8,
+// row_address=\E[%i%p1%dd,
+// save_cursor=\E7,
+// scroll_forward=\n,
+// scroll_reverse=\EM,
+// set0_des_seq=\E(B,
+// set1_des_seq=\E(0,
+// set_a_background=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
+// set_a_foreground=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
+// set_attributes=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t^N%e^O%;,
+// set_tab=\EH,
+// tab=^I,
+// user6=\E[%i%d;%dR,
+// user7=\E[6n,
+// user8=\E[?1;2c,
+// user9=\E[c,
+static const int8_t rxvt_256colour_terminfo[] = {
+ 30,2,47,0,38,0,15,0,110,1,-31,4,114,120,118,116,45,50,53,54,99,111,108,111,114,124,114,120,118,116,32,50,46,55,46,57,32,119,105,116,104,32,120,116,101,114,109,32,50,53,54,45,99,111,108,111,114,115,0,0,1,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,-1,-1,0,0,2,0,4,0,21,0,26,0,34,0,38,0,42,0,-1,-1,53,0,70,0,72,0,76,0,83,0,-1,-1,85,0,92,0,-1,-1,96,0,-1,-1,-1,-1,100,0,-1,-1,-1,-1,104,0,106,0,111,0,116,0,-1,-1,-1,-1,125,0,-1,-1,-1,-1,-126,0,-121,0,-116,0,-1,-1,-111,0,-109,0,-104,0,-1,-1,-91,0,-86,0,-80,0,-74,0,-1,-1,-1,-1,-56,0,-42,0,-1,-1,-1,-1,-8,0,-4,0,-1,-1,0,1,-1,-1,-1,-1,-1,-1,2,1,-1,-1,7,1,-1,-1,11,1,-1,-1,16,1,22,1,28,1,34,1,40,1,46,1,52,1,58,1,64,1,70,1,76,1,82,1,87,1,-1,-1,92,1,-1,-1,96,1,101,1,106,1,110,1,114,1,-1,-1,118,1,122,1,125,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-128,1,-119,1,-110,1,-1,-1,-101,1,-92,1,-83,1,-1,-1,-74,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-65,1,-32,1,-1,-1,-1,-1,18,2,21,2,32,2,35,2,37,2,40,2,107,2,-1,-1,110,2,-1,-1,-1,-1,-1,-1,-1,-1,112,2,116,2,120,2,124,2,-128,2,-1,-1,-1,-1,-124,2,-1,-1,-73,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-69,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-62,2,-57,2,-1,-1,-53,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-48,2,-1,-1,-43,2,-38,2,-1,-1,-1,-1,-1,-1,-1,-1,-33,2,-28,2,-23,2,-1,-1,-1,-1,-19,2,-1,-1,-14,2,-1,-1,-1,-1,-1,-1,-9,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-5,2,1,3,7,3,13,3,19,3,25,3,31,3,37,3,43,3,49,3,55,3,61,3,67,3,73,3,79,3,85,3,91,3,97,3,103,3,109,3,115,3,121,3,127,3,-123,3,-117,3,-111,3,-105,3,-99,3,-93,3,-87,3,-81,3,-75,3,-69,3,-63,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-57,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-52,3,-41,3,-36,3,-28,3,-24,3,-15,3,-8,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,86,4,-1,-1,-1,-1,-1,-1,90,4,-103,4,-1,-1,-1,-1,-1,-1,-39,4,-35,4,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,77,0,14,0,27,91,53,109,0,27,91,49,109,0,27,55,27,91,63,52,55,104,0,27,91,52,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,15,0,27,91,109,15,0,27,91,50,74,27,91,63,52,55,108,27,56,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,27,91,63,52,55,108,27,61,27,91,63,49,108,0,27,91,114,27,91,109,27,91,50,74,27,91,72,27,91,63,55,104,27,91,63,49,59,51,59,52,59,54,108,27,91,52,108,0,27,91,64,0,27,91,76,0,8,0,27,91,51,126,0,27,91,66,0,27,91,56,94,0,27,91,50,49,126,0,27,91,49,49,126,0,27,91,50,49,126,0,27,91,49,50,126,0,27,91,49,51,126,0,27,91,49,52,126,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,55,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,97,0,27,91,98,0,27,91,65,0,27,62,0,27,61,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,62,27,91,49,59,51,59,52,59,53,59,54,108,27,91,63,55,104,27,91,109,27,91,114,27,91,50,74,27,91,72,0,27,91,114,27,91,109,27,91,50,74,27,91,72,27,91,63,55,104,27,91,63,49,59,51,59,52,59,54,108,27,91,52,108,27,62,27,91,63,49,48,48,48,108,27,91,63,50,53,104,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,79,119,0,27,79,121,0,27,79,117,0,27,79,113,0,27,79,115,0,96,96,97,97,102,102,103,103,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,40,66,27,41,48,0,27,91,56,126,0,27,79,77,0,27,91,49,126,0,27,91,51,36,0,27,91,52,126,0,27,91,56,36,0,27,91,55,36,0,27,91,50,36,0,27,91,100,0,27,91,54,36,0,27,91,53,36,0,27,91,99,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,50,51,36,0,27,91,50,52,36,0,27,91,49,49,94,0,27,91,49,50,94,0,27,91,49,51,94,0,27,91,49,52,94,0,27,91,49,53,94,0,27,91,49,55,94,0,27,91,49,56,94,0,27,91,49,57,94,0,27,91,50,48,94,0,27,91,50,49,94,0,27,91,50,51,94,0,27,91,50,52,94,0,27,91,50,53,94,0,27,91,50,54,94,0,27,91,50,56,94,0,27,91,50,57,94,0,27,91,51,49,94,0,27,91,51,50,94,0,27,91,51,51,94,0,27,91,51,52,94,0,27,91,50,51,64,0,27,91,50,52,64,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,49,59,50,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,49,48,52,7,0,27,93,52,59,37,112,49,37,100,59,114,103,98,58,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,27,92,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,27,40,66,0,27,40,48,0,0,2,0,0,0,25,0,52,0,-27,0,1,1,-1,-1,-1,-1,0,0,5,0,10,0,14,0,18,0,23,0,28,0,33,0,38,0,43,0,48,0,52,0,57,0,62,0,67,0,72,0,76,0,80,0,84,0,88,0,92,0,96,0,-1,-1,0,0,3,0,6,0,9,0,12,0,17,0,22,0,26,0,31,0,37,0,43,0,49,0,55,0,60,0,65,0,71,0,77,0,83,0,89,0,95,0,101,0,105,0,110,0,114,0,118,0,122,0,126,0,27,91,51,94,0,27,91,51,64,0,27,91,98,0,27,79,98,0,27,91,56,94,0,27,91,56,64,0,27,91,55,94,0,27,91,55,64,0,27,91,50,94,0,27,91,50,64,0,27,79,100,0,27,91,54,94,0,27,91,54,64,0,27,91,53,94,0,27,91,53,64,0,27,79,99,0,27,91,97,0,27,79,97,0,27,79,120,0,27,79,116,0,27,79,118,0,27,79,114,0,65,88,0,88,84,0,84,83,0,88,77,0,107,68,67,53,0,107,68,67,54,0,107,68,78,0,107,68,78,53,0,107,69,78,68,53,0,107,69,78,68,54,0,107,72,79,77,53,0,107,72,79,77,54,0,107,73,67,53,0,107,73,67,54,0,107,76,70,84,53,0,107,78,88,84,53,0,107,78,88,84,54,0,107,80,82,86,53,0,107,80,82,86,54,0,107,82,73,84,53,0,107,85,80,0,107,85,80,53,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,120,109,0 // NOLINT
+};
+
+// screen-256color|GNU Screen with 256 colors,
+// auto_right_margin,
+// backspaces_with_bs,
+// eat_newline_glitch,
+// has_hardware_tabs,
+// has_meta_key,
+// move_insert_mode,
+// move_standout_mode,
+// columns#80,
+// init_tabs#8,
+// lines#24,
+// max_colors#0x100,
+// max_pairs#0x10000,
+// acs_chars=++\054\054--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+// back_tab=\E[Z,
+// bell=^G,
+// carriage_return=\r,
+// change_scroll_region=\E[%i%p1%d;%p2%dr,
+// clear_all_tabs=\E[3g,
+// clear_screen=\E[H\E[J,
+// clr_bol=\E[1K,
+// clr_eol=\E[K,
+// clr_eos=\E[J,
+// column_address=\E[%i%p1%dG,
+// cursor_address=\E[%i%p1%d;%p2%dH,
+// cursor_down=\n,
+// cursor_home=\E[H,
+// cursor_invisible=\E[?25l,
+// cursor_left=^H,
+// cursor_normal=\E[34h\E[?25h,
+// cursor_right=\E[C,
+// cursor_up=\EM,
+// cursor_visible=\E[34l,
+// delete_character=\E[P,
+// delete_line=\E[M,
+// ena_acs=\E(B\E)0,
+// enter_alt_charset_mode=^N,
+// enter_blink_mode=\E[5m,
+// enter_bold_mode=\E[1m,
+// enter_ca_mode=\E[?1049h,
+// enter_dim_mode=\E[2m,
+// enter_insert_mode=\E[4h,
+// enter_reverse_mode=\E[7m,
+// enter_standout_mode=\E[3m,
+// enter_underline_mode=\E[4m,
+// exit_alt_charset_mode=^O,
+// exit_attribute_mode=\E[m^O,
+// exit_ca_mode=\E[?1049l,
+// exit_insert_mode=\E[4l,
+// exit_standout_mode=\E[23m,
+// exit_underline_mode=\E[24m,
+// flash_screen=\Eg,
+// init_2string=\E)0,
+// insert_line=\E[L,
+// key_backspace=^H,
+// key_btab=\E[Z,
+// key_dc=\E[3~,
+// key_down=\EOB,
+// key_end=\E[4~,
+// key_f1=\EOP,
+// key_f10=\E[21~,
+// key_f11=\E[23~,
+// key_f12=\E[24~,
+// key_f2=\EOQ,
+// key_f3=\EOR,
+// key_f4=\EOS,
+// key_f5=\E[15~,
+// key_f6=\E[17~,
+// key_f7=\E[18~,
+// key_f8=\E[19~,
+// key_f9=\E[20~,
+// key_home=\E[1~,
+// key_ic=\E[2~,
+// key_left=\EOD,
+// key_mouse=\E[M,
+// key_npage=\E[6~,
+// key_ppage=\E[5~,
+// key_right=\EOC,
+// key_up=\EOA,
+// keypad_local=\E[?1l\E>,
+// keypad_xmit=\E[?1h\E=,
+// newline=\EE,
+// orig_pair=\E[39;49m,
+// parm_dch=\E[%p1%dP,
+// parm_delete_line=\E[%p1%dM,
+// parm_down_cursor=\E[%p1%dB,
+// parm_ich=\E[%p1%d@,
+// parm_index=\E[%p1%dS,
+// parm_insert_line=\E[%p1%dL,
+// parm_left_cursor=\E[%p1%dD,
+// parm_right_cursor=\E[%p1%dC,
+// parm_up_cursor=\E[%p1%dA,
+// reset_2string=\Ec\E[?1000l\E[?25h,
+// restore_cursor=\E8,
+// row_address=\E[%i%p1%dd,
+// save_cursor=\E7,
+// scroll_forward=\n,
+// scroll_reverse=\EM,
+// set_a_background=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
+// set_a_foreground=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
+// set_attributes=\E[0%?%p6%t;1%;%?%p1%t;3%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;m%?%p9%t^N%e^O%;,
+// set_tab=\EH,
+// tab=^I,
+static const int8_t screen_256colour_terminfo[] = {
+ 30,2,43,0,43,0,15,0,105,1,4,3,115,99,114,101,101,110,45,50,53,54,99,111,108,111,114,124,71,78,85,32,83,99,114,101,101,110,32,119,105,116,104,32,50,53,54,32,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,37,0,41,0,45,0,-1,-1,56,0,73,0,75,0,79,0,86,0,-1,-1,88,0,100,0,-1,-1,104,0,107,0,113,0,117,0,-1,-1,-1,-1,121,0,123,0,-128,0,-123,0,-1,-1,-114,0,-109,0,-1,-1,-1,-1,-104,0,-99,0,-94,0,-1,-1,-89,0,-87,0,-82,0,-1,-1,-73,0,-68,0,-62,0,-56,0,-1,-1,-1,-1,-1,-1,-53,0,-1,-1,-1,-1,-1,-1,-49,0,-1,-1,-45,0,-1,-1,-1,-1,-1,-1,-43,0,-1,-1,-38,0,-1,-1,-1,-1,-1,-1,-1,-1,-34,0,-30,0,-24,0,-20,0,-16,0,-12,0,-6,0,0,1,6,1,12,1,18,1,23,1,-1,-1,28,1,-1,-1,32,1,37,1,42,1,-1,-1,-1,-1,-1,-1,46,1,50,1,58,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,66,1,-1,-1,69,1,78,1,87,1,96,1,105,1,114,1,123,1,-124,1,-1,-1,-115,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-106,1,-1,-1,-1,-1,-89,1,-86,1,-75,1,-72,1,-70,1,-67,1,17,2,-1,-1,20,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,22,2,-1,-1,87,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,91,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,98,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,103,2,109,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,115,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,120,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-127,2,-1,-1,-1,-1,-1,-1,-123,2,-60,2,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,51,52,104,27,91,63,50,53,104,0,27,91,67,0,27,77,0,27,91,51,52,108,0,27,91,80,0,27,91,77,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,50,109,0,27,91,52,104,0,27,91,55,109,0,27,91,51,109,0,27,91,52,109,0,15,0,27,91,109,15,0,27,91,63,49,48,52,57,108,0,27,91,52,108,0,27,91,50,51,109,0,27,91,50,52,109,0,27,103,0,27,41,48,0,27,91,76,0,8,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,69,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,99,27,91,63,49,48,48,48,108,27,91,63,50,53,104,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,49,37,116,59,51,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,43,43,44,44,45,45,46,46,48,48,96,96,97,97,102,102,103,103,104,104,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,40,66,27,41,48,0,27,91,52,126,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,75,0,27,91,51,57,59,52,57,109,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,3,0,1,0,33,0,70,0,-71,0,1,1,0,0,1,0,0,0,0,0,4,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,29,0,34,0,39,0,44,0,49,0,53,0,58,0,63,0,68,0,73,0,78,0,84,0,90,0,96,0,102,0,108,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-102,0,-98,0,-94,0,-90,0,-86,0,27,40,66,0,27,40,37,112,49,37,99,0,65,88,0,71,48,0,88,84,0,85,56,0,69,48,0,83,48,0,84,83,0,88,77,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,53,0,107,72,79,77,53,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,120,109,0 // NOLINT
+};
+
+// st-256color|stterm-256color|simpleterm with 256 colors,
+// auto_right_margin,
+// back_color_erase,
+// eat_newline_glitch,
+// has_status_line,
+// move_insert_mode,
+// move_standout_mode,
+// no_pad_char,
+// columns#80,
+// init_tabs#8,
+// lines#24,
+// max_colors#0x100,
+// max_pairs#0x10000,
+// acs_chars=+C\054D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+// back_tab=\E[Z,
+// bell=^G,
+// carriage_return=\r,
+// change_scroll_region=\E[%i%p1%d;%p2%dr,
+// clear_all_tabs=\E[3g,
+// clear_screen=\E[H\E[2J,
+// clr_bol=\E[1K,
+// clr_eol=\E[K,
+// clr_eos=\E[J,
+// column_address=\E[%i%p1%dG,
+// cursor_address=\E[%i%p1%d;%p2%dH,
+// cursor_down=\n,
+// cursor_home=\E[H,
+// cursor_invisible=\E[?25l,
+// cursor_left=^H,
+// cursor_normal=\E[?12l\E[?25h,
+// cursor_right=\E[C,
+// cursor_up=\E[A,
+// cursor_visible=\E[?25h,
+// delete_character=\E[P,
+// delete_line=\E[M,
+// dis_status_line=\E]0;^G,
+// ena_acs=\E)0,
+// enter_alt_charset_mode=\E(0,
+// enter_blink_mode=\E[5m,
+// enter_bold_mode=\E[1m,
+// enter_ca_mode=\E[?1049h,
+// enter_dim_mode=\E[2m,
+// enter_insert_mode=\E[4h,
+// enter_italics_mode=\E[3m,
+// enter_reverse_mode=\E[7m,
+// enter_secure_mode=\E[8m,
+// enter_standout_mode=\E[7m,
+// enter_underline_mode=\E[4m,
+// erase_chars=\E[%p1%dX,
+// exit_alt_charset_mode=\E(B,
+// exit_attribute_mode=\E[0m,
+// exit_ca_mode=\E[?1049l,
+// exit_insert_mode=\E[4l,
+// exit_italics_mode=\E[23m,
+// exit_standout_mode=\E[27m,
+// exit_underline_mode=\E[24m,
+// flash_screen=\E[?5h$<100/>\E[?5l,
+// from_status_line=^G,
+// init_2string=\E[4l\E>\E[?1034l,
+// initialize_color@,
+// insert_line=\E[L,
+// key_a1=\E[1~,
+// key_a3=\E[5~,
+// key_b2=\EOu,
+// key_backspace=\177,
+// key_c1=\E[4~,
+// key_c3=\E[6~,
+// key_clear=\E[3;5~,
+// key_dc=\E[3~,
+// key_dl=\E[3;2~,
+// key_down=\EOB,
+// key_eic=\E[2;2~,
+// key_end=\E[4~,
+// key_eol=\E[1;2F,
+// key_eos=\E[1;5F,
+// key_f1=\EOP,
+// key_f10=\E[21~,
+// key_f11=\E[23~,
+// key_f12=\E[24~,
+// key_f13=\E[1;2P,
+// key_f14=\E[1;2Q,
+// key_f15=\E[1;2R,
+// key_f16=\E[1;2S,
+// key_f17=\E[15;2~,
+// key_f18=\E[17;2~,
+// key_f19=\E[18;2~,
+// key_f2=\EOQ,
+// key_f20=\E[19;2~,
+// key_f21=\E[20;2~,
+// key_f22=\E[21;2~,
+// key_f23=\E[23;2~,
+// key_f24=\E[24;2~,
+// key_f25=\E[1;5P,
+// key_f26=\E[1;5Q,
+// key_f27=\E[1;5R,
+// key_f28=\E[1;5S,
+// key_f29=\E[15;5~,
+// key_f3=\EOR,
+// key_f30=\E[17;5~,
+// key_f31=\E[18;5~,
+// key_f32=\E[19;5~,
+// key_f33=\E[20;5~,
+// key_f34=\E[21;5~,
+// key_f35=\E[23;5~,
+// key_f36=\E[24;5~,
+// key_f37=\E[1;6P,
+// key_f38=\E[1;6Q,
+// key_f39=\E[1;6R,
+// key_f4=\EOS,
+// key_f40=\E[1;6S,
+// key_f41=\E[15;6~,
+// key_f42=\E[17;6~,
+// key_f43=\E[18;6~,
+// key_f44=\E[19;6~,
+// key_f45=\E[20;6~,
+// key_f46=\E[21;6~,
+// key_f47=\E[23;6~,
+// key_f48=\E[24;6~,
+// key_f49=\E[1;3P,
+// key_f5=\E[15~,
+// key_f50=\E[1;3Q,
+// key_f51=\E[1;3R,
+// key_f52=\E[1;3S,
+// key_f53=\E[15;3~,
+// key_f54=\E[17;3~,
+// key_f55=\E[18;3~,
+// key_f56=\E[19;3~,
+// key_f57=\E[20;3~,
+// key_f58=\E[21;3~,
+// key_f59=\E[23;3~,
+// key_f6=\E[17~,
+// key_f60=\E[24;3~,
+// key_f61=\E[1;4P,
+// key_f62=\E[1;4Q,
+// key_f63=\E[1;4R,
+// key_f7=\E[18~,
+// key_f8=\E[19~,
+// key_f9=\E[20~,
+// key_home=\E[1~,
+// key_ic=\E[2~,
+// key_il=\E[2;5~,
+// key_left=\EOD,
+// key_mouse=\E[M,
+// key_npage=\E[6~,
+// key_ppage=\E[5~,
+// key_right=\EOC,
+// key_sdc=\E[3;2~,
+// key_send=\E[1;2F,
+// key_sf=\E[1;2B,
+// key_shome=\E[1;2H,
+// key_sic=\E[2;2~,
+// key_sleft=\E[1;2D,
+// key_snext=\E[6;2~,
+// key_sprevious=\E[5;2~,
+// key_sr=\E[1;2A,
+// key_sright=\E[1;2C,
+// key_up=\EOA,
+// keypad_local=\E[?1l\E>,
+// keypad_xmit=\E[?1h\E=,
+// orig_colors@,
+// orig_pair=\E[39;49m,
+// parm_dch=\E[%p1%dP,
+// parm_delete_line=\E[%p1%dM,
+// parm_down_cursor=\E[%p1%dB,
+// parm_ich=\E[%p1%d@,
+// parm_index=\E[%p1%dS,
+// parm_insert_line=\E[%p1%dL,
+// parm_left_cursor=\E[%p1%dD,
+// parm_right_cursor=\E[%p1%dC,
+// parm_up_cursor=\E[%p1%dA,
+// print_screen=\E[i,
+// prtr_off=\E[4i,
+// prtr_on=\E[5i,
+// reset_1string=\Ec,
+// reset_2string=\E[4l\E>\E[?1034l,
+// restore_cursor=\E8,
+// row_address=\E[%i%p1%dd,
+// save_cursor=\E7,
+// scroll_forward=\n,
+// scroll_reverse=\EM,
+// set_a_background=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
+// set_a_foreground=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
+// set_attributes=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p7%t;8%;m,
+// set_tab=\EH,
+// tab=^I,
+// to_status_line=\E]0;,
+// user6=\E[%i%d;%dR,
+// user7=\E[6n,
+// user8=\E[?1;2c,
+// user9=\E[c,
+static const int8_t st_256colour_terminfo[] = {
+ 30,2,55,0,29,0,15,0,105,1,-125,5,115,116,45,50,53,54,99,111,108,111,114,124,115,116,116,101,114,109,45,50,53,54,99,111,108,111,114,124,115,105,109,112,108,101,116,101,114,109,32,119,105,116,104,32,50,53,54,32,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,38,0,42,0,46,0,-1,-1,57,0,74,0,76,0,80,0,87,0,-1,-1,89,0,102,0,-1,-1,106,0,110,0,117,0,121,0,125,0,-1,-1,-125,0,-121,0,-116,0,-111,0,-1,-1,-102,0,-97,0,-92,0,-1,-1,-87,0,-82,0,-77,0,-72,0,-63,0,-59,0,-54,0,-1,-1,-45,0,-40,0,-34,0,-28,0,-1,-1,-10,0,-1,-1,-8,0,-1,-1,-1,-1,-1,-1,7,1,-1,-1,11,1,-1,-1,13,1,-1,-1,20,1,25,1,32,1,36,1,43,1,50,1,-1,-1,57,1,61,1,67,1,71,1,75,1,79,1,85,1,91,1,97,1,103,1,109,1,114,1,119,1,126,1,-1,-1,-126,1,-121,1,-116,1,-112,1,-105,1,-1,-1,-98,1,-94,1,-86,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-78,1,-69,1,-60,1,-51,1,-42,1,-33,1,-24,1,-15,1,-1,-1,-6,1,-1,-1,-1,-1,-1,-1,3,2,7,2,12,2,-1,-1,17,2,20,2,-1,-1,-1,-1,35,2,38,2,49,2,52,2,54,2,57,2,-106,2,-1,-1,-103,2,-101,2,-1,-1,-1,-1,-1,-1,-96,2,-91,2,-86,2,-82,2,-77,2,-1,-1,-1,-1,-72,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-7,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-3,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,3,-1,-1,-1,-1,9,3,-1,-1,-1,-1,-1,-1,-1,-1,16,3,23,3,30,3,-1,-1,-1,-1,37,3,-1,-1,44,3,-1,-1,-1,-1,-1,-1,51,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,58,3,64,3,70,3,77,3,84,3,91,3,98,3,106,3,114,3,122,3,-126,3,-118,3,-110,3,-102,3,-94,3,-87,3,-80,3,-73,3,-66,3,-58,3,-50,3,-42,3,-34,3,-26,3,-18,3,-10,3,-2,3,5,4,12,4,19,4,26,4,34,4,42,4,50,4,58,4,66,4,74,4,82,4,90,4,97,4,104,4,111,4,118,4,126,4,-122,4,-114,4,-106,4,-98,4,-90,4,-82,4,-74,4,-67,4,-60,4,-53,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-48,4,-37,4,-32,4,-24,4,-20,4,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-11,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-6,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,5,-1,-1,-1,-1,-1,-1,4,5,67,5,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,49,50,108,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,63,50,53,104,0,27,91,80,0,27,91,77,0,27,93,48,59,7,0,27,40,48,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,50,109,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,40,66,0,27,91,48,109,0,27,91,63,49,48,52,57,108,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,7,0,27,91,52,108,27,62,27,91,63,49,48,51,52,108,0,27,91,76,0,127,0,27,91,51,59,53,126,0,27,91,51,126,0,27,91,51,59,50,126,0,27,79,66,0,27,91,50,59,50,126,0,27,91,49,59,50,70,0,27,91,49,59,53,70,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,50,59,53,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,91,105,0,27,91,52,105,0,27,91,53,105,0,27,99,0,27,91,52,108,27,62,27,91,63,49,48,51,52,108,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,37,63,37,112,57,37,116,27,40,48,37,101,27,40,66,37,59,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,55,37,116,59,56,37,59,109,0,27,72,0,9,0,27,93,48,59,0,27,91,49,126,0,27,91,53,126,0,27,79,117,0,27,91,52,126,0,27,91,54,126,0,43,67,44,68,45,65,46,66,48,69,96,96,97,97,102,102,103,103,104,70,105,71,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,41,48,0,27,91,52,126,0,27,91,51,59,50,126,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,59,53,80,0,27,91,49,59,53,81,0,27,91,49,59,53,82,0,27,91,49,59,53,83,0,27,91,49,53,59,53,126,0,27,91,49,55,59,53,126,0,27,91,49,56,59,53,126,0,27,91,49,57,59,53,126,0,27,91,50,48,59,53,126,0,27,91,50,49,59,53,126,0,27,91,50,51,59,53,126,0,27,91,50,52,59,53,126,0,27,91,49,59,54,80,0,27,91,49,59,54,81,0,27,91,49,59,54,82,0,27,91,49,59,54,83,0,27,91,49,53,59,54,126,0,27,91,49,55,59,54,126,0,27,91,49,56,59,54,126,0,27,91,49,57,59,54,126,0,27,91,50,48,59,54,126,0,27,91,50,49,59,54,126,0,27,91,50,51,59,54,126,0,27,91,50,52,59,54,126,0,27,91,49,59,51,80,0,27,91,49,59,51,81,0,27,91,49,59,51,82,0,27,91,49,59,51,83,0,27,91,49,53,59,51,126,0,27,91,49,55,59,51,126,0,27,91,49,56,59,51,126,0,27,91,49,57,59,51,126,0,27,91,50,48,59,51,126,0,27,91,50,49,59,51,126,0,27,91,50,51,59,51,126,0,27,91,50,52,59,51,126,0,27,91,49,59,52,80,0,27,91,49,59,52,81,0,27,91,49,59,52,82,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,49,59,50,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,91,51,109,0,27,91,50,51,109,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,0,3,0,1,0,71,0,-110,0,-1,1,0,0,1,0,-1,-1,-1,-1,-1,-1,-1,-1,0,0,-1,-1,18,0,24,0,34,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,39,0,-1,-1,46,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,53,0,-1,-1,60,0,-1,-1,-1,-1,67,0,-1,-1,74,0,-1,-1,-1,-1,81,0,-1,-1,88,0,-1,-1,-1,-1,95,0,-1,-1,102,0,-1,-1,-1,-1,-1,-1,109,0,-1,-1,116,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,123,0,-127,0,-1,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,33,0,36,0,42,0,48,0,53,0,58,0,63,0,68,0,73,0,77,0,82,0,87,0,92,0,97,0,102,0,108,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-100,0,-94,0,-88,0,-82,0,-77,0,-72,0,-67,0,-62,0,-57,0,-51,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,27,1,33,1,39,1,45,1,51,1,57,1,63,1,67,1,72,1,77,1,82,1,87,1,92,1,96,1,100,1,104,1,108,1,113,1,118,1,27,93,53,50,59,37,112,49,37,115,59,37,112,50,37,115,7,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,93,48,59,0,27,91,49,59,51,66,0,27,91,49,59,53,66,0,27,91,49,59,51,68,0,27,91,49,59,53,68,0,27,91,54,59,51,126,0,27,91,54,59,53,126,0,27,91,53,59,51,126,0,27,91,53,59,53,126,0,27,91,49,59,51,67,0,27,91,49,59,53,67,0,27,91,49,59,51,65,0,27,91,49,59,53,65,0,27,91,50,57,109,0,27,91,57,109,0,65,88,0,71,48,0,88,84,0,85,56,0,69,48,0,69,51,0,77,115,0,83,48,0,83,101,0,83,115,0,84,83,0,88,77,0,103,114,98,111,109,0,103,115,98,111,109,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,114,109,120,120,0,115,109,120,120,0,120,109,0 // NOLINT
+};
+
+// tmux-256color|tmux with 256 colors,
+// auto_right_margin,
+// backspaces_with_bs,
+// eat_newline_glitch,
+// has_hardware_tabs,
+// has_meta_key,
+// has_status_line,
+// move_insert_mode,
+// move_standout_mode,
+// columns#80,
+// init_tabs#8,
+// lines#24,
+// max_colors#0x100,
+// max_pairs#0x10000,
+// acs_chars=++\054\054--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+// back_tab=\E[Z,
+// bell=^G,
+// carriage_return=\r,
+// change_scroll_region=\E[%i%p1%d;%p2%dr,
+// clear_all_tabs=\E[3g,
+// clear_screen=\E[H\E[J,
+// clr_bol=\E[1K,
+// clr_eol=\E[K,
+// clr_eos=\E[J,
+// column_address=\E[%i%p1%dG,
+// cursor_address=\E[%i%p1%d;%p2%dH,
+// cursor_down=\n,
+// cursor_home=\E[H,
+// cursor_invisible=\E[?25l,
+// cursor_left=^H,
+// cursor_normal=\E[34h\E[?25h,
+// cursor_right=\E[C,
+// cursor_up=\EM,
+// cursor_visible=\E[34l,
+// delete_character=\E[P,
+// delete_line=\E[M,
+// dis_status_line=\E]0;^G,
+// ena_acs=\E(B\E)0,
+// enter_alt_charset_mode=^N,
+// enter_blink_mode=\E[5m,
+// enter_bold_mode=\E[1m,
+// enter_ca_mode=\E[?1049h,
+// enter_dim_mode=\E[2m,
+// enter_insert_mode=\E[4h,
+// enter_italics_mode=\E[3m,
+// enter_reverse_mode=\E[7m,
+// enter_secure_mode=\E[8m,
+// enter_standout_mode=\E[7m,
+// enter_underline_mode=\E[4m,
+// exit_alt_charset_mode=^O,
+// exit_attribute_mode=\E[m^O,
+// exit_ca_mode=\E[?1049l,
+// exit_insert_mode=\E[4l,
+// exit_italics_mode=\E[23m,
+// exit_standout_mode=\E[27m,
+// exit_underline_mode=\E[24m,
+// flash_screen=\Eg,
+// from_status_line=^G,
+// init_2string=\E)0,
+// insert_line=\E[L,
+// key_backspace=^H,
+// key_btab=\E[Z,
+// key_dc=\E[3~,
+// key_down=\EOB,
+// key_end=\E[4~,
+// key_f1=\EOP,
+// key_f10=\E[21~,
+// key_f11=\E[23~,
+// key_f12=\E[24~,
+// key_f13=\E[1;2P,
+// key_f14=\E[1;2Q,
+// key_f15=\E[1;2R,
+// key_f16=\E[1;2S,
+// key_f17=\E[15;2~,
+// key_f18=\E[17;2~,
+// key_f19=\E[18;2~,
+// key_f2=\EOQ,
+// key_f20=\E[19;2~,
+// key_f21=\E[20;2~,
+// key_f22=\E[21;2~,
+// key_f23=\E[23;2~,
+// key_f24=\E[24;2~,
+// key_f25=\E[1;5P,
+// key_f26=\E[1;5Q,
+// key_f27=\E[1;5R,
+// key_f28=\E[1;5S,
+// key_f29=\E[15;5~,
+// key_f3=\EOR,
+// key_f30=\E[17;5~,
+// key_f31=\E[18;5~,
+// key_f32=\E[19;5~,
+// key_f33=\E[20;5~,
+// key_f34=\E[21;5~,
+// key_f35=\E[23;5~,
+// key_f36=\E[24;5~,
+// key_f37=\E[1;6P,
+// key_f38=\E[1;6Q,
+// key_f39=\E[1;6R,
+// key_f4=\EOS,
+// key_f40=\E[1;6S,
+// key_f41=\E[15;6~,
+// key_f42=\E[17;6~,
+// key_f43=\E[18;6~,
+// key_f44=\E[19;6~,
+// key_f45=\E[20;6~,
+// key_f46=\E[21;6~,
+// key_f47=\E[23;6~,
+// key_f48=\E[24;6~,
+// key_f49=\E[1;3P,
+// key_f5=\E[15~,
+// key_f50=\E[1;3Q,
+// key_f51=\E[1;3R,
+// key_f52=\E[1;3S,
+// key_f53=\E[15;3~,
+// key_f54=\E[17;3~,
+// key_f55=\E[18;3~,
+// key_f56=\E[19;3~,
+// key_f57=\E[20;3~,
+// key_f58=\E[21;3~,
+// key_f59=\E[23;3~,
+// key_f6=\E[17~,
+// key_f60=\E[24;3~,
+// key_f61=\E[1;4P,
+// key_f62=\E[1;4Q,
+// key_f63=\E[1;4R,
+// key_f7=\E[18~,
+// key_f8=\E[19~,
+// key_f9=\E[20~,
+// key_home=\E[1~,
+// key_ic=\E[2~,
+// key_left=\EOD,
+// key_mouse=\E[M,
+// key_npage=\E[6~,
+// key_ppage=\E[5~,
+// key_right=\EOC,
+// key_sdc=\E[3;2~,
+// key_send=\E[1;2F,
+// key_sf=\E[1;2B,
+// key_shome=\E[1;2H,
+// key_sic=\E[2;2~,
+// key_sleft=\E[1;2D,
+// key_snext=\E[6;2~,
+// key_sprevious=\E[5;2~,
+// key_sr=\E[1;2A,
+// key_sright=\E[1;2C,
+// key_up=\EOA,
+// keypad_local=\E[?1l\E>,
+// keypad_xmit=\E[?1h\E=,
+// newline=\EE,
+// orig_pair=\E[39;49m,
+// parm_dch=\E[%p1%dP,
+// parm_delete_line=\E[%p1%dM,
+// parm_down_cursor=\E[%p1%dB,
+// parm_ich=\E[%p1%d@,
+// parm_index=\E[%p1%dS,
+// parm_insert_line=\E[%p1%dL,
+// parm_left_cursor=\E[%p1%dD,
+// parm_right_cursor=\E[%p1%dC,
+// parm_up_cursor=\E[%p1%dA,
+// reset_2string=\Ec\E[?1000l\E[?25h,
+// restore_cursor=\E8,
+// row_address=\E[%i%p1%dd,
+// save_cursor=\E7,
+// scroll_forward=\n,
+// scroll_reverse=\EM,
+// set_a_background=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
+// set_a_foreground=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
+// set_attributes=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p7%t;8%;m%?%p9%t^N%e^O%;,
+// set_tab=\EH,
+// tab=^I,
+// to_status_line=\E]0;,
+static const int8_t tmux_256colour_terminfo[] = {
+ 30,2,35,0,43,0,15,0,105,1,-15,4,116,109,117,120,45,50,53,54,99,111,108,111,114,124,116,109,117,120,32,119,105,116,104,32,50,53,54,32,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,37,0,41,0,45,0,-1,-1,56,0,73,0,75,0,79,0,86,0,-1,-1,88,0,100,0,-1,-1,104,0,107,0,113,0,117,0,121,0,-1,-1,127,0,-127,0,-122,0,-117,0,-1,-1,-108,0,-103,0,-98,0,-1,-1,-93,0,-88,0,-83,0,-1,-1,-78,0,-76,0,-71,0,-1,-1,-62,0,-57,0,-51,0,-45,0,-1,-1,-42,0,-1,-1,-40,0,-1,-1,-1,-1,-1,-1,-36,0,-1,-1,-32,0,-1,-1,-1,-1,-1,-1,-30,0,-1,-1,-25,0,-1,-1,-1,-1,-1,-1,-1,-1,-21,0,-17,0,-11,0,-7,0,-3,0,1,1,7,1,13,1,19,1,25,1,31,1,36,1,-1,-1,41,1,-1,-1,45,1,50,1,55,1,59,1,66,1,-1,-1,73,1,77,1,85,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,93,1,-1,-1,96,1,105,1,114,1,123,1,-124,1,-115,1,-106,1,-97,1,-1,-1,-88,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-79,1,-1,-1,-1,-1,-62,1,-59,1,-48,1,-45,1,-43,1,-40,1,49,2,-1,-1,52,2,54,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,59,2,-1,-1,124,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-128,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-121,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-116,2,-1,-1,-1,-1,-109,2,-1,-1,-1,-1,-1,-1,-1,-1,-102,2,-95,2,-88,2,-1,-1,-1,-1,-81,2,-1,-1,-74,2,-1,-1,-1,-1,-1,-1,-67,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-60,2,-54,2,-48,2,-41,2,-34,2,-27,2,-20,2,-12,2,-4,2,4,3,12,3,20,3,28,3,36,3,44,3,51,3,58,3,65,3,72,3,80,3,88,3,96,3,104,3,112,3,120,3,-128,3,-120,3,-113,3,-106,3,-99,3,-92,3,-84,3,-76,3,-68,3,-60,3,-52,3,-44,3,-36,3,-28,3,-21,3,-14,3,-7,3,0,4,8,4,16,4,24,4,32,4,40,4,48,4,56,4,64,4,71,4,78,4,85,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,90,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,99,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,104,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,110,4,-1,-1,-1,-1,-1,-1,114,4,-79,4,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,51,52,104,27,91,63,50,53,104,0,27,91,67,0,27,77,0,27,91,51,52,108,0,27,91,80,0,27,91,77,0,27,93,48,59,7,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,50,109,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,15,0,27,91,109,15,0,27,91,63,49,48,52,57,108,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,103,0,7,0,27,41,48,0,27,91,76,0,8,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,69,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,99,27,91,63,49,48,48,48,108,27,91,63,50,53,104,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,55,37,116,59,56,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,93,48,59,0,43,43,44,44,45,45,46,46,48,48,96,96,97,97,102,102,103,103,104,104,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,40,66,27,41,48,0,27,91,52,126,0,27,91,51,59,50,126,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,59,53,80,0,27,91,49,59,53,81,0,27,91,49,59,53,82,0,27,91,49,59,53,83,0,27,91,49,53,59,53,126,0,27,91,49,55,59,53,126,0,27,91,49,56,59,53,126,0,27,91,49,57,59,53,126,0,27,91,50,48,59,53,126,0,27,91,50,49,59,53,126,0,27,91,50,51,59,53,126,0,27,91,50,52,59,53,126,0,27,91,49,59,54,80,0,27,91,49,59,54,81,0,27,91,49,59,54,82,0,27,91,49,59,54,83,0,27,91,49,53,59,54,126,0,27,91,49,55,59,54,126,0,27,91,49,56,59,54,126,0,27,91,49,57,59,54,126,0,27,91,50,48,59,54,126,0,27,91,50,49,59,54,126,0,27,91,50,51,59,54,126,0,27,91,50,52,59,54,126,0,27,91,49,59,51,80,0,27,91,49,59,51,81,0,27,91,49,59,51,82,0,27,91,49,59,51,83,0,27,91,49,53,59,51,126,0,27,91,49,55,59,51,126,0,27,91,49,56,59,51,126,0,27,91,49,57,59,51,126,0,27,91,50,48,59,51,126,0,27,91,50,49,59,51,126,0,27,91,50,51,59,51,126,0,27,91,50,52,59,51,126,0,27,91,49,59,52,80,0,27,91,49,59,52,81,0,27,91,49,59,52,82,0,27,91,49,75,0,27,91,51,57,59,52,57,109,0,27,91,51,109,0,27,91,50,51,109,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,0,3,0,1,0,73,0,-106,0,65,3,1,1,0,0,1,0,0,0,0,0,7,0,19,0,23,0,28,0,46,0,54,0,60,0,70,0,-1,-1,-1,-1,-1,-1,75,0,82,0,89,0,96,0,103,0,110,0,117,0,124,0,-125,0,-118,0,-111,0,-104,0,-97,0,-90,0,-83,0,-76,0,-1,-1,-69,0,-62,0,-55,0,-48,0,-41,0,-1,-1,-34,0,-27,0,-20,0,-13,0,-6,0,1,1,8,1,15,1,22,1,29,1,36,1,43,1,50,1,57,1,64,1,71,1,78,1,85,1,92,1,99,1,106,1,113,1,120,1,127,1,-122,1,-115,1,-108,1,-101,1,-94,1,-87,1,-80,1,-1,-1,-1,-1,-1,-1,-1,-1,-73,1,-67,1,-1,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,33,0,36,0,39,0,42,0,48,0,54,0,59,0,64,0,69,0,74,0,79,0,83,0,88,0,93,0,98,0,103,0,108,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-100,0,-94,0,-88,0,-82,0,-76,0,-71,0,-66,0,-61,0,-56,0,-51,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,27,1,33,1,39,1,45,1,51,1,57,1,63,1,69,1,73,1,78,1,83,1,88,1,93,1,98,1,102,1,106,1,110,1,114,1,119,1,124,1,27,93,49,49,50,7,0,27,93,49,50,59,37,112,49,37,115,7,0,27,40,66,0,27,91,51,74,0,27,93,53,50,59,37,112,49,37,115,59,37,112,50,37,115,7,0,27,40,37,112,49,37,99,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,93,48,59,0,27,91,51,59,51,126,0,27,91,51,59,52,126,0,27,91,51,59,53,126,0,27,91,51,59,54,126,0,27,91,51,59,55,126,0,27,91,49,59,50,66,0,27,91,49,59,51,66,0,27,91,49,59,52,66,0,27,91,49,59,53,66,0,27,91,49,59,54,66,0,27,91,49,59,55,66,0,27,91,49,59,51,70,0,27,91,49,59,52,70,0,27,91,49,59,53,70,0,27,91,49,59,54,70,0,27,91,49,59,55,70,0,27,91,49,59,51,72,0,27,91,49,59,52,72,0,27,91,49,59,53,72,0,27,91,49,59,54,72,0,27,91,49,59,55,72,0,27,91,50,59,51,126,0,27,91,50,59,52,126,0,27,91,50,59,53,126,0,27,91,50,59,54,126,0,27,91,50,59,55,126,0,27,91,49,59,51,68,0,27,91,49,59,52,68,0,27,91,49,59,53,68,0,27,91,49,59,54,68,0,27,91,49,59,55,68,0,27,91,54,59,51,126,0,27,91,54,59,52,126,0,27,91,54,59,53,126,0,27,91,54,59,54,126,0,27,91,54,59,55,126,0,27,91,53,59,51,126,0,27,91,53,59,52,126,0,27,91,53,59,53,126,0,27,91,53,59,54,126,0,27,91,53,59,55,126,0,27,91,49,59,51,67,0,27,91,49,59,52,67,0,27,91,49,59,53,67,0,27,91,49,59,54,67,0,27,91,49,59,55,67,0,27,91,49,59,50,65,0,27,91,49,59,51,65,0,27,91,49,59,52,65,0,27,91,49,59,53,65,0,27,91,49,59,54,65,0,27,91,49,59,55,65,0,27,91,50,57,109,0,27,91,57,109,0,65,88,0,71,48,0,88,84,0,85,56,0,67,114,0,67,115,0,69,48,0,69,51,0,77,115,0,83,48,0,83,101,0,83,115,0,84,83,0,88,77,0,103,114,98,111,109,0,103,115,98,111,109,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,114,109,120,120,0,115,109,120,120,0,120,109,0 // NOLINT
+};
+
+// vte-256color|VTE with xterm 256-colors,
+// auto_right_margin,
+// back_color_erase,
+// backspaces_with_bs,
+// can_change,
+// eat_newline_glitch,
+// move_insert_mode,
+// move_standout_mode,
+// columns#80,
+// init_tabs#8,
+// lines#24,
+// max_colors#0x100,
+// max_pairs#0x10000,
+// acs_chars=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+// back_tab=\E[Z,
+// bell=^G,
+// carriage_return=\r,
+// change_scroll_region=\E[%i%p1%d;%p2%dr,
+// clear_all_tabs=\E[3g,
+// clear_screen=\E[H\E[2J,
+// clr_bol=\E[1K,
+// clr_eol=\E[K,
+// clr_eos=\E[J,
+// column_address=\E[%i%p1%dG,
+// cursor_address=\E[%i%p1%d;%p2%dH,
+// cursor_down=\n,
+// cursor_home=\E[H,
+// cursor_invisible=\E[?25l,
+// cursor_left=^H,
+// cursor_normal=\E[?25h,
+// cursor_right=\E[C,
+// cursor_up=\E[A,
+// delete_character=\E[P,
+// delete_line=\E[M,
+// ena_acs=\E)0,
+// enter_alt_charset_mode=^N,
+// enter_am_mode=\E[?7h,
+// enter_bold_mode=\E[1m,
+// enter_ca_mode=\E7\E[?47h,
+// enter_dim_mode=\E[2m,
+// enter_insert_mode=\E[4h,
+// enter_italics_mode=\E[3m,
+// enter_reverse_mode=\E[7m,
+// enter_secure_mode=\E[8m,
+// enter_standout_mode=\E[7m,
+// enter_underline_mode=\E[4m,
+// erase_chars=\E[%p1%dX,
+// exit_alt_charset_mode=^O,
+// exit_am_mode=\E[?7l,
+// exit_attribute_mode=\E[0m^O,
+// exit_ca_mode=\E[2J\E[?47l\E8,
+// exit_insert_mode=\E[4l,
+// exit_italics_mode=\E[23m,
+// exit_standout_mode=\E[27m,
+// exit_underline_mode=\E[24m,
+// flash_screen=\E[?5h$<100/>\E[?5l,
+// init_2string=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8,
+// initialize_color=\E]4;%p1%d;rgb\072%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\,
+// insert_line=\E[L,
+// key_b2=\E[E,
+// key_backspace=\177,
+// key_btab=\E[Z,
+// key_dc=\E[3~,
+// key_down=\EOB,
+// key_end=\EOF,
+// key_enter=\EOM,
+// key_f1=\EOP,
+// key_f10=\E[21~,
+// key_f11=\E[23~,
+// key_f12=\E[24~,
+// key_f13=\E[1;2P,
+// key_f14=\E[1;2Q,
+// key_f15=\E[1;2R,
+// key_f16=\E[1;2S,
+// key_f17=\E[15;2~,
+// key_f18=\E[17;2~,
+// key_f19=\E[18;2~,
+// key_f2=\EOQ,
+// key_f20=\E[19;2~,
+// key_f21=\E[20;2~,
+// key_f22=\E[21;2~,
+// key_f23=\E[23;2~,
+// key_f24=\E[24;2~,
+// key_f25=\E[1;5P,
+// key_f26=\E[1;5Q,
+// key_f27=\E[1;5R,
+// key_f28=\E[1;5S,
+// key_f29=\E[15;5~,
+// key_f3=\EOR,
+// key_f30=\E[17;5~,
+// key_f31=\E[18;5~,
+// key_f32=\E[19;5~,
+// key_f33=\E[20;5~,
+// key_f34=\E[21;5~,
+// key_f35=\E[23;5~,
+// key_f36=\E[24;5~,
+// key_f37=\E[1;6P,
+// key_f38=\E[1;6Q,
+// key_f39=\E[1;6R,
+// key_f4=\EOS,
+// key_f40=\E[1;6S,
+// key_f41=\E[15;6~,
+// key_f42=\E[17;6~,
+// key_f43=\E[18;6~,
+// key_f44=\E[19;6~,
+// key_f45=\E[20;6~,
+// key_f46=\E[21;6~,
+// key_f47=\E[23;6~,
+// key_f48=\E[24;6~,
+// key_f49=\E[1;3P,
+// key_f5=\E[15~,
+// key_f50=\E[1;3Q,
+// key_f51=\E[1;3R,
+// key_f52=\E[1;3S,
+// key_f53=\E[15;3~,
+// key_f54=\E[17;3~,
+// key_f55=\E[18;3~,
+// key_f56=\E[19;3~,
+// key_f57=\E[20;3~,
+// key_f58=\E[21;3~,
+// key_f59=\E[23;3~,
+// key_f6=\E[17~,
+// key_f60=\E[24;3~,
+// key_f61=\E[1;4P,
+// key_f62=\E[1;4Q,
+// key_f63=\E[1;4R,
+// key_f7=\E[18~,
+// key_f8=\E[19~,
+// key_f9=\E[20~,
+// key_find=\E[1~,
+// key_home=\EOH,
+// key_ic=\E[2~,
+// key_left=\EOD,
+// key_mouse=\E[<,
+// key_npage=\E[6~,
+// key_ppage=\E[5~,
+// key_right=\EOC,
+// key_sdc=\E[3;2~,
+// key_select=\E[4~,
+// key_send=\E[1;2F,
+// key_sf=\E[1;2B,
+// key_shome=\E[1;2H,
+// key_sic=\E[2;2~,
+// key_sleft=\E[1;2D,
+// key_snext=\E[6;2~,
+// key_sprevious=\E[5;2~,
+// key_sr=\E[1;2A,
+// key_sright=\E[1;2C,
+// key_up=\EOA,
+// keypad_local=\E[?1l\E>,
+// keypad_xmit=\E[?1h\E=,
+// memory_lock=\El,
+// memory_unlock=\Em,
+// orig_colors=\E]104^G,
+// orig_pair=\E[39;49m,
+// parm_dch=\E[%p1%dP,
+// parm_delete_line=\E[%p1%dM,
+// parm_down_cursor=\E[%p1%dB,
+// parm_ich=\E[%p1%d@,
+// parm_index=\E[%p1%dS,
+// parm_insert_line=\E[%p1%dL,
+// parm_left_cursor=\E[%p1%dD,
+// parm_right_cursor=\E[%p1%dC,
+// parm_rindex=\E[%p1%dT,
+// parm_up_cursor=\E[%p1%dA,
+// reset_1string=\Ec,
+// reset_2string=\E7\E[r\E8\E[m\E[?7h\E[\041p\E[?1;3;4;6l\E[4l\E>\E[?1000l\E[?25h,
+// restore_cursor=\E8,
+// row_address=\E[%i%p1%dd,
+// save_cursor=\E7,
+// scroll_forward=\n,
+// scroll_reverse=\EM,
+// set_a_background=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
+// set_a_foreground=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
+// set_attributes=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p5%t;2%;%?%p7%t;8%;%?%p1%p3%|%t;7%;m%?%p9%t^N%e^O%;,
+// set_tab=\EH,
+// tab=^I,
+// user6=\E[%i%d;%dR,
+// user7=\E[6n,
+// user8=\E[?%[;0123456789]c,
+// user9=\E[c,
+static const int8_t vte_256colour_terminfo[] = {
+ 30,2,39,0,38,0,15,0,-99,1,-49,5,118,116,101,45,50,53,54,99,111,108,111,114,124,86,84,69,32,119,105,116,104,32,120,116,101,114,109,32,50,53,54,45,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,38,0,42,0,46,0,-1,-1,57,0,74,0,76,0,80,0,87,0,-1,-1,89,0,96,0,-1,-1,100,0,-1,-1,104,0,108,0,-1,-1,-1,-1,112,0,-1,-1,114,0,119,0,-1,-1,-128,0,-123,0,-118,0,-1,-1,-113,0,-108,0,-103,0,-98,0,-89,0,-87,0,-81,0,-1,-1,-68,0,-63,0,-57,0,-51,0,-1,-1,-1,-1,-1,-1,-33,0,-1,-1,-1,-1,-1,-1,0,1,-1,-1,4,1,-1,-1,-1,-1,-1,-1,6,1,-1,-1,11,1,-1,-1,-1,-1,-1,-1,-1,-1,15,1,19,1,25,1,29,1,33,1,37,1,43,1,49,1,55,1,61,1,67,1,71,1,-1,-1,76,1,-1,-1,80,1,85,1,90,1,94,1,101,1,-1,-1,108,1,112,1,120,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-128,1,-119,1,-110,1,-101,1,-92,1,-83,1,-74,1,-65,1,-56,1,-47,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-38,1,-35,1,-1,-1,-1,-1,16,2,19,2,30,2,33,2,35,2,38,2,116,2,-1,-1,119,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,121,2,-1,-1,-1,-1,-1,-1,-1,-1,125,2,-1,-1,-78,2,-1,-1,-1,-1,-74,2,-68,2,-1,-1,-1,-1,-62,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-58,2,-54,2,-1,-1,-50,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-45,2,-1,-1,-38,2,-33,2,-1,-1,-1,-1,-1,-1,-1,-1,-26,2,-19,2,-12,2,-1,-1,-1,-1,-5,2,-1,-1,2,3,-1,-1,-1,-1,-1,-1,9,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,16,3,22,3,28,3,35,3,42,3,49,3,56,3,64,3,72,3,80,3,88,3,96,3,104,3,112,3,120,3,127,3,-122,3,-115,3,-108,3,-100,3,-92,3,-84,3,-76,3,-68,3,-60,3,-52,3,-44,3,-37,3,-30,3,-23,3,-16,3,-8,3,0,4,8,4,16,4,24,4,32,4,40,4,48,4,55,4,62,4,69,4,76,4,84,4,92,4,100,4,108,4,116,4,124,4,-124,4,-116,4,-109,4,-102,4,-95,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-90,4,-79,4,-74,4,-55,4,-51,4,-42,4,-35,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,59,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,64,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,70,5,-1,-1,-1,-1,-1,-1,74,5,-119,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-55,5,-52,5,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,14,0,27,91,49,109,0,27,55,27,91,63,52,55,104,0,27,91,50,109,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,15,0,27,91,48,109,15,0,27,91,50,74,27,91,63,52,55,108,27,56,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,27,91,109,27,91,63,55,104,27,91,52,108,27,62,27,55,27,91,114,27,91,63,49,59,51,59,52,59,54,108,27,56,0,27,91,76,0,127,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,79,72,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,99,0,27,55,27,91,114,27,56,27,91,109,27,91,63,55,104,27,91,33,112,27,91,63,49,59,51,59,52,59,54,108,27,91,52,108,27,62,27,91,63,49,48,48,48,108,27,91,63,50,53,104,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,55,37,116,59,56,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,91,69,0,96,96,97,97,102,102,103,103,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,41,48,0,27,79,70,0,27,79,77,0,27,91,49,126,0,27,91,51,59,50,126,0,27,91,52,126,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,59,53,80,0,27,91,49,59,53,81,0,27,91,49,59,53,82,0,27,91,49,59,53,83,0,27,91,49,53,59,53,126,0,27,91,49,55,59,53,126,0,27,91,49,56,59,53,126,0,27,91,49,57,59,53,126,0,27,91,50,48,59,53,126,0,27,91,50,49,59,53,126,0,27,91,50,51,59,53,126,0,27,91,50,52,59,53,126,0,27,91,49,59,54,80,0,27,91,49,59,54,81,0,27,91,49,59,54,82,0,27,91,49,59,54,83,0,27,91,49,53,59,54,126,0,27,91,49,55,59,54,126,0,27,91,49,56,59,54,126,0,27,91,49,57,59,54,126,0,27,91,50,48,59,54,126,0,27,91,50,49,59,54,126,0,27,91,50,51,59,54,126,0,27,91,50,52,59,54,126,0,27,91,49,59,51,80,0,27,91,49,59,51,81,0,27,91,49,59,51,82,0,27,91,49,59,51,83,0,27,91,49,53,59,51,126,0,27,91,49,55,59,51,126,0,27,91,49,56,59,51,126,0,27,91,49,57,59,51,126,0,27,91,50,48,59,51,126,0,27,91,50,49,59,51,126,0,27,91,50,51,59,51,126,0,27,91,50,52,59,51,126,0,27,91,49,59,52,80,0,27,91,49,59,52,81,0,27,91,49,59,52,82,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,37,91,59,48,49,50,51,52,53,54,55,56,57,93,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,49,48,52,7,0,27,93,52,59,37,112,49,37,100,59,114,103,98,58,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,27,92,0,27,91,51,109,0,27,91,50,51,109,0,27,91,60,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,27,108,0,27,109,0,0,3,0,1,0,73,0,-106,0,57,3,0,0,1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,-1,-1,-1,-1,32,0,39,0,46,0,53,0,60,0,67,0,74,0,81,0,88,0,95,0,102,0,109,0,116,0,123,0,-126,0,-119,0,-1,-1,-112,0,-105,0,-98,0,-91,0,-84,0,-1,-1,-77,0,-70,0,-63,0,-56,0,-49,0,-42,0,-35,0,-28,0,-21,0,-14,0,-7,0,0,1,7,1,14,1,21,1,28,1,35,1,42,1,49,1,56,1,63,1,70,1,77,1,84,1,91,1,98,1,105,1,112,1,119,1,126,1,-123,1,-1,-1,-1,-1,-1,-1,-1,-1,-116,1,-110,1,-105,1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,33,0,36,0,39,0,42,0,48,0,54,0,59,0,64,0,69,0,74,0,79,0,83,0,88,0,93,0,98,0,103,0,108,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-100,0,-94,0,-88,0,-82,0,-76,0,-71,0,-66,0,-61,0,-56,0,-51,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,27,1,33,1,39,1,45,1,51,1,57,1,63,1,69,1,73,1,78,1,83,1,88,1,93,1,98,1,102,1,106,1,110,1,114,1,119,1,124,1,27,91,63,49,48,48,54,59,49,48,48,48,37,63,37,112,49,37,123,49,125,37,61,37,116,104,37,101,108,37,59,0,27,91,51,59,51,126,0,27,91,51,59,52,126,0,27,91,51,59,53,126,0,27,91,51,59,54,126,0,27,91,51,59,55,126,0,27,91,49,59,50,66,0,27,91,49,59,51,66,0,27,91,49,59,52,66,0,27,91,49,59,53,66,0,27,91,49,59,54,66,0,27,91,49,59,55,66,0,27,91,49,59,51,70,0,27,91,49,59,52,70,0,27,91,49,59,53,70,0,27,91,49,59,54,70,0,27,91,49,59,55,70,0,27,91,49,59,51,72,0,27,91,49,59,52,72,0,27,91,49,59,53,72,0,27,91,49,59,54,72,0,27,91,49,59,55,72,0,27,91,50,59,51,126,0,27,91,50,59,52,126,0,27,91,50,59,53,126,0,27,91,50,59,54,126,0,27,91,50,59,55,126,0,27,91,49,59,51,68,0,27,91,49,59,52,68,0,27,91,49,59,53,68,0,27,91,49,59,54,68,0,27,91,49,59,55,68,0,27,91,54,59,51,126,0,27,91,54,59,52,126,0,27,91,54,59,53,126,0,27,91,54,59,54,126,0,27,91,54,59,55,126,0,27,91,53,59,51,126,0,27,91,53,59,52,126,0,27,91,53,59,53,126,0,27,91,53,59,54,126,0,27,91,53,59,55,126,0,27,91,49,59,51,67,0,27,91,49,59,52,67,0,27,91,49,59,53,67,0,27,91,49,59,54,67,0,27,91,49,59,55,67,0,27,91,49,59,50,65,0,27,91,49,59,51,65,0,27,91,49,59,52,65,0,27,91,49,59,53,65,0,27,91,49,59,54,65,0,27,91,49,59,55,65,0,27,91,50,57,109,0,27,91,57,109,0,27,91,60,37,112,49,37,100,59,37,112,50,37,100,59,37,112,51,37,100,59,37,63,37,112,52,37,116,77,37,101,109,37,59,0,65,88,0,71,48,0,88,84,0,85,56,0,67,114,0,67,115,0,69,48,0,69,51,0,77,115,0,83,48,0,83,101,0,83,115,0,84,83,0,88,77,0,103,114,98,111,109,0,103,115,98,111,109,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,114,109,120,120,0,115,109,120,120,0,120,109,0 // NOLINT
+};
+
+// vtpcon|ANIS emulation for console virtual terminal sequence with libuv,
+// auto_right_margin,
+// back_color_erase,
+// backspaces_with_bs,
+// has_meta_key,
+// move_insert_mode,
+// move_standout_mode,
+// no_pad_char,
+// columns#80,
+// init_tabs#8,
+// lines#24,
+// max_colors#0x100,
+// max_pairs#0x10000,
+// acs_chars=jjkkllmmnnqqttuuvvwwxx,
+// back_tab=\E[Z,
+// bell=^G,
+// carriage_return=\r,
+// change_scroll_region=\E[%i%p1%d;%p2%dr,
+// clear_all_tabs@,
+// clear_screen=\E[H\E[2J,
+// clr_bol=\E[1K,
+// clr_eol=\E[K,
+// clr_eos=\E[J,
+// column_address=\E[%i%p1%dG,
+// cursor_address=\E[%i%p1%d;%p2%dH,
+// cursor_down=\E[B,
+// cursor_home=\E[H,
+// cursor_invisible=\E[?25l,
+// cursor_left=^H,
+// cursor_normal=\E[?12l\E[?25h,
+// cursor_right=\E[C,
+// cursor_up=\E[A,
+// cursor_visible@,
+// delete_character=\E[P,
+// delete_line=\E[M,
+// enter_alt_charset_mode=\E(0,
+// enter_am_mode@,
+// enter_blink_mode@,
+// enter_bold_mode=\E[1m,
+// enter_ca_mode=\E[?1049h,
+// enter_dim_mode@,
+// enter_insert_mode@,
+// enter_italics_mode=\E[3m,
+// enter_reverse_mode=\E[7m,
+// enter_secure_mode@,
+// enter_standout_mode=\E[7m,
+// enter_underline_mode=\E[4m,
+// erase_chars=\E[%p1%dX,
+// exit_alt_charset_mode=\E(B,
+// exit_am_mode@,
+// exit_attribute_mode=\E[0m,
+// exit_ca_mode=\E[?1049l,
+// exit_insert_mode@,
+// exit_italics_mode=\E[23m,
+// exit_standout_mode=\E[27m,
+// exit_underline_mode=\E[24m,
+// flash_screen@,
+// init_2string=\E[\041p\E[?3l,
+// initialize_color=\E]4;%p1%d;rgb\072%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E,
+// insert_line=\E[L,
+// key_b2=\E[G,
+// key_backspace=^H,
+// key_btab=\E[Z,
+// key_dc=\E[3~,
+// key_down=\E[B,
+// key_end=\E[4~,
+// key_enter=\EOM,
+// key_f1=\E[[A,
+// key_f10=\E[21~,
+// key_f11=\E[23~,
+// key_f12=\E[24~,
+// key_f13=\E[25~,
+// key_f14=\E[26~,
+// key_f15=\E[28~,
+// key_f16=\E[29~,
+// key_f17=\E[31~,
+// key_f18=\E[32~,
+// key_f19=\E[33~,
+// key_f2=\E[[B,
+// key_f20=\E[34~,
+// key_f21=\E[23$,
+// key_f22=\E[24$,
+// key_f23=\E[11\136,
+// key_f24=\E[12\136,
+// key_f25=\E[13\136,
+// key_f26=\E[14\136,
+// key_f27=\E[15\136,
+// key_f28=\E[17\136,
+// key_f29=\E[18\136,
+// key_f3=\E[[C,
+// key_f30=\E[19\136,
+// key_f31=\E[20\136,
+// key_f32=\E[21\136,
+// key_f33=\E[23\136,
+// key_f34=\E[24\136,
+// key_f35=\E[25\136,
+// key_f36=\E[26\136,
+// key_f37=\E[28\136,
+// key_f38=\E[29\136,
+// key_f39=\E[31\136,
+// key_f4=\E[[D,
+// key_f40=\E[1;6S,
+// key_f41=\E[32\136,
+// key_f42=\E[33\136,
+// key_f43=\E[34\136,
+// key_f44=\E[23@,
+// key_f45=\E[24@,
+// key_f46@,
+// key_f47@,
+// key_f48@,
+// key_f49@,
+// key_f5=\E[[E,
+// key_f50@,
+// key_f51@,
+// key_f52@,
+// key_f53@,
+// key_f54@,
+// key_f55@,
+// key_f56@,
+// key_f57@,
+// key_f58@,
+// key_f59@,
+// key_f6=\E[17~,
+// key_f60@,
+// key_f61@,
+// key_f62@,
+// key_f63@,
+// key_f7=\E[18~,
+// key_f8=\E[19~,
+// key_f9=\E[20~,
+// key_home=\E[1~,
+// key_ic=\E[2~,
+// key_left=\E[D,
+// key_mouse@,
+// key_npage=\E[6~,
+// key_ppage=\E[5~,
+// key_right=\E[C,
+// key_sdc=\E[3;2~,
+// key_send=\E[4;2~,
+// key_sf=\E[1;2B,
+// key_shome=\E[1;2~,
+// key_sic=\E[2;2~,
+// key_sleft=\E[1;2D,
+// key_snext=\E[6;2~,
+// key_sprevious=\E[5;2~,
+// key_sr=\E[1;2A,
+// key_sright=\E[1;2C,
+// key_up=\E[A,
+// keypad_local@,
+// keypad_xmit@,
+// memory_lock@,
+// memory_unlock@,
+// meta_off@,
+// meta_on@,
+// orig_colors@,
+// orig_pair=\E[39;49m,
+// parm_dch=\E[%p1%dP,
+// parm_delete_line=\E[%p1%dM,
+// parm_down_cursor=\E[%p1%dB,
+// parm_ich=\E[%p1%d@,
+// parm_index=\E[%p1%dS,
+// parm_insert_line=\E[%p1%dL,
+// parm_left_cursor=\E[%p1%dD,
+// parm_right_cursor=\E[%p1%dC,
+// parm_rindex=\E[%p1%dT,
+// parm_up_cursor=\E[%p1%dA,
+// print_screen@,
+// prtr_off@,
+// prtr_on@,
+// repeat_char=%p1%c\E[%p2%{1}%-%db,
+// reset_1string@,
+// reset_2string@,
+// restore_cursor=\E8,
+// row_address=\E[%i%p1%dd,
+// save_cursor=\E7,
+// scroll_forward=\n,
+// scroll_reverse=\EM,
+// set_a_background=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
+// set_a_foreground=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
+// set_attributes=\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p6%t;1%;m,
+// set_tab=\EH,
+// tab=^I,
+// user6@,
+// user7@,
+// user8@,
+// user9@,
+static const int8_t vtpcon_terminfo[] = {
+ 30,2,71,0,38,0,15,0,-99,1,21,4,118,116,112,99,111,110,124,65,78,73,83,32,101,109,117,108,97,116,105,111,110,32,102,111,114,32,99,111,110,115,111,108,101,32,118,105,114,116,117,97,108,32,116,101,114,109,105,110,97,108,32,115,101,113,117,101,110,99,101,32,119,105,116,104,32,108,105,98,117,118,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,-2,-1,25,0,33,0,37,0,41,0,-1,-1,52,0,69,0,73,0,77,0,84,0,-1,-1,86,0,99,0,-1,-1,103,0,-2,-1,107,0,111,0,-1,-1,-1,-1,115,0,-2,-1,119,0,124,0,-1,-1,-2,-1,-2,-1,-2,-1,-1,-1,-123,0,-118,0,-113,0,-108,0,-99,0,-95,0,-90,0,-1,-1,-2,-1,-81,0,-75,0,-2,-1,-1,-1,-1,-1,-1,-1,-69,0,-1,-1,-1,-1,-1,-1,-59,0,-1,-1,-55,0,-1,-1,-1,-1,-1,-1,-53,0,-1,-1,-48,0,-1,-1,-1,-1,-1,-1,-1,-1,-44,0,-39,0,-33,0,-28,0,-23,0,-18,0,-13,0,-7,0,-1,0,5,1,11,1,16,1,-1,-1,21,1,-1,-1,25,1,30,1,35,1,39,1,46,1,-1,-1,53,1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,-1,-1,57,1,66,1,75,1,84,1,93,1,102,1,111,1,120,1,-127,1,-118,1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-109,1,-2,-1,-2,-1,-1,-1,-1,-1,-89,1,-86,1,-75,1,-72,1,-70,1,-67,1,-24,1,-1,-1,-21,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-19,1,-1,-1,-1,-1,-1,-1,-1,-1,-15,1,-1,-1,8,2,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,12,2,17,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,21,2,-1,-1,-1,-1,28,2,-1,-1,-1,-1,-1,-1,-1,-1,35,2,42,2,49,2,-1,-1,-1,-1,56,2,-1,-1,63,2,-1,-1,-1,-1,-1,-1,70,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,77,2,83,2,89,2,95,2,101,2,107,2,113,2,119,2,125,2,-125,2,-119,2,-113,2,-107,2,-101,2,-95,2,-89,2,-83,2,-77,2,-71,2,-65,2,-59,2,-53,2,-47,2,-41,2,-35,2,-29,2,-23,2,-17,2,-11,2,-5,2,2,3,8,3,14,3,20,3,26,3,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,32,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,37,3,-2,-1,46,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-117,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-112,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-106,3,-43,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,49,50,108,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,40,48,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,40,66,0,27,91,48,109,0,27,91,63,49,48,52,57,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,33,112,27,91,63,51,108,0,27,91,76,0,8,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,91,65,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,54,37,116,59,49,37,59,109,0,27,72,0,9,0,27,91,71,0,106,106,107,107,108,108,109,109,110,110,113,113,116,116,117,117,118,118,119,119,120,120,0,27,91,90,0,27,91,52,126,0,27,79,77,0,27,91,51,59,50,126,0,27,91,52,59,50,126,0,27,91,49,59,50,126,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,50,51,36,0,27,91,50,52,36,0,27,91,49,49,94,0,27,91,49,50,94,0,27,91,49,51,94,0,27,91,49,52,94,0,27,91,49,53,94,0,27,91,49,55,94,0,27,91,49,56,94,0,27,91,49,57,94,0,27,91,50,48,94,0,27,91,50,49,94,0,27,91,50,51,94,0,27,91,50,52,94,0,27,91,50,53,94,0,27,91,50,54,94,0,27,91,50,56,94,0,27,91,50,57,94,0,27,91,51,49,94,0,27,91,49,59,54,83,0,27,91,51,50,94,0,27,91,51,51,94,0,27,91,51,52,94,0,27,91,50,51,64,0,27,91,50,52,64,0,27,91,49,75,0,27,91,51,57,59,52,57,109,0,27,93,52,59,37,112,49,37,100,59,114,103,98,58,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,27,0,27,91,51,109,0,27,91,50,51,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,0,3,0,1,0,74,0,-104,0,-95,1,1,0,1,0,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,0,0,-2,-1,-1,-1,5,0,-1,-1,11,0,-1,-1,-2,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,21,0,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,33,0,39,0,42,0,45,0,48,0,54,0,60,0,65,0,70,0,75,0,80,0,85,0,89,0,94,0,99,0,104,0,109,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-100,0,-94,0,-88,0,-82,0,-76,0,-70,0,-65,0,-60,0,-55,0,-50,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,27,1,33,1,39,1,45,1,51,1,57,1,63,1,69,1,75,1,79,1,84,1,89,1,94,1,99,1,104,1,108,1,112,1,116,1,120,1,125,1,-126,1,27,91,51,74,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,91,49,59,50,65,0,65,88,0,71,48,0,88,84,0,85,56,0,67,114,0,67,115,0,69,48,0,69,51,0,77,115,0,83,48,0,83,101,0,83,109,117,108,120,0,83,115,0,84,83,0,88,77,0,103,114,98,111,109,0,103,115,98,111,109,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,114,109,120,120,0,115,109,120,120,0,120,109,0 // NOLINT
+};
+
+// win32con|ANSI emulation for libuv on legacy console,
+// auto_right_margin,
+// move_insert_mode,
+// move_standout_mode,
+// init_tabs#8,
+// max_colors#8,
+// max_pairs#64,
+// acs_chars@,
+// bell=^G,
+// carriage_return=\r,
+// clear_screen=\E[H\E[J,
+// clr_bol=\E[1K,
+// clr_eol=\E[K,
+// clr_eos=\E[J,
+// column_address=\E[%i%p1%dG,
+// cursor_address=\E[%i%p1%d;%p2%dH,
+// cursor_down=\E[B,
+// cursor_home=\E[H,
+// cursor_left=^H,
+// cursor_right=\E[C,
+// cursor_up=\E[A,
+// delete_character@,
+// delete_line@,
+// enter_alt_charset_mode@,
+// enter_bold_mode=\E[1m,
+// enter_ca_mode=\E7\E[?47h,
+// enter_insert_mode@,
+// enter_pc_charset_mode@,
+// enter_reverse_mode=\E[7m,
+// enter_secure_mode@,
+// enter_standout_mode=\E[7m,
+// enter_underline_mode@,
+// exit_alt_charset_mode@,
+// exit_attribute_mode=\E[0m,
+// exit_ca_mode=\E[2J\E[?47l\E8,
+// exit_insert_mode@,
+// exit_pc_charset_mode=\E[10m,
+// exit_standout_mode=\E[27m,
+// exit_underline_mode@,
+// from_status_line@,
+// insert_character@,
+// insert_line@,
+// key_b2=\E[G,
+// key_backspace=^H,
+// key_dc=\E[3~,
+// key_down=\E[B,
+// key_end=\E[4~,
+// key_f1=\E[[A,
+// key_f10=\E[21~,
+// key_f11=\E[23~,
+// key_f12=\E[24~,
+// key_f13=\E[25~,
+// key_f14=\E[26~,
+// key_f15=\E[28~,
+// key_f16=\E[29~,
+// key_f17=\E[31~,
+// key_f18=\E[32~,
+// key_f19=\E[33~,
+// key_f2=\E[[B,
+// key_f20=\E[34~,
+// key_f21=\E[23$,
+// key_f22=\E[24$,
+// key_f23=\E[11\136,
+// key_f24=\E[12\136,
+// key_f25=\E[13\136,
+// key_f26=\E[14\136,
+// key_f27=\E[15\136,
+// key_f28=\E[17\136,
+// key_f29=\E[18\136,
+// key_f3=\E[[C,
+// key_f30=\E[19\136,
+// key_f31=\E[20\136,
+// key_f32=\E[21\136,
+// key_f33=\E[23\136,
+// key_f34=\E[24\136,
+// key_f35=\E[25\136,
+// key_f36=\E[26\136,
+// key_f37=\E[28\136,
+// key_f38=\E[29\136,
+// key_f39=\E[31\136,
+// key_f4=\E[[D,
+// key_f41=\E[32\136,
+// key_f42=\E[33\136,
+// key_f43=\E[34\136,
+// key_f44=\E[23@,
+// key_f45=\E[24@,
+// key_f5=\E[[E,
+// key_f6=\E[17~,
+// key_f7=\E[18~,
+// key_f8=\E[19~,
+// key_f9=\E[20~,
+// key_home=\E[1~,
+// key_ic=\E[2~,
+// key_left=\E[D,
+// key_npage=\E[6~,
+// key_ppage=\E[5~,
+// key_right=\E[C,
+// key_sdc=\E[3;2~,
+// key_send=\E[4;2~,
+// key_shome=\E[1;2~,
+// key_sic=\E[2;2~,
+// key_sleft=\E[1;2D,
+// key_snext=\E[6;2~,
+// key_sprevious=\E[5;2~,
+// key_sright=\E[1;2C,
+// key_suspend=^Z,
+// key_up=\E[A,
+// newline=\r\n,
+// orig_pair=\E[39;49m,
+// parm_dch@,
+// parm_delete_line@,
+// parm_down_cursor=\E[%p1%dB,
+// parm_ich@,
+// parm_insert_line@,
+// parm_left_cursor=\E[%p1%dD,
+// parm_right_cursor=\E[%p1%dC,
+// parm_up_cursor=\E[%p1%dA,
+// reset_1string@,
+// restore_cursor=\E8,
+// row_address=\E[%i%p1%dd,
+// save_cursor=\E7,
+// scroll_forward@,
+// scroll_reverse@,
+// set_a_background=\E[4%p1%dm,
+// set_a_foreground=\E[3%p1%dm,
+// set_attributes=\E[0%?%p1%t;7%;%?%p3%t;7%;%?%p6%t;1%;m,
+// tab=^I,
+// to_status_line@,
+// user6@,
+// user7@,
+// user8@,
+// user9@,
+static const int8_t win32con_terminfo[] = {
+ 26,1,52,0,15,0,15,0,125,1,106,2,119,105,110,51,50,99,111,110,124,65,78,83,73,32,101,109,117,108,97,116,105,111,110,32,102,111,114,32,108,105,98,117,118,32,111,110,32,108,101,103,97,99,121,32,99,111,110,115,111,108,101,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,-1,-1,8,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,-1,-1,0,0,2,0,-1,-1,-1,-1,4,0,11,0,15,0,19,0,-1,-1,30,0,47,0,51,0,-1,-1,55,0,-1,-1,-1,-1,57,0,-1,-1,61,0,-1,-1,-2,-1,-2,-1,-1,-1,-1,-1,-2,-1,-1,-1,65,0,70,0,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,79,0,84,0,-2,-1,-1,-1,-2,-1,89,0,94,0,-1,-1,-2,-1,107,0,-2,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,113,0,-1,-1,-1,-1,-1,-1,115,0,-1,-1,120,0,-1,-1,-1,-1,-1,-1,-1,-1,124,0,-127,0,-121,0,-116,0,-111,0,-106,0,-101,0,-95,0,-89,0,-83,0,-77,0,-72,0,-1,-1,-67,0,-1,-1,-63,0,-58,0,-53,0,-1,-1,-1,-1,-1,-1,-49,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-45,0,-1,-1,-2,-1,-2,-1,-42,0,-2,-1,-1,-1,-2,-1,-33,0,-24,0,-1,-1,-15,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-6,0,-3,0,8,1,-2,-1,-2,-1,11,1,-1,-1,-1,-1,49,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,51,1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,55,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,60,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,1,-1,-1,-1,-1,69,1,-1,-1,-1,-1,-1,-1,-1,-1,76,1,83,1,90,1,-1,-1,-1,-1,97,1,-1,-1,104,1,-1,-1,-1,-1,-1,-1,111,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,118,1,124,1,-126,1,-120,1,-114,1,-108,1,-102,1,-96,1,-90,1,-84,1,-78,1,-72,1,-66,1,-60,1,-54,1,-48,1,-42,1,-36,1,-30,1,-24,1,-18,1,-12,1,-6,1,0,2,6,2,12,2,18,2,24,2,30,2,-1,-1,36,2,42,2,48,2,54,2,60,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,66,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,71,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,80,2,90,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,100,2,7,0,13,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,8,0,27,91,67,0,27,91,65,0,27,91,49,109,0,27,55,27,91,63,52,55,104,0,27,91,55,109,0,27,91,55,109,0,27,91,48,109,0,27,91,50,74,27,91,63,52,55,108,27,56,0,27,91,50,55,109,0,8,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,65,0,13,10,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,27,91,48,37,63,37,112,49,37,116,59,55,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,54,37,116,59,49,37,59,109,0,9,0,27,91,71,0,27,91,52,126,0,26,0,27,91,51,59,50,126,0,27,91,52,59,50,126,0,27,91,49,59,50,126,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,50,51,36,0,27,91,50,52,36,0,27,91,49,49,94,0,27,91,49,50,94,0,27,91,49,51,94,0,27,91,49,52,94,0,27,91,49,53,94,0,27,91,49,55,94,0,27,91,49,56,94,0,27,91,49,57,94,0,27,91,50,48,94,0,27,91,50,49,94,0,27,91,50,51,94,0,27,91,50,52,94,0,27,91,50,53,94,0,27,91,50,54,94,0,27,91,50,56,94,0,27,91,50,57,94,0,27,91,51,49,94,0,27,91,51,50,94,0,27,91,51,51,94,0,27,91,51,52,94,0,27,91,50,51,64,0,27,91,50,52,64,0,27,91,49,75,0,27,91,51,57,59,52,57,109,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0,27,91,49,48,109,0,1,0,0,0,2,0,5,0,25,0,0,0,0,0,6,0,0,0,3,0,6,0,27,91,48,32,113,0,27,91,37,112,49,37,100,32,113,0,65,88,0,83,101,0,83,115,0 // NOLINT
+};
+
+// xterm-256color|xterm with 256 colors,
+// auto_right_margin,
+// back_color_erase,
+// backspaces_with_bs,
+// can_change,
+// eat_newline_glitch,
+// has_meta_key,
+// move_insert_mode,
+// move_standout_mode,
+// no_pad_char,
+// prtr_silent,
+// columns#80,
+// init_tabs#8,
+// lines#24,
+// max_colors#0x100,
+// max_pairs#0x10000,
+// acs_chars=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+// back_tab=\E[Z,
+// bell=^G,
+// carriage_return=\r,
+// change_scroll_region=\E[%i%p1%d;%p2%dr,
+// clear_all_tabs=\E[3g,
+// clear_screen=\E[H\E[2J,
+// clr_bol=\E[1K,
+// clr_eol=\E[K,
+// clr_eos=\E[J,
+// column_address=\E[%i%p1%dG,
+// cursor_address=\E[%i%p1%d;%p2%dH,
+// cursor_down=\n,
+// cursor_home=\E[H,
+// cursor_invisible=\E[?25l,
+// cursor_left=^H,
+// cursor_normal=\E[?12l\E[?25h,
+// cursor_right=\E[C,
+// cursor_up=\E[A,
+// cursor_visible=\E[?12;25h,
+// delete_character=\E[P,
+// delete_line=\E[M,
+// enter_alt_charset_mode=\E(0,
+// enter_am_mode=\E[?7h,
+// enter_blink_mode=\E[5m,
+// enter_bold_mode=\E[1m,
+// enter_ca_mode=\E[?1049h\E[22;0;0t,
+// enter_dim_mode=\E[2m,
+// enter_insert_mode=\E[4h,
+// enter_italics_mode=\E[3m,
+// enter_reverse_mode=\E[7m,
+// enter_secure_mode=\E[8m,
+// enter_standout_mode=\E[7m,
+// enter_underline_mode=\E[4m,
+// erase_chars=\E[%p1%dX,
+// exit_alt_charset_mode=\E(B,
+// exit_am_mode=\E[?7l,
+// exit_attribute_mode=\E(B\E[m,
+// exit_ca_mode=\E[?1049l\E[23;0;0t,
+// exit_insert_mode=\E[4l,
+// exit_italics_mode=\E[23m,
+// exit_standout_mode=\E[27m,
+// exit_underline_mode=\E[24m,
+// flash_screen=\E[?5h$<100/>\E[?5l,
+// init_2string=\E[\041p\E[?3;4l\E[4l\E>,
+// initialize_color=\E]4;%p1%d;rgb\072%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\,
+// insert_line=\E[L,
+// key_b2=\EOE,
+// key_backspace=^H,
+// key_btab=\E[Z,
+// key_dc=\E[3~,
+// key_down=\EOB,
+// key_end=\EOF,
+// key_enter=\EOM,
+// key_f1=\EOP,
+// key_f10=\E[21~,
+// key_f11=\E[23~,
+// key_f12=\E[24~,
+// key_f13=\E[1;2P,
+// key_f14=\E[1;2Q,
+// key_f15=\E[1;2R,
+// key_f16=\E[1;2S,
+// key_f17=\E[15;2~,
+// key_f18=\E[17;2~,
+// key_f19=\E[18;2~,
+// key_f2=\EOQ,
+// key_f20=\E[19;2~,
+// key_f21=\E[20;2~,
+// key_f22=\E[21;2~,
+// key_f23=\E[23;2~,
+// key_f24=\E[24;2~,
+// key_f25=\E[1;5P,
+// key_f26=\E[1;5Q,
+// key_f27=\E[1;5R,
+// key_f28=\E[1;5S,
+// key_f29=\E[15;5~,
+// key_f3=\EOR,
+// key_f30=\E[17;5~,
+// key_f31=\E[18;5~,
+// key_f32=\E[19;5~,
+// key_f33=\E[20;5~,
+// key_f34=\E[21;5~,
+// key_f35=\E[23;5~,
+// key_f36=\E[24;5~,
+// key_f37=\E[1;6P,
+// key_f38=\E[1;6Q,
+// key_f39=\E[1;6R,
+// key_f4=\EOS,
+// key_f40=\E[1;6S,
+// key_f41=\E[15;6~,
+// key_f42=\E[17;6~,
+// key_f43=\E[18;6~,
+// key_f44=\E[19;6~,
+// key_f45=\E[20;6~,
+// key_f46=\E[21;6~,
+// key_f47=\E[23;6~,
+// key_f48=\E[24;6~,
+// key_f49=\E[1;3P,
+// key_f5=\E[15~,
+// key_f50=\E[1;3Q,
+// key_f51=\E[1;3R,
+// key_f52=\E[1;3S,
+// key_f53=\E[15;3~,
+// key_f54=\E[17;3~,
+// key_f55=\E[18;3~,
+// key_f56=\E[19;3~,
+// key_f57=\E[20;3~,
+// key_f58=\E[21;3~,
+// key_f59=\E[23;3~,
+// key_f6=\E[17~,
+// key_f60=\E[24;3~,
+// key_f61=\E[1;4P,
+// key_f62=\E[1;4Q,
+// key_f63=\E[1;4R,
+// key_f7=\E[18~,
+// key_f8=\E[19~,
+// key_f9=\E[20~,
+// key_home=\EOH,
+// key_ic=\E[2~,
+// key_left=\EOD,
+// key_mouse=\E[<,
+// key_npage=\E[6~,
+// key_ppage=\E[5~,
+// key_right=\EOC,
+// key_sdc=\E[3;2~,
+// key_send=\E[1;2F,
+// key_sf=\E[1;2B,
+// key_shome=\E[1;2H,
+// key_sic=\E[2;2~,
+// key_sleft=\E[1;2D,
+// key_snext=\E[6;2~,
+// key_sprevious=\E[5;2~,
+// key_sr=\E[1;2A,
+// key_sright=\E[1;2C,
+// key_up=\EOA,
+// keypad_local=\E[?1l\E>,
+// keypad_xmit=\E[?1h\E=,
+// memory_lock=\El,
+// memory_unlock=\Em,
+// meta_off=\E[?1034l,
+// meta_on=\E[?1034h,
+// orig_colors=\E]104^G,
+// orig_pair=\E[39;49m,
+// parm_dch=\E[%p1%dP,
+// parm_delete_line=\E[%p1%dM,
+// parm_down_cursor=\E[%p1%dB,
+// parm_ich=\E[%p1%d@,
+// parm_index=\E[%p1%dS,
+// parm_insert_line=\E[%p1%dL,
+// parm_left_cursor=\E[%p1%dD,
+// parm_right_cursor=\E[%p1%dC,
+// parm_rindex=\E[%p1%dT,
+// parm_up_cursor=\E[%p1%dA,
+// print_screen=\E[i,
+// prtr_off=\E[4i,
+// prtr_on=\E[5i,
+// repeat_char=%p1%c\E[%p2%{1}%-%db,
+// reset_1string=\Ec\E]104^G,
+// reset_2string=\E[\041p\E[?3;4l\E[4l\E>,
+// restore_cursor=\E8,
+// row_address=\E[%i%p1%dd,
+// save_cursor=\E7,
+// scroll_forward=\n,
+// scroll_reverse=\EM,
+// set_a_background=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
+// set_a_foreground=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
+// set_attributes=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m,
+// set_tab=\EH,
+// tab=^I,
+// user6=\E[%i%d;%dR,
+// user7=\E[6n,
+// user8=\E[?%[;0123456789]c,
+// user9=\E[c,
+static const int8_t xterm_256colour_terminfo[] = {
+ 30,2,37,0,38,0,15,0,-99,1,2,6,120,116,101,114,109,45,50,53,54,99,111,108,111,114,124,120,116,101,114,109,32,119,105,116,104,32,50,53,54,32,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,1,0,1,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,38,0,42,0,46,0,-1,-1,57,0,74,0,76,0,80,0,87,0,-1,-1,89,0,102,0,-1,-1,106,0,110,0,120,0,124,0,-1,-1,-1,-1,-128,0,-124,0,-119,0,-114,0,-1,-1,-96,0,-91,0,-86,0,-1,-1,-81,0,-76,0,-71,0,-66,0,-57,0,-53,0,-46,0,-1,-1,-28,0,-23,0,-17,0,-11,0,-1,-1,-1,-1,-1,-1,7,1,-1,-1,-1,-1,-1,-1,25,1,-1,-1,29,1,-1,-1,-1,-1,-1,-1,31,1,-1,-1,36,1,-1,-1,-1,-1,-1,-1,-1,-1,40,1,44,1,50,1,54,1,58,1,62,1,68,1,74,1,80,1,86,1,92,1,96,1,-1,-1,101,1,-1,-1,105,1,110,1,115,1,119,1,126,1,-1,-1,-123,1,-119,1,-111,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-103,1,-94,1,-1,-1,-1,-1,-85,1,-76,1,-67,1,-58,1,-49,1,-40,1,-31,1,-22,1,-13,1,-4,1,-1,-1,-1,-1,-1,-1,5,2,9,2,14,2,19,2,39,2,48,2,-1,-1,-1,-1,66,2,69,2,80,2,83,2,85,2,88,2,-75,2,-1,-1,-72,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-70,2,-1,-1,-1,-1,-1,-1,-1,-1,-66,2,-1,-1,-13,2,-1,-1,-1,-1,-9,2,-3,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,3,7,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,3,-1,-1,-1,-1,18,3,-1,-1,-1,-1,-1,-1,-1,-1,25,3,32,3,39,3,-1,-1,-1,-1,46,3,-1,-1,53,3,-1,-1,-1,-1,-1,-1,60,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,67,3,73,3,79,3,86,3,93,3,100,3,107,3,115,3,123,3,-125,3,-117,3,-109,3,-101,3,-93,3,-85,3,-78,3,-71,3,-64,3,-57,3,-49,3,-41,3,-33,3,-25,3,-17,3,-9,3,-1,3,7,4,14,4,21,4,28,4,35,4,43,4,51,4,59,4,67,4,75,4,83,4,91,4,99,4,106,4,113,4,120,4,127,4,-121,4,-113,4,-105,4,-97,4,-89,4,-81,4,-73,4,-65,4,-58,4,-51,4,-44,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-39,4,-28,4,-23,4,-4,4,0,5,9,5,16,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,110,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,115,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,121,5,-1,-1,-1,-1,-1,-1,125,5,-68,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-4,5,-1,5,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,49,50,108,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,63,49,50,59,50,53,104,0,27,91,80,0,27,91,77,0,27,40,48,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,27,91,50,50,59,48,59,48,116,0,27,91,50,109,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,40,66,0,27,40,66,27,91,109,0,27,91,63,49,48,52,57,108,27,91,50,51,59,48,59,48,116,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,27,91,33,112,27,91,63,51,59,52,108,27,91,52,108,27,62,0,27,91,76,0,8,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,79,72,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,91,63,49,48,51,52,108,0,27,91,63,49,48,51,52,104,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,91,105,0,27,91,52,105,0,27,91,53,105,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,99,27,93,49,48,52,7,0,27,91,33,112,27,91,63,51,59,52,108,27,91,52,108,27,62,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,37,63,37,112,57,37,116,27,40,48,37,101,27,40,66,37,59,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,55,37,116,59,56,37,59,109,0,27,72,0,9,0,27,79,69,0,96,96,97,97,102,102,103,103,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,79,70,0,27,79,77,0,27,91,51,59,50,126,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,59,53,80,0,27,91,49,59,53,81,0,27,91,49,59,53,82,0,27,91,49,59,53,83,0,27,91,49,53,59,53,126,0,27,91,49,55,59,53,126,0,27,91,49,56,59,53,126,0,27,91,49,57,59,53,126,0,27,91,50,48,59,53,126,0,27,91,50,49,59,53,126,0,27,91,50,51,59,53,126,0,27,91,50,52,59,53,126,0,27,91,49,59,54,80,0,27,91,49,59,54,81,0,27,91,49,59,54,82,0,27,91,49,59,54,83,0,27,91,49,53,59,54,126,0,27,91,49,55,59,54,126,0,27,91,49,56,59,54,126,0,27,91,49,57,59,54,126,0,27,91,50,48,59,54,126,0,27,91,50,49,59,54,126,0,27,91,50,51,59,54,126,0,27,91,50,52,59,54,126,0,27,91,49,59,51,80,0,27,91,49,59,51,81,0,27,91,49,59,51,82,0,27,91,49,59,51,83,0,27,91,49,53,59,51,126,0,27,91,49,55,59,51,126,0,27,91,49,56,59,51,126,0,27,91,49,57,59,51,126,0,27,91,50,48,59,51,126,0,27,91,50,49,59,51,126,0,27,91,50,51,59,51,126,0,27,91,50,52,59,51,126,0,27,91,49,59,52,80,0,27,91,49,59,52,81,0,27,91,49,59,52,82,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,37,91,59,48,49,50,51,52,53,54,55,56,57,93,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,49,48,52,7,0,27,93,52,59,37,112,49,37,100,59,114,103,98,58,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,27,92,0,27,91,51,109,0,27,91,50,51,109,0,27,91,60,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,27,108,0,27,109,0,3,0,1,0,73,0,-106,0,115,3,1,0,1,0,-1,-1,-1,-1,0,0,7,0,-1,-1,19,0,24,0,-1,-1,42,0,48,0,-1,-1,58,0,-1,-1,-1,-1,90,0,97,0,104,0,111,0,118,0,125,0,-124,0,-117,0,-110,0,-103,0,-96,0,-89,0,-82,0,-75,0,-68,0,-61,0,-1,-1,-54,0,-47,0,-40,0,-33,0,-26,0,-1,-1,-19,0,-12,0,-5,0,2,1,9,1,16,1,23,1,30,1,37,1,44,1,51,1,58,1,65,1,72,1,79,1,86,1,93,1,100,1,107,1,114,1,121,1,-128,1,-121,1,-114,1,-107,1,-100,1,-93,1,-86,1,-79,1,-72,1,-65,1,-1,-1,-1,-1,-1,-1,-1,-1,-58,1,-52,1,-47,1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,33,0,36,0,39,0,42,0,48,0,54,0,59,0,64,0,69,0,74,0,79,0,83,0,88,0,93,0,98,0,103,0,108,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-100,0,-94,0,-88,0,-82,0,-76,0,-71,0,-66,0,-61,0,-56,0,-51,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,27,1,33,1,39,1,45,1,51,1,57,1,63,1,69,1,73,1,78,1,83,1,88,1,93,1,98,1,102,1,106,1,110,1,114,1,119,1,124,1,27,93,49,49,50,7,0,27,93,49,50,59,37,112,49,37,115,7,0,27,91,51,74,0,27,93,53,50,59,37,112,49,37,115,59,37,112,50,37,115,7,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,91,63,49,48,48,54,59,49,48,48,48,37,63,37,112,49,37,123,49,125,37,61,37,116,104,37,101,108,37,59,0,27,91,51,59,51,126,0,27,91,51,59,52,126,0,27,91,51,59,53,126,0,27,91,51,59,54,126,0,27,91,51,59,55,126,0,27,91,49,59,50,66,0,27,91,49,59,51,66,0,27,91,49,59,52,66,0,27,91,49,59,53,66,0,27,91,49,59,54,66,0,27,91,49,59,55,66,0,27,91,49,59,51,70,0,27,91,49,59,52,70,0,27,91,49,59,53,70,0,27,91,49,59,54,70,0,27,91,49,59,55,70,0,27,91,49,59,51,72,0,27,91,49,59,52,72,0,27,91,49,59,53,72,0,27,91,49,59,54,72,0,27,91,49,59,55,72,0,27,91,50,59,51,126,0,27,91,50,59,52,126,0,27,91,50,59,53,126,0,27,91,50,59,54,126,0,27,91,50,59,55,126,0,27,91,49,59,51,68,0,27,91,49,59,52,68,0,27,91,49,59,53,68,0,27,91,49,59,54,68,0,27,91,49,59,55,68,0,27,91,54,59,51,126,0,27,91,54,59,52,126,0,27,91,54,59,53,126,0,27,91,54,59,54,126,0,27,91,54,59,55,126,0,27,91,53,59,51,126,0,27,91,53,59,52,126,0,27,91,53,59,53,126,0,27,91,53,59,54,126,0,27,91,53,59,55,126,0,27,91,49,59,51,67,0,27,91,49,59,52,67,0,27,91,49,59,53,67,0,27,91,49,59,54,67,0,27,91,49,59,55,67,0,27,91,49,59,50,65,0,27,91,49,59,51,65,0,27,91,49,59,52,65,0,27,91,49,59,53,65,0,27,91,49,59,54,65,0,27,91,49,59,55,65,0,27,91,50,57,109,0,27,91,57,109,0,27,91,60,37,112,49,37,100,59,37,112,50,37,100,59,37,112,51,37,100,59,37,63,37,112,52,37,116,77,37,101,109,37,59,0,65,88,0,71,48,0,88,84,0,85,56,0,67,114,0,67,115,0,69,48,0,69,51,0,77,115,0,83,48,0,83,101,0,83,115,0,84,83,0,88,77,0,103,114,98,111,109,0,103,115,98,111,109,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,114,109,120,120,0,115,109,120,120,0,120,109,0 // NOLINT
+};
+#endif // NVIM_TUI_TERMINFO_DEFS_H
diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c
index c4efa69c4c..dbffabd707 100644
--- a/src/nvim/tui/tui.c
+++ b/src/nvim/tui/tui.c
@@ -1,3 +1,8 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+// Terminal UI functions. Invoked (by ui_bridge.c) on the TUI thread.
+
#include <assert.h>
#include <stdbool.h>
#include <stdio.h>
@@ -5,31 +10,60 @@
#include <uv.h>
#include <unibilium.h>
+#if defined(HAVE_TERMIOS_H)
+# include <termios.h>
+#endif
#include "nvim/lib/kvec.h"
+#include "nvim/ascii.h"
#include "nvim/vim.h"
+#include "nvim/log.h"
#include "nvim/ui.h"
+#include "nvim/highlight.h"
#include "nvim/map.h"
#include "nvim/main.h"
#include "nvim/memory.h"
+#include "nvim/option.h"
#include "nvim/api/vim.h"
#include "nvim/api/private/helpers.h"
#include "nvim/event/loop.h"
#include "nvim/event/signal.h"
-#include "nvim/tui/tui.h"
-#include "nvim/tui/input.h"
#include "nvim/os/input.h"
#include "nvim/os/os.h"
+#include "nvim/os/tty.h"
#include "nvim/strings.h"
-#include "nvim/ugrid.h"
+#include "nvim/syntax.h"
#include "nvim/ui_bridge.h"
+#include "nvim/ugrid.h"
+#include "nvim/tui/input.h"
+#include "nvim/tui/tui.h"
+#include "nvim/tui/terminfo.h"
+#include "nvim/cursor_shape.h"
+#include "nvim/macros.h"
-// Space reserved in the output buffer to restore the cursor to normal when
-// flushing. No existing terminal will require 32 bytes to do that.
+// Space reserved in two output buffers to make the cursor normal or invisible
+// when flushing. No existing terminal will require 32 bytes to do that.
#define CNORM_COMMAND_MAX_SIZE 32
#define OUTBUF_SIZE 0xffff
+#define TOO_MANY_EVENTS 1000000
+#define STARTS_WITH(str, prefix) (strlen(str) >= (sizeof(prefix) - 1) \
+ && 0 == memcmp((str), (prefix), sizeof(prefix) - 1))
+#define TMUX_WRAP(is_tmux, seq) ((is_tmux) \
+ ? "\x1bPtmux;\x1b" seq "\x1b\\" : seq)
+#define LINUXSET0C "\x1b[?0c"
+#define LINUXSET1C "\x1b[?1c"
+
+#ifdef NVIM_UNIBI_HAS_VAR_FROM
+#define UNIBI_SET_NUM_VAR(var, num) \
+ do { \
+ (var) = unibi_var_from_num((num)); \
+ } while (0)
+#else
+#define UNIBI_SET_NUM_VAR(var, num) (var).i = (num);
+#endif
+
typedef struct {
int top, bot, left, right;
} Rect;
@@ -37,10 +71,12 @@ typedef struct {
typedef struct {
UIBridgeData *bridge;
Loop *loop;
- bool stop;
unibi_var_t params[9];
char buf[OUTBUF_SIZE];
- size_t bufpos, bufsize;
+ size_t bufpos;
+ char norm[CNORM_COMMAND_MAX_SIZE];
+ char invis[CNORM_COMMAND_MAX_SIZE];
+ size_t normlen, invislen;
TermInput input;
uv_loop_t write_loop;
unibi_term *ut;
@@ -51,28 +87,49 @@ typedef struct {
bool out_isatty;
SignalWatcher winch_handle, cont_handle;
bool cont_received;
- // Event scheduled by the ui bridge. Since the main thread suspends until
- // the event is handled, it is fine to use a single field instead of a queue
- Event scheduled_event;
UGrid grid;
kvec_t(Rect) invalid_regions;
+ int row, col;
int out_fd;
- bool can_use_terminal_scroll;
+ bool scroll_region_is_full_screen;
+ bool can_change_scroll_region;
+ bool can_set_lr_margin;
+ bool can_set_left_right_margin;
+ bool can_scroll;
+ bool can_erase_chars;
+ bool immediate_wrap_after_last_column;
+ bool bce;
bool mouse_enabled;
- bool busy;
- HlAttrs print_attrs;
- int showing_mode;
+ bool busy, is_invisible;
+ bool cork, overflow;
+ bool cursor_color_changed;
+ cursorentry_T cursor_shapes[SHAPE_IDX_COUNT];
+ HlAttrs clear_attrs;
+ kvec_t(HlAttrs) attrs;
+ int print_attr_id;
+ bool default_attr;
+ bool can_clear_attr;
+ ModeShape showing_mode;
struct {
int enable_mouse, disable_mouse;
int enable_bracketed_paste, disable_bracketed_paste;
- int enter_insert_mode, enter_replace_mode, exit_insert_mode;
+ int enable_lr_margin, disable_lr_margin;
int set_rgb_foreground, set_rgb_background;
+ int set_cursor_color;
+ int reset_cursor_color;
int enable_focus_reporting, disable_focus_reporting;
+ int resize_screen;
+ int reset_scroll_region;
+ int set_cursor_style, reset_cursor_style;
+ int save_title, restore_title;
+ int enter_undercurl_mode, exit_undercurl_mode, set_underline_color;
int get_bg;
} unibi_ext;
+ char *space_buf;
} TUIData;
static bool volatile got_winch = false;
+static bool cursor_style_enabled = false;
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "tui/tui.c.generated.h"
@@ -81,77 +138,162 @@ static bool volatile got_winch = false;
UI *tui_start(void)
{
- UI *ui = xcalloc(1, sizeof(UI));
+ UI *ui = xcalloc(1, sizeof(UI)); // Freed by ui_bridge_stop().
ui->stop = tui_stop;
- ui->rgb = p_tgc;
- ui->resize = tui_resize;
- ui->clear = tui_clear;
- ui->eol_clear = tui_eol_clear;
- ui->cursor_goto = tui_cursor_goto;
+ ui->grid_resize = tui_grid_resize;
+ ui->grid_clear = tui_grid_clear;
+ ui->grid_cursor_goto = tui_grid_cursor_goto;
+ ui->mode_info_set = tui_mode_info_set;
ui->update_menu = tui_update_menu;
ui->busy_start = tui_busy_start;
ui->busy_stop = tui_busy_stop;
ui->mouse_on = tui_mouse_on;
ui->mouse_off = tui_mouse_off;
ui->mode_change = tui_mode_change;
- ui->set_scroll_region = tui_set_scroll_region;
- ui->scroll = tui_scroll;
- ui->highlight_set = tui_highlight_set;
- ui->put = tui_put;
+ ui->grid_scroll = tui_grid_scroll;
+ ui->hl_attr_define = tui_hl_attr_define;
ui->bell = tui_bell;
ui->visual_bell = tui_visual_bell;
- ui->update_fg = tui_update_fg;
- ui->update_bg = tui_update_bg;
- ui->update_sp = tui_update_sp;
+ ui->default_colors_set = tui_default_colors_set;
ui->flush = tui_flush;
ui->suspend = tui_suspend;
ui->set_title = tui_set_title;
ui->set_icon = tui_set_icon;
+ ui->option_set= tui_option_set;
+ ui->raw_line = tui_raw_line;
+
+ memset(ui->ui_ext, 0, sizeof(ui->ui_ext));
+ ui->ui_ext[kUILinegrid] = true;
+
return ui_bridge_attach(ui, tui_main, tui_scheduler);
}
+static size_t unibi_pre_fmt_str(TUIData *data, unsigned int unibi_index,
+ char * buf, size_t len)
+{
+ const char *str = unibi_get_str(data->ut, unibi_index);
+ if (!str) {
+ return 0U;
+ }
+ return unibi_run(str, data->params, buf, len);
+}
+
+static void termname_set_event(void **argv)
+{
+ char *termname = argv[0];
+ set_tty_option("term", termname);
+ // Do not free termname, it is freed by set_tty_option.
+}
+
static void terminfo_start(UI *ui)
{
TUIData *data = ui->data;
- data->can_use_terminal_scroll = true;
+ data->scroll_region_is_full_screen = true;
data->bufpos = 0;
- data->bufsize = sizeof(data->buf) - CNORM_COMMAND_MAX_SIZE;
- data->showing_mode = 0;
+ data->default_attr = false;
+ data->can_clear_attr = false;
+ data->is_invisible = true;
+ data->busy = false;
+ data->cork = false;
+ data->overflow = false;
+ data->cursor_color_changed = false;
+ data->showing_mode = SHAPE_IDX_N;
data->unibi_ext.enable_mouse = -1;
data->unibi_ext.disable_mouse = -1;
+ data->unibi_ext.set_cursor_color = -1;
+ data->unibi_ext.reset_cursor_color = -1;
data->unibi_ext.enable_bracketed_paste = -1;
data->unibi_ext.disable_bracketed_paste = -1;
- data->unibi_ext.enter_insert_mode = -1;
- data->unibi_ext.enter_replace_mode = -1;
- data->unibi_ext.exit_insert_mode = -1;
+ data->unibi_ext.enable_lr_margin = -1;
+ data->unibi_ext.disable_lr_margin = -1;
data->unibi_ext.enable_focus_reporting = -1;
data->unibi_ext.disable_focus_reporting = -1;
+ data->unibi_ext.resize_screen = -1;
+ data->unibi_ext.reset_scroll_region = -1;
+ data->unibi_ext.set_cursor_style = -1;
+ data->unibi_ext.reset_cursor_style = -1;
data->unibi_ext.get_bg = -1;
data->out_fd = 1;
data->out_isatty = os_isatty(data->out_fd);
- // setup unibilium
+
+ const char *term = os_getenv("TERM");
+#ifdef WIN32
+ os_tty_guess_term(&term, data->out_fd);
+ os_setenv("TERM", term, 1);
+#endif
+
+ // Set up unibilium/terminfo.
data->ut = unibi_from_env();
- if (!data->ut) {
- // For some reason could not read terminfo file, use a dummy entry that
- // will be populated with common values by fix_terminfo below
- data->ut = unibi_dummy();
+ char *termname = NULL;
+ if (!term || !data->ut) {
+ data->ut = terminfo_from_builtin(term, &termname);
+ } else {
+ termname = xstrdup(term);
}
- fix_terminfo(data);
+ // Update 'term' option.
+ loop_schedule_deferred(&main_loop,
+ event_create(termname_set_event, 1, termname));
+
+ // None of the following work over SSH; see :help TERM .
+ const char *colorterm = os_getenv("COLORTERM");
+ const char *termprg = os_getenv("TERM_PROGRAM");
+ const char *vte_version_env = os_getenv("VTE_VERSION");
+ long vtev = vte_version_env ? strtol(vte_version_env, NULL, 10) : 0;
+ bool iterm_env = termprg && strstr(termprg, "iTerm.app");
+ bool konsole = terminfo_is_term_family(term, "konsole")
+ || os_getenv("KONSOLE_PROFILE_NAME")
+ || os_getenv("KONSOLE_DBUS_SESSION");
+ const char *konsolev_env = os_getenv("KONSOLE_VERSION");
+ long konsolev = konsolev_env ? strtol(konsolev_env, NULL, 10)
+ : (konsole ? 1 : 0);
+
+ patch_terminfo_bugs(data, term, colorterm, vtev, konsolev, iterm_env);
+ augment_terminfo(data, term, colorterm, vtev, konsolev, iterm_env);
+ data->can_change_scroll_region =
+ !!unibi_get_str(data->ut, unibi_change_scroll_region);
+ data->can_set_lr_margin =
+ !!unibi_get_str(data->ut, unibi_set_lr_margin);
+ data->can_set_left_right_margin =
+ !!unibi_get_str(data->ut, unibi_set_left_margin_parm)
+ && !!unibi_get_str(data->ut, unibi_set_right_margin_parm);
+ data->can_scroll =
+ !!unibi_get_str(data->ut, unibi_delete_line)
+ && !!unibi_get_str(data->ut, unibi_parm_delete_line)
+ && !!unibi_get_str(data->ut, unibi_insert_line)
+ && !!unibi_get_str(data->ut, unibi_parm_insert_line);
+ data->can_erase_chars = !!unibi_get_str(data->ut, unibi_erase_chars);
+ data->immediate_wrap_after_last_column =
+ terminfo_is_term_family(term, "conemu")
+ || terminfo_is_term_family(term, "cygwin")
+ || terminfo_is_term_family(term, "win32con")
+ || terminfo_is_term_family(term, "interix");
+ data->bce = unibi_get_bool(data->ut, unibi_back_color_erase);
+ data->normlen = unibi_pre_fmt_str(data, unibi_cursor_normal,
+ data->norm, sizeof data->norm);
+ data->invislen = unibi_pre_fmt_str(data, unibi_cursor_invisible,
+ data->invis, sizeof data->invis);
// Set 't_Co' from the result of unibilium & fix_terminfo.
t_colors = unibi_get_num(data->ut, unibi_max_colors);
- // Enter alternate screen and clear
+ // Enter alternate screen, save title, and clear.
+ // NOTE: Do this *before* changing terminal settings. #6433
unibi_out(ui, unibi_enter_ca_mode);
+ // Save title/icon to the "stack". #4063
+ unibi_out_ext(ui, data->unibi_ext.save_title);
+ unibi_out(ui, unibi_keypad_xmit);
unibi_out(ui, unibi_clear_screen);
- // Ask the terminal to send us the background color
- unibi_out(ui, data->unibi_ext.get_bg);
+ // Ask the terminal to send us the background color.
+ unibi_out_ext(ui, data->unibi_ext.get_bg);
// Enable bracketed paste
- unibi_out(ui, data->unibi_ext.enable_bracketed_paste);
- // Enable focus reporting
- unibi_out(ui, data->unibi_ext.enable_focus_reporting);
+ unibi_out_ext(ui, data->unibi_ext.enable_bracketed_paste);
+
uv_loop_init(&data->write_loop);
if (data->out_isatty) {
uv_tty_init(&data->write_loop, &data->output_handle.tty, data->out_fd, 0);
+#ifdef WIN32
uv_tty_set_mode(&data->output_handle.tty, UV_TTY_MODE_RAW);
+#else
+ uv_tty_set_mode(&data->output_handle.tty, UV_TTY_MODE_IO);
+#endif
} else {
uv_pipe_init(&data->write_loop, &data->output_handle.pipe, 0);
uv_pipe_open(&data->output_handle.pipe, data->out_fd);
@@ -162,16 +304,22 @@ static void terminfo_stop(UI *ui)
{
TUIData *data = ui->data;
// Destroy output stuff
- tui_mode_change(ui, NORMAL);
+ tui_mode_change(ui, (String)STRING_INIT, SHAPE_IDX_N);
tui_mouse_off(ui);
unibi_out(ui, unibi_exit_attribute_mode);
- // cursor should be set to normal before exiting alternate screen
+ // Reset cursor to normal before exiting alternate screen.
unibi_out(ui, unibi_cursor_normal);
+ unibi_out(ui, unibi_keypad_local);
unibi_out(ui, unibi_exit_ca_mode);
+ // Restore title/icon from the "stack". #4063
+ unibi_out_ext(ui, data->unibi_ext.restore_title);
+ if (data->cursor_color_changed) {
+ unibi_out_ext(ui, data->unibi_ext.reset_cursor_color);
+ }
// Disable bracketed paste
- unibi_out(ui, data->unibi_ext.disable_bracketed_paste);
+ unibi_out_ext(ui, data->unibi_ext.disable_bracketed_paste);
// Disable focus reporting
- unibi_out(ui, data->unibi_ext.disable_focus_reporting);
+ unibi_out_ext(ui, data->unibi_ext.disable_focus_reporting);
flush_buf(ui);
uv_tty_reset_mode();
uv_close((uv_handle_t *)&data->output_handle, NULL);
@@ -185,7 +333,7 @@ static void terminfo_stop(UI *ui)
static void tui_terminal_start(UI *ui)
{
TUIData *data = ui->data;
- data->print_attrs = EMPTY_ATTRS;
+ data->print_attr_id = -1;
ugrid_init(&data->grid);
terminfo_start(ui);
update_size(ui);
@@ -193,9 +341,25 @@ static void tui_terminal_start(UI *ui)
term_input_start(&data->input);
}
+static void tui_terminal_after_startup(UI *ui)
+ FUNC_ATTR_NONNULL_ALL
+{
+ TUIData *data = ui->data;
+
+ // Emit this after Nvim startup, not during. This works around a tmux
+ // 2.3 bug(?) which caused slow drawing during startup. #7649
+ unibi_out_ext(ui, data->unibi_ext.enable_focus_reporting);
+}
+
static void tui_terminal_stop(UI *ui)
{
TUIData *data = ui->data;
+ if (uv_is_closing(STRUCT_CAST(uv_handle_t, &data->output_handle))) {
+ // Race between SIGCONT (tui.c) and SIGHUP (os/signal.c)? #8075
+ ELOG("TUI already stopped (race?)");
+ ui->data = NULL; // Flag UI as "stopped".
+ return;
+ }
term_input_stop(&data->input);
signal_watcher_stop(&data->winch_handle);
terminfo_stop(ui);
@@ -205,11 +369,16 @@ static void tui_terminal_stop(UI *ui)
static void tui_stop(UI *ui)
{
tui_terminal_stop(ui);
- TUIData *data = ui->data;
- data->stop = true;
+ ui->data = NULL; // Flag UI as "stopped".
}
-// Main function of the TUI thread
+/// Returns true if UI `ui` is stopped.
+static bool tui_is_stopped(UI *ui)
+{
+ return ui->data == NULL;
+}
+
+/// Main function of the TUI thread.
static void tui_main(UIBridgeData *bridge, UI *ui)
{
Loop tui_loop;
@@ -221,17 +390,38 @@ static void tui_main(UIBridgeData *bridge, UI *ui)
kv_init(data->invalid_regions);
signal_watcher_init(data->loop, &data->winch_handle, ui);
signal_watcher_init(data->loop, &data->cont_handle, data);
+#ifdef UNIX
signal_watcher_start(&data->cont_handle, sigcont_cb, SIGCONT);
- // initialize input reading structures
+#endif
+
+ // TODO(bfredl): zero hl is empty, send this explicitly?
+ kv_push(data->attrs, HLATTRS_INIT);
+
+#if TERMKEY_VERSION_MAJOR > 0 || TERMKEY_VERSION_MINOR > 18
+ data->input.tk_ti_hook_fn = tui_tk_ti_getstr;
+#endif
term_input_init(&data->input, &tui_loop);
tui_terminal_start(ui);
- data->stop = false;
- // allow the main thread to continue, we are ready to start handling UI
- // callbacks
+
+ // Allow main thread to continue, we are ready to handle UI callbacks.
CONTINUE(bridge);
- while (!data->stop) {
- loop_poll_events(&tui_loop, -1);
+ loop_schedule_deferred(&main_loop,
+ event_create(show_termcap_event, 1, data->ut));
+
+ // "Active" loop: first ~100 ms of startup.
+ for (size_t ms = 0; ms < 100 && !tui_is_stopped(ui);) {
+ ms += (loop_poll_events(&tui_loop, 20) ? 20 : 1);
+ }
+ if (!tui_is_stopped(ui)) {
+ tui_terminal_after_startup(ui);
+ // Tickle `main_loop` with a dummy event, else the initial "focus-gained"
+ // terminal response may not get processed until user hits a key.
+ loop_schedule_deferred(&main_loop, event_create(tui_dummy_event, 0));
+ }
+ // "Passive" (I/O-driven) loop: TUI thread "main loop".
+ while (!tui_is_stopped(ui)) {
+ loop_poll_events(&tui_loop, -1); // tui_loop.events is never processed
}
ui_bridge_stopped(bridge);
@@ -239,193 +429,551 @@ static void tui_main(UIBridgeData *bridge, UI *ui)
signal_watcher_stop(&data->cont_handle);
signal_watcher_close(&data->cont_handle, NULL);
signal_watcher_close(&data->winch_handle, NULL);
- loop_close(&tui_loop);
+ loop_close(&tui_loop, false);
kv_destroy(data->invalid_regions);
+ kv_destroy(data->attrs);
+ xfree(data->space_buf);
xfree(data);
- xfree(ui);
}
-static void tui_scheduler(Event event, void *d)
+static void tui_dummy_event(void **argv)
{
- UI *ui = d;
- TUIData *data = ui->data;
- loop_schedule(data->loop, event);
}
-static void refresh_event(void **argv)
+/// Handoff point between the main (ui_bridge) thread and the TUI thread.
+static void tui_scheduler(Event event, void *d)
{
- ui_refresh();
+ UI *ui = d;
+ TUIData *data = ui->data;
+ loop_schedule(data->loop, event); // `tui_loop` local to tui_main().
}
+#ifdef UNIX
static void sigcont_cb(SignalWatcher *watcher, int signum, void *data)
{
((TUIData *)data)->cont_received = true;
}
+#endif
static void sigwinch_cb(SignalWatcher *watcher, int signum, void *data)
{
got_winch = true;
UI *ui = data;
+ if (tui_is_stopped(ui)) {
+ return;
+ }
+
update_size(ui);
- // run refresh_event in nvim main loop
- loop_schedule(&main_loop, event_create(1, refresh_event, 0));
+ ui_schedule_refresh();
}
-static bool attrs_differ(HlAttrs a1, HlAttrs a2)
+static bool attrs_differ(UI *ui, int id1, int id2, bool rgb)
{
- return a1.foreground != a2.foreground || a1.background != a2.background
- || a1.bold != a2.bold || a1.italic != a2.italic
- || a1.undercurl != a2.undercurl || a1.underline != a2.underline
- || a1.reverse != a2.reverse;
+ TUIData *data = ui->data;
+ if (id1 == id2) {
+ return false;
+ } else if (id1 < 0 || id2 < 0) {
+ return true;
+ }
+ HlAttrs a1 = kv_A(data->attrs, (size_t)id1);
+ HlAttrs a2 = kv_A(data->attrs, (size_t)id2);
+
+ if (rgb) {
+ return a1.rgb_fg_color != a2.rgb_fg_color
+ || a1.rgb_bg_color != a2.rgb_bg_color
+ || a1.rgb_ae_attr != a2.rgb_ae_attr
+ || a1.rgb_sp_color != a2.rgb_sp_color;
+ } else {
+ return a1.cterm_fg_color != a2.cterm_fg_color
+ || a1.cterm_bg_color != a2.cterm_bg_color
+ || a1.cterm_ae_attr != a2.cterm_ae_attr
+ || (a1.cterm_ae_attr & (HL_UNDERLINE|HL_UNDERCURL)
+ && a1.rgb_sp_color != a2.rgb_sp_color);
+ }
}
-static void update_attrs(UI *ui, HlAttrs attrs)
+static void update_attrs(UI *ui, int attr_id)
{
TUIData *data = ui->data;
- if (!attrs_differ(attrs, data->print_attrs)) {
+ if (!attrs_differ(ui, attr_id, data->print_attr_id, ui->rgb)) {
+ data->print_attr_id = attr_id;
return;
}
+ data->print_attr_id = attr_id;
+ HlAttrs attrs = kv_A(data->attrs, (size_t)attr_id);
- data->print_attrs = attrs;
- unibi_out(ui, unibi_exit_attribute_mode);
- UGrid *grid = &data->grid;
+ int fg = ui->rgb ? attrs.rgb_fg_color : (attrs.cterm_fg_color - 1);
+ if (fg == -1) {
+ fg = ui->rgb ? data->clear_attrs.rgb_fg_color
+ : (data->clear_attrs.cterm_fg_color - 1);
+ }
- int fg = attrs.foreground != -1 ? attrs.foreground : grid->fg;
- int bg = attrs.background != -1 ? attrs.background : grid->bg;
+ int bg = ui->rgb ? attrs.rgb_bg_color : (attrs.cterm_bg_color - 1);
+ if (bg == -1) {
+ bg = ui->rgb ? data->clear_attrs.rgb_bg_color
+ : (data->clear_attrs.cterm_bg_color - 1);
+ }
+
+ int attr = ui->rgb ? attrs.rgb_ae_attr : attrs.cterm_ae_attr;
+ bool bold = attr & HL_BOLD;
+ bool italic = attr & HL_ITALIC;
+ bool reverse = attr & HL_INVERSE;
+ bool standout = attr & HL_STANDOUT;
+
+ bool underline;
+ bool undercurl;
+ if (data->unibi_ext.enter_undercurl_mode) {
+ underline = attr & HL_UNDERLINE;
+ undercurl = attr & HL_UNDERCURL;
+ } else {
+ underline = (attr & HL_UNDERLINE) || (attr & HL_UNDERCURL);
+ undercurl = false;
+ }
+ if (unibi_get_str(data->ut, unibi_set_attributes)) {
+ if (bold || reverse || underline || standout) {
+ UNIBI_SET_NUM_VAR(data->params[0], standout);
+ UNIBI_SET_NUM_VAR(data->params[1], underline);
+ UNIBI_SET_NUM_VAR(data->params[2], reverse);
+ UNIBI_SET_NUM_VAR(data->params[3], 0); // blink
+ UNIBI_SET_NUM_VAR(data->params[4], 0); // dim
+ UNIBI_SET_NUM_VAR(data->params[5], bold);
+ UNIBI_SET_NUM_VAR(data->params[6], 0); // blank
+ UNIBI_SET_NUM_VAR(data->params[7], 0); // protect
+ UNIBI_SET_NUM_VAR(data->params[8], 0); // alternate character set
+ unibi_out(ui, unibi_set_attributes);
+ } else if (!data->default_attr) {
+ unibi_out(ui, unibi_exit_attribute_mode);
+ }
+ } else {
+ if (!data->default_attr) {
+ unibi_out(ui, unibi_exit_attribute_mode);
+ }
+ if (bold) {
+ unibi_out(ui, unibi_enter_bold_mode);
+ }
+ if (underline) {
+ unibi_out(ui, unibi_enter_underline_mode);
+ }
+ if (standout) {
+ unibi_out(ui, unibi_enter_standout_mode);
+ }
+ if (reverse) {
+ unibi_out(ui, unibi_enter_reverse_mode);
+ }
+ }
+ if (italic) {
+ unibi_out(ui, unibi_enter_italics_mode);
+ }
+ if (undercurl && data->unibi_ext.enter_undercurl_mode) {
+ unibi_out_ext(ui, data->unibi_ext.enter_undercurl_mode);
+ }
+ if ((undercurl || underline) && data->unibi_ext.set_underline_color) {
+ int color = attrs.rgb_sp_color;
+ if (color != -1) {
+ UNIBI_SET_NUM_VAR(data->params[0], (color >> 16) & 0xff); // red
+ UNIBI_SET_NUM_VAR(data->params[1], (color >> 8) & 0xff); // green
+ UNIBI_SET_NUM_VAR(data->params[2], color & 0xff); // blue
+ unibi_out_ext(ui, data->unibi_ext.set_underline_color);
+ }
+ }
if (ui->rgb) {
if (fg != -1) {
- data->params[0].i = (fg >> 16) & 0xff; // red
- data->params[1].i = (fg >> 8) & 0xff; // green
- data->params[2].i = fg & 0xff; // blue
- unibi_out(ui, data->unibi_ext.set_rgb_foreground);
+ UNIBI_SET_NUM_VAR(data->params[0], (fg >> 16) & 0xff); // red
+ UNIBI_SET_NUM_VAR(data->params[1], (fg >> 8) & 0xff); // green
+ UNIBI_SET_NUM_VAR(data->params[2], fg & 0xff); // blue
+ unibi_out_ext(ui, data->unibi_ext.set_rgb_foreground);
}
if (bg != -1) {
- data->params[0].i = (bg >> 16) & 0xff; // red
- data->params[1].i = (bg >> 8) & 0xff; // green
- data->params[2].i = bg & 0xff; // blue
- unibi_out(ui, data->unibi_ext.set_rgb_background);
+ UNIBI_SET_NUM_VAR(data->params[0], (bg >> 16) & 0xff); // red
+ UNIBI_SET_NUM_VAR(data->params[1], (bg >> 8) & 0xff); // green
+ UNIBI_SET_NUM_VAR(data->params[2], bg & 0xff); // blue
+ unibi_out_ext(ui, data->unibi_ext.set_rgb_background);
}
} else {
if (fg != -1) {
- data->params[0].i = fg;
+ UNIBI_SET_NUM_VAR(data->params[0], fg);
unibi_out(ui, unibi_set_a_foreground);
}
if (bg != -1) {
- data->params[0].i = bg;
+ UNIBI_SET_NUM_VAR(data->params[0], bg);
unibi_out(ui, unibi_set_a_background);
}
}
- if (attrs.bold) {
- unibi_out(ui, unibi_enter_bold_mode);
- }
- if (attrs.italic) {
- unibi_out(ui, unibi_enter_italics_mode);
- }
- if (attrs.underline || attrs.undercurl) {
- unibi_out(ui, unibi_enter_underline_mode);
- }
- if (attrs.reverse) {
- unibi_out(ui, unibi_enter_reverse_mode);
+ data->default_attr = fg == -1 && bg == -1
+ && !bold && !italic && !underline && !undercurl && !reverse && !standout;
+
+ // Non-BCE terminals can't clear with non-default background color. Some BCE
+ // terminals don't support attributes either, so don't rely on it. But assume
+ // italic and bold has no effect if there is no text.
+ data->can_clear_attr = !reverse && !standout && !underline && !undercurl
+ && (data->bce || bg == -1);
+}
+
+static void final_column_wrap(UI *ui)
+{
+ TUIData *data = ui->data;
+ UGrid *grid = &data->grid;
+ if (grid->row != -1 && grid->col == ui->width) {
+ grid->col = 0;
+ if (grid->row < MIN(ui->height, grid->height - 1)) {
+ grid->row++;
+ }
}
}
+/// It is undocumented, but in the majority of terminals and terminal emulators
+/// printing at the right margin does not cause an automatic wrap until the
+/// next character is printed, holding the cursor in place until then.
static void print_cell(UI *ui, UCell *ptr)
{
- update_attrs(ui, ptr->attrs);
+ TUIData *data = ui->data;
+ UGrid *grid = &data->grid;
+ if (!data->immediate_wrap_after_last_column) {
+ // Printing the next character finally advances the cursor.
+ final_column_wrap(ui);
+ }
+ update_attrs(ui, ptr->attr);
out(ui, ptr->data, strlen(ptr->data));
+ grid->col++;
+ if (data->immediate_wrap_after_last_column) {
+ // Printing at the right margin immediately advances the cursor.
+ final_column_wrap(ui);
+ }
}
-static void clear_region(UI *ui, int top, int bot, int left, int right)
+static bool cheap_to_print(UI *ui, int row, int col, int next)
{
TUIData *data = ui->data;
UGrid *grid = &data->grid;
+ UCell *cell = grid->cells[row] + col;
+ while (next) {
+ next--;
+ if (attrs_differ(ui, cell->attr,
+ data->print_attr_id, ui->rgb)) {
+ if (data->default_attr) {
+ return false;
+ }
+ }
+ if (strlen(cell->data) > 1) {
+ return false;
+ }
+ cell++;
+ }
+ return true;
+}
- bool cleared = false;
- if (grid->bg == -1 && right == ui->width -1) {
- // Background is set to the default color and the right edge matches the
- // screen end, try to use terminal codes for clearing the requested area.
- HlAttrs clear_attrs = EMPTY_ATTRS;
- clear_attrs.foreground = grid->fg;
- clear_attrs.background = grid->bg;
- update_attrs(ui, clear_attrs);
- if (left == 0) {
- if (bot == ui->height - 1) {
- if (top == 0) {
- unibi_out(ui, unibi_clear_screen);
- } else {
- unibi_goto(ui, top, 0);
- unibi_out(ui, unibi_clr_eos);
+/// This optimizes several cases where it is cheaper to do something other
+/// than send a full cursor positioning control sequence. However, there are
+/// some further optimizations that may seem obvious but that will not work.
+///
+/// We cannot use VT (ASCII 0/11) for moving the cursor up, because VT means
+/// move the cursor down on a DEC terminal. Similarly, on a DEC terminal FF
+/// (ASCII 0/12) means the same thing and does not mean home. VT, CVT, and
+/// TAB also stop at software-defined tabulation stops, not at a fixed set
+/// of row/column positions.
+static void cursor_goto(UI *ui, int row, int col)
+{
+ TUIData *data = ui->data;
+ UGrid *grid = &data->grid;
+ if (row == grid->row && col == grid->col) {
+ return;
+ }
+ if (0 == row && 0 == col) {
+ unibi_out(ui, unibi_cursor_home);
+ ugrid_goto(grid, row, col);
+ return;
+ }
+ if (grid->row == -1) {
+ goto safe_move;
+ }
+ if (0 == col ? col != grid->col :
+ row != grid->row ? false :
+ 1 == col ? 2 < grid->col && cheap_to_print(ui, grid->row, 0, col) :
+ 2 == col ? 5 < grid->col && cheap_to_print(ui, grid->row, 0, col) :
+ false) {
+ // Motion to left margin from anywhere else, or CR + printing chars is
+ // even less expensive than using BSes or CUB.
+ unibi_out(ui, unibi_carriage_return);
+ ugrid_goto(grid, grid->row, 0);
+ } else if (col > grid->col) {
+ int n = col - grid->col;
+ if (n <= (row == grid->row ? 4 : 2)
+ && cheap_to_print(ui, grid->row, grid->col, n)) {
+ UGRID_FOREACH_CELL(grid, grid->row, grid->col, col, {
+ print_cell(ui, cell);
+ });
+ }
+ }
+ if (row == grid->row) {
+ if (col < grid->col
+ // Deferred right margin wrap terminals have inconsistent ideas about
+ // where the cursor actually is during a deferred wrap. Relative
+ // motion calculations have OBOEs that cannot be compensated for,
+ // because two terminals that claim to be the same will implement
+ // different cursor positioning rules.
+ && (data->immediate_wrap_after_last_column || grid->col < ui->width)) {
+ int n = grid->col - col;
+ if (n <= 4) { // This might be just BS, so it is considered really cheap.
+ while (n--) {
+ unibi_out(ui, unibi_cursor_left);
}
- cleared = true;
+ } else {
+ UNIBI_SET_NUM_VAR(data->params[0], n);
+ unibi_out(ui, unibi_parm_left_cursor);
}
+ ugrid_goto(grid, row, col);
+ return;
+ } else if (col > grid->col) {
+ int n = col - grid->col;
+ if (n <= 2) {
+ while (n--) {
+ unibi_out(ui, unibi_cursor_right);
+ }
+ } else {
+ UNIBI_SET_NUM_VAR(data->params[0], n);
+ unibi_out(ui, unibi_parm_right_cursor);
+ }
+ ugrid_goto(grid, row, col);
+ return;
+ }
+ }
+ if (col == grid->col) {
+ if (row > grid->row) {
+ int n = row - grid->row;
+ if (n <= 4) { // This might be just LF, so it is considered really cheap.
+ while (n--) {
+ unibi_out(ui, unibi_cursor_down);
+ }
+ } else {
+ UNIBI_SET_NUM_VAR(data->params[0], n);
+ unibi_out(ui, unibi_parm_down_cursor);
+ }
+ ugrid_goto(grid, row, col);
+ return;
+ } else if (row < grid->row) {
+ int n = grid->row - row;
+ if (n <= 2) {
+ while (n--) {
+ unibi_out(ui, unibi_cursor_up);
+ }
+ } else {
+ UNIBI_SET_NUM_VAR(data->params[0], n);
+ unibi_out(ui, unibi_parm_up_cursor);
+ }
+ ugrid_goto(grid, row, col);
+ return;
+ }
+ }
+
+safe_move:
+ unibi_goto(ui, row, col);
+ ugrid_goto(grid, row, col);
+}
+
+static void clear_region(UI *ui, int top, int bot, int left, int right,
+ int attr_id)
+{
+ TUIData *data = ui->data;
+ UGrid *grid = &data->grid;
+
+ update_attrs(ui, attr_id);
+
+ // Background is set to the default color and the right edge matches the
+ // screen end, try to use terminal codes for clearing the requested area.
+ if (data->can_clear_attr
+ && left == 0 && right == ui->width && bot == ui->height) {
+ if (top == 0) {
+ unibi_out(ui, unibi_clear_screen);
+ ugrid_goto(&data->grid, top, left);
+ } else {
+ cursor_goto(ui, top, 0);
+ unibi_out(ui, unibi_clr_eos);
}
+ } else {
+ int width = right-left;
- if (!cleared) {
- // iterate through each line and clear with clr_eol
- for (int row = top; row <= bot; ++row) {
- unibi_goto(ui, row, left);
+ // iterate through each line and clear
+ for (int row = top; row < bot; row++) {
+ cursor_goto(ui, row, left);
+ if (data->can_clear_attr && right == ui->width) {
unibi_out(ui, unibi_clr_eol);
+ } else if (data->can_erase_chars && data->can_clear_attr && width >= 5) {
+ UNIBI_SET_NUM_VAR(data->params[0], width);
+ unibi_out(ui, unibi_erase_chars);
+ } else {
+ out(ui, data->space_buf, (size_t)width);
+ grid->col += width;
+ if (data->immediate_wrap_after_last_column) {
+ // Printing at the right margin immediately advances the cursor.
+ final_column_wrap(ui);
+ }
}
- cleared = true;
}
}
+}
- if (!cleared) {
- // could not clear using faster terminal codes, refresh the whole region
- int currow = -1;
- UGRID_FOREACH_CELL(grid, top, bot, left, right, {
- if (currow != row) {
- unibi_goto(ui, row, col);
- currow = row;
- }
- print_cell(ui, cell);
- });
+static void set_scroll_region(UI *ui, int top, int bot, int left, int right)
+{
+ TUIData *data = ui->data;
+ UGrid *grid = &data->grid;
+
+ UNIBI_SET_NUM_VAR(data->params[0], top);
+ UNIBI_SET_NUM_VAR(data->params[1], bot);
+ unibi_out(ui, unibi_change_scroll_region);
+ if (left != 0 || right != ui->width - 1) {
+ unibi_out_ext(ui, data->unibi_ext.enable_lr_margin);
+ if (data->can_set_lr_margin) {
+ UNIBI_SET_NUM_VAR(data->params[0], left);
+ UNIBI_SET_NUM_VAR(data->params[1], right);
+ unibi_out(ui, unibi_set_lr_margin);
+ } else {
+ UNIBI_SET_NUM_VAR(data->params[0], left);
+ unibi_out(ui, unibi_set_left_margin_parm);
+ UNIBI_SET_NUM_VAR(data->params[0], right);
+ unibi_out(ui, unibi_set_right_margin_parm);
+ }
}
+ grid->row = -1;
+}
- // restore cursor
- unibi_goto(ui, grid->row, grid->col);
+static void reset_scroll_region(UI *ui, bool fullwidth)
+{
+ TUIData *data = ui->data;
+ UGrid *grid = &data->grid;
+
+ if (0 <= data->unibi_ext.reset_scroll_region) {
+ unibi_out_ext(ui, data->unibi_ext.reset_scroll_region);
+ } else {
+ UNIBI_SET_NUM_VAR(data->params[0], 0);
+ UNIBI_SET_NUM_VAR(data->params[1], ui->height - 1);
+ unibi_out(ui, unibi_change_scroll_region);
+ }
+ if (!fullwidth) {
+ if (data->can_set_lr_margin) {
+ UNIBI_SET_NUM_VAR(data->params[0], 0);
+ UNIBI_SET_NUM_VAR(data->params[1], ui->width - 1);
+ unibi_out(ui, unibi_set_lr_margin);
+ } else {
+ UNIBI_SET_NUM_VAR(data->params[0], 0);
+ unibi_out(ui, unibi_set_left_margin_parm);
+ UNIBI_SET_NUM_VAR(data->params[0], ui->width - 1);
+ unibi_out(ui, unibi_set_right_margin_parm);
+ }
+ unibi_out_ext(ui, data->unibi_ext.disable_lr_margin);
+ }
+ grid->row = -1;
}
-static void tui_resize(UI *ui, int width, int height)
+static void tui_grid_resize(UI *ui, Integer g, Integer width, Integer height)
{
TUIData *data = ui->data;
- ugrid_resize(&data->grid, width, height);
+ UGrid *grid = &data->grid;
+ ugrid_resize(grid, (int)width, (int)height);
+
+ xfree(data->space_buf);
+ data->space_buf = xmalloc((size_t)width * sizeof(*data->space_buf));
+ memset(data->space_buf, ' ', (size_t)width);
+
+ // resize might not always be followed by a clear before flush
+ // so clip the invalid region
+ for (size_t i = 0; i < kv_size(data->invalid_regions); i++) {
+ Rect *r = &kv_A(data->invalid_regions, i);
+ r->bot = MIN(r->bot, grid->height);
+ r->right = MIN(r->right, grid->width);
+ }
if (!got_winch) { // Try to resize the terminal window.
- char r[16]; // enough for 9999x9999
- snprintf(r, sizeof(r), "\x1b[8;%d;%dt", height, width);
- out(ui, r, strlen(r));
+ UNIBI_SET_NUM_VAR(data->params[0], (int)height);
+ UNIBI_SET_NUM_VAR(data->params[1], (int)width);
+ unibi_out_ext(ui, data->unibi_ext.resize_screen);
+ // DECSLPP does not reset the scroll region.
+ if (data->scroll_region_is_full_screen) {
+ reset_scroll_region(ui, ui->width == grid->width);
+ }
} else { // Already handled the SIGWINCH signal; avoid double-resize.
got_winch = false;
+ grid->row = -1;
}
}
-static void tui_clear(UI *ui)
+static void tui_grid_clear(UI *ui, Integer g)
{
TUIData *data = ui->data;
UGrid *grid = &data->grid;
ugrid_clear(grid);
- clear_region(ui, grid->top, grid->bot, grid->left, grid->right);
+ kv_size(data->invalid_regions) = 0;
+ clear_region(ui, 0, grid->height, 0, grid->width, 0);
}
-static void tui_eol_clear(UI *ui)
+static void tui_grid_cursor_goto(UI *ui, Integer grid, Integer row, Integer col)
{
TUIData *data = ui->data;
- UGrid *grid = &data->grid;
- ugrid_eol_clear(grid);
- clear_region(ui, grid->row, grid->row, grid->col, grid->right);
+
+ // cursor position is validated in tui_flush
+ data->row = (int)row;
+ data->col = (int)col;
+}
+
+CursorShape tui_cursor_decode_shape(const char *shape_str)
+{
+ CursorShape shape;
+ if (strequal(shape_str, "block")) {
+ shape = SHAPE_BLOCK;
+ } else if (strequal(shape_str, "vertical")) {
+ shape = SHAPE_VER;
+ } else if (strequal(shape_str, "horizontal")) {
+ shape = SHAPE_HOR;
+ } else {
+ WLOG("Unknown shape value '%s'", shape_str);
+ shape = SHAPE_BLOCK;
+ }
+ return shape;
}
-static void tui_cursor_goto(UI *ui, int row, int col)
+static cursorentry_T decode_cursor_entry(Dictionary args)
{
+ cursorentry_T r = shape_table[0];
+
+ for (size_t i = 0; i < args.size; i++) {
+ char *key = args.items[i].key.data;
+ Object value = args.items[i].value;
+
+ if (strequal(key, "cursor_shape")) {
+ r.shape = tui_cursor_decode_shape(args.items[i].value.data.string.data);
+ } else if (strequal(key, "blinkon")) {
+ r.blinkon = (int)value.data.integer;
+ } else if (strequal(key, "blinkoff")) {
+ r.blinkoff = (int)value.data.integer;
+ } else if (strequal(key, "attr_id")) {
+ r.id = (int)value.data.integer;
+ }
+ }
+ return r;
+}
+
+static void tui_mode_info_set(UI *ui, bool guicursor_enabled, Array args)
+{
+ cursor_style_enabled = guicursor_enabled;
+ if (!guicursor_enabled) {
+ return; // Do not send cursor style control codes.
+ }
TUIData *data = ui->data;
- ugrid_goto(&data->grid, row, col);
- unibi_goto(ui, row, col);
+
+ assert(args.size);
+
+ // cursor style entries as defined by `shape_table`.
+ for (size_t i = 0; i < args.size; i++) {
+ assert(args.items[i].type == kObjectTypeDictionary);
+ cursorentry_T r = decode_cursor_entry(args.items[i].data.dictionary);
+ data->cursor_shapes[i] = r;
+ }
+
+ tui_set_mode(ui, data->showing_mode);
}
static void tui_update_menu(UI *ui)
@@ -446,119 +994,130 @@ static void tui_busy_stop(UI *ui)
static void tui_mouse_on(UI *ui)
{
TUIData *data = ui->data;
- unibi_out(ui, data->unibi_ext.enable_mouse);
- data->mouse_enabled = true;
+ if (!data->mouse_enabled) {
+ unibi_out_ext(ui, data->unibi_ext.enable_mouse);
+ data->mouse_enabled = true;
+ }
}
static void tui_mouse_off(UI *ui)
{
TUIData *data = ui->data;
- unibi_out(ui, data->unibi_ext.disable_mouse);
- data->mouse_enabled = false;
+ if (data->mouse_enabled) {
+ unibi_out_ext(ui, data->unibi_ext.disable_mouse);
+ data->mouse_enabled = false;
+ }
}
-static void tui_mode_change(UI *ui, int mode)
+static void tui_set_mode(UI *ui, ModeShape mode)
{
+ if (!cursor_style_enabled) {
+ return;
+ }
TUIData *data = ui->data;
-
- if (mode == INSERT) {
- if (data->showing_mode != INSERT) {
- unibi_out(ui, data->unibi_ext.enter_insert_mode);
- }
- } else if (mode == REPLACE) {
- if (data->showing_mode != REPLACE) {
- unibi_out(ui, data->unibi_ext.enter_replace_mode);
- }
- } else {
- assert(mode == NORMAL);
- if (data->showing_mode != NORMAL) {
- unibi_out(ui, data->unibi_ext.exit_insert_mode);
+ cursorentry_T c = data->cursor_shapes[mode];
+
+ if (c.id != 0 && c.id < (int)kv_size(data->attrs) && ui->rgb) {
+ HlAttrs aep = kv_A(data->attrs, c.id);
+ if (aep.rgb_ae_attr & HL_INVERSE) {
+ // We interpret "inverse" as "default" (no termcode for "inverse"...).
+ // Hopefully the user's default cursor color is inverse.
+ unibi_out_ext(ui, data->unibi_ext.reset_cursor_color);
+ } else {
+ UNIBI_SET_NUM_VAR(data->params[0], aep.rgb_bg_color);
+ unibi_out_ext(ui, data->unibi_ext.set_cursor_color);
+ data->cursor_color_changed = true;
}
+ } else if (c.id == 0) {
+ // No cursor color for this mode; reset to default.
+ unibi_out_ext(ui, data->unibi_ext.reset_cursor_color);
+ }
+
+ int shape;
+ switch (c.shape) {
+ default: abort(); break;
+ case SHAPE_BLOCK: shape = 1; break;
+ case SHAPE_HOR: shape = 3; break;
+ case SHAPE_VER: shape = 5; break;
}
- data->showing_mode = mode;
+ UNIBI_SET_NUM_VAR(data->params[0], shape + (int)(c.blinkon == 0));
+ unibi_out_ext(ui, data->unibi_ext.set_cursor_style);
}
-static void tui_set_scroll_region(UI *ui, int top, int bot, int left,
- int right)
+/// @param mode editor mode
+static void tui_mode_change(UI *ui, String mode, Integer mode_idx)
{
TUIData *data = ui->data;
- ugrid_set_scroll_region(&data->grid, top, bot, left, right);
- data->can_use_terminal_scroll =
- left == 0 && right == ui->width - 1
- && ((top == 0 && bot == ui->height - 1)
- || unibi_get_str(data->ut, unibi_change_scroll_region));
+ tui_set_mode(ui, (ModeShape)mode_idx);
+ data->showing_mode = (ModeShape)mode_idx;
}
-static void tui_scroll(UI *ui, int count)
+static void tui_grid_scroll(UI *ui, Integer g, Integer startrow, Integer endrow,
+ Integer startcol, Integer endcol,
+ Integer rows, Integer cols)
{
+ (void)cols; // unused
TUIData *data = ui->data;
UGrid *grid = &data->grid;
- int clear_top, clear_bot;
- ugrid_scroll(grid, count, &clear_top, &clear_bot);
+ int top = (int)startrow, bot = (int)endrow-1;
+ int left = (int)startcol, right = (int)endcol-1;
- if (data->can_use_terminal_scroll) {
+ bool fullwidth = left == 0 && right == ui->width-1;
+ data->scroll_region_is_full_screen = fullwidth
+ && top == 0 && bot == ui->height-1;
+
+ ugrid_scroll(grid, top, bot, left, right, (int)rows);
+
+ bool can_scroll = data->can_scroll
+ && (data->scroll_region_is_full_screen
+ || (data->can_change_scroll_region
+ && ((left == 0 && right == ui->width - 1)
+ || data->can_set_lr_margin
+ || data->can_set_left_right_margin)));
+
+ if (can_scroll) {
// Change terminal scroll region and move cursor to the top
- data->params[0].i = grid->top;
- data->params[1].i = grid->bot;
- unibi_out(ui, unibi_change_scroll_region);
- unibi_goto(ui, grid->top, grid->left);
- // also set default color attributes or some terminals can become funny
- HlAttrs clear_attrs = EMPTY_ATTRS;
- clear_attrs.foreground = grid->fg;
- clear_attrs.background = grid->bg;
- update_attrs(ui, clear_attrs);
- }
+ if (!data->scroll_region_is_full_screen) {
+ set_scroll_region(ui, top, bot, left, right);
+ }
+ cursor_goto(ui, top, left);
- if (count > 0) {
- if (data->can_use_terminal_scroll) {
- if (count == 1) {
+ if (rows > 0) {
+ if (rows == 1) {
unibi_out(ui, unibi_delete_line);
} else {
- data->params[0].i = count;
+ UNIBI_SET_NUM_VAR(data->params[0], (int)rows);
unibi_out(ui, unibi_parm_delete_line);
}
- }
-
- } else {
- if (data->can_use_terminal_scroll) {
- if (count == -1) {
+ } else {
+ if (rows == -1) {
unibi_out(ui, unibi_insert_line);
} else {
- data->params[0].i = -count;
+ UNIBI_SET_NUM_VAR(data->params[0], -(int)rows);
unibi_out(ui, unibi_parm_insert_line);
}
}
- }
- if (data->can_use_terminal_scroll) {
// Restore terminal scroll region and cursor
- data->params[0].i = 0;
- data->params[1].i = ui->height - 1;
- unibi_out(ui, unibi_change_scroll_region);
- unibi_goto(ui, grid->row, grid->col);
-
- if (grid->bg != -1) {
- // Update the cleared area of the terminal if its builtin scrolling
- // facility was used and the background color is not the default. This is
- // required because scrolling may leave wrong background in the cleared
- // area.
- clear_region(ui, clear_top, clear_bot, grid->left, grid->right);
+ if (!data->scroll_region_is_full_screen) {
+ reset_scroll_region(ui, fullwidth);
}
} else {
- // Mark the entire scroll region as invalid for redrawing later
- invalidate(ui, grid->top, grid->bot, grid->left, grid->right);
+ // Mark the moved region as invalid for redrawing later
+ if (rows > 0) {
+ endrow = endrow - rows;
+ } else {
+ startrow = startrow - rows;
+ }
+ invalidate(ui, (int)startrow, (int)endrow, (int)startcol, (int)endcol);
}
}
-static void tui_highlight_set(UI *ui, HlAttrs attrs)
-{
- ((TUIData *)ui->data)->grid.attrs = attrs;
-}
-
-static void tui_put(UI *ui, uint8_t *text, size_t size)
+static void tui_hl_attr_define(UI *ui, Integer id, HlAttrs attrs,
+ HlAttrs cterm_attrs, Array info)
{
TUIData *data = ui->data;
- print_cell(ui, ugrid_put(&data->grid, text, size));
+ kv_a(data->attrs, (size_t)id) = attrs;
}
static void tui_bell(UI *ui)
@@ -571,19 +1130,20 @@ static void tui_visual_bell(UI *ui)
unibi_out(ui, unibi_flash_screen);
}
-static void tui_update_fg(UI *ui, int fg)
+static void tui_default_colors_set(UI *ui, Integer rgb_fg, Integer rgb_bg,
+ Integer rgb_sp,
+ Integer cterm_fg, Integer cterm_bg)
{
- ((TUIData *)ui->data)->grid.fg = fg;
-}
+ TUIData *data = ui->data;
-static void tui_update_bg(UI *ui, int bg)
-{
- ((TUIData *)ui->data)->grid.bg = bg;
-}
+ data->clear_attrs.rgb_fg_color = (int)rgb_fg;
+ data->clear_attrs.rgb_bg_color = (int)rgb_bg;
+ data->clear_attrs.rgb_sp_color = (int)rgb_sp;
+ data->clear_attrs.cterm_fg_color = (int)cterm_fg;
+ data->clear_attrs.cterm_bg_color = (int)cterm_bg;
-static void tui_update_sp(UI *ui, int sp)
-{
- // Do nothing; 'special' color is for GUI only
+ data->print_attr_id = -1;
+ invalidate(ui, 0, data->grid.height, 0, data->grid.width);
}
static void tui_flush(UI *ui)
@@ -591,23 +1151,67 @@ static void tui_flush(UI *ui)
TUIData *data = ui->data;
UGrid *grid = &data->grid;
+ size_t nrevents = loop_size(data->loop);
+ if (nrevents > TOO_MANY_EVENTS) {
+ WLOG("TUI event-queue flooded (thread_events=%zu); purging", nrevents);
+ // Back-pressure: UI events may accumulate much faster than the terminal
+ // device can serve them. Even if SIGINT/CTRL-C is received, user must still
+ // wait for the TUI event-queue to drain, and if there are ~millions of
+ // events in the queue, it could take hours. Clearing the queue allows the
+ // UI to recover. #1234 #5396
+ loop_purge(data->loop);
+ tui_busy_stop(ui); // avoid hidden cursor
+ }
+
while (kv_size(data->invalid_regions)) {
Rect r = kv_pop(data->invalid_regions);
- int currow = -1;
- UGRID_FOREACH_CELL(grid, r.top, r.bot, r.left, r.right, {
- if (currow != row) {
- unibi_goto(ui, row, col);
- currow = row;
+ assert(r.bot <= grid->height && r.right <= grid->width);
+
+ for (int row = r.top; row < r.bot; row++) {
+ int clear_attr = grid->cells[row][r.right-1].attr;
+ int clear_col;
+ for (clear_col = r.right; clear_col > 0; clear_col--) {
+ UCell *cell = &grid->cells[row][clear_col-1];
+ if (!(cell->data[0] == ' ' && cell->data[1] == NUL
+ && cell->attr == clear_attr)) {
+ break;
+ }
+ }
+
+ UGRID_FOREACH_CELL(grid, row, r.left, clear_col, {
+ cursor_goto(ui, row, curcol);
+ print_cell(ui, cell);
+ });
+ if (clear_col < r.right) {
+ clear_region(ui, row, row+1, clear_col, r.right, clear_attr);
}
- print_cell(ui, cell);
- });
+ }
}
- unibi_goto(ui, grid->row, grid->col);
+ cursor_goto(ui, data->row, data->col);
flush_buf(ui);
}
+/// Dumps termcap info to the messages area, if 'verbose' >= 3.
+static void show_termcap_event(void **argv)
+{
+ if (p_verbose < 3) {
+ return;
+ }
+ const unibi_term *const ut = argv[0];
+ if (!ut) {
+ abort();
+ }
+ verbose_enter();
+ // XXX: (future) if unibi_term is modified (e.g. after a terminal
+ // query-response) this is a race condition.
+ terminfo_info_msg(ut);
+ verbose_leave();
+ verbose_stop(); // flush now
+}
+
+#ifdef UNIX
static void suspend_event(void **argv)
{
UI *ui = argv[0];
@@ -615,70 +1219,118 @@ static void suspend_event(void **argv)
bool enable_mouse = data->mouse_enabled;
tui_terminal_stop(ui);
data->cont_received = false;
+ stream_set_blocking(input_global_fd(), true); // normalize stream (#2598)
kill(0, SIGTSTP);
while (!data->cont_received) {
// poll the event loop until SIGCONT is received
loop_poll_events(data->loop, -1);
}
tui_terminal_start(ui);
+ tui_terminal_after_startup(ui);
if (enable_mouse) {
tui_mouse_on(ui);
}
+ stream_set_blocking(input_global_fd(), false); // libuv expects this
// resume the main thread
CONTINUE(data->bridge);
}
+#endif
static void tui_suspend(UI *ui)
{
+#ifdef UNIX
TUIData *data = ui->data;
// kill(0, SIGTSTP) won't stop the UI thread, so we must poll for SIGCONT
// before continuing. This is done in another callback to avoid
// loop_poll_events recursion
- queue_put_event(data->loop->fast_events,
- event_create(1, suspend_event, 1, ui));
+ multiqueue_put_event(data->loop->fast_events,
+ event_create(suspend_event, 1, ui));
+#endif
}
-static void tui_set_title(UI *ui, char *title)
+static void tui_set_title(UI *ui, String title)
{
TUIData *data = ui->data;
- if (!(title && unibi_get_str(data->ut, unibi_to_status_line)
+ if (!(title.data && unibi_get_str(data->ut, unibi_to_status_line)
&& unibi_get_str(data->ut, unibi_from_status_line))) {
return;
}
unibi_out(ui, unibi_to_status_line);
- out(ui, title, strlen(title));
+ out(ui, title.data, title.size);
unibi_out(ui, unibi_from_status_line);
}
-static void tui_set_icon(UI *ui, char *icon)
+static void tui_set_icon(UI *ui, String icon)
{
}
+static void tui_option_set(UI *ui, String name, Object value)
+{
+ TUIData *data = ui->data;
+ if (strequal(name.data, "termguicolors")) {
+ ui->rgb = value.data.boolean;
+
+ data->print_attr_id = -1;
+ invalidate(ui, 0, data->grid.height, 0, data->grid.width);
+ }
+}
+
+static void tui_raw_line(UI *ui, Integer g, Integer linerow, Integer startcol,
+ Integer endcol, Integer clearcol, Integer clearattr,
+ Boolean wrap, const schar_T *chunk,
+ const sattr_T *attrs)
+{
+ TUIData *data = ui->data;
+ UGrid *grid = &data->grid;
+ for (Integer c = startcol; c < endcol; c++) {
+ memcpy(grid->cells[linerow][c].data, chunk[c-startcol], sizeof(schar_T));
+ assert((size_t)attrs[c-startcol] < kv_size(data->attrs));
+ grid->cells[linerow][c].attr = attrs[c-startcol];
+ }
+ UGRID_FOREACH_CELL(grid, (int)linerow, (int)startcol, (int)endcol, {
+ cursor_goto(ui, (int)linerow, curcol);
+ print_cell(ui, cell);
+ });
+
+ if (clearcol > endcol) {
+ ugrid_clear_chunk(grid, (int)linerow, (int)endcol, (int)clearcol,
+ (sattr_T)clearattr);
+ clear_region(ui, (int)linerow, (int)linerow+1, (int)endcol, (int)clearcol,
+ (int)clearattr);
+ }
+
+ if (wrap && ui->width == grid->width && linerow + 1 < grid->height) {
+ // Only do line wrapping if the grid width is equal to the terminal
+ // width and the line continuation is within the grid.
+
+ if (endcol != grid->width) {
+ // Print the last char of the row, if we haven't already done so.
+ int size = grid->cells[linerow][grid->width - 1].data[0] == NUL ? 2 : 1;
+ cursor_goto(ui, (int)linerow, grid->width - size);
+ print_cell(ui, &grid->cells[linerow][grid->width - size]);
+ }
+
+ // Wrap the cursor over to the next line. The next line will be
+ // printed immediately without an intervening newline.
+ final_column_wrap(ui);
+ }
+}
+
static void invalidate(UI *ui, int top, int bot, int left, int right)
{
TUIData *data = ui->data;
Rect *intersects = NULL;
- // Increase dimensions before comparing to ensure adjacent regions are
- // treated as intersecting
- --top;
- ++bot;
- --left;
- ++right;
for (size_t i = 0; i < kv_size(data->invalid_regions); i++) {
Rect *r = &kv_A(data->invalid_regions, i);
- if (!(top > r->bot || bot < r->top
- || left > r->right || right < r->left)) {
+ // adjacent regions are treated as overlapping
+ if (!(top > r->bot || bot < r->top)
+ && !(left > r->right || right < r->left)) {
intersects = r;
break;
}
}
- ++top;
- --bot;
- ++left;
- --right;
-
if (intersects) {
// If top/bot/left/right intersects with a invalid rect, we replace it
// by the union
@@ -740,39 +1392,61 @@ end:
static void unibi_goto(UI *ui, int row, int col)
{
TUIData *data = ui->data;
- data->params[0].i = row;
- data->params[1].i = col;
+ UNIBI_SET_NUM_VAR(data->params[0], row);
+ UNIBI_SET_NUM_VAR(data->params[1], col);
unibi_out(ui, unibi_cursor_address);
}
+#define UNIBI_OUT(fn) \
+ do { \
+ TUIData *data = ui->data; \
+ const char *str = NULL; \
+ if (unibi_index >= 0) { \
+ str = fn(data->ut, (unsigned)unibi_index); \
+ } \
+ if (str) { \
+ unibi_var_t vars[26 + 26]; \
+ size_t orig_pos = data->bufpos; \
+ \
+ memset(&vars, 0, sizeof(vars)); \
+ data->cork = true; \
+retry: \
+ unibi_format(vars, vars + 26, str, data->params, out, ui, NULL, NULL); \
+ if (data->overflow) { \
+ data->bufpos = orig_pos; \
+ flush_buf(ui); \
+ goto retry; \
+ } \
+ data->cork = false; \
+ } \
+ } while (0)
static void unibi_out(UI *ui, int unibi_index)
{
- TUIData *data = ui->data;
-
- const char *str = NULL;
-
- if (unibi_index >= 0) {
- if (unibi_index < unibi_string_begin_) {
- str = unibi_get_ext_str(data->ut, (unsigned)unibi_index);
- } else {
- str = unibi_get_str(data->ut, (unsigned)unibi_index);
- }
- }
-
- if (str) {
- unibi_var_t vars[26 + 26] = {{0}};
- unibi_format(vars, vars + 26, str, data->params, out, ui, NULL, NULL);
- }
+ UNIBI_OUT(unibi_get_str);
}
+static void unibi_out_ext(UI *ui, int unibi_index)
+{
+ UNIBI_OUT(unibi_get_ext_str);
+}
+#undef UNIBI_OUT
static void out(void *ctx, const char *str, size_t len)
{
UI *ui = ctx;
TUIData *data = ui->data;
- size_t available = data->bufsize - data->bufpos;
+ size_t available = sizeof(data->buf) - data->bufpos;
+
+ if (data->cork && data->overflow) {
+ return;
+ }
if (len > available) {
- flush_buf(ui);
+ if (data->cork) {
+ data->overflow = true;
+ return;
+ } else {
+ flush_buf(ui);
+ }
}
memcpy(data->buf + data->bufpos, str, len);
@@ -787,152 +1461,555 @@ static void unibi_set_if_empty(unibi_term *ut, enum unibi_string str,
}
}
-static void fix_terminfo(TUIData *data)
+static int unibi_find_ext_str(unibi_term *ut, const char *name)
+{
+ size_t max = unibi_count_ext_str(ut);
+ for (size_t i = 0; i < max; i++) {
+ const char * n = unibi_get_ext_str_name(ut, i);
+ if (n && 0 == strcmp(n, name)) {
+ return (int)i;
+ }
+ }
+ return -1;
+}
+
+static int unibi_find_ext_bool(unibi_term *ut, const char *name)
+{
+ size_t max = unibi_count_ext_bool(ut);
+ for (size_t i = 0; i < max; i++) {
+ const char * n = unibi_get_ext_bool_name(ut, i);
+ if (n && 0 == strcmp(n, name)) {
+ return (int)i;
+ }
+ }
+ return -1;
+}
+
+/// Patches the terminfo records after loading from system or built-in db.
+/// Several entries in terminfo are known to be deficient or outright wrong;
+/// and several terminal emulators falsely announce incorrect terminal types.
+static void patch_terminfo_bugs(TUIData *data, const char *term,
+ const char *colorterm, long vte_version,
+ long konsolev, bool iterm_env)
{
unibi_term *ut = data->ut;
+ const char *xterm_version = os_getenv("XTERM_VERSION");
+#if 0 // We don't need to identify this specifically, for now.
+ bool roxterm = !!os_getenv("ROXTERM_ID");
+#endif
+ bool xterm = terminfo_is_term_family(term, "xterm")
+ // Treat Terminal.app as generic xterm-like, for now.
+ || terminfo_is_term_family(term, "nsterm");
+ bool kitty = terminfo_is_term_family(term, "xterm-kitty");
+ bool linuxvt = terminfo_is_term_family(term, "linux");
+ bool bsdvt = terminfo_is_bsd_console(term);
+ bool rxvt = terminfo_is_term_family(term, "rxvt");
+ bool teraterm = terminfo_is_term_family(term, "teraterm");
+ bool putty = terminfo_is_term_family(term, "putty");
+ bool screen = terminfo_is_term_family(term, "screen");
+ bool tmux = terminfo_is_term_family(term, "tmux") || !!os_getenv("TMUX");
+ bool st = terminfo_is_term_family(term, "st");
+ bool gnome = terminfo_is_term_family(term, "gnome")
+ || terminfo_is_term_family(term, "vte");
+ bool iterm = terminfo_is_term_family(term, "iterm")
+ || terminfo_is_term_family(term, "iterm2")
+ || terminfo_is_term_family(term, "iTerm.app")
+ || terminfo_is_term_family(term, "iTerm2.app");
+ bool alacritty = terminfo_is_term_family(term, "alacritty");
+ // None of the following work over SSH; see :help TERM .
+ bool iterm_pretending_xterm = xterm && iterm_env;
+ bool konsole_pretending_xterm = xterm && konsolev;
+ bool gnome_pretending_xterm = xterm && colorterm
+ && strstr(colorterm, "gnome-terminal");
+ bool mate_pretending_xterm = xterm && colorterm
+ && strstr(colorterm, "mate-terminal");
+ bool true_xterm = xterm && !!xterm_version && !bsdvt;
+ bool cygwin = terminfo_is_term_family(term, "cygwin");
+
+ char *fix_normal = (char *)unibi_get_str(ut, unibi_cursor_normal);
+ if (fix_normal) {
+ if (STARTS_WITH(fix_normal, "\x1b[?12l")) {
+ // terminfo typically includes DECRST 12 as part of setting up the
+ // normal cursor, which interferes with the user's control via
+ // set_cursor_style. When DECRST 12 is present, skip over it, but honor
+ // the rest of the cnorm setting.
+ fix_normal += sizeof "\x1b[?12l" - 1;
+ unibi_set_str(ut, unibi_cursor_normal, fix_normal);
+ }
+ if (linuxvt
+ && strlen(fix_normal) >= (sizeof LINUXSET0C - 1)
+ && !memcmp(strchr(fix_normal, 0) - (sizeof LINUXSET0C - 1),
+ LINUXSET0C, sizeof LINUXSET0C - 1)) {
+ // The Linux terminfo entry similarly includes a Linux-idiosyncractic
+ // cursor shape reset in cnorm, which similarly interferes with
+ // set_cursor_style.
+ fix_normal[strlen(fix_normal) - (sizeof LINUXSET0C - 1)] = 0;
+ }
+ }
+ char *fix_invisible = (char *)unibi_get_str(ut, unibi_cursor_invisible);
+ if (fix_invisible) {
+ if (linuxvt
+ && strlen(fix_invisible) >= (sizeof LINUXSET1C - 1)
+ && !memcmp(strchr(fix_invisible, 0) - (sizeof LINUXSET1C - 1),
+ LINUXSET1C, sizeof LINUXSET1C - 1)) {
+ // The Linux terminfo entry similarly includes a Linux-idiosyncractic
+ // cursor shape reset in cinvis, which similarly interferes with
+ // set_cursor_style.
+ fix_invisible[strlen(fix_invisible) - (sizeof LINUXSET1C - 1)] = 0;
+ }
+ }
- const char *term = os_getenv("TERM");
- const char *colorterm = os_getenv("COLORTERM");
- if (!term) {
- goto end;
+ if (tmux || screen || kitty) {
+ // Disable BCE in some cases we know it is not working. #8806
+ unibi_set_bool(ut, unibi_back_color_erase, false);
}
- bool inside_tmux = os_getenv("TMUX") != NULL;
+ if (xterm) {
+ // Termit, LXTerminal, GTKTerm2, GNOME Terminal, MATE Terminal, roxterm,
+ // and EvilVTE falsely claim to be xterm and do not support important xterm
+ // control sequences that we use. In an ideal world, these would have
+ // their own terminal types and terminfo entries, like PuTTY does, and not
+ // claim to be xterm. Or they would mimic xterm properly enough to be
+ // treatable as xterm.
-#define STARTS_WITH(str, prefix) (!memcmp(str, prefix, sizeof(prefix) - 1))
+ // 2017-04 terminfo.src lacks these. genuine Xterm has them, as have
+ // the false claimants.
+ unibi_set_if_empty(ut, unibi_to_status_line, "\x1b]0;");
+ unibi_set_if_empty(ut, unibi_from_status_line, "\x07");
+ unibi_set_if_empty(ut, unibi_set_tb_margin, "\x1b[%i%p1%d;%p2%dr");
- if (STARTS_WITH(term, "rxvt")) {
- unibi_set_if_empty(ut, unibi_exit_attribute_mode, "\x1b[m\x1b(B");
- unibi_set_if_empty(ut, unibi_flash_screen, "\x1b[?5h$<20/>\x1b[?5l");
+ if (true_xterm) {
+ // 2017-04 terminfo.src lacks these. genuine Xterm has them.
+ unibi_set_if_empty(ut, unibi_set_lr_margin, "\x1b[%i%p1%d;%p2%ds");
+ unibi_set_if_empty(ut, unibi_set_left_margin_parm, "\x1b[%i%p1%ds");
+ unibi_set_if_empty(ut, unibi_set_right_margin_parm, "\x1b[%i;%p2%ds");
+ }
+ if (true_xterm
+ || iterm_pretending_xterm
+ || gnome_pretending_xterm
+ || konsole_pretending_xterm) {
+ // Apple's outdated copy of terminfo.src for MacOS lacks these.
+ // genuine Xterm and three false claimants have them.
+ unibi_set_if_empty(ut, unibi_enter_italics_mode, "\x1b[3m");
+ unibi_set_if_empty(ut, unibi_exit_italics_mode, "\x1b[23m");
+ }
+ } else if (rxvt) {
+ // 2017-04 terminfo.src lacks these. Unicode rxvt has them.
unibi_set_if_empty(ut, unibi_enter_italics_mode, "\x1b[3m");
+ unibi_set_if_empty(ut, unibi_exit_italics_mode, "\x1b[23m");
unibi_set_if_empty(ut, unibi_to_status_line, "\x1b]2");
- } else if (STARTS_WITH(term, "xterm")) {
- unibi_set_if_empty(ut, unibi_to_status_line, "\x1b]0;");
- } else if (STARTS_WITH(term, "screen") || STARTS_WITH(term, "tmux")) {
+ unibi_set_if_empty(ut, unibi_from_status_line, "\x07");
+ // 2017-04 terminfo.src has older control sequences.
+ unibi_set_str(ut, unibi_enter_ca_mode, "\x1b[?1049h");
+ unibi_set_str(ut, unibi_exit_ca_mode, "\x1b[?1049l");
+ } else if (screen) {
+ // per the screen manual; 2017-04 terminfo.src lacks these.
unibi_set_if_empty(ut, unibi_to_status_line, "\x1b_");
unibi_set_if_empty(ut, unibi_from_status_line, "\x1b\\");
+ } else if (tmux) {
+ unibi_set_if_empty(ut, unibi_to_status_line, "\x1b_");
+ unibi_set_if_empty(ut, unibi_from_status_line, "\x1b\\");
+ } else if (terminfo_is_term_family(term, "interix")) {
+ // 2017-04 terminfo.src lacks this.
+ unibi_set_if_empty(ut, unibi_carriage_return, "\x0d");
+ } else if (linuxvt) {
+ // Apple's outdated copy of terminfo.src for MacOS lacks these.
+ unibi_set_if_empty(ut, unibi_parm_up_cursor, "\x1b[%p1%dA");
+ unibi_set_if_empty(ut, unibi_parm_down_cursor, "\x1b[%p1%dB");
+ unibi_set_if_empty(ut, unibi_parm_right_cursor, "\x1b[%p1%dC");
+ unibi_set_if_empty(ut, unibi_parm_left_cursor, "\x1b[%p1%dD");
+ } else if (putty) {
+ // No bugs in the vanilla terminfo for our purposes.
+ } else if (iterm) {
+ // 2017-04 terminfo.src has older control sequences.
+ unibi_set_str(ut, unibi_enter_ca_mode, "\x1b[?1049h");
+ unibi_set_str(ut, unibi_exit_ca_mode, "\x1b[?1049l");
+ // 2017-04 terminfo.src lacks these.
+ unibi_set_if_empty(ut, unibi_set_tb_margin, "\x1b[%i%p1%d;%p2%dr");
+ unibi_set_if_empty(ut, unibi_orig_pair, "\x1b[39;49m");
+ unibi_set_if_empty(ut, unibi_enter_dim_mode, "\x1b[2m");
+ unibi_set_if_empty(ut, unibi_enter_italics_mode, "\x1b[3m");
+ unibi_set_if_empty(ut, unibi_exit_italics_mode, "\x1b[23m");
+ unibi_set_if_empty(ut, unibi_exit_underline_mode, "\x1b[24m");
+ unibi_set_if_empty(ut, unibi_exit_standout_mode, "\x1b[27m");
+ } else if (st) {
+ // No bugs in the vanilla terminfo for our purposes.
}
- if (STARTS_WITH(term, "xterm") || STARTS_WITH(term, "rxvt")) {
- unibi_set_if_empty(ut, unibi_cursor_normal, "\x1b[?12l\x1b[?25h");
- unibi_set_if_empty(ut, unibi_cursor_invisible, "\x1b[?25l");
- unibi_set_if_empty(ut, unibi_flash_screen, "\x1b[?5h$<100/>\x1b[?5l");
- unibi_set_if_empty(ut, unibi_exit_attribute_mode, "\x1b(B\x1b[m");
- unibi_set_if_empty(ut, unibi_change_scroll_region, "\x1b[%i%p1%d;%p2%dr");
- unibi_set_if_empty(ut, unibi_clear_screen, "\x1b[H\x1b[2J");
- unibi_set_if_empty(ut, unibi_from_status_line, "\x07");
- }
-
- data->unibi_ext.enable_bracketed_paste = (int)unibi_add_ext_str(ut, NULL,
- "\x1b[?2004h");
- data->unibi_ext.disable_bracketed_paste = (int)unibi_add_ext_str(ut, NULL,
- "\x1b[?2004l");
+// At this time (2017-07-12) it seems like all terminals that support 256
+// color codes can use semicolons in the terminal code and be fine.
+// However, this is not correct according to the spec. So to reward those
+// terminals that also support colons, we output the code that way on these
+// specific ones.
- data->unibi_ext.enable_focus_reporting = (int)unibi_add_ext_str(ut, NULL,
- "\x1b[?1004h");
- data->unibi_ext.disable_focus_reporting = (int)unibi_add_ext_str(ut, NULL,
- "\x1b[?1004l");
+// using colons like ISO 8613-6:1994/ITU T.416:1993 says.
+#define XTERM_SETAF_256_COLON \
+ "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38:5:%p1%d%;m"
+#define XTERM_SETAB_256_COLON \
+ "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48:5:%p1%d%;m"
- data->unibi_ext.get_bg = (int)unibi_add_ext_str(ut, NULL, "\x1b]11;?\x07");
-
-#define XTERM_SETAF \
+#define XTERM_SETAF_256 \
"\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m"
-#define XTERM_SETAB \
+#define XTERM_SETAB_256 \
"\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m"
+#define XTERM_SETAF_16 \
+ "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e39%;m"
+#define XTERM_SETAB_16 \
+ "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e39%;m"
+
+ data->unibi_ext.get_bg = (int)unibi_add_ext_str(ut, "ext.get_bg",
+ "\x1b]11;?\x07");
+
+ // Terminals with 256-colour SGR support despite what terminfo says.
+ if (unibi_get_num(ut, unibi_max_colors) < 256) {
+ // See http://fedoraproject.org/wiki/Features/256_Color_Terminals
+ if (true_xterm || iterm || iterm_pretending_xterm) {
+ unibi_set_num(ut, unibi_max_colors, 256);
+ unibi_set_str(ut, unibi_set_a_foreground, XTERM_SETAF_256_COLON);
+ unibi_set_str(ut, unibi_set_a_background, XTERM_SETAB_256_COLON);
+ } else if (konsolev || xterm || gnome || rxvt || st || putty
+ || linuxvt // Linux 4.8+ supports 256-colour SGR.
+ || mate_pretending_xterm || gnome_pretending_xterm
+ || tmux
+ || (colorterm && strstr(colorterm, "256"))
+ || (term && strstr(term, "256"))) {
+ unibi_set_num(ut, unibi_max_colors, 256);
+ unibi_set_str(ut, unibi_set_a_foreground, XTERM_SETAF_256);
+ unibi_set_str(ut, unibi_set_a_background, XTERM_SETAB_256);
+ }
+ }
+ // Terminals with 16-colour SGR support despite what terminfo says.
+ if (unibi_get_num(ut, unibi_max_colors) < 16) {
+ if (colorterm) {
+ unibi_set_num(ut, unibi_max_colors, 16);
+ unibi_set_if_empty(ut, unibi_set_a_foreground, XTERM_SETAF_16);
+ unibi_set_if_empty(ut, unibi_set_a_background, XTERM_SETAB_16);
+ }
+ }
- if ((colorterm && strstr(colorterm, "256"))
- || strstr(term, "256")
- || strstr(term, "xterm")) {
- // Assume TERM~=xterm or COLORTERM~=256 supports 256 colors.
- unibi_set_num(ut, unibi_max_colors, 256);
- unibi_set_str(ut, unibi_set_a_foreground, XTERM_SETAF);
- unibi_set_str(ut, unibi_set_a_background, XTERM_SETAB);
+ // Blacklist of terminals that cannot be trusted to report DECSCUSR support.
+ if (!(st || (vte_version != 0 && vte_version < 3900) || konsolev)) {
+ data->unibi_ext.reset_cursor_style = unibi_find_ext_str(ut, "Se");
+ data->unibi_ext.set_cursor_style = unibi_find_ext_str(ut, "Ss");
}
- if (os_getenv("NVIM_TUI_ENABLE_CURSOR_SHAPE") == NULL) {
- goto end;
+ // Dickey ncurses terminfo includes Ss/Se capabilities since 2011-07-14. So
+ // adding them to terminal types, that have such control sequences but lack
+ // the correct terminfo entries, is a fixup, not an augmentation.
+ if (-1 == data->unibi_ext.set_cursor_style) {
+ // DECSCUSR (cursor shape) is widely supported.
+ // https://github.com/gnachman/iTerm2/pull/92
+ if ((!bsdvt && (!konsolev || konsolev >= 180770))
+ && ((xterm && !vte_version) // anything claiming xterm compat
+ // per MinTTY 0.4.3-1 release notes from 2009
+ || putty
+ // per https://bugzilla.gnome.org/show_bug.cgi?id=720821
+ || (vte_version >= 3900)
+ || (konsolev >= 180770) // #9364
+ || tmux // per tmux manual page
+ // https://lists.gnu.org/archive/html/screen-devel/2013-03/msg00000.html
+ || screen
+ || st // #7641
+ || rxvt // per command.C
+ // per analysis of VT100Terminal.m
+ || iterm || iterm_pretending_xterm
+ || teraterm // per TeraTerm "Supported Control Functions" doco
+ || alacritty // https://github.com/jwilm/alacritty/pull/608
+ || cygwin
+ // Some linux-type terminals implement the xterm extension.
+ // Example: console-terminal-emulator from the nosh toolset.
+ || (linuxvt
+ && (xterm_version || (vte_version > 0) || colorterm)))) {
+ data->unibi_ext.set_cursor_style =
+ (int)unibi_add_ext_str(ut, "Ss", "\x1b[%p1%d q");
+ if (-1 == data->unibi_ext.reset_cursor_style) {
+ data->unibi_ext.reset_cursor_style = (int)unibi_add_ext_str(ut, "Se",
+ "");
+ }
+ unibi_set_ext_str(ut, (size_t)data->unibi_ext.reset_cursor_style,
+ "\x1b[ q");
+ } else if (linuxvt) {
+ // Linux uses an idiosyncratic escape code to set the cursor shape and
+ // does not support DECSCUSR.
+ // See http://linuxgazette.net/137/anonymous.html for more info
+ data->unibi_ext.set_cursor_style = (int)unibi_add_ext_str(ut, "Ss",
+ "\x1b[?"
+ "%?"
+ // The parameter passed to Ss is the DECSCUSR parameter, so the
+ // terminal capability has to translate into the Linux idiosyncratic
+ // parameter.
+ //
+ // linuxvt only supports block and underline. It is also only
+ // possible to have a steady block (no steady underline)
+ "%p1%{2}%<" "%t%{8}" // blink block
+ "%e%p1%{2}%=" "%t%{112}" // steady block
+ "%e%p1%{3}%=" "%t%{4}" // blink underline (set to half block)
+ "%e%p1%{4}%=" "%t%{4}" // steady underline
+ "%e%p1%{5}%=" "%t%{2}" // blink bar (set to underline)
+ "%e%p1%{6}%=" "%t%{2}" // steady bar
+ "%e%{0}" // anything else
+ "%;" "%dc");
+ if (-1 == data->unibi_ext.reset_cursor_style) {
+ data->unibi_ext.reset_cursor_style = (int)unibi_add_ext_str(ut, "Se",
+ "");
+ }
+ unibi_set_ext_str(ut, (size_t)data->unibi_ext.reset_cursor_style,
+ "\x1b[?c");
+ } else if (konsolev > 0 && konsolev < 180770) {
+ // Konsole before version 18.07.70: set up a nonce profile. This has
+ // side-effects on temporary font resizing. #6798
+ data->unibi_ext.set_cursor_style = (int)unibi_add_ext_str(ut, "Ss",
+ TMUX_WRAP(tmux, "\x1b]50;CursorShape=%?"
+ "%p1%{3}%<" "%t%{0}" // block
+ "%e%p1%{5}%<" "%t%{2}" // underline
+ "%e%{1}" // everything else is bar
+ "%;%d;BlinkingCursorEnabled=%?"
+ "%p1%{1}%<" "%t%{1}" // Fortunately if we exclude zero as special,
+ "%e%p1%{1}%&" // in all other cases we can treat bit #0 as a flag.
+ "%;%d\x07"));
+ if (-1 == data->unibi_ext.reset_cursor_style) {
+ data->unibi_ext.reset_cursor_style = (int)unibi_add_ext_str(ut, "Se",
+ "");
+ }
+ unibi_set_ext_str(ut, (size_t)data->unibi_ext.reset_cursor_style,
+ "\x1b]50;\x07");
+ }
}
+}
-#define TMUX_WRAP(seq) (inside_tmux ? "\x1bPtmux;\x1b" seq "\x1b\\" : seq)
- // Support changing cursor shape on some popular terminals.
- const char *term_prog = os_getenv("TERM_PROGRAM");
- const char *vte_version = os_getenv("VTE_VERSION");
-
- if ((term_prog && !strcmp(term_prog, "Konsole"))
- || os_getenv("KONSOLE_DBUS_SESSION") != NULL) {
- // Konsole uses a proprietary escape code to set the cursor shape
- // and does not support DECSCUSR.
- data->unibi_ext.enter_insert_mode = (int)unibi_add_ext_str(ut, NULL,
- TMUX_WRAP("\x1b]50;CursorShape=1;BlinkingCursorEnabled=1\x07"));
- data->unibi_ext.enter_replace_mode = (int)unibi_add_ext_str(ut, NULL,
- TMUX_WRAP("\x1b]50;CursorShape=2;BlinkingCursorEnabled=1\x07"));
- data->unibi_ext.exit_insert_mode = (int)unibi_add_ext_str(ut, NULL,
- TMUX_WRAP("\x1b]50;CursorShape=0;BlinkingCursorEnabled=0\x07"));
- } else if (!vte_version || atoi(vte_version) >= 3900) {
- // Assume that the terminal supports DECSCUSR unless it is an
- // old VTE based terminal. This should not get wrapped for tmux,
- // which will handle it via its Ss/Se terminfo extension - usually
- // according to its terminal-overrides.
- data->unibi_ext.enter_insert_mode = (int)unibi_add_ext_str(ut, NULL,
- "\x1b[5 q");
- data->unibi_ext.enter_replace_mode = (int)unibi_add_ext_str(ut, NULL,
- "\x1b[3 q");
- data->unibi_ext.exit_insert_mode = (int)unibi_add_ext_str(ut, NULL,
- "\x1b[2 q");
+/// This adds stuff that is not in standard terminfo as extended unibilium
+/// capabilities.
+static void augment_terminfo(TUIData *data, const char *term,
+ const char *colorterm, long vte_version,
+ long konsolev, bool iterm_env)
+{
+ unibi_term *ut = data->ut;
+ bool xterm = terminfo_is_term_family(term, "xterm")
+ // Treat Terminal.app as generic xterm-like, for now.
+ || terminfo_is_term_family(term, "nsterm");
+ bool bsdvt = terminfo_is_bsd_console(term);
+ bool dtterm = terminfo_is_term_family(term, "dtterm");
+ bool rxvt = terminfo_is_term_family(term, "rxvt");
+ bool teraterm = terminfo_is_term_family(term, "teraterm");
+ bool putty = terminfo_is_term_family(term, "putty");
+ bool screen = terminfo_is_term_family(term, "screen");
+ bool tmux = terminfo_is_term_family(term, "tmux") || !!os_getenv("TMUX");
+ bool iterm = terminfo_is_term_family(term, "iterm")
+ || terminfo_is_term_family(term, "iterm2")
+ || terminfo_is_term_family(term, "iTerm.app")
+ || terminfo_is_term_family(term, "iTerm2.app");
+ bool alacritty = terminfo_is_term_family(term, "alacritty");
+ // None of the following work over SSH; see :help TERM .
+ bool iterm_pretending_xterm = xterm && iterm_env;
+
+ const char *xterm_version = os_getenv("XTERM_VERSION");
+ bool true_xterm = xterm && !!xterm_version && !bsdvt;
+
+ // Only define this capability for terminal types that we know understand it.
+ if (dtterm // originated this extension
+ || xterm // per xterm ctlseqs doco
+ || konsolev // per commentary in VT102Emulation.cpp
+ || teraterm // per TeraTerm "Supported Control Functions" doco
+ || rxvt) { // per command.C
+ data->unibi_ext.resize_screen = (int)unibi_add_ext_str(ut,
+ "ext.resize_screen",
+ "\x1b[8;%p1%d;%p2%dt");
+ }
+ if (putty || xterm || rxvt) {
+ data->unibi_ext.reset_scroll_region = (int)unibi_add_ext_str(ut,
+ "ext.reset_scroll_region",
+ "\x1b[r");
}
-end:
- // Fill some empty slots with common terminal strings
- data->unibi_ext.enable_mouse = (int)unibi_add_ext_str(ut, NULL,
- "\x1b[?1002h\x1b[?1006h");
- data->unibi_ext.disable_mouse = (int)unibi_add_ext_str(ut, NULL,
- "\x1b[?1002l\x1b[?1006l");
- data->unibi_ext.set_rgb_foreground = (int)unibi_add_ext_str(ut, NULL,
- "\x1b[38;2;%p1%d;%p2%d;%p3%dm");
- data->unibi_ext.set_rgb_background = (int)unibi_add_ext_str(ut, NULL,
- "\x1b[48;2;%p1%d;%p2%d;%p3%dm");
- unibi_set_if_empty(ut, unibi_cursor_address, "\x1b[%i%p1%d;%p2%dH");
- unibi_set_if_empty(ut, unibi_exit_attribute_mode, "\x1b[0;10m");
- unibi_set_if_empty(ut, unibi_set_a_foreground, XTERM_SETAF);
- unibi_set_if_empty(ut, unibi_set_a_background, XTERM_SETAB);
- unibi_set_if_empty(ut, unibi_enter_bold_mode, "\x1b[1m");
- unibi_set_if_empty(ut, unibi_enter_underline_mode, "\x1b[4m");
- unibi_set_if_empty(ut, unibi_enter_reverse_mode, "\x1b[7m");
- unibi_set_if_empty(ut, unibi_bell, "\x07");
- unibi_set_if_empty(data->ut, unibi_enter_ca_mode, "\x1b[?1049h");
- unibi_set_if_empty(data->ut, unibi_exit_ca_mode, "\x1b[?1049l");
- unibi_set_if_empty(ut, unibi_delete_line, "\x1b[M");
- unibi_set_if_empty(ut, unibi_parm_delete_line, "\x1b[%p1%dM");
- unibi_set_if_empty(ut, unibi_insert_line, "\x1b[L");
- unibi_set_if_empty(ut, unibi_parm_insert_line, "\x1b[%p1%dL");
- unibi_set_if_empty(ut, unibi_clear_screen, "\x1b[H\x1b[J");
- unibi_set_if_empty(ut, unibi_clr_eol, "\x1b[K");
- unibi_set_if_empty(ut, unibi_clr_eos, "\x1b[J");
+ // Dickey ncurses terminfo does not include the setrgbf and setrgbb
+ // capabilities, proposed by Rรผdiger Sonderfeld on 2013-10-15. Adding
+ // them here when terminfo lacks them is an augmentation, not a fixup.
+ // https://gist.github.com/XVilka/8346728
+
+ // At this time (2017-07-12) it seems like all terminals that support rgb
+ // color codes can use semicolons in the terminal code and be fine.
+ // However, this is not correct according to the spec. So to reward those
+ // terminals that also support colons, we output the code that way on these
+ // specific ones.
+
+ // can use colons like ISO 8613-6:1994/ITU T.416:1993 says.
+ bool has_colon_rgb = !tmux && !screen
+ && !vte_version // VTE colon-support has a big memory leak. #7573
+ && (iterm || iterm_pretending_xterm // per VT100Terminal.m
+ // per http://invisible-island.net/xterm/xterm.log.html#xterm_282
+ || true_xterm);
+
+ data->unibi_ext.set_rgb_foreground = unibi_find_ext_str(ut, "setrgbf");
+ if (-1 == data->unibi_ext.set_rgb_foreground) {
+ if (has_colon_rgb) {
+ data->unibi_ext.set_rgb_foreground = (int)unibi_add_ext_str(ut, "setrgbf",
+ "\x1b[38:2:%p1%d:%p2%d:%p3%dm");
+ } else {
+ data->unibi_ext.set_rgb_foreground = (int)unibi_add_ext_str(ut, "setrgbf",
+ "\x1b[38;2;%p1%d;%p2%d;%p3%dm");
+ }
+ }
+ data->unibi_ext.set_rgb_background = unibi_find_ext_str(ut, "setrgbb");
+ if (-1 == data->unibi_ext.set_rgb_background) {
+ if (has_colon_rgb) {
+ data->unibi_ext.set_rgb_background = (int)unibi_add_ext_str(ut, "setrgbb",
+ "\x1b[48:2:%p1%d:%p2%d:%p3%dm");
+ } else {
+ data->unibi_ext.set_rgb_background = (int)unibi_add_ext_str(ut, "setrgbb",
+ "\x1b[48;2;%p1%d;%p2%d;%p3%dm");
+ }
+ }
+
+ if (iterm || iterm_pretending_xterm) {
+ // FIXME: Bypassing tmux like this affects the cursor colour globally, in
+ // all panes, which is not particularly desirable. A better approach
+ // would use a tmux control sequence and an extra if(screen) test.
+ data->unibi_ext.set_cursor_color = (int)unibi_add_ext_str(
+ ut, NULL, TMUX_WRAP(tmux, "\033]Pl%p1%06x\033\\"));
+ } else if ((xterm || rxvt || alacritty)
+ && (vte_version == 0 || vte_version >= 3900)) {
+ // Supported in urxvt, newer VTE.
+ data->unibi_ext.set_cursor_color = (int)unibi_add_ext_str(
+ ut, "ext.set_cursor_color", "\033]12;#%p1%06x\007");
+ }
+
+ if (-1 != data->unibi_ext.set_cursor_color) {
+ data->unibi_ext.reset_cursor_color = (int)unibi_add_ext_str(
+ ut, "ext.reset_cursor_color", "\x1b]112\x07");
+ }
+
+ data->unibi_ext.save_title = (int)unibi_add_ext_str(
+ ut, "ext.save_title", "\x1b[22;0;0t");
+ data->unibi_ext.restore_title = (int)unibi_add_ext_str(
+ ut, "ext.restore_title", "\x1b[23;0;0t");
+
+ /// Terminals usually ignore unrecognized private modes, and there is no
+ /// known ambiguity with these. So we just set them unconditionally.
+ data->unibi_ext.enable_lr_margin = (int)unibi_add_ext_str(
+ ut, "ext.enable_lr_margin", "\x1b[?69h");
+ data->unibi_ext.disable_lr_margin = (int)unibi_add_ext_str(
+ ut, "ext.disable_lr_margin", "\x1b[?69l");
+ data->unibi_ext.enable_bracketed_paste = (int)unibi_add_ext_str(
+ ut, "ext.enable_bpaste", "\x1b[?2004h");
+ data->unibi_ext.disable_bracketed_paste = (int)unibi_add_ext_str(
+ ut, "ext.disable_bpaste", "\x1b[?2004l");
+ // For urxvt send BOTH xterm and old urxvt sequences. #8695
+ data->unibi_ext.enable_focus_reporting = (int)unibi_add_ext_str(
+ ut, "ext.enable_focus",
+ rxvt ? "\x1b[?1004h\x1b]777;focus;on\x7" : "\x1b[?1004h");
+ data->unibi_ext.disable_focus_reporting = (int)unibi_add_ext_str(
+ ut, "ext.disable_focus",
+ rxvt ? "\x1b[?1004l\x1b]777;focus;off\x7" : "\x1b[?1004l");
+ data->unibi_ext.enable_mouse = (int)unibi_add_ext_str(
+ ut, "ext.enable_mouse", "\x1b[?1002h\x1b[?1006h");
+ data->unibi_ext.disable_mouse = (int)unibi_add_ext_str(
+ ut, "ext.disable_mouse", "\x1b[?1002l\x1b[?1006l");
+
+ int ext_bool_Su = unibi_find_ext_bool(ut, "Su"); // used by kitty
+ if (vte_version >= 5102
+ || (ext_bool_Su != -1 && unibi_get_ext_bool(ut, (size_t)ext_bool_Su))) {
+ data->unibi_ext.enter_undercurl_mode = (int)unibi_add_ext_str(
+ ut, "ext.enter_undercurl_mode", "\x1b[4:3m");
+ data->unibi_ext.exit_undercurl_mode = (int)unibi_add_ext_str(
+ ut, "ext.exit_undercurl_mode", "\x1b[4:0m");
+ // Only support colon syntax. #9270
+ data->unibi_ext.set_underline_color = (int)unibi_add_ext_str(
+ ut, "ext.set_underline_color", "\x1b[58:2::%p1%d:%p2%d:%p3%dm");
+ }
}
static void flush_buf(UI *ui)
{
uv_write_t req;
- uv_buf_t buf;
+ uv_buf_t bufs[3];
+ uv_buf_t *bufp = &bufs[0];
TUIData *data = ui->data;
+ if (data->bufpos <= 0 && data->busy == data->is_invisible) {
+ return;
+ }
+
+ if (!data->is_invisible) {
+ // cursor is visible. Write a "cursor invisible" command before writing the
+ // buffer.
+ bufp->base = data->invis;
+ bufp->len = UV_BUF_LEN(data->invislen);
+ bufp++;
+ data->is_invisible = true;
+ }
+
+ if (data->bufpos > 0) {
+ bufp->base = data->buf;
+ bufp->len = UV_BUF_LEN(data->bufpos);
+ bufp++;
+ }
+
if (!data->busy) {
- // not busy and the cursor is invisible(see below). Append a "cursor
- // normal" command to the end of the buffer.
- data->bufsize += CNORM_COMMAND_MAX_SIZE;
- unibi_out(ui, unibi_cursor_normal);
- data->bufsize -= CNORM_COMMAND_MAX_SIZE;
+ assert(data->is_invisible);
+ // not busy and the cursor is invisible. Write a "cursor normal" command
+ // after writing the buffer.
+ bufp->base = data->norm;
+ bufp->len = UV_BUF_LEN(data->normlen);
+ bufp++;
+ data->is_invisible = data->busy;
}
- buf.base = data->buf;
- buf.len = data->bufpos;
- uv_write(&req, (uv_stream_t *)&data->output_handle, &buf, 1, NULL);
+ uv_write(&req, STRUCT_CAST(uv_stream_t, &data->output_handle),
+ bufs, (unsigned)(bufp - bufs), NULL);
uv_run(&data->write_loop, UV_RUN_DEFAULT);
data->bufpos = 0;
+ data->overflow = false;
+}
- if (!data->busy) {
- // not busy and cursor is visible(see above), append a "cursor invisible"
- // command to the beginning of the buffer for the next flush
- unibi_out(ui, unibi_cursor_invisible);
+#if TERMKEY_VERSION_MAJOR > 0 || TERMKEY_VERSION_MINOR > 18
+/// Try to get "kbs" code from stty because "the terminfo kbs entry is extremely
+/// unreliable." (Vim, Bash, and tmux also do this.)
+///
+/// @see tmux/tty-keys.c fe4e9470bb504357d073320f5d305b22663ee3fd
+/// @see https://bugzilla.redhat.com/show_bug.cgi?id=142659
+static const char *tui_get_stty_erase(void)
+{
+ static char stty_erase[2] = { 0 };
+#if defined(HAVE_TERMIOS_H)
+ struct termios t;
+ if (tcgetattr(input_global_fd(), &t) != -1) {
+ stty_erase[0] = (char)t.c_cc[VERASE];
+ stty_erase[1] = '\0';
+ DLOG("stty/termios:erase=%s", stty_erase);
}
+#endif
+ return stty_erase;
}
+
+/// libtermkey hook to override terminfo entries.
+/// @see TermInput.tk_ti_hook_fn
+static const char *tui_tk_ti_getstr(const char *name, const char *value,
+ void *data)
+{
+ static const char *stty_erase = NULL;
+ if (stty_erase == NULL) {
+ stty_erase = tui_get_stty_erase();
+ }
+
+ if (strequal(name, "key_backspace")) {
+ DLOG("libtermkey:kbs=%s", value);
+ if (stty_erase[0] != 0) {
+ return stty_erase;
+ }
+ } else if (strequal(name, "key_dc")) {
+ DLOG("libtermkey:kdch1=%s", value);
+ // Vim: "If <BS> and <DEL> are now the same, redefine <DEL>."
+ if (value != NULL && strequal(stty_erase, value)) {
+ return stty_erase[0] == DEL ? CTRL_H_STR : DEL_STR;
+ }
+ } else if (strequal(name, "key_mouse")) {
+ DLOG("libtermkey:kmous=%s", value);
+ // If key_mouse is found, libtermkey uses its terminfo driver (driver-ti.c)
+ // for mouse input, which by accident only supports X10 protocol.
+ // Force libtermkey to fallback to its CSI driver (driver-csi.c). #7948
+ return NULL;
+ }
+
+ return value;
+}
+#endif
diff --git a/src/nvim/tui/tui.h b/src/nvim/tui/tui.h
index 07523bc124..996496ee60 100644
--- a/src/nvim/tui/tui.h
+++ b/src/nvim/tui/tui.h
@@ -1,6 +1,9 @@
#ifndef NVIM_TUI_TUI_H
#define NVIM_TUI_TUI_H
+#include "nvim/cursor_shape.h"
+#include "nvim/ui.h"
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "tui/tui.h.generated.h"
#endif
diff --git a/src/nvim/types.h b/src/nvim/types.h
index bfe8be2091..f803b45e27 100644
--- a/src/nvim/types.h
+++ b/src/nvim/types.h
@@ -13,4 +13,9 @@ typedef unsigned char char_u;
// Can hold one decoded UTF-8 character.
typedef uint32_t u8char_T;
+// Opaque handle used by API clients to refer to various objects in vim
+typedef int handle_T;
+
+typedef struct expand expand_T;
+
#endif // NVIM_TYPES_H
diff --git a/src/nvim/ugrid.c b/src/nvim/ugrid.c
index 127b18feb6..f5bd35a48e 100644
--- a/src/nvim/ugrid.c
+++ b/src/nvim/ugrid.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <stdbool.h>
#include <stdio.h>
@@ -13,8 +16,6 @@
void ugrid_init(UGrid *grid)
{
- grid->attrs = EMPTY_ATTRS;
- grid->fg = grid->bg = -1;
grid->cells = NULL;
}
@@ -31,23 +32,18 @@ void ugrid_resize(UGrid *grid, int width, int height)
grid->cells[i] = xcalloc((size_t)width, sizeof(UCell));
}
- grid->top = 0;
- grid->bot = height - 1;
- grid->left = 0;
- grid->right = width - 1;
- grid->row = grid->col = 0;
grid->width = width;
grid->height = height;
}
void ugrid_clear(UGrid *grid)
{
- clear_region(grid, grid->top, grid->bot, grid->left, grid->right);
+ clear_region(grid, 0, grid->height-1, 0, grid->width-1, 0);
}
-void ugrid_eol_clear(UGrid *grid)
+void ugrid_clear_chunk(UGrid *grid, int row, int col, int endcol, sattr_T attr)
{
- clear_region(grid, grid->row, grid->row, grid->col, grid->right);
+ clear_region(grid, row, row, col, endcol-1, attr);
}
void ugrid_goto(UGrid *grid, int row, int col)
@@ -56,25 +52,17 @@ void ugrid_goto(UGrid *grid, int row, int col)
grid->col = col;
}
-void ugrid_set_scroll_region(UGrid *grid, int top, int bot, int left, int right)
-{
- grid->top = top;
- grid->bot = bot;
- grid->left = left;
- grid->right = right;
-}
-
-void ugrid_scroll(UGrid *grid, int count, int *clear_top, int *clear_bot)
+void ugrid_scroll(UGrid *grid, int top, int bot, int left, int right, int count)
{
// Compute start/stop/step for the loop below
int start, stop, step;
if (count > 0) {
- start = grid->top;
- stop = grid->bot - count + 1;
+ start = top;
+ stop = bot - count + 1;
step = 1;
} else {
- start = grid->bot;
- stop = grid->top - count - 1;
+ start = bot;
+ stop = top - count - 1;
step = -1;
}
@@ -82,47 +70,23 @@ void ugrid_scroll(UGrid *grid, int count, int *clear_top, int *clear_bot)
// Copy cell data
for (i = start; i != stop; i += step) {
- UCell *target_row = grid->cells[i] + grid->left;
- UCell *source_row = grid->cells[i + count] + grid->left;
+ UCell *target_row = grid->cells[i] + left;
+ UCell *source_row = grid->cells[i + count] + left;
memcpy(target_row, source_row,
- sizeof(UCell) * (size_t)(grid->right - grid->left + 1));
+ sizeof(UCell) * (size_t)(right - left + 1));
}
-
- // clear cells in the emptied region,
- if (count > 0) {
- *clear_top = stop;
- *clear_bot = stop + count - 1;
- } else {
- *clear_bot = stop;
- *clear_top = stop + count + 1;
- }
- clear_region(grid, *clear_top, *clear_bot, grid->left, grid->right);
}
-UCell *ugrid_put(UGrid *grid, uint8_t *text, size_t size)
+static void clear_region(UGrid *grid, int top, int bot, int left, int right,
+ sattr_T attr)
{
- UCell *cell = grid->cells[grid->row] + grid->col;
- cell->data[size] = 0;
- cell->attrs = grid->attrs;
-
- if (text) {
- memcpy(cell->data, text, size);
+ for (int row = top; row <= bot; row++) {
+ UGRID_FOREACH_CELL(grid, row, left, right+1, {
+ cell->data[0] = ' ';
+ cell->data[1] = 0;
+ cell->attr = attr;
+ });
}
-
- grid->col += 1;
- return cell;
-}
-
-static void clear_region(UGrid *grid, int top, int bot, int left, int right)
-{
- HlAttrs clear_attrs = EMPTY_ATTRS;
- clear_attrs.foreground = grid->fg;
- clear_attrs.background = grid->bg;
- UGRID_FOREACH_CELL(grid, top, bot, left, right, {
- cell->data[0] = ' ';
- cell->data[1] = 0;
- cell->attrs = clear_attrs;
- });
}
static void destroy_cells(UGrid *grid)
@@ -132,6 +96,7 @@ static void destroy_cells(UGrid *grid)
xfree(grid->cells[i]);
}
xfree(grid->cells);
+ grid->cells = NULL;
}
}
diff --git a/src/nvim/ugrid.h b/src/nvim/ugrid.h
index 268362bf1b..19c2e99ebb 100644
--- a/src/nvim/ugrid.h
+++ b/src/nvim/ugrid.h
@@ -7,31 +7,28 @@
typedef struct ucell UCell;
typedef struct ugrid UGrid;
+#define CELLBYTES (sizeof(schar_T))
+
struct ucell {
- char data[6 * MAX_MCO + 1];
- HlAttrs attrs;
+ char data[CELLBYTES + 1];
+ sattr_T attr;
};
struct ugrid {
- int top, bot, left, right;
int row, col;
- int bg, fg;
int width, height;
- HlAttrs attrs;
UCell **cells;
};
-#define EMPTY_ATTRS ((HlAttrs){ false, false, false, false, false, -1, -1, -1 })
+// -V:UGRID_FOREACH_CELL:625
-#define UGRID_FOREACH_CELL(grid, top, bot, left, right, code) \
+#define UGRID_FOREACH_CELL(grid, row, startcol, endcol, code) \
do { \
- for (int row = top; row <= bot; row++) { \
- UCell *row_cells = (grid)->cells[row]; \
- for (int col = left; col <= right; col++) { \
- UCell *cell = row_cells + col; \
- (void)(cell); \
- code; \
- } \
+ UCell *row_cells = (grid)->cells[row]; \
+ for (int curcol = startcol; curcol < endcol; curcol++) { \
+ UCell *cell = row_cells + curcol; \
+ (void)(cell); \
+ code; \
} \
} while (0)
diff --git a/src/nvim/ui.c b/src/nvim/ui.c
index d968cbc390..96232ab223 100644
--- a/src/nvim/ui.c
+++ b/src/nvim/ui.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <inttypes.h>
#include <stdbool.h>
@@ -5,17 +8,17 @@
#include <limits.h>
#include "nvim/vim.h"
+#include "nvim/log.h"
#include "nvim/ui.h"
#include "nvim/charset.h"
#include "nvim/cursor.h"
#include "nvim/diff.h"
#include "nvim/ex_cmds2.h"
+#include "nvim/ex_getln.h"
#include "nvim/fold.h"
#include "nvim/main.h"
-#include "nvim/mbyte.h"
#include "nvim/ascii.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/mbyte.h"
#include "nvim/garray.h"
#include "nvim/memory.h"
@@ -27,14 +30,17 @@
#include "nvim/os/time.h"
#include "nvim/os/input.h"
#include "nvim/os/signal.h"
+#include "nvim/popupmnu.h"
#include "nvim/screen.h"
-#include "nvim/syntax.h"
+#include "nvim/highlight.h"
#include "nvim/window.h"
+#include "nvim/cursor_shape.h"
#ifdef FEAT_TUI
# include "nvim/tui/tui.h"
#else
# include "nvim/msgpack_rpc/server.h"
#endif
+#include "nvim/api/private/helpers.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "ui.c.generated.h"
@@ -43,26 +49,45 @@
#define MAX_UI_COUNT 16
static UI *uis[MAX_UI_COUNT];
+static bool ui_ext[kUIExtCount] = { 0 };
static size_t ui_count = 0;
-static int row = 0, col = 0;
-static struct {
- int top, bot, left, right;
-} sr;
-static int current_attr_code = 0;
+static int ui_mode_idx = SHAPE_IDX_N;
+static int cursor_row = 0, cursor_col = 0;
static bool pending_cursor_update = false;
static int busy = 0;
-static int height, width;
+static bool pending_mode_info_update = false;
+static bool pending_mode_update = false;
+static handle_T cursor_grid_handle = DEFAULT_GRID_HANDLE;
-// This set of macros allow us to use UI_CALL to invoke any function on
-// registered UI instances. The functions can have 0-5 arguments(configurable
-// by SELECT_NTH)
+#if MIN_LOG_LEVEL > DEBUG_LOG_LEVEL
+# define UI_LOG(funname, ...)
+#else
+static size_t uilog_seen = 0;
+static char uilog_last_event[1024] = { 0 };
+# define UI_LOG(funname, ...) \
+ do { \
+ if (strequal(uilog_last_event, STR(funname))) { \
+ uilog_seen++; \
+ } else { \
+ if (uilog_seen > 0) { \
+ logmsg(DEBUG_LOG_LEVEL, "UI: ", NULL, -1, true, \
+ "%s (+%zu times...)", uilog_last_event, uilog_seen); \
+ } \
+ logmsg(DEBUG_LOG_LEVEL, "UI: ", NULL, -1, true, STR(funname)); \
+ uilog_seen = 0; \
+ xstrlcpy(uilog_last_event, STR(funname), sizeof(uilog_last_event)); \
+ } \
+ } while (0)
+#endif
+
+// UI_CALL invokes a function on all registered UI instances. The functions can
+// have 0-10 arguments (configurable by SELECT_NTH).
//
-// See http://stackoverflow.com/a/11172679 for a better explanation of how it
-// works.
+// See http://stackoverflow.com/a/11172679 for how it works.
#ifdef _MSC_VER
# define UI_CALL(funname, ...) \
do { \
- flush_cursor_update(); \
+ UI_LOG(funname, 0); \
for (size_t i = 0; i < ui_count; i++) { \
UI *ui = uis[i]; \
UI_CALL_MORE(funname, __VA_ARGS__); \
@@ -71,37 +96,42 @@ static int height, width;
#else
# define UI_CALL(...) \
do { \
- flush_cursor_update(); \
+ UI_LOG(__VA_ARGS__, 0); \
for (size_t i = 0; i < ui_count; i++) { \
UI *ui = uis[i]; \
UI_CALL_HELPER(CNT(__VA_ARGS__), __VA_ARGS__); \
} \
} while (0)
#endif
-#define CNT(...) SELECT_NTH(__VA_ARGS__, MORE, MORE, MORE, MORE, ZERO, ignore)
-#define SELECT_NTH(a1, a2, a3, a4, a5, a6, ...) a6
+#define CNT(...) SELECT_NTH(__VA_ARGS__, MORE, MORE, MORE, MORE, MORE, \
+ MORE, MORE, MORE, MORE, ZERO, ignore)
+#define SELECT_NTH(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, ...) a11
#define UI_CALL_HELPER(c, ...) UI_CALL_HELPER2(c, __VA_ARGS__)
+// Resolves to UI_CALL_MORE or UI_CALL_ZERO.
#define UI_CALL_HELPER2(c, ...) UI_CALL_##c(__VA_ARGS__)
#define UI_CALL_MORE(method, ...) if (ui->method) ui->method(ui, __VA_ARGS__)
#define UI_CALL_ZERO(method) if (ui->method) ui->method(ui)
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "ui_events_call.generated.h"
+#endif
+
void ui_builtin_start(void)
{
#ifdef FEAT_TUI
tui_start();
#else
- fprintf(stderr, "Neovim was built without a Terminal UI," \
- "press Ctrl+C to exit\n");
-
+ fprintf(stderr, "Nvim headless-mode started.\n");
size_t len;
char **addrs = server_address_list(&len);
if (addrs != NULL) {
- fprintf(stderr, "currently listening on the following address(es)\n");
+ fprintf(stderr, "Listening on:\n");
for (size_t i = 0; i < len; i++) {
fprintf(stderr, "\t%s\n", addrs[i]);
}
xfree(addrs);
}
+ fprintf(stderr, "Press CTRL+C to exit.\n");
#endif
}
@@ -112,6 +142,9 @@ void ui_builtin_stop(void)
bool ui_rgb_attached(void)
{
+ if (!headless_mode && p_tgc) {
+ return true;
+ }
for (size_t i = 0; i < ui_count; i++) {
if (uis[i]->rgb) {
return true;
@@ -125,29 +158,15 @@ bool ui_active(void)
return ui_count != 0;
}
-void ui_suspend(void)
-{
- UI_CALL(suspend);
- UI_CALL(flush);
-}
-
-void ui_set_title(char *title)
+void ui_event(char *name, Array args)
{
- UI_CALL(set_title, title);
- UI_CALL(flush);
+ bool args_consumed = false;
+ UI_CALL(event, name, args, &args_consumed);
+ if (!args_consumed) {
+ api_free_array(args);
+ }
}
-void ui_set_icon(char *icon)
-{
- UI_CALL(set_icon, icon);
- UI_CALL(flush);
-}
-
-// May update the shape of the cursor.
-void ui_cursor_shape(void)
-{
- ui_mode_change();
-}
void ui_refresh(void)
{
@@ -155,56 +174,82 @@ void ui_refresh(void)
return;
}
+ if (updating_screen) {
+ ui_schedule_refresh();
+ return;
+ }
+
int width = INT_MAX, height = INT_MAX;
+ bool ext_widgets[kUIExtCount];
+ for (UIExtension i = 0; (int)i < kUIExtCount; i++) {
+ ext_widgets[i] = true;
+ }
for (size_t i = 0; i < ui_count; i++) {
UI *ui = uis[i];
- width = ui->width < width ? ui->width : width;
- height = ui->height < height ? ui->height : height;
+ width = MIN(ui->width, width);
+ height = MIN(ui->height, height);
+ for (UIExtension j = 0; (int)j < kUIExtCount; j++) {
+ ext_widgets[j] &= ui->ui_ext[j];
+ }
}
- row = col = 0;
+ cursor_row = cursor_col = 0;
+ pending_cursor_update = true;
+
+ for (UIExtension i = 0; (int)i < kUIExtCount; i++) {
+ ui_ext[i] = ext_widgets[i];
+ if (i < kUIGlobalCount) {
+ ui_call_option_set(cstr_as_string((char *)ui_ext_names[i]),
+ BOOLEAN_OBJ(ext_widgets[i]));
+ }
+ }
+
+ ui_default_colors_set();
+
+ int save_p_lz = p_lz;
+ p_lz = false; // convince redrawing() to return true ...
screen_resize(width, height);
+ p_lz = save_p_lz;
+
+ ui_mode_info_set();
+ pending_mode_update = true;
+ ui_cursor_shape();
}
-void ui_resize(int new_width, int new_height)
+static void ui_refresh_event(void **argv)
{
- width = new_width;
- height = new_height;
-
- UI_CALL(update_fg, (ui->rgb ? normal_fg : cterm_normal_fg_color - 1));
- UI_CALL(update_bg, (ui->rgb ? normal_bg : cterm_normal_bg_color - 1));
- UI_CALL(update_sp, (ui->rgb ? normal_sp : -1));
-
- sr.top = 0;
- sr.bot = height - 1;
- sr.left = 0;
- sr.right = width - 1;
- UI_CALL(resize, width, height);
+ ui_refresh();
}
-void ui_busy_start(void)
+void ui_schedule_refresh(void)
{
- if (!(busy++)) {
- UI_CALL(busy_start);
- }
+ loop_schedule(&main_loop, event_create(ui_refresh_event, 0));
}
-void ui_busy_stop(void)
+void ui_resize(int width, int height)
{
- if (!(--busy)) {
- UI_CALL(busy_stop);
- }
+ ui_call_grid_resize(1, width, height);
}
-void ui_mouse_on(void)
+void ui_default_colors_set(void)
+{
+ ui_call_default_colors_set(normal_fg, normal_bg, normal_sp,
+ cterm_normal_fg_color, cterm_normal_bg_color);
+}
+
+void ui_busy_start(void)
{
- UI_CALL(mouse_on);
+ if (!(busy++)) {
+ ui_call_busy_start();
+ }
}
-void ui_mouse_off(void)
+void ui_busy_stop(void)
{
- UI_CALL(mouse_off);
+ if (!(--busy)) {
+ ui_call_busy_stop();
+ }
}
void ui_attach_impl(UI *ui)
@@ -214,6 +259,19 @@ void ui_attach_impl(UI *ui)
}
uis[ui_count++] = ui;
+ ui_refresh_options();
+
+ for (UIExtension i = kUIGlobalCount; (int)i < kUIExtCount; i++) {
+ ui_set_ext_option(ui, i, ui->ui_ext[i]);
+ }
+
+ bool sent = false;
+ if (ui->ui_ext[kUIHlState]) {
+ sent = highlight_use_hlstate();
+ }
+ if (!sent) {
+ ui_send_all_hls(ui);
+ }
ui_refresh();
}
@@ -239,283 +297,162 @@ void ui_detach_impl(UI *ui)
shift_index++;
}
- if (--ui_count) {
- ui_refresh();
+ if (--ui_count
+ // During teardown/exit the loop was already destroyed, cannot schedule.
+ // https://github.com/neovim/neovim/pull/5119#issuecomment-258667046
+ && !exiting) {
+ ui_schedule_refresh();
}
}
-void ui_clear(void)
-{
- UI_CALL(clear);
-}
-
-// Set scrolling region for window 'wp'.
-// The region starts 'off' lines from the start of the window.
-// Also set the vertical scroll region for a vertically split window. Always
-// the full width of the window, excluding the vertical separator.
-void ui_set_scroll_region(win_T *wp, int off)
-{
- sr.top = wp->w_winrow + off;
- sr.bot = wp->w_winrow + wp->w_height - 1;
-
- if (wp->w_width != Columns) {
- sr.left = wp->w_wincol;
- sr.right = wp->w_wincol + wp->w_width - 1;
- }
-
- UI_CALL(set_scroll_region, sr.top, sr.bot, sr.left, sr.right);
-}
-
-// Reset scrolling region to the whole screen.
-void ui_reset_scroll_region(void)
-{
- sr.top = 0;
- sr.bot = (int)Rows - 1;
- sr.left = 0;
- sr.right = (int)Columns - 1;
- UI_CALL(set_scroll_region, sr.top, sr.bot, sr.left, sr.right);
-}
-
-void ui_append_lines(int count)
-{
- UI_CALL(scroll, -count);
-}
-
-void ui_delete_lines(int count)
+void ui_set_ext_option(UI *ui, UIExtension ext, bool active)
{
- UI_CALL(scroll, count);
-}
-
-void ui_eol_clear(void)
-{
- UI_CALL(eol_clear);
-}
-
-void ui_start_highlight(int attr_code)
-{
- current_attr_code = attr_code;
-
- if (!ui_count) {
+ if (ext < kUIGlobalCount) {
+ ui_refresh();
return;
}
-
- set_highlight_args(current_attr_code);
-}
-
-void ui_stop_highlight(void)
-{
- current_attr_code = HL_NORMAL;
-
- if (!ui_count) {
- return;
+ if (ui->option_set) {
+ ui->option_set(ui, cstr_as_string((char *)ui_ext_names[ext]),
+ BOOLEAN_OBJ(active));
}
-
- set_highlight_args(current_attr_code);
}
-void ui_visual_bell(void)
+void ui_line(ScreenGrid *grid, int row, int startcol, int endcol, int clearcol,
+ int clearattr, bool wrap)
{
- UI_CALL(visual_bell);
-}
+ size_t off = grid->line_offset[row] + (size_t)startcol;
-void ui_puts(uint8_t *str)
-{
- uint8_t *ptr = str;
- uint8_t c;
-
- while ((c = *ptr)) {
- if (c < 0x20) {
- parse_control_character(c);
- ptr++;
- } else {
- send_output(&ptr);
- }
+ UI_CALL(raw_line, grid->handle, row, startcol, endcol, clearcol, clearattr,
+ wrap, (const schar_T *)grid->chars + off,
+ (const sattr_T *)grid->attrs + off);
+
+ if (p_wd) { // 'writedelay': flush & delay each time.
+ int old_row = cursor_row, old_col = cursor_col;
+ handle_T old_grid = cursor_grid_handle;
+ // If 'writedelay' is active, set the cursor to indicate what was drawn.
+ ui_grid_cursor_goto(grid->handle, row, MIN(clearcol, (int)Columns-1));
+ ui_flush();
+ uint64_t wd = (uint64_t)labs(p_wd);
+ os_microdelay(wd * 1000u, true);
+ ui_grid_cursor_goto(old_grid, old_row, old_col);
}
}
-void ui_putc(uint8_t c)
+void ui_cursor_goto(int new_row, int new_col)
{
- uint8_t buf[2] = {c, 0};
- ui_puts(buf);
+ ui_grid_cursor_goto(DEFAULT_GRID_HANDLE, new_row, new_col);
}
-void ui_cursor_goto(int new_row, int new_col)
+void ui_grid_cursor_goto(handle_T grid_handle, int new_row, int new_col)
{
- if (new_row == row && new_col == col) {
+ if (new_row == cursor_row
+ && new_col == cursor_col
+ && grid_handle == cursor_grid_handle) {
return;
}
- row = new_row;
- col = new_col;
+
+ cursor_row = new_row;
+ cursor_col = new_col;
+ cursor_grid_handle = grid_handle;
pending_cursor_update = true;
}
-void ui_update_menu(void)
+void ui_mode_info_set(void)
{
- UI_CALL(update_menu);
+ pending_mode_info_update = true;
}
int ui_current_row(void)
{
- return row;
+ return cursor_row;
}
int ui_current_col(void)
{
- return col;
+ return cursor_col;
}
void ui_flush(void)
{
- UI_CALL(flush);
-}
-
-static void send_output(uint8_t **ptr)
-{
- uint8_t *p = *ptr;
-
- while (*p >= 0x20) {
- size_t clen = (size_t)mb_ptr2len(p);
- UI_CALL(put, p, (size_t)clen);
- col++;
- if (mb_ptr2cells(p) > 1) {
- // double cell character, blank the next cell
- UI_CALL(put, NULL, 0);
- col++;
- }
- if (col >= width) {
- ui_linefeed();
- }
- p += clen;
- }
-
- *ptr = p;
-}
-
-static void parse_control_character(uint8_t c)
-{
- if (c == '\n') {
- ui_linefeed();
- } else if (c == '\r') {
- ui_carriage_return();
- } else if (c == '\b') {
- ui_cursor_left();
- } else if (c == Ctrl_L) {
- ui_cursor_right();
- } else if (c == Ctrl_G) {
- UI_CALL(bell);
- }
-}
-
-static void set_highlight_args(int attr_code)
-{
- HlAttrs rgb_attrs = { false, false, false, false, false, -1, -1, -1 };
- HlAttrs cterm_attrs = rgb_attrs;
-
- if (attr_code == HL_NORMAL) {
- goto end;
- }
-
- int rgb_mask = 0;
- int cterm_mask = 0;
- attrentry_T *aep = syn_cterm_attr2entry(attr_code);
-
- if (!aep) {
- goto end;
- }
-
- rgb_mask = aep->rgb_ae_attr;
- cterm_mask = aep->cterm_ae_attr;
-
- rgb_attrs.bold = rgb_mask & HL_BOLD;
- rgb_attrs.underline = rgb_mask & HL_UNDERLINE;
- rgb_attrs.undercurl = rgb_mask & HL_UNDERCURL;
- rgb_attrs.italic = rgb_mask & HL_ITALIC;
- rgb_attrs.reverse = rgb_mask & (HL_INVERSE | HL_STANDOUT);
- cterm_attrs.bold = cterm_mask & HL_BOLD;
- cterm_attrs.underline = cterm_mask & HL_UNDERLINE;
- cterm_attrs.undercurl = cterm_mask & HL_UNDERCURL;
- cterm_attrs.italic = cterm_mask & HL_ITALIC;
- cterm_attrs.reverse = cterm_mask & (HL_INVERSE | HL_STANDOUT);
-
- if (aep->rgb_fg_color != normal_fg) {
- rgb_attrs.foreground = aep->rgb_fg_color;
- }
-
- if (aep->rgb_bg_color != normal_bg) {
- rgb_attrs.background = aep->rgb_bg_color;
+ cmdline_ui_flush();
+ win_ui_flush();
+ if (pending_cursor_update) {
+ ui_call_grid_cursor_goto(cursor_grid_handle, cursor_row, cursor_col);
+ pending_cursor_update = false;
}
-
- if (aep->rgb_sp_color != normal_sp) {
- rgb_attrs.special = aep->rgb_sp_color;
+ if (pending_mode_info_update) {
+ Array style = mode_style_array();
+ bool enabled = (*p_guicursor != NUL);
+ ui_call_mode_info_set(enabled, style);
+ api_free_array(style);
+ pending_mode_info_update = false;
}
-
- if (cterm_normal_fg_color != aep->cterm_fg_color) {
- cterm_attrs.foreground = aep->cterm_fg_color - 1;
+ if (pending_mode_update) {
+ char *full_name = shape_table[ui_mode_idx].full_name;
+ ui_call_mode_change(cstr_as_string(full_name), ui_mode_idx);
+ pending_mode_update = false;
}
-
- if (cterm_normal_bg_color != aep->cterm_bg_color) {
- cterm_attrs.background = aep->cterm_bg_color - 1;
- }
-
-end:
- UI_CALL(highlight_set, (ui->rgb ? rgb_attrs : cterm_attrs));
+ ui_call_flush();
}
-static void ui_linefeed(void)
+
+/// Check if current mode has changed.
+/// May update the shape of the cursor.
+void ui_cursor_shape(void)
{
- int new_col = 0;
- int new_row = row;
- if (new_row < sr.bot) {
- new_row++;
- } else {
- UI_CALL(scroll, 1);
+ if (!full_screen) {
+ return;
}
- ui_cursor_goto(new_row, new_col);
-}
+ int new_mode_idx = cursor_get_mode_idx();
-static void ui_carriage_return(void)
-{
- int new_col = 0;
- ui_cursor_goto(row, new_col);
+ if (new_mode_idx != ui_mode_idx) {
+ ui_mode_idx = new_mode_idx;
+ pending_mode_update = true;
+ }
+ conceal_check_cursor_line();
}
-static void ui_cursor_left(void)
+/// Returns true if `widget` is externalized.
+bool ui_is_external(UIExtension widget)
{
- int new_col = col - 1;
- assert(new_col >= 0);
- ui_cursor_goto(row, new_col);
+ return ui_ext[widget];
}
-static void ui_cursor_right(void)
+Array ui_array(void)
{
- int new_col = col + 1;
- assert(new_col < width);
- ui_cursor_goto(row, new_col);
+ Array all_uis = ARRAY_DICT_INIT;
+ for (size_t i = 0; i < ui_count; i++) {
+ UI *ui = uis[i];
+ Dictionary info = ARRAY_DICT_INIT;
+ PUT(info, "width", INTEGER_OBJ(ui->width));
+ PUT(info, "height", INTEGER_OBJ(ui->height));
+ PUT(info, "rgb", BOOLEAN_OBJ(ui->rgb));
+ for (UIExtension j = 0; j < kUIExtCount; j++) {
+ PUT(info, ui_ext_names[j], BOOLEAN_OBJ(ui->ui_ext[j]));
+ }
+ if (ui->inspect) {
+ ui->inspect(ui, &info);
+ }
+ ADD(all_uis, DICTIONARY_OBJ(info));
+ }
+ return all_uis;
}
-static void flush_cursor_update(void)
+void ui_grid_resize(handle_T grid_handle, int width, int height, Error *error)
{
- if (pending_cursor_update) {
- pending_cursor_update = false;
- UI_CALL(cursor_goto, row, col);
+ if (grid_handle == DEFAULT_GRID_HANDLE) {
+ screen_resize(width, height);
+ return;
}
-}
-// Notify that the current mode has changed. Can be used to change cursor
-// shape, for example.
-static void ui_mode_change(void)
-{
- int mode;
- if (!full_screen) {
+ win_T *wp = get_win_by_grid_handle(grid_handle);
+ if (wp == NULL) {
+ api_set_error(error, kErrorTypeValidation,
+ "No window with the given handle");
return;
}
- /* Get a simple UI mode out of State. */
- if ((State & REPLACE) == REPLACE)
- mode = REPLACE;
- else if (State & INSERT)
- mode = INSERT;
- else
- mode = NORMAL;
- UI_CALL(mode_change, mode);
- conceal_check_cursur_line();
+
+ wp->w_grid.requested_rows = (int)height;
+ wp->w_grid.requested_cols = (int)width;
+ redraw_win_later(wp, SOME_VALID);
}
diff --git a/src/nvim/ui.h b/src/nvim/ui.h
index 5934d2fee9..16237214cb 100644
--- a/src/nvim/ui.h
+++ b/src/nvim/ui.h
@@ -5,44 +5,58 @@
#include <stdbool.h>
#include <stdint.h>
-typedef struct {
- bool bold, underline, undercurl, italic, reverse;
- int foreground, background, special;
-} HlAttrs;
+#include "nvim/globals.h"
+#include "nvim/api/private/defs.h"
+#include "nvim/highlight_defs.h"
+
+typedef enum {
+ kUICmdline = 0,
+ kUIPopupmenu,
+ kUITabline,
+ kUIWildmenu,
+#define kUIGlobalCount (kUIWildmenu+1)
+ kUILinegrid,
+ kUIMultigrid,
+ kUIHlState,
+ kUIExtCount,
+} UIExtension;
+
+EXTERN const char *ui_ext_names[] INIT(= {
+ "ext_cmdline",
+ "ext_popupmenu",
+ "ext_tabline",
+ "ext_wildmenu",
+ "ext_linegrid",
+ "ext_multigrid",
+ "ext_hlstate",
+});
+
typedef struct ui_t UI;
struct ui_t {
bool rgb;
+ bool ui_ext[kUIExtCount]; ///< Externalized widgets
int width, height;
void *data;
- void (*resize)(UI *ui, int rows, int columns);
- void (*clear)(UI *ui);
- void (*eol_clear)(UI *ui);
- void (*cursor_goto)(UI *ui, int row, int col);
- void (*update_menu)(UI *ui);
- void (*busy_start)(UI *ui);
- void (*busy_stop)(UI *ui);
- void (*mouse_on)(UI *ui);
- void (*mouse_off)(UI *ui);
- void (*mode_change)(UI *ui, int mode);
- void (*set_scroll_region)(UI *ui, int top, int bot, int left, int right);
- void (*scroll)(UI *ui, int count);
- void (*highlight_set)(UI *ui, HlAttrs attrs);
- void (*put)(UI *ui, uint8_t *str, size_t len);
- void (*bell)(UI *ui);
- void (*visual_bell)(UI *ui);
- void (*flush)(UI *ui);
- void (*update_fg)(UI *ui, int fg);
- void (*update_bg)(UI *ui, int bg);
- void (*update_sp)(UI *ui, int sp);
- void (*suspend)(UI *ui);
- void (*set_title)(UI *ui, char *title);
- void (*set_icon)(UI *ui, char *icon);
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "ui_events.generated.h"
+#endif
+
+ // For perfomance and simplicity, we use the dense screen representation
+ // in the bridge and the TUI. The remote_ui module will translate this
+ // in to the public grid_line format.
+ void (*raw_line)(UI *ui, Integer grid, Integer row, Integer startcol,
+ Integer endcol, Integer clearcol, Integer clearattr,
+ Boolean wrap, const schar_T *chunk, const sattr_T *attrs);
+ void (*event)(UI *ui, char *name, Array args, bool *args_consumed);
void (*stop)(UI *ui);
+ void (*inspect)(UI *ui, Dictionary *info);
};
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "ui.h.generated.h"
+# include "ui_events_call.h.generated.h"
#endif
#endif // NVIM_UI_H
diff --git a/src/nvim/ui_bridge.c b/src/nvim/ui_bridge.c
index 6290fb3d87..bd5d37be73 100644
--- a/src/nvim/ui_bridge.c
+++ b/src/nvim/ui_bridge.c
@@ -1,16 +1,22 @@
-// FIXME(tarruda): This module is very repetitive. It might be a good idea to
-// automatically generate it with a lua script during build
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+// UI wrapper that sends requests to the UI thread.
+// Used by the built-in TUI and libnvim-based UIs.
+
#include <assert.h>
#include <stdbool.h>
#include <stdio.h>
#include <limits.h>
+#include "nvim/log.h"
#include "nvim/main.h"
#include "nvim/vim.h"
#include "nvim/ui.h"
#include "nvim/memory.h"
#include "nvim/ui_bridge.h"
#include "nvim/ugrid.h"
+#include "nvim/api/private/helpers.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "ui_bridge.c.generated.h"
@@ -18,13 +24,17 @@
#define UI(b) (((UIBridgeData *)b)->ui)
-// Call a function in the UI thread
-#define UI_CALL(ui, name, argc, ...) \
+// Schedule a function call on the UI bridge thread.
+#define UI_BRIDGE_CALL(ui, name, argc, ...) \
((UIBridgeData *)ui)->scheduler( \
- event_create(1, ui_bridge_##name##_event, argc, __VA_ARGS__), UI(ui))
+ event_create(ui_bridge_##name##_event, argc, __VA_ARGS__), UI(ui))
-#define INT2PTR(i) ((void *)(uintptr_t)i)
-#define PTR2INT(p) ((int)(uintptr_t)p)
+#define INT2PTR(i) ((void *)(intptr_t)i)
+#define PTR2INT(p) ((Integer)(intptr_t)p)
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "ui_events_bridge.generated.h"
+#endif
UI *ui_bridge_attach(UI *ui, ui_main_fn ui_main, event_scheduler scheduler)
{
@@ -32,31 +42,33 @@ UI *ui_bridge_attach(UI *ui, ui_main_fn ui_main, event_scheduler scheduler)
rv->ui = ui;
rv->bridge.rgb = ui->rgb;
rv->bridge.stop = ui_bridge_stop;
- rv->bridge.resize = ui_bridge_resize;
- rv->bridge.clear = ui_bridge_clear;
- rv->bridge.eol_clear = ui_bridge_eol_clear;
- rv->bridge.cursor_goto = ui_bridge_cursor_goto;
+ rv->bridge.grid_resize = ui_bridge_grid_resize;
+ rv->bridge.grid_clear = ui_bridge_grid_clear;
+ rv->bridge.grid_cursor_goto = ui_bridge_grid_cursor_goto;
+ rv->bridge.mode_info_set = ui_bridge_mode_info_set;
rv->bridge.update_menu = ui_bridge_update_menu;
rv->bridge.busy_start = ui_bridge_busy_start;
rv->bridge.busy_stop = ui_bridge_busy_stop;
rv->bridge.mouse_on = ui_bridge_mouse_on;
rv->bridge.mouse_off = ui_bridge_mouse_off;
rv->bridge.mode_change = ui_bridge_mode_change;
- rv->bridge.set_scroll_region = ui_bridge_set_scroll_region;
- rv->bridge.scroll = ui_bridge_scroll;
- rv->bridge.highlight_set = ui_bridge_highlight_set;
- rv->bridge.put = ui_bridge_put;
+ rv->bridge.grid_scroll = ui_bridge_grid_scroll;
+ rv->bridge.hl_attr_define = ui_bridge_hl_attr_define;
rv->bridge.bell = ui_bridge_bell;
rv->bridge.visual_bell = ui_bridge_visual_bell;
- rv->bridge.update_fg = ui_bridge_update_fg;
- rv->bridge.update_bg = ui_bridge_update_bg;
- rv->bridge.update_sp = ui_bridge_update_sp;
+ rv->bridge.default_colors_set = ui_bridge_default_colors_set;
rv->bridge.flush = ui_bridge_flush;
rv->bridge.suspend = ui_bridge_suspend;
rv->bridge.set_title = ui_bridge_set_title;
rv->bridge.set_icon = ui_bridge_set_icon;
+ rv->bridge.option_set = ui_bridge_option_set;
+ rv->bridge.raw_line = ui_bridge_raw_line;
rv->scheduler = scheduler;
+ for (UIExtension i = 0; (int)i < kUIExtCount; i++) {
+ rv->bridge.ui_ext[i] = ui->ui_ext[i];
+ }
+
rv->ui_main = ui_main;
uv_mutex_init(&rv->mutex);
uv_cond_init(&rv->cond);
@@ -67,6 +79,7 @@ UI *ui_bridge_attach(UI *ui, ui_main_fn ui_main, event_scheduler scheduler)
abort();
}
+ // Suspend the main thread until CONTINUE is called by the UI thread.
while (!rv->ready) {
uv_cond_wait(&rv->cond, &rv->mutex);
}
@@ -91,22 +104,26 @@ static void ui_thread_run(void *data)
static void ui_bridge_stop(UI *b)
{
+ // Detach bridge first, so that "stop" is the last event the TUI loop
+ // receives from the main thread. #8041
+ ui_detach_impl(b);
UIBridgeData *bridge = (UIBridgeData *)b;
bool stopped = bridge->stopped = false;
- UI_CALL(b, stop, 1, b);
+ UI_BRIDGE_CALL(b, stop, 1, b);
for (;;) {
uv_mutex_lock(&bridge->mutex);
stopped = bridge->stopped;
uv_mutex_unlock(&bridge->mutex);
- if (stopped) {
+ if (stopped) { // -V547
break;
}
- loop_poll_events(&main_loop, 10);
+ // TODO(justinmk): Remove this. Use a cond-wait above. #9274
+ loop_poll_events(&main_loop, 10); // Process one event.
}
uv_thread_join(&bridge->ui_thread);
uv_mutex_destroy(&bridge->mutex);
uv_cond_destroy(&bridge->cond);
- ui_detach_impl(b);
+ xfree(bridge->ui); // Threads joined, now safe to free UI container. #7922
xfree(b);
}
static void ui_bridge_stop_event(void **argv)
@@ -115,225 +132,52 @@ static void ui_bridge_stop_event(void **argv)
ui->stop(ui);
}
-static void ui_bridge_resize(UI *b, int width, int height)
-{
- UI_CALL(b, resize, 3, b, INT2PTR(width), INT2PTR(height));
-}
-static void ui_bridge_resize_event(void **argv)
-{
- UI *ui = UI(argv[0]);
- ui->resize(ui, PTR2INT(argv[1]), PTR2INT(argv[2]));
-}
-
-static void ui_bridge_clear(UI *b)
-{
- UI_CALL(b, clear, 1, b);
-}
-static void ui_bridge_clear_event(void **argv)
-{
- UI *ui = UI(argv[0]);
- ui->clear(ui);
-}
-
-static void ui_bridge_eol_clear(UI *b)
-{
- UI_CALL(b, eol_clear, 1, b);
-}
-static void ui_bridge_eol_clear_event(void **argv)
-{
- UI *ui = UI(argv[0]);
- ui->eol_clear(ui);
-}
-
-static void ui_bridge_cursor_goto(UI *b, int row, int col)
-{
- UI_CALL(b, cursor_goto, 3, b, INT2PTR(row), INT2PTR(col));
-}
-static void ui_bridge_cursor_goto_event(void **argv)
-{
- UI *ui = UI(argv[0]);
- ui->cursor_goto(ui, PTR2INT(argv[1]), PTR2INT(argv[2]));
-}
-
-static void ui_bridge_update_menu(UI *b)
-{
- UI_CALL(b, update_menu, 1, b);
-}
-static void ui_bridge_update_menu_event(void **argv)
-{
- UI *ui = UI(argv[0]);
- ui->update_menu(ui);
-}
-
-static void ui_bridge_busy_start(UI *b)
-{
- UI_CALL(b, busy_start, 1, b);
-}
-static void ui_bridge_busy_start_event(void **argv)
-{
- UI *ui = UI(argv[0]);
- ui->busy_start(ui);
-}
-
-static void ui_bridge_busy_stop(UI *b)
-{
- UI_CALL(b, busy_stop, 1, b);
-}
-static void ui_bridge_busy_stop_event(void **argv)
-{
- UI *ui = UI(argv[0]);
- ui->busy_stop(ui);
-}
-
-static void ui_bridge_mouse_on(UI *b)
-{
- UI_CALL(b, mouse_on, 1, b);
-}
-static void ui_bridge_mouse_on_event(void **argv)
-{
- UI *ui = UI(argv[0]);
- ui->mouse_on(ui);
-}
-
-static void ui_bridge_mouse_off(UI *b)
-{
- UI_CALL(b, mouse_off, 1, b);
-}
-static void ui_bridge_mouse_off_event(void **argv)
-{
- UI *ui = UI(argv[0]);
- ui->mouse_off(ui);
-}
-
-static void ui_bridge_mode_change(UI *b, int mode)
-{
- UI_CALL(b, mode_change, 2, b, INT2PTR(mode));
-}
-static void ui_bridge_mode_change_event(void **argv)
-{
- UI *ui = UI(argv[0]);
- ui->mode_change(ui, PTR2INT(argv[1]));
-}
-
-static void ui_bridge_set_scroll_region(UI *b, int top, int bot, int left,
- int right)
-{
- UI_CALL(b, set_scroll_region, 5, b, INT2PTR(top), INT2PTR(bot),
- INT2PTR(left), INT2PTR(right));
-}
-static void ui_bridge_set_scroll_region_event(void **argv)
-{
- UI *ui = UI(argv[0]);
- ui->set_scroll_region(ui, PTR2INT(argv[1]), PTR2INT(argv[2]),
- PTR2INT(argv[3]), PTR2INT(argv[4]));
-}
-
-static void ui_bridge_scroll(UI *b, int count)
-{
- UI_CALL(b, scroll, 2, b, INT2PTR(count));
-}
-static void ui_bridge_scroll_event(void **argv)
-{
- UI *ui = UI(argv[0]);
- ui->scroll(ui, PTR2INT(argv[1]));
-}
-
-static void ui_bridge_highlight_set(UI *b, HlAttrs attrs)
+static void ui_bridge_hl_attr_define(UI *ui, Integer id, HlAttrs attrs,
+ HlAttrs cterm_attrs, Array info)
{
HlAttrs *a = xmalloc(sizeof(HlAttrs));
*a = attrs;
- UI_CALL(b, highlight_set, 2, b, a);
-}
-static void ui_bridge_highlight_set_event(void **argv)
-{
- UI *ui = UI(argv[0]);
- ui->highlight_set(ui, *((HlAttrs *)argv[1]));
- xfree(argv[1]);
-}
-
-static void ui_bridge_put(UI *b, uint8_t *text, size_t size)
-{
- uint8_t *t = NULL;
- if (text) {
- t = xmalloc(sizeof(((UCell *)0)->data));
- memcpy(t, text, size);
- }
- UI_CALL(b, put, 3, b, t, INT2PTR(size));
-}
-static void ui_bridge_put_event(void **argv)
-{
- UI *ui = UI(argv[0]);
- ui->put(ui, (uint8_t *)argv[1], (size_t)(uintptr_t)argv[2]);
- xfree(argv[1]);
-}
-
-static void ui_bridge_bell(UI *b)
-{
- UI_CALL(b, bell, 1, b);
+ UI_BRIDGE_CALL(ui, hl_attr_define, 3, ui, INT2PTR(id), a);
}
-static void ui_bridge_bell_event(void **argv)
+static void ui_bridge_hl_attr_define_event(void **argv)
{
UI *ui = UI(argv[0]);
- ui->bell(ui);
+ Array info = ARRAY_DICT_INIT;
+ ui->hl_attr_define(ui, PTR2INT(argv[1]), *((HlAttrs *)argv[2]),
+ *((HlAttrs *)argv[2]), info);
+ xfree(argv[2]);
}
-static void ui_bridge_visual_bell(UI *b)
-{
- UI_CALL(b, visual_bell, 1, b);
-}
-static void ui_bridge_visual_bell_event(void **argv)
-{
- UI *ui = UI(argv[0]);
- ui->visual_bell(ui);
-}
-
-static void ui_bridge_update_fg(UI *b, int fg)
-{
- UI_CALL(b, update_fg, 2, b, INT2PTR(fg));
-}
-static void ui_bridge_update_fg_event(void **argv)
+static void ui_bridge_raw_line_event(void **argv)
{
UI *ui = UI(argv[0]);
- ui->update_fg(ui, PTR2INT(argv[1]));
+ ui->raw_line(ui, PTR2INT(argv[1]), PTR2INT(argv[2]), PTR2INT(argv[3]),
+ PTR2INT(argv[4]), PTR2INT(argv[5]), PTR2INT(argv[6]),
+ PTR2INT(argv[7]), argv[8], argv[9]);
+ xfree(argv[8]);
+ xfree(argv[9]);
}
-
-static void ui_bridge_update_bg(UI *b, int bg)
-{
- UI_CALL(b, update_bg, 2, b, INT2PTR(bg));
-}
-static void ui_bridge_update_bg_event(void **argv)
+static void ui_bridge_raw_line(UI *ui, Integer grid, Integer row,
+ Integer startcol, Integer endcol,
+ Integer clearcol, Integer clearattr,
+ Boolean wrap, const schar_T *chunk,
+ const sattr_T *attrs)
{
- UI *ui = UI(argv[0]);
- ui->update_bg(ui, PTR2INT(argv[1]));
-}
-
-static void ui_bridge_update_sp(UI *b, int sp)
-{
- UI_CALL(b, update_sp, 2, b, INT2PTR(sp));
-}
-static void ui_bridge_update_sp_event(void **argv)
-{
- UI *ui = UI(argv[0]);
- ui->update_sp(ui, PTR2INT(argv[1]));
-}
-
-static void ui_bridge_flush(UI *b)
-{
- UI_CALL(b, flush, 1, b);
-}
-static void ui_bridge_flush_event(void **argv)
-{
- UI *ui = UI(argv[0]);
- ui->flush(ui);
+ size_t ncol = (size_t)(endcol-startcol);
+ schar_T *c = xmemdup(chunk, ncol * sizeof(schar_T));
+ sattr_T *hl = xmemdup(attrs, ncol * sizeof(sattr_T));
+ UI_BRIDGE_CALL(ui, raw_line, 10, ui, INT2PTR(grid), INT2PTR(row),
+ INT2PTR(startcol), INT2PTR(endcol), INT2PTR(clearcol),
+ INT2PTR(clearattr), INT2PTR(wrap), c, hl);
}
static void ui_bridge_suspend(UI *b)
{
UIBridgeData *data = (UIBridgeData *)b;
uv_mutex_lock(&data->mutex);
- UI_CALL(b, suspend, 1, b);
+ UI_BRIDGE_CALL(b, suspend, 1, b);
data->ready = false;
- // suspend the main thread until CONTINUE is called by the UI thread
+ // Suspend the main thread until CONTINUE is called by the UI thread.
while (!data->ready) {
uv_cond_wait(&data->cond, &data->mutex);
}
@@ -345,24 +189,27 @@ static void ui_bridge_suspend_event(void **argv)
ui->suspend(ui);
}
-static void ui_bridge_set_title(UI *b, char *title)
+static void ui_bridge_option_set(UI *ui, String name, Object value)
{
- UI_CALL(b, set_title, 2, b, title ? xstrdup(title) : NULL);
-}
-static void ui_bridge_set_title_event(void **argv)
-{
- UI *ui = UI(argv[0]);
- ui->set_title(ui, argv[1]);
- xfree(argv[1]);
-}
-
-static void ui_bridge_set_icon(UI *b, char *icon)
-{
- UI_CALL(b, set_icon, 2, b, icon ? xstrdup(icon) : NULL);
+ String copy_name = copy_string(name);
+ Object *copy_value = xmalloc(sizeof(Object));
+ *copy_value = copy_object(value);
+ UI_BRIDGE_CALL(ui, option_set, 4, ui, copy_name.data,
+ INT2PTR(copy_name.size), copy_value);
+ // TODO(bfredl): when/if TUI/bridge teardown is refactored to use events, the
+ // commit that introduced this special case can be reverted.
+ // For now this is needed for nvim_list_uis().
+ if (strequal(name.data, "termguicolors")) {
+ ui->rgb = value.data.boolean;
+ }
}
-static void ui_bridge_set_icon_event(void **argv)
+static void ui_bridge_option_set_event(void **argv)
{
UI *ui = UI(argv[0]);
- ui->set_icon(ui, argv[1]);
- xfree(argv[1]);
+ String name = (String){ .data = argv[1], .size = (size_t)argv[2] };
+ Object value = *(Object *)argv[3];
+ ui->option_set(ui, name, value);
+ api_free_string(name);
+ api_free_object(value);
+ xfree(argv[3]);
}
diff --git a/src/nvim/ui_bridge.h b/src/nvim/ui_bridge.h
index 561ddb6b24..dba461550f 100644
--- a/src/nvim/ui_bridge.h
+++ b/src/nvim/ui_bridge.h
@@ -1,4 +1,5 @@
-// Bridge used for communication between a builtin UI thread and nvim core
+// Bridge for communication between a UI thread and nvim core.
+// Used by the built-in TUI and libnvim-based UIs.
#ifndef NVIM_UI_BRIDGE_H
#define NVIM_UI_BRIDGE_H
@@ -11,7 +12,7 @@ typedef struct ui_bridge_data UIBridgeData;
typedef void(*ui_main_fn)(UIBridgeData *bridge, UI *ui);
struct ui_bridge_data {
UI bridge; // actual UI passed to ui_attach
- UI *ui; // UI pointer that will have it's callback called in
+ UI *ui; // UI pointer that will have its callback called in
// another thread
event_scheduler scheduler;
uv_thread_t ui_thread;
diff --git a/src/nvim/undo.c b/src/nvim/undo.c
index fc5d6acaa4..df0507ed41 100644
--- a/src/nvim/undo.c
+++ b/src/nvim/undo.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/*
* undo.c: multi level undo facility
*
@@ -76,17 +79,20 @@
#include <inttypes.h>
#include <limits.h>
#include <stdbool.h>
+#include <stdint.h>
#include <string.h>
#include <fcntl.h>
#include "nvim/vim.h"
#include "nvim/ascii.h"
#include "nvim/undo.h"
+#include "nvim/macros.h"
#include "nvim/cursor.h"
#include "nvim/edit.h"
#include "nvim/eval.h"
#include "nvim/fileio.h"
#include "nvim/fold.h"
+#include "nvim/buffer_updates.h"
#include "nvim/mark.h"
#include "nvim/memline.h"
#include "nvim/message.h"
@@ -99,6 +105,7 @@
#include "nvim/quickfix.h"
#include "nvim/screen.h"
#include "nvim/sha256.h"
+#include "nvim/state.h"
#include "nvim/strings.h"
#include "nvim/types.h"
#include "nvim/os/os.h"
@@ -115,7 +122,7 @@ static long u_newcount, u_oldcount;
* When 'u' flag included in 'cpoptions', we behave like vi. Need to remember
* the action that "u" should do.
*/
-static int undo_undoes = FALSE;
+static bool undo_undoes = false;
static int lastmark = 0;
@@ -304,23 +311,19 @@ bool undo_allowed(void)
return true;
}
-/*
- * Get the undolevle value for the current buffer.
- */
+/// Get the 'undolevels' value for the current buffer.
static long get_undolevel(void)
{
- if (curbuf->terminal) {
- return -1;
- }
- if (curbuf->b_p_ul == NO_LOCAL_UNDOLEVEL)
+ if (curbuf->b_p_ul == NO_LOCAL_UNDOLEVEL) {
return p_ul;
+ }
return curbuf->b_p_ul;
}
static inline void zero_fmark_additional_data(fmark_T *fmarks)
{
for (size_t i = 0; i < NMARKS; i++) {
- dict_unref(fmarks[i].additional_data);
+ tv_dict_unref(fmarks[i].additional_data);
fmarks[i].additional_data = NULL;
}
}
@@ -588,7 +591,7 @@ int u_savecommon(linenr_T top, linenr_T bot, linenr_T newbot, int reload)
uep->ue_next = curbuf->b_u_newhead->uh_entry;
curbuf->b_u_newhead->uh_entry = uep;
curbuf->b_u_synced = false;
- undo_undoes = FALSE;
+ undo_undoes = false;
#ifdef U_DEBUG
u_check(FALSE);
@@ -690,7 +693,7 @@ char *u_get_undo_file_name(const char *const buf_ffname, const bool reading)
int ret;
char *failed_dir;
if ((ret = os_mkdir_recurse(dir_name, 0755, &failed_dir)) != 0) {
- EMSG3(_("E926: Unable to create directory \"%s\" for undo file: %s"),
+ EMSG3(_("E5003: Unable to create directory \"%s\" for undo file: %s"),
failed_dir, os_strerror(ret));
xfree(failed_dir);
} else {
@@ -700,7 +703,7 @@ char *u_get_undo_file_name(const char *const buf_ffname, const bool reading)
if (has_directory) {
if (munged_name == NULL) {
munged_name = xstrdup(ffname);
- for (char *p = munged_name; *p != NUL; mb_ptr_adv(p)) {
+ for (char *p = munged_name; *p != NUL; MB_PTR_ADV(p)) {
if (vim_ispathsep(*p)) {
*p = '%';
}
@@ -888,7 +891,7 @@ static u_header_T *unserialize_uhp(bufinfo_T *bi,
for (;; ) {
int len = undo_read_byte(bi);
- if (len == 0) {
+ if (len == 0 || len == EOF) {
break;
}
int what = undo_read_byte(bi);
@@ -968,12 +971,12 @@ static u_entry_T *unserialize_uep(bufinfo_T * bi, bool *error,
uep->ue_lcount = undo_read_4c(bi);
uep->ue_size = undo_read_4c(bi);
- char_u **array;
+ char_u **array = NULL;
if (uep->ue_size > 0) {
- array = xmalloc(sizeof(char_u *) * (size_t)uep->ue_size);
- memset(array, 0, sizeof(char_u *) * (size_t)uep->ue_size);
- } else {
- array = NULL;
+ if ((size_t)uep->ue_size < SIZE_MAX / sizeof(char_u *)) { // -V547
+ array = xmalloc(sizeof(char_u *) * (size_t)uep->ue_size);
+ memset(array, 0, sizeof(char_u *) * (size_t)uep->ue_size);
+ }
}
uep->ue_array = array;
@@ -1083,7 +1086,7 @@ void u_write_undo(const char *const name, const bool forceit, buf_T *const buf,
*/
perm = 0600;
if (buf->b_ffname != NULL) {
- perm = os_getperm(buf->b_ffname);
+ perm = os_getperm((const char *)buf->b_ffname);
if (perm < 0) {
perm = 0600;
}
@@ -1142,7 +1145,7 @@ void u_write_undo(const char *const name, const bool forceit, buf_T *const buf,
EMSG2(_(e_not_open), file_name);
goto theend;
}
- (void)os_setperm((char_u *)file_name, perm);
+ (void)os_setperm(file_name, perm);
if (p_verbose > 0) {
verbose_enter();
smsg(_("Writing undo file: %s"), file_name);
@@ -1167,7 +1170,7 @@ void u_write_undo(const char *const name, const bool forceit, buf_T *const buf,
&& os_fileinfo(file_name, &file_info_new)
&& file_info_old.stat.st_gid != file_info_new.stat.st_gid
&& os_fchown(fd, (uv_uid_t)-1, (uv_gid_t)file_info_old.stat.st_gid)) {
- os_setperm((char_u *)file_name, (perm & 0707) | ((perm & 07) << 3));
+ os_setperm(file_name, (perm & 0707) | ((perm & 07) << 3));
}
# ifdef HAVE_SELINUX
if (buf->b_ffname != NULL)
@@ -1402,7 +1405,9 @@ void u_read_undo(char *name, char_u *hash, char_u *orig_name)
// sequence numbers of the headers.
// When there are no headers uhp_table is NULL.
if (num_head > 0) {
- uhp_table = xmalloc((size_t)num_head * sizeof(u_header_T *));
+ if ((size_t)num_head < SIZE_MAX / sizeof(*uhp_table)) { // -V547
+ uhp_table = xmalloc((size_t)num_head * sizeof(*uhp_table));
+ }
}
long num_read_uhps = 0;
@@ -1630,7 +1635,13 @@ static time_t undo_read_time(bufinfo_T *bi)
static bool undo_read(bufinfo_T *bi, uint8_t *buffer, size_t size)
FUNC_ATTR_NONNULL_ARG(1)
{
- return fread(buffer, size, 1, bi->bi_fp) == 1;
+ const bool retval = fread(buffer, size, 1, bi->bi_fp) == 1;
+ if (!retval) {
+ // Error may be checked for only later. Fill with zeros,
+ // so that the reader won't use garbage.
+ memset(buffer, 0, size);
+ }
+ return retval;
}
/// Reads a string of length "len" from "bi->bi_fd" and appends a zero to it.
@@ -1664,11 +1675,12 @@ void u_undo(int count)
count = 1;
}
- if (vim_strchr(p_cpo, CPO_UNDO) == NULL)
- undo_undoes = TRUE;
- else
+ if (vim_strchr(p_cpo, CPO_UNDO) == NULL) {
+ undo_undoes = true;
+ } else {
undo_undoes = !undo_undoes;
- u_doit(count);
+ }
+ u_doit(count, false, true);
}
/*
@@ -1677,15 +1689,64 @@ void u_undo(int count)
*/
void u_redo(int count)
{
- if (vim_strchr(p_cpo, CPO_UNDO) == NULL)
- undo_undoes = FALSE;
- u_doit(count);
+ if (vim_strchr(p_cpo, CPO_UNDO) == NULL) {
+ undo_undoes = false;
+ }
+
+ u_doit(count, false, true);
}
-/*
- * Undo or redo, depending on 'undo_undoes', 'count' times.
- */
-static void u_doit(int startcount)
+/// Undo and remove the branch from the undo tree.
+/// Also moves the cursor (as a "normal" undo would).
+bool u_undo_and_forget(int count)
+{
+ if (curbuf->b_u_synced == false) {
+ u_sync(true);
+ count = 1;
+ }
+ undo_undoes = true;
+ u_doit(count, true,
+ // Don't send nvim_buf_lines_event for u_undo_and_forget().
+ false);
+
+ if (curbuf->b_u_curhead == NULL) {
+ // nothing was undone.
+ return false;
+ }
+
+ // Delete the current redo header
+ // set the redo header to the next alternative branch (if any)
+ // otherwise we will be in the leaf state
+ u_header_T *to_forget = curbuf->b_u_curhead;
+ curbuf->b_u_newhead = to_forget->uh_next.ptr;
+ curbuf->b_u_curhead = to_forget->uh_alt_next.ptr;
+ if (curbuf->b_u_curhead) {
+ to_forget->uh_alt_next.ptr = NULL;
+ curbuf->b_u_curhead->uh_alt_prev.ptr = to_forget->uh_alt_prev.ptr;
+ curbuf->b_u_seq_cur = curbuf->b_u_curhead->uh_next.ptr ?
+ curbuf->b_u_curhead->uh_next.ptr->uh_seq : 0;
+ } else if (curbuf->b_u_newhead) {
+ curbuf->b_u_seq_cur = curbuf->b_u_newhead->uh_seq;
+ }
+ if (to_forget->uh_alt_prev.ptr) {
+ to_forget->uh_alt_prev.ptr->uh_alt_next.ptr = curbuf->b_u_curhead;
+ }
+ if (curbuf->b_u_newhead) {
+ curbuf->b_u_newhead->uh_prev.ptr = curbuf->b_u_curhead;
+ }
+ if (curbuf->b_u_seq_last == to_forget->uh_seq) {
+ curbuf->b_u_seq_last--;
+ }
+ u_freebranch(curbuf, to_forget, NULL);
+ return true;
+}
+
+/// Undo or redo, depending on `undo_undoes`, `count` times.
+///
+/// @param startcount How often to undo or redo
+/// @param quiet If `true`, don't show messages
+/// @param do_buf_event If `true`, send the changedtick with the buffer updates
+static void u_doit(int startcount, bool quiet, bool do_buf_event)
{
int count = startcount;
@@ -1721,7 +1782,7 @@ static void u_doit(int startcount)
break;
}
- u_undoredo(TRUE);
+ u_undoredo(true, do_buf_event);
} else {
if (curbuf->b_u_curhead == NULL || get_undolevel() <= 0) {
beep_flush(); /* nothing to redo */
@@ -1732,7 +1793,7 @@ static void u_doit(int startcount)
break;
}
- u_undoredo(FALSE);
+ u_undoredo(false, do_buf_event);
/* Advance for next redo. Set "newhead" when at the end of the
* redoable changes. */
@@ -1741,34 +1802,32 @@ static void u_doit(int startcount)
curbuf->b_u_curhead = curbuf->b_u_curhead->uh_prev.ptr;
}
}
- u_undo_end(undo_undoes, FALSE);
+ u_undo_end(undo_undoes, false, quiet);
}
-/*
- * Undo or redo over the timeline.
- * When "step" is negative go back in time, otherwise goes forward in time.
- * When "sec" is FALSE make "step" steps, when "sec" is TRUE use "step" as
- * seconds.
- * When "file" is TRUE use "step" as a number of file writes.
- * When "absolute" is TRUE use "step" as the sequence number to jump to.
- * "sec" must be FALSE then.
- */
-void undo_time(long step, int sec, int file, int absolute)
+// Undo or redo over the timeline.
+// When "step" is negative go back in time, otherwise goes forward in time.
+// When "sec" is false make "step" steps, when "sec" is true use "step" as
+// seconds.
+// When "file" is true use "step" as a number of file writes.
+// When "absolute" is true use "step" as the sequence number to jump to.
+// "sec" must be false then.
+void undo_time(long step, bool sec, bool file, bool absolute)
{
long target;
long closest;
long closest_start;
long closest_seq = 0;
long val;
- u_header_T *uhp;
+ u_header_T *uhp = NULL;
u_header_T *last;
int mark;
int nomark;
int round;
- int dosec = sec;
- int dofile = file;
- int above = FALSE;
- int did_undo = TRUE;
+ bool dosec = sec;
+ bool dofile = file;
+ bool above = false;
+ bool did_undo = true;
/* First make sure the current undoable change is synced. */
if (curbuf->b_u_synced == false)
@@ -1782,20 +1841,12 @@ void undo_time(long step, int sec, int file, int absolute)
/* "target" is the node below which we want to be.
* Init "closest" to a value we can't reach. */
if (absolute) {
- if (step == 0) {
- // target 0 does not exist, got to 1 and above it.
- target = 1;
- above = true;
- } else {
- target = step;
- }
+ target = step;
closest = -1;
} else {
- /* When doing computations with time_t subtract starttime, because
- * time_t converted to a long may result in a wrong number. */
- if (dosec)
- target = (long)(curbuf->b_u_time_cur - starttime) + step;
- else if (dofile) {
+ if (dosec) {
+ target = (long)(curbuf->b_u_time_cur) + step;
+ } else if (dofile) {
if (step < 0) {
/* Going back to a previous write. If there were changes after
* the last write, count that as moving one file-write, so
@@ -1815,7 +1866,7 @@ void undo_time(long step, int sec, int file, int absolute)
if (target <= 0)
/* Go to before first write: before the oldest change. Use
* the sequence number for that. */
- dofile = FALSE;
+ dofile = false;
} else {
/* Moving forward to a newer write. */
target = curbuf->b_u_save_nr_cur + step;
@@ -1823,7 +1874,7 @@ void undo_time(long step, int sec, int file, int absolute)
/* Go to after last write: after the latest change. Use
* the sequence number for that. */
target = curbuf->b_u_seq_last + 1;
- dofile = FALSE;
+ dofile = false;
}
}
} else
@@ -1833,19 +1884,27 @@ void undo_time(long step, int sec, int file, int absolute)
target = 0;
closest = -1;
} else {
- if (dosec)
- closest = (long)(time(NULL) - starttime + 1);
- else if (dofile)
+ if (dosec) {
+ closest = (long)(os_time() + 1);
+ } else if (dofile) {
closest = curbuf->b_u_save_nr_last + 2;
- else
+ } else {
closest = curbuf->b_u_seq_last + 2;
- if (target >= closest)
+ }
+ if (target >= closest) {
target = closest - 1;
+ }
}
}
closest_start = closest;
closest_seq = curbuf->b_u_seq_cur;
+ // When "target" is 0; Back to origin.
+ if (target == 0) {
+ mark = lastmark; // avoid that GCC complains
+ goto target_zero;
+ }
+
/*
* May do this twice:
* 1. Search for "target", update "closest" to the best match found.
@@ -1869,12 +1928,13 @@ void undo_time(long step, int sec, int file, int absolute)
while (uhp != NULL) {
uhp->uh_walk = mark;
- if (dosec)
- val = (long)(uhp->uh_time - starttime);
- else if (dofile)
+ if (dosec) {
+ val = (long)(uhp->uh_time);
+ } else if (dofile) {
val = uhp->uh_save_nr;
- else
+ } else {
val = uhp->uh_seq;
+ }
if (round == 1 && !(dofile && val == 0)) {
/* Remember the header that is closest to the target.
@@ -1954,17 +2014,17 @@ void undo_time(long step, int sec, int file, int absolute)
}
target = closest_seq;
- dosec = FALSE;
- dofile = FALSE;
- if (step < 0)
- above = TRUE; /* stop above the header */
+ dosec = false;
+ dofile = false;
+ if (step < 0) {
+ above = true; // stop above the header
+ }
}
- /* If we found it: Follow the path to go to where we want to be. */
- if (uhp != NULL) {
- /*
- * First go up the tree as much as needed.
- */
+target_zero:
+ // If we found it: Follow the path to go to where we want to be.
+ if (uhp != NULL || target == 0) {
+ // First go up the tree as much as needed.
while (!got_int) {
/* Do the change warning now, for the same reason as above. */
change_warning(0);
@@ -1974,99 +2034,112 @@ void undo_time(long step, int sec, int file, int absolute)
uhp = curbuf->b_u_newhead;
else
uhp = uhp->uh_next.ptr;
- if (uhp == NULL || uhp->uh_walk != mark
- || (uhp->uh_seq == target && !above))
+ if (uhp == NULL
+ || (target > 0 && uhp->uh_walk != mark)
+ || (uhp->uh_seq == target && !above)) {
break;
+ }
curbuf->b_u_curhead = uhp;
- u_undoredo(TRUE);
- uhp->uh_walk = nomark; /* don't go back down here */
+ u_undoredo(true, true);
+ if (target > 0) {
+ uhp->uh_walk = nomark; // don't go back down here
+ }
}
- /*
- * And now go down the tree (redo), branching off where needed.
- */
- while (!got_int) {
- /* Do the change warning now, for the same reason as above. */
- change_warning(0);
+ // When back to origin, redo is not needed.
+ if (target > 0) {
+ // And now go down the tree (redo), branching off where needed.
+ while (!got_int) {
+ // Do the change warning now, for the same reason as above.
+ change_warning(0);
- uhp = curbuf->b_u_curhead;
- if (uhp == NULL)
- break;
-
- /* Go back to the first branch with a mark. */
- while (uhp->uh_alt_prev.ptr != NULL
- && uhp->uh_alt_prev.ptr->uh_walk == mark)
- uhp = uhp->uh_alt_prev.ptr;
+ uhp = curbuf->b_u_curhead;
+ if (uhp == NULL) {
+ break;
+ }
- /* Find the last branch with a mark, that's the one. */
- last = uhp;
- while (last->uh_alt_next.ptr != NULL
- && last->uh_alt_next.ptr->uh_walk == mark)
- last = last->uh_alt_next.ptr;
- if (last != uhp) {
- /* Make the used branch the first entry in the list of
- * alternatives to make "u" and CTRL-R take this branch. */
- while (uhp->uh_alt_prev.ptr != NULL)
+ // Go back to the first branch with a mark.
+ while (uhp->uh_alt_prev.ptr != NULL
+ && uhp->uh_alt_prev.ptr->uh_walk == mark) {
uhp = uhp->uh_alt_prev.ptr;
- if (last->uh_alt_next.ptr != NULL)
- last->uh_alt_next.ptr->uh_alt_prev.ptr =
- last->uh_alt_prev.ptr;
- last->uh_alt_prev.ptr->uh_alt_next.ptr = last->uh_alt_next.ptr;
- last->uh_alt_prev.ptr = NULL;
- last->uh_alt_next.ptr = uhp;
- uhp->uh_alt_prev.ptr = last;
-
- if (curbuf->b_u_oldhead == uhp)
- curbuf->b_u_oldhead = last;
- uhp = last;
- if (uhp->uh_next.ptr != NULL)
- uhp->uh_next.ptr->uh_prev.ptr = uhp;
- }
- curbuf->b_u_curhead = uhp;
+ }
- if (uhp->uh_walk != mark)
- break; /* must have reached the target */
+ // Find the last branch with a mark, that's the one.
+ last = uhp;
+ while (last->uh_alt_next.ptr != NULL
+ && last->uh_alt_next.ptr->uh_walk == mark) {
+ last = last->uh_alt_next.ptr;
+ }
+ if (last != uhp) {
+ // Make the used branch the first entry in the list of
+ // alternatives to make "u" and CTRL-R take this branch.
+ while (uhp->uh_alt_prev.ptr != NULL) {
+ uhp = uhp->uh_alt_prev.ptr;
+ }
+ if (last->uh_alt_next.ptr != NULL) {
+ last->uh_alt_next.ptr->uh_alt_prev.ptr = last->uh_alt_prev.ptr;
+ }
+ last->uh_alt_prev.ptr->uh_alt_next.ptr = last->uh_alt_next.ptr;
+ last->uh_alt_prev.ptr = NULL;
+ last->uh_alt_next.ptr = uhp;
+ uhp->uh_alt_prev.ptr = last;
- /* Stop when going backwards in time and didn't find the exact
- * header we were looking for. */
- if (uhp->uh_seq == target && above) {
- curbuf->b_u_seq_cur = target - 1;
- break;
- }
+ if (curbuf->b_u_oldhead == uhp) {
+ curbuf->b_u_oldhead = last;
+ }
+ uhp = last;
+ if (uhp->uh_next.ptr != NULL) {
+ uhp->uh_next.ptr->uh_prev.ptr = uhp;
+ }
+ }
+ curbuf->b_u_curhead = uhp;
- u_undoredo(FALSE);
+ if (uhp->uh_walk != mark) {
+ break; // must have reached the target
+ }
- /* Advance "curhead" to below the header we last used. If it
- * becomes NULL then we need to set "newhead" to this leaf. */
- if (uhp->uh_prev.ptr == NULL)
- curbuf->b_u_newhead = uhp;
- curbuf->b_u_curhead = uhp->uh_prev.ptr;
- did_undo = FALSE;
+ // Stop when going backwards in time and didn't find the exact
+ // header we were looking for.
+ if (uhp->uh_seq == target && above) {
+ curbuf->b_u_seq_cur = target - 1;
+ break;
+ }
- if (uhp->uh_seq == target) /* found it! */
- break;
+ u_undoredo(false, true);
- uhp = uhp->uh_prev.ptr;
- if (uhp == NULL || uhp->uh_walk != mark) {
- /* Need to redo more but can't find it... */
- EMSG2(_(e_intern2), "undo_time()");
- break;
+ // Advance "curhead" to below the header we last used. If it
+ // becomes NULL then we need to set "newhead" to this leaf.
+ if (uhp->uh_prev.ptr == NULL) {
+ curbuf->b_u_newhead = uhp;
+ }
+ curbuf->b_u_curhead = uhp->uh_prev.ptr;
+ did_undo = false;
+
+ if (uhp->uh_seq == target) { // found it!
+ break;
+ }
+
+ uhp = uhp->uh_prev.ptr;
+ if (uhp == NULL || uhp->uh_walk != mark) {
+ // Need to redo more but can't find it...
+ internal_error("undo_time()");
+ break;
+ }
}
}
}
- u_undo_end(did_undo, absolute);
+ u_undo_end(did_undo, absolute, false);
}
-/*
- * u_undoredo: common code for undo and redo
- *
- * The lines in the file are replaced by the lines in the entry list at
- * curbuf->b_u_curhead. The replaced lines in the file are saved in the entry
- * list for the next undo/redo.
- *
- * When "undo" is TRUE we go up in the tree, when FALSE we go down.
- */
-static void u_undoredo(int undo)
+/// u_undoredo: common code for undo and redo
+///
+/// The lines in the file are replaced by the lines in the entry list at
+/// curbuf->b_u_curhead. The replaced lines in the file are saved in the entry
+/// list for the next undo/redo.
+///
+/// @param undo If `true`, go up the tree. Down if `false`.
+/// @param do_buf_event If `true`, send buffer updates.
+static void u_undoredo(int undo, bool do_buf_event)
{
char_u **newarray = NULL;
linenr_T oldsize;
@@ -2115,8 +2188,8 @@ static void u_undoredo(int undo)
if (top > curbuf->b_ml.ml_line_count || top >= bot
|| bot > curbuf->b_ml.ml_line_count + 1) {
unblock_autocmds();
- EMSG(_("E438: u_undo: line numbers wrong"));
- changed(); /* don't want UNCHANGED now */
+ IEMSG(_("E438: u_undo: line numbers wrong"));
+ changed(); // don't want UNCHANGED now
return;
}
@@ -2173,10 +2246,11 @@ static void u_undoredo(int undo)
* If the file is empty, there is an empty line 1 that we
* should get rid of, by replacing it with the new line
*/
- if (empty_buffer && lnum == 0)
- ml_replace((linenr_T)1, uep->ue_array[i], TRUE);
- else
+ if (empty_buffer && lnum == 0) {
+ ml_replace((linenr_T)1, uep->ue_array[i], true);
+ } else {
ml_append(lnum, uep->ue_array[i], (colnr_T)0, FALSE);
+ }
xfree(uep->ue_array[i]);
}
xfree((char_u *)uep->ue_array);
@@ -2185,14 +2259,16 @@ static void u_undoredo(int undo)
/* adjust marks */
if (oldsize != newsize) {
mark_adjust(top + 1, top + oldsize, (long)MAXLNUM,
- (long)newsize - (long)oldsize);
- if (curbuf->b_op_start.lnum > top + oldsize)
+ (long)newsize - (long)oldsize, false);
+ if (curbuf->b_op_start.lnum > top + oldsize) {
curbuf->b_op_start.lnum += newsize - oldsize;
- if (curbuf->b_op_end.lnum > top + oldsize)
+ }
+ if (curbuf->b_op_end.lnum > top + oldsize) {
curbuf->b_op_end.lnum += newsize - oldsize;
+ }
}
- changed_lines(top + 1, 0, bot, newsize - oldsize);
+ changed_lines(top + 1, 0, bot, newsize - oldsize, do_buf_event);
/* set '[ and '] mark */
if (top + 1 < curbuf->b_op_start.lnum)
@@ -2218,12 +2294,21 @@ static void u_undoredo(int undo)
curhead->uh_entry = newlist;
curhead->uh_flags = new_flags;
- if ((old_flags & UH_EMPTYBUF) && bufempty())
+ if ((old_flags & UH_EMPTYBUF) && BUFEMPTY()) {
curbuf->b_ml.ml_flags |= ML_EMPTY;
- if (old_flags & UH_CHANGED)
+ }
+ if (old_flags & UH_CHANGED) {
changed();
- else
+ } else {
unchanged(curbuf, FALSE);
+ }
+
+ // because the calls to changed()/unchanged() above will bump changedtick
+ // again, we need to send a nvim_buf_lines_event with just the new value of
+ // b:changedtick
+ if (do_buf_event && kv_size(curbuf->update_channels)) {
+ buf_updates_changedtick(curbuf);
+ }
/*
* restore marks from before undo/redo
@@ -2278,7 +2363,8 @@ static void u_undoredo(int undo)
if (undo)
/* We are below the previous undo. However, to make ":earlier 1s"
* work we compute this as being just above the just undone change. */
- --curbuf->b_u_seq_cur;
+ curbuf->b_u_seq_cur = curhead->uh_next.ptr ?
+ curhead->uh_next.ptr->uh_seq : 0;
/* Remember where we are for ":earlier 1f" and ":later 1f". */
if (curhead->uh_save_nr != 0) {
@@ -2298,16 +2384,13 @@ static void u_undoredo(int undo)
#endif
}
-/*
- * If we deleted or added lines, report the number of less/more lines.
- * Otherwise, report the number of changes (this may be incorrect
- * in some cases, but it's better than nothing).
- */
-static void
-u_undo_end (
- int did_undo, /* just did an undo */
- int absolute /* used ":undo N" */
-)
+/// If we deleted or added lines, report the number of less/more lines.
+/// Otherwise, report the number of changes (this may be incorrect
+/// in some cases, but it's better than nothing).
+static void u_undo_end(
+ bool did_undo, ///< just did an undo
+ bool absolute, ///< used ":undo N"
+ bool quiet)
{
char *msgstr;
u_header_T *uhp;
@@ -2316,9 +2399,11 @@ u_undo_end (
if ((fdo_flags & FDO_UNDO) && KeyTyped)
foldOpenCursor();
- if (global_busy /* no messages now, wait until global is finished */
- || !messaging()) /* 'lazyredraw' set, don't do messages now */
+ if (quiet
+ || global_busy // no messages until global is finished
+ || !messaging()) { // 'lazyredraw' set, don't do messages now
return;
+ }
if (curbuf->b_ml.ml_flags & ML_EMPTY)
--u_newcount;
@@ -2344,13 +2429,15 @@ u_undo_end (
/* For ":undo N" we prefer a "after #N" message. */
if (absolute && curbuf->b_u_curhead->uh_next.ptr != NULL) {
uhp = curbuf->b_u_curhead->uh_next.ptr;
- did_undo = FALSE;
- } else if (did_undo)
+ did_undo = false;
+ } else if (did_undo) {
uhp = curbuf->b_u_curhead;
- else
+ } else {
uhp = curbuf->b_u_curhead->uh_next.ptr;
- } else
+ }
+ } else {
uhp = curbuf->b_u_newhead;
+ }
if (uhp == NULL)
*msgbuf = NUL;
@@ -2376,9 +2463,9 @@ u_undo_end (
/*
* u_sync: stop adding to the current entry list
*/
-void
-u_sync (
- int force /* Also sync when no_u_sync is set. */
+void
+u_sync(
+ int force // Also sync when no_u_sync is set.
)
{
/* Skip it when already synced or syncing is disabled. */
@@ -2416,8 +2503,8 @@ void ex_undolist(exarg_T *eap)
while (uhp != NULL) {
if (uhp->uh_prev.ptr == NULL && uhp->uh_walk != nomark
&& uhp->uh_walk != mark) {
- vim_snprintf((char *)IObuff, IOSIZE, "%6ld %7ld ",
- uhp->uh_seq, changes);
+ vim_snprintf((char *)IObuff, IOSIZE, "%6ld %7d ",
+ uhp->uh_seq, changes);
u_add_time(IObuff + STRLEN(IObuff), IOSIZE - STRLEN(IObuff),
uhp->uh_time);
if (uhp->uh_save_nr > 0) {
@@ -2468,13 +2555,14 @@ void ex_undolist(exarg_T *eap)
sort_strings((char_u **)ga.ga_data, ga.ga_len);
msg_start();
- msg_puts_attr((char_u *)_("number changes when saved"),
- hl_attr(HLF_T));
- for (int i = 0; i < ga.ga_len && !got_int; ++i) {
+ msg_puts_attr(_("number changes when saved"),
+ HL_ATTR(HLF_T));
+ for (int i = 0; i < ga.ga_len && !got_int; i++) {
msg_putchar('\n');
- if (got_int)
+ if (got_int) {
break;
- msg_puts(((char_u **)ga.ga_data)[i]);
+ }
+ msg_puts(((const char **)ga.ga_data)[i]);
}
msg_end();
@@ -2507,20 +2595,20 @@ static void u_add_time(char_u *buf, size_t buflen, time_t tt)
*/
void ex_undojoin(exarg_T *eap)
{
- if (curbuf->b_u_newhead == NULL)
- return; /* nothing changed before */
+ if (curbuf->b_u_newhead == NULL) {
+ return; // nothing changed before
+ }
if (curbuf->b_u_curhead != NULL) {
EMSG(_("E790: undojoin is not allowed after undo"));
return;
}
- if (!curbuf->b_u_synced)
- return; /* already unsynced */
- if (get_undolevel() < 0)
- return; /* no entries, nothing to do */
- else {
- /* Go back to the last entry */
- curbuf->b_u_curhead = curbuf->b_u_newhead;
- curbuf->b_u_synced = false; /* no entries, nothing to do */
+ if (!curbuf->b_u_synced) {
+ return; // already unsynced
+ }
+ if (get_undolevel() < 0) {
+ return; // no entries, nothing to do
+ } else {
+ curbuf->b_u_synced = false; // Append next change to last entry
}
}
@@ -2604,7 +2692,7 @@ static void u_unch_branch(u_header_T *uhp)
static u_entry_T *u_get_headentry(void)
{
if (curbuf->b_u_newhead == NULL || curbuf->b_u_newhead->uh_entry == NULL) {
- EMSG(_("E439: undo list corrupt"));
+ IEMSG(_("E439: undo list corrupt"));
return NULL;
}
return curbuf->b_u_newhead->uh_entry;
@@ -2633,11 +2721,11 @@ static void u_getbot(void)
extra = curbuf->b_ml.ml_line_count - uep->ue_lcount;
uep->ue_bot = uep->ue_top + uep->ue_size + 1 + extra;
if (uep->ue_bot < 1 || uep->ue_bot > curbuf->b_ml.ml_line_count) {
- EMSG(_("E440: undo line missing"));
- uep->ue_bot = uep->ue_top + 1; /* assume all lines deleted, will
- * get all the old lines back
- * without deleting the current
- * ones */
+ IEMSG(_("E440: undo line missing"));
+ uep->ue_bot = uep->ue_top + 1; // assume all lines deleted, will
+ // get all the old lines back
+ // without deleting the current
+ // ones
}
curbuf->b_u_newhead->uh_getbot_entry = NULL;
@@ -2649,11 +2737,11 @@ static void u_getbot(void)
/*
* Free one header "uhp" and its entry list and adjust the pointers.
*/
-static void
-u_freeheader (
+static void
+u_freeheader(
buf_T *buf,
u_header_T *uhp,
- u_header_T **uhpp /* if not NULL reset when freeing this header */
+ u_header_T **uhpp // if not NULL reset when freeing this header
)
{
u_header_T *uhap;
@@ -2685,11 +2773,11 @@ u_freeheader (
/*
* Free an alternate branch and any following alternate branches.
*/
-static void
-u_freebranch (
+static void
+u_freebranch(
buf_T *buf,
u_header_T *uhp,
- u_header_T **uhpp /* if not NULL reset when freeing this header */
+ u_header_T **uhpp // if not NULL reset when freeing this header
)
{
u_header_T *tofree, *next;
@@ -2719,11 +2807,11 @@ u_freebranch (
* Free all the undo entries for one header and the header itself.
* This means that "uhp" is invalid when returning.
*/
-static void
-u_freeentries (
+static void
+u_freeentries(
buf_T *buf,
u_header_T *uhp,
- u_header_T **uhpp /* if not NULL reset when freeing this header */
+ u_header_T **uhpp // if not NULL reset when freeing this header
)
{
u_entry_T *uep, *nuep;
@@ -2830,7 +2918,7 @@ void u_undoline(void)
curbuf->b_u_line_lnum + 1, (linenr_T)0, FALSE) == FAIL)
return;
oldp = u_save_line(curbuf->b_u_line_lnum);
- ml_replace(curbuf->b_u_line_lnum, curbuf->b_u_line_ptr, TRUE);
+ ml_replace(curbuf->b_u_line_lnum, curbuf->b_u_line_ptr, true);
changed_bytes(curbuf->b_u_line_lnum, 0);
xfree(curbuf->b_u_line_ptr);
curbuf->b_u_line_ptr = oldp;
@@ -2890,35 +2978,39 @@ bool curbufIsChanged(void)
&& (curbuf->b_changed || file_ff_differs(curbuf, true)));
}
-/*
- * For undotree(): Append the list of undo blocks at "first_uhp" to "list".
- * Recursive.
- */
-void u_eval_tree(u_header_T *first_uhp, list_T *list)
+/// Append the list of undo blocks to a newly allocated list
+///
+/// For use in undotree(). Recursive.
+///
+/// @param[in] first_uhp Undo blocks list to start with.
+///
+/// @return [allocated] List with a representation of undo blocks.
+list_T *u_eval_tree(const u_header_T *const first_uhp)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_RET
{
- u_header_T *uhp = first_uhp;
- dict_T *dict;
+ list_T *const list = tv_list_alloc(kListLenMayKnow);
- while (uhp != NULL) {
- dict = dict_alloc();
- dict_add_nr_str(dict, "seq", uhp->uh_seq, NULL);
- dict_add_nr_str(dict, "time", (long)uhp->uh_time, NULL);
- if (uhp == curbuf->b_u_newhead)
- dict_add_nr_str(dict, "newhead", 1, NULL);
- if (uhp == curbuf->b_u_curhead)
- dict_add_nr_str(dict, "curhead", 1, NULL);
- if (uhp->uh_save_nr > 0)
- dict_add_nr_str(dict, "save", uhp->uh_save_nr, NULL);
+ for (const u_header_T *uhp = first_uhp; uhp != NULL; uhp = uhp->uh_prev.ptr) {
+ dict_T *const dict = tv_dict_alloc();
+ tv_dict_add_nr(dict, S_LEN("seq"), (varnumber_T)uhp->uh_seq);
+ tv_dict_add_nr(dict, S_LEN("time"), (varnumber_T)uhp->uh_time);
+ if (uhp == curbuf->b_u_newhead) {
+ tv_dict_add_nr(dict, S_LEN("newhead"), 1);
+ }
+ if (uhp == curbuf->b_u_curhead) {
+ tv_dict_add_nr(dict, S_LEN("curhead"), 1);
+ }
+ if (uhp->uh_save_nr > 0) {
+ tv_dict_add_nr(dict, S_LEN("save"), (varnumber_T)uhp->uh_save_nr);
+ }
if (uhp->uh_alt_next.ptr != NULL) {
- list_T *alt_list = list_alloc();
-
- /* Recursive call to add alternate undo tree. */
- u_eval_tree(uhp->uh_alt_next.ptr, alt_list);
- dict_add_list(dict, "alt", alt_list);
+ // Recursive call to add alternate undo tree.
+ tv_dict_add_list(dict, S_LEN("alt"), u_eval_tree(uhp->uh_alt_next.ptr));
}
- list_append_dict(list, dict);
- uhp = uhp->uh_prev.ptr;
+ tv_list_append_dict(list, dict);
}
+
+ return list;
}
diff --git a/src/nvim/undo.h b/src/nvim/undo.h
index ab8584fbb2..802cdc5583 100644
--- a/src/nvim/undo.h
+++ b/src/nvim/undo.h
@@ -2,6 +2,7 @@
#define NVIM_UNDO_H
#include "nvim/undo_defs.h"
+#include "nvim/ex_cmds_defs.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "undo.h.generated.h"
diff --git a/src/nvim/undo_defs.h b/src/nvim/undo_defs.h
index d841210815..6c7e2bba41 100644
--- a/src/nvim/undo_defs.h
+++ b/src/nvim/undo_defs.h
@@ -4,9 +4,10 @@
#include <time.h> // for time_t
#include "nvim/pos.h"
-#include "nvim/buffer_defs.h"
#include "nvim/mark_defs.h"
+typedef struct u_header u_header_T;
+
/* Structure to store info about the Visual area. */
typedef struct {
pos_T vi_start; /* start pos of last VIsual */
@@ -15,8 +16,9 @@ typedef struct {
colnr_T vi_curswant; /* MAXCOL from w_curswant */
} visualinfo_T;
+#include "nvim/buffer_defs.h"
+
typedef struct u_entry u_entry_T;
-typedef struct u_header u_header_T;
struct u_entry {
u_entry_T *ue_next; /* pointer to next entry in list */
linenr_T ue_top; /* number of line above undo block */
diff --git a/src/nvim/version.c b/src/nvim/version.c
index 8aa3071395..20b71ab724 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
/// @file version.c
///
/// Nvim was forked from Vim 7.4.160.
@@ -7,28 +10,28 @@
#include <assert.h>
#include <limits.h>
+#include "nvim/api/private/helpers.h"
#include "nvim/vim.h"
#include "nvim/ascii.h"
#include "nvim/iconv.h"
#include "nvim/version.h"
#include "nvim/charset.h"
+#include "nvim/macros.h"
#include "nvim/memline.h"
#include "nvim/memory.h"
#include "nvim/message.h"
-#include "nvim/misc2.h"
#include "nvim/screen.h"
#include "nvim/strings.h"
+#include "nvim/lua/executor.h"
// version info generated by the build system
#include "auto/versiondef.h"
-#define STR_(x) #x
-#define STR(x) STR_(x)
-
// for ":version", ":intro", and "nvim --version"
#ifndef NVIM_VERSION_MEDIUM
-#define NVIM_VERSION_MEDIUM STR(NVIM_VERSION_MAJOR) "." STR(NVIM_VERSION_MINOR)\
- "." STR(NVIM_VERSION_PATCH) NVIM_VERSION_PRERELEASE
+#define NVIM_VERSION_MEDIUM "v" STR(NVIM_VERSION_MAJOR)\
+"." STR(NVIM_VERSION_MINOR) "." STR(NVIM_VERSION_PATCH)\
+NVIM_VERSION_PRERELEASE
#endif
#define NVIM_VERSION_LONG "NVIM " NVIM_VERSION_MEDIUM
@@ -44,1055 +47,1280 @@ char *version_cflags = "Compilation: " NVIM_VERSION_CFLAGS;
static char *features[] = {
#ifdef HAVE_ACL
- "+acl",
+"+acl",
#else
- "-acl",
+"-acl",
#endif
#if (defined(HAVE_ICONV_H) && defined(USE_ICONV)) || defined(DYNAMIC_ICONV)
# ifdef DYNAMIC_ICONV
- "+iconv/dyn",
+"+iconv/dyn",
# else
- "+iconv",
+"+iconv",
# endif
#else
- "-iconv",
+"-iconv",
#endif
#ifdef HAVE_JEMALLOC
- "+jemalloc",
+"+jemalloc",
#else
- "-jemalloc",
+"-jemalloc",
#endif
#ifdef FEAT_TUI
- "+tui",
+"+tui",
#else
- "-tui",
+"-tui",
#endif
- NULL
+NULL
};
// clang-format off
-static int included_patches[] = {
- 1973,
- 1960,
+static const int included_patches[] = {
+ 1849,
+ // 1848,
+ 1847,
+ // 1846,
+ // 1845,
+ // 1844,
+ 1843,
+ // 1842,
+ // 1841,
1840,
+ 1839,
+ // 1838,
+ 1837,
+ 1836,
+ // 1835,
+ 1834,
+ 1833,
1832,
- 1831,
+ // 1831,
+ // 1830,
+ 1829,
+ 1828,
+ // 1827,
+ 1826,
+ 1825,
+ // 1824,
+ // 1823,
+ 1822,
+ // 1821,
+ // 1820,
+ 1819,
+ // 1818,
+ // 1817,
+ 1816,
+ // 1815,
+ // 1814,
+ 1813,
+ // 1812,
+ 1811,
+ // 1810,
1809,
1808,
- 1806,
+ 1807,
+ // 1806,
+ // 1805,
+ // 1804,
+ // 1803,
+ // 1802,
+ // 1801,
+ 1800,
1799,
+ // 1798,
+ // 1797,
+ // 1796,
+ // 1795,
+ // 1794,
+ // 1793,
+ 1792,
+ 1791,
+ 1790,
+ // 1789,
+ 1788,
+ 1787,
+ // 1786,
+ 1785,
+ // 1784,
+ // 1783,
+ // 1782,
+ 1781,
+ // 1780,
+ 1779,
+ 1778,
+ 1777,
+ // 1776,
+ // 1775,
+ // 1774,
+ // 1773,
+ // 1772,
+ // 1771,
+ // 1770,
+ // 1769,
+ // 1768,
+ // 1767,
+ 1766,
+ 1765,
+ 1764,
+ // 1763,
+ // 1762,
+ // 1761,
+ 1760,
+ // 1759,
+ 1758,
1757,
+ // 1756,
1755,
- 1753,
- 1728,
- 1716,
- 1712,
- 1695,
- 1654,
- 1652,
+ // 1754,
+ // 1753,
+ // 1752,
+ 1751,
+ // 1750,
+ 1749,
+ 1748,
+ // 1747,
+ // 1746,
+ // 1745,
+ // 1744,
+ // 1743,
+ // 1742,
+ 1741,
+ // 1740,
+ 1739,
+ // 1738,
+ 1737,
+ 1736,
+ // 1735,
+ 1734,
+ // 1733,
+ // 1732,
+ 1731,
+ 1730,
+ // 1729,
+ // 1728,
+ // 1727,
+ // 1726,
+ // 1725,
+ // 1724,
+ // 1723,
+ // 1722,
+ // 1721,
+ // 1720,
+ 1719,
+ // 1718,
+ 1717,
+ // 1716,
+ // 1715,
+ // 1714,
+ // 1713,
+ // 1712,
+ // 1711,
+ 1710,
+ // 1709,
+ // 1708,
+ 1707,
+ // 1706,
+ 1705,
+ // 1704,
+ // 1703,
+ // 1702,
+ 1701,
+ 1700,
+ 1699,
+ 1698,
+ // 1697,
+ 1696,
+ // 1695,
+ // 1694,
+ // 1693,
+ 1692,
+ // 1691,
+ // 1690,
+ // 1689,
+ // 1688,
+ // 1687,
+ 1686,
+ // 1685,
+ // 1684,
+ 1683,
+ 1682,
+ // 1681,
+ // 1680,
+ 1679,
+ // 1678,
+ // 1677,
+ // 1676,
+ 1675,
+ 1674,
+ // 1673,
+ 1672,
+ // 1671,
+ // 1670,
+ // 1669,
+ // 1668,
+ // 1667,
+ // 1666,
+ // 1665,
+ // 1664,
+ 1663,
+ // 1662,
+ // 1661,
+ // 1660,
+ 1659,
+ // 1658,
+ // 1657,
+ // 1656,
+ // 1655,
+ // 1654,
+ // 1653,
+ // 1652,
+ // 1651,
+ 1650,
1649,
- 1643,
- 1641,
- // 1624 NA
-
- // 1600 NA
- // 1599 NA
- // 1598 NA
- // 1597 NA
- 1596,
- // 1595 NA
- // 1594 NA
- // 1593 NA
- 1592,
+ // 1648,
+ // 1647,
+ 1646,
+ // 1645,
+ // 1644,
+ // 1643,
+ // 1642,
+ // 1641,
+ // 1640,
+ 1639,
+ // 1638,
+ // 1637,
+ // 1636,
+ 1635,
+ // 1634,
+ 1633,
+ // 1632,
+ // 1631,
+ 1630,
+ // 1629,
+ // 1628,
+ 1627,
+ // 1626,
+ 1625,
+ // 1624,
+ // 1623,
+ 1622,
+ // 1621,
+ 1620,
+ // 1619,
+ 1618,
+ // 1617,
+ // 1616,
+ // 1615,
+ 1614,
+ 1613,
+ // 1612,
+ // 1611,
+ 1610,
+ // 1609,
+ 1608,
+ // 1607,
+ 1606,
+ // 1605,
+ // 1604,
+ 1603,
+ 1602,
+ 1601,
+ 1600,
+ // 1599,
+ // 1598,
+ 1597,
+ // 1596,
+ 1595,
+ // 1594,
+ // 1593,
+ // 1592,
// 1591,
- // 1590,
+ 1590,
// 1589,
// 1588,
- // 1587 NA
- // 1586,
- // 1585,
- // 1584 NA
- // 1583 NA
+ // 1587,
+ 1586,
+ 1585,
+ 1584,
+ 1583,
// 1582,
-
- // 1581,
- // 1580,
- // 1579 NA
- 1578,
- // 1577,
- 1576,
- // 1575 NA
- 1574,
- // 1573 NA
- // 1572 NA
+ 1581,
+ 1580,
+ 1579,
+ // 1578,
+ 1577,
+ // 1576,
+ 1575,
+ // 1574,
+ 1573,
+ // 1572,
1571,
- 1570,
- 1569,
- 1568,
+ // 1570,
+ // 1569,
+ // 1568,
1567,
- // 1566 NA
- // 1565,
- // 1564,
+ 1566,
+ 1565,
+ 1564,
// 1563,
- // 1562 NA
- // 1561 NA
- // 1560 NA
- // 1559,
+ // 1562,
+ 1561,
+ 1560,
+ 1559,
// 1558,
- // 1557,
- // 1556 NA
- // 1555 NA
- 1554,
+ 1557,
+ 1556,
+ 1555,
+ // 1554,
1553,
- 1552,
- 1551,
- 1550,
+ // 1552,
+ // 1551,
+ // 1550,
// 1549,
- // 1548,
- // 1547,
+ 1548,
+ 1547,
// 1546,
- // 1545 NA
- // 1544 NA
- // 1543 NA
- // 1542 NA
- // 1541 NA
- // 1540 NA
- // 1539 NA
- // 1538 NA
- // 1537 NA
- // 1536 NA
+ // 1545,
+ // 1544,
+ // 1543,
+ // 1542,
+ 1541,
+ // 1540,
+ // 1539,
+ // 1538,
+ // 1537,
+ 1536,
// 1535,
- // 1534 NA
+ // 1534,
// 1533,
- // 1532 NA
- // 1531 NA
- // 1530 NA
- // 1529 NA
- 1528,
- // 1527 NA
- // 1526 NA
- // 1525 NA
- // 1524 NA
- // 1523 NA
- // 1522 NA
- 1521,
- // 1520 NA
- // 1519 NA
- // 1518 NA
- // 1517 NA
- 1516,
- // 1515 NA
- // 1514 NA
- 1513,
- // 1512 NA
- 1511,
- // 1510 NA
- // 1509 NA
- // 1508 NA
- // 1507 NA
- // 1506 NA
- // 1505 NA
- // 1504 NA
- // 1503 NA
- // 1502 NA
- // 1501 NA
- 1500,
- 1499,
- // 1498 NA
- // 1497 NA
- // 1496 NA
- // 1495 NA
- // 1494,
- // 1493 NA
- 1492,
+ 1532,
+ // 1531,
+ 1530,
+ // 1529,
+ // 1528,
+ // 1527,
+ // 1526,
+ // 1525,
+ // 1524,
+ // 1523,
+ // 1522,
+ // 1521,
+ // 1520,
+ // 1519,
+ // 1518,
+ 1517,
+ // 1516,
+ // 1515,
+ // 1514,
+ // 1513,
+ 1512,
+ // 1511,
+ // 1510,
+ 1509,
+ 1508,
+ 1507,
+ 1506,
+ // 1505,
+ 1504,
+ 1503,
+ 1502,
+ // 1501,
+ // 1500,
+ // 1499,
+ // 1498,
+ // 1497,
+ // 1496,
+ // 1495,
+ 1494,
+ 1493,
+ // 1492,
// 1491,
- // 1490 NA
- // 1489 NA
- // 1488 NA
- // 1487 NA
+ 1490,
+ 1489,
+ 1488,
+ 1487,
1486,
- // 1485 NA
- // 1484 NA
- // 1483 NA
- // 1482 NA
- // 1481 NA
- 1480,
- 1479,
+ 1485,
+ // 1484,
+ 1483,
+ // 1482,
+ // 1481,
+ // 1480,
+ // 1479,
1478,
// 1477,
- // 1476 NA
- // 1475 NA
- // 1474 NA
- // 1473 NA
- // 1472 NA
- // 1471 NA
- // 1470 NA
- // 1469 NA
+ // 1476,
+ 1475,
+ 1474,
+ 1473,
+ 1472,
+ 1471,
+ 1470,
+ 1469,
1468,
- // 1467 NA
- // 1466 NA
- // 1465 NA
+ 1467,
+ 1466,
+ 1465,
1464,
- // 1463 NA
- // 1462 NA
- // 1461 NA
- // 1460 NA
- // 1459 NA
- // 1458 NA
- // 1457 NA
- // 1456,
- // 1455 NA
- // 1454 NA
- // 1453 NA
- // 1452 NA
- // 1451 NA
- // 1450 NA
- // 1449 NA
- // 1448 NA
- // 1447 NA
- // 1446 NA
- // 1445 NA
- // 1444 NA
- // 1443 NA
- // 1442 NA
- // 1441 NA
- // 1440 NA
- // 1439 NA
- // 1438 NA
- // 1437 NA
- // 1436 NA
- // 1435 NA
- // 1434 NA
- // 1433 NA
- // 1432 NA
- // 1431 NA
- // 1430 NA
- // 1429 NA
- // 1428 NA
- // 1427 NA
- // 1426 NA
+ // 1463,
+ // 1462,
+ // 1461,
+ // 1460,
+ // 1459,
+ 1458,
+ 1457,
+ 1456,
+ // 1455,
+ // 1454,
+ // 1453,
+ // 1452,
+ // 1451,
+ 1450,
+ // 1449,
+ // 1448,
+ // 1447,
+ 1446,
+ 1445,
+ 1444,
+ 1443,
+ 1442,
+ 1441,
+ // 1440,
+ 1439,
+ 1438,
+ 1437,
+ // 1436,
+ 1435,
+ 1434,
+ 1433,
+ // 1432,
+ 1431,
+ // 1430,
+ // 1429,
+ 1428,
+ 1427,
+ 1426,
1425,
- // 1424 NA
- // 1423 NA
- // 1422 NA
- // 1421 NA
- // 1420 NA
- // 1419 NA
- // 1418 NA
- // 1417 NA
- // 1416 NA
- // 1415 NA
- // 1414 NA
- // 1413 NA
- // 1412 NA
- // 1411 NA
+ 1424,
+ 1423,
+ // 1422,
+ 1421,
+ // 1420,
+ 1419,
+ 1418,
+ 1417,
+ 1416,
+ 1415,
+ // 1414,
+ 1413,
+ // 1412,
+ // 1411,
1410,
- // 1409 NA
- // 1408 NA
- // 1407 NA
- 1406,
- 1405,
- // 1404 NA
- // 1403 NA
- // 1402 NA
+ 1409,
+ // 1408,
+ 1407,
+ // 1406,
+ // 1405,
+ 1404,
+ 1403,
+ 1402,
1401,
- // 1400 NA
- // 1399 NA
- // 1398 NA
+ 1400,
+ 1399,
+ 1398,
1397,
1396,
- // 1395 NA
+ 1395,
1394,
- // 1393 NA
- // 1392 NA
- // 1391 NA
- // 1390 NA
- // 1389 NA
- 1388,
- // 1387 NA
- // 1386 NA
- // 1385 NA
- 1384,
- // 1383 NA
- // 1382 NA
- // 1381 NA
- // 1380 NA
- // 1379 NA
- // 1378 NA
- // 1377 NA
- // 1376 NA
- // 1375 NA
- // 1374 NA
- // 1373 NA
- // 1372 NA
- // 1371 NA
- // 1370 NA
- // 1369 NA
- // 1368 NA
- // 1367 NA
- 1366,
- // 1365,
- // 1364 NA
- // 1363 NA
- // 1362 NA
- // 1361 NA
- // 1360 NA
- // 1359 NA
- // 1358 NA
- // 1357 NA
- // 1356 NA
- // 1355 NA
- // 1354 NA
- // 1353 NA
+ 1393,
+ 1392,
+ 1391,
+ 1390,
+ // 1389,
+ // 1388,
+ 1387,
+ // 1386,
+ 1385,
+ // 1384,
+ 1383,
+ // 1382,
+ // 1381,
+ 1380,
+ 1379,
+ 1378,
+ 1377,
+ // 1376,
+ // 1375,
+ 1374,
+ 1373,
+ // 1372,
+ // 1371,
+ 1370,
+ 1369,
+ // 1368,
+ // 1367,
+ // 1366,
+ 1365,
+ 1364,
+ 1363,
+ // 1362,
+ 1361,
+ // 1360,
+ // 1359,
+ // 1358,
+ 1357,
+ // 1356,
+ // 1355,
+ // 1354,
+ // 1353,
1352,
- // 1351 NA
- // 1350 NA
- // 1349 NA
- // 1348 NA
- 1347,
- 1346,
- // 1345 NA
- // 1344 NA
- // 1343 NA
- // 1342 NA
- // 1341 NA
- // 1340 NA
- // 1339 NA
- // 1338 NA
- // 1337 NA
- // 1336 NA
- // 1335 NA
- // 1334 NA
- // 1333 NA
- // 1332 NA
- // 1331 NA
- // 1330 NA
- // 1329 NA
- // 1328 NA
- // 1327 NA
- // 1326 NA
- // 1325 NA
- // 1324 NA
- // 1323 NA
- // 1322 NA
- // 1321 NA
- // 1320 NA
- // 1319 NA
- // 1318 NA
- // 1317 NA
- // 1316 NA
- // 1315 NA
- // 1314 NA
- // 1313 NA
- // 1312 NA
- // 1311 NA
- // 1310 NA
- 1309,
- // 1308 NA
- // 1307 NA
- // 1306 NA
+ 1351,
+ 1350,
+ // 1349,
+ // 1348,
+ // 1347,
+ // 1346,
+ // 1345,
+ // 1344,
+ 1343,
+ // 1342,
+ // 1341,
+ // 1340,
+ // 1339,
+ 1338,
+ 1337,
+ // 1336,
+ // 1335,
+ // 1334,
+ 1333,
+ // 1332,
+ 1331,
+ // 1330,
+ 1329,
+ // 1328,
+ 1327,
+ 1326,
+ 1325,
+ 1324,
+ // 1323,
+ 1322,
+ // 1321,
+ // 1320,
+ // 1319,
+ // 1318,
+ // 1317,
+ // 1316,
+ // 1315,
+ 1314,
+ 1313,
+ // 1312,
+ 1311,
+ 1310,
+ // 1309,
+ 1308,
+ // 1307,
+ 1306,
// 1305,
1304,
- // 1303 NA
- // 1302 NA
- // 1301 NA
- // 1300 NA
- // 1299 NA
- // 1298 NA
- // 1297 NA
- 1296,
- // 1295 NA
- // 1294 NA
- // 1293 NA
- 1292,
- // 1291 NA
- // 1290 NA
- // 1289 NA
- // 1288 NA
- // 1287 NA
- // 1286 NA
+ 1303,
+ 1302,
+ 1301,
+ // 1300,
+ // 1299,
+ // 1298,
+ // 1297,
+ // 1296,
+ // 1295,
+ 1294,
+ // 1293,
+ // 1292,
+ 1291,
+ 1290,
+ 1289,
+ 1288,
+ // 1287,
+ // 1286,
1285,
1284,
- // 1283 NA
+ 1283,
1282,
1281,
- // 1280 NA
- // 1279 NA
- // 1278 NA
- // 1277 NA
- 1276,
- // 1275 NA
- // 1274 NA
- // 1273,
- // 1272 NA
+ 1280,
+ 1279,
+ // 1278,
+ // 1277,
+ // 1276,
+ 1275,
+ // 1274,
+ 1273,
+ 1272,
1271,
- // 1270 NA
+ // 1270,
1269,
- // 1268 NA
- 1267,
- // 1266
- // 1265 NA
- // 1264 NA
- // 1263 NA
- // 1262 NA
- // 1261 NA
- // 1260 NA
- 1259,
- // 1258 NA
- // 1257 NA
- // 1256 NA
- // 1255 NA
- // 1254 NA
- // 1253 NA
- // 1252 NA
- // 1251 NA
- // 1250 NA
- // 1249 NA
- // 1248 NA
- // 1247 NA
- // 1246 NA
- // 1245 NA
- // 1244 NA
- // 1243 NA
- // 1242 NA
- // 1241 NA
- // 1240 NA
- // 1239 NA
- // 1238 NA
- // 1237,
- 1236,
- // 1235 NA
- // 1234 NA
- // 1233 NA
- // 1232 NA
- // 1231 NA
- // 1230 NA
- // 1229 NA
+ 1268,
+ // 1267,
+ // 1266,
+ // 1265,
+ // 1264,
+ // 1263,
+ 1262,
+ // 1261,
+ // 1260,
+ // 1259,
+ 1258,
+ 1257,
+ 1256,
+ 1255,
+ 1254,
+ 1253,
+ 1252,
+ 1251,
+ 1250,
+ 1249,
+ 1248,
+ 1247,
+ // 1246,
+ // 1245,
+ // 1244,
+ 1243,
+ 1242,
+ // 1241,
+ // 1240,
+ // 1239,
+ 1238,
+ 1237,
+ // 1236,
+ 1235,
+ 1234,
+ 1233,
+ 1232,
+ 1231,
+ 1230,
+ 1229,
1228,
- // 1227 NA
- // 1226 NA
- // 1225 NA
- // 1224 NA
+ 1227,
+ 1226,
+ 1225,
+ 1224,
1223,
- // 1222 NA
- // 1221 NA
- // 1220 NA
- // 1219 NA
- // 1218 NA
- // 1217 NA
- // 1216 NA
- // 1215 NA
- // 1214 NA
- // 1213 NA
- // 1212 NA
- // 1211 NA
- // 1210 NA
- // 1209 NA
- // 1208 NA
- // 1207 NA
- // 1206 NA
- // 1205 NA
- // 1204 NA
- // 1203 NA
- // 1202 NA
- // 1201 NA
- // 1200 NA
- // 1199 NA
- // 1198 NA
- // 1197 NA
- // 1196 NA
- // 1195 NA
- // 1194 NA
- // 1193 NA
- // 1192 NA
- // 1191 NA
- // 1190 NA
- // 1189 NA
- // 1188 NA
- // 1187 NA
- // 1186,
- // 1185 NA
- // 1184 NA
- // 1183 NA
- // 1182 NA
+ 1222,
+ 1221,
+ // 1220,
+ 1219,
+ 1218,
+ // 1217,
+ 1216,
+ 1215,
+ 1214,
+ // 1213,
+ 1212,
+ 1211,
+ 1210,
+ 1209,
+ // 1208,
+ 1207,
+ 1206,
+ 1205,
+ 1204,
+ // 1203,
+ // 1202,
+ 1201,
+ 1200,
+ // 1199,
+ 1198,
+ 1197,
+ 1196,
+ 1195,
+ // 1194,
+ // 1193,
+ 1192,
+ 1191,
+ 1190,
+ 1189,
+ 1188,
+ 1187,
+ 1186,
+ 1185,
+ 1184,
+ 1183,
+ // 1182,
1181,
1180,
// 1179,
1178,
- // 1177 NA
- // 1176 NA
- // 1175 NA
- // 1174 NA
- 1173,
- // 1172 NA
- // 1171 NA
- // 1170 NA
- // 1169 NA
+ // 1177,
+ // 1176,
+ 1175,
+ // 1174,
+ // 1173,
+ 1172,
+ 1171,
+ // 1170,
+ 1169,
1168,
- 1167,
+ // 1167,
1166,
- // 1165 NA
- 1164,
+ 1165,
+ // 1164,
1163,
- // 1162 NA
+ // 1162,
1161,
1160,
- // 1159 NA
- // 1158 NA
+ 1159,
+ 1158,
1157,
- // 1156 NA
- // 1155 NA
- // 1154 NA
- 1153,
- // 1152 NA
+ 1156,
+ 1155,
+ 1154,
+ // 1153,
+ 1152,
1151,
1150,
- 1149,
- // 1148 NA
- // 1147,
- // 1146 NA
- // 1145 NA
- 1144,
- 1143,
- 1142,
+ // 1149,
+ 1148,
+ 1147,
+ // 1146,
+ // 1145,
+ // 1144,
+ // 1143,
+ // 1142,
1141,
- // 1140,
- // 1139 NA
- // 1138 NA
- 1137,
+ 1140,
+ // 1139,
+ // 1138,
+ // 1137,
1136,
- // 1135 NA
- // 1134 NA
- // 1133 NA
- 1132,
- // 1131 NA
- // 1130 NA
- // 1129 NA
- // 1128 NA
- // 1127 NA
- 1126,
- // 1125 NA
- // 1124 NA
- 1123,
- // 1122 NA
+ 1135,
+ // 1134,
+ // 1133,
+ // 1132,
+ // 1131,
+ // 1130,
+ // 1129,
+ // 1128,
+ // 1127,
+ // 1126,
+ // 1125,
+ 1124,
+ // 1123,
+ 1122,
1121,
- 1120,
- 1119,
+ // 1120,
+ // 1119,
1118,
- 1117,
- 1116,
- // 1115 NA
- 1114,
- 1113,
- 1112,
+ // 1117,
+ // 1116,
+ 1115,
+ // 1114,
+ // 1113,
+ // 1112,
1111,
1110,
- // 1109 NA
+ // 1109,
1108,
- 1107,
- // 1106 NA
+ // 1107,
+ // 1106,
1105,
- // 1104 NA
- // 1103 NA
- 1102,
- 1101,
- // 1100 NA
- // 1099 NA
- // 1098 NA
- // 1097 NA
- 1096,
- // 1095 NA
+ // 1104,
+ // 1103,
+ // 1102,
+ // 1101,
+ // 1100,
+ 1099,
+ 1098,
+ // 1097,
+ // 1096,
+ // 1095,
1094,
- 1093,
- 1092,
+ // 1093,
+ // 1092,
1091,
1090,
1089,
1088,
- 1087,
+ // 1087,
1086,
- 1085,
+ // 1085,
1084,
- // 1083 NA
- // 1082 NA
- 1081,
- // 1080 NA
- // 1079 NA
- // 1078 NA
- // 1077 NA
- 1076,
- 1075,
- // 1074 NA,
- // 1073 NA
+ // 1083,
+ // 1082,
+ // 1081,
+ // 1080,
+ // 1079,
+ 1078,
+ // 1077,
+ // 1076,
+ // 1075,
+ // 1074,
+ // 1073,
1072,
1071,
- // 1070 NA
- // 1069 NA
+ // 1070,
+ 1069,
1068,
- // 1067 NA
- // 1066 NA
+ 1067,
+ 1066,
1065,
- 1064,
- // 1063 NA
- // 1062 NA
- 1061,
- // 1060 NA
+ // 1064,
+ // 1063,
+ 1062,
+ // 1061,
+ // 1060,
1059,
- // 1058 NA
- 1057,
+ // 1058,
+ // 1057,
1056,
- 1055,
- 1054,
- 1053,
- 1052,
- 1051,
+ // 1055,
+ // 1054,
+ // 1053,
+ // 1052,
+ // 1051,
1050,
- 1049,
+ // 1049,
1048,
1047,
1046,
- // 1045 NA
- // 1044 NA
- // 1043 NA
+ // 1045,
+ 1044,
+ 1043,
1042,
1041,
- // 1040 NA
- // 1039 NA
- // 1038 NA
+ 1040,
+ // 1039,
+ // 1038,
1037,
- 1036,
- 1035,
- 1034,
- // 1033 NA
+ // 1036,
+ // 1035,
+ // 1034,
+ 1033,
1032,
- // 1031 NA,
+ 1031,
1030,
1029,
- // 1028 NA
+ // 1028,
1027,
- // 1026 NA
- // 1025 NA
- // 1024 NA
- // 1023 NA
- // 1022 NA
- // 1021 NA
- // 1020 NA
- // 1019 NA
- 1018,
+ 1026,
+ 1025,
+ 1024,
+ 1023,
+ 1022,
+ 1021,
+ 1020,
+ 1019,
+ // 1018,
1017,
- // 1016 NA
- 1015,
- // 1014 NA
- 1013,
- // 1012 NA
- // 1011 NA
- // 1010 NA,
- // 1009 NA
- // 1008 NA
+ 1016,
+ // 1015,
+ 1014,
+ // 1013,
+ 1012,
+ // 1011,
+ 1010,
+ // 1009,
+ 1008,
1007,
1006,
- // 1005 NA,
- // 1004 NA,
- // 1003 NA,
- // 1002 NA,
+ // 1005,
+ 1004,
+ // 1003,
+ // 1002,
1001,
- 1000,
- // 999 NA
+ // 1000,
+ 999,
998,
- // 997 NA
- // 996 NA
- // 995 NA
- // 994 NA
- // 993 NA
- // 992 NA
- 991,
- // 990 NA
+ 997,
+ 996,
+ // 995,
+ // 994,
+ 993,
+ // 992,
+ // 991,
+ // 990,
989,
- // 988 NA
- // 987 NA
- // 986 NA
- // 985 NA
- 984,
- // 983 NA
- // 982 NA
- 981,
+ 988,
+ // 987,
+ 986,
+ // 985,
+ // 984,
+ 983,
+ // 982,
+ // 981,
980,
- // 979 NA
- 978,
- 977,
- // 976 NA
+ // 979,
+ // 978,
+ // 977,
+ // 976,
975,
974,
- 973,
+ // 973,
972,
- // 971 NA
- // 970 NA
- // 969 NA
- // 968 NA
- // 967 NA
- // 966 NA
- // 965 NA
- // 964 NA
- 963,
- // 962 NA
+ 971,
+ // 970,
+ // 969,
+ // 968,
+ 967,
+ 966,
+ // 965,
+ // 964,
+ // 963,
+ 962,
961,
- // 960 NA
- // 959 NA
- 958,
- 957,
- // 956 NA
+ // 960,
+ // 959,
+ // 958,
+ // 957,
+ // 956,
955,
- // 954 NA
- 953,
- 952,
- 951,
- 950,
- 949,
- // 948 NA
- // 947 NA
+ 954,
+ // 953,
+ // 952,
+ // 951,
+ // 950,
+ // 949,
+ 948,
+ // 947,
946,
- 945,
+ // 945,
944,
- // 943 NA
- 942,
- 941,
- // 940 NA
- 939,
- // 938 NA
- 937,
- 936,
- // 935 NA
- // 934 NA
- 933,
- 932,
- // 931 NA
- // 930 NA
- 929,
- // 928 NA
- // 927 NA
- 926,
+ // 943,
+ // 942,
+ // 941,
+ // 940,
+ // 939,
+ // 938,
+ // 937,
+ // 936,
+ // 935,
+ // 934,
+ // 933,
+ // 932,
+ // 931,
+ // 930,
+ // 929,
+ // 928,
+ // 927,
+ // 926,
925,
- // 924 NA
- // 923 NA
+ // 924,
+ // 923,
922,
- // 921 NA
- // 920 NA
- // 919 NA
- // 918 NA
- // 917 NA
- 916,
- 915,
- // 914 NA
- // 913 NA
- 912,
- // 911 NA
- // 910 NA
- // 909 NA
- // 908 NA
- // 907 NA
- // 906 NA
- // 905 NA
- // 904 NA
- 903,
- // 902 NA
+ 921,
+ // 920,
+ 919,
+ // 918,
+ // 917,
+ // 916,
+ // 915,
+ // 914,
+ // 913,
+ // 912,
+ // 911,
+ // 910,
+ // 909,
+ // 908,
+ // 907,
+ 906,
+ // 905,
+ 904,
+ // 903,
+ // 902,
901,
- // 900 NA
- // 899 NA
- 898,
- // 897 NA
- 896,
+ 900,
+ // 899,
+ // 898,
+ // 897,
+ // 896,
895,
- // 894 NA
- 893,
- // 892 NA
- 891,
- // 890 NA
- 889,
- 888,
- 887,
- // 886 NA
- 885,
- // 884 NA
+ 894,
+ // 893,
+ // 892,
+ // 891,
+ 890,
+ // 889,
+ // 888,
+ // 887,
+ // 886,
+ // 885,
+ // 884,
883,
- 882,
+ // 882,
881,
- // 880 NA
+ 880,
879,
878,
- 877,
- // 876 NA
- // 875 NA
- // 874 NA
- // 873 NA
- // 872 NA
- 871,
- 870,
- // 869 NA
- 868,
- // 867 NA
- // 866 NA
- // 865 NA
- // 864 NA
- // 863 NA
- // 862 NA
- // 861 NA
- // 860 NA
- 859,
+ // 877,
+ // 876,
+ 875,
+ // 874,
+ // 873,
+ // 872,
+ // 871,
+ // 870,
+ // 869,
+ // 868,
+ // 867,
+ 866,
+ 865,
+ // 864,
+ // 863,
+ 862,
+ 861,
+ // 860,
+ // 859,
858,
- 857,
- 856,
- // 855 NA
- // 854 NA
- 853,
- // 852 NA
- // 851 NA
- // 850 NA
- 849,
- 848,
+ // 857,
+ // 856,
+ // 855,
+ // 854,
+ // 853,
+ // 852,
+ 851,
+ // 850,
+ // 849,
+ // 848,
847,
- // 846 NA
- 845,
- 844,
- 843,
- // 842 NA
- // 841 NA
- // 840 NA
- // 839 NA
- // 838 NA
- // 837 NA
- 836,
+ // 846,
+ // 845,
+ // 844,
+ // 843,
+ // 842,
+ // 841,
+ // 840,
+ // 839,
+ // 838,
+ 837,
+ // 836,
835,
834,
- 833,
- 832,
+ // 833,
+ // 832,
831,
830,
- // 829 NA
+ // 829,
828,
- // 827 NA
- 826,
- 825,
- // 824 NA
- 823,
+ // 827,
+ // 826,
+ // 825,
+ // 824,
+ // 823,
822,
- // 821 NA
- 820,
- 819,
- 818,
- 817,
- 816,
- 815,
+ // 821,
+ // 820,
+ // 819,
+ // 818,
+ // 817,
+ // 816,
+ // 815,
814,
- 813,
- // 812 NA
+ // 813,
+ // 812,
811,
810,
809,
- // 808 NA
- 807,
+ 808,
+ // 807,
806,
805,
- // 804 NA
- 803,
- 802,
- 801,
- 800,
- 799,
- 798,
- // 797 NA
- // 796 NA
+ // 804,
+ // 803,
+ // 802,
+ // 801,
+ // 800,
+ // 799,
+ // 798,
+ // 797,
+ 796,
795,
- // 794 NA
- 793,
+ 794,
+ // 793,
792,
791,
790,
- 789,
- // 788 NA
- 787,
+ // 789,
+ // 788,
+ // 787,
786,
- 785,
- 784,
- // 783 NA
+ // 785,
+ // 784,
+ // 783,
782,
- 781,
+ // 781,
780,
- 779,
- 778,
- // 777 NA
- 776,
- 775,
+ // 779,
+ // 778,
+ // 777,
+ // 776,
+ // 775,
774,
773,
- // 772 NA
- 771,
- // 770 NA
- 769,
- 768,
- // 767 NA
- // 766 NA
+ 772,
+ // 771,
+ 770,
+ // 769,
+ // 768,
+ 767,
+ // 766,
765,
- 764,
- // 763 NA
- // 762 NA
- // 761 NA
- 760,
- // 759 NA
- 758,
- // 757 NA
- // 756 NA
- 755,
- 754,
- 753,
- // 752 NA
- // 751 NA
- // 750 NA
+ // 764,
+ 763,
+ 762,
+ // 761,
+ // 760,
+ // 759,
+ // 758,
+ 757,
+ 756,
+ // 755,
+ // 754,
+ // 753,
+ 752,
+ 751,
+ 750,
749,
- 748,
- 747,
- 746,
- 745,
- // 744 NA
- 743,
- 742,
+ // 748,
+ // 747,
+ // 746,
+ // 745,
+ // 744,
+ // 743,
+ // 742,
741,
- 740,
- 739,
- // 738 NA
+ // 740,
+ // 739,
+ // 738,
737,
736,
- // 735 NA
+ 735,
734,
- // 733 NA
- 732,
- // 731 NA
- // 730 NA
+ 733,
+ // 732,
+ 731,
+ // 730,
729,
- // 728 NA
- // 727 NA
- // 726 NA
- // 725 NA
- // 724 NA
+ // 728,
+ 727,
+ 726,
+ // 725,
+ 724,
723,
722,
721,
- // 720 NA
+ // 720,
719,
- 718,
- 717,
- 716,
- 715,
- 714,
- 713,
- 712,
+ // 718,
+ // 717,
+ // 716,
+ // 715,
+ // 714,
+ // 713,
+ // 712,
711,
710,
- 709,
+ // 709,
708,
707,
706,
- // 705 NA
+ // 705,
704,
- // 703 NA
- 702,
- // 701 NA
+ 703,
+ // 702,
+ 701,
700,
699,
- 698,
+ // 698,
697,
696,
695,
- 694,
- 693,
- // 692 NA
- // 691 NA
+ // 694,
+ // 693,
+ 692,
+ 691,
690,
689,
688,
- // 687 NA
+ 687,
686,
685,
- // 684 NA
- // 683 NA
+ 684,
+ // 683,
682,
- // 681 NA
+ // 681,
680,
- // 679 NA
- // 678 NA
- // 677 NA
- // 676 NA
+ 679,
+ 678,
+ 677,
+ 676,
675,
- // 674 NA
+ 674,
673,
672,
671,
670,
- // 669 NA
+ 669,
668,
667,
- // 666 NA
+ 666,
665,
- // 664 NA
- // 663 NA
+ 664,
+ 663,
662,
- // 661 NA
+ 661,
660,
659,
658,
- // 657 NA
+ 657,
656,
655,
654,
653,
- // 652 NA
+ 652,
651,
- // 650 NA
+ 650,
649,
- // 648 NA
- // 647 NA
- 646,
- 645,
- // 644 NA
- 643,
+ 648,
+ // 647,
+ // 646,
+ // 645,
+ // 644,
+ // 643,
642,
- // 641 NA
+ 641,
640,
639,
- // 638 NA
+ 638,
637,
636,
635,
634,
633,
- // 632 NA
+ 632,
631,
630,
- 629,
- // 628 NA
- // 627 NA
- // 626 NA
- // 625 NA
- // 624 NA
+ // 629,
+ 628,
+ 627,
+ 626,
+ 625,
+ 624,
623,
- // 622 NA
- // 621 NA
- // 620 NA
- // 619 NA
- // 618 NA
+ 622,
+ 621,
+ 620,
+ 619,
+ 618,
617,
616,
615,
614,
613,
612,
- // 611 NA
- // 610 NA
+ 611,
+ 610,
609,
608,
- // 607 NA
+ 607,
606,
605,
604,
@@ -1103,22 +1331,22 @@ static int included_patches[] = {
599,
598,
597,
- // 596 NA
+ 596,
595,
594,
593,
- // 592 NA
- // 591 NA
+ // 592,
+ 591,
590,
- // 589 NA
+ 589,
588,
587,
- // 586 NA
+ 586,
585,
- // 584 NA
- // 583 NA
+ 584,
+ 583,
582,
- // 581 NA
+ 581,
580,
579,
578,
@@ -1127,45 +1355,45 @@ static int included_patches[] = {
575,
574,
573,
- 572,
- // 571 NA
- // 570 NA
+ // 572,
+ 571,
+ 570,
569,
568,
567,
566,
565,
- // 564 NA
+ 564,
563,
562,
561,
- // 560 NA
+ 560,
559,
- // 558 NA
- // 557 NA
- // 556 NA
- // 555 NA
+ 558,
+ 557,
+ 556,
+ 555,
554,
553,
552,
551,
550,
549,
- // 548 NA
+ 548,
547,
546,
545,
- // 544 NA
+ 544,
543,
542,
541,
- // 540 NA
+ 540,
539,
538,
537,
536,
535,
- // 534 NA
+ 534,
533,
532,
531,
@@ -1176,8 +1404,8 @@ static int included_patches[] = {
526,
525,
524,
- // 523 NA
- // 522 NA
+ 523,
+ 522,
521,
520,
519,
@@ -1185,26 +1413,26 @@ static int included_patches[] = {
517,
516,
515,
- 514,
+ // 514,
513,
- // 512 NA
- // 511 NA
- // 510 NA
- // 509 NA
+ 512,
+ 511,
+ 510,
+ 509,
508,
- // 507 NA
- // 506 NA
- // 505 NA
- // 504 NA
+ 507,
+ // 506,
+ 505,
+ // 504,
503,
502,
- // 501 NA
+ 501,
500,
499,
- // 498 NA
+ 498,
497,
- // 496 NA
- // 495 NA
+ 496,
+ 495,
494,
493,
492,
@@ -1215,48 +1443,48 @@ static int included_patches[] = {
487,
486,
485,
- // 484 NA
+ 484,
483,
- // 482 NA
- // 481 NA
- // 480 NA
- // 479 NA
+ 482,
+ 481,
+ 480,
+ 479,
478,
477,
- // 476 NA
- // 475 NA
+ 476,
+ 475,
474,
473,
472,
- // 471 NA
+ 471,
470,
- // 469 NA
+ 469,
468,
467,
466,
- // 465 NA
- // 464 NA
+ 465,
+ 464,
463,
462,
- // 461 NA
- // 460 NA
- // 459 NA
+ 461,
+ 460,
+ 459,
458,
457,
456,
455,
454,
- // 453 NA
+ 453,
452,
- // 451 NA
+ 451,
450,
449,
- // 448 NA
+ 448,
447,
446,
445,
444,
- // 443 NA
+ 443,
442,
441,
440,
@@ -1267,46 +1495,46 @@ static int included_patches[] = {
435,
434,
433,
- // 432 NA
- // 431 NA
- // 430 NA
- // 429 NA
- // 428 NA
+ 432,
+ 431,
+ 430,
+ 429,
+ 428,
427,
- // 426 NA
+ 426,
425,
- // 424 NA
+ 424,
423,
422,
421,
- // 420 NA
+ 420,
419,
418,
417,
416,
415,
414,
- // 413 NA
- // 412 NA
- 411,
+ // 413,
+ // 412,
+ // 411,
410,
- // 409 NA
+ 409,
408,
407,
406,
405,
- // 404 NA
- // 403 NA
- // 402 NA
- // 401 NA
- // 400 NA
- // 399 NA
- // 398 NA
+ 404,
+ 403,
+ 402,
+ 401,
+ 400,
+ 399,
+ 398,
397,
- 396,
+ // 396,
395,
- // 394 NA
- // 393 NA
+ 394,
+ 393,
392,
391,
390,
@@ -1314,12 +1542,12 @@ static int included_patches[] = {
388,
387,
386,
- // 385 NA
- // 384 NA
+ 385,
+ 384,
383,
382,
381,
- // 380 NA
+ 380,
379,
378,
377,
@@ -1333,19 +1561,19 @@ static int included_patches[] = {
369,
368,
367,
- // 366 NA
+ 366,
365,
364,
- // 363 NA
+ 363,
362,
361,
360,
359,
358,
357,
- // 356 NA
+ 356,
355,
- // 354 NA
+ 354,
353,
352,
351,
@@ -1357,33 +1585,33 @@ static int included_patches[] = {
345,
344,
343,
- // 342 NA
+ 342,
341,
- // 340 NA
+ 340,
339,
338,
337,
336,
335,
334,
- // 333 NA
- // 332 NA
+ 333,
+ 332,
331,
330,
329,
328,
327,
- // 326 NA
+ 326,
325,
324,
323,
- // 322 NA
- // 321 NA
+ 322,
+ 321,
320,
- // 319 NA
+ 319,
318,
317,
- // 316 NA
+ 316,
315,
314,
313,
@@ -1392,18 +1620,18 @@ static int included_patches[] = {
310,
309,
308,
- // 307 NA
+ 307,
306,
305,
- // 304 NA
- 303,
+ 304,
+ // 303,
302,
301,
- // 300 NA
- // 299 NA
+ 300,
+ 299,
298,
297,
- 296,
+ // 296,
295,
294,
293,
@@ -1412,11 +1640,11 @@ static int included_patches[] = {
290,
289,
288,
- // 287 NA
+ 287,
286,
285,
284,
- // 283 NA
+ 283,
282,
281,
280,
@@ -1426,119 +1654,119 @@ static int included_patches[] = {
276,
275,
274,
- // 273 NA
+ 273,
272,
- // 271 NA
- // 270 NA
+ 271,
+ 270,
269,
268,
267,
266,
265,
264,
- // 263 NA
+ 263,
262,
261,
260,
- // 259 NA
- // 258 NA
- // 257 NA
+ 259,
+ 258,
+ 257,
256,
- // 255 NA
- // 254 NA
+ 255,
+ 254,
253,
- // 252 NA
+ 252,
251,
- // 250 NA
+ 250,
249,
248,
247,
- // 246 NA
+ 246,
245,
- // 244 NA
+ 244,
243,
242,
241,
240,
239,
- // 238 NA
+ // 238,
237,
236,
235,
234,
- 233,
+ // 233,
232,
- 231,
- 230,
+ // 231,
+ // 230,
229,
- // 228 NA
- // 227 NA
+ // 228,
+ 227,
226,
- // 225 NA
- // 224 NA
- // 223 NA
- // 222 NA
+ 225,
+ 224,
+ 223,
+ 222,
221,
220,
219,
218,
- // 217 NA
- // 216 NA
+ 217,
+ 216,
215,
- // 214 NA
+ 214,
213,
- // 212 NA
+ 212,
211,
- 210,
+ // 210,
209,
- // 208 NA
+ 208,
207,
- // 206 NA
+ 206,
205,
204,
203,
- // 202 NA
+ 202,
201,
- // 200 NA
+ 200,
199,
- // 198 NA
- // 197 NA
- // 196 NA
- // 195 NA
- // 194 NA
+ 198,
+ 197,
+ 196,
+ 195,
+ 194,
193,
192,
191,
- // 190 NA
- // 189 NA
- // 188 NA
+ 190,
+ 189,
+ 188,
187,
186,
- // 185 NA
+ 185,
184,
- // 183 NA
- // 182 NA
+ 183,
+ 182,
181,
- // 180 NA
- // 179 NA
+ 180,
+ 179,
178,
- // 177 NA
- // 176 NA
- // 175 NA
- // 174 NA
+ 177,
+ 176,
+ 175,
+ 174,
173,
172,
171,
170,
169,
- // 168 NA
+ 168,
167,
166,
165,
- // 164 NA
- // 163 NA
- // 162 NA
- // 161 NA
+ 164,
+ 163,
+ 162,
+ 161,
160,
159,
158,
@@ -1699,34 +1927,76 @@ static int included_patches[] = {
3,
2,
1,
- 0
+ 0,
};
// clang-format on
-/// Place to put a short description when adding a feature with a patch.
-/// Keep it short, e.g.,: "relative numbers", "persistent undo".
-/// Also add a comment marker to separate the lines.
-/// See the official Vim patches for the diff format: It must use a context of
-/// one line only. Create it by hand or use "diff -C2" and edit the patch.
-static char *(extra_patches[]) = {
- // Add your patch description below this line
- NULL
-};
+/// Compares a version string to the current Nvim version.
+///
+/// @param version Version string like "1.3.42"
+///
+/// @return true if Nvim is at or above the version.
+bool has_nvim_version(const char *const version_str)
+ FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
+{
+ const char *p = version_str;
+ int major = 0;
+ int minor = 0;
+ int patch = 0;
-/// Checks whether patch `n` has been included.
+ if (!ascii_isdigit(*p)) {
+ return false;
+ }
+ major = atoi(p);
+ p = strchr(p, '.'); // Find the next dot.
+
+ if (p) {
+ p++; // Advance past the dot.
+ if (!ascii_isdigit(*p)) {
+ return false;
+ }
+ minor = atoi(p);
+ p = strchr(p, '.');
+ if (p) {
+ p++;
+ if (!ascii_isdigit(*p)) {
+ return false;
+ }
+ patch = atoi(p);
+ }
+ }
+
+ return (major < NVIM_VERSION_MAJOR
+ || (major == NVIM_VERSION_MAJOR
+ && (minor < NVIM_VERSION_MINOR
+ || (minor == NVIM_VERSION_MINOR
+ && patch <= NVIM_VERSION_PATCH))));
+}
+
+/// Checks whether a Vim patch has been included.
///
-/// @param n The patch number.
+/// @param n Patch number.
///
-/// @return TRUE if patch "n" has been included.
-int has_patch(int n)
+/// @return true if patch `n` has been included.
+bool has_vim_patch(int n)
{
- int i;
- for (i = 0; included_patches[i] != 0; ++i) {
+ for (int i = 0; included_patches[i] != 0; i++) {
if (included_patches[i] == n) {
- return TRUE;
+ return true;
}
}
- return FALSE;
+ return false;
+}
+
+Dictionary version_dict(void) {
+ Dictionary d = ARRAY_DICT_INIT;
+ PUT(d, "major", INTEGER_OBJ(NVIM_VERSION_MAJOR));
+ PUT(d, "minor", INTEGER_OBJ(NVIM_VERSION_MINOR));
+ PUT(d, "patch", INTEGER_OBJ(NVIM_VERSION_PATCH));
+ PUT(d, "api_level", INTEGER_OBJ(NVIM_API_LEVEL));
+ PUT(d, "api_compatible", INTEGER_OBJ(NVIM_API_LEVEL_COMPAT));
+ PUT(d, "api_prerelease", BOOLEAN_OBJ(NVIM_API_PRERELEASE));
+ return d;
}
void ex_version(exarg_T *eap)
@@ -1778,15 +2048,13 @@ static void list_features(void)
int idx = (i / ncol) + (i % ncol) * nrow;
if (idx < nfeat) {
int last_col = (i + 1) % ncol == 0;
- msg_puts((char_u *)features[idx]);
+ msg_puts(features[idx]);
if (last_col) {
if (msg_col > 0) {
msg_putchar('\n');
}
} else {
- while (msg_col % width) {
- msg_putchar(' ');
- }
+ msg_putchar(' ');
}
} else {
if (msg_col > 0) {
@@ -1794,30 +2062,27 @@ static void list_features(void)
}
}
}
- MSG_PUTS("For differences from Vim, see :help vim-differences\n\n");
+ MSG_PUTS("See \":help feature-compile\"\n\n");
+}
+
+void list_lua_version(void)
+{
+ typval_T luaver_tv;
+ typval_T arg = { .v_type = VAR_UNKNOWN }; // No args.
+ char *luaver_expr = "((jit and jit.version) and jit.version or _VERSION)";
+ executor_eval_lua(cstr_as_string(luaver_expr), &arg, &luaver_tv);
+ assert(luaver_tv.v_type == VAR_STRING);
+ MSG(luaver_tv.vval.v_string);
+ xfree(luaver_tv.vval.v_string);
}
void list_version(void)
{
- // When adding features here, don't forget to update the list of
- // internal variables in eval.c!
MSG(longVersion);
MSG(version_buildtype);
+ list_lua_version();
MSG(version_cflags);
- // Print the list of extra patch descriptions if there is at least one.
- char *s = "";
- if (extra_patches[0] != NULL) {
- MSG_PUTS(_("\nExtra patches: "));
- s = "";
-
- for (int i = 0; extra_patches[i] != NULL; ++i) {
- MSG_PUTS(s);
- s = ", ";
- MSG_PUTS(extra_patches[i]);
- }
- }
-
#ifdef HAVE_PATHDEF
if ((*compiled_user != NUL) || (*compiled_sys != NUL)) {
@@ -1835,7 +2100,7 @@ void list_version(void)
}
#endif // ifdef HAVE_PATHDEF
- version_msg(_("\n\nOptional features included (+) or not (-): "));
+ version_msg(_("\n\nFeatures: "));
list_features();
@@ -1858,6 +2123,8 @@ void list_version(void)
version_msg("\"\n");
}
#endif // ifdef HAVE_PATHDEF
+
+ version_msg("\nRun :checkhealth for more info");
}
/// Output a string for the version message. If it's going to wrap, output a
@@ -1884,7 +2151,7 @@ static void version_msg(char *s)
/// Show the intro message when not editing a file.
void maybe_intro_message(void)
{
- if (bufempty()
+ if (BUFEMPTY()
&& (curbuf->b_fname == NULL)
&& (firstwin->w_next == NULL)
&& (vim_strchr(p_shm, SHM_INTRO) == NULL)) {
@@ -1907,15 +2174,13 @@ void intro_message(int colon)
static char *(lines[]) = {
N_(NVIM_VERSION_LONG),
"",
- N_("by Bram Moolenaar et al."),
- N_("Vim is open source and freely distributable"),
- "",
- N_("Type \":Tutor\" or \":help nvim\" to get started!"),
- "",
- N_("Still have questions? https://neovim.io/community"),
+ N_("Nvim is open source and freely distributable"),
+ N_("https://neovim.io/#chat"),
"",
+ N_("type :help nvim<Enter> if you are new! "),
+ N_("type :checkhealth<Enter> to optimize Nvim"),
N_("type :q<Enter> to exit "),
- N_("type :help<Enter> or <F1> for on-line help"),
+ N_("type :help<Enter> for help "),
"",
N_("Help poor children in Uganda!"),
N_("type :help iccf<Enter> for information "),
@@ -2006,7 +2271,8 @@ static void do_intro_line(long row, char_u *mesg, int attr)
}
}
assert(row <= INT_MAX && col <= INT_MAX);
- screen_puts_len(p, l, (int)row, (int)col, *p == '<' ? hl_attr(HLF_8) : attr);
+ grid_puts_len(&default_grid, p, l, (int)row, (int)col,
+ *p == '<' ? HL_ATTR(HLF_8) : attr);
col += clen;
}
}
diff --git a/src/nvim/version.h b/src/nvim/version.h
index 1de809e539..c10f6fa534 100644
--- a/src/nvim/version.h
+++ b/src/nvim/version.h
@@ -1,6 +1,8 @@
#ifndef NVIM_VERSION_H
#define NVIM_VERSION_H
+#include "nvim/ex_cmds_defs.h"
+
// defined in version.c
extern char* Version;
extern char* longVersion;
@@ -8,14 +10,14 @@ extern char* longVersion;
//
// Vim version number, name, etc. Patchlevel is defined in version.c.
//
-#define VIM_VERSION_MAJOR 7
-#define VIM_VERSION_MINOR 4
+#define VIM_VERSION_MAJOR 8
+#define VIM_VERSION_MINOR 0
#define VIM_VERSION_100 (VIM_VERSION_MAJOR * 100 + VIM_VERSION_MINOR)
// used for the runtime directory name
-#define VIM_VERSION_NODOT "vim74"
+#define VIM_VERSION_NODOT "vim80"
// swap file compatibility (max. length is 6 chars)
-#define VIM_VERSION_SHORT "7.4"
+#define VIM_VERSION_SHORT "8.0"
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "version.h.generated.h"
diff --git a/src/nvim/vim.h b/src/nvim/vim.h
index 09e9e850a7..767936ecee 100644
--- a/src/nvim/vim.h
+++ b/src/nvim/vim.h
@@ -4,40 +4,27 @@
#include "nvim/types.h"
#include "nvim/pos.h" // for linenr_T, MAXCOL, etc...
-/* Some defines from the old feature.h */
+// Some defines from the old feature.h
#define SESSION_FILE "Session.vim"
#define MAX_MSG_HIST_LEN 200
#define SYS_OPTWIN_FILE "$VIMRUNTIME/optwin.vim"
#define RUNTIME_DIRNAME "runtime"
-/* end */
-/* ============ the header file puzzle (ca. 50-100 pieces) ========= */
-#ifdef HAVE_CONFIG_H /* GNU autoconf (or something else) was here */
-# include "auto/config.h"
-# define HAVE_PATHDEF
+#include "auto/config.h"
+#define HAVE_PATHDEF
-/*
- * Check if configure correctly managed to find sizeof(int). If this failed,
- * it becomes zero. This is likely a problem of not being able to run the
- * test program. Other items from configure may also be wrong then!
- */
-# if (SIZEOF_INT == 0)
-Error: configure did not run properly.Check auto/config.log.
-# endif
+// Check if configure correctly managed to find sizeof(int). If this failed,
+// it becomes zero. This is likely a problem of not being able to run the
+// test program. Other items from configure may also be wrong then!
+#if (SIZEOF_INT == 0)
+# error Configure did not run properly.
#endif
-#include "nvim/os/os_defs.h" /* bring lots of system header files */
+#include "nvim/os/os_defs.h" // bring lots of system header files
/// length of a buffer to store a number in ASCII (64 bits binary + NUL)
-#define NUMBUFLEN 65
-
-// flags for vim_str2nr()
-#define STR2NR_BIN 1
-#define STR2NR_OCT 2
-#define STR2NR_HEX 4
-#define STR2NR_ALL (STR2NR_BIN + STR2NR_OCT + STR2NR_HEX)
-#define STR2NR_FORCE 8 // only when ONE of the above is used
+enum { NUMBUFLEN = 65 };
#define MAX_TYPENR 65535
@@ -46,86 +33,78 @@ Error: configure did not run properly.Check auto/config.log.
#include "nvim/keymap.h"
#include "nvim/macros.h"
+#include "nvim/gettext.h"
+// special attribute addition: Put message in history
+#define MSG_HIST 0x1000
-/* ================ end of the header file puzzle =============== */
+// values for State
+//
+// The lower bits up to 0x20 are used to distinguish normal/visual/op_pending
+// and cmdline/insert+replace mode. This is used for mapping. If none of
+// these bits are set, no mapping is done.
+// The upper bits are used to distinguish between other states.
-#ifdef HAVE_WORKING_LIBINTL
-# include <libintl.h>
-# define _(x) gettext((char *)(x))
-// XXX do we actually need this?
-# ifdef gettext_noop
-# define N_(x) gettext_noop(x)
-# else
-# define N_(x) x
-# endif
-#else
-# define _(x) ((char *)(x))
-# define N_(x) x
-# define bindtextdomain(x, y) /* empty */
-# define bind_textdomain_codeset(x, y) /* empty */
-# define textdomain(x) /* empty */
-#endif
+#define NORMAL 0x01 // Normal mode, command expected
+#define VISUAL 0x02 // Visual mode - use get_real_state()
+#define OP_PENDING 0x04 // Normal mode, operator is pending - use
+ // get_real_state()
+#define CMDLINE 0x08 // Editing command line
+#define INSERT 0x10 // Insert mode
+#define LANGMAP 0x20 // Language mapping, can be combined with
+ // INSERT and CMDLINE
-/* special attribute addition: Put message in history */
-#define MSG_HIST 0x1000
-
-/*
- * values for State
- *
- * The lower bits up to 0x20 are used to distinguish normal/visual/op_pending
- * and cmdline/insert+replace mode. This is used for mapping. If none of
- * these bits are set, no mapping is done.
- * The upper bits are used to distinguish between other states.
- */
-#define NORMAL 0x01 /* Normal mode, command expected */
-#define VISUAL 0x02 /* Visual mode - use get_real_state() */
-#define OP_PENDING 0x04 /* Normal mode, operator is pending - use
- get_real_state() */
-#define CMDLINE 0x08 /* Editing command line */
-#define INSERT 0x10 /* Insert mode */
-#define LANGMAP 0x20 /* Language mapping, can be combined with
- INSERT and CMDLINE */
-
-#define REPLACE_FLAG 0x40 /* Replace mode flag */
+#define REPLACE_FLAG 0x40 // Replace mode flag
#define REPLACE (REPLACE_FLAG + INSERT)
-# define VREPLACE_FLAG 0x80 /* Virtual-replace mode flag */
+# define VREPLACE_FLAG 0x80 // Virtual-replace mode flag
# define VREPLACE (REPLACE_FLAG + VREPLACE_FLAG + INSERT)
#define LREPLACE (REPLACE_FLAG + LANGMAP)
-#define NORMAL_BUSY (0x100 + NORMAL) /* Normal mode, busy with a command */
-#define HITRETURN (0x200 + NORMAL) /* waiting for return or command */
-#define ASKMORE 0x300 /* Asking if you want --more-- */
-#define SETWSIZE 0x400 /* window size has changed */
-#define ABBREV 0x500 /* abbreviation instead of mapping */
-#define EXTERNCMD 0x600 /* executing an external command */
-#define SHOWMATCH (0x700 + INSERT) /* show matching paren */
-#define CONFIRM 0x800 /* ":confirm" prompt */
-#define SELECTMODE 0x1000 /* Select mode, only for mappings */
+#define NORMAL_BUSY (0x100 + NORMAL) // Normal mode, busy with a command
+#define HITRETURN (0x200 + NORMAL) // waiting for return or command
+#define ASKMORE 0x300 // Asking if you want --more--
+#define SETWSIZE 0x400 // window size has changed
+#define ABBREV 0x500 // abbreviation instead of mapping
+#define EXTERNCMD 0x600 // executing an external command
+#define SHOWMATCH (0x700 + INSERT) // show matching paren
+#define CONFIRM 0x800 // ":confirm" prompt
+#define SELECTMODE 0x1000 // Select mode, only for mappings
#define TERM_FOCUS 0x2000 // Terminal focus mode
+#define CMDPREVIEW 0x4000 // Showing 'inccommand' command "live" preview.
// all mode bits used for mapping
#define MAP_ALL_MODES (0x3f | SELECTMODE | TERM_FOCUS)
-/* directions */
-#define FORWARD 1
-#define BACKWARD (-1)
-#define FORWARD_FILE 3
-#define BACKWARD_FILE (-3)
+/// Directions.
+typedef enum {
+ kDirectionNotSet = 0,
+ FORWARD = 1,
+ BACKWARD = (-1),
+ FORWARD_FILE = 3,
+ BACKWARD_FILE = (-3),
+} Direction;
-/* return values for functions */
+// return values for functions
#if !(defined(OK) && (OK == 1))
-/* OK already defined to 1 in MacOS X curses, skip this */
+// OK already defined to 1 in MacOS X curses, skip this
# define OK 1
#endif
#define FAIL 0
-#define NOTDONE 2 /* not OK or FAIL but skipped */
+#define NOTDONE 2 // not OK or FAIL but skipped
+
+// Type values for type().
+#define VAR_TYPE_NUMBER 0
+#define VAR_TYPE_STRING 1
+#define VAR_TYPE_FUNC 2
+#define VAR_TYPE_LIST 3
+#define VAR_TYPE_DICT 4
+#define VAR_TYPE_FLOAT 5
+#define VAR_TYPE_BOOL 6
+
+// values for xp_context when doing command line completion
-/*
- * values for xp_context when doing command line completion
- */
enum {
EXPAND_UNSUCCESSFUL = -2,
EXPAND_OK = -1,
@@ -175,60 +154,63 @@ enum {
EXPAND_SYNTIME,
EXPAND_USER_ADDR_TYPE,
EXPAND_PACKADD,
+ EXPAND_MESSAGES,
+ EXPAND_MAPCLEAR,
+ EXPAND_ARGLIST,
+ EXPAND_CHECKHEALTH,
};
+// Minimal size for block 0 of a swap file.
+// NOTE: This depends on size of struct block0! It's not done with a sizeof(),
+// because struct block0 is defined in memline.c (Sorry).
+// The maximal block size is arbitrary.
-/*
- * Minimal size for block 0 of a swap file.
- * NOTE: This depends on size of struct block0! It's not done with a sizeof(),
- * because struct block0 is defined in memline.c (Sorry).
- * The maximal block size is arbitrary.
- */
#define MIN_SWAP_PAGE_SIZE 1048
#define MAX_SWAP_PAGE_SIZE 50000
-/*
- * Boolean constants
- */
+// Boolean constants
+
#ifndef TRUE
-# define FALSE 0 /* note: this is an int, not a long! */
+# define FALSE 0 // note: this is an int, not a long!
# define TRUE 1
#endif
-#define MAYBE 2 /* sometimes used for a variant on TRUE */
+#define MAYBE 2 // sometimes used for a variant on TRUE
+
+#define STATUS_HEIGHT 1 // height of a status line under a window
+#define QF_WINHEIGHT 10 // default height for quickfix window
-#define STATUS_HEIGHT 1 /* height of a status line under a window */
-#define QF_WINHEIGHT 10 /* default height for quickfix window */
-/*
- * Buffer sizes
- */
+// Buffer sizes
+
#ifndef CMDBUFFSIZE
-# define CMDBUFFSIZE 256 /* size of the command processing buffer */
+# define CMDBUFFSIZE 256 // size of the command processing buffer
#endif
-#define LSIZE 512 /* max. size of a line in the tags file */
+#define LSIZE 512 // max. size of a line in the tags file
+
+#define DIALOG_MSG_SIZE 1000 // buffer size for dialog_msg()
+
+enum { FOLD_TEXT_LEN = 51 }; //!< buffer size for get_foldtext()
-#define DIALOG_MSG_SIZE 1000 /* buffer size for dialog_msg() */
-/*
- * Maximum length of key sequence to be mapped.
- * Must be able to hold an Amiga resize report.
- */
+// Maximum length of key sequence to be mapped.
+// Must be able to hold an Amiga resize report.
+
#define MAXMAPLEN 50
-/* Size in bytes of the hash used in the undo file. */
+// Size in bytes of the hash used in the undo file.
#define UNDO_HASH_SIZE 32
-/*
- * defines to avoid typecasts from (char_u *) to (char *) and back
- * (vim_strchr() and vim_strrchr() are now in alloc.c)
- */
+
+// defines to avoid typecasts from (char_u *) to (char *) and back
+// (vim_strchr() is now in strings.c)
+
#define STRLEN(s) strlen((char *)(s))
#define STRCPY(d, s) strcpy((char *)(d), (char *)(s))
#define STRNCPY(d, s, n) strncpy((char *)(d), (char *)(s), (size_t)(n))
@@ -245,7 +227,7 @@ enum {
# endif
#endif
-/* Like strcpy() but allows overlapped source and destination. */
+// Like strcpy() but allows overlapped source and destination.
#define STRMOVE(d, s) memmove((d), (s), STRLEN(s) + 1)
#ifdef HAVE_STRNCASECMP
@@ -258,8 +240,11 @@ enum {
# endif
#endif
+#define STRRCHR(s, c) (char_u *)strrchr((const char *)(s), (c))
+
#define STRCAT(d, s) strcat((char *)(d), (char *)(s))
#define STRNCAT(d, s, n) strncat((char *)(d), (char *)(s), (size_t)(n))
+#define STRLCAT(d, s, n) xstrlcat((char *)(d), (char *)(s), (size_t)(n))
# define vim_strpbrk(s, cs) (char_u *)strpbrk((char *)(s), (char *)(cs))
@@ -269,41 +254,47 @@ enum {
// destination and mess up the screen.
#define PERROR(msg) (void) emsgf("%s: %s", msg, strerror(errno))
-#define SHOWCMD_COLS 10 /* columns needed by shown command */
-#define STL_MAX_ITEM 80 /* max nr of %<flag> in statusline */
-
-/*
- * fnamecmp() is used to compare file names.
- * On some systems case in a file name does not matter, on others it does.
- * (this does not account for maximum name lengths and things like "../dir",
- * thus it is not 100% accurate!)
- */
-#define fnamecmp(x, y) vim_fnamecmp((char_u *)(x), (char_u *)(y))
-#define fnamencmp(x, y, n) vim_fnamencmp((char_u *)(x), (char_u *)(y), \
- (size_t)(n))
-
-/*
- * Enums need a typecast to be used as array index (for Ultrix).
- */
-#define hl_attr(n) highlight_attr[(int)(n)]
-#define term_str(n) term_strings[(int)(n)]
-
-/* Maximum number of bytes in a multi-byte character. It can be one 32-bit
- * character of up to 6 bytes, or one 16-bit character of up to three bytes
- * plus six following composing characters of three bytes each. */
+#define SHOWCMD_COLS 10 // columns needed by shown command
+#define STL_MAX_ITEM 80 // max nr of %<flag> in statusline
+
+/// Compare file names
+///
+/// On some systems case in a file name does not matter, on others it does.
+///
+/// @note Does not account for maximum name lengths and things like "../dir",
+/// thus it is not 100% accurate. OS may also use different algorythm for
+/// case-insensitive comparison.
+///
+/// @param[in] x First file name to compare.
+/// @param[in] y Second file name to compare.
+///
+/// @return 0 for equal file names, non-zero otherwise.
+#define fnamecmp(x, y) path_fnamecmp((const char *)(x), (const char *)(y))
+#define fnamencmp(x, y, n) path_fnamencmp((const char *)(x), \
+ (const char *)(y), \
+ (size_t)(n))
+
+
+// Enums need a typecast to be used as array index (for Ultrix).
+#define HL_ATTR(n) highlight_attr[(int)(n)]
+#define TERM_STR(n) term_strings[(int)(n)]
+
+/// Maximum number of bytes in a multi-byte character. It can be one 32-bit
+/// character of up to 6 bytes, or one 16-bit character of up to three bytes
+/// plus six following composing characters of three bytes each.
#define MB_MAXBYTES 21
-/* This has to go after the include of proto.h, as proto/gui.pro declares
- * functions of these names. The declarations would break if the defines had
- * been seen at that stage. But it must be before globals.h, where error_ga
- * is declared. */
+// This has to go after the include of proto.h, as proto/gui.pro declares
+// functions of these names. The declarations would break if the defines had
+// been seen at that stage. But it must be before globals.h, where error_ga
+// is declared.
#define mch_errmsg(str) fprintf(stderr, "%s", (str))
#define display_errors() fflush(stderr)
#define mch_msg(str) printf("%s", (str))
-#include "nvim/globals.h" /* global variables and messages */
-#include "nvim/buffer_defs.h" /* buffer and windows */
-#include "nvim/ex_cmds_defs.h" /* Ex command defines */
+#include "nvim/globals.h" // global variables and messages
+#include "nvim/buffer_defs.h" // buffer and windows
+#include "nvim/ex_cmds_defs.h" // Ex command defines
# define SET_NO_HLSEARCH(flag) no_hlsearch = (flag); set_vim_var_nr( \
VV_HLSEARCH, !no_hlsearch && p_hls)
@@ -315,5 +306,19 @@ enum {
#define DIP_START 0x08 // also use "start" directory in 'packpath'
#define DIP_OPT 0x10 // also use "opt" directory in 'packpath'
#define DIP_NORTP 0x20 // do not use 'runtimepath'
+#define DIP_NOAFTER 0x40 // skip "after" directories
+#define DIP_AFTER 0x80 // only use "after" directories
+
+// Lowest number used for window ID. Cannot have this many windows per tab.
+#define LOWEST_WIN_ID 1000
+
+// BSD is supposed to cover FreeBSD and similar systems.
+#if (defined(BSD) || defined(__FreeBSD_kernel__)) && defined(S_ISCHR)
+# define OPEN_CHR_FILES
+#endif
+
+// Replacement for nchar used by nv_replace().
+#define REPLACE_CR_NCHAR -1
+#define REPLACE_NL_NCHAR -2
-#endif /* NVIM_VIM_H */
+#endif // NVIM_VIM_H
diff --git a/src/nvim/viml/parser/expressions.c b/src/nvim/viml/parser/expressions.c
new file mode 100644
index 0000000000..dcc64db8a0
--- /dev/null
+++ b/src/nvim/viml/parser/expressions.c
@@ -0,0 +1,3095 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+/// VimL expression parser
+
+// Planned incompatibilities (to be included into vim_diff.txt when this parser
+// will be an actual part of VimL evaluation process):
+//
+// 1. Expressions are first fully parsed and only then executed. This means
+// that while ":echo [system('touch abc')" will create file "abc" in Vim and
+// only then raise syntax error regarding missing comma in list in Neovim
+// trying to execute that will immediately raise syntax error regarding
+// missing list end without actually executing anything.
+// 2. Expressions are first fully parsed, without considering any runtime
+// information. This means things like that "d.a" does not change its
+// meaning depending on type of "d" (or whether Vim is currently executing or
+// skipping). For compatibility reasons the dot thus may either be โ€œconcat
+// or subscriptโ€ operator or just โ€œconcatโ€ operator.
+// 3. Expressions parser is aware whether it is called for :echo or <C-r>=.
+// This means that while "<C-r>=1 | 2<CR>" is equivalent to "<C-r>=1<CR>"
+// because "| 2" part is left to be treated as a command separator and then
+// ignored in Neovim it is an error.
+// 4. Expressions parser has generally better error reporting. But for
+// compatibility reasons most errors have error code E15 while error messages
+// are significantly different from Vimโ€™s E15. Also some error codes were
+// retired because of being harder to emulate or because of them being
+// a result of differences in parsing process: e.g. with ":echo {a, b}" Vim
+// will attempt to parse expression as lambda, fail, check whether it is
+// a curly-braces-name, fail again, and evaluate that as a dictionary, giving
+// error regarding undefined variable "a" (or about missing colon). Neovim
+// will not try to evaluate anything here: comma right after an argument name
+// means that expression may not be anything, but lambda, so the resulting
+// error message will never be about missing variable or colon: it will be
+// about missing arrow (or a continuation of argument list).
+// 5. Failing to parse expression always gives exactly one error message: no
+// more stack of error messages like >
+//
+// :echo [1,
+// E697: Missing end of List ']':
+// E15: Invalid expression: [1,
+//
+// < , just exactly one E697 message.
+// 6. Some expressions involving calling parenthesis which are treated
+// separately by Vim even when not separated by spaces are treated as one
+// expression by Neovim: e.g. ":echo (1)(1)" will yield runtime error after
+// failing to call "1", while Vim will echo "1 1". Reasoning is the same:
+// type of what is in the first expression is generally not known when
+// parsing, so to have separate expressions like this separate them with
+// spaces.
+// 7. 'isident' no longer applies to environment variables, they always include
+// ASCII alphanumeric characters and underscore and nothing except this.
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <assert.h>
+#include <string.h>
+
+#include "nvim/vim.h"
+#include "nvim/memory.h"
+#include "nvim/types.h"
+#include "nvim/charset.h"
+#include "nvim/ascii.h"
+#include "nvim/assert.h"
+#include "nvim/lib/kvec.h"
+#include "nvim/eval/typval.h"
+
+#include "nvim/viml/parser/expressions.h"
+#include "nvim/viml/parser/parser.h"
+
+#define vim_str2nr(s, ...) vim_str2nr((const char_u *)(s), __VA_ARGS__)
+
+typedef kvec_withinit_t(ExprASTNode **, 16) ExprASTStack;
+
+/// Which nodes may be wanted
+typedef enum {
+ /// Operators: function call, subscripts, binary operators, โ€ฆ
+ ///
+ /// For unrestricted expressions.
+ kENodeOperator,
+ /// Values: literals, variables, nested expressions, unary operators.
+ ///
+ /// For unrestricted expressions as well, implies that top item in AST stack
+ /// points to NULL.
+ kENodeValue,
+} ExprASTWantedNode;
+
+/// Parse type: what is being parsed currently
+typedef enum {
+ /// Parsing regular VimL expression
+ kEPTExpr = 0,
+ /// Parsing lambda arguments
+ ///
+ /// Just like parsing function arguments, but it is valid to be ended with an
+ /// arrow only.
+ kEPTLambdaArguments,
+ /// Assignment: parsing for :let
+ kEPTAssignment,
+ /// Single assignment: used when lists are not allowed (i.e. when nesting)
+ kEPTSingleAssignment,
+} ExprASTParseType;
+
+typedef kvec_withinit_t(ExprASTParseType, 4) ExprASTParseTypeStack;
+
+/// Operator priority level
+typedef enum {
+ kEOpLvlInvalid = 0,
+ kEOpLvlComplexIdentifier,
+ kEOpLvlParens,
+ kEOpLvlAssignment,
+ kEOpLvlArrow,
+ kEOpLvlComma,
+ kEOpLvlColon,
+ kEOpLvlTernaryValue,
+ kEOpLvlTernary,
+ kEOpLvlOr,
+ kEOpLvlAnd,
+ kEOpLvlComparison,
+ kEOpLvlAddition, ///< Addition, subtraction and concatenation.
+ kEOpLvlMultiplication, ///< Multiplication, division and modulo.
+ kEOpLvlUnary, ///< Unary operations: not, minus, plus.
+ kEOpLvlSubscript, ///< Subscripts.
+ kEOpLvlValue, ///< Values: literals, variables, nested expressions, โ€ฆ
+} ExprOpLvl;
+
+/// Operator associativity
+typedef enum {
+ kEOpAssNo= 'n', ///< Not associative / not applicable.
+ kEOpAssLeft = 'l', ///< Left associativity.
+ kEOpAssRight = 'r', ///< Right associativity.
+} ExprOpAssociativity;
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "viml/parser/expressions.c.generated.h"
+#endif
+
+/// Character used as a separator in autoload function/variable names.
+#define AUTOLOAD_CHAR '#'
+
+/// Scale number by a given factor
+///
+/// Used to apply exponent to a number. Idea taken from uClibc.
+///
+/// @param[in] num Number to scale. Does not bother doing anything if it is
+/// zero.
+/// @param[in] base Base, should be 10 since non-decimal floating-point
+/// numbers are not supported.
+/// @param[in] exponent Exponent to scale by.
+/// @param[in] exponent_negative True if exponent is negative.
+static inline float_T scale_number(const float_T num,
+ const uint8_t base,
+ const uvarnumber_T exponent,
+ const bool exponent_negative)
+ FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_CONST
+{
+ if (num == 0 || exponent == 0) {
+ return num;
+ }
+ assert(base);
+ uvarnumber_T exp = exponent;
+ float_T p_base = (float_T)base;
+ float_T ret = num;
+ while (exp) {
+ if (exp & 1) {
+ if (exponent_negative) {
+ ret /= p_base;
+ } else {
+ ret *= p_base;
+ }
+ }
+ exp >>= 1;
+ p_base *= p_base;
+ }
+ return ret;
+}
+
+/// Get next token for the VimL expression input
+///
+/// @param pstate Parser state.
+/// @param[in] flags Flags, @see LexExprFlags.
+///
+/// @return Next token.
+LexExprToken viml_pexpr_next_token(ParserState *const pstate, const int flags)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
+{
+ LexExprToken ret = {
+ .type = kExprLexInvalid,
+ .start = pstate->pos,
+ };
+ ParserLine pline;
+ if (!viml_parser_get_remaining_line(pstate, &pline)) {
+ ret.type = kExprLexEOC;
+ return ret;
+ }
+ if (pline.size <= 0) {
+ ret.len = 0;
+ ret.type = kExprLexEOC;
+ goto viml_pexpr_next_token_adv_return;
+ }
+ ret.len = 1;
+ const uint8_t schar = (uint8_t)pline.data[0];
+#define GET_CCS(ret, pline) \
+ do { \
+ if (ret.len < pline.size \
+ && strchr("?#", pline.data[ret.len]) != NULL) { \
+ ret.data.cmp.ccs = \
+ (ExprCaseCompareStrategy)pline.data[ret.len]; \
+ ret.len++; \
+ } else { \
+ ret.data.cmp.ccs = kCCStrategyUseOption; \
+ } \
+ } while (0)
+ switch (schar) {
+ // Paired brackets.
+#define BRACKET(typ, opning, clsing) \
+ case opning: \
+ case clsing: { \
+ ret.type = typ; \
+ ret.data.brc.closing = (schar == clsing); \
+ break; \
+ }
+ BRACKET(kExprLexParenthesis, '(', ')')
+ BRACKET(kExprLexBracket, '[', ']')
+ BRACKET(kExprLexFigureBrace, '{', '}')
+#undef BRACKET
+
+ // Single character tokens without data.
+#define CHAR(typ, ch) \
+ case ch: { \
+ ret.type = typ; \
+ break; \
+ }
+ CHAR(kExprLexQuestion, '?')
+ CHAR(kExprLexColon, ':')
+ CHAR(kExprLexComma, ',')
+#undef CHAR
+
+ // Multiplication/division/modulo.
+#define MUL(mul_type, ch) \
+ case ch: { \
+ ret.type = kExprLexMultiplication; \
+ ret.data.mul.type = mul_type; \
+ break; \
+ }
+ MUL(kExprLexMulMul, '*')
+ MUL(kExprLexMulDiv, '/')
+ MUL(kExprLexMulMod, '%')
+#undef MUL
+
+#define CHARREG(typ, cond) \
+ do { \
+ ret.type = typ; \
+ for (; (ret.len < pline.size \
+ && cond(pline.data[ret.len])) \
+ ; ret.len++) { \
+ } \
+ } while (0)
+
+ // Whitespace.
+ case ' ':
+ case TAB: {
+ CHARREG(kExprLexSpacing, ascii_iswhite);
+ break;
+ }
+
+ // Control character, except for NUL, NL and TAB.
+ case Ctrl_A: case Ctrl_B: case Ctrl_C: case Ctrl_D: case Ctrl_E:
+ case Ctrl_F: case Ctrl_G: case Ctrl_H:
+
+ case Ctrl_K: case Ctrl_L: case Ctrl_M: case Ctrl_N: case Ctrl_O:
+ case Ctrl_P: case Ctrl_Q: case Ctrl_R: case Ctrl_S: case Ctrl_T:
+ case Ctrl_U: case Ctrl_V: case Ctrl_W: case Ctrl_X: case Ctrl_Y:
+ case Ctrl_Z: {
+#define ISCTRL(schar) (schar < ' ')
+ CHARREG(kExprLexInvalid, ISCTRL);
+ ret.data.err.type = kExprLexSpacing;
+ ret.data.err.msg =
+ _("E15: Invalid control character present in input: %.*s");
+ break;
+#undef ISCTRL
+ }
+
+ // Number.
+ case '0': case '1': case '2': case '3': case '4': case '5': case '6':
+ case '7': case '8': case '9': {
+ ret.data.num.is_float = false;
+ ret.data.num.base = 10;
+ size_t frac_start = 0;
+ size_t exp_start = 0;
+ size_t frac_end = 0;
+ bool exp_negative = false;
+ CHARREG(kExprLexNumber, ascii_isdigit);
+ if (flags & kELFlagAllowFloat) {
+ const LexExprToken non_float_ret = ret;
+ if (pline.size > ret.len + 1
+ && pline.data[ret.len] == '.'
+ && ascii_isdigit(pline.data[ret.len + 1])) {
+ ret.len++;
+ frac_start = ret.len;
+ frac_end = ret.len;
+ ret.data.num.is_float = true;
+ for (; ret.len < pline.size && ascii_isdigit(pline.data[ret.len])
+ ; ret.len++) {
+ // A small optimization: trailing zeroes in fractional part do not
+ // add anything to significand, so it is useless to include them in
+ // frac_end.
+ if (pline.data[ret.len] != '0') {
+ frac_end = ret.len + 1;
+ }
+ }
+ if (pline.size > ret.len + 1
+ && (pline.data[ret.len] == 'e'
+ || pline.data[ret.len] == 'E')
+ && ((pline.size > ret.len + 2
+ && (pline.data[ret.len + 1] == '+'
+ || pline.data[ret.len + 1] == '-')
+ && ascii_isdigit(pline.data[ret.len + 2]))
+ || ascii_isdigit(pline.data[ret.len + 1]))) {
+ ret.len++;
+ if (pline.data[ret.len] == '+'
+ || (exp_negative = (pline.data[ret.len] == '-'))) {
+ ret.len++;
+ }
+ exp_start = ret.len;
+ CHARREG(kExprLexNumber, ascii_isdigit);
+ }
+ }
+ if (pline.size > ret.len
+ && (pline.data[ret.len] == '.'
+ || ASCII_ISALPHA(pline.data[ret.len]))) {
+ ret = non_float_ret;
+ }
+ }
+ // TODO(ZyX-I): detect overflows
+ if (ret.data.num.is_float) {
+ // Vim used to use string2float here which in turn uses strtod(). There
+ // are two problems with this approach:
+ // 1. strtod() is locale-dependent. Not sure how it is worked around so
+ // that I do not see relevant bugs, but it still does not look like
+ // a good idea.
+ // 2. strtod() does not accept length argument.
+ //
+ // The below variant of parsing floats was recognized as acceptable
+ // because it is basically how uClibc does the thing: it generates
+ // a number ignoring decimal point (but recording its position), then
+ // uses recorded position to scale number down when processing exponent.
+ float_T significand_part = 0;
+ uvarnumber_T exp_part = 0;
+ const size_t frac_size = (size_t)(frac_end - frac_start);
+ for (size_t i = 0; i < frac_end; i++) {
+ if (i == frac_start - 1) {
+ continue;
+ }
+ significand_part = significand_part * 10 + (pline.data[i] - '0');
+ }
+ if (exp_start) {
+ vim_str2nr(pline.data + exp_start, NULL, NULL, 0, NULL, &exp_part,
+ (int)(ret.len - exp_start));
+ }
+ if (exp_negative) {
+ exp_part += frac_size;
+ } else {
+ if (exp_part < frac_size) {
+ exp_negative = true;
+ exp_part = frac_size - exp_part;
+ } else {
+ exp_part -= frac_size;
+ }
+ }
+ ret.data.num.val.floating = scale_number(significand_part, 10, exp_part,
+ exp_negative);
+ } else {
+ int len;
+ int prep;
+ vim_str2nr(pline.data, &prep, &len, STR2NR_ALL, NULL,
+ &ret.data.num.val.integer, (int)pline.size);
+ ret.len = (size_t)len;
+ const uint8_t bases[] = {
+ [0] = 10,
+ ['0'] = 8,
+ ['x'] = 16, ['X'] = 16,
+ ['b'] = 2, ['B'] = 2,
+ };
+ ret.data.num.base = bases[prep];
+ }
+ break;
+ }
+
+#define ISWORD_OR_AUTOLOAD(x) \
+ (ascii_isident(x) || (x) == AUTOLOAD_CHAR)
+
+ // Environment variable.
+ case '$': {
+ CHARREG(kExprLexEnv, ascii_isident);
+ break;
+ }
+
+ // Normal variable/function name.
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
+ case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n':
+ case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u':
+ case 'v': case 'w': case 'x': case 'y': case 'z':
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G':
+ case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N':
+ case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U':
+ case 'V': case 'W': case 'X': case 'Y': case 'Z':
+ case '_': {
+ ret.data.var.scope = 0;
+ ret.data.var.autoload = false;
+ CHARREG(kExprLexPlainIdentifier, ascii_isident);
+ // "is" and "isnot" operators.
+ if (!(flags & kELFlagIsNotCmp)
+ && ((ret.len == 2 && memcmp(pline.data, "is", 2) == 0)
+ || (ret.len == 5 && memcmp(pline.data, "isnot", 5) == 0))) {
+ ret.type = kExprLexComparison;
+ ret.data.cmp.type = kExprCmpIdentical;
+ ret.data.cmp.inv = (ret.len == 5);
+ GET_CCS(ret, pline);
+ // Scope: `s:`, etc.
+ } else if (ret.len == 1
+ && pline.size > 1
+ && memchr(EXPR_VAR_SCOPE_LIST, schar,
+ sizeof(EXPR_VAR_SCOPE_LIST)) != NULL
+ && pline.data[ret.len] == ':'
+ && !(flags & kELFlagForbidScope)) {
+ ret.len++;
+ ret.data.var.scope = (ExprVarScope)schar;
+ CHARREG(kExprLexPlainIdentifier, ISWORD_OR_AUTOLOAD);
+ ret.data.var.autoload = (
+ memchr(pline.data + 2, AUTOLOAD_CHAR, ret.len - 2)
+ != NULL);
+ // Previous CHARREG stopped at autoload character in order to make it
+ // possible to detect `is#`. Continue now with autoload characters
+ // included.
+ //
+ // Warning: there is ambiguity for the lexer: `is#Foo(1)` is a call of
+ // function `is#Foo()`, `1is#Foo(1)` is a comparison `1 is# Foo(1)`. This
+ // needs to be resolved on the higher level where context is available.
+ } else if (pline.size > ret.len
+ && pline.data[ret.len] == AUTOLOAD_CHAR) {
+ ret.data.var.autoload = true;
+ CHARREG(kExprLexPlainIdentifier, ISWORD_OR_AUTOLOAD);
+ }
+ break;
+ }
+
+#undef ISWORD_OR_AUTOLOAD
+#undef CHARREG
+
+ // Option.
+ case '&': {
+#define OPTNAMEMISS(ret) \
+ do { \
+ ret.type = kExprLexInvalid; \
+ ret.data.err.type = kExprLexOption; \
+ ret.data.err.msg = _("E112: Option name missing: %.*s"); \
+ } while (0)
+ if (pline.size > 1 && pline.data[1] == '&') {
+ ret.type = kExprLexAnd;
+ ret.len++;
+ break;
+ }
+ if (pline.size == 1 || !ASCII_ISALPHA(pline.data[1])) {
+ OPTNAMEMISS(ret);
+ break;
+ }
+ ret.type = kExprLexOption;
+ if (pline.size > 2
+ && pline.data[2] == ':'
+ && memchr(EXPR_OPT_SCOPE_LIST, pline.data[1],
+ sizeof(EXPR_OPT_SCOPE_LIST)) != NULL) {
+ ret.len += 2;
+ ret.data.opt.scope = (ExprOptScope)pline.data[1];
+ ret.data.opt.name = pline.data + 3;
+ } else {
+ ret.data.opt.scope = kExprOptScopeUnspecified;
+ ret.data.opt.name = pline.data + 1;
+ }
+ const char *p = ret.data.opt.name;
+ const char *const e = pline.data + pline.size;
+ if (e - p >= 4 && p[0] == 't' && p[1] == '_') {
+ ret.data.opt.len = 4;
+ ret.len += 4;
+ } else {
+ for (; p < e && ASCII_ISALPHA(*p); p++) {
+ }
+ ret.data.opt.len = (size_t)(p - ret.data.opt.name);
+ if (ret.data.opt.len == 0) {
+ OPTNAMEMISS(ret);
+ } else {
+ ret.len += ret.data.opt.len;
+ }
+ }
+ break;
+#undef OPTNAMEMISS
+ }
+
+ // Register.
+ case '@': {
+ ret.type = kExprLexRegister;
+ if (pline.size > 1) {
+ ret.len++;
+ ret.data.reg.name = (uint8_t)pline.data[1];
+ } else {
+ ret.data.reg.name = -1;
+ }
+ break;
+ }
+
+ // Single quoted string.
+ case '\'': {
+ ret.type = kExprLexSingleQuotedString;
+ ret.data.str.closed = false;
+ for (; ret.len < pline.size && !ret.data.str.closed; ret.len++) {
+ if (pline.data[ret.len] == '\'') {
+ if (ret.len + 1 < pline.size && pline.data[ret.len + 1] == '\'') {
+ ret.len++;
+ } else {
+ ret.data.str.closed = true;
+ }
+ }
+ }
+ break;
+ }
+
+ // Double quoted string.
+ case '"': {
+ ret.type = kExprLexDoubleQuotedString;
+ ret.data.str.closed = false;
+ for (; ret.len < pline.size && !ret.data.str.closed; ret.len++) {
+ if (pline.data[ret.len] == '\\') {
+ if (ret.len + 1 < pline.size) {
+ ret.len++;
+ }
+ } else if (pline.data[ret.len] == '"') {
+ ret.data.str.closed = true;
+ }
+ }
+ break;
+ }
+
+ // Unary not, (un)equality and regex (not) match comparison operators.
+ case '!':
+ case '=': {
+ if (pline.size == 1) {
+ ret.type = (schar == '!' ? kExprLexNot : kExprLexAssignment);
+ ret.data.ass.type = kExprAsgnPlain;
+ break;
+ }
+ ret.type = kExprLexComparison;
+ ret.data.cmp.inv = (schar == '!');
+ if (pline.data[1] == '=') {
+ ret.data.cmp.type = kExprCmpEqual;
+ ret.len++;
+ } else if (pline.data[1] == '~') {
+ ret.data.cmp.type = kExprCmpMatches;
+ ret.len++;
+ } else if (schar == '!') {
+ ret.type = kExprLexNot;
+ } else {
+ ret.type = kExprLexAssignment;
+ ret.data.ass.type = kExprAsgnPlain;
+ }
+ GET_CCS(ret, pline);
+ break;
+ }
+
+ // Less/greater [or equal to] comparison operators.
+ case '>':
+ case '<': {
+ ret.type = kExprLexComparison;
+ const bool haseqsign = (pline.size > 1 && pline.data[1] == '=');
+ if (haseqsign) {
+ ret.len++;
+ }
+ GET_CCS(ret, pline);
+ ret.data.cmp.inv = (schar == '<');
+ ret.data.cmp.type = ((ret.data.cmp.inv ^ haseqsign)
+ ? kExprCmpGreaterOrEqual
+ : kExprCmpGreater);
+ break;
+ }
+
+ // Minus sign, arrow from lambdas or augmented assignment.
+ case '-': {
+ if (pline.size > 1 && pline.data[1] == '>') {
+ ret.len++;
+ ret.type = kExprLexArrow;
+ } else if (pline.size > 1 && pline.data[1] == '=') {
+ ret.len++;
+ ret.type = kExprLexAssignment;
+ ret.data.ass.type = kExprAsgnSubtract;
+ } else {
+ ret.type = kExprLexMinus;
+ }
+ break;
+ }
+
+ // Sign or augmented assignment.
+#define CHAR_OR_ASSIGN(ch, ch_type, ass_type) \
+ case ch: { \
+ if (pline.size > 1 && pline.data[1] == '=') { \
+ ret.len++; \
+ ret.type = kExprLexAssignment; \
+ ret.data.ass.type = ass_type; \
+ } else { \
+ ret.type = ch_type; \
+ } \
+ break; \
+ }
+ CHAR_OR_ASSIGN('+', kExprLexPlus, kExprAsgnAdd)
+ CHAR_OR_ASSIGN('.', kExprLexDot, kExprAsgnConcat)
+#undef CHAR_OR_ASSIGN
+
+ // Expression end because Ex command ended.
+ case NUL:
+ case NL: {
+ if (flags & kELFlagForbidEOC) {
+ ret.type = kExprLexInvalid;
+ ret.data.err.msg = _("E15: Unexpected EOC character: %.*s");
+ ret.data.err.type = kExprLexSpacing;
+ } else {
+ ret.type = kExprLexEOC;
+ }
+ break;
+ }
+
+ case '|': {
+ if (pline.size >= 2 && pline.data[ret.len] == '|') {
+ // "||" is or.
+ ret.len++;
+ ret.type = kExprLexOr;
+ } else if (flags & kELFlagForbidEOC) {
+ // Note: `<C-r>=1 | 2<CR>` actually yields 1 in Vim without any
+ // errors. This will be changed here.
+ ret.type = kExprLexInvalid;
+ ret.data.err.msg = _("E15: Unexpected EOC character: %.*s");
+ ret.data.err.type = kExprLexOr;
+ } else {
+ ret.type = kExprLexEOC;
+ }
+ break;
+ }
+
+ // Everything else is not valid.
+ default: {
+ ret.len = (size_t)utfc_ptr2len_len((const char_u *)pline.data,
+ (int)pline.size);
+ ret.type = kExprLexInvalid;
+ ret.data.err.type = kExprLexPlainIdentifier;
+ ret.data.err.msg = _("E15: Unidentified character: %.*s");
+ break;
+ }
+ }
+#undef GET_CCS
+viml_pexpr_next_token_adv_return:
+ if (!(flags & kELFlagPeek)) {
+ viml_parser_advance(pstate, ret.len);
+ }
+ return ret;
+}
+
+static const char *const eltkn_type_tab[] = {
+ [kExprLexInvalid] = "Invalid",
+ [kExprLexMissing] = "Missing",
+ [kExprLexSpacing] = "Spacing",
+ [kExprLexEOC] = "EOC",
+
+ [kExprLexQuestion] = "Question",
+ [kExprLexColon] = "Colon",
+ [kExprLexOr] = "Or",
+ [kExprLexAnd] = "And",
+ [kExprLexComparison] = "Comparison",
+ [kExprLexPlus] = "Plus",
+ [kExprLexMinus] = "Minus",
+ [kExprLexDot] = "Dot",
+ [kExprLexMultiplication] = "Multiplication",
+
+ [kExprLexNot] = "Not",
+
+ [kExprLexNumber] = "Number",
+ [kExprLexSingleQuotedString] = "SingleQuotedString",
+ [kExprLexDoubleQuotedString] = "DoubleQuotedString",
+ [kExprLexOption] = "Option",
+ [kExprLexRegister] = "Register",
+ [kExprLexEnv] = "Env",
+ [kExprLexPlainIdentifier] = "PlainIdentifier",
+
+ [kExprLexBracket] = "Bracket",
+ [kExprLexFigureBrace] = "FigureBrace",
+ [kExprLexParenthesis] = "Parenthesis",
+ [kExprLexComma] = "Comma",
+ [kExprLexArrow] = "Arrow",
+ [kExprLexAssignment] = "Assignment",
+};
+
+const char *const eltkn_cmp_type_tab[] = {
+ [kExprCmpEqual] = "Equal",
+ [kExprCmpMatches] = "Matches",
+ [kExprCmpGreater] = "Greater",
+ [kExprCmpGreaterOrEqual] = "GreaterOrEqual",
+ [kExprCmpIdentical] = "Identical",
+};
+
+const char *const expr_asgn_type_tab[] = {
+ [kExprAsgnPlain] = "Plain",
+ [kExprAsgnAdd] = "Add",
+ [kExprAsgnSubtract] = "Subtract",
+ [kExprAsgnConcat] = "Concat",
+};
+
+const char *const ccs_tab[] = {
+ [kCCStrategyUseOption] = "UseOption",
+ [kCCStrategyMatchCase] = "MatchCase",
+ [kCCStrategyIgnoreCase] = "IgnoreCase",
+};
+
+static const char *const eltkn_mul_type_tab[] = {
+ [kExprLexMulMul] = "Mul",
+ [kExprLexMulDiv] = "Div",
+ [kExprLexMulMod] = "Mod",
+};
+
+static const char *const eltkn_opt_scope_tab[] = {
+ [kExprOptScopeUnspecified] = "Unspecified",
+ [kExprOptScopeGlobal] = "Global",
+ [kExprOptScopeLocal] = "Local",
+};
+
+/// Represent token as a string
+///
+/// Intended for testing and debugging purposes.
+///
+/// @param[in] pstate Parser state, needed to get token string from it. May be
+/// NULL, in which case in place of obtaining part of the
+/// string represented by token only token length is
+/// returned.
+/// @param[in] token Token to represent.
+/// @param[out] ret_size Return string size, for cases like NULs inside
+/// a string. May be NULL.
+///
+/// @return Token represented in a string form, in a static buffer (overwritten
+/// on each call).
+const char *viml_pexpr_repr_token(const ParserState *const pstate,
+ const LexExprToken token,
+ size_t *const ret_size)
+ FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ static char ret[1024];
+ char *p = ret;
+ const char *const e = &ret[1024] - 1;
+#define ADDSTR(...) \
+ do { \
+ p += snprintf(p, (size_t)(sizeof(ret) - (size_t)(p - ret)), __VA_ARGS__); \
+ if (p >= e) { \
+ goto viml_pexpr_repr_token_end; \
+ } \
+ } while (0)
+ ADDSTR("%zu:%zu:%s", token.start.line, token.start.col,
+ eltkn_type_tab[token.type]);
+ switch (token.type) {
+#define TKNARGS(tkn_type, ...) \
+ case tkn_type: { \
+ ADDSTR(__VA_ARGS__); \
+ break; \
+ }
+ TKNARGS(kExprLexComparison, "(type=%s,ccs=%s,inv=%i)",
+ eltkn_cmp_type_tab[token.data.cmp.type],
+ ccs_tab[token.data.cmp.ccs],
+ (int)token.data.cmp.inv)
+ TKNARGS(kExprLexMultiplication, "(type=%s)",
+ eltkn_mul_type_tab[token.data.mul.type])
+ TKNARGS(kExprLexAssignment, "(type=%s)",
+ expr_asgn_type_tab[token.data.ass.type])
+ TKNARGS(kExprLexRegister, "(name=%s)", intchar2str(token.data.reg.name))
+ case kExprLexDoubleQuotedString:
+ TKNARGS(kExprLexSingleQuotedString, "(closed=%i)",
+ (int)token.data.str.closed)
+ TKNARGS(kExprLexOption, "(scope=%s,name=%.*s)",
+ eltkn_opt_scope_tab[token.data.opt.scope],
+ (int)token.data.opt.len, token.data.opt.name)
+ TKNARGS(kExprLexPlainIdentifier, "(scope=%s,autoload=%i)",
+ intchar2str((int)token.data.var.scope),
+ (int)token.data.var.autoload)
+ TKNARGS(kExprLexNumber, "(is_float=%i,base=%i,val=%lg)",
+ (int)token.data.num.is_float,
+ (int)token.data.num.base,
+ (double)(token.data.num.is_float
+ ? (double)token.data.num.val.floating
+ : (double)token.data.num.val.integer))
+ TKNARGS(kExprLexInvalid, "(msg=%s)", token.data.err.msg)
+ default: {
+ // No additional arguments.
+ break;
+ }
+#undef TKNARGS
+ }
+ if (pstate == NULL) {
+ ADDSTR("::%zu", token.len);
+ } else {
+ *p++ = ':';
+ memmove(
+ p, &pstate->reader.lines.items[token.start.line].data[token.start.col],
+ token.len);
+ p += token.len;
+ *p = NUL;
+ }
+#undef ADDSTR
+viml_pexpr_repr_token_end:
+ if (ret_size != NULL) {
+ *ret_size = (size_t)(p - ret);
+ }
+ return ret;
+}
+
+const char *const east_node_type_tab[] = {
+ [kExprNodeMissing] = "Missing",
+ [kExprNodeOpMissing] = "OpMissing",
+ [kExprNodeTernary] = "Ternary",
+ [kExprNodeTernaryValue] = "TernaryValue",
+ [kExprNodeRegister] = "Register",
+ [kExprNodeSubscript] = "Subscript",
+ [kExprNodeListLiteral] = "ListLiteral",
+ [kExprNodeUnaryPlus] = "UnaryPlus",
+ [kExprNodeBinaryPlus] = "BinaryPlus",
+ [kExprNodeNested] = "Nested",
+ [kExprNodeCall] = "Call",
+ [kExprNodePlainIdentifier] = "PlainIdentifier",
+ [kExprNodePlainKey] = "PlainKey",
+ [kExprNodeComplexIdentifier] = "ComplexIdentifier",
+ [kExprNodeUnknownFigure] = "UnknownFigure",
+ [kExprNodeLambda] = "Lambda",
+ [kExprNodeDictLiteral] = "DictLiteral",
+ [kExprNodeCurlyBracesIdentifier] = "CurlyBracesIdentifier",
+ [kExprNodeComma] = "Comma",
+ [kExprNodeColon] = "Colon",
+ [kExprNodeArrow] = "Arrow",
+ [kExprNodeComparison] = "Comparison",
+ [kExprNodeConcat] = "Concat",
+ [kExprNodeConcatOrSubscript] = "ConcatOrSubscript",
+ [kExprNodeInteger] = "Integer",
+ [kExprNodeFloat] = "Float",
+ [kExprNodeSingleQuotedString] = "SingleQuotedString",
+ [kExprNodeDoubleQuotedString] = "DoubleQuotedString",
+ [kExprNodeOr] = "Or",
+ [kExprNodeAnd] = "And",
+ [kExprNodeUnaryMinus] = "UnaryMinus",
+ [kExprNodeBinaryMinus] = "BinaryMinus",
+ [kExprNodeNot] = "Not",
+ [kExprNodeMultiplication] = "Multiplication",
+ [kExprNodeDivision] = "Division",
+ [kExprNodeMod] = "Mod",
+ [kExprNodeOption] = "Option",
+ [kExprNodeEnvironment] = "Environment",
+ [kExprNodeAssignment] = "Assignment",
+};
+
+/// Represent `int` character as a string
+///
+/// Converts
+/// - ASCII digits into '{digit}'
+/// - ASCII printable characters into a single-character strings
+/// - everything else to numbers.
+///
+/// @param[in] ch Character to convert.
+///
+/// @return Converted string, stored in a static buffer (overriden after each
+/// call).
+static const char *intchar2str(const int ch)
+ FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ static char buf[sizeof(int) * 3 + 1];
+ if (' ' <= ch && ch < 0x7f) {
+ if (ascii_isdigit(ch)) {
+ buf[0] = '\'';
+ buf[1] = (char)ch;
+ buf[2] = '\'';
+ buf[3] = NUL;
+ } else {
+ buf[0] = (char)ch;
+ buf[1] = NUL;
+ }
+ } else {
+ snprintf(buf, sizeof(buf), "%i", ch);
+ }
+ return buf;
+}
+
+#ifdef UNIT_TESTING
+#include <stdio.h>
+
+REAL_FATTR_UNUSED
+static inline void viml_pexpr_debug_print_ast_node(
+ const ExprASTNode *const *const eastnode_p,
+ const char *const prefix)
+{
+ if (*eastnode_p == NULL) {
+ fprintf(stderr, "%s %p : NULL\n", prefix, (void *)eastnode_p);
+ } else {
+ fprintf(stderr, "%s %p : %p : %s : %zu:%zu:%zu\n",
+ prefix, (void *)eastnode_p, (void *)(*eastnode_p),
+ east_node_type_tab[(*eastnode_p)->type], (*eastnode_p)->start.line,
+ (*eastnode_p)->start.col, (*eastnode_p)->len);
+ }
+}
+
+REAL_FATTR_UNUSED
+static inline void viml_pexpr_debug_print_ast_stack(
+ const ExprASTStack *const ast_stack,
+ const char *const msg)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_ALWAYS_INLINE
+{
+ fprintf(stderr, "\n%sstack: %zu:\n", msg, kv_size(*ast_stack));
+ for (size_t i = 0; i < kv_size(*ast_stack); i++) {
+ viml_pexpr_debug_print_ast_node(
+ (const ExprASTNode *const *)kv_A(*ast_stack, i),
+ "-");
+ }
+}
+
+REAL_FATTR_UNUSED
+static inline void viml_pexpr_debug_print_token(
+ const ParserState *const pstate, const LexExprToken token)
+ FUNC_ATTR_ALWAYS_INLINE
+{
+ fprintf(stderr, "\ntkn: %s\n", viml_pexpr_repr_token(pstate, token, NULL));
+}
+#define PSTACK(msg) \
+ viml_pexpr_debug_print_ast_stack(&ast_stack, #msg)
+#define PSTACK_P(msg) \
+ viml_pexpr_debug_print_ast_stack(ast_stack, #msg)
+#define PNODE_P(eastnode_p, msg) \
+ viml_pexpr_debug_print_ast_node((const ExprASTNode *const *)eastnode_p, \
+ (#msg))
+#define PTOKEN(tkn) \
+ viml_pexpr_debug_print_token(pstate, tkn)
+#endif
+
+const uint8_t node_maxchildren[] = {
+ [kExprNodeMissing] = 0,
+ [kExprNodeOpMissing] = 2,
+ [kExprNodeTernary] = 2,
+ [kExprNodeTernaryValue] = 2,
+ [kExprNodeRegister] = 0,
+ [kExprNodeSubscript] = 2,
+ [kExprNodeListLiteral] = 1,
+ [kExprNodeUnaryPlus] = 1,
+ [kExprNodeBinaryPlus] = 2,
+ [kExprNodeNested] = 1,
+ [kExprNodeCall] = 2,
+ [kExprNodePlainIdentifier] = 0,
+ [kExprNodePlainKey] = 0,
+ [kExprNodeComplexIdentifier] = 2,
+ [kExprNodeUnknownFigure] = 1,
+ [kExprNodeLambda] = 2,
+ [kExprNodeDictLiteral] = 1,
+ [kExprNodeCurlyBracesIdentifier] = 1,
+ [kExprNodeComma] = 2,
+ [kExprNodeColon] = 2,
+ [kExprNodeArrow] = 2,
+ [kExprNodeComparison] = 2,
+ [kExprNodeConcat] = 2,
+ [kExprNodeConcatOrSubscript] = 2,
+ [kExprNodeInteger] = 0,
+ [kExprNodeFloat] = 0,
+ [kExprNodeSingleQuotedString] = 0,
+ [kExprNodeDoubleQuotedString] = 0,
+ [kExprNodeOr] = 2,
+ [kExprNodeAnd] = 2,
+ [kExprNodeUnaryMinus] = 1,
+ [kExprNodeBinaryMinus] = 2,
+ [kExprNodeNot] = 1,
+ [kExprNodeMultiplication] = 2,
+ [kExprNodeDivision] = 2,
+ [kExprNodeMod] = 2,
+ [kExprNodeOption] = 0,
+ [kExprNodeEnvironment] = 0,
+ [kExprNodeAssignment] = 2,
+};
+
+/// Free memory occupied by AST
+///
+/// @param ast AST stack to free.
+void viml_pexpr_free_ast(ExprAST ast)
+{
+ ExprASTStack ast_stack;
+ kvi_init(ast_stack);
+ kvi_push(ast_stack, &ast.root);
+ while (kv_size(ast_stack)) {
+ ExprASTNode **const cur_node = kv_last(ast_stack);
+#ifndef NDEBUG
+ // Explicitly check for AST recursiveness.
+ for (size_t i = 0 ; i < kv_size(ast_stack) - 1 ; i++) {
+ assert(*kv_A(ast_stack, i) != *cur_node);
+ }
+#endif
+ if (*cur_node == NULL) {
+ assert(kv_size(ast_stack) == 1);
+ kv_drop(ast_stack, 1);
+ } else if ((*cur_node)->children != NULL) {
+#ifndef NDEBUG
+ const uint8_t maxchildren = node_maxchildren[(*cur_node)->type];
+ assert(maxchildren > 0);
+ assert(maxchildren <= 2);
+ assert(maxchildren == 1
+ ? (*cur_node)->children->next == NULL
+ : ((*cur_node)->children->next == NULL
+ || (*cur_node)->children->next->next == NULL));
+#endif
+ kvi_push(ast_stack, &(*cur_node)->children);
+ } else if ((*cur_node)->next != NULL) {
+ kvi_push(ast_stack, &(*cur_node)->next);
+ } else if (*cur_node != NULL) {
+ kv_drop(ast_stack, 1);
+ switch ((*cur_node)->type) {
+ case kExprNodeDoubleQuotedString:
+ case kExprNodeSingleQuotedString: {
+ xfree((*cur_node)->data.str.value);
+ break;
+ }
+ case kExprNodeMissing:
+ case kExprNodeOpMissing:
+ case kExprNodeTernary:
+ case kExprNodeTernaryValue:
+ case kExprNodeRegister:
+ case kExprNodeSubscript:
+ case kExprNodeListLiteral:
+ case kExprNodeUnaryPlus:
+ case kExprNodeBinaryPlus:
+ case kExprNodeNested:
+ case kExprNodeCall:
+ case kExprNodePlainIdentifier:
+ case kExprNodePlainKey:
+ case kExprNodeComplexIdentifier:
+ case kExprNodeUnknownFigure:
+ case kExprNodeLambda:
+ case kExprNodeDictLiteral:
+ case kExprNodeCurlyBracesIdentifier:
+ case kExprNodeAssignment:
+ case kExprNodeComma:
+ case kExprNodeColon:
+ case kExprNodeArrow:
+ case kExprNodeComparison:
+ case kExprNodeConcat:
+ case kExprNodeConcatOrSubscript:
+ case kExprNodeInteger:
+ case kExprNodeFloat:
+ case kExprNodeOr:
+ case kExprNodeAnd:
+ case kExprNodeUnaryMinus:
+ case kExprNodeBinaryMinus:
+ case kExprNodeNot:
+ case kExprNodeMultiplication:
+ case kExprNodeDivision:
+ case kExprNodeMod:
+ case kExprNodeOption:
+ case kExprNodeEnvironment: {
+ break;
+ }
+ }
+ xfree(*cur_node);
+ *cur_node = NULL;
+ }
+ }
+ kvi_destroy(ast_stack);
+}
+
+// Binary operator precedence and associativity:
+//
+// Operator | Precedence | Associativity
+// ---------+------------+-----------------
+// || | 2 | left
+// && | 3 | left
+// cmp* | 4 | not associative
+// + - . | 5 | left
+// * / % | 6 | left
+//
+// * comparison operators:
+//
+// == ==# ==? != !=# !=?
+// =~ =~# =~? !~ !~# !~?
+// > ># >? <= <=# <=?
+// < <# <? >= >=# >=?
+// is is# is? isnot isnot# isnot?
+
+/// Allocate a new node and set some of the values
+///
+/// @param[in] type Node type to allocate.
+/// @param[in] level Node level to allocate
+static inline ExprASTNode *viml_pexpr_new_node(const ExprASTNodeType type)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_MALLOC
+{
+ ExprASTNode *ret = xmalloc(sizeof(*ret));
+ ret->type = type;
+ ret->children = NULL;
+ ret->next = NULL;
+ return ret;
+}
+
+static struct {
+ ExprOpLvl lvl;
+ ExprOpAssociativity ass;
+} node_type_to_node_props[] = {
+ [kExprNodeMissing] = { kEOpLvlInvalid, kEOpAssNo, },
+ [kExprNodeOpMissing] = { kEOpLvlMultiplication, kEOpAssNo },
+
+ [kExprNodeNested] = { kEOpLvlParens, kEOpAssNo },
+ // Note: below nodes are kEOpLvlSubscript for โ€œbinary operatorโ€ itself, but
+ // kEOpLvlParens when it comes to inside the parenthesis.
+ [kExprNodeCall] = { kEOpLvlParens, kEOpAssNo },
+ [kExprNodeSubscript] = { kEOpLvlParens, kEOpAssNo },
+
+ [kExprNodeUnknownFigure] = { kEOpLvlParens, kEOpAssLeft },
+ [kExprNodeLambda] = { kEOpLvlParens, kEOpAssNo },
+ [kExprNodeDictLiteral] = { kEOpLvlParens, kEOpAssNo },
+ [kExprNodeListLiteral] = { kEOpLvlParens, kEOpAssNo },
+
+ [kExprNodeArrow] = { kEOpLvlArrow, kEOpAssNo },
+
+ // Right associativity for comma because this means easier access to arguments
+ // list, etc: for "[a, b, c, d]" you can access "a" in one step if it is
+ // represented as "list(comma(a, comma(b, comma(c, d))))" then if it is
+ // "list(comma(comma(comma(a, b), c), d))" in which case you will need to
+ // traverse all three comma() structures. And with comma operator (including
+ // actual comma operator from C which is not present in VimL) nobody cares
+ // about associativity, only about order of execution.
+ [kExprNodeComma] = { kEOpLvlComma, kEOpAssRight },
+
+ // Colons are not eligible for chaining, so nobody cares about associativity.
+ [kExprNodeColon] = { kEOpLvlColon, kEOpAssNo },
+
+ [kExprNodeTernary] = { kEOpLvlTernary, kEOpAssRight },
+
+ [kExprNodeOr] = { kEOpLvlOr, kEOpAssLeft },
+
+ [kExprNodeAnd] = { kEOpLvlAnd, kEOpAssLeft },
+
+ [kExprNodeTernaryValue] = { kEOpLvlTernaryValue, kEOpAssRight },
+
+ [kExprNodeComparison] = { kEOpLvlComparison, kEOpAssRight },
+
+ [kExprNodeBinaryPlus] = { kEOpLvlAddition, kEOpAssLeft },
+ [kExprNodeBinaryMinus] = { kEOpLvlAddition, kEOpAssLeft },
+ [kExprNodeConcat] = { kEOpLvlAddition, kEOpAssLeft },
+
+ [kExprNodeMultiplication] = { kEOpLvlMultiplication, kEOpAssLeft },
+ [kExprNodeDivision] = { kEOpLvlMultiplication, kEOpAssLeft },
+ [kExprNodeMod] = { kEOpLvlMultiplication, kEOpAssLeft },
+
+ [kExprNodeUnaryPlus] = { kEOpLvlUnary, kEOpAssNo },
+ [kExprNodeUnaryMinus] = { kEOpLvlUnary, kEOpAssNo },
+ [kExprNodeNot] = { kEOpLvlUnary, kEOpAssNo },
+
+ [kExprNodeConcatOrSubscript] = { kEOpLvlSubscript, kEOpAssLeft },
+
+ [kExprNodeCurlyBracesIdentifier] = { kEOpLvlComplexIdentifier, kEOpAssLeft },
+
+ [kExprNodeAssignment] = { kEOpLvlAssignment, kEOpAssLeft },
+
+ [kExprNodeComplexIdentifier] = { kEOpLvlValue, kEOpAssLeft },
+
+ [kExprNodePlainIdentifier] = { kEOpLvlValue, kEOpAssNo },
+ [kExprNodePlainKey] = { kEOpLvlValue, kEOpAssNo },
+ [kExprNodeRegister] = { kEOpLvlValue, kEOpAssNo },
+ [kExprNodeInteger] = { kEOpLvlValue, kEOpAssNo },
+ [kExprNodeFloat] = { kEOpLvlValue, kEOpAssNo },
+ [kExprNodeDoubleQuotedString] = { kEOpLvlValue, kEOpAssNo },
+ [kExprNodeSingleQuotedString] = { kEOpLvlValue, kEOpAssNo },
+ [kExprNodeOption] = { kEOpLvlValue, kEOpAssNo },
+ [kExprNodeEnvironment] = { kEOpLvlValue, kEOpAssNo },
+};
+
+/// Get AST node priority level
+///
+/// Used primary to reduce line length, so keep the name short.
+///
+/// @param[in] node Node to get priority for.
+///
+/// @return Node priority level.
+static inline ExprOpLvl node_lvl(const ExprASTNode node)
+ FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_CONST FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ return node_type_to_node_props[node.type].lvl;
+}
+
+/// Get AST node associativity, to be used for operator nodes primary
+///
+/// Used primary to reduce line length, so keep the name short.
+///
+/// @param[in] node Node to get priority for.
+///
+/// @return Node associativity.
+static inline ExprOpAssociativity node_ass(const ExprASTNode node)
+ FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_CONST FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ return node_type_to_node_props[node.type].ass;
+}
+
+/// Handle binary operator
+///
+/// This function is responsible for handling priority levels as well.
+///
+/// @param[in] pstate Parser state, used for error reporting.
+/// @param ast_stack AST stack. May be popped of some values and will
+/// definitely receive new ones.
+/// @param bop_node New node to handle.
+/// @param[out] want_node_p New value of want_node.
+/// @param[out] ast_err Location where error is saved, if any.
+///
+/// @return True if no errors occurred, false otherwise.
+static bool viml_pexpr_handle_bop(const ParserState *const pstate,
+ ExprASTStack *const ast_stack,
+ ExprASTNode *const bop_node,
+ ExprASTWantedNode *const want_node_p,
+ ExprASTError *const ast_err)
+ FUNC_ATTR_NONNULL_ALL
+{
+ bool ret = true;
+ ExprASTNode **top_node_p = NULL;
+ ExprASTNode *top_node;
+ ExprOpLvl top_node_lvl;
+ ExprOpAssociativity top_node_ass;
+ assert(kv_size(*ast_stack));
+ const ExprOpLvl bop_node_lvl = ((bop_node->type == kExprNodeCall
+ || bop_node->type == kExprNodeSubscript)
+ ? kEOpLvlSubscript
+ : node_lvl(*bop_node));
+#ifndef NDEBUG
+ const ExprOpAssociativity bop_node_ass = (
+ (bop_node->type == kExprNodeCall
+ || bop_node->type == kExprNodeSubscript)
+ ? kEOpAssLeft
+ : node_ass(*bop_node));
+#endif
+ do {
+ ExprASTNode **new_top_node_p = kv_last(*ast_stack);
+ ExprASTNode *new_top_node = *new_top_node_p;
+ assert(new_top_node != NULL);
+ const ExprOpLvl new_top_node_lvl = node_lvl(*new_top_node);
+ const ExprOpAssociativity new_top_node_ass = node_ass(*new_top_node);
+ assert(bop_node_lvl != new_top_node_lvl
+ || bop_node_ass == new_top_node_ass);
+ if (top_node_p != NULL
+ && ((bop_node_lvl > new_top_node_lvl
+ || (bop_node_lvl == new_top_node_lvl
+ && new_top_node_ass == kEOpAssNo)))) {
+ break;
+ }
+ kv_drop(*ast_stack, 1);
+ top_node_p = new_top_node_p;
+ top_node = new_top_node;
+ top_node_lvl = new_top_node_lvl;
+ top_node_ass = new_top_node_ass;
+ if (bop_node_lvl == top_node_lvl && top_node_ass == kEOpAssRight) {
+ break;
+ }
+ } while (kv_size(*ast_stack));
+ if (top_node_ass == kEOpAssLeft || top_node_lvl != bop_node_lvl) {
+ // outer(op(x,y)) -> outer(new_op(op(x,y),*))
+ //
+ // Before: top_node_p = outer(*), points to op(x,y)
+ // Other stack elements unknown
+ //
+ // After: top_node_p = outer(*), points to new_op(op(x,y))
+ // &bop_node->children->next = new_op(op(x,y),*), points to NULL
+ *top_node_p = bop_node;
+ bop_node->children = top_node;
+ assert(bop_node->children->next == NULL);
+ kvi_push(*ast_stack, top_node_p);
+ kvi_push(*ast_stack, &bop_node->children->next);
+ } else {
+ assert(top_node_lvl == bop_node_lvl && top_node_ass == kEOpAssRight);
+ assert(top_node->children != NULL && top_node->children->next != NULL);
+ // outer(op(x,y)) -> outer(op(x,new_op(y,*)))
+ //
+ // Before: top_node_p = outer(*), points to op(x,y)
+ // Other stack elements unknown
+ //
+ // After: top_node_p = outer(*), points to op(x,new_op(y))
+ // &top_node->children->next = op(x,*), points to new_op(y)
+ // &bop_node->children->next = new_op(y,*), points to NULL
+ bop_node->children = top_node->children->next;
+ top_node->children->next = bop_node;
+ assert(bop_node->children->next == NULL);
+ kvi_push(*ast_stack, top_node_p);
+ kvi_push(*ast_stack, &top_node->children->next);
+ kvi_push(*ast_stack, &bop_node->children->next);
+ // TODO(ZyX-I): Make this not error, but treat like Python does
+ if (bop_node->type == kExprNodeComparison) {
+ east_set_error(pstate, ast_err,
+ _("E15: Operator is not associative: %.*s"),
+ bop_node->start);
+ ret = false;
+ }
+ }
+ *want_node_p = kENodeValue;
+ return ret;
+}
+
+/// ParserPosition literal based on ParserPosition pos with columns shifted
+///
+/// Function does not check whether resulting position is valid.
+///
+/// @param[in] pos Position to shift.
+/// @param[in] shift Number of bytes to shift.
+///
+/// @return Shifted position.
+static inline ParserPosition shifted_pos(const ParserPosition pos,
+ const size_t shift)
+ FUNC_ATTR_CONST FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ return (ParserPosition) { .line = pos.line, .col = pos.col + shift };
+}
+
+/// ParserPosition literal based on ParserPosition pos with specified column
+///
+/// Function does not check whether remaining position is valid.
+///
+/// @param[in] pos Position to adjust.
+/// @param[in] new_col New column.
+///
+/// @return Shifted position.
+static inline ParserPosition recol_pos(const ParserPosition pos,
+ const size_t new_col)
+ FUNC_ATTR_CONST FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ return (ParserPosition) { .line = pos.line, .col = new_col };
+}
+
+/// Get highlight group name
+#define HL(g) (is_invalid ? "NvimInvalid" #g : "Nvim" #g)
+
+/// Highlight current token with the given group
+#define HL_CUR_TOKEN(g) \
+ viml_parser_highlight(pstate, cur_token.start, cur_token.len, \
+ HL(g))
+
+/// Allocate new node, saving some values
+#define NEW_NODE(type) \
+ viml_pexpr_new_node(type)
+
+/// Set position of the given node to position from the given token
+///
+/// @param cur_node Node to modify.
+/// @param cur_token Token to set position from.
+#define POS_FROM_TOKEN(cur_node, cur_token) \
+ do { \
+ (cur_node)->start = cur_token.start; \
+ (cur_node)->len = cur_token.len; \
+ } while (0)
+
+/// Allocate new node and set its position from the current token
+///
+/// If previous token happened to contain spacing then it will be included.
+///
+/// @param cur_node Variable to save allocated node to.
+/// @param typ Node type.
+#define NEW_NODE_WITH_CUR_POS(cur_node, typ) \
+ do { \
+ (cur_node) = NEW_NODE(typ); \
+ POS_FROM_TOKEN((cur_node), cur_token); \
+ if (prev_token.type == kExprLexSpacing) { \
+ (cur_node)->start = prev_token.start; \
+ (cur_node)->len += prev_token.len; \
+ } \
+ } while (0)
+
+/// Check whether it is possible to have next expression after current
+///
+/// For :echo: `:echo @a @a` is a valid expression. `:echo (@a @a)` is not.
+#define MAY_HAVE_NEXT_EXPR \
+ (kv_size(ast_stack) == 1)
+
+/// Add operator node
+///
+/// @param[in] cur_node Node to add.
+#define ADD_OP_NODE(cur_node) \
+ is_invalid |= !viml_pexpr_handle_bop(pstate, &ast_stack, cur_node, \
+ &want_node, &ast.err)
+
+/// Record missing operator: for things like
+///
+/// :echo @a @a
+///
+/// (allowed) or
+///
+/// :echo (@a @a)
+///
+/// (parsed as OpMissing(@a, @a)).
+#define OP_MISSING \
+ do { \
+ if (flags & kExprFlagsMulti && MAY_HAVE_NEXT_EXPR) { \
+ /* Multiple expressions allowed, return without calling */ \
+ /* viml_parser_advance(). */ \
+ goto viml_pexpr_parse_end; \
+ } else { \
+ assert(*top_node_p != NULL); \
+ ERROR_FROM_TOKEN_AND_MSG(cur_token, _("E15: Missing operator: %.*s")); \
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeOpMissing); \
+ cur_node->len = 0; \
+ ADD_OP_NODE(cur_node); \
+ goto viml_pexpr_parse_process_token; \
+ } \
+ } while (0)
+
+/// Record missing value: for things like "* 5"
+///
+/// @param[in] msg Error message.
+#define ADD_VALUE_IF_MISSING(msg) \
+ do { \
+ if (want_node == kENodeValue) { \
+ ERROR_FROM_TOKEN_AND_MSG(cur_token, (msg)); \
+ NEW_NODE_WITH_CUR_POS((*top_node_p), kExprNodeMissing); \
+ (*top_node_p)->len = 0; \
+ want_node = kENodeOperator; \
+ } \
+ } while (0)
+
+/// Set AST error, unless AST already is not correct
+///
+/// @param[out] ret_ast AST to set error in.
+/// @param[in] pstate Parser state, used to get error message argument.
+/// @param[in] msg Error message, assumed to be already translated and
+/// containing a single %token "%.*s".
+/// @param[in] start Position at which error occurred.
+static inline void east_set_error(const ParserState *const pstate,
+ ExprASTError *const ret_ast_err,
+ const char *const msg,
+ const ParserPosition start)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_ALWAYS_INLINE
+{
+ if (ret_ast_err->msg != NULL) {
+ return;
+ }
+ const ParserLine pline = pstate->reader.lines.items[start.line];
+ ret_ast_err->msg = msg;
+ ret_ast_err->arg_len = (int)(pline.size - start.col);
+ ret_ast_err->arg = pline.data + start.col;
+}
+
+/// Set error from the given token and given message
+#define ERROR_FROM_TOKEN_AND_MSG(cur_token, msg) \
+ do { \
+ is_invalid = true; \
+ east_set_error(pstate, &ast.err, msg, cur_token.start); \
+ } while (0)
+
+/// Like #ERROR_FROM_TOKEN_AND_MSG, but gets position from a node
+#define ERROR_FROM_NODE_AND_MSG(node, msg) \
+ do { \
+ is_invalid = true; \
+ east_set_error(pstate, &ast.err, msg, node->start); \
+ } while (0)
+
+/// Set error from the given kExprLexInvalid token
+#define ERROR_FROM_TOKEN(cur_token) \
+ ERROR_FROM_TOKEN_AND_MSG(cur_token, cur_token.data.err.msg)
+
+/// Select figure brace type, altering highlighting as well if needed
+///
+/// @param[out] node Node to modify type.
+/// @param[in] new_type New type, one of ExprASTNodeType values without
+/// kExprNode prefix.
+/// @param[in] hl Corresponding highlighting, passed as an argument to #HL.
+#define SELECT_FIGURE_BRACE_TYPE(node, new_type, hl) \
+ do { \
+ ExprASTNode *const node_ = (node); \
+ assert(node_->type == kExprNodeUnknownFigure \
+ || node_->type == kExprNode##new_type); \
+ node_->type = kExprNode##new_type; \
+ if (pstate->colors) { \
+ kv_A(*pstate->colors, node_->data.fig.opening_hl_idx).group = \
+ HL(hl); \
+ } \
+ } while (0)
+
+/// Add identifier which should constitute complex identifier node
+///
+/// This one is to be called only in case want_node is kENodeOperator.
+///
+/// @param new_ident_node_code Code used to create a new identifier node and
+/// update want_node and ast_stack, without
+/// a trailing semicolon.
+/// @param hl Highlighting name to use, passed as an argument to #HL.
+#define ADD_IDENT(new_ident_node_code, hl) \
+ do { \
+ assert(want_node == kENodeOperator); \
+ /* Operator: may only be curly braces name, but only under certain */ \
+ /* conditions. */ \
+\
+ /* First condition is that there is no space before a part of complex */ \
+ /* identifier. */ \
+ if (prev_token.type == kExprLexSpacing) { \
+ OP_MISSING; \
+ } \
+ switch ((*top_node_p)->type) { \
+ /* Second is that previous node is one of the identifiers: */ \
+ /* complex, plain, curly braces. */ \
+\
+ /* TODO(ZyX-I): Extend syntax to allow ${expr}. This is needed to */ \
+ /* handle environment variables like those bash uses for */ \
+ /* `export -f`: their names consist not only of alphanumeric */ \
+ /* characetrs. */ \
+ case kExprNodeComplexIdentifier: \
+ case kExprNodePlainIdentifier: \
+ case kExprNodeCurlyBracesIdentifier: { \
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeComplexIdentifier); \
+ cur_node->len = 0; \
+ cur_node->children = *top_node_p; \
+ *top_node_p = cur_node; \
+ kvi_push(ast_stack, &cur_node->children->next); \
+ ExprASTNode **const new_top_node_p = kv_last(ast_stack); \
+ assert(*new_top_node_p == NULL); \
+ new_ident_node_code; \
+ *new_top_node_p = cur_node; \
+ HL_CUR_TOKEN(hl); \
+ break; \
+ } \
+ default: { \
+ OP_MISSING; \
+ break; \
+ } \
+ } \
+ } while (0)
+
+/// Determine whether given parse type is an assignment
+///
+/// @param[in] pt Checked parse type.
+///
+/// @return true if parsing an assignment, false otherwise.
+static inline bool pt_is_assignment(const ExprASTParseType pt)
+ FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_CONST FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ return (pt == kEPTAssignment || pt == kEPTSingleAssignment);
+}
+
+/// Structure used to define โ€œstring shiftsโ€ necessary to map string
+/// highlighting to actual strings.
+typedef struct {
+ size_t start; ///< Where special character starts in original string.
+ size_t orig_len; ///< Length of orininal string (e.g. 4 for "\x80").
+ size_t act_len; ///< Length of resulting character(s) (e.g. 1 for "\x80").
+ bool escape_not_known; ///< True if escape sequence in original is not known.
+} StringShift;
+
+/// Parse and highlight single- or double-quoted string
+///
+/// Function is supposed to detect and highlight regular expressions (but does
+/// not do now).
+///
+/// @param[out] pstate Parser state which also contains a place where
+/// highlighting is saved.
+/// @param[out] node Node where string parsing results are saved.
+/// @param[in] token Token to highlight.
+/// @param[in] ast_stack Parser AST stack, used to detect whether current
+/// string is a regex.
+/// @param[in] is_invalid Whether currently processed token is not valid.
+static void parse_quoted_string(ParserState *const pstate,
+ ExprASTNode *const node,
+ const LexExprToken token,
+ const ExprASTStack ast_stack,
+ const bool is_invalid)
+ FUNC_ATTR_NONNULL_ALL
+{
+ const ParserLine pline = pstate->reader.lines.items[token.start.line];
+ const char *const s = pline.data + token.start.col;
+ const char *const e = s + token.len - token.data.str.closed;
+ const char *p = s + 1;
+ const bool is_double = (token.type == kExprLexDoubleQuotedString);
+ size_t size = token.len - token.data.str.closed - 1;
+ kvec_withinit_t(StringShift, 16) shifts;
+ kvi_init(shifts);
+ if (!is_double) {
+ viml_parser_highlight(pstate, token.start, 1, HL(SingleQuote));
+ while (p < e) {
+ const char *const chunk_e = memchr(p, '\'', (size_t)(e - p));
+ if (chunk_e == NULL) {
+ break;
+ }
+ size--;
+ p = chunk_e + 2;
+ if (pstate->colors) {
+ kvi_push(shifts, ((StringShift) {
+ .start = token.start.col + (size_t)(chunk_e - s),
+ .orig_len = 2,
+ .act_len = 1,
+ .escape_not_known = false,
+ }));
+ }
+ }
+ node->data.str.size = size;
+ if (size == 0) {
+ node->data.str.value = NULL;
+ } else {
+ char *v_p;
+ v_p = node->data.str.value = xmallocz(size);
+ p = s + 1;
+ while (p < e) {
+ const char *const chunk_e = memchr(p, '\'', (size_t)(e - p));
+ if (chunk_e == NULL) {
+ memcpy(v_p, p, (size_t)(e - p));
+ break;
+ }
+ memcpy(v_p, p, (size_t)(chunk_e - p));
+ v_p += (size_t)(chunk_e - p) + 1;
+ v_p[-1] = '\'';
+ p = chunk_e + 2;
+ }
+ }
+ } else {
+ viml_parser_highlight(pstate, token.start, 1, HL(DoubleQuote));
+ for (p = s + 1; p < e; p++) {
+ if (*p == '\\' && p + 1 < e) {
+ p++;
+ if (p + 1 == e) {
+ size--;
+ break;
+ }
+ switch (*p) {
+ // A "\<x>" form occupies at least 4 characters, and produces up to
+ // 6 characters: reserve space for 2 extra, but do not compute actual
+ // length just now, it would be costy.
+ case '<': {
+ size += 2;
+ break;
+ }
+ // Hexadecimal, always single byte, but at least three bytes each.
+ case 'x': case 'X': {
+ size--;
+ if (ascii_isxdigit(p[1])) {
+ size--;
+ if (p + 2 < e && ascii_isxdigit(p[2])) {
+ size--;
+ }
+ }
+ break;
+ }
+ // Unicode
+ //
+ // \uF takes 1 byte which is 2 bytes less then escape sequence.
+ // \uFF: 2 bytes, 2 bytes less.
+ // \uFFF: 3 bytes, 2 bytes less.
+ // \uFFFF: 3 bytes, 3 bytes less.
+ // \UFFFFF: 4 bytes, 3 bytes less.
+ // \UFFFFFF: 5 bytes, 3 bytes less.
+ // \UFFFFFFF: 6 bytes, 3 bytes less.
+ // \U7FFFFFFF: 6 bytes, 4 bytes less.
+ case 'u': case 'U': {
+ const char *const esc_start = p;
+ size_t n = (*p == 'u' ? 4 : 8);
+ int nr = 0;
+ p++;
+ while (p + 1 < e && n-- && ascii_isxdigit(p[1])) {
+ p++;
+ nr = (nr << 4) + hex2nr(*p);
+ }
+ // Escape length: (esc_start - 1) points to "\\", esc_start to "u"
+ // or "U", p to the byte after last byte. So escape sequence
+ // occupies p - (esc_start - 1), but it stands for a utf_char2len
+ // bytes.
+ size -= (size_t)((p - (esc_start - 1)) - utf_char2len(nr));
+ p--;
+ break;
+ }
+ // Octal, always single byte, but at least two bytes each.
+ case '0': case '1': case '2': case '3': case '4': case '5': case '6':
+ case '7': {
+ size--;
+ p++;
+ if (*p >= '0' && *p <= '7') {
+ size--;
+ p++;
+ if (p < e && *p >= '0' && *p <= '7') {
+ size--;
+ p++;
+ }
+ }
+ break;
+ }
+ default: {
+ size--;
+ break;
+ }
+ }
+ }
+ }
+ if (size == 0) {
+ node->data.str.value = NULL;
+ node->data.str.size = 0;
+ } else {
+ char *v_p;
+ v_p = node->data.str.value = xmalloc(size);
+ p = s + 1;
+ while (p < e) {
+ const char *const chunk_e = memchr(p, '\\', (size_t)(e - p));
+ if (chunk_e == NULL) {
+ memcpy(v_p, p, (size_t)(e - p));
+ v_p += e - p;
+ break;
+ }
+ memcpy(v_p, p, (size_t)(chunk_e - p));
+ v_p += (size_t)(chunk_e - p);
+ p = chunk_e + 1;
+ if (p == e) {
+ *v_p++ = '\\';
+ break;
+ }
+ bool is_unknown = false;
+ const char *const v_p_start = v_p;
+ switch (*p) {
+#define SINGLE_CHAR_ESC(ch, real_ch) \
+ case ch: { \
+ *v_p++ = real_ch; \
+ p++; \
+ break; \
+ }
+ SINGLE_CHAR_ESC('b', BS)
+ SINGLE_CHAR_ESC('e', ESC)
+ SINGLE_CHAR_ESC('f', FF)
+ SINGLE_CHAR_ESC('n', NL)
+ SINGLE_CHAR_ESC('r', CAR)
+ SINGLE_CHAR_ESC('t', TAB)
+ SINGLE_CHAR_ESC('"', '"')
+ SINGLE_CHAR_ESC('\\', '\\')
+#undef SINGLE_CHAR_ESC
+
+ // Hexadecimal or unicode.
+ case 'X': case 'x': case 'u': case 'U': {
+ if (p + 1 < e && ascii_isxdigit(p[1])) {
+ size_t n;
+ int nr;
+ bool is_hex = (*p == 'x' || *p == 'X');
+
+ if (is_hex) {
+ n = 2;
+ } else if (*p == 'u') {
+ n = 4;
+ } else {
+ n = 8;
+ }
+ nr = 0;
+ while (p + 1 < e && n-- && ascii_isxdigit(p[1])) {
+ p++;
+ nr = (nr << 4) + hex2nr(*p);
+ }
+ p++;
+ if (is_hex) {
+ *v_p++ = (char)nr;
+ } else {
+ v_p += utf_char2bytes(nr, (char_u *)v_p);
+ }
+ } else {
+ is_unknown = true;
+ *v_p++ = *p;
+ p++;
+ }
+ break;
+ }
+ // Octal: "\1", "\12", "\123".
+ case '0': case '1': case '2': case '3': case '4': case '5': case '6':
+ case '7': {
+ uint8_t ch = (uint8_t)(*p++ - '0');
+ if (p < e && *p >= '0' && *p <= '7') {
+ ch = (uint8_t)((ch << 3) + *p++ - '0');
+ if (p < e && *p >= '0' && *p <= '7') {
+ ch = (uint8_t)((ch << 3) + *p++ - '0');
+ }
+ }
+ *v_p++ = (char)ch;
+ break;
+ }
+ // Special key, e.g.: "\<C-W>"
+ case '<': {
+ const size_t special_len = (
+ trans_special((const char_u **)&p, (size_t)(e - p),
+ (char_u *)v_p, true, true));
+ if (special_len != 0) {
+ v_p += special_len;
+ } else {
+ is_unknown = true;
+ mb_copy_char((const char_u **)&p, (char_u **)&v_p);
+ }
+ break;
+ }
+ default: {
+ is_unknown = true;
+ mb_copy_char((const char_u **)&p, (char_u **)&v_p);
+ break;
+ }
+ }
+ if (pstate->colors) {
+ kvi_push(shifts, ((StringShift) {
+ .start = token.start.col + (size_t)(chunk_e - s),
+ .orig_len = (size_t)(p - chunk_e),
+ .act_len = (size_t)(v_p - (char *)v_p_start),
+ .escape_not_known = is_unknown,
+ }));
+ }
+ }
+ node->data.str.size = (size_t)(v_p - node->data.str.value);
+ }
+ }
+ if (pstate->colors) {
+ // TODO(ZyX-I): use ast_stack to determine and highlight regular expressions
+ // TODO(ZyX-I): use ast_stack to determine and highlight printf format str
+ // TODO(ZyX-I): use ast_stack to determine and highlight expression strings
+ size_t next_col = token.start.col + 1;
+ const char *const body_str = (is_double
+ ? HL(DoubleQuotedBody)
+ : HL(SingleQuotedBody));
+ const char *const esc_str = (is_double
+ ? HL(DoubleQuotedEscape)
+ : HL(SingleQuotedQuote));
+ const char *const ukn_esc_str = (is_double
+ ? HL(DoubleQuotedUnknownEscape)
+ : HL(SingleQuotedUnknownEscape));
+ for (size_t i = 0; i < kv_size(shifts); i++) {
+ const StringShift cur_shift = kv_A(shifts, i);
+ if (cur_shift.start > next_col) {
+ viml_parser_highlight(pstate, recol_pos(token.start, next_col),
+ cur_shift.start - next_col,
+ body_str);
+ }
+ viml_parser_highlight(pstate, recol_pos(token.start, cur_shift.start),
+ cur_shift.orig_len,
+ (cur_shift.escape_not_known
+ ? ukn_esc_str
+ : esc_str));
+ next_col = cur_shift.start + cur_shift.orig_len;
+ }
+ if (next_col - token.start.col < token.len - token.data.str.closed) {
+ viml_parser_highlight(pstate, recol_pos(token.start, next_col),
+ (token.start.col
+ + token.len
+ - token.data.str.closed
+ - next_col),
+ body_str);
+ }
+ }
+ if (token.data.str.closed) {
+ if (is_double) {
+ viml_parser_highlight(pstate, shifted_pos(token.start, token.len - 1),
+ 1, HL(DoubleQuote));
+ } else {
+ viml_parser_highlight(pstate, shifted_pos(token.start, token.len - 1),
+ 1, HL(SingleQuote));
+ }
+ }
+ kvi_destroy(shifts);
+}
+
+/// Additional flags to pass to lexer depending on want_node
+static const int want_node_to_lexer_flags[] = {
+ [kENodeValue] = kELFlagIsNotCmp,
+ [kENodeOperator] = kELFlagForbidScope,
+};
+
+/// Number of characters to highlight as NumberPrefix depending on the base
+static const uint8_t base_to_prefix_length[] = {
+ [2] = 2,
+ [8] = 1,
+ [10] = 0,
+ [16] = 2,
+};
+
+/// Parse one VimL expression
+///
+/// @param pstate Parser state.
+/// @param[in] flags Additional flags, see ExprParserFlags
+///
+/// @return Parsed AST.
+ExprAST viml_pexpr_parse(ParserState *const pstate, const int flags)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
+{
+ ExprAST ast = {
+ .err = {
+ .msg = NULL,
+ .arg_len = 0,
+ .arg = NULL,
+ },
+ .root = NULL,
+ };
+ // Expression stack contains current branch in AST tree: that is
+ // - Stack item 0 contains root of the tree, i.e. &ast->root.
+ // - Stack item i points to the previous stack itemsโ€™ last child.
+ //
+ // When parser expects โ€œvalueโ€ node that is something like identifier or "["
+ // (list start) last stack item contains NULL. Otherwise last stack item is
+ // supposed to contain last โ€œfinishedโ€ value: e.g. "1" or "+(1, 1)" (node
+ // representing "1+1").
+ ExprASTStack ast_stack;
+ kvi_init(ast_stack);
+ kvi_push(ast_stack, &ast.root);
+ ExprASTWantedNode want_node = kENodeValue;
+ ExprASTParseTypeStack pt_stack;
+ kvi_init(pt_stack);
+ kvi_push(pt_stack, kEPTExpr);
+ if (flags & kExprFlagsParseLet) {
+ kvi_push(pt_stack, kEPTAssignment);
+ }
+ LexExprToken prev_token = { .type = kExprLexMissing };
+ bool highlighted_prev_spacing = false;
+ // Lambda node, valid when parsing lambda arguments only.
+ ExprASTNode *lambda_node = NULL;
+ size_t asgn_level = 0;
+ do {
+ const bool is_concat_or_subscript = (
+ want_node == kENodeValue
+ && kv_size(ast_stack) > 1
+ && (*kv_Z(ast_stack, 1))->type == kExprNodeConcatOrSubscript);
+ const int lexer_additional_flags = (
+ kELFlagPeek
+ | ((flags & kExprFlagsDisallowEOC) ? kELFlagForbidEOC : 0)
+ | ((want_node == kENodeValue
+ && (kv_size(ast_stack) == 1
+ || ((*kv_Z(ast_stack, 1))->type != kExprNodeConcat
+ && ((*kv_Z(ast_stack, 1))->type
+ != kExprNodeConcatOrSubscript))))
+ ? kELFlagAllowFloat
+ : 0));
+ LexExprToken cur_token = viml_pexpr_next_token(
+ pstate, want_node_to_lexer_flags[want_node] | lexer_additional_flags);
+ if (cur_token.type == kExprLexEOC) {
+ break;
+ }
+ LexExprTokenType tok_type = cur_token.type;
+ const bool token_invalid = (tok_type == kExprLexInvalid);
+ bool is_invalid = token_invalid;
+viml_pexpr_parse_process_token:
+ // May use different flags this time.
+ cur_token = viml_pexpr_next_token(
+ pstate, want_node_to_lexer_flags[want_node] | lexer_additional_flags);
+ if (tok_type == kExprLexSpacing) {
+ if (is_invalid) {
+ HL_CUR_TOKEN(Spacing);
+ } else {
+ // Do not do anything: let regular spacing be highlighted as normal.
+ // This also allows later to highlight spacing as invalid.
+ }
+ goto viml_pexpr_parse_cycle_end;
+ } else if (is_invalid && prev_token.type == kExprLexSpacing
+ && !highlighted_prev_spacing) {
+ viml_parser_highlight(pstate, prev_token.start, prev_token.len,
+ HL(Spacing));
+ is_invalid = false;
+ highlighted_prev_spacing = true;
+ }
+ const ParserLine pline = pstate->reader.lines.items[cur_token.start.line];
+ ExprASTNode **const top_node_p = kv_last(ast_stack);
+ assert(kv_size(ast_stack) >= 1);
+ ExprASTNode *cur_node = NULL;
+#ifndef NDEBUG
+ const bool want_value = (want_node == kENodeValue);
+ assert(want_value == (*top_node_p == NULL));
+ assert(kv_A(ast_stack, 0) == &ast.root);
+ // Check that stack item i + 1 points to stack itemsโ€™ i *last* child.
+ for (size_t i = 0; i + 1 < kv_size(ast_stack); i++) {
+ const bool item_null = (want_value && i + 2 == kv_size(ast_stack));
+ assert((&(*kv_A(ast_stack, i))->children == kv_A(ast_stack, i + 1)
+ && (item_null
+ ? (*kv_A(ast_stack, i))->children == NULL
+ : (*kv_A(ast_stack, i))->children->next == NULL))
+ || ((&(*kv_A(ast_stack, i))->children->next
+ == kv_A(ast_stack, i + 1))
+ && (item_null
+ ? (*kv_A(ast_stack, i))->children->next == NULL
+ : (*kv_A(ast_stack, i))->children->next->next == NULL)));
+ }
+#endif
+ // Note: in Vim whether expression "cond?d.a:2" is valid depends both on
+ // "cond" and whether "d" is a dictionary: expression is valid if condition
+ // is true and "d" is a dictionary (with "a" key or it will complain about
+ // missing one, but this is not relevant); if any of the requirements is
+ // broken then this thing is parsed as "d . a:2" yielding missing colon
+ // error. This parser does not allow such ambiguity, especially because it
+ // simply canโ€™t: whether "d" is a dictionary is not known at the parsing
+ // time.
+ //
+ // Here example will always contain a concat with "a:2" sucking colon,
+ // making expression invalid both because there is no longer a spare colon
+ // for ternary and because concatenating dictionary with anything is not
+ // valid. There are more cases when this will make a difference though.
+ const bool node_is_key = (
+ is_concat_or_subscript
+ && (cur_token.type == kExprLexPlainIdentifier
+ ? (!cur_token.data.var.autoload
+ && cur_token.data.var.scope == kExprVarScopeMissing)
+ : (cur_token.type == kExprLexNumber))
+ && prev_token.type != kExprLexSpacing);
+ if (is_concat_or_subscript && !node_is_key) {
+ // Note: in Vim "d. a" (this is the reason behind `prev_token.type !=
+ // kExprLexSpacing` part of the condition) as well as any other "d.{expr}"
+ // where "{expr}" does not look like a key is invalid whenever "d" happens
+ // to be a dictionary. Since parser has no idea whether preceding
+ // expression is actually a dictionary it canโ€™t outright reject anything,
+ // so it turns kExprNodeConcatOrSubscript into kExprNodeConcat instead,
+ // which will yield different errors then Vim does in a number of
+ // circumstances, and in any case runtime and not parse time errors.
+ (*kv_Z(ast_stack, 1))->type = kExprNodeConcat;
+ }
+ // Pop some stack pt_stack items in case of misplaced nodes.
+ const bool is_single_assignment = kv_last(pt_stack) == kEPTSingleAssignment;
+ switch (kv_last(pt_stack)) {
+ case kEPTExpr: {
+ break;
+ }
+ case kEPTLambdaArguments: {
+ if ((want_node == kENodeOperator
+ && tok_type != kExprLexComma
+ && tok_type != kExprLexArrow)
+ || (want_node == kENodeValue
+ && !(cur_token.type == kExprLexPlainIdentifier
+ && cur_token.data.var.scope == kExprVarScopeMissing
+ && !cur_token.data.var.autoload)
+ && tok_type != kExprLexArrow)) {
+ lambda_node->data.fig.type_guesses.allow_lambda = false;
+ if (lambda_node->children != NULL
+ && lambda_node->children->type == kExprNodeComma) {
+ // If lambda has comma child this means that parser has already seen
+ // at least "{arg1,", so node cannot possibly be anything, but
+ // lambda.
+
+ // Vim may give E121 or E720 in this case, but it does not look
+ // right to have either because both are results of reevaluation
+ // possibly-lambda node as a dictionary and here this is not going
+ // to happen.
+ ERROR_FROM_TOKEN_AND_MSG(
+ cur_token,
+ _("E15: Expected lambda arguments list or arrow: %.*s"));
+ } else {
+ // Else it may appear that possibly-lambda node is actually
+ // a dictionary or curly-braces-name identifier.
+ lambda_node = NULL;
+ kv_drop(pt_stack, 1);
+ }
+ }
+ break;
+ }
+ case kEPTSingleAssignment:
+ case kEPTAssignment: {
+ if (want_node == kENodeValue
+ && tok_type != kExprLexBracket
+ && tok_type != kExprLexPlainIdentifier
+ && (tok_type != kExprLexFigureBrace || cur_token.data.brc.closing)
+ && !(node_is_key && tok_type == kExprLexNumber)
+ && tok_type != kExprLexEnv
+ && tok_type != kExprLexOption
+ && tok_type != kExprLexRegister) {
+ ERROR_FROM_TOKEN_AND_MSG(
+ cur_token,
+ _("E15: Expected value part of assignment lvalue: %.*s"));
+ kv_drop(pt_stack, 1);
+ } else if (want_node == kENodeOperator
+ && tok_type != kExprLexBracket
+ && (tok_type != kExprLexFigureBrace
+ || cur_token.data.brc.closing)
+ && tok_type != kExprLexDot
+ && (tok_type != kExprLexComma || !is_single_assignment)
+ && tok_type != kExprLexAssignment
+ // Curly brace identifiers: will contain plain identifier or
+ // another curly brace in position where operator is wanted.
+ && !((tok_type == kExprLexPlainIdentifier
+ || (tok_type == kExprLexFigureBrace
+ && !cur_token.data.brc.closing))
+ && prev_token.type != kExprLexSpacing)) {
+ if (flags & kExprFlagsMulti && MAY_HAVE_NEXT_EXPR) {
+ goto viml_pexpr_parse_end;
+ }
+ ERROR_FROM_TOKEN_AND_MSG(
+ cur_token,
+ _("E15: Expected assignment operator or subscript: %.*s"));
+ kv_drop(pt_stack, 1);
+ }
+ assert(kv_size(pt_stack));
+ break;
+ }
+ }
+ assert(kv_size(pt_stack));
+ const ExprASTParseType cur_pt = kv_last(pt_stack);
+ assert(lambda_node == NULL || cur_pt == kEPTLambdaArguments);
+ switch (tok_type) {
+ case kExprLexMissing:
+ case kExprLexSpacing:
+ case kExprLexEOC: {
+ assert(false);
+ }
+ case kExprLexInvalid: {
+ ERROR_FROM_TOKEN(cur_token);
+ tok_type = cur_token.data.err.type;
+ goto viml_pexpr_parse_process_token;
+ }
+ case kExprLexRegister: {
+ if (want_node == kENodeOperator) {
+ // Register in operator position: e.g. @a @a
+ OP_MISSING;
+ }
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeRegister);
+ cur_node->data.reg.name = cur_token.data.reg.name;
+ *top_node_p = cur_node;
+ want_node = kENodeOperator;
+ HL_CUR_TOKEN(Register);
+ break;
+ }
+#define SIMPLE_UB_OP(op) \
+ case kExprLex##op: { \
+ if (want_node == kENodeValue) { \
+ /* Value level: assume unary operator. */ \
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeUnary##op); \
+ *top_node_p = cur_node; \
+ kvi_push(ast_stack, &cur_node->children); \
+ HL_CUR_TOKEN(Unary##op); \
+ } else { \
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeBinary##op); \
+ ADD_OP_NODE(cur_node); \
+ HL_CUR_TOKEN(Binary##op); \
+ } \
+ want_node = kENodeValue; \
+ break; \
+ }
+ SIMPLE_UB_OP(Plus)
+ SIMPLE_UB_OP(Minus)
+#undef SIMPLE_UB_OP
+#define SIMPLE_B_OP(op, msg) \
+ case kExprLex##op: { \
+ ADD_VALUE_IF_MISSING(_("E15: Unexpected " msg ": %.*s")); \
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNode##op); \
+ HL_CUR_TOKEN(op); \
+ ADD_OP_NODE(cur_node); \
+ break; \
+ }
+ SIMPLE_B_OP(Or, "or operator")
+ SIMPLE_B_OP(And, "and operator")
+#undef SIMPLE_B_OP
+ case kExprLexMultiplication: {
+ ADD_VALUE_IF_MISSING(
+ _("E15: Unexpected multiplication-like operator: %.*s"));
+ switch (cur_token.data.mul.type) {
+#define MUL_OP(lex_op_tail, node_op_tail) \
+ case kExprLexMul##lex_op_tail: { \
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNode##node_op_tail); \
+ HL_CUR_TOKEN(node_op_tail); \
+ break; \
+ }
+ MUL_OP(Mul, Multiplication)
+ MUL_OP(Div, Division)
+ MUL_OP(Mod, Mod)
+#undef MUL_OP
+ }
+ ADD_OP_NODE(cur_node);
+ break;
+ }
+ case kExprLexOption: {
+ if (want_node == kENodeOperator) {
+ OP_MISSING;
+ }
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeOption);
+ if (cur_token.type == kExprLexInvalid) {
+ assert(cur_token.len == 1
+ || (cur_token.len == 3
+ && pline.data[cur_token.start.col + 2] == ':'));
+ cur_node->data.opt.ident = (
+ pline.data + cur_token.start.col + cur_token.len);
+ cur_node->data.opt.ident_len = 0;
+ cur_node->data.opt.scope = (
+ cur_token.len == 3
+ ? (ExprOptScope)pline.data[cur_token.start.col + 1]
+ : kExprOptScopeUnspecified);
+ } else {
+ cur_node->data.opt.ident = cur_token.data.opt.name;
+ cur_node->data.opt.ident_len = cur_token.data.opt.len;
+ cur_node->data.opt.scope = cur_token.data.opt.scope;
+ }
+ *top_node_p = cur_node;
+ want_node = kENodeOperator;
+ viml_parser_highlight(pstate, cur_token.start, 1, HL(OptionSigil));
+ const size_t scope_shift = (
+ cur_token.data.opt.scope == kExprOptScopeUnspecified ? 0 : 2);
+ if (scope_shift) {
+ viml_parser_highlight(pstate, shifted_pos(cur_token.start, 1), 1,
+ HL(OptionScope));
+ viml_parser_highlight(pstate, shifted_pos(cur_token.start, 2), 1,
+ HL(OptionScopeDelimiter));
+ }
+ viml_parser_highlight(
+ pstate, shifted_pos(cur_token.start, scope_shift + 1),
+ cur_token.len - (scope_shift + 1), HL(OptionName));
+ break;
+ }
+ case kExprLexEnv: {
+ if (want_node == kENodeOperator) {
+ OP_MISSING;
+ }
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeEnvironment);
+ cur_node->data.env.ident = pline.data + cur_token.start.col + 1;
+ cur_node->data.env.ident_len = cur_token.len - 1;
+ if (cur_node->data.env.ident_len == 0) {
+ ERROR_FROM_TOKEN_AND_MSG(cur_token,
+ _("E15: Environment variable name missing"));
+ }
+ *top_node_p = cur_node;
+ want_node = kENodeOperator;
+ viml_parser_highlight(pstate, cur_token.start, 1, HL(EnvironmentSigil));
+ viml_parser_highlight(pstate, shifted_pos(cur_token.start, 1),
+ cur_token.len - 1, HL(EnvironmentName));
+ break;
+ }
+ case kExprLexNot: {
+ if (want_node == kENodeOperator) {
+ OP_MISSING;
+ }
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeNot);
+ *top_node_p = cur_node;
+ kvi_push(ast_stack, &cur_node->children);
+ HL_CUR_TOKEN(Not);
+ break;
+ }
+ case kExprLexComparison: {
+ ADD_VALUE_IF_MISSING(
+ _("E15: Expected value, got comparison operator: %.*s"));
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeComparison);
+ if (cur_token.type == kExprLexInvalid) {
+ cur_node->data.cmp.ccs = kCCStrategyUseOption;
+ cur_node->data.cmp.type = kExprCmpEqual;
+ cur_node->data.cmp.inv = false;
+ } else {
+ cur_node->data.cmp.ccs = cur_token.data.cmp.ccs;
+ cur_node->data.cmp.type = cur_token.data.cmp.type;
+ cur_node->data.cmp.inv = cur_token.data.cmp.inv;
+ }
+ ADD_OP_NODE(cur_node);
+ if (cur_token.data.cmp.ccs != kCCStrategyUseOption) {
+ viml_parser_highlight(pstate, cur_token.start, cur_token.len - 1,
+ HL(Comparison));
+ viml_parser_highlight(
+ pstate, shifted_pos(cur_token.start, cur_token.len - 1), 1,
+ HL(ComparisonModifier));
+ } else {
+ HL_CUR_TOKEN(Comparison);
+ }
+ want_node = kENodeValue;
+ break;
+ }
+ case kExprLexComma: {
+ assert(!(want_node == kENodeValue && cur_pt == kEPTLambdaArguments));
+ if (want_node == kENodeValue) {
+ // Value level: comma appearing here is not valid.
+ // Note: in Vim string(,x) will give E116, this is not the case here.
+ ERROR_FROM_TOKEN_AND_MSG(
+ cur_token, _("E15: Expected value, got comma: %.*s"));
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeMissing);
+ cur_node->len = 0;
+ *top_node_p = cur_node;
+ want_node = kENodeOperator;
+ }
+ if (cur_pt == kEPTLambdaArguments) {
+ assert(lambda_node != NULL);
+ assert(lambda_node->data.fig.type_guesses.allow_lambda);
+ SELECT_FIGURE_BRACE_TYPE(lambda_node, Lambda, Lambda);
+ }
+ if (kv_size(ast_stack) < 2) {
+ goto viml_pexpr_parse_invalid_comma;
+ }
+ for (size_t i = 1; i < kv_size(ast_stack); i++) {
+ ExprASTNode *const *const eastnode_p =
+ (ExprASTNode *const *)kv_Z(ast_stack, i);
+ const ExprASTNodeType eastnode_type = (*eastnode_p)->type;
+ const ExprOpLvl eastnode_lvl = node_lvl(**eastnode_p);
+ if (eastnode_type == kExprNodeLambda) {
+ assert(cur_pt == kEPTLambdaArguments
+ && want_node == kENodeOperator);
+ break;
+ } else if (eastnode_type == kExprNodeDictLiteral
+ || eastnode_type == kExprNodeListLiteral
+ || eastnode_type == kExprNodeCall) {
+ break;
+ } else if (eastnode_type == kExprNodeComma
+ || eastnode_type == kExprNodeColon
+ || eastnode_lvl > kEOpLvlComma) {
+ // Do nothing
+ } else {
+viml_pexpr_parse_invalid_comma:
+ ERROR_FROM_TOKEN_AND_MSG(
+ cur_token,
+ _("E15: Comma outside of call, lambda or literal: %.*s"));
+ break;
+ }
+ if (i == kv_size(ast_stack) - 1) {
+ goto viml_pexpr_parse_invalid_comma;
+ }
+ }
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeComma);
+ ADD_OP_NODE(cur_node);
+ HL_CUR_TOKEN(Comma);
+ break;
+ }
+#define EXP_VAL_COLON "E15: Expected value, got colon: %.*s"
+ case kExprLexColon: {
+ bool is_ternary = false;
+ if (kv_size(ast_stack) < 2) {
+ goto viml_pexpr_parse_invalid_colon;
+ }
+ bool can_be_ternary = true;
+ bool is_subscript = false;
+ for (size_t i = 1; i < kv_size(ast_stack); i++) {
+ ExprASTNode *const *const eastnode_p =
+ (ExprASTNode *const *)kv_Z(ast_stack, i);
+ const ExprASTNodeType eastnode_type = (*eastnode_p)->type;
+ const ExprOpLvl eastnode_lvl = node_lvl(**eastnode_p);
+ STATIC_ASSERT(kEOpLvlTernary > kEOpLvlComma,
+ "Unexpected operator priorities");
+ if (can_be_ternary && eastnode_type == kExprNodeTernaryValue
+ && !(*eastnode_p)->data.ter.got_colon) {
+ kv_drop(ast_stack, i);
+ (*eastnode_p)->start = cur_token.start;
+ (*eastnode_p)->len = cur_token.len;
+ if (prev_token.type == kExprLexSpacing) {
+ (*eastnode_p)->start = prev_token.start;
+ (*eastnode_p)->len += prev_token.len;
+ }
+ is_ternary = true;
+ (*eastnode_p)->data.ter.got_colon = true;
+ ADD_VALUE_IF_MISSING(_(EXP_VAL_COLON));
+ assert((*eastnode_p)->children != NULL);
+ assert((*eastnode_p)->children->next == NULL);
+ kvi_push(ast_stack, &(*eastnode_p)->children->next);
+ break;
+ } else if (eastnode_type == kExprNodeUnknownFigure) {
+ SELECT_FIGURE_BRACE_TYPE(*eastnode_p, DictLiteral, Dict);
+ break;
+ } else if (eastnode_type == kExprNodeDictLiteral) {
+ break;
+ } else if (eastnode_type == kExprNodeSubscript) {
+ is_subscript = true;
+ can_be_ternary = false;
+ assert(!is_ternary);
+ break;
+ } else if (eastnode_type == kExprNodeColon) {
+ goto viml_pexpr_parse_invalid_colon;
+ } else if (eastnode_lvl >= kEOpLvlTernaryValue) {
+ // Do nothing
+ } else if (eastnode_lvl >= kEOpLvlComma) {
+ can_be_ternary = false;
+ } else {
+ goto viml_pexpr_parse_invalid_colon;
+ }
+ if (i == kv_size(ast_stack) - 1) {
+ goto viml_pexpr_parse_invalid_colon;
+ }
+ }
+ if (is_subscript) {
+ assert(kv_size(ast_stack) > 1);
+ // Colon immediately following subscript start: it is empty subscript
+ // part like a[:2].
+ if (want_node == kENodeValue
+ && (*kv_Z(ast_stack, 1))->type == kExprNodeSubscript) {
+ NEW_NODE_WITH_CUR_POS(*top_node_p, kExprNodeMissing);
+ (*top_node_p)->len = 0;
+ want_node = kENodeOperator;
+ } else {
+ ADD_VALUE_IF_MISSING(_(EXP_VAL_COLON));
+ }
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeColon);
+ ADD_OP_NODE(cur_node);
+ HL_CUR_TOKEN(SubscriptColon);
+ } else {
+ goto viml_pexpr_parse_valid_colon;
+viml_pexpr_parse_invalid_colon:
+ ERROR_FROM_TOKEN_AND_MSG(
+ cur_token,
+ _("E15: Colon outside of dictionary or ternary operator: %.*s"));
+viml_pexpr_parse_valid_colon:
+ ADD_VALUE_IF_MISSING(_(EXP_VAL_COLON));
+ if (is_ternary) {
+ HL_CUR_TOKEN(TernaryColon);
+ } else {
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeColon);
+ ADD_OP_NODE(cur_node);
+ HL_CUR_TOKEN(Colon);
+ }
+ }
+ want_node = kENodeValue;
+ break;
+ }
+#undef EXP_VAL_COLON
+ case kExprLexBracket: {
+ if (cur_token.data.brc.closing) {
+ ExprASTNode **new_top_node_p = NULL;
+ // Always drop the topmost value:
+ //
+ // 1. When want_node != kENodeValue topmost item on stack is
+ // a *finished* left operand, which may as well be "{@a}" which
+ // needs not be finished again.
+ // 2. Otherwise it is pointing to NULL what nobody wants.
+ kv_drop(ast_stack, 1);
+ if (!kv_size(ast_stack)) {
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeListLiteral);
+ cur_node->len = 0;
+ if (want_node != kENodeValue) {
+ cur_node->children = *top_node_p;
+ }
+ *top_node_p = cur_node;
+ goto viml_pexpr_parse_bracket_closing_error;
+ }
+ if (want_node == kENodeValue) {
+ // It is OK to want value if
+ //
+ // 1. It is empty list literal, in which case top node will be
+ // ListLiteral.
+ // 2. It is list literal with trailing comma, in which case top node
+ // will be that comma.
+ // 3. It is subscript with colon, but without one of the values:
+ // e.g. "a[:]", "a[1:]", top node will be colon in this case.
+ if ((*kv_last(ast_stack))->type != kExprNodeListLiteral
+ && (*kv_last(ast_stack))->type != kExprNodeComma
+ && (*kv_last(ast_stack))->type != kExprNodeColon) {
+ ERROR_FROM_TOKEN_AND_MSG(
+ cur_token,
+ _("E15: Expected value, got closing bracket: %.*s"));
+ }
+ }
+ do {
+ new_top_node_p = kv_pop(ast_stack);
+ } while (kv_size(ast_stack)
+ && (new_top_node_p == NULL
+ || ((*new_top_node_p)->type != kExprNodeListLiteral
+ && (*new_top_node_p)->type != kExprNodeSubscript)));
+ ExprASTNode *new_top_node = *new_top_node_p;
+ switch (new_top_node->type) {
+ case kExprNodeListLiteral: {
+ if (pt_is_assignment(cur_pt) && new_top_node->children == NULL) {
+ ERROR_FROM_TOKEN_AND_MSG(
+ cur_token, _("E475: Unable to assign to empty list: %.*s"));
+ }
+ HL_CUR_TOKEN(List);
+ break;
+ }
+ case kExprNodeSubscript: {
+ HL_CUR_TOKEN(SubscriptBracket);
+ break;
+ }
+ default: {
+viml_pexpr_parse_bracket_closing_error:
+ assert(!kv_size(ast_stack));
+ ERROR_FROM_TOKEN_AND_MSG(
+ cur_token, _("E15: Unexpected closing figure brace: %.*s"));
+ HL_CUR_TOKEN(List);
+ break;
+ }
+ }
+ kvi_push(ast_stack, new_top_node_p);
+ want_node = kENodeOperator;
+ if (kv_size(ast_stack) <= asgn_level) {
+ assert(kv_size(ast_stack) == asgn_level);
+ asgn_level = 0;
+ if (cur_pt == kEPTAssignment) {
+ assert(ast.err.msg);
+ } else if (cur_pt == kEPTExpr
+ && kv_size(pt_stack) > 1
+ && pt_is_assignment(kv_Z(pt_stack, 1))) {
+ kv_drop(pt_stack, 1);
+ }
+ }
+ if (cur_pt == kEPTSingleAssignment && kv_size(ast_stack) == 1) {
+ kv_drop(pt_stack, 1);
+ }
+ } else {
+ if (want_node == kENodeValue) {
+ // Value means list literal or list assignment.
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeListLiteral);
+ *top_node_p = cur_node;
+ kvi_push(ast_stack, &cur_node->children);
+ want_node = kENodeValue;
+ if (cur_pt == kEPTAssignment) {
+ // Additional assignment parse type allows to easily forbid nested
+ // lists.
+ kvi_push(pt_stack, kEPTSingleAssignment);
+ } else if (cur_pt == kEPTSingleAssignment) {
+ ERROR_FROM_TOKEN_AND_MSG(
+ cur_token,
+ _("E475: Nested lists not allowed when assigning: %.*s"));
+ }
+ HL_CUR_TOKEN(List);
+ } else {
+ // Operator means subscript, also in assignment. But in assignment
+ // subscript may be pretty much any expression, so need to push
+ // kEPTExpr.
+ if (prev_token.type == kExprLexSpacing) {
+ OP_MISSING;
+ }
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeSubscript);
+ ADD_OP_NODE(cur_node);
+ HL_CUR_TOKEN(SubscriptBracket);
+ if (pt_is_assignment(cur_pt)) {
+ assert(want_node == kENodeValue); // Subtract 1 for NULL at top.
+ asgn_level = kv_size(ast_stack) - 1;
+ kvi_push(pt_stack, kEPTExpr);
+ }
+ }
+ }
+ break;
+ }
+ case kExprLexFigureBrace: {
+ if (cur_token.data.brc.closing) {
+ ExprASTNode **new_top_node_p = NULL;
+ // Always drop the topmost value:
+ //
+ // 1. When want_node != kENodeValue topmost item on stack is
+ // a *finished* left operand, which may as well be "{@a}" which
+ // needs not be finished again.
+ // 2. Otherwise it is pointing to NULL what nobody wants.
+ kv_drop(ast_stack, 1);
+ if (!kv_size(ast_stack)) {
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeUnknownFigure);
+ cur_node->data.fig.type_guesses.allow_lambda = false;
+ cur_node->data.fig.type_guesses.allow_dict = false;
+ cur_node->data.fig.type_guesses.allow_ident = false;
+ cur_node->len = 0;
+ if (want_node != kENodeValue) {
+ cur_node->children = *top_node_p;
+ }
+ *top_node_p = cur_node;
+ new_top_node_p = top_node_p;
+ goto viml_pexpr_parse_figure_brace_closing_error;
+ }
+ if (want_node == kENodeValue) {
+ if ((*kv_last(ast_stack))->type != kExprNodeUnknownFigure
+ && (*kv_last(ast_stack))->type != kExprNodeComma) {
+ // kv_last being UnknownFigure may occur for empty dictionary
+ // literal, while Comma is expected in case of non-empty one.
+ ERROR_FROM_TOKEN_AND_MSG(
+ cur_token,
+ _("E15: Expected value, got closing figure brace: %.*s"));
+ }
+ }
+ do {
+ new_top_node_p = kv_pop(ast_stack);
+ } while (kv_size(ast_stack)
+ && (new_top_node_p == NULL
+ || ((*new_top_node_p)->type != kExprNodeUnknownFigure
+ && (*new_top_node_p)->type != kExprNodeDictLiteral
+ && ((*new_top_node_p)->type
+ != kExprNodeCurlyBracesIdentifier)
+ && (*new_top_node_p)->type != kExprNodeLambda)));
+ ExprASTNode *new_top_node = *new_top_node_p;
+ switch (new_top_node->type) {
+ case kExprNodeUnknownFigure: {
+ if (new_top_node->children == NULL) {
+ // No children of curly braces node indicates empty dictionary.
+ assert(want_node == kENodeValue);
+ assert(new_top_node->data.fig.type_guesses.allow_dict);
+ SELECT_FIGURE_BRACE_TYPE(new_top_node, DictLiteral, Dict);
+ HL_CUR_TOKEN(Dict);
+ } else if (new_top_node->data.fig.type_guesses.allow_ident) {
+ SELECT_FIGURE_BRACE_TYPE(new_top_node, CurlyBracesIdentifier,
+ Curly);
+ HL_CUR_TOKEN(Curly);
+ } else {
+ // If by this time type of the node has not already been
+ // guessed, but it definitely is not a curly braces name then
+ // it is invalid for sure.
+ ERROR_FROM_NODE_AND_MSG(
+ new_top_node,
+ _("E15: Don't know what figure brace means: %.*s"));
+ if (pstate->colors) {
+ // Will reset to NvimInvalidFigureBrace.
+ kv_A(*pstate->colors,
+ new_top_node->data.fig.opening_hl_idx).group = (
+ HL(FigureBrace));
+ }
+ HL_CUR_TOKEN(FigureBrace);
+ }
+ break;
+ }
+ case kExprNodeDictLiteral: {
+ HL_CUR_TOKEN(Dict);
+ break;
+ }
+ case kExprNodeCurlyBracesIdentifier: {
+ HL_CUR_TOKEN(Curly);
+ break;
+ }
+ case kExprNodeLambda: {
+ HL_CUR_TOKEN(Lambda);
+ break;
+ }
+ default: {
+viml_pexpr_parse_figure_brace_closing_error:
+ assert(!kv_size(ast_stack));
+ ERROR_FROM_TOKEN_AND_MSG(
+ cur_token, _("E15: Unexpected closing figure brace: %.*s"));
+ HL_CUR_TOKEN(FigureBrace);
+ break;
+ }
+ }
+ kvi_push(ast_stack, new_top_node_p);
+ want_node = kENodeOperator;
+ if (kv_size(ast_stack) <= asgn_level) {
+ assert(kv_size(ast_stack) == asgn_level);
+ if (cur_pt == kEPTExpr
+ && kv_size(pt_stack) > 1
+ && pt_is_assignment(kv_Z(pt_stack, 1))) {
+ kv_drop(pt_stack, 1);
+ asgn_level = 0;
+ }
+ }
+ } else {
+ if (want_node == kENodeValue) {
+ HL_CUR_TOKEN(FigureBrace);
+ // Value: may be any of lambda, dictionary literal and curly braces
+ // name.
+
+ // Though if we are in an assignment this may only be a curly braces
+ // name.
+ if (pt_is_assignment(cur_pt)) {
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeCurlyBracesIdentifier);
+ cur_node->data.fig.type_guesses.allow_lambda = false;
+ cur_node->data.fig.type_guesses.allow_dict = false;
+ cur_node->data.fig.type_guesses.allow_ident = true;
+ kvi_push(pt_stack, kEPTExpr);
+ } else {
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeUnknownFigure);
+ cur_node->data.fig.type_guesses.allow_lambda = true;
+ cur_node->data.fig.type_guesses.allow_dict = true;
+ cur_node->data.fig.type_guesses.allow_ident = true;
+ }
+ if (pstate->colors) {
+ cur_node->data.fig.opening_hl_idx = kv_size(*pstate->colors) - 1;
+ }
+ *top_node_p = cur_node;
+ kvi_push(ast_stack, &cur_node->children);
+ kvi_push(pt_stack, kEPTLambdaArguments);
+ lambda_node = cur_node;
+ } else {
+ ADD_IDENT(
+ do {
+ NEW_NODE_WITH_CUR_POS(cur_node,
+ kExprNodeCurlyBracesIdentifier);
+ cur_node->data.fig.opening_hl_idx = kv_size(*pstate->colors);
+ cur_node->data.fig.type_guesses.allow_lambda = false;
+ cur_node->data.fig.type_guesses.allow_dict = false;
+ cur_node->data.fig.type_guesses.allow_ident = true;
+ kvi_push(ast_stack, &cur_node->children);
+ if (pt_is_assignment(cur_pt)) {
+ kvi_push(pt_stack, kEPTExpr);
+ }
+ want_node = kENodeValue;
+ } while (0),
+ Curly);
+ }
+ if (pt_is_assignment(cur_pt)
+ && !pt_is_assignment(kv_last(pt_stack))) {
+ assert(want_node == kENodeValue); // Subtract 1 for NULL at top.
+ asgn_level = kv_size(ast_stack) - 1;
+ }
+ }
+ break;
+ }
+ case kExprLexArrow: {
+ if (cur_pt == kEPTLambdaArguments) {
+ kv_drop(pt_stack, 1);
+ assert(kv_size(pt_stack));
+ if (want_node == kENodeValue) {
+ // Wanting value means trailing comma and NULL at the top of the
+ // stack.
+ kv_drop(ast_stack, 1);
+ }
+ assert(kv_size(ast_stack) >= 1);
+ while ((*kv_last(ast_stack))->type != kExprNodeLambda
+ && (*kv_last(ast_stack))->type != kExprNodeUnknownFigure) {
+ kv_drop(ast_stack, 1);
+ }
+ assert((*kv_last(ast_stack)) == lambda_node);
+ SELECT_FIGURE_BRACE_TYPE(lambda_node, Lambda, Lambda);
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeArrow);
+ if (lambda_node->children == NULL) {
+ assert(want_node == kENodeValue);
+ lambda_node->children = cur_node;
+ kvi_push(ast_stack, &lambda_node->children);
+ } else {
+ assert(lambda_node->children->next == NULL);
+ lambda_node->children->next = cur_node;
+ kvi_push(ast_stack, &lambda_node->children->next);
+ }
+ kvi_push(ast_stack, &cur_node->children);
+ lambda_node = NULL;
+ } else {
+ // Only first branch is valid.
+ ADD_VALUE_IF_MISSING(_("E15: Unexpected arrow: %.*s"));
+ ERROR_FROM_TOKEN_AND_MSG(
+ cur_token, _("E15: Arrow outside of lambda: %.*s"));
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeArrow);
+ ADD_OP_NODE(cur_node);
+ }
+ want_node = kENodeValue;
+ HL_CUR_TOKEN(Arrow);
+ break;
+ }
+ case kExprLexPlainIdentifier: {
+ const ExprVarScope scope = (cur_token.type == kExprLexInvalid
+ ? kExprVarScopeMissing
+ : cur_token.data.var.scope);
+ if (want_node == kENodeValue) {
+ want_node = kENodeOperator;
+ NEW_NODE_WITH_CUR_POS(cur_node,
+ (node_is_key
+ ? kExprNodePlainKey
+ : kExprNodePlainIdentifier));
+ cur_node->data.var.scope = scope;
+ const size_t scope_shift = (scope == kExprVarScopeMissing ? 0 : 2);
+ cur_node->data.var.ident = (pline.data + cur_token.start.col
+ + scope_shift);
+ cur_node->data.var.ident_len = cur_token.len - scope_shift;
+ *top_node_p = cur_node;
+ if (scope_shift) {
+ assert(!node_is_key);
+ viml_parser_highlight(pstate, cur_token.start, 1,
+ HL(IdentifierScope));
+ viml_parser_highlight(pstate, shifted_pos(cur_token.start, 1), 1,
+ HL(IdentifierScopeDelimiter));
+ }
+ viml_parser_highlight(pstate, shifted_pos(cur_token.start,
+ scope_shift),
+ cur_token.len - scope_shift,
+ (node_is_key
+ ? HL(IdentifierKey)
+ : HL(IdentifierName)));
+ } else {
+ if (scope == kExprVarScopeMissing) {
+ ADD_IDENT(
+ do {
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodePlainIdentifier);
+ cur_node->data.var.scope = scope;
+ cur_node->data.var.ident = pline.data + cur_token.start.col;
+ cur_node->data.var.ident_len = cur_token.len;
+ want_node = kENodeOperator;
+ } while (0),
+ IdentifierName);
+ } else {
+ OP_MISSING;
+ }
+ }
+ break;
+ }
+ case kExprLexNumber: {
+ if (want_node != kENodeValue) {
+ OP_MISSING;
+ }
+ if (node_is_key) {
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodePlainKey);
+ cur_node->data.var.ident = pline.data + cur_token.start.col;
+ cur_node->data.var.ident_len = cur_token.len;
+ HL_CUR_TOKEN(IdentifierKey);
+ } else if (cur_token.data.num.is_float) {
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeFloat);
+ cur_node->data.flt.value = cur_token.data.num.val.floating;
+ HL_CUR_TOKEN(Float);
+ } else {
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeInteger);
+ cur_node->data.num.value = cur_token.data.num.val.integer;
+ const uint8_t prefix_length = base_to_prefix_length[
+ cur_token.data.num.base];
+ viml_parser_highlight(pstate, cur_token.start, prefix_length,
+ HL(NumberPrefix));
+ viml_parser_highlight(
+ pstate, shifted_pos(cur_token.start, prefix_length),
+ cur_token.len - prefix_length, HL(Number));
+ }
+ want_node = kENodeOperator;
+ *top_node_p = cur_node;
+ break;
+ }
+ case kExprLexDot: {
+ ADD_VALUE_IF_MISSING(_("E15: Unexpected dot: %.*s"));
+ if (prev_token.type == kExprLexSpacing) {
+ if (cur_pt == kEPTAssignment) {
+ ERROR_FROM_TOKEN_AND_MSG(
+ cur_token, _("E15: Cannot concatenate in assignments: %.*s"));
+ }
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeConcat);
+ HL_CUR_TOKEN(Concat);
+ } else {
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeConcatOrSubscript);
+ HL_CUR_TOKEN(ConcatOrSubscript);
+ }
+ ADD_OP_NODE(cur_node);
+ break;
+ }
+ case kExprLexParenthesis: {
+ if (cur_token.data.brc.closing) {
+ if (want_node == kENodeValue) {
+ if (kv_size(ast_stack) > 1) {
+ const ExprASTNode *const prev_top_node = *kv_Z(ast_stack, 1);
+ if (prev_top_node->type == kExprNodeCall) {
+ // Function call without arguments, this is not an error.
+ // But further code does not expect NULL nodes.
+ kv_drop(ast_stack, 1);
+ goto viml_pexpr_parse_no_paren_closing_error;
+ }
+ }
+ ERROR_FROM_TOKEN_AND_MSG(
+ cur_token, _("E15: Expected value, got parenthesis: %.*s"));
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeMissing);
+ cur_node->len = 0;
+ *top_node_p = cur_node;
+ } else {
+ // Always drop the topmost value: when want_node != kENodeValue
+ // topmost item on stack is a *finished* left operand, which may as
+ // well be "(@a)" which needs not be finished again.
+ kv_drop(ast_stack, 1);
+ }
+viml_pexpr_parse_no_paren_closing_error: {}
+ ExprASTNode **new_top_node_p = NULL;
+ while (kv_size(ast_stack)
+ && (new_top_node_p == NULL
+ || ((*new_top_node_p)->type != kExprNodeNested
+ && (*new_top_node_p)->type != kExprNodeCall))) {
+ new_top_node_p = kv_pop(ast_stack);
+ }
+ if (new_top_node_p != NULL
+ && ((*new_top_node_p)->type == kExprNodeNested
+ || (*new_top_node_p)->type == kExprNodeCall)) {
+ if ((*new_top_node_p)->type == kExprNodeNested) {
+ HL_CUR_TOKEN(NestingParenthesis);
+ } else {
+ HL_CUR_TOKEN(CallingParenthesis);
+ }
+ } else {
+ // โ€œAlways drop the topmost valueโ€ branch has got rid of the single
+ // value stack had, so there is nothing known to enclose. Correct
+ // this.
+ if (new_top_node_p == NULL) {
+ new_top_node_p = top_node_p;
+ }
+ ERROR_FROM_TOKEN_AND_MSG(
+ cur_token, _("E15: Unexpected closing parenthesis: %.*s"));
+ HL_CUR_TOKEN(NestingParenthesis);
+ cur_node = NEW_NODE(kExprNodeNested);
+ cur_node->start = cur_token.start;
+ cur_node->len = 0;
+ // Unexpected closing parenthesis, assume that it was wanted to
+ // enclose everything in ().
+ cur_node->children = *new_top_node_p;
+ *new_top_node_p = cur_node;
+ assert(cur_node->next == NULL);
+ }
+ kvi_push(ast_stack, new_top_node_p);
+ want_node = kENodeOperator;
+ } else {
+ switch (want_node) {
+ case kENodeValue: {
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeNested);
+ *top_node_p = cur_node;
+ kvi_push(ast_stack, &cur_node->children);
+ HL_CUR_TOKEN(NestingParenthesis);
+ break;
+ }
+ case kENodeOperator: {
+ if (prev_token.type == kExprLexSpacing) {
+ // For some reason "function (args)" is a function call, but
+ // "(funcref) (args)" is not. AFAIR this somehow involves
+ // compatibility and Bram was commenting that this is
+ // intentionally inconsistent and he is not very happy with the
+ // situation himself.
+ if ((*top_node_p)->type != kExprNodePlainIdentifier
+ && (*top_node_p)->type != kExprNodeComplexIdentifier
+ && (*top_node_p)->type != kExprNodeCurlyBracesIdentifier) {
+ OP_MISSING;
+ }
+ }
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeCall);
+ ADD_OP_NODE(cur_node);
+ HL_CUR_TOKEN(CallingParenthesis);
+ break;
+ }
+ }
+ want_node = kENodeValue;
+ }
+ break;
+ }
+ case kExprLexQuestion: {
+ ADD_VALUE_IF_MISSING(_("E15: Expected value, got question mark: %.*s"));
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeTernary);
+ ADD_OP_NODE(cur_node);
+ HL_CUR_TOKEN(Ternary);
+ ExprASTNode *ter_val_node;
+ NEW_NODE_WITH_CUR_POS(ter_val_node, kExprNodeTernaryValue);
+ ter_val_node->data.ter.got_colon = false;
+ assert(cur_node->children != NULL);
+ assert(cur_node->children->next == NULL);
+ assert(kv_last(ast_stack) == &cur_node->children->next);
+ *kv_last(ast_stack) = ter_val_node;
+ kvi_push(ast_stack, &ter_val_node->children);
+ break;
+ }
+ case kExprLexDoubleQuotedString:
+ case kExprLexSingleQuotedString: {
+ const bool is_double = (tok_type == kExprLexDoubleQuotedString);
+ if (!cur_token.data.str.closed) {
+ // It is weird, but Vim has two identical errors messages with
+ // different error numbers: "E114: Missing quote" and
+ // "E115: Missing quote".
+ ERROR_FROM_TOKEN_AND_MSG(
+ cur_token, (is_double
+ ? _("E114: Missing double quote: %.*s")
+ : _("E115: Missing single quote: %.*s")));
+ }
+ if (want_node == kENodeOperator) {
+ OP_MISSING;
+ }
+ NEW_NODE_WITH_CUR_POS(
+ cur_node, (is_double
+ ? kExprNodeDoubleQuotedString
+ : kExprNodeSingleQuotedString));
+ *top_node_p = cur_node;
+ parse_quoted_string(pstate, cur_node, cur_token, ast_stack, is_invalid);
+ want_node = kENodeOperator;
+ break;
+ }
+ case kExprLexAssignment: {
+ if (cur_pt == kEPTAssignment) {
+ kv_drop(pt_stack, 1);
+ } else if (cur_pt == kEPTSingleAssignment) {
+ kv_drop(pt_stack, 2);
+ ERROR_FROM_TOKEN_AND_MSG(
+ cur_token,
+ _("E475: Expected closing bracket to end list assignment "
+ "lvalue: %.*s"));
+ } else {
+ ERROR_FROM_TOKEN_AND_MSG(
+ cur_token, _("E15: Misplaced assignment: %.*s"));
+ }
+ assert(kv_size(pt_stack));
+ assert(kv_last(pt_stack) == kEPTExpr);
+ ADD_VALUE_IF_MISSING(_("E15: Unexpected assignment: %.*s"));
+ NEW_NODE_WITH_CUR_POS(cur_node, kExprNodeAssignment);
+ cur_node->data.ass.type = cur_token.data.ass.type;
+ switch (cur_token.data.ass.type) {
+#define HL_ASGN(asgn, hl) \
+ case kExprAsgn##asgn: { HL_CUR_TOKEN(hl); break; }
+ HL_ASGN(Plain, PlainAssignment)
+ HL_ASGN(Add, AssignmentWithAddition)
+ HL_ASGN(Subtract, AssignmentWithSubtraction)
+ HL_ASGN(Concat, AssignmentWithConcatenation)
+#undef HL_ASGN
+ }
+ ADD_OP_NODE(cur_node);
+ break;
+ }
+ }
+viml_pexpr_parse_cycle_end:
+ prev_token = cur_token;
+ highlighted_prev_spacing = false;
+ viml_parser_advance(pstate, cur_token.len);
+ } while (true);
+viml_pexpr_parse_end:
+ assert(kv_size(pt_stack));
+ assert(kv_size(ast_stack));
+ if (want_node == kENodeValue
+ // Blacklist some parse type entries as their presence means better error
+ // message in the other branch.
+ && kv_last(pt_stack) != kEPTLambdaArguments) {
+ east_set_error(pstate, &ast.err, _("E15: Expected value, got EOC: %.*s"),
+ pstate->pos);
+ } else if (kv_size(ast_stack) != 1) {
+ // Something may be wrong, check whether it really is.
+
+ // Pointer to ast.root must never be dropped, so โ€œ!= 1โ€ is expected to be
+ // the same as โ€œ> 1โ€.
+ assert(kv_size(ast_stack));
+ // Topmost stack item must be a *finished* value, so it must not be
+ // analyzed. E.g. it may contain an already finished nested expression.
+ kv_drop(ast_stack, 1);
+ while (ast.err.msg == NULL && kv_size(ast_stack)) {
+ const ExprASTNode *const cur_node = (*kv_pop(ast_stack));
+ // This should only happen when want_node == kENodeValue.
+ assert(cur_node != NULL);
+ // TODO(ZyX-I): Rehighlight as invalid?
+ switch (cur_node->type) {
+ case kExprNodeOpMissing:
+ case kExprNodeMissing: {
+ // Error shouldโ€™ve been already reported.
+ break;
+ }
+ case kExprNodeCall: {
+ east_set_error(
+ pstate, &ast.err,
+ _("E116: Missing closing parenthesis for function call: %.*s"),
+ cur_node->start);
+ break;
+ }
+ case kExprNodeNested: {
+ east_set_error(
+ pstate, &ast.err,
+ _("E110: Missing closing parenthesis for nested expression"
+ ": %.*s"),
+ cur_node->start);
+ break;
+ }
+ case kExprNodeListLiteral: {
+ // For whatever reason "[1" yields "E696: Missing comma in list" error
+ // in Vim while "[1," yields E697.
+ east_set_error(
+ pstate, &ast.err,
+ _("E697: Missing end of List ']': %.*s"),
+ cur_node->start);
+ break;
+ }
+ case kExprNodeDictLiteral: {
+ // Same problem like with list literal with E722 (missing comma) vs
+ // E723, but additionally just "{" yields only E15.
+ east_set_error(
+ pstate, &ast.err,
+ _("E723: Missing end of Dictionary '}': %.*s"),
+ cur_node->start);
+ break;
+ }
+ case kExprNodeUnknownFigure: {
+ east_set_error(
+ pstate, &ast.err,
+ _("E15: Missing closing figure brace: %.*s"),
+ cur_node->start);
+ break;
+ }
+ case kExprNodeLambda: {
+ east_set_error(
+ pstate, &ast.err,
+ _("E15: Missing closing figure brace for lambda: %.*s"),
+ cur_node->start);
+ break;
+ }
+ case kExprNodeCurlyBracesIdentifier: {
+ // Until trailing "}" it is impossible to distinguish curly braces
+ // identifier and dictionary, so it must not appear in the stack like
+ // this.
+ assert(false);
+ }
+ case kExprNodeInteger:
+ case kExprNodeFloat:
+ case kExprNodeSingleQuotedString:
+ case kExprNodeDoubleQuotedString:
+ case kExprNodeOption:
+ case kExprNodeEnvironment:
+ case kExprNodeRegister:
+ case kExprNodePlainIdentifier:
+ case kExprNodePlainKey: {
+ // These are plain values and not containers, for them it should only
+ // be possible to show up in the topmost stack element, but it was
+ // unconditionally popped at the start.
+ assert(false);
+ }
+ case kExprNodeComma:
+ case kExprNodeColon:
+ case kExprNodeArrow: {
+ // It is actually only valid inside something else, but everything
+ // where one of the above is valid requires to be closed and thus is
+ // to be caught later.
+ break;
+ }
+ case kExprNodeSubscript:
+ case kExprNodeConcatOrSubscript:
+ case kExprNodeComplexIdentifier:
+ case kExprNodeAssignment:
+ case kExprNodeMod:
+ case kExprNodeDivision:
+ case kExprNodeMultiplication:
+ case kExprNodeNot:
+ case kExprNodeAnd:
+ case kExprNodeOr:
+ case kExprNodeConcat:
+ case kExprNodeComparison:
+ case kExprNodeUnaryMinus:
+ case kExprNodeUnaryPlus:
+ case kExprNodeBinaryMinus:
+ case kExprNodeTernary:
+ case kExprNodeBinaryPlus: {
+ // It is OK to see these in the stack.
+ break;
+ }
+ case kExprNodeTernaryValue: {
+ if (!cur_node->data.ter.got_colon) {
+ // Actually Vim throws E109 in more cases.
+ east_set_error(
+ pstate, &ast.err, _("E109: Missing ':' after '?': %.*s"),
+ cur_node->start);
+ }
+ break;
+ }
+ }
+ }
+ }
+ kvi_destroy(ast_stack);
+ return ast;
+} // NOLINT(readability/fn_size)
+
+#undef NEW_NODE
+#undef HL
diff --git a/src/nvim/viml/parser/expressions.h b/src/nvim/viml/parser/expressions.h
new file mode 100644
index 0000000000..23e172da75
--- /dev/null
+++ b/src/nvim/viml/parser/expressions.h
@@ -0,0 +1,389 @@
+#ifndef NVIM_VIML_PARSER_EXPRESSIONS_H
+#define NVIM_VIML_PARSER_EXPRESSIONS_H
+
+#include <stddef.h>
+#include <stdint.h>
+#include <stdbool.h>
+
+#include "nvim/types.h"
+#include "nvim/viml/parser/parser.h"
+#include "nvim/eval/typval.h"
+
+// Defines whether to ignore case:
+// == kCCStrategyUseOption
+// ==# kCCStrategyMatchCase
+// ==? kCCStrategyIgnoreCase
+typedef enum {
+ kCCStrategyUseOption = 0, // 0 for xcalloc
+ kCCStrategyMatchCase = '#',
+ kCCStrategyIgnoreCase = '?',
+} ExprCaseCompareStrategy;
+
+/// Lexer token type
+typedef enum {
+ kExprLexInvalid = 0, ///< Invalid token, indicaten an error.
+ kExprLexMissing, ///< Missing token, for use in parser.
+ kExprLexSpacing, ///< Spaces, tabs, newlines, etc.
+ kExprLexEOC, ///< End of command character: NL, |, just end of stream.
+
+ kExprLexQuestion, ///< Question mark, for use in ternary.
+ kExprLexColon, ///< Colon, for use in ternary.
+ kExprLexOr, ///< Logical or operator.
+ kExprLexAnd, ///< Logical and operator.
+ kExprLexComparison, ///< One of the comparison operators.
+ kExprLexPlus, ///< Plus sign.
+ kExprLexMinus, ///< Minus sign.
+ kExprLexDot, ///< Dot: either concat or subscript, also part of the float.
+ kExprLexMultiplication, ///< Multiplication, division or modulo operator.
+
+ kExprLexNot, ///< Not: !.
+
+ kExprLexNumber, ///< Integer number literal, or part of a float.
+ kExprLexSingleQuotedString, ///< Single quoted string literal.
+ kExprLexDoubleQuotedString, ///< Double quoted string literal.
+ kExprLexOption, ///< &optionname option value.
+ kExprLexRegister, ///< @r register value.
+ kExprLexEnv, ///< Environment $variable value.
+ kExprLexPlainIdentifier, ///< Identifier without scope: `abc`, `foo#bar`.
+
+ kExprLexBracket, ///< Bracket, either opening or closing.
+ kExprLexFigureBrace, ///< Figure brace, either opening or closing.
+ kExprLexParenthesis, ///< Parenthesis, either opening or closing.
+ kExprLexComma, ///< Comma.
+ kExprLexArrow, ///< Arrow, like from lambda expressions.
+ kExprLexAssignment, ///< Assignment: `=` or `{op}=`.
+ // XXX When modifying this enum you need to also modify eltkn_type_tab in
+ // expressions.c and tests and, possibly, viml_pexpr_repr_token.
+} LexExprTokenType;
+
+typedef enum {
+ kExprCmpEqual, ///< Equality, unequality.
+ kExprCmpMatches, ///< Matches regex, not matches regex.
+ kExprCmpGreater, ///< `>` or `<=`
+ kExprCmpGreaterOrEqual, ///< `>=` or `<`.
+ kExprCmpIdentical, ///< `is` or `isnot`
+} ExprComparisonType;
+
+/// All possible option scopes
+typedef enum {
+ kExprOptScopeUnspecified = 0,
+ kExprOptScopeGlobal = 'g',
+ kExprOptScopeLocal = 'l',
+} ExprOptScope;
+
+/// All possible assignment types: `=` and `{op}=`.
+typedef enum {
+ kExprAsgnPlain = 0, ///< Plain assignment: `=`.
+ kExprAsgnAdd, ///< Assignment augmented with addition: `+=`.
+ kExprAsgnSubtract, ///< Assignment augmented with subtraction: `-=`.
+ kExprAsgnConcat, ///< Assignment augmented with concatenation: `.=`.
+} ExprAssignmentType;
+
+#define EXPR_OPT_SCOPE_LIST \
+ ((char[]){ kExprOptScopeGlobal, kExprOptScopeLocal })
+
+/// All possible variable scopes
+typedef enum {
+ kExprVarScopeMissing = 0,
+ kExprVarScopeScript = 's',
+ kExprVarScopeGlobal = 'g',
+ kExprVarScopeVim = 'v',
+ kExprVarScopeBuffer = 'b',
+ kExprVarScopeWindow = 'w',
+ kExprVarScopeTabpage = 't',
+ kExprVarScopeLocal = 'l',
+ kExprVarScopeArguments = 'a',
+} ExprVarScope;
+
+#define EXPR_VAR_SCOPE_LIST \
+ ((char[]) { \
+ kExprVarScopeScript, kExprVarScopeGlobal, kExprVarScopeVim, \
+ kExprVarScopeBuffer, kExprVarScopeWindow, kExprVarScopeTabpage, \
+ kExprVarScopeLocal, kExprVarScopeBuffer, kExprVarScopeArguments, \
+ })
+
+/// Lexer token
+typedef struct {
+ ParserPosition start;
+ size_t len;
+ LexExprTokenType type;
+ union {
+ struct {
+ ExprComparisonType type; ///< Comparison type.
+ ExprCaseCompareStrategy ccs; ///< Case comparison strategy.
+ bool inv; ///< True if comparison is to be inverted.
+ } cmp; ///< For kExprLexComparison.
+
+ struct {
+ enum {
+ kExprLexMulMul, ///< Real multiplication.
+ kExprLexMulDiv, ///< Division.
+ kExprLexMulMod, ///< Modulo.
+ } type; ///< Multiplication type.
+ } mul; ///< For kExprLexMultiplication.
+
+ struct {
+ bool closing; ///< True if bracket/etc is a closing one.
+ } brc; ///< For brackets/braces/parenthesis.
+
+ struct {
+ int name; ///< Register name, may be -1 if name not present.
+ } reg; ///< For kExprLexRegister.
+
+ struct {
+ bool closed; ///< True if quote was closed.
+ } str; ///< For kExprLexSingleQuotedString and kExprLexDoubleQuotedString.
+
+ struct {
+ const char *name; ///< Option name start.
+ size_t len; ///< Option name length.
+ ExprOptScope scope; ///< Option scope: &l:, &g: or not specified.
+ } opt; ///< Option properties.
+
+ struct {
+ ExprVarScope scope; ///< Scope character or 0 if not present.
+ bool autoload; ///< Has autoload characters.
+ } var; ///< For kExprLexPlainIdentifier
+
+ struct {
+ LexExprTokenType type; ///< Suggested type for parsing incorrect code.
+ const char *msg; ///< Error message.
+ } err; ///< For kExprLexInvalid
+
+ struct {
+ union {
+ float_T floating;
+ uvarnumber_T integer;
+ } val; ///< Number value.
+ uint8_t base; ///< Base: 2, 8, 10 or 16.
+ bool is_float; ///< True if number is a floating-point.
+ } num; ///< For kExprLexNumber
+
+ struct {
+ ExprAssignmentType type;
+ } ass; ///< For kExprLexAssignment
+ } data; ///< Additional data, if needed.
+} LexExprToken;
+
+typedef enum {
+ /// If set, โ€œpointerโ€ to the current byte in pstate will not be shifted
+ kELFlagPeek = (1 << 0),
+ /// Determines whether scope is allowed to come before the identifier
+ kELFlagForbidScope = (1 << 1),
+ /// Determines whether floating-point numbers are allowed
+ ///
+ /// I.e. whether dot is a decimal point separator or is not a part of
+ /// a number at all.
+ kELFlagAllowFloat = (1 << 2),
+ /// Determines whether `is` and `isnot` are seen as comparison operators
+ ///
+ /// If set they are supposed to be just regular identifiers.
+ kELFlagIsNotCmp = (1 << 3),
+ /// Determines whether EOC tokens are allowed
+ ///
+ /// If set then it will yield Invalid token with E15 in place of EOC one if
+ /// โ€œEOCโ€ is something like "|". It is fine with emitting EOC at the end of
+ /// string still, with or without this flag set.
+ kELFlagForbidEOC = (1 << 4),
+ // XXX Whenever you add a new flag, alter klee_assume() statement in
+ // viml_expressions_lexer.c.
+} LexExprFlags;
+
+/// Expression AST node type
+typedef enum {
+ kExprNodeMissing = 0,
+ kExprNodeOpMissing,
+ kExprNodeTernary, ///< Ternary operator.
+ kExprNodeTernaryValue, ///< Ternary operator, colon.
+ kExprNodeRegister, ///< Register.
+ kExprNodeSubscript, ///< Subscript.
+ kExprNodeListLiteral, ///< List literal.
+ kExprNodeUnaryPlus,
+ kExprNodeBinaryPlus,
+ kExprNodeNested, ///< Nested parenthesised expression.
+ kExprNodeCall, ///< Function call.
+ /// Plain identifier: simple variable/function name
+ ///
+ /// Looks like "string", "g:Foo", etc: consists from a single
+ /// kExprLexPlainIdentifier token.
+ kExprNodePlainIdentifier,
+ /// Plain dictionary key, for use with kExprNodeConcatOrSubscript
+ kExprNodePlainKey,
+ /// Complex identifier: variable/function name with curly braces
+ kExprNodeComplexIdentifier,
+ /// Figure brace expression which is not yet known
+ ///
+ /// May resolve to any of kExprNodeDictLiteral, kExprNodeLambda or
+ /// kExprNodeCurlyBracesIdentifier.
+ kExprNodeUnknownFigure,
+ kExprNodeLambda, ///< Lambda.
+ kExprNodeDictLiteral, ///< Dictionary literal.
+ kExprNodeCurlyBracesIdentifier, ///< Part of the curly braces name.
+ kExprNodeComma, ///< Comma โ€œoperatorโ€.
+ kExprNodeColon, ///< Colon โ€œoperatorโ€.
+ kExprNodeArrow, ///< Arrow โ€œoperatorโ€.
+ kExprNodeComparison, ///< Various comparison operators.
+ /// Concat operator
+ ///
+ /// To be only used in cases when it is known for sure it is not a subscript.
+ kExprNodeConcat,
+ /// Concat or subscript operator
+ ///
+ /// For cases when it is not obvious whether expression is a concat or
+ /// a subscript. May only have either number or plain identifier as the second
+ /// child. To make it easier to avoid curly braces in place of
+ /// kExprNodePlainIdentifier node kExprNodePlainKey is used.
+ kExprNodeConcatOrSubscript,
+ kExprNodeInteger, ///< Integral number.
+ kExprNodeFloat, ///< Floating-point number.
+ kExprNodeSingleQuotedString,
+ kExprNodeDoubleQuotedString,
+ kExprNodeOr,
+ kExprNodeAnd,
+ kExprNodeUnaryMinus,
+ kExprNodeBinaryMinus,
+ kExprNodeNot,
+ kExprNodeMultiplication,
+ kExprNodeDivision,
+ kExprNodeMod,
+ kExprNodeOption,
+ kExprNodeEnvironment,
+ kExprNodeAssignment,
+ // XXX When modifying this list also modify east_node_type_tab both in parser
+ // and in tests, and you most likely will also have to alter list of
+ // highlight groups stored in highlight_init_cmdline variable.
+} ExprASTNodeType;
+
+typedef struct expr_ast_node ExprASTNode;
+
+/// Structure representing one AST node
+struct expr_ast_node {
+ ExprASTNodeType type; ///< Node type.
+ /// Node children: e.g. for 1 + 2 nodes 1 and 2 will be children of +.
+ ExprASTNode *children;
+ /// Next node: e.g. for 1 + 2 child nodes 1 and 2 are put into a single-linked
+ /// list: `(+)->children` references only node 1, node 2 is in
+ /// `(+)->children->next`.
+ ExprASTNode *next;
+ ParserPosition start;
+ size_t len;
+ union {
+ struct {
+ int name; ///< Register name, may be -1 if name not present.
+ } reg; ///< For kExprNodeRegister.
+ struct {
+ /// Which nodes UnknownFigure canโ€™t possibly represent.
+ struct {
+ /// True if UnknownFigure may actually represent dictionary literal.
+ bool allow_dict;
+ /// True if UnknownFigure may actually represent lambda.
+ bool allow_lambda;
+ /// True if UnknownFigure may actually be part of curly braces name.
+ bool allow_ident;
+ } type_guesses;
+ /// Highlight chunk index, used for rehighlighting if needed
+ size_t opening_hl_idx;
+ } fig; ///< For kExprNodeUnknownFigure.
+ struct {
+ ExprVarScope scope; ///< Scope character or 0 if not present.
+ /// Actual identifier without scope.
+ ///
+ /// Points to inside parser reader state.
+ const char *ident;
+ size_t ident_len; ///< Actual identifier length.
+ } var; ///< For kExprNodePlainIdentifier and kExprNodePlainKey.
+ struct {
+ bool got_colon; ///< True if colon was seen.
+ } ter; ///< For kExprNodeTernaryValue.
+ struct {
+ ExprComparisonType type; ///< Comparison type.
+ ExprCaseCompareStrategy ccs; ///< Case comparison strategy.
+ bool inv; ///< True if comparison is to be inverted.
+ } cmp; ///< For kExprNodeComparison.
+ struct {
+ uvarnumber_T value;
+ } num; ///< For kExprNodeInteger.
+ struct {
+ float_T value;
+ } flt; ///< For kExprNodeFloat.
+ struct {
+ char *value;
+ size_t size;
+ } str; ///< For kExprNodeSingleQuotedString and
+ ///< kExprNodeDoubleQuotedString.
+ struct {
+ const char *ident; ///< Option name start.
+ size_t ident_len; ///< Option name length.
+ ExprOptScope scope; ///< Option scope: &l:, &g: or not specified.
+ } opt; ///< For kExprNodeOption.
+ struct {
+ const char *ident; ///< Environment variable name start.
+ size_t ident_len; ///< Environment variable name length.
+ } env; ///< For kExprNodeEnvironment.
+ struct {
+ ExprAssignmentType type;
+ } ass; ///< For kExprNodeAssignment
+ } data;
+};
+
+enum {
+ /// Allow multiple expressions in a row: e.g. for :echo
+ ///
+ /// Parser will still parse only one of them though.
+ kExprFlagsMulti = (1 << 0),
+ /// Allow NL, NUL and bar to be EOC
+ ///
+ /// When parsing expressions input by user bar is assumed to be a binary
+ /// operator and other two are spacings.
+ kExprFlagsDisallowEOC = (1 << 1),
+ /// Parse :let argument
+ ///
+ /// That mean that top level node must be an assignment and first nodes
+ /// belong to lvalues.
+ kExprFlagsParseLet = (1 << 2),
+ // XXX whenever you add a new flag, alter klee_assume() statement in
+ // viml_expressions_parser.c, nvim_parse_expression() flags parsing
+ // alongside with its documentation and flag sets in check_parsing()
+ // function in expressions parser functional and unit tests.
+} ExprParserFlags;
+
+/// AST error definition
+typedef struct {
+ /// Error message. Must contain a single printf format atom: %.*s.
+ const char *msg;
+ /// Error message argument: points to the location of the error.
+ const char *arg;
+ /// Message argument length: length till the end of string.
+ int arg_len;
+} ExprASTError;
+
+/// Structure representing complety AST for one expression
+typedef struct {
+ /// When AST is not correct this message will be printed.
+ ///
+ /// Uses `emsgf(msg, arg_len, arg);`, `msg` is assumed to contain only `%.*s`.
+ ExprASTError err;
+ /// Root node of the AST.
+ ExprASTNode *root;
+} ExprAST;
+
+/// Array mapping ExprASTNodeType to maximum amount of children node may have
+extern const uint8_t node_maxchildren[];
+
+/// Array mapping ExprASTNodeType values to their stringified versions
+extern const char *const east_node_type_tab[];
+
+/// Array mapping ExprComparisonType values to their stringified versions
+extern const char *const eltkn_cmp_type_tab[];
+
+/// Array mapping ExprCaseCompareStrategy values to their stringified versions
+extern const char *const ccs_tab[];
+
+/// Array mapping ExprAssignmentType values to their stringified versions
+extern const char *const expr_asgn_type_tab[];
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "viml/parser/expressions.h.generated.h"
+#endif
+
+#endif // NVIM_VIML_PARSER_EXPRESSIONS_H
diff --git a/src/nvim/viml/parser/parser.c b/src/nvim/viml/parser/parser.c
new file mode 100644
index 0000000000..8d26d08ea7
--- /dev/null
+++ b/src/nvim/viml/parser/parser.c
@@ -0,0 +1,16 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+#include "nvim/viml/parser/parser.h"
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "viml/parser/parser.c.generated.h"
+#endif
+
+
+void parser_simple_get_line(void *cookie, ParserLine *ret_pline)
+{
+ ParserLine **plines_p = (ParserLine **)cookie;
+ *ret_pline = **plines_p;
+ (*plines_p)++;
+}
diff --git a/src/nvim/viml/parser/parser.h b/src/nvim/viml/parser/parser.h
new file mode 100644
index 0000000000..7ac49709d8
--- /dev/null
+++ b/src/nvim/viml/parser/parser.h
@@ -0,0 +1,244 @@
+#ifndef NVIM_VIML_PARSER_PARSER_H
+#define NVIM_VIML_PARSER_PARSER_H
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <assert.h>
+
+#include "nvim/lib/kvec.h"
+#include "nvim/func_attr.h"
+#include "nvim/mbyte.h"
+#include "nvim/memory.h"
+
+/// One parsed line
+typedef struct {
+ const char *data; ///< Parsed line pointer
+ size_t size; ///< Parsed line size
+ bool allocated; ///< True if line may be freed.
+} ParserLine;
+
+/// Line getter type for parser
+///
+/// Line getter must return {NULL, 0} for EOF.
+typedef void (*ParserLineGetter)(void *cookie, ParserLine *ret_pline);
+
+/// Parser position in the input
+typedef struct {
+ size_t line; ///< Line index in ParserInputReader.lines.
+ size_t col; ///< Byte index in the line.
+} ParserPosition;
+
+/// Parser state item.
+typedef struct {
+ enum {
+ kPTopStateParsingCommand = 0,
+ kPTopStateParsingExpression,
+ } type;
+ union {
+ struct {
+ enum {
+ kExprUnknown = 0,
+ } type;
+ } expr;
+ } data;
+} ParserStateItem;
+
+/// Structure defining input reader
+typedef struct {
+ /// Function used to get next line.
+ ParserLineGetter get_line;
+ /// Data for get_line function.
+ void *cookie;
+ /// All lines obtained by get_line.
+ kvec_withinit_t(ParserLine, 4) lines;
+ /// Conversion, for :scriptencoding.
+ vimconv_T conv;
+} ParserInputReader;
+
+/// Highlighted region definition
+///
+/// Note: one chunk may highlight only one line.
+typedef struct {
+ ParserPosition start; ///< Start of the highlight: line and column.
+ size_t end_col; ///< End column, points to the start of the next character.
+ const char *group; ///< Highlight group.
+} ParserHighlightChunk;
+
+/// Highlighting defined by a parser
+typedef kvec_withinit_t(ParserHighlightChunk, 16) ParserHighlight;
+
+/// Structure defining parser state
+typedef struct {
+ /// Line reader.
+ ParserInputReader reader;
+ /// Position up to which input was parsed.
+ ParserPosition pos;
+ /// Parser state stack.
+ kvec_withinit_t(ParserStateItem, 16) stack;
+ /// Highlighting support.
+ ParserHighlight *colors;
+ /// True if line continuation can be used.
+ bool can_continuate;
+} ParserState;
+
+static inline void viml_parser_init(
+ ParserState *const ret_pstate,
+ const ParserLineGetter get_line, void *const cookie,
+ ParserHighlight *const colors)
+ REAL_FATTR_ALWAYS_INLINE REAL_FATTR_NONNULL_ARG(1, 2);
+
+/// Initialize a new parser state instance
+///
+/// @param[out] ret_pstate Parser state to initialize.
+/// @param[in] get_line Line getter function.
+/// @param[in] cookie Argument for the get_line function.
+/// @param[in] colors Where to save highlighting. May be NULL if it is not
+/// needed.
+static inline void viml_parser_init(
+ ParserState *const ret_pstate,
+ const ParserLineGetter get_line, void *const cookie,
+ ParserHighlight *const colors)
+{
+ *ret_pstate = (ParserState) {
+ .reader = {
+ .get_line = get_line,
+ .cookie = cookie,
+ .conv = MBYTE_NONE_CONV,
+ },
+ .pos = { 0, 0 },
+ .colors = colors,
+ .can_continuate = false,
+ };
+ kvi_init(ret_pstate->reader.lines);
+ kvi_init(ret_pstate->stack);
+}
+
+static inline void viml_parser_destroy(ParserState *const pstate)
+ REAL_FATTR_NONNULL_ALL REAL_FATTR_ALWAYS_INLINE;
+
+/// Free all memory allocated by the parser on heap
+///
+/// @param pstate Parser state to free.
+static inline void viml_parser_destroy(ParserState *const pstate)
+{
+ for (size_t i = 0; i < kv_size(pstate->reader.lines); i++) {
+ ParserLine pline = kv_A(pstate->reader.lines, i);
+ if (pline.allocated) {
+ xfree((void *)pline.data);
+ }
+ }
+ kvi_destroy(pstate->reader.lines);
+ kvi_destroy(pstate->stack);
+}
+
+static inline void viml_preader_get_line(ParserInputReader *const preader,
+ ParserLine *const ret_pline)
+ REAL_FATTR_NONNULL_ALL;
+
+/// Get one line from ParserInputReader
+static inline void viml_preader_get_line(ParserInputReader *const preader,
+ ParserLine *const ret_pline)
+{
+ ParserLine pline;
+ preader->get_line(preader->cookie, &pline);
+ if (preader->conv.vc_type != CONV_NONE && pline.size) {
+ ParserLine cpline = {
+ .allocated = true,
+ .size = pline.size,
+ };
+ cpline.data = (char *)string_convert(&preader->conv,
+ (char_u *)pline.data,
+ &cpline.size);
+ if (pline.allocated) {
+ xfree((void *)pline.data);
+ }
+ pline = cpline;
+ }
+ kvi_push(preader->lines, pline);
+ *ret_pline = pline;
+}
+
+static inline bool viml_parser_get_remaining_line(ParserState *const pstate,
+ ParserLine *const ret_pline)
+ REAL_FATTR_ALWAYS_INLINE REAL_FATTR_WARN_UNUSED_RESULT REAL_FATTR_NONNULL_ALL;
+
+/// Get currently parsed line, shifted to pstate->pos.col
+///
+/// @param pstate Parser state to operate on.
+///
+/// @return True if there is a line, false in case of EOF.
+static inline bool viml_parser_get_remaining_line(ParserState *const pstate,
+ ParserLine *const ret_pline)
+{
+ const size_t num_lines = kv_size(pstate->reader.lines);
+ if (pstate->pos.line == num_lines) {
+ viml_preader_get_line(&pstate->reader, ret_pline);
+ } else {
+ *ret_pline = kv_last(pstate->reader.lines);
+ }
+ assert(pstate->pos.line == kv_size(pstate->reader.lines) - 1);
+ if (ret_pline->data != NULL) {
+ ret_pline->data += pstate->pos.col;
+ ret_pline->size -= pstate->pos.col;
+ }
+ return ret_pline->data != NULL;
+}
+
+static inline void viml_parser_advance(ParserState *const pstate,
+ const size_t len)
+ REAL_FATTR_ALWAYS_INLINE REAL_FATTR_NONNULL_ALL;
+
+/// Advance position by a given number of bytes
+///
+/// At maximum advances to the next line.
+///
+/// @param pstate Parser state to advance.
+/// @param[in] len Number of bytes to advance.
+static inline void viml_parser_advance(ParserState *const pstate,
+ const size_t len)
+{
+ assert(pstate->pos.line == kv_size(pstate->reader.lines) - 1);
+ const ParserLine pline = kv_last(pstate->reader.lines);
+ if (pstate->pos.col + len >= pline.size) {
+ pstate->pos.line++;
+ pstate->pos.col = 0;
+ } else {
+ pstate->pos.col += len;
+ }
+}
+
+static inline void viml_parser_highlight(ParserState *const pstate,
+ const ParserPosition start,
+ const size_t end_col,
+ const char *const group)
+ REAL_FATTR_ALWAYS_INLINE REAL_FATTR_NONNULL_ALL;
+
+/// Record highlighting of some region of text
+///
+/// @param pstate Parser state to work with.
+/// @param[in] start Start position of the highlight.
+/// @param[in] len Highlighting chunk length.
+/// @param[in] group Highlight group.
+static inline void viml_parser_highlight(ParserState *const pstate,
+ const ParserPosition start,
+ const size_t len,
+ const char *const group)
+{
+ if (pstate->colors == NULL || len == 0) {
+ return;
+ }
+ assert(kv_size(*pstate->colors) == 0
+ || kv_Z(*pstate->colors, 0).start.line < start.line
+ || kv_Z(*pstate->colors, 0).end_col <= start.col);
+ kvi_push(*pstate->colors, ((ParserHighlightChunk) {
+ .start = start,
+ .end_col = start.col + len,
+ .group = group,
+ }));
+}
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "viml/parser/parser.h.generated.h"
+#endif
+
+#endif // NVIM_VIML_PARSER_PARSER_H
diff --git a/src/nvim/window.c b/src/nvim/window.c
index 1298248f1e..3cadfe612a 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <assert.h>
#include <inttypes.h>
#include <stdbool.h>
@@ -28,7 +31,6 @@
#include "nvim/memory.h"
#include "nvim/message.h"
#include "nvim/misc1.h"
-#include "nvim/misc2.h"
#include "nvim/file_search.h"
#include "nvim/garray.h"
#include "nvim/move.h"
@@ -41,10 +43,12 @@
#include "nvim/regexp.h"
#include "nvim/screen.h"
#include "nvim/search.h"
+#include "nvim/state.h"
#include "nvim/strings.h"
#include "nvim/syntax.h"
#include "nvim/terminal.h"
#include "nvim/undo.h"
+#include "nvim/ui.h"
#include "nvim/os/os.h"
@@ -129,9 +133,10 @@ newwindow:
vim_snprintf(cbuf, sizeof(cbuf) - 5, "%" PRId64, (int64_t)Prenum);
else
cbuf[0] = NUL;
- if (nchar == 'v' || nchar == Ctrl_V)
- strcat(cbuf, "v");
- strcat(cbuf, "new");
+ if (nchar == 'v' || nchar == Ctrl_V) {
+ xstrlcat(cbuf, "v", sizeof(cbuf));
+ }
+ xstrlcat(cbuf, "new", sizeof(cbuf));
do_cmdline_cmd(cbuf);
break;
@@ -160,13 +165,18 @@ newwindow:
/* cursor to preview window */
case 'P':
- for (wp = firstwin; wp != NULL; wp = wp->w_next)
- if (wp->w_p_pvw)
+ wp = NULL;
+ FOR_ALL_WINDOWS_IN_TAB(wp2, curtab) {
+ if (wp2->w_p_pvw) {
+ wp = wp2;
break;
- if (wp == NULL)
+ }
+ }
+ if (wp == NULL) {
EMSG(_("E441: There is no preview window"));
- else
+ } else {
win_goto(wp);
+ }
break;
/* close all but current window */
@@ -183,7 +193,7 @@ newwindow:
/* cursor to previous window with wrap around */
case 'W':
CHECK_CMDWIN
- if (firstwin == lastwin && Prenum != 1) /* just one window */
+ if (ONE_WINDOW && Prenum != 1) /* just one window */
beep_flush();
else {
if (Prenum) { /* go to specified window */
@@ -278,10 +288,11 @@ newwindow:
/* cursor to last accessed (previous) window */
case 'p':
case Ctrl_P:
- if (prevwin == NULL)
+ if (!win_valid(prevwin)) {
beep_flush();
- else
+ } else {
win_goto(prevwin);
+ }
break;
/* exchange current and next window */
@@ -356,7 +367,7 @@ newwindow:
g_do_tagpreview = Prenum;
else
g_do_tagpreview = p_pvh;
- /*FALLTHROUGH*/
+ FALLTHROUGH;
case ']':
case Ctrl_RSB:
CHECK_CMDWIN
@@ -384,12 +395,16 @@ wingotofile:
ptr = grab_file_name(Prenum1, &lnum);
if (ptr != NULL) {
+ tabpage_T *oldtab = curtab;
+ win_T *oldwin = curwin;
setpcmark();
if (win_split(0, 0) == OK) {
RESET_BINDING(curwin);
- (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LASTL,
- ECMD_HIDE, NULL);
- if (nchar == 'F' && lnum >= 0) {
+ if (do_ecmd(0, ptr, NULL, NULL, ECMD_LASTL, ECMD_HIDE, NULL) == FAIL) {
+ // Failed to open the file, close the window opened for it.
+ win_close(curwin, false);
+ goto_tabpage_win(oldtab, oldwin);
+ } else if (nchar == 'F' && lnum >= 0) {
curwin->w_cursor.lnum = lnum;
check_cursor_lnum();
beginline(BL_SOL | BL_FIX);
@@ -405,8 +420,8 @@ wingotofile:
case 'i': /* Go to any match */
case Ctrl_I:
type = FIND_ANY;
- /* FALLTHROUGH */
- case 'd': /* Go to definition, using 'define' */
+ FALLTHROUGH;
+ case 'd': // Go to definition, using 'define'
case Ctrl_D:
CHECK_CMDWIN
if ((len = find_ident_under_cursor(&ptr, FIND_IDENT)) == 0)
@@ -436,13 +451,12 @@ wingotofile:
case 'g':
case Ctrl_G:
CHECK_CMDWIN
- ++ no_mapping;
- ++allow_keys; /* no mapping for xchar, but allow key codes */
- if (xchar == NUL)
+ no_mapping++;
+ if (xchar == NUL) {
xchar = plain_vgetc();
- LANGMAP_ADJUST(xchar, TRUE);
- --no_mapping;
- --allow_keys;
+ }
+ LANGMAP_ADJUST(xchar, true);
+ no_mapping--;
(void)add_to_showcmd(xchar);
switch (xchar) {
case '}':
@@ -451,7 +465,7 @@ wingotofile:
g_do_tagpreview = Prenum;
else
g_do_tagpreview = p_pvh;
- /*FALLTHROUGH*/
+ FALLTHROUGH;
case ']':
case Ctrl_RSB:
// Keep visual mode, can select words to use as a tag.
@@ -482,7 +496,7 @@ wingotofile:
}
static void cmd_with_count(char *cmd, char_u *bufp, size_t bufsize,
- long Prenum)
+ int64_t Prenum)
{
size_t len = xstrlcpy((char *)bufp, cmd, bufsize);
@@ -551,6 +565,7 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir)
int before;
int minheight;
int wmh1;
+ bool did_set_fraction = false;
if (flags & WSP_TOP)
oldwin = firstwin;
@@ -560,7 +575,7 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir)
oldwin = curwin;
/* add a status line when p_ls == 1 and splitting the first window */
- if (lastwin == firstwin && p_ls == 1 && oldwin->w_status_height == 0) {
+ if (ONE_WINDOW && p_ls == 1 && oldwin->w_status_height == 0) {
if (oldwin->w_height <= p_wmh && new_wp == NULL) {
EMSG(_(e_noroom));
return FAIL;
@@ -627,11 +642,12 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir)
if (oldwin->w_width - new_size - 1 < p_wmw)
do_equal = TRUE;
- /* We don't like to take lines for the new window from a
- * 'winfixwidth' window. Take them from a window to the left or right
- * instead, if possible. */
- if (oldwin->w_p_wfw)
- win_setwidth_win(oldwin->w_width + new_size, oldwin);
+ // We don't like to take lines for the new window from a
+ // 'winfixwidth' window. Take them from a window to the left or right
+ // instead, if possible. Add one for the separator.
+ if (oldwin->w_p_wfw) {
+ win_setwidth_win(oldwin->w_width + new_size + 1, oldwin);
+ }
/* Only make all windows the same width if one of them (except oldwin)
* is wider than one of the split windows. */
@@ -714,6 +730,11 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir)
* 'winfixheight' window. Take them from a window above or below
* instead, if possible. */
if (oldwin->w_p_wfh) {
+ // Set w_fraction now so that the cursor keeps the same relative
+ // vertical position using the old height.
+ set_fraction(oldwin);
+ did_set_fraction = true;
+
win_setheight_win(oldwin->w_height + new_size + STATUS_HEIGHT,
oldwin);
oldwin_height = oldwin->w_height;
@@ -828,8 +849,9 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir)
/* Set w_fraction now so that the cursor keeps the same relative
* vertical position. */
- if (oldwin->w_height > 0)
+ if (!did_set_fraction) {
set_fraction(oldwin);
+ }
wp->w_fraction = oldwin->w_fraction;
if (flags & WSP_VERT) {
@@ -893,31 +915,31 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir)
/* "new_size" of the current window goes to the new window, use
* one row for the status line */
win_new_height(wp, new_size);
- if (flags & (WSP_TOP | WSP_BOT))
- frame_new_height(curfrp, curfrp->fr_height
- - (new_size + STATUS_HEIGHT), flags & WSP_TOP, FALSE);
- else
+ if (flags & (WSP_TOP | WSP_BOT)) {
+ int new_fr_height = curfrp->fr_height - new_size;
+
+ if (!((flags & WSP_BOT) && p_ls == 0)) {
+ new_fr_height -= STATUS_HEIGHT;
+ }
+ frame_new_height(curfrp, new_fr_height, flags & WSP_TOP, false);
+ } else {
win_new_height(oldwin, oldwin_height - (new_size + STATUS_HEIGHT));
- if (before) { /* new window above current one */
+ }
+ if (before) { // new window above current one
wp->w_winrow = oldwin->w_winrow;
wp->w_status_height = STATUS_HEIGHT;
oldwin->w_winrow += wp->w_height + STATUS_HEIGHT;
} else { /* new window below current one */
wp->w_winrow = oldwin->w_winrow + oldwin->w_height + STATUS_HEIGHT;
wp->w_status_height = oldwin->w_status_height;
- // Don't set the status_height for oldwin yet, this might break
- // frame_fix_height(oldwin), therefore will be set below.
+ if (!(flags & WSP_BOT)) {
+ oldwin->w_status_height = STATUS_HEIGHT;
+ }
}
if (flags & WSP_BOT)
frame_add_statusline(curfrp);
frame_fix_height(wp);
frame_fix_height(oldwin);
-
- if (!before) {
- // New window above current one, set the status_height after
- // frame_fix_height(oldwin)
- oldwin->w_status_height = STATUS_HEIGHT;
- }
}
if (flags & (WSP_TOP | WSP_BOT))
@@ -968,11 +990,15 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir)
/*
* make the new window the current window
*/
- win_enter(wp, false);
- if (flags & WSP_VERT)
+ win_enter_ext(wp, false, false, true, true, true);
+ if (flags & WSP_VERT) {
p_wiw = i;
- else
+ } else {
p_wh = i;
+ }
+
+ // Send the window positions to the UI
+ oldwin->w_pos_changed = true;
return OK;
}
@@ -1028,7 +1054,7 @@ static void win_init(win_T *newp, win_T *oldp, int flags)
win_init_some(newp, oldp);
- check_colorcolumn(newp);
+ didset_window_options(newp);
}
/*
@@ -1064,6 +1090,23 @@ bool win_valid(win_T *win) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
return false;
}
+/// Check if "win" is a pointer to an existing window in any tabpage.
+///
+/// @param win window to check
+bool win_valid_any_tab(win_T *win) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ if (win == NULL) {
+ return false;
+ }
+
+ FOR_ALL_TAB_WINDOWS(tp, wp) {
+ if (wp == win) {
+ return true;
+ }
+ }
+ return false;
+}
+
/*
* Return the number of windows.
*/
@@ -1150,7 +1193,7 @@ static void win_exchange(long Prenum)
win_T *wp2;
int temp;
- if (lastwin == firstwin) { /* just one window */
+ if (ONE_WINDOW) { /* just one window */
beep_flush();
return;
}
@@ -1225,7 +1268,8 @@ static void win_exchange(long Prenum)
(void)win_comp_pos(); /* recompute window positions */
win_enter(wp, true);
- redraw_later(CLEAR);
+ redraw_later(NOT_VALID);
+ redraw_win_later(wp, NOT_VALID);
}
/*
@@ -1239,7 +1283,7 @@ static void win_rotate(int upwards, int count)
frame_T *frp;
int n;
- if (firstwin == lastwin) { /* nothing to do */
+ if (ONE_WINDOW) { /* nothing to do */
beep_flush();
return;
}
@@ -1300,7 +1344,10 @@ static void win_rotate(int upwards, int count)
(void)win_comp_pos();
}
- redraw_later(CLEAR);
+ wp1->w_pos_changed = true;
+ wp2->w_pos_changed = true;
+
+ redraw_all_later(NOT_VALID);
}
/*
@@ -1311,7 +1358,7 @@ static void win_totop(int size, int flags)
int dir;
int height = curwin->w_height;
- if (lastwin == firstwin) {
+ if (ONE_WINDOW) {
beep_flush();
return;
}
@@ -1382,6 +1429,9 @@ void win_move_after(win_T *win1, win_T *win2)
redraw_later(NOT_VALID);
}
win_enter(win1, false);
+
+ win1->w_pos_changed = true;
+ win2->w_pos_changed = true;
}
/*
@@ -1437,10 +1487,10 @@ static void win_equal_rec(
|| topfr->fr_width != width || topfr->fr_win->w_wincol != col
) {
topfr->fr_win->w_winrow = row;
- frame_new_height(topfr, height, FALSE, FALSE);
+ frame_new_height(topfr, height, false, false);
topfr->fr_win->w_wincol = col;
- frame_new_width(topfr, width, FALSE, FALSE);
- redraw_all_later(CLEAR);
+ frame_new_width(topfr, width, false, false);
+ redraw_all_later(NOT_VALID);
}
} else if (topfr->fr_layout == FR_ROW) {
topfr->fr_width = width;
@@ -1685,25 +1735,23 @@ static void win_equal_rec(
}
}
-/*
- * close all windows for buffer 'buf'
- */
-void
-close_windows (
- buf_T *buf,
- int keep_curwin /* don't close "curwin" */
-)
+/// Closes all windows for buffer `buf`.
+///
+/// @param keep_curwin don't close `curwin`
+void close_windows(buf_T *buf, int keep_curwin)
{
tabpage_T *tp, *nexttp;
int h = tabline_height();
++RedrawingDisabled;
- for (win_T *wp = firstwin; wp != NULL && lastwin != firstwin; ) {
+ for (win_T *wp = firstwin; wp != NULL && !ONE_WINDOW; ) {
if (wp->w_buffer == buf && (!keep_curwin || wp != curwin)
- && !(wp->w_closing || wp->w_buffer->b_closing)
- ) {
- win_close(wp, FALSE);
+ && !(wp->w_closing || wp->w_buffer->b_locked > 0)) {
+ if (win_close(wp, false) == FAIL) {
+ // If closing the window fails give up, to avoid looping forever.
+ break;
+ }
/* Start all over, autocommands may change the window layout. */
wp = firstwin;
@@ -1717,9 +1765,8 @@ close_windows (
if (tp != curtab) {
FOR_ALL_WINDOWS_IN_TAB(wp, tp) {
if (wp->w_buffer == buf
- && !(wp->w_closing || wp->w_buffer->b_closing)
- ) {
- win_close_othertab(wp, FALSE, tp);
+ && !(wp->w_closing || wp->w_buffer->b_locked > 0)) {
+ win_close_othertab(wp, false, tp);
/* Start all over, the tab page may be closed and
* autocommands may change the window layout. */
@@ -1732,9 +1779,10 @@ close_windows (
--RedrawingDisabled;
- redraw_tabline = TRUE;
- if (h != tabline_height())
+ redraw_tabline = true;
+ if (h != tabline_height()) {
shell_new_rows();
+ }
}
/// Check that current window is the last one.
@@ -1775,7 +1823,7 @@ static bool close_last_window_tabpage(win_T *win, bool free_buf,
tabpage_T *prev_curtab)
FUNC_ATTR_NONNULL_ARG(1)
{
- if (firstwin != lastwin) {
+ if (!ONE_WINDOW) {
return false;
}
buf_T *old_curbuf = curbuf;
@@ -1811,15 +1859,8 @@ static bool close_last_window_tabpage(win_T *win, bool free_buf,
shell_new_rows();
}
- if (term) {
- // When a window containing a terminal buffer is closed, recalculate its
- // size
- terminal_resize(term, 0, 0);
- }
-
// Since goto_tabpage_tp above did not trigger *Enter autocommands, do
// that now.
- apply_autocmds(EVENT_TABCLOSED, prev_idx, prev_idx, false, curbuf);
apply_autocmds(EVENT_WINENTER, NULL, NULL, false, curbuf);
apply_autocmds(EVENT_TABENTER, NULL, NULL, false, curbuf);
if (old_curbuf != curbuf) {
@@ -1828,29 +1869,30 @@ static bool close_last_window_tabpage(win_T *win, bool free_buf,
return true;
}
-/*
- * Close window "win". Only works for the current tab page.
- * If "free_buf" is TRUE related buffer may be unloaded.
- *
- * Called by :quit, :close, :xit, :wq and findtag().
- * Returns FAIL when the window was not closed.
- */
-int win_close(win_T *win, int free_buf)
+// Close window "win". Only works for the current tab page.
+// If "free_buf" is true related buffer may be unloaded.
+//
+// Called by :quit, :close, :xit, :wq and findtag().
+// Returns FAIL when the window was not closed.
+int win_close(win_T *win, bool free_buf)
{
win_T *wp;
int other_buffer = FALSE;
int close_curwin = FALSE;
int dir;
- int help_window = FALSE;
+ bool help_window = false;
tabpage_T *prev_curtab = curtab;
+ frame_T *win_frame = win->w_frame->fr_parent;
if (last_window()) {
EMSG(_("E444: Cannot close last window"));
return FAIL;
}
- if (win->w_closing || (win->w_buffer != NULL && win->w_buffer->b_closing))
- return FAIL; /* window is already being closed */
+ if (win->w_closing
+ || (win->w_buffer != NULL && win->w_buffer->b_locked > 0)) {
+ return FAIL; // window is already being closed
+ }
if (win == aucmd_win) {
EMSG(_("E813: Cannot close autocmd window"));
return FAIL;
@@ -1868,10 +1910,11 @@ int win_close(win_T *win, int free_buf)
/* When closing the help window, try restoring a snapshot after closing
* the window. Otherwise clear the snapshot, it's now invalid. */
- if (win->w_buffer != NULL && win->w_buffer->b_help)
- help_window = TRUE;
- else
+ if (bt_help(win->w_buffer)) {
+ help_window = true;
+ } else {
clear_snapshot(curtab, SNAP_HELP_IDX);
+ }
if (win == curwin) {
/*
@@ -1915,15 +1958,17 @@ int win_close(win_T *win, int free_buf)
* Close the link to the buffer.
*/
if (win->w_buffer != NULL) {
+ bufref_T bufref;
+ set_bufref(&bufref, curbuf);
win->w_closing = true;
close_buffer(win, win->w_buffer, free_buf ? DOBUF_UNLOAD : 0, true);
- if (win_valid(win)) {
+ if (win_valid_any_tab(win)) {
win->w_closing = false;
}
// Make sure curbuf is valid. It can become invalid if 'bufhidden' is
// "wipe".
- if (!buf_valid(curbuf)) {
+ if (!bufref_valid(&bufref)) {
curbuf = firstbuf;
}
}
@@ -1931,17 +1976,26 @@ int win_close(win_T *win, int free_buf)
if (only_one_window() && win_valid(win) && win->w_buffer == NULL
&& (last_window() || curtab != prev_curtab
|| close_last_window_tabpage(win, free_buf, prev_curtab))) {
- /* Autocommands have close all windows, quit now. Restore
- * curwin->w_buffer, otherwise writing ShaDa file may fail. */
- if (curwin->w_buffer == NULL)
+ // Autocommands have closed all windows, quit now. Restore
+ // curwin->w_buffer, otherwise writing ShaDa file may fail.
+ if (curwin->w_buffer == NULL) {
curwin->w_buffer = curbuf;
+ }
getout(0);
}
- /* Autocommands may have closed the window already, or closed the only
- * other window or moved to another tab page. */
- else if (!win_valid(win) || last_window() || curtab != prev_curtab
- || close_last_window_tabpage(win, free_buf, prev_curtab))
+ // Autocommands may have moved to another tab page.
+ if (curtab != prev_curtab && win_valid_any_tab(win)
+ && win->w_buffer == NULL) {
+ // Need to close the window anyway, since the buffer is NULL.
+ win_close_othertab(win, false, prev_curtab);
+ return FAIL;
+ }
+ // Autocommands may have closed the window already, or closed the only
+ // other window or moved to another tab page.
+ if (!win_valid(win) || last_window()
+ || close_last_window_tabpage(win, free_buf, prev_curtab)) {
return FAIL;
+ }
// let terminal buffers know that this window dimensions may be ignored
win->w_closing = true;
@@ -1949,6 +2003,14 @@ int win_close(win_T *win, int free_buf)
* the screen space. */
wp = win_free_mem(win, &dir, NULL);
+ if (help_window) {
+ // Closing the help window moves the cursor back to the original window.
+ win_T *tmpwp = get_snapshot_focus(SNAP_HELP_IDX);
+ if (tmpwp != NULL) {
+ wp = tmpwp;
+ }
+ }
+
/* Make sure curwin isn't invalid. It can cause severe trouble when
* printing an error message. For win_equal() curbuf needs to be valid
* too. */
@@ -1974,20 +2036,25 @@ int win_close(win_T *win, int free_buf)
}
curbuf = curwin->w_buffer;
close_curwin = TRUE;
+
+ // The cursor position may be invalid if the buffer changed after last
+ // using the window.
+ check_cursor();
}
- if (p_ea
- && (*p_ead == 'b' || *p_ead == dir)
- ) {
- win_equal(curwin, true, dir);
+ if (p_ea && (*p_ead == 'b' || *p_ead == dir)) {
+ // If the frame of the closed window contains the new current window,
+ // only resize that frame. Otherwise resize all windows.
+ win_equal(curwin, curwin->w_frame->fr_parent == win_frame, dir);
} else {
win_comp_pos();
}
if (close_curwin) {
- win_enter_ext(wp, false, TRUE, TRUE, TRUE);
- if (other_buffer)
- /* careful: after this wp and win may be invalid! */
- apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf);
+ win_enter_ext(wp, false, true, false, true, true);
+ if (other_buffer) {
+ // careful: after this wp and win may be invalid!
+ apply_autocmds(EVENT_BUFENTER, NULL, NULL, false, curbuf);
+ }
}
/*
@@ -2001,6 +2068,7 @@ int win_close(win_T *win, int free_buf)
if (help_window)
restore_snapshot(SNAP_HELP_IDX, close_curwin);
+ curwin->w_pos_changed = true;
redraw_all_later(NOT_VALID);
return OK;
}
@@ -2018,12 +2086,17 @@ void win_close_othertab(win_T *win, int free_buf, tabpage_T *tp)
tabpage_T *ptp = NULL;
int free_tp = FALSE;
- assert(win->w_buffer); // to avoid np dereference warning in next line
- if (win->w_closing || win->w_buffer->b_closing)
- return; /* window is already being closed */
+ // Get here with win->w_buffer == NULL when win_close() detects the tab page
+ // changed.
+ if (win->w_closing
+ || (win->w_buffer != NULL && win->w_buffer->b_locked > 0)) {
+ return; // window is already being closed
+ }
- /* Close the link to the buffer. */
- close_buffer(win, win->w_buffer, free_buf ? DOBUF_UNLOAD : 0, FALSE);
+ if (win->w_buffer != NULL) {
+ // Close the link to the buffer.
+ close_buffer(win, win->w_buffer, free_buf ? DOBUF_UNLOAD : 0, false);
+ }
/* Careful: Autocommands may have closed the tab page or made it the
* current tab page. */
@@ -2048,19 +2121,29 @@ void win_close_othertab(win_T *win, int free_buf, tabpage_T *tp)
/* When closing the last window in a tab page remove the tab page. */
if (tp->tp_firstwin == tp->tp_lastwin) {
- if (tp == first_tabpage)
+ char_u prev_idx[NUMBUFLEN];
+ if (has_event(EVENT_TABCLOSED)) {
+ vim_snprintf((char *)prev_idx, NUMBUFLEN, "%i", tabpage_index(tp));
+ }
+
+ if (tp == first_tabpage) {
first_tabpage = tp->tp_next;
- else {
+ } else {
for (ptp = first_tabpage; ptp != NULL && ptp->tp_next != tp;
- ptp = ptp->tp_next)
- ;
+ ptp = ptp->tp_next) {
+ // loop
+ }
if (ptp == NULL) {
- EMSG2(_(e_intern2), "win_close_othertab()");
+ internal_error("win_close_othertab()");
return;
}
ptp->tp_next = tp->tp_next;
}
- free_tp = TRUE;
+ free_tp = true;
+
+ if (has_event(EVENT_TABCLOSED)) {
+ apply_autocmds(EVENT_TABCLOSED, prev_idx, prev_idx, false, win->w_buffer);
+ }
}
/* Free the memory used for the window. */
@@ -2139,7 +2222,7 @@ winframe_remove (
/*
* If there is only one window there is nothing to remove.
*/
- if (tp == NULL ? firstwin == lastwin : tp->tp_firstwin == tp->tp_lastwin)
+ if (tp == NULL ? ONE_WINDOW : tp->tp_firstwin == tp->tp_lastwin)
return NULL;
/*
@@ -2231,6 +2314,9 @@ winframe_remove (
if (frp2->fr_win != NULL)
frp2->fr_win->w_frame = frp2->fr_parent;
frp = frp2->fr_parent;
+ if (topframe->fr_child == frp2) {
+ topframe->fr_child = frp;
+ }
xfree(frp2);
frp2 = frp->fr_parent;
@@ -2252,6 +2338,9 @@ winframe_remove (
break;
}
}
+ if (topframe->fr_child == frp) {
+ topframe->fr_child = frp2;
+ }
xfree(frp);
}
}
@@ -2259,14 +2348,14 @@ winframe_remove (
return wp;
}
-/*
- * Find out which frame is going to get the freed up space when "win" is
- * closed.
- * if 'splitbelow'/'splitleft' the space goes to the window above/left.
- * if 'nosplitbelow'/'nosplitleft' the space goes to the window below/right.
- * This makes opening a window and closing it immediately keep the same window
- * layout.
- */
+// Return a pointer to the frame that will receive the empty screen space that
+// is left over after "win" is closed.
+//
+// If 'splitbelow' or 'splitright' is set, the space goes above or to the left
+// by default. Otherwise, the free space goes below or to the right. The
+// result is that opening a window and then immediately closing it will
+// preserve the initial window layout. The 'wfh' and 'wfw' settings are
+// respected when possible.
static frame_T *
win_altframe (
win_T *win,
@@ -2274,20 +2363,40 @@ win_altframe (
)
{
frame_T *frp;
- int b;
- if (tp == NULL ? firstwin == lastwin : tp->tp_firstwin == tp->tp_lastwin)
- /* Last window in this tab page, will go to next tab page. */
+ if (tp == NULL ? ONE_WINDOW : tp->tp_firstwin == tp->tp_lastwin) {
return alt_tabpage()->tp_curwin->w_frame;
+ }
frp = win->w_frame;
- if (frp->fr_parent != NULL && frp->fr_parent->fr_layout == FR_ROW)
- b = p_spr;
- else
- b = p_sb;
- if ((!b && frp->fr_next != NULL) || frp->fr_prev == NULL)
+
+ if (frp->fr_prev == NULL) {
return frp->fr_next;
- return frp->fr_prev;
+ }
+ if (frp->fr_next == NULL) {
+ return frp->fr_prev;
+ }
+
+ frame_T *target_fr = frp->fr_next;
+ frame_T *other_fr = frp->fr_prev;
+ if (p_spr || p_sb) {
+ target_fr = frp->fr_prev;
+ other_fr = frp->fr_next;
+ }
+
+ // If 'wfh' or 'wfw' is set for the target and not for the alternate
+ // window, reverse the selection.
+ if (frp->fr_parent != NULL && frp->fr_parent->fr_layout == FR_ROW) {
+ if (frame_fixed_width(target_fr) && !frame_fixed_width(other_fr)) {
+ target_fr = other_fr;
+ }
+ } else {
+ if (frame_fixed_height(target_fr) && !frame_fixed_height(other_fr)) {
+ target_fr = other_fr;
+ }
+ }
+
+ return target_fr;
}
/*
@@ -2784,8 +2893,8 @@ close_others (
}
if (!r) {
if (message && (p_confirm || cmdmod.confirm) && p_write) {
- dialog_changed(wp->w_buffer, FALSE);
- if (!win_valid(wp)) { /* autocommands messed wp up */
+ dialog_changed(wp->w_buffer, false);
+ if (!win_valid(wp)) { // autocommands messed wp up
nextwp = firstwin;
continue;
}
@@ -2793,10 +2902,10 @@ close_others (
if (bufIsChanged(wp->w_buffer))
continue;
}
- win_close(wp, !P_HID(wp->w_buffer) && !bufIsChanged(wp->w_buffer));
+ win_close(wp, !buf_hide(wp->w_buffer) && !bufIsChanged(wp->w_buffer));
}
- if (message && lastwin != firstwin)
+ if (message && !ONE_WINDOW)
EMSG(_("E445: Other window contains changes"));
}
@@ -2874,8 +2983,9 @@ static int win_alloc_firstwin(win_T *oldwin)
/* Very first window, need to create an empty buffer for it and
* initialize from scratch. */
curbuf = buflist_new(NULL, NULL, 1L, BLN_LISTED);
- if (curbuf == NULL)
+ if (curbuf == NULL) {
return FAIL;
+ }
curwin->w_buffer = curbuf;
curwin->w_s = &(curbuf->b_s);
curbuf->b_nwindows = 1; /* there is one window */
@@ -2893,7 +3003,6 @@ static int win_alloc_firstwin(win_T *oldwin)
topframe = curwin->w_frame;
topframe->fr_width = Columns;
topframe->fr_height = Rows - p_ch;
- topframe->fr_win = curwin;
return OK;
}
@@ -2926,11 +3035,13 @@ void win_init_size(void)
*/
static tabpage_T *alloc_tabpage(void)
{
+ static int last_tp_handle = 0;
tabpage_T *tp = xcalloc(1, sizeof(tabpage_T));
+ tp->handle = ++last_tp_handle;
handle_register_tabpage(tp);
- /* init t: variables */
- tp->tp_vars = dict_alloc();
+ // Init t: variables.
+ tp->tp_vars = tv_dict_alloc();
init_var_dict(tp->tp_vars, &tp->tp_winvar, VAR_SCOPE);
tp->tp_diff_invalid = TRUE;
tp->tp_ch_used = p_ch;
@@ -2950,8 +3061,7 @@ void free_tabpage(tabpage_T *tp)
hash_init(&tp->tp_vars->dv_hashtab);
unref_var_dict(tp->tp_vars);
-
- xfree(tp->localdir); // Free tab-local working directory
+ xfree(tp->tp_localdir);
xfree(tp);
}
@@ -2976,6 +3086,9 @@ int win_new_tabpage(int after, char_u *filename)
xfree(newtp);
return FAIL;
}
+
+ newtp->tp_localdir = tp->tp_localdir ? vim_strsave(tp->tp_localdir) : NULL;
+
curtab = newtp;
/* Create a new empty window. */
@@ -3003,10 +3116,15 @@ int win_new_tabpage(int after, char_u *filename)
newtp->tp_topframe = topframe;
last_status(FALSE);
- redraw_all_later(CLEAR);
+ redraw_all_later(NOT_VALID);
- apply_autocmds(EVENT_TABNEW, filename, filename, false, curbuf);
+ if (ui_is_external(kUIMultigrid)) {
+ tabpage_check_windows(tp);
+ }
+
+ apply_autocmds(EVENT_WINNEW, NULL, NULL, false, curbuf);
apply_autocmds(EVENT_WINENTER, NULL, NULL, false, curbuf);
+ apply_autocmds(EVENT_TABNEW, filename, filename, false, curbuf);
apply_autocmds(EVENT_TABENTER, NULL, NULL, false, curbuf);
return OK;
@@ -3078,6 +3196,45 @@ bool valid_tabpage(tabpage_T *tpc) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
return false;
}
+/// Returns true when `tpc` is valid and at least one window is valid.
+int valid_tabpage_win(tabpage_T *tpc)
+{
+ FOR_ALL_TABS(tp) {
+ if (tp == tpc) {
+ FOR_ALL_WINDOWS_IN_TAB(wp, tp) {
+ if (win_valid_any_tab(wp)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+ // shouldn't happen
+ return false;
+}
+
+/// Close tabpage `tab`, assuming it has no windows in it.
+/// There must be another tabpage or this will crash.
+void close_tabpage(tabpage_T *tab)
+{
+ tabpage_T *ptp;
+
+ if (tab == first_tabpage) {
+ first_tabpage = tab->tp_next;
+ ptp = first_tabpage;
+ } else {
+ for (ptp = first_tabpage; ptp != NULL && ptp->tp_next != tab;
+ ptp = ptp->tp_next) {
+ // do nothing
+ }
+ assert(ptp != NULL);
+ ptp->tp_next = tab->tp_next;
+ }
+
+ goto_tabpage_tp(ptp, false, false);
+ free_tabpage(tab);
+}
+
/*
* Find tab page "n" (first one is 1). Returns NULL when not found.
*/
@@ -3156,22 +3313,26 @@ static void enter_tabpage(tabpage_T *tp, buf_T *old_curbuf, int trigger_enter_au
int old_off = tp->tp_firstwin->w_winrow;
win_T *next_prevwin = tp->tp_prevwin;
+ tabpage_T *old_curtab = curtab;
curtab = tp;
firstwin = tp->tp_firstwin;
lastwin = tp->tp_lastwin;
topframe = tp->tp_topframe;
+ if (old_curtab != curtab && ui_is_external(kUIMultigrid)) {
+ tabpage_check_windows(old_curtab);
+ }
+
/* We would like doing the TabEnter event first, but we don't have a
* valid current window yet, which may break some commands.
* This triggers autocommands, thus may make "tp" invalid. */
- win_enter_ext(tp->tp_curwin, false, TRUE,
- trigger_enter_autocmds, trigger_leave_autocmds);
+ win_enter_ext(tp->tp_curwin, false, true, false,
+ trigger_enter_autocmds, trigger_leave_autocmds);
prevwin = next_prevwin;
- last_status(FALSE); /* status line may appear or disappear */
- (void)win_comp_pos(); /* recompute w_winrow for all windows */
- must_redraw = CLEAR; /* need to redraw everything */
- diff_need_scrollbind = TRUE;
+ last_status(false); // status line may appear or disappear
+ (void)win_comp_pos(); // recompute w_winrow for all windows
+ diff_need_scrollbind = true;
/* The tabpage line may have appeared or disappeared, may need to resize
* the frames for that. When the Vim window was resized need to update
@@ -3193,7 +3354,21 @@ static void enter_tabpage(tabpage_T *tp, buf_T *old_curbuf, int trigger_enter_au
apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf);
}
- redraw_all_later(CLEAR);
+ redraw_all_later(NOT_VALID);
+}
+
+/// called when changing current tabpage from old_curtab to curtab
+static void tabpage_check_windows(tabpage_T *old_curtab)
+{
+ win_T *next_wp;
+ for (win_T *wp = old_curtab->tp_firstwin; wp; wp = next_wp) {
+ next_wp = wp->w_next;
+ wp->w_pos_changed = true;
+ }
+
+ for (win_T *wp = firstwin; wp; wp = wp->w_next) {
+ wp->w_pos_changed = true;
+ }
}
/*
@@ -3207,11 +3382,8 @@ void goto_tabpage(int n)
int i;
if (text_locked()) {
- /* Not allowed when editing the command line. */
- if (cmdwin_type != 0)
- EMSG(_(e_cmdwin));
- else
- EMSG(_(e_secure));
+ // Not allowed when editing the command line.
+ text_locked_msg();
return;
}
@@ -3296,8 +3468,11 @@ void tabpage_move(int nr)
tabpage_T *tp;
tabpage_T *tp_dst;
- if (first_tabpage->tp_next == NULL)
+ assert(curtab != NULL);
+
+ if (first_tabpage->tp_next == NULL) {
return;
+ }
for (tp = first_tabpage; tp->tp_next != NULL && n < nr; tp = tp->tp_next) {
++n;
@@ -3310,15 +3485,20 @@ void tabpage_move(int nr)
tp_dst = tp;
- /* Remove the current tab page from the list of tab pages. */
- if (curtab == first_tabpage)
+ // Remove the current tab page from the list of tab pages.
+ if (curtab == first_tabpage) {
first_tabpage = curtab->tp_next;
- else {
- for (tp = first_tabpage; tp != NULL; tp = tp->tp_next)
- if (tp->tp_next == curtab)
+ } else {
+ tp = NULL;
+ FOR_ALL_TABS(tp2) {
+ if (tp2->tp_next == curtab) {
+ tp = tp2;
break;
- if (tp == NULL) /* "cannot happen" */
+ }
+ }
+ if (tp == NULL) { // "cannot happen"
return;
+ }
tp->tp_next = curtab->tp_next;
}
@@ -3362,11 +3542,13 @@ void win_goto(win_T *wp)
win_enter(wp, true);
- /* Conceal cursor line in previous window, unconceal in current window. */
- if (win_valid(owp) && owp->w_p_cole > 0 && !msg_scrolled)
- update_single_line(owp, owp->w_cursor.lnum);
- if (curwin->w_p_cole > 0 && !msg_scrolled)
- need_cursor_line_redraw = TRUE;
+ // Conceal cursor line in previous window, unconceal in current window.
+ if (win_valid(owp) && owp->w_p_cole > 0 && !msg_scrolled) {
+ redrawWinline(owp, owp->w_cursor.lnum);
+ }
+ if (curwin->w_p_cole > 0 && !msg_scrolled) {
+ redrawWinline(curwin, curwin->w_cursor.lnum);
+ }
}
@@ -3506,7 +3688,7 @@ end:
*/
void win_enter(win_T *wp, bool undo_sync)
{
- win_enter_ext(wp, undo_sync, FALSE, TRUE, TRUE);
+ win_enter_ext(wp, undo_sync, false, false, true, true);
}
/*
@@ -3514,7 +3696,9 @@ void win_enter(win_T *wp, bool undo_sync)
* Can be called with "curwin_invalid" TRUE, which means that curwin has just
* been closed and isn't valid.
*/
-static void win_enter_ext(win_T *wp, bool undo_sync, int curwin_invalid, int trigger_enter_autocmds, int trigger_leave_autocmds)
+static void win_enter_ext(win_T *wp, bool undo_sync, int curwin_invalid,
+ int trigger_new_autocmds, int trigger_enter_autocmds,
+ int trigger_leave_autocmds)
{
int other_buffer = FALSE;
@@ -3563,33 +3747,46 @@ static void win_enter_ext(win_T *wp, bool undo_sync, int curwin_invalid, int tri
curwin->w_cursor.coladd = 0;
changed_line_abv_curs(); /* assume cursor position needs updating */
- // The new directory is either the local directory of the window, of the tab
- // or NULL.
- char_u *new_dir = curwin->w_localdir ? curwin->w_localdir : curtab->localdir;
+ // New directory is either the local directory of the window, tab or NULL.
+ char *new_dir = (char *)(curwin->w_localdir
+ ? curwin->w_localdir : curtab->tp_localdir);
+
+ char cwd[MAXPATHL];
+ if (os_dirname((char_u *)cwd, MAXPATHL) != OK) {
+ cwd[0] = NUL;
+ }
if (new_dir) {
// Window/tab has a local directory: Save current directory as global
- // directory (unless that was done already) and change to the local
- // directory.
+ // (unless that was done already) and change to the local directory.
if (globaldir == NULL) {
- char_u cwd[MAXPATHL];
-
- if (os_dirname(cwd, MAXPATHL) == OK) {
- globaldir = vim_strsave(cwd);
+ if (cwd[0] != NUL) {
+ globaldir = (char_u *)xstrdup(cwd);
}
}
- if (os_chdir((char *)new_dir) == 0) {
+ if (os_chdir(new_dir) == 0) {
+ if (!p_acd && !strequal(new_dir, cwd)) {
+ do_autocmd_dirchanged(new_dir, curwin->w_localdir
+ ? kCdScopeWindow : kCdScopeTab);
+ }
shorten_fnames(true);
}
} else if (globaldir != NULL) {
- /* Window doesn't have a local directory and we are not in the global
- * directory: Change to the global directory. */
- ignored = os_chdir((char *)globaldir);
+ // Window doesn't have a local directory and we are not in the global
+ // directory: Change to the global directory.
+ if (os_chdir((char *)globaldir) == 0) {
+ if (!p_acd && !strequal((char *)globaldir, cwd)) {
+ do_autocmd_dirchanged((char *)globaldir, kCdScopeGlobal);
+ }
+ }
xfree(globaldir);
globaldir = NULL;
shorten_fnames(TRUE);
}
+ if (trigger_new_autocmds) {
+ apply_autocmds(EVENT_WINNEW, NULL, NULL, false, curbuf);
+ }
if (trigger_enter_autocmds) {
apply_autocmds(EVENT_WINENTER, NULL, NULL, FALSE, curbuf);
if (other_buffer)
@@ -3602,6 +3799,12 @@ static void win_enter_ext(win_T *wp, bool undo_sync, int curwin_invalid, int tri
if (restart_edit)
redraw_later(VALID); /* causes status line redraw */
+ if (HL_ATTR(HLF_INACTIVE)
+ || (prevwin && prevwin->w_hl_ids[HLF_INACTIVE])
+ || curwin->w_hl_ids[HLF_INACTIVE]) {
+ redraw_all_later(NOT_VALID);
+ }
+
/* set window height to desired minimal value */
if (curwin->w_height < p_wh && !curwin->w_p_wfh)
win_setheight((int)p_wh);
@@ -3616,10 +3819,6 @@ static void win_enter_ext(win_T *wp, bool undo_sync, int curwin_invalid, int tri
/* Change directories when the 'acd' option is set. */
do_autochdir();
-
- if (curbuf->terminal) {
- terminal_resize(curbuf->terminal, curwin->w_width, curwin->w_height);
- }
}
@@ -3686,15 +3885,19 @@ win_T *buf_jump_open_tab(buf_T *buf)
*/
static win_T *win_alloc(win_T *after, int hidden)
{
- /*
- * allocate window structure and linesizes arrays
- */
+ static int last_win_id = LOWEST_WIN_ID - 1;
+
+ // allocate window structure and linesizes arrays
win_T *new_wp = xcalloc(1, sizeof(win_T));
- handle_register_window(new_wp);
win_alloc_lines(new_wp);
- /* init w: variables */
- new_wp->w_vars = dict_alloc();
+ new_wp->handle = ++last_win_id;
+ handle_register_window(new_wp);
+
+ grid_assign_handle(&new_wp->w_grid);
+
+ // Init w: variables.
+ new_wp->w_vars = tv_dict_alloc();
init_var_dict(new_wp->w_vars, &new_wp->w_winvar, VAR_SCOPE);
/* Don't execute autocommands while the window is not properly
@@ -3758,8 +3961,15 @@ win_free (
hash_init(&wp->w_vars->dv_hashtab);
unref_var_dict(wp->w_vars);
- if (prevwin == wp)
+ if (prevwin == wp) {
prevwin = NULL;
+ }
+ FOR_ALL_TABS(ttp) {
+ if (ttp->tp_prevwin == wp) {
+ ttp->tp_prevwin = NULL;
+ }
+ }
+
win_free_lsize(wp);
for (i = 0; i < wp->w_tagstacklen; ++i)
@@ -3784,6 +3994,8 @@ win_free (
xfree(wp->w_p_cc_cols);
+ win_free_grid(wp, false);
+
if (wp != aucmd_win)
win_remove(wp, tp);
if (autocmd_busy) {
@@ -3796,6 +4008,20 @@ win_free (
unblock_autocmds();
}
+void win_free_grid(win_T *wp, bool reinit)
+{
+ if (wp->w_grid.handle != 0 && ui_is_external(kUIMultigrid)) {
+ ui_call_grid_destroy(wp->w_grid.handle);
+ wp->w_grid.handle = 0;
+ }
+ grid_free(&wp->w_grid);
+ if (reinit) {
+ // if a float is turned into a split and back into a float, the grid
+ // data structure will be reused
+ memset(&wp->w_grid, 0, sizeof(wp->w_grid));
+ }
+}
+
/*
* Append window "wp" in the window list after window "after".
*/
@@ -3829,18 +4055,20 @@ win_remove (
tabpage_T *tp /* tab page "win" is in, NULL for current */
)
{
- if (wp->w_prev != NULL)
+ if (wp->w_prev != NULL) {
wp->w_prev->w_next = wp->w_next;
- else if (tp == NULL)
- firstwin = wp->w_next;
- else
+ } else if (tp == NULL) {
+ firstwin = curtab->tp_firstwin = wp->w_next;
+ } else {
tp->tp_firstwin = wp->w_next;
- if (wp->w_next != NULL)
+ }
+ if (wp->w_next != NULL) {
wp->w_next->w_prev = wp->w_prev;
- else if (tp == NULL)
- lastwin = wp->w_prev;
- else
+ } else if (tp == NULL) {
+ lastwin = curtab->tp_lastwin = wp->w_prev;
+ } else {
tp->tp_lastwin = wp->w_prev;
+ }
}
/*
@@ -3874,12 +4102,18 @@ static void frame_insert(frame_T *before, frame_T *frp)
*/
static void frame_remove(frame_T *frp)
{
- if (frp->fr_prev != NULL)
+ if (frp->fr_prev != NULL) {
frp->fr_prev->fr_next = frp->fr_next;
- else
+ } else {
frp->fr_parent->fr_child = frp->fr_next;
- if (frp->fr_next != NULL)
+ // special case: topframe->fr_child == frp
+ if (topframe->fr_child == frp) {
+ topframe->fr_child = frp->fr_next;
+ }
+ }
+ if (frp->fr_next != NULL) {
frp->fr_next->fr_prev = frp->fr_prev;
+ }
}
@@ -3889,8 +4123,8 @@ static void frame_remove(frame_T *frp)
void win_alloc_lines(win_T *wp)
{
wp->w_lines_valid = 0;
- assert(Rows >= 0);
- wp->w_lines = xcalloc(Rows, sizeof(wline_T));
+ assert(wp->w_grid.Rows >= 0);
+ wp->w_lines = xcalloc(MAX(wp->w_grid.Rows + 1, Rows), sizeof(wline_T));
}
/*
@@ -4020,7 +4254,8 @@ static void frame_comp_pos(frame_T *topfrp, int *row, int *col)
wp->w_winrow = *row;
wp->w_wincol = *col;
redraw_win_later(wp, NOT_VALID);
- wp->w_redr_status = TRUE;
+ wp->w_redr_status = true;
+ wp->w_pos_changed = true;
}
*row += wp->w_height + wp->w_status_height;
*col += wp->w_width + wp->w_vsep_width;
@@ -4073,8 +4308,9 @@ void win_setheight_win(int height, win_T *win)
* If there is extra space created between the last window and the command
* line, clear it.
*/
- if (full_screen && msg_scrolled == 0 && row < cmdline_row)
- screen_fill(row, cmdline_row, 0, (int)Columns, ' ', ' ', 0);
+ if (full_screen && msg_scrolled == 0 && row < cmdline_row) {
+ grid_fill(&default_grid, row, cmdline_row, 0, (int)Columns, ' ', ' ', 0);
+ }
cmdline_row = row;
msg_row = row;
msg_col = 0;
@@ -4157,11 +4393,11 @@ static void frame_setheight(frame_T *curfrp, int height)
room_cmdline = 0;
}
- if (height <= room + room_cmdline)
+ if (height <= room + room_cmdline) {
break;
+ }
if (run == 2 || curfrp->fr_width == Columns) {
- if (height > room + room_cmdline)
- height = room + room_cmdline;
+ height = room + room_cmdline;
break;
}
frame_setheight(curfrp->fr_parent, height
@@ -4325,8 +4561,7 @@ static void frame_setwidth(frame_T *curfrp, int width)
if (width <= room)
break;
if (run == 2 || curfrp->fr_height >= ROWS_AVAIL) {
- if (width > room)
- width = room;
+ width = room;
break;
}
frame_setwidth(curfrp->fr_parent, width
@@ -4525,7 +4760,7 @@ void win_drag_status_line(win_T *dragwin, int offset)
fr = fr->fr_next;
}
row = win_comp_pos();
- screen_fill(row, cmdline_row, 0, (int)Columns, ' ', ' ', 0);
+ grid_fill(&default_grid, row, cmdline_row, 0, (int)Columns, ' ', ' ', 0);
cmdline_row = row;
p_ch = Rows - cmdline_row;
if (p_ch < 1)
@@ -4638,10 +4873,13 @@ void win_drag_vsep_line(win_T *dragwin, int offset)
#define FRACTION_MULT 16384L
// Set wp->w_fraction for the current w_wrow and w_height.
+// Has no effect when the window is less than two lines.
void set_fraction(win_T *wp)
{
- wp->w_fraction = ((long)wp->w_wrow * FRACTION_MULT + wp->w_height / 2)
+ if (wp->w_height > 1) {
+ wp->w_fraction = ((long)wp->w_wrow * FRACTION_MULT + wp->w_height / 2)
/ (long)wp->w_height;
+ }
}
/*
@@ -4651,8 +4889,6 @@ void set_fraction(win_T *wp)
*/
void win_new_height(win_T *wp, int height)
{
- linenr_T lnum;
- int sline, line_size;
int prev_height = wp->w_height;
/* Don't want a negative height. Happens when splitting a tiny window.
@@ -4668,7 +4904,7 @@ void win_new_height(win_T *wp, int height)
// call win_new_height() recursively.
validate_cursor();
}
- if (wp->w_height != prev_height) {
+ if (wp->w_height != prev_height) { // -V547
return; // Recursive call already changed the size, bail out.
}
if (wp->w_wrow != wp->w_prev_fraction_row) {
@@ -4679,6 +4915,21 @@ void win_new_height(win_T *wp, int height)
wp->w_height = height;
wp->w_skipcol = 0;
+ // There is no point in adjusting the scroll position when exiting. Some
+ // values might be invalid.
+ if (!exiting) {
+ scroll_to_fraction(wp, prev_height);
+ }
+
+ wp->w_pos_changed = true;
+}
+
+void scroll_to_fraction(win_T *wp, int prev_height)
+{
+ linenr_T lnum;
+ int sline, line_size;
+ int height = wp->w_height;
+
/* Don't change w_topline when height is zero. Don't set w_topline when
* 'scrollbind' is set and this isn't the current window. */
if (height > 0
@@ -4697,8 +4948,8 @@ void win_new_height(win_T *wp, int height)
sline = wp->w_wrow - line_size;
if (sline >= 0) {
- /* Make sure the whole cursor line is visible, if possible. */
- int rows = plines_win(wp, lnum, FALSE);
+ // Make sure the whole cursor line is visible, if possible.
+ const int rows = plines_win(wp, lnum, false);
if (sline > wp->w_height - rows) {
sline = wp->w_height - rows;
@@ -4733,12 +4984,13 @@ void win_new_height(win_T *wp, int height)
--sline;
break;
}
- --lnum;
- if (lnum == wp->w_topline)
- line_size = plines_win_nofill(wp, lnum, TRUE)
+ lnum--;
+ if (lnum == wp->w_topline) {
+ line_size = plines_win_nofill(wp, lnum, true)
+ wp->w_topfill;
- else
- line_size = plines_win(wp, lnum, TRUE);
+ } else {
+ line_size = plines_win(wp, lnum, true);
+ }
sline -= line_size;
}
@@ -4775,13 +5027,11 @@ void win_new_height(win_T *wp, int height)
if (wp->w_buffer->terminal) {
terminal_resize(wp->w_buffer->terminal, 0, wp->w_height);
- redraw_win_later(wp, CLEAR);
+ redraw_win_later(wp, NOT_VALID);
}
}
-/*
- * Set the width of a window.
- */
+/// Set the width of a window.
void win_new_width(win_T *wp, int width)
{
wp->w_width = width;
@@ -4797,10 +5047,12 @@ void win_new_width(win_T *wp, int width)
if (wp->w_buffer->terminal) {
if (wp->w_height != 0) {
- terminal_resize(wp->w_buffer->terminal, wp->w_width, 0);
+ terminal_resize(wp->w_buffer->terminal,
+ (uint16_t)(MAX(0, wp->w_width - win_col_off(wp))),
+ 0);
}
- redraw_win_later(wp, CLEAR);
}
+ wp->w_pos_changed = true;
}
void win_comp_scroll(win_T *wp)
@@ -4857,10 +5109,11 @@ void command_height(void)
/* Recompute window positions. */
(void)win_comp_pos();
- /* clear the lines added to cmdline */
- if (full_screen)
- screen_fill(cmdline_row, (int)Rows, 0,
- (int)Columns, ' ', ' ', 0);
+ // clear the lines added to cmdline
+ if (full_screen) {
+ grid_fill(&default_grid, cmdline_row, (int)Rows, 0, (int)Columns, ' ',
+ ' ', 0);
+ }
msg_row = cmdline_row;
redraw_cmdline = TRUE;
return;
@@ -4946,16 +5199,20 @@ file_name_in_line (
{
char_u *ptr;
size_t len;
+ bool in_type = true;
+ bool is_url = false;
/*
* search forward for what could be the start of a file name
*/
ptr = line + col;
- while (*ptr != NUL && !vim_isfilec(*ptr))
- mb_ptr_adv(ptr);
- if (*ptr == NUL) { /* nothing found */
- if (options & FNAME_MESS)
+ while (*ptr != NUL && !vim_isfilec(*ptr)) {
+ MB_PTR_ADV(ptr);
+ }
+ if (*ptr == NUL) { // nothing found
+ if (options & FNAME_MESS) {
EMSG(_("E446: No file name under cursor"));
+ }
return NULL;
}
@@ -4964,13 +5221,14 @@ file_name_in_line (
* Go one char back to ":" before "//" even when ':' is not in 'isfname'.
*/
while (ptr > line) {
- if (has_mbyte && (len = (size_t)((*mb_head_off)(line, ptr - 1))) > 0)
+ if ((len = (size_t)(utf_head_off(line, ptr - 1))) > 0) {
ptr -= len + 1;
- else if (vim_isfilec(ptr[-1])
- || ((options & FNAME_HYP) && path_is_url((char *)ptr - 1)))
- --ptr;
- else
+ } else if (vim_isfilec(ptr[-1])
+ || ((options & FNAME_HYP) && path_is_url((char *)ptr - 1))) {
+ ptr--;
+ } else {
break;
+ }
}
/*
@@ -4979,7 +5237,19 @@ file_name_in_line (
*/
len = 0;
while (vim_isfilec(ptr[len]) || (ptr[len] == '\\' && ptr[len + 1] == ' ')
- || ((options & FNAME_HYP) && path_is_url((char *)ptr + len))) {
+ || ((options & FNAME_HYP) && path_is_url((char *)ptr + len))
+ || (is_url && vim_strchr((char_u *)"?&=", ptr[len]) != NULL)) {
+ // After type:// we also include ?, & and = as valid characters, so that
+ // http://google.com?q=this&that=ok works.
+ if ((ptr[len] >= 'A' && ptr[len] <= 'Z')
+ || (ptr[len] >= 'a' && ptr[len] <= 'z')) {
+ if (in_type && path_is_url((char *)ptr + len + 1)) {
+ is_url = true;
+ }
+ } else {
+ in_type = false;
+ }
+
if (ptr[len] == '\\' && ptr[len + 1] == ' ') {
// Skip over the "\" in "\ ".
++len;
@@ -5028,7 +5298,7 @@ last_status (
{
/* Don't make a difference between horizontal or vertical split. */
last_status_rec(topframe, (p_ls == 2
- || (p_ls == 1 && (morewin || lastwin != firstwin))));
+ || (p_ls == 1 && (morewin || !ONE_WINDOW))));
}
static void last_status_rec(frame_T *fr, int statusline)
@@ -5085,6 +5355,9 @@ static void last_status_rec(frame_T *fr, int statusline)
*/
int tabline_height(void)
{
+ if (ui_is_external(kUITabline)) {
+ return 0;
+ }
assert(first_tabpage);
switch (p_stal) {
case 0: return 0;
@@ -5127,7 +5400,7 @@ bool only_one_window(void) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
int count = 0;
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
if (wp->w_buffer != NULL
- && (!((wp->w_buffer->b_help && !curbuf->b_help)
+ && (!((bt_help(wp->w_buffer) && !bt_help(curbuf))
|| wp->w_p_pvw) || wp == curwin) && wp != aucmd_win) {
count++;
}
@@ -5229,15 +5502,13 @@ restore_snapshot (
win_comp_pos();
if (wp != NULL && close_curwin)
win_goto(wp);
- redraw_all_later(CLEAR);
+ redraw_all_later(NOT_VALID);
}
clear_snapshot(curtab, idx);
}
-/*
- * Check if frames "sn" and "fr" have the same layout, same following frames
- * and same children.
- */
+/// Check if frames "sn" and "fr" have the same layout, same following frames
+/// and same children. And the window pointer is valid.
static int check_snapshot_rec(frame_T *sn, frame_T *fr)
{
if (sn->fr_layout != fr->fr_layout
@@ -5246,7 +5517,8 @@ static int check_snapshot_rec(frame_T *sn, frame_T *fr)
|| (sn->fr_next != NULL
&& check_snapshot_rec(sn->fr_next, fr->fr_next) == FAIL)
|| (sn->fr_child != NULL
- && check_snapshot_rec(sn->fr_child, fr->fr_child) == FAIL))
+ && check_snapshot_rec(sn->fr_child, fr->fr_child) == FAIL)
+ || (sn->fr_win != NULL && !win_valid(sn->fr_win)))
return FAIL;
return OK;
}
@@ -5281,6 +5553,27 @@ static win_T *restore_snapshot_rec(frame_T *sn, frame_T *fr)
return wp;
}
+/// Gets the focused window (the one holding the cursor) of the snapshot.
+static win_T *get_snapshot_focus(int idx)
+{
+ if (curtab->tp_snapshot[idx] == NULL) {
+ return NULL;
+ }
+
+ frame_T *sn = curtab->tp_snapshot[idx];
+ // This should be equivalent to the recursive algorithm found in
+ // restore_snapshot as far as traveling nodes go.
+ while (sn->fr_child != NULL || sn->fr_next != NULL) {
+ while (sn->fr_child != NULL) {
+ sn = sn->fr_child;
+ }
+ if (sn->fr_next != NULL) {
+ sn = sn->fr_next;
+ }
+ }
+
+ return sn->fr_win;
+}
/*
* Set "win" to be the curwin and "tp" to be the current tab page.
@@ -5313,12 +5606,10 @@ int switch_win(win_T **save_curwin, tabpage_T **save_curtab, win_T *win, tabpage
return OK;
}
-/*
- * Restore current tabpage and window saved by switch_win(), if still valid.
- * When "no_display" is TRUE the display won't be affected, no redraw is
- * triggered.
- */
-void restore_win(win_T *save_curwin, tabpage_T *save_curtab, int no_display)
+// Restore current tabpage and window saved by switch_win(), if still valid.
+// When "no_display" is true the display won't be affected, no redraw is
+// triggered.
+void restore_win(win_T *save_curwin, tabpage_T *save_curtab, bool no_display)
{
if (save_curtab != NULL && valid_tabpage(save_curtab)) {
if (no_display) {
@@ -5337,44 +5628,45 @@ void restore_win(win_T *save_curwin, tabpage_T *save_curtab, int no_display)
unblock_autocmds();
}
-/*
- * Make "buf" the current buffer. restore_buffer() MUST be called to undo.
- * No autocommands will be executed. Use aucmd_prepbuf() if there are any.
- */
-void switch_buffer(buf_T **save_curbuf, buf_T *buf)
+/// Make "buf" the current buffer.
+///
+/// restore_buffer() MUST be called to undo.
+/// No autocommands will be executed. Use aucmd_prepbuf() if there are any.
+void switch_buffer(bufref_T *save_curbuf, buf_T *buf)
{
block_autocmds();
- *save_curbuf = curbuf;
- --curbuf->b_nwindows;
+ set_bufref(save_curbuf, curbuf);
+ curbuf->b_nwindows--;
curbuf = buf;
curwin->w_buffer = buf;
- ++curbuf->b_nwindows;
+ curbuf->b_nwindows++;
}
-/*
- * Restore the current buffer after using switch_buffer().
- */
-void restore_buffer(buf_T *save_curbuf)
+/// Restore the current buffer after using switch_buffer().
+void restore_buffer(bufref_T *save_curbuf)
{
unblock_autocmds();
- /* Check for valid buffer, just in case. */
- if (buf_valid(save_curbuf)) {
- --curbuf->b_nwindows;
- curwin->w_buffer = save_curbuf;
- curbuf = save_curbuf;
- ++curbuf->b_nwindows;
+ // Check for valid buffer, just in case.
+ if (bufref_valid(save_curbuf)) {
+ curbuf->b_nwindows--;
+ curwin->w_buffer = save_curbuf->br_buf;
+ curbuf = save_curbuf->br_buf;
+ curbuf->b_nwindows++;
}
}
-// Add match to the match list of window 'wp'. The pattern 'pat' will be
-// highlighted with the group 'grp' with priority 'prio'.
-// Optionally, a desired ID 'id' can be specified (greater than or equal to 1).
-// If no particular ID is desired, -1 must be specified for 'id'.
-// Return ID of added match, -1 on failure.
-int match_add(win_T *wp, char_u *grp, char_u *pat,
+/// Add match to the match list of window 'wp'. The pattern 'pat' will be
+/// highlighted with the group 'grp' with priority 'prio'.
+/// Optionally, a desired ID 'id' can be specified (greater than or equal to 1).
+///
+/// @param[in] id a desired ID 'id' can be specified
+/// (greater than or equal to 1). -1 must be specified if no
+/// particular ID is desired
+/// @return ID of added match, -1 on failure.
+int match_add(win_T *wp, const char *const grp, const char *const pat,
int prio, int id, list_T *pos_list,
- char_u *conceal_char)
+ const char *const conceal_char)
{
matchitem_T *cur;
matchitem_T *prev;
@@ -5387,8 +5679,8 @@ int match_add(win_T *wp, char_u *grp, char_u *pat,
return -1;
}
if (id < -1 || id == 0) {
- EMSGN("E799: Invalid ID: %" PRId64
- " (must be greater than or equal to 1)",
+ EMSGN(_("E799: Invalid ID: %" PRId64
+ " (must be greater than or equal to 1)"),
id);
return -1;
}
@@ -5396,17 +5688,17 @@ int match_add(win_T *wp, char_u *grp, char_u *pat,
cur = wp->w_match_head;
while (cur != NULL) {
if (cur->id == id) {
- EMSGN("E801: ID already taken: %" PRId64, id);
+ EMSGN(_("E801: ID already taken: %" PRId64), id);
return -1;
}
cur = cur->next;
}
}
- if ((hlg_id = syn_namen2id(grp, (int)STRLEN(grp))) == 0) {
+ if ((hlg_id = syn_name2id((const char_u *)grp)) == 0) {
EMSG2(_(e_nogroup), grp);
return -1;
}
- if (pat != NULL && (regprog = vim_regcomp(pat, RE_MAGIC)) == NULL) {
+ if (pat != NULL && (regprog = vim_regcomp((char_u *)pat, RE_MAGIC)) == NULL) {
EMSG2(_(e_invarg2), pat);
return -1;
}
@@ -5425,76 +5717,76 @@ int match_add(win_T *wp, char_u *grp, char_u *pat,
m = xcalloc(1, sizeof(matchitem_T));
m->id = id;
m->priority = prio;
- m->pattern = pat == NULL ? NULL: vim_strsave(pat);
+ m->pattern = pat == NULL ? NULL: (char_u *)xstrdup(pat);
m->hlg_id = hlg_id;
m->match.regprog = regprog;
m->match.rmm_ic = FALSE;
m->match.rmm_maxcol = 0;
m->conceal_char = 0;
if (conceal_char != NULL) {
- m->conceal_char = (*mb_ptr2char)(conceal_char);
+ m->conceal_char = utf_ptr2char((const char_u *)conceal_char);
}
// Set up position matches
- if (pos_list != NULL)
- {
- linenr_T toplnum = 0;
- linenr_T botlnum = 0;
- listitem_T *li;
- int i;
-
- for (i = 0, li = pos_list->lv_first; li != NULL && i < MAXPOSMATCH;
- i++, li = li->li_next) {
- linenr_T lnum = 0;
- colnr_T col = 0;
- int len = 1;
- list_T *subl;
- listitem_T *subli;
- int error = false;
-
- if (li->li_tv.v_type == VAR_LIST) {
- subl = li->li_tv.vval.v_list;
- if (subl == NULL) {
- goto fail;
- }
- subli = subl->lv_first;
+ if (pos_list != NULL) {
+ linenr_T toplnum = 0;
+ linenr_T botlnum = 0;
+
+ int i = 0;
+ TV_LIST_ITER(pos_list, li, {
+ linenr_T lnum = 0;
+ colnr_T col = 0;
+ int len = 1;
+ bool error = false;
+
+ if (TV_LIST_ITEM_TV(li)->v_type == VAR_LIST) {
+ const list_T *const subl = TV_LIST_ITEM_TV(li)->vval.v_list;
+ const listitem_T *subli = tv_list_first(subl);
if (subli == NULL) {
+ emsgf(_("E5030: Empty list at position %d"),
+ (int)tv_list_idx_of_item(pos_list, li));
goto fail;
}
- lnum = get_tv_number_chk(&subli->li_tv, &error);
- if (error == true) {
+ lnum = tv_get_number_chk(TV_LIST_ITEM_TV(subli), &error);
+ if (error) {
goto fail;
}
- if (lnum == 0) {
- --i;
+ if (lnum <= 0) {
continue;
}
m->pos.pos[i].lnum = lnum;
- subli = subli->li_next;
+ subli = TV_LIST_ITEM_NEXT(subl, subli);
if (subli != NULL) {
- col = get_tv_number_chk(&subli->li_tv, &error);
- if (error == true)
+ col = tv_get_number_chk(TV_LIST_ITEM_TV(subli), &error);
+ if (error) {
goto fail;
- subli = subli->li_next;
+ }
+ if (col < 0) {
+ continue;
+ }
+ subli = TV_LIST_ITEM_NEXT(subl, subli);
if (subli != NULL) {
- len = get_tv_number_chk(&subli->li_tv, &error);
- if (error == true) {
+ len = tv_get_number_chk(TV_LIST_ITEM_TV(subli), &error);
+ if (len < 0) {
+ continue;
+ }
+ if (error) {
goto fail;
}
}
}
m->pos.pos[i].col = col;
m->pos.pos[i].len = len;
- } else if (li->li_tv.v_type == VAR_NUMBER) {
- if (li->li_tv.vval.v_number == 0) {
- --i;
+ } else if (TV_LIST_ITEM_TV(li)->v_type == VAR_NUMBER) {
+ if (TV_LIST_ITEM_TV(li)->vval.v_number <= 0) {
continue;
}
- m->pos.pos[i].lnum = li->li_tv.vval.v_number;
+ m->pos.pos[i].lnum = TV_LIST_ITEM_TV(li)->vval.v_number;
m->pos.pos[i].col = 0;
m->pos.pos[i].len = 0;
} else {
- EMSG(_("List or number required"));
+ emsgf(_("E5031: List or number required at position %d"),
+ (int)tv_list_idx_of_item(pos_list, li));
goto fail;
}
if (toplnum == 0 || lnum < toplnum) {
@@ -5503,7 +5795,11 @@ int match_add(win_T *wp, char_u *grp, char_u *pat,
if (botlnum == 0 || lnum >= botlnum) {
botlnum = lnum + 1;
}
- }
+ i++;
+ if (i >= MAXPOSMATCH) {
+ break;
+ }
+ });
// Calculate top and bottom lines for redrawing area
if (toplnum != 0){
@@ -5548,10 +5844,9 @@ fail:
return -1;
}
-/*
- * Delete match with ID 'id' in the match list of window 'wp'.
- * Print error messages if 'perr' is TRUE.
- */
+
+/// Delete match with ID 'id' in the match list of window 'wp'.
+/// Print error messages if 'perr' is TRUE.
int match_delete(win_T *wp, int id, int perr)
{
matchitem_T *cur = wp->w_match_head;
@@ -5559,10 +5854,11 @@ int match_delete(win_T *wp, int id, int perr)
int rtype = SOME_VALID;
if (id < 1) {
- if (perr == TRUE)
- EMSGN("E802: Invalid ID: %" PRId64
- " (must be greater than or equal to 1)",
+ if (perr) {
+ EMSGN(_("E802: Invalid ID: %" PRId64
+ " (must be greater than or equal to 1)"),
id);
+ }
return -1;
}
while (cur != NULL && cur->id != id) {
@@ -5570,8 +5866,9 @@ int match_delete(win_T *wp, int id, int perr)
cur = cur->next;
}
if (cur == NULL) {
- if (perr == TRUE)
- EMSGN("E803: ID not found: %" PRId64, id);
+ if (perr) {
+ EMSGN(_("E803: ID not found: %" PRId64), id);
+ }
return -1;
}
if (cur == prev)
@@ -5671,3 +5968,144 @@ static bool frame_check_width(frame_T *topfrp, int width)
}
return true;
}
+
+int win_getid(typval_T *argvars)
+{
+ if (argvars[0].v_type == VAR_UNKNOWN) {
+ return curwin->handle;
+ }
+ int winnr = tv_get_number(&argvars[0]);
+ win_T *wp;
+ if (winnr > 0) {
+ if (argvars[1].v_type == VAR_UNKNOWN) {
+ wp = firstwin;
+ } else {
+ tabpage_T *tp = NULL;
+ int tabnr = tv_get_number(&argvars[1]);
+ FOR_ALL_TABS(tp2) {
+ if (--tabnr == 0) {
+ tp = tp2;
+ break;
+ }
+ }
+ if (tp == NULL) {
+ return -1;
+ }
+ if (tp == curtab) {
+ wp = firstwin;
+ } else {
+ wp = tp->tp_firstwin;
+ }
+ }
+ for ( ; wp != NULL; wp = wp->w_next) {
+ if (--winnr == 0) {
+ return wp->handle;
+ }
+ }
+ }
+ return 0;
+}
+
+int win_gotoid(typval_T *argvars)
+{
+ int id = tv_get_number(&argvars[0]);
+
+ FOR_ALL_TAB_WINDOWS(tp, wp) {
+ if (wp->handle == id) {
+ goto_tabpage_win(tp, wp);
+ return 1;
+ }
+ }
+ return 0;
+}
+
+void win_get_tabwin(handle_T id, int *tabnr, int *winnr)
+{
+ *tabnr = 0;
+ *winnr = 0;
+
+ int tnum = 1, wnum = 1;
+ FOR_ALL_TABS(tp) {
+ FOR_ALL_WINDOWS_IN_TAB(wp, tp) {
+ if (wp->handle == id) {
+ *winnr = wnum;
+ *tabnr = tnum;
+ return;
+ }
+ wnum++;
+ }
+ tnum++;
+ wnum = 1;
+ }
+}
+
+void win_id2tabwin(typval_T *const argvars, typval_T *const rettv)
+{
+ int winnr = 1;
+ int tabnr = 1;
+ handle_T id = (handle_T)tv_get_number(&argvars[0]);
+
+ win_get_tabwin(id, &tabnr, &winnr);
+
+ list_T *const list = tv_list_alloc_ret(rettv, 2);
+ tv_list_append_number(list, tabnr);
+ tv_list_append_number(list, winnr);
+}
+
+win_T * win_id2wp(typval_T *argvars)
+{
+ int id = tv_get_number(&argvars[0]);
+
+ FOR_ALL_TAB_WINDOWS(tp, wp) {
+ if (wp->handle == id) {
+ return wp;
+ }
+ }
+
+ return NULL;
+}
+
+int win_id2win(typval_T *argvars)
+{
+ int nr = 1;
+ int id = tv_get_number(&argvars[0]);
+
+ FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
+ if (wp->handle == id) {
+ return nr;
+ }
+ nr++;
+ }
+ return 0;
+}
+
+void win_findbuf(typval_T *argvars, list_T *list)
+{
+ int bufnr = tv_get_number(&argvars[0]);
+
+ FOR_ALL_TAB_WINDOWS(tp, wp) {
+ if (wp->w_buffer->b_fnum == bufnr) {
+ tv_list_append_number(list, wp->handle);
+ }
+ }
+}
+
+void win_ui_flush(void)
+{
+ if (!ui_is_external(kUIMultigrid)) {
+ return;
+ }
+
+ FOR_ALL_TAB_WINDOWS(tp, wp) {
+ if (wp->w_pos_changed && wp->w_grid.chars != NULL) {
+ if (tp == curtab) {
+ ui_call_win_pos(wp->w_grid.handle, wp->handle, wp->w_winrow,
+ wp->w_wincol, wp->w_width, wp->w_height);
+ } else {
+ ui_call_win_hide(wp->w_grid.handle);
+ }
+ wp->w_pos_changed = false;
+ }
+ }
+
+}
diff --git a/src/nvim/window.h b/src/nvim/window.h
index 2ac4c00c28..82b3fe5e88 100644
--- a/src/nvim/window.h
+++ b/src/nvim/window.h
@@ -3,6 +3,8 @@
#include <stdbool.h>
+#include "nvim/buffer_defs.h"
+
/* Values for file_name_in_line() */
#define FNAME_MESS 1 /* give error message */
#define FNAME_EXP 2 /* expand to path */
diff --git a/src/nvim/xdiff/COPYING b/src/nvim/xdiff/COPYING
new file mode 100644
index 0000000000..f3f1b3b65e
--- /dev/null
+++ b/src/nvim/xdiff/COPYING
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/src/nvim/xdiff/README.txt b/src/nvim/xdiff/README.txt
new file mode 100644
index 0000000000..1afe74095b
--- /dev/null
+++ b/src/nvim/xdiff/README.txt
@@ -0,0 +1,16 @@
+The files in this directory come from the xdiff implementation in git.
+You can find it here: https://github.com/git/git/tree/master/xdiff
+The files were last updated 2018 September 10.
+
+This is originally based on libxdiff, which can be found here:
+http://www.xmailserver.org/xdiff-lib.html
+
+The git version was used because it has been maintained and improved.
+And since it's part of git it is expected to be reliable.
+
+The code is distributed under the GNU LGPL license. It is included in the
+COPYING file.
+
+Changes in these files were made to avoid compiler warnings.
+
+The first work for including xdiff in Vim was done by Christian Brabandt.
diff --git a/src/nvim/xdiff/xdiff.h b/src/nvim/xdiff/xdiff.h
new file mode 100644
index 0000000000..bc26fb64fd
--- /dev/null
+++ b/src/nvim/xdiff/xdiff.h
@@ -0,0 +1,143 @@
+/*
+ * LibXDiff by Davide Libenzi ( File Differential Library )
+ * Copyright (C) 2003 Davide Libenzi
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Davide Libenzi <davidel@xmailserver.org>
+ *
+ */
+
+#if !defined(XDIFF_H)
+#define XDIFF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* #ifdef __cplusplus */
+
+/* xpparm_t.flags */
+#define XDF_NEED_MINIMAL (1 << 0)
+
+#define XDF_IGNORE_WHITESPACE (1 << 1)
+#define XDF_IGNORE_WHITESPACE_CHANGE (1 << 2)
+#define XDF_IGNORE_WHITESPACE_AT_EOL (1 << 3)
+#define XDF_IGNORE_CR_AT_EOL (1 << 4)
+#define XDF_WHITESPACE_FLAGS (XDF_IGNORE_WHITESPACE | \
+ XDF_IGNORE_WHITESPACE_CHANGE | \
+ XDF_IGNORE_WHITESPACE_AT_EOL | \
+ XDF_IGNORE_CR_AT_EOL)
+
+#define XDF_IGNORE_BLANK_LINES (1 << 7)
+
+#define XDF_PATIENCE_DIFF (1 << 14)
+#define XDF_HISTOGRAM_DIFF (1 << 15)
+#define XDF_DIFF_ALGORITHM_MASK (XDF_PATIENCE_DIFF | XDF_HISTOGRAM_DIFF)
+#define XDF_DIFF_ALG(x) ((x) & XDF_DIFF_ALGORITHM_MASK)
+
+#define XDF_INDENT_HEURISTIC (1 << 23)
+
+/* xdemitconf_t.flags */
+#define XDL_EMIT_FUNCNAMES (1 << 0)
+#define XDL_EMIT_FUNCCONTEXT (1 << 2)
+
+/* merge simplification levels */
+#define XDL_MERGE_MINIMAL 0
+#define XDL_MERGE_EAGER 1
+#define XDL_MERGE_ZEALOUS 2
+#define XDL_MERGE_ZEALOUS_ALNUM 3
+
+/* merge favor modes */
+#define XDL_MERGE_FAVOR_OURS 1
+#define XDL_MERGE_FAVOR_THEIRS 2
+#define XDL_MERGE_FAVOR_UNION 3
+
+/* merge output styles */
+#define XDL_MERGE_DIFF3 1
+
+typedef struct s_mmfile {
+ char *ptr;
+ long size;
+} mmfile_t;
+
+typedef struct s_mmbuffer {
+ char *ptr;
+ long size;
+} mmbuffer_t;
+
+typedef struct s_xpparam {
+ unsigned long flags;
+
+ /* See Documentation/diff-options.txt. */
+ char **anchors;
+ size_t anchors_nr;
+} xpparam_t;
+
+typedef struct s_xdemitcb {
+ void *priv;
+ int (*outf)(void *, mmbuffer_t *, int);
+} xdemitcb_t;
+
+typedef long (*find_func_t)(const char *line, long line_len, char *buffer, long buffer_size, void *priv);
+
+typedef int (*xdl_emit_hunk_consume_func_t)(long start_a, long count_a,
+ long start_b, long count_b,
+ void *cb_data);
+
+typedef struct s_xdemitconf {
+ long ctxlen;
+ long interhunkctxlen;
+ unsigned long flags;
+ find_func_t find_func;
+ void *find_func_priv;
+ xdl_emit_hunk_consume_func_t hunk_func;
+} xdemitconf_t;
+
+typedef struct s_bdiffparam {
+ long bsize;
+} bdiffparam_t;
+
+#include "../memory.h"
+
+#define xdl_malloc(x) xmalloc((x))
+#define xdl_free(ptr) xfree(ptr)
+#define xdl_realloc(ptr,x) xrealloc((ptr),(x))
+
+void *xdl_mmfile_first(mmfile_t *mmf, long *size);
+long xdl_mmfile_size(mmfile_t *mmf);
+
+int xdl_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
+ xdemitconf_t const *xecfg, xdemitcb_t *ecb);
+
+typedef struct s_xmparam {
+ xpparam_t xpp;
+ int marker_size;
+ int level;
+ int favor;
+ int style;
+ const char *ancestor; /* label for orig */
+ const char *file1; /* label for mf1 */
+ const char *file2; /* label for mf2 */
+} xmparam_t;
+
+#define DEFAULT_CONFLICT_MARKER_SIZE 7
+
+int xdl_merge(mmfile_t *orig, mmfile_t *mf1, mmfile_t *mf2,
+ xmparam_t const *xmp, mmbuffer_t *result);
+
+#ifdef __cplusplus
+}
+#endif /* #ifdef __cplusplus */
+
+#endif /* #if !defined(XDIFF_H) */
diff --git a/src/nvim/xdiff/xdiffi.c b/src/nvim/xdiff/xdiffi.c
new file mode 100644
index 0000000000..96d5277027
--- /dev/null
+++ b/src/nvim/xdiff/xdiffi.c
@@ -0,0 +1,1043 @@
+/*
+ * LibXDiff by Davide Libenzi ( File Differential Library )
+ * Copyright (C) 2003 Davide Libenzi
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Davide Libenzi <davidel@xmailserver.org>
+ *
+ */
+
+#include "xinclude.h"
+
+#define XDL_MAX_COST_MIN 256
+#define XDL_HEUR_MIN_COST 256
+#define XDL_LINE_MAX (long)((1UL << (CHAR_BIT * sizeof(long) - 1)) - 1)
+#define XDL_SNAKE_CNT 20
+#define XDL_K_HEUR 4
+
+typedef struct s_xdpsplit {
+ long i1, i2;
+ int min_lo, min_hi;
+} xdpsplit_t;
+
+/*
+ * See "An O(ND) Difference Algorithm and its Variations", by Eugene Myers.
+ * Basically considers a "box" (off1, off2, lim1, lim2) and scan from both
+ * the forward diagonal starting from (off1, off2) and the backward diagonal
+ * starting from (lim1, lim2). If the K values on the same diagonal crosses
+ * returns the furthest point of reach. We might end up having to expensive
+ * cases using this algorithm is full, so a little bit of heuristic is needed
+ * to cut the search and to return a suboptimal point.
+ */
+static long xdl_split(unsigned long const *ha1, long off1, long lim1,
+ unsigned long const *ha2, long off2, long lim2,
+ long *kvdf, long *kvdb, int need_min, xdpsplit_t *spl,
+ xdalgoenv_t *xenv) {
+ long dmin = off1 - lim2, dmax = lim1 - off2;
+ long fmid = off1 - off2, bmid = lim1 - lim2;
+ long odd = (fmid - bmid) & 1;
+ long fmin = fmid, fmax = fmid;
+ long bmin = bmid, bmax = bmid;
+ long ec, d, i1, i2, prev1, best, dd, v, k;
+
+ /*
+ * Set initial diagonal values for both forward and backward path.
+ */
+ kvdf[fmid] = off1;
+ kvdb[bmid] = lim1;
+
+ for (ec = 1;; ec++) {
+ int got_snake = 0;
+
+ /*
+ * We need to extent the diagonal "domain" by one. If the next
+ * values exits the box boundaries we need to change it in the
+ * opposite direction because (max - min) must be a power of two.
+ * Also we initialize the external K value to -1 so that we can
+ * avoid extra conditions check inside the core loop.
+ */
+ if (fmin > dmin)
+ kvdf[--fmin - 1] = -1;
+ else
+ ++fmin;
+ if (fmax < dmax)
+ kvdf[++fmax + 1] = -1;
+ else
+ --fmax;
+
+ for (d = fmax; d >= fmin; d -= 2) {
+ if (kvdf[d - 1] >= kvdf[d + 1])
+ i1 = kvdf[d - 1] + 1;
+ else
+ i1 = kvdf[d + 1];
+ prev1 = i1;
+ i2 = i1 - d;
+ for (; i1 < lim1 && i2 < lim2 && ha1[i1] == ha2[i2]; i1++, i2++);
+ if (i1 - prev1 > xenv->snake_cnt)
+ got_snake = 1;
+ kvdf[d] = i1;
+ if (odd && bmin <= d && d <= bmax && kvdb[d] <= i1) {
+ spl->i1 = i1;
+ spl->i2 = i2;
+ spl->min_lo = spl->min_hi = 1;
+ return ec;
+ }
+ }
+
+ /*
+ * We need to extent the diagonal "domain" by one. If the next
+ * values exits the box boundaries we need to change it in the
+ * opposite direction because (max - min) must be a power of two.
+ * Also we initialize the external K value to -1 so that we can
+ * avoid extra conditions check inside the core loop.
+ */
+ if (bmin > dmin)
+ kvdb[--bmin - 1] = XDL_LINE_MAX;
+ else
+ ++bmin;
+ if (bmax < dmax)
+ kvdb[++bmax + 1] = XDL_LINE_MAX;
+ else
+ --bmax;
+
+ for (d = bmax; d >= bmin; d -= 2) {
+ if (kvdb[d - 1] < kvdb[d + 1])
+ i1 = kvdb[d - 1];
+ else
+ i1 = kvdb[d + 1] - 1;
+ prev1 = i1;
+ i2 = i1 - d;
+ for (; i1 > off1 && i2 > off2 && ha1[i1 - 1] == ha2[i2 - 1]; i1--, i2--);
+ if (prev1 - i1 > xenv->snake_cnt)
+ got_snake = 1;
+ kvdb[d] = i1;
+ if (!odd && fmin <= d && d <= fmax && i1 <= kvdf[d]) {
+ spl->i1 = i1;
+ spl->i2 = i2;
+ spl->min_lo = spl->min_hi = 1;
+ return ec;
+ }
+ }
+
+ if (need_min)
+ continue;
+
+ /*
+ * If the edit cost is above the heuristic trigger and if
+ * we got a good snake, we sample current diagonals to see
+ * if some of the, have reached an "interesting" path. Our
+ * measure is a function of the distance from the diagonal
+ * corner (i1 + i2) penalized with the distance from the
+ * mid diagonal itself. If this value is above the current
+ * edit cost times a magic factor (XDL_K_HEUR) we consider
+ * it interesting.
+ */
+ if (got_snake && ec > xenv->heur_min) {
+ for (best = 0, d = fmax; d >= fmin; d -= 2) {
+ dd = d > fmid ? d - fmid: fmid - d;
+ i1 = kvdf[d];
+ i2 = i1 - d;
+ v = (i1 - off1) + (i2 - off2) - dd;
+
+ if (v > XDL_K_HEUR * ec && v > best &&
+ off1 + xenv->snake_cnt <= i1 && i1 < lim1 &&
+ off2 + xenv->snake_cnt <= i2 && i2 < lim2) {
+ for (k = 1; ha1[i1 - k] == ha2[i2 - k]; k++)
+ if (k == xenv->snake_cnt) {
+ best = v;
+ spl->i1 = i1;
+ spl->i2 = i2;
+ break;
+ }
+ }
+ }
+ if (best > 0) {
+ spl->min_lo = 1;
+ spl->min_hi = 0;
+ return ec;
+ }
+
+ for (best = 0, d = bmax; d >= bmin; d -= 2) {
+ dd = d > bmid ? d - bmid: bmid - d;
+ i1 = kvdb[d];
+ i2 = i1 - d;
+ v = (lim1 - i1) + (lim2 - i2) - dd;
+
+ if (v > XDL_K_HEUR * ec && v > best &&
+ off1 < i1 && i1 <= lim1 - xenv->snake_cnt &&
+ off2 < i2 && i2 <= lim2 - xenv->snake_cnt) {
+ for (k = 0; ha1[i1 + k] == ha2[i2 + k]; k++)
+ if (k == xenv->snake_cnt - 1) {
+ best = v;
+ spl->i1 = i1;
+ spl->i2 = i2;
+ break;
+ }
+ }
+ }
+ if (best > 0) {
+ spl->min_lo = 0;
+ spl->min_hi = 1;
+ return ec;
+ }
+ }
+
+ /*
+ * Enough is enough. We spent too much time here and now we collect
+ * the furthest reaching path using the (i1 + i2) measure.
+ */
+ if (ec >= xenv->mxcost) {
+ long fbest, fbest1, bbest, bbest1;
+
+ fbest = fbest1 = -1;
+ for (d = fmax; d >= fmin; d -= 2) {
+ i1 = XDL_MIN(kvdf[d], lim1);
+ i2 = i1 - d;
+ if (lim2 < i2)
+ i1 = lim2 + d, i2 = lim2;
+ if (fbest < i1 + i2) {
+ fbest = i1 + i2;
+ fbest1 = i1;
+ }
+ }
+
+ bbest = bbest1 = XDL_LINE_MAX;
+ for (d = bmax; d >= bmin; d -= 2) {
+ i1 = XDL_MAX(off1, kvdb[d]);
+ i2 = i1 - d;
+ if (i2 < off2)
+ i1 = off2 + d, i2 = off2;
+ if (i1 + i2 < bbest) {
+ bbest = i1 + i2;
+ bbest1 = i1;
+ }
+ }
+
+ if ((lim1 + lim2) - bbest < fbest - (off1 + off2)) {
+ spl->i1 = fbest1;
+ spl->i2 = fbest - fbest1;
+ spl->min_lo = 1;
+ spl->min_hi = 0;
+ } else {
+ spl->i1 = bbest1;
+ spl->i2 = bbest - bbest1;
+ spl->min_lo = 0;
+ spl->min_hi = 1;
+ }
+ return ec;
+ }
+ }
+}
+
+
+/*
+ * Rule: "Divide et Impera". Recursively split the box in sub-boxes by calling
+ * the box splitting function. Note that the real job (marking changed lines)
+ * is done in the two boundary reaching checks.
+ */
+int xdl_recs_cmp(diffdata_t *dd1, long off1, long lim1,
+ diffdata_t *dd2, long off2, long lim2,
+ long *kvdf, long *kvdb, int need_min, xdalgoenv_t *xenv) {
+ unsigned long const *ha1 = dd1->ha, *ha2 = dd2->ha;
+
+ /*
+ * Shrink the box by walking through each diagonal snake (SW and NE).
+ */
+ for (; off1 < lim1 && off2 < lim2 && ha1[off1] == ha2[off2]; off1++, off2++);
+ for (; off1 < lim1 && off2 < lim2 && ha1[lim1 - 1] == ha2[lim2 - 1]; lim1--, lim2--);
+
+ /*
+ * If one dimension is empty, then all records on the other one must
+ * be obviously changed.
+ */
+ if (off1 == lim1) {
+ char *rchg2 = dd2->rchg;
+ long *rindex2 = dd2->rindex;
+
+ for (; off2 < lim2; off2++)
+ rchg2[rindex2[off2]] = 1;
+ } else if (off2 == lim2) {
+ char *rchg1 = dd1->rchg;
+ long *rindex1 = dd1->rindex;
+
+ for (; off1 < lim1; off1++)
+ rchg1[rindex1[off1]] = 1;
+ } else {
+ xdpsplit_t spl;
+ spl.i1 = spl.i2 = 0;
+
+ /*
+ * Divide ...
+ */
+ if (xdl_split(ha1, off1, lim1, ha2, off2, lim2, kvdf, kvdb,
+ need_min, &spl, xenv) < 0) {
+
+ return -1;
+ }
+
+ /*
+ * ... et Impera.
+ */
+ if (xdl_recs_cmp(dd1, off1, spl.i1, dd2, off2, spl.i2,
+ kvdf, kvdb, spl.min_lo, xenv) < 0 ||
+ xdl_recs_cmp(dd1, spl.i1, lim1, dd2, spl.i2, lim2,
+ kvdf, kvdb, spl.min_hi, xenv) < 0) {
+
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+
+int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
+ xdfenv_t *xe) {
+ long ndiags;
+ long *kvd, *kvdf, *kvdb;
+ xdalgoenv_t xenv;
+ diffdata_t dd1, dd2;
+
+ if (XDF_DIFF_ALG(xpp->flags) == XDF_PATIENCE_DIFF)
+ return xdl_do_patience_diff(mf1, mf2, xpp, xe);
+
+ if (XDF_DIFF_ALG(xpp->flags) == XDF_HISTOGRAM_DIFF)
+ return xdl_do_histogram_diff(mf1, mf2, xpp, xe);
+
+ if (xdl_prepare_env(mf1, mf2, xpp, xe) < 0) {
+
+ return -1;
+ }
+
+ /*
+ * Allocate and setup K vectors to be used by the differential algorithm.
+ * One is to store the forward path and one to store the backward path.
+ */
+ ndiags = xe->xdf1.nreff + xe->xdf2.nreff + 3;
+ if (!(kvd = (long *) xdl_malloc((2 * ndiags + 2) * sizeof(long)))) {
+
+ xdl_free_env(xe);
+ return -1;
+ }
+ kvdf = kvd;
+ kvdb = kvdf + ndiags;
+ kvdf += xe->xdf2.nreff + 1;
+ kvdb += xe->xdf2.nreff + 1;
+
+ xenv.mxcost = xdl_bogosqrt(ndiags);
+ if (xenv.mxcost < XDL_MAX_COST_MIN)
+ xenv.mxcost = XDL_MAX_COST_MIN;
+ xenv.snake_cnt = XDL_SNAKE_CNT;
+ xenv.heur_min = XDL_HEUR_MIN_COST;
+
+ dd1.nrec = xe->xdf1.nreff;
+ dd1.ha = xe->xdf1.ha;
+ dd1.rchg = xe->xdf1.rchg;
+ dd1.rindex = xe->xdf1.rindex;
+ dd2.nrec = xe->xdf2.nreff;
+ dd2.ha = xe->xdf2.ha;
+ dd2.rchg = xe->xdf2.rchg;
+ dd2.rindex = xe->xdf2.rindex;
+
+ if (xdl_recs_cmp(&dd1, 0, dd1.nrec, &dd2, 0, dd2.nrec,
+ kvdf, kvdb, (xpp->flags & XDF_NEED_MINIMAL) != 0, &xenv) < 0) {
+
+ xdl_free(kvd);
+ xdl_free_env(xe);
+ return -1;
+ }
+
+ xdl_free(kvd);
+
+ return 0;
+}
+
+
+static xdchange_t *xdl_add_change(xdchange_t *xscr, long i1, long i2, long chg1, long chg2) {
+ xdchange_t *xch;
+
+ if (!(xch = (xdchange_t *) xdl_malloc(sizeof(xdchange_t))))
+ return NULL;
+
+ xch->next = xscr;
+ xch->i1 = i1;
+ xch->i2 = i2;
+ xch->chg1 = chg1;
+ xch->chg2 = chg2;
+ xch->ignore = 0;
+
+ return xch;
+}
+
+
+static int recs_match(xrecord_t *rec1, xrecord_t *rec2, long flags)
+{
+ return (rec1->ha == rec2->ha &&
+ xdl_recmatch(rec1->ptr, rec1->size,
+ rec2->ptr, rec2->size,
+ flags));
+}
+
+/*
+ * If a line is indented more than this, xget_indent() just returns this value.
+ * This avoids having to do absurd amounts of work for data that are not
+ * human-readable text, and also ensures that the output of xget_indent fits within
+ * an int.
+ */
+#define MAX_INDENT 200
+
+/*
+ * Return the amount of indentation of the specified line, treating TAB as 8
+ * columns. Return -1 if line is empty or contains only whitespace. Clamp the
+ * output value at MAX_INDENT.
+ */
+static int xget_indent(xrecord_t *rec)
+{
+ long i;
+ int ret = 0;
+
+ for (i = 0; i < rec->size; i++) {
+ char c = rec->ptr[i];
+
+ if (!XDL_ISSPACE(c))
+ return ret;
+ else if (c == ' ')
+ ret += 1;
+ else if (c == '\t')
+ ret += 8 - ret % 8;
+ /* ignore other whitespace characters */
+
+ if (ret >= MAX_INDENT)
+ return MAX_INDENT;
+ }
+
+ /* The line contains only whitespace. */
+ return -1;
+}
+
+/*
+ * If more than this number of consecutive blank rows are found, just return this
+ * value. This avoids requiring O(N^2) work for pathological cases, and also
+ * ensures that the output of score_split fits in an int.
+ */
+#define MAX_BLANKS 20
+
+/* Characteristics measured about a hypothetical split position. */
+struct split_measurement {
+ /*
+ * Is the split at the end of the file (aside from any blank lines)?
+ */
+ int end_of_file;
+
+ /*
+ * How much is the line immediately following the split indented (or -1 if
+ * the line is blank):
+ */
+ int indent;
+
+ /*
+ * How many consecutive lines above the split are blank?
+ */
+ int pre_blank;
+
+ /*
+ * How much is the nearest non-blank line above the split indented (or -1
+ * if there is no such line)?
+ */
+ int pre_indent;
+
+ /*
+ * How many lines after the line following the split are blank?
+ */
+ int post_blank;
+
+ /*
+ * How much is the nearest non-blank line after the line following the
+ * split indented (or -1 if there is no such line)?
+ */
+ int post_indent;
+};
+
+struct split_score {
+ /* The effective indent of this split (smaller is preferred). */
+ int effective_indent;
+
+ /* Penalty for this split (smaller is preferred). */
+ int penalty;
+};
+
+/*
+ * Fill m with information about a hypothetical split of xdf above line split.
+ */
+static void measure_split(const xdfile_t *xdf, long split,
+ struct split_measurement *m)
+{
+ long i;
+
+ if (split >= xdf->nrec) {
+ m->end_of_file = 1;
+ m->indent = -1;
+ } else {
+ m->end_of_file = 0;
+ m->indent = xget_indent(xdf->recs[split]);
+ }
+
+ m->pre_blank = 0;
+ m->pre_indent = -1;
+ for (i = split - 1; i >= 0; i--) {
+ m->pre_indent = xget_indent(xdf->recs[i]);
+ if (m->pre_indent != -1)
+ break;
+ m->pre_blank += 1;
+ if (m->pre_blank == MAX_BLANKS) {
+ m->pre_indent = 0;
+ break;
+ }
+ }
+
+ m->post_blank = 0;
+ m->post_indent = -1;
+ for (i = split + 1; i < xdf->nrec; i++) {
+ m->post_indent = xget_indent(xdf->recs[i]);
+ if (m->post_indent != -1)
+ break;
+ m->post_blank += 1;
+ if (m->post_blank == MAX_BLANKS) {
+ m->post_indent = 0;
+ break;
+ }
+ }
+}
+
+/*
+ * The empirically-determined weight factors used by score_split() below.
+ * Larger values means that the position is a less favorable place to split.
+ *
+ * Note that scores are only ever compared against each other, so multiplying
+ * all of these weight/penalty values by the same factor wouldn't change the
+ * heuristic's behavior. Still, we need to set that arbitrary scale *somehow*.
+ * In practice, these numbers are chosen to be large enough that they can be
+ * adjusted relative to each other with sufficient precision despite using
+ * integer math.
+ */
+
+/* Penalty if there are no non-blank lines before the split */
+#define START_OF_FILE_PENALTY 1
+
+/* Penalty if there are no non-blank lines after the split */
+#define END_OF_FILE_PENALTY 21
+
+/* Multiplier for the number of blank lines around the split */
+#define TOTAL_BLANK_WEIGHT (-30)
+
+/* Multiplier for the number of blank lines after the split */
+#define POST_BLANK_WEIGHT 6
+
+/*
+ * Penalties applied if the line is indented more than its predecessor
+ */
+#define RELATIVE_INDENT_PENALTY (-4)
+#define RELATIVE_INDENT_WITH_BLANK_PENALTY 10
+
+/*
+ * Penalties applied if the line is indented less than both its predecessor and
+ * its successor
+ */
+#define RELATIVE_OUTDENT_PENALTY 24
+#define RELATIVE_OUTDENT_WITH_BLANK_PENALTY 17
+
+/*
+ * Penalties applied if the line is indented less than its predecessor but not
+ * less than its successor
+ */
+#define RELATIVE_DEDENT_PENALTY 23
+#define RELATIVE_DEDENT_WITH_BLANK_PENALTY 17
+
+/*
+ * We only consider whether the sum of the effective indents for splits are
+ * less than (-1), equal to (0), or greater than (+1) each other. The resulting
+ * value is multiplied by the following weight and combined with the penalty to
+ * determine the better of two scores.
+ */
+#define INDENT_WEIGHT 60
+
+/*
+ * How far do we slide a hunk at most?
+ */
+#define INDENT_HEURISTIC_MAX_SLIDING 100
+
+/*
+ * Compute a badness score for the hypothetical split whose measurements are
+ * stored in m. The weight factors were determined empirically using the tools and
+ * corpus described in
+ *
+ * https://github.com/mhagger/diff-slider-tools
+ *
+ * Also see that project if you want to improve the weights based on, for example,
+ * a larger or more diverse corpus.
+ */
+static void score_add_split(const struct split_measurement *m, struct split_score *s)
+{
+ /*
+ * A place to accumulate penalty factors (positive makes this index more
+ * favored):
+ */
+ int post_blank, total_blank, indent, any_blanks;
+
+ if (m->pre_indent == -1 && m->pre_blank == 0)
+ s->penalty += START_OF_FILE_PENALTY;
+
+ if (m->end_of_file)
+ s->penalty += END_OF_FILE_PENALTY;
+
+ /*
+ * Set post_blank to the number of blank lines following the split,
+ * including the line immediately after the split:
+ */
+ post_blank = (m->indent == -1) ? 1 + m->post_blank : 0;
+ total_blank = m->pre_blank + post_blank;
+
+ /* Penalties based on nearby blank lines: */
+ s->penalty += TOTAL_BLANK_WEIGHT * total_blank;
+ s->penalty += POST_BLANK_WEIGHT * post_blank;
+
+ if (m->indent != -1)
+ indent = m->indent;
+ else
+ indent = m->post_indent;
+
+ any_blanks = (total_blank != 0);
+
+ /* Note that the effective indent is -1 at the end of the file: */
+ s->effective_indent += indent;
+
+ if (indent == -1) {
+ /* No additional adjustments needed. */
+ } else if (m->pre_indent == -1) {
+ /* No additional adjustments needed. */
+ } else if (indent > m->pre_indent) {
+ /*
+ * The line is indented more than its predecessor.
+ */
+ s->penalty += any_blanks ?
+ RELATIVE_INDENT_WITH_BLANK_PENALTY :
+ RELATIVE_INDENT_PENALTY;
+ } else if (indent == m->pre_indent) {
+ /*
+ * The line has the same indentation level as its predecessor.
+ * No additional adjustments needed.
+ */
+ } else {
+ /*
+ * The line is indented less than its predecessor. It could be
+ * the block terminator of the previous block, but it could
+ * also be the start of a new block (e.g., an "else" block, or
+ * maybe the previous block didn't have a block terminator).
+ * Try to distinguish those cases based on what comes next:
+ */
+ if (m->post_indent != -1 && m->post_indent > indent) {
+ /*
+ * The following line is indented more. So it is likely
+ * that this line is the start of a block.
+ */
+ s->penalty += any_blanks ?
+ RELATIVE_OUTDENT_WITH_BLANK_PENALTY :
+ RELATIVE_OUTDENT_PENALTY;
+ } else {
+ /*
+ * That was probably the end of a block.
+ */
+ s->penalty += any_blanks ?
+ RELATIVE_DEDENT_WITH_BLANK_PENALTY :
+ RELATIVE_DEDENT_PENALTY;
+ }
+ }
+}
+
+static int score_cmp(struct split_score *s1, struct split_score *s2)
+{
+ /* -1 if s1.effective_indent < s2->effective_indent, etc. */
+ int cmp_indents = ((s1->effective_indent > s2->effective_indent) -
+ (s1->effective_indent < s2->effective_indent));
+
+ return INDENT_WEIGHT * cmp_indents + (s1->penalty - s2->penalty);
+}
+
+/*
+ * Represent a group of changed lines in an xdfile_t (i.e., a contiguous group
+ * of lines that was inserted or deleted from the corresponding version of the
+ * file). We consider there to be such a group at the beginning of the file, at
+ * the end of the file, and between any two unchanged lines, though most such
+ * groups will usually be empty.
+ *
+ * If the first line in a group is equal to the line following the group, then
+ * the group can be slid down. Similarly, if the last line in a group is equal
+ * to the line preceding the group, then the group can be slid up. See
+ * group_slide_down() and group_slide_up().
+ *
+ * Note that loops that are testing for changed lines in xdf->rchg do not need
+ * index bounding since the array is prepared with a zero at position -1 and N.
+ */
+struct xdlgroup {
+ /*
+ * The index of the first changed line in the group, or the index of
+ * the unchanged line above which the (empty) group is located.
+ */
+ long start;
+
+ /*
+ * The index of the first unchanged line after the group. For an empty
+ * group, end is equal to start.
+ */
+ long end;
+};
+
+/*
+ * Initialize g to point at the first group in xdf.
+ */
+static void group_init(xdfile_t *xdf, struct xdlgroup *g)
+{
+ g->start = g->end = 0;
+ while (xdf->rchg[g->end])
+ g->end++;
+}
+
+/*
+ * Move g to describe the next (possibly empty) group in xdf and return 0. If g
+ * is already at the end of the file, do nothing and return -1.
+ */
+static inline int group_next(xdfile_t *xdf, struct xdlgroup *g)
+{
+ if (g->end == xdf->nrec)
+ return -1;
+
+ g->start = g->end + 1;
+ for (g->end = g->start; xdf->rchg[g->end]; g->end++)
+ ;
+
+ return 0;
+}
+
+/*
+ * Move g to describe the previous (possibly empty) group in xdf and return 0.
+ * If g is already at the beginning of the file, do nothing and return -1.
+ */
+static inline int group_previous(xdfile_t *xdf, struct xdlgroup *g)
+{
+ if (g->start == 0)
+ return -1;
+
+ g->end = g->start - 1;
+ for (g->start = g->end; xdf->rchg[g->start - 1]; g->start--)
+ ;
+
+ return 0;
+}
+
+/*
+ * If g can be slid toward the end of the file, do so, and if it bumps into a
+ * following group, expand this group to include it. Return 0 on success or -1
+ * if g cannot be slid down.
+ */
+static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g, long flags)
+{
+ if (g->end < xdf->nrec &&
+ recs_match(xdf->recs[g->start], xdf->recs[g->end], flags)) {
+ xdf->rchg[g->start++] = 0;
+ xdf->rchg[g->end++] = 1;
+
+ while (xdf->rchg[g->end])
+ g->end++;
+
+ return 0;
+ } else {
+ return -1;
+ }
+}
+
+/*
+ * If g can be slid toward the beginning of the file, do so, and if it bumps
+ * into a previous group, expand this group to include it. Return 0 on success
+ * or -1 if g cannot be slid up.
+ */
+static int group_slide_up(xdfile_t *xdf, struct xdlgroup *g, long flags)
+{
+ if (g->start > 0 &&
+ recs_match(xdf->recs[g->start - 1], xdf->recs[g->end - 1], flags)) {
+ xdf->rchg[--g->start] = 1;
+ xdf->rchg[--g->end] = 0;
+
+ while (xdf->rchg[g->start - 1])
+ g->start--;
+
+ return 0;
+ } else {
+ return -1;
+ }
+}
+
+static void xdl_bug(const char *msg)
+{
+ fprintf(stderr, "BUG: %s\n", msg);
+ exit(1);
+}
+
+/*
+ * Move back and forward change groups for a consistent and pretty diff output.
+ * This also helps in finding joinable change groups and reducing the diff
+ * size.
+ */
+int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
+ struct xdlgroup g, go;
+ long earliest_end, end_matching_other;
+ long groupsize;
+
+ group_init(xdf, &g);
+ group_init(xdfo, &go);
+
+ while (1) {
+ /* If the group is empty in the to-be-compacted file, skip it: */
+ if (g.end == g.start)
+ goto next;
+
+ /*
+ * Now shift the change up and then down as far as possible in
+ * each direction. If it bumps into any other changes, merge them.
+ */
+ do {
+ groupsize = g.end - g.start;
+
+ /*
+ * Keep track of the last "end" index that causes this
+ * group to align with a group of changed lines in the
+ * other file. -1 indicates that we haven't found such
+ * a match yet:
+ */
+ end_matching_other = -1;
+
+ /* Shift the group backward as much as possible: */
+ while (!group_slide_up(xdf, &g, flags))
+ if (group_previous(xdfo, &go))
+ xdl_bug("group sync broken sliding up");
+
+ /*
+ * This is this highest that this group can be shifted.
+ * Record its end index:
+ */
+ earliest_end = g.end;
+
+ if (go.end > go.start)
+ end_matching_other = g.end;
+
+ /* Now shift the group forward as far as possible: */
+ while (1) {
+ if (group_slide_down(xdf, &g, flags))
+ break;
+ if (group_next(xdfo, &go))
+ xdl_bug("group sync broken sliding down");
+
+ if (go.end > go.start)
+ end_matching_other = g.end;
+ }
+ } while (groupsize != g.end - g.start);
+
+ /*
+ * If the group can be shifted, then we can possibly use this
+ * freedom to produce a more intuitive diff.
+ *
+ * The group is currently shifted as far down as possible, so the
+ * heuristics below only have to handle upwards shifts.
+ */
+
+ if (g.end == earliest_end) {
+ /* no shifting was possible */
+ } else if (end_matching_other != -1) {
+ /*
+ * Move the possibly merged group of changes back to line
+ * up with the last group of changes from the other file
+ * that it can align with.
+ */
+ while (go.end == go.start) {
+ if (group_slide_up(xdf, &g, flags))
+ xdl_bug("match disappeared");
+ if (group_previous(xdfo, &go))
+ xdl_bug("group sync broken sliding to match");
+ }
+ } else if (flags & XDF_INDENT_HEURISTIC) {
+ /*
+ * Indent heuristic: a group of pure add/delete lines
+ * implies two splits, one between the end of the "before"
+ * context and the start of the group, and another between
+ * the end of the group and the beginning of the "after"
+ * context. Some splits are aesthetically better and some
+ * are worse. We compute a badness "score" for each split,
+ * and add the scores for the two splits to define a
+ * "score" for each position that the group can be shifted
+ * to. Then we pick the shift with the lowest score.
+ */
+ long shift, best_shift = -1;
+ struct split_score best_score;
+
+ shift = earliest_end;
+ if (g.end - groupsize - 1 > shift)
+ shift = g.end - groupsize - 1;
+ if (g.end - INDENT_HEURISTIC_MAX_SLIDING > shift)
+ shift = g.end - INDENT_HEURISTIC_MAX_SLIDING;
+ for (; shift <= g.end; shift++) {
+ struct split_measurement m;
+ struct split_score score = {0, 0};
+
+ measure_split(xdf, shift, &m);
+ score_add_split(&m, &score);
+ measure_split(xdf, shift - groupsize, &m);
+ score_add_split(&m, &score);
+ if (best_shift == -1 ||
+ score_cmp(&score, &best_score) <= 0) {
+ best_score.effective_indent = score.effective_indent;
+ best_score.penalty = score.penalty;
+ best_shift = shift;
+ }
+ }
+
+ while (g.end > best_shift) {
+ if (group_slide_up(xdf, &g, flags))
+ xdl_bug("best shift unreached");
+ if (group_previous(xdfo, &go))
+ xdl_bug("group sync broken sliding to blank line");
+ }
+ }
+
+ next:
+ /* Move past the just-processed group: */
+ if (group_next(xdf, &g))
+ break;
+ if (group_next(xdfo, &go))
+ xdl_bug("group sync broken moving to next group");
+ }
+
+ if (!group_next(xdfo, &go))
+ xdl_bug("group sync broken at end of file");
+
+ return 0;
+}
+
+
+int xdl_build_script(xdfenv_t *xe, xdchange_t **xscr) {
+ xdchange_t *cscr = NULL, *xch;
+ char *rchg1 = xe->xdf1.rchg, *rchg2 = xe->xdf2.rchg;
+ long i1, i2, l1, l2;
+
+ /*
+ * Trivial. Collects "groups" of changes and creates an edit script.
+ */
+ for (i1 = xe->xdf1.nrec, i2 = xe->xdf2.nrec; i1 >= 0 || i2 >= 0; i1--, i2--)
+ if (rchg1[i1 - 1] || rchg2[i2 - 1]) {
+ for (l1 = i1; rchg1[i1 - 1]; i1--);
+ for (l2 = i2; rchg2[i2 - 1]; i2--);
+
+ if (!(xch = xdl_add_change(cscr, i1, i2, l1 - i1, l2 - i2))) {
+ xdl_free_script(cscr);
+ return -1;
+ }
+ cscr = xch;
+ }
+
+ *xscr = cscr;
+
+ return 0;
+}
+
+
+void xdl_free_script(xdchange_t *xscr) {
+ xdchange_t *xch;
+
+ while ((xch = xscr) != NULL) {
+ xscr = xscr->next;
+ xdl_free(xch);
+ }
+}
+
+static int xdl_call_hunk_func(xdfenv_t *xe UNUSED, xdchange_t *xscr, xdemitcb_t *ecb,
+ xdemitconf_t const *xecfg)
+{
+ xdchange_t *xch, *xche;
+
+ for (xch = xscr; xch; xch = xche->next) {
+ xche = xdl_get_hunk(&xch, xecfg);
+ if (!xch)
+ break;
+ if (xecfg->hunk_func(xch->i1, xche->i1 + xche->chg1 - xch->i1,
+ xch->i2, xche->i2 + xche->chg2 - xch->i2,
+ ecb->priv) < 0)
+ return -1;
+ }
+ return 0;
+}
+
+static void xdl_mark_ignorable(xdchange_t *xscr, xdfenv_t *xe, long flags)
+{
+ xdchange_t *xch;
+
+ for (xch = xscr; xch; xch = xch->next) {
+ int ignore = 1;
+ xrecord_t **rec;
+ long i;
+
+ rec = &xe->xdf1.recs[xch->i1];
+ for (i = 0; i < xch->chg1 && ignore; i++)
+ ignore = xdl_blankline(rec[i]->ptr, rec[i]->size, flags);
+
+ rec = &xe->xdf2.recs[xch->i2];
+ for (i = 0; i < xch->chg2 && ignore; i++)
+ ignore = xdl_blankline(rec[i]->ptr, rec[i]->size, flags);
+
+ xch->ignore = ignore;
+ }
+}
+
+int xdl_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
+ xdemitconf_t const *xecfg, xdemitcb_t *ecb) {
+ xdchange_t *xscr;
+ xdfenv_t xe;
+ emit_func_t ef = xecfg->hunk_func ? xdl_call_hunk_func : xdl_emit_diff;
+
+ if (xdl_do_diff(mf1, mf2, xpp, &xe) < 0) {
+
+ return -1;
+ }
+ if (xdl_change_compact(&xe.xdf1, &xe.xdf2, xpp->flags) < 0 ||
+ xdl_change_compact(&xe.xdf2, &xe.xdf1, xpp->flags) < 0 ||
+ xdl_build_script(&xe, &xscr) < 0) {
+
+ xdl_free_env(&xe);
+ return -1;
+ }
+ if (xscr) {
+ if (xpp->flags & XDF_IGNORE_BLANK_LINES)
+ xdl_mark_ignorable(xscr, &xe, xpp->flags);
+
+ if (ef(&xe, xscr, ecb, xecfg) < 0) {
+
+ xdl_free_script(xscr);
+ xdl_free_env(&xe);
+ return -1;
+ }
+ xdl_free_script(xscr);
+ }
+ xdl_free_env(&xe);
+
+ return 0;
+}
diff --git a/src/nvim/xdiff/xdiffi.h b/src/nvim/xdiff/xdiffi.h
new file mode 100644
index 0000000000..8f1c7c8b04
--- /dev/null
+++ b/src/nvim/xdiff/xdiffi.h
@@ -0,0 +1,64 @@
+/*
+ * LibXDiff by Davide Libenzi ( File Differential Library )
+ * Copyright (C) 2003 Davide Libenzi
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Davide Libenzi <davidel@xmailserver.org>
+ *
+ */
+
+#if !defined(XDIFFI_H)
+#define XDIFFI_H
+
+
+typedef struct s_diffdata {
+ long nrec;
+ unsigned long const *ha;
+ long *rindex;
+ char *rchg;
+} diffdata_t;
+
+typedef struct s_xdalgoenv {
+ long mxcost;
+ long snake_cnt;
+ long heur_min;
+} xdalgoenv_t;
+
+typedef struct s_xdchange {
+ struct s_xdchange *next;
+ long i1, i2;
+ long chg1, chg2;
+ int ignore;
+} xdchange_t;
+
+
+
+int xdl_recs_cmp(diffdata_t *dd1, long off1, long lim1,
+ diffdata_t *dd2, long off2, long lim2,
+ long *kvdf, long *kvdb, int need_min, xdalgoenv_t *xenv);
+int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
+ xdfenv_t *xe);
+int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags);
+int xdl_build_script(xdfenv_t *xe, xdchange_t **xscr);
+void xdl_free_script(xdchange_t *xscr);
+int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
+ xdemitconf_t const *xecfg);
+int xdl_do_patience_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
+ xdfenv_t *env);
+int xdl_do_histogram_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
+ xdfenv_t *env);
+
+#endif /* #if !defined(XDIFFI_H) */
diff --git a/src/nvim/xdiff/xemit.c b/src/nvim/xdiff/xemit.c
new file mode 100644
index 0000000000..d8a6f1ed38
--- /dev/null
+++ b/src/nvim/xdiff/xemit.c
@@ -0,0 +1,332 @@
+/*
+ * LibXDiff by Davide Libenzi ( File Differential Library )
+ * Copyright (C) 2003 Davide Libenzi
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Davide Libenzi <davidel@xmailserver.org>
+ *
+ */
+
+#include "xinclude.h"
+
+static long xdl_get_rec(xdfile_t *xdf, long ri, char const **rec) {
+
+ *rec = xdf->recs[ri]->ptr;
+
+ return xdf->recs[ri]->size;
+}
+
+
+static int xdl_emit_record(xdfile_t *xdf, long ri, char const *pre, xdemitcb_t *ecb) {
+ long size, psize = (long)strlen(pre);
+ char const *rec;
+
+ size = xdl_get_rec(xdf, ri, &rec);
+ if (xdl_emit_diffrec(rec, size, pre, psize, ecb) < 0) {
+
+ return -1;
+ }
+
+ return 0;
+}
+
+
+/*
+ * Starting at the passed change atom, find the latest change atom to be included
+ * inside the differential hunk according to the specified configuration.
+ * Also advance xscr if the first changes must be discarded.
+ */
+xdchange_t *xdl_get_hunk(xdchange_t **xscr, xdemitconf_t const *xecfg)
+{
+ xdchange_t *xch, *xchp, *lxch;
+ long max_common = 2 * xecfg->ctxlen + xecfg->interhunkctxlen;
+ long max_ignorable = xecfg->ctxlen;
+ unsigned long ignored = 0; /* number of ignored blank lines */
+
+ /* remove ignorable changes that are too far before other changes */
+ for (xchp = *xscr; xchp && xchp->ignore; xchp = xchp->next) {
+ xch = xchp->next;
+
+ if (xch == NULL ||
+ xch->i1 - (xchp->i1 + xchp->chg1) >= max_ignorable)
+ *xscr = xch;
+ }
+
+ if (*xscr == NULL)
+ return NULL;
+
+ lxch = *xscr;
+
+ for (xchp = *xscr, xch = xchp->next; xch; xchp = xch, xch = xch->next) {
+ long distance = xch->i1 - (xchp->i1 + xchp->chg1);
+ if (distance > max_common)
+ break;
+
+ if (distance < max_ignorable && (!xch->ignore || lxch == xchp)) {
+ lxch = xch;
+ ignored = 0;
+ } else if (distance < max_ignorable && xch->ignore) {
+ ignored += xch->chg2;
+ } else if (lxch != xchp &&
+ xch->i1 + (long)ignored - (lxch->i1 + lxch->chg1) > max_common) {
+ break;
+ } else if (!xch->ignore) {
+ lxch = xch;
+ ignored = 0;
+ } else {
+ ignored += xch->chg2;
+ }
+ }
+
+ return lxch;
+}
+
+
+#if 0
+static long def_ff(const char *rec, long len, char *buf, long sz, void *priv UNUSED)
+{
+ if (len > 0 &&
+ (isalpha((unsigned char)*rec) || /* identifier? */
+ *rec == '_' || /* also identifier? */
+ *rec == '$')) { /* identifiers from VMS and other esoterico */
+ if (len > sz)
+ len = sz;
+ while (0 < len && isspace((unsigned char)rec[len - 1]))
+ len--;
+ memcpy(buf, rec, len);
+ return len;
+ }
+ return -1;
+}
+#endif
+
+#if 0
+static long match_func_rec(xdfile_t *xdf, xdemitconf_t const *xecfg, long ri,
+ char *buf, long sz)
+{
+ const char *rec;
+ long len = xdl_get_rec(xdf, ri, &rec);
+ if (!xecfg->find_func)
+ return def_ff(rec, len, buf, sz, xecfg->find_func_priv);
+ return xecfg->find_func(rec, len, buf, sz, xecfg->find_func_priv);
+}
+#endif
+
+#if 0
+static int is_func_rec(xdfile_t *xdf, xdemitconf_t const *xecfg, long ri)
+{
+ char dummy[1];
+ return match_func_rec(xdf, xecfg, ri, dummy, sizeof(dummy)) >= 0;
+}
+#endif
+
+struct func_line {
+ long len;
+ char buf[80];
+};
+
+#if 0
+static long get_func_line(xdfenv_t *xe, xdemitconf_t const *xecfg,
+ struct func_line *func_line, long start, long limit)
+{
+ long l, size, step = (start > limit) ? -1 : 1;
+ char *buf, dummy[1];
+
+ buf = func_line ? func_line->buf : dummy;
+ size = func_line ? sizeof(func_line->buf) : sizeof(dummy);
+
+ for (l = start; l != limit && 0 <= l && l < xe->xdf1.nrec; l += step) {
+ long len = match_func_rec(&xe->xdf1, xecfg, l, buf, size);
+ if (len >= 0) {
+ if (func_line)
+ func_line->len = len;
+ return l;
+ }
+ }
+ return -1;
+}
+#endif
+
+#if 0
+static int is_empty_rec(xdfile_t *xdf, long ri)
+{
+ const char *rec;
+ long len = xdl_get_rec(xdf, ri, &rec);
+
+ while (len > 0 && XDL_ISSPACE(*rec)) {
+ rec++;
+ len--;
+ }
+ return !len;
+}
+#endif
+
+int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
+ xdemitconf_t const *xecfg) {
+ long s1, s2, e1, e2, lctx;
+ xdchange_t *xch, *xche;
+#if 0
+ long funclineprev = -1;
+#endif
+ struct func_line func_line;
+
+ func_line.len = 0;
+
+ for (xch = xscr; xch; xch = xche->next) {
+ xche = xdl_get_hunk(&xch, xecfg);
+ if (!xch)
+ break;
+
+ s1 = XDL_MAX(xch->i1 - xecfg->ctxlen, 0);
+ s2 = XDL_MAX(xch->i2 - xecfg->ctxlen, 0);
+
+#if 0
+ if (xecfg->flags & XDL_EMIT_FUNCCONTEXT) {
+ long fs1, i1 = xch->i1;
+
+ /* Appended chunk? */
+ if (i1 >= xe->xdf1.nrec) {
+ long i2 = xch->i2;
+
+ /*
+ * We don't need additional context if
+ * a whole function was added.
+ */
+ while (i2 < xe->xdf2.nrec) {
+ if (is_func_rec(&xe->xdf2, xecfg, i2))
+ goto post_context_calculation;
+ i2++;
+ }
+
+ /*
+ * Otherwise get more context from the
+ * pre-image.
+ */
+ i1 = xe->xdf1.nrec - 1;
+ }
+
+ fs1 = get_func_line(xe, xecfg, NULL, i1, -1);
+ while (fs1 > 0 && !is_empty_rec(&xe->xdf1, fs1 - 1) &&
+ !is_func_rec(&xe->xdf1, xecfg, fs1 - 1))
+ fs1--;
+ if (fs1 < 0)
+ fs1 = 0;
+ if (fs1 < s1) {
+ s2 -= s1 - fs1;
+ s1 = fs1;
+ }
+ }
+
+ post_context_calculation:
+#endif
+ lctx = xecfg->ctxlen;
+ lctx = XDL_MIN(lctx, xe->xdf1.nrec - (xche->i1 + xche->chg1));
+ lctx = XDL_MIN(lctx, xe->xdf2.nrec - (xche->i2 + xche->chg2));
+
+ e1 = xche->i1 + xche->chg1 + lctx;
+ e2 = xche->i2 + xche->chg2 + lctx;
+
+#if 0
+ if (xecfg->flags & XDL_EMIT_FUNCCONTEXT) {
+ long fe1 = get_func_line(xe, xecfg, NULL,
+ xche->i1 + xche->chg1,
+ xe->xdf1.nrec);
+ while (fe1 > 0 && is_empty_rec(&xe->xdf1, fe1 - 1))
+ fe1--;
+ if (fe1 < 0)
+ fe1 = xe->xdf1.nrec;
+ if (fe1 > e1) {
+ e2 += fe1 - e1;
+ e1 = fe1;
+ }
+
+ /*
+ * Overlap with next change? Then include it
+ * in the current hunk and start over to find
+ * its new end.
+ */
+ if (xche->next) {
+ long l = XDL_MIN(xche->next->i1,
+ xe->xdf1.nrec - 1);
+ if (l - xecfg->ctxlen <= e1 ||
+ get_func_line(xe, xecfg, NULL, l, e1) < 0) {
+ xche = xche->next;
+ goto post_context_calculation;
+ }
+ }
+ }
+#endif
+
+ /*
+ * Emit current hunk header.
+ */
+
+#if 0
+ if (xecfg->flags & XDL_EMIT_FUNCNAMES) {
+ get_func_line(xe, xecfg, &func_line,
+ s1 - 1, funclineprev);
+ funclineprev = s1 - 1;
+ }
+#endif
+ if (xdl_emit_hunk_hdr(s1 + 1, e1 - s1, s2 + 1, e2 - s2,
+ func_line.buf, func_line.len, ecb) < 0)
+ return -1;
+
+ /*
+ * Emit pre-context.
+ */
+ for (; s2 < xch->i2; s2++)
+ if (xdl_emit_record(&xe->xdf2, s2, " ", ecb) < 0)
+ return -1;
+
+ for (s1 = xch->i1, s2 = xch->i2;; xch = xch->next) {
+ /*
+ * Merge previous with current change atom.
+ */
+ for (; s1 < xch->i1 && s2 < xch->i2; s1++, s2++)
+ if (xdl_emit_record(&xe->xdf2, s2, " ", ecb) < 0)
+ return -1;
+
+ /*
+ * Removes lines from the first file.
+ */
+ for (s1 = xch->i1; s1 < xch->i1 + xch->chg1; s1++)
+ if (xdl_emit_record(&xe->xdf1, s1, "-", ecb) < 0)
+ return -1;
+
+ /*
+ * Adds lines from the second file.
+ */
+ for (s2 = xch->i2; s2 < xch->i2 + xch->chg2; s2++)
+ if (xdl_emit_record(&xe->xdf2, s2, "+", ecb) < 0)
+ return -1;
+
+ if (xch == xche)
+ break;
+ s1 = xch->i1 + xch->chg1;
+ s2 = xch->i2 + xch->chg2;
+ }
+
+ /*
+ * Emit post-context.
+ */
+ for (s2 = xche->i2 + xche->chg2; s2 < e2; s2++)
+ if (xdl_emit_record(&xe->xdf2, s2, " ", ecb) < 0)
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/src/nvim/xdiff/xemit.h b/src/nvim/xdiff/xemit.h
new file mode 100644
index 0000000000..1b9887e670
--- /dev/null
+++ b/src/nvim/xdiff/xemit.h
@@ -0,0 +1,36 @@
+/*
+ * LibXDiff by Davide Libenzi ( File Differential Library )
+ * Copyright (C) 2003 Davide Libenzi
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Davide Libenzi <davidel@xmailserver.org>
+ *
+ */
+
+#if !defined(XEMIT_H)
+#define XEMIT_H
+
+
+typedef int (*emit_func_t)(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
+ xdemitconf_t const *xecfg);
+
+xdchange_t *xdl_get_hunk(xdchange_t **xscr, xdemitconf_t const *xecfg);
+int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
+ xdemitconf_t const *xecfg);
+
+
+
+#endif /* #if !defined(XEMIT_H) */
diff --git a/src/nvim/xdiff/xhistogram.c b/src/nvim/xdiff/xhistogram.c
new file mode 100644
index 0000000000..3fb8974dd4
--- /dev/null
+++ b/src/nvim/xdiff/xhistogram.c
@@ -0,0 +1,386 @@
+/*
+ * Copyright (C) 2010, Google Inc.
+ * and other copyright owners as documented in JGit's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ * names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "xinclude.h"
+#include "xtypes.h"
+#include "xdiff.h"
+
+#define MAX_PTR INT_MAX
+#define MAX_CNT INT_MAX
+
+#define LINE_END(n) (line##n + count##n - 1)
+#define LINE_END_PTR(n) (*line##n + *count##n - 1)
+
+struct histindex {
+ struct record {
+ unsigned int ptr, cnt;
+ struct record *next;
+ } **records, /* an occurrence */
+ **line_map; /* map of line to record chain */
+ chastore_t rcha;
+ unsigned int *next_ptrs;
+ unsigned int table_bits,
+ records_size,
+ line_map_size;
+
+ unsigned int max_chain_length,
+ key_shift,
+ ptr_shift;
+
+ unsigned int cnt,
+ has_common;
+
+ xdfenv_t *env;
+ xpparam_t const *xpp;
+};
+
+struct region {
+ unsigned int begin1, end1;
+ unsigned int begin2, end2;
+};
+
+#define LINE_MAP(i, a) (i->line_map[(a) - i->ptr_shift])
+
+#define NEXT_PTR(index, ptr) \
+ (index->next_ptrs[(ptr) - index->ptr_shift])
+
+#define CNT(index, ptr) \
+ ((LINE_MAP(index, ptr))->cnt)
+
+#define REC(env, s, l) \
+ (env->xdf##s.recs[l - 1])
+
+static int cmp_recs(xpparam_t const *xpp,
+ xrecord_t *r1, xrecord_t *r2)
+{
+ return r1->ha == r2->ha &&
+ xdl_recmatch(r1->ptr, r1->size, r2->ptr, r2->size,
+ xpp->flags);
+}
+
+#define CMP_ENV(xpp, env, s1, l1, s2, l2) \
+ (cmp_recs(xpp, REC(env, s1, l1), REC(env, s2, l2)))
+
+#define CMP(i, s1, l1, s2, l2) \
+ (cmp_recs(i->xpp, REC(i->env, s1, l1), REC(i->env, s2, l2)))
+
+#define TABLE_HASH(index, side, line) \
+ XDL_HASHLONG((REC(index->env, side, line))->ha, index->table_bits)
+
+static int scanA(struct histindex *index, int line1, int count1)
+{
+ int ptr, tbl_idx;
+ unsigned int chain_len;
+ struct record **rec_chain, *rec;
+
+ for (ptr = LINE_END(1); line1 <= ptr; ptr--) {
+ tbl_idx = TABLE_HASH(index, 1, ptr);
+ rec_chain = index->records + tbl_idx;
+ rec = *rec_chain;
+
+ chain_len = 0;
+ while (rec) {
+ if (CMP(index, 1, rec->ptr, 1, ptr)) {
+ /*
+ * ptr is identical to another element. Insert
+ * it onto the front of the existing element
+ * chain.
+ */
+ NEXT_PTR(index, ptr) = rec->ptr;
+ rec->ptr = ptr;
+ /* cap rec->cnt at MAX_CNT */
+ rec->cnt = XDL_MIN(MAX_CNT, rec->cnt + 1);
+ LINE_MAP(index, ptr) = rec;
+ goto continue_scan;
+ }
+
+ rec = rec->next;
+ chain_len++;
+ }
+
+ if (chain_len == index->max_chain_length)
+ return -1;
+
+ /*
+ * This is the first time we have ever seen this particular
+ * element in the sequence. Construct a new chain for it.
+ */
+ if (!(rec = xdl_cha_alloc(&index->rcha)))
+ return -1;
+ rec->ptr = ptr;
+ rec->cnt = 1;
+ rec->next = *rec_chain;
+ *rec_chain = rec;
+ LINE_MAP(index, ptr) = rec;
+
+continue_scan:
+ ; /* no op */
+ }
+
+ return 0;
+}
+
+static int try_lcs(struct histindex *index, struct region *lcs, int b_ptr,
+ int line1, int count1, int line2, int count2)
+{
+ unsigned int b_next = b_ptr + 1;
+ struct record *rec = index->records[TABLE_HASH(index, 2, b_ptr)];
+ unsigned int as, ae, bs, be, np, rc;
+ int should_break;
+
+ for (; rec; rec = rec->next) {
+ if (rec->cnt > index->cnt) {
+ if (!index->has_common)
+ index->has_common = CMP(index, 1, rec->ptr, 2, b_ptr);
+ continue;
+ }
+
+ as = rec->ptr;
+ if (!CMP(index, 1, as, 2, b_ptr))
+ continue;
+
+ index->has_common = 1;
+ for (;;) {
+ should_break = 0;
+ np = NEXT_PTR(index, as);
+ bs = b_ptr;
+ ae = as;
+ be = bs;
+ rc = rec->cnt;
+
+ while (line1 < (int)as && line2 < (int)bs
+ && CMP(index, 1, as - 1, 2, bs - 1)) {
+ as--;
+ bs--;
+ if (1 < rc)
+ rc = XDL_MIN(rc, CNT(index, as));
+ }
+ while ((int)ae < LINE_END(1) && (int)be < LINE_END(2)
+ && CMP(index, 1, ae + 1, 2, be + 1)) {
+ ae++;
+ be++;
+ if (1 < rc)
+ rc = XDL_MIN(rc, CNT(index, ae));
+ }
+
+ if (b_next <= be)
+ b_next = be + 1;
+ if (lcs->end1 - lcs->begin1 < ae - as || rc < index->cnt) {
+ lcs->begin1 = as;
+ lcs->begin2 = bs;
+ lcs->end1 = ae;
+ lcs->end2 = be;
+ index->cnt = rc;
+ }
+
+ if (np == 0)
+ break;
+
+ while (np <= ae) {
+ np = NEXT_PTR(index, np);
+ if (np == 0) {
+ should_break = 1;
+ break;
+ }
+ }
+
+ if (should_break)
+ break;
+
+ as = np;
+ }
+ }
+ return b_next;
+}
+
+static int fall_back_to_classic_diff(xpparam_t const *xpp, xdfenv_t *env,
+ int line1, int count1, int line2, int count2)
+{
+ xpparam_t xpparam;
+ xpparam.flags = xpp->flags & ~XDF_DIFF_ALGORITHM_MASK;
+
+ return xdl_fall_back_diff(env, &xpparam,
+ line1, count1, line2, count2);
+}
+
+static inline void free_index(struct histindex *index)
+{
+ xdl_free(index->records);
+ xdl_free(index->line_map);
+ xdl_free(index->next_ptrs);
+ xdl_cha_free(&index->rcha);
+}
+
+static int find_lcs(xpparam_t const *xpp, xdfenv_t *env,
+ struct region *lcs,
+ int line1, int count1, int line2, int count2)
+{
+ int b_ptr;
+ int sz, ret = -1;
+ struct histindex index;
+
+ memset(&index, 0, sizeof(index));
+
+ index.env = env;
+ index.xpp = xpp;
+
+ index.records = NULL;
+ index.line_map = NULL;
+ /* in case of early xdl_cha_free() */
+ index.rcha.head = NULL;
+
+ index.table_bits = xdl_hashbits(count1);
+ sz = index.records_size = 1 << index.table_bits;
+ sz *= sizeof(struct record *);
+ if (!(index.records = (struct record **) xdl_malloc(sz)))
+ goto cleanup;
+ memset(index.records, 0, sz);
+
+ sz = index.line_map_size = count1;
+ sz *= sizeof(struct record *);
+ if (!(index.line_map = (struct record **) xdl_malloc(sz)))
+ goto cleanup;
+ memset(index.line_map, 0, sz);
+
+ sz = index.line_map_size;
+ sz *= sizeof(unsigned int);
+ if (!(index.next_ptrs = (unsigned int *) xdl_malloc(sz)))
+ goto cleanup;
+ memset(index.next_ptrs, 0, sz);
+
+ /* lines / 4 + 1 comes from xprepare.c:xdl_prepare_ctx() */
+ if (xdl_cha_init(&index.rcha, sizeof(struct record), count1 / 4 + 1) < 0)
+ goto cleanup;
+
+ index.ptr_shift = line1;
+ index.max_chain_length = 64;
+
+ if (scanA(&index, line1, count1))
+ goto cleanup;
+
+ index.cnt = index.max_chain_length + 1;
+
+ for (b_ptr = line2; b_ptr <= LINE_END(2); )
+ b_ptr = try_lcs(&index, lcs, b_ptr, line1, count1, line2, count2);
+
+ if (index.has_common && index.max_chain_length < index.cnt)
+ ret = 1;
+ else
+ ret = 0;
+
+cleanup:
+ free_index(&index);
+ return ret;
+}
+
+static int histogram_diff(xpparam_t const *xpp, xdfenv_t *env,
+ int line1, int count1, int line2, int count2)
+{
+ struct region lcs;
+ int lcs_found;
+ int result;
+redo:
+ result = -1;
+
+ if (count1 <= 0 && count2 <= 0)
+ return 0;
+
+ if (LINE_END(1) >= MAX_PTR)
+ return -1;
+
+ if (!count1) {
+ while(count2--)
+ env->xdf2.rchg[line2++ - 1] = 1;
+ return 0;
+ } else if (!count2) {
+ while(count1--)
+ env->xdf1.rchg[line1++ - 1] = 1;
+ return 0;
+ }
+
+ memset(&lcs, 0, sizeof(lcs));
+ lcs_found = find_lcs(xpp, env, &lcs, line1, count1, line2, count2);
+ if (lcs_found < 0)
+ goto out;
+ else if (lcs_found)
+ result = fall_back_to_classic_diff(xpp, env, line1, count1, line2, count2);
+ else {
+ if (lcs.begin1 == 0 && lcs.begin2 == 0) {
+ while (count1--)
+ env->xdf1.rchg[line1++ - 1] = 1;
+ while (count2--)
+ env->xdf2.rchg[line2++ - 1] = 1;
+ result = 0;
+ } else {
+ result = histogram_diff(xpp, env,
+ line1, lcs.begin1 - line1,
+ line2, lcs.begin2 - line2);
+ if (result)
+ goto out;
+ /*
+ * result = histogram_diff(xpp, env,
+ * lcs.end1 + 1, LINE_END(1) - lcs.end1,
+ * lcs.end2 + 1, LINE_END(2) - lcs.end2);
+ * but let's optimize tail recursion ourself:
+ */
+ count1 = LINE_END(1) - lcs.end1;
+ line1 = lcs.end1 + 1;
+ count2 = LINE_END(2) - lcs.end2;
+ line2 = lcs.end2 + 1;
+ goto redo;
+ }
+ }
+out:
+ return result;
+}
+
+int xdl_do_histogram_diff(mmfile_t *file1, mmfile_t *file2,
+ xpparam_t const *xpp, xdfenv_t *env)
+{
+ if (xdl_prepare_env(file1, file2, xpp, env) < 0)
+ return -1;
+
+ return histogram_diff(xpp, env,
+ env->xdf1.dstart + 1, env->xdf1.dend - env->xdf1.dstart + 1,
+ env->xdf2.dstart + 1, env->xdf2.dend - env->xdf2.dstart + 1);
+}
diff --git a/src/nvim/xdiff/xinclude.h b/src/nvim/xdiff/xinclude.h
new file mode 100644
index 0000000000..46b8608314
--- /dev/null
+++ b/src/nvim/xdiff/xinclude.h
@@ -0,0 +1,61 @@
+/*
+ * LibXDiff by Davide Libenzi ( File Differential Library )
+ * Copyright (C) 2003 Davide Libenzi
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Davide Libenzi <davidel@xmailserver.org>
+ *
+ */
+
+/* defines HAVE_ATTRIBUTE_UNUSED */
+#ifdef HAVE_CONFIG_H
+# include "../auto/config.h"
+#endif
+
+/* Mark unused function arguments with UNUSED, so that gcc -Wunused-parameter
+ * can be used to check for mistakes. */
+#ifdef HAVE_ATTRIBUTE_UNUSED
+# define UNUSED __attribute__((unused))
+#else
+# define UNUSED
+#endif
+
+#if defined(_MSC_VER)
+# define inline __inline
+#endif
+
+#if !defined(XINCLUDE_H)
+#define XINCLUDE_H
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#if !defined(_WIN32)
+#include <unistd.h>
+#endif
+#include <string.h>
+#include <limits.h>
+
+#include "xmacros.h"
+#include "xdiff.h"
+#include "xtypes.h"
+#include "xutils.h"
+#include "xprepare.h"
+#include "xdiffi.h"
+#include "xemit.h"
+
+
+#endif /* #if !defined(XINCLUDE_H) */
diff --git a/src/nvim/xdiff/xmacros.h b/src/nvim/xdiff/xmacros.h
new file mode 100644
index 0000000000..2809a28ca9
--- /dev/null
+++ b/src/nvim/xdiff/xmacros.h
@@ -0,0 +1,54 @@
+/*
+ * LibXDiff by Davide Libenzi ( File Differential Library )
+ * Copyright (C) 2003 Davide Libenzi
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Davide Libenzi <davidel@xmailserver.org>
+ *
+ */
+
+#if !defined(XMACROS_H)
+#define XMACROS_H
+
+
+
+
+#define XDL_MIN(a, b) ((a) < (b) ? (a): (b))
+#define XDL_MAX(a, b) ((a) > (b) ? (a): (b))
+#define XDL_ABS(v) ((v) >= 0 ? (v): -(v))
+#define XDL_ISDIGIT(c) ((c) >= '0' && (c) <= '9')
+#define XDL_ISSPACE(c) (isspace((unsigned char)(c)))
+#define XDL_ADDBITS(v,b) ((v) + ((v) >> (b)))
+#define XDL_MASKBITS(b) ((1UL << (b)) - 1)
+#define XDL_HASHLONG(v,b) (XDL_ADDBITS((unsigned long)(v), b) & XDL_MASKBITS(b))
+#define XDL_PTRFREE(p) do { if (p) { xdl_free(p); (p) = NULL; } } while (0)
+#define XDL_LE32_PUT(p, v) \
+do { \
+ unsigned char *__p = (unsigned char *) (p); \
+ *__p++ = (unsigned char) (v); \
+ *__p++ = (unsigned char) ((v) >> 8); \
+ *__p++ = (unsigned char) ((v) >> 16); \
+ *__p = (unsigned char) ((v) >> 24); \
+} while (0)
+#define XDL_LE32_GET(p, v) \
+do { \
+ unsigned char const *__p = (unsigned char const *) (p); \
+ (v) = (unsigned long) __p[0] | ((unsigned long) __p[1]) << 8 | \
+ ((unsigned long) __p[2]) << 16 | ((unsigned long) __p[3]) << 24; \
+} while (0)
+
+
+#endif /* #if !defined(XMACROS_H) */
diff --git a/src/nvim/xdiff/xpatience.c b/src/nvim/xdiff/xpatience.c
new file mode 100644
index 0000000000..2c65aac386
--- /dev/null
+++ b/src/nvim/xdiff/xpatience.c
@@ -0,0 +1,393 @@
+/*
+ * LibXDiff by Davide Libenzi ( File Differential Library )
+ * Copyright (C) 2003-2016 Davide Libenzi, Johannes E. Schindelin
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Davide Libenzi <davidel@xmailserver.org>
+ *
+ */
+#include "xinclude.h"
+#include "xtypes.h"
+#include "xdiff.h"
+
+/*
+ * The basic idea of patience diff is to find lines that are unique in
+ * both files. These are intuitively the ones that we want to see as
+ * common lines.
+ *
+ * The maximal ordered sequence of such line pairs (where ordered means
+ * that the order in the sequence agrees with the order of the lines in
+ * both files) naturally defines an initial set of common lines.
+ *
+ * Now, the algorithm tries to extend the set of common lines by growing
+ * the line ranges where the files have identical lines.
+ *
+ * Between those common lines, the patience diff algorithm is applied
+ * recursively, until no unique line pairs can be found; these line ranges
+ * are handled by the well-known Myers algorithm.
+ */
+
+#define NON_UNIQUE ULONG_MAX
+
+/*
+ * This is a hash mapping from line hash to line numbers in the first and
+ * second file.
+ */
+struct hashmap {
+ int nr, alloc;
+ struct entry {
+ unsigned long hash;
+ /*
+ * 0 = unused entry, 1 = first line, 2 = second, etc.
+ * line2 is NON_UNIQUE if the line is not unique
+ * in either the first or the second file.
+ */
+ unsigned long line1, line2;
+ /*
+ * "next" & "previous" are used for the longest common
+ * sequence;
+ * initially, "next" reflects only the order in file1.
+ */
+ struct entry *next, *previous;
+
+ /*
+ * If 1, this entry can serve as an anchor. See
+ * Documentation/diff-options.txt for more information.
+ */
+ unsigned anchor : 1;
+ } *entries, *first, *last;
+ /* were common records found? */
+ unsigned long has_matches;
+ mmfile_t *file1, *file2;
+ xdfenv_t *env;
+ xpparam_t const *xpp;
+};
+
+static int is_anchor(xpparam_t const *xpp, const char *line)
+{
+ size_t i;
+ for (i = 0; i < xpp->anchors_nr; i++) {
+ if (!strncmp(line, xpp->anchors[i], strlen(xpp->anchors[i])))
+ return 1;
+ }
+ return 0;
+}
+
+/* The argument "pass" is 1 for the first file, 2 for the second. */
+static void insert_record(xpparam_t const *xpp, int line, struct hashmap *map,
+ int pass)
+{
+ xrecord_t **records = pass == 1 ?
+ map->env->xdf1.recs : map->env->xdf2.recs;
+ xrecord_t *record = records[line - 1], *other;
+ /*
+ * After xdl_prepare_env() (or more precisely, due to
+ * xdl_classify_record()), the "ha" member of the records (AKA lines)
+ * is _not_ the hash anymore, but a linearized version of it. In
+ * other words, the "ha" member is guaranteed to start with 0 and
+ * the second record's ha can only be 0 or 1, etc.
+ *
+ * So we multiply ha by 2 in the hope that the hashing was
+ * "unique enough".
+ */
+ int index = (int)((record->ha << 1) % map->alloc);
+
+ while (map->entries[index].line1) {
+ other = map->env->xdf1.recs[map->entries[index].line1 - 1];
+ if (map->entries[index].hash != record->ha ||
+ !xdl_recmatch(record->ptr, record->size,
+ other->ptr, other->size,
+ map->xpp->flags)) {
+ if (++index >= map->alloc)
+ index = 0;
+ continue;
+ }
+ if (pass == 2)
+ map->has_matches = 1;
+ if (pass == 1 || map->entries[index].line2)
+ map->entries[index].line2 = NON_UNIQUE;
+ else
+ map->entries[index].line2 = line;
+ return;
+ }
+ if (pass == 2)
+ return;
+ map->entries[index].line1 = line;
+ map->entries[index].hash = record->ha;
+ map->entries[index].anchor = is_anchor(xpp, map->env->xdf1.recs[line - 1]->ptr);
+ if (!map->first)
+ map->first = map->entries + index;
+ if (map->last) {
+ map->last->next = map->entries + index;
+ map->entries[index].previous = map->last;
+ }
+ map->last = map->entries + index;
+ map->nr++;
+}
+
+/*
+ * This function has to be called for each recursion into the inter-hunk
+ * parts, as previously non-unique lines can become unique when being
+ * restricted to a smaller part of the files.
+ *
+ * It is assumed that env has been prepared using xdl_prepare().
+ */
+static int fill_hashmap(mmfile_t *file1, mmfile_t *file2,
+ xpparam_t const *xpp, xdfenv_t *env,
+ struct hashmap *result,
+ int line1, int count1, int line2, int count2)
+{
+ result->file1 = file1;
+ result->file2 = file2;
+ result->xpp = xpp;
+ result->env = env;
+
+ /* We know exactly how large we want the hash map */
+ result->alloc = count1 * 2;
+ result->entries = (struct entry *)
+ xdl_malloc(result->alloc * sizeof(struct entry));
+ if (!result->entries)
+ return -1;
+ memset(result->entries, 0, result->alloc * sizeof(struct entry));
+
+ /* First, fill with entries from the first file */
+ while (count1--)
+ insert_record(xpp, line1++, result, 1);
+
+ /* Then search for matches in the second file */
+ while (count2--)
+ insert_record(xpp, line2++, result, 2);
+
+ return 0;
+}
+
+/*
+ * Find the longest sequence with a smaller last element (meaning a smaller
+ * line2, as we construct the sequence with entries ordered by line1).
+ */
+static int binary_search(struct entry **sequence, int longest,
+ struct entry *entry)
+{
+ int left = -1, right = longest;
+
+ while (left + 1 < right) {
+ int middle = left + (right - left) / 2;
+ /* by construction, no two entries can be equal */
+ if (sequence[middle]->line2 > entry->line2)
+ right = middle;
+ else
+ left = middle;
+ }
+ /* return the index in "sequence", _not_ the sequence length */
+ return left;
+}
+
+/*
+ * The idea is to start with the list of common unique lines sorted by
+ * the order in file1. For each of these pairs, the longest (partial)
+ * sequence whose last element's line2 is smaller is determined.
+ *
+ * For efficiency, the sequences are kept in a list containing exactly one
+ * item per sequence length: the sequence with the smallest last
+ * element (in terms of line2).
+ */
+static struct entry *find_longest_common_sequence(struct hashmap *map)
+{
+ struct entry **sequence = (struct entry **)xdl_malloc(map->nr * sizeof(struct entry *));
+ int longest = 0, i;
+ struct entry *entry;
+ /*
+ * If not -1, this entry in sequence must never be overridden.
+ * Therefore, overriding entries before this has no effect, so
+ * do not do that either.
+ */
+ int anchor_i = -1;
+
+ /* Added to silence Coverity. */
+ if (sequence == NULL)
+ return map->first;
+
+ for (entry = map->first; entry; entry = entry->next) {
+ if (!entry->line2 || entry->line2 == NON_UNIQUE)
+ continue;
+ i = binary_search(sequence, longest, entry);
+ entry->previous = i < 0 ? NULL : sequence[i];
+ ++i;
+ if (i <= anchor_i)
+ continue;
+ sequence[i] = entry;
+ if (entry->anchor) {
+ anchor_i = i;
+ longest = anchor_i + 1;
+ } else if (i == longest) {
+ longest++;
+ }
+ }
+
+ /* No common unique lines were found */
+ if (!longest) {
+ xdl_free(sequence);
+ return NULL;
+ }
+
+ /* Iterate starting at the last element, adjusting the "next" members */
+ entry = sequence[longest - 1];
+ entry->next = NULL;
+ while (entry->previous) {
+ entry->previous->next = entry;
+ entry = entry->previous;
+ }
+ xdl_free(sequence);
+ return entry;
+}
+
+static int match(struct hashmap *map, int line1, int line2)
+{
+ xrecord_t *record1 = map->env->xdf1.recs[line1 - 1];
+ xrecord_t *record2 = map->env->xdf2.recs[line2 - 1];
+ return xdl_recmatch(record1->ptr, record1->size,
+ record2->ptr, record2->size, map->xpp->flags);
+}
+
+static int patience_diff(mmfile_t *file1, mmfile_t *file2,
+ xpparam_t const *xpp, xdfenv_t *env,
+ int line1, int count1, int line2, int count2);
+
+static int walk_common_sequence(struct hashmap *map, struct entry *first,
+ int line1, int count1, int line2, int count2)
+{
+ int end1 = line1 + count1, end2 = line2 + count2;
+ int next1, next2;
+
+ for (;;) {
+ /* Try to grow the line ranges of common lines */
+ if (first) {
+ next1 = first->line1;
+ next2 = first->line2;
+ while (next1 > line1 && next2 > line2 &&
+ match(map, next1 - 1, next2 - 1)) {
+ next1--;
+ next2--;
+ }
+ } else {
+ next1 = end1;
+ next2 = end2;
+ }
+ while (line1 < next1 && line2 < next2 &&
+ match(map, line1, line2)) {
+ line1++;
+ line2++;
+ }
+
+ /* Recurse */
+ if (next1 > line1 || next2 > line2) {
+ struct hashmap submap;
+
+ memset(&submap, 0, sizeof(submap));
+ if (patience_diff(map->file1, map->file2,
+ map->xpp, map->env,
+ line1, next1 - line1,
+ line2, next2 - line2))
+ return -1;
+ }
+
+ if (!first)
+ return 0;
+
+ while (first->next &&
+ first->next->line1 == first->line1 + 1 &&
+ first->next->line2 == first->line2 + 1)
+ first = first->next;
+
+ line1 = first->line1 + 1;
+ line2 = first->line2 + 1;
+
+ first = first->next;
+ }
+}
+
+static int fall_back_to_classic_diff(struct hashmap *map,
+ int line1, int count1, int line2, int count2)
+{
+ xpparam_t xpp;
+ xpp.flags = map->xpp->flags & ~XDF_DIFF_ALGORITHM_MASK;
+
+ return xdl_fall_back_diff(map->env, &xpp,
+ line1, count1, line2, count2);
+}
+
+/*
+ * Recursively find the longest common sequence of unique lines,
+ * and if none was found, ask xdl_do_diff() to do the job.
+ *
+ * This function assumes that env was prepared with xdl_prepare_env().
+ */
+static int patience_diff(mmfile_t *file1, mmfile_t *file2,
+ xpparam_t const *xpp, xdfenv_t *env,
+ int line1, int count1, int line2, int count2)
+{
+ struct hashmap map;
+ struct entry *first;
+ int result = 0;
+
+ /* trivial case: one side is empty */
+ if (!count1) {
+ while(count2--)
+ env->xdf2.rchg[line2++ - 1] = 1;
+ return 0;
+ } else if (!count2) {
+ while(count1--)
+ env->xdf1.rchg[line1++ - 1] = 1;
+ return 0;
+ }
+
+ memset(&map, 0, sizeof(map));
+ if (fill_hashmap(file1, file2, xpp, env, &map,
+ line1, count1, line2, count2))
+ return -1;
+
+ /* are there any matching lines at all? */
+ if (!map.has_matches) {
+ while(count1--)
+ env->xdf1.rchg[line1++ - 1] = 1;
+ while(count2--)
+ env->xdf2.rchg[line2++ - 1] = 1;
+ xdl_free(map.entries);
+ return 0;
+ }
+
+ first = find_longest_common_sequence(&map);
+ if (first)
+ result = walk_common_sequence(&map, first,
+ line1, count1, line2, count2);
+ else
+ result = fall_back_to_classic_diff(&map,
+ line1, count1, line2, count2);
+
+ xdl_free(map.entries);
+ return result;
+}
+
+int xdl_do_patience_diff(mmfile_t *file1, mmfile_t *file2,
+ xpparam_t const *xpp, xdfenv_t *env)
+{
+ if (xdl_prepare_env(file1, file2, xpp, env) < 0)
+ return -1;
+
+ /* environment is cleaned up in xdl_diff() */
+ return patience_diff(file1, file2, xpp, env,
+ 1, env->xdf1.nrec, 1, env->xdf2.nrec);
+}
diff --git a/src/nvim/xdiff/xprepare.c b/src/nvim/xdiff/xprepare.c
new file mode 100644
index 0000000000..abeb8fb84e
--- /dev/null
+++ b/src/nvim/xdiff/xprepare.c
@@ -0,0 +1,483 @@
+/*
+ * LibXDiff by Davide Libenzi ( File Differential Library )
+ * Copyright (C) 2003 Davide Libenzi
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Davide Libenzi <davidel@xmailserver.org>
+ *
+ */
+
+#include "xinclude.h"
+
+
+#define XDL_KPDIS_RUN 4
+#define XDL_MAX_EQLIMIT 1024
+#define XDL_SIMSCAN_WINDOW 100
+#define XDL_GUESS_NLINES1 256
+#define XDL_GUESS_NLINES2 20
+
+
+typedef struct s_xdlclass {
+ struct s_xdlclass *next;
+ unsigned long ha;
+ char const *line;
+ long size;
+ long idx;
+ long len1, len2;
+} xdlclass_t;
+
+typedef struct s_xdlclassifier {
+ unsigned int hbits;
+ long hsize;
+ xdlclass_t **rchash;
+ chastore_t ncha;
+ xdlclass_t **rcrecs;
+ long alloc;
+ long count;
+ long flags;
+} xdlclassifier_t;
+
+
+
+
+static int xdl_init_classifier(xdlclassifier_t *cf, long size, long flags);
+static void xdl_free_classifier(xdlclassifier_t *cf);
+static int xdl_classify_record(unsigned int pass, xdlclassifier_t *cf, xrecord_t **rhash,
+ unsigned int hbits, xrecord_t *rec);
+static int xdl_prepare_ctx(unsigned int pass, mmfile_t *mf, long narec, xpparam_t const *xpp,
+ xdlclassifier_t *cf, xdfile_t *xdf);
+static void xdl_free_ctx(xdfile_t *xdf);
+static int xdl_clean_mmatch(char const *dis, long i, long s, long e);
+static int xdl_cleanup_records(xdlclassifier_t *cf, xdfile_t *xdf1, xdfile_t *xdf2);
+static int xdl_trim_ends(xdfile_t *xdf1, xdfile_t *xdf2);
+static int xdl_optimize_ctxs(xdlclassifier_t *cf, xdfile_t *xdf1, xdfile_t *xdf2);
+
+
+
+
+static int xdl_init_classifier(xdlclassifier_t *cf, long size, long flags) {
+ cf->flags = flags;
+
+ cf->hbits = xdl_hashbits((unsigned int) size);
+ cf->hsize = 1 << cf->hbits;
+
+ if (xdl_cha_init(&cf->ncha, sizeof(xdlclass_t), size / 4 + 1) < 0) {
+
+ return -1;
+ }
+ if (!(cf->rchash = (xdlclass_t **) xdl_malloc(cf->hsize * sizeof(xdlclass_t *)))) {
+
+ xdl_cha_free(&cf->ncha);
+ return -1;
+ }
+ memset(cf->rchash, 0, cf->hsize * sizeof(xdlclass_t *));
+
+ cf->alloc = size;
+ if (!(cf->rcrecs = (xdlclass_t **) xdl_malloc(cf->alloc * sizeof(xdlclass_t *)))) {
+
+ xdl_free(cf->rchash);
+ xdl_cha_free(&cf->ncha);
+ return -1;
+ }
+
+ cf->count = 0;
+
+ return 0;
+}
+
+
+static void xdl_free_classifier(xdlclassifier_t *cf) {
+
+ xdl_free(cf->rcrecs);
+ xdl_free(cf->rchash);
+ xdl_cha_free(&cf->ncha);
+}
+
+
+static int xdl_classify_record(unsigned int pass, xdlclassifier_t *cf, xrecord_t **rhash,
+ unsigned int hbits, xrecord_t *rec) {
+ long hi;
+ char const *line;
+ xdlclass_t *rcrec;
+ xdlclass_t **rcrecs;
+
+ line = rec->ptr;
+ hi = (long) XDL_HASHLONG(rec->ha, cf->hbits);
+ for (rcrec = cf->rchash[hi]; rcrec; rcrec = rcrec->next)
+ if (rcrec->ha == rec->ha &&
+ xdl_recmatch(rcrec->line, rcrec->size,
+ rec->ptr, rec->size, cf->flags))
+ break;
+
+ if (!rcrec) {
+ if (!(rcrec = xdl_cha_alloc(&cf->ncha))) {
+
+ return -1;
+ }
+ rcrec->idx = cf->count++;
+ if (cf->count > cf->alloc) {
+ cf->alloc *= 2;
+ if (!(rcrecs = (xdlclass_t **) xdl_realloc(cf->rcrecs, cf->alloc * sizeof(xdlclass_t *)))) {
+
+ return -1;
+ }
+ cf->rcrecs = rcrecs;
+ }
+ cf->rcrecs[rcrec->idx] = rcrec;
+ rcrec->line = line;
+ rcrec->size = rec->size;
+ rcrec->ha = rec->ha;
+ rcrec->len1 = rcrec->len2 = 0;
+ rcrec->next = cf->rchash[hi];
+ cf->rchash[hi] = rcrec;
+ }
+
+ (pass == 1) ? rcrec->len1++ : rcrec->len2++;
+
+ rec->ha = (unsigned long) rcrec->idx;
+
+ hi = (long) XDL_HASHLONG(rec->ha, hbits);
+ rec->next = rhash[hi];
+ rhash[hi] = rec;
+
+ return 0;
+}
+
+
+static int xdl_prepare_ctx(unsigned int pass, mmfile_t *mf, long narec, xpparam_t const *xpp,
+ xdlclassifier_t *cf, xdfile_t *xdf) {
+ unsigned int hbits;
+ long nrec, hsize, bsize;
+ unsigned long hav;
+ char const *blk, *cur, *top, *prev;
+ xrecord_t *crec;
+ xrecord_t **recs, **rrecs;
+ xrecord_t **rhash;
+ unsigned long *ha;
+ char *rchg;
+ long *rindex;
+
+ ha = NULL;
+ rindex = NULL;
+ rchg = NULL;
+ rhash = NULL;
+ recs = NULL;
+
+ if (xdl_cha_init(&xdf->rcha, sizeof(xrecord_t), narec / 4 + 1) < 0)
+ goto abort;
+ if (!(recs = (xrecord_t **) xdl_malloc(narec * sizeof(xrecord_t *))))
+ goto abort;
+
+ if (XDF_DIFF_ALG(xpp->flags) == XDF_HISTOGRAM_DIFF)
+ hbits = hsize = 0;
+ else {
+ hbits = xdl_hashbits((unsigned int) narec);
+ hsize = 1 << hbits;
+ if (!(rhash = (xrecord_t **) xdl_malloc(hsize * sizeof(xrecord_t *))))
+ goto abort;
+ memset(rhash, 0, hsize * sizeof(xrecord_t *));
+ }
+
+ nrec = 0;
+ if ((cur = blk = xdl_mmfile_first(mf, &bsize)) != NULL) {
+ for (top = blk + bsize; cur < top; ) {
+ prev = cur;
+ hav = xdl_hash_record(&cur, top, xpp->flags);
+ if (nrec >= narec) {
+ narec *= 2;
+ if (!(rrecs = (xrecord_t **) xdl_realloc(recs, narec * sizeof(xrecord_t *))))
+ goto abort;
+ recs = rrecs;
+ }
+ if (!(crec = xdl_cha_alloc(&xdf->rcha)))
+ goto abort;
+ crec->ptr = prev;
+ crec->size = (long) (cur - prev);
+ crec->ha = hav;
+ recs[nrec++] = crec;
+
+ if ((XDF_DIFF_ALG(xpp->flags) != XDF_HISTOGRAM_DIFF) &&
+ xdl_classify_record(pass, cf, rhash, hbits, crec) < 0)
+ goto abort;
+ }
+ }
+
+ if (!(rchg = (char *) xdl_malloc((nrec + 2) * sizeof(char))))
+ goto abort;
+ memset(rchg, 0, (nrec + 2) * sizeof(char));
+
+ if (!(rindex = (long *) xdl_malloc((nrec + 1) * sizeof(long))))
+ goto abort;
+ if (!(ha = (unsigned long *) xdl_malloc((nrec + 1) * sizeof(unsigned long))))
+ goto abort;
+
+ xdf->nrec = nrec;
+ xdf->recs = recs;
+ xdf->hbits = hbits;
+ xdf->rhash = rhash;
+ xdf->rchg = rchg + 1;
+ xdf->rindex = rindex;
+ xdf->nreff = 0;
+ xdf->ha = ha;
+ xdf->dstart = 0;
+ xdf->dend = nrec - 1;
+
+ return 0;
+
+abort:
+ xdl_free(ha);
+ xdl_free(rindex);
+ xdl_free(rchg);
+ xdl_free(rhash);
+ xdl_free(recs);
+ xdl_cha_free(&xdf->rcha);
+ return -1;
+}
+
+
+static void xdl_free_ctx(xdfile_t *xdf) {
+
+ xdl_free(xdf->rhash);
+ xdl_free(xdf->rindex);
+ xdl_free(xdf->rchg - 1);
+ xdl_free(xdf->ha);
+ xdl_free(xdf->recs);
+ xdl_cha_free(&xdf->rcha);
+}
+
+
+int xdl_prepare_env(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
+ xdfenv_t *xe) {
+ long enl1, enl2, sample;
+ xdlclassifier_t cf;
+
+ memset(&cf, 0, sizeof(cf));
+
+ /*
+ * For histogram diff, we can afford a smaller sample size and
+ * thus a poorer estimate of the number of lines, as the hash
+ * table (rhash) won't be filled up/grown. The number of lines
+ * (nrecs) will be updated correctly anyway by
+ * xdl_prepare_ctx().
+ */
+ sample = (XDF_DIFF_ALG(xpp->flags) == XDF_HISTOGRAM_DIFF
+ ? XDL_GUESS_NLINES2 : XDL_GUESS_NLINES1);
+
+ enl1 = xdl_guess_lines(mf1, sample) + 1;
+ enl2 = xdl_guess_lines(mf2, sample) + 1;
+
+ if (XDF_DIFF_ALG(xpp->flags) != XDF_HISTOGRAM_DIFF &&
+ xdl_init_classifier(&cf, enl1 + enl2 + 1, xpp->flags) < 0)
+ return -1;
+
+ if (xdl_prepare_ctx(1, mf1, enl1, xpp, &cf, &xe->xdf1) < 0) {
+
+ xdl_free_classifier(&cf);
+ return -1;
+ }
+ if (xdl_prepare_ctx(2, mf2, enl2, xpp, &cf, &xe->xdf2) < 0) {
+
+ xdl_free_ctx(&xe->xdf1);
+ xdl_free_classifier(&cf);
+ return -1;
+ }
+
+ if ((XDF_DIFF_ALG(xpp->flags) != XDF_PATIENCE_DIFF) &&
+ (XDF_DIFF_ALG(xpp->flags) != XDF_HISTOGRAM_DIFF) &&
+ xdl_optimize_ctxs(&cf, &xe->xdf1, &xe->xdf2) < 0) {
+
+ xdl_free_ctx(&xe->xdf2);
+ xdl_free_ctx(&xe->xdf1);
+ xdl_free_classifier(&cf);
+ return -1;
+ }
+
+ if (XDF_DIFF_ALG(xpp->flags) != XDF_HISTOGRAM_DIFF)
+ xdl_free_classifier(&cf);
+
+ return 0;
+}
+
+
+void xdl_free_env(xdfenv_t *xe) {
+
+ xdl_free_ctx(&xe->xdf2);
+ xdl_free_ctx(&xe->xdf1);
+}
+
+
+static int xdl_clean_mmatch(char const *dis, long i, long s, long e) {
+ long r, rdis0, rpdis0, rdis1, rpdis1;
+
+ /*
+ * Limits the window the is examined during the similar-lines
+ * scan. The loops below stops when dis[i - r] == 1 (line that
+ * has no match), but there are corner cases where the loop
+ * proceed all the way to the extremities by causing huge
+ * performance penalties in case of big files.
+ */
+ if (i - s > XDL_SIMSCAN_WINDOW)
+ s = i - XDL_SIMSCAN_WINDOW;
+ if (e - i > XDL_SIMSCAN_WINDOW)
+ e = i + XDL_SIMSCAN_WINDOW;
+
+ /*
+ * Scans the lines before 'i' to find a run of lines that either
+ * have no match (dis[j] == 0) or have multiple matches (dis[j] > 1).
+ * Note that we always call this function with dis[i] > 1, so the
+ * current line (i) is already a multimatch line.
+ */
+ for (r = 1, rdis0 = 0, rpdis0 = 1; (i - r) >= s; r++) {
+ if (!dis[i - r])
+ rdis0++;
+ else if (dis[i - r] == 2)
+ rpdis0++;
+ else
+ break;
+ }
+ /*
+ * If the run before the line 'i' found only multimatch lines, we
+ * return 0 and hence we don't make the current line (i) discarded.
+ * We want to discard multimatch lines only when they appear in the
+ * middle of runs with nomatch lines (dis[j] == 0).
+ */
+ if (rdis0 == 0)
+ return 0;
+ for (r = 1, rdis1 = 0, rpdis1 = 1; (i + r) <= e; r++) {
+ if (!dis[i + r])
+ rdis1++;
+ else if (dis[i + r] == 2)
+ rpdis1++;
+ else
+ break;
+ }
+ /*
+ * If the run after the line 'i' found only multimatch lines, we
+ * return 0 and hence we don't make the current line (i) discarded.
+ */
+ if (rdis1 == 0)
+ return 0;
+ rdis1 += rdis0;
+ rpdis1 += rpdis0;
+
+ return rpdis1 * XDL_KPDIS_RUN < (rpdis1 + rdis1);
+}
+
+
+/*
+ * Try to reduce the problem complexity, discard records that have no
+ * matches on the other file. Also, lines that have multiple matches
+ * might be potentially discarded if they happear in a run of discardable.
+ */
+static int xdl_cleanup_records(xdlclassifier_t *cf, xdfile_t *xdf1, xdfile_t *xdf2) {
+ long i, nm, nreff, mlim;
+ xrecord_t **recs;
+ xdlclass_t *rcrec;
+ char *dis, *dis1, *dis2;
+
+ if (!(dis = (char *) xdl_malloc(xdf1->nrec + xdf2->nrec + 2))) {
+
+ return -1;
+ }
+ memset(dis, 0, xdf1->nrec + xdf2->nrec + 2);
+ dis1 = dis;
+ dis2 = dis1 + xdf1->nrec + 1;
+
+ if ((mlim = xdl_bogosqrt(xdf1->nrec)) > XDL_MAX_EQLIMIT)
+ mlim = XDL_MAX_EQLIMIT;
+ for (i = xdf1->dstart, recs = &xdf1->recs[xdf1->dstart]; i <= xdf1->dend; i++, recs++) {
+ rcrec = cf->rcrecs[(*recs)->ha];
+ nm = rcrec ? rcrec->len2 : 0;
+ dis1[i] = (nm == 0) ? 0: (nm >= mlim) ? 2: 1;
+ }
+
+ if ((mlim = xdl_bogosqrt(xdf2->nrec)) > XDL_MAX_EQLIMIT)
+ mlim = XDL_MAX_EQLIMIT;
+ for (i = xdf2->dstart, recs = &xdf2->recs[xdf2->dstart]; i <= xdf2->dend; i++, recs++) {
+ rcrec = cf->rcrecs[(*recs)->ha];
+ nm = rcrec ? rcrec->len1 : 0;
+ dis2[i] = (nm == 0) ? 0: (nm >= mlim) ? 2: 1;
+ }
+
+ for (nreff = 0, i = xdf1->dstart, recs = &xdf1->recs[xdf1->dstart];
+ i <= xdf1->dend; i++, recs++) {
+ if (dis1[i] == 1 ||
+ (dis1[i] == 2 && !xdl_clean_mmatch(dis1, i, xdf1->dstart, xdf1->dend))) {
+ xdf1->rindex[nreff] = i;
+ xdf1->ha[nreff] = (*recs)->ha;
+ nreff++;
+ } else
+ xdf1->rchg[i] = 1;
+ }
+ xdf1->nreff = nreff;
+
+ for (nreff = 0, i = xdf2->dstart, recs = &xdf2->recs[xdf2->dstart];
+ i <= xdf2->dend; i++, recs++) {
+ if (dis2[i] == 1 ||
+ (dis2[i] == 2 && !xdl_clean_mmatch(dis2, i, xdf2->dstart, xdf2->dend))) {
+ xdf2->rindex[nreff] = i;
+ xdf2->ha[nreff] = (*recs)->ha;
+ nreff++;
+ } else
+ xdf2->rchg[i] = 1;
+ }
+ xdf2->nreff = nreff;
+
+ xdl_free(dis);
+
+ return 0;
+}
+
+
+/*
+ * Early trim initial and terminal matching records.
+ */
+static int xdl_trim_ends(xdfile_t *xdf1, xdfile_t *xdf2) {
+ long i, lim;
+ xrecord_t **recs1, **recs2;
+
+ recs1 = xdf1->recs;
+ recs2 = xdf2->recs;
+ for (i = 0, lim = XDL_MIN(xdf1->nrec, xdf2->nrec); i < lim;
+ i++, recs1++, recs2++)
+ if ((*recs1)->ha != (*recs2)->ha)
+ break;
+
+ xdf1->dstart = xdf2->dstart = i;
+
+ recs1 = xdf1->recs + xdf1->nrec - 1;
+ recs2 = xdf2->recs + xdf2->nrec - 1;
+ for (lim -= i, i = 0; i < lim; i++, recs1--, recs2--)
+ if ((*recs1)->ha != (*recs2)->ha)
+ break;
+
+ xdf1->dend = xdf1->nrec - i - 1;
+ xdf2->dend = xdf2->nrec - i - 1;
+
+ return 0;
+}
+
+
+static int xdl_optimize_ctxs(xdlclassifier_t *cf, xdfile_t *xdf1, xdfile_t *xdf2) {
+
+ if (xdl_trim_ends(xdf1, xdf2) < 0 ||
+ xdl_cleanup_records(cf, xdf1, xdf2) < 0) {
+
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/src/nvim/xdiff/xprepare.h b/src/nvim/xdiff/xprepare.h
new file mode 100644
index 0000000000..947d9fc1bb
--- /dev/null
+++ b/src/nvim/xdiff/xprepare.h
@@ -0,0 +1,34 @@
+/*
+ * LibXDiff by Davide Libenzi ( File Differential Library )
+ * Copyright (C) 2003 Davide Libenzi
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Davide Libenzi <davidel@xmailserver.org>
+ *
+ */
+
+#if !defined(XPREPARE_H)
+#define XPREPARE_H
+
+
+
+int xdl_prepare_env(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
+ xdfenv_t *xe);
+void xdl_free_env(xdfenv_t *xe);
+
+
+
+#endif /* #if !defined(XPREPARE_H) */
diff --git a/src/nvim/xdiff/xtypes.h b/src/nvim/xdiff/xtypes.h
new file mode 100644
index 0000000000..8442bd436e
--- /dev/null
+++ b/src/nvim/xdiff/xtypes.h
@@ -0,0 +1,67 @@
+/*
+ * LibXDiff by Davide Libenzi ( File Differential Library )
+ * Copyright (C) 2003 Davide Libenzi
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Davide Libenzi <davidel@xmailserver.org>
+ *
+ */
+
+#if !defined(XTYPES_H)
+#define XTYPES_H
+
+
+
+typedef struct s_chanode {
+ struct s_chanode *next;
+ long icurr;
+} chanode_t;
+
+typedef struct s_chastore {
+ chanode_t *head, *tail;
+ long isize, nsize;
+ chanode_t *ancur;
+ chanode_t *sncur;
+ long scurr;
+} chastore_t;
+
+typedef struct s_xrecord {
+ struct s_xrecord *next;
+ char const *ptr;
+ long size;
+ unsigned long ha;
+} xrecord_t;
+
+typedef struct s_xdfile {
+ chastore_t rcha;
+ long nrec;
+ unsigned int hbits;
+ xrecord_t **rhash;
+ long dstart, dend;
+ xrecord_t **recs;
+ char *rchg;
+ long *rindex;
+ long nreff;
+ unsigned long *ha;
+} xdfile_t;
+
+typedef struct s_xdfenv {
+ xdfile_t xdf1, xdf2;
+} xdfenv_t;
+
+
+
+#endif /* #if !defined(XTYPES_H) */
diff --git a/src/nvim/xdiff/xutils.c b/src/nvim/xdiff/xutils.c
new file mode 100644
index 0000000000..25a090fb73
--- /dev/null
+++ b/src/nvim/xdiff/xutils.c
@@ -0,0 +1,425 @@
+/*
+ * LibXDiff by Davide Libenzi ( File Differential Library )
+ * Copyright (C) 2003 Davide Libenzi
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Davide Libenzi <davidel@xmailserver.org>
+ *
+ */
+
+#include <limits.h>
+#include <assert.h>
+#include "xinclude.h"
+
+
+
+
+long xdl_bogosqrt(long n) {
+ long i;
+
+ /*
+ * Classical integer square root approximation using shifts.
+ */
+ for (i = 1; n > 0; n >>= 2)
+ i <<= 1;
+
+ return i;
+}
+
+
+int xdl_emit_diffrec(char const *rec, long size, char const *pre, long psize,
+ xdemitcb_t *ecb) {
+ int i = 2;
+ mmbuffer_t mb[3];
+
+ mb[0].ptr = (char *) pre;
+ mb[0].size = psize;
+ mb[1].ptr = (char *) rec;
+ mb[1].size = size;
+ if (size > 0 && rec[size - 1] != '\n') {
+ mb[2].ptr = (char *) "\n\\ No newline at end of file\n";
+ mb[2].size = (long)strlen(mb[2].ptr);
+ i++;
+ }
+ if (ecb->outf(ecb->priv, mb, i) < 0) {
+
+ return -1;
+ }
+
+ return 0;
+}
+
+void *xdl_mmfile_first(mmfile_t *mmf, long *size)
+{
+ *size = mmf->size;
+ return mmf->ptr;
+}
+
+
+long xdl_mmfile_size(mmfile_t *mmf)
+{
+ return mmf->size;
+}
+
+
+int xdl_cha_init(chastore_t *cha, long isize, long icount) {
+
+ cha->head = cha->tail = NULL;
+ cha->isize = isize;
+ cha->nsize = icount * isize;
+ cha->ancur = cha->sncur = NULL;
+ cha->scurr = 0;
+
+ return 0;
+}
+
+
+void xdl_cha_free(chastore_t *cha) {
+ chanode_t *cur, *tmp;
+
+ for (cur = cha->head; (tmp = cur) != NULL;) {
+ cur = cur->next;
+ xdl_free(tmp);
+ }
+}
+
+
+void *xdl_cha_alloc(chastore_t *cha) {
+ chanode_t *ancur;
+ void *data;
+
+ if (!(ancur = cha->ancur) || ancur->icurr == cha->nsize) {
+ if (!(ancur = (chanode_t *) xdl_malloc(sizeof(chanode_t) + cha->nsize))) {
+
+ return NULL;
+ }
+ ancur->icurr = 0;
+ ancur->next = NULL;
+ if (cha->tail)
+ cha->tail->next = ancur;
+ if (!cha->head)
+ cha->head = ancur;
+ cha->tail = ancur;
+ cha->ancur = ancur;
+ }
+
+ data = (char *) ancur + sizeof(chanode_t) + ancur->icurr;
+ ancur->icurr += cha->isize;
+
+ return data;
+}
+
+long xdl_guess_lines(mmfile_t *mf, long sample) {
+ long nl = 0, size, tsize = 0;
+ char const *data, *cur, *top;
+
+ if ((cur = data = xdl_mmfile_first(mf, &size)) != NULL) {
+ for (top = data + size; nl < sample && cur < top; ) {
+ nl++;
+ if (!(cur = memchr(cur, '\n', top - cur)))
+ cur = top;
+ else
+ cur++;
+ }
+ tsize += (long) (cur - data);
+ }
+
+ if (nl && tsize)
+ nl = xdl_mmfile_size(mf) / (tsize / nl);
+
+ return nl + 1;
+}
+
+int xdl_blankline(const char *line, long size, long flags)
+{
+ long i;
+
+ if (!(flags & XDF_WHITESPACE_FLAGS))
+ return (size <= 1);
+
+ for (i = 0; i < size && XDL_ISSPACE(line[i]); i++)
+ ;
+
+ return (i == size);
+}
+
+/*
+ * Have we eaten everything on the line, except for an optional
+ * CR at the very end?
+ */
+static int ends_with_optional_cr(const char *l, long s, long i)
+{
+ int complete = s && l[s-1] == '\n';
+
+ if (complete)
+ s--;
+ if (s == i)
+ return 1;
+ /* do not ignore CR at the end of an incomplete line */
+ if (complete && s == i + 1 && l[i] == '\r')
+ return 1;
+ return 0;
+}
+
+int xdl_recmatch(const char *l1, long s1, const char *l2, long s2, long flags)
+{
+ int i1, i2;
+
+ if (s1 == s2 && !memcmp(l1, l2, s1))
+ return 1;
+ if (!(flags & XDF_WHITESPACE_FLAGS))
+ return 0;
+
+ i1 = 0;
+ i2 = 0;
+
+ /*
+ * -w matches everything that matches with -b, and -b in turn
+ * matches everything that matches with --ignore-space-at-eol,
+ * which in turn matches everything that matches with --ignore-cr-at-eol.
+ *
+ * Each flavor of ignoring needs different logic to skip whitespaces
+ * while we have both sides to compare.
+ */
+ if (flags & XDF_IGNORE_WHITESPACE) {
+ goto skip_ws;
+ while (i1 < s1 && i2 < s2) {
+ if (l1[i1++] != l2[i2++])
+ return 0;
+ skip_ws:
+ while (i1 < s1 && XDL_ISSPACE(l1[i1]))
+ i1++;
+ while (i2 < s2 && XDL_ISSPACE(l2[i2]))
+ i2++;
+ }
+ } else if (flags & XDF_IGNORE_WHITESPACE_CHANGE) {
+ while (i1 < s1 && i2 < s2) {
+ if (XDL_ISSPACE(l1[i1]) && XDL_ISSPACE(l2[i2])) {
+ /* Skip matching spaces and try again */
+ while (i1 < s1 && XDL_ISSPACE(l1[i1]))
+ i1++;
+ while (i2 < s2 && XDL_ISSPACE(l2[i2]))
+ i2++;
+ continue;
+ }
+ if (l1[i1++] != l2[i2++])
+ return 0;
+ }
+ } else if (flags & XDF_IGNORE_WHITESPACE_AT_EOL) {
+ while (i1 < s1 && i2 < s2 && l1[i1] == l2[i2]) {
+ i1++;
+ i2++;
+ }
+ } else if (flags & XDF_IGNORE_CR_AT_EOL) {
+ /* Find the first difference and see how the line ends */
+ while (i1 < s1 && i2 < s2 && l1[i1] == l2[i2]) {
+ i1++;
+ i2++;
+ }
+ return (ends_with_optional_cr(l1, s1, i1) &&
+ ends_with_optional_cr(l2, s2, i2));
+ }
+
+ /*
+ * After running out of one side, the remaining side must have
+ * nothing but whitespace for the lines to match. Note that
+ * ignore-whitespace-at-eol case may break out of the loop
+ * while there still are characters remaining on both lines.
+ */
+ if (i1 < s1) {
+ while (i1 < s1 && XDL_ISSPACE(l1[i1]))
+ i1++;
+ if (s1 != i1)
+ return 0;
+ }
+ if (i2 < s2) {
+ while (i2 < s2 && XDL_ISSPACE(l2[i2]))
+ i2++;
+ return (s2 == i2);
+ }
+ return 1;
+}
+
+static unsigned long xdl_hash_record_with_whitespace(char const **data,
+ char const *top, long flags) {
+ unsigned long ha = 5381;
+ char const *ptr = *data;
+ int cr_at_eol_only = (flags & XDF_WHITESPACE_FLAGS) == XDF_IGNORE_CR_AT_EOL;
+
+ for (; ptr < top && *ptr != '\n'; ptr++) {
+ if (cr_at_eol_only) {
+ /* do not ignore CR at the end of an incomplete line */
+ if (*ptr == '\r' &&
+ (ptr + 1 < top && ptr[1] == '\n'))
+ continue;
+ }
+ else if (XDL_ISSPACE(*ptr)) {
+ const char *ptr2 = ptr;
+ int at_eol;
+ while (ptr + 1 < top && XDL_ISSPACE(ptr[1])
+ && ptr[1] != '\n')
+ ptr++;
+ at_eol = (top <= ptr + 1 || ptr[1] == '\n');
+ if (flags & XDF_IGNORE_WHITESPACE)
+ ; /* already handled */
+ else if (flags & XDF_IGNORE_WHITESPACE_CHANGE
+ && !at_eol) {
+ ha += (ha << 5);
+ ha ^= (unsigned long) ' ';
+ }
+ else if (flags & XDF_IGNORE_WHITESPACE_AT_EOL
+ && !at_eol) {
+ while (ptr2 != ptr + 1) {
+ ha += (ha << 5);
+ ha ^= (unsigned long) *ptr2;
+ ptr2++;
+ }
+ }
+ continue;
+ }
+ ha += (ha << 5);
+ ha ^= (unsigned long) *ptr;
+ }
+ *data = ptr < top ? ptr + 1: ptr;
+
+ return ha;
+}
+
+unsigned long xdl_hash_record(char const **data, char const *top, long flags) {
+ unsigned long ha = 5381;
+ char const *ptr = *data;
+
+ if (flags & XDF_WHITESPACE_FLAGS)
+ return xdl_hash_record_with_whitespace(data, top, flags);
+
+ for (; ptr < top && *ptr != '\n'; ptr++) {
+ ha += (ha << 5);
+ ha ^= (unsigned long) *ptr;
+ }
+ *data = ptr < top ? ptr + 1: ptr;
+
+ return ha;
+}
+
+unsigned int xdl_hashbits(unsigned int size) {
+ unsigned int val = 1, bits = 0;
+
+ for (; val < size && bits < CHAR_BIT * sizeof(unsigned int); val <<= 1, bits++);
+ return bits ? bits: 1;
+}
+
+
+int xdl_num_out(char *out, long val) {
+ char *ptr, *str = out;
+ char buf[32];
+
+ ptr = buf + sizeof(buf) - 1;
+ *ptr = '\0';
+ if (val < 0) {
+ *--ptr = '-';
+ val = -val;
+ }
+ for (; val && ptr > buf; val /= 10)
+ *--ptr = "0123456789"[val % 10];
+ if (*ptr)
+ for (; *ptr; ptr++, str++)
+ *str = *ptr;
+ else
+ *str++ = '0';
+ *str = '\0';
+
+ return str - out;
+}
+
+int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2,
+ const char *func, long funclen, xdemitcb_t *ecb) {
+ int nb = 0;
+ mmbuffer_t mb;
+ char buf[128];
+
+ memcpy(buf, "@@ -", 4);
+ nb += 4;
+
+ nb += xdl_num_out(buf + nb, c1 ? s1: s1 - 1);
+
+ if (c1 != 1) {
+ memcpy(buf + nb, ",", 1);
+ nb += 1;
+
+ nb += xdl_num_out(buf + nb, c1);
+ }
+
+ memcpy(buf + nb, " +", 2);
+ nb += 2;
+
+ nb += xdl_num_out(buf + nb, c2 ? s2: s2 - 1);
+
+ if (c2 != 1) {
+ memcpy(buf + nb, ",", 1);
+ nb += 1;
+
+ nb += xdl_num_out(buf + nb, c2);
+ }
+
+ memcpy(buf + nb, " @@", 3);
+ nb += 3;
+ if (func && funclen) {
+ buf[nb++] = ' ';
+ if (funclen > (long)sizeof(buf) - nb - 1)
+ funclen = sizeof(buf) - nb - 1;
+ memcpy(buf + nb, func, funclen);
+ nb += funclen;
+ }
+ buf[nb++] = '\n';
+
+ mb.ptr = buf;
+ mb.size = nb;
+ if (ecb->outf(ecb->priv, &mb, 1) < 0)
+ return -1;
+
+ return 0;
+}
+
+int xdl_fall_back_diff(xdfenv_t *diff_env, xpparam_t const *xpp,
+ int line1, int count1, int line2, int count2)
+{
+ /*
+ * This probably does not work outside Git, since
+ * we have a very simple mmfile structure.
+ *
+ * Note: ideally, we would reuse the prepared environment, but
+ * the libxdiff interface does not (yet) allow for diffing only
+ * ranges of lines instead of the whole files.
+ */
+ mmfile_t subfile1, subfile2;
+ xdfenv_t env;
+
+ subfile1.ptr = (char *)diff_env->xdf1.recs[line1 - 1]->ptr;
+ subfile1.size = diff_env->xdf1.recs[line1 + count1 - 2]->ptr +
+ diff_env->xdf1.recs[line1 + count1 - 2]->size - subfile1.ptr;
+ subfile2.ptr = (char *)diff_env->xdf2.recs[line2 - 1]->ptr;
+ subfile2.size = diff_env->xdf2.recs[line2 + count2 - 2]->ptr +
+ diff_env->xdf2.recs[line2 + count2 - 2]->size - subfile2.ptr;
+ if (xdl_do_diff(&subfile1, &subfile2, xpp, &env) < 0)
+ return -1;
+
+ memcpy(diff_env->xdf1.rchg + line1 - 1, env.xdf1.rchg, count1);
+ memcpy(diff_env->xdf2.rchg + line2 - 1, env.xdf2.rchg, count2);
+
+ xdl_free_env(&env);
+
+ return 0;
+}
diff --git a/src/nvim/xdiff/xutils.h b/src/nvim/xdiff/xutils.h
new file mode 100644
index 0000000000..fba7bae03c
--- /dev/null
+++ b/src/nvim/xdiff/xutils.h
@@ -0,0 +1,47 @@
+/*
+ * LibXDiff by Davide Libenzi ( File Differential Library )
+ * Copyright (C) 2003 Davide Libenzi
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Davide Libenzi <davidel@xmailserver.org>
+ *
+ */
+
+#if !defined(XUTILS_H)
+#define XUTILS_H
+
+
+
+long xdl_bogosqrt(long n);
+int xdl_emit_diffrec(char const *rec, long size, char const *pre, long psize,
+ xdemitcb_t *ecb);
+int xdl_cha_init(chastore_t *cha, long isize, long icount);
+void xdl_cha_free(chastore_t *cha);
+void *xdl_cha_alloc(chastore_t *cha);
+long xdl_guess_lines(mmfile_t *mf, long sample);
+int xdl_blankline(const char *line, long size, long flags);
+int xdl_recmatch(const char *l1, long s1, const char *l2, long s2, long flags);
+unsigned long xdl_hash_record(char const **data, char const *top, long flags);
+unsigned int xdl_hashbits(unsigned int size);
+int xdl_num_out(char *out, long val);
+int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2,
+ const char *func, long funclen, xdemitcb_t *ecb);
+int xdl_fall_back_diff(xdfenv_t *diff_env, xpparam_t const *xpp,
+ int line1, int count1, int line2, int count2);
+
+
+
+#endif /* #if !defined(XUTILS_H) */
diff --git a/test/.luacheckrc b/test/.luacheckrc
index 92e19d40e8..abfa881754 100644
--- a/test/.luacheckrc
+++ b/test/.luacheckrc
@@ -11,3 +11,10 @@ self = false
-- Rerun tests only if their modification time changed.
cache = true
+
+ignore = {
+ "631", -- max_line_length
+}
+
+-- Ignore whitespace issues in converted Vim legacy tests.
+--files["functional/legacy"] = {ignore = { "611", "612", "613", "621" }}
diff --git a/test/README.md b/test/README.md
new file mode 100644
index 0000000000..d3f421e8fc
--- /dev/null
+++ b/test/README.md
@@ -0,0 +1,327 @@
+Tests
+=====
+
+Tests are broadly divided into *unit tests* ([test/unit](https://github.com/neovim/neovim/tree/master/test/unit/)),
+*functional tests* ([test/functional](https://github.com/neovim/neovim/tree/master/test/functional/)),
+and *old tests* ([src/nvim/testdir/](https://github.com/neovim/neovim/tree/master/src/nvim/testdir/)).
+
+- _Unit_ testing is achieved by compiling the tests as a shared library which is
+ loaded and called by [LuaJit FFI](http://luajit.org/ext_ffi.html).
+- _Functional_ tests are driven by RPC, so they do not require LuaJit (as
+ opposed to Lua).
+
+You can learn the [key concepts of Lua in 15 minutes](http://learnxinyminutes.com/docs/lua/).
+Use any existing test as a template to start writing new tests.
+
+Tests are run by `/cmake/RunTests.cmake` file, using `busted` (a Lua test-runner).
+For some failures, `.nvimlog` (or `$NVIM_LOG_FILE`) may provide insight.
+
+Depending on the presence of binaries (e.g., `xclip`) some tests will be
+ignored. You must compile with libintl to prevent `E319: The command is not
+available in this version` errors.
+
+
+---
+
+- [Running tests](#running-tests)
+- [Writing tests](#writing-tests)
+- [Lint](#lint)
+- [Environment variables](#environment-variables)
+
+---
+
+
+Layout
+======
+
+- `/test/benchmark` : benchmarks
+- `/test/functional` : functional tests
+- `/test/unit` : unit tests
+- `/test/config` : contains `*.in` files which are transformed into `*.lua`
+ files using `configure_file` CMake command: this is for acessing CMake
+ variables in lua tests.
+- `/test/includes` : include-files for use by luajit `ffi.cdef` C definitions
+ parser: normally used to make macros not accessible via this mechanism
+ accessible the other way.
+- `/test/*/preload.lua` : modules preloaded by busted `--helper` option
+- `/test/**/helpers.lua` : common utility functions for test code
+- `/test/*/**/*_spec.lua` : actual tests. Files that do not end with
+ `_spec.lua` are libraries like `/test/**/helpers.lua`, except that they have
+ some common topic.
+- `/src/nvim/testdir` : old tests (from Vim)
+
+
+Running tests
+=============
+
+Executing Tests
+---------------
+
+To run all tests (except "old" tests):
+
+ make test
+
+To run only _unit_ tests:
+
+ make unittest
+
+To run only _functional_ tests:
+
+ make functionaltest
+
+
+Legacy tests
+------------
+
+To run all legacy Vim tests:
+
+ make oldtest
+
+To run a *single* legacy test set `TEST_FILE`, for example:
+
+ TEST_FILE=test_syntax.res make oldtest
+
+- The `.res` extension (instead of `.vim`) is required.
+- Specify only the test file name, not the full path.
+
+
+Debugging tests
+---------------
+
+You can set `$GDB` to [run tests under gdbserver](https://github.com/neovim/neovim/pull/1527).
+And if `$VALGRIND` is set it will pass `--vgdb=yes` to valgrind instead of
+starting gdbserver directly.
+
+
+Filtering Tests
+---------------
+
+### Filter by name
+
+Another filter method is by setting a pattern of test name to `TEST_FILTER`.
+
+``` lua
+it('foo api',function()
+ ...
+end)
+it('bar api',function()
+ ...
+end)
+```
+
+To run only test with filter name:
+
+ TEST_TAG='foo.*api' make functionaltest
+
+### Filter by file
+
+To run a *specific* unit test:
+
+ TEST_FILE=test/unit/foo.lua make unittest
+
+To run a *specific* functional test:
+
+ TEST_FILE=test/functional/foo.lua make functionaltest
+
+To *repeat* a test:
+
+ .deps/usr/bin/busted --lpath='build/?.lua' --filter 'foo' --repeat 1000 test/functional/ui/foo_spec.lua
+
+### Filter by tag
+
+Tests can be "tagged" by adding `#` before a token in the test description.
+
+``` lua
+it('#foo bar baz', function()
+ ...
+end)
+it('#foo another test', function()
+ ...
+end)
+```
+
+To run only the tagged tests:
+
+ TEST_TAG=foo make functionaltest
+
+**NOTE:**
+
+* `TEST_FILE` is not a pattern string like `TEST_TAG` or `TEST_FILTER`. The
+ given value to `TEST_FILE` must be a path to an existing file.
+* Both `TEST_TAG` and `TEST_FILTER` filter tests by the string descriptions
+ found in `it()` and `describe()`.
+
+
+Writing tests
+=============
+
+Guidelines
+----------
+
+- Consider [BDD](http://en.wikipedia.org/wiki/Behavior-driven_development)
+ guidelines for organization and readability of tests. Describe what you're
+ testing (and the environment if applicable) and create specs that assert its
+ behavior.
+- For testing static functions or functions that have side effects visible only
+ in module-global variables, create accessors for the modified variables. For
+ example, say you are testing a function in misc1.c that modifies a static
+ variable, create a file `test/c-helpers/misc1.c` and add a function that
+ retrieves the value after the function call. Files under `test/c-helpers` will
+ only be compiled when building the test shared library.
+- Luajit needs to know about type and constant declarations used in function
+ prototypes. The
+ [helpers.lua](https://github.com/neovim/neovim/blob/master/test/unit/helpers.lua)
+ file automatically parses `types.h`, so types used in the tested functions
+ must be moved to it to avoid having to rewrite the declarations in the test
+ files (even though this is how it's currently done currently in the misc1/fs
+ modules, but contributors are encouraged to refactor the declarations).
+ - Macro constants must be rewritten as enums so they can be "visible" to the
+ tests automatically.
+- Busted supports various "output providers". The
+ **[gtest](https://github.com/Olivine-Labs/busted/pull/394) output provider**
+ shows verbose details that can be useful to diagnose hung tests. Either modify
+ the Makefile or compile with `make
+ CMAKE_EXTRA_FLAGS=-DBUSTED_OUTPUT_TYPE=gtest` to enable it.
+- **Use busted's `pending()` feature** to skip tests
+ ([example](https://github.com/neovim/neovim/commit/5c1dc0fbe7388528875aff9d7b5055ad718014de#diff-bf80b24c724b0004e8418102f68b0679R18)).
+ Do not silently skip the test with `if-else`. If a functional test depends on
+ some external factor (e.g. the existence of `md5sum` on `$PATH`), *and* you
+ can't mock or fake the dependency, then skip the test via `pending()` if the
+ external factor is missing. This ensures that the *total* test-count
+ (success + fail + error + pending) is the same in all environments.
+ - *Note:* `pending()` is ignored if it is missing an argument _unless_ it is
+ [contained in an `it()` block](https://github.com/neovim/neovim/blob/d21690a66e7eb5ebef18046c7a79ef898966d786/test/functional/ex_cmds/grep_spec.lua#L11).
+ Provide empty function argument if the `pending()` call is outside of `it()`
+ ([example](https://github.com/neovim/neovim/commit/5c1dc0fbe7388528875aff9d7b5055ad718014de#diff-bf80b24c724b0004e8418102f68b0679R18)).
+- Use `make testlint` for using the shipped luacheck program ([supported by syntastic](https://github.com/scrooloose/syntastic/blob/d6b96c079be137c83009827b543a83aa113cc011/doc/syntastic-checkers.txt#L3546))
+ to lint all tests.
+- Really long `source([=[...]=])` blocks may break syntax highlighting. Try
+ `:syntax sync fromstart` to fix it.
+
+Where tests go
+--------------
+
+Tests in `/test/unit` and `/test/functional` are divided into groups
+by the semantic component they are testing.
+
+- _Unit tests_
+ ([test/unit](https://github.com/neovim/neovim/tree/master/test/unit)) should
+ match 1-to-1 with the structure of `src/nvim/`, because they are testing
+ functions directly. E.g. unit-tests for `src/nvim/undo.c` should live in
+ `test/unit/undo_spec.lua`.
+- _Functional tests_
+ ([test/functional](https://github.com/neovim/neovim/tree/master/test/functional))
+ are higher-level (plugins and user input) than unit tests; they are organized
+ by concept.
+ - Try to find an existing `test/functional/*/*_spec.lua` group that makes
+ sense, before creating a new one.
+
+
+Lint
+====
+
+`make lint` (and `make testlint`) runs [luacheck](https://github.com/mpeterv/luacheck)
+on the test code.
+
+If a luacheck warning must be ignored, specify the warning code. Example:
+
+ -- luacheck: ignore 621
+
+http://luacheck.readthedocs.io/en/stable/warnings.html
+
+Ignore the smallest applicable scope (e.g. inside a function, not at the top of
+the file).
+
+
+Environment variables
+=====================
+
+Test behaviour is affected by environment variables. Currently supported
+(Functional, Unit, Benchmarks) (when Defined; when set to _1_; when defined,
+treated as Integer; when defined, treated as String; when defined, treated as
+Number; !must be defined to function properly):
+
+`GDB` (F) (D): makes nvim instances to be run under `gdbserver`. It will be
+accessible on `localhost:7777`: use `gdb build/bin/nvim`, type `target remote
+:7777` inside.
+
+`GDBSERVER_PORT` (F) (I): overrides port used for `GDB`.
+
+`VALGRIND` (F) (D): makes nvim instances to be run under `valgrind`. Log files
+are named `valgrind-%p.log` in this case. Note that non-empty valgrind log may
+fail tests. Valgrind arguments may be seen in `/test/functional/helpers.lua`.
+May be used in conjunction with `GDB`.
+
+`VALGRIND_LOG` (F) (S): overrides valgrind log file name used for `VALGRIND`.
+
+`TEST_SKIP_FRAGILE` (F) (D): makes test suite skip some fragile tests.
+
+`NVIM_PROG`, `NVIM_PRG` (F) (S): override path to Neovim executable (default to
+`build/bin/nvim`).
+
+`CC` (U) (S): specifies which C compiler to use to preprocess files. Currently
+only compilers with gcc-compatible arguments are supported.
+
+`NVIM_TEST_MAIN_CDEFS` (U) (1): makes `ffi.cdef` run in main process. This
+raises a possibility of bugs due to conflicts in header definitions, despite the
+counters, but greatly speeds up unit tests by not requiring `ffi.cdef` to do
+parsing of big strings with C definitions.
+
+`NVIM_TEST_PRINT_I` (U) (1): makes `cimport` print preprocessed, but not yet
+filtered through `formatc` headers. Used to debug `formatc`. Printing is done
+with the line numbers.
+
+`NVIM_TEST_PRINT_CDEF` (U) (1): makes `cimport` print final lines which will be
+then passed to `ffi.cdef`. Used to debug errors `ffi.cdef` happens to throw
+sometimes.
+
+`NVIM_TEST_PRINT_SYSCALLS` (U) (1): makes it print to stderr when syscall
+wrappers are called and what they returned. Used to debug code which makes unit
+tests be executed in separate processes.
+
+`NVIM_TEST_RUN_FAILING_TESTS` (U) (1): makes `itp` run tests which are known to
+fail (marked by setting third argument to `true`).
+
+`LOG_DIR` (FU) (S!): specifies where to seek for valgrind and ASAN log files.
+
+`NVIM_TEST_CORE_*` (FU) (S): a set of environment variables which specify where
+to search for core files. Are supposed to be defined all at once.
+
+`NVIM_TEST_CORE_GLOB_DIRECTORY` (FU) (S): directory where core files are
+located. May be `.`. This directory is then recursively searched for core files.
+Note: this variable must be defined for any of the following to have any effect.
+
+`NVIM_TEST_CORE_GLOB_RE` (FU) (S): regular expression which must be matched by
+core files. E.g. `/core[^/]*$`. May be absent, in which case any file is
+considered to be matched.
+
+`NVIM_TEST_CORE_EXC_RE` (FU) (S): regular expression which excludes certain
+directories from searching for core files inside. E.g. use `^/%.deps$` to not
+search inside `/.deps`. If absent, nothing is excluded.
+
+`NVIM_TEST_CORE_DB_CMD` (FU) (S): command to get backtrace out of the debugger.
+E.g. `gdb -n -batch -ex "thread apply all bt full" "$_NVIM_TEST_APP" -c
+"$_NVIM_TEST_CORE"`. Defaults to the example command. This debug command may use
+environment variables `_NVIM_TEST_APP` (path to application which is being
+debugged: normally either nvim or luajit) and `_NVIM_TEST_CORE` (core file to
+get backtrace from).
+
+`NVIM_TEST_CORE_RANDOM_SKIP` (FU) (D): makes `check_cores` not check cores after
+approximately 90% of the tests. Should be used when finding cores is too hard
+for some reason. Normally (on OS X or when `NVIM_TEST_CORE_GLOB_DIRECTORY` is
+defined and this variable is not) cores are checked for after each test.
+
+`NVIM_TEST_RUN_TESTTEST` (U) (1): allows running `test/unit/testtest_spec.lua`
+used to check how testing infrastructure works.
+
+`NVIM_TEST_TRACE_LEVEL` (U) (N): specifies unit tests tracing level: `0`
+disables tracing (the fastest, but you get no data if tests crash and there was
+no core dump generated), `1` or empty/undefined leaves only C function cals and
+returns in the trace (faster then recording everything), `2` records all
+function calls, returns and lua source lines exuecuted.
+
+`NVIM_TEST_TRACE_ON_ERROR` (U) (1): makes unit tests yield trace on error in
+addition to regular error message.
+
+`NVIM_TEST_MAXTRACE` (U) (N): specifies maximum number of trace lines to keep.
+Default is 1024.
diff --git a/test/benchmark/bench_re_freeze_spec.lua b/test/benchmark/bench_re_freeze_spec.lua
index a194b5f44c..ea41953014 100644
--- a/test/benchmark/bench_re_freeze_spec.lua
+++ b/test/benchmark/bench_re_freeze_spec.lua
@@ -1,8 +1,8 @@
-- Test for benchmarking RE engine.
-local helpers = require('test.functional.helpers')
+local helpers = require('test.functional.helpers')(after_each)
local insert, source = helpers.insert, helpers.source
-local clear, execute, wait = helpers.clear, helpers.execute, helpers.wait
+local clear, command = helpers.clear, helpers.command
-- Temporary file for gathering benchmarking results for each regexp engine.
local result_file = 'benchmark.out'
@@ -15,12 +15,12 @@ local measure_cmd =
local measure_script = [[
func! Measure(re, file, pattern, arg)
let sstart=reltime()
-
+
execute 'set re=' . a:re
execute 'split' a:arg a:file
call search(a:pattern, '', '', 10000)
q!
-
+
$put =printf('file: %s, re: %d, time: %s', a:file, a:re, reltimestr(reltime(sstart)))
endfunc]]
@@ -31,7 +31,7 @@ describe('regexp search', function()
clear()
source(measure_script)
insert('" Benchmark_results:')
- execute('write! ' .. result_file)
+ command('write! ' .. result_file)
end)
-- At the end of the test run we just print the contents of the result file
@@ -46,22 +46,19 @@ describe('regexp search', function()
it('is working with regexpengine=0', function()
local regexpengine = 0
- execute(string.format(measure_cmd, regexpengine))
- execute('write')
- wait()
+ command(string.format(measure_cmd, regexpengine))
+ command('write')
end)
it('is working with regexpengine=1', function()
local regexpengine = 1
- execute(string.format(measure_cmd, regexpengine))
- execute('write')
- wait()
+ command(string.format(measure_cmd, regexpengine))
+ command('write')
end)
it('is working with regexpengine=2', function()
local regexpengine = 2
- execute(string.format(measure_cmd, regexpengine))
- execute('write')
- wait()
+ command(string.format(measure_cmd, regexpengine))
+ command('write')
end)
end)
diff --git a/test/config/paths.lua.in b/test/config/paths.lua.in
index 80cc5629d1..7fe5d8ad80 100644
--- a/test/config/paths.lua.in
+++ b/test/config/paths.lua.in
@@ -5,9 +5,19 @@ for p in ("${TEST_INCLUDE_DIRS}" .. ";"):gmatch("[^;]+") do
table.insert(module.include_paths, p)
end
-module.test_include_path = "${CMAKE_BINARY_DIR}/test/includes/post"
+module.test_build_dir = "${CMAKE_BINARY_DIR}"
+module.test_include_path = module.test_build_dir .. "/test/includes/post"
module.test_libnvim_path = "${TEST_LIBNVIM_PATH}"
module.test_source_path = "${CMAKE_SOURCE_DIR}"
+module.test_lua_prg = "${LUA_PRG}"
+module.test_luajit_prg = ""
+if module.test_luajit_prg == '' then
+ if module.test_lua_prg:sub(-6) == 'luajit' then
+ module.test_luajit_prg = module.test_lua_prg
+ else
+ module.test_luajit_prg = nil
+ end
+end
table.insert(module.include_paths, "${CMAKE_BINARY_DIR}/include")
return module
diff --git a/test/functional/api/buffer_spec.lua b/test/functional/api/buffer_spec.lua
index cf8a83ad81..d9412f0f13 100644
--- a/test/functional/api/buffer_spec.lua
+++ b/test/functional/api/buffer_spec.lua
@@ -1,107 +1,148 @@
--- Sanity checks for buffer_* API calls via msgpack-rpc
local helpers = require('test.functional.helpers')(after_each)
local clear, nvim, buffer = helpers.clear, helpers.nvim, helpers.buffer
local curbuf, curwin, eq = helpers.curbuf, helpers.curwin, helpers.eq
local curbufmeths, ok = helpers.curbufmeths, helpers.ok
local funcs = helpers.funcs
-
-describe('buffer_* functions', function()
+local request = helpers.request
+local exc_exec = helpers.exc_exec
+local feed_command = helpers.feed_command
+local insert = helpers.insert
+local NIL = helpers.NIL
+local meth_pcall = helpers.meth_pcall
+local command = helpers.command
+local bufmeths = helpers.bufmeths
+
+describe('api/buf', function()
before_each(clear)
+ -- access deprecated functions
+ local function curbuf_depr(method, ...)
+ return request('buffer_'..method, 0, ...)
+ end
+
+
describe('line_count, insert and del_line', function()
it('works', function()
- eq(1, curbuf('line_count'))
- curbuf('insert', -1, {'line'})
- eq(2, curbuf('line_count'))
- curbuf('insert', -1, {'line'})
- eq(3, curbuf('line_count'))
- curbuf('del_line', -1)
- eq(2, curbuf('line_count'))
- curbuf('del_line', -1)
- curbuf('del_line', -1)
+ eq(1, curbuf_depr('line_count'))
+ curbuf_depr('insert', -1, {'line'})
+ eq(2, curbuf_depr('line_count'))
+ curbuf_depr('insert', -1, {'line'})
+ eq(3, curbuf_depr('line_count'))
+ curbuf_depr('del_line', -1)
+ eq(2, curbuf_depr('line_count'))
+ curbuf_depr('del_line', -1)
+ curbuf_depr('del_line', -1)
-- There's always at least one line
- eq(1, curbuf('line_count'))
+ eq(1, curbuf_depr('line_count'))
end)
- end)
+ it('line_count has defined behaviour for unloaded buffers', function()
+ -- we'll need to know our bufnr for when it gets unloaded
+ local bufnr = curbuf('get_number')
+ -- replace the buffer contents with these three lines
+ request('nvim_buf_set_lines', bufnr, 0, -1, 1, {"line1", "line2", "line3", "line4"})
+ -- check the line count is correct
+ eq(4, request('nvim_buf_line_count', bufnr))
+ -- force unload the buffer (this will discard changes)
+ command('new')
+ command('bunload! '..bufnr)
+ -- line count for an unloaded buffer should always be 0
+ eq(0, request('nvim_buf_line_count', bufnr))
+ end)
+
+ it('get_lines has defined behaviour for unloaded buffers', function()
+ -- we'll need to know our bufnr for when it gets unloaded
+ local bufnr = curbuf('get_number')
+ -- replace the buffer contents with these three lines
+ buffer('set_lines', bufnr, 0, -1, 1, {"line1", "line2", "line3", "line4"})
+ -- confirm that getting lines works
+ eq({"line2", "line3"}, buffer('get_lines', bufnr, 1, 3, 1))
+ -- force unload the buffer (this will discard changes)
+ command('new')
+ command('bunload! '..bufnr)
+ -- attempting to get lines now always gives empty list
+ eq({}, buffer('get_lines', bufnr, 1, 3, 1))
+ -- it's impossible to get out-of-bounds errors for an unloaded buffer
+ eq({}, buffer('get_lines', bufnr, 8888, 9999, 1))
+ end)
+ end)
describe('{get,set,del}_line', function()
it('works', function()
- eq('', curbuf('get_line', 0))
- curbuf('set_line', 0, 'line1')
- eq('line1', curbuf('get_line', 0))
- curbuf('set_line', 0, 'line2')
- eq('line2', curbuf('get_line', 0))
- curbuf('del_line', 0)
- eq('', curbuf('get_line', 0))
+ eq('', curbuf_depr('get_line', 0))
+ curbuf_depr('set_line', 0, 'line1')
+ eq('line1', curbuf_depr('get_line', 0))
+ curbuf_depr('set_line', 0, 'line2')
+ eq('line2', curbuf_depr('get_line', 0))
+ curbuf_depr('del_line', 0)
+ eq('', curbuf_depr('get_line', 0))
end)
it('get_line: out-of-bounds is an error', function()
- curbuf('set_line', 0, 'line1.a')
- eq(1, curbuf('line_count')) -- sanity
- eq(false, pcall(curbuf, 'get_line', 1))
- eq(false, pcall(curbuf, 'get_line', -2))
+ curbuf_depr('set_line', 0, 'line1.a')
+ eq(1, curbuf_depr('line_count')) -- sanity
+ eq(false, pcall(curbuf_depr, 'get_line', 1))
+ eq(false, pcall(curbuf_depr, 'get_line', -2))
end)
it('set_line, del_line: out-of-bounds is an error', function()
- curbuf('set_line', 0, 'line1.a')
- eq(false, pcall(curbuf, 'set_line', 1, 'line1.b'))
- eq(false, pcall(curbuf, 'set_line', -2, 'line1.b'))
- eq(false, pcall(curbuf, 'del_line', 2))
- eq(false, pcall(curbuf, 'del_line', -3))
+ curbuf_depr('set_line', 0, 'line1.a')
+ eq(false, pcall(curbuf_depr, 'set_line', 1, 'line1.b'))
+ eq(false, pcall(curbuf_depr, 'set_line', -2, 'line1.b'))
+ eq(false, pcall(curbuf_depr, 'del_line', 2))
+ eq(false, pcall(curbuf_depr, 'del_line', -3))
end)
it('can handle NULs', function()
- curbuf('set_line', 0, 'ab\0cd')
- eq('ab\0cd', curbuf('get_line', 0))
+ curbuf_depr('set_line', 0, 'ab\0cd')
+ eq('ab\0cd', curbuf_depr('get_line', 0))
end)
end)
-
describe('{get,set}_line_slice', function()
it('get_line_slice: out-of-bounds returns empty array', function()
- curbuf('set_line_slice', 0, 0, true, true, {'a', 'b', 'c'})
- eq({'a', 'b', 'c'}, curbuf('get_line_slice', 0, 2, true, true)) --sanity
-
- eq({}, curbuf('get_line_slice', 2, 3, false, true))
- eq({}, curbuf('get_line_slice', 3, 9, true, true))
- eq({}, curbuf('get_line_slice', 3, -1, true, true))
- eq({}, curbuf('get_line_slice', -3, -4, false, true))
- eq({}, curbuf('get_line_slice', -4, -5, true, true))
+ curbuf_depr('set_line_slice', 0, 0, true, true, {'a', 'b', 'c'})
+ eq({'a', 'b', 'c'}, curbuf_depr('get_line_slice', 0, 2, true, true)) --sanity
+
+ eq({}, curbuf_depr('get_line_slice', 2, 3, false, true))
+ eq({}, curbuf_depr('get_line_slice', 3, 9, true, true))
+ eq({}, curbuf_depr('get_line_slice', 3, -1, true, true))
+ eq({}, curbuf_depr('get_line_slice', -3, -4, false, true))
+ eq({}, curbuf_depr('get_line_slice', -4, -5, true, true))
end)
it('set_line_slice: out-of-bounds extends past end', function()
- curbuf('set_line_slice', 0, 0, true, true, {'a', 'b', 'c'})
- eq({'a', 'b', 'c'}, curbuf('get_line_slice', 0, 2, true, true)) --sanity
-
- eq({'c'}, curbuf('get_line_slice', -1, 4, true, true))
- eq({'a', 'b', 'c'}, curbuf('get_line_slice', 0, 5, true, true))
- curbuf('set_line_slice', 4, 5, true, true, {'d'})
- eq({'a', 'b', 'c', 'd'}, curbuf('get_line_slice', 0, 5, true, true))
- curbuf('set_line_slice', -4, -5, true, true, {'e'})
- eq({'e', 'a', 'b', 'c', 'd'}, curbuf('get_line_slice', 0, 5, true, true))
+ curbuf_depr('set_line_slice', 0, 0, true, true, {'a', 'b', 'c'})
+ eq({'a', 'b', 'c'}, curbuf_depr('get_line_slice', 0, 2, true, true)) --sanity
+
+ eq({'c'}, curbuf_depr('get_line_slice', -1, 4, true, true))
+ eq({'a', 'b', 'c'}, curbuf_depr('get_line_slice', 0, 5, true, true))
+ curbuf_depr('set_line_slice', 4, 5, true, true, {'d'})
+ eq({'a', 'b', 'c', 'd'}, curbuf_depr('get_line_slice', 0, 5, true, true))
+ curbuf_depr('set_line_slice', -4, -5, true, true, {'e'})
+ eq({'e', 'a', 'b', 'c', 'd'}, curbuf_depr('get_line_slice', 0, 5, true, true))
end)
it('works', function()
- eq({''}, curbuf('get_line_slice', 0, -1, true, true))
+ eq({''}, curbuf_depr('get_line_slice', 0, -1, true, true))
-- Replace buffer
- curbuf('set_line_slice', 0, -1, true, true, {'a', 'b', 'c'})
- eq({'a', 'b', 'c'}, curbuf('get_line_slice', 0, -1, true, true))
- eq({'b', 'c'}, curbuf('get_line_slice', 1, -1, true, true))
- eq({'b'}, curbuf('get_line_slice', 1, 2, true, false))
- eq({}, curbuf('get_line_slice', 1, 1, true, false))
- eq({'a', 'b'}, curbuf('get_line_slice', 0, -1, true, false))
- eq({'b'}, curbuf('get_line_slice', 1, -1, true, false))
- eq({'b', 'c'}, curbuf('get_line_slice', -2, -1, true, true))
- curbuf('set_line_slice', 1, 2, true, false, {'a', 'b', 'c'})
- eq({'a', 'a', 'b', 'c', 'c'}, curbuf('get_line_slice', 0, -1, true, true))
- curbuf('set_line_slice', -1, -1, true, true, {'a', 'b', 'c'})
+ curbuf_depr('set_line_slice', 0, -1, true, true, {'a', 'b', 'c'})
+ eq({'a', 'b', 'c'}, curbuf_depr('get_line_slice', 0, -1, true, true))
+ eq({'b', 'c'}, curbuf_depr('get_line_slice', 1, -1, true, true))
+ eq({'b'}, curbuf_depr('get_line_slice', 1, 2, true, false))
+ eq({}, curbuf_depr('get_line_slice', 1, 1, true, false))
+ eq({'a', 'b'}, curbuf_depr('get_line_slice', 0, -1, true, false))
+ eq({'b'}, curbuf_depr('get_line_slice', 1, -1, true, false))
+ eq({'b', 'c'}, curbuf_depr('get_line_slice', -2, -1, true, true))
+ curbuf_depr('set_line_slice', 1, 2, true, false, {'a', 'b', 'c'})
+ eq({'a', 'a', 'b', 'c', 'c'}, curbuf_depr('get_line_slice', 0, -1, true, true))
+ curbuf_depr('set_line_slice', -1, -1, true, true, {'a', 'b', 'c'})
eq({'a', 'a', 'b', 'c', 'a', 'b', 'c'},
- curbuf('get_line_slice', 0, -1, true, true))
- curbuf('set_line_slice', 0, -3, true, false, {})
- eq({'a', 'b', 'c'}, curbuf('get_line_slice', 0, -1, true, true))
- curbuf('set_line_slice', 0, -1, true, true, {})
- eq({''}, curbuf('get_line_slice', 0, -1, true, true))
+ curbuf_depr('get_line_slice', 0, -1, true, true))
+ curbuf_depr('set_line_slice', 0, -3, true, false, {})
+ eq({'a', 'b', 'c'}, curbuf_depr('get_line_slice', 0, -1, true, true))
+ curbuf_depr('set_line_slice', 0, -1, true, true, {})
+ eq({''}, curbuf_depr('get_line_slice', 0, -1, true, true))
end)
end)
@@ -109,6 +150,15 @@ describe('buffer_* functions', function()
local get_lines, set_lines = curbufmeths.get_lines, curbufmeths.set_lines
local line_count = curbufmeths.line_count
+ it('fails correctly when input is not valid', function()
+ eq(1, curbufmeths.get_number())
+ local err, emsg = pcall(bufmeths.set_lines, 1, 1, 2, false, {'b\na'})
+ eq(false, err)
+ local exp_emsg = 'String cannot contain newlines'
+ -- Expected {filename}:{lnum}: {exp_emsg}
+ eq(': ' .. exp_emsg, emsg:sub(-#exp_emsg - 2))
+ end)
+
it('has correct line_count when inserting and deleting', function()
eq(1, line_count())
set_lines(-1, -1, true, {'line'})
@@ -233,6 +283,59 @@ describe('buffer_* functions', function()
eq({'e', 'a', 'b', 'c', 'd'}, get_lines(0, -1, true))
end)
+ it("set_line on alternate buffer does not access invalid line (E315)", function()
+ feed_command('set hidden')
+ insert('Initial file')
+ command('enew')
+ insert([[
+ More
+ Lines
+ Than
+ In
+ The
+ Other
+ Buffer]])
+ feed_command('$')
+ local retval = exc_exec("call nvim_buf_set_lines(1, 0, 1, v:false, ['test'])")
+ eq(0, retval)
+ end)
+ end)
+
+ describe('get_offset', function()
+ local get_offset = curbufmeths.get_offset
+ it('works', function()
+ curbufmeths.set_lines(0,-1,true,{'Some\r','exa\000mple', '', 'buf\rfer', 'text'})
+ eq(5, curbufmeths.line_count())
+ eq(0, get_offset(0))
+ eq(6, get_offset(1))
+ eq(15, get_offset(2))
+ eq(16, get_offset(3))
+ eq(24, get_offset(4))
+ eq(29, get_offset(5))
+ eq({false,'Index out of bounds'}, meth_pcall(get_offset, 6))
+ eq({false,'Index out of bounds'}, meth_pcall(get_offset, -1))
+
+ curbufmeths.set_option('eol', false)
+ curbufmeths.set_option('fixeol', false)
+ eq(28, get_offset(5))
+
+ -- fileformat is ignored
+ curbufmeths.set_option('fileformat', 'dos')
+ eq(0, get_offset(0))
+ eq(6, get_offset(1))
+ eq(15, get_offset(2))
+ eq(16, get_offset(3))
+ eq(24, get_offset(4))
+ eq(28, get_offset(5))
+ curbufmeths.set_option('eol', true)
+ eq(29, get_offset(5))
+
+ command("set hidden")
+ command("enew")
+ eq(6, bufmeths.get_offset(1,1))
+ command("bunload! 1")
+ eq(-1, bufmeths.get_offset(1,1))
+ end)
end)
describe('{get,set,del}_var', function()
@@ -243,6 +346,39 @@ describe('buffer_* functions', function()
eq(1, funcs.exists('b:lua'))
curbufmeths.del_var('lua')
eq(0, funcs.exists('b:lua'))
+ eq({false, 'Key not found: lua'}, meth_pcall(curbufmeths.del_var, 'lua'))
+ curbufmeths.set_var('lua', 1)
+ command('lockvar b:lua')
+ eq({false, 'Key is locked: lua'}, meth_pcall(curbufmeths.del_var, 'lua'))
+ eq({false, 'Key is locked: lua'}, meth_pcall(curbufmeths.set_var, 'lua', 1))
+ eq({false, 'Key is read-only: changedtick'},
+ meth_pcall(curbufmeths.del_var, 'changedtick'))
+ eq({false, 'Key is read-only: changedtick'},
+ meth_pcall(curbufmeths.set_var, 'changedtick', 1))
+ end)
+ end)
+
+ describe('get_changedtick', function()
+ it('works', function()
+ eq(2, curbufmeths.get_changedtick())
+ curbufmeths.set_lines(0, 1, false, {'abc\0', '\0def', 'ghi'})
+ eq(3, curbufmeths.get_changedtick())
+ eq(3, curbufmeths.get_var('changedtick'))
+ end)
+
+ it('buffer_set_var returns the old value', function()
+ local val1 = {1, 2, {['3'] = 1}}
+ local val2 = {4, 7}
+ eq(NIL, request('buffer_set_var', 0, 'lua', val1))
+ eq(val1, request('buffer_set_var', 0, 'lua', val2))
+ end)
+
+ it('buffer_del_var returns the old value', function()
+ local val1 = {1, 2, {['3'] = 1}}
+ local val2 = {4, 7}
+ eq(NIL, request('buffer_set_var', 0, 'lua', val1))
+ eq(val1, request('buffer_set_var', 0, 'lua', val2))
+ eq(val2, request('buffer_del_var', 0, 'lua'))
end)
end)
@@ -274,10 +410,35 @@ describe('buffer_* functions', function()
end)
end)
+ describe('is_loaded', function()
+ it('works', function()
+ -- record our buffer number for when we unload it
+ local bufnr = curbuf('get_number')
+ -- api should report that the buffer is loaded
+ ok(buffer('is_loaded', bufnr))
+ -- hide the current buffer by switching to a new empty buffer
+ -- Careful! we need to modify the buffer first or vim will just reuse it
+ buffer('set_lines', bufnr, 0, -1, 1, {'line1'})
+ command('hide enew')
+ -- confirm the buffer is hidden, but still loaded
+ local infolist = nvim('eval', 'getbufinfo('..bufnr..')')
+ eq(1, #infolist)
+ eq(1, infolist[1].hidden)
+ eq(1, infolist[1].loaded)
+ -- now force unload the buffer
+ command('bunload! '..bufnr)
+ -- confirm the buffer is unloaded
+ infolist = nvim('eval', 'getbufinfo('..bufnr..')')
+ eq(0, infolist[1].loaded)
+ -- nvim_buf_is_loaded() should also report the buffer as unloaded
+ eq(false, buffer('is_loaded', bufnr))
+ end)
+ end)
+
describe('is_valid', function()
it('works', function()
nvim('command', 'new')
- local b = nvim('get_current_buffer')
+ local b = nvim('get_current_buf')
ok(buffer('is_valid', b))
nvim('command', 'bw!')
ok(not buffer('is_valid', b))
@@ -286,7 +447,7 @@ describe('buffer_* functions', function()
describe('get_mark', function()
it('works', function()
- curbuf('insert', -1, {'a', 'bit of', 'text'})
+ curbuf('set_lines', -1, -1, true, {'a', 'bit of', 'text'})
curwin('set_cursor', {3, 4})
nvim('command', 'mark V')
eq({3, 0}, curbuf('get_mark', 'V'))
diff --git a/test/functional/api/buffer_updates_spec.lua b/test/functional/api/buffer_updates_spec.lua
new file mode 100644
index 0000000000..b54d9e1f6e
--- /dev/null
+++ b/test/functional/api/buffer_updates_spec.lua
@@ -0,0 +1,838 @@
+local helpers = require('test.functional.helpers')(after_each)
+local clear = helpers.clear
+local eq, ok = helpers.eq, helpers.ok
+local buffer, command, eval, nvim, next_msg = helpers.buffer,
+ helpers.command, helpers.eval, helpers.nvim, helpers.next_msg
+local expect_err = helpers.expect_err
+local nvim_prog = helpers.nvim_prog
+local sleep = helpers.sleep
+local write_file = helpers.write_file
+
+local origlines = {"original line 1",
+ "original line 2",
+ "original line 3",
+ "original line 4",
+ "original line 5",
+ "original line 6"}
+
+local function expectn(name, args)
+ -- expect the next message to be the specified notification event
+ eq({'notification', name, args}, next_msg())
+end
+
+local function sendkeys(keys)
+ nvim('input', keys)
+ -- give nvim some time to process msgpack requests before possibly sending
+ -- more key presses - otherwise they all pile up in the queue and get
+ -- processed at once
+ local ntime = os.clock() + 0.1
+ repeat until os.clock() > ntime
+end
+
+local function open(activate, lines)
+ local filename = helpers.tmpname()
+ write_file(filename, table.concat(lines, "\n").."\n", true)
+ command('edit ' .. filename)
+ local b = nvim('get_current_buf')
+ -- what is the value of b:changedtick?
+ local tick = eval('b:changedtick')
+
+ -- Enable buffer events, ensure that the nvim_buf_lines_event messages
+ -- arrive as expected
+ if activate then
+ local firstline = 0
+ ok(buffer('attach', b, true, {}))
+ expectn('nvim_buf_lines_event', {b, tick, firstline, -1, lines, false})
+ end
+
+ return b, tick, filename
+end
+
+local function editoriginal(activate, lines)
+ if not lines then
+ lines = origlines
+ end
+ -- load up the file with the correct contents
+ clear()
+ return open(activate, lines)
+end
+
+local function reopen(buf, expectedlines)
+ ok(buffer('detach', buf))
+ expectn('nvim_buf_detach_event', {buf})
+ -- for some reason the :edit! increments tick by 2
+ command('edit!')
+ local tick = eval('b:changedtick')
+ ok(buffer('attach', buf, true, {}))
+ local firstline = 0
+ expectn('nvim_buf_lines_event', {buf, tick, firstline, -1, expectedlines, false})
+ command('normal! gg')
+ return tick
+end
+
+local function reopenwithfolds(b)
+ -- discard any changes to the buffer
+ local tick = reopen(b, origlines)
+
+ -- use markers for folds, make all folds open by default
+ command('setlocal foldmethod=marker foldlevel=20')
+
+ -- add a fold
+ command('2,4fold')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 1, 4, {'original line 2/*{{{*/',
+ 'original line 3',
+ 'original line 4/*}}}*/'}, false})
+ -- make a new fold that wraps lines 1-6
+ command('1,6fold')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 0, 6, {'original line 1/*{{{*/',
+ 'original line 2/*{{{*/',
+ 'original line 3',
+ 'original line 4/*}}}*/',
+ 'original line 5',
+ 'original line 6/*}}}*/'}, false})
+ return tick
+end
+
+describe('API: buffer events:', function()
+ it('when lines are added', function()
+ local b, tick = editoriginal(true)
+
+ -- add a new line at the start of the buffer
+ command('normal! GyyggP')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 0, 0, {'original line 6'}, false})
+
+ -- add multiple lines at the start of the file
+ command('normal! GkkyGggP')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 0, 0, {'original line 4',
+ 'original line 5',
+ 'original line 6'}, false})
+
+ -- add one line to the middle of the file, several times
+ command('normal! ggYjjp')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 3, 3, {'original line 4'}, false})
+ command('normal! p')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 4, 4, {'original line 4'}, false})
+ command('normal! p')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 5, 5, {'original line 4'}, false})
+
+ -- add multiple lines to the middle of the file
+ command('normal! gg4Yjjp')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 3, 3, {'original line 4',
+ 'original line 5',
+ 'original line 6',
+ 'original line 4'}, false})
+
+ -- add one line to the end of the file
+ command('normal! ggYGp')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 17, 17, {'original line 4'}, false})
+
+ -- add one line to the end of the file, several times
+ command('normal! ggYGppp')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 18, 18, {'original line 4'}, false})
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 19, 19, {'original line 4'}, false})
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 20, 20, {'original line 4'}, false})
+
+ -- add several lines to the end of the file, several times
+ command('normal! gg4YGp')
+ command('normal! Gp')
+ command('normal! Gp')
+ local firstfour = {'original line 4',
+ 'original line 5',
+ 'original line 6',
+ 'original line 4'}
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 21, 21, firstfour, false})
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 25, 25, firstfour, false})
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 29, 29, firstfour, false})
+
+ -- create a new empty buffer and wipe out the old one ... this will
+ -- turn off buffer events
+ command('enew!')
+ expectn('nvim_buf_detach_event', {b})
+
+ -- add a line at the start of an empty file
+ command('enew')
+ tick = eval('b:changedtick')
+ local b2 = nvim('get_current_buf')
+ ok(buffer('attach', b2, true, {}))
+ expectn('nvim_buf_lines_event', {b2, tick, 0, -1, {""}, false})
+ eval('append(0, ["new line 1"])')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b2, tick, 0, 0, {'new line 1'}, false})
+
+ -- turn off buffer events manually
+ buffer('detach', b2)
+ expectn('nvim_buf_detach_event', {b2})
+
+ -- add multiple lines to a blank file
+ command('enew!')
+ local b3 = nvim('get_current_buf')
+ ok(buffer('attach', b3, true, {}))
+ tick = eval('b:changedtick')
+ expectn('nvim_buf_lines_event', {b3, tick, 0, -1, {""}, false})
+ eval('append(0, ["new line 1", "new line 2", "new line 3"])')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b3, tick, 0, 0, {'new line 1',
+ 'new line 2',
+ 'new line 3'}, false})
+
+ -- use the API itself to add a line to the start of the buffer
+ buffer('set_lines', b3, 0, 0, true, {'New First Line'})
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b3, tick, 0, 0, {"New First Line"}, false})
+ end)
+
+ it('when lines are removed', function()
+ local b, tick = editoriginal(true)
+
+ -- remove one line from start of file
+ command('normal! dd')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 0, 1, {}, false})
+
+ -- remove multiple lines from the start of the file
+ command('normal! 4dd')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 0, 4, {}, false})
+
+ -- remove multiple lines from middle of file
+ tick = reopen(b, origlines)
+ command('normal! jj3dd')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 2, 5, {}, false})
+
+ -- remove one line from the end of the file
+ tick = reopen(b, origlines)
+ command('normal! Gdd')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 5, 6, {}, false})
+
+ -- remove multiple lines from the end of the file
+ tick = reopen(b, origlines)
+ command('normal! 4G3dd')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 3, 6, {}, false})
+
+ -- pretend to remove heaps lines from the end of the file but really
+ -- just remove two
+ tick = reopen(b, origlines)
+ command('normal! Gk5dd')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 4, 6, {}, false})
+ end)
+
+ it('when text is changed', function()
+ local b, tick = editoriginal(true)
+
+ -- some normal text editing
+ command('normal! A555')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 0, 1, {'original line 1555'}, false})
+ command('normal! jj8X')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 2, 3, {'origin3'}, false})
+
+ -- modify multiple lines at once using visual block mode
+ tick = reopen(b, origlines)
+ command('normal! jjw')
+ sendkeys('<C-v>jjllx')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event',
+ {b, tick, 2, 5, {'original e 3', 'original e 4', 'original e 5'}, false})
+
+ -- replace part of a line line using :s
+ tick = reopen(b, origlines)
+ command('3s/line 3/foo/')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 2, 3, {'original foo'}, false})
+
+ -- replace parts of several lines line using :s
+ tick = reopen(b, origlines)
+ command('%s/line [35]/foo/')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 2, 5, {'original foo',
+ 'original line 4',
+ 'original foo'}, false})
+
+ -- type text into the first line of a blank file, one character at a time
+ command('enew!')
+ tick = 2
+ expectn('nvim_buf_detach_event', {b})
+ local bnew = nvim('get_current_buf')
+ ok(buffer('attach', bnew, true, {}))
+ expectn('nvim_buf_lines_event', {bnew, tick, 0, -1, {''}, false})
+ sendkeys('i')
+ sendkeys('h')
+ sendkeys('e')
+ sendkeys('l')
+ sendkeys('l')
+ sendkeys('o\nworld')
+ expectn('nvim_buf_lines_event', {bnew, tick + 1, 0, 1, {'h'}, false})
+ expectn('nvim_buf_lines_event', {bnew, tick + 2, 0, 1, {'he'}, false})
+ expectn('nvim_buf_lines_event', {bnew, tick + 3, 0, 1, {'hel'}, false})
+ expectn('nvim_buf_lines_event', {bnew, tick + 4, 0, 1, {'hell'}, false})
+ expectn('nvim_buf_lines_event', {bnew, tick + 5, 0, 1, {'hello'}, false})
+ expectn('nvim_buf_lines_event', {bnew, tick + 6, 0, 1, {'hello', ''}, false})
+ expectn('nvim_buf_lines_event', {bnew, tick + 7, 1, 2, {'world'}, false})
+ end)
+
+ it('when lines are replaced', function()
+ local b, tick = editoriginal(true)
+
+ -- blast away parts of some lines with visual mode
+ command('normal! jjwvjjllx')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 2, 3, {'original '}, false})
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 3, 4, {}, false})
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 3, 4, {'e 5'}, false})
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 2, 3, {'original e 5'}, false})
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 3, 4, {}, false})
+
+ -- blast away a few lines using :g
+ tick = reopen(b, origlines)
+ command('global/line [35]/delete')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 2, 3, {}, false})
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 3, 4, {}, false})
+ end)
+
+ it('when lines are filtered', function()
+ -- Test filtering lines with !cat
+ local b, tick = editoriginal(true, {"A", "C", "E", "B", "D", "F"})
+
+ command('silent 2,5!cat')
+ -- the change comes through as two changes:
+ -- 1) addition of the new lines after the filtered lines
+ -- 2) removal of the original lines
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 5, 5, {"C", "E", "B", "D"}, false})
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 1, 5, {}, false})
+ end)
+
+ it('when you use "o"', function()
+ local b, tick = editoriginal(true, {'AAA', 'BBB'})
+ command('set noautoindent nosmartindent')
+
+ -- use 'o' to start a new line from a line with no indent
+ command('normal! o')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 1, 1, {""}, false})
+
+ -- undo the change, indent line 1 a bit, and try again
+ command('undo')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 1, 2, {}, false})
+ tick = tick + 1
+ expectn('nvim_buf_changedtick_event', {b, tick})
+ command('set autoindent')
+ command('normal! >>')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 0, 1, {"\tAAA"}, false})
+ command('normal! ommm')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 1, 1, {"\t"}, false})
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 1, 2, {"\tmmm"}, false})
+
+ -- undo the change, and try again with 'O'
+ command('undo')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 1, 2, {'\t'}, false})
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 1, 2, {}, false})
+ tick = tick + 1
+ expectn('nvim_buf_changedtick_event', {b, tick})
+ command('normal! ggOmmm')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 0, 0, {"\t"}, false})
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 0, 1, {"\tmmm"}, false})
+ end)
+
+ it('deactivates if the buffer is changed externally', function()
+ -- Test changing file from outside vim and reloading using :edit
+ local lines = {"Line 1", "Line 2"};
+ local b, tick, filename = editoriginal(true, lines)
+
+ command('normal! x')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 0, 1, {'ine 1'}, false})
+ command('undo')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 0, 1, {'Line 1'}, false})
+ tick = tick + 1
+ expectn('nvim_buf_changedtick_event', {b, tick})
+
+ -- change the file directly
+ write_file(filename, "another line\n", true, true)
+
+ -- reopen the file and watch buffer events shut down
+ command('edit')
+ expectn('nvim_buf_detach_event', {b})
+ end)
+
+ it('channel can watch many buffers at once', function()
+ -- edit 3 buffers, make sure they all have windows visible so that when we
+ -- move between buffers, none of them are unloaded
+ local b1, tick1 = editoriginal(true, {'A1', 'A2'})
+ local b1nr = eval('bufnr("")')
+ command('split')
+ local b2, tick2 = open(true, {'B1', 'B2'})
+ local b2nr = eval('bufnr("")')
+ command('split')
+ local b3, tick3 = open(true, {'C1', 'C2'})
+ local b3nr = eval('bufnr("")')
+
+ -- make a new window for moving between buffers
+ command('split')
+
+ command('b'..b1nr)
+ command('normal! x')
+ tick1 = tick1 + 1
+ expectn('nvim_buf_lines_event', {b1, tick1, 0, 1, {'1'}, false})
+ command('undo')
+ tick1 = tick1 + 1
+ expectn('nvim_buf_lines_event', {b1, tick1, 0, 1, {'A1'}, false})
+ tick1 = tick1 + 1
+ expectn('nvim_buf_changedtick_event', {b1, tick1})
+
+ command('b'..b2nr)
+ command('normal! x')
+ tick2 = tick2 + 1
+ expectn('nvim_buf_lines_event', {b2, tick2, 0, 1, {'1'}, false})
+ command('undo')
+ tick2 = tick2 + 1
+ expectn('nvim_buf_lines_event', {b2, tick2, 0, 1, {'B1'}, false})
+ tick2 = tick2 + 1
+ expectn('nvim_buf_changedtick_event', {b2, tick2})
+
+ command('b'..b3nr)
+ command('normal! x')
+ tick3 = tick3 + 1
+ expectn('nvim_buf_lines_event', {b3, tick3, 0, 1, {'1'}, false})
+ command('undo')
+ tick3 = tick3 + 1
+ expectn('nvim_buf_lines_event', {b3, tick3, 0, 1, {'C1'}, false})
+ tick3 = tick3 + 1
+ expectn('nvim_buf_changedtick_event', {b3, tick3})
+ end)
+
+ it('does not get confused if enabled/disabled many times', function()
+ local channel = nvim('get_api_info')[1]
+ local b, tick = editoriginal(false)
+
+ -- Enable buffer events many times.
+ ok(buffer('attach', b, true, {}))
+ ok(buffer('attach', b, true, {}))
+ ok(buffer('attach', b, true, {}))
+ ok(buffer('attach', b, true, {}))
+ ok(buffer('attach', b, true, {}))
+ expectn('nvim_buf_lines_event', {b, tick, 0, -1, origlines, false})
+ eval('rpcnotify('..channel..', "Hello There")')
+ expectn('Hello There', {})
+
+ -- Disable buffer events many times.
+ ok(buffer('detach', b))
+ ok(buffer('detach', b))
+ ok(buffer('detach', b))
+ ok(buffer('detach', b))
+ ok(buffer('detach', b))
+ expectn('nvim_buf_detach_event', {b})
+ eval('rpcnotify('..channel..', "Hello Again")')
+ expectn('Hello Again', {})
+ end)
+
+ it('can notify several channels at once', function()
+ clear()
+
+ -- create several new sessions, in addition to our main API
+ local sessions = {}
+ local pipe = helpers.new_pipename()
+ eval("serverstart('"..pipe.."')")
+ sessions[1] = helpers.connect(pipe)
+ sessions[2] = helpers.connect(pipe)
+ sessions[3] = helpers.connect(pipe)
+
+ local function request(sessionnr, method, ...)
+ local status, rv = sessions[sessionnr]:request(method, ...)
+ if not status then
+ error(rv[2])
+ end
+ return rv
+ end
+
+ local function wantn(sessionid, name, args)
+ local session = sessions[sessionid]
+ eq({'notification', name, args}, session:next_message(10000))
+ end
+
+ -- Edit a new file, but don't enable buffer events.
+ local lines = {'AAA', 'BBB'}
+ local b, tick = open(false, lines)
+
+ -- Enable buffer events for sessions 1, 2 and 3.
+ ok(request(1, 'nvim_buf_attach', b, true, {}))
+ ok(request(2, 'nvim_buf_attach', b, true, {}))
+ ok(request(3, 'nvim_buf_attach', b, true, {}))
+ wantn(1, 'nvim_buf_lines_event', {b, tick, 0, -1, lines, false})
+ wantn(2, 'nvim_buf_lines_event', {b, tick, 0, -1, lines, false})
+ wantn(3, 'nvim_buf_lines_event', {b, tick, 0, -1, lines, false})
+
+ -- Change the buffer.
+ command('normal! x')
+ tick = tick + 1
+ wantn(1, 'nvim_buf_lines_event', {b, tick, 0, 1, {'AA'}, false})
+ wantn(2, 'nvim_buf_lines_event', {b, tick, 0, 1, {'AA'}, false})
+ wantn(3, 'nvim_buf_lines_event', {b, tick, 0, 1, {'AA'}, false})
+
+ -- Stop watching on channel 1.
+ ok(request(1, 'nvim_buf_detach', b))
+ wantn(1, 'nvim_buf_detach_event', {b})
+
+ -- Undo the change to buffer 1.
+ command('undo')
+ tick = tick + 1
+ wantn(2, 'nvim_buf_lines_event', {b, tick, 0, 1, {'AAA'}, false})
+ wantn(3, 'nvim_buf_lines_event', {b, tick, 0, 1, {'AAA'}, false})
+ tick = tick + 1
+ wantn(2, 'nvim_buf_changedtick_event', {b, tick})
+ wantn(3, 'nvim_buf_changedtick_event', {b, tick})
+
+ -- make sure there are no other pending nvim_buf_lines_event messages going to
+ -- channel 1
+ local channel1 = request(1, 'nvim_get_api_info')[1]
+ eval('rpcnotify('..channel1..', "Hello")')
+ wantn(1, 'Hello', {})
+
+ -- close the buffer and channels 2 and 3 should get a nvim_buf_detach_event
+ -- notification
+ command('edit')
+ wantn(2, 'nvim_buf_detach_event', {b})
+ wantn(3, 'nvim_buf_detach_event', {b})
+
+ -- make sure there are no other pending nvim_buf_lines_event messages going to
+ -- channel 1
+ channel1 = request(1, 'nvim_get_api_info')[1]
+ eval('rpcnotify('..channel1..', "Hello Again")')
+ wantn(1, 'Hello Again', {})
+ end)
+
+ it('works with :diffput and :diffget', function()
+ local b1, tick1 = editoriginal(true, {"AAA", "BBB"})
+ local channel = nvim('get_api_info')[1]
+ command('diffthis')
+ command('rightbelow vsplit')
+ local b2, tick2 = open(true, {"BBB", "CCC"})
+ command('diffthis')
+ -- go back to first buffer, and push the 'AAA' line to the second buffer
+ command('1wincmd w')
+ command('normal! gg')
+ command('diffput')
+ tick2 = tick2 + 1
+ expectn('nvim_buf_lines_event', {b2, tick2, 0, 0, {"AAA"}, false})
+
+ -- use :diffget to grab the other change from buffer 2
+ command('normal! G')
+ command('diffget')
+ tick1 = tick1 + 1
+ expectn('nvim_buf_lines_event', {b1, tick1, 2, 2, {"CCC"}, false})
+
+ eval('rpcnotify('..channel..', "Goodbye")')
+ expectn('Goodbye', {})
+ end)
+
+ it('works with :sort', function()
+ -- test for :sort
+ local b, tick = editoriginal(true, {"B", "D", "C", "A", "E"})
+ command('%sort')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 0, 5, {"A", "B", "C", "D", "E"}, false})
+ end)
+
+ it('works with :left', function()
+ local b, tick = editoriginal(true, {" A", " B", "B", "\tB", "\t\tC"})
+ command('2,4left')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 1, 4, {"B", "B", "B"}, false})
+ end)
+
+ it('works with :right', function()
+ local b, tick = editoriginal(true, {" A",
+ "\t B",
+ "\t \tBB",
+ " \tB",
+ "\t\tC"})
+ command('set ts=2 et')
+ command('2,4retab')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 1, 4, {" B", " BB", " B"}, false})
+ end)
+
+ it('works with :move', function()
+ local b, tick = editoriginal(true, origlines)
+ -- move text down towards the end of the file
+ command('2,3move 4')
+ tick = tick + 2
+ expectn('nvim_buf_lines_event', {b, tick, 4, 4, {"original line 2",
+ "original line 3"}, false})
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 1, 3, {}, false})
+
+ -- move text up towards the start of the file
+ tick = reopen(b, origlines)
+ command('4,5move 2')
+ tick = tick + 2
+ expectn('nvim_buf_lines_event', {b, tick, 2, 2, {"original line 4",
+ "original line 5"}, false})
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 5, 7, {}, false})
+ end)
+
+ it('when you manually add/remove folds', function()
+ local b = editoriginal(true)
+ local tick = reopenwithfolds(b)
+
+ -- delete the inner fold
+ command('normal! zR3Gzd')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 1, 4, {'original line 2',
+ 'original line 3',
+ 'original line 4'}, false})
+ -- delete the outer fold
+ command('normal! zd')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 0, 6, origlines, false})
+
+ -- discard changes and put the folds back
+ tick = reopenwithfolds(b)
+
+ -- remove both folds at once
+ command('normal! ggzczD')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 0, 6, origlines, false})
+
+ -- discard changes and put the folds back
+ tick = reopenwithfolds(b)
+
+ -- now delete all folds at once
+ command('normal! zE')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 0, 6, origlines, false})
+
+ -- create a fold from line 4 to the end of the file
+ command('normal! 4GA/*{{{*/')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 3, 4, {'original line 4/*{{{*/'}, false})
+
+ -- delete the fold which only has one marker
+ command('normal! Gzd')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 3, 6, {'original line 4',
+ 'original line 5',
+ 'original line 6'}, false})
+ end)
+
+ it('detaches if the buffer is closed', function()
+ local b, tick = editoriginal(true, {'AAA'})
+ local channel = nvim('get_api_info')[1]
+
+ -- Test that buffer events are working.
+ command('normal! x')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 0, 1, {'AA'}, false})
+ command('undo')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 0, 1, {'AAA'}, false})
+ tick = tick + 1
+ expectn('nvim_buf_changedtick_event', {b, tick})
+
+ -- close our buffer by creating a new one
+ command('enew')
+ expectn('nvim_buf_detach_event', {b})
+
+ -- Reopen the original buffer, make sure there are no buffer events sent.
+ command('b1')
+ command('normal! x')
+
+ eval('rpcnotify('..channel..', "Hello There")')
+ expectn('Hello There', {})
+ end)
+
+ it('stays attached if the buffer is hidden', function()
+ local b, tick = editoriginal(true, {'AAA'})
+ local channel = nvim('get_api_info')[1]
+
+ -- Test that buffer events are working.
+ command('normal! x')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 0, 1, {'AA'}, false})
+ command('undo')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 0, 1, {'AAA'}, false})
+ tick = tick + 1
+ expectn('nvim_buf_changedtick_event', {b, tick})
+
+ -- Close our buffer by creating a new one.
+ command('set hidden')
+ command('enew')
+
+ -- Assert that no nvim_buf_detach_event is sent.
+ eval('rpcnotify('..channel..', "Hello There")')
+ expectn('Hello There', {})
+
+ -- Reopen the original buffer, assert that buffer events are still active.
+ command('b1')
+ command('normal! x')
+ tick = tick + 1
+ expectn('nvim_buf_lines_event', {b, tick, 0, 1, {'AA'}, false})
+ end)
+
+ it('detaches if the buffer is unloaded/deleted/wiped', function()
+ -- start with a blank nvim
+ clear()
+ -- need to make a new window with a buffer because :bunload doesn't let you
+ -- unload the last buffer
+ for _, cmd in ipairs({'bunload', 'bdelete', 'bwipeout'}) do
+ command('new')
+ -- open a brand spanking new file
+ local b = open(true, {'AAA'})
+
+ -- call :bunload or whatever the command is, and then check that we
+ -- receive a nvim_buf_detach_event
+ command(cmd)
+ expectn('nvim_buf_detach_event', {b})
+ end
+ end)
+
+ it('does not send the buffer content if not requested', function()
+ clear()
+ local b, tick = editoriginal(false)
+ ok(buffer('attach', b, false, {}))
+ expectn('nvim_buf_changedtick_event', {b, tick})
+ end)
+
+ it('returns a proper error on nonempty options dict', function()
+ clear()
+ local b = editoriginal(false)
+ expect_err("dict isn't empty", buffer, 'attach', b, false, {builtin="asfd"})
+ end)
+
+ it('nvim_buf_attach returns response after delay #8634', function()
+ clear()
+ sleep(250)
+ -- response
+ eq(true, helpers.request('nvim_buf_attach', 0, false, {}))
+ -- notification
+ eq({
+ [1] = 'notification',
+ [2] = 'nvim_buf_changedtick_event',
+ [3] = {
+ [1] = { id = 1 },
+ [2] = 2 }, }, next_msg())
+ end)
+end)
+
+describe('API: buffer events:', function()
+ before_each(function()
+ clear()
+ end)
+
+ local function lines_subset(first, second)
+ for i = 1,#first do
+ if first[i] ~= second[i] then
+ return false
+ end
+ end
+ return true
+ end
+
+ local function lines_equal(f, s)
+ return lines_subset(f, s) and lines_subset(s, f)
+ end
+
+ local function assert_match_somewhere(expected_lines, buffer_lines)
+ local msg = next_msg()
+
+ while(msg ~= nil) do
+ local event = msg[2]
+ if event == 'nvim_buf_lines_event' then
+ local args = msg[3]
+ local starts = args[3]
+ local newlines = args[5]
+
+ -- Size of the contained nvim instance is 23 lines, this might change
+ -- with the test setup. Note updates are continguous.
+ assert(#newlines <= 23)
+
+ for i = 1,#newlines do
+ buffer_lines[starts + i] = newlines[i]
+ end
+ -- we don't compare the msg area of the embedded nvim, it's too flakey
+ buffer_lines[23] = nil
+
+ if lines_equal(buffer_lines, expected_lines) then
+ -- OK
+ return
+ end
+ end
+ msg = next_msg()
+ end
+ assert(false, 'did not match/receive expected nvim_buf_lines_event lines')
+ end
+
+ it('when :terminal lines change', function()
+ local buffer_lines = {}
+ local expected_lines = {}
+ command('terminal "'..nvim_prog..'" -u NONE -i NONE -n -c "set shortmess+=A"')
+ local b = nvim('get_current_buf')
+ ok(buffer('attach', b, true, {}))
+
+ for _ = 1,22 do
+ table.insert(expected_lines,'~')
+ end
+ expected_lines[1] = ''
+ expected_lines[22] = ('tmp_terminal_nvim'..(' '):rep(45)
+ ..'0,0-1 All')
+
+ sendkeys('i:e tmp_terminal_nvim<Enter>')
+ assert_match_somewhere(expected_lines, buffer_lines)
+
+ expected_lines[1] = 'Blarg'
+ expected_lines[22] = ('tmp_terminal_nvim [+]'..(' '):rep(41)
+ ..'1,6 All')
+
+ sendkeys('iBlarg')
+ assert_match_somewhere(expected_lines, buffer_lines)
+
+ for i = 1,21 do
+ expected_lines[i] = 'xyz'
+ end
+ expected_lines[22] = ('tmp_terminal_nvim [+]'..(' '):rep(41)
+ ..'31,4 Bot')
+
+ local s = string.rep('\nxyz', 30)
+ sendkeys(s)
+ assert_match_somewhere(expected_lines, buffer_lines)
+ end)
+
+end)
diff --git a/test/functional/api/command_spec.lua b/test/functional/api/command_spec.lua
new file mode 100644
index 0000000000..b7520235b7
--- /dev/null
+++ b/test/functional/api/command_spec.lua
@@ -0,0 +1,80 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local NIL = helpers.NIL
+local clear = helpers.clear
+local command = helpers.command
+local curbufmeths = helpers.curbufmeths
+local eq = helpers.eq
+local expect_err = helpers.expect_err
+local meths = helpers.meths
+local source = helpers.source
+
+describe('nvim_get_commands', function()
+ local cmd_dict = { addr=NIL, bang=false, bar=false, complete=NIL, complete_arg=NIL, count=NIL, definition='echo "Hello World"', name='Hello', nargs='1', range=NIL, register=false, script_id=0, }
+ local cmd_dict2 = { addr=NIL, bang=false, bar=false, complete=NIL, complete_arg=NIL, count=NIL, definition='pwd', name='Pwd', nargs='?', range=NIL, register=false, script_id=0, }
+ before_each(clear)
+
+ it('gets empty list if no commands were defined', function()
+ eq({}, meths.get_commands({builtin=false}))
+ end)
+
+ it('validates input', function()
+ expect_err('builtin=true not implemented', meths.get_commands,
+ {builtin=true})
+ expect_err('unexpected key: foo', meths.get_commands,
+ {foo='blah'})
+ end)
+
+ it('gets global user-defined commands', function()
+ -- Define a command.
+ command('command -nargs=1 Hello echo "Hello World"')
+ eq({Hello=cmd_dict}, meths.get_commands({builtin=false}))
+ -- Define another command.
+ command('command -nargs=? Pwd pwd');
+ eq({Hello=cmd_dict, Pwd=cmd_dict2}, meths.get_commands({builtin=false}))
+ -- Delete a command.
+ command('delcommand Pwd')
+ eq({Hello=cmd_dict}, meths.get_commands({builtin=false}))
+ end)
+
+ it('gets buffer-local user-defined commands', function()
+ -- Define a buffer-local command.
+ command('command -buffer -nargs=1 Hello echo "Hello World"')
+ eq({Hello=cmd_dict}, curbufmeths.get_commands({builtin=false}))
+ -- Define another buffer-local command.
+ command('command -buffer -nargs=? Pwd pwd')
+ eq({Hello=cmd_dict, Pwd=cmd_dict2}, curbufmeths.get_commands({builtin=false}))
+ -- Delete a command.
+ command('delcommand Pwd')
+ eq({Hello=cmd_dict}, curbufmeths.get_commands({builtin=false}))
+
+ -- {builtin=true} always returns empty for buffer-local case.
+ eq({}, curbufmeths.get_commands({builtin=true}))
+ end)
+
+ it('gets various command attributes', function()
+ local cmd0 = { addr='arguments', bang=false, bar=false, complete='dir', complete_arg=NIL, count='10', definition='pwd <args>', name='TestCmd', nargs='0', range='10', register=false, script_id=0, }
+ local cmd1 = { addr=NIL, bang=false, bar=false, complete='custom', complete_arg='ListUsers', count=NIL, definition='!finger <args>', name='Finger', nargs='+', range=NIL, register=false, script_id=1, }
+ local cmd2 = { addr=NIL, bang=true, bar=false, complete=NIL, complete_arg=NIL, count=NIL, definition='call \128\253R2_foo(<q-args>)', name='Cmd2', nargs='*', range=NIL, register=false, script_id=2, }
+ local cmd3 = { addr=NIL, bang=false, bar=true, complete=NIL, complete_arg=NIL, count=NIL, definition='call \128\253R3_ohyeah()', name='Cmd3', nargs='0', range=NIL, register=false, script_id=3, }
+ local cmd4 = { addr=NIL, bang=false, bar=false, complete=NIL, complete_arg=NIL, count=NIL, definition='call \128\253R4_just_great()', name='Cmd4', nargs='0', range=NIL, register=true, script_id=4, }
+ source([[
+ command -complete=custom,ListUsers -nargs=+ Finger !finger <args>
+ ]])
+ eq({Finger=cmd1}, meths.get_commands({builtin=false}))
+ command('command -complete=dir -addr=arguments -count=10 TestCmd pwd <args>')
+ eq({Finger=cmd1, TestCmd=cmd0}, meths.get_commands({builtin=false}))
+
+ source([[
+ command -bang -nargs=* Cmd2 call <SID>foo(<q-args>)
+ ]])
+ source([[
+ command -bar -nargs=0 Cmd3 call <SID>ohyeah()
+ ]])
+ source([[
+ command -register Cmd4 call <SID>just_great()
+ ]])
+ -- TODO(justinmk): Order is stable but undefined. Sort before return?
+ eq({Cmd2=cmd2, Cmd3=cmd3, Cmd4=cmd4, Finger=cmd1, TestCmd=cmd0}, meths.get_commands({builtin=false}))
+ end)
+end)
diff --git a/test/functional/api/highlight_spec.lua b/test/functional/api/highlight_spec.lua
new file mode 100644
index 0000000000..76bf338d97
--- /dev/null
+++ b/test/functional/api/highlight_spec.lua
@@ -0,0 +1,112 @@
+local helpers = require('test.functional.helpers')(after_each)
+local clear, nvim = helpers.clear, helpers.nvim
+local Screen = require('test.functional.ui.screen')
+local eq, eval = helpers.eq, helpers.eval
+local command = helpers.command
+local meths = helpers.meths
+
+describe('API: highlight',function()
+ local expected_rgb = {
+ background = Screen.colors.Yellow,
+ foreground = Screen.colors.Red,
+ special = Screen.colors.Blue,
+ bold = true,
+ }
+ local expected_cterm = {
+ background = 10,
+ underline = true,
+ }
+ local expected_rgb2 = {
+ background = Screen.colors.Yellow,
+ foreground = Screen.colors.Red,
+ special = Screen.colors.Blue,
+ bold = true,
+ italic = true,
+ reverse = true,
+ undercurl = true,
+ underline = true,
+ }
+
+ before_each(function()
+ clear()
+ command("hi NewHighlight cterm=underline ctermbg=green guifg=red guibg=yellow guisp=blue gui=bold")
+ end)
+
+ it("nvim_get_hl_by_id", function()
+ local hl_id = eval("hlID('NewHighlight')")
+ eq(expected_cterm, nvim("get_hl_by_id", hl_id, false))
+
+ hl_id = eval("hlID('NewHighlight')")
+ -- Test valid id.
+ eq(expected_rgb, nvim("get_hl_by_id", hl_id, true))
+
+ -- Test invalid id.
+ local err, emsg = pcall(meths.get_hl_by_id, 30000, false)
+ eq(false, err)
+ eq('Invalid highlight id: 30000', string.match(emsg, 'Invalid.*'))
+
+ -- Test all highlight properties.
+ command('hi NewHighlight gui=underline,bold,undercurl,italic,reverse')
+ eq(expected_rgb2, nvim("get_hl_by_id", hl_id, true))
+
+ -- Test nil argument.
+ err, emsg = pcall(meths.get_hl_by_id, { nil }, false)
+ eq(false, err)
+ eq('Wrong type for argument 1, expecting Integer',
+ string.match(emsg, 'Wrong.*'))
+
+ -- Test 0 argument.
+ err, emsg = pcall(meths.get_hl_by_id, 0, false)
+ eq(false, err)
+ eq('Invalid highlight id: 0',
+ string.match(emsg, 'Invalid.*'))
+
+ -- Test -1 argument.
+ err, emsg = pcall(meths.get_hl_by_id, -1, false)
+ eq(false, err)
+ eq('Invalid highlight id: -1',
+ string.match(emsg, 'Invalid.*'))
+ end)
+
+ it("nvim_get_hl_by_name", function()
+ local expected_normal = { background = Screen.colors.Yellow,
+ foreground = Screen.colors.Red }
+
+ -- Test `Normal` default values.
+ eq({}, nvim("get_hl_by_name", 'Normal', true))
+
+ eq(expected_cterm, nvim("get_hl_by_name", 'NewHighlight', false))
+ eq(expected_rgb, nvim("get_hl_by_name", 'NewHighlight', true))
+
+ -- Test `Normal` modified values.
+ command('hi Normal guifg=red guibg=yellow')
+ eq(expected_normal, nvim("get_hl_by_name", 'Normal', true))
+
+ -- Test invalid name.
+ local err, emsg = pcall(meths.get_hl_by_name , 'unknown_highlight', false)
+ eq(false, err)
+ eq('Invalid highlight name: unknown_highlight',
+ string.match(emsg, 'Invalid.*'))
+
+ -- Test nil argument.
+ err, emsg = pcall(meths.get_hl_by_name , { nil }, false)
+ eq(false, err)
+ eq('Wrong type for argument 1, expecting String',
+ string.match(emsg, 'Wrong.*'))
+
+ -- Test empty string argument.
+ err, emsg = pcall(meths.get_hl_by_name , '', false)
+ eq(false, err)
+ eq('Invalid highlight name: ',
+ string.match(emsg, 'Invalid.*'))
+
+ -- Test "standout" attribute. #8054
+ eq({ underline = true, },
+ meths.get_hl_by_name('cursorline', 0));
+ command('hi CursorLine cterm=standout,underline term=standout,underline gui=standout,underline')
+ command('set cursorline')
+ eq({ underline = true, standout = true, },
+ meths.get_hl_by_name('cursorline', 0));
+
+ end)
+end)
diff --git a/test/functional/api/keymap_spec.lua b/test/functional/api/keymap_spec.lua
new file mode 100644
index 0000000000..f52372bee3
--- /dev/null
+++ b/test/functional/api/keymap_spec.lua
@@ -0,0 +1,310 @@
+local helpers = require('test.functional.helpers')(after_each)
+local global_helpers = require('test.helpers')
+
+local clear = helpers.clear
+local command = helpers.command
+local curbufmeths = helpers.curbufmeths
+local eq = helpers.eq
+local funcs = helpers.funcs
+local meths = helpers.meths
+local source = helpers.source
+
+local shallowcopy = global_helpers.shallowcopy
+
+describe('nvim_get_keymap', function()
+ before_each(clear)
+
+ -- Basic mapping and table to be used to describe results
+ local foo_bar_string = 'nnoremap foo bar'
+ local foo_bar_map_table = {
+ lhs='foo',
+ silent=0,
+ rhs='bar',
+ expr=0,
+ sid=0,
+ buffer=0,
+ nowait=0,
+ mode='n',
+ noremap=1,
+ }
+
+ it('returns empty list when no map', function()
+ eq({}, meths.get_keymap('n'))
+ end)
+
+ it('returns list of all applicable mappings', function()
+ command(foo_bar_string)
+ -- Only one mapping available
+ -- Should be the same as the dictionary we supplied earlier
+ -- and the dictionary you would get from maparg
+ -- since this is a global map, and not script local
+ eq({foo_bar_map_table}, meths.get_keymap('n'))
+ eq({funcs.maparg('foo', 'n', false, true)},
+ meths.get_keymap('n')
+ )
+
+ -- Add another mapping
+ command('nnoremap foo_longer bar_longer')
+ local foolong_bar_map_table = shallowcopy(foo_bar_map_table)
+ foolong_bar_map_table['lhs'] = 'foo_longer'
+ foolong_bar_map_table['rhs'] = 'bar_longer'
+
+ eq({foolong_bar_map_table, foo_bar_map_table},
+ meths.get_keymap('n')
+ )
+
+ -- Remove a mapping
+ command('unmap foo_longer')
+ eq({foo_bar_map_table},
+ meths.get_keymap('n')
+ )
+ end)
+
+ it('works for other modes', function()
+ -- Add two mappings, one in insert and one normal
+ -- We'll only check the insert mode one
+ command('nnoremap not_going to_check')
+
+ command('inoremap foo bar')
+ -- The table will be the same except for the mode
+ local insert_table = shallowcopy(foo_bar_map_table)
+ insert_table['mode'] = 'i'
+
+ eq({insert_table}, meths.get_keymap('i'))
+ end)
+
+ it('considers scope', function()
+ -- change the map slightly
+ command('nnoremap foo_longer bar_longer')
+ local foolong_bar_map_table = shallowcopy(foo_bar_map_table)
+ foolong_bar_map_table['lhs'] = 'foo_longer'
+ foolong_bar_map_table['rhs'] = 'bar_longer'
+
+ local buffer_table = shallowcopy(foo_bar_map_table)
+ buffer_table['buffer'] = 1
+
+ command('nnoremap <buffer> foo bar')
+
+ -- The buffer mapping should not show up
+ eq({foolong_bar_map_table}, meths.get_keymap('n'))
+ eq({buffer_table}, curbufmeths.get_keymap('n'))
+ end)
+
+ it('considers scope for overlapping maps', function()
+ command('nnoremap foo bar')
+
+ local buffer_table = shallowcopy(foo_bar_map_table)
+ buffer_table['buffer'] = 1
+
+ command('nnoremap <buffer> foo bar')
+
+ eq({foo_bar_map_table}, meths.get_keymap('n'))
+ eq({buffer_table}, curbufmeths.get_keymap('n'))
+ end)
+
+ it('can retrieve mapping for different buffers', function()
+ local original_buffer = curbufmeths.get_number()
+ -- Place something in each of the buffers to make sure they stick around
+ -- and set hidden so we can leave them
+ command('set hidden')
+ command('new')
+ command('normal! ihello 2')
+ command('new')
+ command('normal! ihello 3')
+
+ local final_buffer = curbufmeths.get_number()
+
+ command('nnoremap <buffer> foo bar')
+ -- Final buffer will have buffer mappings
+ local buffer_table = shallowcopy(foo_bar_map_table)
+ buffer_table['buffer'] = final_buffer
+ eq({buffer_table}, meths.buf_get_keymap(final_buffer, 'n'))
+ eq({buffer_table}, meths.buf_get_keymap(0, 'n'))
+
+ command('buffer ' .. original_buffer)
+ eq(original_buffer, curbufmeths.get_number())
+ -- Original buffer won't have any mappings
+ eq({}, meths.get_keymap('n'))
+ eq({}, curbufmeths.get_keymap('n'))
+ eq({buffer_table}, meths.buf_get_keymap(final_buffer, 'n'))
+ end)
+
+ -- Test toggle switches for basic options
+ -- @param option The key represented in the `maparg()` result dict
+ local function global_and_buffer_test(map,
+ option,
+ option_token,
+ global_on_result,
+ buffer_on_result,
+ global_off_result,
+ buffer_off_result,
+ new_windows)
+
+ local function make_new_windows(number_of_windows)
+ if new_windows == nil then
+ return nil
+ end
+
+ for _=1,number_of_windows do
+ command('new')
+ end
+ end
+
+ local mode = string.sub(map, 1,1)
+ -- Don't run this for the <buffer> mapping, since it doesn't make sense
+ if option_token ~= '<buffer>' then
+ it(string.format( 'returns %d for the key "%s" when %s is used globally with %s (%s)',
+ global_on_result, option, option_token, map, mode), function()
+ make_new_windows(new_windows)
+ command(map .. ' ' .. option_token .. ' foo bar')
+ local result = meths.get_keymap(mode)[1][option]
+ eq(global_on_result, result)
+ end)
+ end
+
+ it(string.format('returns %d for the key "%s" when %s is used for buffers with %s (%s)',
+ buffer_on_result, option, option_token, map, mode), function()
+ make_new_windows(new_windows)
+ command(map .. ' <buffer> ' .. option_token .. ' foo bar')
+ local result = curbufmeths.get_keymap(mode)[1][option]
+ eq(buffer_on_result, result)
+ end)
+
+ -- Don't run these for the <buffer> mapping, since it doesn't make sense
+ if option_token ~= '<buffer>' then
+ it(string.format('returns %d for the key "%s" when %s is not used globally with %s (%s)',
+ global_off_result, option, option_token, map, mode), function()
+ make_new_windows(new_windows)
+ command(map .. ' baz bat')
+ local result = meths.get_keymap(mode)[1][option]
+ eq(global_off_result, result)
+ end)
+
+ it(string.format('returns %d for the key "%s" when %s is not used for buffers with %s (%s)',
+ buffer_off_result, option, option_token, map, mode), function()
+ make_new_windows(new_windows)
+ command(map .. ' <buffer> foo bar')
+
+ local result = curbufmeths.get_keymap(mode)[1][option]
+ eq(buffer_off_result, result)
+ end)
+ end
+ end
+
+ -- Standard modes and returns the same values in the dictionary as maparg()
+ local mode_list = {'nnoremap', 'nmap', 'imap', 'inoremap', 'cnoremap'}
+ for mode in pairs(mode_list) do
+ global_and_buffer_test(mode_list[mode], 'silent', '<silent>', 1, 1, 0, 0)
+ global_and_buffer_test(mode_list[mode], 'nowait', '<nowait>', 1, 1, 0, 0)
+ global_and_buffer_test(mode_list[mode], 'expr', '<expr>', 1, 1, 0, 0)
+ end
+
+ -- noremap will now be 2 if script was used, which is not the same as maparg()
+ global_and_buffer_test('nmap', 'noremap', '<script>', 2, 2, 0, 0)
+ global_and_buffer_test('nnoremap', 'noremap', '<script>', 2, 2, 1, 1)
+
+ -- buffer will return the buffer ID, which is not the same as maparg()
+ -- Three of these tests won't run
+ global_and_buffer_test('nnoremap', 'buffer', '<buffer>', nil, 3, nil, nil, 2)
+
+ it('returns script numbers for global maps', function()
+ source([[
+ function! s:maparg_test_function() abort
+ return 'testing'
+ endfunction
+
+ nnoremap fizz :call <SID>maparg_test_function()<CR>
+ ]])
+ local sid_result = meths.get_keymap('n')[1]['sid']
+ eq(1, sid_result)
+ eq('testing', meths.call_function('<SNR>' .. sid_result .. '_maparg_test_function', {}))
+ end)
+
+ it('returns script numbers for buffer maps', function()
+ source([[
+ function! s:maparg_test_function() abort
+ return 'testing'
+ endfunction
+
+ nnoremap <buffer> fizz :call <SID>maparg_test_function()<CR>
+ ]])
+ local sid_result = curbufmeths.get_keymap('n')[1]['sid']
+ eq(1, sid_result)
+ eq('testing', meths.call_function('<SNR>' .. sid_result .. '_maparg_test_function', {}))
+ end)
+
+ it('works with <F12> and others', function()
+ command('nnoremap <F12> :let g:maparg_test_var = 1<CR>')
+ eq('<F12>', meths.get_keymap('n')[1]['lhs'])
+ eq(':let g:maparg_test_var = 1<CR>', meths.get_keymap('n')[1]['rhs'])
+ end)
+
+ it('works correctly despite various &cpo settings', function()
+ local cpo_table = {
+ silent=0,
+ expr=0,
+ sid=0,
+ buffer=0,
+ nowait=0,
+ noremap=1,
+ }
+ local function cpomap(lhs, rhs, mode)
+ local ret = shallowcopy(cpo_table)
+ ret.lhs = lhs
+ ret.rhs = rhs
+ ret.mode = mode
+ return ret
+ end
+
+ command('set cpo+=B')
+ command('nnoremap \\<C-a><C-a><LT>C-a>\\ \\<C-b><C-b><LT>C-b>\\')
+ command('nnoremap <special> \\<C-c><C-c><LT>C-c>\\ \\<C-d><C-d><LT>C-d>\\')
+
+ command('set cpo+=B')
+ command('xnoremap \\<C-a><C-a><LT>C-a>\\ \\<C-b><C-b><LT>C-b>\\')
+ command('xnoremap <special> \\<C-c><C-c><LT>C-c>\\ \\<C-d><C-d><LT>C-d>\\')
+
+ command('set cpo-=B')
+ command('snoremap \\<C-a><C-a><LT>C-a>\\ \\<C-b><C-b><LT>C-b>\\')
+ command('snoremap <special> \\<C-c><C-c><LT>C-c>\\ \\<C-d><C-d><LT>C-d>\\')
+
+ command('set cpo-=B')
+ command('onoremap \\<C-a><C-a><LT>C-a>\\ \\<C-b><C-b><LT>C-b>\\')
+ command('onoremap <special> \\<C-c><C-c><LT>C-c>\\ \\<C-d><C-d><LT>C-d>\\')
+
+ for _, cmd in ipairs({
+ 'set cpo-=B',
+ 'set cpo+=B',
+ }) do
+ command(cmd)
+ eq({cpomap('\\<C-C><C-C><lt>C-c>\\', '\\<C-D><C-D><lt>C-d>\\', 'n'),
+ cpomap('\\<C-A><C-A><lt>C-a>\\', '\\<C-B><C-B><lt>C-b>\\', 'n')},
+ meths.get_keymap('n'))
+ eq({cpomap('\\<C-C><C-C><lt>C-c>\\', '\\<C-D><C-D><lt>C-d>\\', 'x'),
+ cpomap('\\<C-A><C-A><lt>C-a>\\', '\\<C-B><C-B><lt>C-b>\\', 'x')},
+ meths.get_keymap('x'))
+ eq({cpomap('<lt>C-c><C-C><lt>C-c> ', '<lt>C-d><C-D><lt>C-d>', 's'),
+ cpomap('<lt>C-a><C-A><lt>C-a> ', '<lt>C-b><C-B><lt>C-b>', 's')},
+ meths.get_keymap('s'))
+ eq({cpomap('<lt>C-c><C-C><lt>C-c> ', '<lt>C-d><C-D><lt>C-d>', 'o'),
+ cpomap('<lt>C-a><C-A><lt>C-a> ', '<lt>C-b><C-B><lt>C-b>', 'o')},
+ meths.get_keymap('o'))
+ end
+ end)
+
+ it('always uses space for space and bar for bar', function()
+ local space_table = {
+ lhs='| |',
+ rhs='| |',
+ mode='n',
+ silent=0,
+ expr=0,
+ sid=0,
+ buffer=0,
+ nowait=0,
+ noremap=1,
+ }
+ command('nnoremap \\|<Char-0x20><Char-32><Space><Bar> \\|<Char-0x20><Char-32><Space> <Bar>')
+ eq({space_table}, meths.get_keymap('n'))
+ end)
+end)
diff --git a/test/functional/api/menu_spec.lua b/test/functional/api/menu_spec.lua
index d55b7b118a..2cfa0e3e47 100644
--- a/test/functional/api/menu_spec.lua
+++ b/test/functional/api/menu_spec.lua
@@ -20,15 +20,15 @@ describe("update_menu notification", function()
end)
local function expect_sent(expected)
- screen:wait(function()
+ screen:expect{condition=function()
if screen.update_menu ~= expected then
if expected then
- return 'update_menu was expected but not sent'
+ error('update_menu was expected but not sent')
else
- return 'update_menu was sent unexpectedly'
+ error('update_menu was sent unexpectedly')
end
end
- end)
+ end, unchanged=(not expected)}
end
it("should be sent when adding a menu", function()
diff --git a/test/functional/api/proc_spec.lua b/test/functional/api/proc_spec.lua
new file mode 100644
index 0000000000..d99c26b6c2
--- /dev/null
+++ b/test/functional/api/proc_spec.lua
@@ -0,0 +1,81 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local clear = helpers.clear
+local eq = helpers.eq
+local funcs = helpers.funcs
+local iswin = helpers.iswin
+local nvim_argv = helpers.nvim_argv
+local ok = helpers.ok
+local request = helpers.request
+local retry = helpers.retry
+local NIL = helpers.NIL
+
+describe('api', function()
+ before_each(clear)
+
+ describe('nvim_get_proc_children', function()
+ it('returns child process ids', function()
+ local this_pid = funcs.getpid()
+
+ local job1 = funcs.jobstart(nvim_argv)
+ retry(nil, nil, function()
+ eq(1, #request('nvim_get_proc_children', this_pid))
+ end)
+
+ local job2 = funcs.jobstart(nvim_argv)
+ retry(nil, nil, function()
+ eq(2, #request('nvim_get_proc_children', this_pid))
+ end)
+
+ funcs.jobstop(job1)
+ retry(nil, nil, function()
+ eq(1, #request('nvim_get_proc_children', this_pid))
+ end)
+
+ funcs.jobstop(job2)
+ retry(nil, nil, function()
+ eq(0, #request('nvim_get_proc_children', this_pid))
+ end)
+ end)
+
+ it('validates input', function()
+ local status, rv = pcall(request, "nvim_get_proc_children", -1)
+ eq(false, status)
+ eq("Invalid pid: -1", string.match(rv, "Invalid.*"))
+
+ status, rv = pcall(request, "nvim_get_proc_children", 0)
+ eq(false, status)
+ eq("Invalid pid: 0", string.match(rv, "Invalid.*"))
+
+ -- Assume PID 99999 does not exist.
+ status, rv = pcall(request, "nvim_get_proc_children", 99999)
+ eq(true, status)
+ eq({}, rv)
+ end)
+ end)
+
+ describe('nvim_get_proc', function()
+ it('returns process info', function()
+ local pid = funcs.getpid()
+ local pinfo = request('nvim_get_proc', pid)
+ eq((iswin() and 'nvim.exe' or 'nvim'), pinfo.name)
+ ok(pinfo.pid == pid)
+ ok(type(pinfo.ppid) == 'number' and pinfo.ppid ~= pid)
+ end)
+
+ it('validates input', function()
+ local status, rv = pcall(request, "nvim_get_proc", -1)
+ eq(false, status)
+ eq("Invalid pid: -1", string.match(rv, "Invalid.*"))
+
+ status, rv = pcall(request, "nvim_get_proc", 0)
+ eq(false, status)
+ eq("Invalid pid: 0", string.match(rv, "Invalid.*"))
+
+ -- Assume PID 99999 does not exist.
+ status, rv = pcall(request, "nvim_get_proc", 99999)
+ eq(true, status)
+ eq(NIL, rv)
+ end)
+ end)
+end)
diff --git a/test/functional/api/rpc_fixture.lua b/test/functional/api/rpc_fixture.lua
new file mode 100644
index 0000000000..e885a525af
--- /dev/null
+++ b/test/functional/api/rpc_fixture.lua
@@ -0,0 +1,38 @@
+local deps_prefix = './.deps/usr'
+if os.getenv('DEPS_PREFIX') then
+ deps_prefix = os.getenv('DEPS_PREFIX')
+end
+
+package.path = deps_prefix .. '/share/lua/5.1/?.lua;' ..
+ deps_prefix .. '/share/lua/5.1/?/init.lua;' ..
+ package.path
+
+package.cpath = deps_prefix .. '/lib/lua/5.1/?.so;' ..
+ package.cpath
+
+local mpack = require('mpack')
+local StdioStream = require('nvim.stdio_stream')
+local Session = require('nvim.session')
+
+local stdio_stream = StdioStream.open()
+local session = Session.new(stdio_stream)
+
+local function on_request(method, args)
+ if method == 'poll' then
+ return 'ok'
+ elseif method == 'write_stderr' then
+ io.stderr:write(args[1])
+ return "done!"
+ elseif method == "exit" then
+ session:stop()
+ return mpack.NIL
+ end
+end
+
+local function on_notification(event, args)
+ if event == 'ping' and #args == 0 then
+ session:notify("nvim_eval", "rpcnotify(g:channel, 'pong')")
+ end
+end
+
+session:run(on_request, on_notification)
diff --git a/test/functional/api/server_notifications_spec.lua b/test/functional/api/server_notifications_spec.lua
index 88e8c60560..29cd38ef0d 100644
--- a/test/functional/api/server_notifications_spec.lua
+++ b/test/functional/api/server_notifications_spec.lua
@@ -1,8 +1,7 @@
--- Tests for nvim notifications
local helpers = require('test.functional.helpers')(after_each)
-local eq, clear, eval, execute, nvim, next_message =
- helpers.eq, helpers.clear, helpers.eval, helpers.execute, helpers.nvim,
- helpers.next_message
+local eq, clear, eval, command, nvim, next_msg =
+ helpers.eq, helpers.clear, helpers.eval, helpers.command, helpers.nvim,
+ helpers.next_msg
local meths = helpers.meths
describe('notify', function()
@@ -16,10 +15,10 @@ describe('notify', function()
describe('passing a valid channel id', function()
it('sends the notification/args to the corresponding channel', function()
eval('rpcnotify('..channel..', "test-event", 1, 2, 3)')
- eq({'notification', 'test-event', {1, 2, 3}}, next_message())
- execute('au FileType lua call rpcnotify('..channel..', "lua!")')
- execute('set filetype=lua')
- eq({'notification', 'lua!', {}}, next_message())
+ eq({'notification', 'test-event', {1, 2, 3}}, next_msg())
+ command('au FileType lua call rpcnotify('..channel..', "lua!")')
+ command('set filetype=lua')
+ eq({'notification', 'lua!', {}}, next_msg())
end)
end)
@@ -29,13 +28,13 @@ describe('notify', function()
eval('rpcnotify(0, "event1", 1, 2, 3)')
eval('rpcnotify(0, "event2", 4, 5, 6)')
eval('rpcnotify(0, "event2", 7, 8, 9)')
- eq({'notification', 'event2', {4, 5, 6}}, next_message())
- eq({'notification', 'event2', {7, 8, 9}}, next_message())
+ eq({'notification', 'event2', {4, 5, 6}}, next_msg())
+ eq({'notification', 'event2', {7, 8, 9}}, next_msg())
nvim('unsubscribe', 'event2')
nvim('subscribe', 'event1')
eval('rpcnotify(0, "event2", 10, 11, 12)')
eval('rpcnotify(0, "event1", 13, 14, 15)')
- eq({'notification', 'event1', {13, 14, 15}}, next_message())
+ eq({'notification', 'event1', {13, 14, 15}}, next_msg())
end)
it('does not crash for deeply nested variable', function()
@@ -43,7 +42,7 @@ describe('notify', function()
local nest_level = 1000
meths.command(('call map(range(%u), "extend(g:, {\'l\': [g:l]})")'):format(nest_level - 1))
eval('rpcnotify('..channel..', "event", g:l)')
- local msg = next_message()
+ local msg = next_msg()
eq('notification', msg[1])
eq('event', msg[2])
local act_ret = msg[3]
@@ -66,4 +65,11 @@ describe('notify', function()
eq(nest_level, act_nest_level)
end)
end)
+
+ it('unsubscribe non-existing event #8745', function()
+ nvim('subscribe', 'event1')
+ nvim('unsubscribe', 'doesnotexist')
+ nvim('unsubscribe', 'event1')
+ eq(2, eval('1+1')) -- Still alive?
+ end)
end)
diff --git a/test/functional/api/server_requests_spec.lua b/test/functional/api/server_requests_spec.lua
index 54095112fb..4d25ba0819 100644
--- a/test/functional/api/server_requests_spec.lua
+++ b/test/functional/api/server_requests_spec.lua
@@ -1,11 +1,17 @@
--- Tests for some server->client RPC scenarios. Note that unlike with
--- `rpcnotify`, to evaluate `rpcrequest` calls we need the client event loop to
--- be running.
+-- Test server -> client RPC scenarios. Note: unlike `rpcnotify`, to evaluate
+-- `rpcrequest` calls we need the client event loop to be running.
local helpers = require('test.functional.helpers')(after_each)
+local Paths = require('test.config.paths')
+
local clear, nvim, eval = helpers.clear, helpers.nvim, helpers.eval
local eq, neq, run, stop = helpers.eq, helpers.neq, helpers.run, helpers.stop
-local nvim_prog = helpers.nvim_prog
-
+local nvim_prog, command, funcs = helpers.nvim_prog, helpers.command, helpers.funcs
+local source, next_msg = helpers.source, helpers.next_msg
+local ok = helpers.ok
+local meths = helpers.meths
+local spawn, merge_args = helpers.spawn, helpers.merge_args
+local set_session = helpers.set_session
+local expect_err = helpers.expect_err
describe('server -> client', function()
local cid
@@ -15,6 +21,22 @@ describe('server -> client', function()
cid = nvim('get_api_info')[1]
end)
+ it('handles unexpected closed stream while preparing RPC response', function()
+ source([[
+ let g:_nvim_args = [v:progpath, '--embed', '--headless', '-n', '-u', 'NONE', '-i', 'NONE', ]
+ let ch1 = jobstart(g:_nvim_args, {'rpc': v:true})
+ let child1_ch = rpcrequest(ch1, "nvim_get_api_info")[0]
+ call rpcnotify(ch1, 'nvim_eval', 'rpcrequest('.child1_ch.', "nvim_get_api_info")')
+
+ let ch2 = jobstart(g:_nvim_args, {'rpc': v:true})
+ let child2_ch = rpcrequest(ch2, "nvim_get_api_info")[0]
+ call rpcnotify(ch2, 'nvim_eval', 'rpcrequest('.child2_ch.', "nvim_get_api_info")')
+
+ call jobstop(ch1)
+ ]])
+ eq(2, eval("1+1")) -- Still alive?
+ end)
+
describe('simple call', function()
it('works', function()
local function on_setup()
@@ -88,7 +110,28 @@ describe('server -> client', function()
end)
describe('requests and notifications interleaved', function()
- -- This tests that the following scenario won't happen:
+ it('does not delay notifications during pending request', function()
+ local received = false
+ local function on_setup()
+ eq("retval", funcs.rpcrequest(cid, "doit"))
+ stop()
+ end
+ local function on_request(method)
+ if method == "doit" then
+ funcs.rpcnotify(cid, "headsup")
+ eq(true,received)
+ return "retval"
+ end
+ end
+ local function on_notification(method)
+ if method == "headsup" then
+ received = true
+ end
+ end
+ run(on_request, on_notification, on_setup)
+ end)
+
+ -- This tests the following scenario:
--
-- server->client [request ] (1)
-- client->server [request ] (2) triggered by (1)
@@ -103,48 +146,56 @@ describe('server -> client', function()
-- only deals with one server->client request at a time. (In other words,
-- the client cannot send a response to a request that is not at the top
-- of nvim's request stack).
- --
- -- But above scenario shoudn't happen by the way notifications are dealt in
- -- Nvim: they are only sent after there are no pending server->client
- -- request(the request stack fully unwinds). So (3) is only sent after the
- -- client returns (6).
- it('works', function()
- local expected = 300
- local notified = 0
+ pending('will close connection if not properly synchronized', function()
local function on_setup()
eq('notified!', eval('rpcrequest('..cid..', "notify")'))
end
local function on_request(method)
- eq('notify', method)
- eq(1, eval('rpcnotify('..cid..', "notification")'))
- return 'notified!'
+ if method == "notify" then
+ eq(1, eval('rpcnotify('..cid..', "notification")'))
+ return 'notified!'
+ elseif method == "nested" then
+ -- do some busywork, so the first request will return
+ -- before this one
+ for _ = 1, 5 do
+ eq(2, eval("1+1"))
+ end
+ eq(1, eval('rpcnotify('..cid..', "nested_done")'))
+ return 'done!'
+ end
end
local function on_notification(method)
- eq('notification', method)
- if notified == expected then
- stop()
- return
+ if method == "notification" then
+ eq('done!', eval('rpcrequest('..cid..', "nested")'))
+ elseif method == "nested_done" then
+ -- this should never have been sent
+ ok(false)
end
- notified = notified + 1
- eq('notified!', eval('rpcrequest('..cid..', "notify")'))
end
run(on_request, on_notification, on_setup)
- eq(expected, notified)
+ -- ignore disconnect failure, otherwise detected by after_each
+ clear()
end)
end)
- describe('when the client is a recursive vim instance', function()
+ describe('recursive (child) nvim client', function()
+ if os.getenv("TRAVIS") and helpers.os_name() == "osx" then
+ -- XXX: Hangs Travis macOS since e9061117a5b8f195c3f26a5cb94e18ddd7752d86.
+ pending("[Hangs on Travis macOS. #5002]", function() end)
+ return
+ end
+
before_each(function()
- nvim('command', "let vim = rpcstart('"..nvim_prog.."', ['-u', 'NONE', '-i', 'NONE', '--cmd', 'set noswapfile', '--embed'])")
+ command("let vim = rpcstart('"..nvim_prog.."', ['-u', 'NONE', '-i', 'NONE', '--cmd', 'set noswapfile', '--embed', '--headless'])")
neq(0, eval('vim'))
end)
- after_each(function() nvim('command', 'call rpcstop(vim)') end)
+ after_each(function() command('call rpcstop(vim)') end)
- it('can send/recieve notifications and make requests', function()
+ it('can send/receive notifications and make requests', function()
nvim('command', "call rpcnotify(vim, 'vim_set_current_line', 'SOME TEXT')")
-- Wait for the notification to complete.
@@ -154,11 +205,12 @@ describe('server -> client', function()
end)
it('can communicate buffers, tabpages, and windows', function()
- eq({3}, eval("rpcrequest(vim, 'vim_get_tabpages')"))
- eq({1}, eval("rpcrequest(vim, 'vim_get_windows')"))
+ eq({1}, eval("rpcrequest(vim, 'nvim_list_tabpages')"))
+ -- Window IDs start at 1000 (LOWEST_WIN_ID in vim.h)
+ eq({1000}, eval("rpcrequest(vim, 'nvim_list_wins')"))
- local buf = eval("rpcrequest(vim, 'vim_get_buffers')")[1]
- eq(2, buf)
+ local buf = eval("rpcrequest(vim, 'nvim_list_bufs')")[1]
+ eq(1, buf)
eval("rpcnotify(vim, 'buffer_set_line', "..buf..", 0, 'SOME TEXT')")
nvim('command', "call rpcrequest(vim, 'vim_eval', '0')") -- wait
@@ -170,9 +222,142 @@ describe('server -> client', function()
end)
it('returns an error if the request failed', function()
- local status, err = pcall(eval, "rpcrequest(vim, 'does-not-exist')")
- eq(false, status)
- eq(true, string.match(err, ': (.*)') == 'Failed to evaluate expression')
+ expect_err('Vim:Invalid method: does%-not%-exist',
+ eval, "rpcrequest(vim, 'does-not-exist')")
+ end)
+ end)
+
+ describe('jobstart()', function()
+ local jobid
+ before_each(function()
+ local channel = nvim('get_api_info')[1]
+ nvim('set_var', 'channel', channel)
+ source([[
+ function! s:OnEvent(id, data, event)
+ call rpcnotify(g:channel, a:event, 0, a:data)
+ endfunction
+ let g:job_opts = {
+ \ 'on_stderr': function('s:OnEvent'),
+ \ 'on_exit': function('s:OnEvent'),
+ \ 'user': 0,
+ \ 'rpc': v:true
+ \ }
+ ]])
+ local lua_prog = Paths.test_lua_prg
+ meths.set_var("args", {lua_prog, 'test/functional/api/rpc_fixture.lua'})
+ jobid = eval("jobstart(g:args, g:job_opts)")
+ neq(0, 'jobid')
+ end)
+
+ after_each(function()
+ pcall(funcs.jobstop, jobid)
+ end)
+
+ if helpers.pending_win32(pending) then return end
+
+ it('rpc and text stderr can be combined', function()
+ eq("ok",funcs.rpcrequest(jobid, "poll"))
+ funcs.rpcnotify(jobid, "ping")
+ eq({'notification', 'pong', {}}, next_msg())
+ eq("done!",funcs.rpcrequest(jobid, "write_stderr", "fluff\n"))
+ eq({'notification', 'stderr', {0, {'fluff', ''}}}, next_msg())
+ pcall(funcs.rpcrequest, jobid, "exit")
+ eq({'notification', 'stderr', {0, {''}}}, next_msg())
+ eq({'notification', 'exit', {0, 0}}, next_msg())
+ end)
+ end)
+
+ describe('connecting to another (peer) nvim', function()
+ local nvim_argv = merge_args(helpers.nvim_argv, {'--headless'})
+ local function connect_test(server, mode, address)
+ local serverpid = funcs.getpid()
+ local client = spawn(nvim_argv)
+ set_session(client, true)
+ local clientpid = funcs.getpid()
+ neq(serverpid, clientpid)
+ local id = funcs.sockconnect(mode, address, {rpc=true})
+ ok(id > 0)
+
+ funcs.rpcrequest(id, 'nvim_set_current_line', 'hello')
+ local client_id = funcs.rpcrequest(id, 'nvim_get_api_info')[1]
+
+ set_session(server, true)
+ eq(serverpid, funcs.getpid())
+ eq('hello', meths.get_current_line())
+
+ -- method calls work both ways
+ funcs.rpcrequest(client_id, 'nvim_set_current_line', 'howdy!')
+ eq(id, funcs.rpcrequest(client_id, 'nvim_get_api_info')[1])
+
+ set_session(client, true)
+ eq(clientpid, funcs.getpid())
+ eq('howdy!', meths.get_current_line())
+
+ server:close()
+ client:close()
+ end
+
+ it('via named pipe', function()
+ local server = spawn(nvim_argv)
+ set_session(server)
+ local address = funcs.serverlist()[1]
+ local first = string.sub(address,1,1)
+ ok(first == '/' or first == '\\')
+ connect_test(server, 'pipe', address)
+ end)
+
+ it('via ipv4 address', function()
+ local server = spawn(nvim_argv)
+ set_session(server)
+ local status, address = pcall(funcs.serverstart, "127.0.0.1:")
+ if not status then
+ pending('no ipv4 stack', function() end)
+ return
+ end
+ eq('127.0.0.1:', string.sub(address,1,10))
+ connect_test(server, 'tcp', address)
+ end)
+
+ it('via ipv6 address', function()
+ local server = spawn(nvim_argv)
+ set_session(server)
+ local status, address = pcall(funcs.serverstart, '::1:')
+ if not status then
+ pending('no ipv6 stack', function() end)
+ return
+ end
+ eq('::1:', string.sub(address,1,4))
+ connect_test(server, 'tcp', address)
+ end)
+
+ it('via hostname', function()
+ local server = spawn(nvim_argv)
+ set_session(server)
+ local address = funcs.serverstart("localhost:")
+ eq('localhost:', string.sub(address,1,10))
+ connect_test(server, 'tcp', address)
+ end)
+ end)
+
+ describe('connecting to its own pipe address', function()
+ it('does not deadlock', function()
+ if not os.getenv("TRAVIS") and helpers.os_name() == "osx" then
+ -- It does, in fact, deadlock on QuickBuild. #6851
+ pending("deadlocks on QuickBuild", function() end)
+ return
+ end
+ local address = funcs.serverlist()[1]
+ local first = string.sub(address,1,1)
+ ok(first == '/' or first == '\\')
+ local serverpid = funcs.getpid()
+
+ local id = funcs.sockconnect('pipe', address, {rpc=true})
+
+ funcs.rpcrequest(id, 'nvim_set_current_line', 'hello')
+ eq('hello', meths.get_current_line())
+ eq(serverpid, funcs.rpcrequest(id, "nvim_eval", "getpid()"))
+
+ eq(id, funcs.rpcrequest(id, 'nvim_get_api_info')[1])
end)
end)
end)
diff --git a/test/functional/api/tabpage_spec.lua b/test/functional/api/tabpage_spec.lua
index 7b97c7f067..c49091db02 100644
--- a/test/functional/api/tabpage_spec.lua
+++ b/test/functional/api/tabpage_spec.lua
@@ -1,25 +1,28 @@
--- Sanity checks for tabpage_* API calls via msgpack-rpc
local helpers = require('test.functional.helpers')(after_each)
local clear, nvim, tabpage, curtab, eq, ok =
helpers.clear, helpers.nvim, helpers.tabpage, helpers.curtab, helpers.eq,
helpers.ok
local curtabmeths = helpers.curtabmeths
local funcs = helpers.funcs
+local request = helpers.request
+local NIL = helpers.NIL
+local meth_pcall = helpers.meth_pcall
+local command = helpers.command
-describe('tabpage_* functions', function()
+describe('api/tabpage', function()
before_each(clear)
- describe('get_windows and get_window', function()
+ describe('list_wins and get_win', function()
it('works', function()
nvim('command', 'tabnew')
nvim('command', 'vsplit')
- local tab1, tab2 = unpack(nvim('get_tabpages'))
- local win1, win2, win3 = unpack(nvim('get_windows'))
- eq({win1}, tabpage('get_windows', tab1))
- eq({win2, win3}, tabpage('get_windows', tab2))
- eq(win2, tabpage('get_window', tab2))
- nvim('set_current_window', win3)
- eq(win3, tabpage('get_window', tab2))
+ local tab1, tab2 = unpack(nvim('list_tabpages'))
+ local win1, win2, win3 = unpack(nvim('list_wins'))
+ eq({win1}, tabpage('list_wins', tab1))
+ eq({win2, win3}, tabpage('list_wins', tab2))
+ eq(win2, tabpage('get_win', tab2))
+ nvim('set_current_win', win3)
+ eq(win3, tabpage('get_win', tab2))
end)
end)
@@ -31,13 +34,49 @@ describe('tabpage_* functions', function()
eq(1, funcs.exists('t:lua'))
curtabmeths.del_var('lua')
eq(0, funcs.exists('t:lua'))
+ eq({false, 'Key not found: lua'}, meth_pcall(curtabmeths.del_var, 'lua'))
+ curtabmeths.set_var('lua', 1)
+ command('lockvar t:lua')
+ eq({false, 'Key is locked: lua'}, meth_pcall(curtabmeths.del_var, 'lua'))
+ eq({false, 'Key is locked: lua'}, meth_pcall(curtabmeths.set_var, 'lua', 1))
+ end)
+
+ it('tabpage_set_var returns the old value', function()
+ local val1 = {1, 2, {['3'] = 1}}
+ local val2 = {4, 7}
+ eq(NIL, request('tabpage_set_var', 0, 'lua', val1))
+ eq(val1, request('tabpage_set_var', 0, 'lua', val2))
+ end)
+
+ it('tabpage_del_var returns the old value', function()
+ local val1 = {1, 2, {['3'] = 1}}
+ local val2 = {4, 7}
+ eq(NIL, request('tabpage_set_var', 0, 'lua', val1))
+ eq(val1, request('tabpage_set_var', 0, 'lua', val2))
+ eq(val2, request('tabpage_del_var', 0, 'lua'))
+ end)
+ end)
+
+ describe('get_number', function()
+ it('works', function()
+ local tabs = nvim('list_tabpages')
+ eq(1, tabpage('get_number', tabs[1]))
+
+ nvim('command', 'tabnew')
+ local tab1, tab2 = unpack(nvim('list_tabpages'))
+ eq(1, tabpage('get_number', tab1))
+ eq(2, tabpage('get_number', tab2))
+
+ nvim('command', '-tabmove')
+ eq(2, tabpage('get_number', tab1))
+ eq(1, tabpage('get_number', tab2))
end)
end)
describe('is_valid', function()
it('works', function()
nvim('command', 'tabnew')
- local tab = nvim('get_tabpages')[2]
+ local tab = nvim('list_tabpages')[2]
nvim('set_current_tabpage', tab)
ok(tabpage('is_valid', tab))
nvim('command', 'tabclose')
diff --git a/test/functional/api/ui_spec.lua b/test/functional/api/ui_spec.lua
new file mode 100644
index 0000000000..b028a50b02
--- /dev/null
+++ b/test/functional/api/ui_spec.lua
@@ -0,0 +1,37 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+local clear = helpers.clear
+local eq = helpers.eq
+local eval = helpers.eval
+local expect_err = helpers.expect_err
+local meths = helpers.meths
+local request = helpers.request
+
+describe('nvim_ui_attach()', function()
+ before_each(function()
+ clear()
+ end)
+ it('handles very large width/height #2180', function()
+ local screen = Screen.new(999, 999)
+ screen:attach()
+ eq(999, eval('&lines'))
+ eq(999, eval('&columns'))
+ end)
+ it('invalid option returns error', function()
+ expect_err('No such UI option: foo',
+ meths.ui_attach, 80, 24, { foo={'foo'} })
+ end)
+ it('validates channel arg', function()
+ expect_err('UI not attached to channel: 1',
+ request, 'nvim_ui_try_resize', 40, 10)
+ expect_err('UI not attached to channel: 1',
+ request, 'nvim_ui_set_option', 'rgb', true)
+ expect_err('UI not attached to channel: 1',
+ request, 'nvim_ui_detach')
+
+ local screen = Screen.new()
+ screen:attach({rgb=false})
+ expect_err('UI already attached to channel: 1',
+ request, 'nvim_ui_attach', 40, 10, { rgb=false })
+ end)
+end)
diff --git a/test/functional/api/version_spec.lua b/test/functional/api/version_spec.lua
new file mode 100644
index 0000000000..bf67d4788b
--- /dev/null
+++ b/test/functional/api/version_spec.lua
@@ -0,0 +1,223 @@
+local helpers = require('test.functional.helpers')(after_each)
+local mpack = require('mpack')
+local clear, funcs, eq = helpers.clear, helpers.funcs, helpers.eq
+local call = helpers.call
+local meths = helpers.meths
+
+local function read_mpack_file(fname)
+ local fd = io.open(fname, 'rb')
+ if fd == nil then
+ return nil
+ end
+
+ local data = fd:read('*a')
+ fd:close()
+ local unpack = mpack.Unpacker()
+ return unpack(data)
+end
+
+describe("api_info()['version']", function()
+ before_each(clear)
+
+ it("returns API level", function()
+ local version = call('api_info')['version']
+ local current = version['api_level']
+ local compat = version['api_compatible']
+ eq("number", type(current))
+ eq("number", type(compat))
+ assert(current >= compat)
+ end)
+
+ it("returns Nvim version", function()
+ local version = call('api_info')['version']
+ local major = version['major']
+ local minor = version['minor']
+ local patch = version['patch']
+ eq("number", type(major))
+ eq("number", type(minor))
+ eq("number", type(patch))
+ eq(1, funcs.has("nvim-"..major.."."..minor.."."..patch))
+ eq(0, funcs.has("nvim-"..major.."."..minor.."."..(patch + 1)))
+ eq(0, funcs.has("nvim-"..major.."."..(minor + 1).."."..patch))
+ eq(0, funcs.has("nvim-"..(major + 1).."."..minor.."."..patch))
+ end)
+end)
+
+
+describe("api metadata", function()
+ before_each(clear)
+
+ local function name_table(entries)
+ local by_name = {}
+ for _,e in ipairs(entries) do
+ by_name[e.name] = e
+ end
+ return by_name
+ end
+
+ -- Remove metadata that is not essential to backwards-compatibility.
+ local function filter_function_metadata(f)
+ f.deprecated_since = nil
+ for idx, _ in ipairs(f.parameters) do
+ f.parameters[idx][2] = '' -- Remove parameter name.
+ end
+
+ if string.sub(f.name, 1, 4) ~= "nvim" then
+ f.method = nil
+ end
+ return f
+ end
+
+ local function check_ui_event_compatible(old_e, new_e)
+ -- check types of existing params are the same
+ -- adding parameters is ok, but removing params is not (gives nil error)
+ eq(old_e.since, new_e.since, old_e.name)
+ for i,p in ipairs(old_e.parameters) do
+ eq(new_e.parameters[i][1], p[1], old_e.name)
+ end
+ end
+
+ -- Level 0 represents methods from 0.1.5 and earlier, when 'since' was not
+ -- yet defined, and metadata was not filtered of internal keys like 'async'.
+ local function clean_level_0(metadata)
+ for _, f in ipairs(metadata.functions) do
+ f.can_fail = nil
+ f.async = nil
+ f.receives_channel_id = nil
+ f.since = 0
+ end
+ end
+
+ local api, compat, stable, api_level
+ local old_api = {}
+ setup(function()
+ api = meths.get_api_info()[2]
+ compat = api.version.api_compatible
+ api_level = api.version.api_level
+ if api.version.api_prerelease then
+ stable = api_level-1
+ else
+ stable = api_level
+ end
+
+ for level = compat, stable do
+ local path = ('test/functional/fixtures/api_level_'..
+ tostring(level)..'.mpack')
+ old_api[level] = read_mpack_file(path)
+ if old_api[level] == nil then
+ local errstr = "missing metadata fixture for stable level "..level..". "
+ if level == api_level and not api.version.api_prerelease then
+ errstr = (errstr.."If NVIM_API_CURRENT was bumped, "..
+ "don't forget to set NVIM_API_PRERELEASE to true.")
+ end
+ error(errstr)
+ end
+
+ if level == 0 then
+ clean_level_0(old_api[level])
+ end
+ end
+ end)
+
+ it("functions are compatible with old metadata or have new level", function()
+ local funcs_new = name_table(api.functions)
+ local funcs_compat = {}
+ for level = compat, stable do
+ for _,f in ipairs(old_api[level].functions) do
+ if funcs_new[f.name] == nil then
+ if f.since >= compat then
+ error('function '..f.name..' was removed but exists in level '..
+ f.since..' which nvim should be compatible with')
+ end
+ else
+ eq(filter_function_metadata(f),
+ filter_function_metadata(funcs_new[f.name]))
+ end
+ end
+ funcs_compat[level] = name_table(old_api[level].functions)
+ end
+
+ for _,f in ipairs(api.functions) do
+ if f.since <= stable then
+ local f_old = funcs_compat[f.since][f.name]
+ if f_old == nil then
+ if string.sub(f.name, 1, 4) == "nvim" then
+ local errstr = ("function "..f.name.." has too low since value. "..
+ "For new functions set it to "..(stable+1)..".")
+ if not api.version.api_prerelease then
+ errstr = (errstr.." Also bump NVIM_API_CURRENT and set "..
+ "NVIM_API_PRERELEASE to true in CMakeLists.txt.")
+ end
+ error(errstr)
+ else
+ error("function name '"..f.name.."' doesn't begin with 'nvim_'")
+ end
+ end
+ elseif f.since > api_level then
+ if api.version.api_prerelease then
+ error("New function "..f.name.." should use since value "..
+ api_level)
+ else
+ error("function "..f.name.." has since value > api_level. "..
+ "Bump NVIM_API_CURRENT and set "..
+ "NVIM_API_PRERELEASE to true in CMakeLists.txt.")
+ end
+ end
+ end
+ end)
+
+ it("UI events are compatible with old metadata or have new level", function()
+ local ui_events_new = name_table(api.ui_events)
+ local ui_events_compat = {}
+
+ -- UI events were formalized in level 3
+ for level = 3, stable do
+ for _,e in ipairs(old_api[level].ui_events) do
+ local new_e = ui_events_new[e.name]
+ if new_e ~= nil then
+ check_ui_event_compatible(e, new_e)
+ end
+ end
+ ui_events_compat[level] = name_table(old_api[level].ui_events)
+ end
+
+ for _,e in ipairs(api.ui_events) do
+ if e.since <= stable then
+ local e_old = ui_events_compat[e.since][e.name]
+ if e_old == nil then
+ local errstr = ("UI event "..e.name.." has too low since value. "..
+ "For new events set it to "..(stable+1)..".")
+ if not api.version.api_prerelease then
+ errstr = (errstr.." Also bump NVIM_API_CURRENT and set "..
+ "NVIM_API_PRERELEASE to true in CMakeLists.txt.")
+ end
+ error(errstr)
+ end
+ elseif e.since > api_level then
+ if api.version.api_prerelease then
+ error("New UI event "..e.name.." should use since value "..
+ api_level)
+ else
+ error("UI event "..e.name.." has since value > api_level. "..
+ "Bump NVIM_API_CURRENT and set "..
+ "NVIM_API_PRERELEASE to true in CMakeLists.txt.")
+ end
+ end
+ end
+ end)
+
+ it("ui_options are preserved from older levels", function()
+ local available_options = {}
+ for _, option in ipairs(api.ui_options) do
+ available_options[option] = true
+ end
+ -- UI options were versioned from level 4
+ for level = 4, stable do
+ for _, option in ipairs(old_api[level].ui_options) do
+ if not available_options[option] then
+ error("UI option "..option.." from stable metadata is missing")
+ end
+ end
+ end
+ end)
+end)
diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua
index c4976ea06b..0e06e48a35 100644
--- a/test/functional/api/vim_spec.lua
+++ b/test/functional/api/vim_spec.lua
@@ -1,19 +1,64 @@
--- Sanity checks for vim_* API calls via msgpack-rpc
local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
+local global_helpers = require('test.helpers')
+
local NIL = helpers.NIL
local clear, nvim, eq, neq = helpers.clear, helpers.nvim, helpers.eq, helpers.neq
+local command = helpers.command
+local eval = helpers.eval
+local funcs = helpers.funcs
+local iswin = helpers.iswin
+local meth_pcall = helpers.meth_pcall
+local meths = helpers.meths
local ok, nvim_async, feed = helpers.ok, helpers.nvim_async, helpers.feed
local os_name = helpers.os_name
-local meths = helpers.meths
-local funcs = helpers.funcs
+local request = helpers.request
+local source = helpers.source
+local next_msg = helpers.next_msg
+
+local expect_err = global_helpers.expect_err
+local format_string = global_helpers.format_string
+local intchar2lua = global_helpers.intchar2lua
+local mergedicts_copy = global_helpers.mergedicts_copy
-describe('vim_* functions', function()
+describe('API', function()
before_each(clear)
- describe('command', function()
+ it('validates requests', function()
+ -- RPC
+ expect_err('Invalid method: bogus$',
+ request, 'bogus')
+ expect_err('Invalid method: โ€ฆ ใฎ ใ‚Š ใ€‚โ€ฆ$',
+ request, 'โ€ฆ ใฎ ใ‚Š ใ€‚โ€ฆ')
+ expect_err('Invalid method: <empty>$',
+ request, '')
+
+ -- Non-RPC: rpcrequest(v:servername) uses internal channel.
+ expect_err('Invalid method: โ€ฆ ใฎ ใ‚Š ใ€‚โ€ฆ$',
+ request, 'nvim_eval',
+ [=[rpcrequest(sockconnect('pipe', v:servername, {'rpc':1}), 'โ€ฆ ใฎ ใ‚Š ใ€‚โ€ฆ')]=])
+ expect_err('Invalid method: bogus$',
+ request, 'nvim_eval',
+ [=[rpcrequest(sockconnect('pipe', v:servername, {'rpc':1}), 'bogus')]=])
+
+ -- XXX: This must be the last one, else next one will fail:
+ -- "Packer instance already working. Use another Packer ..."
+ expect_err("can't serialize object$",
+ request, nil)
+ end)
+
+ it('handles errors in async requests', function()
+ local error_types = meths.get_api_info()[2].error_types
+ nvim_async("bogus")
+ eq({'notification', 'nvim_error_event',
+ {error_types.Exception.id, 'Invalid method: nvim_bogus'}}, next_msg())
+ -- error didn't close channel.
+ eq(2, eval('1+1'))
+ end)
+
+ describe('nvim_command', function()
it('works', function()
- local fname = os.tmpname()
+ local fname = helpers.tmpname()
nvim('command', 'new')
nvim('command', 'edit '..fname)
nvim('command', 'normal itesting\napi')
@@ -28,31 +73,264 @@ describe('vim_* functions', function()
f:close()
os.remove(fname)
end)
+
+ it('VimL validation error: fails with specific error', function()
+ local status, rv = pcall(nvim, "command", "bogus_command")
+ eq(false, status) -- nvim_command() failed.
+ eq("E492:", string.match(rv, "E%d*:")) -- VimL error was returned.
+ eq('', nvim('eval', 'v:errmsg')) -- v:errmsg was not updated.
+ eq('', eval('v:exception'))
+ end)
+
+ it('VimL execution error: fails with specific error', function()
+ local status, rv = pcall(nvim, "command_output", "buffer 23487")
+ eq(false, status) -- nvim_command() failed.
+ eq("E86: Buffer 23487 does not exist", string.match(rv, "E%d*:.*"))
+ eq('', eval('v:errmsg')) -- v:errmsg was not updated.
+ eq('', eval('v:exception'))
+ end)
end)
- describe('eval', function()
+ describe('nvim_command_output', function()
+ it('does not induce hit-enter prompt', function()
+ -- Induce a hit-enter prompt use nvim_input (non-blocking).
+ nvim('command', 'set cmdheight=1')
+ nvim('input', [[:echo "hi\nhi2"<CR>]])
+
+ -- Verify hit-enter prompt.
+ eq({mode='r', blocking=true}, nvim("get_mode"))
+ nvim('input', [[<C-c>]])
+
+ -- Verify NO hit-enter prompt.
+ nvim('command_output', [[echo "hi\nhi2"]])
+ eq({mode='n', blocking=false}, nvim("get_mode"))
+ end)
+
+ it('captures command output', function()
+ eq('this is\nspinal tap',
+ nvim('command_output', [[echo "this is\nspinal tap"]]))
+ eq('no line ending!',
+ nvim('command_output', [[echon "no line ending!"]]))
+ end)
+
+ it('captures empty command output', function()
+ eq('', nvim('command_output', 'echo'))
+ end)
+
+ it('captures single-char command output', function()
+ eq('x', nvim('command_output', 'echo "x"'))
+ end)
+
+ it('captures multiple commands', function()
+ eq('foo\n 1 %a "[No Name]" line 1',
+ nvim('command_output', 'echo "foo" | ls'))
+ end)
+
+ it('captures nested execute()', function()
+ eq('\nnested1\nnested2\n 1 %a "[No Name]" line 1',
+ nvim('command_output',
+ [[echo execute('echo "nested1\nnested2"') | ls]]))
+ end)
+
+ it('captures nested nvim_command_output()', function()
+ eq('nested1\nnested2\n 1 %a "[No Name]" line 1',
+ nvim('command_output',
+ [[echo nvim_command_output('echo "nested1\nnested2"') | ls]]))
+ end)
+
+ it('returns shell |:!| output', function()
+ local win_lf = iswin() and '\r' or ''
+ eq(':!echo foo\r\n\nfoo'..win_lf..'\n', nvim('command_output', [[!echo foo]]))
+ end)
+
+ it('VimL validation error: fails with specific error', function()
+ local status, rv = pcall(nvim, "command_output", "bogus commannnd")
+ eq(false, status) -- nvim_command_output() failed.
+ eq("E492: Not an editor command: bogus commannnd",
+ string.match(rv, "E%d*:.*"))
+ eq('', eval('v:errmsg')) -- v:errmsg was not updated.
+ -- Verify NO hit-enter prompt.
+ eq({mode='n', blocking=false}, nvim("get_mode"))
+ end)
+
+ it('VimL execution error: fails with specific error', function()
+ local status, rv = pcall(nvim, "command_output", "buffer 42")
+ eq(false, status) -- nvim_command_output() failed.
+ eq("E86: Buffer 42 does not exist", string.match(rv, "E%d*:.*"))
+ eq('', eval('v:errmsg')) -- v:errmsg was not updated.
+ -- Verify NO hit-enter prompt.
+ eq({mode='n', blocking=false}, nvim("get_mode"))
+ end)
+ end)
+
+ describe('nvim_eval', function()
it('works', function()
nvim('command', 'let g:v1 = "a"')
nvim('command', 'let g:v2 = [1, 2, {"v3": 3}]')
- eq({v1 = 'a', v2 = {1, 2, {v3 = 3}}}, nvim('eval', 'g:'))
+ eq({v1 = 'a', v2 = { 1, 2, { v3 = 3 } } }, nvim('eval', 'g:'))
end)
it('handles NULL-initialized strings correctly', function()
eq(1, nvim('eval',"matcharg(1) == ['', '']"))
eq({'', ''}, nvim('eval','matcharg(1)'))
end)
+
+ it('works under deprecated name', function()
+ eq(2, request("vim_eval", "1+1"))
+ end)
+
+ it("VimL error: returns error details, does NOT update v:errmsg", function()
+ expect_err('E121: Undefined variable: bogus$', request,
+ 'nvim_eval', 'bogus expression')
+ eq('', eval('v:errmsg')) -- v:errmsg was not updated.
+ end)
end)
- describe('call_function', function()
+ describe('nvim_call_function', function()
it('works', function()
- nvim('call_function', 'setqflist', {{{ filename = 'something', lnum = 17}}, 'r'})
+ nvim('call_function', 'setqflist', { { { filename = 'something', lnum = 17 } }, 'r' })
eq(17, nvim('call_function', 'getqflist', {})[1].lnum)
eq(17, nvim('call_function', 'eval', {17}))
eq('foo', nvim('call_function', 'simplify', {'this/./is//redundant/../../../foo'}))
end)
+
+ it("VimL validation error: returns specific error, does NOT update v:errmsg", function()
+ expect_err('E117: Unknown function: bogus function$', request,
+ 'nvim_call_function', 'bogus function', {'arg1'})
+ expect_err('E119: Not enough arguments for function: atan', request,
+ 'nvim_call_function', 'atan', {})
+ eq('', eval('v:exception'))
+ eq('', eval('v:errmsg')) -- v:errmsg was not updated.
+ end)
+
+ it("VimL error: returns error details, does NOT update v:errmsg", function()
+ expect_err('E808: Number or Float required$', request,
+ 'nvim_call_function', 'atan', {'foo'})
+ expect_err('Invalid channel stream "xxx"$', request,
+ 'nvim_call_function', 'chanclose', {999, 'xxx'})
+ expect_err('E900: Invalid channel id$', request,
+ 'nvim_call_function', 'chansend', {999, 'foo'})
+ eq('', eval('v:exception'))
+ eq('', eval('v:errmsg')) -- v:errmsg was not updated.
+ end)
+
+ it("VimL exception: returns exception details, does NOT update v:errmsg", function()
+ source([[
+ function! Foo() abort
+ throw 'wtf'
+ endfunction
+ ]])
+ expect_err('wtf$', request,
+ 'nvim_call_function', 'Foo', {})
+ eq('', eval('v:exception'))
+ eq('', eval('v:errmsg')) -- v:errmsg was not updated.
+ end)
+
+ it('validates args', function()
+ local too_many_args = { 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x' }
+ source([[
+ function! Foo(...) abort
+ echo a:000
+ endfunction
+ ]])
+ -- E740
+ expect_err('Function called with too many arguments$', request,
+ 'nvim_call_function', 'Foo', too_many_args)
+ end)
+ end)
+
+ describe('nvim_call_dict_function', function()
+ it('invokes VimL dict function', function()
+ source([[
+ function! F(name) dict
+ return self.greeting.', '.a:name.'!'
+ endfunction
+ let g:test_dict_fn = { 'greeting':'Hello', 'F':function('F') }
+
+ let g:test_dict_fn2 = { 'greeting':'Hi' }
+ function g:test_dict_fn2.F2(name)
+ return self.greeting.', '.a:name.' ...'
+ endfunction
+ ]])
+
+ -- :help Dictionary-function
+ eq('Hello, World!', nvim('call_dict_function', 'g:test_dict_fn', 'F', {'World'}))
+ -- Funcref is sent as NIL over RPC.
+ eq({ greeting = 'Hello', F = NIL }, nvim('get_var', 'test_dict_fn'))
+
+ -- :help numbered-function
+ eq('Hi, Moon ...', nvim('call_dict_function', 'g:test_dict_fn2', 'F2', {'Moon'}))
+ -- Funcref is sent as NIL over RPC.
+ eq({ greeting = 'Hi', F2 = NIL }, nvim('get_var', 'test_dict_fn2'))
+
+ -- Function specified via RPC dict.
+ source('function! G() dict\n return "@".(self.result)."@"\nendfunction')
+ eq('@it works@', nvim('call_dict_function', { result = 'it works', G = 'G'}, 'G', {}))
+ end)
+
+ it('validates args', function()
+ command('let g:d={"baz":"zub","meep":[]}')
+ expect_err('Not found: bogus$', request,
+ 'nvim_call_dict_function', 'g:d', 'bogus', {1,2})
+ expect_err('Not a function: baz$', request,
+ 'nvim_call_dict_function', 'g:d', 'baz', {1,2})
+ expect_err('Not a function: meep$', request,
+ 'nvim_call_dict_function', 'g:d', 'meep', {1,2})
+ expect_err('E117: Unknown function: f$', request,
+ 'nvim_call_dict_function', { f = '' }, 'f', {1,2})
+ expect_err('Not a function: f$', request,
+ 'nvim_call_dict_function', "{ 'f': '' }", 'f', {1,2})
+ expect_err('dict argument type must be String or Dictionary$', request,
+ 'nvim_call_dict_function', 42, 'f', {1,2})
+ expect_err('Failed to evaluate dict expression$', request,
+ 'nvim_call_dict_function', 'foo', 'f', {1,2})
+ expect_err('dict not found$', request,
+ 'nvim_call_dict_function', '42', 'f', {1,2})
+ expect_err('Invalid %(empty%) function name$', request,
+ 'nvim_call_dict_function', "{ 'f': '' }", '', {1,2})
+ end)
+ end)
+
+ describe('nvim_execute_lua', function()
+ it('works', function()
+ meths.execute_lua('vim.api.nvim_set_var("test", 3)', {})
+ eq(3, meths.get_var('test'))
+
+ eq(17, meths.execute_lua('a, b = ...\nreturn a + b', {10,7}))
+
+ eq(NIL, meths.execute_lua('function xx(a,b)\nreturn a..b\nend',{}))
+ eq("xy", meths.execute_lua('return xx(...)', {'x','y'}))
+ end)
+
+ it('reports errors', function()
+ eq({false, 'Error loading lua: [string "<nvim>"]:1: '..
+ "'=' expected near '+'"},
+ meth_pcall(meths.execute_lua, 'a+*b', {}))
+
+ eq({false, 'Error loading lua: [string "<nvim>"]:1: '..
+ "unexpected symbol near '1'"},
+ meth_pcall(meths.execute_lua, '1+2', {}))
+
+ eq({false, 'Error loading lua: [string "<nvim>"]:1: '..
+ "unexpected symbol"},
+ meth_pcall(meths.execute_lua, 'aa=bb\0', {}))
+
+ eq({false, 'Error executing lua: [string "<nvim>"]:1: '..
+ "attempt to call global 'bork' (a nil value)"},
+ meth_pcall(meths.execute_lua, 'bork()', {}))
+ end)
+ end)
+
+ describe('nvim_input', function()
+ it("VimL error: does NOT fail, updates v:errmsg", function()
+ local status, _ = pcall(nvim, "input", ":call bogus_fn()<CR>")
+ local v_errnum = string.match(nvim("eval", "v:errmsg"), "E%d*:")
+ eq(true, status) -- nvim_input() did not fail.
+ eq("E117:", v_errnum) -- v:errmsg was updated.
+ end)
end)
- describe('strwidth', function()
+ describe('nvim_strwidth', function()
it('works', function()
eq(3, nvim('strwidth', 'abc'))
-- 6 + (neovim)
@@ -65,7 +343,7 @@ describe('vim_* functions', function()
end)
end)
- describe('{get,set}_current_line', function()
+ describe('nvim_get_current_line, nvim_set_current_line', function()
it('works', function()
eq('', nvim('get_current_line'))
nvim('set_current_line', 'abc')
@@ -73,29 +351,45 @@ describe('vim_* functions', function()
end)
end)
- describe('{get,set,del}_var', function()
- it('works', function()
+ describe('set/get/del variables', function()
+ it('nvim_get_var, nvim_set_var, nvim_del_var', function()
nvim('set_var', 'lua', {1, 2, {['3'] = 1}})
eq({1, 2, {['3'] = 1}}, nvim('get_var', 'lua'))
eq({1, 2, {['3'] = 1}}, nvim('eval', 'g:lua'))
eq(1, funcs.exists('g:lua'))
meths.del_var('lua')
eq(0, funcs.exists('g:lua'))
+ eq({false, "Key not found: lua"}, meth_pcall(meths.del_var, 'lua'))
+ meths.set_var('lua', 1)
+
+ -- Set locked g: var.
+ command('lockvar lua')
+ eq({false, 'Key is locked: lua'}, meth_pcall(meths.del_var, 'lua'))
+ eq({false, 'Key is locked: lua'}, meth_pcall(meths.set_var, 'lua', 1))
end)
- it('set_var returns the old value', function()
+ it('nvim_get_vvar, nvim_set_vvar', function()
+ -- Set readonly v: var.
+ expect_err('Key is read%-only: count$', request,
+ 'nvim_set_vvar', 'count', 42)
+ -- Set writable v: var.
+ meths.set_vvar('errmsg', 'set by API')
+ eq('set by API', meths.get_vvar('errmsg'))
+ end)
+
+ it('vim_set_var returns the old value', function()
local val1 = {1, 2, {['3'] = 1}}
local val2 = {4, 7}
- eq(NIL, nvim('set_var', 'lua', val1))
- eq(val1, nvim('set_var', 'lua', val2))
+ eq(NIL, request('vim_set_var', 'lua', val1))
+ eq(val1, request('vim_set_var', 'lua', val2))
end)
- it('del_var returns the old value', function()
+ it('vim_del_var returns the old value', function()
local val1 = {1, 2, {['3'] = 1}}
local val2 = {4, 7}
- eq(NIL, meths.set_var('lua', val1))
- eq(val1, meths.set_var('lua', val2))
- eq(val2, meths.del_var('lua'))
+ eq(NIL, request('vim_set_var', 'lua', val1))
+ eq(val1, request('vim_set_var', 'lua', val2))
+ eq(val2, request('vim_del_var', 'lua'))
end)
it('truncates values with NULs in them', function()
@@ -104,59 +398,260 @@ describe('vim_* functions', function()
end)
end)
- describe('{get,set}_option', function()
+ describe('nvim_get_option, nvim_set_option', function()
it('works', function()
ok(nvim('get_option', 'equalalways'))
nvim('set_option', 'equalalways', false)
ok(not nvim('get_option', 'equalalways'))
end)
+
+ it('works to get global value of local options', function()
+ eq(false, nvim('get_option', 'lisp'))
+ eq(8, nvim('get_option', 'shiftwidth'))
+ end)
+
+ it('works to set global value of local options', function()
+ nvim('set_option', 'lisp', true)
+ eq(true, nvim('get_option', 'lisp'))
+ eq(false, helpers.curbuf('get_option', 'lisp'))
+ eq(nil, nvim('command_output', 'setglobal lisp?'):match('nolisp'))
+ eq('nolisp', nvim('command_output', 'setlocal lisp?'):match('nolisp'))
+ nvim('set_option', 'shiftwidth', 20)
+ eq('20', nvim('command_output', 'setglobal shiftwidth?'):match('%d+'))
+ eq('8', nvim('command_output', 'setlocal shiftwidth?'):match('%d+'))
+ end)
+
+ it('most window-local options have no global value', function()
+ local status, err = pcall(nvim, 'get_option', 'foldcolumn')
+ eq(false, status)
+ ok(err:match('Invalid option name') ~= nil)
+ end)
+
+ it('updates where the option was last set from', function()
+ nvim('set_option', 'equalalways', false)
+ local status, rv = pcall(nvim, 'command_output',
+ 'verbose set equalalways?')
+ eq(true, status)
+ ok(nil ~= string.find(rv, 'noequalalways\n'..
+ '\tLast set from API client %(channel id %d+%)'))
+
+ nvim('execute_lua', 'vim.api.nvim_set_option("equalalways", true)', {})
+ status, rv = pcall(nvim, 'command_output',
+ 'verbose set equalalways?')
+ eq(true, status)
+ eq(' equalalways\n\tLast set from Lua', rv)
+ end)
end)
- describe('{get,set}_current_buffer and get_buffers', function()
+ describe('nvim_{get,set}_current_buf, nvim_list_bufs', function()
it('works', function()
- eq(1, #nvim('get_buffers'))
- eq(nvim('get_buffers')[1], nvim('get_current_buffer'))
+ eq(1, #nvim('list_bufs'))
+ eq(nvim('list_bufs')[1], nvim('get_current_buf'))
nvim('command', 'new')
- eq(2, #nvim('get_buffers'))
- eq(nvim('get_buffers')[2], nvim('get_current_buffer'))
- nvim('set_current_buffer', nvim('get_buffers')[1])
- eq(nvim('get_buffers')[1], nvim('get_current_buffer'))
+ eq(2, #nvim('list_bufs'))
+ eq(nvim('list_bufs')[2], nvim('get_current_buf'))
+ nvim('set_current_buf', nvim('list_bufs')[1])
+ eq(nvim('list_bufs')[1], nvim('get_current_buf'))
end)
end)
- describe('{get,set}_current_window and get_windows', function()
+ describe('nvim_{get,set}_current_win, nvim_list_wins', function()
it('works', function()
- eq(1, #nvim('get_windows'))
- eq(nvim('get_windows')[1], nvim('get_current_window'))
+ eq(1, #nvim('list_wins'))
+ eq(nvim('list_wins')[1], nvim('get_current_win'))
nvim('command', 'vsplit')
nvim('command', 'split')
- eq(3, #nvim('get_windows'))
- eq(nvim('get_windows')[1], nvim('get_current_window'))
- nvim('set_current_window', nvim('get_windows')[2])
- eq(nvim('get_windows')[2], nvim('get_current_window'))
+ eq(3, #nvim('list_wins'))
+ eq(nvim('list_wins')[1], nvim('get_current_win'))
+ nvim('set_current_win', nvim('list_wins')[2])
+ eq(nvim('list_wins')[2], nvim('get_current_win'))
end)
end)
- describe('{get,set}_current_tabpage and get_tabpages', function()
+ describe('nvim_{get,set}_current_tabpage, nvim_list_tabpages', function()
it('works', function()
- eq(1, #nvim('get_tabpages'))
- eq(nvim('get_tabpages')[1], nvim('get_current_tabpage'))
+ eq(1, #nvim('list_tabpages'))
+ eq(nvim('list_tabpages')[1], nvim('get_current_tabpage'))
nvim('command', 'tabnew')
- eq(2, #nvim('get_tabpages'))
- eq(2, #nvim('get_windows'))
- eq(nvim('get_windows')[2], nvim('get_current_window'))
- eq(nvim('get_tabpages')[2], nvim('get_current_tabpage'))
- nvim('set_current_window', nvim('get_windows')[1])
+ eq(2, #nvim('list_tabpages'))
+ eq(2, #nvim('list_wins'))
+ eq(nvim('list_wins')[2], nvim('get_current_win'))
+ eq(nvim('list_tabpages')[2], nvim('get_current_tabpage'))
+ nvim('set_current_win', nvim('list_wins')[1])
-- Switching window also switches tabpages if necessary
- eq(nvim('get_tabpages')[1], nvim('get_current_tabpage'))
- eq(nvim('get_windows')[1], nvim('get_current_window'))
- nvim('set_current_tabpage', nvim('get_tabpages')[2])
- eq(nvim('get_tabpages')[2], nvim('get_current_tabpage'))
- eq(nvim('get_windows')[2], nvim('get_current_window'))
+ eq(nvim('list_tabpages')[1], nvim('get_current_tabpage'))
+ eq(nvim('list_wins')[1], nvim('get_current_win'))
+ nvim('set_current_tabpage', nvim('list_tabpages')[2])
+ eq(nvim('list_tabpages')[2], nvim('get_current_tabpage'))
+ eq(nvim('list_wins')[2], nvim('get_current_win'))
end)
end)
- describe('replace_termcodes', function()
+ describe('nvim_get_mode', function()
+ it("during normal-mode `g` returns blocking=true", function()
+ nvim("input", "o") -- add a line
+ eq({mode='i', blocking=false}, nvim("get_mode"))
+ nvim("input", [[<C-\><C-N>]])
+ eq(2, nvim("eval", "line('.')"))
+ eq({mode='n', blocking=false}, nvim("get_mode"))
+
+ nvim("input", "g")
+ eq({mode='n', blocking=true}, nvim("get_mode"))
+
+ nvim("input", "k") -- complete the operator
+ eq(1, nvim("eval", "line('.')")) -- verify the completed operator
+ eq({mode='n', blocking=false}, nvim("get_mode"))
+ end)
+
+ it("returns the correct result multiple consecutive times", function()
+ for _ = 1,5 do
+ eq({mode='n', blocking=false}, nvim("get_mode"))
+ end
+ nvim("input", "g")
+ for _ = 1,4 do
+ eq({mode='n', blocking=true}, nvim("get_mode"))
+ end
+ nvim("input", "g")
+ for _ = 1,7 do
+ eq({mode='n', blocking=false}, nvim("get_mode"))
+ end
+ end)
+
+ it("during normal-mode CTRL-W, returns blocking=true", function()
+ nvim("input", "<C-W>")
+ eq({mode='n', blocking=true}, nvim("get_mode"))
+
+ nvim("input", "s") -- complete the operator
+ eq(2, nvim("eval", "winnr('$')")) -- verify the completed operator
+ eq({mode='n', blocking=false}, nvim("get_mode"))
+ end)
+
+ it("during press-enter prompt returns blocking=true", function()
+ eq({mode='n', blocking=false}, nvim("get_mode"))
+ command("echom 'msg1'")
+ command("echom 'msg2'")
+ command("echom 'msg3'")
+ command("echom 'msg4'")
+ command("echom 'msg5'")
+ eq({mode='n', blocking=false}, nvim("get_mode"))
+ nvim("input", ":messages<CR>")
+ eq({mode='r', blocking=true}, nvim("get_mode"))
+ end)
+
+ it("during getchar() returns blocking=false", function()
+ nvim("input", ":let g:test_input = nr2char(getchar())<CR>")
+ -- Events are enabled during getchar(), RPC calls are *not* blocked. #5384
+ eq({mode='n', blocking=false}, nvim("get_mode"))
+ eq(0, nvim("eval", "exists('g:test_input')"))
+ nvim("input", "J")
+ eq("J", nvim("eval", "g:test_input"))
+ eq({mode='n', blocking=false}, nvim("get_mode"))
+ end)
+
+ -- TODO: bug #6247#issuecomment-286403810
+ it("batched with input", function()
+ eq({mode='n', blocking=false}, nvim("get_mode"))
+ command("echom 'msg1'")
+ command("echom 'msg2'")
+ command("echom 'msg3'")
+ command("echom 'msg4'")
+ command("echom 'msg5'")
+
+ local req = {
+ {'nvim_get_mode', {}},
+ {'nvim_input', {':messages<CR>'}},
+ {'nvim_get_mode', {}},
+ {'nvim_eval', {'1'}},
+ }
+ eq({ { {mode='n', blocking=false},
+ 13,
+ {mode='n', blocking=false}, -- TODO: should be blocked=true ?
+ 1 },
+ NIL}, meths.call_atomic(req))
+ eq({mode='r', blocking=true}, nvim("get_mode"))
+ end)
+ it("during insert-mode map-pending, returns blocking=true #6166", function()
+ command("inoremap xx foo")
+ nvim("input", "ix")
+ eq({mode='i', blocking=true}, nvim("get_mode"))
+ end)
+ it("during normal-mode gU, returns blocking=false #6166", function()
+ nvim("input", "gu")
+ eq({mode='no', blocking=false}, nvim("get_mode"))
+ end)
+ end)
+
+ describe('RPC (K_EVENT) #6166', function()
+ it('does not complete ("interrupt") normal-mode operator-pending', function()
+ helpers.insert([[
+ FIRST LINE
+ SECOND LINE]])
+ nvim('input', 'gg')
+ nvim('input', 'gu')
+ -- Make any RPC request (can be non-async: op-pending does not block).
+ nvim('get_current_buf')
+ -- Buffer should not change.
+ helpers.expect([[
+ FIRST LINE
+ SECOND LINE]])
+ -- Now send input to complete the operator.
+ nvim('input', 'j')
+ helpers.expect([[
+ first line
+ second line]])
+ end)
+
+ it('does not complete ("interrupt") `d` #3732', function()
+ local screen = Screen.new(20, 4)
+ screen:attach()
+ command('set listchars=eol:$')
+ command('set list')
+ feed('ia<cr>b<cr>c<cr><Esc>kkk')
+ feed('d')
+ -- Make any RPC request (can be non-async: op-pending does not block).
+ nvim('get_current_buf')
+ screen:expect([[
+ ^a$ |
+ b$ |
+ c$ |
+ |
+ ]])
+ end)
+
+ it('does not complete ("interrupt") normal-mode map-pending', function()
+ command("nnoremap dd :let g:foo='it worked...'<CR>")
+ helpers.insert([[
+ FIRST LINE
+ SECOND LINE]])
+ nvim('input', 'gg')
+ nvim('input', 'd')
+ -- Make any RPC request (must be async, because map-pending blocks).
+ nvim('get_api_info')
+ -- Send input to complete the mapping.
+ nvim('input', 'd')
+ helpers.expect([[
+ FIRST LINE
+ SECOND LINE]])
+ eq('it worked...', helpers.eval('g:foo'))
+ end)
+ it('does not complete ("interrupt") insert-mode map-pending', function()
+ command('inoremap xx foo')
+ command('set timeoutlen=9999')
+ helpers.insert([[
+ FIRST LINE
+ SECOND LINE]])
+ nvim('input', 'ix')
+ -- Make any RPC request (must be async, because map-pending blocks).
+ nvim('get_api_info')
+ -- Send input to complete the mapping.
+ nvim('input', 'x')
+ helpers.expect([[
+ FIRST LINE
+ SECOND LINfooE]])
+ end)
+ end)
+
+ describe('nvim_replace_termcodes', function()
it('escapes K_SPECIAL as K_SPECIAL KS_SPECIAL KE_FILLER', function()
eq('\128\254X', helpers.nvim('replace_termcodes', '\128', true, true, true))
end)
@@ -176,21 +671,42 @@ describe('vim_* functions', function()
eq('\128\253\44', helpers.nvim('replace_termcodes',
'<LeftMouse>', true, true, true))
end)
+
+ it('converts keycodes', function()
+ eq('\nx\27x\rx<x', helpers.nvim('replace_termcodes',
+ '<NL>x<Esc>x<CR>x<lt>x', true, true, true))
+ end)
+
+ it('does not convert keycodes if special=false', function()
+ eq('<NL>x<Esc>x<CR>x<lt>x', helpers.nvim('replace_termcodes',
+ '<NL>x<Esc>x<CR>x<lt>x', true, true, false))
+ end)
+
+ it('does not crash when transforming an empty string', function()
+ -- Actually does not test anything, because current code will use NULL for
+ -- an empty string.
+ --
+ -- Problem here is that if String argument has .data in allocated memory
+ -- then `return str` in vim_replace_termcodes body will make Neovim free
+ -- `str.data` twice: once when freeing arguments, then when freeing return
+ -- value.
+ eq('', meths.replace_termcodes('', true, true, true))
+ end)
end)
- describe('feedkeys', function()
+ describe('nvim_feedkeys', function()
it('CSI escaping', function()
local function on_setup()
-- notice the special char(โ€ฆ) \xe2\80\xa6
nvim('feedkeys', ':let x1="โ€ฆ"\n', '', true)
- -- Both replace_termcodes and feedkeys escape \x80
+ -- Both nvim_replace_termcodes and nvim_feedkeys escape \x80
local inp = helpers.nvim('replace_termcodes', ':let x2="โ€ฆ"<CR>', true, true, true)
- nvim('feedkeys', inp, '', true)
+ nvim('feedkeys', inp, '', true) -- escape_csi=true
- -- Disabling CSI escaping in feedkeys
+ -- nvim_feedkeys with CSI escaping disabled
inp = helpers.nvim('replace_termcodes', ':let x3="โ€ฆ"<CR>', true, true, true)
- nvim('feedkeys', inp, '', false)
+ nvim('feedkeys', inp, '', false) -- escape_csi=false
helpers.stop()
end
@@ -205,7 +721,7 @@ describe('vim_* functions', function()
end)
end)
- describe('err_write', function()
+ describe('nvim_err_write', function()
local screen
before_each(function()
@@ -213,22 +729,23 @@ describe('vim_* functions', function()
screen = Screen.new(40, 8)
screen:attach()
screen:set_default_attr_ids({
+ [0] = {bold=true, foreground=Screen.colors.Blue},
[1] = {foreground = Screen.colors.White, background = Screen.colors.Red},
- [2] = {bold = true, foreground = Screen.colors.SeaGreen}
+ [2] = {bold = true, foreground = Screen.colors.SeaGreen},
+ [3] = {bold = true, reverse = true},
})
- screen:set_default_attr_ignore( {{bold=true, foreground=Screen.colors.Blue}} )
end)
it('can show one line', function()
nvim_async('err_write', 'has bork\n')
screen:expect([[
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{1:has bork} |
]])
end)
@@ -236,11 +753,11 @@ describe('vim_* functions', function()
it('shows return prompt when more than &cmdheight lines', function()
nvim_async('err_write', 'something happened\nvery bad\n')
screen:expect([[
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {3: }|
{1:something happened} |
{1:very bad} |
{2:Press ENTER or type command to continue}^ |
@@ -250,9 +767,9 @@ describe('vim_* functions', function()
it('shows return prompt after all lines are shown', function()
nvim_async('err_write', 'FAILURE\nERROR\nEXCEPTION\nTRACEBACK\n')
screen:expect([[
- ~ |
- ~ |
- ~ |
+ |
+ {0:~ }|
+ {3: }|
{1:FAILURE} |
{1:ERROR} |
{1:EXCEPTION} |
@@ -267,12 +784,12 @@ describe('vim_* functions', function()
nvim_async('err_write', 'fail\n')
screen:expect([[
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{1:very fail} |
]])
helpers.wait()
@@ -280,11 +797,11 @@ describe('vim_* functions', function()
-- shows up to &cmdheight lines
nvim_async('err_write', 'more fail\ntoo fail\n')
screen:expect([[
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {3: }|
{1:more fail} |
{1:too fail} |
{2:Press ENTER or type command to continue}^ |
@@ -293,9 +810,497 @@ describe('vim_* functions', function()
end)
end)
+ describe('nvim_list_chans and nvim_get_chan_info', function()
+ before_each(function()
+ command('autocmd ChanOpen * let g:opened_event = copy(v:event)')
+ command('autocmd ChanInfo * let g:info_event = copy(v:event)')
+ end)
+ local testinfo = {
+ stream = 'stdio',
+ id = 1,
+ mode = 'rpc',
+ client = {},
+ }
+ local stderr = {
+ stream = 'stderr',
+ id = 2,
+ mode = 'bytes',
+ }
+
+ it('returns {} for invalid channel', function()
+ eq({}, meths.get_chan_info(0))
+ eq({}, meths.get_chan_info(-1))
+ -- more preallocated numbers might be added, try something high
+ eq({}, meths.get_chan_info(10))
+ end)
+
+ it('works for stdio channel', function()
+ eq({[1]=testinfo,[2]=stderr}, meths.list_chans())
+ eq(testinfo, meths.get_chan_info(1))
+ eq(stderr, meths.get_chan_info(2))
+
+ meths.set_client_info("functionaltests",
+ {major=0, minor=3, patch=17},
+ 'ui',
+ {do_stuff={n_args={2,3}}},
+ {license= 'Apache2'})
+ local info = {
+ stream = 'stdio',
+ id = 1,
+ mode = 'rpc',
+ client = {
+ name='functionaltests',
+ version={major=0, minor=3, patch=17},
+ type='ui',
+ methods={do_stuff={n_args={2,3}}},
+ attributes={license='Apache2'},
+ },
+ }
+ eq({info=info}, meths.get_var("info_event"))
+ eq({[1]=info, [2]=stderr}, meths.list_chans())
+ eq(info, meths.get_chan_info(1))
+ end)
+
+ it('works for job channel', function()
+ eq(3, eval("jobstart(['cat'], {'rpc': v:true})"))
+ local info = {
+ stream='job',
+ id=3,
+ mode='rpc',
+ client={},
+ }
+ eq({info=info}, meths.get_var("opened_event"))
+ eq({[1]=testinfo,[2]=stderr,[3]=info}, meths.list_chans())
+ eq(info, meths.get_chan_info(3))
+ eval('rpcrequest(3, "nvim_set_client_info", "cat", {}, "remote",'..
+ '{"nvim_command":{"n_args":1}},'.. -- and so on
+ '{"description":"The Amazing Cat"})')
+ info = {
+ stream='job',
+ id=3,
+ mode='rpc',
+ client = {
+ name='cat',
+ version={major=0},
+ type='remote',
+ methods={nvim_command={n_args=1}},
+ attributes={description="The Amazing Cat"},
+ },
+ }
+ eq({info=info}, meths.get_var("info_event"))
+ eq({[1]=testinfo,[2]=stderr,[3]=info}, meths.list_chans())
+ end)
+
+ it('works for :terminal channel', function()
+ command(":terminal")
+ eq({id=1}, meths.get_current_buf())
+ eq(3, meths.buf_get_option(1, "channel"))
+
+ local info = {
+ stream='job',
+ id=3,
+ mode='terminal',
+ buffer = 1,
+ pty='?',
+ }
+ local event = meths.get_var("opened_event")
+ if not iswin() then
+ info.pty = event.info.pty
+ neq(nil, string.match(info.pty, "^/dev/"))
+ end
+ eq({info=info}, event)
+ info.buffer = {id=1}
+ eq({[1]=testinfo,[2]=stderr,[3]=info}, meths.list_chans())
+ eq(info, meths.get_chan_info(3))
+ end)
+ end)
+
+ describe('nvim_call_atomic', function()
+ it('works', function()
+ meths.buf_set_lines(0, 0, -1, true, {'first'})
+ local req = {
+ {'nvim_get_current_line', {}},
+ {'nvim_set_current_line', {'second'}},
+ }
+ eq({{'first', NIL}, NIL}, meths.call_atomic(req))
+ eq({'second'}, meths.buf_get_lines(0, 0, -1, true))
+ end)
+
+ it('allows multiple return values', function()
+ local req = {
+ {'nvim_set_var', {'avar', true}},
+ {'nvim_set_var', {'bvar', 'string'}},
+ {'nvim_get_var', {'avar'}},
+ {'nvim_get_var', {'bvar'}},
+ }
+ eq({{NIL, NIL, true, 'string'}, NIL}, meths.call_atomic(req))
+ end)
+
+ it('is aborted by errors in call', function()
+ local error_types = meths.get_api_info()[2].error_types
+ local req = {
+ {'nvim_set_var', {'one', 1}},
+ {'nvim_buf_set_lines', {}},
+ {'nvim_set_var', {'two', 2}},
+ }
+ eq({{NIL}, {1, error_types.Exception.id,
+ 'Wrong number of arguments: expecting 5 but got 0'}},
+ meths.call_atomic(req))
+ eq(1, meths.get_var('one'))
+ eq(false, pcall(meths.get_var, 'two'))
+
+ -- still returns all previous successful calls
+ req = {
+ {'nvim_set_var', {'avar', 5}},
+ {'nvim_set_var', {'bvar', 'string'}},
+ {'nvim_get_var', {'avar'}},
+ {'nvim_buf_get_lines', {0, 10, 20, true}},
+ {'nvim_get_var', {'bvar'}},
+ }
+ eq({{NIL, NIL, 5}, {3, error_types.Validation.id, 'Index out of bounds'}},
+ meths.call_atomic(req))
+
+ req = {
+ {'i_am_not_a_method', {'xx'}},
+ {'nvim_set_var', {'avar', 10}},
+ }
+ eq({{}, {0, error_types.Exception.id, 'Invalid method: i_am_not_a_method'}},
+ meths.call_atomic(req))
+ eq(5, meths.get_var('avar'))
+ end)
+
+ it('throws error on malformed arguments', function()
+ local req = {
+ {'nvim_set_var', {'avar', 1}},
+ {'nvim_set_var'},
+ {'nvim_set_var', {'avar', 2}},
+ }
+ local status, err = pcall(meths.call_atomic, req)
+ eq(false, status)
+ ok(err:match('Items in calls array must be arrays of size 2') ~= nil)
+ -- call before was done, but not after
+ eq(1, meths.get_var('avar'))
+
+ req = {
+ { 'nvim_set_var', { 'bvar', { 2, 3 } } },
+ 12,
+ }
+ status, err = pcall(meths.call_atomic, req)
+ eq(false, status)
+ ok(err:match('Items in calls array must be arrays') ~= nil)
+ eq({2,3}, meths.get_var('bvar'))
+
+ req = {
+ {'nvim_set_current_line', 'little line'},
+ {'nvim_set_var', {'avar', 3}},
+ }
+ status, err = pcall(meths.call_atomic, req)
+ eq(false, status)
+ ok(err:match('Args must be Array') ~= nil)
+ -- call before was done, but not after
+ eq(1, meths.get_var('avar'))
+ eq({''}, meths.buf_get_lines(0, 0, -1, true))
+ end)
+ end)
+
+ describe('nvim_list_runtime_paths', function()
+ it('returns nothing with empty &runtimepath', function()
+ meths.set_option('runtimepath', '')
+ eq({}, meths.list_runtime_paths())
+ end)
+ it('returns single runtimepath', function()
+ meths.set_option('runtimepath', 'a')
+ eq({'a'}, meths.list_runtime_paths())
+ end)
+ it('returns two runtimepaths', function()
+ meths.set_option('runtimepath', 'a,b')
+ eq({'a', 'b'}, meths.list_runtime_paths())
+ end)
+ it('returns empty strings when appropriate', function()
+ meths.set_option('runtimepath', 'a,,b')
+ eq({'a', '', 'b'}, meths.list_runtime_paths())
+ meths.set_option('runtimepath', ',a,b')
+ eq({'', 'a', 'b'}, meths.list_runtime_paths())
+ meths.set_option('runtimepath', 'a,b,')
+ eq({'a', 'b', ''}, meths.list_runtime_paths())
+ end)
+ it('truncates too long paths', function()
+ local long_path = ('/a'):rep(8192)
+ meths.set_option('runtimepath', long_path)
+ local paths_list = meths.list_runtime_paths()
+ neq({long_path}, paths_list)
+ eq({long_path:sub(1, #(paths_list[1]))}, paths_list)
+ end)
+ end)
+
it('can throw exceptions', function()
local status, err = pcall(nvim, 'get_option', 'invalid-option')
eq(false, status)
ok(err:match('Invalid option name') ~= nil)
end)
+
+ it('does not truncate error message <1 MB #5984', function()
+ local very_long_name = 'A'..('x'):rep(10000)..'Z'
+ local status, err = pcall(nvim, 'get_option', very_long_name)
+ eq(false, status)
+ eq(very_long_name, err:match('Ax+Z?'))
+ end)
+
+ it("does not leak memory on incorrect argument types", function()
+ local status, err = pcall(nvim, 'set_current_dir',{'not', 'a', 'dir'})
+ eq(false, status)
+ ok(err:match(': Wrong type for argument 1, expecting String') ~= nil)
+ end)
+
+ describe('nvim_parse_expression', function()
+ before_each(function()
+ meths.set_option('isident', '')
+ end)
+ local function simplify_east_api_node(line, east_api_node)
+ if east_api_node == NIL then
+ return nil
+ end
+ if east_api_node.children then
+ for k, v in pairs(east_api_node.children) do
+ east_api_node.children[k] = simplify_east_api_node(line, v)
+ end
+ end
+ local typ = east_api_node.type
+ if typ == 'Register' then
+ typ = typ .. ('(name=%s)'):format(
+ tostring(intchar2lua(east_api_node.name)))
+ east_api_node.name = nil
+ elseif typ == 'PlainIdentifier' then
+ typ = typ .. ('(scope=%s,ident=%s)'):format(
+ tostring(intchar2lua(east_api_node.scope)), east_api_node.ident)
+ east_api_node.scope = nil
+ east_api_node.ident = nil
+ elseif typ == 'PlainKey' then
+ typ = typ .. ('(key=%s)'):format(east_api_node.ident)
+ east_api_node.ident = nil
+ elseif typ == 'Comparison' then
+ typ = typ .. ('(type=%s,inv=%u,ccs=%s)'):format(
+ east_api_node.cmp_type, east_api_node.invert and 1 or 0,
+ east_api_node.ccs_strategy)
+ east_api_node.ccs_strategy = nil
+ east_api_node.cmp_type = nil
+ east_api_node.invert = nil
+ elseif typ == 'Integer' then
+ typ = typ .. ('(val=%u)'):format(east_api_node.ivalue)
+ east_api_node.ivalue = nil
+ elseif typ == 'Float' then
+ typ = typ .. format_string('(val=%e)', east_api_node.fvalue)
+ east_api_node.fvalue = nil
+ elseif typ == 'SingleQuotedString' or typ == 'DoubleQuotedString' then
+ typ = format_string('%s(val=%q)', typ, east_api_node.svalue)
+ east_api_node.svalue = nil
+ elseif typ == 'Option' then
+ typ = ('%s(scope=%s,ident=%s)'):format(
+ typ,
+ tostring(intchar2lua(east_api_node.scope)),
+ east_api_node.ident)
+ east_api_node.ident = nil
+ east_api_node.scope = nil
+ elseif typ == 'Environment' then
+ typ = ('%s(ident=%s)'):format(typ, east_api_node.ident)
+ east_api_node.ident = nil
+ elseif typ == 'Assignment' then
+ local aug = east_api_node.augmentation
+ if aug == '' then aug = 'Plain' end
+ typ = ('%s(%s)'):format(typ, aug)
+ east_api_node.augmentation = nil
+ end
+ typ = ('%s:%u:%u:%s'):format(
+ typ, east_api_node.start[1], east_api_node.start[2],
+ line:sub(east_api_node.start[2] + 1,
+ east_api_node.start[2] + 1 + east_api_node.len - 1))
+ assert(east_api_node.start[2] + east_api_node.len - 1 <= #line)
+ for k, _ in pairs(east_api_node.start) do
+ assert(({true, true})[k])
+ end
+ east_api_node.start = nil
+ east_api_node.type = nil
+ east_api_node.len = nil
+ local can_simplify = true
+ for _, _ in pairs(east_api_node) do
+ if can_simplify then can_simplify = false end
+ end
+ if can_simplify then
+ return typ
+ else
+ east_api_node[1] = typ
+ return east_api_node
+ end
+ end
+ local function simplify_east_api(line, east_api)
+ if east_api.error then
+ east_api.err = east_api.error
+ east_api.error = nil
+ east_api.err.msg = east_api.err.message
+ east_api.err.message = nil
+ end
+ if east_api.ast then
+ east_api.ast = {simplify_east_api_node(line, east_api.ast)}
+ if #east_api.ast == 0 then
+ east_api.ast = nil
+ end
+ end
+ if east_api.len == #line then
+ east_api.len = nil
+ end
+ return east_api
+ end
+ local function simplify_east_hl(line, east_hl)
+ for i, v in ipairs(east_hl) do
+ east_hl[i] = ('%s:%u:%u:%s'):format(
+ v[4],
+ v[1],
+ v[2],
+ line:sub(v[2] + 1, v[3]))
+ end
+ return east_hl
+ end
+ local FLAGS_TO_STR = {
+ [0] = "",
+ [1] = "m",
+ [2] = "E",
+ [3] = "mE",
+ [4] = "l",
+ [5] = "lm",
+ [6] = "lE",
+ [7] = "lmE",
+ }
+ local function _check_parsing(opts, str, exp_ast, exp_highlighting_fs,
+ nz_flags_exps)
+ if type(str) ~= 'string' then
+ return
+ end
+ local zflags = opts.flags[1]
+ nz_flags_exps = nz_flags_exps or {}
+ for _, flags in ipairs(opts.flags) do
+ local err, msg = pcall(function()
+ local east_api = meths.parse_expression(str, FLAGS_TO_STR[flags], true)
+ local east_hl = east_api.highlight
+ east_api.highlight = nil
+ local ast = simplify_east_api(str, east_api)
+ local hls = simplify_east_hl(str, east_hl)
+ local exps = {
+ ast = exp_ast,
+ hl_fs = exp_highlighting_fs,
+ }
+ local add_exps = nz_flags_exps[flags]
+ if not add_exps and flags == 3 + zflags then
+ add_exps = nz_flags_exps[1 + zflags] or nz_flags_exps[2 + zflags]
+ end
+ if add_exps then
+ if add_exps.ast then
+ exps.ast = mergedicts_copy(exps.ast, add_exps.ast)
+ end
+ if add_exps.hl_fs then
+ exps.hl_fs = mergedicts_copy(exps.hl_fs, add_exps.hl_fs)
+ end
+ end
+ eq(exps.ast, ast)
+ if exp_highlighting_fs then
+ local exp_highlighting = {}
+ local next_col = 0
+ for i, h in ipairs(exps.hl_fs) do
+ exp_highlighting[i], next_col = h(next_col)
+ end
+ eq(exp_highlighting, hls)
+ end
+ end)
+ if not err then
+ if type(msg) == 'table' then
+ local merr, new_msg = pcall(
+ format_string, 'table error:\n%s\n\n(%r)', msg.message, msg)
+ if merr then
+ msg = new_msg
+ else
+ msg = format_string('table error without .message:\n(%r)',
+ msg)
+ end
+ elseif type(msg) ~= 'string' then
+ msg = format_string('non-string non-table error:\n%r', msg)
+ end
+ error(format_string('Error while processing test (%r, %s):\n%s',
+ str, FLAGS_TO_STR[flags], msg))
+ end
+ end
+ end
+ local function hl(group, str, shift)
+ return function(next_col)
+ local col = next_col + (shift or 0)
+ return (('%s:%u:%u:%s'):format(
+ 'Nvim' .. group,
+ 0,
+ col,
+ str)), (col + #str)
+ end
+ end
+ local function fmtn(typ, args, rest)
+ if (typ == 'UnknownFigure'
+ or typ == 'DictLiteral'
+ or typ == 'CurlyBracesIdentifier'
+ or typ == 'Lambda') then
+ return ('%s%s'):format(typ, rest)
+ elseif typ == 'DoubleQuotedString' or typ == 'SingleQuotedString' then
+ if args:sub(-4) == 'NULL' then
+ args = args:sub(1, -5) .. '""'
+ end
+ return ('%s(%s)%s'):format(typ, args, rest)
+ end
+ end
+ assert:set_parameter('TableFormatLevel', 1000000)
+ require('test.unit.viml.expressions.parser_tests')(
+ it, _check_parsing, hl, fmtn)
+ end)
+
+ describe('nvim_list_uis', function()
+ it('returns empty if --headless', function()
+ -- Test runner defaults to --headless.
+ eq({}, nvim("list_uis"))
+ end)
+ it('returns attached UIs', function()
+ local screen = Screen.new(20, 4)
+ screen:attach()
+ local expected = {
+ {
+ chan = 1,
+ ext_cmdline = false,
+ ext_popupmenu = false,
+ ext_tabline = false,
+ ext_wildmenu = false,
+ ext_linegrid = screen._options.ext_linegrid or false,
+ ext_multigrid = false,
+ ext_hlstate=false,
+ height = 4,
+ rgb = true,
+ width = 20,
+ }
+ }
+ eq(expected, nvim("list_uis"))
+
+ screen:detach()
+ screen = Screen.new(44, 99)
+ screen:attach({ rgb = false })
+ expected[1].rgb = false
+ expected[1].width = 44
+ expected[1].height = 99
+ eq(expected, nvim("list_uis"))
+ end)
+ end)
+
+ describe('nvim_create_namespace', function()
+ it('works', function()
+ eq({}, meths.get_namespaces())
+ eq(1, meths.create_namespace("ns-1"))
+ eq(2, meths.create_namespace("ns-2"))
+ eq(1, meths.create_namespace("ns-1"))
+ eq({["ns-1"]=1, ["ns-2"]=2}, meths.get_namespaces())
+ eq(3, meths.create_namespace(""))
+ eq(4, meths.create_namespace(""))
+ eq({["ns-1"]=1, ["ns-2"]=2}, meths.get_namespaces())
+ end)
+ end)
end)
diff --git a/test/functional/api/window_spec.lua b/test/functional/api/window_spec.lua
index d90323181c..4496e1f644 100644
--- a/test/functional/api/window_spec.lua
+++ b/test/functional/api/window_spec.lua
@@ -1,4 +1,3 @@
--- Sanity checks for window_* API calls via msgpack-rpc
local helpers = require('test.functional.helpers')(after_each)
local clear, nvim, curbuf, curbuf_contents, window, curwin, eq, neq,
ok, feed, insert, eval = helpers.clear, helpers.nvim, helpers.curbuf,
@@ -7,6 +6,12 @@ local clear, nvim, curbuf, curbuf_contents, window, curwin, eq, neq,
local wait = helpers.wait
local curwinmeths = helpers.curwinmeths
local funcs = helpers.funcs
+local request = helpers.request
+local NIL = helpers.NIL
+local meth_pcall = helpers.meth_pcall
+local meths = helpers.meths
+local command = helpers.command
+local expect_err = helpers.expect_err
-- check if str is visible at the beginning of some line
local function is_visible(str)
@@ -27,17 +32,32 @@ local function is_visible(str)
return false
end
-describe('window_* functions', function()
+describe('API/win', function()
before_each(clear)
- describe('get_buffer', function()
+ describe('get_buf', function()
it('works', function()
- eq(curbuf(), window('get_buffer', nvim('get_windows')[1]))
+ eq(curbuf(), window('get_buf', nvim('list_wins')[1]))
nvim('command', 'new')
- nvim('set_current_window', nvim('get_windows')[2])
- eq(curbuf(), window('get_buffer', nvim('get_windows')[2]))
- neq(window('get_buffer', nvim('get_windows')[1]),
- window('get_buffer', nvim('get_windows')[2]))
+ nvim('set_current_win', nvim('list_wins')[2])
+ eq(curbuf(), window('get_buf', nvim('list_wins')[2]))
+ neq(window('get_buf', nvim('list_wins')[1]),
+ window('get_buf', nvim('list_wins')[2]))
+ end)
+ end)
+
+ describe('set_buf', function()
+ it('works', function()
+ nvim('command', 'new')
+ local windows = nvim('list_wins')
+ neq(window('get_buf', windows[2]), window('get_buf', windows[1]))
+ window('set_buf', windows[2], window('get_buf', windows[1]))
+ eq(window('get_buf', windows[2]), window('get_buf', windows[1]))
+ end)
+
+ it('validates args', function()
+ expect_err('Invalid buffer id$', window, 'set_buf', nvim('get_current_win'), 23)
+ expect_err('Invalid window id$', window, 'set_buf', 23, nvim('get_current_buf'))
end)
end)
@@ -52,6 +72,12 @@ describe('window_* functions', function()
eq('typing\n some dumb text', curbuf_contents())
end)
+ it('does not leak memory when using invalid window ID with invalid pos',
+ function()
+ eq({false, 'Invalid window id'},
+ meth_pcall(meths.win_set_cursor, 1, {"b\na"}))
+ end)
+
it('updates the screen, and also when the window is unfocused', function()
insert("prologue")
feed('100o<esc>')
@@ -98,33 +124,56 @@ describe('window_* functions', function()
neq(win, curwin())
end)
+ it('remembers what column it wants to be in', function()
+ insert("first line")
+ feed('o<esc>')
+ insert("second line")
+
+ feed('gg')
+ wait() -- let nvim process the 'gg' command
+
+ -- cursor position is at beginning
+ local win = curwin()
+ eq({1, 0}, window('get_cursor', win))
+
+ -- move cursor to column 5
+ window('set_cursor', win, {1, 5})
+
+ -- move down a line
+ feed('j')
+ wait() -- let nvim process the 'j' command
+
+ -- cursor is still in column 5
+ eq({2, 5}, window('get_cursor', win))
+ end)
+
end)
describe('{get,set}_height', function()
it('works', function()
nvim('command', 'vsplit')
- eq(window('get_height', nvim('get_windows')[2]),
- window('get_height', nvim('get_windows')[1]))
- nvim('set_current_window', nvim('get_windows')[2])
+ eq(window('get_height', nvim('list_wins')[2]),
+ window('get_height', nvim('list_wins')[1]))
+ nvim('set_current_win', nvim('list_wins')[2])
nvim('command', 'split')
- eq(window('get_height', nvim('get_windows')[2]),
- math.floor(window('get_height', nvim('get_windows')[1]) / 2))
- window('set_height', nvim('get_windows')[2], 2)
- eq(2, window('get_height', nvim('get_windows')[2]))
+ eq(window('get_height', nvim('list_wins')[2]),
+ math.floor(window('get_height', nvim('list_wins')[1]) / 2))
+ window('set_height', nvim('list_wins')[2], 2)
+ eq(2, window('get_height', nvim('list_wins')[2]))
end)
end)
describe('{get,set}_width', function()
it('works', function()
nvim('command', 'split')
- eq(window('get_width', nvim('get_windows')[2]),
- window('get_width', nvim('get_windows')[1]))
- nvim('set_current_window', nvim('get_windows')[2])
+ eq(window('get_width', nvim('list_wins')[2]),
+ window('get_width', nvim('list_wins')[1]))
+ nvim('set_current_win', nvim('list_wins')[2])
nvim('command', 'vsplit')
- eq(window('get_width', nvim('get_windows')[2]),
- math.floor(window('get_width', nvim('get_windows')[1]) / 2))
- window('set_width', nvim('get_windows')[2], 2)
- eq(2, window('get_width', nvim('get_windows')[2]))
+ eq(window('get_width', nvim('list_wins')[2]),
+ math.floor(window('get_width', nvim('list_wins')[1]) / 2))
+ window('set_width', nvim('list_wins')[2], 2)
+ eq(2, window('get_width', nvim('list_wins')[2]))
end)
end)
@@ -136,6 +185,26 @@ describe('window_* functions', function()
eq(1, funcs.exists('w:lua'))
curwinmeths.del_var('lua')
eq(0, funcs.exists('w:lua'))
+ eq({false, 'Key not found: lua'}, meth_pcall(curwinmeths.del_var, 'lua'))
+ curwinmeths.set_var('lua', 1)
+ command('lockvar w:lua')
+ eq({false, 'Key is locked: lua'}, meth_pcall(curwinmeths.del_var, 'lua'))
+ eq({false, 'Key is locked: lua'}, meth_pcall(curwinmeths.set_var, 'lua', 1))
+ end)
+
+ it('window_set_var returns the old value', function()
+ local val1 = {1, 2, {['3'] = 1}}
+ local val2 = {4, 7}
+ eq(NIL, request('window_set_var', 0, 'lua', val1))
+ eq(val1, request('window_set_var', 0, 'lua', val2))
+ end)
+
+ it('window_del_var returns the old value', function()
+ local val1 = {1, 2, {['3'] = 1}}
+ local val2 = {4, 7}
+ eq(NIL, request('window_set_var', 0, 'lua', val1))
+ eq(val1, request('window_set_var', 0, 'lua', val2))
+ eq(val2, request('window_del_var', 0, 'lua'))
end)
end)
@@ -152,17 +221,17 @@ describe('window_* functions', function()
describe('get_position', function()
it('works', function()
- local height = window('get_height', nvim('get_windows')[1])
- local width = window('get_width', nvim('get_windows')[1])
+ local height = window('get_height', nvim('list_wins')[1])
+ local width = window('get_width', nvim('list_wins')[1])
nvim('command', 'split')
nvim('command', 'vsplit')
- eq({0, 0}, window('get_position', nvim('get_windows')[1]))
+ eq({0, 0}, window('get_position', nvim('list_wins')[1]))
local vsplit_pos = math.floor(width / 2)
local split_pos = math.floor(height / 2)
local win2row, win2col =
- unpack(window('get_position', nvim('get_windows')[2]))
+ unpack(window('get_position', nvim('list_wins')[2]))
local win3row, win3col =
- unpack(window('get_position', nvim('get_windows')[3]))
+ unpack(window('get_position', nvim('list_wins')[3]))
eq(0, win2row)
eq(0, win3col)
ok(vsplit_pos - 1 <= win2col and win2col <= vsplit_pos + 1)
@@ -175,19 +244,43 @@ describe('window_* functions', function()
nvim('command', 'tabnew')
nvim('command', 'vsplit')
eq(window('get_tabpage',
- nvim('get_windows')[1]), nvim('get_tabpages')[1])
+ nvim('list_wins')[1]), nvim('list_tabpages')[1])
eq(window('get_tabpage',
- nvim('get_windows')[2]), nvim('get_tabpages')[2])
+ nvim('list_wins')[2]), nvim('list_tabpages')[2])
eq(window('get_tabpage',
- nvim('get_windows')[3]), nvim('get_tabpages')[2])
+ nvim('list_wins')[3]), nvim('list_tabpages')[2])
+ end)
+ end)
+
+ describe('get_number', function()
+ it('works', function()
+ local wins = nvim('list_wins')
+ eq(1, window('get_number', wins[1]))
+
+ nvim('command', 'split')
+ local win1, win2 = unpack(nvim('list_wins'))
+ eq(1, window('get_number', win1))
+ eq(2, window('get_number', win2))
+
+ nvim('command', 'wincmd J')
+ eq(2, window('get_number', win1))
+ eq(1, window('get_number', win2))
+
+ nvim('command', 'tabnew')
+ local win3 = nvim('list_wins')[3]
+ -- First tab page
+ eq(2, window('get_number', win1))
+ eq(1, window('get_number', win2))
+ -- Second tab page
+ eq(1, window('get_number', win3))
end)
end)
describe('is_valid', function()
it('works', function()
nvim('command', 'split')
- local win = nvim('get_windows')[2]
- nvim('set_current_window', win)
+ local win = nvim('list_wins')[2]
+ nvim('set_current_win', win)
ok(window('is_valid', win))
nvim('command', 'close')
ok(not window('is_valid', win))
diff --git a/test/functional/autocmd/autocmd_spec.lua b/test/functional/autocmd/autocmd_spec.lua
index 72aff58d73..8ee9462a8d 100644
--- a/test/functional/autocmd/autocmd_spec.lua
+++ b/test/functional/autocmd/autocmd_spec.lua
@@ -1,8 +1,13 @@
local helpers = require('test.functional.helpers')(after_each)
+local eq = helpers.eq
+local eval = helpers.eval
local clear = helpers.clear
+local meths = helpers.meths
+local expect = helpers.expect
local command = helpers.command
-local eval = helpers.eval
+local exc_exec = helpers.exc_exec
+local curbufmeths = helpers.curbufmeths
describe('autocmds:', function()
before_each(clear)
@@ -11,8 +16,8 @@ describe('autocmds:', function()
local expected = {
'WinLeave',
'TabLeave',
- 'TabNew',
'WinEnter',
+ 'TabNew',
'TabEnter',
'BufLeave',
'BufEnter'
@@ -28,4 +33,26 @@ describe('autocmds:', function()
command('tabnew')
assert.same(expected, eval('g:foo'))
end)
+
+ it('v:vim_did_enter is 1 after VimEnter', function()
+ eq(1, eval('v:vim_did_enter'))
+ end)
+
+ describe('BufLeave autocommand', function()
+ it('can wipe out the buffer created by :edit which triggered autocmd',
+ function()
+ meths.set_option('hidden', true)
+ curbufmeths.set_lines(0, 1, false, {
+ 'start of test file xx',
+ 'end of test file xx'})
+
+ command('autocmd BufLeave * bwipeout yy')
+ eq('Vim(edit):E143: Autocommands unexpectedly deleted new buffer yy',
+ exc_exec('edit yy'))
+
+ expect([[
+ start of test file xx
+ end of test file xx]])
+ end)
+ end)
end)
diff --git a/test/functional/autocmd/bufenter_spec.lua b/test/functional/autocmd/bufenter_spec.lua
new file mode 100644
index 0000000000..e14ddb3316
--- /dev/null
+++ b/test/functional/autocmd/bufenter_spec.lua
@@ -0,0 +1,47 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local clear = helpers.clear
+local command = helpers.command
+local eq = helpers.eq
+local eval = helpers.eval
+local request = helpers.request
+local source = helpers.source
+
+describe('autocmd BufEnter', function()
+ before_each(clear)
+
+ it("triggered by nvim_command('edit <dir>')", function()
+ command("autocmd BufEnter * if isdirectory(expand('<afile>')) | let g:dir_bufenter = 1 | endif")
+ request("nvim_command", "split .")
+ eq(1, eval("exists('g:dir_bufenter')")) -- Did BufEnter for the directory.
+ eq(2, eval("bufnr('%')")) -- Switched to the dir buffer.
+ end)
+
+ it('triggered by "try|:split <dir>|endtry" in a function', function()
+ command("autocmd BufEnter * if isdirectory(expand('<afile>')) | let g:dir_bufenter = 1 | endif")
+ source([[
+ function! Test()
+ try
+ exe 'split .'
+ catch
+ endtry
+ endfunction
+ ]])
+ command("call Test()")
+ eq(1, eval("exists('g:dir_bufenter')")) -- Did BufEnter for the directory.
+ eq(2, eval("bufnr('%')")) -- Switched to the dir buffer.
+ end)
+
+ it('triggered by ":split normal|:help|:bw"', function()
+ command("split normal")
+ command("wincmd j")
+ command("helptags runtime/doc")
+ command("help")
+ command("wincmd L")
+ command("autocmd BufEnter normal let g:bufentered = 1")
+ command("bw")
+ eq(1, eval('bufnr("%")')) -- The cursor is back to the bottom window
+ eq(0, eval("exists('g:bufentered')")) -- The autocmd hasn't been triggered
+ end)
+
+end)
diff --git a/test/functional/autocmd/cmdline_spec.lua b/test/functional/autocmd/cmdline_spec.lua
new file mode 100644
index 0000000000..51b7b819e9
--- /dev/null
+++ b/test/functional/autocmd/cmdline_spec.lua
@@ -0,0 +1,224 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+
+local clear = helpers.clear
+local command = helpers.command
+local eq = helpers.eq
+local expect = helpers.expect
+local eval = helpers.eval
+local next_msg = helpers.next_msg
+local feed = helpers.feed
+local meths = helpers.meths
+
+describe('cmdline autocommands', function()
+ local channel
+ before_each(function()
+ clear()
+ channel = meths.get_api_info()[1]
+ meths.set_var("channel",channel)
+ command("autocmd CmdlineEnter * call rpcnotify(g:channel, 'CmdlineEnter', v:event)")
+ command("autocmd CmdlineLeave * call rpcnotify(g:channel, 'CmdlineLeave', v:event)")
+ command("autocmd CmdWinEnter * call rpcnotify(g:channel, 'CmdWinEnter', v:event)")
+ command("autocmd CmdWinLeave * call rpcnotify(g:channel, 'CmdWinLeave', v:event)")
+ end)
+
+ it('works', function()
+ feed(':')
+ eq({'notification', 'CmdlineEnter', {{cmdtype=':', cmdlevel=1}}}, next_msg())
+ feed('redraw<cr>')
+ eq({'notification', 'CmdlineLeave',
+ {{cmdtype=':', cmdlevel=1, abort=false}}}, next_msg())
+
+ feed(':')
+ eq({'notification', 'CmdlineEnter', {{cmdtype=':', cmdlevel=1}}}, next_msg())
+
+ -- note: feed('bork<c-c>') might not consume 'bork'
+ -- due to out-of-band interupt handling
+ feed('bork<esc>')
+ eq({'notification', 'CmdlineLeave',
+ {{cmdtype=':', cmdlevel=1, abort=true}}}, next_msg())
+ end)
+
+ it('can abort cmdline', function()
+ command("autocmd CmdlineLeave * let v:event.abort= len(getcmdline())>15")
+ feed(":put! ='ok'<cr>")
+ expect([[
+ ok
+ ]])
+
+ feed(":put! ='blah blah'<cr>")
+ expect([[
+ ok
+ ]])
+ end)
+
+ it('handles errors correctly', function()
+ clear()
+ local screen = Screen.new(72, 8)
+ screen:attach()
+ screen:set_default_attr_ids({
+ [1] = {bold = true, foreground = Screen.colors.Blue1},
+ [2] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
+ [3] = {bold = true, foreground = Screen.colors.SeaGreen4},
+ [4] = {bold = true, reverse = true},
+ })
+ command("autocmd CmdlineEnter * echoerr 'FAIL'")
+ command("autocmd CmdlineLeave * echoerr 'very error'")
+
+ feed(':')
+ screen:expect([[
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4: }|
+ : |
+ {2:E5500: autocmd has thrown an exception: Vim(echoerr):FAIL} |
+ :^ |
+ ]])
+
+ feed("put ='lorem ipsum'<cr>")
+ screen:expect([[
+ |
+ {4: }|
+ : |
+ {2:E5500: autocmd has thrown an exception: Vim(echoerr):FAIL} |
+ :put ='lorem ipsum' |
+ {2:E5500: autocmd has thrown an exception: Vim(echoerr):very error} |
+ |
+ {3:Press ENTER or type command to continue}^ |
+ ]])
+
+ -- cmdline was still executed
+ feed('<cr>')
+ screen:expect([[
+ |
+ ^lorem ipsum |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+
+ command("autocmd CmdlineChanged * echoerr 'change erreor'")
+
+ -- history recall still works
+ feed(":<c-p>")
+ screen:expect([[
+ |
+ lorem ipsum |
+ {4: }|
+ : |
+ {2:E5500: autocmd has thrown an exception: Vim(echoerr):FAIL} |
+ :put ='lorem ipsum' |
+ {2:E5500: autocmd has thrown an exception: Vim(echoerr):change erreor} |
+ :put ='lorem ipsum'^ |
+ ]])
+
+ feed("<left>")
+ screen:expect([[
+ |
+ lorem ipsum |
+ {4: }|
+ : |
+ {2:E5500: autocmd has thrown an exception: Vim(echoerr):FAIL} |
+ :put ='lorem ipsum' |
+ {2:E5500: autocmd has thrown an exception: Vim(echoerr):change erreor} |
+ :put ='lorem ipsum^' |
+ ]])
+
+ -- edit still works
+ feed(".")
+ screen:expect([[
+ {4: }|
+ : |
+ {2:E5500: autocmd has thrown an exception: Vim(echoerr):FAIL} |
+ :put ='lorem ipsum' |
+ {2:E5500: autocmd has thrown an exception: Vim(echoerr):change erreor} |
+ :put ='lorem ipsum.' |
+ {2:E5500: autocmd has thrown an exception: Vim(echoerr):change erreor} |
+ :put ='lorem ipsum.^' |
+ ]])
+
+ feed('<cr>')
+ screen:expect([[
+ :put ='lorem ipsum' |
+ {2:E5500: autocmd has thrown an exception: Vim(echoerr):change erreor} |
+ :put ='lorem ipsum.' |
+ {2:E5500: autocmd has thrown an exception: Vim(echoerr):change erreor} |
+ :put ='lorem ipsum.' |
+ {2:E5500: autocmd has thrown an exception: Vim(echoerr):very error} |
+ |
+ {3:Press ENTER or type command to continue}^ |
+ ]])
+
+ -- cmdline was still executed
+ feed('<cr>')
+ screen:expect([[
+ |
+ lorem ipsum |
+ ^lorem ipsum. |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+ end)
+
+ it('works with nested cmdline', function()
+ feed(':')
+ eq({'notification', 'CmdlineEnter', {{cmdtype=':', cmdlevel=1}}}, next_msg())
+ feed('<c-r>=')
+ eq({'notification', 'CmdlineEnter', {{cmdtype='=', cmdlevel=2}}}, next_msg())
+ feed('<c-f>')
+ eq({'notification', 'CmdWinEnter', {{}}}, next_msg())
+ feed(':')
+ eq({'notification', 'CmdlineEnter', {{cmdtype=':', cmdlevel=3}}}, next_msg())
+ feed('<c-c>')
+ eq({'notification', 'CmdlineLeave', {{cmdtype=':', cmdlevel=3, abort=true}}}, next_msg())
+ feed('<c-c>')
+ eq({'notification', 'CmdWinLeave', {{}}}, next_msg())
+ feed('1+2<cr>')
+ eq({'notification', 'CmdlineLeave', {{cmdtype='=', cmdlevel=2, abort=false}}}, next_msg())
+ end)
+
+ it('supports CmdlineChanged' ,function()
+ command("autocmd CmdlineChanged * call rpcnotify(g:channel, 'CmdlineChanged', v:event, getcmdline())")
+ feed(':')
+ eq({'notification', 'CmdlineEnter', {{cmdtype=':', cmdlevel=1}}}, next_msg())
+ feed('l')
+ eq({'notification', 'CmdlineChanged', {{cmdtype=':', cmdlevel=1}, "l"}}, next_msg())
+ feed('e')
+ eq({'notification', 'CmdlineChanged', {{cmdtype=':', cmdlevel=1}, "le"}}, next_msg())
+ feed('t')
+ eq({'notification', 'CmdlineChanged', {{cmdtype=':', cmdlevel=1}, "let"}}, next_msg())
+ feed('<space>')
+ eq({'notification', 'CmdlineChanged', {{cmdtype=':', cmdlevel=1}, "let "}}, next_msg())
+ feed('x')
+ eq({'notification', 'CmdlineChanged', {{cmdtype=':', cmdlevel=1}, "let x"}}, next_msg())
+ feed('<space>')
+ eq({'notification', 'CmdlineChanged', {{cmdtype=':', cmdlevel=1}, "let x "}}, next_msg())
+ feed('=')
+ eq({'notification', 'CmdlineChanged', {{cmdtype=':', cmdlevel=1}, "let x ="}}, next_msg())
+ feed('<space>')
+ eq({'notification', 'CmdlineChanged', {{cmdtype=':', cmdlevel=1}, "let x = "}}, next_msg())
+ feed('<c-r>=')
+ eq({'notification', 'CmdlineEnter', {{cmdtype='=', cmdlevel=2}}}, next_msg())
+ feed('1')
+ eq({'notification', 'CmdlineChanged', {{cmdtype='=', cmdlevel=2}, "1"}}, next_msg())
+ feed('+')
+ eq({'notification', 'CmdlineChanged', {{cmdtype='=', cmdlevel=2}, "1+"}}, next_msg())
+ feed('1')
+ eq({'notification', 'CmdlineChanged', {{cmdtype='=', cmdlevel=2}, "1+1"}}, next_msg())
+ feed('<cr>')
+ eq({'notification', 'CmdlineLeave', {{cmdtype='=', cmdlevel=2, abort=false}}}, next_msg())
+ eq({'notification', 'CmdlineChanged', {{cmdtype=':', cmdlevel=1}, "let x = "}}, next_msg())
+ eq({'notification', 'CmdlineChanged', {{cmdtype=':', cmdlevel=1}, "let x = 2"}}, next_msg())
+ feed('<cr>')
+ eq({'notification', 'CmdlineLeave', {{cmdtype=':', cmdlevel=1, abort=false}}}, next_msg())
+ eq(2, eval('x'))
+ end)
+end)
diff --git a/test/functional/autocmd/dirchanged_spec.lua b/test/functional/autocmd/dirchanged_spec.lua
new file mode 100644
index 0000000000..7979e91a4c
--- /dev/null
+++ b/test/functional/autocmd/dirchanged_spec.lua
@@ -0,0 +1,164 @@
+local lfs = require('lfs')
+local h = require('test.functional.helpers')(after_each)
+
+local clear = h.clear
+local command = h.command
+local eq = h.eq
+local eval = h.eval
+local request = h.request
+
+describe('autocmd DirChanged', function()
+ local curdir = string.gsub(lfs.currentdir(), '\\', '/')
+ local dirs = {
+ curdir .. '/Xtest-functional-autocmd-dirchanged.dir1',
+ curdir .. '/Xtest-functional-autocmd-dirchanged.dir2',
+ curdir .. '/Xtest-functional-autocmd-dirchanged.dir3',
+ }
+
+ setup(function() for _, dir in pairs(dirs) do h.mkdir(dir) end end)
+ teardown(function() for _, dir in pairs(dirs) do h.rmdir(dir) end end)
+
+ before_each(function()
+ clear()
+ command('autocmd DirChanged * let [g:getcwd, g:ev, g:amatch, g:cdcount] '
+ ..' = [getcwd(), copy(v:event), expand("<amatch>"), 1 + get(g:, "cdcount", 0)]')
+ -- Normalize path separators.
+ command([[autocmd DirChanged * let g:ev['cwd'] = substitute(g:ev['cwd'], '\\', '/', 'g')]])
+ command([[autocmd DirChanged * let g:getcwd = substitute(g:getcwd, '\\', '/', 'g')]])
+ end)
+
+ it('sets v:event', function()
+ command('lcd '..dirs[1])
+ eq({cwd=dirs[1], scope='window'}, eval('g:ev'))
+ eq(1, eval('g:cdcount'))
+
+ command('tcd '..dirs[2])
+ eq({cwd=dirs[2], scope='tab'}, eval('g:ev'))
+ eq(2, eval('g:cdcount'))
+
+ command('cd '..dirs[3])
+ eq({cwd=dirs[3], scope='global'}, eval('g:ev'))
+ eq(3, eval('g:cdcount'))
+ end)
+
+ it('sets getcwd() during event #6260', function()
+ command('lcd '..dirs[1])
+ eq(dirs[1], eval('g:getcwd'))
+
+ command('tcd '..dirs[2])
+ eq(dirs[2], eval('g:getcwd'))
+
+ command('cd '..dirs[3])
+ eq(dirs[3], eval('g:getcwd'))
+ end)
+
+ it('disallows recursion', function()
+ command('set shellslash')
+ -- Set up a _nested_ handler.
+ command('autocmd DirChanged * nested lcd '..dirs[3])
+ command('lcd '..dirs[1])
+ eq({cwd=dirs[1], scope='window'}, eval('g:ev'))
+ eq(1, eval('g:cdcount'))
+ -- autocmd changed to dirs[3], but did NOT trigger another DirChanged.
+ eq(dirs[3], eval('getcwd()'))
+ end)
+
+ it('sets <amatch> to CWD "scope"', function()
+ command('lcd '..dirs[1])
+ eq('window', eval('g:amatch'))
+
+ command('tcd '..dirs[2])
+ eq('tab', eval('g:amatch'))
+
+ command('cd '..dirs[3])
+ eq('global', eval('g:amatch'))
+ end)
+
+ it('does not trigger if :cd fails', function()
+ command('let g:ev = {}')
+
+ local status1, err1 = pcall(function()
+ command('lcd '..dirs[1] .. '/doesnotexist')
+ end)
+ eq({}, eval('g:ev'))
+
+ local status2, err2 = pcall(function()
+ command('lcd '..dirs[2] .. '/doesnotexist')
+ end)
+ eq({}, eval('g:ev'))
+
+ local status3, err3 = pcall(function()
+ command('lcd '..dirs[3] .. '/doesnotexist')
+ end)
+ eq({}, eval('g:ev'))
+
+ eq(false, status1)
+ eq(false, status2)
+ eq(false, status3)
+
+ eq('E344:', string.match(err1, "E%d*:"))
+ eq('E344:', string.match(err2, "E%d*:"))
+ eq('E344:', string.match(err3, "E%d*:"))
+ end)
+
+ it("is triggered by 'autochdir'", function()
+ command('set autochdir')
+
+ command('split '..dirs[1]..'/foo')
+ eq({cwd=dirs[1], scope='window'}, eval('g:ev'))
+
+ command('split '..dirs[2]..'/bar')
+ eq({cwd=dirs[2], scope='window'}, eval('g:ev'))
+
+ eq(2, eval('g:cdcount'))
+ end)
+
+ it("is triggered by switching to win/tab with different CWD #6054", function()
+ command('lcd '..dirs[3]) -- window 3
+ command('split '..dirs[2]..'/foo') -- window 2
+ command('lcd '..dirs[2])
+ command('split '..dirs[1]..'/bar') -- window 1
+ command('lcd '..dirs[1])
+
+ command('2wincmd w') -- window 2
+ eq({cwd=dirs[2], scope='window'}, eval('g:ev'))
+
+ eq(4, eval('g:cdcount'))
+ command('tabnew') -- tab 2 (tab-local CWD)
+ eq(4, eval('g:cdcount')) -- same CWD, no DirChanged event
+ command('tcd '..dirs[3])
+ command('tabnext') -- tab 1 (no tab-local CWD)
+ eq({cwd=dirs[2], scope='window'}, eval('g:ev'))
+ command('tabnext') -- tab 2
+ eq({cwd=dirs[3], scope='tab'}, eval('g:ev'))
+ eq(7, eval('g:cdcount'))
+
+ command('tabnext') -- tab 1
+ command('3wincmd w') -- window 3
+ eq(9, eval('g:cdcount'))
+ command('tabnext') -- tab 2 (has the *same* CWD)
+ eq(9, eval('g:cdcount')) -- same CWD, no DirChanged event
+ end)
+
+ it('is triggered by nvim_set_current_dir()', function()
+ request('nvim_set_current_dir', dirs[1])
+ eq({cwd=dirs[1], scope='global'}, eval('g:ev'))
+
+ request('nvim_set_current_dir', dirs[2])
+ eq({cwd=dirs[2], scope='global'}, eval('g:ev'))
+
+ local status, err = pcall(function()
+ request('nvim_set_current_dir', '/doesnotexist')
+ end)
+ eq(false, status)
+ eq('Failed to change directory', string.match(err, ': (.*)'))
+ eq({cwd=dirs[2], scope='global'}, eval('g:ev'))
+ end)
+
+ it('works when local to buffer', function()
+ command('let g:triggered = 0')
+ command('autocmd DirChanged <buffer> let g:triggered = 1')
+ command('cd '..dirs[1])
+ eq(1, eval('g:triggered'))
+ end)
+end)
diff --git a/test/functional/autocmd/filetype_spec.lua b/test/functional/autocmd/filetype_spec.lua
new file mode 100644
index 0000000000..e6fa7ab6bb
--- /dev/null
+++ b/test/functional/autocmd/filetype_spec.lua
@@ -0,0 +1,16 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local eval = helpers.eval
+local clear = helpers.clear
+local command = helpers.command
+
+describe('autocmd FileType', function()
+ before_each(clear)
+
+ it("is triggered by :help only once", function()
+ command("let g:foo = 0")
+ command("autocmd FileType help let g:foo = g:foo + 1")
+ command("help help")
+ assert.same(1, eval('g:foo'))
+ end)
+end)
diff --git a/test/functional/autocmd/tabclose_spec.lua b/test/functional/autocmd/tabclose_spec.lua
index 65182ad859..b7c33dc3d8 100644
--- a/test/functional/autocmd/tabclose_spec.lua
+++ b/test/functional/autocmd/tabclose_spec.lua
@@ -2,32 +2,67 @@ local helpers = require('test.functional.helpers')(after_each)
local clear, nvim, eq = helpers.clear, helpers.nvim, helpers.eq
describe('TabClosed', function()
- describe('au TabClosed', function()
- describe('with * as <afile>', function()
- it('matches when closing any tab', function()
- clear()
- nvim('command', 'au! TabClosed * echom "tabclosed:".expand("<afile>").":".expand("<amatch>").":".tabpagenr()')
- repeat
- nvim('command', 'tabnew')
- until nvim('eval', 'tabpagenr()') == 6 -- current tab is now 6
- eq("\ntabclosed:6:6:5", nvim('command_output', 'tabclose')) -- close last 6, current tab is now 5
- eq("\ntabclosed:5:5:4", nvim('command_output', 'close')) -- close last window on tab, closes tab
- eq("\ntabclosed:2:2:3", nvim('command_output', '2tabclose')) -- close tab 2, current tab is now 3
- eq("\ntabclosed:1:1:2\ntabclosed:1:1:1", nvim('command_output', 'tabonly')) -- close tabs 1 and 2
- end)
- end)
- describe('with NR as <afile>', function()
- it('matches when closing a tab whose index is NR', function()
- nvim('command', 'au! TabClosed 2 echom "tabclosed:match"')
- repeat
- nvim('command', 'tabnew')
- until nvim('eval', 'tabpagenr()') == 5 -- current tab is now 5
- -- sanity check, we shouldn't match on tabs with numbers other than 2
- eq("\ntabclosed:5:5:4", nvim('command_output', 'tabclose'))
- -- close tab page 2, current tab is now 3
- eq("\ntabclosed:2:2:3\ntabclosed:match", nvim('command_output', '2tabclose'))
- end)
- end)
+ before_each(clear)
+
+ describe('au TabClosed', function()
+ describe('with * as <afile>', function()
+ it('matches when closing any tab', function()
+ nvim('command', 'au! TabClosed * echom "tabclosed:".expand("<afile>").":".expand("<amatch>").":".tabpagenr()')
+ repeat
+ nvim('command', 'tabnew')
+ until nvim('eval', 'tabpagenr()') == 6 -- current tab is now 6
+ eq("tabclosed:6:6:5", nvim('command_output', 'tabclose')) -- close last 6, current tab is now 5
+ eq("tabclosed:5:5:4", nvim('command_output', 'close')) -- close last window on tab, closes tab
+ eq("tabclosed:2:2:3", nvim('command_output', '2tabclose')) -- close tab 2, current tab is now 3
+ eq("tabclosed:1:1:2\ntabclosed:1:1:1", nvim('command_output', 'tabonly')) -- close tabs 1 and 2
+ end)
+
+ it('is triggered when closing a window via bdelete from another tab', function()
+ nvim('command', 'au! TabClosed * echom "tabclosed:".expand("<afile>").":".expand("<amatch>").":".tabpagenr()')
+ nvim('command', '1tabedit Xtestfile')
+ nvim('command', '1tabedit Xtestfile')
+ nvim('command', 'normal! 1gt')
+ eq({1, 3}, nvim('eval', '[tabpagenr(), tabpagenr("$")]'))
+ eq("tabclosed:2:2:1\ntabclosed:2:2:1", nvim('command_output', 'bdelete Xtestfile'))
+ eq({1, 1}, nvim('eval', '[tabpagenr(), tabpagenr("$")]'))
+ end)
+
+ it('is triggered when closing a window via bdelete from current tab', function()
+ nvim('command', 'au! TabClosed * echom "tabclosed:".expand("<afile>").":".expand("<amatch>").":".tabpagenr()')
+ nvim('command', 'file Xtestfile1')
+ nvim('command', '1tabedit Xtestfile2')
+ nvim('command', '1tabedit Xtestfile2')
+
+ -- Only one tab is closed, and the alternate file is used for the other.
+ eq({2, 3}, nvim('eval', '[tabpagenr(), tabpagenr("$")]'))
+ eq("tabclosed:2:2:2", nvim('command_output', 'bdelete Xtestfile2'))
+ eq('Xtestfile1', nvim('eval', 'bufname("")'))
+ end)
+ end)
+
+ describe('with NR as <afile>', function()
+ it('matches when closing a tab whose index is NR', function()
+ nvim('command', 'au! TabClosed * echom "tabclosed:".expand("<afile>").":".expand("<amatch>").":".tabpagenr()')
+ nvim('command', 'au! TabClosed 2 echom "tabclosed:match"')
+ repeat
+ nvim('command', 'tabnew')
+ until nvim('eval', 'tabpagenr()') == 7 -- current tab is now 7
+ -- sanity check, we shouldn't match on tabs with numbers other than 2
+ eq("tabclosed:7:7:6", nvim('command_output', 'tabclose'))
+ -- close tab page 2, current tab is now 5
+ eq("tabclosed:2:2:5\ntabclosed:match", nvim('command_output', '2tabclose'))
+ end)
+ end)
+
+ describe('with close', function()
+ it('is triggered', function()
+ nvim('command', 'au! TabClosed * echom "tabclosed:".expand("<afile>").":".expand("<amatch>").":".tabpagenr()')
+ nvim('command', 'tabedit Xtestfile')
+ eq({2, 2}, nvim('eval', '[tabpagenr(), tabpagenr("$")]'))
+ eq("tabclosed:2:2:1", nvim('command_output', 'close'))
+ eq({1, 1}, nvim('eval', '[tabpagenr(), tabpagenr("$")]'))
+ end)
end)
+ end)
end)
diff --git a/test/functional/autocmd/tabnew_spec.lua b/test/functional/autocmd/tabnew_spec.lua
index 8c94dee49b..ad40954f76 100644
--- a/test/functional/autocmd/tabnew_spec.lua
+++ b/test/functional/autocmd/tabnew_spec.lua
@@ -17,12 +17,11 @@ describe('autocmd TabNew', function()
end)
it('matches when opening a new tab for FILE', function()
- local tmp_path = helpers.funcs.tempname()
command('let g:test = "foo"')
- command('autocmd! TabNew ' .. tmp_path .. ' let g:test = "bar"')
- command('tabnew ' .. tmp_path ..'X')
+ command('autocmd! TabNew Xtest-tabnew let g:test = "bar"')
+ command('tabnew Xtest-tabnewX')
eq('foo', eval('g:test'))
- command('tabnew ' .. tmp_path)
+ command('tabnew Xtest-tabnew')
eq('bar', eval('g:test'))
end)
end)
diff --git a/test/functional/autocmd/tabnewentered_spec.lua b/test/functional/autocmd/tabnewentered_spec.lua
index 7044307399..59cac07b34 100644
--- a/test/functional/autocmd/tabnewentered_spec.lua
+++ b/test/functional/autocmd/tabnewentered_spec.lua
@@ -7,15 +7,15 @@ describe('TabNewEntered', function()
it('matches when entering any new tab', function()
clear()
nvim('command', 'au! TabNewEntered * echom "tabnewentered:".tabpagenr().":".bufnr("")')
- eq("\ntabnewentered:2:2", nvim('command_output', 'tabnew'))
- eq("\n\"test.x2\" [New File]\ntabnewentered:3:3", nvim('command_output', 'tabnew test.x2'))
+ eq("tabnewentered:2:2", nvim('command_output', 'tabnew'))
+ eq("tabnewentered:3:3", nvim('command_output', 'tabnew test.x2'))
end)
end)
describe('with FILE as <afile>', function()
it('matches when opening a new tab for FILE', function()
- local tmp_path = nvim('eval', 'tempname()')
- nvim('command', 'au! TabNewEntered '..tmp_path..' echom "tabnewentered:match"')
- eq("\n\""..tmp_path.."\" [New File]\ntabnewentered:4:4\ntabnewentered:match", nvim('command_output', 'tabnew '..tmp_path))
+ nvim('command', 'au! TabNewEntered Xtest-tabnewentered echom "tabnewentered:match"')
+ eq('tabnewentered:4:4\ntabnewentered:match',
+ nvim('command_output', 'tabnew Xtest-tabnewentered'))
end)
end)
describe('with CTRL-W T', function()
@@ -24,7 +24,7 @@ describe('TabNewEntered', function()
nvim('command', 'au! TabNewEntered * echom "entered"')
nvim('command', 'tabnew test.x2')
nvim('command', 'split')
- eq('\nentered', nvim('command_output', 'execute "normal \\<C-W>T"'))
+ eq('entered', nvim('command_output', 'execute "normal \\<C-W>T"'))
end)
end)
end)
diff --git a/test/functional/autocmd/termclose_spec.lua b/test/functional/autocmd/termclose_spec.lua
index 02ea0dbd95..62eac59b16 100644
--- a/test/functional/autocmd/termclose_spec.lua
+++ b/test/functional/autocmd/termclose_spec.lua
@@ -1,44 +1,93 @@
+local luv = require('luv')
local helpers = require('test.functional.helpers')(after_each)
-local Screen = require('test.functional.ui.screen')
-local clear, execute, feed, nvim, nvim_dir = helpers.clear,
-helpers.execute, helpers.feed, helpers.nvim, helpers.nvim_dir
-local eval, eq = helpers.eval, helpers.eq
+local clear, command, nvim, nvim_dir =
+ helpers.clear, helpers.command, helpers.nvim, helpers.nvim_dir
+local eval, eq, retry =
+ helpers.eval, helpers.eq, helpers.retry
+local ok = helpers.ok
+local feed = helpers.feed
+local iswin = helpers.iswin
+
describe('TermClose event', function()
- local screen
before_each(function()
clear()
nvim('set_option', 'shell', nvim_dir .. '/shell-test')
nvim('set_option', 'shellcmdflag', 'EXE')
- screen = Screen.new(20, 4)
- screen:attach(false)
end)
- it('works as expected', function()
- execute('autocmd TermClose * echomsg "TermClose works!"')
- execute('terminal')
- feed('<c-\\><c-n>')
- screen:expect([[
- ready $ |
- [Process exited 0] |
- ^ |
- TermClose works! |
- ]])
+ it('triggers when fast-exiting terminal job stops', function()
+ command('autocmd TermClose * let g:test_termclose = 23')
+ command('terminal')
+ command('call jobstop(b:terminal_job_id)')
+ retry(nil, nil, function() eq(23, eval('g:test_termclose')) end)
+ end)
+
+ it('triggers when long-running terminal job gets stopped', function()
+ nvim('set_option', 'shell', iswin() and 'cmd.exe' or 'sh')
+ command('autocmd TermClose * let g:test_termclose = 23')
+ command('terminal')
+ command('call jobstop(b:terminal_job_id)')
+ retry(nil, nil, function() eq(23, eval('g:test_termclose')) end)
+ end)
+
+ it('kills job trapping SIGTERM', function()
+ if iswin() then return end
+ nvim('set_option', 'shell', 'sh')
+ nvim('set_option', 'shellcmdflag', '-c')
+ command([[ let g:test_job = jobstart('trap "" TERM && echo 1 && sleep 60', { ]]
+ .. [[ 'on_stdout': {-> execute('let g:test_job_started = 1')}, ]]
+ .. [[ 'on_exit': {-> execute('let g:test_job_exited = 1')}}) ]])
+ retry(nil, nil, function() eq(1, eval('get(g:, "test_job_started", 0)')) end)
+
+ luv.update_time()
+ local start = luv.now()
+ command('call jobstop(g:test_job)')
+ retry(nil, nil, function() eq(1, eval('get(g:, "test_job_exited", 0)')) end)
+ luv.update_time()
+ local duration = luv.now() - start
+ -- Nvim begins SIGTERM after KILL_TIMEOUT_MS.
+ ok(duration >= 2000)
+ ok(duration <= 4000) -- Epsilon for slow CI
+ end)
+
+ it('kills PTY job trapping SIGHUP and SIGTERM', function()
+ if iswin() then return end
+ nvim('set_option', 'shell', 'sh')
+ nvim('set_option', 'shellcmdflag', '-c')
+ command([[ let g:test_job = jobstart('trap "" HUP TERM && echo 1 && sleep 60', { ]]
+ .. [[ 'pty': 1,]]
+ .. [[ 'on_stdout': {-> execute('let g:test_job_started = 1')}, ]]
+ .. [[ 'on_exit': {-> execute('let g:test_job_exited = 1')}}) ]])
+ retry(nil, nil, function() eq(1, eval('get(g:, "test_job_started", 0)')) end)
+
+ luv.update_time()
+ local start = luv.now()
+ command('call jobstop(g:test_job)')
+ retry(nil, nil, function() eq(1, eval('get(g:, "test_job_exited", 0)')) end)
+ luv.update_time()
+ local duration = luv.now() - start
+ -- Nvim begins SIGKILL after (2 * KILL_TIMEOUT_MS).
+ ok(duration >= 4000)
+ ok(duration <= 7000) -- Epsilon for slow CI
end)
it('reports the correct <abuf>', function()
- execute('set hidden')
- execute('autocmd TermClose * let g:abuf = expand("<abuf>")')
- execute('edit foo')
- execute('edit bar')
+ command('set hidden')
+ command('autocmd TermClose * let g:abuf = expand("<abuf>")')
+ command('edit foo')
+ command('edit bar')
eq(2, eval('bufnr("%")'))
- execute('terminal')
- feed('<c-\\><c-n>')
- eq(3, eval('bufnr("%")'))
- execute('buffer 1')
- eq(1, eval('bufnr("%")'))
- execute('3bdelete!')
- eq('3', eval('g:abuf'))
+
+ command('terminal')
+ retry(nil, nil, function() eq(3, eval('bufnr("%")')) end)
+
+ command('buffer 1')
+ retry(nil, nil, function() eq(1, eval('bufnr("%")')) end)
+
+ command('3bdelete!')
+ retry(nil, nil, function() eq('3', eval('g:abuf')) end)
+ feed('<c-c>:qa!<cr>')
end)
end)
diff --git a/test/functional/autocmd/textyankpost_spec.lua b/test/functional/autocmd/textyankpost_spec.lua
index bd5f1912c5..486a3346b1 100644
--- a/test/functional/autocmd/textyankpost_spec.lua
+++ b/test/functional/autocmd/textyankpost_spec.lua
@@ -1,6 +1,6 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, eval, eq = helpers.clear, helpers.eval, helpers.eq
-local feed, execute, expect, command = helpers.feed, helpers.execute, helpers.expect, helpers.command
+local feed, command, expect = helpers.feed, helpers.command, helpers.expect
local curbufmeths, funcs, neq = helpers.curbufmeths, helpers.funcs, helpers.neq
describe('TextYankPost', function()
@@ -8,11 +8,11 @@ describe('TextYankPost', function()
clear()
-- emulate the clipboard so system clipboard isn't affected
- execute('let &rtp = "test/functional/fixtures,".&rtp')
+ command('let &rtp = "test/functional/fixtures,".&rtp')
- execute('let g:count = 0')
- execute('autocmd TextYankPost * let g:event = copy(v:event)')
- execute('autocmd TextYankPost * let g:count += 1')
+ command('let g:count = 0')
+ command('autocmd TextYankPost * let g:event = copy(v:event)')
+ command('autocmd TextYankPost * let g:count += 1')
curbufmeths.set_lines(0, -1, true, {
'foo\0bar',
@@ -61,27 +61,27 @@ describe('TextYankPost', function()
regtype = 'V'
}, eval('g:event'))
- execute('set debug=msg')
+ command('set debug=msg')
-- the regcontents should not be changed without copy.
local status, err = pcall(command,'call extend(g:event.regcontents, ["more text"])')
eq(status,false)
neq(nil, string.find(err, ':E742:'))
-- can't mutate keys inside the autocommand
- execute('autocmd! TextYankPost * let v:event.regcontents = 0')
+ command('autocmd! TextYankPost * let v:event.regcontents = 0')
status, err = pcall(command,'normal yy')
eq(status,false)
neq(nil, string.find(err, ':E46:'))
-- can't add keys inside the autocommand
- execute('autocmd! TextYankPost * let v:event.mykey = 0')
+ command('autocmd! TextYankPost * let v:event.mykey = 0')
status, err = pcall(command,'normal yy')
eq(status,false)
neq(nil, string.find(err, ':E742:'))
end)
it('is not invoked recursively', function()
- execute('autocmd TextYankPost * normal "+yy')
+ command('autocmd TextYankPost * normal "+yy')
feed('yy')
eq({
operator = 'y',
@@ -134,7 +134,7 @@ describe('TextYankPost', function()
feed('"_yy')
eq(0, eval('g:count'))
- execute('delete _')
+ command('delete _')
eq(0, eval('g:count'))
end)
@@ -155,7 +155,7 @@ describe('TextYankPost', function()
regtype = 'V'
}, eval('g:event'))
- execute("set clipboard=unnamed")
+ command("set clipboard=unnamed")
-- regname still shows the name the user requested
feed('yy')
@@ -176,7 +176,7 @@ describe('TextYankPost', function()
end)
it('works with Ex commands', function()
- execute('1delete +')
+ command('1delete +')
eq({
operator = 'd',
regcontents = { 'foo\nbar' },
@@ -185,7 +185,7 @@ describe('TextYankPost', function()
}, eval('g:event'))
eq(1, eval('g:count'))
- execute('yank')
+ command('yank')
eq({
operator = 'y',
regcontents = { 'baz text' },
@@ -194,7 +194,7 @@ describe('TextYankPost', function()
}, eval('g:event'))
eq(2, eval('g:count'))
- execute('normal yw')
+ command('normal yw')
eq({
operator = 'y',
regcontents = { 'baz ' },
@@ -203,7 +203,7 @@ describe('TextYankPost', function()
}, eval('g:event'))
eq(3, eval('g:count'))
- execute('normal! dd')
+ command('normal! dd')
eq({
operator = 'd',
regcontents = { 'baz text' },
diff --git a/test/functional/clipboard/clipboard_provider_spec.lua b/test/functional/clipboard/clipboard_provider_spec.lua
index b4febe4bfb..2bbc678a02 100644
--- a/test/functional/clipboard/clipboard_provider_spec.lua
+++ b/test/functional/clipboard/clipboard_provider_spec.lua
@@ -3,7 +3,9 @@
local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, expect, eq, eval = helpers.execute, helpers.expect, helpers.eq, helpers.eval
+local feed_command, expect, eq, eval, source = helpers.feed_command, helpers.expect, helpers.eq, helpers.eval, helpers.source
+local command = helpers.command
+local meths = helpers.meths
local function basic_register_test(noblock)
insert("some words")
@@ -80,22 +82,200 @@ local function basic_register_test(noblock)
expect("two and three and one")
end
-describe('the unnamed register', function()
- before_each(clear)
- it('works without provider', function()
+describe('clipboard', function()
+ local screen
+
+ before_each(function()
+ clear()
+ screen = Screen.new(72, 4)
+ screen:attach()
+ command("set display-=msgsep")
+ end)
+
+ it('unnamed register works without provider', function()
eq('"', eval('v:register'))
basic_register_test()
end)
+
+ it('`:redir @+>` with invalid g:clipboard shows exactly one error #7184',
+ function()
+ command("let g:clipboard = 'bogus'")
+ feed_command('redir @+> | :silent echo system("cat CONTRIBUTING.md") | redir END')
+ screen:expect([[
+ ^ |
+ ~ |
+ ~ |
+ clipboard: No provider. Try ":checkhealth" or ":h clipboard". |
+ ]], nil, {{bold = true, foreground = Screen.colors.Blue}})
+ end)
+
+ it('`:redir @+>|bogus_cmd|redir END` + invalid g:clipboard must not recurse #7184',
+ function()
+ command("let g:clipboard = 'bogus'")
+ feed_command('redir @+> | bogus_cmd | redir END')
+ screen:expect([[
+ ~ |
+ clipboard: No provider. Try ":checkhealth" or ":h clipboard". |
+ E492: Not an editor command: bogus_cmd | redir END |
+ Press ENTER or type command to continue^ |
+ ]], nil, {{bold = true, foreground = Screen.colors.Blue}})
+ end)
+
+ it('invalid g:clipboard shows hint if :redir is not active', function()
+ command("let g:clipboard = 'bogus'")
+ eq('', eval('provider#clipboard#Executable()'))
+ eq('clipboard: invalid g:clipboard', eval('provider#clipboard#Error()'))
+
+ command("let g:clipboard = 'bogus'")
+ -- Explicit clipboard attempt, should show a hint message.
+ feed_command('let @+="foo"')
+ screen:expect([[
+ ^ |
+ ~ |
+ ~ |
+ clipboard: No provider. Try ":checkhealth" or ":h clipboard". |
+ ]], nil, {{bold = true, foreground = Screen.colors.Blue}})
+ end)
+
+ it('valid g:clipboard', function()
+ -- provider#clipboard#Executable() only checks the structure.
+ meths.set_var('clipboard', {
+ ['name'] = 'clippy!',
+ ['copy'] = { ['+'] = 'any command', ['*'] = 'some other' },
+ ['paste'] = { ['+'] = 'any command', ['*'] = 'some other' },
+ })
+ eq('clippy!', eval('provider#clipboard#Executable()'))
+ eq('', eval('provider#clipboard#Error()'))
+ end)
+
+ it('g:clipboard using VimL functions', function()
+ -- Implements a fake clipboard provider. cache_enabled is meaningless here.
+ source([[let g:clipboard = {
+ \ 'name': 'custom',
+ \ 'copy': {
+ \ '+': {lines, regtype -> extend(g:, {'dummy_clipboard_plus': [lines, regtype]}) },
+ \ '*': {lines, regtype -> extend(g:, {'dummy_clipboard_star': [lines, regtype]}) },
+ \ },
+ \ 'paste': {
+ \ '+': {-> get(g:, 'dummy_clipboard_plus', [])},
+ \ '*': {-> get(g:, 'dummy_clipboard_star', [])},
+ \ },
+ \ 'cache_enabled': 1,
+ \}]])
+
+ eq('', eval('provider#clipboard#Error()'))
+ eq('custom', eval('provider#clipboard#Executable()'))
+
+ eq('', eval("getreg('*')"))
+ eq('', eval("getreg('+')"))
+
+ command('call setreg("*", "star")')
+ command('call setreg("+", "plus")')
+ eq('star', eval("getreg('*')"))
+ eq('plus', eval("getreg('+')"))
+
+ command('call setreg("*", "star", "v")')
+ eq({{'star'}, 'v'}, eval("g:dummy_clipboard_star"))
+ command('call setreg("*", "star", "V")')
+ eq({{'star', ''}, 'V'}, eval("g:dummy_clipboard_star"))
+ command('call setreg("*", "star", "b")')
+ eq({{'star', ''}, 'b'}, eval("g:dummy_clipboard_star"))
+ end)
+
+ describe('g:clipboard[paste] VimL function', function()
+ it('can return empty list for empty clipboard', function()
+ source([[let g:dummy_clipboard = []
+ let g:clipboard = {
+ \ 'name': 'custom',
+ \ 'copy': { '*': {lines, regtype -> 0} },
+ \ 'paste': { '*': {-> g:dummy_clipboard} },
+ \}]])
+ eq('', eval('provider#clipboard#Error()'))
+ eq('custom', eval('provider#clipboard#Executable()'))
+ eq('', eval("getreg('*')"))
+ end)
+
+ it('can return a list with a single string', function()
+ source([=[let g:dummy_clipboard = ['hello']
+ let g:clipboard = {
+ \ 'name': 'custom',
+ \ 'copy': { '*': {lines, regtype -> 0} },
+ \ 'paste': { '*': {-> g:dummy_clipboard} },
+ \}]=])
+ eq('', eval('provider#clipboard#Error()'))
+ eq('custom', eval('provider#clipboard#Executable()'))
+
+ eq('hello', eval("getreg('*')"))
+ source([[let g:dummy_clipboard = [''] ]])
+ eq('', eval("getreg('*')"))
+ end)
+
+ it('can return a list of lines if a regtype is provided', function()
+ source([=[let g:dummy_clipboard = [['hello'], 'v']
+ let g:clipboard = {
+ \ 'name': 'custom',
+ \ 'copy': { '*': {lines, regtype -> 0} },
+ \ 'paste': { '*': {-> g:dummy_clipboard} },
+ \}]=])
+ eq('', eval('provider#clipboard#Error()'))
+ eq('custom', eval('provider#clipboard#Executable()'))
+ eq('hello', eval("getreg('*')"))
+ end)
+
+ it('can return a list of lines instead of [lines, regtype]', function()
+ source([=[let g:dummy_clipboard = ['hello', 'v']
+ let g:clipboard = {
+ \ 'name': 'custom',
+ \ 'copy': { '*': {lines, regtype -> 0} },
+ \ 'paste': { '*': {-> g:dummy_clipboard} },
+ \}]=])
+ eq('', eval('provider#clipboard#Error()'))
+ eq('custom', eval('provider#clipboard#Executable()'))
+ eq('hello\nv', eval("getreg('*')"))
+ end)
+ end)
end)
-describe('clipboard usage', function()
+describe('clipboard', function()
+ local function reset(...)
+ clear('--cmd', 'let &rtp = "test/functional/fixtures,".&rtp', ...)
+ end
+
before_each(function()
- clear()
- execute('let &rtp = "test/functional/fixtures,".&rtp')
- execute('call getreg("*")') -- force load of provider
+ reset()
+ feed_command('call getreg("*")') -- force load of provider
+ end)
+
+ it('`:redir @+>` invokes clipboard once-per-message', function()
+ eq(0, eval("g:clip_called_set"))
+ feed_command('redir @+> | :silent echo system("cat CONTRIBUTING.md") | redir END')
+ -- Assuming CONTRIBUTING.md has >100 lines.
+ assert(eval("g:clip_called_set") > 100)
+ end)
+
+ it('`:redir @">` does NOT invoke clipboard', function()
+ -- :redir to a non-clipboard register, with `:set clipboard=unnamed` does
+ -- NOT propagate to the clipboard. This is consistent with Vim.
+ command("set clipboard=unnamedplus")
+ eq(0, eval("g:clip_called_set"))
+ feed_command('redir @"> | :silent echo system("cat CONTRIBUTING.md") | redir END')
+ eq(0, eval("g:clip_called_set"))
end)
- it('has independent "* and unnamed registers per default', function()
+ it('`:redir @+>|bogus_cmd|redir END` must not recurse #7184',
+ function()
+ local screen = Screen.new(72, 4)
+ screen:attach()
+ feed_command('redir @+> | bogus_cmd | redir END')
+ screen:expect([[
+ ^ |
+ ~ |
+ ~ |
+ E492: Not an editor command: bogus_cmd | redir END |
+ ]], nil, {{bold = true, foreground = Screen.colors.Blue}})
+ end)
+
+ it('has independent "* and unnamed registers by default', function()
insert("some words")
feed('^"*dwdw"*P')
expect('some ')
@@ -136,9 +316,9 @@ describe('clipboard usage', function()
eq({'some\ntext', '\nvery binary\n'}, eval("getreg('*', 1, 1)"))
end)
- it('support autodectection of regtype', function()
- execute("let g:test_clip['*'] = ['linewise stuff','']")
- execute("let g:test_clip['+'] = ['charwise','stuff']")
+ it('autodetects regtype', function()
+ feed_command("let g:test_clip['*'] = ['linewise stuff','']")
+ feed_command("let g:test_clip['+'] = ['charwise','stuff']")
eq("V", eval("getregtype('*')"))
eq("v", eval("getregtype('+')"))
insert("just some text")
@@ -153,7 +333,7 @@ describe('clipboard usage', function()
insert([[
much
text]])
- execute("let g:test_clip['*'] = [['very','block'],'b']")
+ feed_command("let g:test_clip['*'] = [['very','block'],'b']")
feed('gg"*P')
expect([[
very much
@@ -166,16 +346,16 @@ describe('clipboard usage', function()
eq({{' much', 'ktext', ''}, 'b'}, eval("g:test_clip['+']"))
end)
- it('supports setreg', function()
- execute('call setreg("*", "setted\\ntext", "c")')
- execute('call setreg("+", "explicitly\\nlines", "l")')
+ it('supports setreg()', function()
+ feed_command('call setreg("*", "setted\\ntext", "c")')
+ feed_command('call setreg("+", "explicitly\\nlines", "l")')
feed('"+P"*p')
expect([[
esetted
textxplicitly
lines
]])
- execute('call setreg("+", "blocky\\nindeed", "b")')
+ feed_command('call setreg("+", "blocky\\nindeed", "b")')
feed('"+p')
expect([[
esblockyetted
@@ -184,14 +364,14 @@ describe('clipboard usage', function()
]])
end)
- it('supports let @+ (issue #1427)', function()
- execute("let @+ = 'some'")
- execute("let @* = ' other stuff'")
+ it('supports :let @+ (issue #1427)', function()
+ feed_command("let @+ = 'some'")
+ feed_command("let @* = ' other stuff'")
eq({{'some'}, 'v'}, eval("g:test_clip['+']"))
eq({{' other stuff'}, 'v'}, eval("g:test_clip['*']"))
feed('"+p"*p')
expect('some other stuff')
- execute("let @+ .= ' more'")
+ feed_command("let @+ .= ' more'")
feed('dd"+p')
expect('some more')
end)
@@ -199,7 +379,7 @@ describe('clipboard usage', function()
it('pastes unnamed register if the provider fails', function()
insert('the text')
feed('yy')
- execute("let g:cliperror = 1")
+ feed_command("let g:cliperror = 1")
feed('"*p')
expect([[
the text
@@ -211,7 +391,7 @@ describe('clipboard usage', function()
-- the basic behavior of unnamed register should be the same
-- even when handled by clipboard provider
before_each(function()
- execute('set clipboard=unnamed')
+ feed_command('set clipboard=unnamed')
end)
it('works', function()
@@ -219,7 +399,7 @@ describe('clipboard usage', function()
end)
it('works with pure text clipboard', function()
- execute("let g:cliplossy = 1")
+ feed_command("let g:cliplossy = 1")
-- expect failure for block mode
basic_register_test(true)
end)
@@ -234,7 +414,7 @@ describe('clipboard usage', function()
-- "+ shouldn't have changed
eq({''}, eval("g:test_clip['+']"))
- execute("let g:test_clip['*'] = ['linewise stuff','']")
+ feed_command("let g:test_clip['*'] = ['linewise stuff','']")
feed('p')
expect([[
words
@@ -244,7 +424,7 @@ describe('clipboard usage', function()
it('does not clobber "0 when pasting', function()
insert('a line')
feed('yy')
- execute("let g:test_clip['*'] = ['b line','']")
+ feed_command("let g:test_clip['*'] = ['b line','']")
feed('"0pp"0p')
expect([[
a line
@@ -255,20 +435,20 @@ describe('clipboard usage', function()
it('supports v:register and getreg() without parameters', function()
eq('*', eval('v:register'))
- execute("let g:test_clip['*'] = [['some block',''], 'b']")
+ feed_command("let g:test_clip['*'] = [['some block',''], 'b']")
eq('some block', eval('getreg()'))
eq('\02210', eval('getregtype()'))
end)
it('yanks visual selection when pasting', function()
insert("indeed visual")
- execute("let g:test_clip['*'] = [['clipboard'], 'c']")
+ feed_command("let g:test_clip['*'] = [['clipboard'], 'c']")
feed("viwp")
eq({{'visual'}, 'v'}, eval("g:test_clip['*']"))
expect("indeed clipboard")
-- explicit "* should do the same
- execute("let g:test_clip['*'] = [['star'], 'c']")
+ feed_command("let g:test_clip['*'] = [['star'], 'c']")
feed('viw"*p')
eq({{'clipboard'}, 'v'}, eval("g:test_clip['*']"))
expect("indeed star")
@@ -277,7 +457,7 @@ describe('clipboard usage', function()
it('unamed operations work even if the provider fails', function()
insert('the text')
feed('yy')
- execute("let g:cliperror = 1")
+ feed_command("let g:cliperror = 1")
feed('p')
expect([[
the text
@@ -291,23 +471,31 @@ describe('clipboard usage', function()
match
text
]])
- execute('g/match/d')
+ feed_command('g/match/d')
eq('match\n', eval('getreg("*")'))
feed('u')
eval('setreg("*", "---")')
- execute('g/test/')
+ feed_command('g/test/')
feed('<esc>')
eq('---', eval('getreg("*")'))
end)
+ it('works in the cmdline window', function()
+ feed('q:itext<esc>yy')
+ eq({{'text', ''}, 'V'}, eval("g:test_clip['*']"))
+ command("let g:test_clip['*'] = [['star'], 'c']")
+ feed('p')
+ eq('textstar', meths.get_current_line())
+ end)
end)
- describe('with clipboard=unnamedplus', function()
+ describe('clipboard=unnamedplus', function()
before_each(function()
- execute('set clipboard=unnamedplus')
+ feed_command('set clipboard=unnamedplus')
end)
it('links the "+ and unnamed registers', function()
+ eq('+', eval('v:register'))
insert("one two")
feed('^"+dwdw"+P')
expect('two')
@@ -316,13 +504,13 @@ describe('clipboard usage', function()
-- "* shouldn't have changed
eq({''}, eval("g:test_clip['*']"))
- execute("let g:test_clip['+'] = ['three']")
+ feed_command("let g:test_clip['+'] = ['three']")
feed('p')
expect('twothree')
end)
it('and unnamed, yanks to both', function()
- execute('set clipboard=unnamedplus,unnamed')
+ feed_command('set clipboard=unnamedplus,unnamed')
insert([[
really unnamed
text]])
@@ -335,8 +523,9 @@ describe('clipboard usage', function()
eq({{'really unnamed', ''}, 'V'}, eval("g:test_clip['*']"))
-- unnamedplus takes predecence when pasting
- execute("let g:test_clip['+'] = ['the plus','']")
- execute("let g:test_clip['*'] = ['the star','']")
+ eq('+', eval('v:register'))
+ feed_command("let g:test_clip['+'] = ['the plus','']")
+ feed_command("let g:test_clip['*'] = ['the star','']")
feed("p")
expect([[
text
@@ -344,6 +533,7 @@ describe('clipboard usage', function()
really unnamed
the plus]])
end)
+
it('is updated on global changes', function()
insert([[
text
@@ -351,25 +541,32 @@ describe('clipboard usage', function()
match
text
]])
- execute('g/match/d')
+ feed_command('g/match/d')
eq('match\n', eval('getreg("+")'))
feed('u')
eval('setreg("+", "---")')
- execute('g/test/')
+ feed_command('g/test/')
feed('<esc>')
eq('---', eval('getreg("+")'))
end)
end)
+ it('sets v:register after startup', function()
+ reset()
+ eq('"', eval('v:register'))
+ reset('--cmd', 'set clipboard=unnamed')
+ eq('*', eval('v:register'))
+ end)
+
it('supports :put', function()
insert("a line")
- execute("let g:test_clip['*'] = ['some text']")
- execute("let g:test_clip['+'] = ['more', 'text', '']")
- execute(":put *")
+ feed_command("let g:test_clip['*'] = ['some text']")
+ feed_command("let g:test_clip['+'] = ['more', 'text', '']")
+ feed_command(":put *")
expect([[
a line
some text]])
- execute(":put +")
+ feed_command(":put +")
expect([[
a line
some text
@@ -380,14 +577,14 @@ describe('clipboard usage', function()
it('supports "+ and "* in registers', function()
local screen = Screen.new(60, 10)
screen:attach()
- execute("let g:test_clip['*'] = ['some', 'star data','']")
- execute("let g:test_clip['+'] = ['such', 'plus', 'stuff']")
- execute("registers")
+ feed_command("let g:test_clip['*'] = ['some', 'star data','']")
+ feed_command("let g:test_clip['+'] = ['such', 'plus', 'stuff']")
+ feed_command("registers")
screen:expect([[
- ~ |
- ~ |
- ~ |
- ~ |
+ |
+ {0:~ }|
+ {0:~ }|
+ {4: }|
:registers |
{1:--- Registers ---} |
"* some{2:^J}star data{2:^J} |
@@ -395,10 +592,11 @@ describe('clipboard usage', function()
": let g:test_clip['+'] = ['such', 'plus', 'stuff'] |
{3:Press ENTER or type command to continue}^ |
]], {
+ [0] = {bold = true, foreground = Screen.colors.Blue},
[1] = {bold = true, foreground = Screen.colors.Fuchsia},
[2] = {foreground = Screen.colors.Blue},
- [3] = {bold = true, foreground = Screen.colors.SeaGreen}},
- {{bold = true, foreground = Screen.colors.Blue}})
+ [3] = {bold = true, foreground = Screen.colors.SeaGreen},
+ [4] = {bold = true, reverse = true}})
feed('<cr>') -- clear out of Press ENTER screen
end)
@@ -406,17 +604,17 @@ describe('clipboard usage', function()
insert('s/s/t/')
feed('gg"*y$:<c-r>*<cr>')
expect('t/s/t/')
- execute("let g:test_clip['*'] = ['s/s/u']")
+ feed_command("let g:test_clip['*'] = ['s/s/u']")
feed(':<c-r>*<cr>')
expect('t/u/t/')
end)
it('supports :redir @*>', function()
- execute("let g:test_clip['*'] = ['stuff']")
- execute('redir @*>')
+ feed_command("let g:test_clip['*'] = ['stuff']")
+ feed_command('redir @*>')
-- it is made empty
eq({{''}, 'v'}, eval("g:test_clip['*']"))
- execute('let g:test = doesnotexist')
+ feed_command('let g:test = doesnotexist')
feed('<cr>')
eq({{
'',
@@ -424,7 +622,7 @@ describe('clipboard usage', function()
'E121: Undefined variable: doesnotexist',
'E15: Invalid expression: doesnotexist',
}, 'v'}, eval("g:test_clip['*']"))
- execute(':echo "Howdy!"')
+ feed_command(':echo "Howdy!"')
eq({{
'',
'',
@@ -436,6 +634,8 @@ describe('clipboard usage', function()
end)
it('handles middleclick correctly', function()
+ feed_command('set mouse=a')
+
local screen = Screen.new(30, 5)
screen:attach()
insert([[
@@ -457,7 +657,7 @@ describe('clipboard usage', function()
the a target]])
-- on error, fall back to unnamed register
- execute("let g:cliperror = 1")
+ feed_command("let g:cliperror = 1")
feed('<MiddleMouse><6,1>')
expect([[
the source
diff --git a/test/functional/cmdline/ctrl_r_spec.lua b/test/functional/cmdline/ctrl_r_spec.lua
new file mode 100644
index 0000000000..d2dad23e98
--- /dev/null
+++ b/test/functional/cmdline/ctrl_r_spec.lua
@@ -0,0 +1,34 @@
+local helpers = require('test.functional.helpers')(after_each)
+local clear, insert, funcs, eq, feed =
+ helpers.clear, helpers.insert, helpers.funcs, helpers.eq, helpers.feed
+
+describe('cmdline CTRL-R', function()
+ before_each(clear)
+
+ it('pasting non-special register inserts <CR> *between* lines', function()
+ insert([[
+ line1abc
+ line2somemoretext
+ ]])
+ -- Yank 2 lines linewise, then paste to cmdline.
+ feed([[<C-\><C-N>gg0yj:<C-R>0]])
+ -- <CR> inserted between lines, NOT after the final line.
+ eq('line1abc\rline2somemoretext', funcs.getcmdline())
+
+ -- Yank 2 lines characterwise, then paste to cmdline.
+ feed([[<C-\><C-N>gg05lyvj:<C-R>0]])
+ -- <CR> inserted between lines, NOT after the final line.
+ eq('abc\rline2', funcs.getcmdline())
+
+ -- Yank 1 line linewise, then paste to cmdline.
+ feed([[<C-\><C-N>ggyy:<C-R>0]])
+ -- No <CR> inserted.
+ eq('line1abc', funcs.getcmdline())
+ end)
+
+ it('pasting special register inserts <CR>, <NL>', function()
+ feed([[:<C-R>="foo\nbar\rbaz"<CR>]])
+ eq('foo\nbar\rbaz', funcs.getcmdline())
+ end)
+end)
+
diff --git a/test/functional/ex_getln/history_spec.lua b/test/functional/cmdline/history_spec.lua
index c1d2ffda53..20f9cf06a2 100644
--- a/test/functional/ex_getln/history_spec.lua
+++ b/test/functional/cmdline/history_spec.lua
@@ -6,7 +6,7 @@ describe('history support code', function()
before_each(clear)
it('correctly clears start of the history', function()
- -- Regression test: check absense of the memory leak when clearing start of
+ -- Regression test: check absense of the memory leak when clearing start of
-- the history using ex_getln.c/clr_history().
eq(1, funcs.histadd(':', 'foo'))
eq(1, funcs.histdel(':'))
@@ -14,7 +14,7 @@ describe('history support code', function()
end)
it('correctly clears end of the history', function()
- -- Regression test: check absense of the memory leak when clearing end of
+ -- Regression test: check absense of the memory leak when clearing end of
-- the history using ex_getln.c/clr_history().
meths.set_option('history', 1)
eq(1, funcs.histadd(':', 'foo'))
@@ -23,8 +23,8 @@ describe('history support code', function()
end)
it('correctly removes item from history', function()
- -- Regression test: check that ex_getln.c/del_history_idx() correctly clears
- -- history index after removing history entry. If it does not then deleting
+ -- Regression test: check that ex_getln.c/del_history_idx() correctly clears
+ -- history index after removing history entry. If it does not then deleting
-- history will result in a double free.
eq(1, funcs.histadd(':', 'foo'))
eq(1, funcs.histadd(':', 'bar'))
diff --git a/test/functional/core/channels_spec.lua b/test/functional/core/channels_spec.lua
new file mode 100644
index 0000000000..7b89172f92
--- /dev/null
+++ b/test/functional/core/channels_spec.lua
@@ -0,0 +1,279 @@
+
+local helpers = require('test.functional.helpers')(after_each)
+local clear, eq, eval, next_msg, ok, source = helpers.clear, helpers.eq,
+ helpers.eval, helpers.next_msg, helpers.ok, helpers.source
+local command, funcs, meths = helpers.command, helpers.funcs, helpers.meths
+local sleep = helpers.sleep
+local spawn, nvim_argv = helpers.spawn, helpers.nvim_argv
+local set_session = helpers.set_session
+local nvim_prog = helpers.nvim_prog
+local retry = helpers.retry
+local expect_twostreams = helpers.expect_twostreams
+
+describe('channels', function()
+ local init = [[
+ function! Normalize(data) abort
+ " Windows: remove ^M
+ return type([]) == type(a:data)
+ \ ? map(a:data, 'substitute(v:val, "\r", "", "g")')
+ \ : a:data
+ endfunction
+ function! OnEvent(id, data, event) dict
+ call rpcnotify(1, a:event, a:id, a:data)
+ endfunction
+ ]]
+ before_each(function()
+ clear()
+ source(init)
+ end)
+
+ pending('can connect to socket', function()
+ local server = spawn(nvim_argv)
+ set_session(server)
+ local address = funcs.serverlist()[1]
+ local client = spawn(nvim_argv)
+ set_session(client, true)
+ source(init)
+
+ meths.set_var('address', address)
+ command("let g:id = sockconnect('pipe', address, {'on_data':'OnEvent'})")
+ local id = eval("g:id")
+ ok(id > 0)
+
+ command("call chansend(g:id, msgpackdump([[2,'nvim_set_var',['code',23]]]))")
+ set_session(server, true)
+ retry(nil, 1000, function()
+ eq(23, meths.get_var('code'))
+ end)
+ set_session(client, true)
+
+ command("call chansend(g:id, msgpackdump([[0,0,'nvim_eval',['2+3']]]))")
+
+
+ local res = eval("msgpackdump([[1,0,v:null,5]])")
+ eq({"\148\001\n\192\005"}, res)
+ eq({'notification', 'data', {id, res}}, next_msg())
+ command("call chansend(g:id, msgpackdump([[2,'nvim_command',['quit']]]))")
+ eq({'notification', 'data', {id, {''}}}, next_msg())
+ end)
+
+ it('can use stdio channel', function()
+ source([[
+ let g:job_opts = {
+ \ 'on_stdout': function('OnEvent'),
+ \ 'on_stderr': function('OnEvent'),
+ \ 'on_exit': function('OnEvent'),
+ \ }
+ ]])
+ meths.set_var("nvim_prog", nvim_prog)
+ meths.set_var("code", [[
+ function! OnEvent(id, data, event) dict
+ let text = string([a:id, a:data, a:event])
+ call chansend(g:x, text)
+
+ if a:data == ['']
+ call chansend(v:stderr, "*dies*")
+ quit
+ endif
+ endfunction
+ let g:x = stdioopen({'on_stdin':'OnEvent'})
+ call chansend(x, "hello")
+ ]])
+ command("let g:id = jobstart([ g:nvim_prog, '-u', 'NONE', '-i', 'NONE', '--cmd', 'set noswapfile', '--headless', '--cmd', g:code], g:job_opts)")
+ local id = eval("g:id")
+ ok(id > 0)
+
+ eq({ "notification", "stdout", {id, { "hello" } } }, next_msg())
+
+ command("call chansend(id, 'howdy')")
+ eq({"notification", "stdout", {id, {"[1, ['howdy'], 'stdin']"}}}, next_msg())
+
+ command("call chanclose(id, 'stdin')")
+ expect_twostreams({{"notification", "stdout", {id, {"[1, [''], 'stdin']"}}},
+ {'notification', 'stdout', {id, {''}}}},
+ {{"notification", "stderr", {id, {"*dies*"}}},
+ {'notification', 'stderr', {id, {''}}}})
+ eq({"notification", "exit", {3,0}}, next_msg())
+ end)
+
+ local function expect_twoline(id, stream, line1, line2, nobr)
+ local msg = next_msg()
+ local joined = nobr and {line1..line2} or {line1, line2}
+ if not pcall(eq, {"notification", stream, {id, joined}}, msg) then
+ local sep = (not nobr) and "" or nil
+ eq({"notification", stream, {id, {line1, sep}}}, msg)
+ eq({"notification", stream, {id, {line2}}}, next_msg())
+ end
+ end
+
+ it('can use stdio channel with pty', function()
+ if helpers.pending_win32(pending) then return end
+ source([[
+ let g:job_opts = {
+ \ 'on_stdout': function('OnEvent'),
+ \ 'on_exit': function('OnEvent'),
+ \ 'pty': v:true,
+ \ }
+ ]])
+ meths.set_var("nvim_prog", nvim_prog)
+ meths.set_var("code", [[
+ function! OnEvent(id, data, event) dict
+ let text = string([a:id, a:data, a:event])
+ call chansend(g:x, text)
+ endfunction
+ let g:x = stdioopen({'on_stdin':'OnEvent'})
+ ]])
+ command("let g:id = jobstart([ g:nvim_prog, '-u', 'NONE', '-i', 'NONE', '--cmd', 'set noswapfile', '--headless', '--cmd', g:code], g:job_opts)")
+ local id = eval("g:id")
+ ok(id > 0)
+
+ command("call chansend(id, 'TEXT\n')")
+ expect_twoline(id, "stdout", "TEXT\r", "[1, ['TEXT', ''], 'stdin']")
+
+
+ command("call chansend(id, 'neovan')")
+ eq({"notification", "stdout", {id, {"neovan"}}}, next_msg())
+ command("call chansend(id, '\127\127im\n')")
+ expect_twoline(id, "stdout", "\b \b\b \bim\r", "[1, ['neovim', ''], 'stdin']")
+
+ command("call chansend(id, 'incomplet\004')")
+
+ local is_freebsd = eval("system('uname') =~? 'FreeBSD'") == 1
+ local bsdlike = is_freebsd or (helpers.os_name() == "osx")
+ print("bsdlike:", bsdlike)
+ local extra = bsdlike and "^D\008\008" or ""
+ expect_twoline(id, "stdout",
+ "incomplet"..extra, "[1, ['incomplet'], 'stdin']", true)
+
+
+ command("call chansend(id, '\004')")
+ if bsdlike then
+ expect_twoline(id, "stdout", extra, "[1, [''], 'stdin']", true)
+ else
+ eq({"notification", "stdout", {id, {"[1, [''], 'stdin']"}}}, next_msg())
+ end
+
+ -- channel is still open
+ command("call chansend(id, 'hi again!\n')")
+ eq({"notification", "stdout", {id, {"hi again!\r", ""}}}, next_msg())
+ end)
+
+
+ it('stdio channel can use rpc and stderr simultaneously', function()
+ if helpers.pending_win32(pending) then return end
+ source([[
+ let g:job_opts = {
+ \ 'on_stderr': function('OnEvent'),
+ \ 'on_exit': function('OnEvent'),
+ \ 'rpc': v:true,
+ \ }
+ ]])
+ meths.set_var("nvim_prog", nvim_prog)
+ meths.set_var("code", [[
+ let id = stdioopen({'rpc':v:true})
+ call rpcnotify(id,"nvim_call_function", "rpcnotify", [1, "message", "hi there!", id])
+ call chansend(v:stderr, "trouble!")
+ ]])
+ command("let id = jobstart([ g:nvim_prog, '-u', 'NONE', '-i', 'NONE', '--cmd', 'set noswapfile', '--headless', '--cmd', g:code], g:job_opts)")
+ eq({"notification", "message", {"hi there!", 1}}, next_msg())
+ eq({"notification", "stderr", {3, {"trouble!"}}}, next_msg())
+
+ eq(30, eval("rpcrequest(id, 'nvim_eval', '[chansend(v:stderr, \"math??\"), 5*6][1]')"))
+ eq({"notification", "stderr", {3, {"math??"}}}, next_msg())
+
+ local _, err = pcall(command,"call rpcrequest(id, 'nvim_command', 'call chanclose(v:stderr, \"stdin\")')")
+ ok(string.find(err,"E906: invalid stream for channel") ~= nil)
+
+ eq(1, eval("rpcrequest(id, 'nvim_eval', 'chanclose(v:stderr, \"stderr\")')"))
+ eq({"notification", "stderr", {3, {""}}}, next_msg())
+
+ command("call rpcnotify(id, 'nvim_command', 'quit')")
+ eq({"notification", "exit", {3, 0}}, next_msg())
+ end)
+
+ it('can use buffered output mode', function()
+ source([[
+ let g:job_opts = {
+ \ 'on_stdout': function('OnEvent'),
+ \ 'on_exit': function('OnEvent'),
+ \ 'stdout_buffered': v:true,
+ \ }
+ ]])
+ command("let id = jobstart(['grep', '^[0-9]'], g:job_opts)")
+ local id = eval("g:id")
+
+ command([[call chansend(id, "stuff\n10 PRINT \"NVIM\"\nxx")]])
+ sleep(10)
+ command([[call chansend(id, "xx\n20 GOTO 10\nzz\n")]])
+ command("call chanclose(id, 'stdin')")
+
+ eq({"notification", "stdout", {id, {'10 PRINT "NVIM"',
+ '20 GOTO 10', ''}}}, next_msg())
+ eq({"notification", "exit", {id, 0}}, next_msg())
+
+ command("let id = jobstart(['grep', '^[0-9]'], g:job_opts)")
+ id = eval("g:id")
+
+ command([[call chansend(id, "is no number\nnot at all")]])
+ command("call chanclose(id, 'stdin')")
+
+ -- works correctly with no output
+ eq({"notification", "stdout", {id, {''}}}, next_msg())
+ eq({"notification", "exit", {id, 1}}, next_msg())
+
+ end)
+
+ it('can use buffered output mode with no stream callback', function()
+ source([[
+ function! OnEvent(id, data, event) dict
+ call rpcnotify(1, a:event, a:id, a:data, self.stdout)
+ endfunction
+ let g:job_opts = {
+ \ 'on_exit': function('OnEvent'),
+ \ 'stdout_buffered': v:true,
+ \ }
+ ]])
+ command("let id = jobstart(['grep', '^[0-9]'], g:job_opts)")
+ local id = eval("g:id")
+
+ command([[call chansend(id, "stuff\n10 PRINT \"NVIM\"\nxx")]])
+ sleep(10)
+ command([[call chansend(id, "xx\n20 GOTO 10\nzz\n")]])
+ command("call chanclose(id, 'stdin')")
+
+ eq({"notification", "exit", {id, 0, {'10 PRINT "NVIM"',
+ '20 GOTO 10', ''}}}, next_msg())
+
+ -- if dict is reused the new value is not stored,
+ -- but nvim also does not crash
+ command("let id = jobstart(['cat'], g:job_opts)")
+ id = eval("g:id")
+
+ command([[call chansend(id, "cat text\n")]])
+ sleep(10)
+ command("call chanclose(id, 'stdin')")
+
+ -- old value was not overwritten
+ eq({"notification", "exit", {id, 0, {'10 PRINT "NVIM"',
+ '20 GOTO 10', ''}}}, next_msg())
+
+ -- and an error was thrown.
+ eq("E5210: dict key 'stdout' already set for buffered stream in channel "..id, eval('v:errmsg'))
+
+ -- reset dictionary
+ source([[
+ let g:job_opts = {
+ \ 'on_exit': function('OnEvent'),
+ \ 'stdout_buffered': v:true,
+ \ }
+ ]])
+ command("let id = jobstart(['grep', '^[0-9]'], g:job_opts)")
+ id = eval("g:id")
+
+ command([[call chansend(id, "is no number\nnot at all")]])
+ command("call chanclose(id, 'stdin')")
+
+ -- works correctly with no output
+ eq({"notification", "exit", {id, 1, {''}}}, next_msg())
+ end)
+end)
diff --git a/test/functional/core/exit_spec.lua b/test/functional/core/exit_spec.lua
new file mode 100644
index 0000000000..80c65e4544
--- /dev/null
+++ b/test/functional/core/exit_spec.lua
@@ -0,0 +1,98 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local command = helpers.command
+local feed_command = helpers.feed_command
+local eval = helpers.eval
+local eq = helpers.eq
+local run = helpers.run
+local funcs = helpers.funcs
+local nvim_prog = helpers.nvim_prog
+local redir_exec = helpers.redir_exec
+local wait = helpers.wait
+
+describe('v:exiting', function()
+ local cid
+
+ before_each(function()
+ helpers.clear()
+ cid = helpers.nvim('get_api_info')[1]
+ end)
+
+ it('defaults to v:null', function()
+ eq(1, eval('v:exiting is v:null'))
+ end)
+
+ it('is 0 on normal exit', function()
+ local function on_setup()
+ command('autocmd VimLeavePre * call rpcrequest('..cid..', "")')
+ command('autocmd VimLeave * call rpcrequest('..cid..', "")')
+ command('quit')
+ end
+ local function on_request()
+ eq(0, eval('v:exiting'))
+ return ''
+ end
+ run(on_request, nil, on_setup)
+ end)
+ it('is 0 on exit from ex-mode involving try-catch', function()
+ local function on_setup()
+ command('autocmd VimLeavePre * call rpcrequest('..cid..', "")')
+ command('autocmd VimLeave * call rpcrequest('..cid..', "")')
+ feed_command('call feedkey("Q")','try', 'call NoFunction()', 'catch', 'echo "bye"', 'endtry', 'quit')
+ end
+ local function on_request()
+ eq(0, eval('v:exiting'))
+ return ''
+ end
+ run(on_request, nil, on_setup)
+ end)
+end)
+
+describe(':cquit', function()
+ local function test_cq(cmdline, exit_code, redir_msg)
+ if redir_msg then
+ eq('\n' .. redir_msg, redir_exec(cmdline))
+ wait()
+ eq(2, eval("1+1")) -- Still alive?
+ else
+ funcs.system({nvim_prog, '-u', 'NONE', '-i', 'NONE', '--headless', '--cmd', cmdline})
+ eq(exit_code, eval('v:shell_error'))
+ end
+ end
+
+ before_each(function()
+ helpers.clear()
+ end)
+
+ it('exits with non-zero after :cquit', function()
+ test_cq('cquit', 1, nil)
+ end)
+
+ it('exits with non-zero after :cquit 123', function()
+ test_cq('cquit 123', 123, nil)
+ end)
+
+ it('exits with non-zero after :123 cquit', function()
+ test_cq('123 cquit', 123, nil)
+ end)
+
+ it('exits with 0 after :cquit 0', function()
+ test_cq('cquit 0', 0, nil)
+ end)
+
+ it('exits with 0 after :0 cquit', function()
+ test_cq('0 cquit', 0, nil)
+ end)
+
+ it('exits with redir msg for multiple exit codes after :cquit 1 2', function()
+ test_cq('cquit 1 2', nil, 'E488: Trailing characters: cquit 1 2')
+ end)
+
+ it('exits with redir msg for non-number exit code after :cquit X', function()
+ test_cq('cquit X', nil, 'E488: Trailing characters: cquit X')
+ end)
+
+ it('exits with redir msg for negative exit code after :cquit -1', function()
+ test_cq('cquit -1', nil, 'E488: Trailing characters: cquit -1')
+ end)
+end)
diff --git a/test/functional/core/fileio_spec.lua b/test/functional/core/fileio_spec.lua
new file mode 100644
index 0000000000..09533e4e60
--- /dev/null
+++ b/test/functional/core/fileio_spec.lua
@@ -0,0 +1,68 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local clear = helpers.clear
+local command = helpers.command
+local eq = helpers.eq
+local feed = helpers.feed
+local funcs = helpers.funcs
+local nvim_prog = helpers.nvim_prog
+local request = helpers.request
+local retry = helpers.retry
+local rmdir = helpers.rmdir
+local sleep = helpers.sleep
+
+describe('fileio', function()
+ before_each(function()
+ end)
+ after_each(function()
+ command(':qall!')
+ os.remove('Xtest_startup_shada')
+ os.remove('Xtest_startup_file1')
+ os.remove('Xtest_startup_file2')
+ rmdir('Xtest_startup_swapdir')
+ end)
+
+ it('fsync() codepaths #8304', function()
+ clear({ args={ '-i', 'Xtest_startup_shada',
+ '--cmd', 'set directory=Xtest_startup_swapdir' } })
+
+ -- These cases ALWAYS force fsync (regardless of 'fsync' option):
+
+ -- 1. Idle (CursorHold) with modified buffers (+ 'swapfile').
+ command('write Xtest_startup_file1')
+ feed('ifoo<esc>h')
+ command('write')
+ eq(0, request('nvim__stats').fsync) -- 'nofsync' is the default.
+ command('set swapfile')
+ command('set updatetime=1')
+ feed('izub<esc>h') -- File is 'modified'.
+ sleep(3) -- Allow 'updatetime' to expire.
+ retry(3, nil, function()
+ eq(1, request('nvim__stats').fsync)
+ end)
+ command('set updatetime=9999')
+
+ -- 2. Exit caused by deadly signal (+ 'swapfile').
+ local j = funcs.jobstart({ nvim_prog, '-u', 'NONE', '-i',
+ 'Xtest_startup_shada', '--headless',
+ '-c', 'set swapfile',
+ '-c', 'write Xtest_startup_file2',
+ '-c', 'put =localtime()', })
+ sleep(10) -- Let Nvim start.
+ funcs.jobstop(j) -- Send deadly signal.
+
+ -- 3. SIGPWR signal.
+ -- ??
+
+ -- 4. Explicit :preserve command.
+ command('preserve')
+ eq(2, request('nvim__stats').fsync)
+
+ -- 5. Enable 'fsync' option, write file.
+ command('set fsync')
+ feed('ibaz<esc>h')
+ command('write')
+ eq(4, request('nvim__stats').fsync)
+ end)
+end)
+
diff --git a/test/functional/core/job_spec.lua b/test/functional/core/job_spec.lua
new file mode 100644
index 0000000000..eb02610df0
--- /dev/null
+++ b/test/functional/core/job_spec.lua
@@ -0,0 +1,881 @@
+local helpers = require('test.functional.helpers')(after_each)
+local clear, eq, eval, exc_exec, feed_command, feed, insert, neq, next_msg, nvim,
+ nvim_dir, ok, source, write_file, mkdir, rmdir = helpers.clear,
+ helpers.eq, helpers.eval, helpers.exc_exec, helpers.feed_command, helpers.feed,
+ helpers.insert, helpers.neq, helpers.next_msg, helpers.nvim,
+ helpers.nvim_dir, helpers.ok, helpers.source,
+ helpers.write_file, helpers.mkdir, helpers.rmdir
+local command = helpers.command
+local funcs = helpers.funcs
+local retry = helpers.retry
+local meths = helpers.meths
+local NIL = helpers.NIL
+local wait = helpers.wait
+local iswin = helpers.iswin
+local get_pathsep = helpers.get_pathsep
+local pathroot = helpers.pathroot
+local nvim_set = helpers.nvim_set
+local expect_twostreams = helpers.expect_twostreams
+local expect_msg_seq = helpers.expect_msg_seq
+local expect_err = helpers.expect_err
+local Screen = require('test.functional.ui.screen')
+
+-- Kill process with given pid
+local function os_kill(pid)
+ return os.execute((iswin()
+ and 'taskkill /f /t /pid '..pid..' > nul'
+ or 'kill -9 '..pid..' > /dev/null'))
+end
+
+describe('jobs', function()
+ local channel
+
+ before_each(function()
+ clear()
+ channel = nvim('get_api_info')[1]
+ nvim('set_var', 'channel', channel)
+ source([[
+ function! Normalize(data) abort
+ " Windows: remove ^M
+ return type([]) == type(a:data)
+ \ ? map(a:data, 'substitute(v:val, "\r", "", "g")')
+ \ : a:data
+ endfunction
+ function! OnEvent(id, data, event) dict
+ let userdata = get(self, 'user')
+ let data = Normalize(a:data)
+ call rpcnotify(g:channel, a:event, userdata, data)
+ endfunction
+ let g:job_opts = {
+ \ 'on_stdout': function('OnEvent'),
+ \ 'on_exit': function('OnEvent'),
+ \ 'user': 0
+ \ }
+ ]])
+ end)
+
+ it('uses &shell and &shellcmdflag if passed a string', function()
+ nvim('command', "let $VAR = 'abc'")
+ if iswin() then
+ nvim('command', "let j = jobstart('echo %VAR%', g:job_opts)")
+ else
+ nvim('command', "let j = jobstart('echo $VAR', g:job_opts)")
+ end
+ eq({'notification', 'stdout', {0, {'abc', ''}}}, next_msg())
+ eq({'notification', 'stdout', {0, {''}}}, next_msg())
+ eq({'notification', 'exit', {0, 0}}, next_msg())
+ end)
+
+ it('changes to given / directory', function()
+ nvim('command', "let g:job_opts.cwd = '/'")
+ if iswin() then
+ nvim('command', "let j = jobstart('cd', g:job_opts)")
+ else
+ nvim('command', "let j = jobstart('pwd', g:job_opts)")
+ end
+ eq({'notification', 'stdout',
+ {0, {pathroot(), ''}}}, next_msg())
+ eq({'notification', 'stdout', {0, {''}}}, next_msg())
+ eq({'notification', 'exit', {0, 0}}, next_msg())
+ end)
+
+ it('changes to given `cwd` directory', function()
+ local dir = eval("resolve(tempname())"):gsub("/", get_pathsep())
+ mkdir(dir)
+ nvim('command', "let g:job_opts.cwd = '" .. dir .. "'")
+ if iswin() then
+ nvim('command', "let j = jobstart('cd', g:job_opts)")
+ else
+ nvim('command', "let j = jobstart('pwd', g:job_opts)")
+ end
+ expect_msg_seq(
+ { {'notification', 'stdout', {0, {dir, ''} } },
+ {'notification', 'stdout', {0, {''} } },
+ {'notification', 'exit', {0, 0} }
+ },
+ -- Alternative sequence:
+ { {'notification', 'stdout', {0, {dir} } },
+ {'notification', 'stdout', {0, {'', ''} } },
+ {'notification', 'stdout', {0, {''} } },
+ {'notification', 'exit', {0, 0} }
+ }
+ )
+ rmdir(dir)
+ end)
+
+ it('fails to change to invalid `cwd`', function()
+ local dir = eval('resolve(tempname())."-bogus"')
+ local _, err = pcall(function()
+ nvim('command', "let g:job_opts.cwd = '" .. dir .. "'")
+ if iswin() then
+ nvim('command', "let j = jobstart('cd', g:job_opts)")
+ else
+ nvim('command', "let j = jobstart('pwd', g:job_opts)")
+ end
+ end)
+ ok(string.find(err, "E475: Invalid argument: expected valid directory$") ~= nil)
+ end)
+
+ it('produces error when using non-executable `cwd`', function()
+ if iswin() then return end -- N/A for Windows
+
+ local dir = 'Xtest_not_executable_dir'
+ mkdir(dir)
+ funcs.setfperm(dir, 'rw-------')
+ expect_err('E475: Invalid argument: expected valid directory$', nvim,
+ 'command', "call jobstart('pwd', {'cwd': '" .. dir .. "'})")
+ rmdir(dir)
+ end)
+
+ it('returns 0 when it fails to start', function()
+ eq("", eval("v:errmsg"))
+ feed_command("let g:test_jobid = jobstart([])")
+ eq(0, eval("g:test_jobid"))
+ eq("E474:", string.match(eval("v:errmsg"), "E%d*:"))
+ end)
+
+ it('returns -1 when target is not executable #5465', function()
+ local function new_job()
+ return eval([[jobstart('')]])
+ end
+ local executable_jobid = new_job()
+ local nonexecutable_jobid = eval("jobstart(['"..(iswin()
+ and './test/functional/fixtures'
+ or './test/functional/fixtures/non_executable.txt').."'])")
+ eq(-1, nonexecutable_jobid)
+ -- Should _not_ throw an error.
+ eq("", eval("v:errmsg"))
+ -- Non-executable job should not increment the job ids. #5465
+ eq(executable_jobid + 1, new_job())
+ end)
+
+ it('invokes callbacks when the job writes and exits', function()
+ nvim('command', "let g:job_opts.on_stderr = function('OnEvent')")
+ nvim('command', [[call jobstart(has('win32') ? 'echo:' : 'echo', g:job_opts)]])
+ expect_twostreams({{'notification', 'stdout', {0, {'', ''}}},
+ {'notification', 'stdout', {0, {''}}}},
+ {{'notification', 'stderr', {0, {''}}}})
+ eq({'notification', 'exit', {0, 0}}, next_msg())
+ end)
+
+ it('allows interactive commands', function()
+ nvim('command', "let j = jobstart(has('win32') ? ['find', '/v', ''] : ['cat', '-'], g:job_opts)")
+ neq(0, eval('j'))
+ nvim('command', 'call jobsend(j, "abc\\n")')
+ eq({'notification', 'stdout', {0, {'abc', ''}}}, next_msg())
+ nvim('command', 'call jobsend(j, "123\\nxyz\\n")')
+ expect_msg_seq(
+ { {'notification', 'stdout', {0, {'123', 'xyz', ''}}}
+ },
+ -- Alternative sequence:
+ { {'notification', 'stdout', {0, {'123', ''}}},
+ {'notification', 'stdout', {0, {'xyz', ''}}}
+ }
+ )
+ nvim('command', 'call jobsend(j, [123, "xyz", ""])')
+ expect_msg_seq(
+ { {'notification', 'stdout', {0, {'123', 'xyz', ''}}}
+ },
+ -- Alternative sequence:
+ { {'notification', 'stdout', {0, {'123', ''}}},
+ {'notification', 'stdout', {0, {'xyz', ''}}}
+ }
+ )
+ nvim('command', "call jobstop(j)")
+ eq({'notification', 'stdout', {0, {''}}}, next_msg())
+ eq({'notification', 'exit', {0, 0}}, next_msg())
+ end)
+
+ it('preserves NULs', function()
+ if helpers.pending_win32(pending) then return end -- TODO: Need `cat`.
+ -- Make a file with NULs in it.
+ local filename = helpers.tmpname()
+ write_file(filename, "abc\0def\n")
+
+ nvim('command', "let j = jobstart(['cat', '"..filename.."'], g:job_opts)")
+ eq({'notification', 'stdout', {0, {'abc\ndef', ''}}}, next_msg())
+ eq({'notification', 'stdout', {0, {''}}}, next_msg())
+ eq({'notification', 'exit', {0, 0}}, next_msg())
+ os.remove(filename)
+
+ -- jobsend() preserves NULs.
+ nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
+ nvim('command', [[call jobsend(j, ["123\n456",""])]])
+ eq({'notification', 'stdout', {0, {'123\n456', ''}}}, next_msg())
+ nvim('command', "call jobstop(j)")
+ end)
+
+ it("will not buffer data if it doesn't end in newlines", function()
+ if helpers.pending_win32(pending) then return end -- TODO: Need `cat`.
+ if os.getenv("TRAVIS") and os.getenv("CC") == "gcc-4.9"
+ and helpers.os_name() == "osx" then
+ -- XXX: Hangs Travis macOS since e9061117a5b8f195c3f26a5cb94e18ddd7752d86.
+ pending("[Hangs on Travis macOS. #5002]", function() end)
+ return
+ end
+
+ nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
+ nvim('command', 'call jobsend(j, "abc\\nxyz")')
+ eq({'notification', 'stdout', {0, {'abc', 'xyz'}}}, next_msg())
+ nvim('command', "call jobstop(j)")
+ eq({'notification', 'stdout', {0, {''}}}, next_msg())
+ eq({'notification', 'exit', {0, 0}}, next_msg())
+ end)
+
+ it('preserves newlines', function()
+ if helpers.pending_win32(pending) then return end -- TODO: Need `cat`.
+ nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
+ nvim('command', 'call jobsend(j, "a\\n\\nc\\n\\n\\n\\nb\\n\\n")')
+ eq({'notification', 'stdout',
+ {0, {'a', '', 'c', '', '', '', 'b', '', ''}}}, next_msg())
+ end)
+
+ it('preserves NULs', function()
+ if helpers.pending_win32(pending) then return end -- TODO: Need `cat`.
+ nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
+ nvim('command', 'call jobsend(j, ["\n123\n", "abc\\nxyz\n", ""])')
+ eq({'notification', 'stdout', {0, {'\n123\n', 'abc\nxyz\n', ''}}},
+ next_msg())
+ nvim('command', "call jobstop(j)")
+ eq({'notification', 'stdout', {0, {''}}}, next_msg())
+ eq({'notification', 'exit', {0, 0}}, next_msg())
+ end)
+
+ it('avoids sending final newline', function()
+ if helpers.pending_win32(pending) then return end -- TODO: Need `cat`.
+ nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
+ nvim('command', 'call jobsend(j, ["some data", "without\nfinal nl"])')
+ eq({'notification', 'stdout', {0, {'some data', 'without\nfinal nl'}}},
+ next_msg())
+ nvim('command', "call jobstop(j)")
+ eq({'notification', 'stdout', {0, {''}}}, next_msg())
+ eq({'notification', 'exit', {0, 0}}, next_msg())
+ end)
+
+ it('closes the job streams with jobclose', function()
+ nvim('command', "let j = jobstart(has('win32') ? ['find', '/v', ''] : ['cat', '-'], g:job_opts)")
+ nvim('command', 'call jobclose(j, "stdin")')
+ eq({'notification', 'stdout', {0, {''}}}, next_msg())
+ eq({'notification', 'exit', {0, iswin() and 1 or 0}}, next_msg())
+ end)
+
+ it("disallows jobsend on a job that closed stdin", function()
+ nvim('command', "let j = jobstart(has('win32') ? ['find', '/v', ''] : ['cat', '-'], g:job_opts)")
+ nvim('command', 'call jobclose(j, "stdin")')
+ eq(false, pcall(function()
+ nvim('command', 'call jobsend(j, ["some data"])')
+ end))
+ end)
+
+ it('disallows jobsend/stop on a non-existent job', function()
+ eq(false, pcall(eval, "jobsend(-1, 'lol')"))
+ eq(false, pcall(eval, "jobstop(-1)"))
+ end)
+
+ it('disallows jobstop twice on the same job', function()
+ nvim('command', "let j = jobstart(has('win32') ? ['find', '/v', ''] : ['cat', '-'], g:job_opts)")
+ neq(0, eval('j'))
+ eq(true, pcall(eval, "jobstop(j)"))
+ eq(false, pcall(eval, "jobstop(j)"))
+ end)
+
+ it('will not leak memory if we leave a job running', function()
+ nvim('command', "call jobstart(['cat', '-'], g:job_opts)")
+ end)
+
+ it('can get the pid value using getpid', function()
+ nvim('command', "let j = jobstart(has('win32') ? ['find', '/v', ''] : ['cat', '-'], g:job_opts)")
+ local pid = eval('jobpid(j)')
+ neq(NIL, meths.get_proc(pid))
+ nvim('command', 'call jobstop(j)')
+ eq({'notification', 'stdout', {0, {''}}}, next_msg())
+ if iswin() then
+ expect_msg_seq(
+ -- win64
+ { {'notification', 'exit', {0, 1}}
+ },
+ -- win32
+ { {'notification', 'exit', {0, 15}}
+ }
+ )
+ else
+ eq({'notification', 'exit', {0, 0}}, next_msg())
+ end
+ eq(NIL, meths.get_proc(pid))
+ end)
+
+ it("do not survive the exit of nvim", function()
+ -- use sleep, which doesn't die on stdin close
+ nvim('command', "let g:j = jobstart(has('win32') ? ['ping', '-n', '1001', '127.0.0.1'] : ['sleep', '1000'], g:job_opts)")
+ local pid = eval('jobpid(g:j)')
+ neq(NIL, meths.get_proc(pid))
+ clear()
+ eq(NIL, meths.get_proc(pid))
+ end)
+
+ it('can survive the exit of nvim with "detach"', function()
+ nvim('command', 'let g:job_opts.detach = 1')
+ nvim('command', "let g:j = jobstart(has('win32') ? ['ping', '-n', '1001', '127.0.0.1'] : ['sleep', '1000'], g:job_opts)")
+ local pid = eval('jobpid(g:j)')
+ neq(NIL, meths.get_proc(pid))
+ clear()
+ neq(NIL, meths.get_proc(pid))
+ -- clean up after ourselves
+ eq(0, os_kill(pid))
+ end)
+
+ it('can pass user data to the callback', function()
+ nvim('command', 'let g:job_opts.user = {"n": 5, "s": "str", "l": [1]}')
+ nvim('command', [[call jobstart('echo foo', g:job_opts)]])
+ local data = {n = 5, s = 'str', l = {1}}
+ expect_msg_seq(
+ { {'notification', 'stdout', {data, {'foo', ''}}},
+ {'notification', 'stdout', {data, {''}}},
+ },
+ -- Alternative sequence:
+ { {'notification', 'stdout', {data, {'foo'}}},
+ {'notification', 'stdout', {data, {'', ''}}},
+ {'notification', 'stdout', {data, {''}}},
+ }
+ )
+ eq({'notification', 'exit', {data, 0}}, next_msg())
+ end)
+
+ it('can omit data callbacks', function()
+ nvim('command', 'unlet g:job_opts.on_stdout')
+ nvim('command', 'let g:job_opts.user = 5')
+ nvim('command', [[call jobstart('echo foo', g:job_opts)]])
+ eq({'notification', 'exit', {5, 0}}, next_msg())
+ end)
+
+ it('can omit exit callback', function()
+ nvim('command', 'unlet g:job_opts.on_exit')
+ nvim('command', 'let g:job_opts.user = 5')
+ nvim('command', [[call jobstart('echo foo', g:job_opts)]])
+ expect_msg_seq(
+ { {'notification', 'stdout', {5, {'foo', ''} } },
+ {'notification', 'stdout', {5, {''} } },
+ },
+ -- Alternative sequence:
+ { {'notification', 'stdout', {5, {'foo'} } },
+ {'notification', 'stdout', {5, {'', ''} } },
+ {'notification', 'stdout', {5, {''} } },
+ }
+ )
+ end)
+
+ it('will pass return code with the exit event', function()
+ nvim('command', 'let g:job_opts.user = 5')
+ nvim('command', "call jobstart('exit 55', g:job_opts)")
+ eq({'notification', 'stdout', {5, {''}}}, next_msg())
+ eq({'notification', 'exit', {5, 55}}, next_msg())
+ end)
+
+ it('can receive dictionary functions', function()
+ source([[
+ let g:dict = {'id': 10}
+ function g:dict.on_exit(id, code, event)
+ call rpcnotify(g:channel, a:event, a:code, self.id)
+ endfunction
+ call jobstart('exit 45', g:dict)
+ ]])
+ eq({'notification', 'exit', {45, 10}}, next_msg())
+ end)
+
+ it('can redefine callbacks being used by a job', function()
+ local screen = Screen.new()
+ screen:attach()
+ screen:set_default_attr_ids({
+ [1] = {bold=true, foreground=Screen.colors.Blue},
+ })
+ source([[
+ function! g:JobHandler(job_id, data, event)
+ endfunction
+
+ let g:callbacks = {
+ \ 'on_stdout': function('g:JobHandler'),
+ \ 'on_stderr': function('g:JobHandler'),
+ \ 'on_exit': function('g:JobHandler')
+ \ }
+ let job = jobstart(['cat', '-'], g:callbacks)
+ ]])
+ wait()
+ source([[
+ function! g:JobHandler(job_id, data, event)
+ endfunction
+ ]])
+
+ eq("", eval("v:errmsg"))
+ end)
+
+ it('requires funcrefs for script-local (s:) functions', function()
+ local screen = Screen.new(60, 5)
+ screen:attach()
+ screen:set_default_attr_ids({
+ [1] = {bold = true, foreground = Screen.colors.Blue1},
+ [2] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
+ [3] = {bold = true, foreground = Screen.colors.SeaGreen4}
+ })
+
+ -- Pass job callback names _without_ `function(...)`.
+ source([[
+ function! s:OnEvent(id, data, event) dict
+ let g:job_result = get(self, 'user')
+ endfunction
+ let s:job = jobstart('echo "foo"', {
+ \ 'on_stdout': 's:OnEvent',
+ \ 'on_stderr': 's:OnEvent',
+ \ 'on_exit': 's:OnEvent',
+ \ })
+ ]])
+
+ screen:expect{any="{2:E120: Using <SID> not in a script context: s:OnEvent}"}
+ end)
+
+ it('does not repeat output with slow output handlers', function()
+ source([[
+ let d = {'data': []}
+ function! d.on_stdout(job, data, event) dict
+ call add(self.data, Normalize(a:data))
+ sleep 200m
+ endfunction
+ if has('win32')
+ let cmd = 'for /L %I in (1,1,5) do @(echo %I& ping -n 2 127.0.0.1 > nul)'
+ else
+ let cmd = ['sh', '-c', 'for i in $(seq 1 5); do echo $i; sleep 0.1; done']
+ endif
+ call jobwait([jobstart(cmd, d)])
+ ]])
+
+ local expected = {'1', '2', '3', '4', '5', ''}
+ local chunks = eval('d.data')
+ local received = {''}
+ for i, chunk in ipairs(chunks) do
+ if i < #chunks then
+ -- if chunks got joined, a spurious [''] callback was not sent
+ neq({''}, chunk)
+ else
+ -- but EOF callback is still sent
+ eq({''}, chunk)
+ end
+ received[#received] = received[#received]..chunk[1]
+ for j = 2, #chunk do
+ received[#received+1] = chunk[j]
+ end
+ end
+ eq(expected, received)
+ end)
+
+ it('jobstart() works with partial functions', function()
+ source([[
+ function PrintArgs(a1, a2, id, data, event)
+ " Windows: remove ^M
+ let normalized = map(a:data, 'substitute(v:val, "\r", "", "g")')
+ call rpcnotify(g:channel, '1', a:a1, a:a2, normalized, a:event)
+ endfunction
+ let Callback = function('PrintArgs', ["foo", "bar"])
+ let g:job_opts = {'on_stdout': Callback}
+ call jobstart('echo some text', g:job_opts)
+ ]])
+ expect_msg_seq(
+ { {'notification', '1', {'foo', 'bar', {'some text', ''}, 'stdout'}},
+ },
+ -- Alternative sequence:
+ { {'notification', '1', {'foo', 'bar', {'some text'}, 'stdout'}},
+ {'notification', '1', {'foo', 'bar', {'', ''}, 'stdout'}},
+ }
+ )
+ end)
+
+ it('jobstart() works with closures', function()
+ source([[
+ fun! MkFun()
+ let a1 = 'foo'
+ let a2 = 'bar'
+ return {id, data, event -> rpcnotify(g:channel, '1', a1, a2, Normalize(data), event)}
+ endfun
+ let g:job_opts = {'on_stdout': MkFun()}
+ call jobstart('echo some text', g:job_opts)
+ ]])
+ expect_msg_seq(
+ { {'notification', '1', {'foo', 'bar', {'some text', ''}, 'stdout'}},
+ },
+ -- Alternative sequence:
+ { {'notification', '1', {'foo', 'bar', {'some text'}, 'stdout'}},
+ {'notification', '1', {'foo', 'bar', {'', ''}, 'stdout'}},
+ }
+ )
+ end)
+
+ it('jobstart() works when closure passed directly to `jobstart`', function()
+ source([[
+ let g:job_opts = {'on_stdout': {id, data, event -> rpcnotify(g:channel, '1', 'foo', 'bar', Normalize(data), event)}}
+ call jobstart('echo some text', g:job_opts)
+ ]])
+ expect_msg_seq(
+ { {'notification', '1', {'foo', 'bar', {'some text', ''}, 'stdout'}},
+ },
+ -- Alternative sequence:
+ { {'notification', '1', {'foo', 'bar', {'some text'}, 'stdout'}},
+ {'notification', '1', {'foo', 'bar', {'', ''}, 'stdout'}},
+ }
+ )
+ end)
+
+ describe('jobwait', function()
+ before_each(function()
+ if iswin() then
+ helpers.set_shell_powershell()
+ end
+ end)
+
+ it('returns a list of status codes', function()
+ source([[
+ call rpcnotify(g:channel, 'wait', jobwait(has('win32') ? [
+ \ jobstart('Start-Sleep -Milliseconds 100; exit 4'),
+ \ jobstart('Start-Sleep -Milliseconds 300; exit 5'),
+ \ jobstart('Start-Sleep -Milliseconds 500; exit 6'),
+ \ jobstart('Start-Sleep -Milliseconds 700; exit 7')
+ \ ] : [
+ \ jobstart('sleep 0.10; exit 4'),
+ \ jobstart('sleep 0.110; exit 5'),
+ \ jobstart('sleep 0.210; exit 6'),
+ \ jobstart('sleep 0.310; exit 7')
+ \ ]))
+ ]])
+ eq({'notification', 'wait', {{4, 5, 6, 7}}}, next_msg())
+ end)
+
+ it('will run callbacks while waiting', function()
+ source([[
+ let g:dict = {'id': 10}
+ let g:exits = 0
+ function g:dict.on_exit(id, code, event)
+ if a:code != 5
+ throw 'Error!'
+ endif
+ let g:exits += 1
+ endfunction
+ call jobwait(has('win32') ? [
+ \ jobstart('Start-Sleep -Milliseconds 100; exit 5', g:dict),
+ \ jobstart('Start-Sleep -Milliseconds 300; exit 5', g:dict),
+ \ jobstart('Start-Sleep -Milliseconds 500; exit 5', g:dict),
+ \ jobstart('Start-Sleep -Milliseconds 700; exit 5', g:dict)
+ \ ] : [
+ \ jobstart('sleep 0.010; exit 5', g:dict),
+ \ jobstart('sleep 0.030; exit 5', g:dict),
+ \ jobstart('sleep 0.050; exit 5', g:dict),
+ \ jobstart('sleep 0.070; exit 5', g:dict)
+ \ ])
+ call rpcnotify(g:channel, 'wait', g:exits)
+ ]])
+ eq({'notification', 'wait', {4}}, next_msg())
+ end)
+
+ it('will return status codes in the order of passed ids', function()
+ source([[
+ call rpcnotify(g:channel, 'wait', jobwait(has('win32') ? [
+ \ jobstart('Start-Sleep -Milliseconds 700; exit 4'),
+ \ jobstart('Start-Sleep -Milliseconds 500; exit 5'),
+ \ jobstart('Start-Sleep -Milliseconds 300; exit 6'),
+ \ jobstart('Start-Sleep -Milliseconds 100; exit 7')
+ \ ] : [
+ \ jobstart('sleep 0.070; exit 4'),
+ \ jobstart('sleep 0.050; exit 5'),
+ \ jobstart('sleep 0.030; exit 6'),
+ \ jobstart('sleep 0.010; exit 7')
+ \ ]))
+ ]])
+ eq({'notification', 'wait', {{4, 5, 6, 7}}}, next_msg())
+ end)
+
+ it('will return -3 for invalid job ids', function()
+ source([[
+ call rpcnotify(g:channel, 'wait', jobwait([
+ \ -10,
+ \ jobstart((has('win32') ? 'Start-Sleep -Milliseconds 100' : 'sleep 0.01').'; exit 5'),
+ \ ]))
+ ]])
+ eq({'notification', 'wait', {{-3, 5}}}, next_msg())
+ end)
+
+ it('will return -2 when interrupted without timeout', function()
+ feed_command('call rpcnotify(g:channel, "ready") | '..
+ 'call rpcnotify(g:channel, "wait", '..
+ 'jobwait([jobstart("'..
+ (iswin() and 'Start-Sleep 10' or 'sleep 10')..
+ '; exit 55")]))')
+ eq({'notification', 'ready', {}}, next_msg())
+ feed('<c-c>')
+ eq({'notification', 'wait', {{-2}}}, next_msg())
+ end)
+
+ it('will return -2 when interrupted with timeout', function()
+ feed_command('call rpcnotify(g:channel, "ready") | '..
+ 'call rpcnotify(g:channel, "wait", '..
+ 'jobwait([jobstart("'..
+ (iswin() and 'Start-Sleep 10' or 'sleep 10')..
+ '; exit 55")], 10000))')
+ eq({'notification', 'ready', {}}, next_msg())
+ feed('<c-c>')
+ eq({'notification', 'wait', {{-2}}}, next_msg())
+ end)
+
+ it('can be called recursively', function()
+ if helpers.pending_win32(pending) then return end -- TODO: Need `cat`.
+ source([[
+ let g:opts = {}
+ let g:counter = 0
+ function g:opts.on_stdout(id, msg, _event)
+ if self.state == 0
+ if self.counter < 10
+ call Run()
+ endif
+ let self.state = 1
+ call jobsend(a:id, "line1\n")
+ elseif self.state == 1
+ let self.state = 2
+ call jobsend(a:id, "line2\n")
+ elseif self.state == 2
+ let self.state = 3
+ call jobsend(a:id, "line3\n")
+ elseif self.state == 3
+ let self.state = 4
+ call rpcnotify(g:channel, 'w', printf('job %d closed', self.counter))
+ call jobclose(a:id, 'stdin')
+ endif
+ endfunction
+ function g:opts.on_exit(...)
+ call rpcnotify(g:channel, 'w', printf('job %d exited', self.counter))
+ endfunction
+ function Run()
+ let g:counter += 1
+ let j = copy(g:opts)
+ let j.state = 0
+ let j.counter = g:counter
+ call jobwait([
+ \ jobstart('echo ready; cat -', j),
+ \ ])
+ endfunction
+ ]])
+ feed_command('call Run()')
+ local r
+ for i = 10, 1, -1 do
+ r = next_msg()
+ eq('job '..i..' closed', r[3][1])
+ r = next_msg()
+ eq('job '..i..' exited', r[3][1])
+ end
+ eq(10, nvim('eval', 'g:counter'))
+ end)
+
+ describe('with timeout argument', function()
+ it('will return -1 if the wait timed out', function()
+ source([[
+ call rpcnotify(g:channel, 'wait', jobwait([
+ \ jobstart('exit 4'),
+ \ jobstart((has('win32') ? 'Start-Sleep 10' : 'sleep 10').'; exit 5'),
+ \ ], has('win32') ? 6000 : 100))
+ ]])
+ eq({'notification', 'wait', {{4, -1}}}, next_msg())
+ end)
+
+ it('can pass 0 to check if a job exists', function()
+ source([[
+ call rpcnotify(g:channel, 'wait', jobwait(has('win32') ? [
+ \ jobstart('Start-Sleep -Milliseconds 50; exit 4'),
+ \ jobstart('Start-Sleep -Milliseconds 300; exit 5'),
+ \ ] : [
+ \ jobstart('sleep 0.05; exit 4'),
+ \ jobstart('sleep 0.3; exit 5'),
+ \ ], 0))
+ ]])
+ eq({'notification', 'wait', {{-1, -1}}}, next_msg())
+ end)
+ end)
+ end)
+
+ -- FIXME need to wait until jobsend succeeds before calling jobstop
+ pending('will only emit the "exit" event after "stdout" and "stderr"', function()
+ nvim('command', "let g:job_opts.on_stderr = function('s:OnEvent')")
+ nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
+ local jobid = nvim('eval', 'j')
+ nvim('eval', 'jobsend(j, "abcdef")')
+ nvim('eval', 'jobstop(j)')
+ eq({'notification', 'j', {0, {jobid, 'stdout', {'abcdef'}}}}, next_msg())
+ eq({'notification', 'j', {0, {jobid, 'exit'}}}, next_msg())
+ end)
+
+ it('cannot have both rpc and pty options', function()
+ command("let g:job_opts.pty = v:true")
+ command("let g:job_opts.rpc = v:true")
+ local _, err = pcall(command, "let j = jobstart(has('win32') ? ['find', '/v', ''] : ['cat', '-'], g:job_opts)")
+ ok(string.find(err, "E475: Invalid argument: job cannot have both 'pty' and 'rpc' options set") ~= nil)
+ end)
+
+ it('does not crash when repeatedly failing to start shell', function()
+ source([[
+ set shell=nosuchshell
+ func! DoIt()
+ call jobstart('true')
+ call jobstart('true')
+ endfunc
+ ]])
+ -- The crash only triggered if both jobs are cleaned up on the same event
+ -- loop tick. This is also prevented by try-block, so feed must be used.
+ feed_command("call DoIt()")
+ feed('<cr>') -- press RETURN
+ eq(2,eval('1+1'))
+ end)
+
+ it('jobstop() kills entire process tree #6530', function()
+ -- XXX: Using `nvim` isn't a good test, it reaps its children on exit.
+ -- local c = 'call jobstart([v:progpath, "-u", "NONE", "-i", "NONE", "--headless"])'
+ -- local j = eval("jobstart([v:progpath, '-u', 'NONE', '-i', 'NONE', '--headless', '-c', '"
+ -- ..c.."', '-c', '"..c.."'])")
+
+ -- Create child with several descendants.
+ local sleep_cmd = (iswin()
+ and 'ping -n 31 127.0.0.1'
+ or 'sleep 30')
+ local j = eval("jobstart('"..sleep_cmd..' | '..sleep_cmd..' | '..sleep_cmd.."')")
+ local ppid = funcs.jobpid(j)
+ local children
+ retry(nil, nil, function()
+ children = meths.get_proc_children(ppid)
+ eq((iswin() and 4 or 3), #children)
+ end)
+ -- Assert that nvim_get_proc() sees the children.
+ for _, child_pid in ipairs(children) do
+ local info = meths.get_proc(child_pid)
+ -- eq((iswin() and 'nvim.exe' or 'nvim'), info.name)
+ eq(ppid, info.ppid)
+ end
+ -- Kill the root of the tree.
+ funcs.jobstop(j)
+ -- Assert that the children were killed.
+ retry(nil, nil, function()
+ for _, child_pid in ipairs(children) do
+ eq(NIL, meths.get_proc(child_pid))
+ end
+ end)
+ end)
+
+ describe('running tty-test program', function()
+ if helpers.pending_win32(pending) then return end
+ local function next_chunk()
+ local rv
+ while true do
+ local msg = next_msg()
+ local data = msg[3][2]
+ for i = 1, #data do
+ data[i] = data[i]:gsub('\n', '\000')
+ end
+ rv = table.concat(data, '\n')
+ rv = rv:gsub('\r\n$', ''):gsub('^\r\n', '')
+ if rv ~= '' then
+ break
+ end
+ end
+ return rv
+ end
+
+ local function send(str)
+ nvim('command', 'call jobsend(j, "'..str..'")')
+ end
+
+ before_each(function()
+ -- Redefine Normalize() so that TTY data is not munged.
+ source([[
+ function! Normalize(data) abort
+ return a:data
+ endfunction
+ ]])
+ local ext = iswin() and '.exe' or ''
+ insert(nvim_dir..'/tty-test'..ext) -- Full path to tty-test.
+ nvim('command', 'let g:job_opts.pty = 1')
+ nvim('command', 'let exec = [expand("<cfile>:p")]')
+ nvim('command', "let j = jobstart(exec, g:job_opts)")
+ eq('tty ready', next_chunk())
+ end)
+
+ it('echoing input', function()
+ send('test')
+ eq('test', next_chunk())
+ end)
+
+ it('resizing window', function()
+ nvim('command', 'call jobresize(j, 40, 10)')
+ eq('rows: 10, cols: 40', next_chunk())
+ nvim('command', 'call jobresize(j, 10, 40)')
+ eq('rows: 40, cols: 10', next_chunk())
+ end)
+
+ it('jobclose() sends SIGHUP', function()
+ nvim('command', 'call jobclose(j)')
+ local msg = next_msg()
+ msg = (msg[2] == 'stdout') and next_msg() or msg -- Skip stdout, if any.
+ eq({'notification', 'exit', {0, 42}}, msg)
+ end)
+
+ it('jobstart() does not keep ptmx file descriptor open', function()
+ -- Start another job (using libuv)
+ command('let g:job_opts.pty = 0')
+ local other_jobid = eval("jobstart(['cat', '-'], g:job_opts)")
+ local other_pid = eval('jobpid(' .. other_jobid .. ')')
+
+ -- Other job doesn't block first job from recieving SIGHUP on jobclose()
+ command('call jobclose(j)')
+ -- Have to wait so that the SIGHUP can be processed by tty-test on time.
+ -- Can't wait for the next message in case this test fails, if it fails
+ -- there won't be any more messages, and the test would hang.
+ helpers.sleep(100)
+ local err = exc_exec('call jobpid(j)')
+ eq('Vim(call):E900: Invalid channel id', err)
+
+ -- cleanup
+ eq(other_pid, eval('jobpid(' .. other_jobid .. ')'))
+ command('call jobstop(' .. other_jobid .. ')')
+ end)
+ end)
+end)
+
+describe("pty process teardown", function()
+ local screen
+ before_each(function()
+ clear()
+ screen = Screen.new(30, 6)
+ screen:attach()
+ screen:expect([[
+ ^ |
+ ~ |
+ ~ |
+ ~ |
+ ~ |
+ |
+ ]])
+ end)
+ after_each(function()
+ screen:detach()
+ end)
+
+ it("does not prevent/delay exit. #4798 #4900", function()
+ if helpers.pending_win32(pending) then return end
+ -- Use a nested nvim (in :term) to test without --headless.
+ feed_command(":terminal '"..helpers.nvim_prog
+ .."' -u NONE -i NONE --cmd '"..nvim_set.."' "
+ -- Use :term again in the _nested_ nvim to get a PTY process.
+ -- Use `sleep` to simulate a long-running child of the PTY.
+ .."+terminal +'!(sleep 300 &)' +qa")
+
+ -- Exiting should terminate all descendants (PTY, its children, ...).
+ screen:expect([[
+ ^ |
+ [Process exited 0] |
+ |
+ |
+ |
+ |
+ ]])
+ end)
+end)
diff --git a/test/functional/core/main_spec.lua b/test/functional/core/main_spec.lua
new file mode 100644
index 0000000000..a0981e9207
--- /dev/null
+++ b/test/functional/core/main_spec.lua
@@ -0,0 +1,131 @@
+local lfs = require('lfs')
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+
+local eq = helpers.eq
+local feed = helpers.feed
+local eval = helpers.eval
+local clear = helpers.clear
+local funcs = helpers.funcs
+local nvim_prog = helpers.nvim_prog
+local write_file = helpers.write_file
+
+local function nvim_prog_abs()
+ -- system(['build/bin/nvim']) does not work for whatever reason. It needs to
+ -- either be executable searched in $PATH or something starting with / or ./.
+ if nvim_prog:match('[/\\]') then
+ return funcs.fnamemodify(nvim_prog, ':p')
+ else
+ return nvim_prog
+ end
+end
+
+describe('Command-line option', function()
+ describe('-s', function()
+ local fname = 'Xtest-functional-core-main-s'
+ local fname_2 = fname .. '.2'
+ local nonexistent_fname = fname .. '.nonexistent'
+ local dollar_fname = '$' .. fname
+ before_each(function()
+ clear()
+ os.remove(fname)
+ os.remove(dollar_fname)
+ end)
+ after_each(function()
+ os.remove(fname)
+ os.remove(dollar_fname)
+ end)
+ it('treats - as stdin', function()
+ eq(nil, lfs.attributes(fname))
+ funcs.system(
+ {nvim_prog_abs(), '-u', 'NONE', '-i', 'NONE', '--headless',
+ '--cmd', 'set noswapfile shortmess+=IFW fileformats=unix',
+ '-s', '-', fname},
+ {':call setline(1, "42")', ':wqall!', ''})
+ eq(0, eval('v:shell_error'))
+ local attrs = lfs.attributes(fname)
+ eq(#('42\n'), attrs.size)
+ end)
+ it('does not expand $VAR', function()
+ eq(nil, lfs.attributes(fname))
+ eq(true, not not dollar_fname:find('%$%w+'))
+ write_file(dollar_fname, ':call setline(1, "100500")\n:wqall!\n')
+ funcs.system(
+ {nvim_prog_abs(), '-u', 'NONE', '-i', 'NONE', '--headless',
+ '--cmd', 'set noswapfile shortmess+=IFW fileformats=unix',
+ '-s', dollar_fname, fname})
+ eq(0, eval('v:shell_error'))
+ local attrs = lfs.attributes(fname)
+ eq(#('100500\n'), attrs.size)
+ end)
+ it('does not crash after reading from stdin in non-headless mode', function()
+ if helpers.pending_win32(pending) then return end
+ local screen = Screen.new(40, 8)
+ screen:attach()
+ funcs.termopen({
+ nvim_prog_abs(), '-u', 'NONE', '-i', 'NONE',
+ '--cmd', 'set noswapfile shortmess+=IFW fileformats=unix',
+ '-s', '-'
+ })
+ screen:expect([[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:[No Name] 0,0-1 All}|
+ |
+ |
+ ]], {
+ [1] = {foreground = 4210943},
+ [2] = {bold = true, reverse = true}
+ })
+ feed('i:cq<CR>')
+ screen:expect([[
+ |
+ [Process exited 1] |
+ |
+ |
+ |
+ |
+ |
+ -- TERMINAL -- |
+ ]])
+ --[=[ Example of incorrect output:
+ screen:expect([[
+ ^nvim: /var/tmp/portage/dev-libs/libuv-1.|
+ 10.2/work/libuv-1.10.2/src/unix/core.c:5|
+ 19: uv__close: Assertion `fd > STDERR_FI|
+ LENO' failed. |
+ |
+ [Process exited 6] |
+ |
+ |
+ ]])
+ ]=]
+ end)
+ it('errors out when trying to use nonexistent file with -s', function()
+ eq(
+ 'Cannot open for reading: "'..nonexistent_fname..'": no such file or directory\n',
+ funcs.system(
+ {nvim_prog_abs(), '-u', 'NONE', '-i', 'NONE', '--headless',
+ '--cmd', 'set noswapfile shortmess+=IFW fileformats=unix',
+ '--cmd', 'language C',
+ '-s', nonexistent_fname}))
+ eq(2, eval('v:shell_error'))
+ end)
+ it('errors out when trying to use -s twice', function()
+ write_file(fname, ':call setline(1, "1")\n:wqall!\n')
+ write_file(dollar_fname, ':call setline(1, "2")\n:wqall!\n')
+ eq(
+ 'Attempt to open script file again: "-s '..dollar_fname..'"\n',
+ funcs.system(
+ {nvim_prog_abs(), '-u', 'NONE', '-i', 'NONE', '--headless',
+ '--cmd', 'set noswapfile shortmess+=IFW fileformats=unix',
+ '--cmd', 'language C',
+ '-s', fname, '-s', dollar_fname, fname_2}))
+ eq(2, eval('v:shell_error'))
+ eq(nil, lfs.attributes(fname_2))
+ end)
+ end)
+end)
diff --git a/test/functional/core/path_spec.lua b/test/functional/core/path_spec.lua
new file mode 100644
index 0000000000..669bc99136
--- /dev/null
+++ b/test/functional/core/path_spec.lua
@@ -0,0 +1,56 @@
+local helpers = require('test.functional.helpers')(after_each)
+local clear = helpers.clear
+local eq = helpers.eq
+local eval = helpers.eval
+local command = helpers.command
+local iswin = helpers.iswin
+
+describe('path collapse', function()
+ local targetdir
+ local expected_path
+
+ local function join_path(...)
+ local pathsep = (iswin() and '\\' or '/')
+ return table.concat({...}, pathsep)
+ end
+
+ before_each(function()
+ targetdir = join_path('test', 'functional', 'fixtures')
+ clear()
+ command('edit '..join_path(targetdir, 'tty-test.c'))
+ expected_path = eval('expand("%:p")')
+ end)
+
+ it('with /./ segment #7117', function()
+ command('edit '..join_path(targetdir, '.', 'tty-test.c'))
+ eq(expected_path, eval('expand("%:p")'))
+ end)
+
+ it('with ./ prefix #7117', function()
+ command('edit '..join_path('.', targetdir, 'tty-test.c'))
+ eq(expected_path, eval('expand("%:p")'))
+ end)
+
+ it('with ./ prefix, after directory change #7117', function()
+ command('edit '..join_path('.', targetdir, 'tty-test.c'))
+ command('cd test')
+ eq(expected_path, eval('expand("%:p")'))
+ end)
+
+ it('with /../ segment #7117', function()
+ command('edit '..join_path(targetdir, '..', 'fixtures', 'tty-test.c'))
+ eq(expected_path, eval('expand("%:p")'))
+ end)
+
+ it('with ../ and different starting directory #7117', function()
+ command('cd test')
+ command('edit '..join_path('..', targetdir, 'tty-test.c'))
+ eq(expected_path, eval('expand("%:p")'))
+ end)
+
+ it('with ./../ and different starting directory #7117', function()
+ command('cd test')
+ command('edit '..join_path('.', '..', targetdir, 'tty-test.c'))
+ eq(expected_path, eval('expand("%:p")'))
+ end)
+end)
diff --git a/test/functional/core/startup_spec.lua b/test/functional/core/startup_spec.lua
new file mode 100644
index 0000000000..8edb8fc014
--- /dev/null
+++ b/test/functional/core/startup_spec.lua
@@ -0,0 +1,265 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+
+local clear = helpers.clear
+local command = helpers.command
+local eq = helpers.eq
+local eval = helpers.eval
+local feed = helpers.feed
+local funcs = helpers.funcs
+local mkdir = helpers.mkdir
+local nvim_prog = helpers.nvim_prog
+local nvim_set = helpers.nvim_set
+local read_file = helpers.read_file
+local retry = helpers.retry
+local rmdir = helpers.rmdir
+local set_session = helpers.set_session
+local sleep = helpers.sleep
+local spawn = helpers.spawn
+local iswin = helpers.iswin
+local write_file = helpers.write_file
+
+describe('startup', function()
+ before_each(function()
+ clear()
+ os.remove('Xtest_startup_ttyout')
+ end)
+ after_each(function()
+ os.remove('Xtest_startup_ttyout')
+ end)
+
+ it('pipe at both ends: has("ttyin")==0 has("ttyout")==0', function()
+ -- system() puts a pipe at both ends.
+ local out = funcs.system({ nvim_prog, '-u', 'NONE', '-i', 'NONE', '--headless',
+ '--cmd', nvim_set,
+ '-c', [[echo has('ttyin') has('ttyout')]],
+ '+q' })
+ eq('0 0', out)
+ end)
+ it('with --embed: has("ttyin")==0 has("ttyout")==0', function()
+ local screen = Screen.new(25, 3)
+ -- Remote UI connected by --embed.
+ screen:attach()
+ command([[echo has('ttyin') has('ttyout')]])
+ screen:expect([[
+ ^ |
+ ~ |
+ 0 0 |
+ ]])
+ end)
+ it('in a TTY: has("ttyin")==1 has("ttyout")==1', function()
+ local screen = Screen.new(25, 3)
+ screen:attach()
+ if iswin() then
+ command([[set shellcmdflag=/s\ /c shellxquote=\"]])
+ end
+ -- Running in :terminal
+ command([[exe printf("terminal %s -u NONE -i NONE --cmd \"]]
+ ..nvim_set..[[\"]]
+ ..[[ -c \"echo has('ttyin') has('ttyout')\""]]
+ ..[[, shellescape(v:progpath))]])
+ screen:expect([[
+ ^ |
+ 1 1 |
+ |
+ ]])
+ end)
+ it('output to pipe: has("ttyin")==1 has("ttyout")==0', function()
+ if iswin() then
+ command([[set shellcmdflag=/s\ /c shellxquote=\"]])
+ end
+ -- Running in :terminal
+ command([[exe printf("terminal %s -u NONE -i NONE --cmd \"]]
+ ..nvim_set..[[\"]]
+ ..[[ -c \"call writefile([has('ttyin'), has('ttyout')], 'Xtest_startup_ttyout')\"]]
+ ..[[ -c q | cat -v"]] -- Output to a pipe.
+ ..[[, shellescape(v:progpath))]])
+ retry(nil, 3000, function()
+ sleep(1)
+ eq('1\n0\n', -- stdin is a TTY, stdout is a pipe
+ read_file('Xtest_startup_ttyout'))
+ end)
+ end)
+ it('input from pipe: has("ttyin")==0 has("ttyout")==1', function()
+ if iswin() then
+ command([[set shellcmdflag=/s\ /c shellxquote=\"]])
+ end
+ -- Running in :terminal
+ command([[exe printf("terminal echo foo | ]] -- Input from a pipe.
+ ..[[%s -u NONE -i NONE --cmd \"]]
+ ..nvim_set..[[\"]]
+ ..[[ -c \"call writefile([has('ttyin'), has('ttyout')], 'Xtest_startup_ttyout')\"]]
+ ..[[ -c q -- -"]]
+ ..[[, shellescape(v:progpath))]])
+ retry(nil, 3000, function()
+ sleep(1)
+ eq('0\n1\n', -- stdin is a pipe, stdout is a TTY
+ read_file('Xtest_startup_ttyout'))
+ end)
+ end)
+ it('input from pipe (implicit) #7679', function()
+ local screen = Screen.new(25, 3)
+ screen:attach()
+ if iswin() then
+ command([[set shellcmdflag=/s\ /c shellxquote=\"]])
+ end
+ -- Running in :terminal
+ command([[exe printf("terminal echo foo | ]] -- Input from a pipe.
+ ..[[%s -u NONE -i NONE --cmd \"]]
+ ..nvim_set..[[\"]]
+ ..[[ -c \"echo has('ttyin') has('ttyout')\""]]
+ ..[[, shellescape(v:progpath))]])
+ screen:expect([[
+ ^foo |
+ 0 1 |
+ |
+ ]])
+ end)
+ it('input from pipe + file args #7679', function()
+ eq('ohyeah\r\n0 0 bufs=3',
+ funcs.system({nvim_prog, '-n', '-u', 'NONE', '-i', 'NONE', '--headless',
+ '+.print',
+ "+echo has('ttyin') has('ttyout') 'bufs='.bufnr('$')",
+ '+qall!',
+ '-',
+ 'test/functional/fixtures/tty-test.c',
+ 'test/functional/fixtures/shell-test.c',
+ },
+ { 'ohyeah', '' }))
+ end)
+
+ it('if stdin is empty: selects buffer 2, deletes buffer 1 #8561', function()
+ eq('\r\n 2 %a "file1" line 0\r\n 3 "file2" line 0',
+ funcs.system({nvim_prog, '-n', '-u', 'NONE', '-i', 'NONE', '--headless',
+ '+ls!',
+ '+qall!',
+ '-',
+ 'file1',
+ 'file2',
+ },
+ { '' }))
+ end)
+
+ it('-e/-E interactive #7679', function()
+ clear('-e')
+ local screen = Screen.new(25, 3)
+ screen:attach()
+ feed("put ='from -e'<CR>")
+ screen:expect([[
+ :put ='from -e' |
+ from -e |
+ :^ |
+ ]])
+
+ clear('-E')
+ screen = Screen.new(25, 3)
+ screen:attach()
+ feed("put ='from -E'<CR>")
+ screen:expect([[
+ :put ='from -E' |
+ from -E |
+ :^ |
+ ]])
+ end)
+
+ it('stdin with -es/-Es #7679', function()
+ local input = { 'append', 'line1', 'line2', '.', '%print', '' }
+ local inputstr = table.concat(input, '\n')
+
+ --
+ -- -Es: read stdin as text
+ --
+ eq('partylikeits1999\n',
+ funcs.system({nvim_prog, '-n', '-u', 'NONE', '-i', 'NONE', '-Es', '+.print', 'test/functional/fixtures/tty-test.c' },
+ { 'partylikeits1999', '' }))
+ eq(inputstr,
+ funcs.system({nvim_prog, '-i', 'NONE', '-Es', '+%print', '-' },
+ input))
+ -- with `-u NORC`
+ eq('thepartycontinues\n',
+ funcs.system({nvim_prog, '-n', '-u', 'NORC', '-Es', '+.print' },
+ { 'thepartycontinues', '' }))
+ -- without `-u`
+ eq('thepartycontinues\n',
+ funcs.system({nvim_prog, '-n', '-Es', '+.print' },
+ { 'thepartycontinues', '' }))
+
+ --
+ -- -es: read stdin as ex-commands
+ --
+ eq(' encoding=utf-8\n',
+ funcs.system({nvim_prog, '-n', '-u', 'NONE', '-i', 'NONE', '-es', 'test/functional/fixtures/tty-test.c' },
+ { 'set encoding', '' }))
+ eq('line1\nline2\n',
+ funcs.system({nvim_prog, '-i', 'NONE', '-es', '-' },
+ input))
+ -- with `-u NORC`
+ eq(' encoding=utf-8\n',
+ funcs.system({nvim_prog, '-n', '-u', 'NORC', '-es' },
+ { 'set encoding', '' }))
+ -- without `-u`
+ eq(' encoding=utf-8\n',
+ funcs.system({nvim_prog, '-n', '-es' },
+ { 'set encoding', '' }))
+ end)
+
+ it('does not crash if --embed is given twice', function()
+ clear{args={'--embed'}}
+ eq(2, eval('1+1'))
+ end)
+end)
+
+describe('sysinit', function()
+ local xdgdir = 'Xxdg'
+ local vimdir = 'Xvim'
+ local xhome = 'Xhome'
+ local pathsep = helpers.get_pathsep()
+ local argv = {
+ nvim_prog, '--headless', '--embed', '-i', 'NONE', '-n',
+ '--cmd', 'set nomore undodir=. directory=. belloff='
+ }
+
+ before_each(function()
+ rmdir(xdgdir)
+ rmdir(vimdir)
+ rmdir(xhome)
+
+ mkdir(xdgdir)
+ mkdir(xdgdir .. pathsep .. 'nvim')
+ write_file(table.concat({xdgdir, 'nvim', 'sysinit.vim'}, pathsep), [[
+ let g:loaded = get(g:, "loaded", 0) + 1
+ let g:xdg = 1
+ ]])
+
+ mkdir(vimdir)
+ write_file(table.concat({vimdir, 'sysinit.vim'}, pathsep), [[
+ let g:loaded = get(g:, "loaded", 0) + 1
+ let g:vim = 1
+ ]])
+
+ mkdir(xhome)
+ end)
+ after_each(function()
+ rmdir(xdgdir)
+ rmdir(vimdir)
+ rmdir(xhome)
+ end)
+
+ it('prefers XDG_CONFIG_DIRS over VIM', function()
+ set_session(spawn(argv, nil,
+ { 'HOME='..xhome,
+ 'XDG_CONFIG_DIRS='..xdgdir,
+ 'VIM='..vimdir }))
+ eq('loaded 1 xdg 1 vim 0',
+ eval('printf("loaded %d xdg %d vim %d", g:loaded, get(g:, "xdg", 0), get(g:, "vim", 0))'))
+ end)
+
+ it('uses VIM if XDG_CONFIG_DIRS unset', function()
+ set_session(spawn(argv, nil,
+ { 'HOME='..xhome,
+ 'XDG_CONFIG_DIRS=',
+ 'VIM='..vimdir }))
+ eq('loaded 1 xdg 0 vim 1',
+ eval('printf("loaded %d xdg %d vim %d", g:loaded, get(g:, "xdg", 0), get(g:, "vim", 0))'))
+ end)
+end)
diff --git a/test/functional/eval/api_functions_spec.lua b/test/functional/eval/api_functions_spec.lua
new file mode 100644
index 0000000000..6f440c7d82
--- /dev/null
+++ b/test/functional/eval/api_functions_spec.lua
@@ -0,0 +1,148 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+local lfs = require('lfs')
+local neq, eq, command = helpers.neq, helpers.eq, helpers.command
+local clear, curbufmeths = helpers.clear, helpers.curbufmeths
+local exc_exec, expect, eval = helpers.exc_exec, helpers.expect, helpers.eval
+local insert = helpers.insert
+
+describe('api functions', function()
+ before_each(clear)
+
+ it("work", function()
+ command("call nvim_command('let g:test = 1')")
+ eq(1, eval("nvim_get_var('test')"))
+
+ local buf = eval("nvim_get_current_buf()")
+ command("call nvim_buf_set_lines("..buf..", 0, -1, v:true, ['aa', 'bb'])")
+ expect([[
+ aa
+ bb]])
+
+ command("call nvim_win_set_cursor(0, [1, 1])")
+ command("call nvim_input('ax<esc>')")
+ expect([[
+ aax
+ bb]])
+ end)
+
+ it("throw errors for invalid arguments", function()
+ local err = exc_exec('call nvim_get_current_buf("foo")')
+ eq('Vim(call):E118: Too many arguments for function: nvim_get_current_buf', err)
+
+ err = exc_exec('call nvim_set_option("hlsearch")')
+ eq('Vim(call):E119: Not enough arguments for function: nvim_set_option', err)
+
+ err = exc_exec('call nvim_buf_set_lines(1, 0, -1, [], ["list"])')
+ eq('Vim(call):Wrong type for argument 4, expecting Boolean', err)
+
+ err = exc_exec('call nvim_buf_set_lines(0, 0, -1, v:true, "string")')
+ eq('Vim(call):Wrong type for argument 5, expecting ArrayOf(String)', err)
+
+ err = exc_exec('call nvim_buf_get_number("0")')
+ eq('Vim(call):Wrong type for argument 1, expecting Buffer', err)
+
+ err = exc_exec('call nvim_buf_line_count(17)')
+ eq('Vim(call):Invalid buffer id', err)
+ end)
+
+
+ it("use buffer numbers and windows ids as handles", function()
+ local screen = Screen.new(40, 8)
+ screen:attach()
+ local bnr = eval("bufnr('')")
+ local bhnd = eval("nvim_get_current_buf()")
+ local wid = eval("win_getid()")
+ local whnd = eval("nvim_get_current_win()")
+ eq(bnr, bhnd)
+ eq(wid, whnd)
+
+ command("new") -- creates new buffer and new window
+ local bnr2 = eval("bufnr('')")
+ local bhnd2 = eval("nvim_get_current_buf()")
+ local wid2 = eval("win_getid()")
+ local whnd2 = eval("nvim_get_current_win()")
+ eq(bnr2, bhnd2)
+ eq(wid2, whnd2)
+ neq(bnr, bnr2)
+ neq(wid, wid2)
+ -- 0 is synonymous to the current buffer
+ eq(bnr2, eval("nvim_buf_get_number(0)"))
+
+ command("bn") -- show old buffer in new window
+ eq(bnr, eval("nvim_get_current_buf()"))
+ eq(bnr, eval("bufnr('')"))
+ eq(bnr, eval("nvim_buf_get_number(0)"))
+ eq(wid2, eval("win_getid()"))
+ eq(whnd2, eval("nvim_get_current_win()"))
+ end)
+
+ it("get_lines and set_lines use NL to represent NUL", function()
+ curbufmeths.set_lines(0, -1, true, {"aa\0", "b\0b"})
+ eq({'aa\n', 'b\nb'}, eval("nvim_buf_get_lines(0, 0, -1, 1)"))
+
+ command('call nvim_buf_set_lines(0, 1, 2, v:true, ["xx", "\\nyy"])')
+ eq({'aa\0', 'xx', '\0yy'}, curbufmeths.get_lines(0, -1, 1))
+ end)
+
+ it("that are FUNC_ATTR_NOEVAL cannot be called", function()
+ -- Deprecated vim_ prefix is not exported.
+ local err = exc_exec('call vim_get_current_buffer("foo")')
+ eq('Vim(call):E117: Unknown function: vim_get_current_buffer', err)
+
+ -- Deprecated buffer_ prefix is not exported.
+ err = exc_exec('call buffer_line_count(0)')
+ eq('Vim(call):E117: Unknown function: buffer_line_count', err)
+
+ -- Functions deprecated before the api functions became available
+ -- in vimscript are not exported.
+ err = exc_exec('call buffer_get_line(0, 1)')
+ eq('Vim(call):E117: Unknown function: buffer_get_line', err)
+
+ -- some api functions are only useful from a msgpack-rpc channel
+ err = exc_exec('call nvim_subscribe("fancyevent")')
+ eq('Vim(call):E117: Unknown function: nvim_subscribe', err)
+ end)
+
+ it('have metadata accessible with api_info()', function()
+ local api_keys = eval("sort(keys(api_info()))")
+ eq({'error_types', 'functions', 'types',
+ 'ui_events', 'ui_options', 'version'}, api_keys)
+ end)
+
+ it('are highlighted by vim.vim syntax file', function()
+ if lfs.attributes("build/runtime/syntax/vim/generated.vim",'uid') == nil then
+ pending("runtime was not built, skipping test")
+ return
+ end
+ local screen = Screen.new(40, 8)
+ screen:attach()
+ screen:set_default_attr_ids({
+ [1] = {bold = true, foreground = Screen.colors.Brown},
+ [2] = {foreground = Screen.colors.DarkCyan},
+ [3] = {foreground = Screen.colors.SlateBlue},
+ [4] = {foreground = Screen.colors.Fuchsia},
+ [5] = {bold = true, foreground = Screen.colors.Blue},
+ })
+
+ command("set ft=vim")
+ command("let &rtp='build/runtime/,'.&rtp")
+ command("syntax on")
+ insert([[
+ call bufnr('%')
+ call nvim_input('typing...')
+ call not_a_function(42)]])
+
+ screen:expect([[
+ {1:call} {2:bufnr}{3:(}{4:'%'}{3:)} |
+ {1:call} {2:nvim_input}{3:(}{4:'typing...'}{3:)} |
+ {1:call} not_a_function{3:(}{4:42}{3:^)} |
+ {5:~ }|
+ {5:~ }|
+ {5:~ }|
+ {5:~ }|
+ |
+ ]])
+ screen:detach()
+ end)
+end)
diff --git a/test/functional/eval/backtick_expansion_spec.lua b/test/functional/eval/backtick_expansion_spec.lua
new file mode 100644
index 0000000000..b1b44cfa8b
--- /dev/null
+++ b/test/functional/eval/backtick_expansion_spec.lua
@@ -0,0 +1,50 @@
+local lfs = require('lfs')
+local helpers = require('test.functional.helpers')(after_each)
+local clear, command, eval, eq = helpers.clear, helpers.command, helpers.eval, helpers.eq
+local write_file = helpers.write_file
+
+describe("backtick expansion", function()
+ setup(function()
+ clear()
+ lfs.mkdir("test-backticks")
+ write_file("test-backticks/file1", "test file 1")
+ write_file("test-backticks/file2", "test file 2")
+ write_file("test-backticks/file3", "test file 3")
+ lfs.mkdir("test-backticks/subdir")
+ write_file("test-backticks/subdir/file4", "test file 4")
+ -- Long path might cause "Press ENTER" prompt; use :silent to avoid it.
+ command('silent cd test-backticks')
+ end)
+
+ teardown(function()
+ helpers.rmdir('test-backticks')
+ end)
+
+ it("with default 'shell'", function()
+ if helpers.iswin() then
+ command(":silent args `dir /b *2`")
+ else
+ command(":silent args `echo ***2`")
+ end
+ eq({ "file2", }, eval("argv()"))
+ if helpers.iswin() then
+ command(":silent args `dir /s/b *4`")
+ eq({ "subdir\\file4", }, eval("map(argv(), 'fnamemodify(v:val, \":.\")')"))
+ else
+ command(":silent args `echo */*4`")
+ eq({ "subdir/file4", }, eval("argv()"))
+ end
+ end)
+
+ it("with shell=fish", function()
+ if eval("executable('fish')") == 0 then
+ pending('missing "fish" command')
+ return
+ end
+ command("set shell=fish")
+ command(":silent args `echo ***2`")
+ eq({ "file2", }, eval("argv()"))
+ command(":silent args `echo */*4`")
+ eq({ "subdir/file4", }, eval("argv()"))
+ end)
+end)
diff --git a/test/functional/eval/buf_functions_spec.lua b/test/functional/eval/buf_functions_spec.lua
new file mode 100644
index 0000000000..c0e264d4c9
--- /dev/null
+++ b/test/functional/eval/buf_functions_spec.lua
@@ -0,0 +1,304 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local lfs = require('lfs')
+
+local eq = helpers.eq
+local clear = helpers.clear
+local funcs = helpers.funcs
+local meths = helpers.meths
+local command = helpers.command
+local exc_exec = helpers.exc_exec
+local bufmeths = helpers.bufmeths
+local winmeths = helpers.winmeths
+local curbufmeths = helpers.curbufmeths
+local curwinmeths = helpers.curwinmeths
+local curtabmeths = helpers.curtabmeths
+local get_pathsep = helpers.get_pathsep
+local rmdir = helpers.rmdir
+local expect_err = helpers.expect_err
+
+local fname = 'Xtest-functional-eval-buf_functions'
+local fname2 = fname .. '.2'
+local dirname = fname .. '.d'
+
+before_each(clear)
+
+for _, func in ipairs({'bufname(%s)', 'bufnr(%s)', 'bufwinnr(%s)',
+ 'getbufline(%s, 1)', 'getbufvar(%s, "changedtick")',
+ 'setbufvar(%s, "f", 0)'}) do
+ local funcname = func:match('%w+')
+ describe(funcname .. '() function', function()
+ it('errors out when receives v:true/v:false/v:null', function()
+ -- Not compatible with Vim: in Vim it always results in buffer not found
+ -- without any error messages.
+ for _, var in ipairs({'v:true', 'v:false', 'v:null'}) do
+ eq('Vim(call):E5300: Expected a Number or a String',
+ exc_exec('call ' .. func:format(var)))
+ end
+ end)
+ it('errors out when receives invalid argument', function()
+ eq('Vim(call):E745: Expected a Number or a String, List found',
+ exc_exec('call ' .. func:format('[]')))
+ eq('Vim(call):E728: Expected a Number or a String, Dictionary found',
+ exc_exec('call ' .. func:format('{}')))
+ eq('Vim(call):E805: Expected a Number or a String, Float found',
+ exc_exec('call ' .. func:format('0.0')))
+ eq('Vim(call):E703: Expected a Number or a String, Funcref found',
+ exc_exec('call ' .. func:format('function("tr")')))
+ end)
+ end)
+end
+
+describe('bufname() function', function()
+ it('returns empty string when buffer was not found', function()
+ command('file ' .. fname)
+ eq('', funcs.bufname(2))
+ eq('', funcs.bufname('non-existent-buffer'))
+ eq('', funcs.bufname('#'))
+ command('edit ' .. fname2)
+ eq(2, funcs.bufnr('%'))
+ eq('', funcs.bufname('X'))
+ end)
+ before_each(function()
+ lfs.mkdir(dirname)
+ end)
+ after_each(function()
+ rmdir(dirname)
+ end)
+ it('returns expected buffer name', function()
+ eq('', funcs.bufname('%')) -- Buffer has no name yet
+ command('file ' .. fname)
+ local wd = lfs.currentdir()
+ local sep = get_pathsep()
+ local curdirname = funcs.fnamemodify(wd, ':t')
+ for _, arg in ipairs({'%', 1, 'X', wd}) do
+ eq(fname, funcs.bufname(arg))
+ meths.set_current_dir('..')
+ eq(curdirname .. sep .. fname, funcs.bufname(arg))
+ meths.set_current_dir(curdirname)
+ meths.set_current_dir(dirname)
+ eq(wd .. sep .. fname, funcs.bufname(arg))
+ meths.set_current_dir('..')
+ eq(fname, funcs.bufname(arg))
+ command('enew')
+ end
+ eq('', funcs.bufname('%'))
+ eq('', funcs.bufname('$'))
+ eq(2, funcs.bufnr('%'))
+ end)
+end)
+
+describe('bufnr() function', function()
+ it('returns -1 when buffer was not found', function()
+ command('file ' .. fname)
+ eq(-1, funcs.bufnr(2))
+ eq(-1, funcs.bufnr('non-existent-buffer'))
+ eq(-1, funcs.bufnr('#'))
+ command('edit ' .. fname2)
+ eq(2, funcs.bufnr('%'))
+ eq(-1, funcs.bufnr('X'))
+ end)
+ it('returns expected buffer number', function()
+ eq(1, funcs.bufnr('%'))
+ command('file ' .. fname)
+ local wd = lfs.currentdir()
+ local curdirname = funcs.fnamemodify(wd, ':t')
+ eq(1, funcs.bufnr(fname))
+ eq(1, funcs.bufnr(wd))
+ eq(1, funcs.bufnr(curdirname))
+ eq(1, funcs.bufnr('X'))
+ end)
+ it('returns number of last buffer with "$"', function()
+ eq(1, funcs.bufnr('$'))
+ command('new')
+ eq(2, funcs.bufnr('$'))
+ command('new')
+ eq(3, funcs.bufnr('$'))
+ command('only')
+ eq(3, funcs.bufnr('$'))
+ eq(3, funcs.bufnr('%'))
+ command('buffer 1')
+ eq(3, funcs.bufnr('$'))
+ eq(1, funcs.bufnr('%'))
+ command('bwipeout 2')
+ eq(3, funcs.bufnr('$'))
+ eq(1, funcs.bufnr('%'))
+ command('bwipeout 3')
+ eq(1, funcs.bufnr('$'))
+ eq(1, funcs.bufnr('%'))
+ command('new')
+ eq(4, funcs.bufnr('$'))
+ end)
+end)
+
+describe('bufwinnr() function', function()
+ it('returns -1 when buffer was not found', function()
+ command('file ' .. fname)
+ eq(-1, funcs.bufwinnr(2))
+ eq(-1, funcs.bufwinnr('non-existent-buffer'))
+ eq(-1, funcs.bufwinnr('#'))
+ command('split ' .. fname2) -- It would be OK if there was one window
+ eq(2, funcs.bufnr('%'))
+ eq(-1, funcs.bufwinnr('X'))
+ end)
+ before_each(function()
+ lfs.mkdir(dirname)
+ end)
+ after_each(function()
+ rmdir(dirname)
+ end)
+ it('returns expected window number', function()
+ eq(1, funcs.bufwinnr('%'))
+ command('file ' .. fname)
+ command('vsplit')
+ command('split ' .. fname2)
+ eq(2, funcs.bufwinnr(fname))
+ eq(1, funcs.bufwinnr(fname2))
+ eq(-1, funcs.bufwinnr(fname:sub(1, #fname - 1)))
+ meths.set_current_dir(dirname)
+ eq(2, funcs.bufwinnr(fname))
+ eq(1, funcs.bufwinnr(fname2))
+ eq(-1, funcs.bufwinnr(fname:sub(1, #fname - 1)))
+ eq(1, funcs.bufwinnr('%'))
+ eq(2, funcs.bufwinnr(1))
+ eq(1, funcs.bufwinnr(2))
+ eq(-1, funcs.bufwinnr(3))
+ eq(1, funcs.bufwinnr('$'))
+ end)
+end)
+
+describe('getbufline() function', function()
+ it('returns empty list when buffer was not found', function()
+ command('file ' .. fname)
+ eq({}, funcs.getbufline(2, 1))
+ eq({}, funcs.getbufline('non-existent-buffer', 1))
+ eq({}, funcs.getbufline('#', 1))
+ command('edit ' .. fname2)
+ eq(2, funcs.bufnr('%'))
+ eq({}, funcs.getbufline('X', 1))
+ end)
+ it('returns empty list when range is invalid', function()
+ eq({}, funcs.getbufline(1, 0))
+ curbufmeths.set_lines(0, 1, false, {'foo', 'bar', 'baz'})
+ eq({}, funcs.getbufline(1, 2, 1))
+ eq({}, funcs.getbufline(1, -10, -20))
+ eq({}, funcs.getbufline(1, -2, -1))
+ eq({}, funcs.getbufline(1, -1, 9999))
+ end)
+ it('returns expected lines', function()
+ meths.set_option('hidden', true)
+ command('file ' .. fname)
+ curbufmeths.set_lines(0, 1, false, {'foo\0', '\0bar', 'baz'})
+ command('edit ' .. fname2)
+ curbufmeths.set_lines(0, 1, false, {'abc\0', '\0def', 'ghi'})
+ eq({'foo\n', '\nbar', 'baz'}, funcs.getbufline(1, 1, 9999))
+ eq({'abc\n', '\ndef', 'ghi'}, funcs.getbufline(2, 1, 9999))
+ eq({'foo\n', '\nbar', 'baz'}, funcs.getbufline(1, 1, '$'))
+ eq({'baz'}, funcs.getbufline(1, '$', '$'))
+ eq({'baz'}, funcs.getbufline(1, '$', 9999))
+ end)
+end)
+
+describe('getbufvar() function', function()
+ it('returns empty list when buffer was not found', function()
+ command('file ' .. fname)
+ eq('', funcs.getbufvar(2, '&autoindent'))
+ eq('', funcs.getbufvar('non-existent-buffer', '&autoindent'))
+ eq('', funcs.getbufvar('#', '&autoindent'))
+ command('edit ' .. fname2)
+ eq(2, funcs.bufnr('%'))
+ eq('', funcs.getbufvar('X', '&autoindent'))
+ end)
+ it('returns empty list when variable/option/etc was not found', function()
+ command('file ' .. fname)
+ eq('', funcs.getbufvar(1, '&autondent'))
+ eq('', funcs.getbufvar(1, 'changedtic'))
+ end)
+ it('returns expected option value', function()
+ eq(0, funcs.getbufvar(1, '&autoindent'))
+ eq(0, funcs.getbufvar(1, '&l:autoindent'))
+ eq(0, funcs.getbufvar(1, '&g:autoindent'))
+ -- Also works with global-only options
+ eq(0, funcs.getbufvar(1, '&hidden'))
+ eq(0, funcs.getbufvar(1, '&l:hidden'))
+ eq(0, funcs.getbufvar(1, '&g:hidden'))
+ -- Also works with window-local options
+ eq(0, funcs.getbufvar(1, '&number'))
+ eq(0, funcs.getbufvar(1, '&l:number'))
+ eq(0, funcs.getbufvar(1, '&g:number'))
+ command('new')
+ -- But with window-local options it probably does not what you expect
+ curwinmeths.set_option('number', true)
+ -- (note that current windowโ€™s buffer is 2, but getbufvar() receives 1)
+ eq(2, bufmeths.get_number(curwinmeths.get_buf()))
+ eq(1, funcs.getbufvar(1, '&number'))
+ eq(1, funcs.getbufvar(1, '&l:number'))
+ -- You can get global value though, if you find this useful.
+ eq(0, funcs.getbufvar(1, '&g:number'))
+ end)
+ it('returns expected variable value', function()
+ eq(2, funcs.getbufvar(1, 'changedtick'))
+ curbufmeths.set_lines(0, 1, false, {'abc\0', '\0def', 'ghi'})
+ eq(3, funcs.getbufvar(1, 'changedtick'))
+ curbufmeths.set_var('test', true)
+ eq(true, funcs.getbufvar(1, 'test'))
+ eq({test=true, changedtick=3}, funcs.getbufvar(1, ''))
+ command('new')
+ eq(3, funcs.getbufvar(1, 'changedtick'))
+ eq(true, funcs.getbufvar(1, 'test'))
+ eq({test=true, changedtick=3}, funcs.getbufvar(1, ''))
+ end)
+end)
+
+describe('setbufvar() function', function()
+ it('throws the error or ignores the input when buffer was not found', function()
+ command('file ' .. fname)
+ eq(0,
+ exc_exec('call setbufvar(2, "&autoindent", 0)'))
+ eq('Vim(call):E94: No matching buffer for non-existent-buffer',
+ exc_exec('call setbufvar("non-existent-buffer", "&autoindent", 0)'))
+ eq(0,
+ exc_exec('call setbufvar("#", "&autoindent", 0)'))
+ command('edit ' .. fname2)
+ eq(2, funcs.bufnr('%'))
+ eq('Vim(call):E93: More than one match for X',
+ exc_exec('call setbufvar("X", "&autoindent", 0)'))
+ end)
+ it('may set options, including window-local and global values', function()
+ local buf1 = meths.get_current_buf()
+ eq(false, curwinmeths.get_option('number'))
+ command('split')
+ command('new')
+ eq(2, bufmeths.get_number(curwinmeths.get_buf()))
+ funcs.setbufvar(1, '&number', true)
+ local windows = curtabmeths.list_wins()
+ eq(false, winmeths.get_option(windows[1], 'number'))
+ eq(true, winmeths.get_option(windows[2], 'number'))
+ eq(false, winmeths.get_option(windows[3], 'number'))
+ eq(false, winmeths.get_option(meths.get_current_win(), 'number'))
+
+ eq(false, meths.get_option('hidden'))
+ funcs.setbufvar(1, '&hidden', true)
+ eq(true, meths.get_option('hidden'))
+
+ eq(false, bufmeths.get_option(buf1, 'autoindent'))
+ funcs.setbufvar(1, '&autoindent', true)
+ eq(true, bufmeths.get_option(buf1, 'autoindent'))
+ eq('Vim(call):E355: Unknown option: xxx',
+ exc_exec('call setbufvar(1, "&xxx", 0)'))
+ end)
+ it('may set variables', function()
+ local buf1 = meths.get_current_buf()
+ command('split')
+ command('new')
+ eq(2, curbufmeths.get_number())
+ funcs.setbufvar(1, 'number', true)
+ eq(true, bufmeths.get_var(buf1, 'number'))
+ eq('Vim(call):E461: Illegal variable name: b:',
+ exc_exec('call setbufvar(1, "", 0)'))
+ eq(true, bufmeths.get_var(buf1, 'number'))
+ expect_err('Vim:E46: Cannot change read%-only variable "b:changedtick"',
+ funcs.setbufvar, 1, 'changedtick', true)
+ eq(2, funcs.getbufvar(1, 'changedtick'))
+ end)
+end)
diff --git a/test/functional/eval/capture_spec.lua b/test/functional/eval/capture_spec.lua
deleted file mode 100644
index d9265f1b5b..0000000000
--- a/test/functional/eval/capture_spec.lua
+++ /dev/null
@@ -1,86 +0,0 @@
-local helpers = require('test.functional.helpers')(after_each)
-local eq = helpers.eq
-local eval = helpers.eval
-local clear = helpers.clear
-local source = helpers.source
-local redir_exec = helpers.redir_exec
-local exc_exec = helpers.exc_exec
-local funcs = helpers.funcs
-local Screen = require('test.functional.ui.screen')
-local feed = helpers.feed
-
-describe('capture()', function()
- before_each(clear)
-
- it('returns the same result with :redir', function()
- eq(redir_exec('messages'), funcs.capture('messages'))
- end)
-
- it('returns the output of the commands if the argument is List', function()
- eq("foobar", funcs.capture({'echon "foo"', 'echon "bar"'}))
- eq("\nfoo\nbar", funcs.capture({'echo "foo"', 'echo "bar"'}))
- end)
-
- it('supports the nested redirection', function()
- source([[
- function! g:Foo()
- let a = ''
- redir => a
- silent echon "foo"
- redir END
- return a
- endfunction
- function! g:Bar()
- let a = ''
- redir => a
- call g:Foo()
- redir END
- return a
- endfunction
- ]])
- eq('foo', funcs.capture('call g:Bar()'))
-
- eq('42', funcs.capture([[echon capture("echon capture('echon 42')")]]))
- end)
-
- it('returns the transformed string', function()
- eq('^A', funcs.capture('echon "\\<C-a>"'))
- end)
-
- it('returns the empty string if the argument list is empty', function()
- eq('', funcs.capture({}))
- eq(0, exc_exec('let g:ret = capture(v:_null_list)'))
- eq('', eval('g:ret'))
- end)
-
- it('returns the errors', function()
- local ret
- ret = exc_exec('call capture(0.0)')
- eq('Vim(call):E806: using Float as a String', ret)
- ret = exc_exec('call capture(v:_null_dict)')
- eq('Vim(call):E731: using Dictionary as a String', ret)
- ret = exc_exec('call capture(function("tr"))')
- eq('Vim(call):E729: using Funcref as a String', ret)
- ret = exc_exec('call capture(["echo 42", 0.0, "echo 44"])')
- eq('Vim(call):E806: using Float as a String', ret)
- ret = exc_exec('call capture(["echo 42", v:_null_dict, "echo 44"])')
- eq('Vim(call):E731: using Dictionary as a String', ret)
- ret = exc_exec('call capture(["echo 42", function("tr"), "echo 44"])')
- eq('Vim(call):E729: using Funcref as a String', ret)
- end)
-
- it('silences command run inside', function()
- local screen = Screen.new(20, 5)
- screen:attach()
- screen:set_default_attr_ignore({{bold=true, foreground=255}})
- feed(':let g:mes = capture("echon 42")<CR>')
- screen:expect([[
- ^ |
- ~ |
- ~ |
- ~ |
- |
- ]])
- eq('42', eval('g:mes'))
- end)
-end)
diff --git a/test/functional/eval/changedtick_spec.lua b/test/functional/eval/changedtick_spec.lua
new file mode 100644
index 0000000000..60ea9fa12b
--- /dev/null
+++ b/test/functional/eval/changedtick_spec.lua
@@ -0,0 +1,142 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local eq = helpers.eq
+local eval = helpers.eval
+local feed = helpers.feed
+local clear = helpers.clear
+local funcs = helpers.funcs
+local meths = helpers.meths
+local command = helpers.command
+local exc_exec = helpers.exc_exec
+local redir_exec = helpers.redir_exec
+local meth_pcall = helpers.meth_pcall
+local curbufmeths = helpers.curbufmeths
+
+before_each(clear)
+
+local function changedtick()
+ local ct = curbufmeths.get_changedtick()
+ eq(ct, curbufmeths.get_var('changedtick'))
+ eq(ct, curbufmeths.get_var('changedtick'))
+ eq(ct, eval('b:changedtick'))
+ eq(ct, eval('b:["changedtick"]'))
+ eq(ct, eval('b:.changedtick'))
+ eq(ct, funcs.getbufvar('%', 'changedtick'))
+ eq(ct, funcs.getbufvar('%', '').changedtick)
+ eq(ct, eval('b:').changedtick)
+ return ct
+end
+
+describe('b:changedtick', function()
+ -- Ported tests from Vim-8.0.333
+ it('increments', function() -- Test_changedtick_increments
+ -- New buffer has an empty line, tick starts at 2
+ eq(2, changedtick())
+ funcs.setline(1, 'hello')
+ eq(3, changedtick())
+ eq(0, exc_exec('undo'))
+ -- Somehow undo counts as two changes
+ eq(5, changedtick())
+ end)
+ it('is present in b: dictionary', function()
+ eq(2, changedtick())
+ command('let d = b:')
+ eq(2, meths.get_var('d').changedtick)
+ end)
+ it('increments at bdel', function()
+ command('new')
+ eq(2, changedtick())
+ local bnr = curbufmeths.get_number()
+ eq(2, bnr)
+ command('bdel')
+ eq(3, funcs.getbufvar(bnr, 'changedtick'))
+ eq(1, curbufmeths.get_number())
+ end)
+ it('fails to be changed by user', function()
+ local ct = changedtick()
+ local ctn = ct + 100500
+ eq(0, exc_exec('let d = b:'))
+ eq('\nE46: Cannot change read-only variable "b:changedtick"',
+ redir_exec('let b:changedtick = ' .. ctn))
+ eq('\nE46: Cannot change read-only variable "b:["changedtick"]"',
+ redir_exec('let b:["changedtick"] = ' .. ctn))
+ eq('\nE46: Cannot change read-only variable "b:.changedtick"',
+ redir_exec('let b:.changedtick = ' .. ctn))
+ eq('\nE46: Cannot change read-only variable "d.changedtick"',
+ redir_exec('let d.changedtick = ' .. ctn))
+ eq({false, 'Key is read-only: changedtick'},
+ meth_pcall(curbufmeths.set_var, 'changedtick', ctn))
+
+ eq('\nE795: Cannot delete variable b:changedtick',
+ redir_exec('unlet b:changedtick'))
+ eq('\nE46: Cannot change read-only variable "b:.changedtick"',
+ redir_exec('unlet b:.changedtick'))
+ eq('\nE46: Cannot change read-only variable "b:["changedtick"]"',
+ redir_exec('unlet b:["changedtick"]'))
+ eq('\nE46: Cannot change read-only variable "d.changedtick"',
+ redir_exec('unlet d.changedtick'))
+ eq({false, 'Key is read-only: changedtick'},
+ meth_pcall(curbufmeths.del_var, 'changedtick'))
+ eq(ct, changedtick())
+
+ eq('\nE46: Cannot change read-only variable "b:["changedtick"]"',
+ redir_exec('let b:["changedtick"] += ' .. ctn))
+ eq('\nE46: Cannot change read-only variable "b:["changedtick"]"',
+ redir_exec('let b:["changedtick"] -= ' .. ctn))
+ eq('\nE46: Cannot change read-only variable "b:["changedtick"]"',
+ redir_exec('let b:["changedtick"] .= ' .. ctn))
+
+ eq(ct, changedtick())
+
+ funcs.setline(1, 'hello')
+
+ eq(ct + 1, changedtick())
+ end)
+ it('is listed in :let output', function()
+ eq('\nb:changedtick #2',
+ redir_exec(':let b:'))
+ end)
+ it('fails to unlock b:changedtick', function()
+ eq(0, exc_exec('let d = b:'))
+ eq(0, funcs.islocked('b:changedtick'))
+ eq(0, funcs.islocked('d.changedtick'))
+ eq('\nE940: Cannot lock or unlock variable b:changedtick',
+ redir_exec('unlockvar b:changedtick'))
+ eq('\nE46: Cannot change read-only variable "d.changedtick"',
+ redir_exec('unlockvar d.changedtick'))
+ eq(0, funcs.islocked('b:changedtick'))
+ eq(0, funcs.islocked('d.changedtick'))
+ eq('\nE940: Cannot lock or unlock variable b:changedtick',
+ redir_exec('lockvar b:changedtick'))
+ eq('\nE46: Cannot change read-only variable "d.changedtick"',
+ redir_exec('lockvar d.changedtick'))
+ eq(0, funcs.islocked('b:changedtick'))
+ eq(0, funcs.islocked('d.changedtick'))
+ end)
+ it('is being completed', function()
+ feed(':echo b:<Tab><Home>let cmdline="<End>"<CR>')
+ eq('echo b:changedtick', meths.get_var('cmdline'))
+ end)
+ it('cannot be changed by filter() or map()', function()
+ eq(2, changedtick())
+ eq('\nE795: Cannot delete variable filter() argument',
+ redir_exec('call filter(b:, 0)'))
+ eq('\nE742: Cannot change value of map() argument',
+ redir_exec('call map(b:, 0)'))
+ eq('\nE742: Cannot change value of map() argument',
+ redir_exec('call map(b:, "v:val")'))
+ eq(2, changedtick())
+ end)
+ it('cannot be remove()d', function()
+ eq(2, changedtick())
+ eq('\nE795: Cannot delete variable remove() argument',
+ redir_exec('call remove(b:, "changedtick")'))
+ eq(2, changedtick())
+ end)
+ it('does not inherit VAR_FIXED when copying dictionary over', function()
+ eq(2, changedtick())
+ eq('', redir_exec('let d1 = copy(b:)|let d1.changedtick = 42'))
+ eq('', redir_exec('let d2 = copy(b:)|unlet d2.changedtick'))
+ eq(2, changedtick())
+ end)
+end)
diff --git a/test/functional/eval/container_functions_spec.lua b/test/functional/eval/container_functions_spec.lua
new file mode 100644
index 0000000000..04a3248c49
--- /dev/null
+++ b/test/functional/eval/container_functions_spec.lua
@@ -0,0 +1,24 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local eq = helpers.eq
+local eval = helpers.eval
+local meths = helpers.meths
+local clear = helpers.clear
+
+before_each(clear)
+
+describe('extend()', function()
+ it('suceeds to extend list with itself', function()
+ meths.set_var('l', {1, {}})
+ eq({1, {}, 1, {}}, eval('extend(l, l)'))
+ eq({1, {}, 1, {}}, meths.get_var('l'))
+
+ meths.set_var('l', {1, {}})
+ eq({1, {}, 1, {}}, eval('extend(l, l, 0)'))
+ eq({1, {}, 1, {}}, meths.get_var('l'))
+
+ meths.set_var('l', {1, {}})
+ eq({1, 1, {}, {}}, eval('extend(l, l, 1)'))
+ eq({1, 1, {}, {}}, meths.get_var('l'))
+ end)
+end)
diff --git a/test/functional/eval/executable_spec.lua b/test/functional/eval/executable_spec.lua
new file mode 100644
index 0000000000..c931b47221
--- /dev/null
+++ b/test/functional/eval/executable_spec.lua
@@ -0,0 +1,156 @@
+local helpers = require('test.functional.helpers')(after_each)
+local eq, clear, call, iswin, write_file =
+ helpers.eq, helpers.clear, helpers.call, helpers.iswin, helpers.write_file
+
+describe('executable()', function()
+ before_each(clear)
+
+ it('returns 1 for commands in $PATH', function()
+ local exe = iswin() and 'ping' or 'ls'
+ eq(1, call('executable', exe))
+ end)
+
+ it('returns 0 for non-existent files', function()
+ eq(0, call('executable', 'no_such_file_exists_209ufq23f'))
+ end)
+
+ it('sibling to nvim binary', function()
+ -- Some executable in build/bin/, *not* in $PATH nor CWD.
+ local sibling_exe = 'printargs-test'
+ -- Windows: siblings are in Nvim's "pseudo-$PATH".
+ local expected = iswin() and 1 or 0
+ if iswin() then
+ -- $PATH on AppVeyor CI might be oversized, redefine it to a minimal one.
+ clear({env={PATH=[[C:\Windows\system32;C:\Windows]]}})
+ eq('arg1=lemon;arg2=sky;arg3=tree;',
+ call('system', sibling_exe..' lemon sky tree'))
+ end
+ local is_executable = call('executable', sibling_exe)
+ if iswin() and is_executable ~= expected then
+ pending('XXX: sometimes fails on AppVeyor')
+ end
+ end)
+
+ describe('exec-bit', function()
+ setup(function()
+ clear()
+ write_file('Xtest_not_executable', 'non-executable file')
+ write_file('Xtest_executable', 'executable file (exec-bit set)')
+ if not iswin() then -- N/A for Windows.
+ call('system', {'chmod', '-x', 'Xtest_not_executable'})
+ call('system', {'chmod', '+x', 'Xtest_executable'})
+ end
+ end)
+
+ teardown(function()
+ os.remove('Xtest_not_executable')
+ os.remove('Xtest_executable')
+ end)
+
+ it('not set', function()
+ local expected = iswin() and 1 or 0
+ eq(expected, call('executable', 'Xtest_not_executable'))
+ eq(expected, call('executable', './Xtest_not_executable'))
+ end)
+
+ it('set, unqualified and not in $PATH', function()
+ local expected = iswin() and 1 or 0
+ eq(expected, call('executable', 'Xtest_executable'))
+ end)
+
+ it('set, qualified as a path', function()
+ eq(1, call('executable', './Xtest_executable'))
+ end)
+ end)
+end)
+
+describe('executable() (Windows)', function()
+ if not iswin() then return end -- N/A for Unix.
+
+ local exts = {'bat', 'exe', 'com', 'cmd'}
+ setup(function()
+ for _, ext in ipairs(exts) do
+ write_file('test_executable_'..ext..'.'..ext, '')
+ end
+ write_file('test_executable_zzz.zzz', '')
+ end)
+
+ teardown(function()
+ for _, ext in ipairs(exts) do
+ os.remove('test_executable_'..ext..'.'..ext)
+ end
+ os.remove('test_executable_zzz.zzz')
+ end)
+
+ it('tries default extensions on a filename if $PATHEXT is empty', function()
+ -- Empty $PATHEXT defaults to ".com;.exe;.bat;.cmd".
+ clear({env={PATHEXT=''}})
+ for _,ext in ipairs(exts) do
+ eq(1, call('executable', 'test_executable_'..ext))
+ end
+ eq(0, call('executable', 'test_executable_zzz'))
+ end)
+
+ it('tries default extensions on a filepath if $PATHEXT is empty', function()
+ -- Empty $PATHEXT defaults to ".com;.exe;.bat;.cmd".
+ clear({env={PATHEXT=''}})
+ for _,ext in ipairs(exts) do
+ eq(1, call('executable', '.\\test_executable_'..ext))
+ end
+ eq(0, call('executable', '.\\test_executable_zzz'))
+ end)
+
+ it('full path with extension', function()
+ -- Some executable we can expect in the test env.
+ local exe = 'printargs-test'
+ local exedir = helpers.eval("fnamemodify(v:progpath, ':h')")
+ local exepath = exedir..'/'..exe..'.exe'
+ eq(1, call('executable', exepath))
+ eq('arg1=lemon;arg2=sky;arg3=tree;',
+ call('system', exepath..' lemon sky tree'))
+ end)
+
+ it('full path without extension', function()
+ -- Some executable we can expect in the test env.
+ local exe = 'printargs-test'
+ local exedir = helpers.eval("fnamemodify(v:progpath, ':h')")
+ local exepath = exedir..'/'..exe
+ eq('arg1=lemon;arg2=sky;arg3=tree;',
+ call('system', exepath..' lemon sky tree'))
+ eq(1, call('executable', exepath))
+ end)
+
+ it('respects $PATHEXT when trying extensions on a filename', function()
+ clear({env={PATHEXT='.zzz'}})
+ for _,ext in ipairs(exts) do
+ eq(0, call('executable', 'test_executable_'..ext))
+ end
+ eq(1, call('executable', 'test_executable_zzz'))
+ end)
+
+ it('respects $PATHEXT when trying extensions on a filepath', function()
+ clear({env={PATHEXT='.zzz'}})
+ for _,ext in ipairs(exts) do
+ eq(0, call('executable', '.\\test_executable_'..ext))
+ end
+ eq(1, call('executable', '.\\test_executable_zzz'))
+ end)
+
+ it('returns 1 for any existing filename', function()
+ clear({env={PATHEXT=''}})
+ for _,ext in ipairs(exts) do
+ eq(1, call('executable', 'test_executable_'..ext..'.'..ext))
+ end
+ eq(1, call('executable', 'test_executable_zzz.zzz'))
+ end)
+
+ it('returns 1 for any existing path (backslashes)', function()
+ clear({env={PATHEXT=''}})
+ for _,ext in ipairs(exts) do
+ eq(1, call('executable', '.\\test_executable_'..ext..'.'..ext))
+ eq(1, call('executable', './test_executable_'..ext..'.'..ext))
+ end
+ eq(1, call('executable', '.\\test_executable_zzz.zzz'))
+ eq(1, call('executable', './test_executable_zzz.zzz'))
+ end)
+end)
diff --git a/test/functional/eval/execute_spec.lua b/test/functional/eval/execute_spec.lua
new file mode 100644
index 0000000000..af37ab8d55
--- /dev/null
+++ b/test/functional/eval/execute_spec.lua
@@ -0,0 +1,206 @@
+local helpers = require('test.functional.helpers')(after_each)
+local eq = helpers.eq
+local eval = helpers.eval
+local clear = helpers.clear
+local source = helpers.source
+local redir_exec = helpers.redir_exec
+local exc_exec = helpers.exc_exec
+local funcs = helpers.funcs
+local Screen = require('test.functional.ui.screen')
+local command = helpers.command
+local feed = helpers.feed
+local iswin = helpers.iswin
+
+describe('execute()', function()
+ before_each(clear)
+
+ it('captures the same result as :redir', function()
+ eq(redir_exec('messages'), funcs.execute('messages'))
+ end)
+
+ it('captures the concatenated outputs of a List of commands', function()
+ eq("foobar", funcs.execute({'echon "foo"', 'echon "bar"'}))
+ eq("\nfoo\nbar", funcs.execute({'echo "foo"', 'echo "bar"'}))
+ end)
+
+ it('supports nested execute("execute(...)")', function()
+ eq('42', funcs.execute([[echon execute("echon execute('echon 42')")]]))
+ end)
+
+ it('supports nested :redir to a variable', function()
+ source([[
+ function! g:Foo()
+ let a = ''
+ redir => a
+ silent echon "foo"
+ redir END
+ return a
+ endfunction
+ function! g:Bar()
+ let a = ''
+ redir => a
+ silent echon "bar1"
+ call g:Foo()
+ silent echon "bar2"
+ redir END
+ silent echon "bar3"
+ return a
+ endfunction
+ ]])
+ eq('top1bar1foobar2bar3', funcs.execute('echon "top1"|call g:Bar()'))
+ end)
+
+ it('supports nested :redir to a register', function()
+ source([[
+ let @a = ''
+ function! g:Foo()
+ redir @a>>
+ silent echon "foo"
+ redir END
+ return @a
+ endfunction
+ function! g:Bar()
+ redir @a>>
+ silent echon "bar1"
+ call g:Foo()
+ silent echon "bar2"
+ redir END
+ silent echon "bar3"
+ return @a
+ endfunction
+ ]])
+ eq('top1bar1foobar2bar3', funcs.execute('echon "top1"|call g:Bar()'))
+ -- :redir itself doesn't nest, so the redirection ends in g:Foo
+ eq('bar1foo', eval('@a'))
+ end)
+
+ it('captures a transformed string', function()
+ eq('^A', funcs.execute('echon "\\<C-a>"'))
+ end)
+
+ it('returns empty string if the argument list is empty', function()
+ eq('', funcs.execute({}))
+ eq(0, exc_exec('let g:ret = execute(v:_null_list)'))
+ eq('', eval('g:ret'))
+ end)
+
+ it('captures errors', function()
+ local ret
+ ret = exc_exec('call execute(0.0)')
+ eq('Vim(call):E806: using Float as a String', ret)
+ ret = exc_exec('call execute(v:_null_dict)')
+ eq('Vim(call):E731: using Dictionary as a String', ret)
+ ret = exc_exec('call execute(function("tr"))')
+ eq('Vim(call):E729: using Funcref as a String', ret)
+ ret = exc_exec('call execute(["echo 42", 0.0, "echo 44"])')
+ eq('Vim:E806: using Float as a String', ret)
+ ret = exc_exec('call execute(["echo 42", v:_null_dict, "echo 44"])')
+ eq('Vim:E731: using Dictionary as a String', ret)
+ ret = exc_exec('call execute(["echo 42", function("tr"), "echo 44"])')
+ eq('Vim:E729: using Funcref as a String', ret)
+ end)
+
+ it('captures output with highlights', function()
+ eq('\nErrorMsg xxx ctermfg=15 ctermbg=1 guifg=White guibg=Red',
+ eval('execute("hi ErrorMsg")'))
+ end)
+
+ it('does not corrupt the command display #5422', function()
+ local screen = Screen.new(70, 7)
+ screen:attach()
+ feed(':echo execute("hi ErrorMsg")<CR>')
+ screen:expect([[
+ |
+ {1:~ }|
+ {1:~ }|
+ {2: }|
+ :echo execute("hi ErrorMsg") |
+ ErrorMsg xxx ctermfg=15 ctermbg=1 guifg=White guibg=Red |
+ {3:Press ENTER or type command to continue}^ |
+ ]], {
+ [1] = {bold = true, foreground = Screen.colors.Blue1},
+ [2] = {bold = true, reverse = true},
+ [3] = {bold = true, foreground = Screen.colors.SeaGreen4},
+ })
+ feed('<CR>')
+ end)
+
+ -- This deviates from vim behavior, but is consistent
+ -- with how nvim currently displays the output.
+ it('does capture shell-command output', function()
+ local win_lf = iswin() and '\13' or ''
+ eq('\n:!echo foo\r\n\nfoo'..win_lf..'\n', funcs.execute('!echo foo'))
+ end)
+
+ describe('{silent} argument', function()
+ it('captures & displays output for ""', function()
+ local screen = Screen.new(40, 5)
+ screen:attach()
+ command('let g:mes = execute("echon 42", "")')
+ screen:expect([[
+ ^ |
+ ~ |
+ ~ |
+ ~ |
+ 42 |
+ ]])
+ eq('42', eval('g:mes'))
+ end)
+
+ it('captures but does not display output for "silent"', function()
+ local screen = Screen.new(40, 5)
+ screen:attach()
+ command('let g:mes = execute("echon 42")')
+ screen:expect([[
+ ^ |
+ ~ |
+ ~ |
+ ~ |
+ |
+ ]])
+ eq('42', eval('g:mes'))
+
+ command('let g:mes = execute("echon 13", "silent")')
+ screen:expect{grid=[[
+ ^ |
+ ~ |
+ ~ |
+ ~ |
+ |
+ ]], unchanged=true}
+ eq('13', eval('g:mes'))
+ end)
+
+ it('suppresses errors for "silent!"', function()
+ eq(0, exc_exec('let g:mes = execute(0.0, "silent!")'))
+ eq('', eval('g:mes'))
+
+ eq(0, exc_exec('let g:mes = execute("echon add(1, 1)", "silent!")'))
+ eq('1', eval('g:mes'))
+
+ eq(0, exc_exec('let g:mes = execute(["echon 42", "echon add(1, 1)"], "silent!")'))
+ eq('421', eval('g:mes'))
+ end)
+
+ it('propagates errors for "" and "silent"', function()
+ local ret
+ ret = exc_exec('call execute(0.0, "")')
+ eq('Vim(call):E806: using Float as a String', ret)
+
+ ret = exc_exec('call execute(v:_null_dict, "silent")')
+ eq('Vim(call):E731: using Dictionary as a String', ret)
+
+ ret = exc_exec('call execute("echo add(1, 1)", "")')
+ eq('Vim(echo):E714: List required', ret)
+
+ ret = exc_exec('call execute(["echon 42", "echo add(1, 1)"], "")')
+ eq('Vim(echo):E714: List required', ret)
+
+ ret = exc_exec('call execute("echo add(1, 1)", "silent")')
+ eq('Vim(echo):E714: List required', ret)
+
+ ret = exc_exec('call execute(["echon 42", "echo add(1, 1)"], "silent")')
+ eq('Vim(echo):E714: List required', ret)
+ end)
+ end)
+end)
diff --git a/test/functional/eval/fnamemodify_spec.lua b/test/functional/eval/fnamemodify_spec.lua
new file mode 100644
index 0000000000..fe6b50a544
--- /dev/null
+++ b/test/functional/eval/fnamemodify_spec.lua
@@ -0,0 +1,39 @@
+local helpers = require('test.functional.helpers')(after_each)
+local clear = helpers.clear
+local eq = helpers.eq
+local iswin = helpers.iswin
+local fnamemodify = helpers.funcs.fnamemodify
+local command = helpers.command
+local write_file = helpers.write_file
+
+describe('fnamemodify()', function()
+ setup(function()
+ write_file('Xtest-fnamemodify.txt', [[foobar]])
+ end)
+
+ before_each(clear)
+
+ teardown(function()
+ os.remove('Xtest-fnamemodify.txt')
+ end)
+
+ it('works', function()
+ local root = helpers.pathroot()
+ eq(root, fnamemodify([[/]], ':p:h'))
+ eq(root, fnamemodify([[/]], ':p'))
+ if iswin() then
+ eq(root, fnamemodify([[\]], ':p:h'))
+ eq(root, fnamemodify([[\]], ':p'))
+ command('set shellslash')
+ root = string.sub(root, 1, -2)..'/'
+ eq(root, fnamemodify([[\]], ':p:h'))
+ eq(root, fnamemodify([[\]], ':p'))
+ eq(root, fnamemodify([[/]], ':p:h'))
+ eq(root, fnamemodify([[/]], ':p'))
+ end
+ end)
+
+ it(':8 works', function()
+ eq('Xtest-fnamemodify.txt', fnamemodify([[Xtest-fnamemodify.txt]], ':8'))
+ end)
+end)
diff --git a/test/functional/eval/function_spec.lua b/test/functional/eval/function_spec.lua
new file mode 100644
index 0000000000..776e760aaf
--- /dev/null
+++ b/test/functional/eval/function_spec.lua
@@ -0,0 +1,29 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local clear = helpers.clear
+local eq = helpers.eq
+local exc_exec = helpers.exc_exec
+
+describe('Up to MAX_FUNC_ARGS arguments are handled by', function()
+ local max_func_args = 20 -- from eval.h
+ local range = helpers.funcs.range
+
+ before_each(clear)
+
+ it('printf()', function()
+ local printf = helpers.funcs.printf
+ local rep = helpers.funcs['repeat']
+ local expected = '2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,'
+ eq(expected, printf(rep('%d,', max_func_args-1), unpack(range(2, max_func_args))))
+ local ret = exc_exec('call printf("", 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21)')
+ eq('Vim(call):E740: Too many arguments for function printf', ret)
+ end)
+
+ it('rpcnotify()', function()
+ local rpcnotify = helpers.funcs.rpcnotify
+ local ret = rpcnotify(0, 'foo', unpack(range(3, max_func_args)))
+ eq(1, ret)
+ ret = exc_exec('call rpcnotify(0, "foo", 3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21)')
+ eq('Vim(call):E740: Too many arguments for function rpcnotify', ret)
+ end)
+end)
diff --git a/test/functional/eval/getline_spec.lua b/test/functional/eval/getline_spec.lua
new file mode 100644
index 0000000000..3c56bde094
--- /dev/null
+++ b/test/functional/eval/getline_spec.lua
@@ -0,0 +1,39 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local call = helpers.call
+local clear = helpers.clear
+local eq = helpers.eq
+local expect = helpers.expect
+
+describe('getline()', function()
+ before_each(function()
+ clear()
+ call('setline', 1, {'a', 'b', 'c'})
+ expect([[
+ a
+ b
+ c]])
+ end)
+
+ it('returns empty string for invalid line', function()
+ eq('', call('getline', -1))
+ eq('', call('getline', 0))
+ eq('', call('getline', 4))
+ end)
+
+ it('returns empty list for invalid range', function()
+ eq({}, call('getline', 2, 1))
+ eq({}, call('getline', -1, 1))
+ eq({}, call('getline', 4, 4))
+ end)
+
+ it('returns value of valid line', function()
+ eq('b', call('getline', 2))
+ eq('a', call('getline', '.'))
+ end)
+
+ it('returns value of valid range', function()
+ eq({'a', 'b'}, call('getline', 1, 2))
+ eq({'a', 'b', 'c'}, call('getline', 1, 4))
+ end)
+end)
diff --git a/test/functional/eval/glob_spec.lua b/test/functional/eval/glob_spec.lua
index 599b3dcdc3..b8807ecfcc 100644
--- a/test/functional/eval/glob_spec.lua
+++ b/test/functional/eval/glob_spec.lua
@@ -1,13 +1,13 @@
local lfs = require('lfs')
local helpers = require('test.functional.helpers')(after_each)
-local clear, execute, eval, eq = helpers.clear, helpers.execute, helpers.eval, helpers.eq
+local clear, command, eval, eq = helpers.clear, helpers.command, helpers.eval, helpers.eq
before_each(function()
clear()
lfs.mkdir('test-glob')
-- Long path might cause "Press ENTER" prompt; use :silent to avoid it.
- execute('silent cd test-glob')
+ command('silent cd test-glob')
end)
after_each(function()
diff --git a/test/functional/eval/has_spec.lua b/test/functional/eval/has_spec.lua
new file mode 100644
index 0000000000..a3af2d1a20
--- /dev/null
+++ b/test/functional/eval/has_spec.lua
@@ -0,0 +1,66 @@
+local helpers = require('test.functional.helpers')(after_each)
+local eq = helpers.eq
+local clear = helpers.clear
+local funcs = helpers.funcs
+local iswin = helpers.iswin
+
+describe('has()', function()
+ before_each(clear)
+
+ it('"nvim-x.y.z"', function()
+ eq(0, funcs.has("nvim-"))
+ eq(0, funcs.has("nvim- "))
+ eq(0, funcs.has("nvim- \t "))
+ eq(0, funcs.has("nvim-0. 1. 1"))
+ eq(0, funcs.has("nvim-0. 1.1"))
+ eq(0, funcs.has("nvim-0.1. 1"))
+ eq(0, funcs.has("nvim-a"))
+ eq(0, funcs.has("nvim-a.b.c"))
+ eq(0, funcs.has("nvim-0.b.c"))
+ eq(0, funcs.has("nvim-0.0.c"))
+ eq(0, funcs.has("nvim-0.b.0"))
+ eq(0, funcs.has("nvim-a.b.0"))
+ eq(0, funcs.has("nvim-.0.0.0"))
+ eq(0, funcs.has("nvim-.0"))
+ eq(0, funcs.has("nvim-0."))
+ eq(0, funcs.has("nvim-0.."))
+ eq(0, funcs.has("nvim-."))
+ eq(0, funcs.has("nvim-.."))
+ eq(0, funcs.has("nvim-..."))
+ eq(0, funcs.has("nvim-42"))
+ eq(0, funcs.has("nvim-9999"))
+ eq(0, funcs.has("nvim-99.001.05"))
+
+ eq(1, funcs.has("nvim"))
+ eq(1, funcs.has("nvim-0"))
+ eq(1, funcs.has("nvim-0.1"))
+ eq(1, funcs.has("nvim-0.0.0"))
+ eq(1, funcs.has("nvim-0.1.1."))
+ eq(1, funcs.has("nvim-0.1.1.abc"))
+ eq(1, funcs.has("nvim-0.1.1.."))
+ eq(1, funcs.has("nvim-0.1.1.. .."))
+ eq(1, funcs.has("nvim-0.1.1.... "))
+ eq(1, funcs.has("nvim-0.0.0"))
+ eq(1, funcs.has("nvim-0.0.1"))
+ eq(1, funcs.has("nvim-0.1.0"))
+ eq(1, funcs.has("nvim-0.1.1"))
+ eq(1, funcs.has("nvim-0.1.5"))
+ eq(1, funcs.has("nvim-0000.001.05"))
+ eq(1, funcs.has("nvim-0.01.005"))
+ eq(1, funcs.has("nvim-00.001.05"))
+ end)
+
+ it('"unnamedplus"', function()
+ if (not iswin()) and funcs.has("clipboard") == 1 then
+ eq(1, funcs.has("unnamedplus"))
+ else
+ eq(0, funcs.has("unnamedplus"))
+ end
+ end)
+
+ it('"wsl"', function()
+ if 1 == funcs.has('win32') or 1 == funcs.has('mac') then
+ eq(0, funcs.has('wsl'))
+ end
+ end)
+end)
diff --git a/test/functional/eval/hostname_spec.lua b/test/functional/eval/hostname_spec.lua
new file mode 100644
index 0000000000..6112cf64e3
--- /dev/null
+++ b/test/functional/eval/hostname_spec.lua
@@ -0,0 +1,20 @@
+local helpers = require('test.functional.helpers')(after_each)
+local eq = helpers.eq
+local ok = helpers.ok
+local call = helpers.call
+local clear = helpers.clear
+local iswin = helpers.iswin
+
+describe('hostname()', function()
+ before_each(clear)
+
+ it('returns hostname string', function()
+ local actual = call('hostname')
+ ok(string.len(actual) > 0)
+ if call('executable', 'hostname') == 1 then
+ local expected = string.gsub(call('system', 'hostname'), '[\n\r]', '')
+ eq((iswin() and expected:upper() or expected),
+ (iswin() and actual:upper() or actual))
+ end
+ end)
+end)
diff --git a/test/functional/eval/input_spec.lua b/test/functional/eval/input_spec.lua
new file mode 100644
index 0000000000..e774b939f7
--- /dev/null
+++ b/test/functional/eval/input_spec.lua
@@ -0,0 +1,483 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+
+local eq = helpers.eq
+local feed = helpers.feed
+local meths = helpers.meths
+local clear = helpers.clear
+local source = helpers.source
+local command = helpers.command
+local exc_exec = helpers.exc_exec
+local nvim_async = helpers.nvim_async
+
+local screen
+
+before_each(function()
+ clear()
+ screen = Screen.new(25, 5)
+ screen:attach()
+ source([[
+ hi Test ctermfg=Red guifg=Red term=bold
+ function CustomCompl(...)
+ return 'TEST'
+ endfunction
+ function CustomListCompl(...)
+ return ['FOO']
+ endfunction
+
+ highlight RBP1 guibg=Red
+ highlight RBP2 guibg=Yellow
+ highlight RBP3 guibg=Green
+ highlight RBP4 guibg=Blue
+ let g:NUM_LVLS = 4
+ function Redraw()
+ redraw!
+ return ''
+ endfunction
+ cnoremap <expr> {REDRAW} Redraw()
+ function RainBowParens(cmdline)
+ let ret = []
+ let i = 0
+ let lvl = 0
+ while i < len(a:cmdline)
+ if a:cmdline[i] is# '('
+ call add(ret, [i, i + 1, 'RBP' . ((lvl % g:NUM_LVLS) + 1)])
+ let lvl += 1
+ elseif a:cmdline[i] is# ')'
+ let lvl -= 1
+ call add(ret, [i, i + 1, 'RBP' . ((lvl % g:NUM_LVLS) + 1)])
+ endif
+ let i += 1
+ endwhile
+ return ret
+ endfunction
+ ]])
+ screen:set_default_attr_ids({
+ EOB={bold = true, foreground = Screen.colors.Blue1},
+ T={foreground=Screen.colors.Red},
+ RBP1={background=Screen.colors.Red},
+ RBP2={background=Screen.colors.Yellow},
+ RBP3={background=Screen.colors.Green},
+ RBP4={background=Screen.colors.Blue},
+ SEP={bold = true, reverse = true},
+ CONFIRM={bold = true, foreground = Screen.colors.SeaGreen4},
+ })
+end)
+
+describe('input()', function()
+ it('works with multiline prompts', function()
+ feed([[:call input("Test\nFoo")<CR>]])
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {SEP: }|
+ Test |
+ Foo^ |
+ ]])
+ end)
+ it('works with multiline prompts and :echohl', function()
+ feed([[:echohl Test | call input("Test\nFoo")<CR>]])
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {SEP: }|
+ {T:Test} |
+ {T:Foo}^ |
+ ]])
+ command('redraw!')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {T:Foo}^ |
+ ]])
+ end)
+ it('allows unequal numeric arguments when using multiple args', function()
+ command('echohl Test')
+ feed([[:call input(1, 2)<CR>]])
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {T:1}2^ |
+ ]])
+ feed('<BS>')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {T:1}^ |
+ ]])
+ end)
+ it('allows unequal numeric values when using {opts} dictionary', function()
+ command('echohl Test')
+ meths.set_var('opts', {prompt=1, default=2, cancelreturn=3})
+ feed([[:echo input(opts)<CR>]])
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {T:1}2^ |
+ ]])
+ feed('<BS>')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {T:1}^ |
+ ]])
+ feed('<Esc>')
+ screen:expect([[
+ ^ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {T:3} |
+ ]])
+ end)
+ it('works with redraw', function()
+ command('echohl Test')
+ meths.set_var('opts', {prompt='Foo>', default='Bar'})
+ feed([[:echo inputdialog(opts)<CR>]])
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {T:Foo>}Bar^ |
+ ]])
+ command('mode')
+ screen:expect{grid=[[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {T:Foo>}Bar^ |
+ ]], reset=true}
+ feed('<BS>')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {T:Foo>}Ba^ |
+ ]])
+ command('mode')
+ screen:expect{grid=[[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {T:Foo>}Ba^ |
+ ]], reset=true}
+ end)
+ it('allows omitting everything with dictionary argument', function()
+ command('echohl Test')
+ feed([[:call input({})<CR>]])
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ ^ |
+ ]])
+ end)
+ it('supports completion', function()
+ feed(':let var = input("", "", "custom,CustomCompl")<CR>')
+ feed('<Tab><CR>')
+ eq('TEST', meths.get_var('var'))
+
+ feed(':let var = input({"completion": "customlist,CustomListCompl"})<CR>')
+ feed('<Tab><CR>')
+ eq('FOO', meths.get_var('var'))
+ end)
+ it('supports cancelreturn', function()
+ feed(':let var = input({"cancelreturn": "BAR"})<CR>')
+ feed('<Esc>')
+ eq('BAR', meths.get_var('var'))
+ end)
+ it('supports default string', function()
+ feed(':let var = input("", "DEF1")<CR>')
+ feed('<CR>')
+ eq('DEF1', meths.get_var('var'))
+
+ feed(':let var = input({"default": "DEF2"})<CR>')
+ feed('<CR>')
+ eq('DEF2', meths.get_var('var'))
+ end)
+ it('errors out on invalid inputs', function()
+ eq('Vim(call):E730: using List as a String',
+ exc_exec('call input([])'))
+ eq('Vim(call):E730: using List as a String',
+ exc_exec('call input("", [])'))
+ eq('Vim(call):E730: using List as a String',
+ exc_exec('call input("", "", [])'))
+ eq('Vim(call):E730: using List as a String',
+ exc_exec('call input({"prompt": []})'))
+ eq('Vim(call):E730: using List as a String',
+ exc_exec('call input({"cancelreturn": []})'))
+ eq('Vim(call):E730: using List as a String',
+ exc_exec('call input({"default": []})'))
+ eq('Vim(call):E730: using List as a String',
+ exc_exec('call input({"completion": []})'))
+ eq('Vim(call):E5050: {opts} must be the only argument',
+ exc_exec('call input({}, "default")'))
+ eq('Vim(call):E118: Too many arguments for function: input',
+ exc_exec('call input("prompt> ", "default", "file", "extra")'))
+ end)
+ it('supports highlighting', function()
+ command('nnoremap <expr> X input({"highlight": "RainBowParens"})[-1]')
+ feed([[X]])
+ feed('(())')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {RBP1:(}{RBP2:()}{RBP1:)}^ |
+ ]])
+ end)
+ it('is not hidden by :silent', function()
+ feed([[:silent call input('Foo: ')<CR>]])
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {SEP: }|
+ Foo: ^ |
+ |
+ ]])
+ feed('Bar')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {SEP: }|
+ Foo: Bar^ |
+ |
+ ]])
+ feed('<CR>')
+ end)
+end)
+describe('inputdialog()', function()
+ it('works with multiline prompts', function()
+ feed([[:call inputdialog("Test\nFoo")<CR>]])
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {SEP: }|
+ Test |
+ Foo^ |
+ ]])
+ end)
+ it('works with multiline prompts and :echohl', function()
+ feed([[:echohl Test | call inputdialog("Test\nFoo")<CR>]])
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {SEP: }|
+ {T:Test} |
+ {T:Foo}^ |
+ ]])
+ command('redraw!')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {T:Foo}^ |
+ ]])
+ end)
+ it('allows unequal numeric arguments when using multiple args', function()
+ command('echohl Test')
+ feed([[:call inputdialog(1, 2)<CR>]])
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {T:1}2^ |
+ ]])
+ feed('<BS>')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {T:1}^ |
+ ]])
+ end)
+ it('allows unequal numeric values when using {opts} dictionary', function()
+ command('echohl Test')
+ meths.set_var('opts', {prompt=1, default=2, cancelreturn=3})
+ feed([[:echo input(opts)<CR>]])
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {T:1}2^ |
+ ]])
+ feed('<BS>')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {T:1}^ |
+ ]])
+ feed('<Esc>')
+ screen:expect([[
+ ^ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {T:3} |
+ ]])
+ end)
+ it('works with redraw', function()
+ command('echohl Test')
+ meths.set_var('opts', {prompt='Foo>', default='Bar'})
+ feed([[:echo input(opts)<CR>]])
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {T:Foo>}Bar^ |
+ ]])
+ command('mode')
+ screen:expect{grid=[[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {T:Foo>}Bar^ |
+ ]], reset=true}
+ feed('<BS>')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {T:Foo>}Ba^ |
+ ]])
+ command('mode')
+ screen:expect{grid=[[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {T:Foo>}Ba^ |
+ ]], reset=true}
+ end)
+ it('allows omitting everything with dictionary argument', function()
+ command('echohl Test')
+ feed(':echo inputdialog({})<CR>')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ ^ |
+ ]])
+ end)
+ it('supports completion', function()
+ feed(':let var = inputdialog({"completion": "customlist,CustomListCompl"})<CR>')
+ feed('<Tab><CR>')
+ eq('FOO', meths.get_var('var'))
+ end)
+ it('supports cancelreturn', function()
+ feed(':let var = inputdialog("", "", "CR1")<CR>')
+ feed('<Esc>')
+ eq('CR1', meths.get_var('var'))
+
+ feed(':let var = inputdialog({"cancelreturn": "BAR"})<CR>')
+ feed('<Esc>')
+ eq('BAR', meths.get_var('var'))
+ end)
+ it('supports default string', function()
+ feed(':let var = inputdialog("", "DEF1")<CR>')
+ feed('<CR>')
+ eq('DEF1', meths.get_var('var'))
+
+ feed(':let var = inputdialog({"default": "DEF2"})<CR>')
+ feed('<CR>')
+ eq('DEF2', meths.get_var('var'))
+ end)
+ it('errors out on invalid inputs', function()
+ eq('Vim(call):E730: using List as a String',
+ exc_exec('call inputdialog([])'))
+ eq('Vim(call):E730: using List as a String',
+ exc_exec('call inputdialog("", [])'))
+ eq('Vim(call):E730: using List as a String',
+ exc_exec('call inputdialog("", "", [])'))
+ eq('Vim(call):E730: using List as a String',
+ exc_exec('call inputdialog({"prompt": []})'))
+ eq('Vim(call):E730: using List as a String',
+ exc_exec('call inputdialog({"cancelreturn": []})'))
+ eq('Vim(call):E730: using List as a String',
+ exc_exec('call inputdialog({"default": []})'))
+ eq('Vim(call):E730: using List as a String',
+ exc_exec('call inputdialog({"completion": []})'))
+ eq('Vim(call):E5050: {opts} must be the only argument',
+ exc_exec('call inputdialog({}, "default")'))
+ eq('Vim(call):E118: Too many arguments for function: inputdialog',
+ exc_exec('call inputdialog("prompt> ", "default", "file", "extra")'))
+ end)
+ it('supports highlighting', function()
+ command('nnoremap <expr> X inputdialog({"highlight": "RainBowParens"})[-1]')
+ feed([[X]])
+ feed('(())')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {RBP1:(}{RBP2:()}{RBP1:)}^ |
+ ]])
+ end)
+end)
+
+describe('confirm()', function()
+ it("shows dialog even if :silent #8788", function()
+ command("autocmd BufNewFile * call confirm('test')")
+
+ local function check_and_clear(edit_line)
+ screen:expect([[
+ |
+ {SEP: }|
+ ]]..edit_line..[[
+ {CONFIRM:test} |
+ {CONFIRM:[O]k: }^ |
+ ]])
+ feed('<cr>')
+ command('redraw')
+ command('bdelete!')
+ end
+
+ -- With shortmess-=F
+ command('set shortmess-=F')
+ feed(':edit foo<cr>')
+ check_and_clear('"foo" [New File] |\n')
+
+ -- With shortmess+=F
+ command('set shortmess+=F')
+ feed(':edit foo<cr>')
+ check_and_clear(':edit foo |\n')
+
+ -- With :silent
+ feed(':silent edit foo<cr>')
+ check_and_clear(':silent edit foo |\n')
+
+ -- With API (via eval/VimL) call and shortmess+=F
+ feed(':call nvim_command("edit x")<cr>')
+ check_and_clear(':call nvim_command("edit |\n')
+
+ nvim_async('command', 'edit x')
+ check_and_clear(' |\n')
+ end)
+end)
diff --git a/test/functional/eval/interrupt_spec.lua b/test/functional/eval/interrupt_spec.lua
new file mode 100644
index 0000000000..7f4ca95317
--- /dev/null
+++ b/test/functional/eval/interrupt_spec.lua
@@ -0,0 +1,61 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local command = helpers.command
+local meths = helpers.meths
+local clear = helpers.clear
+local sleep = helpers.sleep
+local wait = helpers.wait
+local feed = helpers.feed
+local eq = helpers.eq
+
+local dur
+local min_dur = 8
+local len = 131072
+
+describe('List support code', function()
+ if not pending('does not actually allows interrupting with just got_int', function() end) then return end
+ -- The following tests are confirmed to work with os_breakcheck() just before
+ -- `if (got_int) {break;}` in tv_list_copy and list_join_inner() and not to
+ -- work without.
+ setup(function()
+ clear()
+ dur = 0
+ while true do
+ command(([[
+ let rt = reltime()
+ let bl = range(%u)
+ let dur = reltimestr(reltime(rt))
+ ]]):format(len))
+ dur = tonumber(meths.get_var('dur'))
+ if dur >= min_dur then
+ -- print(('Using len %u, dur %g'):format(len, dur))
+ break
+ else
+ len = len * 2
+ end
+ end
+ end)
+ it('allows interrupting copy', function()
+ feed(':let t_rt = reltime()<CR>:let t_bl = copy(bl)<CR>')
+ sleep(min_dur / 16 * 1000)
+ feed('<C-c>')
+ wait()
+ command('let t_dur = reltimestr(reltime(t_rt))')
+ local t_dur = tonumber(meths.get_var('t_dur'))
+ if t_dur >= dur / 8 then
+ eq(nil, ('Took too long to cancel: %g >= %g'):format(t_dur, dur / 8))
+ end
+ end)
+ it('allows interrupting join', function()
+ feed(':let t_rt = reltime()<CR>:let t_j = join(bl)<CR>')
+ sleep(min_dur / 16 * 1000)
+ feed('<C-c>')
+ wait()
+ command('let t_dur = reltimestr(reltime(t_rt))')
+ local t_dur = tonumber(meths.get_var('t_dur'))
+ print(('t_dur: %g'):format(t_dur))
+ if t_dur >= dur / 8 then
+ eq(nil, ('Took too long to cancel: %g >= %g'):format(t_dur, dur / 8))
+ end
+ end)
+end)
diff --git a/test/functional/eval/json_functions_spec.lua b/test/functional/eval/json_functions_spec.lua
index 159d775ff1..8dcaea806e 100644
--- a/test/functional/eval/json_functions_spec.lua
+++ b/test/functional/eval/json_functions_spec.lua
@@ -4,16 +4,17 @@ local funcs = helpers.funcs
local meths = helpers.meths
local eq = helpers.eq
local eval = helpers.eval
-local execute = helpers.execute
+local command = helpers.command
local exc_exec = helpers.exc_exec
local redir_exec = helpers.redir_exec
local NIL = helpers.NIL
+local source = helpers.source
describe('json_decode() function', function()
local restart = function(...)
clear(...)
- execute('language C')
- execute([[
+ source([[
+ language C
function Eq(exp, act)
let act = a:act
let exp = a:exp
@@ -45,8 +46,6 @@ describe('json_decode() function', function()
endif
return 1
endfunction
- ]])
- execute([[
function EvalEq(exp, act_expr)
let act = eval(a:act_expr)
if Eq(a:exp, act)
@@ -441,7 +440,7 @@ describe('json_decode() function', function()
local sp_decode_eq = function(expected, json)
meths.set_var('__json', json)
speq(expected, 'json_decode(g:__json)')
- execute('unlet! g:__json')
+ command('unlet! g:__json')
end
it('parses strings with NUL properly', function()
@@ -489,18 +488,6 @@ describe('json_decode() function', function()
'{"b": 3, "a": 1, "c": 4, "d": 2, "\\u0000": 4}')
end)
- it('converts strings to latin1 when &encoding is latin1', function()
- restart('--cmd', 'set encoding=latin1')
- eq('\171', funcs.json_decode('"\\u00AB"'))
- sp_decode_eq({_TYPE='string', _VAL={'\n\171\n'}}, '"\\u0000\\u00AB\\u0000"')
- end)
-
- it('fails to convert string to latin1 if it is impossible', function()
- restart('--cmd', 'set encoding=latin1')
- eq('Vim(call):E474: Failed to convert string "๊ฏ" from UTF-8',
- exc_exec('call json_decode(\'"\\uABCD"\')'))
- end)
-
it('parses U+00C3 correctly', function()
eq('\195\131', funcs.json_decode('"\195\131"'))
end)
@@ -528,14 +515,6 @@ describe('json_decode() function', function()
eq({key={'val', 'val2'}, key2=1}, funcs.json_decode(str))
end)
- it('always treats input as UTF-8', function()
- -- When &encoding is latin1 string "ยซ" is U+00C2 U+00AB U+00C2: ร‚ยซร‚. So if
- -- '"ยซ"' was parsed as latin1 json_decode would return three characters, and
- -- only one U+00AB when this string is parsed as latin1.
- restart('--cmd', 'set encoding=latin1')
- eq(('%c'):format(0xAB), funcs.json_decode('"ยซ"'))
- end)
-
it('does not overflow when writing error message about decoding ["", ""]',
function()
eq('\nE474: Attempt to decode a blank string'
@@ -547,7 +526,7 @@ end)
describe('json_encode() function', function()
before_each(function()
clear()
- execute('language C')
+ command('language C')
end)
it('dumps strings', function()
@@ -596,94 +575,94 @@ describe('json_encode() function', function()
it('cannot dump generic mapping with generic mapping keys and values',
function()
- execute('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": []}')
- execute('let todumpv1 = {"_TYPE": v:msgpack_types.map, "_VAL": []}')
- execute('let todumpv2 = {"_TYPE": v:msgpack_types.map, "_VAL": []}')
- execute('call add(todump._VAL, [todumpv1, todumpv2])')
+ command('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": []}')
+ command('let todumpv1 = {"_TYPE": v:msgpack_types.map, "_VAL": []}')
+ command('let todumpv2 = {"_TYPE": v:msgpack_types.map, "_VAL": []}')
+ command('call add(todump._VAL, [todumpv1, todumpv2])')
eq('Vim(call):E474: Invalid key in special dictionary', exc_exec('call json_encode(todump)'))
end)
it('cannot dump generic mapping with ext key', function()
- execute('let todump = {"_TYPE": v:msgpack_types.ext, "_VAL": [5, ["",""]]}')
- execute('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": [[todump, 1]]}')
+ command('let todump = {"_TYPE": v:msgpack_types.ext, "_VAL": [5, ["",""]]}')
+ command('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": [[todump, 1]]}')
eq('Vim(call):E474: Invalid key in special dictionary', exc_exec('call json_encode(todump)'))
end)
it('cannot dump generic mapping with array key', function()
- execute('let todump = {"_TYPE": v:msgpack_types.array, "_VAL": [5, [""]]}')
- execute('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": [[todump, 1]]}')
+ command('let todump = {"_TYPE": v:msgpack_types.array, "_VAL": [5, [""]]}')
+ command('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": [[todump, 1]]}')
eq('Vim(call):E474: Invalid key in special dictionary', exc_exec('call json_encode(todump)'))
end)
it('cannot dump generic mapping with UINT64_MAX key', function()
- execute('let todump = {"_TYPE": v:msgpack_types.integer}')
- execute('let todump._VAL = [1, 3, 0x7FFFFFFF, 0x7FFFFFFF]')
- execute('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": [[todump, 1]]}')
+ command('let todump = {"_TYPE": v:msgpack_types.integer}')
+ command('let todump._VAL = [1, 3, 0x7FFFFFFF, 0x7FFFFFFF]')
+ command('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": [[todump, 1]]}')
eq('Vim(call):E474: Invalid key in special dictionary', exc_exec('call json_encode(todump)'))
end)
it('cannot dump generic mapping with floating-point key', function()
- execute('let todump = {"_TYPE": v:msgpack_types.float, "_VAL": 0.125}')
- execute('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": [[todump, 1]]}')
+ command('let todump = {"_TYPE": v:msgpack_types.float, "_VAL": 0.125}')
+ command('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": [[todump, 1]]}')
eq('Vim(call):E474: Invalid key in special dictionary', exc_exec('call json_encode(todump)'))
end)
it('can dump generic mapping with STR special key and NUL', function()
- execute('let todump = {"_TYPE": v:msgpack_types.string, "_VAL": ["\\n"]}')
- execute('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": [[todump, 1]]}')
+ command('let todump = {"_TYPE": v:msgpack_types.string, "_VAL": ["\\n"]}')
+ command('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": [[todump, 1]]}')
eq('{"\\u0000": 1}', eval('json_encode(todump)'))
end)
it('can dump generic mapping with BIN special key and NUL', function()
- execute('let todump = {"_TYPE": v:msgpack_types.binary, "_VAL": ["\\n"]}')
- execute('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": [[todump, 1]]}')
+ command('let todump = {"_TYPE": v:msgpack_types.binary, "_VAL": ["\\n"]}')
+ command('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": [[todump, 1]]}')
eq('{"\\u0000": 1}', eval('json_encode(todump)'))
end)
it('can dump STR special mapping with NUL and NL', function()
- execute('let todump = {"_TYPE": v:msgpack_types.string, "_VAL": ["\\n", ""]}')
+ command('let todump = {"_TYPE": v:msgpack_types.string, "_VAL": ["\\n", ""]}')
eq('"\\u0000\\n"', eval('json_encode(todump)'))
end)
it('can dump BIN special mapping with NUL and NL', function()
- execute('let todump = {"_TYPE": v:msgpack_types.binary, "_VAL": ["\\n", ""]}')
+ command('let todump = {"_TYPE": v:msgpack_types.binary, "_VAL": ["\\n", ""]}')
eq('"\\u0000\\n"', eval('json_encode(todump)'))
end)
it('cannot dump special ext mapping', function()
- execute('let todump = {"_TYPE": v:msgpack_types.ext, "_VAL": [5, ["",""]]}')
+ command('let todump = {"_TYPE": v:msgpack_types.ext, "_VAL": [5, ["",""]]}')
eq('Vim(call):E474: Unable to convert EXT string to JSON', exc_exec('call json_encode(todump)'))
end)
it('can dump special array mapping', function()
- execute('let todump = {"_TYPE": v:msgpack_types.array, "_VAL": [5, [""]]}')
+ command('let todump = {"_TYPE": v:msgpack_types.array, "_VAL": [5, [""]]}')
eq('[5, [""]]', eval('json_encode(todump)'))
end)
it('can dump special UINT64_MAX mapping', function()
- execute('let todump = {"_TYPE": v:msgpack_types.integer}')
- execute('let todump._VAL = [1, 3, 0x7FFFFFFF, 0x7FFFFFFF]')
+ command('let todump = {"_TYPE": v:msgpack_types.integer}')
+ command('let todump._VAL = [1, 3, 0x7FFFFFFF, 0x7FFFFFFF]')
eq('18446744073709551615', eval('json_encode(todump)'))
end)
it('can dump special INT64_MIN mapping', function()
- execute('let todump = {"_TYPE": v:msgpack_types.integer}')
- execute('let todump._VAL = [-1, 2, 0, 0]')
+ command('let todump = {"_TYPE": v:msgpack_types.integer}')
+ command('let todump._VAL = [-1, 2, 0, 0]')
eq('-9223372036854775808', eval('json_encode(todump)'))
end)
it('can dump special BOOLEAN true mapping', function()
- execute('let todump = {"_TYPE": v:msgpack_types.boolean, "_VAL": 1}')
+ command('let todump = {"_TYPE": v:msgpack_types.boolean, "_VAL": 1}')
eq('true', eval('json_encode(todump)'))
end)
it('can dump special BOOLEAN false mapping', function()
- execute('let todump = {"_TYPE": v:msgpack_types.boolean, "_VAL": 0}')
+ command('let todump = {"_TYPE": v:msgpack_types.boolean, "_VAL": 0}')
eq('false', eval('json_encode(todump)'))
end)
it('can dump special NIL mapping', function()
- execute('let todump = {"_TYPE": v:msgpack_types.nil, "_VAL": 0}')
+ command('let todump = {"_TYPE": v:msgpack_types.nil, "_VAL": 0}')
eq('null', eval('json_encode(todump)'))
end)
@@ -692,62 +671,68 @@ describe('json_encode() function', function()
exc_exec('call json_encode(function("tr"))'))
end)
+ it('fails to dump a partial', function()
+ command('function T() dict\nendfunction')
+ eq('Vim(call):E474: Error while dumping encode_tv2json() argument, itself: attempt to dump function reference',
+ exc_exec('call json_encode(function("T", [1, 2], {}))'))
+ end)
+
it('fails to dump a function reference in a list', function()
eq('Vim(call):E474: Error while dumping encode_tv2json() argument, index 0: attempt to dump function reference',
exc_exec('call json_encode([function("tr")])'))
end)
it('fails to dump a recursive list', function()
- execute('let todump = [[[]]]')
- execute('call add(todump[0][0], todump)')
+ command('let todump = [[[]]]')
+ command('call add(todump[0][0], todump)')
eq('Vim(call):E724: unable to correctly dump variable with self-referencing container',
exc_exec('call json_encode(todump)'))
end)
it('fails to dump a recursive dict', function()
- execute('let todump = {"d": {"d": {}}}')
- execute('call extend(todump.d.d, {"d": todump})')
+ command('let todump = {"d": {"d": {}}}')
+ command('call extend(todump.d.d, {"d": todump})')
eq('Vim(call):E724: unable to correctly dump variable with self-referencing container',
exc_exec('call json_encode([todump])'))
end)
it('can dump dict with two same dicts inside', function()
- execute('let inter = {}')
- execute('let todump = {"a": inter, "b": inter}')
+ command('let inter = {}')
+ command('let todump = {"a": inter, "b": inter}')
eq('{"a": {}, "b": {}}', eval('json_encode(todump)'))
end)
it('can dump list with two same lists inside', function()
- execute('let inter = []')
- execute('let todump = [inter, inter]')
+ command('let inter = []')
+ command('let todump = [inter, inter]')
eq('[[], []]', eval('json_encode(todump)'))
end)
it('fails to dump a recursive list in a special dict', function()
- execute('let todump = {"_TYPE": v:msgpack_types.array, "_VAL": []}')
- execute('call add(todump._VAL, todump)')
+ command('let todump = {"_TYPE": v:msgpack_types.array, "_VAL": []}')
+ command('call add(todump._VAL, todump)')
eq('Vim(call):E724: unable to correctly dump variable with self-referencing container',
exc_exec('call json_encode(todump)'))
end)
it('fails to dump a recursive (val) map in a special dict', function()
- execute('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": []}')
- execute('call add(todump._VAL, ["", todump])')
+ command('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": []}')
+ command('call add(todump._VAL, ["", todump])')
eq('Vim(call):E724: unable to correctly dump variable with self-referencing container',
exc_exec('call json_encode([todump])'))
end)
it('fails to dump a recursive (val) map in a special dict, _VAL reference', function()
- execute('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": [["", []]]}')
- execute('call add(todump._VAL[0][1], todump._VAL)')
+ command('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": [["", []]]}')
+ command('call add(todump._VAL[0][1], todump._VAL)')
eq('Vim(call):E724: unable to correctly dump variable with self-referencing container',
exc_exec('call json_encode(todump)'))
end)
it('fails to dump a recursive (val) special list in a special dict',
function()
- execute('let todump = {"_TYPE": v:msgpack_types.array, "_VAL": []}')
- execute('call add(todump._VAL, ["", todump._VAL])')
+ command('let todump = {"_TYPE": v:msgpack_types.array, "_VAL": []}')
+ command('call add(todump._VAL, ["", todump._VAL])')
eq('Vim(call):E724: unable to correctly dump variable with self-referencing container',
exc_exec('call json_encode(todump)'))
end)
@@ -762,12 +747,6 @@ describe('json_encode() function', function()
exc_exec('call json_encode(["", ""], 1)'))
end)
- it('converts strings from latin1 when &encoding is latin1', function()
- clear('--cmd', 'set encoding=latin1')
- eq('"\\u00AB"', funcs.json_encode('\171'))
- eq('"\\u0000\\u00AB\\u0000"', eval('json_encode({"_TYPE": v:msgpack_types.string, "_VAL": ["\\n\171\\n"]})'))
- end)
-
it('ignores improper values in &isprint', function()
meths.set_option('isprint', '1')
eq(1, eval('"\1" =~# "\\\\p"'))
@@ -797,4 +776,11 @@ describe('json_encode() function', function()
it('can dump NULL dictionary', function()
eq('{}', eval('json_encode(v:_null_dict)'))
end)
+
+ it('fails to parse NULL strings and lists', function()
+ eq('Vim(call):E474: Attempt to decode a blank string',
+ exc_exec('call json_decode($XXX_UNEXISTENT_VAR_XXX)'))
+ eq('Vim(call):E474: Attempt to decode a blank string',
+ exc_exec('call json_decode(v:_null_list)'))
+ end)
end)
diff --git a/test/functional/eval/let_spec.lua b/test/functional/eval/let_spec.lua
new file mode 100644
index 0000000000..1bd3405698
--- /dev/null
+++ b/test/functional/eval/let_spec.lua
@@ -0,0 +1,45 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local eq = helpers.eq
+local clear = helpers.clear
+local meths = helpers.meths
+local redir_exec = helpers.redir_exec
+local source = helpers.source
+
+before_each(clear)
+
+describe(':let command', function()
+ it('correctly lists variables with curly-braces', function()
+ meths.set_var('v', {0})
+ eq('\nv [0]', redir_exec('let {"v"}'))
+ end)
+
+ it('correctly lists variables with subscript', function()
+ meths.set_var('v', {0})
+ eq('\nv[0] #0', redir_exec('let v[0]'))
+ eq('\ng:["v"][0] #0', redir_exec('let g:["v"][0]'))
+ eq('\n{"g:"}["v"][0] #0', redir_exec('let {"g:"}["v"][0]'))
+ end)
+
+ it(":unlet self-referencing node in a List graph #6070", function()
+ -- :unlet-ing a self-referencing List must not allow GC on indirectly
+ -- referenced in-scope Lists. Before #6070 this caused use-after-free.
+ source([=[
+ let [l1, l2] = [[], []]
+ echo 'l1:' . id(l1)
+ echo 'l2:' . id(l2)
+ echo ''
+ let [l3, l4] = [[], []]
+ call add(l4, l4)
+ call add(l4, l3)
+ call add(l3, 1)
+ call add(l2, l2)
+ call add(l2, l1)
+ call add(l1, 1)
+ unlet l2
+ unlet l4
+ call garbagecollect(1)
+ call feedkeys(":\e:echo l1 l3\n:echo 42\n:cq\n", "t")
+ ]=])
+ end)
+end)
diff --git a/test/functional/eval/map_functions_spec.lua b/test/functional/eval/map_functions_spec.lua
new file mode 100644
index 0000000000..e914f674aa
--- /dev/null
+++ b/test/functional/eval/map_functions_spec.lua
@@ -0,0 +1,159 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local clear = helpers.clear
+local eq = helpers.eq
+local eval = helpers.eval
+local funcs = helpers.funcs
+local nvim = helpers.nvim
+local source = helpers.source
+local command = helpers.command
+
+describe('maparg()', function()
+ before_each(clear)
+
+ local foo_bar_map_table = {
+ lhs='foo',
+ silent=0,
+ rhs='bar',
+ expr=0,
+ sid=0,
+ buffer=0,
+ nowait=0,
+ mode='n',
+ noremap=1,
+ }
+
+ it('returns a dictionary', function()
+ nvim('command', 'nnoremap foo bar')
+ eq('bar', funcs.maparg('foo'))
+ eq(foo_bar_map_table, funcs.maparg('foo', 'n', false, true))
+ end)
+
+ it('returns 1 for silent when <silent> is used', function()
+ nvim('command', 'nnoremap <silent> foo bar')
+ eq(1, funcs.maparg('foo', 'n', false, true)['silent'])
+
+ nvim('command', 'nnoremap baz bat')
+ eq(0, funcs.maparg('baz', 'n', false, true)['silent'])
+ end)
+
+ it('returns an empty string when no map is present', function()
+ eq('', funcs.maparg('not a mapping'))
+ end)
+
+ it('returns an empty dictionary when no map is present and dict is requested', function()
+ eq({}, funcs.maparg('not a mapping', 'n', false, true))
+ end)
+
+ it('returns the same value for noremap and <script>', function()
+ nvim('command', 'inoremap <script> hello world')
+ nvim('command', 'inoremap this that')
+ eq(
+ funcs.maparg('hello', 'i', false, true)['noremap'],
+ funcs.maparg('this', 'i', false, true)['noremap']
+ )
+ end)
+
+ it('returns a boolean for buffer', function()
+ -- Open enough windows to know we aren't on buffer number 1
+ nvim('command', 'new')
+ nvim('command', 'new')
+ nvim('command', 'new')
+ nvim('command', 'cnoremap <buffer> this that')
+ eq(1, funcs.maparg('this', 'c', false, true)['buffer'])
+
+ -- Global will return 0 always
+ nvim('command', 'nnoremap other another')
+ eq(0, funcs.maparg('other', 'n', false, true)['buffer'])
+ end)
+
+ it('returns script numbers', function()
+ source([[
+ function! s:maparg_test_function() abort
+ return 'testing'
+ endfunction
+
+ nnoremap fizz :call <SID>maparg_test_function()<CR>
+ ]])
+ eq(1, funcs.maparg('fizz', 'n', false, true)['sid'])
+ eq('testing', nvim('call_function', '<SNR>1_maparg_test_function', {}))
+ end)
+
+ it('works with <F12> and others', function()
+ source([[
+ let g:maparg_test_var = 0
+
+ nnoremap <F12> :let g:maparg_test_var = 1<CR>
+ ]])
+ eq(0, eval('g:maparg_test_var'))
+ source([[
+ call feedkeys("\<F12>")
+ ]])
+ eq(1, eval('g:maparg_test_var'))
+
+ eq(':let g:maparg_test_var = 1<CR>', funcs.maparg('<F12>', 'n', false, true)['rhs'])
+ end)
+
+ it('works with <expr>', function()
+ source([[
+ let counter = 0
+ inoremap <expr> <C-L> ListItem()
+ inoremap <expr> <C-R> ListReset()
+
+ func ListItem()
+ let g:counter += 1
+ return g:counter . '. '
+ endfunc
+
+ func ListReset()
+ let g:counter = 0
+ return ''
+ endfunc
+
+ call feedkeys("i\<C-L>")
+ ]])
+ eq(1, eval('g:counter'))
+
+ local map_dict = funcs.maparg('<C-L>', 'i', false, true)
+ eq(1, map_dict['expr'])
+ eq('i', map_dict['mode'])
+ end)
+
+ it('works with combining characters', function()
+ -- Using addacutes to make combining character better visible
+ local function ac(s)
+ local acute = '\204\129' -- U+0301 COMBINING ACUTE ACCENT
+ local ret = s:gsub('`', acute)
+ return ret
+ end
+ command(ac([[
+ nnoremap a b`
+ nnoremap c` d
+ nnoremap e` f`
+ ]]))
+ eq(ac('b`'), funcs.maparg(ac('a')))
+ eq(ac(''), funcs.maparg(ac('c')))
+ eq(ac('d'), funcs.maparg(ac('c`')))
+ eq(ac('f`'), funcs.maparg(ac('e`')))
+
+ local function acmap(lhs, rhs)
+ return {
+ lhs = ac(lhs),
+ rhs = ac(rhs),
+
+ buffer = 0,
+ expr = 0,
+ mode = 'n',
+ noremap = 1,
+ nowait = 0,
+ sid = 0,
+ silent = 0,
+ }
+ end
+
+ eq({}, funcs.maparg(ac('c'), 'n', 0, 1))
+ eq(acmap('a', 'b`'), funcs.maparg(ac('a'), 'n', 0, 1))
+ eq(acmap('c`', 'd'), funcs.maparg(ac('c`'), 'n', 0, 1))
+ eq(acmap('e`', 'f`'), funcs.maparg(ac('e`'), 'n', 0, 1))
+ end)
+end)
diff --git a/test/functional/eval/match_functions_spec.lua b/test/functional/eval/match_functions_spec.lua
new file mode 100644
index 0000000000..0ec465a34c
--- /dev/null
+++ b/test/functional/eval/match_functions_spec.lua
@@ -0,0 +1,158 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+
+local eq = helpers.eq
+local clear = helpers.clear
+local funcs = helpers.funcs
+local command = helpers.command
+local exc_exec = helpers.exc_exec
+local expect_err = helpers.expect_err
+
+before_each(clear)
+
+describe('setmatches()', function()
+ it('correctly handles case when both group and pattern entries are numbers',
+ function()
+ command('hi def link 1 PreProc')
+ eq(0, funcs.setmatches({{group=1, pattern=2, id=3, priority=4}}))
+ eq({{
+ group='1',
+ pattern='2',
+ id=3,
+ priority=4,
+ }}, funcs.getmatches())
+ eq(0, funcs.setmatches({{group=1, pattern=2, id=3, priority=4, conceal=5}}))
+ eq({{
+ group='1',
+ pattern='2',
+ id=3,
+ priority=4,
+ conceal='5',
+ }}, funcs.getmatches())
+ eq(0, funcs.setmatches({{group=1, pos1={2}, pos2={6}, id=3, priority=4, conceal=5}}))
+ eq({{
+ group='1',
+ pos1={2},
+ pos2={6},
+ id=3,
+ priority=4,
+ conceal='5',
+ }}, funcs.getmatches())
+ end)
+
+ it('fails with -1 if highlight group is not defined', function()
+ expect_err('E28: No such highlight group name: 1', funcs.setmatches,
+ {{group=1, pattern=2, id=3, priority=4}})
+ eq({}, funcs.getmatches())
+ expect_err('E28: No such highlight group name: 1', funcs.setmatches,
+ {{group=1, pos1={2}, pos2={6}, id=3, priority=4, conceal=5}})
+ eq({}, funcs.getmatches())
+ end)
+end)
+
+describe('matchadd()', function()
+ it('correctly works when first two arguments and conceal are numbers at once',
+ function()
+ command('hi def link 1 PreProc')
+ eq(4, funcs.matchadd(1, 2, 3, 4, {conceal=5}))
+ eq({{
+ group='1',
+ pattern='2',
+ priority=3,
+ id=4,
+ conceal='5',
+ }}, funcs.getmatches())
+ end)
+end)
+
+describe('matchaddpos()', function()
+ it('errors out on invalid input', function()
+ command('hi clear PreProc')
+ eq('Vim(let):E5030: Empty list at position 0',
+ exc_exec('let val = matchaddpos("PreProc", [[]])'))
+ eq('Vim(let):E5030: Empty list at position 1',
+ exc_exec('let val = matchaddpos("PreProc", [1, v:_null_list])'))
+ eq('Vim(let):E5031: List or number required at position 1',
+ exc_exec('let val = matchaddpos("PreProc", [1, v:_null_dict])'))
+ end)
+ it('works with 0 lnum', function()
+ command('hi clear PreProc')
+ eq(4, funcs.matchaddpos('PreProc', {1}, 3, 4))
+ eq({{
+ group='PreProc',
+ pos1 = {1},
+ priority=3,
+ id=4,
+ }}, funcs.getmatches())
+ funcs.matchdelete(4)
+ eq(4, funcs.matchaddpos('PreProc', {{0}, 1}, 3, 4))
+ eq({{
+ group='PreProc',
+ pos1 = {1},
+ priority=3,
+ id=4,
+ }}, funcs.getmatches())
+ funcs.matchdelete(4)
+ eq(4, funcs.matchaddpos('PreProc', {0, 1}, 3, 4))
+ eq({{
+ group='PreProc',
+ pos1 = {1},
+ priority=3,
+ id=4,
+ }}, funcs.getmatches())
+ end)
+ it('works with negative numbers', function()
+ command('hi clear PreProc')
+ eq(4, funcs.matchaddpos('PreProc', {-10, 1}, 3, 4))
+ eq({{
+ group='PreProc',
+ pos1 = {1},
+ priority=3,
+ id=4,
+ }}, funcs.getmatches())
+ funcs.matchdelete(4)
+ eq(4, funcs.matchaddpos('PreProc', {{-10}, 1}, 3, 4))
+ eq({{
+ group='PreProc',
+ pos1 = {1},
+ priority=3,
+ id=4,
+ }}, funcs.getmatches())
+ funcs.matchdelete(4)
+ eq(4, funcs.matchaddpos('PreProc', {{2, -1}, 1}, 3, 4))
+ eq({{
+ group='PreProc',
+ pos1 = {1},
+ priority=3,
+ id=4,
+ }}, funcs.getmatches())
+ funcs.matchdelete(4)
+ eq(4, funcs.matchaddpos('PreProc', {{2, 0, -1}, 1}, 3, 4))
+ eq({{
+ group='PreProc',
+ pos1 = {1},
+ priority=3,
+ id=4,
+ }}, funcs.getmatches())
+ end)
+ it('works with zero length', function()
+ local screen = Screen.new(40, 5)
+ screen:attach()
+ funcs.setline(1, 'abcdef')
+ command('hi PreProc guifg=Red')
+ eq(4, funcs.matchaddpos('PreProc', {{1, 2, 0}}, 3, 4))
+ eq({{
+ group='PreProc',
+ pos1 = {1, 2, 0},
+ priority=3,
+ id=4,
+ }}, funcs.getmatches())
+ screen:expect([[
+ ^a{1:b}cdef |
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ |
+ ]], {[1] = {foreground = Screen.colors.Red}, [2] = {bold = true, foreground = Screen.colors.Blue1}})
+ end)
+end)
diff --git a/test/functional/eval/minmax_functions_spec.lua b/test/functional/eval/minmax_functions_spec.lua
new file mode 100644
index 0000000000..c6eb754f91
--- /dev/null
+++ b/test/functional/eval/minmax_functions_spec.lua
@@ -0,0 +1,51 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local eq = helpers.eq
+local eval = helpers.eval
+local clear = helpers.clear
+local funcs = helpers.funcs
+local redir_exec = helpers.redir_exec
+
+before_each(clear)
+for _, func in ipairs({'min', 'max'}) do
+ describe(func .. '()', function()
+ it('gives a single error message when multiple values failed conversions',
+ function()
+ eq('\nE745: Using a List as a Number\n0',
+ redir_exec('echo ' .. func .. '([-5, [], [], [], 5])'))
+ eq('\nE745: Using a List as a Number\n0',
+ redir_exec('echo ' .. func .. '({1:-5, 2:[], 3:[], 4:[], 5:5})'))
+ for errmsg, errinput in pairs({
+ ['E745: Using a List as a Number'] = '[]',
+ ['E805: Using a Float as a Number'] = '0.0',
+ ['E703: Using a Funcref as a Number'] = 'function("tr")',
+ ['E728: Using a Dictionary as a Number'] = '{}',
+ }) do
+ eq('\n' .. errmsg .. '\n0',
+ redir_exec('echo ' .. func .. '([' .. errinput .. '])'))
+ eq('\n' .. errmsg .. '\n0',
+ redir_exec('echo ' .. func .. '({1:' .. errinput .. '})'))
+ end
+ end)
+ it('works with arrays/dictionaries with zero items', function()
+ eq(0, funcs[func]({}))
+ eq(0, eval(func .. '({})'))
+ end)
+ it('works with arrays/dictionaries with one item', function()
+ eq(5, funcs[func]({5}))
+ eq(5, funcs[func]({test=5}))
+ end)
+ it('works with NULL arrays/dictionaries', function()
+ eq(0, eval(func .. '(v:_null_list)'))
+ eq(0, eval(func .. '(v:_null_dict)'))
+ end)
+ it('errors out for invalid types', function()
+ for _, errinput in ipairs({'1', 'v:true', 'v:false', 'v:null',
+ 'function("tr")', '""'}) do
+ eq(('\nE712: Argument of %s() must be a List or Dictionary\n0'):format(
+ func),
+ redir_exec('echo ' .. func .. '(' .. errinput .. ')'))
+ end
+ end)
+ end)
+end
diff --git a/test/functional/eval/modeline_spec.lua b/test/functional/eval/modeline_spec.lua
new file mode 100644
index 0000000000..c5bb798f4a
--- /dev/null
+++ b/test/functional/eval/modeline_spec.lua
@@ -0,0 +1,19 @@
+local helpers = require('test.functional.helpers')(after_each)
+local clear, command, write_file = helpers.clear, helpers.command, helpers.write_file
+local eq, eval = helpers.eq, helpers.eval
+
+describe("modeline", function()
+ local tempfile = helpers.tmpname()
+ before_each(clear)
+
+ after_each(function()
+ os.remove(tempfile)
+ end)
+
+ it('does not crash with a large version number', function()
+ write_file(tempfile, 'vim100000000000000000000000')
+ command('e! ' .. tempfile)
+
+ eq(2, eval('1+1')) -- Still alive?
+ end)
+end)
diff --git a/test/functional/eval/msgpack_functions_spec.lua b/test/functional/eval/msgpack_functions_spec.lua
index 5b87b05652..a8a413f68b 100644
--- a/test/functional/eval/msgpack_functions_spec.lua
+++ b/test/functional/eval/msgpack_functions_spec.lua
@@ -2,7 +2,7 @@ local helpers = require('test.functional.helpers')(after_each)
local clear = helpers.clear
local funcs = helpers.funcs
local eval, eq = helpers.eval, helpers.eq
-local execute = helpers.execute
+local command = helpers.command
local nvim = helpers.nvim
local exc_exec = helpers.exc_exec
@@ -16,18 +16,18 @@ describe('msgpack*() functions', function()
end)
end
- -- Regression test: msgpack_list_write was failing to write buffer with zero
+ -- Regression test: msgpack_list_write was failing to write buffer with zero
-- length.
obj_test('are able to dump and restore {"file": ""}', {{file=''}})
- -- Regression test: msgpack_list_write was failing to write buffer with NL at
+ -- Regression test: msgpack_list_write was failing to write buffer with NL at
-- the end.
obj_test('are able to dump and restore {0, "echo mpack"}', {{0, 'echo mpack'}})
obj_test('are able to dump and restore "Test\\n"', {'Test\n'})
- -- Regression test: msgpack_list_write was failing to write buffer with NL
+ -- Regression test: msgpack_list_write was failing to write buffer with NL
-- inside.
obj_test('are able to dump and restore "Test\\nTest 2"', {'Test\nTest 2'})
- -- Test that big objects (requirement: dump to something that is bigger then
- -- IOSIZE) are also fine. This particular object is obtained by concatenating
+ -- Test that big objects (requirement: dump to something that is bigger then
+ -- IOSIZE) are also fine. This particular object is obtained by concatenating
-- 5 identical shada files.
local big_obj = {
1, 1436711454, 78, {
@@ -331,13 +331,14 @@ describe('msgpack*() functions', function()
obj_test('are able to dump and restore floating-point value', {0.125})
it('can restore and dump UINT64_MAX', function()
- execute('let dumped = ["\\xCF" . repeat("\\xFF", 8)]')
- execute('let parsed = msgpackparse(dumped)')
- execute('let dumped2 = msgpackdump(parsed)')
+ command('let dumped = ["\\xCF" . repeat("\\xFF", 8)]')
+ command('let parsed = msgpackparse(dumped)')
+ command('let dumped2 = msgpackdump(parsed)')
eq(1, eval('type(parsed[0]) == type(0) ' ..
'|| parsed[0]._TYPE is v:msgpack_types.integer'))
if eval('type(parsed[0]) == type(0)') == 1 then
- eq(1, eval('0xFFFFFFFFFFFFFFFF == parsed[0]'))
+ command('call assert_equal(0xFFFFFFFFFFFFFFFF, parsed[0])')
+ eq({}, eval('v:errors'))
else
eq({_TYPE={}, _VAL={1, 3, 0x7FFFFFFF, 0x7FFFFFFF}}, eval('parsed[0]'))
end
@@ -345,13 +346,14 @@ describe('msgpack*() functions', function()
end)
it('can restore and dump INT64_MIN', function()
- execute('let dumped = ["\\xD3\\x80" . repeat("\\n", 7)]')
- execute('let parsed = msgpackparse(dumped)')
- execute('let dumped2 = msgpackdump(parsed)')
+ command('let dumped = ["\\xD3\\x80" . repeat("\\n", 7)]')
+ command('let parsed = msgpackparse(dumped)')
+ command('let dumped2 = msgpackdump(parsed)')
eq(1, eval('type(parsed[0]) == type(0) ' ..
'|| parsed[0]._TYPE is v:msgpack_types.integer'))
if eval('type(parsed[0]) == type(0)') == 1 then
- eq(1, eval('-0x8000000000000000 == parsed[0]'))
+ command('call assert_equal(-0x7fffffffffffffff - 1, parsed[0])')
+ eq({}, eval('v:errors'))
else
eq({_TYPE={}, _VAL={-1, 2, 0, 0}}, eval('parsed[0]'))
end
@@ -359,33 +361,33 @@ describe('msgpack*() functions', function()
end)
it('can restore and dump BIN string with zero byte', function()
- execute('let dumped = ["\\xC4\\x01\\n"]')
- execute('let parsed = msgpackparse(dumped)')
- execute('let dumped2 = msgpackdump(parsed)')
+ command('let dumped = ["\\xC4\\x01\\n"]')
+ command('let parsed = msgpackparse(dumped)')
+ command('let dumped2 = msgpackdump(parsed)')
eq({{_TYPE={}, _VAL={'\n'}}}, eval('parsed'))
eq(1, eval('parsed[0]._TYPE is v:msgpack_types.binary'))
eq(1, eval('dumped ==# dumped2'))
end)
it('can restore and dump STR string with zero byte', function()
- execute('let dumped = ["\\xA1\\n"]')
- execute('let parsed = msgpackparse(dumped)')
- execute('let dumped2 = msgpackdump(parsed)')
+ command('let dumped = ["\\xA1\\n"]')
+ command('let parsed = msgpackparse(dumped)')
+ command('let dumped2 = msgpackdump(parsed)')
eq({{_TYPE={}, _VAL={'\n'}}}, eval('parsed'))
eq(1, eval('parsed[0]._TYPE is v:msgpack_types.string'))
eq(1, eval('dumped ==# dumped2'))
end)
it('can restore and dump BIN string with NL', function()
- execute('let dumped = ["\\xC4\\x01", ""]')
- execute('let parsed = msgpackparse(dumped)')
- execute('let dumped2 = msgpackdump(parsed)')
+ command('let dumped = ["\\xC4\\x01", ""]')
+ command('let parsed = msgpackparse(dumped)')
+ command('let dumped2 = msgpackdump(parsed)')
eq({"\n"}, eval('parsed'))
eq(1, eval('dumped ==# dumped2'))
end)
it('dump and restore special mapping with floating-point value', function()
- execute('let todump = {"_TYPE": v:msgpack_types.float, "_VAL": 0.125}')
+ command('let todump = {"_TYPE": v:msgpack_types.float, "_VAL": 0.125}')
eq({0.125}, eval('msgpackparse(msgpackdump([todump]))'))
end)
end)
@@ -394,52 +396,53 @@ describe('msgpackparse() function', function()
before_each(clear)
it('restores nil as v:null', function()
- execute('let dumped = ["\\xC0"]')
- execute('let parsed = msgpackparse(dumped)')
+ command('let dumped = ["\\xC0"]')
+ command('let parsed = msgpackparse(dumped)')
eq('[v:null]', eval('string(parsed)'))
end)
it('restores boolean false as v:false', function()
- execute('let dumped = ["\\xC2"]')
- execute('let parsed = msgpackparse(dumped)')
+ command('let dumped = ["\\xC2"]')
+ command('let parsed = msgpackparse(dumped)')
eq({false}, eval('parsed'))
end)
it('restores boolean true as v:true', function()
- execute('let dumped = ["\\xC3"]')
- execute('let parsed = msgpackparse(dumped)')
+ command('let dumped = ["\\xC3"]')
+ command('let parsed = msgpackparse(dumped)')
eq({true}, eval('parsed'))
end)
it('restores FIXSTR as special dict', function()
- execute('let dumped = ["\\xa2ab"]')
- execute('let parsed = msgpackparse(dumped)')
+ command('let dumped = ["\\xa2ab"]')
+ command('let parsed = msgpackparse(dumped)')
eq({{_TYPE={}, _VAL={'ab'}}}, eval('parsed'))
eq(1, eval('g:parsed[0]._TYPE is v:msgpack_types.string'))
end)
it('restores BIN 8 as string', function()
- execute('let dumped = ["\\xC4\\x02ab"]')
+ command('let dumped = ["\\xC4\\x02ab"]')
eq({'ab'}, eval('msgpackparse(dumped)'))
end)
it('restores FIXEXT1 as special dictionary', function()
- execute('let dumped = ["\\xD4\\x10", ""]')
- execute('let parsed = msgpackparse(dumped)')
+ command('let dumped = ["\\xD4\\x10", ""]')
+ command('let parsed = msgpackparse(dumped)')
eq({{_TYPE={}, _VAL={0x10, {"", ""}}}}, eval('parsed'))
eq(1, eval('g:parsed[0]._TYPE is v:msgpack_types.ext'))
end)
it('restores MAP with BIN key as special dictionary', function()
- execute('let dumped = ["\\x81\\xC4\\x01a\\xC4\\n"]')
- execute('let parsed = msgpackparse(dumped)')
+ command('let dumped = ["\\x81\\xC4\\x01a\\xC4\\n"]')
+ command('let parsed = msgpackparse(dumped)')
eq({{_TYPE={}, _VAL={{'a', ''}}}}, eval('parsed'))
eq(1, eval('g:parsed[0]._TYPE is v:msgpack_types.map'))
end)
it('restores MAP with duplicate STR keys as special dictionary', function()
- execute('let dumped = ["\\x82\\xA1a\\xC4\\n\\xA1a\\xC4\\n"]')
- execute('let parsed = msgpackparse(dumped)')
+ command('let dumped = ["\\x82\\xA1a\\xC4\\n\\xA1a\\xC4\\n"]')
+ -- FIXME Internal error bug
+ command('silent! let parsed = msgpackparse(dumped)')
eq({{_TYPE={}, _VAL={ {{_TYPE={}, _VAL={'a'}}, ''},
{{_TYPE={}, _VAL={'a'}}, ''}}} }, eval('parsed'))
eq(1, eval('g:parsed[0]._TYPE is v:msgpack_types.map'))
@@ -448,8 +451,8 @@ describe('msgpackparse() function', function()
end)
it('restores MAP with MAP key as special dictionary', function()
- execute('let dumped = ["\\x81\\x80\\xC4\\n"]')
- execute('let parsed = msgpackparse(dumped)')
+ command('let dumped = ["\\x81\\x80\\xC4\\n"]')
+ command('let parsed = msgpackparse(dumped)')
eq({{_TYPE={}, _VAL={{{}, ''}}}}, eval('parsed'))
eq(1, eval('g:parsed[0]._TYPE is v:msgpack_types.map'))
end)
@@ -460,7 +463,8 @@ describe('msgpackparse() function', function()
eval(cmd)
eval(cmd) -- do it again (try to force segfault)
local api_info = eval(cmd) -- do it again
- eq({'error_types', 'functions', 'types'}, api_info)
+ eq({'error_types', 'functions', 'types',
+ 'ui_events', 'ui_options', 'version'}, api_info)
end)
it('fails when called with no arguments', function()
@@ -493,6 +497,12 @@ describe('msgpackparse() function', function()
exc_exec('call msgpackparse(function("tr"))'))
end)
+ it('fails to parse a partial', function()
+ command('function T() dict\nendfunction')
+ eq('Vim(call):E686: Argument of msgpackparse() must be a List',
+ exc_exec('call msgpackparse(function("T", [1, 2], {}))'))
+ end)
+
it('fails to parse a float', function()
eq('Vim(call):E686: Argument of msgpackparse() must be a List',
exc_exec('call msgpackparse(0.0)'))
@@ -508,10 +518,10 @@ describe('msgpackdump() function', function()
end)
it('can dump generic mapping with generic mapping keys and values', function()
- execute('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": []}')
- execute('let todumpv1 = {"_TYPE": v:msgpack_types.map, "_VAL": []}')
- execute('let todumpv2 = {"_TYPE": v:msgpack_types.map, "_VAL": []}')
- execute('call add(todump._VAL, [todumpv1, todumpv2])')
+ command('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": []}')
+ command('let todumpv1 = {"_TYPE": v:msgpack_types.map, "_VAL": []}')
+ command('let todumpv2 = {"_TYPE": v:msgpack_types.map, "_VAL": []}')
+ command('call add(todump._VAL, [todumpv1, todumpv2])')
eq({'\129\128\128'}, eval('msgpackdump([todump])'))
end)
@@ -524,124 +534,131 @@ describe('msgpackdump() function', function()
end)
it('can v:null', function()
- execute('let todump = v:null')
+ command('let todump = v:null')
end)
it('can dump special bool mapping (true)', function()
- execute('let todump = {"_TYPE": v:msgpack_types.boolean, "_VAL": 1}')
+ command('let todump = {"_TYPE": v:msgpack_types.boolean, "_VAL": 1}')
eq({'\195'}, eval('msgpackdump([todump])'))
end)
it('can dump special bool mapping (false)', function()
- execute('let todump = {"_TYPE": v:msgpack_types.boolean, "_VAL": 0}')
+ command('let todump = {"_TYPE": v:msgpack_types.boolean, "_VAL": 0}')
eq({'\194'}, eval('msgpackdump([todump])'))
end)
it('can dump special nil mapping', function()
- execute('let todump = {"_TYPE": v:msgpack_types.nil, "_VAL": 0}')
+ command('let todump = {"_TYPE": v:msgpack_types.nil, "_VAL": 0}')
eq({'\192'}, eval('msgpackdump([todump])'))
end)
it('can dump special ext mapping', function()
- execute('let todump = {"_TYPE": v:msgpack_types.ext, "_VAL": [5, ["",""]]}')
+ command('let todump = {"_TYPE": v:msgpack_types.ext, "_VAL": [5, ["",""]]}')
eq({'\212\005', ''}, eval('msgpackdump([todump])'))
end)
it('can dump special array mapping', function()
- execute('let todump = {"_TYPE": v:msgpack_types.array, "_VAL": [5, [""]]}')
+ command('let todump = {"_TYPE": v:msgpack_types.array, "_VAL": [5, [""]]}')
eq({'\146\005\145\196\n'}, eval('msgpackdump([todump])'))
end)
it('can dump special UINT64_MAX mapping', function()
- execute('let todump = {"_TYPE": v:msgpack_types.integer}')
- execute('let todump._VAL = [1, 3, 0x7FFFFFFF, 0x7FFFFFFF]')
+ command('let todump = {"_TYPE": v:msgpack_types.integer}')
+ command('let todump._VAL = [1, 3, 0x7FFFFFFF, 0x7FFFFFFF]')
eq({'\207\255\255\255\255\255\255\255\255'}, eval('msgpackdump([todump])'))
end)
it('can dump special INT64_MIN mapping', function()
- execute('let todump = {"_TYPE": v:msgpack_types.integer}')
- execute('let todump._VAL = [-1, 2, 0, 0]')
+ command('let todump = {"_TYPE": v:msgpack_types.integer}')
+ command('let todump._VAL = [-1, 2, 0, 0]')
eq({'\211\128\n\n\n\n\n\n\n'}, eval('msgpackdump([todump])'))
end)
it('fails to dump a function reference', function()
- execute('let Todump = function("tr")')
- eq('Vim(call):E951: Error while dumping msgpackdump() argument, index 0, itself: attempt to dump function reference',
+ command('let Todump = function("tr")')
+ eq('Vim(call):E5004: Error while dumping msgpackdump() argument, index 0, itself: attempt to dump function reference',
+ exc_exec('call msgpackdump([Todump])'))
+ end)
+
+ it('fails to dump a partial', function()
+ command('function T() dict\nendfunction')
+ command('let Todump = function("T", [1, 2], {})')
+ eq('Vim(call):E5004: Error while dumping msgpackdump() argument, index 0, itself: attempt to dump function reference',
exc_exec('call msgpackdump([Todump])'))
end)
it('fails to dump a function reference in a list', function()
- execute('let todump = [function("tr")]')
- eq('Vim(call):E951: Error while dumping msgpackdump() argument, index 0, index 0: attempt to dump function reference',
+ command('let todump = [function("tr")]')
+ eq('Vim(call):E5004: Error while dumping msgpackdump() argument, index 0, index 0: attempt to dump function reference',
exc_exec('call msgpackdump([todump])'))
end)
it('fails to dump a recursive list', function()
- execute('let todump = [[[]]]')
- execute('call add(todump[0][0], todump)')
- eq('Vim(call):E952: Unable to dump msgpackdump() argument, index 0: container references itself in index 0, index 0, index 0',
+ command('let todump = [[[]]]')
+ command('call add(todump[0][0], todump)')
+ eq('Vim(call):E5005: Unable to dump msgpackdump() argument, index 0: container references itself in index 0, index 0, index 0',
exc_exec('call msgpackdump([todump])'))
end)
it('fails to dump a recursive dict', function()
- execute('let todump = {"d": {"d": {}}}')
- execute('call extend(todump.d.d, {"d": todump})')
- eq('Vim(call):E952: Unable to dump msgpackdump() argument, index 0: container references itself in key \'d\', key \'d\', key \'d\'',
+ command('let todump = {"d": {"d": {}}}')
+ command('call extend(todump.d.d, {"d": todump})')
+ eq('Vim(call):E5005: Unable to dump msgpackdump() argument, index 0: container references itself in key \'d\', key \'d\', key \'d\'',
exc_exec('call msgpackdump([todump])'))
end)
it('can dump dict with two same dicts inside', function()
- execute('let inter = {}')
- execute('let todump = {"a": inter, "b": inter}')
+ command('let inter = {}')
+ command('let todump = {"a": inter, "b": inter}')
eq({"\130\161a\128\161b\128"}, eval('msgpackdump([todump])'))
end)
it('can dump list with two same lists inside', function()
- execute('let inter = []')
- execute('let todump = [inter, inter]')
+ command('let inter = []')
+ command('let todump = [inter, inter]')
eq({"\146\144\144"}, eval('msgpackdump([todump])'))
end)
it('fails to dump a recursive list in a special dict', function()
- execute('let todump = {"_TYPE": v:msgpack_types.array, "_VAL": []}')
- execute('call add(todump._VAL, todump)')
- eq('Vim(call):E952: Unable to dump msgpackdump() argument, index 0: container references itself in index 0',
+ command('let todump = {"_TYPE": v:msgpack_types.array, "_VAL": []}')
+ command('call add(todump._VAL, todump)')
+ eq('Vim(call):E5005: Unable to dump msgpackdump() argument, index 0: container references itself in index 0',
exc_exec('call msgpackdump([todump])'))
end)
it('fails to dump a recursive (key) map in a special dict', function()
- execute('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": []}')
- execute('call add(todump._VAL, [todump, 0])')
- eq('Vim(call):E952: Unable to dump msgpackdump() argument, index 0: container references itself in index 1',
+ command('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": []}')
+ command('call add(todump._VAL, [todump, 0])')
+ eq('Vim(call):E5005: Unable to dump msgpackdump() argument, index 0: container references itself in index 0',
exc_exec('call msgpackdump([todump])'))
end)
it('fails to dump a recursive (val) map in a special dict', function()
- execute('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": []}')
- execute('call add(todump._VAL, [0, todump])')
- eq('Vim(call):E952: Unable to dump msgpackdump() argument, index 0: container references itself in key 0 at index 0 from special map',
+ command('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": []}')
+ command('call add(todump._VAL, [0, todump])')
+ eq('Vim(call):E5005: Unable to dump msgpackdump() argument, index 0: container references itself in key 0 at index 0 from special map',
exc_exec('call msgpackdump([todump])'))
end)
it('fails to dump a recursive (key) map in a special dict, _VAL reference', function()
- execute('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": [[[], []]]}')
- execute('call add(todump._VAL[0][0], todump._VAL)')
- eq('Vim(call):E952: Unable to dump msgpackdump() argument, index 0: container references itself in key [[[[...@0], []]]] at index 0 from special map, index 0',
+ command('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": [[[], []]]}')
+ command('call add(todump._VAL[0][0], todump._VAL)')
+ eq('Vim(call):E5005: Unable to dump msgpackdump() argument, index 0: container references itself in key [[[[...@0], []]]] at index 0 from special map, index 0',
exc_exec('call msgpackdump([todump])'))
end)
it('fails to dump a recursive (val) map in a special dict, _VAL reference', function()
- execute('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": [[[], []]]}')
- execute('call add(todump._VAL[0][1], todump._VAL)')
- eq('Vim(call):E952: Unable to dump msgpackdump() argument, index 0: container references itself in key [] at index 0 from special map, index 0',
+ command('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": [[[], []]]}')
+ command('call add(todump._VAL[0][1], todump._VAL)')
+ eq('Vim(call):E5005: Unable to dump msgpackdump() argument, index 0: container references itself in key [] at index 0 from special map, index 0',
exc_exec('call msgpackdump([todump])'))
end)
it('fails to dump a recursive (val) special list in a special dict',
function()
- execute('let todump = {"_TYPE": v:msgpack_types.array, "_VAL": []}')
- execute('call add(todump._VAL, [0, todump._VAL])')
- eq('Vim(call):E952: Unable to dump msgpackdump() argument, index 0: container references itself in index 0, index 1',
+ command('let todump = {"_TYPE": v:msgpack_types.array, "_VAL": []}')
+ command('call add(todump._VAL, [0, todump._VAL])')
+ eq('Vim(call):E5005: Unable to dump msgpackdump() argument, index 0: container references itself in index 0, index 1',
exc_exec('call msgpackdump([todump])'))
end)
@@ -675,6 +692,12 @@ describe('msgpackdump() function', function()
exc_exec('call msgpackdump(function("tr"))'))
end)
+ it('fails to dump a partial', function()
+ command('function T() dict\nendfunction')
+ eq('Vim(call):E686: Argument of msgpackdump() must be a List',
+ exc_exec('call msgpackdump(function("T", [1, 2], {}))'))
+ end)
+
it('fails to dump a float', function()
eq('Vim(call):E686: Argument of msgpackdump() must be a List',
exc_exec('call msgpackdump(0.0)'))
diff --git a/test/functional/eval/null_spec.lua b/test/functional/eval/null_spec.lua
new file mode 100644
index 0000000000..afe999e1fa
--- /dev/null
+++ b/test/functional/eval/null_spec.lua
@@ -0,0 +1,147 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local curbufmeths = helpers.curbufmeths
+local redir_exec = helpers.redir_exec
+local exc_exec = helpers.exc_exec
+local command = helpers.command
+local clear = helpers.clear
+local meths = helpers.meths
+local funcs = helpers.funcs
+local eq = helpers.eq
+
+describe('NULL', function()
+ before_each(function()
+ clear()
+ command('let L = v:_null_list')
+ command('let D = v:_null_dict')
+ command('let S = $XXX_NONEXISTENT_VAR_XXX')
+ end)
+ local tmpfname = 'Xtest-functional-viml-null'
+ after_each(function()
+ os.remove(tmpfname)
+ end)
+ local null_test = function(name, cmd, err)
+ it(name, function()
+ eq(err, exc_exec(cmd))
+ end)
+ end
+ local null_expr_test = function(name, expr, err, val, after)
+ it(name, function()
+ eq((err == 0) and ('') or ('\n' .. err),
+ redir_exec('let g:_var = ' .. expr))
+ if val == nil then
+ eq(0, funcs.exists('g:_var'))
+ else
+ eq(val, meths.get_var('_var'))
+ end
+ if after ~= nil then
+ after()
+ end
+ end)
+ end
+ describe('list', function()
+ -- Incorrect behaviour
+ -- FIXME Should error out with different message
+ null_test('makes :unlet act as if it is not a list', ':unlet L[0]',
+ 'Vim(unlet):E689: Can only index a List or Dictionary')
+
+ -- Subjectable behaviour
+
+ -- FIXME Should return 1
+ null_expr_test('is equal to empty list', 'L == []', 0, 0)
+ -- FIXME Should return 1
+ null_expr_test('is equal to empty list (reverse order)', '[] == L', 0, 0)
+
+ -- Correct behaviour
+ null_expr_test('can be indexed with error message for empty list', 'L[0]',
+ 'E684: list index out of range: 0\nE15: Invalid expression: L[0]', nil)
+ null_expr_test('can be splice-indexed', 'L[:]', 0, {})
+ null_expr_test('is not locked', 'islocked("v:_null_list")', 0, 0)
+ null_test('is accepted by :for', 'for x in L|throw x|endfor', 0)
+ null_expr_test('does not crash append()', 'append(1, L)', 0, 0, function()
+ eq({''}, curbufmeths.get_lines(0, -1, false))
+ end)
+ null_expr_test('does not crash setline()', 'setline(1, L)', 0, 0, function()
+ eq({''}, curbufmeths.get_lines(0, -1, false))
+ end)
+ null_expr_test('is identical to itself', 'L is L', 0, 1)
+ null_expr_test('can be sliced', 'L[:]', 0, {})
+ null_expr_test('can be copied', 'copy(L)', 0, {})
+ null_expr_test('can be deepcopied', 'deepcopy(L)', 0, {})
+ null_expr_test('does not crash when indexed', 'L[1]',
+ 'E684: list index out of range: 1\nE15: Invalid expression: L[1]', nil)
+ null_expr_test('does not crash call()', 'call("arglistid", L)', 0, 0)
+ null_expr_test('does not crash col()', 'col(L)', 0, 0)
+ null_expr_test('does not crash virtcol()', 'virtcol(L)', 0, 0)
+ null_expr_test('does not crash line()', 'line(L)', 0, 0)
+ null_expr_test('does not crash count()', 'count(L, 1)', 0, 0)
+ null_expr_test('does not crash cursor()', 'cursor(L)', 'E474: Invalid argument', -1)
+ null_expr_test('does not crash map()', 'map(L, "v:val")', 0, {})
+ null_expr_test('does not crash filter()', 'filter(L, "1")', 0, {})
+ null_expr_test('is empty', 'empty(L)', 0, 1)
+ null_expr_test('does not crash get()', 'get(L, 1, 10)', 0, 10)
+ null_expr_test('has zero length', 'len(L)', 0, 0)
+ null_expr_test('is accepted as an empty list by max()', 'max(L)', 0, 0)
+ null_expr_test('is accepted as an empty list by min()', 'min(L)', 0, 0)
+ null_expr_test('is stringified correctly', 'string(L)', 0, '[]')
+ null_expr_test('is JSON encoded correctly', 'json_encode(L)', 0, '[]')
+ null_test('does not crash lockvar', 'lockvar! L', 0)
+ null_expr_test('can be added to itself', '(L + L)', 0, {})
+ null_expr_test('can be added to itself', '(L + L) is L', 0, 1)
+ null_expr_test('can be added to non-empty list', '([1] + L)', 0, {1})
+ null_expr_test('can be added to non-empty list (reversed)', '(L + [1])', 0, {1})
+ null_expr_test('is equal to itself', 'L == L', 0, 1)
+ null_expr_test('is not not equal to itself', 'L != L', 0, 0)
+ null_expr_test('counts correctly', 'count([L], L)', 0, 1)
+ null_expr_test('makes map() return v:_null_list', 'map(L, "v:val") is# L', 0, 1)
+ null_expr_test('makes filter() return v:_null_list', 'filter(L, "1") is# L', 0, 1)
+ null_test('is treated by :let as empty list', ':let [l] = L', 'Vim(let):E688: More targets than List items')
+ null_expr_test('is accepted as an empty list by inputlist()', '[feedkeys("\\n"), inputlist(L)]',
+ 'Type number and <Enter> or click with mouse (empty cancels): ', {0, 0})
+ null_expr_test('is accepted as an empty list by writefile()',
+ ('[writefile(L, "%s"), readfile("%s")]'):format(tmpfname, tmpfname),
+ 0, {0, {}})
+ null_expr_test('makes add() error out', 'add(L, 0)',
+ 'E742: Cannot change value of add() argument', 1)
+ null_expr_test('makes insert() error out', 'insert(L, 1)',
+ 'E742: Cannot change value of insert() argument', 0)
+ null_expr_test('does not crash remove()', 'remove(L, 0)',
+ 'E742: Cannot change value of remove() argument', 0)
+ null_expr_test('makes reverse() error out', 'reverse(L)',
+ 'E742: Cannot change value of reverse() argument', 0)
+ null_expr_test('makes sort() error out', 'sort(L)',
+ 'E742: Cannot change value of sort() argument', 0)
+ null_expr_test('makes uniq() error out', 'uniq(L)',
+ 'E742: Cannot change value of uniq() argument', 0)
+ null_expr_test('does not crash extend()', 'extend(L, [1])', 'E742: Cannot change value of extend() argument', 0)
+ null_expr_test('does not crash extend() (second position)', 'extend([1], L)', 0, {1})
+ null_expr_test('makes join() return empty string', 'join(L, "")', 0, '')
+ null_expr_test('makes msgpackdump() return empty list', 'msgpackdump(L)', 0, {})
+ null_expr_test('does not crash system()', 'system("cat", L)', 0, '')
+ null_expr_test('does not crash setreg', 'setreg("x", L)', 0, 0)
+ null_expr_test('does not crash systemlist()', 'systemlist("cat", L)', 0, {})
+ null_test('does not make Neovim crash when v:oldfiles gets assigned to that', ':let v:oldfiles = L|oldfiles', 0)
+ null_expr_test('does not make complete() crash or error out',
+ 'execute(":normal i\\<C-r>=complete(1, L)[-1]\\n")',
+ '', '\n', function()
+ eq({''}, curbufmeths.get_lines(0, -1, false))
+ end)
+ null_expr_test('is accepted by setmatches()', 'setmatches(L)', 0, 0)
+ null_expr_test('is accepted by setqflist()', 'setqflist(L)', 0, 0)
+ null_expr_test('is accepted by setloclist()', 'setloclist(1, L)', 0, 0)
+ null_test('is accepted by :cexpr', 'cexpr L', 0)
+ null_test('is accepted by :lexpr', 'lexpr L', 0)
+ end)
+ describe('dict', function()
+ it('does not crash when indexing NULL dict', function()
+ eq('\nE716: Key not present in Dictionary: test\nE15: Invalid expression: v:_null_dict.test',
+ redir_exec('echo v:_null_dict.test'))
+ end)
+ null_expr_test('makes extend error out', 'extend(D, {})', 'E742: Cannot change value of extend() argument', 0)
+ null_expr_test('makes extend do nothing', 'extend({1: 2}, D)', 0, {['1']=2})
+ null_expr_test('does not crash map()', 'map(D, "v:val")', 0, {})
+ null_expr_test('does not crash filter()', 'filter(D, "1")', 0, {})
+ null_expr_test('makes map() return v:_null_dict', 'map(D, "v:val") is# D', 0, 1)
+ null_expr_test('makes filter() return v:_null_dict', 'filter(D, "1") is# D', 0, 1)
+ end)
+end)
diff --git a/test/functional/eval/printf_spec.lua b/test/functional/eval/printf_spec.lua
index c84290ceef..27e24c4118 100644
--- a/test/functional/eval/printf_spec.lua
+++ b/test/functional/eval/printf_spec.lua
@@ -1,7 +1,10 @@
local helpers = require('test.functional.helpers')(after_each)
+
local clear = helpers.clear
local eq = helpers.eq
+local eval = helpers.eval
local funcs = helpers.funcs
+local meths = helpers.meths
local exc_exec = helpers.exc_exec
describe('printf()', function()
@@ -57,4 +60,33 @@ describe('printf()', function()
it('errors out when %b modifier is used for a float', function()
eq('Vim(call):E805: Using a Float as a Number', exc_exec('call printf("%b", 3.1415926535)'))
end)
+ it('works with %p correctly', function()
+ local null_ret = nil
+ local seen_rets = {}
+ -- Collect all args in an array to avoid possible allocation of the same
+ -- address after freeing unreferenced values.
+ meths.set_var('__args', {})
+ local function check_printf(expr, is_null)
+ eq(0, exc_exec('call add(__args, ' .. expr .. ')'))
+ eq(0, exc_exec('let __result = printf("%p", __args[-1])'))
+ local id_ret = eval('id(__args[-1])')
+ eq(id_ret, meths.get_var('__result'))
+ if is_null then
+ if null_ret then
+ eq(null_ret, id_ret)
+ else
+ null_ret = id_ret
+ end
+ else
+ eq(nil, seen_rets[id_ret])
+ seen_rets[id_ret] = expr
+ end
+ meths.del_var('__result')
+ end
+ check_printf('v:_null_list', true)
+ check_printf('v:_null_dict', true)
+ check_printf('[]')
+ check_printf('{}')
+ check_printf('function("tr", ["a"])')
+ end)
end)
diff --git a/test/functional/eval/reltime_spec.lua b/test/functional/eval/reltime_spec.lua
index 0b19d372ec..0181f09024 100644
--- a/test/functional/eval/reltime_spec.lua
+++ b/test/functional/eval/reltime_spec.lua
@@ -1,6 +1,6 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, eq, ok = helpers.clear, helpers.eq, helpers.ok
-local neq, execute, funcs = helpers.neq, helpers.execute, helpers.funcs
+local neq, command, funcs = helpers.neq, helpers.command, helpers.funcs
local reltime, reltimestr, reltimefloat = funcs.reltime, funcs.reltimestr, funcs.reltimefloat
describe('reltimestr(), reltimefloat()', function()
@@ -8,7 +8,7 @@ describe('reltimestr(), reltimefloat()', function()
it('Checks', function()
local now = reltime()
- execute('sleep 10m')
+ command('sleep 10m')
local later = reltime()
local elapsed = reltime(now)
diff --git a/test/functional/eval/server_spec.lua b/test/functional/eval/server_spec.lua
index 0fd55ce2f9..563e619b39 100644
--- a/test/functional/eval/server_spec.lua
+++ b/test/functional/eval/server_spec.lua
@@ -1,24 +1,41 @@
-
local helpers = require('test.functional.helpers')(after_each)
-local nvim, eq, neq, eval = helpers.nvim, helpers.eq, helpers.neq, helpers.eval
+local eq, neq, eval = helpers.eq, helpers.neq, helpers.eval
+local command = helpers.command
local clear, funcs, meths = helpers.clear, helpers.funcs, helpers.meths
-local os_name = helpers.os_name
-
-describe('serverstart(), serverstop()', function()
+local iswin = helpers.iswin
+local ok = helpers.ok
+local matches = helpers.matches
+local expect_err = helpers.expect_err
+
+local function clear_serverlist()
+ for _, server in pairs(funcs.serverlist()) do
+ funcs.serverstop(server)
+ end
+end
+
+describe('server', function()
before_each(clear)
- it('sets $NVIM_LISTEN_ADDRESS on first invocation', function()
+ it('serverstart() sets $NVIM_LISTEN_ADDRESS on first invocation', function()
-- Unset $NVIM_LISTEN_ADDRESS
- nvim('command', 'let $NVIM_LISTEN_ADDRESS = ""')
+ command('let $NVIM_LISTEN_ADDRESS = ""')
local s = eval('serverstart()')
assert(s ~= nil and s:len() > 0, "serverstart() returned empty")
eq(s, eval('$NVIM_LISTEN_ADDRESS'))
- nvim('command', "call serverstop('"..s.."')")
+ eq(1, eval("serverstop('"..s.."')"))
eq('', eval('$NVIM_LISTEN_ADDRESS'))
end)
- it('sets v:servername _only_ on nvim startup unless all servers are stopped',
+ it('sets new v:servername if $NVIM_LISTEN_ADDRESS is invalid', function()
+ clear({env={NVIM_LISTEN_ADDRESS='.'}})
+ eq('.', eval('$NVIM_LISTEN_ADDRESS'))
+ local servers = funcs.serverlist()
+ eq(1, #servers)
+ ok(string.len(servers[1]) > 4) -- Like /tmp/nvimโ€ฆ/โ€ฆ or \\.\pipe\โ€ฆ
+ end)
+
+ it('sets v:servername at startup or if all servers were stopped',
function()
local initial_server = meths.get_vvar('servername')
assert(initial_server ~= nil and initial_server:len() > 0,
@@ -31,39 +48,75 @@ describe('serverstart(), serverstop()', function()
neq(initial_server, s)
-- serverstop() does _not_ modify v:servername...
- funcs.serverstop(s)
+ eq(1, funcs.serverstop(s))
eq(initial_server, meths.get_vvar('servername'))
-- ...unless we stop _all_ servers.
- funcs.serverstop(funcs.serverlist()[1])
+ eq(1, funcs.serverstop(funcs.serverlist()[1]))
eq('', meths.get_vvar('servername'))
-- v:servername will take the next available server.
- local servername = (os_name() == 'windows'
- and [[\\.\pipe\Xtest-functional-server-server-pipe]]
- or 'Xtest-functional-server-server-socket')
+ local servername = (iswin() and [[\\.\pipe\Xtest-functional-server-pipe]]
+ or 'Xtest-functional-server-socket')
funcs.serverstart(servername)
eq(servername, meths.get_vvar('servername'))
end)
- it('serverstop() ignores invalid input', function()
- nvim('command', "call serverstop('')")
- nvim('command', "call serverstop('bogus-socket-name')")
+ it('serverstop() returns false for invalid input', function()
+ eq(0, eval("serverstop('')"))
+ eq(0, eval("serverstop('bogus-socket-name')"))
end)
-end)
+ it('parses endpoints correctly', function()
+ clear_serverlist()
+ eq({}, funcs.serverlist())
-describe('serverlist()', function()
- before_each(clear)
+ local s = funcs.serverstart('127.0.0.1:0') -- assign random port
+ if #s > 0 then
+ assert(string.match(s, '127.0.0.1:%d+'))
+ eq(s, funcs.serverlist()[1])
+ clear_serverlist()
+ end
+
+ s = funcs.serverstart('127.0.0.1:') -- assign random port
+ if #s > 0 then
+ assert(string.match(s, '127.0.0.1:%d+'))
+ eq(s, funcs.serverlist()[1])
+ clear_serverlist()
+ end
+
+ local expected = {}
+ local v4 = '127.0.0.1:12345'
+ local status, _ = pcall(funcs.serverstart, v4)
+ if status then
+ table.insert(expected, v4)
+ pcall(funcs.serverstart, v4) -- exists already; ignore
+ end
- it('returns the list of servers', function()
+ local v6 = '::1:12345'
+ status, _ = pcall(funcs.serverstart, v6)
+ if status then
+ table.insert(expected, v6)
+ pcall(funcs.serverstart, v6) -- exists already; ignore
+ end
+ eq(expected, funcs.serverlist())
+ clear_serverlist()
+
+ expect_err('Failed to start server: invalid argument',
+ funcs.serverstart, '127.0.0.1:65536') -- invalid port
+ eq({}, funcs.serverlist())
+ end)
+
+ it('serverlist() returns the list of servers', function()
-- There should already be at least one server.
local n = eval('len(serverlist())')
- -- Add a few
- local servs = {'should-not-exist', 'another-one-that-shouldnt'}
+ -- Add some servers.
+ local servs = (iswin()
+ and { [[\\.\pipe\Xtest-pipe0934]], [[\\.\pipe\Xtest-pipe4324]] }
+ or { [[Xtest-pipe0934]], [[Xtest-pipe4324]] })
for _, s in ipairs(servs) do
- eq(s, eval('serverstart("'..s..'")'))
+ eq(s, eval("serverstart('"..s.."')"))
end
local new_servs = eval('serverlist()')
@@ -73,10 +126,31 @@ describe('serverlist()', function()
-- The new servers should be at the end of the list.
for i = 1, #servs do
eq(servs[i], new_servs[i + n])
- nvim('command', 'call serverstop("'..servs[i]..'")')
+ eq(1, eval("serverstop('"..servs[i].."')"))
end
- -- After calling serverstop() on the new servers, they should no longer be
- -- in the list.
+ -- After serverstop() the servers should NOT be in the list.
eq(n, eval('len(serverlist())'))
end)
end)
+
+describe('startup --listen', function()
+ it('validates', function()
+ clear()
+
+ local cmd = { unpack(helpers.nvim_argv) }
+ table.insert(cmd, '--listen')
+ matches('nvim.*: Argument missing after: "%-%-listen"', funcs.system(cmd))
+
+ cmd = { unpack(helpers.nvim_argv) }
+ table.insert(cmd, '--listen2')
+ matches('nvim.*: Garbage after option argument: "%-%-listen2"', funcs.system(cmd))
+ end)
+
+ it('sets v:servername, overrides $NVIM_LISTEN_ADDRESS', function()
+ local addr = (iswin() and [[\\.\pipe\Xtest-listen-pipe]]
+ or 'Xtest-listen-pipe')
+ clear({ env={ NVIM_LISTEN_ADDRESS='Xtest-env-pipe' },
+ args={ '--listen', addr } })
+ eq(addr, meths.get_vvar('servername'))
+ end)
+end)
diff --git a/test/functional/eval/setpos_spec.lua b/test/functional/eval/setpos_spec.lua
new file mode 100644
index 0000000000..935f387bcc
--- /dev/null
+++ b/test/functional/eval/setpos_spec.lua
@@ -0,0 +1,64 @@
+local helpers = require('test.functional.helpers')(after_each)
+local setpos = helpers.funcs.setpos
+local getpos = helpers.funcs.getpos
+local insert = helpers.insert
+local clear = helpers.clear
+local command = helpers.command
+local eval = helpers.eval
+local eq = helpers.eq
+local exc_exec = helpers.exc_exec
+
+
+describe('setpos() function', function()
+ before_each(function()
+ clear()
+ insert([[
+ First line of text
+ Second line of text
+ Third line of text]])
+ command('new')
+ insert([[
+ Line of text 1
+ Line of text 2
+ Line of text 3]])
+ end)
+ it('can set the current cursor position', function()
+ setpos(".", {0, 2, 1, 0})
+ eq(getpos("."), {0, 2, 1, 0})
+ setpos(".", {2, 1, 1, 0})
+ eq(getpos("."), {0, 1, 1, 0})
+ local ret = exc_exec('call setpos(".", [1, 1, 1, 0])')
+ eq(0, ret)
+ end)
+ it('can set lowercase marks in the current buffer', function()
+ setpos("'d", {0, 2, 1, 0})
+ eq(getpos("'d"), {0, 2, 1, 0})
+ command('undo')
+ command('call setpos("\'d", [2, 3, 1, 0])')
+ eq(getpos("'d"), {0, 3, 1, 0})
+ end)
+ it('can set lowercase marks in other buffers', function()
+ local retval = setpos("'d", {1, 2, 1, 0})
+ eq(0, retval)
+ setpos("'d", {1, 2, 1, 0})
+ eq(getpos("'d"), {0, 0, 0, 0})
+ command('wincmd w')
+ eq(eval('bufnr("%")'), 1)
+ eq(getpos("'d"), {0, 2, 1, 0})
+ end)
+ it("fails when setting a mark in a buffer that doesn't exist", function()
+ local retval = setpos("'d", {3, 2, 1, 0})
+ eq(-1, retval)
+ eq(getpos("'d"), {0, 0, 0, 0})
+ retval = setpos("'D", {3, 2, 1, 0})
+ eq(-1, retval)
+ eq(getpos("'D"), {0, 0, 0, 0})
+ end)
+ it('can set uppercase marks', function()
+ setpos("'D", {2, 2, 3, 0})
+ eq(getpos("'D"), {2, 2, 3, 0})
+ -- Can set a mark in another buffer
+ setpos("'D", {1, 2, 2, 0})
+ eq(getpos("'D"), {1, 2, 2, 0})
+ end)
+end)
diff --git a/test/functional/eval/sort_spec.lua b/test/functional/eval/sort_spec.lua
new file mode 100644
index 0000000000..82557575ce
--- /dev/null
+++ b/test/functional/eval/sort_spec.lua
@@ -0,0 +1,56 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local eq = helpers.eq
+local NIL = helpers.NIL
+local eval = helpers.eval
+local clear = helpers.clear
+local meths = helpers.meths
+local funcs = helpers.funcs
+local command = helpers.command
+local exc_exec = helpers.exc_exec
+local redir_exec = helpers.redir_exec
+
+before_each(clear)
+
+describe('sort()', function()
+ it('errors out when sorting special values', function()
+ eq('Vim(call):E907: Using a special value as a Float',
+ exc_exec('call sort([v:true, v:false], "f")'))
+ end)
+
+ it('sorts โ€œwrongโ€ values between -0.0001 and 0.0001, preserving order',
+ function()
+ meths.set_var('list', {true, false, NIL, {}, {a=42}, 'check',
+ 0.0001, -0.0001})
+ command('call insert(g:list, function("tr"))')
+ local error_lines = funcs.split(
+ funcs.execute('silent! call sort(g:list, "f")'), '\n')
+ local errors = {}
+ for _, err in ipairs(error_lines) do
+ errors[err] = true
+ end
+ eq({
+ ['E891: Using a Funcref as a Float']=true,
+ ['E892: Using a String as a Float']=true,
+ ['E893: Using a List as a Float']=true,
+ ['E894: Using a Dictionary as a Float']=true,
+ ['E907: Using a special value as a Float']=true,
+ }, errors)
+ eq('[-1.0e-4, function(\'tr\'), v:true, v:false, v:null, [], {\'a\': 42}, \'check\', 1.0e-4]',
+ eval('string(g:list)'))
+ end)
+
+ it('can yield E702 and stop sorting after that', function()
+ command([[
+ function Cmp(a, b)
+ if type(a:a) == type([]) || type(a:b) == type([])
+ return []
+ endif
+ return (a:a > a:b) - (a:a < a:b)
+ endfunction
+ ]])
+ eq('\nE745: Using a List as a Number\nE702: Sort compare function failed',
+ redir_exec('let sl = sort([1, 0, [], 3, 2], "Cmp")'))
+ eq({1, 0, {}, 3, 2}, meths.get_var('sl'))
+ end)
+end)
diff --git a/test/functional/eval/special_vars_spec.lua b/test/functional/eval/special_vars_spec.lua
index 4c5d63ce23..97a12d490d 100644
--- a/test/functional/eval/special_vars_spec.lua
+++ b/test/functional/eval/special_vars_spec.lua
@@ -1,6 +1,6 @@
local helpers = require('test.functional.helpers')(after_each)
local exc_exec = helpers.exc_exec
-local execute = helpers.execute
+local command = helpers.command
local funcs = helpers.funcs
local clear = helpers.clear
local eval = helpers.eval
@@ -12,7 +12,7 @@ describe('Special values', function()
before_each(clear)
it('do not cause error when freed', function()
- execute([[
+ command([[
function Test()
try
return v:true
@@ -109,7 +109,7 @@ describe('Special values', function()
it('does not work with +=/-=/.=', function()
meths.set_var('true', true)
meths.set_var('false', false)
- execute('let null = v:null')
+ command('let null = v:null')
eq('Vim(let):E734: Wrong variable type for +=', exc_exec('let true += 1'))
eq('Vim(let):E734: Wrong variable type for +=', exc_exec('let false += 1'))
@@ -168,4 +168,23 @@ describe('Special values', function()
'Expected True but got v:null',
}, meths.get_vvar('errors'))
end)
+
+ describe('compat', function()
+ it('v:count is distinct from count', function()
+ command('let count = []') -- v:count is readonly
+ eq(1, eval('count is# g:["count"]'))
+ end)
+ it('v:errmsg is distinct from errmsg', function()
+ command('let errmsg = 1')
+ eq(1, eval('errmsg is# g:["errmsg"]'))
+ end)
+ it('v:shell_error is distinct from shell_error', function()
+ command('let shell_error = []') -- v:shell_error is readonly
+ eq(1, eval('shell_error is# g:["shell_error"]'))
+ end)
+ it('v:this_session is distinct from this_session', function()
+ command('let this_session = []')
+ eq(1, eval('this_session is# g:["this_session"]'))
+ end)
+ end)
end)
diff --git a/test/functional/eval/string_spec.lua b/test/functional/eval/string_spec.lua
index 9e2dc4e111..adc1af9b8e 100644
--- a/test/functional/eval/string_spec.lua
+++ b/test/functional/eval/string_spec.lua
@@ -7,8 +7,9 @@ local eval = helpers.eval
local exc_exec = helpers.exc_exec
local redir_exec = helpers.redir_exec
local funcs = helpers.funcs
-local write_file = helpers.write_file
local NIL = helpers.NIL
+local source = helpers.source
+local dedent = helpers.dedent
describe('string() function', function()
before_each(clear)
@@ -103,26 +104,19 @@ describe('string() function', function()
end)
describe('used to represent funcrefs', function()
- local fname = 'Xtest-functional-eval-string_spec-fref-script.vim'
-
before_each(function()
- write_file(fname, [[
+ source([[
function Test1()
endfunction
- function s:Test2()
+ function s:Test2() dict
endfunction
- function g:Test3()
+ function g:Test3() dict
endfunction
let g:Test2_f = function('s:Test2')
]])
- command('source ' .. fname)
- end)
-
- after_each(function()
- os.remove(fname)
end)
it('dumps references to built-in functions', function()
@@ -137,6 +131,85 @@ describe('string() function', function()
it('dumps references to script functions', function()
eq('function(\'<SNR>1_Test2\')', eval('string(Test2_f)'))
end)
+
+ it('dumps partials with self referencing a partial', function()
+ source([[
+ function TestDict() dict
+ endfunction
+ let d = {}
+ let TestDictRef = function('TestDict', d)
+ let d.tdr = TestDictRef
+ ]])
+ eq("\nE724: unable to correctly dump variable with self-referencing container\nfunction('TestDict', {'tdr': function('TestDict', {E724@1})})",
+ redir_exec('echo string(d.tdr)'))
+ end)
+
+ it('dumps automatically created partials', function()
+ eq('function(\'<SNR>1_Test2\', {\'f\': function(\'<SNR>1_Test2\')})',
+ eval('string({"f": Test2_f}.f)'))
+ eq('function(\'<SNR>1_Test2\', [1], {\'f\': function(\'<SNR>1_Test2\', [1])})',
+ eval('string({"f": function(Test2_f, [1])}.f)'))
+ end)
+
+ it('dumps manually created partials', function()
+ eq('function(\'Test3\', [1, 2], {})',
+ eval('string(function("Test3", [1, 2], {}))'))
+ eq('function(\'Test3\', {})',
+ eval('string(function("Test3", {}))'))
+ eq('function(\'Test3\', [1, 2])',
+ eval('string(function("Test3", [1, 2]))'))
+ end)
+
+ it('does not crash or halt when dumping partials with reference cycles in self',
+ function()
+ meths.set_var('d', {v=true})
+ eq(dedent([[
+
+ E724: unable to correctly dump variable with self-referencing container
+ {'p': function('<SNR>1_Test2', {E724@0}), 'f': function('<SNR>1_Test2'), 'v': v:true}]]),
+ redir_exec('echo string(extend(extend(g:d, {"f": g:Test2_f}), {"p": g:d.f}))'))
+ end)
+
+ it('does not show errors when dumping partials referencing the same dictionary',
+ function()
+ command('let d = {}')
+ -- Regression for โ€œeval/typval_encode: Dump empty dictionary before
+ -- checking for refcycleโ€, results in error.
+ eq('[function(\'tr\', {}), function(\'tr\', {})]', eval('string([function("tr", d), function("tr", d)])'))
+ -- Regression for โ€œeval: Work with reference cycles in partials (self)
+ -- properlyโ€, results in crash.
+ eval('extend(d, {"a": 1})')
+ eq('[function(\'tr\', {\'a\': 1}), function(\'tr\', {\'a\': 1})]', eval('string([function("tr", d), function("tr", d)])'))
+ end)
+
+ it('does not crash or halt when dumping partials with reference cycles in arguments',
+ function()
+ meths.set_var('l', {})
+ eval('add(l, l)')
+ -- Regression: the below line used to crash (add returns original list and
+ -- there was error in dumping partials). Tested explicitly in
+ -- test/unit/api/private_helpers_spec.lua.
+ eval('add(l, function("Test1", l))')
+ eq(dedent([=[
+
+ E724: unable to correctly dump variable with self-referencing container
+ function('Test1', [[{E724@2}, function('Test1', [{E724@2}])], function('Test1', [[{E724@4}, function('Test1', [{E724@4}])]])])]=]),
+ redir_exec('echo string(function("Test1", l))'))
+ end)
+
+ it('does not crash or halt when dumping partials with reference cycles in self and arguments',
+ function()
+ meths.set_var('d', {v=true})
+ meths.set_var('l', {})
+ eval('add(l, l)')
+ eval('add(l, function("Test1", l))')
+ eval('add(l, function("Test1", d))')
+ eq(dedent([=[
+
+ E724: unable to correctly dump variable with self-referencing container
+ {'p': function('<SNR>1_Test2', [[{E724@3}, function('Test1', [{E724@3}]), function('Test1', {E724@0})], function('Test1', [[{E724@5}, function('Test1', [{E724@5}]), function('Test1', {E724@0})]]), function('Test1', {E724@0})], {E724@0}), 'f': function('<SNR>1_Test2'), 'v': v:true}]=]),
+ redir_exec('echo string(extend(extend(g:d, {"f": g:Test2_f}), {"p": function(g:d.f, l)}))'))
+ end)
end)
describe('used to represent lists', function()
@@ -174,6 +247,13 @@ describe('string() function', function()
eq('{}', eval('string({})'))
end)
+ it('dumps list with two same empty dictionaries, also in partials', function()
+ command('let d = {}')
+ eq('[{}, {}]', eval('string([d, d])'))
+ eq('[function(\'tr\', {}), {}]', eval('string([function("tr", d), d])'))
+ eq('[{}, function(\'tr\', {})]', eval('string([d, function("tr", d)])'))
+ end)
+
it('dumps non-empty dictionary', function()
eq('{\'t\'\'est\': 1}', funcs.string({['t\'est']=1}))
end)
diff --git a/test/functional/shell/viml_system_spec.lua b/test/functional/eval/system_spec.lua
index 3de022cbd9..5cbf34365b 100644
--- a/test/functional/shell/viml_system_spec.lua
+++ b/test/functional/eval/system_spec.lua
@@ -1,13 +1,14 @@
--- Specs for
--- - `system()`
--- - `systemlist()`
-
local helpers = require('test.functional.helpers')(after_each)
-local eq, clear, eval, feed, nvim =
- helpers.eq, helpers.clear, helpers.eval, helpers.feed, helpers.nvim
-local Screen = require('test.functional.ui.screen')
+local nvim_dir = helpers.nvim_dir
+local eq, call, clear, eval, feed_command, feed, nvim =
+ helpers.eq, helpers.call, helpers.clear, helpers.eval, helpers.feed_command,
+ helpers.feed, helpers.nvim
+local command = helpers.command
+local exc_exec = helpers.exc_exec
+local iswin = helpers.iswin
+local Screen = require('test.functional.ui.screen')
local function create_file_with_nuls(name)
return function()
@@ -33,30 +34,154 @@ end
describe('system()', function()
before_each(clear)
- it('sets the v:shell_error variable', function()
- eval([[system("sh -c 'exit'")]])
- eq(0, eval('v:shell_error'))
- eval([[system("sh -c 'exit 1'")]])
- eq(1, eval('v:shell_error'))
- eval([[system("sh -c 'exit 5'")]])
- eq(5, eval('v:shell_error'))
- eval([[system('this-should-not-exist')]])
- eq(127, eval('v:shell_error'))
+ describe('command passed as a List', function()
+ local function printargs_path()
+ return nvim_dir..'/printargs-test' .. (iswin() and '.exe' or '')
+ end
+
+ it('sets v:shell_error if cmd[0] is not executable', function()
+ call('system', { 'this-should-not-exist' })
+ eq(-1, eval('v:shell_error'))
+ end)
+
+ it('parameter validation does NOT modify v:shell_error', function()
+ -- 1. Call system() with invalid parameters.
+ -- 2. Assert that v:shell_error was NOT set.
+ feed_command('call system({})')
+ eq('E475: Invalid argument: expected String or List', eval('v:errmsg'))
+ eq(0, eval('v:shell_error'))
+ feed_command('call system([])')
+ eq('E474: Invalid argument', eval('v:errmsg'))
+ eq(0, eval('v:shell_error'))
+
+ -- Provoke a non-zero v:shell_error.
+ call('system', { 'this-should-not-exist' })
+ local old_val = eval('v:shell_error')
+ eq(-1, old_val)
+
+ -- 1. Call system() with invalid parameters.
+ -- 2. Assert that v:shell_error was NOT modified.
+ feed_command('call system({})')
+ eq(old_val, eval('v:shell_error'))
+ feed_command('call system([])')
+ eq(old_val, eval('v:shell_error'))
+ end)
+
+ it('quotes arguments correctly #5280', function()
+ local out = call('system',
+ { printargs_path(), [[1]], [[2 "3]], [[4 ' 5]], [[6 ' 7']] })
+
+ eq(0, eval('v:shell_error'))
+ eq([[arg1=1;arg2=2 "3;arg3=4 ' 5;arg4=6 ' 7';]], out)
+
+ out = call('system', { printargs_path(), [['1]], [[2 "3]] })
+ eq(0, eval('v:shell_error'))
+ eq([[arg1='1;arg2=2 "3;]], out)
+
+ out = call('system', { printargs_path(), "A\nB" })
+ eq(0, eval('v:shell_error'))
+ eq("arg1=A\nB;", out)
+ end)
+
+ it('calls executable in $PATH', function()
+ if 0 == eval("executable('python')") then pending("missing `python`") end
+ eq("foo\n", eval([[system(['python', '-c', 'print("foo")'])]]))
+ eq(0, eval('v:shell_error'))
+ end)
+
+ it('does NOT run in shell', function()
+ if iswin() then
+ eq("%PATH%\n", eval("system(['powershell', '-NoProfile', '-NoLogo', '-ExecutionPolicy', 'RemoteSigned', '-Command', 'echo', '%PATH%'])"))
+ else
+ eq("* $PATH %PATH%\n", eval("system(['echo', '*', '$PATH', '%PATH%'])"))
+ end
+ end)
+ end)
+
+ it('sets v:shell_error', function()
+ if iswin() then
+ eval([[system("cmd.exe /c exit")]])
+ eq(0, eval('v:shell_error'))
+ eval([[system("cmd.exe /c exit 1")]])
+ eq(1, eval('v:shell_error'))
+ eval([[system("cmd.exe /c exit 5")]])
+ eq(5, eval('v:shell_error'))
+ eval([[system('this-should-not-exist')]])
+ eq(1, eval('v:shell_error'))
+ else
+ eval([[system("sh -c 'exit'")]])
+ eq(0, eval('v:shell_error'))
+ eval([[system("sh -c 'exit 1'")]])
+ eq(1, eval('v:shell_error'))
+ eval([[system("sh -c 'exit 5'")]])
+ eq(5, eval('v:shell_error'))
+ eval([[system('this-should-not-exist')]])
+ eq(127, eval('v:shell_error'))
+ end
end)
- describe('executes shell function if passed a string', function()
+ describe('executes shell function', function()
local screen
before_each(function()
- clear()
- screen = Screen.new()
- screen:attach()
+ screen = Screen.new()
+ screen:attach()
end)
after_each(function()
- screen:detach()
+ screen:detach()
end)
+ if iswin() then
+ local function test_more()
+ eq('root = true', eval([[get(split(system('"more" ".editorconfig"'), "\n"), 0, '')]]))
+ end
+ local function test_shell_unquoting()
+ eval([[system('"ping" "-n" "1" "127.0.0.1"')]])
+ eq(0, eval('v:shell_error'))
+ eq('"a b"\n', eval([[system('cmd /s/c "cmd /s/c "cmd /s/c "echo "a b""""')]]))
+ eq('"a b"\n', eval([[system('powershell -NoProfile -NoLogo -ExecutionPolicy RemoteSigned -Command echo ''\^"a b\^"''')]]))
+ end
+
+ it('with shell=cmd.exe', function()
+ command('set shell=cmd.exe')
+ eq('""\n', eval([[system('echo ""')]]))
+ eq('"a b"\n', eval([[system('echo "a b"')]]))
+ eq('a \nb\n', eval([[system('echo a & echo b')]]))
+ eq('a \n', eval([[system('echo a 2>&1')]]))
+ test_more()
+ eval([[system('cd "C:\Program Files"')]])
+ eq(0, eval('v:shell_error'))
+ test_shell_unquoting()
+ end)
+
+ it('with shell=cmd', function()
+ command('set shell=cmd')
+ eq('"a b"\n', eval([[system('echo "a b"')]]))
+ test_more()
+ test_shell_unquoting()
+ end)
+
+ it('with shell=$COMSPEC', function()
+ local comspecshell = eval("fnamemodify($COMSPEC, ':t')")
+ if comspecshell == 'cmd.exe' then
+ command('set shell=$COMSPEC')
+ eq('"a b"\n', eval([[system('echo "a b"')]]))
+ test_more()
+ test_shell_unquoting()
+ else
+ pending('$COMSPEC is not cmd.exe: ' .. comspecshell)
+ end
+ end)
+
+ it('works with powershell', function()
+ helpers.set_shell_powershell()
+ eq('a\nb\n', eval([[system('echo a b')]]))
+ eq('C:\\\n', eval([[system('cd c:\; (Get-Location).Path')]]))
+ eq('a b\n', eval([[system('echo "a b"')]]))
+ end)
+ end
+
it('`echo` and waits for its return', function()
feed(':call system("echo")<cr>')
screen:expect([[
@@ -77,8 +202,42 @@ describe('system()', function()
]])
end)
- it('`yes` and is interrupted with CTRL-C', function()
- feed(':call system("yes")<cr>')
+ it('prints verbose information', function()
+ screen:try_resize(72, 14)
+ feed(':4verbose echo system("echo hi")<cr>')
+ if iswin() then
+ screen:expect{any=[[Executing command: "'cmd.exe' '/s' '/c' '"echo hi"'"]]}
+ else
+ screen:expect{any=[[Executing command: "'/[^']*sh' '%-c' 'echo hi'"]]}
+ end
+ feed('<cr>')
+ end)
+
+ it('self and total time recorded separately', function()
+ local tempfile = helpers.tmpname()
+
+ feed(':function! AlmostNoSelfTime()<cr>')
+ feed('echo system("echo hi")<cr>')
+ feed('endfunction<cr>')
+
+ feed(':profile start ' .. tempfile .. '<cr>')
+ feed(':profile func AlmostNoSelfTime<cr>')
+ feed(':call AlmostNoSelfTime()<cr>')
+ feed(':profile dump<cr>')
+
+ feed(':edit ' .. tempfile .. '<cr>')
+
+ local command_total_time = tonumber(helpers.funcs.split(helpers.funcs.getline(7))[2])
+ local command_self_time = tonumber(helpers.funcs.split(helpers.funcs.getline(7))[3])
+
+ helpers.neq(nil, command_total_time)
+ helpers.neq(nil, command_self_time)
+ end)
+
+ it('`yes` interrupted with CTRL-C', function()
+ feed(':call system("' .. (iswin()
+ and 'for /L %I in (1,0,2) do @echo y'
+ or 'yes') .. '")<cr>')
screen:expect([[
|
~ |
@@ -93,8 +252,11 @@ describe('system()', function()
~ |
~ |
~ |
- :call system("yes") |
- ]])
+]] .. (iswin()
+ and [[
+ :call system("for /L %I in (1,0,2) do @echo y") |]]
+ or [[
+ :call system("yes") |]]))
feed('<c-c>')
screen:expect([[
^ |
@@ -110,14 +272,27 @@ describe('system()', function()
~ |
~ |
~ |
- Type :quit<Enter> to exit Nvim |
+ Type :qa! and press <E...all changes and exit Nvim |
]])
end)
end)
describe('passing no input', function()
it('returns the program output', function()
- eq("echoed", eval('system("echo -n echoed")'))
+ if iswin() then
+ eq("echoed\n", eval('system("echo echoed")'))
+ else
+ eq("echoed", eval('system("echo -n echoed")'))
+ end
+ end)
+ it('to backgrounded command does not crash', function()
+ -- This is indeterminate, just exercise the codepath. May get E5677.
+ feed_command('call system(has("win32") ? "start /b /wait cmd /c echo echoed" : "echo -n echoed &")')
+ local v_errnum = string.match(eval("v:errmsg"), "^E%d*:")
+ if v_errnum then
+ eq("E5677:", v_errnum)
+ end
+ eq(2, eval("1+1")) -- Still alive?
end)
end)
@@ -125,6 +300,19 @@ describe('system()', function()
it('returns the program output', function()
eq("input", eval('system("cat -", "input")'))
end)
+ it('to backgrounded command does not crash', function()
+ -- This is indeterminate, just exercise the codepath. May get E5677.
+ feed_command('call system(has("win32") ? "start /b /wait more" : "cat - &", "input")')
+ local v_errnum = string.match(eval("v:errmsg"), "^E%d*:")
+ if v_errnum then
+ eq("E5677:", v_errnum)
+ end
+ eq(2, eval("1+1")) -- Still alive?
+ end)
+ it('works with an empty string', function()
+ eq("test\n", eval('system("echo test", "")'))
+ eq(2, eval("1+1")) -- Still alive?
+ end)
end)
describe('passing a lot of input', function()
@@ -142,9 +330,12 @@ describe('system()', function()
end)
end)
- describe('passing number as input', function()
- it('stringifies the input', function()
- eq('1', eval('system("cat", 1)'))
+ describe('Number input', function()
+ it('is treated as a buffer id', function()
+ command("put ='text in buffer 1'")
+ eq('\ntext in buffer 1\n', eval('system("cat", 1)'))
+ eq('Vim(echo):E86: Buffer 42 does not exist',
+ exc_exec('echo system("cat", 42)'))
end)
end)
@@ -155,12 +346,12 @@ describe('system()', function()
after_each(delete_file(fname))
it('replaces NULs by SOH characters', function()
- eq('part1\001part2\001part3\n', eval('system("cat '..fname..'")'))
+ eq('part1\001part2\001part3\n', eval([[system('"cat" "]]..fname..[["')]]))
end)
end)
- describe('passing list as input', function()
- it('joins list items with linefeed characters', function()
+ describe('input passed as List', function()
+ it('joins List items with linefeed characters', function()
eq('line1\nline2\nline3',
eval("system('cat -', ['line1', 'line2', 'line3'])"))
end)
@@ -169,7 +360,7 @@ describe('system()', function()
-- is inconsistent and is a good reason for the existence of the
-- `systemlist()` function, where input and output map to the same
-- characters(see the following tests with `systemlist()` below)
- describe('with linefeed characters inside list items', function()
+ describe('with linefeed characters inside List items', function()
it('converts linefeed characters to NULs', function()
eq('l1\001p2\nline2\001a\001b\nl3',
eval([[system('cat -', ["l1\np2", "line2\na\nb", 'l3'])]]))
@@ -186,50 +377,52 @@ describe('system()', function()
describe("with a program that doesn't close stdout", function()
if not xclip then
- pending('skipped (missing xclip)', function() end)
+ pending('missing `xclip`', function() end)
else
it('will exit properly after passing input', function()
- eq('', eval([[system('xclip -i -selection clipboard', 'clip-data')]]))
+ eq('', eval([[system('xclip -i -loops 1 -selection clipboard', 'clip-data')]]))
eq('clip-data', eval([[system('xclip -o -selection clipboard')]]))
end)
end
end)
-
- describe('command passed as a list', function()
- it('does not execute &shell', function()
- eq('* $NOTHING ~/file',
- eval("system(['echo', '-n', '*', '$NOTHING', '~/file'])"))
- end)
- end)
end)
describe('systemlist()', function()
- -- behavior is similar to `system()` but it returns a list instead of a
- -- string.
+ -- Similar to `system()`, but returns List instead of String.
before_each(clear)
- it('sets the v:shell_error variable', function()
- eval([[systemlist("sh -c 'exit'")]])
- eq(0, eval('v:shell_error'))
- eval([[systemlist("sh -c 'exit 1'")]])
- eq(1, eval('v:shell_error'))
- eval([[systemlist("sh -c 'exit 5'")]])
- eq(5, eval('v:shell_error'))
- eval([[systemlist('this-should-not-exist')]])
- eq(127, eval('v:shell_error'))
+ it('sets v:shell_error', function()
+ if iswin() then
+ eval([[systemlist("cmd.exe /c exit")]])
+ eq(0, eval('v:shell_error'))
+ eval([[systemlist("cmd.exe /c exit 1")]])
+ eq(1, eval('v:shell_error'))
+ eval([[systemlist("cmd.exe /c exit 5")]])
+ eq(5, eval('v:shell_error'))
+ eval([[systemlist('this-should-not-exist')]])
+ eq(1, eval('v:shell_error'))
+ else
+ eval([[systemlist("sh -c 'exit'")]])
+ eq(0, eval('v:shell_error'))
+ eval([[systemlist("sh -c 'exit 1'")]])
+ eq(1, eval('v:shell_error'))
+ eval([[systemlist("sh -c 'exit 5'")]])
+ eq(5, eval('v:shell_error'))
+ eval([[systemlist('this-should-not-exist')]])
+ eq(127, eval('v:shell_error'))
+ end
end)
- describe('exectues shell function', function()
+ describe('executes shell function', function()
local screen
before_each(function()
- clear()
- screen = Screen.new()
- screen:attach()
+ screen = Screen.new()
+ screen:attach()
end)
after_each(function()
- screen:detach()
+ screen:detach()
end)
it('`echo` and waits for its return', function()
@@ -252,7 +445,7 @@ describe('systemlist()', function()
]])
end)
- it('`yes` and is interrupted with CTRL-C', function()
+ it('`yes` interrupted with CTRL-C', function()
feed(':call systemlist("yes | xargs")<cr>')
screen:expect([[
|
@@ -285,7 +478,7 @@ describe('systemlist()', function()
~ |
~ |
~ |
- Type :quit<Enter> to exit Nvim |
+ Type :qa! and press <E...all changes and exit Nvim |
]])
end)
end)
@@ -310,22 +503,25 @@ describe('systemlist()', function()
describe('with output containing NULs', function()
local fname = 'Xtest'
- before_each(create_file_with_nuls(fname))
+ before_each(function()
+ command('set ff=unix')
+ create_file_with_nuls(fname)()
+ end)
after_each(delete_file(fname))
it('replaces NULs by newline characters', function()
- eq({'part1\npart2\npart3'}, eval('systemlist("cat '..fname..'")'))
+ eq({'part1\npart2\npart3'}, eval([[systemlist('"cat" "]]..fname..[["')]]))
end)
end)
- describe('passing list as input', function()
+ describe('input passed as List', function()
it('joins list items with linefeed characters', function()
eq({'line1', 'line2', 'line3'},
eval("systemlist('cat -', ['line1', 'line2', 'line3'])"))
end)
-- Unlike `system()` which uses SOH to represent NULs, with `systemlist()`
- -- input and ouput are the same
+ -- input and ouput are the same.
describe('with linefeed characters inside list items', function()
it('converts linefeed characters to NULs', function()
eq({'l1\np2', 'line2\na\nb', 'l3'},
@@ -365,11 +561,11 @@ describe('systemlist()', function()
describe("with a program that doesn't close stdout", function()
if not xclip then
- pending('skipped (missing xclip)', function() end)
+ pending('missing `xclip`', function() end)
else
it('will exit properly after passing input', function()
eq({}, eval(
- "systemlist('xclip -i -selection clipboard', ['clip', 'data'])"))
+ "systemlist('xclip -i -loops 1 -selection clipboard', ['clip', 'data'])"))
eq({'clip', 'data'}, eval(
"systemlist('xclip -o -selection clipboard')"))
end)
diff --git a/test/functional/eval/timer_spec.lua b/test/functional/eval/timer_spec.lua
index 2f83edb9e4..124b9625c3 100644
--- a/test/functional/eval/timer_spec.lua
+++ b/test/functional/eval/timer_spec.lua
@@ -1,8 +1,9 @@
local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
-local ok, feed, eq, eval = helpers.ok, helpers.feed, helpers.eq, helpers.eval
+local feed, eq, eval = helpers.feed, helpers.eq, helpers.eval
local source, nvim_async, run = helpers.source, helpers.nvim_async, helpers.run
-local clear, execute, funcs = helpers.clear, helpers.execute, helpers.funcs
+local clear, command, funcs = helpers.clear, helpers.command, helpers.funcs
+local curbufmeths = helpers.curbufmeths
describe('timers', function()
before_each(function()
@@ -16,14 +17,14 @@ describe('timers', function()
end)
it('works one-shot', function()
- execute("call timer_start(50, 'MyHandler')")
+ command("call timer_start(50, 'MyHandler')")
eq(0,eval("g:val"))
run(nil, nil, nil, 200)
eq(1,eval("g:val"))
end)
it('works one-shot when repeat=0', function()
- execute("call timer_start(50, 'MyHandler', {'repeat': 0})")
+ command("call timer_start(50, 'MyHandler', {'repeat': 0})")
eq(0,eval("g:val"))
run(nil, nil, nil, 200)
eq(1,eval("g:val"))
@@ -31,14 +32,14 @@ describe('timers', function()
it('works with repeat two', function()
- execute("call timer_start(50, 'MyHandler', {'repeat': 2})")
+ command("call timer_start(50, 'MyHandler', {'repeat': 2})")
eq(0,eval("g:val"))
run(nil, nil, nil, 300)
eq(2,eval("g:val"))
end)
it('are triggered during sleep', function()
- execute("call timer_start(50, 'MyHandler', {'repeat': 2})")
+ command("call timer_start(50, 'MyHandler', {'repeat': 2})")
nvim_async("command", "sleep 10")
eq(0,eval("g:val"))
run(nil, nil, nil, 300)
@@ -48,7 +49,7 @@ describe('timers', function()
it('works with zero timeout', function()
-- timer_start does still not invoke the callback immediately
eq(0,eval("[timer_start(0, 'MyHandler', {'repeat': 1000}), g:val][1]"))
- run(nil, nil, nil, 300)
+ run(nil, nil, nil, 400)
eq(1000,eval("g:val"))
end)
@@ -62,19 +63,77 @@ describe('timers', function()
end)
it('are paused when event processing is disabled', function()
- -- this is not the intended behavior, but at least there will
- -- not be a burst of queued up callbacks
- execute("call timer_start(50, 'MyHandler', {'repeat': 2})")
+ command("call timer_start(50, 'MyHandler', {'repeat': -1})")
run(nil, nil, nil, 100)
local count = eval("g:val")
+ -- shows two line error message and thus invokes the return prompt.
+ -- if we start to allow event processing here, we need to change this test.
+ feed(':throw "fatal error"<CR>')
+ run(nil, nil, nil, 300)
+ feed("<cr>")
+ local diff = eval("g:val") - count
+ assert(0 <= diff and diff <= 4,
+ 'expected (0 <= diff <= 4), got: '..tostring(diff))
+ end)
+
+ it('are triggered in blocking getchar() call', function()
+ command("call timer_start(50, 'MyHandler', {'repeat': -1})")
nvim_async("command", "let g:c = getchar()")
run(nil, nil, nil, 300)
feed("c")
- local diff = eval("g:val") - count
- ok(0 <= diff and diff <= 2)
+ local count = eval("g:val")
+ assert(count >= 3, 'expected count >= 3, got: '..tostring(count))
eq(99, eval("g:c"))
end)
+ it('can invoke redraw in blocking getchar() call', function()
+ local screen = Screen.new(40, 6)
+ screen:attach()
+ screen:set_default_attr_ids({
+ [1] = {bold=true, foreground=Screen.colors.Blue},
+ })
+
+ curbufmeths.set_lines(0, -1, true, {"ITEM 1", "ITEM 2"})
+ source([[
+ func! AddItem(timer)
+ call nvim_buf_set_lines(0, 2, 2, v:true, ['ITEM 3'])
+ call getchar(1)
+ redraw
+ endfunc
+ call timer_start(200, 'AddItem')
+ ]])
+ nvim_async("command", "let g:c2 = getchar()")
+
+ screen:expect([[
+ ITEM 1 |
+ ITEM 2 |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ^ |
+ ]])
+
+ screen:expect([[
+ ITEM 1 |
+ ITEM 2 |
+ ITEM 3 |
+ {1:~ }|
+ {1:~ }|
+ ^ |
+ ]])
+
+ feed("3")
+ eq(51, eval("g:c2"))
+ screen:expect([[
+ ^ITEM 1 |
+ ITEM 2 |
+ ITEM 3 |
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+ end)
+
it('can be stopped', function()
local t = eval("timer_start(50, 'MyHandler', {'repeat': -1})")
eq(0,eval("g:val"))
@@ -83,9 +142,10 @@ describe('timers', function()
local count = eval("g:val")
run(nil, nil, nil, 300)
local count2 = eval("g:val")
- ok(4 <= count and count <= 7)
-- when count is eval:ed after timer_stop this should be non-racy
eq(count, count2)
+ assert(3 <= count and count <= 7,
+ 'expected (3 <= count <= 7), got: '..tostring(count))
end)
it('can be stopped from the handler', function()
@@ -99,7 +159,7 @@ describe('timers', function()
endif
endfunc
]])
- execute("call timer_start(50, 'MyHandler', {'repeat': -1})")
+ command("call timer_start(50, 'MyHandler', {'repeat': -1})")
eq(0,eval("g:val"))
run(nil, nil, nil, 300)
eq(3,eval("g:val"))
@@ -112,33 +172,60 @@ describe('timers', function()
let g:val2 += 1
endfunc
]])
- execute("call timer_start(50, 'MyHandler', {'repeat': 3})")
- execute("call timer_start(100, 'MyHandler2', {'repeat': 2})")
+ command("call timer_start(20, 'MyHandler', {'repeat': 3})")
+ command("call timer_start(40, 'MyHandler2', {'repeat': 2})")
run(nil, nil, nil, 300)
eq(3,eval("g:val"))
eq(2,eval("g:val2"))
end)
+ it('do not crash when processing events in the handler', function()
+ source([[
+ let g:val = 0
+ func! MyHandler(timer)
+ call timer_stop(a:timer)
+ sleep 100m
+ let g:val += 1
+ endfunc
+ ]])
+ command("call timer_start(5, 'MyHandler', {'repeat': 1})")
+ run(nil, nil, nil, 300)
+ eq(1,eval("g:val"))
+ end)
+
+
it("doesn't mess up the cmdline", function()
local screen = Screen.new(40, 6)
screen:attach()
- screen:set_default_attr_ignore({{bold=true, foreground=Screen.colors.Blue}})
+ screen:set_default_attr_ids( {[0] = {bold=true, foreground=255}} )
source([[
+ let g:val = 0
func! MyHandler(timer)
echo "evil"
+ let g:val = 1
endfunc
]])
- execute("call timer_start(100, 'MyHandler', {'repeat': 1})")
+ command("call timer_start(100, 'MyHandler', {'repeat': 1})")
feed(":good")
- screen:sleep(200)
screen:expect([[
|
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
:good^ |
]])
+
+ screen:expect{grid=[[
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ :good^ |
+ ]], intermediate=true, timeout=200}
+
+ eq(1, eval('g:val'))
end)
end)
diff --git a/test/functional/eval/uniq_spec.lua b/test/functional/eval/uniq_spec.lua
new file mode 100644
index 0000000000..0e7a013e32
--- /dev/null
+++ b/test/functional/eval/uniq_spec.lua
@@ -0,0 +1,31 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local eq = helpers.eq
+local clear = helpers.clear
+local meths = helpers.meths
+local command = helpers.command
+local exc_exec = helpers.exc_exec
+local redir_exec = helpers.redir_exec
+
+before_each(clear)
+
+describe('uniq()', function()
+ it('errors out when processing special values', function()
+ eq('Vim(call):E907: Using a special value as a Float',
+ exc_exec('call uniq([v:true, v:false], "f")'))
+ end)
+
+ it('can yield E882 and stop filtering after that', function()
+ command([[
+ function Cmp(a, b)
+ if type(a:a) == type([]) || type(a:b) == type([])
+ return []
+ endif
+ return (a:a > a:b) - (a:a < a:b)
+ endfunction
+ ]])
+ eq('\nE745: Using a List as a Number\nE882: Uniq compare function failed',
+ redir_exec('let fl = uniq([0, 0, [], 1, 1], "Cmp")'))
+ eq({0, {}, 1, 1}, meths.get_var('fl'))
+ end)
+end)
diff --git a/test/functional/eval/writefile_spec.lua b/test/functional/eval/writefile_spec.lua
new file mode 100644
index 0000000000..0bb7523d7e
--- /dev/null
+++ b/test/functional/eval/writefile_spec.lua
@@ -0,0 +1,146 @@
+local helpers = require('test.functional.helpers')(after_each)
+local lfs = require('lfs')
+
+local clear = helpers.clear
+local eq = helpers.eq
+local funcs = helpers.funcs
+local meths = helpers.meths
+local exc_exec = helpers.exc_exec
+local read_file = helpers.read_file
+local write_file = helpers.write_file
+local redir_exec = helpers.redir_exec
+
+local fname = 'Xtest-functional-eval-writefile'
+local dname = fname .. '.d'
+local dfname_tail = '1'
+local dfname = dname .. '/' .. dfname_tail
+local ddname_tail = '2'
+local ddname = dname .. '/' .. ddname_tail
+
+before_each(function()
+ lfs.mkdir(dname)
+ lfs.mkdir(ddname)
+ clear()
+end)
+
+after_each(function()
+ os.remove(fname)
+ os.remove(dfname)
+ lfs.rmdir(ddname)
+ lfs.rmdir(dname)
+end)
+
+describe('writefile()', function()
+ it('writes empty list to a file', function()
+ eq(nil, read_file(fname))
+ eq(0, funcs.writefile({}, fname))
+ eq('', read_file(fname))
+ os.remove(fname)
+ eq(nil, read_file(fname))
+ eq(0, funcs.writefile({}, fname, 'b'))
+ eq('', read_file(fname))
+ os.remove(fname)
+ eq(nil, read_file(fname))
+ eq(0, funcs.writefile({}, fname, 'ab'))
+ eq('', read_file(fname))
+ os.remove(fname)
+ eq(nil, read_file(fname))
+ eq(0, funcs.writefile({}, fname, 'a'))
+ eq('', read_file(fname))
+ end)
+
+ it('writes list with an empty string to a file', function()
+ eq(0, exc_exec(
+ ('call writefile([$XXX_NONEXISTENT_VAR_XXX], "%s", "b")'):format(
+ fname)))
+ eq('', read_file(fname))
+ eq(0, exc_exec(('call writefile([$XXX_NONEXISTENT_VAR_XXX], "%s")'):format(
+ fname)))
+ eq('\n', read_file(fname))
+ end)
+
+ it('appends to a file', function()
+ eq(nil, read_file(fname))
+ eq(0, funcs.writefile({'abc', 'def', 'ghi'}, fname))
+ eq('abc\ndef\nghi\n', read_file(fname))
+ eq(0, funcs.writefile({'jkl'}, fname, 'a'))
+ eq('abc\ndef\nghi\njkl\n', read_file(fname))
+ os.remove(fname)
+ eq(nil, read_file(fname))
+ eq(0, funcs.writefile({'abc', 'def', 'ghi'}, fname, 'b'))
+ eq('abc\ndef\nghi', read_file(fname))
+ eq(0, funcs.writefile({'jkl'}, fname, 'ab'))
+ eq('abc\ndef\nghijkl', read_file(fname))
+ end)
+
+ it('correctly treats NLs', function()
+ eq(0, funcs.writefile({'\na\nb\n'}, fname, 'b'))
+ eq('\0a\0b\0', read_file(fname))
+ eq(0, funcs.writefile({'a\n\n\nb'}, fname, 'b'))
+ eq('a\0\0\0b', read_file(fname))
+ end)
+
+ it('writes with s and S', function()
+ eq(0, funcs.writefile({'\na\nb\n'}, fname, 'bs'))
+ eq('\0a\0b\0', read_file(fname))
+ eq(0, funcs.writefile({'a\n\n\nb'}, fname, 'bS'))
+ eq('a\0\0\0b', read_file(fname))
+ end)
+
+ it('correctly overwrites file', function()
+ eq(0, funcs.writefile({'\na\nb\n'}, fname, 'b'))
+ eq('\0a\0b\0', read_file(fname))
+ eq(0, funcs.writefile({'a\n'}, fname, 'b'))
+ eq('a\0', read_file(fname))
+ end)
+
+ it('shows correct file name when supplied numbers', function()
+ meths.set_current_dir(dname)
+ eq('\nE482: Can\'t open file 2 for writing: illegal operation on a directory',
+ redir_exec(('call writefile([42], %s)'):format(ddname_tail)))
+ end)
+
+ it('errors out with invalid arguments', function()
+ write_file(fname, 'TEST')
+ eq('\nE119: Not enough arguments for function: writefile',
+ redir_exec('call writefile()'))
+ eq('\nE119: Not enough arguments for function: writefile',
+ redir_exec('call writefile([])'))
+ eq('\nE118: Too many arguments for function: writefile',
+ redir_exec(('call writefile([], "%s", "b", 1)'):format(fname)))
+ for _, arg in ipairs({'0', '0.0', 'function("tr")', '{}', '"test"'}) do
+ eq('\nE686: Argument of writefile() must be a List',
+ redir_exec(('call writefile(%s, "%s", "b")'):format(arg, fname)))
+ end
+ for _, args in ipairs({'[], %s, "b"', '[], "' .. fname .. '", %s'}) do
+ eq('\nE806: using Float as a String',
+ redir_exec(('call writefile(%s)'):format(args:format('0.0'))))
+ eq('\nE730: using List as a String',
+ redir_exec(('call writefile(%s)'):format(args:format('[]'))))
+ eq('\nE731: using Dictionary as a String',
+ redir_exec(('call writefile(%s)'):format(args:format('{}'))))
+ eq('\nE729: using Funcref as a String',
+ redir_exec(('call writefile(%s)'):format(args:format('function("tr")'))))
+ end
+ eq('\nE5060: Unknown flag: ยซยป',
+ redir_exec(('call writefile([], "%s", "bsยซยป")'):format(fname)))
+ eq('TEST', read_file(fname))
+ end)
+
+ it('does not write to file if error in list', function()
+ local args = '["tset"] + repeat([%s], 3), "' .. fname .. '"'
+ eq('\nE805: Expected a Number or a String, Float found',
+ redir_exec(('call writefile(%s)'):format(args:format('0.0'))))
+ eq(nil, read_file(fname))
+ write_file(fname, 'TEST')
+ eq('\nE745: Expected a Number or a String, List found',
+ redir_exec(('call writefile(%s)'):format(args:format('[]'))))
+ eq('TEST', read_file(fname))
+ eq('\nE728: Expected a Number or a String, Dictionary found',
+ redir_exec(('call writefile(%s)'):format(args:format('{}'))))
+ eq('TEST', read_file(fname))
+ eq('\nE703: Expected a Number or a String, Funcref found',
+ redir_exec(('call writefile(%s)'):format(args:format('function("tr")'))))
+ eq('TEST', read_file(fname))
+ end)
+end)
diff --git a/test/functional/ex_cmds/append_spec.lua b/test/functional/ex_cmds/append_spec.lua
index 3e326d9460..0a4d701794 100644
--- a/test/functional/ex_cmds/append_spec.lua
+++ b/test/functional/ex_cmds/append_spec.lua
@@ -22,8 +22,8 @@ local cmdtest = function(cmd, prep, ret1)
command(cmd .. '\nabc\ndef\n')
eq(ret1, buffer_contents())
end)
- -- Used to crash because this invokes history processing which uses
- -- hist_char2type which after fdb68e35e4c729c7ed097d8ade1da29e5b3f4b31
+ -- Used to crash because this invokes history processing which uses
+ -- hist_char2type which after fdb68e35e4c729c7ed097d8ade1da29e5b3f4b31
-- crashed.
it(cmd .. 's' .. prep .. ' the current line by default when feeding',
function()
diff --git a/test/functional/ex_cmds/arg_spec.lua b/test/functional/ex_cmds/arg_spec.lua
new file mode 100644
index 0000000000..6d31f05c2a
--- /dev/null
+++ b/test/functional/ex_cmds/arg_spec.lua
@@ -0,0 +1,30 @@
+local helpers = require("test.functional.helpers")(after_each)
+local eq, command, funcs = helpers.eq, helpers.command, helpers.funcs
+local ok = helpers.ok
+local clear = helpers.clear
+
+describe(":argument", function()
+ before_each(function()
+ clear()
+ end)
+
+ it("does not restart :terminal buffer", function()
+ command("terminal")
+ helpers.feed([[<C-\><C-N>]])
+ command("argadd")
+ helpers.feed([[<C-\><C-N>]])
+ local bufname_before = funcs.bufname("%")
+ local bufnr_before = funcs.bufnr("%")
+ helpers.ok(nil ~= string.find(bufname_before, "^term://")) -- sanity
+
+ command("argument 1")
+ helpers.feed([[<C-\><C-N>]])
+
+ local bufname_after = funcs.bufname("%")
+ local bufnr_after = funcs.bufnr("%")
+ eq("\n["..bufname_before.."] ", helpers.eval('execute("args")'))
+ ok(funcs.line('$') > 1)
+ eq(bufname_before, bufname_after)
+ eq(bufnr_before, bufnr_after)
+ end)
+end)
diff --git a/test/functional/ex_cmds/cd_spec.lua b/test/functional/ex_cmds/cd_spec.lua
index fcd826c25d..bc2b365b30 100644
--- a/test/functional/ex_cmds/cd_spec.lua
+++ b/test/functional/ex_cmds/cd_spec.lua
@@ -6,8 +6,9 @@ local helpers = require('test.functional.helpers')(after_each)
local eq = helpers.eq
local call = helpers.call
local clear = helpers.clear
-local execute = helpers.execute
+local command = helpers.command
local exc_exec = helpers.exc_exec
+local pathsep = helpers.get_pathsep()
-- These directories will be created for testing
local directories = {
@@ -56,7 +57,7 @@ for _, cmd in ipairs {'cd', 'chdir'} do
eq(0, lwd(globalwin))
eq(0, lwd(globalwin, tabnr))
- execute('bot split')
+ command('bot split')
local localwin = call('winnr')
-- Initial window is still using globalDir
eq(globalDir, cwd(localwin))
@@ -64,7 +65,7 @@ for _, cmd in ipairs {'cd', 'chdir'} do
eq(0, lwd(globalwin))
eq(0, lwd(globalwin, tabnr))
- execute('silent l' .. cmd .. ' ' .. directories.window)
+ command('silent l' .. cmd .. ' ' .. directories.window)
-- From window with local dir, the original window
-- is still reporting the global dir
eq(globalDir, cwd(globalwin))
@@ -73,18 +74,18 @@ for _, cmd in ipairs {'cd', 'chdir'} do
eq(0, lwd(globalwin, tabnr))
-- Window with local dir reports as such
- eq(globalDir .. '/' .. directories.window, cwd(localwin))
- eq(globalDir .. '/' .. directories.window, cwd(localwin, tabnr))
+ eq(globalDir .. pathsep .. directories.window, cwd(localwin))
+ eq(globalDir .. pathsep .. directories.window, cwd(localwin, tabnr))
eq(1, lwd(localwin))
eq(1, lwd(localwin, tabnr))
- execute('tabnew')
+ command('tabnew')
-- From new tab page, original window reports global dir
eq(globalDir, cwd(globalwin, tabnr))
eq(0, lwd(globalwin, tabnr))
-- From new tab page, local window reports as such
- eq(globalDir .. '/' .. directories.window, cwd(localwin, tabnr))
+ eq(globalDir .. pathsep .. directories.window, cwd(localwin, tabnr))
eq(1, lwd(localwin, tabnr))
end)
@@ -98,8 +99,8 @@ for _, cmd in ipairs {'cd', 'chdir'} do
eq(0, lwd(-1, 0))
eq(0, lwd(-1, globaltab))
- execute('tabnew')
- execute('silent t' .. cmd .. ' ' .. directories.tab)
+ command('tabnew')
+ command('silent t' .. cmd .. ' ' .. directories.tab)
local localtab = call('tabpagenr')
-- From local tab page, original tab reports globalDir
@@ -107,14 +108,14 @@ for _, cmd in ipairs {'cd', 'chdir'} do
eq(0, lwd(-1, globaltab))
-- new tab reports local
- eq(globalDir .. '/' .. directories.tab, cwd(-1, 0))
- eq(globalDir .. '/' .. directories.tab, cwd(-1, localtab))
+ eq(globalDir .. pathsep .. directories.tab, cwd(-1, 0))
+ eq(globalDir .. pathsep .. directories.tab, cwd(-1, localtab))
eq(1, lwd(-1, 0))
eq(1, lwd(-1, localtab))
- execute('tabnext')
+ command('tabnext')
-- From original tab page, local reports as such
- eq(globalDir .. '/' .. directories.tab, cwd(-1, localtab))
+ eq(globalDir .. pathsep .. directories.tab, cwd(-1, localtab))
eq(1, lwd(-1, localtab))
end)
end)
@@ -126,22 +127,43 @@ for _, cmd in ipairs {'cd', 'chdir'} do
end)
it('works with tab-local pwd', function()
- execute('silent t' .. cmd .. ' ' .. directories.tab)
+ command('silent t' .. cmd .. ' ' .. directories.tab)
eq(directories.start, cwd(-1, -1))
eq(0, lwd(-1, -1))
end)
it('works with window-local pwd', function()
- execute('silent l' .. cmd .. ' ' .. directories.window)
+ command('silent l' .. cmd .. ' ' .. directories.window)
eq(directories.start, cwd(-1, -1))
eq(0, lwd(-1, -1))
end)
end)
+ describe('Local directory gets inherited', function()
+ it('by tabs', function()
+ local globalDir = directories.start
+
+ -- Create a new tab and change directory
+ command('tabnew')
+ command('silent t' .. cmd .. ' ' .. directories.tab)
+ eq(globalDir .. pathsep .. directories.tab, tcwd())
+
+ -- Create a new tab and verify it has inherited the directory
+ command('tabnew')
+ eq(globalDir .. pathsep .. directories.tab, tcwd())
+
+ -- Change tab and change back, verify that directories are correct
+ command('tabnext')
+ eq(globalDir, tcwd())
+ command('tabprevious')
+ eq(globalDir .. pathsep .. directories.tab, tcwd())
+ end)
+ end)
+
it('works', function()
local globalDir = directories.start
-- Create a new tab first and verify that is has the same working dir
- execute('tabnew')
+ command('tabnew')
eq(globalDir, cwd())
eq(globalDir, tcwd()) -- has no tab-local directory
eq(0, tlwd())
@@ -149,57 +171,57 @@ for _, cmd in ipairs {'cd', 'chdir'} do
eq(0, wlwd())
-- Change tab-local working directory and verify it is different
- execute('silent t' .. cmd .. ' ' .. directories.tab)
- eq(globalDir .. '/' .. directories.tab, cwd())
+ command('silent t' .. cmd .. ' ' .. directories.tab)
+ eq(globalDir .. pathsep .. directories.tab, cwd())
eq(cwd(), tcwd()) -- working directory maches tab directory
eq(1, tlwd())
eq(cwd(), wcwd()) -- still no window-directory
eq(0, wlwd())
-- Create a new window in this tab to test `:lcd`
- execute('new')
+ command('new')
eq(1, tlwd()) -- Still tab-local working directory
eq(0, wlwd()) -- Still no window-local working directory
- eq(globalDir .. '/' .. directories.tab, cwd())
- execute('silent l' .. cmd .. ' ../' .. directories.window)
- eq(globalDir .. '/' .. directories.window, cwd())
- eq(globalDir .. '/' .. directories.tab, tcwd())
+ eq(globalDir .. pathsep .. directories.tab, cwd())
+ command('silent l' .. cmd .. ' ../' .. directories.window)
+ eq(globalDir .. pathsep .. directories.window, cwd())
+ eq(globalDir .. pathsep .. directories.tab, tcwd())
eq(1, wlwd())
-- Verify the first window still has the tab local directory
- execute('wincmd w')
- eq(globalDir .. '/' .. directories.tab, cwd())
- eq(globalDir .. '/' .. directories.tab, tcwd())
+ command('wincmd w')
+ eq(globalDir .. pathsep .. directories.tab, cwd())
+ eq(globalDir .. pathsep .. directories.tab, tcwd())
eq(0, wlwd()) -- No window-local directory
-- Change back to initial tab and verify working directory has stayed
- execute('tabnext')
+ command('tabnext')
eq(globalDir, cwd() )
eq(0, tlwd())
eq(0, wlwd())
-- Verify global changes don't affect local ones
- execute('silent ' .. cmd .. ' ' .. directories.global)
- eq(globalDir .. '/' .. directories.global, cwd())
- execute('tabnext')
- eq(globalDir .. '/' .. directories.tab, cwd())
- eq(globalDir .. '/' .. directories.tab, tcwd())
+ command('silent ' .. cmd .. ' ' .. directories.global)
+ eq(globalDir .. pathsep .. directories.global, cwd())
+ command('tabnext')
+ eq(globalDir .. pathsep .. directories.tab, cwd())
+ eq(globalDir .. pathsep .. directories.tab, tcwd())
eq(0, wlwd()) -- Still no window-local directory in this window
-- Unless the global change happened in a tab with local directory
- execute('silent ' .. cmd .. ' ..')
+ command('silent ' .. cmd .. ' ..')
eq(globalDir, cwd() )
eq(0 , tlwd())
eq(0 , wlwd())
-- Which also affects the first tab
- execute('tabnext')
+ command('tabnext')
eq(globalDir, cwd())
-- But not in a window with its own local directory
- execute('tabnext | wincmd w')
- eq(globalDir .. '/' .. directories.window, cwd() )
+ command('tabnext | wincmd w')
+ eq(globalDir .. pathsep .. directories.window, cwd() )
eq(0 , tlwd())
- eq(globalDir .. '/' .. directories.window, wcwd())
+ eq(globalDir .. pathsep .. directories.window, wcwd())
end)
end)
end
@@ -246,3 +268,24 @@ for _, cmd in ipairs {'getcwd', 'haslocaldir'} do
end)
end
+describe("getcwd()", function ()
+ before_each(function()
+ clear()
+ lfs.mkdir(directories.global)
+ end)
+
+ after_each(function()
+ helpers.rmdir(directories.global)
+ end)
+
+ it("returns empty string if working directory does not exist", function()
+ if helpers.iswin() then
+ return
+ end
+ command("cd "..directories.global)
+ command("call delete('../"..directories.global.."', 'd')")
+ eq("", helpers.eval("getcwd()"))
+ end)
+end)
+
+
diff --git a/test/functional/ex_cmds/cmd_map_spec.lua b/test/functional/ex_cmds/cmd_map_spec.lua
new file mode 100644
index 0000000000..0b2190bbcf
--- /dev/null
+++ b/test/functional/ex_cmds/cmd_map_spec.lua
@@ -0,0 +1,844 @@
+local helpers = require('test.functional.helpers')(after_each)
+local clear = helpers.clear
+local feed_command = helpers.feed_command
+local feed = helpers.feed
+local eq = helpers.eq
+local expect = helpers.expect
+local eval = helpers.eval
+local funcs = helpers.funcs
+local insert = helpers.insert
+local exc_exec = helpers.exc_exec
+local source = helpers.source
+local Screen = require('test.functional.ui.screen')
+
+describe('mappings with <Cmd>', function()
+ local screen
+ local function cmdmap(lhs, rhs)
+ feed_command('noremap '..lhs..' <Cmd>'..rhs..'<cr>')
+ feed_command('noremap! '..lhs..' <Cmd>'..rhs..'<cr>')
+ end
+
+ before_each(function()
+ clear()
+ screen = Screen.new(65, 8)
+ screen:set_default_attr_ids({
+ [1] = {bold = true, foreground = Screen.colors.Blue1},
+ [2] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
+ [3] = {bold = true, foreground = Screen.colors.SeaGreen4},
+ [4] = {bold = true},
+ [5] = {background = Screen.colors.LightGrey},
+ [6] = {foreground = Screen.colors.Blue1},
+ [7] = {bold = true, reverse = true},
+ [8] = {background = Screen.colors.WebGray},
+ [9] = {background = Screen.colors.LightMagenta},
+ [10] = {foreground = Screen.colors.Red},
+ })
+ screen:attach()
+
+ cmdmap('<F3>', 'let m = mode(1)')
+ cmdmap('<F4>', 'normal! ww')
+ cmdmap('<F5>', 'normal! "ay')
+ cmdmap('<F6>', 'throw "very error"')
+ feed_command([[
+ function! TextObj()
+ if mode() !=# "v"
+ normal! v
+ end
+ call cursor(1,3)
+ normal! o
+ call cursor(2,4)
+ endfunction]])
+ cmdmap('<F7>', 'call TextObj()')
+ insert([[
+ some short lines
+ of test text]])
+ feed('gg')
+ cmdmap('<F8>', 'startinsert')
+ cmdmap('<F9>', 'stopinsert')
+ feed_command("abbr foo <Cmd>let g:y = 17<cr>bar")
+ end)
+
+ it('can be displayed', function()
+ feed_command('map <F3>')
+ screen:expect([[
+ ^some short lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {6:<F3>} {6:*} {6:<Cmd>}let m = mode(1){6:<CR>} |
+ ]])
+ end)
+
+ it('handles invalid mappings', function()
+ feed_command('let x = 0')
+ feed_command('noremap <F3> <Cmd><Cmd>let x = 1<cr>')
+ feed('<F3>')
+ screen:expect([[
+ ^some short lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:E5521: <Cmd> mapping must end with <CR> before second <Cmd>} |
+ ]])
+
+ feed_command('noremap <F3> <Cmd><F3>let x = 2<cr>')
+ feed('<F3>')
+ screen:expect([[
+ ^some short lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:E5522: <Cmd> mapping must not include <F3> key} |
+ ]])
+
+ feed_command('noremap <F3> <Cmd>let x = 3')
+ feed('<F3>')
+ screen:expect([[
+ ^some short lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:E5520: <Cmd> mapping must end with <CR>} |
+ ]])
+ eq(0, eval('x'))
+ end)
+
+ it('works in various modes and sees correct `mode()` value', function()
+ -- normal mode
+ feed('<F3>')
+ eq('n', eval('m'))
+
+ -- visual mode
+ feed('v<F3>')
+ eq('v', eval('m'))
+ -- didn't leave visual mode
+ eq('v', eval('mode(1)'))
+ feed('<esc>')
+ eq('n', eval('mode(1)'))
+
+ -- visual mapping in select mode
+ feed('gh<F3>')
+ eq('v', eval('m'))
+ -- didn't leave select mode
+ eq('s', eval('mode(1)'))
+ feed('<esc>')
+ eq('n', eval('mode(1)'))
+
+ -- select mode mapping
+ feed_command('snoremap <F3> <Cmd>let m = mode(1)<cr>')
+ feed('gh<F3>')
+ eq('s', eval('m'))
+ -- didn't leave select mode
+ eq('s', eval('mode(1)'))
+ feed('<esc>')
+ eq('n', eval('mode(1)'))
+
+ -- operator-pending mode
+ feed("d<F3>")
+ eq('no', eval('m'))
+ -- did leave operator-pending mode
+ eq('n', eval('mode(1)'))
+
+ --insert mode
+ feed('i<F3>')
+ eq('i', eval('m'))
+ eq('i', eval('mode(1)'))
+
+ -- replace mode
+ feed("<Ins><F3>")
+ eq('R', eval('m'))
+ eq('R', eval('mode(1)'))
+ feed('<esc>')
+ eq('n', eval('mode(1)'))
+
+ -- virtual replace mode
+ feed("gR<F3>")
+ eq('Rv', eval('m'))
+ eq('Rv', eval('mode(1)'))
+ feed('<esc>')
+ eq('n', eval('mode(1)'))
+
+ -- langmap works, but is not distinguished in mode(1)
+ feed(":set iminsert=1<cr>i<F3>")
+ eq('i', eval('m'))
+ eq('i', eval('mode(1)'))
+ feed('<esc>')
+ eq('n', eval('mode(1)'))
+
+ feed(':<F3>')
+ eq('c', eval('m'))
+ eq('c', eval('mode(1)'))
+ feed('<esc>')
+ eq('n', eval('mode(1)'))
+
+ -- terminal mode
+ feed_command('tnoremap <F3> <Cmd>let m = mode(1)<cr>')
+ feed_command('split | terminal')
+ feed('i')
+ eq('t', eval('mode(1)'))
+ feed('<F3>')
+ eq('t', eval('m'))
+ eq('t', eval('mode(1)'))
+ end)
+
+ it('works in normal mode', function()
+ cmdmap('<F2>', 'let s = [mode(1), v:count, v:register]')
+
+ -- check v:count and v:register works
+ feed('<F2>')
+ eq({'n', 0, '"'}, eval('s'))
+ feed('7<F2>')
+ eq({'n', 7, '"'}, eval('s'))
+ feed('"e<F2>')
+ eq({'n', 0, 'e'}, eval('s'))
+ feed('5"k<F2>')
+ eq({'n', 5, 'k'}, eval('s'))
+ feed('"+2<F2>')
+ eq({'n', 2, '+'}, eval('s'))
+
+ -- text object enters visual mode
+ feed('<F7>')
+ screen:expect([[
+ so{5:me short lines} |
+ {5:of }^test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4:-- VISUAL --} |
+ ]])
+ feed('<esc>')
+
+ -- startinsert
+ feed('<F8>')
+ eq('i', eval('mode(1)'))
+ feed('<esc>')
+
+ eq('n', eval('mode(1)'))
+ cmdmap(',a', 'call feedkeys("aalpha") \\| let g:a = getline(2)')
+ cmdmap(',b', 'call feedkeys("abeta", "x") \\| let g:b = getline(2)')
+
+ feed(',a<F3>')
+ screen:expect([[
+ some short lines |
+ of alpha^test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4:-- INSERT --} |
+ ]])
+ -- feedkeys were not executed immediately
+ eq({'n', 'of test text'}, eval('[m,a]'))
+ eq('i', eval('mode(1)'))
+ feed('<esc>')
+
+ feed(',b<F3>')
+ screen:expect([[
+ some short lines |
+ of alphabet^atest text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+ -- feedkeys(..., 'x') was executed immediately, but insert mode gets aborted
+ eq({'n', 'of alphabetatest text'}, eval('[m,b]'))
+ eq('n', eval('mode(1)'))
+ end)
+
+ it('works in :normal command', function()
+ feed_command('noremap ,x <Cmd>call append(1, "xx")\\| call append(1, "aa")<cr>')
+ feed_command('noremap ,f <Cmd>nosuchcommand<cr>')
+ feed_command('noremap ,e <Cmd>throw "very error"\\| call append(1, "yy")<cr>')
+ feed_command('noremap ,m <Cmd>echoerr "The message."\\| call append(1, "zz")<cr>')
+ feed_command('noremap ,w <Cmd>for i in range(5)\\|if i==1\\|echoerr "Err"\\|endif\\|call append(1, i)\\|endfor<cr>')
+
+ feed(":normal ,x<cr>")
+ screen:expect([[
+ ^some short lines |
+ aa |
+ xx |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ :normal ,x |
+ ]])
+
+ eq('Vim:E492: Not an editor command: nosuchcommand', exc_exec("normal ,f"))
+ eq('very error', exc_exec("normal ,e"))
+ eq('Vim(echoerr):The message.', exc_exec("normal ,m"))
+ feed('w')
+ screen:expect([[
+ some ^short lines |
+ aa |
+ xx |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ :normal ,x |
+ ]])
+
+ feed_command(':%d')
+ eq('Vim(echoerr):Err', exc_exec("normal ,w"))
+ screen:expect([[
+ ^ |
+ 0 |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ --No lines in buffer-- |
+ ]])
+
+ feed_command(':%d')
+ feed_command(':normal ,w')
+ screen:expect([[
+ ^ |
+ 4 |
+ 3 |
+ 2 |
+ 1 |
+ 0 |
+ {1:~ }|
+ {2:Err} |
+ ]])
+ end)
+
+ it('works in visual mode', function()
+ -- can extend visual mode
+ feed('v<F4>')
+ screen:expect([[
+ {5:some short }^lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4:-- VISUAL --} |
+ ]])
+ eq('v', funcs.mode(1))
+
+ -- can invoke operator, ending visual mode
+ feed('<F5>')
+ eq('n', funcs.mode(1))
+ eq({'some short l'}, funcs.getreg('a',1,1))
+
+ -- error doesn't interrupt visual mode
+ feed('ggvw<F6>')
+ screen:expect([[
+ {5:some }short lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {7: }|
+ {2:Error detected while processing :} |
+ {2:E605: Exception not caught: very error} |
+ {3:Press ENTER or type command to continue}^ |
+ ]])
+ feed('<cr>')
+ eq('E605: Exception not caught: very error', eval('v:errmsg'))
+ -- still in visual mode, <cr> was consumed by the error prompt
+ screen:expect([[
+ {5:some }^short lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4:-- VISUAL --} |
+ ]])
+ eq('v', funcs.mode(1))
+ feed('<F7>')
+ screen:expect([[
+ so{5:me short lines} |
+ {5:of }^test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4:-- VISUAL --} |
+ ]])
+ eq('v', funcs.mode(1))
+
+ -- startinsert gives "-- (insert) VISUAL --" mode
+ feed('<F8>')
+ screen:expect([[
+ so{5:me short lines} |
+ {5:of }^test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4:-- (insert) VISUAL --} |
+ ]])
+ eq('v', eval('mode(1)'))
+ feed('<esc>')
+ eq('i', eval('mode(1)'))
+ end)
+
+ it('works in select mode', function()
+ feed_command('snoremap <F1> <cmd>throw "very error"<cr>')
+ feed_command('snoremap <F2> <cmd>normal! <c-g>"by<cr>')
+ -- can extend select mode
+ feed('gh<F4>')
+ screen:expect([[
+ {5:some short }^lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4:-- SELECT --} |
+ ]])
+ eq('s', funcs.mode(1))
+
+ -- visual mapping in select mode restart selct mode after operator
+ feed('<F5>')
+ eq('s', funcs.mode(1))
+ eq({'some short l'}, funcs.getreg('a',1,1))
+
+ -- select mode mapping works, and does not restart select mode
+ feed('<F2>')
+ eq('n', funcs.mode(1))
+ eq({'some short l'}, funcs.getreg('b',1,1))
+
+ -- error doesn't interrupt temporary visual mode
+ feed('<esc>ggvw<c-g><F6>')
+ screen:expect([[
+ {5:some }short lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {7: }|
+ {2:Error detected while processing :} |
+ {2:E605: Exception not caught: very error} |
+ {3:Press ENTER or type command to continue}^ |
+ ]])
+ feed('<cr>')
+ eq('E605: Exception not caught: very error', eval('v:errmsg'))
+ -- still in visual mode, <cr> was consumed by the error prompt
+ screen:expect([[
+ {5:some }^short lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4:-- VISUAL --} |
+ ]])
+ -- quirk: restoration of select mode is not performed
+ eq('v', funcs.mode(1))
+
+ -- error doesn't interrupt select mode
+ feed('<esc>ggvw<c-g><F1>')
+ screen:expect([[
+ {5:some }short lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {7: }|
+ {2:Error detected while processing :} |
+ {2:E605: Exception not caught: very error} |
+ {3:Press ENTER or type command to continue}^ |
+ ]])
+ feed('<cr>')
+ eq('E605: Exception not caught: very error', eval('v:errmsg'))
+ -- still in select mode, <cr> was consumed by the error prompt
+ screen:expect([[
+ {5:some }^short lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4:-- SELECT --} |
+ ]])
+ -- quirk: restoration of select mode is not performed
+ eq('s', funcs.mode(1))
+
+ feed('<F7>')
+ screen:expect([[
+ so{5:me short lines} |
+ {5:of }^test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4:-- SELECT --} |
+ ]])
+ eq('s', funcs.mode(1))
+
+ -- startinsert gives "-- SELECT (insert) --" mode
+ feed('<F8>')
+ screen:expect([[
+ so{5:me short lines} |
+ {5:of }^test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4:-- (insert) SELECT --} |
+ ]])
+ eq('s', eval('mode(1)'))
+ feed('<esc>')
+ eq('i', eval('mode(1)'))
+ end)
+
+
+ it('works in operator-pending mode', function()
+ feed('d<F4>')
+ expect([[
+ lines
+ of test text]])
+ eq({'some short '}, funcs.getreg('"',1,1))
+ feed('.')
+ expect([[
+ test text]])
+ eq({'lines', 'of '}, funcs.getreg('"',1,1))
+ feed('uu')
+ expect([[
+ some short lines
+ of test text]])
+
+ -- error aborts operator-pending, operator not performed
+ feed('d<F6>')
+ screen:expect([[
+ some short lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {7: }|
+ {2:Error detected while processing :} |
+ {2:E605: Exception not caught: very error} |
+ {3:Press ENTER or type command to continue}^ |
+ ]])
+ feed('<cr>')
+ eq('E605: Exception not caught: very error', eval('v:errmsg'))
+ expect([[
+ some short lines
+ of test text]])
+
+ feed('"bd<F7>')
+ expect([[
+ soest text]])
+ eq(funcs.getreg('b',1,1), {'me short lines', 'of t'})
+
+ -- startinsert aborts operator
+ feed('d<F8>')
+ eq('i', eval('mode(1)'))
+ expect([[
+ soest text]])
+ end)
+
+ it('works in insert mode', function()
+
+ -- works the same as <c-o>w<c-o>w
+ feed('iindeed <F4>little ')
+ screen:expect([[
+ indeed some short little ^lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4:-- INSERT --} |
+ ]])
+
+ feed('<F6>')
+ screen:expect([[
+ indeed some short little lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {7: }|
+ {2:Error detected while processing :} |
+ {2:E605: Exception not caught: very error} |
+ {3:Press ENTER or type command to continue}^ |
+ ]])
+
+
+ feed('<cr>')
+ eq('E605: Exception not caught: very error', eval('v:errmsg'))
+ -- still in insert
+ screen:expect([[
+ indeed some short little ^lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4:-- INSERT --} |
+ ]])
+ eq('i', eval('mode(1)'))
+
+ -- When entering visual mode from InsertEnter autocmd, an async event, or
+ -- a <cmd> mapping, vim ends up in undocumented "INSERT VISUAL" mode. If a
+ -- vim patch decides to disable this mode, this test is expected to fail.
+ feed('<F7>stuff ')
+ screen:expect([[
+ in{5:deed some short little lines} |
+ {5:of stuff }^test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4:-- INSERT VISUAL --} |
+ ]])
+ expect([[
+ indeed some short little lines
+ of stuff test text]])
+
+ feed('<F5>')
+ eq(funcs.getreg('a',1,1), {'deed some short little lines', 'of stuff t'})
+
+ -- still in insert
+ screen:expect([[
+ in^deed some short little lines |
+ of stuff test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4:-- INSERT --} |
+ ]])
+ eq('i', eval('mode(1)'))
+
+ -- also works as part of abbreviation
+ feed('<space>foo ')
+ screen:expect([[
+ in bar ^deed some short little lines |
+ of stuff test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4:-- INSERT --} |
+ ]])
+ eq(17, eval('g:y'))
+
+ -- :startinsert does nothing
+ feed('<F8>')
+ eq('i', eval('mode(1)'))
+
+ -- :stopinsert works
+ feed('<F9>')
+ eq('n', eval('mode(1)'))
+ end)
+
+ it('works in insert completion (Ctrl-X) mode', function()
+ feed('os<c-x><c-n>')
+ screen:expect([[
+ some short lines |
+ some^ |
+ {8:some } |
+ {9:short }{1: }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4:-- Keyword Local completion (^N^P) }{3:match 1 of 2} |
+ ]])
+
+ feed('<f3>')
+ eq('ic', eval('m'))
+
+ -- ensure a redraw, this would have moved the cursor
+ -- instead if CTRL-X mode was left.
+ feed('<up>')
+ screen:expect([[
+ some short lines |
+ some^ |
+ {9:some } |
+ {9:short }{1: }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4:-- Keyword Local completion (^N^P) }{10:Back at original} |
+ ]])
+ end)
+
+ it('works in cmdline mode', function()
+ feed(':text<F3>')
+ eq('c', eval('m'))
+ -- didn't leave cmdline mode
+ eq('c', eval('mode(1)'))
+ feed('<cr>')
+ eq('n', eval('mode(1)'))
+ screen:expect([[
+ ^some short lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:E492: Not an editor command: text} |
+ ]])
+
+ feed(':echo 2<F6>')
+ screen:expect([[
+ some short lines |
+ of test text |
+ {1:~ }|
+ {7: }|
+ :echo 2 |
+ {2:Error detected while processing :} |
+ {2:E605: Exception not caught: very error} |
+ :echo 2^ |
+ ]])
+ eq('E605: Exception not caught: very error', eval('v:errmsg'))
+ -- didn't leave cmdline mode
+ eq('c', eval('mode(1)'))
+ feed('+2<cr>')
+ screen:expect([[
+ some short lines |
+ of test text |
+ {7: }|
+ :echo 2 |
+ {2:Error detected while processing :} |
+ {2:E605: Exception not caught: very error} |
+ 4 |
+ {3:Press ENTER or type command to continue}^ |
+ ]])
+ -- however, message scrolling may cause extra CR prompt
+ -- This is consistent with output from async events.
+ feed('<cr>')
+ screen:expect([[
+ ^some short lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+ eq('n', eval('mode(1)'))
+
+ feed(':let g:x = 3<F4>')
+ screen:expect([[
+ some short lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ :let g:x = 3^ |
+ ]])
+ feed('+2<cr>')
+ -- cursor was moved in the background
+ screen:expect([[
+ some short ^lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ :let g:x = 3+2 |
+ ]])
+ eq(5, eval('g:x'))
+
+ feed(':let g:y = 7<F8>')
+ screen:expect([[
+ some short lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ :let g:y = 7^ |
+ ]])
+ eq('c', eval('mode(1)'))
+ feed('+2<cr>')
+ -- startinsert takes effect after leaving cmdline mode
+ screen:expect([[
+ some short ^lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4:-- INSERT --} |
+ ]])
+ eq('i', eval('mode(1)'))
+ eq(9, eval('g:y'))
+
+ end)
+
+ it("doesn't crash when invoking cmdline mode recursively #8859", function()
+ cmdmap('<F2>', 'norm! :foo')
+ feed(':bar')
+ screen:expect([[
+ some short lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ :bar^ |
+ ]])
+
+ feed('<f2>x')
+ screen:expect([[
+ some short lines |
+ of test text |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ :barx^ |
+ ]])
+ end)
+
+ it("works with <SID> mappings", function()
+ source([[
+ map <f2> <Cmd>call <SID>do_it()<Cr>
+ function! s:do_it()
+ let g:x = 10
+ endfunction
+ ]])
+ feed('<f2>')
+ eq('', eval('v:errmsg'))
+ eq(10, eval('g:x'))
+ end)
+end)
+
diff --git a/test/functional/ex_cmds/ctrl_c_spec.lua b/test/functional/ex_cmds/ctrl_c_spec.lua
new file mode 100644
index 0000000000..4c5383b712
--- /dev/null
+++ b/test/functional/ex_cmds/ctrl_c_spec.lua
@@ -0,0 +1,60 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+local clear, feed, source = helpers.clear, helpers.feed, helpers.source
+local command = helpers.command
+
+describe("CTRL-C (mapped)", function()
+ before_each(function()
+ clear()
+ end)
+
+ it("interrupts :global", function()
+ -- Crashes luajit.
+ if helpers.skip_fragile(pending,
+ os.getenv("TRAVIS") or os.getenv("APPVEYOR")) then
+ return
+ end
+
+ source([[
+ set nomore nohlsearch undolevels=-1
+ nnoremap <C-C> <NOP>
+ ]])
+
+ command("silent edit! test/functional/fixtures/bigfile.txt")
+ local screen = Screen.new(52, 6)
+ screen:attach()
+ screen:set_default_attr_ids({
+ [0] = {foreground = Screen.colors.White,
+ background = Screen.colors.Red},
+ [1] = {bold = true,
+ foreground = Screen.colors.SeaGreen}
+ })
+
+ screen:expect([[
+ ^0000;<control>;Cc;0;BN;;;;;N;NULL;;;; |
+ 0001;<control>;Cc;0;BN;;;;;N;START OF HEADING;;;; |
+ 0002;<control>;Cc;0;BN;;;;;N;START OF TEXT;;;; |
+ 0003;<control>;Cc;0;BN;;;;;N;END OF TEXT;;;; |
+ 0004;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION;;;;|
+ |
+ ]])
+
+ local function test_ctrl_c(ms)
+ feed(":global/^/p<CR>")
+ screen:sleep(ms)
+ feed("<C-C>")
+ screen:expect{any="Interrupt"}
+ end
+
+ -- The test is time-sensitive. Try different sleep values.
+ local ms_values = {100, 1000, 10000}
+ for i, ms in ipairs(ms_values) do
+ if i < #ms_values then
+ local status, _ = pcall(test_ctrl_c, ms)
+ if status then break end
+ else -- Call the last attempt directly.
+ test_ctrl_c(ms)
+ end
+ end
+ end)
+end)
diff --git a/test/functional/ex_cmds/debug_spec.lua b/test/functional/ex_cmds/debug_spec.lua
new file mode 100644
index 0000000000..a4d381d3f1
--- /dev/null
+++ b/test/functional/ex_cmds/debug_spec.lua
@@ -0,0 +1,110 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+local feed = helpers.feed
+local clear = helpers.clear
+
+describe(':debug', function()
+ local screen
+ before_each(function()
+ clear()
+ screen = Screen.new(30, 14)
+ screen:set_default_attr_ids({
+ [1] = {bold = true, foreground = Screen.colors.Blue1},
+ [2] = {bold = true, reverse = true},
+ [3] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
+ [4] = {bold = true, foreground = Screen.colors.SeaGreen4},
+ })
+ screen:attach()
+ end)
+ it('scrolls messages correctly', function()
+ feed(':echoerr bork<cr>')
+ screen:expect([[
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2: }|
+ {3:E121: Undefined variable: bork}|
+ |
+ {4:Press ENTER or type command to}|
+ {4: continue}^ |
+ ]])
+
+ feed(':debug echo "aa"| echo "bb"<cr>')
+ screen:expect([[
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2: }|
+ {3:E121: Undefined variable: bork}|
+ |
+ {4:Press ENTER or type command to}|
+ Entering Debug mode. Type "co|
+ nt" to continue. |
+ cmd: echo "aa"| echo "bb" |
+ >^ |
+ ]])
+
+ feed('step<cr>')
+ screen:expect([[
+ |
+ {1:~ }|
+ {1:~ }|
+ {2: }|
+ {3:E121: Undefined variable: bork}|
+ |
+ {4:Press ENTER or type command to}|
+ Entering Debug mode. Type "co|
+ nt" to continue. |
+ cmd: echo "aa"| echo "bb" |
+ >step |
+ aa |
+ cmd: echo "bb" |
+ >^ |
+ ]])
+
+ feed('step<cr>')
+ screen:expect([[
+ {2: }|
+ {3:E121: Undefined variable: bork}|
+ |
+ {4:Press ENTER or type command to}|
+ Entering Debug mode. Type "co|
+ nt" to continue. |
+ cmd: echo "aa"| echo "bb" |
+ >step |
+ aa |
+ cmd: echo "bb" |
+ >step |
+ bb |
+ {4:Press ENTER or type command to}|
+ {4: continue}^ |
+ ]])
+
+ feed('<cr>')
+ screen:expect([[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+ end)
+end)
diff --git a/test/functional/dict_notifications_spec.lua b/test/functional/ex_cmds/dict_notifications_spec.lua
index dc87312911..3d550588e7 100644
--- a/test/functional/dict_notifications_spec.lua
+++ b/test/functional/ex_cmds/dict_notifications_spec.lua
@@ -1,13 +1,15 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, nvim, source = helpers.clear, helpers.nvim, helpers.source
-local eq, next_msg = helpers.eq, helpers.next_message
+local eq, next_msg = helpers.eq, helpers.next_msg
local exc_exec = helpers.exc_exec
+local command = helpers.command
+local eval = helpers.eval
describe('dictionary change notifications', function()
local channel
- setup(function()
+ before_each(function()
clear()
channel = nvim('get_api_info')[1]
nvim('set_var', 'channel', channel)
@@ -16,19 +18,15 @@ describe('dictionary change notifications', function()
-- the same set of tests are applied to top-level dictionaries(g:, b:, w: and
-- t:) and a dictionary variable, so we generate them in the following
-- function.
- local function gentests(dict_expr, dict_expr_suffix, dict_init)
- if not dict_expr_suffix then
- dict_expr_suffix = ''
- end
-
+ local function gentests(dict_expr, dict_init)
local function update(opval, key)
if not key then
key = 'watched'
end
if opval == '' then
- nvim('command', "unlet "..dict_expr..dict_expr_suffix..key)
+ command(('unlet %s[\'%s\']'):format(dict_expr, key))
else
- nvim('command', "let "..dict_expr..dict_expr_suffix..key.." "..opval)
+ command(('let %s[\'%s\'] %s'):format(dict_expr, key, opval))
end
end
@@ -46,9 +44,9 @@ describe('dictionary change notifications', function()
eq({'notification', 'values', {key, vals}}, next_msg())
end
- describe('watcher', function()
+ describe(dict_expr .. ' watcher', function()
if dict_init then
- setup(function()
+ before_each(function()
source(dict_init)
end)
end
@@ -56,7 +54,7 @@ describe('dictionary change notifications', function()
before_each(function()
source([[
function! g:Changed(dict, key, value)
- if a:dict != ]]..dict_expr..[[ |
+ if a:dict isnot ]]..dict_expr..[[ |
throw 'invalid dict'
endif
call rpcnotify(g:channel, 'values', a:key, a:value)
@@ -141,6 +139,32 @@ describe('dictionary change notifications', function()
]])
end)
+ it('is triggered for empty keys', function()
+ command([[
+ call dictwatcheradd(]]..dict_expr..[[, "", "g:Changed")
+ ]])
+ update('= 1', '')
+ verify_value({new = 1}, '')
+ update('= 2', '')
+ verify_value({old = 1, new = 2}, '')
+ command([[
+ call dictwatcherdel(]]..dict_expr..[[, "", "g:Changed")
+ ]])
+ end)
+
+ it('is triggered for empty keys when using catch-all *', function()
+ command([[
+ call dictwatcheradd(]]..dict_expr..[[, "*", "g:Changed")
+ ]])
+ update('= 1', '')
+ verify_value({new = 1}, '')
+ update('= 2', '')
+ verify_value({old = 1, new = 2}, '')
+ command([[
+ call dictwatcherdel(]]..dict_expr..[[, "*", "g:Changed")
+ ]])
+ end)
+
-- test a sequence of updates of different types to ensure proper memory
-- management(with ASAN)
local function test_updates(tests)
@@ -188,10 +212,10 @@ describe('dictionary change notifications', function()
gentests('b:')
gentests('w:')
gentests('t:')
- gentests('g:dict_var', '.', 'let g:dict_var = {}')
+ gentests('g:dict_var', 'let g:dict_var = {}')
describe('multiple watchers on the same dict/key', function()
- setup(function()
+ before_each(function()
source([[
function! g:Watcher1(dict, key, value)
call rpcnotify(g:channel, '1', a:key, a:value)
@@ -211,13 +235,37 @@ describe('dictionary change notifications', function()
end)
it('only removes watchers that fully match dict, key and callback', function()
+ nvim('command', 'let g:key = "value"')
+ eq({'notification', '1', {'key', {new = 'value'}}}, next_msg())
+ eq({'notification', '2', {'key', {new = 'value'}}}, next_msg())
nvim('command', 'call dictwatcherdel(g:, "key", "g:Watcher1")')
nvim('command', 'let g:key = "v2"')
eq({'notification', '2', {'key', {old = 'value', new = 'v2'}}}, next_msg())
end)
end)
+ it('errors out when adding to v:_null_dict', function()
+ command([[
+ function! g:Watcher1(dict, key, value)
+ call rpcnotify(g:channel, '1', a:key, a:value)
+ endfunction
+ ]])
+ eq('Vim(call):E46: Cannot change read-only variable "dictwatcheradd() argument"',
+ exc_exec('call dictwatcheradd(v:_null_dict, "x", "g:Watcher1")'))
+ end)
+
describe('errors', function()
+ before_each(function()
+ source([[
+ function! g:Watcher1(dict, key, value)
+ call rpcnotify(g:channel, '1', a:key, a:value)
+ endfunction
+ function! g:Watcher2(dict, key, value)
+ call rpcnotify(g:channel, '2', a:key, a:value)
+ endfunction
+ ]])
+ end)
+
-- WARNING: This suite depends on the above tests
it('fails to remove if no watcher with matching callback is found', function()
eq("Vim(call):Couldn't find a watcher matching key and callback",
@@ -229,29 +277,65 @@ describe('dictionary change notifications', function()
exc_exec('call dictwatcherdel(g:, "invalid_key", "g:Watcher2")'))
end)
- it("fails to add/remove if the callback doesn't exist", function()
- eq("Vim(call):Function g:InvalidCb doesn't exist",
- exc_exec('call dictwatcheradd(g:, "key", "g:InvalidCb")'))
- eq("Vim(call):Function g:InvalidCb doesn't exist",
- exc_exec('call dictwatcherdel(g:, "key", "g:InvalidCb")'))
+ it("does not fail to add/remove if the callback doesn't exist", function()
+ command('call dictwatcheradd(g:, "key", "g:InvalidCb")')
+ command('call dictwatcherdel(g:, "key", "g:InvalidCb")')
end)
- it('fails with empty keys', function()
- eq("Vim(call):E713: Cannot use empty key for Dictionary",
- exc_exec('call dictwatcheradd(g:, "", "g:Watcher1")'))
- eq("Vim(call):E713: Cannot use empty key for Dictionary",
- exc_exec('call dictwatcherdel(g:, "", "g:Watcher1")'))
+ it('fails to remove watcher from v:_null_dict', function()
+ eq("Vim(call):Couldn't find a watcher matching key and callback",
+ exc_exec('call dictwatcherdel(v:_null_dict, "x", "g:Watcher2")'))
end)
- it('fails to replace a watcher function', function()
+ --[[
+ [ it("fails to add/remove if the callback doesn't exist", function()
+ [ eq("Vim(call):Function g:InvalidCb doesn't exist",
+ [ exc_exec('call dictwatcheradd(g:, "key", "g:InvalidCb")'))
+ [ eq("Vim(call):Function g:InvalidCb doesn't exist",
+ [ exc_exec('call dictwatcherdel(g:, "key", "g:InvalidCb")'))
+ [ end)
+ ]]
+
+ it('does not fail to replace a watcher function', function()
source([[
+ let g:key = 'v2'
+ call dictwatcheradd(g:, "key", "g:Watcher2")
function! g:ReplaceWatcher2()
- function! g:Watcher2()
+ function! g:Watcher2(dict, key, value)
+ call rpcnotify(g:channel, '2b', a:key, a:value)
endfunction
endfunction
]])
- eq("Vim(function):E127: Cannot redefine function Watcher2: It is in use",
- exc_exec('call g:ReplaceWatcher2()'))
+ command('call g:ReplaceWatcher2()')
+ command('let g:key = "value"')
+ eq({'notification', '2b', {'key', {old = 'v2', new = 'value'}}}, next_msg())
+ end)
+
+ it('does not crash when freeing a watched dictionary', function()
+ source([[
+ function! Watcher(dict, key, value)
+ echo a:key string(a:value)
+ endfunction
+
+ function! MakeWatch()
+ let d = {'foo': 'bar'}
+ call dictwatcheradd(d, 'foo', function('Watcher'))
+ endfunction
+ ]])
+
+ command('call MakeWatch()')
+ eq(2, eval('1+1')) -- Still alive?
+ end)
+ end)
+
+ describe('with lambdas', function()
+ it('works correctly', function()
+ source([[
+ let d = {'foo': 'baz'}
+ call dictwatcheradd(d, 'foo', {dict, key, value -> rpcnotify(g:channel, '2', key, value)})
+ let d.foo = 'bar'
+ ]])
+ eq({'notification', '2', {'foo', {old = 'baz', new = 'bar'}}}, next_msg())
end)
end)
end)
diff --git a/test/functional/ex_cmds/digraphs_spec.lua b/test/functional/ex_cmds/digraphs_spec.lua
new file mode 100644
index 0000000000..37d3814136
--- /dev/null
+++ b/test/functional/ex_cmds/digraphs_spec.lua
@@ -0,0 +1,38 @@
+local helpers = require('test.functional.helpers')(after_each)
+local clear = helpers.clear
+local feed = helpers.feed
+local Screen = require('test.functional.ui.screen')
+
+describe(':digraphs', function()
+ local screen
+ before_each(function()
+ clear()
+ screen = Screen.new(65, 8)
+ screen:set_default_attr_ids({
+ [1] = {bold = true, foreground = Screen.colors.Blue1},
+ [2] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
+ [3] = {bold = true, foreground = Screen.colors.SeaGreen4},
+ [4] = {bold = true},
+ [5] = {background = Screen.colors.LightGrey},
+ [6] = {foreground = Screen.colors.Blue1},
+ [7] = {bold = true, reverse = true},
+ })
+ screen:attach()
+ end)
+
+ it('displays digraphs', function()
+ feed(':digraphs<CR>')
+ screen:expect([[
+ E` {6:รˆ} 200 E^ {6:รŠ} 202 E" {6:ร‹} 203 I` {6:รŒ} 204 I^ {6:รŽ} 206 |
+ I" {6:ร} 207 N~ {6:ร‘} 209 O` {6:ร’} 210 O^ {6:ร”} 212 O~ {6:ร•} 213 |
+ /\ {6:ร—} 215 U` {6:ร™} 217 U^ {6:ร›} 219 Ip {6:รž} 222 a` {6:ร } 224 |
+ a^ {6:รข} 226 a~ {6:รฃ} 227 a" {6:รค} 228 a@ {6:รฅ} 229 e` {6:รจ} 232 |
+ e^ {6:รช} 234 e" {6:รซ} 235 i` {6:รฌ} 236 i^ {6:รฎ} 238 n~ {6:รฑ} 241 |
+ o` {6:รฒ} 242 o^ {6:รด} 244 o~ {6:รต} 245 u` {6:รน} 249 u^ {6:รป} 251 |
+ y" {6:รฟ} 255 |
+ {3:Press ENTER or type command to continue}^ |
+ ]])
+ end)
+
+end)
+
diff --git a/test/functional/ex_cmds/drop_spec.lua b/test/functional/ex_cmds/drop_spec.lua
index 16b194dd7d..d6da0d8e88 100644
--- a/test/functional/ex_cmds/drop_spec.lua
+++ b/test/functional/ex_cmds/drop_spec.lua
@@ -1,6 +1,7 @@
local helpers = require('test.functional.helpers')(after_each)
+local command = helpers.command
local Screen = require('test.functional.ui.screen')
-local clear, feed, execute = helpers.clear, helpers.feed, helpers.execute
+local clear, feed, feed_command = helpers.clear, helpers.feed, helpers.feed_command
describe(":drop", function()
local screen
@@ -9,13 +10,13 @@ describe(":drop", function()
clear()
screen = Screen.new(35, 10)
screen:attach()
- screen:set_default_attr_ignore({{bold=true, foreground=Screen.colors.Blue}})
screen:set_default_attr_ids({
+ [0] = {bold=true, foreground=Screen.colors.Blue},
[1] = {bold = true, reverse = true},
[2] = {reverse = true},
[3] = {bold = true},
})
- execute("set laststatus=2")
+ command("set laststatus=2 shortmess-=F")
end)
after_each(function()
@@ -23,55 +24,55 @@ describe(":drop", function()
end)
it("works like :e when called with only one window open", function()
- execute("drop tmp1.vim")
+ feed_command("drop tmp1.vim")
screen:expect([[
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{1:tmp1.vim }|
"tmp1.vim" [New File] |
]])
end)
it("switches to an open window showing the buffer", function()
- execute("edit tmp1")
- execute("vsplit")
- execute("edit tmp2")
- execute("drop tmp1")
+ feed_command("edit tmp1")
+ feed_command("vsplit")
+ feed_command("edit tmp2")
+ feed_command("drop tmp1")
screen:expect([[
- {2:|}^ |
- ~ {2:|}~ |
- ~ {2:|}~ |
- ~ {2:|}~ |
- ~ {2:|}~ |
- ~ {2:|}~ |
- ~ {2:|}~ |
- ~ {2:|}~ |
+ {2:โ”‚}^ |
+ {0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }|
{2:tmp2 }{1:tmp1 }|
:drop tmp1 |
]])
end)
it("splits off a new window when a buffer can't be abandoned", function()
- execute("edit tmp1")
- execute("vsplit")
- execute("edit tmp2")
+ feed_command("edit tmp1")
+ feed_command("vsplit")
+ feed_command("edit tmp2")
feed("iABC<esc>")
- execute("drop tmp3")
+ feed_command("drop tmp3")
screen:expect([[
- ^ {2:|} |
- ~ {2:|}~ |
- ~ {2:|}~ |
- ~ {2:|}~ |
- {1:tmp3 }{2:|}~ |
- ABC {2:|}~ |
- ~ {2:|}~ |
- ~ {2:|}~ |
+ ^ {2:โ”‚} |
+ {0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }|
+ {1:tmp3 }{2:โ”‚}{0:~ }|
+ ABC {2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }|
{2:tmp2 [+] tmp1 }|
"tmp3" [New File] |
]])
diff --git a/test/functional/ex_cmds/echo_spec.lua b/test/functional/ex_cmds/echo_spec.lua
new file mode 100644
index 0000000000..10c7230896
--- /dev/null
+++ b/test/functional/ex_cmds/echo_spec.lua
@@ -0,0 +1,321 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local eq = helpers.eq
+local NIL = helpers.NIL
+local eval = helpers.eval
+local clear = helpers.clear
+local meths = helpers.meths
+local funcs = helpers.funcs
+local source = helpers.source
+local dedent = helpers.dedent
+local command = helpers.command
+local exc_exec = helpers.exc_exec
+local redir_exec = helpers.redir_exec
+
+describe(':echo', function()
+ before_each(function()
+ clear()
+ source([[
+ function String(s)
+ return execute('echo a:s')[1:]
+ endfunction
+ ]])
+ end)
+
+ describe('used to represent floating-point values', function()
+ it('dumps NaN values', function()
+ eq('str2float(\'nan\')', eval('String(str2float(\'nan\'))'))
+ end)
+
+ it('dumps infinite values', function()
+ eq('str2float(\'inf\')', eval('String(str2float(\'inf\'))'))
+ eq('-str2float(\'inf\')', eval('String(str2float(\'-inf\'))'))
+ end)
+
+ it('dumps regular values', function()
+ eq('1.5', funcs.String(1.5))
+ eq('1.56e-20', funcs.String(1.56000e-020))
+ eq('0.0', eval('String(0.0)'))
+ end)
+
+ it('dumps special v: values', function()
+ eq('v:true', eval('String(v:true)'))
+ eq('v:false', eval('String(v:false)'))
+ eq('v:null', eval('String(v:null)'))
+ eq('v:true', funcs.String(true))
+ eq('v:false', funcs.String(false))
+ eq('v:null', funcs.String(NIL))
+ end)
+
+ it('dumps values with at most six digits after the decimal point',
+ function()
+ eq('1.234568e-20', funcs.String(1.23456789123456789123456789e-020))
+ eq('1.234568', funcs.String(1.23456789123456789123456789))
+ end)
+
+ it('dumps values with at most seven digits before the decimal point',
+ function()
+ eq('1234567.891235', funcs.String(1234567.89123456789123456789))
+ eq('1.234568e7', funcs.String(12345678.9123456789123456789))
+ end)
+
+ it('dumps negative values', function()
+ eq('-1.5', funcs.String(-1.5))
+ eq('-1.56e-20', funcs.String(-1.56000e-020))
+ eq('-1.234568e-20', funcs.String(-1.23456789123456789123456789e-020))
+ eq('-1.234568', funcs.String(-1.23456789123456789123456789))
+ eq('-1234567.891235', funcs.String(-1234567.89123456789123456789))
+ eq('-1.234568e7', funcs.String(-12345678.9123456789123456789))
+ end)
+ end)
+
+ describe('used to represent numbers', function()
+ it('dumps regular values', function()
+ eq('0', funcs.String(0))
+ eq('-1', funcs.String(-1))
+ eq('1', funcs.String(1))
+ end)
+
+ it('dumps large values', function()
+ eq('2147483647', funcs.String(2^31-1))
+ eq('-2147483648', funcs.String(-2^31))
+ end)
+ end)
+
+ describe('used to represent strings', function()
+ it('dumps regular strings', function()
+ eq('test', funcs.String('test'))
+ end)
+
+ it('dumps empty strings', function()
+ eq('', funcs.String(''))
+ end)
+
+ it('dumps strings with \' inside', function()
+ eq('\'\'\'', funcs.String('\'\'\''))
+ eq('a\'b\'\'', funcs.String('a\'b\'\''))
+ eq('\'b\'\'d', funcs.String('\'b\'\'d'))
+ eq('a\'b\'c\'d', funcs.String('a\'b\'c\'d'))
+ end)
+
+ it('dumps NULL strings', function()
+ eq('', eval('String($XXX_UNEXISTENT_VAR_XXX)'))
+ end)
+
+ it('dumps NULL lists', function()
+ eq('[]', eval('String(v:_null_list)'))
+ end)
+
+ it('dumps NULL dictionaries', function()
+ eq('{}', eval('String(v:_null_dict)'))
+ end)
+ end)
+
+ describe('used to represent funcrefs', function()
+ before_each(function()
+ source([[
+ function Test1()
+ endfunction
+
+ function s:Test2() dict
+ endfunction
+
+ function g:Test3() dict
+ endfunction
+
+ let g:Test2_f = function('s:Test2')
+ ]])
+ end)
+
+ it('dumps references to built-in functions', function()
+ eq('function', eval('String(function("function"))'))
+ end)
+
+ it('dumps references to user functions', function()
+ eq('Test1', eval('String(function("Test1"))'))
+ eq('g:Test3', eval('String(function("g:Test3"))'))
+ end)
+
+ it('dumps references to script functions', function()
+ eq('<SNR>2_Test2', eval('String(Test2_f)'))
+ end)
+
+ it('dumps partials with self referencing a partial', function()
+ source([[
+ function TestDict() dict
+ endfunction
+ let d = {}
+ let TestDictRef = function('TestDict', d)
+ let d.tdr = TestDictRef
+ ]])
+ eq(dedent([[
+
+ function('TestDict', {'tdr': function('TestDict', {...@1})})
+ function('TestDict', {'tdr': function('TestDict', {...@1})})]]),
+ redir_exec('echo String(d.tdr)'))
+ end)
+
+ it('dumps automatically created partials', function()
+ eq('function(\'<SNR>2_Test2\', {\'f\': function(\'<SNR>2_Test2\')})',
+ eval('String({"f": Test2_f}.f)'))
+ eq('function(\'<SNR>2_Test2\', [1], {\'f\': function(\'<SNR>2_Test2\', [1])})',
+ eval('String({"f": function(Test2_f, [1])}.f)'))
+ end)
+
+ it('dumps manually created partials', function()
+ eq('function(\'Test3\', [1, 2], {})',
+ eval('String(function("Test3", [1, 2], {}))'))
+ eq('function(\'Test3\', {})',
+ eval('String(function("Test3", {}))'))
+ eq('function(\'Test3\', [1, 2])',
+ eval('String(function("Test3", [1, 2]))'))
+ end)
+
+ it('does not crash or halt when dumping partials with reference cycles in self',
+ function()
+ meths.set_var('d', {v=true})
+ eq(dedent([[
+
+ {'p': function('<SNR>2_Test2', {...@0}), 'f': function('<SNR>2_Test2'), 'v': v:true}
+ {'p': function('<SNR>2_Test2', {...@0}), 'f': function('<SNR>2_Test2'), 'v': v:true}]]),
+ redir_exec('echo String(extend(extend(g:d, {"f": g:Test2_f}), {"p": g:d.f}))'))
+ end)
+
+ it('does not show errors when dumping partials referencing the same dictionary',
+ function()
+ command('let d = {}')
+ -- Regression for โ€œeval/typval_encode: Dump empty dictionary before
+ -- checking for refcycleโ€, results in error.
+ eq('[function(\'tr\', {}), function(\'tr\', {})]', eval('String([function("tr", d), function("tr", d)])'))
+ -- Regression for โ€œeval: Work with reference cycles in partials (self)
+ -- properlyโ€, results in crash.
+ eval('extend(d, {"a": 1})')
+ eq('[function(\'tr\', {\'a\': 1}), function(\'tr\', {\'a\': 1})]', eval('String([function("tr", d), function("tr", d)])'))
+ end)
+
+ it('does not crash or halt when dumping partials with reference cycles in arguments',
+ function()
+ meths.set_var('l', {})
+ eval('add(l, l)')
+ -- Regression: the below line used to crash (add returns original list and
+ -- there was error in dumping partials). Tested explicitly in
+ -- test/unit/api/private_helpers_spec.lua.
+ eval('add(l, function("Test1", l))')
+ eq(dedent([=[
+
+ function('Test1', [[[...@2], function('Test1', [[...@2]])], function('Test1', [[[...@4], function('Test1', [[...@4]])]])])
+ function('Test1', [[[...@2], function('Test1', [[...@2]])], function('Test1', [[[...@4], function('Test1', [[...@4]])]])])]=]),
+ redir_exec('echo String(function("Test1", l))'))
+ end)
+
+ it('does not crash or halt when dumping partials with reference cycles in self and arguments',
+ function()
+ meths.set_var('d', {v=true})
+ meths.set_var('l', {})
+ eval('add(l, l)')
+ eval('add(l, function("Test1", l))')
+ eval('add(l, function("Test1", d))')
+ eq(dedent([=[
+
+ {'p': function('<SNR>2_Test2', [[[...@3], function('Test1', [[...@3]]), function('Test1', {...@0})], function('Test1', [[[...@5], function('Test1', [[...@5]]), function('Test1', {...@0})]]), function('Test1', {...@0})], {...@0}), 'f': function('<SNR>2_Test2'), 'v': v:true}
+ {'p': function('<SNR>2_Test2', [[[...@3], function('Test1', [[...@3]]), function('Test1', {...@0})], function('Test1', [[[...@5], function('Test1', [[...@5]]), function('Test1', {...@0})]]), function('Test1', {...@0})], {...@0}), 'f': function('<SNR>2_Test2'), 'v': v:true}]=]),
+ redir_exec('echo String(extend(extend(g:d, {"f": g:Test2_f}), {"p": function(g:d.f, l)}))'))
+ end)
+ end)
+
+ describe('used to represent lists', function()
+ it('dumps empty list', function()
+ eq('[]', funcs.String({}))
+ end)
+
+ it('dumps nested lists', function()
+ eq('[[[[[]]]]]', funcs.String({{{{{}}}}}))
+ end)
+
+ it('dumps nested non-empty lists', function()
+ eq('[1, [[3, [[5], 4]], 2]]', funcs.String({1, {{3, {{5}, 4}}, 2}}))
+ end)
+
+ it('does not error when dumping recursive lists', function()
+ meths.set_var('l', {})
+ eval('add(l, l)')
+ eq(0, exc_exec('echo String(l)'))
+ end)
+
+ it('dumps recursive lists without error', function()
+ meths.set_var('l', {})
+ eval('add(l, l)')
+ eq('\n[[...@0]]\n[[...@0]]', redir_exec('echo String(l)'))
+ eq('\n[[[...@1]]]\n[[[...@1]]]', redir_exec('echo String([l])'))
+ end)
+ end)
+
+ describe('used to represent dictionaries', function()
+ it('dumps empty dictionary', function()
+ eq('{}', eval('String({})'))
+ end)
+
+ it('dumps list with two same empty dictionaries, also in partials', function()
+ command('let d = {}')
+ eq('[{}, {}]', eval('String([d, d])'))
+ eq('[function(\'tr\', {}), {}]', eval('String([function("tr", d), d])'))
+ eq('[{}, function(\'tr\', {})]', eval('String([d, function("tr", d)])'))
+ end)
+
+ it('dumps non-empty dictionary', function()
+ eq('{\'t\'\'est\': 1}', funcs.String({['t\'est']=1}))
+ end)
+
+ it('does not error when dumping recursive dictionaries', function()
+ meths.set_var('d', {d=1})
+ eval('extend(d, {"d": d})')
+ eq(0, exc_exec('echo String(d)'))
+ end)
+
+ it('dumps recursive dictionaries without the error', function()
+ meths.set_var('d', {d=1})
+ eval('extend(d, {"d": d})')
+ eq('\n{\'d\': {...@0}}\n{\'d\': {...@0}}',
+ redir_exec('echo String(d)'))
+ eq('\n{\'out\': {\'d\': {...@1}}}\n{\'out\': {\'d\': {...@1}}}',
+ redir_exec('echo String({"out": d})'))
+ end)
+ end)
+
+ describe('used to represent special values', function()
+ local function chr(n)
+ return ('%c'):format(n)
+ end
+ local function ctrl(c)
+ return ('%c'):format(c:upper():byte() - 0x40)
+ end
+ it('displays hex as hex', function()
+ -- Regression: due to missing (uint8_t) cast \x80 was represented as
+ -- ~@<80>.
+ eq('<80>', funcs.String(chr(0x80)))
+ eq('<81>', funcs.String(chr(0x81)))
+ eq('<8e>', funcs.String(chr(0x8e)))
+ eq('<c2>', funcs.String(('ยซ'):sub(1, 1)))
+ eq('ยซ', funcs.String(('ยซ'):sub(1, 2)))
+ end)
+ it('displays ASCII control characters using ^X notation', function()
+ eq('^C', funcs.String(ctrl('c')))
+ eq('^A', funcs.String(ctrl('a')))
+ eq('^F', funcs.String(ctrl('f')))
+ end)
+ it('prints CR, NL and tab as-is', function()
+ eq('\n', funcs.String('\n'))
+ eq('\r', funcs.String('\r'))
+ eq('\t', funcs.String('\t'))
+ end)
+ it('prints non-printable UTF-8 in <> notation', function()
+ -- SINGLE SHIFT TWO, unicode control
+ eq('<8e>', funcs.String(funcs.nr2char(0x8E)))
+ -- Surrogate pair: U+1F0A0 PLAYING CARD BACK is represented in UTF-16 as
+ -- 0xD83C 0xDCA0. This is not valid in UTF-8.
+ eq('<d83c>', funcs.String(funcs.nr2char(0xD83C)))
+ eq('<dca0>', funcs.String(funcs.nr2char(0xDCA0)))
+ eq('<d83c><dca0>', funcs.String(funcs.nr2char(0xD83C) .. funcs.nr2char(0xDCA0)))
+ end)
+ end)
+end)
diff --git a/test/functional/ex_cmds/edit_spec.lua b/test/functional/ex_cmds/edit_spec.lua
new file mode 100644
index 0000000000..6ed500a293
--- /dev/null
+++ b/test/functional/ex_cmds/edit_spec.lua
@@ -0,0 +1,27 @@
+local helpers = require("test.functional.helpers")(after_each)
+local eq, command, funcs = helpers.eq, helpers.command, helpers.funcs
+local ok = helpers.ok
+local clear = helpers.clear
+local feed = helpers.feed
+
+describe(":edit", function()
+ before_each(function()
+ clear()
+ end)
+
+ it("without arguments does not restart :terminal buffer", function()
+ command("terminal")
+ feed([[<C-\><C-N>]])
+ local bufname_before = funcs.bufname("%")
+ local bufnr_before = funcs.bufnr("%")
+ helpers.ok(nil ~= string.find(bufname_before, "^term://")) -- sanity
+
+ command("edit")
+
+ local bufname_after = funcs.bufname("%")
+ local bufnr_after = funcs.bufnr("%")
+ ok(funcs.line('$') > 1)
+ eq(bufname_before, bufname_after)
+ eq(bufnr_before, bufnr_after)
+ end)
+end)
diff --git a/test/functional/ex_cmds/encoding_spec.lua b/test/functional/ex_cmds/encoding_spec.lua
index e2b3e7e31d..7f2bd78a47 100644
--- a/test/functional/ex_cmds/encoding_spec.lua
+++ b/test/functional/ex_cmds/encoding_spec.lua
@@ -1,5 +1,5 @@
local helpers = require('test.functional.helpers')(after_each)
-local clear, execute, feed = helpers.clear, helpers.execute, helpers.feed
+local clear, feed_command, feed = helpers.clear, helpers.feed_command, helpers.feed
local eq, neq, eval = helpers.eq, helpers.neq, helpers.eval
describe('&encoding', function()
@@ -12,30 +12,29 @@ describe('&encoding', function()
end)
it('cannot be changed after setup', function()
- execute('set encoding=latin1')
+ feed_command('set encoding=latin1')
-- error message expected
feed('<cr>')
- neq(nil, string.find(eval('v:errmsg'), '^E905:'))
+ neq(nil, string.find(eval('v:errmsg'), '^E519:'))
eq('utf-8', eval('&encoding'))
-- check nvim is still in utf-8 mode
eq(3, eval('strwidth("Bรคr")'))
end)
- it('can be changed before startup', function()
+ it('cannot be changed before startup', function()
clear('--cmd', 'set enc=latin1')
- execute('set encoding=utf-8')
-- error message expected
feed('<cr>')
- eq('latin1', eval('&encoding'))
- eq(4, eval('strwidth("Bรคr")'))
+ neq(nil, string.find(eval('v:errmsg'), '^E519:'))
+ eq('utf-8', eval('&encoding'))
+ eq(3, eval('strwidth("Bรคr")'))
end)
- it('is not changed by `set all&`', function()
- -- we need to set &encoding to something non-default. Use 'latin1'
- clear('--cmd', 'set enc=latin1')
- execute('set all&')
- eq('latin1', eval('&encoding'))
- eq(4, eval('strwidth("Bรคr")'))
- end)
+ it('can be set to utf-8 without error', function()
+ feed_command('set encoding=utf-8')
+ eq("", eval('v:errmsg'))
+ clear('--cmd', 'set enc=utf-8')
+ eq("", eval('v:errmsg'))
+ end)
end)
diff --git a/test/functional/ex_cmds/file_spec.lua b/test/functional/ex_cmds/file_spec.lua
new file mode 100644
index 0000000000..771c283134
--- /dev/null
+++ b/test/functional/ex_cmds/file_spec.lua
@@ -0,0 +1,35 @@
+local helpers = require('test.functional.helpers')(after_each)
+local lfs = require('lfs')
+local clear = helpers.clear
+local command = helpers.command
+local eq = helpers.eq
+local funcs = helpers.funcs
+local rmdir = helpers.rmdir
+
+describe(':file', function()
+ local swapdir = lfs.currentdir()..'/Xtest-file_spec'
+ before_each(function()
+ clear()
+ rmdir(swapdir)
+ lfs.mkdir(swapdir)
+ end)
+ after_each(function()
+ command('%bwipeout!')
+ rmdir(swapdir)
+ end)
+
+ it("rename does not lose swapfile #6487", function()
+ local testfile = 'test-file_spec'
+ local testfile_renamed = testfile..'-renamed'
+ -- Note: `set swapfile` *must* go after `set directory`: otherwise it may
+ -- attempt to create a swapfile in different directory.
+ command('set directory^='..swapdir..'//')
+ command('set swapfile fileformat=unix undolevels=-1')
+
+ command('edit! '..testfile)
+ -- Before #6487 this gave "E301: Oops, lost the swap file !!!" on Windows.
+ command('file '..testfile_renamed)
+ eq(testfile_renamed..'.swp',
+ string.match(funcs.execute('swapname'), '[^%%]+$'))
+ end)
+end)
diff --git a/test/functional/ex_cmds/grep_spec.lua b/test/functional/ex_cmds/grep_spec.lua
index 13f88b7e03..43ef1bd424 100644
--- a/test/functional/ex_cmds/grep_spec.lua
+++ b/test/functional/ex_cmds/grep_spec.lua
@@ -1,6 +1,6 @@
local helpers = require('test.functional.helpers')(after_each)
-local clear, execute, feed, ok, eval =
- helpers.clear, helpers.execute, helpers.feed, helpers.ok, helpers.eval
+local clear, feed_command, feed, ok, eval =
+ helpers.clear, helpers.feed_command, helpers.feed, helpers.ok, helpers.eval
describe(':grep', function()
before_each(clear)
@@ -11,10 +11,10 @@ describe(':grep', function()
return
end
- execute([[set grepprg=grep\ -r]])
+ feed_command([[set grepprg=grep\ -r]])
-- Change to test directory so that the test does not run too long.
- execute('cd test')
- execute('grep a **/*')
+ feed_command('cd test')
+ feed_command('grep a **/*')
feed('<cr>') -- Press ENTER
ok(eval('len(getqflist())') > 9000) -- IT'S OVER 9000!!1
end)
diff --git a/test/functional/ex_cmds/highlight_spec.lua b/test/functional/ex_cmds/highlight_spec.lua
new file mode 100644
index 0000000000..25968b8204
--- /dev/null
+++ b/test/functional/ex_cmds/highlight_spec.lua
@@ -0,0 +1,43 @@
+local Screen = require('test.functional.ui.screen')
+local helpers = require("test.functional.helpers")(after_each)
+local eq, command = helpers.eq, helpers.command
+local clear = helpers.clear
+local eval, exc_exec = helpers.eval, helpers.exc_exec
+
+describe(':highlight', function()
+ local screen
+
+ before_each(function()
+ clear()
+ screen = Screen.new()
+ screen:attach()
+ end)
+
+ after_each(function()
+ screen:detach()
+ end)
+
+ it('invalid color name', function()
+ eq('Vim(highlight):E421: Color name or number not recognized: ctermfg=#181818',
+ exc_exec("highlight normal ctermfg=#181818"))
+ eq('Vim(highlight):E421: Color name or number not recognized: ctermbg=#181818',
+ exc_exec("highlight normal ctermbg=#181818"))
+ end)
+
+ it('invalid group name', function()
+ eq('Vim(highlight):E411: highlight group not found: foo',
+ exc_exec("highlight foo"))
+ end)
+
+ it('"Normal" foreground with red', function()
+ eq('', eval('synIDattr(hlID("Normal"), "fg", "cterm")'))
+ command('highlight normal ctermfg=red')
+ eq('9', eval('synIDattr(hlID("Normal"), "fg", "cterm")'))
+ end)
+
+ it('"Normal" background with red', function()
+ eq('', eval('synIDattr(hlID("Normal"), "bg", "cterm")'))
+ command('highlight normal ctermbg=red')
+ eq('9', eval('synIDattr(hlID("Normal"), "bg", "cterm")'))
+ end)
+end)
diff --git a/test/functional/ex_cmds/map_spec.lua b/test/functional/ex_cmds/map_spec.lua
new file mode 100644
index 0000000000..84d5bc2335
--- /dev/null
+++ b/test/functional/ex_cmds/map_spec.lua
@@ -0,0 +1,28 @@
+local helpers = require("test.functional.helpers")(after_each)
+
+local eq = helpers.eq
+local feed = helpers.feed
+local meths = helpers.meths
+local clear = helpers.clear
+local command = helpers.command
+local expect = helpers.expect
+
+describe(':*map', function()
+ before_each(clear)
+
+ it('are not affected by &isident', function()
+ meths.set_var('counter', 0)
+ command('nnoremap <C-x> :let counter+=1<CR>')
+ meths.set_option('isident', ('%u'):format(('>'):byte()))
+ command('nnoremap <C-y> :let counter+=1<CR>')
+ -- &isident used to disable keycode parsing here as well
+ feed('\24\25<C-x><C-y>')
+ eq(4, meths.get_var('counter'))
+ end)
+
+ it(':imap <M-">', function()
+ command('imap <M-"> foo')
+ feed('i-<M-">-')
+ expect('-foo-')
+ end)
+end)
diff --git a/test/functional/ex_cmds/menu_spec.lua b/test/functional/ex_cmds/menu_spec.lua
index 52df9e1592..2c0535acda 100644
--- a/test/functional/ex_cmds/menu_spec.lua
+++ b/test/functional/ex_cmds/menu_spec.lua
@@ -1,23 +1,25 @@
local helpers = require('test.functional.helpers')(after_each)
-local clear, execute, nvim = helpers.clear, helpers.execute, helpers.nvim
-local expect, feed, command = helpers.expect, helpers.feed, helpers.command
+local clear, command, nvim = helpers.clear, helpers.command, helpers.nvim
+local expect, feed = helpers.expect, helpers.feed
local eq, eval = helpers.eq, helpers.eval
+local funcs = helpers.funcs
+
describe(':emenu', function()
before_each(function()
clear()
- execute('nnoremenu Test.Test inormal<ESC>')
- execute('inoremenu Test.Test insert')
- execute('vnoremenu Test.Test x')
- execute('cnoremenu Test.Test cmdmode')
+ command('nnoremenu Test.Test inormal<ESC>')
+ command('inoremenu Test.Test insert')
+ command('vnoremenu Test.Test x')
+ command('cnoremenu Test.Test cmdmode')
- execute('nnoremenu Edit.Paste p')
- execute('cnoremenu Edit.Paste <C-R>"')
+ command('nnoremenu Edit.Paste p')
+ command('cnoremenu Edit.Paste <C-R>"')
end)
it('executes correct bindings in normal mode without using API', function()
- execute('emenu Test.Test')
+ command('emenu Test.Test')
expect('normal')
end)
@@ -56,3 +58,572 @@ describe(':emenu', function()
eq('thiscmdmode', eval('getcmdline()'))
end)
end)
+
+describe('menu_get', function()
+
+ before_each(function()
+ clear()
+ command('nnoremenu &Test.Test inormal<ESC>')
+ command('inoremenu Test.Test insert')
+ command('vnoremenu Test.Test x')
+ command('cnoremenu Test.Test cmdmode')
+ command('menu Test.Nested.test level1')
+ command('menu Test.Nested.Nested2 level2')
+
+ command('nnoremenu <script> Export.Script p')
+ command('tmenu Export.Script This is the tooltip')
+ command('menu ]Export.hidden thisoneshouldbehidden')
+
+ command('nnoremenu Edit.Paste p')
+ command('cnoremenu Edit.Paste <C-R>"')
+ end)
+
+ it("path='', modes='a'", function()
+ local m = funcs.menu_get("","a");
+ -- HINT: To print the expected table and regenerate the tests:
+ -- print(require('pl.pretty').dump(m))
+ local expected = {
+ {
+ shortcut = "T",
+ hidden = 0,
+ submenus = {
+ {
+ mappings = {
+ i = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "insert",
+ silent = 0
+ },
+ s = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "x",
+ silent = 0
+ },
+ n = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "inormal<Esc>",
+ silent = 0
+ },
+ v = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "x",
+ silent = 0
+ },
+ c = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "cmdmode",
+ silent = 0
+ }
+ },
+ priority = 500,
+ name = "Test",
+ hidden = 0
+ },
+ {
+ priority = 500,
+ name = "Nested",
+ submenus = {
+ {
+ mappings = {
+ o = {
+ sid = 0,
+ noremap = 0,
+ enabled = 1,
+ rhs = "level1",
+ silent = 0
+ },
+ v = {
+ sid = 0,
+ noremap = 0,
+ enabled = 1,
+ rhs = "level1",
+ silent = 0
+ },
+ s = {
+ sid = 0,
+ noremap = 0,
+ enabled = 1,
+ rhs = "level1",
+ silent = 0
+ },
+ n = {
+ sid = 0,
+ noremap = 0,
+ enabled = 1,
+ rhs = "level1",
+ silent = 0
+ }
+ },
+ priority = 500,
+ name = "test",
+ hidden = 0
+ },
+ {
+ mappings = {
+ o = {
+ sid = 0,
+ noremap = 0,
+ enabled = 1,
+ rhs = "level2",
+ silent = 0
+ },
+ v = {
+ sid = 0,
+ noremap = 0,
+ enabled = 1,
+ rhs = "level2",
+ silent = 0
+ },
+ s = {
+ sid = 0,
+ noremap = 0,
+ enabled = 1,
+ rhs = "level2",
+ silent = 0
+ },
+ n = {
+ sid = 0,
+ noremap = 0,
+ enabled = 1,
+ rhs = "level2",
+ silent = 0
+ }
+ },
+ priority = 500,
+ name = "Nested2",
+ hidden = 0
+ }
+ },
+ hidden = 0
+ }
+ },
+ priority = 500,
+ name = "Test"
+ },
+ {
+ priority = 500,
+ name = "Export",
+ submenus = {
+ {
+ tooltip = "This is the tooltip",
+ hidden = 0,
+ name = "Script",
+ priority = 500,
+ mappings = {
+ n = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "p",
+ silent = 0
+ }
+ }
+ }
+ },
+ hidden = 0
+ },
+ {
+ priority = 500,
+ name = "Edit",
+ submenus = {
+ {
+ mappings = {
+ c = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "<C-R>\"",
+ silent = 0
+ },
+ n = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "p",
+ silent = 0
+ }
+ },
+ priority = 500,
+ name = "Paste",
+ hidden = 0
+ }
+ },
+ hidden = 0
+ },
+ {
+ priority = 500,
+ name = "]Export",
+ submenus = {
+ {
+ mappings = {
+ o = {
+ sid = 0,
+ noremap = 0,
+ enabled = 1,
+ rhs = "thisoneshouldbehidden",
+ silent = 0
+ },
+ v = {
+ sid = 0,
+ noremap = 0,
+ enabled = 1,
+ rhs = "thisoneshouldbehidden",
+ silent = 0
+ },
+ s = {
+ sid = 0,
+ noremap = 0,
+ enabled = 1,
+ rhs = "thisoneshouldbehidden",
+ silent = 0
+ },
+ n = {
+ sid = 0,
+ noremap = 0,
+ enabled = 1,
+ rhs = "thisoneshouldbehidden",
+ silent = 0
+ }
+ },
+ priority = 500,
+ name = "hidden",
+ hidden = 0
+ }
+ },
+ hidden = 1
+ }
+ }
+ eq(expected, m)
+ end)
+
+ it('matching path, default modes', function()
+ local m = funcs.menu_get("Export", "a")
+ local expected = {
+ {
+ tooltip = "This is the tooltip",
+ hidden = 0,
+ name = "Script",
+ priority = 500,
+ mappings = {
+ n = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "p",
+ silent = 0
+ }
+ }
+ }
+ }
+ eq(expected, m)
+ end)
+
+ it('no path, matching modes', function()
+ local m = funcs.menu_get("","i")
+ local expected = {
+ {
+ shortcut = "T",
+ hidden = 0,
+ submenus = {
+ {
+ mappings = {
+ i = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "insert",
+ silent = 0
+ }
+ },
+ priority = 500,
+ name = "Test",
+ hidden = 0
+ },
+ {
+ }
+ },
+ priority = 500,
+ name = "Test"
+ }
+ }
+ eq(expected, m)
+ end)
+
+ it('matching path and modes', function()
+ local m = funcs.menu_get("Test","i")
+ local expected = {
+ {
+ mappings = {
+ i = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "insert",
+ silent = 0
+ }
+ },
+ priority = 500,
+ name = "Test",
+ hidden = 0
+ }
+ }
+ eq(expected, m)
+ end)
+end)
+
+describe('menu_get', function()
+
+ before_each(function()
+ clear()
+ end)
+
+ it('returns <keycode> representation of special keys', function()
+ command('nnoremenu &Test.Test inormal<ESC>')
+ command('inoremenu &Test.Test2 <Tab><Esc>')
+ command('vnoremenu &Test.Test3 yA<C-R>0<Tab>xyz<Esc>')
+ command('inoremenu &Test.Test4 <c-r>*')
+ command('inoremenu &Test.Test5 <c-R>+')
+ command('nnoremenu &Test.Test6 <Nop>')
+ command('nnoremenu &Test.Test7 <NOP>')
+ command('nnoremenu &Test.Test8 <NoP>')
+ command('nnoremenu &Test.Test9 ""')
+
+ local m = funcs.menu_get("");
+ local expected = {
+ {
+ shortcut = "T",
+ hidden = 0,
+ submenus = {
+ {
+ priority = 500,
+ mappings = {
+ n = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "inormal<Esc>",
+ silent = 0
+ }
+ },
+ name = "Test",
+ hidden = 0
+ },
+ {
+ priority = 500,
+ mappings = {
+ i = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "<Tab><Esc>",
+ silent = 0
+ }
+ },
+ name = "Test2",
+ hidden = 0
+ },
+ {
+ priority = 500,
+ mappings = {
+ s = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "yA<C-R>0<Tab>xyz<Esc>",
+ silent = 0
+ },
+ v = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "yA<C-R>0<Tab>xyz<Esc>",
+ silent = 0
+ }
+ },
+ name = "Test3",
+ hidden = 0
+ },
+ {
+ priority = 500,
+ mappings = {
+ i = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "<C-R>*",
+ silent = 0
+ }
+ },
+ name = "Test4",
+ hidden = 0
+ },
+ {
+ priority = 500,
+ mappings = {
+ i = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "<C-R>+",
+ silent = 0
+ }
+ },
+ name = "Test5",
+ hidden = 0
+ },
+ {
+ priority = 500,
+ mappings = {
+ n = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "",
+ silent = 0
+ }
+ },
+ name = "Test6",
+ hidden = 0
+ },
+ {
+ priority = 500,
+ mappings = {
+ n = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "",
+ silent = 0
+ }
+ },
+ name = "Test7",
+ hidden = 0
+ },
+ {
+ priority = 500,
+ mappings = {
+ n = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "",
+ silent = 0
+ }
+ },
+ name = "Test8",
+ hidden = 0
+ },
+ {
+ priority = 500,
+ mappings = {
+ n = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "\"\"",
+ silent = 0
+ }
+ },
+ name = "Test9",
+ hidden = 0
+ }
+ },
+ priority = 500,
+ name = "Test"
+ }
+ }
+
+ eq(m, expected)
+ end)
+
+ it('works with right-aligned text and spaces', function()
+ command('nnoremenu &Test<Tab>Y.Test<Tab>X\\ x inormal<Alt-j>')
+ command('nnoremenu &Test\\ 1.Test\\ 2 Wargl')
+ command('nnoremenu &Test4.Test<Tab>3 i space<Esc>')
+
+ local m = funcs.menu_get("");
+ local expected = {
+ {
+ shortcut = "T",
+ hidden = 0,
+ actext = "Y",
+ submenus = {
+ {
+ mappings = {
+ n = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "inormal<Alt-j>",
+ silent = 0
+ }
+ },
+ hidden = 0,
+ actext = "X x",
+ priority = 500,
+ name = "Test"
+ }
+ },
+ priority = 500,
+ name = "Test"
+ },
+ {
+ shortcut = "T",
+ hidden = 0,
+ submenus = {
+ {
+ priority = 500,
+ mappings = {
+ n = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "Wargl",
+ silent = 0
+ }
+ },
+ name = "Test 2",
+ hidden = 0
+ }
+ },
+ priority = 500,
+ name = "Test 1"
+ },
+ {
+ shortcut = "T",
+ hidden = 0,
+ submenus = {
+ {
+ mappings = {
+ n = {
+ sid = 1,
+ noremap = 1,
+ enabled = 1,
+ rhs = "i space<Esc>",
+ silent = 0
+ }
+ },
+ hidden = 0,
+ actext = "3",
+ priority = 500,
+ name = "Test"
+ }
+ },
+ priority = 500,
+ name = "Test4"
+ }
+ }
+
+ eq(m, expected)
+ end)
+end)
diff --git a/test/functional/ex_cmds/mksession_spec.lua b/test/functional/ex_cmds/mksession_spec.lua
new file mode 100644
index 0000000000..a5b327095e
--- /dev/null
+++ b/test/functional/ex_cmds/mksession_spec.lua
@@ -0,0 +1,50 @@
+local lfs = require('lfs')
+local helpers = require('test.functional.helpers')(after_each)
+
+local clear = helpers.clear
+local command = helpers.command
+local get_pathsep = helpers.get_pathsep
+local eq = helpers.eq
+local funcs = helpers.funcs
+local rmdir = helpers.rmdir
+
+local file_prefix = 'Xtest-functional-ex_cmds-mksession_spec'
+
+describe(':mksession', function()
+ local session_file = file_prefix .. '.vim'
+ local tab_dir = file_prefix .. '.d'
+
+ before_each(function()
+ clear()
+ lfs.mkdir(tab_dir)
+ end)
+
+ after_each(function()
+ os.remove(session_file)
+ rmdir(tab_dir)
+ end)
+
+ it('restores tab-local working directories', function()
+ local tmpfile_base = file_prefix .. '-tmpfile'
+ local cwd_dir = funcs.getcwd()
+
+ -- :mksession does not save empty tabs, so create some buffers.
+ command('edit ' .. tmpfile_base .. '1')
+ command('tabnew')
+ command('edit ' .. tmpfile_base .. '2')
+ command('tcd ' .. tab_dir)
+ command('tabfirst')
+ command('mksession ' .. session_file)
+
+ -- Create a new test instance of Nvim.
+ clear()
+
+ command('source ' .. session_file)
+ -- First tab should have the original working directory.
+ command('tabnext 1')
+ eq(cwd_dir, funcs.getcwd())
+ -- Second tab should have the tab-local working directory.
+ command('tabnext 2')
+ eq(cwd_dir .. get_pathsep() .. tab_dir, funcs.getcwd())
+ end)
+end)
diff --git a/test/functional/ex_cmds/mkview_spec.lua b/test/functional/ex_cmds/mkview_spec.lua
new file mode 100644
index 0000000000..fef8065b2e
--- /dev/null
+++ b/test/functional/ex_cmds/mkview_spec.lua
@@ -0,0 +1,67 @@
+local lfs = require('lfs')
+local helpers = require('test.functional.helpers')(after_each)
+
+local clear = helpers.clear
+local command = helpers.command
+local get_pathsep = helpers.get_pathsep
+local eq = helpers.eq
+local funcs = helpers.funcs
+local rmdir = helpers.rmdir
+
+local file_prefix = 'Xtest-functional-ex_cmds-mkview_spec'
+
+describe(':mkview', function()
+ local tmp_file_base = file_prefix .. '-tmpfile'
+ local local_dir = file_prefix .. '.d'
+ local view_dir = file_prefix .. '.view.d'
+
+ before_each(function()
+ clear()
+ lfs.mkdir(view_dir)
+ lfs.mkdir(local_dir)
+ end)
+
+ after_each(function()
+ -- Remove any views created in the view directory
+ rmdir(view_dir)
+ rmdir(local_dir)
+ end)
+
+ it('viewoption curdir restores local current directory', function()
+ local cwd_dir = funcs.getcwd()
+ local set_view_dir_command = 'set viewdir=' .. cwd_dir ..
+ get_pathsep() .. view_dir
+
+ -- By default the local current directory should save
+ command(set_view_dir_command)
+ command('edit ' .. tmp_file_base .. '1')
+ command('lcd ' .. local_dir)
+ command('mkview')
+
+ -- Create a new instance of Nvim to remove the 'lcd'
+ clear()
+
+ -- Disable saving the local current directory for the second view
+ command(set_view_dir_command)
+ command('set viewoptions-=curdir')
+ command('edit ' .. tmp_file_base .. '2')
+ command('lcd ' .. local_dir)
+ command('mkview')
+
+ -- Create a new instance of Nvim to test saved 'lcd' option
+ clear()
+ command(set_view_dir_command)
+
+ -- Load the view without a saved local current directory
+ command('edit ' .. tmp_file_base .. '2')
+ command('loadview')
+ -- The view's current directory should not have changed
+ eq(cwd_dir, funcs.getcwd())
+ -- Load the view with a saved local current directory
+ command('edit ' .. tmp_file_base .. '1')
+ command('loadview')
+ -- The view's local directory should have been saved
+ eq(cwd_dir .. get_pathsep() .. local_dir, funcs.getcwd())
+ end)
+
+end)
diff --git a/test/functional/ex_cmds/oldfiles_spec.lua b/test/functional/ex_cmds/oldfiles_spec.lua
index b7109f2f98..e2958c2924 100644
--- a/test/functional/ex_cmds/oldfiles_spec.lua
+++ b/test/functional/ex_cmds/oldfiles_spec.lua
@@ -1,20 +1,18 @@
local Screen = require('test.functional.ui.screen')
local helpers = require('test.functional.helpers')(after_each)
-local buf, eq, execute = helpers.curbufmeths, helpers.eq, helpers.execute
+local buf, eq, feed_command = helpers.curbufmeths, helpers.eq, helpers.feed_command
local feed, nvim_prog, wait = helpers.feed, helpers.nvim_prog, helpers.wait
local ok, set_session, spawn = helpers.ok, helpers.set_session, helpers.spawn
+local eval = helpers.eval
-local shada_file = 'test.shada'
+local shada_file = 'Xtest.shada'
---
--- helpers.clear() uses "-i NONE", which is not useful for this test.
---
local function _clear()
- set_session(spawn({nvim_prog,
- '-u', 'NONE',
- '--cmd', 'set noswapfile undodir=. directory=. viewdir=. backupdir=.',
- '--embed'}))
+ set_session(spawn({nvim_prog, '--embed', '--headless', '-u', 'NONE',
+ -- Need shada for these tests.
+ '-i', shada_file,
+ '--cmd', 'set noswapfile undodir=. directory=. viewdir=. backupdir=. belloff= noshowcmd noruler'}))
end
describe(':oldfiles', function()
@@ -31,12 +29,13 @@ describe(':oldfiles', function()
it('shows most recently used files', function()
local screen = Screen.new(100, 5)
screen:attach()
- execute('edit testfile1')
- execute('edit testfile2')
- execute('wshada ' .. shada_file)
- execute('rshada! ' .. shada_file)
+ feed_command("set display-=msgsep")
+ feed_command('edit testfile1')
+ feed_command('edit testfile2')
+ feed_command('wshada')
+ feed_command('rshada!')
local oldfiles = helpers.meths.get_vvar('oldfiles')
- execute('oldfiles')
+ feed_command('oldfiles')
screen:expect([[
testfile2 |
1: ]].. add_padding(oldfiles[1]) ..[[ |
@@ -45,27 +44,58 @@ describe(':oldfiles', function()
Press ENTER or type command to continue^ |
]])
end)
+
+ it('can be filtered with :filter', function()
+ feed_command('edit file_one.txt')
+ local file1 = buf.get_name()
+ feed_command('edit file_two.txt')
+ local file2 = buf.get_name()
+ feed_command('edit another.txt')
+ local another = buf.get_name()
+ feed_command('wshada')
+ feed_command('rshada!')
+
+ local function get_oldfiles(cmd)
+ local t = eval([[split(execute(']]..cmd..[['), "\n")]])
+ for i, _ in ipairs(t) do
+ t[i] = t[i]:gsub('^%d+:%s+', '')
+ end
+ table.sort(t)
+ return t
+ end
+
+ local oldfiles = get_oldfiles('oldfiles')
+ eq({another, file1, file2}, oldfiles)
+
+ oldfiles = get_oldfiles('filter file_ oldfiles')
+ eq({file1, file2}, oldfiles)
+
+ oldfiles = get_oldfiles('filter /another/ oldfiles')
+ eq({another}, oldfiles)
+
+ oldfiles = get_oldfiles('filter! file_ oldfiles')
+ eq({another}, oldfiles)
+ end)
end)
-describe(':oldfiles!', function()
+describe(':browse oldfiles', function()
local filename
local filename2
local oldfiles
before_each(function()
_clear()
- execute('edit testfile1')
+ feed_command('edit testfile1')
filename = buf.get_name()
- execute('edit testfile2')
+ feed_command('edit testfile2')
filename2 = buf.get_name()
- execute('wshada ' .. shada_file)
+ feed_command('wshada')
wait()
_clear()
- execute('rshada! ' .. shada_file)
- -- Ensure nvim is out of "Press ENTER..." screen
+ -- Ensure nvim is out of "Press ENTER..." prompt.
feed('<cr>')
-
+
-- Ensure v:oldfiles isn't busted. Since things happen so fast,
-- the ordering of v:oldfiles is unstable (it uses qsort() under-the-hood).
-- Let's verify the contents and the length of v:oldfiles before moving on.
@@ -74,7 +104,7 @@ describe(':oldfiles!', function()
ok(filename == oldfiles[1] or filename == oldfiles[2])
ok(filename2 == oldfiles[1] or filename2 == oldfiles[2])
- execute('oldfiles!')
+ feed_command('browse oldfiles')
end)
after_each(function()
diff --git a/test/functional/ex_cmds/print_commands_spec.lua b/test/functional/ex_cmds/print_commands_spec.lua
new file mode 100644
index 0000000000..98c0f74635
--- /dev/null
+++ b/test/functional/ex_cmds/print_commands_spec.lua
@@ -0,0 +1,12 @@
+local helpers = require('test.functional.helpers')(after_each)
+local clear, eq, command, funcs =
+ helpers.clear, helpers.eq, helpers.command, helpers.funcs
+
+describe(':z^', function()
+ before_each(clear)
+
+ it('correctly sets the cursor after :z^', function()
+ command('z^')
+ eq(1, funcs.line('.'))
+ end)
+end)
diff --git a/test/functional/ex_cmds/profile_spec.lua b/test/functional/ex_cmds/profile_spec.lua
index d390806679..f185db192a 100644
--- a/test/functional/ex_cmds/profile_spec.lua
+++ b/test/functional/ex_cmds/profile_spec.lua
@@ -5,9 +5,9 @@ local helpers = require('test.functional.helpers')(after_each)
local eval = helpers.eval
local command = helpers.command
local eq, neq = helpers.eq, helpers.neq
-local tempfile = os.tmpname()
+local tempfile = helpers.tmpname()
--- os.tmpname() also creates the file on POSIX systems. Remove it again.
+-- tmpname() also creates the file on POSIX systems. Remove it again.
-- We just need the name, ignoring any race conditions.
if lfs.attributes(tempfile, 'uid') then
os.remove(tempfile)
diff --git a/test/functional/ex_cmds/quickfix_commands_spec.lua b/test/functional/ex_cmds/quickfix_commands_spec.lua
new file mode 100644
index 0000000000..bf10f80401
--- /dev/null
+++ b/test/functional/ex_cmds/quickfix_commands_spec.lua
@@ -0,0 +1,111 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local eq = helpers.eq
+local clear = helpers.clear
+local funcs = helpers.funcs
+local command = helpers.command
+local exc_exec = helpers.exc_exec
+local write_file = helpers.write_file
+local curbufmeths = helpers.curbufmeths
+local source = helpers.source
+
+local file_base = 'Xtest-functional-ex_cmds-quickfix_commands'
+
+before_each(clear)
+
+for _, c in ipairs({'l', 'c'}) do
+ local file = ('%s.%s'):format(file_base, c)
+ local filecmd = c .. 'file'
+ local getfcmd = c .. 'getfile'
+ local addfcmd = c .. 'addfile'
+ local getlist = (c == 'c') and funcs.getqflist or (
+ function() return funcs.getloclist(0) end)
+
+ describe((':%s*file commands'):format(c), function()
+ before_each(function()
+ write_file(file, ([[
+ %s-1.res:700:10:Line 700
+ %s-2.res:800:15:Line 800
+ ]]):format(file, file))
+ end)
+ after_each(function()
+ os.remove(file)
+ end)
+
+ it('work', function()
+ command(('%s %s'):format(filecmd, file))
+ -- Second line of each entry (i.e. `nr=-1, โ€ฆ`) was obtained from actual
+ -- results. First line (i.e. `{lnum=โ€ฆ`) was obtained from legacy test.
+ local list = {
+ {lnum=700, col=10, text='Line 700',
+ nr=-1, bufnr=2, valid=1, pattern='', vcol=0, ['type']=''},
+ {lnum=800, col=15, text='Line 800',
+ nr=-1, bufnr=3, valid=1, pattern='', vcol=0, ['type']=''},
+ }
+ eq(list, getlist())
+ eq(('%s-1.res'):format(file), funcs.bufname(list[1].bufnr))
+ eq(('%s-2.res'):format(file), funcs.bufname(list[2].bufnr))
+
+ -- Run cfile/lfile from a modified buffer
+ command('enew!')
+ curbufmeths.set_lines(1, 1, true, {'Quickfix'})
+ eq(('Vim(%s):E37: No write since last change (add ! to override)'):format(
+ filecmd),
+ exc_exec(('%s %s'):format(filecmd, file)))
+
+ write_file(file, ([[
+ %s-3.res:900:30:Line 900
+ ]]):format(file))
+ command(('%s %s'):format(addfcmd, file))
+ list[#list + 1] = {
+ lnum=900, col=30, text='Line 900',
+ nr=-1, bufnr=5, valid=1, pattern='', vcol=0, ['type']='',
+ }
+ eq(list, getlist())
+ eq(('%s-3.res'):format(file), funcs.bufname(list[3].bufnr))
+
+ write_file(file, ([[
+ %s-1.res:222:77:Line 222
+ %s-2.res:333:88:Line 333
+ ]]):format(file, file))
+ command('enew!')
+ command(('%s %s'):format(getfcmd, file))
+ list = {
+ {lnum=222, col=77, text='Line 222',
+ nr=-1, bufnr=2, valid=1, pattern='', vcol=0, ['type']=''},
+ {lnum=333, col=88, text='Line 333',
+ nr=-1, bufnr=3, valid=1, pattern='', vcol=0, ['type']=''},
+ }
+ eq(list, getlist())
+ eq(('%s-1.res'):format(file), funcs.bufname(list[1].bufnr))
+ eq(('%s-2.res'):format(file), funcs.bufname(list[2].bufnr))
+ end)
+ end)
+end
+
+describe('quickfix', function()
+ it('location-list update on buffer modification', function()
+ source([[
+ new
+ setl bt=nofile
+ let lines = ['Line 1', 'Line 2', 'Line 3', 'Line 4', 'Line 5']
+ call append(0, lines)
+ new
+ setl bt=nofile
+ call append(0, lines)
+ let qf_item = {
+ \ 'lnum': 4,
+ \ 'text': "This is the error line.",
+ \ }
+ let qf_item['bufnr'] = bufnr('%')
+ call setloclist(0, [qf_item])
+ wincmd p
+ let qf_item['bufnr'] = bufnr('%')
+ call setloclist(0, [qf_item])
+ 1del _
+ call append(0, ['New line 1', 'New line 2', 'New line 3'])
+ silent ll
+ ]])
+ eq({0, 6, 1, 0, 1}, funcs.getcurpos())
+ end)
+end)
diff --git a/test/functional/ex_cmds/quit_spec.lua b/test/functional/ex_cmds/quit_spec.lua
index 016a607743..fe138a24c8 100644
--- a/test/functional/ex_cmds/quit_spec.lua
+++ b/test/functional/ex_cmds/quit_spec.lua
@@ -2,7 +2,7 @@ local helpers = require('test.functional.helpers')(after_each)
local clear = helpers.clear
describe(':qa', function()
- before_each(function()
+ before_each(function()
clear('--cmd', 'qa')
end)
diff --git a/test/functional/ex_cmds/recover_spec.lua b/test/functional/ex_cmds/recover_spec.lua
deleted file mode 100644
index 60673d25ef..0000000000
--- a/test/functional/ex_cmds/recover_spec.lua
+++ /dev/null
@@ -1,75 +0,0 @@
--- Tests for :recover
-
-local helpers = require('test.functional.helpers')(after_each)
-local lfs = require('lfs')
-local execute, eq, clear, eval, feed, expect, source =
- helpers.execute, helpers.eq, helpers.clear, helpers.eval, helpers.feed,
- helpers.expect, helpers.source
-
-describe(':recover', function()
- before_each(clear)
-
- it('fails if given a non-existent swapfile', function()
- local swapname = 'bogus-swapfile'
- execute('recover '..swapname) -- This should not segfault. #2117
- eq('E305: No swap file found for '..swapname, eval('v:errmsg'))
- end)
-
-end)
-
-describe(':preserve', function()
- local swapdir = lfs.currentdir()..'/testdir_recover_spec'
- before_each(function()
- clear()
- helpers.rmdir(swapdir)
- lfs.mkdir(swapdir)
- end)
- after_each(function()
- helpers.rmdir(swapdir)
- end)
-
- it("saves to custom 'directory' and (R)ecovers (issue #1836)", function()
- local testfile = 'testfile_recover_spec'
- -- Note: `set swapfile` *must* go after `set directory`: otherwise it may
- -- attempt to create a swapfile in different directory.
- local init = [[
- set directory^=]]..swapdir..[[//
- set swapfile fileformat=unix undolevels=-1
- ]]
-
- source(init)
- execute('set swapfile fileformat=unix undolevels=-1')
- -- Put swapdir at the start of the 'directory' list. #1836
- execute('set directory^='..swapdir..'//')
- execute('edit '..testfile)
- feed('isometext<esc>')
- execute('preserve')
- source('redir => g:swapname | swapname | redir END')
-
- local swappath1 = eval('g:swapname')
-
- --TODO(justinmk): this is an ugly hack to force `helpers` to support
- --multiple sessions.
- local nvim2 = helpers.spawn({helpers.nvim_prog, '-u', 'NONE', '-i', 'NONE', '--embed'},
- true)
- helpers.set_session(nvim2)
-
- source(init)
-
- -- Use the "SwapExists" event to choose the (R)ecover choice at the dialog.
- execute('autocmd SwapExists * let v:swapchoice = "r"')
- execute('silent edit '..testfile)
- source('redir => g:swapname | swapname | redir END')
-
- local swappath2 = eval('g:swapname')
-
- -- swapfile from session 1 should end in .swp
- assert(testfile..'.swp' == string.match(swappath1, '[^%%]+$'))
-
- -- swapfile from session 2 should end in .swo
- assert(testfile..'.swo' == string.match(swappath2, '[^%%]+$'))
-
- expect('sometext')
- end)
-
-end)
diff --git a/test/functional/ex_cmds/script_spec.lua b/test/functional/ex_cmds/script_spec.lua
new file mode 100644
index 0000000000..4e57d2755d
--- /dev/null
+++ b/test/functional/ex_cmds/script_spec.lua
@@ -0,0 +1,75 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local eq = helpers.eq
+local neq = helpers.neq
+local meths = helpers.meths
+local clear = helpers.clear
+local dedent = helpers.dedent
+local source = helpers.source
+local exc_exec = helpers.exc_exec
+local missing_provider = helpers.missing_provider
+
+before_each(clear)
+
+describe('script_get-based command', function()
+ local garbage = ')}{+*({}]*[;(+}{&[]}{*])('
+
+ local function test_garbage_exec(cmd, check_neq)
+ describe(cmd, function()
+ it('works correctly when skipping oneline variant', function()
+ eq(true, pcall(source, (dedent([[
+ if 0
+ %s %s
+ endif
+ ]])):format(cmd, garbage)))
+ eq('', meths.command_output('messages'))
+ if check_neq then
+ neq(0, exc_exec(dedent([[
+ %s %s
+ ]])):format(cmd, garbage))
+ end
+ end)
+ it('works correctly when skipping HEREdoc variant', function()
+ eq(true, pcall(source, (dedent([[
+ if 0
+ %s << EOF
+ %s
+ EOF
+ endif
+ ]])):format(cmd, garbage)))
+ eq('', meths.command_output('messages'))
+ if check_neq then
+ eq(true, pcall(source, (dedent([[
+ let g:exc = 0
+ try
+ %s << EOF
+ %s
+ EOF
+ catch
+ let g:exc = v:exception
+ endtry
+ ]])):format(cmd, garbage)))
+ neq(0, meths.get_var('exc'))
+ end
+ end)
+ end)
+ end
+
+ clear()
+
+ -- Built-in scripts
+ test_garbage_exec('lua', true)
+
+ -- Provider-based scripts
+ test_garbage_exec('ruby', not missing_provider('ruby'))
+ test_garbage_exec('python', not missing_provider('python'))
+ test_garbage_exec('python3', not missing_provider('python3'))
+
+ -- Missing scripts
+ test_garbage_exec('tcl', false)
+ test_garbage_exec('mzscheme', false)
+ test_garbage_exec('perl', false)
+
+ -- Not really a script
+ test_garbage_exec('xxxinvalidlanguagexxx', true)
+end)
diff --git a/test/functional/ex_cmds/sign_spec.lua b/test/functional/ex_cmds/sign_spec.lua
index b37e6e8563..9d08a66625 100644
--- a/test/functional/ex_cmds/sign_spec.lua
+++ b/test/functional/ex_cmds/sign_spec.lua
@@ -7,7 +7,7 @@ describe('sign', function()
describe('without specifying buffer', function()
it('deletes the sign from all buffers', function()
-- place a sign with id 34 to first buffer
- nvim('command', 'sign define Foo text=+ texthl=Delimiter linehl=Comment')
+ nvim('command', 'sign define Foo text=+ texthl=Delimiter linehl=Comment numhl=Number')
local buf1 = nvim('eval', 'bufnr("%")')
nvim('command', 'sign place 34 line=3 name=Foo buffer='..buf1)
-- create a second buffer and place the sign on it as well
@@ -16,8 +16,8 @@ describe('sign', function()
nvim('command', 'sign place 34 line=3 name=Foo buffer='..buf2)
-- now unplace without specifying a buffer
nvim('command', 'sign unplace 34')
- eq("\n--- Signs ---\n", nvim('command_output', 'sign place buffer='..buf1))
- eq("\n--- Signs ---\n", nvim('command_output', 'sign place buffer='..buf2))
+ eq("--- Signs ---\n", nvim('command_output', 'sign place buffer='..buf1))
+ eq("--- Signs ---\n", nvim('command_output', 'sign place buffer='..buf2))
end)
end)
end)
diff --git a/test/functional/ex_cmds/swapfile_preserve_recover_spec.lua b/test/functional/ex_cmds/swapfile_preserve_recover_spec.lua
new file mode 100644
index 0000000000..bbab1471f6
--- /dev/null
+++ b/test/functional/ex_cmds/swapfile_preserve_recover_spec.lua
@@ -0,0 +1,168 @@
+local Screen = require('test.functional.ui.screen')
+local helpers = require('test.functional.helpers')(after_each)
+local lfs = require('lfs')
+local eq, eval, expect, source =
+ helpers.eq, helpers.eval, helpers.expect, helpers.source
+local clear = helpers.clear
+local command = helpers.command
+local expect_err = helpers.expect_err
+local feed = helpers.feed
+local nvim_prog = helpers.nvim_prog
+local ok = helpers.ok
+local rmdir = helpers.rmdir
+local set_session = helpers.set_session
+local spawn = helpers.spawn
+local nvim_async = helpers.nvim_async
+
+describe(':recover', function()
+ before_each(clear)
+
+ it('fails if given a non-existent swapfile', function()
+ local swapname = 'bogus_swapfile'
+ local swapname2 = 'bogus_swapfile.swp'
+ expect_err('E305: No swap file found for '..swapname,
+ command, 'recover '..swapname) -- Should not segfault. #2117
+ -- Also check filename ending with ".swp". #9504
+ expect_err('Vim%(recover%):E306: Cannot open '..swapname2,
+ command, 'recover '..swapname2) -- Should not segfault. #2117
+ eq(2, eval('1+1')) -- Still alive?
+ end)
+
+end)
+
+describe(':preserve', function()
+ local swapdir = lfs.currentdir()..'/Xtest_recover_dir'
+ before_each(function()
+ clear()
+ rmdir(swapdir)
+ lfs.mkdir(swapdir)
+ end)
+ after_each(function()
+ command('%bwipeout!')
+ rmdir(swapdir)
+ end)
+
+ it("saves to custom 'directory' and (R)ecovers #1836", function()
+ local testfile = 'Xtest_recover_file1'
+ -- Put swapdir at the start of the 'directory' list. #1836
+ -- Note: `set swapfile` *must* go after `set directory`: otherwise it may
+ -- attempt to create a swapfile in different directory.
+ local init = [[
+ set directory^=]]..swapdir:gsub([[\]], [[\\]])..[[//
+ set swapfile fileformat=unix undolevels=-1
+ ]]
+
+ source(init)
+ command('edit! '..testfile)
+ feed('isometext<esc>')
+ command('preserve')
+ source('redir => g:swapname | silent swapname | redir END')
+
+ local swappath1 = eval('g:swapname')
+
+ -- Start another Nvim instance.
+ local nvim2 = spawn({nvim_prog, '-u', 'NONE', '-i', 'NONE', '--embed'},
+ true)
+ set_session(nvim2)
+
+ source(init)
+
+ -- Use the "SwapExists" event to choose the (R)ecover choice at the dialog.
+ command('autocmd SwapExists * let v:swapchoice = "r"')
+ command('silent edit! '..testfile)
+ source('redir => g:swapname | silent swapname | redir END')
+
+ local swappath2 = eval('g:swapname')
+
+ expect('sometext')
+ -- swapfile from session 1 should end in .swp
+ eq(testfile..'.swp', string.match(swappath1, '[^%%]+$'))
+ -- swapfile from session 2 should end in .swo
+ eq(testfile..'.swo', string.match(swappath2, '[^%%]+$'))
+ -- Verify that :swapname was not truncated (:help 'shortmess').
+ ok(nil == string.find(swappath1, '%.%.%.'))
+ ok(nil == string.find(swappath2, '%.%.%.'))
+ end)
+
+end)
+
+describe('swapfile detection', function()
+ local swapdir = lfs.currentdir()..'/Xtest_swapdialog_dir'
+ before_each(function()
+ clear()
+ rmdir(swapdir)
+ lfs.mkdir(swapdir)
+ end)
+ after_each(function()
+ command('%bwipeout!')
+ rmdir(swapdir)
+ end)
+
+ it('always show swapfile dialog #8840 #9027', function()
+ local testfile = 'Xtest_swapdialog_file1'
+ -- Put swapdir at the start of the 'directory' list. #1836
+ -- Note: `set swapfile` *must* go after `set directory`: otherwise it may
+ -- attempt to create a swapfile in different directory.
+ local init = [[
+ set directory^=]]..swapdir:gsub([[\]], [[\\]])..[[//
+ set swapfile fileformat=unix undolevels=-1 hidden
+ ]]
+
+ local expected_no_dialog = '^'..(' '):rep(256)..'|\n'
+ for _=1,37 do
+ expected_no_dialog = expected_no_dialog..'~'..(' '):rep(255)..'|\n'
+ end
+ expected_no_dialog = expected_no_dialog..testfile..(' '):rep(216)..'0,0-1 All|\n'
+ expected_no_dialog = expected_no_dialog..(' '):rep(256)..'|\n'
+
+ source(init)
+ command('edit! '..testfile)
+ feed('isometext<esc>')
+ command('preserve')
+
+ -- Start another Nvim instance.
+ local nvim2 = spawn({nvim_prog, '-u', 'NONE', '-i', 'NONE', '--embed'},
+ true)
+ set_session(nvim2)
+ local screen2 = Screen.new(256, 40)
+ screen2:attach()
+ source(init)
+
+ -- With shortmess+=F
+ command('set shortmess+=F')
+ feed(':edit '..testfile..'<CR>')
+ screen2:expect{any=[[E325: ATTENTION.*]]..'\n'..[[Found a swap file by the name ".*]]
+ ..[[Xtest_swapdialog_dir[/\].*]]..testfile..[[%.swp"]]}
+ feed('e') -- Chose "Edit" at the swap dialog.
+ screen2:expect(expected_no_dialog)
+
+ -- With :silent and shortmess+=F
+ feed(':silent edit %<CR>')
+ screen2:expect{any=[[Found a swap file by the name ".*]]
+ ..[[Xtest_swapdialog_dir[/\].*]]..testfile..[[%.swp"]]}
+ feed('e') -- Chose "Edit" at the swap dialog.
+ screen2:expect(expected_no_dialog)
+
+ -- With :silent! and shortmess+=F
+ feed(':silent! edit %<CR>')
+ screen2:expect{any=[[Found a swap file by the name ".*]]
+ ..[[Xtest_swapdialog_dir[/\].*]]..testfile..[[%.swp"]]}
+ feed('e') -- Chose "Edit" at the swap dialog.
+ screen2:expect(expected_no_dialog)
+
+ -- With API (via eval/VimL) call and shortmess+=F
+ feed(':call nvim_command("edit %")<CR>')
+ screen2:expect{any=[[Found a swap file by the name ".*]]
+ ..[[Xtest_swapdialog_dir[/\].*]]..testfile..[[%.swp"]]}
+ feed('e') -- Chose "Edit" at the swap dialog.
+ feed('<c-c>')
+ screen2:expect(expected_no_dialog)
+
+ -- With API call and shortmess+=F
+ nvim_async('command', 'edit %')
+ screen2:expect{any=[[Found a swap file by the name ".*]]
+ ..[[Xtest_swapdialog_dir[/\].*]]..testfile..[[%.swp"]]}
+ feed('e') -- Chose "Edit" at the swap dialog.
+ feed('<c-c>')
+ end)
+end)
diff --git a/test/functional/ex_cmds/syntax_spec.lua b/test/functional/ex_cmds/syntax_spec.lua
new file mode 100644
index 0000000000..c9e96703de
--- /dev/null
+++ b/test/functional/ex_cmds/syntax_spec.lua
@@ -0,0 +1,17 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local eq = helpers.eq
+local clear = helpers.clear
+local exc_exec = helpers.exc_exec
+
+describe(':syntax', function()
+ before_each(clear)
+
+ describe('keyword', function()
+ it('does not crash when group name contains unprintable characters',
+ function()
+ eq('Vim(syntax):E669: Unprintable character in group name',
+ exc_exec('syntax keyword \024 foo bar'))
+ end)
+ end)
+end)
diff --git a/test/functional/ex_cmds/undojoin_spec.lua b/test/functional/ex_cmds/undojoin_spec.lua
new file mode 100644
index 0000000000..7803906619
--- /dev/null
+++ b/test/functional/ex_cmds/undojoin_spec.lua
@@ -0,0 +1,38 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local eq = helpers.eq
+local clear = helpers.clear
+local insert = helpers.insert
+local feed = helpers.feed
+local expect = helpers.expect
+local feed_command = helpers.feed_command
+local exc_exec = helpers.exc_exec
+
+describe(':undojoin command', function()
+ before_each(function()
+ clear()
+ insert([[
+ Line of text 1
+ Line of text 2]])
+ feed_command('goto 1')
+ end)
+ it('joins changes in a buffer', function()
+ feed_command('undojoin | delete')
+ expect([[
+ Line of text 2]])
+ feed('u')
+ expect([[
+ ]])
+ end)
+ it('does not corrupt undolist when connected with redo', function()
+ feed('ixx<esc>')
+ feed_command('undojoin | redo')
+ expect([[
+ xxLine of text 1
+ Line of text 2]])
+ end)
+ it('does not raise an error when called twice', function()
+ local ret = exc_exec('undojoin | undojoin')
+ eq(0, ret)
+ end)
+end)
diff --git a/test/functional/ex_cmds/write_spec.lua b/test/functional/ex_cmds/write_spec.lua
index b38ae29f7d..3f54ff6f41 100644
--- a/test/functional/ex_cmds/write_spec.lua
+++ b/test/functional/ex_cmds/write_spec.lua
@@ -1,20 +1,48 @@
--- Specs for :write
-
local helpers = require('test.functional.helpers')(after_each)
-local eq, eval, clear, write_file, execute, source =
- helpers.eq, helpers.eval, helpers.clear, helpers.write_file,
- helpers.execute, helpers.source
+local lfs = require('lfs')
+local eq, eval, clear, write_file, source, insert =
+ helpers.eq, helpers.eval, helpers.clear, helpers.write_file,
+ helpers.source, helpers.insert
+local redir_exec = helpers.redir_exec
+local exc_exec = helpers.exc_exec
+local command = helpers.command
+local feed_command = helpers.feed_command
+local funcs = helpers.funcs
+local meths = helpers.meths
+local iswin = helpers.iswin
+
+local fname = 'Xtest-functional-ex_cmds-write'
+local fname_bak = fname .. '~'
+local fname_broken = fname_bak .. 'broken'
describe(':write', function()
- after_each(function()
+ local function cleanup()
os.remove('test_bkc_file.txt')
os.remove('test_bkc_link.txt')
+ os.remove('test_fifo')
+ os.remove(fname)
+ os.remove(fname_bak)
+ os.remove(fname_broken)
+ end
+ before_each(function()
+ clear()
+ cleanup()
+ end)
+ after_each(function()
+ cleanup()
end)
it('&backupcopy=auto preserves symlinks', function()
- clear('--cmd', 'set backupcopy=auto')
+ command('set backupcopy=auto')
write_file('test_bkc_file.txt', 'content0')
- execute("silent !ln -s test_bkc_file.txt test_bkc_link.txt")
+ if iswin() then
+ command("silent !mklink test_bkc_link.txt test_bkc_file.txt")
+ else
+ command("silent !ln -s test_bkc_file.txt test_bkc_link.txt")
+ end
+ if eval('v:shell_error') ~= 0 then
+ pending('Cannot create symlink', function()end)
+ end
source([[
edit test_bkc_link.txt
call setline(1, ['content1'])
@@ -25,9 +53,16 @@ describe(':write', function()
end)
it('&backupcopy=no replaces symlink with new file', function()
- clear('--cmd', 'set backupcopy=no')
+ command('set backupcopy=no')
write_file('test_bkc_file.txt', 'content0')
- execute("silent !ln -s test_bkc_file.txt test_bkc_link.txt")
+ if iswin() then
+ command("silent !mklink test_bkc_link.txt test_bkc_file.txt")
+ else
+ command("silent !ln -s test_bkc_file.txt test_bkc_link.txt")
+ end
+ if eval('v:shell_error') ~= 0 then
+ pending('Cannot create symlink', function()end)
+ end
source([[
edit test_bkc_link.txt
call setline(1, ['content1'])
@@ -36,4 +71,63 @@ describe(':write', function()
eq(eval("['content0']"), eval("readfile('test_bkc_file.txt')"))
eq(eval("['content1']"), eval("readfile('test_bkc_link.txt')"))
end)
+
+ it("appends FIFO file", function()
+ -- mkfifo creates read-only .lnk files on Windows
+ if iswin() or eval("executable('mkfifo')") == 0 then
+ pending('missing "mkfifo" command', function()end)
+ return
+ end
+
+ local text = "some fifo text from write_spec"
+ assert(os.execute("mkfifo test_fifo"))
+ insert(text)
+
+ -- Blocks until a consumer reads the FIFO.
+ feed_command("write >> test_fifo")
+
+ -- Read the FIFO, this will unblock the :write above.
+ local fifo = assert(io.open("test_fifo"))
+ eq(text.."\n", fifo:read("*all"))
+ fifo:close()
+ end)
+
+ it('errors out correctly', function()
+ command('let $HOME=""')
+ eq(funcs.fnamemodify('.', ':p:h'), funcs.fnamemodify('.', ':p:h:~'))
+ -- Message from check_overwrite
+ if not iswin() then
+ eq(('\nE17: "'..funcs.fnamemodify('.', ':p:h')..'" is a directory'),
+ redir_exec('write .'))
+ end
+ meths.set_option('writeany', true)
+ -- Message from buf_write
+ eq(('\nE502: "." is a directory'),
+ redir_exec('write .'))
+ funcs.mkdir(fname_bak)
+ meths.set_option('backupdir', '.')
+ meths.set_option('backup', true)
+ write_file(fname, 'content0')
+ eq(0, exc_exec('edit ' .. fname))
+ funcs.setline(1, 'TTY')
+ eq('Vim(write):E510: Can\'t make backup file (add ! to override)',
+ exc_exec('write'))
+ meths.set_option('backup', false)
+ funcs.setfperm(fname, 'r--------')
+ eq('Vim(write):E505: "Xtest-functional-ex_cmds-write" is read-only (add ! to override)',
+ exc_exec('write'))
+ if iswin() then
+ eq(0, os.execute('del /q/f ' .. fname))
+ eq(0, os.execute('rd /q/s ' .. fname_bak))
+ else
+ eq(true, os.remove(fname))
+ eq(true, os.remove(fname_bak))
+ end
+ write_file(fname_bak, 'TTYX')
+ -- FIXME: exc_exec('write!') outputs 0 in Windows
+ if iswin() then return end
+ lfs.link(fname_bak .. ('/xxxxx'):rep(20), fname, true)
+ eq('Vim(write):E166: Can\'t open linked file for writing',
+ exc_exec('write!'))
+ end)
end)
diff --git a/test/functional/ex_cmds/wundo_spec.lua b/test/functional/ex_cmds/wundo_spec.lua
index e1216fa5d4..b6fcae0cf4 100644
--- a/test/functional/ex_cmds/wundo_spec.lua
+++ b/test/functional/ex_cmds/wundo_spec.lua
@@ -1,20 +1,21 @@
-- Specs for :wundo and underlying functions
local helpers = require('test.functional.helpers')(after_each)
-local execute, clear, eval, feed, spawn, nvim_prog, set_session =
- helpers.execute, helpers.clear, helpers.eval, helpers.feed, helpers.spawn,
+local command, clear, eval, spawn, nvim_prog, set_session =
+ helpers.command, helpers.clear, helpers.eval, helpers.spawn,
helpers.nvim_prog, helpers.set_session
describe(':wundo', function()
before_each(clear)
+ after_each(function()
+ os.remove(eval('getcwd()') .. '/foo')
+ end)
it('safely fails on new, non-empty buffer', function()
- feed('iabc<esc>')
- execute('wundo foo') -- This should not segfault. #1027
+ command('normal! iabc')
+ command('wundo foo') -- This should not segfault. #1027
--TODO: check messages for error message
-
- os.remove(eval('getcwd()') .. '/foo') --cleanup
end)
end)
@@ -23,7 +24,7 @@ describe('u_* functions', function()
local session = spawn({nvim_prog, '-u', 'NONE', '-i', 'NONE', '--embed',
'-c', 'set undodir=. undofile'})
set_session(session)
- execute('echo "True"') -- Should not error out due to crashed Neovim
+ command('echo "True"') -- Should not error out due to crashed Neovim
session:close()
end)
end)
diff --git a/test/functional/ex_cmds/wviminfo_spec.lua b/test/functional/ex_cmds/wviminfo_spec.lua
index 37f45da2d4..df0b9df5dd 100644
--- a/test/functional/ex_cmds/wviminfo_spec.lua
+++ b/test/functional/ex_cmds/wviminfo_spec.lua
@@ -1,31 +1,30 @@
local helpers = require('test.functional.helpers')(after_each)
local lfs = require('lfs')
-local execute, eq, neq, spawn, nvim_prog, set_session, wait, write_file
- = helpers.execute, helpers.eq, helpers.neq, helpers.spawn,
- helpers.nvim_prog, helpers.set_session, helpers.wait, helpers.write_file
+local command, eq, neq, spawn, nvim_prog, set_session, write_file =
+ helpers.command, helpers.eq, helpers.neq, helpers.spawn,
+ helpers.nvim_prog, helpers.set_session, helpers.write_file
+local iswin = helpers.iswin
+local read_file = helpers.read_file
describe(':wshada', function()
local shada_file = 'wshada_test'
local session
before_each(function()
- if session then
- session:close()
- end
-
-- Override the default session because we need 'swapfile' for these tests.
- session = spawn({nvim_prog, '-u', 'NONE', '-i', '/dev/null', '--embed',
+ session = spawn({nvim_prog, '-u', 'NONE', '-i', iswin() and 'nul' or '/dev/null', '--embed',
'--cmd', 'set swapfile'})
set_session(session)
-
+ end)
+ after_each(function ()
+ session:close()
os.remove(shada_file)
end)
it('creates a shada file', function()
-- file should _not_ exist
eq(nil, lfs.attributes(shada_file))
- execute('wsh! '..shada_file)
- wait()
+ command('wsh! '..shada_file)
-- file _should_ exist
neq(nil, lfs.attributes(shada_file))
end)
@@ -37,11 +36,10 @@ describe(':wshada', function()
write_file(shada_file, text)
-- sanity check
- eq(text, io.open(shada_file):read())
+ eq(text, read_file(shada_file))
neq(nil, lfs.attributes(shada_file))
- execute('wsh! '..shada_file)
- wait()
+ command('wsh! '..shada_file)
-- File should have been overwritten with a shada file.
local fp = io.open(shada_file, 'r')
@@ -51,8 +49,4 @@ describe(':wshada', function()
assert(char1:byte() == 0x01,
shada_file..' should be a shada file')
end)
-
- teardown(function()
- os.remove(shada_file)
- end)
end)
diff --git a/test/functional/fixtures/CMakeLists.txt b/test/functional/fixtures/CMakeLists.txt
index 70aee6efa9..8537ea390f 100644
--- a/test/functional/fixtures/CMakeLists.txt
+++ b/test/functional/fixtures/CMakeLists.txt
@@ -2,3 +2,4 @@ add_executable(tty-test tty-test.c)
target_link_libraries(tty-test ${LIBUV_LIBRARIES})
add_executable(shell-test shell-test.c)
+add_executable(printargs-test printargs-test.c)
diff --git a/test/functional/fixtures/api_level_0.mpack b/test/functional/fixtures/api_level_0.mpack
new file mode 100644
index 0000000000..75b236a3c1
--- /dev/null
+++ b/test/functional/fixtures/api_level_0.mpack
Binary files differ
diff --git a/test/functional/fixtures/api_level_1.mpack b/test/functional/fixtures/api_level_1.mpack
new file mode 100644
index 0000000000..66ea9c2e5d
--- /dev/null
+++ b/test/functional/fixtures/api_level_1.mpack
Binary files differ
diff --git a/test/functional/fixtures/api_level_2.mpack b/test/functional/fixtures/api_level_2.mpack
new file mode 100644
index 0000000000..0ca2ba8866
--- /dev/null
+++ b/test/functional/fixtures/api_level_2.mpack
Binary files differ
diff --git a/test/functional/fixtures/api_level_3.mpack b/test/functional/fixtures/api_level_3.mpack
new file mode 100644
index 0000000000..ef36b99c8c
--- /dev/null
+++ b/test/functional/fixtures/api_level_3.mpack
Binary files differ
diff --git a/test/functional/fixtures/api_level_4.mpack b/test/functional/fixtures/api_level_4.mpack
new file mode 100644
index 0000000000..9551496ffd
--- /dev/null
+++ b/test/functional/fixtures/api_level_4.mpack
Binary files differ
diff --git a/test/functional/fixtures/api_level_5.mpack b/test/functional/fixtures/api_level_5.mpack
new file mode 100644
index 0000000000..497f4acffb
--- /dev/null
+++ b/test/functional/fixtures/api_level_5.mpack
Binary files differ
diff --git a/test/functional/fixtures/autoload/health/broken.vim b/test/functional/fixtures/autoload/health/broken.vim
new file mode 100644
index 0000000000..a2a595b96f
--- /dev/null
+++ b/test/functional/fixtures/autoload/health/broken.vim
@@ -0,0 +1,3 @@
+function! health#broken#check()
+ throw 'caused an error'
+endfunction
diff --git a/test/functional/fixtures/autoload/health/success1.vim b/test/functional/fixtures/autoload/health/success1.vim
new file mode 100644
index 0000000000..a360347455
--- /dev/null
+++ b/test/functional/fixtures/autoload/health/success1.vim
@@ -0,0 +1,6 @@
+function! health#success1#check()
+ call health#report_start("report 1")
+ call health#report_ok("everything is fine")
+ call health#report_start("report 2")
+ call health#report_ok("nothing to see here")
+endfunction
diff --git a/test/functional/fixtures/autoload/health/success2.vim b/test/functional/fixtures/autoload/health/success2.vim
new file mode 100644
index 0000000000..b742b4879d
--- /dev/null
+++ b/test/functional/fixtures/autoload/health/success2.vim
@@ -0,0 +1,4 @@
+function! health#success2#check()
+ call health#report_start("another 1")
+ call health#report_ok("ok")
+endfunction
diff --git a/test/functional/fixtures/autoload/provider/clipboard.vim b/test/functional/fixtures/autoload/provider/clipboard.vim
index 0935ea45ff..6d777255c8 100644
--- a/test/functional/fixtures/autoload/provider/clipboard.vim
+++ b/test/functional/fixtures/autoload/provider/clipboard.vim
@@ -5,21 +5,28 @@ let s:methods = {}
let g:cliplossy = 0
let g:cliperror = 0
+" Count how many times the clipboard was invoked.
+let g:clip_called_get = 0
+let g:clip_called_set = 0
+
function! s:methods.get(reg)
+ let g:clip_called_get += 1
+
if g:cliperror
return 0
end
- let reg = a:reg == '"' ? '+' : a:reg
if g:cliplossy
" behave like pure text clipboard
- return g:test_clip[reg][0]
+ return g:test_clip[a:reg][0]
else
" behave like VIMENC clipboard
- return g:test_clip[reg]
+ return g:test_clip[a:reg]
end
endfunction
function! s:methods.set(lines, regtype, reg)
+ let g:clip_called_set += 1
+
if a:reg == '"'
call s:methods.set(a:lines,a:regtype,'+')
call s:methods.set(a:lines,a:regtype,'*')
diff --git a/test/functional/fixtures/bigfile.txt b/test/functional/fixtures/bigfile.txt
new file mode 100644
index 0000000000..a756976461
--- /dev/null
+++ b/test/functional/fixtures/bigfile.txt
@@ -0,0 +1,30592 @@
+0000;<control>;Cc;0;BN;;;;;N;NULL;;;;
+0001;<control>;Cc;0;BN;;;;;N;START OF HEADING;;;;
+0002;<control>;Cc;0;BN;;;;;N;START OF TEXT;;;;
+0003;<control>;Cc;0;BN;;;;;N;END OF TEXT;;;;
+0004;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION;;;;
+0005;<control>;Cc;0;BN;;;;;N;ENQUIRY;;;;
+0006;<control>;Cc;0;BN;;;;;N;ACKNOWLEDGE;;;;
+0007;<control>;Cc;0;BN;;;;;N;BELL;;;;
+0008;<control>;Cc;0;BN;;;;;N;BACKSPACE;;;;
+0009;<control>;Cc;0;S;;;;;N;CHARACTER TABULATION;;;;
+000A;<control>;Cc;0;B;;;;;N;LINE FEED (LF);;;;
+000B;<control>;Cc;0;S;;;;;N;LINE TABULATION;;;;
+000C;<control>;Cc;0;WS;;;;;N;FORM FEED (FF);;;;
+000D;<control>;Cc;0;B;;;;;N;CARRIAGE RETURN (CR);;;;
+000E;<control>;Cc;0;BN;;;;;N;SHIFT OUT;;;;
+000F;<control>;Cc;0;BN;;;;;N;SHIFT IN;;;;
+0010;<control>;Cc;0;BN;;;;;N;DATA LINK ESCAPE;;;;
+0011;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL ONE;;;;
+0012;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL TWO;;;;
+0013;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL THREE;;;;
+0014;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL FOUR;;;;
+0015;<control>;Cc;0;BN;;;;;N;NEGATIVE ACKNOWLEDGE;;;;
+0016;<control>;Cc;0;BN;;;;;N;SYNCHRONOUS IDLE;;;;
+0017;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION BLOCK;;;;
+0018;<control>;Cc;0;BN;;;;;N;CANCEL;;;;
+0019;<control>;Cc;0;BN;;;;;N;END OF MEDIUM;;;;
+001A;<control>;Cc;0;BN;;;;;N;SUBSTITUTE;;;;
+001B;<control>;Cc;0;BN;;;;;N;ESCAPE;;;;
+001C;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR FOUR;;;;
+001D;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR THREE;;;;
+001E;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR TWO;;;;
+001F;<control>;Cc;0;S;;;;;N;INFORMATION SEPARATOR ONE;;;;
+0020;SPACE;Zs;0;WS;;;;;N;;;;;
+0021;EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+0022;QUOTATION MARK;Po;0;ON;;;;;N;;;;;
+0023;NUMBER SIGN;Po;0;ET;;;;;N;;;;;
+0024;DOLLAR SIGN;Sc;0;ET;;;;;N;;;;;
+0025;PERCENT SIGN;Po;0;ET;;;;;N;;;;;
+0026;AMPERSAND;Po;0;ON;;;;;N;;;;;
+0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;;
+0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;;
+0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;;
+002A;ASTERISK;Po;0;ON;;;;;N;;;;;
+002B;PLUS SIGN;Sm;0;ES;;;;;N;;;;;
+002C;COMMA;Po;0;CS;;;;;N;;;;;
+002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;;
+002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;;
+002F;SOLIDUS;Po;0;CS;;;;;N;SLASH;;;;
+0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;;
+0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;;
+0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;;
+0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;;
+0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;;
+0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;;
+0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;;
+0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;;
+0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;;
+0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;;
+003A;COLON;Po;0;CS;;;;;N;;;;;
+003B;SEMICOLON;Po;0;ON;;;;;N;;;;;
+003C;LESS-THAN SIGN;Sm;0;ON;;;;;Y;;;;;
+003D;EQUALS SIGN;Sm;0;ON;;;;;N;;;;;
+003E;GREATER-THAN SIGN;Sm;0;ON;;;;;Y;;;;;
+003F;QUESTION MARK;Po;0;ON;;;;;N;;;;;
+0040;COMMERCIAL AT;Po;0;ON;;;;;N;;;;;
+0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061;
+0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062;
+0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063;
+0044;LATIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;0064;
+0045;LATIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;0065;
+0046;LATIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;0066;
+0047;LATIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;0067;
+0048;LATIN CAPITAL LETTER H;Lu;0;L;;;;;N;;;;0068;
+0049;LATIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;0069;
+004A;LATIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;006A;
+004B;LATIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;006B;
+004C;LATIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;006C;
+004D;LATIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;006D;
+004E;LATIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;006E;
+004F;LATIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;006F;
+0050;LATIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;0070;
+0051;LATIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;0071;
+0052;LATIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;0072;
+0053;LATIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;0073;
+0054;LATIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;0074;
+0055;LATIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0075;
+0056;LATIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;0076;
+0057;LATIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;0077;
+0058;LATIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;0078;
+0059;LATIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;0079;
+005A;LATIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;007A;
+005B;LEFT SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING SQUARE BRACKET;;;;
+005C;REVERSE SOLIDUS;Po;0;ON;;;;;N;BACKSLASH;;;;
+005D;RIGHT SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING SQUARE BRACKET;;;;
+005E;CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;SPACING CIRCUMFLEX;;;;
+005F;LOW LINE;Pc;0;ON;;;;;N;SPACING UNDERSCORE;;;;
+0060;GRAVE ACCENT;Sk;0;ON;;;;;N;SPACING GRAVE;;;;
+0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041
+0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042
+0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043
+0064;LATIN SMALL LETTER D;Ll;0;L;;;;;N;;;0044;;0044
+0065;LATIN SMALL LETTER E;Ll;0;L;;;;;N;;;0045;;0045
+0066;LATIN SMALL LETTER F;Ll;0;L;;;;;N;;;0046;;0046
+0067;LATIN SMALL LETTER G;Ll;0;L;;;;;N;;;0047;;0047
+0068;LATIN SMALL LETTER H;Ll;0;L;;;;;N;;;0048;;0048
+0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049
+006A;LATIN SMALL LETTER J;Ll;0;L;;;;;N;;;004A;;004A
+006B;LATIN SMALL LETTER K;Ll;0;L;;;;;N;;;004B;;004B
+006C;LATIN SMALL LETTER L;Ll;0;L;;;;;N;;;004C;;004C
+006D;LATIN SMALL LETTER M;Ll;0;L;;;;;N;;;004D;;004D
+006E;LATIN SMALL LETTER N;Ll;0;L;;;;;N;;;004E;;004E
+006F;LATIN SMALL LETTER O;Ll;0;L;;;;;N;;;004F;;004F
+0070;LATIN SMALL LETTER P;Ll;0;L;;;;;N;;;0050;;0050
+0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051
+0072;LATIN SMALL LETTER R;Ll;0;L;;;;;N;;;0052;;0052
+0073;LATIN SMALL LETTER S;Ll;0;L;;;;;N;;;0053;;0053
+0074;LATIN SMALL LETTER T;Ll;0;L;;;;;N;;;0054;;0054
+0075;LATIN SMALL LETTER U;Ll;0;L;;;;;N;;;0055;;0055
+0076;LATIN SMALL LETTER V;Ll;0;L;;;;;N;;;0056;;0056
+0077;LATIN SMALL LETTER W;Ll;0;L;;;;;N;;;0057;;0057
+0078;LATIN SMALL LETTER X;Ll;0;L;;;;;N;;;0058;;0058
+0079;LATIN SMALL LETTER Y;Ll;0;L;;;;;N;;;0059;;0059
+007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A
+007B;LEFT CURLY BRACKET;Ps;0;ON;;;;;Y;OPENING CURLY BRACKET;;;;
+007C;VERTICAL LINE;Sm;0;ON;;;;;N;VERTICAL BAR;;;;
+007D;RIGHT CURLY BRACKET;Pe;0;ON;;;;;Y;CLOSING CURLY BRACKET;;;;
+007E;TILDE;Sm;0;ON;;;;;N;;;;;
+007F;<control>;Cc;0;BN;;;;;N;DELETE;;;;
+0080;<control>;Cc;0;BN;;;;;N;;;;;
+0081;<control>;Cc;0;BN;;;;;N;;;;;
+0082;<control>;Cc;0;BN;;;;;N;BREAK PERMITTED HERE;;;;
+0083;<control>;Cc;0;BN;;;;;N;NO BREAK HERE;;;;
+0084;<control>;Cc;0;BN;;;;;N;;;;;
+0085;<control>;Cc;0;B;;;;;N;NEXT LINE (NEL);;;;
+0086;<control>;Cc;0;BN;;;;;N;START OF SELECTED AREA;;;;
+0087;<control>;Cc;0;BN;;;;;N;END OF SELECTED AREA;;;;
+0088;<control>;Cc;0;BN;;;;;N;CHARACTER TABULATION SET;;;;
+0089;<control>;Cc;0;BN;;;;;N;CHARACTER TABULATION WITH JUSTIFICATION;;;;
+008A;<control>;Cc;0;BN;;;;;N;LINE TABULATION SET;;;;
+008B;<control>;Cc;0;BN;;;;;N;PARTIAL LINE FORWARD;;;;
+008C;<control>;Cc;0;BN;;;;;N;PARTIAL LINE BACKWARD;;;;
+008D;<control>;Cc;0;BN;;;;;N;REVERSE LINE FEED;;;;
+008E;<control>;Cc;0;BN;;;;;N;SINGLE SHIFT TWO;;;;
+008F;<control>;Cc;0;BN;;;;;N;SINGLE SHIFT THREE;;;;
+0090;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL STRING;;;;
+0091;<control>;Cc;0;BN;;;;;N;PRIVATE USE ONE;;;;
+0092;<control>;Cc;0;BN;;;;;N;PRIVATE USE TWO;;;;
+0093;<control>;Cc;0;BN;;;;;N;SET TRANSMIT STATE;;;;
+0094;<control>;Cc;0;BN;;;;;N;CANCEL CHARACTER;;;;
+0095;<control>;Cc;0;BN;;;;;N;MESSAGE WAITING;;;;
+0096;<control>;Cc;0;BN;;;;;N;START OF GUARDED AREA;;;;
+0097;<control>;Cc;0;BN;;;;;N;END OF GUARDED AREA;;;;
+0098;<control>;Cc;0;BN;;;;;N;START OF STRING;;;;
+0099;<control>;Cc;0;BN;;;;;N;;;;;
+009A;<control>;Cc;0;BN;;;;;N;SINGLE CHARACTER INTRODUCER;;;;
+009B;<control>;Cc;0;BN;;;;;N;CONTROL SEQUENCE INTRODUCER;;;;
+009C;<control>;Cc;0;BN;;;;;N;STRING TERMINATOR;;;;
+009D;<control>;Cc;0;BN;;;;;N;OPERATING SYSTEM COMMAND;;;;
+009E;<control>;Cc;0;BN;;;;;N;PRIVACY MESSAGE;;;;
+009F;<control>;Cc;0;BN;;;;;N;APPLICATION PROGRAM COMMAND;;;;
+00A0;NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;NON-BREAKING SPACE;;;;
+00A1;INVERTED EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+00A2;CENT SIGN;Sc;0;ET;;;;;N;;;;;
+00A3;POUND SIGN;Sc;0;ET;;;;;N;;;;;
+00A4;CURRENCY SIGN;Sc;0;ET;;;;;N;;;;;
+00A5;YEN SIGN;Sc;0;ET;;;;;N;;;;;
+00A6;BROKEN BAR;So;0;ON;;;;;N;BROKEN VERTICAL BAR;;;;
+00A7;SECTION SIGN;Po;0;ON;;;;;N;;;;;
+00A8;DIAERESIS;Sk;0;ON;<compat> 0020 0308;;;;N;SPACING DIAERESIS;;;;
+00A9;COPYRIGHT SIGN;So;0;ON;;;;;N;;;;;
+00AA;FEMININE ORDINAL INDICATOR;Lo;0;L;<super> 0061;;;;N;;;;;
+00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;;;;
+00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;;
+00AD;SOFT HYPHEN;Cf;0;BN;;;;;N;;;;;
+00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;;
+00AF;MACRON;Sk;0;ON;<compat> 0020 0304;;;;N;SPACING MACRON;;;;
+00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;;
+00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;;
+00B2;SUPERSCRIPT TWO;No;0;EN;<super> 0032;;2;2;N;SUPERSCRIPT DIGIT TWO;;;;
+00B3;SUPERSCRIPT THREE;No;0;EN;<super> 0033;;3;3;N;SUPERSCRIPT DIGIT THREE;;;;
+00B4;ACUTE ACCENT;Sk;0;ON;<compat> 0020 0301;;;;N;SPACING ACUTE;;;;
+00B5;MICRO SIGN;Ll;0;L;<compat> 03BC;;;;N;;;039C;;039C
+00B6;PILCROW SIGN;Po;0;ON;;;;;N;PARAGRAPH SIGN;;;;
+00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;;
+00B8;CEDILLA;Sk;0;ON;<compat> 0020 0327;;;;N;SPACING CEDILLA;;;;
+00B9;SUPERSCRIPT ONE;No;0;EN;<super> 0031;;1;1;N;SUPERSCRIPT DIGIT ONE;;;;
+00BA;MASCULINE ORDINAL INDICATOR;Lo;0;L;<super> 006F;;;;N;;;;;
+00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;;;;
+00BC;VULGAR FRACTION ONE QUARTER;No;0;ON;<fraction> 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;;
+00BD;VULGAR FRACTION ONE HALF;No;0;ON;<fraction> 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;;
+00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON;<fraction> 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;;
+00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;;
+00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0;
+00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1;
+00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2;
+00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3;
+00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4;
+00C5;LATIN CAPITAL LETTER A WITH RING ABOVE;Lu;0;L;0041 030A;;;;N;LATIN CAPITAL LETTER A RING;;;00E5;
+00C6;LATIN CAPITAL LETTER AE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER A E;;;00E6;
+00C7;LATIN CAPITAL LETTER C WITH CEDILLA;Lu;0;L;0043 0327;;;;N;LATIN CAPITAL LETTER C CEDILLA;;;00E7;
+00C8;LATIN CAPITAL LETTER E WITH GRAVE;Lu;0;L;0045 0300;;;;N;LATIN CAPITAL LETTER E GRAVE;;;00E8;
+00C9;LATIN CAPITAL LETTER E WITH ACUTE;Lu;0;L;0045 0301;;;;N;LATIN CAPITAL LETTER E ACUTE;;;00E9;
+00CA;LATIN CAPITAL LETTER E WITH CIRCUMFLEX;Lu;0;L;0045 0302;;;;N;LATIN CAPITAL LETTER E CIRCUMFLEX;;;00EA;
+00CB;LATIN CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;0045 0308;;;;N;LATIN CAPITAL LETTER E DIAERESIS;;;00EB;
+00CC;LATIN CAPITAL LETTER I WITH GRAVE;Lu;0;L;0049 0300;;;;N;LATIN CAPITAL LETTER I GRAVE;;;00EC;
+00CD;LATIN CAPITAL LETTER I WITH ACUTE;Lu;0;L;0049 0301;;;;N;LATIN CAPITAL LETTER I ACUTE;;;00ED;
+00CE;LATIN CAPITAL LETTER I WITH CIRCUMFLEX;Lu;0;L;0049 0302;;;;N;LATIN CAPITAL LETTER I CIRCUMFLEX;;;00EE;
+00CF;LATIN CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0049 0308;;;;N;LATIN CAPITAL LETTER I DIAERESIS;;;00EF;
+00D0;LATIN CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;00F0;
+00D1;LATIN CAPITAL LETTER N WITH TILDE;Lu;0;L;004E 0303;;;;N;LATIN CAPITAL LETTER N TILDE;;;00F1;
+00D2;LATIN CAPITAL LETTER O WITH GRAVE;Lu;0;L;004F 0300;;;;N;LATIN CAPITAL LETTER O GRAVE;;;00F2;
+00D3;LATIN CAPITAL LETTER O WITH ACUTE;Lu;0;L;004F 0301;;;;N;LATIN CAPITAL LETTER O ACUTE;;;00F3;
+00D4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX;Lu;0;L;004F 0302;;;;N;LATIN CAPITAL LETTER O CIRCUMFLEX;;;00F4;
+00D5;LATIN CAPITAL LETTER O WITH TILDE;Lu;0;L;004F 0303;;;;N;LATIN CAPITAL LETTER O TILDE;;;00F5;
+00D6;LATIN CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;004F 0308;;;;N;LATIN CAPITAL LETTER O DIAERESIS;;;00F6;
+00D7;MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;;
+00D8;LATIN CAPITAL LETTER O WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O SLASH;;;00F8;
+00D9;LATIN CAPITAL LETTER U WITH GRAVE;Lu;0;L;0055 0300;;;;N;LATIN CAPITAL LETTER U GRAVE;;;00F9;
+00DA;LATIN CAPITAL LETTER U WITH ACUTE;Lu;0;L;0055 0301;;;;N;LATIN CAPITAL LETTER U ACUTE;;;00FA;
+00DB;LATIN CAPITAL LETTER U WITH CIRCUMFLEX;Lu;0;L;0055 0302;;;;N;LATIN CAPITAL LETTER U CIRCUMFLEX;;;00FB;
+00DC;LATIN CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0055 0308;;;;N;LATIN CAPITAL LETTER U DIAERESIS;;;00FC;
+00DD;LATIN CAPITAL LETTER Y WITH ACUTE;Lu;0;L;0059 0301;;;;N;LATIN CAPITAL LETTER Y ACUTE;;;00FD;
+00DE;LATIN CAPITAL LETTER THORN;Lu;0;L;;;;;N;;;;00FE;
+00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;;;;
+00E0;LATIN SMALL LETTER A WITH GRAVE;Ll;0;L;0061 0300;;;;N;LATIN SMALL LETTER A GRAVE;;00C0;;00C0
+00E1;LATIN SMALL LETTER A WITH ACUTE;Ll;0;L;0061 0301;;;;N;LATIN SMALL LETTER A ACUTE;;00C1;;00C1
+00E2;LATIN SMALL LETTER A WITH CIRCUMFLEX;Ll;0;L;0061 0302;;;;N;LATIN SMALL LETTER A CIRCUMFLEX;;00C2;;00C2
+00E3;LATIN SMALL LETTER A WITH TILDE;Ll;0;L;0061 0303;;;;N;LATIN SMALL LETTER A TILDE;;00C3;;00C3
+00E4;LATIN SMALL LETTER A WITH DIAERESIS;Ll;0;L;0061 0308;;;;N;LATIN SMALL LETTER A DIAERESIS;;00C4;;00C4
+00E5;LATIN SMALL LETTER A WITH RING ABOVE;Ll;0;L;0061 030A;;;;N;LATIN SMALL LETTER A RING;;00C5;;00C5
+00E6;LATIN SMALL LETTER AE;Ll;0;L;;;;;N;LATIN SMALL LETTER A E;;00C6;;00C6
+00E7;LATIN SMALL LETTER C WITH CEDILLA;Ll;0;L;0063 0327;;;;N;LATIN SMALL LETTER C CEDILLA;;00C7;;00C7
+00E8;LATIN SMALL LETTER E WITH GRAVE;Ll;0;L;0065 0300;;;;N;LATIN SMALL LETTER E GRAVE;;00C8;;00C8
+00E9;LATIN SMALL LETTER E WITH ACUTE;Ll;0;L;0065 0301;;;;N;LATIN SMALL LETTER E ACUTE;;00C9;;00C9
+00EA;LATIN SMALL LETTER E WITH CIRCUMFLEX;Ll;0;L;0065 0302;;;;N;LATIN SMALL LETTER E CIRCUMFLEX;;00CA;;00CA
+00EB;LATIN SMALL LETTER E WITH DIAERESIS;Ll;0;L;0065 0308;;;;N;LATIN SMALL LETTER E DIAERESIS;;00CB;;00CB
+00EC;LATIN SMALL LETTER I WITH GRAVE;Ll;0;L;0069 0300;;;;N;LATIN SMALL LETTER I GRAVE;;00CC;;00CC
+00ED;LATIN SMALL LETTER I WITH ACUTE;Ll;0;L;0069 0301;;;;N;LATIN SMALL LETTER I ACUTE;;00CD;;00CD
+00EE;LATIN SMALL LETTER I WITH CIRCUMFLEX;Ll;0;L;0069 0302;;;;N;LATIN SMALL LETTER I CIRCUMFLEX;;00CE;;00CE
+00EF;LATIN SMALL LETTER I WITH DIAERESIS;Ll;0;L;0069 0308;;;;N;LATIN SMALL LETTER I DIAERESIS;;00CF;;00CF
+00F0;LATIN SMALL LETTER ETH;Ll;0;L;;;;;N;;;00D0;;00D0
+00F1;LATIN SMALL LETTER N WITH TILDE;Ll;0;L;006E 0303;;;;N;LATIN SMALL LETTER N TILDE;;00D1;;00D1
+00F2;LATIN SMALL LETTER O WITH GRAVE;Ll;0;L;006F 0300;;;;N;LATIN SMALL LETTER O GRAVE;;00D2;;00D2
+00F3;LATIN SMALL LETTER O WITH ACUTE;Ll;0;L;006F 0301;;;;N;LATIN SMALL LETTER O ACUTE;;00D3;;00D3
+00F4;LATIN SMALL LETTER O WITH CIRCUMFLEX;Ll;0;L;006F 0302;;;;N;LATIN SMALL LETTER O CIRCUMFLEX;;00D4;;00D4
+00F5;LATIN SMALL LETTER O WITH TILDE;Ll;0;L;006F 0303;;;;N;LATIN SMALL LETTER O TILDE;;00D5;;00D5
+00F6;LATIN SMALL LETTER O WITH DIAERESIS;Ll;0;L;006F 0308;;;;N;LATIN SMALL LETTER O DIAERESIS;;00D6;;00D6
+00F7;DIVISION SIGN;Sm;0;ON;;;;;N;;;;;
+00F8;LATIN SMALL LETTER O WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER O SLASH;;00D8;;00D8
+00F9;LATIN SMALL LETTER U WITH GRAVE;Ll;0;L;0075 0300;;;;N;LATIN SMALL LETTER U GRAVE;;00D9;;00D9
+00FA;LATIN SMALL LETTER U WITH ACUTE;Ll;0;L;0075 0301;;;;N;LATIN SMALL LETTER U ACUTE;;00DA;;00DA
+00FB;LATIN SMALL LETTER U WITH CIRCUMFLEX;Ll;0;L;0075 0302;;;;N;LATIN SMALL LETTER U CIRCUMFLEX;;00DB;;00DB
+00FC;LATIN SMALL LETTER U WITH DIAERESIS;Ll;0;L;0075 0308;;;;N;LATIN SMALL LETTER U DIAERESIS;;00DC;;00DC
+00FD;LATIN SMALL LETTER Y WITH ACUTE;Ll;0;L;0079 0301;;;;N;LATIN SMALL LETTER Y ACUTE;;00DD;;00DD
+00FE;LATIN SMALL LETTER THORN;Ll;0;L;;;;;N;;;00DE;;00DE
+00FF;LATIN SMALL LETTER Y WITH DIAERESIS;Ll;0;L;0079 0308;;;;N;LATIN SMALL LETTER Y DIAERESIS;;0178;;0178
+0100;LATIN CAPITAL LETTER A WITH MACRON;Lu;0;L;0041 0304;;;;N;LATIN CAPITAL LETTER A MACRON;;;0101;
+0101;LATIN SMALL LETTER A WITH MACRON;Ll;0;L;0061 0304;;;;N;LATIN SMALL LETTER A MACRON;;0100;;0100
+0102;LATIN CAPITAL LETTER A WITH BREVE;Lu;0;L;0041 0306;;;;N;LATIN CAPITAL LETTER A BREVE;;;0103;
+0103;LATIN SMALL LETTER A WITH BREVE;Ll;0;L;0061 0306;;;;N;LATIN SMALL LETTER A BREVE;;0102;;0102
+0104;LATIN CAPITAL LETTER A WITH OGONEK;Lu;0;L;0041 0328;;;;N;LATIN CAPITAL LETTER A OGONEK;;;0105;
+0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104
+0106;LATIN CAPITAL LETTER C WITH ACUTE;Lu;0;L;0043 0301;;;;N;LATIN CAPITAL LETTER C ACUTE;;;0107;
+0107;LATIN SMALL LETTER C WITH ACUTE;Ll;0;L;0063 0301;;;;N;LATIN SMALL LETTER C ACUTE;;0106;;0106
+0108;LATIN CAPITAL LETTER C WITH CIRCUMFLEX;Lu;0;L;0043 0302;;;;N;LATIN CAPITAL LETTER C CIRCUMFLEX;;;0109;
+0109;LATIN SMALL LETTER C WITH CIRCUMFLEX;Ll;0;L;0063 0302;;;;N;LATIN SMALL LETTER C CIRCUMFLEX;;0108;;0108
+010A;LATIN CAPITAL LETTER C WITH DOT ABOVE;Lu;0;L;0043 0307;;;;N;LATIN CAPITAL LETTER C DOT;;;010B;
+010B;LATIN SMALL LETTER C WITH DOT ABOVE;Ll;0;L;0063 0307;;;;N;LATIN SMALL LETTER C DOT;;010A;;010A
+010C;LATIN CAPITAL LETTER C WITH CARON;Lu;0;L;0043 030C;;;;N;LATIN CAPITAL LETTER C HACEK;;;010D;
+010D;LATIN SMALL LETTER C WITH CARON;Ll;0;L;0063 030C;;;;N;LATIN SMALL LETTER C HACEK;;010C;;010C
+010E;LATIN CAPITAL LETTER D WITH CARON;Lu;0;L;0044 030C;;;;N;LATIN CAPITAL LETTER D HACEK;;;010F;
+010F;LATIN SMALL LETTER D WITH CARON;Ll;0;L;0064 030C;;;;N;LATIN SMALL LETTER D HACEK;;010E;;010E
+0110;LATIN CAPITAL LETTER D WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D BAR;;;0111;
+0111;LATIN SMALL LETTER D WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER D BAR;;0110;;0110
+0112;LATIN CAPITAL LETTER E WITH MACRON;Lu;0;L;0045 0304;;;;N;LATIN CAPITAL LETTER E MACRON;;;0113;
+0113;LATIN SMALL LETTER E WITH MACRON;Ll;0;L;0065 0304;;;;N;LATIN SMALL LETTER E MACRON;;0112;;0112
+0114;LATIN CAPITAL LETTER E WITH BREVE;Lu;0;L;0045 0306;;;;N;LATIN CAPITAL LETTER E BREVE;;;0115;
+0115;LATIN SMALL LETTER E WITH BREVE;Ll;0;L;0065 0306;;;;N;LATIN SMALL LETTER E BREVE;;0114;;0114
+0116;LATIN CAPITAL LETTER E WITH DOT ABOVE;Lu;0;L;0045 0307;;;;N;LATIN CAPITAL LETTER E DOT;;;0117;
+0117;LATIN SMALL LETTER E WITH DOT ABOVE;Ll;0;L;0065 0307;;;;N;LATIN SMALL LETTER E DOT;;0116;;0116
+0118;LATIN CAPITAL LETTER E WITH OGONEK;Lu;0;L;0045 0328;;;;N;LATIN CAPITAL LETTER E OGONEK;;;0119;
+0119;LATIN SMALL LETTER E WITH OGONEK;Ll;0;L;0065 0328;;;;N;LATIN SMALL LETTER E OGONEK;;0118;;0118
+011A;LATIN CAPITAL LETTER E WITH CARON;Lu;0;L;0045 030C;;;;N;LATIN CAPITAL LETTER E HACEK;;;011B;
+011B;LATIN SMALL LETTER E WITH CARON;Ll;0;L;0065 030C;;;;N;LATIN SMALL LETTER E HACEK;;011A;;011A
+011C;LATIN CAPITAL LETTER G WITH CIRCUMFLEX;Lu;0;L;0047 0302;;;;N;LATIN CAPITAL LETTER G CIRCUMFLEX;;;011D;
+011D;LATIN SMALL LETTER G WITH CIRCUMFLEX;Ll;0;L;0067 0302;;;;N;LATIN SMALL LETTER G CIRCUMFLEX;;011C;;011C
+011E;LATIN CAPITAL LETTER G WITH BREVE;Lu;0;L;0047 0306;;;;N;LATIN CAPITAL LETTER G BREVE;;;011F;
+011F;LATIN SMALL LETTER G WITH BREVE;Ll;0;L;0067 0306;;;;N;LATIN SMALL LETTER G BREVE;;011E;;011E
+0120;LATIN CAPITAL LETTER G WITH DOT ABOVE;Lu;0;L;0047 0307;;;;N;LATIN CAPITAL LETTER G DOT;;;0121;
+0121;LATIN SMALL LETTER G WITH DOT ABOVE;Ll;0;L;0067 0307;;;;N;LATIN SMALL LETTER G DOT;;0120;;0120
+0122;LATIN CAPITAL LETTER G WITH CEDILLA;Lu;0;L;0047 0327;;;;N;LATIN CAPITAL LETTER G CEDILLA;;;0123;
+0123;LATIN SMALL LETTER G WITH CEDILLA;Ll;0;L;0067 0327;;;;N;LATIN SMALL LETTER G CEDILLA;;0122;;0122
+0124;LATIN CAPITAL LETTER H WITH CIRCUMFLEX;Lu;0;L;0048 0302;;;;N;LATIN CAPITAL LETTER H CIRCUMFLEX;;;0125;
+0125;LATIN SMALL LETTER H WITH CIRCUMFLEX;Ll;0;L;0068 0302;;;;N;LATIN SMALL LETTER H CIRCUMFLEX;;0124;;0124
+0126;LATIN CAPITAL LETTER H WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER H BAR;;;0127;
+0127;LATIN SMALL LETTER H WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER H BAR;;0126;;0126
+0128;LATIN CAPITAL LETTER I WITH TILDE;Lu;0;L;0049 0303;;;;N;LATIN CAPITAL LETTER I TILDE;;;0129;
+0129;LATIN SMALL LETTER I WITH TILDE;Ll;0;L;0069 0303;;;;N;LATIN SMALL LETTER I TILDE;;0128;;0128
+012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B;
+012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A
+012C;LATIN CAPITAL LETTER I WITH BREVE;Lu;0;L;0049 0306;;;;N;LATIN CAPITAL LETTER I BREVE;;;012D;
+012D;LATIN SMALL LETTER I WITH BREVE;Ll;0;L;0069 0306;;;;N;LATIN SMALL LETTER I BREVE;;012C;;012C
+012E;LATIN CAPITAL LETTER I WITH OGONEK;Lu;0;L;0049 0328;;;;N;LATIN CAPITAL LETTER I OGONEK;;;012F;
+012F;LATIN SMALL LETTER I WITH OGONEK;Ll;0;L;0069 0328;;;;N;LATIN SMALL LETTER I OGONEK;;012E;;012E
+0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069;
+0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049
+0132;LATIN CAPITAL LIGATURE IJ;Lu;0;L;<compat> 0049 004A;;;;N;LATIN CAPITAL LETTER I J;;;0133;
+0133;LATIN SMALL LIGATURE IJ;Ll;0;L;<compat> 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132
+0134;LATIN CAPITAL LETTER J WITH CIRCUMFLEX;Lu;0;L;004A 0302;;;;N;LATIN CAPITAL LETTER J CIRCUMFLEX;;;0135;
+0135;LATIN SMALL LETTER J WITH CIRCUMFLEX;Ll;0;L;006A 0302;;;;N;LATIN SMALL LETTER J CIRCUMFLEX;;0134;;0134
+0136;LATIN CAPITAL LETTER K WITH CEDILLA;Lu;0;L;004B 0327;;;;N;LATIN CAPITAL LETTER K CEDILLA;;;0137;
+0137;LATIN SMALL LETTER K WITH CEDILLA;Ll;0;L;006B 0327;;;;N;LATIN SMALL LETTER K CEDILLA;;0136;;0136
+0138;LATIN SMALL LETTER KRA;Ll;0;L;;;;;N;;;;;
+0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A;
+013A;LATIN SMALL LETTER L WITH ACUTE;Ll;0;L;006C 0301;;;;N;LATIN SMALL LETTER L ACUTE;;0139;;0139
+013B;LATIN CAPITAL LETTER L WITH CEDILLA;Lu;0;L;004C 0327;;;;N;LATIN CAPITAL LETTER L CEDILLA;;;013C;
+013C;LATIN SMALL LETTER L WITH CEDILLA;Ll;0;L;006C 0327;;;;N;LATIN SMALL LETTER L CEDILLA;;013B;;013B
+013D;LATIN CAPITAL LETTER L WITH CARON;Lu;0;L;004C 030C;;;;N;LATIN CAPITAL LETTER L HACEK;;;013E;
+013E;LATIN SMALL LETTER L WITH CARON;Ll;0;L;006C 030C;;;;N;LATIN SMALL LETTER L HACEK;;013D;;013D
+013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L;<compat> 004C 00B7;;;;N;;;;0140;
+0140;LATIN SMALL LETTER L WITH MIDDLE DOT;Ll;0;L;<compat> 006C 00B7;;;;N;;;013F;;013F
+0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142;
+0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141
+0143;LATIN CAPITAL LETTER N WITH ACUTE;Lu;0;L;004E 0301;;;;N;LATIN CAPITAL LETTER N ACUTE;;;0144;
+0144;LATIN SMALL LETTER N WITH ACUTE;Ll;0;L;006E 0301;;;;N;LATIN SMALL LETTER N ACUTE;;0143;;0143
+0145;LATIN CAPITAL LETTER N WITH CEDILLA;Lu;0;L;004E 0327;;;;N;LATIN CAPITAL LETTER N CEDILLA;;;0146;
+0146;LATIN SMALL LETTER N WITH CEDILLA;Ll;0;L;006E 0327;;;;N;LATIN SMALL LETTER N CEDILLA;;0145;;0145
+0147;LATIN CAPITAL LETTER N WITH CARON;Lu;0;L;004E 030C;;;;N;LATIN CAPITAL LETTER N HACEK;;;0148;
+0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147
+0149;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE;Ll;0;L;<compat> 02BC 006E;;;;N;LATIN SMALL LETTER APOSTROPHE N;;;;
+014A;LATIN CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;014B;
+014B;LATIN SMALL LETTER ENG;Ll;0;L;;;;;N;;;014A;;014A
+014C;LATIN CAPITAL LETTER O WITH MACRON;Lu;0;L;004F 0304;;;;N;LATIN CAPITAL LETTER O MACRON;;;014D;
+014D;LATIN SMALL LETTER O WITH MACRON;Ll;0;L;006F 0304;;;;N;LATIN SMALL LETTER O MACRON;;014C;;014C
+014E;LATIN CAPITAL LETTER O WITH BREVE;Lu;0;L;004F 0306;;;;N;LATIN CAPITAL LETTER O BREVE;;;014F;
+014F;LATIN SMALL LETTER O WITH BREVE;Ll;0;L;006F 0306;;;;N;LATIN SMALL LETTER O BREVE;;014E;;014E
+0150;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE;Lu;0;L;004F 030B;;;;N;LATIN CAPITAL LETTER O DOUBLE ACUTE;;;0151;
+0151;LATIN SMALL LETTER O WITH DOUBLE ACUTE;Ll;0;L;006F 030B;;;;N;LATIN SMALL LETTER O DOUBLE ACUTE;;0150;;0150
+0152;LATIN CAPITAL LIGATURE OE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O E;;;0153;
+0153;LATIN SMALL LIGATURE OE;Ll;0;L;;;;;N;LATIN SMALL LETTER O E;;0152;;0152
+0154;LATIN CAPITAL LETTER R WITH ACUTE;Lu;0;L;0052 0301;;;;N;LATIN CAPITAL LETTER R ACUTE;;;0155;
+0155;LATIN SMALL LETTER R WITH ACUTE;Ll;0;L;0072 0301;;;;N;LATIN SMALL LETTER R ACUTE;;0154;;0154
+0156;LATIN CAPITAL LETTER R WITH CEDILLA;Lu;0;L;0052 0327;;;;N;LATIN CAPITAL LETTER R CEDILLA;;;0157;
+0157;LATIN SMALL LETTER R WITH CEDILLA;Ll;0;L;0072 0327;;;;N;LATIN SMALL LETTER R CEDILLA;;0156;;0156
+0158;LATIN CAPITAL LETTER R WITH CARON;Lu;0;L;0052 030C;;;;N;LATIN CAPITAL LETTER R HACEK;;;0159;
+0159;LATIN SMALL LETTER R WITH CARON;Ll;0;L;0072 030C;;;;N;LATIN SMALL LETTER R HACEK;;0158;;0158
+015A;LATIN CAPITAL LETTER S WITH ACUTE;Lu;0;L;0053 0301;;;;N;LATIN CAPITAL LETTER S ACUTE;;;015B;
+015B;LATIN SMALL LETTER S WITH ACUTE;Ll;0;L;0073 0301;;;;N;LATIN SMALL LETTER S ACUTE;;015A;;015A
+015C;LATIN CAPITAL LETTER S WITH CIRCUMFLEX;Lu;0;L;0053 0302;;;;N;LATIN CAPITAL LETTER S CIRCUMFLEX;;;015D;
+015D;LATIN SMALL LETTER S WITH CIRCUMFLEX;Ll;0;L;0073 0302;;;;N;LATIN SMALL LETTER S CIRCUMFLEX;;015C;;015C
+015E;LATIN CAPITAL LETTER S WITH CEDILLA;Lu;0;L;0053 0327;;;;N;LATIN CAPITAL LETTER S CEDILLA;;;015F;
+015F;LATIN SMALL LETTER S WITH CEDILLA;Ll;0;L;0073 0327;;;;N;LATIN SMALL LETTER S CEDILLA;;015E;;015E
+0160;LATIN CAPITAL LETTER S WITH CARON;Lu;0;L;0053 030C;;;;N;LATIN CAPITAL LETTER S HACEK;;;0161;
+0161;LATIN SMALL LETTER S WITH CARON;Ll;0;L;0073 030C;;;;N;LATIN SMALL LETTER S HACEK;;0160;;0160
+0162;LATIN CAPITAL LETTER T WITH CEDILLA;Lu;0;L;0054 0327;;;;N;LATIN CAPITAL LETTER T CEDILLA;;;0163;
+0163;LATIN SMALL LETTER T WITH CEDILLA;Ll;0;L;0074 0327;;;;N;LATIN SMALL LETTER T CEDILLA;;0162;;0162
+0164;LATIN CAPITAL LETTER T WITH CARON;Lu;0;L;0054 030C;;;;N;LATIN CAPITAL LETTER T HACEK;;;0165;
+0165;LATIN SMALL LETTER T WITH CARON;Ll;0;L;0074 030C;;;;N;LATIN SMALL LETTER T HACEK;;0164;;0164
+0166;LATIN CAPITAL LETTER T WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T BAR;;;0167;
+0167;LATIN SMALL LETTER T WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER T BAR;;0166;;0166
+0168;LATIN CAPITAL LETTER U WITH TILDE;Lu;0;L;0055 0303;;;;N;LATIN CAPITAL LETTER U TILDE;;;0169;
+0169;LATIN SMALL LETTER U WITH TILDE;Ll;0;L;0075 0303;;;;N;LATIN SMALL LETTER U TILDE;;0168;;0168
+016A;LATIN CAPITAL LETTER U WITH MACRON;Lu;0;L;0055 0304;;;;N;LATIN CAPITAL LETTER U MACRON;;;016B;
+016B;LATIN SMALL LETTER U WITH MACRON;Ll;0;L;0075 0304;;;;N;LATIN SMALL LETTER U MACRON;;016A;;016A
+016C;LATIN CAPITAL LETTER U WITH BREVE;Lu;0;L;0055 0306;;;;N;LATIN CAPITAL LETTER U BREVE;;;016D;
+016D;LATIN SMALL LETTER U WITH BREVE;Ll;0;L;0075 0306;;;;N;LATIN SMALL LETTER U BREVE;;016C;;016C
+016E;LATIN CAPITAL LETTER U WITH RING ABOVE;Lu;0;L;0055 030A;;;;N;LATIN CAPITAL LETTER U RING;;;016F;
+016F;LATIN SMALL LETTER U WITH RING ABOVE;Ll;0;L;0075 030A;;;;N;LATIN SMALL LETTER U RING;;016E;;016E
+0170;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0055 030B;;;;N;LATIN CAPITAL LETTER U DOUBLE ACUTE;;;0171;
+0171;LATIN SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0075 030B;;;;N;LATIN SMALL LETTER U DOUBLE ACUTE;;0170;;0170
+0172;LATIN CAPITAL LETTER U WITH OGONEK;Lu;0;L;0055 0328;;;;N;LATIN CAPITAL LETTER U OGONEK;;;0173;
+0173;LATIN SMALL LETTER U WITH OGONEK;Ll;0;L;0075 0328;;;;N;LATIN SMALL LETTER U OGONEK;;0172;;0172
+0174;LATIN CAPITAL LETTER W WITH CIRCUMFLEX;Lu;0;L;0057 0302;;;;N;LATIN CAPITAL LETTER W CIRCUMFLEX;;;0175;
+0175;LATIN SMALL LETTER W WITH CIRCUMFLEX;Ll;0;L;0077 0302;;;;N;LATIN SMALL LETTER W CIRCUMFLEX;;0174;;0174
+0176;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX;Lu;0;L;0059 0302;;;;N;LATIN CAPITAL LETTER Y CIRCUMFLEX;;;0177;
+0177;LATIN SMALL LETTER Y WITH CIRCUMFLEX;Ll;0;L;0079 0302;;;;N;LATIN SMALL LETTER Y CIRCUMFLEX;;0176;;0176
+0178;LATIN CAPITAL LETTER Y WITH DIAERESIS;Lu;0;L;0059 0308;;;;N;LATIN CAPITAL LETTER Y DIAERESIS;;;00FF;
+0179;LATIN CAPITAL LETTER Z WITH ACUTE;Lu;0;L;005A 0301;;;;N;LATIN CAPITAL LETTER Z ACUTE;;;017A;
+017A;LATIN SMALL LETTER Z WITH ACUTE;Ll;0;L;007A 0301;;;;N;LATIN SMALL LETTER Z ACUTE;;0179;;0179
+017B;LATIN CAPITAL LETTER Z WITH DOT ABOVE;Lu;0;L;005A 0307;;;;N;LATIN CAPITAL LETTER Z DOT;;;017C;
+017C;LATIN SMALL LETTER Z WITH DOT ABOVE;Ll;0;L;007A 0307;;;;N;LATIN SMALL LETTER Z DOT;;017B;;017B
+017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E;
+017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D
+017F;LATIN SMALL LETTER LONG S;Ll;0;L;<compat> 0073;;;;N;;;0053;;0053
+0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;0243;;0243
+0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253;
+0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183;
+0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182
+0184;LATIN CAPITAL LETTER TONE SIX;Lu;0;L;;;;;N;;;;0185;
+0185;LATIN SMALL LETTER TONE SIX;Ll;0;L;;;;;N;;;0184;;0184
+0186;LATIN CAPITAL LETTER OPEN O;Lu;0;L;;;;;N;;;;0254;
+0187;LATIN CAPITAL LETTER C WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER C HOOK;;;0188;
+0188;LATIN SMALL LETTER C WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER C HOOK;;0187;;0187
+0189;LATIN CAPITAL LETTER AFRICAN D;Lu;0;L;;;;;N;;;;0256;
+018A;LATIN CAPITAL LETTER D WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D HOOK;;;0257;
+018B;LATIN CAPITAL LETTER D WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D TOPBAR;;;018C;
+018C;LATIN SMALL LETTER D WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER D TOPBAR;;018B;;018B
+018D;LATIN SMALL LETTER TURNED DELTA;Ll;0;L;;;;;N;;;;;
+018E;LATIN CAPITAL LETTER REVERSED E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER TURNED E;;;01DD;
+018F;LATIN CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;0259;
+0190;LATIN CAPITAL LETTER OPEN E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER EPSILON;;;025B;
+0191;LATIN CAPITAL LETTER F WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER F HOOK;;;0192;
+0192;LATIN SMALL LETTER F WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT F;;0191;;0191
+0193;LATIN CAPITAL LETTER G WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G HOOK;;;0260;
+0194;LATIN CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;0263;
+0195;LATIN SMALL LETTER HV;Ll;0;L;;;;;N;LATIN SMALL LETTER H V;;01F6;;01F6
+0196;LATIN CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;0269;
+0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268;
+0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199;
+0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198
+019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;023D;;023D
+019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;;
+019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F;
+019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272;
+019E;LATIN SMALL LETTER N WITH LONG RIGHT LEG;Ll;0;L;;;;;N;;;0220;;0220
+019F;LATIN CAPITAL LETTER O WITH MIDDLE TILDE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED O;;;0275;
+01A0;LATIN CAPITAL LETTER O WITH HORN;Lu;0;L;004F 031B;;;;N;LATIN CAPITAL LETTER O HORN;;;01A1;
+01A1;LATIN SMALL LETTER O WITH HORN;Ll;0;L;006F 031B;;;;N;LATIN SMALL LETTER O HORN;;01A0;;01A0
+01A2;LATIN CAPITAL LETTER OI;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O I;;;01A3;
+01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;;01A2;;01A2
+01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5;
+01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4
+01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;;;0280;
+01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8;
+01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7
+01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283;
+01AA;LATIN LETTER REVERSED ESH LOOP;Ll;0;L;;;;;N;;;;;
+01AB;LATIN SMALL LETTER T WITH PALATAL HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T PALATAL HOOK;;;;
+01AC;LATIN CAPITAL LETTER T WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T HOOK;;;01AD;
+01AD;LATIN SMALL LETTER T WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T HOOK;;01AC;;01AC
+01AE;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T RETROFLEX HOOK;;;0288;
+01AF;LATIN CAPITAL LETTER U WITH HORN;Lu;0;L;0055 031B;;;;N;LATIN CAPITAL LETTER U HORN;;;01B0;
+01B0;LATIN SMALL LETTER U WITH HORN;Ll;0;L;0075 031B;;;;N;LATIN SMALL LETTER U HORN;;01AF;;01AF
+01B1;LATIN CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;028A;
+01B2;LATIN CAPITAL LETTER V WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER SCRIPT V;;;028B;
+01B3;LATIN CAPITAL LETTER Y WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Y HOOK;;;01B4;
+01B4;LATIN SMALL LETTER Y WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Y HOOK;;01B3;;01B3
+01B5;LATIN CAPITAL LETTER Z WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Z BAR;;;01B6;
+01B6;LATIN SMALL LETTER Z WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER Z BAR;;01B5;;01B5
+01B7;LATIN CAPITAL LETTER EZH;Lu;0;L;;;;;N;LATIN CAPITAL LETTER YOGH;;;0292;
+01B8;LATIN CAPITAL LETTER EZH REVERSED;Lu;0;L;;;;;N;LATIN CAPITAL LETTER REVERSED YOGH;;;01B9;
+01B9;LATIN SMALL LETTER EZH REVERSED;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED YOGH;;01B8;;01B8
+01BA;LATIN SMALL LETTER EZH WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH WITH TAIL;;;;
+01BB;LATIN LETTER TWO WITH STROKE;Lo;0;L;;;;;N;LATIN LETTER TWO BAR;;;;
+01BC;LATIN CAPITAL LETTER TONE FIVE;Lu;0;L;;;;;N;;;;01BD;
+01BD;LATIN SMALL LETTER TONE FIVE;Ll;0;L;;;;;N;;;01BC;;01BC
+01BE;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER INVERTED GLOTTAL STOP BAR;;;;
+01BF;LATIN LETTER WYNN;Ll;0;L;;;;;N;;;01F7;;01F7
+01C0;LATIN LETTER DENTAL CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE;;;;
+01C1;LATIN LETTER LATERAL CLICK;Lo;0;L;;;;;N;LATIN LETTER DOUBLE PIPE;;;;
+01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;;
+01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;;
+01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L;<compat> 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5
+01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L;<compat> 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6;01C5
+01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L;<compat> 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5
+01C7;LATIN CAPITAL LETTER LJ;Lu;0;L;<compat> 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8
+01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L;<compat> 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9;01C8
+01C9;LATIN SMALL LETTER LJ;Ll;0;L;<compat> 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8
+01CA;LATIN CAPITAL LETTER NJ;Lu;0;L;<compat> 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB
+01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L;<compat> 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC;01CB
+01CC;LATIN SMALL LETTER NJ;Ll;0;L;<compat> 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB
+01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE;
+01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD
+01CF;LATIN CAPITAL LETTER I WITH CARON;Lu;0;L;0049 030C;;;;N;LATIN CAPITAL LETTER I HACEK;;;01D0;
+01D0;LATIN SMALL LETTER I WITH CARON;Ll;0;L;0069 030C;;;;N;LATIN SMALL LETTER I HACEK;;01CF;;01CF
+01D1;LATIN CAPITAL LETTER O WITH CARON;Lu;0;L;004F 030C;;;;N;LATIN CAPITAL LETTER O HACEK;;;01D2;
+01D2;LATIN SMALL LETTER O WITH CARON;Ll;0;L;006F 030C;;;;N;LATIN SMALL LETTER O HACEK;;01D1;;01D1
+01D3;LATIN CAPITAL LETTER U WITH CARON;Lu;0;L;0055 030C;;;;N;LATIN CAPITAL LETTER U HACEK;;;01D4;
+01D4;LATIN SMALL LETTER U WITH CARON;Ll;0;L;0075 030C;;;;N;LATIN SMALL LETTER U HACEK;;01D3;;01D3
+01D5;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON;Lu;0;L;00DC 0304;;;;N;LATIN CAPITAL LETTER U DIAERESIS MACRON;;;01D6;
+01D6;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON;Ll;0;L;00FC 0304;;;;N;LATIN SMALL LETTER U DIAERESIS MACRON;;01D5;;01D5
+01D7;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE;Lu;0;L;00DC 0301;;;;N;LATIN CAPITAL LETTER U DIAERESIS ACUTE;;;01D8;
+01D8;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE;Ll;0;L;00FC 0301;;;;N;LATIN SMALL LETTER U DIAERESIS ACUTE;;01D7;;01D7
+01D9;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON;Lu;0;L;00DC 030C;;;;N;LATIN CAPITAL LETTER U DIAERESIS HACEK;;;01DA;
+01DA;LATIN SMALL LETTER U WITH DIAERESIS AND CARON;Ll;0;L;00FC 030C;;;;N;LATIN SMALL LETTER U DIAERESIS HACEK;;01D9;;01D9
+01DB;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE;Lu;0;L;00DC 0300;;;;N;LATIN CAPITAL LETTER U DIAERESIS GRAVE;;;01DC;
+01DC;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE;Ll;0;L;00FC 0300;;;;N;LATIN SMALL LETTER U DIAERESIS GRAVE;;01DB;;01DB
+01DD;LATIN SMALL LETTER TURNED E;Ll;0;L;;;;;N;;;018E;;018E
+01DE;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON;Lu;0;L;00C4 0304;;;;N;LATIN CAPITAL LETTER A DIAERESIS MACRON;;;01DF;
+01DF;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON;Ll;0;L;00E4 0304;;;;N;LATIN SMALL LETTER A DIAERESIS MACRON;;01DE;;01DE
+01E0;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON;Lu;0;L;0226 0304;;;;N;LATIN CAPITAL LETTER A DOT MACRON;;;01E1;
+01E1;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON;Ll;0;L;0227 0304;;;;N;LATIN SMALL LETTER A DOT MACRON;;01E0;;01E0
+01E2;LATIN CAPITAL LETTER AE WITH MACRON;Lu;0;L;00C6 0304;;;;N;LATIN CAPITAL LETTER A E MACRON;;;01E3;
+01E3;LATIN SMALL LETTER AE WITH MACRON;Ll;0;L;00E6 0304;;;;N;LATIN SMALL LETTER A E MACRON;;01E2;;01E2
+01E4;LATIN CAPITAL LETTER G WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G BAR;;;01E5;
+01E5;LATIN SMALL LETTER G WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER G BAR;;01E4;;01E4
+01E6;LATIN CAPITAL LETTER G WITH CARON;Lu;0;L;0047 030C;;;;N;LATIN CAPITAL LETTER G HACEK;;;01E7;
+01E7;LATIN SMALL LETTER G WITH CARON;Ll;0;L;0067 030C;;;;N;LATIN SMALL LETTER G HACEK;;01E6;;01E6
+01E8;LATIN CAPITAL LETTER K WITH CARON;Lu;0;L;004B 030C;;;;N;LATIN CAPITAL LETTER K HACEK;;;01E9;
+01E9;LATIN SMALL LETTER K WITH CARON;Ll;0;L;006B 030C;;;;N;LATIN SMALL LETTER K HACEK;;01E8;;01E8
+01EA;LATIN CAPITAL LETTER O WITH OGONEK;Lu;0;L;004F 0328;;;;N;LATIN CAPITAL LETTER O OGONEK;;;01EB;
+01EB;LATIN SMALL LETTER O WITH OGONEK;Ll;0;L;006F 0328;;;;N;LATIN SMALL LETTER O OGONEK;;01EA;;01EA
+01EC;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON;Lu;0;L;01EA 0304;;;;N;LATIN CAPITAL LETTER O OGONEK MACRON;;;01ED;
+01ED;LATIN SMALL LETTER O WITH OGONEK AND MACRON;Ll;0;L;01EB 0304;;;;N;LATIN SMALL LETTER O OGONEK MACRON;;01EC;;01EC
+01EE;LATIN CAPITAL LETTER EZH WITH CARON;Lu;0;L;01B7 030C;;;;N;LATIN CAPITAL LETTER YOGH HACEK;;;01EF;
+01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE
+01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;;
+01F1;LATIN CAPITAL LETTER DZ;Lu;0;L;<compat> 0044 005A;;;;N;;;;01F3;01F2
+01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L;<compat> 0044 007A;;;;N;;;01F1;01F3;01F2
+01F3;LATIN SMALL LETTER DZ;Ll;0;L;<compat> 0064 007A;;;;N;;;01F1;;01F2
+01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5;
+01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4
+01F6;LATIN CAPITAL LETTER HWAIR;Lu;0;L;;;;;N;;;;0195;
+01F7;LATIN CAPITAL LETTER WYNN;Lu;0;L;;;;;N;;;;01BF;
+01F8;LATIN CAPITAL LETTER N WITH GRAVE;Lu;0;L;004E 0300;;;;N;;;;01F9;
+01F9;LATIN SMALL LETTER N WITH GRAVE;Ll;0;L;006E 0300;;;;N;;;01F8;;01F8
+01FA;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE;Lu;0;L;00C5 0301;;;;N;;;;01FB;
+01FB;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE;Ll;0;L;00E5 0301;;;;N;;;01FA;;01FA
+01FC;LATIN CAPITAL LETTER AE WITH ACUTE;Lu;0;L;00C6 0301;;;;N;;;;01FD;
+01FD;LATIN SMALL LETTER AE WITH ACUTE;Ll;0;L;00E6 0301;;;;N;;;01FC;;01FC
+01FE;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE;Lu;0;L;00D8 0301;;;;N;;;;01FF;
+01FF;LATIN SMALL LETTER O WITH STROKE AND ACUTE;Ll;0;L;00F8 0301;;;;N;;;01FE;;01FE
+0200;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE;Lu;0;L;0041 030F;;;;N;;;;0201;
+0201;LATIN SMALL LETTER A WITH DOUBLE GRAVE;Ll;0;L;0061 030F;;;;N;;;0200;;0200
+0202;LATIN CAPITAL LETTER A WITH INVERTED BREVE;Lu;0;L;0041 0311;;;;N;;;;0203;
+0203;LATIN SMALL LETTER A WITH INVERTED BREVE;Ll;0;L;0061 0311;;;;N;;;0202;;0202
+0204;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE;Lu;0;L;0045 030F;;;;N;;;;0205;
+0205;LATIN SMALL LETTER E WITH DOUBLE GRAVE;Ll;0;L;0065 030F;;;;N;;;0204;;0204
+0206;LATIN CAPITAL LETTER E WITH INVERTED BREVE;Lu;0;L;0045 0311;;;;N;;;;0207;
+0207;LATIN SMALL LETTER E WITH INVERTED BREVE;Ll;0;L;0065 0311;;;;N;;;0206;;0206
+0208;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE;Lu;0;L;0049 030F;;;;N;;;;0209;
+0209;LATIN SMALL LETTER I WITH DOUBLE GRAVE;Ll;0;L;0069 030F;;;;N;;;0208;;0208
+020A;LATIN CAPITAL LETTER I WITH INVERTED BREVE;Lu;0;L;0049 0311;;;;N;;;;020B;
+020B;LATIN SMALL LETTER I WITH INVERTED BREVE;Ll;0;L;0069 0311;;;;N;;;020A;;020A
+020C;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE;Lu;0;L;004F 030F;;;;N;;;;020D;
+020D;LATIN SMALL LETTER O WITH DOUBLE GRAVE;Ll;0;L;006F 030F;;;;N;;;020C;;020C
+020E;LATIN CAPITAL LETTER O WITH INVERTED BREVE;Lu;0;L;004F 0311;;;;N;;;;020F;
+020F;LATIN SMALL LETTER O WITH INVERTED BREVE;Ll;0;L;006F 0311;;;;N;;;020E;;020E
+0210;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE;Lu;0;L;0052 030F;;;;N;;;;0211;
+0211;LATIN SMALL LETTER R WITH DOUBLE GRAVE;Ll;0;L;0072 030F;;;;N;;;0210;;0210
+0212;LATIN CAPITAL LETTER R WITH INVERTED BREVE;Lu;0;L;0052 0311;;;;N;;;;0213;
+0213;LATIN SMALL LETTER R WITH INVERTED BREVE;Ll;0;L;0072 0311;;;;N;;;0212;;0212
+0214;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE;Lu;0;L;0055 030F;;;;N;;;;0215;
+0215;LATIN SMALL LETTER U WITH DOUBLE GRAVE;Ll;0;L;0075 030F;;;;N;;;0214;;0214
+0216;LATIN CAPITAL LETTER U WITH INVERTED BREVE;Lu;0;L;0055 0311;;;;N;;;;0217;
+0217;LATIN SMALL LETTER U WITH INVERTED BREVE;Ll;0;L;0075 0311;;;;N;;;0216;;0216
+0218;LATIN CAPITAL LETTER S WITH COMMA BELOW;Lu;0;L;0053 0326;;;;N;;;;0219;
+0219;LATIN SMALL LETTER S WITH COMMA BELOW;Ll;0;L;0073 0326;;;;N;;;0218;;0218
+021A;LATIN CAPITAL LETTER T WITH COMMA BELOW;Lu;0;L;0054 0326;;;;N;;;;021B;
+021B;LATIN SMALL LETTER T WITH COMMA BELOW;Ll;0;L;0074 0326;;;;N;;;021A;;021A
+021C;LATIN CAPITAL LETTER YOGH;Lu;0;L;;;;;N;;;;021D;
+021D;LATIN SMALL LETTER YOGH;Ll;0;L;;;;;N;;;021C;;021C
+021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F;
+021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E
+0220;LATIN CAPITAL LETTER N WITH LONG RIGHT LEG;Lu;0;L;;;;;N;;;;019E;
+0221;LATIN SMALL LETTER D WITH CURL;Ll;0;L;;;;;N;;;;;
+0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223;
+0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222
+0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225;
+0225;LATIN SMALL LETTER Z WITH HOOK;Ll;0;L;;;;;N;;;0224;;0224
+0226;LATIN CAPITAL LETTER A WITH DOT ABOVE;Lu;0;L;0041 0307;;;;N;;;;0227;
+0227;LATIN SMALL LETTER A WITH DOT ABOVE;Ll;0;L;0061 0307;;;;N;;;0226;;0226
+0228;LATIN CAPITAL LETTER E WITH CEDILLA;Lu;0;L;0045 0327;;;;N;;;;0229;
+0229;LATIN SMALL LETTER E WITH CEDILLA;Ll;0;L;0065 0327;;;;N;;;0228;;0228
+022A;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON;Lu;0;L;00D6 0304;;;;N;;;;022B;
+022B;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON;Ll;0;L;00F6 0304;;;;N;;;022A;;022A
+022C;LATIN CAPITAL LETTER O WITH TILDE AND MACRON;Lu;0;L;00D5 0304;;;;N;;;;022D;
+022D;LATIN SMALL LETTER O WITH TILDE AND MACRON;Ll;0;L;00F5 0304;;;;N;;;022C;;022C
+022E;LATIN CAPITAL LETTER O WITH DOT ABOVE;Lu;0;L;004F 0307;;;;N;;;;022F;
+022F;LATIN SMALL LETTER O WITH DOT ABOVE;Ll;0;L;006F 0307;;;;N;;;022E;;022E
+0230;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON;Lu;0;L;022E 0304;;;;N;;;;0231;
+0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230
+0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233;
+0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232
+0234;LATIN SMALL LETTER L WITH CURL;Ll;0;L;;;;;N;;;;;
+0235;LATIN SMALL LETTER N WITH CURL;Ll;0;L;;;;;N;;;;;
+0236;LATIN SMALL LETTER T WITH CURL;Ll;0;L;;;;;N;;;;;
+0237;LATIN SMALL LETTER DOTLESS J;Ll;0;L;;;;;N;;;;;
+0238;LATIN SMALL LETTER DB DIGRAPH;Ll;0;L;;;;;N;;;;;
+0239;LATIN SMALL LETTER QP DIGRAPH;Ll;0;L;;;;;N;;;;;
+023A;LATIN CAPITAL LETTER A WITH STROKE;Lu;0;L;;;;;N;;;;2C65;
+023B;LATIN CAPITAL LETTER C WITH STROKE;Lu;0;L;;;;;N;;;;023C;
+023C;LATIN SMALL LETTER C WITH STROKE;Ll;0;L;;;;;N;;;023B;;023B
+023D;LATIN CAPITAL LETTER L WITH BAR;Lu;0;L;;;;;N;;;;019A;
+023E;LATIN CAPITAL LETTER T WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;2C66;
+023F;LATIN SMALL LETTER S WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7E;;2C7E
+0240;LATIN SMALL LETTER Z WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7F;;2C7F
+0241;LATIN CAPITAL LETTER GLOTTAL STOP;Lu;0;L;;;;;N;;;;0242;
+0242;LATIN SMALL LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;0241;;0241
+0243;LATIN CAPITAL LETTER B WITH STROKE;Lu;0;L;;;;;N;;;;0180;
+0244;LATIN CAPITAL LETTER U BAR;Lu;0;L;;;;;N;;;;0289;
+0245;LATIN CAPITAL LETTER TURNED V;Lu;0;L;;;;;N;;;;028C;
+0246;LATIN CAPITAL LETTER E WITH STROKE;Lu;0;L;;;;;N;;;;0247;
+0247;LATIN SMALL LETTER E WITH STROKE;Ll;0;L;;;;;N;;;0246;;0246
+0248;LATIN CAPITAL LETTER J WITH STROKE;Lu;0;L;;;;;N;;;;0249;
+0249;LATIN SMALL LETTER J WITH STROKE;Ll;0;L;;;;;N;;;0248;;0248
+024A;LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL;Lu;0;L;;;;;N;;;;024B;
+024B;LATIN SMALL LETTER Q WITH HOOK TAIL;Ll;0;L;;;;;N;;;024A;;024A
+024C;LATIN CAPITAL LETTER R WITH STROKE;Lu;0;L;;;;;N;;;;024D;
+024D;LATIN SMALL LETTER R WITH STROKE;Ll;0;L;;;;;N;;;024C;;024C
+024E;LATIN CAPITAL LETTER Y WITH STROKE;Lu;0;L;;;;;N;;;;024F;
+024F;LATIN SMALL LETTER Y WITH STROKE;Ll;0;L;;;;;N;;;024E;;024E
+0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;2C6F;;2C6F
+0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;2C6D;;2C6D
+0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;2C70;;2C70
+0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181
+0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186
+0255;LATIN SMALL LETTER C WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER C CURL;;;;
+0256;LATIN SMALL LETTER D WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER D RETROFLEX HOOK;;0189;;0189
+0257;LATIN SMALL LETTER D WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER D HOOK;;018A;;018A
+0258;LATIN SMALL LETTER REVERSED E;Ll;0;L;;;;;N;;;;;
+0259;LATIN SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;018F;;018F
+025A;LATIN SMALL LETTER SCHWA WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCHWA HOOK;;;;
+025B;LATIN SMALL LETTER OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER EPSILON;;0190;;0190
+025C;LATIN SMALL LETTER REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON;;A7AB;;A7AB
+025D;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON HOOK;;;;
+025E;LATIN SMALL LETTER CLOSED REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED REVERSED EPSILON;;;;
+025F;LATIN SMALL LETTER DOTLESS J WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR;;;;
+0260;LATIN SMALL LETTER G WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER G HOOK;;0193;;0193
+0261;LATIN SMALL LETTER SCRIPT G;Ll;0;L;;;;;N;;;A7AC;;A7AC
+0262;LATIN LETTER SMALL CAPITAL G;Ll;0;L;;;;;N;;;;;
+0263;LATIN SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0194;;0194
+0264;LATIN SMALL LETTER RAMS HORN;Ll;0;L;;;;;N;LATIN SMALL LETTER BABY GAMMA;;;;
+0265;LATIN SMALL LETTER TURNED H;Ll;0;L;;;;;N;;;A78D;;A78D
+0266;LATIN SMALL LETTER H WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER H HOOK;;A7AA;;A7AA
+0267;LATIN SMALL LETTER HENG WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER HENG HOOK;;;;
+0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197
+0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196
+026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;A7AE;;A7AE
+026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;2C62;;2C62
+026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;A7AD;;A7AD
+026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;;
+026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;;
+026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C
+0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;;
+0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;2C6E;;2C6E
+0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D
+0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;;
+0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;;
+0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F
+0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;;
+0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;;
+0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;;
+0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;;
+027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;;
+027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;;
+027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;;
+027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;2C64;;2C64
+027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;;
+027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;;
+0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;;01A6;;01A6
+0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;;
+0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;;;
+0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9
+0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;;
+0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;;
+0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;;
+0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;A7B1;;A7B1
+0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE
+0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;0244;;0244
+028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1
+028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2
+028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;0245;;0245
+028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;;
+028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;;
+028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;;
+0290;LATIN SMALL LETTER Z WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Z RETROFLEX HOOK;;;;
+0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;;
+0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7
+0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;;
+0294;LATIN LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
+0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;;
+0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;;
+0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;;
+0298;LATIN LETTER BILABIAL CLICK;Ll;0;L;;;;;N;LATIN LETTER BULLSEYE;;;;
+0299;LATIN LETTER SMALL CAPITAL B;Ll;0;L;;;;;N;;;;;
+029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;;
+029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;;
+029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;;
+029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;A7B2;;A7B2
+029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;A7B0;;A7B0
+029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;;
+02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;;
+02A1;LATIN LETTER GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER GLOTTAL STOP BAR;;;;
+02A2;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP BAR;;;;
+02A3;LATIN SMALL LETTER DZ DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z;;;;
+02A4;LATIN SMALL LETTER DEZH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D YOGH;;;;
+02A5;LATIN SMALL LETTER DZ DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z CURL;;;;
+02A6;LATIN SMALL LETTER TS DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T S;;;;
+02A7;LATIN SMALL LETTER TESH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T ESH;;;;
+02A8;LATIN SMALL LETTER TC DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER T C CURL;;;;
+02A9;LATIN SMALL LETTER FENG DIGRAPH;Ll;0;L;;;;;N;;;;;
+02AA;LATIN SMALL LETTER LS DIGRAPH;Ll;0;L;;;;;N;;;;;
+02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;;
+02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;;
+02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;;
+02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK;Ll;0;L;;;;;N;;;;;
+02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;Ll;0;L;;;;;N;;;;;
+02B0;MODIFIER LETTER SMALL H;Lm;0;L;<super> 0068;;;;N;;;;;
+02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L;<super> 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;;
+02B2;MODIFIER LETTER SMALL J;Lm;0;L;<super> 006A;;;;N;;;;;
+02B3;MODIFIER LETTER SMALL R;Lm;0;L;<super> 0072;;;;N;;;;;
+02B4;MODIFIER LETTER SMALL TURNED R;Lm;0;L;<super> 0279;;;;N;;;;;
+02B5;MODIFIER LETTER SMALL TURNED R WITH HOOK;Lm;0;L;<super> 027B;;;;N;MODIFIER LETTER SMALL TURNED R HOOK;;;;
+02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L;<super> 0281;;;;N;;;;;
+02B7;MODIFIER LETTER SMALL W;Lm;0;L;<super> 0077;;;;N;;;;;
+02B8;MODIFIER LETTER SMALL Y;Lm;0;L;<super> 0079;;;;N;;;;;
+02B9;MODIFIER LETTER PRIME;Lm;0;ON;;;;;N;;;;;
+02BA;MODIFIER LETTER DOUBLE PRIME;Lm;0;ON;;;;;N;;;;;
+02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;;
+02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;;
+02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;;
+02BE;MODIFIER LETTER RIGHT HALF RING;Lm;0;L;;;;;N;;;;;
+02BF;MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;;
+02C0;MODIFIER LETTER GLOTTAL STOP;Lm;0;L;;;;;N;;;;;
+02C1;MODIFIER LETTER REVERSED GLOTTAL STOP;Lm;0;L;;;;;N;;;;;
+02C2;MODIFIER LETTER LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;;
+02C7;CARON;Lm;0;ON;;;;;N;MODIFIER LETTER HACEK;;;;
+02C8;MODIFIER LETTER VERTICAL LINE;Lm;0;ON;;;;;N;;;;;
+02C9;MODIFIER LETTER MACRON;Lm;0;ON;;;;;N;;;;;
+02CA;MODIFIER LETTER ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER ACUTE;;;;
+02CB;MODIFIER LETTER GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER GRAVE;;;;
+02CC;MODIFIER LETTER LOW VERTICAL LINE;Lm;0;ON;;;;;N;;;;;
+02CD;MODIFIER LETTER LOW MACRON;Lm;0;ON;;;;;N;;;;;
+02CE;MODIFIER LETTER LOW GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;;
+02CF;MODIFIER LETTER LOW ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;;
+02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;;
+02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;;
+02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;;
+02D3;MODIFIER LETTER CENTRED LEFT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED LEFT HALF RING;;;;
+02D4;MODIFIER LETTER UP TACK;Sk;0;ON;;;;;N;;;;;
+02D5;MODIFIER LETTER DOWN TACK;Sk;0;ON;;;;;N;;;;;
+02D6;MODIFIER LETTER PLUS SIGN;Sk;0;ON;;;;;N;;;;;
+02D7;MODIFIER LETTER MINUS SIGN;Sk;0;ON;;;;;N;;;;;
+02D8;BREVE;Sk;0;ON;<compat> 0020 0306;;;;N;SPACING BREVE;;;;
+02D9;DOT ABOVE;Sk;0;ON;<compat> 0020 0307;;;;N;SPACING DOT ABOVE;;;;
+02DA;RING ABOVE;Sk;0;ON;<compat> 0020 030A;;;;N;SPACING RING ABOVE;;;;
+02DB;OGONEK;Sk;0;ON;<compat> 0020 0328;;;;N;SPACING OGONEK;;;;
+02DC;SMALL TILDE;Sk;0;ON;<compat> 0020 0303;;;;N;SPACING TILDE;;;;
+02DD;DOUBLE ACUTE ACCENT;Sk;0;ON;<compat> 0020 030B;;;;N;SPACING DOUBLE ACUTE;;;;
+02DE;MODIFIER LETTER RHOTIC HOOK;Sk;0;ON;;;;;N;;;;;
+02DF;MODIFIER LETTER CROSS ACCENT;Sk;0;ON;;;;;N;;;;;
+02E0;MODIFIER LETTER SMALL GAMMA;Lm;0;L;<super> 0263;;;;N;;;;;
+02E1;MODIFIER LETTER SMALL L;Lm;0;L;<super> 006C;;;;N;;;;;
+02E2;MODIFIER LETTER SMALL S;Lm;0;L;<super> 0073;;;;N;;;;;
+02E3;MODIFIER LETTER SMALL X;Lm;0;L;<super> 0078;;;;N;;;;;
+02E4;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP;Lm;0;L;<super> 0295;;;;N;;;;;
+02E5;MODIFIER LETTER EXTRA-HIGH TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E6;MODIFIER LETTER HIGH TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E7;MODIFIER LETTER MID TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E8;MODIFIER LETTER LOW TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;;
+02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;;
+02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;;
+02EC;MODIFIER LETTER VOICING;Lm;0;ON;;;;;N;;;;;
+02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;;
+02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;;
+02EF;MODIFIER LETTER LOW DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F0;MODIFIER LETTER LOW UP ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F1;MODIFIER LETTER LOW LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F2;MODIFIER LETTER LOW RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F3;MODIFIER LETTER LOW RING;Sk;0;ON;;;;;N;;;;;
+02F4;MODIFIER LETTER MIDDLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;;
+02F5;MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;;
+02F6;MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT;Sk;0;ON;;;;;N;;;;;
+02F7;MODIFIER LETTER LOW TILDE;Sk;0;ON;;;;;N;;;;;
+02F8;MODIFIER LETTER RAISED COLON;Sk;0;ON;;;;;N;;;;;
+02F9;MODIFIER LETTER BEGIN HIGH TONE;Sk;0;ON;;;;;N;;;;;
+02FA;MODIFIER LETTER END HIGH TONE;Sk;0;ON;;;;;N;;;;;
+02FB;MODIFIER LETTER BEGIN LOW TONE;Sk;0;ON;;;;;N;;;;;
+02FC;MODIFIER LETTER END LOW TONE;Sk;0;ON;;;;;N;;;;;
+02FD;MODIFIER LETTER SHELF;Sk;0;ON;;;;;N;;;;;
+02FE;MODIFIER LETTER OPEN SHELF;Sk;0;ON;;;;;N;;;;;
+02FF;MODIFIER LETTER LOW LEFT ARROW;Sk;0;ON;;;;;N;;;;;
+0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;;;;
+0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;;;;
+0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;;
+0303;COMBINING TILDE;Mn;230;NSM;;;;;N;NON-SPACING TILDE;;;;
+0304;COMBINING MACRON;Mn;230;NSM;;;;;N;NON-SPACING MACRON;;;;
+0305;COMBINING OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING OVERSCORE;;;;
+0306;COMBINING BREVE;Mn;230;NSM;;;;;N;NON-SPACING BREVE;;;;
+0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;;
+0308;COMBINING DIAERESIS;Mn;230;NSM;;;;;N;NON-SPACING DIAERESIS;;;;
+0309;COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;NON-SPACING HOOK ABOVE;;;;
+030A;COMBINING RING ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RING ABOVE;;;;
+030B;COMBINING DOUBLE ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE ACUTE;;;;
+030C;COMBINING CARON;Mn;230;NSM;;;;;N;NON-SPACING HACEK;;;;
+030D;COMBINING VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL LINE ABOVE;;;;
+030E;COMBINING DOUBLE VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE VERTICAL LINE ABOVE;;;;
+030F;COMBINING DOUBLE GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE GRAVE;;;;
+0310;COMBINING CANDRABINDU;Mn;230;NSM;;;;;N;NON-SPACING CANDRABINDU;;;;
+0311;COMBINING INVERTED BREVE;Mn;230;NSM;;;;;N;NON-SPACING INVERTED BREVE;;;;
+0312;COMBINING TURNED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING TURNED COMMA ABOVE;;;;
+0313;COMBINING COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING COMMA ABOVE;;;;
+0314;COMBINING REVERSED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING REVERSED COMMA ABOVE;;;;
+0315;COMBINING COMMA ABOVE RIGHT;Mn;232;NSM;;;;;N;NON-SPACING COMMA ABOVE RIGHT;;;;
+0316;COMBINING GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING GRAVE BELOW;;;;
+0317;COMBINING ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING ACUTE BELOW;;;;
+0318;COMBINING LEFT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT TACK BELOW;;;;
+0319;COMBINING RIGHT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT TACK BELOW;;;;
+031A;COMBINING LEFT ANGLE ABOVE;Mn;232;NSM;;;;;N;NON-SPACING LEFT ANGLE ABOVE;;;;
+031B;COMBINING HORN;Mn;216;NSM;;;;;N;NON-SPACING HORN;;;;
+031C;COMBINING LEFT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT HALF RING BELOW;;;;
+031D;COMBINING UP TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING UP TACK BELOW;;;;
+031E;COMBINING DOWN TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOWN TACK BELOW;;;;
+031F;COMBINING PLUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING PLUS SIGN BELOW;;;;
+0320;COMBINING MINUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING MINUS SIGN BELOW;;;;
+0321;COMBINING PALATALIZED HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING PALATALIZED HOOK BELOW;;;;
+0322;COMBINING RETROFLEX HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING RETROFLEX HOOK BELOW;;;;
+0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;;
+0324;COMBINING DIAERESIS BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE DOT BELOW;;;;
+0325;COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;;
+0326;COMBINING COMMA BELOW;Mn;220;NSM;;;;;N;NON-SPACING COMMA BELOW;;;;
+0327;COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;;
+0328;COMBINING OGONEK;Mn;202;NSM;;;;;N;NON-SPACING OGONEK;;;;
+0329;COMBINING VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;NON-SPACING VERTICAL LINE BELOW;;;;
+032A;COMBINING BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BRIDGE BELOW;;;;
+032B;COMBINING INVERTED DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED DOUBLE ARCH BELOW;;;;
+032C;COMBINING CARON BELOW;Mn;220;NSM;;;;;N;NON-SPACING HACEK BELOW;;;;
+032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;;
+032E;COMBINING BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BREVE BELOW;;;;
+032F;COMBINING INVERTED BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BREVE BELOW;;;;
+0330;COMBINING TILDE BELOW;Mn;220;NSM;;;;;N;NON-SPACING TILDE BELOW;;;;
+0331;COMBINING MACRON BELOW;Mn;220;NSM;;;;;N;NON-SPACING MACRON BELOW;;;;
+0332;COMBINING LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING UNDERSCORE;;;;
+0333;COMBINING DOUBLE LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE UNDERSCORE;;;;
+0334;COMBINING TILDE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING TILDE OVERLAY;;;;
+0335;COMBINING SHORT STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT BAR OVERLAY;;;;
+0336;COMBINING LONG STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG BAR OVERLAY;;;;
+0337;COMBINING SHORT SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT SLASH OVERLAY;;;;
+0338;COMBINING LONG SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG SLASH OVERLAY;;;;
+0339;COMBINING RIGHT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT HALF RING BELOW;;;;
+033A;COMBINING INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BRIDGE BELOW;;;;
+033B;COMBINING SQUARE BELOW;Mn;220;NSM;;;;;N;NON-SPACING SQUARE BELOW;;;;
+033C;COMBINING SEAGULL BELOW;Mn;220;NSM;;;;;N;NON-SPACING SEAGULL BELOW;;;;
+033D;COMBINING X ABOVE;Mn;230;NSM;;;;;N;NON-SPACING X ABOVE;;;;
+033E;COMBINING VERTICAL TILDE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL TILDE;;;;
+033F;COMBINING DOUBLE OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE OVERSCORE;;;;
+0340;COMBINING GRAVE TONE MARK;Mn;230;NSM;0300;;;;N;NON-SPACING GRAVE TONE MARK;;;;
+0341;COMBINING ACUTE TONE MARK;Mn;230;NSM;0301;;;;N;NON-SPACING ACUTE TONE MARK;;;;
+0342;COMBINING GREEK PERISPOMENI;Mn;230;NSM;;;;;N;;;;;
+0343;COMBINING GREEK KORONIS;Mn;230;NSM;0313;;;;N;;;;;
+0344;COMBINING GREEK DIALYTIKA TONOS;Mn;230;NSM;0308 0301;;;;N;GREEK NON-SPACING DIAERESIS TONOS;;;;
+0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA BELOW;;0399;;0399
+0346;COMBINING BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;;
+0347;COMBINING EQUALS SIGN BELOW;Mn;220;NSM;;;;;N;;;;;
+0348;COMBINING DOUBLE VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;;;;;
+0349;COMBINING LEFT ANGLE BELOW;Mn;220;NSM;;;;;N;;;;;
+034A;COMBINING NOT TILDE ABOVE;Mn;230;NSM;;;;;N;;;;;
+034B;COMBINING HOMOTHETIC ABOVE;Mn;230;NSM;;;;;N;;;;;
+034C;COMBINING ALMOST EQUAL TO ABOVE;Mn;230;NSM;;;;;N;;;;;
+034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+034F;COMBINING GRAPHEME JOINER;Mn;0;NSM;;;;;N;;;;;
+0350;COMBINING RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;;
+0351;COMBINING LEFT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;;
+0352;COMBINING FERMATA;Mn;230;NSM;;;;;N;;;;;
+0353;COMBINING X BELOW;Mn;220;NSM;;;;;N;;;;;
+0354;COMBINING LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+0355;COMBINING RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+0356;COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+0357;COMBINING RIGHT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;;
+0358;COMBINING DOT ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;;
+0359;COMBINING ASTERISK BELOW;Mn;220;NSM;;;;;N;;;;;
+035A;COMBINING DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;;
+035B;COMBINING ZIGZAG ABOVE;Mn;230;NSM;;;;;N;;;;;
+035C;COMBINING DOUBLE BREVE BELOW;Mn;233;NSM;;;;;N;;;;;
+035D;COMBINING DOUBLE BREVE;Mn;234;NSM;;;;;N;;;;;
+035E;COMBINING DOUBLE MACRON;Mn;234;NSM;;;;;N;;;;;
+035F;COMBINING DOUBLE MACRON BELOW;Mn;233;NSM;;;;;N;;;;;
+0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;;
+0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;;
+0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;;
+0363;COMBINING LATIN SMALL LETTER A;Mn;230;NSM;;;;;N;;;;;
+0364;COMBINING LATIN SMALL LETTER E;Mn;230;NSM;;;;;N;;;;;
+0365;COMBINING LATIN SMALL LETTER I;Mn;230;NSM;;;;;N;;;;;
+0366;COMBINING LATIN SMALL LETTER O;Mn;230;NSM;;;;;N;;;;;
+0367;COMBINING LATIN SMALL LETTER U;Mn;230;NSM;;;;;N;;;;;
+0368;COMBINING LATIN SMALL LETTER C;Mn;230;NSM;;;;;N;;;;;
+0369;COMBINING LATIN SMALL LETTER D;Mn;230;NSM;;;;;N;;;;;
+036A;COMBINING LATIN SMALL LETTER H;Mn;230;NSM;;;;;N;;;;;
+036B;COMBINING LATIN SMALL LETTER M;Mn;230;NSM;;;;;N;;;;;
+036C;COMBINING LATIN SMALL LETTER R;Mn;230;NSM;;;;;N;;;;;
+036D;COMBINING LATIN SMALL LETTER T;Mn;230;NSM;;;;;N;;;;;
+036E;COMBINING LATIN SMALL LETTER V;Mn;230;NSM;;;;;N;;;;;
+036F;COMBINING LATIN SMALL LETTER X;Mn;230;NSM;;;;;N;;;;;
+0370;GREEK CAPITAL LETTER HETA;Lu;0;L;;;;;N;;;;0371;
+0371;GREEK SMALL LETTER HETA;Ll;0;L;;;;;N;;;0370;;0370
+0372;GREEK CAPITAL LETTER ARCHAIC SAMPI;Lu;0;L;;;;;N;;;;0373;
+0373;GREEK SMALL LETTER ARCHAIC SAMPI;Ll;0;L;;;;;N;;;0372;;0372
+0374;GREEK NUMERAL SIGN;Lm;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;;;;
+0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;;;;
+0376;GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA;Lu;0;L;;;;;N;;;;0377;
+0377;GREEK SMALL LETTER PAMPHYLIAN DIGAMMA;Ll;0;L;;;;;N;;;0376;;0376
+037A;GREEK YPOGEGRAMMENI;Lm;0;L;<compat> 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;;
+037B;GREEK SMALL REVERSED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FD;;03FD
+037C;GREEK SMALL DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FE;;03FE
+037D;GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FF;;03FF
+037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;;;;
+037F;GREEK CAPITAL LETTER YOT;Lu;0;L;;;;;N;;;;03F3;
+0384;GREEK TONOS;Sk;0;ON;<compat> 0020 0301;;;;N;GREEK SPACING TONOS;;;;
+0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;;
+0386;GREEK CAPITAL LETTER ALPHA WITH TONOS;Lu;0;L;0391 0301;;;;N;GREEK CAPITAL LETTER ALPHA TONOS;;;03AC;
+0387;GREEK ANO TELEIA;Po;0;ON;00B7;;;;N;;;;;
+0388;GREEK CAPITAL LETTER EPSILON WITH TONOS;Lu;0;L;0395 0301;;;;N;GREEK CAPITAL LETTER EPSILON TONOS;;;03AD;
+0389;GREEK CAPITAL LETTER ETA WITH TONOS;Lu;0;L;0397 0301;;;;N;GREEK CAPITAL LETTER ETA TONOS;;;03AE;
+038A;GREEK CAPITAL LETTER IOTA WITH TONOS;Lu;0;L;0399 0301;;;;N;GREEK CAPITAL LETTER IOTA TONOS;;;03AF;
+038C;GREEK CAPITAL LETTER OMICRON WITH TONOS;Lu;0;L;039F 0301;;;;N;GREEK CAPITAL LETTER OMICRON TONOS;;;03CC;
+038E;GREEK CAPITAL LETTER UPSILON WITH TONOS;Lu;0;L;03A5 0301;;;;N;GREEK CAPITAL LETTER UPSILON TONOS;;;03CD;
+038F;GREEK CAPITAL LETTER OMEGA WITH TONOS;Lu;0;L;03A9 0301;;;;N;GREEK CAPITAL LETTER OMEGA TONOS;;;03CE;
+0390;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS;Ll;0;L;03CA 0301;;;;N;GREEK SMALL LETTER IOTA DIAERESIS TONOS;;;;
+0391;GREEK CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;03B1;
+0392;GREEK CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;03B2;
+0393;GREEK CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;03B3;
+0394;GREEK CAPITAL LETTER DELTA;Lu;0;L;;;;;N;;;;03B4;
+0395;GREEK CAPITAL LETTER EPSILON;Lu;0;L;;;;;N;;;;03B5;
+0396;GREEK CAPITAL LETTER ZETA;Lu;0;L;;;;;N;;;;03B6;
+0397;GREEK CAPITAL LETTER ETA;Lu;0;L;;;;;N;;;;03B7;
+0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8;
+0399;GREEK CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;03B9;
+039A;GREEK CAPITAL LETTER KAPPA;Lu;0;L;;;;;N;;;;03BA;
+039B;GREEK CAPITAL LETTER LAMDA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER LAMBDA;;;03BB;
+039C;GREEK CAPITAL LETTER MU;Lu;0;L;;;;;N;;;;03BC;
+039D;GREEK CAPITAL LETTER NU;Lu;0;L;;;;;N;;;;03BD;
+039E;GREEK CAPITAL LETTER XI;Lu;0;L;;;;;N;;;;03BE;
+039F;GREEK CAPITAL LETTER OMICRON;Lu;0;L;;;;;N;;;;03BF;
+03A0;GREEK CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;03C0;
+03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1;
+03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3;
+03A4;GREEK CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;03C4;
+03A5;GREEK CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;03C5;
+03A6;GREEK CAPITAL LETTER PHI;Lu;0;L;;;;;N;;;;03C6;
+03A7;GREEK CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;03C7;
+03A8;GREEK CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;03C8;
+03A9;GREEK CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;03C9;
+03AA;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA;Lu;0;L;0399 0308;;;;N;GREEK CAPITAL LETTER IOTA DIAERESIS;;;03CA;
+03AB;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA;Lu;0;L;03A5 0308;;;;N;GREEK CAPITAL LETTER UPSILON DIAERESIS;;;03CB;
+03AC;GREEK SMALL LETTER ALPHA WITH TONOS;Ll;0;L;03B1 0301;;;;N;GREEK SMALL LETTER ALPHA TONOS;;0386;;0386
+03AD;GREEK SMALL LETTER EPSILON WITH TONOS;Ll;0;L;03B5 0301;;;;N;GREEK SMALL LETTER EPSILON TONOS;;0388;;0388
+03AE;GREEK SMALL LETTER ETA WITH TONOS;Ll;0;L;03B7 0301;;;;N;GREEK SMALL LETTER ETA TONOS;;0389;;0389
+03AF;GREEK SMALL LETTER IOTA WITH TONOS;Ll;0;L;03B9 0301;;;;N;GREEK SMALL LETTER IOTA TONOS;;038A;;038A
+03B0;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS;Ll;0;L;03CB 0301;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS TONOS;;;;
+03B1;GREEK SMALL LETTER ALPHA;Ll;0;L;;;;;N;;;0391;;0391
+03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392
+03B3;GREEK SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0393;;0393
+03B4;GREEK SMALL LETTER DELTA;Ll;0;L;;;;;N;;;0394;;0394
+03B5;GREEK SMALL LETTER EPSILON;Ll;0;L;;;;;N;;;0395;;0395
+03B6;GREEK SMALL LETTER ZETA;Ll;0;L;;;;;N;;;0396;;0396
+03B7;GREEK SMALL LETTER ETA;Ll;0;L;;;;;N;;;0397;;0397
+03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398
+03B9;GREEK SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0399;;0399
+03BA;GREEK SMALL LETTER KAPPA;Ll;0;L;;;;;N;;;039A;;039A
+03BB;GREEK SMALL LETTER LAMDA;Ll;0;L;;;;;N;GREEK SMALL LETTER LAMBDA;;039B;;039B
+03BC;GREEK SMALL LETTER MU;Ll;0;L;;;;;N;;;039C;;039C
+03BD;GREEK SMALL LETTER NU;Ll;0;L;;;;;N;;;039D;;039D
+03BE;GREEK SMALL LETTER XI;Ll;0;L;;;;;N;;;039E;;039E
+03BF;GREEK SMALL LETTER OMICRON;Ll;0;L;;;;;N;;;039F;;039F
+03C0;GREEK SMALL LETTER PI;Ll;0;L;;;;;N;;;03A0;;03A0
+03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1
+03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3
+03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3
+03C4;GREEK SMALL LETTER TAU;Ll;0;L;;;;;N;;;03A4;;03A4
+03C5;GREEK SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;03A5;;03A5
+03C6;GREEK SMALL LETTER PHI;Ll;0;L;;;;;N;;;03A6;;03A6
+03C7;GREEK SMALL LETTER CHI;Ll;0;L;;;;;N;;;03A7;;03A7
+03C8;GREEK SMALL LETTER PSI;Ll;0;L;;;;;N;;;03A8;;03A8
+03C9;GREEK SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;03A9;;03A9
+03CA;GREEK SMALL LETTER IOTA WITH DIALYTIKA;Ll;0;L;03B9 0308;;;;N;GREEK SMALL LETTER IOTA DIAERESIS;;03AA;;03AA
+03CB;GREEK SMALL LETTER UPSILON WITH DIALYTIKA;Ll;0;L;03C5 0308;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS;;03AB;;03AB
+03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C
+03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E
+03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F
+03CF;GREEK CAPITAL KAI SYMBOL;Lu;0;L;;;;;N;;;;03D7;
+03D0;GREEK BETA SYMBOL;Ll;0;L;<compat> 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392
+03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398
+03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L;<compat> 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;;
+03D3;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL;Lu;0;L;03D2 0301;;;;N;GREEK CAPITAL LETTER UPSILON HOOK TONOS;;;;
+03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;;
+03D5;GREEK PHI SYMBOL;Ll;0;L;<compat> 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6
+03D6;GREEK PI SYMBOL;Ll;0;L;<compat> 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0
+03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;03CF;;03CF
+03D8;GREEK LETTER ARCHAIC KOPPA;Lu;0;L;;;;;N;;;;03D9;
+03D9;GREEK SMALL LETTER ARCHAIC KOPPA;Ll;0;L;;;;;N;;;03D8;;03D8
+03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB;
+03DB;GREEK SMALL LETTER STIGMA;Ll;0;L;;;;;N;;;03DA;;03DA
+03DC;GREEK LETTER DIGAMMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DIGAMMA;;;03DD;
+03DD;GREEK SMALL LETTER DIGAMMA;Ll;0;L;;;;;N;;;03DC;;03DC
+03DE;GREEK LETTER KOPPA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KOPPA;;;03DF;
+03DF;GREEK SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;03DE;;03DE
+03E0;GREEK LETTER SAMPI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SAMPI;;;03E1;
+03E1;GREEK SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;03E0;;03E0
+03E2;COPTIC CAPITAL LETTER SHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHEI;;;03E3;
+03E3;COPTIC SMALL LETTER SHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER SHEI;;03E2;;03E2
+03E4;COPTIC CAPITAL LETTER FEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER FEI;;;03E5;
+03E5;COPTIC SMALL LETTER FEI;Ll;0;L;;;;;N;GREEK SMALL LETTER FEI;;03E4;;03E4
+03E6;COPTIC CAPITAL LETTER KHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KHEI;;;03E7;
+03E7;COPTIC SMALL LETTER KHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER KHEI;;03E6;;03E6
+03E8;COPTIC CAPITAL LETTER HORI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER HORI;;;03E9;
+03E9;COPTIC SMALL LETTER HORI;Ll;0;L;;;;;N;GREEK SMALL LETTER HORI;;03E8;;03E8
+03EA;COPTIC CAPITAL LETTER GANGIA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER GANGIA;;;03EB;
+03EB;COPTIC SMALL LETTER GANGIA;Ll;0;L;;;;;N;GREEK SMALL LETTER GANGIA;;03EA;;03EA
+03EC;COPTIC CAPITAL LETTER SHIMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHIMA;;;03ED;
+03ED;COPTIC SMALL LETTER SHIMA;Ll;0;L;;;;;N;GREEK SMALL LETTER SHIMA;;03EC;;03EC
+03EE;COPTIC CAPITAL LETTER DEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DEI;;;03EF;
+03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE
+03F0;GREEK KAPPA SYMBOL;Ll;0;L;<compat> 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A
+03F1;GREEK RHO SYMBOL;Ll;0;L;<compat> 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1
+03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L;<compat> 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03F9;;03F9
+03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;037F;;037F
+03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L;<compat> 0398;;;;N;;;;03B8;
+03F5;GREEK LUNATE EPSILON SYMBOL;Ll;0;L;<compat> 03B5;;;;N;;;0395;;0395
+03F6;GREEK REVERSED LUNATE EPSILON SYMBOL;Sm;0;ON;;;;;N;;;;;
+03F7;GREEK CAPITAL LETTER SHO;Lu;0;L;;;;;N;;;;03F8;
+03F8;GREEK SMALL LETTER SHO;Ll;0;L;;;;;N;;;03F7;;03F7
+03F9;GREEK CAPITAL LUNATE SIGMA SYMBOL;Lu;0;L;<compat> 03A3;;;;N;;;;03F2;
+03FA;GREEK CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;03FB;
+03FB;GREEK SMALL LETTER SAN;Ll;0;L;;;;;N;;;03FA;;03FA
+03FC;GREEK RHO WITH STROKE SYMBOL;Ll;0;L;;;;;N;;;;;
+03FD;GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037B;
+03FE;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037C;
+03FF;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037D;
+0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450;
+0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451;
+0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;;;0452;
+0403;CYRILLIC CAPITAL LETTER GJE;Lu;0;L;0413 0301;;;;N;;;;0453;
+0404;CYRILLIC CAPITAL LETTER UKRAINIAN IE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER E;;;0454;
+0405;CYRILLIC CAPITAL LETTER DZE;Lu;0;L;;;;;N;;;;0455;
+0406;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER I;;;0456;
+0407;CYRILLIC CAPITAL LETTER YI;Lu;0;L;0406 0308;;;;N;;;;0457;
+0408;CYRILLIC CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;0458;
+0409;CYRILLIC CAPITAL LETTER LJE;Lu;0;L;;;;;N;;;;0459;
+040A;CYRILLIC CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;045A;
+040B;CYRILLIC CAPITAL LETTER TSHE;Lu;0;L;;;;;N;;;;045B;
+040C;CYRILLIC CAPITAL LETTER KJE;Lu;0;L;041A 0301;;;;N;;;;045C;
+040D;CYRILLIC CAPITAL LETTER I WITH GRAVE;Lu;0;L;0418 0300;;;;N;;;;045D;
+040E;CYRILLIC CAPITAL LETTER SHORT U;Lu;0;L;0423 0306;;;;N;;;;045E;
+040F;CYRILLIC CAPITAL LETTER DZHE;Lu;0;L;;;;;N;;;;045F;
+0410;CYRILLIC CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0430;
+0411;CYRILLIC CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;0431;
+0412;CYRILLIC CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;0432;
+0413;CYRILLIC CAPITAL LETTER GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE;;;0433;
+0414;CYRILLIC CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;0434;
+0415;CYRILLIC CAPITAL LETTER IE;Lu;0;L;;;;;N;;;;0435;
+0416;CYRILLIC CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;0436;
+0417;CYRILLIC CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;0437;
+0418;CYRILLIC CAPITAL LETTER I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER II;;;0438;
+0419;CYRILLIC CAPITAL LETTER SHORT I;Lu;0;L;0418 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT II;;;0439;
+041A;CYRILLIC CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;043A;
+041B;CYRILLIC CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;043B;
+041C;CYRILLIC CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;043C;
+041D;CYRILLIC CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;043D;
+041E;CYRILLIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;043E;
+041F;CYRILLIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;043F;
+0420;CYRILLIC CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;0440;
+0421;CYRILLIC CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;0441;
+0422;CYRILLIC CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;0442;
+0423;CYRILLIC CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0443;
+0424;CYRILLIC CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;0444;
+0425;CYRILLIC CAPITAL LETTER HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA;;;0445;
+0426;CYRILLIC CAPITAL LETTER TSE;Lu;0;L;;;;;N;;;;0446;
+0427;CYRILLIC CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;0447;
+0428;CYRILLIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0448;
+0429;CYRILLIC CAPITAL LETTER SHCHA;Lu;0;L;;;;;N;;;;0449;
+042A;CYRILLIC CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;044A;
+042B;CYRILLIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER YERI;;;044B;
+042C;CYRILLIC CAPITAL LETTER SOFT SIGN;Lu;0;L;;;;;N;;;;044C;
+042D;CYRILLIC CAPITAL LETTER E;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED E;;;044D;
+042E;CYRILLIC CAPITAL LETTER YU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IU;;;044E;
+042F;CYRILLIC CAPITAL LETTER YA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IA;;;044F;
+0430;CYRILLIC SMALL LETTER A;Ll;0;L;;;;;N;;;0410;;0410
+0431;CYRILLIC SMALL LETTER BE;Ll;0;L;;;;;N;;;0411;;0411
+0432;CYRILLIC SMALL LETTER VE;Ll;0;L;;;;;N;;;0412;;0412
+0433;CYRILLIC SMALL LETTER GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE;;0413;;0413
+0434;CYRILLIC SMALL LETTER DE;Ll;0;L;;;;;N;;;0414;;0414
+0435;CYRILLIC SMALL LETTER IE;Ll;0;L;;;;;N;;;0415;;0415
+0436;CYRILLIC SMALL LETTER ZHE;Ll;0;L;;;;;N;;;0416;;0416
+0437;CYRILLIC SMALL LETTER ZE;Ll;0;L;;;;;N;;;0417;;0417
+0438;CYRILLIC SMALL LETTER I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER II;;0418;;0418
+0439;CYRILLIC SMALL LETTER SHORT I;Ll;0;L;0438 0306;;;;N;CYRILLIC SMALL LETTER SHORT II;;0419;;0419
+043A;CYRILLIC SMALL LETTER KA;Ll;0;L;;;;;N;;;041A;;041A
+043B;CYRILLIC SMALL LETTER EL;Ll;0;L;;;;;N;;;041B;;041B
+043C;CYRILLIC SMALL LETTER EM;Ll;0;L;;;;;N;;;041C;;041C
+043D;CYRILLIC SMALL LETTER EN;Ll;0;L;;;;;N;;;041D;;041D
+043E;CYRILLIC SMALL LETTER O;Ll;0;L;;;;;N;;;041E;;041E
+043F;CYRILLIC SMALL LETTER PE;Ll;0;L;;;;;N;;;041F;;041F
+0440;CYRILLIC SMALL LETTER ER;Ll;0;L;;;;;N;;;0420;;0420
+0441;CYRILLIC SMALL LETTER ES;Ll;0;L;;;;;N;;;0421;;0421
+0442;CYRILLIC SMALL LETTER TE;Ll;0;L;;;;;N;;;0422;;0422
+0443;CYRILLIC SMALL LETTER U;Ll;0;L;;;;;N;;;0423;;0423
+0444;CYRILLIC SMALL LETTER EF;Ll;0;L;;;;;N;;;0424;;0424
+0445;CYRILLIC SMALL LETTER HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA;;0425;;0425
+0446;CYRILLIC SMALL LETTER TSE;Ll;0;L;;;;;N;;;0426;;0426
+0447;CYRILLIC SMALL LETTER CHE;Ll;0;L;;;;;N;;;0427;;0427
+0448;CYRILLIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;0428;;0428
+0449;CYRILLIC SMALL LETTER SHCHA;Ll;0;L;;;;;N;;;0429;;0429
+044A;CYRILLIC SMALL LETTER HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A
+044B;CYRILLIC SMALL LETTER YERU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER YERI;;042B;;042B
+044C;CYRILLIC SMALL LETTER SOFT SIGN;Ll;0;L;;;;;N;;;042C;;042C
+044D;CYRILLIC SMALL LETTER E;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED E;;042D;;042D
+044E;CYRILLIC SMALL LETTER YU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IU;;042E;;042E
+044F;CYRILLIC SMALL LETTER YA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IA;;042F;;042F
+0450;CYRILLIC SMALL LETTER IE WITH GRAVE;Ll;0;L;0435 0300;;;;N;;;0400;;0400
+0451;CYRILLIC SMALL LETTER IO;Ll;0;L;0435 0308;;;;N;;;0401;;0401
+0452;CYRILLIC SMALL LETTER DJE;Ll;0;L;;;;;N;;;0402;;0402
+0453;CYRILLIC SMALL LETTER GJE;Ll;0;L;0433 0301;;;;N;;;0403;;0403
+0454;CYRILLIC SMALL LETTER UKRAINIAN IE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER E;;0404;;0404
+0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405
+0456;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER I;;0406;;0406
+0457;CYRILLIC SMALL LETTER YI;Ll;0;L;0456 0308;;;;N;;;0407;;0407
+0458;CYRILLIC SMALL LETTER JE;Ll;0;L;;;;;N;;;0408;;0408
+0459;CYRILLIC SMALL LETTER LJE;Ll;0;L;;;;;N;;;0409;;0409
+045A;CYRILLIC SMALL LETTER NJE;Ll;0;L;;;;;N;;;040A;;040A
+045B;CYRILLIC SMALL LETTER TSHE;Ll;0;L;;;;;N;;;040B;;040B
+045C;CYRILLIC SMALL LETTER KJE;Ll;0;L;043A 0301;;;;N;;;040C;;040C
+045D;CYRILLIC SMALL LETTER I WITH GRAVE;Ll;0;L;0438 0300;;;;N;;;040D;;040D
+045E;CYRILLIC SMALL LETTER SHORT U;Ll;0;L;0443 0306;;;;N;;;040E;;040E
+045F;CYRILLIC SMALL LETTER DZHE;Ll;0;L;;;;;N;;;040F;;040F
+0460;CYRILLIC CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;0461;
+0461;CYRILLIC SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;0460;;0460
+0462;CYRILLIC CAPITAL LETTER YAT;Lu;0;L;;;;;N;;;;0463;
+0463;CYRILLIC SMALL LETTER YAT;Ll;0;L;;;;;N;;;0462;;0462
+0464;CYRILLIC CAPITAL LETTER IOTIFIED E;Lu;0;L;;;;;N;;;;0465;
+0465;CYRILLIC SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;0464;;0464
+0466;CYRILLIC CAPITAL LETTER LITTLE YUS;Lu;0;L;;;;;N;;;;0467;
+0467;CYRILLIC SMALL LETTER LITTLE YUS;Ll;0;L;;;;;N;;;0466;;0466
+0468;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS;Lu;0;L;;;;;N;;;;0469;
+0469;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS;Ll;0;L;;;;;N;;;0468;;0468
+046A;CYRILLIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;046B;
+046B;CYRILLIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;046A;;046A
+046C;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS;Lu;0;L;;;;;N;;;;046D;
+046D;CYRILLIC SMALL LETTER IOTIFIED BIG YUS;Ll;0;L;;;;;N;;;046C;;046C
+046E;CYRILLIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;046F;
+046F;CYRILLIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;046E;;046E
+0470;CYRILLIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;0471;
+0471;CYRILLIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;0470;;0470
+0472;CYRILLIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;0473;
+0473;CYRILLIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;0472;;0472
+0474;CYRILLIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;0475;
+0475;CYRILLIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;0474;;0474
+0476;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Lu;0;L;0474 030F;;;;N;CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE;;;0477;
+0477;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Ll;0;L;0475 030F;;;;N;CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE;;0476;;0476
+0478;CYRILLIC CAPITAL LETTER UK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER UK DIGRAPH;;;0479;
+0479;CYRILLIC SMALL LETTER UK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER UK DIGRAPH;;0478;;0478
+047A;CYRILLIC CAPITAL LETTER ROUND OMEGA;Lu;0;L;;;;;N;;;;047B;
+047B;CYRILLIC SMALL LETTER ROUND OMEGA;Ll;0;L;;;;;N;;;047A;;047A
+047C;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER OMEGA TITLO;;;047D;
+047D;CYRILLIC SMALL LETTER OMEGA WITH TITLO;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER OMEGA TITLO;;047C;;047C
+047E;CYRILLIC CAPITAL LETTER OT;Lu;0;L;;;;;N;;;;047F;
+047F;CYRILLIC SMALL LETTER OT;Ll;0;L;;;;;N;;;047E;;047E
+0480;CYRILLIC CAPITAL LETTER KOPPA;Lu;0;L;;;;;N;;;;0481;
+0481;CYRILLIC SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;0480;;0480
+0482;CYRILLIC THOUSANDS SIGN;So;0;L;;;;;N;;;;;
+0483;COMBINING CYRILLIC TITLO;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING TITLO;;;;
+0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;;
+0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;;
+0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;;
+0487;COMBINING CYRILLIC POKRYTIE;Mn;230;NSM;;;;;N;;;;;
+0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;;
+0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+048A;CYRILLIC CAPITAL LETTER SHORT I WITH TAIL;Lu;0;L;;;;;N;;;;048B;
+048B;CYRILLIC SMALL LETTER SHORT I WITH TAIL;Ll;0;L;;;;;N;;;048A;;048A
+048C;CYRILLIC CAPITAL LETTER SEMISOFT SIGN;Lu;0;L;;;;;N;;;;048D;
+048D;CYRILLIC SMALL LETTER SEMISOFT SIGN;Ll;0;L;;;;;N;;;048C;;048C
+048E;CYRILLIC CAPITAL LETTER ER WITH TICK;Lu;0;L;;;;;N;;;;048F;
+048F;CYRILLIC SMALL LETTER ER WITH TICK;Ll;0;L;;;;;N;;;048E;;048E
+0490;CYRILLIC CAPITAL LETTER GHE WITH UPTURN;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE WITH UPTURN;;;0491;
+0491;CYRILLIC SMALL LETTER GHE WITH UPTURN;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE WITH UPTURN;;0490;;0490
+0492;CYRILLIC CAPITAL LETTER GHE WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE BAR;;;0493;
+0493;CYRILLIC SMALL LETTER GHE WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE BAR;;0492;;0492
+0494;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE HOOK;;;0495;
+0495;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE HOOK;;0494;;0494
+0496;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER;;;0497;
+0497;CYRILLIC SMALL LETTER ZHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER;;0496;;0496
+0498;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZE CEDILLA;;;0499;
+0499;CYRILLIC SMALL LETTER ZE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZE CEDILLA;;0498;;0498
+049A;CYRILLIC CAPITAL LETTER KA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER;;;049B;
+049B;CYRILLIC SMALL LETTER KA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER;;049A;;049A
+049C;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA VERTICAL BAR;;;049D;
+049D;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA VERTICAL BAR;;049C;;049C
+049E;CYRILLIC CAPITAL LETTER KA WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA BAR;;;049F;
+049F;CYRILLIC SMALL LETTER KA WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA BAR;;049E;;049E
+04A0;CYRILLIC CAPITAL LETTER BASHKIR KA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED GE KA;;;04A1;
+04A1;CYRILLIC SMALL LETTER BASHKIR KA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED GE KA;;04A0;;04A0
+04A2;CYRILLIC CAPITAL LETTER EN WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER;;;04A3;
+04A3;CYRILLIC SMALL LETTER EN WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER;;04A2;;04A2
+04A4;CYRILLIC CAPITAL LIGATURE EN GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN GE;;;04A5;
+04A5;CYRILLIC SMALL LIGATURE EN GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN GE;;04A4;;04A4
+04A6;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER PE HOOK;;;04A7;
+04A7;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER PE HOOK;;04A6;;04A6
+04A8;CYRILLIC CAPITAL LETTER ABKHASIAN HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER O HOOK;;;04A9;
+04A9;CYRILLIC SMALL LETTER ABKHASIAN HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER O HOOK;;04A8;;04A8
+04AA;CYRILLIC CAPITAL LETTER ES WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ES CEDILLA;;;04AB;
+04AB;CYRILLIC SMALL LETTER ES WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ES CEDILLA;;04AA;;04AA
+04AC;CYRILLIC CAPITAL LETTER TE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER;;;04AD;
+04AD;CYRILLIC SMALL LETTER TE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER;;04AC;;04AC
+04AE;CYRILLIC CAPITAL LETTER STRAIGHT U;Lu;0;L;;;;;N;;;;04AF;
+04AF;CYRILLIC SMALL LETTER STRAIGHT U;Ll;0;L;;;;;N;;;04AE;;04AE
+04B0;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER STRAIGHT U BAR;;;04B1;
+04B1;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER STRAIGHT U BAR;;04B0;;04B0
+04B2;CYRILLIC CAPITAL LETTER HA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER;;;04B3;
+04B3;CYRILLIC SMALL LETTER HA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER;;04B2;;04B2
+04B4;CYRILLIC CAPITAL LIGATURE TE TSE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE TSE;;;04B5;
+04B5;CYRILLIC SMALL LIGATURE TE TSE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE TSE;;04B4;;04B4
+04B6;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER;;;04B7;
+04B7;CYRILLIC SMALL LETTER CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER;;04B6;;04B6
+04B8;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE VERTICAL BAR;;;04B9;
+04B9;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE VERTICAL BAR;;04B8;;04B8
+04BA;CYRILLIC CAPITAL LETTER SHHA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER H;;;04BB;
+04BB;CYRILLIC SMALL LETTER SHHA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER H;;04BA;;04BA
+04BC;CYRILLIC CAPITAL LETTER ABKHASIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK;;;04BD;
+04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC
+04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF;
+04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE
+04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;04CF;
+04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2;
+04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1
+04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4;
+04C4;CYRILLIC SMALL LETTER KA WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA HOOK;;04C3;;04C3
+04C5;CYRILLIC CAPITAL LETTER EL WITH TAIL;Lu;0;L;;;;;N;;;;04C6;
+04C6;CYRILLIC SMALL LETTER EL WITH TAIL;Ll;0;L;;;;;N;;;04C5;;04C5
+04C7;CYRILLIC CAPITAL LETTER EN WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN HOOK;;;04C8;
+04C8;CYRILLIC SMALL LETTER EN WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN HOOK;;04C7;;04C7
+04C9;CYRILLIC CAPITAL LETTER EN WITH TAIL;Lu;0;L;;;;;N;;;;04CA;
+04CA;CYRILLIC SMALL LETTER EN WITH TAIL;Ll;0;L;;;;;N;;;04C9;;04C9
+04CB;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER;;;04CC;
+04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB
+04CD;CYRILLIC CAPITAL LETTER EM WITH TAIL;Lu;0;L;;;;;N;;;;04CE;
+04CE;CYRILLIC SMALL LETTER EM WITH TAIL;Ll;0;L;;;;;N;;;04CD;;04CD
+04CF;CYRILLIC SMALL LETTER PALOCHKA;Ll;0;L;;;;;N;;;04C0;;04C0
+04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1;
+04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0
+04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3;
+04D3;CYRILLIC SMALL LETTER A WITH DIAERESIS;Ll;0;L;0430 0308;;;;N;;;04D2;;04D2
+04D4;CYRILLIC CAPITAL LIGATURE A IE;Lu;0;L;;;;;N;;;;04D5;
+04D5;CYRILLIC SMALL LIGATURE A IE;Ll;0;L;;;;;N;;;04D4;;04D4
+04D6;CYRILLIC CAPITAL LETTER IE WITH BREVE;Lu;0;L;0415 0306;;;;N;;;;04D7;
+04D7;CYRILLIC SMALL LETTER IE WITH BREVE;Ll;0;L;0435 0306;;;;N;;;04D6;;04D6
+04D8;CYRILLIC CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;04D9;
+04D9;CYRILLIC SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;04D8;;04D8
+04DA;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS;Lu;0;L;04D8 0308;;;;N;;;;04DB;
+04DB;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS;Ll;0;L;04D9 0308;;;;N;;;04DA;;04DA
+04DC;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS;Lu;0;L;0416 0308;;;;N;;;;04DD;
+04DD;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS;Ll;0;L;0436 0308;;;;N;;;04DC;;04DC
+04DE;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS;Lu;0;L;0417 0308;;;;N;;;;04DF;
+04DF;CYRILLIC SMALL LETTER ZE WITH DIAERESIS;Ll;0;L;0437 0308;;;;N;;;04DE;;04DE
+04E0;CYRILLIC CAPITAL LETTER ABKHASIAN DZE;Lu;0;L;;;;;N;;;;04E1;
+04E1;CYRILLIC SMALL LETTER ABKHASIAN DZE;Ll;0;L;;;;;N;;;04E0;;04E0
+04E2;CYRILLIC CAPITAL LETTER I WITH MACRON;Lu;0;L;0418 0304;;;;N;;;;04E3;
+04E3;CYRILLIC SMALL LETTER I WITH MACRON;Ll;0;L;0438 0304;;;;N;;;04E2;;04E2
+04E4;CYRILLIC CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0418 0308;;;;N;;;;04E5;
+04E5;CYRILLIC SMALL LETTER I WITH DIAERESIS;Ll;0;L;0438 0308;;;;N;;;04E4;;04E4
+04E6;CYRILLIC CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;041E 0308;;;;N;;;;04E7;
+04E7;CYRILLIC SMALL LETTER O WITH DIAERESIS;Ll;0;L;043E 0308;;;;N;;;04E6;;04E6
+04E8;CYRILLIC CAPITAL LETTER BARRED O;Lu;0;L;;;;;N;;;;04E9;
+04E9;CYRILLIC SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;04E8;;04E8
+04EA;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS;Lu;0;L;04E8 0308;;;;N;;;;04EB;
+04EB;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS;Ll;0;L;04E9 0308;;;;N;;;04EA;;04EA
+04EC;CYRILLIC CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;042D 0308;;;;N;;;;04ED;
+04ED;CYRILLIC SMALL LETTER E WITH DIAERESIS;Ll;0;L;044D 0308;;;;N;;;04EC;;04EC
+04EE;CYRILLIC CAPITAL LETTER U WITH MACRON;Lu;0;L;0423 0304;;;;N;;;;04EF;
+04EF;CYRILLIC SMALL LETTER U WITH MACRON;Ll;0;L;0443 0304;;;;N;;;04EE;;04EE
+04F0;CYRILLIC CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0423 0308;;;;N;;;;04F1;
+04F1;CYRILLIC SMALL LETTER U WITH DIAERESIS;Ll;0;L;0443 0308;;;;N;;;04F0;;04F0
+04F2;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0423 030B;;;;N;;;;04F3;
+04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2
+04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5;
+04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4
+04F6;CYRILLIC CAPITAL LETTER GHE WITH DESCENDER;Lu;0;L;;;;;N;;;;04F7;
+04F7;CYRILLIC SMALL LETTER GHE WITH DESCENDER;Ll;0;L;;;;;N;;;04F6;;04F6
+04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9;
+04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8
+04FA;CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK;Lu;0;L;;;;;N;;;;04FB;
+04FB;CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK;Ll;0;L;;;;;N;;;04FA;;04FA
+04FC;CYRILLIC CAPITAL LETTER HA WITH HOOK;Lu;0;L;;;;;N;;;;04FD;
+04FD;CYRILLIC SMALL LETTER HA WITH HOOK;Ll;0;L;;;;;N;;;04FC;;04FC
+04FE;CYRILLIC CAPITAL LETTER HA WITH STROKE;Lu;0;L;;;;;N;;;;04FF;
+04FF;CYRILLIC SMALL LETTER HA WITH STROKE;Ll;0;L;;;;;N;;;04FE;;04FE
+0500;CYRILLIC CAPITAL LETTER KOMI DE;Lu;0;L;;;;;N;;;;0501;
+0501;CYRILLIC SMALL LETTER KOMI DE;Ll;0;L;;;;;N;;;0500;;0500
+0502;CYRILLIC CAPITAL LETTER KOMI DJE;Lu;0;L;;;;;N;;;;0503;
+0503;CYRILLIC SMALL LETTER KOMI DJE;Ll;0;L;;;;;N;;;0502;;0502
+0504;CYRILLIC CAPITAL LETTER KOMI ZJE;Lu;0;L;;;;;N;;;;0505;
+0505;CYRILLIC SMALL LETTER KOMI ZJE;Ll;0;L;;;;;N;;;0504;;0504
+0506;CYRILLIC CAPITAL LETTER KOMI DZJE;Lu;0;L;;;;;N;;;;0507;
+0507;CYRILLIC SMALL LETTER KOMI DZJE;Ll;0;L;;;;;N;;;0506;;0506
+0508;CYRILLIC CAPITAL LETTER KOMI LJE;Lu;0;L;;;;;N;;;;0509;
+0509;CYRILLIC SMALL LETTER KOMI LJE;Ll;0;L;;;;;N;;;0508;;0508
+050A;CYRILLIC CAPITAL LETTER KOMI NJE;Lu;0;L;;;;;N;;;;050B;
+050B;CYRILLIC SMALL LETTER KOMI NJE;Ll;0;L;;;;;N;;;050A;;050A
+050C;CYRILLIC CAPITAL LETTER KOMI SJE;Lu;0;L;;;;;N;;;;050D;
+050D;CYRILLIC SMALL LETTER KOMI SJE;Ll;0;L;;;;;N;;;050C;;050C
+050E;CYRILLIC CAPITAL LETTER KOMI TJE;Lu;0;L;;;;;N;;;;050F;
+050F;CYRILLIC SMALL LETTER KOMI TJE;Ll;0;L;;;;;N;;;050E;;050E
+0510;CYRILLIC CAPITAL LETTER REVERSED ZE;Lu;0;L;;;;;N;;;;0511;
+0511;CYRILLIC SMALL LETTER REVERSED ZE;Ll;0;L;;;;;N;;;0510;;0510
+0512;CYRILLIC CAPITAL LETTER EL WITH HOOK;Lu;0;L;;;;;N;;;;0513;
+0513;CYRILLIC SMALL LETTER EL WITH HOOK;Ll;0;L;;;;;N;;;0512;;0512
+0514;CYRILLIC CAPITAL LETTER LHA;Lu;0;L;;;;;N;;;;0515;
+0515;CYRILLIC SMALL LETTER LHA;Ll;0;L;;;;;N;;;0514;;0514
+0516;CYRILLIC CAPITAL LETTER RHA;Lu;0;L;;;;;N;;;;0517;
+0517;CYRILLIC SMALL LETTER RHA;Ll;0;L;;;;;N;;;0516;;0516
+0518;CYRILLIC CAPITAL LETTER YAE;Lu;0;L;;;;;N;;;;0519;
+0519;CYRILLIC SMALL LETTER YAE;Ll;0;L;;;;;N;;;0518;;0518
+051A;CYRILLIC CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;051B;
+051B;CYRILLIC SMALL LETTER QA;Ll;0;L;;;;;N;;;051A;;051A
+051C;CYRILLIC CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;051D;
+051D;CYRILLIC SMALL LETTER WE;Ll;0;L;;;;;N;;;051C;;051C
+051E;CYRILLIC CAPITAL LETTER ALEUT KA;Lu;0;L;;;;;N;;;;051F;
+051F;CYRILLIC SMALL LETTER ALEUT KA;Ll;0;L;;;;;N;;;051E;;051E
+0520;CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0521;
+0521;CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0520;;0520
+0522;CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0523;
+0523;CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0522;;0522
+0524;CYRILLIC CAPITAL LETTER PE WITH DESCENDER;Lu;0;L;;;;;N;;;;0525;
+0525;CYRILLIC SMALL LETTER PE WITH DESCENDER;Ll;0;L;;;;;N;;;0524;;0524
+0526;CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER;Lu;0;L;;;;;N;;;;0527;
+0527;CYRILLIC SMALL LETTER SHHA WITH DESCENDER;Ll;0;L;;;;;N;;;0526;;0526
+0528;CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK;Lu;0;L;;;;;N;;;;0529;
+0529;CYRILLIC SMALL LETTER EN WITH LEFT HOOK;Ll;0;L;;;;;N;;;0528;;0528
+052A;CYRILLIC CAPITAL LETTER DZZHE;Lu;0;L;;;;;N;;;;052B;
+052B;CYRILLIC SMALL LETTER DZZHE;Ll;0;L;;;;;N;;;052A;;052A
+052C;CYRILLIC CAPITAL LETTER DCHE;Lu;0;L;;;;;N;;;;052D;
+052D;CYRILLIC SMALL LETTER DCHE;Ll;0;L;;;;;N;;;052C;;052C
+052E;CYRILLIC CAPITAL LETTER EL WITH DESCENDER;Lu;0;L;;;;;N;;;;052F;
+052F;CYRILLIC SMALL LETTER EL WITH DESCENDER;Ll;0;L;;;;;N;;;052E;;052E
+0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561;
+0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562;
+0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563;
+0534;ARMENIAN CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;0564;
+0535;ARMENIAN CAPITAL LETTER ECH;Lu;0;L;;;;;N;;;;0565;
+0536;ARMENIAN CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;0566;
+0537;ARMENIAN CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;0567;
+0538;ARMENIAN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;0568;
+0539;ARMENIAN CAPITAL LETTER TO;Lu;0;L;;;;;N;;;;0569;
+053A;ARMENIAN CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;056A;
+053B;ARMENIAN CAPITAL LETTER INI;Lu;0;L;;;;;N;;;;056B;
+053C;ARMENIAN CAPITAL LETTER LIWN;Lu;0;L;;;;;N;;;;056C;
+053D;ARMENIAN CAPITAL LETTER XEH;Lu;0;L;;;;;N;;;;056D;
+053E;ARMENIAN CAPITAL LETTER CA;Lu;0;L;;;;;N;;;;056E;
+053F;ARMENIAN CAPITAL LETTER KEN;Lu;0;L;;;;;N;;;;056F;
+0540;ARMENIAN CAPITAL LETTER HO;Lu;0;L;;;;;N;;;;0570;
+0541;ARMENIAN CAPITAL LETTER JA;Lu;0;L;;;;;N;;;;0571;
+0542;ARMENIAN CAPITAL LETTER GHAD;Lu;0;L;;;;;N;ARMENIAN CAPITAL LETTER LAD;;;0572;
+0543;ARMENIAN CAPITAL LETTER CHEH;Lu;0;L;;;;;N;;;;0573;
+0544;ARMENIAN CAPITAL LETTER MEN;Lu;0;L;;;;;N;;;;0574;
+0545;ARMENIAN CAPITAL LETTER YI;Lu;0;L;;;;;N;;;;0575;
+0546;ARMENIAN CAPITAL LETTER NOW;Lu;0;L;;;;;N;;;;0576;
+0547;ARMENIAN CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0577;
+0548;ARMENIAN CAPITAL LETTER VO;Lu;0;L;;;;;N;;;;0578;
+0549;ARMENIAN CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;0579;
+054A;ARMENIAN CAPITAL LETTER PEH;Lu;0;L;;;;;N;;;;057A;
+054B;ARMENIAN CAPITAL LETTER JHEH;Lu;0;L;;;;;N;;;;057B;
+054C;ARMENIAN CAPITAL LETTER RA;Lu;0;L;;;;;N;;;;057C;
+054D;ARMENIAN CAPITAL LETTER SEH;Lu;0;L;;;;;N;;;;057D;
+054E;ARMENIAN CAPITAL LETTER VEW;Lu;0;L;;;;;N;;;;057E;
+054F;ARMENIAN CAPITAL LETTER TIWN;Lu;0;L;;;;;N;;;;057F;
+0550;ARMENIAN CAPITAL LETTER REH;Lu;0;L;;;;;N;;;;0580;
+0551;ARMENIAN CAPITAL LETTER CO;Lu;0;L;;;;;N;;;;0581;
+0552;ARMENIAN CAPITAL LETTER YIWN;Lu;0;L;;;;;N;;;;0582;
+0553;ARMENIAN CAPITAL LETTER PIWR;Lu;0;L;;;;;N;;;;0583;
+0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584;
+0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585;
+0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586;
+0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;;
+055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;;
+055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;;
+055C;ARMENIAN EXCLAMATION MARK;Po;0;L;;;;;N;;;;;
+055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;;
+055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;;
+055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;;
+0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531
+0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532
+0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533
+0564;ARMENIAN SMALL LETTER DA;Ll;0;L;;;;;N;;;0534;;0534
+0565;ARMENIAN SMALL LETTER ECH;Ll;0;L;;;;;N;;;0535;;0535
+0566;ARMENIAN SMALL LETTER ZA;Ll;0;L;;;;;N;;;0536;;0536
+0567;ARMENIAN SMALL LETTER EH;Ll;0;L;;;;;N;;;0537;;0537
+0568;ARMENIAN SMALL LETTER ET;Ll;0;L;;;;;N;;;0538;;0538
+0569;ARMENIAN SMALL LETTER TO;Ll;0;L;;;;;N;;;0539;;0539
+056A;ARMENIAN SMALL LETTER ZHE;Ll;0;L;;;;;N;;;053A;;053A
+056B;ARMENIAN SMALL LETTER INI;Ll;0;L;;;;;N;;;053B;;053B
+056C;ARMENIAN SMALL LETTER LIWN;Ll;0;L;;;;;N;;;053C;;053C
+056D;ARMENIAN SMALL LETTER XEH;Ll;0;L;;;;;N;;;053D;;053D
+056E;ARMENIAN SMALL LETTER CA;Ll;0;L;;;;;N;;;053E;;053E
+056F;ARMENIAN SMALL LETTER KEN;Ll;0;L;;;;;N;;;053F;;053F
+0570;ARMENIAN SMALL LETTER HO;Ll;0;L;;;;;N;;;0540;;0540
+0571;ARMENIAN SMALL LETTER JA;Ll;0;L;;;;;N;;;0541;;0541
+0572;ARMENIAN SMALL LETTER GHAD;Ll;0;L;;;;;N;ARMENIAN SMALL LETTER LAD;;0542;;0542
+0573;ARMENIAN SMALL LETTER CHEH;Ll;0;L;;;;;N;;;0543;;0543
+0574;ARMENIAN SMALL LETTER MEN;Ll;0;L;;;;;N;;;0544;;0544
+0575;ARMENIAN SMALL LETTER YI;Ll;0;L;;;;;N;;;0545;;0545
+0576;ARMENIAN SMALL LETTER NOW;Ll;0;L;;;;;N;;;0546;;0546
+0577;ARMENIAN SMALL LETTER SHA;Ll;0;L;;;;;N;;;0547;;0547
+0578;ARMENIAN SMALL LETTER VO;Ll;0;L;;;;;N;;;0548;;0548
+0579;ARMENIAN SMALL LETTER CHA;Ll;0;L;;;;;N;;;0549;;0549
+057A;ARMENIAN SMALL LETTER PEH;Ll;0;L;;;;;N;;;054A;;054A
+057B;ARMENIAN SMALL LETTER JHEH;Ll;0;L;;;;;N;;;054B;;054B
+057C;ARMENIAN SMALL LETTER RA;Ll;0;L;;;;;N;;;054C;;054C
+057D;ARMENIAN SMALL LETTER SEH;Ll;0;L;;;;;N;;;054D;;054D
+057E;ARMENIAN SMALL LETTER VEW;Ll;0;L;;;;;N;;;054E;;054E
+057F;ARMENIAN SMALL LETTER TIWN;Ll;0;L;;;;;N;;;054F;;054F
+0580;ARMENIAN SMALL LETTER REH;Ll;0;L;;;;;N;;;0550;;0550
+0581;ARMENIAN SMALL LETTER CO;Ll;0;L;;;;;N;;;0551;;0551
+0582;ARMENIAN SMALL LETTER YIWN;Ll;0;L;;;;;N;;;0552;;0552
+0583;ARMENIAN SMALL LETTER PIWR;Ll;0;L;;;;;N;;;0553;;0553
+0584;ARMENIAN SMALL LETTER KEH;Ll;0;L;;;;;N;;;0554;;0554
+0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555
+0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556
+0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L;<compat> 0565 0582;;;;N;;;;;
+0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;;
+058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;;
+058D;RIGHT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;;
+058E;LEFT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;;
+058F;ARMENIAN DRAM SIGN;Sc;0;ET;;;;;N;;;;;
+0591;HEBREW ACCENT ETNAHTA;Mn;220;NSM;;;;;N;;;;;
+0592;HEBREW ACCENT SEGOL;Mn;230;NSM;;;;;N;;;;;
+0593;HEBREW ACCENT SHALSHELET;Mn;230;NSM;;;;;N;;;;;
+0594;HEBREW ACCENT ZAQEF QATAN;Mn;230;NSM;;;;;N;;;;;
+0595;HEBREW ACCENT ZAQEF GADOL;Mn;230;NSM;;;;;N;;;;;
+0596;HEBREW ACCENT TIPEHA;Mn;220;NSM;;;;;N;;;;;
+0597;HEBREW ACCENT REVIA;Mn;230;NSM;;;;;N;;;;;
+0598;HEBREW ACCENT ZARQA;Mn;230;NSM;;;;;N;;;;;
+0599;HEBREW ACCENT PASHTA;Mn;230;NSM;;;;;N;;;;;
+059A;HEBREW ACCENT YETIV;Mn;222;NSM;;;;;N;;;;;
+059B;HEBREW ACCENT TEVIR;Mn;220;NSM;;;;;N;;;;;
+059C;HEBREW ACCENT GERESH;Mn;230;NSM;;;;;N;;;;;
+059D;HEBREW ACCENT GERESH MUQDAM;Mn;230;NSM;;;;;N;;;;;
+059E;HEBREW ACCENT GERSHAYIM;Mn;230;NSM;;;;;N;;;;;
+059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;;
+05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;;
+05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;;
+05A2;HEBREW ACCENT ATNAH HAFUKH;Mn;220;NSM;;;;;N;;;;;
+05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;;
+05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;;
+05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;;;;
+05A6;HEBREW ACCENT MERKHA KEFULA;Mn;220;NSM;;;;;N;;;;;
+05A7;HEBREW ACCENT DARGA;Mn;220;NSM;;;;;N;;;;;
+05A8;HEBREW ACCENT QADMA;Mn;230;NSM;;;;;N;;;;;
+05A9;HEBREW ACCENT TELISHA QETANA;Mn;230;NSM;;;;;N;;;;;
+05AA;HEBREW ACCENT YERAH BEN YOMO;Mn;220;NSM;;;;;N;;;;;
+05AB;HEBREW ACCENT OLE;Mn;230;NSM;;;;;N;;;;;
+05AC;HEBREW ACCENT ILUY;Mn;230;NSM;;;;;N;;;;;
+05AD;HEBREW ACCENT DEHI;Mn;222;NSM;;;;;N;;;;;
+05AE;HEBREW ACCENT ZINOR;Mn;228;NSM;;;;;N;;;;;
+05AF;HEBREW MARK MASORA CIRCLE;Mn;230;NSM;;;;;N;;;;;
+05B0;HEBREW POINT SHEVA;Mn;10;NSM;;;;;N;;;;;
+05B1;HEBREW POINT HATAF SEGOL;Mn;11;NSM;;;;;N;;;;;
+05B2;HEBREW POINT HATAF PATAH;Mn;12;NSM;;;;;N;;;;;
+05B3;HEBREW POINT HATAF QAMATS;Mn;13;NSM;;;;;N;;;;;
+05B4;HEBREW POINT HIRIQ;Mn;14;NSM;;;;;N;;;;;
+05B5;HEBREW POINT TSERE;Mn;15;NSM;;;;;N;;;;;
+05B6;HEBREW POINT SEGOL;Mn;16;NSM;;;;;N;;;;;
+05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;;
+05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;;
+05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;;
+05BA;HEBREW POINT HOLAM HASER FOR VAV;Mn;19;NSM;;;;;N;;;;;
+05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;;
+05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;;;;
+05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;;;;
+05BE;HEBREW PUNCTUATION MAQAF;Pd;0;R;;;;;N;;;;;
+05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;;
+05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;;;;
+05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;;
+05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;;
+05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;;;;
+05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;;
+05C5;HEBREW MARK LOWER DOT;Mn;220;NSM;;;;;N;;;;;
+05C6;HEBREW PUNCTUATION NUN HAFUKHA;Po;0;R;;;;;N;;;;;
+05C7;HEBREW POINT QAMATS QATAN;Mn;18;NSM;;;;;N;;;;;
+05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;;
+05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;;
+05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;;
+05D3;HEBREW LETTER DALET;Lo;0;R;;;;;N;;;;;
+05D4;HEBREW LETTER HE;Lo;0;R;;;;;N;;;;;
+05D5;HEBREW LETTER VAV;Lo;0;R;;;;;N;;;;;
+05D6;HEBREW LETTER ZAYIN;Lo;0;R;;;;;N;;;;;
+05D7;HEBREW LETTER HET;Lo;0;R;;;;;N;;;;;
+05D8;HEBREW LETTER TET;Lo;0;R;;;;;N;;;;;
+05D9;HEBREW LETTER YOD;Lo;0;R;;;;;N;;;;;
+05DA;HEBREW LETTER FINAL KAF;Lo;0;R;;;;;N;;;;;
+05DB;HEBREW LETTER KAF;Lo;0;R;;;;;N;;;;;
+05DC;HEBREW LETTER LAMED;Lo;0;R;;;;;N;;;;;
+05DD;HEBREW LETTER FINAL MEM;Lo;0;R;;;;;N;;;;;
+05DE;HEBREW LETTER MEM;Lo;0;R;;;;;N;;;;;
+05DF;HEBREW LETTER FINAL NUN;Lo;0;R;;;;;N;;;;;
+05E0;HEBREW LETTER NUN;Lo;0;R;;;;;N;;;;;
+05E1;HEBREW LETTER SAMEKH;Lo;0;R;;;;;N;;;;;
+05E2;HEBREW LETTER AYIN;Lo;0;R;;;;;N;;;;;
+05E3;HEBREW LETTER FINAL PE;Lo;0;R;;;;;N;;;;;
+05E4;HEBREW LETTER PE;Lo;0;R;;;;;N;;;;;
+05E5;HEBREW LETTER FINAL TSADI;Lo;0;R;;;;;N;;;;;
+05E6;HEBREW LETTER TSADI;Lo;0;R;;;;;N;;;;;
+05E7;HEBREW LETTER QOF;Lo;0;R;;;;;N;;;;;
+05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;;
+05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;;
+05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;;
+05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;;
+05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;;
+05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;;
+05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;;
+05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;;
+0600;ARABIC NUMBER SIGN;Cf;0;AN;;;;;N;;;;;
+0601;ARABIC SIGN SANAH;Cf;0;AN;;;;;N;;;;;
+0602;ARABIC FOOTNOTE MARKER;Cf;0;AN;;;;;N;;;;;
+0603;ARABIC SIGN SAFHA;Cf;0;AN;;;;;N;;;;;
+0604;ARABIC SIGN SAMVAT;Cf;0;AN;;;;;N;;;;;
+0605;ARABIC NUMBER MARK ABOVE;Cf;0;AN;;;;;N;;;;;
+0606;ARABIC-INDIC CUBE ROOT;Sm;0;ON;;;;;N;;;;;
+0607;ARABIC-INDIC FOURTH ROOT;Sm;0;ON;;;;;N;;;;;
+0608;ARABIC RAY;Sm;0;AL;;;;;N;;;;;
+0609;ARABIC-INDIC PER MILLE SIGN;Po;0;ET;;;;;N;;;;;
+060A;ARABIC-INDIC PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;;
+060B;AFGHANI SIGN;Sc;0;AL;;;;;N;;;;;
+060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;;
+060D;ARABIC DATE SEPARATOR;Po;0;AL;;;;;N;;;;;
+060E;ARABIC POETIC VERSE SIGN;So;0;ON;;;;;N;;;;;
+060F;ARABIC SIGN MISRA;So;0;ON;;;;;N;;;;;
+0610;ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM;Mn;230;NSM;;;;;N;;;;;
+0611;ARABIC SIGN ALAYHE ASSALLAM;Mn;230;NSM;;;;;N;;;;;
+0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;;
+0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;;
+0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;;
+0615;ARABIC SMALL HIGH TAH;Mn;230;NSM;;;;;N;;;;;
+0616;ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH;Mn;230;NSM;;;;;N;;;;;
+0617;ARABIC SMALL HIGH ZAIN;Mn;230;NSM;;;;;N;;;;;
+0618;ARABIC SMALL FATHA;Mn;30;NSM;;;;;N;;;;;
+0619;ARABIC SMALL DAMMA;Mn;31;NSM;;;;;N;;;;;
+061A;ARABIC SMALL KASRA;Mn;32;NSM;;;;;N;;;;;
+061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;;
+061C;ARABIC LETTER MARK;Cf;0;AL;;;;;N;;;;;
+061E;ARABIC TRIPLE DOT PUNCTUATION MARK;Po;0;AL;;;;;N;;;;;
+061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;;
+0620;ARABIC LETTER KASHMIRI YEH;Lo;0;AL;;;;;N;;;;;
+0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;;
+0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;;
+0623;ARABIC LETTER ALEF WITH HAMZA ABOVE;Lo;0;AL;0627 0654;;;;N;ARABIC LETTER HAMZAH ON ALEF;;;;
+0624;ARABIC LETTER WAW WITH HAMZA ABOVE;Lo;0;AL;0648 0654;;;;N;ARABIC LETTER HAMZAH ON WAW;;;;
+0625;ARABIC LETTER ALEF WITH HAMZA BELOW;Lo;0;AL;0627 0655;;;;N;ARABIC LETTER HAMZAH UNDER ALEF;;;;
+0626;ARABIC LETTER YEH WITH HAMZA ABOVE;Lo;0;AL;064A 0654;;;;N;ARABIC LETTER HAMZAH ON YA;;;;
+0627;ARABIC LETTER ALEF;Lo;0;AL;;;;;N;;;;;
+0628;ARABIC LETTER BEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA;;;;
+0629;ARABIC LETTER TEH MARBUTA;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH;;;;
+062A;ARABIC LETTER TEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA;;;;
+062B;ARABIC LETTER THEH;Lo;0;AL;;;;;N;ARABIC LETTER THAA;;;;
+062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;;
+062D;ARABIC LETTER HAH;Lo;0;AL;;;;;N;ARABIC LETTER HAA;;;;
+062E;ARABIC LETTER KHAH;Lo;0;AL;;;;;N;ARABIC LETTER KHAA;;;;
+062F;ARABIC LETTER DAL;Lo;0;AL;;;;;N;;;;;
+0630;ARABIC LETTER THAL;Lo;0;AL;;;;;N;;;;;
+0631;ARABIC LETTER REH;Lo;0;AL;;;;;N;ARABIC LETTER RA;;;;
+0632;ARABIC LETTER ZAIN;Lo;0;AL;;;;;N;;;;;
+0633;ARABIC LETTER SEEN;Lo;0;AL;;;;;N;;;;;
+0634;ARABIC LETTER SHEEN;Lo;0;AL;;;;;N;;;;;
+0635;ARABIC LETTER SAD;Lo;0;AL;;;;;N;;;;;
+0636;ARABIC LETTER DAD;Lo;0;AL;;;;;N;;;;;
+0637;ARABIC LETTER TAH;Lo;0;AL;;;;;N;;;;;
+0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;;
+0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;;
+063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;;
+063B;ARABIC LETTER KEHEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+063C;ARABIC LETTER KEHEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+063D;ARABIC LETTER FARSI YEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+063E;ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+063F;ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;;
+0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;;
+0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;;
+0643;ARABIC LETTER KAF;Lo;0;AL;;;;;N;ARABIC LETTER CAF;;;;
+0644;ARABIC LETTER LAM;Lo;0;AL;;;;;N;;;;;
+0645;ARABIC LETTER MEEM;Lo;0;AL;;;;;N;;;;;
+0646;ARABIC LETTER NOON;Lo;0;AL;;;;;N;;;;;
+0647;ARABIC LETTER HEH;Lo;0;AL;;;;;N;ARABIC LETTER HA;;;;
+0648;ARABIC LETTER WAW;Lo;0;AL;;;;;N;;;;;
+0649;ARABIC LETTER ALEF MAKSURA;Lo;0;AL;;;;;N;ARABIC LETTER ALEF MAQSURAH;;;;
+064A;ARABIC LETTER YEH;Lo;0;AL;;;;;N;ARABIC LETTER YA;;;;
+064B;ARABIC FATHATAN;Mn;27;NSM;;;;;N;;;;;
+064C;ARABIC DAMMATAN;Mn;28;NSM;;;;;N;;;;;
+064D;ARABIC KASRATAN;Mn;29;NSM;;;;;N;;;;;
+064E;ARABIC FATHA;Mn;30;NSM;;;;;N;ARABIC FATHAH;;;;
+064F;ARABIC DAMMA;Mn;31;NSM;;;;;N;ARABIC DAMMAH;;;;
+0650;ARABIC KASRA;Mn;32;NSM;;;;;N;ARABIC KASRAH;;;;
+0651;ARABIC SHADDA;Mn;33;NSM;;;;;N;ARABIC SHADDAH;;;;
+0652;ARABIC SUKUN;Mn;34;NSM;;;;;N;;;;;
+0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;;
+0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;;
+0656;ARABIC SUBSCRIPT ALEF;Mn;220;NSM;;;;;N;;;;;
+0657;ARABIC INVERTED DAMMA;Mn;230;NSM;;;;;N;;;;;
+0658;ARABIC MARK NOON GHUNNA;Mn;230;NSM;;;;;N;;;;;
+0659;ARABIC ZWARAKAY;Mn;230;NSM;;;;;N;;;;;
+065A;ARABIC VOWEL SIGN SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;;
+065B;ARABIC VOWEL SIGN INVERTED SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;;
+065C;ARABIC VOWEL SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;;
+065D;ARABIC REVERSED DAMMA;Mn;230;NSM;;;;;N;;;;;
+065E;ARABIC FATHA WITH TWO DOTS;Mn;230;NSM;;;;;N;;;;;
+065F;ARABIC WAVY HAMZA BELOW;Mn;220;NSM;;;;;N;;;;;
+0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;;
+0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;;
+0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;;
+0663;ARABIC-INDIC DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;;
+0664;ARABIC-INDIC DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;;
+0665;ARABIC-INDIC DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;;
+0666;ARABIC-INDIC DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;;
+0667;ARABIC-INDIC DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;;
+0668;ARABIC-INDIC DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;;
+0669;ARABIC-INDIC DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;;
+066A;ARABIC PERCENT SIGN;Po;0;ET;;;;;N;;;;;
+066B;ARABIC DECIMAL SEPARATOR;Po;0;AN;;;;;N;;;;;
+066C;ARABIC THOUSANDS SEPARATOR;Po;0;AN;;;;;N;;;;;
+066D;ARABIC FIVE POINTED STAR;Po;0;AL;;;;;N;;;;;
+066E;ARABIC LETTER DOTLESS BEH;Lo;0;AL;;;;;N;;;;;
+066F;ARABIC LETTER DOTLESS QAF;Lo;0;AL;;;;;N;;;;;
+0670;ARABIC LETTER SUPERSCRIPT ALEF;Mn;35;NSM;;;;;N;ARABIC ALEF ABOVE;;;;
+0671;ARABIC LETTER ALEF WASLA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAT WASL ON ALEF;;;;
+0672;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH ON ALEF;;;;
+0673;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH UNDER ALEF;;;;
+0674;ARABIC LETTER HIGH HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HIGH HAMZAH;;;;
+0675;ARABIC LETTER HIGH HAMZA ALEF;Lo;0;AL;<compat> 0627 0674;;;;N;ARABIC LETTER HIGH HAMZAH ALEF;;;;
+0676;ARABIC LETTER HIGH HAMZA WAW;Lo;0;AL;<compat> 0648 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW;;;;
+0677;ARABIC LETTER U WITH HAMZA ABOVE;Lo;0;AL;<compat> 06C7 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH;;;;
+0678;ARABIC LETTER HIGH HAMZA YEH;Lo;0;AL;<compat> 064A 0674;;;;N;ARABIC LETTER HIGH HAMZAH YA;;;;
+0679;ARABIC LETTER TTEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH SMALL TAH;;;;
+067A;ARABIC LETTER TTEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE;;;;
+067B;ARABIC LETTER BEEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW;;;;
+067C;ARABIC LETTER TEH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH RING;;;;
+067D;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD;;;;
+067E;ARABIC LETTER PEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS BELOW;;;;
+067F;ARABIC LETTER TEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH FOUR DOTS ABOVE;;;;
+0680;ARABIC LETTER BEHEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH FOUR DOTS BELOW;;;;
+0681;ARABIC LETTER HAH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH ON HAA;;;;
+0682;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE;;;;
+0683;ARABIC LETTER NYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS;;;;
+0684;ARABIC LETTER DYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL;;;;
+0685;ARABIC LETTER HAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH THREE DOTS ABOVE;;;;
+0686;ARABIC LETTER TCHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD;;;;
+0687;ARABIC LETTER TCHEHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE FOUR DOTS;;;;
+0688;ARABIC LETTER DDAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH SMALL TAH;;;;
+0689;ARABIC LETTER DAL WITH RING;Lo;0;AL;;;;;N;;;;;
+068A;ARABIC LETTER DAL WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+068B;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;;
+068C;ARABIC LETTER DAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS ABOVE;;;;
+068D;ARABIC LETTER DDAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS BELOW;;;;
+068E;ARABIC LETTER DUL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE;;;;
+068F;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD;;;;
+0690;ARABIC LETTER DAL WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0691;ARABIC LETTER RREH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL TAH;;;;
+0692;ARABIC LETTER REH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V;;;;
+0693;ARABIC LETTER REH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH RING;;;;
+0694;ARABIC LETTER REH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW;;;;
+0695;ARABIC LETTER REH WITH SMALL V BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V BELOW;;;;
+0696;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE;;;;
+0697;ARABIC LETTER REH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH TWO DOTS ABOVE;;;;
+0698;ARABIC LETTER JEH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH THREE DOTS ABOVE;;;;
+0699;ARABIC LETTER REH WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH FOUR DOTS ABOVE;;;;
+069A;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+069B;ARABIC LETTER SEEN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+069C;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+069D;ARABIC LETTER SAD WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+069E;ARABIC LETTER SAD WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+069F;ARABIC LETTER TAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06A0;ARABIC LETTER AIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06A1;ARABIC LETTER DOTLESS FEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS FA;;;;
+06A2;ARABIC LETTER FEH WITH DOT MOVED BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT MOVED BELOW;;;;
+06A3;ARABIC LETTER FEH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT BELOW;;;;
+06A4;ARABIC LETTER VEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS ABOVE;;;;
+06A5;ARABIC LETTER FEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS BELOW;;;;
+06A6;ARABIC LETTER PEHEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH FOUR DOTS ABOVE;;;;
+06A7;ARABIC LETTER QAF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06A8;ARABIC LETTER QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06A9;ARABIC LETTER KEHEH;Lo;0;AL;;;;;N;ARABIC LETTER OPEN CAF;;;;
+06AA;ARABIC LETTER SWASH KAF;Lo;0;AL;;;;;N;ARABIC LETTER SWASH CAF;;;;
+06AB;ARABIC LETTER KAF WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH RING;;;;
+06AC;ARABIC LETTER KAF WITH DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH DOT ABOVE;;;;
+06AD;ARABIC LETTER NG;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS ABOVE;;;;
+06AE;ARABIC LETTER KAF WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS BELOW;;;;
+06AF;ARABIC LETTER GAF;Lo;0;AL;;;;;N;;;;;
+06B0;ARABIC LETTER GAF WITH RING;Lo;0;AL;;;;;N;;;;;
+06B1;ARABIC LETTER NGOEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS ABOVE;;;;
+06B2;ARABIC LETTER GAF WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+06B3;ARABIC LETTER GUEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW;;;;
+06B4;ARABIC LETTER GAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06B5;ARABIC LETTER LAM WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+06B6;ARABIC LETTER LAM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06B7;ARABIC LETTER LAM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06B8;ARABIC LETTER LAM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+06B9;ARABIC LETTER NOON WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06BA;ARABIC LETTER NOON GHUNNA;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON;;;;
+06BB;ARABIC LETTER RNOON;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON WITH SMALL TAH;;;;
+06BC;ARABIC LETTER NOON WITH RING;Lo;0;AL;;;;;N;;;;;
+06BD;ARABIC LETTER NOON WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06BE;ARABIC LETTER HEH DOACHASHMEE;Lo;0;AL;;;;;N;ARABIC LETTER KNOTTED HA;;;;
+06BF;ARABIC LETTER TCHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06C0;ARABIC LETTER HEH WITH YEH ABOVE;Lo;0;AL;06D5 0654;;;;N;ARABIC LETTER HAMZAH ON HA;;;;
+06C1;ARABIC LETTER HEH GOAL;Lo;0;AL;;;;;N;ARABIC LETTER HA GOAL;;;;
+06C2;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE;Lo;0;AL;06C1 0654;;;;N;ARABIC LETTER HAMZAH ON HA GOAL;;;;
+06C3;ARABIC LETTER TEH MARBUTA GOAL;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH GOAL;;;;
+06C4;ARABIC LETTER WAW WITH RING;Lo;0;AL;;;;;N;;;;;
+06C5;ARABIC LETTER KIRGHIZ OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH BAR;;;;
+06C6;ARABIC LETTER OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH SMALL V;;;;
+06C7;ARABIC LETTER U;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH DAMMAH;;;;
+06C8;ARABIC LETTER YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH ALEF ABOVE;;;;
+06C9;ARABIC LETTER KIRGHIZ YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH INVERTED SMALL V;;;;
+06CA;ARABIC LETTER WAW WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06CB;ARABIC LETTER VE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH THREE DOTS ABOVE;;;;
+06CC;ARABIC LETTER FARSI YEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS YA;;;;
+06CD;ARABIC LETTER YEH WITH TAIL;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TAIL;;;;
+06CE;ARABIC LETTER YEH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH SMALL V;;;;
+06CF;ARABIC LETTER WAW WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06D0;ARABIC LETTER E;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW;;;;
+06D1;ARABIC LETTER YEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH THREE DOTS BELOW;;;;
+06D2;ARABIC LETTER YEH BARREE;Lo;0;AL;;;;;N;ARABIC LETTER YA BARREE;;;;
+06D3;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE;Lo;0;AL;06D2 0654;;;;N;ARABIC LETTER HAMZAH ON YA BARREE;;;;
+06D4;ARABIC FULL STOP;Po;0;AL;;;;;N;ARABIC PERIOD;;;;
+06D5;ARABIC LETTER AE;Lo;0;AL;;;;;N;;;;;
+06D6;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;;
+06D7;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;;
+06D8;ARABIC SMALL HIGH MEEM INITIAL FORM;Mn;230;NSM;;;;;N;;;;;
+06D9;ARABIC SMALL HIGH LAM ALEF;Mn;230;NSM;;;;;N;;;;;
+06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;;
+06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;;
+06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;;
+06DD;ARABIC END OF AYAH;Cf;0;AN;;;;;N;;;;;
+06DE;ARABIC START OF RUB EL HIZB;So;0;ON;;;;;N;;;;;
+06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;;
+06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;;
+06E1;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH;Mn;230;NSM;;;;;N;;;;;
+06E2;ARABIC SMALL HIGH MEEM ISOLATED FORM;Mn;230;NSM;;;;;N;;;;;
+06E3;ARABIC SMALL LOW SEEN;Mn;220;NSM;;;;;N;;;;;
+06E4;ARABIC SMALL HIGH MADDA;Mn;230;NSM;;;;;N;;;;;
+06E5;ARABIC SMALL WAW;Lm;0;AL;;;;;N;;;;;
+06E6;ARABIC SMALL YEH;Lm;0;AL;;;;;N;;;;;
+06E7;ARABIC SMALL HIGH YEH;Mn;230;NSM;;;;;N;;;;;
+06E8;ARABIC SMALL HIGH NOON;Mn;230;NSM;;;;;N;;;;;
+06E9;ARABIC PLACE OF SAJDAH;So;0;ON;;;;;N;;;;;
+06EA;ARABIC EMPTY CENTRE LOW STOP;Mn;220;NSM;;;;;N;;;;;
+06EB;ARABIC EMPTY CENTRE HIGH STOP;Mn;230;NSM;;;;;N;;;;;
+06EC;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE;Mn;230;NSM;;;;;N;;;;;
+06ED;ARABIC SMALL LOW MEEM;Mn;220;NSM;;;;;N;;;;;
+06EE;ARABIC LETTER DAL WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+06EF;ARABIC LETTER REH WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+06F0;EXTENDED ARABIC-INDIC DIGIT ZERO;Nd;0;EN;;0;0;0;N;EASTERN ARABIC-INDIC DIGIT ZERO;;;;
+06F1;EXTENDED ARABIC-INDIC DIGIT ONE;Nd;0;EN;;1;1;1;N;EASTERN ARABIC-INDIC DIGIT ONE;;;;
+06F2;EXTENDED ARABIC-INDIC DIGIT TWO;Nd;0;EN;;2;2;2;N;EASTERN ARABIC-INDIC DIGIT TWO;;;;
+06F3;EXTENDED ARABIC-INDIC DIGIT THREE;Nd;0;EN;;3;3;3;N;EASTERN ARABIC-INDIC DIGIT THREE;;;;
+06F4;EXTENDED ARABIC-INDIC DIGIT FOUR;Nd;0;EN;;4;4;4;N;EASTERN ARABIC-INDIC DIGIT FOUR;;;;
+06F5;EXTENDED ARABIC-INDIC DIGIT FIVE;Nd;0;EN;;5;5;5;N;EASTERN ARABIC-INDIC DIGIT FIVE;;;;
+06F6;EXTENDED ARABIC-INDIC DIGIT SIX;Nd;0;EN;;6;6;6;N;EASTERN ARABIC-INDIC DIGIT SIX;;;;
+06F7;EXTENDED ARABIC-INDIC DIGIT SEVEN;Nd;0;EN;;7;7;7;N;EASTERN ARABIC-INDIC DIGIT SEVEN;;;;
+06F8;EXTENDED ARABIC-INDIC DIGIT EIGHT;Nd;0;EN;;8;8;8;N;EASTERN ARABIC-INDIC DIGIT EIGHT;;;;
+06F9;EXTENDED ARABIC-INDIC DIGIT NINE;Nd;0;EN;;9;9;9;N;EASTERN ARABIC-INDIC DIGIT NINE;;;;
+06FA;ARABIC LETTER SHEEN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06FB;ARABIC LETTER DAD WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06FC;ARABIC LETTER GHAIN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06FD;ARABIC SIGN SINDHI AMPERSAND;So;0;AL;;;;;N;;;;;
+06FE;ARABIC SIGN SINDHI POSTPOSITION MEN;So;0;AL;;;;;N;;;;;
+06FF;ARABIC LETTER HEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+0700;SYRIAC END OF PARAGRAPH;Po;0;AL;;;;;N;;;;;
+0701;SYRIAC SUPRALINEAR FULL STOP;Po;0;AL;;;;;N;;;;;
+0702;SYRIAC SUBLINEAR FULL STOP;Po;0;AL;;;;;N;;;;;
+0703;SYRIAC SUPRALINEAR COLON;Po;0;AL;;;;;N;;;;;
+0704;SYRIAC SUBLINEAR COLON;Po;0;AL;;;;;N;;;;;
+0705;SYRIAC HORIZONTAL COLON;Po;0;AL;;;;;N;;;;;
+0706;SYRIAC COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;;
+0707;SYRIAC COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;;
+0708;SYRIAC SUPRALINEAR COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;;
+0709;SYRIAC SUBLINEAR COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;;
+070A;SYRIAC CONTRACTION;Po;0;AL;;;;;N;;;;;
+070B;SYRIAC HARKLEAN OBELUS;Po;0;AL;;;;;N;;;;;
+070C;SYRIAC HARKLEAN METOBELUS;Po;0;AL;;;;;N;;;;;
+070D;SYRIAC HARKLEAN ASTERISCUS;Po;0;AL;;;;;N;;;;;
+070F;SYRIAC ABBREVIATION MARK;Cf;0;AL;;;;;N;;;;;
+0710;SYRIAC LETTER ALAPH;Lo;0;AL;;;;;N;;;;;
+0711;SYRIAC LETTER SUPERSCRIPT ALAPH;Mn;36;NSM;;;;;N;;;;;
+0712;SYRIAC LETTER BETH;Lo;0;AL;;;;;N;;;;;
+0713;SYRIAC LETTER GAMAL;Lo;0;AL;;;;;N;;;;;
+0714;SYRIAC LETTER GAMAL GARSHUNI;Lo;0;AL;;;;;N;;;;;
+0715;SYRIAC LETTER DALATH;Lo;0;AL;;;;;N;;;;;
+0716;SYRIAC LETTER DOTLESS DALATH RISH;Lo;0;AL;;;;;N;;;;;
+0717;SYRIAC LETTER HE;Lo;0;AL;;;;;N;;;;;
+0718;SYRIAC LETTER WAW;Lo;0;AL;;;;;N;;;;;
+0719;SYRIAC LETTER ZAIN;Lo;0;AL;;;;;N;;;;;
+071A;SYRIAC LETTER HETH;Lo;0;AL;;;;;N;;;;;
+071B;SYRIAC LETTER TETH;Lo;0;AL;;;;;N;;;;;
+071C;SYRIAC LETTER TETH GARSHUNI;Lo;0;AL;;;;;N;;;;;
+071D;SYRIAC LETTER YUDH;Lo;0;AL;;;;;N;;;;;
+071E;SYRIAC LETTER YUDH HE;Lo;0;AL;;;;;N;;;;;
+071F;SYRIAC LETTER KAPH;Lo;0;AL;;;;;N;;;;;
+0720;SYRIAC LETTER LAMADH;Lo;0;AL;;;;;N;;;;;
+0721;SYRIAC LETTER MIM;Lo;0;AL;;;;;N;;;;;
+0722;SYRIAC LETTER NUN;Lo;0;AL;;;;;N;;;;;
+0723;SYRIAC LETTER SEMKATH;Lo;0;AL;;;;;N;;;;;
+0724;SYRIAC LETTER FINAL SEMKATH;Lo;0;AL;;;;;N;;;;;
+0725;SYRIAC LETTER E;Lo;0;AL;;;;;N;;;;;
+0726;SYRIAC LETTER PE;Lo;0;AL;;;;;N;;;;;
+0727;SYRIAC LETTER REVERSED PE;Lo;0;AL;;;;;N;;;;;
+0728;SYRIAC LETTER SADHE;Lo;0;AL;;;;;N;;;;;
+0729;SYRIAC LETTER QAPH;Lo;0;AL;;;;;N;;;;;
+072A;SYRIAC LETTER RISH;Lo;0;AL;;;;;N;;;;;
+072B;SYRIAC LETTER SHIN;Lo;0;AL;;;;;N;;;;;
+072C;SYRIAC LETTER TAW;Lo;0;AL;;;;;N;;;;;
+072D;SYRIAC LETTER PERSIAN BHETH;Lo;0;AL;;;;;N;;;;;
+072E;SYRIAC LETTER PERSIAN GHAMAL;Lo;0;AL;;;;;N;;;;;
+072F;SYRIAC LETTER PERSIAN DHALATH;Lo;0;AL;;;;;N;;;;;
+0730;SYRIAC PTHAHA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0731;SYRIAC PTHAHA BELOW;Mn;220;NSM;;;;;N;;;;;
+0732;SYRIAC PTHAHA DOTTED;Mn;230;NSM;;;;;N;;;;;
+0733;SYRIAC ZQAPHA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0734;SYRIAC ZQAPHA BELOW;Mn;220;NSM;;;;;N;;;;;
+0735;SYRIAC ZQAPHA DOTTED;Mn;230;NSM;;;;;N;;;;;
+0736;SYRIAC RBASA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0737;SYRIAC RBASA BELOW;Mn;220;NSM;;;;;N;;;;;
+0738;SYRIAC DOTTED ZLAMA HORIZONTAL;Mn;220;NSM;;;;;N;;;;;
+0739;SYRIAC DOTTED ZLAMA ANGULAR;Mn;220;NSM;;;;;N;;;;;
+073A;SYRIAC HBASA ABOVE;Mn;230;NSM;;;;;N;;;;;
+073B;SYRIAC HBASA BELOW;Mn;220;NSM;;;;;N;;;;;
+073C;SYRIAC HBASA-ESASA DOTTED;Mn;220;NSM;;;;;N;;;;;
+073D;SYRIAC ESASA ABOVE;Mn;230;NSM;;;;;N;;;;;
+073E;SYRIAC ESASA BELOW;Mn;220;NSM;;;;;N;;;;;
+073F;SYRIAC RWAHA;Mn;230;NSM;;;;;N;;;;;
+0740;SYRIAC FEMININE DOT;Mn;230;NSM;;;;;N;;;;;
+0741;SYRIAC QUSHSHAYA;Mn;230;NSM;;;;;N;;;;;
+0742;SYRIAC RUKKAKHA;Mn;220;NSM;;;;;N;;;;;
+0743;SYRIAC TWO VERTICAL DOTS ABOVE;Mn;230;NSM;;;;;N;;;;;
+0744;SYRIAC TWO VERTICAL DOTS BELOW;Mn;220;NSM;;;;;N;;;;;
+0745;SYRIAC THREE DOTS ABOVE;Mn;230;NSM;;;;;N;;;;;
+0746;SYRIAC THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;;
+0747;SYRIAC OBLIQUE LINE ABOVE;Mn;230;NSM;;;;;N;;;;;
+0748;SYRIAC OBLIQUE LINE BELOW;Mn;220;NSM;;;;;N;;;;;
+0749;SYRIAC MUSIC;Mn;230;NSM;;;;;N;;;;;
+074A;SYRIAC BARREKH;Mn;230;NSM;;;;;N;;;;;
+074D;SYRIAC LETTER SOGDIAN ZHAIN;Lo;0;AL;;;;;N;;;;;
+074E;SYRIAC LETTER SOGDIAN KHAPH;Lo;0;AL;;;;;N;;;;;
+074F;SYRIAC LETTER SOGDIAN FE;Lo;0;AL;;;;;N;;;;;
+0750;ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW;Lo;0;AL;;;;;N;;;;;
+0751;ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0752;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0753;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0754;ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+0755;ARABIC LETTER BEH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;;
+0756;ARABIC LETTER BEH WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+0757;ARABIC LETTER HAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0758;ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0759;ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;;
+075A;ARABIC LETTER DAL WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;;
+075B;ARABIC LETTER REH WITH STROKE;Lo;0;AL;;;;;N;;;;;
+075C;ARABIC LETTER SEEN WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+075D;ARABIC LETTER AIN WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+075E;ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE;Lo;0;AL;;;;;N;;;;;
+075F;ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;;
+0760;ARABIC LETTER FEH WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+0761;ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0762;ARABIC LETTER KEHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+0763;ARABIC LETTER KEHEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0764;ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0765;ARABIC LETTER MEEM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+0766;ARABIC LETTER MEEM WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+0767;ARABIC LETTER NOON WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+0768;ARABIC LETTER NOON WITH SMALL TAH;Lo;0;AL;;;;;N;;;;;
+0769;ARABIC LETTER NOON WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+076A;ARABIC LETTER LAM WITH BAR;Lo;0;AL;;;;;N;;;;;
+076B;ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;;
+076C;ARABIC LETTER REH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;;
+076D;ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;;
+076E;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW;Lo;0;AL;;;;;N;;;;;
+076F;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;;
+0770;ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;;
+0771;ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;;
+0772;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;;
+0773;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+0774;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+0775;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+0776;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+0777;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;;
+0778;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+0779;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+077A;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+077B;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+077C;ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;;
+077D;ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE;Lo;0;AL;;;;;N;;;;;
+077E;ARABIC LETTER SEEN WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+077F;ARABIC LETTER KAF WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;;
+0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;;
+0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;;
+0783;THAANA LETTER RAA;Lo;0;AL;;;;;N;;;;;
+0784;THAANA LETTER BAA;Lo;0;AL;;;;;N;;;;;
+0785;THAANA LETTER LHAVIYANI;Lo;0;AL;;;;;N;;;;;
+0786;THAANA LETTER KAAFU;Lo;0;AL;;;;;N;;;;;
+0787;THAANA LETTER ALIFU;Lo;0;AL;;;;;N;;;;;
+0788;THAANA LETTER VAAVU;Lo;0;AL;;;;;N;;;;;
+0789;THAANA LETTER MEEMU;Lo;0;AL;;;;;N;;;;;
+078A;THAANA LETTER FAAFU;Lo;0;AL;;;;;N;;;;;
+078B;THAANA LETTER DHAALU;Lo;0;AL;;;;;N;;;;;
+078C;THAANA LETTER THAA;Lo;0;AL;;;;;N;;;;;
+078D;THAANA LETTER LAAMU;Lo;0;AL;;;;;N;;;;;
+078E;THAANA LETTER GAAFU;Lo;0;AL;;;;;N;;;;;
+078F;THAANA LETTER GNAVIYANI;Lo;0;AL;;;;;N;;;;;
+0790;THAANA LETTER SEENU;Lo;0;AL;;;;;N;;;;;
+0791;THAANA LETTER DAVIYANI;Lo;0;AL;;;;;N;;;;;
+0792;THAANA LETTER ZAVIYANI;Lo;0;AL;;;;;N;;;;;
+0793;THAANA LETTER TAVIYANI;Lo;0;AL;;;;;N;;;;;
+0794;THAANA LETTER YAA;Lo;0;AL;;;;;N;;;;;
+0795;THAANA LETTER PAVIYANI;Lo;0;AL;;;;;N;;;;;
+0796;THAANA LETTER JAVIYANI;Lo;0;AL;;;;;N;;;;;
+0797;THAANA LETTER CHAVIYANI;Lo;0;AL;;;;;N;;;;;
+0798;THAANA LETTER TTAA;Lo;0;AL;;;;;N;;;;;
+0799;THAANA LETTER HHAA;Lo;0;AL;;;;;N;;;;;
+079A;THAANA LETTER KHAA;Lo;0;AL;;;;;N;;;;;
+079B;THAANA LETTER THAALU;Lo;0;AL;;;;;N;;;;;
+079C;THAANA LETTER ZAA;Lo;0;AL;;;;;N;;;;;
+079D;THAANA LETTER SHEENU;Lo;0;AL;;;;;N;;;;;
+079E;THAANA LETTER SAADHU;Lo;0;AL;;;;;N;;;;;
+079F;THAANA LETTER DAADHU;Lo;0;AL;;;;;N;;;;;
+07A0;THAANA LETTER TO;Lo;0;AL;;;;;N;;;;;
+07A1;THAANA LETTER ZO;Lo;0;AL;;;;;N;;;;;
+07A2;THAANA LETTER AINU;Lo;0;AL;;;;;N;;;;;
+07A3;THAANA LETTER GHAINU;Lo;0;AL;;;;;N;;;;;
+07A4;THAANA LETTER QAAFU;Lo;0;AL;;;;;N;;;;;
+07A5;THAANA LETTER WAAVU;Lo;0;AL;;;;;N;;;;;
+07A6;THAANA ABAFILI;Mn;0;NSM;;;;;N;;;;;
+07A7;THAANA AABAAFILI;Mn;0;NSM;;;;;N;;;;;
+07A8;THAANA IBIFILI;Mn;0;NSM;;;;;N;;;;;
+07A9;THAANA EEBEEFILI;Mn;0;NSM;;;;;N;;;;;
+07AA;THAANA UBUFILI;Mn;0;NSM;;;;;N;;;;;
+07AB;THAANA OOBOOFILI;Mn;0;NSM;;;;;N;;;;;
+07AC;THAANA EBEFILI;Mn;0;NSM;;;;;N;;;;;
+07AD;THAANA EYBEYFILI;Mn;0;NSM;;;;;N;;;;;
+07AE;THAANA OBOFILI;Mn;0;NSM;;;;;N;;;;;
+07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;;
+07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;;
+07B1;THAANA LETTER NAA;Lo;0;AL;;;;;N;;;;;
+07C0;NKO DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;;
+07C1;NKO DIGIT ONE;Nd;0;R;;1;1;1;N;;;;;
+07C2;NKO DIGIT TWO;Nd;0;R;;2;2;2;N;;;;;
+07C3;NKO DIGIT THREE;Nd;0;R;;3;3;3;N;;;;;
+07C4;NKO DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;;
+07C5;NKO DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;;
+07C6;NKO DIGIT SIX;Nd;0;R;;6;6;6;N;;;;;
+07C7;NKO DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;;
+07C8;NKO DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;;
+07C9;NKO DIGIT NINE;Nd;0;R;;9;9;9;N;;;;;
+07CA;NKO LETTER A;Lo;0;R;;;;;N;;;;;
+07CB;NKO LETTER EE;Lo;0;R;;;;;N;;;;;
+07CC;NKO LETTER I;Lo;0;R;;;;;N;;;;;
+07CD;NKO LETTER E;Lo;0;R;;;;;N;;;;;
+07CE;NKO LETTER U;Lo;0;R;;;;;N;;;;;
+07CF;NKO LETTER OO;Lo;0;R;;;;;N;;;;;
+07D0;NKO LETTER O;Lo;0;R;;;;;N;;;;;
+07D1;NKO LETTER DAGBASINNA;Lo;0;R;;;;;N;;;;;
+07D2;NKO LETTER N;Lo;0;R;;;;;N;;;;;
+07D3;NKO LETTER BA;Lo;0;R;;;;;N;;;;;
+07D4;NKO LETTER PA;Lo;0;R;;;;;N;;;;;
+07D5;NKO LETTER TA;Lo;0;R;;;;;N;;;;;
+07D6;NKO LETTER JA;Lo;0;R;;;;;N;;;;;
+07D7;NKO LETTER CHA;Lo;0;R;;;;;N;;;;;
+07D8;NKO LETTER DA;Lo;0;R;;;;;N;;;;;
+07D9;NKO LETTER RA;Lo;0;R;;;;;N;;;;;
+07DA;NKO LETTER RRA;Lo;0;R;;;;;N;;;;;
+07DB;NKO LETTER SA;Lo;0;R;;;;;N;;;;;
+07DC;NKO LETTER GBA;Lo;0;R;;;;;N;;;;;
+07DD;NKO LETTER FA;Lo;0;R;;;;;N;;;;;
+07DE;NKO LETTER KA;Lo;0;R;;;;;N;;;;;
+07DF;NKO LETTER LA;Lo;0;R;;;;;N;;;;;
+07E0;NKO LETTER NA WOLOSO;Lo;0;R;;;;;N;;;;;
+07E1;NKO LETTER MA;Lo;0;R;;;;;N;;;;;
+07E2;NKO LETTER NYA;Lo;0;R;;;;;N;;;;;
+07E3;NKO LETTER NA;Lo;0;R;;;;;N;;;;;
+07E4;NKO LETTER HA;Lo;0;R;;;;;N;;;;;
+07E5;NKO LETTER WA;Lo;0;R;;;;;N;;;;;
+07E6;NKO LETTER YA;Lo;0;R;;;;;N;;;;;
+07E7;NKO LETTER NYA WOLOSO;Lo;0;R;;;;;N;;;;;
+07E8;NKO LETTER JONA JA;Lo;0;R;;;;;N;;;;;
+07E9;NKO LETTER JONA CHA;Lo;0;R;;;;;N;;;;;
+07EA;NKO LETTER JONA RA;Lo;0;R;;;;;N;;;;;
+07EB;NKO COMBINING SHORT HIGH TONE;Mn;230;NSM;;;;;N;;;;;
+07EC;NKO COMBINING SHORT LOW TONE;Mn;230;NSM;;;;;N;;;;;
+07ED;NKO COMBINING SHORT RISING TONE;Mn;230;NSM;;;;;N;;;;;
+07EE;NKO COMBINING LONG DESCENDING TONE;Mn;230;NSM;;;;;N;;;;;
+07EF;NKO COMBINING LONG HIGH TONE;Mn;230;NSM;;;;;N;;;;;
+07F0;NKO COMBINING LONG LOW TONE;Mn;230;NSM;;;;;N;;;;;
+07F1;NKO COMBINING LONG RISING TONE;Mn;230;NSM;;;;;N;;;;;
+07F2;NKO COMBINING NASALIZATION MARK;Mn;220;NSM;;;;;N;;;;;
+07F3;NKO COMBINING DOUBLE DOT ABOVE;Mn;230;NSM;;;;;N;;;;;
+07F4;NKO HIGH TONE APOSTROPHE;Lm;0;R;;;;;N;;;;;
+07F5;NKO LOW TONE APOSTROPHE;Lm;0;R;;;;;N;;;;;
+07F6;NKO SYMBOL OO DENNEN;So;0;ON;;;;;N;;;;;
+07F7;NKO SYMBOL GBAKURUNEN;Po;0;ON;;;;;N;;;;;
+07F8;NKO COMMA;Po;0;ON;;;;;N;;;;;
+07F9;NKO EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+07FA;NKO LAJANYALAN;Lm;0;R;;;;;N;;;;;
+0800;SAMARITAN LETTER ALAF;Lo;0;R;;;;;N;;;;;
+0801;SAMARITAN LETTER BIT;Lo;0;R;;;;;N;;;;;
+0802;SAMARITAN LETTER GAMAN;Lo;0;R;;;;;N;;;;;
+0803;SAMARITAN LETTER DALAT;Lo;0;R;;;;;N;;;;;
+0804;SAMARITAN LETTER IY;Lo;0;R;;;;;N;;;;;
+0805;SAMARITAN LETTER BAA;Lo;0;R;;;;;N;;;;;
+0806;SAMARITAN LETTER ZEN;Lo;0;R;;;;;N;;;;;
+0807;SAMARITAN LETTER IT;Lo;0;R;;;;;N;;;;;
+0808;SAMARITAN LETTER TIT;Lo;0;R;;;;;N;;;;;
+0809;SAMARITAN LETTER YUT;Lo;0;R;;;;;N;;;;;
+080A;SAMARITAN LETTER KAAF;Lo;0;R;;;;;N;;;;;
+080B;SAMARITAN LETTER LABAT;Lo;0;R;;;;;N;;;;;
+080C;SAMARITAN LETTER MIM;Lo;0;R;;;;;N;;;;;
+080D;SAMARITAN LETTER NUN;Lo;0;R;;;;;N;;;;;
+080E;SAMARITAN LETTER SINGAAT;Lo;0;R;;;;;N;;;;;
+080F;SAMARITAN LETTER IN;Lo;0;R;;;;;N;;;;;
+0810;SAMARITAN LETTER FI;Lo;0;R;;;;;N;;;;;
+0811;SAMARITAN LETTER TSAADIY;Lo;0;R;;;;;N;;;;;
+0812;SAMARITAN LETTER QUF;Lo;0;R;;;;;N;;;;;
+0813;SAMARITAN LETTER RISH;Lo;0;R;;;;;N;;;;;
+0814;SAMARITAN LETTER SHAN;Lo;0;R;;;;;N;;;;;
+0815;SAMARITAN LETTER TAAF;Lo;0;R;;;;;N;;;;;
+0816;SAMARITAN MARK IN;Mn;230;NSM;;;;;N;;;;;
+0817;SAMARITAN MARK IN-ALAF;Mn;230;NSM;;;;;N;;;;;
+0818;SAMARITAN MARK OCCLUSION;Mn;230;NSM;;;;;N;;;;;
+0819;SAMARITAN MARK DAGESH;Mn;230;NSM;;;;;N;;;;;
+081A;SAMARITAN MODIFIER LETTER EPENTHETIC YUT;Lm;0;R;;;;;N;;;;;
+081B;SAMARITAN MARK EPENTHETIC YUT;Mn;230;NSM;;;;;N;;;;;
+081C;SAMARITAN VOWEL SIGN LONG E;Mn;230;NSM;;;;;N;;;;;
+081D;SAMARITAN VOWEL SIGN E;Mn;230;NSM;;;;;N;;;;;
+081E;SAMARITAN VOWEL SIGN OVERLONG AA;Mn;230;NSM;;;;;N;;;;;
+081F;SAMARITAN VOWEL SIGN LONG AA;Mn;230;NSM;;;;;N;;;;;
+0820;SAMARITAN VOWEL SIGN AA;Mn;230;NSM;;;;;N;;;;;
+0821;SAMARITAN VOWEL SIGN OVERLONG A;Mn;230;NSM;;;;;N;;;;;
+0822;SAMARITAN VOWEL SIGN LONG A;Mn;230;NSM;;;;;N;;;;;
+0823;SAMARITAN VOWEL SIGN A;Mn;230;NSM;;;;;N;;;;;
+0824;SAMARITAN MODIFIER LETTER SHORT A;Lm;0;R;;;;;N;;;;;
+0825;SAMARITAN VOWEL SIGN SHORT A;Mn;230;NSM;;;;;N;;;;;
+0826;SAMARITAN VOWEL SIGN LONG U;Mn;230;NSM;;;;;N;;;;;
+0827;SAMARITAN VOWEL SIGN U;Mn;230;NSM;;;;;N;;;;;
+0828;SAMARITAN MODIFIER LETTER I;Lm;0;R;;;;;N;;;;;
+0829;SAMARITAN VOWEL SIGN LONG I;Mn;230;NSM;;;;;N;;;;;
+082A;SAMARITAN VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;;
+082B;SAMARITAN VOWEL SIGN O;Mn;230;NSM;;;;;N;;;;;
+082C;SAMARITAN VOWEL SIGN SUKUN;Mn;230;NSM;;;;;N;;;;;
+082D;SAMARITAN MARK NEQUDAA;Mn;230;NSM;;;;;N;;;;;
+0830;SAMARITAN PUNCTUATION NEQUDAA;Po;0;R;;;;;N;;;;;
+0831;SAMARITAN PUNCTUATION AFSAAQ;Po;0;R;;;;;N;;;;;
+0832;SAMARITAN PUNCTUATION ANGED;Po;0;R;;;;;N;;;;;
+0833;SAMARITAN PUNCTUATION BAU;Po;0;R;;;;;N;;;;;
+0834;SAMARITAN PUNCTUATION ATMAAU;Po;0;R;;;;;N;;;;;
+0835;SAMARITAN PUNCTUATION SHIYYAALAA;Po;0;R;;;;;N;;;;;
+0836;SAMARITAN ABBREVIATION MARK;Po;0;R;;;;;N;;;;;
+0837;SAMARITAN PUNCTUATION MELODIC QITSA;Po;0;R;;;;;N;;;;;
+0838;SAMARITAN PUNCTUATION ZIQAA;Po;0;R;;;;;N;;;;;
+0839;SAMARITAN PUNCTUATION QITSA;Po;0;R;;;;;N;;;;;
+083A;SAMARITAN PUNCTUATION ZAEF;Po;0;R;;;;;N;;;;;
+083B;SAMARITAN PUNCTUATION TURU;Po;0;R;;;;;N;;;;;
+083C;SAMARITAN PUNCTUATION ARKAANU;Po;0;R;;;;;N;;;;;
+083D;SAMARITAN PUNCTUATION SOF MASHFAAT;Po;0;R;;;;;N;;;;;
+083E;SAMARITAN PUNCTUATION ANNAAU;Po;0;R;;;;;N;;;;;
+0840;MANDAIC LETTER HALQA;Lo;0;R;;;;;N;;;;;
+0841;MANDAIC LETTER AB;Lo;0;R;;;;;N;;;;;
+0842;MANDAIC LETTER AG;Lo;0;R;;;;;N;;;;;
+0843;MANDAIC LETTER AD;Lo;0;R;;;;;N;;;;;
+0844;MANDAIC LETTER AH;Lo;0;R;;;;;N;;;;;
+0845;MANDAIC LETTER USHENNA;Lo;0;R;;;;;N;;;;;
+0846;MANDAIC LETTER AZ;Lo;0;R;;;;;N;;;;;
+0847;MANDAIC LETTER IT;Lo;0;R;;;;;N;;;;;
+0848;MANDAIC LETTER ATT;Lo;0;R;;;;;N;;;;;
+0849;MANDAIC LETTER AKSA;Lo;0;R;;;;;N;;;;;
+084A;MANDAIC LETTER AK;Lo;0;R;;;;;N;;;;;
+084B;MANDAIC LETTER AL;Lo;0;R;;;;;N;;;;;
+084C;MANDAIC LETTER AM;Lo;0;R;;;;;N;;;;;
+084D;MANDAIC LETTER AN;Lo;0;R;;;;;N;;;;;
+084E;MANDAIC LETTER AS;Lo;0;R;;;;;N;;;;;
+084F;MANDAIC LETTER IN;Lo;0;R;;;;;N;;;;;
+0850;MANDAIC LETTER AP;Lo;0;R;;;;;N;;;;;
+0851;MANDAIC LETTER ASZ;Lo;0;R;;;;;N;;;;;
+0852;MANDAIC LETTER AQ;Lo;0;R;;;;;N;;;;;
+0853;MANDAIC LETTER AR;Lo;0;R;;;;;N;;;;;
+0854;MANDAIC LETTER ASH;Lo;0;R;;;;;N;;;;;
+0855;MANDAIC LETTER AT;Lo;0;R;;;;;N;;;;;
+0856;MANDAIC LETTER DUSHENNA;Lo;0;R;;;;;N;;;;;
+0857;MANDAIC LETTER KAD;Lo;0;R;;;;;N;;;;;
+0858;MANDAIC LETTER AIN;Lo;0;R;;;;;N;;;;;
+0859;MANDAIC AFFRICATION MARK;Mn;220;NSM;;;;;N;;;;;
+085A;MANDAIC VOCALIZATION MARK;Mn;220;NSM;;;;;N;;;;;
+085B;MANDAIC GEMINATION MARK;Mn;220;NSM;;;;;N;;;;;
+085E;MANDAIC PUNCTUATION;Po;0;R;;;;;N;;;;;
+08A0;ARABIC LETTER BEH WITH SMALL V BELOW;Lo;0;AL;;;;;N;;;;;
+08A1;ARABIC LETTER BEH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;;
+08A2;ARABIC LETTER JEEM WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+08A3;ARABIC LETTER TAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+08A4;ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+08A5;ARABIC LETTER QAF WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+08A6;ARABIC LETTER LAM WITH DOUBLE BAR;Lo;0;AL;;;;;N;;;;;
+08A7;ARABIC LETTER MEEM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+08A8;ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE;Lo;0;AL;;;;;N;;;;;
+08A9;ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+08AA;ARABIC LETTER REH WITH LOOP;Lo;0;AL;;;;;N;;;;;
+08AB;ARABIC LETTER WAW WITH DOT WITHIN;Lo;0;AL;;;;;N;;;;;
+08AC;ARABIC LETTER ROHINGYA YEH;Lo;0;AL;;;;;N;;;;;
+08AD;ARABIC LETTER LOW ALEF;Lo;0;AL;;;;;N;;;;;
+08AE;ARABIC LETTER DAL WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+08AF;ARABIC LETTER SAD WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+08B0;ARABIC LETTER GAF WITH INVERTED STROKE;Lo;0;AL;;;;;N;;;;;
+08B1;ARABIC LETTER STRAIGHT WAW;Lo;0;AL;;;;;N;;;;;
+08B2;ARABIC LETTER ZAIN WITH INVERTED V ABOVE;Lo;0;AL;;;;;N;;;;;
+08B3;ARABIC LETTER AIN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+08B4;ARABIC LETTER KAF WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+08B6;ARABIC LETTER BEH WITH SMALL MEEM ABOVE;Lo;0;AL;;;;;N;;;;;
+08B7;ARABIC LETTER PEH WITH SMALL MEEM ABOVE;Lo;0;AL;;;;;N;;;;;
+08B8;ARABIC LETTER TEH WITH SMALL TEH ABOVE;Lo;0;AL;;;;;N;;;;;
+08B9;ARABIC LETTER REH WITH SMALL NOON ABOVE;Lo;0;AL;;;;;N;;;;;
+08BA;ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE;Lo;0;AL;;;;;N;;;;;
+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;;;;;
+08D4;ARABIC SMALL HIGH WORD AR-RUB;Mn;230;NSM;;;;;N;;;;;
+08D5;ARABIC SMALL HIGH SAD;Mn;230;NSM;;;;;N;;;;;
+08D6;ARABIC SMALL HIGH AIN;Mn;230;NSM;;;;;N;;;;;
+08D7;ARABIC SMALL HIGH QAF;Mn;230;NSM;;;;;N;;;;;
+08D8;ARABIC SMALL HIGH NOON WITH KASRA;Mn;230;NSM;;;;;N;;;;;
+08D9;ARABIC SMALL LOW NOON WITH KASRA;Mn;230;NSM;;;;;N;;;;;
+08DA;ARABIC SMALL HIGH WORD ATH-THALATHA;Mn;230;NSM;;;;;N;;;;;
+08DB;ARABIC SMALL HIGH WORD AS-SAJDA;Mn;230;NSM;;;;;N;;;;;
+08DC;ARABIC SMALL HIGH WORD AN-NISF;Mn;230;NSM;;;;;N;;;;;
+08DD;ARABIC SMALL HIGH WORD SAKTA;Mn;230;NSM;;;;;N;;;;;
+08DE;ARABIC SMALL HIGH WORD QIF;Mn;230;NSM;;;;;N;;;;;
+08DF;ARABIC SMALL HIGH WORD WAQFA;Mn;230;NSM;;;;;N;;;;;
+08E0;ARABIC SMALL HIGH FOOTNOTE MARKER;Mn;230;NSM;;;;;N;;;;;
+08E1;ARABIC SMALL HIGH SIGN SAFHA;Mn;230;NSM;;;;;N;;;;;
+08E2;ARABIC DISPUTED END OF AYAH;Cf;0;AN;;;;;N;;;;;
+08E3;ARABIC TURNED DAMMA BELOW;Mn;220;NSM;;;;;N;;;;;
+08E4;ARABIC CURLY FATHA;Mn;230;NSM;;;;;N;;;;;
+08E5;ARABIC CURLY DAMMA;Mn;230;NSM;;;;;N;;;;;
+08E6;ARABIC CURLY KASRA;Mn;220;NSM;;;;;N;;;;;
+08E7;ARABIC CURLY FATHATAN;Mn;230;NSM;;;;;N;;;;;
+08E8;ARABIC CURLY DAMMATAN;Mn;230;NSM;;;;;N;;;;;
+08E9;ARABIC CURLY KASRATAN;Mn;220;NSM;;;;;N;;;;;
+08EA;ARABIC TONE ONE DOT ABOVE;Mn;230;NSM;;;;;N;;;;;
+08EB;ARABIC TONE TWO DOTS ABOVE;Mn;230;NSM;;;;;N;;;;;
+08EC;ARABIC TONE LOOP ABOVE;Mn;230;NSM;;;;;N;;;;;
+08ED;ARABIC TONE ONE DOT BELOW;Mn;220;NSM;;;;;N;;;;;
+08EE;ARABIC TONE TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;;
+08EF;ARABIC TONE LOOP BELOW;Mn;220;NSM;;;;;N;;;;;
+08F0;ARABIC OPEN FATHATAN;Mn;27;NSM;;;;;N;;;;;
+08F1;ARABIC OPEN DAMMATAN;Mn;28;NSM;;;;;N;;;;;
+08F2;ARABIC OPEN KASRATAN;Mn;29;NSM;;;;;N;;;;;
+08F3;ARABIC SMALL HIGH WAW;Mn;230;NSM;;;;;N;;;;;
+08F4;ARABIC FATHA WITH RING;Mn;230;NSM;;;;;N;;;;;
+08F5;ARABIC FATHA WITH DOT ABOVE;Mn;230;NSM;;;;;N;;;;;
+08F6;ARABIC KASRA WITH DOT BELOW;Mn;220;NSM;;;;;N;;;;;
+08F7;ARABIC LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;;
+08F8;ARABIC RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;;
+08F9;ARABIC LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+08FA;ARABIC RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+08FB;ARABIC DOUBLE RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;;
+08FC;ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT;Mn;230;NSM;;;;;N;;;;;
+08FD;ARABIC RIGHT ARROWHEAD ABOVE WITH DOT;Mn;230;NSM;;;;;N;;;;;
+08FE;ARABIC DAMMA WITH DOT;Mn;230;NSM;;;;;N;;;;;
+08FF;ARABIC MARK SIDEWAYS NOON GHUNNA;Mn;230;NSM;;;;;N;;;;;
+0900;DEVANAGARI SIGN INVERTED CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0904;DEVANAGARI LETTER SHORT A;Lo;0;L;;;;;N;;;;;
+0905;DEVANAGARI LETTER A;Lo;0;L;;;;;N;;;;;
+0906;DEVANAGARI LETTER AA;Lo;0;L;;;;;N;;;;;
+0907;DEVANAGARI LETTER I;Lo;0;L;;;;;N;;;;;
+0908;DEVANAGARI LETTER II;Lo;0;L;;;;;N;;;;;
+0909;DEVANAGARI LETTER U;Lo;0;L;;;;;N;;;;;
+090A;DEVANAGARI LETTER UU;Lo;0;L;;;;;N;;;;;
+090B;DEVANAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+090C;DEVANAGARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+090D;DEVANAGARI LETTER CANDRA E;Lo;0;L;;;;;N;;;;;
+090E;DEVANAGARI LETTER SHORT E;Lo;0;L;;;;;N;;;;;
+090F;DEVANAGARI LETTER E;Lo;0;L;;;;;N;;;;;
+0910;DEVANAGARI LETTER AI;Lo;0;L;;;;;N;;;;;
+0911;DEVANAGARI LETTER CANDRA O;Lo;0;L;;;;;N;;;;;
+0912;DEVANAGARI LETTER SHORT O;Lo;0;L;;;;;N;;;;;
+0913;DEVANAGARI LETTER O;Lo;0;L;;;;;N;;;;;
+0914;DEVANAGARI LETTER AU;Lo;0;L;;;;;N;;;;;
+0915;DEVANAGARI LETTER KA;Lo;0;L;;;;;N;;;;;
+0916;DEVANAGARI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0917;DEVANAGARI LETTER GA;Lo;0;L;;;;;N;;;;;
+0918;DEVANAGARI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0919;DEVANAGARI LETTER NGA;Lo;0;L;;;;;N;;;;;
+091A;DEVANAGARI LETTER CA;Lo;0;L;;;;;N;;;;;
+091B;DEVANAGARI LETTER CHA;Lo;0;L;;;;;N;;;;;
+091C;DEVANAGARI LETTER JA;Lo;0;L;;;;;N;;;;;
+091D;DEVANAGARI LETTER JHA;Lo;0;L;;;;;N;;;;;
+091E;DEVANAGARI LETTER NYA;Lo;0;L;;;;;N;;;;;
+091F;DEVANAGARI LETTER TTA;Lo;0;L;;;;;N;;;;;
+0920;DEVANAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0921;DEVANAGARI LETTER DDA;Lo;0;L;;;;;N;;;;;
+0922;DEVANAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0923;DEVANAGARI LETTER NNA;Lo;0;L;;;;;N;;;;;
+0924;DEVANAGARI LETTER TA;Lo;0;L;;;;;N;;;;;
+0925;DEVANAGARI LETTER THA;Lo;0;L;;;;;N;;;;;
+0926;DEVANAGARI LETTER DA;Lo;0;L;;;;;N;;;;;
+0927;DEVANAGARI LETTER DHA;Lo;0;L;;;;;N;;;;;
+0928;DEVANAGARI LETTER NA;Lo;0;L;;;;;N;;;;;
+0929;DEVANAGARI LETTER NNNA;Lo;0;L;0928 093C;;;;N;;;;;
+092A;DEVANAGARI LETTER PA;Lo;0;L;;;;;N;;;;;
+092B;DEVANAGARI LETTER PHA;Lo;0;L;;;;;N;;;;;
+092C;DEVANAGARI LETTER BA;Lo;0;L;;;;;N;;;;;
+092D;DEVANAGARI LETTER BHA;Lo;0;L;;;;;N;;;;;
+092E;DEVANAGARI LETTER MA;Lo;0;L;;;;;N;;;;;
+092F;DEVANAGARI LETTER YA;Lo;0;L;;;;;N;;;;;
+0930;DEVANAGARI LETTER RA;Lo;0;L;;;;;N;;;;;
+0931;DEVANAGARI LETTER RRA;Lo;0;L;0930 093C;;;;N;;;;;
+0932;DEVANAGARI LETTER LA;Lo;0;L;;;;;N;;;;;
+0933;DEVANAGARI LETTER LLA;Lo;0;L;;;;;N;;;;;
+0934;DEVANAGARI LETTER LLLA;Lo;0;L;0933 093C;;;;N;;;;;
+0935;DEVANAGARI LETTER VA;Lo;0;L;;;;;N;;;;;
+0936;DEVANAGARI LETTER SHA;Lo;0;L;;;;;N;;;;;
+0937;DEVANAGARI LETTER SSA;Lo;0;L;;;;;N;;;;;
+0938;DEVANAGARI LETTER SA;Lo;0;L;;;;;N;;;;;
+0939;DEVANAGARI LETTER HA;Lo;0;L;;;;;N;;;;;
+093A;DEVANAGARI VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;;
+093B;DEVANAGARI VOWEL SIGN OOE;Mc;0;L;;;;;N;;;;;
+093C;DEVANAGARI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+093D;DEVANAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+093E;DEVANAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+093F;DEVANAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0940;DEVANAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0941;DEVANAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0942;DEVANAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0943;DEVANAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0944;DEVANAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0945;DEVANAGARI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;;
+0946;DEVANAGARI VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;;
+0947;DEVANAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0948;DEVANAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+0949;DEVANAGARI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;;
+094A;DEVANAGARI VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;;
+094B;DEVANAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+094C;DEVANAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+094D;DEVANAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+094E;DEVANAGARI VOWEL SIGN PRISHTHAMATRA E;Mc;0;L;;;;;N;;;;;
+094F;DEVANAGARI VOWEL SIGN AW;Mc;0;L;;;;;N;;;;;
+0950;DEVANAGARI OM;Lo;0;L;;;;;N;;;;;
+0951;DEVANAGARI STRESS SIGN UDATTA;Mn;230;NSM;;;;;N;;;;;
+0952;DEVANAGARI STRESS SIGN ANUDATTA;Mn;220;NSM;;;;;N;;;;;
+0953;DEVANAGARI GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;;
+0954;DEVANAGARI ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;;
+0955;DEVANAGARI VOWEL SIGN CANDRA LONG E;Mn;0;NSM;;;;;N;;;;;
+0956;DEVANAGARI VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;;
+0957;DEVANAGARI VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;;
+0958;DEVANAGARI LETTER QA;Lo;0;L;0915 093C;;;;N;;;;;
+0959;DEVANAGARI LETTER KHHA;Lo;0;L;0916 093C;;;;N;;;;;
+095A;DEVANAGARI LETTER GHHA;Lo;0;L;0917 093C;;;;N;;;;;
+095B;DEVANAGARI LETTER ZA;Lo;0;L;091C 093C;;;;N;;;;;
+095C;DEVANAGARI LETTER DDDHA;Lo;0;L;0921 093C;;;;N;;;;;
+095D;DEVANAGARI LETTER RHA;Lo;0;L;0922 093C;;;;N;;;;;
+095E;DEVANAGARI LETTER FA;Lo;0;L;092B 093C;;;;N;;;;;
+095F;DEVANAGARI LETTER YYA;Lo;0;L;092F 093C;;;;N;;;;;
+0960;DEVANAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0961;DEVANAGARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0962;DEVANAGARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0963;DEVANAGARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0964;DEVANAGARI DANDA;Po;0;L;;;;;N;;;;;
+0965;DEVANAGARI DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+0966;DEVANAGARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0967;DEVANAGARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0968;DEVANAGARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0969;DEVANAGARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+096A;DEVANAGARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+096B;DEVANAGARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+096C;DEVANAGARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+096D;DEVANAGARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
+0971;DEVANAGARI SIGN HIGH SPACING DOT;Lm;0;L;;;;;N;;;;;
+0972;DEVANAGARI LETTER CANDRA A;Lo;0;L;;;;;N;;;;;
+0973;DEVANAGARI LETTER OE;Lo;0;L;;;;;N;;;;;
+0974;DEVANAGARI LETTER OOE;Lo;0;L;;;;;N;;;;;
+0975;DEVANAGARI LETTER AW;Lo;0;L;;;;;N;;;;;
+0976;DEVANAGARI LETTER UE;Lo;0;L;;;;;N;;;;;
+0977;DEVANAGARI LETTER UUE;Lo;0;L;;;;;N;;;;;
+0978;DEVANAGARI LETTER MARWARI DDA;Lo;0;L;;;;;N;;;;;
+0979;DEVANAGARI LETTER ZHA;Lo;0;L;;;;;N;;;;;
+097A;DEVANAGARI LETTER HEAVY YA;Lo;0;L;;;;;N;;;;;
+097B;DEVANAGARI LETTER GGA;Lo;0;L;;;;;N;;;;;
+097C;DEVANAGARI LETTER JJA;Lo;0;L;;;;;N;;;;;
+097D;DEVANAGARI LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
+097E;DEVANAGARI LETTER DDDA;Lo;0;L;;;;;N;;;;;
+097F;DEVANAGARI LETTER BBA;Lo;0;L;;;;;N;;;;;
+0980;BENGALI ANJI;Lo;0;L;;;;;N;;;;;
+0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0985;BENGALI LETTER A;Lo;0;L;;;;;N;;;;;
+0986;BENGALI LETTER AA;Lo;0;L;;;;;N;;;;;
+0987;BENGALI LETTER I;Lo;0;L;;;;;N;;;;;
+0988;BENGALI LETTER II;Lo;0;L;;;;;N;;;;;
+0989;BENGALI LETTER U;Lo;0;L;;;;;N;;;;;
+098A;BENGALI LETTER UU;Lo;0;L;;;;;N;;;;;
+098B;BENGALI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+098C;BENGALI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+098F;BENGALI LETTER E;Lo;0;L;;;;;N;;;;;
+0990;BENGALI LETTER AI;Lo;0;L;;;;;N;;;;;
+0993;BENGALI LETTER O;Lo;0;L;;;;;N;;;;;
+0994;BENGALI LETTER AU;Lo;0;L;;;;;N;;;;;
+0995;BENGALI LETTER KA;Lo;0;L;;;;;N;;;;;
+0996;BENGALI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0997;BENGALI LETTER GA;Lo;0;L;;;;;N;;;;;
+0998;BENGALI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0999;BENGALI LETTER NGA;Lo;0;L;;;;;N;;;;;
+099A;BENGALI LETTER CA;Lo;0;L;;;;;N;;;;;
+099B;BENGALI LETTER CHA;Lo;0;L;;;;;N;;;;;
+099C;BENGALI LETTER JA;Lo;0;L;;;;;N;;;;;
+099D;BENGALI LETTER JHA;Lo;0;L;;;;;N;;;;;
+099E;BENGALI LETTER NYA;Lo;0;L;;;;;N;;;;;
+099F;BENGALI LETTER TTA;Lo;0;L;;;;;N;;;;;
+09A0;BENGALI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+09A1;BENGALI LETTER DDA;Lo;0;L;;;;;N;;;;;
+09A2;BENGALI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+09A3;BENGALI LETTER NNA;Lo;0;L;;;;;N;;;;;
+09A4;BENGALI LETTER TA;Lo;0;L;;;;;N;;;;;
+09A5;BENGALI LETTER THA;Lo;0;L;;;;;N;;;;;
+09A6;BENGALI LETTER DA;Lo;0;L;;;;;N;;;;;
+09A7;BENGALI LETTER DHA;Lo;0;L;;;;;N;;;;;
+09A8;BENGALI LETTER NA;Lo;0;L;;;;;N;;;;;
+09AA;BENGALI LETTER PA;Lo;0;L;;;;;N;;;;;
+09AB;BENGALI LETTER PHA;Lo;0;L;;;;;N;;;;;
+09AC;BENGALI LETTER BA;Lo;0;L;;;;;N;;;;;
+09AD;BENGALI LETTER BHA;Lo;0;L;;;;;N;;;;;
+09AE;BENGALI LETTER MA;Lo;0;L;;;;;N;;;;;
+09AF;BENGALI LETTER YA;Lo;0;L;;;;;N;;;;;
+09B0;BENGALI LETTER RA;Lo;0;L;;;;;N;;;;;
+09B2;BENGALI LETTER LA;Lo;0;L;;;;;N;;;;;
+09B6;BENGALI LETTER SHA;Lo;0;L;;;;;N;;;;;
+09B7;BENGALI LETTER SSA;Lo;0;L;;;;;N;;;;;
+09B8;BENGALI LETTER SA;Lo;0;L;;;;;N;;;;;
+09B9;BENGALI LETTER HA;Lo;0;L;;;;;N;;;;;
+09BC;BENGALI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+09BD;BENGALI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+09BE;BENGALI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+09BF;BENGALI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+09C0;BENGALI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+09C1;BENGALI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+09C2;BENGALI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+09C3;BENGALI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+09C4;BENGALI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+09C7;BENGALI VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+09C8;BENGALI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;;
+09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;;
+09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+09CE;BENGALI LETTER KHANDA TA;Lo;0;L;;;;;N;;;;;
+09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;;
+09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;;
+09DF;BENGALI LETTER YYA;Lo;0;L;09AF 09BC;;;;N;;;;;
+09E0;BENGALI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+09E1;BENGALI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+09E2;BENGALI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+09E3;BENGALI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+09E6;BENGALI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+09E7;BENGALI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+09E8;BENGALI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+09E9;BENGALI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+09EA;BENGALI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+09EB;BENGALI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+09EC;BENGALI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+09ED;BENGALI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+09EE;BENGALI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+09EF;BENGALI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+09F0;BENGALI LETTER RA WITH MIDDLE DIAGONAL;Lo;0;L;;;;;N;;;;;
+09F1;BENGALI LETTER RA WITH LOWER DIAGONAL;Lo;0;L;;;;;N;BENGALI LETTER VA WITH LOWER DIAGONAL;;;;
+09F2;BENGALI RUPEE MARK;Sc;0;ET;;;;;N;;;;;
+09F3;BENGALI RUPEE SIGN;Sc;0;ET;;;;;N;;;;;
+09F4;BENGALI CURRENCY NUMERATOR ONE;No;0;L;;;;1/16;N;;;;;
+09F5;BENGALI CURRENCY NUMERATOR TWO;No;0;L;;;;1/8;N;;;;;
+09F6;BENGALI CURRENCY NUMERATOR THREE;No;0;L;;;;3/16;N;;;;;
+09F7;BENGALI CURRENCY NUMERATOR FOUR;No;0;L;;;;1/4;N;;;;;
+09F8;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR;No;0;L;;;;3/4;N;;;;;
+09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;;
+09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;;
+09FB;BENGALI GANDA MARK;Sc;0;ET;;;;;N;;;;;
+0A01;GURMUKHI SIGN ADAK BINDI;Mn;0;NSM;;;;;N;;;;;
+0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;;
+0A03;GURMUKHI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0A05;GURMUKHI LETTER A;Lo;0;L;;;;;N;;;;;
+0A06;GURMUKHI LETTER AA;Lo;0;L;;;;;N;;;;;
+0A07;GURMUKHI LETTER I;Lo;0;L;;;;;N;;;;;
+0A08;GURMUKHI LETTER II;Lo;0;L;;;;;N;;;;;
+0A09;GURMUKHI LETTER U;Lo;0;L;;;;;N;;;;;
+0A0A;GURMUKHI LETTER UU;Lo;0;L;;;;;N;;;;;
+0A0F;GURMUKHI LETTER EE;Lo;0;L;;;;;N;;;;;
+0A10;GURMUKHI LETTER AI;Lo;0;L;;;;;N;;;;;
+0A13;GURMUKHI LETTER OO;Lo;0;L;;;;;N;;;;;
+0A14;GURMUKHI LETTER AU;Lo;0;L;;;;;N;;;;;
+0A15;GURMUKHI LETTER KA;Lo;0;L;;;;;N;;;;;
+0A16;GURMUKHI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0A17;GURMUKHI LETTER GA;Lo;0;L;;;;;N;;;;;
+0A18;GURMUKHI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0A19;GURMUKHI LETTER NGA;Lo;0;L;;;;;N;;;;;
+0A1A;GURMUKHI LETTER CA;Lo;0;L;;;;;N;;;;;
+0A1B;GURMUKHI LETTER CHA;Lo;0;L;;;;;N;;;;;
+0A1C;GURMUKHI LETTER JA;Lo;0;L;;;;;N;;;;;
+0A1D;GURMUKHI LETTER JHA;Lo;0;L;;;;;N;;;;;
+0A1E;GURMUKHI LETTER NYA;Lo;0;L;;;;;N;;;;;
+0A1F;GURMUKHI LETTER TTA;Lo;0;L;;;;;N;;;;;
+0A20;GURMUKHI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0A21;GURMUKHI LETTER DDA;Lo;0;L;;;;;N;;;;;
+0A22;GURMUKHI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0A23;GURMUKHI LETTER NNA;Lo;0;L;;;;;N;;;;;
+0A24;GURMUKHI LETTER TA;Lo;0;L;;;;;N;;;;;
+0A25;GURMUKHI LETTER THA;Lo;0;L;;;;;N;;;;;
+0A26;GURMUKHI LETTER DA;Lo;0;L;;;;;N;;;;;
+0A27;GURMUKHI LETTER DHA;Lo;0;L;;;;;N;;;;;
+0A28;GURMUKHI LETTER NA;Lo;0;L;;;;;N;;;;;
+0A2A;GURMUKHI LETTER PA;Lo;0;L;;;;;N;;;;;
+0A2B;GURMUKHI LETTER PHA;Lo;0;L;;;;;N;;;;;
+0A2C;GURMUKHI LETTER BA;Lo;0;L;;;;;N;;;;;
+0A2D;GURMUKHI LETTER BHA;Lo;0;L;;;;;N;;;;;
+0A2E;GURMUKHI LETTER MA;Lo;0;L;;;;;N;;;;;
+0A2F;GURMUKHI LETTER YA;Lo;0;L;;;;;N;;;;;
+0A30;GURMUKHI LETTER RA;Lo;0;L;;;;;N;;;;;
+0A32;GURMUKHI LETTER LA;Lo;0;L;;;;;N;;;;;
+0A33;GURMUKHI LETTER LLA;Lo;0;L;0A32 0A3C;;;;N;;;;;
+0A35;GURMUKHI LETTER VA;Lo;0;L;;;;;N;;;;;
+0A36;GURMUKHI LETTER SHA;Lo;0;L;0A38 0A3C;;;;N;;;;;
+0A38;GURMUKHI LETTER SA;Lo;0;L;;;;;N;;;;;
+0A39;GURMUKHI LETTER HA;Lo;0;L;;;;;N;;;;;
+0A3C;GURMUKHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0A3E;GURMUKHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0A3F;GURMUKHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0A40;GURMUKHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0A41;GURMUKHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0A42;GURMUKHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0A47;GURMUKHI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;;
+0A48;GURMUKHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;;
+0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0A51;GURMUKHI SIGN UDAAT;Mn;0;NSM;;;;;N;;;;;
+0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;;
+0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;;
+0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;;
+0A5C;GURMUKHI LETTER RRA;Lo;0;L;;;;;N;;;;;
+0A5E;GURMUKHI LETTER FA;Lo;0;L;0A2B 0A3C;;;;N;;;;;
+0A66;GURMUKHI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0A67;GURMUKHI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0A68;GURMUKHI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0A69;GURMUKHI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0A6A;GURMUKHI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0A6B;GURMUKHI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0A6C;GURMUKHI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0A6D;GURMUKHI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0A6E;GURMUKHI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0A6F;GURMUKHI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0A70;GURMUKHI TIPPI;Mn;0;NSM;;;;;N;;;;;
+0A71;GURMUKHI ADDAK;Mn;0;NSM;;;;;N;;;;;
+0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;;
+0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;;
+0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;;
+0A75;GURMUKHI SIGN YAKASH;Mn;0;NSM;;;;;N;;;;;
+0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0A85;GUJARATI LETTER A;Lo;0;L;;;;;N;;;;;
+0A86;GUJARATI LETTER AA;Lo;0;L;;;;;N;;;;;
+0A87;GUJARATI LETTER I;Lo;0;L;;;;;N;;;;;
+0A88;GUJARATI LETTER II;Lo;0;L;;;;;N;;;;;
+0A89;GUJARATI LETTER U;Lo;0;L;;;;;N;;;;;
+0A8A;GUJARATI LETTER UU;Lo;0;L;;;;;N;;;;;
+0A8B;GUJARATI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0A8C;GUJARATI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0A8D;GUJARATI VOWEL CANDRA E;Lo;0;L;;;;;N;;;;;
+0A8F;GUJARATI LETTER E;Lo;0;L;;;;;N;;;;;
+0A90;GUJARATI LETTER AI;Lo;0;L;;;;;N;;;;;
+0A91;GUJARATI VOWEL CANDRA O;Lo;0;L;;;;;N;;;;;
+0A93;GUJARATI LETTER O;Lo;0;L;;;;;N;;;;;
+0A94;GUJARATI LETTER AU;Lo;0;L;;;;;N;;;;;
+0A95;GUJARATI LETTER KA;Lo;0;L;;;;;N;;;;;
+0A96;GUJARATI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0A97;GUJARATI LETTER GA;Lo;0;L;;;;;N;;;;;
+0A98;GUJARATI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0A99;GUJARATI LETTER NGA;Lo;0;L;;;;;N;;;;;
+0A9A;GUJARATI LETTER CA;Lo;0;L;;;;;N;;;;;
+0A9B;GUJARATI LETTER CHA;Lo;0;L;;;;;N;;;;;
+0A9C;GUJARATI LETTER JA;Lo;0;L;;;;;N;;;;;
+0A9D;GUJARATI LETTER JHA;Lo;0;L;;;;;N;;;;;
+0A9E;GUJARATI LETTER NYA;Lo;0;L;;;;;N;;;;;
+0A9F;GUJARATI LETTER TTA;Lo;0;L;;;;;N;;;;;
+0AA0;GUJARATI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0AA1;GUJARATI LETTER DDA;Lo;0;L;;;;;N;;;;;
+0AA2;GUJARATI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0AA3;GUJARATI LETTER NNA;Lo;0;L;;;;;N;;;;;
+0AA4;GUJARATI LETTER TA;Lo;0;L;;;;;N;;;;;
+0AA5;GUJARATI LETTER THA;Lo;0;L;;;;;N;;;;;
+0AA6;GUJARATI LETTER DA;Lo;0;L;;;;;N;;;;;
+0AA7;GUJARATI LETTER DHA;Lo;0;L;;;;;N;;;;;
+0AA8;GUJARATI LETTER NA;Lo;0;L;;;;;N;;;;;
+0AAA;GUJARATI LETTER PA;Lo;0;L;;;;;N;;;;;
+0AAB;GUJARATI LETTER PHA;Lo;0;L;;;;;N;;;;;
+0AAC;GUJARATI LETTER BA;Lo;0;L;;;;;N;;;;;
+0AAD;GUJARATI LETTER BHA;Lo;0;L;;;;;N;;;;;
+0AAE;GUJARATI LETTER MA;Lo;0;L;;;;;N;;;;;
+0AAF;GUJARATI LETTER YA;Lo;0;L;;;;;N;;;;;
+0AB0;GUJARATI LETTER RA;Lo;0;L;;;;;N;;;;;
+0AB2;GUJARATI LETTER LA;Lo;0;L;;;;;N;;;;;
+0AB3;GUJARATI LETTER LLA;Lo;0;L;;;;;N;;;;;
+0AB5;GUJARATI LETTER VA;Lo;0;L;;;;;N;;;;;
+0AB6;GUJARATI LETTER SHA;Lo;0;L;;;;;N;;;;;
+0AB7;GUJARATI LETTER SSA;Lo;0;L;;;;;N;;;;;
+0AB8;GUJARATI LETTER SA;Lo;0;L;;;;;N;;;;;
+0AB9;GUJARATI LETTER HA;Lo;0;L;;;;;N;;;;;
+0ABC;GUJARATI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0ABD;GUJARATI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0ABE;GUJARATI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0ABF;GUJARATI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0AC0;GUJARATI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0AC1;GUJARATI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0AC2;GUJARATI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0AC3;GUJARATI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0AC4;GUJARATI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0AC5;GUJARATI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;;
+0AC7;GUJARATI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0AC8;GUJARATI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+0AC9;GUJARATI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;;
+0ACB;GUJARATI VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+0ACC;GUJARATI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+0ACD;GUJARATI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0AD0;GUJARATI OM;Lo;0;L;;;;;N;;;;;
+0AE0;GUJARATI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0AE1;GUJARATI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0AE2;GUJARATI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0AE3;GUJARATI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0AE6;GUJARATI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0AE7;GUJARATI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0AE8;GUJARATI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0AE9;GUJARATI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0AEA;GUJARATI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0AEB;GUJARATI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0AEC;GUJARATI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0AED;GUJARATI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0AEE;GUJARATI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0AF0;GUJARATI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
+0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;N;;;;;
+0AF9;GUJARATI LETTER ZHA;Lo;0;L;;;;;N;;;;;
+0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0B05;ORIYA LETTER A;Lo;0;L;;;;;N;;;;;
+0B06;ORIYA LETTER AA;Lo;0;L;;;;;N;;;;;
+0B07;ORIYA LETTER I;Lo;0;L;;;;;N;;;;;
+0B08;ORIYA LETTER II;Lo;0;L;;;;;N;;;;;
+0B09;ORIYA LETTER U;Lo;0;L;;;;;N;;;;;
+0B0A;ORIYA LETTER UU;Lo;0;L;;;;;N;;;;;
+0B0B;ORIYA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0B0C;ORIYA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0B0F;ORIYA LETTER E;Lo;0;L;;;;;N;;;;;
+0B10;ORIYA LETTER AI;Lo;0;L;;;;;N;;;;;
+0B13;ORIYA LETTER O;Lo;0;L;;;;;N;;;;;
+0B14;ORIYA LETTER AU;Lo;0;L;;;;;N;;;;;
+0B15;ORIYA LETTER KA;Lo;0;L;;;;;N;;;;;
+0B16;ORIYA LETTER KHA;Lo;0;L;;;;;N;;;;;
+0B17;ORIYA LETTER GA;Lo;0;L;;;;;N;;;;;
+0B18;ORIYA LETTER GHA;Lo;0;L;;;;;N;;;;;
+0B19;ORIYA LETTER NGA;Lo;0;L;;;;;N;;;;;
+0B1A;ORIYA LETTER CA;Lo;0;L;;;;;N;;;;;
+0B1B;ORIYA LETTER CHA;Lo;0;L;;;;;N;;;;;
+0B1C;ORIYA LETTER JA;Lo;0;L;;;;;N;;;;;
+0B1D;ORIYA LETTER JHA;Lo;0;L;;;;;N;;;;;
+0B1E;ORIYA LETTER NYA;Lo;0;L;;;;;N;;;;;
+0B1F;ORIYA LETTER TTA;Lo;0;L;;;;;N;;;;;
+0B20;ORIYA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0B21;ORIYA LETTER DDA;Lo;0;L;;;;;N;;;;;
+0B22;ORIYA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0B23;ORIYA LETTER NNA;Lo;0;L;;;;;N;;;;;
+0B24;ORIYA LETTER TA;Lo;0;L;;;;;N;;;;;
+0B25;ORIYA LETTER THA;Lo;0;L;;;;;N;;;;;
+0B26;ORIYA LETTER DA;Lo;0;L;;;;;N;;;;;
+0B27;ORIYA LETTER DHA;Lo;0;L;;;;;N;;;;;
+0B28;ORIYA LETTER NA;Lo;0;L;;;;;N;;;;;
+0B2A;ORIYA LETTER PA;Lo;0;L;;;;;N;;;;;
+0B2B;ORIYA LETTER PHA;Lo;0;L;;;;;N;;;;;
+0B2C;ORIYA LETTER BA;Lo;0;L;;;;;N;;;;;
+0B2D;ORIYA LETTER BHA;Lo;0;L;;;;;N;;;;;
+0B2E;ORIYA LETTER MA;Lo;0;L;;;;;N;;;;;
+0B2F;ORIYA LETTER YA;Lo;0;L;;;;;N;;;;;
+0B30;ORIYA LETTER RA;Lo;0;L;;;;;N;;;;;
+0B32;ORIYA LETTER LA;Lo;0;L;;;;;N;;;;;
+0B33;ORIYA LETTER LLA;Lo;0;L;;;;;N;;;;;
+0B35;ORIYA LETTER VA;Lo;0;L;;;;;N;;;;;
+0B36;ORIYA LETTER SHA;Lo;0;L;;;;;N;;;;;
+0B37;ORIYA LETTER SSA;Lo;0;L;;;;;N;;;;;
+0B38;ORIYA LETTER SA;Lo;0;L;;;;;N;;;;;
+0B39;ORIYA LETTER HA;Lo;0;L;;;;;N;;;;;
+0B3C;ORIYA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0B3D;ORIYA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0B3E;ORIYA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0B3F;ORIYA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0B40;ORIYA VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0B44;ORIYA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;;
+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;;;;;
+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;;;;;
+0B5D;ORIYA LETTER RHA;Lo;0;L;0B22 0B3C;;;;N;;;;;
+0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;;
+0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0B62;ORIYA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0B63;ORIYA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0B69;ORIYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0B6A;ORIYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0B6B;ORIYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0B6C;ORIYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0B6D;ORIYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0B6E;ORIYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0B6F;ORIYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0B70;ORIYA ISSHAR;So;0;L;;;;;N;;;;;
+0B71;ORIYA LETTER WA;Lo;0;L;;;;;N;;;;;
+0B72;ORIYA FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;;
+0B73;ORIYA FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;;
+0B74;ORIYA FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;;
+0B75;ORIYA FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;;
+0B76;ORIYA FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;;
+0B77;ORIYA FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;;
+0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0B83;TAMIL SIGN VISARGA;Lo;0;L;;;;;N;;;;;
+0B85;TAMIL LETTER A;Lo;0;L;;;;;N;;;;;
+0B86;TAMIL LETTER AA;Lo;0;L;;;;;N;;;;;
+0B87;TAMIL LETTER I;Lo;0;L;;;;;N;;;;;
+0B88;TAMIL LETTER II;Lo;0;L;;;;;N;;;;;
+0B89;TAMIL LETTER U;Lo;0;L;;;;;N;;;;;
+0B8A;TAMIL LETTER UU;Lo;0;L;;;;;N;;;;;
+0B8E;TAMIL LETTER E;Lo;0;L;;;;;N;;;;;
+0B8F;TAMIL LETTER EE;Lo;0;L;;;;;N;;;;;
+0B90;TAMIL LETTER AI;Lo;0;L;;;;;N;;;;;
+0B92;TAMIL LETTER O;Lo;0;L;;;;;N;;;;;
+0B93;TAMIL LETTER OO;Lo;0;L;;;;;N;;;;;
+0B94;TAMIL LETTER AU;Lo;0;L;0B92 0BD7;;;;N;;;;;
+0B95;TAMIL LETTER KA;Lo;0;L;;;;;N;;;;;
+0B99;TAMIL LETTER NGA;Lo;0;L;;;;;N;;;;;
+0B9A;TAMIL LETTER CA;Lo;0;L;;;;;N;;;;;
+0B9C;TAMIL LETTER JA;Lo;0;L;;;;;N;;;;;
+0B9E;TAMIL LETTER NYA;Lo;0;L;;;;;N;;;;;
+0B9F;TAMIL LETTER TTA;Lo;0;L;;;;;N;;;;;
+0BA3;TAMIL LETTER NNA;Lo;0;L;;;;;N;;;;;
+0BA4;TAMIL LETTER TA;Lo;0;L;;;;;N;;;;;
+0BA8;TAMIL LETTER NA;Lo;0;L;;;;;N;;;;;
+0BA9;TAMIL LETTER NNNA;Lo;0;L;;;;;N;;;;;
+0BAA;TAMIL LETTER PA;Lo;0;L;;;;;N;;;;;
+0BAE;TAMIL LETTER MA;Lo;0;L;;;;;N;;;;;
+0BAF;TAMIL LETTER YA;Lo;0;L;;;;;N;;;;;
+0BB0;TAMIL LETTER RA;Lo;0;L;;;;;N;;;;;
+0BB1;TAMIL LETTER RRA;Lo;0;L;;;;;N;;;;;
+0BB2;TAMIL LETTER LA;Lo;0;L;;;;;N;;;;;
+0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;;
+0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;;
+0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;;
+0BB6;TAMIL LETTER SHA;Lo;0;L;;;;;N;;;;;
+0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;;
+0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;;
+0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;;
+0BBE;TAMIL VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0BBF;TAMIL VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0BC0;TAMIL VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+0BC1;TAMIL VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+0BC2;TAMIL VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+0BC6;TAMIL VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+0BC7;TAMIL VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+0BC8;TAMIL VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+0BCA;TAMIL VOWEL SIGN O;Mc;0;L;0BC6 0BBE;;;;N;;;;;
+0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;;
+0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;;
+0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0BD0;TAMIL OM;Lo;0;L;;;;;N;;;;;
+0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0BE6;TAMIL DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0BEA;TAMIL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0BEB;TAMIL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0BEC;TAMIL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0BED;TAMIL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0BEE;TAMIL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0BEF;TAMIL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0BF0;TAMIL NUMBER TEN;No;0;L;;;;10;N;;;;;
+0BF1;TAMIL NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;;
+0BF2;TAMIL NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;;
+0BF3;TAMIL DAY SIGN;So;0;ON;;;;;N;;;;;
+0BF4;TAMIL MONTH SIGN;So;0;ON;;;;;N;;;;;
+0BF5;TAMIL YEAR SIGN;So;0;ON;;;;;N;;;;;
+0BF6;TAMIL DEBIT SIGN;So;0;ON;;;;;N;;;;;
+0BF7;TAMIL CREDIT SIGN;So;0;ON;;;;;N;;;;;
+0BF8;TAMIL AS ABOVE SIGN;So;0;ON;;;;;N;;;;;
+0BF9;TAMIL RUPEE SIGN;Sc;0;ET;;;;;N;;;;;
+0BFA;TAMIL NUMBER SIGN;So;0;ON;;;;;N;;;;;
+0C00;TELUGU SIGN COMBINING CANDRABINDU ABOVE;Mn;0;NSM;;;;;N;;;;;
+0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;;
+0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;;
+0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;;
+0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;;
+0C08;TELUGU LETTER II;Lo;0;L;;;;;N;;;;;
+0C09;TELUGU LETTER U;Lo;0;L;;;;;N;;;;;
+0C0A;TELUGU LETTER UU;Lo;0;L;;;;;N;;;;;
+0C0B;TELUGU LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0C0C;TELUGU LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0C0E;TELUGU LETTER E;Lo;0;L;;;;;N;;;;;
+0C0F;TELUGU LETTER EE;Lo;0;L;;;;;N;;;;;
+0C10;TELUGU LETTER AI;Lo;0;L;;;;;N;;;;;
+0C12;TELUGU LETTER O;Lo;0;L;;;;;N;;;;;
+0C13;TELUGU LETTER OO;Lo;0;L;;;;;N;;;;;
+0C14;TELUGU LETTER AU;Lo;0;L;;;;;N;;;;;
+0C15;TELUGU LETTER KA;Lo;0;L;;;;;N;;;;;
+0C16;TELUGU LETTER KHA;Lo;0;L;;;;;N;;;;;
+0C17;TELUGU LETTER GA;Lo;0;L;;;;;N;;;;;
+0C18;TELUGU LETTER GHA;Lo;0;L;;;;;N;;;;;
+0C19;TELUGU LETTER NGA;Lo;0;L;;;;;N;;;;;
+0C1A;TELUGU LETTER CA;Lo;0;L;;;;;N;;;;;
+0C1B;TELUGU LETTER CHA;Lo;0;L;;;;;N;;;;;
+0C1C;TELUGU LETTER JA;Lo;0;L;;;;;N;;;;;
+0C1D;TELUGU LETTER JHA;Lo;0;L;;;;;N;;;;;
+0C1E;TELUGU LETTER NYA;Lo;0;L;;;;;N;;;;;
+0C1F;TELUGU LETTER TTA;Lo;0;L;;;;;N;;;;;
+0C20;TELUGU LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0C21;TELUGU LETTER DDA;Lo;0;L;;;;;N;;;;;
+0C22;TELUGU LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0C23;TELUGU LETTER NNA;Lo;0;L;;;;;N;;;;;
+0C24;TELUGU LETTER TA;Lo;0;L;;;;;N;;;;;
+0C25;TELUGU LETTER THA;Lo;0;L;;;;;N;;;;;
+0C26;TELUGU LETTER DA;Lo;0;L;;;;;N;;;;;
+0C27;TELUGU LETTER DHA;Lo;0;L;;;;;N;;;;;
+0C28;TELUGU LETTER NA;Lo;0;L;;;;;N;;;;;
+0C2A;TELUGU LETTER PA;Lo;0;L;;;;;N;;;;;
+0C2B;TELUGU LETTER PHA;Lo;0;L;;;;;N;;;;;
+0C2C;TELUGU LETTER BA;Lo;0;L;;;;;N;;;;;
+0C2D;TELUGU LETTER BHA;Lo;0;L;;;;;N;;;;;
+0C2E;TELUGU LETTER MA;Lo;0;L;;;;;N;;;;;
+0C2F;TELUGU LETTER YA;Lo;0;L;;;;;N;;;;;
+0C30;TELUGU LETTER RA;Lo;0;L;;;;;N;;;;;
+0C31;TELUGU LETTER RRA;Lo;0;L;;;;;N;;;;;
+0C32;TELUGU LETTER LA;Lo;0;L;;;;;N;;;;;
+0C33;TELUGU LETTER LLA;Lo;0;L;;;;;N;;;;;
+0C34;TELUGU LETTER LLLA;Lo;0;L;;;;;N;;;;;
+0C35;TELUGU LETTER VA;Lo;0;L;;;;;N;;;;;
+0C36;TELUGU LETTER SHA;Lo;0;L;;;;;N;;;;;
+0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;;
+0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;;
+0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;;
+0C3D;TELUGU SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;;
+0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+0C41;TELUGU VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+0C42;TELUGU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+0C43;TELUGU VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+0C44;TELUGU VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+0C46;TELUGU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0C47;TELUGU VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;;
+0C48;TELUGU VOWEL SIGN AI;Mn;0;NSM;0C46 0C56;;;;N;;;;;
+0C4A;TELUGU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+0C4B;TELUGU VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;;
+0C4C;TELUGU VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;;
+0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;;
+0C58;TELUGU LETTER TSA;Lo;0;L;;;;;N;;;;;
+0C59;TELUGU LETTER DZA;Lo;0;L;;;;;N;;;;;
+0C5A;TELUGU LETTER RRRA;Lo;0;L;;;;;N;;;;;
+0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0C62;TELUGU VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0C63;TELUGU VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0C69;TELUGU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0C6A;TELUGU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0C6B;TELUGU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0C6C;TELUGU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0C78;TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR;No;0;ON;;;;0;N;;;;;
+0C79;TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR;No;0;ON;;;;1;N;;;;;
+0C7A;TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR;No;0;ON;;;;2;N;;;;;
+0C7B;TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR;No;0;ON;;;;3;N;;;;;
+0C7C;TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR;No;0;ON;;;;1;N;;;;;
+0C7D;TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR;No;0;ON;;;;2;N;;;;;
+0C7E;TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR;No;0;ON;;;;3;N;;;;;
+0C7F;TELUGU SIGN TUUMU;So;0;L;;;;;N;;;;;
+0C80;KANNADA SIGN SPACING CANDRABINDU;Lo;0;L;;;;;N;;;;;
+0C81;KANNADA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;;
+0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;;
+0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;;
+0C88;KANNADA LETTER II;Lo;0;L;;;;;N;;;;;
+0C89;KANNADA LETTER U;Lo;0;L;;;;;N;;;;;
+0C8A;KANNADA LETTER UU;Lo;0;L;;;;;N;;;;;
+0C8B;KANNADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0C8C;KANNADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0C8E;KANNADA LETTER E;Lo;0;L;;;;;N;;;;;
+0C8F;KANNADA LETTER EE;Lo;0;L;;;;;N;;;;;
+0C90;KANNADA LETTER AI;Lo;0;L;;;;;N;;;;;
+0C92;KANNADA LETTER O;Lo;0;L;;;;;N;;;;;
+0C93;KANNADA LETTER OO;Lo;0;L;;;;;N;;;;;
+0C94;KANNADA LETTER AU;Lo;0;L;;;;;N;;;;;
+0C95;KANNADA LETTER KA;Lo;0;L;;;;;N;;;;;
+0C96;KANNADA LETTER KHA;Lo;0;L;;;;;N;;;;;
+0C97;KANNADA LETTER GA;Lo;0;L;;;;;N;;;;;
+0C98;KANNADA LETTER GHA;Lo;0;L;;;;;N;;;;;
+0C99;KANNADA LETTER NGA;Lo;0;L;;;;;N;;;;;
+0C9A;KANNADA LETTER CA;Lo;0;L;;;;;N;;;;;
+0C9B;KANNADA LETTER CHA;Lo;0;L;;;;;N;;;;;
+0C9C;KANNADA LETTER JA;Lo;0;L;;;;;N;;;;;
+0C9D;KANNADA LETTER JHA;Lo;0;L;;;;;N;;;;;
+0C9E;KANNADA LETTER NYA;Lo;0;L;;;;;N;;;;;
+0C9F;KANNADA LETTER TTA;Lo;0;L;;;;;N;;;;;
+0CA0;KANNADA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0CA1;KANNADA LETTER DDA;Lo;0;L;;;;;N;;;;;
+0CA2;KANNADA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0CA3;KANNADA LETTER NNA;Lo;0;L;;;;;N;;;;;
+0CA4;KANNADA LETTER TA;Lo;0;L;;;;;N;;;;;
+0CA5;KANNADA LETTER THA;Lo;0;L;;;;;N;;;;;
+0CA6;KANNADA LETTER DA;Lo;0;L;;;;;N;;;;;
+0CA7;KANNADA LETTER DHA;Lo;0;L;;;;;N;;;;;
+0CA8;KANNADA LETTER NA;Lo;0;L;;;;;N;;;;;
+0CAA;KANNADA LETTER PA;Lo;0;L;;;;;N;;;;;
+0CAB;KANNADA LETTER PHA;Lo;0;L;;;;;N;;;;;
+0CAC;KANNADA LETTER BA;Lo;0;L;;;;;N;;;;;
+0CAD;KANNADA LETTER BHA;Lo;0;L;;;;;N;;;;;
+0CAE;KANNADA LETTER MA;Lo;0;L;;;;;N;;;;;
+0CAF;KANNADA LETTER YA;Lo;0;L;;;;;N;;;;;
+0CB0;KANNADA LETTER RA;Lo;0;L;;;;;N;;;;;
+0CB1;KANNADA LETTER RRA;Lo;0;L;;;;;N;;;;;
+0CB2;KANNADA LETTER LA;Lo;0;L;;;;;N;;;;;
+0CB3;KANNADA LETTER LLA;Lo;0;L;;;;;N;;;;;
+0CB5;KANNADA LETTER VA;Lo;0;L;;;;;N;;;;;
+0CB6;KANNADA LETTER SHA;Lo;0;L;;;;;N;;;;;
+0CB7;KANNADA LETTER SSA;Lo;0;L;;;;;N;;;;;
+0CB8;KANNADA LETTER SA;Lo;0;L;;;;;N;;;;;
+0CB9;KANNADA LETTER HA;Lo;0;L;;;;;N;;;;;
+0CBC;KANNADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0CBD;KANNADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0CBF;KANNADA VOWEL SIGN I;Mn;0;L;;;;;N;;;;;
+0CC0;KANNADA VOWEL SIGN II;Mc;0;L;0CBF 0CD5;;;;N;;;;;
+0CC1;KANNADA VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+0CC2;KANNADA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+0CC3;KANNADA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+0CC4;KANNADA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+0CC6;KANNADA VOWEL SIGN E;Mn;0;L;;;;;N;;;;;
+0CC7;KANNADA VOWEL SIGN EE;Mc;0;L;0CC6 0CD5;;;;N;;;;;
+0CC8;KANNADA VOWEL SIGN AI;Mc;0;L;0CC6 0CD6;;;;N;;;;;
+0CCA;KANNADA VOWEL SIGN O;Mc;0;L;0CC6 0CC2;;;;N;;;;;
+0CCB;KANNADA VOWEL SIGN OO;Mc;0;L;0CCA 0CD5;;;;N;;;;;
+0CCC;KANNADA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+0CCD;KANNADA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0CD5;KANNADA LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0CD6;KANNADA AI LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;;
+0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0CE2;KANNADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0CE3;KANNADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0CE9;KANNADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0CEA;KANNADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0CEB;KANNADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0CEC;KANNADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0CF1;KANNADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;;
+0CF2;KANNADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;;
+0D01;MALAYALAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0D03;MALAYALAM SIGN VISARGA;Mc;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;;;;;
+0D08;MALAYALAM LETTER II;Lo;0;L;;;;;N;;;;;
+0D09;MALAYALAM LETTER U;Lo;0;L;;;;;N;;;;;
+0D0A;MALAYALAM LETTER UU;Lo;0;L;;;;;N;;;;;
+0D0B;MALAYALAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0D0C;MALAYALAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0D0E;MALAYALAM LETTER E;Lo;0;L;;;;;N;;;;;
+0D0F;MALAYALAM LETTER EE;Lo;0;L;;;;;N;;;;;
+0D10;MALAYALAM LETTER AI;Lo;0;L;;;;;N;;;;;
+0D12;MALAYALAM LETTER O;Lo;0;L;;;;;N;;;;;
+0D13;MALAYALAM LETTER OO;Lo;0;L;;;;;N;;;;;
+0D14;MALAYALAM LETTER AU;Lo;0;L;;;;;N;;;;;
+0D15;MALAYALAM LETTER KA;Lo;0;L;;;;;N;;;;;
+0D16;MALAYALAM LETTER KHA;Lo;0;L;;;;;N;;;;;
+0D17;MALAYALAM LETTER GA;Lo;0;L;;;;;N;;;;;
+0D18;MALAYALAM LETTER GHA;Lo;0;L;;;;;N;;;;;
+0D19;MALAYALAM LETTER NGA;Lo;0;L;;;;;N;;;;;
+0D1A;MALAYALAM LETTER CA;Lo;0;L;;;;;N;;;;;
+0D1B;MALAYALAM LETTER CHA;Lo;0;L;;;;;N;;;;;
+0D1C;MALAYALAM LETTER JA;Lo;0;L;;;;;N;;;;;
+0D1D;MALAYALAM LETTER JHA;Lo;0;L;;;;;N;;;;;
+0D1E;MALAYALAM LETTER NYA;Lo;0;L;;;;;N;;;;;
+0D1F;MALAYALAM LETTER TTA;Lo;0;L;;;;;N;;;;;
+0D20;MALAYALAM LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0D21;MALAYALAM LETTER DDA;Lo;0;L;;;;;N;;;;;
+0D22;MALAYALAM LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0D23;MALAYALAM LETTER NNA;Lo;0;L;;;;;N;;;;;
+0D24;MALAYALAM LETTER TA;Lo;0;L;;;;;N;;;;;
+0D25;MALAYALAM LETTER THA;Lo;0;L;;;;;N;;;;;
+0D26;MALAYALAM LETTER DA;Lo;0;L;;;;;N;;;;;
+0D27;MALAYALAM LETTER DHA;Lo;0;L;;;;;N;;;;;
+0D28;MALAYALAM LETTER NA;Lo;0;L;;;;;N;;;;;
+0D29;MALAYALAM LETTER NNNA;Lo;0;L;;;;;N;;;;;
+0D2A;MALAYALAM LETTER PA;Lo;0;L;;;;;N;;;;;
+0D2B;MALAYALAM LETTER PHA;Lo;0;L;;;;;N;;;;;
+0D2C;MALAYALAM LETTER BA;Lo;0;L;;;;;N;;;;;
+0D2D;MALAYALAM LETTER BHA;Lo;0;L;;;;;N;;;;;
+0D2E;MALAYALAM LETTER MA;Lo;0;L;;;;;N;;;;;
+0D2F;MALAYALAM LETTER YA;Lo;0;L;;;;;N;;;;;
+0D30;MALAYALAM LETTER RA;Lo;0;L;;;;;N;;;;;
+0D31;MALAYALAM LETTER RRA;Lo;0;L;;;;;N;;;;;
+0D32;MALAYALAM LETTER LA;Lo;0;L;;;;;N;;;;;
+0D33;MALAYALAM LETTER LLA;Lo;0;L;;;;;N;;;;;
+0D34;MALAYALAM LETTER LLLA;Lo;0;L;;;;;N;;;;;
+0D35;MALAYALAM LETTER VA;Lo;0;L;;;;;N;;;;;
+0D36;MALAYALAM LETTER SHA;Lo;0;L;;;;;N;;;;;
+0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;;
+0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;;
+0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;;
+0D3A;MALAYALAM LETTER TTTA;Lo;0;L;;;;;N;;;;;
+0D3D;MALAYALAM SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0D44;MALAYALAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+0D4A;MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;;
+0D4B;MALAYALAM VOWEL SIGN OO;Mc;0;L;0D47 0D3E;;;;N;;;;;
+0D4C;MALAYALAM VOWEL SIGN AU;Mc;0;L;0D46 0D57;;;;N;;;;;
+0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0D4E;MALAYALAM LETTER DOT REPH;Lo;0;L;;;;;N;;;;;
+0D4F;MALAYALAM SIGN PARA;So;0;L;;;;;N;;;;;
+0D54;MALAYALAM LETTER CHILLU M;Lo;0;L;;;;;N;;;;;
+0D55;MALAYALAM LETTER CHILLU Y;Lo;0;L;;;;;N;;;;;
+0D56;MALAYALAM LETTER CHILLU LLL;Lo;0;L;;;;;N;;;;;
+0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0D58;MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH;No;0;L;;;;1/160;N;;;;;
+0D59;MALAYALAM FRACTION ONE FORTIETH;No;0;L;;;;1/40;N;;;;;
+0D5A;MALAYALAM FRACTION THREE EIGHTIETHS;No;0;L;;;;3/80;N;;;;;
+0D5B;MALAYALAM FRACTION ONE TWENTIETH;No;0;L;;;;1/20;N;;;;;
+0D5C;MALAYALAM FRACTION ONE TENTH;No;0;L;;;;1/10;N;;;;;
+0D5D;MALAYALAM FRACTION THREE TWENTIETHS;No;0;L;;;;3/20;N;;;;;
+0D5E;MALAYALAM FRACTION ONE FIFTH;No;0;L;;;;1/5;N;;;;;
+0D5F;MALAYALAM LETTER ARCHAIC II;Lo;0;L;;;;;N;;;;;
+0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0D62;MALAYALAM VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0D63;MALAYALAM VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0D69;MALAYALAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0D6A;MALAYALAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0D6B;MALAYALAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0D6C;MALAYALAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0D70;MALAYALAM NUMBER TEN;No;0;L;;;;10;N;;;;;
+0D71;MALAYALAM NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;;
+0D72;MALAYALAM NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;;
+0D73;MALAYALAM FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;;
+0D74;MALAYALAM FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;;
+0D75;MALAYALAM FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;;
+0D76;MALAYALAM FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;;
+0D77;MALAYALAM FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;;
+0D78;MALAYALAM FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;;
+0D79;MALAYALAM DATE MARK;So;0;L;;;;;N;;;;;
+0D7A;MALAYALAM LETTER CHILLU NN;Lo;0;L;;;;;N;;;;;
+0D7B;MALAYALAM LETTER CHILLU N;Lo;0;L;;;;;N;;;;;
+0D7C;MALAYALAM LETTER CHILLU RR;Lo;0;L;;;;;N;;;;;
+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;;;;;
+0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;;
+0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;;
+0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;;
+0D86;SINHALA LETTER AAYANNA;Lo;0;L;;;;;N;;;;;
+0D87;SINHALA LETTER AEYANNA;Lo;0;L;;;;;N;;;;;
+0D88;SINHALA LETTER AEEYANNA;Lo;0;L;;;;;N;;;;;
+0D89;SINHALA LETTER IYANNA;Lo;0;L;;;;;N;;;;;
+0D8A;SINHALA LETTER IIYANNA;Lo;0;L;;;;;N;;;;;
+0D8B;SINHALA LETTER UYANNA;Lo;0;L;;;;;N;;;;;
+0D8C;SINHALA LETTER UUYANNA;Lo;0;L;;;;;N;;;;;
+0D8D;SINHALA LETTER IRUYANNA;Lo;0;L;;;;;N;;;;;
+0D8E;SINHALA LETTER IRUUYANNA;Lo;0;L;;;;;N;;;;;
+0D8F;SINHALA LETTER ILUYANNA;Lo;0;L;;;;;N;;;;;
+0D90;SINHALA LETTER ILUUYANNA;Lo;0;L;;;;;N;;;;;
+0D91;SINHALA LETTER EYANNA;Lo;0;L;;;;;N;;;;;
+0D92;SINHALA LETTER EEYANNA;Lo;0;L;;;;;N;;;;;
+0D93;SINHALA LETTER AIYANNA;Lo;0;L;;;;;N;;;;;
+0D94;SINHALA LETTER OYANNA;Lo;0;L;;;;;N;;;;;
+0D95;SINHALA LETTER OOYANNA;Lo;0;L;;;;;N;;;;;
+0D96;SINHALA LETTER AUYANNA;Lo;0;L;;;;;N;;;;;
+0D9A;SINHALA LETTER ALPAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;;
+0D9B;SINHALA LETTER MAHAAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;;
+0D9C;SINHALA LETTER ALPAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;;
+0D9D;SINHALA LETTER MAHAAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;;
+0D9E;SINHALA LETTER KANTAJA NAASIKYAYA;Lo;0;L;;;;;N;;;;;
+0D9F;SINHALA LETTER SANYAKA GAYANNA;Lo;0;L;;;;;N;;;;;
+0DA0;SINHALA LETTER ALPAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;;
+0DA1;SINHALA LETTER MAHAAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;;
+0DA2;SINHALA LETTER ALPAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA3;SINHALA LETTER MAHAAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA4;SINHALA LETTER TAALUJA NAASIKYAYA;Lo;0;L;;;;;N;;;;;
+0DA5;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA;Lo;0;L;;;;;N;;;;;
+0DA6;SINHALA LETTER SANYAKA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA7;SINHALA LETTER ALPAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;;
+0DA8;SINHALA LETTER MAHAAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;;
+0DA9;SINHALA LETTER ALPAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAA;SINHALA LETTER MAHAAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAB;SINHALA LETTER MUURDHAJA NAYANNA;Lo;0;L;;;;;N;;;;;
+0DAC;SINHALA LETTER SANYAKA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAD;SINHALA LETTER ALPAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;;
+0DAE;SINHALA LETTER MAHAAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;;
+0DAF;SINHALA LETTER ALPAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB0;SINHALA LETTER MAHAAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB1;SINHALA LETTER DANTAJA NAYANNA;Lo;0;L;;;;;N;;;;;
+0DB3;SINHALA LETTER SANYAKA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB4;SINHALA LETTER ALPAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;;
+0DB5;SINHALA LETTER MAHAAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;;
+0DB6;SINHALA LETTER ALPAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DB7;SINHALA LETTER MAHAAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DB8;SINHALA LETTER MAYANNA;Lo;0;L;;;;;N;;;;;
+0DB9;SINHALA LETTER AMBA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DBA;SINHALA LETTER YAYANNA;Lo;0;L;;;;;N;;;;;
+0DBB;SINHALA LETTER RAYANNA;Lo;0;L;;;;;N;;;;;
+0DBD;SINHALA LETTER DANTAJA LAYANNA;Lo;0;L;;;;;N;;;;;
+0DC0;SINHALA LETTER VAYANNA;Lo;0;L;;;;;N;;;;;
+0DC1;SINHALA LETTER TAALUJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC2;SINHALA LETTER MUURDHAJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC3;SINHALA LETTER DANTAJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC4;SINHALA LETTER HAYANNA;Lo;0;L;;;;;N;;;;;
+0DC5;SINHALA LETTER MUURDHAJA LAYANNA;Lo;0;L;;;;;N;;;;;
+0DC6;SINHALA LETTER FAYANNA;Lo;0;L;;;;;N;;;;;
+0DCA;SINHALA SIGN AL-LAKUNA;Mn;9;NSM;;;;;N;;;;;
+0DCF;SINHALA VOWEL SIGN AELA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD0;SINHALA VOWEL SIGN KETTI AEDA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD1;SINHALA VOWEL SIGN DIGA AEDA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD2;SINHALA VOWEL SIGN KETTI IS-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD3;SINHALA VOWEL SIGN DIGA IS-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD4;SINHALA VOWEL SIGN KETTI PAA-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD6;SINHALA VOWEL SIGN DIGA PAA-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD8;SINHALA VOWEL SIGN GAETTA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD9;SINHALA VOWEL SIGN KOMBUVA;Mc;0;L;;;;;N;;;;;
+0DDA;SINHALA VOWEL SIGN DIGA KOMBUVA;Mc;0;L;0DD9 0DCA;;;;N;;;;;
+0DDB;SINHALA VOWEL SIGN KOMBU DEKA;Mc;0;L;;;;;N;;;;;
+0DDC;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA;Mc;0;L;0DD9 0DCF;;;;N;;;;;
+0DDD;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA;Mc;0;L;0DDC 0DCA;;;;N;;;;;
+0DDE;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA;Mc;0;L;0DD9 0DDF;;;;N;;;;;
+0DDF;SINHALA VOWEL SIGN GAYANUKITTA;Mc;0;L;;;;;N;;;;;
+0DE6;SINHALA LITH DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0DE7;SINHALA LITH DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0DE8;SINHALA LITH DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0DE9;SINHALA LITH DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0DEA;SINHALA LITH DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0DEB;SINHALA LITH DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0DEC;SINHALA LITH DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0DED;SINHALA LITH DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0DEE;SINHALA LITH DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0DEF;SINHALA LITH DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0DF2;SINHALA VOWEL SIGN DIGA GAETTA-PILLA;Mc;0;L;;;;;N;;;;;
+0DF3;SINHALA VOWEL SIGN DIGA GAYANUKITTA;Mc;0;L;;;;;N;;;;;
+0DF4;SINHALA PUNCTUATION KUNDDALIYA;Po;0;L;;;;;N;;;;;
+0E01;THAI CHARACTER KO KAI;Lo;0;L;;;;;N;THAI LETTER KO KAI;;;;
+0E02;THAI CHARACTER KHO KHAI;Lo;0;L;;;;;N;THAI LETTER KHO KHAI;;;;
+0E03;THAI CHARACTER KHO KHUAT;Lo;0;L;;;;;N;THAI LETTER KHO KHUAT;;;;
+0E04;THAI CHARACTER KHO KHWAI;Lo;0;L;;;;;N;THAI LETTER KHO KHWAI;;;;
+0E05;THAI CHARACTER KHO KHON;Lo;0;L;;;;;N;THAI LETTER KHO KHON;;;;
+0E06;THAI CHARACTER KHO RAKHANG;Lo;0;L;;;;;N;THAI LETTER KHO RAKHANG;;;;
+0E07;THAI CHARACTER NGO NGU;Lo;0;L;;;;;N;THAI LETTER NGO NGU;;;;
+0E08;THAI CHARACTER CHO CHAN;Lo;0;L;;;;;N;THAI LETTER CHO CHAN;;;;
+0E09;THAI CHARACTER CHO CHING;Lo;0;L;;;;;N;THAI LETTER CHO CHING;;;;
+0E0A;THAI CHARACTER CHO CHANG;Lo;0;L;;;;;N;THAI LETTER CHO CHANG;;;;
+0E0B;THAI CHARACTER SO SO;Lo;0;L;;;;;N;THAI LETTER SO SO;;;;
+0E0C;THAI CHARACTER CHO CHOE;Lo;0;L;;;;;N;THAI LETTER CHO CHOE;;;;
+0E0D;THAI CHARACTER YO YING;Lo;0;L;;;;;N;THAI LETTER YO YING;;;;
+0E0E;THAI CHARACTER DO CHADA;Lo;0;L;;;;;N;THAI LETTER DO CHADA;;;;
+0E0F;THAI CHARACTER TO PATAK;Lo;0;L;;;;;N;THAI LETTER TO PATAK;;;;
+0E10;THAI CHARACTER THO THAN;Lo;0;L;;;;;N;THAI LETTER THO THAN;;;;
+0E11;THAI CHARACTER THO NANGMONTHO;Lo;0;L;;;;;N;THAI LETTER THO NANGMONTHO;;;;
+0E12;THAI CHARACTER THO PHUTHAO;Lo;0;L;;;;;N;THAI LETTER THO PHUTHAO;;;;
+0E13;THAI CHARACTER NO NEN;Lo;0;L;;;;;N;THAI LETTER NO NEN;;;;
+0E14;THAI CHARACTER DO DEK;Lo;0;L;;;;;N;THAI LETTER DO DEK;;;;
+0E15;THAI CHARACTER TO TAO;Lo;0;L;;;;;N;THAI LETTER TO TAO;;;;
+0E16;THAI CHARACTER THO THUNG;Lo;0;L;;;;;N;THAI LETTER THO THUNG;;;;
+0E17;THAI CHARACTER THO THAHAN;Lo;0;L;;;;;N;THAI LETTER THO THAHAN;;;;
+0E18;THAI CHARACTER THO THONG;Lo;0;L;;;;;N;THAI LETTER THO THONG;;;;
+0E19;THAI CHARACTER NO NU;Lo;0;L;;;;;N;THAI LETTER NO NU;;;;
+0E1A;THAI CHARACTER BO BAIMAI;Lo;0;L;;;;;N;THAI LETTER BO BAIMAI;;;;
+0E1B;THAI CHARACTER PO PLA;Lo;0;L;;;;;N;THAI LETTER PO PLA;;;;
+0E1C;THAI CHARACTER PHO PHUNG;Lo;0;L;;;;;N;THAI LETTER PHO PHUNG;;;;
+0E1D;THAI CHARACTER FO FA;Lo;0;L;;;;;N;THAI LETTER FO FA;;;;
+0E1E;THAI CHARACTER PHO PHAN;Lo;0;L;;;;;N;THAI LETTER PHO PHAN;;;;
+0E1F;THAI CHARACTER FO FAN;Lo;0;L;;;;;N;THAI LETTER FO FAN;;;;
+0E20;THAI CHARACTER PHO SAMPHAO;Lo;0;L;;;;;N;THAI LETTER PHO SAMPHAO;;;;
+0E21;THAI CHARACTER MO MA;Lo;0;L;;;;;N;THAI LETTER MO MA;;;;
+0E22;THAI CHARACTER YO YAK;Lo;0;L;;;;;N;THAI LETTER YO YAK;;;;
+0E23;THAI CHARACTER RO RUA;Lo;0;L;;;;;N;THAI LETTER RO RUA;;;;
+0E24;THAI CHARACTER RU;Lo;0;L;;;;;N;THAI LETTER RU;;;;
+0E25;THAI CHARACTER LO LING;Lo;0;L;;;;;N;THAI LETTER LO LING;;;;
+0E26;THAI CHARACTER LU;Lo;0;L;;;;;N;THAI LETTER LU;;;;
+0E27;THAI CHARACTER WO WAEN;Lo;0;L;;;;;N;THAI LETTER WO WAEN;;;;
+0E28;THAI CHARACTER SO SALA;Lo;0;L;;;;;N;THAI LETTER SO SALA;;;;
+0E29;THAI CHARACTER SO RUSI;Lo;0;L;;;;;N;THAI LETTER SO RUSI;;;;
+0E2A;THAI CHARACTER SO SUA;Lo;0;L;;;;;N;THAI LETTER SO SUA;;;;
+0E2B;THAI CHARACTER HO HIP;Lo;0;L;;;;;N;THAI LETTER HO HIP;;;;
+0E2C;THAI CHARACTER LO CHULA;Lo;0;L;;;;;N;THAI LETTER LO CHULA;;;;
+0E2D;THAI CHARACTER O ANG;Lo;0;L;;;;;N;THAI LETTER O ANG;;;;
+0E2E;THAI CHARACTER HO NOKHUK;Lo;0;L;;;;;N;THAI LETTER HO NOK HUK;;;;
+0E2F;THAI CHARACTER PAIYANNOI;Lo;0;L;;;;;N;THAI PAI YAN NOI;;;;
+0E30;THAI CHARACTER SARA A;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA A;;;;
+0E31;THAI CHARACTER MAI HAN-AKAT;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI HAN-AKAT;;;;
+0E32;THAI CHARACTER SARA AA;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AA;;;;
+0E33;THAI CHARACTER SARA AM;Lo;0;L;<compat> 0E4D 0E32;;;;N;THAI VOWEL SIGN SARA AM;;;;
+0E34;THAI CHARACTER SARA I;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA I;;;;
+0E35;THAI CHARACTER SARA II;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA II;;;;
+0E36;THAI CHARACTER SARA UE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UE;;;;
+0E37;THAI CHARACTER SARA UEE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UEE;;;;
+0E38;THAI CHARACTER SARA U;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA U;;;;
+0E39;THAI CHARACTER SARA UU;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA UU;;;;
+0E3A;THAI CHARACTER PHINTHU;Mn;9;NSM;;;;;N;THAI VOWEL SIGN PHINTHU;;;;
+0E3F;THAI CURRENCY SYMBOL BAHT;Sc;0;ET;;;;;N;THAI BAHT SIGN;;;;
+0E40;THAI CHARACTER SARA E;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA E;;;;
+0E41;THAI CHARACTER SARA AE;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AE;;;;
+0E42;THAI CHARACTER SARA O;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA O;;;;
+0E43;THAI CHARACTER SARA AI MAIMUAN;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MUAN;;;;
+0E44;THAI CHARACTER SARA AI MAIMALAI;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MALAI;;;;
+0E45;THAI CHARACTER LAKKHANGYAO;Lo;0;L;;;;;N;THAI LAK KHANG YAO;;;;
+0E46;THAI CHARACTER MAIYAMOK;Lm;0;L;;;;;N;THAI MAI YAMOK;;;;
+0E47;THAI CHARACTER MAITAIKHU;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI TAI KHU;;;;
+0E48;THAI CHARACTER MAI EK;Mn;107;NSM;;;;;N;THAI TONE MAI EK;;;;
+0E49;THAI CHARACTER MAI THO;Mn;107;NSM;;;;;N;THAI TONE MAI THO;;;;
+0E4A;THAI CHARACTER MAI TRI;Mn;107;NSM;;;;;N;THAI TONE MAI TRI;;;;
+0E4B;THAI CHARACTER MAI CHATTAWA;Mn;107;NSM;;;;;N;THAI TONE MAI CHATTAWA;;;;
+0E4C;THAI CHARACTER THANTHAKHAT;Mn;0;NSM;;;;;N;THAI THANTHAKHAT;;;;
+0E4D;THAI CHARACTER NIKHAHIT;Mn;0;NSM;;;;;N;THAI NIKKHAHIT;;;;
+0E4E;THAI CHARACTER YAMAKKAN;Mn;0;NSM;;;;;N;THAI YAMAKKAN;;;;
+0E4F;THAI CHARACTER FONGMAN;Po;0;L;;;;;N;THAI FONGMAN;;;;
+0E50;THAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0E51;THAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0E52;THAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0E53;THAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0E54;THAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0E55;THAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0E56;THAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0E57;THAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0E58;THAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0E59;THAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0E5A;THAI CHARACTER ANGKHANKHU;Po;0;L;;;;;N;THAI ANGKHANKHU;;;;
+0E5B;THAI CHARACTER KHOMUT;Po;0;L;;;;;N;THAI KHOMUT;;;;
+0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;;
+0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;;
+0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;;
+0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;;
+0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;;
+0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;;
+0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;;
+0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;;
+0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;;
+0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;;
+0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;;
+0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;;
+0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;;
+0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;;
+0E9C;LAO LETTER PHO SUNG;Lo;0;L;;;;;N;;;;;
+0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;;
+0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;;
+0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;;
+0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;;
+0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;;
+0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;;
+0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;;
+0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;;
+0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;;
+0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;;
+0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;;
+0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;;
+0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;;
+0EB0;LAO VOWEL SIGN A;Lo;0;L;;;;;N;;;;;
+0EB1;LAO VOWEL SIGN MAI KAN;Mn;0;NSM;;;;;N;;;;;
+0EB2;LAO VOWEL SIGN AA;Lo;0;L;;;;;N;;;;;
+0EB3;LAO VOWEL SIGN AM;Lo;0;L;<compat> 0ECD 0EB2;;;;N;;;;;
+0EB4;LAO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0EB5;LAO VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+0EB6;LAO VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;;
+0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;;
+0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;;
+0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;;
+0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;;
+0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;;
+0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;;
+0EC0;LAO VOWEL SIGN E;Lo;0;L;;;;;N;;;;;
+0EC1;LAO VOWEL SIGN EI;Lo;0;L;;;;;N;;;;;
+0EC2;LAO VOWEL SIGN O;Lo;0;L;;;;;N;;;;;
+0EC3;LAO VOWEL SIGN AY;Lo;0;L;;;;;N;;;;;
+0EC4;LAO VOWEL SIGN AI;Lo;0;L;;;;;N;;;;;
+0EC6;LAO KO LA;Lm;0;L;;;;;N;;;;;
+0EC8;LAO TONE MAI EK;Mn;122;NSM;;;;;N;;;;;
+0EC9;LAO TONE MAI THO;Mn;122;NSM;;;;;N;;;;;
+0ECA;LAO TONE MAI TI;Mn;122;NSM;;;;;N;;;;;
+0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;;
+0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;;
+0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;;
+0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0ED3;LAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0ED4;LAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0ED5;LAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0ED6;LAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0ED7;LAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0ED8;LAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0ED9;LAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0EDC;LAO HO NO;Lo;0;L;<compat> 0EAB 0E99;;;;N;;;;;
+0EDD;LAO HO MO;Lo;0;L;<compat> 0EAB 0EA1;;;;N;;;;;
+0EDE;LAO LETTER KHMU GO;Lo;0;L;;;;;N;;;;;
+0EDF;LAO LETTER KHMU NYO;Lo;0;L;;;;;N;;;;;
+0F00;TIBETAN SYLLABLE OM;Lo;0;L;;;;;N;;;;;
+0F01;TIBETAN MARK GTER YIG MGO TRUNCATED A;So;0;L;;;;;N;;;;;
+0F02;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA;So;0;L;;;;;N;;;;;
+0F03;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA;So;0;L;;;;;N;;;;;
+0F04;TIBETAN MARK INITIAL YIG MGO MDUN MA;Po;0;L;;;;;N;TIBETAN SINGLE ORNAMENT;;;;
+0F05;TIBETAN MARK CLOSING YIG MGO SGAB MA;Po;0;L;;;;;N;;;;;
+0F06;TIBETAN MARK CARET YIG MGO PHUR SHAD MA;Po;0;L;;;;;N;;;;;
+0F07;TIBETAN MARK YIG MGO TSHEG SHAD MA;Po;0;L;;;;;N;;;;;
+0F08;TIBETAN MARK SBRUL SHAD;Po;0;L;;;;;N;TIBETAN RGYANSHAD;;;;
+0F09;TIBETAN MARK BSKUR YIG MGO;Po;0;L;;;;;N;;;;;
+0F0A;TIBETAN MARK BKA- SHOG YIG MGO;Po;0;L;;;;;N;;;;;
+0F0B;TIBETAN MARK INTERSYLLABIC TSHEG;Po;0;L;;;;;N;TIBETAN TSEG;;;;
+0F0C;TIBETAN MARK DELIMITER TSHEG BSTAR;Po;0;L;<noBreak> 0F0B;;;;N;;;;;
+0F0D;TIBETAN MARK SHAD;Po;0;L;;;;;N;TIBETAN SHAD;;;;
+0F0E;TIBETAN MARK NYIS SHAD;Po;0;L;;;;;N;TIBETAN DOUBLE SHAD;;;;
+0F0F;TIBETAN MARK TSHEG SHAD;Po;0;L;;;;;N;;;;;
+0F10;TIBETAN MARK NYIS TSHEG SHAD;Po;0;L;;;;;N;;;;;
+0F11;TIBETAN MARK RIN CHEN SPUNGS SHAD;Po;0;L;;;;;N;TIBETAN RINCHANPHUNGSHAD;;;;
+0F12;TIBETAN MARK RGYA GRAM SHAD;Po;0;L;;;;;N;;;;;
+0F13;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN;So;0;L;;;;;N;;;;;
+0F14;TIBETAN MARK GTER TSHEG;Po;0;L;;;;;N;TIBETAN COMMA;;;;
+0F15;TIBETAN LOGOTYPE SIGN CHAD RTAGS;So;0;L;;;;;N;;;;;
+0F16;TIBETAN LOGOTYPE SIGN LHAG RTAGS;So;0;L;;;;;N;;;;;
+0F17;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS;So;0;L;;;;;N;;;;;
+0F18;TIBETAN ASTROLOGICAL SIGN -KHYUD PA;Mn;220;NSM;;;;;N;;;;;
+0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS;Mn;220;NSM;;;;;N;;;;;
+0F1A;TIBETAN SIGN RDEL DKAR GCIG;So;0;L;;;;;N;;;;;
+0F1B;TIBETAN SIGN RDEL DKAR GNYIS;So;0;L;;;;;N;;;;;
+0F1C;TIBETAN SIGN RDEL DKAR GSUM;So;0;L;;;;;N;;;;;
+0F1D;TIBETAN SIGN RDEL NAG GCIG;So;0;L;;;;;N;;;;;
+0F1E;TIBETAN SIGN RDEL NAG GNYIS;So;0;L;;;;;N;;;;;
+0F1F;TIBETAN SIGN RDEL DKAR RDEL NAG;So;0;L;;;;;N;;;;;
+0F20;TIBETAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0F21;TIBETAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0F22;TIBETAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0F23;TIBETAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0F24;TIBETAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0F25;TIBETAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0F26;TIBETAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;1/2;N;;;;;
+0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;3/2;N;;;;;
+0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;5/2;N;;;;;
+0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;7/2;N;;;;;
+0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;9/2;N;;;;;
+0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;11/2;N;;;;;
+0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;13/2;N;;;;;
+0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;15/2;N;;;;;
+0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;17/2;N;;;;;
+0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;N;;;;;
+0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;;;;
+0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;;;;
+0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;;;;
+0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;;;;
+0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;;;;
+0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;;;;
+0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;Y;;;;;
+0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;Y;;;;;
+0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;Y;TIBETAN LEFT BRACE;;;;
+0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;Y;TIBETAN RIGHT BRACE;;;;
+0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;;;;
+0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;;;;
+0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;;
+0F41;TIBETAN LETTER KHA;Lo;0;L;;;;;N;;;;;
+0F42;TIBETAN LETTER GA;Lo;0;L;;;;;N;;;;;
+0F43;TIBETAN LETTER GHA;Lo;0;L;0F42 0FB7;;;;N;;;;;
+0F44;TIBETAN LETTER NGA;Lo;0;L;;;;;N;;;;;
+0F45;TIBETAN LETTER CA;Lo;0;L;;;;;N;;;;;
+0F46;TIBETAN LETTER CHA;Lo;0;L;;;;;N;;;;;
+0F47;TIBETAN LETTER JA;Lo;0;L;;;;;N;;;;;
+0F49;TIBETAN LETTER NYA;Lo;0;L;;;;;N;;;;;
+0F4A;TIBETAN LETTER TTA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED TA;;;;
+0F4B;TIBETAN LETTER TTHA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED THA;;;;
+0F4C;TIBETAN LETTER DDA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED DA;;;;
+0F4D;TIBETAN LETTER DDHA;Lo;0;L;0F4C 0FB7;;;;N;;;;;
+0F4E;TIBETAN LETTER NNA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED NA;;;;
+0F4F;TIBETAN LETTER TA;Lo;0;L;;;;;N;;;;;
+0F50;TIBETAN LETTER THA;Lo;0;L;;;;;N;;;;;
+0F51;TIBETAN LETTER DA;Lo;0;L;;;;;N;;;;;
+0F52;TIBETAN LETTER DHA;Lo;0;L;0F51 0FB7;;;;N;;;;;
+0F53;TIBETAN LETTER NA;Lo;0;L;;;;;N;;;;;
+0F54;TIBETAN LETTER PA;Lo;0;L;;;;;N;;;;;
+0F55;TIBETAN LETTER PHA;Lo;0;L;;;;;N;;;;;
+0F56;TIBETAN LETTER BA;Lo;0;L;;;;;N;;;;;
+0F57;TIBETAN LETTER BHA;Lo;0;L;0F56 0FB7;;;;N;;;;;
+0F58;TIBETAN LETTER MA;Lo;0;L;;;;;N;;;;;
+0F59;TIBETAN LETTER TSA;Lo;0;L;;;;;N;;;;;
+0F5A;TIBETAN LETTER TSHA;Lo;0;L;;;;;N;;;;;
+0F5B;TIBETAN LETTER DZA;Lo;0;L;;;;;N;;;;;
+0F5C;TIBETAN LETTER DZHA;Lo;0;L;0F5B 0FB7;;;;N;;;;;
+0F5D;TIBETAN LETTER WA;Lo;0;L;;;;;N;;;;;
+0F5E;TIBETAN LETTER ZHA;Lo;0;L;;;;;N;;;;;
+0F5F;TIBETAN LETTER ZA;Lo;0;L;;;;;N;;;;;
+0F60;TIBETAN LETTER -A;Lo;0;L;;;;;N;TIBETAN LETTER AA;;;;
+0F61;TIBETAN LETTER YA;Lo;0;L;;;;;N;;;;;
+0F62;TIBETAN LETTER RA;Lo;0;L;;;;;N;;;;;
+0F63;TIBETAN LETTER LA;Lo;0;L;;;;;N;;;;;
+0F64;TIBETAN LETTER SHA;Lo;0;L;;;;;N;;;;;
+0F65;TIBETAN LETTER SSA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED SHA;;;;
+0F66;TIBETAN LETTER SA;Lo;0;L;;;;;N;;;;;
+0F67;TIBETAN LETTER HA;Lo;0;L;;;;;N;;;;;
+0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;;
+0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;;
+0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;;;;
+0F6B;TIBETAN LETTER KKA;Lo;0;L;;;;;N;;;;;
+0F6C;TIBETAN LETTER RRA;Lo;0;L;;;;;N;;;;;
+0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;;
+0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;;
+0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;;
+0F74;TIBETAN VOWEL SIGN U;Mn;132;NSM;;;;;N;;;;;
+0F75;TIBETAN VOWEL SIGN UU;Mn;0;NSM;0F71 0F74;;;;N;;;;;
+0F76;TIBETAN VOWEL SIGN VOCALIC R;Mn;0;NSM;0FB2 0F80;;;;N;;;;;
+0F77;TIBETAN VOWEL SIGN VOCALIC RR;Mn;0;NSM;<compat> 0FB2 0F81;;;;N;;;;;
+0F78;TIBETAN VOWEL SIGN VOCALIC L;Mn;0;NSM;0FB3 0F80;;;;N;;;;;
+0F79;TIBETAN VOWEL SIGN VOCALIC LL;Mn;0;NSM;<compat> 0FB3 0F81;;;;N;;;;;
+0F7A;TIBETAN VOWEL SIGN E;Mn;130;NSM;;;;;N;;;;;
+0F7B;TIBETAN VOWEL SIGN EE;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AI;;;;
+0F7C;TIBETAN VOWEL SIGN O;Mn;130;NSM;;;;;N;;;;;
+0F7D;TIBETAN VOWEL SIGN OO;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AU;;;;
+0F7E;TIBETAN SIGN RJES SU NGA RO;Mn;0;NSM;;;;;N;TIBETAN ANUSVARA;;;;
+0F7F;TIBETAN SIGN RNAM BCAD;Mc;0;L;;;;;N;TIBETAN VISARGA;;;;
+0F80;TIBETAN VOWEL SIGN REVERSED I;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN SHORT I;;;;
+0F81;TIBETAN VOWEL SIGN REVERSED II;Mn;0;NSM;0F71 0F80;;;;N;;;;;
+0F82;TIBETAN SIGN NYI ZLA NAA DA;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU WITH ORNAMENT;;;;
+0F83;TIBETAN SIGN SNA LDAN;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU;;;;
+0F84;TIBETAN MARK HALANTA;Mn;9;NSM;;;;;N;TIBETAN VIRAMA;;;;
+0F85;TIBETAN MARK PALUTA;Po;0;L;;;;;N;TIBETAN CHUCHENYIGE;;;;
+0F86;TIBETAN SIGN LCI RTAGS;Mn;230;NSM;;;;;N;;;;;
+0F87;TIBETAN SIGN YANG RTAGS;Mn;230;NSM;;;;;N;;;;;
+0F88;TIBETAN SIGN LCE TSA CAN;Lo;0;L;;;;;N;;;;;
+0F89;TIBETAN SIGN MCHU CAN;Lo;0;L;;;;;N;;;;;
+0F8A;TIBETAN SIGN GRU CAN RGYINGS;Lo;0;L;;;;;N;;;;;
+0F8B;TIBETAN SIGN GRU MED RGYINGS;Lo;0;L;;;;;N;;;;;
+0F8C;TIBETAN SIGN INVERTED MCHU CAN;Lo;0;L;;;;;N;;;;;
+0F8D;TIBETAN SUBJOINED SIGN LCE TSA CAN;Mn;0;NSM;;;;;N;;;;;
+0F8E;TIBETAN SUBJOINED SIGN MCHU CAN;Mn;0;NSM;;;;;N;;;;;
+0F8F;TIBETAN SUBJOINED SIGN INVERTED MCHU CAN;Mn;0;NSM;;;;;N;;;;;
+0F90;TIBETAN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;;
+0F91;TIBETAN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;;
+0F92;TIBETAN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;;
+0F93;TIBETAN SUBJOINED LETTER GHA;Mn;0;NSM;0F92 0FB7;;;;N;;;;;
+0F94;TIBETAN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;;
+0F95;TIBETAN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;;
+0F96;TIBETAN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;;
+0F97;TIBETAN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;;
+0F99;TIBETAN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;;
+0F9A;TIBETAN SUBJOINED LETTER TTA;Mn;0;NSM;;;;;N;;;;;
+0F9B;TIBETAN SUBJOINED LETTER TTHA;Mn;0;NSM;;;;;N;;;;;
+0F9C;TIBETAN SUBJOINED LETTER DDA;Mn;0;NSM;;;;;N;;;;;
+0F9D;TIBETAN SUBJOINED LETTER DDHA;Mn;0;NSM;0F9C 0FB7;;;;N;;;;;
+0F9E;TIBETAN SUBJOINED LETTER NNA;Mn;0;NSM;;;;;N;;;;;
+0F9F;TIBETAN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;;
+0FA0;TIBETAN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;;
+0FA1;TIBETAN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;;
+0FA2;TIBETAN SUBJOINED LETTER DHA;Mn;0;NSM;0FA1 0FB7;;;;N;;;;;
+0FA3;TIBETAN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;;
+0FA4;TIBETAN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;;
+0FA5;TIBETAN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;;
+0FA6;TIBETAN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;;
+0FA7;TIBETAN SUBJOINED LETTER BHA;Mn;0;NSM;0FA6 0FB7;;;;N;;;;;
+0FA8;TIBETAN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;;
+0FA9;TIBETAN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;;
+0FAA;TIBETAN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;;
+0FAB;TIBETAN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;;
+0FAC;TIBETAN SUBJOINED LETTER DZHA;Mn;0;NSM;0FAB 0FB7;;;;N;;;;;
+0FAD;TIBETAN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;;;;
+0FAE;TIBETAN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;;
+0FAF;TIBETAN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;;
+0FB0;TIBETAN SUBJOINED LETTER -A;Mn;0;NSM;;;;;N;;;;;
+0FB1;TIBETAN SUBJOINED LETTER YA;Mn;0;NSM;;;;;N;;;;;
+0FB2;TIBETAN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;;;;
+0FB3;TIBETAN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;;
+0FB4;TIBETAN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;;
+0FB5;TIBETAN SUBJOINED LETTER SSA;Mn;0;NSM;;;;;N;;;;;
+0FB6;TIBETAN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;;
+0FB7;TIBETAN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;;
+0FB8;TIBETAN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;;
+0FB9;TIBETAN SUBJOINED LETTER KSSA;Mn;0;NSM;0F90 0FB5;;;;N;;;;;
+0FBA;TIBETAN SUBJOINED LETTER FIXED-FORM WA;Mn;0;NSM;;;;;N;;;;;
+0FBB;TIBETAN SUBJOINED LETTER FIXED-FORM YA;Mn;0;NSM;;;;;N;;;;;
+0FBC;TIBETAN SUBJOINED LETTER FIXED-FORM RA;Mn;0;NSM;;;;;N;;;;;
+0FBE;TIBETAN KU RU KHA;So;0;L;;;;;N;;;;;
+0FBF;TIBETAN KU RU KHA BZHI MIG CAN;So;0;L;;;;;N;;;;;
+0FC0;TIBETAN CANTILLATION SIGN HEAVY BEAT;So;0;L;;;;;N;;;;;
+0FC1;TIBETAN CANTILLATION SIGN LIGHT BEAT;So;0;L;;;;;N;;;;;
+0FC2;TIBETAN CANTILLATION SIGN CANG TE-U;So;0;L;;;;;N;;;;;
+0FC3;TIBETAN CANTILLATION SIGN SBUB -CHAL;So;0;L;;;;;N;;;;;
+0FC4;TIBETAN SYMBOL DRIL BU;So;0;L;;;;;N;;;;;
+0FC5;TIBETAN SYMBOL RDO RJE;So;0;L;;;;;N;;;;;
+0FC6;TIBETAN SYMBOL PADMA GDAN;Mn;220;NSM;;;;;N;;;;;
+0FC7;TIBETAN SYMBOL RDO RJE RGYA GRAM;So;0;L;;;;;N;;;;;
+0FC8;TIBETAN SYMBOL PHUR PA;So;0;L;;;;;N;;;;;
+0FC9;TIBETAN SYMBOL NOR BU;So;0;L;;;;;N;;;;;
+0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;;;;
+0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;;;;
+0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;;;;
+0FCE;TIBETAN SIGN RDEL NAG RDEL DKAR;So;0;L;;;;;N;;;;;
+0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;;;;
+0FD0;TIBETAN MARK BSKA- SHOG GI MGO RGYAN;Po;0;L;;;;;N;;;;;
+0FD1;TIBETAN MARK MNYAM YIG GI MGO RGYAN;Po;0;L;;;;;N;;;;;
+0FD2;TIBETAN MARK NYIS TSHEG;Po;0;L;;;;;N;;;;;
+0FD3;TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA;Po;0;L;;;;;N;;;;;
+0FD4;TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA;Po;0;L;;;;;N;;;;;
+0FD5;RIGHT-FACING SVASTI SIGN;So;0;L;;;;;N;;;;;
+0FD6;LEFT-FACING SVASTI SIGN;So;0;L;;;;;N;;;;;
+0FD7;RIGHT-FACING SVASTI SIGN WITH DOTS;So;0;L;;;;;N;;;;;
+0FD8;LEFT-FACING SVASTI SIGN WITH DOTS;So;0;L;;;;;N;;;;;
+0FD9;TIBETAN MARK LEADING MCHAN RTAGS;Po;0;L;;;;;N;;;;;
+0FDA;TIBETAN MARK TRAILING MCHAN RTAGS;Po;0;L;;;;;N;;;;;
+1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;;
+1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;;
+1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;;
+1003;MYANMAR LETTER GHA;Lo;0;L;;;;;N;;;;;
+1004;MYANMAR LETTER NGA;Lo;0;L;;;;;N;;;;;
+1005;MYANMAR LETTER CA;Lo;0;L;;;;;N;;;;;
+1006;MYANMAR LETTER CHA;Lo;0;L;;;;;N;;;;;
+1007;MYANMAR LETTER JA;Lo;0;L;;;;;N;;;;;
+1008;MYANMAR LETTER JHA;Lo;0;L;;;;;N;;;;;
+1009;MYANMAR LETTER NYA;Lo;0;L;;;;;N;;;;;
+100A;MYANMAR LETTER NNYA;Lo;0;L;;;;;N;;;;;
+100B;MYANMAR LETTER TTA;Lo;0;L;;;;;N;;;;;
+100C;MYANMAR LETTER TTHA;Lo;0;L;;;;;N;;;;;
+100D;MYANMAR LETTER DDA;Lo;0;L;;;;;N;;;;;
+100E;MYANMAR LETTER DDHA;Lo;0;L;;;;;N;;;;;
+100F;MYANMAR LETTER NNA;Lo;0;L;;;;;N;;;;;
+1010;MYANMAR LETTER TA;Lo;0;L;;;;;N;;;;;
+1011;MYANMAR LETTER THA;Lo;0;L;;;;;N;;;;;
+1012;MYANMAR LETTER DA;Lo;0;L;;;;;N;;;;;
+1013;MYANMAR LETTER DHA;Lo;0;L;;;;;N;;;;;
+1014;MYANMAR LETTER NA;Lo;0;L;;;;;N;;;;;
+1015;MYANMAR LETTER PA;Lo;0;L;;;;;N;;;;;
+1016;MYANMAR LETTER PHA;Lo;0;L;;;;;N;;;;;
+1017;MYANMAR LETTER BA;Lo;0;L;;;;;N;;;;;
+1018;MYANMAR LETTER BHA;Lo;0;L;;;;;N;;;;;
+1019;MYANMAR LETTER MA;Lo;0;L;;;;;N;;;;;
+101A;MYANMAR LETTER YA;Lo;0;L;;;;;N;;;;;
+101B;MYANMAR LETTER RA;Lo;0;L;;;;;N;;;;;
+101C;MYANMAR LETTER LA;Lo;0;L;;;;;N;;;;;
+101D;MYANMAR LETTER WA;Lo;0;L;;;;;N;;;;;
+101E;MYANMAR LETTER SA;Lo;0;L;;;;;N;;;;;
+101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;;
+1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;;
+1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;;
+1022;MYANMAR LETTER SHAN A;Lo;0;L;;;;;N;;;;;
+1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;;
+1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;;
+1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;;
+1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;;
+1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;;
+1028;MYANMAR LETTER MON E;Lo;0;L;;;;;N;;;;;
+1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;;
+102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;;
+102B;MYANMAR VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;;
+102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+102F;MYANMAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+1033;MYANMAR VOWEL SIGN MON II;Mn;0;NSM;;;;;N;;;;;
+1034;MYANMAR VOWEL SIGN MON O;Mn;0;NSM;;;;;N;;;;;
+1035;MYANMAR VOWEL SIGN E ABOVE;Mn;0;NSM;;;;;N;;;;;
+1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;;
+1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+103A;MYANMAR SIGN ASAT;Mn;9;NSM;;;;;N;;;;;
+103B;MYANMAR CONSONANT SIGN MEDIAL YA;Mc;0;L;;;;;N;;;;;
+103C;MYANMAR CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;;
+103D;MYANMAR CONSONANT SIGN MEDIAL WA;Mn;0;NSM;;;;;N;;;;;
+103E;MYANMAR CONSONANT SIGN MEDIAL HA;Mn;0;NSM;;;;;N;;;;;
+103F;MYANMAR LETTER GREAT SA;Lo;0;L;;;;;N;;;;;
+1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1043;MYANMAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1044;MYANMAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1045;MYANMAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1046;MYANMAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1047;MYANMAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1048;MYANMAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1049;MYANMAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+104A;MYANMAR SIGN LITTLE SECTION;Po;0;L;;;;;N;;;;;
+104B;MYANMAR SIGN SECTION;Po;0;L;;;;;N;;;;;
+104C;MYANMAR SYMBOL LOCATIVE;Po;0;L;;;;;N;;;;;
+104D;MYANMAR SYMBOL COMPLETED;Po;0;L;;;;;N;;;;;
+104E;MYANMAR SYMBOL AFOREMENTIONED;Po;0;L;;;;;N;;;;;
+104F;MYANMAR SYMBOL GENITIVE;Po;0;L;;;;;N;;;;;
+1050;MYANMAR LETTER SHA;Lo;0;L;;;;;N;;;;;
+1051;MYANMAR LETTER SSA;Lo;0;L;;;;;N;;;;;
+1052;MYANMAR LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+1053;MYANMAR LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+1054;MYANMAR LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+1055;MYANMAR LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+1056;MYANMAR VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+105A;MYANMAR LETTER MON NGA;Lo;0;L;;;;;N;;;;;
+105B;MYANMAR LETTER MON JHA;Lo;0;L;;;;;N;;;;;
+105C;MYANMAR LETTER MON BBA;Lo;0;L;;;;;N;;;;;
+105D;MYANMAR LETTER MON BBE;Lo;0;L;;;;;N;;;;;
+105E;MYANMAR CONSONANT SIGN MON MEDIAL NA;Mn;0;NSM;;;;;N;;;;;
+105F;MYANMAR CONSONANT SIGN MON MEDIAL MA;Mn;0;NSM;;;;;N;;;;;
+1060;MYANMAR CONSONANT SIGN MON MEDIAL LA;Mn;0;NSM;;;;;N;;;;;
+1061;MYANMAR LETTER SGAW KAREN SHA;Lo;0;L;;;;;N;;;;;
+1062;MYANMAR VOWEL SIGN SGAW KAREN EU;Mc;0;L;;;;;N;;;;;
+1063;MYANMAR TONE MARK SGAW KAREN HATHI;Mc;0;L;;;;;N;;;;;
+1064;MYANMAR TONE MARK SGAW KAREN KE PHO;Mc;0;L;;;;;N;;;;;
+1065;MYANMAR LETTER WESTERN PWO KAREN THA;Lo;0;L;;;;;N;;;;;
+1066;MYANMAR LETTER WESTERN PWO KAREN PWA;Lo;0;L;;;;;N;;;;;
+1067;MYANMAR VOWEL SIGN WESTERN PWO KAREN EU;Mc;0;L;;;;;N;;;;;
+1068;MYANMAR VOWEL SIGN WESTERN PWO KAREN UE;Mc;0;L;;;;;N;;;;;
+1069;MYANMAR SIGN WESTERN PWO KAREN TONE-1;Mc;0;L;;;;;N;;;;;
+106A;MYANMAR SIGN WESTERN PWO KAREN TONE-2;Mc;0;L;;;;;N;;;;;
+106B;MYANMAR SIGN WESTERN PWO KAREN TONE-3;Mc;0;L;;;;;N;;;;;
+106C;MYANMAR SIGN WESTERN PWO KAREN TONE-4;Mc;0;L;;;;;N;;;;;
+106D;MYANMAR SIGN WESTERN PWO KAREN TONE-5;Mc;0;L;;;;;N;;;;;
+106E;MYANMAR LETTER EASTERN PWO KAREN NNA;Lo;0;L;;;;;N;;;;;
+106F;MYANMAR LETTER EASTERN PWO KAREN YWA;Lo;0;L;;;;;N;;;;;
+1070;MYANMAR LETTER EASTERN PWO KAREN GHWA;Lo;0;L;;;;;N;;;;;
+1071;MYANMAR VOWEL SIGN GEBA KAREN I;Mn;0;NSM;;;;;N;;;;;
+1072;MYANMAR VOWEL SIGN KAYAH OE;Mn;0;NSM;;;;;N;;;;;
+1073;MYANMAR VOWEL SIGN KAYAH U;Mn;0;NSM;;;;;N;;;;;
+1074;MYANMAR VOWEL SIGN KAYAH EE;Mn;0;NSM;;;;;N;;;;;
+1075;MYANMAR LETTER SHAN KA;Lo;0;L;;;;;N;;;;;
+1076;MYANMAR LETTER SHAN KHA;Lo;0;L;;;;;N;;;;;
+1077;MYANMAR LETTER SHAN GA;Lo;0;L;;;;;N;;;;;
+1078;MYANMAR LETTER SHAN CA;Lo;0;L;;;;;N;;;;;
+1079;MYANMAR LETTER SHAN ZA;Lo;0;L;;;;;N;;;;;
+107A;MYANMAR LETTER SHAN NYA;Lo;0;L;;;;;N;;;;;
+107B;MYANMAR LETTER SHAN DA;Lo;0;L;;;;;N;;;;;
+107C;MYANMAR LETTER SHAN NA;Lo;0;L;;;;;N;;;;;
+107D;MYANMAR LETTER SHAN PHA;Lo;0;L;;;;;N;;;;;
+107E;MYANMAR LETTER SHAN FA;Lo;0;L;;;;;N;;;;;
+107F;MYANMAR LETTER SHAN BA;Lo;0;L;;;;;N;;;;;
+1080;MYANMAR LETTER SHAN THA;Lo;0;L;;;;;N;;;;;
+1081;MYANMAR LETTER SHAN HA;Lo;0;L;;;;;N;;;;;
+1082;MYANMAR CONSONANT SIGN SHAN MEDIAL WA;Mn;0;NSM;;;;;N;;;;;
+1083;MYANMAR VOWEL SIGN SHAN AA;Mc;0;L;;;;;N;;;;;
+1084;MYANMAR VOWEL SIGN SHAN E;Mc;0;L;;;;;N;;;;;
+1085;MYANMAR VOWEL SIGN SHAN E ABOVE;Mn;0;NSM;;;;;N;;;;;
+1086;MYANMAR VOWEL SIGN SHAN FINAL Y;Mn;0;NSM;;;;;N;;;;;
+1087;MYANMAR SIGN SHAN TONE-2;Mc;0;L;;;;;N;;;;;
+1088;MYANMAR SIGN SHAN TONE-3;Mc;0;L;;;;;N;;;;;
+1089;MYANMAR SIGN SHAN TONE-5;Mc;0;L;;;;;N;;;;;
+108A;MYANMAR SIGN SHAN TONE-6;Mc;0;L;;;;;N;;;;;
+108B;MYANMAR SIGN SHAN COUNCIL TONE-2;Mc;0;L;;;;;N;;;;;
+108C;MYANMAR SIGN SHAN COUNCIL TONE-3;Mc;0;L;;;;;N;;;;;
+108D;MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE;Mn;220;NSM;;;;;N;;;;;
+108E;MYANMAR LETTER RUMAI PALAUNG FA;Lo;0;L;;;;;N;;;;;
+108F;MYANMAR SIGN RUMAI PALAUNG TONE-5;Mc;0;L;;;;;N;;;;;
+1090;MYANMAR SHAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1091;MYANMAR SHAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1092;MYANMAR SHAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1093;MYANMAR SHAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1094;MYANMAR SHAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1095;MYANMAR SHAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1096;MYANMAR SHAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1097;MYANMAR SHAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1098;MYANMAR SHAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1099;MYANMAR SHAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+109A;MYANMAR SIGN KHAMTI TONE-1;Mc;0;L;;;;;N;;;;;
+109B;MYANMAR SIGN KHAMTI TONE-3;Mc;0;L;;;;;N;;;;;
+109C;MYANMAR VOWEL SIGN AITON A;Mc;0;L;;;;;N;;;;;
+109D;MYANMAR VOWEL SIGN AITON AI;Mn;0;NSM;;;;;N;;;;;
+109E;MYANMAR SYMBOL SHAN ONE;So;0;L;;;;;N;;;;;
+109F;MYANMAR SYMBOL SHAN EXCLAMATION;So;0;L;;;;;N;;;;;
+10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;;;2D00;
+10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;;;2D01;
+10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;;;2D02;
+10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;;;2D03;
+10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;2D04;
+10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;;;2D05;
+10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;;;2D06;
+10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;;;2D07;
+10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;;;2D08;
+10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;;;2D09;
+10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;;;2D0A;
+10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;;;2D0B;
+10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;;;2D0C;
+10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;;;2D0D;
+10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;;;2D0E;
+10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;;;2D0F;
+10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;;;2D10;
+10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;2D11;
+10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;;;2D12;
+10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;;;2D13;
+10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;;;2D14;
+10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;;;2D15;
+10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;;;2D16;
+10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;;;2D17;
+10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;;;2D18;
+10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;;;2D19;
+10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;;;2D1A;
+10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;;;2D1B;
+10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;;;2D1C;
+10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;;;2D1D;
+10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;;;2D1E;
+10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;;;2D1F;
+10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;;;2D20;
+10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;;;2D21;
+10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;;;2D22;
+10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;2D23;
+10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;2D24;
+10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;;;2D25;
+10C7;GEORGIAN CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;2D27;
+10CD;GEORGIAN CAPITAL LETTER AEN;Lu;0;L;;;;;N;;;;2D2D;
+10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;;
+10D1;GEORGIAN LETTER BAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;;;
+10D2;GEORGIAN LETTER GAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;;;
+10D3;GEORGIAN LETTER DON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;;;
+10D4;GEORGIAN LETTER EN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;;;
+10D5;GEORGIAN LETTER VIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;;;
+10D6;GEORGIAN LETTER ZEN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;;;
+10D7;GEORGIAN LETTER TAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;;;
+10D8;GEORGIAN LETTER IN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;;;
+10D9;GEORGIAN LETTER KAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;;;
+10DA;GEORGIAN LETTER LAS;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;;;
+10DB;GEORGIAN LETTER MAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;;;
+10DC;GEORGIAN LETTER NAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;;;
+10DD;GEORGIAN LETTER ON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;;;
+10DE;GEORGIAN LETTER PAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;;;
+10DF;GEORGIAN LETTER ZHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;;;
+10E0;GEORGIAN LETTER RAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;;;
+10E1;GEORGIAN LETTER SAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;;;
+10E2;GEORGIAN LETTER TAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;;;
+10E3;GEORGIAN LETTER UN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;;;
+10E4;GEORGIAN LETTER PHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;;;
+10E5;GEORGIAN LETTER KHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;;;
+10E6;GEORGIAN LETTER GHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;;;
+10E7;GEORGIAN LETTER QAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;;;
+10E8;GEORGIAN LETTER SHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;;;
+10E9;GEORGIAN LETTER CHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;;;
+10EA;GEORGIAN LETTER CAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;;;
+10EB;GEORGIAN LETTER JIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;;;
+10EC;GEORGIAN LETTER CIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;;;
+10ED;GEORGIAN LETTER CHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;;;
+10EE;GEORGIAN LETTER XAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;;;
+10EF;GEORGIAN LETTER JHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;;;
+10F0;GEORGIAN LETTER HAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;;;
+10F1;GEORGIAN LETTER HE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;;;
+10F2;GEORGIAN LETTER HIE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;;;
+10F3;GEORGIAN LETTER WE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;;;
+10F4;GEORGIAN LETTER HAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;;;
+10F5;GEORGIAN LETTER HOE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;;;
+10F6;GEORGIAN LETTER FI;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;;;
+10F7;GEORGIAN LETTER YN;Lo;0;L;;;;;N;;;;;
+10F8;GEORGIAN LETTER ELIFI;Lo;0;L;;;;;N;;;;;
+10F9;GEORGIAN LETTER TURNED GAN;Lo;0;L;;;;;N;;;;;
+10FA;GEORGIAN LETTER AIN;Lo;0;L;;;;;N;;;;;
+10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;;
+10FC;MODIFIER LETTER GEORGIAN NAR;Lm;0;L;<super> 10DC;;;;N;;;;;
+10FD;GEORGIAN LETTER AEN;Lo;0;L;;;;;N;;;;;
+10FE;GEORGIAN LETTER HARD SIGN;Lo;0;L;;;;;N;;;;;
+10FF;GEORGIAN LETTER LABIAL SIGN;Lo;0;L;;;;;N;;;;;
+1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;;;;
+1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;;
+1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;;;;
+1103;HANGUL CHOSEONG TIKEUT;Lo;0;L;;;;;N;;;;;
+1104;HANGUL CHOSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;;;;
+1105;HANGUL CHOSEONG RIEUL;Lo;0;L;;;;;N;;;;;
+1106;HANGUL CHOSEONG MIEUM;Lo;0;L;;;;;N;;;;;
+1107;HANGUL CHOSEONG PIEUP;Lo;0;L;;;;;N;;;;;
+1108;HANGUL CHOSEONG SSANGPIEUP;Lo;0;L;;;;;N;;;;;
+1109;HANGUL CHOSEONG SIOS;Lo;0;L;;;;;N;;;;;
+110A;HANGUL CHOSEONG SSANGSIOS;Lo;0;L;;;;;N;;;;;
+110B;HANGUL CHOSEONG IEUNG;Lo;0;L;;;;;N;;;;;
+110C;HANGUL CHOSEONG CIEUC;Lo;0;L;;;;;N;;;;;
+110D;HANGUL CHOSEONG SSANGCIEUC;Lo;0;L;;;;;N;;;;;
+110E;HANGUL CHOSEONG CHIEUCH;Lo;0;L;;;;;N;;;;;
+110F;HANGUL CHOSEONG KHIEUKH;Lo;0;L;;;;;N;;;;;
+1110;HANGUL CHOSEONG THIEUTH;Lo;0;L;;;;;N;;;;;
+1111;HANGUL CHOSEONG PHIEUPH;Lo;0;L;;;;;N;;;;;
+1112;HANGUL CHOSEONG HIEUH;Lo;0;L;;;;;N;;;;;
+1113;HANGUL CHOSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;;
+1114;HANGUL CHOSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;;
+1115;HANGUL CHOSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;;
+1116;HANGUL CHOSEONG NIEUN-PIEUP;Lo;0;L;;;;;N;;;;;
+1117;HANGUL CHOSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;;
+1118;HANGUL CHOSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;;
+1119;HANGUL CHOSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;;
+111A;HANGUL CHOSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;;
+111B;HANGUL CHOSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;;
+111C;HANGUL CHOSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;;
+111D;HANGUL CHOSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;;
+111E;HANGUL CHOSEONG PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;;
+111F;HANGUL CHOSEONG PIEUP-NIEUN;Lo;0;L;;;;;N;;;;;
+1120;HANGUL CHOSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;;
+1121;HANGUL CHOSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;;
+1122;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+1123;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+1124;HANGUL CHOSEONG PIEUP-SIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+1125;HANGUL CHOSEONG PIEUP-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+1126;HANGUL CHOSEONG PIEUP-SIOS-CIEUC;Lo;0;L;;;;;N;;;;;
+1127;HANGUL CHOSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;;
+1128;HANGUL CHOSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;;
+1129;HANGUL CHOSEONG PIEUP-THIEUTH;Lo;0;L;;;;;N;;;;;
+112A;HANGUL CHOSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;;
+112B;HANGUL CHOSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+112C;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP;Lo;0;L;;;;;N;;;;;
+112D;HANGUL CHOSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+112E;HANGUL CHOSEONG SIOS-NIEUN;Lo;0;L;;;;;N;;;;;
+112F;HANGUL CHOSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+1130;HANGUL CHOSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;;
+1131;HANGUL CHOSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;;
+1132;HANGUL CHOSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+1133;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;;
+1134;HANGUL CHOSEONG SIOS-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+1135;HANGUL CHOSEONG SIOS-IEUNG;Lo;0;L;;;;;N;;;;;
+1136;HANGUL CHOSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;;
+1137;HANGUL CHOSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;;
+1138;HANGUL CHOSEONG SIOS-KHIEUKH;Lo;0;L;;;;;N;;;;;
+1139;HANGUL CHOSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;;
+113A;HANGUL CHOSEONG SIOS-PHIEUPH;Lo;0;L;;;;;N;;;;;
+113B;HANGUL CHOSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;;
+113C;HANGUL CHOSEONG CHITUEUMSIOS;Lo;0;L;;;;;N;;;;;
+113D;HANGUL CHOSEONG CHITUEUMSSANGSIOS;Lo;0;L;;;;;N;;;;;
+113E;HANGUL CHOSEONG CEONGCHIEUMSIOS;Lo;0;L;;;;;N;;;;;
+113F;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS;Lo;0;L;;;;;N;;;;;
+1140;HANGUL CHOSEONG PANSIOS;Lo;0;L;;;;;N;;;;;
+1141;HANGUL CHOSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;;
+1142;HANGUL CHOSEONG IEUNG-TIKEUT;Lo;0;L;;;;;N;;;;;
+1143;HANGUL CHOSEONG IEUNG-MIEUM;Lo;0;L;;;;;N;;;;;
+1144;HANGUL CHOSEONG IEUNG-PIEUP;Lo;0;L;;;;;N;;;;;
+1145;HANGUL CHOSEONG IEUNG-SIOS;Lo;0;L;;;;;N;;;;;
+1146;HANGUL CHOSEONG IEUNG-PANSIOS;Lo;0;L;;;;;N;;;;;
+1147;HANGUL CHOSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;;
+1148;HANGUL CHOSEONG IEUNG-CIEUC;Lo;0;L;;;;;N;;;;;
+1149;HANGUL CHOSEONG IEUNG-CHIEUCH;Lo;0;L;;;;;N;;;;;
+114A;HANGUL CHOSEONG IEUNG-THIEUTH;Lo;0;L;;;;;N;;;;;
+114B;HANGUL CHOSEONG IEUNG-PHIEUPH;Lo;0;L;;;;;N;;;;;
+114C;HANGUL CHOSEONG YESIEUNG;Lo;0;L;;;;;N;;;;;
+114D;HANGUL CHOSEONG CIEUC-IEUNG;Lo;0;L;;;;;N;;;;;
+114E;HANGUL CHOSEONG CHITUEUMCIEUC;Lo;0;L;;;;;N;;;;;
+114F;HANGUL CHOSEONG CHITUEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;;
+1150;HANGUL CHOSEONG CEONGCHIEUMCIEUC;Lo;0;L;;;;;N;;;;;
+1151;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;;
+1152;HANGUL CHOSEONG CHIEUCH-KHIEUKH;Lo;0;L;;;;;N;;;;;
+1153;HANGUL CHOSEONG CHIEUCH-HIEUH;Lo;0;L;;;;;N;;;;;
+1154;HANGUL CHOSEONG CHITUEUMCHIEUCH;Lo;0;L;;;;;N;;;;;
+1155;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH;Lo;0;L;;;;;N;;;;;
+1156;HANGUL CHOSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;;
+1157;HANGUL CHOSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;;
+1158;HANGUL CHOSEONG SSANGHIEUH;Lo;0;L;;;;;N;;;;;
+1159;HANGUL CHOSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;;
+115A;HANGUL CHOSEONG KIYEOK-TIKEUT;Lo;0;L;;;;;N;;;;;
+115B;HANGUL CHOSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;;
+115C;HANGUL CHOSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;;;;
+115D;HANGUL CHOSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;;;;
+115E;HANGUL CHOSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;;
+115F;HANGUL CHOSEONG FILLER;Lo;0;L;;;;;N;;;;;
+1160;HANGUL JUNGSEONG FILLER;Lo;0;L;;;;;N;;;;;
+1161;HANGUL JUNGSEONG A;Lo;0;L;;;;;N;;;;;
+1162;HANGUL JUNGSEONG AE;Lo;0;L;;;;;N;;;;;
+1163;HANGUL JUNGSEONG YA;Lo;0;L;;;;;N;;;;;
+1164;HANGUL JUNGSEONG YAE;Lo;0;L;;;;;N;;;;;
+1165;HANGUL JUNGSEONG EO;Lo;0;L;;;;;N;;;;;
+1166;HANGUL JUNGSEONG E;Lo;0;L;;;;;N;;;;;
+1167;HANGUL JUNGSEONG YEO;Lo;0;L;;;;;N;;;;;
+1168;HANGUL JUNGSEONG YE;Lo;0;L;;;;;N;;;;;
+1169;HANGUL JUNGSEONG O;Lo;0;L;;;;;N;;;;;
+116A;HANGUL JUNGSEONG WA;Lo;0;L;;;;;N;;;;;
+116B;HANGUL JUNGSEONG WAE;Lo;0;L;;;;;N;;;;;
+116C;HANGUL JUNGSEONG OE;Lo;0;L;;;;;N;;;;;
+116D;HANGUL JUNGSEONG YO;Lo;0;L;;;;;N;;;;;
+116E;HANGUL JUNGSEONG U;Lo;0;L;;;;;N;;;;;
+116F;HANGUL JUNGSEONG WEO;Lo;0;L;;;;;N;;;;;
+1170;HANGUL JUNGSEONG WE;Lo;0;L;;;;;N;;;;;
+1171;HANGUL JUNGSEONG WI;Lo;0;L;;;;;N;;;;;
+1172;HANGUL JUNGSEONG YU;Lo;0;L;;;;;N;;;;;
+1173;HANGUL JUNGSEONG EU;Lo;0;L;;;;;N;;;;;
+1174;HANGUL JUNGSEONG YI;Lo;0;L;;;;;N;;;;;
+1175;HANGUL JUNGSEONG I;Lo;0;L;;;;;N;;;;;
+1176;HANGUL JUNGSEONG A-O;Lo;0;L;;;;;N;;;;;
+1177;HANGUL JUNGSEONG A-U;Lo;0;L;;;;;N;;;;;
+1178;HANGUL JUNGSEONG YA-O;Lo;0;L;;;;;N;;;;;
+1179;HANGUL JUNGSEONG YA-YO;Lo;0;L;;;;;N;;;;;
+117A;HANGUL JUNGSEONG EO-O;Lo;0;L;;;;;N;;;;;
+117B;HANGUL JUNGSEONG EO-U;Lo;0;L;;;;;N;;;;;
+117C;HANGUL JUNGSEONG EO-EU;Lo;0;L;;;;;N;;;;;
+117D;HANGUL JUNGSEONG YEO-O;Lo;0;L;;;;;N;;;;;
+117E;HANGUL JUNGSEONG YEO-U;Lo;0;L;;;;;N;;;;;
+117F;HANGUL JUNGSEONG O-EO;Lo;0;L;;;;;N;;;;;
+1180;HANGUL JUNGSEONG O-E;Lo;0;L;;;;;N;;;;;
+1181;HANGUL JUNGSEONG O-YE;Lo;0;L;;;;;N;;;;;
+1182;HANGUL JUNGSEONG O-O;Lo;0;L;;;;;N;;;;;
+1183;HANGUL JUNGSEONG O-U;Lo;0;L;;;;;N;;;;;
+1184;HANGUL JUNGSEONG YO-YA;Lo;0;L;;;;;N;;;;;
+1185;HANGUL JUNGSEONG YO-YAE;Lo;0;L;;;;;N;;;;;
+1186;HANGUL JUNGSEONG YO-YEO;Lo;0;L;;;;;N;;;;;
+1187;HANGUL JUNGSEONG YO-O;Lo;0;L;;;;;N;;;;;
+1188;HANGUL JUNGSEONG YO-I;Lo;0;L;;;;;N;;;;;
+1189;HANGUL JUNGSEONG U-A;Lo;0;L;;;;;N;;;;;
+118A;HANGUL JUNGSEONG U-AE;Lo;0;L;;;;;N;;;;;
+118B;HANGUL JUNGSEONG U-EO-EU;Lo;0;L;;;;;N;;;;;
+118C;HANGUL JUNGSEONG U-YE;Lo;0;L;;;;;N;;;;;
+118D;HANGUL JUNGSEONG U-U;Lo;0;L;;;;;N;;;;;
+118E;HANGUL JUNGSEONG YU-A;Lo;0;L;;;;;N;;;;;
+118F;HANGUL JUNGSEONG YU-EO;Lo;0;L;;;;;N;;;;;
+1190;HANGUL JUNGSEONG YU-E;Lo;0;L;;;;;N;;;;;
+1191;HANGUL JUNGSEONG YU-YEO;Lo;0;L;;;;;N;;;;;
+1192;HANGUL JUNGSEONG YU-YE;Lo;0;L;;;;;N;;;;;
+1193;HANGUL JUNGSEONG YU-U;Lo;0;L;;;;;N;;;;;
+1194;HANGUL JUNGSEONG YU-I;Lo;0;L;;;;;N;;;;;
+1195;HANGUL JUNGSEONG EU-U;Lo;0;L;;;;;N;;;;;
+1196;HANGUL JUNGSEONG EU-EU;Lo;0;L;;;;;N;;;;;
+1197;HANGUL JUNGSEONG YI-U;Lo;0;L;;;;;N;;;;;
+1198;HANGUL JUNGSEONG I-A;Lo;0;L;;;;;N;;;;;
+1199;HANGUL JUNGSEONG I-YA;Lo;0;L;;;;;N;;;;;
+119A;HANGUL JUNGSEONG I-O;Lo;0;L;;;;;N;;;;;
+119B;HANGUL JUNGSEONG I-U;Lo;0;L;;;;;N;;;;;
+119C;HANGUL JUNGSEONG I-EU;Lo;0;L;;;;;N;;;;;
+119D;HANGUL JUNGSEONG I-ARAEA;Lo;0;L;;;;;N;;;;;
+119E;HANGUL JUNGSEONG ARAEA;Lo;0;L;;;;;N;;;;;
+119F;HANGUL JUNGSEONG ARAEA-EO;Lo;0;L;;;;;N;;;;;
+11A0;HANGUL JUNGSEONG ARAEA-U;Lo;0;L;;;;;N;;;;;
+11A1;HANGUL JUNGSEONG ARAEA-I;Lo;0;L;;;;;N;;;;;
+11A2;HANGUL JUNGSEONG SSANGARAEA;Lo;0;L;;;;;N;;;;;
+11A3;HANGUL JUNGSEONG A-EU;Lo;0;L;;;;;N;;;;;
+11A4;HANGUL JUNGSEONG YA-U;Lo;0;L;;;;;N;;;;;
+11A5;HANGUL JUNGSEONG YEO-YA;Lo;0;L;;;;;N;;;;;
+11A6;HANGUL JUNGSEONG O-YA;Lo;0;L;;;;;N;;;;;
+11A7;HANGUL JUNGSEONG O-YAE;Lo;0;L;;;;;N;;;;;
+11A8;HANGUL JONGSEONG KIYEOK;Lo;0;L;;;;;N;;;;;
+11A9;HANGUL JONGSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;;
+11AA;HANGUL JONGSEONG KIYEOK-SIOS;Lo;0;L;;;;;N;;;;;
+11AB;HANGUL JONGSEONG NIEUN;Lo;0;L;;;;;N;;;;;
+11AC;HANGUL JONGSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;;;;
+11AD;HANGUL JONGSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;;;;
+11AE;HANGUL JONGSEONG TIKEUT;Lo;0;L;;;;;N;;;;;
+11AF;HANGUL JONGSEONG RIEUL;Lo;0;L;;;;;N;;;;;
+11B0;HANGUL JONGSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;;;;
+11B1;HANGUL JONGSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;;;;
+11B2;HANGUL JONGSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;;;;
+11B3;HANGUL JONGSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;;;;
+11B4;HANGUL JONGSEONG RIEUL-THIEUTH;Lo;0;L;;;;;N;;;;;
+11B5;HANGUL JONGSEONG RIEUL-PHIEUPH;Lo;0;L;;;;;N;;;;;
+11B6;HANGUL JONGSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;;
+11B7;HANGUL JONGSEONG MIEUM;Lo;0;L;;;;;N;;;;;
+11B8;HANGUL JONGSEONG PIEUP;Lo;0;L;;;;;N;;;;;
+11B9;HANGUL JONGSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;;
+11BA;HANGUL JONGSEONG SIOS;Lo;0;L;;;;;N;;;;;
+11BB;HANGUL JONGSEONG SSANGSIOS;Lo;0;L;;;;;N;;;;;
+11BC;HANGUL JONGSEONG IEUNG;Lo;0;L;;;;;N;;;;;
+11BD;HANGUL JONGSEONG CIEUC;Lo;0;L;;;;;N;;;;;
+11BE;HANGUL JONGSEONG CHIEUCH;Lo;0;L;;;;;N;;;;;
+11BF;HANGUL JONGSEONG KHIEUKH;Lo;0;L;;;;;N;;;;;
+11C0;HANGUL JONGSEONG THIEUTH;Lo;0;L;;;;;N;;;;;
+11C1;HANGUL JONGSEONG PHIEUPH;Lo;0;L;;;;;N;;;;;
+11C2;HANGUL JONGSEONG HIEUH;Lo;0;L;;;;;N;;;;;
+11C3;HANGUL JONGSEONG KIYEOK-RIEUL;Lo;0;L;;;;;N;;;;;
+11C4;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+11C5;HANGUL JONGSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;;
+11C6;HANGUL JONGSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;;
+11C7;HANGUL JONGSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;;
+11C8;HANGUL JONGSEONG NIEUN-PANSIOS;Lo;0;L;;;;;N;;;;;
+11C9;HANGUL JONGSEONG NIEUN-THIEUTH;Lo;0;L;;;;;N;;;;;
+11CA;HANGUL JONGSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;;
+11CB;HANGUL JONGSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;;
+11CC;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS;Lo;0;L;;;;;N;;;;;
+11CD;HANGUL JONGSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;;
+11CE;HANGUL JONGSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;;
+11CF;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH;Lo;0;L;;;;;N;;;;;
+11D0;HANGUL JONGSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;;
+11D1;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;;
+11D2;HANGUL JONGSEONG RIEUL-MIEUM-SIOS;Lo;0;L;;;;;N;;;;;
+11D3;HANGUL JONGSEONG RIEUL-PIEUP-SIOS;Lo;0;L;;;;;N;;;;;
+11D4;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH;Lo;0;L;;;;;N;;;;;
+11D5;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+11D6;HANGUL JONGSEONG RIEUL-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+11D7;HANGUL JONGSEONG RIEUL-PANSIOS;Lo;0;L;;;;;N;;;;;
+11D8;HANGUL JONGSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;;
+11D9;HANGUL JONGSEONG RIEUL-YEORINHIEUH;Lo;0;L;;;;;N;;;;;
+11DA;HANGUL JONGSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;;
+11DB;HANGUL JONGSEONG MIEUM-RIEUL;Lo;0;L;;;;;N;;;;;
+11DC;HANGUL JONGSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;;
+11DD;HANGUL JONGSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;;
+11DE;HANGUL JONGSEONG MIEUM-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+11DF;HANGUL JONGSEONG MIEUM-PANSIOS;Lo;0;L;;;;;N;;;;;
+11E0;HANGUL JONGSEONG MIEUM-CHIEUCH;Lo;0;L;;;;;N;;;;;
+11E1;HANGUL JONGSEONG MIEUM-HIEUH;Lo;0;L;;;;;N;;;;;
+11E2;HANGUL JONGSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;;
+11E3;HANGUL JONGSEONG PIEUP-RIEUL;Lo;0;L;;;;;N;;;;;
+11E4;HANGUL JONGSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;;
+11E5;HANGUL JONGSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;;
+11E6;HANGUL JONGSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+11E7;HANGUL JONGSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+11E8;HANGUL JONGSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+11E9;HANGUL JONGSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;;
+11EA;HANGUL JONGSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+11EB;HANGUL JONGSEONG PANSIOS;Lo;0;L;;;;;N;;;;;
+11EC;HANGUL JONGSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;;
+11ED;HANGUL JONGSEONG IEUNG-SSANGKIYEOK;Lo;0;L;;;;;N;;;;;
+11EE;HANGUL JONGSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;;
+11EF;HANGUL JONGSEONG IEUNG-KHIEUKH;Lo;0;L;;;;;N;;;;;
+11F0;HANGUL JONGSEONG YESIEUNG;Lo;0;L;;;;;N;;;;;
+11F1;HANGUL JONGSEONG YESIEUNG-SIOS;Lo;0;L;;;;;N;;;;;
+11F2;HANGUL JONGSEONG YESIEUNG-PANSIOS;Lo;0;L;;;;;N;;;;;
+11F3;HANGUL JONGSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;;
+11F4;HANGUL JONGSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;;
+11F5;HANGUL JONGSEONG HIEUH-NIEUN;Lo;0;L;;;;;N;;;;;
+11F6;HANGUL JONGSEONG HIEUH-RIEUL;Lo;0;L;;;;;N;;;;;
+11F7;HANGUL JONGSEONG HIEUH-MIEUM;Lo;0;L;;;;;N;;;;;
+11F8;HANGUL JONGSEONG HIEUH-PIEUP;Lo;0;L;;;;;N;;;;;
+11F9;HANGUL JONGSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;;
+11FA;HANGUL JONGSEONG KIYEOK-NIEUN;Lo;0;L;;;;;N;;;;;
+11FB;HANGUL JONGSEONG KIYEOK-PIEUP;Lo;0;L;;;;;N;;;;;
+11FC;HANGUL JONGSEONG KIYEOK-CHIEUCH;Lo;0;L;;;;;N;;;;;
+11FD;HANGUL JONGSEONG KIYEOK-KHIEUKH;Lo;0;L;;;;;N;;;;;
+11FE;HANGUL JONGSEONG KIYEOK-HIEUH;Lo;0;L;;;;;N;;;;;
+11FF;HANGUL JONGSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;;
+1200;ETHIOPIC SYLLABLE HA;Lo;0;L;;;;;N;;;;;
+1201;ETHIOPIC SYLLABLE HU;Lo;0;L;;;;;N;;;;;
+1202;ETHIOPIC SYLLABLE HI;Lo;0;L;;;;;N;;;;;
+1203;ETHIOPIC SYLLABLE HAA;Lo;0;L;;;;;N;;;;;
+1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;;
+1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;;
+1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;;
+1207;ETHIOPIC SYLLABLE HOA;Lo;0;L;;;;;N;;;;;
+1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;;
+1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;;
+120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;;
+120B;ETHIOPIC SYLLABLE LAA;Lo;0;L;;;;;N;;;;;
+120C;ETHIOPIC SYLLABLE LEE;Lo;0;L;;;;;N;;;;;
+120D;ETHIOPIC SYLLABLE LE;Lo;0;L;;;;;N;;;;;
+120E;ETHIOPIC SYLLABLE LO;Lo;0;L;;;;;N;;;;;
+120F;ETHIOPIC SYLLABLE LWA;Lo;0;L;;;;;N;;;;;
+1210;ETHIOPIC SYLLABLE HHA;Lo;0;L;;;;;N;;;;;
+1211;ETHIOPIC SYLLABLE HHU;Lo;0;L;;;;;N;;;;;
+1212;ETHIOPIC SYLLABLE HHI;Lo;0;L;;;;;N;;;;;
+1213;ETHIOPIC SYLLABLE HHAA;Lo;0;L;;;;;N;;;;;
+1214;ETHIOPIC SYLLABLE HHEE;Lo;0;L;;;;;N;;;;;
+1215;ETHIOPIC SYLLABLE HHE;Lo;0;L;;;;;N;;;;;
+1216;ETHIOPIC SYLLABLE HHO;Lo;0;L;;;;;N;;;;;
+1217;ETHIOPIC SYLLABLE HHWA;Lo;0;L;;;;;N;;;;;
+1218;ETHIOPIC SYLLABLE MA;Lo;0;L;;;;;N;;;;;
+1219;ETHIOPIC SYLLABLE MU;Lo;0;L;;;;;N;;;;;
+121A;ETHIOPIC SYLLABLE MI;Lo;0;L;;;;;N;;;;;
+121B;ETHIOPIC SYLLABLE MAA;Lo;0;L;;;;;N;;;;;
+121C;ETHIOPIC SYLLABLE MEE;Lo;0;L;;;;;N;;;;;
+121D;ETHIOPIC SYLLABLE ME;Lo;0;L;;;;;N;;;;;
+121E;ETHIOPIC SYLLABLE MO;Lo;0;L;;;;;N;;;;;
+121F;ETHIOPIC SYLLABLE MWA;Lo;0;L;;;;;N;;;;;
+1220;ETHIOPIC SYLLABLE SZA;Lo;0;L;;;;;N;;;;;
+1221;ETHIOPIC SYLLABLE SZU;Lo;0;L;;;;;N;;;;;
+1222;ETHIOPIC SYLLABLE SZI;Lo;0;L;;;;;N;;;;;
+1223;ETHIOPIC SYLLABLE SZAA;Lo;0;L;;;;;N;;;;;
+1224;ETHIOPIC SYLLABLE SZEE;Lo;0;L;;;;;N;;;;;
+1225;ETHIOPIC SYLLABLE SZE;Lo;0;L;;;;;N;;;;;
+1226;ETHIOPIC SYLLABLE SZO;Lo;0;L;;;;;N;;;;;
+1227;ETHIOPIC SYLLABLE SZWA;Lo;0;L;;;;;N;;;;;
+1228;ETHIOPIC SYLLABLE RA;Lo;0;L;;;;;N;;;;;
+1229;ETHIOPIC SYLLABLE RU;Lo;0;L;;;;;N;;;;;
+122A;ETHIOPIC SYLLABLE RI;Lo;0;L;;;;;N;;;;;
+122B;ETHIOPIC SYLLABLE RAA;Lo;0;L;;;;;N;;;;;
+122C;ETHIOPIC SYLLABLE REE;Lo;0;L;;;;;N;;;;;
+122D;ETHIOPIC SYLLABLE RE;Lo;0;L;;;;;N;;;;;
+122E;ETHIOPIC SYLLABLE RO;Lo;0;L;;;;;N;;;;;
+122F;ETHIOPIC SYLLABLE RWA;Lo;0;L;;;;;N;;;;;
+1230;ETHIOPIC SYLLABLE SA;Lo;0;L;;;;;N;;;;;
+1231;ETHIOPIC SYLLABLE SU;Lo;0;L;;;;;N;;;;;
+1232;ETHIOPIC SYLLABLE SI;Lo;0;L;;;;;N;;;;;
+1233;ETHIOPIC SYLLABLE SAA;Lo;0;L;;;;;N;;;;;
+1234;ETHIOPIC SYLLABLE SEE;Lo;0;L;;;;;N;;;;;
+1235;ETHIOPIC SYLLABLE SE;Lo;0;L;;;;;N;;;;;
+1236;ETHIOPIC SYLLABLE SO;Lo;0;L;;;;;N;;;;;
+1237;ETHIOPIC SYLLABLE SWA;Lo;0;L;;;;;N;;;;;
+1238;ETHIOPIC SYLLABLE SHA;Lo;0;L;;;;;N;;;;;
+1239;ETHIOPIC SYLLABLE SHU;Lo;0;L;;;;;N;;;;;
+123A;ETHIOPIC SYLLABLE SHI;Lo;0;L;;;;;N;;;;;
+123B;ETHIOPIC SYLLABLE SHAA;Lo;0;L;;;;;N;;;;;
+123C;ETHIOPIC SYLLABLE SHEE;Lo;0;L;;;;;N;;;;;
+123D;ETHIOPIC SYLLABLE SHE;Lo;0;L;;;;;N;;;;;
+123E;ETHIOPIC SYLLABLE SHO;Lo;0;L;;;;;N;;;;;
+123F;ETHIOPIC SYLLABLE SHWA;Lo;0;L;;;;;N;;;;;
+1240;ETHIOPIC SYLLABLE QA;Lo;0;L;;;;;N;;;;;
+1241;ETHIOPIC SYLLABLE QU;Lo;0;L;;;;;N;;;;;
+1242;ETHIOPIC SYLLABLE QI;Lo;0;L;;;;;N;;;;;
+1243;ETHIOPIC SYLLABLE QAA;Lo;0;L;;;;;N;;;;;
+1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;;
+1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;;
+1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;;
+1247;ETHIOPIC SYLLABLE QOA;Lo;0;L;;;;;N;;;;;
+1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;;
+124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;;
+124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;;
+124C;ETHIOPIC SYLLABLE QWEE;Lo;0;L;;;;;N;;;;;
+124D;ETHIOPIC SYLLABLE QWE;Lo;0;L;;;;;N;;;;;
+1250;ETHIOPIC SYLLABLE QHA;Lo;0;L;;;;;N;;;;;
+1251;ETHIOPIC SYLLABLE QHU;Lo;0;L;;;;;N;;;;;
+1252;ETHIOPIC SYLLABLE QHI;Lo;0;L;;;;;N;;;;;
+1253;ETHIOPIC SYLLABLE QHAA;Lo;0;L;;;;;N;;;;;
+1254;ETHIOPIC SYLLABLE QHEE;Lo;0;L;;;;;N;;;;;
+1255;ETHIOPIC SYLLABLE QHE;Lo;0;L;;;;;N;;;;;
+1256;ETHIOPIC SYLLABLE QHO;Lo;0;L;;;;;N;;;;;
+1258;ETHIOPIC SYLLABLE QHWA;Lo;0;L;;;;;N;;;;;
+125A;ETHIOPIC SYLLABLE QHWI;Lo;0;L;;;;;N;;;;;
+125B;ETHIOPIC SYLLABLE QHWAA;Lo;0;L;;;;;N;;;;;
+125C;ETHIOPIC SYLLABLE QHWEE;Lo;0;L;;;;;N;;;;;
+125D;ETHIOPIC SYLLABLE QHWE;Lo;0;L;;;;;N;;;;;
+1260;ETHIOPIC SYLLABLE BA;Lo;0;L;;;;;N;;;;;
+1261;ETHIOPIC SYLLABLE BU;Lo;0;L;;;;;N;;;;;
+1262;ETHIOPIC SYLLABLE BI;Lo;0;L;;;;;N;;;;;
+1263;ETHIOPIC SYLLABLE BAA;Lo;0;L;;;;;N;;;;;
+1264;ETHIOPIC SYLLABLE BEE;Lo;0;L;;;;;N;;;;;
+1265;ETHIOPIC SYLLABLE BE;Lo;0;L;;;;;N;;;;;
+1266;ETHIOPIC SYLLABLE BO;Lo;0;L;;;;;N;;;;;
+1267;ETHIOPIC SYLLABLE BWA;Lo;0;L;;;;;N;;;;;
+1268;ETHIOPIC SYLLABLE VA;Lo;0;L;;;;;N;;;;;
+1269;ETHIOPIC SYLLABLE VU;Lo;0;L;;;;;N;;;;;
+126A;ETHIOPIC SYLLABLE VI;Lo;0;L;;;;;N;;;;;
+126B;ETHIOPIC SYLLABLE VAA;Lo;0;L;;;;;N;;;;;
+126C;ETHIOPIC SYLLABLE VEE;Lo;0;L;;;;;N;;;;;
+126D;ETHIOPIC SYLLABLE VE;Lo;0;L;;;;;N;;;;;
+126E;ETHIOPIC SYLLABLE VO;Lo;0;L;;;;;N;;;;;
+126F;ETHIOPIC SYLLABLE VWA;Lo;0;L;;;;;N;;;;;
+1270;ETHIOPIC SYLLABLE TA;Lo;0;L;;;;;N;;;;;
+1271;ETHIOPIC SYLLABLE TU;Lo;0;L;;;;;N;;;;;
+1272;ETHIOPIC SYLLABLE TI;Lo;0;L;;;;;N;;;;;
+1273;ETHIOPIC SYLLABLE TAA;Lo;0;L;;;;;N;;;;;
+1274;ETHIOPIC SYLLABLE TEE;Lo;0;L;;;;;N;;;;;
+1275;ETHIOPIC SYLLABLE TE;Lo;0;L;;;;;N;;;;;
+1276;ETHIOPIC SYLLABLE TO;Lo;0;L;;;;;N;;;;;
+1277;ETHIOPIC SYLLABLE TWA;Lo;0;L;;;;;N;;;;;
+1278;ETHIOPIC SYLLABLE CA;Lo;0;L;;;;;N;;;;;
+1279;ETHIOPIC SYLLABLE CU;Lo;0;L;;;;;N;;;;;
+127A;ETHIOPIC SYLLABLE CI;Lo;0;L;;;;;N;;;;;
+127B;ETHIOPIC SYLLABLE CAA;Lo;0;L;;;;;N;;;;;
+127C;ETHIOPIC SYLLABLE CEE;Lo;0;L;;;;;N;;;;;
+127D;ETHIOPIC SYLLABLE CE;Lo;0;L;;;;;N;;;;;
+127E;ETHIOPIC SYLLABLE CO;Lo;0;L;;;;;N;;;;;
+127F;ETHIOPIC SYLLABLE CWA;Lo;0;L;;;;;N;;;;;
+1280;ETHIOPIC SYLLABLE XA;Lo;0;L;;;;;N;;;;;
+1281;ETHIOPIC SYLLABLE XU;Lo;0;L;;;;;N;;;;;
+1282;ETHIOPIC SYLLABLE XI;Lo;0;L;;;;;N;;;;;
+1283;ETHIOPIC SYLLABLE XAA;Lo;0;L;;;;;N;;;;;
+1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;;
+1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;;
+1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;;
+1287;ETHIOPIC SYLLABLE XOA;Lo;0;L;;;;;N;;;;;
+1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;;
+128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;;
+128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;;
+128C;ETHIOPIC SYLLABLE XWEE;Lo;0;L;;;;;N;;;;;
+128D;ETHIOPIC SYLLABLE XWE;Lo;0;L;;;;;N;;;;;
+1290;ETHIOPIC SYLLABLE NA;Lo;0;L;;;;;N;;;;;
+1291;ETHIOPIC SYLLABLE NU;Lo;0;L;;;;;N;;;;;
+1292;ETHIOPIC SYLLABLE NI;Lo;0;L;;;;;N;;;;;
+1293;ETHIOPIC SYLLABLE NAA;Lo;0;L;;;;;N;;;;;
+1294;ETHIOPIC SYLLABLE NEE;Lo;0;L;;;;;N;;;;;
+1295;ETHIOPIC SYLLABLE NE;Lo;0;L;;;;;N;;;;;
+1296;ETHIOPIC SYLLABLE NO;Lo;0;L;;;;;N;;;;;
+1297;ETHIOPIC SYLLABLE NWA;Lo;0;L;;;;;N;;;;;
+1298;ETHIOPIC SYLLABLE NYA;Lo;0;L;;;;;N;;;;;
+1299;ETHIOPIC SYLLABLE NYU;Lo;0;L;;;;;N;;;;;
+129A;ETHIOPIC SYLLABLE NYI;Lo;0;L;;;;;N;;;;;
+129B;ETHIOPIC SYLLABLE NYAA;Lo;0;L;;;;;N;;;;;
+129C;ETHIOPIC SYLLABLE NYEE;Lo;0;L;;;;;N;;;;;
+129D;ETHIOPIC SYLLABLE NYE;Lo;0;L;;;;;N;;;;;
+129E;ETHIOPIC SYLLABLE NYO;Lo;0;L;;;;;N;;;;;
+129F;ETHIOPIC SYLLABLE NYWA;Lo;0;L;;;;;N;;;;;
+12A0;ETHIOPIC SYLLABLE GLOTTAL A;Lo;0;L;;;;;N;;;;;
+12A1;ETHIOPIC SYLLABLE GLOTTAL U;Lo;0;L;;;;;N;;;;;
+12A2;ETHIOPIC SYLLABLE GLOTTAL I;Lo;0;L;;;;;N;;;;;
+12A3;ETHIOPIC SYLLABLE GLOTTAL AA;Lo;0;L;;;;;N;;;;;
+12A4;ETHIOPIC SYLLABLE GLOTTAL EE;Lo;0;L;;;;;N;;;;;
+12A5;ETHIOPIC SYLLABLE GLOTTAL E;Lo;0;L;;;;;N;;;;;
+12A6;ETHIOPIC SYLLABLE GLOTTAL O;Lo;0;L;;;;;N;;;;;
+12A7;ETHIOPIC SYLLABLE GLOTTAL WA;Lo;0;L;;;;;N;;;;;
+12A8;ETHIOPIC SYLLABLE KA;Lo;0;L;;;;;N;;;;;
+12A9;ETHIOPIC SYLLABLE KU;Lo;0;L;;;;;N;;;;;
+12AA;ETHIOPIC SYLLABLE KI;Lo;0;L;;;;;N;;;;;
+12AB;ETHIOPIC SYLLABLE KAA;Lo;0;L;;;;;N;;;;;
+12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;;
+12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;;
+12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;;
+12AF;ETHIOPIC SYLLABLE KOA;Lo;0;L;;;;;N;;;;;
+12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;;
+12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;;
+12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;;
+12B4;ETHIOPIC SYLLABLE KWEE;Lo;0;L;;;;;N;;;;;
+12B5;ETHIOPIC SYLLABLE KWE;Lo;0;L;;;;;N;;;;;
+12B8;ETHIOPIC SYLLABLE KXA;Lo;0;L;;;;;N;;;;;
+12B9;ETHIOPIC SYLLABLE KXU;Lo;0;L;;;;;N;;;;;
+12BA;ETHIOPIC SYLLABLE KXI;Lo;0;L;;;;;N;;;;;
+12BB;ETHIOPIC SYLLABLE KXAA;Lo;0;L;;;;;N;;;;;
+12BC;ETHIOPIC SYLLABLE KXEE;Lo;0;L;;;;;N;;;;;
+12BD;ETHIOPIC SYLLABLE KXE;Lo;0;L;;;;;N;;;;;
+12BE;ETHIOPIC SYLLABLE KXO;Lo;0;L;;;;;N;;;;;
+12C0;ETHIOPIC SYLLABLE KXWA;Lo;0;L;;;;;N;;;;;
+12C2;ETHIOPIC SYLLABLE KXWI;Lo;0;L;;;;;N;;;;;
+12C3;ETHIOPIC SYLLABLE KXWAA;Lo;0;L;;;;;N;;;;;
+12C4;ETHIOPIC SYLLABLE KXWEE;Lo;0;L;;;;;N;;;;;
+12C5;ETHIOPIC SYLLABLE KXWE;Lo;0;L;;;;;N;;;;;
+12C8;ETHIOPIC SYLLABLE WA;Lo;0;L;;;;;N;;;;;
+12C9;ETHIOPIC SYLLABLE WU;Lo;0;L;;;;;N;;;;;
+12CA;ETHIOPIC SYLLABLE WI;Lo;0;L;;;;;N;;;;;
+12CB;ETHIOPIC SYLLABLE WAA;Lo;0;L;;;;;N;;;;;
+12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;;
+12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;;
+12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;;
+12CF;ETHIOPIC SYLLABLE WOA;Lo;0;L;;;;;N;;;;;
+12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;;
+12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;;
+12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;;
+12D3;ETHIOPIC SYLLABLE PHARYNGEAL AA;Lo;0;L;;;;;N;;;;;
+12D4;ETHIOPIC SYLLABLE PHARYNGEAL EE;Lo;0;L;;;;;N;;;;;
+12D5;ETHIOPIC SYLLABLE PHARYNGEAL E;Lo;0;L;;;;;N;;;;;
+12D6;ETHIOPIC SYLLABLE PHARYNGEAL O;Lo;0;L;;;;;N;;;;;
+12D8;ETHIOPIC SYLLABLE ZA;Lo;0;L;;;;;N;;;;;
+12D9;ETHIOPIC SYLLABLE ZU;Lo;0;L;;;;;N;;;;;
+12DA;ETHIOPIC SYLLABLE ZI;Lo;0;L;;;;;N;;;;;
+12DB;ETHIOPIC SYLLABLE ZAA;Lo;0;L;;;;;N;;;;;
+12DC;ETHIOPIC SYLLABLE ZEE;Lo;0;L;;;;;N;;;;;
+12DD;ETHIOPIC SYLLABLE ZE;Lo;0;L;;;;;N;;;;;
+12DE;ETHIOPIC SYLLABLE ZO;Lo;0;L;;;;;N;;;;;
+12DF;ETHIOPIC SYLLABLE ZWA;Lo;0;L;;;;;N;;;;;
+12E0;ETHIOPIC SYLLABLE ZHA;Lo;0;L;;;;;N;;;;;
+12E1;ETHIOPIC SYLLABLE ZHU;Lo;0;L;;;;;N;;;;;
+12E2;ETHIOPIC SYLLABLE ZHI;Lo;0;L;;;;;N;;;;;
+12E3;ETHIOPIC SYLLABLE ZHAA;Lo;0;L;;;;;N;;;;;
+12E4;ETHIOPIC SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;;
+12E5;ETHIOPIC SYLLABLE ZHE;Lo;0;L;;;;;N;;;;;
+12E6;ETHIOPIC SYLLABLE ZHO;Lo;0;L;;;;;N;;;;;
+12E7;ETHIOPIC SYLLABLE ZHWA;Lo;0;L;;;;;N;;;;;
+12E8;ETHIOPIC SYLLABLE YA;Lo;0;L;;;;;N;;;;;
+12E9;ETHIOPIC SYLLABLE YU;Lo;0;L;;;;;N;;;;;
+12EA;ETHIOPIC SYLLABLE YI;Lo;0;L;;;;;N;;;;;
+12EB;ETHIOPIC SYLLABLE YAA;Lo;0;L;;;;;N;;;;;
+12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;;
+12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;;
+12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;;
+12EF;ETHIOPIC SYLLABLE YOA;Lo;0;L;;;;;N;;;;;
+12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;;
+12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;;
+12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;;
+12F3;ETHIOPIC SYLLABLE DAA;Lo;0;L;;;;;N;;;;;
+12F4;ETHIOPIC SYLLABLE DEE;Lo;0;L;;;;;N;;;;;
+12F5;ETHIOPIC SYLLABLE DE;Lo;0;L;;;;;N;;;;;
+12F6;ETHIOPIC SYLLABLE DO;Lo;0;L;;;;;N;;;;;
+12F7;ETHIOPIC SYLLABLE DWA;Lo;0;L;;;;;N;;;;;
+12F8;ETHIOPIC SYLLABLE DDA;Lo;0;L;;;;;N;;;;;
+12F9;ETHIOPIC SYLLABLE DDU;Lo;0;L;;;;;N;;;;;
+12FA;ETHIOPIC SYLLABLE DDI;Lo;0;L;;;;;N;;;;;
+12FB;ETHIOPIC SYLLABLE DDAA;Lo;0;L;;;;;N;;;;;
+12FC;ETHIOPIC SYLLABLE DDEE;Lo;0;L;;;;;N;;;;;
+12FD;ETHIOPIC SYLLABLE DDE;Lo;0;L;;;;;N;;;;;
+12FE;ETHIOPIC SYLLABLE DDO;Lo;0;L;;;;;N;;;;;
+12FF;ETHIOPIC SYLLABLE DDWA;Lo;0;L;;;;;N;;;;;
+1300;ETHIOPIC SYLLABLE JA;Lo;0;L;;;;;N;;;;;
+1301;ETHIOPIC SYLLABLE JU;Lo;0;L;;;;;N;;;;;
+1302;ETHIOPIC SYLLABLE JI;Lo;0;L;;;;;N;;;;;
+1303;ETHIOPIC SYLLABLE JAA;Lo;0;L;;;;;N;;;;;
+1304;ETHIOPIC SYLLABLE JEE;Lo;0;L;;;;;N;;;;;
+1305;ETHIOPIC SYLLABLE JE;Lo;0;L;;;;;N;;;;;
+1306;ETHIOPIC SYLLABLE JO;Lo;0;L;;;;;N;;;;;
+1307;ETHIOPIC SYLLABLE JWA;Lo;0;L;;;;;N;;;;;
+1308;ETHIOPIC SYLLABLE GA;Lo;0;L;;;;;N;;;;;
+1309;ETHIOPIC SYLLABLE GU;Lo;0;L;;;;;N;;;;;
+130A;ETHIOPIC SYLLABLE GI;Lo;0;L;;;;;N;;;;;
+130B;ETHIOPIC SYLLABLE GAA;Lo;0;L;;;;;N;;;;;
+130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;;
+130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;;
+130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;;
+130F;ETHIOPIC SYLLABLE GOA;Lo;0;L;;;;;N;;;;;
+1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;;
+1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;;
+1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;;
+1314;ETHIOPIC SYLLABLE GWEE;Lo;0;L;;;;;N;;;;;
+1315;ETHIOPIC SYLLABLE GWE;Lo;0;L;;;;;N;;;;;
+1318;ETHIOPIC SYLLABLE GGA;Lo;0;L;;;;;N;;;;;
+1319;ETHIOPIC SYLLABLE GGU;Lo;0;L;;;;;N;;;;;
+131A;ETHIOPIC SYLLABLE GGI;Lo;0;L;;;;;N;;;;;
+131B;ETHIOPIC SYLLABLE GGAA;Lo;0;L;;;;;N;;;;;
+131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;;
+131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;;
+131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;;
+131F;ETHIOPIC SYLLABLE GGWAA;Lo;0;L;;;;;N;;;;;
+1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;;
+1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;;
+1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;;
+1323;ETHIOPIC SYLLABLE THAA;Lo;0;L;;;;;N;;;;;
+1324;ETHIOPIC SYLLABLE THEE;Lo;0;L;;;;;N;;;;;
+1325;ETHIOPIC SYLLABLE THE;Lo;0;L;;;;;N;;;;;
+1326;ETHIOPIC SYLLABLE THO;Lo;0;L;;;;;N;;;;;
+1327;ETHIOPIC SYLLABLE THWA;Lo;0;L;;;;;N;;;;;
+1328;ETHIOPIC SYLLABLE CHA;Lo;0;L;;;;;N;;;;;
+1329;ETHIOPIC SYLLABLE CHU;Lo;0;L;;;;;N;;;;;
+132A;ETHIOPIC SYLLABLE CHI;Lo;0;L;;;;;N;;;;;
+132B;ETHIOPIC SYLLABLE CHAA;Lo;0;L;;;;;N;;;;;
+132C;ETHIOPIC SYLLABLE CHEE;Lo;0;L;;;;;N;;;;;
+132D;ETHIOPIC SYLLABLE CHE;Lo;0;L;;;;;N;;;;;
+132E;ETHIOPIC SYLLABLE CHO;Lo;0;L;;;;;N;;;;;
+132F;ETHIOPIC SYLLABLE CHWA;Lo;0;L;;;;;N;;;;;
+1330;ETHIOPIC SYLLABLE PHA;Lo;0;L;;;;;N;;;;;
+1331;ETHIOPIC SYLLABLE PHU;Lo;0;L;;;;;N;;;;;
+1332;ETHIOPIC SYLLABLE PHI;Lo;0;L;;;;;N;;;;;
+1333;ETHIOPIC SYLLABLE PHAA;Lo;0;L;;;;;N;;;;;
+1334;ETHIOPIC SYLLABLE PHEE;Lo;0;L;;;;;N;;;;;
+1335;ETHIOPIC SYLLABLE PHE;Lo;0;L;;;;;N;;;;;
+1336;ETHIOPIC SYLLABLE PHO;Lo;0;L;;;;;N;;;;;
+1337;ETHIOPIC SYLLABLE PHWA;Lo;0;L;;;;;N;;;;;
+1338;ETHIOPIC SYLLABLE TSA;Lo;0;L;;;;;N;;;;;
+1339;ETHIOPIC SYLLABLE TSU;Lo;0;L;;;;;N;;;;;
+133A;ETHIOPIC SYLLABLE TSI;Lo;0;L;;;;;N;;;;;
+133B;ETHIOPIC SYLLABLE TSAA;Lo;0;L;;;;;N;;;;;
+133C;ETHIOPIC SYLLABLE TSEE;Lo;0;L;;;;;N;;;;;
+133D;ETHIOPIC SYLLABLE TSE;Lo;0;L;;;;;N;;;;;
+133E;ETHIOPIC SYLLABLE TSO;Lo;0;L;;;;;N;;;;;
+133F;ETHIOPIC SYLLABLE TSWA;Lo;0;L;;;;;N;;;;;
+1340;ETHIOPIC SYLLABLE TZA;Lo;0;L;;;;;N;;;;;
+1341;ETHIOPIC SYLLABLE TZU;Lo;0;L;;;;;N;;;;;
+1342;ETHIOPIC SYLLABLE TZI;Lo;0;L;;;;;N;;;;;
+1343;ETHIOPIC SYLLABLE TZAA;Lo;0;L;;;;;N;;;;;
+1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;;
+1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;;
+1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;;
+1347;ETHIOPIC SYLLABLE TZOA;Lo;0;L;;;;;N;;;;;
+1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;;
+1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;;
+134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;;
+134B;ETHIOPIC SYLLABLE FAA;Lo;0;L;;;;;N;;;;;
+134C;ETHIOPIC SYLLABLE FEE;Lo;0;L;;;;;N;;;;;
+134D;ETHIOPIC SYLLABLE FE;Lo;0;L;;;;;N;;;;;
+134E;ETHIOPIC SYLLABLE FO;Lo;0;L;;;;;N;;;;;
+134F;ETHIOPIC SYLLABLE FWA;Lo;0;L;;;;;N;;;;;
+1350;ETHIOPIC SYLLABLE PA;Lo;0;L;;;;;N;;;;;
+1351;ETHIOPIC SYLLABLE PU;Lo;0;L;;;;;N;;;;;
+1352;ETHIOPIC SYLLABLE PI;Lo;0;L;;;;;N;;;;;
+1353;ETHIOPIC SYLLABLE PAA;Lo;0;L;;;;;N;;;;;
+1354;ETHIOPIC SYLLABLE PEE;Lo;0;L;;;;;N;;;;;
+1355;ETHIOPIC SYLLABLE PE;Lo;0;L;;;;;N;;;;;
+1356;ETHIOPIC SYLLABLE PO;Lo;0;L;;;;;N;;;;;
+1357;ETHIOPIC SYLLABLE PWA;Lo;0;L;;;;;N;;;;;
+1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;;
+1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;;
+135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;;
+135D;ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK;Mn;230;NSM;;;;;N;;;;;
+135E;ETHIOPIC COMBINING VOWEL LENGTH MARK;Mn;230;NSM;;;;;N;;;;;
+135F;ETHIOPIC COMBINING GEMINATION MARK;Mn;230;NSM;;;;;N;;;;;
+1360;ETHIOPIC SECTION MARK;Po;0;L;;;;;N;;;;;
+1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;;
+1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;;
+1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;;
+1364;ETHIOPIC SEMICOLON;Po;0;L;;;;;N;;;;;
+1365;ETHIOPIC COLON;Po;0;L;;;;;N;;;;;
+1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;;
+1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;;
+1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;;
+1369;ETHIOPIC DIGIT ONE;No;0;L;;;1;1;N;;;;;
+136A;ETHIOPIC DIGIT TWO;No;0;L;;;2;2;N;;;;;
+136B;ETHIOPIC DIGIT THREE;No;0;L;;;3;3;N;;;;;
+136C;ETHIOPIC DIGIT FOUR;No;0;L;;;4;4;N;;;;;
+136D;ETHIOPIC DIGIT FIVE;No;0;L;;;5;5;N;;;;;
+136E;ETHIOPIC DIGIT SIX;No;0;L;;;6;6;N;;;;;
+136F;ETHIOPIC DIGIT SEVEN;No;0;L;;;7;7;N;;;;;
+1370;ETHIOPIC DIGIT EIGHT;No;0;L;;;8;8;N;;;;;
+1371;ETHIOPIC DIGIT NINE;No;0;L;;;9;9;N;;;;;
+1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;;
+1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;;
+1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;;
+1375;ETHIOPIC NUMBER FORTY;No;0;L;;;;40;N;;;;;
+1376;ETHIOPIC NUMBER FIFTY;No;0;L;;;;50;N;;;;;
+1377;ETHIOPIC NUMBER SIXTY;No;0;L;;;;60;N;;;;;
+1378;ETHIOPIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;;
+1379;ETHIOPIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;;
+137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;;
+137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;;
+137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;;
+1380;ETHIOPIC SYLLABLE SEBATBEIT MWA;Lo;0;L;;;;;N;;;;;
+1381;ETHIOPIC SYLLABLE MWI;Lo;0;L;;;;;N;;;;;
+1382;ETHIOPIC SYLLABLE MWEE;Lo;0;L;;;;;N;;;;;
+1383;ETHIOPIC SYLLABLE MWE;Lo;0;L;;;;;N;;;;;
+1384;ETHIOPIC SYLLABLE SEBATBEIT BWA;Lo;0;L;;;;;N;;;;;
+1385;ETHIOPIC SYLLABLE BWI;Lo;0;L;;;;;N;;;;;
+1386;ETHIOPIC SYLLABLE BWEE;Lo;0;L;;;;;N;;;;;
+1387;ETHIOPIC SYLLABLE BWE;Lo;0;L;;;;;N;;;;;
+1388;ETHIOPIC SYLLABLE SEBATBEIT FWA;Lo;0;L;;;;;N;;;;;
+1389;ETHIOPIC SYLLABLE FWI;Lo;0;L;;;;;N;;;;;
+138A;ETHIOPIC SYLLABLE FWEE;Lo;0;L;;;;;N;;;;;
+138B;ETHIOPIC SYLLABLE FWE;Lo;0;L;;;;;N;;;;;
+138C;ETHIOPIC SYLLABLE SEBATBEIT PWA;Lo;0;L;;;;;N;;;;;
+138D;ETHIOPIC SYLLABLE PWI;Lo;0;L;;;;;N;;;;;
+138E;ETHIOPIC SYLLABLE PWEE;Lo;0;L;;;;;N;;;;;
+138F;ETHIOPIC SYLLABLE PWE;Lo;0;L;;;;;N;;;;;
+1390;ETHIOPIC TONAL MARK YIZET;So;0;ON;;;;;N;;;;;
+1391;ETHIOPIC TONAL MARK DERET;So;0;ON;;;;;N;;;;;
+1392;ETHIOPIC TONAL MARK RIKRIK;So;0;ON;;;;;N;;;;;
+1393;ETHIOPIC TONAL MARK SHORT RIKRIK;So;0;ON;;;;;N;;;;;
+1394;ETHIOPIC TONAL MARK DIFAT;So;0;ON;;;;;N;;;;;
+1395;ETHIOPIC TONAL MARK KENAT;So;0;ON;;;;;N;;;;;
+1396;ETHIOPIC TONAL MARK CHIRET;So;0;ON;;;;;N;;;;;
+1397;ETHIOPIC TONAL MARK HIDET;So;0;ON;;;;;N;;;;;
+1398;ETHIOPIC TONAL MARK DERET-HIDET;So;0;ON;;;;;N;;;;;
+1399;ETHIOPIC TONAL MARK KURT;So;0;ON;;;;;N;;;;;
+13A0;CHEROKEE LETTER A;Lu;0;L;;;;;N;;;;AB70;
+13A1;CHEROKEE LETTER E;Lu;0;L;;;;;N;;;;AB71;
+13A2;CHEROKEE LETTER I;Lu;0;L;;;;;N;;;;AB72;
+13A3;CHEROKEE LETTER O;Lu;0;L;;;;;N;;;;AB73;
+13A4;CHEROKEE LETTER U;Lu;0;L;;;;;N;;;;AB74;
+13A5;CHEROKEE LETTER V;Lu;0;L;;;;;N;;;;AB75;
+13A6;CHEROKEE LETTER GA;Lu;0;L;;;;;N;;;;AB76;
+13A7;CHEROKEE LETTER KA;Lu;0;L;;;;;N;;;;AB77;
+13A8;CHEROKEE LETTER GE;Lu;0;L;;;;;N;;;;AB78;
+13A9;CHEROKEE LETTER GI;Lu;0;L;;;;;N;;;;AB79;
+13AA;CHEROKEE LETTER GO;Lu;0;L;;;;;N;;;;AB7A;
+13AB;CHEROKEE LETTER GU;Lu;0;L;;;;;N;;;;AB7B;
+13AC;CHEROKEE LETTER GV;Lu;0;L;;;;;N;;;;AB7C;
+13AD;CHEROKEE LETTER HA;Lu;0;L;;;;;N;;;;AB7D;
+13AE;CHEROKEE LETTER HE;Lu;0;L;;;;;N;;;;AB7E;
+13AF;CHEROKEE LETTER HI;Lu;0;L;;;;;N;;;;AB7F;
+13B0;CHEROKEE LETTER HO;Lu;0;L;;;;;N;;;;AB80;
+13B1;CHEROKEE LETTER HU;Lu;0;L;;;;;N;;;;AB81;
+13B2;CHEROKEE LETTER HV;Lu;0;L;;;;;N;;;;AB82;
+13B3;CHEROKEE LETTER LA;Lu;0;L;;;;;N;;;;AB83;
+13B4;CHEROKEE LETTER LE;Lu;0;L;;;;;N;;;;AB84;
+13B5;CHEROKEE LETTER LI;Lu;0;L;;;;;N;;;;AB85;
+13B6;CHEROKEE LETTER LO;Lu;0;L;;;;;N;;;;AB86;
+13B7;CHEROKEE LETTER LU;Lu;0;L;;;;;N;;;;AB87;
+13B8;CHEROKEE LETTER LV;Lu;0;L;;;;;N;;;;AB88;
+13B9;CHEROKEE LETTER MA;Lu;0;L;;;;;N;;;;AB89;
+13BA;CHEROKEE LETTER ME;Lu;0;L;;;;;N;;;;AB8A;
+13BB;CHEROKEE LETTER MI;Lu;0;L;;;;;N;;;;AB8B;
+13BC;CHEROKEE LETTER MO;Lu;0;L;;;;;N;;;;AB8C;
+13BD;CHEROKEE LETTER MU;Lu;0;L;;;;;N;;;;AB8D;
+13BE;CHEROKEE LETTER NA;Lu;0;L;;;;;N;;;;AB8E;
+13BF;CHEROKEE LETTER HNA;Lu;0;L;;;;;N;;;;AB8F;
+13C0;CHEROKEE LETTER NAH;Lu;0;L;;;;;N;;;;AB90;
+13C1;CHEROKEE LETTER NE;Lu;0;L;;;;;N;;;;AB91;
+13C2;CHEROKEE LETTER NI;Lu;0;L;;;;;N;;;;AB92;
+13C3;CHEROKEE LETTER NO;Lu;0;L;;;;;N;;;;AB93;
+13C4;CHEROKEE LETTER NU;Lu;0;L;;;;;N;;;;AB94;
+13C5;CHEROKEE LETTER NV;Lu;0;L;;;;;N;;;;AB95;
+13C6;CHEROKEE LETTER QUA;Lu;0;L;;;;;N;;;;AB96;
+13C7;CHEROKEE LETTER QUE;Lu;0;L;;;;;N;;;;AB97;
+13C8;CHEROKEE LETTER QUI;Lu;0;L;;;;;N;;;;AB98;
+13C9;CHEROKEE LETTER QUO;Lu;0;L;;;;;N;;;;AB99;
+13CA;CHEROKEE LETTER QUU;Lu;0;L;;;;;N;;;;AB9A;
+13CB;CHEROKEE LETTER QUV;Lu;0;L;;;;;N;;;;AB9B;
+13CC;CHEROKEE LETTER SA;Lu;0;L;;;;;N;;;;AB9C;
+13CD;CHEROKEE LETTER S;Lu;0;L;;;;;N;;;;AB9D;
+13CE;CHEROKEE LETTER SE;Lu;0;L;;;;;N;;;;AB9E;
+13CF;CHEROKEE LETTER SI;Lu;0;L;;;;;N;;;;AB9F;
+13D0;CHEROKEE LETTER SO;Lu;0;L;;;;;N;;;;ABA0;
+13D1;CHEROKEE LETTER SU;Lu;0;L;;;;;N;;;;ABA1;
+13D2;CHEROKEE LETTER SV;Lu;0;L;;;;;N;;;;ABA2;
+13D3;CHEROKEE LETTER DA;Lu;0;L;;;;;N;;;;ABA3;
+13D4;CHEROKEE LETTER TA;Lu;0;L;;;;;N;;;;ABA4;
+13D5;CHEROKEE LETTER DE;Lu;0;L;;;;;N;;;;ABA5;
+13D6;CHEROKEE LETTER TE;Lu;0;L;;;;;N;;;;ABA6;
+13D7;CHEROKEE LETTER DI;Lu;0;L;;;;;N;;;;ABA7;
+13D8;CHEROKEE LETTER TI;Lu;0;L;;;;;N;;;;ABA8;
+13D9;CHEROKEE LETTER DO;Lu;0;L;;;;;N;;;;ABA9;
+13DA;CHEROKEE LETTER DU;Lu;0;L;;;;;N;;;;ABAA;
+13DB;CHEROKEE LETTER DV;Lu;0;L;;;;;N;;;;ABAB;
+13DC;CHEROKEE LETTER DLA;Lu;0;L;;;;;N;;;;ABAC;
+13DD;CHEROKEE LETTER TLA;Lu;0;L;;;;;N;;;;ABAD;
+13DE;CHEROKEE LETTER TLE;Lu;0;L;;;;;N;;;;ABAE;
+13DF;CHEROKEE LETTER TLI;Lu;0;L;;;;;N;;;;ABAF;
+13E0;CHEROKEE LETTER TLO;Lu;0;L;;;;;N;;;;ABB0;
+13E1;CHEROKEE LETTER TLU;Lu;0;L;;;;;N;;;;ABB1;
+13E2;CHEROKEE LETTER TLV;Lu;0;L;;;;;N;;;;ABB2;
+13E3;CHEROKEE LETTER TSA;Lu;0;L;;;;;N;;;;ABB3;
+13E4;CHEROKEE LETTER TSE;Lu;0;L;;;;;N;;;;ABB4;
+13E5;CHEROKEE LETTER TSI;Lu;0;L;;;;;N;;;;ABB5;
+13E6;CHEROKEE LETTER TSO;Lu;0;L;;;;;N;;;;ABB6;
+13E7;CHEROKEE LETTER TSU;Lu;0;L;;;;;N;;;;ABB7;
+13E8;CHEROKEE LETTER TSV;Lu;0;L;;;;;N;;;;ABB8;
+13E9;CHEROKEE LETTER WA;Lu;0;L;;;;;N;;;;ABB9;
+13EA;CHEROKEE LETTER WE;Lu;0;L;;;;;N;;;;ABBA;
+13EB;CHEROKEE LETTER WI;Lu;0;L;;;;;N;;;;ABBB;
+13EC;CHEROKEE LETTER WO;Lu;0;L;;;;;N;;;;ABBC;
+13ED;CHEROKEE LETTER WU;Lu;0;L;;;;;N;;;;ABBD;
+13EE;CHEROKEE LETTER WV;Lu;0;L;;;;;N;;;;ABBE;
+13EF;CHEROKEE LETTER YA;Lu;0;L;;;;;N;;;;ABBF;
+13F0;CHEROKEE LETTER YE;Lu;0;L;;;;;N;;;;13F8;
+13F1;CHEROKEE LETTER YI;Lu;0;L;;;;;N;;;;13F9;
+13F2;CHEROKEE LETTER YO;Lu;0;L;;;;;N;;;;13FA;
+13F3;CHEROKEE LETTER YU;Lu;0;L;;;;;N;;;;13FB;
+13F4;CHEROKEE LETTER YV;Lu;0;L;;;;;N;;;;13FC;
+13F5;CHEROKEE LETTER MV;Lu;0;L;;;;;N;;;;13FD;
+13F8;CHEROKEE SMALL LETTER YE;Ll;0;L;;;;;N;;;13F0;;13F0
+13F9;CHEROKEE SMALL LETTER YI;Ll;0;L;;;;;N;;;13F1;;13F1
+13FA;CHEROKEE SMALL LETTER YO;Ll;0;L;;;;;N;;;13F2;;13F2
+13FB;CHEROKEE SMALL LETTER YU;Ll;0;L;;;;;N;;;13F3;;13F3
+13FC;CHEROKEE SMALL LETTER YV;Ll;0;L;;;;;N;;;13F4;;13F4
+13FD;CHEROKEE SMALL LETTER MV;Ll;0;L;;;;;N;;;13F5;;13F5
+1400;CANADIAN SYLLABICS HYPHEN;Pd;0;ON;;;;;N;;;;;
+1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;;
+1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;;
+1403;CANADIAN SYLLABICS I;Lo;0;L;;;;;N;;;;;
+1404;CANADIAN SYLLABICS II;Lo;0;L;;;;;N;;;;;
+1405;CANADIAN SYLLABICS O;Lo;0;L;;;;;N;;;;;
+1406;CANADIAN SYLLABICS OO;Lo;0;L;;;;;N;;;;;
+1407;CANADIAN SYLLABICS Y-CREE OO;Lo;0;L;;;;;N;;;;;
+1408;CANADIAN SYLLABICS CARRIER EE;Lo;0;L;;;;;N;;;;;
+1409;CANADIAN SYLLABICS CARRIER I;Lo;0;L;;;;;N;;;;;
+140A;CANADIAN SYLLABICS A;Lo;0;L;;;;;N;;;;;
+140B;CANADIAN SYLLABICS AA;Lo;0;L;;;;;N;;;;;
+140C;CANADIAN SYLLABICS WE;Lo;0;L;;;;;N;;;;;
+140D;CANADIAN SYLLABICS WEST-CREE WE;Lo;0;L;;;;;N;;;;;
+140E;CANADIAN SYLLABICS WI;Lo;0;L;;;;;N;;;;;
+140F;CANADIAN SYLLABICS WEST-CREE WI;Lo;0;L;;;;;N;;;;;
+1410;CANADIAN SYLLABICS WII;Lo;0;L;;;;;N;;;;;
+1411;CANADIAN SYLLABICS WEST-CREE WII;Lo;0;L;;;;;N;;;;;
+1412;CANADIAN SYLLABICS WO;Lo;0;L;;;;;N;;;;;
+1413;CANADIAN SYLLABICS WEST-CREE WO;Lo;0;L;;;;;N;;;;;
+1414;CANADIAN SYLLABICS WOO;Lo;0;L;;;;;N;;;;;
+1415;CANADIAN SYLLABICS WEST-CREE WOO;Lo;0;L;;;;;N;;;;;
+1416;CANADIAN SYLLABICS NASKAPI WOO;Lo;0;L;;;;;N;;;;;
+1417;CANADIAN SYLLABICS WA;Lo;0;L;;;;;N;;;;;
+1418;CANADIAN SYLLABICS WEST-CREE WA;Lo;0;L;;;;;N;;;;;
+1419;CANADIAN SYLLABICS WAA;Lo;0;L;;;;;N;;;;;
+141A;CANADIAN SYLLABICS WEST-CREE WAA;Lo;0;L;;;;;N;;;;;
+141B;CANADIAN SYLLABICS NASKAPI WAA;Lo;0;L;;;;;N;;;;;
+141C;CANADIAN SYLLABICS AI;Lo;0;L;;;;;N;;;;;
+141D;CANADIAN SYLLABICS Y-CREE W;Lo;0;L;;;;;N;;;;;
+141E;CANADIAN SYLLABICS GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
+141F;CANADIAN SYLLABICS FINAL ACUTE;Lo;0;L;;;;;N;;;;;
+1420;CANADIAN SYLLABICS FINAL GRAVE;Lo;0;L;;;;;N;;;;;
+1421;CANADIAN SYLLABICS FINAL BOTTOM HALF RING;Lo;0;L;;;;;N;;;;;
+1422;CANADIAN SYLLABICS FINAL TOP HALF RING;Lo;0;L;;;;;N;;;;;
+1423;CANADIAN SYLLABICS FINAL RIGHT HALF RING;Lo;0;L;;;;;N;;;;;
+1424;CANADIAN SYLLABICS FINAL RING;Lo;0;L;;;;;N;;;;;
+1425;CANADIAN SYLLABICS FINAL DOUBLE ACUTE;Lo;0;L;;;;;N;;;;;
+1426;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES;Lo;0;L;;;;;N;;;;;
+1427;CANADIAN SYLLABICS FINAL MIDDLE DOT;Lo;0;L;;;;;N;;;;;
+1428;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE;Lo;0;L;;;;;N;;;;;
+1429;CANADIAN SYLLABICS FINAL PLUS;Lo;0;L;;;;;N;;;;;
+142A;CANADIAN SYLLABICS FINAL DOWN TACK;Lo;0;L;;;;;N;;;;;
+142B;CANADIAN SYLLABICS EN;Lo;0;L;;;;;N;;;;;
+142C;CANADIAN SYLLABICS IN;Lo;0;L;;;;;N;;;;;
+142D;CANADIAN SYLLABICS ON;Lo;0;L;;;;;N;;;;;
+142E;CANADIAN SYLLABICS AN;Lo;0;L;;;;;N;;;;;
+142F;CANADIAN SYLLABICS PE;Lo;0;L;;;;;N;;;;;
+1430;CANADIAN SYLLABICS PAAI;Lo;0;L;;;;;N;;;;;
+1431;CANADIAN SYLLABICS PI;Lo;0;L;;;;;N;;;;;
+1432;CANADIAN SYLLABICS PII;Lo;0;L;;;;;N;;;;;
+1433;CANADIAN SYLLABICS PO;Lo;0;L;;;;;N;;;;;
+1434;CANADIAN SYLLABICS POO;Lo;0;L;;;;;N;;;;;
+1435;CANADIAN SYLLABICS Y-CREE POO;Lo;0;L;;;;;N;;;;;
+1436;CANADIAN SYLLABICS CARRIER HEE;Lo;0;L;;;;;N;;;;;
+1437;CANADIAN SYLLABICS CARRIER HI;Lo;0;L;;;;;N;;;;;
+1438;CANADIAN SYLLABICS PA;Lo;0;L;;;;;N;;;;;
+1439;CANADIAN SYLLABICS PAA;Lo;0;L;;;;;N;;;;;
+143A;CANADIAN SYLLABICS PWE;Lo;0;L;;;;;N;;;;;
+143B;CANADIAN SYLLABICS WEST-CREE PWE;Lo;0;L;;;;;N;;;;;
+143C;CANADIAN SYLLABICS PWI;Lo;0;L;;;;;N;;;;;
+143D;CANADIAN SYLLABICS WEST-CREE PWI;Lo;0;L;;;;;N;;;;;
+143E;CANADIAN SYLLABICS PWII;Lo;0;L;;;;;N;;;;;
+143F;CANADIAN SYLLABICS WEST-CREE PWII;Lo;0;L;;;;;N;;;;;
+1440;CANADIAN SYLLABICS PWO;Lo;0;L;;;;;N;;;;;
+1441;CANADIAN SYLLABICS WEST-CREE PWO;Lo;0;L;;;;;N;;;;;
+1442;CANADIAN SYLLABICS PWOO;Lo;0;L;;;;;N;;;;;
+1443;CANADIAN SYLLABICS WEST-CREE PWOO;Lo;0;L;;;;;N;;;;;
+1444;CANADIAN SYLLABICS PWA;Lo;0;L;;;;;N;;;;;
+1445;CANADIAN SYLLABICS WEST-CREE PWA;Lo;0;L;;;;;N;;;;;
+1446;CANADIAN SYLLABICS PWAA;Lo;0;L;;;;;N;;;;;
+1447;CANADIAN SYLLABICS WEST-CREE PWAA;Lo;0;L;;;;;N;;;;;
+1448;CANADIAN SYLLABICS Y-CREE PWAA;Lo;0;L;;;;;N;;;;;
+1449;CANADIAN SYLLABICS P;Lo;0;L;;;;;N;;;;;
+144A;CANADIAN SYLLABICS WEST-CREE P;Lo;0;L;;;;;N;;;;;
+144B;CANADIAN SYLLABICS CARRIER H;Lo;0;L;;;;;N;;;;;
+144C;CANADIAN SYLLABICS TE;Lo;0;L;;;;;N;;;;;
+144D;CANADIAN SYLLABICS TAAI;Lo;0;L;;;;;N;;;;;
+144E;CANADIAN SYLLABICS TI;Lo;0;L;;;;;N;;;;;
+144F;CANADIAN SYLLABICS TII;Lo;0;L;;;;;N;;;;;
+1450;CANADIAN SYLLABICS TO;Lo;0;L;;;;;N;;;;;
+1451;CANADIAN SYLLABICS TOO;Lo;0;L;;;;;N;;;;;
+1452;CANADIAN SYLLABICS Y-CREE TOO;Lo;0;L;;;;;N;;;;;
+1453;CANADIAN SYLLABICS CARRIER DEE;Lo;0;L;;;;;N;;;;;
+1454;CANADIAN SYLLABICS CARRIER DI;Lo;0;L;;;;;N;;;;;
+1455;CANADIAN SYLLABICS TA;Lo;0;L;;;;;N;;;;;
+1456;CANADIAN SYLLABICS TAA;Lo;0;L;;;;;N;;;;;
+1457;CANADIAN SYLLABICS TWE;Lo;0;L;;;;;N;;;;;
+1458;CANADIAN SYLLABICS WEST-CREE TWE;Lo;0;L;;;;;N;;;;;
+1459;CANADIAN SYLLABICS TWI;Lo;0;L;;;;;N;;;;;
+145A;CANADIAN SYLLABICS WEST-CREE TWI;Lo;0;L;;;;;N;;;;;
+145B;CANADIAN SYLLABICS TWII;Lo;0;L;;;;;N;;;;;
+145C;CANADIAN SYLLABICS WEST-CREE TWII;Lo;0;L;;;;;N;;;;;
+145D;CANADIAN SYLLABICS TWO;Lo;0;L;;;;;N;;;;;
+145E;CANADIAN SYLLABICS WEST-CREE TWO;Lo;0;L;;;;;N;;;;;
+145F;CANADIAN SYLLABICS TWOO;Lo;0;L;;;;;N;;;;;
+1460;CANADIAN SYLLABICS WEST-CREE TWOO;Lo;0;L;;;;;N;;;;;
+1461;CANADIAN SYLLABICS TWA;Lo;0;L;;;;;N;;;;;
+1462;CANADIAN SYLLABICS WEST-CREE TWA;Lo;0;L;;;;;N;;;;;
+1463;CANADIAN SYLLABICS TWAA;Lo;0;L;;;;;N;;;;;
+1464;CANADIAN SYLLABICS WEST-CREE TWAA;Lo;0;L;;;;;N;;;;;
+1465;CANADIAN SYLLABICS NASKAPI TWAA;Lo;0;L;;;;;N;;;;;
+1466;CANADIAN SYLLABICS T;Lo;0;L;;;;;N;;;;;
+1467;CANADIAN SYLLABICS TTE;Lo;0;L;;;;;N;;;;;
+1468;CANADIAN SYLLABICS TTI;Lo;0;L;;;;;N;;;;;
+1469;CANADIAN SYLLABICS TTO;Lo;0;L;;;;;N;;;;;
+146A;CANADIAN SYLLABICS TTA;Lo;0;L;;;;;N;;;;;
+146B;CANADIAN SYLLABICS KE;Lo;0;L;;;;;N;;;;;
+146C;CANADIAN SYLLABICS KAAI;Lo;0;L;;;;;N;;;;;
+146D;CANADIAN SYLLABICS KI;Lo;0;L;;;;;N;;;;;
+146E;CANADIAN SYLLABICS KII;Lo;0;L;;;;;N;;;;;
+146F;CANADIAN SYLLABICS KO;Lo;0;L;;;;;N;;;;;
+1470;CANADIAN SYLLABICS KOO;Lo;0;L;;;;;N;;;;;
+1471;CANADIAN SYLLABICS Y-CREE KOO;Lo;0;L;;;;;N;;;;;
+1472;CANADIAN SYLLABICS KA;Lo;0;L;;;;;N;;;;;
+1473;CANADIAN SYLLABICS KAA;Lo;0;L;;;;;N;;;;;
+1474;CANADIAN SYLLABICS KWE;Lo;0;L;;;;;N;;;;;
+1475;CANADIAN SYLLABICS WEST-CREE KWE;Lo;0;L;;;;;N;;;;;
+1476;CANADIAN SYLLABICS KWI;Lo;0;L;;;;;N;;;;;
+1477;CANADIAN SYLLABICS WEST-CREE KWI;Lo;0;L;;;;;N;;;;;
+1478;CANADIAN SYLLABICS KWII;Lo;0;L;;;;;N;;;;;
+1479;CANADIAN SYLLABICS WEST-CREE KWII;Lo;0;L;;;;;N;;;;;
+147A;CANADIAN SYLLABICS KWO;Lo;0;L;;;;;N;;;;;
+147B;CANADIAN SYLLABICS WEST-CREE KWO;Lo;0;L;;;;;N;;;;;
+147C;CANADIAN SYLLABICS KWOO;Lo;0;L;;;;;N;;;;;
+147D;CANADIAN SYLLABICS WEST-CREE KWOO;Lo;0;L;;;;;N;;;;;
+147E;CANADIAN SYLLABICS KWA;Lo;0;L;;;;;N;;;;;
+147F;CANADIAN SYLLABICS WEST-CREE KWA;Lo;0;L;;;;;N;;;;;
+1480;CANADIAN SYLLABICS KWAA;Lo;0;L;;;;;N;;;;;
+1481;CANADIAN SYLLABICS WEST-CREE KWAA;Lo;0;L;;;;;N;;;;;
+1482;CANADIAN SYLLABICS NASKAPI KWAA;Lo;0;L;;;;;N;;;;;
+1483;CANADIAN SYLLABICS K;Lo;0;L;;;;;N;;;;;
+1484;CANADIAN SYLLABICS KW;Lo;0;L;;;;;N;;;;;
+1485;CANADIAN SYLLABICS SOUTH-SLAVEY KEH;Lo;0;L;;;;;N;;;;;
+1486;CANADIAN SYLLABICS SOUTH-SLAVEY KIH;Lo;0;L;;;;;N;;;;;
+1487;CANADIAN SYLLABICS SOUTH-SLAVEY KOH;Lo;0;L;;;;;N;;;;;
+1488;CANADIAN SYLLABICS SOUTH-SLAVEY KAH;Lo;0;L;;;;;N;;;;;
+1489;CANADIAN SYLLABICS CE;Lo;0;L;;;;;N;;;;;
+148A;CANADIAN SYLLABICS CAAI;Lo;0;L;;;;;N;;;;;
+148B;CANADIAN SYLLABICS CI;Lo;0;L;;;;;N;;;;;
+148C;CANADIAN SYLLABICS CII;Lo;0;L;;;;;N;;;;;
+148D;CANADIAN SYLLABICS CO;Lo;0;L;;;;;N;;;;;
+148E;CANADIAN SYLLABICS COO;Lo;0;L;;;;;N;;;;;
+148F;CANADIAN SYLLABICS Y-CREE COO;Lo;0;L;;;;;N;;;;;
+1490;CANADIAN SYLLABICS CA;Lo;0;L;;;;;N;;;;;
+1491;CANADIAN SYLLABICS CAA;Lo;0;L;;;;;N;;;;;
+1492;CANADIAN SYLLABICS CWE;Lo;0;L;;;;;N;;;;;
+1493;CANADIAN SYLLABICS WEST-CREE CWE;Lo;0;L;;;;;N;;;;;
+1494;CANADIAN SYLLABICS CWI;Lo;0;L;;;;;N;;;;;
+1495;CANADIAN SYLLABICS WEST-CREE CWI;Lo;0;L;;;;;N;;;;;
+1496;CANADIAN SYLLABICS CWII;Lo;0;L;;;;;N;;;;;
+1497;CANADIAN SYLLABICS WEST-CREE CWII;Lo;0;L;;;;;N;;;;;
+1498;CANADIAN SYLLABICS CWO;Lo;0;L;;;;;N;;;;;
+1499;CANADIAN SYLLABICS WEST-CREE CWO;Lo;0;L;;;;;N;;;;;
+149A;CANADIAN SYLLABICS CWOO;Lo;0;L;;;;;N;;;;;
+149B;CANADIAN SYLLABICS WEST-CREE CWOO;Lo;0;L;;;;;N;;;;;
+149C;CANADIAN SYLLABICS CWA;Lo;0;L;;;;;N;;;;;
+149D;CANADIAN SYLLABICS WEST-CREE CWA;Lo;0;L;;;;;N;;;;;
+149E;CANADIAN SYLLABICS CWAA;Lo;0;L;;;;;N;;;;;
+149F;CANADIAN SYLLABICS WEST-CREE CWAA;Lo;0;L;;;;;N;;;;;
+14A0;CANADIAN SYLLABICS NASKAPI CWAA;Lo;0;L;;;;;N;;;;;
+14A1;CANADIAN SYLLABICS C;Lo;0;L;;;;;N;;;;;
+14A2;CANADIAN SYLLABICS SAYISI TH;Lo;0;L;;;;;N;;;;;
+14A3;CANADIAN SYLLABICS ME;Lo;0;L;;;;;N;;;;;
+14A4;CANADIAN SYLLABICS MAAI;Lo;0;L;;;;;N;;;;;
+14A5;CANADIAN SYLLABICS MI;Lo;0;L;;;;;N;;;;;
+14A6;CANADIAN SYLLABICS MII;Lo;0;L;;;;;N;;;;;
+14A7;CANADIAN SYLLABICS MO;Lo;0;L;;;;;N;;;;;
+14A8;CANADIAN SYLLABICS MOO;Lo;0;L;;;;;N;;;;;
+14A9;CANADIAN SYLLABICS Y-CREE MOO;Lo;0;L;;;;;N;;;;;
+14AA;CANADIAN SYLLABICS MA;Lo;0;L;;;;;N;;;;;
+14AB;CANADIAN SYLLABICS MAA;Lo;0;L;;;;;N;;;;;
+14AC;CANADIAN SYLLABICS MWE;Lo;0;L;;;;;N;;;;;
+14AD;CANADIAN SYLLABICS WEST-CREE MWE;Lo;0;L;;;;;N;;;;;
+14AE;CANADIAN SYLLABICS MWI;Lo;0;L;;;;;N;;;;;
+14AF;CANADIAN SYLLABICS WEST-CREE MWI;Lo;0;L;;;;;N;;;;;
+14B0;CANADIAN SYLLABICS MWII;Lo;0;L;;;;;N;;;;;
+14B1;CANADIAN SYLLABICS WEST-CREE MWII;Lo;0;L;;;;;N;;;;;
+14B2;CANADIAN SYLLABICS MWO;Lo;0;L;;;;;N;;;;;
+14B3;CANADIAN SYLLABICS WEST-CREE MWO;Lo;0;L;;;;;N;;;;;
+14B4;CANADIAN SYLLABICS MWOO;Lo;0;L;;;;;N;;;;;
+14B5;CANADIAN SYLLABICS WEST-CREE MWOO;Lo;0;L;;;;;N;;;;;
+14B6;CANADIAN SYLLABICS MWA;Lo;0;L;;;;;N;;;;;
+14B7;CANADIAN SYLLABICS WEST-CREE MWA;Lo;0;L;;;;;N;;;;;
+14B8;CANADIAN SYLLABICS MWAA;Lo;0;L;;;;;N;;;;;
+14B9;CANADIAN SYLLABICS WEST-CREE MWAA;Lo;0;L;;;;;N;;;;;
+14BA;CANADIAN SYLLABICS NASKAPI MWAA;Lo;0;L;;;;;N;;;;;
+14BB;CANADIAN SYLLABICS M;Lo;0;L;;;;;N;;;;;
+14BC;CANADIAN SYLLABICS WEST-CREE M;Lo;0;L;;;;;N;;;;;
+14BD;CANADIAN SYLLABICS MH;Lo;0;L;;;;;N;;;;;
+14BE;CANADIAN SYLLABICS ATHAPASCAN M;Lo;0;L;;;;;N;;;;;
+14BF;CANADIAN SYLLABICS SAYISI M;Lo;0;L;;;;;N;;;;;
+14C0;CANADIAN SYLLABICS NE;Lo;0;L;;;;;N;;;;;
+14C1;CANADIAN SYLLABICS NAAI;Lo;0;L;;;;;N;;;;;
+14C2;CANADIAN SYLLABICS NI;Lo;0;L;;;;;N;;;;;
+14C3;CANADIAN SYLLABICS NII;Lo;0;L;;;;;N;;;;;
+14C4;CANADIAN SYLLABICS NO;Lo;0;L;;;;;N;;;;;
+14C5;CANADIAN SYLLABICS NOO;Lo;0;L;;;;;N;;;;;
+14C6;CANADIAN SYLLABICS Y-CREE NOO;Lo;0;L;;;;;N;;;;;
+14C7;CANADIAN SYLLABICS NA;Lo;0;L;;;;;N;;;;;
+14C8;CANADIAN SYLLABICS NAA;Lo;0;L;;;;;N;;;;;
+14C9;CANADIAN SYLLABICS NWE;Lo;0;L;;;;;N;;;;;
+14CA;CANADIAN SYLLABICS WEST-CREE NWE;Lo;0;L;;;;;N;;;;;
+14CB;CANADIAN SYLLABICS NWA;Lo;0;L;;;;;N;;;;;
+14CC;CANADIAN SYLLABICS WEST-CREE NWA;Lo;0;L;;;;;N;;;;;
+14CD;CANADIAN SYLLABICS NWAA;Lo;0;L;;;;;N;;;;;
+14CE;CANADIAN SYLLABICS WEST-CREE NWAA;Lo;0;L;;;;;N;;;;;
+14CF;CANADIAN SYLLABICS NASKAPI NWAA;Lo;0;L;;;;;N;;;;;
+14D0;CANADIAN SYLLABICS N;Lo;0;L;;;;;N;;;;;
+14D1;CANADIAN SYLLABICS CARRIER NG;Lo;0;L;;;;;N;;;;;
+14D2;CANADIAN SYLLABICS NH;Lo;0;L;;;;;N;;;;;
+14D3;CANADIAN SYLLABICS LE;Lo;0;L;;;;;N;;;;;
+14D4;CANADIAN SYLLABICS LAAI;Lo;0;L;;;;;N;;;;;
+14D5;CANADIAN SYLLABICS LI;Lo;0;L;;;;;N;;;;;
+14D6;CANADIAN SYLLABICS LII;Lo;0;L;;;;;N;;;;;
+14D7;CANADIAN SYLLABICS LO;Lo;0;L;;;;;N;;;;;
+14D8;CANADIAN SYLLABICS LOO;Lo;0;L;;;;;N;;;;;
+14D9;CANADIAN SYLLABICS Y-CREE LOO;Lo;0;L;;;;;N;;;;;
+14DA;CANADIAN SYLLABICS LA;Lo;0;L;;;;;N;;;;;
+14DB;CANADIAN SYLLABICS LAA;Lo;0;L;;;;;N;;;;;
+14DC;CANADIAN SYLLABICS LWE;Lo;0;L;;;;;N;;;;;
+14DD;CANADIAN SYLLABICS WEST-CREE LWE;Lo;0;L;;;;;N;;;;;
+14DE;CANADIAN SYLLABICS LWI;Lo;0;L;;;;;N;;;;;
+14DF;CANADIAN SYLLABICS WEST-CREE LWI;Lo;0;L;;;;;N;;;;;
+14E0;CANADIAN SYLLABICS LWII;Lo;0;L;;;;;N;;;;;
+14E1;CANADIAN SYLLABICS WEST-CREE LWII;Lo;0;L;;;;;N;;;;;
+14E2;CANADIAN SYLLABICS LWO;Lo;0;L;;;;;N;;;;;
+14E3;CANADIAN SYLLABICS WEST-CREE LWO;Lo;0;L;;;;;N;;;;;
+14E4;CANADIAN SYLLABICS LWOO;Lo;0;L;;;;;N;;;;;
+14E5;CANADIAN SYLLABICS WEST-CREE LWOO;Lo;0;L;;;;;N;;;;;
+14E6;CANADIAN SYLLABICS LWA;Lo;0;L;;;;;N;;;;;
+14E7;CANADIAN SYLLABICS WEST-CREE LWA;Lo;0;L;;;;;N;;;;;
+14E8;CANADIAN SYLLABICS LWAA;Lo;0;L;;;;;N;;;;;
+14E9;CANADIAN SYLLABICS WEST-CREE LWAA;Lo;0;L;;;;;N;;;;;
+14EA;CANADIAN SYLLABICS L;Lo;0;L;;;;;N;;;;;
+14EB;CANADIAN SYLLABICS WEST-CREE L;Lo;0;L;;;;;N;;;;;
+14EC;CANADIAN SYLLABICS MEDIAL L;Lo;0;L;;;;;N;;;;;
+14ED;CANADIAN SYLLABICS SE;Lo;0;L;;;;;N;;;;;
+14EE;CANADIAN SYLLABICS SAAI;Lo;0;L;;;;;N;;;;;
+14EF;CANADIAN SYLLABICS SI;Lo;0;L;;;;;N;;;;;
+14F0;CANADIAN SYLLABICS SII;Lo;0;L;;;;;N;;;;;
+14F1;CANADIAN SYLLABICS SO;Lo;0;L;;;;;N;;;;;
+14F2;CANADIAN SYLLABICS SOO;Lo;0;L;;;;;N;;;;;
+14F3;CANADIAN SYLLABICS Y-CREE SOO;Lo;0;L;;;;;N;;;;;
+14F4;CANADIAN SYLLABICS SA;Lo;0;L;;;;;N;;;;;
+14F5;CANADIAN SYLLABICS SAA;Lo;0;L;;;;;N;;;;;
+14F6;CANADIAN SYLLABICS SWE;Lo;0;L;;;;;N;;;;;
+14F7;CANADIAN SYLLABICS WEST-CREE SWE;Lo;0;L;;;;;N;;;;;
+14F8;CANADIAN SYLLABICS SWI;Lo;0;L;;;;;N;;;;;
+14F9;CANADIAN SYLLABICS WEST-CREE SWI;Lo;0;L;;;;;N;;;;;
+14FA;CANADIAN SYLLABICS SWII;Lo;0;L;;;;;N;;;;;
+14FB;CANADIAN SYLLABICS WEST-CREE SWII;Lo;0;L;;;;;N;;;;;
+14FC;CANADIAN SYLLABICS SWO;Lo;0;L;;;;;N;;;;;
+14FD;CANADIAN SYLLABICS WEST-CREE SWO;Lo;0;L;;;;;N;;;;;
+14FE;CANADIAN SYLLABICS SWOO;Lo;0;L;;;;;N;;;;;
+14FF;CANADIAN SYLLABICS WEST-CREE SWOO;Lo;0;L;;;;;N;;;;;
+1500;CANADIAN SYLLABICS SWA;Lo;0;L;;;;;N;;;;;
+1501;CANADIAN SYLLABICS WEST-CREE SWA;Lo;0;L;;;;;N;;;;;
+1502;CANADIAN SYLLABICS SWAA;Lo;0;L;;;;;N;;;;;
+1503;CANADIAN SYLLABICS WEST-CREE SWAA;Lo;0;L;;;;;N;;;;;
+1504;CANADIAN SYLLABICS NASKAPI SWAA;Lo;0;L;;;;;N;;;;;
+1505;CANADIAN SYLLABICS S;Lo;0;L;;;;;N;;;;;
+1506;CANADIAN SYLLABICS ATHAPASCAN S;Lo;0;L;;;;;N;;;;;
+1507;CANADIAN SYLLABICS SW;Lo;0;L;;;;;N;;;;;
+1508;CANADIAN SYLLABICS BLACKFOOT S;Lo;0;L;;;;;N;;;;;
+1509;CANADIAN SYLLABICS MOOSE-CREE SK;Lo;0;L;;;;;N;;;;;
+150A;CANADIAN SYLLABICS NASKAPI SKW;Lo;0;L;;;;;N;;;;;
+150B;CANADIAN SYLLABICS NASKAPI S-W;Lo;0;L;;;;;N;;;;;
+150C;CANADIAN SYLLABICS NASKAPI SPWA;Lo;0;L;;;;;N;;;;;
+150D;CANADIAN SYLLABICS NASKAPI STWA;Lo;0;L;;;;;N;;;;;
+150E;CANADIAN SYLLABICS NASKAPI SKWA;Lo;0;L;;;;;N;;;;;
+150F;CANADIAN SYLLABICS NASKAPI SCWA;Lo;0;L;;;;;N;;;;;
+1510;CANADIAN SYLLABICS SHE;Lo;0;L;;;;;N;;;;;
+1511;CANADIAN SYLLABICS SHI;Lo;0;L;;;;;N;;;;;
+1512;CANADIAN SYLLABICS SHII;Lo;0;L;;;;;N;;;;;
+1513;CANADIAN SYLLABICS SHO;Lo;0;L;;;;;N;;;;;
+1514;CANADIAN SYLLABICS SHOO;Lo;0;L;;;;;N;;;;;
+1515;CANADIAN SYLLABICS SHA;Lo;0;L;;;;;N;;;;;
+1516;CANADIAN SYLLABICS SHAA;Lo;0;L;;;;;N;;;;;
+1517;CANADIAN SYLLABICS SHWE;Lo;0;L;;;;;N;;;;;
+1518;CANADIAN SYLLABICS WEST-CREE SHWE;Lo;0;L;;;;;N;;;;;
+1519;CANADIAN SYLLABICS SHWI;Lo;0;L;;;;;N;;;;;
+151A;CANADIAN SYLLABICS WEST-CREE SHWI;Lo;0;L;;;;;N;;;;;
+151B;CANADIAN SYLLABICS SHWII;Lo;0;L;;;;;N;;;;;
+151C;CANADIAN SYLLABICS WEST-CREE SHWII;Lo;0;L;;;;;N;;;;;
+151D;CANADIAN SYLLABICS SHWO;Lo;0;L;;;;;N;;;;;
+151E;CANADIAN SYLLABICS WEST-CREE SHWO;Lo;0;L;;;;;N;;;;;
+151F;CANADIAN SYLLABICS SHWOO;Lo;0;L;;;;;N;;;;;
+1520;CANADIAN SYLLABICS WEST-CREE SHWOO;Lo;0;L;;;;;N;;;;;
+1521;CANADIAN SYLLABICS SHWA;Lo;0;L;;;;;N;;;;;
+1522;CANADIAN SYLLABICS WEST-CREE SHWA;Lo;0;L;;;;;N;;;;;
+1523;CANADIAN SYLLABICS SHWAA;Lo;0;L;;;;;N;;;;;
+1524;CANADIAN SYLLABICS WEST-CREE SHWAA;Lo;0;L;;;;;N;;;;;
+1525;CANADIAN SYLLABICS SH;Lo;0;L;;;;;N;;;;;
+1526;CANADIAN SYLLABICS YE;Lo;0;L;;;;;N;;;;;
+1527;CANADIAN SYLLABICS YAAI;Lo;0;L;;;;;N;;;;;
+1528;CANADIAN SYLLABICS YI;Lo;0;L;;;;;N;;;;;
+1529;CANADIAN SYLLABICS YII;Lo;0;L;;;;;N;;;;;
+152A;CANADIAN SYLLABICS YO;Lo;0;L;;;;;N;;;;;
+152B;CANADIAN SYLLABICS YOO;Lo;0;L;;;;;N;;;;;
+152C;CANADIAN SYLLABICS Y-CREE YOO;Lo;0;L;;;;;N;;;;;
+152D;CANADIAN SYLLABICS YA;Lo;0;L;;;;;N;;;;;
+152E;CANADIAN SYLLABICS YAA;Lo;0;L;;;;;N;;;;;
+152F;CANADIAN SYLLABICS YWE;Lo;0;L;;;;;N;;;;;
+1530;CANADIAN SYLLABICS WEST-CREE YWE;Lo;0;L;;;;;N;;;;;
+1531;CANADIAN SYLLABICS YWI;Lo;0;L;;;;;N;;;;;
+1532;CANADIAN SYLLABICS WEST-CREE YWI;Lo;0;L;;;;;N;;;;;
+1533;CANADIAN SYLLABICS YWII;Lo;0;L;;;;;N;;;;;
+1534;CANADIAN SYLLABICS WEST-CREE YWII;Lo;0;L;;;;;N;;;;;
+1535;CANADIAN SYLLABICS YWO;Lo;0;L;;;;;N;;;;;
+1536;CANADIAN SYLLABICS WEST-CREE YWO;Lo;0;L;;;;;N;;;;;
+1537;CANADIAN SYLLABICS YWOO;Lo;0;L;;;;;N;;;;;
+1538;CANADIAN SYLLABICS WEST-CREE YWOO;Lo;0;L;;;;;N;;;;;
+1539;CANADIAN SYLLABICS YWA;Lo;0;L;;;;;N;;;;;
+153A;CANADIAN SYLLABICS WEST-CREE YWA;Lo;0;L;;;;;N;;;;;
+153B;CANADIAN SYLLABICS YWAA;Lo;0;L;;;;;N;;;;;
+153C;CANADIAN SYLLABICS WEST-CREE YWAA;Lo;0;L;;;;;N;;;;;
+153D;CANADIAN SYLLABICS NASKAPI YWAA;Lo;0;L;;;;;N;;;;;
+153E;CANADIAN SYLLABICS Y;Lo;0;L;;;;;N;;;;;
+153F;CANADIAN SYLLABICS BIBLE-CREE Y;Lo;0;L;;;;;N;;;;;
+1540;CANADIAN SYLLABICS WEST-CREE Y;Lo;0;L;;;;;N;;;;;
+1541;CANADIAN SYLLABICS SAYISI YI;Lo;0;L;;;;;N;;;;;
+1542;CANADIAN SYLLABICS RE;Lo;0;L;;;;;N;;;;;
+1543;CANADIAN SYLLABICS R-CREE RE;Lo;0;L;;;;;N;;;;;
+1544;CANADIAN SYLLABICS WEST-CREE LE;Lo;0;L;;;;;N;;;;;
+1545;CANADIAN SYLLABICS RAAI;Lo;0;L;;;;;N;;;;;
+1546;CANADIAN SYLLABICS RI;Lo;0;L;;;;;N;;;;;
+1547;CANADIAN SYLLABICS RII;Lo;0;L;;;;;N;;;;;
+1548;CANADIAN SYLLABICS RO;Lo;0;L;;;;;N;;;;;
+1549;CANADIAN SYLLABICS ROO;Lo;0;L;;;;;N;;;;;
+154A;CANADIAN SYLLABICS WEST-CREE LO;Lo;0;L;;;;;N;;;;;
+154B;CANADIAN SYLLABICS RA;Lo;0;L;;;;;N;;;;;
+154C;CANADIAN SYLLABICS RAA;Lo;0;L;;;;;N;;;;;
+154D;CANADIAN SYLLABICS WEST-CREE LA;Lo;0;L;;;;;N;;;;;
+154E;CANADIAN SYLLABICS RWAA;Lo;0;L;;;;;N;;;;;
+154F;CANADIAN SYLLABICS WEST-CREE RWAA;Lo;0;L;;;;;N;;;;;
+1550;CANADIAN SYLLABICS R;Lo;0;L;;;;;N;;;;;
+1551;CANADIAN SYLLABICS WEST-CREE R;Lo;0;L;;;;;N;;;;;
+1552;CANADIAN SYLLABICS MEDIAL R;Lo;0;L;;;;;N;;;;;
+1553;CANADIAN SYLLABICS FE;Lo;0;L;;;;;N;;;;;
+1554;CANADIAN SYLLABICS FAAI;Lo;0;L;;;;;N;;;;;
+1555;CANADIAN SYLLABICS FI;Lo;0;L;;;;;N;;;;;
+1556;CANADIAN SYLLABICS FII;Lo;0;L;;;;;N;;;;;
+1557;CANADIAN SYLLABICS FO;Lo;0;L;;;;;N;;;;;
+1558;CANADIAN SYLLABICS FOO;Lo;0;L;;;;;N;;;;;
+1559;CANADIAN SYLLABICS FA;Lo;0;L;;;;;N;;;;;
+155A;CANADIAN SYLLABICS FAA;Lo;0;L;;;;;N;;;;;
+155B;CANADIAN SYLLABICS FWAA;Lo;0;L;;;;;N;;;;;
+155C;CANADIAN SYLLABICS WEST-CREE FWAA;Lo;0;L;;;;;N;;;;;
+155D;CANADIAN SYLLABICS F;Lo;0;L;;;;;N;;;;;
+155E;CANADIAN SYLLABICS THE;Lo;0;L;;;;;N;;;;;
+155F;CANADIAN SYLLABICS N-CREE THE;Lo;0;L;;;;;N;;;;;
+1560;CANADIAN SYLLABICS THI;Lo;0;L;;;;;N;;;;;
+1561;CANADIAN SYLLABICS N-CREE THI;Lo;0;L;;;;;N;;;;;
+1562;CANADIAN SYLLABICS THII;Lo;0;L;;;;;N;;;;;
+1563;CANADIAN SYLLABICS N-CREE THII;Lo;0;L;;;;;N;;;;;
+1564;CANADIAN SYLLABICS THO;Lo;0;L;;;;;N;;;;;
+1565;CANADIAN SYLLABICS THOO;Lo;0;L;;;;;N;;;;;
+1566;CANADIAN SYLLABICS THA;Lo;0;L;;;;;N;;;;;
+1567;CANADIAN SYLLABICS THAA;Lo;0;L;;;;;N;;;;;
+1568;CANADIAN SYLLABICS THWAA;Lo;0;L;;;;;N;;;;;
+1569;CANADIAN SYLLABICS WEST-CREE THWAA;Lo;0;L;;;;;N;;;;;
+156A;CANADIAN SYLLABICS TH;Lo;0;L;;;;;N;;;;;
+156B;CANADIAN SYLLABICS TTHE;Lo;0;L;;;;;N;;;;;
+156C;CANADIAN SYLLABICS TTHI;Lo;0;L;;;;;N;;;;;
+156D;CANADIAN SYLLABICS TTHO;Lo;0;L;;;;;N;;;;;
+156E;CANADIAN SYLLABICS TTHA;Lo;0;L;;;;;N;;;;;
+156F;CANADIAN SYLLABICS TTH;Lo;0;L;;;;;N;;;;;
+1570;CANADIAN SYLLABICS TYE;Lo;0;L;;;;;N;;;;;
+1571;CANADIAN SYLLABICS TYI;Lo;0;L;;;;;N;;;;;
+1572;CANADIAN SYLLABICS TYO;Lo;0;L;;;;;N;;;;;
+1573;CANADIAN SYLLABICS TYA;Lo;0;L;;;;;N;;;;;
+1574;CANADIAN SYLLABICS NUNAVIK HE;Lo;0;L;;;;;N;;;;;
+1575;CANADIAN SYLLABICS NUNAVIK HI;Lo;0;L;;;;;N;;;;;
+1576;CANADIAN SYLLABICS NUNAVIK HII;Lo;0;L;;;;;N;;;;;
+1577;CANADIAN SYLLABICS NUNAVIK HO;Lo;0;L;;;;;N;;;;;
+1578;CANADIAN SYLLABICS NUNAVIK HOO;Lo;0;L;;;;;N;;;;;
+1579;CANADIAN SYLLABICS NUNAVIK HA;Lo;0;L;;;;;N;;;;;
+157A;CANADIAN SYLLABICS NUNAVIK HAA;Lo;0;L;;;;;N;;;;;
+157B;CANADIAN SYLLABICS NUNAVIK H;Lo;0;L;;;;;N;;;;;
+157C;CANADIAN SYLLABICS NUNAVUT H;Lo;0;L;;;;;N;;;;;
+157D;CANADIAN SYLLABICS HK;Lo;0;L;;;;;N;;;;;
+157E;CANADIAN SYLLABICS QAAI;Lo;0;L;;;;;N;;;;;
+157F;CANADIAN SYLLABICS QI;Lo;0;L;;;;;N;;;;;
+1580;CANADIAN SYLLABICS QII;Lo;0;L;;;;;N;;;;;
+1581;CANADIAN SYLLABICS QO;Lo;0;L;;;;;N;;;;;
+1582;CANADIAN SYLLABICS QOO;Lo;0;L;;;;;N;;;;;
+1583;CANADIAN SYLLABICS QA;Lo;0;L;;;;;N;;;;;
+1584;CANADIAN SYLLABICS QAA;Lo;0;L;;;;;N;;;;;
+1585;CANADIAN SYLLABICS Q;Lo;0;L;;;;;N;;;;;
+1586;CANADIAN SYLLABICS TLHE;Lo;0;L;;;;;N;;;;;
+1587;CANADIAN SYLLABICS TLHI;Lo;0;L;;;;;N;;;;;
+1588;CANADIAN SYLLABICS TLHO;Lo;0;L;;;;;N;;;;;
+1589;CANADIAN SYLLABICS TLHA;Lo;0;L;;;;;N;;;;;
+158A;CANADIAN SYLLABICS WEST-CREE RE;Lo;0;L;;;;;N;;;;;
+158B;CANADIAN SYLLABICS WEST-CREE RI;Lo;0;L;;;;;N;;;;;
+158C;CANADIAN SYLLABICS WEST-CREE RO;Lo;0;L;;;;;N;;;;;
+158D;CANADIAN SYLLABICS WEST-CREE RA;Lo;0;L;;;;;N;;;;;
+158E;CANADIAN SYLLABICS NGAAI;Lo;0;L;;;;;N;;;;;
+158F;CANADIAN SYLLABICS NGI;Lo;0;L;;;;;N;;;;;
+1590;CANADIAN SYLLABICS NGII;Lo;0;L;;;;;N;;;;;
+1591;CANADIAN SYLLABICS NGO;Lo;0;L;;;;;N;;;;;
+1592;CANADIAN SYLLABICS NGOO;Lo;0;L;;;;;N;;;;;
+1593;CANADIAN SYLLABICS NGA;Lo;0;L;;;;;N;;;;;
+1594;CANADIAN SYLLABICS NGAA;Lo;0;L;;;;;N;;;;;
+1595;CANADIAN SYLLABICS NG;Lo;0;L;;;;;N;;;;;
+1596;CANADIAN SYLLABICS NNG;Lo;0;L;;;;;N;;;;;
+1597;CANADIAN SYLLABICS SAYISI SHE;Lo;0;L;;;;;N;;;;;
+1598;CANADIAN SYLLABICS SAYISI SHI;Lo;0;L;;;;;N;;;;;
+1599;CANADIAN SYLLABICS SAYISI SHO;Lo;0;L;;;;;N;;;;;
+159A;CANADIAN SYLLABICS SAYISI SHA;Lo;0;L;;;;;N;;;;;
+159B;CANADIAN SYLLABICS WOODS-CREE THE;Lo;0;L;;;;;N;;;;;
+159C;CANADIAN SYLLABICS WOODS-CREE THI;Lo;0;L;;;;;N;;;;;
+159D;CANADIAN SYLLABICS WOODS-CREE THO;Lo;0;L;;;;;N;;;;;
+159E;CANADIAN SYLLABICS WOODS-CREE THA;Lo;0;L;;;;;N;;;;;
+159F;CANADIAN SYLLABICS WOODS-CREE TH;Lo;0;L;;;;;N;;;;;
+15A0;CANADIAN SYLLABICS LHI;Lo;0;L;;;;;N;;;;;
+15A1;CANADIAN SYLLABICS LHII;Lo;0;L;;;;;N;;;;;
+15A2;CANADIAN SYLLABICS LHO;Lo;0;L;;;;;N;;;;;
+15A3;CANADIAN SYLLABICS LHOO;Lo;0;L;;;;;N;;;;;
+15A4;CANADIAN SYLLABICS LHA;Lo;0;L;;;;;N;;;;;
+15A5;CANADIAN SYLLABICS LHAA;Lo;0;L;;;;;N;;;;;
+15A6;CANADIAN SYLLABICS LH;Lo;0;L;;;;;N;;;;;
+15A7;CANADIAN SYLLABICS TH-CREE THE;Lo;0;L;;;;;N;;;;;
+15A8;CANADIAN SYLLABICS TH-CREE THI;Lo;0;L;;;;;N;;;;;
+15A9;CANADIAN SYLLABICS TH-CREE THII;Lo;0;L;;;;;N;;;;;
+15AA;CANADIAN SYLLABICS TH-CREE THO;Lo;0;L;;;;;N;;;;;
+15AB;CANADIAN SYLLABICS TH-CREE THOO;Lo;0;L;;;;;N;;;;;
+15AC;CANADIAN SYLLABICS TH-CREE THA;Lo;0;L;;;;;N;;;;;
+15AD;CANADIAN SYLLABICS TH-CREE THAA;Lo;0;L;;;;;N;;;;;
+15AE;CANADIAN SYLLABICS TH-CREE TH;Lo;0;L;;;;;N;;;;;
+15AF;CANADIAN SYLLABICS AIVILIK B;Lo;0;L;;;;;N;;;;;
+15B0;CANADIAN SYLLABICS BLACKFOOT E;Lo;0;L;;;;;N;;;;;
+15B1;CANADIAN SYLLABICS BLACKFOOT I;Lo;0;L;;;;;N;;;;;
+15B2;CANADIAN SYLLABICS BLACKFOOT O;Lo;0;L;;;;;N;;;;;
+15B3;CANADIAN SYLLABICS BLACKFOOT A;Lo;0;L;;;;;N;;;;;
+15B4;CANADIAN SYLLABICS BLACKFOOT WE;Lo;0;L;;;;;N;;;;;
+15B5;CANADIAN SYLLABICS BLACKFOOT WI;Lo;0;L;;;;;N;;;;;
+15B6;CANADIAN SYLLABICS BLACKFOOT WO;Lo;0;L;;;;;N;;;;;
+15B7;CANADIAN SYLLABICS BLACKFOOT WA;Lo;0;L;;;;;N;;;;;
+15B8;CANADIAN SYLLABICS BLACKFOOT NE;Lo;0;L;;;;;N;;;;;
+15B9;CANADIAN SYLLABICS BLACKFOOT NI;Lo;0;L;;;;;N;;;;;
+15BA;CANADIAN SYLLABICS BLACKFOOT NO;Lo;0;L;;;;;N;;;;;
+15BB;CANADIAN SYLLABICS BLACKFOOT NA;Lo;0;L;;;;;N;;;;;
+15BC;CANADIAN SYLLABICS BLACKFOOT KE;Lo;0;L;;;;;N;;;;;
+15BD;CANADIAN SYLLABICS BLACKFOOT KI;Lo;0;L;;;;;N;;;;;
+15BE;CANADIAN SYLLABICS BLACKFOOT KO;Lo;0;L;;;;;N;;;;;
+15BF;CANADIAN SYLLABICS BLACKFOOT KA;Lo;0;L;;;;;N;;;;;
+15C0;CANADIAN SYLLABICS SAYISI HE;Lo;0;L;;;;;N;;;;;
+15C1;CANADIAN SYLLABICS SAYISI HI;Lo;0;L;;;;;N;;;;;
+15C2;CANADIAN SYLLABICS SAYISI HO;Lo;0;L;;;;;N;;;;;
+15C3;CANADIAN SYLLABICS SAYISI HA;Lo;0;L;;;;;N;;;;;
+15C4;CANADIAN SYLLABICS CARRIER GHU;Lo;0;L;;;;;N;;;;;
+15C5;CANADIAN SYLLABICS CARRIER GHO;Lo;0;L;;;;;N;;;;;
+15C6;CANADIAN SYLLABICS CARRIER GHE;Lo;0;L;;;;;N;;;;;
+15C7;CANADIAN SYLLABICS CARRIER GHEE;Lo;0;L;;;;;N;;;;;
+15C8;CANADIAN SYLLABICS CARRIER GHI;Lo;0;L;;;;;N;;;;;
+15C9;CANADIAN SYLLABICS CARRIER GHA;Lo;0;L;;;;;N;;;;;
+15CA;CANADIAN SYLLABICS CARRIER RU;Lo;0;L;;;;;N;;;;;
+15CB;CANADIAN SYLLABICS CARRIER RO;Lo;0;L;;;;;N;;;;;
+15CC;CANADIAN SYLLABICS CARRIER RE;Lo;0;L;;;;;N;;;;;
+15CD;CANADIAN SYLLABICS CARRIER REE;Lo;0;L;;;;;N;;;;;
+15CE;CANADIAN SYLLABICS CARRIER RI;Lo;0;L;;;;;N;;;;;
+15CF;CANADIAN SYLLABICS CARRIER RA;Lo;0;L;;;;;N;;;;;
+15D0;CANADIAN SYLLABICS CARRIER WU;Lo;0;L;;;;;N;;;;;
+15D1;CANADIAN SYLLABICS CARRIER WO;Lo;0;L;;;;;N;;;;;
+15D2;CANADIAN SYLLABICS CARRIER WE;Lo;0;L;;;;;N;;;;;
+15D3;CANADIAN SYLLABICS CARRIER WEE;Lo;0;L;;;;;N;;;;;
+15D4;CANADIAN SYLLABICS CARRIER WI;Lo;0;L;;;;;N;;;;;
+15D5;CANADIAN SYLLABICS CARRIER WA;Lo;0;L;;;;;N;;;;;
+15D6;CANADIAN SYLLABICS CARRIER HWU;Lo;0;L;;;;;N;;;;;
+15D7;CANADIAN SYLLABICS CARRIER HWO;Lo;0;L;;;;;N;;;;;
+15D8;CANADIAN SYLLABICS CARRIER HWE;Lo;0;L;;;;;N;;;;;
+15D9;CANADIAN SYLLABICS CARRIER HWEE;Lo;0;L;;;;;N;;;;;
+15DA;CANADIAN SYLLABICS CARRIER HWI;Lo;0;L;;;;;N;;;;;
+15DB;CANADIAN SYLLABICS CARRIER HWA;Lo;0;L;;;;;N;;;;;
+15DC;CANADIAN SYLLABICS CARRIER THU;Lo;0;L;;;;;N;;;;;
+15DD;CANADIAN SYLLABICS CARRIER THO;Lo;0;L;;;;;N;;;;;
+15DE;CANADIAN SYLLABICS CARRIER THE;Lo;0;L;;;;;N;;;;;
+15DF;CANADIAN SYLLABICS CARRIER THEE;Lo;0;L;;;;;N;;;;;
+15E0;CANADIAN SYLLABICS CARRIER THI;Lo;0;L;;;;;N;;;;;
+15E1;CANADIAN SYLLABICS CARRIER THA;Lo;0;L;;;;;N;;;;;
+15E2;CANADIAN SYLLABICS CARRIER TTU;Lo;0;L;;;;;N;;;;;
+15E3;CANADIAN SYLLABICS CARRIER TTO;Lo;0;L;;;;;N;;;;;
+15E4;CANADIAN SYLLABICS CARRIER TTE;Lo;0;L;;;;;N;;;;;
+15E5;CANADIAN SYLLABICS CARRIER TTEE;Lo;0;L;;;;;N;;;;;
+15E6;CANADIAN SYLLABICS CARRIER TTI;Lo;0;L;;;;;N;;;;;
+15E7;CANADIAN SYLLABICS CARRIER TTA;Lo;0;L;;;;;N;;;;;
+15E8;CANADIAN SYLLABICS CARRIER PU;Lo;0;L;;;;;N;;;;;
+15E9;CANADIAN SYLLABICS CARRIER PO;Lo;0;L;;;;;N;;;;;
+15EA;CANADIAN SYLLABICS CARRIER PE;Lo;0;L;;;;;N;;;;;
+15EB;CANADIAN SYLLABICS CARRIER PEE;Lo;0;L;;;;;N;;;;;
+15EC;CANADIAN SYLLABICS CARRIER PI;Lo;0;L;;;;;N;;;;;
+15ED;CANADIAN SYLLABICS CARRIER PA;Lo;0;L;;;;;N;;;;;
+15EE;CANADIAN SYLLABICS CARRIER P;Lo;0;L;;;;;N;;;;;
+15EF;CANADIAN SYLLABICS CARRIER GU;Lo;0;L;;;;;N;;;;;
+15F0;CANADIAN SYLLABICS CARRIER GO;Lo;0;L;;;;;N;;;;;
+15F1;CANADIAN SYLLABICS CARRIER GE;Lo;0;L;;;;;N;;;;;
+15F2;CANADIAN SYLLABICS CARRIER GEE;Lo;0;L;;;;;N;;;;;
+15F3;CANADIAN SYLLABICS CARRIER GI;Lo;0;L;;;;;N;;;;;
+15F4;CANADIAN SYLLABICS CARRIER GA;Lo;0;L;;;;;N;;;;;
+15F5;CANADIAN SYLLABICS CARRIER KHU;Lo;0;L;;;;;N;;;;;
+15F6;CANADIAN SYLLABICS CARRIER KHO;Lo;0;L;;;;;N;;;;;
+15F7;CANADIAN SYLLABICS CARRIER KHE;Lo;0;L;;;;;N;;;;;
+15F8;CANADIAN SYLLABICS CARRIER KHEE;Lo;0;L;;;;;N;;;;;
+15F9;CANADIAN SYLLABICS CARRIER KHI;Lo;0;L;;;;;N;;;;;
+15FA;CANADIAN SYLLABICS CARRIER KHA;Lo;0;L;;;;;N;;;;;
+15FB;CANADIAN SYLLABICS CARRIER KKU;Lo;0;L;;;;;N;;;;;
+15FC;CANADIAN SYLLABICS CARRIER KKO;Lo;0;L;;;;;N;;;;;
+15FD;CANADIAN SYLLABICS CARRIER KKE;Lo;0;L;;;;;N;;;;;
+15FE;CANADIAN SYLLABICS CARRIER KKEE;Lo;0;L;;;;;N;;;;;
+15FF;CANADIAN SYLLABICS CARRIER KKI;Lo;0;L;;;;;N;;;;;
+1600;CANADIAN SYLLABICS CARRIER KKA;Lo;0;L;;;;;N;;;;;
+1601;CANADIAN SYLLABICS CARRIER KK;Lo;0;L;;;;;N;;;;;
+1602;CANADIAN SYLLABICS CARRIER NU;Lo;0;L;;;;;N;;;;;
+1603;CANADIAN SYLLABICS CARRIER NO;Lo;0;L;;;;;N;;;;;
+1604;CANADIAN SYLLABICS CARRIER NE;Lo;0;L;;;;;N;;;;;
+1605;CANADIAN SYLLABICS CARRIER NEE;Lo;0;L;;;;;N;;;;;
+1606;CANADIAN SYLLABICS CARRIER NI;Lo;0;L;;;;;N;;;;;
+1607;CANADIAN SYLLABICS CARRIER NA;Lo;0;L;;;;;N;;;;;
+1608;CANADIAN SYLLABICS CARRIER MU;Lo;0;L;;;;;N;;;;;
+1609;CANADIAN SYLLABICS CARRIER MO;Lo;0;L;;;;;N;;;;;
+160A;CANADIAN SYLLABICS CARRIER ME;Lo;0;L;;;;;N;;;;;
+160B;CANADIAN SYLLABICS CARRIER MEE;Lo;0;L;;;;;N;;;;;
+160C;CANADIAN SYLLABICS CARRIER MI;Lo;0;L;;;;;N;;;;;
+160D;CANADIAN SYLLABICS CARRIER MA;Lo;0;L;;;;;N;;;;;
+160E;CANADIAN SYLLABICS CARRIER YU;Lo;0;L;;;;;N;;;;;
+160F;CANADIAN SYLLABICS CARRIER YO;Lo;0;L;;;;;N;;;;;
+1610;CANADIAN SYLLABICS CARRIER YE;Lo;0;L;;;;;N;;;;;
+1611;CANADIAN SYLLABICS CARRIER YEE;Lo;0;L;;;;;N;;;;;
+1612;CANADIAN SYLLABICS CARRIER YI;Lo;0;L;;;;;N;;;;;
+1613;CANADIAN SYLLABICS CARRIER YA;Lo;0;L;;;;;N;;;;;
+1614;CANADIAN SYLLABICS CARRIER JU;Lo;0;L;;;;;N;;;;;
+1615;CANADIAN SYLLABICS SAYISI JU;Lo;0;L;;;;;N;;;;;
+1616;CANADIAN SYLLABICS CARRIER JO;Lo;0;L;;;;;N;;;;;
+1617;CANADIAN SYLLABICS CARRIER JE;Lo;0;L;;;;;N;;;;;
+1618;CANADIAN SYLLABICS CARRIER JEE;Lo;0;L;;;;;N;;;;;
+1619;CANADIAN SYLLABICS CARRIER JI;Lo;0;L;;;;;N;;;;;
+161A;CANADIAN SYLLABICS SAYISI JI;Lo;0;L;;;;;N;;;;;
+161B;CANADIAN SYLLABICS CARRIER JA;Lo;0;L;;;;;N;;;;;
+161C;CANADIAN SYLLABICS CARRIER JJU;Lo;0;L;;;;;N;;;;;
+161D;CANADIAN SYLLABICS CARRIER JJO;Lo;0;L;;;;;N;;;;;
+161E;CANADIAN SYLLABICS CARRIER JJE;Lo;0;L;;;;;N;;;;;
+161F;CANADIAN SYLLABICS CARRIER JJEE;Lo;0;L;;;;;N;;;;;
+1620;CANADIAN SYLLABICS CARRIER JJI;Lo;0;L;;;;;N;;;;;
+1621;CANADIAN SYLLABICS CARRIER JJA;Lo;0;L;;;;;N;;;;;
+1622;CANADIAN SYLLABICS CARRIER LU;Lo;0;L;;;;;N;;;;;
+1623;CANADIAN SYLLABICS CARRIER LO;Lo;0;L;;;;;N;;;;;
+1624;CANADIAN SYLLABICS CARRIER LE;Lo;0;L;;;;;N;;;;;
+1625;CANADIAN SYLLABICS CARRIER LEE;Lo;0;L;;;;;N;;;;;
+1626;CANADIAN SYLLABICS CARRIER LI;Lo;0;L;;;;;N;;;;;
+1627;CANADIAN SYLLABICS CARRIER LA;Lo;0;L;;;;;N;;;;;
+1628;CANADIAN SYLLABICS CARRIER DLU;Lo;0;L;;;;;N;;;;;
+1629;CANADIAN SYLLABICS CARRIER DLO;Lo;0;L;;;;;N;;;;;
+162A;CANADIAN SYLLABICS CARRIER DLE;Lo;0;L;;;;;N;;;;;
+162B;CANADIAN SYLLABICS CARRIER DLEE;Lo;0;L;;;;;N;;;;;
+162C;CANADIAN SYLLABICS CARRIER DLI;Lo;0;L;;;;;N;;;;;
+162D;CANADIAN SYLLABICS CARRIER DLA;Lo;0;L;;;;;N;;;;;
+162E;CANADIAN SYLLABICS CARRIER LHU;Lo;0;L;;;;;N;;;;;
+162F;CANADIAN SYLLABICS CARRIER LHO;Lo;0;L;;;;;N;;;;;
+1630;CANADIAN SYLLABICS CARRIER LHE;Lo;0;L;;;;;N;;;;;
+1631;CANADIAN SYLLABICS CARRIER LHEE;Lo;0;L;;;;;N;;;;;
+1632;CANADIAN SYLLABICS CARRIER LHI;Lo;0;L;;;;;N;;;;;
+1633;CANADIAN SYLLABICS CARRIER LHA;Lo;0;L;;;;;N;;;;;
+1634;CANADIAN SYLLABICS CARRIER TLHU;Lo;0;L;;;;;N;;;;;
+1635;CANADIAN SYLLABICS CARRIER TLHO;Lo;0;L;;;;;N;;;;;
+1636;CANADIAN SYLLABICS CARRIER TLHE;Lo;0;L;;;;;N;;;;;
+1637;CANADIAN SYLLABICS CARRIER TLHEE;Lo;0;L;;;;;N;;;;;
+1638;CANADIAN SYLLABICS CARRIER TLHI;Lo;0;L;;;;;N;;;;;
+1639;CANADIAN SYLLABICS CARRIER TLHA;Lo;0;L;;;;;N;;;;;
+163A;CANADIAN SYLLABICS CARRIER TLU;Lo;0;L;;;;;N;;;;;
+163B;CANADIAN SYLLABICS CARRIER TLO;Lo;0;L;;;;;N;;;;;
+163C;CANADIAN SYLLABICS CARRIER TLE;Lo;0;L;;;;;N;;;;;
+163D;CANADIAN SYLLABICS CARRIER TLEE;Lo;0;L;;;;;N;;;;;
+163E;CANADIAN SYLLABICS CARRIER TLI;Lo;0;L;;;;;N;;;;;
+163F;CANADIAN SYLLABICS CARRIER TLA;Lo;0;L;;;;;N;;;;;
+1640;CANADIAN SYLLABICS CARRIER ZU;Lo;0;L;;;;;N;;;;;
+1641;CANADIAN SYLLABICS CARRIER ZO;Lo;0;L;;;;;N;;;;;
+1642;CANADIAN SYLLABICS CARRIER ZE;Lo;0;L;;;;;N;;;;;
+1643;CANADIAN SYLLABICS CARRIER ZEE;Lo;0;L;;;;;N;;;;;
+1644;CANADIAN SYLLABICS CARRIER ZI;Lo;0;L;;;;;N;;;;;
+1645;CANADIAN SYLLABICS CARRIER ZA;Lo;0;L;;;;;N;;;;;
+1646;CANADIAN SYLLABICS CARRIER Z;Lo;0;L;;;;;N;;;;;
+1647;CANADIAN SYLLABICS CARRIER INITIAL Z;Lo;0;L;;;;;N;;;;;
+1648;CANADIAN SYLLABICS CARRIER DZU;Lo;0;L;;;;;N;;;;;
+1649;CANADIAN SYLLABICS CARRIER DZO;Lo;0;L;;;;;N;;;;;
+164A;CANADIAN SYLLABICS CARRIER DZE;Lo;0;L;;;;;N;;;;;
+164B;CANADIAN SYLLABICS CARRIER DZEE;Lo;0;L;;;;;N;;;;;
+164C;CANADIAN SYLLABICS CARRIER DZI;Lo;0;L;;;;;N;;;;;
+164D;CANADIAN SYLLABICS CARRIER DZA;Lo;0;L;;;;;N;;;;;
+164E;CANADIAN SYLLABICS CARRIER SU;Lo;0;L;;;;;N;;;;;
+164F;CANADIAN SYLLABICS CARRIER SO;Lo;0;L;;;;;N;;;;;
+1650;CANADIAN SYLLABICS CARRIER SE;Lo;0;L;;;;;N;;;;;
+1651;CANADIAN SYLLABICS CARRIER SEE;Lo;0;L;;;;;N;;;;;
+1652;CANADIAN SYLLABICS CARRIER SI;Lo;0;L;;;;;N;;;;;
+1653;CANADIAN SYLLABICS CARRIER SA;Lo;0;L;;;;;N;;;;;
+1654;CANADIAN SYLLABICS CARRIER SHU;Lo;0;L;;;;;N;;;;;
+1655;CANADIAN SYLLABICS CARRIER SHO;Lo;0;L;;;;;N;;;;;
+1656;CANADIAN SYLLABICS CARRIER SHE;Lo;0;L;;;;;N;;;;;
+1657;CANADIAN SYLLABICS CARRIER SHEE;Lo;0;L;;;;;N;;;;;
+1658;CANADIAN SYLLABICS CARRIER SHI;Lo;0;L;;;;;N;;;;;
+1659;CANADIAN SYLLABICS CARRIER SHA;Lo;0;L;;;;;N;;;;;
+165A;CANADIAN SYLLABICS CARRIER SH;Lo;0;L;;;;;N;;;;;
+165B;CANADIAN SYLLABICS CARRIER TSU;Lo;0;L;;;;;N;;;;;
+165C;CANADIAN SYLLABICS CARRIER TSO;Lo;0;L;;;;;N;;;;;
+165D;CANADIAN SYLLABICS CARRIER TSE;Lo;0;L;;;;;N;;;;;
+165E;CANADIAN SYLLABICS CARRIER TSEE;Lo;0;L;;;;;N;;;;;
+165F;CANADIAN SYLLABICS CARRIER TSI;Lo;0;L;;;;;N;;;;;
+1660;CANADIAN SYLLABICS CARRIER TSA;Lo;0;L;;;;;N;;;;;
+1661;CANADIAN SYLLABICS CARRIER CHU;Lo;0;L;;;;;N;;;;;
+1662;CANADIAN SYLLABICS CARRIER CHO;Lo;0;L;;;;;N;;;;;
+1663;CANADIAN SYLLABICS CARRIER CHE;Lo;0;L;;;;;N;;;;;
+1664;CANADIAN SYLLABICS CARRIER CHEE;Lo;0;L;;;;;N;;;;;
+1665;CANADIAN SYLLABICS CARRIER CHI;Lo;0;L;;;;;N;;;;;
+1666;CANADIAN SYLLABICS CARRIER CHA;Lo;0;L;;;;;N;;;;;
+1667;CANADIAN SYLLABICS CARRIER TTSU;Lo;0;L;;;;;N;;;;;
+1668;CANADIAN SYLLABICS CARRIER TTSO;Lo;0;L;;;;;N;;;;;
+1669;CANADIAN SYLLABICS CARRIER TTSE;Lo;0;L;;;;;N;;;;;
+166A;CANADIAN SYLLABICS CARRIER TTSEE;Lo;0;L;;;;;N;;;;;
+166B;CANADIAN SYLLABICS CARRIER TTSI;Lo;0;L;;;;;N;;;;;
+166C;CANADIAN SYLLABICS CARRIER TTSA;Lo;0;L;;;;;N;;;;;
+166D;CANADIAN SYLLABICS CHI SIGN;Po;0;L;;;;;N;;;;;
+166E;CANADIAN SYLLABICS FULL STOP;Po;0;L;;;;;N;;;;;
+166F;CANADIAN SYLLABICS QAI;Lo;0;L;;;;;N;;;;;
+1670;CANADIAN SYLLABICS NGAI;Lo;0;L;;;;;N;;;;;
+1671;CANADIAN SYLLABICS NNGI;Lo;0;L;;;;;N;;;;;
+1672;CANADIAN SYLLABICS NNGII;Lo;0;L;;;;;N;;;;;
+1673;CANADIAN SYLLABICS NNGO;Lo;0;L;;;;;N;;;;;
+1674;CANADIAN SYLLABICS NNGOO;Lo;0;L;;;;;N;;;;;
+1675;CANADIAN SYLLABICS NNGA;Lo;0;L;;;;;N;;;;;
+1676;CANADIAN SYLLABICS NNGAA;Lo;0;L;;;;;N;;;;;
+1677;CANADIAN SYLLABICS WOODS-CREE THWEE;Lo;0;L;;;;;N;;;;;
+1678;CANADIAN SYLLABICS WOODS-CREE THWI;Lo;0;L;;;;;N;;;;;
+1679;CANADIAN SYLLABICS WOODS-CREE THWII;Lo;0;L;;;;;N;;;;;
+167A;CANADIAN SYLLABICS WOODS-CREE THWO;Lo;0;L;;;;;N;;;;;
+167B;CANADIAN SYLLABICS WOODS-CREE THWOO;Lo;0;L;;;;;N;;;;;
+167C;CANADIAN SYLLABICS WOODS-CREE THWA;Lo;0;L;;;;;N;;;;;
+167D;CANADIAN SYLLABICS WOODS-CREE THWAA;Lo;0;L;;;;;N;;;;;
+167E;CANADIAN SYLLABICS WOODS-CREE FINAL TH;Lo;0;L;;;;;N;;;;;
+167F;CANADIAN SYLLABICS BLACKFOOT W;Lo;0;L;;;;;N;;;;;
+1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;;
+1681;OGHAM LETTER BEITH;Lo;0;L;;;;;N;;;;;
+1682;OGHAM LETTER LUIS;Lo;0;L;;;;;N;;;;;
+1683;OGHAM LETTER FEARN;Lo;0;L;;;;;N;;;;;
+1684;OGHAM LETTER SAIL;Lo;0;L;;;;;N;;;;;
+1685;OGHAM LETTER NION;Lo;0;L;;;;;N;;;;;
+1686;OGHAM LETTER UATH;Lo;0;L;;;;;N;;;;;
+1687;OGHAM LETTER DAIR;Lo;0;L;;;;;N;;;;;
+1688;OGHAM LETTER TINNE;Lo;0;L;;;;;N;;;;;
+1689;OGHAM LETTER COLL;Lo;0;L;;;;;N;;;;;
+168A;OGHAM LETTER CEIRT;Lo;0;L;;;;;N;;;;;
+168B;OGHAM LETTER MUIN;Lo;0;L;;;;;N;;;;;
+168C;OGHAM LETTER GORT;Lo;0;L;;;;;N;;;;;
+168D;OGHAM LETTER NGEADAL;Lo;0;L;;;;;N;;;;;
+168E;OGHAM LETTER STRAIF;Lo;0;L;;;;;N;;;;;
+168F;OGHAM LETTER RUIS;Lo;0;L;;;;;N;;;;;
+1690;OGHAM LETTER AILM;Lo;0;L;;;;;N;;;;;
+1691;OGHAM LETTER ONN;Lo;0;L;;;;;N;;;;;
+1692;OGHAM LETTER UR;Lo;0;L;;;;;N;;;;;
+1693;OGHAM LETTER EADHADH;Lo;0;L;;;;;N;;;;;
+1694;OGHAM LETTER IODHADH;Lo;0;L;;;;;N;;;;;
+1695;OGHAM LETTER EABHADH;Lo;0;L;;;;;N;;;;;
+1696;OGHAM LETTER OR;Lo;0;L;;;;;N;;;;;
+1697;OGHAM LETTER UILLEANN;Lo;0;L;;;;;N;;;;;
+1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;;
+1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;;
+169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;;
+169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;Y;;;;;
+169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;Y;;;;;
+16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;;
+16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;;
+16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;;
+16A3;RUNIC LETTER YR;Lo;0;L;;;;;N;;;;;
+16A4;RUNIC LETTER Y;Lo;0;L;;;;;N;;;;;
+16A5;RUNIC LETTER W;Lo;0;L;;;;;N;;;;;
+16A6;RUNIC LETTER THURISAZ THURS THORN;Lo;0;L;;;;;N;;;;;
+16A7;RUNIC LETTER ETH;Lo;0;L;;;;;N;;;;;
+16A8;RUNIC LETTER ANSUZ A;Lo;0;L;;;;;N;;;;;
+16A9;RUNIC LETTER OS O;Lo;0;L;;;;;N;;;;;
+16AA;RUNIC LETTER AC A;Lo;0;L;;;;;N;;;;;
+16AB;RUNIC LETTER AESC;Lo;0;L;;;;;N;;;;;
+16AC;RUNIC LETTER LONG-BRANCH-OSS O;Lo;0;L;;;;;N;;;;;
+16AD;RUNIC LETTER SHORT-TWIG-OSS O;Lo;0;L;;;;;N;;;;;
+16AE;RUNIC LETTER O;Lo;0;L;;;;;N;;;;;
+16AF;RUNIC LETTER OE;Lo;0;L;;;;;N;;;;;
+16B0;RUNIC LETTER ON;Lo;0;L;;;;;N;;;;;
+16B1;RUNIC LETTER RAIDO RAD REID R;Lo;0;L;;;;;N;;;;;
+16B2;RUNIC LETTER KAUNA;Lo;0;L;;;;;N;;;;;
+16B3;RUNIC LETTER CEN;Lo;0;L;;;;;N;;;;;
+16B4;RUNIC LETTER KAUN K;Lo;0;L;;;;;N;;;;;
+16B5;RUNIC LETTER G;Lo;0;L;;;;;N;;;;;
+16B6;RUNIC LETTER ENG;Lo;0;L;;;;;N;;;;;
+16B7;RUNIC LETTER GEBO GYFU G;Lo;0;L;;;;;N;;;;;
+16B8;RUNIC LETTER GAR;Lo;0;L;;;;;N;;;;;
+16B9;RUNIC LETTER WUNJO WYNN W;Lo;0;L;;;;;N;;;;;
+16BA;RUNIC LETTER HAGLAZ H;Lo;0;L;;;;;N;;;;;
+16BB;RUNIC LETTER HAEGL H;Lo;0;L;;;;;N;;;;;
+16BC;RUNIC LETTER LONG-BRANCH-HAGALL H;Lo;0;L;;;;;N;;;;;
+16BD;RUNIC LETTER SHORT-TWIG-HAGALL H;Lo;0;L;;;;;N;;;;;
+16BE;RUNIC LETTER NAUDIZ NYD NAUD N;Lo;0;L;;;;;N;;;;;
+16BF;RUNIC LETTER SHORT-TWIG-NAUD N;Lo;0;L;;;;;N;;;;;
+16C0;RUNIC LETTER DOTTED-N;Lo;0;L;;;;;N;;;;;
+16C1;RUNIC LETTER ISAZ IS ISS I;Lo;0;L;;;;;N;;;;;
+16C2;RUNIC LETTER E;Lo;0;L;;;;;N;;;;;
+16C3;RUNIC LETTER JERAN J;Lo;0;L;;;;;N;;;;;
+16C4;RUNIC LETTER GER;Lo;0;L;;;;;N;;;;;
+16C5;RUNIC LETTER LONG-BRANCH-AR AE;Lo;0;L;;;;;N;;;;;
+16C6;RUNIC LETTER SHORT-TWIG-AR A;Lo;0;L;;;;;N;;;;;
+16C7;RUNIC LETTER IWAZ EOH;Lo;0;L;;;;;N;;;;;
+16C8;RUNIC LETTER PERTHO PEORTH P;Lo;0;L;;;;;N;;;;;
+16C9;RUNIC LETTER ALGIZ EOLHX;Lo;0;L;;;;;N;;;;;
+16CA;RUNIC LETTER SOWILO S;Lo;0;L;;;;;N;;;;;
+16CB;RUNIC LETTER SIGEL LONG-BRANCH-SOL S;Lo;0;L;;;;;N;;;;;
+16CC;RUNIC LETTER SHORT-TWIG-SOL S;Lo;0;L;;;;;N;;;;;
+16CD;RUNIC LETTER C;Lo;0;L;;;;;N;;;;;
+16CE;RUNIC LETTER Z;Lo;0;L;;;;;N;;;;;
+16CF;RUNIC LETTER TIWAZ TIR TYR T;Lo;0;L;;;;;N;;;;;
+16D0;RUNIC LETTER SHORT-TWIG-TYR T;Lo;0;L;;;;;N;;;;;
+16D1;RUNIC LETTER D;Lo;0;L;;;;;N;;;;;
+16D2;RUNIC LETTER BERKANAN BEORC BJARKAN B;Lo;0;L;;;;;N;;;;;
+16D3;RUNIC LETTER SHORT-TWIG-BJARKAN B;Lo;0;L;;;;;N;;;;;
+16D4;RUNIC LETTER DOTTED-P;Lo;0;L;;;;;N;;;;;
+16D5;RUNIC LETTER OPEN-P;Lo;0;L;;;;;N;;;;;
+16D6;RUNIC LETTER EHWAZ EH E;Lo;0;L;;;;;N;;;;;
+16D7;RUNIC LETTER MANNAZ MAN M;Lo;0;L;;;;;N;;;;;
+16D8;RUNIC LETTER LONG-BRANCH-MADR M;Lo;0;L;;;;;N;;;;;
+16D9;RUNIC LETTER SHORT-TWIG-MADR M;Lo;0;L;;;;;N;;;;;
+16DA;RUNIC LETTER LAUKAZ LAGU LOGR L;Lo;0;L;;;;;N;;;;;
+16DB;RUNIC LETTER DOTTED-L;Lo;0;L;;;;;N;;;;;
+16DC;RUNIC LETTER INGWAZ;Lo;0;L;;;;;N;;;;;
+16DD;RUNIC LETTER ING;Lo;0;L;;;;;N;;;;;
+16DE;RUNIC LETTER DAGAZ DAEG D;Lo;0;L;;;;;N;;;;;
+16DF;RUNIC LETTER OTHALAN ETHEL O;Lo;0;L;;;;;N;;;;;
+16E0;RUNIC LETTER EAR;Lo;0;L;;;;;N;;;;;
+16E1;RUNIC LETTER IOR;Lo;0;L;;;;;N;;;;;
+16E2;RUNIC LETTER CWEORTH;Lo;0;L;;;;;N;;;;;
+16E3;RUNIC LETTER CALC;Lo;0;L;;;;;N;;;;;
+16E4;RUNIC LETTER CEALC;Lo;0;L;;;;;N;;;;;
+16E5;RUNIC LETTER STAN;Lo;0;L;;;;;N;;;;;
+16E6;RUNIC LETTER LONG-BRANCH-YR;Lo;0;L;;;;;N;;;;;
+16E7;RUNIC LETTER SHORT-TWIG-YR;Lo;0;L;;;;;N;;;;;
+16E8;RUNIC LETTER ICELANDIC-YR;Lo;0;L;;;;;N;;;;;
+16E9;RUNIC LETTER Q;Lo;0;L;;;;;N;;;;;
+16EA;RUNIC LETTER X;Lo;0;L;;;;;N;;;;;
+16EB;RUNIC SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+16EC;RUNIC MULTIPLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+16ED;RUNIC CROSS PUNCTUATION;Po;0;L;;;;;N;;;;;
+16EE;RUNIC ARLAUG SYMBOL;Nl;0;L;;;;17;N;;;;;
+16EF;RUNIC TVIMADUR SYMBOL;Nl;0;L;;;;18;N;;;;;
+16F0;RUNIC BELGTHOR SYMBOL;Nl;0;L;;;;19;N;;;;;
+16F1;RUNIC LETTER K;Lo;0;L;;;;;N;;;;;
+16F2;RUNIC LETTER SH;Lo;0;L;;;;;N;;;;;
+16F3;RUNIC LETTER OO;Lo;0;L;;;;;N;;;;;
+16F4;RUNIC LETTER FRANKS CASKET OS;Lo;0;L;;;;;N;;;;;
+16F5;RUNIC LETTER FRANKS CASKET IS;Lo;0;L;;;;;N;;;;;
+16F6;RUNIC LETTER FRANKS CASKET EH;Lo;0;L;;;;;N;;;;;
+16F7;RUNIC LETTER FRANKS CASKET AC;Lo;0;L;;;;;N;;;;;
+16F8;RUNIC LETTER FRANKS CASKET AESC;Lo;0;L;;;;;N;;;;;
+1700;TAGALOG LETTER A;Lo;0;L;;;;;N;;;;;
+1701;TAGALOG LETTER I;Lo;0;L;;;;;N;;;;;
+1702;TAGALOG LETTER U;Lo;0;L;;;;;N;;;;;
+1703;TAGALOG LETTER KA;Lo;0;L;;;;;N;;;;;
+1704;TAGALOG LETTER GA;Lo;0;L;;;;;N;;;;;
+1705;TAGALOG LETTER NGA;Lo;0;L;;;;;N;;;;;
+1706;TAGALOG LETTER TA;Lo;0;L;;;;;N;;;;;
+1707;TAGALOG LETTER DA;Lo;0;L;;;;;N;;;;;
+1708;TAGALOG LETTER NA;Lo;0;L;;;;;N;;;;;
+1709;TAGALOG LETTER PA;Lo;0;L;;;;;N;;;;;
+170A;TAGALOG LETTER BA;Lo;0;L;;;;;N;;;;;
+170B;TAGALOG LETTER MA;Lo;0;L;;;;;N;;;;;
+170C;TAGALOG LETTER YA;Lo;0;L;;;;;N;;;;;
+170E;TAGALOG LETTER LA;Lo;0;L;;;;;N;;;;;
+170F;TAGALOG LETTER WA;Lo;0;L;;;;;N;;;;;
+1710;TAGALOG LETTER SA;Lo;0;L;;;;;N;;;;;
+1711;TAGALOG LETTER HA;Lo;0;L;;;;;N;;;;;
+1712;TAGALOG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1713;TAGALOG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1714;TAGALOG SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+1720;HANUNOO LETTER A;Lo;0;L;;;;;N;;;;;
+1721;HANUNOO LETTER I;Lo;0;L;;;;;N;;;;;
+1722;HANUNOO LETTER U;Lo;0;L;;;;;N;;;;;
+1723;HANUNOO LETTER KA;Lo;0;L;;;;;N;;;;;
+1724;HANUNOO LETTER GA;Lo;0;L;;;;;N;;;;;
+1725;HANUNOO LETTER NGA;Lo;0;L;;;;;N;;;;;
+1726;HANUNOO LETTER TA;Lo;0;L;;;;;N;;;;;
+1727;HANUNOO LETTER DA;Lo;0;L;;;;;N;;;;;
+1728;HANUNOO LETTER NA;Lo;0;L;;;;;N;;;;;
+1729;HANUNOO LETTER PA;Lo;0;L;;;;;N;;;;;
+172A;HANUNOO LETTER BA;Lo;0;L;;;;;N;;;;;
+172B;HANUNOO LETTER MA;Lo;0;L;;;;;N;;;;;
+172C;HANUNOO LETTER YA;Lo;0;L;;;;;N;;;;;
+172D;HANUNOO LETTER RA;Lo;0;L;;;;;N;;;;;
+172E;HANUNOO LETTER LA;Lo;0;L;;;;;N;;;;;
+172F;HANUNOO LETTER WA;Lo;0;L;;;;;N;;;;;
+1730;HANUNOO LETTER SA;Lo;0;L;;;;;N;;;;;
+1731;HANUNOO LETTER HA;Lo;0;L;;;;;N;;;;;
+1732;HANUNOO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1733;HANUNOO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1734;HANUNOO SIGN PAMUDPOD;Mn;9;NSM;;;;;N;;;;;
+1735;PHILIPPINE SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+1736;PHILIPPINE DOUBLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+1740;BUHID LETTER A;Lo;0;L;;;;;N;;;;;
+1741;BUHID LETTER I;Lo;0;L;;;;;N;;;;;
+1742;BUHID LETTER U;Lo;0;L;;;;;N;;;;;
+1743;BUHID LETTER KA;Lo;0;L;;;;;N;;;;;
+1744;BUHID LETTER GA;Lo;0;L;;;;;N;;;;;
+1745;BUHID LETTER NGA;Lo;0;L;;;;;N;;;;;
+1746;BUHID LETTER TA;Lo;0;L;;;;;N;;;;;
+1747;BUHID LETTER DA;Lo;0;L;;;;;N;;;;;
+1748;BUHID LETTER NA;Lo;0;L;;;;;N;;;;;
+1749;BUHID LETTER PA;Lo;0;L;;;;;N;;;;;
+174A;BUHID LETTER BA;Lo;0;L;;;;;N;;;;;
+174B;BUHID LETTER MA;Lo;0;L;;;;;N;;;;;
+174C;BUHID LETTER YA;Lo;0;L;;;;;N;;;;;
+174D;BUHID LETTER RA;Lo;0;L;;;;;N;;;;;
+174E;BUHID LETTER LA;Lo;0;L;;;;;N;;;;;
+174F;BUHID LETTER WA;Lo;0;L;;;;;N;;;;;
+1750;BUHID LETTER SA;Lo;0;L;;;;;N;;;;;
+1751;BUHID LETTER HA;Lo;0;L;;;;;N;;;;;
+1752;BUHID VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1753;BUHID VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1760;TAGBANWA LETTER A;Lo;0;L;;;;;N;;;;;
+1761;TAGBANWA LETTER I;Lo;0;L;;;;;N;;;;;
+1762;TAGBANWA LETTER U;Lo;0;L;;;;;N;;;;;
+1763;TAGBANWA LETTER KA;Lo;0;L;;;;;N;;;;;
+1764;TAGBANWA LETTER GA;Lo;0;L;;;;;N;;;;;
+1765;TAGBANWA LETTER NGA;Lo;0;L;;;;;N;;;;;
+1766;TAGBANWA LETTER TA;Lo;0;L;;;;;N;;;;;
+1767;TAGBANWA LETTER DA;Lo;0;L;;;;;N;;;;;
+1768;TAGBANWA LETTER NA;Lo;0;L;;;;;N;;;;;
+1769;TAGBANWA LETTER PA;Lo;0;L;;;;;N;;;;;
+176A;TAGBANWA LETTER BA;Lo;0;L;;;;;N;;;;;
+176B;TAGBANWA LETTER MA;Lo;0;L;;;;;N;;;;;
+176C;TAGBANWA LETTER YA;Lo;0;L;;;;;N;;;;;
+176E;TAGBANWA LETTER LA;Lo;0;L;;;;;N;;;;;
+176F;TAGBANWA LETTER WA;Lo;0;L;;;;;N;;;;;
+1770;TAGBANWA LETTER SA;Lo;0;L;;;;;N;;;;;
+1772;TAGBANWA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1773;TAGBANWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1780;KHMER LETTER KA;Lo;0;L;;;;;N;;;;;
+1781;KHMER LETTER KHA;Lo;0;L;;;;;N;;;;;
+1782;KHMER LETTER KO;Lo;0;L;;;;;N;;;;;
+1783;KHMER LETTER KHO;Lo;0;L;;;;;N;;;;;
+1784;KHMER LETTER NGO;Lo;0;L;;;;;N;;;;;
+1785;KHMER LETTER CA;Lo;0;L;;;;;N;;;;;
+1786;KHMER LETTER CHA;Lo;0;L;;;;;N;;;;;
+1787;KHMER LETTER CO;Lo;0;L;;;;;N;;;;;
+1788;KHMER LETTER CHO;Lo;0;L;;;;;N;;;;;
+1789;KHMER LETTER NYO;Lo;0;L;;;;;N;;;;;
+178A;KHMER LETTER DA;Lo;0;L;;;;;N;;;;;
+178B;KHMER LETTER TTHA;Lo;0;L;;;;;N;;;;;
+178C;KHMER LETTER DO;Lo;0;L;;;;;N;;;;;
+178D;KHMER LETTER TTHO;Lo;0;L;;;;;N;;;;;
+178E;KHMER LETTER NNO;Lo;0;L;;;;;N;;;;;
+178F;KHMER LETTER TA;Lo;0;L;;;;;N;;;;;
+1790;KHMER LETTER THA;Lo;0;L;;;;;N;;;;;
+1791;KHMER LETTER TO;Lo;0;L;;;;;N;;;;;
+1792;KHMER LETTER THO;Lo;0;L;;;;;N;;;;;
+1793;KHMER LETTER NO;Lo;0;L;;;;;N;;;;;
+1794;KHMER LETTER BA;Lo;0;L;;;;;N;;;;;
+1795;KHMER LETTER PHA;Lo;0;L;;;;;N;;;;;
+1796;KHMER LETTER PO;Lo;0;L;;;;;N;;;;;
+1797;KHMER LETTER PHO;Lo;0;L;;;;;N;;;;;
+1798;KHMER LETTER MO;Lo;0;L;;;;;N;;;;;
+1799;KHMER LETTER YO;Lo;0;L;;;;;N;;;;;
+179A;KHMER LETTER RO;Lo;0;L;;;;;N;;;;;
+179B;KHMER LETTER LO;Lo;0;L;;;;;N;;;;;
+179C;KHMER LETTER VO;Lo;0;L;;;;;N;;;;;
+179D;KHMER LETTER SHA;Lo;0;L;;;;;N;;;;;
+179E;KHMER LETTER SSO;Lo;0;L;;;;;N;;;;;
+179F;KHMER LETTER SA;Lo;0;L;;;;;N;;;;;
+17A0;KHMER LETTER HA;Lo;0;L;;;;;N;;;;;
+17A1;KHMER LETTER LA;Lo;0;L;;;;;N;;;;;
+17A2;KHMER LETTER QA;Lo;0;L;;;;;N;;;;;
+17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;;;;
+17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;;;;
+17A5;KHMER INDEPENDENT VOWEL QI;Lo;0;L;;;;;N;;;;;
+17A6;KHMER INDEPENDENT VOWEL QII;Lo;0;L;;;;;N;;;;;
+17A7;KHMER INDEPENDENT VOWEL QU;Lo;0;L;;;;;N;;;;;
+17A8;KHMER INDEPENDENT VOWEL QUK;Lo;0;L;;;;;N;;;;;
+17A9;KHMER INDEPENDENT VOWEL QUU;Lo;0;L;;;;;N;;;;;
+17AA;KHMER INDEPENDENT VOWEL QUUV;Lo;0;L;;;;;N;;;;;
+17AB;KHMER INDEPENDENT VOWEL RY;Lo;0;L;;;;;N;;;;;
+17AC;KHMER INDEPENDENT VOWEL RYY;Lo;0;L;;;;;N;;;;;
+17AD;KHMER INDEPENDENT VOWEL LY;Lo;0;L;;;;;N;;;;;
+17AE;KHMER INDEPENDENT VOWEL LYY;Lo;0;L;;;;;N;;;;;
+17AF;KHMER INDEPENDENT VOWEL QE;Lo;0;L;;;;;N;;;;;
+17B0;KHMER INDEPENDENT VOWEL QAI;Lo;0;L;;;;;N;;;;;
+17B1;KHMER INDEPENDENT VOWEL QOO TYPE ONE;Lo;0;L;;;;;N;;;;;
+17B2;KHMER INDEPENDENT VOWEL QOO TYPE TWO;Lo;0;L;;;;;N;;;;;
+17B3;KHMER INDEPENDENT VOWEL QAU;Lo;0;L;;;;;N;;;;;
+17B4;KHMER VOWEL INHERENT AQ;Mn;0;NSM;;;;;N;;;;;
+17B5;KHMER VOWEL INHERENT AA;Mn;0;NSM;;;;;N;;;;;
+17B6;KHMER VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+17B7;KHMER VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+17B8;KHMER VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+17B9;KHMER VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;;
+17BA;KHMER VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;;
+17BB;KHMER VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+17BC;KHMER VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+17BD;KHMER VOWEL SIGN UA;Mn;0;NSM;;;;;N;;;;;
+17BE;KHMER VOWEL SIGN OE;Mc;0;L;;;;;N;;;;;
+17BF;KHMER VOWEL SIGN YA;Mc;0;L;;;;;N;;;;;
+17C0;KHMER VOWEL SIGN IE;Mc;0;L;;;;;N;;;;;
+17C1;KHMER VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+17C2;KHMER VOWEL SIGN AE;Mc;0;L;;;;;N;;;;;
+17C3;KHMER VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+17C4;KHMER VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+17C5;KHMER VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+17C6;KHMER SIGN NIKAHIT;Mn;0;NSM;;;;;N;;;;;
+17C7;KHMER SIGN REAHMUK;Mc;0;L;;;;;N;;;;;
+17C8;KHMER SIGN YUUKALEAPINTU;Mc;0;L;;;;;N;;;;;
+17C9;KHMER SIGN MUUSIKATOAN;Mn;0;NSM;;;;;N;;;;;
+17CA;KHMER SIGN TRIISAP;Mn;0;NSM;;;;;N;;;;;
+17CB;KHMER SIGN BANTOC;Mn;0;NSM;;;;;N;;;;;
+17CC;KHMER SIGN ROBAT;Mn;0;NSM;;;;;N;;;;;
+17CD;KHMER SIGN TOANDAKHIAT;Mn;0;NSM;;;;;N;;;;;
+17CE;KHMER SIGN KAKABAT;Mn;0;NSM;;;;;N;;;;;
+17CF;KHMER SIGN AHSDA;Mn;0;NSM;;;;;N;;;;;
+17D0;KHMER SIGN SAMYOK SANNYA;Mn;0;NSM;;;;;N;;;;;
+17D1;KHMER SIGN VIRIAM;Mn;0;NSM;;;;;N;;;;;
+17D2;KHMER SIGN COENG;Mn;9;NSM;;;;;N;;;;;
+17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;;;;
+17D4;KHMER SIGN KHAN;Po;0;L;;;;;N;;;;;
+17D5;KHMER SIGN BARIYOOSAN;Po;0;L;;;;;N;;;;;
+17D6;KHMER SIGN CAMNUC PII KUUH;Po;0;L;;;;;N;;;;;
+17D7;KHMER SIGN LEK TOO;Lm;0;L;;;;;N;;;;;
+17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;;;;
+17D9;KHMER SIGN PHNAEK MUAN;Po;0;L;;;;;N;;;;;
+17DA;KHMER SIGN KOOMUUT;Po;0;L;;;;;N;;;;;
+17DB;KHMER CURRENCY SYMBOL RIEL;Sc;0;ET;;;;;N;;;;;
+17DC;KHMER SIGN AVAKRAHASANYA;Lo;0;L;;;;;N;;;;;
+17DD;KHMER SIGN ATTHACAN;Mn;230;NSM;;;;;N;;;;;
+17E0;KHMER DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+17E1;KHMER DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+17E2;KHMER DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+17E3;KHMER DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+17E4;KHMER DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+17E5;KHMER DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+17E6;KHMER DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+17E7;KHMER DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+17E8;KHMER DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+17E9;KHMER DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+17F0;KHMER SYMBOL LEK ATTAK SON;No;0;ON;;;;0;N;;;;;
+17F1;KHMER SYMBOL LEK ATTAK MUOY;No;0;ON;;;;1;N;;;;;
+17F2;KHMER SYMBOL LEK ATTAK PII;No;0;ON;;;;2;N;;;;;
+17F3;KHMER SYMBOL LEK ATTAK BEI;No;0;ON;;;;3;N;;;;;
+17F4;KHMER SYMBOL LEK ATTAK BUON;No;0;ON;;;;4;N;;;;;
+17F5;KHMER SYMBOL LEK ATTAK PRAM;No;0;ON;;;;5;N;;;;;
+17F6;KHMER SYMBOL LEK ATTAK PRAM-MUOY;No;0;ON;;;;6;N;;;;;
+17F7;KHMER SYMBOL LEK ATTAK PRAM-PII;No;0;ON;;;;7;N;;;;;
+17F8;KHMER SYMBOL LEK ATTAK PRAM-BEI;No;0;ON;;;;8;N;;;;;
+17F9;KHMER SYMBOL LEK ATTAK PRAM-BUON;No;0;ON;;;;9;N;;;;;
+1800;MONGOLIAN BIRGA;Po;0;ON;;;;;N;;;;;
+1801;MONGOLIAN ELLIPSIS;Po;0;ON;;;;;N;;;;;
+1802;MONGOLIAN COMMA;Po;0;ON;;;;;N;;;;;
+1803;MONGOLIAN FULL STOP;Po;0;ON;;;;;N;;;;;
+1804;MONGOLIAN COLON;Po;0;ON;;;;;N;;;;;
+1805;MONGOLIAN FOUR DOTS;Po;0;ON;;;;;N;;;;;
+1806;MONGOLIAN TODO SOFT HYPHEN;Pd;0;ON;;;;;N;;;;;
+1807;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER;Po;0;ON;;;;;N;;;;;
+1808;MONGOLIAN MANCHU COMMA;Po;0;ON;;;;;N;;;;;
+1809;MONGOLIAN MANCHU FULL STOP;Po;0;ON;;;;;N;;;;;
+180A;MONGOLIAN NIRUGU;Po;0;ON;;;;;N;;;;;
+180B;MONGOLIAN FREE VARIATION SELECTOR ONE;Mn;0;NSM;;;;;N;;;;;
+180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Mn;0;NSM;;;;;N;;;;;
+180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Mn;0;NSM;;;;;N;;;;;
+180E;MONGOLIAN VOWEL SEPARATOR;Cf;0;BN;;;;;N;;;;;
+1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1813;MONGOLIAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1814;MONGOLIAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1815;MONGOLIAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1816;MONGOLIAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1817;MONGOLIAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1818;MONGOLIAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1819;MONGOLIAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1820;MONGOLIAN LETTER A;Lo;0;L;;;;;N;;;;;
+1821;MONGOLIAN LETTER E;Lo;0;L;;;;;N;;;;;
+1822;MONGOLIAN LETTER I;Lo;0;L;;;;;N;;;;;
+1823;MONGOLIAN LETTER O;Lo;0;L;;;;;N;;;;;
+1824;MONGOLIAN LETTER U;Lo;0;L;;;;;N;;;;;
+1825;MONGOLIAN LETTER OE;Lo;0;L;;;;;N;;;;;
+1826;MONGOLIAN LETTER UE;Lo;0;L;;;;;N;;;;;
+1827;MONGOLIAN LETTER EE;Lo;0;L;;;;;N;;;;;
+1828;MONGOLIAN LETTER NA;Lo;0;L;;;;;N;;;;;
+1829;MONGOLIAN LETTER ANG;Lo;0;L;;;;;N;;;;;
+182A;MONGOLIAN LETTER BA;Lo;0;L;;;;;N;;;;;
+182B;MONGOLIAN LETTER PA;Lo;0;L;;;;;N;;;;;
+182C;MONGOLIAN LETTER QA;Lo;0;L;;;;;N;;;;;
+182D;MONGOLIAN LETTER GA;Lo;0;L;;;;;N;;;;;
+182E;MONGOLIAN LETTER MA;Lo;0;L;;;;;N;;;;;
+182F;MONGOLIAN LETTER LA;Lo;0;L;;;;;N;;;;;
+1830;MONGOLIAN LETTER SA;Lo;0;L;;;;;N;;;;;
+1831;MONGOLIAN LETTER SHA;Lo;0;L;;;;;N;;;;;
+1832;MONGOLIAN LETTER TA;Lo;0;L;;;;;N;;;;;
+1833;MONGOLIAN LETTER DA;Lo;0;L;;;;;N;;;;;
+1834;MONGOLIAN LETTER CHA;Lo;0;L;;;;;N;;;;;
+1835;MONGOLIAN LETTER JA;Lo;0;L;;;;;N;;;;;
+1836;MONGOLIAN LETTER YA;Lo;0;L;;;;;N;;;;;
+1837;MONGOLIAN LETTER RA;Lo;0;L;;;;;N;;;;;
+1838;MONGOLIAN LETTER WA;Lo;0;L;;;;;N;;;;;
+1839;MONGOLIAN LETTER FA;Lo;0;L;;;;;N;;;;;
+183A;MONGOLIAN LETTER KA;Lo;0;L;;;;;N;;;;;
+183B;MONGOLIAN LETTER KHA;Lo;0;L;;;;;N;;;;;
+183C;MONGOLIAN LETTER TSA;Lo;0;L;;;;;N;;;;;
+183D;MONGOLIAN LETTER ZA;Lo;0;L;;;;;N;;;;;
+183E;MONGOLIAN LETTER HAA;Lo;0;L;;;;;N;;;;;
+183F;MONGOLIAN LETTER ZRA;Lo;0;L;;;;;N;;;;;
+1840;MONGOLIAN LETTER LHA;Lo;0;L;;;;;N;;;;;
+1841;MONGOLIAN LETTER ZHI;Lo;0;L;;;;;N;;;;;
+1842;MONGOLIAN LETTER CHI;Lo;0;L;;;;;N;;;;;
+1843;MONGOLIAN LETTER TODO LONG VOWEL SIGN;Lm;0;L;;;;;N;;;;;
+1844;MONGOLIAN LETTER TODO E;Lo;0;L;;;;;N;;;;;
+1845;MONGOLIAN LETTER TODO I;Lo;0;L;;;;;N;;;;;
+1846;MONGOLIAN LETTER TODO O;Lo;0;L;;;;;N;;;;;
+1847;MONGOLIAN LETTER TODO U;Lo;0;L;;;;;N;;;;;
+1848;MONGOLIAN LETTER TODO OE;Lo;0;L;;;;;N;;;;;
+1849;MONGOLIAN LETTER TODO UE;Lo;0;L;;;;;N;;;;;
+184A;MONGOLIAN LETTER TODO ANG;Lo;0;L;;;;;N;;;;;
+184B;MONGOLIAN LETTER TODO BA;Lo;0;L;;;;;N;;;;;
+184C;MONGOLIAN LETTER TODO PA;Lo;0;L;;;;;N;;;;;
+184D;MONGOLIAN LETTER TODO QA;Lo;0;L;;;;;N;;;;;
+184E;MONGOLIAN LETTER TODO GA;Lo;0;L;;;;;N;;;;;
+184F;MONGOLIAN LETTER TODO MA;Lo;0;L;;;;;N;;;;;
+1850;MONGOLIAN LETTER TODO TA;Lo;0;L;;;;;N;;;;;
+1851;MONGOLIAN LETTER TODO DA;Lo;0;L;;;;;N;;;;;
+1852;MONGOLIAN LETTER TODO CHA;Lo;0;L;;;;;N;;;;;
+1853;MONGOLIAN LETTER TODO JA;Lo;0;L;;;;;N;;;;;
+1854;MONGOLIAN LETTER TODO TSA;Lo;0;L;;;;;N;;;;;
+1855;MONGOLIAN LETTER TODO YA;Lo;0;L;;;;;N;;;;;
+1856;MONGOLIAN LETTER TODO WA;Lo;0;L;;;;;N;;;;;
+1857;MONGOLIAN LETTER TODO KA;Lo;0;L;;;;;N;;;;;
+1858;MONGOLIAN LETTER TODO GAA;Lo;0;L;;;;;N;;;;;
+1859;MONGOLIAN LETTER TODO HAA;Lo;0;L;;;;;N;;;;;
+185A;MONGOLIAN LETTER TODO JIA;Lo;0;L;;;;;N;;;;;
+185B;MONGOLIAN LETTER TODO NIA;Lo;0;L;;;;;N;;;;;
+185C;MONGOLIAN LETTER TODO DZA;Lo;0;L;;;;;N;;;;;
+185D;MONGOLIAN LETTER SIBE E;Lo;0;L;;;;;N;;;;;
+185E;MONGOLIAN LETTER SIBE I;Lo;0;L;;;;;N;;;;;
+185F;MONGOLIAN LETTER SIBE IY;Lo;0;L;;;;;N;;;;;
+1860;MONGOLIAN LETTER SIBE UE;Lo;0;L;;;;;N;;;;;
+1861;MONGOLIAN LETTER SIBE U;Lo;0;L;;;;;N;;;;;
+1862;MONGOLIAN LETTER SIBE ANG;Lo;0;L;;;;;N;;;;;
+1863;MONGOLIAN LETTER SIBE KA;Lo;0;L;;;;;N;;;;;
+1864;MONGOLIAN LETTER SIBE GA;Lo;0;L;;;;;N;;;;;
+1865;MONGOLIAN LETTER SIBE HA;Lo;0;L;;;;;N;;;;;
+1866;MONGOLIAN LETTER SIBE PA;Lo;0;L;;;;;N;;;;;
+1867;MONGOLIAN LETTER SIBE SHA;Lo;0;L;;;;;N;;;;;
+1868;MONGOLIAN LETTER SIBE TA;Lo;0;L;;;;;N;;;;;
+1869;MONGOLIAN LETTER SIBE DA;Lo;0;L;;;;;N;;;;;
+186A;MONGOLIAN LETTER SIBE JA;Lo;0;L;;;;;N;;;;;
+186B;MONGOLIAN LETTER SIBE FA;Lo;0;L;;;;;N;;;;;
+186C;MONGOLIAN LETTER SIBE GAA;Lo;0;L;;;;;N;;;;;
+186D;MONGOLIAN LETTER SIBE HAA;Lo;0;L;;;;;N;;;;;
+186E;MONGOLIAN LETTER SIBE TSA;Lo;0;L;;;;;N;;;;;
+186F;MONGOLIAN LETTER SIBE ZA;Lo;0;L;;;;;N;;;;;
+1870;MONGOLIAN LETTER SIBE RAA;Lo;0;L;;;;;N;;;;;
+1871;MONGOLIAN LETTER SIBE CHA;Lo;0;L;;;;;N;;;;;
+1872;MONGOLIAN LETTER SIBE ZHA;Lo;0;L;;;;;N;;;;;
+1873;MONGOLIAN LETTER MANCHU I;Lo;0;L;;;;;N;;;;;
+1874;MONGOLIAN LETTER MANCHU KA;Lo;0;L;;;;;N;;;;;
+1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;;
+1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;;
+1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;;
+1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;;
+1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;;
+1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;;
+1883;MONGOLIAN LETTER ALI GALI UBADAMA;Lo;0;L;;;;;N;;;;;
+1884;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA;Lo;0;L;;;;;N;;;;;
+1885;MONGOLIAN LETTER ALI GALI BALUDA;Mn;0;NSM;;;;;N;;;;;
+1886;MONGOLIAN LETTER ALI GALI THREE BALUDA;Mn;0;NSM;;;;;N;;;;;
+1887;MONGOLIAN LETTER ALI GALI A;Lo;0;L;;;;;N;;;;;
+1888;MONGOLIAN LETTER ALI GALI I;Lo;0;L;;;;;N;;;;;
+1889;MONGOLIAN LETTER ALI GALI KA;Lo;0;L;;;;;N;;;;;
+188A;MONGOLIAN LETTER ALI GALI NGA;Lo;0;L;;;;;N;;;;;
+188B;MONGOLIAN LETTER ALI GALI CA;Lo;0;L;;;;;N;;;;;
+188C;MONGOLIAN LETTER ALI GALI TTA;Lo;0;L;;;;;N;;;;;
+188D;MONGOLIAN LETTER ALI GALI TTHA;Lo;0;L;;;;;N;;;;;
+188E;MONGOLIAN LETTER ALI GALI DDA;Lo;0;L;;;;;N;;;;;
+188F;MONGOLIAN LETTER ALI GALI NNA;Lo;0;L;;;;;N;;;;;
+1890;MONGOLIAN LETTER ALI GALI TA;Lo;0;L;;;;;N;;;;;
+1891;MONGOLIAN LETTER ALI GALI DA;Lo;0;L;;;;;N;;;;;
+1892;MONGOLIAN LETTER ALI GALI PA;Lo;0;L;;;;;N;;;;;
+1893;MONGOLIAN LETTER ALI GALI PHA;Lo;0;L;;;;;N;;;;;
+1894;MONGOLIAN LETTER ALI GALI SSA;Lo;0;L;;;;;N;;;;;
+1895;MONGOLIAN LETTER ALI GALI ZHA;Lo;0;L;;;;;N;;;;;
+1896;MONGOLIAN LETTER ALI GALI ZA;Lo;0;L;;;;;N;;;;;
+1897;MONGOLIAN LETTER ALI GALI AH;Lo;0;L;;;;;N;;;;;
+1898;MONGOLIAN LETTER TODO ALI GALI TA;Lo;0;L;;;;;N;;;;;
+1899;MONGOLIAN LETTER TODO ALI GALI ZHA;Lo;0;L;;;;;N;;;;;
+189A;MONGOLIAN LETTER MANCHU ALI GALI GHA;Lo;0;L;;;;;N;;;;;
+189B;MONGOLIAN LETTER MANCHU ALI GALI NGA;Lo;0;L;;;;;N;;;;;
+189C;MONGOLIAN LETTER MANCHU ALI GALI CA;Lo;0;L;;;;;N;;;;;
+189D;MONGOLIAN LETTER MANCHU ALI GALI JHA;Lo;0;L;;;;;N;;;;;
+189E;MONGOLIAN LETTER MANCHU ALI GALI TTA;Lo;0;L;;;;;N;;;;;
+189F;MONGOLIAN LETTER MANCHU ALI GALI DDHA;Lo;0;L;;;;;N;;;;;
+18A0;MONGOLIAN LETTER MANCHU ALI GALI TA;Lo;0;L;;;;;N;;;;;
+18A1;MONGOLIAN LETTER MANCHU ALI GALI DHA;Lo;0;L;;;;;N;;;;;
+18A2;MONGOLIAN LETTER MANCHU ALI GALI SSA;Lo;0;L;;;;;N;;;;;
+18A3;MONGOLIAN LETTER MANCHU ALI GALI CYA;Lo;0;L;;;;;N;;;;;
+18A4;MONGOLIAN LETTER MANCHU ALI GALI ZHA;Lo;0;L;;;;;N;;;;;
+18A5;MONGOLIAN LETTER MANCHU ALI GALI ZA;Lo;0;L;;;;;N;;;;;
+18A6;MONGOLIAN LETTER ALI GALI HALF U;Lo;0;L;;;;;N;;;;;
+18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;;
+18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;;
+18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;;
+18AA;MONGOLIAN LETTER MANCHU ALI GALI LHA;Lo;0;L;;;;;N;;;;;
+18B0;CANADIAN SYLLABICS OY;Lo;0;L;;;;;N;;;;;
+18B1;CANADIAN SYLLABICS AY;Lo;0;L;;;;;N;;;;;
+18B2;CANADIAN SYLLABICS AAY;Lo;0;L;;;;;N;;;;;
+18B3;CANADIAN SYLLABICS WAY;Lo;0;L;;;;;N;;;;;
+18B4;CANADIAN SYLLABICS POY;Lo;0;L;;;;;N;;;;;
+18B5;CANADIAN SYLLABICS PAY;Lo;0;L;;;;;N;;;;;
+18B6;CANADIAN SYLLABICS PWOY;Lo;0;L;;;;;N;;;;;
+18B7;CANADIAN SYLLABICS TAY;Lo;0;L;;;;;N;;;;;
+18B8;CANADIAN SYLLABICS KAY;Lo;0;L;;;;;N;;;;;
+18B9;CANADIAN SYLLABICS KWAY;Lo;0;L;;;;;N;;;;;
+18BA;CANADIAN SYLLABICS MAY;Lo;0;L;;;;;N;;;;;
+18BB;CANADIAN SYLLABICS NOY;Lo;0;L;;;;;N;;;;;
+18BC;CANADIAN SYLLABICS NAY;Lo;0;L;;;;;N;;;;;
+18BD;CANADIAN SYLLABICS LAY;Lo;0;L;;;;;N;;;;;
+18BE;CANADIAN SYLLABICS SOY;Lo;0;L;;;;;N;;;;;
+18BF;CANADIAN SYLLABICS SAY;Lo;0;L;;;;;N;;;;;
+18C0;CANADIAN SYLLABICS SHOY;Lo;0;L;;;;;N;;;;;
+18C1;CANADIAN SYLLABICS SHAY;Lo;0;L;;;;;N;;;;;
+18C2;CANADIAN SYLLABICS SHWOY;Lo;0;L;;;;;N;;;;;
+18C3;CANADIAN SYLLABICS YOY;Lo;0;L;;;;;N;;;;;
+18C4;CANADIAN SYLLABICS YAY;Lo;0;L;;;;;N;;;;;
+18C5;CANADIAN SYLLABICS RAY;Lo;0;L;;;;;N;;;;;
+18C6;CANADIAN SYLLABICS NWI;Lo;0;L;;;;;N;;;;;
+18C7;CANADIAN SYLLABICS OJIBWAY NWI;Lo;0;L;;;;;N;;;;;
+18C8;CANADIAN SYLLABICS NWII;Lo;0;L;;;;;N;;;;;
+18C9;CANADIAN SYLLABICS OJIBWAY NWII;Lo;0;L;;;;;N;;;;;
+18CA;CANADIAN SYLLABICS NWO;Lo;0;L;;;;;N;;;;;
+18CB;CANADIAN SYLLABICS OJIBWAY NWO;Lo;0;L;;;;;N;;;;;
+18CC;CANADIAN SYLLABICS NWOO;Lo;0;L;;;;;N;;;;;
+18CD;CANADIAN SYLLABICS OJIBWAY NWOO;Lo;0;L;;;;;N;;;;;
+18CE;CANADIAN SYLLABICS RWEE;Lo;0;L;;;;;N;;;;;
+18CF;CANADIAN SYLLABICS RWI;Lo;0;L;;;;;N;;;;;
+18D0;CANADIAN SYLLABICS RWII;Lo;0;L;;;;;N;;;;;
+18D1;CANADIAN SYLLABICS RWO;Lo;0;L;;;;;N;;;;;
+18D2;CANADIAN SYLLABICS RWOO;Lo;0;L;;;;;N;;;;;
+18D3;CANADIAN SYLLABICS RWA;Lo;0;L;;;;;N;;;;;
+18D4;CANADIAN SYLLABICS OJIBWAY P;Lo;0;L;;;;;N;;;;;
+18D5;CANADIAN SYLLABICS OJIBWAY T;Lo;0;L;;;;;N;;;;;
+18D6;CANADIAN SYLLABICS OJIBWAY K;Lo;0;L;;;;;N;;;;;
+18D7;CANADIAN SYLLABICS OJIBWAY C;Lo;0;L;;;;;N;;;;;
+18D8;CANADIAN SYLLABICS OJIBWAY M;Lo;0;L;;;;;N;;;;;
+18D9;CANADIAN SYLLABICS OJIBWAY N;Lo;0;L;;;;;N;;;;;
+18DA;CANADIAN SYLLABICS OJIBWAY S;Lo;0;L;;;;;N;;;;;
+18DB;CANADIAN SYLLABICS OJIBWAY SH;Lo;0;L;;;;;N;;;;;
+18DC;CANADIAN SYLLABICS EASTERN W;Lo;0;L;;;;;N;;;;;
+18DD;CANADIAN SYLLABICS WESTERN W;Lo;0;L;;;;;N;;;;;
+18DE;CANADIAN SYLLABICS FINAL SMALL RING;Lo;0;L;;;;;N;;;;;
+18DF;CANADIAN SYLLABICS FINAL RAISED DOT;Lo;0;L;;;;;N;;;;;
+18E0;CANADIAN SYLLABICS R-CREE RWE;Lo;0;L;;;;;N;;;;;
+18E1;CANADIAN SYLLABICS WEST-CREE LOO;Lo;0;L;;;;;N;;;;;
+18E2;CANADIAN SYLLABICS WEST-CREE LAA;Lo;0;L;;;;;N;;;;;
+18E3;CANADIAN SYLLABICS THWE;Lo;0;L;;;;;N;;;;;
+18E4;CANADIAN SYLLABICS THWA;Lo;0;L;;;;;N;;;;;
+18E5;CANADIAN SYLLABICS TTHWE;Lo;0;L;;;;;N;;;;;
+18E6;CANADIAN SYLLABICS TTHOO;Lo;0;L;;;;;N;;;;;
+18E7;CANADIAN SYLLABICS TTHAA;Lo;0;L;;;;;N;;;;;
+18E8;CANADIAN SYLLABICS TLHWE;Lo;0;L;;;;;N;;;;;
+18E9;CANADIAN SYLLABICS TLHOO;Lo;0;L;;;;;N;;;;;
+18EA;CANADIAN SYLLABICS SAYISI SHWE;Lo;0;L;;;;;N;;;;;
+18EB;CANADIAN SYLLABICS SAYISI SHOO;Lo;0;L;;;;;N;;;;;
+18EC;CANADIAN SYLLABICS SAYISI HOO;Lo;0;L;;;;;N;;;;;
+18ED;CANADIAN SYLLABICS CARRIER GWU;Lo;0;L;;;;;N;;;;;
+18EE;CANADIAN SYLLABICS CARRIER DENE GEE;Lo;0;L;;;;;N;;;;;
+18EF;CANADIAN SYLLABICS CARRIER GAA;Lo;0;L;;;;;N;;;;;
+18F0;CANADIAN SYLLABICS CARRIER GWA;Lo;0;L;;;;;N;;;;;
+18F1;CANADIAN SYLLABICS SAYISI JUU;Lo;0;L;;;;;N;;;;;
+18F2;CANADIAN SYLLABICS CARRIER JWA;Lo;0;L;;;;;N;;;;;
+18F3;CANADIAN SYLLABICS BEAVER DENE L;Lo;0;L;;;;;N;;;;;
+18F4;CANADIAN SYLLABICS BEAVER DENE R;Lo;0;L;;;;;N;;;;;
+18F5;CANADIAN SYLLABICS CARRIER DENTAL S;Lo;0;L;;;;;N;;;;;
+1900;LIMBU VOWEL-CARRIER LETTER;Lo;0;L;;;;;N;;;;;
+1901;LIMBU LETTER KA;Lo;0;L;;;;;N;;;;;
+1902;LIMBU LETTER KHA;Lo;0;L;;;;;N;;;;;
+1903;LIMBU LETTER GA;Lo;0;L;;;;;N;;;;;
+1904;LIMBU LETTER GHA;Lo;0;L;;;;;N;;;;;
+1905;LIMBU LETTER NGA;Lo;0;L;;;;;N;;;;;
+1906;LIMBU LETTER CA;Lo;0;L;;;;;N;;;;;
+1907;LIMBU LETTER CHA;Lo;0;L;;;;;N;;;;;
+1908;LIMBU LETTER JA;Lo;0;L;;;;;N;;;;;
+1909;LIMBU LETTER JHA;Lo;0;L;;;;;N;;;;;
+190A;LIMBU LETTER YAN;Lo;0;L;;;;;N;;;;;
+190B;LIMBU LETTER TA;Lo;0;L;;;;;N;;;;;
+190C;LIMBU LETTER THA;Lo;0;L;;;;;N;;;;;
+190D;LIMBU LETTER DA;Lo;0;L;;;;;N;;;;;
+190E;LIMBU LETTER DHA;Lo;0;L;;;;;N;;;;;
+190F;LIMBU LETTER NA;Lo;0;L;;;;;N;;;;;
+1910;LIMBU LETTER PA;Lo;0;L;;;;;N;;;;;
+1911;LIMBU LETTER PHA;Lo;0;L;;;;;N;;;;;
+1912;LIMBU LETTER BA;Lo;0;L;;;;;N;;;;;
+1913;LIMBU LETTER BHA;Lo;0;L;;;;;N;;;;;
+1914;LIMBU LETTER MA;Lo;0;L;;;;;N;;;;;
+1915;LIMBU LETTER YA;Lo;0;L;;;;;N;;;;;
+1916;LIMBU LETTER RA;Lo;0;L;;;;;N;;;;;
+1917;LIMBU LETTER LA;Lo;0;L;;;;;N;;;;;
+1918;LIMBU LETTER WA;Lo;0;L;;;;;N;;;;;
+1919;LIMBU LETTER SHA;Lo;0;L;;;;;N;;;;;
+191A;LIMBU LETTER SSA;Lo;0;L;;;;;N;;;;;
+191B;LIMBU LETTER SA;Lo;0;L;;;;;N;;;;;
+191C;LIMBU LETTER HA;Lo;0;L;;;;;N;;;;;
+191D;LIMBU LETTER GYAN;Lo;0;L;;;;;N;;;;;
+191E;LIMBU LETTER TRA;Lo;0;L;;;;;N;;;;;
+1920;LIMBU VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;;
+1921;LIMBU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1922;LIMBU VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1923;LIMBU VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+1924;LIMBU VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+1925;LIMBU VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+1926;LIMBU VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+1927;LIMBU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+1928;LIMBU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+1929;LIMBU SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;;
+192A;LIMBU SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;;
+192B;LIMBU SUBJOINED LETTER WA;Mc;0;L;;;;;N;;;;;
+1930;LIMBU SMALL LETTER KA;Mc;0;L;;;;;N;;;;;
+1931;LIMBU SMALL LETTER NGA;Mc;0;L;;;;;N;;;;;
+1932;LIMBU SMALL LETTER ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+1933;LIMBU SMALL LETTER TA;Mc;0;L;;;;;N;;;;;
+1934;LIMBU SMALL LETTER NA;Mc;0;L;;;;;N;;;;;
+1935;LIMBU SMALL LETTER PA;Mc;0;L;;;;;N;;;;;
+1936;LIMBU SMALL LETTER MA;Mc;0;L;;;;;N;;;;;
+1937;LIMBU SMALL LETTER RA;Mc;0;L;;;;;N;;;;;
+1938;LIMBU SMALL LETTER LA;Mc;0;L;;;;;N;;;;;
+1939;LIMBU SIGN MUKPHRENG;Mn;222;NSM;;;;;N;;;;;
+193A;LIMBU SIGN KEMPHRENG;Mn;230;NSM;;;;;N;;;;;
+193B;LIMBU SIGN SA-I;Mn;220;NSM;;;;;N;;;;;
+1940;LIMBU SIGN LOO;So;0;ON;;;;;N;;;;;
+1944;LIMBU EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+1945;LIMBU QUESTION MARK;Po;0;ON;;;;;N;;;;;
+1946;LIMBU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1947;LIMBU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1948;LIMBU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1949;LIMBU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+194A;LIMBU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+194B;LIMBU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+194C;LIMBU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+194D;LIMBU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+194E;LIMBU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+194F;LIMBU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1950;TAI LE LETTER KA;Lo;0;L;;;;;N;;;;;
+1951;TAI LE LETTER XA;Lo;0;L;;;;;N;;;;;
+1952;TAI LE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1953;TAI LE LETTER TSA;Lo;0;L;;;;;N;;;;;
+1954;TAI LE LETTER SA;Lo;0;L;;;;;N;;;;;
+1955;TAI LE LETTER YA;Lo;0;L;;;;;N;;;;;
+1956;TAI LE LETTER TA;Lo;0;L;;;;;N;;;;;
+1957;TAI LE LETTER THA;Lo;0;L;;;;;N;;;;;
+1958;TAI LE LETTER LA;Lo;0;L;;;;;N;;;;;
+1959;TAI LE LETTER PA;Lo;0;L;;;;;N;;;;;
+195A;TAI LE LETTER PHA;Lo;0;L;;;;;N;;;;;
+195B;TAI LE LETTER MA;Lo;0;L;;;;;N;;;;;
+195C;TAI LE LETTER FA;Lo;0;L;;;;;N;;;;;
+195D;TAI LE LETTER VA;Lo;0;L;;;;;N;;;;;
+195E;TAI LE LETTER HA;Lo;0;L;;;;;N;;;;;
+195F;TAI LE LETTER QA;Lo;0;L;;;;;N;;;;;
+1960;TAI LE LETTER KHA;Lo;0;L;;;;;N;;;;;
+1961;TAI LE LETTER TSHA;Lo;0;L;;;;;N;;;;;
+1962;TAI LE LETTER NA;Lo;0;L;;;;;N;;;;;
+1963;TAI LE LETTER A;Lo;0;L;;;;;N;;;;;
+1964;TAI LE LETTER I;Lo;0;L;;;;;N;;;;;
+1965;TAI LE LETTER EE;Lo;0;L;;;;;N;;;;;
+1966;TAI LE LETTER EH;Lo;0;L;;;;;N;;;;;
+1967;TAI LE LETTER U;Lo;0;L;;;;;N;;;;;
+1968;TAI LE LETTER OO;Lo;0;L;;;;;N;;;;;
+1969;TAI LE LETTER O;Lo;0;L;;;;;N;;;;;
+196A;TAI LE LETTER UE;Lo;0;L;;;;;N;;;;;
+196B;TAI LE LETTER E;Lo;0;L;;;;;N;;;;;
+196C;TAI LE LETTER AUE;Lo;0;L;;;;;N;;;;;
+196D;TAI LE LETTER AI;Lo;0;L;;;;;N;;;;;
+1970;TAI LE LETTER TONE-2;Lo;0;L;;;;;N;;;;;
+1971;TAI LE LETTER TONE-3;Lo;0;L;;;;;N;;;;;
+1972;TAI LE LETTER TONE-4;Lo;0;L;;;;;N;;;;;
+1973;TAI LE LETTER TONE-5;Lo;0;L;;;;;N;;;;;
+1974;TAI LE LETTER TONE-6;Lo;0;L;;;;;N;;;;;
+1980;NEW TAI LUE LETTER HIGH QA;Lo;0;L;;;;;N;;;;;
+1981;NEW TAI LUE LETTER LOW QA;Lo;0;L;;;;;N;;;;;
+1982;NEW TAI LUE LETTER HIGH KA;Lo;0;L;;;;;N;;;;;
+1983;NEW TAI LUE LETTER HIGH XA;Lo;0;L;;;;;N;;;;;
+1984;NEW TAI LUE LETTER HIGH NGA;Lo;0;L;;;;;N;;;;;
+1985;NEW TAI LUE LETTER LOW KA;Lo;0;L;;;;;N;;;;;
+1986;NEW TAI LUE LETTER LOW XA;Lo;0;L;;;;;N;;;;;
+1987;NEW TAI LUE LETTER LOW NGA;Lo;0;L;;;;;N;;;;;
+1988;NEW TAI LUE LETTER HIGH TSA;Lo;0;L;;;;;N;;;;;
+1989;NEW TAI LUE LETTER HIGH SA;Lo;0;L;;;;;N;;;;;
+198A;NEW TAI LUE LETTER HIGH YA;Lo;0;L;;;;;N;;;;;
+198B;NEW TAI LUE LETTER LOW TSA;Lo;0;L;;;;;N;;;;;
+198C;NEW TAI LUE LETTER LOW SA;Lo;0;L;;;;;N;;;;;
+198D;NEW TAI LUE LETTER LOW YA;Lo;0;L;;;;;N;;;;;
+198E;NEW TAI LUE LETTER HIGH TA;Lo;0;L;;;;;N;;;;;
+198F;NEW TAI LUE LETTER HIGH THA;Lo;0;L;;;;;N;;;;;
+1990;NEW TAI LUE LETTER HIGH NA;Lo;0;L;;;;;N;;;;;
+1991;NEW TAI LUE LETTER LOW TA;Lo;0;L;;;;;N;;;;;
+1992;NEW TAI LUE LETTER LOW THA;Lo;0;L;;;;;N;;;;;
+1993;NEW TAI LUE LETTER LOW NA;Lo;0;L;;;;;N;;;;;
+1994;NEW TAI LUE LETTER HIGH PA;Lo;0;L;;;;;N;;;;;
+1995;NEW TAI LUE LETTER HIGH PHA;Lo;0;L;;;;;N;;;;;
+1996;NEW TAI LUE LETTER HIGH MA;Lo;0;L;;;;;N;;;;;
+1997;NEW TAI LUE LETTER LOW PA;Lo;0;L;;;;;N;;;;;
+1998;NEW TAI LUE LETTER LOW PHA;Lo;0;L;;;;;N;;;;;
+1999;NEW TAI LUE LETTER LOW MA;Lo;0;L;;;;;N;;;;;
+199A;NEW TAI LUE LETTER HIGH FA;Lo;0;L;;;;;N;;;;;
+199B;NEW TAI LUE LETTER HIGH VA;Lo;0;L;;;;;N;;;;;
+199C;NEW TAI LUE LETTER HIGH LA;Lo;0;L;;;;;N;;;;;
+199D;NEW TAI LUE LETTER LOW FA;Lo;0;L;;;;;N;;;;;
+199E;NEW TAI LUE LETTER LOW VA;Lo;0;L;;;;;N;;;;;
+199F;NEW TAI LUE LETTER LOW LA;Lo;0;L;;;;;N;;;;;
+19A0;NEW TAI LUE LETTER HIGH HA;Lo;0;L;;;;;N;;;;;
+19A1;NEW TAI LUE LETTER HIGH DA;Lo;0;L;;;;;N;;;;;
+19A2;NEW TAI LUE LETTER HIGH BA;Lo;0;L;;;;;N;;;;;
+19A3;NEW TAI LUE LETTER LOW HA;Lo;0;L;;;;;N;;;;;
+19A4;NEW TAI LUE LETTER LOW DA;Lo;0;L;;;;;N;;;;;
+19A5;NEW TAI LUE LETTER LOW BA;Lo;0;L;;;;;N;;;;;
+19A6;NEW TAI LUE LETTER HIGH KVA;Lo;0;L;;;;;N;;;;;
+19A7;NEW TAI LUE LETTER HIGH XVA;Lo;0;L;;;;;N;;;;;
+19A8;NEW TAI LUE LETTER LOW KVA;Lo;0;L;;;;;N;;;;;
+19A9;NEW TAI LUE LETTER LOW XVA;Lo;0;L;;;;;N;;;;;
+19AA;NEW TAI LUE LETTER HIGH SUA;Lo;0;L;;;;;N;;;;;
+19AB;NEW TAI LUE LETTER LOW SUA;Lo;0;L;;;;;N;;;;;
+19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Lo;0;L;;;;;N;;;;;
+19B1;NEW TAI LUE VOWEL SIGN AA;Lo;0;L;;;;;N;;;;;
+19B2;NEW TAI LUE VOWEL SIGN II;Lo;0;L;;;;;N;;;;;
+19B3;NEW TAI LUE VOWEL SIGN U;Lo;0;L;;;;;N;;;;;
+19B4;NEW TAI LUE VOWEL SIGN UU;Lo;0;L;;;;;N;;;;;
+19B5;NEW TAI LUE VOWEL SIGN E;Lo;0;L;;;;;N;;;;;
+19B6;NEW TAI LUE VOWEL SIGN AE;Lo;0;L;;;;;N;;;;;
+19B7;NEW TAI LUE VOWEL SIGN O;Lo;0;L;;;;;N;;;;;
+19B8;NEW TAI LUE VOWEL SIGN OA;Lo;0;L;;;;;N;;;;;
+19B9;NEW TAI LUE VOWEL SIGN UE;Lo;0;L;;;;;N;;;;;
+19BA;NEW TAI LUE VOWEL SIGN AY;Lo;0;L;;;;;N;;;;;
+19BB;NEW TAI LUE VOWEL SIGN AAY;Lo;0;L;;;;;N;;;;;
+19BC;NEW TAI LUE VOWEL SIGN UY;Lo;0;L;;;;;N;;;;;
+19BD;NEW TAI LUE VOWEL SIGN OY;Lo;0;L;;;;;N;;;;;
+19BE;NEW TAI LUE VOWEL SIGN OAY;Lo;0;L;;;;;N;;;;;
+19BF;NEW TAI LUE VOWEL SIGN UEY;Lo;0;L;;;;;N;;;;;
+19C0;NEW TAI LUE VOWEL SIGN IY;Lo;0;L;;;;;N;;;;;
+19C1;NEW TAI LUE LETTER FINAL V;Lo;0;L;;;;;N;;;;;
+19C2;NEW TAI LUE LETTER FINAL NG;Lo;0;L;;;;;N;;;;;
+19C3;NEW TAI LUE LETTER FINAL N;Lo;0;L;;;;;N;;;;;
+19C4;NEW TAI LUE LETTER FINAL M;Lo;0;L;;;;;N;;;;;
+19C5;NEW TAI LUE LETTER FINAL K;Lo;0;L;;;;;N;;;;;
+19C6;NEW TAI LUE LETTER FINAL D;Lo;0;L;;;;;N;;;;;
+19C7;NEW TAI LUE LETTER FINAL B;Lo;0;L;;;;;N;;;;;
+19C8;NEW TAI LUE TONE MARK-1;Lo;0;L;;;;;N;;;;;
+19C9;NEW TAI LUE TONE MARK-2;Lo;0;L;;;;;N;;;;;
+19D0;NEW TAI LUE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+19D1;NEW TAI LUE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+19D2;NEW TAI LUE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+19D3;NEW TAI LUE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+19D4;NEW TAI LUE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+19D5;NEW TAI LUE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+19D6;NEW TAI LUE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+19D7;NEW TAI LUE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+19D8;NEW TAI LUE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+19D9;NEW TAI LUE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+19DA;NEW TAI LUE THAM DIGIT ONE;No;0;L;;;1;1;N;;;;;
+19DE;NEW TAI LUE SIGN LAE;So;0;ON;;;;;N;;;;;
+19DF;NEW TAI LUE SIGN LAEV;So;0;ON;;;;;N;;;;;
+19E0;KHMER SYMBOL PATHAMASAT;So;0;ON;;;;;N;;;;;
+19E1;KHMER SYMBOL MUOY KOET;So;0;ON;;;;;N;;;;;
+19E2;KHMER SYMBOL PII KOET;So;0;ON;;;;;N;;;;;
+19E3;KHMER SYMBOL BEI KOET;So;0;ON;;;;;N;;;;;
+19E4;KHMER SYMBOL BUON KOET;So;0;ON;;;;;N;;;;;
+19E5;KHMER SYMBOL PRAM KOET;So;0;ON;;;;;N;;;;;
+19E6;KHMER SYMBOL PRAM-MUOY KOET;So;0;ON;;;;;N;;;;;
+19E7;KHMER SYMBOL PRAM-PII KOET;So;0;ON;;;;;N;;;;;
+19E8;KHMER SYMBOL PRAM-BEI KOET;So;0;ON;;;;;N;;;;;
+19E9;KHMER SYMBOL PRAM-BUON KOET;So;0;ON;;;;;N;;;;;
+19EA;KHMER SYMBOL DAP KOET;So;0;ON;;;;;N;;;;;
+19EB;KHMER SYMBOL DAP-MUOY KOET;So;0;ON;;;;;N;;;;;
+19EC;KHMER SYMBOL DAP-PII KOET;So;0;ON;;;;;N;;;;;
+19ED;KHMER SYMBOL DAP-BEI KOET;So;0;ON;;;;;N;;;;;
+19EE;KHMER SYMBOL DAP-BUON KOET;So;0;ON;;;;;N;;;;;
+19EF;KHMER SYMBOL DAP-PRAM KOET;So;0;ON;;;;;N;;;;;
+19F0;KHMER SYMBOL TUTEYASAT;So;0;ON;;;;;N;;;;;
+19F1;KHMER SYMBOL MUOY ROC;So;0;ON;;;;;N;;;;;
+19F2;KHMER SYMBOL PII ROC;So;0;ON;;;;;N;;;;;
+19F3;KHMER SYMBOL BEI ROC;So;0;ON;;;;;N;;;;;
+19F4;KHMER SYMBOL BUON ROC;So;0;ON;;;;;N;;;;;
+19F5;KHMER SYMBOL PRAM ROC;So;0;ON;;;;;N;;;;;
+19F6;KHMER SYMBOL PRAM-MUOY ROC;So;0;ON;;;;;N;;;;;
+19F7;KHMER SYMBOL PRAM-PII ROC;So;0;ON;;;;;N;;;;;
+19F8;KHMER SYMBOL PRAM-BEI ROC;So;0;ON;;;;;N;;;;;
+19F9;KHMER SYMBOL PRAM-BUON ROC;So;0;ON;;;;;N;;;;;
+19FA;KHMER SYMBOL DAP ROC;So;0;ON;;;;;N;;;;;
+19FB;KHMER SYMBOL DAP-MUOY ROC;So;0;ON;;;;;N;;;;;
+19FC;KHMER SYMBOL DAP-PII ROC;So;0;ON;;;;;N;;;;;
+19FD;KHMER SYMBOL DAP-BEI ROC;So;0;ON;;;;;N;;;;;
+19FE;KHMER SYMBOL DAP-BUON ROC;So;0;ON;;;;;N;;;;;
+19FF;KHMER SYMBOL DAP-PRAM ROC;So;0;ON;;;;;N;;;;;
+1A00;BUGINESE LETTER KA;Lo;0;L;;;;;N;;;;;
+1A01;BUGINESE LETTER GA;Lo;0;L;;;;;N;;;;;
+1A02;BUGINESE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1A03;BUGINESE LETTER NGKA;Lo;0;L;;;;;N;;;;;
+1A04;BUGINESE LETTER PA;Lo;0;L;;;;;N;;;;;
+1A05;BUGINESE LETTER BA;Lo;0;L;;;;;N;;;;;
+1A06;BUGINESE LETTER MA;Lo;0;L;;;;;N;;;;;
+1A07;BUGINESE LETTER MPA;Lo;0;L;;;;;N;;;;;
+1A08;BUGINESE LETTER TA;Lo;0;L;;;;;N;;;;;
+1A09;BUGINESE LETTER DA;Lo;0;L;;;;;N;;;;;
+1A0A;BUGINESE LETTER NA;Lo;0;L;;;;;N;;;;;
+1A0B;BUGINESE LETTER NRA;Lo;0;L;;;;;N;;;;;
+1A0C;BUGINESE LETTER CA;Lo;0;L;;;;;N;;;;;
+1A0D;BUGINESE LETTER JA;Lo;0;L;;;;;N;;;;;
+1A0E;BUGINESE LETTER NYA;Lo;0;L;;;;;N;;;;;
+1A0F;BUGINESE LETTER NYCA;Lo;0;L;;;;;N;;;;;
+1A10;BUGINESE LETTER YA;Lo;0;L;;;;;N;;;;;
+1A11;BUGINESE LETTER RA;Lo;0;L;;;;;N;;;;;
+1A12;BUGINESE LETTER LA;Lo;0;L;;;;;N;;;;;
+1A13;BUGINESE LETTER VA;Lo;0;L;;;;;N;;;;;
+1A14;BUGINESE LETTER SA;Lo;0;L;;;;;N;;;;;
+1A15;BUGINESE LETTER A;Lo;0;L;;;;;N;;;;;
+1A16;BUGINESE LETTER HA;Lo;0;L;;;;;N;;;;;
+1A17;BUGINESE VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;;
+1A18;BUGINESE VOWEL SIGN U;Mn;220;NSM;;;;;N;;;;;
+1A19;BUGINESE VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+1A1A;BUGINESE VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+1A1B;BUGINESE VOWEL SIGN AE;Mn;0;NSM;;;;;N;;;;;
+1A1E;BUGINESE PALLAWA;Po;0;L;;;;;N;;;;;
+1A1F;BUGINESE END OF SECTION;Po;0;L;;;;;N;;;;;
+1A20;TAI THAM LETTER HIGH KA;Lo;0;L;;;;;N;;;;;
+1A21;TAI THAM LETTER HIGH KHA;Lo;0;L;;;;;N;;;;;
+1A22;TAI THAM LETTER HIGH KXA;Lo;0;L;;;;;N;;;;;
+1A23;TAI THAM LETTER LOW KA;Lo;0;L;;;;;N;;;;;
+1A24;TAI THAM LETTER LOW KXA;Lo;0;L;;;;;N;;;;;
+1A25;TAI THAM LETTER LOW KHA;Lo;0;L;;;;;N;;;;;
+1A26;TAI THAM LETTER NGA;Lo;0;L;;;;;N;;;;;
+1A27;TAI THAM LETTER HIGH CA;Lo;0;L;;;;;N;;;;;
+1A28;TAI THAM LETTER HIGH CHA;Lo;0;L;;;;;N;;;;;
+1A29;TAI THAM LETTER LOW CA;Lo;0;L;;;;;N;;;;;
+1A2A;TAI THAM LETTER LOW SA;Lo;0;L;;;;;N;;;;;
+1A2B;TAI THAM LETTER LOW CHA;Lo;0;L;;;;;N;;;;;
+1A2C;TAI THAM LETTER NYA;Lo;0;L;;;;;N;;;;;
+1A2D;TAI THAM LETTER RATA;Lo;0;L;;;;;N;;;;;
+1A2E;TAI THAM LETTER HIGH RATHA;Lo;0;L;;;;;N;;;;;
+1A2F;TAI THAM LETTER DA;Lo;0;L;;;;;N;;;;;
+1A30;TAI THAM LETTER LOW RATHA;Lo;0;L;;;;;N;;;;;
+1A31;TAI THAM LETTER RANA;Lo;0;L;;;;;N;;;;;
+1A32;TAI THAM LETTER HIGH TA;Lo;0;L;;;;;N;;;;;
+1A33;TAI THAM LETTER HIGH THA;Lo;0;L;;;;;N;;;;;
+1A34;TAI THAM LETTER LOW TA;Lo;0;L;;;;;N;;;;;
+1A35;TAI THAM LETTER LOW THA;Lo;0;L;;;;;N;;;;;
+1A36;TAI THAM LETTER NA;Lo;0;L;;;;;N;;;;;
+1A37;TAI THAM LETTER BA;Lo;0;L;;;;;N;;;;;
+1A38;TAI THAM LETTER HIGH PA;Lo;0;L;;;;;N;;;;;
+1A39;TAI THAM LETTER HIGH PHA;Lo;0;L;;;;;N;;;;;
+1A3A;TAI THAM LETTER HIGH FA;Lo;0;L;;;;;N;;;;;
+1A3B;TAI THAM LETTER LOW PA;Lo;0;L;;;;;N;;;;;
+1A3C;TAI THAM LETTER LOW FA;Lo;0;L;;;;;N;;;;;
+1A3D;TAI THAM LETTER LOW PHA;Lo;0;L;;;;;N;;;;;
+1A3E;TAI THAM LETTER MA;Lo;0;L;;;;;N;;;;;
+1A3F;TAI THAM LETTER LOW YA;Lo;0;L;;;;;N;;;;;
+1A40;TAI THAM LETTER HIGH YA;Lo;0;L;;;;;N;;;;;
+1A41;TAI THAM LETTER RA;Lo;0;L;;;;;N;;;;;
+1A42;TAI THAM LETTER RUE;Lo;0;L;;;;;N;;;;;
+1A43;TAI THAM LETTER LA;Lo;0;L;;;;;N;;;;;
+1A44;TAI THAM LETTER LUE;Lo;0;L;;;;;N;;;;;
+1A45;TAI THAM LETTER WA;Lo;0;L;;;;;N;;;;;
+1A46;TAI THAM LETTER HIGH SHA;Lo;0;L;;;;;N;;;;;
+1A47;TAI THAM LETTER HIGH SSA;Lo;0;L;;;;;N;;;;;
+1A48;TAI THAM LETTER HIGH SA;Lo;0;L;;;;;N;;;;;
+1A49;TAI THAM LETTER HIGH HA;Lo;0;L;;;;;N;;;;;
+1A4A;TAI THAM LETTER LLA;Lo;0;L;;;;;N;;;;;
+1A4B;TAI THAM LETTER A;Lo;0;L;;;;;N;;;;;
+1A4C;TAI THAM LETTER LOW HA;Lo;0;L;;;;;N;;;;;
+1A4D;TAI THAM LETTER I;Lo;0;L;;;;;N;;;;;
+1A4E;TAI THAM LETTER II;Lo;0;L;;;;;N;;;;;
+1A4F;TAI THAM LETTER U;Lo;0;L;;;;;N;;;;;
+1A50;TAI THAM LETTER UU;Lo;0;L;;;;;N;;;;;
+1A51;TAI THAM LETTER EE;Lo;0;L;;;;;N;;;;;
+1A52;TAI THAM LETTER OO;Lo;0;L;;;;;N;;;;;
+1A53;TAI THAM LETTER LAE;Lo;0;L;;;;;N;;;;;
+1A54;TAI THAM LETTER GREAT SA;Lo;0;L;;;;;N;;;;;
+1A55;TAI THAM CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;;
+1A56;TAI THAM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;;
+1A57;TAI THAM CONSONANT SIGN LA TANG LAI;Mc;0;L;;;;;N;;;;;
+1A58;TAI THAM SIGN MAI KANG LAI;Mn;0;NSM;;;;;N;;;;;
+1A59;TAI THAM CONSONANT SIGN FINAL NGA;Mn;0;NSM;;;;;N;;;;;
+1A5A;TAI THAM CONSONANT SIGN LOW PA;Mn;0;NSM;;;;;N;;;;;
+1A5B;TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA;Mn;0;NSM;;;;;N;;;;;
+1A5C;TAI THAM CONSONANT SIGN MA;Mn;0;NSM;;;;;N;;;;;
+1A5D;TAI THAM CONSONANT SIGN BA;Mn;0;NSM;;;;;N;;;;;
+1A5E;TAI THAM CONSONANT SIGN SA;Mn;0;NSM;;;;;N;;;;;
+1A60;TAI THAM SIGN SAKOT;Mn;9;NSM;;;;;N;;;;;
+1A61;TAI THAM VOWEL SIGN A;Mc;0;L;;;;;N;;;;;
+1A62;TAI THAM VOWEL SIGN MAI SAT;Mn;0;NSM;;;;;N;;;;;
+1A63;TAI THAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+1A64;TAI THAM VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;;
+1A65;TAI THAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1A66;TAI THAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+1A67;TAI THAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;;
+1A68;TAI THAM VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;;
+1A69;TAI THAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1A6A;TAI THAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+1A6B;TAI THAM VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+1A6C;TAI THAM VOWEL SIGN OA BELOW;Mn;0;NSM;;;;;N;;;;;
+1A6D;TAI THAM VOWEL SIGN OY;Mc;0;L;;;;;N;;;;;
+1A6E;TAI THAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+1A6F;TAI THAM VOWEL SIGN AE;Mc;0;L;;;;;N;;;;;
+1A70;TAI THAM VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+1A71;TAI THAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+1A72;TAI THAM VOWEL SIGN THAM AI;Mc;0;L;;;;;N;;;;;
+1A73;TAI THAM VOWEL SIGN OA ABOVE;Mn;0;NSM;;;;;N;;;;;
+1A74;TAI THAM SIGN MAI KANG;Mn;0;NSM;;;;;N;;;;;
+1A75;TAI THAM SIGN TONE-1;Mn;230;NSM;;;;;N;;;;;
+1A76;TAI THAM SIGN TONE-2;Mn;230;NSM;;;;;N;;;;;
+1A77;TAI THAM SIGN KHUEN TONE-3;Mn;230;NSM;;;;;N;;;;;
+1A78;TAI THAM SIGN KHUEN TONE-4;Mn;230;NSM;;;;;N;;;;;
+1A79;TAI THAM SIGN KHUEN TONE-5;Mn;230;NSM;;;;;N;;;;;
+1A7A;TAI THAM SIGN RA HAAM;Mn;230;NSM;;;;;N;;;;;
+1A7B;TAI THAM SIGN MAI SAM;Mn;230;NSM;;;;;N;;;;;
+1A7C;TAI THAM SIGN KHUEN-LUE KARAN;Mn;230;NSM;;;;;N;;;;;
+1A7F;TAI THAM COMBINING CRYPTOGRAMMIC DOT;Mn;220;NSM;;;;;N;;;;;
+1A80;TAI THAM HORA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1A81;TAI THAM HORA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1A82;TAI THAM HORA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1A83;TAI THAM HORA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1A84;TAI THAM HORA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1A85;TAI THAM HORA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1A86;TAI THAM HORA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1A87;TAI THAM HORA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1A88;TAI THAM HORA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1A89;TAI THAM HORA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1A90;TAI THAM THAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1A91;TAI THAM THAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1A92;TAI THAM THAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1A93;TAI THAM THAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1A94;TAI THAM THAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1A95;TAI THAM THAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1A96;TAI THAM THAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1A97;TAI THAM THAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1A98;TAI THAM THAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1A99;TAI THAM THAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1AA0;TAI THAM SIGN WIANG;Po;0;L;;;;;N;;;;;
+1AA1;TAI THAM SIGN WIANGWAAK;Po;0;L;;;;;N;;;;;
+1AA2;TAI THAM SIGN SAWAN;Po;0;L;;;;;N;;;;;
+1AA3;TAI THAM SIGN KEOW;Po;0;L;;;;;N;;;;;
+1AA4;TAI THAM SIGN HOY;Po;0;L;;;;;N;;;;;
+1AA5;TAI THAM SIGN DOKMAI;Po;0;L;;;;;N;;;;;
+1AA6;TAI THAM SIGN REVERSED ROTATED RANA;Po;0;L;;;;;N;;;;;
+1AA7;TAI THAM SIGN MAI YAMOK;Lm;0;L;;;;;N;;;;;
+1AA8;TAI THAM SIGN KAAN;Po;0;L;;;;;N;;;;;
+1AA9;TAI THAM SIGN KAANKUU;Po;0;L;;;;;N;;;;;
+1AAA;TAI THAM SIGN SATKAAN;Po;0;L;;;;;N;;;;;
+1AAB;TAI THAM SIGN SATKAANKUU;Po;0;L;;;;;N;;;;;
+1AAC;TAI THAM SIGN HANG;Po;0;L;;;;;N;;;;;
+1AAD;TAI THAM SIGN CAANG;Po;0;L;;;;;N;;;;;
+1AB0;COMBINING DOUBLED CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;;;;;
+1AB1;COMBINING DIAERESIS-RING;Mn;230;NSM;;;;;N;;;;;
+1AB2;COMBINING INFINITY;Mn;230;NSM;;;;;N;;;;;
+1AB3;COMBINING DOWNWARDS ARROW;Mn;230;NSM;;;;;N;;;;;
+1AB4;COMBINING TRIPLE DOT;Mn;230;NSM;;;;;N;;;;;
+1AB5;COMBINING X-X BELOW;Mn;220;NSM;;;;;N;;;;;
+1AB6;COMBINING WIGGLY LINE BELOW;Mn;220;NSM;;;;;N;;;;;
+1AB7;COMBINING OPEN MARK BELOW;Mn;220;NSM;;;;;N;;;;;
+1AB8;COMBINING DOUBLE OPEN MARK BELOW;Mn;220;NSM;;;;;N;;;;;
+1AB9;COMBINING LIGHT CENTRALIZATION STROKE BELOW;Mn;220;NSM;;;;;N;;;;;
+1ABA;COMBINING STRONG CENTRALIZATION STROKE BELOW;Mn;220;NSM;;;;;N;;;;;
+1ABB;COMBINING PARENTHESES ABOVE;Mn;230;NSM;;;;;N;;;;;
+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;;;;;
+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;;;;;
+1B03;BALINESE SIGN SURANG;Mn;0;NSM;;;;;N;;;;;
+1B04;BALINESE SIGN BISAH;Mc;0;L;;;;;N;;;;;
+1B05;BALINESE LETTER AKARA;Lo;0;L;;;;;N;;;;;
+1B06;BALINESE LETTER AKARA TEDUNG;Lo;0;L;1B05 1B35;;;;N;;;;;
+1B07;BALINESE LETTER IKARA;Lo;0;L;;;;;N;;;;;
+1B08;BALINESE LETTER IKARA TEDUNG;Lo;0;L;1B07 1B35;;;;N;;;;;
+1B09;BALINESE LETTER UKARA;Lo;0;L;;;;;N;;;;;
+1B0A;BALINESE LETTER UKARA TEDUNG;Lo;0;L;1B09 1B35;;;;N;;;;;
+1B0B;BALINESE LETTER RA REPA;Lo;0;L;;;;;N;;;;;
+1B0C;BALINESE LETTER RA REPA TEDUNG;Lo;0;L;1B0B 1B35;;;;N;;;;;
+1B0D;BALINESE LETTER LA LENGA;Lo;0;L;;;;;N;;;;;
+1B0E;BALINESE LETTER LA LENGA TEDUNG;Lo;0;L;1B0D 1B35;;;;N;;;;;
+1B0F;BALINESE LETTER EKARA;Lo;0;L;;;;;N;;;;;
+1B10;BALINESE LETTER AIKARA;Lo;0;L;;;;;N;;;;;
+1B11;BALINESE LETTER OKARA;Lo;0;L;;;;;N;;;;;
+1B12;BALINESE LETTER OKARA TEDUNG;Lo;0;L;1B11 1B35;;;;N;;;;;
+1B13;BALINESE LETTER KA;Lo;0;L;;;;;N;;;;;
+1B14;BALINESE LETTER KA MAHAPRANA;Lo;0;L;;;;;N;;;;;
+1B15;BALINESE LETTER GA;Lo;0;L;;;;;N;;;;;
+1B16;BALINESE LETTER GA GORA;Lo;0;L;;;;;N;;;;;
+1B17;BALINESE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1B18;BALINESE LETTER CA;Lo;0;L;;;;;N;;;;;
+1B19;BALINESE LETTER CA LACA;Lo;0;L;;;;;N;;;;;
+1B1A;BALINESE LETTER JA;Lo;0;L;;;;;N;;;;;
+1B1B;BALINESE LETTER JA JERA;Lo;0;L;;;;;N;;;;;
+1B1C;BALINESE LETTER NYA;Lo;0;L;;;;;N;;;;;
+1B1D;BALINESE LETTER TA LATIK;Lo;0;L;;;;;N;;;;;
+1B1E;BALINESE LETTER TA MURDA MAHAPRANA;Lo;0;L;;;;;N;;;;;
+1B1F;BALINESE LETTER DA MURDA ALPAPRANA;Lo;0;L;;;;;N;;;;;
+1B20;BALINESE LETTER DA MURDA MAHAPRANA;Lo;0;L;;;;;N;;;;;
+1B21;BALINESE LETTER NA RAMBAT;Lo;0;L;;;;;N;;;;;
+1B22;BALINESE LETTER TA;Lo;0;L;;;;;N;;;;;
+1B23;BALINESE LETTER TA TAWA;Lo;0;L;;;;;N;;;;;
+1B24;BALINESE LETTER DA;Lo;0;L;;;;;N;;;;;
+1B25;BALINESE LETTER DA MADU;Lo;0;L;;;;;N;;;;;
+1B26;BALINESE LETTER NA;Lo;0;L;;;;;N;;;;;
+1B27;BALINESE LETTER PA;Lo;0;L;;;;;N;;;;;
+1B28;BALINESE LETTER PA KAPAL;Lo;0;L;;;;;N;;;;;
+1B29;BALINESE LETTER BA;Lo;0;L;;;;;N;;;;;
+1B2A;BALINESE LETTER BA KEMBANG;Lo;0;L;;;;;N;;;;;
+1B2B;BALINESE LETTER MA;Lo;0;L;;;;;N;;;;;
+1B2C;BALINESE LETTER YA;Lo;0;L;;;;;N;;;;;
+1B2D;BALINESE LETTER RA;Lo;0;L;;;;;N;;;;;
+1B2E;BALINESE LETTER LA;Lo;0;L;;;;;N;;;;;
+1B2F;BALINESE LETTER WA;Lo;0;L;;;;;N;;;;;
+1B30;BALINESE LETTER SA SAGA;Lo;0;L;;;;;N;;;;;
+1B31;BALINESE LETTER SA SAPA;Lo;0;L;;;;;N;;;;;
+1B32;BALINESE LETTER SA;Lo;0;L;;;;;N;;;;;
+1B33;BALINESE LETTER HA;Lo;0;L;;;;;N;;;;;
+1B34;BALINESE SIGN REREKAN;Mn;7;NSM;;;;;N;;;;;
+1B35;BALINESE VOWEL SIGN TEDUNG;Mc;0;L;;;;;N;;;;;
+1B36;BALINESE VOWEL SIGN ULU;Mn;0;NSM;;;;;N;;;;;
+1B37;BALINESE VOWEL SIGN ULU SARI;Mn;0;NSM;;;;;N;;;;;
+1B38;BALINESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;;
+1B39;BALINESE VOWEL SIGN SUKU ILUT;Mn;0;NSM;;;;;N;;;;;
+1B3A;BALINESE VOWEL SIGN RA REPA;Mn;0;NSM;;;;;N;;;;;
+1B3B;BALINESE VOWEL SIGN RA REPA TEDUNG;Mc;0;L;1B3A 1B35;;;;N;;;;;
+1B3C;BALINESE VOWEL SIGN LA LENGA;Mn;0;NSM;;;;;N;;;;;
+1B3D;BALINESE VOWEL SIGN LA LENGA TEDUNG;Mc;0;L;1B3C 1B35;;;;N;;;;;
+1B3E;BALINESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;;
+1B3F;BALINESE VOWEL SIGN TALING REPA;Mc;0;L;;;;;N;;;;;
+1B40;BALINESE VOWEL SIGN TALING TEDUNG;Mc;0;L;1B3E 1B35;;;;N;;;;;
+1B41;BALINESE VOWEL SIGN TALING REPA TEDUNG;Mc;0;L;1B3F 1B35;;;;N;;;;;
+1B42;BALINESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;;
+1B43;BALINESE VOWEL SIGN PEPET TEDUNG;Mc;0;L;1B42 1B35;;;;N;;;;;
+1B44;BALINESE ADEG ADEG;Mc;9;L;;;;;N;;;;;
+1B45;BALINESE LETTER KAF SASAK;Lo;0;L;;;;;N;;;;;
+1B46;BALINESE LETTER KHOT SASAK;Lo;0;L;;;;;N;;;;;
+1B47;BALINESE LETTER TZIR SASAK;Lo;0;L;;;;;N;;;;;
+1B48;BALINESE LETTER EF SASAK;Lo;0;L;;;;;N;;;;;
+1B49;BALINESE LETTER VE SASAK;Lo;0;L;;;;;N;;;;;
+1B4A;BALINESE LETTER ZAL SASAK;Lo;0;L;;;;;N;;;;;
+1B4B;BALINESE LETTER ASYURA SASAK;Lo;0;L;;;;;N;;;;;
+1B50;BALINESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1B51;BALINESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1B52;BALINESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1B53;BALINESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1B54;BALINESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1B55;BALINESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1B56;BALINESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1B57;BALINESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1B58;BALINESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1B59;BALINESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1B5A;BALINESE PANTI;Po;0;L;;;;;N;;;;;
+1B5B;BALINESE PAMADA;Po;0;L;;;;;N;;;;;
+1B5C;BALINESE WINDU;Po;0;L;;;;;N;;;;;
+1B5D;BALINESE CARIK PAMUNGKAH;Po;0;L;;;;;N;;;;;
+1B5E;BALINESE CARIK SIKI;Po;0;L;;;;;N;;;;;
+1B5F;BALINESE CARIK PAREREN;Po;0;L;;;;;N;;;;;
+1B60;BALINESE PAMENENG;Po;0;L;;;;;N;;;;;
+1B61;BALINESE MUSICAL SYMBOL DONG;So;0;L;;;;;N;;;;;
+1B62;BALINESE MUSICAL SYMBOL DENG;So;0;L;;;;;N;;;;;
+1B63;BALINESE MUSICAL SYMBOL DUNG;So;0;L;;;;;N;;;;;
+1B64;BALINESE MUSICAL SYMBOL DANG;So;0;L;;;;;N;;;;;
+1B65;BALINESE MUSICAL SYMBOL DANG SURANG;So;0;L;;;;;N;;;;;
+1B66;BALINESE MUSICAL SYMBOL DING;So;0;L;;;;;N;;;;;
+1B67;BALINESE MUSICAL SYMBOL DAENG;So;0;L;;;;;N;;;;;
+1B68;BALINESE MUSICAL SYMBOL DEUNG;So;0;L;;;;;N;;;;;
+1B69;BALINESE MUSICAL SYMBOL DAING;So;0;L;;;;;N;;;;;
+1B6A;BALINESE MUSICAL SYMBOL DANG GEDE;So;0;L;;;;;N;;;;;
+1B6B;BALINESE MUSICAL SYMBOL COMBINING TEGEH;Mn;230;NSM;;;;;N;;;;;
+1B6C;BALINESE MUSICAL SYMBOL COMBINING ENDEP;Mn;220;NSM;;;;;N;;;;;
+1B6D;BALINESE MUSICAL SYMBOL COMBINING KEMPUL;Mn;230;NSM;;;;;N;;;;;
+1B6E;BALINESE MUSICAL SYMBOL COMBINING KEMPLI;Mn;230;NSM;;;;;N;;;;;
+1B6F;BALINESE MUSICAL SYMBOL COMBINING JEGOGAN;Mn;230;NSM;;;;;N;;;;;
+1B70;BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;;
+1B71;BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;;
+1B72;BALINESE MUSICAL SYMBOL COMBINING BENDE;Mn;230;NSM;;;;;N;;;;;
+1B73;BALINESE MUSICAL SYMBOL COMBINING GONG;Mn;230;NSM;;;;;N;;;;;
+1B74;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG;So;0;L;;;;;N;;;;;
+1B75;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG;So;0;L;;;;;N;;;;;
+1B76;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK;So;0;L;;;;;N;;;;;
+1B77;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK;So;0;L;;;;;N;;;;;
+1B78;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG;So;0;L;;;;;N;;;;;
+1B79;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG;So;0;L;;;;;N;;;;;
+1B7A;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK;So;0;L;;;;;N;;;;;
+1B7B;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK;So;0;L;;;;;N;;;;;
+1B7C;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING;So;0;L;;;;;N;;;;;
+1B80;SUNDANESE SIGN PANYECEK;Mn;0;NSM;;;;;N;;;;;
+1B81;SUNDANESE SIGN PANGLAYAR;Mn;0;NSM;;;;;N;;;;;
+1B82;SUNDANESE SIGN PANGWISAD;Mc;0;L;;;;;N;;;;;
+1B83;SUNDANESE LETTER A;Lo;0;L;;;;;N;;;;;
+1B84;SUNDANESE LETTER I;Lo;0;L;;;;;N;;;;;
+1B85;SUNDANESE LETTER U;Lo;0;L;;;;;N;;;;;
+1B86;SUNDANESE LETTER AE;Lo;0;L;;;;;N;;;;;
+1B87;SUNDANESE LETTER O;Lo;0;L;;;;;N;;;;;
+1B88;SUNDANESE LETTER E;Lo;0;L;;;;;N;;;;;
+1B89;SUNDANESE LETTER EU;Lo;0;L;;;;;N;;;;;
+1B8A;SUNDANESE LETTER KA;Lo;0;L;;;;;N;;;;;
+1B8B;SUNDANESE LETTER QA;Lo;0;L;;;;;N;;;;;
+1B8C;SUNDANESE LETTER GA;Lo;0;L;;;;;N;;;;;
+1B8D;SUNDANESE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1B8E;SUNDANESE LETTER CA;Lo;0;L;;;;;N;;;;;
+1B8F;SUNDANESE LETTER JA;Lo;0;L;;;;;N;;;;;
+1B90;SUNDANESE LETTER ZA;Lo;0;L;;;;;N;;;;;
+1B91;SUNDANESE LETTER NYA;Lo;0;L;;;;;N;;;;;
+1B92;SUNDANESE LETTER TA;Lo;0;L;;;;;N;;;;;
+1B93;SUNDANESE LETTER DA;Lo;0;L;;;;;N;;;;;
+1B94;SUNDANESE LETTER NA;Lo;0;L;;;;;N;;;;;
+1B95;SUNDANESE LETTER PA;Lo;0;L;;;;;N;;;;;
+1B96;SUNDANESE LETTER FA;Lo;0;L;;;;;N;;;;;
+1B97;SUNDANESE LETTER VA;Lo;0;L;;;;;N;;;;;
+1B98;SUNDANESE LETTER BA;Lo;0;L;;;;;N;;;;;
+1B99;SUNDANESE LETTER MA;Lo;0;L;;;;;N;;;;;
+1B9A;SUNDANESE LETTER YA;Lo;0;L;;;;;N;;;;;
+1B9B;SUNDANESE LETTER RA;Lo;0;L;;;;;N;;;;;
+1B9C;SUNDANESE LETTER LA;Lo;0;L;;;;;N;;;;;
+1B9D;SUNDANESE LETTER WA;Lo;0;L;;;;;N;;;;;
+1B9E;SUNDANESE LETTER SA;Lo;0;L;;;;;N;;;;;
+1B9F;SUNDANESE LETTER XA;Lo;0;L;;;;;N;;;;;
+1BA0;SUNDANESE LETTER HA;Lo;0;L;;;;;N;;;;;
+1BA1;SUNDANESE CONSONANT SIGN PAMINGKAL;Mc;0;L;;;;;N;;;;;
+1BA2;SUNDANESE CONSONANT SIGN PANYAKRA;Mn;0;NSM;;;;;N;;;;;
+1BA3;SUNDANESE CONSONANT SIGN PANYIKU;Mn;0;NSM;;;;;N;;;;;
+1BA4;SUNDANESE VOWEL SIGN PANGHULU;Mn;0;NSM;;;;;N;;;;;
+1BA5;SUNDANESE VOWEL SIGN PANYUKU;Mn;0;NSM;;;;;N;;;;;
+1BA6;SUNDANESE VOWEL SIGN PANAELAENG;Mc;0;L;;;;;N;;;;;
+1BA7;SUNDANESE VOWEL SIGN PANOLONG;Mc;0;L;;;;;N;;;;;
+1BA8;SUNDANESE VOWEL SIGN PAMEPET;Mn;0;NSM;;;;;N;;;;;
+1BA9;SUNDANESE VOWEL SIGN PANEULEUNG;Mn;0;NSM;;;;;N;;;;;
+1BAA;SUNDANESE SIGN PAMAAEH;Mc;9;L;;;;;N;;;;;
+1BAB;SUNDANESE SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+1BAC;SUNDANESE CONSONANT SIGN PASANGAN MA;Mn;0;NSM;;;;;N;;;;;
+1BAD;SUNDANESE CONSONANT SIGN PASANGAN WA;Mn;0;NSM;;;;;N;;;;;
+1BAE;SUNDANESE LETTER KHA;Lo;0;L;;;;;N;;;;;
+1BAF;SUNDANESE LETTER SYA;Lo;0;L;;;;;N;;;;;
+1BB0;SUNDANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1BB1;SUNDANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1BB2;SUNDANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1BB3;SUNDANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1BB4;SUNDANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1BB5;SUNDANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1BB6;SUNDANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1BB7;SUNDANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1BB8;SUNDANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1BB9;SUNDANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1BBA;SUNDANESE AVAGRAHA;Lo;0;L;;;;;N;;;;;
+1BBB;SUNDANESE LETTER REU;Lo;0;L;;;;;N;;;;;
+1BBC;SUNDANESE LETTER LEU;Lo;0;L;;;;;N;;;;;
+1BBD;SUNDANESE LETTER BHA;Lo;0;L;;;;;N;;;;;
+1BBE;SUNDANESE LETTER FINAL K;Lo;0;L;;;;;N;;;;;
+1BBF;SUNDANESE LETTER FINAL M;Lo;0;L;;;;;N;;;;;
+1BC0;BATAK LETTER A;Lo;0;L;;;;;N;;;;;
+1BC1;BATAK LETTER SIMALUNGUN A;Lo;0;L;;;;;N;;;;;
+1BC2;BATAK LETTER HA;Lo;0;L;;;;;N;;;;;
+1BC3;BATAK LETTER SIMALUNGUN HA;Lo;0;L;;;;;N;;;;;
+1BC4;BATAK LETTER MANDAILING HA;Lo;0;L;;;;;N;;;;;
+1BC5;BATAK LETTER BA;Lo;0;L;;;;;N;;;;;
+1BC6;BATAK LETTER KARO BA;Lo;0;L;;;;;N;;;;;
+1BC7;BATAK LETTER PA;Lo;0;L;;;;;N;;;;;
+1BC8;BATAK LETTER SIMALUNGUN PA;Lo;0;L;;;;;N;;;;;
+1BC9;BATAK LETTER NA;Lo;0;L;;;;;N;;;;;
+1BCA;BATAK LETTER MANDAILING NA;Lo;0;L;;;;;N;;;;;
+1BCB;BATAK LETTER WA;Lo;0;L;;;;;N;;;;;
+1BCC;BATAK LETTER SIMALUNGUN WA;Lo;0;L;;;;;N;;;;;
+1BCD;BATAK LETTER PAKPAK WA;Lo;0;L;;;;;N;;;;;
+1BCE;BATAK LETTER GA;Lo;0;L;;;;;N;;;;;
+1BCF;BATAK LETTER SIMALUNGUN GA;Lo;0;L;;;;;N;;;;;
+1BD0;BATAK LETTER JA;Lo;0;L;;;;;N;;;;;
+1BD1;BATAK LETTER DA;Lo;0;L;;;;;N;;;;;
+1BD2;BATAK LETTER RA;Lo;0;L;;;;;N;;;;;
+1BD3;BATAK LETTER SIMALUNGUN RA;Lo;0;L;;;;;N;;;;;
+1BD4;BATAK LETTER MA;Lo;0;L;;;;;N;;;;;
+1BD5;BATAK LETTER SIMALUNGUN MA;Lo;0;L;;;;;N;;;;;
+1BD6;BATAK LETTER SOUTHERN TA;Lo;0;L;;;;;N;;;;;
+1BD7;BATAK LETTER NORTHERN TA;Lo;0;L;;;;;N;;;;;
+1BD8;BATAK LETTER SA;Lo;0;L;;;;;N;;;;;
+1BD9;BATAK LETTER SIMALUNGUN SA;Lo;0;L;;;;;N;;;;;
+1BDA;BATAK LETTER MANDAILING SA;Lo;0;L;;;;;N;;;;;
+1BDB;BATAK LETTER YA;Lo;0;L;;;;;N;;;;;
+1BDC;BATAK LETTER SIMALUNGUN YA;Lo;0;L;;;;;N;;;;;
+1BDD;BATAK LETTER NGA;Lo;0;L;;;;;N;;;;;
+1BDE;BATAK LETTER LA;Lo;0;L;;;;;N;;;;;
+1BDF;BATAK LETTER SIMALUNGUN LA;Lo;0;L;;;;;N;;;;;
+1BE0;BATAK LETTER NYA;Lo;0;L;;;;;N;;;;;
+1BE1;BATAK LETTER CA;Lo;0;L;;;;;N;;;;;
+1BE2;BATAK LETTER NDA;Lo;0;L;;;;;N;;;;;
+1BE3;BATAK LETTER MBA;Lo;0;L;;;;;N;;;;;
+1BE4;BATAK LETTER I;Lo;0;L;;;;;N;;;;;
+1BE5;BATAK LETTER U;Lo;0;L;;;;;N;;;;;
+1BE6;BATAK SIGN TOMPI;Mn;7;NSM;;;;;N;;;;;
+1BE7;BATAK VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+1BE8;BATAK VOWEL SIGN PAKPAK E;Mn;0;NSM;;;;;N;;;;;
+1BE9;BATAK VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;;
+1BEA;BATAK VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+1BEB;BATAK VOWEL SIGN KARO I;Mc;0;L;;;;;N;;;;;
+1BEC;BATAK VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+1BED;BATAK VOWEL SIGN KARO O;Mn;0;NSM;;;;;N;;;;;
+1BEE;BATAK VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+1BEF;BATAK VOWEL SIGN U FOR SIMALUNGUN SA;Mn;0;NSM;;;;;N;;;;;
+1BF0;BATAK CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;;
+1BF1;BATAK CONSONANT SIGN H;Mn;0;NSM;;;;;N;;;;;
+1BF2;BATAK PANGOLAT;Mc;9;L;;;;;N;;;;;
+1BF3;BATAK PANONGONAN;Mc;9;L;;;;;N;;;;;
+1BFC;BATAK SYMBOL BINDU NA METEK;Po;0;L;;;;;N;;;;;
+1BFD;BATAK SYMBOL BINDU PINARBORAS;Po;0;L;;;;;N;;;;;
+1BFE;BATAK SYMBOL BINDU JUDUL;Po;0;L;;;;;N;;;;;
+1BFF;BATAK SYMBOL BINDU PANGOLAT;Po;0;L;;;;;N;;;;;
+1C00;LEPCHA LETTER KA;Lo;0;L;;;;;N;;;;;
+1C01;LEPCHA LETTER KLA;Lo;0;L;;;;;N;;;;;
+1C02;LEPCHA LETTER KHA;Lo;0;L;;;;;N;;;;;
+1C03;LEPCHA LETTER GA;Lo;0;L;;;;;N;;;;;
+1C04;LEPCHA LETTER GLA;Lo;0;L;;;;;N;;;;;
+1C05;LEPCHA LETTER NGA;Lo;0;L;;;;;N;;;;;
+1C06;LEPCHA LETTER CA;Lo;0;L;;;;;N;;;;;
+1C07;LEPCHA LETTER CHA;Lo;0;L;;;;;N;;;;;
+1C08;LEPCHA LETTER JA;Lo;0;L;;;;;N;;;;;
+1C09;LEPCHA LETTER NYA;Lo;0;L;;;;;N;;;;;
+1C0A;LEPCHA LETTER TA;Lo;0;L;;;;;N;;;;;
+1C0B;LEPCHA LETTER THA;Lo;0;L;;;;;N;;;;;
+1C0C;LEPCHA LETTER DA;Lo;0;L;;;;;N;;;;;
+1C0D;LEPCHA LETTER NA;Lo;0;L;;;;;N;;;;;
+1C0E;LEPCHA LETTER PA;Lo;0;L;;;;;N;;;;;
+1C0F;LEPCHA LETTER PLA;Lo;0;L;;;;;N;;;;;
+1C10;LEPCHA LETTER PHA;Lo;0;L;;;;;N;;;;;
+1C11;LEPCHA LETTER FA;Lo;0;L;;;;;N;;;;;
+1C12;LEPCHA LETTER FLA;Lo;0;L;;;;;N;;;;;
+1C13;LEPCHA LETTER BA;Lo;0;L;;;;;N;;;;;
+1C14;LEPCHA LETTER BLA;Lo;0;L;;;;;N;;;;;
+1C15;LEPCHA LETTER MA;Lo;0;L;;;;;N;;;;;
+1C16;LEPCHA LETTER MLA;Lo;0;L;;;;;N;;;;;
+1C17;LEPCHA LETTER TSA;Lo;0;L;;;;;N;;;;;
+1C18;LEPCHA LETTER TSHA;Lo;0;L;;;;;N;;;;;
+1C19;LEPCHA LETTER DZA;Lo;0;L;;;;;N;;;;;
+1C1A;LEPCHA LETTER YA;Lo;0;L;;;;;N;;;;;
+1C1B;LEPCHA LETTER RA;Lo;0;L;;;;;N;;;;;
+1C1C;LEPCHA LETTER LA;Lo;0;L;;;;;N;;;;;
+1C1D;LEPCHA LETTER HA;Lo;0;L;;;;;N;;;;;
+1C1E;LEPCHA LETTER HLA;Lo;0;L;;;;;N;;;;;
+1C1F;LEPCHA LETTER VA;Lo;0;L;;;;;N;;;;;
+1C20;LEPCHA LETTER SA;Lo;0;L;;;;;N;;;;;
+1C21;LEPCHA LETTER SHA;Lo;0;L;;;;;N;;;;;
+1C22;LEPCHA LETTER WA;Lo;0;L;;;;;N;;;;;
+1C23;LEPCHA LETTER A;Lo;0;L;;;;;N;;;;;
+1C24;LEPCHA SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;;
+1C25;LEPCHA SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;;
+1C26;LEPCHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+1C27;LEPCHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+1C28;LEPCHA VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+1C29;LEPCHA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+1C2A;LEPCHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+1C2B;LEPCHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+1C2C;LEPCHA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+1C2D;LEPCHA CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;;
+1C2E;LEPCHA CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;;
+1C2F;LEPCHA CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;;
+1C30;LEPCHA CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;;
+1C31;LEPCHA CONSONANT SIGN P;Mn;0;NSM;;;;;N;;;;;
+1C32;LEPCHA CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;;
+1C33;LEPCHA CONSONANT SIGN T;Mn;0;NSM;;;;;N;;;;;
+1C34;LEPCHA CONSONANT SIGN NYIN-DO;Mc;0;L;;;;;N;;;;;
+1C35;LEPCHA CONSONANT SIGN KANG;Mc;0;L;;;;;N;;;;;
+1C36;LEPCHA SIGN RAN;Mn;0;NSM;;;;;N;;;;;
+1C37;LEPCHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+1C3B;LEPCHA PUNCTUATION TA-ROL;Po;0;L;;;;;N;;;;;
+1C3C;LEPCHA PUNCTUATION NYET THYOOM TA-ROL;Po;0;L;;;;;N;;;;;
+1C3D;LEPCHA PUNCTUATION CER-WA;Po;0;L;;;;;N;;;;;
+1C3E;LEPCHA PUNCTUATION TSHOOK CER-WA;Po;0;L;;;;;N;;;;;
+1C3F;LEPCHA PUNCTUATION TSHOOK;Po;0;L;;;;;N;;;;;
+1C40;LEPCHA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1C41;LEPCHA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1C42;LEPCHA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1C43;LEPCHA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1C44;LEPCHA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1C45;LEPCHA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1C46;LEPCHA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1C47;LEPCHA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1C48;LEPCHA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1C49;LEPCHA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1C4D;LEPCHA LETTER TTA;Lo;0;L;;;;;N;;;;;
+1C4E;LEPCHA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+1C4F;LEPCHA LETTER DDA;Lo;0;L;;;;;N;;;;;
+1C50;OL CHIKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1C51;OL CHIKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1C52;OL CHIKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1C53;OL CHIKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1C54;OL CHIKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1C55;OL CHIKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1C56;OL CHIKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1C57;OL CHIKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1C58;OL CHIKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1C59;OL CHIKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1C5A;OL CHIKI LETTER LA;Lo;0;L;;;;;N;;;;;
+1C5B;OL CHIKI LETTER AT;Lo;0;L;;;;;N;;;;;
+1C5C;OL CHIKI LETTER AG;Lo;0;L;;;;;N;;;;;
+1C5D;OL CHIKI LETTER ANG;Lo;0;L;;;;;N;;;;;
+1C5E;OL CHIKI LETTER AL;Lo;0;L;;;;;N;;;;;
+1C5F;OL CHIKI LETTER LAA;Lo;0;L;;;;;N;;;;;
+1C60;OL CHIKI LETTER AAK;Lo;0;L;;;;;N;;;;;
+1C61;OL CHIKI LETTER AAJ;Lo;0;L;;;;;N;;;;;
+1C62;OL CHIKI LETTER AAM;Lo;0;L;;;;;N;;;;;
+1C63;OL CHIKI LETTER AAW;Lo;0;L;;;;;N;;;;;
+1C64;OL CHIKI LETTER LI;Lo;0;L;;;;;N;;;;;
+1C65;OL CHIKI LETTER IS;Lo;0;L;;;;;N;;;;;
+1C66;OL CHIKI LETTER IH;Lo;0;L;;;;;N;;;;;
+1C67;OL CHIKI LETTER INY;Lo;0;L;;;;;N;;;;;
+1C68;OL CHIKI LETTER IR;Lo;0;L;;;;;N;;;;;
+1C69;OL CHIKI LETTER LU;Lo;0;L;;;;;N;;;;;
+1C6A;OL CHIKI LETTER UC;Lo;0;L;;;;;N;;;;;
+1C6B;OL CHIKI LETTER UD;Lo;0;L;;;;;N;;;;;
+1C6C;OL CHIKI LETTER UNN;Lo;0;L;;;;;N;;;;;
+1C6D;OL CHIKI LETTER UY;Lo;0;L;;;;;N;;;;;
+1C6E;OL CHIKI LETTER LE;Lo;0;L;;;;;N;;;;;
+1C6F;OL CHIKI LETTER EP;Lo;0;L;;;;;N;;;;;
+1C70;OL CHIKI LETTER EDD;Lo;0;L;;;;;N;;;;;
+1C71;OL CHIKI LETTER EN;Lo;0;L;;;;;N;;;;;
+1C72;OL CHIKI LETTER ERR;Lo;0;L;;;;;N;;;;;
+1C73;OL CHIKI LETTER LO;Lo;0;L;;;;;N;;;;;
+1C74;OL CHIKI LETTER OTT;Lo;0;L;;;;;N;;;;;
+1C75;OL CHIKI LETTER OB;Lo;0;L;;;;;N;;;;;
+1C76;OL CHIKI LETTER OV;Lo;0;L;;;;;N;;;;;
+1C77;OL CHIKI LETTER OH;Lo;0;L;;;;;N;;;;;
+1C78;OL CHIKI MU TTUDDAG;Lm;0;L;;;;;N;;;;;
+1C79;OL CHIKI GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;;
+1C7A;OL CHIKI MU-GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;;
+1C7B;OL CHIKI RELAA;Lm;0;L;;;;;N;;;;;
+1C7C;OL CHIKI PHAARKAA;Lm;0;L;;;;;N;;;;;
+1C7D;OL CHIKI AHAD;Lm;0;L;;;;;N;;;;;
+1C7E;OL CHIKI PUNCTUATION MUCAAD;Po;0;L;;;;;N;;;;;
+1C7F;OL CHIKI PUNCTUATION DOUBLE MUCAAD;Po;0;L;;;;;N;;;;;
+1C80;CYRILLIC SMALL LETTER ROUNDED VE;Ll;0;L;;;;;N;;;0412;;0412
+1C81;CYRILLIC SMALL LETTER LONG-LEGGED DE;Ll;0;L;;;;;N;;;0414;;0414
+1C82;CYRILLIC SMALL LETTER NARROW O;Ll;0;L;;;;;N;;;041E;;041E
+1C83;CYRILLIC SMALL LETTER WIDE ES;Ll;0;L;;;;;N;;;0421;;0421
+1C84;CYRILLIC SMALL LETTER TALL TE;Ll;0;L;;;;;N;;;0422;;0422
+1C85;CYRILLIC SMALL LETTER THREE-LEGGED TE;Ll;0;L;;;;;N;;;0422;;0422
+1C86;CYRILLIC SMALL LETTER TALL HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A
+1C87;CYRILLIC SMALL LETTER TALL YAT;Ll;0;L;;;;;N;;;0462;;0462
+1C88;CYRILLIC SMALL LETTER UNBLENDED UK;Ll;0;L;;;;;N;;;A64A;;A64A
+1CC0;SUNDANESE PUNCTUATION BINDU SURYA;Po;0;L;;;;;N;;;;;
+1CC1;SUNDANESE PUNCTUATION BINDU PANGLONG;Po;0;L;;;;;N;;;;;
+1CC2;SUNDANESE PUNCTUATION BINDU PURNAMA;Po;0;L;;;;;N;;;;;
+1CC3;SUNDANESE PUNCTUATION BINDU CAKRA;Po;0;L;;;;;N;;;;;
+1CC4;SUNDANESE PUNCTUATION BINDU LEU SATANGA;Po;0;L;;;;;N;;;;;
+1CC5;SUNDANESE PUNCTUATION BINDU KA SATANGA;Po;0;L;;;;;N;;;;;
+1CC6;SUNDANESE PUNCTUATION BINDU DA SATANGA;Po;0;L;;;;;N;;;;;
+1CC7;SUNDANESE PUNCTUATION BINDU BA SATANGA;Po;0;L;;;;;N;;;;;
+1CD0;VEDIC TONE KARSHANA;Mn;230;NSM;;;;;N;;;;;
+1CD1;VEDIC TONE SHARA;Mn;230;NSM;;;;;N;;;;;
+1CD2;VEDIC TONE PRENKHA;Mn;230;NSM;;;;;N;;;;;
+1CD3;VEDIC SIGN NIHSHVASA;Po;0;L;;;;;N;;;;;
+1CD4;VEDIC SIGN YAJURVEDIC MIDLINE SVARITA;Mn;1;NSM;;;;;N;;;;;
+1CD5;VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;;
+1CD6;VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;;
+1CD7;VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;;
+1CD8;VEDIC TONE CANDRA BELOW;Mn;220;NSM;;;;;N;;;;;
+1CD9;VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER;Mn;220;NSM;;;;;N;;;;;
+1CDA;VEDIC TONE DOUBLE SVARITA;Mn;230;NSM;;;;;N;;;;;
+1CDB;VEDIC TONE TRIPLE SVARITA;Mn;230;NSM;;;;;N;;;;;
+1CDC;VEDIC TONE KATHAKA ANUDATTA;Mn;220;NSM;;;;;N;;;;;
+1CDD;VEDIC TONE DOT BELOW;Mn;220;NSM;;;;;N;;;;;
+1CDE;VEDIC TONE TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;;
+1CDF;VEDIC TONE THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;;
+1CE0;VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA;Mn;230;NSM;;;;;N;;;;;
+1CE1;VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA;Mc;0;L;;;;;N;;;;;
+1CE2;VEDIC SIGN VISARGA SVARITA;Mn;1;NSM;;;;;N;;;;;
+1CE3;VEDIC SIGN VISARGA UDATTA;Mn;1;NSM;;;;;N;;;;;
+1CE4;VEDIC SIGN REVERSED VISARGA UDATTA;Mn;1;NSM;;;;;N;;;;;
+1CE5;VEDIC SIGN VISARGA ANUDATTA;Mn;1;NSM;;;;;N;;;;;
+1CE6;VEDIC SIGN REVERSED VISARGA ANUDATTA;Mn;1;NSM;;;;;N;;;;;
+1CE7;VEDIC SIGN VISARGA UDATTA WITH TAIL;Mn;1;NSM;;;;;N;;;;;
+1CE8;VEDIC SIGN VISARGA ANUDATTA WITH TAIL;Mn;1;NSM;;;;;N;;;;;
+1CE9;VEDIC SIGN ANUSVARA ANTARGOMUKHA;Lo;0;L;;;;;N;;;;;
+1CEA;VEDIC SIGN ANUSVARA BAHIRGOMUKHA;Lo;0;L;;;;;N;;;;;
+1CEB;VEDIC SIGN ANUSVARA VAMAGOMUKHA;Lo;0;L;;;;;N;;;;;
+1CEC;VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL;Lo;0;L;;;;;N;;;;;
+1CED;VEDIC SIGN TIRYAK;Mn;220;NSM;;;;;N;;;;;
+1CEE;VEDIC SIGN HEXIFORM LONG ANUSVARA;Lo;0;L;;;;;N;;;;;
+1CEF;VEDIC SIGN LONG ANUSVARA;Lo;0;L;;;;;N;;;;;
+1CF0;VEDIC SIGN RTHANG LONG ANUSVARA;Lo;0;L;;;;;N;;;;;
+1CF1;VEDIC SIGN ANUSVARA UBHAYATO MUKHA;Lo;0;L;;;;;N;;;;;
+1CF2;VEDIC SIGN ARDHAVISARGA;Mc;0;L;;;;;N;;;;;
+1CF3;VEDIC SIGN ROTATED ARDHAVISARGA;Mc;0;L;;;;;N;;;;;
+1CF4;VEDIC TONE CANDRA ABOVE;Mn;230;NSM;;;;;N;;;;;
+1CF5;VEDIC SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;;
+1CF6;VEDIC SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;;
+1CF8;VEDIC TONE RING ABOVE;Mn;230;NSM;;;;;N;;;;;
+1CF9;VEDIC TONE DOUBLE RING ABOVE;Mn;230;NSM;;;;;N;;;;;
+1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;;
+1D01;LATIN LETTER SMALL CAPITAL AE;Ll;0;L;;;;;N;;;;;
+1D02;LATIN SMALL LETTER TURNED AE;Ll;0;L;;;;;N;;;;;
+1D03;LATIN LETTER SMALL CAPITAL BARRED B;Ll;0;L;;;;;N;;;;;
+1D04;LATIN LETTER SMALL CAPITAL C;Ll;0;L;;;;;N;;;;;
+1D05;LATIN LETTER SMALL CAPITAL D;Ll;0;L;;;;;N;;;;;
+1D06;LATIN LETTER SMALL CAPITAL ETH;Ll;0;L;;;;;N;;;;;
+1D07;LATIN LETTER SMALL CAPITAL E;Ll;0;L;;;;;N;;;;;
+1D08;LATIN SMALL LETTER TURNED OPEN E;Ll;0;L;;;;;N;;;;;
+1D09;LATIN SMALL LETTER TURNED I;Ll;0;L;;;;;N;;;;;
+1D0A;LATIN LETTER SMALL CAPITAL J;Ll;0;L;;;;;N;;;;;
+1D0B;LATIN LETTER SMALL CAPITAL K;Ll;0;L;;;;;N;;;;;
+1D0C;LATIN LETTER SMALL CAPITAL L WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D0D;LATIN LETTER SMALL CAPITAL M;Ll;0;L;;;;;N;;;;;
+1D0E;LATIN LETTER SMALL CAPITAL REVERSED N;Ll;0;L;;;;;N;;;;;
+1D0F;LATIN LETTER SMALL CAPITAL O;Ll;0;L;;;;;N;;;;;
+1D10;LATIN LETTER SMALL CAPITAL OPEN O;Ll;0;L;;;;;N;;;;;
+1D11;LATIN SMALL LETTER SIDEWAYS O;Ll;0;L;;;;;N;;;;;
+1D12;LATIN SMALL LETTER SIDEWAYS OPEN O;Ll;0;L;;;;;N;;;;;
+1D13;LATIN SMALL LETTER SIDEWAYS O WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D14;LATIN SMALL LETTER TURNED OE;Ll;0;L;;;;;N;;;;;
+1D15;LATIN LETTER SMALL CAPITAL OU;Ll;0;L;;;;;N;;;;;
+1D16;LATIN SMALL LETTER TOP HALF O;Ll;0;L;;;;;N;;;;;
+1D17;LATIN SMALL LETTER BOTTOM HALF O;Ll;0;L;;;;;N;;;;;
+1D18;LATIN LETTER SMALL CAPITAL P;Ll;0;L;;;;;N;;;;;
+1D19;LATIN LETTER SMALL CAPITAL REVERSED R;Ll;0;L;;;;;N;;;;;
+1D1A;LATIN LETTER SMALL CAPITAL TURNED R;Ll;0;L;;;;;N;;;;;
+1D1B;LATIN LETTER SMALL CAPITAL T;Ll;0;L;;;;;N;;;;;
+1D1C;LATIN LETTER SMALL CAPITAL U;Ll;0;L;;;;;N;;;;;
+1D1D;LATIN SMALL LETTER SIDEWAYS U;Ll;0;L;;;;;N;;;;;
+1D1E;LATIN SMALL LETTER SIDEWAYS DIAERESIZED U;Ll;0;L;;;;;N;;;;;
+1D1F;LATIN SMALL LETTER SIDEWAYS TURNED M;Ll;0;L;;;;;N;;;;;
+1D20;LATIN LETTER SMALL CAPITAL V;Ll;0;L;;;;;N;;;;;
+1D21;LATIN LETTER SMALL CAPITAL W;Ll;0;L;;;;;N;;;;;
+1D22;LATIN LETTER SMALL CAPITAL Z;Ll;0;L;;;;;N;;;;;
+1D23;LATIN LETTER SMALL CAPITAL EZH;Ll;0;L;;;;;N;;;;;
+1D24;LATIN LETTER VOICED LARYNGEAL SPIRANT;Ll;0;L;;;;;N;;;;;
+1D25;LATIN LETTER AIN;Ll;0;L;;;;;N;;;;;
+1D26;GREEK LETTER SMALL CAPITAL GAMMA;Ll;0;L;;;;;N;;;;;
+1D27;GREEK LETTER SMALL CAPITAL LAMDA;Ll;0;L;;;;;N;;;;;
+1D28;GREEK LETTER SMALL CAPITAL PI;Ll;0;L;;;;;N;;;;;
+1D29;GREEK LETTER SMALL CAPITAL RHO;Ll;0;L;;;;;N;;;;;
+1D2A;GREEK LETTER SMALL CAPITAL PSI;Ll;0;L;;;;;N;;;;;
+1D2B;CYRILLIC LETTER SMALL CAPITAL EL;Ll;0;L;;;;;N;;;;;
+1D2C;MODIFIER LETTER CAPITAL A;Lm;0;L;<super> 0041;;;;N;;;;;
+1D2D;MODIFIER LETTER CAPITAL AE;Lm;0;L;<super> 00C6;;;;N;;;;;
+1D2E;MODIFIER LETTER CAPITAL B;Lm;0;L;<super> 0042;;;;N;;;;;
+1D2F;MODIFIER LETTER CAPITAL BARRED B;Lm;0;L;;;;;N;;;;;
+1D30;MODIFIER LETTER CAPITAL D;Lm;0;L;<super> 0044;;;;N;;;;;
+1D31;MODIFIER LETTER CAPITAL E;Lm;0;L;<super> 0045;;;;N;;;;;
+1D32;MODIFIER LETTER CAPITAL REVERSED E;Lm;0;L;<super> 018E;;;;N;;;;;
+1D33;MODIFIER LETTER CAPITAL G;Lm;0;L;<super> 0047;;;;N;;;;;
+1D34;MODIFIER LETTER CAPITAL H;Lm;0;L;<super> 0048;;;;N;;;;;
+1D35;MODIFIER LETTER CAPITAL I;Lm;0;L;<super> 0049;;;;N;;;;;
+1D36;MODIFIER LETTER CAPITAL J;Lm;0;L;<super> 004A;;;;N;;;;;
+1D37;MODIFIER LETTER CAPITAL K;Lm;0;L;<super> 004B;;;;N;;;;;
+1D38;MODIFIER LETTER CAPITAL L;Lm;0;L;<super> 004C;;;;N;;;;;
+1D39;MODIFIER LETTER CAPITAL M;Lm;0;L;<super> 004D;;;;N;;;;;
+1D3A;MODIFIER LETTER CAPITAL N;Lm;0;L;<super> 004E;;;;N;;;;;
+1D3B;MODIFIER LETTER CAPITAL REVERSED N;Lm;0;L;;;;;N;;;;;
+1D3C;MODIFIER LETTER CAPITAL O;Lm;0;L;<super> 004F;;;;N;;;;;
+1D3D;MODIFIER LETTER CAPITAL OU;Lm;0;L;<super> 0222;;;;N;;;;;
+1D3E;MODIFIER LETTER CAPITAL P;Lm;0;L;<super> 0050;;;;N;;;;;
+1D3F;MODIFIER LETTER CAPITAL R;Lm;0;L;<super> 0052;;;;N;;;;;
+1D40;MODIFIER LETTER CAPITAL T;Lm;0;L;<super> 0054;;;;N;;;;;
+1D41;MODIFIER LETTER CAPITAL U;Lm;0;L;<super> 0055;;;;N;;;;;
+1D42;MODIFIER LETTER CAPITAL W;Lm;0;L;<super> 0057;;;;N;;;;;
+1D43;MODIFIER LETTER SMALL A;Lm;0;L;<super> 0061;;;;N;;;;;
+1D44;MODIFIER LETTER SMALL TURNED A;Lm;0;L;<super> 0250;;;;N;;;;;
+1D45;MODIFIER LETTER SMALL ALPHA;Lm;0;L;<super> 0251;;;;N;;;;;
+1D46;MODIFIER LETTER SMALL TURNED AE;Lm;0;L;<super> 1D02;;;;N;;;;;
+1D47;MODIFIER LETTER SMALL B;Lm;0;L;<super> 0062;;;;N;;;;;
+1D48;MODIFIER LETTER SMALL D;Lm;0;L;<super> 0064;;;;N;;;;;
+1D49;MODIFIER LETTER SMALL E;Lm;0;L;<super> 0065;;;;N;;;;;
+1D4A;MODIFIER LETTER SMALL SCHWA;Lm;0;L;<super> 0259;;;;N;;;;;
+1D4B;MODIFIER LETTER SMALL OPEN E;Lm;0;L;<super> 025B;;;;N;;;;;
+1D4C;MODIFIER LETTER SMALL TURNED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;;
+1D4D;MODIFIER LETTER SMALL G;Lm;0;L;<super> 0067;;;;N;;;;;
+1D4E;MODIFIER LETTER SMALL TURNED I;Lm;0;L;;;;;N;;;;;
+1D4F;MODIFIER LETTER SMALL K;Lm;0;L;<super> 006B;;;;N;;;;;
+1D50;MODIFIER LETTER SMALL M;Lm;0;L;<super> 006D;;;;N;;;;;
+1D51;MODIFIER LETTER SMALL ENG;Lm;0;L;<super> 014B;;;;N;;;;;
+1D52;MODIFIER LETTER SMALL O;Lm;0;L;<super> 006F;;;;N;;;;;
+1D53;MODIFIER LETTER SMALL OPEN O;Lm;0;L;<super> 0254;;;;N;;;;;
+1D54;MODIFIER LETTER SMALL TOP HALF O;Lm;0;L;<super> 1D16;;;;N;;;;;
+1D55;MODIFIER LETTER SMALL BOTTOM HALF O;Lm;0;L;<super> 1D17;;;;N;;;;;
+1D56;MODIFIER LETTER SMALL P;Lm;0;L;<super> 0070;;;;N;;;;;
+1D57;MODIFIER LETTER SMALL T;Lm;0;L;<super> 0074;;;;N;;;;;
+1D58;MODIFIER LETTER SMALL U;Lm;0;L;<super> 0075;;;;N;;;;;
+1D59;MODIFIER LETTER SMALL SIDEWAYS U;Lm;0;L;<super> 1D1D;;;;N;;;;;
+1D5A;MODIFIER LETTER SMALL TURNED M;Lm;0;L;<super> 026F;;;;N;;;;;
+1D5B;MODIFIER LETTER SMALL V;Lm;0;L;<super> 0076;;;;N;;;;;
+1D5C;MODIFIER LETTER SMALL AIN;Lm;0;L;<super> 1D25;;;;N;;;;;
+1D5D;MODIFIER LETTER SMALL BETA;Lm;0;L;<super> 03B2;;;;N;;;;;
+1D5E;MODIFIER LETTER SMALL GREEK GAMMA;Lm;0;L;<super> 03B3;;;;N;;;;;
+1D5F;MODIFIER LETTER SMALL DELTA;Lm;0;L;<super> 03B4;;;;N;;;;;
+1D60;MODIFIER LETTER SMALL GREEK PHI;Lm;0;L;<super> 03C6;;;;N;;;;;
+1D61;MODIFIER LETTER SMALL CHI;Lm;0;L;<super> 03C7;;;;N;;;;;
+1D62;LATIN SUBSCRIPT SMALL LETTER I;Lm;0;L;<sub> 0069;;;;N;;;;;
+1D63;LATIN SUBSCRIPT SMALL LETTER R;Lm;0;L;<sub> 0072;;;;N;;;;;
+1D64;LATIN SUBSCRIPT SMALL LETTER U;Lm;0;L;<sub> 0075;;;;N;;;;;
+1D65;LATIN SUBSCRIPT SMALL LETTER V;Lm;0;L;<sub> 0076;;;;N;;;;;
+1D66;GREEK SUBSCRIPT SMALL LETTER BETA;Lm;0;L;<sub> 03B2;;;;N;;;;;
+1D67;GREEK SUBSCRIPT SMALL LETTER GAMMA;Lm;0;L;<sub> 03B3;;;;N;;;;;
+1D68;GREEK SUBSCRIPT SMALL LETTER RHO;Lm;0;L;<sub> 03C1;;;;N;;;;;
+1D69;GREEK SUBSCRIPT SMALL LETTER PHI;Lm;0;L;<sub> 03C6;;;;N;;;;;
+1D6A;GREEK SUBSCRIPT SMALL LETTER CHI;Lm;0;L;<sub> 03C7;;;;N;;;;;
+1D6B;LATIN SMALL LETTER UE;Ll;0;L;;;;;N;;;;;
+1D6C;LATIN SMALL LETTER B WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D6D;LATIN SMALL LETTER D WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D6E;LATIN SMALL LETTER F WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D6F;LATIN SMALL LETTER M WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D70;LATIN SMALL LETTER N WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D71;LATIN SMALL LETTER P WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D72;LATIN SMALL LETTER R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D73;LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D74;LATIN SMALL LETTER S WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D75;LATIN SMALL LETTER T WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D76;LATIN SMALL LETTER Z WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D77;LATIN SMALL LETTER TURNED G;Ll;0;L;;;;;N;;;;;
+1D78;MODIFIER LETTER CYRILLIC EN;Lm;0;L;<super> 043D;;;;N;;;;;
+1D79;LATIN SMALL LETTER INSULAR G;Ll;0;L;;;;;N;;;A77D;;A77D
+1D7A;LATIN SMALL LETTER TH WITH STRIKETHROUGH;Ll;0;L;;;;;N;;;;;
+1D7B;LATIN SMALL CAPITAL LETTER I WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D7C;LATIN SMALL LETTER IOTA WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D7D;LATIN SMALL LETTER P WITH STROKE;Ll;0;L;;;;;N;;;2C63;;2C63
+1D7E;LATIN SMALL CAPITAL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D7F;LATIN SMALL LETTER UPSILON WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D80;LATIN SMALL LETTER B WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D81;LATIN SMALL LETTER D WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D82;LATIN SMALL LETTER F WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D83;LATIN SMALL LETTER G WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D84;LATIN SMALL LETTER K WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D85;LATIN SMALL LETTER L WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D86;LATIN SMALL LETTER M WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D87;LATIN SMALL LETTER N WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D88;LATIN SMALL LETTER P WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D89;LATIN SMALL LETTER R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8A;LATIN SMALL LETTER S WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8B;LATIN SMALL LETTER ESH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8C;LATIN SMALL LETTER V WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8D;LATIN SMALL LETTER X WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8E;LATIN SMALL LETTER Z WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8F;LATIN SMALL LETTER A WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D90;LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D91;LATIN SMALL LETTER D WITH HOOK AND TAIL;Ll;0;L;;;;;N;;;;;
+1D92;LATIN SMALL LETTER E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D93;LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D94;LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D95;LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D96;LATIN SMALL LETTER I WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D97;LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D98;LATIN SMALL LETTER ESH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D99;LATIN SMALL LETTER U WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D9A;LATIN SMALL LETTER EZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D9B;MODIFIER LETTER SMALL TURNED ALPHA;Lm;0;L;<super> 0252;;;;N;;;;;
+1D9C;MODIFIER LETTER SMALL C;Lm;0;L;<super> 0063;;;;N;;;;;
+1D9D;MODIFIER LETTER SMALL C WITH CURL;Lm;0;L;<super> 0255;;;;N;;;;;
+1D9E;MODIFIER LETTER SMALL ETH;Lm;0;L;<super> 00F0;;;;N;;;;;
+1D9F;MODIFIER LETTER SMALL REVERSED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;;
+1DA0;MODIFIER LETTER SMALL F;Lm;0;L;<super> 0066;;;;N;;;;;
+1DA1;MODIFIER LETTER SMALL DOTLESS J WITH STROKE;Lm;0;L;<super> 025F;;;;N;;;;;
+1DA2;MODIFIER LETTER SMALL SCRIPT G;Lm;0;L;<super> 0261;;;;N;;;;;
+1DA3;MODIFIER LETTER SMALL TURNED H;Lm;0;L;<super> 0265;;;;N;;;;;
+1DA4;MODIFIER LETTER SMALL I WITH STROKE;Lm;0;L;<super> 0268;;;;N;;;;;
+1DA5;MODIFIER LETTER SMALL IOTA;Lm;0;L;<super> 0269;;;;N;;;;;
+1DA6;MODIFIER LETTER SMALL CAPITAL I;Lm;0;L;<super> 026A;;;;N;;;;;
+1DA7;MODIFIER LETTER SMALL CAPITAL I WITH STROKE;Lm;0;L;<super> 1D7B;;;;N;;;;;
+1DA8;MODIFIER LETTER SMALL J WITH CROSSED-TAIL;Lm;0;L;<super> 029D;;;;N;;;;;
+1DA9;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK;Lm;0;L;<super> 026D;;;;N;;;;;
+1DAA;MODIFIER LETTER SMALL L WITH PALATAL HOOK;Lm;0;L;<super> 1D85;;;;N;;;;;
+1DAB;MODIFIER LETTER SMALL CAPITAL L;Lm;0;L;<super> 029F;;;;N;;;;;
+1DAC;MODIFIER LETTER SMALL M WITH HOOK;Lm;0;L;<super> 0271;;;;N;;;;;
+1DAD;MODIFIER LETTER SMALL TURNED M WITH LONG LEG;Lm;0;L;<super> 0270;;;;N;;;;;
+1DAE;MODIFIER LETTER SMALL N WITH LEFT HOOK;Lm;0;L;<super> 0272;;;;N;;;;;
+1DAF;MODIFIER LETTER SMALL N WITH RETROFLEX HOOK;Lm;0;L;<super> 0273;;;;N;;;;;
+1DB0;MODIFIER LETTER SMALL CAPITAL N;Lm;0;L;<super> 0274;;;;N;;;;;
+1DB1;MODIFIER LETTER SMALL BARRED O;Lm;0;L;<super> 0275;;;;N;;;;;
+1DB2;MODIFIER LETTER SMALL PHI;Lm;0;L;<super> 0278;;;;N;;;;;
+1DB3;MODIFIER LETTER SMALL S WITH HOOK;Lm;0;L;<super> 0282;;;;N;;;;;
+1DB4;MODIFIER LETTER SMALL ESH;Lm;0;L;<super> 0283;;;;N;;;;;
+1DB5;MODIFIER LETTER SMALL T WITH PALATAL HOOK;Lm;0;L;<super> 01AB;;;;N;;;;;
+1DB6;MODIFIER LETTER SMALL U BAR;Lm;0;L;<super> 0289;;;;N;;;;;
+1DB7;MODIFIER LETTER SMALL UPSILON;Lm;0;L;<super> 028A;;;;N;;;;;
+1DB8;MODIFIER LETTER SMALL CAPITAL U;Lm;0;L;<super> 1D1C;;;;N;;;;;
+1DB9;MODIFIER LETTER SMALL V WITH HOOK;Lm;0;L;<super> 028B;;;;N;;;;;
+1DBA;MODIFIER LETTER SMALL TURNED V;Lm;0;L;<super> 028C;;;;N;;;;;
+1DBB;MODIFIER LETTER SMALL Z;Lm;0;L;<super> 007A;;;;N;;;;;
+1DBC;MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK;Lm;0;L;<super> 0290;;;;N;;;;;
+1DBD;MODIFIER LETTER SMALL Z WITH CURL;Lm;0;L;<super> 0291;;;;N;;;;;
+1DBE;MODIFIER LETTER SMALL EZH;Lm;0;L;<super> 0292;;;;N;;;;;
+1DBF;MODIFIER LETTER SMALL THETA;Lm;0;L;<super> 03B8;;;;N;;;;;
+1DC0;COMBINING DOTTED GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;;
+1DC1;COMBINING DOTTED ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;;
+1DC2;COMBINING SNAKE BELOW;Mn;220;NSM;;;;;N;;;;;
+1DC3;COMBINING SUSPENSION MARK;Mn;230;NSM;;;;;N;;;;;
+1DC4;COMBINING MACRON-ACUTE;Mn;230;NSM;;;;;N;;;;;
+1DC5;COMBINING GRAVE-MACRON;Mn;230;NSM;;;;;N;;;;;
+1DC6;COMBINING MACRON-GRAVE;Mn;230;NSM;;;;;N;;;;;
+1DC7;COMBINING ACUTE-MACRON;Mn;230;NSM;;;;;N;;;;;
+1DC8;COMBINING GRAVE-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;;
+1DC9;COMBINING ACUTE-GRAVE-ACUTE;Mn;230;NSM;;;;;N;;;;;
+1DCA;COMBINING LATIN SMALL LETTER R BELOW;Mn;220;NSM;;;;;N;;;;;
+1DCB;COMBINING BREVE-MACRON;Mn;230;NSM;;;;;N;;;;;
+1DCC;COMBINING MACRON-BREVE;Mn;230;NSM;;;;;N;;;;;
+1DCD;COMBINING DOUBLE CIRCUMFLEX ABOVE;Mn;234;NSM;;;;;N;;;;;
+1DCE;COMBINING OGONEK ABOVE;Mn;214;NSM;;;;;N;;;;;
+1DCF;COMBINING ZIGZAG BELOW;Mn;220;NSM;;;;;N;;;;;
+1DD0;COMBINING IS BELOW;Mn;202;NSM;;;;;N;;;;;
+1DD1;COMBINING UR ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DD2;COMBINING US ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DD3;COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DD4;COMBINING LATIN SMALL LETTER AE;Mn;230;NSM;;;;;N;;;;;
+1DD5;COMBINING LATIN SMALL LETTER AO;Mn;230;NSM;;;;;N;;;;;
+1DD6;COMBINING LATIN SMALL LETTER AV;Mn;230;NSM;;;;;N;;;;;
+1DD7;COMBINING LATIN SMALL LETTER C CEDILLA;Mn;230;NSM;;;;;N;;;;;
+1DD8;COMBINING LATIN SMALL LETTER INSULAR D;Mn;230;NSM;;;;;N;;;;;
+1DD9;COMBINING LATIN SMALL LETTER ETH;Mn;230;NSM;;;;;N;;;;;
+1DDA;COMBINING LATIN SMALL LETTER G;Mn;230;NSM;;;;;N;;;;;
+1DDB;COMBINING LATIN LETTER SMALL CAPITAL G;Mn;230;NSM;;;;;N;;;;;
+1DDC;COMBINING LATIN SMALL LETTER K;Mn;230;NSM;;;;;N;;;;;
+1DDD;COMBINING LATIN SMALL LETTER L;Mn;230;NSM;;;;;N;;;;;
+1DDE;COMBINING LATIN LETTER SMALL CAPITAL L;Mn;230;NSM;;;;;N;;;;;
+1DDF;COMBINING LATIN LETTER SMALL CAPITAL M;Mn;230;NSM;;;;;N;;;;;
+1DE0;COMBINING LATIN SMALL LETTER N;Mn;230;NSM;;;;;N;;;;;
+1DE1;COMBINING LATIN LETTER SMALL CAPITAL N;Mn;230;NSM;;;;;N;;;;;
+1DE2;COMBINING LATIN LETTER SMALL CAPITAL R;Mn;230;NSM;;;;;N;;;;;
+1DE3;COMBINING LATIN SMALL LETTER R ROTUNDA;Mn;230;NSM;;;;;N;;;;;
+1DE4;COMBINING LATIN SMALL LETTER S;Mn;230;NSM;;;;;N;;;;;
+1DE5;COMBINING LATIN SMALL LETTER LONG S;Mn;230;NSM;;;;;N;;;;;
+1DE6;COMBINING LATIN SMALL LETTER Z;Mn;230;NSM;;;;;N;;;;;
+1DE7;COMBINING LATIN SMALL LETTER ALPHA;Mn;230;NSM;;;;;N;;;;;
+1DE8;COMBINING LATIN SMALL LETTER B;Mn;230;NSM;;;;;N;;;;;
+1DE9;COMBINING LATIN SMALL LETTER BETA;Mn;230;NSM;;;;;N;;;;;
+1DEA;COMBINING LATIN SMALL LETTER SCHWA;Mn;230;NSM;;;;;N;;;;;
+1DEB;COMBINING LATIN SMALL LETTER F;Mn;230;NSM;;;;;N;;;;;
+1DEC;COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE;Mn;230;NSM;;;;;N;;;;;
+1DED;COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE;Mn;230;NSM;;;;;N;;;;;
+1DEE;COMBINING LATIN SMALL LETTER P;Mn;230;NSM;;;;;N;;;;;
+1DEF;COMBINING LATIN SMALL LETTER ESH;Mn;230;NSM;;;;;N;;;;;
+1DF0;COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE;Mn;230;NSM;;;;;N;;;;;
+1DF1;COMBINING LATIN SMALL LETTER W;Mn;230;NSM;;;;;N;;;;;
+1DF2;COMBINING LATIN SMALL LETTER A WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;;
+1DF3;COMBINING LATIN SMALL LETTER O WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;;
+1DF4;COMBINING LATIN SMALL LETTER U WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;;
+1DF5;COMBINING UP TACK ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DFB;COMBINING DELETION MARK;Mn;230;NSM;;;;;N;;;;;
+1DFC;COMBINING DOUBLE INVERTED BREVE BELOW;Mn;233;NSM;;;;;N;;;;;
+1DFD;COMBINING ALMOST EQUAL TO BELOW;Mn;220;NSM;;;;;N;;;;;
+1DFE;COMBINING LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DFF;COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01;
+1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00
+1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03;
+1E03;LATIN SMALL LETTER B WITH DOT ABOVE;Ll;0;L;0062 0307;;;;N;;;1E02;;1E02
+1E04;LATIN CAPITAL LETTER B WITH DOT BELOW;Lu;0;L;0042 0323;;;;N;;;;1E05;
+1E05;LATIN SMALL LETTER B WITH DOT BELOW;Ll;0;L;0062 0323;;;;N;;;1E04;;1E04
+1E06;LATIN CAPITAL LETTER B WITH LINE BELOW;Lu;0;L;0042 0331;;;;N;;;;1E07;
+1E07;LATIN SMALL LETTER B WITH LINE BELOW;Ll;0;L;0062 0331;;;;N;;;1E06;;1E06
+1E08;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE;Lu;0;L;00C7 0301;;;;N;;;;1E09;
+1E09;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE;Ll;0;L;00E7 0301;;;;N;;;1E08;;1E08
+1E0A;LATIN CAPITAL LETTER D WITH DOT ABOVE;Lu;0;L;0044 0307;;;;N;;;;1E0B;
+1E0B;LATIN SMALL LETTER D WITH DOT ABOVE;Ll;0;L;0064 0307;;;;N;;;1E0A;;1E0A
+1E0C;LATIN CAPITAL LETTER D WITH DOT BELOW;Lu;0;L;0044 0323;;;;N;;;;1E0D;
+1E0D;LATIN SMALL LETTER D WITH DOT BELOW;Ll;0;L;0064 0323;;;;N;;;1E0C;;1E0C
+1E0E;LATIN CAPITAL LETTER D WITH LINE BELOW;Lu;0;L;0044 0331;;;;N;;;;1E0F;
+1E0F;LATIN SMALL LETTER D WITH LINE BELOW;Ll;0;L;0064 0331;;;;N;;;1E0E;;1E0E
+1E10;LATIN CAPITAL LETTER D WITH CEDILLA;Lu;0;L;0044 0327;;;;N;;;;1E11;
+1E11;LATIN SMALL LETTER D WITH CEDILLA;Ll;0;L;0064 0327;;;;N;;;1E10;;1E10
+1E12;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW;Lu;0;L;0044 032D;;;;N;;;;1E13;
+1E13;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW;Ll;0;L;0064 032D;;;;N;;;1E12;;1E12
+1E14;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE;Lu;0;L;0112 0300;;;;N;;;;1E15;
+1E15;LATIN SMALL LETTER E WITH MACRON AND GRAVE;Ll;0;L;0113 0300;;;;N;;;1E14;;1E14
+1E16;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE;Lu;0;L;0112 0301;;;;N;;;;1E17;
+1E17;LATIN SMALL LETTER E WITH MACRON AND ACUTE;Ll;0;L;0113 0301;;;;N;;;1E16;;1E16
+1E18;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW;Lu;0;L;0045 032D;;;;N;;;;1E19;
+1E19;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW;Ll;0;L;0065 032D;;;;N;;;1E18;;1E18
+1E1A;LATIN CAPITAL LETTER E WITH TILDE BELOW;Lu;0;L;0045 0330;;;;N;;;;1E1B;
+1E1B;LATIN SMALL LETTER E WITH TILDE BELOW;Ll;0;L;0065 0330;;;;N;;;1E1A;;1E1A
+1E1C;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE;Lu;0;L;0228 0306;;;;N;;;;1E1D;
+1E1D;LATIN SMALL LETTER E WITH CEDILLA AND BREVE;Ll;0;L;0229 0306;;;;N;;;1E1C;;1E1C
+1E1E;LATIN CAPITAL LETTER F WITH DOT ABOVE;Lu;0;L;0046 0307;;;;N;;;;1E1F;
+1E1F;LATIN SMALL LETTER F WITH DOT ABOVE;Ll;0;L;0066 0307;;;;N;;;1E1E;;1E1E
+1E20;LATIN CAPITAL LETTER G WITH MACRON;Lu;0;L;0047 0304;;;;N;;;;1E21;
+1E21;LATIN SMALL LETTER G WITH MACRON;Ll;0;L;0067 0304;;;;N;;;1E20;;1E20
+1E22;LATIN CAPITAL LETTER H WITH DOT ABOVE;Lu;0;L;0048 0307;;;;N;;;;1E23;
+1E23;LATIN SMALL LETTER H WITH DOT ABOVE;Ll;0;L;0068 0307;;;;N;;;1E22;;1E22
+1E24;LATIN CAPITAL LETTER H WITH DOT BELOW;Lu;0;L;0048 0323;;;;N;;;;1E25;
+1E25;LATIN SMALL LETTER H WITH DOT BELOW;Ll;0;L;0068 0323;;;;N;;;1E24;;1E24
+1E26;LATIN CAPITAL LETTER H WITH DIAERESIS;Lu;0;L;0048 0308;;;;N;;;;1E27;
+1E27;LATIN SMALL LETTER H WITH DIAERESIS;Ll;0;L;0068 0308;;;;N;;;1E26;;1E26
+1E28;LATIN CAPITAL LETTER H WITH CEDILLA;Lu;0;L;0048 0327;;;;N;;;;1E29;
+1E29;LATIN SMALL LETTER H WITH CEDILLA;Ll;0;L;0068 0327;;;;N;;;1E28;;1E28
+1E2A;LATIN CAPITAL LETTER H WITH BREVE BELOW;Lu;0;L;0048 032E;;;;N;;;;1E2B;
+1E2B;LATIN SMALL LETTER H WITH BREVE BELOW;Ll;0;L;0068 032E;;;;N;;;1E2A;;1E2A
+1E2C;LATIN CAPITAL LETTER I WITH TILDE BELOW;Lu;0;L;0049 0330;;;;N;;;;1E2D;
+1E2D;LATIN SMALL LETTER I WITH TILDE BELOW;Ll;0;L;0069 0330;;;;N;;;1E2C;;1E2C
+1E2E;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE;Lu;0;L;00CF 0301;;;;N;;;;1E2F;
+1E2F;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE;Ll;0;L;00EF 0301;;;;N;;;1E2E;;1E2E
+1E30;LATIN CAPITAL LETTER K WITH ACUTE;Lu;0;L;004B 0301;;;;N;;;;1E31;
+1E31;LATIN SMALL LETTER K WITH ACUTE;Ll;0;L;006B 0301;;;;N;;;1E30;;1E30
+1E32;LATIN CAPITAL LETTER K WITH DOT BELOW;Lu;0;L;004B 0323;;;;N;;;;1E33;
+1E33;LATIN SMALL LETTER K WITH DOT BELOW;Ll;0;L;006B 0323;;;;N;;;1E32;;1E32
+1E34;LATIN CAPITAL LETTER K WITH LINE BELOW;Lu;0;L;004B 0331;;;;N;;;;1E35;
+1E35;LATIN SMALL LETTER K WITH LINE BELOW;Ll;0;L;006B 0331;;;;N;;;1E34;;1E34
+1E36;LATIN CAPITAL LETTER L WITH DOT BELOW;Lu;0;L;004C 0323;;;;N;;;;1E37;
+1E37;LATIN SMALL LETTER L WITH DOT BELOW;Ll;0;L;006C 0323;;;;N;;;1E36;;1E36
+1E38;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON;Lu;0;L;1E36 0304;;;;N;;;;1E39;
+1E39;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON;Ll;0;L;1E37 0304;;;;N;;;1E38;;1E38
+1E3A;LATIN CAPITAL LETTER L WITH LINE BELOW;Lu;0;L;004C 0331;;;;N;;;;1E3B;
+1E3B;LATIN SMALL LETTER L WITH LINE BELOW;Ll;0;L;006C 0331;;;;N;;;1E3A;;1E3A
+1E3C;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW;Lu;0;L;004C 032D;;;;N;;;;1E3D;
+1E3D;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW;Ll;0;L;006C 032D;;;;N;;;1E3C;;1E3C
+1E3E;LATIN CAPITAL LETTER M WITH ACUTE;Lu;0;L;004D 0301;;;;N;;;;1E3F;
+1E3F;LATIN SMALL LETTER M WITH ACUTE;Ll;0;L;006D 0301;;;;N;;;1E3E;;1E3E
+1E40;LATIN CAPITAL LETTER M WITH DOT ABOVE;Lu;0;L;004D 0307;;;;N;;;;1E41;
+1E41;LATIN SMALL LETTER M WITH DOT ABOVE;Ll;0;L;006D 0307;;;;N;;;1E40;;1E40
+1E42;LATIN CAPITAL LETTER M WITH DOT BELOW;Lu;0;L;004D 0323;;;;N;;;;1E43;
+1E43;LATIN SMALL LETTER M WITH DOT BELOW;Ll;0;L;006D 0323;;;;N;;;1E42;;1E42
+1E44;LATIN CAPITAL LETTER N WITH DOT ABOVE;Lu;0;L;004E 0307;;;;N;;;;1E45;
+1E45;LATIN SMALL LETTER N WITH DOT ABOVE;Ll;0;L;006E 0307;;;;N;;;1E44;;1E44
+1E46;LATIN CAPITAL LETTER N WITH DOT BELOW;Lu;0;L;004E 0323;;;;N;;;;1E47;
+1E47;LATIN SMALL LETTER N WITH DOT BELOW;Ll;0;L;006E 0323;;;;N;;;1E46;;1E46
+1E48;LATIN CAPITAL LETTER N WITH LINE BELOW;Lu;0;L;004E 0331;;;;N;;;;1E49;
+1E49;LATIN SMALL LETTER N WITH LINE BELOW;Ll;0;L;006E 0331;;;;N;;;1E48;;1E48
+1E4A;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW;Lu;0;L;004E 032D;;;;N;;;;1E4B;
+1E4B;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW;Ll;0;L;006E 032D;;;;N;;;1E4A;;1E4A
+1E4C;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE;Lu;0;L;00D5 0301;;;;N;;;;1E4D;
+1E4D;LATIN SMALL LETTER O WITH TILDE AND ACUTE;Ll;0;L;00F5 0301;;;;N;;;1E4C;;1E4C
+1E4E;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS;Lu;0;L;00D5 0308;;;;N;;;;1E4F;
+1E4F;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS;Ll;0;L;00F5 0308;;;;N;;;1E4E;;1E4E
+1E50;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE;Lu;0;L;014C 0300;;;;N;;;;1E51;
+1E51;LATIN SMALL LETTER O WITH MACRON AND GRAVE;Ll;0;L;014D 0300;;;;N;;;1E50;;1E50
+1E52;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE;Lu;0;L;014C 0301;;;;N;;;;1E53;
+1E53;LATIN SMALL LETTER O WITH MACRON AND ACUTE;Ll;0;L;014D 0301;;;;N;;;1E52;;1E52
+1E54;LATIN CAPITAL LETTER P WITH ACUTE;Lu;0;L;0050 0301;;;;N;;;;1E55;
+1E55;LATIN SMALL LETTER P WITH ACUTE;Ll;0;L;0070 0301;;;;N;;;1E54;;1E54
+1E56;LATIN CAPITAL LETTER P WITH DOT ABOVE;Lu;0;L;0050 0307;;;;N;;;;1E57;
+1E57;LATIN SMALL LETTER P WITH DOT ABOVE;Ll;0;L;0070 0307;;;;N;;;1E56;;1E56
+1E58;LATIN CAPITAL LETTER R WITH DOT ABOVE;Lu;0;L;0052 0307;;;;N;;;;1E59;
+1E59;LATIN SMALL LETTER R WITH DOT ABOVE;Ll;0;L;0072 0307;;;;N;;;1E58;;1E58
+1E5A;LATIN CAPITAL LETTER R WITH DOT BELOW;Lu;0;L;0052 0323;;;;N;;;;1E5B;
+1E5B;LATIN SMALL LETTER R WITH DOT BELOW;Ll;0;L;0072 0323;;;;N;;;1E5A;;1E5A
+1E5C;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON;Lu;0;L;1E5A 0304;;;;N;;;;1E5D;
+1E5D;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON;Ll;0;L;1E5B 0304;;;;N;;;1E5C;;1E5C
+1E5E;LATIN CAPITAL LETTER R WITH LINE BELOW;Lu;0;L;0052 0331;;;;N;;;;1E5F;
+1E5F;LATIN SMALL LETTER R WITH LINE BELOW;Ll;0;L;0072 0331;;;;N;;;1E5E;;1E5E
+1E60;LATIN CAPITAL LETTER S WITH DOT ABOVE;Lu;0;L;0053 0307;;;;N;;;;1E61;
+1E61;LATIN SMALL LETTER S WITH DOT ABOVE;Ll;0;L;0073 0307;;;;N;;;1E60;;1E60
+1E62;LATIN CAPITAL LETTER S WITH DOT BELOW;Lu;0;L;0053 0323;;;;N;;;;1E63;
+1E63;LATIN SMALL LETTER S WITH DOT BELOW;Ll;0;L;0073 0323;;;;N;;;1E62;;1E62
+1E64;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE;Lu;0;L;015A 0307;;;;N;;;;1E65;
+1E65;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE;Ll;0;L;015B 0307;;;;N;;;1E64;;1E64
+1E66;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE;Lu;0;L;0160 0307;;;;N;;;;1E67;
+1E67;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE;Ll;0;L;0161 0307;;;;N;;;1E66;;1E66
+1E68;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE;Lu;0;L;1E62 0307;;;;N;;;;1E69;
+1E69;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE;Ll;0;L;1E63 0307;;;;N;;;1E68;;1E68
+1E6A;LATIN CAPITAL LETTER T WITH DOT ABOVE;Lu;0;L;0054 0307;;;;N;;;;1E6B;
+1E6B;LATIN SMALL LETTER T WITH DOT ABOVE;Ll;0;L;0074 0307;;;;N;;;1E6A;;1E6A
+1E6C;LATIN CAPITAL LETTER T WITH DOT BELOW;Lu;0;L;0054 0323;;;;N;;;;1E6D;
+1E6D;LATIN SMALL LETTER T WITH DOT BELOW;Ll;0;L;0074 0323;;;;N;;;1E6C;;1E6C
+1E6E;LATIN CAPITAL LETTER T WITH LINE BELOW;Lu;0;L;0054 0331;;;;N;;;;1E6F;
+1E6F;LATIN SMALL LETTER T WITH LINE BELOW;Ll;0;L;0074 0331;;;;N;;;1E6E;;1E6E
+1E70;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW;Lu;0;L;0054 032D;;;;N;;;;1E71;
+1E71;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW;Ll;0;L;0074 032D;;;;N;;;1E70;;1E70
+1E72;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW;Lu;0;L;0055 0324;;;;N;;;;1E73;
+1E73;LATIN SMALL LETTER U WITH DIAERESIS BELOW;Ll;0;L;0075 0324;;;;N;;;1E72;;1E72
+1E74;LATIN CAPITAL LETTER U WITH TILDE BELOW;Lu;0;L;0055 0330;;;;N;;;;1E75;
+1E75;LATIN SMALL LETTER U WITH TILDE BELOW;Ll;0;L;0075 0330;;;;N;;;1E74;;1E74
+1E76;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW;Lu;0;L;0055 032D;;;;N;;;;1E77;
+1E77;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW;Ll;0;L;0075 032D;;;;N;;;1E76;;1E76
+1E78;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE;Lu;0;L;0168 0301;;;;N;;;;1E79;
+1E79;LATIN SMALL LETTER U WITH TILDE AND ACUTE;Ll;0;L;0169 0301;;;;N;;;1E78;;1E78
+1E7A;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS;Lu;0;L;016A 0308;;;;N;;;;1E7B;
+1E7B;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS;Ll;0;L;016B 0308;;;;N;;;1E7A;;1E7A
+1E7C;LATIN CAPITAL LETTER V WITH TILDE;Lu;0;L;0056 0303;;;;N;;;;1E7D;
+1E7D;LATIN SMALL LETTER V WITH TILDE;Ll;0;L;0076 0303;;;;N;;;1E7C;;1E7C
+1E7E;LATIN CAPITAL LETTER V WITH DOT BELOW;Lu;0;L;0056 0323;;;;N;;;;1E7F;
+1E7F;LATIN SMALL LETTER V WITH DOT BELOW;Ll;0;L;0076 0323;;;;N;;;1E7E;;1E7E
+1E80;LATIN CAPITAL LETTER W WITH GRAVE;Lu;0;L;0057 0300;;;;N;;;;1E81;
+1E81;LATIN SMALL LETTER W WITH GRAVE;Ll;0;L;0077 0300;;;;N;;;1E80;;1E80
+1E82;LATIN CAPITAL LETTER W WITH ACUTE;Lu;0;L;0057 0301;;;;N;;;;1E83;
+1E83;LATIN SMALL LETTER W WITH ACUTE;Ll;0;L;0077 0301;;;;N;;;1E82;;1E82
+1E84;LATIN CAPITAL LETTER W WITH DIAERESIS;Lu;0;L;0057 0308;;;;N;;;;1E85;
+1E85;LATIN SMALL LETTER W WITH DIAERESIS;Ll;0;L;0077 0308;;;;N;;;1E84;;1E84
+1E86;LATIN CAPITAL LETTER W WITH DOT ABOVE;Lu;0;L;0057 0307;;;;N;;;;1E87;
+1E87;LATIN SMALL LETTER W WITH DOT ABOVE;Ll;0;L;0077 0307;;;;N;;;1E86;;1E86
+1E88;LATIN CAPITAL LETTER W WITH DOT BELOW;Lu;0;L;0057 0323;;;;N;;;;1E89;
+1E89;LATIN SMALL LETTER W WITH DOT BELOW;Ll;0;L;0077 0323;;;;N;;;1E88;;1E88
+1E8A;LATIN CAPITAL LETTER X WITH DOT ABOVE;Lu;0;L;0058 0307;;;;N;;;;1E8B;
+1E8B;LATIN SMALL LETTER X WITH DOT ABOVE;Ll;0;L;0078 0307;;;;N;;;1E8A;;1E8A
+1E8C;LATIN CAPITAL LETTER X WITH DIAERESIS;Lu;0;L;0058 0308;;;;N;;;;1E8D;
+1E8D;LATIN SMALL LETTER X WITH DIAERESIS;Ll;0;L;0078 0308;;;;N;;;1E8C;;1E8C
+1E8E;LATIN CAPITAL LETTER Y WITH DOT ABOVE;Lu;0;L;0059 0307;;;;N;;;;1E8F;
+1E8F;LATIN SMALL LETTER Y WITH DOT ABOVE;Ll;0;L;0079 0307;;;;N;;;1E8E;;1E8E
+1E90;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX;Lu;0;L;005A 0302;;;;N;;;;1E91;
+1E91;LATIN SMALL LETTER Z WITH CIRCUMFLEX;Ll;0;L;007A 0302;;;;N;;;1E90;;1E90
+1E92;LATIN CAPITAL LETTER Z WITH DOT BELOW;Lu;0;L;005A 0323;;;;N;;;;1E93;
+1E93;LATIN SMALL LETTER Z WITH DOT BELOW;Ll;0;L;007A 0323;;;;N;;;1E92;;1E92
+1E94;LATIN CAPITAL LETTER Z WITH LINE BELOW;Lu;0;L;005A 0331;;;;N;;;;1E95;
+1E95;LATIN SMALL LETTER Z WITH LINE BELOW;Ll;0;L;007A 0331;;;;N;;;1E94;;1E94
+1E96;LATIN SMALL LETTER H WITH LINE BELOW;Ll;0;L;0068 0331;;;;N;;;;;
+1E97;LATIN SMALL LETTER T WITH DIAERESIS;Ll;0;L;0074 0308;;;;N;;;;;
+1E98;LATIN SMALL LETTER W WITH RING ABOVE;Ll;0;L;0077 030A;;;;N;;;;;
+1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;;
+1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L;<compat> 0061 02BE;;;;N;;;;;
+1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60
+1E9C;LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;;;
+1E9D;LATIN SMALL LETTER LONG S WITH HIGH STROKE;Ll;0;L;;;;;N;;;;;
+1E9E;LATIN CAPITAL LETTER SHARP S;Lu;0;L;;;;;N;;;;00DF;
+1E9F;LATIN SMALL LETTER DELTA;Ll;0;L;;;;;N;;;;;
+1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1;
+1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0
+1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3;
+1EA3;LATIN SMALL LETTER A WITH HOOK ABOVE;Ll;0;L;0061 0309;;;;N;;;1EA2;;1EA2
+1EA4;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00C2 0301;;;;N;;;;1EA5;
+1EA5;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00E2 0301;;;;N;;;1EA4;;1EA4
+1EA6;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00C2 0300;;;;N;;;;1EA7;
+1EA7;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00E2 0300;;;;N;;;1EA6;;1EA6
+1EA8;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00C2 0309;;;;N;;;;1EA9;
+1EA9;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00E2 0309;;;;N;;;1EA8;;1EA8
+1EAA;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE;Lu;0;L;00C2 0303;;;;N;;;;1EAB;
+1EAB;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE;Ll;0;L;00E2 0303;;;;N;;;1EAA;;1EAA
+1EAC;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EA0 0302;;;;N;;;;1EAD;
+1EAD;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EA1 0302;;;;N;;;1EAC;;1EAC
+1EAE;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE;Lu;0;L;0102 0301;;;;N;;;;1EAF;
+1EAF;LATIN SMALL LETTER A WITH BREVE AND ACUTE;Ll;0;L;0103 0301;;;;N;;;1EAE;;1EAE
+1EB0;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE;Lu;0;L;0102 0300;;;;N;;;;1EB1;
+1EB1;LATIN SMALL LETTER A WITH BREVE AND GRAVE;Ll;0;L;0103 0300;;;;N;;;1EB0;;1EB0
+1EB2;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE;Lu;0;L;0102 0309;;;;N;;;;1EB3;
+1EB3;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE;Ll;0;L;0103 0309;;;;N;;;1EB2;;1EB2
+1EB4;LATIN CAPITAL LETTER A WITH BREVE AND TILDE;Lu;0;L;0102 0303;;;;N;;;;1EB5;
+1EB5;LATIN SMALL LETTER A WITH BREVE AND TILDE;Ll;0;L;0103 0303;;;;N;;;1EB4;;1EB4
+1EB6;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW;Lu;0;L;1EA0 0306;;;;N;;;;1EB7;
+1EB7;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW;Ll;0;L;1EA1 0306;;;;N;;;1EB6;;1EB6
+1EB8;LATIN CAPITAL LETTER E WITH DOT BELOW;Lu;0;L;0045 0323;;;;N;;;;1EB9;
+1EB9;LATIN SMALL LETTER E WITH DOT BELOW;Ll;0;L;0065 0323;;;;N;;;1EB8;;1EB8
+1EBA;LATIN CAPITAL LETTER E WITH HOOK ABOVE;Lu;0;L;0045 0309;;;;N;;;;1EBB;
+1EBB;LATIN SMALL LETTER E WITH HOOK ABOVE;Ll;0;L;0065 0309;;;;N;;;1EBA;;1EBA
+1EBC;LATIN CAPITAL LETTER E WITH TILDE;Lu;0;L;0045 0303;;;;N;;;;1EBD;
+1EBD;LATIN SMALL LETTER E WITH TILDE;Ll;0;L;0065 0303;;;;N;;;1EBC;;1EBC
+1EBE;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00CA 0301;;;;N;;;;1EBF;
+1EBF;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00EA 0301;;;;N;;;1EBE;;1EBE
+1EC0;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00CA 0300;;;;N;;;;1EC1;
+1EC1;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00EA 0300;;;;N;;;1EC0;;1EC0
+1EC2;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00CA 0309;;;;N;;;;1EC3;
+1EC3;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00EA 0309;;;;N;;;1EC2;;1EC2
+1EC4;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE;Lu;0;L;00CA 0303;;;;N;;;;1EC5;
+1EC5;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE;Ll;0;L;00EA 0303;;;;N;;;1EC4;;1EC4
+1EC6;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EB8 0302;;;;N;;;;1EC7;
+1EC7;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EB9 0302;;;;N;;;1EC6;;1EC6
+1EC8;LATIN CAPITAL LETTER I WITH HOOK ABOVE;Lu;0;L;0049 0309;;;;N;;;;1EC9;
+1EC9;LATIN SMALL LETTER I WITH HOOK ABOVE;Ll;0;L;0069 0309;;;;N;;;1EC8;;1EC8
+1ECA;LATIN CAPITAL LETTER I WITH DOT BELOW;Lu;0;L;0049 0323;;;;N;;;;1ECB;
+1ECB;LATIN SMALL LETTER I WITH DOT BELOW;Ll;0;L;0069 0323;;;;N;;;1ECA;;1ECA
+1ECC;LATIN CAPITAL LETTER O WITH DOT BELOW;Lu;0;L;004F 0323;;;;N;;;;1ECD;
+1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC
+1ECE;LATIN CAPITAL LETTER O WITH HOOK ABOVE;Lu;0;L;004F 0309;;;;N;;;;1ECF;
+1ECF;LATIN SMALL LETTER O WITH HOOK ABOVE;Ll;0;L;006F 0309;;;;N;;;1ECE;;1ECE
+1ED0;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00D4 0301;;;;N;;;;1ED1;
+1ED1;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00F4 0301;;;;N;;;1ED0;;1ED0
+1ED2;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00D4 0300;;;;N;;;;1ED3;
+1ED3;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00F4 0300;;;;N;;;1ED2;;1ED2
+1ED4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00D4 0309;;;;N;;;;1ED5;
+1ED5;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00F4 0309;;;;N;;;1ED4;;1ED4
+1ED6;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE;Lu;0;L;00D4 0303;;;;N;;;;1ED7;
+1ED7;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE;Ll;0;L;00F4 0303;;;;N;;;1ED6;;1ED6
+1ED8;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1ECC 0302;;;;N;;;;1ED9;
+1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8
+1EDA;LATIN CAPITAL LETTER O WITH HORN AND ACUTE;Lu;0;L;01A0 0301;;;;N;;;;1EDB;
+1EDB;LATIN SMALL LETTER O WITH HORN AND ACUTE;Ll;0;L;01A1 0301;;;;N;;;1EDA;;1EDA
+1EDC;LATIN CAPITAL LETTER O WITH HORN AND GRAVE;Lu;0;L;01A0 0300;;;;N;;;;1EDD;
+1EDD;LATIN SMALL LETTER O WITH HORN AND GRAVE;Ll;0;L;01A1 0300;;;;N;;;1EDC;;1EDC
+1EDE;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE;Lu;0;L;01A0 0309;;;;N;;;;1EDF;
+1EDF;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE;Ll;0;L;01A1 0309;;;;N;;;1EDE;;1EDE
+1EE0;LATIN CAPITAL LETTER O WITH HORN AND TILDE;Lu;0;L;01A0 0303;;;;N;;;;1EE1;
+1EE1;LATIN SMALL LETTER O WITH HORN AND TILDE;Ll;0;L;01A1 0303;;;;N;;;1EE0;;1EE0
+1EE2;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW;Lu;0;L;01A0 0323;;;;N;;;;1EE3;
+1EE3;LATIN SMALL LETTER O WITH HORN AND DOT BELOW;Ll;0;L;01A1 0323;;;;N;;;1EE2;;1EE2
+1EE4;LATIN CAPITAL LETTER U WITH DOT BELOW;Lu;0;L;0055 0323;;;;N;;;;1EE5;
+1EE5;LATIN SMALL LETTER U WITH DOT BELOW;Ll;0;L;0075 0323;;;;N;;;1EE4;;1EE4
+1EE6;LATIN CAPITAL LETTER U WITH HOOK ABOVE;Lu;0;L;0055 0309;;;;N;;;;1EE7;
+1EE7;LATIN SMALL LETTER U WITH HOOK ABOVE;Ll;0;L;0075 0309;;;;N;;;1EE6;;1EE6
+1EE8;LATIN CAPITAL LETTER U WITH HORN AND ACUTE;Lu;0;L;01AF 0301;;;;N;;;;1EE9;
+1EE9;LATIN SMALL LETTER U WITH HORN AND ACUTE;Ll;0;L;01B0 0301;;;;N;;;1EE8;;1EE8
+1EEA;LATIN CAPITAL LETTER U WITH HORN AND GRAVE;Lu;0;L;01AF 0300;;;;N;;;;1EEB;
+1EEB;LATIN SMALL LETTER U WITH HORN AND GRAVE;Ll;0;L;01B0 0300;;;;N;;;1EEA;;1EEA
+1EEC;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE;Lu;0;L;01AF 0309;;;;N;;;;1EED;
+1EED;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE;Ll;0;L;01B0 0309;;;;N;;;1EEC;;1EEC
+1EEE;LATIN CAPITAL LETTER U WITH HORN AND TILDE;Lu;0;L;01AF 0303;;;;N;;;;1EEF;
+1EEF;LATIN SMALL LETTER U WITH HORN AND TILDE;Ll;0;L;01B0 0303;;;;N;;;1EEE;;1EEE
+1EF0;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW;Lu;0;L;01AF 0323;;;;N;;;;1EF1;
+1EF1;LATIN SMALL LETTER U WITH HORN AND DOT BELOW;Ll;0;L;01B0 0323;;;;N;;;1EF0;;1EF0
+1EF2;LATIN CAPITAL LETTER Y WITH GRAVE;Lu;0;L;0059 0300;;;;N;;;;1EF3;
+1EF3;LATIN SMALL LETTER Y WITH GRAVE;Ll;0;L;0079 0300;;;;N;;;1EF2;;1EF2
+1EF4;LATIN CAPITAL LETTER Y WITH DOT BELOW;Lu;0;L;0059 0323;;;;N;;;;1EF5;
+1EF5;LATIN SMALL LETTER Y WITH DOT BELOW;Ll;0;L;0079 0323;;;;N;;;1EF4;;1EF4
+1EF6;LATIN CAPITAL LETTER Y WITH HOOK ABOVE;Lu;0;L;0059 0309;;;;N;;;;1EF7;
+1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6
+1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9;
+1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8
+1EFA;LATIN CAPITAL LETTER MIDDLE-WELSH LL;Lu;0;L;;;;;N;;;;1EFB;
+1EFB;LATIN SMALL LETTER MIDDLE-WELSH LL;Ll;0;L;;;;;N;;;1EFA;;1EFA
+1EFC;LATIN CAPITAL LETTER MIDDLE-WELSH V;Lu;0;L;;;;;N;;;;1EFD;
+1EFD;LATIN SMALL LETTER MIDDLE-WELSH V;Ll;0;L;;;;;N;;;1EFC;;1EFC
+1EFE;LATIN CAPITAL LETTER Y WITH LOOP;Lu;0;L;;;;;N;;;;1EFF;
+1EFF;LATIN SMALL LETTER Y WITH LOOP;Ll;0;L;;;;;N;;;1EFE;;1EFE
+1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08
+1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09
+1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A
+1F03;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA;Ll;0;L;1F01 0300;;;;N;;;1F0B;;1F0B
+1F04;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA;Ll;0;L;1F00 0301;;;;N;;;1F0C;;1F0C
+1F05;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA;Ll;0;L;1F01 0301;;;;N;;;1F0D;;1F0D
+1F06;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI;Ll;0;L;1F00 0342;;;;N;;;1F0E;;1F0E
+1F07;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI;Ll;0;L;1F01 0342;;;;N;;;1F0F;;1F0F
+1F08;GREEK CAPITAL LETTER ALPHA WITH PSILI;Lu;0;L;0391 0313;;;;N;;;;1F00;
+1F09;GREEK CAPITAL LETTER ALPHA WITH DASIA;Lu;0;L;0391 0314;;;;N;;;;1F01;
+1F0A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA;Lu;0;L;1F08 0300;;;;N;;;;1F02;
+1F0B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA;Lu;0;L;1F09 0300;;;;N;;;;1F03;
+1F0C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA;Lu;0;L;1F08 0301;;;;N;;;;1F04;
+1F0D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA;Lu;0;L;1F09 0301;;;;N;;;;1F05;
+1F0E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI;Lu;0;L;1F08 0342;;;;N;;;;1F06;
+1F0F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI;Lu;0;L;1F09 0342;;;;N;;;;1F07;
+1F10;GREEK SMALL LETTER EPSILON WITH PSILI;Ll;0;L;03B5 0313;;;;N;;;1F18;;1F18
+1F11;GREEK SMALL LETTER EPSILON WITH DASIA;Ll;0;L;03B5 0314;;;;N;;;1F19;;1F19
+1F12;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA;Ll;0;L;1F10 0300;;;;N;;;1F1A;;1F1A
+1F13;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA;Ll;0;L;1F11 0300;;;;N;;;1F1B;;1F1B
+1F14;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA;Ll;0;L;1F10 0301;;;;N;;;1F1C;;1F1C
+1F15;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA;Ll;0;L;1F11 0301;;;;N;;;1F1D;;1F1D
+1F18;GREEK CAPITAL LETTER EPSILON WITH PSILI;Lu;0;L;0395 0313;;;;N;;;;1F10;
+1F19;GREEK CAPITAL LETTER EPSILON WITH DASIA;Lu;0;L;0395 0314;;;;N;;;;1F11;
+1F1A;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA;Lu;0;L;1F18 0300;;;;N;;;;1F12;
+1F1B;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA;Lu;0;L;1F19 0300;;;;N;;;;1F13;
+1F1C;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA;Lu;0;L;1F18 0301;;;;N;;;;1F14;
+1F1D;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA;Lu;0;L;1F19 0301;;;;N;;;;1F15;
+1F20;GREEK SMALL LETTER ETA WITH PSILI;Ll;0;L;03B7 0313;;;;N;;;1F28;;1F28
+1F21;GREEK SMALL LETTER ETA WITH DASIA;Ll;0;L;03B7 0314;;;;N;;;1F29;;1F29
+1F22;GREEK SMALL LETTER ETA WITH PSILI AND VARIA;Ll;0;L;1F20 0300;;;;N;;;1F2A;;1F2A
+1F23;GREEK SMALL LETTER ETA WITH DASIA AND VARIA;Ll;0;L;1F21 0300;;;;N;;;1F2B;;1F2B
+1F24;GREEK SMALL LETTER ETA WITH PSILI AND OXIA;Ll;0;L;1F20 0301;;;;N;;;1F2C;;1F2C
+1F25;GREEK SMALL LETTER ETA WITH DASIA AND OXIA;Ll;0;L;1F21 0301;;;;N;;;1F2D;;1F2D
+1F26;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI;Ll;0;L;1F20 0342;;;;N;;;1F2E;;1F2E
+1F27;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI;Ll;0;L;1F21 0342;;;;N;;;1F2F;;1F2F
+1F28;GREEK CAPITAL LETTER ETA WITH PSILI;Lu;0;L;0397 0313;;;;N;;;;1F20;
+1F29;GREEK CAPITAL LETTER ETA WITH DASIA;Lu;0;L;0397 0314;;;;N;;;;1F21;
+1F2A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA;Lu;0;L;1F28 0300;;;;N;;;;1F22;
+1F2B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA;Lu;0;L;1F29 0300;;;;N;;;;1F23;
+1F2C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA;Lu;0;L;1F28 0301;;;;N;;;;1F24;
+1F2D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA;Lu;0;L;1F29 0301;;;;N;;;;1F25;
+1F2E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI;Lu;0;L;1F28 0342;;;;N;;;;1F26;
+1F2F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI;Lu;0;L;1F29 0342;;;;N;;;;1F27;
+1F30;GREEK SMALL LETTER IOTA WITH PSILI;Ll;0;L;03B9 0313;;;;N;;;1F38;;1F38
+1F31;GREEK SMALL LETTER IOTA WITH DASIA;Ll;0;L;03B9 0314;;;;N;;;1F39;;1F39
+1F32;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA;Ll;0;L;1F30 0300;;;;N;;;1F3A;;1F3A
+1F33;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA;Ll;0;L;1F31 0300;;;;N;;;1F3B;;1F3B
+1F34;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA;Ll;0;L;1F30 0301;;;;N;;;1F3C;;1F3C
+1F35;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA;Ll;0;L;1F31 0301;;;;N;;;1F3D;;1F3D
+1F36;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI;Ll;0;L;1F30 0342;;;;N;;;1F3E;;1F3E
+1F37;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI;Ll;0;L;1F31 0342;;;;N;;;1F3F;;1F3F
+1F38;GREEK CAPITAL LETTER IOTA WITH PSILI;Lu;0;L;0399 0313;;;;N;;;;1F30;
+1F39;GREEK CAPITAL LETTER IOTA WITH DASIA;Lu;0;L;0399 0314;;;;N;;;;1F31;
+1F3A;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA;Lu;0;L;1F38 0300;;;;N;;;;1F32;
+1F3B;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA;Lu;0;L;1F39 0300;;;;N;;;;1F33;
+1F3C;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA;Lu;0;L;1F38 0301;;;;N;;;;1F34;
+1F3D;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA;Lu;0;L;1F39 0301;;;;N;;;;1F35;
+1F3E;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI;Lu;0;L;1F38 0342;;;;N;;;;1F36;
+1F3F;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI;Lu;0;L;1F39 0342;;;;N;;;;1F37;
+1F40;GREEK SMALL LETTER OMICRON WITH PSILI;Ll;0;L;03BF 0313;;;;N;;;1F48;;1F48
+1F41;GREEK SMALL LETTER OMICRON WITH DASIA;Ll;0;L;03BF 0314;;;;N;;;1F49;;1F49
+1F42;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA;Ll;0;L;1F40 0300;;;;N;;;1F4A;;1F4A
+1F43;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA;Ll;0;L;1F41 0300;;;;N;;;1F4B;;1F4B
+1F44;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA;Ll;0;L;1F40 0301;;;;N;;;1F4C;;1F4C
+1F45;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA;Ll;0;L;1F41 0301;;;;N;;;1F4D;;1F4D
+1F48;GREEK CAPITAL LETTER OMICRON WITH PSILI;Lu;0;L;039F 0313;;;;N;;;;1F40;
+1F49;GREEK CAPITAL LETTER OMICRON WITH DASIA;Lu;0;L;039F 0314;;;;N;;;;1F41;
+1F4A;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA;Lu;0;L;1F48 0300;;;;N;;;;1F42;
+1F4B;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA;Lu;0;L;1F49 0300;;;;N;;;;1F43;
+1F4C;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA;Lu;0;L;1F48 0301;;;;N;;;;1F44;
+1F4D;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA;Lu;0;L;1F49 0301;;;;N;;;;1F45;
+1F50;GREEK SMALL LETTER UPSILON WITH PSILI;Ll;0;L;03C5 0313;;;;N;;;;;
+1F51;GREEK SMALL LETTER UPSILON WITH DASIA;Ll;0;L;03C5 0314;;;;N;;;1F59;;1F59
+1F52;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA;Ll;0;L;1F50 0300;;;;N;;;;;
+1F53;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA;Ll;0;L;1F51 0300;;;;N;;;1F5B;;1F5B
+1F54;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA;Ll;0;L;1F50 0301;;;;N;;;;;
+1F55;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA;Ll;0;L;1F51 0301;;;;N;;;1F5D;;1F5D
+1F56;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI;Ll;0;L;1F50 0342;;;;N;;;;;
+1F57;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI;Ll;0;L;1F51 0342;;;;N;;;1F5F;;1F5F
+1F59;GREEK CAPITAL LETTER UPSILON WITH DASIA;Lu;0;L;03A5 0314;;;;N;;;;1F51;
+1F5B;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA;Lu;0;L;1F59 0300;;;;N;;;;1F53;
+1F5D;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA;Lu;0;L;1F59 0301;;;;N;;;;1F55;
+1F5F;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI;Lu;0;L;1F59 0342;;;;N;;;;1F57;
+1F60;GREEK SMALL LETTER OMEGA WITH PSILI;Ll;0;L;03C9 0313;;;;N;;;1F68;;1F68
+1F61;GREEK SMALL LETTER OMEGA WITH DASIA;Ll;0;L;03C9 0314;;;;N;;;1F69;;1F69
+1F62;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA;Ll;0;L;1F60 0300;;;;N;;;1F6A;;1F6A
+1F63;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA;Ll;0;L;1F61 0300;;;;N;;;1F6B;;1F6B
+1F64;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA;Ll;0;L;1F60 0301;;;;N;;;1F6C;;1F6C
+1F65;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA;Ll;0;L;1F61 0301;;;;N;;;1F6D;;1F6D
+1F66;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI;Ll;0;L;1F60 0342;;;;N;;;1F6E;;1F6E
+1F67;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI;Ll;0;L;1F61 0342;;;;N;;;1F6F;;1F6F
+1F68;GREEK CAPITAL LETTER OMEGA WITH PSILI;Lu;0;L;03A9 0313;;;;N;;;;1F60;
+1F69;GREEK CAPITAL LETTER OMEGA WITH DASIA;Lu;0;L;03A9 0314;;;;N;;;;1F61;
+1F6A;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA;Lu;0;L;1F68 0300;;;;N;;;;1F62;
+1F6B;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA;Lu;0;L;1F69 0300;;;;N;;;;1F63;
+1F6C;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA;Lu;0;L;1F68 0301;;;;N;;;;1F64;
+1F6D;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA;Lu;0;L;1F69 0301;;;;N;;;;1F65;
+1F6E;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI;Lu;0;L;1F68 0342;;;;N;;;;1F66;
+1F6F;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI;Lu;0;L;1F69 0342;;;;N;;;;1F67;
+1F70;GREEK SMALL LETTER ALPHA WITH VARIA;Ll;0;L;03B1 0300;;;;N;;;1FBA;;1FBA
+1F71;GREEK SMALL LETTER ALPHA WITH OXIA;Ll;0;L;03AC;;;;N;;;1FBB;;1FBB
+1F72;GREEK SMALL LETTER EPSILON WITH VARIA;Ll;0;L;03B5 0300;;;;N;;;1FC8;;1FC8
+1F73;GREEK SMALL LETTER EPSILON WITH OXIA;Ll;0;L;03AD;;;;N;;;1FC9;;1FC9
+1F74;GREEK SMALL LETTER ETA WITH VARIA;Ll;0;L;03B7 0300;;;;N;;;1FCA;;1FCA
+1F75;GREEK SMALL LETTER ETA WITH OXIA;Ll;0;L;03AE;;;;N;;;1FCB;;1FCB
+1F76;GREEK SMALL LETTER IOTA WITH VARIA;Ll;0;L;03B9 0300;;;;N;;;1FDA;;1FDA
+1F77;GREEK SMALL LETTER IOTA WITH OXIA;Ll;0;L;03AF;;;;N;;;1FDB;;1FDB
+1F78;GREEK SMALL LETTER OMICRON WITH VARIA;Ll;0;L;03BF 0300;;;;N;;;1FF8;;1FF8
+1F79;GREEK SMALL LETTER OMICRON WITH OXIA;Ll;0;L;03CC;;;;N;;;1FF9;;1FF9
+1F7A;GREEK SMALL LETTER UPSILON WITH VARIA;Ll;0;L;03C5 0300;;;;N;;;1FEA;;1FEA
+1F7B;GREEK SMALL LETTER UPSILON WITH OXIA;Ll;0;L;03CD;;;;N;;;1FEB;;1FEB
+1F7C;GREEK SMALL LETTER OMEGA WITH VARIA;Ll;0;L;03C9 0300;;;;N;;;1FFA;;1FFA
+1F7D;GREEK SMALL LETTER OMEGA WITH OXIA;Ll;0;L;03CE;;;;N;;;1FFB;;1FFB
+1F80;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F00 0345;;;;N;;;1F88;;1F88
+1F81;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F01 0345;;;;N;;;1F89;;1F89
+1F82;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F02 0345;;;;N;;;1F8A;;1F8A
+1F83;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F03 0345;;;;N;;;1F8B;;1F8B
+1F84;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F04 0345;;;;N;;;1F8C;;1F8C
+1F85;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F05 0345;;;;N;;;1F8D;;1F8D
+1F86;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F06 0345;;;;N;;;1F8E;;1F8E
+1F87;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F07 0345;;;;N;;;1F8F;;1F8F
+1F88;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F08 0345;;;;N;;;;1F80;
+1F89;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F09 0345;;;;N;;;;1F81;
+1F8A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0A 0345;;;;N;;;;1F82;
+1F8B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0B 0345;;;;N;;;;1F83;
+1F8C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0C 0345;;;;N;;;;1F84;
+1F8D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0D 0345;;;;N;;;;1F85;
+1F8E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0E 0345;;;;N;;;;1F86;
+1F8F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0F 0345;;;;N;;;;1F87;
+1F90;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F20 0345;;;;N;;;1F98;;1F98
+1F91;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F21 0345;;;;N;;;1F99;;1F99
+1F92;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F22 0345;;;;N;;;1F9A;;1F9A
+1F93;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F23 0345;;;;N;;;1F9B;;1F9B
+1F94;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F24 0345;;;;N;;;1F9C;;1F9C
+1F95;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F25 0345;;;;N;;;1F9D;;1F9D
+1F96;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F26 0345;;;;N;;;1F9E;;1F9E
+1F97;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F27 0345;;;;N;;;1F9F;;1F9F
+1F98;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F28 0345;;;;N;;;;1F90;
+1F99;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F29 0345;;;;N;;;;1F91;
+1F9A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2A 0345;;;;N;;;;1F92;
+1F9B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2B 0345;;;;N;;;;1F93;
+1F9C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2C 0345;;;;N;;;;1F94;
+1F9D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2D 0345;;;;N;;;;1F95;
+1F9E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2E 0345;;;;N;;;;1F96;
+1F9F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2F 0345;;;;N;;;;1F97;
+1FA0;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F60 0345;;;;N;;;1FA8;;1FA8
+1FA1;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F61 0345;;;;N;;;1FA9;;1FA9
+1FA2;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F62 0345;;;;N;;;1FAA;;1FAA
+1FA3;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F63 0345;;;;N;;;1FAB;;1FAB
+1FA4;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F64 0345;;;;N;;;1FAC;;1FAC
+1FA5;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F65 0345;;;;N;;;1FAD;;1FAD
+1FA6;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F66 0345;;;;N;;;1FAE;;1FAE
+1FA7;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F67 0345;;;;N;;;1FAF;;1FAF
+1FA8;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F68 0345;;;;N;;;;1FA0;
+1FA9;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F69 0345;;;;N;;;;1FA1;
+1FAA;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6A 0345;;;;N;;;;1FA2;
+1FAB;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6B 0345;;;;N;;;;1FA3;
+1FAC;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6C 0345;;;;N;;;;1FA4;
+1FAD;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6D 0345;;;;N;;;;1FA5;
+1FAE;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6E 0345;;;;N;;;;1FA6;
+1FAF;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6F 0345;;;;N;;;;1FA7;
+1FB0;GREEK SMALL LETTER ALPHA WITH VRACHY;Ll;0;L;03B1 0306;;;;N;;;1FB8;;1FB8
+1FB1;GREEK SMALL LETTER ALPHA WITH MACRON;Ll;0;L;03B1 0304;;;;N;;;1FB9;;1FB9
+1FB2;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F70 0345;;;;N;;;;;
+1FB3;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI;Ll;0;L;03B1 0345;;;;N;;;1FBC;;1FBC
+1FB4;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AC 0345;;;;N;;;;;
+1FB6;GREEK SMALL LETTER ALPHA WITH PERISPOMENI;Ll;0;L;03B1 0342;;;;N;;;;;
+1FB7;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FB6 0345;;;;N;;;;;
+1FB8;GREEK CAPITAL LETTER ALPHA WITH VRACHY;Lu;0;L;0391 0306;;;;N;;;;1FB0;
+1FB9;GREEK CAPITAL LETTER ALPHA WITH MACRON;Lu;0;L;0391 0304;;;;N;;;;1FB1;
+1FBA;GREEK CAPITAL LETTER ALPHA WITH VARIA;Lu;0;L;0391 0300;;;;N;;;;1F70;
+1FBB;GREEK CAPITAL LETTER ALPHA WITH OXIA;Lu;0;L;0386;;;;N;;;;1F71;
+1FBC;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI;Lt;0;L;0391 0345;;;;N;;;;1FB3;
+1FBD;GREEK KORONIS;Sk;0;ON;<compat> 0020 0313;;;;N;;;;;
+1FBE;GREEK PROSGEGRAMMENI;Ll;0;L;03B9;;;;N;;;0399;;0399
+1FBF;GREEK PSILI;Sk;0;ON;<compat> 0020 0313;;;;N;;;;;
+1FC0;GREEK PERISPOMENI;Sk;0;ON;<compat> 0020 0342;;;;N;;;;;
+1FC1;GREEK DIALYTIKA AND PERISPOMENI;Sk;0;ON;00A8 0342;;;;N;;;;;
+1FC2;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F74 0345;;;;N;;;;;
+1FC3;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI;Ll;0;L;03B7 0345;;;;N;;;1FCC;;1FCC
+1FC4;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AE 0345;;;;N;;;;;
+1FC6;GREEK SMALL LETTER ETA WITH PERISPOMENI;Ll;0;L;03B7 0342;;;;N;;;;;
+1FC7;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FC6 0345;;;;N;;;;;
+1FC8;GREEK CAPITAL LETTER EPSILON WITH VARIA;Lu;0;L;0395 0300;;;;N;;;;1F72;
+1FC9;GREEK CAPITAL LETTER EPSILON WITH OXIA;Lu;0;L;0388;;;;N;;;;1F73;
+1FCA;GREEK CAPITAL LETTER ETA WITH VARIA;Lu;0;L;0397 0300;;;;N;;;;1F74;
+1FCB;GREEK CAPITAL LETTER ETA WITH OXIA;Lu;0;L;0389;;;;N;;;;1F75;
+1FCC;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI;Lt;0;L;0397 0345;;;;N;;;;1FC3;
+1FCD;GREEK PSILI AND VARIA;Sk;0;ON;1FBF 0300;;;;N;;;;;
+1FCE;GREEK PSILI AND OXIA;Sk;0;ON;1FBF 0301;;;;N;;;;;
+1FCF;GREEK PSILI AND PERISPOMENI;Sk;0;ON;1FBF 0342;;;;N;;;;;
+1FD0;GREEK SMALL LETTER IOTA WITH VRACHY;Ll;0;L;03B9 0306;;;;N;;;1FD8;;1FD8
+1FD1;GREEK SMALL LETTER IOTA WITH MACRON;Ll;0;L;03B9 0304;;;;N;;;1FD9;;1FD9
+1FD2;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA;Ll;0;L;03CA 0300;;;;N;;;;;
+1FD3;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA;Ll;0;L;0390;;;;N;;;;;
+1FD6;GREEK SMALL LETTER IOTA WITH PERISPOMENI;Ll;0;L;03B9 0342;;;;N;;;;;
+1FD7;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CA 0342;;;;N;;;;;
+1FD8;GREEK CAPITAL LETTER IOTA WITH VRACHY;Lu;0;L;0399 0306;;;;N;;;;1FD0;
+1FD9;GREEK CAPITAL LETTER IOTA WITH MACRON;Lu;0;L;0399 0304;;;;N;;;;1FD1;
+1FDA;GREEK CAPITAL LETTER IOTA WITH VARIA;Lu;0;L;0399 0300;;;;N;;;;1F76;
+1FDB;GREEK CAPITAL LETTER IOTA WITH OXIA;Lu;0;L;038A;;;;N;;;;1F77;
+1FDD;GREEK DASIA AND VARIA;Sk;0;ON;1FFE 0300;;;;N;;;;;
+1FDE;GREEK DASIA AND OXIA;Sk;0;ON;1FFE 0301;;;;N;;;;;
+1FDF;GREEK DASIA AND PERISPOMENI;Sk;0;ON;1FFE 0342;;;;N;;;;;
+1FE0;GREEK SMALL LETTER UPSILON WITH VRACHY;Ll;0;L;03C5 0306;;;;N;;;1FE8;;1FE8
+1FE1;GREEK SMALL LETTER UPSILON WITH MACRON;Ll;0;L;03C5 0304;;;;N;;;1FE9;;1FE9
+1FE2;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA;Ll;0;L;03CB 0300;;;;N;;;;;
+1FE3;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA;Ll;0;L;03B0;;;;N;;;;;
+1FE4;GREEK SMALL LETTER RHO WITH PSILI;Ll;0;L;03C1 0313;;;;N;;;;;
+1FE5;GREEK SMALL LETTER RHO WITH DASIA;Ll;0;L;03C1 0314;;;;N;;;1FEC;;1FEC
+1FE6;GREEK SMALL LETTER UPSILON WITH PERISPOMENI;Ll;0;L;03C5 0342;;;;N;;;;;
+1FE7;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CB 0342;;;;N;;;;;
+1FE8;GREEK CAPITAL LETTER UPSILON WITH VRACHY;Lu;0;L;03A5 0306;;;;N;;;;1FE0;
+1FE9;GREEK CAPITAL LETTER UPSILON WITH MACRON;Lu;0;L;03A5 0304;;;;N;;;;1FE1;
+1FEA;GREEK CAPITAL LETTER UPSILON WITH VARIA;Lu;0;L;03A5 0300;;;;N;;;;1F7A;
+1FEB;GREEK CAPITAL LETTER UPSILON WITH OXIA;Lu;0;L;038E;;;;N;;;;1F7B;
+1FEC;GREEK CAPITAL LETTER RHO WITH DASIA;Lu;0;L;03A1 0314;;;;N;;;;1FE5;
+1FED;GREEK DIALYTIKA AND VARIA;Sk;0;ON;00A8 0300;;;;N;;;;;
+1FEE;GREEK DIALYTIKA AND OXIA;Sk;0;ON;0385;;;;N;;;;;
+1FEF;GREEK VARIA;Sk;0;ON;0060;;;;N;;;;;
+1FF2;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F7C 0345;;;;N;;;;;
+1FF3;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI;Ll;0;L;03C9 0345;;;;N;;;1FFC;;1FFC
+1FF4;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03CE 0345;;;;N;;;;;
+1FF6;GREEK SMALL LETTER OMEGA WITH PERISPOMENI;Ll;0;L;03C9 0342;;;;N;;;;;
+1FF7;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FF6 0345;;;;N;;;;;
+1FF8;GREEK CAPITAL LETTER OMICRON WITH VARIA;Lu;0;L;039F 0300;;;;N;;;;1F78;
+1FF9;GREEK CAPITAL LETTER OMICRON WITH OXIA;Lu;0;L;038C;;;;N;;;;1F79;
+1FFA;GREEK CAPITAL LETTER OMEGA WITH VARIA;Lu;0;L;03A9 0300;;;;N;;;;1F7C;
+1FFB;GREEK CAPITAL LETTER OMEGA WITH OXIA;Lu;0;L;038F;;;;N;;;;1F7D;
+1FFC;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI;Lt;0;L;03A9 0345;;;;N;;;;1FF3;
+1FFD;GREEK OXIA;Sk;0;ON;00B4;;;;N;;;;;
+1FFE;GREEK DASIA;Sk;0;ON;<compat> 0020 0314;;;;N;;;;;
+2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;;
+2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;;
+2002;EN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2003;EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2004;THREE-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2005;FOUR-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2006;SIX-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2007;FIGURE SPACE;Zs;0;WS;<noBreak> 0020;;;;N;;;;;
+2008;PUNCTUATION SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2009;THIN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+200A;HAIR SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+200B;ZERO WIDTH SPACE;Cf;0;BN;;;;;N;;;;;
+200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;;
+200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;;
+200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;;
+200F;RIGHT-TO-LEFT MARK;Cf;0;R;;;;;N;;;;;
+2010;HYPHEN;Pd;0;ON;;;;;N;;;;;
+2011;NON-BREAKING HYPHEN;Pd;0;ON;<noBreak> 2010;;;;N;;;;;
+2012;FIGURE DASH;Pd;0;ON;;;;;N;;;;;
+2013;EN DASH;Pd;0;ON;;;;;N;;;;;
+2014;EM DASH;Pd;0;ON;;;;;N;;;;;
+2015;HORIZONTAL BAR;Pd;0;ON;;;;;N;QUOTATION DASH;;;;
+2016;DOUBLE VERTICAL LINE;Po;0;ON;;;;;N;DOUBLE VERTICAL BAR;;;;
+2017;DOUBLE LOW LINE;Po;0;ON;<compat> 0020 0333;;;;N;SPACING DOUBLE UNDERSCORE;;;;
+2018;LEFT SINGLE QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE TURNED COMMA QUOTATION MARK;;;;
+2019;RIGHT SINGLE QUOTATION MARK;Pf;0;ON;;;;;N;SINGLE COMMA QUOTATION MARK;;;;
+201A;SINGLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW SINGLE COMMA QUOTATION MARK;;;;
+201B;SINGLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE REVERSED COMMA QUOTATION MARK;;;;
+201C;LEFT DOUBLE QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE TURNED COMMA QUOTATION MARK;;;;
+201D;RIGHT DOUBLE QUOTATION MARK;Pf;0;ON;;;;;N;DOUBLE COMMA QUOTATION MARK;;;;
+201E;DOUBLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW DOUBLE COMMA QUOTATION MARK;;;;
+201F;DOUBLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE REVERSED COMMA QUOTATION MARK;;;;
+2020;DAGGER;Po;0;ON;;;;;N;;;;;
+2021;DOUBLE DAGGER;Po;0;ON;;;;;N;;;;;
+2022;BULLET;Po;0;ON;;;;;N;;;;;
+2023;TRIANGULAR BULLET;Po;0;ON;;;;;N;;;;;
+2024;ONE DOT LEADER;Po;0;ON;<compat> 002E;;;;N;;;;;
+2025;TWO DOT LEADER;Po;0;ON;<compat> 002E 002E;;;;N;;;;;
+2026;HORIZONTAL ELLIPSIS;Po;0;ON;<compat> 002E 002E 002E;;;;N;;;;;
+2027;HYPHENATION POINT;Po;0;ON;;;;;N;;;;;
+2028;LINE SEPARATOR;Zl;0;WS;;;;;N;;;;;
+2029;PARAGRAPH SEPARATOR;Zp;0;B;;;;;N;;;;;
+202A;LEFT-TO-RIGHT EMBEDDING;Cf;0;LRE;;;;;N;;;;;
+202B;RIGHT-TO-LEFT EMBEDDING;Cf;0;RLE;;;;;N;;;;;
+202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;;
+202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;;
+202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;;
+202F;NARROW NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;;;;;
+2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;;
+2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;;
+2032;PRIME;Po;0;ET;;;;;N;;;;;
+2033;DOUBLE PRIME;Po;0;ET;<compat> 2032 2032;;;;N;;;;;
+2034;TRIPLE PRIME;Po;0;ET;<compat> 2032 2032 2032;;;;N;;;;;
+2035;REVERSED PRIME;Po;0;ON;;;;;N;;;;;
+2036;REVERSED DOUBLE PRIME;Po;0;ON;<compat> 2035 2035;;;;N;;;;;
+2037;REVERSED TRIPLE PRIME;Po;0;ON;<compat> 2035 2035 2035;;;;N;;;;;
+2038;CARET;Po;0;ON;;;;;N;;;;;
+2039;SINGLE LEFT-POINTING ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING SINGLE GUILLEMET;;;;
+203A;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING SINGLE GUILLEMET;;;;
+203B;REFERENCE MARK;Po;0;ON;;;;;N;;;;;
+203C;DOUBLE EXCLAMATION MARK;Po;0;ON;<compat> 0021 0021;;;;N;;;;;
+203D;INTERROBANG;Po;0;ON;;;;;N;;;;;
+203E;OVERLINE;Po;0;ON;<compat> 0020 0305;;;;N;SPACING OVERSCORE;;;;
+203F;UNDERTIE;Pc;0;ON;;;;;N;;;;;
+2040;CHARACTER TIE;Pc;0;ON;;;;;N;;;;;
+2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;;
+2042;ASTERISM;Po;0;ON;;;;;N;;;;;
+2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;;
+2044;FRACTION SLASH;Sm;0;CS;;;;;N;;;;;
+2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;;
+2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;;
+2047;DOUBLE QUESTION MARK;Po;0;ON;<compat> 003F 003F;;;;N;;;;;
+2048;QUESTION EXCLAMATION MARK;Po;0;ON;<compat> 003F 0021;;;;N;;;;;
+2049;EXCLAMATION QUESTION MARK;Po;0;ON;<compat> 0021 003F;;;;N;;;;;
+204A;TIRONIAN SIGN ET;Po;0;ON;;;;;N;;;;;
+204B;REVERSED PILCROW SIGN;Po;0;ON;;;;;N;;;;;
+204C;BLACK LEFTWARDS BULLET;Po;0;ON;;;;;N;;;;;
+204D;BLACK RIGHTWARDS BULLET;Po;0;ON;;;;;N;;;;;
+204E;LOW ASTERISK;Po;0;ON;;;;;N;;;;;
+204F;REVERSED SEMICOLON;Po;0;ON;;;;;N;;;;;
+2050;CLOSE UP;Po;0;ON;;;;;N;;;;;
+2051;TWO ASTERISKS ALIGNED VERTICALLY;Po;0;ON;;;;;N;;;;;
+2052;COMMERCIAL MINUS SIGN;Sm;0;ON;;;;;N;;;;;
+2053;SWUNG DASH;Po;0;ON;;;;;N;;;;;
+2054;INVERTED UNDERTIE;Pc;0;ON;;;;;N;;;;;
+2055;FLOWER PUNCTUATION MARK;Po;0;ON;;;;;N;;;;;
+2056;THREE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2057;QUADRUPLE PRIME;Po;0;ON;<compat> 2032 2032 2032 2032;;;;N;;;;;
+2058;FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2059;FIVE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+205A;TWO DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+205B;FOUR DOT MARK;Po;0;ON;;;;;N;;;;;
+205C;DOTTED CROSS;Po;0;ON;;;;;N;;;;;
+205D;TRICOLON;Po;0;ON;;;;;N;;;;;
+205E;VERTICAL FOUR DOTS;Po;0;ON;;;;;N;;;;;
+205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2060;WORD JOINER;Cf;0;BN;;;;;N;;;;;
+2061;FUNCTION APPLICATION;Cf;0;BN;;;;;N;;;;;
+2062;INVISIBLE TIMES;Cf;0;BN;;;;;N;;;;;
+2063;INVISIBLE SEPARATOR;Cf;0;BN;;;;;N;;;;;
+2064;INVISIBLE PLUS;Cf;0;BN;;;;;N;;;;;
+2066;LEFT-TO-RIGHT ISOLATE;Cf;0;LRI;;;;;N;;;;;
+2067;RIGHT-TO-LEFT ISOLATE;Cf;0;RLI;;;;;N;;;;;
+2068;FIRST STRONG ISOLATE;Cf;0;FSI;;;;;N;;;;;
+2069;POP DIRECTIONAL ISOLATE;Cf;0;PDI;;;;;N;;;;;
+206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;;
+206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;;
+206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;;
+206D;ACTIVATE ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;;
+206E;NATIONAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;;
+206F;NOMINAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;;
+2070;SUPERSCRIPT ZERO;No;0;EN;<super> 0030;;0;0;N;SUPERSCRIPT DIGIT ZERO;;;;
+2071;SUPERSCRIPT LATIN SMALL LETTER I;Lm;0;L;<super> 0069;;;;N;;;;;
+2074;SUPERSCRIPT FOUR;No;0;EN;<super> 0034;;4;4;N;SUPERSCRIPT DIGIT FOUR;;;;
+2075;SUPERSCRIPT FIVE;No;0;EN;<super> 0035;;5;5;N;SUPERSCRIPT DIGIT FIVE;;;;
+2076;SUPERSCRIPT SIX;No;0;EN;<super> 0036;;6;6;N;SUPERSCRIPT DIGIT SIX;;;;
+2077;SUPERSCRIPT SEVEN;No;0;EN;<super> 0037;;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;;
+2078;SUPERSCRIPT EIGHT;No;0;EN;<super> 0038;;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;;
+2079;SUPERSCRIPT NINE;No;0;EN;<super> 0039;;9;9;N;SUPERSCRIPT DIGIT NINE;;;;
+207A;SUPERSCRIPT PLUS SIGN;Sm;0;ES;<super> 002B;;;;N;;;;;
+207B;SUPERSCRIPT MINUS;Sm;0;ES;<super> 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;;
+207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON;<super> 003D;;;;N;;;;;
+207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON;<super> 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;;
+207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<super> 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;;
+207F;SUPERSCRIPT LATIN SMALL LETTER N;Lm;0;L;<super> 006E;;;;N;;;;;
+2080;SUBSCRIPT ZERO;No;0;EN;<sub> 0030;;0;0;N;SUBSCRIPT DIGIT ZERO;;;;
+2081;SUBSCRIPT ONE;No;0;EN;<sub> 0031;;1;1;N;SUBSCRIPT DIGIT ONE;;;;
+2082;SUBSCRIPT TWO;No;0;EN;<sub> 0032;;2;2;N;SUBSCRIPT DIGIT TWO;;;;
+2083;SUBSCRIPT THREE;No;0;EN;<sub> 0033;;3;3;N;SUBSCRIPT DIGIT THREE;;;;
+2084;SUBSCRIPT FOUR;No;0;EN;<sub> 0034;;4;4;N;SUBSCRIPT DIGIT FOUR;;;;
+2085;SUBSCRIPT FIVE;No;0;EN;<sub> 0035;;5;5;N;SUBSCRIPT DIGIT FIVE;;;;
+2086;SUBSCRIPT SIX;No;0;EN;<sub> 0036;;6;6;N;SUBSCRIPT DIGIT SIX;;;;
+2087;SUBSCRIPT SEVEN;No;0;EN;<sub> 0037;;7;7;N;SUBSCRIPT DIGIT SEVEN;;;;
+2088;SUBSCRIPT EIGHT;No;0;EN;<sub> 0038;;8;8;N;SUBSCRIPT DIGIT EIGHT;;;;
+2089;SUBSCRIPT NINE;No;0;EN;<sub> 0039;;9;9;N;SUBSCRIPT DIGIT NINE;;;;
+208A;SUBSCRIPT PLUS SIGN;Sm;0;ES;<sub> 002B;;;;N;;;;;
+208B;SUBSCRIPT MINUS;Sm;0;ES;<sub> 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;;
+208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON;<sub> 003D;;;;N;;;;;
+208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON;<sub> 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;;
+208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<sub> 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;;
+2090;LATIN SUBSCRIPT SMALL LETTER A;Lm;0;L;<sub> 0061;;;;N;;;;;
+2091;LATIN SUBSCRIPT SMALL LETTER E;Lm;0;L;<sub> 0065;;;;N;;;;;
+2092;LATIN SUBSCRIPT SMALL LETTER O;Lm;0;L;<sub> 006F;;;;N;;;;;
+2093;LATIN SUBSCRIPT SMALL LETTER X;Lm;0;L;<sub> 0078;;;;N;;;;;
+2094;LATIN SUBSCRIPT SMALL LETTER SCHWA;Lm;0;L;<sub> 0259;;;;N;;;;;
+2095;LATIN SUBSCRIPT SMALL LETTER H;Lm;0;L;<sub> 0068;;;;N;;;;;
+2096;LATIN SUBSCRIPT SMALL LETTER K;Lm;0;L;<sub> 006B;;;;N;;;;;
+2097;LATIN SUBSCRIPT SMALL LETTER L;Lm;0;L;<sub> 006C;;;;N;;;;;
+2098;LATIN SUBSCRIPT SMALL LETTER M;Lm;0;L;<sub> 006D;;;;N;;;;;
+2099;LATIN SUBSCRIPT SMALL LETTER N;Lm;0;L;<sub> 006E;;;;N;;;;;
+209A;LATIN SUBSCRIPT SMALL LETTER P;Lm;0;L;<sub> 0070;;;;N;;;;;
+209B;LATIN SUBSCRIPT SMALL LETTER S;Lm;0;L;<sub> 0073;;;;N;;;;;
+209C;LATIN SUBSCRIPT SMALL LETTER T;Lm;0;L;<sub> 0074;;;;N;;;;;
+20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;;
+20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;;
+20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;;
+20A3;FRENCH FRANC SIGN;Sc;0;ET;;;;;N;;;;;
+20A4;LIRA SIGN;Sc;0;ET;;;;;N;;;;;
+20A5;MILL SIGN;Sc;0;ET;;;;;N;;;;;
+20A6;NAIRA SIGN;Sc;0;ET;;;;;N;;;;;
+20A7;PESETA SIGN;Sc;0;ET;;;;;N;;;;;
+20A8;RUPEE SIGN;Sc;0;ET;<compat> 0052 0073;;;;N;;;;;
+20A9;WON SIGN;Sc;0;ET;;;;;N;;;;;
+20AA;NEW SHEQEL SIGN;Sc;0;ET;;;;;N;;;;;
+20AB;DONG SIGN;Sc;0;ET;;;;;N;;;;;
+20AC;EURO SIGN;Sc;0;ET;;;;;N;;;;;
+20AD;KIP SIGN;Sc;0;ET;;;;;N;;;;;
+20AE;TUGRIK SIGN;Sc;0;ET;;;;;N;;;;;
+20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;;
+20B0;GERMAN PENNY SIGN;Sc;0;ET;;;;;N;;;;;
+20B1;PESO SIGN;Sc;0;ET;;;;;N;;;;;
+20B2;GUARANI SIGN;Sc;0;ET;;;;;N;;;;;
+20B3;AUSTRAL SIGN;Sc;0;ET;;;;;N;;;;;
+20B4;HRYVNIA SIGN;Sc;0;ET;;;;;N;;;;;
+20B5;CEDI SIGN;Sc;0;ET;;;;;N;;;;;
+20B6;LIVRE TOURNOIS SIGN;Sc;0;ET;;;;;N;;;;;
+20B7;SPESMILO SIGN;Sc;0;ET;;;;;N;;;;;
+20B8;TENGE SIGN;Sc;0;ET;;;;;N;;;;;
+20B9;INDIAN RUPEE SIGN;Sc;0;ET;;;;;N;;;;;
+20BA;TURKISH LIRA SIGN;Sc;0;ET;;;;;N;;;;;
+20BB;NORDIC MARK SIGN;Sc;0;ET;;;;;N;;;;;
+20BC;MANAT SIGN;Sc;0;ET;;;;;N;;;;;
+20BD;RUBLE SIGN;Sc;0;ET;;;;;N;;;;;
+20BE;LARI SIGN;Sc;0;ET;;;;;N;;;;;
+20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;;
+20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;;
+20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;;
+20D3;COMBINING SHORT VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT VERTICAL BAR OVERLAY;;;;
+20D4;COMBINING ANTICLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING ANTICLOCKWISE ARROW ABOVE;;;;
+20D5;COMBINING CLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING CLOCKWISE ARROW ABOVE;;;;
+20D6;COMBINING LEFT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT ARROW ABOVE;;;;
+20D7;COMBINING RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT ARROW ABOVE;;;;
+20D8;COMBINING RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING RING OVERLAY;;;;
+20D9;COMBINING CLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING CLOCKWISE RING OVERLAY;;;;
+20DA;COMBINING ANTICLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING ANTICLOCKWISE RING OVERLAY;;;;
+20DB;COMBINING THREE DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING THREE DOTS ABOVE;;;;
+20DC;COMBINING FOUR DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING FOUR DOTS ABOVE;;;;
+20DD;COMBINING ENCLOSING CIRCLE;Me;0;NSM;;;;;N;ENCLOSING CIRCLE;;;;
+20DE;COMBINING ENCLOSING SQUARE;Me;0;NSM;;;;;N;ENCLOSING SQUARE;;;;
+20DF;COMBINING ENCLOSING DIAMOND;Me;0;NSM;;;;;N;ENCLOSING DIAMOND;;;;
+20E0;COMBINING ENCLOSING CIRCLE BACKSLASH;Me;0;NSM;;;;;N;ENCLOSING CIRCLE SLASH;;;;
+20E1;COMBINING LEFT RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT RIGHT ARROW ABOVE;;;;
+20E2;COMBINING ENCLOSING SCREEN;Me;0;NSM;;;;;N;;;;;
+20E3;COMBINING ENCLOSING KEYCAP;Me;0;NSM;;;;;N;;;;;
+20E4;COMBINING ENCLOSING UPWARD POINTING TRIANGLE;Me;0;NSM;;;;;N;;;;;
+20E5;COMBINING REVERSE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20E6;COMBINING DOUBLE VERTICAL STROKE OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20E7;COMBINING ANNUITY SYMBOL;Mn;230;NSM;;;;;N;;;;;
+20E8;COMBINING TRIPLE UNDERDOT;Mn;220;NSM;;;;;N;;;;;
+20E9;COMBINING WIDE BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;;
+20EA;COMBINING LEFTWARDS ARROW OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20EB;COMBINING LONG DOUBLE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20EC;COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;;
+20ED;COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;;
+20EE;COMBINING LEFT ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+20EF;COMBINING RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+20F0;COMBINING ASTERISK ABOVE;Mn;230;NSM;;;;;N;;;;;
+2100;ACCOUNT OF;So;0;ON;<compat> 0061 002F 0063;;;;N;;;;;
+2101;ADDRESSED TO THE SUBJECT;So;0;ON;<compat> 0061 002F 0073;;;;N;;;;;
+2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L;<font> 0043;;;;N;DOUBLE-STRUCK C;;;;
+2103;DEGREE CELSIUS;So;0;ON;<compat> 00B0 0043;;;;N;DEGREES CENTIGRADE;;;;
+2104;CENTRE LINE SYMBOL;So;0;ON;;;;;N;C L SYMBOL;;;;
+2105;CARE OF;So;0;ON;<compat> 0063 002F 006F;;;;N;;;;;
+2106;CADA UNA;So;0;ON;<compat> 0063 002F 0075;;;;N;;;;;
+2107;EULER CONSTANT;Lu;0;L;<compat> 0190;;;;N;EULERS;;;;
+2108;SCRUPLE;So;0;ON;;;;;N;;;;;
+2109;DEGREE FAHRENHEIT;So;0;ON;<compat> 00B0 0046;;;;N;DEGREES FAHRENHEIT;;;;
+210A;SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+210B;SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;SCRIPT H;;;;
+210C;BLACK-LETTER CAPITAL H;Lu;0;L;<font> 0048;;;;N;BLACK-LETTER H;;;;
+210D;DOUBLE-STRUCK CAPITAL H;Lu;0;L;<font> 0048;;;;N;DOUBLE-STRUCK H;;;;
+210E;PLANCK CONSTANT;Ll;0;L;<font> 0068;;;;N;;;;;
+210F;PLANCK CONSTANT OVER TWO PI;Ll;0;L;<font> 0127;;;;N;PLANCK CONSTANT OVER 2 PI;;;;
+2110;SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;SCRIPT I;;;;
+2111;BLACK-LETTER CAPITAL I;Lu;0;L;<font> 0049;;;;N;BLACK-LETTER I;;;;
+2112;SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;SCRIPT L;;;;
+2113;SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+2114;L B BAR SYMBOL;So;0;ON;;;;;N;;;;;
+2115;DOUBLE-STRUCK CAPITAL N;Lu;0;L;<font> 004E;;;;N;DOUBLE-STRUCK N;;;;
+2116;NUMERO SIGN;So;0;ON;<compat> 004E 006F;;;;N;NUMERO;;;;
+2117;SOUND RECORDING COPYRIGHT;So;0;ON;;;;;N;;;;;
+2118;SCRIPT CAPITAL P;Sm;0;ON;;;;;N;SCRIPT P;;;;
+2119;DOUBLE-STRUCK CAPITAL P;Lu;0;L;<font> 0050;;;;N;DOUBLE-STRUCK P;;;;
+211A;DOUBLE-STRUCK CAPITAL Q;Lu;0;L;<font> 0051;;;;N;DOUBLE-STRUCK Q;;;;
+211B;SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;SCRIPT R;;;;
+211C;BLACK-LETTER CAPITAL R;Lu;0;L;<font> 0052;;;;N;BLACK-LETTER R;;;;
+211D;DOUBLE-STRUCK CAPITAL R;Lu;0;L;<font> 0052;;;;N;DOUBLE-STRUCK R;;;;
+211E;PRESCRIPTION TAKE;So;0;ON;;;;;N;;;;;
+211F;RESPONSE;So;0;ON;;;;;N;;;;;
+2120;SERVICE MARK;So;0;ON;<super> 0053 004D;;;;N;;;;;
+2121;TELEPHONE SIGN;So;0;ON;<compat> 0054 0045 004C;;;;N;T E L SYMBOL;;;;
+2122;TRADE MARK SIGN;So;0;ON;<super> 0054 004D;;;;N;TRADEMARK;;;;
+2123;VERSICLE;So;0;ON;;;;;N;;;;;
+2124;DOUBLE-STRUCK CAPITAL Z;Lu;0;L;<font> 005A;;;;N;DOUBLE-STRUCK Z;;;;
+2125;OUNCE SIGN;So;0;ON;;;;;N;OUNCE;;;;
+2126;OHM SIGN;Lu;0;L;03A9;;;;N;OHM;;;03C9;
+2127;INVERTED OHM SIGN;So;0;ON;;;;;N;MHO;;;;
+2128;BLACK-LETTER CAPITAL Z;Lu;0;L;<font> 005A;;;;N;BLACK-LETTER Z;;;;
+2129;TURNED GREEK SMALL LETTER IOTA;So;0;ON;;;;;N;;;;;
+212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B;
+212B;ANGSTROM SIGN;Lu;0;L;00C5;;;;N;ANGSTROM UNIT;;;00E5;
+212C;SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;SCRIPT B;;;;
+212D;BLACK-LETTER CAPITAL C;Lu;0;L;<font> 0043;;;;N;BLACK-LETTER C;;;;
+212E;ESTIMATED SYMBOL;So;0;ET;;;;;N;;;;;
+212F;SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+2130;SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;SCRIPT E;;;;
+2131;SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;SCRIPT F;;;;
+2132;TURNED CAPITAL F;Lu;0;L;;;;;N;TURNED F;;;214E;
+2133;SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;SCRIPT M;;;;
+2134;SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+2135;ALEF SYMBOL;Lo;0;L;<compat> 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;;
+2136;BET SYMBOL;Lo;0;L;<compat> 05D1;;;;N;SECOND TRANSFINITE CARDINAL;;;;
+2137;GIMEL SYMBOL;Lo;0;L;<compat> 05D2;;;;N;THIRD TRANSFINITE CARDINAL;;;;
+2138;DALET SYMBOL;Lo;0;L;<compat> 05D3;;;;N;FOURTH TRANSFINITE CARDINAL;;;;
+2139;INFORMATION SOURCE;Ll;0;L;<font> 0069;;;;N;;;;;
+213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;;
+213B;FACSIMILE SIGN;So;0;ON;<compat> 0046 0041 0058;;;;N;;;;;
+213C;DOUBLE-STRUCK SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+213D;DOUBLE-STRUCK SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+213E;DOUBLE-STRUCK CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+213F;DOUBLE-STRUCK CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+2140;DOUBLE-STRUCK N-ARY SUMMATION;Sm;0;ON;<font> 2211;;;;Y;;;;;
+2141;TURNED SANS-SERIF CAPITAL G;Sm;0;ON;;;;;N;;;;;
+2142;TURNED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;;
+2143;REVERSED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;;
+2144;TURNED SANS-SERIF CAPITAL Y;Sm;0;ON;;;;;N;;;;;
+2145;DOUBLE-STRUCK ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+2146;DOUBLE-STRUCK ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+2147;DOUBLE-STRUCK ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+2148;DOUBLE-STRUCK ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+2149;DOUBLE-STRUCK ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+214A;PROPERTY LINE;So;0;ON;;;;;N;;;;;
+214B;TURNED AMPERSAND;Sm;0;ON;;;;;N;;;;;
+214C;PER SIGN;So;0;ON;;;;;N;;;;;
+214D;AKTIESELSKAB;So;0;ON;;;;;N;;;;;
+214E;TURNED SMALL F;Ll;0;L;;;;;N;;;2132;;2132
+214F;SYMBOL FOR SAMARITAN SOURCE;So;0;L;;;;;N;;;;;
+2150;VULGAR FRACTION ONE SEVENTH;No;0;ON;<fraction> 0031 2044 0037;;;1/7;N;;;;;
+2151;VULGAR FRACTION ONE NINTH;No;0;ON;<fraction> 0031 2044 0039;;;1/9;N;;;;;
+2152;VULGAR FRACTION ONE TENTH;No;0;ON;<fraction> 0031 2044 0031 0030;;;1/10;N;;;;;
+2153;VULGAR FRACTION ONE THIRD;No;0;ON;<fraction> 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;;
+2154;VULGAR FRACTION TWO THIRDS;No;0;ON;<fraction> 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;;
+2155;VULGAR FRACTION ONE FIFTH;No;0;ON;<fraction> 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;;
+2156;VULGAR FRACTION TWO FIFTHS;No;0;ON;<fraction> 0032 2044 0035;;;2/5;N;FRACTION TWO FIFTHS;;;;
+2157;VULGAR FRACTION THREE FIFTHS;No;0;ON;<fraction> 0033 2044 0035;;;3/5;N;FRACTION THREE FIFTHS;;;;
+2158;VULGAR FRACTION FOUR FIFTHS;No;0;ON;<fraction> 0034 2044 0035;;;4/5;N;FRACTION FOUR FIFTHS;;;;
+2159;VULGAR FRACTION ONE SIXTH;No;0;ON;<fraction> 0031 2044 0036;;;1/6;N;FRACTION ONE SIXTH;;;;
+215A;VULGAR FRACTION FIVE SIXTHS;No;0;ON;<fraction> 0035 2044 0036;;;5/6;N;FRACTION FIVE SIXTHS;;;;
+215B;VULGAR FRACTION ONE EIGHTH;No;0;ON;<fraction> 0031 2044 0038;;;1/8;N;FRACTION ONE EIGHTH;;;;
+215C;VULGAR FRACTION THREE EIGHTHS;No;0;ON;<fraction> 0033 2044 0038;;;3/8;N;FRACTION THREE EIGHTHS;;;;
+215D;VULGAR FRACTION FIVE EIGHTHS;No;0;ON;<fraction> 0035 2044 0038;;;5/8;N;FRACTION FIVE EIGHTHS;;;;
+215E;VULGAR FRACTION SEVEN EIGHTHS;No;0;ON;<fraction> 0037 2044 0038;;;7/8;N;FRACTION SEVEN EIGHTHS;;;;
+215F;FRACTION NUMERATOR ONE;No;0;ON;<fraction> 0031 2044;;;1;N;;;;;
+2160;ROMAN NUMERAL ONE;Nl;0;L;<compat> 0049;;;1;N;;;;2170;
+2161;ROMAN NUMERAL TWO;Nl;0;L;<compat> 0049 0049;;;2;N;;;;2171;
+2162;ROMAN NUMERAL THREE;Nl;0;L;<compat> 0049 0049 0049;;;3;N;;;;2172;
+2163;ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0049 0056;;;4;N;;;;2173;
+2164;ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0056;;;5;N;;;;2174;
+2165;ROMAN NUMERAL SIX;Nl;0;L;<compat> 0056 0049;;;6;N;;;;2175;
+2166;ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0056 0049 0049;;;7;N;;;;2176;
+2167;ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0056 0049 0049 0049;;;8;N;;;;2177;
+2168;ROMAN NUMERAL NINE;Nl;0;L;<compat> 0049 0058;;;9;N;;;;2178;
+2169;ROMAN NUMERAL TEN;Nl;0;L;<compat> 0058;;;10;N;;;;2179;
+216A;ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0058 0049;;;11;N;;;;217A;
+216B;ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0058 0049 0049;;;12;N;;;;217B;
+216C;ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 004C;;;50;N;;;;217C;
+216D;ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0043;;;100;N;;;;217D;
+216E;ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0044;;;500;N;;;;217E;
+216F;ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 004D;;;1000;N;;;;217F;
+2170;SMALL ROMAN NUMERAL ONE;Nl;0;L;<compat> 0069;;;1;N;;;2160;;2160
+2171;SMALL ROMAN NUMERAL TWO;Nl;0;L;<compat> 0069 0069;;;2;N;;;2161;;2161
+2172;SMALL ROMAN NUMERAL THREE;Nl;0;L;<compat> 0069 0069 0069;;;3;N;;;2162;;2162
+2173;SMALL ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0069 0076;;;4;N;;;2163;;2163
+2174;SMALL ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0076;;;5;N;;;2164;;2164
+2175;SMALL ROMAN NUMERAL SIX;Nl;0;L;<compat> 0076 0069;;;6;N;;;2165;;2165
+2176;SMALL ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0076 0069 0069;;;7;N;;;2166;;2166
+2177;SMALL ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0076 0069 0069 0069;;;8;N;;;2167;;2167
+2178;SMALL ROMAN NUMERAL NINE;Nl;0;L;<compat> 0069 0078;;;9;N;;;2168;;2168
+2179;SMALL ROMAN NUMERAL TEN;Nl;0;L;<compat> 0078;;;10;N;;;2169;;2169
+217A;SMALL ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0078 0069;;;11;N;;;216A;;216A
+217B;SMALL ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0078 0069 0069;;;12;N;;;216B;;216B
+217C;SMALL ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 006C;;;50;N;;;216C;;216C
+217D;SMALL ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0063;;;100;N;;;216D;;216D
+217E;SMALL ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0064;;;500;N;;;216E;;216E
+217F;SMALL ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 006D;;;1000;N;;;216F;;216F
+2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;;
+2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;;
+2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;;
+2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Lu;0;L;;;;;N;;;;2184;
+2184;LATIN SMALL LETTER REVERSED C;Ll;0;L;;;;;N;;;2183;;2183
+2185;ROMAN NUMERAL SIX LATE FORM;Nl;0;L;;;;6;N;;;;;
+2186;ROMAN NUMERAL FIFTY EARLY FORM;Nl;0;L;;;;50;N;;;;;
+2187;ROMAN NUMERAL FIFTY THOUSAND;Nl;0;L;;;;50000;N;;;;;
+2188;ROMAN NUMERAL ONE HUNDRED THOUSAND;Nl;0;L;;;;100000;N;;;;;
+2189;VULGAR FRACTION ZERO THIRDS;No;0;ON;<fraction> 0030 2044 0033;;;0;N;;;;;
+218A;TURNED DIGIT TWO;So;0;ON;;;;;N;;;;;
+218B;TURNED DIGIT THREE;So;0;ON;;;;;N;;;;;
+2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;;
+2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;;
+2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;;
+2193;DOWNWARDS ARROW;Sm;0;ON;;;;;N;DOWN ARROW;;;;
+2194;LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;;
+2195;UP DOWN ARROW;So;0;ON;;;;;N;;;;;
+2196;NORTH WEST ARROW;So;0;ON;;;;;N;UPPER LEFT ARROW;;;;
+2197;NORTH EAST ARROW;So;0;ON;;;;;N;UPPER RIGHT ARROW;;;;
+2198;SOUTH EAST ARROW;So;0;ON;;;;;N;LOWER RIGHT ARROW;;;;
+2199;SOUTH WEST ARROW;So;0;ON;;;;;N;LOWER LEFT ARROW;;;;
+219A;LEFTWARDS ARROW WITH STROKE;Sm;0;ON;2190 0338;;;;N;LEFT ARROW WITH STROKE;;;;
+219B;RIGHTWARDS ARROW WITH STROKE;Sm;0;ON;2192 0338;;;;N;RIGHT ARROW WITH STROKE;;;;
+219C;LEFTWARDS WAVE ARROW;So;0;ON;;;;;N;LEFT WAVE ARROW;;;;
+219D;RIGHTWARDS WAVE ARROW;So;0;ON;;;;;N;RIGHT WAVE ARROW;;;;
+219E;LEFTWARDS TWO HEADED ARROW;So;0;ON;;;;;N;LEFT TWO HEADED ARROW;;;;
+219F;UPWARDS TWO HEADED ARROW;So;0;ON;;;;;N;UP TWO HEADED ARROW;;;;
+21A0;RIGHTWARDS TWO HEADED ARROW;Sm;0;ON;;;;;N;RIGHT TWO HEADED ARROW;;;;
+21A1;DOWNWARDS TWO HEADED ARROW;So;0;ON;;;;;N;DOWN TWO HEADED ARROW;;;;
+21A2;LEFTWARDS ARROW WITH TAIL;So;0;ON;;;;;N;LEFT ARROW WITH TAIL;;;;
+21A3;RIGHTWARDS ARROW WITH TAIL;Sm;0;ON;;;;;N;RIGHT ARROW WITH TAIL;;;;
+21A4;LEFTWARDS ARROW FROM BAR;So;0;ON;;;;;N;LEFT ARROW FROM BAR;;;;
+21A5;UPWARDS ARROW FROM BAR;So;0;ON;;;;;N;UP ARROW FROM BAR;;;;
+21A6;RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;RIGHT ARROW FROM BAR;;;;
+21A7;DOWNWARDS ARROW FROM BAR;So;0;ON;;;;;N;DOWN ARROW FROM BAR;;;;
+21A8;UP DOWN ARROW WITH BASE;So;0;ON;;;;;N;;;;;
+21A9;LEFTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;LEFT ARROW WITH HOOK;;;;
+21AA;RIGHTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;RIGHT ARROW WITH HOOK;;;;
+21AB;LEFTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;LEFT ARROW WITH LOOP;;;;
+21AC;RIGHTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;RIGHT ARROW WITH LOOP;;;;
+21AD;LEFT RIGHT WAVE ARROW;So;0;ON;;;;;N;;;;;
+21AE;LEFT RIGHT ARROW WITH STROKE;Sm;0;ON;2194 0338;;;;N;;;;;
+21AF;DOWNWARDS ZIGZAG ARROW;So;0;ON;;;;;N;DOWN ZIGZAG ARROW;;;;
+21B0;UPWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP LEFT;;;;
+21B1;UPWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP RIGHT;;;;
+21B2;DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP LEFT;;;;
+21B3;DOWNWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP RIGHT;;;;
+21B4;RIGHTWARDS ARROW WITH CORNER DOWNWARDS;So;0;ON;;;;;N;RIGHT ARROW WITH CORNER DOWN;;;;
+21B5;DOWNWARDS ARROW WITH CORNER LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH CORNER LEFT;;;;
+21B6;ANTICLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21B7;CLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21B8;NORTH WEST ARROW TO LONG BAR;So;0;ON;;;;;N;UPPER LEFT ARROW TO LONG BAR;;;;
+21B9;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR;;;;
+21BA;ANTICLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21BB;CLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21BC;LEFTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB UP;;;;
+21BD;LEFTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB DOWN;;;;
+21BE;UPWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB RIGHT;;;;
+21BF;UPWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB LEFT;;;;
+21C0;RIGHTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB UP;;;;
+21C1;RIGHTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB DOWN;;;;
+21C2;DOWNWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB RIGHT;;;;
+21C3;DOWNWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB LEFT;;;;
+21C4;RIGHTWARDS ARROW OVER LEFTWARDS ARROW;So;0;ON;;;;;N;RIGHT ARROW OVER LEFT ARROW;;;;
+21C5;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW;So;0;ON;;;;;N;UP ARROW LEFT OF DOWN ARROW;;;;
+21C6;LEFTWARDS ARROW OVER RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT ARROW OVER RIGHT ARROW;;;;
+21C7;LEFTWARDS PAIRED ARROWS;So;0;ON;;;;;N;LEFT PAIRED ARROWS;;;;
+21C8;UPWARDS PAIRED ARROWS;So;0;ON;;;;;N;UP PAIRED ARROWS;;;;
+21C9;RIGHTWARDS PAIRED ARROWS;So;0;ON;;;;;N;RIGHT PAIRED ARROWS;;;;
+21CA;DOWNWARDS PAIRED ARROWS;So;0;ON;;;;;N;DOWN PAIRED ARROWS;;;;
+21CB;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON;So;0;ON;;;;;N;LEFT HARPOON OVER RIGHT HARPOON;;;;
+21CC;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON;So;0;ON;;;;;N;RIGHT HARPOON OVER LEFT HARPOON;;;;
+21CD;LEFTWARDS DOUBLE ARROW WITH STROKE;So;0;ON;21D0 0338;;;;N;LEFT DOUBLE ARROW WITH STROKE;;;;
+21CE;LEFT RIGHT DOUBLE ARROW WITH STROKE;Sm;0;ON;21D4 0338;;;;N;;;;;
+21CF;RIGHTWARDS DOUBLE ARROW WITH STROKE;Sm;0;ON;21D2 0338;;;;N;RIGHT DOUBLE ARROW WITH STROKE;;;;
+21D0;LEFTWARDS DOUBLE ARROW;So;0;ON;;;;;N;LEFT DOUBLE ARROW;;;;
+21D1;UPWARDS DOUBLE ARROW;So;0;ON;;;;;N;UP DOUBLE ARROW;;;;
+21D2;RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;RIGHT DOUBLE ARROW;;;;
+21D3;DOWNWARDS DOUBLE ARROW;So;0;ON;;;;;N;DOWN DOUBLE ARROW;;;;
+21D4;LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+21D5;UP DOWN DOUBLE ARROW;So;0;ON;;;;;N;;;;;
+21D6;NORTH WEST DOUBLE ARROW;So;0;ON;;;;;N;UPPER LEFT DOUBLE ARROW;;;;
+21D7;NORTH EAST DOUBLE ARROW;So;0;ON;;;;;N;UPPER RIGHT DOUBLE ARROW;;;;
+21D8;SOUTH EAST DOUBLE ARROW;So;0;ON;;;;;N;LOWER RIGHT DOUBLE ARROW;;;;
+21D9;SOUTH WEST DOUBLE ARROW;So;0;ON;;;;;N;LOWER LEFT DOUBLE ARROW;;;;
+21DA;LEFTWARDS TRIPLE ARROW;So;0;ON;;;;;N;LEFT TRIPLE ARROW;;;;
+21DB;RIGHTWARDS TRIPLE ARROW;So;0;ON;;;;;N;RIGHT TRIPLE ARROW;;;;
+21DC;LEFTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;LEFT SQUIGGLE ARROW;;;;
+21DD;RIGHTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;RIGHT SQUIGGLE ARROW;;;;
+21DE;UPWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;UP ARROW WITH DOUBLE STROKE;;;;
+21DF;DOWNWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;DOWN ARROW WITH DOUBLE STROKE;;;;
+21E0;LEFTWARDS DASHED ARROW;So;0;ON;;;;;N;LEFT DASHED ARROW;;;;
+21E1;UPWARDS DASHED ARROW;So;0;ON;;;;;N;UP DASHED ARROW;;;;
+21E2;RIGHTWARDS DASHED ARROW;So;0;ON;;;;;N;RIGHT DASHED ARROW;;;;
+21E3;DOWNWARDS DASHED ARROW;So;0;ON;;;;;N;DOWN DASHED ARROW;;;;
+21E4;LEFTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR;;;;
+21E5;RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;RIGHT ARROW TO BAR;;;;
+21E6;LEFTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE LEFT ARROW;;;;
+21E7;UPWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE UP ARROW;;;;
+21E8;RIGHTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE RIGHT ARROW;;;;
+21E9;DOWNWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE DOWN ARROW;;;;
+21EA;UPWARDS WHITE ARROW FROM BAR;So;0;ON;;;;;N;WHITE UP ARROW FROM BAR;;;;
+21EB;UPWARDS WHITE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;;
+21EC;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;;
+21ED;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR;So;0;ON;;;;;N;;;;;
+21EE;UPWARDS WHITE DOUBLE ARROW;So;0;ON;;;;;N;;;;;
+21EF;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;;
+21F0;RIGHTWARDS WHITE ARROW FROM WALL;So;0;ON;;;;;N;;;;;
+21F1;NORTH WEST ARROW TO CORNER;So;0;ON;;;;;N;;;;;
+21F2;SOUTH EAST ARROW TO CORNER;So;0;ON;;;;;N;;;;;
+21F3;UP DOWN WHITE ARROW;So;0;ON;;;;;N;;;;;
+21F4;RIGHT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+21F5;DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+21F6;THREE RIGHTWARDS ARROWS;Sm;0;ON;;;;;N;;;;;
+21F7;LEFTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21F8;RIGHTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21F9;LEFT RIGHT ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FA;LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FB;RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FC;LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FD;LEFTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;;
+21FE;RIGHTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;;
+21FF;LEFT RIGHT OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;;
+2200;FOR ALL;Sm;0;ON;;;;;N;;;;;
+2201;COMPLEMENT;Sm;0;ON;;;;;Y;;;;;
+2202;PARTIAL DIFFERENTIAL;Sm;0;ON;;;;;Y;;;;;
+2203;THERE EXISTS;Sm;0;ON;;;;;Y;;;;;
+2204;THERE DOES NOT EXIST;Sm;0;ON;2203 0338;;;;Y;;;;;
+2205;EMPTY SET;Sm;0;ON;;;;;N;;;;;
+2206;INCREMENT;Sm;0;ON;;;;;N;;;;;
+2207;NABLA;Sm;0;ON;;;;;N;;;;;
+2208;ELEMENT OF;Sm;0;ON;;;;;Y;;;;;
+2209;NOT AN ELEMENT OF;Sm;0;ON;2208 0338;;;;Y;;;;;
+220A;SMALL ELEMENT OF;Sm;0;ON;;;;;Y;;;;;
+220B;CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;;
+220C;DOES NOT CONTAIN AS MEMBER;Sm;0;ON;220B 0338;;;;Y;;;;;
+220D;SMALL CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;;
+220E;END OF PROOF;Sm;0;ON;;;;;N;;;;;
+220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;;
+2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;;
+2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;;
+2212;MINUS SIGN;Sm;0;ES;;;;;N;;;;;
+2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;;
+2214;DOT PLUS;Sm;0;ON;;;;;N;;;;;
+2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;;
+2216;SET MINUS;Sm;0;ON;;;;;Y;;;;;
+2217;ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;;
+2218;RING OPERATOR;Sm;0;ON;;;;;N;;;;;
+2219;BULLET OPERATOR;Sm;0;ON;;;;;N;;;;;
+221A;SQUARE ROOT;Sm;0;ON;;;;;Y;;;;;
+221B;CUBE ROOT;Sm;0;ON;;;;;Y;;;;;
+221C;FOURTH ROOT;Sm;0;ON;;;;;Y;;;;;
+221D;PROPORTIONAL TO;Sm;0;ON;;;;;Y;;;;;
+221E;INFINITY;Sm;0;ON;;;;;N;;;;;
+221F;RIGHT ANGLE;Sm;0;ON;;;;;Y;;;;;
+2220;ANGLE;Sm;0;ON;;;;;Y;;;;;
+2221;MEASURED ANGLE;Sm;0;ON;;;;;Y;;;;;
+2222;SPHERICAL ANGLE;Sm;0;ON;;;;;Y;;;;;
+2223;DIVIDES;Sm;0;ON;;;;;N;;;;;
+2224;DOES NOT DIVIDE;Sm;0;ON;2223 0338;;;;Y;;;;;
+2225;PARALLEL TO;Sm;0;ON;;;;;N;;;;;
+2226;NOT PARALLEL TO;Sm;0;ON;2225 0338;;;;Y;;;;;
+2227;LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2228;LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2229;INTERSECTION;Sm;0;ON;;;;;N;;;;;
+222A;UNION;Sm;0;ON;;;;;N;;;;;
+222B;INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+222C;DOUBLE INTEGRAL;Sm;0;ON;<compat> 222B 222B;;;;Y;;;;;
+222D;TRIPLE INTEGRAL;Sm;0;ON;<compat> 222B 222B 222B;;;;Y;;;;;
+222E;CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+222F;SURFACE INTEGRAL;Sm;0;ON;<compat> 222E 222E;;;;Y;;;;;
+2230;VOLUME INTEGRAL;Sm;0;ON;<compat> 222E 222E 222E;;;;Y;;;;;
+2231;CLOCKWISE INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2232;CLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2233;ANTICLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2234;THEREFORE;Sm;0;ON;;;;;N;;;;;
+2235;BECAUSE;Sm;0;ON;;;;;N;;;;;
+2236;RATIO;Sm;0;ON;;;;;N;;;;;
+2237;PROPORTION;Sm;0;ON;;;;;N;;;;;
+2238;DOT MINUS;Sm;0;ON;;;;;N;;;;;
+2239;EXCESS;Sm;0;ON;;;;;Y;;;;;
+223A;GEOMETRIC PROPORTION;Sm;0;ON;;;;;N;;;;;
+223B;HOMOTHETIC;Sm;0;ON;;;;;Y;;;;;
+223C;TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+223D;REVERSED TILDE;Sm;0;ON;;;;;Y;;;;;
+223E;INVERTED LAZY S;Sm;0;ON;;;;;Y;;;;;
+223F;SINE WAVE;Sm;0;ON;;;;;Y;;;;;
+2240;WREATH PRODUCT;Sm;0;ON;;;;;Y;;;;;
+2241;NOT TILDE;Sm;0;ON;223C 0338;;;;Y;;;;;
+2242;MINUS TILDE;Sm;0;ON;;;;;Y;;;;;
+2243;ASYMPTOTICALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2244;NOT ASYMPTOTICALLY EQUAL TO;Sm;0;ON;2243 0338;;;;Y;;;;;
+2245;APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2246;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2247;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO;Sm;0;ON;2245 0338;;;;Y;;;;;
+2248;ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2249;NOT ALMOST EQUAL TO;Sm;0;ON;2248 0338;;;;Y;;;;;
+224A;ALMOST EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+224B;TRIPLE TILDE;Sm;0;ON;;;;;Y;;;;;
+224C;ALL EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+224D;EQUIVALENT TO;Sm;0;ON;;;;;N;;;;;
+224E;GEOMETRICALLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;;
+224F;DIFFERENCE BETWEEN;Sm;0;ON;;;;;N;;;;;
+2250;APPROACHES THE LIMIT;Sm;0;ON;;;;;N;;;;;
+2251;GEOMETRICALLY EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2252;APPROXIMATELY EQUAL TO OR THE IMAGE OF;Sm;0;ON;;;;;Y;;;;;
+2253;IMAGE OF OR APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2254;COLON EQUALS;Sm;0;ON;;;;;Y;COLON EQUAL;;;;
+2255;EQUALS COLON;Sm;0;ON;;;;;Y;EQUAL COLON;;;;
+2256;RING IN EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2257;RING EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2258;CORRESPONDS TO;Sm;0;ON;;;;;N;;;;;
+2259;ESTIMATES;Sm;0;ON;;;;;N;;;;;
+225A;EQUIANGULAR TO;Sm;0;ON;;;;;N;;;;;
+225B;STAR EQUALS;Sm;0;ON;;;;;N;;;;;
+225C;DELTA EQUAL TO;Sm;0;ON;;;;;N;;;;;
+225D;EQUAL TO BY DEFINITION;Sm;0;ON;;;;;N;;;;;
+225E;MEASURED BY;Sm;0;ON;;;;;N;;;;;
+225F;QUESTIONED EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2260;NOT EQUAL TO;Sm;0;ON;003D 0338;;;;Y;;;;;
+2261;IDENTICAL TO;Sm;0;ON;;;;;N;;;;;
+2262;NOT IDENTICAL TO;Sm;0;ON;2261 0338;;;;Y;;;;;
+2263;STRICTLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;;
+2264;LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUAL TO;;;;
+2265;GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUAL TO;;;;
+2266;LESS-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OVER EQUAL TO;;;;
+2267;GREATER-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OVER EQUAL TO;;;;
+2268;LESS-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUAL TO;;;;
+2269;GREATER-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUAL TO;;;;
+226A;MUCH LESS-THAN;Sm;0;ON;;;;;Y;MUCH LESS THAN;;;;
+226B;MUCH GREATER-THAN;Sm;0;ON;;;;;Y;MUCH GREATER THAN;;;;
+226C;BETWEEN;Sm;0;ON;;;;;N;;;;;
+226D;NOT EQUIVALENT TO;Sm;0;ON;224D 0338;;;;N;;;;;
+226E;NOT LESS-THAN;Sm;0;ON;003C 0338;;;;Y;NOT LESS THAN;;;;
+226F;NOT GREATER-THAN;Sm;0;ON;003E 0338;;;;Y;NOT GREATER THAN;;;;
+2270;NEITHER LESS-THAN NOR EQUAL TO;Sm;0;ON;2264 0338;;;;Y;NEITHER LESS THAN NOR EQUAL TO;;;;
+2271;NEITHER GREATER-THAN NOR EQUAL TO;Sm;0;ON;2265 0338;;;;Y;NEITHER GREATER THAN NOR EQUAL TO;;;;
+2272;LESS-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUIVALENT TO;;;;
+2273;GREATER-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUIVALENT TO;;;;
+2274;NEITHER LESS-THAN NOR EQUIVALENT TO;Sm;0;ON;2272 0338;;;;Y;NEITHER LESS THAN NOR EQUIVALENT TO;;;;
+2275;NEITHER GREATER-THAN NOR EQUIVALENT TO;Sm;0;ON;2273 0338;;;;Y;NEITHER GREATER THAN NOR EQUIVALENT TO;;;;
+2276;LESS-THAN OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN OR GREATER THAN;;;;
+2277;GREATER-THAN OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN OR LESS THAN;;;;
+2278;NEITHER LESS-THAN NOR GREATER-THAN;Sm;0;ON;2276 0338;;;;Y;NEITHER LESS THAN NOR GREATER THAN;;;;
+2279;NEITHER GREATER-THAN NOR LESS-THAN;Sm;0;ON;2277 0338;;;;Y;NEITHER GREATER THAN NOR LESS THAN;;;;
+227A;PRECEDES;Sm;0;ON;;;;;Y;;;;;
+227B;SUCCEEDS;Sm;0;ON;;;;;Y;;;;;
+227C;PRECEDES OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+227D;SUCCEEDS OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+227E;PRECEDES OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+227F;SUCCEEDS OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+2280;DOES NOT PRECEDE;Sm;0;ON;227A 0338;;;;Y;;;;;
+2281;DOES NOT SUCCEED;Sm;0;ON;227B 0338;;;;Y;;;;;
+2282;SUBSET OF;Sm;0;ON;;;;;Y;;;;;
+2283;SUPERSET OF;Sm;0;ON;;;;;Y;;;;;
+2284;NOT A SUBSET OF;Sm;0;ON;2282 0338;;;;Y;;;;;
+2285;NOT A SUPERSET OF;Sm;0;ON;2283 0338;;;;Y;;;;;
+2286;SUBSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2287;SUPERSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2288;NEITHER A SUBSET OF NOR EQUAL TO;Sm;0;ON;2286 0338;;;;Y;;;;;
+2289;NEITHER A SUPERSET OF NOR EQUAL TO;Sm;0;ON;2287 0338;;;;Y;;;;;
+228A;SUBSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUBSET OF OR NOT EQUAL TO;;;;
+228B;SUPERSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUPERSET OF OR NOT EQUAL TO;;;;
+228C;MULTISET;Sm;0;ON;;;;;Y;;;;;
+228D;MULTISET MULTIPLICATION;Sm;0;ON;;;;;N;;;;;
+228E;MULTISET UNION;Sm;0;ON;;;;;N;;;;;
+228F;SQUARE IMAGE OF;Sm;0;ON;;;;;Y;;;;;
+2290;SQUARE ORIGINAL OF;Sm;0;ON;;;;;Y;;;;;
+2291;SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2292;SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2293;SQUARE CAP;Sm;0;ON;;;;;N;;;;;
+2294;SQUARE CUP;Sm;0;ON;;;;;N;;;;;
+2295;CIRCLED PLUS;Sm;0;ON;;;;;N;;;;;
+2296;CIRCLED MINUS;Sm;0;ON;;;;;N;;;;;
+2297;CIRCLED TIMES;Sm;0;ON;;;;;N;;;;;
+2298;CIRCLED DIVISION SLASH;Sm;0;ON;;;;;Y;;;;;
+2299;CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+229A;CIRCLED RING OPERATOR;Sm;0;ON;;;;;N;;;;;
+229B;CIRCLED ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;;
+229C;CIRCLED EQUALS;Sm;0;ON;;;;;N;;;;;
+229D;CIRCLED DASH;Sm;0;ON;;;;;N;;;;;
+229E;SQUARED PLUS;Sm;0;ON;;;;;N;;;;;
+229F;SQUARED MINUS;Sm;0;ON;;;;;N;;;;;
+22A0;SQUARED TIMES;Sm;0;ON;;;;;N;;;;;
+22A1;SQUARED DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+22A2;RIGHT TACK;Sm;0;ON;;;;;Y;;;;;
+22A3;LEFT TACK;Sm;0;ON;;;;;Y;;;;;
+22A4;DOWN TACK;Sm;0;ON;;;;;N;;;;;
+22A5;UP TACK;Sm;0;ON;;;;;N;;;;;
+22A6;ASSERTION;Sm;0;ON;;;;;Y;;;;;
+22A7;MODELS;Sm;0;ON;;;;;Y;;;;;
+22A8;TRUE;Sm;0;ON;;;;;Y;;;;;
+22A9;FORCES;Sm;0;ON;;;;;Y;;;;;
+22AA;TRIPLE VERTICAL BAR RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+22AB;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+22AC;DOES NOT PROVE;Sm;0;ON;22A2 0338;;;;Y;;;;;
+22AD;NOT TRUE;Sm;0;ON;22A8 0338;;;;Y;;;;;
+22AE;DOES NOT FORCE;Sm;0;ON;22A9 0338;;;;Y;;;;;
+22AF;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;22AB 0338;;;;Y;;;;;
+22B0;PRECEDES UNDER RELATION;Sm;0;ON;;;;;Y;;;;;
+22B1;SUCCEEDS UNDER RELATION;Sm;0;ON;;;;;Y;;;;;
+22B2;NORMAL SUBGROUP OF;Sm;0;ON;;;;;Y;;;;;
+22B3;CONTAINS AS NORMAL SUBGROUP;Sm;0;ON;;;;;Y;;;;;
+22B4;NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22B5;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22B6;ORIGINAL OF;Sm;0;ON;;;;;Y;;;;;
+22B7;IMAGE OF;Sm;0;ON;;;;;Y;;;;;
+22B8;MULTIMAP;Sm;0;ON;;;;;Y;;;;;
+22B9;HERMITIAN CONJUGATE MATRIX;Sm;0;ON;;;;;N;;;;;
+22BA;INTERCALATE;Sm;0;ON;;;;;N;;;;;
+22BB;XOR;Sm;0;ON;;;;;N;;;;;
+22BC;NAND;Sm;0;ON;;;;;N;;;;;
+22BD;NOR;Sm;0;ON;;;;;N;;;;;
+22BE;RIGHT ANGLE WITH ARC;Sm;0;ON;;;;;Y;;;;;
+22BF;RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;;
+22C0;N-ARY LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+22C1;N-ARY LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+22C2;N-ARY INTERSECTION;Sm;0;ON;;;;;N;;;;;
+22C3;N-ARY UNION;Sm;0;ON;;;;;N;;;;;
+22C4;DIAMOND OPERATOR;Sm;0;ON;;;;;N;;;;;
+22C5;DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+22C6;STAR OPERATOR;Sm;0;ON;;;;;N;;;;;
+22C7;DIVISION TIMES;Sm;0;ON;;;;;N;;;;;
+22C8;BOWTIE;Sm;0;ON;;;;;N;;;;;
+22C9;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CA;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CB;LEFT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CC;RIGHT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CD;REVERSED TILDE EQUALS;Sm;0;ON;;;;;Y;;;;;
+22CE;CURLY LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+22CF;CURLY LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+22D0;DOUBLE SUBSET;Sm;0;ON;;;;;Y;;;;;
+22D1;DOUBLE SUPERSET;Sm;0;ON;;;;;Y;;;;;
+22D2;DOUBLE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+22D3;DOUBLE UNION;Sm;0;ON;;;;;N;;;;;
+22D4;PITCHFORK;Sm;0;ON;;;;;N;;;;;
+22D5;EQUAL AND PARALLEL TO;Sm;0;ON;;;;;N;;;;;
+22D6;LESS-THAN WITH DOT;Sm;0;ON;;;;;Y;LESS THAN WITH DOT;;;;
+22D7;GREATER-THAN WITH DOT;Sm;0;ON;;;;;Y;GREATER THAN WITH DOT;;;;
+22D8;VERY MUCH LESS-THAN;Sm;0;ON;;;;;Y;VERY MUCH LESS THAN;;;;
+22D9;VERY MUCH GREATER-THAN;Sm;0;ON;;;;;Y;VERY MUCH GREATER THAN;;;;
+22DA;LESS-THAN EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN EQUAL TO OR GREATER THAN;;;;
+22DB;GREATER-THAN EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN EQUAL TO OR LESS THAN;;;;
+22DC;EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR LESS THAN;;;;
+22DD;EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR GREATER THAN;;;;
+22DE;EQUAL TO OR PRECEDES;Sm;0;ON;;;;;Y;;;;;
+22DF;EQUAL TO OR SUCCEEDS;Sm;0;ON;;;;;Y;;;;;
+22E0;DOES NOT PRECEDE OR EQUAL;Sm;0;ON;227C 0338;;;;Y;;;;;
+22E1;DOES NOT SUCCEED OR EQUAL;Sm;0;ON;227D 0338;;;;Y;;;;;
+22E2;NOT SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;2291 0338;;;;Y;;;;;
+22E3;NOT SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;2292 0338;;;;Y;;;;;
+22E4;SQUARE IMAGE OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22E5;SQUARE ORIGINAL OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22E6;LESS-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUIVALENT TO;;;;
+22E7;GREATER-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUIVALENT TO;;;;
+22E8;PRECEDES BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+22E9;SUCCEEDS BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+22EA;NOT NORMAL SUBGROUP OF;Sm;0;ON;22B2 0338;;;;Y;;;;;
+22EB;DOES NOT CONTAIN AS NORMAL SUBGROUP;Sm;0;ON;22B3 0338;;;;Y;;;;;
+22EC;NOT NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;22B4 0338;;;;Y;;;;;
+22ED;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL;Sm;0;ON;22B5 0338;;;;Y;;;;;
+22EE;VERTICAL ELLIPSIS;Sm;0;ON;;;;;N;;;;;
+22EF;MIDLINE HORIZONTAL ELLIPSIS;Sm;0;ON;;;;;N;;;;;
+22F0;UP RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;;
+22F1;DOWN RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;;
+22F2;ELEMENT OF WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22F3;ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22F4;SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22F5;ELEMENT OF WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+22F6;ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22F7;SMALL ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22F8;ELEMENT OF WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+22F9;ELEMENT OF WITH TWO HORIZONTAL STROKES;Sm;0;ON;;;;;Y;;;;;
+22FA;CONTAINS WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22FB;CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22FC;SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22FD;CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22FE;SMALL CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22FF;Z NOTATION BAG MEMBERSHIP;Sm;0;ON;;;;;Y;;;;;
+2300;DIAMETER SIGN;So;0;ON;;;;;N;;;;;
+2301;ELECTRIC ARROW;So;0;ON;;;;;N;;;;;
+2302;HOUSE;So;0;ON;;;;;N;;;;;
+2303;UP ARROWHEAD;So;0;ON;;;;;N;;;;;
+2304;DOWN ARROWHEAD;So;0;ON;;;;;N;;;;;
+2305;PROJECTIVE;So;0;ON;;;;;N;;;;;
+2306;PERSPECTIVE;So;0;ON;;;;;N;;;;;
+2307;WAVY LINE;So;0;ON;;;;;N;;;;;
+2308;LEFT CEILING;Ps;0;ON;;;;;Y;;;;;
+2309;RIGHT CEILING;Pe;0;ON;;;;;Y;;;;;
+230A;LEFT FLOOR;Ps;0;ON;;;;;Y;;;;;
+230B;RIGHT FLOOR;Pe;0;ON;;;;;Y;;;;;
+230C;BOTTOM RIGHT CROP;So;0;ON;;;;;N;;;;;
+230D;BOTTOM LEFT CROP;So;0;ON;;;;;N;;;;;
+230E;TOP RIGHT CROP;So;0;ON;;;;;N;;;;;
+230F;TOP LEFT CROP;So;0;ON;;;;;N;;;;;
+2310;REVERSED NOT SIGN;So;0;ON;;;;;N;;;;;
+2311;SQUARE LOZENGE;So;0;ON;;;;;N;;;;;
+2312;ARC;So;0;ON;;;;;N;;;;;
+2313;SEGMENT;So;0;ON;;;;;N;;;;;
+2314;SECTOR;So;0;ON;;;;;N;;;;;
+2315;TELEPHONE RECORDER;So;0;ON;;;;;N;;;;;
+2316;POSITION INDICATOR;So;0;ON;;;;;N;;;;;
+2317;VIEWDATA SQUARE;So;0;ON;;;;;N;;;;;
+2318;PLACE OF INTEREST SIGN;So;0;ON;;;;;N;COMMAND KEY;;;;
+2319;TURNED NOT SIGN;So;0;ON;;;;;N;;;;;
+231A;WATCH;So;0;ON;;;;;N;;;;;
+231B;HOURGLASS;So;0;ON;;;;;N;;;;;
+231C;TOP LEFT CORNER;So;0;ON;;;;;N;;;;;
+231D;TOP RIGHT CORNER;So;0;ON;;;;;N;;;;;
+231E;BOTTOM LEFT CORNER;So;0;ON;;;;;N;;;;;
+231F;BOTTOM RIGHT CORNER;So;0;ON;;;;;N;;;;;
+2320;TOP HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2321;BOTTOM HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2322;FROWN;So;0;ON;;;;;N;;;;;
+2323;SMILE;So;0;ON;;;;;N;;;;;
+2324;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS;So;0;ON;;;;;N;ENTER KEY;;;;
+2325;OPTION KEY;So;0;ON;;;;;N;;;;;
+2326;ERASE TO THE RIGHT;So;0;ON;;;;;N;DELETE TO THE RIGHT KEY;;;;
+2327;X IN A RECTANGLE BOX;So;0;ON;;;;;N;CLEAR KEY;;;;
+2328;KEYBOARD;So;0;ON;;;;;N;;;;;
+2329;LEFT-POINTING ANGLE BRACKET;Ps;0;ON;3008;;;;Y;BRA;;;;
+232A;RIGHT-POINTING ANGLE BRACKET;Pe;0;ON;3009;;;;Y;KET;;;;
+232B;ERASE TO THE LEFT;So;0;ON;;;;;N;DELETE TO THE LEFT KEY;;;;
+232C;BENZENE RING;So;0;ON;;;;;N;;;;;
+232D;CYLINDRICITY;So;0;ON;;;;;N;;;;;
+232E;ALL AROUND-PROFILE;So;0;ON;;;;;N;;;;;
+232F;SYMMETRY;So;0;ON;;;;;N;;;;;
+2330;TOTAL RUNOUT;So;0;ON;;;;;N;;;;;
+2331;DIMENSION ORIGIN;So;0;ON;;;;;N;;;;;
+2332;CONICAL TAPER;So;0;ON;;;;;N;;;;;
+2333;SLOPE;So;0;ON;;;;;N;;;;;
+2334;COUNTERBORE;So;0;ON;;;;;N;;;;;
+2335;COUNTERSINK;So;0;ON;;;;;N;;;;;
+2336;APL FUNCTIONAL SYMBOL I-BEAM;So;0;L;;;;;N;;;;;
+2337;APL FUNCTIONAL SYMBOL SQUISH QUAD;So;0;L;;;;;N;;;;;
+2338;APL FUNCTIONAL SYMBOL QUAD EQUAL;So;0;L;;;;;N;;;;;
+2339;APL FUNCTIONAL SYMBOL QUAD DIVIDE;So;0;L;;;;;N;;;;;
+233A;APL FUNCTIONAL SYMBOL QUAD DIAMOND;So;0;L;;;;;N;;;;;
+233B;APL FUNCTIONAL SYMBOL QUAD JOT;So;0;L;;;;;N;;;;;
+233C;APL FUNCTIONAL SYMBOL QUAD CIRCLE;So;0;L;;;;;N;;;;;
+233D;APL FUNCTIONAL SYMBOL CIRCLE STILE;So;0;L;;;;;N;;;;;
+233E;APL FUNCTIONAL SYMBOL CIRCLE JOT;So;0;L;;;;;N;;;;;
+233F;APL FUNCTIONAL SYMBOL SLASH BAR;So;0;L;;;;;N;;;;;
+2340;APL FUNCTIONAL SYMBOL BACKSLASH BAR;So;0;L;;;;;N;;;;;
+2341;APL FUNCTIONAL SYMBOL QUAD SLASH;So;0;L;;;;;N;;;;;
+2342;APL FUNCTIONAL SYMBOL QUAD BACKSLASH;So;0;L;;;;;N;;;;;
+2343;APL FUNCTIONAL SYMBOL QUAD LESS-THAN;So;0;L;;;;;N;;;;;
+2344;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN;So;0;L;;;;;N;;;;;
+2345;APL FUNCTIONAL SYMBOL LEFTWARDS VANE;So;0;L;;;;;N;;;;;
+2346;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE;So;0;L;;;;;N;;;;;
+2347;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW;So;0;L;;;;;N;;;;;
+2348;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW;So;0;L;;;;;N;;;;;
+2349;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH;So;0;L;;;;;N;;;;;
+234A;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR;So;0;L;;;;;N;;;;;
+234B;APL FUNCTIONAL SYMBOL DELTA STILE;So;0;L;;;;;N;;;;;
+234C;APL FUNCTIONAL SYMBOL QUAD DOWN CARET;So;0;L;;;;;N;;;;;
+234D;APL FUNCTIONAL SYMBOL QUAD DELTA;So;0;L;;;;;N;;;;;
+234E;APL FUNCTIONAL SYMBOL DOWN TACK JOT;So;0;L;;;;;N;;;;;
+234F;APL FUNCTIONAL SYMBOL UPWARDS VANE;So;0;L;;;;;N;;;;;
+2350;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW;So;0;L;;;;;N;;;;;
+2351;APL FUNCTIONAL SYMBOL UP TACK OVERBAR;So;0;L;;;;;N;;;;;
+2352;APL FUNCTIONAL SYMBOL DEL STILE;So;0;L;;;;;N;;;;;
+2353;APL FUNCTIONAL SYMBOL QUAD UP CARET;So;0;L;;;;;N;;;;;
+2354;APL FUNCTIONAL SYMBOL QUAD DEL;So;0;L;;;;;N;;;;;
+2355;APL FUNCTIONAL SYMBOL UP TACK JOT;So;0;L;;;;;N;;;;;
+2356;APL FUNCTIONAL SYMBOL DOWNWARDS VANE;So;0;L;;;;;N;;;;;
+2357;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW;So;0;L;;;;;N;;;;;
+2358;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR;So;0;L;;;;;N;;;;;
+2359;APL FUNCTIONAL SYMBOL DELTA UNDERBAR;So;0;L;;;;;N;;;;;
+235A;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR;So;0;L;;;;;N;;;;;
+235B;APL FUNCTIONAL SYMBOL JOT UNDERBAR;So;0;L;;;;;N;;;;;
+235C;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR;So;0;L;;;;;N;;;;;
+235D;APL FUNCTIONAL SYMBOL UP SHOE JOT;So;0;L;;;;;N;;;;;
+235E;APL FUNCTIONAL SYMBOL QUOTE QUAD;So;0;L;;;;;N;;;;;
+235F;APL FUNCTIONAL SYMBOL CIRCLE STAR;So;0;L;;;;;N;;;;;
+2360;APL FUNCTIONAL SYMBOL QUAD COLON;So;0;L;;;;;N;;;;;
+2361;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS;So;0;L;;;;;N;;;;;
+2362;APL FUNCTIONAL SYMBOL DEL DIAERESIS;So;0;L;;;;;N;;;;;
+2363;APL FUNCTIONAL SYMBOL STAR DIAERESIS;So;0;L;;;;;N;;;;;
+2364;APL FUNCTIONAL SYMBOL JOT DIAERESIS;So;0;L;;;;;N;;;;;
+2365;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS;So;0;L;;;;;N;;;;;
+2366;APL FUNCTIONAL SYMBOL DOWN SHOE STILE;So;0;L;;;;;N;;;;;
+2367;APL FUNCTIONAL SYMBOL LEFT SHOE STILE;So;0;L;;;;;N;;;;;
+2368;APL FUNCTIONAL SYMBOL TILDE DIAERESIS;So;0;L;;;;;N;;;;;
+2369;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS;So;0;L;;;;;N;;;;;
+236A;APL FUNCTIONAL SYMBOL COMMA BAR;So;0;L;;;;;N;;;;;
+236B;APL FUNCTIONAL SYMBOL DEL TILDE;So;0;L;;;;;N;;;;;
+236C;APL FUNCTIONAL SYMBOL ZILDE;So;0;L;;;;;N;;;;;
+236D;APL FUNCTIONAL SYMBOL STILE TILDE;So;0;L;;;;;N;;;;;
+236E;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR;So;0;L;;;;;N;;;;;
+236F;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL;So;0;L;;;;;N;;;;;
+2370;APL FUNCTIONAL SYMBOL QUAD QUESTION;So;0;L;;;;;N;;;;;
+2371;APL FUNCTIONAL SYMBOL DOWN CARET TILDE;So;0;L;;;;;N;;;;;
+2372;APL FUNCTIONAL SYMBOL UP CARET TILDE;So;0;L;;;;;N;;;;;
+2373;APL FUNCTIONAL SYMBOL IOTA;So;0;L;;;;;N;;;;;
+2374;APL FUNCTIONAL SYMBOL RHO;So;0;L;;;;;N;;;;;
+2375;APL FUNCTIONAL SYMBOL OMEGA;So;0;L;;;;;N;;;;;
+2376;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR;So;0;L;;;;;N;;;;;
+2377;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR;So;0;L;;;;;N;;;;;
+2378;APL FUNCTIONAL SYMBOL IOTA UNDERBAR;So;0;L;;;;;N;;;;;
+2379;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR;So;0;L;;;;;N;;;;;
+237A;APL FUNCTIONAL SYMBOL ALPHA;So;0;L;;;;;N;;;;;
+237B;NOT CHECK MARK;So;0;ON;;;;;N;;;;;
+237C;RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW;Sm;0;ON;;;;;N;;;;;
+237D;SHOULDERED OPEN BOX;So;0;ON;;;;;N;;;;;
+237E;BELL SYMBOL;So;0;ON;;;;;N;;;;;
+237F;VERTICAL LINE WITH MIDDLE DOT;So;0;ON;;;;;N;;;;;
+2380;INSERTION SYMBOL;So;0;ON;;;;;N;;;;;
+2381;CONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;;
+2382;DISCONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;;
+2383;EMPHASIS SYMBOL;So;0;ON;;;;;N;;;;;
+2384;COMPOSITION SYMBOL;So;0;ON;;;;;N;;;;;
+2385;WHITE SQUARE WITH CENTRE VERTICAL LINE;So;0;ON;;;;;N;;;;;
+2386;ENTER SYMBOL;So;0;ON;;;;;N;;;;;
+2387;ALTERNATIVE KEY SYMBOL;So;0;ON;;;;;N;;;;;
+2388;HELM SYMBOL;So;0;ON;;;;;N;;;;;
+2389;CIRCLED HORIZONTAL BAR WITH NOTCH;So;0;ON;;;;;N;;;;;
+238A;CIRCLED TRIANGLE DOWN;So;0;ON;;;;;N;;;;;
+238B;BROKEN CIRCLE WITH NORTHWEST ARROW;So;0;ON;;;;;N;;;;;
+238C;UNDO SYMBOL;So;0;ON;;;;;N;;;;;
+238D;MONOSTABLE SYMBOL;So;0;ON;;;;;N;;;;;
+238E;HYSTERESIS SYMBOL;So;0;ON;;;;;N;;;;;
+238F;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL;So;0;ON;;;;;N;;;;;
+2390;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL;So;0;ON;;;;;N;;;;;
+2391;PASSIVE-PULL-DOWN-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;;
+2392;PASSIVE-PULL-UP-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;;
+2393;DIRECT CURRENT SYMBOL FORM TWO;So;0;ON;;;;;N;;;;;
+2394;SOFTWARE-FUNCTION SYMBOL;So;0;ON;;;;;N;;;;;
+2395;APL FUNCTIONAL SYMBOL QUAD;So;0;L;;;;;N;;;;;
+2396;DECIMAL SEPARATOR KEY SYMBOL;So;0;ON;;;;;N;;;;;
+2397;PREVIOUS PAGE;So;0;ON;;;;;N;;;;;
+2398;NEXT PAGE;So;0;ON;;;;;N;;;;;
+2399;PRINT SCREEN SYMBOL;So;0;ON;;;;;N;;;;;
+239A;CLEAR SCREEN SYMBOL;So;0;ON;;;;;N;;;;;
+239B;LEFT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+239C;LEFT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;;
+239D;LEFT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+239E;RIGHT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+239F;RIGHT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;;
+23A0;RIGHT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+23A1;LEFT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;;
+23A2;LEFT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;;
+23A3;LEFT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;;
+23A4;RIGHT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;;
+23A5;RIGHT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;;
+23A6;RIGHT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;;
+23A7;LEFT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+23A8;LEFT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;;
+23A9;LEFT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+23AA;CURLY BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;;
+23AB;RIGHT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+23AC;RIGHT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;;
+23AD;RIGHT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+23AE;INTEGRAL EXTENSION;Sm;0;ON;;;;;N;;;;;
+23AF;HORIZONTAL LINE EXTENSION;Sm;0;ON;;;;;N;;;;;
+23B0;UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;;
+23B1;UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;;
+23B2;SUMMATION TOP;Sm;0;ON;;;;;N;;;;;
+23B3;SUMMATION BOTTOM;Sm;0;ON;;;;;N;;;;;
+23B4;TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;;
+23B5;BOTTOM SQUARE BRACKET;So;0;ON;;;;;N;;;;;
+23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;;
+23B7;RADICAL SYMBOL BOTTOM;So;0;ON;;;;;N;;;;;
+23B8;LEFT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;;
+23B9;RIGHT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;;
+23BA;HORIZONTAL SCAN LINE-1;So;0;ON;;;;;N;;;;;
+23BB;HORIZONTAL SCAN LINE-3;So;0;ON;;;;;N;;;;;
+23BC;HORIZONTAL SCAN LINE-7;So;0;ON;;;;;N;;;;;
+23BD;HORIZONTAL SCAN LINE-9;So;0;ON;;;;;N;;;;;
+23BE;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT;So;0;ON;;;;;N;;;;;
+23BF;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT;So;0;ON;;;;;N;;;;;
+23C0;DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23C1;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23C2;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23C3;DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE;So;0;ON;;;;;N;;;;;
+23C4;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;;
+23C5;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;;
+23C6;DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE;So;0;ON;;;;;N;;;;;
+23C7;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;;
+23C8;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;;
+23C9;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;;;;;
+23CA;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;;;;;
+23CB;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT;So;0;ON;;;;;N;;;;;
+23CC;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT;So;0;ON;;;;;N;;;;;
+23CD;SQUARE FOOT;So;0;ON;;;;;N;;;;;
+23CE;RETURN SYMBOL;So;0;ON;;;;;N;;;;;
+23CF;EJECT SYMBOL;So;0;ON;;;;;N;;;;;
+23D0;VERTICAL LINE EXTENSION;So;0;ON;;;;;N;;;;;
+23D1;METRICAL BREVE;So;0;ON;;;;;N;;;;;
+23D2;METRICAL LONG OVER SHORT;So;0;ON;;;;;N;;;;;
+23D3;METRICAL SHORT OVER LONG;So;0;ON;;;;;N;;;;;
+23D4;METRICAL LONG OVER TWO SHORTS;So;0;ON;;;;;N;;;;;
+23D5;METRICAL TWO SHORTS OVER LONG;So;0;ON;;;;;N;;;;;
+23D6;METRICAL TWO SHORTS JOINED;So;0;ON;;;;;N;;;;;
+23D7;METRICAL TRISEME;So;0;ON;;;;;N;;;;;
+23D8;METRICAL TETRASEME;So;0;ON;;;;;N;;;;;
+23D9;METRICAL PENTASEME;So;0;ON;;;;;N;;;;;
+23DA;EARTH GROUND;So;0;ON;;;;;N;;;;;
+23DB;FUSE;So;0;ON;;;;;N;;;;;
+23DC;TOP PARENTHESIS;Sm;0;ON;;;;;N;;;;;
+23DD;BOTTOM PARENTHESIS;Sm;0;ON;;;;;N;;;;;
+23DE;TOP CURLY BRACKET;Sm;0;ON;;;;;N;;;;;
+23DF;BOTTOM CURLY BRACKET;Sm;0;ON;;;;;N;;;;;
+23E0;TOP TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;;;;
+23E1;BOTTOM TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;;;;
+23E2;WHITE TRAPEZIUM;So;0;ON;;;;;N;;;;;
+23E3;BENZENE RING WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23E4;STRAIGHTNESS;So;0;ON;;;;;N;;;;;
+23E5;FLATNESS;So;0;ON;;;;;N;;;;;
+23E6;AC CURRENT;So;0;ON;;;;;N;;;;;
+23E7;ELECTRICAL INTERSECTION;So;0;ON;;;;;N;;;;;
+23E8;DECIMAL EXPONENT SYMBOL;So;0;ON;;;;;N;;;;;
+23E9;BLACK RIGHT-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;;
+23EA;BLACK LEFT-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;;
+23EB;BLACK UP-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;;
+23EC;BLACK DOWN-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;;
+23ED;BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR;So;0;ON;;;;;N;;;;;
+23EE;BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR;So;0;ON;;;;;N;;;;;
+23EF;BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR;So;0;ON;;;;;N;;;;;
+23F0;ALARM CLOCK;So;0;ON;;;;;N;;;;;
+23F1;STOPWATCH;So;0;ON;;;;;N;;;;;
+23F2;TIMER CLOCK;So;0;ON;;;;;N;;;;;
+23F3;HOURGLASS WITH FLOWING SAND;So;0;ON;;;;;N;;;;;
+23F4;BLACK MEDIUM LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;;
+23F5;BLACK MEDIUM RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;;
+23F6;BLACK MEDIUM UP-POINTING TRIANGLE;So;0;ON;;;;;N;;;;;
+23F7;BLACK MEDIUM DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;;
+23F8;DOUBLE VERTICAL BAR;So;0;ON;;;;;N;;;;;
+23F9;BLACK SQUARE FOR STOP;So;0;ON;;;;;N;;;;;
+23FA;BLACK CIRCLE FOR RECORD;So;0;ON;;;;;N;;;;;
+23FB;POWER SYMBOL;So;0;ON;;;;;N;;;;;
+23FC;POWER ON-OFF SYMBOL;So;0;ON;;;;;N;;;;;
+23FD;POWER ON SYMBOL;So;0;ON;;;;;N;;;;;
+23FE;POWER SLEEP SYMBOL;So;0;ON;;;;;N;;;;;
+2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;;
+2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;;
+2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;;
+2403;SYMBOL FOR END OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR END OF TEXT;;;;
+2404;SYMBOL FOR END OF TRANSMISSION;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION;;;;
+2405;SYMBOL FOR ENQUIRY;So;0;ON;;;;;N;GRAPHIC FOR ENQUIRY;;;;
+2406;SYMBOL FOR ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR ACKNOWLEDGE;;;;
+2407;SYMBOL FOR BELL;So;0;ON;;;;;N;GRAPHIC FOR BELL;;;;
+2408;SYMBOL FOR BACKSPACE;So;0;ON;;;;;N;GRAPHIC FOR BACKSPACE;;;;
+2409;SYMBOL FOR HORIZONTAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR HORIZONTAL TABULATION;;;;
+240A;SYMBOL FOR LINE FEED;So;0;ON;;;;;N;GRAPHIC FOR LINE FEED;;;;
+240B;SYMBOL FOR VERTICAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR VERTICAL TABULATION;;;;
+240C;SYMBOL FOR FORM FEED;So;0;ON;;;;;N;GRAPHIC FOR FORM FEED;;;;
+240D;SYMBOL FOR CARRIAGE RETURN;So;0;ON;;;;;N;GRAPHIC FOR CARRIAGE RETURN;;;;
+240E;SYMBOL FOR SHIFT OUT;So;0;ON;;;;;N;GRAPHIC FOR SHIFT OUT;;;;
+240F;SYMBOL FOR SHIFT IN;So;0;ON;;;;;N;GRAPHIC FOR SHIFT IN;;;;
+2410;SYMBOL FOR DATA LINK ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR DATA LINK ESCAPE;;;;
+2411;SYMBOL FOR DEVICE CONTROL ONE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL ONE;;;;
+2412;SYMBOL FOR DEVICE CONTROL TWO;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL TWO;;;;
+2413;SYMBOL FOR DEVICE CONTROL THREE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL THREE;;;;
+2414;SYMBOL FOR DEVICE CONTROL FOUR;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL FOUR;;;;
+2415;SYMBOL FOR NEGATIVE ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR NEGATIVE ACKNOWLEDGE;;;;
+2416;SYMBOL FOR SYNCHRONOUS IDLE;So;0;ON;;;;;N;GRAPHIC FOR SYNCHRONOUS IDLE;;;;
+2417;SYMBOL FOR END OF TRANSMISSION BLOCK;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION BLOCK;;;;
+2418;SYMBOL FOR CANCEL;So;0;ON;;;;;N;GRAPHIC FOR CANCEL;;;;
+2419;SYMBOL FOR END OF MEDIUM;So;0;ON;;;;;N;GRAPHIC FOR END OF MEDIUM;;;;
+241A;SYMBOL FOR SUBSTITUTE;So;0;ON;;;;;N;GRAPHIC FOR SUBSTITUTE;;;;
+241B;SYMBOL FOR ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR ESCAPE;;;;
+241C;SYMBOL FOR FILE SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR FILE SEPARATOR;;;;
+241D;SYMBOL FOR GROUP SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR GROUP SEPARATOR;;;;
+241E;SYMBOL FOR RECORD SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR RECORD SEPARATOR;;;;
+241F;SYMBOL FOR UNIT SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR UNIT SEPARATOR;;;;
+2420;SYMBOL FOR SPACE;So;0;ON;;;;;N;GRAPHIC FOR SPACE;;;;
+2421;SYMBOL FOR DELETE;So;0;ON;;;;;N;GRAPHIC FOR DELETE;;;;
+2422;BLANK SYMBOL;So;0;ON;;;;;N;BLANK;;;;
+2423;OPEN BOX;So;0;ON;;;;;N;;;;;
+2424;SYMBOL FOR NEWLINE;So;0;ON;;;;;N;GRAPHIC FOR NEWLINE;;;;
+2425;SYMBOL FOR DELETE FORM TWO;So;0;ON;;;;;N;;;;;
+2426;SYMBOL FOR SUBSTITUTE FORM TWO;So;0;ON;;;;;N;;;;;
+2440;OCR HOOK;So;0;ON;;;;;N;;;;;
+2441;OCR CHAIR;So;0;ON;;;;;N;;;;;
+2442;OCR FORK;So;0;ON;;;;;N;;;;;
+2443;OCR INVERTED FORK;So;0;ON;;;;;N;;;;;
+2444;OCR BELT BUCKLE;So;0;ON;;;;;N;;;;;
+2445;OCR BOW TIE;So;0;ON;;;;;N;;;;;
+2446;OCR BRANCH BANK IDENTIFICATION;So;0;ON;;;;;N;;;;;
+2447;OCR AMOUNT OF CHECK;So;0;ON;;;;;N;;;;;
+2448;OCR DASH;So;0;ON;;;;;N;;;;;
+2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;;
+244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;;
+2460;CIRCLED DIGIT ONE;No;0;ON;<circle> 0031;;1;1;N;;;;;
+2461;CIRCLED DIGIT TWO;No;0;ON;<circle> 0032;;2;2;N;;;;;
+2462;CIRCLED DIGIT THREE;No;0;ON;<circle> 0033;;3;3;N;;;;;
+2463;CIRCLED DIGIT FOUR;No;0;ON;<circle> 0034;;4;4;N;;;;;
+2464;CIRCLED DIGIT FIVE;No;0;ON;<circle> 0035;;5;5;N;;;;;
+2465;CIRCLED DIGIT SIX;No;0;ON;<circle> 0036;;6;6;N;;;;;
+2466;CIRCLED DIGIT SEVEN;No;0;ON;<circle> 0037;;7;7;N;;;;;
+2467;CIRCLED DIGIT EIGHT;No;0;ON;<circle> 0038;;8;8;N;;;;;
+2468;CIRCLED DIGIT NINE;No;0;ON;<circle> 0039;;9;9;N;;;;;
+2469;CIRCLED NUMBER TEN;No;0;ON;<circle> 0031 0030;;;10;N;;;;;
+246A;CIRCLED NUMBER ELEVEN;No;0;ON;<circle> 0031 0031;;;11;N;;;;;
+246B;CIRCLED NUMBER TWELVE;No;0;ON;<circle> 0031 0032;;;12;N;;;;;
+246C;CIRCLED NUMBER THIRTEEN;No;0;ON;<circle> 0031 0033;;;13;N;;;;;
+246D;CIRCLED NUMBER FOURTEEN;No;0;ON;<circle> 0031 0034;;;14;N;;;;;
+246E;CIRCLED NUMBER FIFTEEN;No;0;ON;<circle> 0031 0035;;;15;N;;;;;
+246F;CIRCLED NUMBER SIXTEEN;No;0;ON;<circle> 0031 0036;;;16;N;;;;;
+2470;CIRCLED NUMBER SEVENTEEN;No;0;ON;<circle> 0031 0037;;;17;N;;;;;
+2471;CIRCLED NUMBER EIGHTEEN;No;0;ON;<circle> 0031 0038;;;18;N;;;;;
+2472;CIRCLED NUMBER NINETEEN;No;0;ON;<circle> 0031 0039;;;19;N;;;;;
+2473;CIRCLED NUMBER TWENTY;No;0;ON;<circle> 0032 0030;;;20;N;;;;;
+2474;PARENTHESIZED DIGIT ONE;No;0;ON;<compat> 0028 0031 0029;;1;1;N;;;;;
+2475;PARENTHESIZED DIGIT TWO;No;0;ON;<compat> 0028 0032 0029;;2;2;N;;;;;
+2476;PARENTHESIZED DIGIT THREE;No;0;ON;<compat> 0028 0033 0029;;3;3;N;;;;;
+2477;PARENTHESIZED DIGIT FOUR;No;0;ON;<compat> 0028 0034 0029;;4;4;N;;;;;
+2478;PARENTHESIZED DIGIT FIVE;No;0;ON;<compat> 0028 0035 0029;;5;5;N;;;;;
+2479;PARENTHESIZED DIGIT SIX;No;0;ON;<compat> 0028 0036 0029;;6;6;N;;;;;
+247A;PARENTHESIZED DIGIT SEVEN;No;0;ON;<compat> 0028 0037 0029;;7;7;N;;;;;
+247B;PARENTHESIZED DIGIT EIGHT;No;0;ON;<compat> 0028 0038 0029;;8;8;N;;;;;
+247C;PARENTHESIZED DIGIT NINE;No;0;ON;<compat> 0028 0039 0029;;9;9;N;;;;;
+247D;PARENTHESIZED NUMBER TEN;No;0;ON;<compat> 0028 0031 0030 0029;;;10;N;;;;;
+247E;PARENTHESIZED NUMBER ELEVEN;No;0;ON;<compat> 0028 0031 0031 0029;;;11;N;;;;;
+247F;PARENTHESIZED NUMBER TWELVE;No;0;ON;<compat> 0028 0031 0032 0029;;;12;N;;;;;
+2480;PARENTHESIZED NUMBER THIRTEEN;No;0;ON;<compat> 0028 0031 0033 0029;;;13;N;;;;;
+2481;PARENTHESIZED NUMBER FOURTEEN;No;0;ON;<compat> 0028 0031 0034 0029;;;14;N;;;;;
+2482;PARENTHESIZED NUMBER FIFTEEN;No;0;ON;<compat> 0028 0031 0035 0029;;;15;N;;;;;
+2483;PARENTHESIZED NUMBER SIXTEEN;No;0;ON;<compat> 0028 0031 0036 0029;;;16;N;;;;;
+2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;ON;<compat> 0028 0031 0037 0029;;;17;N;;;;;
+2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;ON;<compat> 0028 0031 0038 0029;;;18;N;;;;;
+2486;PARENTHESIZED NUMBER NINETEEN;No;0;ON;<compat> 0028 0031 0039 0029;;;19;N;;;;;
+2487;PARENTHESIZED NUMBER TWENTY;No;0;ON;<compat> 0028 0032 0030 0029;;;20;N;;;;;
+2488;DIGIT ONE FULL STOP;No;0;EN;<compat> 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;;
+2489;DIGIT TWO FULL STOP;No;0;EN;<compat> 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;;
+248A;DIGIT THREE FULL STOP;No;0;EN;<compat> 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;;
+248B;DIGIT FOUR FULL STOP;No;0;EN;<compat> 0034 002E;;4;4;N;DIGIT FOUR PERIOD;;;;
+248C;DIGIT FIVE FULL STOP;No;0;EN;<compat> 0035 002E;;5;5;N;DIGIT FIVE PERIOD;;;;
+248D;DIGIT SIX FULL STOP;No;0;EN;<compat> 0036 002E;;6;6;N;DIGIT SIX PERIOD;;;;
+248E;DIGIT SEVEN FULL STOP;No;0;EN;<compat> 0037 002E;;7;7;N;DIGIT SEVEN PERIOD;;;;
+248F;DIGIT EIGHT FULL STOP;No;0;EN;<compat> 0038 002E;;8;8;N;DIGIT EIGHT PERIOD;;;;
+2490;DIGIT NINE FULL STOP;No;0;EN;<compat> 0039 002E;;9;9;N;DIGIT NINE PERIOD;;;;
+2491;NUMBER TEN FULL STOP;No;0;EN;<compat> 0031 0030 002E;;;10;N;NUMBER TEN PERIOD;;;;
+2492;NUMBER ELEVEN FULL STOP;No;0;EN;<compat> 0031 0031 002E;;;11;N;NUMBER ELEVEN PERIOD;;;;
+2493;NUMBER TWELVE FULL STOP;No;0;EN;<compat> 0031 0032 002E;;;12;N;NUMBER TWELVE PERIOD;;;;
+2494;NUMBER THIRTEEN FULL STOP;No;0;EN;<compat> 0031 0033 002E;;;13;N;NUMBER THIRTEEN PERIOD;;;;
+2495;NUMBER FOURTEEN FULL STOP;No;0;EN;<compat> 0031 0034 002E;;;14;N;NUMBER FOURTEEN PERIOD;;;;
+2496;NUMBER FIFTEEN FULL STOP;No;0;EN;<compat> 0031 0035 002E;;;15;N;NUMBER FIFTEEN PERIOD;;;;
+2497;NUMBER SIXTEEN FULL STOP;No;0;EN;<compat> 0031 0036 002E;;;16;N;NUMBER SIXTEEN PERIOD;;;;
+2498;NUMBER SEVENTEEN FULL STOP;No;0;EN;<compat> 0031 0037 002E;;;17;N;NUMBER SEVENTEEN PERIOD;;;;
+2499;NUMBER EIGHTEEN FULL STOP;No;0;EN;<compat> 0031 0038 002E;;;18;N;NUMBER EIGHTEEN PERIOD;;;;
+249A;NUMBER NINETEEN FULL STOP;No;0;EN;<compat> 0031 0039 002E;;;19;N;NUMBER NINETEEN PERIOD;;;;
+249B;NUMBER TWENTY FULL STOP;No;0;EN;<compat> 0032 0030 002E;;;20;N;NUMBER TWENTY PERIOD;;;;
+249C;PARENTHESIZED LATIN SMALL LETTER A;So;0;L;<compat> 0028 0061 0029;;;;N;;;;;
+249D;PARENTHESIZED LATIN SMALL LETTER B;So;0;L;<compat> 0028 0062 0029;;;;N;;;;;
+249E;PARENTHESIZED LATIN SMALL LETTER C;So;0;L;<compat> 0028 0063 0029;;;;N;;;;;
+249F;PARENTHESIZED LATIN SMALL LETTER D;So;0;L;<compat> 0028 0064 0029;;;;N;;;;;
+24A0;PARENTHESIZED LATIN SMALL LETTER E;So;0;L;<compat> 0028 0065 0029;;;;N;;;;;
+24A1;PARENTHESIZED LATIN SMALL LETTER F;So;0;L;<compat> 0028 0066 0029;;;;N;;;;;
+24A2;PARENTHESIZED LATIN SMALL LETTER G;So;0;L;<compat> 0028 0067 0029;;;;N;;;;;
+24A3;PARENTHESIZED LATIN SMALL LETTER H;So;0;L;<compat> 0028 0068 0029;;;;N;;;;;
+24A4;PARENTHESIZED LATIN SMALL LETTER I;So;0;L;<compat> 0028 0069 0029;;;;N;;;;;
+24A5;PARENTHESIZED LATIN SMALL LETTER J;So;0;L;<compat> 0028 006A 0029;;;;N;;;;;
+24A6;PARENTHESIZED LATIN SMALL LETTER K;So;0;L;<compat> 0028 006B 0029;;;;N;;;;;
+24A7;PARENTHESIZED LATIN SMALL LETTER L;So;0;L;<compat> 0028 006C 0029;;;;N;;;;;
+24A8;PARENTHESIZED LATIN SMALL LETTER M;So;0;L;<compat> 0028 006D 0029;;;;N;;;;;
+24A9;PARENTHESIZED LATIN SMALL LETTER N;So;0;L;<compat> 0028 006E 0029;;;;N;;;;;
+24AA;PARENTHESIZED LATIN SMALL LETTER O;So;0;L;<compat> 0028 006F 0029;;;;N;;;;;
+24AB;PARENTHESIZED LATIN SMALL LETTER P;So;0;L;<compat> 0028 0070 0029;;;;N;;;;;
+24AC;PARENTHESIZED LATIN SMALL LETTER Q;So;0;L;<compat> 0028 0071 0029;;;;N;;;;;
+24AD;PARENTHESIZED LATIN SMALL LETTER R;So;0;L;<compat> 0028 0072 0029;;;;N;;;;;
+24AE;PARENTHESIZED LATIN SMALL LETTER S;So;0;L;<compat> 0028 0073 0029;;;;N;;;;;
+24AF;PARENTHESIZED LATIN SMALL LETTER T;So;0;L;<compat> 0028 0074 0029;;;;N;;;;;
+24B0;PARENTHESIZED LATIN SMALL LETTER U;So;0;L;<compat> 0028 0075 0029;;;;N;;;;;
+24B1;PARENTHESIZED LATIN SMALL LETTER V;So;0;L;<compat> 0028 0076 0029;;;;N;;;;;
+24B2;PARENTHESIZED LATIN SMALL LETTER W;So;0;L;<compat> 0028 0077 0029;;;;N;;;;;
+24B3;PARENTHESIZED LATIN SMALL LETTER X;So;0;L;<compat> 0028 0078 0029;;;;N;;;;;
+24B4;PARENTHESIZED LATIN SMALL LETTER Y;So;0;L;<compat> 0028 0079 0029;;;;N;;;;;
+24B5;PARENTHESIZED LATIN SMALL LETTER Z;So;0;L;<compat> 0028 007A 0029;;;;N;;;;;
+24B6;CIRCLED LATIN CAPITAL LETTER A;So;0;L;<circle> 0041;;;;N;;;;24D0;
+24B7;CIRCLED LATIN CAPITAL LETTER B;So;0;L;<circle> 0042;;;;N;;;;24D1;
+24B8;CIRCLED LATIN CAPITAL LETTER C;So;0;L;<circle> 0043;;;;N;;;;24D2;
+24B9;CIRCLED LATIN CAPITAL LETTER D;So;0;L;<circle> 0044;;;;N;;;;24D3;
+24BA;CIRCLED LATIN CAPITAL LETTER E;So;0;L;<circle> 0045;;;;N;;;;24D4;
+24BB;CIRCLED LATIN CAPITAL LETTER F;So;0;L;<circle> 0046;;;;N;;;;24D5;
+24BC;CIRCLED LATIN CAPITAL LETTER G;So;0;L;<circle> 0047;;;;N;;;;24D6;
+24BD;CIRCLED LATIN CAPITAL LETTER H;So;0;L;<circle> 0048;;;;N;;;;24D7;
+24BE;CIRCLED LATIN CAPITAL LETTER I;So;0;L;<circle> 0049;;;;N;;;;24D8;
+24BF;CIRCLED LATIN CAPITAL LETTER J;So;0;L;<circle> 004A;;;;N;;;;24D9;
+24C0;CIRCLED LATIN CAPITAL LETTER K;So;0;L;<circle> 004B;;;;N;;;;24DA;
+24C1;CIRCLED LATIN CAPITAL LETTER L;So;0;L;<circle> 004C;;;;N;;;;24DB;
+24C2;CIRCLED LATIN CAPITAL LETTER M;So;0;L;<circle> 004D;;;;N;;;;24DC;
+24C3;CIRCLED LATIN CAPITAL LETTER N;So;0;L;<circle> 004E;;;;N;;;;24DD;
+24C4;CIRCLED LATIN CAPITAL LETTER O;So;0;L;<circle> 004F;;;;N;;;;24DE;
+24C5;CIRCLED LATIN CAPITAL LETTER P;So;0;L;<circle> 0050;;;;N;;;;24DF;
+24C6;CIRCLED LATIN CAPITAL LETTER Q;So;0;L;<circle> 0051;;;;N;;;;24E0;
+24C7;CIRCLED LATIN CAPITAL LETTER R;So;0;L;<circle> 0052;;;;N;;;;24E1;
+24C8;CIRCLED LATIN CAPITAL LETTER S;So;0;L;<circle> 0053;;;;N;;;;24E2;
+24C9;CIRCLED LATIN CAPITAL LETTER T;So;0;L;<circle> 0054;;;;N;;;;24E3;
+24CA;CIRCLED LATIN CAPITAL LETTER U;So;0;L;<circle> 0055;;;;N;;;;24E4;
+24CB;CIRCLED LATIN CAPITAL LETTER V;So;0;L;<circle> 0056;;;;N;;;;24E5;
+24CC;CIRCLED LATIN CAPITAL LETTER W;So;0;L;<circle> 0057;;;;N;;;;24E6;
+24CD;CIRCLED LATIN CAPITAL LETTER X;So;0;L;<circle> 0058;;;;N;;;;24E7;
+24CE;CIRCLED LATIN CAPITAL LETTER Y;So;0;L;<circle> 0059;;;;N;;;;24E8;
+24CF;CIRCLED LATIN CAPITAL LETTER Z;So;0;L;<circle> 005A;;;;N;;;;24E9;
+24D0;CIRCLED LATIN SMALL LETTER A;So;0;L;<circle> 0061;;;;N;;;24B6;;24B6
+24D1;CIRCLED LATIN SMALL LETTER B;So;0;L;<circle> 0062;;;;N;;;24B7;;24B7
+24D2;CIRCLED LATIN SMALL LETTER C;So;0;L;<circle> 0063;;;;N;;;24B8;;24B8
+24D3;CIRCLED LATIN SMALL LETTER D;So;0;L;<circle> 0064;;;;N;;;24B9;;24B9
+24D4;CIRCLED LATIN SMALL LETTER E;So;0;L;<circle> 0065;;;;N;;;24BA;;24BA
+24D5;CIRCLED LATIN SMALL LETTER F;So;0;L;<circle> 0066;;;;N;;;24BB;;24BB
+24D6;CIRCLED LATIN SMALL LETTER G;So;0;L;<circle> 0067;;;;N;;;24BC;;24BC
+24D7;CIRCLED LATIN SMALL LETTER H;So;0;L;<circle> 0068;;;;N;;;24BD;;24BD
+24D8;CIRCLED LATIN SMALL LETTER I;So;0;L;<circle> 0069;;;;N;;;24BE;;24BE
+24D9;CIRCLED LATIN SMALL LETTER J;So;0;L;<circle> 006A;;;;N;;;24BF;;24BF
+24DA;CIRCLED LATIN SMALL LETTER K;So;0;L;<circle> 006B;;;;N;;;24C0;;24C0
+24DB;CIRCLED LATIN SMALL LETTER L;So;0;L;<circle> 006C;;;;N;;;24C1;;24C1
+24DC;CIRCLED LATIN SMALL LETTER M;So;0;L;<circle> 006D;;;;N;;;24C2;;24C2
+24DD;CIRCLED LATIN SMALL LETTER N;So;0;L;<circle> 006E;;;;N;;;24C3;;24C3
+24DE;CIRCLED LATIN SMALL LETTER O;So;0;L;<circle> 006F;;;;N;;;24C4;;24C4
+24DF;CIRCLED LATIN SMALL LETTER P;So;0;L;<circle> 0070;;;;N;;;24C5;;24C5
+24E0;CIRCLED LATIN SMALL LETTER Q;So;0;L;<circle> 0071;;;;N;;;24C6;;24C6
+24E1;CIRCLED LATIN SMALL LETTER R;So;0;L;<circle> 0072;;;;N;;;24C7;;24C7
+24E2;CIRCLED LATIN SMALL LETTER S;So;0;L;<circle> 0073;;;;N;;;24C8;;24C8
+24E3;CIRCLED LATIN SMALL LETTER T;So;0;L;<circle> 0074;;;;N;;;24C9;;24C9
+24E4;CIRCLED LATIN SMALL LETTER U;So;0;L;<circle> 0075;;;;N;;;24CA;;24CA
+24E5;CIRCLED LATIN SMALL LETTER V;So;0;L;<circle> 0076;;;;N;;;24CB;;24CB
+24E6;CIRCLED LATIN SMALL LETTER W;So;0;L;<circle> 0077;;;;N;;;24CC;;24CC
+24E7;CIRCLED LATIN SMALL LETTER X;So;0;L;<circle> 0078;;;;N;;;24CD;;24CD
+24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L;<circle> 0079;;;;N;;;24CE;;24CE
+24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L;<circle> 007A;;;;N;;;24CF;;24CF
+24EA;CIRCLED DIGIT ZERO;No;0;ON;<circle> 0030;;0;0;N;;;;;
+24EB;NEGATIVE CIRCLED NUMBER ELEVEN;No;0;ON;;;;11;N;;;;;
+24EC;NEGATIVE CIRCLED NUMBER TWELVE;No;0;ON;;;;12;N;;;;;
+24ED;NEGATIVE CIRCLED NUMBER THIRTEEN;No;0;ON;;;;13;N;;;;;
+24EE;NEGATIVE CIRCLED NUMBER FOURTEEN;No;0;ON;;;;14;N;;;;;
+24EF;NEGATIVE CIRCLED NUMBER FIFTEEN;No;0;ON;;;;15;N;;;;;
+24F0;NEGATIVE CIRCLED NUMBER SIXTEEN;No;0;ON;;;;16;N;;;;;
+24F1;NEGATIVE CIRCLED NUMBER SEVENTEEN;No;0;ON;;;;17;N;;;;;
+24F2;NEGATIVE CIRCLED NUMBER EIGHTEEN;No;0;ON;;;;18;N;;;;;
+24F3;NEGATIVE CIRCLED NUMBER NINETEEN;No;0;ON;;;;19;N;;;;;
+24F4;NEGATIVE CIRCLED NUMBER TWENTY;No;0;ON;;;;20;N;;;;;
+24F5;DOUBLE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;;;;;
+24F6;DOUBLE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;;;;;
+24F7;DOUBLE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;;;;;
+24F8;DOUBLE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;;;;;
+24F9;DOUBLE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;;;;;
+24FA;DOUBLE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;;;;;
+24FB;DOUBLE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;;;;;
+24FC;DOUBLE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;;;;;
+24FD;DOUBLE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;;;;;
+24FE;DOUBLE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;;;;;
+24FF;NEGATIVE CIRCLED DIGIT ZERO;No;0;ON;;;0;0;N;;;;;
+2500;BOX DRAWINGS LIGHT HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT HORIZONTAL;;;;
+2501;BOX DRAWINGS HEAVY HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY HORIZONTAL;;;;
+2502;BOX DRAWINGS LIGHT VERTICAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL;;;;
+2503;BOX DRAWINGS HEAVY VERTICAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL;;;;
+2504;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH HORIZONTAL;;;;
+2505;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH HORIZONTAL;;;;
+2506;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH VERTICAL;;;;
+2507;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH VERTICAL;;;;
+2508;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH HORIZONTAL;;;;
+2509;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH HORIZONTAL;;;;
+250A;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH VERTICAL;;;;
+250B;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH VERTICAL;;;;
+250C;BOX DRAWINGS LIGHT DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND RIGHT;;;;
+250D;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT HEAVY;;;;
+250E;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT LIGHT;;;;
+250F;BOX DRAWINGS HEAVY DOWN AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND RIGHT;;;;
+2510;BOX DRAWINGS LIGHT DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND LEFT;;;;
+2511;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT HEAVY;;;;
+2512;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT LIGHT;;;;
+2513;BOX DRAWINGS HEAVY DOWN AND LEFT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND LEFT;;;;
+2514;BOX DRAWINGS LIGHT UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT UP AND RIGHT;;;;
+2515;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT HEAVY;;;;
+2516;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT LIGHT;;;;
+2517;BOX DRAWINGS HEAVY UP AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY UP AND RIGHT;;;;
+2518;BOX DRAWINGS LIGHT UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT UP AND LEFT;;;;
+2519;BOX DRAWINGS UP LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT HEAVY;;;;
+251A;BOX DRAWINGS UP HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT LIGHT;;;;
+251B;BOX DRAWINGS HEAVY UP AND LEFT;So;0;ON;;;;;N;FORMS HEAVY UP AND LEFT;;;;
+251C;BOX DRAWINGS LIGHT VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND RIGHT;;;;
+251D;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND RIGHT HEAVY;;;;
+251E;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT DOWN LIGHT;;;;
+251F;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT UP LIGHT;;;;
+2520;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND RIGHT LIGHT;;;;
+2521;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT UP HEAVY;;;;
+2522;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT DOWN HEAVY;;;;
+2523;BOX DRAWINGS HEAVY VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND RIGHT;;;;
+2524;BOX DRAWINGS LIGHT VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND LEFT;;;;
+2525;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND LEFT HEAVY;;;;
+2526;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT DOWN LIGHT;;;;
+2527;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT UP LIGHT;;;;
+2528;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND LEFT LIGHT;;;;
+2529;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT UP HEAVY;;;;
+252A;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT DOWN HEAVY;;;;
+252B;BOX DRAWINGS HEAVY VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND LEFT;;;;
+252C;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOWN AND HORIZONTAL;;;;
+252D;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT DOWN LIGHT;;;;
+252E;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT DOWN LIGHT;;;;
+252F;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND HORIZONTAL HEAVY;;;;
+2530;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND HORIZONTAL LIGHT;;;;
+2531;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT DOWN HEAVY;;;;
+2532;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT DOWN HEAVY;;;;
+2533;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOWN AND HORIZONTAL;;;;
+2534;BOX DRAWINGS LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT UP AND HORIZONTAL;;;;
+2535;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT UP LIGHT;;;;
+2536;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT UP LIGHT;;;;
+2537;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND HORIZONTAL HEAVY;;;;
+2538;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND HORIZONTAL LIGHT;;;;
+2539;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT UP HEAVY;;;;
+253A;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT UP HEAVY;;;;
+253B;BOX DRAWINGS HEAVY UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY UP AND HORIZONTAL;;;;
+253C;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND HORIZONTAL;;;;
+253D;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT;;;;
+253E;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT;;;;
+253F;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY;;;;
+2540;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT;;;;
+2541;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT;;;;
+2542;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT;;;;
+2543;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT;;;;
+2544;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT;;;;
+2545;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT;;;;
+2546;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT;;;;
+2547;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY;;;;
+2548;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY;;;;
+2549;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY;;;;
+254A;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY;;;;
+254B;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND HORIZONTAL;;;;
+254C;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH HORIZONTAL;;;;
+254D;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH HORIZONTAL;;;;
+254E;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH VERTICAL;;;;
+254F;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH VERTICAL;;;;
+2550;BOX DRAWINGS DOUBLE HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE HORIZONTAL;;;;
+2551;BOX DRAWINGS DOUBLE VERTICAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL;;;;
+2552;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND RIGHT DOUBLE;;;;
+2553;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND RIGHT SINGLE;;;;
+2554;BOX DRAWINGS DOUBLE DOWN AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND RIGHT;;;;
+2555;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND LEFT DOUBLE;;;;
+2556;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND LEFT SINGLE;;;;
+2557;BOX DRAWINGS DOUBLE DOWN AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND LEFT;;;;
+2558;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND RIGHT DOUBLE;;;;
+2559;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND RIGHT SINGLE;;;;
+255A;BOX DRAWINGS DOUBLE UP AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE UP AND RIGHT;;;;
+255B;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND LEFT DOUBLE;;;;
+255C;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND LEFT SINGLE;;;;
+255D;BOX DRAWINGS DOUBLE UP AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE UP AND LEFT;;;;
+255E;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND RIGHT DOUBLE;;;;
+255F;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND RIGHT SINGLE;;;;
+2560;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND RIGHT;;;;
+2561;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND LEFT DOUBLE;;;;
+2562;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND LEFT SINGLE;;;;
+2563;BOX DRAWINGS DOUBLE VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND LEFT;;;;
+2564;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND HORIZONTAL DOUBLE;;;;
+2565;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND HORIZONTAL SINGLE;;;;
+2566;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND HORIZONTAL;;;;
+2567;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND HORIZONTAL DOUBLE;;;;
+2568;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND HORIZONTAL SINGLE;;;;
+2569;BOX DRAWINGS DOUBLE UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE UP AND HORIZONTAL;;;;
+256A;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE;;;;
+256B;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE;;;;
+256C;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND HORIZONTAL;;;;
+256D;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND RIGHT;;;;
+256E;BOX DRAWINGS LIGHT ARC DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND LEFT;;;;
+256F;BOX DRAWINGS LIGHT ARC UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND LEFT;;;;
+2570;BOX DRAWINGS LIGHT ARC UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND RIGHT;;;;
+2571;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;;;;
+2572;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;;;;
+2573;BOX DRAWINGS LIGHT DIAGONAL CROSS;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL CROSS;;;;
+2574;BOX DRAWINGS LIGHT LEFT;So;0;ON;;;;;N;FORMS LIGHT LEFT;;;;
+2575;BOX DRAWINGS LIGHT UP;So;0;ON;;;;;N;FORMS LIGHT UP;;;;
+2576;BOX DRAWINGS LIGHT RIGHT;So;0;ON;;;;;N;FORMS LIGHT RIGHT;;;;
+2577;BOX DRAWINGS LIGHT DOWN;So;0;ON;;;;;N;FORMS LIGHT DOWN;;;;
+2578;BOX DRAWINGS HEAVY LEFT;So;0;ON;;;;;N;FORMS HEAVY LEFT;;;;
+2579;BOX DRAWINGS HEAVY UP;So;0;ON;;;;;N;FORMS HEAVY UP;;;;
+257A;BOX DRAWINGS HEAVY RIGHT;So;0;ON;;;;;N;FORMS HEAVY RIGHT;;;;
+257B;BOX DRAWINGS HEAVY DOWN;So;0;ON;;;;;N;FORMS HEAVY DOWN;;;;
+257C;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT;So;0;ON;;;;;N;FORMS LIGHT LEFT AND HEAVY RIGHT;;;;
+257D;BOX DRAWINGS LIGHT UP AND HEAVY DOWN;So;0;ON;;;;;N;FORMS LIGHT UP AND HEAVY DOWN;;;;
+257E;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT;So;0;ON;;;;;N;FORMS HEAVY LEFT AND LIGHT RIGHT;;;;
+257F;BOX DRAWINGS HEAVY UP AND LIGHT DOWN;So;0;ON;;;;;N;FORMS HEAVY UP AND LIGHT DOWN;;;;
+2580;UPPER HALF BLOCK;So;0;ON;;;;;N;;;;;
+2581;LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2582;LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;;
+2583;LOWER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+2584;LOWER HALF BLOCK;So;0;ON;;;;;N;;;;;
+2585;LOWER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+2586;LOWER THREE QUARTERS BLOCK;So;0;ON;;;;;N;LOWER THREE QUARTER BLOCK;;;;
+2587;LOWER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+2588;FULL BLOCK;So;0;ON;;;;;N;;;;;
+2589;LEFT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+258A;LEFT THREE QUARTERS BLOCK;So;0;ON;;;;;N;LEFT THREE QUARTER BLOCK;;;;
+258B;LEFT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+258C;LEFT HALF BLOCK;So;0;ON;;;;;N;;;;;
+258D;LEFT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+258E;LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;;
+258F;LEFT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2590;RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;;
+2591;LIGHT SHADE;So;0;ON;;;;;N;;;;;
+2592;MEDIUM SHADE;So;0;ON;;;;;N;;;;;
+2593;DARK SHADE;So;0;ON;;;;;N;;;;;
+2594;UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2595;RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2596;QUADRANT LOWER LEFT;So;0;ON;;;;;N;;;;;
+2597;QUADRANT LOWER RIGHT;So;0;ON;;;;;N;;;;;
+2598;QUADRANT UPPER LEFT;So;0;ON;;;;;N;;;;;
+2599;QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+259A;QUADRANT UPPER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+259B;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;;
+259C;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+259D;QUADRANT UPPER RIGHT;So;0;ON;;;;;N;;;;;
+259E;QUADRANT UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;;
+259F;QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+25A0;BLACK SQUARE;So;0;ON;;;;;N;;;;;
+25A1;WHITE SQUARE;So;0;ON;;;;;N;;;;;
+25A2;WHITE SQUARE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;;
+25A3;WHITE SQUARE CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;;
+25A4;SQUARE WITH HORIZONTAL FILL;So;0;ON;;;;;N;;;;;
+25A5;SQUARE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;;
+25A6;SQUARE WITH ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;;
+25A7;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;;
+25A8;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;;
+25A9;SQUARE WITH DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;;
+25AA;BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;;
+25AB;WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;;
+25AC;BLACK RECTANGLE;So;0;ON;;;;;N;;;;;
+25AD;WHITE RECTANGLE;So;0;ON;;;;;N;;;;;
+25AE;BLACK VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;;
+25AF;WHITE VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;;
+25B0;BLACK PARALLELOGRAM;So;0;ON;;;;;N;;;;;
+25B1;WHITE PARALLELOGRAM;So;0;ON;;;;;N;;;;;
+25B2;BLACK UP-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING TRIANGLE;;;;
+25B3;WHITE UP-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE;;;;
+25B4;BLACK UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING SMALL TRIANGLE;;;;
+25B5;WHITE UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING SMALL TRIANGLE;;;;
+25B6;BLACK RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING TRIANGLE;;;;
+25B7;WHITE RIGHT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE RIGHT POINTING TRIANGLE;;;;
+25B8;BLACK RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING SMALL TRIANGLE;;;;
+25B9;WHITE RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE RIGHT POINTING SMALL TRIANGLE;;;;
+25BA;BLACK RIGHT-POINTING POINTER;So;0;ON;;;;;N;BLACK RIGHT POINTING POINTER;;;;
+25BB;WHITE RIGHT-POINTING POINTER;So;0;ON;;;;;N;WHITE RIGHT POINTING POINTER;;;;
+25BC;BLACK DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING TRIANGLE;;;;
+25BD;WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING TRIANGLE;;;;
+25BE;BLACK DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING SMALL TRIANGLE;;;;
+25BF;WHITE DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING SMALL TRIANGLE;;;;
+25C0;BLACK LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING TRIANGLE;;;;
+25C1;WHITE LEFT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE LEFT POINTING TRIANGLE;;;;
+25C2;BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING SMALL TRIANGLE;;;;
+25C3;WHITE LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE LEFT POINTING SMALL TRIANGLE;;;;
+25C4;BLACK LEFT-POINTING POINTER;So;0;ON;;;;;N;BLACK LEFT POINTING POINTER;;;;
+25C5;WHITE LEFT-POINTING POINTER;So;0;ON;;;;;N;WHITE LEFT POINTING POINTER;;;;
+25C6;BLACK DIAMOND;So;0;ON;;;;;N;;;;;
+25C7;WHITE DIAMOND;So;0;ON;;;;;N;;;;;
+25C8;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;;
+25C9;FISHEYE;So;0;ON;;;;;N;;;;;
+25CA;LOZENGE;So;0;ON;;;;;N;;;;;
+25CB;WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25CC;DOTTED CIRCLE;So;0;ON;;;;;N;;;;;
+25CD;CIRCLE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;;
+25CE;BULLSEYE;So;0;ON;;;;;N;;;;;
+25CF;BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+25D0;CIRCLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+25D1;CIRCLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
+25D2;CIRCLE WITH LOWER HALF BLACK;So;0;ON;;;;;N;;;;;
+25D3;CIRCLE WITH UPPER HALF BLACK;So;0;ON;;;;;N;;;;;
+25D4;CIRCLE WITH UPPER RIGHT QUADRANT BLACK;So;0;ON;;;;;N;;;;;
+25D5;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK;So;0;ON;;;;;N;;;;;
+25D6;LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+25D7;RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+25D8;INVERSE BULLET;So;0;ON;;;;;N;;;;;
+25D9;INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25DA;UPPER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25DB;LOWER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25DC;UPPER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25DD;UPPER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25DE;LOWER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25DF;LOWER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25E0;UPPER HALF CIRCLE;So;0;ON;;;;;N;;;;;
+25E1;LOWER HALF CIRCLE;So;0;ON;;;;;N;;;;;
+25E2;BLACK LOWER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E3;BLACK LOWER LEFT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E4;BLACK UPPER LEFT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E5;BLACK UPPER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E6;WHITE BULLET;So;0;ON;;;;;N;;;;;
+25E7;SQUARE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+25E8;SQUARE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
+25E9;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+25EA;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+25EB;WHITE SQUARE WITH VERTICAL BISECTING LINE;So;0;ON;;;;;N;;;;;
+25EC;WHITE UP-POINTING TRIANGLE WITH DOT;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE WITH DOT;;;;
+25ED;UP-POINTING TRIANGLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH LEFT HALF BLACK;;;;
+25EE;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH RIGHT HALF BLACK;;;;
+25EF;LARGE CIRCLE;So;0;ON;;;;;N;;;;;
+25F0;WHITE SQUARE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F1;WHITE SQUARE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F2;WHITE SQUARE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F3;WHITE SQUARE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F4;WHITE CIRCLE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F5;WHITE CIRCLE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F6;WHITE CIRCLE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F7;WHITE CIRCLE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F8;UPPER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+25F9;UPPER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+25FA;LOWER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+25FB;WHITE MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;;
+25FC;BLACK MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;;
+25FD;WHITE MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;;
+25FE;BLACK MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;;
+25FF;LOWER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2600;BLACK SUN WITH RAYS;So;0;ON;;;;;N;;;;;
+2601;CLOUD;So;0;ON;;;;;N;;;;;
+2602;UMBRELLA;So;0;ON;;;;;N;;;;;
+2603;SNOWMAN;So;0;ON;;;;;N;;;;;
+2604;COMET;So;0;ON;;;;;N;;;;;
+2605;BLACK STAR;So;0;ON;;;;;N;;;;;
+2606;WHITE STAR;So;0;ON;;;;;N;;;;;
+2607;LIGHTNING;So;0;ON;;;;;N;;;;;
+2608;THUNDERSTORM;So;0;ON;;;;;N;;;;;
+2609;SUN;So;0;ON;;;;;N;;;;;
+260A;ASCENDING NODE;So;0;ON;;;;;N;;;;;
+260B;DESCENDING NODE;So;0;ON;;;;;N;;;;;
+260C;CONJUNCTION;So;0;ON;;;;;N;;;;;
+260D;OPPOSITION;So;0;ON;;;;;N;;;;;
+260E;BLACK TELEPHONE;So;0;ON;;;;;N;;;;;
+260F;WHITE TELEPHONE;So;0;ON;;;;;N;;;;;
+2610;BALLOT BOX;So;0;ON;;;;;N;;;;;
+2611;BALLOT BOX WITH CHECK;So;0;ON;;;;;N;;;;;
+2612;BALLOT BOX WITH X;So;0;ON;;;;;N;;;;;
+2613;SALTIRE;So;0;ON;;;;;N;;;;;
+2614;UMBRELLA WITH RAIN DROPS;So;0;ON;;;;;N;;;;;
+2615;HOT BEVERAGE;So;0;ON;;;;;N;;;;;
+2616;WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;;
+2617;BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;;
+2618;SHAMROCK;So;0;ON;;;;;N;;;;;
+2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;;
+261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261C;WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261D;WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;;
+261E;WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261F;WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;;
+2620;SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;;
+2621;CAUTION SIGN;So;0;ON;;;;;N;;;;;
+2622;RADIOACTIVE SIGN;So;0;ON;;;;;N;;;;;
+2623;BIOHAZARD SIGN;So;0;ON;;;;;N;;;;;
+2624;CADUCEUS;So;0;ON;;;;;N;;;;;
+2625;ANKH;So;0;ON;;;;;N;;;;;
+2626;ORTHODOX CROSS;So;0;ON;;;;;N;;;;;
+2627;CHI RHO;So;0;ON;;;;;N;;;;;
+2628;CROSS OF LORRAINE;So;0;ON;;;;;N;;;;;
+2629;CROSS OF JERUSALEM;So;0;ON;;;;;N;;;;;
+262A;STAR AND CRESCENT;So;0;ON;;;;;N;;;;;
+262B;FARSI SYMBOL;So;0;ON;;;;;N;SYMBOL OF IRAN;;;;
+262C;ADI SHAKTI;So;0;ON;;;;;N;;;;;
+262D;HAMMER AND SICKLE;So;0;ON;;;;;N;;;;;
+262E;PEACE SYMBOL;So;0;ON;;;;;N;;;;;
+262F;YIN YANG;So;0;ON;;;;;N;;;;;
+2630;TRIGRAM FOR HEAVEN;So;0;ON;;;;;N;;;;;
+2631;TRIGRAM FOR LAKE;So;0;ON;;;;;N;;;;;
+2632;TRIGRAM FOR FIRE;So;0;ON;;;;;N;;;;;
+2633;TRIGRAM FOR THUNDER;So;0;ON;;;;;N;;;;;
+2634;TRIGRAM FOR WIND;So;0;ON;;;;;N;;;;;
+2635;TRIGRAM FOR WATER;So;0;ON;;;;;N;;;;;
+2636;TRIGRAM FOR MOUNTAIN;So;0;ON;;;;;N;;;;;
+2637;TRIGRAM FOR EARTH;So;0;ON;;;;;N;;;;;
+2638;WHEEL OF DHARMA;So;0;ON;;;;;N;;;;;
+2639;WHITE FROWNING FACE;So;0;ON;;;;;N;;;;;
+263A;WHITE SMILING FACE;So;0;ON;;;;;N;;;;;
+263B;BLACK SMILING FACE;So;0;ON;;;;;N;;;;;
+263C;WHITE SUN WITH RAYS;So;0;ON;;;;;N;;;;;
+263D;FIRST QUARTER MOON;So;0;ON;;;;;N;;;;;
+263E;LAST QUARTER MOON;So;0;ON;;;;;N;;;;;
+263F;MERCURY;So;0;ON;;;;;N;;;;;
+2640;FEMALE SIGN;So;0;ON;;;;;N;;;;;
+2641;EARTH;So;0;ON;;;;;N;;;;;
+2642;MALE SIGN;So;0;ON;;;;;N;;;;;
+2643;JUPITER;So;0;ON;;;;;N;;;;;
+2644;SATURN;So;0;ON;;;;;N;;;;;
+2645;URANUS;So;0;ON;;;;;N;;;;;
+2646;NEPTUNE;So;0;ON;;;;;N;;;;;
+2647;PLUTO;So;0;ON;;;;;N;;;;;
+2648;ARIES;So;0;ON;;;;;N;;;;;
+2649;TAURUS;So;0;ON;;;;;N;;;;;
+264A;GEMINI;So;0;ON;;;;;N;;;;;
+264B;CANCER;So;0;ON;;;;;N;;;;;
+264C;LEO;So;0;ON;;;;;N;;;;;
+264D;VIRGO;So;0;ON;;;;;N;;;;;
+264E;LIBRA;So;0;ON;;;;;N;;;;;
+264F;SCORPIUS;So;0;ON;;;;;N;;;;;
+2650;SAGITTARIUS;So;0;ON;;;;;N;;;;;
+2651;CAPRICORN;So;0;ON;;;;;N;;;;;
+2652;AQUARIUS;So;0;ON;;;;;N;;;;;
+2653;PISCES;So;0;ON;;;;;N;;;;;
+2654;WHITE CHESS KING;So;0;ON;;;;;N;;;;;
+2655;WHITE CHESS QUEEN;So;0;ON;;;;;N;;;;;
+2656;WHITE CHESS ROOK;So;0;ON;;;;;N;;;;;
+2657;WHITE CHESS BISHOP;So;0;ON;;;;;N;;;;;
+2658;WHITE CHESS KNIGHT;So;0;ON;;;;;N;;;;;
+2659;WHITE CHESS PAWN;So;0;ON;;;;;N;;;;;
+265A;BLACK CHESS KING;So;0;ON;;;;;N;;;;;
+265B;BLACK CHESS QUEEN;So;0;ON;;;;;N;;;;;
+265C;BLACK CHESS ROOK;So;0;ON;;;;;N;;;;;
+265D;BLACK CHESS BISHOP;So;0;ON;;;;;N;;;;;
+265E;BLACK CHESS KNIGHT;So;0;ON;;;;;N;;;;;
+265F;BLACK CHESS PAWN;So;0;ON;;;;;N;;;;;
+2660;BLACK SPADE SUIT;So;0;ON;;;;;N;;;;;
+2661;WHITE HEART SUIT;So;0;ON;;;;;N;;;;;
+2662;WHITE DIAMOND SUIT;So;0;ON;;;;;N;;;;;
+2663;BLACK CLUB SUIT;So;0;ON;;;;;N;;;;;
+2664;WHITE SPADE SUIT;So;0;ON;;;;;N;;;;;
+2665;BLACK HEART SUIT;So;0;ON;;;;;N;;;;;
+2666;BLACK DIAMOND SUIT;So;0;ON;;;;;N;;;;;
+2667;WHITE CLUB SUIT;So;0;ON;;;;;N;;;;;
+2668;HOT SPRINGS;So;0;ON;;;;;N;;;;;
+2669;QUARTER NOTE;So;0;ON;;;;;N;;;;;
+266A;EIGHTH NOTE;So;0;ON;;;;;N;;;;;
+266B;BEAMED EIGHTH NOTES;So;0;ON;;;;;N;BARRED EIGHTH NOTES;;;;
+266C;BEAMED SIXTEENTH NOTES;So;0;ON;;;;;N;BARRED SIXTEENTH NOTES;;;;
+266D;MUSIC FLAT SIGN;So;0;ON;;;;;N;FLAT;;;;
+266E;MUSIC NATURAL SIGN;So;0;ON;;;;;N;NATURAL;;;;
+266F;MUSIC SHARP SIGN;Sm;0;ON;;;;;N;SHARP;;;;
+2670;WEST SYRIAC CROSS;So;0;ON;;;;;N;;;;;
+2671;EAST SYRIAC CROSS;So;0;ON;;;;;N;;;;;
+2672;UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;;
+2673;RECYCLING SYMBOL FOR TYPE-1 PLASTICS;So;0;ON;;;;;N;;;;;
+2674;RECYCLING SYMBOL FOR TYPE-2 PLASTICS;So;0;ON;;;;;N;;;;;
+2675;RECYCLING SYMBOL FOR TYPE-3 PLASTICS;So;0;ON;;;;;N;;;;;
+2676;RECYCLING SYMBOL FOR TYPE-4 PLASTICS;So;0;ON;;;;;N;;;;;
+2677;RECYCLING SYMBOL FOR TYPE-5 PLASTICS;So;0;ON;;;;;N;;;;;
+2678;RECYCLING SYMBOL FOR TYPE-6 PLASTICS;So;0;ON;;;;;N;;;;;
+2679;RECYCLING SYMBOL FOR TYPE-7 PLASTICS;So;0;ON;;;;;N;;;;;
+267A;RECYCLING SYMBOL FOR GENERIC MATERIALS;So;0;ON;;;;;N;;;;;
+267B;BLACK UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;;
+267C;RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;;
+267D;PARTIALLY-RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;;
+267E;PERMANENT PAPER SIGN;So;0;ON;;;;;N;;;;;
+267F;WHEELCHAIR SYMBOL;So;0;ON;;;;;N;;;;;
+2680;DIE FACE-1;So;0;ON;;;;;N;;;;;
+2681;DIE FACE-2;So;0;ON;;;;;N;;;;;
+2682;DIE FACE-3;So;0;ON;;;;;N;;;;;
+2683;DIE FACE-4;So;0;ON;;;;;N;;;;;
+2684;DIE FACE-5;So;0;ON;;;;;N;;;;;
+2685;DIE FACE-6;So;0;ON;;;;;N;;;;;
+2686;WHITE CIRCLE WITH DOT RIGHT;So;0;ON;;;;;N;;;;;
+2687;WHITE CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;;
+2688;BLACK CIRCLE WITH WHITE DOT RIGHT;So;0;ON;;;;;N;;;;;
+2689;BLACK CIRCLE WITH TWO WHITE DOTS;So;0;ON;;;;;N;;;;;
+268A;MONOGRAM FOR YANG;So;0;ON;;;;;N;;;;;
+268B;MONOGRAM FOR YIN;So;0;ON;;;;;N;;;;;
+268C;DIGRAM FOR GREATER YANG;So;0;ON;;;;;N;;;;;
+268D;DIGRAM FOR LESSER YIN;So;0;ON;;;;;N;;;;;
+268E;DIGRAM FOR LESSER YANG;So;0;ON;;;;;N;;;;;
+268F;DIGRAM FOR GREATER YIN;So;0;ON;;;;;N;;;;;
+2690;WHITE FLAG;So;0;ON;;;;;N;;;;;
+2691;BLACK FLAG;So;0;ON;;;;;N;;;;;
+2692;HAMMER AND PICK;So;0;ON;;;;;N;;;;;
+2693;ANCHOR;So;0;ON;;;;;N;;;;;
+2694;CROSSED SWORDS;So;0;ON;;;;;N;;;;;
+2695;STAFF OF AESCULAPIUS;So;0;ON;;;;;N;;;;;
+2696;SCALES;So;0;ON;;;;;N;;;;;
+2697;ALEMBIC;So;0;ON;;;;;N;;;;;
+2698;FLOWER;So;0;ON;;;;;N;;;;;
+2699;GEAR;So;0;ON;;;;;N;;;;;
+269A;STAFF OF HERMES;So;0;ON;;;;;N;;;;;
+269B;ATOM SYMBOL;So;0;ON;;;;;N;;;;;
+269C;FLEUR-DE-LIS;So;0;ON;;;;;N;;;;;
+269D;OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;;
+269E;THREE LINES CONVERGING RIGHT;So;0;ON;;;;;N;;;;;
+269F;THREE LINES CONVERGING LEFT;So;0;ON;;;;;N;;;;;
+26A0;WARNING SIGN;So;0;ON;;;;;N;;;;;
+26A1;HIGH VOLTAGE SIGN;So;0;ON;;;;;N;;;;;
+26A2;DOUBLED FEMALE SIGN;So;0;ON;;;;;N;;;;;
+26A3;DOUBLED MALE SIGN;So;0;ON;;;;;N;;;;;
+26A4;INTERLOCKED FEMALE AND MALE SIGN;So;0;ON;;;;;N;;;;;
+26A5;MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;;
+26A6;MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;;
+26A7;MALE WITH STROKE AND MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;;
+26A8;VERTICAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;;
+26A9;HORIZONTAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;;
+26AA;MEDIUM WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+26AB;MEDIUM BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+26AC;MEDIUM SMALL WHITE CIRCLE;So;0;L;;;;;N;;;;;
+26AD;MARRIAGE SYMBOL;So;0;ON;;;;;N;;;;;
+26AE;DIVORCE SYMBOL;So;0;ON;;;;;N;;;;;
+26AF;UNMARRIED PARTNERSHIP SYMBOL;So;0;ON;;;;;N;;;;;
+26B0;COFFIN;So;0;ON;;;;;N;;;;;
+26B1;FUNERAL URN;So;0;ON;;;;;N;;;;;
+26B2;NEUTER;So;0;ON;;;;;N;;;;;
+26B3;CERES;So;0;ON;;;;;N;;;;;
+26B4;PALLAS;So;0;ON;;;;;N;;;;;
+26B5;JUNO;So;0;ON;;;;;N;;;;;
+26B6;VESTA;So;0;ON;;;;;N;;;;;
+26B7;CHIRON;So;0;ON;;;;;N;;;;;
+26B8;BLACK MOON LILITH;So;0;ON;;;;;N;;;;;
+26B9;SEXTILE;So;0;ON;;;;;N;;;;;
+26BA;SEMISEXTILE;So;0;ON;;;;;N;;;;;
+26BB;QUINCUNX;So;0;ON;;;;;N;;;;;
+26BC;SESQUIQUADRATE;So;0;ON;;;;;N;;;;;
+26BD;SOCCER BALL;So;0;ON;;;;;N;;;;;
+26BE;BASEBALL;So;0;ON;;;;;N;;;;;
+26BF;SQUARED KEY;So;0;ON;;;;;N;;;;;
+26C0;WHITE DRAUGHTS MAN;So;0;ON;;;;;N;;;;;
+26C1;WHITE DRAUGHTS KING;So;0;ON;;;;;N;;;;;
+26C2;BLACK DRAUGHTS MAN;So;0;ON;;;;;N;;;;;
+26C3;BLACK DRAUGHTS KING;So;0;ON;;;;;N;;;;;
+26C4;SNOWMAN WITHOUT SNOW;So;0;ON;;;;;N;;;;;
+26C5;SUN BEHIND CLOUD;So;0;ON;;;;;N;;;;;
+26C6;RAIN;So;0;ON;;;;;N;;;;;
+26C7;BLACK SNOWMAN;So;0;ON;;;;;N;;;;;
+26C8;THUNDER CLOUD AND RAIN;So;0;ON;;;;;N;;;;;
+26C9;TURNED WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;;
+26CA;TURNED BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;;
+26CB;WHITE DIAMOND IN SQUARE;So;0;ON;;;;;N;;;;;
+26CC;CROSSING LANES;So;0;ON;;;;;N;;;;;
+26CD;DISABLED CAR;So;0;ON;;;;;N;;;;;
+26CE;OPHIUCHUS;So;0;ON;;;;;N;;;;;
+26CF;PICK;So;0;ON;;;;;N;;;;;
+26D0;CAR SLIDING;So;0;ON;;;;;N;;;;;
+26D1;HELMET WITH WHITE CROSS;So;0;ON;;;;;N;;;;;
+26D2;CIRCLED CROSSING LANES;So;0;ON;;;;;N;;;;;
+26D3;CHAINS;So;0;ON;;;;;N;;;;;
+26D4;NO ENTRY;So;0;ON;;;;;N;;;;;
+26D5;ALTERNATE ONE-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;;
+26D6;BLACK TWO-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;;
+26D7;WHITE TWO-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;;
+26D8;BLACK LEFT LANE MERGE;So;0;ON;;;;;N;;;;;
+26D9;WHITE LEFT LANE MERGE;So;0;ON;;;;;N;;;;;
+26DA;DRIVE SLOW SIGN;So;0;ON;;;;;N;;;;;
+26DB;HEAVY WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;;
+26DC;LEFT CLOSED ENTRY;So;0;ON;;;;;N;;;;;
+26DD;SQUARED SALTIRE;So;0;ON;;;;;N;;;;;
+26DE;FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE;So;0;ON;;;;;N;;;;;
+26DF;BLACK TRUCK;So;0;ON;;;;;N;;;;;
+26E0;RESTRICTED LEFT ENTRY-1;So;0;ON;;;;;N;;;;;
+26E1;RESTRICTED LEFT ENTRY-2;So;0;ON;;;;;N;;;;;
+26E2;ASTRONOMICAL SYMBOL FOR URANUS;So;0;ON;;;;;N;;;;;
+26E3;HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE;So;0;ON;;;;;N;;;;;
+26E4;PENTAGRAM;So;0;ON;;;;;N;;;;;
+26E5;RIGHT-HANDED INTERLACED PENTAGRAM;So;0;ON;;;;;N;;;;;
+26E6;LEFT-HANDED INTERLACED PENTAGRAM;So;0;ON;;;;;N;;;;;
+26E7;INVERTED PENTAGRAM;So;0;ON;;;;;N;;;;;
+26E8;BLACK CROSS ON SHIELD;So;0;ON;;;;;N;;;;;
+26E9;SHINTO SHRINE;So;0;ON;;;;;N;;;;;
+26EA;CHURCH;So;0;ON;;;;;N;;;;;
+26EB;CASTLE;So;0;ON;;;;;N;;;;;
+26EC;HISTORIC SITE;So;0;ON;;;;;N;;;;;
+26ED;GEAR WITHOUT HUB;So;0;ON;;;;;N;;;;;
+26EE;GEAR WITH HANDLES;So;0;ON;;;;;N;;;;;
+26EF;MAP SYMBOL FOR LIGHTHOUSE;So;0;ON;;;;;N;;;;;
+26F0;MOUNTAIN;So;0;ON;;;;;N;;;;;
+26F1;UMBRELLA ON GROUND;So;0;ON;;;;;N;;;;;
+26F2;FOUNTAIN;So;0;ON;;;;;N;;;;;
+26F3;FLAG IN HOLE;So;0;ON;;;;;N;;;;;
+26F4;FERRY;So;0;ON;;;;;N;;;;;
+26F5;SAILBOAT;So;0;ON;;;;;N;;;;;
+26F6;SQUARE FOUR CORNERS;So;0;ON;;;;;N;;;;;
+26F7;SKIER;So;0;ON;;;;;N;;;;;
+26F8;ICE SKATE;So;0;ON;;;;;N;;;;;
+26F9;PERSON WITH BALL;So;0;ON;;;;;N;;;;;
+26FA;TENT;So;0;ON;;;;;N;;;;;
+26FB;JAPANESE BANK SYMBOL;So;0;ON;;;;;N;;;;;
+26FC;HEADSTONE GRAVEYARD SYMBOL;So;0;ON;;;;;N;;;;;
+26FD;FUEL PUMP;So;0;ON;;;;;N;;;;;
+26FE;CUP ON BLACK SQUARE;So;0;ON;;;;;N;;;;;
+26FF;WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE;So;0;ON;;;;;N;;;;;
+2700;BLACK SAFETY SCISSORS;So;0;ON;;;;;N;;;;;
+2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;;
+2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;;
+2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;;
+2704;WHITE SCISSORS;So;0;ON;;;;;N;;;;;
+2705;WHITE HEAVY CHECK MARK;So;0;ON;;;;;N;;;;;
+2706;TELEPHONE LOCATION SIGN;So;0;ON;;;;;N;;;;;
+2707;TAPE DRIVE;So;0;ON;;;;;N;;;;;
+2708;AIRPLANE;So;0;ON;;;;;N;;;;;
+2709;ENVELOPE;So;0;ON;;;;;N;;;;;
+270A;RAISED FIST;So;0;ON;;;;;N;;;;;
+270B;RAISED HAND;So;0;ON;;;;;N;;;;;
+270C;VICTORY HAND;So;0;ON;;;;;N;;;;;
+270D;WRITING HAND;So;0;ON;;;;;N;;;;;
+270E;LOWER RIGHT PENCIL;So;0;ON;;;;;N;;;;;
+270F;PENCIL;So;0;ON;;;;;N;;;;;
+2710;UPPER RIGHT PENCIL;So;0;ON;;;;;N;;;;;
+2711;WHITE NIB;So;0;ON;;;;;N;;;;;
+2712;BLACK NIB;So;0;ON;;;;;N;;;;;
+2713;CHECK MARK;So;0;ON;;;;;N;;;;;
+2714;HEAVY CHECK MARK;So;0;ON;;;;;N;;;;;
+2715;MULTIPLICATION X;So;0;ON;;;;;N;;;;;
+2716;HEAVY MULTIPLICATION X;So;0;ON;;;;;N;;;;;
+2717;BALLOT X;So;0;ON;;;;;N;;;;;
+2718;HEAVY BALLOT X;So;0;ON;;;;;N;;;;;
+2719;OUTLINED GREEK CROSS;So;0;ON;;;;;N;;;;;
+271A;HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;;
+271B;OPEN CENTRE CROSS;So;0;ON;;;;;N;OPEN CENTER CROSS;;;;
+271C;HEAVY OPEN CENTRE CROSS;So;0;ON;;;;;N;HEAVY OPEN CENTER CROSS;;;;
+271D;LATIN CROSS;So;0;ON;;;;;N;;;;;
+271E;SHADOWED WHITE LATIN CROSS;So;0;ON;;;;;N;;;;;
+271F;OUTLINED LATIN CROSS;So;0;ON;;;;;N;;;;;
+2720;MALTESE CROSS;So;0;ON;;;;;N;;;;;
+2721;STAR OF DAVID;So;0;ON;;;;;N;;;;;
+2722;FOUR TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2723;FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2724;HEAVY FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2725;FOUR CLUB-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2726;BLACK FOUR POINTED STAR;So;0;ON;;;;;N;;;;;
+2727;WHITE FOUR POINTED STAR;So;0;ON;;;;;N;;;;;
+2728;SPARKLES;So;0;ON;;;;;N;;;;;
+2729;STRESS OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;;
+272A;CIRCLED WHITE STAR;So;0;ON;;;;;N;;;;;
+272B;OPEN CENTRE BLACK STAR;So;0;ON;;;;;N;OPEN CENTER BLACK STAR;;;;
+272C;BLACK CENTRE WHITE STAR;So;0;ON;;;;;N;BLACK CENTER WHITE STAR;;;;
+272D;OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;;
+272E;HEAVY OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;;
+272F;PINWHEEL STAR;So;0;ON;;;;;N;;;;;
+2730;SHADOWED WHITE STAR;So;0;ON;;;;;N;;;;;
+2731;HEAVY ASTERISK;So;0;ON;;;;;N;;;;;
+2732;OPEN CENTRE ASTERISK;So;0;ON;;;;;N;OPEN CENTER ASTERISK;;;;
+2733;EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2734;EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+2735;EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;;
+2736;SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+2737;EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;;
+2738;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;;
+2739;TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+273A;SIXTEEN POINTED ASTERISK;So;0;ON;;;;;N;;;;;
+273B;TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+273C;OPEN CENTRE TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;OPEN CENTER TEARDROP-SPOKED ASTERISK;;;;
+273D;HEAVY TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+273E;SIX PETALLED BLACK AND WHITE FLORETTE;So;0;ON;;;;;N;;;;;
+273F;BLACK FLORETTE;So;0;ON;;;;;N;;;;;
+2740;WHITE FLORETTE;So;0;ON;;;;;N;;;;;
+2741;EIGHT PETALLED OUTLINED BLACK FLORETTE;So;0;ON;;;;;N;;;;;
+2742;CIRCLED OPEN CENTRE EIGHT POINTED STAR;So;0;ON;;;;;N;CIRCLED OPEN CENTER EIGHT POINTED STAR;;;;
+2743;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK;So;0;ON;;;;;N;;;;;
+2744;SNOWFLAKE;So;0;ON;;;;;N;;;;;
+2745;TIGHT TRIFOLIATE SNOWFLAKE;So;0;ON;;;;;N;;;;;
+2746;HEAVY CHEVRON SNOWFLAKE;So;0;ON;;;;;N;;;;;
+2747;SPARKLE;So;0;ON;;;;;N;;;;;
+2748;HEAVY SPARKLE;So;0;ON;;;;;N;;;;;
+2749;BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+274A;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;;
+274B;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;;
+274C;CROSS MARK;So;0;ON;;;;;N;;;;;
+274D;SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+274E;NEGATIVE SQUARED CROSS MARK;So;0;ON;;;;;N;;;;;
+274F;LOWER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2750;UPPER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2751;LOWER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2752;UPPER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2753;BLACK QUESTION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2754;WHITE QUESTION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2755;WHITE EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2756;BLACK DIAMOND MINUS WHITE X;So;0;ON;;;;;N;;;;;
+2757;HEAVY EXCLAMATION MARK SYMBOL;So;0;ON;;;;;N;;;;;
+2758;LIGHT VERTICAL BAR;So;0;ON;;;;;N;;;;;
+2759;MEDIUM VERTICAL BAR;So;0;ON;;;;;N;;;;;
+275A;HEAVY VERTICAL BAR;So;0;ON;;;;;N;;;;;
+275B;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+275C;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+275D;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+275E;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+275F;HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2760;HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2761;CURVED STEM PARAGRAPH SIGN ORNAMENT;So;0;ON;;;;;N;;;;;
+2762;HEAVY EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2763;HEAVY HEART EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2764;HEAVY BLACK HEART;So;0;ON;;;;;N;;;;;
+2765;ROTATED HEAVY BLACK HEART BULLET;So;0;ON;;;;;N;;;;;
+2766;FLORAL HEART;So;0;ON;;;;;N;;;;;
+2767;ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;;
+2768;MEDIUM LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2769;MEDIUM RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+276A;MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+276B;MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+276C;MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+276D;MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+276E;HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+276F;HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2770;HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2771;HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2772;LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2773;LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2774;MEDIUM LEFT CURLY BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2775;MEDIUM RIGHT CURLY BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2776;DINGBAT NEGATIVE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED DIGIT ONE;;;;
+2777;DINGBAT NEGATIVE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED DIGIT TWO;;;;
+2778;DINGBAT NEGATIVE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED DIGIT THREE;;;;
+2779;DINGBAT NEGATIVE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED DIGIT FOUR;;;;
+277A;DINGBAT NEGATIVE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED DIGIT FIVE;;;;
+277B;DINGBAT NEGATIVE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED DIGIT SIX;;;;
+277C;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED DIGIT SEVEN;;;;
+277D;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED DIGIT EIGHT;;;;
+277E;DINGBAT NEGATIVE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED DIGIT NINE;;;;
+277F;DINGBAT NEGATIVE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED NUMBER TEN;;;;
+2780;DINGBAT CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;CIRCLED SANS-SERIF DIGIT ONE;;;;
+2781;DINGBAT CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;CIRCLED SANS-SERIF DIGIT TWO;;;;
+2782;DINGBAT CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;CIRCLED SANS-SERIF DIGIT THREE;;;;
+2783;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;CIRCLED SANS-SERIF DIGIT FOUR;;;;
+2784;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;CIRCLED SANS-SERIF DIGIT FIVE;;;;
+2785;DINGBAT CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;CIRCLED SANS-SERIF DIGIT SIX;;;;
+2786;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;CIRCLED SANS-SERIF DIGIT SEVEN;;;;
+2787;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;CIRCLED SANS-SERIF DIGIT EIGHT;;;;
+2788;DINGBAT CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;CIRCLED SANS-SERIF DIGIT NINE;;;;
+2789;DINGBAT CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;CIRCLED SANS-SERIF NUMBER TEN;;;;
+278A;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED SANS-SERIF DIGIT ONE;;;;
+278B;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED SANS-SERIF DIGIT TWO;;;;
+278C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED SANS-SERIF DIGIT THREE;;;;
+278D;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED SANS-SERIF DIGIT FOUR;;;;
+278E;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED SANS-SERIF DIGIT FIVE;;;;
+278F;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED SANS-SERIF DIGIT SIX;;;;
+2790;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED SANS-SERIF DIGIT SEVEN;;;;
+2791;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED SANS-SERIF DIGIT EIGHT;;;;
+2792;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED SANS-SERIF DIGIT NINE;;;;
+2793;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED SANS-SERIF NUMBER TEN;;;;
+2794;HEAVY WIDE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WIDE-HEADED RIGHT ARROW;;;;
+2795;HEAVY PLUS SIGN;So;0;ON;;;;;N;;;;;
+2796;HEAVY MINUS SIGN;So;0;ON;;;;;N;;;;;
+2797;HEAVY DIVISION SIGN;So;0;ON;;;;;N;;;;;
+2798;HEAVY SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT ARROW;;;;
+2799;HEAVY RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY RIGHT ARROW;;;;
+279A;HEAVY NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT ARROW;;;;
+279B;DRAFTING POINT RIGHTWARDS ARROW;So;0;ON;;;;;N;DRAFTING POINT RIGHT ARROW;;;;
+279C;HEAVY ROUND-TIPPED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY ROUND-TIPPED RIGHT ARROW;;;;
+279D;TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;TRIANGLE-HEADED RIGHT ARROW;;;;
+279E;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TRIANGLE-HEADED RIGHT ARROW;;;;
+279F;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;DASHED TRIANGLE-HEADED RIGHT ARROW;;;;
+27A0;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW;;;;
+27A1;BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK RIGHT ARROW;;;;
+27A2;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D TOP-LIGHTED RIGHT ARROWHEAD;;;;
+27A3;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD;;;;
+27A4;BLACK RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;BLACK RIGHT ARROWHEAD;;;;
+27A5;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED DOWN AND RIGHT ARROW;;;;
+27A6;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED UP AND RIGHT ARROW;;;;
+27A7;SQUAT BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;SQUAT BLACK RIGHT ARROW;;;;
+27A8;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY CONCAVE-POINTED BLACK RIGHT ARROW;;;;
+27A9;RIGHT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;RIGHT-SHADED WHITE RIGHT ARROW;;;;
+27AA;LEFT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT-SHADED WHITE RIGHT ARROW;;;;
+27AB;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;BACK-TILTED SHADOWED WHITE RIGHT ARROW;;;;
+27AC;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;FRONT-TILTED SHADOWED WHITE RIGHT ARROW;;;;
+27AD;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27AE;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27AF;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27B0;CURLY LOOP;So;0;ON;;;;;N;;;;;
+27B1;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27B2;CIRCLED HEAVY WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;CIRCLED HEAVY WHITE RIGHT ARROW;;;;
+27B3;WHITE-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;WHITE-FEATHERED RIGHT ARROW;;;;
+27B4;BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED LOWER RIGHT ARROW;;;;
+27B5;BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK-FEATHERED RIGHT ARROW;;;;
+27B6;BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED UPPER RIGHT ARROW;;;;
+27B7;HEAVY BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED LOWER RIGHT ARROW;;;;
+27B8;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED RIGHT ARROW;;;;
+27B9;HEAVY BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED UPPER RIGHT ARROW;;;;
+27BA;TEARDROP-BARBED RIGHTWARDS ARROW;So;0;ON;;;;;N;TEARDROP-BARBED RIGHT ARROW;;;;
+27BB;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TEARDROP-SHANKED RIGHT ARROW;;;;
+27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;;
+27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;;
+27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;;
+27BF;DOUBLE CURLY LOOP;So;0;ON;;;;;N;;;;;
+27C0;THREE DIMENSIONAL ANGLE;Sm;0;ON;;;;;Y;;;;;
+27C1;WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE;Sm;0;ON;;;;;N;;;;;
+27C2;PERPENDICULAR;Sm;0;ON;;;;;N;;;;;
+27C3;OPEN SUBSET;Sm;0;ON;;;;;Y;;;;;
+27C4;OPEN SUPERSET;Sm;0;ON;;;;;Y;;;;;
+27C5;LEFT S-SHAPED BAG DELIMITER;Ps;0;ON;;;;;Y;;;;;
+27C6;RIGHT S-SHAPED BAG DELIMITER;Pe;0;ON;;;;;Y;;;;;
+27C7;OR WITH DOT INSIDE;Sm;0;ON;;;;;N;;;;;
+27C8;REVERSE SOLIDUS PRECEDING SUBSET;Sm;0;ON;;;;;Y;;;;;
+27C9;SUPERSET PRECEDING SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+27CA;VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+27CB;MATHEMATICAL RISING DIAGONAL;Sm;0;ON;;;;;Y;;;;;
+27CC;LONG DIVISION;Sm;0;ON;;;;;Y;;;;;
+27CD;MATHEMATICAL FALLING DIAGONAL;Sm;0;ON;;;;;Y;;;;;
+27CE;SQUARED LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+27CF;SQUARED LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+27D0;WHITE DIAMOND WITH CENTRED DOT;Sm;0;ON;;;;;N;;;;;
+27D1;AND WITH DOT;Sm;0;ON;;;;;N;;;;;
+27D2;ELEMENT OF OPENING UPWARDS;Sm;0;ON;;;;;N;;;;;
+27D3;LOWER RIGHT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;;
+27D4;UPPER LEFT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;;
+27D5;LEFT OUTER JOIN;Sm;0;ON;;;;;Y;;;;;
+27D6;RIGHT OUTER JOIN;Sm;0;ON;;;;;Y;;;;;
+27D7;FULL OUTER JOIN;Sm;0;ON;;;;;N;;;;;
+27D8;LARGE UP TACK;Sm;0;ON;;;;;N;;;;;
+27D9;LARGE DOWN TACK;Sm;0;ON;;;;;N;;;;;
+27DA;LEFT AND RIGHT DOUBLE TURNSTILE;Sm;0;ON;;;;;N;;;;;
+27DB;LEFT AND RIGHT TACK;Sm;0;ON;;;;;N;;;;;
+27DC;LEFT MULTIMAP;Sm;0;ON;;;;;Y;;;;;
+27DD;LONG RIGHT TACK;Sm;0;ON;;;;;Y;;;;;
+27DE;LONG LEFT TACK;Sm;0;ON;;;;;Y;;;;;
+27DF;UP TACK WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+27E0;LOZENGE DIVIDED BY HORIZONTAL RULE;Sm;0;ON;;;;;N;;;;;
+27E1;WHITE CONCAVE-SIDED DIAMOND;Sm;0;ON;;;;;N;;;;;
+27E2;WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E3;WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E4;WHITE SQUARE WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E5;WHITE SQUARE WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E6;MATHEMATICAL LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;;;;;
+27E7;MATHEMATICAL RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;;;;;
+27E8;MATHEMATICAL LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;;
+27E9;MATHEMATICAL RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;;
+27EA;MATHEMATICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;;
+27EB;MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;;
+27EC;MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;;
+27ED;MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;;
+27EE;MATHEMATICAL LEFT FLATTENED PARENTHESIS;Ps;0;ON;;;;;Y;;;;;
+27EF;MATHEMATICAL RIGHT FLATTENED PARENTHESIS;Pe;0;ON;;;;;Y;;;;;
+27F0;UPWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F1;DOWNWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F2;ANTICLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F3;CLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F4;RIGHT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;;
+27F5;LONG LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+27F6;LONG RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+27F7;LONG LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;;
+27F8;LONG LEFTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F9;LONG RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+27FA;LONG LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+27FB;LONG LEFTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FC;LONG RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FD;LONG LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FE;LONG RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FF;LONG RIGHTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;;
+2800;BRAILLE PATTERN BLANK;So;0;L;;;;;N;;;;;
+2801;BRAILLE PATTERN DOTS-1;So;0;L;;;;;N;;;;;
+2802;BRAILLE PATTERN DOTS-2;So;0;L;;;;;N;;;;;
+2803;BRAILLE PATTERN DOTS-12;So;0;L;;;;;N;;;;;
+2804;BRAILLE PATTERN DOTS-3;So;0;L;;;;;N;;;;;
+2805;BRAILLE PATTERN DOTS-13;So;0;L;;;;;N;;;;;
+2806;BRAILLE PATTERN DOTS-23;So;0;L;;;;;N;;;;;
+2807;BRAILLE PATTERN DOTS-123;So;0;L;;;;;N;;;;;
+2808;BRAILLE PATTERN DOTS-4;So;0;L;;;;;N;;;;;
+2809;BRAILLE PATTERN DOTS-14;So;0;L;;;;;N;;;;;
+280A;BRAILLE PATTERN DOTS-24;So;0;L;;;;;N;;;;;
+280B;BRAILLE PATTERN DOTS-124;So;0;L;;;;;N;;;;;
+280C;BRAILLE PATTERN DOTS-34;So;0;L;;;;;N;;;;;
+280D;BRAILLE PATTERN DOTS-134;So;0;L;;;;;N;;;;;
+280E;BRAILLE PATTERN DOTS-234;So;0;L;;;;;N;;;;;
+280F;BRAILLE PATTERN DOTS-1234;So;0;L;;;;;N;;;;;
+2810;BRAILLE PATTERN DOTS-5;So;0;L;;;;;N;;;;;
+2811;BRAILLE PATTERN DOTS-15;So;0;L;;;;;N;;;;;
+2812;BRAILLE PATTERN DOTS-25;So;0;L;;;;;N;;;;;
+2813;BRAILLE PATTERN DOTS-125;So;0;L;;;;;N;;;;;
+2814;BRAILLE PATTERN DOTS-35;So;0;L;;;;;N;;;;;
+2815;BRAILLE PATTERN DOTS-135;So;0;L;;;;;N;;;;;
+2816;BRAILLE PATTERN DOTS-235;So;0;L;;;;;N;;;;;
+2817;BRAILLE PATTERN DOTS-1235;So;0;L;;;;;N;;;;;
+2818;BRAILLE PATTERN DOTS-45;So;0;L;;;;;N;;;;;
+2819;BRAILLE PATTERN DOTS-145;So;0;L;;;;;N;;;;;
+281A;BRAILLE PATTERN DOTS-245;So;0;L;;;;;N;;;;;
+281B;BRAILLE PATTERN DOTS-1245;So;0;L;;;;;N;;;;;
+281C;BRAILLE PATTERN DOTS-345;So;0;L;;;;;N;;;;;
+281D;BRAILLE PATTERN DOTS-1345;So;0;L;;;;;N;;;;;
+281E;BRAILLE PATTERN DOTS-2345;So;0;L;;;;;N;;;;;
+281F;BRAILLE PATTERN DOTS-12345;So;0;L;;;;;N;;;;;
+2820;BRAILLE PATTERN DOTS-6;So;0;L;;;;;N;;;;;
+2821;BRAILLE PATTERN DOTS-16;So;0;L;;;;;N;;;;;
+2822;BRAILLE PATTERN DOTS-26;So;0;L;;;;;N;;;;;
+2823;BRAILLE PATTERN DOTS-126;So;0;L;;;;;N;;;;;
+2824;BRAILLE PATTERN DOTS-36;So;0;L;;;;;N;;;;;
+2825;BRAILLE PATTERN DOTS-136;So;0;L;;;;;N;;;;;
+2826;BRAILLE PATTERN DOTS-236;So;0;L;;;;;N;;;;;
+2827;BRAILLE PATTERN DOTS-1236;So;0;L;;;;;N;;;;;
+2828;BRAILLE PATTERN DOTS-46;So;0;L;;;;;N;;;;;
+2829;BRAILLE PATTERN DOTS-146;So;0;L;;;;;N;;;;;
+282A;BRAILLE PATTERN DOTS-246;So;0;L;;;;;N;;;;;
+282B;BRAILLE PATTERN DOTS-1246;So;0;L;;;;;N;;;;;
+282C;BRAILLE PATTERN DOTS-346;So;0;L;;;;;N;;;;;
+282D;BRAILLE PATTERN DOTS-1346;So;0;L;;;;;N;;;;;
+282E;BRAILLE PATTERN DOTS-2346;So;0;L;;;;;N;;;;;
+282F;BRAILLE PATTERN DOTS-12346;So;0;L;;;;;N;;;;;
+2830;BRAILLE PATTERN DOTS-56;So;0;L;;;;;N;;;;;
+2831;BRAILLE PATTERN DOTS-156;So;0;L;;;;;N;;;;;
+2832;BRAILLE PATTERN DOTS-256;So;0;L;;;;;N;;;;;
+2833;BRAILLE PATTERN DOTS-1256;So;0;L;;;;;N;;;;;
+2834;BRAILLE PATTERN DOTS-356;So;0;L;;;;;N;;;;;
+2835;BRAILLE PATTERN DOTS-1356;So;0;L;;;;;N;;;;;
+2836;BRAILLE PATTERN DOTS-2356;So;0;L;;;;;N;;;;;
+2837;BRAILLE PATTERN DOTS-12356;So;0;L;;;;;N;;;;;
+2838;BRAILLE PATTERN DOTS-456;So;0;L;;;;;N;;;;;
+2839;BRAILLE PATTERN DOTS-1456;So;0;L;;;;;N;;;;;
+283A;BRAILLE PATTERN DOTS-2456;So;0;L;;;;;N;;;;;
+283B;BRAILLE PATTERN DOTS-12456;So;0;L;;;;;N;;;;;
+283C;BRAILLE PATTERN DOTS-3456;So;0;L;;;;;N;;;;;
+283D;BRAILLE PATTERN DOTS-13456;So;0;L;;;;;N;;;;;
+283E;BRAILLE PATTERN DOTS-23456;So;0;L;;;;;N;;;;;
+283F;BRAILLE PATTERN DOTS-123456;So;0;L;;;;;N;;;;;
+2840;BRAILLE PATTERN DOTS-7;So;0;L;;;;;N;;;;;
+2841;BRAILLE PATTERN DOTS-17;So;0;L;;;;;N;;;;;
+2842;BRAILLE PATTERN DOTS-27;So;0;L;;;;;N;;;;;
+2843;BRAILLE PATTERN DOTS-127;So;0;L;;;;;N;;;;;
+2844;BRAILLE PATTERN DOTS-37;So;0;L;;;;;N;;;;;
+2845;BRAILLE PATTERN DOTS-137;So;0;L;;;;;N;;;;;
+2846;BRAILLE PATTERN DOTS-237;So;0;L;;;;;N;;;;;
+2847;BRAILLE PATTERN DOTS-1237;So;0;L;;;;;N;;;;;
+2848;BRAILLE PATTERN DOTS-47;So;0;L;;;;;N;;;;;
+2849;BRAILLE PATTERN DOTS-147;So;0;L;;;;;N;;;;;
+284A;BRAILLE PATTERN DOTS-247;So;0;L;;;;;N;;;;;
+284B;BRAILLE PATTERN DOTS-1247;So;0;L;;;;;N;;;;;
+284C;BRAILLE PATTERN DOTS-347;So;0;L;;;;;N;;;;;
+284D;BRAILLE PATTERN DOTS-1347;So;0;L;;;;;N;;;;;
+284E;BRAILLE PATTERN DOTS-2347;So;0;L;;;;;N;;;;;
+284F;BRAILLE PATTERN DOTS-12347;So;0;L;;;;;N;;;;;
+2850;BRAILLE PATTERN DOTS-57;So;0;L;;;;;N;;;;;
+2851;BRAILLE PATTERN DOTS-157;So;0;L;;;;;N;;;;;
+2852;BRAILLE PATTERN DOTS-257;So;0;L;;;;;N;;;;;
+2853;BRAILLE PATTERN DOTS-1257;So;0;L;;;;;N;;;;;
+2854;BRAILLE PATTERN DOTS-357;So;0;L;;;;;N;;;;;
+2855;BRAILLE PATTERN DOTS-1357;So;0;L;;;;;N;;;;;
+2856;BRAILLE PATTERN DOTS-2357;So;0;L;;;;;N;;;;;
+2857;BRAILLE PATTERN DOTS-12357;So;0;L;;;;;N;;;;;
+2858;BRAILLE PATTERN DOTS-457;So;0;L;;;;;N;;;;;
+2859;BRAILLE PATTERN DOTS-1457;So;0;L;;;;;N;;;;;
+285A;BRAILLE PATTERN DOTS-2457;So;0;L;;;;;N;;;;;
+285B;BRAILLE PATTERN DOTS-12457;So;0;L;;;;;N;;;;;
+285C;BRAILLE PATTERN DOTS-3457;So;0;L;;;;;N;;;;;
+285D;BRAILLE PATTERN DOTS-13457;So;0;L;;;;;N;;;;;
+285E;BRAILLE PATTERN DOTS-23457;So;0;L;;;;;N;;;;;
+285F;BRAILLE PATTERN DOTS-123457;So;0;L;;;;;N;;;;;
+2860;BRAILLE PATTERN DOTS-67;So;0;L;;;;;N;;;;;
+2861;BRAILLE PATTERN DOTS-167;So;0;L;;;;;N;;;;;
+2862;BRAILLE PATTERN DOTS-267;So;0;L;;;;;N;;;;;
+2863;BRAILLE PATTERN DOTS-1267;So;0;L;;;;;N;;;;;
+2864;BRAILLE PATTERN DOTS-367;So;0;L;;;;;N;;;;;
+2865;BRAILLE PATTERN DOTS-1367;So;0;L;;;;;N;;;;;
+2866;BRAILLE PATTERN DOTS-2367;So;0;L;;;;;N;;;;;
+2867;BRAILLE PATTERN DOTS-12367;So;0;L;;;;;N;;;;;
+2868;BRAILLE PATTERN DOTS-467;So;0;L;;;;;N;;;;;
+2869;BRAILLE PATTERN DOTS-1467;So;0;L;;;;;N;;;;;
+286A;BRAILLE PATTERN DOTS-2467;So;0;L;;;;;N;;;;;
+286B;BRAILLE PATTERN DOTS-12467;So;0;L;;;;;N;;;;;
+286C;BRAILLE PATTERN DOTS-3467;So;0;L;;;;;N;;;;;
+286D;BRAILLE PATTERN DOTS-13467;So;0;L;;;;;N;;;;;
+286E;BRAILLE PATTERN DOTS-23467;So;0;L;;;;;N;;;;;
+286F;BRAILLE PATTERN DOTS-123467;So;0;L;;;;;N;;;;;
+2870;BRAILLE PATTERN DOTS-567;So;0;L;;;;;N;;;;;
+2871;BRAILLE PATTERN DOTS-1567;So;0;L;;;;;N;;;;;
+2872;BRAILLE PATTERN DOTS-2567;So;0;L;;;;;N;;;;;
+2873;BRAILLE PATTERN DOTS-12567;So;0;L;;;;;N;;;;;
+2874;BRAILLE PATTERN DOTS-3567;So;0;L;;;;;N;;;;;
+2875;BRAILLE PATTERN DOTS-13567;So;0;L;;;;;N;;;;;
+2876;BRAILLE PATTERN DOTS-23567;So;0;L;;;;;N;;;;;
+2877;BRAILLE PATTERN DOTS-123567;So;0;L;;;;;N;;;;;
+2878;BRAILLE PATTERN DOTS-4567;So;0;L;;;;;N;;;;;
+2879;BRAILLE PATTERN DOTS-14567;So;0;L;;;;;N;;;;;
+287A;BRAILLE PATTERN DOTS-24567;So;0;L;;;;;N;;;;;
+287B;BRAILLE PATTERN DOTS-124567;So;0;L;;;;;N;;;;;
+287C;BRAILLE PATTERN DOTS-34567;So;0;L;;;;;N;;;;;
+287D;BRAILLE PATTERN DOTS-134567;So;0;L;;;;;N;;;;;
+287E;BRAILLE PATTERN DOTS-234567;So;0;L;;;;;N;;;;;
+287F;BRAILLE PATTERN DOTS-1234567;So;0;L;;;;;N;;;;;
+2880;BRAILLE PATTERN DOTS-8;So;0;L;;;;;N;;;;;
+2881;BRAILLE PATTERN DOTS-18;So;0;L;;;;;N;;;;;
+2882;BRAILLE PATTERN DOTS-28;So;0;L;;;;;N;;;;;
+2883;BRAILLE PATTERN DOTS-128;So;0;L;;;;;N;;;;;
+2884;BRAILLE PATTERN DOTS-38;So;0;L;;;;;N;;;;;
+2885;BRAILLE PATTERN DOTS-138;So;0;L;;;;;N;;;;;
+2886;BRAILLE PATTERN DOTS-238;So;0;L;;;;;N;;;;;
+2887;BRAILLE PATTERN DOTS-1238;So;0;L;;;;;N;;;;;
+2888;BRAILLE PATTERN DOTS-48;So;0;L;;;;;N;;;;;
+2889;BRAILLE PATTERN DOTS-148;So;0;L;;;;;N;;;;;
+288A;BRAILLE PATTERN DOTS-248;So;0;L;;;;;N;;;;;
+288B;BRAILLE PATTERN DOTS-1248;So;0;L;;;;;N;;;;;
+288C;BRAILLE PATTERN DOTS-348;So;0;L;;;;;N;;;;;
+288D;BRAILLE PATTERN DOTS-1348;So;0;L;;;;;N;;;;;
+288E;BRAILLE PATTERN DOTS-2348;So;0;L;;;;;N;;;;;
+288F;BRAILLE PATTERN DOTS-12348;So;0;L;;;;;N;;;;;
+2890;BRAILLE PATTERN DOTS-58;So;0;L;;;;;N;;;;;
+2891;BRAILLE PATTERN DOTS-158;So;0;L;;;;;N;;;;;
+2892;BRAILLE PATTERN DOTS-258;So;0;L;;;;;N;;;;;
+2893;BRAILLE PATTERN DOTS-1258;So;0;L;;;;;N;;;;;
+2894;BRAILLE PATTERN DOTS-358;So;0;L;;;;;N;;;;;
+2895;BRAILLE PATTERN DOTS-1358;So;0;L;;;;;N;;;;;
+2896;BRAILLE PATTERN DOTS-2358;So;0;L;;;;;N;;;;;
+2897;BRAILLE PATTERN DOTS-12358;So;0;L;;;;;N;;;;;
+2898;BRAILLE PATTERN DOTS-458;So;0;L;;;;;N;;;;;
+2899;BRAILLE PATTERN DOTS-1458;So;0;L;;;;;N;;;;;
+289A;BRAILLE PATTERN DOTS-2458;So;0;L;;;;;N;;;;;
+289B;BRAILLE PATTERN DOTS-12458;So;0;L;;;;;N;;;;;
+289C;BRAILLE PATTERN DOTS-3458;So;0;L;;;;;N;;;;;
+289D;BRAILLE PATTERN DOTS-13458;So;0;L;;;;;N;;;;;
+289E;BRAILLE PATTERN DOTS-23458;So;0;L;;;;;N;;;;;
+289F;BRAILLE PATTERN DOTS-123458;So;0;L;;;;;N;;;;;
+28A0;BRAILLE PATTERN DOTS-68;So;0;L;;;;;N;;;;;
+28A1;BRAILLE PATTERN DOTS-168;So;0;L;;;;;N;;;;;
+28A2;BRAILLE PATTERN DOTS-268;So;0;L;;;;;N;;;;;
+28A3;BRAILLE PATTERN DOTS-1268;So;0;L;;;;;N;;;;;
+28A4;BRAILLE PATTERN DOTS-368;So;0;L;;;;;N;;;;;
+28A5;BRAILLE PATTERN DOTS-1368;So;0;L;;;;;N;;;;;
+28A6;BRAILLE PATTERN DOTS-2368;So;0;L;;;;;N;;;;;
+28A7;BRAILLE PATTERN DOTS-12368;So;0;L;;;;;N;;;;;
+28A8;BRAILLE PATTERN DOTS-468;So;0;L;;;;;N;;;;;
+28A9;BRAILLE PATTERN DOTS-1468;So;0;L;;;;;N;;;;;
+28AA;BRAILLE PATTERN DOTS-2468;So;0;L;;;;;N;;;;;
+28AB;BRAILLE PATTERN DOTS-12468;So;0;L;;;;;N;;;;;
+28AC;BRAILLE PATTERN DOTS-3468;So;0;L;;;;;N;;;;;
+28AD;BRAILLE PATTERN DOTS-13468;So;0;L;;;;;N;;;;;
+28AE;BRAILLE PATTERN DOTS-23468;So;0;L;;;;;N;;;;;
+28AF;BRAILLE PATTERN DOTS-123468;So;0;L;;;;;N;;;;;
+28B0;BRAILLE PATTERN DOTS-568;So;0;L;;;;;N;;;;;
+28B1;BRAILLE PATTERN DOTS-1568;So;0;L;;;;;N;;;;;
+28B2;BRAILLE PATTERN DOTS-2568;So;0;L;;;;;N;;;;;
+28B3;BRAILLE PATTERN DOTS-12568;So;0;L;;;;;N;;;;;
+28B4;BRAILLE PATTERN DOTS-3568;So;0;L;;;;;N;;;;;
+28B5;BRAILLE PATTERN DOTS-13568;So;0;L;;;;;N;;;;;
+28B6;BRAILLE PATTERN DOTS-23568;So;0;L;;;;;N;;;;;
+28B7;BRAILLE PATTERN DOTS-123568;So;0;L;;;;;N;;;;;
+28B8;BRAILLE PATTERN DOTS-4568;So;0;L;;;;;N;;;;;
+28B9;BRAILLE PATTERN DOTS-14568;So;0;L;;;;;N;;;;;
+28BA;BRAILLE PATTERN DOTS-24568;So;0;L;;;;;N;;;;;
+28BB;BRAILLE PATTERN DOTS-124568;So;0;L;;;;;N;;;;;
+28BC;BRAILLE PATTERN DOTS-34568;So;0;L;;;;;N;;;;;
+28BD;BRAILLE PATTERN DOTS-134568;So;0;L;;;;;N;;;;;
+28BE;BRAILLE PATTERN DOTS-234568;So;0;L;;;;;N;;;;;
+28BF;BRAILLE PATTERN DOTS-1234568;So;0;L;;;;;N;;;;;
+28C0;BRAILLE PATTERN DOTS-78;So;0;L;;;;;N;;;;;
+28C1;BRAILLE PATTERN DOTS-178;So;0;L;;;;;N;;;;;
+28C2;BRAILLE PATTERN DOTS-278;So;0;L;;;;;N;;;;;
+28C3;BRAILLE PATTERN DOTS-1278;So;0;L;;;;;N;;;;;
+28C4;BRAILLE PATTERN DOTS-378;So;0;L;;;;;N;;;;;
+28C5;BRAILLE PATTERN DOTS-1378;So;0;L;;;;;N;;;;;
+28C6;BRAILLE PATTERN DOTS-2378;So;0;L;;;;;N;;;;;
+28C7;BRAILLE PATTERN DOTS-12378;So;0;L;;;;;N;;;;;
+28C8;BRAILLE PATTERN DOTS-478;So;0;L;;;;;N;;;;;
+28C9;BRAILLE PATTERN DOTS-1478;So;0;L;;;;;N;;;;;
+28CA;BRAILLE PATTERN DOTS-2478;So;0;L;;;;;N;;;;;
+28CB;BRAILLE PATTERN DOTS-12478;So;0;L;;;;;N;;;;;
+28CC;BRAILLE PATTERN DOTS-3478;So;0;L;;;;;N;;;;;
+28CD;BRAILLE PATTERN DOTS-13478;So;0;L;;;;;N;;;;;
+28CE;BRAILLE PATTERN DOTS-23478;So;0;L;;;;;N;;;;;
+28CF;BRAILLE PATTERN DOTS-123478;So;0;L;;;;;N;;;;;
+28D0;BRAILLE PATTERN DOTS-578;So;0;L;;;;;N;;;;;
+28D1;BRAILLE PATTERN DOTS-1578;So;0;L;;;;;N;;;;;
+28D2;BRAILLE PATTERN DOTS-2578;So;0;L;;;;;N;;;;;
+28D3;BRAILLE PATTERN DOTS-12578;So;0;L;;;;;N;;;;;
+28D4;BRAILLE PATTERN DOTS-3578;So;0;L;;;;;N;;;;;
+28D5;BRAILLE PATTERN DOTS-13578;So;0;L;;;;;N;;;;;
+28D6;BRAILLE PATTERN DOTS-23578;So;0;L;;;;;N;;;;;
+28D7;BRAILLE PATTERN DOTS-123578;So;0;L;;;;;N;;;;;
+28D8;BRAILLE PATTERN DOTS-4578;So;0;L;;;;;N;;;;;
+28D9;BRAILLE PATTERN DOTS-14578;So;0;L;;;;;N;;;;;
+28DA;BRAILLE PATTERN DOTS-24578;So;0;L;;;;;N;;;;;
+28DB;BRAILLE PATTERN DOTS-124578;So;0;L;;;;;N;;;;;
+28DC;BRAILLE PATTERN DOTS-34578;So;0;L;;;;;N;;;;;
+28DD;BRAILLE PATTERN DOTS-134578;So;0;L;;;;;N;;;;;
+28DE;BRAILLE PATTERN DOTS-234578;So;0;L;;;;;N;;;;;
+28DF;BRAILLE PATTERN DOTS-1234578;So;0;L;;;;;N;;;;;
+28E0;BRAILLE PATTERN DOTS-678;So;0;L;;;;;N;;;;;
+28E1;BRAILLE PATTERN DOTS-1678;So;0;L;;;;;N;;;;;
+28E2;BRAILLE PATTERN DOTS-2678;So;0;L;;;;;N;;;;;
+28E3;BRAILLE PATTERN DOTS-12678;So;0;L;;;;;N;;;;;
+28E4;BRAILLE PATTERN DOTS-3678;So;0;L;;;;;N;;;;;
+28E5;BRAILLE PATTERN DOTS-13678;So;0;L;;;;;N;;;;;
+28E6;BRAILLE PATTERN DOTS-23678;So;0;L;;;;;N;;;;;
+28E7;BRAILLE PATTERN DOTS-123678;So;0;L;;;;;N;;;;;
+28E8;BRAILLE PATTERN DOTS-4678;So;0;L;;;;;N;;;;;
+28E9;BRAILLE PATTERN DOTS-14678;So;0;L;;;;;N;;;;;
+28EA;BRAILLE PATTERN DOTS-24678;So;0;L;;;;;N;;;;;
+28EB;BRAILLE PATTERN DOTS-124678;So;0;L;;;;;N;;;;;
+28EC;BRAILLE PATTERN DOTS-34678;So;0;L;;;;;N;;;;;
+28ED;BRAILLE PATTERN DOTS-134678;So;0;L;;;;;N;;;;;
+28EE;BRAILLE PATTERN DOTS-234678;So;0;L;;;;;N;;;;;
+28EF;BRAILLE PATTERN DOTS-1234678;So;0;L;;;;;N;;;;;
+28F0;BRAILLE PATTERN DOTS-5678;So;0;L;;;;;N;;;;;
+28F1;BRAILLE PATTERN DOTS-15678;So;0;L;;;;;N;;;;;
+28F2;BRAILLE PATTERN DOTS-25678;So;0;L;;;;;N;;;;;
+28F3;BRAILLE PATTERN DOTS-125678;So;0;L;;;;;N;;;;;
+28F4;BRAILLE PATTERN DOTS-35678;So;0;L;;;;;N;;;;;
+28F5;BRAILLE PATTERN DOTS-135678;So;0;L;;;;;N;;;;;
+28F6;BRAILLE PATTERN DOTS-235678;So;0;L;;;;;N;;;;;
+28F7;BRAILLE PATTERN DOTS-1235678;So;0;L;;;;;N;;;;;
+28F8;BRAILLE PATTERN DOTS-45678;So;0;L;;;;;N;;;;;
+28F9;BRAILLE PATTERN DOTS-145678;So;0;L;;;;;N;;;;;
+28FA;BRAILLE PATTERN DOTS-245678;So;0;L;;;;;N;;;;;
+28FB;BRAILLE PATTERN DOTS-1245678;So;0;L;;;;;N;;;;;
+28FC;BRAILLE PATTERN DOTS-345678;So;0;L;;;;;N;;;;;
+28FD;BRAILLE PATTERN DOTS-1345678;So;0;L;;;;;N;;;;;
+28FE;BRAILLE PATTERN DOTS-2345678;So;0;L;;;;;N;;;;;
+28FF;BRAILLE PATTERN DOTS-12345678;So;0;L;;;;;N;;;;;
+2900;RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2901;RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2902;LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2903;RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2904;LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2905;RIGHTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2906;LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2907;RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2908;DOWNWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+2909;UPWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+290A;UPWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;;
+290B;DOWNWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;;
+290C;LEFTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+290D;RIGHTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+290E;LEFTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+290F;RIGHTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+2910;RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+2911;RIGHTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;;
+2912;UPWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;;
+2913;DOWNWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;;
+2914;RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2915;RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2916;RIGHTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;;
+2917;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2918;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2919;LEFTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291A;RIGHTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291B;LEFTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291C;RIGHTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291D;LEFTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+291E;RIGHTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+291F;LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+2920;RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+2921;NORTH WEST AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2922;NORTH EAST AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+2923;NORTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2924;NORTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2925;SOUTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2926;SOUTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2927;NORTH WEST ARROW AND NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2928;NORTH EAST ARROW AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2929;SOUTH EAST ARROW AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+292A;SOUTH WEST ARROW AND NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+292B;RISING DIAGONAL CROSSING FALLING DIAGONAL;Sm;0;ON;;;;;N;;;;;
+292C;FALLING DIAGONAL CROSSING RISING DIAGONAL;Sm;0;ON;;;;;N;;;;;
+292D;SOUTH EAST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+292E;NORTH EAST ARROW CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+292F;FALLING DIAGONAL CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2930;RISING DIAGONAL CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2931;NORTH EAST ARROW CROSSING NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+2932;NORTH WEST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2933;WAVE ARROW POINTING DIRECTLY RIGHT;Sm;0;ON;;;;;N;;;;;
+2934;ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS;Sm;0;ON;;;;;N;;;;;
+2935;ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS;Sm;0;ON;;;;;N;;;;;
+2936;ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS;Sm;0;ON;;;;;N;;;;;
+2937;ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS;Sm;0;ON;;;;;N;;;;;
+2938;RIGHT-SIDE ARC CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+2939;LEFT-SIDE ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293A;TOP ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293B;BOTTOM ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293C;TOP ARC CLOCKWISE ARROW WITH MINUS;Sm;0;ON;;;;;N;;;;;
+293D;TOP ARC ANTICLOCKWISE ARROW WITH PLUS;Sm;0;ON;;;;;N;;;;;
+293E;LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293F;LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+2940;ANTICLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+2941;CLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+2942;RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2943;LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2944;SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2945;RIGHTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;;
+2946;LEFTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;;
+2947;RIGHTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;;
+2948;LEFT RIGHT ARROW THROUGH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+2949;UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+294A;LEFT BARB UP RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;;
+294B;LEFT BARB DOWN RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;;
+294C;UP BARB RIGHT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;;
+294D;UP BARB LEFT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;;
+294E;LEFT BARB UP RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;;
+294F;UP BARB RIGHT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;;
+2950;LEFT BARB DOWN RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;;
+2951;UP BARB LEFT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;;
+2952;LEFTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;;
+2953;RIGHTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;;
+2954;UPWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;;
+2955;DOWNWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;;
+2956;LEFTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;;
+2957;RIGHTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;;
+2958;UPWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;;
+2959;DOWNWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;;
+295A;LEFTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;;
+295B;RIGHTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;;
+295C;UPWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;;
+295D;DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;;
+295E;LEFTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;;
+295F;RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;;
+2960;UPWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;;
+2961;DOWNWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;;
+2962;LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+2963;UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+2964;RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+2965;DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+2966;LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;;
+2967;LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+2968;RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;;
+2969;RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+296A;LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;;
+296B;LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;;
+296C;RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;;
+296D;RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;;
+296E;UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+296F;DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+2970;RIGHT DOUBLE ARROW WITH ROUNDED HEAD;Sm;0;ON;;;;;N;;;;;
+2971;EQUALS SIGN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2972;TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2973;LEFTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2974;RIGHTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2975;RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2976;LESS-THAN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2977;LEFTWARDS ARROW THROUGH LESS-THAN;Sm;0;ON;;;;;N;;;;;
+2978;GREATER-THAN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2979;SUBSET ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+297A;LEFTWARDS ARROW THROUGH SUBSET;Sm;0;ON;;;;;N;;;;;
+297B;SUPERSET ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+297C;LEFT FISH TAIL;Sm;0;ON;;;;;N;;;;;
+297D;RIGHT FISH TAIL;Sm;0;ON;;;;;N;;;;;
+297E;UP FISH TAIL;Sm;0;ON;;;;;N;;;;;
+297F;DOWN FISH TAIL;Sm;0;ON;;;;;N;;;;;
+2980;TRIPLE VERTICAL BAR DELIMITER;Sm;0;ON;;;;;N;;;;;
+2981;Z NOTATION SPOT;Sm;0;ON;;;;;N;;;;;
+2982;Z NOTATION TYPE COLON;Sm;0;ON;;;;;N;;;;;
+2983;LEFT WHITE CURLY BRACKET;Ps;0;ON;;;;;Y;;;;;
+2984;RIGHT WHITE CURLY BRACKET;Pe;0;ON;;;;;Y;;;;;
+2985;LEFT WHITE PARENTHESIS;Ps;0;ON;;;;;Y;;;;;
+2986;RIGHT WHITE PARENTHESIS;Pe;0;ON;;;;;Y;;;;;
+2987;Z NOTATION LEFT IMAGE BRACKET;Ps;0;ON;;;;;Y;;;;;
+2988;Z NOTATION RIGHT IMAGE BRACKET;Pe;0;ON;;;;;Y;;;;;
+2989;Z NOTATION LEFT BINDING BRACKET;Ps;0;ON;;;;;Y;;;;;
+298A;Z NOTATION RIGHT BINDING BRACKET;Pe;0;ON;;;;;Y;;;;;
+298B;LEFT SQUARE BRACKET WITH UNDERBAR;Ps;0;ON;;;;;Y;;;;;
+298C;RIGHT SQUARE BRACKET WITH UNDERBAR;Pe;0;ON;;;;;Y;;;;;
+298D;LEFT SQUARE BRACKET WITH TICK IN TOP CORNER;Ps;0;ON;;;;;Y;;;;;
+298E;RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Pe;0;ON;;;;;Y;;;;;
+298F;LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Ps;0;ON;;;;;Y;;;;;
+2990;RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER;Pe;0;ON;;;;;Y;;;;;
+2991;LEFT ANGLE BRACKET WITH DOT;Ps;0;ON;;;;;Y;;;;;
+2992;RIGHT ANGLE BRACKET WITH DOT;Pe;0;ON;;;;;Y;;;;;
+2993;LEFT ARC LESS-THAN BRACKET;Ps;0;ON;;;;;Y;;;;;
+2994;RIGHT ARC GREATER-THAN BRACKET;Pe;0;ON;;;;;Y;;;;;
+2995;DOUBLE LEFT ARC GREATER-THAN BRACKET;Ps;0;ON;;;;;Y;;;;;
+2996;DOUBLE RIGHT ARC LESS-THAN BRACKET;Pe;0;ON;;;;;Y;;;;;
+2997;LEFT BLACK TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;;
+2998;RIGHT BLACK TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;;
+2999;DOTTED FENCE;Sm;0;ON;;;;;N;;;;;
+299A;VERTICAL ZIGZAG LINE;Sm;0;ON;;;;;N;;;;;
+299B;MEASURED ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;;
+299C;RIGHT ANGLE VARIANT WITH SQUARE;Sm;0;ON;;;;;Y;;;;;
+299D;MEASURED RIGHT ANGLE WITH DOT;Sm;0;ON;;;;;Y;;;;;
+299E;ANGLE WITH S INSIDE;Sm;0;ON;;;;;Y;;;;;
+299F;ACUTE ANGLE;Sm;0;ON;;;;;Y;;;;;
+29A0;SPHERICAL ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;;
+29A1;SPHERICAL ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;;
+29A2;TURNED ANGLE;Sm;0;ON;;;;;Y;;;;;
+29A3;REVERSED ANGLE;Sm;0;ON;;;;;Y;;;;;
+29A4;ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+29A5;REVERSED ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+29A6;OBLIQUE ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;;
+29A7;OBLIQUE ANGLE OPENING DOWN;Sm;0;ON;;;;;Y;;;;;
+29A8;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT;Sm;0;ON;;;;;Y;;;;;
+29A9;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT;Sm;0;ON;;;;;Y;;;;;
+29AA;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT;Sm;0;ON;;;;;Y;;;;;
+29AB;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT;Sm;0;ON;;;;;Y;;;;;
+29AC;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP;Sm;0;ON;;;;;Y;;;;;
+29AD;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP;Sm;0;ON;;;;;Y;;;;;
+29AE;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN;Sm;0;ON;;;;;Y;;;;;
+29AF;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN;Sm;0;ON;;;;;Y;;;;;
+29B0;REVERSED EMPTY SET;Sm;0;ON;;;;;N;;;;;
+29B1;EMPTY SET WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+29B2;EMPTY SET WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+29B3;EMPTY SET WITH RIGHT ARROW ABOVE;Sm;0;ON;;;;;N;;;;;
+29B4;EMPTY SET WITH LEFT ARROW ABOVE;Sm;0;ON;;;;;N;;;;;
+29B5;CIRCLE WITH HORIZONTAL BAR;Sm;0;ON;;;;;N;;;;;
+29B6;CIRCLED VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+29B7;CIRCLED PARALLEL;Sm;0;ON;;;;;N;;;;;
+29B8;CIRCLED REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+29B9;CIRCLED PERPENDICULAR;Sm;0;ON;;;;;N;;;;;
+29BA;CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+29BB;CIRCLE WITH SUPERIMPOSED X;Sm;0;ON;;;;;N;;;;;
+29BC;CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN;Sm;0;ON;;;;;N;;;;;
+29BD;UP ARROW THROUGH CIRCLE;Sm;0;ON;;;;;N;;;;;
+29BE;CIRCLED WHITE BULLET;Sm;0;ON;;;;;N;;;;;
+29BF;CIRCLED BULLET;Sm;0;ON;;;;;N;;;;;
+29C0;CIRCLED LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+29C1;CIRCLED GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+29C2;CIRCLE WITH SMALL CIRCLE TO THE RIGHT;Sm;0;ON;;;;;Y;;;;;
+29C3;CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT;Sm;0;ON;;;;;Y;;;;;
+29C4;SQUARED RISING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;;
+29C5;SQUARED FALLING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;;
+29C6;SQUARED ASTERISK;Sm;0;ON;;;;;N;;;;;
+29C7;SQUARED SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+29C8;SQUARED SQUARE;Sm;0;ON;;;;;N;;;;;
+29C9;TWO JOINED SQUARES;Sm;0;ON;;;;;Y;;;;;
+29CA;TRIANGLE WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+29CB;TRIANGLE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+29CC;S IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+29CD;TRIANGLE WITH SERIFS AT BOTTOM;Sm;0;ON;;;;;N;;;;;
+29CE;RIGHT TRIANGLE ABOVE LEFT TRIANGLE;Sm;0;ON;;;;;Y;;;;;
+29CF;LEFT TRIANGLE BESIDE VERTICAL BAR;Sm;0;ON;;;;;Y;;;;;
+29D0;VERTICAL BAR BESIDE RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;;
+29D1;BOWTIE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D2;BOWTIE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D3;BLACK BOWTIE;Sm;0;ON;;;;;N;;;;;
+29D4;TIMES WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D5;TIMES WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D6;WHITE HOURGLASS;Sm;0;ON;;;;;N;;;;;
+29D7;BLACK HOURGLASS;Sm;0;ON;;;;;N;;;;;
+29D8;LEFT WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;;
+29D9;RIGHT WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;;
+29DA;LEFT DOUBLE WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;;
+29DB;RIGHT DOUBLE WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;;
+29DC;INCOMPLETE INFINITY;Sm;0;ON;;;;;Y;;;;;
+29DD;TIE OVER INFINITY;Sm;0;ON;;;;;N;;;;;
+29DE;INFINITY NEGATED WITH VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+29DF;DOUBLE-ENDED MULTIMAP;Sm;0;ON;;;;;N;;;;;
+29E0;SQUARE WITH CONTOURED OUTLINE;Sm;0;ON;;;;;N;;;;;
+29E1;INCREASES AS;Sm;0;ON;;;;;Y;;;;;
+29E2;SHUFFLE PRODUCT;Sm;0;ON;;;;;N;;;;;
+29E3;EQUALS SIGN AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;;
+29E4;EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;;
+29E5;IDENTICAL TO AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;;
+29E6;GLEICH STARK;Sm;0;ON;;;;;N;;;;;
+29E7;THERMODYNAMIC;Sm;0;ON;;;;;N;;;;;
+29E8;DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29E9;DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29EA;BLACK DIAMOND WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;;
+29EB;BLACK LOZENGE;Sm;0;ON;;;;;N;;;;;
+29EC;WHITE CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;;
+29ED;BLACK CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;;
+29EE;ERROR-BARRED WHITE SQUARE;Sm;0;ON;;;;;N;;;;;
+29EF;ERROR-BARRED BLACK SQUARE;Sm;0;ON;;;;;N;;;;;
+29F0;ERROR-BARRED WHITE DIAMOND;Sm;0;ON;;;;;N;;;;;
+29F1;ERROR-BARRED BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+29F2;ERROR-BARRED WHITE CIRCLE;Sm;0;ON;;;;;N;;;;;
+29F3;ERROR-BARRED BLACK CIRCLE;Sm;0;ON;;;;;N;;;;;
+29F4;RULE-DELAYED;Sm;0;ON;;;;;Y;;;;;
+29F5;REVERSE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;;
+29F6;SOLIDUS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+29F7;REVERSE SOLIDUS WITH HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+29F8;BIG SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+29F9;BIG REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+29FA;DOUBLE PLUS;Sm;0;ON;;;;;N;;;;;
+29FB;TRIPLE PLUS;Sm;0;ON;;;;;N;;;;;
+29FC;LEFT-POINTING CURVED ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;;
+29FD;RIGHT-POINTING CURVED ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;;
+29FE;TINY;Sm;0;ON;;;;;N;;;;;
+29FF;MINY;Sm;0;ON;;;;;N;;;;;
+2A00;N-ARY CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A01;N-ARY CIRCLED PLUS OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A02;N-ARY CIRCLED TIMES OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A03;N-ARY UNION OPERATOR WITH DOT;Sm;0;ON;;;;;N;;;;;
+2A04;N-ARY UNION OPERATOR WITH PLUS;Sm;0;ON;;;;;N;;;;;
+2A05;N-ARY SQUARE INTERSECTION OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A06;N-ARY SQUARE UNION OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A07;TWO LOGICAL AND OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A08;TWO LOGICAL OR OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A09;N-ARY TIMES OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A0A;MODULO TWO SUM;Sm;0;ON;;;;;Y;;;;;
+2A0B;SUMMATION WITH INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2A0C;QUADRUPLE INTEGRAL OPERATOR;Sm;0;ON;<compat> 222B 222B 222B 222B;;;;Y;;;;;
+2A0D;FINITE PART INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2A0E;INTEGRAL WITH DOUBLE STROKE;Sm;0;ON;;;;;Y;;;;;
+2A0F;INTEGRAL AVERAGE WITH SLASH;Sm;0;ON;;;;;Y;;;;;
+2A10;CIRCULATION FUNCTION;Sm;0;ON;;;;;Y;;;;;
+2A11;ANTICLOCKWISE INTEGRATION;Sm;0;ON;;;;;Y;;;;;
+2A12;LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;;
+2A13;LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;;
+2A14;LINE INTEGRATION NOT INCLUDING THE POLE;Sm;0;ON;;;;;Y;;;;;
+2A15;INTEGRAL AROUND A POINT OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A16;QUATERNION INTEGRAL OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A17;INTEGRAL WITH LEFTWARDS ARROW WITH HOOK;Sm;0;ON;;;;;Y;;;;;
+2A18;INTEGRAL WITH TIMES SIGN;Sm;0;ON;;;;;Y;;;;;
+2A19;INTEGRAL WITH INTERSECTION;Sm;0;ON;;;;;Y;;;;;
+2A1A;INTEGRAL WITH UNION;Sm;0;ON;;;;;Y;;;;;
+2A1B;INTEGRAL WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+2A1C;INTEGRAL WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+2A1D;JOIN;Sm;0;ON;;;;;N;;;;;
+2A1E;LARGE LEFT TRIANGLE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A1F;Z NOTATION SCHEMA COMPOSITION;Sm;0;ON;;;;;Y;;;;;
+2A20;Z NOTATION SCHEMA PIPING;Sm;0;ON;;;;;Y;;;;;
+2A21;Z NOTATION SCHEMA PROJECTION;Sm;0;ON;;;;;Y;;;;;
+2A22;PLUS SIGN WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+2A23;PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A24;PLUS SIGN WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A25;PLUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;;
+2A26;PLUS SIGN WITH TILDE BELOW;Sm;0;ON;;;;;Y;;;;;
+2A27;PLUS SIGN WITH SUBSCRIPT TWO;Sm;0;ON;;;;;N;;;;;
+2A28;PLUS SIGN WITH BLACK TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A29;MINUS SIGN WITH COMMA ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A2A;MINUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;;
+2A2B;MINUS SIGN WITH FALLING DOTS;Sm;0;ON;;;;;Y;;;;;
+2A2C;MINUS SIGN WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;;
+2A2D;PLUS SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A2E;PLUS SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A2F;VECTOR OR CROSS PRODUCT;Sm;0;ON;;;;;N;;;;;
+2A30;MULTIPLICATION SIGN WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A31;MULTIPLICATION SIGN WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A32;SEMIDIRECT PRODUCT WITH BOTTOM CLOSED;Sm;0;ON;;;;;N;;;;;
+2A33;SMASH PRODUCT;Sm;0;ON;;;;;N;;;;;
+2A34;MULTIPLICATION SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A35;MULTIPLICATION SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A36;CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;N;;;;;
+2A37;MULTIPLICATION SIGN IN DOUBLE CIRCLE;Sm;0;ON;;;;;N;;;;;
+2A38;CIRCLED DIVISION SIGN;Sm;0;ON;;;;;N;;;;;
+2A39;PLUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A3A;MINUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A3B;MULTIPLICATION SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A3C;INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;;
+2A3D;RIGHTHAND INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;;
+2A3E;Z NOTATION RELATIONAL COMPOSITION;Sm;0;ON;;;;;Y;;;;;
+2A3F;AMALGAMATION OR COPRODUCT;Sm;0;ON;;;;;N;;;;;
+2A40;INTERSECTION WITH DOT;Sm;0;ON;;;;;N;;;;;
+2A41;UNION WITH MINUS SIGN;Sm;0;ON;;;;;N;;;;;
+2A42;UNION WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A43;INTERSECTION WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A44;INTERSECTION WITH LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A45;UNION WITH LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2A46;UNION ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A47;INTERSECTION ABOVE UNION;Sm;0;ON;;;;;N;;;;;
+2A48;UNION ABOVE BAR ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A49;INTERSECTION ABOVE BAR ABOVE UNION;Sm;0;ON;;;;;N;;;;;
+2A4A;UNION BESIDE AND JOINED WITH UNION;Sm;0;ON;;;;;N;;;;;
+2A4B;INTERSECTION BESIDE AND JOINED WITH INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A4C;CLOSED UNION WITH SERIFS;Sm;0;ON;;;;;N;;;;;
+2A4D;CLOSED INTERSECTION WITH SERIFS;Sm;0;ON;;;;;N;;;;;
+2A4E;DOUBLE SQUARE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A4F;DOUBLE SQUARE UNION;Sm;0;ON;;;;;N;;;;;
+2A50;CLOSED UNION WITH SERIFS AND SMASH PRODUCT;Sm;0;ON;;;;;N;;;;;
+2A51;LOGICAL AND WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A52;LOGICAL OR WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A53;DOUBLE LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A54;DOUBLE LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2A55;TWO INTERSECTING LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A56;TWO INTERSECTING LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2A57;SLOPING LARGE OR;Sm;0;ON;;;;;Y;;;;;
+2A58;SLOPING LARGE AND;Sm;0;ON;;;;;Y;;;;;
+2A59;LOGICAL OR OVERLAPPING LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A5A;LOGICAL AND WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;;
+2A5B;LOGICAL OR WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;;
+2A5C;LOGICAL AND WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;;
+2A5D;LOGICAL OR WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;;
+2A5E;LOGICAL AND WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A5F;LOGICAL AND WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A60;LOGICAL AND WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A61;SMALL VEE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A62;LOGICAL OR WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A63;LOGICAL OR WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A64;Z NOTATION DOMAIN ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;;
+2A65;Z NOTATION RANGE ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;;
+2A66;EQUALS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;;
+2A67;IDENTICAL WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A68;TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2A69;TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2A6A;TILDE OPERATOR WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A6B;TILDE OPERATOR WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;;
+2A6C;SIMILAR MINUS SIMILAR;Sm;0;ON;;;;;Y;;;;;
+2A6D;CONGRUENT WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A6E;EQUALS WITH ASTERISK;Sm;0;ON;;;;;N;;;;;
+2A6F;ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;Y;;;;;
+2A70;APPROXIMATELY EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A71;EQUALS SIGN ABOVE PLUS SIGN;Sm;0;ON;;;;;N;;;;;
+2A72;PLUS SIGN ABOVE EQUALS SIGN;Sm;0;ON;;;;;N;;;;;
+2A73;EQUALS SIGN ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A74;DOUBLE COLON EQUAL;Sm;0;ON;<compat> 003A 003A 003D;;;;Y;;;;;
+2A75;TWO CONSECUTIVE EQUALS SIGNS;Sm;0;ON;<compat> 003D 003D;;;;N;;;;;
+2A76;THREE CONSECUTIVE EQUALS SIGNS;Sm;0;ON;<compat> 003D 003D 003D;;;;N;;;;;
+2A77;EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW;Sm;0;ON;;;;;N;;;;;
+2A78;EQUIVALENT WITH FOUR DOTS ABOVE;Sm;0;ON;;;;;N;;;;;
+2A79;LESS-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A7A;GREATER-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A7B;LESS-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A7C;GREATER-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A7D;LESS-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A7E;GREATER-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A7F;LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A80;GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A81;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A82;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A83;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT;Sm;0;ON;;;;;Y;;;;;
+2A84;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT;Sm;0;ON;;;;;Y;;;;;
+2A85;LESS-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A86;GREATER-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A87;LESS-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A88;GREATER-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A89;LESS-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A8A;GREATER-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A8B;LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A8C;GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A8D;LESS-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A8E;GREATER-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A8F;LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A90;GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A91;LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A92;GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A93;LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A94;GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A95;SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A96;SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A97;SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A98;SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A99;DOUBLE-LINE EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9A;DOUBLE-LINE EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9B;DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9C;DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9D;SIMILAR OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9E;SIMILAR OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9F;SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AA0;SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AA1;DOUBLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2AA2;DOUBLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2AA3;DOUBLE NESTED LESS-THAN WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+2AA4;GREATER-THAN OVERLAPPING LESS-THAN;Sm;0;ON;;;;;N;;;;;
+2AA5;GREATER-THAN BESIDE LESS-THAN;Sm;0;ON;;;;;N;;;;;
+2AA6;LESS-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;;
+2AA7;GREATER-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;;
+2AA8;LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2AA9;GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2AAA;SMALLER THAN;Sm;0;ON;;;;;Y;;;;;
+2AAB;LARGER THAN;Sm;0;ON;;;;;Y;;;;;
+2AAC;SMALLER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AAD;LARGER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AAE;EQUALS SIGN WITH BUMPY ABOVE;Sm;0;ON;;;;;N;;;;;
+2AAF;PRECEDES ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB0;SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB1;PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB2;SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB3;PRECEDES ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB4;SUCCEEDS ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB5;PRECEDES ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB6;SUCCEEDS ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB7;PRECEDES ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB8;SUCCEEDS ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB9;PRECEDES ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ABA;SUCCEEDS ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ABB;DOUBLE PRECEDES;Sm;0;ON;;;;;Y;;;;;
+2ABC;DOUBLE SUCCEEDS;Sm;0;ON;;;;;Y;;;;;
+2ABD;SUBSET WITH DOT;Sm;0;ON;;;;;Y;;;;;
+2ABE;SUPERSET WITH DOT;Sm;0;ON;;;;;Y;;;;;
+2ABF;SUBSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC0;SUPERSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC1;SUBSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC2;SUPERSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC3;SUBSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2AC4;SUPERSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2AC5;SUBSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AC6;SUPERSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AC7;SUBSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AC8;SUPERSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AC9;SUBSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACA;SUPERSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACB;SUBSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACC;SUPERSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACD;SQUARE LEFT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2ACE;SQUARE RIGHT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2ACF;CLOSED SUBSET;Sm;0;ON;;;;;Y;;;;;
+2AD0;CLOSED SUPERSET;Sm;0;ON;;;;;Y;;;;;
+2AD1;CLOSED SUBSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AD2;CLOSED SUPERSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AD3;SUBSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;;
+2AD4;SUPERSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;;
+2AD5;SUBSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;;
+2AD6;SUPERSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;;
+2AD7;SUPERSET BESIDE SUBSET;Sm;0;ON;;;;;N;;;;;
+2AD8;SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET;Sm;0;ON;;;;;N;;;;;
+2AD9;ELEMENT OF OPENING DOWNWARDS;Sm;0;ON;;;;;N;;;;;
+2ADA;PITCHFORK WITH TEE TOP;Sm;0;ON;;;;;N;;;;;
+2ADB;TRANSVERSAL INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2ADC;FORKING;Sm;0;ON;2ADD 0338;;;;Y;;;;;
+2ADD;NONFORKING;Sm;0;ON;;;;;N;;;;;
+2ADE;SHORT LEFT TACK;Sm;0;ON;;;;;Y;;;;;
+2ADF;SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;;
+2AE0;SHORT UP TACK;Sm;0;ON;;;;;N;;;;;
+2AE1;PERPENDICULAR WITH S;Sm;0;ON;;;;;N;;;;;
+2AE2;VERTICAL BAR TRIPLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE3;DOUBLE VERTICAL BAR LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE4;VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE5;DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE6;LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL;Sm;0;ON;;;;;Y;;;;;
+2AE7;SHORT DOWN TACK WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+2AE8;SHORT UP TACK WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2AE9;SHORT UP TACK ABOVE SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;;
+2AEA;DOUBLE DOWN TACK;Sm;0;ON;;;;;N;;;;;
+2AEB;DOUBLE UP TACK;Sm;0;ON;;;;;N;;;;;
+2AEC;DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;;
+2AED;REVERSED DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;;
+2AEE;DOES NOT DIVIDE WITH REVERSED NEGATION SLASH;Sm;0;ON;;;;;Y;;;;;
+2AEF;VERTICAL LINE WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+2AF0;VERTICAL LINE WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;;
+2AF1;DOWN TACK WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;;
+2AF2;PARALLEL WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+2AF3;PARALLEL WITH TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AF4;TRIPLE VERTICAL BAR BINARY RELATION;Sm;0;ON;;;;;N;;;;;
+2AF5;TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+2AF6;TRIPLE COLON OPERATOR;Sm;0;ON;;;;;N;;;;;
+2AF7;TRIPLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2AF8;TRIPLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2AF9;DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AFA;DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AFB;TRIPLE SOLIDUS BINARY RELATION;Sm;0;ON;;;;;Y;;;;;
+2AFC;LARGE TRIPLE VERTICAL BAR OPERATOR;Sm;0;ON;;;;;N;;;;;
+2AFD;DOUBLE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AFE;WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+2AFF;N-ARY WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+2B00;NORTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B01;NORTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B02;SOUTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B03;SOUTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B04;LEFT RIGHT WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B05;LEFTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B06;UPWARDS BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B07;DOWNWARDS BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B08;NORTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B09;NORTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0A;SOUTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0B;SOUTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0C;LEFT RIGHT BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0D;UP DOWN BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0E;RIGHTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;;
+2B0F;RIGHTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;;
+2B10;LEFTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;;
+2B11;LEFTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;;
+2B12;SQUARE WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;;
+2B13;SQUARE WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;;
+2B14;SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+2B15;SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+2B16;DIAMOND WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+2B17;DIAMOND WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
+2B18;DIAMOND WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;;
+2B19;DIAMOND WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;;
+2B1A;DOTTED SQUARE;So;0;ON;;;;;N;;;;;
+2B1B;BLACK LARGE SQUARE;So;0;ON;;;;;N;;;;;
+2B1C;WHITE LARGE SQUARE;So;0;ON;;;;;N;;;;;
+2B1D;BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;;
+2B1E;WHITE VERY SMALL SQUARE;So;0;ON;;;;;N;;;;;
+2B1F;BLACK PENTAGON;So;0;ON;;;;;N;;;;;
+2B20;WHITE PENTAGON;So;0;ON;;;;;N;;;;;
+2B21;WHITE HEXAGON;So;0;ON;;;;;N;;;;;
+2B22;BLACK HEXAGON;So;0;ON;;;;;N;;;;;
+2B23;HORIZONTAL BLACK HEXAGON;So;0;ON;;;;;N;;;;;
+2B24;BLACK LARGE CIRCLE;So;0;ON;;;;;N;;;;;
+2B25;BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;;
+2B26;WHITE MEDIUM DIAMOND;So;0;ON;;;;;N;;;;;
+2B27;BLACK MEDIUM LOZENGE;So;0;ON;;;;;N;;;;;
+2B28;WHITE MEDIUM LOZENGE;So;0;ON;;;;;N;;;;;
+2B29;BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;;
+2B2A;BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;;
+2B2B;WHITE SMALL LOZENGE;So;0;ON;;;;;N;;;;;
+2B2C;BLACK HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B2D;WHITE HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B2E;BLACK VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B2F;WHITE VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B30;LEFT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+2B31;THREE LEFTWARDS ARROWS;Sm;0;ON;;;;;N;;;;;
+2B32;LEFT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;;
+2B33;LONG LEFTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;;
+2B34;LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B35;LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B36;LEFTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2B37;LEFTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+2B38;LEFTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;;
+2B39;LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3A;LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3B;LEFTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;;
+2B3C;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3D;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3E;LEFTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;;
+2B3F;WAVE ARROW POINTING DIRECTLY LEFT;Sm;0;ON;;;;;N;;;;;
+2B40;EQUALS SIGN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B41;REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B42;LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2B43;RIGHTWARDS ARROW THROUGH GREATER-THAN;Sm;0;ON;;;;;N;;;;;
+2B44;RIGHTWARDS ARROW THROUGH SUPERSET;Sm;0;ON;;;;;N;;;;;
+2B45;LEFTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;;
+2B46;RIGHTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;;
+2B47;REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B48;RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2B49;TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B4A;LEFTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2B4B;LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2B4C;RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2B4D;DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW;So;0;ON;;;;;N;;;;;
+2B4E;SHORT SLANTED NORTH ARROW;So;0;ON;;;;;N;;;;;
+2B4F;SHORT BACKSLANTED SOUTH ARROW;So;0;ON;;;;;N;;;;;
+2B50;WHITE MEDIUM STAR;So;0;ON;;;;;N;;;;;
+2B51;BLACK SMALL STAR;So;0;ON;;;;;N;;;;;
+2B52;WHITE SMALL STAR;So;0;ON;;;;;N;;;;;
+2B53;BLACK RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;;
+2B54;WHITE RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;;
+2B55;HEAVY LARGE CIRCLE;So;0;ON;;;;;N;;;;;
+2B56;HEAVY OVAL WITH OVAL INSIDE;So;0;ON;;;;;N;;;;;
+2B57;HEAVY CIRCLE WITH CIRCLE INSIDE;So;0;ON;;;;;N;;;;;
+2B58;HEAVY CIRCLE;So;0;ON;;;;;N;;;;;
+2B59;HEAVY CIRCLED SALTIRE;So;0;ON;;;;;N;;;;;
+2B5A;SLANTED NORTH ARROW WITH HOOKED HEAD;So;0;ON;;;;;N;;;;;
+2B5B;BACKSLANTED SOUTH ARROW WITH HOOKED TAIL;So;0;ON;;;;;N;;;;;
+2B5C;SLANTED NORTH ARROW WITH HORIZONTAL TAIL;So;0;ON;;;;;N;;;;;
+2B5D;BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL;So;0;ON;;;;;N;;;;;
+2B5E;BENT ARROW POINTING DOWNWARDS THEN NORTH EAST;So;0;ON;;;;;N;;;;;
+2B5F;SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST;So;0;ON;;;;;N;;;;;
+2B60;LEFTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;;
+2B61;UPWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;;
+2B62;RIGHTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;;
+2B63;DOWNWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;;
+2B64;LEFT RIGHT TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;;
+2B65;UP DOWN TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;;
+2B66;NORTH WEST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;;
+2B67;NORTH EAST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;;
+2B68;SOUTH EAST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;;
+2B69;SOUTH WEST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;;
+2B6A;LEFTWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;;
+2B6B;UPWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;;
+2B6C;RIGHTWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;;
+2B6D;DOWNWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;;
+2B6E;CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;;
+2B6F;ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;;
+2B70;LEFTWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;;
+2B71;UPWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;;
+2B72;RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;;
+2B73;DOWNWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;;
+2B76;NORTH WEST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;;
+2B77;NORTH EAST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;;
+2B78;SOUTH EAST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;;
+2B79;SOUTH WEST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;;
+2B7A;LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;;
+2B7B;UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;;
+2B7C;RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;;
+2B7D;DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;;
+2B7E;HORIZONTAL TAB KEY;So;0;ON;;;;;N;;;;;
+2B7F;VERTICAL TAB KEY;So;0;ON;;;;;N;;;;;
+2B80;LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;;
+2B81;UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;;
+2B82;RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;;
+2B83;DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;;
+2B84;LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;;
+2B85;UPWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;;
+2B86;RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;;
+2B87;DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;;
+2B88;LEFTWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B89;UPWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B8A;RIGHTWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B8B;DOWNWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B8C;ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW;So;0;ON;;;;;N;;;;;
+2B8D;ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW;So;0;ON;;;;;N;;;;;
+2B8E;ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW;So;0;ON;;;;;N;;;;;
+2B8F;ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW;So;0;ON;;;;;N;;;;;
+2B90;RETURN LEFT;So;0;ON;;;;;N;;;;;
+2B91;RETURN RIGHT;So;0;ON;;;;;N;;;;;
+2B92;NEWLINE LEFT;So;0;ON;;;;;N;;;;;
+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;;;;;
+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;;;;;
+2B9B;THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
+2B9C;BLACK LEFTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
+2B9D;BLACK UPWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
+2B9E;BLACK RIGHTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
+2B9F;BLACK DOWNWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
+2BA0;DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS;So;0;ON;;;;;N;;;;;
+2BA1;DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS;So;0;ON;;;;;N;;;;;
+2BA2;UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS;So;0;ON;;;;;N;;;;;
+2BA3;UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS;So;0;ON;;;;;N;;;;;
+2BA4;LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS;So;0;ON;;;;;N;;;;;
+2BA5;RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS;So;0;ON;;;;;N;;;;;
+2BA6;LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS;So;0;ON;;;;;N;;;;;
+2BA7;RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS;So;0;ON;;;;;N;;;;;
+2BA8;BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW;So;0;ON;;;;;N;;;;;
+2BA9;BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;;;;;
+2BAA;BLACK CURVED UPWARDS AND LEFTWARDS ARROW;So;0;ON;;;;;N;;;;;
+2BAB;BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;;;;;
+2BAC;BLACK CURVED LEFTWARDS AND UPWARDS ARROW;So;0;ON;;;;;N;;;;;
+2BAD;BLACK CURVED RIGHTWARDS AND UPWARDS ARROW;So;0;ON;;;;;N;;;;;
+2BAE;BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW;So;0;ON;;;;;N;;;;;
+2BAF;BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW;So;0;ON;;;;;N;;;;;
+2BB0;RIBBON ARROW DOWN LEFT;So;0;ON;;;;;N;;;;;
+2BB1;RIBBON ARROW DOWN RIGHT;So;0;ON;;;;;N;;;;;
+2BB2;RIBBON ARROW UP LEFT;So;0;ON;;;;;N;;;;;
+2BB3;RIBBON ARROW UP RIGHT;So;0;ON;;;;;N;;;;;
+2BB4;RIBBON ARROW LEFT UP;So;0;ON;;;;;N;;;;;
+2BB5;RIBBON ARROW RIGHT UP;So;0;ON;;;;;N;;;;;
+2BB6;RIBBON ARROW LEFT DOWN;So;0;ON;;;;;N;;;;;
+2BB7;RIBBON ARROW RIGHT DOWN;So;0;ON;;;;;N;;;;;
+2BB8;UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;;
+2BB9;UP ARROWHEAD IN A RECTANGLE BOX;So;0;ON;;;;;N;;;;;
+2BBD;BALLOT BOX WITH LIGHT X;So;0;ON;;;;;N;;;;;
+2BBE;CIRCLED X;So;0;ON;;;;;N;;;;;
+2BBF;CIRCLED BOLD X;So;0;ON;;;;;N;;;;;
+2BC0;BLACK SQUARE CENTRED;So;0;ON;;;;;N;;;;;
+2BC1;BLACK DIAMOND CENTRED;So;0;ON;;;;;N;;;;;
+2BC2;TURNED BLACK PENTAGON;So;0;ON;;;;;N;;;;;
+2BC3;HORIZONTAL BLACK OCTAGON;So;0;ON;;;;;N;;;;;
+2BC4;BLACK OCTAGON;So;0;ON;;;;;N;;;;;
+2BC5;BLACK MEDIUM UP-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;;
+2BC6;BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;;
+2BC7;BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;;
+2BC8;BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;;
+2BCA;TOP HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+2BCB;BOTTOM HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+2BCC;LIGHT FOUR POINTED BLACK CUSP;So;0;ON;;;;;N;;;;;
+2BCD;ROTATED LIGHT FOUR POINTED BLACK CUSP;So;0;ON;;;;;N;;;;;
+2BCE;WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;;
+2BCF;ROTATED WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;;
+2BD0;SQUARE POSITION INDICATOR;So;0;ON;;;;;N;;;;;
+2BD1;UNCERTAINTY SIGN;So;0;ON;;;;;N;;;;;
+2BEC;LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;;
+2BED;UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;;
+2BEE;RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;;
+2BEF;DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;;
+2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30;
+2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31;
+2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32;
+2C03;GLAGOLITIC CAPITAL LETTER GLAGOLI;Lu;0;L;;;;;N;;;;2C33;
+2C04;GLAGOLITIC CAPITAL LETTER DOBRO;Lu;0;L;;;;;N;;;;2C34;
+2C05;GLAGOLITIC CAPITAL LETTER YESTU;Lu;0;L;;;;;N;;;;2C35;
+2C06;GLAGOLITIC CAPITAL LETTER ZHIVETE;Lu;0;L;;;;;N;;;;2C36;
+2C07;GLAGOLITIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;2C37;
+2C08;GLAGOLITIC CAPITAL LETTER ZEMLJA;Lu;0;L;;;;;N;;;;2C38;
+2C09;GLAGOLITIC CAPITAL LETTER IZHE;Lu;0;L;;;;;N;;;;2C39;
+2C0A;GLAGOLITIC CAPITAL LETTER INITIAL IZHE;Lu;0;L;;;;;N;;;;2C3A;
+2C0B;GLAGOLITIC CAPITAL LETTER I;Lu;0;L;;;;;N;;;;2C3B;
+2C0C;GLAGOLITIC CAPITAL LETTER DJERVI;Lu;0;L;;;;;N;;;;2C3C;
+2C0D;GLAGOLITIC CAPITAL LETTER KAKO;Lu;0;L;;;;;N;;;;2C3D;
+2C0E;GLAGOLITIC CAPITAL LETTER LJUDIJE;Lu;0;L;;;;;N;;;;2C3E;
+2C0F;GLAGOLITIC CAPITAL LETTER MYSLITE;Lu;0;L;;;;;N;;;;2C3F;
+2C10;GLAGOLITIC CAPITAL LETTER NASHI;Lu;0;L;;;;;N;;;;2C40;
+2C11;GLAGOLITIC CAPITAL LETTER ONU;Lu;0;L;;;;;N;;;;2C41;
+2C12;GLAGOLITIC CAPITAL LETTER POKOJI;Lu;0;L;;;;;N;;;;2C42;
+2C13;GLAGOLITIC CAPITAL LETTER RITSI;Lu;0;L;;;;;N;;;;2C43;
+2C14;GLAGOLITIC CAPITAL LETTER SLOVO;Lu;0;L;;;;;N;;;;2C44;
+2C15;GLAGOLITIC CAPITAL LETTER TVRIDO;Lu;0;L;;;;;N;;;;2C45;
+2C16;GLAGOLITIC CAPITAL LETTER UKU;Lu;0;L;;;;;N;;;;2C46;
+2C17;GLAGOLITIC CAPITAL LETTER FRITU;Lu;0;L;;;;;N;;;;2C47;
+2C18;GLAGOLITIC CAPITAL LETTER HERU;Lu;0;L;;;;;N;;;;2C48;
+2C19;GLAGOLITIC CAPITAL LETTER OTU;Lu;0;L;;;;;N;;;;2C49;
+2C1A;GLAGOLITIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;2C4A;
+2C1B;GLAGOLITIC CAPITAL LETTER SHTA;Lu;0;L;;;;;N;;;;2C4B;
+2C1C;GLAGOLITIC CAPITAL LETTER TSI;Lu;0;L;;;;;N;;;;2C4C;
+2C1D;GLAGOLITIC CAPITAL LETTER CHRIVI;Lu;0;L;;;;;N;;;;2C4D;
+2C1E;GLAGOLITIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;2C4E;
+2C1F;GLAGOLITIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;;;;2C4F;
+2C20;GLAGOLITIC CAPITAL LETTER YERI;Lu;0;L;;;;;N;;;;2C50;
+2C21;GLAGOLITIC CAPITAL LETTER YATI;Lu;0;L;;;;;N;;;;2C51;
+2C22;GLAGOLITIC CAPITAL LETTER SPIDERY HA;Lu;0;L;;;;;N;;;;2C52;
+2C23;GLAGOLITIC CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;2C53;
+2C24;GLAGOLITIC CAPITAL LETTER SMALL YUS;Lu;0;L;;;;;N;;;;2C54;
+2C25;GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL;Lu;0;L;;;;;N;;;;2C55;
+2C26;GLAGOLITIC CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;2C56;
+2C27;GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS;Lu;0;L;;;;;N;;;;2C57;
+2C28;GLAGOLITIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;2C58;
+2C29;GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS;Lu;0;L;;;;;N;;;;2C59;
+2C2A;GLAGOLITIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;2C5A;
+2C2B;GLAGOLITIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;2C5B;
+2C2C;GLAGOLITIC CAPITAL LETTER SHTAPIC;Lu;0;L;;;;;N;;;;2C5C;
+2C2D;GLAGOLITIC CAPITAL LETTER TROKUTASTI A;Lu;0;L;;;;;N;;;;2C5D;
+2C2E;GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE;Lu;0;L;;;;;N;;;;2C5E;
+2C30;GLAGOLITIC SMALL LETTER AZU;Ll;0;L;;;;;N;;;2C00;;2C00
+2C31;GLAGOLITIC SMALL LETTER BUKY;Ll;0;L;;;;;N;;;2C01;;2C01
+2C32;GLAGOLITIC SMALL LETTER VEDE;Ll;0;L;;;;;N;;;2C02;;2C02
+2C33;GLAGOLITIC SMALL LETTER GLAGOLI;Ll;0;L;;;;;N;;;2C03;;2C03
+2C34;GLAGOLITIC SMALL LETTER DOBRO;Ll;0;L;;;;;N;;;2C04;;2C04
+2C35;GLAGOLITIC SMALL LETTER YESTU;Ll;0;L;;;;;N;;;2C05;;2C05
+2C36;GLAGOLITIC SMALL LETTER ZHIVETE;Ll;0;L;;;;;N;;;2C06;;2C06
+2C37;GLAGOLITIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;2C07;;2C07
+2C38;GLAGOLITIC SMALL LETTER ZEMLJA;Ll;0;L;;;;;N;;;2C08;;2C08
+2C39;GLAGOLITIC SMALL LETTER IZHE;Ll;0;L;;;;;N;;;2C09;;2C09
+2C3A;GLAGOLITIC SMALL LETTER INITIAL IZHE;Ll;0;L;;;;;N;;;2C0A;;2C0A
+2C3B;GLAGOLITIC SMALL LETTER I;Ll;0;L;;;;;N;;;2C0B;;2C0B
+2C3C;GLAGOLITIC SMALL LETTER DJERVI;Ll;0;L;;;;;N;;;2C0C;;2C0C
+2C3D;GLAGOLITIC SMALL LETTER KAKO;Ll;0;L;;;;;N;;;2C0D;;2C0D
+2C3E;GLAGOLITIC SMALL LETTER LJUDIJE;Ll;0;L;;;;;N;;;2C0E;;2C0E
+2C3F;GLAGOLITIC SMALL LETTER MYSLITE;Ll;0;L;;;;;N;;;2C0F;;2C0F
+2C40;GLAGOLITIC SMALL LETTER NASHI;Ll;0;L;;;;;N;;;2C10;;2C10
+2C41;GLAGOLITIC SMALL LETTER ONU;Ll;0;L;;;;;N;;;2C11;;2C11
+2C42;GLAGOLITIC SMALL LETTER POKOJI;Ll;0;L;;;;;N;;;2C12;;2C12
+2C43;GLAGOLITIC SMALL LETTER RITSI;Ll;0;L;;;;;N;;;2C13;;2C13
+2C44;GLAGOLITIC SMALL LETTER SLOVO;Ll;0;L;;;;;N;;;2C14;;2C14
+2C45;GLAGOLITIC SMALL LETTER TVRIDO;Ll;0;L;;;;;N;;;2C15;;2C15
+2C46;GLAGOLITIC SMALL LETTER UKU;Ll;0;L;;;;;N;;;2C16;;2C16
+2C47;GLAGOLITIC SMALL LETTER FRITU;Ll;0;L;;;;;N;;;2C17;;2C17
+2C48;GLAGOLITIC SMALL LETTER HERU;Ll;0;L;;;;;N;;;2C18;;2C18
+2C49;GLAGOLITIC SMALL LETTER OTU;Ll;0;L;;;;;N;;;2C19;;2C19
+2C4A;GLAGOLITIC SMALL LETTER PE;Ll;0;L;;;;;N;;;2C1A;;2C1A
+2C4B;GLAGOLITIC SMALL LETTER SHTA;Ll;0;L;;;;;N;;;2C1B;;2C1B
+2C4C;GLAGOLITIC SMALL LETTER TSI;Ll;0;L;;;;;N;;;2C1C;;2C1C
+2C4D;GLAGOLITIC SMALL LETTER CHRIVI;Ll;0;L;;;;;N;;;2C1D;;2C1D
+2C4E;GLAGOLITIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;2C1E;;2C1E
+2C4F;GLAGOLITIC SMALL LETTER YERU;Ll;0;L;;;;;N;;;2C1F;;2C1F
+2C50;GLAGOLITIC SMALL LETTER YERI;Ll;0;L;;;;;N;;;2C20;;2C20
+2C51;GLAGOLITIC SMALL LETTER YATI;Ll;0;L;;;;;N;;;2C21;;2C21
+2C52;GLAGOLITIC SMALL LETTER SPIDERY HA;Ll;0;L;;;;;N;;;2C22;;2C22
+2C53;GLAGOLITIC SMALL LETTER YU;Ll;0;L;;;;;N;;;2C23;;2C23
+2C54;GLAGOLITIC SMALL LETTER SMALL YUS;Ll;0;L;;;;;N;;;2C24;;2C24
+2C55;GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL;Ll;0;L;;;;;N;;;2C25;;2C25
+2C56;GLAGOLITIC SMALL LETTER YO;Ll;0;L;;;;;N;;;2C26;;2C26
+2C57;GLAGOLITIC SMALL LETTER IOTATED SMALL YUS;Ll;0;L;;;;;N;;;2C27;;2C27
+2C58;GLAGOLITIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;2C28;;2C28
+2C59;GLAGOLITIC SMALL LETTER IOTATED BIG YUS;Ll;0;L;;;;;N;;;2C29;;2C29
+2C5A;GLAGOLITIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;2C2A;;2C2A
+2C5B;GLAGOLITIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;2C2B;;2C2B
+2C5C;GLAGOLITIC SMALL LETTER SHTAPIC;Ll;0;L;;;;;N;;;2C2C;;2C2C
+2C5D;GLAGOLITIC SMALL LETTER TROKUTASTI A;Ll;0;L;;;;;N;;;2C2D;;2C2D
+2C5E;GLAGOLITIC SMALL LETTER LATINATE MYSLITE;Ll;0;L;;;;;N;;;2C2E;;2C2E
+2C60;LATIN CAPITAL LETTER L WITH DOUBLE BAR;Lu;0;L;;;;;N;;;;2C61;
+2C61;LATIN SMALL LETTER L WITH DOUBLE BAR;Ll;0;L;;;;;N;;;2C60;;2C60
+2C62;LATIN CAPITAL LETTER L WITH MIDDLE TILDE;Lu;0;L;;;;;N;;;;026B;
+2C63;LATIN CAPITAL LETTER P WITH STROKE;Lu;0;L;;;;;N;;;;1D7D;
+2C64;LATIN CAPITAL LETTER R WITH TAIL;Lu;0;L;;;;;N;;;;027D;
+2C65;LATIN SMALL LETTER A WITH STROKE;Ll;0;L;;;;;N;;;023A;;023A
+2C66;LATIN SMALL LETTER T WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;023E;;023E
+2C67;LATIN CAPITAL LETTER H WITH DESCENDER;Lu;0;L;;;;;N;;;;2C68;
+2C68;LATIN SMALL LETTER H WITH DESCENDER;Ll;0;L;;;;;N;;;2C67;;2C67
+2C69;LATIN CAPITAL LETTER K WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6A;
+2C6A;LATIN SMALL LETTER K WITH DESCENDER;Ll;0;L;;;;;N;;;2C69;;2C69
+2C6B;LATIN CAPITAL LETTER Z WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6C;
+2C6C;LATIN SMALL LETTER Z WITH DESCENDER;Ll;0;L;;;;;N;;;2C6B;;2C6B
+2C6D;LATIN CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;0251;
+2C6E;LATIN CAPITAL LETTER M WITH HOOK;Lu;0;L;;;;;N;;;;0271;
+2C6F;LATIN CAPITAL LETTER TURNED A;Lu;0;L;;;;;N;;;;0250;
+2C70;LATIN CAPITAL LETTER TURNED ALPHA;Lu;0;L;;;;;N;;;;0252;
+2C71;LATIN SMALL LETTER V WITH RIGHT HOOK;Ll;0;L;;;;;N;;;;;
+2C72;LATIN CAPITAL LETTER W WITH HOOK;Lu;0;L;;;;;N;;;;2C73;
+2C73;LATIN SMALL LETTER W WITH HOOK;Ll;0;L;;;;;N;;;2C72;;2C72
+2C74;LATIN SMALL LETTER V WITH CURL;Ll;0;L;;;;;N;;;;;
+2C75;LATIN CAPITAL LETTER HALF H;Lu;0;L;;;;;N;;;;2C76;
+2C76;LATIN SMALL LETTER HALF H;Ll;0;L;;;;;N;;;2C75;;2C75
+2C77;LATIN SMALL LETTER TAILLESS PHI;Ll;0;L;;;;;N;;;;;
+2C78;LATIN SMALL LETTER E WITH NOTCH;Ll;0;L;;;;;N;;;;;
+2C79;LATIN SMALL LETTER TURNED R WITH TAIL;Ll;0;L;;;;;N;;;;;
+2C7A;LATIN SMALL LETTER O WITH LOW RING INSIDE;Ll;0;L;;;;;N;;;;;
+2C7B;LATIN LETTER SMALL CAPITAL TURNED E;Ll;0;L;;;;;N;;;;;
+2C7C;LATIN SUBSCRIPT SMALL LETTER J;Lm;0;L;<sub> 006A;;;;N;;;;;
+2C7D;MODIFIER LETTER CAPITAL V;Lm;0;L;<super> 0056;;;;N;;;;;
+2C7E;LATIN CAPITAL LETTER S WITH SWASH TAIL;Lu;0;L;;;;;N;;;;023F;
+2C7F;LATIN CAPITAL LETTER Z WITH SWASH TAIL;Lu;0;L;;;;;N;;;;0240;
+2C80;COPTIC CAPITAL LETTER ALFA;Lu;0;L;;;;;N;;;;2C81;
+2C81;COPTIC SMALL LETTER ALFA;Ll;0;L;;;;;N;;;2C80;;2C80
+2C82;COPTIC CAPITAL LETTER VIDA;Lu;0;L;;;;;N;;;;2C83;
+2C83;COPTIC SMALL LETTER VIDA;Ll;0;L;;;;;N;;;2C82;;2C82
+2C84;COPTIC CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;2C85;
+2C85;COPTIC SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;2C84;;2C84
+2C86;COPTIC CAPITAL LETTER DALDA;Lu;0;L;;;;;N;;;;2C87;
+2C87;COPTIC SMALL LETTER DALDA;Ll;0;L;;;;;N;;;2C86;;2C86
+2C88;COPTIC CAPITAL LETTER EIE;Lu;0;L;;;;;N;;;;2C89;
+2C89;COPTIC SMALL LETTER EIE;Ll;0;L;;;;;N;;;2C88;;2C88
+2C8A;COPTIC CAPITAL LETTER SOU;Lu;0;L;;;;;N;;;;2C8B;
+2C8B;COPTIC SMALL LETTER SOU;Ll;0;L;;;;;N;;;2C8A;;2C8A
+2C8C;COPTIC CAPITAL LETTER ZATA;Lu;0;L;;;;;N;;;;2C8D;
+2C8D;COPTIC SMALL LETTER ZATA;Ll;0;L;;;;;N;;;2C8C;;2C8C
+2C8E;COPTIC CAPITAL LETTER HATE;Lu;0;L;;;;;N;;;;2C8F;
+2C8F;COPTIC SMALL LETTER HATE;Ll;0;L;;;;;N;;;2C8E;;2C8E
+2C90;COPTIC CAPITAL LETTER THETHE;Lu;0;L;;;;;N;;;;2C91;
+2C91;COPTIC SMALL LETTER THETHE;Ll;0;L;;;;;N;;;2C90;;2C90
+2C92;COPTIC CAPITAL LETTER IAUDA;Lu;0;L;;;;;N;;;;2C93;
+2C93;COPTIC SMALL LETTER IAUDA;Ll;0;L;;;;;N;;;2C92;;2C92
+2C94;COPTIC CAPITAL LETTER KAPA;Lu;0;L;;;;;N;;;;2C95;
+2C95;COPTIC SMALL LETTER KAPA;Ll;0;L;;;;;N;;;2C94;;2C94
+2C96;COPTIC CAPITAL LETTER LAULA;Lu;0;L;;;;;N;;;;2C97;
+2C97;COPTIC SMALL LETTER LAULA;Ll;0;L;;;;;N;;;2C96;;2C96
+2C98;COPTIC CAPITAL LETTER MI;Lu;0;L;;;;;N;;;;2C99;
+2C99;COPTIC SMALL LETTER MI;Ll;0;L;;;;;N;;;2C98;;2C98
+2C9A;COPTIC CAPITAL LETTER NI;Lu;0;L;;;;;N;;;;2C9B;
+2C9B;COPTIC SMALL LETTER NI;Ll;0;L;;;;;N;;;2C9A;;2C9A
+2C9C;COPTIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;2C9D;
+2C9D;COPTIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;2C9C;;2C9C
+2C9E;COPTIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;2C9F;
+2C9F;COPTIC SMALL LETTER O;Ll;0;L;;;;;N;;;2C9E;;2C9E
+2CA0;COPTIC CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;2CA1;
+2CA1;COPTIC SMALL LETTER PI;Ll;0;L;;;;;N;;;2CA0;;2CA0
+2CA2;COPTIC CAPITAL LETTER RO;Lu;0;L;;;;;N;;;;2CA3;
+2CA3;COPTIC SMALL LETTER RO;Ll;0;L;;;;;N;;;2CA2;;2CA2
+2CA4;COPTIC CAPITAL LETTER SIMA;Lu;0;L;;;;;N;;;;2CA5;
+2CA5;COPTIC SMALL LETTER SIMA;Ll;0;L;;;;;N;;;2CA4;;2CA4
+2CA6;COPTIC CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;2CA7;
+2CA7;COPTIC SMALL LETTER TAU;Ll;0;L;;;;;N;;;2CA6;;2CA6
+2CA8;COPTIC CAPITAL LETTER UA;Lu;0;L;;;;;N;;;;2CA9;
+2CA9;COPTIC SMALL LETTER UA;Ll;0;L;;;;;N;;;2CA8;;2CA8
+2CAA;COPTIC CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;2CAB;
+2CAB;COPTIC SMALL LETTER FI;Ll;0;L;;;;;N;;;2CAA;;2CAA
+2CAC;COPTIC CAPITAL LETTER KHI;Lu;0;L;;;;;N;;;;2CAD;
+2CAD;COPTIC SMALL LETTER KHI;Ll;0;L;;;;;N;;;2CAC;;2CAC
+2CAE;COPTIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;2CAF;
+2CAF;COPTIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;2CAE;;2CAE
+2CB0;COPTIC CAPITAL LETTER OOU;Lu;0;L;;;;;N;;;;2CB1;
+2CB1;COPTIC SMALL LETTER OOU;Ll;0;L;;;;;N;;;2CB0;;2CB0
+2CB2;COPTIC CAPITAL LETTER DIALECT-P ALEF;Lu;0;L;;;;;N;;;;2CB3;
+2CB3;COPTIC SMALL LETTER DIALECT-P ALEF;Ll;0;L;;;;;N;;;2CB2;;2CB2
+2CB4;COPTIC CAPITAL LETTER OLD COPTIC AIN;Lu;0;L;;;;;N;;;;2CB5;
+2CB5;COPTIC SMALL LETTER OLD COPTIC AIN;Ll;0;L;;;;;N;;;2CB4;;2CB4
+2CB6;COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE;Lu;0;L;;;;;N;;;;2CB7;
+2CB7;COPTIC SMALL LETTER CRYPTOGRAMMIC EIE;Ll;0;L;;;;;N;;;2CB6;;2CB6
+2CB8;COPTIC CAPITAL LETTER DIALECT-P KAPA;Lu;0;L;;;;;N;;;;2CB9;
+2CB9;COPTIC SMALL LETTER DIALECT-P KAPA;Ll;0;L;;;;;N;;;2CB8;;2CB8
+2CBA;COPTIC CAPITAL LETTER DIALECT-P NI;Lu;0;L;;;;;N;;;;2CBB;
+2CBB;COPTIC SMALL LETTER DIALECT-P NI;Ll;0;L;;;;;N;;;2CBA;;2CBA
+2CBC;COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI;Lu;0;L;;;;;N;;;;2CBD;
+2CBD;COPTIC SMALL LETTER CRYPTOGRAMMIC NI;Ll;0;L;;;;;N;;;2CBC;;2CBC
+2CBE;COPTIC CAPITAL LETTER OLD COPTIC OOU;Lu;0;L;;;;;N;;;;2CBF;
+2CBF;COPTIC SMALL LETTER OLD COPTIC OOU;Ll;0;L;;;;;N;;;2CBE;;2CBE
+2CC0;COPTIC CAPITAL LETTER SAMPI;Lu;0;L;;;;;N;;;;2CC1;
+2CC1;COPTIC SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;2CC0;;2CC0
+2CC2;COPTIC CAPITAL LETTER CROSSED SHEI;Lu;0;L;;;;;N;;;;2CC3;
+2CC3;COPTIC SMALL LETTER CROSSED SHEI;Ll;0;L;;;;;N;;;2CC2;;2CC2
+2CC4;COPTIC CAPITAL LETTER OLD COPTIC SHEI;Lu;0;L;;;;;N;;;;2CC5;
+2CC5;COPTIC SMALL LETTER OLD COPTIC SHEI;Ll;0;L;;;;;N;;;2CC4;;2CC4
+2CC6;COPTIC CAPITAL LETTER OLD COPTIC ESH;Lu;0;L;;;;;N;;;;2CC7;
+2CC7;COPTIC SMALL LETTER OLD COPTIC ESH;Ll;0;L;;;;;N;;;2CC6;;2CC6
+2CC8;COPTIC CAPITAL LETTER AKHMIMIC KHEI;Lu;0;L;;;;;N;;;;2CC9;
+2CC9;COPTIC SMALL LETTER AKHMIMIC KHEI;Ll;0;L;;;;;N;;;2CC8;;2CC8
+2CCA;COPTIC CAPITAL LETTER DIALECT-P HORI;Lu;0;L;;;;;N;;;;2CCB;
+2CCB;COPTIC SMALL LETTER DIALECT-P HORI;Ll;0;L;;;;;N;;;2CCA;;2CCA
+2CCC;COPTIC CAPITAL LETTER OLD COPTIC HORI;Lu;0;L;;;;;N;;;;2CCD;
+2CCD;COPTIC SMALL LETTER OLD COPTIC HORI;Ll;0;L;;;;;N;;;2CCC;;2CCC
+2CCE;COPTIC CAPITAL LETTER OLD COPTIC HA;Lu;0;L;;;;;N;;;;2CCF;
+2CCF;COPTIC SMALL LETTER OLD COPTIC HA;Ll;0;L;;;;;N;;;2CCE;;2CCE
+2CD0;COPTIC CAPITAL LETTER L-SHAPED HA;Lu;0;L;;;;;N;;;;2CD1;
+2CD1;COPTIC SMALL LETTER L-SHAPED HA;Ll;0;L;;;;;N;;;2CD0;;2CD0
+2CD2;COPTIC CAPITAL LETTER OLD COPTIC HEI;Lu;0;L;;;;;N;;;;2CD3;
+2CD3;COPTIC SMALL LETTER OLD COPTIC HEI;Ll;0;L;;;;;N;;;2CD2;;2CD2
+2CD4;COPTIC CAPITAL LETTER OLD COPTIC HAT;Lu;0;L;;;;;N;;;;2CD5;
+2CD5;COPTIC SMALL LETTER OLD COPTIC HAT;Ll;0;L;;;;;N;;;2CD4;;2CD4
+2CD6;COPTIC CAPITAL LETTER OLD COPTIC GANGIA;Lu;0;L;;;;;N;;;;2CD7;
+2CD7;COPTIC SMALL LETTER OLD COPTIC GANGIA;Ll;0;L;;;;;N;;;2CD6;;2CD6
+2CD8;COPTIC CAPITAL LETTER OLD COPTIC DJA;Lu;0;L;;;;;N;;;;2CD9;
+2CD9;COPTIC SMALL LETTER OLD COPTIC DJA;Ll;0;L;;;;;N;;;2CD8;;2CD8
+2CDA;COPTIC CAPITAL LETTER OLD COPTIC SHIMA;Lu;0;L;;;;;N;;;;2CDB;
+2CDB;COPTIC SMALL LETTER OLD COPTIC SHIMA;Ll;0;L;;;;;N;;;2CDA;;2CDA
+2CDC;COPTIC CAPITAL LETTER OLD NUBIAN SHIMA;Lu;0;L;;;;;N;;;;2CDD;
+2CDD;COPTIC SMALL LETTER OLD NUBIAN SHIMA;Ll;0;L;;;;;N;;;2CDC;;2CDC
+2CDE;COPTIC CAPITAL LETTER OLD NUBIAN NGI;Lu;0;L;;;;;N;;;;2CDF;
+2CDF;COPTIC SMALL LETTER OLD NUBIAN NGI;Ll;0;L;;;;;N;;;2CDE;;2CDE
+2CE0;COPTIC CAPITAL LETTER OLD NUBIAN NYI;Lu;0;L;;;;;N;;;;2CE1;
+2CE1;COPTIC SMALL LETTER OLD NUBIAN NYI;Ll;0;L;;;;;N;;;2CE0;;2CE0
+2CE2;COPTIC CAPITAL LETTER OLD NUBIAN WAU;Lu;0;L;;;;;N;;;;2CE3;
+2CE3;COPTIC SMALL LETTER OLD NUBIAN WAU;Ll;0;L;;;;;N;;;2CE2;;2CE2
+2CE4;COPTIC SYMBOL KAI;Ll;0;L;;;;;N;;;;;
+2CE5;COPTIC SYMBOL MI RO;So;0;ON;;;;;N;;;;;
+2CE6;COPTIC SYMBOL PI RO;So;0;ON;;;;;N;;;;;
+2CE7;COPTIC SYMBOL STAUROS;So;0;ON;;;;;N;;;;;
+2CE8;COPTIC SYMBOL TAU RO;So;0;ON;;;;;N;;;;;
+2CE9;COPTIC SYMBOL KHI RO;So;0;ON;;;;;N;;;;;
+2CEA;COPTIC SYMBOL SHIMA SIMA;So;0;ON;;;;;N;;;;;
+2CEB;COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI;Lu;0;L;;;;;N;;;;2CEC;
+2CEC;COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI;Ll;0;L;;;;;N;;;2CEB;;2CEB
+2CED;COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA;Lu;0;L;;;;;N;;;;2CEE;
+2CEE;COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA;Ll;0;L;;;;;N;;;2CED;;2CED
+2CEF;COPTIC COMBINING NI ABOVE;Mn;230;NSM;;;;;N;;;;;
+2CF0;COPTIC COMBINING SPIRITUS ASPER;Mn;230;NSM;;;;;N;;;;;
+2CF1;COPTIC COMBINING SPIRITUS LENIS;Mn;230;NSM;;;;;N;;;;;
+2CF2;COPTIC CAPITAL LETTER BOHAIRIC KHEI;Lu;0;L;;;;;N;;;;2CF3;
+2CF3;COPTIC SMALL LETTER BOHAIRIC KHEI;Ll;0;L;;;;;N;;;2CF2;;2CF2
+2CF9;COPTIC OLD NUBIAN FULL STOP;Po;0;ON;;;;;N;;;;;
+2CFA;COPTIC OLD NUBIAN DIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;;
+2CFB;COPTIC OLD NUBIAN INDIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;;
+2CFC;COPTIC OLD NUBIAN VERSE DIVIDER;Po;0;ON;;;;;N;;;;;
+2CFD;COPTIC FRACTION ONE HALF;No;0;ON;;;;1/2;N;;;;;
+2CFE;COPTIC FULL STOP;Po;0;ON;;;;;N;;;;;
+2CFF;COPTIC MORPHOLOGICAL DIVIDER;Po;0;ON;;;;;N;;;;;
+2D00;GEORGIAN SMALL LETTER AN;Ll;0;L;;;;;N;;;10A0;;10A0
+2D01;GEORGIAN SMALL LETTER BAN;Ll;0;L;;;;;N;;;10A1;;10A1
+2D02;GEORGIAN SMALL LETTER GAN;Ll;0;L;;;;;N;;;10A2;;10A2
+2D03;GEORGIAN SMALL LETTER DON;Ll;0;L;;;;;N;;;10A3;;10A3
+2D04;GEORGIAN SMALL LETTER EN;Ll;0;L;;;;;N;;;10A4;;10A4
+2D05;GEORGIAN SMALL LETTER VIN;Ll;0;L;;;;;N;;;10A5;;10A5
+2D06;GEORGIAN SMALL LETTER ZEN;Ll;0;L;;;;;N;;;10A6;;10A6
+2D07;GEORGIAN SMALL LETTER TAN;Ll;0;L;;;;;N;;;10A7;;10A7
+2D08;GEORGIAN SMALL LETTER IN;Ll;0;L;;;;;N;;;10A8;;10A8
+2D09;GEORGIAN SMALL LETTER KAN;Ll;0;L;;;;;N;;;10A9;;10A9
+2D0A;GEORGIAN SMALL LETTER LAS;Ll;0;L;;;;;N;;;10AA;;10AA
+2D0B;GEORGIAN SMALL LETTER MAN;Ll;0;L;;;;;N;;;10AB;;10AB
+2D0C;GEORGIAN SMALL LETTER NAR;Ll;0;L;;;;;N;;;10AC;;10AC
+2D0D;GEORGIAN SMALL LETTER ON;Ll;0;L;;;;;N;;;10AD;;10AD
+2D0E;GEORGIAN SMALL LETTER PAR;Ll;0;L;;;;;N;;;10AE;;10AE
+2D0F;GEORGIAN SMALL LETTER ZHAR;Ll;0;L;;;;;N;;;10AF;;10AF
+2D10;GEORGIAN SMALL LETTER RAE;Ll;0;L;;;;;N;;;10B0;;10B0
+2D11;GEORGIAN SMALL LETTER SAN;Ll;0;L;;;;;N;;;10B1;;10B1
+2D12;GEORGIAN SMALL LETTER TAR;Ll;0;L;;;;;N;;;10B2;;10B2
+2D13;GEORGIAN SMALL LETTER UN;Ll;0;L;;;;;N;;;10B3;;10B3
+2D14;GEORGIAN SMALL LETTER PHAR;Ll;0;L;;;;;N;;;10B4;;10B4
+2D15;GEORGIAN SMALL LETTER KHAR;Ll;0;L;;;;;N;;;10B5;;10B5
+2D16;GEORGIAN SMALL LETTER GHAN;Ll;0;L;;;;;N;;;10B6;;10B6
+2D17;GEORGIAN SMALL LETTER QAR;Ll;0;L;;;;;N;;;10B7;;10B7
+2D18;GEORGIAN SMALL LETTER SHIN;Ll;0;L;;;;;N;;;10B8;;10B8
+2D19;GEORGIAN SMALL LETTER CHIN;Ll;0;L;;;;;N;;;10B9;;10B9
+2D1A;GEORGIAN SMALL LETTER CAN;Ll;0;L;;;;;N;;;10BA;;10BA
+2D1B;GEORGIAN SMALL LETTER JIL;Ll;0;L;;;;;N;;;10BB;;10BB
+2D1C;GEORGIAN SMALL LETTER CIL;Ll;0;L;;;;;N;;;10BC;;10BC
+2D1D;GEORGIAN SMALL LETTER CHAR;Ll;0;L;;;;;N;;;10BD;;10BD
+2D1E;GEORGIAN SMALL LETTER XAN;Ll;0;L;;;;;N;;;10BE;;10BE
+2D1F;GEORGIAN SMALL LETTER JHAN;Ll;0;L;;;;;N;;;10BF;;10BF
+2D20;GEORGIAN SMALL LETTER HAE;Ll;0;L;;;;;N;;;10C0;;10C0
+2D21;GEORGIAN SMALL LETTER HE;Ll;0;L;;;;;N;;;10C1;;10C1
+2D22;GEORGIAN SMALL LETTER HIE;Ll;0;L;;;;;N;;;10C2;;10C2
+2D23;GEORGIAN SMALL LETTER WE;Ll;0;L;;;;;N;;;10C3;;10C3
+2D24;GEORGIAN SMALL LETTER HAR;Ll;0;L;;;;;N;;;10C4;;10C4
+2D25;GEORGIAN SMALL LETTER HOE;Ll;0;L;;;;;N;;;10C5;;10C5
+2D27;GEORGIAN SMALL LETTER YN;Ll;0;L;;;;;N;;;10C7;;10C7
+2D2D;GEORGIAN SMALL LETTER AEN;Ll;0;L;;;;;N;;;10CD;;10CD
+2D30;TIFINAGH LETTER YA;Lo;0;L;;;;;N;;;;;
+2D31;TIFINAGH LETTER YAB;Lo;0;L;;;;;N;;;;;
+2D32;TIFINAGH LETTER YABH;Lo;0;L;;;;;N;;;;;
+2D33;TIFINAGH LETTER YAG;Lo;0;L;;;;;N;;;;;
+2D34;TIFINAGH LETTER YAGHH;Lo;0;L;;;;;N;;;;;
+2D35;TIFINAGH LETTER BERBER ACADEMY YAJ;Lo;0;L;;;;;N;;;;;
+2D36;TIFINAGH LETTER YAJ;Lo;0;L;;;;;N;;;;;
+2D37;TIFINAGH LETTER YAD;Lo;0;L;;;;;N;;;;;
+2D38;TIFINAGH LETTER YADH;Lo;0;L;;;;;N;;;;;
+2D39;TIFINAGH LETTER YADD;Lo;0;L;;;;;N;;;;;
+2D3A;TIFINAGH LETTER YADDH;Lo;0;L;;;;;N;;;;;
+2D3B;TIFINAGH LETTER YEY;Lo;0;L;;;;;N;;;;;
+2D3C;TIFINAGH LETTER YAF;Lo;0;L;;;;;N;;;;;
+2D3D;TIFINAGH LETTER YAK;Lo;0;L;;;;;N;;;;;
+2D3E;TIFINAGH LETTER TUAREG YAK;Lo;0;L;;;;;N;;;;;
+2D3F;TIFINAGH LETTER YAKHH;Lo;0;L;;;;;N;;;;;
+2D40;TIFINAGH LETTER YAH;Lo;0;L;;;;;N;;;;;
+2D41;TIFINAGH LETTER BERBER ACADEMY YAH;Lo;0;L;;;;;N;;;;;
+2D42;TIFINAGH LETTER TUAREG YAH;Lo;0;L;;;;;N;;;;;
+2D43;TIFINAGH LETTER YAHH;Lo;0;L;;;;;N;;;;;
+2D44;TIFINAGH LETTER YAA;Lo;0;L;;;;;N;;;;;
+2D45;TIFINAGH LETTER YAKH;Lo;0;L;;;;;N;;;;;
+2D46;TIFINAGH LETTER TUAREG YAKH;Lo;0;L;;;;;N;;;;;
+2D47;TIFINAGH LETTER YAQ;Lo;0;L;;;;;N;;;;;
+2D48;TIFINAGH LETTER TUAREG YAQ;Lo;0;L;;;;;N;;;;;
+2D49;TIFINAGH LETTER YI;Lo;0;L;;;;;N;;;;;
+2D4A;TIFINAGH LETTER YAZH;Lo;0;L;;;;;N;;;;;
+2D4B;TIFINAGH LETTER AHAGGAR YAZH;Lo;0;L;;;;;N;;;;;
+2D4C;TIFINAGH LETTER TUAREG YAZH;Lo;0;L;;;;;N;;;;;
+2D4D;TIFINAGH LETTER YAL;Lo;0;L;;;;;N;;;;;
+2D4E;TIFINAGH LETTER YAM;Lo;0;L;;;;;N;;;;;
+2D4F;TIFINAGH LETTER YAN;Lo;0;L;;;;;N;;;;;
+2D50;TIFINAGH LETTER TUAREG YAGN;Lo;0;L;;;;;N;;;;;
+2D51;TIFINAGH LETTER TUAREG YANG;Lo;0;L;;;;;N;;;;;
+2D52;TIFINAGH LETTER YAP;Lo;0;L;;;;;N;;;;;
+2D53;TIFINAGH LETTER YU;Lo;0;L;;;;;N;;;;;
+2D54;TIFINAGH LETTER YAR;Lo;0;L;;;;;N;;;;;
+2D55;TIFINAGH LETTER YARR;Lo;0;L;;;;;N;;;;;
+2D56;TIFINAGH LETTER YAGH;Lo;0;L;;;;;N;;;;;
+2D57;TIFINAGH LETTER TUAREG YAGH;Lo;0;L;;;;;N;;;;;
+2D58;TIFINAGH LETTER AYER YAGH;Lo;0;L;;;;;N;;;;;
+2D59;TIFINAGH LETTER YAS;Lo;0;L;;;;;N;;;;;
+2D5A;TIFINAGH LETTER YASS;Lo;0;L;;;;;N;;;;;
+2D5B;TIFINAGH LETTER YASH;Lo;0;L;;;;;N;;;;;
+2D5C;TIFINAGH LETTER YAT;Lo;0;L;;;;;N;;;;;
+2D5D;TIFINAGH LETTER YATH;Lo;0;L;;;;;N;;;;;
+2D5E;TIFINAGH LETTER YACH;Lo;0;L;;;;;N;;;;;
+2D5F;TIFINAGH LETTER YATT;Lo;0;L;;;;;N;;;;;
+2D60;TIFINAGH LETTER YAV;Lo;0;L;;;;;N;;;;;
+2D61;TIFINAGH LETTER YAW;Lo;0;L;;;;;N;;;;;
+2D62;TIFINAGH LETTER YAY;Lo;0;L;;;;;N;;;;;
+2D63;TIFINAGH LETTER YAZ;Lo;0;L;;;;;N;;;;;
+2D64;TIFINAGH LETTER TAWELLEMET YAZ;Lo;0;L;;;;;N;;;;;
+2D65;TIFINAGH LETTER YAZZ;Lo;0;L;;;;;N;;;;;
+2D66;TIFINAGH LETTER YE;Lo;0;L;;;;;N;;;;;
+2D67;TIFINAGH LETTER YO;Lo;0;L;;;;;N;;;;;
+2D6F;TIFINAGH MODIFIER LETTER LABIALIZATION MARK;Lm;0;L;<super> 2D61;;;;N;;;;;
+2D70;TIFINAGH SEPARATOR MARK;Po;0;L;;;;;N;;;;;
+2D7F;TIFINAGH CONSONANT JOINER;Mn;9;NSM;;;;;N;;;;;
+2D80;ETHIOPIC SYLLABLE LOA;Lo;0;L;;;;;N;;;;;
+2D81;ETHIOPIC SYLLABLE MOA;Lo;0;L;;;;;N;;;;;
+2D82;ETHIOPIC SYLLABLE ROA;Lo;0;L;;;;;N;;;;;
+2D83;ETHIOPIC SYLLABLE SOA;Lo;0;L;;;;;N;;;;;
+2D84;ETHIOPIC SYLLABLE SHOA;Lo;0;L;;;;;N;;;;;
+2D85;ETHIOPIC SYLLABLE BOA;Lo;0;L;;;;;N;;;;;
+2D86;ETHIOPIC SYLLABLE TOA;Lo;0;L;;;;;N;;;;;
+2D87;ETHIOPIC SYLLABLE COA;Lo;0;L;;;;;N;;;;;
+2D88;ETHIOPIC SYLLABLE NOA;Lo;0;L;;;;;N;;;;;
+2D89;ETHIOPIC SYLLABLE NYOA;Lo;0;L;;;;;N;;;;;
+2D8A;ETHIOPIC SYLLABLE GLOTTAL OA;Lo;0;L;;;;;N;;;;;
+2D8B;ETHIOPIC SYLLABLE ZOA;Lo;0;L;;;;;N;;;;;
+2D8C;ETHIOPIC SYLLABLE DOA;Lo;0;L;;;;;N;;;;;
+2D8D;ETHIOPIC SYLLABLE DDOA;Lo;0;L;;;;;N;;;;;
+2D8E;ETHIOPIC SYLLABLE JOA;Lo;0;L;;;;;N;;;;;
+2D8F;ETHIOPIC SYLLABLE THOA;Lo;0;L;;;;;N;;;;;
+2D90;ETHIOPIC SYLLABLE CHOA;Lo;0;L;;;;;N;;;;;
+2D91;ETHIOPIC SYLLABLE PHOA;Lo;0;L;;;;;N;;;;;
+2D92;ETHIOPIC SYLLABLE POA;Lo;0;L;;;;;N;;;;;
+2D93;ETHIOPIC SYLLABLE GGWA;Lo;0;L;;;;;N;;;;;
+2D94;ETHIOPIC SYLLABLE GGWI;Lo;0;L;;;;;N;;;;;
+2D95;ETHIOPIC SYLLABLE GGWEE;Lo;0;L;;;;;N;;;;;
+2D96;ETHIOPIC SYLLABLE GGWE;Lo;0;L;;;;;N;;;;;
+2DA0;ETHIOPIC SYLLABLE SSA;Lo;0;L;;;;;N;;;;;
+2DA1;ETHIOPIC SYLLABLE SSU;Lo;0;L;;;;;N;;;;;
+2DA2;ETHIOPIC SYLLABLE SSI;Lo;0;L;;;;;N;;;;;
+2DA3;ETHIOPIC SYLLABLE SSAA;Lo;0;L;;;;;N;;;;;
+2DA4;ETHIOPIC SYLLABLE SSEE;Lo;0;L;;;;;N;;;;;
+2DA5;ETHIOPIC SYLLABLE SSE;Lo;0;L;;;;;N;;;;;
+2DA6;ETHIOPIC SYLLABLE SSO;Lo;0;L;;;;;N;;;;;
+2DA8;ETHIOPIC SYLLABLE CCA;Lo;0;L;;;;;N;;;;;
+2DA9;ETHIOPIC SYLLABLE CCU;Lo;0;L;;;;;N;;;;;
+2DAA;ETHIOPIC SYLLABLE CCI;Lo;0;L;;;;;N;;;;;
+2DAB;ETHIOPIC SYLLABLE CCAA;Lo;0;L;;;;;N;;;;;
+2DAC;ETHIOPIC SYLLABLE CCEE;Lo;0;L;;;;;N;;;;;
+2DAD;ETHIOPIC SYLLABLE CCE;Lo;0;L;;;;;N;;;;;
+2DAE;ETHIOPIC SYLLABLE CCO;Lo;0;L;;;;;N;;;;;
+2DB0;ETHIOPIC SYLLABLE ZZA;Lo;0;L;;;;;N;;;;;
+2DB1;ETHIOPIC SYLLABLE ZZU;Lo;0;L;;;;;N;;;;;
+2DB2;ETHIOPIC SYLLABLE ZZI;Lo;0;L;;;;;N;;;;;
+2DB3;ETHIOPIC SYLLABLE ZZAA;Lo;0;L;;;;;N;;;;;
+2DB4;ETHIOPIC SYLLABLE ZZEE;Lo;0;L;;;;;N;;;;;
+2DB5;ETHIOPIC SYLLABLE ZZE;Lo;0;L;;;;;N;;;;;
+2DB6;ETHIOPIC SYLLABLE ZZO;Lo;0;L;;;;;N;;;;;
+2DB8;ETHIOPIC SYLLABLE CCHA;Lo;0;L;;;;;N;;;;;
+2DB9;ETHIOPIC SYLLABLE CCHU;Lo;0;L;;;;;N;;;;;
+2DBA;ETHIOPIC SYLLABLE CCHI;Lo;0;L;;;;;N;;;;;
+2DBB;ETHIOPIC SYLLABLE CCHAA;Lo;0;L;;;;;N;;;;;
+2DBC;ETHIOPIC SYLLABLE CCHEE;Lo;0;L;;;;;N;;;;;
+2DBD;ETHIOPIC SYLLABLE CCHE;Lo;0;L;;;;;N;;;;;
+2DBE;ETHIOPIC SYLLABLE CCHO;Lo;0;L;;;;;N;;;;;
+2DC0;ETHIOPIC SYLLABLE QYA;Lo;0;L;;;;;N;;;;;
+2DC1;ETHIOPIC SYLLABLE QYU;Lo;0;L;;;;;N;;;;;
+2DC2;ETHIOPIC SYLLABLE QYI;Lo;0;L;;;;;N;;;;;
+2DC3;ETHIOPIC SYLLABLE QYAA;Lo;0;L;;;;;N;;;;;
+2DC4;ETHIOPIC SYLLABLE QYEE;Lo;0;L;;;;;N;;;;;
+2DC5;ETHIOPIC SYLLABLE QYE;Lo;0;L;;;;;N;;;;;
+2DC6;ETHIOPIC SYLLABLE QYO;Lo;0;L;;;;;N;;;;;
+2DC8;ETHIOPIC SYLLABLE KYA;Lo;0;L;;;;;N;;;;;
+2DC9;ETHIOPIC SYLLABLE KYU;Lo;0;L;;;;;N;;;;;
+2DCA;ETHIOPIC SYLLABLE KYI;Lo;0;L;;;;;N;;;;;
+2DCB;ETHIOPIC SYLLABLE KYAA;Lo;0;L;;;;;N;;;;;
+2DCC;ETHIOPIC SYLLABLE KYEE;Lo;0;L;;;;;N;;;;;
+2DCD;ETHIOPIC SYLLABLE KYE;Lo;0;L;;;;;N;;;;;
+2DCE;ETHIOPIC SYLLABLE KYO;Lo;0;L;;;;;N;;;;;
+2DD0;ETHIOPIC SYLLABLE XYA;Lo;0;L;;;;;N;;;;;
+2DD1;ETHIOPIC SYLLABLE XYU;Lo;0;L;;;;;N;;;;;
+2DD2;ETHIOPIC SYLLABLE XYI;Lo;0;L;;;;;N;;;;;
+2DD3;ETHIOPIC SYLLABLE XYAA;Lo;0;L;;;;;N;;;;;
+2DD4;ETHIOPIC SYLLABLE XYEE;Lo;0;L;;;;;N;;;;;
+2DD5;ETHIOPIC SYLLABLE XYE;Lo;0;L;;;;;N;;;;;
+2DD6;ETHIOPIC SYLLABLE XYO;Lo;0;L;;;;;N;;;;;
+2DD8;ETHIOPIC SYLLABLE GYA;Lo;0;L;;;;;N;;;;;
+2DD9;ETHIOPIC SYLLABLE GYU;Lo;0;L;;;;;N;;;;;
+2DDA;ETHIOPIC SYLLABLE GYI;Lo;0;L;;;;;N;;;;;
+2DDB;ETHIOPIC SYLLABLE GYAA;Lo;0;L;;;;;N;;;;;
+2DDC;ETHIOPIC SYLLABLE GYEE;Lo;0;L;;;;;N;;;;;
+2DDD;ETHIOPIC SYLLABLE GYE;Lo;0;L;;;;;N;;;;;
+2DDE;ETHIOPIC SYLLABLE GYO;Lo;0;L;;;;;N;;;;;
+2DE0;COMBINING CYRILLIC LETTER BE;Mn;230;NSM;;;;;N;;;;;
+2DE1;COMBINING CYRILLIC LETTER VE;Mn;230;NSM;;;;;N;;;;;
+2DE2;COMBINING CYRILLIC LETTER GHE;Mn;230;NSM;;;;;N;;;;;
+2DE3;COMBINING CYRILLIC LETTER DE;Mn;230;NSM;;;;;N;;;;;
+2DE4;COMBINING CYRILLIC LETTER ZHE;Mn;230;NSM;;;;;N;;;;;
+2DE5;COMBINING CYRILLIC LETTER ZE;Mn;230;NSM;;;;;N;;;;;
+2DE6;COMBINING CYRILLIC LETTER KA;Mn;230;NSM;;;;;N;;;;;
+2DE7;COMBINING CYRILLIC LETTER EL;Mn;230;NSM;;;;;N;;;;;
+2DE8;COMBINING CYRILLIC LETTER EM;Mn;230;NSM;;;;;N;;;;;
+2DE9;COMBINING CYRILLIC LETTER EN;Mn;230;NSM;;;;;N;;;;;
+2DEA;COMBINING CYRILLIC LETTER O;Mn;230;NSM;;;;;N;;;;;
+2DEB;COMBINING CYRILLIC LETTER PE;Mn;230;NSM;;;;;N;;;;;
+2DEC;COMBINING CYRILLIC LETTER ER;Mn;230;NSM;;;;;N;;;;;
+2DED;COMBINING CYRILLIC LETTER ES;Mn;230;NSM;;;;;N;;;;;
+2DEE;COMBINING CYRILLIC LETTER TE;Mn;230;NSM;;;;;N;;;;;
+2DEF;COMBINING CYRILLIC LETTER HA;Mn;230;NSM;;;;;N;;;;;
+2DF0;COMBINING CYRILLIC LETTER TSE;Mn;230;NSM;;;;;N;;;;;
+2DF1;COMBINING CYRILLIC LETTER CHE;Mn;230;NSM;;;;;N;;;;;
+2DF2;COMBINING CYRILLIC LETTER SHA;Mn;230;NSM;;;;;N;;;;;
+2DF3;COMBINING CYRILLIC LETTER SHCHA;Mn;230;NSM;;;;;N;;;;;
+2DF4;COMBINING CYRILLIC LETTER FITA;Mn;230;NSM;;;;;N;;;;;
+2DF5;COMBINING CYRILLIC LETTER ES-TE;Mn;230;NSM;;;;;N;;;;;
+2DF6;COMBINING CYRILLIC LETTER A;Mn;230;NSM;;;;;N;;;;;
+2DF7;COMBINING CYRILLIC LETTER IE;Mn;230;NSM;;;;;N;;;;;
+2DF8;COMBINING CYRILLIC LETTER DJERV;Mn;230;NSM;;;;;N;;;;;
+2DF9;COMBINING CYRILLIC LETTER MONOGRAPH UK;Mn;230;NSM;;;;;N;;;;;
+2DFA;COMBINING CYRILLIC LETTER YAT;Mn;230;NSM;;;;;N;;;;;
+2DFB;COMBINING CYRILLIC LETTER YU;Mn;230;NSM;;;;;N;;;;;
+2DFC;COMBINING CYRILLIC LETTER IOTIFIED A;Mn;230;NSM;;;;;N;;;;;
+2DFD;COMBINING CYRILLIC LETTER LITTLE YUS;Mn;230;NSM;;;;;N;;;;;
+2DFE;COMBINING CYRILLIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;;
+2DFF;COMBINING CYRILLIC LETTER IOTIFIED BIG YUS;Mn;230;NSM;;;;;N;;;;;
+2E00;RIGHT ANGLE SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;;
+2E01;RIGHT ANGLE DOTTED SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;;
+2E02;LEFT SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E03;RIGHT SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E04;LEFT DOTTED SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E05;RIGHT DOTTED SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E06;RAISED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;;
+2E07;RAISED DOTTED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;;
+2E08;DOTTED TRANSPOSITION MARKER;Po;0;ON;;;;;N;;;;;
+2E09;LEFT TRANSPOSITION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E0A;RIGHT TRANSPOSITION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E0B;RAISED SQUARE;Po;0;ON;;;;;N;;;;;
+2E0C;LEFT RAISED OMISSION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E0D;RIGHT RAISED OMISSION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E0E;EDITORIAL CORONIS;Po;0;ON;;;;;N;;;;;
+2E0F;PARAGRAPHOS;Po;0;ON;;;;;N;;;;;
+2E10;FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;;
+2E11;REVERSED FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;;
+2E12;HYPODIASTOLE;Po;0;ON;;;;;N;;;;;
+2E13;DOTTED OBELOS;Po;0;ON;;;;;N;;;;;
+2E14;DOWNWARDS ANCORA;Po;0;ON;;;;;N;;;;;
+2E15;UPWARDS ANCORA;Po;0;ON;;;;;N;;;;;
+2E16;DOTTED RIGHT-POINTING ANGLE;Po;0;ON;;;;;N;;;;;
+2E17;DOUBLE OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;;
+2E18;INVERTED INTERROBANG;Po;0;ON;;;;;N;;;;;
+2E19;PALM BRANCH;Po;0;ON;;;;;N;;;;;
+2E1A;HYPHEN WITH DIAERESIS;Pd;0;ON;;;;;N;;;;;
+2E1B;TILDE WITH RING ABOVE;Po;0;ON;;;;;N;;;;;
+2E1C;LEFT LOW PARAPHRASE BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E1D;RIGHT LOW PARAPHRASE BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E1E;TILDE WITH DOT ABOVE;Po;0;ON;;;;;N;;;;;
+2E1F;TILDE WITH DOT BELOW;Po;0;ON;;;;;N;;;;;
+2E20;LEFT VERTICAL BAR WITH QUILL;Pi;0;ON;;;;;Y;;;;;
+2E21;RIGHT VERTICAL BAR WITH QUILL;Pf;0;ON;;;;;Y;;;;;
+2E22;TOP LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;;
+2E23;TOP RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;;
+2E24;BOTTOM LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;;
+2E25;BOTTOM RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;;
+2E26;LEFT SIDEWAYS U BRACKET;Ps;0;ON;;;;;Y;;;;;
+2E27;RIGHT SIDEWAYS U BRACKET;Pe;0;ON;;;;;Y;;;;;
+2E28;LEFT DOUBLE PARENTHESIS;Ps;0;ON;;;;;Y;;;;;
+2E29;RIGHT DOUBLE PARENTHESIS;Pe;0;ON;;;;;Y;;;;;
+2E2A;TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2E2B;ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2E2C;SQUARED FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2E2D;FIVE DOT MARK;Po;0;ON;;;;;N;;;;;
+2E2E;REVERSED QUESTION MARK;Po;0;ON;;;;;N;;;;;
+2E2F;VERTICAL TILDE;Lm;0;ON;;;;;N;;;;;
+2E30;RING POINT;Po;0;ON;;;;;N;;;;;
+2E31;WORD SEPARATOR MIDDLE DOT;Po;0;ON;;;;;N;;;;;
+2E32;TURNED COMMA;Po;0;ON;;;;;N;;;;;
+2E33;RAISED DOT;Po;0;ON;;;;;N;;;;;
+2E34;RAISED COMMA;Po;0;ON;;;;;N;;;;;
+2E35;TURNED SEMICOLON;Po;0;ON;;;;;N;;;;;
+2E36;DAGGER WITH LEFT GUARD;Po;0;ON;;;;;N;;;;;
+2E37;DAGGER WITH RIGHT GUARD;Po;0;ON;;;;;N;;;;;
+2E38;TURNED DAGGER;Po;0;ON;;;;;N;;;;;
+2E39;TOP HALF SECTION SIGN;Po;0;ON;;;;;N;;;;;
+2E3A;TWO-EM DASH;Pd;0;ON;;;;;N;;;;;
+2E3B;THREE-EM DASH;Pd;0;ON;;;;;N;;;;;
+2E3C;STENOGRAPHIC FULL STOP;Po;0;ON;;;;;N;;;;;
+2E3D;VERTICAL SIX DOTS;Po;0;ON;;;;;N;;;;;
+2E3E;WIGGLY VERTICAL LINE;Po;0;ON;;;;;N;;;;;
+2E3F;CAPITULUM;Po;0;ON;;;;;N;;;;;
+2E40;DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;;
+2E41;REVERSED COMMA;Po;0;ON;;;;;N;;;;;
+2E42;DOUBLE LOW-REVERSED-9 QUOTATION MARK;Ps;0;ON;;;;;N;;;;;
+2E43;DASH WITH LEFT UPTURN;Po;0;ON;;;;;N;;;;;
+2E44;DOUBLE SUSPENSION MARK;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;;;;;
+2E83;CJK RADICAL SECOND TWO;So;0;ON;;;;;N;;;;;
+2E84;CJK RADICAL SECOND THREE;So;0;ON;;;;;N;;;;;
+2E85;CJK RADICAL PERSON;So;0;ON;;;;;N;;;;;
+2E86;CJK RADICAL BOX;So;0;ON;;;;;N;;;;;
+2E87;CJK RADICAL TABLE;So;0;ON;;;;;N;;;;;
+2E88;CJK RADICAL KNIFE ONE;So;0;ON;;;;;N;;;;;
+2E89;CJK RADICAL KNIFE TWO;So;0;ON;;;;;N;;;;;
+2E8A;CJK RADICAL DIVINATION;So;0;ON;;;;;N;;;;;
+2E8B;CJK RADICAL SEAL;So;0;ON;;;;;N;;;;;
+2E8C;CJK RADICAL SMALL ONE;So;0;ON;;;;;N;;;;;
+2E8D;CJK RADICAL SMALL TWO;So;0;ON;;;;;N;;;;;
+2E8E;CJK RADICAL LAME ONE;So;0;ON;;;;;N;;;;;
+2E8F;CJK RADICAL LAME TWO;So;0;ON;;;;;N;;;;;
+2E90;CJK RADICAL LAME THREE;So;0;ON;;;;;N;;;;;
+2E91;CJK RADICAL LAME FOUR;So;0;ON;;;;;N;;;;;
+2E92;CJK RADICAL SNAKE;So;0;ON;;;;;N;;;;;
+2E93;CJK RADICAL THREAD;So;0;ON;;;;;N;;;;;
+2E94;CJK RADICAL SNOUT ONE;So;0;ON;;;;;N;;;;;
+2E95;CJK RADICAL SNOUT TWO;So;0;ON;;;;;N;;;;;
+2E96;CJK RADICAL HEART ONE;So;0;ON;;;;;N;;;;;
+2E97;CJK RADICAL HEART TWO;So;0;ON;;;;;N;;;;;
+2E98;CJK RADICAL HAND;So;0;ON;;;;;N;;;;;
+2E99;CJK RADICAL RAP;So;0;ON;;;;;N;;;;;
+2E9B;CJK RADICAL CHOKE;So;0;ON;;;;;N;;;;;
+2E9C;CJK RADICAL SUN;So;0;ON;;;;;N;;;;;
+2E9D;CJK RADICAL MOON;So;0;ON;;;;;N;;;;;
+2E9E;CJK RADICAL DEATH;So;0;ON;;;;;N;;;;;
+2E9F;CJK RADICAL MOTHER;So;0;ON;<compat> 6BCD;;;;N;;;;;
+2EA0;CJK RADICAL CIVILIAN;So;0;ON;;;;;N;;;;;
+2EA1;CJK RADICAL WATER ONE;So;0;ON;;;;;N;;;;;
+2EA2;CJK RADICAL WATER TWO;So;0;ON;;;;;N;;;;;
+2EA3;CJK RADICAL FIRE;So;0;ON;;;;;N;;;;;
+2EA4;CJK RADICAL PAW ONE;So;0;ON;;;;;N;;;;;
+2EA5;CJK RADICAL PAW TWO;So;0;ON;;;;;N;;;;;
+2EA6;CJK RADICAL SIMPLIFIED HALF TREE TRUNK;So;0;ON;;;;;N;;;;;
+2EA7;CJK RADICAL COW;So;0;ON;;;;;N;;;;;
+2EA8;CJK RADICAL DOG;So;0;ON;;;;;N;;;;;
+2EA9;CJK RADICAL JADE;So;0;ON;;;;;N;;;;;
+2EAA;CJK RADICAL BOLT OF CLOTH;So;0;ON;;;;;N;;;;;
+2EAB;CJK RADICAL EYE;So;0;ON;;;;;N;;;;;
+2EAC;CJK RADICAL SPIRIT ONE;So;0;ON;;;;;N;;;;;
+2EAD;CJK RADICAL SPIRIT TWO;So;0;ON;;;;;N;;;;;
+2EAE;CJK RADICAL BAMBOO;So;0;ON;;;;;N;;;;;
+2EAF;CJK RADICAL SILK;So;0;ON;;;;;N;;;;;
+2EB0;CJK RADICAL C-SIMPLIFIED SILK;So;0;ON;;;;;N;;;;;
+2EB1;CJK RADICAL NET ONE;So;0;ON;;;;;N;;;;;
+2EB2;CJK RADICAL NET TWO;So;0;ON;;;;;N;;;;;
+2EB3;CJK RADICAL NET THREE;So;0;ON;;;;;N;;;;;
+2EB4;CJK RADICAL NET FOUR;So;0;ON;;;;;N;;;;;
+2EB5;CJK RADICAL MESH;So;0;ON;;;;;N;;;;;
+2EB6;CJK RADICAL SHEEP;So;0;ON;;;;;N;;;;;
+2EB7;CJK RADICAL RAM;So;0;ON;;;;;N;;;;;
+2EB8;CJK RADICAL EWE;So;0;ON;;;;;N;;;;;
+2EB9;CJK RADICAL OLD;So;0;ON;;;;;N;;;;;
+2EBA;CJK RADICAL BRUSH ONE;So;0;ON;;;;;N;;;;;
+2EBB;CJK RADICAL BRUSH TWO;So;0;ON;;;;;N;;;;;
+2EBC;CJK RADICAL MEAT;So;0;ON;;;;;N;;;;;
+2EBD;CJK RADICAL MORTAR;So;0;ON;;;;;N;;;;;
+2EBE;CJK RADICAL GRASS ONE;So;0;ON;;;;;N;;;;;
+2EBF;CJK RADICAL GRASS TWO;So;0;ON;;;;;N;;;;;
+2EC0;CJK RADICAL GRASS THREE;So;0;ON;;;;;N;;;;;
+2EC1;CJK RADICAL TIGER;So;0;ON;;;;;N;;;;;
+2EC2;CJK RADICAL CLOTHES;So;0;ON;;;;;N;;;;;
+2EC3;CJK RADICAL WEST ONE;So;0;ON;;;;;N;;;;;
+2EC4;CJK RADICAL WEST TWO;So;0;ON;;;;;N;;;;;
+2EC5;CJK RADICAL C-SIMPLIFIED SEE;So;0;ON;;;;;N;;;;;
+2EC6;CJK RADICAL SIMPLIFIED HORN;So;0;ON;;;;;N;;;;;
+2EC7;CJK RADICAL HORN;So;0;ON;;;;;N;;;;;
+2EC8;CJK RADICAL C-SIMPLIFIED SPEECH;So;0;ON;;;;;N;;;;;
+2EC9;CJK RADICAL C-SIMPLIFIED SHELL;So;0;ON;;;;;N;;;;;
+2ECA;CJK RADICAL FOOT;So;0;ON;;;;;N;;;;;
+2ECB;CJK RADICAL C-SIMPLIFIED CART;So;0;ON;;;;;N;;;;;
+2ECC;CJK RADICAL SIMPLIFIED WALK;So;0;ON;;;;;N;;;;;
+2ECD;CJK RADICAL WALK ONE;So;0;ON;;;;;N;;;;;
+2ECE;CJK RADICAL WALK TWO;So;0;ON;;;;;N;;;;;
+2ECF;CJK RADICAL CITY;So;0;ON;;;;;N;;;;;
+2ED0;CJK RADICAL C-SIMPLIFIED GOLD;So;0;ON;;;;;N;;;;;
+2ED1;CJK RADICAL LONG ONE;So;0;ON;;;;;N;;;;;
+2ED2;CJK RADICAL LONG TWO;So;0;ON;;;;;N;;;;;
+2ED3;CJK RADICAL C-SIMPLIFIED LONG;So;0;ON;;;;;N;;;;;
+2ED4;CJK RADICAL C-SIMPLIFIED GATE;So;0;ON;;;;;N;;;;;
+2ED5;CJK RADICAL MOUND ONE;So;0;ON;;;;;N;;;;;
+2ED6;CJK RADICAL MOUND TWO;So;0;ON;;;;;N;;;;;
+2ED7;CJK RADICAL RAIN;So;0;ON;;;;;N;;;;;
+2ED8;CJK RADICAL BLUE;So;0;ON;;;;;N;;;;;
+2ED9;CJK RADICAL C-SIMPLIFIED TANNED LEATHER;So;0;ON;;;;;N;;;;;
+2EDA;CJK RADICAL C-SIMPLIFIED LEAF;So;0;ON;;;;;N;;;;;
+2EDB;CJK RADICAL C-SIMPLIFIED WIND;So;0;ON;;;;;N;;;;;
+2EDC;CJK RADICAL C-SIMPLIFIED FLY;So;0;ON;;;;;N;;;;;
+2EDD;CJK RADICAL EAT ONE;So;0;ON;;;;;N;;;;;
+2EDE;CJK RADICAL EAT TWO;So;0;ON;;;;;N;;;;;
+2EDF;CJK RADICAL EAT THREE;So;0;ON;;;;;N;;;;;
+2EE0;CJK RADICAL C-SIMPLIFIED EAT;So;0;ON;;;;;N;;;;;
+2EE1;CJK RADICAL HEAD;So;0;ON;;;;;N;;;;;
+2EE2;CJK RADICAL C-SIMPLIFIED HORSE;So;0;ON;;;;;N;;;;;
+2EE3;CJK RADICAL BONE;So;0;ON;;;;;N;;;;;
+2EE4;CJK RADICAL GHOST;So;0;ON;;;;;N;;;;;
+2EE5;CJK RADICAL C-SIMPLIFIED FISH;So;0;ON;;;;;N;;;;;
+2EE6;CJK RADICAL C-SIMPLIFIED BIRD;So;0;ON;;;;;N;;;;;
+2EE7;CJK RADICAL C-SIMPLIFIED SALT;So;0;ON;;;;;N;;;;;
+2EE8;CJK RADICAL SIMPLIFIED WHEAT;So;0;ON;;;;;N;;;;;
+2EE9;CJK RADICAL SIMPLIFIED YELLOW;So;0;ON;;;;;N;;;;;
+2EEA;CJK RADICAL C-SIMPLIFIED FROG;So;0;ON;;;;;N;;;;;
+2EEB;CJK RADICAL J-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;;
+2EEC;CJK RADICAL C-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;;
+2EED;CJK RADICAL J-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;;
+2EEE;CJK RADICAL C-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;;
+2EEF;CJK RADICAL J-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;;
+2EF0;CJK RADICAL C-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;;
+2EF1;CJK RADICAL TURTLE;So;0;ON;;;;;N;;;;;
+2EF2;CJK RADICAL J-SIMPLIFIED TURTLE;So;0;ON;;;;;N;;;;;
+2EF3;CJK RADICAL C-SIMPLIFIED TURTLE;So;0;ON;<compat> 9F9F;;;;N;;;;;
+2F00;KANGXI RADICAL ONE;So;0;ON;<compat> 4E00;;;;N;;;;;
+2F01;KANGXI RADICAL LINE;So;0;ON;<compat> 4E28;;;;N;;;;;
+2F02;KANGXI RADICAL DOT;So;0;ON;<compat> 4E36;;;;N;;;;;
+2F03;KANGXI RADICAL SLASH;So;0;ON;<compat> 4E3F;;;;N;;;;;
+2F04;KANGXI RADICAL SECOND;So;0;ON;<compat> 4E59;;;;N;;;;;
+2F05;KANGXI RADICAL HOOK;So;0;ON;<compat> 4E85;;;;N;;;;;
+2F06;KANGXI RADICAL TWO;So;0;ON;<compat> 4E8C;;;;N;;;;;
+2F07;KANGXI RADICAL LID;So;0;ON;<compat> 4EA0;;;;N;;;;;
+2F08;KANGXI RADICAL MAN;So;0;ON;<compat> 4EBA;;;;N;;;;;
+2F09;KANGXI RADICAL LEGS;So;0;ON;<compat> 513F;;;;N;;;;;
+2F0A;KANGXI RADICAL ENTER;So;0;ON;<compat> 5165;;;;N;;;;;
+2F0B;KANGXI RADICAL EIGHT;So;0;ON;<compat> 516B;;;;N;;;;;
+2F0C;KANGXI RADICAL DOWN BOX;So;0;ON;<compat> 5182;;;;N;;;;;
+2F0D;KANGXI RADICAL COVER;So;0;ON;<compat> 5196;;;;N;;;;;
+2F0E;KANGXI RADICAL ICE;So;0;ON;<compat> 51AB;;;;N;;;;;
+2F0F;KANGXI RADICAL TABLE;So;0;ON;<compat> 51E0;;;;N;;;;;
+2F10;KANGXI RADICAL OPEN BOX;So;0;ON;<compat> 51F5;;;;N;;;;;
+2F11;KANGXI RADICAL KNIFE;So;0;ON;<compat> 5200;;;;N;;;;;
+2F12;KANGXI RADICAL POWER;So;0;ON;<compat> 529B;;;;N;;;;;
+2F13;KANGXI RADICAL WRAP;So;0;ON;<compat> 52F9;;;;N;;;;;
+2F14;KANGXI RADICAL SPOON;So;0;ON;<compat> 5315;;;;N;;;;;
+2F15;KANGXI RADICAL RIGHT OPEN BOX;So;0;ON;<compat> 531A;;;;N;;;;;
+2F16;KANGXI RADICAL HIDING ENCLOSURE;So;0;ON;<compat> 5338;;;;N;;;;;
+2F17;KANGXI RADICAL TEN;So;0;ON;<compat> 5341;;;;N;;;;;
+2F18;KANGXI RADICAL DIVINATION;So;0;ON;<compat> 535C;;;;N;;;;;
+2F19;KANGXI RADICAL SEAL;So;0;ON;<compat> 5369;;;;N;;;;;
+2F1A;KANGXI RADICAL CLIFF;So;0;ON;<compat> 5382;;;;N;;;;;
+2F1B;KANGXI RADICAL PRIVATE;So;0;ON;<compat> 53B6;;;;N;;;;;
+2F1C;KANGXI RADICAL AGAIN;So;0;ON;<compat> 53C8;;;;N;;;;;
+2F1D;KANGXI RADICAL MOUTH;So;0;ON;<compat> 53E3;;;;N;;;;;
+2F1E;KANGXI RADICAL ENCLOSURE;So;0;ON;<compat> 56D7;;;;N;;;;;
+2F1F;KANGXI RADICAL EARTH;So;0;ON;<compat> 571F;;;;N;;;;;
+2F20;KANGXI RADICAL SCHOLAR;So;0;ON;<compat> 58EB;;;;N;;;;;
+2F21;KANGXI RADICAL GO;So;0;ON;<compat> 5902;;;;N;;;;;
+2F22;KANGXI RADICAL GO SLOWLY;So;0;ON;<compat> 590A;;;;N;;;;;
+2F23;KANGXI RADICAL EVENING;So;0;ON;<compat> 5915;;;;N;;;;;
+2F24;KANGXI RADICAL BIG;So;0;ON;<compat> 5927;;;;N;;;;;
+2F25;KANGXI RADICAL WOMAN;So;0;ON;<compat> 5973;;;;N;;;;;
+2F26;KANGXI RADICAL CHILD;So;0;ON;<compat> 5B50;;;;N;;;;;
+2F27;KANGXI RADICAL ROOF;So;0;ON;<compat> 5B80;;;;N;;;;;
+2F28;KANGXI RADICAL INCH;So;0;ON;<compat> 5BF8;;;;N;;;;;
+2F29;KANGXI RADICAL SMALL;So;0;ON;<compat> 5C0F;;;;N;;;;;
+2F2A;KANGXI RADICAL LAME;So;0;ON;<compat> 5C22;;;;N;;;;;
+2F2B;KANGXI RADICAL CORPSE;So;0;ON;<compat> 5C38;;;;N;;;;;
+2F2C;KANGXI RADICAL SPROUT;So;0;ON;<compat> 5C6E;;;;N;;;;;
+2F2D;KANGXI RADICAL MOUNTAIN;So;0;ON;<compat> 5C71;;;;N;;;;;
+2F2E;KANGXI RADICAL RIVER;So;0;ON;<compat> 5DDB;;;;N;;;;;
+2F2F;KANGXI RADICAL WORK;So;0;ON;<compat> 5DE5;;;;N;;;;;
+2F30;KANGXI RADICAL ONESELF;So;0;ON;<compat> 5DF1;;;;N;;;;;
+2F31;KANGXI RADICAL TURBAN;So;0;ON;<compat> 5DFE;;;;N;;;;;
+2F32;KANGXI RADICAL DRY;So;0;ON;<compat> 5E72;;;;N;;;;;
+2F33;KANGXI RADICAL SHORT THREAD;So;0;ON;<compat> 5E7A;;;;N;;;;;
+2F34;KANGXI RADICAL DOTTED CLIFF;So;0;ON;<compat> 5E7F;;;;N;;;;;
+2F35;KANGXI RADICAL LONG STRIDE;So;0;ON;<compat> 5EF4;;;;N;;;;;
+2F36;KANGXI RADICAL TWO HANDS;So;0;ON;<compat> 5EFE;;;;N;;;;;
+2F37;KANGXI RADICAL SHOOT;So;0;ON;<compat> 5F0B;;;;N;;;;;
+2F38;KANGXI RADICAL BOW;So;0;ON;<compat> 5F13;;;;N;;;;;
+2F39;KANGXI RADICAL SNOUT;So;0;ON;<compat> 5F50;;;;N;;;;;
+2F3A;KANGXI RADICAL BRISTLE;So;0;ON;<compat> 5F61;;;;N;;;;;
+2F3B;KANGXI RADICAL STEP;So;0;ON;<compat> 5F73;;;;N;;;;;
+2F3C;KANGXI RADICAL HEART;So;0;ON;<compat> 5FC3;;;;N;;;;;
+2F3D;KANGXI RADICAL HALBERD;So;0;ON;<compat> 6208;;;;N;;;;;
+2F3E;KANGXI RADICAL DOOR;So;0;ON;<compat> 6236;;;;N;;;;;
+2F3F;KANGXI RADICAL HAND;So;0;ON;<compat> 624B;;;;N;;;;;
+2F40;KANGXI RADICAL BRANCH;So;0;ON;<compat> 652F;;;;N;;;;;
+2F41;KANGXI RADICAL RAP;So;0;ON;<compat> 6534;;;;N;;;;;
+2F42;KANGXI RADICAL SCRIPT;So;0;ON;<compat> 6587;;;;N;;;;;
+2F43;KANGXI RADICAL DIPPER;So;0;ON;<compat> 6597;;;;N;;;;;
+2F44;KANGXI RADICAL AXE;So;0;ON;<compat> 65A4;;;;N;;;;;
+2F45;KANGXI RADICAL SQUARE;So;0;ON;<compat> 65B9;;;;N;;;;;
+2F46;KANGXI RADICAL NOT;So;0;ON;<compat> 65E0;;;;N;;;;;
+2F47;KANGXI RADICAL SUN;So;0;ON;<compat> 65E5;;;;N;;;;;
+2F48;KANGXI RADICAL SAY;So;0;ON;<compat> 66F0;;;;N;;;;;
+2F49;KANGXI RADICAL MOON;So;0;ON;<compat> 6708;;;;N;;;;;
+2F4A;KANGXI RADICAL TREE;So;0;ON;<compat> 6728;;;;N;;;;;
+2F4B;KANGXI RADICAL LACK;So;0;ON;<compat> 6B20;;;;N;;;;;
+2F4C;KANGXI RADICAL STOP;So;0;ON;<compat> 6B62;;;;N;;;;;
+2F4D;KANGXI RADICAL DEATH;So;0;ON;<compat> 6B79;;;;N;;;;;
+2F4E;KANGXI RADICAL WEAPON;So;0;ON;<compat> 6BB3;;;;N;;;;;
+2F4F;KANGXI RADICAL DO NOT;So;0;ON;<compat> 6BCB;;;;N;;;;;
+2F50;KANGXI RADICAL COMPARE;So;0;ON;<compat> 6BD4;;;;N;;;;;
+2F51;KANGXI RADICAL FUR;So;0;ON;<compat> 6BDB;;;;N;;;;;
+2F52;KANGXI RADICAL CLAN;So;0;ON;<compat> 6C0F;;;;N;;;;;
+2F53;KANGXI RADICAL STEAM;So;0;ON;<compat> 6C14;;;;N;;;;;
+2F54;KANGXI RADICAL WATER;So;0;ON;<compat> 6C34;;;;N;;;;;
+2F55;KANGXI RADICAL FIRE;So;0;ON;<compat> 706B;;;;N;;;;;
+2F56;KANGXI RADICAL CLAW;So;0;ON;<compat> 722A;;;;N;;;;;
+2F57;KANGXI RADICAL FATHER;So;0;ON;<compat> 7236;;;;N;;;;;
+2F58;KANGXI RADICAL DOUBLE X;So;0;ON;<compat> 723B;;;;N;;;;;
+2F59;KANGXI RADICAL HALF TREE TRUNK;So;0;ON;<compat> 723F;;;;N;;;;;
+2F5A;KANGXI RADICAL SLICE;So;0;ON;<compat> 7247;;;;N;;;;;
+2F5B;KANGXI RADICAL FANG;So;0;ON;<compat> 7259;;;;N;;;;;
+2F5C;KANGXI RADICAL COW;So;0;ON;<compat> 725B;;;;N;;;;;
+2F5D;KANGXI RADICAL DOG;So;0;ON;<compat> 72AC;;;;N;;;;;
+2F5E;KANGXI RADICAL PROFOUND;So;0;ON;<compat> 7384;;;;N;;;;;
+2F5F;KANGXI RADICAL JADE;So;0;ON;<compat> 7389;;;;N;;;;;
+2F60;KANGXI RADICAL MELON;So;0;ON;<compat> 74DC;;;;N;;;;;
+2F61;KANGXI RADICAL TILE;So;0;ON;<compat> 74E6;;;;N;;;;;
+2F62;KANGXI RADICAL SWEET;So;0;ON;<compat> 7518;;;;N;;;;;
+2F63;KANGXI RADICAL LIFE;So;0;ON;<compat> 751F;;;;N;;;;;
+2F64;KANGXI RADICAL USE;So;0;ON;<compat> 7528;;;;N;;;;;
+2F65;KANGXI RADICAL FIELD;So;0;ON;<compat> 7530;;;;N;;;;;
+2F66;KANGXI RADICAL BOLT OF CLOTH;So;0;ON;<compat> 758B;;;;N;;;;;
+2F67;KANGXI RADICAL SICKNESS;So;0;ON;<compat> 7592;;;;N;;;;;
+2F68;KANGXI RADICAL DOTTED TENT;So;0;ON;<compat> 7676;;;;N;;;;;
+2F69;KANGXI RADICAL WHITE;So;0;ON;<compat> 767D;;;;N;;;;;
+2F6A;KANGXI RADICAL SKIN;So;0;ON;<compat> 76AE;;;;N;;;;;
+2F6B;KANGXI RADICAL DISH;So;0;ON;<compat> 76BF;;;;N;;;;;
+2F6C;KANGXI RADICAL EYE;So;0;ON;<compat> 76EE;;;;N;;;;;
+2F6D;KANGXI RADICAL SPEAR;So;0;ON;<compat> 77DB;;;;N;;;;;
+2F6E;KANGXI RADICAL ARROW;So;0;ON;<compat> 77E2;;;;N;;;;;
+2F6F;KANGXI RADICAL STONE;So;0;ON;<compat> 77F3;;;;N;;;;;
+2F70;KANGXI RADICAL SPIRIT;So;0;ON;<compat> 793A;;;;N;;;;;
+2F71;KANGXI RADICAL TRACK;So;0;ON;<compat> 79B8;;;;N;;;;;
+2F72;KANGXI RADICAL GRAIN;So;0;ON;<compat> 79BE;;;;N;;;;;
+2F73;KANGXI RADICAL CAVE;So;0;ON;<compat> 7A74;;;;N;;;;;
+2F74;KANGXI RADICAL STAND;So;0;ON;<compat> 7ACB;;;;N;;;;;
+2F75;KANGXI RADICAL BAMBOO;So;0;ON;<compat> 7AF9;;;;N;;;;;
+2F76;KANGXI RADICAL RICE;So;0;ON;<compat> 7C73;;;;N;;;;;
+2F77;KANGXI RADICAL SILK;So;0;ON;<compat> 7CF8;;;;N;;;;;
+2F78;KANGXI RADICAL JAR;So;0;ON;<compat> 7F36;;;;N;;;;;
+2F79;KANGXI RADICAL NET;So;0;ON;<compat> 7F51;;;;N;;;;;
+2F7A;KANGXI RADICAL SHEEP;So;0;ON;<compat> 7F8A;;;;N;;;;;
+2F7B;KANGXI RADICAL FEATHER;So;0;ON;<compat> 7FBD;;;;N;;;;;
+2F7C;KANGXI RADICAL OLD;So;0;ON;<compat> 8001;;;;N;;;;;
+2F7D;KANGXI RADICAL AND;So;0;ON;<compat> 800C;;;;N;;;;;
+2F7E;KANGXI RADICAL PLOW;So;0;ON;<compat> 8012;;;;N;;;;;
+2F7F;KANGXI RADICAL EAR;So;0;ON;<compat> 8033;;;;N;;;;;
+2F80;KANGXI RADICAL BRUSH;So;0;ON;<compat> 807F;;;;N;;;;;
+2F81;KANGXI RADICAL MEAT;So;0;ON;<compat> 8089;;;;N;;;;;
+2F82;KANGXI RADICAL MINISTER;So;0;ON;<compat> 81E3;;;;N;;;;;
+2F83;KANGXI RADICAL SELF;So;0;ON;<compat> 81EA;;;;N;;;;;
+2F84;KANGXI RADICAL ARRIVE;So;0;ON;<compat> 81F3;;;;N;;;;;
+2F85;KANGXI RADICAL MORTAR;So;0;ON;<compat> 81FC;;;;N;;;;;
+2F86;KANGXI RADICAL TONGUE;So;0;ON;<compat> 820C;;;;N;;;;;
+2F87;KANGXI RADICAL OPPOSE;So;0;ON;<compat> 821B;;;;N;;;;;
+2F88;KANGXI RADICAL BOAT;So;0;ON;<compat> 821F;;;;N;;;;;
+2F89;KANGXI RADICAL STOPPING;So;0;ON;<compat> 826E;;;;N;;;;;
+2F8A;KANGXI RADICAL COLOR;So;0;ON;<compat> 8272;;;;N;;;;;
+2F8B;KANGXI RADICAL GRASS;So;0;ON;<compat> 8278;;;;N;;;;;
+2F8C;KANGXI RADICAL TIGER;So;0;ON;<compat> 864D;;;;N;;;;;
+2F8D;KANGXI RADICAL INSECT;So;0;ON;<compat> 866B;;;;N;;;;;
+2F8E;KANGXI RADICAL BLOOD;So;0;ON;<compat> 8840;;;;N;;;;;
+2F8F;KANGXI RADICAL WALK ENCLOSURE;So;0;ON;<compat> 884C;;;;N;;;;;
+2F90;KANGXI RADICAL CLOTHES;So;0;ON;<compat> 8863;;;;N;;;;;
+2F91;KANGXI RADICAL WEST;So;0;ON;<compat> 897E;;;;N;;;;;
+2F92;KANGXI RADICAL SEE;So;0;ON;<compat> 898B;;;;N;;;;;
+2F93;KANGXI RADICAL HORN;So;0;ON;<compat> 89D2;;;;N;;;;;
+2F94;KANGXI RADICAL SPEECH;So;0;ON;<compat> 8A00;;;;N;;;;;
+2F95;KANGXI RADICAL VALLEY;So;0;ON;<compat> 8C37;;;;N;;;;;
+2F96;KANGXI RADICAL BEAN;So;0;ON;<compat> 8C46;;;;N;;;;;
+2F97;KANGXI RADICAL PIG;So;0;ON;<compat> 8C55;;;;N;;;;;
+2F98;KANGXI RADICAL BADGER;So;0;ON;<compat> 8C78;;;;N;;;;;
+2F99;KANGXI RADICAL SHELL;So;0;ON;<compat> 8C9D;;;;N;;;;;
+2F9A;KANGXI RADICAL RED;So;0;ON;<compat> 8D64;;;;N;;;;;
+2F9B;KANGXI RADICAL RUN;So;0;ON;<compat> 8D70;;;;N;;;;;
+2F9C;KANGXI RADICAL FOOT;So;0;ON;<compat> 8DB3;;;;N;;;;;
+2F9D;KANGXI RADICAL BODY;So;0;ON;<compat> 8EAB;;;;N;;;;;
+2F9E;KANGXI RADICAL CART;So;0;ON;<compat> 8ECA;;;;N;;;;;
+2F9F;KANGXI RADICAL BITTER;So;0;ON;<compat> 8F9B;;;;N;;;;;
+2FA0;KANGXI RADICAL MORNING;So;0;ON;<compat> 8FB0;;;;N;;;;;
+2FA1;KANGXI RADICAL WALK;So;0;ON;<compat> 8FB5;;;;N;;;;;
+2FA2;KANGXI RADICAL CITY;So;0;ON;<compat> 9091;;;;N;;;;;
+2FA3;KANGXI RADICAL WINE;So;0;ON;<compat> 9149;;;;N;;;;;
+2FA4;KANGXI RADICAL DISTINGUISH;So;0;ON;<compat> 91C6;;;;N;;;;;
+2FA5;KANGXI RADICAL VILLAGE;So;0;ON;<compat> 91CC;;;;N;;;;;
+2FA6;KANGXI RADICAL GOLD;So;0;ON;<compat> 91D1;;;;N;;;;;
+2FA7;KANGXI RADICAL LONG;So;0;ON;<compat> 9577;;;;N;;;;;
+2FA8;KANGXI RADICAL GATE;So;0;ON;<compat> 9580;;;;N;;;;;
+2FA9;KANGXI RADICAL MOUND;So;0;ON;<compat> 961C;;;;N;;;;;
+2FAA;KANGXI RADICAL SLAVE;So;0;ON;<compat> 96B6;;;;N;;;;;
+2FAB;KANGXI RADICAL SHORT TAILED BIRD;So;0;ON;<compat> 96B9;;;;N;;;;;
+2FAC;KANGXI RADICAL RAIN;So;0;ON;<compat> 96E8;;;;N;;;;;
+2FAD;KANGXI RADICAL BLUE;So;0;ON;<compat> 9751;;;;N;;;;;
+2FAE;KANGXI RADICAL WRONG;So;0;ON;<compat> 975E;;;;N;;;;;
+2FAF;KANGXI RADICAL FACE;So;0;ON;<compat> 9762;;;;N;;;;;
+2FB0;KANGXI RADICAL LEATHER;So;0;ON;<compat> 9769;;;;N;;;;;
+2FB1;KANGXI RADICAL TANNED LEATHER;So;0;ON;<compat> 97CB;;;;N;;;;;
+2FB2;KANGXI RADICAL LEEK;So;0;ON;<compat> 97ED;;;;N;;;;;
+2FB3;KANGXI RADICAL SOUND;So;0;ON;<compat> 97F3;;;;N;;;;;
+2FB4;KANGXI RADICAL LEAF;So;0;ON;<compat> 9801;;;;N;;;;;
+2FB5;KANGXI RADICAL WIND;So;0;ON;<compat> 98A8;;;;N;;;;;
+2FB6;KANGXI RADICAL FLY;So;0;ON;<compat> 98DB;;;;N;;;;;
+2FB7;KANGXI RADICAL EAT;So;0;ON;<compat> 98DF;;;;N;;;;;
+2FB8;KANGXI RADICAL HEAD;So;0;ON;<compat> 9996;;;;N;;;;;
+2FB9;KANGXI RADICAL FRAGRANT;So;0;ON;<compat> 9999;;;;N;;;;;
+2FBA;KANGXI RADICAL HORSE;So;0;ON;<compat> 99AC;;;;N;;;;;
+2FBB;KANGXI RADICAL BONE;So;0;ON;<compat> 9AA8;;;;N;;;;;
+2FBC;KANGXI RADICAL TALL;So;0;ON;<compat> 9AD8;;;;N;;;;;
+2FBD;KANGXI RADICAL HAIR;So;0;ON;<compat> 9ADF;;;;N;;;;;
+2FBE;KANGXI RADICAL FIGHT;So;0;ON;<compat> 9B25;;;;N;;;;;
+2FBF;KANGXI RADICAL SACRIFICIAL WINE;So;0;ON;<compat> 9B2F;;;;N;;;;;
+2FC0;KANGXI RADICAL CAULDRON;So;0;ON;<compat> 9B32;;;;N;;;;;
+2FC1;KANGXI RADICAL GHOST;So;0;ON;<compat> 9B3C;;;;N;;;;;
+2FC2;KANGXI RADICAL FISH;So;0;ON;<compat> 9B5A;;;;N;;;;;
+2FC3;KANGXI RADICAL BIRD;So;0;ON;<compat> 9CE5;;;;N;;;;;
+2FC4;KANGXI RADICAL SALT;So;0;ON;<compat> 9E75;;;;N;;;;;
+2FC5;KANGXI RADICAL DEER;So;0;ON;<compat> 9E7F;;;;N;;;;;
+2FC6;KANGXI RADICAL WHEAT;So;0;ON;<compat> 9EA5;;;;N;;;;;
+2FC7;KANGXI RADICAL HEMP;So;0;ON;<compat> 9EBB;;;;N;;;;;
+2FC8;KANGXI RADICAL YELLOW;So;0;ON;<compat> 9EC3;;;;N;;;;;
+2FC9;KANGXI RADICAL MILLET;So;0;ON;<compat> 9ECD;;;;N;;;;;
+2FCA;KANGXI RADICAL BLACK;So;0;ON;<compat> 9ED1;;;;N;;;;;
+2FCB;KANGXI RADICAL EMBROIDERY;So;0;ON;<compat> 9EF9;;;;N;;;;;
+2FCC;KANGXI RADICAL FROG;So;0;ON;<compat> 9EFD;;;;N;;;;;
+2FCD;KANGXI RADICAL TRIPOD;So;0;ON;<compat> 9F0E;;;;N;;;;;
+2FCE;KANGXI RADICAL DRUM;So;0;ON;<compat> 9F13;;;;N;;;;;
+2FCF;KANGXI RADICAL RAT;So;0;ON;<compat> 9F20;;;;N;;;;;
+2FD0;KANGXI RADICAL NOSE;So;0;ON;<compat> 9F3B;;;;N;;;;;
+2FD1;KANGXI RADICAL EVEN;So;0;ON;<compat> 9F4A;;;;N;;;;;
+2FD2;KANGXI RADICAL TOOTH;So;0;ON;<compat> 9F52;;;;N;;;;;
+2FD3;KANGXI RADICAL DRAGON;So;0;ON;<compat> 9F8D;;;;N;;;;;
+2FD4;KANGXI RADICAL TURTLE;So;0;ON;<compat> 9F9C;;;;N;;;;;
+2FD5;KANGXI RADICAL FLUTE;So;0;ON;<compat> 9FA0;;;;N;;;;;
+2FF0;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT;So;0;ON;;;;;N;;;;;
+2FF1;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW;So;0;ON;;;;;N;;;;;
+2FF2;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT;So;0;ON;;;;;N;;;;;
+2FF3;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW;So;0;ON;;;;;N;;;;;
+2FF4;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND;So;0;ON;;;;;N;;;;;
+2FF5;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE;So;0;ON;;;;;N;;;;;
+2FF6;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW;So;0;ON;;;;;N;;;;;
+2FF7;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT;So;0;ON;;;;;N;;;;;
+2FF8;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT;So;0;ON;;;;;N;;;;;
+2FF9;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT;So;0;ON;;;;;N;;;;;
+2FFA;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT;So;0;ON;;;;;N;;;;;
+2FFB;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID;So;0;ON;;;;;N;;;;;
+3000;IDEOGRAPHIC SPACE;Zs;0;WS;<wide> 0020;;;;N;;;;;
+3001;IDEOGRAPHIC COMMA;Po;0;ON;;;;;N;;;;;
+3002;IDEOGRAPHIC FULL STOP;Po;0;ON;;;;;N;IDEOGRAPHIC PERIOD;;;;
+3003;DITTO MARK;Po;0;ON;;;;;N;;;;;
+3004;JAPANESE INDUSTRIAL STANDARD SYMBOL;So;0;ON;;;;;N;;;;;
+3005;IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;;
+3006;IDEOGRAPHIC CLOSING MARK;Lo;0;L;;;;;N;;;;;
+3007;IDEOGRAPHIC NUMBER ZERO;Nl;0;L;;;;0;N;;;;;
+3008;LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING ANGLE BRACKET;;;;
+3009;RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING ANGLE BRACKET;;;;
+300A;LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING DOUBLE ANGLE BRACKET;;;;
+300B;RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING DOUBLE ANGLE BRACKET;;;;
+300C;LEFT CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING CORNER BRACKET;;;;
+300D;RIGHT CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING CORNER BRACKET;;;;
+300E;LEFT WHITE CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE CORNER BRACKET;;;;
+300F;RIGHT WHITE CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE CORNER BRACKET;;;;
+3010;LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING BLACK LENTICULAR BRACKET;;;;
+3011;RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING BLACK LENTICULAR BRACKET;;;;
+3012;POSTAL MARK;So;0;ON;;;;;N;;;;;
+3013;GETA MARK;So;0;ON;;;;;N;;;;;
+3014;LEFT TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING TORTOISE SHELL BRACKET;;;;
+3015;RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING TORTOISE SHELL BRACKET;;;;
+3016;LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE LENTICULAR BRACKET;;;;
+3017;RIGHT WHITE LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE LENTICULAR BRACKET;;;;
+3018;LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE TORTOISE SHELL BRACKET;;;;
+3019;RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE TORTOISE SHELL BRACKET;;;;
+301A;LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE SQUARE BRACKET;;;;
+301B;RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE SQUARE BRACKET;;;;
+301C;WAVE DASH;Pd;0;ON;;;;;N;;;;;
+301D;REVERSED DOUBLE PRIME QUOTATION MARK;Ps;0;ON;;;;;N;;;;;
+301E;DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;;
+301F;LOW DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;;
+3020;POSTAL MARK FACE;So;0;ON;;;;;N;;;;;
+3021;HANGZHOU NUMERAL ONE;Nl;0;L;;;;1;N;;;;;
+3022;HANGZHOU NUMERAL TWO;Nl;0;L;;;;2;N;;;;;
+3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;;
+3024;HANGZHOU NUMERAL FOUR;Nl;0;L;;;;4;N;;;;;
+3025;HANGZHOU NUMERAL FIVE;Nl;0;L;;;;5;N;;;;;
+3026;HANGZHOU NUMERAL SIX;Nl;0;L;;;;6;N;;;;;
+3027;HANGZHOU NUMERAL SEVEN;Nl;0;L;;;;7;N;;;;;
+3028;HANGZHOU NUMERAL EIGHT;Nl;0;L;;;;8;N;;;;;
+3029;HANGZHOU NUMERAL NINE;Nl;0;L;;;;9;N;;;;;
+302A;IDEOGRAPHIC LEVEL TONE MARK;Mn;218;NSM;;;;;N;;;;;
+302B;IDEOGRAPHIC RISING TONE MARK;Mn;228;NSM;;;;;N;;;;;
+302C;IDEOGRAPHIC DEPARTING TONE MARK;Mn;232;NSM;;;;;N;;;;;
+302D;IDEOGRAPHIC ENTERING TONE MARK;Mn;222;NSM;;;;;N;;;;;
+302E;HANGUL SINGLE DOT TONE MARK;Mc;224;L;;;;;N;;;;;
+302F;HANGUL DOUBLE DOT TONE MARK;Mc;224;L;;;;;N;;;;;
+3030;WAVY DASH;Pd;0;ON;;;;;N;;;;;
+3031;VERTICAL KANA REPEAT MARK;Lm;0;L;;;;;N;;;;;
+3032;VERTICAL KANA REPEAT WITH VOICED SOUND MARK;Lm;0;L;;;;;N;;;;;
+3033;VERTICAL KANA REPEAT MARK UPPER HALF;Lm;0;L;;;;;N;;;;;
+3034;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF;Lm;0;L;;;;;N;;;;;
+3035;VERTICAL KANA REPEAT MARK LOWER HALF;Lm;0;L;;;;;N;;;;;
+3036;CIRCLED POSTAL MARK;So;0;ON;<compat> 3012;;;;N;;;;;
+3037;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL;So;0;ON;;;;;N;;;;;
+3038;HANGZHOU NUMERAL TEN;Nl;0;L;<compat> 5341;;;10;N;;;;;
+3039;HANGZHOU NUMERAL TWENTY;Nl;0;L;<compat> 5344;;;20;N;;;;;
+303A;HANGZHOU NUMERAL THIRTY;Nl;0;L;<compat> 5345;;;30;N;;;;;
+303B;VERTICAL IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;;
+303C;MASU MARK;Lo;0;L;;;;;N;;;;;
+303D;PART ALTERNATION MARK;Po;0;ON;;;;;N;;;;;
+303E;IDEOGRAPHIC VARIATION INDICATOR;So;0;ON;;;;;N;;;;;
+303F;IDEOGRAPHIC HALF FILL SPACE;So;0;ON;;;;;N;;;;;
+3041;HIRAGANA LETTER SMALL A;Lo;0;L;;;;;N;;;;;
+3042;HIRAGANA LETTER A;Lo;0;L;;;;;N;;;;;
+3043;HIRAGANA LETTER SMALL I;Lo;0;L;;;;;N;;;;;
+3044;HIRAGANA LETTER I;Lo;0;L;;;;;N;;;;;
+3045;HIRAGANA LETTER SMALL U;Lo;0;L;;;;;N;;;;;
+3046;HIRAGANA LETTER U;Lo;0;L;;;;;N;;;;;
+3047;HIRAGANA LETTER SMALL E;Lo;0;L;;;;;N;;;;;
+3048;HIRAGANA LETTER E;Lo;0;L;;;;;N;;;;;
+3049;HIRAGANA LETTER SMALL O;Lo;0;L;;;;;N;;;;;
+304A;HIRAGANA LETTER O;Lo;0;L;;;;;N;;;;;
+304B;HIRAGANA LETTER KA;Lo;0;L;;;;;N;;;;;
+304C;HIRAGANA LETTER GA;Lo;0;L;304B 3099;;;;N;;;;;
+304D;HIRAGANA LETTER KI;Lo;0;L;;;;;N;;;;;
+304E;HIRAGANA LETTER GI;Lo;0;L;304D 3099;;;;N;;;;;
+304F;HIRAGANA LETTER KU;Lo;0;L;;;;;N;;;;;
+3050;HIRAGANA LETTER GU;Lo;0;L;304F 3099;;;;N;;;;;
+3051;HIRAGANA LETTER KE;Lo;0;L;;;;;N;;;;;
+3052;HIRAGANA LETTER GE;Lo;0;L;3051 3099;;;;N;;;;;
+3053;HIRAGANA LETTER KO;Lo;0;L;;;;;N;;;;;
+3054;HIRAGANA LETTER GO;Lo;0;L;3053 3099;;;;N;;;;;
+3055;HIRAGANA LETTER SA;Lo;0;L;;;;;N;;;;;
+3056;HIRAGANA LETTER ZA;Lo;0;L;3055 3099;;;;N;;;;;
+3057;HIRAGANA LETTER SI;Lo;0;L;;;;;N;;;;;
+3058;HIRAGANA LETTER ZI;Lo;0;L;3057 3099;;;;N;;;;;
+3059;HIRAGANA LETTER SU;Lo;0;L;;;;;N;;;;;
+305A;HIRAGANA LETTER ZU;Lo;0;L;3059 3099;;;;N;;;;;
+305B;HIRAGANA LETTER SE;Lo;0;L;;;;;N;;;;;
+305C;HIRAGANA LETTER ZE;Lo;0;L;305B 3099;;;;N;;;;;
+305D;HIRAGANA LETTER SO;Lo;0;L;;;;;N;;;;;
+305E;HIRAGANA LETTER ZO;Lo;0;L;305D 3099;;;;N;;;;;
+305F;HIRAGANA LETTER TA;Lo;0;L;;;;;N;;;;;
+3060;HIRAGANA LETTER DA;Lo;0;L;305F 3099;;;;N;;;;;
+3061;HIRAGANA LETTER TI;Lo;0;L;;;;;N;;;;;
+3062;HIRAGANA LETTER DI;Lo;0;L;3061 3099;;;;N;;;;;
+3063;HIRAGANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;;
+3064;HIRAGANA LETTER TU;Lo;0;L;;;;;N;;;;;
+3065;HIRAGANA LETTER DU;Lo;0;L;3064 3099;;;;N;;;;;
+3066;HIRAGANA LETTER TE;Lo;0;L;;;;;N;;;;;
+3067;HIRAGANA LETTER DE;Lo;0;L;3066 3099;;;;N;;;;;
+3068;HIRAGANA LETTER TO;Lo;0;L;;;;;N;;;;;
+3069;HIRAGANA LETTER DO;Lo;0;L;3068 3099;;;;N;;;;;
+306A;HIRAGANA LETTER NA;Lo;0;L;;;;;N;;;;;
+306B;HIRAGANA LETTER NI;Lo;0;L;;;;;N;;;;;
+306C;HIRAGANA LETTER NU;Lo;0;L;;;;;N;;;;;
+306D;HIRAGANA LETTER NE;Lo;0;L;;;;;N;;;;;
+306E;HIRAGANA LETTER NO;Lo;0;L;;;;;N;;;;;
+306F;HIRAGANA LETTER HA;Lo;0;L;;;;;N;;;;;
+3070;HIRAGANA LETTER BA;Lo;0;L;306F 3099;;;;N;;;;;
+3071;HIRAGANA LETTER PA;Lo;0;L;306F 309A;;;;N;;;;;
+3072;HIRAGANA LETTER HI;Lo;0;L;;;;;N;;;;;
+3073;HIRAGANA LETTER BI;Lo;0;L;3072 3099;;;;N;;;;;
+3074;HIRAGANA LETTER PI;Lo;0;L;3072 309A;;;;N;;;;;
+3075;HIRAGANA LETTER HU;Lo;0;L;;;;;N;;;;;
+3076;HIRAGANA LETTER BU;Lo;0;L;3075 3099;;;;N;;;;;
+3077;HIRAGANA LETTER PU;Lo;0;L;3075 309A;;;;N;;;;;
+3078;HIRAGANA LETTER HE;Lo;0;L;;;;;N;;;;;
+3079;HIRAGANA LETTER BE;Lo;0;L;3078 3099;;;;N;;;;;
+307A;HIRAGANA LETTER PE;Lo;0;L;3078 309A;;;;N;;;;;
+307B;HIRAGANA LETTER HO;Lo;0;L;;;;;N;;;;;
+307C;HIRAGANA LETTER BO;Lo;0;L;307B 3099;;;;N;;;;;
+307D;HIRAGANA LETTER PO;Lo;0;L;307B 309A;;;;N;;;;;
+307E;HIRAGANA LETTER MA;Lo;0;L;;;;;N;;;;;
+307F;HIRAGANA LETTER MI;Lo;0;L;;;;;N;;;;;
+3080;HIRAGANA LETTER MU;Lo;0;L;;;;;N;;;;;
+3081;HIRAGANA LETTER ME;Lo;0;L;;;;;N;;;;;
+3082;HIRAGANA LETTER MO;Lo;0;L;;;;;N;;;;;
+3083;HIRAGANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;;
+3084;HIRAGANA LETTER YA;Lo;0;L;;;;;N;;;;;
+3085;HIRAGANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;;
+3086;HIRAGANA LETTER YU;Lo;0;L;;;;;N;;;;;
+3087;HIRAGANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;;
+3088;HIRAGANA LETTER YO;Lo;0;L;;;;;N;;;;;
+3089;HIRAGANA LETTER RA;Lo;0;L;;;;;N;;;;;
+308A;HIRAGANA LETTER RI;Lo;0;L;;;;;N;;;;;
+308B;HIRAGANA LETTER RU;Lo;0;L;;;;;N;;;;;
+308C;HIRAGANA LETTER RE;Lo;0;L;;;;;N;;;;;
+308D;HIRAGANA LETTER RO;Lo;0;L;;;;;N;;;;;
+308E;HIRAGANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;;
+308F;HIRAGANA LETTER WA;Lo;0;L;;;;;N;;;;;
+3090;HIRAGANA LETTER WI;Lo;0;L;;;;;N;;;;;
+3091;HIRAGANA LETTER WE;Lo;0;L;;;;;N;;;;;
+3092;HIRAGANA LETTER WO;Lo;0;L;;;;;N;;;;;
+3093;HIRAGANA LETTER N;Lo;0;L;;;;;N;;;;;
+3094;HIRAGANA LETTER VU;Lo;0;L;3046 3099;;;;N;;;;;
+3095;HIRAGANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;;
+3096;HIRAGANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;;
+3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;;
+309A;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;;;;
+309B;KATAKANA-HIRAGANA VOICED SOUND MARK;Sk;0;ON;<compat> 0020 3099;;;;N;;;;;
+309C;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Sk;0;ON;<compat> 0020 309A;;;;N;;;;;
+309D;HIRAGANA ITERATION MARK;Lm;0;L;;;;;N;;;;;
+309E;HIRAGANA VOICED ITERATION MARK;Lm;0;L;309D 3099;;;;N;;;;;
+309F;HIRAGANA DIGRAPH YORI;Lo;0;L;<vertical> 3088 308A;;;;N;;;;;
+30A0;KATAKANA-HIRAGANA DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;;
+30A1;KATAKANA LETTER SMALL A;Lo;0;L;;;;;N;;;;;
+30A2;KATAKANA LETTER A;Lo;0;L;;;;;N;;;;;
+30A3;KATAKANA LETTER SMALL I;Lo;0;L;;;;;N;;;;;
+30A4;KATAKANA LETTER I;Lo;0;L;;;;;N;;;;;
+30A5;KATAKANA LETTER SMALL U;Lo;0;L;;;;;N;;;;;
+30A6;KATAKANA LETTER U;Lo;0;L;;;;;N;;;;;
+30A7;KATAKANA LETTER SMALL E;Lo;0;L;;;;;N;;;;;
+30A8;KATAKANA LETTER E;Lo;0;L;;;;;N;;;;;
+30A9;KATAKANA LETTER SMALL O;Lo;0;L;;;;;N;;;;;
+30AA;KATAKANA LETTER O;Lo;0;L;;;;;N;;;;;
+30AB;KATAKANA LETTER KA;Lo;0;L;;;;;N;;;;;
+30AC;KATAKANA LETTER GA;Lo;0;L;30AB 3099;;;;N;;;;;
+30AD;KATAKANA LETTER KI;Lo;0;L;;;;;N;;;;;
+30AE;KATAKANA LETTER GI;Lo;0;L;30AD 3099;;;;N;;;;;
+30AF;KATAKANA LETTER KU;Lo;0;L;;;;;N;;;;;
+30B0;KATAKANA LETTER GU;Lo;0;L;30AF 3099;;;;N;;;;;
+30B1;KATAKANA LETTER KE;Lo;0;L;;;;;N;;;;;
+30B2;KATAKANA LETTER GE;Lo;0;L;30B1 3099;;;;N;;;;;
+30B3;KATAKANA LETTER KO;Lo;0;L;;;;;N;;;;;
+30B4;KATAKANA LETTER GO;Lo;0;L;30B3 3099;;;;N;;;;;
+30B5;KATAKANA LETTER SA;Lo;0;L;;;;;N;;;;;
+30B6;KATAKANA LETTER ZA;Lo;0;L;30B5 3099;;;;N;;;;;
+30B7;KATAKANA LETTER SI;Lo;0;L;;;;;N;;;;;
+30B8;KATAKANA LETTER ZI;Lo;0;L;30B7 3099;;;;N;;;;;
+30B9;KATAKANA LETTER SU;Lo;0;L;;;;;N;;;;;
+30BA;KATAKANA LETTER ZU;Lo;0;L;30B9 3099;;;;N;;;;;
+30BB;KATAKANA LETTER SE;Lo;0;L;;;;;N;;;;;
+30BC;KATAKANA LETTER ZE;Lo;0;L;30BB 3099;;;;N;;;;;
+30BD;KATAKANA LETTER SO;Lo;0;L;;;;;N;;;;;
+30BE;KATAKANA LETTER ZO;Lo;0;L;30BD 3099;;;;N;;;;;
+30BF;KATAKANA LETTER TA;Lo;0;L;;;;;N;;;;;
+30C0;KATAKANA LETTER DA;Lo;0;L;30BF 3099;;;;N;;;;;
+30C1;KATAKANA LETTER TI;Lo;0;L;;;;;N;;;;;
+30C2;KATAKANA LETTER DI;Lo;0;L;30C1 3099;;;;N;;;;;
+30C3;KATAKANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;;
+30C4;KATAKANA LETTER TU;Lo;0;L;;;;;N;;;;;
+30C5;KATAKANA LETTER DU;Lo;0;L;30C4 3099;;;;N;;;;;
+30C6;KATAKANA LETTER TE;Lo;0;L;;;;;N;;;;;
+30C7;KATAKANA LETTER DE;Lo;0;L;30C6 3099;;;;N;;;;;
+30C8;KATAKANA LETTER TO;Lo;0;L;;;;;N;;;;;
+30C9;KATAKANA LETTER DO;Lo;0;L;30C8 3099;;;;N;;;;;
+30CA;KATAKANA LETTER NA;Lo;0;L;;;;;N;;;;;
+30CB;KATAKANA LETTER NI;Lo;0;L;;;;;N;;;;;
+30CC;KATAKANA LETTER NU;Lo;0;L;;;;;N;;;;;
+30CD;KATAKANA LETTER NE;Lo;0;L;;;;;N;;;;;
+30CE;KATAKANA LETTER NO;Lo;0;L;;;;;N;;;;;
+30CF;KATAKANA LETTER HA;Lo;0;L;;;;;N;;;;;
+30D0;KATAKANA LETTER BA;Lo;0;L;30CF 3099;;;;N;;;;;
+30D1;KATAKANA LETTER PA;Lo;0;L;30CF 309A;;;;N;;;;;
+30D2;KATAKANA LETTER HI;Lo;0;L;;;;;N;;;;;
+30D3;KATAKANA LETTER BI;Lo;0;L;30D2 3099;;;;N;;;;;
+30D4;KATAKANA LETTER PI;Lo;0;L;30D2 309A;;;;N;;;;;
+30D5;KATAKANA LETTER HU;Lo;0;L;;;;;N;;;;;
+30D6;KATAKANA LETTER BU;Lo;0;L;30D5 3099;;;;N;;;;;
+30D7;KATAKANA LETTER PU;Lo;0;L;30D5 309A;;;;N;;;;;
+30D8;KATAKANA LETTER HE;Lo;0;L;;;;;N;;;;;
+30D9;KATAKANA LETTER BE;Lo;0;L;30D8 3099;;;;N;;;;;
+30DA;KATAKANA LETTER PE;Lo;0;L;30D8 309A;;;;N;;;;;
+30DB;KATAKANA LETTER HO;Lo;0;L;;;;;N;;;;;
+30DC;KATAKANA LETTER BO;Lo;0;L;30DB 3099;;;;N;;;;;
+30DD;KATAKANA LETTER PO;Lo;0;L;30DB 309A;;;;N;;;;;
+30DE;KATAKANA LETTER MA;Lo;0;L;;;;;N;;;;;
+30DF;KATAKANA LETTER MI;Lo;0;L;;;;;N;;;;;
+30E0;KATAKANA LETTER MU;Lo;0;L;;;;;N;;;;;
+30E1;KATAKANA LETTER ME;Lo;0;L;;;;;N;;;;;
+30E2;KATAKANA LETTER MO;Lo;0;L;;;;;N;;;;;
+30E3;KATAKANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;;
+30E4;KATAKANA LETTER YA;Lo;0;L;;;;;N;;;;;
+30E5;KATAKANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;;
+30E6;KATAKANA LETTER YU;Lo;0;L;;;;;N;;;;;
+30E7;KATAKANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;;
+30E8;KATAKANA LETTER YO;Lo;0;L;;;;;N;;;;;
+30E9;KATAKANA LETTER RA;Lo;0;L;;;;;N;;;;;
+30EA;KATAKANA LETTER RI;Lo;0;L;;;;;N;;;;;
+30EB;KATAKANA LETTER RU;Lo;0;L;;;;;N;;;;;
+30EC;KATAKANA LETTER RE;Lo;0;L;;;;;N;;;;;
+30ED;KATAKANA LETTER RO;Lo;0;L;;;;;N;;;;;
+30EE;KATAKANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;;
+30EF;KATAKANA LETTER WA;Lo;0;L;;;;;N;;;;;
+30F0;KATAKANA LETTER WI;Lo;0;L;;;;;N;;;;;
+30F1;KATAKANA LETTER WE;Lo;0;L;;;;;N;;;;;
+30F2;KATAKANA LETTER WO;Lo;0;L;;;;;N;;;;;
+30F3;KATAKANA LETTER N;Lo;0;L;;;;;N;;;;;
+30F4;KATAKANA LETTER VU;Lo;0;L;30A6 3099;;;;N;;;;;
+30F5;KATAKANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;;
+30F6;KATAKANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;;
+30F7;KATAKANA LETTER VA;Lo;0;L;30EF 3099;;;;N;;;;;
+30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;;
+30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;;
+30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;;
+30FB;KATAKANA MIDDLE DOT;Po;0;ON;;;;;N;;;;;
+30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;;
+30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;;
+30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;;
+30FF;KATAKANA DIGRAPH KOTO;Lo;0;L;<vertical> 30B3 30C8;;;;N;;;;;
+3105;BOPOMOFO LETTER B;Lo;0;L;;;;;N;;;;;
+3106;BOPOMOFO LETTER P;Lo;0;L;;;;;N;;;;;
+3107;BOPOMOFO LETTER M;Lo;0;L;;;;;N;;;;;
+3108;BOPOMOFO LETTER F;Lo;0;L;;;;;N;;;;;
+3109;BOPOMOFO LETTER D;Lo;0;L;;;;;N;;;;;
+310A;BOPOMOFO LETTER T;Lo;0;L;;;;;N;;;;;
+310B;BOPOMOFO LETTER N;Lo;0;L;;;;;N;;;;;
+310C;BOPOMOFO LETTER L;Lo;0;L;;;;;N;;;;;
+310D;BOPOMOFO LETTER G;Lo;0;L;;;;;N;;;;;
+310E;BOPOMOFO LETTER K;Lo;0;L;;;;;N;;;;;
+310F;BOPOMOFO LETTER H;Lo;0;L;;;;;N;;;;;
+3110;BOPOMOFO LETTER J;Lo;0;L;;;;;N;;;;;
+3111;BOPOMOFO LETTER Q;Lo;0;L;;;;;N;;;;;
+3112;BOPOMOFO LETTER X;Lo;0;L;;;;;N;;;;;
+3113;BOPOMOFO LETTER ZH;Lo;0;L;;;;;N;;;;;
+3114;BOPOMOFO LETTER CH;Lo;0;L;;;;;N;;;;;
+3115;BOPOMOFO LETTER SH;Lo;0;L;;;;;N;;;;;
+3116;BOPOMOFO LETTER R;Lo;0;L;;;;;N;;;;;
+3117;BOPOMOFO LETTER Z;Lo;0;L;;;;;N;;;;;
+3118;BOPOMOFO LETTER C;Lo;0;L;;;;;N;;;;;
+3119;BOPOMOFO LETTER S;Lo;0;L;;;;;N;;;;;
+311A;BOPOMOFO LETTER A;Lo;0;L;;;;;N;;;;;
+311B;BOPOMOFO LETTER O;Lo;0;L;;;;;N;;;;;
+311C;BOPOMOFO LETTER E;Lo;0;L;;;;;N;;;;;
+311D;BOPOMOFO LETTER EH;Lo;0;L;;;;;N;;;;;
+311E;BOPOMOFO LETTER AI;Lo;0;L;;;;;N;;;;;
+311F;BOPOMOFO LETTER EI;Lo;0;L;;;;;N;;;;;
+3120;BOPOMOFO LETTER AU;Lo;0;L;;;;;N;;;;;
+3121;BOPOMOFO LETTER OU;Lo;0;L;;;;;N;;;;;
+3122;BOPOMOFO LETTER AN;Lo;0;L;;;;;N;;;;;
+3123;BOPOMOFO LETTER EN;Lo;0;L;;;;;N;;;;;
+3124;BOPOMOFO LETTER ANG;Lo;0;L;;;;;N;;;;;
+3125;BOPOMOFO LETTER ENG;Lo;0;L;;;;;N;;;;;
+3126;BOPOMOFO LETTER ER;Lo;0;L;;;;;N;;;;;
+3127;BOPOMOFO LETTER I;Lo;0;L;;;;;N;;;;;
+3128;BOPOMOFO LETTER U;Lo;0;L;;;;;N;;;;;
+3129;BOPOMOFO LETTER IU;Lo;0;L;;;;;N;;;;;
+312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;;
+312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;;
+312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;;
+312D;BOPOMOFO LETTER IH;Lo;0;L;;;;;N;;;;;
+3131;HANGUL LETTER KIYEOK;Lo;0;L;<compat> 1100;;;;N;HANGUL LETTER GIYEOG;;;;
+3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L;<compat> 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;;
+3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<compat> 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;;
+3134;HANGUL LETTER NIEUN;Lo;0;L;<compat> 1102;;;;N;;;;;
+3135;HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<compat> 11AC;;;;N;HANGUL LETTER NIEUN JIEUJ;;;;
+3136;HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<compat> 11AD;;;;N;HANGUL LETTER NIEUN HIEUH;;;;
+3137;HANGUL LETTER TIKEUT;Lo;0;L;<compat> 1103;;;;N;HANGUL LETTER DIGEUD;;;;
+3138;HANGUL LETTER SSANGTIKEUT;Lo;0;L;<compat> 1104;;;;N;HANGUL LETTER SSANG DIGEUD;;;;
+3139;HANGUL LETTER RIEUL;Lo;0;L;<compat> 1105;;;;N;HANGUL LETTER LIEUL;;;;
+313A;HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<compat> 11B0;;;;N;HANGUL LETTER LIEUL GIYEOG;;;;
+313B;HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<compat> 11B1;;;;N;HANGUL LETTER LIEUL MIEUM;;;;
+313C;HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<compat> 11B2;;;;N;HANGUL LETTER LIEUL BIEUB;;;;
+313D;HANGUL LETTER RIEUL-SIOS;Lo;0;L;<compat> 11B3;;;;N;HANGUL LETTER LIEUL SIOS;;;;
+313E;HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<compat> 11B4;;;;N;HANGUL LETTER LIEUL TIEUT;;;;
+313F;HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<compat> 11B5;;;;N;HANGUL LETTER LIEUL PIEUP;;;;
+3140;HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<compat> 111A;;;;N;HANGUL LETTER LIEUL HIEUH;;;;
+3141;HANGUL LETTER MIEUM;Lo;0;L;<compat> 1106;;;;N;;;;;
+3142;HANGUL LETTER PIEUP;Lo;0;L;<compat> 1107;;;;N;HANGUL LETTER BIEUB;;;;
+3143;HANGUL LETTER SSANGPIEUP;Lo;0;L;<compat> 1108;;;;N;HANGUL LETTER SSANG BIEUB;;;;
+3144;HANGUL LETTER PIEUP-SIOS;Lo;0;L;<compat> 1121;;;;N;HANGUL LETTER BIEUB SIOS;;;;
+3145;HANGUL LETTER SIOS;Lo;0;L;<compat> 1109;;;;N;;;;;
+3146;HANGUL LETTER SSANGSIOS;Lo;0;L;<compat> 110A;;;;N;HANGUL LETTER SSANG SIOS;;;;
+3147;HANGUL LETTER IEUNG;Lo;0;L;<compat> 110B;;;;N;;;;;
+3148;HANGUL LETTER CIEUC;Lo;0;L;<compat> 110C;;;;N;HANGUL LETTER JIEUJ;;;;
+3149;HANGUL LETTER SSANGCIEUC;Lo;0;L;<compat> 110D;;;;N;HANGUL LETTER SSANG JIEUJ;;;;
+314A;HANGUL LETTER CHIEUCH;Lo;0;L;<compat> 110E;;;;N;HANGUL LETTER CIEUC;;;;
+314B;HANGUL LETTER KHIEUKH;Lo;0;L;<compat> 110F;;;;N;HANGUL LETTER KIYEOK;;;;
+314C;HANGUL LETTER THIEUTH;Lo;0;L;<compat> 1110;;;;N;HANGUL LETTER TIEUT;;;;
+314D;HANGUL LETTER PHIEUPH;Lo;0;L;<compat> 1111;;;;N;HANGUL LETTER PIEUP;;;;
+314E;HANGUL LETTER HIEUH;Lo;0;L;<compat> 1112;;;;N;;;;;
+314F;HANGUL LETTER A;Lo;0;L;<compat> 1161;;;;N;;;;;
+3150;HANGUL LETTER AE;Lo;0;L;<compat> 1162;;;;N;;;;;
+3151;HANGUL LETTER YA;Lo;0;L;<compat> 1163;;;;N;;;;;
+3152;HANGUL LETTER YAE;Lo;0;L;<compat> 1164;;;;N;;;;;
+3153;HANGUL LETTER EO;Lo;0;L;<compat> 1165;;;;N;;;;;
+3154;HANGUL LETTER E;Lo;0;L;<compat> 1166;;;;N;;;;;
+3155;HANGUL LETTER YEO;Lo;0;L;<compat> 1167;;;;N;;;;;
+3156;HANGUL LETTER YE;Lo;0;L;<compat> 1168;;;;N;;;;;
+3157;HANGUL LETTER O;Lo;0;L;<compat> 1169;;;;N;;;;;
+3158;HANGUL LETTER WA;Lo;0;L;<compat> 116A;;;;N;;;;;
+3159;HANGUL LETTER WAE;Lo;0;L;<compat> 116B;;;;N;;;;;
+315A;HANGUL LETTER OE;Lo;0;L;<compat> 116C;;;;N;;;;;
+315B;HANGUL LETTER YO;Lo;0;L;<compat> 116D;;;;N;;;;;
+315C;HANGUL LETTER U;Lo;0;L;<compat> 116E;;;;N;;;;;
+315D;HANGUL LETTER WEO;Lo;0;L;<compat> 116F;;;;N;;;;;
+315E;HANGUL LETTER WE;Lo;0;L;<compat> 1170;;;;N;;;;;
+315F;HANGUL LETTER WI;Lo;0;L;<compat> 1171;;;;N;;;;;
+3160;HANGUL LETTER YU;Lo;0;L;<compat> 1172;;;;N;;;;;
+3161;HANGUL LETTER EU;Lo;0;L;<compat> 1173;;;;N;;;;;
+3162;HANGUL LETTER YI;Lo;0;L;<compat> 1174;;;;N;;;;;
+3163;HANGUL LETTER I;Lo;0;L;<compat> 1175;;;;N;;;;;
+3164;HANGUL FILLER;Lo;0;L;<compat> 1160;;;;N;HANGUL CAE OM;;;;
+3165;HANGUL LETTER SSANGNIEUN;Lo;0;L;<compat> 1114;;;;N;HANGUL LETTER SSANG NIEUN;;;;
+3166;HANGUL LETTER NIEUN-TIKEUT;Lo;0;L;<compat> 1115;;;;N;HANGUL LETTER NIEUN DIGEUD;;;;
+3167;HANGUL LETTER NIEUN-SIOS;Lo;0;L;<compat> 11C7;;;;N;HANGUL LETTER NIEUN SIOS;;;;
+3168;HANGUL LETTER NIEUN-PANSIOS;Lo;0;L;<compat> 11C8;;;;N;HANGUL LETTER NIEUN BAN CHI EUM;;;;
+3169;HANGUL LETTER RIEUL-KIYEOK-SIOS;Lo;0;L;<compat> 11CC;;;;N;HANGUL LETTER LIEUL GIYEOG SIOS;;;;
+316A;HANGUL LETTER RIEUL-TIKEUT;Lo;0;L;<compat> 11CE;;;;N;HANGUL LETTER LIEUL DIGEUD;;;;
+316B;HANGUL LETTER RIEUL-PIEUP-SIOS;Lo;0;L;<compat> 11D3;;;;N;HANGUL LETTER LIEUL BIEUB SIOS;;;;
+316C;HANGUL LETTER RIEUL-PANSIOS;Lo;0;L;<compat> 11D7;;;;N;HANGUL LETTER LIEUL BAN CHI EUM;;;;
+316D;HANGUL LETTER RIEUL-YEORINHIEUH;Lo;0;L;<compat> 11D9;;;;N;HANGUL LETTER LIEUL YEOLIN HIEUH;;;;
+316E;HANGUL LETTER MIEUM-PIEUP;Lo;0;L;<compat> 111C;;;;N;HANGUL LETTER MIEUM BIEUB;;;;
+316F;HANGUL LETTER MIEUM-SIOS;Lo;0;L;<compat> 11DD;;;;N;HANGUL LETTER MIEUM SIOS;;;;
+3170;HANGUL LETTER MIEUM-PANSIOS;Lo;0;L;<compat> 11DF;;;;N;HANGUL LETTER BIEUB BAN CHI EUM;;;;
+3171;HANGUL LETTER KAPYEOUNMIEUM;Lo;0;L;<compat> 111D;;;;N;HANGUL LETTER MIEUM SUN GYEONG EUM;;;;
+3172;HANGUL LETTER PIEUP-KIYEOK;Lo;0;L;<compat> 111E;;;;N;HANGUL LETTER BIEUB GIYEOG;;;;
+3173;HANGUL LETTER PIEUP-TIKEUT;Lo;0;L;<compat> 1120;;;;N;HANGUL LETTER BIEUB DIGEUD;;;;
+3174;HANGUL LETTER PIEUP-SIOS-KIYEOK;Lo;0;L;<compat> 1122;;;;N;HANGUL LETTER BIEUB SIOS GIYEOG;;;;
+3175;HANGUL LETTER PIEUP-SIOS-TIKEUT;Lo;0;L;<compat> 1123;;;;N;HANGUL LETTER BIEUB SIOS DIGEUD;;;;
+3176;HANGUL LETTER PIEUP-CIEUC;Lo;0;L;<compat> 1127;;;;N;HANGUL LETTER BIEUB JIEUJ;;;;
+3177;HANGUL LETTER PIEUP-THIEUTH;Lo;0;L;<compat> 1129;;;;N;HANGUL LETTER BIEUB TIEUT;;;;
+3178;HANGUL LETTER KAPYEOUNPIEUP;Lo;0;L;<compat> 112B;;;;N;HANGUL LETTER BIEUB SUN GYEONG EUM;;;;
+3179;HANGUL LETTER KAPYEOUNSSANGPIEUP;Lo;0;L;<compat> 112C;;;;N;HANGUL LETTER SSANG BIEUB SUN GYEONG EUM;;;;
+317A;HANGUL LETTER SIOS-KIYEOK;Lo;0;L;<compat> 112D;;;;N;HANGUL LETTER SIOS GIYEOG;;;;
+317B;HANGUL LETTER SIOS-NIEUN;Lo;0;L;<compat> 112E;;;;N;HANGUL LETTER SIOS NIEUN;;;;
+317C;HANGUL LETTER SIOS-TIKEUT;Lo;0;L;<compat> 112F;;;;N;HANGUL LETTER SIOS DIGEUD;;;;
+317D;HANGUL LETTER SIOS-PIEUP;Lo;0;L;<compat> 1132;;;;N;HANGUL LETTER SIOS BIEUB;;;;
+317E;HANGUL LETTER SIOS-CIEUC;Lo;0;L;<compat> 1136;;;;N;HANGUL LETTER SIOS JIEUJ;;;;
+317F;HANGUL LETTER PANSIOS;Lo;0;L;<compat> 1140;;;;N;HANGUL LETTER BAN CHI EUM;;;;
+3180;HANGUL LETTER SSANGIEUNG;Lo;0;L;<compat> 1147;;;;N;HANGUL LETTER SSANG IEUNG;;;;
+3181;HANGUL LETTER YESIEUNG;Lo;0;L;<compat> 114C;;;;N;HANGUL LETTER NGIEUNG;;;;
+3182;HANGUL LETTER YESIEUNG-SIOS;Lo;0;L;<compat> 11F1;;;;N;HANGUL LETTER NGIEUNG SIOS;;;;
+3183;HANGUL LETTER YESIEUNG-PANSIOS;Lo;0;L;<compat> 11F2;;;;N;HANGUL LETTER NGIEUNG BAN CHI EUM;;;;
+3184;HANGUL LETTER KAPYEOUNPHIEUPH;Lo;0;L;<compat> 1157;;;;N;HANGUL LETTER PIEUP SUN GYEONG EUM;;;;
+3185;HANGUL LETTER SSANGHIEUH;Lo;0;L;<compat> 1158;;;;N;HANGUL LETTER SSANG HIEUH;;;;
+3186;HANGUL LETTER YEORINHIEUH;Lo;0;L;<compat> 1159;;;;N;HANGUL LETTER YEOLIN HIEUH;;;;
+3187;HANGUL LETTER YO-YA;Lo;0;L;<compat> 1184;;;;N;HANGUL LETTER YOYA;;;;
+3188;HANGUL LETTER YO-YAE;Lo;0;L;<compat> 1185;;;;N;HANGUL LETTER YOYAE;;;;
+3189;HANGUL LETTER YO-I;Lo;0;L;<compat> 1188;;;;N;HANGUL LETTER YOI;;;;
+318A;HANGUL LETTER YU-YEO;Lo;0;L;<compat> 1191;;;;N;HANGUL LETTER YUYEO;;;;
+318B;HANGUL LETTER YU-YE;Lo;0;L;<compat> 1192;;;;N;HANGUL LETTER YUYE;;;;
+318C;HANGUL LETTER YU-I;Lo;0;L;<compat> 1194;;;;N;HANGUL LETTER YUI;;;;
+318D;HANGUL LETTER ARAEA;Lo;0;L;<compat> 119E;;;;N;HANGUL LETTER ALAE A;;;;
+318E;HANGUL LETTER ARAEAE;Lo;0;L;<compat> 11A1;;;;N;HANGUL LETTER ALAE AE;;;;
+3190;IDEOGRAPHIC ANNOTATION LINKING MARK;So;0;L;;;;;N;KANBUN TATETEN;;;;
+3191;IDEOGRAPHIC ANNOTATION REVERSE MARK;So;0;L;;;;;N;KAERITEN RE;;;;
+3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L;<super> 4E00;;;1;N;KAERITEN ITI;;;;
+3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L;<super> 4E8C;;;2;N;KAERITEN NI;;;;
+3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L;<super> 4E09;;;3;N;KAERITEN SAN;;;;
+3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L;<super> 56DB;;;4;N;KAERITEN SI;;;;
+3196;IDEOGRAPHIC ANNOTATION TOP MARK;So;0;L;<super> 4E0A;;;;N;KAERITEN ZYOU;;;;
+3197;IDEOGRAPHIC ANNOTATION MIDDLE MARK;So;0;L;<super> 4E2D;;;;N;KAERITEN TYUU;;;;
+3198;IDEOGRAPHIC ANNOTATION BOTTOM MARK;So;0;L;<super> 4E0B;;;;N;KAERITEN GE;;;;
+3199;IDEOGRAPHIC ANNOTATION FIRST MARK;So;0;L;<super> 7532;;;;N;KAERITEN KOU;;;;
+319A;IDEOGRAPHIC ANNOTATION SECOND MARK;So;0;L;<super> 4E59;;;;N;KAERITEN OTU;;;;
+319B;IDEOGRAPHIC ANNOTATION THIRD MARK;So;0;L;<super> 4E19;;;;N;KAERITEN HEI;;;;
+319C;IDEOGRAPHIC ANNOTATION FOURTH MARK;So;0;L;<super> 4E01;;;;N;KAERITEN TEI;;;;
+319D;IDEOGRAPHIC ANNOTATION HEAVEN MARK;So;0;L;<super> 5929;;;;N;KAERITEN TEN;;;;
+319E;IDEOGRAPHIC ANNOTATION EARTH MARK;So;0;L;<super> 5730;;;;N;KAERITEN TI;;;;
+319F;IDEOGRAPHIC ANNOTATION MAN MARK;So;0;L;<super> 4EBA;;;;N;KAERITEN ZIN;;;;
+31A0;BOPOMOFO LETTER BU;Lo;0;L;;;;;N;;;;;
+31A1;BOPOMOFO LETTER ZI;Lo;0;L;;;;;N;;;;;
+31A2;BOPOMOFO LETTER JI;Lo;0;L;;;;;N;;;;;
+31A3;BOPOMOFO LETTER GU;Lo;0;L;;;;;N;;;;;
+31A4;BOPOMOFO LETTER EE;Lo;0;L;;;;;N;;;;;
+31A5;BOPOMOFO LETTER ENN;Lo;0;L;;;;;N;;;;;
+31A6;BOPOMOFO LETTER OO;Lo;0;L;;;;;N;;;;;
+31A7;BOPOMOFO LETTER ONN;Lo;0;L;;;;;N;;;;;
+31A8;BOPOMOFO LETTER IR;Lo;0;L;;;;;N;;;;;
+31A9;BOPOMOFO LETTER ANN;Lo;0;L;;;;;N;;;;;
+31AA;BOPOMOFO LETTER INN;Lo;0;L;;;;;N;;;;;
+31AB;BOPOMOFO LETTER UNN;Lo;0;L;;;;;N;;;;;
+31AC;BOPOMOFO LETTER IM;Lo;0;L;;;;;N;;;;;
+31AD;BOPOMOFO LETTER NGG;Lo;0;L;;;;;N;;;;;
+31AE;BOPOMOFO LETTER AINN;Lo;0;L;;;;;N;;;;;
+31AF;BOPOMOFO LETTER AUNN;Lo;0;L;;;;;N;;;;;
+31B0;BOPOMOFO LETTER AM;Lo;0;L;;;;;N;;;;;
+31B1;BOPOMOFO LETTER OM;Lo;0;L;;;;;N;;;;;
+31B2;BOPOMOFO LETTER ONG;Lo;0;L;;;;;N;;;;;
+31B3;BOPOMOFO LETTER INNN;Lo;0;L;;;;;N;;;;;
+31B4;BOPOMOFO FINAL LETTER P;Lo;0;L;;;;;N;;;;;
+31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;;
+31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;;
+31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;;
+31B8;BOPOMOFO LETTER GH;Lo;0;L;;;;;N;;;;;
+31B9;BOPOMOFO LETTER LH;Lo;0;L;;;;;N;;;;;
+31BA;BOPOMOFO LETTER ZY;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;;;;;
+31C3;CJK STROKE BXG;So;0;ON;;;;;N;;;;;
+31C4;CJK STROKE SW;So;0;ON;;;;;N;;;;;
+31C5;CJK STROKE HZZ;So;0;ON;;;;;N;;;;;
+31C6;CJK STROKE HZG;So;0;ON;;;;;N;;;;;
+31C7;CJK STROKE HP;So;0;ON;;;;;N;;;;;
+31C8;CJK STROKE HZWG;So;0;ON;;;;;N;;;;;
+31C9;CJK STROKE SZWG;So;0;ON;;;;;N;;;;;
+31CA;CJK STROKE HZT;So;0;ON;;;;;N;;;;;
+31CB;CJK STROKE HZZP;So;0;ON;;;;;N;;;;;
+31CC;CJK STROKE HPWG;So;0;ON;;;;;N;;;;;
+31CD;CJK STROKE HZW;So;0;ON;;;;;N;;;;;
+31CE;CJK STROKE HZZZ;So;0;ON;;;;;N;;;;;
+31CF;CJK STROKE N;So;0;ON;;;;;N;;;;;
+31D0;CJK STROKE H;So;0;ON;;;;;N;;;;;
+31D1;CJK STROKE S;So;0;ON;;;;;N;;;;;
+31D2;CJK STROKE P;So;0;ON;;;;;N;;;;;
+31D3;CJK STROKE SP;So;0;ON;;;;;N;;;;;
+31D4;CJK STROKE D;So;0;ON;;;;;N;;;;;
+31D5;CJK STROKE HZ;So;0;ON;;;;;N;;;;;
+31D6;CJK STROKE HG;So;0;ON;;;;;N;;;;;
+31D7;CJK STROKE SZ;So;0;ON;;;;;N;;;;;
+31D8;CJK STROKE SWZ;So;0;ON;;;;;N;;;;;
+31D9;CJK STROKE ST;So;0;ON;;;;;N;;;;;
+31DA;CJK STROKE SG;So;0;ON;;;;;N;;;;;
+31DB;CJK STROKE PD;So;0;ON;;;;;N;;;;;
+31DC;CJK STROKE PZ;So;0;ON;;;;;N;;;;;
+31DD;CJK STROKE TN;So;0;ON;;;;;N;;;;;
+31DE;CJK STROKE SZZ;So;0;ON;;;;;N;;;;;
+31DF;CJK STROKE SWG;So;0;ON;;;;;N;;;;;
+31E0;CJK STROKE HXWG;So;0;ON;;;;;N;;;;;
+31E1;CJK STROKE HZZZG;So;0;ON;;;;;N;;;;;
+31E2;CJK STROKE PG;So;0;ON;;;;;N;;;;;
+31E3;CJK STROKE Q;So;0;ON;;;;;N;;;;;
+31F0;KATAKANA LETTER SMALL KU;Lo;0;L;;;;;N;;;;;
+31F1;KATAKANA LETTER SMALL SI;Lo;0;L;;;;;N;;;;;
+31F2;KATAKANA LETTER SMALL SU;Lo;0;L;;;;;N;;;;;
+31F3;KATAKANA LETTER SMALL TO;Lo;0;L;;;;;N;;;;;
+31F4;KATAKANA LETTER SMALL NU;Lo;0;L;;;;;N;;;;;
+31F5;KATAKANA LETTER SMALL HA;Lo;0;L;;;;;N;;;;;
+31F6;KATAKANA LETTER SMALL HI;Lo;0;L;;;;;N;;;;;
+31F7;KATAKANA LETTER SMALL HU;Lo;0;L;;;;;N;;;;;
+31F8;KATAKANA LETTER SMALL HE;Lo;0;L;;;;;N;;;;;
+31F9;KATAKANA LETTER SMALL HO;Lo;0;L;;;;;N;;;;;
+31FA;KATAKANA LETTER SMALL MU;Lo;0;L;;;;;N;;;;;
+31FB;KATAKANA LETTER SMALL RA;Lo;0;L;;;;;N;;;;;
+31FC;KATAKANA LETTER SMALL RI;Lo;0;L;;;;;N;;;;;
+31FD;KATAKANA LETTER SMALL RU;Lo;0;L;;;;;N;;;;;
+31FE;KATAKANA LETTER SMALL RE;Lo;0;L;;;;;N;;;;;
+31FF;KATAKANA LETTER SMALL RO;Lo;0;L;;;;;N;;;;;
+3200;PARENTHESIZED HANGUL KIYEOK;So;0;L;<compat> 0028 1100 0029;;;;N;PARENTHESIZED HANGUL GIYEOG;;;;
+3201;PARENTHESIZED HANGUL NIEUN;So;0;L;<compat> 0028 1102 0029;;;;N;;;;;
+3202;PARENTHESIZED HANGUL TIKEUT;So;0;L;<compat> 0028 1103 0029;;;;N;PARENTHESIZED HANGUL DIGEUD;;;;
+3203;PARENTHESIZED HANGUL RIEUL;So;0;L;<compat> 0028 1105 0029;;;;N;PARENTHESIZED HANGUL LIEUL;;;;
+3204;PARENTHESIZED HANGUL MIEUM;So;0;L;<compat> 0028 1106 0029;;;;N;;;;;
+3205;PARENTHESIZED HANGUL PIEUP;So;0;L;<compat> 0028 1107 0029;;;;N;PARENTHESIZED HANGUL BIEUB;;;;
+3206;PARENTHESIZED HANGUL SIOS;So;0;L;<compat> 0028 1109 0029;;;;N;;;;;
+3207;PARENTHESIZED HANGUL IEUNG;So;0;L;<compat> 0028 110B 0029;;;;N;;;;;
+3208;PARENTHESIZED HANGUL CIEUC;So;0;L;<compat> 0028 110C 0029;;;;N;PARENTHESIZED HANGUL JIEUJ;;;;
+3209;PARENTHESIZED HANGUL CHIEUCH;So;0;L;<compat> 0028 110E 0029;;;;N;PARENTHESIZED HANGUL CIEUC;;;;
+320A;PARENTHESIZED HANGUL KHIEUKH;So;0;L;<compat> 0028 110F 0029;;;;N;PARENTHESIZED HANGUL KIYEOK;;;;
+320B;PARENTHESIZED HANGUL THIEUTH;So;0;L;<compat> 0028 1110 0029;;;;N;PARENTHESIZED HANGUL TIEUT;;;;
+320C;PARENTHESIZED HANGUL PHIEUPH;So;0;L;<compat> 0028 1111 0029;;;;N;PARENTHESIZED HANGUL PIEUP;;;;
+320D;PARENTHESIZED HANGUL HIEUH;So;0;L;<compat> 0028 1112 0029;;;;N;;;;;
+320E;PARENTHESIZED HANGUL KIYEOK A;So;0;L;<compat> 0028 1100 1161 0029;;;;N;PARENTHESIZED HANGUL GA;;;;
+320F;PARENTHESIZED HANGUL NIEUN A;So;0;L;<compat> 0028 1102 1161 0029;;;;N;PARENTHESIZED HANGUL NA;;;;
+3210;PARENTHESIZED HANGUL TIKEUT A;So;0;L;<compat> 0028 1103 1161 0029;;;;N;PARENTHESIZED HANGUL DA;;;;
+3211;PARENTHESIZED HANGUL RIEUL A;So;0;L;<compat> 0028 1105 1161 0029;;;;N;PARENTHESIZED HANGUL LA;;;;
+3212;PARENTHESIZED HANGUL MIEUM A;So;0;L;<compat> 0028 1106 1161 0029;;;;N;PARENTHESIZED HANGUL MA;;;;
+3213;PARENTHESIZED HANGUL PIEUP A;So;0;L;<compat> 0028 1107 1161 0029;;;;N;PARENTHESIZED HANGUL BA;;;;
+3214;PARENTHESIZED HANGUL SIOS A;So;0;L;<compat> 0028 1109 1161 0029;;;;N;PARENTHESIZED HANGUL SA;;;;
+3215;PARENTHESIZED HANGUL IEUNG A;So;0;L;<compat> 0028 110B 1161 0029;;;;N;PARENTHESIZED HANGUL A;;;;
+3216;PARENTHESIZED HANGUL CIEUC A;So;0;L;<compat> 0028 110C 1161 0029;;;;N;PARENTHESIZED HANGUL JA;;;;
+3217;PARENTHESIZED HANGUL CHIEUCH A;So;0;L;<compat> 0028 110E 1161 0029;;;;N;PARENTHESIZED HANGUL CA;;;;
+3218;PARENTHESIZED HANGUL KHIEUKH A;So;0;L;<compat> 0028 110F 1161 0029;;;;N;PARENTHESIZED HANGUL KA;;;;
+3219;PARENTHESIZED HANGUL THIEUTH A;So;0;L;<compat> 0028 1110 1161 0029;;;;N;PARENTHESIZED HANGUL TA;;;;
+321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L;<compat> 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;;
+321B;PARENTHESIZED HANGUL HIEUH A;So;0;L;<compat> 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;;
+321C;PARENTHESIZED HANGUL CIEUC U;So;0;L;<compat> 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;;
+321D;PARENTHESIZED KOREAN CHARACTER OJEON;So;0;ON;<compat> 0028 110B 1169 110C 1165 11AB 0029;;;;N;;;;;
+321E;PARENTHESIZED KOREAN CHARACTER O HU;So;0;ON;<compat> 0028 110B 1169 1112 116E 0029;;;;N;;;;;
+3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L;<compat> 0028 4E00 0029;;;1;N;;;;;
+3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L;<compat> 0028 4E8C 0029;;;2;N;;;;;
+3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L;<compat> 0028 4E09 0029;;;3;N;;;;;
+3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L;<compat> 0028 56DB 0029;;;4;N;;;;;
+3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L;<compat> 0028 4E94 0029;;;5;N;;;;;
+3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L;<compat> 0028 516D 0029;;;6;N;;;;;
+3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L;<compat> 0028 4E03 0029;;;7;N;;;;;
+3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L;<compat> 0028 516B 0029;;;8;N;;;;;
+3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L;<compat> 0028 4E5D 0029;;;9;N;;;;;
+3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L;<compat> 0028 5341 0029;;;10;N;;;;;
+322A;PARENTHESIZED IDEOGRAPH MOON;So;0;L;<compat> 0028 6708 0029;;;;N;;;;;
+322B;PARENTHESIZED IDEOGRAPH FIRE;So;0;L;<compat> 0028 706B 0029;;;;N;;;;;
+322C;PARENTHESIZED IDEOGRAPH WATER;So;0;L;<compat> 0028 6C34 0029;;;;N;;;;;
+322D;PARENTHESIZED IDEOGRAPH WOOD;So;0;L;<compat> 0028 6728 0029;;;;N;;;;;
+322E;PARENTHESIZED IDEOGRAPH METAL;So;0;L;<compat> 0028 91D1 0029;;;;N;;;;;
+322F;PARENTHESIZED IDEOGRAPH EARTH;So;0;L;<compat> 0028 571F 0029;;;;N;;;;;
+3230;PARENTHESIZED IDEOGRAPH SUN;So;0;L;<compat> 0028 65E5 0029;;;;N;;;;;
+3231;PARENTHESIZED IDEOGRAPH STOCK;So;0;L;<compat> 0028 682A 0029;;;;N;;;;;
+3232;PARENTHESIZED IDEOGRAPH HAVE;So;0;L;<compat> 0028 6709 0029;;;;N;;;;;
+3233;PARENTHESIZED IDEOGRAPH SOCIETY;So;0;L;<compat> 0028 793E 0029;;;;N;;;;;
+3234;PARENTHESIZED IDEOGRAPH NAME;So;0;L;<compat> 0028 540D 0029;;;;N;;;;;
+3235;PARENTHESIZED IDEOGRAPH SPECIAL;So;0;L;<compat> 0028 7279 0029;;;;N;;;;;
+3236;PARENTHESIZED IDEOGRAPH FINANCIAL;So;0;L;<compat> 0028 8CA1 0029;;;;N;;;;;
+3237;PARENTHESIZED IDEOGRAPH CONGRATULATION;So;0;L;<compat> 0028 795D 0029;;;;N;;;;;
+3238;PARENTHESIZED IDEOGRAPH LABOR;So;0;L;<compat> 0028 52B4 0029;;;;N;;;;;
+3239;PARENTHESIZED IDEOGRAPH REPRESENT;So;0;L;<compat> 0028 4EE3 0029;;;;N;;;;;
+323A;PARENTHESIZED IDEOGRAPH CALL;So;0;L;<compat> 0028 547C 0029;;;;N;;;;;
+323B;PARENTHESIZED IDEOGRAPH STUDY;So;0;L;<compat> 0028 5B66 0029;;;;N;;;;;
+323C;PARENTHESIZED IDEOGRAPH SUPERVISE;So;0;L;<compat> 0028 76E3 0029;;;;N;;;;;
+323D;PARENTHESIZED IDEOGRAPH ENTERPRISE;So;0;L;<compat> 0028 4F01 0029;;;;N;;;;;
+323E;PARENTHESIZED IDEOGRAPH RESOURCE;So;0;L;<compat> 0028 8CC7 0029;;;;N;;;;;
+323F;PARENTHESIZED IDEOGRAPH ALLIANCE;So;0;L;<compat> 0028 5354 0029;;;;N;;;;;
+3240;PARENTHESIZED IDEOGRAPH FESTIVAL;So;0;L;<compat> 0028 796D 0029;;;;N;;;;;
+3241;PARENTHESIZED IDEOGRAPH REST;So;0;L;<compat> 0028 4F11 0029;;;;N;;;;;
+3242;PARENTHESIZED IDEOGRAPH SELF;So;0;L;<compat> 0028 81EA 0029;;;;N;;;;;
+3243;PARENTHESIZED IDEOGRAPH REACH;So;0;L;<compat> 0028 81F3 0029;;;;N;;;;;
+3244;CIRCLED IDEOGRAPH QUESTION;So;0;L;<circle> 554F;;;;N;;;;;
+3245;CIRCLED IDEOGRAPH KINDERGARTEN;So;0;L;<circle> 5E7C;;;;N;;;;;
+3246;CIRCLED IDEOGRAPH SCHOOL;So;0;L;<circle> 6587;;;;N;;;;;
+3247;CIRCLED IDEOGRAPH KOTO;So;0;L;<circle> 7B8F;;;;N;;;;;
+3248;CIRCLED NUMBER TEN ON BLACK SQUARE;No;0;L;;;;10;N;;;;;
+3249;CIRCLED NUMBER TWENTY ON BLACK SQUARE;No;0;L;;;;20;N;;;;;
+324A;CIRCLED NUMBER THIRTY ON BLACK SQUARE;No;0;L;;;;30;N;;;;;
+324B;CIRCLED NUMBER FORTY ON BLACK SQUARE;No;0;L;;;;40;N;;;;;
+324C;CIRCLED NUMBER FIFTY ON BLACK SQUARE;No;0;L;;;;50;N;;;;;
+324D;CIRCLED NUMBER SIXTY ON BLACK SQUARE;No;0;L;;;;60;N;;;;;
+324E;CIRCLED NUMBER SEVENTY ON BLACK SQUARE;No;0;L;;;;70;N;;;;;
+324F;CIRCLED NUMBER EIGHTY ON BLACK SQUARE;No;0;L;;;;80;N;;;;;
+3250;PARTNERSHIP SIGN;So;0;ON;<square> 0050 0054 0045;;;;N;;;;;
+3251;CIRCLED NUMBER TWENTY ONE;No;0;ON;<circle> 0032 0031;;;21;N;;;;;
+3252;CIRCLED NUMBER TWENTY TWO;No;0;ON;<circle> 0032 0032;;;22;N;;;;;
+3253;CIRCLED NUMBER TWENTY THREE;No;0;ON;<circle> 0032 0033;;;23;N;;;;;
+3254;CIRCLED NUMBER TWENTY FOUR;No;0;ON;<circle> 0032 0034;;;24;N;;;;;
+3255;CIRCLED NUMBER TWENTY FIVE;No;0;ON;<circle> 0032 0035;;;25;N;;;;;
+3256;CIRCLED NUMBER TWENTY SIX;No;0;ON;<circle> 0032 0036;;;26;N;;;;;
+3257;CIRCLED NUMBER TWENTY SEVEN;No;0;ON;<circle> 0032 0037;;;27;N;;;;;
+3258;CIRCLED NUMBER TWENTY EIGHT;No;0;ON;<circle> 0032 0038;;;28;N;;;;;
+3259;CIRCLED NUMBER TWENTY NINE;No;0;ON;<circle> 0032 0039;;;29;N;;;;;
+325A;CIRCLED NUMBER THIRTY;No;0;ON;<circle> 0033 0030;;;30;N;;;;;
+325B;CIRCLED NUMBER THIRTY ONE;No;0;ON;<circle> 0033 0031;;;31;N;;;;;
+325C;CIRCLED NUMBER THIRTY TWO;No;0;ON;<circle> 0033 0032;;;32;N;;;;;
+325D;CIRCLED NUMBER THIRTY THREE;No;0;ON;<circle> 0033 0033;;;33;N;;;;;
+325E;CIRCLED NUMBER THIRTY FOUR;No;0;ON;<circle> 0033 0034;;;34;N;;;;;
+325F;CIRCLED NUMBER THIRTY FIVE;No;0;ON;<circle> 0033 0035;;;35;N;;;;;
+3260;CIRCLED HANGUL KIYEOK;So;0;L;<circle> 1100;;;;N;CIRCLED HANGUL GIYEOG;;;;
+3261;CIRCLED HANGUL NIEUN;So;0;L;<circle> 1102;;;;N;;;;;
+3262;CIRCLED HANGUL TIKEUT;So;0;L;<circle> 1103;;;;N;CIRCLED HANGUL DIGEUD;;;;
+3263;CIRCLED HANGUL RIEUL;So;0;L;<circle> 1105;;;;N;CIRCLED HANGUL LIEUL;;;;
+3264;CIRCLED HANGUL MIEUM;So;0;L;<circle> 1106;;;;N;;;;;
+3265;CIRCLED HANGUL PIEUP;So;0;L;<circle> 1107;;;;N;CIRCLED HANGUL BIEUB;;;;
+3266;CIRCLED HANGUL SIOS;So;0;L;<circle> 1109;;;;N;;;;;
+3267;CIRCLED HANGUL IEUNG;So;0;L;<circle> 110B;;;;N;;;;;
+3268;CIRCLED HANGUL CIEUC;So;0;L;<circle> 110C;;;;N;CIRCLED HANGUL JIEUJ;;;;
+3269;CIRCLED HANGUL CHIEUCH;So;0;L;<circle> 110E;;;;N;CIRCLED HANGUL CIEUC;;;;
+326A;CIRCLED HANGUL KHIEUKH;So;0;L;<circle> 110F;;;;N;CIRCLED HANGUL KIYEOK;;;;
+326B;CIRCLED HANGUL THIEUTH;So;0;L;<circle> 1110;;;;N;CIRCLED HANGUL TIEUT;;;;
+326C;CIRCLED HANGUL PHIEUPH;So;0;L;<circle> 1111;;;;N;CIRCLED HANGUL PIEUP;;;;
+326D;CIRCLED HANGUL HIEUH;So;0;L;<circle> 1112;;;;N;;;;;
+326E;CIRCLED HANGUL KIYEOK A;So;0;L;<circle> 1100 1161;;;;N;CIRCLED HANGUL GA;;;;
+326F;CIRCLED HANGUL NIEUN A;So;0;L;<circle> 1102 1161;;;;N;CIRCLED HANGUL NA;;;;
+3270;CIRCLED HANGUL TIKEUT A;So;0;L;<circle> 1103 1161;;;;N;CIRCLED HANGUL DA;;;;
+3271;CIRCLED HANGUL RIEUL A;So;0;L;<circle> 1105 1161;;;;N;CIRCLED HANGUL LA;;;;
+3272;CIRCLED HANGUL MIEUM A;So;0;L;<circle> 1106 1161;;;;N;CIRCLED HANGUL MA;;;;
+3273;CIRCLED HANGUL PIEUP A;So;0;L;<circle> 1107 1161;;;;N;CIRCLED HANGUL BA;;;;
+3274;CIRCLED HANGUL SIOS A;So;0;L;<circle> 1109 1161;;;;N;CIRCLED HANGUL SA;;;;
+3275;CIRCLED HANGUL IEUNG A;So;0;L;<circle> 110B 1161;;;;N;CIRCLED HANGUL A;;;;
+3276;CIRCLED HANGUL CIEUC A;So;0;L;<circle> 110C 1161;;;;N;CIRCLED HANGUL JA;;;;
+3277;CIRCLED HANGUL CHIEUCH A;So;0;L;<circle> 110E 1161;;;;N;CIRCLED HANGUL CA;;;;
+3278;CIRCLED HANGUL KHIEUKH A;So;0;L;<circle> 110F 1161;;;;N;CIRCLED HANGUL KA;;;;
+3279;CIRCLED HANGUL THIEUTH A;So;0;L;<circle> 1110 1161;;;;N;CIRCLED HANGUL TA;;;;
+327A;CIRCLED HANGUL PHIEUPH A;So;0;L;<circle> 1111 1161;;;;N;CIRCLED HANGUL PA;;;;
+327B;CIRCLED HANGUL HIEUH A;So;0;L;<circle> 1112 1161;;;;N;CIRCLED HANGUL HA;;;;
+327C;CIRCLED KOREAN CHARACTER CHAMKO;So;0;ON;<circle> 110E 1161 11B7 1100 1169;;;;N;;;;;
+327D;CIRCLED KOREAN CHARACTER JUEUI;So;0;ON;<circle> 110C 116E 110B 1174;;;;N;;;;;
+327E;CIRCLED HANGUL IEUNG U;So;0;ON;<circle> 110B 116E;;;;N;;;;;
+327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;;
+3280;CIRCLED IDEOGRAPH ONE;No;0;L;<circle> 4E00;;;1;N;;;;;
+3281;CIRCLED IDEOGRAPH TWO;No;0;L;<circle> 4E8C;;;2;N;;;;;
+3282;CIRCLED IDEOGRAPH THREE;No;0;L;<circle> 4E09;;;3;N;;;;;
+3283;CIRCLED IDEOGRAPH FOUR;No;0;L;<circle> 56DB;;;4;N;;;;;
+3284;CIRCLED IDEOGRAPH FIVE;No;0;L;<circle> 4E94;;;5;N;;;;;
+3285;CIRCLED IDEOGRAPH SIX;No;0;L;<circle> 516D;;;6;N;;;;;
+3286;CIRCLED IDEOGRAPH SEVEN;No;0;L;<circle> 4E03;;;7;N;;;;;
+3287;CIRCLED IDEOGRAPH EIGHT;No;0;L;<circle> 516B;;;8;N;;;;;
+3288;CIRCLED IDEOGRAPH NINE;No;0;L;<circle> 4E5D;;;9;N;;;;;
+3289;CIRCLED IDEOGRAPH TEN;No;0;L;<circle> 5341;;;10;N;;;;;
+328A;CIRCLED IDEOGRAPH MOON;So;0;L;<circle> 6708;;;;N;;;;;
+328B;CIRCLED IDEOGRAPH FIRE;So;0;L;<circle> 706B;;;;N;;;;;
+328C;CIRCLED IDEOGRAPH WATER;So;0;L;<circle> 6C34;;;;N;;;;;
+328D;CIRCLED IDEOGRAPH WOOD;So;0;L;<circle> 6728;;;;N;;;;;
+328E;CIRCLED IDEOGRAPH METAL;So;0;L;<circle> 91D1;;;;N;;;;;
+328F;CIRCLED IDEOGRAPH EARTH;So;0;L;<circle> 571F;;;;N;;;;;
+3290;CIRCLED IDEOGRAPH SUN;So;0;L;<circle> 65E5;;;;N;;;;;
+3291;CIRCLED IDEOGRAPH STOCK;So;0;L;<circle> 682A;;;;N;;;;;
+3292;CIRCLED IDEOGRAPH HAVE;So;0;L;<circle> 6709;;;;N;;;;;
+3293;CIRCLED IDEOGRAPH SOCIETY;So;0;L;<circle> 793E;;;;N;;;;;
+3294;CIRCLED IDEOGRAPH NAME;So;0;L;<circle> 540D;;;;N;;;;;
+3295;CIRCLED IDEOGRAPH SPECIAL;So;0;L;<circle> 7279;;;;N;;;;;
+3296;CIRCLED IDEOGRAPH FINANCIAL;So;0;L;<circle> 8CA1;;;;N;;;;;
+3297;CIRCLED IDEOGRAPH CONGRATULATION;So;0;L;<circle> 795D;;;;N;;;;;
+3298;CIRCLED IDEOGRAPH LABOR;So;0;L;<circle> 52B4;;;;N;;;;;
+3299;CIRCLED IDEOGRAPH SECRET;So;0;L;<circle> 79D8;;;;N;;;;;
+329A;CIRCLED IDEOGRAPH MALE;So;0;L;<circle> 7537;;;;N;;;;;
+329B;CIRCLED IDEOGRAPH FEMALE;So;0;L;<circle> 5973;;;;N;;;;;
+329C;CIRCLED IDEOGRAPH SUITABLE;So;0;L;<circle> 9069;;;;N;;;;;
+329D;CIRCLED IDEOGRAPH EXCELLENT;So;0;L;<circle> 512A;;;;N;;;;;
+329E;CIRCLED IDEOGRAPH PRINT;So;0;L;<circle> 5370;;;;N;;;;;
+329F;CIRCLED IDEOGRAPH ATTENTION;So;0;L;<circle> 6CE8;;;;N;;;;;
+32A0;CIRCLED IDEOGRAPH ITEM;So;0;L;<circle> 9805;;;;N;;;;;
+32A1;CIRCLED IDEOGRAPH REST;So;0;L;<circle> 4F11;;;;N;;;;;
+32A2;CIRCLED IDEOGRAPH COPY;So;0;L;<circle> 5199;;;;N;;;;;
+32A3;CIRCLED IDEOGRAPH CORRECT;So;0;L;<circle> 6B63;;;;N;;;;;
+32A4;CIRCLED IDEOGRAPH HIGH;So;0;L;<circle> 4E0A;;;;N;;;;;
+32A5;CIRCLED IDEOGRAPH CENTRE;So;0;L;<circle> 4E2D;;;;N;CIRCLED IDEOGRAPH CENTER;;;;
+32A6;CIRCLED IDEOGRAPH LOW;So;0;L;<circle> 4E0B;;;;N;;;;;
+32A7;CIRCLED IDEOGRAPH LEFT;So;0;L;<circle> 5DE6;;;;N;;;;;
+32A8;CIRCLED IDEOGRAPH RIGHT;So;0;L;<circle> 53F3;;;;N;;;;;
+32A9;CIRCLED IDEOGRAPH MEDICINE;So;0;L;<circle> 533B;;;;N;;;;;
+32AA;CIRCLED IDEOGRAPH RELIGION;So;0;L;<circle> 5B97;;;;N;;;;;
+32AB;CIRCLED IDEOGRAPH STUDY;So;0;L;<circle> 5B66;;;;N;;;;;
+32AC;CIRCLED IDEOGRAPH SUPERVISE;So;0;L;<circle> 76E3;;;;N;;;;;
+32AD;CIRCLED IDEOGRAPH ENTERPRISE;So;0;L;<circle> 4F01;;;;N;;;;;
+32AE;CIRCLED IDEOGRAPH RESOURCE;So;0;L;<circle> 8CC7;;;;N;;;;;
+32AF;CIRCLED IDEOGRAPH ALLIANCE;So;0;L;<circle> 5354;;;;N;;;;;
+32B0;CIRCLED IDEOGRAPH NIGHT;So;0;L;<circle> 591C;;;;N;;;;;
+32B1;CIRCLED NUMBER THIRTY SIX;No;0;ON;<circle> 0033 0036;;;36;N;;;;;
+32B2;CIRCLED NUMBER THIRTY SEVEN;No;0;ON;<circle> 0033 0037;;;37;N;;;;;
+32B3;CIRCLED NUMBER THIRTY EIGHT;No;0;ON;<circle> 0033 0038;;;38;N;;;;;
+32B4;CIRCLED NUMBER THIRTY NINE;No;0;ON;<circle> 0033 0039;;;39;N;;;;;
+32B5;CIRCLED NUMBER FORTY;No;0;ON;<circle> 0034 0030;;;40;N;;;;;
+32B6;CIRCLED NUMBER FORTY ONE;No;0;ON;<circle> 0034 0031;;;41;N;;;;;
+32B7;CIRCLED NUMBER FORTY TWO;No;0;ON;<circle> 0034 0032;;;42;N;;;;;
+32B8;CIRCLED NUMBER FORTY THREE;No;0;ON;<circle> 0034 0033;;;43;N;;;;;
+32B9;CIRCLED NUMBER FORTY FOUR;No;0;ON;<circle> 0034 0034;;;44;N;;;;;
+32BA;CIRCLED NUMBER FORTY FIVE;No;0;ON;<circle> 0034 0035;;;45;N;;;;;
+32BB;CIRCLED NUMBER FORTY SIX;No;0;ON;<circle> 0034 0036;;;46;N;;;;;
+32BC;CIRCLED NUMBER FORTY SEVEN;No;0;ON;<circle> 0034 0037;;;47;N;;;;;
+32BD;CIRCLED NUMBER FORTY EIGHT;No;0;ON;<circle> 0034 0038;;;48;N;;;;;
+32BE;CIRCLED NUMBER FORTY NINE;No;0;ON;<circle> 0034 0039;;;49;N;;;;;
+32BF;CIRCLED NUMBER FIFTY;No;0;ON;<circle> 0035 0030;;;50;N;;;;;
+32C0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY;So;0;L;<compat> 0031 6708;;;;N;;;;;
+32C1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY;So;0;L;<compat> 0032 6708;;;;N;;;;;
+32C2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH;So;0;L;<compat> 0033 6708;;;;N;;;;;
+32C3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL;So;0;L;<compat> 0034 6708;;;;N;;;;;
+32C4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY;So;0;L;<compat> 0035 6708;;;;N;;;;;
+32C5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE;So;0;L;<compat> 0036 6708;;;;N;;;;;
+32C6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY;So;0;L;<compat> 0037 6708;;;;N;;;;;
+32C7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST;So;0;L;<compat> 0038 6708;;;;N;;;;;
+32C8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER;So;0;L;<compat> 0039 6708;;;;N;;;;;
+32C9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER;So;0;L;<compat> 0031 0030 6708;;;;N;;;;;
+32CA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER;So;0;L;<compat> 0031 0031 6708;;;;N;;;;;
+32CB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER;So;0;L;<compat> 0031 0032 6708;;;;N;;;;;
+32CC;SQUARE HG;So;0;ON;<square> 0048 0067;;;;N;;;;;
+32CD;SQUARE ERG;So;0;ON;<square> 0065 0072 0067;;;;N;;;;;
+32CE;SQUARE EV;So;0;ON;<square> 0065 0056;;;;N;;;;;
+32CF;LIMITED LIABILITY SIGN;So;0;ON;<square> 004C 0054 0044;;;;N;;;;;
+32D0;CIRCLED KATAKANA A;So;0;L;<circle> 30A2;;;;N;;;;;
+32D1;CIRCLED KATAKANA I;So;0;L;<circle> 30A4;;;;N;;;;;
+32D2;CIRCLED KATAKANA U;So;0;L;<circle> 30A6;;;;N;;;;;
+32D3;CIRCLED KATAKANA E;So;0;L;<circle> 30A8;;;;N;;;;;
+32D4;CIRCLED KATAKANA O;So;0;L;<circle> 30AA;;;;N;;;;;
+32D5;CIRCLED KATAKANA KA;So;0;L;<circle> 30AB;;;;N;;;;;
+32D6;CIRCLED KATAKANA KI;So;0;L;<circle> 30AD;;;;N;;;;;
+32D7;CIRCLED KATAKANA KU;So;0;L;<circle> 30AF;;;;N;;;;;
+32D8;CIRCLED KATAKANA KE;So;0;L;<circle> 30B1;;;;N;;;;;
+32D9;CIRCLED KATAKANA KO;So;0;L;<circle> 30B3;;;;N;;;;;
+32DA;CIRCLED KATAKANA SA;So;0;L;<circle> 30B5;;;;N;;;;;
+32DB;CIRCLED KATAKANA SI;So;0;L;<circle> 30B7;;;;N;;;;;
+32DC;CIRCLED KATAKANA SU;So;0;L;<circle> 30B9;;;;N;;;;;
+32DD;CIRCLED KATAKANA SE;So;0;L;<circle> 30BB;;;;N;;;;;
+32DE;CIRCLED KATAKANA SO;So;0;L;<circle> 30BD;;;;N;;;;;
+32DF;CIRCLED KATAKANA TA;So;0;L;<circle> 30BF;;;;N;;;;;
+32E0;CIRCLED KATAKANA TI;So;0;L;<circle> 30C1;;;;N;;;;;
+32E1;CIRCLED KATAKANA TU;So;0;L;<circle> 30C4;;;;N;;;;;
+32E2;CIRCLED KATAKANA TE;So;0;L;<circle> 30C6;;;;N;;;;;
+32E3;CIRCLED KATAKANA TO;So;0;L;<circle> 30C8;;;;N;;;;;
+32E4;CIRCLED KATAKANA NA;So;0;L;<circle> 30CA;;;;N;;;;;
+32E5;CIRCLED KATAKANA NI;So;0;L;<circle> 30CB;;;;N;;;;;
+32E6;CIRCLED KATAKANA NU;So;0;L;<circle> 30CC;;;;N;;;;;
+32E7;CIRCLED KATAKANA NE;So;0;L;<circle> 30CD;;;;N;;;;;
+32E8;CIRCLED KATAKANA NO;So;0;L;<circle> 30CE;;;;N;;;;;
+32E9;CIRCLED KATAKANA HA;So;0;L;<circle> 30CF;;;;N;;;;;
+32EA;CIRCLED KATAKANA HI;So;0;L;<circle> 30D2;;;;N;;;;;
+32EB;CIRCLED KATAKANA HU;So;0;L;<circle> 30D5;;;;N;;;;;
+32EC;CIRCLED KATAKANA HE;So;0;L;<circle> 30D8;;;;N;;;;;
+32ED;CIRCLED KATAKANA HO;So;0;L;<circle> 30DB;;;;N;;;;;
+32EE;CIRCLED KATAKANA MA;So;0;L;<circle> 30DE;;;;N;;;;;
+32EF;CIRCLED KATAKANA MI;So;0;L;<circle> 30DF;;;;N;;;;;
+32F0;CIRCLED KATAKANA MU;So;0;L;<circle> 30E0;;;;N;;;;;
+32F1;CIRCLED KATAKANA ME;So;0;L;<circle> 30E1;;;;N;;;;;
+32F2;CIRCLED KATAKANA MO;So;0;L;<circle> 30E2;;;;N;;;;;
+32F3;CIRCLED KATAKANA YA;So;0;L;<circle> 30E4;;;;N;;;;;
+32F4;CIRCLED KATAKANA YU;So;0;L;<circle> 30E6;;;;N;;;;;
+32F5;CIRCLED KATAKANA YO;So;0;L;<circle> 30E8;;;;N;;;;;
+32F6;CIRCLED KATAKANA RA;So;0;L;<circle> 30E9;;;;N;;;;;
+32F7;CIRCLED KATAKANA RI;So;0;L;<circle> 30EA;;;;N;;;;;
+32F8;CIRCLED KATAKANA RU;So;0;L;<circle> 30EB;;;;N;;;;;
+32F9;CIRCLED KATAKANA RE;So;0;L;<circle> 30EC;;;;N;;;;;
+32FA;CIRCLED KATAKANA RO;So;0;L;<circle> 30ED;;;;N;;;;;
+32FB;CIRCLED KATAKANA WA;So;0;L;<circle> 30EF;;;;N;;;;;
+32FC;CIRCLED KATAKANA WI;So;0;L;<circle> 30F0;;;;N;;;;;
+32FD;CIRCLED KATAKANA WE;So;0;L;<circle> 30F1;;;;N;;;;;
+32FE;CIRCLED KATAKANA WO;So;0;L;<circle> 30F2;;;;N;;;;;
+3300;SQUARE APAATO;So;0;L;<square> 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;;
+3301;SQUARE ARUHUA;So;0;L;<square> 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;;
+3302;SQUARE ANPEA;So;0;L;<square> 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;;
+3303;SQUARE AARU;So;0;L;<square> 30A2 30FC 30EB;;;;N;SQUARED AARU;;;;
+3304;SQUARE ININGU;So;0;L;<square> 30A4 30CB 30F3 30B0;;;;N;SQUARED ININGU;;;;
+3305;SQUARE INTI;So;0;L;<square> 30A4 30F3 30C1;;;;N;SQUARED INTI;;;;
+3306;SQUARE UON;So;0;L;<square> 30A6 30A9 30F3;;;;N;SQUARED UON;;;;
+3307;SQUARE ESUKUUDO;So;0;L;<square> 30A8 30B9 30AF 30FC 30C9;;;;N;SQUARED ESUKUUDO;;;;
+3308;SQUARE EEKAA;So;0;L;<square> 30A8 30FC 30AB 30FC;;;;N;SQUARED EEKAA;;;;
+3309;SQUARE ONSU;So;0;L;<square> 30AA 30F3 30B9;;;;N;SQUARED ONSU;;;;
+330A;SQUARE OOMU;So;0;L;<square> 30AA 30FC 30E0;;;;N;SQUARED OOMU;;;;
+330B;SQUARE KAIRI;So;0;L;<square> 30AB 30A4 30EA;;;;N;SQUARED KAIRI;;;;
+330C;SQUARE KARATTO;So;0;L;<square> 30AB 30E9 30C3 30C8;;;;N;SQUARED KARATTO;;;;
+330D;SQUARE KARORII;So;0;L;<square> 30AB 30ED 30EA 30FC;;;;N;SQUARED KARORII;;;;
+330E;SQUARE GARON;So;0;L;<square> 30AC 30ED 30F3;;;;N;SQUARED GARON;;;;
+330F;SQUARE GANMA;So;0;L;<square> 30AC 30F3 30DE;;;;N;SQUARED GANMA;;;;
+3310;SQUARE GIGA;So;0;L;<square> 30AE 30AC;;;;N;SQUARED GIGA;;;;
+3311;SQUARE GINII;So;0;L;<square> 30AE 30CB 30FC;;;;N;SQUARED GINII;;;;
+3312;SQUARE KYURII;So;0;L;<square> 30AD 30E5 30EA 30FC;;;;N;SQUARED KYURII;;;;
+3313;SQUARE GIRUDAA;So;0;L;<square> 30AE 30EB 30C0 30FC;;;;N;SQUARED GIRUDAA;;;;
+3314;SQUARE KIRO;So;0;L;<square> 30AD 30ED;;;;N;SQUARED KIRO;;;;
+3315;SQUARE KIROGURAMU;So;0;L;<square> 30AD 30ED 30B0 30E9 30E0;;;;N;SQUARED KIROGURAMU;;;;
+3316;SQUARE KIROMEETORU;So;0;L;<square> 30AD 30ED 30E1 30FC 30C8 30EB;;;;N;SQUARED KIROMEETORU;;;;
+3317;SQUARE KIROWATTO;So;0;L;<square> 30AD 30ED 30EF 30C3 30C8;;;;N;SQUARED KIROWATTO;;;;
+3318;SQUARE GURAMU;So;0;L;<square> 30B0 30E9 30E0;;;;N;SQUARED GURAMU;;;;
+3319;SQUARE GURAMUTON;So;0;L;<square> 30B0 30E9 30E0 30C8 30F3;;;;N;SQUARED GURAMUTON;;;;
+331A;SQUARE KURUZEIRO;So;0;L;<square> 30AF 30EB 30BC 30A4 30ED;;;;N;SQUARED KURUZEIRO;;;;
+331B;SQUARE KUROONE;So;0;L;<square> 30AF 30ED 30FC 30CD;;;;N;SQUARED KUROONE;;;;
+331C;SQUARE KEESU;So;0;L;<square> 30B1 30FC 30B9;;;;N;SQUARED KEESU;;;;
+331D;SQUARE KORUNA;So;0;L;<square> 30B3 30EB 30CA;;;;N;SQUARED KORUNA;;;;
+331E;SQUARE KOOPO;So;0;L;<square> 30B3 30FC 30DD;;;;N;SQUARED KOOPO;;;;
+331F;SQUARE SAIKURU;So;0;L;<square> 30B5 30A4 30AF 30EB;;;;N;SQUARED SAIKURU;;;;
+3320;SQUARE SANTIIMU;So;0;L;<square> 30B5 30F3 30C1 30FC 30E0;;;;N;SQUARED SANTIIMU;;;;
+3321;SQUARE SIRINGU;So;0;L;<square> 30B7 30EA 30F3 30B0;;;;N;SQUARED SIRINGU;;;;
+3322;SQUARE SENTI;So;0;L;<square> 30BB 30F3 30C1;;;;N;SQUARED SENTI;;;;
+3323;SQUARE SENTO;So;0;L;<square> 30BB 30F3 30C8;;;;N;SQUARED SENTO;;;;
+3324;SQUARE DAASU;So;0;L;<square> 30C0 30FC 30B9;;;;N;SQUARED DAASU;;;;
+3325;SQUARE DESI;So;0;L;<square> 30C7 30B7;;;;N;SQUARED DESI;;;;
+3326;SQUARE DORU;So;0;L;<square> 30C9 30EB;;;;N;SQUARED DORU;;;;
+3327;SQUARE TON;So;0;L;<square> 30C8 30F3;;;;N;SQUARED TON;;;;
+3328;SQUARE NANO;So;0;L;<square> 30CA 30CE;;;;N;SQUARED NANO;;;;
+3329;SQUARE NOTTO;So;0;L;<square> 30CE 30C3 30C8;;;;N;SQUARED NOTTO;;;;
+332A;SQUARE HAITU;So;0;L;<square> 30CF 30A4 30C4;;;;N;SQUARED HAITU;;;;
+332B;SQUARE PAASENTO;So;0;L;<square> 30D1 30FC 30BB 30F3 30C8;;;;N;SQUARED PAASENTO;;;;
+332C;SQUARE PAATU;So;0;L;<square> 30D1 30FC 30C4;;;;N;SQUARED PAATU;;;;
+332D;SQUARE BAARERU;So;0;L;<square> 30D0 30FC 30EC 30EB;;;;N;SQUARED BAARERU;;;;
+332E;SQUARE PIASUTORU;So;0;L;<square> 30D4 30A2 30B9 30C8 30EB;;;;N;SQUARED PIASUTORU;;;;
+332F;SQUARE PIKURU;So;0;L;<square> 30D4 30AF 30EB;;;;N;SQUARED PIKURU;;;;
+3330;SQUARE PIKO;So;0;L;<square> 30D4 30B3;;;;N;SQUARED PIKO;;;;
+3331;SQUARE BIRU;So;0;L;<square> 30D3 30EB;;;;N;SQUARED BIRU;;;;
+3332;SQUARE HUARADDO;So;0;L;<square> 30D5 30A1 30E9 30C3 30C9;;;;N;SQUARED HUARADDO;;;;
+3333;SQUARE HUIITO;So;0;L;<square> 30D5 30A3 30FC 30C8;;;;N;SQUARED HUIITO;;;;
+3334;SQUARE BUSSYERU;So;0;L;<square> 30D6 30C3 30B7 30A7 30EB;;;;N;SQUARED BUSSYERU;;;;
+3335;SQUARE HURAN;So;0;L;<square> 30D5 30E9 30F3;;;;N;SQUARED HURAN;;;;
+3336;SQUARE HEKUTAARU;So;0;L;<square> 30D8 30AF 30BF 30FC 30EB;;;;N;SQUARED HEKUTAARU;;;;
+3337;SQUARE PESO;So;0;L;<square> 30DA 30BD;;;;N;SQUARED PESO;;;;
+3338;SQUARE PENIHI;So;0;L;<square> 30DA 30CB 30D2;;;;N;SQUARED PENIHI;;;;
+3339;SQUARE HERUTU;So;0;L;<square> 30D8 30EB 30C4;;;;N;SQUARED HERUTU;;;;
+333A;SQUARE PENSU;So;0;L;<square> 30DA 30F3 30B9;;;;N;SQUARED PENSU;;;;
+333B;SQUARE PEEZI;So;0;L;<square> 30DA 30FC 30B8;;;;N;SQUARED PEEZI;;;;
+333C;SQUARE BEETA;So;0;L;<square> 30D9 30FC 30BF;;;;N;SQUARED BEETA;;;;
+333D;SQUARE POINTO;So;0;L;<square> 30DD 30A4 30F3 30C8;;;;N;SQUARED POINTO;;;;
+333E;SQUARE BORUTO;So;0;L;<square> 30DC 30EB 30C8;;;;N;SQUARED BORUTO;;;;
+333F;SQUARE HON;So;0;L;<square> 30DB 30F3;;;;N;SQUARED HON;;;;
+3340;SQUARE PONDO;So;0;L;<square> 30DD 30F3 30C9;;;;N;SQUARED PONDO;;;;
+3341;SQUARE HOORU;So;0;L;<square> 30DB 30FC 30EB;;;;N;SQUARED HOORU;;;;
+3342;SQUARE HOON;So;0;L;<square> 30DB 30FC 30F3;;;;N;SQUARED HOON;;;;
+3343;SQUARE MAIKURO;So;0;L;<square> 30DE 30A4 30AF 30ED;;;;N;SQUARED MAIKURO;;;;
+3344;SQUARE MAIRU;So;0;L;<square> 30DE 30A4 30EB;;;;N;SQUARED MAIRU;;;;
+3345;SQUARE MAHHA;So;0;L;<square> 30DE 30C3 30CF;;;;N;SQUARED MAHHA;;;;
+3346;SQUARE MARUKU;So;0;L;<square> 30DE 30EB 30AF;;;;N;SQUARED MARUKU;;;;
+3347;SQUARE MANSYON;So;0;L;<square> 30DE 30F3 30B7 30E7 30F3;;;;N;SQUARED MANSYON;;;;
+3348;SQUARE MIKURON;So;0;L;<square> 30DF 30AF 30ED 30F3;;;;N;SQUARED MIKURON;;;;
+3349;SQUARE MIRI;So;0;L;<square> 30DF 30EA;;;;N;SQUARED MIRI;;;;
+334A;SQUARE MIRIBAARU;So;0;L;<square> 30DF 30EA 30D0 30FC 30EB;;;;N;SQUARED MIRIBAARU;;;;
+334B;SQUARE MEGA;So;0;L;<square> 30E1 30AC;;;;N;SQUARED MEGA;;;;
+334C;SQUARE MEGATON;So;0;L;<square> 30E1 30AC 30C8 30F3;;;;N;SQUARED MEGATON;;;;
+334D;SQUARE MEETORU;So;0;L;<square> 30E1 30FC 30C8 30EB;;;;N;SQUARED MEETORU;;;;
+334E;SQUARE YAADO;So;0;L;<square> 30E4 30FC 30C9;;;;N;SQUARED YAADO;;;;
+334F;SQUARE YAARU;So;0;L;<square> 30E4 30FC 30EB;;;;N;SQUARED YAARU;;;;
+3350;SQUARE YUAN;So;0;L;<square> 30E6 30A2 30F3;;;;N;SQUARED YUAN;;;;
+3351;SQUARE RITTORU;So;0;L;<square> 30EA 30C3 30C8 30EB;;;;N;SQUARED RITTORU;;;;
+3352;SQUARE RIRA;So;0;L;<square> 30EA 30E9;;;;N;SQUARED RIRA;;;;
+3353;SQUARE RUPII;So;0;L;<square> 30EB 30D4 30FC;;;;N;SQUARED RUPII;;;;
+3354;SQUARE RUUBURU;So;0;L;<square> 30EB 30FC 30D6 30EB;;;;N;SQUARED RUUBURU;;;;
+3355;SQUARE REMU;So;0;L;<square> 30EC 30E0;;;;N;SQUARED REMU;;;;
+3356;SQUARE RENTOGEN;So;0;L;<square> 30EC 30F3 30C8 30B2 30F3;;;;N;SQUARED RENTOGEN;;;;
+3357;SQUARE WATTO;So;0;L;<square> 30EF 30C3 30C8;;;;N;SQUARED WATTO;;;;
+3358;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO;So;0;L;<compat> 0030 70B9;;;;N;;;;;
+3359;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE;So;0;L;<compat> 0031 70B9;;;;N;;;;;
+335A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO;So;0;L;<compat> 0032 70B9;;;;N;;;;;
+335B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE;So;0;L;<compat> 0033 70B9;;;;N;;;;;
+335C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR;So;0;L;<compat> 0034 70B9;;;;N;;;;;
+335D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE;So;0;L;<compat> 0035 70B9;;;;N;;;;;
+335E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX;So;0;L;<compat> 0036 70B9;;;;N;;;;;
+335F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN;So;0;L;<compat> 0037 70B9;;;;N;;;;;
+3360;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT;So;0;L;<compat> 0038 70B9;;;;N;;;;;
+3361;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE;So;0;L;<compat> 0039 70B9;;;;N;;;;;
+3362;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN;So;0;L;<compat> 0031 0030 70B9;;;;N;;;;;
+3363;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN;So;0;L;<compat> 0031 0031 70B9;;;;N;;;;;
+3364;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE;So;0;L;<compat> 0031 0032 70B9;;;;N;;;;;
+3365;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN;So;0;L;<compat> 0031 0033 70B9;;;;N;;;;;
+3366;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN;So;0;L;<compat> 0031 0034 70B9;;;;N;;;;;
+3367;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN;So;0;L;<compat> 0031 0035 70B9;;;;N;;;;;
+3368;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN;So;0;L;<compat> 0031 0036 70B9;;;;N;;;;;
+3369;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN;So;0;L;<compat> 0031 0037 70B9;;;;N;;;;;
+336A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN;So;0;L;<compat> 0031 0038 70B9;;;;N;;;;;
+336B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN;So;0;L;<compat> 0031 0039 70B9;;;;N;;;;;
+336C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY;So;0;L;<compat> 0032 0030 70B9;;;;N;;;;;
+336D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE;So;0;L;<compat> 0032 0031 70B9;;;;N;;;;;
+336E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO;So;0;L;<compat> 0032 0032 70B9;;;;N;;;;;
+336F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE;So;0;L;<compat> 0032 0033 70B9;;;;N;;;;;
+3370;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR;So;0;L;<compat> 0032 0034 70B9;;;;N;;;;;
+3371;SQUARE HPA;So;0;L;<square> 0068 0050 0061;;;;N;;;;;
+3372;SQUARE DA;So;0;L;<square> 0064 0061;;;;N;;;;;
+3373;SQUARE AU;So;0;L;<square> 0041 0055;;;;N;;;;;
+3374;SQUARE BAR;So;0;L;<square> 0062 0061 0072;;;;N;;;;;
+3375;SQUARE OV;So;0;L;<square> 006F 0056;;;;N;;;;;
+3376;SQUARE PC;So;0;L;<square> 0070 0063;;;;N;;;;;
+3377;SQUARE DM;So;0;ON;<square> 0064 006D;;;;N;;;;;
+3378;SQUARE DM SQUARED;So;0;ON;<square> 0064 006D 00B2;;;;N;;;;;
+3379;SQUARE DM CUBED;So;0;ON;<square> 0064 006D 00B3;;;;N;;;;;
+337A;SQUARE IU;So;0;ON;<square> 0049 0055;;;;N;;;;;
+337B;SQUARE ERA NAME HEISEI;So;0;L;<square> 5E73 6210;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME HEISEI;;;;
+337C;SQUARE ERA NAME SYOUWA;So;0;L;<square> 662D 548C;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA;;;;
+337D;SQUARE ERA NAME TAISYOU;So;0;L;<square> 5927 6B63;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU;;;;
+337E;SQUARE ERA NAME MEIZI;So;0;L;<square> 660E 6CBB;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME MEIZI;;;;
+337F;SQUARE CORPORATION;So;0;L;<square> 682A 5F0F 4F1A 793E;;;;N;SQUARED FOUR IDEOGRAPHS CORPORATION;;;;
+3380;SQUARE PA AMPS;So;0;L;<square> 0070 0041;;;;N;SQUARED PA AMPS;;;;
+3381;SQUARE NA;So;0;L;<square> 006E 0041;;;;N;SQUARED NA;;;;
+3382;SQUARE MU A;So;0;L;<square> 03BC 0041;;;;N;SQUARED MU A;;;;
+3383;SQUARE MA;So;0;L;<square> 006D 0041;;;;N;SQUARED MA;;;;
+3384;SQUARE KA;So;0;L;<square> 006B 0041;;;;N;SQUARED KA;;;;
+3385;SQUARE KB;So;0;L;<square> 004B 0042;;;;N;SQUARED KB;;;;
+3386;SQUARE MB;So;0;L;<square> 004D 0042;;;;N;SQUARED MB;;;;
+3387;SQUARE GB;So;0;L;<square> 0047 0042;;;;N;SQUARED GB;;;;
+3388;SQUARE CAL;So;0;L;<square> 0063 0061 006C;;;;N;SQUARED CAL;;;;
+3389;SQUARE KCAL;So;0;L;<square> 006B 0063 0061 006C;;;;N;SQUARED KCAL;;;;
+338A;SQUARE PF;So;0;L;<square> 0070 0046;;;;N;SQUARED PF;;;;
+338B;SQUARE NF;So;0;L;<square> 006E 0046;;;;N;SQUARED NF;;;;
+338C;SQUARE MU F;So;0;L;<square> 03BC 0046;;;;N;SQUARED MU F;;;;
+338D;SQUARE MU G;So;0;L;<square> 03BC 0067;;;;N;SQUARED MU G;;;;
+338E;SQUARE MG;So;0;L;<square> 006D 0067;;;;N;SQUARED MG;;;;
+338F;SQUARE KG;So;0;L;<square> 006B 0067;;;;N;SQUARED KG;;;;
+3390;SQUARE HZ;So;0;L;<square> 0048 007A;;;;N;SQUARED HZ;;;;
+3391;SQUARE KHZ;So;0;L;<square> 006B 0048 007A;;;;N;SQUARED KHZ;;;;
+3392;SQUARE MHZ;So;0;L;<square> 004D 0048 007A;;;;N;SQUARED MHZ;;;;
+3393;SQUARE GHZ;So;0;L;<square> 0047 0048 007A;;;;N;SQUARED GHZ;;;;
+3394;SQUARE THZ;So;0;L;<square> 0054 0048 007A;;;;N;SQUARED THZ;;;;
+3395;SQUARE MU L;So;0;L;<square> 03BC 2113;;;;N;SQUARED MU L;;;;
+3396;SQUARE ML;So;0;L;<square> 006D 2113;;;;N;SQUARED ML;;;;
+3397;SQUARE DL;So;0;L;<square> 0064 2113;;;;N;SQUARED DL;;;;
+3398;SQUARE KL;So;0;L;<square> 006B 2113;;;;N;SQUARED KL;;;;
+3399;SQUARE FM;So;0;L;<square> 0066 006D;;;;N;SQUARED FM;;;;
+339A;SQUARE NM;So;0;L;<square> 006E 006D;;;;N;SQUARED NM;;;;
+339B;SQUARE MU M;So;0;L;<square> 03BC 006D;;;;N;SQUARED MU M;;;;
+339C;SQUARE MM;So;0;L;<square> 006D 006D;;;;N;SQUARED MM;;;;
+339D;SQUARE CM;So;0;L;<square> 0063 006D;;;;N;SQUARED CM;;;;
+339E;SQUARE KM;So;0;L;<square> 006B 006D;;;;N;SQUARED KM;;;;
+339F;SQUARE MM SQUARED;So;0;L;<square> 006D 006D 00B2;;;;N;SQUARED MM SQUARED;;;;
+33A0;SQUARE CM SQUARED;So;0;L;<square> 0063 006D 00B2;;;;N;SQUARED CM SQUARED;;;;
+33A1;SQUARE M SQUARED;So;0;L;<square> 006D 00B2;;;;N;SQUARED M SQUARED;;;;
+33A2;SQUARE KM SQUARED;So;0;L;<square> 006B 006D 00B2;;;;N;SQUARED KM SQUARED;;;;
+33A3;SQUARE MM CUBED;So;0;L;<square> 006D 006D 00B3;;;;N;SQUARED MM CUBED;;;;
+33A4;SQUARE CM CUBED;So;0;L;<square> 0063 006D 00B3;;;;N;SQUARED CM CUBED;;;;
+33A5;SQUARE M CUBED;So;0;L;<square> 006D 00B3;;;;N;SQUARED M CUBED;;;;
+33A6;SQUARE KM CUBED;So;0;L;<square> 006B 006D 00B3;;;;N;SQUARED KM CUBED;;;;
+33A7;SQUARE M OVER S;So;0;L;<square> 006D 2215 0073;;;;N;SQUARED M OVER S;;;;
+33A8;SQUARE M OVER S SQUARED;So;0;L;<square> 006D 2215 0073 00B2;;;;N;SQUARED M OVER S SQUARED;;;;
+33A9;SQUARE PA;So;0;L;<square> 0050 0061;;;;N;SQUARED PA;;;;
+33AA;SQUARE KPA;So;0;L;<square> 006B 0050 0061;;;;N;SQUARED KPA;;;;
+33AB;SQUARE MPA;So;0;L;<square> 004D 0050 0061;;;;N;SQUARED MPA;;;;
+33AC;SQUARE GPA;So;0;L;<square> 0047 0050 0061;;;;N;SQUARED GPA;;;;
+33AD;SQUARE RAD;So;0;L;<square> 0072 0061 0064;;;;N;SQUARED RAD;;;;
+33AE;SQUARE RAD OVER S;So;0;L;<square> 0072 0061 0064 2215 0073;;;;N;SQUARED RAD OVER S;;;;
+33AF;SQUARE RAD OVER S SQUARED;So;0;L;<square> 0072 0061 0064 2215 0073 00B2;;;;N;SQUARED RAD OVER S SQUARED;;;;
+33B0;SQUARE PS;So;0;L;<square> 0070 0073;;;;N;SQUARED PS;;;;
+33B1;SQUARE NS;So;0;L;<square> 006E 0073;;;;N;SQUARED NS;;;;
+33B2;SQUARE MU S;So;0;L;<square> 03BC 0073;;;;N;SQUARED MU S;;;;
+33B3;SQUARE MS;So;0;L;<square> 006D 0073;;;;N;SQUARED MS;;;;
+33B4;SQUARE PV;So;0;L;<square> 0070 0056;;;;N;SQUARED PV;;;;
+33B5;SQUARE NV;So;0;L;<square> 006E 0056;;;;N;SQUARED NV;;;;
+33B6;SQUARE MU V;So;0;L;<square> 03BC 0056;;;;N;SQUARED MU V;;;;
+33B7;SQUARE MV;So;0;L;<square> 006D 0056;;;;N;SQUARED MV;;;;
+33B8;SQUARE KV;So;0;L;<square> 006B 0056;;;;N;SQUARED KV;;;;
+33B9;SQUARE MV MEGA;So;0;L;<square> 004D 0056;;;;N;SQUARED MV MEGA;;;;
+33BA;SQUARE PW;So;0;L;<square> 0070 0057;;;;N;SQUARED PW;;;;
+33BB;SQUARE NW;So;0;L;<square> 006E 0057;;;;N;SQUARED NW;;;;
+33BC;SQUARE MU W;So;0;L;<square> 03BC 0057;;;;N;SQUARED MU W;;;;
+33BD;SQUARE MW;So;0;L;<square> 006D 0057;;;;N;SQUARED MW;;;;
+33BE;SQUARE KW;So;0;L;<square> 006B 0057;;;;N;SQUARED KW;;;;
+33BF;SQUARE MW MEGA;So;0;L;<square> 004D 0057;;;;N;SQUARED MW MEGA;;;;
+33C0;SQUARE K OHM;So;0;L;<square> 006B 03A9;;;;N;SQUARED K OHM;;;;
+33C1;SQUARE M OHM;So;0;L;<square> 004D 03A9;;;;N;SQUARED M OHM;;;;
+33C2;SQUARE AM;So;0;L;<square> 0061 002E 006D 002E;;;;N;SQUARED AM;;;;
+33C3;SQUARE BQ;So;0;L;<square> 0042 0071;;;;N;SQUARED BQ;;;;
+33C4;SQUARE CC;So;0;L;<square> 0063 0063;;;;N;SQUARED CC;;;;
+33C5;SQUARE CD;So;0;L;<square> 0063 0064;;;;N;SQUARED CD;;;;
+33C6;SQUARE C OVER KG;So;0;L;<square> 0043 2215 006B 0067;;;;N;SQUARED C OVER KG;;;;
+33C7;SQUARE CO;So;0;L;<square> 0043 006F 002E;;;;N;SQUARED CO;;;;
+33C8;SQUARE DB;So;0;L;<square> 0064 0042;;;;N;SQUARED DB;;;;
+33C9;SQUARE GY;So;0;L;<square> 0047 0079;;;;N;SQUARED GY;;;;
+33CA;SQUARE HA;So;0;L;<square> 0068 0061;;;;N;SQUARED HA;;;;
+33CB;SQUARE HP;So;0;L;<square> 0048 0050;;;;N;SQUARED HP;;;;
+33CC;SQUARE IN;So;0;L;<square> 0069 006E;;;;N;SQUARED IN;;;;
+33CD;SQUARE KK;So;0;L;<square> 004B 004B;;;;N;SQUARED KK;;;;
+33CE;SQUARE KM CAPITAL;So;0;L;<square> 004B 004D;;;;N;SQUARED KM CAPITAL;;;;
+33CF;SQUARE KT;So;0;L;<square> 006B 0074;;;;N;SQUARED KT;;;;
+33D0;SQUARE LM;So;0;L;<square> 006C 006D;;;;N;SQUARED LM;;;;
+33D1;SQUARE LN;So;0;L;<square> 006C 006E;;;;N;SQUARED LN;;;;
+33D2;SQUARE LOG;So;0;L;<square> 006C 006F 0067;;;;N;SQUARED LOG;;;;
+33D3;SQUARE LX;So;0;L;<square> 006C 0078;;;;N;SQUARED LX;;;;
+33D4;SQUARE MB SMALL;So;0;L;<square> 006D 0062;;;;N;SQUARED MB SMALL;;;;
+33D5;SQUARE MIL;So;0;L;<square> 006D 0069 006C;;;;N;SQUARED MIL;;;;
+33D6;SQUARE MOL;So;0;L;<square> 006D 006F 006C;;;;N;SQUARED MOL;;;;
+33D7;SQUARE PH;So;0;L;<square> 0050 0048;;;;N;SQUARED PH;;;;
+33D8;SQUARE PM;So;0;L;<square> 0070 002E 006D 002E;;;;N;SQUARED PM;;;;
+33D9;SQUARE PPM;So;0;L;<square> 0050 0050 004D;;;;N;SQUARED PPM;;;;
+33DA;SQUARE PR;So;0;L;<square> 0050 0052;;;;N;SQUARED PR;;;;
+33DB;SQUARE SR;So;0;L;<square> 0073 0072;;;;N;SQUARED SR;;;;
+33DC;SQUARE SV;So;0;L;<square> 0053 0076;;;;N;SQUARED SV;;;;
+33DD;SQUARE WB;So;0;L;<square> 0057 0062;;;;N;SQUARED WB;;;;
+33DE;SQUARE V OVER M;So;0;ON;<square> 0056 2215 006D;;;;N;;;;;
+33DF;SQUARE A OVER M;So;0;ON;<square> 0041 2215 006D;;;;N;;;;;
+33E0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE;So;0;L;<compat> 0031 65E5;;;;N;;;;;
+33E1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO;So;0;L;<compat> 0032 65E5;;;;N;;;;;
+33E2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE;So;0;L;<compat> 0033 65E5;;;;N;;;;;
+33E3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR;So;0;L;<compat> 0034 65E5;;;;N;;;;;
+33E4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE;So;0;L;<compat> 0035 65E5;;;;N;;;;;
+33E5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX;So;0;L;<compat> 0036 65E5;;;;N;;;;;
+33E6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN;So;0;L;<compat> 0037 65E5;;;;N;;;;;
+33E7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT;So;0;L;<compat> 0038 65E5;;;;N;;;;;
+33E8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE;So;0;L;<compat> 0039 65E5;;;;N;;;;;
+33E9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN;So;0;L;<compat> 0031 0030 65E5;;;;N;;;;;
+33EA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN;So;0;L;<compat> 0031 0031 65E5;;;;N;;;;;
+33EB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE;So;0;L;<compat> 0031 0032 65E5;;;;N;;;;;
+33EC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN;So;0;L;<compat> 0031 0033 65E5;;;;N;;;;;
+33ED;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN;So;0;L;<compat> 0031 0034 65E5;;;;N;;;;;
+33EE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN;So;0;L;<compat> 0031 0035 65E5;;;;N;;;;;
+33EF;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN;So;0;L;<compat> 0031 0036 65E5;;;;N;;;;;
+33F0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN;So;0;L;<compat> 0031 0037 65E5;;;;N;;;;;
+33F1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN;So;0;L;<compat> 0031 0038 65E5;;;;N;;;;;
+33F2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN;So;0;L;<compat> 0031 0039 65E5;;;;N;;;;;
+33F3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY;So;0;L;<compat> 0032 0030 65E5;;;;N;;;;;
+33F4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE;So;0;L;<compat> 0032 0031 65E5;;;;N;;;;;
+33F5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO;So;0;L;<compat> 0032 0032 65E5;;;;N;;;;;
+33F6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE;So;0;L;<compat> 0032 0033 65E5;;;;N;;;;;
+33F7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR;So;0;L;<compat> 0032 0034 65E5;;;;N;;;;;
+33F8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE;So;0;L;<compat> 0032 0035 65E5;;;;N;;;;;
+33F9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX;So;0;L;<compat> 0032 0036 65E5;;;;N;;;;;
+33FA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN;So;0;L;<compat> 0032 0037 65E5;;;;N;;;;;
+33FB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT;So;0;L;<compat> 0032 0038 65E5;;;;N;;;;;
+33FC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE;So;0;L;<compat> 0032 0039 65E5;;;;N;;;;;
+33FD;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY;So;0;L;<compat> 0033 0030 65E5;;;;N;;;;;
+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;;;;;
+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;;;;;
+4DC3;HEXAGRAM FOR YOUTHFUL FOLLY;So;0;ON;;;;;N;;;;;
+4DC4;HEXAGRAM FOR WAITING;So;0;ON;;;;;N;;;;;
+4DC5;HEXAGRAM FOR CONFLICT;So;0;ON;;;;;N;;;;;
+4DC6;HEXAGRAM FOR THE ARMY;So;0;ON;;;;;N;;;;;
+4DC7;HEXAGRAM FOR HOLDING TOGETHER;So;0;ON;;;;;N;;;;;
+4DC8;HEXAGRAM FOR SMALL TAMING;So;0;ON;;;;;N;;;;;
+4DC9;HEXAGRAM FOR TREADING;So;0;ON;;;;;N;;;;;
+4DCA;HEXAGRAM FOR PEACE;So;0;ON;;;;;N;;;;;
+4DCB;HEXAGRAM FOR STANDSTILL;So;0;ON;;;;;N;;;;;
+4DCC;HEXAGRAM FOR FELLOWSHIP;So;0;ON;;;;;N;;;;;
+4DCD;HEXAGRAM FOR GREAT POSSESSION;So;0;ON;;;;;N;;;;;
+4DCE;HEXAGRAM FOR MODESTY;So;0;ON;;;;;N;;;;;
+4DCF;HEXAGRAM FOR ENTHUSIASM;So;0;ON;;;;;N;;;;;
+4DD0;HEXAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;;
+4DD1;HEXAGRAM FOR WORK ON THE DECAYED;So;0;ON;;;;;N;;;;;
+4DD2;HEXAGRAM FOR APPROACH;So;0;ON;;;;;N;;;;;
+4DD3;HEXAGRAM FOR CONTEMPLATION;So;0;ON;;;;;N;;;;;
+4DD4;HEXAGRAM FOR BITING THROUGH;So;0;ON;;;;;N;;;;;
+4DD5;HEXAGRAM FOR GRACE;So;0;ON;;;;;N;;;;;
+4DD6;HEXAGRAM FOR SPLITTING APART;So;0;ON;;;;;N;;;;;
+4DD7;HEXAGRAM FOR RETURN;So;0;ON;;;;;N;;;;;
+4DD8;HEXAGRAM FOR INNOCENCE;So;0;ON;;;;;N;;;;;
+4DD9;HEXAGRAM FOR GREAT TAMING;So;0;ON;;;;;N;;;;;
+4DDA;HEXAGRAM FOR MOUTH CORNERS;So;0;ON;;;;;N;;;;;
+4DDB;HEXAGRAM FOR GREAT PREPONDERANCE;So;0;ON;;;;;N;;;;;
+4DDC;HEXAGRAM FOR THE ABYSMAL WATER;So;0;ON;;;;;N;;;;;
+4DDD;HEXAGRAM FOR THE CLINGING FIRE;So;0;ON;;;;;N;;;;;
+4DDE;HEXAGRAM FOR INFLUENCE;So;0;ON;;;;;N;;;;;
+4DDF;HEXAGRAM FOR DURATION;So;0;ON;;;;;N;;;;;
+4DE0;HEXAGRAM FOR RETREAT;So;0;ON;;;;;N;;;;;
+4DE1;HEXAGRAM FOR GREAT POWER;So;0;ON;;;;;N;;;;;
+4DE2;HEXAGRAM FOR PROGRESS;So;0;ON;;;;;N;;;;;
+4DE3;HEXAGRAM FOR DARKENING OF THE LIGHT;So;0;ON;;;;;N;;;;;
+4DE4;HEXAGRAM FOR THE FAMILY;So;0;ON;;;;;N;;;;;
+4DE5;HEXAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;;
+4DE6;HEXAGRAM FOR OBSTRUCTION;So;0;ON;;;;;N;;;;;
+4DE7;HEXAGRAM FOR DELIVERANCE;So;0;ON;;;;;N;;;;;
+4DE8;HEXAGRAM FOR DECREASE;So;0;ON;;;;;N;;;;;
+4DE9;HEXAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;;
+4DEA;HEXAGRAM FOR BREAKTHROUGH;So;0;ON;;;;;N;;;;;
+4DEB;HEXAGRAM FOR COMING TO MEET;So;0;ON;;;;;N;;;;;
+4DEC;HEXAGRAM FOR GATHERING TOGETHER;So;0;ON;;;;;N;;;;;
+4DED;HEXAGRAM FOR PUSHING UPWARD;So;0;ON;;;;;N;;;;;
+4DEE;HEXAGRAM FOR OPPRESSION;So;0;ON;;;;;N;;;;;
+4DEF;HEXAGRAM FOR THE WELL;So;0;ON;;;;;N;;;;;
+4DF0;HEXAGRAM FOR REVOLUTION;So;0;ON;;;;;N;;;;;
+4DF1;HEXAGRAM FOR THE CAULDRON;So;0;ON;;;;;N;;;;;
+4DF2;HEXAGRAM FOR THE AROUSING THUNDER;So;0;ON;;;;;N;;;;;
+4DF3;HEXAGRAM FOR THE KEEPING STILL MOUNTAIN;So;0;ON;;;;;N;;;;;
+4DF4;HEXAGRAM FOR DEVELOPMENT;So;0;ON;;;;;N;;;;;
+4DF5;HEXAGRAM FOR THE MARRYING MAIDEN;So;0;ON;;;;;N;;;;;
+4DF6;HEXAGRAM FOR ABUNDANCE;So;0;ON;;;;;N;;;;;
+4DF7;HEXAGRAM FOR THE WANDERER;So;0;ON;;;;;N;;;;;
+4DF8;HEXAGRAM FOR THE GENTLE WIND;So;0;ON;;;;;N;;;;;
+4DF9;HEXAGRAM FOR THE JOYOUS LAKE;So;0;ON;;;;;N;;;;;
+4DFA;HEXAGRAM FOR DISPERSION;So;0;ON;;;;;N;;;;;
+4DFB;HEXAGRAM FOR LIMITATION;So;0;ON;;;;;N;;;;;
+4DFC;HEXAGRAM FOR INNER TRUTH;So;0;ON;;;;;N;;;;;
+4DFD;HEXAGRAM FOR SMALL PREPONDERANCE;So;0;ON;;;;;N;;;;;
+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;;;;;
+9FD5;<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;;;;;
+A003;YI SYLLABLE IP;Lo;0;L;;;;;N;;;;;
+A004;YI SYLLABLE IET;Lo;0;L;;;;;N;;;;;
+A005;YI SYLLABLE IEX;Lo;0;L;;;;;N;;;;;
+A006;YI SYLLABLE IE;Lo;0;L;;;;;N;;;;;
+A007;YI SYLLABLE IEP;Lo;0;L;;;;;N;;;;;
+A008;YI SYLLABLE AT;Lo;0;L;;;;;N;;;;;
+A009;YI SYLLABLE AX;Lo;0;L;;;;;N;;;;;
+A00A;YI SYLLABLE A;Lo;0;L;;;;;N;;;;;
+A00B;YI SYLLABLE AP;Lo;0;L;;;;;N;;;;;
+A00C;YI SYLLABLE UOX;Lo;0;L;;;;;N;;;;;
+A00D;YI SYLLABLE UO;Lo;0;L;;;;;N;;;;;
+A00E;YI SYLLABLE UOP;Lo;0;L;;;;;N;;;;;
+A00F;YI SYLLABLE OT;Lo;0;L;;;;;N;;;;;
+A010;YI SYLLABLE OX;Lo;0;L;;;;;N;;;;;
+A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;;
+A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;;
+A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;;
+A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;;
+A015;YI SYLLABLE WU;Lm;0;L;;;;;N;;;;;
+A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;;
+A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;;
+A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;;
+A019;YI SYLLABLE BIP;Lo;0;L;;;;;N;;;;;
+A01A;YI SYLLABLE BIET;Lo;0;L;;;;;N;;;;;
+A01B;YI SYLLABLE BIEX;Lo;0;L;;;;;N;;;;;
+A01C;YI SYLLABLE BIE;Lo;0;L;;;;;N;;;;;
+A01D;YI SYLLABLE BIEP;Lo;0;L;;;;;N;;;;;
+A01E;YI SYLLABLE BAT;Lo;0;L;;;;;N;;;;;
+A01F;YI SYLLABLE BAX;Lo;0;L;;;;;N;;;;;
+A020;YI SYLLABLE BA;Lo;0;L;;;;;N;;;;;
+A021;YI SYLLABLE BAP;Lo;0;L;;;;;N;;;;;
+A022;YI SYLLABLE BUOX;Lo;0;L;;;;;N;;;;;
+A023;YI SYLLABLE BUO;Lo;0;L;;;;;N;;;;;
+A024;YI SYLLABLE BUOP;Lo;0;L;;;;;N;;;;;
+A025;YI SYLLABLE BOT;Lo;0;L;;;;;N;;;;;
+A026;YI SYLLABLE BOX;Lo;0;L;;;;;N;;;;;
+A027;YI SYLLABLE BO;Lo;0;L;;;;;N;;;;;
+A028;YI SYLLABLE BOP;Lo;0;L;;;;;N;;;;;
+A029;YI SYLLABLE BEX;Lo;0;L;;;;;N;;;;;
+A02A;YI SYLLABLE BE;Lo;0;L;;;;;N;;;;;
+A02B;YI SYLLABLE BEP;Lo;0;L;;;;;N;;;;;
+A02C;YI SYLLABLE BUT;Lo;0;L;;;;;N;;;;;
+A02D;YI SYLLABLE BUX;Lo;0;L;;;;;N;;;;;
+A02E;YI SYLLABLE BU;Lo;0;L;;;;;N;;;;;
+A02F;YI SYLLABLE BUP;Lo;0;L;;;;;N;;;;;
+A030;YI SYLLABLE BURX;Lo;0;L;;;;;N;;;;;
+A031;YI SYLLABLE BUR;Lo;0;L;;;;;N;;;;;
+A032;YI SYLLABLE BYT;Lo;0;L;;;;;N;;;;;
+A033;YI SYLLABLE BYX;Lo;0;L;;;;;N;;;;;
+A034;YI SYLLABLE BY;Lo;0;L;;;;;N;;;;;
+A035;YI SYLLABLE BYP;Lo;0;L;;;;;N;;;;;
+A036;YI SYLLABLE BYRX;Lo;0;L;;;;;N;;;;;
+A037;YI SYLLABLE BYR;Lo;0;L;;;;;N;;;;;
+A038;YI SYLLABLE PIT;Lo;0;L;;;;;N;;;;;
+A039;YI SYLLABLE PIX;Lo;0;L;;;;;N;;;;;
+A03A;YI SYLLABLE PI;Lo;0;L;;;;;N;;;;;
+A03B;YI SYLLABLE PIP;Lo;0;L;;;;;N;;;;;
+A03C;YI SYLLABLE PIEX;Lo;0;L;;;;;N;;;;;
+A03D;YI SYLLABLE PIE;Lo;0;L;;;;;N;;;;;
+A03E;YI SYLLABLE PIEP;Lo;0;L;;;;;N;;;;;
+A03F;YI SYLLABLE PAT;Lo;0;L;;;;;N;;;;;
+A040;YI SYLLABLE PAX;Lo;0;L;;;;;N;;;;;
+A041;YI SYLLABLE PA;Lo;0;L;;;;;N;;;;;
+A042;YI SYLLABLE PAP;Lo;0;L;;;;;N;;;;;
+A043;YI SYLLABLE PUOX;Lo;0;L;;;;;N;;;;;
+A044;YI SYLLABLE PUO;Lo;0;L;;;;;N;;;;;
+A045;YI SYLLABLE PUOP;Lo;0;L;;;;;N;;;;;
+A046;YI SYLLABLE POT;Lo;0;L;;;;;N;;;;;
+A047;YI SYLLABLE POX;Lo;0;L;;;;;N;;;;;
+A048;YI SYLLABLE PO;Lo;0;L;;;;;N;;;;;
+A049;YI SYLLABLE POP;Lo;0;L;;;;;N;;;;;
+A04A;YI SYLLABLE PUT;Lo;0;L;;;;;N;;;;;
+A04B;YI SYLLABLE PUX;Lo;0;L;;;;;N;;;;;
+A04C;YI SYLLABLE PU;Lo;0;L;;;;;N;;;;;
+A04D;YI SYLLABLE PUP;Lo;0;L;;;;;N;;;;;
+A04E;YI SYLLABLE PURX;Lo;0;L;;;;;N;;;;;
+A04F;YI SYLLABLE PUR;Lo;0;L;;;;;N;;;;;
+A050;YI SYLLABLE PYT;Lo;0;L;;;;;N;;;;;
+A051;YI SYLLABLE PYX;Lo;0;L;;;;;N;;;;;
+A052;YI SYLLABLE PY;Lo;0;L;;;;;N;;;;;
+A053;YI SYLLABLE PYP;Lo;0;L;;;;;N;;;;;
+A054;YI SYLLABLE PYRX;Lo;0;L;;;;;N;;;;;
+A055;YI SYLLABLE PYR;Lo;0;L;;;;;N;;;;;
+A056;YI SYLLABLE BBIT;Lo;0;L;;;;;N;;;;;
+A057;YI SYLLABLE BBIX;Lo;0;L;;;;;N;;;;;
+A058;YI SYLLABLE BBI;Lo;0;L;;;;;N;;;;;
+A059;YI SYLLABLE BBIP;Lo;0;L;;;;;N;;;;;
+A05A;YI SYLLABLE BBIET;Lo;0;L;;;;;N;;;;;
+A05B;YI SYLLABLE BBIEX;Lo;0;L;;;;;N;;;;;
+A05C;YI SYLLABLE BBIE;Lo;0;L;;;;;N;;;;;
+A05D;YI SYLLABLE BBIEP;Lo;0;L;;;;;N;;;;;
+A05E;YI SYLLABLE BBAT;Lo;0;L;;;;;N;;;;;
+A05F;YI SYLLABLE BBAX;Lo;0;L;;;;;N;;;;;
+A060;YI SYLLABLE BBA;Lo;0;L;;;;;N;;;;;
+A061;YI SYLLABLE BBAP;Lo;0;L;;;;;N;;;;;
+A062;YI SYLLABLE BBUOX;Lo;0;L;;;;;N;;;;;
+A063;YI SYLLABLE BBUO;Lo;0;L;;;;;N;;;;;
+A064;YI SYLLABLE BBUOP;Lo;0;L;;;;;N;;;;;
+A065;YI SYLLABLE BBOT;Lo;0;L;;;;;N;;;;;
+A066;YI SYLLABLE BBOX;Lo;0;L;;;;;N;;;;;
+A067;YI SYLLABLE BBO;Lo;0;L;;;;;N;;;;;
+A068;YI SYLLABLE BBOP;Lo;0;L;;;;;N;;;;;
+A069;YI SYLLABLE BBEX;Lo;0;L;;;;;N;;;;;
+A06A;YI SYLLABLE BBE;Lo;0;L;;;;;N;;;;;
+A06B;YI SYLLABLE BBEP;Lo;0;L;;;;;N;;;;;
+A06C;YI SYLLABLE BBUT;Lo;0;L;;;;;N;;;;;
+A06D;YI SYLLABLE BBUX;Lo;0;L;;;;;N;;;;;
+A06E;YI SYLLABLE BBU;Lo;0;L;;;;;N;;;;;
+A06F;YI SYLLABLE BBUP;Lo;0;L;;;;;N;;;;;
+A070;YI SYLLABLE BBURX;Lo;0;L;;;;;N;;;;;
+A071;YI SYLLABLE BBUR;Lo;0;L;;;;;N;;;;;
+A072;YI SYLLABLE BBYT;Lo;0;L;;;;;N;;;;;
+A073;YI SYLLABLE BBYX;Lo;0;L;;;;;N;;;;;
+A074;YI SYLLABLE BBY;Lo;0;L;;;;;N;;;;;
+A075;YI SYLLABLE BBYP;Lo;0;L;;;;;N;;;;;
+A076;YI SYLLABLE NBIT;Lo;0;L;;;;;N;;;;;
+A077;YI SYLLABLE NBIX;Lo;0;L;;;;;N;;;;;
+A078;YI SYLLABLE NBI;Lo;0;L;;;;;N;;;;;
+A079;YI SYLLABLE NBIP;Lo;0;L;;;;;N;;;;;
+A07A;YI SYLLABLE NBIEX;Lo;0;L;;;;;N;;;;;
+A07B;YI SYLLABLE NBIE;Lo;0;L;;;;;N;;;;;
+A07C;YI SYLLABLE NBIEP;Lo;0;L;;;;;N;;;;;
+A07D;YI SYLLABLE NBAT;Lo;0;L;;;;;N;;;;;
+A07E;YI SYLLABLE NBAX;Lo;0;L;;;;;N;;;;;
+A07F;YI SYLLABLE NBA;Lo;0;L;;;;;N;;;;;
+A080;YI SYLLABLE NBAP;Lo;0;L;;;;;N;;;;;
+A081;YI SYLLABLE NBOT;Lo;0;L;;;;;N;;;;;
+A082;YI SYLLABLE NBOX;Lo;0;L;;;;;N;;;;;
+A083;YI SYLLABLE NBO;Lo;0;L;;;;;N;;;;;
+A084;YI SYLLABLE NBOP;Lo;0;L;;;;;N;;;;;
+A085;YI SYLLABLE NBUT;Lo;0;L;;;;;N;;;;;
+A086;YI SYLLABLE NBUX;Lo;0;L;;;;;N;;;;;
+A087;YI SYLLABLE NBU;Lo;0;L;;;;;N;;;;;
+A088;YI SYLLABLE NBUP;Lo;0;L;;;;;N;;;;;
+A089;YI SYLLABLE NBURX;Lo;0;L;;;;;N;;;;;
+A08A;YI SYLLABLE NBUR;Lo;0;L;;;;;N;;;;;
+A08B;YI SYLLABLE NBYT;Lo;0;L;;;;;N;;;;;
+A08C;YI SYLLABLE NBYX;Lo;0;L;;;;;N;;;;;
+A08D;YI SYLLABLE NBY;Lo;0;L;;;;;N;;;;;
+A08E;YI SYLLABLE NBYP;Lo;0;L;;;;;N;;;;;
+A08F;YI SYLLABLE NBYRX;Lo;0;L;;;;;N;;;;;
+A090;YI SYLLABLE NBYR;Lo;0;L;;;;;N;;;;;
+A091;YI SYLLABLE HMIT;Lo;0;L;;;;;N;;;;;
+A092;YI SYLLABLE HMIX;Lo;0;L;;;;;N;;;;;
+A093;YI SYLLABLE HMI;Lo;0;L;;;;;N;;;;;
+A094;YI SYLLABLE HMIP;Lo;0;L;;;;;N;;;;;
+A095;YI SYLLABLE HMIEX;Lo;0;L;;;;;N;;;;;
+A096;YI SYLLABLE HMIE;Lo;0;L;;;;;N;;;;;
+A097;YI SYLLABLE HMIEP;Lo;0;L;;;;;N;;;;;
+A098;YI SYLLABLE HMAT;Lo;0;L;;;;;N;;;;;
+A099;YI SYLLABLE HMAX;Lo;0;L;;;;;N;;;;;
+A09A;YI SYLLABLE HMA;Lo;0;L;;;;;N;;;;;
+A09B;YI SYLLABLE HMAP;Lo;0;L;;;;;N;;;;;
+A09C;YI SYLLABLE HMUOX;Lo;0;L;;;;;N;;;;;
+A09D;YI SYLLABLE HMUO;Lo;0;L;;;;;N;;;;;
+A09E;YI SYLLABLE HMUOP;Lo;0;L;;;;;N;;;;;
+A09F;YI SYLLABLE HMOT;Lo;0;L;;;;;N;;;;;
+A0A0;YI SYLLABLE HMOX;Lo;0;L;;;;;N;;;;;
+A0A1;YI SYLLABLE HMO;Lo;0;L;;;;;N;;;;;
+A0A2;YI SYLLABLE HMOP;Lo;0;L;;;;;N;;;;;
+A0A3;YI SYLLABLE HMUT;Lo;0;L;;;;;N;;;;;
+A0A4;YI SYLLABLE HMUX;Lo;0;L;;;;;N;;;;;
+A0A5;YI SYLLABLE HMU;Lo;0;L;;;;;N;;;;;
+A0A6;YI SYLLABLE HMUP;Lo;0;L;;;;;N;;;;;
+A0A7;YI SYLLABLE HMURX;Lo;0;L;;;;;N;;;;;
+A0A8;YI SYLLABLE HMUR;Lo;0;L;;;;;N;;;;;
+A0A9;YI SYLLABLE HMYX;Lo;0;L;;;;;N;;;;;
+A0AA;YI SYLLABLE HMY;Lo;0;L;;;;;N;;;;;
+A0AB;YI SYLLABLE HMYP;Lo;0;L;;;;;N;;;;;
+A0AC;YI SYLLABLE HMYRX;Lo;0;L;;;;;N;;;;;
+A0AD;YI SYLLABLE HMYR;Lo;0;L;;;;;N;;;;;
+A0AE;YI SYLLABLE MIT;Lo;0;L;;;;;N;;;;;
+A0AF;YI SYLLABLE MIX;Lo;0;L;;;;;N;;;;;
+A0B0;YI SYLLABLE MI;Lo;0;L;;;;;N;;;;;
+A0B1;YI SYLLABLE MIP;Lo;0;L;;;;;N;;;;;
+A0B2;YI SYLLABLE MIEX;Lo;0;L;;;;;N;;;;;
+A0B3;YI SYLLABLE MIE;Lo;0;L;;;;;N;;;;;
+A0B4;YI SYLLABLE MIEP;Lo;0;L;;;;;N;;;;;
+A0B5;YI SYLLABLE MAT;Lo;0;L;;;;;N;;;;;
+A0B6;YI SYLLABLE MAX;Lo;0;L;;;;;N;;;;;
+A0B7;YI SYLLABLE MA;Lo;0;L;;;;;N;;;;;
+A0B8;YI SYLLABLE MAP;Lo;0;L;;;;;N;;;;;
+A0B9;YI SYLLABLE MUOT;Lo;0;L;;;;;N;;;;;
+A0BA;YI SYLLABLE MUOX;Lo;0;L;;;;;N;;;;;
+A0BB;YI SYLLABLE MUO;Lo;0;L;;;;;N;;;;;
+A0BC;YI SYLLABLE MUOP;Lo;0;L;;;;;N;;;;;
+A0BD;YI SYLLABLE MOT;Lo;0;L;;;;;N;;;;;
+A0BE;YI SYLLABLE MOX;Lo;0;L;;;;;N;;;;;
+A0BF;YI SYLLABLE MO;Lo;0;L;;;;;N;;;;;
+A0C0;YI SYLLABLE MOP;Lo;0;L;;;;;N;;;;;
+A0C1;YI SYLLABLE MEX;Lo;0;L;;;;;N;;;;;
+A0C2;YI SYLLABLE ME;Lo;0;L;;;;;N;;;;;
+A0C3;YI SYLLABLE MUT;Lo;0;L;;;;;N;;;;;
+A0C4;YI SYLLABLE MUX;Lo;0;L;;;;;N;;;;;
+A0C5;YI SYLLABLE MU;Lo;0;L;;;;;N;;;;;
+A0C6;YI SYLLABLE MUP;Lo;0;L;;;;;N;;;;;
+A0C7;YI SYLLABLE MURX;Lo;0;L;;;;;N;;;;;
+A0C8;YI SYLLABLE MUR;Lo;0;L;;;;;N;;;;;
+A0C9;YI SYLLABLE MYT;Lo;0;L;;;;;N;;;;;
+A0CA;YI SYLLABLE MYX;Lo;0;L;;;;;N;;;;;
+A0CB;YI SYLLABLE MY;Lo;0;L;;;;;N;;;;;
+A0CC;YI SYLLABLE MYP;Lo;0;L;;;;;N;;;;;
+A0CD;YI SYLLABLE FIT;Lo;0;L;;;;;N;;;;;
+A0CE;YI SYLLABLE FIX;Lo;0;L;;;;;N;;;;;
+A0CF;YI SYLLABLE FI;Lo;0;L;;;;;N;;;;;
+A0D0;YI SYLLABLE FIP;Lo;0;L;;;;;N;;;;;
+A0D1;YI SYLLABLE FAT;Lo;0;L;;;;;N;;;;;
+A0D2;YI SYLLABLE FAX;Lo;0;L;;;;;N;;;;;
+A0D3;YI SYLLABLE FA;Lo;0;L;;;;;N;;;;;
+A0D4;YI SYLLABLE FAP;Lo;0;L;;;;;N;;;;;
+A0D5;YI SYLLABLE FOX;Lo;0;L;;;;;N;;;;;
+A0D6;YI SYLLABLE FO;Lo;0;L;;;;;N;;;;;
+A0D7;YI SYLLABLE FOP;Lo;0;L;;;;;N;;;;;
+A0D8;YI SYLLABLE FUT;Lo;0;L;;;;;N;;;;;
+A0D9;YI SYLLABLE FUX;Lo;0;L;;;;;N;;;;;
+A0DA;YI SYLLABLE FU;Lo;0;L;;;;;N;;;;;
+A0DB;YI SYLLABLE FUP;Lo;0;L;;;;;N;;;;;
+A0DC;YI SYLLABLE FURX;Lo;0;L;;;;;N;;;;;
+A0DD;YI SYLLABLE FUR;Lo;0;L;;;;;N;;;;;
+A0DE;YI SYLLABLE FYT;Lo;0;L;;;;;N;;;;;
+A0DF;YI SYLLABLE FYX;Lo;0;L;;;;;N;;;;;
+A0E0;YI SYLLABLE FY;Lo;0;L;;;;;N;;;;;
+A0E1;YI SYLLABLE FYP;Lo;0;L;;;;;N;;;;;
+A0E2;YI SYLLABLE VIT;Lo;0;L;;;;;N;;;;;
+A0E3;YI SYLLABLE VIX;Lo;0;L;;;;;N;;;;;
+A0E4;YI SYLLABLE VI;Lo;0;L;;;;;N;;;;;
+A0E5;YI SYLLABLE VIP;Lo;0;L;;;;;N;;;;;
+A0E6;YI SYLLABLE VIET;Lo;0;L;;;;;N;;;;;
+A0E7;YI SYLLABLE VIEX;Lo;0;L;;;;;N;;;;;
+A0E8;YI SYLLABLE VIE;Lo;0;L;;;;;N;;;;;
+A0E9;YI SYLLABLE VIEP;Lo;0;L;;;;;N;;;;;
+A0EA;YI SYLLABLE VAT;Lo;0;L;;;;;N;;;;;
+A0EB;YI SYLLABLE VAX;Lo;0;L;;;;;N;;;;;
+A0EC;YI SYLLABLE VA;Lo;0;L;;;;;N;;;;;
+A0ED;YI SYLLABLE VAP;Lo;0;L;;;;;N;;;;;
+A0EE;YI SYLLABLE VOT;Lo;0;L;;;;;N;;;;;
+A0EF;YI SYLLABLE VOX;Lo;0;L;;;;;N;;;;;
+A0F0;YI SYLLABLE VO;Lo;0;L;;;;;N;;;;;
+A0F1;YI SYLLABLE VOP;Lo;0;L;;;;;N;;;;;
+A0F2;YI SYLLABLE VEX;Lo;0;L;;;;;N;;;;;
+A0F3;YI SYLLABLE VEP;Lo;0;L;;;;;N;;;;;
+A0F4;YI SYLLABLE VUT;Lo;0;L;;;;;N;;;;;
+A0F5;YI SYLLABLE VUX;Lo;0;L;;;;;N;;;;;
+A0F6;YI SYLLABLE VU;Lo;0;L;;;;;N;;;;;
+A0F7;YI SYLLABLE VUP;Lo;0;L;;;;;N;;;;;
+A0F8;YI SYLLABLE VURX;Lo;0;L;;;;;N;;;;;
+A0F9;YI SYLLABLE VUR;Lo;0;L;;;;;N;;;;;
+A0FA;YI SYLLABLE VYT;Lo;0;L;;;;;N;;;;;
+A0FB;YI SYLLABLE VYX;Lo;0;L;;;;;N;;;;;
+A0FC;YI SYLLABLE VY;Lo;0;L;;;;;N;;;;;
+A0FD;YI SYLLABLE VYP;Lo;0;L;;;;;N;;;;;
+A0FE;YI SYLLABLE VYRX;Lo;0;L;;;;;N;;;;;
+A0FF;YI SYLLABLE VYR;Lo;0;L;;;;;N;;;;;
+A100;YI SYLLABLE DIT;Lo;0;L;;;;;N;;;;;
+A101;YI SYLLABLE DIX;Lo;0;L;;;;;N;;;;;
+A102;YI SYLLABLE DI;Lo;0;L;;;;;N;;;;;
+A103;YI SYLLABLE DIP;Lo;0;L;;;;;N;;;;;
+A104;YI SYLLABLE DIEX;Lo;0;L;;;;;N;;;;;
+A105;YI SYLLABLE DIE;Lo;0;L;;;;;N;;;;;
+A106;YI SYLLABLE DIEP;Lo;0;L;;;;;N;;;;;
+A107;YI SYLLABLE DAT;Lo;0;L;;;;;N;;;;;
+A108;YI SYLLABLE DAX;Lo;0;L;;;;;N;;;;;
+A109;YI SYLLABLE DA;Lo;0;L;;;;;N;;;;;
+A10A;YI SYLLABLE DAP;Lo;0;L;;;;;N;;;;;
+A10B;YI SYLLABLE DUOX;Lo;0;L;;;;;N;;;;;
+A10C;YI SYLLABLE DUO;Lo;0;L;;;;;N;;;;;
+A10D;YI SYLLABLE DOT;Lo;0;L;;;;;N;;;;;
+A10E;YI SYLLABLE DOX;Lo;0;L;;;;;N;;;;;
+A10F;YI SYLLABLE DO;Lo;0;L;;;;;N;;;;;
+A110;YI SYLLABLE DOP;Lo;0;L;;;;;N;;;;;
+A111;YI SYLLABLE DEX;Lo;0;L;;;;;N;;;;;
+A112;YI SYLLABLE DE;Lo;0;L;;;;;N;;;;;
+A113;YI SYLLABLE DEP;Lo;0;L;;;;;N;;;;;
+A114;YI SYLLABLE DUT;Lo;0;L;;;;;N;;;;;
+A115;YI SYLLABLE DUX;Lo;0;L;;;;;N;;;;;
+A116;YI SYLLABLE DU;Lo;0;L;;;;;N;;;;;
+A117;YI SYLLABLE DUP;Lo;0;L;;;;;N;;;;;
+A118;YI SYLLABLE DURX;Lo;0;L;;;;;N;;;;;
+A119;YI SYLLABLE DUR;Lo;0;L;;;;;N;;;;;
+A11A;YI SYLLABLE TIT;Lo;0;L;;;;;N;;;;;
+A11B;YI SYLLABLE TIX;Lo;0;L;;;;;N;;;;;
+A11C;YI SYLLABLE TI;Lo;0;L;;;;;N;;;;;
+A11D;YI SYLLABLE TIP;Lo;0;L;;;;;N;;;;;
+A11E;YI SYLLABLE TIEX;Lo;0;L;;;;;N;;;;;
+A11F;YI SYLLABLE TIE;Lo;0;L;;;;;N;;;;;
+A120;YI SYLLABLE TIEP;Lo;0;L;;;;;N;;;;;
+A121;YI SYLLABLE TAT;Lo;0;L;;;;;N;;;;;
+A122;YI SYLLABLE TAX;Lo;0;L;;;;;N;;;;;
+A123;YI SYLLABLE TA;Lo;0;L;;;;;N;;;;;
+A124;YI SYLLABLE TAP;Lo;0;L;;;;;N;;;;;
+A125;YI SYLLABLE TUOT;Lo;0;L;;;;;N;;;;;
+A126;YI SYLLABLE TUOX;Lo;0;L;;;;;N;;;;;
+A127;YI SYLLABLE TUO;Lo;0;L;;;;;N;;;;;
+A128;YI SYLLABLE TUOP;Lo;0;L;;;;;N;;;;;
+A129;YI SYLLABLE TOT;Lo;0;L;;;;;N;;;;;
+A12A;YI SYLLABLE TOX;Lo;0;L;;;;;N;;;;;
+A12B;YI SYLLABLE TO;Lo;0;L;;;;;N;;;;;
+A12C;YI SYLLABLE TOP;Lo;0;L;;;;;N;;;;;
+A12D;YI SYLLABLE TEX;Lo;0;L;;;;;N;;;;;
+A12E;YI SYLLABLE TE;Lo;0;L;;;;;N;;;;;
+A12F;YI SYLLABLE TEP;Lo;0;L;;;;;N;;;;;
+A130;YI SYLLABLE TUT;Lo;0;L;;;;;N;;;;;
+A131;YI SYLLABLE TUX;Lo;0;L;;;;;N;;;;;
+A132;YI SYLLABLE TU;Lo;0;L;;;;;N;;;;;
+A133;YI SYLLABLE TUP;Lo;0;L;;;;;N;;;;;
+A134;YI SYLLABLE TURX;Lo;0;L;;;;;N;;;;;
+A135;YI SYLLABLE TUR;Lo;0;L;;;;;N;;;;;
+A136;YI SYLLABLE DDIT;Lo;0;L;;;;;N;;;;;
+A137;YI SYLLABLE DDIX;Lo;0;L;;;;;N;;;;;
+A138;YI SYLLABLE DDI;Lo;0;L;;;;;N;;;;;
+A139;YI SYLLABLE DDIP;Lo;0;L;;;;;N;;;;;
+A13A;YI SYLLABLE DDIEX;Lo;0;L;;;;;N;;;;;
+A13B;YI SYLLABLE DDIE;Lo;0;L;;;;;N;;;;;
+A13C;YI SYLLABLE DDIEP;Lo;0;L;;;;;N;;;;;
+A13D;YI SYLLABLE DDAT;Lo;0;L;;;;;N;;;;;
+A13E;YI SYLLABLE DDAX;Lo;0;L;;;;;N;;;;;
+A13F;YI SYLLABLE DDA;Lo;0;L;;;;;N;;;;;
+A140;YI SYLLABLE DDAP;Lo;0;L;;;;;N;;;;;
+A141;YI SYLLABLE DDUOX;Lo;0;L;;;;;N;;;;;
+A142;YI SYLLABLE DDUO;Lo;0;L;;;;;N;;;;;
+A143;YI SYLLABLE DDUOP;Lo;0;L;;;;;N;;;;;
+A144;YI SYLLABLE DDOT;Lo;0;L;;;;;N;;;;;
+A145;YI SYLLABLE DDOX;Lo;0;L;;;;;N;;;;;
+A146;YI SYLLABLE DDO;Lo;0;L;;;;;N;;;;;
+A147;YI SYLLABLE DDOP;Lo;0;L;;;;;N;;;;;
+A148;YI SYLLABLE DDEX;Lo;0;L;;;;;N;;;;;
+A149;YI SYLLABLE DDE;Lo;0;L;;;;;N;;;;;
+A14A;YI SYLLABLE DDEP;Lo;0;L;;;;;N;;;;;
+A14B;YI SYLLABLE DDUT;Lo;0;L;;;;;N;;;;;
+A14C;YI SYLLABLE DDUX;Lo;0;L;;;;;N;;;;;
+A14D;YI SYLLABLE DDU;Lo;0;L;;;;;N;;;;;
+A14E;YI SYLLABLE DDUP;Lo;0;L;;;;;N;;;;;
+A14F;YI SYLLABLE DDURX;Lo;0;L;;;;;N;;;;;
+A150;YI SYLLABLE DDUR;Lo;0;L;;;;;N;;;;;
+A151;YI SYLLABLE NDIT;Lo;0;L;;;;;N;;;;;
+A152;YI SYLLABLE NDIX;Lo;0;L;;;;;N;;;;;
+A153;YI SYLLABLE NDI;Lo;0;L;;;;;N;;;;;
+A154;YI SYLLABLE NDIP;Lo;0;L;;;;;N;;;;;
+A155;YI SYLLABLE NDIEX;Lo;0;L;;;;;N;;;;;
+A156;YI SYLLABLE NDIE;Lo;0;L;;;;;N;;;;;
+A157;YI SYLLABLE NDAT;Lo;0;L;;;;;N;;;;;
+A158;YI SYLLABLE NDAX;Lo;0;L;;;;;N;;;;;
+A159;YI SYLLABLE NDA;Lo;0;L;;;;;N;;;;;
+A15A;YI SYLLABLE NDAP;Lo;0;L;;;;;N;;;;;
+A15B;YI SYLLABLE NDOT;Lo;0;L;;;;;N;;;;;
+A15C;YI SYLLABLE NDOX;Lo;0;L;;;;;N;;;;;
+A15D;YI SYLLABLE NDO;Lo;0;L;;;;;N;;;;;
+A15E;YI SYLLABLE NDOP;Lo;0;L;;;;;N;;;;;
+A15F;YI SYLLABLE NDEX;Lo;0;L;;;;;N;;;;;
+A160;YI SYLLABLE NDE;Lo;0;L;;;;;N;;;;;
+A161;YI SYLLABLE NDEP;Lo;0;L;;;;;N;;;;;
+A162;YI SYLLABLE NDUT;Lo;0;L;;;;;N;;;;;
+A163;YI SYLLABLE NDUX;Lo;0;L;;;;;N;;;;;
+A164;YI SYLLABLE NDU;Lo;0;L;;;;;N;;;;;
+A165;YI SYLLABLE NDUP;Lo;0;L;;;;;N;;;;;
+A166;YI SYLLABLE NDURX;Lo;0;L;;;;;N;;;;;
+A167;YI SYLLABLE NDUR;Lo;0;L;;;;;N;;;;;
+A168;YI SYLLABLE HNIT;Lo;0;L;;;;;N;;;;;
+A169;YI SYLLABLE HNIX;Lo;0;L;;;;;N;;;;;
+A16A;YI SYLLABLE HNI;Lo;0;L;;;;;N;;;;;
+A16B;YI SYLLABLE HNIP;Lo;0;L;;;;;N;;;;;
+A16C;YI SYLLABLE HNIET;Lo;0;L;;;;;N;;;;;
+A16D;YI SYLLABLE HNIEX;Lo;0;L;;;;;N;;;;;
+A16E;YI SYLLABLE HNIE;Lo;0;L;;;;;N;;;;;
+A16F;YI SYLLABLE HNIEP;Lo;0;L;;;;;N;;;;;
+A170;YI SYLLABLE HNAT;Lo;0;L;;;;;N;;;;;
+A171;YI SYLLABLE HNAX;Lo;0;L;;;;;N;;;;;
+A172;YI SYLLABLE HNA;Lo;0;L;;;;;N;;;;;
+A173;YI SYLLABLE HNAP;Lo;0;L;;;;;N;;;;;
+A174;YI SYLLABLE HNUOX;Lo;0;L;;;;;N;;;;;
+A175;YI SYLLABLE HNUO;Lo;0;L;;;;;N;;;;;
+A176;YI SYLLABLE HNOT;Lo;0;L;;;;;N;;;;;
+A177;YI SYLLABLE HNOX;Lo;0;L;;;;;N;;;;;
+A178;YI SYLLABLE HNOP;Lo;0;L;;;;;N;;;;;
+A179;YI SYLLABLE HNEX;Lo;0;L;;;;;N;;;;;
+A17A;YI SYLLABLE HNE;Lo;0;L;;;;;N;;;;;
+A17B;YI SYLLABLE HNEP;Lo;0;L;;;;;N;;;;;
+A17C;YI SYLLABLE HNUT;Lo;0;L;;;;;N;;;;;
+A17D;YI SYLLABLE NIT;Lo;0;L;;;;;N;;;;;
+A17E;YI SYLLABLE NIX;Lo;0;L;;;;;N;;;;;
+A17F;YI SYLLABLE NI;Lo;0;L;;;;;N;;;;;
+A180;YI SYLLABLE NIP;Lo;0;L;;;;;N;;;;;
+A181;YI SYLLABLE NIEX;Lo;0;L;;;;;N;;;;;
+A182;YI SYLLABLE NIE;Lo;0;L;;;;;N;;;;;
+A183;YI SYLLABLE NIEP;Lo;0;L;;;;;N;;;;;
+A184;YI SYLLABLE NAX;Lo;0;L;;;;;N;;;;;
+A185;YI SYLLABLE NA;Lo;0;L;;;;;N;;;;;
+A186;YI SYLLABLE NAP;Lo;0;L;;;;;N;;;;;
+A187;YI SYLLABLE NUOX;Lo;0;L;;;;;N;;;;;
+A188;YI SYLLABLE NUO;Lo;0;L;;;;;N;;;;;
+A189;YI SYLLABLE NUOP;Lo;0;L;;;;;N;;;;;
+A18A;YI SYLLABLE NOT;Lo;0;L;;;;;N;;;;;
+A18B;YI SYLLABLE NOX;Lo;0;L;;;;;N;;;;;
+A18C;YI SYLLABLE NO;Lo;0;L;;;;;N;;;;;
+A18D;YI SYLLABLE NOP;Lo;0;L;;;;;N;;;;;
+A18E;YI SYLLABLE NEX;Lo;0;L;;;;;N;;;;;
+A18F;YI SYLLABLE NE;Lo;0;L;;;;;N;;;;;
+A190;YI SYLLABLE NEP;Lo;0;L;;;;;N;;;;;
+A191;YI SYLLABLE NUT;Lo;0;L;;;;;N;;;;;
+A192;YI SYLLABLE NUX;Lo;0;L;;;;;N;;;;;
+A193;YI SYLLABLE NU;Lo;0;L;;;;;N;;;;;
+A194;YI SYLLABLE NUP;Lo;0;L;;;;;N;;;;;
+A195;YI SYLLABLE NURX;Lo;0;L;;;;;N;;;;;
+A196;YI SYLLABLE NUR;Lo;0;L;;;;;N;;;;;
+A197;YI SYLLABLE HLIT;Lo;0;L;;;;;N;;;;;
+A198;YI SYLLABLE HLIX;Lo;0;L;;;;;N;;;;;
+A199;YI SYLLABLE HLI;Lo;0;L;;;;;N;;;;;
+A19A;YI SYLLABLE HLIP;Lo;0;L;;;;;N;;;;;
+A19B;YI SYLLABLE HLIEX;Lo;0;L;;;;;N;;;;;
+A19C;YI SYLLABLE HLIE;Lo;0;L;;;;;N;;;;;
+A19D;YI SYLLABLE HLIEP;Lo;0;L;;;;;N;;;;;
+A19E;YI SYLLABLE HLAT;Lo;0;L;;;;;N;;;;;
+A19F;YI SYLLABLE HLAX;Lo;0;L;;;;;N;;;;;
+A1A0;YI SYLLABLE HLA;Lo;0;L;;;;;N;;;;;
+A1A1;YI SYLLABLE HLAP;Lo;0;L;;;;;N;;;;;
+A1A2;YI SYLLABLE HLUOX;Lo;0;L;;;;;N;;;;;
+A1A3;YI SYLLABLE HLUO;Lo;0;L;;;;;N;;;;;
+A1A4;YI SYLLABLE HLUOP;Lo;0;L;;;;;N;;;;;
+A1A5;YI SYLLABLE HLOX;Lo;0;L;;;;;N;;;;;
+A1A6;YI SYLLABLE HLO;Lo;0;L;;;;;N;;;;;
+A1A7;YI SYLLABLE HLOP;Lo;0;L;;;;;N;;;;;
+A1A8;YI SYLLABLE HLEX;Lo;0;L;;;;;N;;;;;
+A1A9;YI SYLLABLE HLE;Lo;0;L;;;;;N;;;;;
+A1AA;YI SYLLABLE HLEP;Lo;0;L;;;;;N;;;;;
+A1AB;YI SYLLABLE HLUT;Lo;0;L;;;;;N;;;;;
+A1AC;YI SYLLABLE HLUX;Lo;0;L;;;;;N;;;;;
+A1AD;YI SYLLABLE HLU;Lo;0;L;;;;;N;;;;;
+A1AE;YI SYLLABLE HLUP;Lo;0;L;;;;;N;;;;;
+A1AF;YI SYLLABLE HLURX;Lo;0;L;;;;;N;;;;;
+A1B0;YI SYLLABLE HLUR;Lo;0;L;;;;;N;;;;;
+A1B1;YI SYLLABLE HLYT;Lo;0;L;;;;;N;;;;;
+A1B2;YI SYLLABLE HLYX;Lo;0;L;;;;;N;;;;;
+A1B3;YI SYLLABLE HLY;Lo;0;L;;;;;N;;;;;
+A1B4;YI SYLLABLE HLYP;Lo;0;L;;;;;N;;;;;
+A1B5;YI SYLLABLE HLYRX;Lo;0;L;;;;;N;;;;;
+A1B6;YI SYLLABLE HLYR;Lo;0;L;;;;;N;;;;;
+A1B7;YI SYLLABLE LIT;Lo;0;L;;;;;N;;;;;
+A1B8;YI SYLLABLE LIX;Lo;0;L;;;;;N;;;;;
+A1B9;YI SYLLABLE LI;Lo;0;L;;;;;N;;;;;
+A1BA;YI SYLLABLE LIP;Lo;0;L;;;;;N;;;;;
+A1BB;YI SYLLABLE LIET;Lo;0;L;;;;;N;;;;;
+A1BC;YI SYLLABLE LIEX;Lo;0;L;;;;;N;;;;;
+A1BD;YI SYLLABLE LIE;Lo;0;L;;;;;N;;;;;
+A1BE;YI SYLLABLE LIEP;Lo;0;L;;;;;N;;;;;
+A1BF;YI SYLLABLE LAT;Lo;0;L;;;;;N;;;;;
+A1C0;YI SYLLABLE LAX;Lo;0;L;;;;;N;;;;;
+A1C1;YI SYLLABLE LA;Lo;0;L;;;;;N;;;;;
+A1C2;YI SYLLABLE LAP;Lo;0;L;;;;;N;;;;;
+A1C3;YI SYLLABLE LUOT;Lo;0;L;;;;;N;;;;;
+A1C4;YI SYLLABLE LUOX;Lo;0;L;;;;;N;;;;;
+A1C5;YI SYLLABLE LUO;Lo;0;L;;;;;N;;;;;
+A1C6;YI SYLLABLE LUOP;Lo;0;L;;;;;N;;;;;
+A1C7;YI SYLLABLE LOT;Lo;0;L;;;;;N;;;;;
+A1C8;YI SYLLABLE LOX;Lo;0;L;;;;;N;;;;;
+A1C9;YI SYLLABLE LO;Lo;0;L;;;;;N;;;;;
+A1CA;YI SYLLABLE LOP;Lo;0;L;;;;;N;;;;;
+A1CB;YI SYLLABLE LEX;Lo;0;L;;;;;N;;;;;
+A1CC;YI SYLLABLE LE;Lo;0;L;;;;;N;;;;;
+A1CD;YI SYLLABLE LEP;Lo;0;L;;;;;N;;;;;
+A1CE;YI SYLLABLE LUT;Lo;0;L;;;;;N;;;;;
+A1CF;YI SYLLABLE LUX;Lo;0;L;;;;;N;;;;;
+A1D0;YI SYLLABLE LU;Lo;0;L;;;;;N;;;;;
+A1D1;YI SYLLABLE LUP;Lo;0;L;;;;;N;;;;;
+A1D2;YI SYLLABLE LURX;Lo;0;L;;;;;N;;;;;
+A1D3;YI SYLLABLE LUR;Lo;0;L;;;;;N;;;;;
+A1D4;YI SYLLABLE LYT;Lo;0;L;;;;;N;;;;;
+A1D5;YI SYLLABLE LYX;Lo;0;L;;;;;N;;;;;
+A1D6;YI SYLLABLE LY;Lo;0;L;;;;;N;;;;;
+A1D7;YI SYLLABLE LYP;Lo;0;L;;;;;N;;;;;
+A1D8;YI SYLLABLE LYRX;Lo;0;L;;;;;N;;;;;
+A1D9;YI SYLLABLE LYR;Lo;0;L;;;;;N;;;;;
+A1DA;YI SYLLABLE GIT;Lo;0;L;;;;;N;;;;;
+A1DB;YI SYLLABLE GIX;Lo;0;L;;;;;N;;;;;
+A1DC;YI SYLLABLE GI;Lo;0;L;;;;;N;;;;;
+A1DD;YI SYLLABLE GIP;Lo;0;L;;;;;N;;;;;
+A1DE;YI SYLLABLE GIET;Lo;0;L;;;;;N;;;;;
+A1DF;YI SYLLABLE GIEX;Lo;0;L;;;;;N;;;;;
+A1E0;YI SYLLABLE GIE;Lo;0;L;;;;;N;;;;;
+A1E1;YI SYLLABLE GIEP;Lo;0;L;;;;;N;;;;;
+A1E2;YI SYLLABLE GAT;Lo;0;L;;;;;N;;;;;
+A1E3;YI SYLLABLE GAX;Lo;0;L;;;;;N;;;;;
+A1E4;YI SYLLABLE GA;Lo;0;L;;;;;N;;;;;
+A1E5;YI SYLLABLE GAP;Lo;0;L;;;;;N;;;;;
+A1E6;YI SYLLABLE GUOT;Lo;0;L;;;;;N;;;;;
+A1E7;YI SYLLABLE GUOX;Lo;0;L;;;;;N;;;;;
+A1E8;YI SYLLABLE GUO;Lo;0;L;;;;;N;;;;;
+A1E9;YI SYLLABLE GUOP;Lo;0;L;;;;;N;;;;;
+A1EA;YI SYLLABLE GOT;Lo;0;L;;;;;N;;;;;
+A1EB;YI SYLLABLE GOX;Lo;0;L;;;;;N;;;;;
+A1EC;YI SYLLABLE GO;Lo;0;L;;;;;N;;;;;
+A1ED;YI SYLLABLE GOP;Lo;0;L;;;;;N;;;;;
+A1EE;YI SYLLABLE GET;Lo;0;L;;;;;N;;;;;
+A1EF;YI SYLLABLE GEX;Lo;0;L;;;;;N;;;;;
+A1F0;YI SYLLABLE GE;Lo;0;L;;;;;N;;;;;
+A1F1;YI SYLLABLE GEP;Lo;0;L;;;;;N;;;;;
+A1F2;YI SYLLABLE GUT;Lo;0;L;;;;;N;;;;;
+A1F3;YI SYLLABLE GUX;Lo;0;L;;;;;N;;;;;
+A1F4;YI SYLLABLE GU;Lo;0;L;;;;;N;;;;;
+A1F5;YI SYLLABLE GUP;Lo;0;L;;;;;N;;;;;
+A1F6;YI SYLLABLE GURX;Lo;0;L;;;;;N;;;;;
+A1F7;YI SYLLABLE GUR;Lo;0;L;;;;;N;;;;;
+A1F8;YI SYLLABLE KIT;Lo;0;L;;;;;N;;;;;
+A1F9;YI SYLLABLE KIX;Lo;0;L;;;;;N;;;;;
+A1FA;YI SYLLABLE KI;Lo;0;L;;;;;N;;;;;
+A1FB;YI SYLLABLE KIP;Lo;0;L;;;;;N;;;;;
+A1FC;YI SYLLABLE KIEX;Lo;0;L;;;;;N;;;;;
+A1FD;YI SYLLABLE KIE;Lo;0;L;;;;;N;;;;;
+A1FE;YI SYLLABLE KIEP;Lo;0;L;;;;;N;;;;;
+A1FF;YI SYLLABLE KAT;Lo;0;L;;;;;N;;;;;
+A200;YI SYLLABLE KAX;Lo;0;L;;;;;N;;;;;
+A201;YI SYLLABLE KA;Lo;0;L;;;;;N;;;;;
+A202;YI SYLLABLE KAP;Lo;0;L;;;;;N;;;;;
+A203;YI SYLLABLE KUOX;Lo;0;L;;;;;N;;;;;
+A204;YI SYLLABLE KUO;Lo;0;L;;;;;N;;;;;
+A205;YI SYLLABLE KUOP;Lo;0;L;;;;;N;;;;;
+A206;YI SYLLABLE KOT;Lo;0;L;;;;;N;;;;;
+A207;YI SYLLABLE KOX;Lo;0;L;;;;;N;;;;;
+A208;YI SYLLABLE KO;Lo;0;L;;;;;N;;;;;
+A209;YI SYLLABLE KOP;Lo;0;L;;;;;N;;;;;
+A20A;YI SYLLABLE KET;Lo;0;L;;;;;N;;;;;
+A20B;YI SYLLABLE KEX;Lo;0;L;;;;;N;;;;;
+A20C;YI SYLLABLE KE;Lo;0;L;;;;;N;;;;;
+A20D;YI SYLLABLE KEP;Lo;0;L;;;;;N;;;;;
+A20E;YI SYLLABLE KUT;Lo;0;L;;;;;N;;;;;
+A20F;YI SYLLABLE KUX;Lo;0;L;;;;;N;;;;;
+A210;YI SYLLABLE KU;Lo;0;L;;;;;N;;;;;
+A211;YI SYLLABLE KUP;Lo;0;L;;;;;N;;;;;
+A212;YI SYLLABLE KURX;Lo;0;L;;;;;N;;;;;
+A213;YI SYLLABLE KUR;Lo;0;L;;;;;N;;;;;
+A214;YI SYLLABLE GGIT;Lo;0;L;;;;;N;;;;;
+A215;YI SYLLABLE GGIX;Lo;0;L;;;;;N;;;;;
+A216;YI SYLLABLE GGI;Lo;0;L;;;;;N;;;;;
+A217;YI SYLLABLE GGIEX;Lo;0;L;;;;;N;;;;;
+A218;YI SYLLABLE GGIE;Lo;0;L;;;;;N;;;;;
+A219;YI SYLLABLE GGIEP;Lo;0;L;;;;;N;;;;;
+A21A;YI SYLLABLE GGAT;Lo;0;L;;;;;N;;;;;
+A21B;YI SYLLABLE GGAX;Lo;0;L;;;;;N;;;;;
+A21C;YI SYLLABLE GGA;Lo;0;L;;;;;N;;;;;
+A21D;YI SYLLABLE GGAP;Lo;0;L;;;;;N;;;;;
+A21E;YI SYLLABLE GGUOT;Lo;0;L;;;;;N;;;;;
+A21F;YI SYLLABLE GGUOX;Lo;0;L;;;;;N;;;;;
+A220;YI SYLLABLE GGUO;Lo;0;L;;;;;N;;;;;
+A221;YI SYLLABLE GGUOP;Lo;0;L;;;;;N;;;;;
+A222;YI SYLLABLE GGOT;Lo;0;L;;;;;N;;;;;
+A223;YI SYLLABLE GGOX;Lo;0;L;;;;;N;;;;;
+A224;YI SYLLABLE GGO;Lo;0;L;;;;;N;;;;;
+A225;YI SYLLABLE GGOP;Lo;0;L;;;;;N;;;;;
+A226;YI SYLLABLE GGET;Lo;0;L;;;;;N;;;;;
+A227;YI SYLLABLE GGEX;Lo;0;L;;;;;N;;;;;
+A228;YI SYLLABLE GGE;Lo;0;L;;;;;N;;;;;
+A229;YI SYLLABLE GGEP;Lo;0;L;;;;;N;;;;;
+A22A;YI SYLLABLE GGUT;Lo;0;L;;;;;N;;;;;
+A22B;YI SYLLABLE GGUX;Lo;0;L;;;;;N;;;;;
+A22C;YI SYLLABLE GGU;Lo;0;L;;;;;N;;;;;
+A22D;YI SYLLABLE GGUP;Lo;0;L;;;;;N;;;;;
+A22E;YI SYLLABLE GGURX;Lo;0;L;;;;;N;;;;;
+A22F;YI SYLLABLE GGUR;Lo;0;L;;;;;N;;;;;
+A230;YI SYLLABLE MGIEX;Lo;0;L;;;;;N;;;;;
+A231;YI SYLLABLE MGIE;Lo;0;L;;;;;N;;;;;
+A232;YI SYLLABLE MGAT;Lo;0;L;;;;;N;;;;;
+A233;YI SYLLABLE MGAX;Lo;0;L;;;;;N;;;;;
+A234;YI SYLLABLE MGA;Lo;0;L;;;;;N;;;;;
+A235;YI SYLLABLE MGAP;Lo;0;L;;;;;N;;;;;
+A236;YI SYLLABLE MGUOX;Lo;0;L;;;;;N;;;;;
+A237;YI SYLLABLE MGUO;Lo;0;L;;;;;N;;;;;
+A238;YI SYLLABLE MGUOP;Lo;0;L;;;;;N;;;;;
+A239;YI SYLLABLE MGOT;Lo;0;L;;;;;N;;;;;
+A23A;YI SYLLABLE MGOX;Lo;0;L;;;;;N;;;;;
+A23B;YI SYLLABLE MGO;Lo;0;L;;;;;N;;;;;
+A23C;YI SYLLABLE MGOP;Lo;0;L;;;;;N;;;;;
+A23D;YI SYLLABLE MGEX;Lo;0;L;;;;;N;;;;;
+A23E;YI SYLLABLE MGE;Lo;0;L;;;;;N;;;;;
+A23F;YI SYLLABLE MGEP;Lo;0;L;;;;;N;;;;;
+A240;YI SYLLABLE MGUT;Lo;0;L;;;;;N;;;;;
+A241;YI SYLLABLE MGUX;Lo;0;L;;;;;N;;;;;
+A242;YI SYLLABLE MGU;Lo;0;L;;;;;N;;;;;
+A243;YI SYLLABLE MGUP;Lo;0;L;;;;;N;;;;;
+A244;YI SYLLABLE MGURX;Lo;0;L;;;;;N;;;;;
+A245;YI SYLLABLE MGUR;Lo;0;L;;;;;N;;;;;
+A246;YI SYLLABLE HXIT;Lo;0;L;;;;;N;;;;;
+A247;YI SYLLABLE HXIX;Lo;0;L;;;;;N;;;;;
+A248;YI SYLLABLE HXI;Lo;0;L;;;;;N;;;;;
+A249;YI SYLLABLE HXIP;Lo;0;L;;;;;N;;;;;
+A24A;YI SYLLABLE HXIET;Lo;0;L;;;;;N;;;;;
+A24B;YI SYLLABLE HXIEX;Lo;0;L;;;;;N;;;;;
+A24C;YI SYLLABLE HXIE;Lo;0;L;;;;;N;;;;;
+A24D;YI SYLLABLE HXIEP;Lo;0;L;;;;;N;;;;;
+A24E;YI SYLLABLE HXAT;Lo;0;L;;;;;N;;;;;
+A24F;YI SYLLABLE HXAX;Lo;0;L;;;;;N;;;;;
+A250;YI SYLLABLE HXA;Lo;0;L;;;;;N;;;;;
+A251;YI SYLLABLE HXAP;Lo;0;L;;;;;N;;;;;
+A252;YI SYLLABLE HXUOT;Lo;0;L;;;;;N;;;;;
+A253;YI SYLLABLE HXUOX;Lo;0;L;;;;;N;;;;;
+A254;YI SYLLABLE HXUO;Lo;0;L;;;;;N;;;;;
+A255;YI SYLLABLE HXUOP;Lo;0;L;;;;;N;;;;;
+A256;YI SYLLABLE HXOT;Lo;0;L;;;;;N;;;;;
+A257;YI SYLLABLE HXOX;Lo;0;L;;;;;N;;;;;
+A258;YI SYLLABLE HXO;Lo;0;L;;;;;N;;;;;
+A259;YI SYLLABLE HXOP;Lo;0;L;;;;;N;;;;;
+A25A;YI SYLLABLE HXEX;Lo;0;L;;;;;N;;;;;
+A25B;YI SYLLABLE HXE;Lo;0;L;;;;;N;;;;;
+A25C;YI SYLLABLE HXEP;Lo;0;L;;;;;N;;;;;
+A25D;YI SYLLABLE NGIEX;Lo;0;L;;;;;N;;;;;
+A25E;YI SYLLABLE NGIE;Lo;0;L;;;;;N;;;;;
+A25F;YI SYLLABLE NGIEP;Lo;0;L;;;;;N;;;;;
+A260;YI SYLLABLE NGAT;Lo;0;L;;;;;N;;;;;
+A261;YI SYLLABLE NGAX;Lo;0;L;;;;;N;;;;;
+A262;YI SYLLABLE NGA;Lo;0;L;;;;;N;;;;;
+A263;YI SYLLABLE NGAP;Lo;0;L;;;;;N;;;;;
+A264;YI SYLLABLE NGUOT;Lo;0;L;;;;;N;;;;;
+A265;YI SYLLABLE NGUOX;Lo;0;L;;;;;N;;;;;
+A266;YI SYLLABLE NGUO;Lo;0;L;;;;;N;;;;;
+A267;YI SYLLABLE NGOT;Lo;0;L;;;;;N;;;;;
+A268;YI SYLLABLE NGOX;Lo;0;L;;;;;N;;;;;
+A269;YI SYLLABLE NGO;Lo;0;L;;;;;N;;;;;
+A26A;YI SYLLABLE NGOP;Lo;0;L;;;;;N;;;;;
+A26B;YI SYLLABLE NGEX;Lo;0;L;;;;;N;;;;;
+A26C;YI SYLLABLE NGE;Lo;0;L;;;;;N;;;;;
+A26D;YI SYLLABLE NGEP;Lo;0;L;;;;;N;;;;;
+A26E;YI SYLLABLE HIT;Lo;0;L;;;;;N;;;;;
+A26F;YI SYLLABLE HIEX;Lo;0;L;;;;;N;;;;;
+A270;YI SYLLABLE HIE;Lo;0;L;;;;;N;;;;;
+A271;YI SYLLABLE HAT;Lo;0;L;;;;;N;;;;;
+A272;YI SYLLABLE HAX;Lo;0;L;;;;;N;;;;;
+A273;YI SYLLABLE HA;Lo;0;L;;;;;N;;;;;
+A274;YI SYLLABLE HAP;Lo;0;L;;;;;N;;;;;
+A275;YI SYLLABLE HUOT;Lo;0;L;;;;;N;;;;;
+A276;YI SYLLABLE HUOX;Lo;0;L;;;;;N;;;;;
+A277;YI SYLLABLE HUO;Lo;0;L;;;;;N;;;;;
+A278;YI SYLLABLE HUOP;Lo;0;L;;;;;N;;;;;
+A279;YI SYLLABLE HOT;Lo;0;L;;;;;N;;;;;
+A27A;YI SYLLABLE HOX;Lo;0;L;;;;;N;;;;;
+A27B;YI SYLLABLE HO;Lo;0;L;;;;;N;;;;;
+A27C;YI SYLLABLE HOP;Lo;0;L;;;;;N;;;;;
+A27D;YI SYLLABLE HEX;Lo;0;L;;;;;N;;;;;
+A27E;YI SYLLABLE HE;Lo;0;L;;;;;N;;;;;
+A27F;YI SYLLABLE HEP;Lo;0;L;;;;;N;;;;;
+A280;YI SYLLABLE WAT;Lo;0;L;;;;;N;;;;;
+A281;YI SYLLABLE WAX;Lo;0;L;;;;;N;;;;;
+A282;YI SYLLABLE WA;Lo;0;L;;;;;N;;;;;
+A283;YI SYLLABLE WAP;Lo;0;L;;;;;N;;;;;
+A284;YI SYLLABLE WUOX;Lo;0;L;;;;;N;;;;;
+A285;YI SYLLABLE WUO;Lo;0;L;;;;;N;;;;;
+A286;YI SYLLABLE WUOP;Lo;0;L;;;;;N;;;;;
+A287;YI SYLLABLE WOX;Lo;0;L;;;;;N;;;;;
+A288;YI SYLLABLE WO;Lo;0;L;;;;;N;;;;;
+A289;YI SYLLABLE WOP;Lo;0;L;;;;;N;;;;;
+A28A;YI SYLLABLE WEX;Lo;0;L;;;;;N;;;;;
+A28B;YI SYLLABLE WE;Lo;0;L;;;;;N;;;;;
+A28C;YI SYLLABLE WEP;Lo;0;L;;;;;N;;;;;
+A28D;YI SYLLABLE ZIT;Lo;0;L;;;;;N;;;;;
+A28E;YI SYLLABLE ZIX;Lo;0;L;;;;;N;;;;;
+A28F;YI SYLLABLE ZI;Lo;0;L;;;;;N;;;;;
+A290;YI SYLLABLE ZIP;Lo;0;L;;;;;N;;;;;
+A291;YI SYLLABLE ZIEX;Lo;0;L;;;;;N;;;;;
+A292;YI SYLLABLE ZIE;Lo;0;L;;;;;N;;;;;
+A293;YI SYLLABLE ZIEP;Lo;0;L;;;;;N;;;;;
+A294;YI SYLLABLE ZAT;Lo;0;L;;;;;N;;;;;
+A295;YI SYLLABLE ZAX;Lo;0;L;;;;;N;;;;;
+A296;YI SYLLABLE ZA;Lo;0;L;;;;;N;;;;;
+A297;YI SYLLABLE ZAP;Lo;0;L;;;;;N;;;;;
+A298;YI SYLLABLE ZUOX;Lo;0;L;;;;;N;;;;;
+A299;YI SYLLABLE ZUO;Lo;0;L;;;;;N;;;;;
+A29A;YI SYLLABLE ZUOP;Lo;0;L;;;;;N;;;;;
+A29B;YI SYLLABLE ZOT;Lo;0;L;;;;;N;;;;;
+A29C;YI SYLLABLE ZOX;Lo;0;L;;;;;N;;;;;
+A29D;YI SYLLABLE ZO;Lo;0;L;;;;;N;;;;;
+A29E;YI SYLLABLE ZOP;Lo;0;L;;;;;N;;;;;
+A29F;YI SYLLABLE ZEX;Lo;0;L;;;;;N;;;;;
+A2A0;YI SYLLABLE ZE;Lo;0;L;;;;;N;;;;;
+A2A1;YI SYLLABLE ZEP;Lo;0;L;;;;;N;;;;;
+A2A2;YI SYLLABLE ZUT;Lo;0;L;;;;;N;;;;;
+A2A3;YI SYLLABLE ZUX;Lo;0;L;;;;;N;;;;;
+A2A4;YI SYLLABLE ZU;Lo;0;L;;;;;N;;;;;
+A2A5;YI SYLLABLE ZUP;Lo;0;L;;;;;N;;;;;
+A2A6;YI SYLLABLE ZURX;Lo;0;L;;;;;N;;;;;
+A2A7;YI SYLLABLE ZUR;Lo;0;L;;;;;N;;;;;
+A2A8;YI SYLLABLE ZYT;Lo;0;L;;;;;N;;;;;
+A2A9;YI SYLLABLE ZYX;Lo;0;L;;;;;N;;;;;
+A2AA;YI SYLLABLE ZY;Lo;0;L;;;;;N;;;;;
+A2AB;YI SYLLABLE ZYP;Lo;0;L;;;;;N;;;;;
+A2AC;YI SYLLABLE ZYRX;Lo;0;L;;;;;N;;;;;
+A2AD;YI SYLLABLE ZYR;Lo;0;L;;;;;N;;;;;
+A2AE;YI SYLLABLE CIT;Lo;0;L;;;;;N;;;;;
+A2AF;YI SYLLABLE CIX;Lo;0;L;;;;;N;;;;;
+A2B0;YI SYLLABLE CI;Lo;0;L;;;;;N;;;;;
+A2B1;YI SYLLABLE CIP;Lo;0;L;;;;;N;;;;;
+A2B2;YI SYLLABLE CIET;Lo;0;L;;;;;N;;;;;
+A2B3;YI SYLLABLE CIEX;Lo;0;L;;;;;N;;;;;
+A2B4;YI SYLLABLE CIE;Lo;0;L;;;;;N;;;;;
+A2B5;YI SYLLABLE CIEP;Lo;0;L;;;;;N;;;;;
+A2B6;YI SYLLABLE CAT;Lo;0;L;;;;;N;;;;;
+A2B7;YI SYLLABLE CAX;Lo;0;L;;;;;N;;;;;
+A2B8;YI SYLLABLE CA;Lo;0;L;;;;;N;;;;;
+A2B9;YI SYLLABLE CAP;Lo;0;L;;;;;N;;;;;
+A2BA;YI SYLLABLE CUOX;Lo;0;L;;;;;N;;;;;
+A2BB;YI SYLLABLE CUO;Lo;0;L;;;;;N;;;;;
+A2BC;YI SYLLABLE CUOP;Lo;0;L;;;;;N;;;;;
+A2BD;YI SYLLABLE COT;Lo;0;L;;;;;N;;;;;
+A2BE;YI SYLLABLE COX;Lo;0;L;;;;;N;;;;;
+A2BF;YI SYLLABLE CO;Lo;0;L;;;;;N;;;;;
+A2C0;YI SYLLABLE COP;Lo;0;L;;;;;N;;;;;
+A2C1;YI SYLLABLE CEX;Lo;0;L;;;;;N;;;;;
+A2C2;YI SYLLABLE CE;Lo;0;L;;;;;N;;;;;
+A2C3;YI SYLLABLE CEP;Lo;0;L;;;;;N;;;;;
+A2C4;YI SYLLABLE CUT;Lo;0;L;;;;;N;;;;;
+A2C5;YI SYLLABLE CUX;Lo;0;L;;;;;N;;;;;
+A2C6;YI SYLLABLE CU;Lo;0;L;;;;;N;;;;;
+A2C7;YI SYLLABLE CUP;Lo;0;L;;;;;N;;;;;
+A2C8;YI SYLLABLE CURX;Lo;0;L;;;;;N;;;;;
+A2C9;YI SYLLABLE CUR;Lo;0;L;;;;;N;;;;;
+A2CA;YI SYLLABLE CYT;Lo;0;L;;;;;N;;;;;
+A2CB;YI SYLLABLE CYX;Lo;0;L;;;;;N;;;;;
+A2CC;YI SYLLABLE CY;Lo;0;L;;;;;N;;;;;
+A2CD;YI SYLLABLE CYP;Lo;0;L;;;;;N;;;;;
+A2CE;YI SYLLABLE CYRX;Lo;0;L;;;;;N;;;;;
+A2CF;YI SYLLABLE CYR;Lo;0;L;;;;;N;;;;;
+A2D0;YI SYLLABLE ZZIT;Lo;0;L;;;;;N;;;;;
+A2D1;YI SYLLABLE ZZIX;Lo;0;L;;;;;N;;;;;
+A2D2;YI SYLLABLE ZZI;Lo;0;L;;;;;N;;;;;
+A2D3;YI SYLLABLE ZZIP;Lo;0;L;;;;;N;;;;;
+A2D4;YI SYLLABLE ZZIET;Lo;0;L;;;;;N;;;;;
+A2D5;YI SYLLABLE ZZIEX;Lo;0;L;;;;;N;;;;;
+A2D6;YI SYLLABLE ZZIE;Lo;0;L;;;;;N;;;;;
+A2D7;YI SYLLABLE ZZIEP;Lo;0;L;;;;;N;;;;;
+A2D8;YI SYLLABLE ZZAT;Lo;0;L;;;;;N;;;;;
+A2D9;YI SYLLABLE ZZAX;Lo;0;L;;;;;N;;;;;
+A2DA;YI SYLLABLE ZZA;Lo;0;L;;;;;N;;;;;
+A2DB;YI SYLLABLE ZZAP;Lo;0;L;;;;;N;;;;;
+A2DC;YI SYLLABLE ZZOX;Lo;0;L;;;;;N;;;;;
+A2DD;YI SYLLABLE ZZO;Lo;0;L;;;;;N;;;;;
+A2DE;YI SYLLABLE ZZOP;Lo;0;L;;;;;N;;;;;
+A2DF;YI SYLLABLE ZZEX;Lo;0;L;;;;;N;;;;;
+A2E0;YI SYLLABLE ZZE;Lo;0;L;;;;;N;;;;;
+A2E1;YI SYLLABLE ZZEP;Lo;0;L;;;;;N;;;;;
+A2E2;YI SYLLABLE ZZUX;Lo;0;L;;;;;N;;;;;
+A2E3;YI SYLLABLE ZZU;Lo;0;L;;;;;N;;;;;
+A2E4;YI SYLLABLE ZZUP;Lo;0;L;;;;;N;;;;;
+A2E5;YI SYLLABLE ZZURX;Lo;0;L;;;;;N;;;;;
+A2E6;YI SYLLABLE ZZUR;Lo;0;L;;;;;N;;;;;
+A2E7;YI SYLLABLE ZZYT;Lo;0;L;;;;;N;;;;;
+A2E8;YI SYLLABLE ZZYX;Lo;0;L;;;;;N;;;;;
+A2E9;YI SYLLABLE ZZY;Lo;0;L;;;;;N;;;;;
+A2EA;YI SYLLABLE ZZYP;Lo;0;L;;;;;N;;;;;
+A2EB;YI SYLLABLE ZZYRX;Lo;0;L;;;;;N;;;;;
+A2EC;YI SYLLABLE ZZYR;Lo;0;L;;;;;N;;;;;
+A2ED;YI SYLLABLE NZIT;Lo;0;L;;;;;N;;;;;
+A2EE;YI SYLLABLE NZIX;Lo;0;L;;;;;N;;;;;
+A2EF;YI SYLLABLE NZI;Lo;0;L;;;;;N;;;;;
+A2F0;YI SYLLABLE NZIP;Lo;0;L;;;;;N;;;;;
+A2F1;YI SYLLABLE NZIEX;Lo;0;L;;;;;N;;;;;
+A2F2;YI SYLLABLE NZIE;Lo;0;L;;;;;N;;;;;
+A2F3;YI SYLLABLE NZIEP;Lo;0;L;;;;;N;;;;;
+A2F4;YI SYLLABLE NZAT;Lo;0;L;;;;;N;;;;;
+A2F5;YI SYLLABLE NZAX;Lo;0;L;;;;;N;;;;;
+A2F6;YI SYLLABLE NZA;Lo;0;L;;;;;N;;;;;
+A2F7;YI SYLLABLE NZAP;Lo;0;L;;;;;N;;;;;
+A2F8;YI SYLLABLE NZUOX;Lo;0;L;;;;;N;;;;;
+A2F9;YI SYLLABLE NZUO;Lo;0;L;;;;;N;;;;;
+A2FA;YI SYLLABLE NZOX;Lo;0;L;;;;;N;;;;;
+A2FB;YI SYLLABLE NZOP;Lo;0;L;;;;;N;;;;;
+A2FC;YI SYLLABLE NZEX;Lo;0;L;;;;;N;;;;;
+A2FD;YI SYLLABLE NZE;Lo;0;L;;;;;N;;;;;
+A2FE;YI SYLLABLE NZUX;Lo;0;L;;;;;N;;;;;
+A2FF;YI SYLLABLE NZU;Lo;0;L;;;;;N;;;;;
+A300;YI SYLLABLE NZUP;Lo;0;L;;;;;N;;;;;
+A301;YI SYLLABLE NZURX;Lo;0;L;;;;;N;;;;;
+A302;YI SYLLABLE NZUR;Lo;0;L;;;;;N;;;;;
+A303;YI SYLLABLE NZYT;Lo;0;L;;;;;N;;;;;
+A304;YI SYLLABLE NZYX;Lo;0;L;;;;;N;;;;;
+A305;YI SYLLABLE NZY;Lo;0;L;;;;;N;;;;;
+A306;YI SYLLABLE NZYP;Lo;0;L;;;;;N;;;;;
+A307;YI SYLLABLE NZYRX;Lo;0;L;;;;;N;;;;;
+A308;YI SYLLABLE NZYR;Lo;0;L;;;;;N;;;;;
+A309;YI SYLLABLE SIT;Lo;0;L;;;;;N;;;;;
+A30A;YI SYLLABLE SIX;Lo;0;L;;;;;N;;;;;
+A30B;YI SYLLABLE SI;Lo;0;L;;;;;N;;;;;
+A30C;YI SYLLABLE SIP;Lo;0;L;;;;;N;;;;;
+A30D;YI SYLLABLE SIEX;Lo;0;L;;;;;N;;;;;
+A30E;YI SYLLABLE SIE;Lo;0;L;;;;;N;;;;;
+A30F;YI SYLLABLE SIEP;Lo;0;L;;;;;N;;;;;
+A310;YI SYLLABLE SAT;Lo;0;L;;;;;N;;;;;
+A311;YI SYLLABLE SAX;Lo;0;L;;;;;N;;;;;
+A312;YI SYLLABLE SA;Lo;0;L;;;;;N;;;;;
+A313;YI SYLLABLE SAP;Lo;0;L;;;;;N;;;;;
+A314;YI SYLLABLE SUOX;Lo;0;L;;;;;N;;;;;
+A315;YI SYLLABLE SUO;Lo;0;L;;;;;N;;;;;
+A316;YI SYLLABLE SUOP;Lo;0;L;;;;;N;;;;;
+A317;YI SYLLABLE SOT;Lo;0;L;;;;;N;;;;;
+A318;YI SYLLABLE SOX;Lo;0;L;;;;;N;;;;;
+A319;YI SYLLABLE SO;Lo;0;L;;;;;N;;;;;
+A31A;YI SYLLABLE SOP;Lo;0;L;;;;;N;;;;;
+A31B;YI SYLLABLE SEX;Lo;0;L;;;;;N;;;;;
+A31C;YI SYLLABLE SE;Lo;0;L;;;;;N;;;;;
+A31D;YI SYLLABLE SEP;Lo;0;L;;;;;N;;;;;
+A31E;YI SYLLABLE SUT;Lo;0;L;;;;;N;;;;;
+A31F;YI SYLLABLE SUX;Lo;0;L;;;;;N;;;;;
+A320;YI SYLLABLE SU;Lo;0;L;;;;;N;;;;;
+A321;YI SYLLABLE SUP;Lo;0;L;;;;;N;;;;;
+A322;YI SYLLABLE SURX;Lo;0;L;;;;;N;;;;;
+A323;YI SYLLABLE SUR;Lo;0;L;;;;;N;;;;;
+A324;YI SYLLABLE SYT;Lo;0;L;;;;;N;;;;;
+A325;YI SYLLABLE SYX;Lo;0;L;;;;;N;;;;;
+A326;YI SYLLABLE SY;Lo;0;L;;;;;N;;;;;
+A327;YI SYLLABLE SYP;Lo;0;L;;;;;N;;;;;
+A328;YI SYLLABLE SYRX;Lo;0;L;;;;;N;;;;;
+A329;YI SYLLABLE SYR;Lo;0;L;;;;;N;;;;;
+A32A;YI SYLLABLE SSIT;Lo;0;L;;;;;N;;;;;
+A32B;YI SYLLABLE SSIX;Lo;0;L;;;;;N;;;;;
+A32C;YI SYLLABLE SSI;Lo;0;L;;;;;N;;;;;
+A32D;YI SYLLABLE SSIP;Lo;0;L;;;;;N;;;;;
+A32E;YI SYLLABLE SSIEX;Lo;0;L;;;;;N;;;;;
+A32F;YI SYLLABLE SSIE;Lo;0;L;;;;;N;;;;;
+A330;YI SYLLABLE SSIEP;Lo;0;L;;;;;N;;;;;
+A331;YI SYLLABLE SSAT;Lo;0;L;;;;;N;;;;;
+A332;YI SYLLABLE SSAX;Lo;0;L;;;;;N;;;;;
+A333;YI SYLLABLE SSA;Lo;0;L;;;;;N;;;;;
+A334;YI SYLLABLE SSAP;Lo;0;L;;;;;N;;;;;
+A335;YI SYLLABLE SSOT;Lo;0;L;;;;;N;;;;;
+A336;YI SYLLABLE SSOX;Lo;0;L;;;;;N;;;;;
+A337;YI SYLLABLE SSO;Lo;0;L;;;;;N;;;;;
+A338;YI SYLLABLE SSOP;Lo;0;L;;;;;N;;;;;
+A339;YI SYLLABLE SSEX;Lo;0;L;;;;;N;;;;;
+A33A;YI SYLLABLE SSE;Lo;0;L;;;;;N;;;;;
+A33B;YI SYLLABLE SSEP;Lo;0;L;;;;;N;;;;;
+A33C;YI SYLLABLE SSUT;Lo;0;L;;;;;N;;;;;
+A33D;YI SYLLABLE SSUX;Lo;0;L;;;;;N;;;;;
+A33E;YI SYLLABLE SSU;Lo;0;L;;;;;N;;;;;
+A33F;YI SYLLABLE SSUP;Lo;0;L;;;;;N;;;;;
+A340;YI SYLLABLE SSYT;Lo;0;L;;;;;N;;;;;
+A341;YI SYLLABLE SSYX;Lo;0;L;;;;;N;;;;;
+A342;YI SYLLABLE SSY;Lo;0;L;;;;;N;;;;;
+A343;YI SYLLABLE SSYP;Lo;0;L;;;;;N;;;;;
+A344;YI SYLLABLE SSYRX;Lo;0;L;;;;;N;;;;;
+A345;YI SYLLABLE SSYR;Lo;0;L;;;;;N;;;;;
+A346;YI SYLLABLE ZHAT;Lo;0;L;;;;;N;;;;;
+A347;YI SYLLABLE ZHAX;Lo;0;L;;;;;N;;;;;
+A348;YI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;;
+A349;YI SYLLABLE ZHAP;Lo;0;L;;;;;N;;;;;
+A34A;YI SYLLABLE ZHUOX;Lo;0;L;;;;;N;;;;;
+A34B;YI SYLLABLE ZHUO;Lo;0;L;;;;;N;;;;;
+A34C;YI SYLLABLE ZHUOP;Lo;0;L;;;;;N;;;;;
+A34D;YI SYLLABLE ZHOT;Lo;0;L;;;;;N;;;;;
+A34E;YI SYLLABLE ZHOX;Lo;0;L;;;;;N;;;;;
+A34F;YI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;;
+A350;YI SYLLABLE ZHOP;Lo;0;L;;;;;N;;;;;
+A351;YI SYLLABLE ZHET;Lo;0;L;;;;;N;;;;;
+A352;YI SYLLABLE ZHEX;Lo;0;L;;;;;N;;;;;
+A353;YI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;;
+A354;YI SYLLABLE ZHEP;Lo;0;L;;;;;N;;;;;
+A355;YI SYLLABLE ZHUT;Lo;0;L;;;;;N;;;;;
+A356;YI SYLLABLE ZHUX;Lo;0;L;;;;;N;;;;;
+A357;YI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;;
+A358;YI SYLLABLE ZHUP;Lo;0;L;;;;;N;;;;;
+A359;YI SYLLABLE ZHURX;Lo;0;L;;;;;N;;;;;
+A35A;YI SYLLABLE ZHUR;Lo;0;L;;;;;N;;;;;
+A35B;YI SYLLABLE ZHYT;Lo;0;L;;;;;N;;;;;
+A35C;YI SYLLABLE ZHYX;Lo;0;L;;;;;N;;;;;
+A35D;YI SYLLABLE ZHY;Lo;0;L;;;;;N;;;;;
+A35E;YI SYLLABLE ZHYP;Lo;0;L;;;;;N;;;;;
+A35F;YI SYLLABLE ZHYRX;Lo;0;L;;;;;N;;;;;
+A360;YI SYLLABLE ZHYR;Lo;0;L;;;;;N;;;;;
+A361;YI SYLLABLE CHAT;Lo;0;L;;;;;N;;;;;
+A362;YI SYLLABLE CHAX;Lo;0;L;;;;;N;;;;;
+A363;YI SYLLABLE CHA;Lo;0;L;;;;;N;;;;;
+A364;YI SYLLABLE CHAP;Lo;0;L;;;;;N;;;;;
+A365;YI SYLLABLE CHUOT;Lo;0;L;;;;;N;;;;;
+A366;YI SYLLABLE CHUOX;Lo;0;L;;;;;N;;;;;
+A367;YI SYLLABLE CHUO;Lo;0;L;;;;;N;;;;;
+A368;YI SYLLABLE CHUOP;Lo;0;L;;;;;N;;;;;
+A369;YI SYLLABLE CHOT;Lo;0;L;;;;;N;;;;;
+A36A;YI SYLLABLE CHOX;Lo;0;L;;;;;N;;;;;
+A36B;YI SYLLABLE CHO;Lo;0;L;;;;;N;;;;;
+A36C;YI SYLLABLE CHOP;Lo;0;L;;;;;N;;;;;
+A36D;YI SYLLABLE CHET;Lo;0;L;;;;;N;;;;;
+A36E;YI SYLLABLE CHEX;Lo;0;L;;;;;N;;;;;
+A36F;YI SYLLABLE CHE;Lo;0;L;;;;;N;;;;;
+A370;YI SYLLABLE CHEP;Lo;0;L;;;;;N;;;;;
+A371;YI SYLLABLE CHUX;Lo;0;L;;;;;N;;;;;
+A372;YI SYLLABLE CHU;Lo;0;L;;;;;N;;;;;
+A373;YI SYLLABLE CHUP;Lo;0;L;;;;;N;;;;;
+A374;YI SYLLABLE CHURX;Lo;0;L;;;;;N;;;;;
+A375;YI SYLLABLE CHUR;Lo;0;L;;;;;N;;;;;
+A376;YI SYLLABLE CHYT;Lo;0;L;;;;;N;;;;;
+A377;YI SYLLABLE CHYX;Lo;0;L;;;;;N;;;;;
+A378;YI SYLLABLE CHY;Lo;0;L;;;;;N;;;;;
+A379;YI SYLLABLE CHYP;Lo;0;L;;;;;N;;;;;
+A37A;YI SYLLABLE CHYRX;Lo;0;L;;;;;N;;;;;
+A37B;YI SYLLABLE CHYR;Lo;0;L;;;;;N;;;;;
+A37C;YI SYLLABLE RRAX;Lo;0;L;;;;;N;;;;;
+A37D;YI SYLLABLE RRA;Lo;0;L;;;;;N;;;;;
+A37E;YI SYLLABLE RRUOX;Lo;0;L;;;;;N;;;;;
+A37F;YI SYLLABLE RRUO;Lo;0;L;;;;;N;;;;;
+A380;YI SYLLABLE RROT;Lo;0;L;;;;;N;;;;;
+A381;YI SYLLABLE RROX;Lo;0;L;;;;;N;;;;;
+A382;YI SYLLABLE RRO;Lo;0;L;;;;;N;;;;;
+A383;YI SYLLABLE RROP;Lo;0;L;;;;;N;;;;;
+A384;YI SYLLABLE RRET;Lo;0;L;;;;;N;;;;;
+A385;YI SYLLABLE RREX;Lo;0;L;;;;;N;;;;;
+A386;YI SYLLABLE RRE;Lo;0;L;;;;;N;;;;;
+A387;YI SYLLABLE RREP;Lo;0;L;;;;;N;;;;;
+A388;YI SYLLABLE RRUT;Lo;0;L;;;;;N;;;;;
+A389;YI SYLLABLE RRUX;Lo;0;L;;;;;N;;;;;
+A38A;YI SYLLABLE RRU;Lo;0;L;;;;;N;;;;;
+A38B;YI SYLLABLE RRUP;Lo;0;L;;;;;N;;;;;
+A38C;YI SYLLABLE RRURX;Lo;0;L;;;;;N;;;;;
+A38D;YI SYLLABLE RRUR;Lo;0;L;;;;;N;;;;;
+A38E;YI SYLLABLE RRYT;Lo;0;L;;;;;N;;;;;
+A38F;YI SYLLABLE RRYX;Lo;0;L;;;;;N;;;;;
+A390;YI SYLLABLE RRY;Lo;0;L;;;;;N;;;;;
+A391;YI SYLLABLE RRYP;Lo;0;L;;;;;N;;;;;
+A392;YI SYLLABLE RRYRX;Lo;0;L;;;;;N;;;;;
+A393;YI SYLLABLE RRYR;Lo;0;L;;;;;N;;;;;
+A394;YI SYLLABLE NRAT;Lo;0;L;;;;;N;;;;;
+A395;YI SYLLABLE NRAX;Lo;0;L;;;;;N;;;;;
+A396;YI SYLLABLE NRA;Lo;0;L;;;;;N;;;;;
+A397;YI SYLLABLE NRAP;Lo;0;L;;;;;N;;;;;
+A398;YI SYLLABLE NROX;Lo;0;L;;;;;N;;;;;
+A399;YI SYLLABLE NRO;Lo;0;L;;;;;N;;;;;
+A39A;YI SYLLABLE NROP;Lo;0;L;;;;;N;;;;;
+A39B;YI SYLLABLE NRET;Lo;0;L;;;;;N;;;;;
+A39C;YI SYLLABLE NREX;Lo;0;L;;;;;N;;;;;
+A39D;YI SYLLABLE NRE;Lo;0;L;;;;;N;;;;;
+A39E;YI SYLLABLE NREP;Lo;0;L;;;;;N;;;;;
+A39F;YI SYLLABLE NRUT;Lo;0;L;;;;;N;;;;;
+A3A0;YI SYLLABLE NRUX;Lo;0;L;;;;;N;;;;;
+A3A1;YI SYLLABLE NRU;Lo;0;L;;;;;N;;;;;
+A3A2;YI SYLLABLE NRUP;Lo;0;L;;;;;N;;;;;
+A3A3;YI SYLLABLE NRURX;Lo;0;L;;;;;N;;;;;
+A3A4;YI SYLLABLE NRUR;Lo;0;L;;;;;N;;;;;
+A3A5;YI SYLLABLE NRYT;Lo;0;L;;;;;N;;;;;
+A3A6;YI SYLLABLE NRYX;Lo;0;L;;;;;N;;;;;
+A3A7;YI SYLLABLE NRY;Lo;0;L;;;;;N;;;;;
+A3A8;YI SYLLABLE NRYP;Lo;0;L;;;;;N;;;;;
+A3A9;YI SYLLABLE NRYRX;Lo;0;L;;;;;N;;;;;
+A3AA;YI SYLLABLE NRYR;Lo;0;L;;;;;N;;;;;
+A3AB;YI SYLLABLE SHAT;Lo;0;L;;;;;N;;;;;
+A3AC;YI SYLLABLE SHAX;Lo;0;L;;;;;N;;;;;
+A3AD;YI SYLLABLE SHA;Lo;0;L;;;;;N;;;;;
+A3AE;YI SYLLABLE SHAP;Lo;0;L;;;;;N;;;;;
+A3AF;YI SYLLABLE SHUOX;Lo;0;L;;;;;N;;;;;
+A3B0;YI SYLLABLE SHUO;Lo;0;L;;;;;N;;;;;
+A3B1;YI SYLLABLE SHUOP;Lo;0;L;;;;;N;;;;;
+A3B2;YI SYLLABLE SHOT;Lo;0;L;;;;;N;;;;;
+A3B3;YI SYLLABLE SHOX;Lo;0;L;;;;;N;;;;;
+A3B4;YI SYLLABLE SHO;Lo;0;L;;;;;N;;;;;
+A3B5;YI SYLLABLE SHOP;Lo;0;L;;;;;N;;;;;
+A3B6;YI SYLLABLE SHET;Lo;0;L;;;;;N;;;;;
+A3B7;YI SYLLABLE SHEX;Lo;0;L;;;;;N;;;;;
+A3B8;YI SYLLABLE SHE;Lo;0;L;;;;;N;;;;;
+A3B9;YI SYLLABLE SHEP;Lo;0;L;;;;;N;;;;;
+A3BA;YI SYLLABLE SHUT;Lo;0;L;;;;;N;;;;;
+A3BB;YI SYLLABLE SHUX;Lo;0;L;;;;;N;;;;;
+A3BC;YI SYLLABLE SHU;Lo;0;L;;;;;N;;;;;
+A3BD;YI SYLLABLE SHUP;Lo;0;L;;;;;N;;;;;
+A3BE;YI SYLLABLE SHURX;Lo;0;L;;;;;N;;;;;
+A3BF;YI SYLLABLE SHUR;Lo;0;L;;;;;N;;;;;
+A3C0;YI SYLLABLE SHYT;Lo;0;L;;;;;N;;;;;
+A3C1;YI SYLLABLE SHYX;Lo;0;L;;;;;N;;;;;
+A3C2;YI SYLLABLE SHY;Lo;0;L;;;;;N;;;;;
+A3C3;YI SYLLABLE SHYP;Lo;0;L;;;;;N;;;;;
+A3C4;YI SYLLABLE SHYRX;Lo;0;L;;;;;N;;;;;
+A3C5;YI SYLLABLE SHYR;Lo;0;L;;;;;N;;;;;
+A3C6;YI SYLLABLE RAT;Lo;0;L;;;;;N;;;;;
+A3C7;YI SYLLABLE RAX;Lo;0;L;;;;;N;;;;;
+A3C8;YI SYLLABLE RA;Lo;0;L;;;;;N;;;;;
+A3C9;YI SYLLABLE RAP;Lo;0;L;;;;;N;;;;;
+A3CA;YI SYLLABLE RUOX;Lo;0;L;;;;;N;;;;;
+A3CB;YI SYLLABLE RUO;Lo;0;L;;;;;N;;;;;
+A3CC;YI SYLLABLE RUOP;Lo;0;L;;;;;N;;;;;
+A3CD;YI SYLLABLE ROT;Lo;0;L;;;;;N;;;;;
+A3CE;YI SYLLABLE ROX;Lo;0;L;;;;;N;;;;;
+A3CF;YI SYLLABLE RO;Lo;0;L;;;;;N;;;;;
+A3D0;YI SYLLABLE ROP;Lo;0;L;;;;;N;;;;;
+A3D1;YI SYLLABLE REX;Lo;0;L;;;;;N;;;;;
+A3D2;YI SYLLABLE RE;Lo;0;L;;;;;N;;;;;
+A3D3;YI SYLLABLE REP;Lo;0;L;;;;;N;;;;;
+A3D4;YI SYLLABLE RUT;Lo;0;L;;;;;N;;;;;
+A3D5;YI SYLLABLE RUX;Lo;0;L;;;;;N;;;;;
+A3D6;YI SYLLABLE RU;Lo;0;L;;;;;N;;;;;
+A3D7;YI SYLLABLE RUP;Lo;0;L;;;;;N;;;;;
+A3D8;YI SYLLABLE RURX;Lo;0;L;;;;;N;;;;;
+A3D9;YI SYLLABLE RUR;Lo;0;L;;;;;N;;;;;
+A3DA;YI SYLLABLE RYT;Lo;0;L;;;;;N;;;;;
+A3DB;YI SYLLABLE RYX;Lo;0;L;;;;;N;;;;;
+A3DC;YI SYLLABLE RY;Lo;0;L;;;;;N;;;;;
+A3DD;YI SYLLABLE RYP;Lo;0;L;;;;;N;;;;;
+A3DE;YI SYLLABLE RYRX;Lo;0;L;;;;;N;;;;;
+A3DF;YI SYLLABLE RYR;Lo;0;L;;;;;N;;;;;
+A3E0;YI SYLLABLE JIT;Lo;0;L;;;;;N;;;;;
+A3E1;YI SYLLABLE JIX;Lo;0;L;;;;;N;;;;;
+A3E2;YI SYLLABLE JI;Lo;0;L;;;;;N;;;;;
+A3E3;YI SYLLABLE JIP;Lo;0;L;;;;;N;;;;;
+A3E4;YI SYLLABLE JIET;Lo;0;L;;;;;N;;;;;
+A3E5;YI SYLLABLE JIEX;Lo;0;L;;;;;N;;;;;
+A3E6;YI SYLLABLE JIE;Lo;0;L;;;;;N;;;;;
+A3E7;YI SYLLABLE JIEP;Lo;0;L;;;;;N;;;;;
+A3E8;YI SYLLABLE JUOT;Lo;0;L;;;;;N;;;;;
+A3E9;YI SYLLABLE JUOX;Lo;0;L;;;;;N;;;;;
+A3EA;YI SYLLABLE JUO;Lo;0;L;;;;;N;;;;;
+A3EB;YI SYLLABLE JUOP;Lo;0;L;;;;;N;;;;;
+A3EC;YI SYLLABLE JOT;Lo;0;L;;;;;N;;;;;
+A3ED;YI SYLLABLE JOX;Lo;0;L;;;;;N;;;;;
+A3EE;YI SYLLABLE JO;Lo;0;L;;;;;N;;;;;
+A3EF;YI SYLLABLE JOP;Lo;0;L;;;;;N;;;;;
+A3F0;YI SYLLABLE JUT;Lo;0;L;;;;;N;;;;;
+A3F1;YI SYLLABLE JUX;Lo;0;L;;;;;N;;;;;
+A3F2;YI SYLLABLE JU;Lo;0;L;;;;;N;;;;;
+A3F3;YI SYLLABLE JUP;Lo;0;L;;;;;N;;;;;
+A3F4;YI SYLLABLE JURX;Lo;0;L;;;;;N;;;;;
+A3F5;YI SYLLABLE JUR;Lo;0;L;;;;;N;;;;;
+A3F6;YI SYLLABLE JYT;Lo;0;L;;;;;N;;;;;
+A3F7;YI SYLLABLE JYX;Lo;0;L;;;;;N;;;;;
+A3F8;YI SYLLABLE JY;Lo;0;L;;;;;N;;;;;
+A3F9;YI SYLLABLE JYP;Lo;0;L;;;;;N;;;;;
+A3FA;YI SYLLABLE JYRX;Lo;0;L;;;;;N;;;;;
+A3FB;YI SYLLABLE JYR;Lo;0;L;;;;;N;;;;;
+A3FC;YI SYLLABLE QIT;Lo;0;L;;;;;N;;;;;
+A3FD;YI SYLLABLE QIX;Lo;0;L;;;;;N;;;;;
+A3FE;YI SYLLABLE QI;Lo;0;L;;;;;N;;;;;
+A3FF;YI SYLLABLE QIP;Lo;0;L;;;;;N;;;;;
+A400;YI SYLLABLE QIET;Lo;0;L;;;;;N;;;;;
+A401;YI SYLLABLE QIEX;Lo;0;L;;;;;N;;;;;
+A402;YI SYLLABLE QIE;Lo;0;L;;;;;N;;;;;
+A403;YI SYLLABLE QIEP;Lo;0;L;;;;;N;;;;;
+A404;YI SYLLABLE QUOT;Lo;0;L;;;;;N;;;;;
+A405;YI SYLLABLE QUOX;Lo;0;L;;;;;N;;;;;
+A406;YI SYLLABLE QUO;Lo;0;L;;;;;N;;;;;
+A407;YI SYLLABLE QUOP;Lo;0;L;;;;;N;;;;;
+A408;YI SYLLABLE QOT;Lo;0;L;;;;;N;;;;;
+A409;YI SYLLABLE QOX;Lo;0;L;;;;;N;;;;;
+A40A;YI SYLLABLE QO;Lo;0;L;;;;;N;;;;;
+A40B;YI SYLLABLE QOP;Lo;0;L;;;;;N;;;;;
+A40C;YI SYLLABLE QUT;Lo;0;L;;;;;N;;;;;
+A40D;YI SYLLABLE QUX;Lo;0;L;;;;;N;;;;;
+A40E;YI SYLLABLE QU;Lo;0;L;;;;;N;;;;;
+A40F;YI SYLLABLE QUP;Lo;0;L;;;;;N;;;;;
+A410;YI SYLLABLE QURX;Lo;0;L;;;;;N;;;;;
+A411;YI SYLLABLE QUR;Lo;0;L;;;;;N;;;;;
+A412;YI SYLLABLE QYT;Lo;0;L;;;;;N;;;;;
+A413;YI SYLLABLE QYX;Lo;0;L;;;;;N;;;;;
+A414;YI SYLLABLE QY;Lo;0;L;;;;;N;;;;;
+A415;YI SYLLABLE QYP;Lo;0;L;;;;;N;;;;;
+A416;YI SYLLABLE QYRX;Lo;0;L;;;;;N;;;;;
+A417;YI SYLLABLE QYR;Lo;0;L;;;;;N;;;;;
+A418;YI SYLLABLE JJIT;Lo;0;L;;;;;N;;;;;
+A419;YI SYLLABLE JJIX;Lo;0;L;;;;;N;;;;;
+A41A;YI SYLLABLE JJI;Lo;0;L;;;;;N;;;;;
+A41B;YI SYLLABLE JJIP;Lo;0;L;;;;;N;;;;;
+A41C;YI SYLLABLE JJIET;Lo;0;L;;;;;N;;;;;
+A41D;YI SYLLABLE JJIEX;Lo;0;L;;;;;N;;;;;
+A41E;YI SYLLABLE JJIE;Lo;0;L;;;;;N;;;;;
+A41F;YI SYLLABLE JJIEP;Lo;0;L;;;;;N;;;;;
+A420;YI SYLLABLE JJUOX;Lo;0;L;;;;;N;;;;;
+A421;YI SYLLABLE JJUO;Lo;0;L;;;;;N;;;;;
+A422;YI SYLLABLE JJUOP;Lo;0;L;;;;;N;;;;;
+A423;YI SYLLABLE JJOT;Lo;0;L;;;;;N;;;;;
+A424;YI SYLLABLE JJOX;Lo;0;L;;;;;N;;;;;
+A425;YI SYLLABLE JJO;Lo;0;L;;;;;N;;;;;
+A426;YI SYLLABLE JJOP;Lo;0;L;;;;;N;;;;;
+A427;YI SYLLABLE JJUT;Lo;0;L;;;;;N;;;;;
+A428;YI SYLLABLE JJUX;Lo;0;L;;;;;N;;;;;
+A429;YI SYLLABLE JJU;Lo;0;L;;;;;N;;;;;
+A42A;YI SYLLABLE JJUP;Lo;0;L;;;;;N;;;;;
+A42B;YI SYLLABLE JJURX;Lo;0;L;;;;;N;;;;;
+A42C;YI SYLLABLE JJUR;Lo;0;L;;;;;N;;;;;
+A42D;YI SYLLABLE JJYT;Lo;0;L;;;;;N;;;;;
+A42E;YI SYLLABLE JJYX;Lo;0;L;;;;;N;;;;;
+A42F;YI SYLLABLE JJY;Lo;0;L;;;;;N;;;;;
+A430;YI SYLLABLE JJYP;Lo;0;L;;;;;N;;;;;
+A431;YI SYLLABLE NJIT;Lo;0;L;;;;;N;;;;;
+A432;YI SYLLABLE NJIX;Lo;0;L;;;;;N;;;;;
+A433;YI SYLLABLE NJI;Lo;0;L;;;;;N;;;;;
+A434;YI SYLLABLE NJIP;Lo;0;L;;;;;N;;;;;
+A435;YI SYLLABLE NJIET;Lo;0;L;;;;;N;;;;;
+A436;YI SYLLABLE NJIEX;Lo;0;L;;;;;N;;;;;
+A437;YI SYLLABLE NJIE;Lo;0;L;;;;;N;;;;;
+A438;YI SYLLABLE NJIEP;Lo;0;L;;;;;N;;;;;
+A439;YI SYLLABLE NJUOX;Lo;0;L;;;;;N;;;;;
+A43A;YI SYLLABLE NJUO;Lo;0;L;;;;;N;;;;;
+A43B;YI SYLLABLE NJOT;Lo;0;L;;;;;N;;;;;
+A43C;YI SYLLABLE NJOX;Lo;0;L;;;;;N;;;;;
+A43D;YI SYLLABLE NJO;Lo;0;L;;;;;N;;;;;
+A43E;YI SYLLABLE NJOP;Lo;0;L;;;;;N;;;;;
+A43F;YI SYLLABLE NJUX;Lo;0;L;;;;;N;;;;;
+A440;YI SYLLABLE NJU;Lo;0;L;;;;;N;;;;;
+A441;YI SYLLABLE NJUP;Lo;0;L;;;;;N;;;;;
+A442;YI SYLLABLE NJURX;Lo;0;L;;;;;N;;;;;
+A443;YI SYLLABLE NJUR;Lo;0;L;;;;;N;;;;;
+A444;YI SYLLABLE NJYT;Lo;0;L;;;;;N;;;;;
+A445;YI SYLLABLE NJYX;Lo;0;L;;;;;N;;;;;
+A446;YI SYLLABLE NJY;Lo;0;L;;;;;N;;;;;
+A447;YI SYLLABLE NJYP;Lo;0;L;;;;;N;;;;;
+A448;YI SYLLABLE NJYRX;Lo;0;L;;;;;N;;;;;
+A449;YI SYLLABLE NJYR;Lo;0;L;;;;;N;;;;;
+A44A;YI SYLLABLE NYIT;Lo;0;L;;;;;N;;;;;
+A44B;YI SYLLABLE NYIX;Lo;0;L;;;;;N;;;;;
+A44C;YI SYLLABLE NYI;Lo;0;L;;;;;N;;;;;
+A44D;YI SYLLABLE NYIP;Lo;0;L;;;;;N;;;;;
+A44E;YI SYLLABLE NYIET;Lo;0;L;;;;;N;;;;;
+A44F;YI SYLLABLE NYIEX;Lo;0;L;;;;;N;;;;;
+A450;YI SYLLABLE NYIE;Lo;0;L;;;;;N;;;;;
+A451;YI SYLLABLE NYIEP;Lo;0;L;;;;;N;;;;;
+A452;YI SYLLABLE NYUOX;Lo;0;L;;;;;N;;;;;
+A453;YI SYLLABLE NYUO;Lo;0;L;;;;;N;;;;;
+A454;YI SYLLABLE NYUOP;Lo;0;L;;;;;N;;;;;
+A455;YI SYLLABLE NYOT;Lo;0;L;;;;;N;;;;;
+A456;YI SYLLABLE NYOX;Lo;0;L;;;;;N;;;;;
+A457;YI SYLLABLE NYO;Lo;0;L;;;;;N;;;;;
+A458;YI SYLLABLE NYOP;Lo;0;L;;;;;N;;;;;
+A459;YI SYLLABLE NYUT;Lo;0;L;;;;;N;;;;;
+A45A;YI SYLLABLE NYUX;Lo;0;L;;;;;N;;;;;
+A45B;YI SYLLABLE NYU;Lo;0;L;;;;;N;;;;;
+A45C;YI SYLLABLE NYUP;Lo;0;L;;;;;N;;;;;
+A45D;YI SYLLABLE XIT;Lo;0;L;;;;;N;;;;;
+A45E;YI SYLLABLE XIX;Lo;0;L;;;;;N;;;;;
+A45F;YI SYLLABLE XI;Lo;0;L;;;;;N;;;;;
+A460;YI SYLLABLE XIP;Lo;0;L;;;;;N;;;;;
+A461;YI SYLLABLE XIET;Lo;0;L;;;;;N;;;;;
+A462;YI SYLLABLE XIEX;Lo;0;L;;;;;N;;;;;
+A463;YI SYLLABLE XIE;Lo;0;L;;;;;N;;;;;
+A464;YI SYLLABLE XIEP;Lo;0;L;;;;;N;;;;;
+A465;YI SYLLABLE XUOX;Lo;0;L;;;;;N;;;;;
+A466;YI SYLLABLE XUO;Lo;0;L;;;;;N;;;;;
+A467;YI SYLLABLE XOT;Lo;0;L;;;;;N;;;;;
+A468;YI SYLLABLE XOX;Lo;0;L;;;;;N;;;;;
+A469;YI SYLLABLE XO;Lo;0;L;;;;;N;;;;;
+A46A;YI SYLLABLE XOP;Lo;0;L;;;;;N;;;;;
+A46B;YI SYLLABLE XYT;Lo;0;L;;;;;N;;;;;
+A46C;YI SYLLABLE XYX;Lo;0;L;;;;;N;;;;;
+A46D;YI SYLLABLE XY;Lo;0;L;;;;;N;;;;;
+A46E;YI SYLLABLE XYP;Lo;0;L;;;;;N;;;;;
+A46F;YI SYLLABLE XYRX;Lo;0;L;;;;;N;;;;;
+A470;YI SYLLABLE XYR;Lo;0;L;;;;;N;;;;;
+A471;YI SYLLABLE YIT;Lo;0;L;;;;;N;;;;;
+A472;YI SYLLABLE YIX;Lo;0;L;;;;;N;;;;;
+A473;YI SYLLABLE YI;Lo;0;L;;;;;N;;;;;
+A474;YI SYLLABLE YIP;Lo;0;L;;;;;N;;;;;
+A475;YI SYLLABLE YIET;Lo;0;L;;;;;N;;;;;
+A476;YI SYLLABLE YIEX;Lo;0;L;;;;;N;;;;;
+A477;YI SYLLABLE YIE;Lo;0;L;;;;;N;;;;;
+A478;YI SYLLABLE YIEP;Lo;0;L;;;;;N;;;;;
+A479;YI SYLLABLE YUOT;Lo;0;L;;;;;N;;;;;
+A47A;YI SYLLABLE YUOX;Lo;0;L;;;;;N;;;;;
+A47B;YI SYLLABLE YUO;Lo;0;L;;;;;N;;;;;
+A47C;YI SYLLABLE YUOP;Lo;0;L;;;;;N;;;;;
+A47D;YI SYLLABLE YOT;Lo;0;L;;;;;N;;;;;
+A47E;YI SYLLABLE YOX;Lo;0;L;;;;;N;;;;;
+A47F;YI SYLLABLE YO;Lo;0;L;;;;;N;;;;;
+A480;YI SYLLABLE YOP;Lo;0;L;;;;;N;;;;;
+A481;YI SYLLABLE YUT;Lo;0;L;;;;;N;;;;;
+A482;YI SYLLABLE YUX;Lo;0;L;;;;;N;;;;;
+A483;YI SYLLABLE YU;Lo;0;L;;;;;N;;;;;
+A484;YI SYLLABLE YUP;Lo;0;L;;;;;N;;;;;
+A485;YI SYLLABLE YURX;Lo;0;L;;;;;N;;;;;
+A486;YI SYLLABLE YUR;Lo;0;L;;;;;N;;;;;
+A487;YI SYLLABLE YYT;Lo;0;L;;;;;N;;;;;
+A488;YI SYLLABLE YYX;Lo;0;L;;;;;N;;;;;
+A489;YI SYLLABLE YY;Lo;0;L;;;;;N;;;;;
+A48A;YI SYLLABLE YYP;Lo;0;L;;;;;N;;;;;
+A48B;YI SYLLABLE YYRX;Lo;0;L;;;;;N;;;;;
+A48C;YI SYLLABLE YYR;Lo;0;L;;;;;N;;;;;
+A490;YI RADICAL QOT;So;0;ON;;;;;N;;;;;
+A491;YI RADICAL LI;So;0;ON;;;;;N;;;;;
+A492;YI RADICAL KIT;So;0;ON;;;;;N;;;;;
+A493;YI RADICAL NYIP;So;0;ON;;;;;N;;;;;
+A494;YI RADICAL CYP;So;0;ON;;;;;N;;;;;
+A495;YI RADICAL SSI;So;0;ON;;;;;N;;;;;
+A496;YI RADICAL GGOP;So;0;ON;;;;;N;;;;;
+A497;YI RADICAL GEP;So;0;ON;;;;;N;;;;;
+A498;YI RADICAL MI;So;0;ON;;;;;N;;;;;
+A499;YI RADICAL HXIT;So;0;ON;;;;;N;;;;;
+A49A;YI RADICAL LYR;So;0;ON;;;;;N;;;;;
+A49B;YI RADICAL BBUT;So;0;ON;;;;;N;;;;;
+A49C;YI RADICAL MOP;So;0;ON;;;;;N;;;;;
+A49D;YI RADICAL YO;So;0;ON;;;;;N;;;;;
+A49E;YI RADICAL PUT;So;0;ON;;;;;N;;;;;
+A49F;YI RADICAL HXUO;So;0;ON;;;;;N;;;;;
+A4A0;YI RADICAL TAT;So;0;ON;;;;;N;;;;;
+A4A1;YI RADICAL GA;So;0;ON;;;;;N;;;;;
+A4A2;YI RADICAL ZUP;So;0;ON;;;;;N;;;;;
+A4A3;YI RADICAL CYT;So;0;ON;;;;;N;;;;;
+A4A4;YI RADICAL DDUR;So;0;ON;;;;;N;;;;;
+A4A5;YI RADICAL BUR;So;0;ON;;;;;N;;;;;
+A4A6;YI RADICAL GGUO;So;0;ON;;;;;N;;;;;
+A4A7;YI RADICAL NYOP;So;0;ON;;;;;N;;;;;
+A4A8;YI RADICAL TU;So;0;ON;;;;;N;;;;;
+A4A9;YI RADICAL OP;So;0;ON;;;;;N;;;;;
+A4AA;YI RADICAL JJUT;So;0;ON;;;;;N;;;;;
+A4AB;YI RADICAL ZOT;So;0;ON;;;;;N;;;;;
+A4AC;YI RADICAL PYT;So;0;ON;;;;;N;;;;;
+A4AD;YI RADICAL HMO;So;0;ON;;;;;N;;;;;
+A4AE;YI RADICAL YIT;So;0;ON;;;;;N;;;;;
+A4AF;YI RADICAL VUR;So;0;ON;;;;;N;;;;;
+A4B0;YI RADICAL SHY;So;0;ON;;;;;N;;;;;
+A4B1;YI RADICAL VEP;So;0;ON;;;;;N;;;;;
+A4B2;YI RADICAL ZA;So;0;ON;;;;;N;;;;;
+A4B3;YI RADICAL JO;So;0;ON;;;;;N;;;;;
+A4B4;YI RADICAL NZUP;So;0;ON;;;;;N;;;;;
+A4B5;YI RADICAL JJY;So;0;ON;;;;;N;;;;;
+A4B6;YI RADICAL GOT;So;0;ON;;;;;N;;;;;
+A4B7;YI RADICAL JJIE;So;0;ON;;;;;N;;;;;
+A4B8;YI RADICAL WO;So;0;ON;;;;;N;;;;;
+A4B9;YI RADICAL DU;So;0;ON;;;;;N;;;;;
+A4BA;YI RADICAL SHUR;So;0;ON;;;;;N;;;;;
+A4BB;YI RADICAL LIE;So;0;ON;;;;;N;;;;;
+A4BC;YI RADICAL CY;So;0;ON;;;;;N;;;;;
+A4BD;YI RADICAL CUOP;So;0;ON;;;;;N;;;;;
+A4BE;YI RADICAL CIP;So;0;ON;;;;;N;;;;;
+A4BF;YI RADICAL HXOP;So;0;ON;;;;;N;;;;;
+A4C0;YI RADICAL SHAT;So;0;ON;;;;;N;;;;;
+A4C1;YI RADICAL ZUR;So;0;ON;;;;;N;;;;;
+A4C2;YI RADICAL SHOP;So;0;ON;;;;;N;;;;;
+A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;;
+A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;;
+A4C5;YI RADICAL NBIE;So;0;ON;;;;;N;;;;;
+A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;;
+A4D0;LISU LETTER BA;Lo;0;L;;;;;N;;;;;
+A4D1;LISU LETTER PA;Lo;0;L;;;;;N;;;;;
+A4D2;LISU LETTER PHA;Lo;0;L;;;;;N;;;;;
+A4D3;LISU LETTER DA;Lo;0;L;;;;;N;;;;;
+A4D4;LISU LETTER TA;Lo;0;L;;;;;N;;;;;
+A4D5;LISU LETTER THA;Lo;0;L;;;;;N;;;;;
+A4D6;LISU LETTER GA;Lo;0;L;;;;;N;;;;;
+A4D7;LISU LETTER KA;Lo;0;L;;;;;N;;;;;
+A4D8;LISU LETTER KHA;Lo;0;L;;;;;N;;;;;
+A4D9;LISU LETTER JA;Lo;0;L;;;;;N;;;;;
+A4DA;LISU LETTER CA;Lo;0;L;;;;;N;;;;;
+A4DB;LISU LETTER CHA;Lo;0;L;;;;;N;;;;;
+A4DC;LISU LETTER DZA;Lo;0;L;;;;;N;;;;;
+A4DD;LISU LETTER TSA;Lo;0;L;;;;;N;;;;;
+A4DE;LISU LETTER TSHA;Lo;0;L;;;;;N;;;;;
+A4DF;LISU LETTER MA;Lo;0;L;;;;;N;;;;;
+A4E0;LISU LETTER NA;Lo;0;L;;;;;N;;;;;
+A4E1;LISU LETTER LA;Lo;0;L;;;;;N;;;;;
+A4E2;LISU LETTER SA;Lo;0;L;;;;;N;;;;;
+A4E3;LISU LETTER ZHA;Lo;0;L;;;;;N;;;;;
+A4E4;LISU LETTER ZA;Lo;0;L;;;;;N;;;;;
+A4E5;LISU LETTER NGA;Lo;0;L;;;;;N;;;;;
+A4E6;LISU LETTER HA;Lo;0;L;;;;;N;;;;;
+A4E7;LISU LETTER XA;Lo;0;L;;;;;N;;;;;
+A4E8;LISU LETTER HHA;Lo;0;L;;;;;N;;;;;
+A4E9;LISU LETTER FA;Lo;0;L;;;;;N;;;;;
+A4EA;LISU LETTER WA;Lo;0;L;;;;;N;;;;;
+A4EB;LISU LETTER SHA;Lo;0;L;;;;;N;;;;;
+A4EC;LISU LETTER YA;Lo;0;L;;;;;N;;;;;
+A4ED;LISU LETTER GHA;Lo;0;L;;;;;N;;;;;
+A4EE;LISU LETTER A;Lo;0;L;;;;;N;;;;;
+A4EF;LISU LETTER AE;Lo;0;L;;;;;N;;;;;
+A4F0;LISU LETTER E;Lo;0;L;;;;;N;;;;;
+A4F1;LISU LETTER EU;Lo;0;L;;;;;N;;;;;
+A4F2;LISU LETTER I;Lo;0;L;;;;;N;;;;;
+A4F3;LISU LETTER O;Lo;0;L;;;;;N;;;;;
+A4F4;LISU LETTER U;Lo;0;L;;;;;N;;;;;
+A4F5;LISU LETTER UE;Lo;0;L;;;;;N;;;;;
+A4F6;LISU LETTER UH;Lo;0;L;;;;;N;;;;;
+A4F7;LISU LETTER OE;Lo;0;L;;;;;N;;;;;
+A4F8;LISU LETTER TONE MYA TI;Lm;0;L;;;;;N;;;;;
+A4F9;LISU LETTER TONE NA PO;Lm;0;L;;;;;N;;;;;
+A4FA;LISU LETTER TONE MYA CYA;Lm;0;L;;;;;N;;;;;
+A4FB;LISU LETTER TONE MYA BO;Lm;0;L;;;;;N;;;;;
+A4FC;LISU LETTER TONE MYA NA;Lm;0;L;;;;;N;;;;;
+A4FD;LISU LETTER TONE MYA JEU;Lm;0;L;;;;;N;;;;;
+A4FE;LISU PUNCTUATION COMMA;Po;0;L;;;;;N;;;;;
+A4FF;LISU PUNCTUATION FULL STOP;Po;0;L;;;;;N;;;;;
+A500;VAI SYLLABLE EE;Lo;0;L;;;;;N;;;;;
+A501;VAI SYLLABLE EEN;Lo;0;L;;;;;N;;;;;
+A502;VAI SYLLABLE HEE;Lo;0;L;;;;;N;;;;;
+A503;VAI SYLLABLE WEE;Lo;0;L;;;;;N;;;;;
+A504;VAI SYLLABLE WEEN;Lo;0;L;;;;;N;;;;;
+A505;VAI SYLLABLE PEE;Lo;0;L;;;;;N;;;;;
+A506;VAI SYLLABLE BHEE;Lo;0;L;;;;;N;;;;;
+A507;VAI SYLLABLE BEE;Lo;0;L;;;;;N;;;;;
+A508;VAI SYLLABLE MBEE;Lo;0;L;;;;;N;;;;;
+A509;VAI SYLLABLE KPEE;Lo;0;L;;;;;N;;;;;
+A50A;VAI SYLLABLE MGBEE;Lo;0;L;;;;;N;;;;;
+A50B;VAI SYLLABLE GBEE;Lo;0;L;;;;;N;;;;;
+A50C;VAI SYLLABLE FEE;Lo;0;L;;;;;N;;;;;
+A50D;VAI SYLLABLE VEE;Lo;0;L;;;;;N;;;;;
+A50E;VAI SYLLABLE TEE;Lo;0;L;;;;;N;;;;;
+A50F;VAI SYLLABLE THEE;Lo;0;L;;;;;N;;;;;
+A510;VAI SYLLABLE DHEE;Lo;0;L;;;;;N;;;;;
+A511;VAI SYLLABLE DHHEE;Lo;0;L;;;;;N;;;;;
+A512;VAI SYLLABLE LEE;Lo;0;L;;;;;N;;;;;
+A513;VAI SYLLABLE REE;Lo;0;L;;;;;N;;;;;
+A514;VAI SYLLABLE DEE;Lo;0;L;;;;;N;;;;;
+A515;VAI SYLLABLE NDEE;Lo;0;L;;;;;N;;;;;
+A516;VAI SYLLABLE SEE;Lo;0;L;;;;;N;;;;;
+A517;VAI SYLLABLE SHEE;Lo;0;L;;;;;N;;;;;
+A518;VAI SYLLABLE ZEE;Lo;0;L;;;;;N;;;;;
+A519;VAI SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;;
+A51A;VAI SYLLABLE CEE;Lo;0;L;;;;;N;;;;;
+A51B;VAI SYLLABLE JEE;Lo;0;L;;;;;N;;;;;
+A51C;VAI SYLLABLE NJEE;Lo;0;L;;;;;N;;;;;
+A51D;VAI SYLLABLE YEE;Lo;0;L;;;;;N;;;;;
+A51E;VAI SYLLABLE KEE;Lo;0;L;;;;;N;;;;;
+A51F;VAI SYLLABLE NGGEE;Lo;0;L;;;;;N;;;;;
+A520;VAI SYLLABLE GEE;Lo;0;L;;;;;N;;;;;
+A521;VAI SYLLABLE MEE;Lo;0;L;;;;;N;;;;;
+A522;VAI SYLLABLE NEE;Lo;0;L;;;;;N;;;;;
+A523;VAI SYLLABLE NYEE;Lo;0;L;;;;;N;;;;;
+A524;VAI SYLLABLE I;Lo;0;L;;;;;N;;;;;
+A525;VAI SYLLABLE IN;Lo;0;L;;;;;N;;;;;
+A526;VAI SYLLABLE HI;Lo;0;L;;;;;N;;;;;
+A527;VAI SYLLABLE HIN;Lo;0;L;;;;;N;;;;;
+A528;VAI SYLLABLE WI;Lo;0;L;;;;;N;;;;;
+A529;VAI SYLLABLE WIN;Lo;0;L;;;;;N;;;;;
+A52A;VAI SYLLABLE PI;Lo;0;L;;;;;N;;;;;
+A52B;VAI SYLLABLE BHI;Lo;0;L;;;;;N;;;;;
+A52C;VAI SYLLABLE BI;Lo;0;L;;;;;N;;;;;
+A52D;VAI SYLLABLE MBI;Lo;0;L;;;;;N;;;;;
+A52E;VAI SYLLABLE KPI;Lo;0;L;;;;;N;;;;;
+A52F;VAI SYLLABLE MGBI;Lo;0;L;;;;;N;;;;;
+A530;VAI SYLLABLE GBI;Lo;0;L;;;;;N;;;;;
+A531;VAI SYLLABLE FI;Lo;0;L;;;;;N;;;;;
+A532;VAI SYLLABLE VI;Lo;0;L;;;;;N;;;;;
+A533;VAI SYLLABLE TI;Lo;0;L;;;;;N;;;;;
+A534;VAI SYLLABLE THI;Lo;0;L;;;;;N;;;;;
+A535;VAI SYLLABLE DHI;Lo;0;L;;;;;N;;;;;
+A536;VAI SYLLABLE DHHI;Lo;0;L;;;;;N;;;;;
+A537;VAI SYLLABLE LI;Lo;0;L;;;;;N;;;;;
+A538;VAI SYLLABLE RI;Lo;0;L;;;;;N;;;;;
+A539;VAI SYLLABLE DI;Lo;0;L;;;;;N;;;;;
+A53A;VAI SYLLABLE NDI;Lo;0;L;;;;;N;;;;;
+A53B;VAI SYLLABLE SI;Lo;0;L;;;;;N;;;;;
+A53C;VAI SYLLABLE SHI;Lo;0;L;;;;;N;;;;;
+A53D;VAI SYLLABLE ZI;Lo;0;L;;;;;N;;;;;
+A53E;VAI SYLLABLE ZHI;Lo;0;L;;;;;N;;;;;
+A53F;VAI SYLLABLE CI;Lo;0;L;;;;;N;;;;;
+A540;VAI SYLLABLE JI;Lo;0;L;;;;;N;;;;;
+A541;VAI SYLLABLE NJI;Lo;0;L;;;;;N;;;;;
+A542;VAI SYLLABLE YI;Lo;0;L;;;;;N;;;;;
+A543;VAI SYLLABLE KI;Lo;0;L;;;;;N;;;;;
+A544;VAI SYLLABLE NGGI;Lo;0;L;;;;;N;;;;;
+A545;VAI SYLLABLE GI;Lo;0;L;;;;;N;;;;;
+A546;VAI SYLLABLE MI;Lo;0;L;;;;;N;;;;;
+A547;VAI SYLLABLE NI;Lo;0;L;;;;;N;;;;;
+A548;VAI SYLLABLE NYI;Lo;0;L;;;;;N;;;;;
+A549;VAI SYLLABLE A;Lo;0;L;;;;;N;;;;;
+A54A;VAI SYLLABLE AN;Lo;0;L;;;;;N;;;;;
+A54B;VAI SYLLABLE NGAN;Lo;0;L;;;;;N;;;;;
+A54C;VAI SYLLABLE HA;Lo;0;L;;;;;N;;;;;
+A54D;VAI SYLLABLE HAN;Lo;0;L;;;;;N;;;;;
+A54E;VAI SYLLABLE WA;Lo;0;L;;;;;N;;;;;
+A54F;VAI SYLLABLE WAN;Lo;0;L;;;;;N;;;;;
+A550;VAI SYLLABLE PA;Lo;0;L;;;;;N;;;;;
+A551;VAI SYLLABLE BHA;Lo;0;L;;;;;N;;;;;
+A552;VAI SYLLABLE BA;Lo;0;L;;;;;N;;;;;
+A553;VAI SYLLABLE MBA;Lo;0;L;;;;;N;;;;;
+A554;VAI SYLLABLE KPA;Lo;0;L;;;;;N;;;;;
+A555;VAI SYLLABLE KPAN;Lo;0;L;;;;;N;;;;;
+A556;VAI SYLLABLE MGBA;Lo;0;L;;;;;N;;;;;
+A557;VAI SYLLABLE GBA;Lo;0;L;;;;;N;;;;;
+A558;VAI SYLLABLE FA;Lo;0;L;;;;;N;;;;;
+A559;VAI SYLLABLE VA;Lo;0;L;;;;;N;;;;;
+A55A;VAI SYLLABLE TA;Lo;0;L;;;;;N;;;;;
+A55B;VAI SYLLABLE THA;Lo;0;L;;;;;N;;;;;
+A55C;VAI SYLLABLE DHA;Lo;0;L;;;;;N;;;;;
+A55D;VAI SYLLABLE DHHA;Lo;0;L;;;;;N;;;;;
+A55E;VAI SYLLABLE LA;Lo;0;L;;;;;N;;;;;
+A55F;VAI SYLLABLE RA;Lo;0;L;;;;;N;;;;;
+A560;VAI SYLLABLE DA;Lo;0;L;;;;;N;;;;;
+A561;VAI SYLLABLE NDA;Lo;0;L;;;;;N;;;;;
+A562;VAI SYLLABLE SA;Lo;0;L;;;;;N;;;;;
+A563;VAI SYLLABLE SHA;Lo;0;L;;;;;N;;;;;
+A564;VAI SYLLABLE ZA;Lo;0;L;;;;;N;;;;;
+A565;VAI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;;
+A566;VAI SYLLABLE CA;Lo;0;L;;;;;N;;;;;
+A567;VAI SYLLABLE JA;Lo;0;L;;;;;N;;;;;
+A568;VAI SYLLABLE NJA;Lo;0;L;;;;;N;;;;;
+A569;VAI SYLLABLE YA;Lo;0;L;;;;;N;;;;;
+A56A;VAI SYLLABLE KA;Lo;0;L;;;;;N;;;;;
+A56B;VAI SYLLABLE KAN;Lo;0;L;;;;;N;;;;;
+A56C;VAI SYLLABLE NGGA;Lo;0;L;;;;;N;;;;;
+A56D;VAI SYLLABLE GA;Lo;0;L;;;;;N;;;;;
+A56E;VAI SYLLABLE MA;Lo;0;L;;;;;N;;;;;
+A56F;VAI SYLLABLE NA;Lo;0;L;;;;;N;;;;;
+A570;VAI SYLLABLE NYA;Lo;0;L;;;;;N;;;;;
+A571;VAI SYLLABLE OO;Lo;0;L;;;;;N;;;;;
+A572;VAI SYLLABLE OON;Lo;0;L;;;;;N;;;;;
+A573;VAI SYLLABLE HOO;Lo;0;L;;;;;N;;;;;
+A574;VAI SYLLABLE WOO;Lo;0;L;;;;;N;;;;;
+A575;VAI SYLLABLE WOON;Lo;0;L;;;;;N;;;;;
+A576;VAI SYLLABLE POO;Lo;0;L;;;;;N;;;;;
+A577;VAI SYLLABLE BHOO;Lo;0;L;;;;;N;;;;;
+A578;VAI SYLLABLE BOO;Lo;0;L;;;;;N;;;;;
+A579;VAI SYLLABLE MBOO;Lo;0;L;;;;;N;;;;;
+A57A;VAI SYLLABLE KPOO;Lo;0;L;;;;;N;;;;;
+A57B;VAI SYLLABLE MGBOO;Lo;0;L;;;;;N;;;;;
+A57C;VAI SYLLABLE GBOO;Lo;0;L;;;;;N;;;;;
+A57D;VAI SYLLABLE FOO;Lo;0;L;;;;;N;;;;;
+A57E;VAI SYLLABLE VOO;Lo;0;L;;;;;N;;;;;
+A57F;VAI SYLLABLE TOO;Lo;0;L;;;;;N;;;;;
+A580;VAI SYLLABLE THOO;Lo;0;L;;;;;N;;;;;
+A581;VAI SYLLABLE DHOO;Lo;0;L;;;;;N;;;;;
+A582;VAI SYLLABLE DHHOO;Lo;0;L;;;;;N;;;;;
+A583;VAI SYLLABLE LOO;Lo;0;L;;;;;N;;;;;
+A584;VAI SYLLABLE ROO;Lo;0;L;;;;;N;;;;;
+A585;VAI SYLLABLE DOO;Lo;0;L;;;;;N;;;;;
+A586;VAI SYLLABLE NDOO;Lo;0;L;;;;;N;;;;;
+A587;VAI SYLLABLE SOO;Lo;0;L;;;;;N;;;;;
+A588;VAI SYLLABLE SHOO;Lo;0;L;;;;;N;;;;;
+A589;VAI SYLLABLE ZOO;Lo;0;L;;;;;N;;;;;
+A58A;VAI SYLLABLE ZHOO;Lo;0;L;;;;;N;;;;;
+A58B;VAI SYLLABLE COO;Lo;0;L;;;;;N;;;;;
+A58C;VAI SYLLABLE JOO;Lo;0;L;;;;;N;;;;;
+A58D;VAI SYLLABLE NJOO;Lo;0;L;;;;;N;;;;;
+A58E;VAI SYLLABLE YOO;Lo;0;L;;;;;N;;;;;
+A58F;VAI SYLLABLE KOO;Lo;0;L;;;;;N;;;;;
+A590;VAI SYLLABLE NGGOO;Lo;0;L;;;;;N;;;;;
+A591;VAI SYLLABLE GOO;Lo;0;L;;;;;N;;;;;
+A592;VAI SYLLABLE MOO;Lo;0;L;;;;;N;;;;;
+A593;VAI SYLLABLE NOO;Lo;0;L;;;;;N;;;;;
+A594;VAI SYLLABLE NYOO;Lo;0;L;;;;;N;;;;;
+A595;VAI SYLLABLE U;Lo;0;L;;;;;N;;;;;
+A596;VAI SYLLABLE UN;Lo;0;L;;;;;N;;;;;
+A597;VAI SYLLABLE HU;Lo;0;L;;;;;N;;;;;
+A598;VAI SYLLABLE HUN;Lo;0;L;;;;;N;;;;;
+A599;VAI SYLLABLE WU;Lo;0;L;;;;;N;;;;;
+A59A;VAI SYLLABLE WUN;Lo;0;L;;;;;N;;;;;
+A59B;VAI SYLLABLE PU;Lo;0;L;;;;;N;;;;;
+A59C;VAI SYLLABLE BHU;Lo;0;L;;;;;N;;;;;
+A59D;VAI SYLLABLE BU;Lo;0;L;;;;;N;;;;;
+A59E;VAI SYLLABLE MBU;Lo;0;L;;;;;N;;;;;
+A59F;VAI SYLLABLE KPU;Lo;0;L;;;;;N;;;;;
+A5A0;VAI SYLLABLE MGBU;Lo;0;L;;;;;N;;;;;
+A5A1;VAI SYLLABLE GBU;Lo;0;L;;;;;N;;;;;
+A5A2;VAI SYLLABLE FU;Lo;0;L;;;;;N;;;;;
+A5A3;VAI SYLLABLE VU;Lo;0;L;;;;;N;;;;;
+A5A4;VAI SYLLABLE TU;Lo;0;L;;;;;N;;;;;
+A5A5;VAI SYLLABLE THU;Lo;0;L;;;;;N;;;;;
+A5A6;VAI SYLLABLE DHU;Lo;0;L;;;;;N;;;;;
+A5A7;VAI SYLLABLE DHHU;Lo;0;L;;;;;N;;;;;
+A5A8;VAI SYLLABLE LU;Lo;0;L;;;;;N;;;;;
+A5A9;VAI SYLLABLE RU;Lo;0;L;;;;;N;;;;;
+A5AA;VAI SYLLABLE DU;Lo;0;L;;;;;N;;;;;
+A5AB;VAI SYLLABLE NDU;Lo;0;L;;;;;N;;;;;
+A5AC;VAI SYLLABLE SU;Lo;0;L;;;;;N;;;;;
+A5AD;VAI SYLLABLE SHU;Lo;0;L;;;;;N;;;;;
+A5AE;VAI SYLLABLE ZU;Lo;0;L;;;;;N;;;;;
+A5AF;VAI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;;
+A5B0;VAI SYLLABLE CU;Lo;0;L;;;;;N;;;;;
+A5B1;VAI SYLLABLE JU;Lo;0;L;;;;;N;;;;;
+A5B2;VAI SYLLABLE NJU;Lo;0;L;;;;;N;;;;;
+A5B3;VAI SYLLABLE YU;Lo;0;L;;;;;N;;;;;
+A5B4;VAI SYLLABLE KU;Lo;0;L;;;;;N;;;;;
+A5B5;VAI SYLLABLE NGGU;Lo;0;L;;;;;N;;;;;
+A5B6;VAI SYLLABLE GU;Lo;0;L;;;;;N;;;;;
+A5B7;VAI SYLLABLE MU;Lo;0;L;;;;;N;;;;;
+A5B8;VAI SYLLABLE NU;Lo;0;L;;;;;N;;;;;
+A5B9;VAI SYLLABLE NYU;Lo;0;L;;;;;N;;;;;
+A5BA;VAI SYLLABLE O;Lo;0;L;;;;;N;;;;;
+A5BB;VAI SYLLABLE ON;Lo;0;L;;;;;N;;;;;
+A5BC;VAI SYLLABLE NGON;Lo;0;L;;;;;N;;;;;
+A5BD;VAI SYLLABLE HO;Lo;0;L;;;;;N;;;;;
+A5BE;VAI SYLLABLE HON;Lo;0;L;;;;;N;;;;;
+A5BF;VAI SYLLABLE WO;Lo;0;L;;;;;N;;;;;
+A5C0;VAI SYLLABLE WON;Lo;0;L;;;;;N;;;;;
+A5C1;VAI SYLLABLE PO;Lo;0;L;;;;;N;;;;;
+A5C2;VAI SYLLABLE BHO;Lo;0;L;;;;;N;;;;;
+A5C3;VAI SYLLABLE BO;Lo;0;L;;;;;N;;;;;
+A5C4;VAI SYLLABLE MBO;Lo;0;L;;;;;N;;;;;
+A5C5;VAI SYLLABLE KPO;Lo;0;L;;;;;N;;;;;
+A5C6;VAI SYLLABLE MGBO;Lo;0;L;;;;;N;;;;;
+A5C7;VAI SYLLABLE GBO;Lo;0;L;;;;;N;;;;;
+A5C8;VAI SYLLABLE GBON;Lo;0;L;;;;;N;;;;;
+A5C9;VAI SYLLABLE FO;Lo;0;L;;;;;N;;;;;
+A5CA;VAI SYLLABLE VO;Lo;0;L;;;;;N;;;;;
+A5CB;VAI SYLLABLE TO;Lo;0;L;;;;;N;;;;;
+A5CC;VAI SYLLABLE THO;Lo;0;L;;;;;N;;;;;
+A5CD;VAI SYLLABLE DHO;Lo;0;L;;;;;N;;;;;
+A5CE;VAI SYLLABLE DHHO;Lo;0;L;;;;;N;;;;;
+A5CF;VAI SYLLABLE LO;Lo;0;L;;;;;N;;;;;
+A5D0;VAI SYLLABLE RO;Lo;0;L;;;;;N;;;;;
+A5D1;VAI SYLLABLE DO;Lo;0;L;;;;;N;;;;;
+A5D2;VAI SYLLABLE NDO;Lo;0;L;;;;;N;;;;;
+A5D3;VAI SYLLABLE SO;Lo;0;L;;;;;N;;;;;
+A5D4;VAI SYLLABLE SHO;Lo;0;L;;;;;N;;;;;
+A5D5;VAI SYLLABLE ZO;Lo;0;L;;;;;N;;;;;
+A5D6;VAI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;;
+A5D7;VAI SYLLABLE CO;Lo;0;L;;;;;N;;;;;
+A5D8;VAI SYLLABLE JO;Lo;0;L;;;;;N;;;;;
+A5D9;VAI SYLLABLE NJO;Lo;0;L;;;;;N;;;;;
+A5DA;VAI SYLLABLE YO;Lo;0;L;;;;;N;;;;;
+A5DB;VAI SYLLABLE KO;Lo;0;L;;;;;N;;;;;
+A5DC;VAI SYLLABLE NGGO;Lo;0;L;;;;;N;;;;;
+A5DD;VAI SYLLABLE GO;Lo;0;L;;;;;N;;;;;
+A5DE;VAI SYLLABLE MO;Lo;0;L;;;;;N;;;;;
+A5DF;VAI SYLLABLE NO;Lo;0;L;;;;;N;;;;;
+A5E0;VAI SYLLABLE NYO;Lo;0;L;;;;;N;;;;;
+A5E1;VAI SYLLABLE E;Lo;0;L;;;;;N;;;;;
+A5E2;VAI SYLLABLE EN;Lo;0;L;;;;;N;;;;;
+A5E3;VAI SYLLABLE NGEN;Lo;0;L;;;;;N;;;;;
+A5E4;VAI SYLLABLE HE;Lo;0;L;;;;;N;;;;;
+A5E5;VAI SYLLABLE HEN;Lo;0;L;;;;;N;;;;;
+A5E6;VAI SYLLABLE WE;Lo;0;L;;;;;N;;;;;
+A5E7;VAI SYLLABLE WEN;Lo;0;L;;;;;N;;;;;
+A5E8;VAI SYLLABLE PE;Lo;0;L;;;;;N;;;;;
+A5E9;VAI SYLLABLE BHE;Lo;0;L;;;;;N;;;;;
+A5EA;VAI SYLLABLE BE;Lo;0;L;;;;;N;;;;;
+A5EB;VAI SYLLABLE MBE;Lo;0;L;;;;;N;;;;;
+A5EC;VAI SYLLABLE KPE;Lo;0;L;;;;;N;;;;;
+A5ED;VAI SYLLABLE KPEN;Lo;0;L;;;;;N;;;;;
+A5EE;VAI SYLLABLE MGBE;Lo;0;L;;;;;N;;;;;
+A5EF;VAI SYLLABLE GBE;Lo;0;L;;;;;N;;;;;
+A5F0;VAI SYLLABLE GBEN;Lo;0;L;;;;;N;;;;;
+A5F1;VAI SYLLABLE FE;Lo;0;L;;;;;N;;;;;
+A5F2;VAI SYLLABLE VE;Lo;0;L;;;;;N;;;;;
+A5F3;VAI SYLLABLE TE;Lo;0;L;;;;;N;;;;;
+A5F4;VAI SYLLABLE THE;Lo;0;L;;;;;N;;;;;
+A5F5;VAI SYLLABLE DHE;Lo;0;L;;;;;N;;;;;
+A5F6;VAI SYLLABLE DHHE;Lo;0;L;;;;;N;;;;;
+A5F7;VAI SYLLABLE LE;Lo;0;L;;;;;N;;;;;
+A5F8;VAI SYLLABLE RE;Lo;0;L;;;;;N;;;;;
+A5F9;VAI SYLLABLE DE;Lo;0;L;;;;;N;;;;;
+A5FA;VAI SYLLABLE NDE;Lo;0;L;;;;;N;;;;;
+A5FB;VAI SYLLABLE SE;Lo;0;L;;;;;N;;;;;
+A5FC;VAI SYLLABLE SHE;Lo;0;L;;;;;N;;;;;
+A5FD;VAI SYLLABLE ZE;Lo;0;L;;;;;N;;;;;
+A5FE;VAI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;;
+A5FF;VAI SYLLABLE CE;Lo;0;L;;;;;N;;;;;
+A600;VAI SYLLABLE JE;Lo;0;L;;;;;N;;;;;
+A601;VAI SYLLABLE NJE;Lo;0;L;;;;;N;;;;;
+A602;VAI SYLLABLE YE;Lo;0;L;;;;;N;;;;;
+A603;VAI SYLLABLE KE;Lo;0;L;;;;;N;;;;;
+A604;VAI SYLLABLE NGGE;Lo;0;L;;;;;N;;;;;
+A605;VAI SYLLABLE NGGEN;Lo;0;L;;;;;N;;;;;
+A606;VAI SYLLABLE GE;Lo;0;L;;;;;N;;;;;
+A607;VAI SYLLABLE GEN;Lo;0;L;;;;;N;;;;;
+A608;VAI SYLLABLE ME;Lo;0;L;;;;;N;;;;;
+A609;VAI SYLLABLE NE;Lo;0;L;;;;;N;;;;;
+A60A;VAI SYLLABLE NYE;Lo;0;L;;;;;N;;;;;
+A60B;VAI SYLLABLE NG;Lo;0;L;;;;;N;;;;;
+A60C;VAI SYLLABLE LENGTHENER;Lm;0;L;;;;;N;;;;;
+A60D;VAI COMMA;Po;0;ON;;;;;N;;;;;
+A60E;VAI FULL STOP;Po;0;ON;;;;;N;;;;;
+A60F;VAI QUESTION MARK;Po;0;ON;;;;;N;;;;;
+A610;VAI SYLLABLE NDOLE FA;Lo;0;L;;;;;N;;;;;
+A611;VAI SYLLABLE NDOLE KA;Lo;0;L;;;;;N;;;;;
+A612;VAI SYLLABLE NDOLE SOO;Lo;0;L;;;;;N;;;;;
+A613;VAI SYMBOL FEENG;Lo;0;L;;;;;N;;;;;
+A614;VAI SYMBOL KEENG;Lo;0;L;;;;;N;;;;;
+A615;VAI SYMBOL TING;Lo;0;L;;;;;N;;;;;
+A616;VAI SYMBOL NII;Lo;0;L;;;;;N;;;;;
+A617;VAI SYMBOL BANG;Lo;0;L;;;;;N;;;;;
+A618;VAI SYMBOL FAA;Lo;0;L;;;;;N;;;;;
+A619;VAI SYMBOL TAA;Lo;0;L;;;;;N;;;;;
+A61A;VAI SYMBOL DANG;Lo;0;L;;;;;N;;;;;
+A61B;VAI SYMBOL DOONG;Lo;0;L;;;;;N;;;;;
+A61C;VAI SYMBOL KUNG;Lo;0;L;;;;;N;;;;;
+A61D;VAI SYMBOL TONG;Lo;0;L;;;;;N;;;;;
+A61E;VAI SYMBOL DO-O;Lo;0;L;;;;;N;;;;;
+A61F;VAI SYMBOL JONG;Lo;0;L;;;;;N;;;;;
+A620;VAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+A621;VAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+A622;VAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+A623;VAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+A624;VAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+A625;VAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+A626;VAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+A627;VAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+A628;VAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+A629;VAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+A62A;VAI SYLLABLE NDOLE MA;Lo;0;L;;;;;N;;;;;
+A62B;VAI SYLLABLE NDOLE DO;Lo;0;L;;;;;N;;;;;
+A640;CYRILLIC CAPITAL LETTER ZEMLYA;Lu;0;L;;;;;N;;;;A641;
+A641;CYRILLIC SMALL LETTER ZEMLYA;Ll;0;L;;;;;N;;;A640;;A640
+A642;CYRILLIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;A643;
+A643;CYRILLIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;A642;;A642
+A644;CYRILLIC CAPITAL LETTER REVERSED DZE;Lu;0;L;;;;;N;;;;A645;
+A645;CYRILLIC SMALL LETTER REVERSED DZE;Ll;0;L;;;;;N;;;A644;;A644
+A646;CYRILLIC CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;A647;
+A647;CYRILLIC SMALL LETTER IOTA;Ll;0;L;;;;;N;;;A646;;A646
+A648;CYRILLIC CAPITAL LETTER DJERV;Lu;0;L;;;;;N;;;;A649;
+A649;CYRILLIC SMALL LETTER DJERV;Ll;0;L;;;;;N;;;A648;;A648
+A64A;CYRILLIC CAPITAL LETTER MONOGRAPH UK;Lu;0;L;;;;;N;;;;A64B;
+A64B;CYRILLIC SMALL LETTER MONOGRAPH UK;Ll;0;L;;;;;N;;;A64A;;A64A
+A64C;CYRILLIC CAPITAL LETTER BROAD OMEGA;Lu;0;L;;;;;N;;;;A64D;
+A64D;CYRILLIC SMALL LETTER BROAD OMEGA;Ll;0;L;;;;;N;;;A64C;;A64C
+A64E;CYRILLIC CAPITAL LETTER NEUTRAL YER;Lu;0;L;;;;;N;;;;A64F;
+A64F;CYRILLIC SMALL LETTER NEUTRAL YER;Ll;0;L;;;;;N;;;A64E;;A64E
+A650;CYRILLIC CAPITAL LETTER YERU WITH BACK YER;Lu;0;L;;;;;N;;;;A651;
+A651;CYRILLIC SMALL LETTER YERU WITH BACK YER;Ll;0;L;;;;;N;;;A650;;A650
+A652;CYRILLIC CAPITAL LETTER IOTIFIED YAT;Lu;0;L;;;;;N;;;;A653;
+A653;CYRILLIC SMALL LETTER IOTIFIED YAT;Ll;0;L;;;;;N;;;A652;;A652
+A654;CYRILLIC CAPITAL LETTER REVERSED YU;Lu;0;L;;;;;N;;;;A655;
+A655;CYRILLIC SMALL LETTER REVERSED YU;Ll;0;L;;;;;N;;;A654;;A654
+A656;CYRILLIC CAPITAL LETTER IOTIFIED A;Lu;0;L;;;;;N;;;;A657;
+A657;CYRILLIC SMALL LETTER IOTIFIED A;Ll;0;L;;;;;N;;;A656;;A656
+A658;CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A659;
+A659;CYRILLIC SMALL LETTER CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A658;;A658
+A65A;CYRILLIC CAPITAL LETTER BLENDED YUS;Lu;0;L;;;;;N;;;;A65B;
+A65B;CYRILLIC SMALL LETTER BLENDED YUS;Ll;0;L;;;;;N;;;A65A;;A65A
+A65C;CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A65D;
+A65D;CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A65C;;A65C
+A65E;CYRILLIC CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;A65F;
+A65F;CYRILLIC SMALL LETTER YN;Ll;0;L;;;;;N;;;A65E;;A65E
+A660;CYRILLIC CAPITAL LETTER REVERSED TSE;Lu;0;L;;;;;N;;;;A661;
+A661;CYRILLIC SMALL LETTER REVERSED TSE;Ll;0;L;;;;;N;;;A660;;A660
+A662;CYRILLIC CAPITAL LETTER SOFT DE;Lu;0;L;;;;;N;;;;A663;
+A663;CYRILLIC SMALL LETTER SOFT DE;Ll;0;L;;;;;N;;;A662;;A662
+A664;CYRILLIC CAPITAL LETTER SOFT EL;Lu;0;L;;;;;N;;;;A665;
+A665;CYRILLIC SMALL LETTER SOFT EL;Ll;0;L;;;;;N;;;A664;;A664
+A666;CYRILLIC CAPITAL LETTER SOFT EM;Lu;0;L;;;;;N;;;;A667;
+A667;CYRILLIC SMALL LETTER SOFT EM;Ll;0;L;;;;;N;;;A666;;A666
+A668;CYRILLIC CAPITAL LETTER MONOCULAR O;Lu;0;L;;;;;N;;;;A669;
+A669;CYRILLIC SMALL LETTER MONOCULAR O;Ll;0;L;;;;;N;;;A668;;A668
+A66A;CYRILLIC CAPITAL LETTER BINOCULAR O;Lu;0;L;;;;;N;;;;A66B;
+A66B;CYRILLIC SMALL LETTER BINOCULAR O;Ll;0;L;;;;;N;;;A66A;;A66A
+A66C;CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O;Lu;0;L;;;;;N;;;;A66D;
+A66D;CYRILLIC SMALL LETTER DOUBLE MONOCULAR O;Ll;0;L;;;;;N;;;A66C;;A66C
+A66E;CYRILLIC LETTER MULTIOCULAR O;Lo;0;L;;;;;N;;;;;
+A66F;COMBINING CYRILLIC VZMET;Mn;230;NSM;;;;;N;;;;;
+A670;COMBINING CYRILLIC TEN MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+A671;COMBINING CYRILLIC HUNDRED MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+A672;COMBINING CYRILLIC THOUSAND MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+A673;SLAVONIC ASTERISK;Po;0;ON;;;;;N;;;;;
+A674;COMBINING CYRILLIC LETTER UKRAINIAN IE;Mn;230;NSM;;;;;N;;;;;
+A675;COMBINING CYRILLIC LETTER I;Mn;230;NSM;;;;;N;;;;;
+A676;COMBINING CYRILLIC LETTER YI;Mn;230;NSM;;;;;N;;;;;
+A677;COMBINING CYRILLIC LETTER U;Mn;230;NSM;;;;;N;;;;;
+A678;COMBINING CYRILLIC LETTER HARD SIGN;Mn;230;NSM;;;;;N;;;;;
+A679;COMBINING CYRILLIC LETTER YERU;Mn;230;NSM;;;;;N;;;;;
+A67A;COMBINING CYRILLIC LETTER SOFT SIGN;Mn;230;NSM;;;;;N;;;;;
+A67B;COMBINING CYRILLIC LETTER OMEGA;Mn;230;NSM;;;;;N;;;;;
+A67C;COMBINING CYRILLIC KAVYKA;Mn;230;NSM;;;;;N;;;;;
+A67D;COMBINING CYRILLIC PAYEROK;Mn;230;NSM;;;;;N;;;;;
+A67E;CYRILLIC KAVYKA;Po;0;ON;;;;;N;;;;;
+A67F;CYRILLIC PAYEROK;Lm;0;ON;;;;;N;;;;;
+A680;CYRILLIC CAPITAL LETTER DWE;Lu;0;L;;;;;N;;;;A681;
+A681;CYRILLIC SMALL LETTER DWE;Ll;0;L;;;;;N;;;A680;;A680
+A682;CYRILLIC CAPITAL LETTER DZWE;Lu;0;L;;;;;N;;;;A683;
+A683;CYRILLIC SMALL LETTER DZWE;Ll;0;L;;;;;N;;;A682;;A682
+A684;CYRILLIC CAPITAL LETTER ZHWE;Lu;0;L;;;;;N;;;;A685;
+A685;CYRILLIC SMALL LETTER ZHWE;Ll;0;L;;;;;N;;;A684;;A684
+A686;CYRILLIC CAPITAL LETTER CCHE;Lu;0;L;;;;;N;;;;A687;
+A687;CYRILLIC SMALL LETTER CCHE;Ll;0;L;;;;;N;;;A686;;A686
+A688;CYRILLIC CAPITAL LETTER DZZE;Lu;0;L;;;;;N;;;;A689;
+A689;CYRILLIC SMALL LETTER DZZE;Ll;0;L;;;;;N;;;A688;;A688
+A68A;CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;A68B;
+A68B;CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;A68A;;A68A
+A68C;CYRILLIC CAPITAL LETTER TWE;Lu;0;L;;;;;N;;;;A68D;
+A68D;CYRILLIC SMALL LETTER TWE;Ll;0;L;;;;;N;;;A68C;;A68C
+A68E;CYRILLIC CAPITAL LETTER TSWE;Lu;0;L;;;;;N;;;;A68F;
+A68F;CYRILLIC SMALL LETTER TSWE;Ll;0;L;;;;;N;;;A68E;;A68E
+A690;CYRILLIC CAPITAL LETTER TSSE;Lu;0;L;;;;;N;;;;A691;
+A691;CYRILLIC SMALL LETTER TSSE;Ll;0;L;;;;;N;;;A690;;A690
+A692;CYRILLIC CAPITAL LETTER TCHE;Lu;0;L;;;;;N;;;;A693;
+A693;CYRILLIC SMALL LETTER TCHE;Ll;0;L;;;;;N;;;A692;;A692
+A694;CYRILLIC CAPITAL LETTER HWE;Lu;0;L;;;;;N;;;;A695;
+A695;CYRILLIC SMALL LETTER HWE;Ll;0;L;;;;;N;;;A694;;A694
+A696;CYRILLIC CAPITAL LETTER SHWE;Lu;0;L;;;;;N;;;;A697;
+A697;CYRILLIC SMALL LETTER SHWE;Ll;0;L;;;;;N;;;A696;;A696
+A698;CYRILLIC CAPITAL LETTER DOUBLE O;Lu;0;L;;;;;N;;;;A699;
+A699;CYRILLIC SMALL LETTER DOUBLE O;Ll;0;L;;;;;N;;;A698;;A698
+A69A;CYRILLIC CAPITAL LETTER CROSSED O;Lu;0;L;;;;;N;;;;A69B;
+A69B;CYRILLIC SMALL LETTER CROSSED O;Ll;0;L;;;;;N;;;A69A;;A69A
+A69C;MODIFIER LETTER CYRILLIC HARD SIGN;Lm;0;L;<super> 044A;;;;N;;;;;
+A69D;MODIFIER LETTER CYRILLIC SOFT SIGN;Lm;0;L;<super> 044C;;;;N;;;;;
+A69E;COMBINING CYRILLIC LETTER EF;Mn;230;NSM;;;;;N;;;;;
+A69F;COMBINING CYRILLIC LETTER IOTIFIED E;Mn;230;NSM;;;;;N;;;;;
+A6A0;BAMUM LETTER A;Lo;0;L;;;;;N;;;;;
+A6A1;BAMUM LETTER KA;Lo;0;L;;;;;N;;;;;
+A6A2;BAMUM LETTER U;Lo;0;L;;;;;N;;;;;
+A6A3;BAMUM LETTER KU;Lo;0;L;;;;;N;;;;;
+A6A4;BAMUM LETTER EE;Lo;0;L;;;;;N;;;;;
+A6A5;BAMUM LETTER REE;Lo;0;L;;;;;N;;;;;
+A6A6;BAMUM LETTER TAE;Lo;0;L;;;;;N;;;;;
+A6A7;BAMUM LETTER O;Lo;0;L;;;;;N;;;;;
+A6A8;BAMUM LETTER NYI;Lo;0;L;;;;;N;;;;;
+A6A9;BAMUM LETTER I;Lo;0;L;;;;;N;;;;;
+A6AA;BAMUM LETTER LA;Lo;0;L;;;;;N;;;;;
+A6AB;BAMUM LETTER PA;Lo;0;L;;;;;N;;;;;
+A6AC;BAMUM LETTER RII;Lo;0;L;;;;;N;;;;;
+A6AD;BAMUM LETTER RIEE;Lo;0;L;;;;;N;;;;;
+A6AE;BAMUM LETTER LEEEE;Lo;0;L;;;;;N;;;;;
+A6AF;BAMUM LETTER MEEEE;Lo;0;L;;;;;N;;;;;
+A6B0;BAMUM LETTER TAA;Lo;0;L;;;;;N;;;;;
+A6B1;BAMUM LETTER NDAA;Lo;0;L;;;;;N;;;;;
+A6B2;BAMUM LETTER NJAEM;Lo;0;L;;;;;N;;;;;
+A6B3;BAMUM LETTER M;Lo;0;L;;;;;N;;;;;
+A6B4;BAMUM LETTER SUU;Lo;0;L;;;;;N;;;;;
+A6B5;BAMUM LETTER MU;Lo;0;L;;;;;N;;;;;
+A6B6;BAMUM LETTER SHII;Lo;0;L;;;;;N;;;;;
+A6B7;BAMUM LETTER SI;Lo;0;L;;;;;N;;;;;
+A6B8;BAMUM LETTER SHEUX;Lo;0;L;;;;;N;;;;;
+A6B9;BAMUM LETTER SEUX;Lo;0;L;;;;;N;;;;;
+A6BA;BAMUM LETTER KYEE;Lo;0;L;;;;;N;;;;;
+A6BB;BAMUM LETTER KET;Lo;0;L;;;;;N;;;;;
+A6BC;BAMUM LETTER NUAE;Lo;0;L;;;;;N;;;;;
+A6BD;BAMUM LETTER NU;Lo;0;L;;;;;N;;;;;
+A6BE;BAMUM LETTER NJUAE;Lo;0;L;;;;;N;;;;;
+A6BF;BAMUM LETTER YOQ;Lo;0;L;;;;;N;;;;;
+A6C0;BAMUM LETTER SHU;Lo;0;L;;;;;N;;;;;
+A6C1;BAMUM LETTER YUQ;Lo;0;L;;;;;N;;;;;
+A6C2;BAMUM LETTER YA;Lo;0;L;;;;;N;;;;;
+A6C3;BAMUM LETTER NSHA;Lo;0;L;;;;;N;;;;;
+A6C4;BAMUM LETTER KEUX;Lo;0;L;;;;;N;;;;;
+A6C5;BAMUM LETTER PEUX;Lo;0;L;;;;;N;;;;;
+A6C6;BAMUM LETTER NJEE;Lo;0;L;;;;;N;;;;;
+A6C7;BAMUM LETTER NTEE;Lo;0;L;;;;;N;;;;;
+A6C8;BAMUM LETTER PUE;Lo;0;L;;;;;N;;;;;
+A6C9;BAMUM LETTER WUE;Lo;0;L;;;;;N;;;;;
+A6CA;BAMUM LETTER PEE;Lo;0;L;;;;;N;;;;;
+A6CB;BAMUM LETTER FEE;Lo;0;L;;;;;N;;;;;
+A6CC;BAMUM LETTER RU;Lo;0;L;;;;;N;;;;;
+A6CD;BAMUM LETTER LU;Lo;0;L;;;;;N;;;;;
+A6CE;BAMUM LETTER MI;Lo;0;L;;;;;N;;;;;
+A6CF;BAMUM LETTER NI;Lo;0;L;;;;;N;;;;;
+A6D0;BAMUM LETTER REUX;Lo;0;L;;;;;N;;;;;
+A6D1;BAMUM LETTER RAE;Lo;0;L;;;;;N;;;;;
+A6D2;BAMUM LETTER KEN;Lo;0;L;;;;;N;;;;;
+A6D3;BAMUM LETTER NGKWAEN;Lo;0;L;;;;;N;;;;;
+A6D4;BAMUM LETTER NGGA;Lo;0;L;;;;;N;;;;;
+A6D5;BAMUM LETTER NGA;Lo;0;L;;;;;N;;;;;
+A6D6;BAMUM LETTER SHO;Lo;0;L;;;;;N;;;;;
+A6D7;BAMUM LETTER PUAE;Lo;0;L;;;;;N;;;;;
+A6D8;BAMUM LETTER FU;Lo;0;L;;;;;N;;;;;
+A6D9;BAMUM LETTER FOM;Lo;0;L;;;;;N;;;;;
+A6DA;BAMUM LETTER WA;Lo;0;L;;;;;N;;;;;
+A6DB;BAMUM LETTER NA;Lo;0;L;;;;;N;;;;;
+A6DC;BAMUM LETTER LI;Lo;0;L;;;;;N;;;;;
+A6DD;BAMUM LETTER PI;Lo;0;L;;;;;N;;;;;
+A6DE;BAMUM LETTER LOQ;Lo;0;L;;;;;N;;;;;
+A6DF;BAMUM LETTER KO;Lo;0;L;;;;;N;;;;;
+A6E0;BAMUM LETTER MBEN;Lo;0;L;;;;;N;;;;;
+A6E1;BAMUM LETTER REN;Lo;0;L;;;;;N;;;;;
+A6E2;BAMUM LETTER MEN;Lo;0;L;;;;;N;;;;;
+A6E3;BAMUM LETTER MA;Lo;0;L;;;;;N;;;;;
+A6E4;BAMUM LETTER TI;Lo;0;L;;;;;N;;;;;
+A6E5;BAMUM LETTER KI;Lo;0;L;;;;;N;;;;;
+A6E6;BAMUM LETTER MO;Nl;0;L;;;;1;N;;;;;
+A6E7;BAMUM LETTER MBAA;Nl;0;L;;;;2;N;;;;;
+A6E8;BAMUM LETTER TET;Nl;0;L;;;;3;N;;;;;
+A6E9;BAMUM LETTER KPA;Nl;0;L;;;;4;N;;;;;
+A6EA;BAMUM LETTER TEN;Nl;0;L;;;;5;N;;;;;
+A6EB;BAMUM LETTER NTUU;Nl;0;L;;;;6;N;;;;;
+A6EC;BAMUM LETTER SAMBA;Nl;0;L;;;;7;N;;;;;
+A6ED;BAMUM LETTER FAAMAE;Nl;0;L;;;;8;N;;;;;
+A6EE;BAMUM LETTER KOVUU;Nl;0;L;;;;9;N;;;;;
+A6EF;BAMUM LETTER KOGHOM;Nl;0;L;;;;0;N;;;;;
+A6F0;BAMUM COMBINING MARK KOQNDON;Mn;230;NSM;;;;;N;;;;;
+A6F1;BAMUM COMBINING MARK TUKWENTIS;Mn;230;NSM;;;;;N;;;;;
+A6F2;BAMUM NJAEMLI;Po;0;L;;;;;N;;;;;
+A6F3;BAMUM FULL STOP;Po;0;L;;;;;N;;;;;
+A6F4;BAMUM COLON;Po;0;L;;;;;N;;;;;
+A6F5;BAMUM COMMA;Po;0;L;;;;;N;;;;;
+A6F6;BAMUM SEMICOLON;Po;0;L;;;;;N;;;;;
+A6F7;BAMUM QUESTION MARK;Po;0;L;;;;;N;;;;;
+A700;MODIFIER LETTER CHINESE TONE YIN PING;Sk;0;ON;;;;;N;;;;;
+A701;MODIFIER LETTER CHINESE TONE YANG PING;Sk;0;ON;;;;;N;;;;;
+A702;MODIFIER LETTER CHINESE TONE YIN SHANG;Sk;0;ON;;;;;N;;;;;
+A703;MODIFIER LETTER CHINESE TONE YANG SHANG;Sk;0;ON;;;;;N;;;;;
+A704;MODIFIER LETTER CHINESE TONE YIN QU;Sk;0;ON;;;;;N;;;;;
+A705;MODIFIER LETTER CHINESE TONE YANG QU;Sk;0;ON;;;;;N;;;;;
+A706;MODIFIER LETTER CHINESE TONE YIN RU;Sk;0;ON;;;;;N;;;;;
+A707;MODIFIER LETTER CHINESE TONE YANG RU;Sk;0;ON;;;;;N;;;;;
+A708;MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A709;MODIFIER LETTER HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70A;MODIFIER LETTER MID DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70B;MODIFIER LETTER LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70C;MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70D;MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70E;MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70F;MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A710;MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A711;MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A712;MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A713;MODIFIER LETTER HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A714;MODIFIER LETTER MID LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A715;MODIFIER LETTER LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A716;MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A717;MODIFIER LETTER DOT VERTICAL BAR;Lm;0;ON;;;;;N;;;;;
+A718;MODIFIER LETTER DOT SLASH;Lm;0;ON;;;;;N;;;;;
+A719;MODIFIER LETTER DOT HORIZONTAL BAR;Lm;0;ON;;;;;N;;;;;
+A71A;MODIFIER LETTER LOWER RIGHT CORNER ANGLE;Lm;0;ON;;;;;N;;;;;
+A71B;MODIFIER LETTER RAISED UP ARROW;Lm;0;ON;;;;;N;;;;;
+A71C;MODIFIER LETTER RAISED DOWN ARROW;Lm;0;ON;;;;;N;;;;;
+A71D;MODIFIER LETTER RAISED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;;
+A71E;MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;;
+A71F;MODIFIER LETTER LOW INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;;
+A720;MODIFIER LETTER STRESS AND HIGH TONE;Sk;0;ON;;;;;N;;;;;
+A721;MODIFIER LETTER STRESS AND LOW TONE;Sk;0;ON;;;;;N;;;;;
+A722;LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF;Lu;0;L;;;;;N;;;;A723;
+A723;LATIN SMALL LETTER EGYPTOLOGICAL ALEF;Ll;0;L;;;;;N;;;A722;;A722
+A724;LATIN CAPITAL LETTER EGYPTOLOGICAL AIN;Lu;0;L;;;;;N;;;;A725;
+A725;LATIN SMALL LETTER EGYPTOLOGICAL AIN;Ll;0;L;;;;;N;;;A724;;A724
+A726;LATIN CAPITAL LETTER HENG;Lu;0;L;;;;;N;;;;A727;
+A727;LATIN SMALL LETTER HENG;Ll;0;L;;;;;N;;;A726;;A726
+A728;LATIN CAPITAL LETTER TZ;Lu;0;L;;;;;N;;;;A729;
+A729;LATIN SMALL LETTER TZ;Ll;0;L;;;;;N;;;A728;;A728
+A72A;LATIN CAPITAL LETTER TRESILLO;Lu;0;L;;;;;N;;;;A72B;
+A72B;LATIN SMALL LETTER TRESILLO;Ll;0;L;;;;;N;;;A72A;;A72A
+A72C;LATIN CAPITAL LETTER CUATRILLO;Lu;0;L;;;;;N;;;;A72D;
+A72D;LATIN SMALL LETTER CUATRILLO;Ll;0;L;;;;;N;;;A72C;;A72C
+A72E;LATIN CAPITAL LETTER CUATRILLO WITH COMMA;Lu;0;L;;;;;N;;;;A72F;
+A72F;LATIN SMALL LETTER CUATRILLO WITH COMMA;Ll;0;L;;;;;N;;;A72E;;A72E
+A730;LATIN LETTER SMALL CAPITAL F;Ll;0;L;;;;;N;;;;;
+A731;LATIN LETTER SMALL CAPITAL S;Ll;0;L;;;;;N;;;;;
+A732;LATIN CAPITAL LETTER AA;Lu;0;L;;;;;N;;;;A733;
+A733;LATIN SMALL LETTER AA;Ll;0;L;;;;;N;;;A732;;A732
+A734;LATIN CAPITAL LETTER AO;Lu;0;L;;;;;N;;;;A735;
+A735;LATIN SMALL LETTER AO;Ll;0;L;;;;;N;;;A734;;A734
+A736;LATIN CAPITAL LETTER AU;Lu;0;L;;;;;N;;;;A737;
+A737;LATIN SMALL LETTER AU;Ll;0;L;;;;;N;;;A736;;A736
+A738;LATIN CAPITAL LETTER AV;Lu;0;L;;;;;N;;;;A739;
+A739;LATIN SMALL LETTER AV;Ll;0;L;;;;;N;;;A738;;A738
+A73A;LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR;Lu;0;L;;;;;N;;;;A73B;
+A73B;LATIN SMALL LETTER AV WITH HORIZONTAL BAR;Ll;0;L;;;;;N;;;A73A;;A73A
+A73C;LATIN CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;A73D;
+A73D;LATIN SMALL LETTER AY;Ll;0;L;;;;;N;;;A73C;;A73C
+A73E;LATIN CAPITAL LETTER REVERSED C WITH DOT;Lu;0;L;;;;;N;;;;A73F;
+A73F;LATIN SMALL LETTER REVERSED C WITH DOT;Ll;0;L;;;;;N;;;A73E;;A73E
+A740;LATIN CAPITAL LETTER K WITH STROKE;Lu;0;L;;;;;N;;;;A741;
+A741;LATIN SMALL LETTER K WITH STROKE;Ll;0;L;;;;;N;;;A740;;A740
+A742;LATIN CAPITAL LETTER K WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A743;
+A743;LATIN SMALL LETTER K WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A742;;A742
+A744;LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A745;
+A745;LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE;Ll;0;L;;;;;N;;;A744;;A744
+A746;LATIN CAPITAL LETTER BROKEN L;Lu;0;L;;;;;N;;;;A747;
+A747;LATIN SMALL LETTER BROKEN L;Ll;0;L;;;;;N;;;A746;;A746
+A748;LATIN CAPITAL LETTER L WITH HIGH STROKE;Lu;0;L;;;;;N;;;;A749;
+A749;LATIN SMALL LETTER L WITH HIGH STROKE;Ll;0;L;;;;;N;;;A748;;A748
+A74A;LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY;Lu;0;L;;;;;N;;;;A74B;
+A74B;LATIN SMALL LETTER O WITH LONG STROKE OVERLAY;Ll;0;L;;;;;N;;;A74A;;A74A
+A74C;LATIN CAPITAL LETTER O WITH LOOP;Lu;0;L;;;;;N;;;;A74D;
+A74D;LATIN SMALL LETTER O WITH LOOP;Ll;0;L;;;;;N;;;A74C;;A74C
+A74E;LATIN CAPITAL LETTER OO;Lu;0;L;;;;;N;;;;A74F;
+A74F;LATIN SMALL LETTER OO;Ll;0;L;;;;;N;;;A74E;;A74E
+A750;LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A751;
+A751;LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A750;;A750
+A752;LATIN CAPITAL LETTER P WITH FLOURISH;Lu;0;L;;;;;N;;;;A753;
+A753;LATIN SMALL LETTER P WITH FLOURISH;Ll;0;L;;;;;N;;;A752;;A752
+A754;LATIN CAPITAL LETTER P WITH SQUIRREL TAIL;Lu;0;L;;;;;N;;;;A755;
+A755;LATIN SMALL LETTER P WITH SQUIRREL TAIL;Ll;0;L;;;;;N;;;A754;;A754
+A756;LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A757;
+A757;LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A756;;A756
+A758;LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A759;
+A759;LATIN SMALL LETTER Q WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A758;;A758
+A75A;LATIN CAPITAL LETTER R ROTUNDA;Lu;0;L;;;;;N;;;;A75B;
+A75B;LATIN SMALL LETTER R ROTUNDA;Ll;0;L;;;;;N;;;A75A;;A75A
+A75C;LATIN CAPITAL LETTER RUM ROTUNDA;Lu;0;L;;;;;N;;;;A75D;
+A75D;LATIN SMALL LETTER RUM ROTUNDA;Ll;0;L;;;;;N;;;A75C;;A75C
+A75E;LATIN CAPITAL LETTER V WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A75F;
+A75F;LATIN SMALL LETTER V WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A75E;;A75E
+A760;LATIN CAPITAL LETTER VY;Lu;0;L;;;;;N;;;;A761;
+A761;LATIN SMALL LETTER VY;Ll;0;L;;;;;N;;;A760;;A760
+A762;LATIN CAPITAL LETTER VISIGOTHIC Z;Lu;0;L;;;;;N;;;;A763;
+A763;LATIN SMALL LETTER VISIGOTHIC Z;Ll;0;L;;;;;N;;;A762;;A762
+A764;LATIN CAPITAL LETTER THORN WITH STROKE;Lu;0;L;;;;;N;;;;A765;
+A765;LATIN SMALL LETTER THORN WITH STROKE;Ll;0;L;;;;;N;;;A764;;A764
+A766;LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A767;
+A767;LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A766;;A766
+A768;LATIN CAPITAL LETTER VEND;Lu;0;L;;;;;N;;;;A769;
+A769;LATIN SMALL LETTER VEND;Ll;0;L;;;;;N;;;A768;;A768
+A76A;LATIN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;A76B;
+A76B;LATIN SMALL LETTER ET;Ll;0;L;;;;;N;;;A76A;;A76A
+A76C;LATIN CAPITAL LETTER IS;Lu;0;L;;;;;N;;;;A76D;
+A76D;LATIN SMALL LETTER IS;Ll;0;L;;;;;N;;;A76C;;A76C
+A76E;LATIN CAPITAL LETTER CON;Lu;0;L;;;;;N;;;;A76F;
+A76F;LATIN SMALL LETTER CON;Ll;0;L;;;;;N;;;A76E;;A76E
+A770;MODIFIER LETTER US;Lm;0;L;<super> A76F;;;;N;;;;;
+A771;LATIN SMALL LETTER DUM;Ll;0;L;;;;;N;;;;;
+A772;LATIN SMALL LETTER LUM;Ll;0;L;;;;;N;;;;;
+A773;LATIN SMALL LETTER MUM;Ll;0;L;;;;;N;;;;;
+A774;LATIN SMALL LETTER NUM;Ll;0;L;;;;;N;;;;;
+A775;LATIN SMALL LETTER RUM;Ll;0;L;;;;;N;;;;;
+A776;LATIN LETTER SMALL CAPITAL RUM;Ll;0;L;;;;;N;;;;;
+A777;LATIN SMALL LETTER TUM;Ll;0;L;;;;;N;;;;;
+A778;LATIN SMALL LETTER UM;Ll;0;L;;;;;N;;;;;
+A779;LATIN CAPITAL LETTER INSULAR D;Lu;0;L;;;;;N;;;;A77A;
+A77A;LATIN SMALL LETTER INSULAR D;Ll;0;L;;;;;N;;;A779;;A779
+A77B;LATIN CAPITAL LETTER INSULAR F;Lu;0;L;;;;;N;;;;A77C;
+A77C;LATIN SMALL LETTER INSULAR F;Ll;0;L;;;;;N;;;A77B;;A77B
+A77D;LATIN CAPITAL LETTER INSULAR G;Lu;0;L;;;;;N;;;;1D79;
+A77E;LATIN CAPITAL LETTER TURNED INSULAR G;Lu;0;L;;;;;N;;;;A77F;
+A77F;LATIN SMALL LETTER TURNED INSULAR G;Ll;0;L;;;;;N;;;A77E;;A77E
+A780;LATIN CAPITAL LETTER TURNED L;Lu;0;L;;;;;N;;;;A781;
+A781;LATIN SMALL LETTER TURNED L;Ll;0;L;;;;;N;;;A780;;A780
+A782;LATIN CAPITAL LETTER INSULAR R;Lu;0;L;;;;;N;;;;A783;
+A783;LATIN SMALL LETTER INSULAR R;Ll;0;L;;;;;N;;;A782;;A782
+A784;LATIN CAPITAL LETTER INSULAR S;Lu;0;L;;;;;N;;;;A785;
+A785;LATIN SMALL LETTER INSULAR S;Ll;0;L;;;;;N;;;A784;;A784
+A786;LATIN CAPITAL LETTER INSULAR T;Lu;0;L;;;;;N;;;;A787;
+A787;LATIN SMALL LETTER INSULAR T;Ll;0;L;;;;;N;;;A786;;A786
+A788;MODIFIER LETTER LOW CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;;;;;
+A789;MODIFIER LETTER COLON;Sk;0;L;;;;;N;;;;;
+A78A;MODIFIER LETTER SHORT EQUALS SIGN;Sk;0;L;;;;;N;;;;;
+A78B;LATIN CAPITAL LETTER SALTILLO;Lu;0;L;;;;;N;;;;A78C;
+A78C;LATIN SMALL LETTER SALTILLO;Ll;0;L;;;;;N;;;A78B;;A78B
+A78D;LATIN CAPITAL LETTER TURNED H;Lu;0;L;;;;;N;;;;0265;
+A78E;LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT;Ll;0;L;;;;;N;;;;;
+A78F;LATIN LETTER SINOLOGICAL DOT;Lo;0;L;;;;;N;;;;;
+A790;LATIN CAPITAL LETTER N WITH DESCENDER;Lu;0;L;;;;;N;;;;A791;
+A791;LATIN SMALL LETTER N WITH DESCENDER;Ll;0;L;;;;;N;;;A790;;A790
+A792;LATIN CAPITAL LETTER C WITH BAR;Lu;0;L;;;;;N;;;;A793;
+A793;LATIN SMALL LETTER C WITH BAR;Ll;0;L;;;;;N;;;A792;;A792
+A794;LATIN SMALL LETTER C WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+A795;LATIN SMALL LETTER H WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+A796;LATIN CAPITAL LETTER B WITH FLOURISH;Lu;0;L;;;;;N;;;;A797;
+A797;LATIN SMALL LETTER B WITH FLOURISH;Ll;0;L;;;;;N;;;A796;;A796
+A798;LATIN CAPITAL LETTER F WITH STROKE;Lu;0;L;;;;;N;;;;A799;
+A799;LATIN SMALL LETTER F WITH STROKE;Ll;0;L;;;;;N;;;A798;;A798
+A79A;LATIN CAPITAL LETTER VOLAPUK AE;Lu;0;L;;;;;N;;;;A79B;
+A79B;LATIN SMALL LETTER VOLAPUK AE;Ll;0;L;;;;;N;;;A79A;;A79A
+A79C;LATIN CAPITAL LETTER VOLAPUK OE;Lu;0;L;;;;;N;;;;A79D;
+A79D;LATIN SMALL LETTER VOLAPUK OE;Ll;0;L;;;;;N;;;A79C;;A79C
+A79E;LATIN CAPITAL LETTER VOLAPUK UE;Lu;0;L;;;;;N;;;;A79F;
+A79F;LATIN SMALL LETTER VOLAPUK UE;Ll;0;L;;;;;N;;;A79E;;A79E
+A7A0;LATIN CAPITAL LETTER G WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A1;
+A7A1;LATIN SMALL LETTER G WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A0;;A7A0
+A7A2;LATIN CAPITAL LETTER K WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A3;
+A7A3;LATIN SMALL LETTER K WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A2;;A7A2
+A7A4;LATIN CAPITAL LETTER N WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A5;
+A7A5;LATIN SMALL LETTER N WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A4;;A7A4
+A7A6;LATIN CAPITAL LETTER R WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A7;
+A7A7;LATIN SMALL LETTER R WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A6;;A7A6
+A7A8;LATIN CAPITAL LETTER S WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A9;
+A7A9;LATIN SMALL LETTER S WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A8;;A7A8
+A7AA;LATIN CAPITAL LETTER H WITH HOOK;Lu;0;L;;;;;N;;;;0266;
+A7AB;LATIN CAPITAL LETTER REVERSED OPEN E;Lu;0;L;;;;;N;;;;025C;
+A7AC;LATIN CAPITAL LETTER SCRIPT G;Lu;0;L;;;;;N;;;;0261;
+A7AD;LATIN CAPITAL LETTER L WITH BELT;Lu;0;L;;;;;N;;;;026C;
+A7AE;LATIN CAPITAL LETTER SMALL CAPITAL I;Lu;0;L;;;;;N;;;;026A;
+A7B0;LATIN CAPITAL LETTER TURNED K;Lu;0;L;;;;;N;;;;029E;
+A7B1;LATIN CAPITAL LETTER TURNED T;Lu;0;L;;;;;N;;;;0287;
+A7B2;LATIN CAPITAL LETTER J WITH CROSSED-TAIL;Lu;0;L;;;;;N;;;;029D;
+A7B3;LATIN CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;AB53;
+A7B4;LATIN CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;A7B5;
+A7B5;LATIN SMALL LETTER BETA;Ll;0;L;;;;;N;;;A7B4;;A7B4
+A7B6;LATIN CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;A7B7;
+A7B7;LATIN SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;A7B6;;A7B6
+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;;;;;
+A7FA;LATIN LETTER SMALL CAPITAL TURNED M;Ll;0;L;;;;;N;;;;;
+A7FB;LATIN EPIGRAPHIC LETTER REVERSED F;Lo;0;L;;;;;N;;;;;
+A7FC;LATIN EPIGRAPHIC LETTER REVERSED P;Lo;0;L;;;;;N;;;;;
+A7FD;LATIN EPIGRAPHIC LETTER INVERTED M;Lo;0;L;;;;;N;;;;;
+A7FE;LATIN EPIGRAPHIC LETTER I LONGA;Lo;0;L;;;;;N;;;;;
+A7FF;LATIN EPIGRAPHIC LETTER ARCHAIC M;Lo;0;L;;;;;N;;;;;
+A800;SYLOTI NAGRI LETTER A;Lo;0;L;;;;;N;;;;;
+A801;SYLOTI NAGRI LETTER I;Lo;0;L;;;;;N;;;;;
+A802;SYLOTI NAGRI SIGN DVISVARA;Mn;0;NSM;;;;;N;;;;;
+A803;SYLOTI NAGRI LETTER U;Lo;0;L;;;;;N;;;;;
+A804;SYLOTI NAGRI LETTER E;Lo;0;L;;;;;N;;;;;
+A805;SYLOTI NAGRI LETTER O;Lo;0;L;;;;;N;;;;;
+A806;SYLOTI NAGRI SIGN HASANTA;Mn;9;NSM;;;;;N;;;;;
+A807;SYLOTI NAGRI LETTER KO;Lo;0;L;;;;;N;;;;;
+A808;SYLOTI NAGRI LETTER KHO;Lo;0;L;;;;;N;;;;;
+A809;SYLOTI NAGRI LETTER GO;Lo;0;L;;;;;N;;;;;
+A80A;SYLOTI NAGRI LETTER GHO;Lo;0;L;;;;;N;;;;;
+A80B;SYLOTI NAGRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+A80C;SYLOTI NAGRI LETTER CO;Lo;0;L;;;;;N;;;;;
+A80D;SYLOTI NAGRI LETTER CHO;Lo;0;L;;;;;N;;;;;
+A80E;SYLOTI NAGRI LETTER JO;Lo;0;L;;;;;N;;;;;
+A80F;SYLOTI NAGRI LETTER JHO;Lo;0;L;;;;;N;;;;;
+A810;SYLOTI NAGRI LETTER TTO;Lo;0;L;;;;;N;;;;;
+A811;SYLOTI NAGRI LETTER TTHO;Lo;0;L;;;;;N;;;;;
+A812;SYLOTI NAGRI LETTER DDO;Lo;0;L;;;;;N;;;;;
+A813;SYLOTI NAGRI LETTER DDHO;Lo;0;L;;;;;N;;;;;
+A814;SYLOTI NAGRI LETTER TO;Lo;0;L;;;;;N;;;;;
+A815;SYLOTI NAGRI LETTER THO;Lo;0;L;;;;;N;;;;;
+A816;SYLOTI NAGRI LETTER DO;Lo;0;L;;;;;N;;;;;
+A817;SYLOTI NAGRI LETTER DHO;Lo;0;L;;;;;N;;;;;
+A818;SYLOTI NAGRI LETTER NO;Lo;0;L;;;;;N;;;;;
+A819;SYLOTI NAGRI LETTER PO;Lo;0;L;;;;;N;;;;;
+A81A;SYLOTI NAGRI LETTER PHO;Lo;0;L;;;;;N;;;;;
+A81B;SYLOTI NAGRI LETTER BO;Lo;0;L;;;;;N;;;;;
+A81C;SYLOTI NAGRI LETTER BHO;Lo;0;L;;;;;N;;;;;
+A81D;SYLOTI NAGRI LETTER MO;Lo;0;L;;;;;N;;;;;
+A81E;SYLOTI NAGRI LETTER RO;Lo;0;L;;;;;N;;;;;
+A81F;SYLOTI NAGRI LETTER LO;Lo;0;L;;;;;N;;;;;
+A820;SYLOTI NAGRI LETTER RRO;Lo;0;L;;;;;N;;;;;
+A821;SYLOTI NAGRI LETTER SO;Lo;0;L;;;;;N;;;;;
+A822;SYLOTI NAGRI LETTER HO;Lo;0;L;;;;;N;;;;;
+A823;SYLOTI NAGRI VOWEL SIGN A;Mc;0;L;;;;;N;;;;;
+A824;SYLOTI NAGRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+A825;SYLOTI NAGRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+A826;SYLOTI NAGRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+A827;SYLOTI NAGRI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+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;;;;;
+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;;;;;
+A833;NORTH INDIC FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;;
+A834;NORTH INDIC FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;;
+A835;NORTH INDIC FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;;
+A836;NORTH INDIC QUARTER MARK;So;0;L;;;;;N;;;;;
+A837;NORTH INDIC PLACEHOLDER MARK;So;0;L;;;;;N;;;;;
+A838;NORTH INDIC RUPEE MARK;Sc;0;ET;;;;;N;;;;;
+A839;NORTH INDIC QUANTITY MARK;So;0;ET;;;;;N;;;;;
+A840;PHAGS-PA LETTER KA;Lo;0;L;;;;;N;;;;;
+A841;PHAGS-PA LETTER KHA;Lo;0;L;;;;;N;;;;;
+A842;PHAGS-PA LETTER GA;Lo;0;L;;;;;N;;;;;
+A843;PHAGS-PA LETTER NGA;Lo;0;L;;;;;N;;;;;
+A844;PHAGS-PA LETTER CA;Lo;0;L;;;;;N;;;;;
+A845;PHAGS-PA LETTER CHA;Lo;0;L;;;;;N;;;;;
+A846;PHAGS-PA LETTER JA;Lo;0;L;;;;;N;;;;;
+A847;PHAGS-PA LETTER NYA;Lo;0;L;;;;;N;;;;;
+A848;PHAGS-PA LETTER TA;Lo;0;L;;;;;N;;;;;
+A849;PHAGS-PA LETTER THA;Lo;0;L;;;;;N;;;;;
+A84A;PHAGS-PA LETTER DA;Lo;0;L;;;;;N;;;;;
+A84B;PHAGS-PA LETTER NA;Lo;0;L;;;;;N;;;;;
+A84C;PHAGS-PA LETTER PA;Lo;0;L;;;;;N;;;;;
+A84D;PHAGS-PA LETTER PHA;Lo;0;L;;;;;N;;;;;
+A84E;PHAGS-PA LETTER BA;Lo;0;L;;;;;N;;;;;
+A84F;PHAGS-PA LETTER MA;Lo;0;L;;;;;N;;;;;
+A850;PHAGS-PA LETTER TSA;Lo;0;L;;;;;N;;;;;
+A851;PHAGS-PA LETTER TSHA;Lo;0;L;;;;;N;;;;;
+A852;PHAGS-PA LETTER DZA;Lo;0;L;;;;;N;;;;;
+A853;PHAGS-PA LETTER WA;Lo;0;L;;;;;N;;;;;
+A854;PHAGS-PA LETTER ZHA;Lo;0;L;;;;;N;;;;;
+A855;PHAGS-PA LETTER ZA;Lo;0;L;;;;;N;;;;;
+A856;PHAGS-PA LETTER SMALL A;Lo;0;L;;;;;N;;;;;
+A857;PHAGS-PA LETTER YA;Lo;0;L;;;;;N;;;;;
+A858;PHAGS-PA LETTER RA;Lo;0;L;;;;;N;;;;;
+A859;PHAGS-PA LETTER LA;Lo;0;L;;;;;N;;;;;
+A85A;PHAGS-PA LETTER SHA;Lo;0;L;;;;;N;;;;;
+A85B;PHAGS-PA LETTER SA;Lo;0;L;;;;;N;;;;;
+A85C;PHAGS-PA LETTER HA;Lo;0;L;;;;;N;;;;;
+A85D;PHAGS-PA LETTER A;Lo;0;L;;;;;N;;;;;
+A85E;PHAGS-PA LETTER I;Lo;0;L;;;;;N;;;;;
+A85F;PHAGS-PA LETTER U;Lo;0;L;;;;;N;;;;;
+A860;PHAGS-PA LETTER E;Lo;0;L;;;;;N;;;;;
+A861;PHAGS-PA LETTER O;Lo;0;L;;;;;N;;;;;
+A862;PHAGS-PA LETTER QA;Lo;0;L;;;;;N;;;;;
+A863;PHAGS-PA LETTER XA;Lo;0;L;;;;;N;;;;;
+A864;PHAGS-PA LETTER FA;Lo;0;L;;;;;N;;;;;
+A865;PHAGS-PA LETTER GGA;Lo;0;L;;;;;N;;;;;
+A866;PHAGS-PA LETTER EE;Lo;0;L;;;;;N;;;;;
+A867;PHAGS-PA SUBJOINED LETTER WA;Lo;0;L;;;;;N;;;;;
+A868;PHAGS-PA SUBJOINED LETTER YA;Lo;0;L;;;;;N;;;;;
+A869;PHAGS-PA LETTER TTA;Lo;0;L;;;;;N;;;;;
+A86A;PHAGS-PA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+A86B;PHAGS-PA LETTER DDA;Lo;0;L;;;;;N;;;;;
+A86C;PHAGS-PA LETTER NNA;Lo;0;L;;;;;N;;;;;
+A86D;PHAGS-PA LETTER ALTERNATE YA;Lo;0;L;;;;;N;;;;;
+A86E;PHAGS-PA LETTER VOICELESS SHA;Lo;0;L;;;;;N;;;;;
+A86F;PHAGS-PA LETTER VOICED HA;Lo;0;L;;;;;N;;;;;
+A870;PHAGS-PA LETTER ASPIRATED FA;Lo;0;L;;;;;N;;;;;
+A871;PHAGS-PA SUBJOINED LETTER RA;Lo;0;L;;;;;N;;;;;
+A872;PHAGS-PA SUPERFIXED LETTER RA;Lo;0;L;;;;;N;;;;;
+A873;PHAGS-PA LETTER CANDRABINDU;Lo;0;L;;;;;N;;;;;
+A874;PHAGS-PA SINGLE HEAD MARK;Po;0;ON;;;;;N;;;;;
+A875;PHAGS-PA DOUBLE HEAD MARK;Po;0;ON;;;;;N;;;;;
+A876;PHAGS-PA MARK SHAD;Po;0;ON;;;;;N;;;;;
+A877;PHAGS-PA MARK DOUBLE SHAD;Po;0;ON;;;;;N;;;;;
+A880;SAURASHTRA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+A881;SAURASHTRA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+A882;SAURASHTRA LETTER A;Lo;0;L;;;;;N;;;;;
+A883;SAURASHTRA LETTER AA;Lo;0;L;;;;;N;;;;;
+A884;SAURASHTRA LETTER I;Lo;0;L;;;;;N;;;;;
+A885;SAURASHTRA LETTER II;Lo;0;L;;;;;N;;;;;
+A886;SAURASHTRA LETTER U;Lo;0;L;;;;;N;;;;;
+A887;SAURASHTRA LETTER UU;Lo;0;L;;;;;N;;;;;
+A888;SAURASHTRA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+A889;SAURASHTRA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+A88A;SAURASHTRA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+A88B;SAURASHTRA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+A88C;SAURASHTRA LETTER E;Lo;0;L;;;;;N;;;;;
+A88D;SAURASHTRA LETTER EE;Lo;0;L;;;;;N;;;;;
+A88E;SAURASHTRA LETTER AI;Lo;0;L;;;;;N;;;;;
+A88F;SAURASHTRA LETTER O;Lo;0;L;;;;;N;;;;;
+A890;SAURASHTRA LETTER OO;Lo;0;L;;;;;N;;;;;
+A891;SAURASHTRA LETTER AU;Lo;0;L;;;;;N;;;;;
+A892;SAURASHTRA LETTER KA;Lo;0;L;;;;;N;;;;;
+A893;SAURASHTRA LETTER KHA;Lo;0;L;;;;;N;;;;;
+A894;SAURASHTRA LETTER GA;Lo;0;L;;;;;N;;;;;
+A895;SAURASHTRA LETTER GHA;Lo;0;L;;;;;N;;;;;
+A896;SAURASHTRA LETTER NGA;Lo;0;L;;;;;N;;;;;
+A897;SAURASHTRA LETTER CA;Lo;0;L;;;;;N;;;;;
+A898;SAURASHTRA LETTER CHA;Lo;0;L;;;;;N;;;;;
+A899;SAURASHTRA LETTER JA;Lo;0;L;;;;;N;;;;;
+A89A;SAURASHTRA LETTER JHA;Lo;0;L;;;;;N;;;;;
+A89B;SAURASHTRA LETTER NYA;Lo;0;L;;;;;N;;;;;
+A89C;SAURASHTRA LETTER TTA;Lo;0;L;;;;;N;;;;;
+A89D;SAURASHTRA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+A89E;SAURASHTRA LETTER DDA;Lo;0;L;;;;;N;;;;;
+A89F;SAURASHTRA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+A8A0;SAURASHTRA LETTER NNA;Lo;0;L;;;;;N;;;;;
+A8A1;SAURASHTRA LETTER TA;Lo;0;L;;;;;N;;;;;
+A8A2;SAURASHTRA LETTER THA;Lo;0;L;;;;;N;;;;;
+A8A3;SAURASHTRA LETTER DA;Lo;0;L;;;;;N;;;;;
+A8A4;SAURASHTRA LETTER DHA;Lo;0;L;;;;;N;;;;;
+A8A5;SAURASHTRA LETTER NA;Lo;0;L;;;;;N;;;;;
+A8A6;SAURASHTRA LETTER PA;Lo;0;L;;;;;N;;;;;
+A8A7;SAURASHTRA LETTER PHA;Lo;0;L;;;;;N;;;;;
+A8A8;SAURASHTRA LETTER BA;Lo;0;L;;;;;N;;;;;
+A8A9;SAURASHTRA LETTER BHA;Lo;0;L;;;;;N;;;;;
+A8AA;SAURASHTRA LETTER MA;Lo;0;L;;;;;N;;;;;
+A8AB;SAURASHTRA LETTER YA;Lo;0;L;;;;;N;;;;;
+A8AC;SAURASHTRA LETTER RA;Lo;0;L;;;;;N;;;;;
+A8AD;SAURASHTRA LETTER LA;Lo;0;L;;;;;N;;;;;
+A8AE;SAURASHTRA LETTER VA;Lo;0;L;;;;;N;;;;;
+A8AF;SAURASHTRA LETTER SHA;Lo;0;L;;;;;N;;;;;
+A8B0;SAURASHTRA LETTER SSA;Lo;0;L;;;;;N;;;;;
+A8B1;SAURASHTRA LETTER SA;Lo;0;L;;;;;N;;;;;
+A8B2;SAURASHTRA LETTER HA;Lo;0;L;;;;;N;;;;;
+A8B3;SAURASHTRA LETTER LLA;Lo;0;L;;;;;N;;;;;
+A8B4;SAURASHTRA CONSONANT SIGN HAARU;Mc;0;L;;;;;N;;;;;
+A8B5;SAURASHTRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+A8B6;SAURASHTRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+A8B7;SAURASHTRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+A8B8;SAURASHTRA VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+A8B9;SAURASHTRA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+A8BA;SAURASHTRA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+A8BB;SAURASHTRA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+A8BC;SAURASHTRA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;;
+A8BD;SAURASHTRA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;;
+A8BE;SAURASHTRA VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+A8BF;SAURASHTRA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+A8C0;SAURASHTRA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+A8C1;SAURASHTRA VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+A8C2;SAURASHTRA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+A8C3;SAURASHTRA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+A8C4;SAURASHTRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+A8C5;SAURASHTRA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+A8CE;SAURASHTRA DANDA;Po;0;L;;;;;N;;;;;
+A8CF;SAURASHTRA DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+A8D0;SAURASHTRA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+A8D1;SAURASHTRA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+A8D2;SAURASHTRA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+A8D3;SAURASHTRA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+A8D4;SAURASHTRA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+A8D5;SAURASHTRA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+A8D6;SAURASHTRA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+A8D7;SAURASHTRA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+A8D8;SAURASHTRA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+A8D9;SAURASHTRA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+A8E0;COMBINING DEVANAGARI DIGIT ZERO;Mn;230;NSM;;;;;N;;;;;
+A8E1;COMBINING DEVANAGARI DIGIT ONE;Mn;230;NSM;;;;;N;;;;;
+A8E2;COMBINING DEVANAGARI DIGIT TWO;Mn;230;NSM;;;;;N;;;;;
+A8E3;COMBINING DEVANAGARI DIGIT THREE;Mn;230;NSM;;;;;N;;;;;
+A8E4;COMBINING DEVANAGARI DIGIT FOUR;Mn;230;NSM;;;;;N;;;;;
+A8E5;COMBINING DEVANAGARI DIGIT FIVE;Mn;230;NSM;;;;;N;;;;;
+A8E6;COMBINING DEVANAGARI DIGIT SIX;Mn;230;NSM;;;;;N;;;;;
+A8E7;COMBINING DEVANAGARI DIGIT SEVEN;Mn;230;NSM;;;;;N;;;;;
+A8E8;COMBINING DEVANAGARI DIGIT EIGHT;Mn;230;NSM;;;;;N;;;;;
+A8E9;COMBINING DEVANAGARI DIGIT NINE;Mn;230;NSM;;;;;N;;;;;
+A8EA;COMBINING DEVANAGARI LETTER A;Mn;230;NSM;;;;;N;;;;;
+A8EB;COMBINING DEVANAGARI LETTER U;Mn;230;NSM;;;;;N;;;;;
+A8EC;COMBINING DEVANAGARI LETTER KA;Mn;230;NSM;;;;;N;;;;;
+A8ED;COMBINING DEVANAGARI LETTER NA;Mn;230;NSM;;;;;N;;;;;
+A8EE;COMBINING DEVANAGARI LETTER PA;Mn;230;NSM;;;;;N;;;;;
+A8EF;COMBINING DEVANAGARI LETTER RA;Mn;230;NSM;;;;;N;;;;;
+A8F0;COMBINING DEVANAGARI LETTER VI;Mn;230;NSM;;;;;N;;;;;
+A8F1;COMBINING DEVANAGARI SIGN AVAGRAHA;Mn;230;NSM;;;;;N;;;;;
+A8F2;DEVANAGARI SIGN SPACING CANDRABINDU;Lo;0;L;;;;;N;;;;;
+A8F3;DEVANAGARI SIGN CANDRABINDU VIRAMA;Lo;0;L;;;;;N;;;;;
+A8F4;DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA;Lo;0;L;;;;;N;;;;;
+A8F5;DEVANAGARI SIGN CANDRABINDU TWO;Lo;0;L;;;;;N;;;;;
+A8F6;DEVANAGARI SIGN CANDRABINDU THREE;Lo;0;L;;;;;N;;;;;
+A8F7;DEVANAGARI SIGN CANDRABINDU AVAGRAHA;Lo;0;L;;;;;N;;;;;
+A8F8;DEVANAGARI SIGN PUSHPIKA;Po;0;L;;;;;N;;;;;
+A8F9;DEVANAGARI GAP FILLER;Po;0;L;;;;;N;;;;;
+A8FA;DEVANAGARI CARET;Po;0;L;;;;;N;;;;;
+A8FB;DEVANAGARI HEADSTROKE;Lo;0;L;;;;;N;;;;;
+A8FC;DEVANAGARI SIGN SIDDHAM;Po;0;L;;;;;N;;;;;
+A8FD;DEVANAGARI JAIN OM;Lo;0;L;;;;;N;;;;;
+A900;KAYAH LI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+A901;KAYAH LI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+A902;KAYAH LI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+A903;KAYAH LI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+A904;KAYAH LI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+A905;KAYAH LI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+A906;KAYAH LI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+A907;KAYAH LI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+A908;KAYAH LI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+A909;KAYAH LI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+A90A;KAYAH LI LETTER KA;Lo;0;L;;;;;N;;;;;
+A90B;KAYAH LI LETTER KHA;Lo;0;L;;;;;N;;;;;
+A90C;KAYAH LI LETTER GA;Lo;0;L;;;;;N;;;;;
+A90D;KAYAH LI LETTER NGA;Lo;0;L;;;;;N;;;;;
+A90E;KAYAH LI LETTER SA;Lo;0;L;;;;;N;;;;;
+A90F;KAYAH LI LETTER SHA;Lo;0;L;;;;;N;;;;;
+A910;KAYAH LI LETTER ZA;Lo;0;L;;;;;N;;;;;
+A911;KAYAH LI LETTER NYA;Lo;0;L;;;;;N;;;;;
+A912;KAYAH LI LETTER TA;Lo;0;L;;;;;N;;;;;
+A913;KAYAH LI LETTER HTA;Lo;0;L;;;;;N;;;;;
+A914;KAYAH LI LETTER NA;Lo;0;L;;;;;N;;;;;
+A915;KAYAH LI LETTER PA;Lo;0;L;;;;;N;;;;;
+A916;KAYAH LI LETTER PHA;Lo;0;L;;;;;N;;;;;
+A917;KAYAH LI LETTER MA;Lo;0;L;;;;;N;;;;;
+A918;KAYAH LI LETTER DA;Lo;0;L;;;;;N;;;;;
+A919;KAYAH LI LETTER BA;Lo;0;L;;;;;N;;;;;
+A91A;KAYAH LI LETTER RA;Lo;0;L;;;;;N;;;;;
+A91B;KAYAH LI LETTER YA;Lo;0;L;;;;;N;;;;;
+A91C;KAYAH LI LETTER LA;Lo;0;L;;;;;N;;;;;
+A91D;KAYAH LI LETTER WA;Lo;0;L;;;;;N;;;;;
+A91E;KAYAH LI LETTER THA;Lo;0;L;;;;;N;;;;;
+A91F;KAYAH LI LETTER HA;Lo;0;L;;;;;N;;;;;
+A920;KAYAH LI LETTER VA;Lo;0;L;;;;;N;;;;;
+A921;KAYAH LI LETTER CA;Lo;0;L;;;;;N;;;;;
+A922;KAYAH LI LETTER A;Lo;0;L;;;;;N;;;;;
+A923;KAYAH LI LETTER OE;Lo;0;L;;;;;N;;;;;
+A924;KAYAH LI LETTER I;Lo;0;L;;;;;N;;;;;
+A925;KAYAH LI LETTER OO;Lo;0;L;;;;;N;;;;;
+A926;KAYAH LI VOWEL UE;Mn;0;NSM;;;;;N;;;;;
+A927;KAYAH LI VOWEL E;Mn;0;NSM;;;;;N;;;;;
+A928;KAYAH LI VOWEL U;Mn;0;NSM;;;;;N;;;;;
+A929;KAYAH LI VOWEL EE;Mn;0;NSM;;;;;N;;;;;
+A92A;KAYAH LI VOWEL O;Mn;0;NSM;;;;;N;;;;;
+A92B;KAYAH LI TONE PLOPHU;Mn;220;NSM;;;;;N;;;;;
+A92C;KAYAH LI TONE CALYA;Mn;220;NSM;;;;;N;;;;;
+A92D;KAYAH LI TONE CALYA PLOPHU;Mn;220;NSM;;;;;N;;;;;
+A92E;KAYAH LI SIGN CWI;Po;0;L;;;;;N;;;;;
+A92F;KAYAH LI SIGN SHYA;Po;0;L;;;;;N;;;;;
+A930;REJANG LETTER KA;Lo;0;L;;;;;N;;;;;
+A931;REJANG LETTER GA;Lo;0;L;;;;;N;;;;;
+A932;REJANG LETTER NGA;Lo;0;L;;;;;N;;;;;
+A933;REJANG LETTER TA;Lo;0;L;;;;;N;;;;;
+A934;REJANG LETTER DA;Lo;0;L;;;;;N;;;;;
+A935;REJANG LETTER NA;Lo;0;L;;;;;N;;;;;
+A936;REJANG LETTER PA;Lo;0;L;;;;;N;;;;;
+A937;REJANG LETTER BA;Lo;0;L;;;;;N;;;;;
+A938;REJANG LETTER MA;Lo;0;L;;;;;N;;;;;
+A939;REJANG LETTER CA;Lo;0;L;;;;;N;;;;;
+A93A;REJANG LETTER JA;Lo;0;L;;;;;N;;;;;
+A93B;REJANG LETTER NYA;Lo;0;L;;;;;N;;;;;
+A93C;REJANG LETTER SA;Lo;0;L;;;;;N;;;;;
+A93D;REJANG LETTER RA;Lo;0;L;;;;;N;;;;;
+A93E;REJANG LETTER LA;Lo;0;L;;;;;N;;;;;
+A93F;REJANG LETTER YA;Lo;0;L;;;;;N;;;;;
+A940;REJANG LETTER WA;Lo;0;L;;;;;N;;;;;
+A941;REJANG LETTER HA;Lo;0;L;;;;;N;;;;;
+A942;REJANG LETTER MBA;Lo;0;L;;;;;N;;;;;
+A943;REJANG LETTER NGGA;Lo;0;L;;;;;N;;;;;
+A944;REJANG LETTER NDA;Lo;0;L;;;;;N;;;;;
+A945;REJANG LETTER NYJA;Lo;0;L;;;;;N;;;;;
+A946;REJANG LETTER A;Lo;0;L;;;;;N;;;;;
+A947;REJANG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+A948;REJANG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+A949;REJANG VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+A94A;REJANG VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+A94B;REJANG VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+A94C;REJANG VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+A94D;REJANG VOWEL SIGN EU;Mn;0;NSM;;;;;N;;;;;
+A94E;REJANG VOWEL SIGN EA;Mn;0;NSM;;;;;N;;;;;
+A94F;REJANG CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;;
+A950;REJANG CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;;
+A951;REJANG CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;;
+A952;REJANG CONSONANT SIGN H;Mc;0;L;;;;;N;;;;;
+A953;REJANG VIRAMA;Mc;9;L;;;;;N;;;;;
+A95F;REJANG SECTION MARK;Po;0;L;;;;;N;;;;;
+A960;HANGUL CHOSEONG TIKEUT-MIEUM;Lo;0;L;;;;;N;;;;;
+A961;HANGUL CHOSEONG TIKEUT-PIEUP;Lo;0;L;;;;;N;;;;;
+A962;HANGUL CHOSEONG TIKEUT-SIOS;Lo;0;L;;;;;N;;;;;
+A963;HANGUL CHOSEONG TIKEUT-CIEUC;Lo;0;L;;;;;N;;;;;
+A964;HANGUL CHOSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;;;;
+A965;HANGUL CHOSEONG RIEUL-SSANGKIYEOK;Lo;0;L;;;;;N;;;;;
+A966;HANGUL CHOSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;;
+A967;HANGUL CHOSEONG RIEUL-SSANGTIKEUT;Lo;0;L;;;;;N;;;;;
+A968;HANGUL CHOSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;;;;
+A969;HANGUL CHOSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;;;;
+A96A;HANGUL CHOSEONG RIEUL-SSANGPIEUP;Lo;0;L;;;;;N;;;;;
+A96B;HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+A96C;HANGUL CHOSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;;;;
+A96D;HANGUL CHOSEONG RIEUL-CIEUC;Lo;0;L;;;;;N;;;;;
+A96E;HANGUL CHOSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;;
+A96F;HANGUL CHOSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;;
+A970;HANGUL CHOSEONG MIEUM-TIKEUT;Lo;0;L;;;;;N;;;;;
+A971;HANGUL CHOSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;;
+A972;HANGUL CHOSEONG PIEUP-SIOS-THIEUTH;Lo;0;L;;;;;N;;;;;
+A973;HANGUL CHOSEONG PIEUP-KHIEUKH;Lo;0;L;;;;;N;;;;;
+A974;HANGUL CHOSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;;
+A975;HANGUL CHOSEONG SSANGSIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+A976;HANGUL CHOSEONG IEUNG-RIEUL;Lo;0;L;;;;;N;;;;;
+A977;HANGUL CHOSEONG IEUNG-HIEUH;Lo;0;L;;;;;N;;;;;
+A978;HANGUL CHOSEONG SSANGCIEUC-HIEUH;Lo;0;L;;;;;N;;;;;
+A979;HANGUL CHOSEONG SSANGTHIEUTH;Lo;0;L;;;;;N;;;;;
+A97A;HANGUL CHOSEONG PHIEUPH-HIEUH;Lo;0;L;;;;;N;;;;;
+A97B;HANGUL CHOSEONG HIEUH-SIOS;Lo;0;L;;;;;N;;;;;
+A97C;HANGUL CHOSEONG SSANGYEORINHIEUH;Lo;0;L;;;;;N;;;;;
+A980;JAVANESE SIGN PANYANGGA;Mn;0;NSM;;;;;N;;;;;
+A981;JAVANESE SIGN CECAK;Mn;0;NSM;;;;;N;;;;;
+A982;JAVANESE SIGN LAYAR;Mn;0;NSM;;;;;N;;;;;
+A983;JAVANESE SIGN WIGNYAN;Mc;0;L;;;;;N;;;;;
+A984;JAVANESE LETTER A;Lo;0;L;;;;;N;;;;;
+A985;JAVANESE LETTER I KAWI;Lo;0;L;;;;;N;;;;;
+A986;JAVANESE LETTER I;Lo;0;L;;;;;N;;;;;
+A987;JAVANESE LETTER II;Lo;0;L;;;;;N;;;;;
+A988;JAVANESE LETTER U;Lo;0;L;;;;;N;;;;;
+A989;JAVANESE LETTER PA CEREK;Lo;0;L;;;;;N;;;;;
+A98A;JAVANESE LETTER NGA LELET;Lo;0;L;;;;;N;;;;;
+A98B;JAVANESE LETTER NGA LELET RASWADI;Lo;0;L;;;;;N;;;;;
+A98C;JAVANESE LETTER E;Lo;0;L;;;;;N;;;;;
+A98D;JAVANESE LETTER AI;Lo;0;L;;;;;N;;;;;
+A98E;JAVANESE LETTER O;Lo;0;L;;;;;N;;;;;
+A98F;JAVANESE LETTER KA;Lo;0;L;;;;;N;;;;;
+A990;JAVANESE LETTER KA SASAK;Lo;0;L;;;;;N;;;;;
+A991;JAVANESE LETTER KA MURDA;Lo;0;L;;;;;N;;;;;
+A992;JAVANESE LETTER GA;Lo;0;L;;;;;N;;;;;
+A993;JAVANESE LETTER GA MURDA;Lo;0;L;;;;;N;;;;;
+A994;JAVANESE LETTER NGA;Lo;0;L;;;;;N;;;;;
+A995;JAVANESE LETTER CA;Lo;0;L;;;;;N;;;;;
+A996;JAVANESE LETTER CA MURDA;Lo;0;L;;;;;N;;;;;
+A997;JAVANESE LETTER JA;Lo;0;L;;;;;N;;;;;
+A998;JAVANESE LETTER NYA MURDA;Lo;0;L;;;;;N;;;;;
+A999;JAVANESE LETTER JA MAHAPRANA;Lo;0;L;;;;;N;;;;;
+A99A;JAVANESE LETTER NYA;Lo;0;L;;;;;N;;;;;
+A99B;JAVANESE LETTER TTA;Lo;0;L;;;;;N;;;;;
+A99C;JAVANESE LETTER TTA MAHAPRANA;Lo;0;L;;;;;N;;;;;
+A99D;JAVANESE LETTER DDA;Lo;0;L;;;;;N;;;;;
+A99E;JAVANESE LETTER DDA MAHAPRANA;Lo;0;L;;;;;N;;;;;
+A99F;JAVANESE LETTER NA MURDA;Lo;0;L;;;;;N;;;;;
+A9A0;JAVANESE LETTER TA;Lo;0;L;;;;;N;;;;;
+A9A1;JAVANESE LETTER TA MURDA;Lo;0;L;;;;;N;;;;;
+A9A2;JAVANESE LETTER DA;Lo;0;L;;;;;N;;;;;
+A9A3;JAVANESE LETTER DA MAHAPRANA;Lo;0;L;;;;;N;;;;;
+A9A4;JAVANESE LETTER NA;Lo;0;L;;;;;N;;;;;
+A9A5;JAVANESE LETTER PA;Lo;0;L;;;;;N;;;;;
+A9A6;JAVANESE LETTER PA MURDA;Lo;0;L;;;;;N;;;;;
+A9A7;JAVANESE LETTER BA;Lo;0;L;;;;;N;;;;;
+A9A8;JAVANESE LETTER BA MURDA;Lo;0;L;;;;;N;;;;;
+A9A9;JAVANESE LETTER MA;Lo;0;L;;;;;N;;;;;
+A9AA;JAVANESE LETTER YA;Lo;0;L;;;;;N;;;;;
+A9AB;JAVANESE LETTER RA;Lo;0;L;;;;;N;;;;;
+A9AC;JAVANESE LETTER RA AGUNG;Lo;0;L;;;;;N;;;;;
+A9AD;JAVANESE LETTER LA;Lo;0;L;;;;;N;;;;;
+A9AE;JAVANESE LETTER WA;Lo;0;L;;;;;N;;;;;
+A9AF;JAVANESE LETTER SA MURDA;Lo;0;L;;;;;N;;;;;
+A9B0;JAVANESE LETTER SA MAHAPRANA;Lo;0;L;;;;;N;;;;;
+A9B1;JAVANESE LETTER SA;Lo;0;L;;;;;N;;;;;
+A9B2;JAVANESE LETTER HA;Lo;0;L;;;;;N;;;;;
+A9B3;JAVANESE SIGN CECAK TELU;Mn;7;NSM;;;;;N;;;;;
+A9B4;JAVANESE VOWEL SIGN TARUNG;Mc;0;L;;;;;N;;;;;
+A9B5;JAVANESE VOWEL SIGN TOLONG;Mc;0;L;;;;;N;;;;;
+A9B6;JAVANESE VOWEL SIGN WULU;Mn;0;NSM;;;;;N;;;;;
+A9B7;JAVANESE VOWEL SIGN WULU MELIK;Mn;0;NSM;;;;;N;;;;;
+A9B8;JAVANESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;;
+A9B9;JAVANESE VOWEL SIGN SUKU MENDUT;Mn;0;NSM;;;;;N;;;;;
+A9BA;JAVANESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;;
+A9BB;JAVANESE VOWEL SIGN DIRGA MURE;Mc;0;L;;;;;N;;;;;
+A9BC;JAVANESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;;
+A9BD;JAVANESE CONSONANT SIGN KERET;Mc;0;L;;;;;N;;;;;
+A9BE;JAVANESE CONSONANT SIGN PENGKAL;Mc;0;L;;;;;N;;;;;
+A9BF;JAVANESE CONSONANT SIGN CAKRA;Mc;0;L;;;;;N;;;;;
+A9C0;JAVANESE PANGKON;Mc;9;L;;;;;N;;;;;
+A9C1;JAVANESE LEFT RERENGGAN;Po;0;L;;;;;N;;;;;
+A9C2;JAVANESE RIGHT RERENGGAN;Po;0;L;;;;;N;;;;;
+A9C3;JAVANESE PADA ANDAP;Po;0;L;;;;;N;;;;;
+A9C4;JAVANESE PADA MADYA;Po;0;L;;;;;N;;;;;
+A9C5;JAVANESE PADA LUHUR;Po;0;L;;;;;N;;;;;
+A9C6;JAVANESE PADA WINDU;Po;0;L;;;;;N;;;;;
+A9C7;JAVANESE PADA PANGKAT;Po;0;L;;;;;N;;;;;
+A9C8;JAVANESE PADA LINGSA;Po;0;L;;;;;N;;;;;
+A9C9;JAVANESE PADA LUNGSI;Po;0;L;;;;;N;;;;;
+A9CA;JAVANESE PADA ADEG;Po;0;L;;;;;N;;;;;
+A9CB;JAVANESE PADA ADEG ADEG;Po;0;L;;;;;N;;;;;
+A9CC;JAVANESE PADA PISELEH;Po;0;L;;;;;N;;;;;
+A9CD;JAVANESE TURNED PADA PISELEH;Po;0;L;;;;;N;;;;;
+A9CF;JAVANESE PANGRANGKEP;Lm;0;L;;;;;N;;;;;
+A9D0;JAVANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+A9D1;JAVANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+A9D2;JAVANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+A9D3;JAVANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+A9D4;JAVANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+A9D5;JAVANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+A9D6;JAVANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+A9D7;JAVANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+A9D8;JAVANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+A9D9;JAVANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+A9DE;JAVANESE PADA TIRTA TUMETES;Po;0;L;;;;;N;;;;;
+A9DF;JAVANESE PADA ISEN-ISEN;Po;0;L;;;;;N;;;;;
+A9E0;MYANMAR LETTER SHAN GHA;Lo;0;L;;;;;N;;;;;
+A9E1;MYANMAR LETTER SHAN CHA;Lo;0;L;;;;;N;;;;;
+A9E2;MYANMAR LETTER SHAN JHA;Lo;0;L;;;;;N;;;;;
+A9E3;MYANMAR LETTER SHAN NNA;Lo;0;L;;;;;N;;;;;
+A9E4;MYANMAR LETTER SHAN BHA;Lo;0;L;;;;;N;;;;;
+A9E5;MYANMAR SIGN SHAN SAW;Mn;0;NSM;;;;;N;;;;;
+A9E6;MYANMAR MODIFIER LETTER SHAN REDUPLICATION;Lm;0;L;;;;;N;;;;;
+A9E7;MYANMAR LETTER TAI LAING NYA;Lo;0;L;;;;;N;;;;;
+A9E8;MYANMAR LETTER TAI LAING FA;Lo;0;L;;;;;N;;;;;
+A9E9;MYANMAR LETTER TAI LAING GA;Lo;0;L;;;;;N;;;;;
+A9EA;MYANMAR LETTER TAI LAING GHA;Lo;0;L;;;;;N;;;;;
+A9EB;MYANMAR LETTER TAI LAING JA;Lo;0;L;;;;;N;;;;;
+A9EC;MYANMAR LETTER TAI LAING JHA;Lo;0;L;;;;;N;;;;;
+A9ED;MYANMAR LETTER TAI LAING DDA;Lo;0;L;;;;;N;;;;;
+A9EE;MYANMAR LETTER TAI LAING DDHA;Lo;0;L;;;;;N;;;;;
+A9EF;MYANMAR LETTER TAI LAING NNA;Lo;0;L;;;;;N;;;;;
+A9F0;MYANMAR TAI LAING DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+A9F1;MYANMAR TAI LAING DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+A9F2;MYANMAR TAI LAING DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+A9F3;MYANMAR TAI LAING DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+A9F4;MYANMAR TAI LAING DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+A9F5;MYANMAR TAI LAING DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+A9F6;MYANMAR TAI LAING DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+A9F7;MYANMAR TAI LAING DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+A9F8;MYANMAR TAI LAING DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+A9F9;MYANMAR TAI LAING DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+A9FA;MYANMAR LETTER TAI LAING LLA;Lo;0;L;;;;;N;;;;;
+A9FB;MYANMAR LETTER TAI LAING DA;Lo;0;L;;;;;N;;;;;
+A9FC;MYANMAR LETTER TAI LAING DHA;Lo;0;L;;;;;N;;;;;
+A9FD;MYANMAR LETTER TAI LAING BA;Lo;0;L;;;;;N;;;;;
+A9FE;MYANMAR LETTER TAI LAING BHA;Lo;0;L;;;;;N;;;;;
+AA00;CHAM LETTER A;Lo;0;L;;;;;N;;;;;
+AA01;CHAM LETTER I;Lo;0;L;;;;;N;;;;;
+AA02;CHAM LETTER U;Lo;0;L;;;;;N;;;;;
+AA03;CHAM LETTER E;Lo;0;L;;;;;N;;;;;
+AA04;CHAM LETTER AI;Lo;0;L;;;;;N;;;;;
+AA05;CHAM LETTER O;Lo;0;L;;;;;N;;;;;
+AA06;CHAM LETTER KA;Lo;0;L;;;;;N;;;;;
+AA07;CHAM LETTER KHA;Lo;0;L;;;;;N;;;;;
+AA08;CHAM LETTER GA;Lo;0;L;;;;;N;;;;;
+AA09;CHAM LETTER GHA;Lo;0;L;;;;;N;;;;;
+AA0A;CHAM LETTER NGUE;Lo;0;L;;;;;N;;;;;
+AA0B;CHAM LETTER NGA;Lo;0;L;;;;;N;;;;;
+AA0C;CHAM LETTER CHA;Lo;0;L;;;;;N;;;;;
+AA0D;CHAM LETTER CHHA;Lo;0;L;;;;;N;;;;;
+AA0E;CHAM LETTER JA;Lo;0;L;;;;;N;;;;;
+AA0F;CHAM LETTER JHA;Lo;0;L;;;;;N;;;;;
+AA10;CHAM LETTER NHUE;Lo;0;L;;;;;N;;;;;
+AA11;CHAM LETTER NHA;Lo;0;L;;;;;N;;;;;
+AA12;CHAM LETTER NHJA;Lo;0;L;;;;;N;;;;;
+AA13;CHAM LETTER TA;Lo;0;L;;;;;N;;;;;
+AA14;CHAM LETTER THA;Lo;0;L;;;;;N;;;;;
+AA15;CHAM LETTER DA;Lo;0;L;;;;;N;;;;;
+AA16;CHAM LETTER DHA;Lo;0;L;;;;;N;;;;;
+AA17;CHAM LETTER NUE;Lo;0;L;;;;;N;;;;;
+AA18;CHAM LETTER NA;Lo;0;L;;;;;N;;;;;
+AA19;CHAM LETTER DDA;Lo;0;L;;;;;N;;;;;
+AA1A;CHAM LETTER PA;Lo;0;L;;;;;N;;;;;
+AA1B;CHAM LETTER PPA;Lo;0;L;;;;;N;;;;;
+AA1C;CHAM LETTER PHA;Lo;0;L;;;;;N;;;;;
+AA1D;CHAM LETTER BA;Lo;0;L;;;;;N;;;;;
+AA1E;CHAM LETTER BHA;Lo;0;L;;;;;N;;;;;
+AA1F;CHAM LETTER MUE;Lo;0;L;;;;;N;;;;;
+AA20;CHAM LETTER MA;Lo;0;L;;;;;N;;;;;
+AA21;CHAM LETTER BBA;Lo;0;L;;;;;N;;;;;
+AA22;CHAM LETTER YA;Lo;0;L;;;;;N;;;;;
+AA23;CHAM LETTER RA;Lo;0;L;;;;;N;;;;;
+AA24;CHAM LETTER LA;Lo;0;L;;;;;N;;;;;
+AA25;CHAM LETTER VA;Lo;0;L;;;;;N;;;;;
+AA26;CHAM LETTER SSA;Lo;0;L;;;;;N;;;;;
+AA27;CHAM LETTER SA;Lo;0;L;;;;;N;;;;;
+AA28;CHAM LETTER HA;Lo;0;L;;;;;N;;;;;
+AA29;CHAM VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;;
+AA2A;CHAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+AA2B;CHAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+AA2C;CHAM VOWEL SIGN EI;Mn;0;NSM;;;;;N;;;;;
+AA2D;CHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+AA2E;CHAM VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;;
+AA2F;CHAM VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+AA30;CHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+AA31;CHAM VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+AA32;CHAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;;
+AA33;CHAM CONSONANT SIGN YA;Mc;0;L;;;;;N;;;;;
+AA34;CHAM CONSONANT SIGN RA;Mc;0;L;;;;;N;;;;;
+AA35;CHAM CONSONANT SIGN LA;Mn;0;NSM;;;;;N;;;;;
+AA36;CHAM CONSONANT SIGN WA;Mn;0;NSM;;;;;N;;;;;
+AA40;CHAM LETTER FINAL K;Lo;0;L;;;;;N;;;;;
+AA41;CHAM LETTER FINAL G;Lo;0;L;;;;;N;;;;;
+AA42;CHAM LETTER FINAL NG;Lo;0;L;;;;;N;;;;;
+AA43;CHAM CONSONANT SIGN FINAL NG;Mn;0;NSM;;;;;N;;;;;
+AA44;CHAM LETTER FINAL CH;Lo;0;L;;;;;N;;;;;
+AA45;CHAM LETTER FINAL T;Lo;0;L;;;;;N;;;;;
+AA46;CHAM LETTER FINAL N;Lo;0;L;;;;;N;;;;;
+AA47;CHAM LETTER FINAL P;Lo;0;L;;;;;N;;;;;
+AA48;CHAM LETTER FINAL Y;Lo;0;L;;;;;N;;;;;
+AA49;CHAM LETTER FINAL R;Lo;0;L;;;;;N;;;;;
+AA4A;CHAM LETTER FINAL L;Lo;0;L;;;;;N;;;;;
+AA4B;CHAM LETTER FINAL SS;Lo;0;L;;;;;N;;;;;
+AA4C;CHAM CONSONANT SIGN FINAL M;Mn;0;NSM;;;;;N;;;;;
+AA4D;CHAM CONSONANT SIGN FINAL H;Mc;0;L;;;;;N;;;;;
+AA50;CHAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+AA51;CHAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+AA52;CHAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+AA53;CHAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+AA54;CHAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+AA55;CHAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+AA56;CHAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+AA57;CHAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+AA58;CHAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+AA59;CHAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+AA5C;CHAM PUNCTUATION SPIRAL;Po;0;L;;;;;N;;;;;
+AA5D;CHAM PUNCTUATION DANDA;Po;0;L;;;;;N;;;;;
+AA5E;CHAM PUNCTUATION DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+AA5F;CHAM PUNCTUATION TRIPLE DANDA;Po;0;L;;;;;N;;;;;
+AA60;MYANMAR LETTER KHAMTI GA;Lo;0;L;;;;;N;;;;;
+AA61;MYANMAR LETTER KHAMTI CA;Lo;0;L;;;;;N;;;;;
+AA62;MYANMAR LETTER KHAMTI CHA;Lo;0;L;;;;;N;;;;;
+AA63;MYANMAR LETTER KHAMTI JA;Lo;0;L;;;;;N;;;;;
+AA64;MYANMAR LETTER KHAMTI JHA;Lo;0;L;;;;;N;;;;;
+AA65;MYANMAR LETTER KHAMTI NYA;Lo;0;L;;;;;N;;;;;
+AA66;MYANMAR LETTER KHAMTI TTA;Lo;0;L;;;;;N;;;;;
+AA67;MYANMAR LETTER KHAMTI TTHA;Lo;0;L;;;;;N;;;;;
+AA68;MYANMAR LETTER KHAMTI DDA;Lo;0;L;;;;;N;;;;;
+AA69;MYANMAR LETTER KHAMTI DDHA;Lo;0;L;;;;;N;;;;;
+AA6A;MYANMAR LETTER KHAMTI DHA;Lo;0;L;;;;;N;;;;;
+AA6B;MYANMAR LETTER KHAMTI NA;Lo;0;L;;;;;N;;;;;
+AA6C;MYANMAR LETTER KHAMTI SA;Lo;0;L;;;;;N;;;;;
+AA6D;MYANMAR LETTER KHAMTI HA;Lo;0;L;;;;;N;;;;;
+AA6E;MYANMAR LETTER KHAMTI HHA;Lo;0;L;;;;;N;;;;;
+AA6F;MYANMAR LETTER KHAMTI FA;Lo;0;L;;;;;N;;;;;
+AA70;MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION;Lm;0;L;;;;;N;;;;;
+AA71;MYANMAR LETTER KHAMTI XA;Lo;0;L;;;;;N;;;;;
+AA72;MYANMAR LETTER KHAMTI ZA;Lo;0;L;;;;;N;;;;;
+AA73;MYANMAR LETTER KHAMTI RA;Lo;0;L;;;;;N;;;;;
+AA74;MYANMAR LOGOGRAM KHAMTI OAY;Lo;0;L;;;;;N;;;;;
+AA75;MYANMAR LOGOGRAM KHAMTI QN;Lo;0;L;;;;;N;;;;;
+AA76;MYANMAR LOGOGRAM KHAMTI HM;Lo;0;L;;;;;N;;;;;
+AA77;MYANMAR SYMBOL AITON EXCLAMATION;So;0;L;;;;;N;;;;;
+AA78;MYANMAR SYMBOL AITON ONE;So;0;L;;;;;N;;;;;
+AA79;MYANMAR SYMBOL AITON TWO;So;0;L;;;;;N;;;;;
+AA7A;MYANMAR LETTER AITON RA;Lo;0;L;;;;;N;;;;;
+AA7B;MYANMAR SIGN PAO KAREN TONE;Mc;0;L;;;;;N;;;;;
+AA7C;MYANMAR SIGN TAI LAING TONE-2;Mn;0;NSM;;;;;N;;;;;
+AA7D;MYANMAR SIGN TAI LAING TONE-5;Mc;0;L;;;;;N;;;;;
+AA7E;MYANMAR LETTER SHWE PALAUNG CHA;Lo;0;L;;;;;N;;;;;
+AA7F;MYANMAR LETTER SHWE PALAUNG SHA;Lo;0;L;;;;;N;;;;;
+AA80;TAI VIET LETTER LOW KO;Lo;0;L;;;;;N;;;;;
+AA81;TAI VIET LETTER HIGH KO;Lo;0;L;;;;;N;;;;;
+AA82;TAI VIET LETTER LOW KHO;Lo;0;L;;;;;N;;;;;
+AA83;TAI VIET LETTER HIGH KHO;Lo;0;L;;;;;N;;;;;
+AA84;TAI VIET LETTER LOW KHHO;Lo;0;L;;;;;N;;;;;
+AA85;TAI VIET LETTER HIGH KHHO;Lo;0;L;;;;;N;;;;;
+AA86;TAI VIET LETTER LOW GO;Lo;0;L;;;;;N;;;;;
+AA87;TAI VIET LETTER HIGH GO;Lo;0;L;;;;;N;;;;;
+AA88;TAI VIET LETTER LOW NGO;Lo;0;L;;;;;N;;;;;
+AA89;TAI VIET LETTER HIGH NGO;Lo;0;L;;;;;N;;;;;
+AA8A;TAI VIET LETTER LOW CO;Lo;0;L;;;;;N;;;;;
+AA8B;TAI VIET LETTER HIGH CO;Lo;0;L;;;;;N;;;;;
+AA8C;TAI VIET LETTER LOW CHO;Lo;0;L;;;;;N;;;;;
+AA8D;TAI VIET LETTER HIGH CHO;Lo;0;L;;;;;N;;;;;
+AA8E;TAI VIET LETTER LOW SO;Lo;0;L;;;;;N;;;;;
+AA8F;TAI VIET LETTER HIGH SO;Lo;0;L;;;;;N;;;;;
+AA90;TAI VIET LETTER LOW NYO;Lo;0;L;;;;;N;;;;;
+AA91;TAI VIET LETTER HIGH NYO;Lo;0;L;;;;;N;;;;;
+AA92;TAI VIET LETTER LOW DO;Lo;0;L;;;;;N;;;;;
+AA93;TAI VIET LETTER HIGH DO;Lo;0;L;;;;;N;;;;;
+AA94;TAI VIET LETTER LOW TO;Lo;0;L;;;;;N;;;;;
+AA95;TAI VIET LETTER HIGH TO;Lo;0;L;;;;;N;;;;;
+AA96;TAI VIET LETTER LOW THO;Lo;0;L;;;;;N;;;;;
+AA97;TAI VIET LETTER HIGH THO;Lo;0;L;;;;;N;;;;;
+AA98;TAI VIET LETTER LOW NO;Lo;0;L;;;;;N;;;;;
+AA99;TAI VIET LETTER HIGH NO;Lo;0;L;;;;;N;;;;;
+AA9A;TAI VIET LETTER LOW BO;Lo;0;L;;;;;N;;;;;
+AA9B;TAI VIET LETTER HIGH BO;Lo;0;L;;;;;N;;;;;
+AA9C;TAI VIET LETTER LOW PO;Lo;0;L;;;;;N;;;;;
+AA9D;TAI VIET LETTER HIGH PO;Lo;0;L;;;;;N;;;;;
+AA9E;TAI VIET LETTER LOW PHO;Lo;0;L;;;;;N;;;;;
+AA9F;TAI VIET LETTER HIGH PHO;Lo;0;L;;;;;N;;;;;
+AAA0;TAI VIET LETTER LOW FO;Lo;0;L;;;;;N;;;;;
+AAA1;TAI VIET LETTER HIGH FO;Lo;0;L;;;;;N;;;;;
+AAA2;TAI VIET LETTER LOW MO;Lo;0;L;;;;;N;;;;;
+AAA3;TAI VIET LETTER HIGH MO;Lo;0;L;;;;;N;;;;;
+AAA4;TAI VIET LETTER LOW YO;Lo;0;L;;;;;N;;;;;
+AAA5;TAI VIET LETTER HIGH YO;Lo;0;L;;;;;N;;;;;
+AAA6;TAI VIET LETTER LOW RO;Lo;0;L;;;;;N;;;;;
+AAA7;TAI VIET LETTER HIGH RO;Lo;0;L;;;;;N;;;;;
+AAA8;TAI VIET LETTER LOW LO;Lo;0;L;;;;;N;;;;;
+AAA9;TAI VIET LETTER HIGH LO;Lo;0;L;;;;;N;;;;;
+AAAA;TAI VIET LETTER LOW VO;Lo;0;L;;;;;N;;;;;
+AAAB;TAI VIET LETTER HIGH VO;Lo;0;L;;;;;N;;;;;
+AAAC;TAI VIET LETTER LOW HO;Lo;0;L;;;;;N;;;;;
+AAAD;TAI VIET LETTER HIGH HO;Lo;0;L;;;;;N;;;;;
+AAAE;TAI VIET LETTER LOW O;Lo;0;L;;;;;N;;;;;
+AAAF;TAI VIET LETTER HIGH O;Lo;0;L;;;;;N;;;;;
+AAB0;TAI VIET MAI KANG;Mn;230;NSM;;;;;N;;;;;
+AAB1;TAI VIET VOWEL AA;Lo;0;L;;;;;N;;;;;
+AAB2;TAI VIET VOWEL I;Mn;230;NSM;;;;;N;;;;;
+AAB3;TAI VIET VOWEL UE;Mn;230;NSM;;;;;N;;;;;
+AAB4;TAI VIET VOWEL U;Mn;220;NSM;;;;;N;;;;;
+AAB5;TAI VIET VOWEL E;Lo;0;L;;;;;N;;;;;
+AAB6;TAI VIET VOWEL O;Lo;0;L;;;;;N;;;;;
+AAB7;TAI VIET MAI KHIT;Mn;230;NSM;;;;;N;;;;;
+AAB8;TAI VIET VOWEL IA;Mn;230;NSM;;;;;N;;;;;
+AAB9;TAI VIET VOWEL UEA;Lo;0;L;;;;;N;;;;;
+AABA;TAI VIET VOWEL UA;Lo;0;L;;;;;N;;;;;
+AABB;TAI VIET VOWEL AUE;Lo;0;L;;;;;N;;;;;
+AABC;TAI VIET VOWEL AY;Lo;0;L;;;;;N;;;;;
+AABD;TAI VIET VOWEL AN;Lo;0;L;;;;;N;;;;;
+AABE;TAI VIET VOWEL AM;Mn;230;NSM;;;;;N;;;;;
+AABF;TAI VIET TONE MAI EK;Mn;230;NSM;;;;;N;;;;;
+AAC0;TAI VIET TONE MAI NUENG;Lo;0;L;;;;;N;;;;;
+AAC1;TAI VIET TONE MAI THO;Mn;230;NSM;;;;;N;;;;;
+AAC2;TAI VIET TONE MAI SONG;Lo;0;L;;;;;N;;;;;
+AADB;TAI VIET SYMBOL KON;Lo;0;L;;;;;N;;;;;
+AADC;TAI VIET SYMBOL NUENG;Lo;0;L;;;;;N;;;;;
+AADD;TAI VIET SYMBOL SAM;Lm;0;L;;;;;N;;;;;
+AADE;TAI VIET SYMBOL HO HOI;Po;0;L;;;;;N;;;;;
+AADF;TAI VIET SYMBOL KOI KOI;Po;0;L;;;;;N;;;;;
+AAE0;MEETEI MAYEK LETTER E;Lo;0;L;;;;;N;;;;;
+AAE1;MEETEI MAYEK LETTER O;Lo;0;L;;;;;N;;;;;
+AAE2;MEETEI MAYEK LETTER CHA;Lo;0;L;;;;;N;;;;;
+AAE3;MEETEI MAYEK LETTER NYA;Lo;0;L;;;;;N;;;;;
+AAE4;MEETEI MAYEK LETTER TTA;Lo;0;L;;;;;N;;;;;
+AAE5;MEETEI MAYEK LETTER TTHA;Lo;0;L;;;;;N;;;;;
+AAE6;MEETEI MAYEK LETTER DDA;Lo;0;L;;;;;N;;;;;
+AAE7;MEETEI MAYEK LETTER DDHA;Lo;0;L;;;;;N;;;;;
+AAE8;MEETEI MAYEK LETTER NNA;Lo;0;L;;;;;N;;;;;
+AAE9;MEETEI MAYEK LETTER SHA;Lo;0;L;;;;;N;;;;;
+AAEA;MEETEI MAYEK LETTER SSA;Lo;0;L;;;;;N;;;;;
+AAEB;MEETEI MAYEK VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+AAEC;MEETEI MAYEK VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+AAED;MEETEI MAYEK VOWEL SIGN AAI;Mn;0;NSM;;;;;N;;;;;
+AAEE;MEETEI MAYEK VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+AAEF;MEETEI MAYEK VOWEL SIGN AAU;Mc;0;L;;;;;N;;;;;
+AAF0;MEETEI MAYEK CHEIKHAN;Po;0;L;;;;;N;;;;;
+AAF1;MEETEI MAYEK AHANG KHUDAM;Po;0;L;;;;;N;;;;;
+AAF2;MEETEI MAYEK ANJI;Lo;0;L;;;;;N;;;;;
+AAF3;MEETEI MAYEK SYLLABLE REPETITION MARK;Lm;0;L;;;;;N;;;;;
+AAF4;MEETEI MAYEK WORD REPETITION MARK;Lm;0;L;;;;;N;;;;;
+AAF5;MEETEI MAYEK VOWEL SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+AAF6;MEETEI MAYEK VIRAMA;Mn;9;NSM;;;;;N;;;;;
+AB01;ETHIOPIC SYLLABLE TTHU;Lo;0;L;;;;;N;;;;;
+AB02;ETHIOPIC SYLLABLE TTHI;Lo;0;L;;;;;N;;;;;
+AB03;ETHIOPIC SYLLABLE TTHAA;Lo;0;L;;;;;N;;;;;
+AB04;ETHIOPIC SYLLABLE TTHEE;Lo;0;L;;;;;N;;;;;
+AB05;ETHIOPIC SYLLABLE TTHE;Lo;0;L;;;;;N;;;;;
+AB06;ETHIOPIC SYLLABLE TTHO;Lo;0;L;;;;;N;;;;;
+AB09;ETHIOPIC SYLLABLE DDHU;Lo;0;L;;;;;N;;;;;
+AB0A;ETHIOPIC SYLLABLE DDHI;Lo;0;L;;;;;N;;;;;
+AB0B;ETHIOPIC SYLLABLE DDHAA;Lo;0;L;;;;;N;;;;;
+AB0C;ETHIOPIC SYLLABLE DDHEE;Lo;0;L;;;;;N;;;;;
+AB0D;ETHIOPIC SYLLABLE DDHE;Lo;0;L;;;;;N;;;;;
+AB0E;ETHIOPIC SYLLABLE DDHO;Lo;0;L;;;;;N;;;;;
+AB11;ETHIOPIC SYLLABLE DZU;Lo;0;L;;;;;N;;;;;
+AB12;ETHIOPIC SYLLABLE DZI;Lo;0;L;;;;;N;;;;;
+AB13;ETHIOPIC SYLLABLE DZAA;Lo;0;L;;;;;N;;;;;
+AB14;ETHIOPIC SYLLABLE DZEE;Lo;0;L;;;;;N;;;;;
+AB15;ETHIOPIC SYLLABLE DZE;Lo;0;L;;;;;N;;;;;
+AB16;ETHIOPIC SYLLABLE DZO;Lo;0;L;;;;;N;;;;;
+AB20;ETHIOPIC SYLLABLE CCHHA;Lo;0;L;;;;;N;;;;;
+AB21;ETHIOPIC SYLLABLE CCHHU;Lo;0;L;;;;;N;;;;;
+AB22;ETHIOPIC SYLLABLE CCHHI;Lo;0;L;;;;;N;;;;;
+AB23;ETHIOPIC SYLLABLE CCHHAA;Lo;0;L;;;;;N;;;;;
+AB24;ETHIOPIC SYLLABLE CCHHEE;Lo;0;L;;;;;N;;;;;
+AB25;ETHIOPIC SYLLABLE CCHHE;Lo;0;L;;;;;N;;;;;
+AB26;ETHIOPIC SYLLABLE CCHHO;Lo;0;L;;;;;N;;;;;
+AB28;ETHIOPIC SYLLABLE BBA;Lo;0;L;;;;;N;;;;;
+AB29;ETHIOPIC SYLLABLE BBU;Lo;0;L;;;;;N;;;;;
+AB2A;ETHIOPIC SYLLABLE BBI;Lo;0;L;;;;;N;;;;;
+AB2B;ETHIOPIC SYLLABLE BBAA;Lo;0;L;;;;;N;;;;;
+AB2C;ETHIOPIC SYLLABLE BBEE;Lo;0;L;;;;;N;;;;;
+AB2D;ETHIOPIC SYLLABLE BBE;Lo;0;L;;;;;N;;;;;
+AB2E;ETHIOPIC SYLLABLE BBO;Lo;0;L;;;;;N;;;;;
+AB30;LATIN SMALL LETTER BARRED ALPHA;Ll;0;L;;;;;N;;;;;
+AB31;LATIN SMALL LETTER A REVERSED-SCHWA;Ll;0;L;;;;;N;;;;;
+AB32;LATIN SMALL LETTER BLACKLETTER E;Ll;0;L;;;;;N;;;;;
+AB33;LATIN SMALL LETTER BARRED E;Ll;0;L;;;;;N;;;;;
+AB34;LATIN SMALL LETTER E WITH FLOURISH;Ll;0;L;;;;;N;;;;;
+AB35;LATIN SMALL LETTER LENIS F;Ll;0;L;;;;;N;;;;;
+AB36;LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;;
+AB37;LATIN SMALL LETTER L WITH INVERTED LAZY S;Ll;0;L;;;;;N;;;;;
+AB38;LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+AB39;LATIN SMALL LETTER L WITH MIDDLE RING;Ll;0;L;;;;;N;;;;;
+AB3A;LATIN SMALL LETTER M WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;;
+AB3B;LATIN SMALL LETTER N WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;;
+AB3C;LATIN SMALL LETTER ENG WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;;
+AB3D;LATIN SMALL LETTER BLACKLETTER O;Ll;0;L;;;;;N;;;;;
+AB3E;LATIN SMALL LETTER BLACKLETTER O WITH STROKE;Ll;0;L;;;;;N;;;;;
+AB3F;LATIN SMALL LETTER OPEN O WITH STROKE;Ll;0;L;;;;;N;;;;;
+AB40;LATIN SMALL LETTER INVERTED OE;Ll;0;L;;;;;N;;;;;
+AB41;LATIN SMALL LETTER TURNED OE WITH STROKE;Ll;0;L;;;;;N;;;;;
+AB42;LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE;Ll;0;L;;;;;N;;;;;
+AB43;LATIN SMALL LETTER TURNED O OPEN-O;Ll;0;L;;;;;N;;;;;
+AB44;LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE;Ll;0;L;;;;;N;;;;;
+AB45;LATIN SMALL LETTER STIRRUP R;Ll;0;L;;;;;N;;;;;
+AB46;LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG;Ll;0;L;;;;;N;;;;;
+AB47;LATIN SMALL LETTER R WITHOUT HANDLE;Ll;0;L;;;;;N;;;;;
+AB48;LATIN SMALL LETTER DOUBLE R;Ll;0;L;;;;;N;;;;;
+AB49;LATIN SMALL LETTER R WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;;
+AB4A;LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;;
+AB4B;LATIN SMALL LETTER SCRIPT R;Ll;0;L;;;;;N;;;;;
+AB4C;LATIN SMALL LETTER SCRIPT R WITH RING;Ll;0;L;;;;;N;;;;;
+AB4D;LATIN SMALL LETTER BASELINE ESH;Ll;0;L;;;;;N;;;;;
+AB4E;LATIN SMALL LETTER U WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;;
+AB4F;LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;;
+AB50;LATIN SMALL LETTER UI;Ll;0;L;;;;;N;;;;;
+AB51;LATIN SMALL LETTER TURNED UI;Ll;0;L;;;;;N;;;;;
+AB52;LATIN SMALL LETTER U WITH LEFT HOOK;Ll;0;L;;;;;N;;;;;
+AB53;LATIN SMALL LETTER CHI;Ll;0;L;;;;;N;;;A7B3;;A7B3
+AB54;LATIN SMALL LETTER CHI WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;;
+AB55;LATIN SMALL LETTER CHI WITH LOW LEFT SERIF;Ll;0;L;;;;;N;;;;;
+AB56;LATIN SMALL LETTER X WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;;
+AB57;LATIN SMALL LETTER X WITH LONG LEFT LEG;Ll;0;L;;;;;N;;;;;
+AB58;LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING;Ll;0;L;;;;;N;;;;;
+AB59;LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF;Ll;0;L;;;;;N;;;;;
+AB5A;LATIN SMALL LETTER Y WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;;
+AB5B;MODIFIER BREVE WITH INVERTED BREVE;Sk;0;L;;;;;N;;;;;
+AB5C;MODIFIER LETTER SMALL HENG;Lm;0;L;<super> A727;;;;N;;;;;
+AB5D;MODIFIER LETTER SMALL L WITH INVERTED LAZY S;Lm;0;L;<super> AB37;;;;N;;;;;
+AB5E;MODIFIER LETTER SMALL L WITH MIDDLE TILDE;Lm;0;L;<super> 026B;;;;N;;;;;
+AB5F;MODIFIER LETTER SMALL U WITH LEFT HOOK;Lm;0;L;<super> AB52;;;;N;;;;;
+AB60;LATIN SMALL LETTER SAKHA YAT;Ll;0;L;;;;;N;;;;;
+AB61;LATIN SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;;;
+AB62;LATIN SMALL LETTER OPEN OE;Ll;0;L;;;;;N;;;;;
+AB63;LATIN SMALL LETTER UO;Ll;0;L;;;;;N;;;;;
+AB64;LATIN SMALL LETTER INVERTED ALPHA;Ll;0;L;;;;;N;;;;;
+AB65;GREEK LETTER SMALL CAPITAL OMEGA;Ll;0;L;;;;;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
+AB73;CHEROKEE SMALL LETTER O;Ll;0;L;;;;;N;;;13A3;;13A3
+AB74;CHEROKEE SMALL LETTER U;Ll;0;L;;;;;N;;;13A4;;13A4
+AB75;CHEROKEE SMALL LETTER V;Ll;0;L;;;;;N;;;13A5;;13A5
+AB76;CHEROKEE SMALL LETTER GA;Ll;0;L;;;;;N;;;13A6;;13A6
+AB77;CHEROKEE SMALL LETTER KA;Ll;0;L;;;;;N;;;13A7;;13A7
+AB78;CHEROKEE SMALL LETTER GE;Ll;0;L;;;;;N;;;13A8;;13A8
+AB79;CHEROKEE SMALL LETTER GI;Ll;0;L;;;;;N;;;13A9;;13A9
+AB7A;CHEROKEE SMALL LETTER GO;Ll;0;L;;;;;N;;;13AA;;13AA
+AB7B;CHEROKEE SMALL LETTER GU;Ll;0;L;;;;;N;;;13AB;;13AB
+AB7C;CHEROKEE SMALL LETTER GV;Ll;0;L;;;;;N;;;13AC;;13AC
+AB7D;CHEROKEE SMALL LETTER HA;Ll;0;L;;;;;N;;;13AD;;13AD
+AB7E;CHEROKEE SMALL LETTER HE;Ll;0;L;;;;;N;;;13AE;;13AE
+AB7F;CHEROKEE SMALL LETTER HI;Ll;0;L;;;;;N;;;13AF;;13AF
+AB80;CHEROKEE SMALL LETTER HO;Ll;0;L;;;;;N;;;13B0;;13B0
+AB81;CHEROKEE SMALL LETTER HU;Ll;0;L;;;;;N;;;13B1;;13B1
+AB82;CHEROKEE SMALL LETTER HV;Ll;0;L;;;;;N;;;13B2;;13B2
+AB83;CHEROKEE SMALL LETTER LA;Ll;0;L;;;;;N;;;13B3;;13B3
+AB84;CHEROKEE SMALL LETTER LE;Ll;0;L;;;;;N;;;13B4;;13B4
+AB85;CHEROKEE SMALL LETTER LI;Ll;0;L;;;;;N;;;13B5;;13B5
+AB86;CHEROKEE SMALL LETTER LO;Ll;0;L;;;;;N;;;13B6;;13B6
+AB87;CHEROKEE SMALL LETTER LU;Ll;0;L;;;;;N;;;13B7;;13B7
+AB88;CHEROKEE SMALL LETTER LV;Ll;0;L;;;;;N;;;13B8;;13B8
+AB89;CHEROKEE SMALL LETTER MA;Ll;0;L;;;;;N;;;13B9;;13B9
+AB8A;CHEROKEE SMALL LETTER ME;Ll;0;L;;;;;N;;;13BA;;13BA
+AB8B;CHEROKEE SMALL LETTER MI;Ll;0;L;;;;;N;;;13BB;;13BB
+AB8C;CHEROKEE SMALL LETTER MO;Ll;0;L;;;;;N;;;13BC;;13BC
+AB8D;CHEROKEE SMALL LETTER MU;Ll;0;L;;;;;N;;;13BD;;13BD
+AB8E;CHEROKEE SMALL LETTER NA;Ll;0;L;;;;;N;;;13BE;;13BE
+AB8F;CHEROKEE SMALL LETTER HNA;Ll;0;L;;;;;N;;;13BF;;13BF
+AB90;CHEROKEE SMALL LETTER NAH;Ll;0;L;;;;;N;;;13C0;;13C0
+AB91;CHEROKEE SMALL LETTER NE;Ll;0;L;;;;;N;;;13C1;;13C1
+AB92;CHEROKEE SMALL LETTER NI;Ll;0;L;;;;;N;;;13C2;;13C2
+AB93;CHEROKEE SMALL LETTER NO;Ll;0;L;;;;;N;;;13C3;;13C3
+AB94;CHEROKEE SMALL LETTER NU;Ll;0;L;;;;;N;;;13C4;;13C4
+AB95;CHEROKEE SMALL LETTER NV;Ll;0;L;;;;;N;;;13C5;;13C5
+AB96;CHEROKEE SMALL LETTER QUA;Ll;0;L;;;;;N;;;13C6;;13C6
+AB97;CHEROKEE SMALL LETTER QUE;Ll;0;L;;;;;N;;;13C7;;13C7
+AB98;CHEROKEE SMALL LETTER QUI;Ll;0;L;;;;;N;;;13C8;;13C8
+AB99;CHEROKEE SMALL LETTER QUO;Ll;0;L;;;;;N;;;13C9;;13C9
+AB9A;CHEROKEE SMALL LETTER QUU;Ll;0;L;;;;;N;;;13CA;;13CA
+AB9B;CHEROKEE SMALL LETTER QUV;Ll;0;L;;;;;N;;;13CB;;13CB
+AB9C;CHEROKEE SMALL LETTER SA;Ll;0;L;;;;;N;;;13CC;;13CC
+AB9D;CHEROKEE SMALL LETTER S;Ll;0;L;;;;;N;;;13CD;;13CD
+AB9E;CHEROKEE SMALL LETTER SE;Ll;0;L;;;;;N;;;13CE;;13CE
+AB9F;CHEROKEE SMALL LETTER SI;Ll;0;L;;;;;N;;;13CF;;13CF
+ABA0;CHEROKEE SMALL LETTER SO;Ll;0;L;;;;;N;;;13D0;;13D0
+ABA1;CHEROKEE SMALL LETTER SU;Ll;0;L;;;;;N;;;13D1;;13D1
+ABA2;CHEROKEE SMALL LETTER SV;Ll;0;L;;;;;N;;;13D2;;13D2
+ABA3;CHEROKEE SMALL LETTER DA;Ll;0;L;;;;;N;;;13D3;;13D3
+ABA4;CHEROKEE SMALL LETTER TA;Ll;0;L;;;;;N;;;13D4;;13D4
+ABA5;CHEROKEE SMALL LETTER DE;Ll;0;L;;;;;N;;;13D5;;13D5
+ABA6;CHEROKEE SMALL LETTER TE;Ll;0;L;;;;;N;;;13D6;;13D6
+ABA7;CHEROKEE SMALL LETTER DI;Ll;0;L;;;;;N;;;13D7;;13D7
+ABA8;CHEROKEE SMALL LETTER TI;Ll;0;L;;;;;N;;;13D8;;13D8
+ABA9;CHEROKEE SMALL LETTER DO;Ll;0;L;;;;;N;;;13D9;;13D9
+ABAA;CHEROKEE SMALL LETTER DU;Ll;0;L;;;;;N;;;13DA;;13DA
+ABAB;CHEROKEE SMALL LETTER DV;Ll;0;L;;;;;N;;;13DB;;13DB
+ABAC;CHEROKEE SMALL LETTER DLA;Ll;0;L;;;;;N;;;13DC;;13DC
+ABAD;CHEROKEE SMALL LETTER TLA;Ll;0;L;;;;;N;;;13DD;;13DD
+ABAE;CHEROKEE SMALL LETTER TLE;Ll;0;L;;;;;N;;;13DE;;13DE
+ABAF;CHEROKEE SMALL LETTER TLI;Ll;0;L;;;;;N;;;13DF;;13DF
+ABB0;CHEROKEE SMALL LETTER TLO;Ll;0;L;;;;;N;;;13E0;;13E0
+ABB1;CHEROKEE SMALL LETTER TLU;Ll;0;L;;;;;N;;;13E1;;13E1
+ABB2;CHEROKEE SMALL LETTER TLV;Ll;0;L;;;;;N;;;13E2;;13E2
+ABB3;CHEROKEE SMALL LETTER TSA;Ll;0;L;;;;;N;;;13E3;;13E3
+ABB4;CHEROKEE SMALL LETTER TSE;Ll;0;L;;;;;N;;;13E4;;13E4
+ABB5;CHEROKEE SMALL LETTER TSI;Ll;0;L;;;;;N;;;13E5;;13E5
+ABB6;CHEROKEE SMALL LETTER TSO;Ll;0;L;;;;;N;;;13E6;;13E6
+ABB7;CHEROKEE SMALL LETTER TSU;Ll;0;L;;;;;N;;;13E7;;13E7
+ABB8;CHEROKEE SMALL LETTER TSV;Ll;0;L;;;;;N;;;13E8;;13E8
+ABB9;CHEROKEE SMALL LETTER WA;Ll;0;L;;;;;N;;;13E9;;13E9
+ABBA;CHEROKEE SMALL LETTER WE;Ll;0;L;;;;;N;;;13EA;;13EA
+ABBB;CHEROKEE SMALL LETTER WI;Ll;0;L;;;;;N;;;13EB;;13EB
+ABBC;CHEROKEE SMALL LETTER WO;Ll;0;L;;;;;N;;;13EC;;13EC
+ABBD;CHEROKEE SMALL LETTER WU;Ll;0;L;;;;;N;;;13ED;;13ED
+ABBE;CHEROKEE SMALL LETTER WV;Ll;0;L;;;;;N;;;13EE;;13EE
+ABBF;CHEROKEE SMALL LETTER YA;Ll;0;L;;;;;N;;;13EF;;13EF
+ABC0;MEETEI MAYEK LETTER KOK;Lo;0;L;;;;;N;;;;;
+ABC1;MEETEI MAYEK LETTER SAM;Lo;0;L;;;;;N;;;;;
+ABC2;MEETEI MAYEK LETTER LAI;Lo;0;L;;;;;N;;;;;
+ABC3;MEETEI MAYEK LETTER MIT;Lo;0;L;;;;;N;;;;;
+ABC4;MEETEI MAYEK LETTER PA;Lo;0;L;;;;;N;;;;;
+ABC5;MEETEI MAYEK LETTER NA;Lo;0;L;;;;;N;;;;;
+ABC6;MEETEI MAYEK LETTER CHIL;Lo;0;L;;;;;N;;;;;
+ABC7;MEETEI MAYEK LETTER TIL;Lo;0;L;;;;;N;;;;;
+ABC8;MEETEI MAYEK LETTER KHOU;Lo;0;L;;;;;N;;;;;
+ABC9;MEETEI MAYEK LETTER NGOU;Lo;0;L;;;;;N;;;;;
+ABCA;MEETEI MAYEK LETTER THOU;Lo;0;L;;;;;N;;;;;
+ABCB;MEETEI MAYEK LETTER WAI;Lo;0;L;;;;;N;;;;;
+ABCC;MEETEI MAYEK LETTER YANG;Lo;0;L;;;;;N;;;;;
+ABCD;MEETEI MAYEK LETTER HUK;Lo;0;L;;;;;N;;;;;
+ABCE;MEETEI MAYEK LETTER UN;Lo;0;L;;;;;N;;;;;
+ABCF;MEETEI MAYEK LETTER I;Lo;0;L;;;;;N;;;;;
+ABD0;MEETEI MAYEK LETTER PHAM;Lo;0;L;;;;;N;;;;;
+ABD1;MEETEI MAYEK LETTER ATIYA;Lo;0;L;;;;;N;;;;;
+ABD2;MEETEI MAYEK LETTER GOK;Lo;0;L;;;;;N;;;;;
+ABD3;MEETEI MAYEK LETTER JHAM;Lo;0;L;;;;;N;;;;;
+ABD4;MEETEI MAYEK LETTER RAI;Lo;0;L;;;;;N;;;;;
+ABD5;MEETEI MAYEK LETTER BA;Lo;0;L;;;;;N;;;;;
+ABD6;MEETEI MAYEK LETTER JIL;Lo;0;L;;;;;N;;;;;
+ABD7;MEETEI MAYEK LETTER DIL;Lo;0;L;;;;;N;;;;;
+ABD8;MEETEI MAYEK LETTER GHOU;Lo;0;L;;;;;N;;;;;
+ABD9;MEETEI MAYEK LETTER DHOU;Lo;0;L;;;;;N;;;;;
+ABDA;MEETEI MAYEK LETTER BHAM;Lo;0;L;;;;;N;;;;;
+ABDB;MEETEI MAYEK LETTER KOK LONSUM;Lo;0;L;;;;;N;;;;;
+ABDC;MEETEI MAYEK LETTER LAI LONSUM;Lo;0;L;;;;;N;;;;;
+ABDD;MEETEI MAYEK LETTER MIT LONSUM;Lo;0;L;;;;;N;;;;;
+ABDE;MEETEI MAYEK LETTER PA LONSUM;Lo;0;L;;;;;N;;;;;
+ABDF;MEETEI MAYEK LETTER NA LONSUM;Lo;0;L;;;;;N;;;;;
+ABE0;MEETEI MAYEK LETTER TIL LONSUM;Lo;0;L;;;;;N;;;;;
+ABE1;MEETEI MAYEK LETTER NGOU LONSUM;Lo;0;L;;;;;N;;;;;
+ABE2;MEETEI MAYEK LETTER I LONSUM;Lo;0;L;;;;;N;;;;;
+ABE3;MEETEI MAYEK VOWEL SIGN ONAP;Mc;0;L;;;;;N;;;;;
+ABE4;MEETEI MAYEK VOWEL SIGN INAP;Mc;0;L;;;;;N;;;;;
+ABE5;MEETEI MAYEK VOWEL SIGN ANAP;Mn;0;NSM;;;;;N;;;;;
+ABE6;MEETEI MAYEK VOWEL SIGN YENAP;Mc;0;L;;;;;N;;;;;
+ABE7;MEETEI MAYEK VOWEL SIGN SOUNAP;Mc;0;L;;;;;N;;;;;
+ABE8;MEETEI MAYEK VOWEL SIGN UNAP;Mn;0;NSM;;;;;N;;;;;
+ABE9;MEETEI MAYEK VOWEL SIGN CHEINAP;Mc;0;L;;;;;N;;;;;
+ABEA;MEETEI MAYEK VOWEL SIGN NUNG;Mc;0;L;;;;;N;;;;;
+ABEB;MEETEI MAYEK CHEIKHEI;Po;0;L;;;;;N;;;;;
+ABEC;MEETEI MAYEK LUM IYEK;Mc;0;L;;;;;N;;;;;
+ABED;MEETEI MAYEK APUN IYEK;Mn;9;NSM;;;;;N;;;;;
+ABF0;MEETEI MAYEK DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+ABF1;MEETEI MAYEK DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+ABF2;MEETEI MAYEK DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+ABF3;MEETEI MAYEK DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+ABF4;MEETEI MAYEK DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+ABF5;MEETEI MAYEK DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+ABF6;MEETEI MAYEK DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+ABF7;MEETEI MAYEK DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+ABF8;MEETEI MAYEK DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+ABF9;MEETEI MAYEK DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+AC00;<Hangul Syllable, First>;Lo;0;L;;;;;N;;;;;
+D7A3;<Hangul Syllable, Last>;Lo;0;L;;;;;N;;;;;
+D7B0;HANGUL JUNGSEONG O-YEO;Lo;0;L;;;;;N;;;;;
+D7B1;HANGUL JUNGSEONG O-O-I;Lo;0;L;;;;;N;;;;;
+D7B2;HANGUL JUNGSEONG YO-A;Lo;0;L;;;;;N;;;;;
+D7B3;HANGUL JUNGSEONG YO-AE;Lo;0;L;;;;;N;;;;;
+D7B4;HANGUL JUNGSEONG YO-EO;Lo;0;L;;;;;N;;;;;
+D7B5;HANGUL JUNGSEONG U-YEO;Lo;0;L;;;;;N;;;;;
+D7B6;HANGUL JUNGSEONG U-I-I;Lo;0;L;;;;;N;;;;;
+D7B7;HANGUL JUNGSEONG YU-AE;Lo;0;L;;;;;N;;;;;
+D7B8;HANGUL JUNGSEONG YU-O;Lo;0;L;;;;;N;;;;;
+D7B9;HANGUL JUNGSEONG EU-A;Lo;0;L;;;;;N;;;;;
+D7BA;HANGUL JUNGSEONG EU-EO;Lo;0;L;;;;;N;;;;;
+D7BB;HANGUL JUNGSEONG EU-E;Lo;0;L;;;;;N;;;;;
+D7BC;HANGUL JUNGSEONG EU-O;Lo;0;L;;;;;N;;;;;
+D7BD;HANGUL JUNGSEONG I-YA-O;Lo;0;L;;;;;N;;;;;
+D7BE;HANGUL JUNGSEONG I-YAE;Lo;0;L;;;;;N;;;;;
+D7BF;HANGUL JUNGSEONG I-YEO;Lo;0;L;;;;;N;;;;;
+D7C0;HANGUL JUNGSEONG I-YE;Lo;0;L;;;;;N;;;;;
+D7C1;HANGUL JUNGSEONG I-O-I;Lo;0;L;;;;;N;;;;;
+D7C2;HANGUL JUNGSEONG I-YO;Lo;0;L;;;;;N;;;;;
+D7C3;HANGUL JUNGSEONG I-YU;Lo;0;L;;;;;N;;;;;
+D7C4;HANGUL JUNGSEONG I-I;Lo;0;L;;;;;N;;;;;
+D7C5;HANGUL JUNGSEONG ARAEA-A;Lo;0;L;;;;;N;;;;;
+D7C6;HANGUL JUNGSEONG ARAEA-E;Lo;0;L;;;;;N;;;;;
+D7CB;HANGUL JONGSEONG NIEUN-RIEUL;Lo;0;L;;;;;N;;;;;
+D7CC;HANGUL JONGSEONG NIEUN-CHIEUCH;Lo;0;L;;;;;N;;;;;
+D7CD;HANGUL JONGSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;;;;
+D7CE;HANGUL JONGSEONG SSANGTIKEUT-PIEUP;Lo;0;L;;;;;N;;;;;
+D7CF;HANGUL JONGSEONG TIKEUT-PIEUP;Lo;0;L;;;;;N;;;;;
+D7D0;HANGUL JONGSEONG TIKEUT-SIOS;Lo;0;L;;;;;N;;;;;
+D7D1;HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+D7D2;HANGUL JONGSEONG TIKEUT-CIEUC;Lo;0;L;;;;;N;;;;;
+D7D3;HANGUL JONGSEONG TIKEUT-CHIEUCH;Lo;0;L;;;;;N;;;;;
+D7D4;HANGUL JONGSEONG TIKEUT-THIEUTH;Lo;0;L;;;;;N;;;;;
+D7D5;HANGUL JONGSEONG RIEUL-SSANGKIYEOK;Lo;0;L;;;;;N;;;;;
+D7D6;HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH;Lo;0;L;;;;;N;;;;;
+D7D7;HANGUL JONGSEONG SSANGRIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;;
+D7D8;HANGUL JONGSEONG RIEUL-MIEUM-HIEUH;Lo;0;L;;;;;N;;;;;
+D7D9;HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;;
+D7DA;HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;;
+D7DB;HANGUL JONGSEONG RIEUL-YESIEUNG;Lo;0;L;;;;;N;;;;;
+D7DC;HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH;Lo;0;L;;;;;N;;;;;
+D7DD;HANGUL JONGSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;;
+D7DE;HANGUL JONGSEONG MIEUM-NIEUN;Lo;0;L;;;;;N;;;;;
+D7DF;HANGUL JONGSEONG MIEUM-SSANGNIEUN;Lo;0;L;;;;;N;;;;;
+D7E0;HANGUL JONGSEONG SSANGMIEUM;Lo;0;L;;;;;N;;;;;
+D7E1;HANGUL JONGSEONG MIEUM-PIEUP-SIOS;Lo;0;L;;;;;N;;;;;
+D7E2;HANGUL JONGSEONG MIEUM-CIEUC;Lo;0;L;;;;;N;;;;;
+D7E3;HANGUL JONGSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;;
+D7E4;HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH;Lo;0;L;;;;;N;;;;;
+D7E5;HANGUL JONGSEONG PIEUP-MIEUM;Lo;0;L;;;;;N;;;;;
+D7E6;HANGUL JONGSEONG SSANGPIEUP;Lo;0;L;;;;;N;;;;;
+D7E7;HANGUL JONGSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+D7E8;HANGUL JONGSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;;
+D7E9;HANGUL JONGSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;;
+D7EA;HANGUL JONGSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;;
+D7EB;HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+D7EC;HANGUL JONGSEONG SSANGSIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+D7ED;HANGUL JONGSEONG SSANGSIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+D7EE;HANGUL JONGSEONG SIOS-PANSIOS;Lo;0;L;;;;;N;;;;;
+D7EF;HANGUL JONGSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;;
+D7F0;HANGUL JONGSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;;
+D7F1;HANGUL JONGSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;;
+D7F2;HANGUL JONGSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;;
+D7F3;HANGUL JONGSEONG PANSIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+D7F4;HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+D7F5;HANGUL JONGSEONG YESIEUNG-MIEUM;Lo;0;L;;;;;N;;;;;
+D7F6;HANGUL JONGSEONG YESIEUNG-HIEUH;Lo;0;L;;;;;N;;;;;
+D7F7;HANGUL JONGSEONG CIEUC-PIEUP;Lo;0;L;;;;;N;;;;;
+D7F8;HANGUL JONGSEONG CIEUC-SSANGPIEUP;Lo;0;L;;;;;N;;;;;
+D7F9;HANGUL JONGSEONG SSANGCIEUC;Lo;0;L;;;;;N;;;;;
+D7FA;HANGUL JONGSEONG PHIEUPH-SIOS;Lo;0;L;;;;;N;;;;;
+D7FB;HANGUL JONGSEONG PHIEUPH-THIEUTH;Lo;0;L;;;;;N;;;;;
+D800;<Non Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;;
+DB7F;<Non Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;;
+DB80;<Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;;
+DBFF;<Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;;
+DC00;<Low Surrogate, First>;Cs;0;L;;;;;N;;;;;
+DFFF;<Low Surrogate, Last>;Cs;0;L;;;;;N;;;;;
+E000;<Private Use, First>;Co;0;L;;;;;N;;;;;
+F8FF;<Private Use, Last>;Co;0;L;;;;;N;;;;;
+F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;;
+F901;CJK COMPATIBILITY IDEOGRAPH-F901;Lo;0;L;66F4;;;;N;;;;;
+F902;CJK COMPATIBILITY IDEOGRAPH-F902;Lo;0;L;8ECA;;;;N;;;;;
+F903;CJK COMPATIBILITY IDEOGRAPH-F903;Lo;0;L;8CC8;;;;N;;;;;
+F904;CJK COMPATIBILITY IDEOGRAPH-F904;Lo;0;L;6ED1;;;;N;;;;;
+F905;CJK COMPATIBILITY IDEOGRAPH-F905;Lo;0;L;4E32;;;;N;;;;;
+F906;CJK COMPATIBILITY IDEOGRAPH-F906;Lo;0;L;53E5;;;;N;;;;;
+F907;CJK COMPATIBILITY IDEOGRAPH-F907;Lo;0;L;9F9C;;;;N;;;;;
+F908;CJK COMPATIBILITY IDEOGRAPH-F908;Lo;0;L;9F9C;;;;N;;;;;
+F909;CJK COMPATIBILITY IDEOGRAPH-F909;Lo;0;L;5951;;;;N;;;;;
+F90A;CJK COMPATIBILITY IDEOGRAPH-F90A;Lo;0;L;91D1;;;;N;;;;;
+F90B;CJK COMPATIBILITY IDEOGRAPH-F90B;Lo;0;L;5587;;;;N;;;;;
+F90C;CJK COMPATIBILITY IDEOGRAPH-F90C;Lo;0;L;5948;;;;N;;;;;
+F90D;CJK COMPATIBILITY IDEOGRAPH-F90D;Lo;0;L;61F6;;;;N;;;;;
+F90E;CJK COMPATIBILITY IDEOGRAPH-F90E;Lo;0;L;7669;;;;N;;;;;
+F90F;CJK COMPATIBILITY IDEOGRAPH-F90F;Lo;0;L;7F85;;;;N;;;;;
+F910;CJK COMPATIBILITY IDEOGRAPH-F910;Lo;0;L;863F;;;;N;;;;;
+F911;CJK COMPATIBILITY IDEOGRAPH-F911;Lo;0;L;87BA;;;;N;;;;;
+F912;CJK COMPATIBILITY IDEOGRAPH-F912;Lo;0;L;88F8;;;;N;;;;;
+F913;CJK COMPATIBILITY IDEOGRAPH-F913;Lo;0;L;908F;;;;N;;;;;
+F914;CJK COMPATIBILITY IDEOGRAPH-F914;Lo;0;L;6A02;;;;N;;;;;
+F915;CJK COMPATIBILITY IDEOGRAPH-F915;Lo;0;L;6D1B;;;;N;;;;;
+F916;CJK COMPATIBILITY IDEOGRAPH-F916;Lo;0;L;70D9;;;;N;;;;;
+F917;CJK COMPATIBILITY IDEOGRAPH-F917;Lo;0;L;73DE;;;;N;;;;;
+F918;CJK COMPATIBILITY IDEOGRAPH-F918;Lo;0;L;843D;;;;N;;;;;
+F919;CJK COMPATIBILITY IDEOGRAPH-F919;Lo;0;L;916A;;;;N;;;;;
+F91A;CJK COMPATIBILITY IDEOGRAPH-F91A;Lo;0;L;99F1;;;;N;;;;;
+F91B;CJK COMPATIBILITY IDEOGRAPH-F91B;Lo;0;L;4E82;;;;N;;;;;
+F91C;CJK COMPATIBILITY IDEOGRAPH-F91C;Lo;0;L;5375;;;;N;;;;;
+F91D;CJK COMPATIBILITY IDEOGRAPH-F91D;Lo;0;L;6B04;;;;N;;;;;
+F91E;CJK COMPATIBILITY IDEOGRAPH-F91E;Lo;0;L;721B;;;;N;;;;;
+F91F;CJK COMPATIBILITY IDEOGRAPH-F91F;Lo;0;L;862D;;;;N;;;;;
+F920;CJK COMPATIBILITY IDEOGRAPH-F920;Lo;0;L;9E1E;;;;N;;;;;
+F921;CJK COMPATIBILITY IDEOGRAPH-F921;Lo;0;L;5D50;;;;N;;;;;
+F922;CJK COMPATIBILITY IDEOGRAPH-F922;Lo;0;L;6FEB;;;;N;;;;;
+F923;CJK COMPATIBILITY IDEOGRAPH-F923;Lo;0;L;85CD;;;;N;;;;;
+F924;CJK COMPATIBILITY IDEOGRAPH-F924;Lo;0;L;8964;;;;N;;;;;
+F925;CJK COMPATIBILITY IDEOGRAPH-F925;Lo;0;L;62C9;;;;N;;;;;
+F926;CJK COMPATIBILITY IDEOGRAPH-F926;Lo;0;L;81D8;;;;N;;;;;
+F927;CJK COMPATIBILITY IDEOGRAPH-F927;Lo;0;L;881F;;;;N;;;;;
+F928;CJK COMPATIBILITY IDEOGRAPH-F928;Lo;0;L;5ECA;;;;N;;;;;
+F929;CJK COMPATIBILITY IDEOGRAPH-F929;Lo;0;L;6717;;;;N;;;;;
+F92A;CJK COMPATIBILITY IDEOGRAPH-F92A;Lo;0;L;6D6A;;;;N;;;;;
+F92B;CJK COMPATIBILITY IDEOGRAPH-F92B;Lo;0;L;72FC;;;;N;;;;;
+F92C;CJK COMPATIBILITY IDEOGRAPH-F92C;Lo;0;L;90CE;;;;N;;;;;
+F92D;CJK COMPATIBILITY IDEOGRAPH-F92D;Lo;0;L;4F86;;;;N;;;;;
+F92E;CJK COMPATIBILITY IDEOGRAPH-F92E;Lo;0;L;51B7;;;;N;;;;;
+F92F;CJK COMPATIBILITY IDEOGRAPH-F92F;Lo;0;L;52DE;;;;N;;;;;
+F930;CJK COMPATIBILITY IDEOGRAPH-F930;Lo;0;L;64C4;;;;N;;;;;
+F931;CJK COMPATIBILITY IDEOGRAPH-F931;Lo;0;L;6AD3;;;;N;;;;;
+F932;CJK COMPATIBILITY IDEOGRAPH-F932;Lo;0;L;7210;;;;N;;;;;
+F933;CJK COMPATIBILITY IDEOGRAPH-F933;Lo;0;L;76E7;;;;N;;;;;
+F934;CJK COMPATIBILITY IDEOGRAPH-F934;Lo;0;L;8001;;;;N;;;;;
+F935;CJK COMPATIBILITY IDEOGRAPH-F935;Lo;0;L;8606;;;;N;;;;;
+F936;CJK COMPATIBILITY IDEOGRAPH-F936;Lo;0;L;865C;;;;N;;;;;
+F937;CJK COMPATIBILITY IDEOGRAPH-F937;Lo;0;L;8DEF;;;;N;;;;;
+F938;CJK COMPATIBILITY IDEOGRAPH-F938;Lo;0;L;9732;;;;N;;;;;
+F939;CJK COMPATIBILITY IDEOGRAPH-F939;Lo;0;L;9B6F;;;;N;;;;;
+F93A;CJK COMPATIBILITY IDEOGRAPH-F93A;Lo;0;L;9DFA;;;;N;;;;;
+F93B;CJK COMPATIBILITY IDEOGRAPH-F93B;Lo;0;L;788C;;;;N;;;;;
+F93C;CJK COMPATIBILITY IDEOGRAPH-F93C;Lo;0;L;797F;;;;N;;;;;
+F93D;CJK COMPATIBILITY IDEOGRAPH-F93D;Lo;0;L;7DA0;;;;N;;;;;
+F93E;CJK COMPATIBILITY IDEOGRAPH-F93E;Lo;0;L;83C9;;;;N;;;;;
+F93F;CJK COMPATIBILITY IDEOGRAPH-F93F;Lo;0;L;9304;;;;N;;;;;
+F940;CJK COMPATIBILITY IDEOGRAPH-F940;Lo;0;L;9E7F;;;;N;;;;;
+F941;CJK COMPATIBILITY IDEOGRAPH-F941;Lo;0;L;8AD6;;;;N;;;;;
+F942;CJK COMPATIBILITY IDEOGRAPH-F942;Lo;0;L;58DF;;;;N;;;;;
+F943;CJK COMPATIBILITY IDEOGRAPH-F943;Lo;0;L;5F04;;;;N;;;;;
+F944;CJK COMPATIBILITY IDEOGRAPH-F944;Lo;0;L;7C60;;;;N;;;;;
+F945;CJK COMPATIBILITY IDEOGRAPH-F945;Lo;0;L;807E;;;;N;;;;;
+F946;CJK COMPATIBILITY IDEOGRAPH-F946;Lo;0;L;7262;;;;N;;;;;
+F947;CJK COMPATIBILITY IDEOGRAPH-F947;Lo;0;L;78CA;;;;N;;;;;
+F948;CJK COMPATIBILITY IDEOGRAPH-F948;Lo;0;L;8CC2;;;;N;;;;;
+F949;CJK COMPATIBILITY IDEOGRAPH-F949;Lo;0;L;96F7;;;;N;;;;;
+F94A;CJK COMPATIBILITY IDEOGRAPH-F94A;Lo;0;L;58D8;;;;N;;;;;
+F94B;CJK COMPATIBILITY IDEOGRAPH-F94B;Lo;0;L;5C62;;;;N;;;;;
+F94C;CJK COMPATIBILITY IDEOGRAPH-F94C;Lo;0;L;6A13;;;;N;;;;;
+F94D;CJK COMPATIBILITY IDEOGRAPH-F94D;Lo;0;L;6DDA;;;;N;;;;;
+F94E;CJK COMPATIBILITY IDEOGRAPH-F94E;Lo;0;L;6F0F;;;;N;;;;;
+F94F;CJK COMPATIBILITY IDEOGRAPH-F94F;Lo;0;L;7D2F;;;;N;;;;;
+F950;CJK COMPATIBILITY IDEOGRAPH-F950;Lo;0;L;7E37;;;;N;;;;;
+F951;CJK COMPATIBILITY IDEOGRAPH-F951;Lo;0;L;964B;;;;N;;;;;
+F952;CJK COMPATIBILITY IDEOGRAPH-F952;Lo;0;L;52D2;;;;N;;;;;
+F953;CJK COMPATIBILITY IDEOGRAPH-F953;Lo;0;L;808B;;;;N;;;;;
+F954;CJK COMPATIBILITY IDEOGRAPH-F954;Lo;0;L;51DC;;;;N;;;;;
+F955;CJK COMPATIBILITY IDEOGRAPH-F955;Lo;0;L;51CC;;;;N;;;;;
+F956;CJK COMPATIBILITY IDEOGRAPH-F956;Lo;0;L;7A1C;;;;N;;;;;
+F957;CJK COMPATIBILITY IDEOGRAPH-F957;Lo;0;L;7DBE;;;;N;;;;;
+F958;CJK COMPATIBILITY IDEOGRAPH-F958;Lo;0;L;83F1;;;;N;;;;;
+F959;CJK COMPATIBILITY IDEOGRAPH-F959;Lo;0;L;9675;;;;N;;;;;
+F95A;CJK COMPATIBILITY IDEOGRAPH-F95A;Lo;0;L;8B80;;;;N;;;;;
+F95B;CJK COMPATIBILITY IDEOGRAPH-F95B;Lo;0;L;62CF;;;;N;;;;;
+F95C;CJK COMPATIBILITY IDEOGRAPH-F95C;Lo;0;L;6A02;;;;N;;;;;
+F95D;CJK COMPATIBILITY IDEOGRAPH-F95D;Lo;0;L;8AFE;;;;N;;;;;
+F95E;CJK COMPATIBILITY IDEOGRAPH-F95E;Lo;0;L;4E39;;;;N;;;;;
+F95F;CJK COMPATIBILITY IDEOGRAPH-F95F;Lo;0;L;5BE7;;;;N;;;;;
+F960;CJK COMPATIBILITY IDEOGRAPH-F960;Lo;0;L;6012;;;;N;;;;;
+F961;CJK COMPATIBILITY IDEOGRAPH-F961;Lo;0;L;7387;;;;N;;;;;
+F962;CJK COMPATIBILITY IDEOGRAPH-F962;Lo;0;L;7570;;;;N;;;;;
+F963;CJK COMPATIBILITY IDEOGRAPH-F963;Lo;0;L;5317;;;;N;;;;;
+F964;CJK COMPATIBILITY IDEOGRAPH-F964;Lo;0;L;78FB;;;;N;;;;;
+F965;CJK COMPATIBILITY IDEOGRAPH-F965;Lo;0;L;4FBF;;;;N;;;;;
+F966;CJK COMPATIBILITY IDEOGRAPH-F966;Lo;0;L;5FA9;;;;N;;;;;
+F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;;
+F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;;
+F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;;
+F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;;
+F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;3;N;;;;;
+F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;;
+F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;;
+F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;;
+F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;;
+F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;;
+F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;;
+F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;;
+F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;10;N;;;;;
+F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;;
+F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;;
+F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;;
+F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;;
+F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;2;N;;;;;
+F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;;
+F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;;
+F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;;
+F97C;CJK COMPATIBILITY IDEOGRAPH-F97C;Lo;0;L;826F;;;;N;;;;;
+F97D;CJK COMPATIBILITY IDEOGRAPH-F97D;Lo;0;L;8AD2;;;;N;;;;;
+F97E;CJK COMPATIBILITY IDEOGRAPH-F97E;Lo;0;L;91CF;;;;N;;;;;
+F97F;CJK COMPATIBILITY IDEOGRAPH-F97F;Lo;0;L;52F5;;;;N;;;;;
+F980;CJK COMPATIBILITY IDEOGRAPH-F980;Lo;0;L;5442;;;;N;;;;;
+F981;CJK COMPATIBILITY IDEOGRAPH-F981;Lo;0;L;5973;;;;N;;;;;
+F982;CJK COMPATIBILITY IDEOGRAPH-F982;Lo;0;L;5EEC;;;;N;;;;;
+F983;CJK COMPATIBILITY IDEOGRAPH-F983;Lo;0;L;65C5;;;;N;;;;;
+F984;CJK COMPATIBILITY IDEOGRAPH-F984;Lo;0;L;6FFE;;;;N;;;;;
+F985;CJK COMPATIBILITY IDEOGRAPH-F985;Lo;0;L;792A;;;;N;;;;;
+F986;CJK COMPATIBILITY IDEOGRAPH-F986;Lo;0;L;95AD;;;;N;;;;;
+F987;CJK COMPATIBILITY IDEOGRAPH-F987;Lo;0;L;9A6A;;;;N;;;;;
+F988;CJK COMPATIBILITY IDEOGRAPH-F988;Lo;0;L;9E97;;;;N;;;;;
+F989;CJK COMPATIBILITY IDEOGRAPH-F989;Lo;0;L;9ECE;;;;N;;;;;
+F98A;CJK COMPATIBILITY IDEOGRAPH-F98A;Lo;0;L;529B;;;;N;;;;;
+F98B;CJK COMPATIBILITY IDEOGRAPH-F98B;Lo;0;L;66C6;;;;N;;;;;
+F98C;CJK COMPATIBILITY IDEOGRAPH-F98C;Lo;0;L;6B77;;;;N;;;;;
+F98D;CJK COMPATIBILITY IDEOGRAPH-F98D;Lo;0;L;8F62;;;;N;;;;;
+F98E;CJK COMPATIBILITY IDEOGRAPH-F98E;Lo;0;L;5E74;;;;N;;;;;
+F98F;CJK COMPATIBILITY IDEOGRAPH-F98F;Lo;0;L;6190;;;;N;;;;;
+F990;CJK COMPATIBILITY IDEOGRAPH-F990;Lo;0;L;6200;;;;N;;;;;
+F991;CJK COMPATIBILITY IDEOGRAPH-F991;Lo;0;L;649A;;;;N;;;;;
+F992;CJK COMPATIBILITY IDEOGRAPH-F992;Lo;0;L;6F23;;;;N;;;;;
+F993;CJK COMPATIBILITY IDEOGRAPH-F993;Lo;0;L;7149;;;;N;;;;;
+F994;CJK COMPATIBILITY IDEOGRAPH-F994;Lo;0;L;7489;;;;N;;;;;
+F995;CJK COMPATIBILITY IDEOGRAPH-F995;Lo;0;L;79CA;;;;N;;;;;
+F996;CJK COMPATIBILITY IDEOGRAPH-F996;Lo;0;L;7DF4;;;;N;;;;;
+F997;CJK COMPATIBILITY IDEOGRAPH-F997;Lo;0;L;806F;;;;N;;;;;
+F998;CJK COMPATIBILITY IDEOGRAPH-F998;Lo;0;L;8F26;;;;N;;;;;
+F999;CJK COMPATIBILITY IDEOGRAPH-F999;Lo;0;L;84EE;;;;N;;;;;
+F99A;CJK COMPATIBILITY IDEOGRAPH-F99A;Lo;0;L;9023;;;;N;;;;;
+F99B;CJK COMPATIBILITY IDEOGRAPH-F99B;Lo;0;L;934A;;;;N;;;;;
+F99C;CJK COMPATIBILITY IDEOGRAPH-F99C;Lo;0;L;5217;;;;N;;;;;
+F99D;CJK COMPATIBILITY IDEOGRAPH-F99D;Lo;0;L;52A3;;;;N;;;;;
+F99E;CJK COMPATIBILITY IDEOGRAPH-F99E;Lo;0;L;54BD;;;;N;;;;;
+F99F;CJK COMPATIBILITY IDEOGRAPH-F99F;Lo;0;L;70C8;;;;N;;;;;
+F9A0;CJK COMPATIBILITY IDEOGRAPH-F9A0;Lo;0;L;88C2;;;;N;;;;;
+F9A1;CJK COMPATIBILITY IDEOGRAPH-F9A1;Lo;0;L;8AAA;;;;N;;;;;
+F9A2;CJK COMPATIBILITY IDEOGRAPH-F9A2;Lo;0;L;5EC9;;;;N;;;;;
+F9A3;CJK COMPATIBILITY IDEOGRAPH-F9A3;Lo;0;L;5FF5;;;;N;;;;;
+F9A4;CJK COMPATIBILITY IDEOGRAPH-F9A4;Lo;0;L;637B;;;;N;;;;;
+F9A5;CJK COMPATIBILITY IDEOGRAPH-F9A5;Lo;0;L;6BAE;;;;N;;;;;
+F9A6;CJK COMPATIBILITY IDEOGRAPH-F9A6;Lo;0;L;7C3E;;;;N;;;;;
+F9A7;CJK COMPATIBILITY IDEOGRAPH-F9A7;Lo;0;L;7375;;;;N;;;;;
+F9A8;CJK COMPATIBILITY IDEOGRAPH-F9A8;Lo;0;L;4EE4;;;;N;;;;;
+F9A9;CJK COMPATIBILITY IDEOGRAPH-F9A9;Lo;0;L;56F9;;;;N;;;;;
+F9AA;CJK COMPATIBILITY IDEOGRAPH-F9AA;Lo;0;L;5BE7;;;;N;;;;;
+F9AB;CJK COMPATIBILITY IDEOGRAPH-F9AB;Lo;0;L;5DBA;;;;N;;;;;
+F9AC;CJK COMPATIBILITY IDEOGRAPH-F9AC;Lo;0;L;601C;;;;N;;;;;
+F9AD;CJK COMPATIBILITY IDEOGRAPH-F9AD;Lo;0;L;73B2;;;;N;;;;;
+F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;;
+F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;;
+F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;;
+F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;;
+F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;0;N;;;;;
+F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;;
+F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;;
+F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;;
+F9B6;CJK COMPATIBILITY IDEOGRAPH-F9B6;Lo;0;L;79AE;;;;N;;;;;
+F9B7;CJK COMPATIBILITY IDEOGRAPH-F9B7;Lo;0;L;91B4;;;;N;;;;;
+F9B8;CJK COMPATIBILITY IDEOGRAPH-F9B8;Lo;0;L;96B8;;;;N;;;;;
+F9B9;CJK COMPATIBILITY IDEOGRAPH-F9B9;Lo;0;L;60E1;;;;N;;;;;
+F9BA;CJK COMPATIBILITY IDEOGRAPH-F9BA;Lo;0;L;4E86;;;;N;;;;;
+F9BB;CJK COMPATIBILITY IDEOGRAPH-F9BB;Lo;0;L;50DA;;;;N;;;;;
+F9BC;CJK COMPATIBILITY IDEOGRAPH-F9BC;Lo;0;L;5BEE;;;;N;;;;;
+F9BD;CJK COMPATIBILITY IDEOGRAPH-F9BD;Lo;0;L;5C3F;;;;N;;;;;
+F9BE;CJK COMPATIBILITY IDEOGRAPH-F9BE;Lo;0;L;6599;;;;N;;;;;
+F9BF;CJK COMPATIBILITY IDEOGRAPH-F9BF;Lo;0;L;6A02;;;;N;;;;;
+F9C0;CJK COMPATIBILITY IDEOGRAPH-F9C0;Lo;0;L;71CE;;;;N;;;;;
+F9C1;CJK COMPATIBILITY IDEOGRAPH-F9C1;Lo;0;L;7642;;;;N;;;;;
+F9C2;CJK COMPATIBILITY IDEOGRAPH-F9C2;Lo;0;L;84FC;;;;N;;;;;
+F9C3;CJK COMPATIBILITY IDEOGRAPH-F9C3;Lo;0;L;907C;;;;N;;;;;
+F9C4;CJK COMPATIBILITY IDEOGRAPH-F9C4;Lo;0;L;9F8D;;;;N;;;;;
+F9C5;CJK COMPATIBILITY IDEOGRAPH-F9C5;Lo;0;L;6688;;;;N;;;;;
+F9C6;CJK COMPATIBILITY IDEOGRAPH-F9C6;Lo;0;L;962E;;;;N;;;;;
+F9C7;CJK COMPATIBILITY IDEOGRAPH-F9C7;Lo;0;L;5289;;;;N;;;;;
+F9C8;CJK COMPATIBILITY IDEOGRAPH-F9C8;Lo;0;L;677B;;;;N;;;;;
+F9C9;CJK COMPATIBILITY IDEOGRAPH-F9C9;Lo;0;L;67F3;;;;N;;;;;
+F9CA;CJK COMPATIBILITY IDEOGRAPH-F9CA;Lo;0;L;6D41;;;;N;;;;;
+F9CB;CJK COMPATIBILITY IDEOGRAPH-F9CB;Lo;0;L;6E9C;;;;N;;;;;
+F9CC;CJK COMPATIBILITY IDEOGRAPH-F9CC;Lo;0;L;7409;;;;N;;;;;
+F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;;
+F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;;
+F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;;
+F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;;
+F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;6;N;;;;;
+F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;;
+F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;6;N;;;;;
+F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;;
+F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;;
+F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;;
+F9D7;CJK COMPATIBILITY IDEOGRAPH-F9D7;Lo;0;L;8F2A;;;;N;;;;;
+F9D8;CJK COMPATIBILITY IDEOGRAPH-F9D8;Lo;0;L;5F8B;;;;N;;;;;
+F9D9;CJK COMPATIBILITY IDEOGRAPH-F9D9;Lo;0;L;6144;;;;N;;;;;
+F9DA;CJK COMPATIBILITY IDEOGRAPH-F9DA;Lo;0;L;6817;;;;N;;;;;
+F9DB;CJK COMPATIBILITY IDEOGRAPH-F9DB;Lo;0;L;7387;;;;N;;;;;
+F9DC;CJK COMPATIBILITY IDEOGRAPH-F9DC;Lo;0;L;9686;;;;N;;;;;
+F9DD;CJK COMPATIBILITY IDEOGRAPH-F9DD;Lo;0;L;5229;;;;N;;;;;
+F9DE;CJK COMPATIBILITY IDEOGRAPH-F9DE;Lo;0;L;540F;;;;N;;;;;
+F9DF;CJK COMPATIBILITY IDEOGRAPH-F9DF;Lo;0;L;5C65;;;;N;;;;;
+F9E0;CJK COMPATIBILITY IDEOGRAPH-F9E0;Lo;0;L;6613;;;;N;;;;;
+F9E1;CJK COMPATIBILITY IDEOGRAPH-F9E1;Lo;0;L;674E;;;;N;;;;;
+F9E2;CJK COMPATIBILITY IDEOGRAPH-F9E2;Lo;0;L;68A8;;;;N;;;;;
+F9E3;CJK COMPATIBILITY IDEOGRAPH-F9E3;Lo;0;L;6CE5;;;;N;;;;;
+F9E4;CJK COMPATIBILITY IDEOGRAPH-F9E4;Lo;0;L;7406;;;;N;;;;;
+F9E5;CJK COMPATIBILITY IDEOGRAPH-F9E5;Lo;0;L;75E2;;;;N;;;;;
+F9E6;CJK COMPATIBILITY IDEOGRAPH-F9E6;Lo;0;L;7F79;;;;N;;;;;
+F9E7;CJK COMPATIBILITY IDEOGRAPH-F9E7;Lo;0;L;88CF;;;;N;;;;;
+F9E8;CJK COMPATIBILITY IDEOGRAPH-F9E8;Lo;0;L;88E1;;;;N;;;;;
+F9E9;CJK COMPATIBILITY IDEOGRAPH-F9E9;Lo;0;L;91CC;;;;N;;;;;
+F9EA;CJK COMPATIBILITY IDEOGRAPH-F9EA;Lo;0;L;96E2;;;;N;;;;;
+F9EB;CJK COMPATIBILITY IDEOGRAPH-F9EB;Lo;0;L;533F;;;;N;;;;;
+F9EC;CJK COMPATIBILITY IDEOGRAPH-F9EC;Lo;0;L;6EBA;;;;N;;;;;
+F9ED;CJK COMPATIBILITY IDEOGRAPH-F9ED;Lo;0;L;541D;;;;N;;;;;
+F9EE;CJK COMPATIBILITY IDEOGRAPH-F9EE;Lo;0;L;71D0;;;;N;;;;;
+F9EF;CJK COMPATIBILITY IDEOGRAPH-F9EF;Lo;0;L;7498;;;;N;;;;;
+F9F0;CJK COMPATIBILITY IDEOGRAPH-F9F0;Lo;0;L;85FA;;;;N;;;;;
+F9F1;CJK COMPATIBILITY IDEOGRAPH-F9F1;Lo;0;L;96A3;;;;N;;;;;
+F9F2;CJK COMPATIBILITY IDEOGRAPH-F9F2;Lo;0;L;9C57;;;;N;;;;;
+F9F3;CJK COMPATIBILITY IDEOGRAPH-F9F3;Lo;0;L;9E9F;;;;N;;;;;
+F9F4;CJK COMPATIBILITY IDEOGRAPH-F9F4;Lo;0;L;6797;;;;N;;;;;
+F9F5;CJK COMPATIBILITY IDEOGRAPH-F9F5;Lo;0;L;6DCB;;;;N;;;;;
+F9F6;CJK COMPATIBILITY IDEOGRAPH-F9F6;Lo;0;L;81E8;;;;N;;;;;
+F9F7;CJK COMPATIBILITY IDEOGRAPH-F9F7;Lo;0;L;7ACB;;;;N;;;;;
+F9F8;CJK COMPATIBILITY IDEOGRAPH-F9F8;Lo;0;L;7B20;;;;N;;;;;
+F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;;
+F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;;
+F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;;
+F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;;
+F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;10;N;;;;;
+F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;;
+F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;;
+FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;;
+FA01;CJK COMPATIBILITY IDEOGRAPH-FA01;Lo;0;L;5EA6;;;;N;;;;;
+FA02;CJK COMPATIBILITY IDEOGRAPH-FA02;Lo;0;L;62D3;;;;N;;;;;
+FA03;CJK COMPATIBILITY IDEOGRAPH-FA03;Lo;0;L;7CD6;;;;N;;;;;
+FA04;CJK COMPATIBILITY IDEOGRAPH-FA04;Lo;0;L;5B85;;;;N;;;;;
+FA05;CJK COMPATIBILITY IDEOGRAPH-FA05;Lo;0;L;6D1E;;;;N;;;;;
+FA06;CJK COMPATIBILITY IDEOGRAPH-FA06;Lo;0;L;66B4;;;;N;;;;;
+FA07;CJK COMPATIBILITY IDEOGRAPH-FA07;Lo;0;L;8F3B;;;;N;;;;;
+FA08;CJK COMPATIBILITY IDEOGRAPH-FA08;Lo;0;L;884C;;;;N;;;;;
+FA09;CJK COMPATIBILITY IDEOGRAPH-FA09;Lo;0;L;964D;;;;N;;;;;
+FA0A;CJK COMPATIBILITY IDEOGRAPH-FA0A;Lo;0;L;898B;;;;N;;;;;
+FA0B;CJK COMPATIBILITY IDEOGRAPH-FA0B;Lo;0;L;5ED3;;;;N;;;;;
+FA0C;CJK COMPATIBILITY IDEOGRAPH-FA0C;Lo;0;L;5140;;;;N;;;;;
+FA0D;CJK COMPATIBILITY IDEOGRAPH-FA0D;Lo;0;L;55C0;;;;N;;;;;
+FA0E;CJK COMPATIBILITY IDEOGRAPH-FA0E;Lo;0;L;;;;;N;;;;;
+FA0F;CJK COMPATIBILITY IDEOGRAPH-FA0F;Lo;0;L;;;;;N;;;;;
+FA10;CJK COMPATIBILITY IDEOGRAPH-FA10;Lo;0;L;585A;;;;N;;;;;
+FA11;CJK COMPATIBILITY IDEOGRAPH-FA11;Lo;0;L;;;;;N;;;;;
+FA12;CJK COMPATIBILITY IDEOGRAPH-FA12;Lo;0;L;6674;;;;N;;;;;
+FA13;CJK COMPATIBILITY IDEOGRAPH-FA13;Lo;0;L;;;;;N;;;;;
+FA14;CJK COMPATIBILITY IDEOGRAPH-FA14;Lo;0;L;;;;;N;;;;;
+FA15;CJK COMPATIBILITY IDEOGRAPH-FA15;Lo;0;L;51DE;;;;N;;;;;
+FA16;CJK COMPATIBILITY IDEOGRAPH-FA16;Lo;0;L;732A;;;;N;;;;;
+FA17;CJK COMPATIBILITY IDEOGRAPH-FA17;Lo;0;L;76CA;;;;N;;;;;
+FA18;CJK COMPATIBILITY IDEOGRAPH-FA18;Lo;0;L;793C;;;;N;;;;;
+FA19;CJK COMPATIBILITY IDEOGRAPH-FA19;Lo;0;L;795E;;;;N;;;;;
+FA1A;CJK COMPATIBILITY IDEOGRAPH-FA1A;Lo;0;L;7965;;;;N;;;;;
+FA1B;CJK COMPATIBILITY IDEOGRAPH-FA1B;Lo;0;L;798F;;;;N;;;;;
+FA1C;CJK COMPATIBILITY IDEOGRAPH-FA1C;Lo;0;L;9756;;;;N;;;;;
+FA1D;CJK COMPATIBILITY IDEOGRAPH-FA1D;Lo;0;L;7CBE;;;;N;;;;;
+FA1E;CJK COMPATIBILITY IDEOGRAPH-FA1E;Lo;0;L;7FBD;;;;N;;;;;
+FA1F;CJK COMPATIBILITY IDEOGRAPH-FA1F;Lo;0;L;;;;;N;;;;;
+FA20;CJK COMPATIBILITY IDEOGRAPH-FA20;Lo;0;L;8612;;;;N;;;;;
+FA21;CJK COMPATIBILITY IDEOGRAPH-FA21;Lo;0;L;;;;;N;;;;;
+FA22;CJK COMPATIBILITY IDEOGRAPH-FA22;Lo;0;L;8AF8;;;;N;;;;;
+FA23;CJK COMPATIBILITY IDEOGRAPH-FA23;Lo;0;L;;;;;N;;;;;
+FA24;CJK COMPATIBILITY IDEOGRAPH-FA24;Lo;0;L;;;;;N;;;;;
+FA25;CJK COMPATIBILITY IDEOGRAPH-FA25;Lo;0;L;9038;;;;N;;;;;
+FA26;CJK COMPATIBILITY IDEOGRAPH-FA26;Lo;0;L;90FD;;;;N;;;;;
+FA27;CJK COMPATIBILITY IDEOGRAPH-FA27;Lo;0;L;;;;;N;;;;;
+FA28;CJK COMPATIBILITY IDEOGRAPH-FA28;Lo;0;L;;;;;N;;;;;
+FA29;CJK COMPATIBILITY IDEOGRAPH-FA29;Lo;0;L;;;;;N;;;;;
+FA2A;CJK COMPATIBILITY IDEOGRAPH-FA2A;Lo;0;L;98EF;;;;N;;;;;
+FA2B;CJK COMPATIBILITY IDEOGRAPH-FA2B;Lo;0;L;98FC;;;;N;;;;;
+FA2C;CJK COMPATIBILITY IDEOGRAPH-FA2C;Lo;0;L;9928;;;;N;;;;;
+FA2D;CJK COMPATIBILITY IDEOGRAPH-FA2D;Lo;0;L;9DB4;;;;N;;;;;
+FA2E;CJK COMPATIBILITY IDEOGRAPH-FA2E;Lo;0;L;90DE;;;;N;;;;;
+FA2F;CJK COMPATIBILITY IDEOGRAPH-FA2F;Lo;0;L;96B7;;;;N;;;;;
+FA30;CJK COMPATIBILITY IDEOGRAPH-FA30;Lo;0;L;4FAE;;;;N;;;;;
+FA31;CJK COMPATIBILITY IDEOGRAPH-FA31;Lo;0;L;50E7;;;;N;;;;;
+FA32;CJK COMPATIBILITY IDEOGRAPH-FA32;Lo;0;L;514D;;;;N;;;;;
+FA33;CJK COMPATIBILITY IDEOGRAPH-FA33;Lo;0;L;52C9;;;;N;;;;;
+FA34;CJK COMPATIBILITY IDEOGRAPH-FA34;Lo;0;L;52E4;;;;N;;;;;
+FA35;CJK COMPATIBILITY IDEOGRAPH-FA35;Lo;0;L;5351;;;;N;;;;;
+FA36;CJK COMPATIBILITY IDEOGRAPH-FA36;Lo;0;L;559D;;;;N;;;;;
+FA37;CJK COMPATIBILITY IDEOGRAPH-FA37;Lo;0;L;5606;;;;N;;;;;
+FA38;CJK COMPATIBILITY IDEOGRAPH-FA38;Lo;0;L;5668;;;;N;;;;;
+FA39;CJK COMPATIBILITY IDEOGRAPH-FA39;Lo;0;L;5840;;;;N;;;;;
+FA3A;CJK COMPATIBILITY IDEOGRAPH-FA3A;Lo;0;L;58A8;;;;N;;;;;
+FA3B;CJK COMPATIBILITY IDEOGRAPH-FA3B;Lo;0;L;5C64;;;;N;;;;;
+FA3C;CJK COMPATIBILITY IDEOGRAPH-FA3C;Lo;0;L;5C6E;;;;N;;;;;
+FA3D;CJK COMPATIBILITY IDEOGRAPH-FA3D;Lo;0;L;6094;;;;N;;;;;
+FA3E;CJK COMPATIBILITY IDEOGRAPH-FA3E;Lo;0;L;6168;;;;N;;;;;
+FA3F;CJK COMPATIBILITY IDEOGRAPH-FA3F;Lo;0;L;618E;;;;N;;;;;
+FA40;CJK COMPATIBILITY IDEOGRAPH-FA40;Lo;0;L;61F2;;;;N;;;;;
+FA41;CJK COMPATIBILITY IDEOGRAPH-FA41;Lo;0;L;654F;;;;N;;;;;
+FA42;CJK COMPATIBILITY IDEOGRAPH-FA42;Lo;0;L;65E2;;;;N;;;;;
+FA43;CJK COMPATIBILITY IDEOGRAPH-FA43;Lo;0;L;6691;;;;N;;;;;
+FA44;CJK COMPATIBILITY IDEOGRAPH-FA44;Lo;0;L;6885;;;;N;;;;;
+FA45;CJK COMPATIBILITY IDEOGRAPH-FA45;Lo;0;L;6D77;;;;N;;;;;
+FA46;CJK COMPATIBILITY IDEOGRAPH-FA46;Lo;0;L;6E1A;;;;N;;;;;
+FA47;CJK COMPATIBILITY IDEOGRAPH-FA47;Lo;0;L;6F22;;;;N;;;;;
+FA48;CJK COMPATIBILITY IDEOGRAPH-FA48;Lo;0;L;716E;;;;N;;;;;
+FA49;CJK COMPATIBILITY IDEOGRAPH-FA49;Lo;0;L;722B;;;;N;;;;;
+FA4A;CJK COMPATIBILITY IDEOGRAPH-FA4A;Lo;0;L;7422;;;;N;;;;;
+FA4B;CJK COMPATIBILITY IDEOGRAPH-FA4B;Lo;0;L;7891;;;;N;;;;;
+FA4C;CJK COMPATIBILITY IDEOGRAPH-FA4C;Lo;0;L;793E;;;;N;;;;;
+FA4D;CJK COMPATIBILITY IDEOGRAPH-FA4D;Lo;0;L;7949;;;;N;;;;;
+FA4E;CJK COMPATIBILITY IDEOGRAPH-FA4E;Lo;0;L;7948;;;;N;;;;;
+FA4F;CJK COMPATIBILITY IDEOGRAPH-FA4F;Lo;0;L;7950;;;;N;;;;;
+FA50;CJK COMPATIBILITY IDEOGRAPH-FA50;Lo;0;L;7956;;;;N;;;;;
+FA51;CJK COMPATIBILITY IDEOGRAPH-FA51;Lo;0;L;795D;;;;N;;;;;
+FA52;CJK COMPATIBILITY IDEOGRAPH-FA52;Lo;0;L;798D;;;;N;;;;;
+FA53;CJK COMPATIBILITY IDEOGRAPH-FA53;Lo;0;L;798E;;;;N;;;;;
+FA54;CJK COMPATIBILITY IDEOGRAPH-FA54;Lo;0;L;7A40;;;;N;;;;;
+FA55;CJK COMPATIBILITY IDEOGRAPH-FA55;Lo;0;L;7A81;;;;N;;;;;
+FA56;CJK COMPATIBILITY IDEOGRAPH-FA56;Lo;0;L;7BC0;;;;N;;;;;
+FA57;CJK COMPATIBILITY IDEOGRAPH-FA57;Lo;0;L;7DF4;;;;N;;;;;
+FA58;CJK COMPATIBILITY IDEOGRAPH-FA58;Lo;0;L;7E09;;;;N;;;;;
+FA59;CJK COMPATIBILITY IDEOGRAPH-FA59;Lo;0;L;7E41;;;;N;;;;;
+FA5A;CJK COMPATIBILITY IDEOGRAPH-FA5A;Lo;0;L;7F72;;;;N;;;;;
+FA5B;CJK COMPATIBILITY IDEOGRAPH-FA5B;Lo;0;L;8005;;;;N;;;;;
+FA5C;CJK COMPATIBILITY IDEOGRAPH-FA5C;Lo;0;L;81ED;;;;N;;;;;
+FA5D;CJK COMPATIBILITY IDEOGRAPH-FA5D;Lo;0;L;8279;;;;N;;;;;
+FA5E;CJK COMPATIBILITY IDEOGRAPH-FA5E;Lo;0;L;8279;;;;N;;;;;
+FA5F;CJK COMPATIBILITY IDEOGRAPH-FA5F;Lo;0;L;8457;;;;N;;;;;
+FA60;CJK COMPATIBILITY IDEOGRAPH-FA60;Lo;0;L;8910;;;;N;;;;;
+FA61;CJK COMPATIBILITY IDEOGRAPH-FA61;Lo;0;L;8996;;;;N;;;;;
+FA62;CJK COMPATIBILITY IDEOGRAPH-FA62;Lo;0;L;8B01;;;;N;;;;;
+FA63;CJK COMPATIBILITY IDEOGRAPH-FA63;Lo;0;L;8B39;;;;N;;;;;
+FA64;CJK COMPATIBILITY IDEOGRAPH-FA64;Lo;0;L;8CD3;;;;N;;;;;
+FA65;CJK COMPATIBILITY IDEOGRAPH-FA65;Lo;0;L;8D08;;;;N;;;;;
+FA66;CJK COMPATIBILITY IDEOGRAPH-FA66;Lo;0;L;8FB6;;;;N;;;;;
+FA67;CJK COMPATIBILITY IDEOGRAPH-FA67;Lo;0;L;9038;;;;N;;;;;
+FA68;CJK COMPATIBILITY IDEOGRAPH-FA68;Lo;0;L;96E3;;;;N;;;;;
+FA69;CJK COMPATIBILITY IDEOGRAPH-FA69;Lo;0;L;97FF;;;;N;;;;;
+FA6A;CJK COMPATIBILITY IDEOGRAPH-FA6A;Lo;0;L;983B;;;;N;;;;;
+FA6B;CJK COMPATIBILITY IDEOGRAPH-FA6B;Lo;0;L;6075;;;;N;;;;;
+FA6C;CJK COMPATIBILITY IDEOGRAPH-FA6C;Lo;0;L;242EE;;;;N;;;;;
+FA6D;CJK COMPATIBILITY IDEOGRAPH-FA6D;Lo;0;L;8218;;;;N;;;;;
+FA70;CJK COMPATIBILITY IDEOGRAPH-FA70;Lo;0;L;4E26;;;;N;;;;;
+FA71;CJK COMPATIBILITY IDEOGRAPH-FA71;Lo;0;L;51B5;;;;N;;;;;
+FA72;CJK COMPATIBILITY IDEOGRAPH-FA72;Lo;0;L;5168;;;;N;;;;;
+FA73;CJK COMPATIBILITY IDEOGRAPH-FA73;Lo;0;L;4F80;;;;N;;;;;
+FA74;CJK COMPATIBILITY IDEOGRAPH-FA74;Lo;0;L;5145;;;;N;;;;;
+FA75;CJK COMPATIBILITY IDEOGRAPH-FA75;Lo;0;L;5180;;;;N;;;;;
+FA76;CJK COMPATIBILITY IDEOGRAPH-FA76;Lo;0;L;52C7;;;;N;;;;;
+FA77;CJK COMPATIBILITY IDEOGRAPH-FA77;Lo;0;L;52FA;;;;N;;;;;
+FA78;CJK COMPATIBILITY IDEOGRAPH-FA78;Lo;0;L;559D;;;;N;;;;;
+FA79;CJK COMPATIBILITY IDEOGRAPH-FA79;Lo;0;L;5555;;;;N;;;;;
+FA7A;CJK COMPATIBILITY IDEOGRAPH-FA7A;Lo;0;L;5599;;;;N;;;;;
+FA7B;CJK COMPATIBILITY IDEOGRAPH-FA7B;Lo;0;L;55E2;;;;N;;;;;
+FA7C;CJK COMPATIBILITY IDEOGRAPH-FA7C;Lo;0;L;585A;;;;N;;;;;
+FA7D;CJK COMPATIBILITY IDEOGRAPH-FA7D;Lo;0;L;58B3;;;;N;;;;;
+FA7E;CJK COMPATIBILITY IDEOGRAPH-FA7E;Lo;0;L;5944;;;;N;;;;;
+FA7F;CJK COMPATIBILITY IDEOGRAPH-FA7F;Lo;0;L;5954;;;;N;;;;;
+FA80;CJK COMPATIBILITY IDEOGRAPH-FA80;Lo;0;L;5A62;;;;N;;;;;
+FA81;CJK COMPATIBILITY IDEOGRAPH-FA81;Lo;0;L;5B28;;;;N;;;;;
+FA82;CJK COMPATIBILITY IDEOGRAPH-FA82;Lo;0;L;5ED2;;;;N;;;;;
+FA83;CJK COMPATIBILITY IDEOGRAPH-FA83;Lo;0;L;5ED9;;;;N;;;;;
+FA84;CJK COMPATIBILITY IDEOGRAPH-FA84;Lo;0;L;5F69;;;;N;;;;;
+FA85;CJK COMPATIBILITY IDEOGRAPH-FA85;Lo;0;L;5FAD;;;;N;;;;;
+FA86;CJK COMPATIBILITY IDEOGRAPH-FA86;Lo;0;L;60D8;;;;N;;;;;
+FA87;CJK COMPATIBILITY IDEOGRAPH-FA87;Lo;0;L;614E;;;;N;;;;;
+FA88;CJK COMPATIBILITY IDEOGRAPH-FA88;Lo;0;L;6108;;;;N;;;;;
+FA89;CJK COMPATIBILITY IDEOGRAPH-FA89;Lo;0;L;618E;;;;N;;;;;
+FA8A;CJK COMPATIBILITY IDEOGRAPH-FA8A;Lo;0;L;6160;;;;N;;;;;
+FA8B;CJK COMPATIBILITY IDEOGRAPH-FA8B;Lo;0;L;61F2;;;;N;;;;;
+FA8C;CJK COMPATIBILITY IDEOGRAPH-FA8C;Lo;0;L;6234;;;;N;;;;;
+FA8D;CJK COMPATIBILITY IDEOGRAPH-FA8D;Lo;0;L;63C4;;;;N;;;;;
+FA8E;CJK COMPATIBILITY IDEOGRAPH-FA8E;Lo;0;L;641C;;;;N;;;;;
+FA8F;CJK COMPATIBILITY IDEOGRAPH-FA8F;Lo;0;L;6452;;;;N;;;;;
+FA90;CJK COMPATIBILITY IDEOGRAPH-FA90;Lo;0;L;6556;;;;N;;;;;
+FA91;CJK COMPATIBILITY IDEOGRAPH-FA91;Lo;0;L;6674;;;;N;;;;;
+FA92;CJK COMPATIBILITY IDEOGRAPH-FA92;Lo;0;L;6717;;;;N;;;;;
+FA93;CJK COMPATIBILITY IDEOGRAPH-FA93;Lo;0;L;671B;;;;N;;;;;
+FA94;CJK COMPATIBILITY IDEOGRAPH-FA94;Lo;0;L;6756;;;;N;;;;;
+FA95;CJK COMPATIBILITY IDEOGRAPH-FA95;Lo;0;L;6B79;;;;N;;;;;
+FA96;CJK COMPATIBILITY IDEOGRAPH-FA96;Lo;0;L;6BBA;;;;N;;;;;
+FA97;CJK COMPATIBILITY IDEOGRAPH-FA97;Lo;0;L;6D41;;;;N;;;;;
+FA98;CJK COMPATIBILITY IDEOGRAPH-FA98;Lo;0;L;6EDB;;;;N;;;;;
+FA99;CJK COMPATIBILITY IDEOGRAPH-FA99;Lo;0;L;6ECB;;;;N;;;;;
+FA9A;CJK COMPATIBILITY IDEOGRAPH-FA9A;Lo;0;L;6F22;;;;N;;;;;
+FA9B;CJK COMPATIBILITY IDEOGRAPH-FA9B;Lo;0;L;701E;;;;N;;;;;
+FA9C;CJK COMPATIBILITY IDEOGRAPH-FA9C;Lo;0;L;716E;;;;N;;;;;
+FA9D;CJK COMPATIBILITY IDEOGRAPH-FA9D;Lo;0;L;77A7;;;;N;;;;;
+FA9E;CJK COMPATIBILITY IDEOGRAPH-FA9E;Lo;0;L;7235;;;;N;;;;;
+FA9F;CJK COMPATIBILITY IDEOGRAPH-FA9F;Lo;0;L;72AF;;;;N;;;;;
+FAA0;CJK COMPATIBILITY IDEOGRAPH-FAA0;Lo;0;L;732A;;;;N;;;;;
+FAA1;CJK COMPATIBILITY IDEOGRAPH-FAA1;Lo;0;L;7471;;;;N;;;;;
+FAA2;CJK COMPATIBILITY IDEOGRAPH-FAA2;Lo;0;L;7506;;;;N;;;;;
+FAA3;CJK COMPATIBILITY IDEOGRAPH-FAA3;Lo;0;L;753B;;;;N;;;;;
+FAA4;CJK COMPATIBILITY IDEOGRAPH-FAA4;Lo;0;L;761D;;;;N;;;;;
+FAA5;CJK COMPATIBILITY IDEOGRAPH-FAA5;Lo;0;L;761F;;;;N;;;;;
+FAA6;CJK COMPATIBILITY IDEOGRAPH-FAA6;Lo;0;L;76CA;;;;N;;;;;
+FAA7;CJK COMPATIBILITY IDEOGRAPH-FAA7;Lo;0;L;76DB;;;;N;;;;;
+FAA8;CJK COMPATIBILITY IDEOGRAPH-FAA8;Lo;0;L;76F4;;;;N;;;;;
+FAA9;CJK COMPATIBILITY IDEOGRAPH-FAA9;Lo;0;L;774A;;;;N;;;;;
+FAAA;CJK COMPATIBILITY IDEOGRAPH-FAAA;Lo;0;L;7740;;;;N;;;;;
+FAAB;CJK COMPATIBILITY IDEOGRAPH-FAAB;Lo;0;L;78CC;;;;N;;;;;
+FAAC;CJK COMPATIBILITY IDEOGRAPH-FAAC;Lo;0;L;7AB1;;;;N;;;;;
+FAAD;CJK COMPATIBILITY IDEOGRAPH-FAAD;Lo;0;L;7BC0;;;;N;;;;;
+FAAE;CJK COMPATIBILITY IDEOGRAPH-FAAE;Lo;0;L;7C7B;;;;N;;;;;
+FAAF;CJK COMPATIBILITY IDEOGRAPH-FAAF;Lo;0;L;7D5B;;;;N;;;;;
+FAB0;CJK COMPATIBILITY IDEOGRAPH-FAB0;Lo;0;L;7DF4;;;;N;;;;;
+FAB1;CJK COMPATIBILITY IDEOGRAPH-FAB1;Lo;0;L;7F3E;;;;N;;;;;
+FAB2;CJK COMPATIBILITY IDEOGRAPH-FAB2;Lo;0;L;8005;;;;N;;;;;
+FAB3;CJK COMPATIBILITY IDEOGRAPH-FAB3;Lo;0;L;8352;;;;N;;;;;
+FAB4;CJK COMPATIBILITY IDEOGRAPH-FAB4;Lo;0;L;83EF;;;;N;;;;;
+FAB5;CJK COMPATIBILITY IDEOGRAPH-FAB5;Lo;0;L;8779;;;;N;;;;;
+FAB6;CJK COMPATIBILITY IDEOGRAPH-FAB6;Lo;0;L;8941;;;;N;;;;;
+FAB7;CJK COMPATIBILITY IDEOGRAPH-FAB7;Lo;0;L;8986;;;;N;;;;;
+FAB8;CJK COMPATIBILITY IDEOGRAPH-FAB8;Lo;0;L;8996;;;;N;;;;;
+FAB9;CJK COMPATIBILITY IDEOGRAPH-FAB9;Lo;0;L;8ABF;;;;N;;;;;
+FABA;CJK COMPATIBILITY IDEOGRAPH-FABA;Lo;0;L;8AF8;;;;N;;;;;
+FABB;CJK COMPATIBILITY IDEOGRAPH-FABB;Lo;0;L;8ACB;;;;N;;;;;
+FABC;CJK COMPATIBILITY IDEOGRAPH-FABC;Lo;0;L;8B01;;;;N;;;;;
+FABD;CJK COMPATIBILITY IDEOGRAPH-FABD;Lo;0;L;8AFE;;;;N;;;;;
+FABE;CJK COMPATIBILITY IDEOGRAPH-FABE;Lo;0;L;8AED;;;;N;;;;;
+FABF;CJK COMPATIBILITY IDEOGRAPH-FABF;Lo;0;L;8B39;;;;N;;;;;
+FAC0;CJK COMPATIBILITY IDEOGRAPH-FAC0;Lo;0;L;8B8A;;;;N;;;;;
+FAC1;CJK COMPATIBILITY IDEOGRAPH-FAC1;Lo;0;L;8D08;;;;N;;;;;
+FAC2;CJK COMPATIBILITY IDEOGRAPH-FAC2;Lo;0;L;8F38;;;;N;;;;;
+FAC3;CJK COMPATIBILITY IDEOGRAPH-FAC3;Lo;0;L;9072;;;;N;;;;;
+FAC4;CJK COMPATIBILITY IDEOGRAPH-FAC4;Lo;0;L;9199;;;;N;;;;;
+FAC5;CJK COMPATIBILITY IDEOGRAPH-FAC5;Lo;0;L;9276;;;;N;;;;;
+FAC6;CJK COMPATIBILITY IDEOGRAPH-FAC6;Lo;0;L;967C;;;;N;;;;;
+FAC7;CJK COMPATIBILITY IDEOGRAPH-FAC7;Lo;0;L;96E3;;;;N;;;;;
+FAC8;CJK COMPATIBILITY IDEOGRAPH-FAC8;Lo;0;L;9756;;;;N;;;;;
+FAC9;CJK COMPATIBILITY IDEOGRAPH-FAC9;Lo;0;L;97DB;;;;N;;;;;
+FACA;CJK COMPATIBILITY IDEOGRAPH-FACA;Lo;0;L;97FF;;;;N;;;;;
+FACB;CJK COMPATIBILITY IDEOGRAPH-FACB;Lo;0;L;980B;;;;N;;;;;
+FACC;CJK COMPATIBILITY IDEOGRAPH-FACC;Lo;0;L;983B;;;;N;;;;;
+FACD;CJK COMPATIBILITY IDEOGRAPH-FACD;Lo;0;L;9B12;;;;N;;;;;
+FACE;CJK COMPATIBILITY IDEOGRAPH-FACE;Lo;0;L;9F9C;;;;N;;;;;
+FACF;CJK COMPATIBILITY IDEOGRAPH-FACF;Lo;0;L;2284A;;;;N;;;;;
+FAD0;CJK COMPATIBILITY IDEOGRAPH-FAD0;Lo;0;L;22844;;;;N;;;;;
+FAD1;CJK COMPATIBILITY IDEOGRAPH-FAD1;Lo;0;L;233D5;;;;N;;;;;
+FAD2;CJK COMPATIBILITY IDEOGRAPH-FAD2;Lo;0;L;3B9D;;;;N;;;;;
+FAD3;CJK COMPATIBILITY IDEOGRAPH-FAD3;Lo;0;L;4018;;;;N;;;;;
+FAD4;CJK COMPATIBILITY IDEOGRAPH-FAD4;Lo;0;L;4039;;;;N;;;;;
+FAD5;CJK COMPATIBILITY IDEOGRAPH-FAD5;Lo;0;L;25249;;;;N;;;;;
+FAD6;CJK COMPATIBILITY IDEOGRAPH-FAD6;Lo;0;L;25CD0;;;;N;;;;;
+FAD7;CJK COMPATIBILITY IDEOGRAPH-FAD7;Lo;0;L;27ED3;;;;N;;;;;
+FAD8;CJK COMPATIBILITY IDEOGRAPH-FAD8;Lo;0;L;9F43;;;;N;;;;;
+FAD9;CJK COMPATIBILITY IDEOGRAPH-FAD9;Lo;0;L;9F8E;;;;N;;;;;
+FB00;LATIN SMALL LIGATURE FF;Ll;0;L;<compat> 0066 0066;;;;N;;;;;
+FB01;LATIN SMALL LIGATURE FI;Ll;0;L;<compat> 0066 0069;;;;N;;;;;
+FB02;LATIN SMALL LIGATURE FL;Ll;0;L;<compat> 0066 006C;;;;N;;;;;
+FB03;LATIN SMALL LIGATURE FFI;Ll;0;L;<compat> 0066 0066 0069;;;;N;;;;;
+FB04;LATIN SMALL LIGATURE FFL;Ll;0;L;<compat> 0066 0066 006C;;;;N;;;;;
+FB05;LATIN SMALL LIGATURE LONG S T;Ll;0;L;<compat> 017F 0074;;;;N;;;;;
+FB06;LATIN SMALL LIGATURE ST;Ll;0;L;<compat> 0073 0074;;;;N;;;;;
+FB13;ARMENIAN SMALL LIGATURE MEN NOW;Ll;0;L;<compat> 0574 0576;;;;N;;;;;
+FB14;ARMENIAN SMALL LIGATURE MEN ECH;Ll;0;L;<compat> 0574 0565;;;;N;;;;;
+FB15;ARMENIAN SMALL LIGATURE MEN INI;Ll;0;L;<compat> 0574 056B;;;;N;;;;;
+FB16;ARMENIAN SMALL LIGATURE VEW NOW;Ll;0;L;<compat> 057E 0576;;;;N;;;;;
+FB17;ARMENIAN SMALL LIGATURE MEN XEH;Ll;0;L;<compat> 0574 056D;;;;N;;;;;
+FB1D;HEBREW LETTER YOD WITH HIRIQ;Lo;0;R;05D9 05B4;;;;N;;;;;
+FB1E;HEBREW POINT JUDEO-SPANISH VARIKA;Mn;26;NSM;;;;;N;HEBREW POINT VARIKA;;;;
+FB1F;HEBREW LIGATURE YIDDISH YOD YOD PATAH;Lo;0;R;05F2 05B7;;;;N;;;;;
+FB20;HEBREW LETTER ALTERNATIVE AYIN;Lo;0;R;<font> 05E2;;;;N;;;;;
+FB21;HEBREW LETTER WIDE ALEF;Lo;0;R;<font> 05D0;;;;N;;;;;
+FB22;HEBREW LETTER WIDE DALET;Lo;0;R;<font> 05D3;;;;N;;;;;
+FB23;HEBREW LETTER WIDE HE;Lo;0;R;<font> 05D4;;;;N;;;;;
+FB24;HEBREW LETTER WIDE KAF;Lo;0;R;<font> 05DB;;;;N;;;;;
+FB25;HEBREW LETTER WIDE LAMED;Lo;0;R;<font> 05DC;;;;N;;;;;
+FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R;<font> 05DD;;;;N;;;;;
+FB27;HEBREW LETTER WIDE RESH;Lo;0;R;<font> 05E8;;;;N;;;;;
+FB28;HEBREW LETTER WIDE TAV;Lo;0;R;<font> 05EA;;;;N;;;;;
+FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ES;<font> 002B;;;;N;;;;;
+FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;;
+FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;;
+FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;;
+FB2D;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT;Lo;0;R;FB49 05C2;;;;N;;;;;
+FB2E;HEBREW LETTER ALEF WITH PATAH;Lo;0;R;05D0 05B7;;;;N;;;;;
+FB2F;HEBREW LETTER ALEF WITH QAMATS;Lo;0;R;05D0 05B8;;;;N;;;;;
+FB30;HEBREW LETTER ALEF WITH MAPIQ;Lo;0;R;05D0 05BC;;;;N;;;;;
+FB31;HEBREW LETTER BET WITH DAGESH;Lo;0;R;05D1 05BC;;;;N;;;;;
+FB32;HEBREW LETTER GIMEL WITH DAGESH;Lo;0;R;05D2 05BC;;;;N;;;;;
+FB33;HEBREW LETTER DALET WITH DAGESH;Lo;0;R;05D3 05BC;;;;N;;;;;
+FB34;HEBREW LETTER HE WITH MAPIQ;Lo;0;R;05D4 05BC;;;;N;;;;;
+FB35;HEBREW LETTER VAV WITH DAGESH;Lo;0;R;05D5 05BC;;;;N;;;;;
+FB36;HEBREW LETTER ZAYIN WITH DAGESH;Lo;0;R;05D6 05BC;;;;N;;;;;
+FB38;HEBREW LETTER TET WITH DAGESH;Lo;0;R;05D8 05BC;;;;N;;;;;
+FB39;HEBREW LETTER YOD WITH DAGESH;Lo;0;R;05D9 05BC;;;;N;;;;;
+FB3A;HEBREW LETTER FINAL KAF WITH DAGESH;Lo;0;R;05DA 05BC;;;;N;;;;;
+FB3B;HEBREW LETTER KAF WITH DAGESH;Lo;0;R;05DB 05BC;;;;N;;;;;
+FB3C;HEBREW LETTER LAMED WITH DAGESH;Lo;0;R;05DC 05BC;;;;N;;;;;
+FB3E;HEBREW LETTER MEM WITH DAGESH;Lo;0;R;05DE 05BC;;;;N;;;;;
+FB40;HEBREW LETTER NUN WITH DAGESH;Lo;0;R;05E0 05BC;;;;N;;;;;
+FB41;HEBREW LETTER SAMEKH WITH DAGESH;Lo;0;R;05E1 05BC;;;;N;;;;;
+FB43;HEBREW LETTER FINAL PE WITH DAGESH;Lo;0;R;05E3 05BC;;;;N;;;;;
+FB44;HEBREW LETTER PE WITH DAGESH;Lo;0;R;05E4 05BC;;;;N;;;;;
+FB46;HEBREW LETTER TSADI WITH DAGESH;Lo;0;R;05E6 05BC;;;;N;;;;;
+FB47;HEBREW LETTER QOF WITH DAGESH;Lo;0;R;05E7 05BC;;;;N;;;;;
+FB48;HEBREW LETTER RESH WITH DAGESH;Lo;0;R;05E8 05BC;;;;N;;;;;
+FB49;HEBREW LETTER SHIN WITH DAGESH;Lo;0;R;05E9 05BC;;;;N;;;;;
+FB4A;HEBREW LETTER TAV WITH DAGESH;Lo;0;R;05EA 05BC;;;;N;;;;;
+FB4B;HEBREW LETTER VAV WITH HOLAM;Lo;0;R;05D5 05B9;;;;N;;;;;
+FB4C;HEBREW LETTER BET WITH RAFE;Lo;0;R;05D1 05BF;;;;N;;;;;
+FB4D;HEBREW LETTER KAF WITH RAFE;Lo;0;R;05DB 05BF;;;;N;;;;;
+FB4E;HEBREW LETTER PE WITH RAFE;Lo;0;R;05E4 05BF;;;;N;;;;;
+FB4F;HEBREW LIGATURE ALEF LAMED;Lo;0;R;<compat> 05D0 05DC;;;;N;;;;;
+FB50;ARABIC LETTER ALEF WASLA ISOLATED FORM;Lo;0;AL;<isolated> 0671;;;;N;;;;;
+FB51;ARABIC LETTER ALEF WASLA FINAL FORM;Lo;0;AL;<final> 0671;;;;N;;;;;
+FB52;ARABIC LETTER BEEH ISOLATED FORM;Lo;0;AL;<isolated> 067B;;;;N;;;;;
+FB53;ARABIC LETTER BEEH FINAL FORM;Lo;0;AL;<final> 067B;;;;N;;;;;
+FB54;ARABIC LETTER BEEH INITIAL FORM;Lo;0;AL;<initial> 067B;;;;N;;;;;
+FB55;ARABIC LETTER BEEH MEDIAL FORM;Lo;0;AL;<medial> 067B;;;;N;;;;;
+FB56;ARABIC LETTER PEH ISOLATED FORM;Lo;0;AL;<isolated> 067E;;;;N;;;;;
+FB57;ARABIC LETTER PEH FINAL FORM;Lo;0;AL;<final> 067E;;;;N;;;;;
+FB58;ARABIC LETTER PEH INITIAL FORM;Lo;0;AL;<initial> 067E;;;;N;;;;;
+FB59;ARABIC LETTER PEH MEDIAL FORM;Lo;0;AL;<medial> 067E;;;;N;;;;;
+FB5A;ARABIC LETTER BEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0680;;;;N;;;;;
+FB5B;ARABIC LETTER BEHEH FINAL FORM;Lo;0;AL;<final> 0680;;;;N;;;;;
+FB5C;ARABIC LETTER BEHEH INITIAL FORM;Lo;0;AL;<initial> 0680;;;;N;;;;;
+FB5D;ARABIC LETTER BEHEH MEDIAL FORM;Lo;0;AL;<medial> 0680;;;;N;;;;;
+FB5E;ARABIC LETTER TTEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067A;;;;N;;;;;
+FB5F;ARABIC LETTER TTEHEH FINAL FORM;Lo;0;AL;<final> 067A;;;;N;;;;;
+FB60;ARABIC LETTER TTEHEH INITIAL FORM;Lo;0;AL;<initial> 067A;;;;N;;;;;
+FB61;ARABIC LETTER TTEHEH MEDIAL FORM;Lo;0;AL;<medial> 067A;;;;N;;;;;
+FB62;ARABIC LETTER TEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067F;;;;N;;;;;
+FB63;ARABIC LETTER TEHEH FINAL FORM;Lo;0;AL;<final> 067F;;;;N;;;;;
+FB64;ARABIC LETTER TEHEH INITIAL FORM;Lo;0;AL;<initial> 067F;;;;N;;;;;
+FB65;ARABIC LETTER TEHEH MEDIAL FORM;Lo;0;AL;<medial> 067F;;;;N;;;;;
+FB66;ARABIC LETTER TTEH ISOLATED FORM;Lo;0;AL;<isolated> 0679;;;;N;;;;;
+FB67;ARABIC LETTER TTEH FINAL FORM;Lo;0;AL;<final> 0679;;;;N;;;;;
+FB68;ARABIC LETTER TTEH INITIAL FORM;Lo;0;AL;<initial> 0679;;;;N;;;;;
+FB69;ARABIC LETTER TTEH MEDIAL FORM;Lo;0;AL;<medial> 0679;;;;N;;;;;
+FB6A;ARABIC LETTER VEH ISOLATED FORM;Lo;0;AL;<isolated> 06A4;;;;N;;;;;
+FB6B;ARABIC LETTER VEH FINAL FORM;Lo;0;AL;<final> 06A4;;;;N;;;;;
+FB6C;ARABIC LETTER VEH INITIAL FORM;Lo;0;AL;<initial> 06A4;;;;N;;;;;
+FB6D;ARABIC LETTER VEH MEDIAL FORM;Lo;0;AL;<medial> 06A4;;;;N;;;;;
+FB6E;ARABIC LETTER PEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A6;;;;N;;;;;
+FB6F;ARABIC LETTER PEHEH FINAL FORM;Lo;0;AL;<final> 06A6;;;;N;;;;;
+FB70;ARABIC LETTER PEHEH INITIAL FORM;Lo;0;AL;<initial> 06A6;;;;N;;;;;
+FB71;ARABIC LETTER PEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A6;;;;N;;;;;
+FB72;ARABIC LETTER DYEH ISOLATED FORM;Lo;0;AL;<isolated> 0684;;;;N;;;;;
+FB73;ARABIC LETTER DYEH FINAL FORM;Lo;0;AL;<final> 0684;;;;N;;;;;
+FB74;ARABIC LETTER DYEH INITIAL FORM;Lo;0;AL;<initial> 0684;;;;N;;;;;
+FB75;ARABIC LETTER DYEH MEDIAL FORM;Lo;0;AL;<medial> 0684;;;;N;;;;;
+FB76;ARABIC LETTER NYEH ISOLATED FORM;Lo;0;AL;<isolated> 0683;;;;N;;;;;
+FB77;ARABIC LETTER NYEH FINAL FORM;Lo;0;AL;<final> 0683;;;;N;;;;;
+FB78;ARABIC LETTER NYEH INITIAL FORM;Lo;0;AL;<initial> 0683;;;;N;;;;;
+FB79;ARABIC LETTER NYEH MEDIAL FORM;Lo;0;AL;<medial> 0683;;;;N;;;;;
+FB7A;ARABIC LETTER TCHEH ISOLATED FORM;Lo;0;AL;<isolated> 0686;;;;N;;;;;
+FB7B;ARABIC LETTER TCHEH FINAL FORM;Lo;0;AL;<final> 0686;;;;N;;;;;
+FB7C;ARABIC LETTER TCHEH INITIAL FORM;Lo;0;AL;<initial> 0686;;;;N;;;;;
+FB7D;ARABIC LETTER TCHEH MEDIAL FORM;Lo;0;AL;<medial> 0686;;;;N;;;;;
+FB7E;ARABIC LETTER TCHEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0687;;;;N;;;;;
+FB7F;ARABIC LETTER TCHEHEH FINAL FORM;Lo;0;AL;<final> 0687;;;;N;;;;;
+FB80;ARABIC LETTER TCHEHEH INITIAL FORM;Lo;0;AL;<initial> 0687;;;;N;;;;;
+FB81;ARABIC LETTER TCHEHEH MEDIAL FORM;Lo;0;AL;<medial> 0687;;;;N;;;;;
+FB82;ARABIC LETTER DDAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068D;;;;N;;;;;
+FB83;ARABIC LETTER DDAHAL FINAL FORM;Lo;0;AL;<final> 068D;;;;N;;;;;
+FB84;ARABIC LETTER DAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068C;;;;N;;;;;
+FB85;ARABIC LETTER DAHAL FINAL FORM;Lo;0;AL;<final> 068C;;;;N;;;;;
+FB86;ARABIC LETTER DUL ISOLATED FORM;Lo;0;AL;<isolated> 068E;;;;N;;;;;
+FB87;ARABIC LETTER DUL FINAL FORM;Lo;0;AL;<final> 068E;;;;N;;;;;
+FB88;ARABIC LETTER DDAL ISOLATED FORM;Lo;0;AL;<isolated> 0688;;;;N;;;;;
+FB89;ARABIC LETTER DDAL FINAL FORM;Lo;0;AL;<final> 0688;;;;N;;;;;
+FB8A;ARABIC LETTER JEH ISOLATED FORM;Lo;0;AL;<isolated> 0698;;;;N;;;;;
+FB8B;ARABIC LETTER JEH FINAL FORM;Lo;0;AL;<final> 0698;;;;N;;;;;
+FB8C;ARABIC LETTER RREH ISOLATED FORM;Lo;0;AL;<isolated> 0691;;;;N;;;;;
+FB8D;ARABIC LETTER RREH FINAL FORM;Lo;0;AL;<final> 0691;;;;N;;;;;
+FB8E;ARABIC LETTER KEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A9;;;;N;;;;;
+FB8F;ARABIC LETTER KEHEH FINAL FORM;Lo;0;AL;<final> 06A9;;;;N;;;;;
+FB90;ARABIC LETTER KEHEH INITIAL FORM;Lo;0;AL;<initial> 06A9;;;;N;;;;;
+FB91;ARABIC LETTER KEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A9;;;;N;;;;;
+FB92;ARABIC LETTER GAF ISOLATED FORM;Lo;0;AL;<isolated> 06AF;;;;N;;;;;
+FB93;ARABIC LETTER GAF FINAL FORM;Lo;0;AL;<final> 06AF;;;;N;;;;;
+FB94;ARABIC LETTER GAF INITIAL FORM;Lo;0;AL;<initial> 06AF;;;;N;;;;;
+FB95;ARABIC LETTER GAF MEDIAL FORM;Lo;0;AL;<medial> 06AF;;;;N;;;;;
+FB96;ARABIC LETTER GUEH ISOLATED FORM;Lo;0;AL;<isolated> 06B3;;;;N;;;;;
+FB97;ARABIC LETTER GUEH FINAL FORM;Lo;0;AL;<final> 06B3;;;;N;;;;;
+FB98;ARABIC LETTER GUEH INITIAL FORM;Lo;0;AL;<initial> 06B3;;;;N;;;;;
+FB99;ARABIC LETTER GUEH MEDIAL FORM;Lo;0;AL;<medial> 06B3;;;;N;;;;;
+FB9A;ARABIC LETTER NGOEH ISOLATED FORM;Lo;0;AL;<isolated> 06B1;;;;N;;;;;
+FB9B;ARABIC LETTER NGOEH FINAL FORM;Lo;0;AL;<final> 06B1;;;;N;;;;;
+FB9C;ARABIC LETTER NGOEH INITIAL FORM;Lo;0;AL;<initial> 06B1;;;;N;;;;;
+FB9D;ARABIC LETTER NGOEH MEDIAL FORM;Lo;0;AL;<medial> 06B1;;;;N;;;;;
+FB9E;ARABIC LETTER NOON GHUNNA ISOLATED FORM;Lo;0;AL;<isolated> 06BA;;;;N;;;;;
+FB9F;ARABIC LETTER NOON GHUNNA FINAL FORM;Lo;0;AL;<final> 06BA;;;;N;;;;;
+FBA0;ARABIC LETTER RNOON ISOLATED FORM;Lo;0;AL;<isolated> 06BB;;;;N;;;;;
+FBA1;ARABIC LETTER RNOON FINAL FORM;Lo;0;AL;<final> 06BB;;;;N;;;;;
+FBA2;ARABIC LETTER RNOON INITIAL FORM;Lo;0;AL;<initial> 06BB;;;;N;;;;;
+FBA3;ARABIC LETTER RNOON MEDIAL FORM;Lo;0;AL;<medial> 06BB;;;;N;;;;;
+FBA4;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06C0;;;;N;;;;;
+FBA5;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM;Lo;0;AL;<final> 06C0;;;;N;;;;;
+FBA6;ARABIC LETTER HEH GOAL ISOLATED FORM;Lo;0;AL;<isolated> 06C1;;;;N;;;;;
+FBA7;ARABIC LETTER HEH GOAL FINAL FORM;Lo;0;AL;<final> 06C1;;;;N;;;;;
+FBA8;ARABIC LETTER HEH GOAL INITIAL FORM;Lo;0;AL;<initial> 06C1;;;;N;;;;;
+FBA9;ARABIC LETTER HEH GOAL MEDIAL FORM;Lo;0;AL;<medial> 06C1;;;;N;;;;;
+FBAA;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM;Lo;0;AL;<isolated> 06BE;;;;N;;;;;
+FBAB;ARABIC LETTER HEH DOACHASHMEE FINAL FORM;Lo;0;AL;<final> 06BE;;;;N;;;;;
+FBAC;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM;Lo;0;AL;<initial> 06BE;;;;N;;;;;
+FBAD;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM;Lo;0;AL;<medial> 06BE;;;;N;;;;;
+FBAE;ARABIC LETTER YEH BARREE ISOLATED FORM;Lo;0;AL;<isolated> 06D2;;;;N;;;;;
+FBAF;ARABIC LETTER YEH BARREE FINAL FORM;Lo;0;AL;<final> 06D2;;;;N;;;;;
+FBB0;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06D3;;;;N;;;;;
+FBB1;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 06D3;;;;N;;;;;
+FBB2;ARABIC SYMBOL DOT ABOVE;Sk;0;AL;;;;;N;;;;;
+FBB3;ARABIC SYMBOL DOT BELOW;Sk;0;AL;;;;;N;;;;;
+FBB4;ARABIC SYMBOL TWO DOTS ABOVE;Sk;0;AL;;;;;N;;;;;
+FBB5;ARABIC SYMBOL TWO DOTS BELOW;Sk;0;AL;;;;;N;;;;;
+FBB6;ARABIC SYMBOL THREE DOTS ABOVE;Sk;0;AL;;;;;N;;;;;
+FBB7;ARABIC SYMBOL THREE DOTS BELOW;Sk;0;AL;;;;;N;;;;;
+FBB8;ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE;Sk;0;AL;;;;;N;;;;;
+FBB9;ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW;Sk;0;AL;;;;;N;;;;;
+FBBA;ARABIC SYMBOL FOUR DOTS ABOVE;Sk;0;AL;;;;;N;;;;;
+FBBB;ARABIC SYMBOL FOUR DOTS BELOW;Sk;0;AL;;;;;N;;;;;
+FBBC;ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW;Sk;0;AL;;;;;N;;;;;
+FBBD;ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE;Sk;0;AL;;;;;N;;;;;
+FBBE;ARABIC SYMBOL TWO DOTS VERTICALLY BELOW;Sk;0;AL;;;;;N;;;;;
+FBBF;ARABIC SYMBOL RING;Sk;0;AL;;;;;N;;;;;
+FBC0;ARABIC SYMBOL SMALL TAH ABOVE;Sk;0;AL;;;;;N;;;;;
+FBC1;ARABIC SYMBOL SMALL TAH BELOW;Sk;0;AL;;;;;N;;;;;
+FBD3;ARABIC LETTER NG ISOLATED FORM;Lo;0;AL;<isolated> 06AD;;;;N;;;;;
+FBD4;ARABIC LETTER NG FINAL FORM;Lo;0;AL;<final> 06AD;;;;N;;;;;
+FBD5;ARABIC LETTER NG INITIAL FORM;Lo;0;AL;<initial> 06AD;;;;N;;;;;
+FBD6;ARABIC LETTER NG MEDIAL FORM;Lo;0;AL;<medial> 06AD;;;;N;;;;;
+FBD7;ARABIC LETTER U ISOLATED FORM;Lo;0;AL;<isolated> 06C7;;;;N;;;;;
+FBD8;ARABIC LETTER U FINAL FORM;Lo;0;AL;<final> 06C7;;;;N;;;;;
+FBD9;ARABIC LETTER OE ISOLATED FORM;Lo;0;AL;<isolated> 06C6;;;;N;;;;;
+FBDA;ARABIC LETTER OE FINAL FORM;Lo;0;AL;<final> 06C6;;;;N;;;;;
+FBDB;ARABIC LETTER YU ISOLATED FORM;Lo;0;AL;<isolated> 06C8;;;;N;;;;;
+FBDC;ARABIC LETTER YU FINAL FORM;Lo;0;AL;<final> 06C8;;;;N;;;;;
+FBDD;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0677;;;;N;;;;;
+FBDE;ARABIC LETTER VE ISOLATED FORM;Lo;0;AL;<isolated> 06CB;;;;N;;;;;
+FBDF;ARABIC LETTER VE FINAL FORM;Lo;0;AL;<final> 06CB;;;;N;;;;;
+FBE0;ARABIC LETTER KIRGHIZ OE ISOLATED FORM;Lo;0;AL;<isolated> 06C5;;;;N;;;;;
+FBE1;ARABIC LETTER KIRGHIZ OE FINAL FORM;Lo;0;AL;<final> 06C5;;;;N;;;;;
+FBE2;ARABIC LETTER KIRGHIZ YU ISOLATED FORM;Lo;0;AL;<isolated> 06C9;;;;N;;;;;
+FBE3;ARABIC LETTER KIRGHIZ YU FINAL FORM;Lo;0;AL;<final> 06C9;;;;N;;;;;
+FBE4;ARABIC LETTER E ISOLATED FORM;Lo;0;AL;<isolated> 06D0;;;;N;;;;;
+FBE5;ARABIC LETTER E FINAL FORM;Lo;0;AL;<final> 06D0;;;;N;;;;;
+FBE6;ARABIC LETTER E INITIAL FORM;Lo;0;AL;<initial> 06D0;;;;N;;;;;
+FBE7;ARABIC LETTER E MEDIAL FORM;Lo;0;AL;<medial> 06D0;;;;N;;;;;
+FBE8;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0649;;;;N;;;;;
+FBE9;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM;Lo;0;AL;<medial> 0649;;;;N;;;;;
+FBEA;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0626 0627;;;;N;;;;;
+FBEB;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM;Lo;0;AL;<final> 0626 0627;;;;N;;;;;
+FBEC;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D5;;;;N;;;;;
+FBED;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM;Lo;0;AL;<final> 0626 06D5;;;;N;;;;;
+FBEE;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM;Lo;0;AL;<isolated> 0626 0648;;;;N;;;;;
+FBEF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM;Lo;0;AL;<final> 0626 0648;;;;N;;;;;
+FBF0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C7;;;;N;;;;;
+FBF1;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM;Lo;0;AL;<final> 0626 06C7;;;;N;;;;;
+FBF2;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C6;;;;N;;;;;
+FBF3;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM;Lo;0;AL;<final> 0626 06C6;;;;N;;;;;
+FBF4;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C8;;;;N;;;;;
+FBF5;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM;Lo;0;AL;<final> 0626 06C8;;;;N;;;;;
+FBF6;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D0;;;;N;;;;;
+FBF7;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM;Lo;0;AL;<final> 0626 06D0;;;;N;;;;;
+FBF8;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM;Lo;0;AL;<initial> 0626 06D0;;;;N;;;;;
+FBF9;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;;
+FBFA;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;;
+FBFB;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0626 0649;;;;N;;;;;
+FBFC;ARABIC LETTER FARSI YEH ISOLATED FORM;Lo;0;AL;<isolated> 06CC;;;;N;;;;;
+FBFD;ARABIC LETTER FARSI YEH FINAL FORM;Lo;0;AL;<final> 06CC;;;;N;;;;;
+FBFE;ARABIC LETTER FARSI YEH INITIAL FORM;Lo;0;AL;<initial> 06CC;;;;N;;;;;
+FBFF;ARABIC LETTER FARSI YEH MEDIAL FORM;Lo;0;AL;<medial> 06CC;;;;N;;;;;
+FC00;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 062C;;;;N;;;;;
+FC01;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0626 062D;;;;N;;;;;
+FC02;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 0645;;;;N;;;;;
+FC03;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;;
+FC04;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0626 064A;;;;N;;;;;
+FC05;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 062C;;;;N;;;;;
+FC06;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062D;;;;N;;;;;
+FC07;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062E;;;;N;;;;;
+FC08;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 0645;;;;N;;;;;
+FC09;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0628 0649;;;;N;;;;;
+FC0A;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0628 064A;;;;N;;;;;
+FC0B;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 062C;;;;N;;;;;
+FC0C;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062D;;;;N;;;;;
+FC0D;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062E;;;;N;;;;;
+FC0E;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 0645;;;;N;;;;;
+FC0F;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062A 0649;;;;N;;;;;
+FC10;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062A 064A;;;;N;;;;;
+FC11;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 062C;;;;N;;;;;
+FC12;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 0645;;;;N;;;;;
+FC13;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062B 0649;;;;N;;;;;
+FC14;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062B 064A;;;;N;;;;;
+FC15;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062C 062D;;;;N;;;;;
+FC16;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C 0645;;;;N;;;;;
+FC17;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 062C;;;;N;;;;;
+FC18;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 0645;;;;N;;;;;
+FC19;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 062C;;;;N;;;;;
+FC1A;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062E 062D;;;;N;;;;;
+FC1B;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 0645;;;;N;;;;;
+FC1C;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 062C;;;;N;;;;;
+FC1D;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062D;;;;N;;;;;
+FC1E;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062E;;;;N;;;;;
+FC1F;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 0645;;;;N;;;;;
+FC20;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0635 062D;;;;N;;;;;
+FC21;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0645;;;;N;;;;;
+FC22;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 062C;;;;N;;;;;
+FC23;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062D;;;;N;;;;;
+FC24;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062E;;;;N;;;;;
+FC25;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 0645;;;;N;;;;;
+FC26;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0637 062D;;;;N;;;;;
+FC27;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0637 0645;;;;N;;;;;
+FC28;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0638 0645;;;;N;;;;;
+FC29;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 062C;;;;N;;;;;
+FC2A;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 0645;;;;N;;;;;
+FC2B;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 062C;;;;N;;;;;
+FC2C;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 0645;;;;N;;;;;
+FC2D;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 062C;;;;N;;;;;
+FC2E;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062D;;;;N;;;;;
+FC2F;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062E;;;;N;;;;;
+FC30;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 0645;;;;N;;;;;
+FC31;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0641 0649;;;;N;;;;;
+FC32;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0641 064A;;;;N;;;;;
+FC33;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0642 062D;;;;N;;;;;
+FC34;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0642 0645;;;;N;;;;;
+FC35;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0642 0649;;;;N;;;;;
+FC36;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0642 064A;;;;N;;;;;
+FC37;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0643 0627;;;;N;;;;;
+FC38;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 062C;;;;N;;;;;
+FC39;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062D;;;;N;;;;;
+FC3A;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062E;;;;N;;;;;
+FC3B;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0644;;;;N;;;;;
+FC3C;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0645;;;;N;;;;;
+FC3D;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0643 0649;;;;N;;;;;
+FC3E;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0643 064A;;;;N;;;;;
+FC3F;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 062C;;;;N;;;;;
+FC40;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062D;;;;N;;;;;
+FC41;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062E;;;;N;;;;;
+FC42;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 0645;;;;N;;;;;
+FC43;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0644 0649;;;;N;;;;;
+FC44;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0644 064A;;;;N;;;;;
+FC45;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 062C;;;;N;;;;;
+FC46;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D;;;;N;;;;;
+FC47;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062E;;;;N;;;;;
+FC48;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 0645;;;;N;;;;;
+FC49;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0645 0649;;;;N;;;;;
+FC4A;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0645 064A;;;;N;;;;;
+FC4B;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 062C;;;;N;;;;;
+FC4C;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062D;;;;N;;;;;
+FC4D;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062E;;;;N;;;;;
+FC4E;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 0645;;;;N;;;;;
+FC4F;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0646 0649;;;;N;;;;;
+FC50;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0646 064A;;;;N;;;;;
+FC51;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 062C;;;;N;;;;;
+FC52;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 0645;;;;N;;;;;
+FC53;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0647 0649;;;;N;;;;;
+FC54;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0647 064A;;;;N;;;;;
+FC55;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 062C;;;;N;;;;;
+FC56;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062D;;;;N;;;;;
+FC57;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062E;;;;N;;;;;
+FC58;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 0645;;;;N;;;;;
+FC59;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 064A 0649;;;;N;;;;;
+FC5A;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A 064A;;;;N;;;;;
+FC5B;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0630 0670;;;;N;;;;;
+FC5C;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0631 0670;;;;N;;;;;
+FC5D;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0649 0670;;;;N;;;;;
+FC5E;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C 0651;;;;N;;;;;
+FC5F;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D 0651;;;;N;;;;;
+FC60;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E 0651;;;;N;;;;;
+FC61;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F 0651;;;;N;;;;;
+FC62;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650 0651;;;;N;;;;;
+FC63;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651 0670;;;;N;;;;;
+FC64;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM;Lo;0;AL;<final> 0626 0631;;;;N;;;;;
+FC65;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0626 0632;;;;N;;;;;
+FC66;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM;Lo;0;AL;<final> 0626 0645;;;;N;;;;;
+FC67;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM;Lo;0;AL;<final> 0626 0646;;;;N;;;;;
+FC68;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;;
+FC69;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM;Lo;0;AL;<final> 0626 064A;;;;N;;;;;
+FC6A;ARABIC LIGATURE BEH WITH REH FINAL FORM;Lo;0;AL;<final> 0628 0631;;;;N;;;;;
+FC6B;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0628 0632;;;;N;;;;;
+FC6C;ARABIC LIGATURE BEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0628 0645;;;;N;;;;;
+FC6D;ARABIC LIGATURE BEH WITH NOON FINAL FORM;Lo;0;AL;<final> 0628 0646;;;;N;;;;;
+FC6E;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0628 0649;;;;N;;;;;
+FC6F;ARABIC LIGATURE BEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 064A;;;;N;;;;;
+FC70;ARABIC LIGATURE TEH WITH REH FINAL FORM;Lo;0;AL;<final> 062A 0631;;;;N;;;;;
+FC71;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062A 0632;;;;N;;;;;
+FC72;ARABIC LIGATURE TEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062A 0645;;;;N;;;;;
+FC73;ARABIC LIGATURE TEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062A 0646;;;;N;;;;;
+FC74;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0649;;;;N;;;;;
+FC75;ARABIC LIGATURE TEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 064A;;;;N;;;;;
+FC76;ARABIC LIGATURE THEH WITH REH FINAL FORM;Lo;0;AL;<final> 062B 0631;;;;N;;;;;
+FC77;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062B 0632;;;;N;;;;;
+FC78;ARABIC LIGATURE THEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062B 0645;;;;N;;;;;
+FC79;ARABIC LIGATURE THEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062B 0646;;;;N;;;;;
+FC7A;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062B 0649;;;;N;;;;;
+FC7B;ARABIC LIGATURE THEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062B 064A;;;;N;;;;;
+FC7C;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0641 0649;;;;N;;;;;
+FC7D;ARABIC LIGATURE FEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 064A;;;;N;;;;;
+FC7E;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0642 0649;;;;N;;;;;
+FC7F;ARABIC LIGATURE QAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 064A;;;;N;;;;;
+FC80;ARABIC LIGATURE KAF WITH ALEF FINAL FORM;Lo;0;AL;<final> 0643 0627;;;;N;;;;;
+FC81;ARABIC LIGATURE KAF WITH LAM FINAL FORM;Lo;0;AL;<final> 0643 0644;;;;N;;;;;
+FC82;ARABIC LIGATURE KAF WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645;;;;N;;;;;
+FC83;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0643 0649;;;;N;;;;;
+FC84;ARABIC LIGATURE KAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 064A;;;;N;;;;;
+FC85;ARABIC LIGATURE LAM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 0645;;;;N;;;;;
+FC86;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 0649;;;;N;;;;;
+FC87;ARABIC LIGATURE LAM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 064A;;;;N;;;;;
+FC88;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0645 0627;;;;N;;;;;
+FC89;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0645 0645;;;;N;;;;;
+FC8A;ARABIC LIGATURE NOON WITH REH FINAL FORM;Lo;0;AL;<final> 0646 0631;;;;N;;;;;
+FC8B;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0646 0632;;;;N;;;;;
+FC8C;ARABIC LIGATURE NOON WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 0645;;;;N;;;;;
+FC8D;ARABIC LIGATURE NOON WITH NOON FINAL FORM;Lo;0;AL;<final> 0646 0646;;;;N;;;;;
+FC8E;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0649;;;;N;;;;;
+FC8F;ARABIC LIGATURE NOON WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 064A;;;;N;;;;;
+FC90;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM;Lo;0;AL;<final> 0649 0670;;;;N;;;;;
+FC91;ARABIC LIGATURE YEH WITH REH FINAL FORM;Lo;0;AL;<final> 064A 0631;;;;N;;;;;
+FC92;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 064A 0632;;;;N;;;;;
+FC93;ARABIC LIGATURE YEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645;;;;N;;;;;
+FC94;ARABIC LIGATURE YEH WITH NOON FINAL FORM;Lo;0;AL;<final> 064A 0646;;;;N;;;;;
+FC95;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 064A 0649;;;;N;;;;;
+FC96;ARABIC LIGATURE YEH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 064A;;;;N;;;;;
+FC97;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0626 062C;;;;N;;;;;
+FC98;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0626 062D;;;;N;;;;;
+FC99;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0626 062E;;;;N;;;;;
+FC9A;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0626 0645;;;;N;;;;;
+FC9B;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0626 0647;;;;N;;;;;
+FC9C;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0628 062C;;;;N;;;;;
+FC9D;ARABIC LIGATURE BEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0628 062D;;;;N;;;;;
+FC9E;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0628 062E;;;;N;;;;;
+FC9F;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0628 0645;;;;N;;;;;
+FCA0;ARABIC LIGATURE BEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0628 0647;;;;N;;;;;
+FCA1;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C;;;;N;;;;;
+FCA2;ARABIC LIGATURE TEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 062D;;;;N;;;;;
+FCA3;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 062E;;;;N;;;;;
+FCA4;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645;;;;N;;;;;
+FCA5;ARABIC LIGATURE TEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 062A 0647;;;;N;;;;;
+FCA6;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062B 0645;;;;N;;;;;
+FCA7;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 062D;;;;N;;;;;
+FCA8;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062C 0645;;;;N;;;;;
+FCA9;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062D 062C;;;;N;;;;;
+FCAA;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062D 0645;;;;N;;;;;
+FCAB;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062E 062C;;;;N;;;;;
+FCAC;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062E 0645;;;;N;;;;;
+FCAD;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062C;;;;N;;;;;
+FCAE;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062D;;;;N;;;;;
+FCAF;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0633 062E;;;;N;;;;;
+FCB0;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645;;;;N;;;;;
+FCB1;ARABIC LIGATURE SAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D;;;;N;;;;;
+FCB2;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0635 062E;;;;N;;;;;
+FCB3;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645;;;;N;;;;;
+FCB4;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062C;;;;N;;;;;
+FCB5;ARABIC LIGATURE DAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0636 062D;;;;N;;;;;
+FCB6;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0636 062E;;;;N;;;;;
+FCB7;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 0645;;;;N;;;;;
+FCB8;ARABIC LIGATURE TAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 062D;;;;N;;;;;
+FCB9;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0638 0645;;;;N;;;;;
+FCBA;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C;;;;N;;;;;
+FCBB;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645;;;;N;;;;;
+FCBC;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 063A 062C;;;;N;;;;;
+FCBD;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 063A 0645;;;;N;;;;;
+FCBE;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062C;;;;N;;;;;
+FCBF;ARABIC LIGATURE FEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0641 062D;;;;N;;;;;
+FCC0;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0641 062E;;;;N;;;;;
+FCC1;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 0645;;;;N;;;;;
+FCC2;ARABIC LIGATURE QAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 062D;;;;N;;;;;
+FCC3;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0642 0645;;;;N;;;;;
+FCC4;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0643 062C;;;;N;;;;;
+FCC5;ARABIC LIGATURE KAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0643 062D;;;;N;;;;;
+FCC6;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0643 062E;;;;N;;;;;
+FCC7;ARABIC LIGATURE KAF WITH LAM INITIAL FORM;Lo;0;AL;<initial> 0643 0644;;;;N;;;;;
+FCC8;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645;;;;N;;;;;
+FCC9;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C;;;;N;;;;;
+FCCA;ARABIC LIGATURE LAM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 062D;;;;N;;;;;
+FCCB;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0644 062E;;;;N;;;;;
+FCCC;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 0645;;;;N;;;;;
+FCCD;ARABIC LIGATURE LAM WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0644 0647;;;;N;;;;;
+FCCE;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C;;;;N;;;;;
+FCCF;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062D;;;;N;;;;;
+FCD0;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062E;;;;N;;;;;
+FCD1;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 0645;;;;N;;;;;
+FCD2;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C;;;;N;;;;;
+FCD3;ARABIC LIGATURE NOON WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062D;;;;N;;;;;
+FCD4;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0646 062E;;;;N;;;;;
+FCD5;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 0645;;;;N;;;;;
+FCD6;ARABIC LIGATURE NOON WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0646 0647;;;;N;;;;;
+FCD7;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 062C;;;;N;;;;;
+FCD8;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645;;;;N;;;;;
+FCD9;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM;Lo;0;AL;<initial> 0647 0670;;;;N;;;;;
+FCDA;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 064A 062C;;;;N;;;;;
+FCDB;ARABIC LIGATURE YEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 064A 062D;;;;N;;;;;
+FCDC;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 064A 062E;;;;N;;;;;
+FCDD;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645;;;;N;;;;;
+FCDE;ARABIC LIGATURE YEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 064A 0647;;;;N;;;;;
+FCDF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0626 0645;;;;N;;;;;
+FCE0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0626 0647;;;;N;;;;;
+FCE1;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0628 0645;;;;N;;;;;
+FCE2;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0628 0647;;;;N;;;;;
+FCE3;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062A 0645;;;;N;;;;;
+FCE4;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062A 0647;;;;N;;;;;
+FCE5;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062B 0645;;;;N;;;;;
+FCE6;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062B 0647;;;;N;;;;;
+FCE7;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 0645;;;;N;;;;;
+FCE8;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0633 0647;;;;N;;;;;
+FCE9;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 0645;;;;N;;;;;
+FCEA;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0634 0647;;;;N;;;;;
+FCEB;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM;Lo;0;AL;<medial> 0643 0644;;;;N;;;;;
+FCEC;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0643 0645;;;;N;;;;;
+FCED;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0644 0645;;;;N;;;;;
+FCEE;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0646 0645;;;;N;;;;;
+FCEF;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0646 0647;;;;N;;;;;
+FCF0;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 064A 0645;;;;N;;;;;
+FCF1;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 064A 0647;;;;N;;;;;
+FCF2;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E 0651;;;;N;;;;;
+FCF3;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F 0651;;;;N;;;;;
+FCF4;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650 0651;;;;N;;;;;
+FCF5;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0637 0649;;;;N;;;;;
+FCF6;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0637 064A;;;;N;;;;;
+FCF7;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0639 0649;;;;N;;;;;
+FCF8;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0639 064A;;;;N;;;;;
+FCF9;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 063A 0649;;;;N;;;;;
+FCFA;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 063A 064A;;;;N;;;;;
+FCFB;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0633 0649;;;;N;;;;;
+FCFC;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0633 064A;;;;N;;;;;
+FCFD;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0634 0649;;;;N;;;;;
+FCFE;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0634 064A;;;;N;;;;;
+FCFF;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062D 0649;;;;N;;;;;
+FD00;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062D 064A;;;;N;;;;;
+FD01;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062C 0649;;;;N;;;;;
+FD02;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062C 064A;;;;N;;;;;
+FD03;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062E 0649;;;;N;;;;;
+FD04;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062E 064A;;;;N;;;;;
+FD05;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0649;;;;N;;;;;
+FD06;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0635 064A;;;;N;;;;;
+FD07;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0636 0649;;;;N;;;;;
+FD08;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0636 064A;;;;N;;;;;
+FD09;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 062C;;;;N;;;;;
+FD0A;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062D;;;;N;;;;;
+FD0B;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062E;;;;N;;;;;
+FD0C;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 0645;;;;N;;;;;
+FD0D;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0634 0631;;;;N;;;;;
+FD0E;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0633 0631;;;;N;;;;;
+FD0F;ARABIC LIGATURE SAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0635 0631;;;;N;;;;;
+FD10;ARABIC LIGATURE DAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0636 0631;;;;N;;;;;
+FD11;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0637 0649;;;;N;;;;;
+FD12;ARABIC LIGATURE TAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 064A;;;;N;;;;;
+FD13;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0649;;;;N;;;;;
+FD14;ARABIC LIGATURE AIN WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 064A;;;;N;;;;;
+FD15;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0649;;;;N;;;;;
+FD16;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 064A;;;;N;;;;;
+FD17;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 0649;;;;N;;;;;
+FD18;ARABIC LIGATURE SEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 064A;;;;N;;;;;
+FD19;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0634 0649;;;;N;;;;;
+FD1A;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 064A;;;;N;;;;;
+FD1B;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0649;;;;N;;;;;
+FD1C;ARABIC LIGATURE HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 064A;;;;N;;;;;
+FD1D;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0649;;;;N;;;;;
+FD1E;ARABIC LIGATURE JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 064A;;;;N;;;;;
+FD1F;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062E 0649;;;;N;;;;;
+FD20;ARABIC LIGATURE KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062E 064A;;;;N;;;;;
+FD21;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0635 0649;;;;N;;;;;
+FD22;ARABIC LIGATURE SAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 064A;;;;N;;;;;
+FD23;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 0649;;;;N;;;;;
+FD24;ARABIC LIGATURE DAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 064A;;;;N;;;;;
+FD25;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM;Lo;0;AL;<final> 0634 062C;;;;N;;;;;
+FD26;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM;Lo;0;AL;<final> 0634 062D;;;;N;;;;;
+FD27;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 062E;;;;N;;;;;
+FD28;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645;;;;N;;;;;
+FD29;ARABIC LIGATURE SHEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0634 0631;;;;N;;;;;
+FD2A;ARABIC LIGATURE SEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0633 0631;;;;N;;;;;
+FD2B;ARABIC LIGATURE SAD WITH REH FINAL FORM;Lo;0;AL;<final> 0635 0631;;;;N;;;;;
+FD2C;ARABIC LIGATURE DAD WITH REH FINAL FORM;Lo;0;AL;<final> 0636 0631;;;;N;;;;;
+FD2D;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062C;;;;N;;;;;
+FD2E;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0634 062D;;;;N;;;;;
+FD2F;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 062E;;;;N;;;;;
+FD30;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645;;;;N;;;;;
+FD31;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0633 0647;;;;N;;;;;
+FD32;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0634 0647;;;;N;;;;;
+FD33;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645;;;;N;;;;;
+FD34;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 062C;;;;N;;;;;
+FD35;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062D;;;;N;;;;;
+FD36;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062E;;;;N;;;;;
+FD37;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 062C;;;;N;;;;;
+FD38;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062D;;;;N;;;;;
+FD39;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062E;;;;N;;;;;
+FD3A;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0637 0645;;;;N;;;;;
+FD3B;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0638 0645;;;;N;;;;;
+FD3C;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM;Lo;0;AL;<final> 0627 064B;;;;N;;;;;
+FD3D;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0627 064B;;;;N;;;;;
+FD3E;ORNATE LEFT PARENTHESIS;Pe;0;ON;;;;;N;;;;;
+FD3F;ORNATE RIGHT PARENTHESIS;Ps;0;ON;;;;;N;;;;;
+FD50;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C 0645;;;;N;;;;;
+FD51;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM;Lo;0;AL;<final> 062A 062D 062C;;;;N;;;;;
+FD52;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 062C;;;;N;;;;;
+FD53;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 0645;;;;N;;;;;
+FD54;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062E 0645;;;;N;;;;;
+FD55;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062C;;;;N;;;;;
+FD56;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062D;;;;N;;;;;
+FD57;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062E;;;;N;;;;;
+FD58;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 062C 0645 062D;;;;N;;;;;
+FD59;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 0645 062D;;;;N;;;;;
+FD5A;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 0645 064A;;;;N;;;;;
+FD5B;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0645 0649;;;;N;;;;;
+FD5C;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062D 062C;;;;N;;;;;
+FD5D;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062C 062D;;;;N;;;;;
+FD5E;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062C 0649;;;;N;;;;;
+FD5F;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0633 0645 062D;;;;N;;;;;
+FD60;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062D;;;;N;;;;;
+FD61;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062C;;;;N;;;;;
+FD62;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0633 0645 0645;;;;N;;;;;
+FD63;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 0645;;;;N;;;;;
+FD64;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM;Lo;0;AL;<final> 0635 062D 062D;;;;N;;;;;
+FD65;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D 062D;;;;N;;;;;
+FD66;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0635 0645 0645;;;;N;;;;;
+FD67;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 062D 0645;;;;N;;;;;
+FD68;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062D 0645;;;;N;;;;;
+FD69;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062C 064A;;;;N;;;;;
+FD6A;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 0645 062E;;;;N;;;;;
+FD6B;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 0645 062E;;;;N;;;;;
+FD6C;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645 0645;;;;N;;;;;
+FD6D;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645 0645;;;;N;;;;;
+FD6E;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 062D 0649;;;;N;;;;;
+FD6F;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0636 062E 0645;;;;N;;;;;
+FD70;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062E 0645;;;;N;;;;;
+FD71;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0637 0645 062D;;;;N;;;;;
+FD72;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 0645 062D;;;;N;;;;;
+FD73;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645 0645;;;;N;;;;;
+FD74;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 0645 064A;;;;N;;;;;
+FD75;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 062C 0645;;;;N;;;;;
+FD76;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 0645 0645;;;;N;;;;;
+FD77;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645 0645;;;;N;;;;;
+FD78;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0645 0649;;;;N;;;;;
+FD79;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 063A 0645 0645;;;;N;;;;;
+FD7A;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 0645 064A;;;;N;;;;;
+FD7B;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0645 0649;;;;N;;;;;
+FD7C;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0641 062E 0645;;;;N;;;;;
+FD7D;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062E 0645;;;;N;;;;;
+FD7E;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0642 0645 062D;;;;N;;;;;
+FD7F;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0642 0645 0645;;;;N;;;;;
+FD80;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062D 0645;;;;N;;;;;
+FD81;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062D 064A;;;;N;;;;;
+FD82;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 062D 0649;;;;N;;;;;
+FD83;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 062C;;;;N;;;;;
+FD84;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 062C;;;;N;;;;;
+FD85;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062E 0645;;;;N;;;;;
+FD86;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062E 0645;;;;N;;;;;
+FD87;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0644 0645 062D;;;;N;;;;;
+FD88;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 0645 062D;;;;N;;;;;
+FD89;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 062C;;;;N;;;;;
+FD8A;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 0645;;;;N;;;;;
+FD8B;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062D 064A;;;;N;;;;;
+FD8C;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062D;;;;N;;;;;
+FD8D;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C 0645;;;;N;;;;;
+FD8E;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 062C;;;;N;;;;;
+FD8F;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 0645;;;;N;;;;;
+FD92;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062E;;;;N;;;;;
+FD93;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 062C;;;;N;;;;;
+FD94;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 0645;;;;N;;;;;
+FD95;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062D 0645;;;;N;;;;;
+FD96;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062D 0649;;;;N;;;;;
+FD97;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 062C 0645;;;;N;;;;;
+FD98;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C 0645;;;;N;;;;;
+FD99;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062C 0649;;;;N;;;;;
+FD9A;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 0645 064A;;;;N;;;;;
+FD9B;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0645 0649;;;;N;;;;;
+FD9C;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645 0645;;;;N;;;;;
+FD9D;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645 0645;;;;N;;;;;
+FD9E;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062E 064A;;;;N;;;;;
+FD9F;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062C 064A;;;;N;;;;;
+FDA0;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062C 0649;;;;N;;;;;
+FDA1;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062E 064A;;;;N;;;;;
+FDA2;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062E 0649;;;;N;;;;;
+FDA3;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 0645 064A;;;;N;;;;;
+FDA4;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0645 0649;;;;N;;;;;
+FDA5;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 0645 064A;;;;N;;;;;
+FDA6;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 062D 0649;;;;N;;;;;
+FDA7;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0645 0649;;;;N;;;;;
+FDA8;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062E 0649;;;;N;;;;;
+FDA9;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 062D 064A;;;;N;;;;;
+FDAA;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062D 064A;;;;N;;;;;
+FDAB;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 062D 064A;;;;N;;;;;
+FDAC;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062C 064A;;;;N;;;;;
+FDAD;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 0645 064A;;;;N;;;;;
+FDAE;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062D 064A;;;;N;;;;;
+FDAF;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062C 064A;;;;N;;;;;
+FDB0;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 0645 064A;;;;N;;;;;
+FDB1;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 0645 064A;;;;N;;;;;
+FDB2;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 0645 064A;;;;N;;;;;
+FDB3;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062D 064A;;;;N;;;;;
+FDB4;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 0645 062D;;;;N;;;;;
+FDB5;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062D 0645;;;;N;;;;;
+FDB6;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 0645 064A;;;;N;;;;;
+FDB7;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 0645 064A;;;;N;;;;;
+FDB8;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062C 062D;;;;N;;;;;
+FDB9;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062E 064A;;;;N;;;;;
+FDBA;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 0645;;;;N;;;;;
+FDBB;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645 0645;;;;N;;;;;
+FDBC;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 0645;;;;N;;;;;
+FDBD;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0646 062C 062D;;;;N;;;;;
+FDBE;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 062D 064A;;;;N;;;;;
+FDBF;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 062C 064A;;;;N;;;;;
+FDC0;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062C 064A;;;;N;;;;;
+FDC1;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 0645 064A;;;;N;;;;;
+FDC2;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062D 064A;;;;N;;;;;
+FDC3;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645 0645;;;;N;;;;;
+FDC4;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C 0645;;;;N;;;;;
+FDC5;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645 0645;;;;N;;;;;
+FDC6;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 062E 064A;;;;N;;;;;
+FDC7;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062C 064A;;;;N;;;;;
+FDF0;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 06D2;;;;N;;;;;
+FDF1;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0642 0644 06D2;;;;N;;;;;
+FDF2;ARABIC LIGATURE ALLAH ISOLATED FORM;Lo;0;AL;<isolated> 0627 0644 0644 0647;;;;N;;;;;
+FDF3;ARABIC LIGATURE AKBAR ISOLATED FORM;Lo;0;AL;<isolated> 0627 0643 0628 0631;;;;N;;;;;
+FDF4;ARABIC LIGATURE MOHAMMAD ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D 0645 062F;;;;N;;;;;
+FDF5;ARABIC LIGATURE SALAM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0639 0645;;;;N;;;;;
+FDF6;ARABIC LIGATURE RASOUL ISOLATED FORM;Lo;0;AL;<isolated> 0631 0633 0648 0644;;;;N;;;;;
+FDF7;ARABIC LIGATURE ALAYHE ISOLATED FORM;Lo;0;AL;<isolated> 0639 0644 064A 0647;;;;N;;;;;
+FDF8;ARABIC LIGATURE WASALLAM ISOLATED FORM;Lo;0;AL;<isolated> 0648 0633 0644 0645;;;;N;;;;;
+FDF9;ARABIC LIGATURE SALLA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0649;;;;N;;;;;
+FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL;<isolated> 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;;;;N;ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM;;;;
+FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL;<isolated> 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;;
+FDFC;RIAL SIGN;Sc;0;AL;<isolated> 0631 06CC 0627 0644;;;;N;;;;;
+FDFD;ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM;So;0;ON;;;;;N;;;;;
+FE00;VARIATION SELECTOR-1;Mn;0;NSM;;;;;N;;;;;
+FE01;VARIATION SELECTOR-2;Mn;0;NSM;;;;;N;;;;;
+FE02;VARIATION SELECTOR-3;Mn;0;NSM;;;;;N;;;;;
+FE03;VARIATION SELECTOR-4;Mn;0;NSM;;;;;N;;;;;
+FE04;VARIATION SELECTOR-5;Mn;0;NSM;;;;;N;;;;;
+FE05;VARIATION SELECTOR-6;Mn;0;NSM;;;;;N;;;;;
+FE06;VARIATION SELECTOR-7;Mn;0;NSM;;;;;N;;;;;
+FE07;VARIATION SELECTOR-8;Mn;0;NSM;;;;;N;;;;;
+FE08;VARIATION SELECTOR-9;Mn;0;NSM;;;;;N;;;;;
+FE09;VARIATION SELECTOR-10;Mn;0;NSM;;;;;N;;;;;
+FE0A;VARIATION SELECTOR-11;Mn;0;NSM;;;;;N;;;;;
+FE0B;VARIATION SELECTOR-12;Mn;0;NSM;;;;;N;;;;;
+FE0C;VARIATION SELECTOR-13;Mn;0;NSM;;;;;N;;;;;
+FE0D;VARIATION SELECTOR-14;Mn;0;NSM;;;;;N;;;;;
+FE0E;VARIATION SELECTOR-15;Mn;0;NSM;;;;;N;;;;;
+FE0F;VARIATION SELECTOR-16;Mn;0;NSM;;;;;N;;;;;
+FE10;PRESENTATION FORM FOR VERTICAL COMMA;Po;0;ON;<vertical> 002C;;;;N;;;;;
+FE11;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA;Po;0;ON;<vertical> 3001;;;;N;;;;;
+FE12;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP;Po;0;ON;<vertical> 3002;;;;N;;;;;
+FE13;PRESENTATION FORM FOR VERTICAL COLON;Po;0;ON;<vertical> 003A;;;;N;;;;;
+FE14;PRESENTATION FORM FOR VERTICAL SEMICOLON;Po;0;ON;<vertical> 003B;;;;N;;;;;
+FE15;PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK;Po;0;ON;<vertical> 0021;;;;N;;;;;
+FE16;PRESENTATION FORM FOR VERTICAL QUESTION MARK;Po;0;ON;<vertical> 003F;;;;N;;;;;
+FE17;PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;<vertical> 3016;;;;N;;;;;
+FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET;Pe;0;ON;<vertical> 3017;;;;N;;;;;
+FE19;PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS;Po;0;ON;<vertical> 2026;;;;N;;;;;
+FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;;
+FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
+FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;;
+FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
+FE24;COMBINING MACRON LEFT HALF;Mn;230;NSM;;;;;N;;;;;
+FE25;COMBINING MACRON RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
+FE26;COMBINING CONJOINING MACRON;Mn;230;NSM;;;;;N;;;;;
+FE27;COMBINING LIGATURE LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;;
+FE28;COMBINING LIGATURE RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;;
+FE29;COMBINING TILDE LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;;
+FE2A;COMBINING TILDE RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;;
+FE2B;COMBINING MACRON LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;;
+FE2C;COMBINING MACRON RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;;
+FE2D;COMBINING CONJOINING MACRON BELOW;Mn;220;NSM;;;;;N;;;;;
+FE2E;COMBINING CYRILLIC TITLO LEFT HALF;Mn;230;NSM;;;;;N;;;;;
+FE2F;COMBINING CYRILLIC TITLO RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
+FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON;<vertical> 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;;
+FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON;<vertical> 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;;
+FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON;<vertical> 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;;
+FE33;PRESENTATION FORM FOR VERTICAL LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING UNDERSCORE;;;;
+FE34;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE;;;;
+FE35;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS;Ps;0;ON;<vertical> 0028;;;;N;GLYPH FOR VERTICAL OPENING PARENTHESIS;;;;
+FE36;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS;Pe;0;ON;<vertical> 0029;;;;N;GLYPH FOR VERTICAL CLOSING PARENTHESIS;;;;
+FE37;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET;Ps;0;ON;<vertical> 007B;;;;N;GLYPH FOR VERTICAL OPENING CURLY BRACKET;;;;
+FE38;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET;Pe;0;ON;<vertical> 007D;;;;N;GLYPH FOR VERTICAL CLOSING CURLY BRACKET;;;;
+FE39;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<vertical> 3014;;;;N;GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET;;;;
+FE3A;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<vertical> 3015;;;;N;GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET;;;;
+FE3B;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;<vertical> 3010;;;;N;GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET;;;;
+FE3C;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;<vertical> 3011;;;;N;GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET;;;;
+FE3D;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;<vertical> 300A;;;;N;GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET;;;;
+FE3E;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;<vertical> 300B;;;;N;GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET;;;;
+FE3F;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET;Ps;0;ON;<vertical> 3008;;;;N;GLYPH FOR VERTICAL OPENING ANGLE BRACKET;;;;
+FE40;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET;Pe;0;ON;<vertical> 3009;;;;N;GLYPH FOR VERTICAL CLOSING ANGLE BRACKET;;;;
+FE41;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET;Ps;0;ON;<vertical> 300C;;;;N;GLYPH FOR VERTICAL OPENING CORNER BRACKET;;;;
+FE42;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET;Pe;0;ON;<vertical> 300D;;;;N;GLYPH FOR VERTICAL CLOSING CORNER BRACKET;;;;
+FE43;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET;Ps;0;ON;<vertical> 300E;;;;N;GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET;;;;
+FE44;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET;Pe;0;ON;<vertical> 300F;;;;N;GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET;;;;
+FE45;SESAME DOT;Po;0;ON;;;;;N;;;;;
+FE46;WHITE SESAME DOT;Po;0;ON;;;;;N;;;;;
+FE47;PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET;Ps;0;ON;<vertical> 005B;;;;N;;;;;
+FE48;PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET;Pe;0;ON;<vertical> 005D;;;;N;;;;;
+FE49;DASHED OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DASHED OVERSCORE;;;;
+FE4A;CENTRELINE OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING CENTERLINE OVERSCORE;;;;
+FE4B;WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING WAVY OVERSCORE;;;;
+FE4C;DOUBLE WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DOUBLE WAVY OVERSCORE;;;;
+FE4D;DASHED LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING DASHED UNDERSCORE;;;;
+FE4E;CENTRELINE LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING CENTERLINE UNDERSCORE;;;;
+FE4F;WAVY LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING WAVY UNDERSCORE;;;;
+FE50;SMALL COMMA;Po;0;CS;<small> 002C;;;;N;;;;;
+FE51;SMALL IDEOGRAPHIC COMMA;Po;0;ON;<small> 3001;;;;N;;;;;
+FE52;SMALL FULL STOP;Po;0;CS;<small> 002E;;;;N;SMALL PERIOD;;;;
+FE54;SMALL SEMICOLON;Po;0;ON;<small> 003B;;;;N;;;;;
+FE55;SMALL COLON;Po;0;CS;<small> 003A;;;;N;;;;;
+FE56;SMALL QUESTION MARK;Po;0;ON;<small> 003F;;;;N;;;;;
+FE57;SMALL EXCLAMATION MARK;Po;0;ON;<small> 0021;;;;N;;;;;
+FE58;SMALL EM DASH;Pd;0;ON;<small> 2014;;;;N;;;;;
+FE59;SMALL LEFT PARENTHESIS;Ps;0;ON;<small> 0028;;;;Y;SMALL OPENING PARENTHESIS;;;;
+FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON;<small> 0029;;;;Y;SMALL CLOSING PARENTHESIS;;;;
+FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON;<small> 007B;;;;Y;SMALL OPENING CURLY BRACKET;;;;
+FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON;<small> 007D;;;;Y;SMALL CLOSING CURLY BRACKET;;;;
+FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<small> 3014;;;;Y;SMALL OPENING TORTOISE SHELL BRACKET;;;;
+FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<small> 3015;;;;Y;SMALL CLOSING TORTOISE SHELL BRACKET;;;;
+FE5F;SMALL NUMBER SIGN;Po;0;ET;<small> 0023;;;;N;;;;;
+FE60;SMALL AMPERSAND;Po;0;ON;<small> 0026;;;;N;;;;;
+FE61;SMALL ASTERISK;Po;0;ON;<small> 002A;;;;N;;;;;
+FE62;SMALL PLUS SIGN;Sm;0;ES;<small> 002B;;;;N;;;;;
+FE63;SMALL HYPHEN-MINUS;Pd;0;ES;<small> 002D;;;;N;;;;;
+FE64;SMALL LESS-THAN SIGN;Sm;0;ON;<small> 003C;;;;Y;;;;;
+FE65;SMALL GREATER-THAN SIGN;Sm;0;ON;<small> 003E;;;;Y;;;;;
+FE66;SMALL EQUALS SIGN;Sm;0;ON;<small> 003D;;;;N;;;;;
+FE68;SMALL REVERSE SOLIDUS;Po;0;ON;<small> 005C;;;;N;SMALL BACKSLASH;;;;
+FE69;SMALL DOLLAR SIGN;Sc;0;ET;<small> 0024;;;;N;;;;;
+FE6A;SMALL PERCENT SIGN;Po;0;ET;<small> 0025;;;;N;;;;;
+FE6B;SMALL COMMERCIAL AT;Po;0;ON;<small> 0040;;;;N;;;;;
+FE70;ARABIC FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064B;;;;N;ARABIC SPACING FATHATAN;;;;
+FE71;ARABIC TATWEEL WITH FATHATAN ABOVE;Lo;0;AL;<medial> 0640 064B;;;;N;ARABIC FATHATAN ON TATWEEL;;;;
+FE72;ARABIC DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C;;;;N;ARABIC SPACING DAMMATAN;;;;
+FE73;ARABIC TAIL FRAGMENT;Lo;0;AL;;;;;N;;;;;
+FE74;ARABIC KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D;;;;N;ARABIC SPACING KASRATAN;;;;
+FE76;ARABIC FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E;;;;N;ARABIC SPACING FATHAH;;;;
+FE77;ARABIC FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E;;;;N;ARABIC FATHAH ON TATWEEL;;;;
+FE78;ARABIC DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F;;;;N;ARABIC SPACING DAMMAH;;;;
+FE79;ARABIC DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F;;;;N;ARABIC DAMMAH ON TATWEEL;;;;
+FE7A;ARABIC KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650;;;;N;ARABIC SPACING KASRAH;;;;
+FE7B;ARABIC KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650;;;;N;ARABIC KASRAH ON TATWEEL;;;;
+FE7C;ARABIC SHADDA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651;;;;N;ARABIC SPACING SHADDAH;;;;
+FE7D;ARABIC SHADDA MEDIAL FORM;Lo;0;AL;<medial> 0640 0651;;;;N;ARABIC SHADDAH ON TATWEEL;;;;
+FE7E;ARABIC SUKUN ISOLATED FORM;Lo;0;AL;<isolated> 0020 0652;;;;N;ARABIC SPACING SUKUN;;;;
+FE7F;ARABIC SUKUN MEDIAL FORM;Lo;0;AL;<medial> 0640 0652;;;;N;ARABIC SUKUN ON TATWEEL;;;;
+FE80;ARABIC LETTER HAMZA ISOLATED FORM;Lo;0;AL;<isolated> 0621;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH;;;;
+FE81;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF;;;;
+FE82;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON ALEF;;;;
+FE83;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF;;;;
+FE84;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON ALEF;;;;
+FE85;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0624;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW;;;;
+FE86;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0624;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON WAW;;;;
+FE87;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF;;;;
+FE88;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF;;;;
+FE89;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0626;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON YA;;;;
+FE8A;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0626;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON YA;;;;
+FE8B;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM;Lo;0;AL;<initial> 0626;;;;N;GLYPH FOR INITIAL ARABIC HAMZAH ON YA;;;;
+FE8C;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM;Lo;0;AL;<medial> 0626;;;;N;GLYPH FOR MEDIAL ARABIC HAMZAH ON YA;;;;
+FE8D;ARABIC LETTER ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0627;;;;N;GLYPH FOR ISOLATE ARABIC ALEF;;;;
+FE8E;ARABIC LETTER ALEF FINAL FORM;Lo;0;AL;<final> 0627;;;;N;GLYPH FOR FINAL ARABIC ALEF;;;;
+FE8F;ARABIC LETTER BEH ISOLATED FORM;Lo;0;AL;<isolated> 0628;;;;N;GLYPH FOR ISOLATE ARABIC BAA;;;;
+FE90;ARABIC LETTER BEH FINAL FORM;Lo;0;AL;<final> 0628;;;;N;GLYPH FOR FINAL ARABIC BAA;;;;
+FE91;ARABIC LETTER BEH INITIAL FORM;Lo;0;AL;<initial> 0628;;;;N;GLYPH FOR INITIAL ARABIC BAA;;;;
+FE92;ARABIC LETTER BEH MEDIAL FORM;Lo;0;AL;<medial> 0628;;;;N;GLYPH FOR MEDIAL ARABIC BAA;;;;
+FE93;ARABIC LETTER TEH MARBUTA ISOLATED FORM;Lo;0;AL;<isolated> 0629;;;;N;GLYPH FOR ISOLATE ARABIC TAA MARBUTAH;;;;
+FE94;ARABIC LETTER TEH MARBUTA FINAL FORM;Lo;0;AL;<final> 0629;;;;N;GLYPH FOR FINAL ARABIC TAA MARBUTAH;;;;
+FE95;ARABIC LETTER TEH ISOLATED FORM;Lo;0;AL;<isolated> 062A;;;;N;GLYPH FOR ISOLATE ARABIC TAA;;;;
+FE96;ARABIC LETTER TEH FINAL FORM;Lo;0;AL;<final> 062A;;;;N;GLYPH FOR FINAL ARABIC TAA;;;;
+FE97;ARABIC LETTER TEH INITIAL FORM;Lo;0;AL;<initial> 062A;;;;N;GLYPH FOR INITIAL ARABIC TAA;;;;
+FE98;ARABIC LETTER TEH MEDIAL FORM;Lo;0;AL;<medial> 062A;;;;N;GLYPH FOR MEDIAL ARABIC TAA;;;;
+FE99;ARABIC LETTER THEH ISOLATED FORM;Lo;0;AL;<isolated> 062B;;;;N;GLYPH FOR ISOLATE ARABIC THAA;;;;
+FE9A;ARABIC LETTER THEH FINAL FORM;Lo;0;AL;<final> 062B;;;;N;GLYPH FOR FINAL ARABIC THAA;;;;
+FE9B;ARABIC LETTER THEH INITIAL FORM;Lo;0;AL;<initial> 062B;;;;N;GLYPH FOR INITIAL ARABIC THAA;;;;
+FE9C;ARABIC LETTER THEH MEDIAL FORM;Lo;0;AL;<medial> 062B;;;;N;GLYPH FOR MEDIAL ARABIC THAA;;;;
+FE9D;ARABIC LETTER JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C;;;;N;GLYPH FOR ISOLATE ARABIC JEEM;;;;
+FE9E;ARABIC LETTER JEEM FINAL FORM;Lo;0;AL;<final> 062C;;;;N;GLYPH FOR FINAL ARABIC JEEM;;;;
+FE9F;ARABIC LETTER JEEM INITIAL FORM;Lo;0;AL;<initial> 062C;;;;N;GLYPH FOR INITIAL ARABIC JEEM;;;;
+FEA0;ARABIC LETTER JEEM MEDIAL FORM;Lo;0;AL;<medial> 062C;;;;N;GLYPH FOR MEDIAL ARABIC JEEM;;;;
+FEA1;ARABIC LETTER HAH ISOLATED FORM;Lo;0;AL;<isolated> 062D;;;;N;GLYPH FOR ISOLATE ARABIC HAA;;;;
+FEA2;ARABIC LETTER HAH FINAL FORM;Lo;0;AL;<final> 062D;;;;N;GLYPH FOR FINAL ARABIC HAA;;;;
+FEA3;ARABIC LETTER HAH INITIAL FORM;Lo;0;AL;<initial> 062D;;;;N;GLYPH FOR INITIAL ARABIC HAA;;;;
+FEA4;ARABIC LETTER HAH MEDIAL FORM;Lo;0;AL;<medial> 062D;;;;N;GLYPH FOR MEDIAL ARABIC HAA;;;;
+FEA5;ARABIC LETTER KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062E;;;;N;GLYPH FOR ISOLATE ARABIC KHAA;;;;
+FEA6;ARABIC LETTER KHAH FINAL FORM;Lo;0;AL;<final> 062E;;;;N;GLYPH FOR FINAL ARABIC KHAA;;;;
+FEA7;ARABIC LETTER KHAH INITIAL FORM;Lo;0;AL;<initial> 062E;;;;N;GLYPH FOR INITIAL ARABIC KHAA;;;;
+FEA8;ARABIC LETTER KHAH MEDIAL FORM;Lo;0;AL;<medial> 062E;;;;N;GLYPH FOR MEDIAL ARABIC KHAA;;;;
+FEA9;ARABIC LETTER DAL ISOLATED FORM;Lo;0;AL;<isolated> 062F;;;;N;GLYPH FOR ISOLATE ARABIC DAL;;;;
+FEAA;ARABIC LETTER DAL FINAL FORM;Lo;0;AL;<final> 062F;;;;N;GLYPH FOR FINAL ARABIC DAL;;;;
+FEAB;ARABIC LETTER THAL ISOLATED FORM;Lo;0;AL;<isolated> 0630;;;;N;GLYPH FOR ISOLATE ARABIC THAL;;;;
+FEAC;ARABIC LETTER THAL FINAL FORM;Lo;0;AL;<final> 0630;;;;N;GLYPH FOR FINAL ARABIC THAL;;;;
+FEAD;ARABIC LETTER REH ISOLATED FORM;Lo;0;AL;<isolated> 0631;;;;N;GLYPH FOR ISOLATE ARABIC RA;;;;
+FEAE;ARABIC LETTER REH FINAL FORM;Lo;0;AL;<final> 0631;;;;N;GLYPH FOR FINAL ARABIC RA;;;;
+FEAF;ARABIC LETTER ZAIN ISOLATED FORM;Lo;0;AL;<isolated> 0632;;;;N;GLYPH FOR ISOLATE ARABIC ZAIN;;;;
+FEB0;ARABIC LETTER ZAIN FINAL FORM;Lo;0;AL;<final> 0632;;;;N;GLYPH FOR FINAL ARABIC ZAIN;;;;
+FEB1;ARABIC LETTER SEEN ISOLATED FORM;Lo;0;AL;<isolated> 0633;;;;N;GLYPH FOR ISOLATE ARABIC SEEN;;;;
+FEB2;ARABIC LETTER SEEN FINAL FORM;Lo;0;AL;<final> 0633;;;;N;GLYPH FOR FINAL ARABIC SEEN;;;;
+FEB3;ARABIC LETTER SEEN INITIAL FORM;Lo;0;AL;<initial> 0633;;;;N;GLYPH FOR INITIAL ARABIC SEEN;;;;
+FEB4;ARABIC LETTER SEEN MEDIAL FORM;Lo;0;AL;<medial> 0633;;;;N;GLYPH FOR MEDIAL ARABIC SEEN;;;;
+FEB5;ARABIC LETTER SHEEN ISOLATED FORM;Lo;0;AL;<isolated> 0634;;;;N;GLYPH FOR ISOLATE ARABIC SHEEN;;;;
+FEB6;ARABIC LETTER SHEEN FINAL FORM;Lo;0;AL;<final> 0634;;;;N;GLYPH FOR FINAL ARABIC SHEEN;;;;
+FEB7;ARABIC LETTER SHEEN INITIAL FORM;Lo;0;AL;<initial> 0634;;;;N;GLYPH FOR INITIAL ARABIC SHEEN;;;;
+FEB8;ARABIC LETTER SHEEN MEDIAL FORM;Lo;0;AL;<medial> 0634;;;;N;GLYPH FOR MEDIAL ARABIC SHEEN;;;;
+FEB9;ARABIC LETTER SAD ISOLATED FORM;Lo;0;AL;<isolated> 0635;;;;N;GLYPH FOR ISOLATE ARABIC SAD;;;;
+FEBA;ARABIC LETTER SAD FINAL FORM;Lo;0;AL;<final> 0635;;;;N;GLYPH FOR FINAL ARABIC SAD;;;;
+FEBB;ARABIC LETTER SAD INITIAL FORM;Lo;0;AL;<initial> 0635;;;;N;GLYPH FOR INITIAL ARABIC SAD;;;;
+FEBC;ARABIC LETTER SAD MEDIAL FORM;Lo;0;AL;<medial> 0635;;;;N;GLYPH FOR MEDIAL ARABIC SAD;;;;
+FEBD;ARABIC LETTER DAD ISOLATED FORM;Lo;0;AL;<isolated> 0636;;;;N;GLYPH FOR ISOLATE ARABIC DAD;;;;
+FEBE;ARABIC LETTER DAD FINAL FORM;Lo;0;AL;<final> 0636;;;;N;GLYPH FOR FINAL ARABIC DAD;;;;
+FEBF;ARABIC LETTER DAD INITIAL FORM;Lo;0;AL;<initial> 0636;;;;N;GLYPH FOR INITIAL ARABIC DAD;;;;
+FEC0;ARABIC LETTER DAD MEDIAL FORM;Lo;0;AL;<medial> 0636;;;;N;GLYPH FOR MEDIAL ARABIC DAD;;;;
+FEC1;ARABIC LETTER TAH ISOLATED FORM;Lo;0;AL;<isolated> 0637;;;;N;GLYPH FOR ISOLATE ARABIC TAH;;;;
+FEC2;ARABIC LETTER TAH FINAL FORM;Lo;0;AL;<final> 0637;;;;N;GLYPH FOR FINAL ARABIC TAH;;;;
+FEC3;ARABIC LETTER TAH INITIAL FORM;Lo;0;AL;<initial> 0637;;;;N;GLYPH FOR INITIAL ARABIC TAH;;;;
+FEC4;ARABIC LETTER TAH MEDIAL FORM;Lo;0;AL;<medial> 0637;;;;N;GLYPH FOR MEDIAL ARABIC TAH;;;;
+FEC5;ARABIC LETTER ZAH ISOLATED FORM;Lo;0;AL;<isolated> 0638;;;;N;GLYPH FOR ISOLATE ARABIC DHAH;;;;
+FEC6;ARABIC LETTER ZAH FINAL FORM;Lo;0;AL;<final> 0638;;;;N;GLYPH FOR FINAL ARABIC DHAH;;;;
+FEC7;ARABIC LETTER ZAH INITIAL FORM;Lo;0;AL;<initial> 0638;;;;N;GLYPH FOR INITIAL ARABIC DHAH;;;;
+FEC8;ARABIC LETTER ZAH MEDIAL FORM;Lo;0;AL;<medial> 0638;;;;N;GLYPH FOR MEDIAL ARABIC DHAH;;;;
+FEC9;ARABIC LETTER AIN ISOLATED FORM;Lo;0;AL;<isolated> 0639;;;;N;GLYPH FOR ISOLATE ARABIC AIN;;;;
+FECA;ARABIC LETTER AIN FINAL FORM;Lo;0;AL;<final> 0639;;;;N;GLYPH FOR FINAL ARABIC AIN;;;;
+FECB;ARABIC LETTER AIN INITIAL FORM;Lo;0;AL;<initial> 0639;;;;N;GLYPH FOR INITIAL ARABIC AIN;;;;
+FECC;ARABIC LETTER AIN MEDIAL FORM;Lo;0;AL;<medial> 0639;;;;N;GLYPH FOR MEDIAL ARABIC AIN;;;;
+FECD;ARABIC LETTER GHAIN ISOLATED FORM;Lo;0;AL;<isolated> 063A;;;;N;GLYPH FOR ISOLATE ARABIC GHAIN;;;;
+FECE;ARABIC LETTER GHAIN FINAL FORM;Lo;0;AL;<final> 063A;;;;N;GLYPH FOR FINAL ARABIC GHAIN;;;;
+FECF;ARABIC LETTER GHAIN INITIAL FORM;Lo;0;AL;<initial> 063A;;;;N;GLYPH FOR INITIAL ARABIC GHAIN;;;;
+FED0;ARABIC LETTER GHAIN MEDIAL FORM;Lo;0;AL;<medial> 063A;;;;N;GLYPH FOR MEDIAL ARABIC GHAIN;;;;
+FED1;ARABIC LETTER FEH ISOLATED FORM;Lo;0;AL;<isolated> 0641;;;;N;GLYPH FOR ISOLATE ARABIC FA;;;;
+FED2;ARABIC LETTER FEH FINAL FORM;Lo;0;AL;<final> 0641;;;;N;GLYPH FOR FINAL ARABIC FA;;;;
+FED3;ARABIC LETTER FEH INITIAL FORM;Lo;0;AL;<initial> 0641;;;;N;GLYPH FOR INITIAL ARABIC FA;;;;
+FED4;ARABIC LETTER FEH MEDIAL FORM;Lo;0;AL;<medial> 0641;;;;N;GLYPH FOR MEDIAL ARABIC FA;;;;
+FED5;ARABIC LETTER QAF ISOLATED FORM;Lo;0;AL;<isolated> 0642;;;;N;GLYPH FOR ISOLATE ARABIC QAF;;;;
+FED6;ARABIC LETTER QAF FINAL FORM;Lo;0;AL;<final> 0642;;;;N;GLYPH FOR FINAL ARABIC QAF;;;;
+FED7;ARABIC LETTER QAF INITIAL FORM;Lo;0;AL;<initial> 0642;;;;N;GLYPH FOR INITIAL ARABIC QAF;;;;
+FED8;ARABIC LETTER QAF MEDIAL FORM;Lo;0;AL;<medial> 0642;;;;N;GLYPH FOR MEDIAL ARABIC QAF;;;;
+FED9;ARABIC LETTER KAF ISOLATED FORM;Lo;0;AL;<isolated> 0643;;;;N;GLYPH FOR ISOLATE ARABIC CAF;;;;
+FEDA;ARABIC LETTER KAF FINAL FORM;Lo;0;AL;<final> 0643;;;;N;GLYPH FOR FINAL ARABIC CAF;;;;
+FEDB;ARABIC LETTER KAF INITIAL FORM;Lo;0;AL;<initial> 0643;;;;N;GLYPH FOR INITIAL ARABIC CAF;;;;
+FEDC;ARABIC LETTER KAF MEDIAL FORM;Lo;0;AL;<medial> 0643;;;;N;GLYPH FOR MEDIAL ARABIC CAF;;;;
+FEDD;ARABIC LETTER LAM ISOLATED FORM;Lo;0;AL;<isolated> 0644;;;;N;GLYPH FOR ISOLATE ARABIC LAM;;;;
+FEDE;ARABIC LETTER LAM FINAL FORM;Lo;0;AL;<final> 0644;;;;N;GLYPH FOR FINAL ARABIC LAM;;;;
+FEDF;ARABIC LETTER LAM INITIAL FORM;Lo;0;AL;<initial> 0644;;;;N;GLYPH FOR INITIAL ARABIC LAM;;;;
+FEE0;ARABIC LETTER LAM MEDIAL FORM;Lo;0;AL;<medial> 0644;;;;N;GLYPH FOR MEDIAL ARABIC LAM;;;;
+FEE1;ARABIC LETTER MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645;;;;N;GLYPH FOR ISOLATE ARABIC MEEM;;;;
+FEE2;ARABIC LETTER MEEM FINAL FORM;Lo;0;AL;<final> 0645;;;;N;GLYPH FOR FINAL ARABIC MEEM;;;;
+FEE3;ARABIC LETTER MEEM INITIAL FORM;Lo;0;AL;<initial> 0645;;;;N;GLYPH FOR INITIAL ARABIC MEEM;;;;
+FEE4;ARABIC LETTER MEEM MEDIAL FORM;Lo;0;AL;<medial> 0645;;;;N;GLYPH FOR MEDIAL ARABIC MEEM;;;;
+FEE5;ARABIC LETTER NOON ISOLATED FORM;Lo;0;AL;<isolated> 0646;;;;N;GLYPH FOR ISOLATE ARABIC NOON;;;;
+FEE6;ARABIC LETTER NOON FINAL FORM;Lo;0;AL;<final> 0646;;;;N;GLYPH FOR FINAL ARABIC NOON;;;;
+FEE7;ARABIC LETTER NOON INITIAL FORM;Lo;0;AL;<initial> 0646;;;;N;GLYPH FOR INITIAL ARABIC NOON;;;;
+FEE8;ARABIC LETTER NOON MEDIAL FORM;Lo;0;AL;<medial> 0646;;;;N;GLYPH FOR MEDIAL ARABIC NOON;;;;
+FEE9;ARABIC LETTER HEH ISOLATED FORM;Lo;0;AL;<isolated> 0647;;;;N;GLYPH FOR ISOLATE ARABIC HA;;;;
+FEEA;ARABIC LETTER HEH FINAL FORM;Lo;0;AL;<final> 0647;;;;N;GLYPH FOR FINAL ARABIC HA;;;;
+FEEB;ARABIC LETTER HEH INITIAL FORM;Lo;0;AL;<initial> 0647;;;;N;GLYPH FOR INITIAL ARABIC HA;;;;
+FEEC;ARABIC LETTER HEH MEDIAL FORM;Lo;0;AL;<medial> 0647;;;;N;GLYPH FOR MEDIAL ARABIC HA;;;;
+FEED;ARABIC LETTER WAW ISOLATED FORM;Lo;0;AL;<isolated> 0648;;;;N;GLYPH FOR ISOLATE ARABIC WAW;;;;
+FEEE;ARABIC LETTER WAW FINAL FORM;Lo;0;AL;<final> 0648;;;;N;GLYPH FOR FINAL ARABIC WAW;;;;
+FEEF;ARABIC LETTER ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0649;;;;N;GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH;;;;
+FEF0;ARABIC LETTER ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0649;;;;N;GLYPH FOR FINAL ARABIC ALEF MAQSURAH;;;;
+FEF1;ARABIC LETTER YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A;;;;N;GLYPH FOR ISOLATE ARABIC YA;;;;
+FEF2;ARABIC LETTER YEH FINAL FORM;Lo;0;AL;<final> 064A;;;;N;GLYPH FOR FINAL ARABIC YA;;;;
+FEF3;ARABIC LETTER YEH INITIAL FORM;Lo;0;AL;<initial> 064A;;;;N;GLYPH FOR INITIAL ARABIC YA;;;;
+FEF4;ARABIC LETTER YEH MEDIAL FORM;Lo;0;AL;<medial> 064A;;;;N;GLYPH FOR MEDIAL ARABIC YA;;;;
+FEF5;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF;;;;
+FEF6;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF;;;;
+FEF7;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF;;;;
+FEF8;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF;;;;
+FEF9;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0644 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;;
+FEFA;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0644 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;;
+FEFB;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0644 0627;;;;N;GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF;;;;
+FEFC;ARABIC LIGATURE LAM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0644 0627;;;;N;GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF;;;;
+FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;;
+FF01;FULLWIDTH EXCLAMATION MARK;Po;0;ON;<wide> 0021;;;;N;;;;;
+FF02;FULLWIDTH QUOTATION MARK;Po;0;ON;<wide> 0022;;;;N;;;;;
+FF03;FULLWIDTH NUMBER SIGN;Po;0;ET;<wide> 0023;;;;N;;;;;
+FF04;FULLWIDTH DOLLAR SIGN;Sc;0;ET;<wide> 0024;;;;N;;;;;
+FF05;FULLWIDTH PERCENT SIGN;Po;0;ET;<wide> 0025;;;;N;;;;;
+FF06;FULLWIDTH AMPERSAND;Po;0;ON;<wide> 0026;;;;N;;;;;
+FF07;FULLWIDTH APOSTROPHE;Po;0;ON;<wide> 0027;;;;N;;;;;
+FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON;<wide> 0028;;;;Y;FULLWIDTH OPENING PARENTHESIS;;;;
+FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON;<wide> 0029;;;;Y;FULLWIDTH CLOSING PARENTHESIS;;;;
+FF0A;FULLWIDTH ASTERISK;Po;0;ON;<wide> 002A;;;;N;;;;;
+FF0B;FULLWIDTH PLUS SIGN;Sm;0;ES;<wide> 002B;;;;N;;;;;
+FF0C;FULLWIDTH COMMA;Po;0;CS;<wide> 002C;;;;N;;;;;
+FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ES;<wide> 002D;;;;N;;;;;
+FF0E;FULLWIDTH FULL STOP;Po;0;CS;<wide> 002E;;;;N;FULLWIDTH PERIOD;;;;
+FF0F;FULLWIDTH SOLIDUS;Po;0;CS;<wide> 002F;;;;N;FULLWIDTH SLASH;;;;
+FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN;<wide> 0030;0;0;0;N;;;;;
+FF11;FULLWIDTH DIGIT ONE;Nd;0;EN;<wide> 0031;1;1;1;N;;;;;
+FF12;FULLWIDTH DIGIT TWO;Nd;0;EN;<wide> 0032;2;2;2;N;;;;;
+FF13;FULLWIDTH DIGIT THREE;Nd;0;EN;<wide> 0033;3;3;3;N;;;;;
+FF14;FULLWIDTH DIGIT FOUR;Nd;0;EN;<wide> 0034;4;4;4;N;;;;;
+FF15;FULLWIDTH DIGIT FIVE;Nd;0;EN;<wide> 0035;5;5;5;N;;;;;
+FF16;FULLWIDTH DIGIT SIX;Nd;0;EN;<wide> 0036;6;6;6;N;;;;;
+FF17;FULLWIDTH DIGIT SEVEN;Nd;0;EN;<wide> 0037;7;7;7;N;;;;;
+FF18;FULLWIDTH DIGIT EIGHT;Nd;0;EN;<wide> 0038;8;8;8;N;;;;;
+FF19;FULLWIDTH DIGIT NINE;Nd;0;EN;<wide> 0039;9;9;9;N;;;;;
+FF1A;FULLWIDTH COLON;Po;0;CS;<wide> 003A;;;;N;;;;;
+FF1B;FULLWIDTH SEMICOLON;Po;0;ON;<wide> 003B;;;;N;;;;;
+FF1C;FULLWIDTH LESS-THAN SIGN;Sm;0;ON;<wide> 003C;;;;Y;;;;;
+FF1D;FULLWIDTH EQUALS SIGN;Sm;0;ON;<wide> 003D;;;;N;;;;;
+FF1E;FULLWIDTH GREATER-THAN SIGN;Sm;0;ON;<wide> 003E;;;;Y;;;;;
+FF1F;FULLWIDTH QUESTION MARK;Po;0;ON;<wide> 003F;;;;N;;;;;
+FF20;FULLWIDTH COMMERCIAL AT;Po;0;ON;<wide> 0040;;;;N;;;;;
+FF21;FULLWIDTH LATIN CAPITAL LETTER A;Lu;0;L;<wide> 0041;;;;N;;;;FF41;
+FF22;FULLWIDTH LATIN CAPITAL LETTER B;Lu;0;L;<wide> 0042;;;;N;;;;FF42;
+FF23;FULLWIDTH LATIN CAPITAL LETTER C;Lu;0;L;<wide> 0043;;;;N;;;;FF43;
+FF24;FULLWIDTH LATIN CAPITAL LETTER D;Lu;0;L;<wide> 0044;;;;N;;;;FF44;
+FF25;FULLWIDTH LATIN CAPITAL LETTER E;Lu;0;L;<wide> 0045;;;;N;;;;FF45;
+FF26;FULLWIDTH LATIN CAPITAL LETTER F;Lu;0;L;<wide> 0046;;;;N;;;;FF46;
+FF27;FULLWIDTH LATIN CAPITAL LETTER G;Lu;0;L;<wide> 0047;;;;N;;;;FF47;
+FF28;FULLWIDTH LATIN CAPITAL LETTER H;Lu;0;L;<wide> 0048;;;;N;;;;FF48;
+FF29;FULLWIDTH LATIN CAPITAL LETTER I;Lu;0;L;<wide> 0049;;;;N;;;;FF49;
+FF2A;FULLWIDTH LATIN CAPITAL LETTER J;Lu;0;L;<wide> 004A;;;;N;;;;FF4A;
+FF2B;FULLWIDTH LATIN CAPITAL LETTER K;Lu;0;L;<wide> 004B;;;;N;;;;FF4B;
+FF2C;FULLWIDTH LATIN CAPITAL LETTER L;Lu;0;L;<wide> 004C;;;;N;;;;FF4C;
+FF2D;FULLWIDTH LATIN CAPITAL LETTER M;Lu;0;L;<wide> 004D;;;;N;;;;FF4D;
+FF2E;FULLWIDTH LATIN CAPITAL LETTER N;Lu;0;L;<wide> 004E;;;;N;;;;FF4E;
+FF2F;FULLWIDTH LATIN CAPITAL LETTER O;Lu;0;L;<wide> 004F;;;;N;;;;FF4F;
+FF30;FULLWIDTH LATIN CAPITAL LETTER P;Lu;0;L;<wide> 0050;;;;N;;;;FF50;
+FF31;FULLWIDTH LATIN CAPITAL LETTER Q;Lu;0;L;<wide> 0051;;;;N;;;;FF51;
+FF32;FULLWIDTH LATIN CAPITAL LETTER R;Lu;0;L;<wide> 0052;;;;N;;;;FF52;
+FF33;FULLWIDTH LATIN CAPITAL LETTER S;Lu;0;L;<wide> 0053;;;;N;;;;FF53;
+FF34;FULLWIDTH LATIN CAPITAL LETTER T;Lu;0;L;<wide> 0054;;;;N;;;;FF54;
+FF35;FULLWIDTH LATIN CAPITAL LETTER U;Lu;0;L;<wide> 0055;;;;N;;;;FF55;
+FF36;FULLWIDTH LATIN CAPITAL LETTER V;Lu;0;L;<wide> 0056;;;;N;;;;FF56;
+FF37;FULLWIDTH LATIN CAPITAL LETTER W;Lu;0;L;<wide> 0057;;;;N;;;;FF57;
+FF38;FULLWIDTH LATIN CAPITAL LETTER X;Lu;0;L;<wide> 0058;;;;N;;;;FF58;
+FF39;FULLWIDTH LATIN CAPITAL LETTER Y;Lu;0;L;<wide> 0059;;;;N;;;;FF59;
+FF3A;FULLWIDTH LATIN CAPITAL LETTER Z;Lu;0;L;<wide> 005A;;;;N;;;;FF5A;
+FF3B;FULLWIDTH LEFT SQUARE BRACKET;Ps;0;ON;<wide> 005B;;;;Y;FULLWIDTH OPENING SQUARE BRACKET;;;;
+FF3C;FULLWIDTH REVERSE SOLIDUS;Po;0;ON;<wide> 005C;;;;N;FULLWIDTH BACKSLASH;;;;
+FF3D;FULLWIDTH RIGHT SQUARE BRACKET;Pe;0;ON;<wide> 005D;;;;Y;FULLWIDTH CLOSING SQUARE BRACKET;;;;
+FF3E;FULLWIDTH CIRCUMFLEX ACCENT;Sk;0;ON;<wide> 005E;;;;N;FULLWIDTH SPACING CIRCUMFLEX;;;;
+FF3F;FULLWIDTH LOW LINE;Pc;0;ON;<wide> 005F;;;;N;FULLWIDTH SPACING UNDERSCORE;;;;
+FF40;FULLWIDTH GRAVE ACCENT;Sk;0;ON;<wide> 0060;;;;N;FULLWIDTH SPACING GRAVE;;;;
+FF41;FULLWIDTH LATIN SMALL LETTER A;Ll;0;L;<wide> 0061;;;;N;;;FF21;;FF21
+FF42;FULLWIDTH LATIN SMALL LETTER B;Ll;0;L;<wide> 0062;;;;N;;;FF22;;FF22
+FF43;FULLWIDTH LATIN SMALL LETTER C;Ll;0;L;<wide> 0063;;;;N;;;FF23;;FF23
+FF44;FULLWIDTH LATIN SMALL LETTER D;Ll;0;L;<wide> 0064;;;;N;;;FF24;;FF24
+FF45;FULLWIDTH LATIN SMALL LETTER E;Ll;0;L;<wide> 0065;;;;N;;;FF25;;FF25
+FF46;FULLWIDTH LATIN SMALL LETTER F;Ll;0;L;<wide> 0066;;;;N;;;FF26;;FF26
+FF47;FULLWIDTH LATIN SMALL LETTER G;Ll;0;L;<wide> 0067;;;;N;;;FF27;;FF27
+FF48;FULLWIDTH LATIN SMALL LETTER H;Ll;0;L;<wide> 0068;;;;N;;;FF28;;FF28
+FF49;FULLWIDTH LATIN SMALL LETTER I;Ll;0;L;<wide> 0069;;;;N;;;FF29;;FF29
+FF4A;FULLWIDTH LATIN SMALL LETTER J;Ll;0;L;<wide> 006A;;;;N;;;FF2A;;FF2A
+FF4B;FULLWIDTH LATIN SMALL LETTER K;Ll;0;L;<wide> 006B;;;;N;;;FF2B;;FF2B
+FF4C;FULLWIDTH LATIN SMALL LETTER L;Ll;0;L;<wide> 006C;;;;N;;;FF2C;;FF2C
+FF4D;FULLWIDTH LATIN SMALL LETTER M;Ll;0;L;<wide> 006D;;;;N;;;FF2D;;FF2D
+FF4E;FULLWIDTH LATIN SMALL LETTER N;Ll;0;L;<wide> 006E;;;;N;;;FF2E;;FF2E
+FF4F;FULLWIDTH LATIN SMALL LETTER O;Ll;0;L;<wide> 006F;;;;N;;;FF2F;;FF2F
+FF50;FULLWIDTH LATIN SMALL LETTER P;Ll;0;L;<wide> 0070;;;;N;;;FF30;;FF30
+FF51;FULLWIDTH LATIN SMALL LETTER Q;Ll;0;L;<wide> 0071;;;;N;;;FF31;;FF31
+FF52;FULLWIDTH LATIN SMALL LETTER R;Ll;0;L;<wide> 0072;;;;N;;;FF32;;FF32
+FF53;FULLWIDTH LATIN SMALL LETTER S;Ll;0;L;<wide> 0073;;;;N;;;FF33;;FF33
+FF54;FULLWIDTH LATIN SMALL LETTER T;Ll;0;L;<wide> 0074;;;;N;;;FF34;;FF34
+FF55;FULLWIDTH LATIN SMALL LETTER U;Ll;0;L;<wide> 0075;;;;N;;;FF35;;FF35
+FF56;FULLWIDTH LATIN SMALL LETTER V;Ll;0;L;<wide> 0076;;;;N;;;FF36;;FF36
+FF57;FULLWIDTH LATIN SMALL LETTER W;Ll;0;L;<wide> 0077;;;;N;;;FF37;;FF37
+FF58;FULLWIDTH LATIN SMALL LETTER X;Ll;0;L;<wide> 0078;;;;N;;;FF38;;FF38
+FF59;FULLWIDTH LATIN SMALL LETTER Y;Ll;0;L;<wide> 0079;;;;N;;;FF39;;FF39
+FF5A;FULLWIDTH LATIN SMALL LETTER Z;Ll;0;L;<wide> 007A;;;;N;;;FF3A;;FF3A
+FF5B;FULLWIDTH LEFT CURLY BRACKET;Ps;0;ON;<wide> 007B;;;;Y;FULLWIDTH OPENING CURLY BRACKET;;;;
+FF5C;FULLWIDTH VERTICAL LINE;Sm;0;ON;<wide> 007C;;;;N;FULLWIDTH VERTICAL BAR;;;;
+FF5D;FULLWIDTH RIGHT CURLY BRACKET;Pe;0;ON;<wide> 007D;;;;Y;FULLWIDTH CLOSING CURLY BRACKET;;;;
+FF5E;FULLWIDTH TILDE;Sm;0;ON;<wide> 007E;;;;N;FULLWIDTH SPACING TILDE;;;;
+FF5F;FULLWIDTH LEFT WHITE PARENTHESIS;Ps;0;ON;<wide> 2985;;;;Y;;;;;
+FF60;FULLWIDTH RIGHT WHITE PARENTHESIS;Pe;0;ON;<wide> 2986;;;;Y;;;;;
+FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON;<narrow> 3002;;;;N;HALFWIDTH IDEOGRAPHIC PERIOD;;;;
+FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON;<narrow> 300C;;;;Y;HALFWIDTH OPENING CORNER BRACKET;;;;
+FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON;<narrow> 300D;;;;Y;HALFWIDTH CLOSING CORNER BRACKET;;;;
+FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON;<narrow> 3001;;;;N;;;;;
+FF65;HALFWIDTH KATAKANA MIDDLE DOT;Po;0;ON;<narrow> 30FB;;;;N;;;;;
+FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L;<narrow> 30F2;;;;N;;;;;
+FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L;<narrow> 30A1;;;;N;;;;;
+FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L;<narrow> 30A3;;;;N;;;;;
+FF69;HALFWIDTH KATAKANA LETTER SMALL U;Lo;0;L;<narrow> 30A5;;;;N;;;;;
+FF6A;HALFWIDTH KATAKANA LETTER SMALL E;Lo;0;L;<narrow> 30A7;;;;N;;;;;
+FF6B;HALFWIDTH KATAKANA LETTER SMALL O;Lo;0;L;<narrow> 30A9;;;;N;;;;;
+FF6C;HALFWIDTH KATAKANA LETTER SMALL YA;Lo;0;L;<narrow> 30E3;;;;N;;;;;
+FF6D;HALFWIDTH KATAKANA LETTER SMALL YU;Lo;0;L;<narrow> 30E5;;;;N;;;;;
+FF6E;HALFWIDTH KATAKANA LETTER SMALL YO;Lo;0;L;<narrow> 30E7;;;;N;;;;;
+FF6F;HALFWIDTH KATAKANA LETTER SMALL TU;Lo;0;L;<narrow> 30C3;;;;N;;;;;
+FF70;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;<narrow> 30FC;;;;N;;;;;
+FF71;HALFWIDTH KATAKANA LETTER A;Lo;0;L;<narrow> 30A2;;;;N;;;;;
+FF72;HALFWIDTH KATAKANA LETTER I;Lo;0;L;<narrow> 30A4;;;;N;;;;;
+FF73;HALFWIDTH KATAKANA LETTER U;Lo;0;L;<narrow> 30A6;;;;N;;;;;
+FF74;HALFWIDTH KATAKANA LETTER E;Lo;0;L;<narrow> 30A8;;;;N;;;;;
+FF75;HALFWIDTH KATAKANA LETTER O;Lo;0;L;<narrow> 30AA;;;;N;;;;;
+FF76;HALFWIDTH KATAKANA LETTER KA;Lo;0;L;<narrow> 30AB;;;;N;;;;;
+FF77;HALFWIDTH KATAKANA LETTER KI;Lo;0;L;<narrow> 30AD;;;;N;;;;;
+FF78;HALFWIDTH KATAKANA LETTER KU;Lo;0;L;<narrow> 30AF;;;;N;;;;;
+FF79;HALFWIDTH KATAKANA LETTER KE;Lo;0;L;<narrow> 30B1;;;;N;;;;;
+FF7A;HALFWIDTH KATAKANA LETTER KO;Lo;0;L;<narrow> 30B3;;;;N;;;;;
+FF7B;HALFWIDTH KATAKANA LETTER SA;Lo;0;L;<narrow> 30B5;;;;N;;;;;
+FF7C;HALFWIDTH KATAKANA LETTER SI;Lo;0;L;<narrow> 30B7;;;;N;;;;;
+FF7D;HALFWIDTH KATAKANA LETTER SU;Lo;0;L;<narrow> 30B9;;;;N;;;;;
+FF7E;HALFWIDTH KATAKANA LETTER SE;Lo;0;L;<narrow> 30BB;;;;N;;;;;
+FF7F;HALFWIDTH KATAKANA LETTER SO;Lo;0;L;<narrow> 30BD;;;;N;;;;;
+FF80;HALFWIDTH KATAKANA LETTER TA;Lo;0;L;<narrow> 30BF;;;;N;;;;;
+FF81;HALFWIDTH KATAKANA LETTER TI;Lo;0;L;<narrow> 30C1;;;;N;;;;;
+FF82;HALFWIDTH KATAKANA LETTER TU;Lo;0;L;<narrow> 30C4;;;;N;;;;;
+FF83;HALFWIDTH KATAKANA LETTER TE;Lo;0;L;<narrow> 30C6;;;;N;;;;;
+FF84;HALFWIDTH KATAKANA LETTER TO;Lo;0;L;<narrow> 30C8;;;;N;;;;;
+FF85;HALFWIDTH KATAKANA LETTER NA;Lo;0;L;<narrow> 30CA;;;;N;;;;;
+FF86;HALFWIDTH KATAKANA LETTER NI;Lo;0;L;<narrow> 30CB;;;;N;;;;;
+FF87;HALFWIDTH KATAKANA LETTER NU;Lo;0;L;<narrow> 30CC;;;;N;;;;;
+FF88;HALFWIDTH KATAKANA LETTER NE;Lo;0;L;<narrow> 30CD;;;;N;;;;;
+FF89;HALFWIDTH KATAKANA LETTER NO;Lo;0;L;<narrow> 30CE;;;;N;;;;;
+FF8A;HALFWIDTH KATAKANA LETTER HA;Lo;0;L;<narrow> 30CF;;;;N;;;;;
+FF8B;HALFWIDTH KATAKANA LETTER HI;Lo;0;L;<narrow> 30D2;;;;N;;;;;
+FF8C;HALFWIDTH KATAKANA LETTER HU;Lo;0;L;<narrow> 30D5;;;;N;;;;;
+FF8D;HALFWIDTH KATAKANA LETTER HE;Lo;0;L;<narrow> 30D8;;;;N;;;;;
+FF8E;HALFWIDTH KATAKANA LETTER HO;Lo;0;L;<narrow> 30DB;;;;N;;;;;
+FF8F;HALFWIDTH KATAKANA LETTER MA;Lo;0;L;<narrow> 30DE;;;;N;;;;;
+FF90;HALFWIDTH KATAKANA LETTER MI;Lo;0;L;<narrow> 30DF;;;;N;;;;;
+FF91;HALFWIDTH KATAKANA LETTER MU;Lo;0;L;<narrow> 30E0;;;;N;;;;;
+FF92;HALFWIDTH KATAKANA LETTER ME;Lo;0;L;<narrow> 30E1;;;;N;;;;;
+FF93;HALFWIDTH KATAKANA LETTER MO;Lo;0;L;<narrow> 30E2;;;;N;;;;;
+FF94;HALFWIDTH KATAKANA LETTER YA;Lo;0;L;<narrow> 30E4;;;;N;;;;;
+FF95;HALFWIDTH KATAKANA LETTER YU;Lo;0;L;<narrow> 30E6;;;;N;;;;;
+FF96;HALFWIDTH KATAKANA LETTER YO;Lo;0;L;<narrow> 30E8;;;;N;;;;;
+FF97;HALFWIDTH KATAKANA LETTER RA;Lo;0;L;<narrow> 30E9;;;;N;;;;;
+FF98;HALFWIDTH KATAKANA LETTER RI;Lo;0;L;<narrow> 30EA;;;;N;;;;;
+FF99;HALFWIDTH KATAKANA LETTER RU;Lo;0;L;<narrow> 30EB;;;;N;;;;;
+FF9A;HALFWIDTH KATAKANA LETTER RE;Lo;0;L;<narrow> 30EC;;;;N;;;;;
+FF9B;HALFWIDTH KATAKANA LETTER RO;Lo;0;L;<narrow> 30ED;;;;N;;;;;
+FF9C;HALFWIDTH KATAKANA LETTER WA;Lo;0;L;<narrow> 30EF;;;;N;;;;;
+FF9D;HALFWIDTH KATAKANA LETTER N;Lo;0;L;<narrow> 30F3;;;;N;;;;;
+FF9E;HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L;<narrow> 3099;;;;N;;;;;
+FF9F;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L;<narrow> 309A;;;;N;;;;;
+FFA0;HALFWIDTH HANGUL FILLER;Lo;0;L;<narrow> 3164;;;;N;HALFWIDTH HANGUL CAE OM;;;;
+FFA1;HALFWIDTH HANGUL LETTER KIYEOK;Lo;0;L;<narrow> 3131;;;;N;HALFWIDTH HANGUL LETTER GIYEOG;;;;
+FFA2;HALFWIDTH HANGUL LETTER SSANGKIYEOK;Lo;0;L;<narrow> 3132;;;;N;HALFWIDTH HANGUL LETTER SSANG GIYEOG;;;;
+FFA3;HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<narrow> 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;;
+FFA4;HALFWIDTH HANGUL LETTER NIEUN;Lo;0;L;<narrow> 3134;;;;N;;;;;
+FFA5;HALFWIDTH HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<narrow> 3135;;;;N;HALFWIDTH HANGUL LETTER NIEUN JIEUJ;;;;
+FFA6;HALFWIDTH HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<narrow> 3136;;;;N;HALFWIDTH HANGUL LETTER NIEUN HIEUH;;;;
+FFA7;HALFWIDTH HANGUL LETTER TIKEUT;Lo;0;L;<narrow> 3137;;;;N;HALFWIDTH HANGUL LETTER DIGEUD;;;;
+FFA8;HALFWIDTH HANGUL LETTER SSANGTIKEUT;Lo;0;L;<narrow> 3138;;;;N;HALFWIDTH HANGUL LETTER SSANG DIGEUD;;;;
+FFA9;HALFWIDTH HANGUL LETTER RIEUL;Lo;0;L;<narrow> 3139;;;;N;HALFWIDTH HANGUL LETTER LIEUL;;;;
+FFAA;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<narrow> 313A;;;;N;HALFWIDTH HANGUL LETTER LIEUL GIYEOG;;;;
+FFAB;HALFWIDTH HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<narrow> 313B;;;;N;HALFWIDTH HANGUL LETTER LIEUL MIEUM;;;;
+FFAC;HALFWIDTH HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<narrow> 313C;;;;N;HALFWIDTH HANGUL LETTER LIEUL BIEUB;;;;
+FFAD;HALFWIDTH HANGUL LETTER RIEUL-SIOS;Lo;0;L;<narrow> 313D;;;;N;HALFWIDTH HANGUL LETTER LIEUL SIOS;;;;
+FFAE;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<narrow> 313E;;;;N;HALFWIDTH HANGUL LETTER LIEUL TIEUT;;;;
+FFAF;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<narrow> 313F;;;;N;HALFWIDTH HANGUL LETTER LIEUL PIEUP;;;;
+FFB0;HALFWIDTH HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<narrow> 3140;;;;N;HALFWIDTH HANGUL LETTER LIEUL HIEUH;;;;
+FFB1;HALFWIDTH HANGUL LETTER MIEUM;Lo;0;L;<narrow> 3141;;;;N;;;;;
+FFB2;HALFWIDTH HANGUL LETTER PIEUP;Lo;0;L;<narrow> 3142;;;;N;HALFWIDTH HANGUL LETTER BIEUB;;;;
+FFB3;HALFWIDTH HANGUL LETTER SSANGPIEUP;Lo;0;L;<narrow> 3143;;;;N;HALFWIDTH HANGUL LETTER SSANG BIEUB;;;;
+FFB4;HALFWIDTH HANGUL LETTER PIEUP-SIOS;Lo;0;L;<narrow> 3144;;;;N;HALFWIDTH HANGUL LETTER BIEUB SIOS;;;;
+FFB5;HALFWIDTH HANGUL LETTER SIOS;Lo;0;L;<narrow> 3145;;;;N;;;;;
+FFB6;HALFWIDTH HANGUL LETTER SSANGSIOS;Lo;0;L;<narrow> 3146;;;;N;HALFWIDTH HANGUL LETTER SSANG SIOS;;;;
+FFB7;HALFWIDTH HANGUL LETTER IEUNG;Lo;0;L;<narrow> 3147;;;;N;;;;;
+FFB8;HALFWIDTH HANGUL LETTER CIEUC;Lo;0;L;<narrow> 3148;;;;N;HALFWIDTH HANGUL LETTER JIEUJ;;;;
+FFB9;HALFWIDTH HANGUL LETTER SSANGCIEUC;Lo;0;L;<narrow> 3149;;;;N;HALFWIDTH HANGUL LETTER SSANG JIEUJ;;;;
+FFBA;HALFWIDTH HANGUL LETTER CHIEUCH;Lo;0;L;<narrow> 314A;;;;N;HALFWIDTH HANGUL LETTER CIEUC;;;;
+FFBB;HALFWIDTH HANGUL LETTER KHIEUKH;Lo;0;L;<narrow> 314B;;;;N;HALFWIDTH HANGUL LETTER KIYEOK;;;;
+FFBC;HALFWIDTH HANGUL LETTER THIEUTH;Lo;0;L;<narrow> 314C;;;;N;HALFWIDTH HANGUL LETTER TIEUT;;;;
+FFBD;HALFWIDTH HANGUL LETTER PHIEUPH;Lo;0;L;<narrow> 314D;;;;N;HALFWIDTH HANGUL LETTER PIEUP;;;;
+FFBE;HALFWIDTH HANGUL LETTER HIEUH;Lo;0;L;<narrow> 314E;;;;N;;;;;
+FFC2;HALFWIDTH HANGUL LETTER A;Lo;0;L;<narrow> 314F;;;;N;;;;;
+FFC3;HALFWIDTH HANGUL LETTER AE;Lo;0;L;<narrow> 3150;;;;N;;;;;
+FFC4;HALFWIDTH HANGUL LETTER YA;Lo;0;L;<narrow> 3151;;;;N;;;;;
+FFC5;HALFWIDTH HANGUL LETTER YAE;Lo;0;L;<narrow> 3152;;;;N;;;;;
+FFC6;HALFWIDTH HANGUL LETTER EO;Lo;0;L;<narrow> 3153;;;;N;;;;;
+FFC7;HALFWIDTH HANGUL LETTER E;Lo;0;L;<narrow> 3154;;;;N;;;;;
+FFCA;HALFWIDTH HANGUL LETTER YEO;Lo;0;L;<narrow> 3155;;;;N;;;;;
+FFCB;HALFWIDTH HANGUL LETTER YE;Lo;0;L;<narrow> 3156;;;;N;;;;;
+FFCC;HALFWIDTH HANGUL LETTER O;Lo;0;L;<narrow> 3157;;;;N;;;;;
+FFCD;HALFWIDTH HANGUL LETTER WA;Lo;0;L;<narrow> 3158;;;;N;;;;;
+FFCE;HALFWIDTH HANGUL LETTER WAE;Lo;0;L;<narrow> 3159;;;;N;;;;;
+FFCF;HALFWIDTH HANGUL LETTER OE;Lo;0;L;<narrow> 315A;;;;N;;;;;
+FFD2;HALFWIDTH HANGUL LETTER YO;Lo;0;L;<narrow> 315B;;;;N;;;;;
+FFD3;HALFWIDTH HANGUL LETTER U;Lo;0;L;<narrow> 315C;;;;N;;;;;
+FFD4;HALFWIDTH HANGUL LETTER WEO;Lo;0;L;<narrow> 315D;;;;N;;;;;
+FFD5;HALFWIDTH HANGUL LETTER WE;Lo;0;L;<narrow> 315E;;;;N;;;;;
+FFD6;HALFWIDTH HANGUL LETTER WI;Lo;0;L;<narrow> 315F;;;;N;;;;;
+FFD7;HALFWIDTH HANGUL LETTER YU;Lo;0;L;<narrow> 3160;;;;N;;;;;
+FFDA;HALFWIDTH HANGUL LETTER EU;Lo;0;L;<narrow> 3161;;;;N;;;;;
+FFDB;HALFWIDTH HANGUL LETTER YI;Lo;0;L;<narrow> 3162;;;;N;;;;;
+FFDC;HALFWIDTH HANGUL LETTER I;Lo;0;L;<narrow> 3163;;;;N;;;;;
+FFE0;FULLWIDTH CENT SIGN;Sc;0;ET;<wide> 00A2;;;;N;;;;;
+FFE1;FULLWIDTH POUND SIGN;Sc;0;ET;<wide> 00A3;;;;N;;;;;
+FFE2;FULLWIDTH NOT SIGN;Sm;0;ON;<wide> 00AC;;;;N;;;;;
+FFE3;FULLWIDTH MACRON;Sk;0;ON;<wide> 00AF;;;;N;FULLWIDTH SPACING MACRON;;;;
+FFE4;FULLWIDTH BROKEN BAR;So;0;ON;<wide> 00A6;;;;N;FULLWIDTH BROKEN VERTICAL BAR;;;;
+FFE5;FULLWIDTH YEN SIGN;Sc;0;ET;<wide> 00A5;;;;N;;;;;
+FFE6;FULLWIDTH WON SIGN;Sc;0;ET;<wide> 20A9;;;;N;;;;;
+FFE8;HALFWIDTH FORMS LIGHT VERTICAL;So;0;ON;<narrow> 2502;;;;N;;;;;
+FFE9;HALFWIDTH LEFTWARDS ARROW;Sm;0;ON;<narrow> 2190;;;;N;;;;;
+FFEA;HALFWIDTH UPWARDS ARROW;Sm;0;ON;<narrow> 2191;;;;N;;;;;
+FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON;<narrow> 2192;;;;N;;;;;
+FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON;<narrow> 2193;;;;N;;;;;
+FFED;HALFWIDTH BLACK SQUARE;So;0;ON;<narrow> 25A0;;;;N;;;;;
+FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON;<narrow> 25CB;;;;N;;;;;
+FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;ON;;;;;N;;;;;
+FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;ON;;;;;N;;;;;
+FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;ON;;;;;N;;;;;
+FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
+FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
+10000;LINEAR B SYLLABLE B008 A;Lo;0;L;;;;;N;;;;;
+10001;LINEAR B SYLLABLE B038 E;Lo;0;L;;;;;N;;;;;
+10002;LINEAR B SYLLABLE B028 I;Lo;0;L;;;;;N;;;;;
+10003;LINEAR B SYLLABLE B061 O;Lo;0;L;;;;;N;;;;;
+10004;LINEAR B SYLLABLE B010 U;Lo;0;L;;;;;N;;;;;
+10005;LINEAR B SYLLABLE B001 DA;Lo;0;L;;;;;N;;;;;
+10006;LINEAR B SYLLABLE B045 DE;Lo;0;L;;;;;N;;;;;
+10007;LINEAR B SYLLABLE B007 DI;Lo;0;L;;;;;N;;;;;
+10008;LINEAR B SYLLABLE B014 DO;Lo;0;L;;;;;N;;;;;
+10009;LINEAR B SYLLABLE B051 DU;Lo;0;L;;;;;N;;;;;
+1000A;LINEAR B SYLLABLE B057 JA;Lo;0;L;;;;;N;;;;;
+1000B;LINEAR B SYLLABLE B046 JE;Lo;0;L;;;;;N;;;;;
+1000D;LINEAR B SYLLABLE B036 JO;Lo;0;L;;;;;N;;;;;
+1000E;LINEAR B SYLLABLE B065 JU;Lo;0;L;;;;;N;;;;;
+1000F;LINEAR B SYLLABLE B077 KA;Lo;0;L;;;;;N;;;;;
+10010;LINEAR B SYLLABLE B044 KE;Lo;0;L;;;;;N;;;;;
+10011;LINEAR B SYLLABLE B067 KI;Lo;0;L;;;;;N;;;;;
+10012;LINEAR B SYLLABLE B070 KO;Lo;0;L;;;;;N;;;;;
+10013;LINEAR B SYLLABLE B081 KU;Lo;0;L;;;;;N;;;;;
+10014;LINEAR B SYLLABLE B080 MA;Lo;0;L;;;;;N;;;;;
+10015;LINEAR B SYLLABLE B013 ME;Lo;0;L;;;;;N;;;;;
+10016;LINEAR B SYLLABLE B073 MI;Lo;0;L;;;;;N;;;;;
+10017;LINEAR B SYLLABLE B015 MO;Lo;0;L;;;;;N;;;;;
+10018;LINEAR B SYLLABLE B023 MU;Lo;0;L;;;;;N;;;;;
+10019;LINEAR B SYLLABLE B006 NA;Lo;0;L;;;;;N;;;;;
+1001A;LINEAR B SYLLABLE B024 NE;Lo;0;L;;;;;N;;;;;
+1001B;LINEAR B SYLLABLE B030 NI;Lo;0;L;;;;;N;;;;;
+1001C;LINEAR B SYLLABLE B052 NO;Lo;0;L;;;;;N;;;;;
+1001D;LINEAR B SYLLABLE B055 NU;Lo;0;L;;;;;N;;;;;
+1001E;LINEAR B SYLLABLE B003 PA;Lo;0;L;;;;;N;;;;;
+1001F;LINEAR B SYLLABLE B072 PE;Lo;0;L;;;;;N;;;;;
+10020;LINEAR B SYLLABLE B039 PI;Lo;0;L;;;;;N;;;;;
+10021;LINEAR B SYLLABLE B011 PO;Lo;0;L;;;;;N;;;;;
+10022;LINEAR B SYLLABLE B050 PU;Lo;0;L;;;;;N;;;;;
+10023;LINEAR B SYLLABLE B016 QA;Lo;0;L;;;;;N;;;;;
+10024;LINEAR B SYLLABLE B078 QE;Lo;0;L;;;;;N;;;;;
+10025;LINEAR B SYLLABLE B021 QI;Lo;0;L;;;;;N;;;;;
+10026;LINEAR B SYLLABLE B032 QO;Lo;0;L;;;;;N;;;;;
+10028;LINEAR B SYLLABLE B060 RA;Lo;0;L;;;;;N;;;;;
+10029;LINEAR B SYLLABLE B027 RE;Lo;0;L;;;;;N;;;;;
+1002A;LINEAR B SYLLABLE B053 RI;Lo;0;L;;;;;N;;;;;
+1002B;LINEAR B SYLLABLE B002 RO;Lo;0;L;;;;;N;;;;;
+1002C;LINEAR B SYLLABLE B026 RU;Lo;0;L;;;;;N;;;;;
+1002D;LINEAR B SYLLABLE B031 SA;Lo;0;L;;;;;N;;;;;
+1002E;LINEAR B SYLLABLE B009 SE;Lo;0;L;;;;;N;;;;;
+1002F;LINEAR B SYLLABLE B041 SI;Lo;0;L;;;;;N;;;;;
+10030;LINEAR B SYLLABLE B012 SO;Lo;0;L;;;;;N;;;;;
+10031;LINEAR B SYLLABLE B058 SU;Lo;0;L;;;;;N;;;;;
+10032;LINEAR B SYLLABLE B059 TA;Lo;0;L;;;;;N;;;;;
+10033;LINEAR B SYLLABLE B004 TE;Lo;0;L;;;;;N;;;;;
+10034;LINEAR B SYLLABLE B037 TI;Lo;0;L;;;;;N;;;;;
+10035;LINEAR B SYLLABLE B005 TO;Lo;0;L;;;;;N;;;;;
+10036;LINEAR B SYLLABLE B069 TU;Lo;0;L;;;;;N;;;;;
+10037;LINEAR B SYLLABLE B054 WA;Lo;0;L;;;;;N;;;;;
+10038;LINEAR B SYLLABLE B075 WE;Lo;0;L;;;;;N;;;;;
+10039;LINEAR B SYLLABLE B040 WI;Lo;0;L;;;;;N;;;;;
+1003A;LINEAR B SYLLABLE B042 WO;Lo;0;L;;;;;N;;;;;
+1003C;LINEAR B SYLLABLE B017 ZA;Lo;0;L;;;;;N;;;;;
+1003D;LINEAR B SYLLABLE B074 ZE;Lo;0;L;;;;;N;;;;;
+1003F;LINEAR B SYLLABLE B020 ZO;Lo;0;L;;;;;N;;;;;
+10040;LINEAR B SYLLABLE B025 A2;Lo;0;L;;;;;N;;;;;
+10041;LINEAR B SYLLABLE B043 A3;Lo;0;L;;;;;N;;;;;
+10042;LINEAR B SYLLABLE B085 AU;Lo;0;L;;;;;N;;;;;
+10043;LINEAR B SYLLABLE B071 DWE;Lo;0;L;;;;;N;;;;;
+10044;LINEAR B SYLLABLE B090 DWO;Lo;0;L;;;;;N;;;;;
+10045;LINEAR B SYLLABLE B048 NWA;Lo;0;L;;;;;N;;;;;
+10046;LINEAR B SYLLABLE B029 PU2;Lo;0;L;;;;;N;;;;;
+10047;LINEAR B SYLLABLE B062 PTE;Lo;0;L;;;;;N;;;;;
+10048;LINEAR B SYLLABLE B076 RA2;Lo;0;L;;;;;N;;;;;
+10049;LINEAR B SYLLABLE B033 RA3;Lo;0;L;;;;;N;;;;;
+1004A;LINEAR B SYLLABLE B068 RO2;Lo;0;L;;;;;N;;;;;
+1004B;LINEAR B SYLLABLE B066 TA2;Lo;0;L;;;;;N;;;;;
+1004C;LINEAR B SYLLABLE B087 TWE;Lo;0;L;;;;;N;;;;;
+1004D;LINEAR B SYLLABLE B091 TWO;Lo;0;L;;;;;N;;;;;
+10050;LINEAR B SYMBOL B018;Lo;0;L;;;;;N;;;;;
+10051;LINEAR B SYMBOL B019;Lo;0;L;;;;;N;;;;;
+10052;LINEAR B SYMBOL B022;Lo;0;L;;;;;N;;;;;
+10053;LINEAR B SYMBOL B034;Lo;0;L;;;;;N;;;;;
+10054;LINEAR B SYMBOL B047;Lo;0;L;;;;;N;;;;;
+10055;LINEAR B SYMBOL B049;Lo;0;L;;;;;N;;;;;
+10056;LINEAR B SYMBOL B056;Lo;0;L;;;;;N;;;;;
+10057;LINEAR B SYMBOL B063;Lo;0;L;;;;;N;;;;;
+10058;LINEAR B SYMBOL B064;Lo;0;L;;;;;N;;;;;
+10059;LINEAR B SYMBOL B079;Lo;0;L;;;;;N;;;;;
+1005A;LINEAR B SYMBOL B082;Lo;0;L;;;;;N;;;;;
+1005B;LINEAR B SYMBOL B083;Lo;0;L;;;;;N;;;;;
+1005C;LINEAR B SYMBOL B086;Lo;0;L;;;;;N;;;;;
+1005D;LINEAR B SYMBOL B089;Lo;0;L;;;;;N;;;;;
+10080;LINEAR B IDEOGRAM B100 MAN;Lo;0;L;;;;;N;;;;;
+10081;LINEAR B IDEOGRAM B102 WOMAN;Lo;0;L;;;;;N;;;;;
+10082;LINEAR B IDEOGRAM B104 DEER;Lo;0;L;;;;;N;;;;;
+10083;LINEAR B IDEOGRAM B105 EQUID;Lo;0;L;;;;;N;;;;;
+10084;LINEAR B IDEOGRAM B105F MARE;Lo;0;L;;;;;N;;;;;
+10085;LINEAR B IDEOGRAM B105M STALLION;Lo;0;L;;;;;N;;;;;
+10086;LINEAR B IDEOGRAM B106F EWE;Lo;0;L;;;;;N;;;;;
+10087;LINEAR B IDEOGRAM B106M RAM;Lo;0;L;;;;;N;;;;;
+10088;LINEAR B IDEOGRAM B107F SHE-GOAT;Lo;0;L;;;;;N;;;;;
+10089;LINEAR B IDEOGRAM B107M HE-GOAT;Lo;0;L;;;;;N;;;;;
+1008A;LINEAR B IDEOGRAM B108F SOW;Lo;0;L;;;;;N;;;;;
+1008B;LINEAR B IDEOGRAM B108M BOAR;Lo;0;L;;;;;N;;;;;
+1008C;LINEAR B IDEOGRAM B109F COW;Lo;0;L;;;;;N;;;;;
+1008D;LINEAR B IDEOGRAM B109M BULL;Lo;0;L;;;;;N;;;;;
+1008E;LINEAR B IDEOGRAM B120 WHEAT;Lo;0;L;;;;;N;;;;;
+1008F;LINEAR B IDEOGRAM B121 BARLEY;Lo;0;L;;;;;N;;;;;
+10090;LINEAR B IDEOGRAM B122 OLIVE;Lo;0;L;;;;;N;;;;;
+10091;LINEAR B IDEOGRAM B123 SPICE;Lo;0;L;;;;;N;;;;;
+10092;LINEAR B IDEOGRAM B125 CYPERUS;Lo;0;L;;;;;N;;;;;
+10093;LINEAR B MONOGRAM B127 KAPO;Lo;0;L;;;;;N;;;;;
+10094;LINEAR B MONOGRAM B128 KANAKO;Lo;0;L;;;;;N;;;;;
+10095;LINEAR B IDEOGRAM B130 OIL;Lo;0;L;;;;;N;;;;;
+10096;LINEAR B IDEOGRAM B131 WINE;Lo;0;L;;;;;N;;;;;
+10097;LINEAR B IDEOGRAM B132;Lo;0;L;;;;;N;;;;;
+10098;LINEAR B MONOGRAM B133 AREPA;Lo;0;L;;;;;N;;;;;
+10099;LINEAR B MONOGRAM B135 MERI;Lo;0;L;;;;;N;;;;;
+1009A;LINEAR B IDEOGRAM B140 BRONZE;Lo;0;L;;;;;N;;;;;
+1009B;LINEAR B IDEOGRAM B141 GOLD;Lo;0;L;;;;;N;;;;;
+1009C;LINEAR B IDEOGRAM B142;Lo;0;L;;;;;N;;;;;
+1009D;LINEAR B IDEOGRAM B145 WOOL;Lo;0;L;;;;;N;;;;;
+1009E;LINEAR B IDEOGRAM B146;Lo;0;L;;;;;N;;;;;
+1009F;LINEAR B IDEOGRAM B150;Lo;0;L;;;;;N;;;;;
+100A0;LINEAR B IDEOGRAM B151 HORN;Lo;0;L;;;;;N;;;;;
+100A1;LINEAR B IDEOGRAM B152;Lo;0;L;;;;;N;;;;;
+100A2;LINEAR B IDEOGRAM B153;Lo;0;L;;;;;N;;;;;
+100A3;LINEAR B IDEOGRAM B154;Lo;0;L;;;;;N;;;;;
+100A4;LINEAR B MONOGRAM B156 TURO2;Lo;0;L;;;;;N;;;;;
+100A5;LINEAR B IDEOGRAM B157;Lo;0;L;;;;;N;;;;;
+100A6;LINEAR B IDEOGRAM B158;Lo;0;L;;;;;N;;;;;
+100A7;LINEAR B IDEOGRAM B159 CLOTH;Lo;0;L;;;;;N;;;;;
+100A8;LINEAR B IDEOGRAM B160;Lo;0;L;;;;;N;;;;;
+100A9;LINEAR B IDEOGRAM B161;Lo;0;L;;;;;N;;;;;
+100AA;LINEAR B IDEOGRAM B162 GARMENT;Lo;0;L;;;;;N;;;;;
+100AB;LINEAR B IDEOGRAM B163 ARMOUR;Lo;0;L;;;;;N;;;;;
+100AC;LINEAR B IDEOGRAM B164;Lo;0;L;;;;;N;;;;;
+100AD;LINEAR B IDEOGRAM B165;Lo;0;L;;;;;N;;;;;
+100AE;LINEAR B IDEOGRAM B166;Lo;0;L;;;;;N;;;;;
+100AF;LINEAR B IDEOGRAM B167;Lo;0;L;;;;;N;;;;;
+100B0;LINEAR B IDEOGRAM B168;Lo;0;L;;;;;N;;;;;
+100B1;LINEAR B IDEOGRAM B169;Lo;0;L;;;;;N;;;;;
+100B2;LINEAR B IDEOGRAM B170;Lo;0;L;;;;;N;;;;;
+100B3;LINEAR B IDEOGRAM B171;Lo;0;L;;;;;N;;;;;
+100B4;LINEAR B IDEOGRAM B172;Lo;0;L;;;;;N;;;;;
+100B5;LINEAR B IDEOGRAM B173 MONTH;Lo;0;L;;;;;N;;;;;
+100B6;LINEAR B IDEOGRAM B174;Lo;0;L;;;;;N;;;;;
+100B7;LINEAR B IDEOGRAM B176 TREE;Lo;0;L;;;;;N;;;;;
+100B8;LINEAR B IDEOGRAM B177;Lo;0;L;;;;;N;;;;;
+100B9;LINEAR B IDEOGRAM B178;Lo;0;L;;;;;N;;;;;
+100BA;LINEAR B IDEOGRAM B179;Lo;0;L;;;;;N;;;;;
+100BB;LINEAR B IDEOGRAM B180;Lo;0;L;;;;;N;;;;;
+100BC;LINEAR B IDEOGRAM B181;Lo;0;L;;;;;N;;;;;
+100BD;LINEAR B IDEOGRAM B182;Lo;0;L;;;;;N;;;;;
+100BE;LINEAR B IDEOGRAM B183;Lo;0;L;;;;;N;;;;;
+100BF;LINEAR B IDEOGRAM B184;Lo;0;L;;;;;N;;;;;
+100C0;LINEAR B IDEOGRAM B185;Lo;0;L;;;;;N;;;;;
+100C1;LINEAR B IDEOGRAM B189;Lo;0;L;;;;;N;;;;;
+100C2;LINEAR B IDEOGRAM B190;Lo;0;L;;;;;N;;;;;
+100C3;LINEAR B IDEOGRAM B191 HELMET;Lo;0;L;;;;;N;;;;;
+100C4;LINEAR B IDEOGRAM B220 FOOTSTOOL;Lo;0;L;;;;;N;;;;;
+100C5;LINEAR B IDEOGRAM B225 BATHTUB;Lo;0;L;;;;;N;;;;;
+100C6;LINEAR B IDEOGRAM B230 SPEAR;Lo;0;L;;;;;N;;;;;
+100C7;LINEAR B IDEOGRAM B231 ARROW;Lo;0;L;;;;;N;;;;;
+100C8;LINEAR B IDEOGRAM B232;Lo;0;L;;;;;N;;;;;
+100C9;LINEAR B IDEOGRAM B233 SWORD;Lo;0;L;;;;;N;;;;;
+100CA;LINEAR B IDEOGRAM B234;Lo;0;L;;;;;N;;;;;
+100CB;LINEAR B IDEOGRAM B236;Lo;0;L;;;;;N;;;;;
+100CC;LINEAR B IDEOGRAM B240 WHEELED CHARIOT;Lo;0;L;;;;;N;;;;;
+100CD;LINEAR B IDEOGRAM B241 CHARIOT;Lo;0;L;;;;;N;;;;;
+100CE;LINEAR B IDEOGRAM B242 CHARIOT FRAME;Lo;0;L;;;;;N;;;;;
+100CF;LINEAR B IDEOGRAM B243 WHEEL;Lo;0;L;;;;;N;;;;;
+100D0;LINEAR B IDEOGRAM B245;Lo;0;L;;;;;N;;;;;
+100D1;LINEAR B IDEOGRAM B246;Lo;0;L;;;;;N;;;;;
+100D2;LINEAR B MONOGRAM B247 DIPTE;Lo;0;L;;;;;N;;;;;
+100D3;LINEAR B IDEOGRAM B248;Lo;0;L;;;;;N;;;;;
+100D4;LINEAR B IDEOGRAM B249;Lo;0;L;;;;;N;;;;;
+100D5;LINEAR B IDEOGRAM B251;Lo;0;L;;;;;N;;;;;
+100D6;LINEAR B IDEOGRAM B252;Lo;0;L;;;;;N;;;;;
+100D7;LINEAR B IDEOGRAM B253;Lo;0;L;;;;;N;;;;;
+100D8;LINEAR B IDEOGRAM B254 DART;Lo;0;L;;;;;N;;;;;
+100D9;LINEAR B IDEOGRAM B255;Lo;0;L;;;;;N;;;;;
+100DA;LINEAR B IDEOGRAM B256;Lo;0;L;;;;;N;;;;;
+100DB;LINEAR B IDEOGRAM B257;Lo;0;L;;;;;N;;;;;
+100DC;LINEAR B IDEOGRAM B258;Lo;0;L;;;;;N;;;;;
+100DD;LINEAR B IDEOGRAM B259;Lo;0;L;;;;;N;;;;;
+100DE;LINEAR B IDEOGRAM VESSEL B155;Lo;0;L;;;;;N;;;;;
+100DF;LINEAR B IDEOGRAM VESSEL B200;Lo;0;L;;;;;N;;;;;
+100E0;LINEAR B IDEOGRAM VESSEL B201;Lo;0;L;;;;;N;;;;;
+100E1;LINEAR B IDEOGRAM VESSEL B202;Lo;0;L;;;;;N;;;;;
+100E2;LINEAR B IDEOGRAM VESSEL B203;Lo;0;L;;;;;N;;;;;
+100E3;LINEAR B IDEOGRAM VESSEL B204;Lo;0;L;;;;;N;;;;;
+100E4;LINEAR B IDEOGRAM VESSEL B205;Lo;0;L;;;;;N;;;;;
+100E5;LINEAR B IDEOGRAM VESSEL B206;Lo;0;L;;;;;N;;;;;
+100E6;LINEAR B IDEOGRAM VESSEL B207;Lo;0;L;;;;;N;;;;;
+100E7;LINEAR B IDEOGRAM VESSEL B208;Lo;0;L;;;;;N;;;;;
+100E8;LINEAR B IDEOGRAM VESSEL B209;Lo;0;L;;;;;N;;;;;
+100E9;LINEAR B IDEOGRAM VESSEL B210;Lo;0;L;;;;;N;;;;;
+100EA;LINEAR B IDEOGRAM VESSEL B211;Lo;0;L;;;;;N;;;;;
+100EB;LINEAR B IDEOGRAM VESSEL B212;Lo;0;L;;;;;N;;;;;
+100EC;LINEAR B IDEOGRAM VESSEL B213;Lo;0;L;;;;;N;;;;;
+100ED;LINEAR B IDEOGRAM VESSEL B214;Lo;0;L;;;;;N;;;;;
+100EE;LINEAR B IDEOGRAM VESSEL B215;Lo;0;L;;;;;N;;;;;
+100EF;LINEAR B IDEOGRAM VESSEL B216;Lo;0;L;;;;;N;;;;;
+100F0;LINEAR B IDEOGRAM VESSEL B217;Lo;0;L;;;;;N;;;;;
+100F1;LINEAR B IDEOGRAM VESSEL B218;Lo;0;L;;;;;N;;;;;
+100F2;LINEAR B IDEOGRAM VESSEL B219;Lo;0;L;;;;;N;;;;;
+100F3;LINEAR B IDEOGRAM VESSEL B221;Lo;0;L;;;;;N;;;;;
+100F4;LINEAR B IDEOGRAM VESSEL B222;Lo;0;L;;;;;N;;;;;
+100F5;LINEAR B IDEOGRAM VESSEL B226;Lo;0;L;;;;;N;;;;;
+100F6;LINEAR B IDEOGRAM VESSEL B227;Lo;0;L;;;;;N;;;;;
+100F7;LINEAR B IDEOGRAM VESSEL B228;Lo;0;L;;;;;N;;;;;
+100F8;LINEAR B IDEOGRAM VESSEL B229;Lo;0;L;;;;;N;;;;;
+100F9;LINEAR B IDEOGRAM VESSEL B250;Lo;0;L;;;;;N;;;;;
+100FA;LINEAR B IDEOGRAM VESSEL B305;Lo;0;L;;;;;N;;;;;
+10100;AEGEAN WORD SEPARATOR LINE;Po;0;L;;;;;N;;;;;
+10101;AEGEAN WORD SEPARATOR DOT;Po;0;ON;;;;;N;;;;;
+10102;AEGEAN CHECK MARK;Po;0;L;;;;;N;;;;;
+10107;AEGEAN NUMBER ONE;No;0;L;;;;1;N;;;;;
+10108;AEGEAN NUMBER TWO;No;0;L;;;;2;N;;;;;
+10109;AEGEAN NUMBER THREE;No;0;L;;;;3;N;;;;;
+1010A;AEGEAN NUMBER FOUR;No;0;L;;;;4;N;;;;;
+1010B;AEGEAN NUMBER FIVE;No;0;L;;;;5;N;;;;;
+1010C;AEGEAN NUMBER SIX;No;0;L;;;;6;N;;;;;
+1010D;AEGEAN NUMBER SEVEN;No;0;L;;;;7;N;;;;;
+1010E;AEGEAN NUMBER EIGHT;No;0;L;;;;8;N;;;;;
+1010F;AEGEAN NUMBER NINE;No;0;L;;;;9;N;;;;;
+10110;AEGEAN NUMBER TEN;No;0;L;;;;10;N;;;;;
+10111;AEGEAN NUMBER TWENTY;No;0;L;;;;20;N;;;;;
+10112;AEGEAN NUMBER THIRTY;No;0;L;;;;30;N;;;;;
+10113;AEGEAN NUMBER FORTY;No;0;L;;;;40;N;;;;;
+10114;AEGEAN NUMBER FIFTY;No;0;L;;;;50;N;;;;;
+10115;AEGEAN NUMBER SIXTY;No;0;L;;;;60;N;;;;;
+10116;AEGEAN NUMBER SEVENTY;No;0;L;;;;70;N;;;;;
+10117;AEGEAN NUMBER EIGHTY;No;0;L;;;;80;N;;;;;
+10118;AEGEAN NUMBER NINETY;No;0;L;;;;90;N;;;;;
+10119;AEGEAN NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;;
+1011A;AEGEAN NUMBER TWO HUNDRED;No;0;L;;;;200;N;;;;;
+1011B;AEGEAN NUMBER THREE HUNDRED;No;0;L;;;;300;N;;;;;
+1011C;AEGEAN NUMBER FOUR HUNDRED;No;0;L;;;;400;N;;;;;
+1011D;AEGEAN NUMBER FIVE HUNDRED;No;0;L;;;;500;N;;;;;
+1011E;AEGEAN NUMBER SIX HUNDRED;No;0;L;;;;600;N;;;;;
+1011F;AEGEAN NUMBER SEVEN HUNDRED;No;0;L;;;;700;N;;;;;
+10120;AEGEAN NUMBER EIGHT HUNDRED;No;0;L;;;;800;N;;;;;
+10121;AEGEAN NUMBER NINE HUNDRED;No;0;L;;;;900;N;;;;;
+10122;AEGEAN NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;;
+10123;AEGEAN NUMBER TWO THOUSAND;No;0;L;;;;2000;N;;;;;
+10124;AEGEAN NUMBER THREE THOUSAND;No;0;L;;;;3000;N;;;;;
+10125;AEGEAN NUMBER FOUR THOUSAND;No;0;L;;;;4000;N;;;;;
+10126;AEGEAN NUMBER FIVE THOUSAND;No;0;L;;;;5000;N;;;;;
+10127;AEGEAN NUMBER SIX THOUSAND;No;0;L;;;;6000;N;;;;;
+10128;AEGEAN NUMBER SEVEN THOUSAND;No;0;L;;;;7000;N;;;;;
+10129;AEGEAN NUMBER EIGHT THOUSAND;No;0;L;;;;8000;N;;;;;
+1012A;AEGEAN NUMBER NINE THOUSAND;No;0;L;;;;9000;N;;;;;
+1012B;AEGEAN NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;;
+1012C;AEGEAN NUMBER TWENTY THOUSAND;No;0;L;;;;20000;N;;;;;
+1012D;AEGEAN NUMBER THIRTY THOUSAND;No;0;L;;;;30000;N;;;;;
+1012E;AEGEAN NUMBER FORTY THOUSAND;No;0;L;;;;40000;N;;;;;
+1012F;AEGEAN NUMBER FIFTY THOUSAND;No;0;L;;;;50000;N;;;;;
+10130;AEGEAN NUMBER SIXTY THOUSAND;No;0;L;;;;60000;N;;;;;
+10131;AEGEAN NUMBER SEVENTY THOUSAND;No;0;L;;;;70000;N;;;;;
+10132;AEGEAN NUMBER EIGHTY THOUSAND;No;0;L;;;;80000;N;;;;;
+10133;AEGEAN NUMBER NINETY THOUSAND;No;0;L;;;;90000;N;;;;;
+10137;AEGEAN WEIGHT BASE UNIT;So;0;L;;;;;N;;;;;
+10138;AEGEAN WEIGHT FIRST SUBUNIT;So;0;L;;;;;N;;;;;
+10139;AEGEAN WEIGHT SECOND SUBUNIT;So;0;L;;;;;N;;;;;
+1013A;AEGEAN WEIGHT THIRD SUBUNIT;So;0;L;;;;;N;;;;;
+1013B;AEGEAN WEIGHT FOURTH SUBUNIT;So;0;L;;;;;N;;;;;
+1013C;AEGEAN DRY MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;;
+1013D;AEGEAN LIQUID MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;;
+1013E;AEGEAN MEASURE SECOND SUBUNIT;So;0;L;;;;;N;;;;;
+1013F;AEGEAN MEASURE THIRD SUBUNIT;So;0;L;;;;;N;;;;;
+10140;GREEK ACROPHONIC ATTIC ONE QUARTER;Nl;0;ON;;;;1/4;N;;;;;
+10141;GREEK ACROPHONIC ATTIC ONE HALF;Nl;0;ON;;;;1/2;N;;;;;
+10142;GREEK ACROPHONIC ATTIC ONE DRACHMA;Nl;0;ON;;;;1;N;;;;;
+10143;GREEK ACROPHONIC ATTIC FIVE;Nl;0;ON;;;;5;N;;;;;
+10144;GREEK ACROPHONIC ATTIC FIFTY;Nl;0;ON;;;;50;N;;;;;
+10145;GREEK ACROPHONIC ATTIC FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+10146;GREEK ACROPHONIC ATTIC FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;;
+10147;GREEK ACROPHONIC ATTIC FIFTY THOUSAND;Nl;0;ON;;;;50000;N;;;;;
+10148;GREEK ACROPHONIC ATTIC FIVE TALENTS;Nl;0;ON;;;;5;N;;;;;
+10149;GREEK ACROPHONIC ATTIC TEN TALENTS;Nl;0;ON;;;;10;N;;;;;
+1014A;GREEK ACROPHONIC ATTIC FIFTY TALENTS;Nl;0;ON;;;;50;N;;;;;
+1014B;GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS;Nl;0;ON;;;;100;N;;;;;
+1014C;GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS;Nl;0;ON;;;;500;N;;;;;
+1014D;GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS;Nl;0;ON;;;;1000;N;;;;;
+1014E;GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS;Nl;0;ON;;;;5000;N;;;;;
+1014F;GREEK ACROPHONIC ATTIC FIVE STATERS;Nl;0;ON;;;;5;N;;;;;
+10150;GREEK ACROPHONIC ATTIC TEN STATERS;Nl;0;ON;;;;10;N;;;;;
+10151;GREEK ACROPHONIC ATTIC FIFTY STATERS;Nl;0;ON;;;;50;N;;;;;
+10152;GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS;Nl;0;ON;;;;100;N;;;;;
+10153;GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS;Nl;0;ON;;;;500;N;;;;;
+10154;GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS;Nl;0;ON;;;;1000;N;;;;;
+10155;GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS;Nl;0;ON;;;;10000;N;;;;;
+10156;GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS;Nl;0;ON;;;;50000;N;;;;;
+10157;GREEK ACROPHONIC ATTIC TEN MNAS;Nl;0;ON;;;;10;N;;;;;
+10158;GREEK ACROPHONIC HERAEUM ONE PLETHRON;Nl;0;ON;;;;1;N;;;;;
+10159;GREEK ACROPHONIC THESPIAN ONE;Nl;0;ON;;;;1;N;;;;;
+1015A;GREEK ACROPHONIC HERMIONIAN ONE;Nl;0;ON;;;;1;N;;;;;
+1015B;GREEK ACROPHONIC EPIDAUREAN TWO;Nl;0;ON;;;;2;N;;;;;
+1015C;GREEK ACROPHONIC THESPIAN TWO;Nl;0;ON;;;;2;N;;;;;
+1015D;GREEK ACROPHONIC CYRENAIC TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;;
+1015E;GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;;
+1015F;GREEK ACROPHONIC TROEZENIAN FIVE;Nl;0;ON;;;;5;N;;;;;
+10160;GREEK ACROPHONIC TROEZENIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10161;GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM;Nl;0;ON;;;;10;N;;;;;
+10162;GREEK ACROPHONIC HERMIONIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10163;GREEK ACROPHONIC MESSENIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10164;GREEK ACROPHONIC THESPIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10165;GREEK ACROPHONIC THESPIAN THIRTY;Nl;0;ON;;;;30;N;;;;;
+10166;GREEK ACROPHONIC TROEZENIAN FIFTY;Nl;0;ON;;;;50;N;;;;;
+10167;GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM;Nl;0;ON;;;;50;N;;;;;
+10168;GREEK ACROPHONIC HERMIONIAN FIFTY;Nl;0;ON;;;;50;N;;;;;
+10169;GREEK ACROPHONIC THESPIAN FIFTY;Nl;0;ON;;;;50;N;;;;;
+1016A;GREEK ACROPHONIC THESPIAN ONE HUNDRED;Nl;0;ON;;;;100;N;;;;;
+1016B;GREEK ACROPHONIC THESPIAN THREE HUNDRED;Nl;0;ON;;;;300;N;;;;;
+1016C;GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+1016D;GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+1016E;GREEK ACROPHONIC THESPIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+1016F;GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+10170;GREEK ACROPHONIC NAXIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+10171;GREEK ACROPHONIC THESPIAN ONE THOUSAND;Nl;0;ON;;;;1000;N;;;;;
+10172;GREEK ACROPHONIC THESPIAN FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;;
+10173;GREEK ACROPHONIC DELPHIC FIVE MNAS;Nl;0;ON;;;;5;N;;;;;
+10174;GREEK ACROPHONIC STRATIAN FIFTY MNAS;Nl;0;ON;;;;50;N;;;;;
+10175;GREEK ONE HALF SIGN;No;0;ON;;;;1/2;N;;;;;
+10176;GREEK ONE HALF SIGN ALTERNATE FORM;No;0;ON;;;;1/2;N;;;;;
+10177;GREEK TWO THIRDS SIGN;No;0;ON;;;;2/3;N;;;;;
+10178;GREEK THREE QUARTERS SIGN;No;0;ON;;;;3/4;N;;;;;
+10179;GREEK YEAR SIGN;So;0;ON;;;;;N;;;;;
+1017A;GREEK TALENT SIGN;So;0;ON;;;;;N;;;;;
+1017B;GREEK DRACHMA SIGN;So;0;ON;;;;;N;;;;;
+1017C;GREEK OBOL SIGN;So;0;ON;;;;;N;;;;;
+1017D;GREEK TWO OBOLS SIGN;So;0;ON;;;;;N;;;;;
+1017E;GREEK THREE OBOLS SIGN;So;0;ON;;;;;N;;;;;
+1017F;GREEK FOUR OBOLS SIGN;So;0;ON;;;;;N;;;;;
+10180;GREEK FIVE OBOLS SIGN;So;0;ON;;;;;N;;;;;
+10181;GREEK METRETES SIGN;So;0;ON;;;;;N;;;;;
+10182;GREEK KYATHOS BASE SIGN;So;0;ON;;;;;N;;;;;
+10183;GREEK LITRA SIGN;So;0;ON;;;;;N;;;;;
+10184;GREEK OUNKIA SIGN;So;0;ON;;;;;N;;;;;
+10185;GREEK XESTES SIGN;So;0;ON;;;;;N;;;;;
+10186;GREEK ARTABE SIGN;So;0;ON;;;;;N;;;;;
+10187;GREEK AROURA SIGN;So;0;ON;;;;;N;;;;;
+10188;GREEK GRAMMA SIGN;So;0;ON;;;;;N;;;;;
+10189;GREEK TRYBLION BASE SIGN;So;0;ON;;;;;N;;;;;
+1018A;GREEK ZERO SIGN;No;0;ON;;;;0;N;;;;;
+1018B;GREEK ONE QUARTER SIGN;No;0;ON;;;;1/4;N;;;;;
+1018C;GREEK SINUSOID SIGN;So;0;ON;;;;;N;;;;;
+1018D;GREEK INDICTION SIGN;So;0;L;;;;;N;;;;;
+1018E;NOMISMA SIGN;So;0;L;;;;;N;;;;;
+10190;ROMAN SEXTANS SIGN;So;0;ON;;;;;N;;;;;
+10191;ROMAN UNCIA SIGN;So;0;ON;;;;;N;;;;;
+10192;ROMAN SEMUNCIA SIGN;So;0;ON;;;;;N;;;;;
+10193;ROMAN SEXTULA SIGN;So;0;ON;;;;;N;;;;;
+10194;ROMAN DIMIDIA SEXTULA SIGN;So;0;ON;;;;;N;;;;;
+10195;ROMAN SILIQUA SIGN;So;0;ON;;;;;N;;;;;
+10196;ROMAN DENARIUS SIGN;So;0;ON;;;;;N;;;;;
+10197;ROMAN QUINARIUS SIGN;So;0;ON;;;;;N;;;;;
+10198;ROMAN SESTERTIUS SIGN;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;;;;;
+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;;;;;
+101D2;PHAISTOS DISC SIGN TATTOOED HEAD;So;0;L;;;;;N;;;;;
+101D3;PHAISTOS DISC SIGN CAPTIVE;So;0;L;;;;;N;;;;;
+101D4;PHAISTOS DISC SIGN CHILD;So;0;L;;;;;N;;;;;
+101D5;PHAISTOS DISC SIGN WOMAN;So;0;L;;;;;N;;;;;
+101D6;PHAISTOS DISC SIGN HELMET;So;0;L;;;;;N;;;;;
+101D7;PHAISTOS DISC SIGN GAUNTLET;So;0;L;;;;;N;;;;;
+101D8;PHAISTOS DISC SIGN TIARA;So;0;L;;;;;N;;;;;
+101D9;PHAISTOS DISC SIGN ARROW;So;0;L;;;;;N;;;;;
+101DA;PHAISTOS DISC SIGN BOW;So;0;L;;;;;N;;;;;
+101DB;PHAISTOS DISC SIGN SHIELD;So;0;L;;;;;N;;;;;
+101DC;PHAISTOS DISC SIGN CLUB;So;0;L;;;;;N;;;;;
+101DD;PHAISTOS DISC SIGN MANACLES;So;0;L;;;;;N;;;;;
+101DE;PHAISTOS DISC SIGN MATTOCK;So;0;L;;;;;N;;;;;
+101DF;PHAISTOS DISC SIGN SAW;So;0;L;;;;;N;;;;;
+101E0;PHAISTOS DISC SIGN LID;So;0;L;;;;;N;;;;;
+101E1;PHAISTOS DISC SIGN BOOMERANG;So;0;L;;;;;N;;;;;
+101E2;PHAISTOS DISC SIGN CARPENTRY PLANE;So;0;L;;;;;N;;;;;
+101E3;PHAISTOS DISC SIGN DOLIUM;So;0;L;;;;;N;;;;;
+101E4;PHAISTOS DISC SIGN COMB;So;0;L;;;;;N;;;;;
+101E5;PHAISTOS DISC SIGN SLING;So;0;L;;;;;N;;;;;
+101E6;PHAISTOS DISC SIGN COLUMN;So;0;L;;;;;N;;;;;
+101E7;PHAISTOS DISC SIGN BEEHIVE;So;0;L;;;;;N;;;;;
+101E8;PHAISTOS DISC SIGN SHIP;So;0;L;;;;;N;;;;;
+101E9;PHAISTOS DISC SIGN HORN;So;0;L;;;;;N;;;;;
+101EA;PHAISTOS DISC SIGN HIDE;So;0;L;;;;;N;;;;;
+101EB;PHAISTOS DISC SIGN BULLS LEG;So;0;L;;;;;N;;;;;
+101EC;PHAISTOS DISC SIGN CAT;So;0;L;;;;;N;;;;;
+101ED;PHAISTOS DISC SIGN RAM;So;0;L;;;;;N;;;;;
+101EE;PHAISTOS DISC SIGN EAGLE;So;0;L;;;;;N;;;;;
+101EF;PHAISTOS DISC SIGN DOVE;So;0;L;;;;;N;;;;;
+101F0;PHAISTOS DISC SIGN TUNNY;So;0;L;;;;;N;;;;;
+101F1;PHAISTOS DISC SIGN BEE;So;0;L;;;;;N;;;;;
+101F2;PHAISTOS DISC SIGN PLANE TREE;So;0;L;;;;;N;;;;;
+101F3;PHAISTOS DISC SIGN VINE;So;0;L;;;;;N;;;;;
+101F4;PHAISTOS DISC SIGN PAPYRUS;So;0;L;;;;;N;;;;;
+101F5;PHAISTOS DISC SIGN ROSETTE;So;0;L;;;;;N;;;;;
+101F6;PHAISTOS DISC SIGN LILY;So;0;L;;;;;N;;;;;
+101F7;PHAISTOS DISC SIGN OX BACK;So;0;L;;;;;N;;;;;
+101F8;PHAISTOS DISC SIGN FLUTE;So;0;L;;;;;N;;;;;
+101F9;PHAISTOS DISC SIGN GRATER;So;0;L;;;;;N;;;;;
+101FA;PHAISTOS DISC SIGN STRAINER;So;0;L;;;;;N;;;;;
+101FB;PHAISTOS DISC SIGN SMALL AXE;So;0;L;;;;;N;;;;;
+101FC;PHAISTOS DISC SIGN WAVY BAND;So;0;L;;;;;N;;;;;
+101FD;PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE;Mn;220;NSM;;;;;N;;;;;
+10280;LYCIAN LETTER A;Lo;0;L;;;;;N;;;;;
+10281;LYCIAN LETTER E;Lo;0;L;;;;;N;;;;;
+10282;LYCIAN LETTER B;Lo;0;L;;;;;N;;;;;
+10283;LYCIAN LETTER BH;Lo;0;L;;;;;N;;;;;
+10284;LYCIAN LETTER G;Lo;0;L;;;;;N;;;;;
+10285;LYCIAN LETTER D;Lo;0;L;;;;;N;;;;;
+10286;LYCIAN LETTER I;Lo;0;L;;;;;N;;;;;
+10287;LYCIAN LETTER W;Lo;0;L;;;;;N;;;;;
+10288;LYCIAN LETTER Z;Lo;0;L;;;;;N;;;;;
+10289;LYCIAN LETTER TH;Lo;0;L;;;;;N;;;;;
+1028A;LYCIAN LETTER J;Lo;0;L;;;;;N;;;;;
+1028B;LYCIAN LETTER K;Lo;0;L;;;;;N;;;;;
+1028C;LYCIAN LETTER Q;Lo;0;L;;;;;N;;;;;
+1028D;LYCIAN LETTER L;Lo;0;L;;;;;N;;;;;
+1028E;LYCIAN LETTER M;Lo;0;L;;;;;N;;;;;
+1028F;LYCIAN LETTER N;Lo;0;L;;;;;N;;;;;
+10290;LYCIAN LETTER MM;Lo;0;L;;;;;N;;;;;
+10291;LYCIAN LETTER NN;Lo;0;L;;;;;N;;;;;
+10292;LYCIAN LETTER U;Lo;0;L;;;;;N;;;;;
+10293;LYCIAN LETTER P;Lo;0;L;;;;;N;;;;;
+10294;LYCIAN LETTER KK;Lo;0;L;;;;;N;;;;;
+10295;LYCIAN LETTER R;Lo;0;L;;;;;N;;;;;
+10296;LYCIAN LETTER S;Lo;0;L;;;;;N;;;;;
+10297;LYCIAN LETTER T;Lo;0;L;;;;;N;;;;;
+10298;LYCIAN LETTER TT;Lo;0;L;;;;;N;;;;;
+10299;LYCIAN LETTER AN;Lo;0;L;;;;;N;;;;;
+1029A;LYCIAN LETTER EN;Lo;0;L;;;;;N;;;;;
+1029B;LYCIAN LETTER H;Lo;0;L;;;;;N;;;;;
+1029C;LYCIAN LETTER X;Lo;0;L;;;;;N;;;;;
+102A0;CARIAN LETTER A;Lo;0;L;;;;;N;;;;;
+102A1;CARIAN LETTER P2;Lo;0;L;;;;;N;;;;;
+102A2;CARIAN LETTER D;Lo;0;L;;;;;N;;;;;
+102A3;CARIAN LETTER L;Lo;0;L;;;;;N;;;;;
+102A4;CARIAN LETTER UUU;Lo;0;L;;;;;N;;;;;
+102A5;CARIAN LETTER R;Lo;0;L;;;;;N;;;;;
+102A6;CARIAN LETTER LD;Lo;0;L;;;;;N;;;;;
+102A7;CARIAN LETTER A2;Lo;0;L;;;;;N;;;;;
+102A8;CARIAN LETTER Q;Lo;0;L;;;;;N;;;;;
+102A9;CARIAN LETTER B;Lo;0;L;;;;;N;;;;;
+102AA;CARIAN LETTER M;Lo;0;L;;;;;N;;;;;
+102AB;CARIAN LETTER O;Lo;0;L;;;;;N;;;;;
+102AC;CARIAN LETTER D2;Lo;0;L;;;;;N;;;;;
+102AD;CARIAN LETTER T;Lo;0;L;;;;;N;;;;;
+102AE;CARIAN LETTER SH;Lo;0;L;;;;;N;;;;;
+102AF;CARIAN LETTER SH2;Lo;0;L;;;;;N;;;;;
+102B0;CARIAN LETTER S;Lo;0;L;;;;;N;;;;;
+102B1;CARIAN LETTER C-18;Lo;0;L;;;;;N;;;;;
+102B2;CARIAN LETTER U;Lo;0;L;;;;;N;;;;;
+102B3;CARIAN LETTER NN;Lo;0;L;;;;;N;;;;;
+102B4;CARIAN LETTER X;Lo;0;L;;;;;N;;;;;
+102B5;CARIAN LETTER N;Lo;0;L;;;;;N;;;;;
+102B6;CARIAN LETTER TT2;Lo;0;L;;;;;N;;;;;
+102B7;CARIAN LETTER P;Lo;0;L;;;;;N;;;;;
+102B8;CARIAN LETTER SS;Lo;0;L;;;;;N;;;;;
+102B9;CARIAN LETTER I;Lo;0;L;;;;;N;;;;;
+102BA;CARIAN LETTER E;Lo;0;L;;;;;N;;;;;
+102BB;CARIAN LETTER UUUU;Lo;0;L;;;;;N;;;;;
+102BC;CARIAN LETTER K;Lo;0;L;;;;;N;;;;;
+102BD;CARIAN LETTER K2;Lo;0;L;;;;;N;;;;;
+102BE;CARIAN LETTER ND;Lo;0;L;;;;;N;;;;;
+102BF;CARIAN LETTER UU;Lo;0;L;;;;;N;;;;;
+102C0;CARIAN LETTER G;Lo;0;L;;;;;N;;;;;
+102C1;CARIAN LETTER G2;Lo;0;L;;;;;N;;;;;
+102C2;CARIAN LETTER ST;Lo;0;L;;;;;N;;;;;
+102C3;CARIAN LETTER ST2;Lo;0;L;;;;;N;;;;;
+102C4;CARIAN LETTER NG;Lo;0;L;;;;;N;;;;;
+102C5;CARIAN LETTER II;Lo;0;L;;;;;N;;;;;
+102C6;CARIAN LETTER C-39;Lo;0;L;;;;;N;;;;;
+102C7;CARIAN LETTER TT;Lo;0;L;;;;;N;;;;;
+102C8;CARIAN LETTER UUU2;Lo;0;L;;;;;N;;;;;
+102C9;CARIAN LETTER RR;Lo;0;L;;;;;N;;;;;
+102CA;CARIAN LETTER MB;Lo;0;L;;;;;N;;;;;
+102CB;CARIAN LETTER MB2;Lo;0;L;;;;;N;;;;;
+102CC;CARIAN LETTER MB3;Lo;0;L;;;;;N;;;;;
+102CD;CARIAN LETTER MB4;Lo;0;L;;;;;N;;;;;
+102CE;CARIAN LETTER LD2;Lo;0;L;;;;;N;;;;;
+102CF;CARIAN LETTER E2;Lo;0;L;;;;;N;;;;;
+102D0;CARIAN LETTER UUU3;Lo;0;L;;;;;N;;;;;
+102E0;COPTIC EPACT THOUSANDS MARK;Mn;220;NSM;;;;;N;;;;;
+102E1;COPTIC EPACT DIGIT ONE;No;0;EN;;;;1;N;;;;;
+102E2;COPTIC EPACT DIGIT TWO;No;0;EN;;;;2;N;;;;;
+102E3;COPTIC EPACT DIGIT THREE;No;0;EN;;;;3;N;;;;;
+102E4;COPTIC EPACT DIGIT FOUR;No;0;EN;;;;4;N;;;;;
+102E5;COPTIC EPACT DIGIT FIVE;No;0;EN;;;;5;N;;;;;
+102E6;COPTIC EPACT DIGIT SIX;No;0;EN;;;;6;N;;;;;
+102E7;COPTIC EPACT DIGIT SEVEN;No;0;EN;;;;7;N;;;;;
+102E8;COPTIC EPACT DIGIT EIGHT;No;0;EN;;;;8;N;;;;;
+102E9;COPTIC EPACT DIGIT NINE;No;0;EN;;;;9;N;;;;;
+102EA;COPTIC EPACT NUMBER TEN;No;0;EN;;;;10;N;;;;;
+102EB;COPTIC EPACT NUMBER TWENTY;No;0;EN;;;;20;N;;;;;
+102EC;COPTIC EPACT NUMBER THIRTY;No;0;EN;;;;30;N;;;;;
+102ED;COPTIC EPACT NUMBER FORTY;No;0;EN;;;;40;N;;;;;
+102EE;COPTIC EPACT NUMBER FIFTY;No;0;EN;;;;50;N;;;;;
+102EF;COPTIC EPACT NUMBER SIXTY;No;0;EN;;;;60;N;;;;;
+102F0;COPTIC EPACT NUMBER SEVENTY;No;0;EN;;;;70;N;;;;;
+102F1;COPTIC EPACT NUMBER EIGHTY;No;0;EN;;;;80;N;;;;;
+102F2;COPTIC EPACT NUMBER NINETY;No;0;EN;;;;90;N;;;;;
+102F3;COPTIC EPACT NUMBER ONE HUNDRED;No;0;EN;;;;100;N;;;;;
+102F4;COPTIC EPACT NUMBER TWO HUNDRED;No;0;EN;;;;200;N;;;;;
+102F5;COPTIC EPACT NUMBER THREE HUNDRED;No;0;EN;;;;300;N;;;;;
+102F6;COPTIC EPACT NUMBER FOUR HUNDRED;No;0;EN;;;;400;N;;;;;
+102F7;COPTIC EPACT NUMBER FIVE HUNDRED;No;0;EN;;;;500;N;;;;;
+102F8;COPTIC EPACT NUMBER SIX HUNDRED;No;0;EN;;;;600;N;;;;;
+102F9;COPTIC EPACT NUMBER SEVEN HUNDRED;No;0;EN;;;;700;N;;;;;
+102FA;COPTIC EPACT NUMBER EIGHT HUNDRED;No;0;EN;;;;800;N;;;;;
+102FB;COPTIC EPACT NUMBER NINE HUNDRED;No;0;EN;;;;900;N;;;;;
+10300;OLD ITALIC LETTER A;Lo;0;L;;;;;N;;;;;
+10301;OLD ITALIC LETTER BE;Lo;0;L;;;;;N;;;;;
+10302;OLD ITALIC LETTER KE;Lo;0;L;;;;;N;;;;;
+10303;OLD ITALIC LETTER DE;Lo;0;L;;;;;N;;;;;
+10304;OLD ITALIC LETTER E;Lo;0;L;;;;;N;;;;;
+10305;OLD ITALIC LETTER VE;Lo;0;L;;;;;N;;;;;
+10306;OLD ITALIC LETTER ZE;Lo;0;L;;;;;N;;;;;
+10307;OLD ITALIC LETTER HE;Lo;0;L;;;;;N;;;;;
+10308;OLD ITALIC LETTER THE;Lo;0;L;;;;;N;;;;;
+10309;OLD ITALIC LETTER I;Lo;0;L;;;;;N;;;;;
+1030A;OLD ITALIC LETTER KA;Lo;0;L;;;;;N;;;;;
+1030B;OLD ITALIC LETTER EL;Lo;0;L;;;;;N;;;;;
+1030C;OLD ITALIC LETTER EM;Lo;0;L;;;;;N;;;;;
+1030D;OLD ITALIC LETTER EN;Lo;0;L;;;;;N;;;;;
+1030E;OLD ITALIC LETTER ESH;Lo;0;L;;;;;N;;;;;
+1030F;OLD ITALIC LETTER O;Lo;0;L;;;;;N;;;;;
+10310;OLD ITALIC LETTER PE;Lo;0;L;;;;;N;;;;;
+10311;OLD ITALIC LETTER SHE;Lo;0;L;;;;;N;;;;;
+10312;OLD ITALIC LETTER KU;Lo;0;L;;;;;N;;;;;
+10313;OLD ITALIC LETTER ER;Lo;0;L;;;;;N;;;;;
+10314;OLD ITALIC LETTER ES;Lo;0;L;;;;;N;;;;;
+10315;OLD ITALIC LETTER TE;Lo;0;L;;;;;N;;;;;
+10316;OLD ITALIC LETTER U;Lo;0;L;;;;;N;;;;;
+10317;OLD ITALIC LETTER EKS;Lo;0;L;;;;;N;;;;;
+10318;OLD ITALIC LETTER PHE;Lo;0;L;;;;;N;;;;;
+10319;OLD ITALIC LETTER KHE;Lo;0;L;;;;;N;;;;;
+1031A;OLD ITALIC LETTER EF;Lo;0;L;;;;;N;;;;;
+1031B;OLD ITALIC LETTER ERS;Lo;0;L;;;;;N;;;;;
+1031C;OLD ITALIC LETTER CHE;Lo;0;L;;;;;N;;;;;
+1031D;OLD ITALIC LETTER II;Lo;0;L;;;;;N;;;;;
+1031E;OLD ITALIC LETTER UU;Lo;0;L;;;;;N;;;;;
+1031F;OLD ITALIC LETTER ESS;Lo;0;L;;;;;N;;;;;
+10320;OLD ITALIC NUMERAL ONE;No;0;L;;;;1;N;;;;;
+10321;OLD ITALIC NUMERAL FIVE;No;0;L;;;;5;N;;;;;
+10322;OLD ITALIC NUMERAL TEN;No;0;L;;;;10;N;;;;;
+10323;OLD ITALIC NUMERAL FIFTY;No;0;L;;;;50;N;;;;;
+10330;GOTHIC LETTER AHSA;Lo;0;L;;;;;N;;;;;
+10331;GOTHIC LETTER BAIRKAN;Lo;0;L;;;;;N;;;;;
+10332;GOTHIC LETTER GIBA;Lo;0;L;;;;;N;;;;;
+10333;GOTHIC LETTER DAGS;Lo;0;L;;;;;N;;;;;
+10334;GOTHIC LETTER AIHVUS;Lo;0;L;;;;;N;;;;;
+10335;GOTHIC LETTER QAIRTHRA;Lo;0;L;;;;;N;;;;;
+10336;GOTHIC LETTER IUJA;Lo;0;L;;;;;N;;;;;
+10337;GOTHIC LETTER HAGL;Lo;0;L;;;;;N;;;;;
+10338;GOTHIC LETTER THIUTH;Lo;0;L;;;;;N;;;;;
+10339;GOTHIC LETTER EIS;Lo;0;L;;;;;N;;;;;
+1033A;GOTHIC LETTER KUSMA;Lo;0;L;;;;;N;;;;;
+1033B;GOTHIC LETTER LAGUS;Lo;0;L;;;;;N;;;;;
+1033C;GOTHIC LETTER MANNA;Lo;0;L;;;;;N;;;;;
+1033D;GOTHIC LETTER NAUTHS;Lo;0;L;;;;;N;;;;;
+1033E;GOTHIC LETTER JER;Lo;0;L;;;;;N;;;;;
+1033F;GOTHIC LETTER URUS;Lo;0;L;;;;;N;;;;;
+10340;GOTHIC LETTER PAIRTHRA;Lo;0;L;;;;;N;;;;;
+10341;GOTHIC LETTER NINETY;Nl;0;L;;;;90;N;;;;;
+10342;GOTHIC LETTER RAIDA;Lo;0;L;;;;;N;;;;;
+10343;GOTHIC LETTER SAUIL;Lo;0;L;;;;;N;;;;;
+10344;GOTHIC LETTER TEIWS;Lo;0;L;;;;;N;;;;;
+10345;GOTHIC LETTER WINJA;Lo;0;L;;;;;N;;;;;
+10346;GOTHIC LETTER FAIHU;Lo;0;L;;;;;N;;;;;
+10347;GOTHIC LETTER IGGWS;Lo;0;L;;;;;N;;;;;
+10348;GOTHIC LETTER HWAIR;Lo;0;L;;;;;N;;;;;
+10349;GOTHIC LETTER OTHAL;Lo;0;L;;;;;N;;;;;
+1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;900;N;;;;;
+10350;OLD PERMIC LETTER AN;Lo;0;L;;;;;N;;;;;
+10351;OLD PERMIC LETTER BUR;Lo;0;L;;;;;N;;;;;
+10352;OLD PERMIC LETTER GAI;Lo;0;L;;;;;N;;;;;
+10353;OLD PERMIC LETTER DOI;Lo;0;L;;;;;N;;;;;
+10354;OLD PERMIC LETTER E;Lo;0;L;;;;;N;;;;;
+10355;OLD PERMIC LETTER ZHOI;Lo;0;L;;;;;N;;;;;
+10356;OLD PERMIC LETTER DZHOI;Lo;0;L;;;;;N;;;;;
+10357;OLD PERMIC LETTER ZATA;Lo;0;L;;;;;N;;;;;
+10358;OLD PERMIC LETTER DZITA;Lo;0;L;;;;;N;;;;;
+10359;OLD PERMIC LETTER I;Lo;0;L;;;;;N;;;;;
+1035A;OLD PERMIC LETTER KOKE;Lo;0;L;;;;;N;;;;;
+1035B;OLD PERMIC LETTER LEI;Lo;0;L;;;;;N;;;;;
+1035C;OLD PERMIC LETTER MENOE;Lo;0;L;;;;;N;;;;;
+1035D;OLD PERMIC LETTER NENOE;Lo;0;L;;;;;N;;;;;
+1035E;OLD PERMIC LETTER VOOI;Lo;0;L;;;;;N;;;;;
+1035F;OLD PERMIC LETTER PEEI;Lo;0;L;;;;;N;;;;;
+10360;OLD PERMIC LETTER REI;Lo;0;L;;;;;N;;;;;
+10361;OLD PERMIC LETTER SII;Lo;0;L;;;;;N;;;;;
+10362;OLD PERMIC LETTER TAI;Lo;0;L;;;;;N;;;;;
+10363;OLD PERMIC LETTER U;Lo;0;L;;;;;N;;;;;
+10364;OLD PERMIC LETTER CHERY;Lo;0;L;;;;;N;;;;;
+10365;OLD PERMIC LETTER SHOOI;Lo;0;L;;;;;N;;;;;
+10366;OLD PERMIC LETTER SHCHOOI;Lo;0;L;;;;;N;;;;;
+10367;OLD PERMIC LETTER YRY;Lo;0;L;;;;;N;;;;;
+10368;OLD PERMIC LETTER YERU;Lo;0;L;;;;;N;;;;;
+10369;OLD PERMIC LETTER O;Lo;0;L;;;;;N;;;;;
+1036A;OLD PERMIC LETTER OO;Lo;0;L;;;;;N;;;;;
+1036B;OLD PERMIC LETTER EF;Lo;0;L;;;;;N;;;;;
+1036C;OLD PERMIC LETTER HA;Lo;0;L;;;;;N;;;;;
+1036D;OLD PERMIC LETTER TSIU;Lo;0;L;;;;;N;;;;;
+1036E;OLD PERMIC LETTER VER;Lo;0;L;;;;;N;;;;;
+1036F;OLD PERMIC LETTER YER;Lo;0;L;;;;;N;;;;;
+10370;OLD PERMIC LETTER YERI;Lo;0;L;;;;;N;;;;;
+10371;OLD PERMIC LETTER YAT;Lo;0;L;;;;;N;;;;;
+10372;OLD PERMIC LETTER IE;Lo;0;L;;;;;N;;;;;
+10373;OLD PERMIC LETTER YU;Lo;0;L;;;;;N;;;;;
+10374;OLD PERMIC LETTER YA;Lo;0;L;;;;;N;;;;;
+10375;OLD PERMIC LETTER IA;Lo;0;L;;;;;N;;;;;
+10376;COMBINING OLD PERMIC LETTER AN;Mn;230;NSM;;;;;N;;;;;
+10377;COMBINING OLD PERMIC LETTER DOI;Mn;230;NSM;;;;;N;;;;;
+10378;COMBINING OLD PERMIC LETTER ZATA;Mn;230;NSM;;;;;N;;;;;
+10379;COMBINING OLD PERMIC LETTER NENOE;Mn;230;NSM;;;;;N;;;;;
+1037A;COMBINING OLD PERMIC LETTER SII;Mn;230;NSM;;;;;N;;;;;
+10380;UGARITIC LETTER ALPA;Lo;0;L;;;;;N;;;;;
+10381;UGARITIC LETTER BETA;Lo;0;L;;;;;N;;;;;
+10382;UGARITIC LETTER GAMLA;Lo;0;L;;;;;N;;;;;
+10383;UGARITIC LETTER KHA;Lo;0;L;;;;;N;;;;;
+10384;UGARITIC LETTER DELTA;Lo;0;L;;;;;N;;;;;
+10385;UGARITIC LETTER HO;Lo;0;L;;;;;N;;;;;
+10386;UGARITIC LETTER WO;Lo;0;L;;;;;N;;;;;
+10387;UGARITIC LETTER ZETA;Lo;0;L;;;;;N;;;;;
+10388;UGARITIC LETTER HOTA;Lo;0;L;;;;;N;;;;;
+10389;UGARITIC LETTER TET;Lo;0;L;;;;;N;;;;;
+1038A;UGARITIC LETTER YOD;Lo;0;L;;;;;N;;;;;
+1038B;UGARITIC LETTER KAF;Lo;0;L;;;;;N;;;;;
+1038C;UGARITIC LETTER SHIN;Lo;0;L;;;;;N;;;;;
+1038D;UGARITIC LETTER LAMDA;Lo;0;L;;;;;N;;;;;
+1038E;UGARITIC LETTER MEM;Lo;0;L;;;;;N;;;;;
+1038F;UGARITIC LETTER DHAL;Lo;0;L;;;;;N;;;;;
+10390;UGARITIC LETTER NUN;Lo;0;L;;;;;N;;;;;
+10391;UGARITIC LETTER ZU;Lo;0;L;;;;;N;;;;;
+10392;UGARITIC LETTER SAMKA;Lo;0;L;;;;;N;;;;;
+10393;UGARITIC LETTER AIN;Lo;0;L;;;;;N;;;;;
+10394;UGARITIC LETTER PU;Lo;0;L;;;;;N;;;;;
+10395;UGARITIC LETTER SADE;Lo;0;L;;;;;N;;;;;
+10396;UGARITIC LETTER QOPA;Lo;0;L;;;;;N;;;;;
+10397;UGARITIC LETTER RASHA;Lo;0;L;;;;;N;;;;;
+10398;UGARITIC LETTER THANNA;Lo;0;L;;;;;N;;;;;
+10399;UGARITIC LETTER GHAIN;Lo;0;L;;;;;N;;;;;
+1039A;UGARITIC LETTER TO;Lo;0;L;;;;;N;;;;;
+1039B;UGARITIC LETTER I;Lo;0;L;;;;;N;;;;;
+1039C;UGARITIC LETTER U;Lo;0;L;;;;;N;;;;;
+1039D;UGARITIC LETTER SSU;Lo;0;L;;;;;N;;;;;
+1039F;UGARITIC WORD DIVIDER;Po;0;L;;;;;N;;;;;
+103A0;OLD PERSIAN SIGN A;Lo;0;L;;;;;N;;;;;
+103A1;OLD PERSIAN SIGN I;Lo;0;L;;;;;N;;;;;
+103A2;OLD PERSIAN SIGN U;Lo;0;L;;;;;N;;;;;
+103A3;OLD PERSIAN SIGN KA;Lo;0;L;;;;;N;;;;;
+103A4;OLD PERSIAN SIGN KU;Lo;0;L;;;;;N;;;;;
+103A5;OLD PERSIAN SIGN GA;Lo;0;L;;;;;N;;;;;
+103A6;OLD PERSIAN SIGN GU;Lo;0;L;;;;;N;;;;;
+103A7;OLD PERSIAN SIGN XA;Lo;0;L;;;;;N;;;;;
+103A8;OLD PERSIAN SIGN CA;Lo;0;L;;;;;N;;;;;
+103A9;OLD PERSIAN SIGN JA;Lo;0;L;;;;;N;;;;;
+103AA;OLD PERSIAN SIGN JI;Lo;0;L;;;;;N;;;;;
+103AB;OLD PERSIAN SIGN TA;Lo;0;L;;;;;N;;;;;
+103AC;OLD PERSIAN SIGN TU;Lo;0;L;;;;;N;;;;;
+103AD;OLD PERSIAN SIGN DA;Lo;0;L;;;;;N;;;;;
+103AE;OLD PERSIAN SIGN DI;Lo;0;L;;;;;N;;;;;
+103AF;OLD PERSIAN SIGN DU;Lo;0;L;;;;;N;;;;;
+103B0;OLD PERSIAN SIGN THA;Lo;0;L;;;;;N;;;;;
+103B1;OLD PERSIAN SIGN PA;Lo;0;L;;;;;N;;;;;
+103B2;OLD PERSIAN SIGN BA;Lo;0;L;;;;;N;;;;;
+103B3;OLD PERSIAN SIGN FA;Lo;0;L;;;;;N;;;;;
+103B4;OLD PERSIAN SIGN NA;Lo;0;L;;;;;N;;;;;
+103B5;OLD PERSIAN SIGN NU;Lo;0;L;;;;;N;;;;;
+103B6;OLD PERSIAN SIGN MA;Lo;0;L;;;;;N;;;;;
+103B7;OLD PERSIAN SIGN MI;Lo;0;L;;;;;N;;;;;
+103B8;OLD PERSIAN SIGN MU;Lo;0;L;;;;;N;;;;;
+103B9;OLD PERSIAN SIGN YA;Lo;0;L;;;;;N;;;;;
+103BA;OLD PERSIAN SIGN VA;Lo;0;L;;;;;N;;;;;
+103BB;OLD PERSIAN SIGN VI;Lo;0;L;;;;;N;;;;;
+103BC;OLD PERSIAN SIGN RA;Lo;0;L;;;;;N;;;;;
+103BD;OLD PERSIAN SIGN RU;Lo;0;L;;;;;N;;;;;
+103BE;OLD PERSIAN SIGN LA;Lo;0;L;;;;;N;;;;;
+103BF;OLD PERSIAN SIGN SA;Lo;0;L;;;;;N;;;;;
+103C0;OLD PERSIAN SIGN ZA;Lo;0;L;;;;;N;;;;;
+103C1;OLD PERSIAN SIGN SHA;Lo;0;L;;;;;N;;;;;
+103C2;OLD PERSIAN SIGN SSA;Lo;0;L;;;;;N;;;;;
+103C3;OLD PERSIAN SIGN HA;Lo;0;L;;;;;N;;;;;
+103C8;OLD PERSIAN SIGN AURAMAZDAA;Lo;0;L;;;;;N;;;;;
+103C9;OLD PERSIAN SIGN AURAMAZDAA-2;Lo;0;L;;;;;N;;;;;
+103CA;OLD PERSIAN SIGN AURAMAZDAAHA;Lo;0;L;;;;;N;;;;;
+103CB;OLD PERSIAN SIGN XSHAAYATHIYA;Lo;0;L;;;;;N;;;;;
+103CC;OLD PERSIAN SIGN DAHYAAUSH;Lo;0;L;;;;;N;;;;;
+103CD;OLD PERSIAN SIGN DAHYAAUSH-2;Lo;0;L;;;;;N;;;;;
+103CE;OLD PERSIAN SIGN BAGA;Lo;0;L;;;;;N;;;;;
+103CF;OLD PERSIAN SIGN BUUMISH;Lo;0;L;;;;;N;;;;;
+103D0;OLD PERSIAN WORD DIVIDER;Po;0;L;;;;;N;;;;;
+103D1;OLD PERSIAN NUMBER ONE;Nl;0;L;;;;1;N;;;;;
+103D2;OLD PERSIAN NUMBER TWO;Nl;0;L;;;;2;N;;;;;
+103D3;OLD PERSIAN NUMBER TEN;Nl;0;L;;;;10;N;;;;;
+103D4;OLD PERSIAN NUMBER TWENTY;Nl;0;L;;;;20;N;;;;;
+103D5;OLD PERSIAN NUMBER HUNDRED;Nl;0;L;;;;100;N;;;;;
+10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428;
+10401;DESERET CAPITAL LETTER LONG E;Lu;0;L;;;;;N;;;;10429;
+10402;DESERET CAPITAL LETTER LONG A;Lu;0;L;;;;;N;;;;1042A;
+10403;DESERET CAPITAL LETTER LONG AH;Lu;0;L;;;;;N;;;;1042B;
+10404;DESERET CAPITAL LETTER LONG O;Lu;0;L;;;;;N;;;;1042C;
+10405;DESERET CAPITAL LETTER LONG OO;Lu;0;L;;;;;N;;;;1042D;
+10406;DESERET CAPITAL LETTER SHORT I;Lu;0;L;;;;;N;;;;1042E;
+10407;DESERET CAPITAL LETTER SHORT E;Lu;0;L;;;;;N;;;;1042F;
+10408;DESERET CAPITAL LETTER SHORT A;Lu;0;L;;;;;N;;;;10430;
+10409;DESERET CAPITAL LETTER SHORT AH;Lu;0;L;;;;;N;;;;10431;
+1040A;DESERET CAPITAL LETTER SHORT O;Lu;0;L;;;;;N;;;;10432;
+1040B;DESERET CAPITAL LETTER SHORT OO;Lu;0;L;;;;;N;;;;10433;
+1040C;DESERET CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;10434;
+1040D;DESERET CAPITAL LETTER OW;Lu;0;L;;;;;N;;;;10435;
+1040E;DESERET CAPITAL LETTER WU;Lu;0;L;;;;;N;;;;10436;
+1040F;DESERET CAPITAL LETTER YEE;Lu;0;L;;;;;N;;;;10437;
+10410;DESERET CAPITAL LETTER H;Lu;0;L;;;;;N;;;;10438;
+10411;DESERET CAPITAL LETTER PEE;Lu;0;L;;;;;N;;;;10439;
+10412;DESERET CAPITAL LETTER BEE;Lu;0;L;;;;;N;;;;1043A;
+10413;DESERET CAPITAL LETTER TEE;Lu;0;L;;;;;N;;;;1043B;
+10414;DESERET CAPITAL LETTER DEE;Lu;0;L;;;;;N;;;;1043C;
+10415;DESERET CAPITAL LETTER CHEE;Lu;0;L;;;;;N;;;;1043D;
+10416;DESERET CAPITAL LETTER JEE;Lu;0;L;;;;;N;;;;1043E;
+10417;DESERET CAPITAL LETTER KAY;Lu;0;L;;;;;N;;;;1043F;
+10418;DESERET CAPITAL LETTER GAY;Lu;0;L;;;;;N;;;;10440;
+10419;DESERET CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;10441;
+1041A;DESERET CAPITAL LETTER VEE;Lu;0;L;;;;;N;;;;10442;
+1041B;DESERET CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;10443;
+1041C;DESERET CAPITAL LETTER THEE;Lu;0;L;;;;;N;;;;10444;
+1041D;DESERET CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;10445;
+1041E;DESERET CAPITAL LETTER ZEE;Lu;0;L;;;;;N;;;;10446;
+1041F;DESERET CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;10447;
+10420;DESERET CAPITAL LETTER ZHEE;Lu;0;L;;;;;N;;;;10448;
+10421;DESERET CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;10449;
+10422;DESERET CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;1044A;
+10423;DESERET CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;1044B;
+10424;DESERET CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;1044C;
+10425;DESERET CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;1044D;
+10426;DESERET CAPITAL LETTER OI;Lu;0;L;;;;;N;;;;1044E;
+10427;DESERET CAPITAL LETTER EW;Lu;0;L;;;;;N;;;;1044F;
+10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400
+10429;DESERET SMALL LETTER LONG E;Ll;0;L;;;;;N;;;10401;;10401
+1042A;DESERET SMALL LETTER LONG A;Ll;0;L;;;;;N;;;10402;;10402
+1042B;DESERET SMALL LETTER LONG AH;Ll;0;L;;;;;N;;;10403;;10403
+1042C;DESERET SMALL LETTER LONG O;Ll;0;L;;;;;N;;;10404;;10404
+1042D;DESERET SMALL LETTER LONG OO;Ll;0;L;;;;;N;;;10405;;10405
+1042E;DESERET SMALL LETTER SHORT I;Ll;0;L;;;;;N;;;10406;;10406
+1042F;DESERET SMALL LETTER SHORT E;Ll;0;L;;;;;N;;;10407;;10407
+10430;DESERET SMALL LETTER SHORT A;Ll;0;L;;;;;N;;;10408;;10408
+10431;DESERET SMALL LETTER SHORT AH;Ll;0;L;;;;;N;;;10409;;10409
+10432;DESERET SMALL LETTER SHORT O;Ll;0;L;;;;;N;;;1040A;;1040A
+10433;DESERET SMALL LETTER SHORT OO;Ll;0;L;;;;;N;;;1040B;;1040B
+10434;DESERET SMALL LETTER AY;Ll;0;L;;;;;N;;;1040C;;1040C
+10435;DESERET SMALL LETTER OW;Ll;0;L;;;;;N;;;1040D;;1040D
+10436;DESERET SMALL LETTER WU;Ll;0;L;;;;;N;;;1040E;;1040E
+10437;DESERET SMALL LETTER YEE;Ll;0;L;;;;;N;;;1040F;;1040F
+10438;DESERET SMALL LETTER H;Ll;0;L;;;;;N;;;10410;;10410
+10439;DESERET SMALL LETTER PEE;Ll;0;L;;;;;N;;;10411;;10411
+1043A;DESERET SMALL LETTER BEE;Ll;0;L;;;;;N;;;10412;;10412
+1043B;DESERET SMALL LETTER TEE;Ll;0;L;;;;;N;;;10413;;10413
+1043C;DESERET SMALL LETTER DEE;Ll;0;L;;;;;N;;;10414;;10414
+1043D;DESERET SMALL LETTER CHEE;Ll;0;L;;;;;N;;;10415;;10415
+1043E;DESERET SMALL LETTER JEE;Ll;0;L;;;;;N;;;10416;;10416
+1043F;DESERET SMALL LETTER KAY;Ll;0;L;;;;;N;;;10417;;10417
+10440;DESERET SMALL LETTER GAY;Ll;0;L;;;;;N;;;10418;;10418
+10441;DESERET SMALL LETTER EF;Ll;0;L;;;;;N;;;10419;;10419
+10442;DESERET SMALL LETTER VEE;Ll;0;L;;;;;N;;;1041A;;1041A
+10443;DESERET SMALL LETTER ETH;Ll;0;L;;;;;N;;;1041B;;1041B
+10444;DESERET SMALL LETTER THEE;Ll;0;L;;;;;N;;;1041C;;1041C
+10445;DESERET SMALL LETTER ES;Ll;0;L;;;;;N;;;1041D;;1041D
+10446;DESERET SMALL LETTER ZEE;Ll;0;L;;;;;N;;;1041E;;1041E
+10447;DESERET SMALL LETTER ESH;Ll;0;L;;;;;N;;;1041F;;1041F
+10448;DESERET SMALL LETTER ZHEE;Ll;0;L;;;;;N;;;10420;;10420
+10449;DESERET SMALL LETTER ER;Ll;0;L;;;;;N;;;10421;;10421
+1044A;DESERET SMALL LETTER EL;Ll;0;L;;;;;N;;;10422;;10422
+1044B;DESERET SMALL LETTER EM;Ll;0;L;;;;;N;;;10423;;10423
+1044C;DESERET SMALL LETTER EN;Ll;0;L;;;;;N;;;10424;;10424
+1044D;DESERET SMALL LETTER ENG;Ll;0;L;;;;;N;;;10425;;10425
+1044E;DESERET SMALL LETTER OI;Ll;0;L;;;;;N;;;10426;;10426
+1044F;DESERET SMALL LETTER EW;Ll;0;L;;;;;N;;;10427;;10427
+10450;SHAVIAN LETTER PEEP;Lo;0;L;;;;;N;;;;;
+10451;SHAVIAN LETTER TOT;Lo;0;L;;;;;N;;;;;
+10452;SHAVIAN LETTER KICK;Lo;0;L;;;;;N;;;;;
+10453;SHAVIAN LETTER FEE;Lo;0;L;;;;;N;;;;;
+10454;SHAVIAN LETTER THIGH;Lo;0;L;;;;;N;;;;;
+10455;SHAVIAN LETTER SO;Lo;0;L;;;;;N;;;;;
+10456;SHAVIAN LETTER SURE;Lo;0;L;;;;;N;;;;;
+10457;SHAVIAN LETTER CHURCH;Lo;0;L;;;;;N;;;;;
+10458;SHAVIAN LETTER YEA;Lo;0;L;;;;;N;;;;;
+10459;SHAVIAN LETTER HUNG;Lo;0;L;;;;;N;;;;;
+1045A;SHAVIAN LETTER BIB;Lo;0;L;;;;;N;;;;;
+1045B;SHAVIAN LETTER DEAD;Lo;0;L;;;;;N;;;;;
+1045C;SHAVIAN LETTER GAG;Lo;0;L;;;;;N;;;;;
+1045D;SHAVIAN LETTER VOW;Lo;0;L;;;;;N;;;;;
+1045E;SHAVIAN LETTER THEY;Lo;0;L;;;;;N;;;;;
+1045F;SHAVIAN LETTER ZOO;Lo;0;L;;;;;N;;;;;
+10460;SHAVIAN LETTER MEASURE;Lo;0;L;;;;;N;;;;;
+10461;SHAVIAN LETTER JUDGE;Lo;0;L;;;;;N;;;;;
+10462;SHAVIAN LETTER WOE;Lo;0;L;;;;;N;;;;;
+10463;SHAVIAN LETTER HA-HA;Lo;0;L;;;;;N;;;;;
+10464;SHAVIAN LETTER LOLL;Lo;0;L;;;;;N;;;;;
+10465;SHAVIAN LETTER MIME;Lo;0;L;;;;;N;;;;;
+10466;SHAVIAN LETTER IF;Lo;0;L;;;;;N;;;;;
+10467;SHAVIAN LETTER EGG;Lo;0;L;;;;;N;;;;;
+10468;SHAVIAN LETTER ASH;Lo;0;L;;;;;N;;;;;
+10469;SHAVIAN LETTER ADO;Lo;0;L;;;;;N;;;;;
+1046A;SHAVIAN LETTER ON;Lo;0;L;;;;;N;;;;;
+1046B;SHAVIAN LETTER WOOL;Lo;0;L;;;;;N;;;;;
+1046C;SHAVIAN LETTER OUT;Lo;0;L;;;;;N;;;;;
+1046D;SHAVIAN LETTER AH;Lo;0;L;;;;;N;;;;;
+1046E;SHAVIAN LETTER ROAR;Lo;0;L;;;;;N;;;;;
+1046F;SHAVIAN LETTER NUN;Lo;0;L;;;;;N;;;;;
+10470;SHAVIAN LETTER EAT;Lo;0;L;;;;;N;;;;;
+10471;SHAVIAN LETTER AGE;Lo;0;L;;;;;N;;;;;
+10472;SHAVIAN LETTER ICE;Lo;0;L;;;;;N;;;;;
+10473;SHAVIAN LETTER UP;Lo;0;L;;;;;N;;;;;
+10474;SHAVIAN LETTER OAK;Lo;0;L;;;;;N;;;;;
+10475;SHAVIAN LETTER OOZE;Lo;0;L;;;;;N;;;;;
+10476;SHAVIAN LETTER OIL;Lo;0;L;;;;;N;;;;;
+10477;SHAVIAN LETTER AWE;Lo;0;L;;;;;N;;;;;
+10478;SHAVIAN LETTER ARE;Lo;0;L;;;;;N;;;;;
+10479;SHAVIAN LETTER OR;Lo;0;L;;;;;N;;;;;
+1047A;SHAVIAN LETTER AIR;Lo;0;L;;;;;N;;;;;
+1047B;SHAVIAN LETTER ERR;Lo;0;L;;;;;N;;;;;
+1047C;SHAVIAN LETTER ARRAY;Lo;0;L;;;;;N;;;;;
+1047D;SHAVIAN LETTER EAR;Lo;0;L;;;;;N;;;;;
+1047E;SHAVIAN LETTER IAN;Lo;0;L;;;;;N;;;;;
+1047F;SHAVIAN LETTER YEW;Lo;0;L;;;;;N;;;;;
+10480;OSMANYA LETTER ALEF;Lo;0;L;;;;;N;;;;;
+10481;OSMANYA LETTER BA;Lo;0;L;;;;;N;;;;;
+10482;OSMANYA LETTER TA;Lo;0;L;;;;;N;;;;;
+10483;OSMANYA LETTER JA;Lo;0;L;;;;;N;;;;;
+10484;OSMANYA LETTER XA;Lo;0;L;;;;;N;;;;;
+10485;OSMANYA LETTER KHA;Lo;0;L;;;;;N;;;;;
+10486;OSMANYA LETTER DEEL;Lo;0;L;;;;;N;;;;;
+10487;OSMANYA LETTER RA;Lo;0;L;;;;;N;;;;;
+10488;OSMANYA LETTER SA;Lo;0;L;;;;;N;;;;;
+10489;OSMANYA LETTER SHIIN;Lo;0;L;;;;;N;;;;;
+1048A;OSMANYA LETTER DHA;Lo;0;L;;;;;N;;;;;
+1048B;OSMANYA LETTER CAYN;Lo;0;L;;;;;N;;;;;
+1048C;OSMANYA LETTER GA;Lo;0;L;;;;;N;;;;;
+1048D;OSMANYA LETTER FA;Lo;0;L;;;;;N;;;;;
+1048E;OSMANYA LETTER QAAF;Lo;0;L;;;;;N;;;;;
+1048F;OSMANYA LETTER KAAF;Lo;0;L;;;;;N;;;;;
+10490;OSMANYA LETTER LAAN;Lo;0;L;;;;;N;;;;;
+10491;OSMANYA LETTER MIIN;Lo;0;L;;;;;N;;;;;
+10492;OSMANYA LETTER NUUN;Lo;0;L;;;;;N;;;;;
+10493;OSMANYA LETTER WAW;Lo;0;L;;;;;N;;;;;
+10494;OSMANYA LETTER HA;Lo;0;L;;;;;N;;;;;
+10495;OSMANYA LETTER YA;Lo;0;L;;;;;N;;;;;
+10496;OSMANYA LETTER A;Lo;0;L;;;;;N;;;;;
+10497;OSMANYA LETTER E;Lo;0;L;;;;;N;;;;;
+10498;OSMANYA LETTER I;Lo;0;L;;;;;N;;;;;
+10499;OSMANYA LETTER O;Lo;0;L;;;;;N;;;;;
+1049A;OSMANYA LETTER U;Lo;0;L;;;;;N;;;;;
+1049B;OSMANYA LETTER AA;Lo;0;L;;;;;N;;;;;
+1049C;OSMANYA LETTER EE;Lo;0;L;;;;;N;;;;;
+1049D;OSMANYA LETTER OO;Lo;0;L;;;;;N;;;;;
+104A0;OSMANYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+104A1;OSMANYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+104A2;OSMANYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+104A3;OSMANYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+104A4;OSMANYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+104A5;OSMANYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+104A6;OSMANYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+104A7;OSMANYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+104A8;OSMANYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+104A9;OSMANYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+104B0;OSAGE CAPITAL LETTER A;Lu;0;L;;;;;N;;;;104D8;
+104B1;OSAGE CAPITAL LETTER AI;Lu;0;L;;;;;N;;;;104D9;
+104B2;OSAGE CAPITAL LETTER AIN;Lu;0;L;;;;;N;;;;104DA;
+104B3;OSAGE CAPITAL LETTER AH;Lu;0;L;;;;;N;;;;104DB;
+104B4;OSAGE CAPITAL LETTER BRA;Lu;0;L;;;;;N;;;;104DC;
+104B5;OSAGE CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;104DD;
+104B6;OSAGE CAPITAL LETTER EHCHA;Lu;0;L;;;;;N;;;;104DE;
+104B7;OSAGE CAPITAL LETTER E;Lu;0;L;;;;;N;;;;104DF;
+104B8;OSAGE CAPITAL LETTER EIN;Lu;0;L;;;;;N;;;;104E0;
+104B9;OSAGE CAPITAL LETTER HA;Lu;0;L;;;;;N;;;;104E1;
+104BA;OSAGE CAPITAL LETTER HYA;Lu;0;L;;;;;N;;;;104E2;
+104BB;OSAGE CAPITAL LETTER I;Lu;0;L;;;;;N;;;;104E3;
+104BC;OSAGE CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;104E4;
+104BD;OSAGE CAPITAL LETTER EHKA;Lu;0;L;;;;;N;;;;104E5;
+104BE;OSAGE CAPITAL LETTER KYA;Lu;0;L;;;;;N;;;;104E6;
+104BF;OSAGE CAPITAL LETTER LA;Lu;0;L;;;;;N;;;;104E7;
+104C0;OSAGE CAPITAL LETTER MA;Lu;0;L;;;;;N;;;;104E8;
+104C1;OSAGE CAPITAL LETTER NA;Lu;0;L;;;;;N;;;;104E9;
+104C2;OSAGE CAPITAL LETTER O;Lu;0;L;;;;;N;;;;104EA;
+104C3;OSAGE CAPITAL LETTER OIN;Lu;0;L;;;;;N;;;;104EB;
+104C4;OSAGE CAPITAL LETTER PA;Lu;0;L;;;;;N;;;;104EC;
+104C5;OSAGE CAPITAL LETTER EHPA;Lu;0;L;;;;;N;;;;104ED;
+104C6;OSAGE CAPITAL LETTER SA;Lu;0;L;;;;;N;;;;104EE;
+104C7;OSAGE CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;104EF;
+104C8;OSAGE CAPITAL LETTER TA;Lu;0;L;;;;;N;;;;104F0;
+104C9;OSAGE CAPITAL LETTER EHTA;Lu;0;L;;;;;N;;;;104F1;
+104CA;OSAGE CAPITAL LETTER TSA;Lu;0;L;;;;;N;;;;104F2;
+104CB;OSAGE CAPITAL LETTER EHTSA;Lu;0;L;;;;;N;;;;104F3;
+104CC;OSAGE CAPITAL LETTER TSHA;Lu;0;L;;;;;N;;;;104F4;
+104CD;OSAGE CAPITAL LETTER DHA;Lu;0;L;;;;;N;;;;104F5;
+104CE;OSAGE CAPITAL LETTER U;Lu;0;L;;;;;N;;;;104F6;
+104CF;OSAGE CAPITAL LETTER WA;Lu;0;L;;;;;N;;;;104F7;
+104D0;OSAGE CAPITAL LETTER KHA;Lu;0;L;;;;;N;;;;104F8;
+104D1;OSAGE CAPITAL LETTER GHA;Lu;0;L;;;;;N;;;;104F9;
+104D2;OSAGE CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;104FA;
+104D3;OSAGE CAPITAL LETTER ZHA;Lu;0;L;;;;;N;;;;104FB;
+104D8;OSAGE SMALL LETTER A;Ll;0;L;;;;;N;;;104B0;;104B0
+104D9;OSAGE SMALL LETTER AI;Ll;0;L;;;;;N;;;104B1;;104B1
+104DA;OSAGE SMALL LETTER AIN;Ll;0;L;;;;;N;;;104B2;;104B2
+104DB;OSAGE SMALL LETTER AH;Ll;0;L;;;;;N;;;104B3;;104B3
+104DC;OSAGE SMALL LETTER BRA;Ll;0;L;;;;;N;;;104B4;;104B4
+104DD;OSAGE SMALL LETTER CHA;Ll;0;L;;;;;N;;;104B5;;104B5
+104DE;OSAGE SMALL LETTER EHCHA;Ll;0;L;;;;;N;;;104B6;;104B6
+104DF;OSAGE SMALL LETTER E;Ll;0;L;;;;;N;;;104B7;;104B7
+104E0;OSAGE SMALL LETTER EIN;Ll;0;L;;;;;N;;;104B8;;104B8
+104E1;OSAGE SMALL LETTER HA;Ll;0;L;;;;;N;;;104B9;;104B9
+104E2;OSAGE SMALL LETTER HYA;Ll;0;L;;;;;N;;;104BA;;104BA
+104E3;OSAGE SMALL LETTER I;Ll;0;L;;;;;N;;;104BB;;104BB
+104E4;OSAGE SMALL LETTER KA;Ll;0;L;;;;;N;;;104BC;;104BC
+104E5;OSAGE SMALL LETTER EHKA;Ll;0;L;;;;;N;;;104BD;;104BD
+104E6;OSAGE SMALL LETTER KYA;Ll;0;L;;;;;N;;;104BE;;104BE
+104E7;OSAGE SMALL LETTER LA;Ll;0;L;;;;;N;;;104BF;;104BF
+104E8;OSAGE SMALL LETTER MA;Ll;0;L;;;;;N;;;104C0;;104C0
+104E9;OSAGE SMALL LETTER NA;Ll;0;L;;;;;N;;;104C1;;104C1
+104EA;OSAGE SMALL LETTER O;Ll;0;L;;;;;N;;;104C2;;104C2
+104EB;OSAGE SMALL LETTER OIN;Ll;0;L;;;;;N;;;104C3;;104C3
+104EC;OSAGE SMALL LETTER PA;Ll;0;L;;;;;N;;;104C4;;104C4
+104ED;OSAGE SMALL LETTER EHPA;Ll;0;L;;;;;N;;;104C5;;104C5
+104EE;OSAGE SMALL LETTER SA;Ll;0;L;;;;;N;;;104C6;;104C6
+104EF;OSAGE SMALL LETTER SHA;Ll;0;L;;;;;N;;;104C7;;104C7
+104F0;OSAGE SMALL LETTER TA;Ll;0;L;;;;;N;;;104C8;;104C8
+104F1;OSAGE SMALL LETTER EHTA;Ll;0;L;;;;;N;;;104C9;;104C9
+104F2;OSAGE SMALL LETTER TSA;Ll;0;L;;;;;N;;;104CA;;104CA
+104F3;OSAGE SMALL LETTER EHTSA;Ll;0;L;;;;;N;;;104CB;;104CB
+104F4;OSAGE SMALL LETTER TSHA;Ll;0;L;;;;;N;;;104CC;;104CC
+104F5;OSAGE SMALL LETTER DHA;Ll;0;L;;;;;N;;;104CD;;104CD
+104F6;OSAGE SMALL LETTER U;Ll;0;L;;;;;N;;;104CE;;104CE
+104F7;OSAGE SMALL LETTER WA;Ll;0;L;;;;;N;;;104CF;;104CF
+104F8;OSAGE SMALL LETTER KHA;Ll;0;L;;;;;N;;;104D0;;104D0
+104F9;OSAGE SMALL LETTER GHA;Ll;0;L;;;;;N;;;104D1;;104D1
+104FA;OSAGE SMALL LETTER ZA;Ll;0;L;;;;;N;;;104D2;;104D2
+104FB;OSAGE SMALL LETTER ZHA;Ll;0;L;;;;;N;;;104D3;;104D3
+10500;ELBASAN LETTER A;Lo;0;L;;;;;N;;;;;
+10501;ELBASAN LETTER BE;Lo;0;L;;;;;N;;;;;
+10502;ELBASAN LETTER CE;Lo;0;L;;;;;N;;;;;
+10503;ELBASAN LETTER CHE;Lo;0;L;;;;;N;;;;;
+10504;ELBASAN LETTER DE;Lo;0;L;;;;;N;;;;;
+10505;ELBASAN LETTER NDE;Lo;0;L;;;;;N;;;;;
+10506;ELBASAN LETTER DHE;Lo;0;L;;;;;N;;;;;
+10507;ELBASAN LETTER EI;Lo;0;L;;;;;N;;;;;
+10508;ELBASAN LETTER E;Lo;0;L;;;;;N;;;;;
+10509;ELBASAN LETTER FE;Lo;0;L;;;;;N;;;;;
+1050A;ELBASAN LETTER GE;Lo;0;L;;;;;N;;;;;
+1050B;ELBASAN LETTER GJE;Lo;0;L;;;;;N;;;;;
+1050C;ELBASAN LETTER HE;Lo;0;L;;;;;N;;;;;
+1050D;ELBASAN LETTER I;Lo;0;L;;;;;N;;;;;
+1050E;ELBASAN LETTER JE;Lo;0;L;;;;;N;;;;;
+1050F;ELBASAN LETTER KE;Lo;0;L;;;;;N;;;;;
+10510;ELBASAN LETTER LE;Lo;0;L;;;;;N;;;;;
+10511;ELBASAN LETTER LLE;Lo;0;L;;;;;N;;;;;
+10512;ELBASAN LETTER ME;Lo;0;L;;;;;N;;;;;
+10513;ELBASAN LETTER NE;Lo;0;L;;;;;N;;;;;
+10514;ELBASAN LETTER NA;Lo;0;L;;;;;N;;;;;
+10515;ELBASAN LETTER NJE;Lo;0;L;;;;;N;;;;;
+10516;ELBASAN LETTER O;Lo;0;L;;;;;N;;;;;
+10517;ELBASAN LETTER PE;Lo;0;L;;;;;N;;;;;
+10518;ELBASAN LETTER QE;Lo;0;L;;;;;N;;;;;
+10519;ELBASAN LETTER RE;Lo;0;L;;;;;N;;;;;
+1051A;ELBASAN LETTER RRE;Lo;0;L;;;;;N;;;;;
+1051B;ELBASAN LETTER SE;Lo;0;L;;;;;N;;;;;
+1051C;ELBASAN LETTER SHE;Lo;0;L;;;;;N;;;;;
+1051D;ELBASAN LETTER TE;Lo;0;L;;;;;N;;;;;
+1051E;ELBASAN LETTER THE;Lo;0;L;;;;;N;;;;;
+1051F;ELBASAN LETTER U;Lo;0;L;;;;;N;;;;;
+10520;ELBASAN LETTER VE;Lo;0;L;;;;;N;;;;;
+10521;ELBASAN LETTER XE;Lo;0;L;;;;;N;;;;;
+10522;ELBASAN LETTER Y;Lo;0;L;;;;;N;;;;;
+10523;ELBASAN LETTER ZE;Lo;0;L;;;;;N;;;;;
+10524;ELBASAN LETTER ZHE;Lo;0;L;;;;;N;;;;;
+10525;ELBASAN LETTER GHE;Lo;0;L;;;;;N;;;;;
+10526;ELBASAN LETTER GHAMMA;Lo;0;L;;;;;N;;;;;
+10527;ELBASAN LETTER KHE;Lo;0;L;;;;;N;;;;;
+10530;CAUCASIAN ALBANIAN LETTER ALT;Lo;0;L;;;;;N;;;;;
+10531;CAUCASIAN ALBANIAN LETTER BET;Lo;0;L;;;;;N;;;;;
+10532;CAUCASIAN ALBANIAN LETTER GIM;Lo;0;L;;;;;N;;;;;
+10533;CAUCASIAN ALBANIAN LETTER DAT;Lo;0;L;;;;;N;;;;;
+10534;CAUCASIAN ALBANIAN LETTER EB;Lo;0;L;;;;;N;;;;;
+10535;CAUCASIAN ALBANIAN LETTER ZARL;Lo;0;L;;;;;N;;;;;
+10536;CAUCASIAN ALBANIAN LETTER EYN;Lo;0;L;;;;;N;;;;;
+10537;CAUCASIAN ALBANIAN LETTER ZHIL;Lo;0;L;;;;;N;;;;;
+10538;CAUCASIAN ALBANIAN LETTER TAS;Lo;0;L;;;;;N;;;;;
+10539;CAUCASIAN ALBANIAN LETTER CHA;Lo;0;L;;;;;N;;;;;
+1053A;CAUCASIAN ALBANIAN LETTER YOWD;Lo;0;L;;;;;N;;;;;
+1053B;CAUCASIAN ALBANIAN LETTER ZHA;Lo;0;L;;;;;N;;;;;
+1053C;CAUCASIAN ALBANIAN LETTER IRB;Lo;0;L;;;;;N;;;;;
+1053D;CAUCASIAN ALBANIAN LETTER SHA;Lo;0;L;;;;;N;;;;;
+1053E;CAUCASIAN ALBANIAN LETTER LAN;Lo;0;L;;;;;N;;;;;
+1053F;CAUCASIAN ALBANIAN LETTER INYA;Lo;0;L;;;;;N;;;;;
+10540;CAUCASIAN ALBANIAN LETTER XEYN;Lo;0;L;;;;;N;;;;;
+10541;CAUCASIAN ALBANIAN LETTER DYAN;Lo;0;L;;;;;N;;;;;
+10542;CAUCASIAN ALBANIAN LETTER CAR;Lo;0;L;;;;;N;;;;;
+10543;CAUCASIAN ALBANIAN LETTER JHOX;Lo;0;L;;;;;N;;;;;
+10544;CAUCASIAN ALBANIAN LETTER KAR;Lo;0;L;;;;;N;;;;;
+10545;CAUCASIAN ALBANIAN LETTER LYIT;Lo;0;L;;;;;N;;;;;
+10546;CAUCASIAN ALBANIAN LETTER HEYT;Lo;0;L;;;;;N;;;;;
+10547;CAUCASIAN ALBANIAN LETTER QAY;Lo;0;L;;;;;N;;;;;
+10548;CAUCASIAN ALBANIAN LETTER AOR;Lo;0;L;;;;;N;;;;;
+10549;CAUCASIAN ALBANIAN LETTER CHOY;Lo;0;L;;;;;N;;;;;
+1054A;CAUCASIAN ALBANIAN LETTER CHI;Lo;0;L;;;;;N;;;;;
+1054B;CAUCASIAN ALBANIAN LETTER CYAY;Lo;0;L;;;;;N;;;;;
+1054C;CAUCASIAN ALBANIAN LETTER MAQ;Lo;0;L;;;;;N;;;;;
+1054D;CAUCASIAN ALBANIAN LETTER QAR;Lo;0;L;;;;;N;;;;;
+1054E;CAUCASIAN ALBANIAN LETTER NOWC;Lo;0;L;;;;;N;;;;;
+1054F;CAUCASIAN ALBANIAN LETTER DZYAY;Lo;0;L;;;;;N;;;;;
+10550;CAUCASIAN ALBANIAN LETTER SHAK;Lo;0;L;;;;;N;;;;;
+10551;CAUCASIAN ALBANIAN LETTER JAYN;Lo;0;L;;;;;N;;;;;
+10552;CAUCASIAN ALBANIAN LETTER ON;Lo;0;L;;;;;N;;;;;
+10553;CAUCASIAN ALBANIAN LETTER TYAY;Lo;0;L;;;;;N;;;;;
+10554;CAUCASIAN ALBANIAN LETTER FAM;Lo;0;L;;;;;N;;;;;
+10555;CAUCASIAN ALBANIAN LETTER DZAY;Lo;0;L;;;;;N;;;;;
+10556;CAUCASIAN ALBANIAN LETTER CHAT;Lo;0;L;;;;;N;;;;;
+10557;CAUCASIAN ALBANIAN LETTER PEN;Lo;0;L;;;;;N;;;;;
+10558;CAUCASIAN ALBANIAN LETTER GHEYS;Lo;0;L;;;;;N;;;;;
+10559;CAUCASIAN ALBANIAN LETTER RAT;Lo;0;L;;;;;N;;;;;
+1055A;CAUCASIAN ALBANIAN LETTER SEYK;Lo;0;L;;;;;N;;;;;
+1055B;CAUCASIAN ALBANIAN LETTER VEYZ;Lo;0;L;;;;;N;;;;;
+1055C;CAUCASIAN ALBANIAN LETTER TIWR;Lo;0;L;;;;;N;;;;;
+1055D;CAUCASIAN ALBANIAN LETTER SHOY;Lo;0;L;;;;;N;;;;;
+1055E;CAUCASIAN ALBANIAN LETTER IWN;Lo;0;L;;;;;N;;;;;
+1055F;CAUCASIAN ALBANIAN LETTER CYAW;Lo;0;L;;;;;N;;;;;
+10560;CAUCASIAN ALBANIAN LETTER CAYN;Lo;0;L;;;;;N;;;;;
+10561;CAUCASIAN ALBANIAN LETTER YAYD;Lo;0;L;;;;;N;;;;;
+10562;CAUCASIAN ALBANIAN LETTER PIWR;Lo;0;L;;;;;N;;;;;
+10563;CAUCASIAN ALBANIAN LETTER KIW;Lo;0;L;;;;;N;;;;;
+1056F;CAUCASIAN ALBANIAN CITATION MARK;Po;0;L;;;;;N;;;;;
+10600;LINEAR A SIGN AB001;Lo;0;L;;;;;N;;;;;
+10601;LINEAR A SIGN AB002;Lo;0;L;;;;;N;;;;;
+10602;LINEAR A SIGN AB003;Lo;0;L;;;;;N;;;;;
+10603;LINEAR A SIGN AB004;Lo;0;L;;;;;N;;;;;
+10604;LINEAR A SIGN AB005;Lo;0;L;;;;;N;;;;;
+10605;LINEAR A SIGN AB006;Lo;0;L;;;;;N;;;;;
+10606;LINEAR A SIGN AB007;Lo;0;L;;;;;N;;;;;
+10607;LINEAR A SIGN AB008;Lo;0;L;;;;;N;;;;;
+10608;LINEAR A SIGN AB009;Lo;0;L;;;;;N;;;;;
+10609;LINEAR A SIGN AB010;Lo;0;L;;;;;N;;;;;
+1060A;LINEAR A SIGN AB011;Lo;0;L;;;;;N;;;;;
+1060B;LINEAR A SIGN AB013;Lo;0;L;;;;;N;;;;;
+1060C;LINEAR A SIGN AB016;Lo;0;L;;;;;N;;;;;
+1060D;LINEAR A SIGN AB017;Lo;0;L;;;;;N;;;;;
+1060E;LINEAR A SIGN AB020;Lo;0;L;;;;;N;;;;;
+1060F;LINEAR A SIGN AB021;Lo;0;L;;;;;N;;;;;
+10610;LINEAR A SIGN AB021F;Lo;0;L;;;;;N;;;;;
+10611;LINEAR A SIGN AB021M;Lo;0;L;;;;;N;;;;;
+10612;LINEAR A SIGN AB022;Lo;0;L;;;;;N;;;;;
+10613;LINEAR A SIGN AB022F;Lo;0;L;;;;;N;;;;;
+10614;LINEAR A SIGN AB022M;Lo;0;L;;;;;N;;;;;
+10615;LINEAR A SIGN AB023;Lo;0;L;;;;;N;;;;;
+10616;LINEAR A SIGN AB023M;Lo;0;L;;;;;N;;;;;
+10617;LINEAR A SIGN AB024;Lo;0;L;;;;;N;;;;;
+10618;LINEAR A SIGN AB026;Lo;0;L;;;;;N;;;;;
+10619;LINEAR A SIGN AB027;Lo;0;L;;;;;N;;;;;
+1061A;LINEAR A SIGN AB028;Lo;0;L;;;;;N;;;;;
+1061B;LINEAR A SIGN A028B;Lo;0;L;;;;;N;;;;;
+1061C;LINEAR A SIGN AB029;Lo;0;L;;;;;N;;;;;
+1061D;LINEAR A SIGN AB030;Lo;0;L;;;;;N;;;;;
+1061E;LINEAR A SIGN AB031;Lo;0;L;;;;;N;;;;;
+1061F;LINEAR A SIGN AB034;Lo;0;L;;;;;N;;;;;
+10620;LINEAR A SIGN AB037;Lo;0;L;;;;;N;;;;;
+10621;LINEAR A SIGN AB038;Lo;0;L;;;;;N;;;;;
+10622;LINEAR A SIGN AB039;Lo;0;L;;;;;N;;;;;
+10623;LINEAR A SIGN AB040;Lo;0;L;;;;;N;;;;;
+10624;LINEAR A SIGN AB041;Lo;0;L;;;;;N;;;;;
+10625;LINEAR A SIGN AB044;Lo;0;L;;;;;N;;;;;
+10626;LINEAR A SIGN AB045;Lo;0;L;;;;;N;;;;;
+10627;LINEAR A SIGN AB046;Lo;0;L;;;;;N;;;;;
+10628;LINEAR A SIGN AB047;Lo;0;L;;;;;N;;;;;
+10629;LINEAR A SIGN AB048;Lo;0;L;;;;;N;;;;;
+1062A;LINEAR A SIGN AB049;Lo;0;L;;;;;N;;;;;
+1062B;LINEAR A SIGN AB050;Lo;0;L;;;;;N;;;;;
+1062C;LINEAR A SIGN AB051;Lo;0;L;;;;;N;;;;;
+1062D;LINEAR A SIGN AB053;Lo;0;L;;;;;N;;;;;
+1062E;LINEAR A SIGN AB054;Lo;0;L;;;;;N;;;;;
+1062F;LINEAR A SIGN AB055;Lo;0;L;;;;;N;;;;;
+10630;LINEAR A SIGN AB056;Lo;0;L;;;;;N;;;;;
+10631;LINEAR A SIGN AB057;Lo;0;L;;;;;N;;;;;
+10632;LINEAR A SIGN AB058;Lo;0;L;;;;;N;;;;;
+10633;LINEAR A SIGN AB059;Lo;0;L;;;;;N;;;;;
+10634;LINEAR A SIGN AB060;Lo;0;L;;;;;N;;;;;
+10635;LINEAR A SIGN AB061;Lo;0;L;;;;;N;;;;;
+10636;LINEAR A SIGN AB065;Lo;0;L;;;;;N;;;;;
+10637;LINEAR A SIGN AB066;Lo;0;L;;;;;N;;;;;
+10638;LINEAR A SIGN AB067;Lo;0;L;;;;;N;;;;;
+10639;LINEAR A SIGN AB069;Lo;0;L;;;;;N;;;;;
+1063A;LINEAR A SIGN AB070;Lo;0;L;;;;;N;;;;;
+1063B;LINEAR A SIGN AB073;Lo;0;L;;;;;N;;;;;
+1063C;LINEAR A SIGN AB074;Lo;0;L;;;;;N;;;;;
+1063D;LINEAR A SIGN AB076;Lo;0;L;;;;;N;;;;;
+1063E;LINEAR A SIGN AB077;Lo;0;L;;;;;N;;;;;
+1063F;LINEAR A SIGN AB078;Lo;0;L;;;;;N;;;;;
+10640;LINEAR A SIGN AB079;Lo;0;L;;;;;N;;;;;
+10641;LINEAR A SIGN AB080;Lo;0;L;;;;;N;;;;;
+10642;LINEAR A SIGN AB081;Lo;0;L;;;;;N;;;;;
+10643;LINEAR A SIGN AB082;Lo;0;L;;;;;N;;;;;
+10644;LINEAR A SIGN AB085;Lo;0;L;;;;;N;;;;;
+10645;LINEAR A SIGN AB086;Lo;0;L;;;;;N;;;;;
+10646;LINEAR A SIGN AB087;Lo;0;L;;;;;N;;;;;
+10647;LINEAR A SIGN A100-102;Lo;0;L;;;;;N;;;;;
+10648;LINEAR A SIGN AB118;Lo;0;L;;;;;N;;;;;
+10649;LINEAR A SIGN AB120;Lo;0;L;;;;;N;;;;;
+1064A;LINEAR A SIGN A120B;Lo;0;L;;;;;N;;;;;
+1064B;LINEAR A SIGN AB122;Lo;0;L;;;;;N;;;;;
+1064C;LINEAR A SIGN AB123;Lo;0;L;;;;;N;;;;;
+1064D;LINEAR A SIGN AB131A;Lo;0;L;;;;;N;;;;;
+1064E;LINEAR A SIGN AB131B;Lo;0;L;;;;;N;;;;;
+1064F;LINEAR A SIGN A131C;Lo;0;L;;;;;N;;;;;
+10650;LINEAR A SIGN AB164;Lo;0;L;;;;;N;;;;;
+10651;LINEAR A SIGN AB171;Lo;0;L;;;;;N;;;;;
+10652;LINEAR A SIGN AB180;Lo;0;L;;;;;N;;;;;
+10653;LINEAR A SIGN AB188;Lo;0;L;;;;;N;;;;;
+10654;LINEAR A SIGN AB191;Lo;0;L;;;;;N;;;;;
+10655;LINEAR A SIGN A301;Lo;0;L;;;;;N;;;;;
+10656;LINEAR A SIGN A302;Lo;0;L;;;;;N;;;;;
+10657;LINEAR A SIGN A303;Lo;0;L;;;;;N;;;;;
+10658;LINEAR A SIGN A304;Lo;0;L;;;;;N;;;;;
+10659;LINEAR A SIGN A305;Lo;0;L;;;;;N;;;;;
+1065A;LINEAR A SIGN A306;Lo;0;L;;;;;N;;;;;
+1065B;LINEAR A SIGN A307;Lo;0;L;;;;;N;;;;;
+1065C;LINEAR A SIGN A308;Lo;0;L;;;;;N;;;;;
+1065D;LINEAR A SIGN A309A;Lo;0;L;;;;;N;;;;;
+1065E;LINEAR A SIGN A309B;Lo;0;L;;;;;N;;;;;
+1065F;LINEAR A SIGN A309C;Lo;0;L;;;;;N;;;;;
+10660;LINEAR A SIGN A310;Lo;0;L;;;;;N;;;;;
+10661;LINEAR A SIGN A311;Lo;0;L;;;;;N;;;;;
+10662;LINEAR A SIGN A312;Lo;0;L;;;;;N;;;;;
+10663;LINEAR A SIGN A313A;Lo;0;L;;;;;N;;;;;
+10664;LINEAR A SIGN A313B;Lo;0;L;;;;;N;;;;;
+10665;LINEAR A SIGN A313C;Lo;0;L;;;;;N;;;;;
+10666;LINEAR A SIGN A314;Lo;0;L;;;;;N;;;;;
+10667;LINEAR A SIGN A315;Lo;0;L;;;;;N;;;;;
+10668;LINEAR A SIGN A316;Lo;0;L;;;;;N;;;;;
+10669;LINEAR A SIGN A317;Lo;0;L;;;;;N;;;;;
+1066A;LINEAR A SIGN A318;Lo;0;L;;;;;N;;;;;
+1066B;LINEAR A SIGN A319;Lo;0;L;;;;;N;;;;;
+1066C;LINEAR A SIGN A320;Lo;0;L;;;;;N;;;;;
+1066D;LINEAR A SIGN A321;Lo;0;L;;;;;N;;;;;
+1066E;LINEAR A SIGN A322;Lo;0;L;;;;;N;;;;;
+1066F;LINEAR A SIGN A323;Lo;0;L;;;;;N;;;;;
+10670;LINEAR A SIGN A324;Lo;0;L;;;;;N;;;;;
+10671;LINEAR A SIGN A325;Lo;0;L;;;;;N;;;;;
+10672;LINEAR A SIGN A326;Lo;0;L;;;;;N;;;;;
+10673;LINEAR A SIGN A327;Lo;0;L;;;;;N;;;;;
+10674;LINEAR A SIGN A328;Lo;0;L;;;;;N;;;;;
+10675;LINEAR A SIGN A329;Lo;0;L;;;;;N;;;;;
+10676;LINEAR A SIGN A330;Lo;0;L;;;;;N;;;;;
+10677;LINEAR A SIGN A331;Lo;0;L;;;;;N;;;;;
+10678;LINEAR A SIGN A332;Lo;0;L;;;;;N;;;;;
+10679;LINEAR A SIGN A333;Lo;0;L;;;;;N;;;;;
+1067A;LINEAR A SIGN A334;Lo;0;L;;;;;N;;;;;
+1067B;LINEAR A SIGN A335;Lo;0;L;;;;;N;;;;;
+1067C;LINEAR A SIGN A336;Lo;0;L;;;;;N;;;;;
+1067D;LINEAR A SIGN A337;Lo;0;L;;;;;N;;;;;
+1067E;LINEAR A SIGN A338;Lo;0;L;;;;;N;;;;;
+1067F;LINEAR A SIGN A339;Lo;0;L;;;;;N;;;;;
+10680;LINEAR A SIGN A340;Lo;0;L;;;;;N;;;;;
+10681;LINEAR A SIGN A341;Lo;0;L;;;;;N;;;;;
+10682;LINEAR A SIGN A342;Lo;0;L;;;;;N;;;;;
+10683;LINEAR A SIGN A343;Lo;0;L;;;;;N;;;;;
+10684;LINEAR A SIGN A344;Lo;0;L;;;;;N;;;;;
+10685;LINEAR A SIGN A345;Lo;0;L;;;;;N;;;;;
+10686;LINEAR A SIGN A346;Lo;0;L;;;;;N;;;;;
+10687;LINEAR A SIGN A347;Lo;0;L;;;;;N;;;;;
+10688;LINEAR A SIGN A348;Lo;0;L;;;;;N;;;;;
+10689;LINEAR A SIGN A349;Lo;0;L;;;;;N;;;;;
+1068A;LINEAR A SIGN A350;Lo;0;L;;;;;N;;;;;
+1068B;LINEAR A SIGN A351;Lo;0;L;;;;;N;;;;;
+1068C;LINEAR A SIGN A352;Lo;0;L;;;;;N;;;;;
+1068D;LINEAR A SIGN A353;Lo;0;L;;;;;N;;;;;
+1068E;LINEAR A SIGN A354;Lo;0;L;;;;;N;;;;;
+1068F;LINEAR A SIGN A355;Lo;0;L;;;;;N;;;;;
+10690;LINEAR A SIGN A356;Lo;0;L;;;;;N;;;;;
+10691;LINEAR A SIGN A357;Lo;0;L;;;;;N;;;;;
+10692;LINEAR A SIGN A358;Lo;0;L;;;;;N;;;;;
+10693;LINEAR A SIGN A359;Lo;0;L;;;;;N;;;;;
+10694;LINEAR A SIGN A360;Lo;0;L;;;;;N;;;;;
+10695;LINEAR A SIGN A361;Lo;0;L;;;;;N;;;;;
+10696;LINEAR A SIGN A362;Lo;0;L;;;;;N;;;;;
+10697;LINEAR A SIGN A363;Lo;0;L;;;;;N;;;;;
+10698;LINEAR A SIGN A364;Lo;0;L;;;;;N;;;;;
+10699;LINEAR A SIGN A365;Lo;0;L;;;;;N;;;;;
+1069A;LINEAR A SIGN A366;Lo;0;L;;;;;N;;;;;
+1069B;LINEAR A SIGN A367;Lo;0;L;;;;;N;;;;;
+1069C;LINEAR A SIGN A368;Lo;0;L;;;;;N;;;;;
+1069D;LINEAR A SIGN A369;Lo;0;L;;;;;N;;;;;
+1069E;LINEAR A SIGN A370;Lo;0;L;;;;;N;;;;;
+1069F;LINEAR A SIGN A371;Lo;0;L;;;;;N;;;;;
+106A0;LINEAR A SIGN A400-VAS;Lo;0;L;;;;;N;;;;;
+106A1;LINEAR A SIGN A401-VAS;Lo;0;L;;;;;N;;;;;
+106A2;LINEAR A SIGN A402-VAS;Lo;0;L;;;;;N;;;;;
+106A3;LINEAR A SIGN A403-VAS;Lo;0;L;;;;;N;;;;;
+106A4;LINEAR A SIGN A404-VAS;Lo;0;L;;;;;N;;;;;
+106A5;LINEAR A SIGN A405-VAS;Lo;0;L;;;;;N;;;;;
+106A6;LINEAR A SIGN A406-VAS;Lo;0;L;;;;;N;;;;;
+106A7;LINEAR A SIGN A407-VAS;Lo;0;L;;;;;N;;;;;
+106A8;LINEAR A SIGN A408-VAS;Lo;0;L;;;;;N;;;;;
+106A9;LINEAR A SIGN A409-VAS;Lo;0;L;;;;;N;;;;;
+106AA;LINEAR A SIGN A410-VAS;Lo;0;L;;;;;N;;;;;
+106AB;LINEAR A SIGN A411-VAS;Lo;0;L;;;;;N;;;;;
+106AC;LINEAR A SIGN A412-VAS;Lo;0;L;;;;;N;;;;;
+106AD;LINEAR A SIGN A413-VAS;Lo;0;L;;;;;N;;;;;
+106AE;LINEAR A SIGN A414-VAS;Lo;0;L;;;;;N;;;;;
+106AF;LINEAR A SIGN A415-VAS;Lo;0;L;;;;;N;;;;;
+106B0;LINEAR A SIGN A416-VAS;Lo;0;L;;;;;N;;;;;
+106B1;LINEAR A SIGN A417-VAS;Lo;0;L;;;;;N;;;;;
+106B2;LINEAR A SIGN A418-VAS;Lo;0;L;;;;;N;;;;;
+106B3;LINEAR A SIGN A501;Lo;0;L;;;;;N;;;;;
+106B4;LINEAR A SIGN A502;Lo;0;L;;;;;N;;;;;
+106B5;LINEAR A SIGN A503;Lo;0;L;;;;;N;;;;;
+106B6;LINEAR A SIGN A504;Lo;0;L;;;;;N;;;;;
+106B7;LINEAR A SIGN A505;Lo;0;L;;;;;N;;;;;
+106B8;LINEAR A SIGN A506;Lo;0;L;;;;;N;;;;;
+106B9;LINEAR A SIGN A508;Lo;0;L;;;;;N;;;;;
+106BA;LINEAR A SIGN A509;Lo;0;L;;;;;N;;;;;
+106BB;LINEAR A SIGN A510;Lo;0;L;;;;;N;;;;;
+106BC;LINEAR A SIGN A511;Lo;0;L;;;;;N;;;;;
+106BD;LINEAR A SIGN A512;Lo;0;L;;;;;N;;;;;
+106BE;LINEAR A SIGN A513;Lo;0;L;;;;;N;;;;;
+106BF;LINEAR A SIGN A515;Lo;0;L;;;;;N;;;;;
+106C0;LINEAR A SIGN A516;Lo;0;L;;;;;N;;;;;
+106C1;LINEAR A SIGN A520;Lo;0;L;;;;;N;;;;;
+106C2;LINEAR A SIGN A521;Lo;0;L;;;;;N;;;;;
+106C3;LINEAR A SIGN A523;Lo;0;L;;;;;N;;;;;
+106C4;LINEAR A SIGN A524;Lo;0;L;;;;;N;;;;;
+106C5;LINEAR A SIGN A525;Lo;0;L;;;;;N;;;;;
+106C6;LINEAR A SIGN A526;Lo;0;L;;;;;N;;;;;
+106C7;LINEAR A SIGN A527;Lo;0;L;;;;;N;;;;;
+106C8;LINEAR A SIGN A528;Lo;0;L;;;;;N;;;;;
+106C9;LINEAR A SIGN A529;Lo;0;L;;;;;N;;;;;
+106CA;LINEAR A SIGN A530;Lo;0;L;;;;;N;;;;;
+106CB;LINEAR A SIGN A531;Lo;0;L;;;;;N;;;;;
+106CC;LINEAR A SIGN A532;Lo;0;L;;;;;N;;;;;
+106CD;LINEAR A SIGN A534;Lo;0;L;;;;;N;;;;;
+106CE;LINEAR A SIGN A535;Lo;0;L;;;;;N;;;;;
+106CF;LINEAR A SIGN A536;Lo;0;L;;;;;N;;;;;
+106D0;LINEAR A SIGN A537;Lo;0;L;;;;;N;;;;;
+106D1;LINEAR A SIGN A538;Lo;0;L;;;;;N;;;;;
+106D2;LINEAR A SIGN A539;Lo;0;L;;;;;N;;;;;
+106D3;LINEAR A SIGN A540;Lo;0;L;;;;;N;;;;;
+106D4;LINEAR A SIGN A541;Lo;0;L;;;;;N;;;;;
+106D5;LINEAR A SIGN A542;Lo;0;L;;;;;N;;;;;
+106D6;LINEAR A SIGN A545;Lo;0;L;;;;;N;;;;;
+106D7;LINEAR A SIGN A547;Lo;0;L;;;;;N;;;;;
+106D8;LINEAR A SIGN A548;Lo;0;L;;;;;N;;;;;
+106D9;LINEAR A SIGN A549;Lo;0;L;;;;;N;;;;;
+106DA;LINEAR A SIGN A550;Lo;0;L;;;;;N;;;;;
+106DB;LINEAR A SIGN A551;Lo;0;L;;;;;N;;;;;
+106DC;LINEAR A SIGN A552;Lo;0;L;;;;;N;;;;;
+106DD;LINEAR A SIGN A553;Lo;0;L;;;;;N;;;;;
+106DE;LINEAR A SIGN A554;Lo;0;L;;;;;N;;;;;
+106DF;LINEAR A SIGN A555;Lo;0;L;;;;;N;;;;;
+106E0;LINEAR A SIGN A556;Lo;0;L;;;;;N;;;;;
+106E1;LINEAR A SIGN A557;Lo;0;L;;;;;N;;;;;
+106E2;LINEAR A SIGN A559;Lo;0;L;;;;;N;;;;;
+106E3;LINEAR A SIGN A563;Lo;0;L;;;;;N;;;;;
+106E4;LINEAR A SIGN A564;Lo;0;L;;;;;N;;;;;
+106E5;LINEAR A SIGN A565;Lo;0;L;;;;;N;;;;;
+106E6;LINEAR A SIGN A566;Lo;0;L;;;;;N;;;;;
+106E7;LINEAR A SIGN A568;Lo;0;L;;;;;N;;;;;
+106E8;LINEAR A SIGN A569;Lo;0;L;;;;;N;;;;;
+106E9;LINEAR A SIGN A570;Lo;0;L;;;;;N;;;;;
+106EA;LINEAR A SIGN A571;Lo;0;L;;;;;N;;;;;
+106EB;LINEAR A SIGN A572;Lo;0;L;;;;;N;;;;;
+106EC;LINEAR A SIGN A573;Lo;0;L;;;;;N;;;;;
+106ED;LINEAR A SIGN A574;Lo;0;L;;;;;N;;;;;
+106EE;LINEAR A SIGN A575;Lo;0;L;;;;;N;;;;;
+106EF;LINEAR A SIGN A576;Lo;0;L;;;;;N;;;;;
+106F0;LINEAR A SIGN A577;Lo;0;L;;;;;N;;;;;
+106F1;LINEAR A SIGN A578;Lo;0;L;;;;;N;;;;;
+106F2;LINEAR A SIGN A579;Lo;0;L;;;;;N;;;;;
+106F3;LINEAR A SIGN A580;Lo;0;L;;;;;N;;;;;
+106F4;LINEAR A SIGN A581;Lo;0;L;;;;;N;;;;;
+106F5;LINEAR A SIGN A582;Lo;0;L;;;;;N;;;;;
+106F6;LINEAR A SIGN A583;Lo;0;L;;;;;N;;;;;
+106F7;LINEAR A SIGN A584;Lo;0;L;;;;;N;;;;;
+106F8;LINEAR A SIGN A585;Lo;0;L;;;;;N;;;;;
+106F9;LINEAR A SIGN A586;Lo;0;L;;;;;N;;;;;
+106FA;LINEAR A SIGN A587;Lo;0;L;;;;;N;;;;;
+106FB;LINEAR A SIGN A588;Lo;0;L;;;;;N;;;;;
+106FC;LINEAR A SIGN A589;Lo;0;L;;;;;N;;;;;
+106FD;LINEAR A SIGN A591;Lo;0;L;;;;;N;;;;;
+106FE;LINEAR A SIGN A592;Lo;0;L;;;;;N;;;;;
+106FF;LINEAR A SIGN A594;Lo;0;L;;;;;N;;;;;
+10700;LINEAR A SIGN A595;Lo;0;L;;;;;N;;;;;
+10701;LINEAR A SIGN A596;Lo;0;L;;;;;N;;;;;
+10702;LINEAR A SIGN A598;Lo;0;L;;;;;N;;;;;
+10703;LINEAR A SIGN A600;Lo;0;L;;;;;N;;;;;
+10704;LINEAR A SIGN A601;Lo;0;L;;;;;N;;;;;
+10705;LINEAR A SIGN A602;Lo;0;L;;;;;N;;;;;
+10706;LINEAR A SIGN A603;Lo;0;L;;;;;N;;;;;
+10707;LINEAR A SIGN A604;Lo;0;L;;;;;N;;;;;
+10708;LINEAR A SIGN A606;Lo;0;L;;;;;N;;;;;
+10709;LINEAR A SIGN A608;Lo;0;L;;;;;N;;;;;
+1070A;LINEAR A SIGN A609;Lo;0;L;;;;;N;;;;;
+1070B;LINEAR A SIGN A610;Lo;0;L;;;;;N;;;;;
+1070C;LINEAR A SIGN A611;Lo;0;L;;;;;N;;;;;
+1070D;LINEAR A SIGN A612;Lo;0;L;;;;;N;;;;;
+1070E;LINEAR A SIGN A613;Lo;0;L;;;;;N;;;;;
+1070F;LINEAR A SIGN A614;Lo;0;L;;;;;N;;;;;
+10710;LINEAR A SIGN A615;Lo;0;L;;;;;N;;;;;
+10711;LINEAR A SIGN A616;Lo;0;L;;;;;N;;;;;
+10712;LINEAR A SIGN A617;Lo;0;L;;;;;N;;;;;
+10713;LINEAR A SIGN A618;Lo;0;L;;;;;N;;;;;
+10714;LINEAR A SIGN A619;Lo;0;L;;;;;N;;;;;
+10715;LINEAR A SIGN A620;Lo;0;L;;;;;N;;;;;
+10716;LINEAR A SIGN A621;Lo;0;L;;;;;N;;;;;
+10717;LINEAR A SIGN A622;Lo;0;L;;;;;N;;;;;
+10718;LINEAR A SIGN A623;Lo;0;L;;;;;N;;;;;
+10719;LINEAR A SIGN A624;Lo;0;L;;;;;N;;;;;
+1071A;LINEAR A SIGN A626;Lo;0;L;;;;;N;;;;;
+1071B;LINEAR A SIGN A627;Lo;0;L;;;;;N;;;;;
+1071C;LINEAR A SIGN A628;Lo;0;L;;;;;N;;;;;
+1071D;LINEAR A SIGN A629;Lo;0;L;;;;;N;;;;;
+1071E;LINEAR A SIGN A634;Lo;0;L;;;;;N;;;;;
+1071F;LINEAR A SIGN A637;Lo;0;L;;;;;N;;;;;
+10720;LINEAR A SIGN A638;Lo;0;L;;;;;N;;;;;
+10721;LINEAR A SIGN A640;Lo;0;L;;;;;N;;;;;
+10722;LINEAR A SIGN A642;Lo;0;L;;;;;N;;;;;
+10723;LINEAR A SIGN A643;Lo;0;L;;;;;N;;;;;
+10724;LINEAR A SIGN A644;Lo;0;L;;;;;N;;;;;
+10725;LINEAR A SIGN A645;Lo;0;L;;;;;N;;;;;
+10726;LINEAR A SIGN A646;Lo;0;L;;;;;N;;;;;
+10727;LINEAR A SIGN A648;Lo;0;L;;;;;N;;;;;
+10728;LINEAR A SIGN A649;Lo;0;L;;;;;N;;;;;
+10729;LINEAR A SIGN A651;Lo;0;L;;;;;N;;;;;
+1072A;LINEAR A SIGN A652;Lo;0;L;;;;;N;;;;;
+1072B;LINEAR A SIGN A653;Lo;0;L;;;;;N;;;;;
+1072C;LINEAR A SIGN A654;Lo;0;L;;;;;N;;;;;
+1072D;LINEAR A SIGN A655;Lo;0;L;;;;;N;;;;;
+1072E;LINEAR A SIGN A656;Lo;0;L;;;;;N;;;;;
+1072F;LINEAR A SIGN A657;Lo;0;L;;;;;N;;;;;
+10730;LINEAR A SIGN A658;Lo;0;L;;;;;N;;;;;
+10731;LINEAR A SIGN A659;Lo;0;L;;;;;N;;;;;
+10732;LINEAR A SIGN A660;Lo;0;L;;;;;N;;;;;
+10733;LINEAR A SIGN A661;Lo;0;L;;;;;N;;;;;
+10734;LINEAR A SIGN A662;Lo;0;L;;;;;N;;;;;
+10735;LINEAR A SIGN A663;Lo;0;L;;;;;N;;;;;
+10736;LINEAR A SIGN A664;Lo;0;L;;;;;N;;;;;
+10740;LINEAR A SIGN A701 A;Lo;0;L;;;;;N;;;;;
+10741;LINEAR A SIGN A702 B;Lo;0;L;;;;;N;;;;;
+10742;LINEAR A SIGN A703 D;Lo;0;L;;;;;N;;;;;
+10743;LINEAR A SIGN A704 E;Lo;0;L;;;;;N;;;;;
+10744;LINEAR A SIGN A705 F;Lo;0;L;;;;;N;;;;;
+10745;LINEAR A SIGN A706 H;Lo;0;L;;;;;N;;;;;
+10746;LINEAR A SIGN A707 J;Lo;0;L;;;;;N;;;;;
+10747;LINEAR A SIGN A708 K;Lo;0;L;;;;;N;;;;;
+10748;LINEAR A SIGN A709 L;Lo;0;L;;;;;N;;;;;
+10749;LINEAR A SIGN A709-2 L2;Lo;0;L;;;;;N;;;;;
+1074A;LINEAR A SIGN A709-3 L3;Lo;0;L;;;;;N;;;;;
+1074B;LINEAR A SIGN A709-4 L4;Lo;0;L;;;;;N;;;;;
+1074C;LINEAR A SIGN A709-6 L6;Lo;0;L;;;;;N;;;;;
+1074D;LINEAR A SIGN A710 W;Lo;0;L;;;;;N;;;;;
+1074E;LINEAR A SIGN A711 X;Lo;0;L;;;;;N;;;;;
+1074F;LINEAR A SIGN A712 Y;Lo;0;L;;;;;N;;;;;
+10750;LINEAR A SIGN A713 OMEGA;Lo;0;L;;;;;N;;;;;
+10751;LINEAR A SIGN A714 ABB;Lo;0;L;;;;;N;;;;;
+10752;LINEAR A SIGN A715 BB;Lo;0;L;;;;;N;;;;;
+10753;LINEAR A SIGN A717 DD;Lo;0;L;;;;;N;;;;;
+10754;LINEAR A SIGN A726 EYYY;Lo;0;L;;;;;N;;;;;
+10755;LINEAR A SIGN A732 JE;Lo;0;L;;;;;N;;;;;
+10760;LINEAR A SIGN A800;Lo;0;L;;;;;N;;;;;
+10761;LINEAR A SIGN A801;Lo;0;L;;;;;N;;;;;
+10762;LINEAR A SIGN A802;Lo;0;L;;;;;N;;;;;
+10763;LINEAR A SIGN A803;Lo;0;L;;;;;N;;;;;
+10764;LINEAR A SIGN A804;Lo;0;L;;;;;N;;;;;
+10765;LINEAR A SIGN A805;Lo;0;L;;;;;N;;;;;
+10766;LINEAR A SIGN A806;Lo;0;L;;;;;N;;;;;
+10767;LINEAR A SIGN A807;Lo;0;L;;;;;N;;;;;
+10800;CYPRIOT SYLLABLE A;Lo;0;R;;;;;N;;;;;
+10801;CYPRIOT SYLLABLE E;Lo;0;R;;;;;N;;;;;
+10802;CYPRIOT SYLLABLE I;Lo;0;R;;;;;N;;;;;
+10803;CYPRIOT SYLLABLE O;Lo;0;R;;;;;N;;;;;
+10804;CYPRIOT SYLLABLE U;Lo;0;R;;;;;N;;;;;
+10805;CYPRIOT SYLLABLE JA;Lo;0;R;;;;;N;;;;;
+10808;CYPRIOT SYLLABLE JO;Lo;0;R;;;;;N;;;;;
+1080A;CYPRIOT SYLLABLE KA;Lo;0;R;;;;;N;;;;;
+1080B;CYPRIOT SYLLABLE KE;Lo;0;R;;;;;N;;;;;
+1080C;CYPRIOT SYLLABLE KI;Lo;0;R;;;;;N;;;;;
+1080D;CYPRIOT SYLLABLE KO;Lo;0;R;;;;;N;;;;;
+1080E;CYPRIOT SYLLABLE KU;Lo;0;R;;;;;N;;;;;
+1080F;CYPRIOT SYLLABLE LA;Lo;0;R;;;;;N;;;;;
+10810;CYPRIOT SYLLABLE LE;Lo;0;R;;;;;N;;;;;
+10811;CYPRIOT SYLLABLE LI;Lo;0;R;;;;;N;;;;;
+10812;CYPRIOT SYLLABLE LO;Lo;0;R;;;;;N;;;;;
+10813;CYPRIOT SYLLABLE LU;Lo;0;R;;;;;N;;;;;
+10814;CYPRIOT SYLLABLE MA;Lo;0;R;;;;;N;;;;;
+10815;CYPRIOT SYLLABLE ME;Lo;0;R;;;;;N;;;;;
+10816;CYPRIOT SYLLABLE MI;Lo;0;R;;;;;N;;;;;
+10817;CYPRIOT SYLLABLE MO;Lo;0;R;;;;;N;;;;;
+10818;CYPRIOT SYLLABLE MU;Lo;0;R;;;;;N;;;;;
+10819;CYPRIOT SYLLABLE NA;Lo;0;R;;;;;N;;;;;
+1081A;CYPRIOT SYLLABLE NE;Lo;0;R;;;;;N;;;;;
+1081B;CYPRIOT SYLLABLE NI;Lo;0;R;;;;;N;;;;;
+1081C;CYPRIOT SYLLABLE NO;Lo;0;R;;;;;N;;;;;
+1081D;CYPRIOT SYLLABLE NU;Lo;0;R;;;;;N;;;;;
+1081E;CYPRIOT SYLLABLE PA;Lo;0;R;;;;;N;;;;;
+1081F;CYPRIOT SYLLABLE PE;Lo;0;R;;;;;N;;;;;
+10820;CYPRIOT SYLLABLE PI;Lo;0;R;;;;;N;;;;;
+10821;CYPRIOT SYLLABLE PO;Lo;0;R;;;;;N;;;;;
+10822;CYPRIOT SYLLABLE PU;Lo;0;R;;;;;N;;;;;
+10823;CYPRIOT SYLLABLE RA;Lo;0;R;;;;;N;;;;;
+10824;CYPRIOT SYLLABLE RE;Lo;0;R;;;;;N;;;;;
+10825;CYPRIOT SYLLABLE RI;Lo;0;R;;;;;N;;;;;
+10826;CYPRIOT SYLLABLE RO;Lo;0;R;;;;;N;;;;;
+10827;CYPRIOT SYLLABLE RU;Lo;0;R;;;;;N;;;;;
+10828;CYPRIOT SYLLABLE SA;Lo;0;R;;;;;N;;;;;
+10829;CYPRIOT SYLLABLE SE;Lo;0;R;;;;;N;;;;;
+1082A;CYPRIOT SYLLABLE SI;Lo;0;R;;;;;N;;;;;
+1082B;CYPRIOT SYLLABLE SO;Lo;0;R;;;;;N;;;;;
+1082C;CYPRIOT SYLLABLE SU;Lo;0;R;;;;;N;;;;;
+1082D;CYPRIOT SYLLABLE TA;Lo;0;R;;;;;N;;;;;
+1082E;CYPRIOT SYLLABLE TE;Lo;0;R;;;;;N;;;;;
+1082F;CYPRIOT SYLLABLE TI;Lo;0;R;;;;;N;;;;;
+10830;CYPRIOT SYLLABLE TO;Lo;0;R;;;;;N;;;;;
+10831;CYPRIOT SYLLABLE TU;Lo;0;R;;;;;N;;;;;
+10832;CYPRIOT SYLLABLE WA;Lo;0;R;;;;;N;;;;;
+10833;CYPRIOT SYLLABLE WE;Lo;0;R;;;;;N;;;;;
+10834;CYPRIOT SYLLABLE WI;Lo;0;R;;;;;N;;;;;
+10835;CYPRIOT SYLLABLE WO;Lo;0;R;;;;;N;;;;;
+10837;CYPRIOT SYLLABLE XA;Lo;0;R;;;;;N;;;;;
+10838;CYPRIOT SYLLABLE XE;Lo;0;R;;;;;N;;;;;
+1083C;CYPRIOT SYLLABLE ZA;Lo;0;R;;;;;N;;;;;
+1083F;CYPRIOT SYLLABLE ZO;Lo;0;R;;;;;N;;;;;
+10840;IMPERIAL ARAMAIC LETTER ALEPH;Lo;0;R;;;;;N;;;;;
+10841;IMPERIAL ARAMAIC LETTER BETH;Lo;0;R;;;;;N;;;;;
+10842;IMPERIAL ARAMAIC LETTER GIMEL;Lo;0;R;;;;;N;;;;;
+10843;IMPERIAL ARAMAIC LETTER DALETH;Lo;0;R;;;;;N;;;;;
+10844;IMPERIAL ARAMAIC LETTER HE;Lo;0;R;;;;;N;;;;;
+10845;IMPERIAL ARAMAIC LETTER WAW;Lo;0;R;;;;;N;;;;;
+10846;IMPERIAL ARAMAIC LETTER ZAYIN;Lo;0;R;;;;;N;;;;;
+10847;IMPERIAL ARAMAIC LETTER HETH;Lo;0;R;;;;;N;;;;;
+10848;IMPERIAL ARAMAIC LETTER TETH;Lo;0;R;;;;;N;;;;;
+10849;IMPERIAL ARAMAIC LETTER YODH;Lo;0;R;;;;;N;;;;;
+1084A;IMPERIAL ARAMAIC LETTER KAPH;Lo;0;R;;;;;N;;;;;
+1084B;IMPERIAL ARAMAIC LETTER LAMEDH;Lo;0;R;;;;;N;;;;;
+1084C;IMPERIAL ARAMAIC LETTER MEM;Lo;0;R;;;;;N;;;;;
+1084D;IMPERIAL ARAMAIC LETTER NUN;Lo;0;R;;;;;N;;;;;
+1084E;IMPERIAL ARAMAIC LETTER SAMEKH;Lo;0;R;;;;;N;;;;;
+1084F;IMPERIAL ARAMAIC LETTER AYIN;Lo;0;R;;;;;N;;;;;
+10850;IMPERIAL ARAMAIC LETTER PE;Lo;0;R;;;;;N;;;;;
+10851;IMPERIAL ARAMAIC LETTER SADHE;Lo;0;R;;;;;N;;;;;
+10852;IMPERIAL ARAMAIC LETTER QOPH;Lo;0;R;;;;;N;;;;;
+10853;IMPERIAL ARAMAIC LETTER RESH;Lo;0;R;;;;;N;;;;;
+10854;IMPERIAL ARAMAIC LETTER SHIN;Lo;0;R;;;;;N;;;;;
+10855;IMPERIAL ARAMAIC LETTER TAW;Lo;0;R;;;;;N;;;;;
+10857;IMPERIAL ARAMAIC SECTION SIGN;Po;0;R;;;;;N;;;;;
+10858;IMPERIAL ARAMAIC NUMBER ONE;No;0;R;;;;1;N;;;;;
+10859;IMPERIAL ARAMAIC NUMBER TWO;No;0;R;;;;2;N;;;;;
+1085A;IMPERIAL ARAMAIC NUMBER THREE;No;0;R;;;;3;N;;;;;
+1085B;IMPERIAL ARAMAIC NUMBER TEN;No;0;R;;;;10;N;;;;;
+1085C;IMPERIAL ARAMAIC NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+1085D;IMPERIAL ARAMAIC NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+1085E;IMPERIAL ARAMAIC NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;;
+1085F;IMPERIAL ARAMAIC NUMBER TEN THOUSAND;No;0;R;;;;10000;N;;;;;
+10860;PALMYRENE LETTER ALEPH;Lo;0;R;;;;;N;;;;;
+10861;PALMYRENE LETTER BETH;Lo;0;R;;;;;N;;;;;
+10862;PALMYRENE LETTER GIMEL;Lo;0;R;;;;;N;;;;;
+10863;PALMYRENE LETTER DALETH;Lo;0;R;;;;;N;;;;;
+10864;PALMYRENE LETTER HE;Lo;0;R;;;;;N;;;;;
+10865;PALMYRENE LETTER WAW;Lo;0;R;;;;;N;;;;;
+10866;PALMYRENE LETTER ZAYIN;Lo;0;R;;;;;N;;;;;
+10867;PALMYRENE LETTER HETH;Lo;0;R;;;;;N;;;;;
+10868;PALMYRENE LETTER TETH;Lo;0;R;;;;;N;;;;;
+10869;PALMYRENE LETTER YODH;Lo;0;R;;;;;N;;;;;
+1086A;PALMYRENE LETTER KAPH;Lo;0;R;;;;;N;;;;;
+1086B;PALMYRENE LETTER LAMEDH;Lo;0;R;;;;;N;;;;;
+1086C;PALMYRENE LETTER MEM;Lo;0;R;;;;;N;;;;;
+1086D;PALMYRENE LETTER FINAL NUN;Lo;0;R;;;;;N;;;;;
+1086E;PALMYRENE LETTER NUN;Lo;0;R;;;;;N;;;;;
+1086F;PALMYRENE LETTER SAMEKH;Lo;0;R;;;;;N;;;;;
+10870;PALMYRENE LETTER AYIN;Lo;0;R;;;;;N;;;;;
+10871;PALMYRENE LETTER PE;Lo;0;R;;;;;N;;;;;
+10872;PALMYRENE LETTER SADHE;Lo;0;R;;;;;N;;;;;
+10873;PALMYRENE LETTER QOPH;Lo;0;R;;;;;N;;;;;
+10874;PALMYRENE LETTER RESH;Lo;0;R;;;;;N;;;;;
+10875;PALMYRENE LETTER SHIN;Lo;0;R;;;;;N;;;;;
+10876;PALMYRENE LETTER TAW;Lo;0;R;;;;;N;;;;;
+10877;PALMYRENE LEFT-POINTING FLEURON;So;0;R;;;;;N;;;;;
+10878;PALMYRENE RIGHT-POINTING FLEURON;So;0;R;;;;;N;;;;;
+10879;PALMYRENE NUMBER ONE;No;0;R;;;;1;N;;;;;
+1087A;PALMYRENE NUMBER TWO;No;0;R;;;;2;N;;;;;
+1087B;PALMYRENE NUMBER THREE;No;0;R;;;;3;N;;;;;
+1087C;PALMYRENE NUMBER FOUR;No;0;R;;;;4;N;;;;;
+1087D;PALMYRENE NUMBER FIVE;No;0;R;;;;5;N;;;;;
+1087E;PALMYRENE NUMBER TEN;No;0;R;;;;10;N;;;;;
+1087F;PALMYRENE NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10880;NABATAEAN LETTER FINAL ALEPH;Lo;0;R;;;;;N;;;;;
+10881;NABATAEAN LETTER ALEPH;Lo;0;R;;;;;N;;;;;
+10882;NABATAEAN LETTER FINAL BETH;Lo;0;R;;;;;N;;;;;
+10883;NABATAEAN LETTER BETH;Lo;0;R;;;;;N;;;;;
+10884;NABATAEAN LETTER GIMEL;Lo;0;R;;;;;N;;;;;
+10885;NABATAEAN LETTER DALETH;Lo;0;R;;;;;N;;;;;
+10886;NABATAEAN LETTER FINAL HE;Lo;0;R;;;;;N;;;;;
+10887;NABATAEAN LETTER HE;Lo;0;R;;;;;N;;;;;
+10888;NABATAEAN LETTER WAW;Lo;0;R;;;;;N;;;;;
+10889;NABATAEAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;;
+1088A;NABATAEAN LETTER HETH;Lo;0;R;;;;;N;;;;;
+1088B;NABATAEAN LETTER TETH;Lo;0;R;;;;;N;;;;;
+1088C;NABATAEAN LETTER FINAL YODH;Lo;0;R;;;;;N;;;;;
+1088D;NABATAEAN LETTER YODH;Lo;0;R;;;;;N;;;;;
+1088E;NABATAEAN LETTER FINAL KAPH;Lo;0;R;;;;;N;;;;;
+1088F;NABATAEAN LETTER KAPH;Lo;0;R;;;;;N;;;;;
+10890;NABATAEAN LETTER FINAL LAMEDH;Lo;0;R;;;;;N;;;;;
+10891;NABATAEAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;;
+10892;NABATAEAN LETTER FINAL MEM;Lo;0;R;;;;;N;;;;;
+10893;NABATAEAN LETTER MEM;Lo;0;R;;;;;N;;;;;
+10894;NABATAEAN LETTER FINAL NUN;Lo;0;R;;;;;N;;;;;
+10895;NABATAEAN LETTER NUN;Lo;0;R;;;;;N;;;;;
+10896;NABATAEAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;;
+10897;NABATAEAN LETTER AYIN;Lo;0;R;;;;;N;;;;;
+10898;NABATAEAN LETTER PE;Lo;0;R;;;;;N;;;;;
+10899;NABATAEAN LETTER SADHE;Lo;0;R;;;;;N;;;;;
+1089A;NABATAEAN LETTER QOPH;Lo;0;R;;;;;N;;;;;
+1089B;NABATAEAN LETTER RESH;Lo;0;R;;;;;N;;;;;
+1089C;NABATAEAN LETTER FINAL SHIN;Lo;0;R;;;;;N;;;;;
+1089D;NABATAEAN LETTER SHIN;Lo;0;R;;;;;N;;;;;
+1089E;NABATAEAN LETTER TAW;Lo;0;R;;;;;N;;;;;
+108A7;NABATAEAN NUMBER ONE;No;0;R;;;;1;N;;;;;
+108A8;NABATAEAN NUMBER TWO;No;0;R;;;;2;N;;;;;
+108A9;NABATAEAN NUMBER THREE;No;0;R;;;;3;N;;;;;
+108AA;NABATAEAN NUMBER FOUR;No;0;R;;;;4;N;;;;;
+108AB;NABATAEAN CRUCIFORM NUMBER FOUR;No;0;R;;;;4;N;;;;;
+108AC;NABATAEAN NUMBER FIVE;No;0;R;;;;5;N;;;;;
+108AD;NABATAEAN NUMBER TEN;No;0;R;;;;10;N;;;;;
+108AE;NABATAEAN NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+108AF;NABATAEAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+108E0;HATRAN LETTER ALEPH;Lo;0;R;;;;;N;;;;;
+108E1;HATRAN LETTER BETH;Lo;0;R;;;;;N;;;;;
+108E2;HATRAN LETTER GIMEL;Lo;0;R;;;;;N;;;;;
+108E3;HATRAN LETTER DALETH-RESH;Lo;0;R;;;;;N;;;;;
+108E4;HATRAN LETTER HE;Lo;0;R;;;;;N;;;;;
+108E5;HATRAN LETTER WAW;Lo;0;R;;;;;N;;;;;
+108E6;HATRAN LETTER ZAYN;Lo;0;R;;;;;N;;;;;
+108E7;HATRAN LETTER HETH;Lo;0;R;;;;;N;;;;;
+108E8;HATRAN LETTER TETH;Lo;0;R;;;;;N;;;;;
+108E9;HATRAN LETTER YODH;Lo;0;R;;;;;N;;;;;
+108EA;HATRAN LETTER KAPH;Lo;0;R;;;;;N;;;;;
+108EB;HATRAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;;
+108EC;HATRAN LETTER MEM;Lo;0;R;;;;;N;;;;;
+108ED;HATRAN LETTER NUN;Lo;0;R;;;;;N;;;;;
+108EE;HATRAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;;
+108EF;HATRAN LETTER AYN;Lo;0;R;;;;;N;;;;;
+108F0;HATRAN LETTER PE;Lo;0;R;;;;;N;;;;;
+108F1;HATRAN LETTER SADHE;Lo;0;R;;;;;N;;;;;
+108F2;HATRAN LETTER QOPH;Lo;0;R;;;;;N;;;;;
+108F4;HATRAN LETTER SHIN;Lo;0;R;;;;;N;;;;;
+108F5;HATRAN LETTER TAW;Lo;0;R;;;;;N;;;;;
+108FB;HATRAN NUMBER ONE;No;0;R;;;;1;N;;;;;
+108FC;HATRAN NUMBER FIVE;No;0;R;;;;5;N;;;;;
+108FD;HATRAN NUMBER TEN;No;0;R;;;;10;N;;;;;
+108FE;HATRAN NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+108FF;HATRAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+10900;PHOENICIAN LETTER ALF;Lo;0;R;;;;;N;;;;;
+10901;PHOENICIAN LETTER BET;Lo;0;R;;;;;N;;;;;
+10902;PHOENICIAN LETTER GAML;Lo;0;R;;;;;N;;;;;
+10903;PHOENICIAN LETTER DELT;Lo;0;R;;;;;N;;;;;
+10904;PHOENICIAN LETTER HE;Lo;0;R;;;;;N;;;;;
+10905;PHOENICIAN LETTER WAU;Lo;0;R;;;;;N;;;;;
+10906;PHOENICIAN LETTER ZAI;Lo;0;R;;;;;N;;;;;
+10907;PHOENICIAN LETTER HET;Lo;0;R;;;;;N;;;;;
+10908;PHOENICIAN LETTER TET;Lo;0;R;;;;;N;;;;;
+10909;PHOENICIAN LETTER YOD;Lo;0;R;;;;;N;;;;;
+1090A;PHOENICIAN LETTER KAF;Lo;0;R;;;;;N;;;;;
+1090B;PHOENICIAN LETTER LAMD;Lo;0;R;;;;;N;;;;;
+1090C;PHOENICIAN LETTER MEM;Lo;0;R;;;;;N;;;;;
+1090D;PHOENICIAN LETTER NUN;Lo;0;R;;;;;N;;;;;
+1090E;PHOENICIAN LETTER SEMK;Lo;0;R;;;;;N;;;;;
+1090F;PHOENICIAN LETTER AIN;Lo;0;R;;;;;N;;;;;
+10910;PHOENICIAN LETTER PE;Lo;0;R;;;;;N;;;;;
+10911;PHOENICIAN LETTER SADE;Lo;0;R;;;;;N;;;;;
+10912;PHOENICIAN LETTER QOF;Lo;0;R;;;;;N;;;;;
+10913;PHOENICIAN LETTER ROSH;Lo;0;R;;;;;N;;;;;
+10914;PHOENICIAN LETTER SHIN;Lo;0;R;;;;;N;;;;;
+10915;PHOENICIAN LETTER TAU;Lo;0;R;;;;;N;;;;;
+10916;PHOENICIAN NUMBER ONE;No;0;R;;;;1;N;;;;;
+10917;PHOENICIAN NUMBER TEN;No;0;R;;;;10;N;;;;;
+10918;PHOENICIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10919;PHOENICIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+1091A;PHOENICIAN NUMBER TWO;No;0;R;;;;2;N;;;;;
+1091B;PHOENICIAN NUMBER THREE;No;0;R;;;;3;N;;;;;
+1091F;PHOENICIAN WORD SEPARATOR;Po;0;ON;;;;;N;;;;;
+10920;LYDIAN LETTER A;Lo;0;R;;;;;N;;;;;
+10921;LYDIAN LETTER B;Lo;0;R;;;;;N;;;;;
+10922;LYDIAN LETTER G;Lo;0;R;;;;;N;;;;;
+10923;LYDIAN LETTER D;Lo;0;R;;;;;N;;;;;
+10924;LYDIAN LETTER E;Lo;0;R;;;;;N;;;;;
+10925;LYDIAN LETTER V;Lo;0;R;;;;;N;;;;;
+10926;LYDIAN LETTER I;Lo;0;R;;;;;N;;;;;
+10927;LYDIAN LETTER Y;Lo;0;R;;;;;N;;;;;
+10928;LYDIAN LETTER K;Lo;0;R;;;;;N;;;;;
+10929;LYDIAN LETTER L;Lo;0;R;;;;;N;;;;;
+1092A;LYDIAN LETTER M;Lo;0;R;;;;;N;;;;;
+1092B;LYDIAN LETTER N;Lo;0;R;;;;;N;;;;;
+1092C;LYDIAN LETTER O;Lo;0;R;;;;;N;;;;;
+1092D;LYDIAN LETTER R;Lo;0;R;;;;;N;;;;;
+1092E;LYDIAN LETTER SS;Lo;0;R;;;;;N;;;;;
+1092F;LYDIAN LETTER T;Lo;0;R;;;;;N;;;;;
+10930;LYDIAN LETTER U;Lo;0;R;;;;;N;;;;;
+10931;LYDIAN LETTER F;Lo;0;R;;;;;N;;;;;
+10932;LYDIAN LETTER Q;Lo;0;R;;;;;N;;;;;
+10933;LYDIAN LETTER S;Lo;0;R;;;;;N;;;;;
+10934;LYDIAN LETTER TT;Lo;0;R;;;;;N;;;;;
+10935;LYDIAN LETTER AN;Lo;0;R;;;;;N;;;;;
+10936;LYDIAN LETTER EN;Lo;0;R;;;;;N;;;;;
+10937;LYDIAN LETTER LY;Lo;0;R;;;;;N;;;;;
+10938;LYDIAN LETTER NN;Lo;0;R;;;;;N;;;;;
+10939;LYDIAN LETTER C;Lo;0;R;;;;;N;;;;;
+1093F;LYDIAN TRIANGULAR MARK;Po;0;R;;;;;N;;;;;
+10980;MEROITIC HIEROGLYPHIC LETTER A;Lo;0;R;;;;;N;;;;;
+10981;MEROITIC HIEROGLYPHIC LETTER E;Lo;0;R;;;;;N;;;;;
+10982;MEROITIC HIEROGLYPHIC LETTER I;Lo;0;R;;;;;N;;;;;
+10983;MEROITIC HIEROGLYPHIC LETTER O;Lo;0;R;;;;;N;;;;;
+10984;MEROITIC HIEROGLYPHIC LETTER YA;Lo;0;R;;;;;N;;;;;
+10985;MEROITIC HIEROGLYPHIC LETTER WA;Lo;0;R;;;;;N;;;;;
+10986;MEROITIC HIEROGLYPHIC LETTER BA;Lo;0;R;;;;;N;;;;;
+10987;MEROITIC HIEROGLYPHIC LETTER BA-2;Lo;0;R;;;;;N;;;;;
+10988;MEROITIC HIEROGLYPHIC LETTER PA;Lo;0;R;;;;;N;;;;;
+10989;MEROITIC HIEROGLYPHIC LETTER MA;Lo;0;R;;;;;N;;;;;
+1098A;MEROITIC HIEROGLYPHIC LETTER NA;Lo;0;R;;;;;N;;;;;
+1098B;MEROITIC HIEROGLYPHIC LETTER NA-2;Lo;0;R;;;;;N;;;;;
+1098C;MEROITIC HIEROGLYPHIC LETTER NE;Lo;0;R;;;;;N;;;;;
+1098D;MEROITIC HIEROGLYPHIC LETTER NE-2;Lo;0;R;;;;;N;;;;;
+1098E;MEROITIC HIEROGLYPHIC LETTER RA;Lo;0;R;;;;;N;;;;;
+1098F;MEROITIC HIEROGLYPHIC LETTER RA-2;Lo;0;R;;;;;N;;;;;
+10990;MEROITIC HIEROGLYPHIC LETTER LA;Lo;0;R;;;;;N;;;;;
+10991;MEROITIC HIEROGLYPHIC LETTER KHA;Lo;0;R;;;;;N;;;;;
+10992;MEROITIC HIEROGLYPHIC LETTER HHA;Lo;0;R;;;;;N;;;;;
+10993;MEROITIC HIEROGLYPHIC LETTER SA;Lo;0;R;;;;;N;;;;;
+10994;MEROITIC HIEROGLYPHIC LETTER SA-2;Lo;0;R;;;;;N;;;;;
+10995;MEROITIC HIEROGLYPHIC LETTER SE;Lo;0;R;;;;;N;;;;;
+10996;MEROITIC HIEROGLYPHIC LETTER KA;Lo;0;R;;;;;N;;;;;
+10997;MEROITIC HIEROGLYPHIC LETTER QA;Lo;0;R;;;;;N;;;;;
+10998;MEROITIC HIEROGLYPHIC LETTER TA;Lo;0;R;;;;;N;;;;;
+10999;MEROITIC HIEROGLYPHIC LETTER TA-2;Lo;0;R;;;;;N;;;;;
+1099A;MEROITIC HIEROGLYPHIC LETTER TE;Lo;0;R;;;;;N;;;;;
+1099B;MEROITIC HIEROGLYPHIC LETTER TE-2;Lo;0;R;;;;;N;;;;;
+1099C;MEROITIC HIEROGLYPHIC LETTER TO;Lo;0;R;;;;;N;;;;;
+1099D;MEROITIC HIEROGLYPHIC LETTER DA;Lo;0;R;;;;;N;;;;;
+1099E;MEROITIC HIEROGLYPHIC SYMBOL VIDJ;Lo;0;R;;;;;N;;;;;
+1099F;MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2;Lo;0;R;;;;;N;;;;;
+109A0;MEROITIC CURSIVE LETTER A;Lo;0;R;;;;;N;;;;;
+109A1;MEROITIC CURSIVE LETTER E;Lo;0;R;;;;;N;;;;;
+109A2;MEROITIC CURSIVE LETTER I;Lo;0;R;;;;;N;;;;;
+109A3;MEROITIC CURSIVE LETTER O;Lo;0;R;;;;;N;;;;;
+109A4;MEROITIC CURSIVE LETTER YA;Lo;0;R;;;;;N;;;;;
+109A5;MEROITIC CURSIVE LETTER WA;Lo;0;R;;;;;N;;;;;
+109A6;MEROITIC CURSIVE LETTER BA;Lo;0;R;;;;;N;;;;;
+109A7;MEROITIC CURSIVE LETTER PA;Lo;0;R;;;;;N;;;;;
+109A8;MEROITIC CURSIVE LETTER MA;Lo;0;R;;;;;N;;;;;
+109A9;MEROITIC CURSIVE LETTER NA;Lo;0;R;;;;;N;;;;;
+109AA;MEROITIC CURSIVE LETTER NE;Lo;0;R;;;;;N;;;;;
+109AB;MEROITIC CURSIVE LETTER RA;Lo;0;R;;;;;N;;;;;
+109AC;MEROITIC CURSIVE LETTER LA;Lo;0;R;;;;;N;;;;;
+109AD;MEROITIC CURSIVE LETTER KHA;Lo;0;R;;;;;N;;;;;
+109AE;MEROITIC CURSIVE LETTER HHA;Lo;0;R;;;;;N;;;;;
+109AF;MEROITIC CURSIVE LETTER SA;Lo;0;R;;;;;N;;;;;
+109B0;MEROITIC CURSIVE LETTER ARCHAIC SA;Lo;0;R;;;;;N;;;;;
+109B1;MEROITIC CURSIVE LETTER SE;Lo;0;R;;;;;N;;;;;
+109B2;MEROITIC CURSIVE LETTER KA;Lo;0;R;;;;;N;;;;;
+109B3;MEROITIC CURSIVE LETTER QA;Lo;0;R;;;;;N;;;;;
+109B4;MEROITIC CURSIVE LETTER TA;Lo;0;R;;;;;N;;;;;
+109B5;MEROITIC CURSIVE LETTER TE;Lo;0;R;;;;;N;;;;;
+109B6;MEROITIC CURSIVE LETTER TO;Lo;0;R;;;;;N;;;;;
+109B7;MEROITIC CURSIVE LETTER DA;Lo;0;R;;;;;N;;;;;
+109BC;MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS;No;0;R;;;;11/12;N;;;;;
+109BD;MEROITIC CURSIVE FRACTION ONE HALF;No;0;R;;;;1/2;N;;;;;
+109BE;MEROITIC CURSIVE LOGOGRAM RMT;Lo;0;R;;;;;N;;;;;
+109BF;MEROITIC CURSIVE LOGOGRAM IMN;Lo;0;R;;;;;N;;;;;
+109C0;MEROITIC CURSIVE NUMBER ONE;No;0;R;;;;1;N;;;;;
+109C1;MEROITIC CURSIVE NUMBER TWO;No;0;R;;;;2;N;;;;;
+109C2;MEROITIC CURSIVE NUMBER THREE;No;0;R;;;;3;N;;;;;
+109C3;MEROITIC CURSIVE NUMBER FOUR;No;0;R;;;;4;N;;;;;
+109C4;MEROITIC CURSIVE NUMBER FIVE;No;0;R;;;;5;N;;;;;
+109C5;MEROITIC CURSIVE NUMBER SIX;No;0;R;;;;6;N;;;;;
+109C6;MEROITIC CURSIVE NUMBER SEVEN;No;0;R;;;;7;N;;;;;
+109C7;MEROITIC CURSIVE NUMBER EIGHT;No;0;R;;;;8;N;;;;;
+109C8;MEROITIC CURSIVE NUMBER NINE;No;0;R;;;;9;N;;;;;
+109C9;MEROITIC CURSIVE NUMBER TEN;No;0;R;;;;10;N;;;;;
+109CA;MEROITIC CURSIVE NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+109CB;MEROITIC CURSIVE NUMBER THIRTY;No;0;R;;;;30;N;;;;;
+109CC;MEROITIC CURSIVE NUMBER FORTY;No;0;R;;;;40;N;;;;;
+109CD;MEROITIC CURSIVE NUMBER FIFTY;No;0;R;;;;50;N;;;;;
+109CE;MEROITIC CURSIVE NUMBER SIXTY;No;0;R;;;;60;N;;;;;
+109CF;MEROITIC CURSIVE NUMBER SEVENTY;No;0;R;;;;70;N;;;;;
+109D2;MEROITIC CURSIVE NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+109D3;MEROITIC CURSIVE NUMBER TWO HUNDRED;No;0;R;;;;200;N;;;;;
+109D4;MEROITIC CURSIVE NUMBER THREE HUNDRED;No;0;R;;;;300;N;;;;;
+109D5;MEROITIC CURSIVE NUMBER FOUR HUNDRED;No;0;R;;;;400;N;;;;;
+109D6;MEROITIC CURSIVE NUMBER FIVE HUNDRED;No;0;R;;;;500;N;;;;;
+109D7;MEROITIC CURSIVE NUMBER SIX HUNDRED;No;0;R;;;;600;N;;;;;
+109D8;MEROITIC CURSIVE NUMBER SEVEN HUNDRED;No;0;R;;;;700;N;;;;;
+109D9;MEROITIC CURSIVE NUMBER EIGHT HUNDRED;No;0;R;;;;800;N;;;;;
+109DA;MEROITIC CURSIVE NUMBER NINE HUNDRED;No;0;R;;;;900;N;;;;;
+109DB;MEROITIC CURSIVE NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;;
+109DC;MEROITIC CURSIVE NUMBER TWO THOUSAND;No;0;R;;;;2000;N;;;;;
+109DD;MEROITIC CURSIVE NUMBER THREE THOUSAND;No;0;R;;;;3000;N;;;;;
+109DE;MEROITIC CURSIVE NUMBER FOUR THOUSAND;No;0;R;;;;4000;N;;;;;
+109DF;MEROITIC CURSIVE NUMBER FIVE THOUSAND;No;0;R;;;;5000;N;;;;;
+109E0;MEROITIC CURSIVE NUMBER SIX THOUSAND;No;0;R;;;;6000;N;;;;;
+109E1;MEROITIC CURSIVE NUMBER SEVEN THOUSAND;No;0;R;;;;7000;N;;;;;
+109E2;MEROITIC CURSIVE NUMBER EIGHT THOUSAND;No;0;R;;;;8000;N;;;;;
+109E3;MEROITIC CURSIVE NUMBER NINE THOUSAND;No;0;R;;;;9000;N;;;;;
+109E4;MEROITIC CURSIVE NUMBER TEN THOUSAND;No;0;R;;;;10000;N;;;;;
+109E5;MEROITIC CURSIVE NUMBER TWENTY THOUSAND;No;0;R;;;;20000;N;;;;;
+109E6;MEROITIC CURSIVE NUMBER THIRTY THOUSAND;No;0;R;;;;30000;N;;;;;
+109E7;MEROITIC CURSIVE NUMBER FORTY THOUSAND;No;0;R;;;;40000;N;;;;;
+109E8;MEROITIC CURSIVE NUMBER FIFTY THOUSAND;No;0;R;;;;50000;N;;;;;
+109E9;MEROITIC CURSIVE NUMBER SIXTY THOUSAND;No;0;R;;;;60000;N;;;;;
+109EA;MEROITIC CURSIVE NUMBER SEVENTY THOUSAND;No;0;R;;;;70000;N;;;;;
+109EB;MEROITIC CURSIVE NUMBER EIGHTY THOUSAND;No;0;R;;;;80000;N;;;;;
+109EC;MEROITIC CURSIVE NUMBER NINETY THOUSAND;No;0;R;;;;90000;N;;;;;
+109ED;MEROITIC CURSIVE NUMBER ONE HUNDRED THOUSAND;No;0;R;;;;100000;N;;;;;
+109EE;MEROITIC CURSIVE NUMBER TWO HUNDRED THOUSAND;No;0;R;;;;200000;N;;;;;
+109EF;MEROITIC CURSIVE NUMBER THREE HUNDRED THOUSAND;No;0;R;;;;300000;N;;;;;
+109F0;MEROITIC CURSIVE NUMBER FOUR HUNDRED THOUSAND;No;0;R;;;;400000;N;;;;;
+109F1;MEROITIC CURSIVE NUMBER FIVE HUNDRED THOUSAND;No;0;R;;;;500000;N;;;;;
+109F2;MEROITIC CURSIVE NUMBER SIX HUNDRED THOUSAND;No;0;R;;;;600000;N;;;;;
+109F3;MEROITIC CURSIVE NUMBER SEVEN HUNDRED THOUSAND;No;0;R;;;;700000;N;;;;;
+109F4;MEROITIC CURSIVE NUMBER EIGHT HUNDRED THOUSAND;No;0;R;;;;800000;N;;;;;
+109F5;MEROITIC CURSIVE NUMBER NINE HUNDRED THOUSAND;No;0;R;;;;900000;N;;;;;
+109F6;MEROITIC CURSIVE FRACTION ONE TWELFTH;No;0;R;;;;1/12;N;;;;;
+109F7;MEROITIC CURSIVE FRACTION TWO TWELFTHS;No;0;R;;;;2/12;N;;;;;
+109F8;MEROITIC CURSIVE FRACTION THREE TWELFTHS;No;0;R;;;;3/12;N;;;;;
+109F9;MEROITIC CURSIVE FRACTION FOUR TWELFTHS;No;0;R;;;;4/12;N;;;;;
+109FA;MEROITIC CURSIVE FRACTION FIVE TWELFTHS;No;0;R;;;;5/12;N;;;;;
+109FB;MEROITIC CURSIVE FRACTION SIX TWELFTHS;No;0;R;;;;6/12;N;;;;;
+109FC;MEROITIC CURSIVE FRACTION SEVEN TWELFTHS;No;0;R;;;;7/12;N;;;;;
+109FD;MEROITIC CURSIVE FRACTION EIGHT TWELFTHS;No;0;R;;;;8/12;N;;;;;
+109FE;MEROITIC CURSIVE FRACTION NINE TWELFTHS;No;0;R;;;;9/12;N;;;;;
+109FF;MEROITIC CURSIVE FRACTION TEN TWELFTHS;No;0;R;;;;10/12;N;;;;;
+10A00;KHAROSHTHI LETTER A;Lo;0;R;;;;;N;;;;;
+10A01;KHAROSHTHI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+10A02;KHAROSHTHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+10A03;KHAROSHTHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+10A05;KHAROSHTHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+10A06;KHAROSHTHI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+10A0C;KHAROSHTHI VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;;
+10A0D;KHAROSHTHI SIGN DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;;
+10A0E;KHAROSHTHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+10A0F;KHAROSHTHI SIGN VISARGA;Mn;230;NSM;;;;;N;;;;;
+10A10;KHAROSHTHI LETTER KA;Lo;0;R;;;;;N;;;;;
+10A11;KHAROSHTHI LETTER KHA;Lo;0;R;;;;;N;;;;;
+10A12;KHAROSHTHI LETTER GA;Lo;0;R;;;;;N;;;;;
+10A13;KHAROSHTHI LETTER GHA;Lo;0;R;;;;;N;;;;;
+10A15;KHAROSHTHI LETTER CA;Lo;0;R;;;;;N;;;;;
+10A16;KHAROSHTHI LETTER CHA;Lo;0;R;;;;;N;;;;;
+10A17;KHAROSHTHI LETTER JA;Lo;0;R;;;;;N;;;;;
+10A19;KHAROSHTHI LETTER NYA;Lo;0;R;;;;;N;;;;;
+10A1A;KHAROSHTHI LETTER TTA;Lo;0;R;;;;;N;;;;;
+10A1B;KHAROSHTHI LETTER TTHA;Lo;0;R;;;;;N;;;;;
+10A1C;KHAROSHTHI LETTER DDA;Lo;0;R;;;;;N;;;;;
+10A1D;KHAROSHTHI LETTER DDHA;Lo;0;R;;;;;N;;;;;
+10A1E;KHAROSHTHI LETTER NNA;Lo;0;R;;;;;N;;;;;
+10A1F;KHAROSHTHI LETTER TA;Lo;0;R;;;;;N;;;;;
+10A20;KHAROSHTHI LETTER THA;Lo;0;R;;;;;N;;;;;
+10A21;KHAROSHTHI LETTER DA;Lo;0;R;;;;;N;;;;;
+10A22;KHAROSHTHI LETTER DHA;Lo;0;R;;;;;N;;;;;
+10A23;KHAROSHTHI LETTER NA;Lo;0;R;;;;;N;;;;;
+10A24;KHAROSHTHI LETTER PA;Lo;0;R;;;;;N;;;;;
+10A25;KHAROSHTHI LETTER PHA;Lo;0;R;;;;;N;;;;;
+10A26;KHAROSHTHI LETTER BA;Lo;0;R;;;;;N;;;;;
+10A27;KHAROSHTHI LETTER BHA;Lo;0;R;;;;;N;;;;;
+10A28;KHAROSHTHI LETTER MA;Lo;0;R;;;;;N;;;;;
+10A29;KHAROSHTHI LETTER YA;Lo;0;R;;;;;N;;;;;
+10A2A;KHAROSHTHI LETTER RA;Lo;0;R;;;;;N;;;;;
+10A2B;KHAROSHTHI LETTER LA;Lo;0;R;;;;;N;;;;;
+10A2C;KHAROSHTHI LETTER VA;Lo;0;R;;;;;N;;;;;
+10A2D;KHAROSHTHI LETTER SHA;Lo;0;R;;;;;N;;;;;
+10A2E;KHAROSHTHI LETTER SSA;Lo;0;R;;;;;N;;;;;
+10A2F;KHAROSHTHI LETTER SA;Lo;0;R;;;;;N;;;;;
+10A30;KHAROSHTHI LETTER ZA;Lo;0;R;;;;;N;;;;;
+10A31;KHAROSHTHI LETTER HA;Lo;0;R;;;;;N;;;;;
+10A32;KHAROSHTHI LETTER KKA;Lo;0;R;;;;;N;;;;;
+10A33;KHAROSHTHI LETTER TTTHA;Lo;0;R;;;;;N;;;;;
+10A38;KHAROSHTHI SIGN BAR ABOVE;Mn;230;NSM;;;;;N;;;;;
+10A39;KHAROSHTHI SIGN CAUDA;Mn;1;NSM;;;;;N;;;;;
+10A3A;KHAROSHTHI SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;;
+10A3F;KHAROSHTHI VIRAMA;Mn;9;NSM;;;;;N;;;;;
+10A40;KHAROSHTHI DIGIT ONE;No;0;R;;;1;1;N;;;;;
+10A41;KHAROSHTHI DIGIT TWO;No;0;R;;;2;2;N;;;;;
+10A42;KHAROSHTHI DIGIT THREE;No;0;R;;;3;3;N;;;;;
+10A43;KHAROSHTHI DIGIT FOUR;No;0;R;;;4;4;N;;;;;
+10A44;KHAROSHTHI NUMBER TEN;No;0;R;;;;10;N;;;;;
+10A45;KHAROSHTHI NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10A46;KHAROSHTHI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+10A47;KHAROSHTHI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;;
+10A50;KHAROSHTHI PUNCTUATION DOT;Po;0;R;;;;;N;;;;;
+10A51;KHAROSHTHI PUNCTUATION SMALL CIRCLE;Po;0;R;;;;;N;;;;;
+10A52;KHAROSHTHI PUNCTUATION CIRCLE;Po;0;R;;;;;N;;;;;
+10A53;KHAROSHTHI PUNCTUATION CRESCENT BAR;Po;0;R;;;;;N;;;;;
+10A54;KHAROSHTHI PUNCTUATION MANGALAM;Po;0;R;;;;;N;;;;;
+10A55;KHAROSHTHI PUNCTUATION LOTUS;Po;0;R;;;;;N;;;;;
+10A56;KHAROSHTHI PUNCTUATION DANDA;Po;0;R;;;;;N;;;;;
+10A57;KHAROSHTHI PUNCTUATION DOUBLE DANDA;Po;0;R;;;;;N;;;;;
+10A58;KHAROSHTHI PUNCTUATION LINES;Po;0;R;;;;;N;;;;;
+10A60;OLD SOUTH ARABIAN LETTER HE;Lo;0;R;;;;;N;;;;;
+10A61;OLD SOUTH ARABIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;;
+10A62;OLD SOUTH ARABIAN LETTER HETH;Lo;0;R;;;;;N;;;;;
+10A63;OLD SOUTH ARABIAN LETTER MEM;Lo;0;R;;;;;N;;;;;
+10A64;OLD SOUTH ARABIAN LETTER QOPH;Lo;0;R;;;;;N;;;;;
+10A65;OLD SOUTH ARABIAN LETTER WAW;Lo;0;R;;;;;N;;;;;
+10A66;OLD SOUTH ARABIAN LETTER SHIN;Lo;0;R;;;;;N;;;;;
+10A67;OLD SOUTH ARABIAN LETTER RESH;Lo;0;R;;;;;N;;;;;
+10A68;OLD SOUTH ARABIAN LETTER BETH;Lo;0;R;;;;;N;;;;;
+10A69;OLD SOUTH ARABIAN LETTER TAW;Lo;0;R;;;;;N;;;;;
+10A6A;OLD SOUTH ARABIAN LETTER SAT;Lo;0;R;;;;;N;;;;;
+10A6B;OLD SOUTH ARABIAN LETTER KAPH;Lo;0;R;;;;;N;;;;;
+10A6C;OLD SOUTH ARABIAN LETTER NUN;Lo;0;R;;;;;N;;;;;
+10A6D;OLD SOUTH ARABIAN LETTER KHETH;Lo;0;R;;;;;N;;;;;
+10A6E;OLD SOUTH ARABIAN LETTER SADHE;Lo;0;R;;;;;N;;;;;
+10A6F;OLD SOUTH ARABIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;;
+10A70;OLD SOUTH ARABIAN LETTER FE;Lo;0;R;;;;;N;;;;;
+10A71;OLD SOUTH ARABIAN LETTER ALEF;Lo;0;R;;;;;N;;;;;
+10A72;OLD SOUTH ARABIAN LETTER AYN;Lo;0;R;;;;;N;;;;;
+10A73;OLD SOUTH ARABIAN LETTER DHADHE;Lo;0;R;;;;;N;;;;;
+10A74;OLD SOUTH ARABIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;;
+10A75;OLD SOUTH ARABIAN LETTER DALETH;Lo;0;R;;;;;N;;;;;
+10A76;OLD SOUTH ARABIAN LETTER GHAYN;Lo;0;R;;;;;N;;;;;
+10A77;OLD SOUTH ARABIAN LETTER TETH;Lo;0;R;;;;;N;;;;;
+10A78;OLD SOUTH ARABIAN LETTER ZAYN;Lo;0;R;;;;;N;;;;;
+10A79;OLD SOUTH ARABIAN LETTER DHALETH;Lo;0;R;;;;;N;;;;;
+10A7A;OLD SOUTH ARABIAN LETTER YODH;Lo;0;R;;;;;N;;;;;
+10A7B;OLD SOUTH ARABIAN LETTER THAW;Lo;0;R;;;;;N;;;;;
+10A7C;OLD SOUTH ARABIAN LETTER THETH;Lo;0;R;;;;;N;;;;;
+10A7D;OLD SOUTH ARABIAN NUMBER ONE;No;0;R;;;;1;N;;;;;
+10A7E;OLD SOUTH ARABIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;;
+10A7F;OLD SOUTH ARABIAN NUMERIC INDICATOR;Po;0;R;;;;;N;;;;;
+10A80;OLD NORTH ARABIAN LETTER HEH;Lo;0;R;;;;;N;;;;;
+10A81;OLD NORTH ARABIAN LETTER LAM;Lo;0;R;;;;;N;;;;;
+10A82;OLD NORTH ARABIAN LETTER HAH;Lo;0;R;;;;;N;;;;;
+10A83;OLD NORTH ARABIAN LETTER MEEM;Lo;0;R;;;;;N;;;;;
+10A84;OLD NORTH ARABIAN LETTER QAF;Lo;0;R;;;;;N;;;;;
+10A85;OLD NORTH ARABIAN LETTER WAW;Lo;0;R;;;;;N;;;;;
+10A86;OLD NORTH ARABIAN LETTER ES-2;Lo;0;R;;;;;N;;;;;
+10A87;OLD NORTH ARABIAN LETTER REH;Lo;0;R;;;;;N;;;;;
+10A88;OLD NORTH ARABIAN LETTER BEH;Lo;0;R;;;;;N;;;;;
+10A89;OLD NORTH ARABIAN LETTER TEH;Lo;0;R;;;;;N;;;;;
+10A8A;OLD NORTH ARABIAN LETTER ES-1;Lo;0;R;;;;;N;;;;;
+10A8B;OLD NORTH ARABIAN LETTER KAF;Lo;0;R;;;;;N;;;;;
+10A8C;OLD NORTH ARABIAN LETTER NOON;Lo;0;R;;;;;N;;;;;
+10A8D;OLD NORTH ARABIAN LETTER KHAH;Lo;0;R;;;;;N;;;;;
+10A8E;OLD NORTH ARABIAN LETTER SAD;Lo;0;R;;;;;N;;;;;
+10A8F;OLD NORTH ARABIAN LETTER ES-3;Lo;0;R;;;;;N;;;;;
+10A90;OLD NORTH ARABIAN LETTER FEH;Lo;0;R;;;;;N;;;;;
+10A91;OLD NORTH ARABIAN LETTER ALEF;Lo;0;R;;;;;N;;;;;
+10A92;OLD NORTH ARABIAN LETTER AIN;Lo;0;R;;;;;N;;;;;
+10A93;OLD NORTH ARABIAN LETTER DAD;Lo;0;R;;;;;N;;;;;
+10A94;OLD NORTH ARABIAN LETTER GEEM;Lo;0;R;;;;;N;;;;;
+10A95;OLD NORTH ARABIAN LETTER DAL;Lo;0;R;;;;;N;;;;;
+10A96;OLD NORTH ARABIAN LETTER GHAIN;Lo;0;R;;;;;N;;;;;
+10A97;OLD NORTH ARABIAN LETTER TAH;Lo;0;R;;;;;N;;;;;
+10A98;OLD NORTH ARABIAN LETTER ZAIN;Lo;0;R;;;;;N;;;;;
+10A99;OLD NORTH ARABIAN LETTER THAL;Lo;0;R;;;;;N;;;;;
+10A9A;OLD NORTH ARABIAN LETTER YEH;Lo;0;R;;;;;N;;;;;
+10A9B;OLD NORTH ARABIAN LETTER THEH;Lo;0;R;;;;;N;;;;;
+10A9C;OLD NORTH ARABIAN LETTER ZAH;Lo;0;R;;;;;N;;;;;
+10A9D;OLD NORTH ARABIAN NUMBER ONE;No;0;R;;;;1;N;;;;;
+10A9E;OLD NORTH ARABIAN NUMBER TEN;No;0;R;;;;10;N;;;;;
+10A9F;OLD NORTH ARABIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10AC0;MANICHAEAN LETTER ALEPH;Lo;0;R;;;;;N;;;;;
+10AC1;MANICHAEAN LETTER BETH;Lo;0;R;;;;;N;;;;;
+10AC2;MANICHAEAN LETTER BHETH;Lo;0;R;;;;;N;;;;;
+10AC3;MANICHAEAN LETTER GIMEL;Lo;0;R;;;;;N;;;;;
+10AC4;MANICHAEAN LETTER GHIMEL;Lo;0;R;;;;;N;;;;;
+10AC5;MANICHAEAN LETTER DALETH;Lo;0;R;;;;;N;;;;;
+10AC6;MANICHAEAN LETTER HE;Lo;0;R;;;;;N;;;;;
+10AC7;MANICHAEAN LETTER WAW;Lo;0;R;;;;;N;;;;;
+10AC8;MANICHAEAN SIGN UD;So;0;R;;;;;N;;;;;
+10AC9;MANICHAEAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;;
+10ACA;MANICHAEAN LETTER ZHAYIN;Lo;0;R;;;;;N;;;;;
+10ACB;MANICHAEAN LETTER JAYIN;Lo;0;R;;;;;N;;;;;
+10ACC;MANICHAEAN LETTER JHAYIN;Lo;0;R;;;;;N;;;;;
+10ACD;MANICHAEAN LETTER HETH;Lo;0;R;;;;;N;;;;;
+10ACE;MANICHAEAN LETTER TETH;Lo;0;R;;;;;N;;;;;
+10ACF;MANICHAEAN LETTER YODH;Lo;0;R;;;;;N;;;;;
+10AD0;MANICHAEAN LETTER KAPH;Lo;0;R;;;;;N;;;;;
+10AD1;MANICHAEAN LETTER XAPH;Lo;0;R;;;;;N;;;;;
+10AD2;MANICHAEAN LETTER KHAPH;Lo;0;R;;;;;N;;;;;
+10AD3;MANICHAEAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;;
+10AD4;MANICHAEAN LETTER DHAMEDH;Lo;0;R;;;;;N;;;;;
+10AD5;MANICHAEAN LETTER THAMEDH;Lo;0;R;;;;;N;;;;;
+10AD6;MANICHAEAN LETTER MEM;Lo;0;R;;;;;N;;;;;
+10AD7;MANICHAEAN LETTER NUN;Lo;0;R;;;;;N;;;;;
+10AD8;MANICHAEAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;;
+10AD9;MANICHAEAN LETTER AYIN;Lo;0;R;;;;;N;;;;;
+10ADA;MANICHAEAN LETTER AAYIN;Lo;0;R;;;;;N;;;;;
+10ADB;MANICHAEAN LETTER PE;Lo;0;R;;;;;N;;;;;
+10ADC;MANICHAEAN LETTER FE;Lo;0;R;;;;;N;;;;;
+10ADD;MANICHAEAN LETTER SADHE;Lo;0;R;;;;;N;;;;;
+10ADE;MANICHAEAN LETTER QOPH;Lo;0;R;;;;;N;;;;;
+10ADF;MANICHAEAN LETTER XOPH;Lo;0;R;;;;;N;;;;;
+10AE0;MANICHAEAN LETTER QHOPH;Lo;0;R;;;;;N;;;;;
+10AE1;MANICHAEAN LETTER RESH;Lo;0;R;;;;;N;;;;;
+10AE2;MANICHAEAN LETTER SHIN;Lo;0;R;;;;;N;;;;;
+10AE3;MANICHAEAN LETTER SSHIN;Lo;0;R;;;;;N;;;;;
+10AE4;MANICHAEAN LETTER TAW;Lo;0;R;;;;;N;;;;;
+10AE5;MANICHAEAN ABBREVIATION MARK ABOVE;Mn;230;NSM;;;;;N;;;;;
+10AE6;MANICHAEAN ABBREVIATION MARK BELOW;Mn;220;NSM;;;;;N;;;;;
+10AEB;MANICHAEAN NUMBER ONE;No;0;R;;;;1;N;;;;;
+10AEC;MANICHAEAN NUMBER FIVE;No;0;R;;;;5;N;;;;;
+10AED;MANICHAEAN NUMBER TEN;No;0;R;;;;10;N;;;;;
+10AEE;MANICHAEAN NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10AEF;MANICHAEAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+10AF0;MANICHAEAN PUNCTUATION STAR;Po;0;R;;;;;N;;;;;
+10AF1;MANICHAEAN PUNCTUATION FLEURON;Po;0;R;;;;;N;;;;;
+10AF2;MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT;Po;0;R;;;;;N;;;;;
+10AF3;MANICHAEAN PUNCTUATION DOT WITHIN DOT;Po;0;R;;;;;N;;;;;
+10AF4;MANICHAEAN PUNCTUATION DOT;Po;0;R;;;;;N;;;;;
+10AF5;MANICHAEAN PUNCTUATION TWO DOTS;Po;0;R;;;;;N;;;;;
+10AF6;MANICHAEAN PUNCTUATION LINE FILLER;Po;0;R;;;;;N;;;;;
+10B00;AVESTAN LETTER A;Lo;0;R;;;;;N;;;;;
+10B01;AVESTAN LETTER AA;Lo;0;R;;;;;N;;;;;
+10B02;AVESTAN LETTER AO;Lo;0;R;;;;;N;;;;;
+10B03;AVESTAN LETTER AAO;Lo;0;R;;;;;N;;;;;
+10B04;AVESTAN LETTER AN;Lo;0;R;;;;;N;;;;;
+10B05;AVESTAN LETTER AAN;Lo;0;R;;;;;N;;;;;
+10B06;AVESTAN LETTER AE;Lo;0;R;;;;;N;;;;;
+10B07;AVESTAN LETTER AEE;Lo;0;R;;;;;N;;;;;
+10B08;AVESTAN LETTER E;Lo;0;R;;;;;N;;;;;
+10B09;AVESTAN LETTER EE;Lo;0;R;;;;;N;;;;;
+10B0A;AVESTAN LETTER O;Lo;0;R;;;;;N;;;;;
+10B0B;AVESTAN LETTER OO;Lo;0;R;;;;;N;;;;;
+10B0C;AVESTAN LETTER I;Lo;0;R;;;;;N;;;;;
+10B0D;AVESTAN LETTER II;Lo;0;R;;;;;N;;;;;
+10B0E;AVESTAN LETTER U;Lo;0;R;;;;;N;;;;;
+10B0F;AVESTAN LETTER UU;Lo;0;R;;;;;N;;;;;
+10B10;AVESTAN LETTER KE;Lo;0;R;;;;;N;;;;;
+10B11;AVESTAN LETTER XE;Lo;0;R;;;;;N;;;;;
+10B12;AVESTAN LETTER XYE;Lo;0;R;;;;;N;;;;;
+10B13;AVESTAN LETTER XVE;Lo;0;R;;;;;N;;;;;
+10B14;AVESTAN LETTER GE;Lo;0;R;;;;;N;;;;;
+10B15;AVESTAN LETTER GGE;Lo;0;R;;;;;N;;;;;
+10B16;AVESTAN LETTER GHE;Lo;0;R;;;;;N;;;;;
+10B17;AVESTAN LETTER CE;Lo;0;R;;;;;N;;;;;
+10B18;AVESTAN LETTER JE;Lo;0;R;;;;;N;;;;;
+10B19;AVESTAN LETTER TE;Lo;0;R;;;;;N;;;;;
+10B1A;AVESTAN LETTER THE;Lo;0;R;;;;;N;;;;;
+10B1B;AVESTAN LETTER DE;Lo;0;R;;;;;N;;;;;
+10B1C;AVESTAN LETTER DHE;Lo;0;R;;;;;N;;;;;
+10B1D;AVESTAN LETTER TTE;Lo;0;R;;;;;N;;;;;
+10B1E;AVESTAN LETTER PE;Lo;0;R;;;;;N;;;;;
+10B1F;AVESTAN LETTER FE;Lo;0;R;;;;;N;;;;;
+10B20;AVESTAN LETTER BE;Lo;0;R;;;;;N;;;;;
+10B21;AVESTAN LETTER BHE;Lo;0;R;;;;;N;;;;;
+10B22;AVESTAN LETTER NGE;Lo;0;R;;;;;N;;;;;
+10B23;AVESTAN LETTER NGYE;Lo;0;R;;;;;N;;;;;
+10B24;AVESTAN LETTER NGVE;Lo;0;R;;;;;N;;;;;
+10B25;AVESTAN LETTER NE;Lo;0;R;;;;;N;;;;;
+10B26;AVESTAN LETTER NYE;Lo;0;R;;;;;N;;;;;
+10B27;AVESTAN LETTER NNE;Lo;0;R;;;;;N;;;;;
+10B28;AVESTAN LETTER ME;Lo;0;R;;;;;N;;;;;
+10B29;AVESTAN LETTER HME;Lo;0;R;;;;;N;;;;;
+10B2A;AVESTAN LETTER YYE;Lo;0;R;;;;;N;;;;;
+10B2B;AVESTAN LETTER YE;Lo;0;R;;;;;N;;;;;
+10B2C;AVESTAN LETTER VE;Lo;0;R;;;;;N;;;;;
+10B2D;AVESTAN LETTER RE;Lo;0;R;;;;;N;;;;;
+10B2E;AVESTAN LETTER LE;Lo;0;R;;;;;N;;;;;
+10B2F;AVESTAN LETTER SE;Lo;0;R;;;;;N;;;;;
+10B30;AVESTAN LETTER ZE;Lo;0;R;;;;;N;;;;;
+10B31;AVESTAN LETTER SHE;Lo;0;R;;;;;N;;;;;
+10B32;AVESTAN LETTER ZHE;Lo;0;R;;;;;N;;;;;
+10B33;AVESTAN LETTER SHYE;Lo;0;R;;;;;N;;;;;
+10B34;AVESTAN LETTER SSHE;Lo;0;R;;;;;N;;;;;
+10B35;AVESTAN LETTER HE;Lo;0;R;;;;;N;;;;;
+10B39;AVESTAN ABBREVIATION MARK;Po;0;ON;;;;;N;;;;;
+10B3A;TINY TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+10B3B;SMALL TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+10B3C;LARGE TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+10B3D;LARGE ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;;
+10B3E;LARGE TWO RINGS OVER ONE RING PUNCTUATION;Po;0;ON;;;;;N;;;;;
+10B3F;LARGE ONE RING OVER TWO RINGS PUNCTUATION;Po;0;ON;;;;;N;;;;;
+10B40;INSCRIPTIONAL PARTHIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;;
+10B41;INSCRIPTIONAL PARTHIAN LETTER BETH;Lo;0;R;;;;;N;;;;;
+10B42;INSCRIPTIONAL PARTHIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;;
+10B43;INSCRIPTIONAL PARTHIAN LETTER DALETH;Lo;0;R;;;;;N;;;;;
+10B44;INSCRIPTIONAL PARTHIAN LETTER HE;Lo;0;R;;;;;N;;;;;
+10B45;INSCRIPTIONAL PARTHIAN LETTER WAW;Lo;0;R;;;;;N;;;;;
+10B46;INSCRIPTIONAL PARTHIAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;;
+10B47;INSCRIPTIONAL PARTHIAN LETTER HETH;Lo;0;R;;;;;N;;;;;
+10B48;INSCRIPTIONAL PARTHIAN LETTER TETH;Lo;0;R;;;;;N;;;;;
+10B49;INSCRIPTIONAL PARTHIAN LETTER YODH;Lo;0;R;;;;;N;;;;;
+10B4A;INSCRIPTIONAL PARTHIAN LETTER KAPH;Lo;0;R;;;;;N;;;;;
+10B4B;INSCRIPTIONAL PARTHIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;;
+10B4C;INSCRIPTIONAL PARTHIAN LETTER MEM;Lo;0;R;;;;;N;;;;;
+10B4D;INSCRIPTIONAL PARTHIAN LETTER NUN;Lo;0;R;;;;;N;;;;;
+10B4E;INSCRIPTIONAL PARTHIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;;
+10B4F;INSCRIPTIONAL PARTHIAN LETTER AYIN;Lo;0;R;;;;;N;;;;;
+10B50;INSCRIPTIONAL PARTHIAN LETTER PE;Lo;0;R;;;;;N;;;;;
+10B51;INSCRIPTIONAL PARTHIAN LETTER SADHE;Lo;0;R;;;;;N;;;;;
+10B52;INSCRIPTIONAL PARTHIAN LETTER QOPH;Lo;0;R;;;;;N;;;;;
+10B53;INSCRIPTIONAL PARTHIAN LETTER RESH;Lo;0;R;;;;;N;;;;;
+10B54;INSCRIPTIONAL PARTHIAN LETTER SHIN;Lo;0;R;;;;;N;;;;;
+10B55;INSCRIPTIONAL PARTHIAN LETTER TAW;Lo;0;R;;;;;N;;;;;
+10B58;INSCRIPTIONAL PARTHIAN NUMBER ONE;No;0;R;;;;1;N;;;;;
+10B59;INSCRIPTIONAL PARTHIAN NUMBER TWO;No;0;R;;;;2;N;;;;;
+10B5A;INSCRIPTIONAL PARTHIAN NUMBER THREE;No;0;R;;;;3;N;;;;;
+10B5B;INSCRIPTIONAL PARTHIAN NUMBER FOUR;No;0;R;;;;4;N;;;;;
+10B5C;INSCRIPTIONAL PARTHIAN NUMBER TEN;No;0;R;;;;10;N;;;;;
+10B5D;INSCRIPTIONAL PARTHIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10B5E;INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+10B5F;INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;;
+10B60;INSCRIPTIONAL PAHLAVI LETTER ALEPH;Lo;0;R;;;;;N;;;;;
+10B61;INSCRIPTIONAL PAHLAVI LETTER BETH;Lo;0;R;;;;;N;;;;;
+10B62;INSCRIPTIONAL PAHLAVI LETTER GIMEL;Lo;0;R;;;;;N;;;;;
+10B63;INSCRIPTIONAL PAHLAVI LETTER DALETH;Lo;0;R;;;;;N;;;;;
+10B64;INSCRIPTIONAL PAHLAVI LETTER HE;Lo;0;R;;;;;N;;;;;
+10B65;INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH;Lo;0;R;;;;;N;;;;;
+10B66;INSCRIPTIONAL PAHLAVI LETTER ZAYIN;Lo;0;R;;;;;N;;;;;
+10B67;INSCRIPTIONAL PAHLAVI LETTER HETH;Lo;0;R;;;;;N;;;;;
+10B68;INSCRIPTIONAL PAHLAVI LETTER TETH;Lo;0;R;;;;;N;;;;;
+10B69;INSCRIPTIONAL PAHLAVI LETTER YODH;Lo;0;R;;;;;N;;;;;
+10B6A;INSCRIPTIONAL PAHLAVI LETTER KAPH;Lo;0;R;;;;;N;;;;;
+10B6B;INSCRIPTIONAL PAHLAVI LETTER LAMEDH;Lo;0;R;;;;;N;;;;;
+10B6C;INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH;Lo;0;R;;;;;N;;;;;
+10B6D;INSCRIPTIONAL PAHLAVI LETTER NUN;Lo;0;R;;;;;N;;;;;
+10B6E;INSCRIPTIONAL PAHLAVI LETTER SAMEKH;Lo;0;R;;;;;N;;;;;
+10B6F;INSCRIPTIONAL PAHLAVI LETTER PE;Lo;0;R;;;;;N;;;;;
+10B70;INSCRIPTIONAL PAHLAVI LETTER SADHE;Lo;0;R;;;;;N;;;;;
+10B71;INSCRIPTIONAL PAHLAVI LETTER SHIN;Lo;0;R;;;;;N;;;;;
+10B72;INSCRIPTIONAL PAHLAVI LETTER TAW;Lo;0;R;;;;;N;;;;;
+10B78;INSCRIPTIONAL PAHLAVI NUMBER ONE;No;0;R;;;;1;N;;;;;
+10B79;INSCRIPTIONAL PAHLAVI NUMBER TWO;No;0;R;;;;2;N;;;;;
+10B7A;INSCRIPTIONAL PAHLAVI NUMBER THREE;No;0;R;;;;3;N;;;;;
+10B7B;INSCRIPTIONAL PAHLAVI NUMBER FOUR;No;0;R;;;;4;N;;;;;
+10B7C;INSCRIPTIONAL PAHLAVI NUMBER TEN;No;0;R;;;;10;N;;;;;
+10B7D;INSCRIPTIONAL PAHLAVI NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10B7E;INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+10B7F;INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;;
+10B80;PSALTER PAHLAVI LETTER ALEPH;Lo;0;R;;;;;N;;;;;
+10B81;PSALTER PAHLAVI LETTER BETH;Lo;0;R;;;;;N;;;;;
+10B82;PSALTER PAHLAVI LETTER GIMEL;Lo;0;R;;;;;N;;;;;
+10B83;PSALTER PAHLAVI LETTER DALETH;Lo;0;R;;;;;N;;;;;
+10B84;PSALTER PAHLAVI LETTER HE;Lo;0;R;;;;;N;;;;;
+10B85;PSALTER PAHLAVI LETTER WAW-AYIN-RESH;Lo;0;R;;;;;N;;;;;
+10B86;PSALTER PAHLAVI LETTER ZAYIN;Lo;0;R;;;;;N;;;;;
+10B87;PSALTER PAHLAVI LETTER HETH;Lo;0;R;;;;;N;;;;;
+10B88;PSALTER PAHLAVI LETTER YODH;Lo;0;R;;;;;N;;;;;
+10B89;PSALTER PAHLAVI LETTER KAPH;Lo;0;R;;;;;N;;;;;
+10B8A;PSALTER PAHLAVI LETTER LAMEDH;Lo;0;R;;;;;N;;;;;
+10B8B;PSALTER PAHLAVI LETTER MEM-QOPH;Lo;0;R;;;;;N;;;;;
+10B8C;PSALTER PAHLAVI LETTER NUN;Lo;0;R;;;;;N;;;;;
+10B8D;PSALTER PAHLAVI LETTER SAMEKH;Lo;0;R;;;;;N;;;;;
+10B8E;PSALTER PAHLAVI LETTER PE;Lo;0;R;;;;;N;;;;;
+10B8F;PSALTER PAHLAVI LETTER SADHE;Lo;0;R;;;;;N;;;;;
+10B90;PSALTER PAHLAVI LETTER SHIN;Lo;0;R;;;;;N;;;;;
+10B91;PSALTER PAHLAVI LETTER TAW;Lo;0;R;;;;;N;;;;;
+10B99;PSALTER PAHLAVI SECTION MARK;Po;0;R;;;;;N;;;;;
+10B9A;PSALTER PAHLAVI TURNED SECTION MARK;Po;0;R;;;;;N;;;;;
+10B9B;PSALTER PAHLAVI FOUR DOTS WITH CROSS;Po;0;R;;;;;N;;;;;
+10B9C;PSALTER PAHLAVI FOUR DOTS WITH DOT;Po;0;R;;;;;N;;;;;
+10BA9;PSALTER PAHLAVI NUMBER ONE;No;0;R;;;;1;N;;;;;
+10BAA;PSALTER PAHLAVI NUMBER TWO;No;0;R;;;;2;N;;;;;
+10BAB;PSALTER PAHLAVI NUMBER THREE;No;0;R;;;;3;N;;;;;
+10BAC;PSALTER PAHLAVI NUMBER FOUR;No;0;R;;;;4;N;;;;;
+10BAD;PSALTER PAHLAVI NUMBER TEN;No;0;R;;;;10;N;;;;;
+10BAE;PSALTER PAHLAVI NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10BAF;PSALTER PAHLAVI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+10C00;OLD TURKIC LETTER ORKHON A;Lo;0;R;;;;;N;;;;;
+10C01;OLD TURKIC LETTER YENISEI A;Lo;0;R;;;;;N;;;;;
+10C02;OLD TURKIC LETTER YENISEI AE;Lo;0;R;;;;;N;;;;;
+10C03;OLD TURKIC LETTER ORKHON I;Lo;0;R;;;;;N;;;;;
+10C04;OLD TURKIC LETTER YENISEI I;Lo;0;R;;;;;N;;;;;
+10C05;OLD TURKIC LETTER YENISEI E;Lo;0;R;;;;;N;;;;;
+10C06;OLD TURKIC LETTER ORKHON O;Lo;0;R;;;;;N;;;;;
+10C07;OLD TURKIC LETTER ORKHON OE;Lo;0;R;;;;;N;;;;;
+10C08;OLD TURKIC LETTER YENISEI OE;Lo;0;R;;;;;N;;;;;
+10C09;OLD TURKIC LETTER ORKHON AB;Lo;0;R;;;;;N;;;;;
+10C0A;OLD TURKIC LETTER YENISEI AB;Lo;0;R;;;;;N;;;;;
+10C0B;OLD TURKIC LETTER ORKHON AEB;Lo;0;R;;;;;N;;;;;
+10C0C;OLD TURKIC LETTER YENISEI AEB;Lo;0;R;;;;;N;;;;;
+10C0D;OLD TURKIC LETTER ORKHON AG;Lo;0;R;;;;;N;;;;;
+10C0E;OLD TURKIC LETTER YENISEI AG;Lo;0;R;;;;;N;;;;;
+10C0F;OLD TURKIC LETTER ORKHON AEG;Lo;0;R;;;;;N;;;;;
+10C10;OLD TURKIC LETTER YENISEI AEG;Lo;0;R;;;;;N;;;;;
+10C11;OLD TURKIC LETTER ORKHON AD;Lo;0;R;;;;;N;;;;;
+10C12;OLD TURKIC LETTER YENISEI AD;Lo;0;R;;;;;N;;;;;
+10C13;OLD TURKIC LETTER ORKHON AED;Lo;0;R;;;;;N;;;;;
+10C14;OLD TURKIC LETTER ORKHON EZ;Lo;0;R;;;;;N;;;;;
+10C15;OLD TURKIC LETTER YENISEI EZ;Lo;0;R;;;;;N;;;;;
+10C16;OLD TURKIC LETTER ORKHON AY;Lo;0;R;;;;;N;;;;;
+10C17;OLD TURKIC LETTER YENISEI AY;Lo;0;R;;;;;N;;;;;
+10C18;OLD TURKIC LETTER ORKHON AEY;Lo;0;R;;;;;N;;;;;
+10C19;OLD TURKIC LETTER YENISEI AEY;Lo;0;R;;;;;N;;;;;
+10C1A;OLD TURKIC LETTER ORKHON AEK;Lo;0;R;;;;;N;;;;;
+10C1B;OLD TURKIC LETTER YENISEI AEK;Lo;0;R;;;;;N;;;;;
+10C1C;OLD TURKIC LETTER ORKHON OEK;Lo;0;R;;;;;N;;;;;
+10C1D;OLD TURKIC LETTER YENISEI OEK;Lo;0;R;;;;;N;;;;;
+10C1E;OLD TURKIC LETTER ORKHON AL;Lo;0;R;;;;;N;;;;;
+10C1F;OLD TURKIC LETTER YENISEI AL;Lo;0;R;;;;;N;;;;;
+10C20;OLD TURKIC LETTER ORKHON AEL;Lo;0;R;;;;;N;;;;;
+10C21;OLD TURKIC LETTER ORKHON ELT;Lo;0;R;;;;;N;;;;;
+10C22;OLD TURKIC LETTER ORKHON EM;Lo;0;R;;;;;N;;;;;
+10C23;OLD TURKIC LETTER ORKHON AN;Lo;0;R;;;;;N;;;;;
+10C24;OLD TURKIC LETTER ORKHON AEN;Lo;0;R;;;;;N;;;;;
+10C25;OLD TURKIC LETTER YENISEI AEN;Lo;0;R;;;;;N;;;;;
+10C26;OLD TURKIC LETTER ORKHON ENT;Lo;0;R;;;;;N;;;;;
+10C27;OLD TURKIC LETTER YENISEI ENT;Lo;0;R;;;;;N;;;;;
+10C28;OLD TURKIC LETTER ORKHON ENC;Lo;0;R;;;;;N;;;;;
+10C29;OLD TURKIC LETTER YENISEI ENC;Lo;0;R;;;;;N;;;;;
+10C2A;OLD TURKIC LETTER ORKHON ENY;Lo;0;R;;;;;N;;;;;
+10C2B;OLD TURKIC LETTER YENISEI ENY;Lo;0;R;;;;;N;;;;;
+10C2C;OLD TURKIC LETTER YENISEI ANG;Lo;0;R;;;;;N;;;;;
+10C2D;OLD TURKIC LETTER ORKHON ENG;Lo;0;R;;;;;N;;;;;
+10C2E;OLD TURKIC LETTER YENISEI AENG;Lo;0;R;;;;;N;;;;;
+10C2F;OLD TURKIC LETTER ORKHON EP;Lo;0;R;;;;;N;;;;;
+10C30;OLD TURKIC LETTER ORKHON OP;Lo;0;R;;;;;N;;;;;
+10C31;OLD TURKIC LETTER ORKHON IC;Lo;0;R;;;;;N;;;;;
+10C32;OLD TURKIC LETTER ORKHON EC;Lo;0;R;;;;;N;;;;;
+10C33;OLD TURKIC LETTER YENISEI EC;Lo;0;R;;;;;N;;;;;
+10C34;OLD TURKIC LETTER ORKHON AQ;Lo;0;R;;;;;N;;;;;
+10C35;OLD TURKIC LETTER YENISEI AQ;Lo;0;R;;;;;N;;;;;
+10C36;OLD TURKIC LETTER ORKHON IQ;Lo;0;R;;;;;N;;;;;
+10C37;OLD TURKIC LETTER YENISEI IQ;Lo;0;R;;;;;N;;;;;
+10C38;OLD TURKIC LETTER ORKHON OQ;Lo;0;R;;;;;N;;;;;
+10C39;OLD TURKIC LETTER YENISEI OQ;Lo;0;R;;;;;N;;;;;
+10C3A;OLD TURKIC LETTER ORKHON AR;Lo;0;R;;;;;N;;;;;
+10C3B;OLD TURKIC LETTER YENISEI AR;Lo;0;R;;;;;N;;;;;
+10C3C;OLD TURKIC LETTER ORKHON AER;Lo;0;R;;;;;N;;;;;
+10C3D;OLD TURKIC LETTER ORKHON AS;Lo;0;R;;;;;N;;;;;
+10C3E;OLD TURKIC LETTER ORKHON AES;Lo;0;R;;;;;N;;;;;
+10C3F;OLD TURKIC LETTER ORKHON ASH;Lo;0;R;;;;;N;;;;;
+10C40;OLD TURKIC LETTER YENISEI ASH;Lo;0;R;;;;;N;;;;;
+10C41;OLD TURKIC LETTER ORKHON ESH;Lo;0;R;;;;;N;;;;;
+10C42;OLD TURKIC LETTER YENISEI ESH;Lo;0;R;;;;;N;;;;;
+10C43;OLD TURKIC LETTER ORKHON AT;Lo;0;R;;;;;N;;;;;
+10C44;OLD TURKIC LETTER YENISEI AT;Lo;0;R;;;;;N;;;;;
+10C45;OLD TURKIC LETTER ORKHON AET;Lo;0;R;;;;;N;;;;;
+10C46;OLD TURKIC LETTER YENISEI AET;Lo;0;R;;;;;N;;;;;
+10C47;OLD TURKIC LETTER ORKHON OT;Lo;0;R;;;;;N;;;;;
+10C48;OLD TURKIC LETTER ORKHON BASH;Lo;0;R;;;;;N;;;;;
+10C80;OLD HUNGARIAN CAPITAL LETTER A;Lu;0;R;;;;;N;;;;10CC0;
+10C81;OLD HUNGARIAN CAPITAL LETTER AA;Lu;0;R;;;;;N;;;;10CC1;
+10C82;OLD HUNGARIAN CAPITAL LETTER EB;Lu;0;R;;;;;N;;;;10CC2;
+10C83;OLD HUNGARIAN CAPITAL LETTER AMB;Lu;0;R;;;;;N;;;;10CC3;
+10C84;OLD HUNGARIAN CAPITAL LETTER EC;Lu;0;R;;;;;N;;;;10CC4;
+10C85;OLD HUNGARIAN CAPITAL LETTER ENC;Lu;0;R;;;;;N;;;;10CC5;
+10C86;OLD HUNGARIAN CAPITAL LETTER ECS;Lu;0;R;;;;;N;;;;10CC6;
+10C87;OLD HUNGARIAN CAPITAL LETTER ED;Lu;0;R;;;;;N;;;;10CC7;
+10C88;OLD HUNGARIAN CAPITAL LETTER AND;Lu;0;R;;;;;N;;;;10CC8;
+10C89;OLD HUNGARIAN CAPITAL LETTER E;Lu;0;R;;;;;N;;;;10CC9;
+10C8A;OLD HUNGARIAN CAPITAL LETTER CLOSE E;Lu;0;R;;;;;N;;;;10CCA;
+10C8B;OLD HUNGARIAN CAPITAL LETTER EE;Lu;0;R;;;;;N;;;;10CCB;
+10C8C;OLD HUNGARIAN CAPITAL LETTER EF;Lu;0;R;;;;;N;;;;10CCC;
+10C8D;OLD HUNGARIAN CAPITAL LETTER EG;Lu;0;R;;;;;N;;;;10CCD;
+10C8E;OLD HUNGARIAN CAPITAL LETTER EGY;Lu;0;R;;;;;N;;;;10CCE;
+10C8F;OLD HUNGARIAN CAPITAL LETTER EH;Lu;0;R;;;;;N;;;;10CCF;
+10C90;OLD HUNGARIAN CAPITAL LETTER I;Lu;0;R;;;;;N;;;;10CD0;
+10C91;OLD HUNGARIAN CAPITAL LETTER II;Lu;0;R;;;;;N;;;;10CD1;
+10C92;OLD HUNGARIAN CAPITAL LETTER EJ;Lu;0;R;;;;;N;;;;10CD2;
+10C93;OLD HUNGARIAN CAPITAL LETTER EK;Lu;0;R;;;;;N;;;;10CD3;
+10C94;OLD HUNGARIAN CAPITAL LETTER AK;Lu;0;R;;;;;N;;;;10CD4;
+10C95;OLD HUNGARIAN CAPITAL LETTER UNK;Lu;0;R;;;;;N;;;;10CD5;
+10C96;OLD HUNGARIAN CAPITAL LETTER EL;Lu;0;R;;;;;N;;;;10CD6;
+10C97;OLD HUNGARIAN CAPITAL LETTER ELY;Lu;0;R;;;;;N;;;;10CD7;
+10C98;OLD HUNGARIAN CAPITAL LETTER EM;Lu;0;R;;;;;N;;;;10CD8;
+10C99;OLD HUNGARIAN CAPITAL LETTER EN;Lu;0;R;;;;;N;;;;10CD9;
+10C9A;OLD HUNGARIAN CAPITAL LETTER ENY;Lu;0;R;;;;;N;;;;10CDA;
+10C9B;OLD HUNGARIAN CAPITAL LETTER O;Lu;0;R;;;;;N;;;;10CDB;
+10C9C;OLD HUNGARIAN CAPITAL LETTER OO;Lu;0;R;;;;;N;;;;10CDC;
+10C9D;OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE;Lu;0;R;;;;;N;;;;10CDD;
+10C9E;OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE;Lu;0;R;;;;;N;;;;10CDE;
+10C9F;OLD HUNGARIAN CAPITAL LETTER OEE;Lu;0;R;;;;;N;;;;10CDF;
+10CA0;OLD HUNGARIAN CAPITAL LETTER EP;Lu;0;R;;;;;N;;;;10CE0;
+10CA1;OLD HUNGARIAN CAPITAL LETTER EMP;Lu;0;R;;;;;N;;;;10CE1;
+10CA2;OLD HUNGARIAN CAPITAL LETTER ER;Lu;0;R;;;;;N;;;;10CE2;
+10CA3;OLD HUNGARIAN CAPITAL LETTER SHORT ER;Lu;0;R;;;;;N;;;;10CE3;
+10CA4;OLD HUNGARIAN CAPITAL LETTER ES;Lu;0;R;;;;;N;;;;10CE4;
+10CA5;OLD HUNGARIAN CAPITAL LETTER ESZ;Lu;0;R;;;;;N;;;;10CE5;
+10CA6;OLD HUNGARIAN CAPITAL LETTER ET;Lu;0;R;;;;;N;;;;10CE6;
+10CA7;OLD HUNGARIAN CAPITAL LETTER ENT;Lu;0;R;;;;;N;;;;10CE7;
+10CA8;OLD HUNGARIAN CAPITAL LETTER ETY;Lu;0;R;;;;;N;;;;10CE8;
+10CA9;OLD HUNGARIAN CAPITAL LETTER ECH;Lu;0;R;;;;;N;;;;10CE9;
+10CAA;OLD HUNGARIAN CAPITAL LETTER U;Lu;0;R;;;;;N;;;;10CEA;
+10CAB;OLD HUNGARIAN CAPITAL LETTER UU;Lu;0;R;;;;;N;;;;10CEB;
+10CAC;OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE;Lu;0;R;;;;;N;;;;10CEC;
+10CAD;OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE;Lu;0;R;;;;;N;;;;10CED;
+10CAE;OLD HUNGARIAN CAPITAL LETTER EV;Lu;0;R;;;;;N;;;;10CEE;
+10CAF;OLD HUNGARIAN CAPITAL LETTER EZ;Lu;0;R;;;;;N;;;;10CEF;
+10CB0;OLD HUNGARIAN CAPITAL LETTER EZS;Lu;0;R;;;;;N;;;;10CF0;
+10CB1;OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN;Lu;0;R;;;;;N;;;;10CF1;
+10CB2;OLD HUNGARIAN CAPITAL LETTER US;Lu;0;R;;;;;N;;;;10CF2;
+10CC0;OLD HUNGARIAN SMALL LETTER A;Ll;0;R;;;;;N;;;10C80;;10C80
+10CC1;OLD HUNGARIAN SMALL LETTER AA;Ll;0;R;;;;;N;;;10C81;;10C81
+10CC2;OLD HUNGARIAN SMALL LETTER EB;Ll;0;R;;;;;N;;;10C82;;10C82
+10CC3;OLD HUNGARIAN SMALL LETTER AMB;Ll;0;R;;;;;N;;;10C83;;10C83
+10CC4;OLD HUNGARIAN SMALL LETTER EC;Ll;0;R;;;;;N;;;10C84;;10C84
+10CC5;OLD HUNGARIAN SMALL LETTER ENC;Ll;0;R;;;;;N;;;10C85;;10C85
+10CC6;OLD HUNGARIAN SMALL LETTER ECS;Ll;0;R;;;;;N;;;10C86;;10C86
+10CC7;OLD HUNGARIAN SMALL LETTER ED;Ll;0;R;;;;;N;;;10C87;;10C87
+10CC8;OLD HUNGARIAN SMALL LETTER AND;Ll;0;R;;;;;N;;;10C88;;10C88
+10CC9;OLD HUNGARIAN SMALL LETTER E;Ll;0;R;;;;;N;;;10C89;;10C89
+10CCA;OLD HUNGARIAN SMALL LETTER CLOSE E;Ll;0;R;;;;;N;;;10C8A;;10C8A
+10CCB;OLD HUNGARIAN SMALL LETTER EE;Ll;0;R;;;;;N;;;10C8B;;10C8B
+10CCC;OLD HUNGARIAN SMALL LETTER EF;Ll;0;R;;;;;N;;;10C8C;;10C8C
+10CCD;OLD HUNGARIAN SMALL LETTER EG;Ll;0;R;;;;;N;;;10C8D;;10C8D
+10CCE;OLD HUNGARIAN SMALL LETTER EGY;Ll;0;R;;;;;N;;;10C8E;;10C8E
+10CCF;OLD HUNGARIAN SMALL LETTER EH;Ll;0;R;;;;;N;;;10C8F;;10C8F
+10CD0;OLD HUNGARIAN SMALL LETTER I;Ll;0;R;;;;;N;;;10C90;;10C90
+10CD1;OLD HUNGARIAN SMALL LETTER II;Ll;0;R;;;;;N;;;10C91;;10C91
+10CD2;OLD HUNGARIAN SMALL LETTER EJ;Ll;0;R;;;;;N;;;10C92;;10C92
+10CD3;OLD HUNGARIAN SMALL LETTER EK;Ll;0;R;;;;;N;;;10C93;;10C93
+10CD4;OLD HUNGARIAN SMALL LETTER AK;Ll;0;R;;;;;N;;;10C94;;10C94
+10CD5;OLD HUNGARIAN SMALL LETTER UNK;Ll;0;R;;;;;N;;;10C95;;10C95
+10CD6;OLD HUNGARIAN SMALL LETTER EL;Ll;0;R;;;;;N;;;10C96;;10C96
+10CD7;OLD HUNGARIAN SMALL LETTER ELY;Ll;0;R;;;;;N;;;10C97;;10C97
+10CD8;OLD HUNGARIAN SMALL LETTER EM;Ll;0;R;;;;;N;;;10C98;;10C98
+10CD9;OLD HUNGARIAN SMALL LETTER EN;Ll;0;R;;;;;N;;;10C99;;10C99
+10CDA;OLD HUNGARIAN SMALL LETTER ENY;Ll;0;R;;;;;N;;;10C9A;;10C9A
+10CDB;OLD HUNGARIAN SMALL LETTER O;Ll;0;R;;;;;N;;;10C9B;;10C9B
+10CDC;OLD HUNGARIAN SMALL LETTER OO;Ll;0;R;;;;;N;;;10C9C;;10C9C
+10CDD;OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE;Ll;0;R;;;;;N;;;10C9D;;10C9D
+10CDE;OLD HUNGARIAN SMALL LETTER RUDIMENTA OE;Ll;0;R;;;;;N;;;10C9E;;10C9E
+10CDF;OLD HUNGARIAN SMALL LETTER OEE;Ll;0;R;;;;;N;;;10C9F;;10C9F
+10CE0;OLD HUNGARIAN SMALL LETTER EP;Ll;0;R;;;;;N;;;10CA0;;10CA0
+10CE1;OLD HUNGARIAN SMALL LETTER EMP;Ll;0;R;;;;;N;;;10CA1;;10CA1
+10CE2;OLD HUNGARIAN SMALL LETTER ER;Ll;0;R;;;;;N;;;10CA2;;10CA2
+10CE3;OLD HUNGARIAN SMALL LETTER SHORT ER;Ll;0;R;;;;;N;;;10CA3;;10CA3
+10CE4;OLD HUNGARIAN SMALL LETTER ES;Ll;0;R;;;;;N;;;10CA4;;10CA4
+10CE5;OLD HUNGARIAN SMALL LETTER ESZ;Ll;0;R;;;;;N;;;10CA5;;10CA5
+10CE6;OLD HUNGARIAN SMALL LETTER ET;Ll;0;R;;;;;N;;;10CA6;;10CA6
+10CE7;OLD HUNGARIAN SMALL LETTER ENT;Ll;0;R;;;;;N;;;10CA7;;10CA7
+10CE8;OLD HUNGARIAN SMALL LETTER ETY;Ll;0;R;;;;;N;;;10CA8;;10CA8
+10CE9;OLD HUNGARIAN SMALL LETTER ECH;Ll;0;R;;;;;N;;;10CA9;;10CA9
+10CEA;OLD HUNGARIAN SMALL LETTER U;Ll;0;R;;;;;N;;;10CAA;;10CAA
+10CEB;OLD HUNGARIAN SMALL LETTER UU;Ll;0;R;;;;;N;;;10CAB;;10CAB
+10CEC;OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE;Ll;0;R;;;;;N;;;10CAC;;10CAC
+10CED;OLD HUNGARIAN SMALL LETTER RUDIMENTA UE;Ll;0;R;;;;;N;;;10CAD;;10CAD
+10CEE;OLD HUNGARIAN SMALL LETTER EV;Ll;0;R;;;;;N;;;10CAE;;10CAE
+10CEF;OLD HUNGARIAN SMALL LETTER EZ;Ll;0;R;;;;;N;;;10CAF;;10CAF
+10CF0;OLD HUNGARIAN SMALL LETTER EZS;Ll;0;R;;;;;N;;;10CB0;;10CB0
+10CF1;OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN;Ll;0;R;;;;;N;;;10CB1;;10CB1
+10CF2;OLD HUNGARIAN SMALL LETTER US;Ll;0;R;;;;;N;;;10CB2;;10CB2
+10CFA;OLD HUNGARIAN NUMBER ONE;No;0;R;;;;1;N;;;;;
+10CFB;OLD HUNGARIAN NUMBER FIVE;No;0;R;;;;5;N;;;;;
+10CFC;OLD HUNGARIAN NUMBER TEN;No;0;R;;;;10;N;;;;;
+10CFD;OLD HUNGARIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;;
+10CFE;OLD HUNGARIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+10CFF;OLD HUNGARIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;;
+10E60;RUMI DIGIT ONE;No;0;AN;;;1;1;N;;;;;
+10E61;RUMI DIGIT TWO;No;0;AN;;;2;2;N;;;;;
+10E62;RUMI DIGIT THREE;No;0;AN;;;3;3;N;;;;;
+10E63;RUMI DIGIT FOUR;No;0;AN;;;4;4;N;;;;;
+10E64;RUMI DIGIT FIVE;No;0;AN;;;5;5;N;;;;;
+10E65;RUMI DIGIT SIX;No;0;AN;;;6;6;N;;;;;
+10E66;RUMI DIGIT SEVEN;No;0;AN;;;7;7;N;;;;;
+10E67;RUMI DIGIT EIGHT;No;0;AN;;;8;8;N;;;;;
+10E68;RUMI DIGIT NINE;No;0;AN;;;9;9;N;;;;;
+10E69;RUMI NUMBER TEN;No;0;AN;;;;10;N;;;;;
+10E6A;RUMI NUMBER TWENTY;No;0;AN;;;;20;N;;;;;
+10E6B;RUMI NUMBER THIRTY;No;0;AN;;;;30;N;;;;;
+10E6C;RUMI NUMBER FORTY;No;0;AN;;;;40;N;;;;;
+10E6D;RUMI NUMBER FIFTY;No;0;AN;;;;50;N;;;;;
+10E6E;RUMI NUMBER SIXTY;No;0;AN;;;;60;N;;;;;
+10E6F;RUMI NUMBER SEVENTY;No;0;AN;;;;70;N;;;;;
+10E70;RUMI NUMBER EIGHTY;No;0;AN;;;;80;N;;;;;
+10E71;RUMI NUMBER NINETY;No;0;AN;;;;90;N;;;;;
+10E72;RUMI NUMBER ONE HUNDRED;No;0;AN;;;;100;N;;;;;
+10E73;RUMI NUMBER TWO HUNDRED;No;0;AN;;;;200;N;;;;;
+10E74;RUMI NUMBER THREE HUNDRED;No;0;AN;;;;300;N;;;;;
+10E75;RUMI NUMBER FOUR HUNDRED;No;0;AN;;;;400;N;;;;;
+10E76;RUMI NUMBER FIVE HUNDRED;No;0;AN;;;;500;N;;;;;
+10E77;RUMI NUMBER SIX HUNDRED;No;0;AN;;;;600;N;;;;;
+10E78;RUMI NUMBER SEVEN HUNDRED;No;0;AN;;;;700;N;;;;;
+10E79;RUMI NUMBER EIGHT HUNDRED;No;0;AN;;;;800;N;;;;;
+10E7A;RUMI NUMBER NINE HUNDRED;No;0;AN;;;;900;N;;;;;
+10E7B;RUMI FRACTION ONE HALF;No;0;AN;;;;1/2;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;;;;;
+11000;BRAHMI SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;;
+11001;BRAHMI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+11002;BRAHMI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+11003;BRAHMI SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;;
+11004;BRAHMI SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;;
+11005;BRAHMI LETTER A;Lo;0;L;;;;;N;;;;;
+11006;BRAHMI LETTER AA;Lo;0;L;;;;;N;;;;;
+11007;BRAHMI LETTER I;Lo;0;L;;;;;N;;;;;
+11008;BRAHMI LETTER II;Lo;0;L;;;;;N;;;;;
+11009;BRAHMI LETTER U;Lo;0;L;;;;;N;;;;;
+1100A;BRAHMI LETTER UU;Lo;0;L;;;;;N;;;;;
+1100B;BRAHMI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+1100C;BRAHMI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+1100D;BRAHMI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+1100E;BRAHMI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+1100F;BRAHMI LETTER E;Lo;0;L;;;;;N;;;;;
+11010;BRAHMI LETTER AI;Lo;0;L;;;;;N;;;;;
+11011;BRAHMI LETTER O;Lo;0;L;;;;;N;;;;;
+11012;BRAHMI LETTER AU;Lo;0;L;;;;;N;;;;;
+11013;BRAHMI LETTER KA;Lo;0;L;;;;;N;;;;;
+11014;BRAHMI LETTER KHA;Lo;0;L;;;;;N;;;;;
+11015;BRAHMI LETTER GA;Lo;0;L;;;;;N;;;;;
+11016;BRAHMI LETTER GHA;Lo;0;L;;;;;N;;;;;
+11017;BRAHMI LETTER NGA;Lo;0;L;;;;;N;;;;;
+11018;BRAHMI LETTER CA;Lo;0;L;;;;;N;;;;;
+11019;BRAHMI LETTER CHA;Lo;0;L;;;;;N;;;;;
+1101A;BRAHMI LETTER JA;Lo;0;L;;;;;N;;;;;
+1101B;BRAHMI LETTER JHA;Lo;0;L;;;;;N;;;;;
+1101C;BRAHMI LETTER NYA;Lo;0;L;;;;;N;;;;;
+1101D;BRAHMI LETTER TTA;Lo;0;L;;;;;N;;;;;
+1101E;BRAHMI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+1101F;BRAHMI LETTER DDA;Lo;0;L;;;;;N;;;;;
+11020;BRAHMI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+11021;BRAHMI LETTER NNA;Lo;0;L;;;;;N;;;;;
+11022;BRAHMI LETTER TA;Lo;0;L;;;;;N;;;;;
+11023;BRAHMI LETTER THA;Lo;0;L;;;;;N;;;;;
+11024;BRAHMI LETTER DA;Lo;0;L;;;;;N;;;;;
+11025;BRAHMI LETTER DHA;Lo;0;L;;;;;N;;;;;
+11026;BRAHMI LETTER NA;Lo;0;L;;;;;N;;;;;
+11027;BRAHMI LETTER PA;Lo;0;L;;;;;N;;;;;
+11028;BRAHMI LETTER PHA;Lo;0;L;;;;;N;;;;;
+11029;BRAHMI LETTER BA;Lo;0;L;;;;;N;;;;;
+1102A;BRAHMI LETTER BHA;Lo;0;L;;;;;N;;;;;
+1102B;BRAHMI LETTER MA;Lo;0;L;;;;;N;;;;;
+1102C;BRAHMI LETTER YA;Lo;0;L;;;;;N;;;;;
+1102D;BRAHMI LETTER RA;Lo;0;L;;;;;N;;;;;
+1102E;BRAHMI LETTER LA;Lo;0;L;;;;;N;;;;;
+1102F;BRAHMI LETTER VA;Lo;0;L;;;;;N;;;;;
+11030;BRAHMI LETTER SHA;Lo;0;L;;;;;N;;;;;
+11031;BRAHMI LETTER SSA;Lo;0;L;;;;;N;;;;;
+11032;BRAHMI LETTER SA;Lo;0;L;;;;;N;;;;;
+11033;BRAHMI LETTER HA;Lo;0;L;;;;;N;;;;;
+11034;BRAHMI LETTER LLA;Lo;0;L;;;;;N;;;;;
+11035;BRAHMI LETTER OLD TAMIL LLLA;Lo;0;L;;;;;N;;;;;
+11036;BRAHMI LETTER OLD TAMIL RRA;Lo;0;L;;;;;N;;;;;
+11037;BRAHMI LETTER OLD TAMIL NNNA;Lo;0;L;;;;;N;;;;;
+11038;BRAHMI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;;
+11039;BRAHMI VOWEL SIGN BHATTIPROLU AA;Mn;0;NSM;;;;;N;;;;;
+1103A;BRAHMI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1103B;BRAHMI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+1103C;BRAHMI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1103D;BRAHMI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+1103E;BRAHMI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+1103F;BRAHMI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+11040;BRAHMI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+11041;BRAHMI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+11042;BRAHMI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+11043;BRAHMI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+11044;BRAHMI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+11045;BRAHMI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+11046;BRAHMI VIRAMA;Mn;9;NSM;;;;;N;;;;;
+11047;BRAHMI DANDA;Po;0;L;;;;;N;;;;;
+11048;BRAHMI DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+11049;BRAHMI PUNCTUATION DOT;Po;0;L;;;;;N;;;;;
+1104A;BRAHMI PUNCTUATION DOUBLE DOT;Po;0;L;;;;;N;;;;;
+1104B;BRAHMI PUNCTUATION LINE;Po;0;L;;;;;N;;;;;
+1104C;BRAHMI PUNCTUATION CRESCENT BAR;Po;0;L;;;;;N;;;;;
+1104D;BRAHMI PUNCTUATION LOTUS;Po;0;L;;;;;N;;;;;
+11052;BRAHMI NUMBER ONE;No;0;ON;;;1;1;N;;;;;
+11053;BRAHMI NUMBER TWO;No;0;ON;;;2;2;N;;;;;
+11054;BRAHMI NUMBER THREE;No;0;ON;;;3;3;N;;;;;
+11055;BRAHMI NUMBER FOUR;No;0;ON;;;4;4;N;;;;;
+11056;BRAHMI NUMBER FIVE;No;0;ON;;;5;5;N;;;;;
+11057;BRAHMI NUMBER SIX;No;0;ON;;;6;6;N;;;;;
+11058;BRAHMI NUMBER SEVEN;No;0;ON;;;7;7;N;;;;;
+11059;BRAHMI NUMBER EIGHT;No;0;ON;;;8;8;N;;;;;
+1105A;BRAHMI NUMBER NINE;No;0;ON;;;9;9;N;;;;;
+1105B;BRAHMI NUMBER TEN;No;0;ON;;;;10;N;;;;;
+1105C;BRAHMI NUMBER TWENTY;No;0;ON;;;;20;N;;;;;
+1105D;BRAHMI NUMBER THIRTY;No;0;ON;;;;30;N;;;;;
+1105E;BRAHMI NUMBER FORTY;No;0;ON;;;;40;N;;;;;
+1105F;BRAHMI NUMBER FIFTY;No;0;ON;;;;50;N;;;;;
+11060;BRAHMI NUMBER SIXTY;No;0;ON;;;;60;N;;;;;
+11061;BRAHMI NUMBER SEVENTY;No;0;ON;;;;70;N;;;;;
+11062;BRAHMI NUMBER EIGHTY;No;0;ON;;;;80;N;;;;;
+11063;BRAHMI NUMBER NINETY;No;0;ON;;;;90;N;;;;;
+11064;BRAHMI NUMBER ONE HUNDRED;No;0;ON;;;;100;N;;;;;
+11065;BRAHMI NUMBER ONE THOUSAND;No;0;ON;;;;1000;N;;;;;
+11066;BRAHMI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+11067;BRAHMI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+11068;BRAHMI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+11069;BRAHMI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1106A;BRAHMI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1106B;BRAHMI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1106C;BRAHMI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1106D;BRAHMI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1106E;BRAHMI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1106F;BRAHMI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1107F;BRAHMI NUMBER JOINER;Mn;9;NSM;;;;;N;;;;;
+11080;KAITHI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+11081;KAITHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+11082;KAITHI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+11083;KAITHI LETTER A;Lo;0;L;;;;;N;;;;;
+11084;KAITHI LETTER AA;Lo;0;L;;;;;N;;;;;
+11085;KAITHI LETTER I;Lo;0;L;;;;;N;;;;;
+11086;KAITHI LETTER II;Lo;0;L;;;;;N;;;;;
+11087;KAITHI LETTER U;Lo;0;L;;;;;N;;;;;
+11088;KAITHI LETTER UU;Lo;0;L;;;;;N;;;;;
+11089;KAITHI LETTER E;Lo;0;L;;;;;N;;;;;
+1108A;KAITHI LETTER AI;Lo;0;L;;;;;N;;;;;
+1108B;KAITHI LETTER O;Lo;0;L;;;;;N;;;;;
+1108C;KAITHI LETTER AU;Lo;0;L;;;;;N;;;;;
+1108D;KAITHI LETTER KA;Lo;0;L;;;;;N;;;;;
+1108E;KAITHI LETTER KHA;Lo;0;L;;;;;N;;;;;
+1108F;KAITHI LETTER GA;Lo;0;L;;;;;N;;;;;
+11090;KAITHI LETTER GHA;Lo;0;L;;;;;N;;;;;
+11091;KAITHI LETTER NGA;Lo;0;L;;;;;N;;;;;
+11092;KAITHI LETTER CA;Lo;0;L;;;;;N;;;;;
+11093;KAITHI LETTER CHA;Lo;0;L;;;;;N;;;;;
+11094;KAITHI LETTER JA;Lo;0;L;;;;;N;;;;;
+11095;KAITHI LETTER JHA;Lo;0;L;;;;;N;;;;;
+11096;KAITHI LETTER NYA;Lo;0;L;;;;;N;;;;;
+11097;KAITHI LETTER TTA;Lo;0;L;;;;;N;;;;;
+11098;KAITHI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+11099;KAITHI LETTER DDA;Lo;0;L;;;;;N;;;;;
+1109A;KAITHI LETTER DDDHA;Lo;0;L;11099 110BA;;;;N;;;;;
+1109B;KAITHI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+1109C;KAITHI LETTER RHA;Lo;0;L;1109B 110BA;;;;N;;;;;
+1109D;KAITHI LETTER NNA;Lo;0;L;;;;;N;;;;;
+1109E;KAITHI LETTER TA;Lo;0;L;;;;;N;;;;;
+1109F;KAITHI LETTER THA;Lo;0;L;;;;;N;;;;;
+110A0;KAITHI LETTER DA;Lo;0;L;;;;;N;;;;;
+110A1;KAITHI LETTER DHA;Lo;0;L;;;;;N;;;;;
+110A2;KAITHI LETTER NA;Lo;0;L;;;;;N;;;;;
+110A3;KAITHI LETTER PA;Lo;0;L;;;;;N;;;;;
+110A4;KAITHI LETTER PHA;Lo;0;L;;;;;N;;;;;
+110A5;KAITHI LETTER BA;Lo;0;L;;;;;N;;;;;
+110A6;KAITHI LETTER BHA;Lo;0;L;;;;;N;;;;;
+110A7;KAITHI LETTER MA;Lo;0;L;;;;;N;;;;;
+110A8;KAITHI LETTER YA;Lo;0;L;;;;;N;;;;;
+110A9;KAITHI LETTER RA;Lo;0;L;;;;;N;;;;;
+110AA;KAITHI LETTER LA;Lo;0;L;;;;;N;;;;;
+110AB;KAITHI LETTER VA;Lo;0;L;110A5 110BA;;;;N;;;;;
+110AC;KAITHI LETTER SHA;Lo;0;L;;;;;N;;;;;
+110AD;KAITHI LETTER SSA;Lo;0;L;;;;;N;;;;;
+110AE;KAITHI LETTER SA;Lo;0;L;;;;;N;;;;;
+110AF;KAITHI LETTER HA;Lo;0;L;;;;;N;;;;;
+110B0;KAITHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+110B1;KAITHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+110B2;KAITHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+110B3;KAITHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+110B4;KAITHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+110B5;KAITHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+110B6;KAITHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+110B7;KAITHI VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+110B8;KAITHI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+110B9;KAITHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+110BA;KAITHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+110BB;KAITHI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
+110BC;KAITHI ENUMERATION SIGN;Po;0;L;;;;;N;;;;;
+110BD;KAITHI NUMBER SIGN;Cf;0;L;;;;;N;;;;;
+110BE;KAITHI SECTION MARK;Po;0;L;;;;;N;;;;;
+110BF;KAITHI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;;
+110C0;KAITHI DANDA;Po;0;L;;;;;N;;;;;
+110C1;KAITHI DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+110D0;SORA SOMPENG LETTER SAH;Lo;0;L;;;;;N;;;;;
+110D1;SORA SOMPENG LETTER TAH;Lo;0;L;;;;;N;;;;;
+110D2;SORA SOMPENG LETTER BAH;Lo;0;L;;;;;N;;;;;
+110D3;SORA SOMPENG LETTER CAH;Lo;0;L;;;;;N;;;;;
+110D4;SORA SOMPENG LETTER DAH;Lo;0;L;;;;;N;;;;;
+110D5;SORA SOMPENG LETTER GAH;Lo;0;L;;;;;N;;;;;
+110D6;SORA SOMPENG LETTER MAH;Lo;0;L;;;;;N;;;;;
+110D7;SORA SOMPENG LETTER NGAH;Lo;0;L;;;;;N;;;;;
+110D8;SORA SOMPENG LETTER LAH;Lo;0;L;;;;;N;;;;;
+110D9;SORA SOMPENG LETTER NAH;Lo;0;L;;;;;N;;;;;
+110DA;SORA SOMPENG LETTER VAH;Lo;0;L;;;;;N;;;;;
+110DB;SORA SOMPENG LETTER PAH;Lo;0;L;;;;;N;;;;;
+110DC;SORA SOMPENG LETTER YAH;Lo;0;L;;;;;N;;;;;
+110DD;SORA SOMPENG LETTER RAH;Lo;0;L;;;;;N;;;;;
+110DE;SORA SOMPENG LETTER HAH;Lo;0;L;;;;;N;;;;;
+110DF;SORA SOMPENG LETTER KAH;Lo;0;L;;;;;N;;;;;
+110E0;SORA SOMPENG LETTER JAH;Lo;0;L;;;;;N;;;;;
+110E1;SORA SOMPENG LETTER NYAH;Lo;0;L;;;;;N;;;;;
+110E2;SORA SOMPENG LETTER AH;Lo;0;L;;;;;N;;;;;
+110E3;SORA SOMPENG LETTER EEH;Lo;0;L;;;;;N;;;;;
+110E4;SORA SOMPENG LETTER IH;Lo;0;L;;;;;N;;;;;
+110E5;SORA SOMPENG LETTER UH;Lo;0;L;;;;;N;;;;;
+110E6;SORA SOMPENG LETTER OH;Lo;0;L;;;;;N;;;;;
+110E7;SORA SOMPENG LETTER EH;Lo;0;L;;;;;N;;;;;
+110E8;SORA SOMPENG LETTER MAE;Lo;0;L;;;;;N;;;;;
+110F0;SORA SOMPENG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+110F1;SORA SOMPENG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+110F2;SORA SOMPENG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+110F3;SORA SOMPENG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+110F4;SORA SOMPENG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+110F5;SORA SOMPENG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+110F6;SORA SOMPENG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+110F7;SORA SOMPENG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+110F8;SORA SOMPENG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+110F9;SORA SOMPENG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+11100;CHAKMA SIGN CANDRABINDU;Mn;230;NSM;;;;;N;;;;;
+11101;CHAKMA SIGN ANUSVARA;Mn;230;NSM;;;;;N;;;;;
+11102;CHAKMA SIGN VISARGA;Mn;230;NSM;;;;;N;;;;;
+11103;CHAKMA LETTER AA;Lo;0;L;;;;;N;;;;;
+11104;CHAKMA LETTER I;Lo;0;L;;;;;N;;;;;
+11105;CHAKMA LETTER U;Lo;0;L;;;;;N;;;;;
+11106;CHAKMA LETTER E;Lo;0;L;;;;;N;;;;;
+11107;CHAKMA LETTER KAA;Lo;0;L;;;;;N;;;;;
+11108;CHAKMA LETTER KHAA;Lo;0;L;;;;;N;;;;;
+11109;CHAKMA LETTER GAA;Lo;0;L;;;;;N;;;;;
+1110A;CHAKMA LETTER GHAA;Lo;0;L;;;;;N;;;;;
+1110B;CHAKMA LETTER NGAA;Lo;0;L;;;;;N;;;;;
+1110C;CHAKMA LETTER CAA;Lo;0;L;;;;;N;;;;;
+1110D;CHAKMA LETTER CHAA;Lo;0;L;;;;;N;;;;;
+1110E;CHAKMA LETTER JAA;Lo;0;L;;;;;N;;;;;
+1110F;CHAKMA LETTER JHAA;Lo;0;L;;;;;N;;;;;
+11110;CHAKMA LETTER NYAA;Lo;0;L;;;;;N;;;;;
+11111;CHAKMA LETTER TTAA;Lo;0;L;;;;;N;;;;;
+11112;CHAKMA LETTER TTHAA;Lo;0;L;;;;;N;;;;;
+11113;CHAKMA LETTER DDAA;Lo;0;L;;;;;N;;;;;
+11114;CHAKMA LETTER DDHAA;Lo;0;L;;;;;N;;;;;
+11115;CHAKMA LETTER NNAA;Lo;0;L;;;;;N;;;;;
+11116;CHAKMA LETTER TAA;Lo;0;L;;;;;N;;;;;
+11117;CHAKMA LETTER THAA;Lo;0;L;;;;;N;;;;;
+11118;CHAKMA LETTER DAA;Lo;0;L;;;;;N;;;;;
+11119;CHAKMA LETTER DHAA;Lo;0;L;;;;;N;;;;;
+1111A;CHAKMA LETTER NAA;Lo;0;L;;;;;N;;;;;
+1111B;CHAKMA LETTER PAA;Lo;0;L;;;;;N;;;;;
+1111C;CHAKMA LETTER PHAA;Lo;0;L;;;;;N;;;;;
+1111D;CHAKMA LETTER BAA;Lo;0;L;;;;;N;;;;;
+1111E;CHAKMA LETTER BHAA;Lo;0;L;;;;;N;;;;;
+1111F;CHAKMA LETTER MAA;Lo;0;L;;;;;N;;;;;
+11120;CHAKMA LETTER YYAA;Lo;0;L;;;;;N;;;;;
+11121;CHAKMA LETTER YAA;Lo;0;L;;;;;N;;;;;
+11122;CHAKMA LETTER RAA;Lo;0;L;;;;;N;;;;;
+11123;CHAKMA LETTER LAA;Lo;0;L;;;;;N;;;;;
+11124;CHAKMA LETTER WAA;Lo;0;L;;;;;N;;;;;
+11125;CHAKMA LETTER SAA;Lo;0;L;;;;;N;;;;;
+11126;CHAKMA LETTER HAA;Lo;0;L;;;;;N;;;;;
+11127;CHAKMA VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;;
+11128;CHAKMA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+11129;CHAKMA VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+1112A;CHAKMA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1112B;CHAKMA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+1112C;CHAKMA VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+1112D;CHAKMA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+1112E;CHAKMA VOWEL SIGN O;Mn;0;NSM;11131 11127;;;;N;;;;;
+1112F;CHAKMA VOWEL SIGN AU;Mn;0;NSM;11132 11127;;;;N;;;;;
+11130;CHAKMA VOWEL SIGN OI;Mn;0;NSM;;;;;N;;;;;
+11131;CHAKMA O MARK;Mn;0;NSM;;;;;N;;;;;
+11132;CHAKMA AU MARK;Mn;0;NSM;;;;;N;;;;;
+11133;CHAKMA VIRAMA;Mn;9;NSM;;;;;N;;;;;
+11134;CHAKMA MAAYYAA;Mn;9;NSM;;;;;N;;;;;
+11136;CHAKMA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+11137;CHAKMA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+11138;CHAKMA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+11139;CHAKMA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1113A;CHAKMA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1113B;CHAKMA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1113C;CHAKMA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1113D;CHAKMA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1113E;CHAKMA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1113F;CHAKMA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+11140;CHAKMA SECTION MARK;Po;0;L;;;;;N;;;;;
+11141;CHAKMA DANDA;Po;0;L;;;;;N;;;;;
+11142;CHAKMA DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+11143;CHAKMA QUESTION MARK;Po;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;;;;;
+11153;MAHAJANI LETTER E;Lo;0;L;;;;;N;;;;;
+11154;MAHAJANI LETTER O;Lo;0;L;;;;;N;;;;;
+11155;MAHAJANI LETTER KA;Lo;0;L;;;;;N;;;;;
+11156;MAHAJANI LETTER KHA;Lo;0;L;;;;;N;;;;;
+11157;MAHAJANI LETTER GA;Lo;0;L;;;;;N;;;;;
+11158;MAHAJANI LETTER GHA;Lo;0;L;;;;;N;;;;;
+11159;MAHAJANI LETTER CA;Lo;0;L;;;;;N;;;;;
+1115A;MAHAJANI LETTER CHA;Lo;0;L;;;;;N;;;;;
+1115B;MAHAJANI LETTER JA;Lo;0;L;;;;;N;;;;;
+1115C;MAHAJANI LETTER JHA;Lo;0;L;;;;;N;;;;;
+1115D;MAHAJANI LETTER NYA;Lo;0;L;;;;;N;;;;;
+1115E;MAHAJANI LETTER TTA;Lo;0;L;;;;;N;;;;;
+1115F;MAHAJANI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+11160;MAHAJANI LETTER DDA;Lo;0;L;;;;;N;;;;;
+11161;MAHAJANI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+11162;MAHAJANI LETTER NNA;Lo;0;L;;;;;N;;;;;
+11163;MAHAJANI LETTER TA;Lo;0;L;;;;;N;;;;;
+11164;MAHAJANI LETTER THA;Lo;0;L;;;;;N;;;;;
+11165;MAHAJANI LETTER DA;Lo;0;L;;;;;N;;;;;
+11166;MAHAJANI LETTER DHA;Lo;0;L;;;;;N;;;;;
+11167;MAHAJANI LETTER NA;Lo;0;L;;;;;N;;;;;
+11168;MAHAJANI LETTER PA;Lo;0;L;;;;;N;;;;;
+11169;MAHAJANI LETTER PHA;Lo;0;L;;;;;N;;;;;
+1116A;MAHAJANI LETTER BA;Lo;0;L;;;;;N;;;;;
+1116B;MAHAJANI LETTER BHA;Lo;0;L;;;;;N;;;;;
+1116C;MAHAJANI LETTER MA;Lo;0;L;;;;;N;;;;;
+1116D;MAHAJANI LETTER RA;Lo;0;L;;;;;N;;;;;
+1116E;MAHAJANI LETTER LA;Lo;0;L;;;;;N;;;;;
+1116F;MAHAJANI LETTER VA;Lo;0;L;;;;;N;;;;;
+11170;MAHAJANI LETTER SA;Lo;0;L;;;;;N;;;;;
+11171;MAHAJANI LETTER HA;Lo;0;L;;;;;N;;;;;
+11172;MAHAJANI LETTER RRA;Lo;0;L;;;;;N;;;;;
+11173;MAHAJANI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+11174;MAHAJANI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
+11175;MAHAJANI SECTION MARK;Po;0;L;;;;;N;;;;;
+11176;MAHAJANI LIGATURE SHRI;Lo;0;L;;;;;N;;;;;
+11180;SHARADA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+11181;SHARADA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+11182;SHARADA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+11183;SHARADA LETTER A;Lo;0;L;;;;;N;;;;;
+11184;SHARADA LETTER AA;Lo;0;L;;;;;N;;;;;
+11185;SHARADA LETTER I;Lo;0;L;;;;;N;;;;;
+11186;SHARADA LETTER II;Lo;0;L;;;;;N;;;;;
+11187;SHARADA LETTER U;Lo;0;L;;;;;N;;;;;
+11188;SHARADA LETTER UU;Lo;0;L;;;;;N;;;;;
+11189;SHARADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+1118A;SHARADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+1118B;SHARADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+1118C;SHARADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+1118D;SHARADA LETTER E;Lo;0;L;;;;;N;;;;;
+1118E;SHARADA LETTER AI;Lo;0;L;;;;;N;;;;;
+1118F;SHARADA LETTER O;Lo;0;L;;;;;N;;;;;
+11190;SHARADA LETTER AU;Lo;0;L;;;;;N;;;;;
+11191;SHARADA LETTER KA;Lo;0;L;;;;;N;;;;;
+11192;SHARADA LETTER KHA;Lo;0;L;;;;;N;;;;;
+11193;SHARADA LETTER GA;Lo;0;L;;;;;N;;;;;
+11194;SHARADA LETTER GHA;Lo;0;L;;;;;N;;;;;
+11195;SHARADA LETTER NGA;Lo;0;L;;;;;N;;;;;
+11196;SHARADA LETTER CA;Lo;0;L;;;;;N;;;;;
+11197;SHARADA LETTER CHA;Lo;0;L;;;;;N;;;;;
+11198;SHARADA LETTER JA;Lo;0;L;;;;;N;;;;;
+11199;SHARADA LETTER JHA;Lo;0;L;;;;;N;;;;;
+1119A;SHARADA LETTER NYA;Lo;0;L;;;;;N;;;;;
+1119B;SHARADA LETTER TTA;Lo;0;L;;;;;N;;;;;
+1119C;SHARADA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+1119D;SHARADA LETTER DDA;Lo;0;L;;;;;N;;;;;
+1119E;SHARADA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+1119F;SHARADA LETTER NNA;Lo;0;L;;;;;N;;;;;
+111A0;SHARADA LETTER TA;Lo;0;L;;;;;N;;;;;
+111A1;SHARADA LETTER THA;Lo;0;L;;;;;N;;;;;
+111A2;SHARADA LETTER DA;Lo;0;L;;;;;N;;;;;
+111A3;SHARADA LETTER DHA;Lo;0;L;;;;;N;;;;;
+111A4;SHARADA LETTER NA;Lo;0;L;;;;;N;;;;;
+111A5;SHARADA LETTER PA;Lo;0;L;;;;;N;;;;;
+111A6;SHARADA LETTER PHA;Lo;0;L;;;;;N;;;;;
+111A7;SHARADA LETTER BA;Lo;0;L;;;;;N;;;;;
+111A8;SHARADA LETTER BHA;Lo;0;L;;;;;N;;;;;
+111A9;SHARADA LETTER MA;Lo;0;L;;;;;N;;;;;
+111AA;SHARADA LETTER YA;Lo;0;L;;;;;N;;;;;
+111AB;SHARADA LETTER RA;Lo;0;L;;;;;N;;;;;
+111AC;SHARADA LETTER LA;Lo;0;L;;;;;N;;;;;
+111AD;SHARADA LETTER LLA;Lo;0;L;;;;;N;;;;;
+111AE;SHARADA LETTER VA;Lo;0;L;;;;;N;;;;;
+111AF;SHARADA LETTER SHA;Lo;0;L;;;;;N;;;;;
+111B0;SHARADA LETTER SSA;Lo;0;L;;;;;N;;;;;
+111B1;SHARADA LETTER SA;Lo;0;L;;;;;N;;;;;
+111B2;SHARADA LETTER HA;Lo;0;L;;;;;N;;;;;
+111B3;SHARADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+111B4;SHARADA VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+111B5;SHARADA VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+111B6;SHARADA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+111B7;SHARADA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+111B8;SHARADA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+111B9;SHARADA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+111BA;SHARADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+111BB;SHARADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+111BC;SHARADA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+111BD;SHARADA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+111BE;SHARADA VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+111BF;SHARADA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+111C0;SHARADA SIGN VIRAMA;Mc;9;L;;;;;N;;;;;
+111C1;SHARADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+111C2;SHARADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;;
+111C3;SHARADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;;
+111C4;SHARADA OM;Lo;0;L;;;;;N;;;;;
+111C5;SHARADA DANDA;Po;0;L;;;;;N;;;;;
+111C6;SHARADA DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+111C7;SHARADA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
+111C8;SHARADA SEPARATOR;Po;0;L;;;;;N;;;;;
+111C9;SHARADA SANDHI MARK;Po;0;L;;;;;N;;;;;
+111CA;SHARADA SIGN NUKTA;Mn;7;NSM;;;;;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;;;;;
+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;;;;;
+111D3;SHARADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+111D4;SHARADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+111D5;SHARADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+111D6;SHARADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+111D7;SHARADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+111D8;SHARADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+111D9;SHARADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+111DA;SHARADA EKAM;Lo;0;L;;;;;N;;;;;
+111DB;SHARADA SIGN SIDDHAM;Po;0;L;;;;;N;;;;;
+111DC;SHARADA HEADSTROKE;Lo;0;L;;;;;N;;;;;
+111DD;SHARADA CONTINUATION SIGN;Po;0;L;;;;;N;;;;;
+111DE;SHARADA SECTION MARK-1;Po;0;L;;;;;N;;;;;
+111DF;SHARADA SECTION MARK-2;Po;0;L;;;;;N;;;;;
+111E1;SINHALA ARCHAIC DIGIT ONE;No;0;L;;;;1;N;;;;;
+111E2;SINHALA ARCHAIC DIGIT TWO;No;0;L;;;;2;N;;;;;
+111E3;SINHALA ARCHAIC DIGIT THREE;No;0;L;;;;3;N;;;;;
+111E4;SINHALA ARCHAIC DIGIT FOUR;No;0;L;;;;4;N;;;;;
+111E5;SINHALA ARCHAIC DIGIT FIVE;No;0;L;;;;5;N;;;;;
+111E6;SINHALA ARCHAIC DIGIT SIX;No;0;L;;;;6;N;;;;;
+111E7;SINHALA ARCHAIC DIGIT SEVEN;No;0;L;;;;7;N;;;;;
+111E8;SINHALA ARCHAIC DIGIT EIGHT;No;0;L;;;;8;N;;;;;
+111E9;SINHALA ARCHAIC DIGIT NINE;No;0;L;;;;9;N;;;;;
+111EA;SINHALA ARCHAIC NUMBER TEN;No;0;L;;;;10;N;;;;;
+111EB;SINHALA ARCHAIC NUMBER TWENTY;No;0;L;;;;20;N;;;;;
+111EC;SINHALA ARCHAIC NUMBER THIRTY;No;0;L;;;;30;N;;;;;
+111ED;SINHALA ARCHAIC NUMBER FORTY;No;0;L;;;;40;N;;;;;
+111EE;SINHALA ARCHAIC NUMBER FIFTY;No;0;L;;;;50;N;;;;;
+111EF;SINHALA ARCHAIC NUMBER SIXTY;No;0;L;;;;60;N;;;;;
+111F0;SINHALA ARCHAIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;;
+111F1;SINHALA ARCHAIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;;
+111F2;SINHALA ARCHAIC NUMBER NINETY;No;0;L;;;;90;N;;;;;
+111F3;SINHALA ARCHAIC NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;;
+111F4;SINHALA ARCHAIC NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;;
+11200;KHOJKI LETTER A;Lo;0;L;;;;;N;;;;;
+11201;KHOJKI LETTER AA;Lo;0;L;;;;;N;;;;;
+11202;KHOJKI LETTER I;Lo;0;L;;;;;N;;;;;
+11203;KHOJKI LETTER U;Lo;0;L;;;;;N;;;;;
+11204;KHOJKI LETTER E;Lo;0;L;;;;;N;;;;;
+11205;KHOJKI LETTER AI;Lo;0;L;;;;;N;;;;;
+11206;KHOJKI LETTER O;Lo;0;L;;;;;N;;;;;
+11207;KHOJKI LETTER AU;Lo;0;L;;;;;N;;;;;
+11208;KHOJKI LETTER KA;Lo;0;L;;;;;N;;;;;
+11209;KHOJKI LETTER KHA;Lo;0;L;;;;;N;;;;;
+1120A;KHOJKI LETTER GA;Lo;0;L;;;;;N;;;;;
+1120B;KHOJKI LETTER GGA;Lo;0;L;;;;;N;;;;;
+1120C;KHOJKI LETTER GHA;Lo;0;L;;;;;N;;;;;
+1120D;KHOJKI LETTER NGA;Lo;0;L;;;;;N;;;;;
+1120E;KHOJKI LETTER CA;Lo;0;L;;;;;N;;;;;
+1120F;KHOJKI LETTER CHA;Lo;0;L;;;;;N;;;;;
+11210;KHOJKI LETTER JA;Lo;0;L;;;;;N;;;;;
+11211;KHOJKI LETTER JJA;Lo;0;L;;;;;N;;;;;
+11213;KHOJKI LETTER NYA;Lo;0;L;;;;;N;;;;;
+11214;KHOJKI LETTER TTA;Lo;0;L;;;;;N;;;;;
+11215;KHOJKI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+11216;KHOJKI LETTER DDA;Lo;0;L;;;;;N;;;;;
+11217;KHOJKI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+11218;KHOJKI LETTER NNA;Lo;0;L;;;;;N;;;;;
+11219;KHOJKI LETTER TA;Lo;0;L;;;;;N;;;;;
+1121A;KHOJKI LETTER THA;Lo;0;L;;;;;N;;;;;
+1121B;KHOJKI LETTER DA;Lo;0;L;;;;;N;;;;;
+1121C;KHOJKI LETTER DDDA;Lo;0;L;;;;;N;;;;;
+1121D;KHOJKI LETTER DHA;Lo;0;L;;;;;N;;;;;
+1121E;KHOJKI LETTER NA;Lo;0;L;;;;;N;;;;;
+1121F;KHOJKI LETTER PA;Lo;0;L;;;;;N;;;;;
+11220;KHOJKI LETTER PHA;Lo;0;L;;;;;N;;;;;
+11221;KHOJKI LETTER BA;Lo;0;L;;;;;N;;;;;
+11222;KHOJKI LETTER BBA;Lo;0;L;;;;;N;;;;;
+11223;KHOJKI LETTER BHA;Lo;0;L;;;;;N;;;;;
+11224;KHOJKI LETTER MA;Lo;0;L;;;;;N;;;;;
+11225;KHOJKI LETTER YA;Lo;0;L;;;;;N;;;;;
+11226;KHOJKI LETTER RA;Lo;0;L;;;;;N;;;;;
+11227;KHOJKI LETTER LA;Lo;0;L;;;;;N;;;;;
+11228;KHOJKI LETTER VA;Lo;0;L;;;;;N;;;;;
+11229;KHOJKI LETTER SA;Lo;0;L;;;;;N;;;;;
+1122A;KHOJKI LETTER HA;Lo;0;L;;;;;N;;;;;
+1122B;KHOJKI LETTER LLA;Lo;0;L;;;;;N;;;;;
+1122C;KHOJKI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+1122D;KHOJKI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+1122E;KHOJKI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+1122F;KHOJKI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+11230;KHOJKI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+11231;KHOJKI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+11232;KHOJKI VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+11233;KHOJKI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+11234;KHOJKI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+11235;KHOJKI SIGN VIRAMA;Mc;9;L;;;;;N;;;;;
+11236;KHOJKI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+11237;KHOJKI SIGN SHADDA;Mn;0;NSM;;;;;N;;;;;
+11238;KHOJKI DANDA;Po;0;L;;;;;N;;;;;
+11239;KHOJKI DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+1123A;KHOJKI WORD SEPARATOR;Po;0;L;;;;;N;;;;;
+1123B;KHOJKI SECTION MARK;Po;0;L;;;;;N;;;;;
+1123C;KHOJKI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;;
+1123D;KHOJKI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
+1123E;KHOJKI SIGN SUKUN;Mn;0;NSM;;;;;N;;;;;
+11280;MULTANI LETTER A;Lo;0;L;;;;;N;;;;;
+11281;MULTANI LETTER I;Lo;0;L;;;;;N;;;;;
+11282;MULTANI LETTER U;Lo;0;L;;;;;N;;;;;
+11283;MULTANI LETTER E;Lo;0;L;;;;;N;;;;;
+11284;MULTANI LETTER KA;Lo;0;L;;;;;N;;;;;
+11285;MULTANI LETTER KHA;Lo;0;L;;;;;N;;;;;
+11286;MULTANI LETTER GA;Lo;0;L;;;;;N;;;;;
+11288;MULTANI LETTER GHA;Lo;0;L;;;;;N;;;;;
+1128A;MULTANI LETTER CA;Lo;0;L;;;;;N;;;;;
+1128B;MULTANI LETTER CHA;Lo;0;L;;;;;N;;;;;
+1128C;MULTANI LETTER JA;Lo;0;L;;;;;N;;;;;
+1128D;MULTANI LETTER JJA;Lo;0;L;;;;;N;;;;;
+1128F;MULTANI LETTER NYA;Lo;0;L;;;;;N;;;;;
+11290;MULTANI LETTER TTA;Lo;0;L;;;;;N;;;;;
+11291;MULTANI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+11292;MULTANI LETTER DDA;Lo;0;L;;;;;N;;;;;
+11293;MULTANI LETTER DDDA;Lo;0;L;;;;;N;;;;;
+11294;MULTANI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+11295;MULTANI LETTER NNA;Lo;0;L;;;;;N;;;;;
+11296;MULTANI LETTER TA;Lo;0;L;;;;;N;;;;;
+11297;MULTANI LETTER THA;Lo;0;L;;;;;N;;;;;
+11298;MULTANI LETTER DA;Lo;0;L;;;;;N;;;;;
+11299;MULTANI LETTER DHA;Lo;0;L;;;;;N;;;;;
+1129A;MULTANI LETTER NA;Lo;0;L;;;;;N;;;;;
+1129B;MULTANI LETTER PA;Lo;0;L;;;;;N;;;;;
+1129C;MULTANI LETTER PHA;Lo;0;L;;;;;N;;;;;
+1129D;MULTANI LETTER BA;Lo;0;L;;;;;N;;;;;
+1129F;MULTANI LETTER BHA;Lo;0;L;;;;;N;;;;;
+112A0;MULTANI LETTER MA;Lo;0;L;;;;;N;;;;;
+112A1;MULTANI LETTER YA;Lo;0;L;;;;;N;;;;;
+112A2;MULTANI LETTER RA;Lo;0;L;;;;;N;;;;;
+112A3;MULTANI LETTER LA;Lo;0;L;;;;;N;;;;;
+112A4;MULTANI LETTER VA;Lo;0;L;;;;;N;;;;;
+112A5;MULTANI LETTER SA;Lo;0;L;;;;;N;;;;;
+112A6;MULTANI LETTER HA;Lo;0;L;;;;;N;;;;;
+112A7;MULTANI LETTER RRA;Lo;0;L;;;;;N;;;;;
+112A8;MULTANI LETTER RHA;Lo;0;L;;;;;N;;;;;
+112A9;MULTANI SECTION MARK;Po;0;L;;;;;N;;;;;
+112B0;KHUDAWADI LETTER A;Lo;0;L;;;;;N;;;;;
+112B1;KHUDAWADI LETTER AA;Lo;0;L;;;;;N;;;;;
+112B2;KHUDAWADI LETTER I;Lo;0;L;;;;;N;;;;;
+112B3;KHUDAWADI LETTER II;Lo;0;L;;;;;N;;;;;
+112B4;KHUDAWADI LETTER U;Lo;0;L;;;;;N;;;;;
+112B5;KHUDAWADI LETTER UU;Lo;0;L;;;;;N;;;;;
+112B6;KHUDAWADI LETTER E;Lo;0;L;;;;;N;;;;;
+112B7;KHUDAWADI LETTER AI;Lo;0;L;;;;;N;;;;;
+112B8;KHUDAWADI LETTER O;Lo;0;L;;;;;N;;;;;
+112B9;KHUDAWADI LETTER AU;Lo;0;L;;;;;N;;;;;
+112BA;KHUDAWADI LETTER KA;Lo;0;L;;;;;N;;;;;
+112BB;KHUDAWADI LETTER KHA;Lo;0;L;;;;;N;;;;;
+112BC;KHUDAWADI LETTER GA;Lo;0;L;;;;;N;;;;;
+112BD;KHUDAWADI LETTER GGA;Lo;0;L;;;;;N;;;;;
+112BE;KHUDAWADI LETTER GHA;Lo;0;L;;;;;N;;;;;
+112BF;KHUDAWADI LETTER NGA;Lo;0;L;;;;;N;;;;;
+112C0;KHUDAWADI LETTER CA;Lo;0;L;;;;;N;;;;;
+112C1;KHUDAWADI LETTER CHA;Lo;0;L;;;;;N;;;;;
+112C2;KHUDAWADI LETTER JA;Lo;0;L;;;;;N;;;;;
+112C3;KHUDAWADI LETTER JJA;Lo;0;L;;;;;N;;;;;
+112C4;KHUDAWADI LETTER JHA;Lo;0;L;;;;;N;;;;;
+112C5;KHUDAWADI LETTER NYA;Lo;0;L;;;;;N;;;;;
+112C6;KHUDAWADI LETTER TTA;Lo;0;L;;;;;N;;;;;
+112C7;KHUDAWADI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+112C8;KHUDAWADI LETTER DDA;Lo;0;L;;;;;N;;;;;
+112C9;KHUDAWADI LETTER DDDA;Lo;0;L;;;;;N;;;;;
+112CA;KHUDAWADI LETTER RRA;Lo;0;L;;;;;N;;;;;
+112CB;KHUDAWADI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+112CC;KHUDAWADI LETTER NNA;Lo;0;L;;;;;N;;;;;
+112CD;KHUDAWADI LETTER TA;Lo;0;L;;;;;N;;;;;
+112CE;KHUDAWADI LETTER THA;Lo;0;L;;;;;N;;;;;
+112CF;KHUDAWADI LETTER DA;Lo;0;L;;;;;N;;;;;
+112D0;KHUDAWADI LETTER DHA;Lo;0;L;;;;;N;;;;;
+112D1;KHUDAWADI LETTER NA;Lo;0;L;;;;;N;;;;;
+112D2;KHUDAWADI LETTER PA;Lo;0;L;;;;;N;;;;;
+112D3;KHUDAWADI LETTER PHA;Lo;0;L;;;;;N;;;;;
+112D4;KHUDAWADI LETTER BA;Lo;0;L;;;;;N;;;;;
+112D5;KHUDAWADI LETTER BBA;Lo;0;L;;;;;N;;;;;
+112D6;KHUDAWADI LETTER BHA;Lo;0;L;;;;;N;;;;;
+112D7;KHUDAWADI LETTER MA;Lo;0;L;;;;;N;;;;;
+112D8;KHUDAWADI LETTER YA;Lo;0;L;;;;;N;;;;;
+112D9;KHUDAWADI LETTER RA;Lo;0;L;;;;;N;;;;;
+112DA;KHUDAWADI LETTER LA;Lo;0;L;;;;;N;;;;;
+112DB;KHUDAWADI LETTER VA;Lo;0;L;;;;;N;;;;;
+112DC;KHUDAWADI LETTER SHA;Lo;0;L;;;;;N;;;;;
+112DD;KHUDAWADI LETTER SA;Lo;0;L;;;;;N;;;;;
+112DE;KHUDAWADI LETTER HA;Lo;0;L;;;;;N;;;;;
+112DF;KHUDAWADI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+112E0;KHUDAWADI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+112E1;KHUDAWADI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+112E2;KHUDAWADI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+112E3;KHUDAWADI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+112E4;KHUDAWADI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+112E5;KHUDAWADI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+112E6;KHUDAWADI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+112E7;KHUDAWADI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+112E8;KHUDAWADI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+112E9;KHUDAWADI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+112EA;KHUDAWADI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+112F0;KHUDAWADI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+112F1;KHUDAWADI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+112F2;KHUDAWADI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+112F3;KHUDAWADI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+112F4;KHUDAWADI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+112F5;KHUDAWADI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+112F6;KHUDAWADI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+112F7;KHUDAWADI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+112F8;KHUDAWADI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+112F9;KHUDAWADI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+11300;GRANTHA SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;;
+11301;GRANTHA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+11302;GRANTHA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+11303;GRANTHA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+11305;GRANTHA LETTER A;Lo;0;L;;;;;N;;;;;
+11306;GRANTHA LETTER AA;Lo;0;L;;;;;N;;;;;
+11307;GRANTHA LETTER I;Lo;0;L;;;;;N;;;;;
+11308;GRANTHA LETTER II;Lo;0;L;;;;;N;;;;;
+11309;GRANTHA LETTER U;Lo;0;L;;;;;N;;;;;
+1130A;GRANTHA LETTER UU;Lo;0;L;;;;;N;;;;;
+1130B;GRANTHA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+1130C;GRANTHA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+1130F;GRANTHA LETTER EE;Lo;0;L;;;;;N;;;;;
+11310;GRANTHA LETTER AI;Lo;0;L;;;;;N;;;;;
+11313;GRANTHA LETTER OO;Lo;0;L;;;;;N;;;;;
+11314;GRANTHA LETTER AU;Lo;0;L;;;;;N;;;;;
+11315;GRANTHA LETTER KA;Lo;0;L;;;;;N;;;;;
+11316;GRANTHA LETTER KHA;Lo;0;L;;;;;N;;;;;
+11317;GRANTHA LETTER GA;Lo;0;L;;;;;N;;;;;
+11318;GRANTHA LETTER GHA;Lo;0;L;;;;;N;;;;;
+11319;GRANTHA LETTER NGA;Lo;0;L;;;;;N;;;;;
+1131A;GRANTHA LETTER CA;Lo;0;L;;;;;N;;;;;
+1131B;GRANTHA LETTER CHA;Lo;0;L;;;;;N;;;;;
+1131C;GRANTHA LETTER JA;Lo;0;L;;;;;N;;;;;
+1131D;GRANTHA LETTER JHA;Lo;0;L;;;;;N;;;;;
+1131E;GRANTHA LETTER NYA;Lo;0;L;;;;;N;;;;;
+1131F;GRANTHA LETTER TTA;Lo;0;L;;;;;N;;;;;
+11320;GRANTHA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+11321;GRANTHA LETTER DDA;Lo;0;L;;;;;N;;;;;
+11322;GRANTHA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+11323;GRANTHA LETTER NNA;Lo;0;L;;;;;N;;;;;
+11324;GRANTHA LETTER TA;Lo;0;L;;;;;N;;;;;
+11325;GRANTHA LETTER THA;Lo;0;L;;;;;N;;;;;
+11326;GRANTHA LETTER DA;Lo;0;L;;;;;N;;;;;
+11327;GRANTHA LETTER DHA;Lo;0;L;;;;;N;;;;;
+11328;GRANTHA LETTER NA;Lo;0;L;;;;;N;;;;;
+1132A;GRANTHA LETTER PA;Lo;0;L;;;;;N;;;;;
+1132B;GRANTHA LETTER PHA;Lo;0;L;;;;;N;;;;;
+1132C;GRANTHA LETTER BA;Lo;0;L;;;;;N;;;;;
+1132D;GRANTHA LETTER BHA;Lo;0;L;;;;;N;;;;;
+1132E;GRANTHA LETTER MA;Lo;0;L;;;;;N;;;;;
+1132F;GRANTHA LETTER YA;Lo;0;L;;;;;N;;;;;
+11330;GRANTHA LETTER RA;Lo;0;L;;;;;N;;;;;
+11332;GRANTHA LETTER LA;Lo;0;L;;;;;N;;;;;
+11333;GRANTHA LETTER LLA;Lo;0;L;;;;;N;;;;;
+11335;GRANTHA LETTER VA;Lo;0;L;;;;;N;;;;;
+11336;GRANTHA LETTER SHA;Lo;0;L;;;;;N;;;;;
+11337;GRANTHA LETTER SSA;Lo;0;L;;;;;N;;;;;
+11338;GRANTHA LETTER SA;Lo;0;L;;;;;N;;;;;
+11339;GRANTHA LETTER HA;Lo;0;L;;;;;N;;;;;
+1133C;GRANTHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+1133D;GRANTHA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+1133E;GRANTHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+1133F;GRANTHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+11340;GRANTHA VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+11341;GRANTHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+11342;GRANTHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+11343;GRANTHA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+11344;GRANTHA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+11347;GRANTHA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+11348;GRANTHA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+1134B;GRANTHA VOWEL SIGN OO;Mc;0;L;11347 1133E;;;;N;;;;;
+1134C;GRANTHA VOWEL SIGN AU;Mc;0;L;11347 11357;;;;N;;;;;
+1134D;GRANTHA SIGN VIRAMA;Mc;9;L;;;;;N;;;;;
+11350;GRANTHA OM;Lo;0;L;;;;;N;;;;;
+11357;GRANTHA AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+1135D;GRANTHA SIGN PLUTA;Lo;0;L;;;;;N;;;;;
+1135E;GRANTHA LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;;
+1135F;GRANTHA LETTER VEDIC DOUBLE ANUSVARA;Lo;0;L;;;;;N;;;;;
+11360;GRANTHA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+11361;GRANTHA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+11362;GRANTHA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;;
+11363;GRANTHA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;;
+11366;COMBINING GRANTHA DIGIT ZERO;Mn;230;NSM;;;;;N;;;;;
+11367;COMBINING GRANTHA DIGIT ONE;Mn;230;NSM;;;;;N;;;;;
+11368;COMBINING GRANTHA DIGIT TWO;Mn;230;NSM;;;;;N;;;;;
+11369;COMBINING GRANTHA DIGIT THREE;Mn;230;NSM;;;;;N;;;;;
+1136A;COMBINING GRANTHA DIGIT FOUR;Mn;230;NSM;;;;;N;;;;;
+1136B;COMBINING GRANTHA DIGIT FIVE;Mn;230;NSM;;;;;N;;;;;
+1136C;COMBINING GRANTHA DIGIT SIX;Mn;230;NSM;;;;;N;;;;;
+11370;COMBINING GRANTHA LETTER A;Mn;230;NSM;;;;;N;;;;;
+11371;COMBINING GRANTHA LETTER KA;Mn;230;NSM;;;;;N;;;;;
+11372;COMBINING GRANTHA LETTER NA;Mn;230;NSM;;;;;N;;;;;
+11373;COMBINING GRANTHA LETTER VI;Mn;230;NSM;;;;;N;;;;;
+11374;COMBINING GRANTHA LETTER PA;Mn;230;NSM;;;;;N;;;;;
+11400;NEWA LETTER A;Lo;0;L;;;;;N;;;;;
+11401;NEWA LETTER AA;Lo;0;L;;;;;N;;;;;
+11402;NEWA LETTER I;Lo;0;L;;;;;N;;;;;
+11403;NEWA LETTER II;Lo;0;L;;;;;N;;;;;
+11404;NEWA LETTER U;Lo;0;L;;;;;N;;;;;
+11405;NEWA LETTER UU;Lo;0;L;;;;;N;;;;;
+11406;NEWA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+11407;NEWA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+11408;NEWA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+11409;NEWA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+1140A;NEWA LETTER E;Lo;0;L;;;;;N;;;;;
+1140B;NEWA LETTER AI;Lo;0;L;;;;;N;;;;;
+1140C;NEWA LETTER O;Lo;0;L;;;;;N;;;;;
+1140D;NEWA LETTER AU;Lo;0;L;;;;;N;;;;;
+1140E;NEWA LETTER KA;Lo;0;L;;;;;N;;;;;
+1140F;NEWA LETTER KHA;Lo;0;L;;;;;N;;;;;
+11410;NEWA LETTER GA;Lo;0;L;;;;;N;;;;;
+11411;NEWA LETTER GHA;Lo;0;L;;;;;N;;;;;
+11412;NEWA LETTER NGA;Lo;0;L;;;;;N;;;;;
+11413;NEWA LETTER NGHA;Lo;0;L;;;;;N;;;;;
+11414;NEWA LETTER CA;Lo;0;L;;;;;N;;;;;
+11415;NEWA LETTER CHA;Lo;0;L;;;;;N;;;;;
+11416;NEWA LETTER JA;Lo;0;L;;;;;N;;;;;
+11417;NEWA LETTER JHA;Lo;0;L;;;;;N;;;;;
+11418;NEWA LETTER NYA;Lo;0;L;;;;;N;;;;;
+11419;NEWA LETTER NYHA;Lo;0;L;;;;;N;;;;;
+1141A;NEWA LETTER TTA;Lo;0;L;;;;;N;;;;;
+1141B;NEWA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+1141C;NEWA LETTER DDA;Lo;0;L;;;;;N;;;;;
+1141D;NEWA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+1141E;NEWA LETTER NNA;Lo;0;L;;;;;N;;;;;
+1141F;NEWA LETTER TA;Lo;0;L;;;;;N;;;;;
+11420;NEWA LETTER THA;Lo;0;L;;;;;N;;;;;
+11421;NEWA LETTER DA;Lo;0;L;;;;;N;;;;;
+11422;NEWA LETTER DHA;Lo;0;L;;;;;N;;;;;
+11423;NEWA LETTER NA;Lo;0;L;;;;;N;;;;;
+11424;NEWA LETTER NHA;Lo;0;L;;;;;N;;;;;
+11425;NEWA LETTER PA;Lo;0;L;;;;;N;;;;;
+11426;NEWA LETTER PHA;Lo;0;L;;;;;N;;;;;
+11427;NEWA LETTER BA;Lo;0;L;;;;;N;;;;;
+11428;NEWA LETTER BHA;Lo;0;L;;;;;N;;;;;
+11429;NEWA LETTER MA;Lo;0;L;;;;;N;;;;;
+1142A;NEWA LETTER MHA;Lo;0;L;;;;;N;;;;;
+1142B;NEWA LETTER YA;Lo;0;L;;;;;N;;;;;
+1142C;NEWA LETTER RA;Lo;0;L;;;;;N;;;;;
+1142D;NEWA LETTER RHA;Lo;0;L;;;;;N;;;;;
+1142E;NEWA LETTER LA;Lo;0;L;;;;;N;;;;;
+1142F;NEWA LETTER LHA;Lo;0;L;;;;;N;;;;;
+11430;NEWA LETTER WA;Lo;0;L;;;;;N;;;;;
+11431;NEWA LETTER SHA;Lo;0;L;;;;;N;;;;;
+11432;NEWA LETTER SSA;Lo;0;L;;;;;N;;;;;
+11433;NEWA LETTER SA;Lo;0;L;;;;;N;;;;;
+11434;NEWA LETTER HA;Lo;0;L;;;;;N;;;;;
+11435;NEWA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+11436;NEWA VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+11437;NEWA VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+11438;NEWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+11439;NEWA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+1143A;NEWA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+1143B;NEWA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+1143C;NEWA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+1143D;NEWA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+1143E;NEWA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+1143F;NEWA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+11440;NEWA VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+11441;NEWA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+11442;NEWA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+11443;NEWA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+11444;NEWA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+11445;NEWA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+11446;NEWA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+11447;NEWA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+11448;NEWA SIGN FINAL ANUSVARA;Lo;0;L;;;;;N;;;;;
+11449;NEWA OM;Lo;0;L;;;;;N;;;;;
+1144A;NEWA SIDDHI;Lo;0;L;;;;;N;;;;;
+1144B;NEWA DANDA;Po;0;L;;;;;N;;;;;
+1144C;NEWA DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+1144D;NEWA COMMA;Po;0;L;;;;;N;;;;;
+1144E;NEWA GAP FILLER;Po;0;L;;;;;N;;;;;
+1144F;NEWA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
+11450;NEWA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+11451;NEWA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+11452;NEWA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+11453;NEWA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+11454;NEWA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+11455;NEWA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+11456;NEWA DIGIT SIX;Nd;0;L;;6;6;6;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;;;;;
+1145B;NEWA PLACEHOLDER MARK;Po;0;L;;;;;N;;;;;
+1145D;NEWA INSERTION SIGN;Po;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;;;;;
+11483;TIRHUTA LETTER I;Lo;0;L;;;;;N;;;;;
+11484;TIRHUTA LETTER II;Lo;0;L;;;;;N;;;;;
+11485;TIRHUTA LETTER U;Lo;0;L;;;;;N;;;;;
+11486;TIRHUTA LETTER UU;Lo;0;L;;;;;N;;;;;
+11487;TIRHUTA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+11488;TIRHUTA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+11489;TIRHUTA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+1148A;TIRHUTA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+1148B;TIRHUTA LETTER E;Lo;0;L;;;;;N;;;;;
+1148C;TIRHUTA LETTER AI;Lo;0;L;;;;;N;;;;;
+1148D;TIRHUTA LETTER O;Lo;0;L;;;;;N;;;;;
+1148E;TIRHUTA LETTER AU;Lo;0;L;;;;;N;;;;;
+1148F;TIRHUTA LETTER KA;Lo;0;L;;;;;N;;;;;
+11490;TIRHUTA LETTER KHA;Lo;0;L;;;;;N;;;;;
+11491;TIRHUTA LETTER GA;Lo;0;L;;;;;N;;;;;
+11492;TIRHUTA LETTER GHA;Lo;0;L;;;;;N;;;;;
+11493;TIRHUTA LETTER NGA;Lo;0;L;;;;;N;;;;;
+11494;TIRHUTA LETTER CA;Lo;0;L;;;;;N;;;;;
+11495;TIRHUTA LETTER CHA;Lo;0;L;;;;;N;;;;;
+11496;TIRHUTA LETTER JA;Lo;0;L;;;;;N;;;;;
+11497;TIRHUTA LETTER JHA;Lo;0;L;;;;;N;;;;;
+11498;TIRHUTA LETTER NYA;Lo;0;L;;;;;N;;;;;
+11499;TIRHUTA LETTER TTA;Lo;0;L;;;;;N;;;;;
+1149A;TIRHUTA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+1149B;TIRHUTA LETTER DDA;Lo;0;L;;;;;N;;;;;
+1149C;TIRHUTA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+1149D;TIRHUTA LETTER NNA;Lo;0;L;;;;;N;;;;;
+1149E;TIRHUTA LETTER TA;Lo;0;L;;;;;N;;;;;
+1149F;TIRHUTA LETTER THA;Lo;0;L;;;;;N;;;;;
+114A0;TIRHUTA LETTER DA;Lo;0;L;;;;;N;;;;;
+114A1;TIRHUTA LETTER DHA;Lo;0;L;;;;;N;;;;;
+114A2;TIRHUTA LETTER NA;Lo;0;L;;;;;N;;;;;
+114A3;TIRHUTA LETTER PA;Lo;0;L;;;;;N;;;;;
+114A4;TIRHUTA LETTER PHA;Lo;0;L;;;;;N;;;;;
+114A5;TIRHUTA LETTER BA;Lo;0;L;;;;;N;;;;;
+114A6;TIRHUTA LETTER BHA;Lo;0;L;;;;;N;;;;;
+114A7;TIRHUTA LETTER MA;Lo;0;L;;;;;N;;;;;
+114A8;TIRHUTA LETTER YA;Lo;0;L;;;;;N;;;;;
+114A9;TIRHUTA LETTER RA;Lo;0;L;;;;;N;;;;;
+114AA;TIRHUTA LETTER LA;Lo;0;L;;;;;N;;;;;
+114AB;TIRHUTA LETTER VA;Lo;0;L;;;;;N;;;;;
+114AC;TIRHUTA LETTER SHA;Lo;0;L;;;;;N;;;;;
+114AD;TIRHUTA LETTER SSA;Lo;0;L;;;;;N;;;;;
+114AE;TIRHUTA LETTER SA;Lo;0;L;;;;;N;;;;;
+114AF;TIRHUTA LETTER HA;Lo;0;L;;;;;N;;;;;
+114B0;TIRHUTA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+114B1;TIRHUTA VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+114B2;TIRHUTA VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+114B3;TIRHUTA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+114B4;TIRHUTA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+114B5;TIRHUTA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+114B6;TIRHUTA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+114B7;TIRHUTA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+114B8;TIRHUTA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+114B9;TIRHUTA VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+114BA;TIRHUTA VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;;
+114BB;TIRHUTA VOWEL SIGN AI;Mc;0;L;114B9 114BA;;;;N;;;;;
+114BC;TIRHUTA VOWEL SIGN O;Mc;0;L;114B9 114B0;;;;N;;;;;
+114BD;TIRHUTA VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;;
+114BE;TIRHUTA VOWEL SIGN AU;Mc;0;L;114B9 114BD;;;;N;;;;;
+114BF;TIRHUTA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+114C0;TIRHUTA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+114C1;TIRHUTA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+114C2;TIRHUTA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+114C3;TIRHUTA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+114C4;TIRHUTA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+114C5;TIRHUTA GVANG;Lo;0;L;;;;;N;;;;;
+114C6;TIRHUTA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
+114C7;TIRHUTA OM;Lo;0;L;;;;;N;;;;;
+114D0;TIRHUTA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+114D1;TIRHUTA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+114D2;TIRHUTA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+114D3;TIRHUTA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+114D4;TIRHUTA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+114D5;TIRHUTA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+114D6;TIRHUTA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+114D7;TIRHUTA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+114D8;TIRHUTA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+114D9;TIRHUTA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+11580;SIDDHAM LETTER A;Lo;0;L;;;;;N;;;;;
+11581;SIDDHAM LETTER AA;Lo;0;L;;;;;N;;;;;
+11582;SIDDHAM LETTER I;Lo;0;L;;;;;N;;;;;
+11583;SIDDHAM LETTER II;Lo;0;L;;;;;N;;;;;
+11584;SIDDHAM LETTER U;Lo;0;L;;;;;N;;;;;
+11585;SIDDHAM LETTER UU;Lo;0;L;;;;;N;;;;;
+11586;SIDDHAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+11587;SIDDHAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+11588;SIDDHAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+11589;SIDDHAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+1158A;SIDDHAM LETTER E;Lo;0;L;;;;;N;;;;;
+1158B;SIDDHAM LETTER AI;Lo;0;L;;;;;N;;;;;
+1158C;SIDDHAM LETTER O;Lo;0;L;;;;;N;;;;;
+1158D;SIDDHAM LETTER AU;Lo;0;L;;;;;N;;;;;
+1158E;SIDDHAM LETTER KA;Lo;0;L;;;;;N;;;;;
+1158F;SIDDHAM LETTER KHA;Lo;0;L;;;;;N;;;;;
+11590;SIDDHAM LETTER GA;Lo;0;L;;;;;N;;;;;
+11591;SIDDHAM LETTER GHA;Lo;0;L;;;;;N;;;;;
+11592;SIDDHAM LETTER NGA;Lo;0;L;;;;;N;;;;;
+11593;SIDDHAM LETTER CA;Lo;0;L;;;;;N;;;;;
+11594;SIDDHAM LETTER CHA;Lo;0;L;;;;;N;;;;;
+11595;SIDDHAM LETTER JA;Lo;0;L;;;;;N;;;;;
+11596;SIDDHAM LETTER JHA;Lo;0;L;;;;;N;;;;;
+11597;SIDDHAM LETTER NYA;Lo;0;L;;;;;N;;;;;
+11598;SIDDHAM LETTER TTA;Lo;0;L;;;;;N;;;;;
+11599;SIDDHAM LETTER TTHA;Lo;0;L;;;;;N;;;;;
+1159A;SIDDHAM LETTER DDA;Lo;0;L;;;;;N;;;;;
+1159B;SIDDHAM LETTER DDHA;Lo;0;L;;;;;N;;;;;
+1159C;SIDDHAM LETTER NNA;Lo;0;L;;;;;N;;;;;
+1159D;SIDDHAM LETTER TA;Lo;0;L;;;;;N;;;;;
+1159E;SIDDHAM LETTER THA;Lo;0;L;;;;;N;;;;;
+1159F;SIDDHAM LETTER DA;Lo;0;L;;;;;N;;;;;
+115A0;SIDDHAM LETTER DHA;Lo;0;L;;;;;N;;;;;
+115A1;SIDDHAM LETTER NA;Lo;0;L;;;;;N;;;;;
+115A2;SIDDHAM LETTER PA;Lo;0;L;;;;;N;;;;;
+115A3;SIDDHAM LETTER PHA;Lo;0;L;;;;;N;;;;;
+115A4;SIDDHAM LETTER BA;Lo;0;L;;;;;N;;;;;
+115A5;SIDDHAM LETTER BHA;Lo;0;L;;;;;N;;;;;
+115A6;SIDDHAM LETTER MA;Lo;0;L;;;;;N;;;;;
+115A7;SIDDHAM LETTER YA;Lo;0;L;;;;;N;;;;;
+115A8;SIDDHAM LETTER RA;Lo;0;L;;;;;N;;;;;
+115A9;SIDDHAM LETTER LA;Lo;0;L;;;;;N;;;;;
+115AA;SIDDHAM LETTER VA;Lo;0;L;;;;;N;;;;;
+115AB;SIDDHAM LETTER SHA;Lo;0;L;;;;;N;;;;;
+115AC;SIDDHAM LETTER SSA;Lo;0;L;;;;;N;;;;;
+115AD;SIDDHAM LETTER SA;Lo;0;L;;;;;N;;;;;
+115AE;SIDDHAM LETTER HA;Lo;0;L;;;;;N;;;;;
+115AF;SIDDHAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+115B0;SIDDHAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+115B1;SIDDHAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+115B2;SIDDHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+115B3;SIDDHAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+115B4;SIDDHAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+115B5;SIDDHAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+115B8;SIDDHAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+115B9;SIDDHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+115BA;SIDDHAM VOWEL SIGN O;Mc;0;L;115B8 115AF;;;;N;;;;;
+115BB;SIDDHAM VOWEL SIGN AU;Mc;0;L;115B9 115AF;;;;N;;;;;
+115BC;SIDDHAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+115BD;SIDDHAM SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+115BE;SIDDHAM SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+115BF;SIDDHAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+115C0;SIDDHAM SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+115C1;SIDDHAM SIGN SIDDHAM;Po;0;L;;;;;N;;;;;
+115C2;SIDDHAM DANDA;Po;0;L;;;;;N;;;;;
+115C3;SIDDHAM DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+115C4;SIDDHAM SEPARATOR DOT;Po;0;L;;;;;N;;;;;
+115C5;SIDDHAM SEPARATOR BAR;Po;0;L;;;;;N;;;;;
+115C6;SIDDHAM REPETITION MARK-1;Po;0;L;;;;;N;;;;;
+115C7;SIDDHAM REPETITION MARK-2;Po;0;L;;;;;N;;;;;
+115C8;SIDDHAM REPETITION MARK-3;Po;0;L;;;;;N;;;;;
+115C9;SIDDHAM END OF TEXT MARK;Po;0;L;;;;;N;;;;;
+115CA;SIDDHAM SECTION MARK WITH TRIDENT AND U-SHAPED ORNAMENTS;Po;0;L;;;;;N;;;;;
+115CB;SIDDHAM SECTION MARK WITH TRIDENT AND DOTTED CRESCENTS;Po;0;L;;;;;N;;;;;
+115CC;SIDDHAM SECTION MARK WITH RAYS AND DOTTED CRESCENTS;Po;0;L;;;;;N;;;;;
+115CD;SIDDHAM SECTION MARK WITH RAYS AND DOTTED DOUBLE CRESCENTS;Po;0;L;;;;;N;;;;;
+115CE;SIDDHAM SECTION MARK WITH RAYS AND DOTTED TRIPLE CRESCENTS;Po;0;L;;;;;N;;;;;
+115CF;SIDDHAM SECTION MARK DOUBLE RING;Po;0;L;;;;;N;;;;;
+115D0;SIDDHAM SECTION MARK DOUBLE RING WITH RAYS;Po;0;L;;;;;N;;;;;
+115D1;SIDDHAM SECTION MARK WITH DOUBLE CRESCENTS;Po;0;L;;;;;N;;;;;
+115D2;SIDDHAM SECTION MARK WITH TRIPLE CRESCENTS;Po;0;L;;;;;N;;;;;
+115D3;SIDDHAM SECTION MARK WITH QUADRUPLE CRESCENTS;Po;0;L;;;;;N;;;;;
+115D4;SIDDHAM SECTION MARK WITH SEPTUPLE CRESCENTS;Po;0;L;;;;;N;;;;;
+115D5;SIDDHAM SECTION MARK WITH CIRCLES AND RAYS;Po;0;L;;;;;N;;;;;
+115D6;SIDDHAM SECTION MARK WITH CIRCLES AND TWO ENCLOSURES;Po;0;L;;;;;N;;;;;
+115D7;SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES;Po;0;L;;;;;N;;;;;
+115D8;SIDDHAM LETTER THREE-CIRCLE ALTERNATE I;Lo;0;L;;;;;N;;;;;
+115D9;SIDDHAM LETTER TWO-CIRCLE ALTERNATE I;Lo;0;L;;;;;N;;;;;
+115DA;SIDDHAM LETTER TWO-CIRCLE ALTERNATE II;Lo;0;L;;;;;N;;;;;
+115DB;SIDDHAM LETTER ALTERNATE U;Lo;0;L;;;;;N;;;;;
+115DC;SIDDHAM VOWEL SIGN ALTERNATE U;Mn;0;NSM;;;;;N;;;;;
+115DD;SIDDHAM VOWEL SIGN ALTERNATE UU;Mn;0;NSM;;;;;N;;;;;
+11600;MODI LETTER A;Lo;0;L;;;;;N;;;;;
+11601;MODI LETTER AA;Lo;0;L;;;;;N;;;;;
+11602;MODI LETTER I;Lo;0;L;;;;;N;;;;;
+11603;MODI LETTER II;Lo;0;L;;;;;N;;;;;
+11604;MODI LETTER U;Lo;0;L;;;;;N;;;;;
+11605;MODI LETTER UU;Lo;0;L;;;;;N;;;;;
+11606;MODI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+11607;MODI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+11608;MODI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+11609;MODI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+1160A;MODI LETTER E;Lo;0;L;;;;;N;;;;;
+1160B;MODI LETTER AI;Lo;0;L;;;;;N;;;;;
+1160C;MODI LETTER O;Lo;0;L;;;;;N;;;;;
+1160D;MODI LETTER AU;Lo;0;L;;;;;N;;;;;
+1160E;MODI LETTER KA;Lo;0;L;;;;;N;;;;;
+1160F;MODI LETTER KHA;Lo;0;L;;;;;N;;;;;
+11610;MODI LETTER GA;Lo;0;L;;;;;N;;;;;
+11611;MODI LETTER GHA;Lo;0;L;;;;;N;;;;;
+11612;MODI LETTER NGA;Lo;0;L;;;;;N;;;;;
+11613;MODI LETTER CA;Lo;0;L;;;;;N;;;;;
+11614;MODI LETTER CHA;Lo;0;L;;;;;N;;;;;
+11615;MODI LETTER JA;Lo;0;L;;;;;N;;;;;
+11616;MODI LETTER JHA;Lo;0;L;;;;;N;;;;;
+11617;MODI LETTER NYA;Lo;0;L;;;;;N;;;;;
+11618;MODI LETTER TTA;Lo;0;L;;;;;N;;;;;
+11619;MODI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+1161A;MODI LETTER DDA;Lo;0;L;;;;;N;;;;;
+1161B;MODI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+1161C;MODI LETTER NNA;Lo;0;L;;;;;N;;;;;
+1161D;MODI LETTER TA;Lo;0;L;;;;;N;;;;;
+1161E;MODI LETTER THA;Lo;0;L;;;;;N;;;;;
+1161F;MODI LETTER DA;Lo;0;L;;;;;N;;;;;
+11620;MODI LETTER DHA;Lo;0;L;;;;;N;;;;;
+11621;MODI LETTER NA;Lo;0;L;;;;;N;;;;;
+11622;MODI LETTER PA;Lo;0;L;;;;;N;;;;;
+11623;MODI LETTER PHA;Lo;0;L;;;;;N;;;;;
+11624;MODI LETTER BA;Lo;0;L;;;;;N;;;;;
+11625;MODI LETTER BHA;Lo;0;L;;;;;N;;;;;
+11626;MODI LETTER MA;Lo;0;L;;;;;N;;;;;
+11627;MODI LETTER YA;Lo;0;L;;;;;N;;;;;
+11628;MODI LETTER RA;Lo;0;L;;;;;N;;;;;
+11629;MODI LETTER LA;Lo;0;L;;;;;N;;;;;
+1162A;MODI LETTER VA;Lo;0;L;;;;;N;;;;;
+1162B;MODI LETTER SHA;Lo;0;L;;;;;N;;;;;
+1162C;MODI LETTER SSA;Lo;0;L;;;;;N;;;;;
+1162D;MODI LETTER SA;Lo;0;L;;;;;N;;;;;
+1162E;MODI LETTER HA;Lo;0;L;;;;;N;;;;;
+1162F;MODI LETTER LLA;Lo;0;L;;;;;N;;;;;
+11630;MODI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+11631;MODI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+11632;MODI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+11633;MODI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+11634;MODI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+11635;MODI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+11636;MODI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+11637;MODI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+11638;MODI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+11639;MODI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+1163A;MODI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+1163B;MODI VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+1163C;MODI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+1163D;MODI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+1163E;MODI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+1163F;MODI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+11640;MODI SIGN ARDHACANDRA;Mn;0;NSM;;;;;N;;;;;
+11641;MODI DANDA;Po;0;L;;;;;N;;;;;
+11642;MODI DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+11643;MODI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
+11644;MODI SIGN HUVA;Lo;0;L;;;;;N;;;;;
+11650;MODI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+11651;MODI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+11652;MODI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+11653;MODI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+11654;MODI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+11655;MODI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+11656;MODI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+11657;MODI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+11658;MODI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+11659;MODI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+11660;MONGOLIAN BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;;
+11661;MONGOLIAN ROTATED BIRGA;Po;0;ON;;;;;N;;;;;
+11662;MONGOLIAN DOUBLE BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;;
+11663;MONGOLIAN TRIPLE BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;;
+11664;MONGOLIAN BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;;
+11665;MONGOLIAN ROTATED BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;;
+11666;MONGOLIAN ROTATED BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;;
+11667;MONGOLIAN INVERTED BIRGA;Po;0;ON;;;;;N;;;;;
+11668;MONGOLIAN INVERTED BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;;
+11669;MONGOLIAN SWIRL BIRGA;Po;0;ON;;;;;N;;;;;
+1166A;MONGOLIAN SWIRL BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;;
+1166B;MONGOLIAN SWIRL BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;;
+1166C;MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;;
+11680;TAKRI LETTER A;Lo;0;L;;;;;N;;;;;
+11681;TAKRI LETTER AA;Lo;0;L;;;;;N;;;;;
+11682;TAKRI LETTER I;Lo;0;L;;;;;N;;;;;
+11683;TAKRI LETTER II;Lo;0;L;;;;;N;;;;;
+11684;TAKRI LETTER U;Lo;0;L;;;;;N;;;;;
+11685;TAKRI LETTER UU;Lo;0;L;;;;;N;;;;;
+11686;TAKRI LETTER E;Lo;0;L;;;;;N;;;;;
+11687;TAKRI LETTER AI;Lo;0;L;;;;;N;;;;;
+11688;TAKRI LETTER O;Lo;0;L;;;;;N;;;;;
+11689;TAKRI LETTER AU;Lo;0;L;;;;;N;;;;;
+1168A;TAKRI LETTER KA;Lo;0;L;;;;;N;;;;;
+1168B;TAKRI LETTER KHA;Lo;0;L;;;;;N;;;;;
+1168C;TAKRI LETTER GA;Lo;0;L;;;;;N;;;;;
+1168D;TAKRI LETTER GHA;Lo;0;L;;;;;N;;;;;
+1168E;TAKRI LETTER NGA;Lo;0;L;;;;;N;;;;;
+1168F;TAKRI LETTER CA;Lo;0;L;;;;;N;;;;;
+11690;TAKRI LETTER CHA;Lo;0;L;;;;;N;;;;;
+11691;TAKRI LETTER JA;Lo;0;L;;;;;N;;;;;
+11692;TAKRI LETTER JHA;Lo;0;L;;;;;N;;;;;
+11693;TAKRI LETTER NYA;Lo;0;L;;;;;N;;;;;
+11694;TAKRI LETTER TTA;Lo;0;L;;;;;N;;;;;
+11695;TAKRI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+11696;TAKRI LETTER DDA;Lo;0;L;;;;;N;;;;;
+11697;TAKRI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+11698;TAKRI LETTER NNA;Lo;0;L;;;;;N;;;;;
+11699;TAKRI LETTER TA;Lo;0;L;;;;;N;;;;;
+1169A;TAKRI LETTER THA;Lo;0;L;;;;;N;;;;;
+1169B;TAKRI LETTER DA;Lo;0;L;;;;;N;;;;;
+1169C;TAKRI LETTER DHA;Lo;0;L;;;;;N;;;;;
+1169D;TAKRI LETTER NA;Lo;0;L;;;;;N;;;;;
+1169E;TAKRI LETTER PA;Lo;0;L;;;;;N;;;;;
+1169F;TAKRI LETTER PHA;Lo;0;L;;;;;N;;;;;
+116A0;TAKRI LETTER BA;Lo;0;L;;;;;N;;;;;
+116A1;TAKRI LETTER BHA;Lo;0;L;;;;;N;;;;;
+116A2;TAKRI LETTER MA;Lo;0;L;;;;;N;;;;;
+116A3;TAKRI LETTER YA;Lo;0;L;;;;;N;;;;;
+116A4;TAKRI LETTER RA;Lo;0;L;;;;;N;;;;;
+116A5;TAKRI LETTER LA;Lo;0;L;;;;;N;;;;;
+116A6;TAKRI LETTER VA;Lo;0;L;;;;;N;;;;;
+116A7;TAKRI LETTER SHA;Lo;0;L;;;;;N;;;;;
+116A8;TAKRI LETTER SA;Lo;0;L;;;;;N;;;;;
+116A9;TAKRI LETTER HA;Lo;0;L;;;;;N;;;;;
+116AA;TAKRI LETTER RRA;Lo;0;L;;;;;N;;;;;
+116AB;TAKRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+116AC;TAKRI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+116AD;TAKRI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;;
+116AE;TAKRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+116AF;TAKRI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+116B0;TAKRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+116B1;TAKRI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+116B2;TAKRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+116B3;TAKRI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+116B4;TAKRI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+116B5;TAKRI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+116B6;TAKRI SIGN VIRAMA;Mc;9;L;;;;;N;;;;;
+116B7;TAKRI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+116C0;TAKRI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+116C1;TAKRI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+116C2;TAKRI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+116C3;TAKRI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+116C4;TAKRI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+116C5;TAKRI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+116C6;TAKRI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+116C7;TAKRI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+116C8;TAKRI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+116C9;TAKRI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+11700;AHOM LETTER KA;Lo;0;L;;;;;N;;;;;
+11701;AHOM LETTER KHA;Lo;0;L;;;;;N;;;;;
+11702;AHOM LETTER NGA;Lo;0;L;;;;;N;;;;;
+11703;AHOM LETTER NA;Lo;0;L;;;;;N;;;;;
+11704;AHOM LETTER TA;Lo;0;L;;;;;N;;;;;
+11705;AHOM LETTER ALTERNATE TA;Lo;0;L;;;;;N;;;;;
+11706;AHOM LETTER PA;Lo;0;L;;;;;N;;;;;
+11707;AHOM LETTER PHA;Lo;0;L;;;;;N;;;;;
+11708;AHOM LETTER BA;Lo;0;L;;;;;N;;;;;
+11709;AHOM LETTER MA;Lo;0;L;;;;;N;;;;;
+1170A;AHOM LETTER JA;Lo;0;L;;;;;N;;;;;
+1170B;AHOM LETTER CHA;Lo;0;L;;;;;N;;;;;
+1170C;AHOM LETTER THA;Lo;0;L;;;;;N;;;;;
+1170D;AHOM LETTER RA;Lo;0;L;;;;;N;;;;;
+1170E;AHOM LETTER LA;Lo;0;L;;;;;N;;;;;
+1170F;AHOM LETTER SA;Lo;0;L;;;;;N;;;;;
+11710;AHOM LETTER NYA;Lo;0;L;;;;;N;;;;;
+11711;AHOM LETTER HA;Lo;0;L;;;;;N;;;;;
+11712;AHOM LETTER A;Lo;0;L;;;;;N;;;;;
+11713;AHOM LETTER DA;Lo;0;L;;;;;N;;;;;
+11714;AHOM LETTER DHA;Lo;0;L;;;;;N;;;;;
+11715;AHOM LETTER GA;Lo;0;L;;;;;N;;;;;
+11716;AHOM LETTER ALTERNATE GA;Lo;0;L;;;;;N;;;;;
+11717;AHOM LETTER GHA;Lo;0;L;;;;;N;;;;;
+11718;AHOM LETTER BHA;Lo;0;L;;;;;N;;;;;
+11719;AHOM LETTER JHA;Lo;0;L;;;;;N;;;;;
+1171D;AHOM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;;
+1171E;AHOM CONSONANT SIGN MEDIAL RA;Mn;0;NSM;;;;;N;;;;;
+1171F;AHOM CONSONANT SIGN MEDIAL LIGATING RA;Mn;0;NSM;;;;;N;;;;;
+11720;AHOM VOWEL SIGN A;Mc;0;L;;;;;N;;;;;
+11721;AHOM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+11722;AHOM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+11723;AHOM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+11724;AHOM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+11725;AHOM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+11726;AHOM VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+11727;AHOM VOWEL SIGN AW;Mn;0;NSM;;;;;N;;;;;
+11728;AHOM VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+11729;AHOM VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+1172A;AHOM VOWEL SIGN AM;Mn;0;NSM;;;;;N;;;;;
+1172B;AHOM SIGN KILLER;Mn;9;NSM;;;;;N;;;;;
+11730;AHOM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+11731;AHOM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+11732;AHOM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+11733;AHOM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+11734;AHOM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+11735;AHOM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+11736;AHOM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+11737;AHOM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+11738;AHOM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+11739;AHOM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1173A;AHOM NUMBER TEN;No;0;L;;;;10;N;;;;;
+1173B;AHOM NUMBER TWENTY;No;0;L;;;;20;N;;;;;
+1173C;AHOM SIGN SMALL SECTION;Po;0;L;;;;;N;;;;;
+1173D;AHOM SIGN SECTION;Po;0;L;;;;;N;;;;;
+1173E;AHOM SIGN RULAI;Po;0;L;;;;;N;;;;;
+1173F;AHOM SYMBOL VI;So;0;L;;;;;N;;;;;
+118A0;WARANG CITI CAPITAL LETTER NGAA;Lu;0;L;;;;;N;;;;118C0;
+118A1;WARANG CITI CAPITAL LETTER A;Lu;0;L;;;;;N;;;;118C1;
+118A2;WARANG CITI CAPITAL LETTER WI;Lu;0;L;;;;;N;;;;118C2;
+118A3;WARANG CITI CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;118C3;
+118A4;WARANG CITI CAPITAL LETTER YA;Lu;0;L;;;;;N;;;;118C4;
+118A5;WARANG CITI CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;118C5;
+118A6;WARANG CITI CAPITAL LETTER II;Lu;0;L;;;;;N;;;;118C6;
+118A7;WARANG CITI CAPITAL LETTER UU;Lu;0;L;;;;;N;;;;118C7;
+118A8;WARANG CITI CAPITAL LETTER E;Lu;0;L;;;;;N;;;;118C8;
+118A9;WARANG CITI CAPITAL LETTER O;Lu;0;L;;;;;N;;;;118C9;
+118AA;WARANG CITI CAPITAL LETTER ANG;Lu;0;L;;;;;N;;;;118CA;
+118AB;WARANG CITI CAPITAL LETTER GA;Lu;0;L;;;;;N;;;;118CB;
+118AC;WARANG CITI CAPITAL LETTER KO;Lu;0;L;;;;;N;;;;118CC;
+118AD;WARANG CITI CAPITAL LETTER ENY;Lu;0;L;;;;;N;;;;118CD;
+118AE;WARANG CITI CAPITAL LETTER YUJ;Lu;0;L;;;;;N;;;;118CE;
+118AF;WARANG CITI CAPITAL LETTER UC;Lu;0;L;;;;;N;;;;118CF;
+118B0;WARANG CITI CAPITAL LETTER ENN;Lu;0;L;;;;;N;;;;118D0;
+118B1;WARANG CITI CAPITAL LETTER ODD;Lu;0;L;;;;;N;;;;118D1;
+118B2;WARANG CITI CAPITAL LETTER TTE;Lu;0;L;;;;;N;;;;118D2;
+118B3;WARANG CITI CAPITAL LETTER NUNG;Lu;0;L;;;;;N;;;;118D3;
+118B4;WARANG CITI CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;118D4;
+118B5;WARANG CITI CAPITAL LETTER AT;Lu;0;L;;;;;N;;;;118D5;
+118B6;WARANG CITI CAPITAL LETTER AM;Lu;0;L;;;;;N;;;;118D6;
+118B7;WARANG CITI CAPITAL LETTER BU;Lu;0;L;;;;;N;;;;118D7;
+118B8;WARANG CITI CAPITAL LETTER PU;Lu;0;L;;;;;N;;;;118D8;
+118B9;WARANG CITI CAPITAL LETTER HIYO;Lu;0;L;;;;;N;;;;118D9;
+118BA;WARANG CITI CAPITAL LETTER HOLO;Lu;0;L;;;;;N;;;;118DA;
+118BB;WARANG CITI CAPITAL LETTER HORR;Lu;0;L;;;;;N;;;;118DB;
+118BC;WARANG CITI CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;118DC;
+118BD;WARANG CITI CAPITAL LETTER SSUU;Lu;0;L;;;;;N;;;;118DD;
+118BE;WARANG CITI CAPITAL LETTER SII;Lu;0;L;;;;;N;;;;118DE;
+118BF;WARANG CITI CAPITAL LETTER VIYO;Lu;0;L;;;;;N;;;;118DF;
+118C0;WARANG CITI SMALL LETTER NGAA;Ll;0;L;;;;;N;;;118A0;;118A0
+118C1;WARANG CITI SMALL LETTER A;Ll;0;L;;;;;N;;;118A1;;118A1
+118C2;WARANG CITI SMALL LETTER WI;Ll;0;L;;;;;N;;;118A2;;118A2
+118C3;WARANG CITI SMALL LETTER YU;Ll;0;L;;;;;N;;;118A3;;118A3
+118C4;WARANG CITI SMALL LETTER YA;Ll;0;L;;;;;N;;;118A4;;118A4
+118C5;WARANG CITI SMALL LETTER YO;Ll;0;L;;;;;N;;;118A5;;118A5
+118C6;WARANG CITI SMALL LETTER II;Ll;0;L;;;;;N;;;118A6;;118A6
+118C7;WARANG CITI SMALL LETTER UU;Ll;0;L;;;;;N;;;118A7;;118A7
+118C8;WARANG CITI SMALL LETTER E;Ll;0;L;;;;;N;;;118A8;;118A8
+118C9;WARANG CITI SMALL LETTER O;Ll;0;L;;;;;N;;;118A9;;118A9
+118CA;WARANG CITI SMALL LETTER ANG;Ll;0;L;;;;;N;;;118AA;;118AA
+118CB;WARANG CITI SMALL LETTER GA;Ll;0;L;;;;;N;;;118AB;;118AB
+118CC;WARANG CITI SMALL LETTER KO;Ll;0;L;;;;;N;;;118AC;;118AC
+118CD;WARANG CITI SMALL LETTER ENY;Ll;0;L;;;;;N;;;118AD;;118AD
+118CE;WARANG CITI SMALL LETTER YUJ;Ll;0;L;;;;;N;;;118AE;;118AE
+118CF;WARANG CITI SMALL LETTER UC;Ll;0;L;;;;;N;;;118AF;;118AF
+118D0;WARANG CITI SMALL LETTER ENN;Ll;0;L;;;;;N;;;118B0;;118B0
+118D1;WARANG CITI SMALL LETTER ODD;Ll;0;L;;;;;N;;;118B1;;118B1
+118D2;WARANG CITI SMALL LETTER TTE;Ll;0;L;;;;;N;;;118B2;;118B2
+118D3;WARANG CITI SMALL LETTER NUNG;Ll;0;L;;;;;N;;;118B3;;118B3
+118D4;WARANG CITI SMALL LETTER DA;Ll;0;L;;;;;N;;;118B4;;118B4
+118D5;WARANG CITI SMALL LETTER AT;Ll;0;L;;;;;N;;;118B5;;118B5
+118D6;WARANG CITI SMALL LETTER AM;Ll;0;L;;;;;N;;;118B6;;118B6
+118D7;WARANG CITI SMALL LETTER BU;Ll;0;L;;;;;N;;;118B7;;118B7
+118D8;WARANG CITI SMALL LETTER PU;Ll;0;L;;;;;N;;;118B8;;118B8
+118D9;WARANG CITI SMALL LETTER HIYO;Ll;0;L;;;;;N;;;118B9;;118B9
+118DA;WARANG CITI SMALL LETTER HOLO;Ll;0;L;;;;;N;;;118BA;;118BA
+118DB;WARANG CITI SMALL LETTER HORR;Ll;0;L;;;;;N;;;118BB;;118BB
+118DC;WARANG CITI SMALL LETTER HAR;Ll;0;L;;;;;N;;;118BC;;118BC
+118DD;WARANG CITI SMALL LETTER SSUU;Ll;0;L;;;;;N;;;118BD;;118BD
+118DE;WARANG CITI SMALL LETTER SII;Ll;0;L;;;;;N;;;118BE;;118BE
+118DF;WARANG CITI SMALL LETTER VIYO;Ll;0;L;;;;;N;;;118BF;;118BF
+118E0;WARANG CITI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+118E1;WARANG CITI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+118E2;WARANG CITI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+118E3;WARANG CITI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+118E4;WARANG CITI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+118E5;WARANG CITI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+118E6;WARANG CITI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+118E7;WARANG CITI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+118E8;WARANG CITI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+118E9;WARANG CITI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+118EA;WARANG CITI NUMBER TEN;No;0;L;;;;10;N;;;;;
+118EB;WARANG CITI NUMBER TWENTY;No;0;L;;;;20;N;;;;;
+118EC;WARANG CITI NUMBER THIRTY;No;0;L;;;;30;N;;;;;
+118ED;WARANG CITI NUMBER FORTY;No;0;L;;;;40;N;;;;;
+118EE;WARANG CITI NUMBER FIFTY;No;0;L;;;;50;N;;;;;
+118EF;WARANG CITI NUMBER SIXTY;No;0;L;;;;60;N;;;;;
+118F0;WARANG CITI NUMBER SEVENTY;No;0;L;;;;70;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;;;;;
+11AC0;PAU CIN HAU LETTER PA;Lo;0;L;;;;;N;;;;;
+11AC1;PAU CIN HAU LETTER KA;Lo;0;L;;;;;N;;;;;
+11AC2;PAU CIN HAU LETTER LA;Lo;0;L;;;;;N;;;;;
+11AC3;PAU CIN HAU LETTER MA;Lo;0;L;;;;;N;;;;;
+11AC4;PAU CIN HAU LETTER DA;Lo;0;L;;;;;N;;;;;
+11AC5;PAU CIN HAU LETTER ZA;Lo;0;L;;;;;N;;;;;
+11AC6;PAU CIN HAU LETTER VA;Lo;0;L;;;;;N;;;;;
+11AC7;PAU CIN HAU LETTER NGA;Lo;0;L;;;;;N;;;;;
+11AC8;PAU CIN HAU LETTER HA;Lo;0;L;;;;;N;;;;;
+11AC9;PAU CIN HAU LETTER GA;Lo;0;L;;;;;N;;;;;
+11ACA;PAU CIN HAU LETTER KHA;Lo;0;L;;;;;N;;;;;
+11ACB;PAU CIN HAU LETTER SA;Lo;0;L;;;;;N;;;;;
+11ACC;PAU CIN HAU LETTER BA;Lo;0;L;;;;;N;;;;;
+11ACD;PAU CIN HAU LETTER CA;Lo;0;L;;;;;N;;;;;
+11ACE;PAU CIN HAU LETTER TA;Lo;0;L;;;;;N;;;;;
+11ACF;PAU CIN HAU LETTER THA;Lo;0;L;;;;;N;;;;;
+11AD0;PAU CIN HAU LETTER NA;Lo;0;L;;;;;N;;;;;
+11AD1;PAU CIN HAU LETTER PHA;Lo;0;L;;;;;N;;;;;
+11AD2;PAU CIN HAU LETTER RA;Lo;0;L;;;;;N;;;;;
+11AD3;PAU CIN HAU LETTER FA;Lo;0;L;;;;;N;;;;;
+11AD4;PAU CIN HAU LETTER CHA;Lo;0;L;;;;;N;;;;;
+11AD5;PAU CIN HAU LETTER A;Lo;0;L;;;;;N;;;;;
+11AD6;PAU CIN HAU LETTER E;Lo;0;L;;;;;N;;;;;
+11AD7;PAU CIN HAU LETTER I;Lo;0;L;;;;;N;;;;;
+11AD8;PAU CIN HAU LETTER O;Lo;0;L;;;;;N;;;;;
+11AD9;PAU CIN HAU LETTER U;Lo;0;L;;;;;N;;;;;
+11ADA;PAU CIN HAU LETTER UA;Lo;0;L;;;;;N;;;;;
+11ADB;PAU CIN HAU LETTER IA;Lo;0;L;;;;;N;;;;;
+11ADC;PAU CIN HAU LETTER FINAL P;Lo;0;L;;;;;N;;;;;
+11ADD;PAU CIN HAU LETTER FINAL K;Lo;0;L;;;;;N;;;;;
+11ADE;PAU CIN HAU LETTER FINAL T;Lo;0;L;;;;;N;;;;;
+11ADF;PAU CIN HAU LETTER FINAL M;Lo;0;L;;;;;N;;;;;
+11AE0;PAU CIN HAU LETTER FINAL N;Lo;0;L;;;;;N;;;;;
+11AE1;PAU CIN HAU LETTER FINAL L;Lo;0;L;;;;;N;;;;;
+11AE2;PAU CIN HAU LETTER FINAL W;Lo;0;L;;;;;N;;;;;
+11AE3;PAU CIN HAU LETTER FINAL NG;Lo;0;L;;;;;N;;;;;
+11AE4;PAU CIN HAU LETTER FINAL Y;Lo;0;L;;;;;N;;;;;
+11AE5;PAU CIN HAU RISING TONE LONG;Lo;0;L;;;;;N;;;;;
+11AE6;PAU CIN HAU RISING TONE;Lo;0;L;;;;;N;;;;;
+11AE7;PAU CIN HAU SANDHI GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
+11AE8;PAU CIN HAU RISING TONE LONG FINAL;Lo;0;L;;;;;N;;;;;
+11AE9;PAU CIN HAU RISING TONE FINAL;Lo;0;L;;;;;N;;;;;
+11AEA;PAU CIN HAU SANDHI GLOTTAL STOP FINAL;Lo;0;L;;;;;N;;;;;
+11AEB;PAU CIN HAU SANDHI TONE LONG;Lo;0;L;;;;;N;;;;;
+11AEC;PAU CIN HAU SANDHI TONE;Lo;0;L;;;;;N;;;;;
+11AED;PAU CIN HAU SANDHI TONE LONG FINAL;Lo;0;L;;;;;N;;;;;
+11AEE;PAU CIN HAU SANDHI TONE FINAL;Lo;0;L;;;;;N;;;;;
+11AEF;PAU CIN HAU MID-LEVEL TONE;Lo;0;L;;;;;N;;;;;
+11AF0;PAU CIN HAU GLOTTAL STOP VARIANT;Lo;0;L;;;;;N;;;;;
+11AF1;PAU CIN HAU MID-LEVEL TONE LONG FINAL;Lo;0;L;;;;;N;;;;;
+11AF2;PAU CIN HAU MID-LEVEL TONE FINAL;Lo;0;L;;;;;N;;;;;
+11AF3;PAU CIN HAU LOW-FALLING TONE LONG;Lo;0;L;;;;;N;;;;;
+11AF4;PAU CIN HAU LOW-FALLING TONE;Lo;0;L;;;;;N;;;;;
+11AF5;PAU CIN HAU GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
+11AF6;PAU CIN HAU LOW-FALLING TONE LONG FINAL;Lo;0;L;;;;;N;;;;;
+11AF7;PAU CIN HAU LOW-FALLING TONE FINAL;Lo;0;L;;;;;N;;;;;
+11AF8;PAU CIN HAU GLOTTAL STOP FINAL;Lo;0;L;;;;;N;;;;;
+11C00;BHAIKSUKI LETTER A;Lo;0;L;;;;;N;;;;;
+11C01;BHAIKSUKI LETTER AA;Lo;0;L;;;;;N;;;;;
+11C02;BHAIKSUKI LETTER I;Lo;0;L;;;;;N;;;;;
+11C03;BHAIKSUKI LETTER II;Lo;0;L;;;;;N;;;;;
+11C04;BHAIKSUKI LETTER U;Lo;0;L;;;;;N;;;;;
+11C05;BHAIKSUKI LETTER UU;Lo;0;L;;;;;N;;;;;
+11C06;BHAIKSUKI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+11C07;BHAIKSUKI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+11C08;BHAIKSUKI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+11C0A;BHAIKSUKI LETTER E;Lo;0;L;;;;;N;;;;;
+11C0B;BHAIKSUKI LETTER AI;Lo;0;L;;;;;N;;;;;
+11C0C;BHAIKSUKI LETTER O;Lo;0;L;;;;;N;;;;;
+11C0D;BHAIKSUKI LETTER AU;Lo;0;L;;;;;N;;;;;
+11C0E;BHAIKSUKI LETTER KA;Lo;0;L;;;;;N;;;;;
+11C0F;BHAIKSUKI LETTER KHA;Lo;0;L;;;;;N;;;;;
+11C10;BHAIKSUKI LETTER GA;Lo;0;L;;;;;N;;;;;
+11C11;BHAIKSUKI LETTER GHA;Lo;0;L;;;;;N;;;;;
+11C12;BHAIKSUKI LETTER NGA;Lo;0;L;;;;;N;;;;;
+11C13;BHAIKSUKI LETTER CA;Lo;0;L;;;;;N;;;;;
+11C14;BHAIKSUKI LETTER CHA;Lo;0;L;;;;;N;;;;;
+11C15;BHAIKSUKI LETTER JA;Lo;0;L;;;;;N;;;;;
+11C16;BHAIKSUKI LETTER JHA;Lo;0;L;;;;;N;;;;;
+11C17;BHAIKSUKI LETTER NYA;Lo;0;L;;;;;N;;;;;
+11C18;BHAIKSUKI LETTER TTA;Lo;0;L;;;;;N;;;;;
+11C19;BHAIKSUKI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+11C1A;BHAIKSUKI LETTER DDA;Lo;0;L;;;;;N;;;;;
+11C1B;BHAIKSUKI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+11C1C;BHAIKSUKI LETTER NNA;Lo;0;L;;;;;N;;;;;
+11C1D;BHAIKSUKI LETTER TA;Lo;0;L;;;;;N;;;;;
+11C1E;BHAIKSUKI LETTER THA;Lo;0;L;;;;;N;;;;;
+11C1F;BHAIKSUKI LETTER DA;Lo;0;L;;;;;N;;;;;
+11C20;BHAIKSUKI LETTER DHA;Lo;0;L;;;;;N;;;;;
+11C21;BHAIKSUKI LETTER NA;Lo;0;L;;;;;N;;;;;
+11C22;BHAIKSUKI LETTER PA;Lo;0;L;;;;;N;;;;;
+11C23;BHAIKSUKI LETTER PHA;Lo;0;L;;;;;N;;;;;
+11C24;BHAIKSUKI LETTER BA;Lo;0;L;;;;;N;;;;;
+11C25;BHAIKSUKI LETTER BHA;Lo;0;L;;;;;N;;;;;
+11C26;BHAIKSUKI LETTER MA;Lo;0;L;;;;;N;;;;;
+11C27;BHAIKSUKI LETTER YA;Lo;0;L;;;;;N;;;;;
+11C28;BHAIKSUKI LETTER RA;Lo;0;L;;;;;N;;;;;
+11C29;BHAIKSUKI LETTER LA;Lo;0;L;;;;;N;;;;;
+11C2A;BHAIKSUKI LETTER VA;Lo;0;L;;;;;N;;;;;
+11C2B;BHAIKSUKI LETTER SHA;Lo;0;L;;;;;N;;;;;
+11C2C;BHAIKSUKI LETTER SSA;Lo;0;L;;;;;N;;;;;
+11C2D;BHAIKSUKI LETTER SA;Lo;0;L;;;;;N;;;;;
+11C2E;BHAIKSUKI LETTER HA;Lo;0;L;;;;;N;;;;;
+11C2F;BHAIKSUKI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+11C30;BHAIKSUKI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+11C31;BHAIKSUKI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+11C32;BHAIKSUKI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+11C33;BHAIKSUKI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+11C34;BHAIKSUKI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+11C35;BHAIKSUKI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+11C36;BHAIKSUKI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+11C38;BHAIKSUKI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+11C39;BHAIKSUKI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+11C3A;BHAIKSUKI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+11C3B;BHAIKSUKI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+11C3C;BHAIKSUKI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+11C3D;BHAIKSUKI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+11C3E;BHAIKSUKI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+11C3F;BHAIKSUKI SIGN VIRAMA;Mn;9;L;;;;;N;;;;;
+11C40;BHAIKSUKI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+11C41;BHAIKSUKI DANDA;Po;0;L;;;;;N;;;;;
+11C42;BHAIKSUKI DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+11C43;BHAIKSUKI WORD SEPARATOR;Po;0;L;;;;;N;;;;;
+11C44;BHAIKSUKI GAP FILLER-1;Po;0;L;;;;;N;;;;;
+11C45;BHAIKSUKI GAP FILLER-2;Po;0;L;;;;;N;;;;;
+11C50;BHAIKSUKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+11C51;BHAIKSUKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+11C52;BHAIKSUKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+11C53;BHAIKSUKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+11C54;BHAIKSUKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+11C55;BHAIKSUKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+11C56;BHAIKSUKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+11C57;BHAIKSUKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+11C58;BHAIKSUKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+11C59;BHAIKSUKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+11C5A;BHAIKSUKI NUMBER ONE;No;0;L;;;;1;N;;;;;
+11C5B;BHAIKSUKI NUMBER TWO;No;0;L;;;;2;N;;;;;
+11C5C;BHAIKSUKI NUMBER THREE;No;0;L;;;;3;N;;;;;
+11C5D;BHAIKSUKI NUMBER FOUR;No;0;L;;;;4;N;;;;;
+11C5E;BHAIKSUKI NUMBER FIVE;No;0;L;;;;5;N;;;;;
+11C5F;BHAIKSUKI NUMBER SIX;No;0;L;;;;6;N;;;;;
+11C60;BHAIKSUKI NUMBER SEVEN;No;0;L;;;;7;N;;;;;
+11C61;BHAIKSUKI NUMBER EIGHT;No;0;L;;;;8;N;;;;;
+11C62;BHAIKSUKI NUMBER NINE;No;0;L;;;;9;N;;;;;
+11C63;BHAIKSUKI NUMBER TEN;No;0;L;;;;10;N;;;;;
+11C64;BHAIKSUKI NUMBER TWENTY;No;0;L;;;;20;N;;;;;
+11C65;BHAIKSUKI NUMBER THIRTY;No;0;L;;;;30;N;;;;;
+11C66;BHAIKSUKI NUMBER FORTY;No;0;L;;;;40;N;;;;;
+11C67;BHAIKSUKI NUMBER FIFTY;No;0;L;;;;50;N;;;;;
+11C68;BHAIKSUKI NUMBER SIXTY;No;0;L;;;;60;N;;;;;
+11C69;BHAIKSUKI NUMBER SEVENTY;No;0;L;;;;70;N;;;;;
+11C6A;BHAIKSUKI NUMBER EIGHTY;No;0;L;;;;80;N;;;;;
+11C6B;BHAIKSUKI NUMBER NINETY;No;0;L;;;;90;N;;;;;
+11C6C;BHAIKSUKI HUNDREDS UNIT MARK;No;0;L;;;;100;N;;;;;
+11C70;MARCHEN HEAD MARK;Po;0;L;;;;;N;;;;;
+11C71;MARCHEN MARK SHAD;Po;0;L;;;;;N;;;;;
+11C72;MARCHEN LETTER KA;Lo;0;L;;;;;N;;;;;
+11C73;MARCHEN LETTER KHA;Lo;0;L;;;;;N;;;;;
+11C74;MARCHEN LETTER GA;Lo;0;L;;;;;N;;;;;
+11C75;MARCHEN LETTER NGA;Lo;0;L;;;;;N;;;;;
+11C76;MARCHEN LETTER CA;Lo;0;L;;;;;N;;;;;
+11C77;MARCHEN LETTER CHA;Lo;0;L;;;;;N;;;;;
+11C78;MARCHEN LETTER JA;Lo;0;L;;;;;N;;;;;
+11C79;MARCHEN LETTER NYA;Lo;0;L;;;;;N;;;;;
+11C7A;MARCHEN LETTER TA;Lo;0;L;;;;;N;;;;;
+11C7B;MARCHEN LETTER THA;Lo;0;L;;;;;N;;;;;
+11C7C;MARCHEN LETTER DA;Lo;0;L;;;;;N;;;;;
+11C7D;MARCHEN LETTER NA;Lo;0;L;;;;;N;;;;;
+11C7E;MARCHEN LETTER PA;Lo;0;L;;;;;N;;;;;
+11C7F;MARCHEN LETTER PHA;Lo;0;L;;;;;N;;;;;
+11C80;MARCHEN LETTER BA;Lo;0;L;;;;;N;;;;;
+11C81;MARCHEN LETTER MA;Lo;0;L;;;;;N;;;;;
+11C82;MARCHEN LETTER TSA;Lo;0;L;;;;;N;;;;;
+11C83;MARCHEN LETTER TSHA;Lo;0;L;;;;;N;;;;;
+11C84;MARCHEN LETTER DZA;Lo;0;L;;;;;N;;;;;
+11C85;MARCHEN LETTER WA;Lo;0;L;;;;;N;;;;;
+11C86;MARCHEN LETTER ZHA;Lo;0;L;;;;;N;;;;;
+11C87;MARCHEN LETTER ZA;Lo;0;L;;;;;N;;;;;
+11C88;MARCHEN LETTER -A;Lo;0;L;;;;;N;;;;;
+11C89;MARCHEN LETTER YA;Lo;0;L;;;;;N;;;;;
+11C8A;MARCHEN LETTER RA;Lo;0;L;;;;;N;;;;;
+11C8B;MARCHEN LETTER LA;Lo;0;L;;;;;N;;;;;
+11C8C;MARCHEN LETTER SHA;Lo;0;L;;;;;N;;;;;
+11C8D;MARCHEN LETTER SA;Lo;0;L;;;;;N;;;;;
+11C8E;MARCHEN LETTER HA;Lo;0;L;;;;;N;;;;;
+11C8F;MARCHEN LETTER A;Lo;0;L;;;;;N;;;;;
+11C92;MARCHEN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;;
+11C93;MARCHEN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;;
+11C94;MARCHEN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;;
+11C95;MARCHEN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;;
+11C96;MARCHEN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;;
+11C97;MARCHEN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;;
+11C98;MARCHEN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;;
+11C99;MARCHEN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;;
+11C9A;MARCHEN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;;
+11C9B;MARCHEN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;;
+11C9C;MARCHEN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;;
+11C9D;MARCHEN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;;
+11C9E;MARCHEN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;;
+11C9F;MARCHEN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;;
+11CA0;MARCHEN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;;
+11CA1;MARCHEN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;;
+11CA2;MARCHEN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;;
+11CA3;MARCHEN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;;
+11CA4;MARCHEN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;;
+11CA5;MARCHEN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;;;;
+11CA6;MARCHEN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;;
+11CA7;MARCHEN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;;
+11CA9;MARCHEN SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;;
+11CAA;MARCHEN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;;;;
+11CAB;MARCHEN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;;
+11CAC;MARCHEN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;;
+11CAD;MARCHEN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;;
+11CAE;MARCHEN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;;
+11CAF;MARCHEN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;;
+11CB0;MARCHEN VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;;
+11CB1;MARCHEN VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+11CB2;MARCHEN VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+11CB3;MARCHEN VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+11CB4;MARCHEN VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+11CB5;MARCHEN SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+11CB6;MARCHEN SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;;
+12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;;
+12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;;
+12003;CUNEIFORM SIGN A TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12004;CUNEIFORM SIGN A TIMES HA;Lo;0;L;;;;;N;;;;;
+12005;CUNEIFORM SIGN A TIMES IGI;Lo;0;L;;;;;N;;;;;
+12006;CUNEIFORM SIGN A TIMES LAGAR GUNU;Lo;0;L;;;;;N;;;;;
+12007;CUNEIFORM SIGN A TIMES MUSH;Lo;0;L;;;;;N;;;;;
+12008;CUNEIFORM SIGN A TIMES SAG;Lo;0;L;;;;;N;;;;;
+12009;CUNEIFORM SIGN A2;Lo;0;L;;;;;N;;;;;
+1200A;CUNEIFORM SIGN AB;Lo;0;L;;;;;N;;;;;
+1200B;CUNEIFORM SIGN AB TIMES ASH2;Lo;0;L;;;;;N;;;;;
+1200C;CUNEIFORM SIGN AB TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;;
+1200D;CUNEIFORM SIGN AB TIMES GAL;Lo;0;L;;;;;N;;;;;
+1200E;CUNEIFORM SIGN AB TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1200F;CUNEIFORM SIGN AB TIMES HA;Lo;0;L;;;;;N;;;;;
+12010;CUNEIFORM SIGN AB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12011;CUNEIFORM SIGN AB TIMES IMIN;Lo;0;L;;;;;N;;;;;
+12012;CUNEIFORM SIGN AB TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+12013;CUNEIFORM SIGN AB TIMES SHESH;Lo;0;L;;;;;N;;;;;
+12014;CUNEIFORM SIGN AB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;;
+12015;CUNEIFORM SIGN AB GUNU;Lo;0;L;;;;;N;;;;;
+12016;CUNEIFORM SIGN AB2;Lo;0;L;;;;;N;;;;;
+12017;CUNEIFORM SIGN AB2 TIMES BALAG;Lo;0;L;;;;;N;;;;;
+12018;CUNEIFORM SIGN AB2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12019;CUNEIFORM SIGN AB2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+1201A;CUNEIFORM SIGN AB2 TIMES SHA3;Lo;0;L;;;;;N;;;;;
+1201B;CUNEIFORM SIGN AB2 TIMES TAK4;Lo;0;L;;;;;N;;;;;
+1201C;CUNEIFORM SIGN AD;Lo;0;L;;;;;N;;;;;
+1201D;CUNEIFORM SIGN AK;Lo;0;L;;;;;N;;;;;
+1201E;CUNEIFORM SIGN AK TIMES ERIN2;Lo;0;L;;;;;N;;;;;
+1201F;CUNEIFORM SIGN AK TIMES SHITA PLUS GISH;Lo;0;L;;;;;N;;;;;
+12020;CUNEIFORM SIGN AL;Lo;0;L;;;;;N;;;;;
+12021;CUNEIFORM SIGN AL TIMES AL;Lo;0;L;;;;;N;;;;;
+12022;CUNEIFORM SIGN AL TIMES DIM2;Lo;0;L;;;;;N;;;;;
+12023;CUNEIFORM SIGN AL TIMES GISH;Lo;0;L;;;;;N;;;;;
+12024;CUNEIFORM SIGN AL TIMES HA;Lo;0;L;;;;;N;;;;;
+12025;CUNEIFORM SIGN AL TIMES KAD3;Lo;0;L;;;;;N;;;;;
+12026;CUNEIFORM SIGN AL TIMES KI;Lo;0;L;;;;;N;;;;;
+12027;CUNEIFORM SIGN AL TIMES SHE;Lo;0;L;;;;;N;;;;;
+12028;CUNEIFORM SIGN AL TIMES USH;Lo;0;L;;;;;N;;;;;
+12029;CUNEIFORM SIGN ALAN;Lo;0;L;;;;;N;;;;;
+1202A;CUNEIFORM SIGN ALEPH;Lo;0;L;;;;;N;;;;;
+1202B;CUNEIFORM SIGN AMAR;Lo;0;L;;;;;N;;;;;
+1202C;CUNEIFORM SIGN AMAR TIMES SHE;Lo;0;L;;;;;N;;;;;
+1202D;CUNEIFORM SIGN AN;Lo;0;L;;;;;N;;;;;
+1202E;CUNEIFORM SIGN AN OVER AN;Lo;0;L;;;;;N;;;;;
+1202F;CUNEIFORM SIGN AN THREE TIMES;Lo;0;L;;;;;N;;;;;
+12030;CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA;Lo;0;L;;;;;N;;;;;
+12031;CUNEIFORM SIGN AN PLUS NAGA SQUARED;Lo;0;L;;;;;N;;;;;
+12032;CUNEIFORM SIGN ANSHE;Lo;0;L;;;;;N;;;;;
+12033;CUNEIFORM SIGN APIN;Lo;0;L;;;;;N;;;;;
+12034;CUNEIFORM SIGN ARAD;Lo;0;L;;;;;N;;;;;
+12035;CUNEIFORM SIGN ARAD TIMES KUR;Lo;0;L;;;;;N;;;;;
+12036;CUNEIFORM SIGN ARKAB;Lo;0;L;;;;;N;;;;;
+12037;CUNEIFORM SIGN ASAL2;Lo;0;L;;;;;N;;;;;
+12038;CUNEIFORM SIGN ASH;Lo;0;L;;;;;N;;;;;
+12039;CUNEIFORM SIGN ASH ZIDA TENU;Lo;0;L;;;;;N;;;;;
+1203A;CUNEIFORM SIGN ASH KABA TENU;Lo;0;L;;;;;N;;;;;
+1203B;CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP;Lo;0;L;;;;;N;;;;;
+1203C;CUNEIFORM SIGN ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;;
+1203D;CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;;
+1203E;CUNEIFORM SIGN ASH2;Lo;0;L;;;;;N;;;;;
+1203F;CUNEIFORM SIGN ASHGAB;Lo;0;L;;;;;N;;;;;
+12040;CUNEIFORM SIGN BA;Lo;0;L;;;;;N;;;;;
+12041;CUNEIFORM SIGN BAD;Lo;0;L;;;;;N;;;;;
+12042;CUNEIFORM SIGN BAG3;Lo;0;L;;;;;N;;;;;
+12043;CUNEIFORM SIGN BAHAR2;Lo;0;L;;;;;N;;;;;
+12044;CUNEIFORM SIGN BAL;Lo;0;L;;;;;N;;;;;
+12045;CUNEIFORM SIGN BAL OVER BAL;Lo;0;L;;;;;N;;;;;
+12046;CUNEIFORM SIGN BALAG;Lo;0;L;;;;;N;;;;;
+12047;CUNEIFORM SIGN BAR;Lo;0;L;;;;;N;;;;;
+12048;CUNEIFORM SIGN BARA2;Lo;0;L;;;;;N;;;;;
+12049;CUNEIFORM SIGN BI;Lo;0;L;;;;;N;;;;;
+1204A;CUNEIFORM SIGN BI TIMES A;Lo;0;L;;;;;N;;;;;
+1204B;CUNEIFORM SIGN BI TIMES GAR;Lo;0;L;;;;;N;;;;;
+1204C;CUNEIFORM SIGN BI TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+1204D;CUNEIFORM SIGN BU;Lo;0;L;;;;;N;;;;;
+1204E;CUNEIFORM SIGN BU OVER BU AB;Lo;0;L;;;;;N;;;;;
+1204F;CUNEIFORM SIGN BU OVER BU UN;Lo;0;L;;;;;N;;;;;
+12050;CUNEIFORM SIGN BU CROSSING BU;Lo;0;L;;;;;N;;;;;
+12051;CUNEIFORM SIGN BULUG;Lo;0;L;;;;;N;;;;;
+12052;CUNEIFORM SIGN BULUG OVER BULUG;Lo;0;L;;;;;N;;;;;
+12053;CUNEIFORM SIGN BUR;Lo;0;L;;;;;N;;;;;
+12054;CUNEIFORM SIGN BUR2;Lo;0;L;;;;;N;;;;;
+12055;CUNEIFORM SIGN DA;Lo;0;L;;;;;N;;;;;
+12056;CUNEIFORM SIGN DAG;Lo;0;L;;;;;N;;;;;
+12057;CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH;Lo;0;L;;;;;N;;;;;
+12058;CUNEIFORM SIGN DAG KISIM5 TIMES AMAR;Lo;0;L;;;;;N;;;;;
+12059;CUNEIFORM SIGN DAG KISIM5 TIMES BALAG;Lo;0;L;;;;;N;;;;;
+1205A;CUNEIFORM SIGN DAG KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;;
+1205B;CUNEIFORM SIGN DAG KISIM5 TIMES GA;Lo;0;L;;;;;N;;;;;
+1205C;CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH;Lo;0;L;;;;;N;;;;;
+1205D;CUNEIFORM SIGN DAG KISIM5 TIMES GI;Lo;0;L;;;;;N;;;;;
+1205E;CUNEIFORM SIGN DAG KISIM5 TIMES GIR2;Lo;0;L;;;;;N;;;;;
+1205F;CUNEIFORM SIGN DAG KISIM5 TIMES GUD;Lo;0;L;;;;;N;;;;;
+12060;CUNEIFORM SIGN DAG KISIM5 TIMES HA;Lo;0;L;;;;;N;;;;;
+12061;CUNEIFORM SIGN DAG KISIM5 TIMES IR;Lo;0;L;;;;;N;;;;;
+12062;CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU;Lo;0;L;;;;;N;;;;;
+12063;CUNEIFORM SIGN DAG KISIM5 TIMES KAK;Lo;0;L;;;;;N;;;;;
+12064;CUNEIFORM SIGN DAG KISIM5 TIMES LA;Lo;0;L;;;;;N;;;;;
+12065;CUNEIFORM SIGN DAG KISIM5 TIMES LU;Lo;0;L;;;;;N;;;;;
+12066;CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2;Lo;0;L;;;;;N;;;;;
+12067;CUNEIFORM SIGN DAG KISIM5 TIMES LUM;Lo;0;L;;;;;N;;;;;
+12068;CUNEIFORM SIGN DAG KISIM5 TIMES NE;Lo;0;L;;;;;N;;;;;
+12069;CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;;
+1206A;CUNEIFORM SIGN DAG KISIM5 TIMES SI;Lo;0;L;;;;;N;;;;;
+1206B;CUNEIFORM SIGN DAG KISIM5 TIMES TAK4;Lo;0;L;;;;;N;;;;;
+1206C;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2;Lo;0;L;;;;;N;;;;;
+1206D;CUNEIFORM SIGN DAG KISIM5 TIMES USH;Lo;0;L;;;;;N;;;;;
+1206E;CUNEIFORM SIGN DAM;Lo;0;L;;;;;N;;;;;
+1206F;CUNEIFORM SIGN DAR;Lo;0;L;;;;;N;;;;;
+12070;CUNEIFORM SIGN DARA3;Lo;0;L;;;;;N;;;;;
+12071;CUNEIFORM SIGN DARA4;Lo;0;L;;;;;N;;;;;
+12072;CUNEIFORM SIGN DI;Lo;0;L;;;;;N;;;;;
+12073;CUNEIFORM SIGN DIB;Lo;0;L;;;;;N;;;;;
+12074;CUNEIFORM SIGN DIM;Lo;0;L;;;;;N;;;;;
+12075;CUNEIFORM SIGN DIM TIMES SHE;Lo;0;L;;;;;N;;;;;
+12076;CUNEIFORM SIGN DIM2;Lo;0;L;;;;;N;;;;;
+12077;CUNEIFORM SIGN DIN;Lo;0;L;;;;;N;;;;;
+12078;CUNEIFORM SIGN DIN KASKAL U GUNU DISH;Lo;0;L;;;;;N;;;;;
+12079;CUNEIFORM SIGN DISH;Lo;0;L;;;;;N;;;;;
+1207A;CUNEIFORM SIGN DU;Lo;0;L;;;;;N;;;;;
+1207B;CUNEIFORM SIGN DU OVER DU;Lo;0;L;;;;;N;;;;;
+1207C;CUNEIFORM SIGN DU GUNU;Lo;0;L;;;;;N;;;;;
+1207D;CUNEIFORM SIGN DU SHESHIG;Lo;0;L;;;;;N;;;;;
+1207E;CUNEIFORM SIGN DUB;Lo;0;L;;;;;N;;;;;
+1207F;CUNEIFORM SIGN DUB TIMES ESH2;Lo;0;L;;;;;N;;;;;
+12080;CUNEIFORM SIGN DUB2;Lo;0;L;;;;;N;;;;;
+12081;CUNEIFORM SIGN DUG;Lo;0;L;;;;;N;;;;;
+12082;CUNEIFORM SIGN DUGUD;Lo;0;L;;;;;N;;;;;
+12083;CUNEIFORM SIGN DUH;Lo;0;L;;;;;N;;;;;
+12084;CUNEIFORM SIGN DUN;Lo;0;L;;;;;N;;;;;
+12085;CUNEIFORM SIGN DUN3;Lo;0;L;;;;;N;;;;;
+12086;CUNEIFORM SIGN DUN3 GUNU;Lo;0;L;;;;;N;;;;;
+12087;CUNEIFORM SIGN DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;;
+12088;CUNEIFORM SIGN DUN4;Lo;0;L;;;;;N;;;;;
+12089;CUNEIFORM SIGN DUR2;Lo;0;L;;;;;N;;;;;
+1208A;CUNEIFORM SIGN E;Lo;0;L;;;;;N;;;;;
+1208B;CUNEIFORM SIGN E TIMES PAP;Lo;0;L;;;;;N;;;;;
+1208C;CUNEIFORM SIGN E OVER E NUN OVER NUN;Lo;0;L;;;;;N;;;;;
+1208D;CUNEIFORM SIGN E2;Lo;0;L;;;;;N;;;;;
+1208E;CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA;Lo;0;L;;;;;N;;;;;
+1208F;CUNEIFORM SIGN E2 TIMES GAR;Lo;0;L;;;;;N;;;;;
+12090;CUNEIFORM SIGN E2 TIMES MI;Lo;0;L;;;;;N;;;;;
+12091;CUNEIFORM SIGN E2 TIMES SAL;Lo;0;L;;;;;N;;;;;
+12092;CUNEIFORM SIGN E2 TIMES SHE;Lo;0;L;;;;;N;;;;;
+12093;CUNEIFORM SIGN E2 TIMES U;Lo;0;L;;;;;N;;;;;
+12094;CUNEIFORM SIGN EDIN;Lo;0;L;;;;;N;;;;;
+12095;CUNEIFORM SIGN EGIR;Lo;0;L;;;;;N;;;;;
+12096;CUNEIFORM SIGN EL;Lo;0;L;;;;;N;;;;;
+12097;CUNEIFORM SIGN EN;Lo;0;L;;;;;N;;;;;
+12098;CUNEIFORM SIGN EN TIMES GAN2;Lo;0;L;;;;;N;;;;;
+12099;CUNEIFORM SIGN EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1209A;CUNEIFORM SIGN EN TIMES ME;Lo;0;L;;;;;N;;;;;
+1209B;CUNEIFORM SIGN EN CROSSING EN;Lo;0;L;;;;;N;;;;;
+1209C;CUNEIFORM SIGN EN OPPOSING EN;Lo;0;L;;;;;N;;;;;
+1209D;CUNEIFORM SIGN EN SQUARED;Lo;0;L;;;;;N;;;;;
+1209E;CUNEIFORM SIGN EREN;Lo;0;L;;;;;N;;;;;
+1209F;CUNEIFORM SIGN ERIN2;Lo;0;L;;;;;N;;;;;
+120A0;CUNEIFORM SIGN ESH2;Lo;0;L;;;;;N;;;;;
+120A1;CUNEIFORM SIGN EZEN;Lo;0;L;;;;;N;;;;;
+120A2;CUNEIFORM SIGN EZEN TIMES A;Lo;0;L;;;;;N;;;;;
+120A3;CUNEIFORM SIGN EZEN TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;;
+120A4;CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL;Lo;0;L;;;;;N;;;;;
+120A5;CUNEIFORM SIGN EZEN TIMES AN;Lo;0;L;;;;;N;;;;;
+120A6;CUNEIFORM SIGN EZEN TIMES BAD;Lo;0;L;;;;;N;;;;;
+120A7;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;;
+120A8;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;;
+120A9;CUNEIFORM SIGN EZEN TIMES HA;Lo;0;L;;;;;N;;;;;
+120AA;CUNEIFORM SIGN EZEN TIMES HA GUNU;Lo;0;L;;;;;N;;;;;
+120AB;CUNEIFORM SIGN EZEN TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+120AC;CUNEIFORM SIGN EZEN TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+120AD;CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED;Lo;0;L;;;;;N;;;;;
+120AE;CUNEIFORM SIGN EZEN TIMES KU3;Lo;0;L;;;;;N;;;;;
+120AF;CUNEIFORM SIGN EZEN TIMES LA;Lo;0;L;;;;;N;;;;;
+120B0;CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL;Lo;0;L;;;;;N;;;;;
+120B1;CUNEIFORM SIGN EZEN TIMES LI;Lo;0;L;;;;;N;;;;;
+120B2;CUNEIFORM SIGN EZEN TIMES LU;Lo;0;L;;;;;N;;;;;
+120B3;CUNEIFORM SIGN EZEN TIMES U2;Lo;0;L;;;;;N;;;;;
+120B4;CUNEIFORM SIGN EZEN TIMES UD;Lo;0;L;;;;;N;;;;;
+120B5;CUNEIFORM SIGN GA;Lo;0;L;;;;;N;;;;;
+120B6;CUNEIFORM SIGN GA GUNU;Lo;0;L;;;;;N;;;;;
+120B7;CUNEIFORM SIGN GA2;Lo;0;L;;;;;N;;;;;
+120B8;CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;;
+120B9;CUNEIFORM SIGN GA2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;;
+120BA;CUNEIFORM SIGN GA2 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;;
+120BB;CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB;Lo;0;L;;;;;N;;;;;
+120BC;CUNEIFORM SIGN GA2 TIMES AN;Lo;0;L;;;;;N;;;;;
+120BD;CUNEIFORM SIGN GA2 TIMES ASH;Lo;0;L;;;;;N;;;;;
+120BE;CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL;Lo;0;L;;;;;N;;;;;
+120BF;CUNEIFORM SIGN GA2 TIMES BAD;Lo;0;L;;;;;N;;;;;
+120C0;CUNEIFORM SIGN GA2 TIMES BAR PLUS RA;Lo;0;L;;;;;N;;;;;
+120C1;CUNEIFORM SIGN GA2 TIMES BUR;Lo;0;L;;;;;N;;;;;
+120C2;CUNEIFORM SIGN GA2 TIMES BUR PLUS RA;Lo;0;L;;;;;N;;;;;
+120C3;CUNEIFORM SIGN GA2 TIMES DA;Lo;0;L;;;;;N;;;;;
+120C4;CUNEIFORM SIGN GA2 TIMES DI;Lo;0;L;;;;;N;;;;;
+120C5;CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE;Lo;0;L;;;;;N;;;;;
+120C6;CUNEIFORM SIGN GA2 TIMES DUB;Lo;0;L;;;;;N;;;;;
+120C7;CUNEIFORM SIGN GA2 TIMES EL;Lo;0;L;;;;;N;;;;;
+120C8;CUNEIFORM SIGN GA2 TIMES EL PLUS LA;Lo;0;L;;;;;N;;;;;
+120C9;CUNEIFORM SIGN GA2 TIMES EN;Lo;0;L;;;;;N;;;;;
+120CA;CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+120CB;CUNEIFORM SIGN GA2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+120CC;CUNEIFORM SIGN GA2 TIMES GAR;Lo;0;L;;;;;N;;;;;
+120CD;CUNEIFORM SIGN GA2 TIMES GI;Lo;0;L;;;;;N;;;;;
+120CE;CUNEIFORM SIGN GA2 TIMES GI4;Lo;0;L;;;;;N;;;;;
+120CF;CUNEIFORM SIGN GA2 TIMES GI4 PLUS A;Lo;0;L;;;;;N;;;;;
+120D0;CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU;Lo;0;L;;;;;N;;;;;
+120D1;CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2;Lo;0;L;;;;;N;;;;;
+120D2;CUNEIFORM SIGN GA2 TIMES HAL;Lo;0;L;;;;;N;;;;;
+120D3;CUNEIFORM SIGN GA2 TIMES HAL PLUS LA;Lo;0;L;;;;;N;;;;;
+120D4;CUNEIFORM SIGN GA2 TIMES HI PLUS LI;Lo;0;L;;;;;N;;;;;
+120D5;CUNEIFORM SIGN GA2 TIMES HUB2;Lo;0;L;;;;;N;;;;;
+120D6;CUNEIFORM SIGN GA2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+120D7;CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH;Lo;0;L;;;;;N;;;;;
+120D8;CUNEIFORM SIGN GA2 TIMES KAK;Lo;0;L;;;;;N;;;;;
+120D9;CUNEIFORM SIGN GA2 TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+120DA;CUNEIFORM SIGN GA2 TIMES KID;Lo;0;L;;;;;N;;;;;
+120DB;CUNEIFORM SIGN GA2 TIMES KID PLUS LAL;Lo;0;L;;;;;N;;;;;
+120DC;CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN;Lo;0;L;;;;;N;;;;;
+120DD;CUNEIFORM SIGN GA2 TIMES LA;Lo;0;L;;;;;N;;;;;
+120DE;CUNEIFORM SIGN GA2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+120DF;CUNEIFORM SIGN GA2 TIMES MI;Lo;0;L;;;;;N;;;;;
+120E0;CUNEIFORM SIGN GA2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+120E1;CUNEIFORM SIGN GA2 TIMES NUN OVER NUN;Lo;0;L;;;;;N;;;;;
+120E2;CUNEIFORM SIGN GA2 TIMES PA;Lo;0;L;;;;;N;;;;;
+120E3;CUNEIFORM SIGN GA2 TIMES SAL;Lo;0;L;;;;;N;;;;;
+120E4;CUNEIFORM SIGN GA2 TIMES SAR;Lo;0;L;;;;;N;;;;;
+120E5;CUNEIFORM SIGN GA2 TIMES SHE;Lo;0;L;;;;;N;;;;;
+120E6;CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR;Lo;0;L;;;;;N;;;;;
+120E7;CUNEIFORM SIGN GA2 TIMES SHID;Lo;0;L;;;;;N;;;;;
+120E8;CUNEIFORM SIGN GA2 TIMES SUM;Lo;0;L;;;;;N;;;;;
+120E9;CUNEIFORM SIGN GA2 TIMES TAK4;Lo;0;L;;;;;N;;;;;
+120EA;CUNEIFORM SIGN GA2 TIMES U;Lo;0;L;;;;;N;;;;;
+120EB;CUNEIFORM SIGN GA2 TIMES UD;Lo;0;L;;;;;N;;;;;
+120EC;CUNEIFORM SIGN GA2 TIMES UD PLUS DU;Lo;0;L;;;;;N;;;;;
+120ED;CUNEIFORM SIGN GA2 OVER GA2;Lo;0;L;;;;;N;;;;;
+120EE;CUNEIFORM SIGN GABA;Lo;0;L;;;;;N;;;;;
+120EF;CUNEIFORM SIGN GABA CROSSING GABA;Lo;0;L;;;;;N;;;;;
+120F0;CUNEIFORM SIGN GAD;Lo;0;L;;;;;N;;;;;
+120F1;CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+120F2;CUNEIFORM SIGN GAL;Lo;0;L;;;;;N;;;;;
+120F3;CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+120F4;CUNEIFORM SIGN GALAM;Lo;0;L;;;;;N;;;;;
+120F5;CUNEIFORM SIGN GAM;Lo;0;L;;;;;N;;;;;
+120F6;CUNEIFORM SIGN GAN;Lo;0;L;;;;;N;;;;;
+120F7;CUNEIFORM SIGN GAN2;Lo;0;L;;;;;N;;;;;
+120F8;CUNEIFORM SIGN GAN2 TENU;Lo;0;L;;;;;N;;;;;
+120F9;CUNEIFORM SIGN GAN2 OVER GAN2;Lo;0;L;;;;;N;;;;;
+120FA;CUNEIFORM SIGN GAN2 CROSSING GAN2;Lo;0;L;;;;;N;;;;;
+120FB;CUNEIFORM SIGN GAR;Lo;0;L;;;;;N;;;;;
+120FC;CUNEIFORM SIGN GAR3;Lo;0;L;;;;;N;;;;;
+120FD;CUNEIFORM SIGN GASHAN;Lo;0;L;;;;;N;;;;;
+120FE;CUNEIFORM SIGN GESHTIN;Lo;0;L;;;;;N;;;;;
+120FF;CUNEIFORM SIGN GESHTIN TIMES KUR;Lo;0;L;;;;;N;;;;;
+12100;CUNEIFORM SIGN GI;Lo;0;L;;;;;N;;;;;
+12101;CUNEIFORM SIGN GI TIMES E;Lo;0;L;;;;;N;;;;;
+12102;CUNEIFORM SIGN GI TIMES U;Lo;0;L;;;;;N;;;;;
+12103;CUNEIFORM SIGN GI CROSSING GI;Lo;0;L;;;;;N;;;;;
+12104;CUNEIFORM SIGN GI4;Lo;0;L;;;;;N;;;;;
+12105;CUNEIFORM SIGN GI4 OVER GI4;Lo;0;L;;;;;N;;;;;
+12106;CUNEIFORM SIGN GI4 CROSSING GI4;Lo;0;L;;;;;N;;;;;
+12107;CUNEIFORM SIGN GIDIM;Lo;0;L;;;;;N;;;;;
+12108;CUNEIFORM SIGN GIR2;Lo;0;L;;;;;N;;;;;
+12109;CUNEIFORM SIGN GIR2 GUNU;Lo;0;L;;;;;N;;;;;
+1210A;CUNEIFORM SIGN GIR3;Lo;0;L;;;;;N;;;;;
+1210B;CUNEIFORM SIGN GIR3 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;;
+1210C;CUNEIFORM SIGN GIR3 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1210D;CUNEIFORM SIGN GIR3 TIMES IGI;Lo;0;L;;;;;N;;;;;
+1210E;CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI;Lo;0;L;;;;;N;;;;;
+1210F;CUNEIFORM SIGN GIR3 TIMES PA;Lo;0;L;;;;;N;;;;;
+12110;CUNEIFORM SIGN GISAL;Lo;0;L;;;;;N;;;;;
+12111;CUNEIFORM SIGN GISH;Lo;0;L;;;;;N;;;;;
+12112;CUNEIFORM SIGN GISH CROSSING GISH;Lo;0;L;;;;;N;;;;;
+12113;CUNEIFORM SIGN GISH TIMES BAD;Lo;0;L;;;;;N;;;;;
+12114;CUNEIFORM SIGN GISH TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12115;CUNEIFORM SIGN GISH TENU;Lo;0;L;;;;;N;;;;;
+12116;CUNEIFORM SIGN GU;Lo;0;L;;;;;N;;;;;
+12117;CUNEIFORM SIGN GU CROSSING GU;Lo;0;L;;;;;N;;;;;
+12118;CUNEIFORM SIGN GU2;Lo;0;L;;;;;N;;;;;
+12119;CUNEIFORM SIGN GU2 TIMES KAK;Lo;0;L;;;;;N;;;;;
+1211A;CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+1211B;CUNEIFORM SIGN GU2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+1211C;CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2;Lo;0;L;;;;;N;;;;;
+1211D;CUNEIFORM SIGN GU2 GUNU;Lo;0;L;;;;;N;;;;;
+1211E;CUNEIFORM SIGN GUD;Lo;0;L;;;;;N;;;;;
+1211F;CUNEIFORM SIGN GUD TIMES A PLUS KUR;Lo;0;L;;;;;N;;;;;
+12120;CUNEIFORM SIGN GUD TIMES KUR;Lo;0;L;;;;;N;;;;;
+12121;CUNEIFORM SIGN GUD OVER GUD LUGAL;Lo;0;L;;;;;N;;;;;
+12122;CUNEIFORM SIGN GUL;Lo;0;L;;;;;N;;;;;
+12123;CUNEIFORM SIGN GUM;Lo;0;L;;;;;N;;;;;
+12124;CUNEIFORM SIGN GUM TIMES SHE;Lo;0;L;;;;;N;;;;;
+12125;CUNEIFORM SIGN GUR;Lo;0;L;;;;;N;;;;;
+12126;CUNEIFORM SIGN GUR7;Lo;0;L;;;;;N;;;;;
+12127;CUNEIFORM SIGN GURUN;Lo;0;L;;;;;N;;;;;
+12128;CUNEIFORM SIGN GURUSH;Lo;0;L;;;;;N;;;;;
+12129;CUNEIFORM SIGN HA;Lo;0;L;;;;;N;;;;;
+1212A;CUNEIFORM SIGN HA TENU;Lo;0;L;;;;;N;;;;;
+1212B;CUNEIFORM SIGN HA GUNU;Lo;0;L;;;;;N;;;;;
+1212C;CUNEIFORM SIGN HAL;Lo;0;L;;;;;N;;;;;
+1212D;CUNEIFORM SIGN HI;Lo;0;L;;;;;N;;;;;
+1212E;CUNEIFORM SIGN HI TIMES ASH;Lo;0;L;;;;;N;;;;;
+1212F;CUNEIFORM SIGN HI TIMES ASH2;Lo;0;L;;;;;N;;;;;
+12130;CUNEIFORM SIGN HI TIMES BAD;Lo;0;L;;;;;N;;;;;
+12131;CUNEIFORM SIGN HI TIMES DISH;Lo;0;L;;;;;N;;;;;
+12132;CUNEIFORM SIGN HI TIMES GAD;Lo;0;L;;;;;N;;;;;
+12133;CUNEIFORM SIGN HI TIMES KIN;Lo;0;L;;;;;N;;;;;
+12134;CUNEIFORM SIGN HI TIMES NUN;Lo;0;L;;;;;N;;;;;
+12135;CUNEIFORM SIGN HI TIMES SHE;Lo;0;L;;;;;N;;;;;
+12136;CUNEIFORM SIGN HI TIMES U;Lo;0;L;;;;;N;;;;;
+12137;CUNEIFORM SIGN HU;Lo;0;L;;;;;N;;;;;
+12138;CUNEIFORM SIGN HUB2;Lo;0;L;;;;;N;;;;;
+12139;CUNEIFORM SIGN HUB2 TIMES AN;Lo;0;L;;;;;N;;;;;
+1213A;CUNEIFORM SIGN HUB2 TIMES HAL;Lo;0;L;;;;;N;;;;;
+1213B;CUNEIFORM SIGN HUB2 TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+1213C;CUNEIFORM SIGN HUB2 TIMES LISH;Lo;0;L;;;;;N;;;;;
+1213D;CUNEIFORM SIGN HUB2 TIMES UD;Lo;0;L;;;;;N;;;;;
+1213E;CUNEIFORM SIGN HUL2;Lo;0;L;;;;;N;;;;;
+1213F;CUNEIFORM SIGN I;Lo;0;L;;;;;N;;;;;
+12140;CUNEIFORM SIGN I A;Lo;0;L;;;;;N;;;;;
+12141;CUNEIFORM SIGN IB;Lo;0;L;;;;;N;;;;;
+12142;CUNEIFORM SIGN IDIM;Lo;0;L;;;;;N;;;;;
+12143;CUNEIFORM SIGN IDIM OVER IDIM BUR;Lo;0;L;;;;;N;;;;;
+12144;CUNEIFORM SIGN IDIM OVER IDIM SQUARED;Lo;0;L;;;;;N;;;;;
+12145;CUNEIFORM SIGN IG;Lo;0;L;;;;;N;;;;;
+12146;CUNEIFORM SIGN IGI;Lo;0;L;;;;;N;;;;;
+12147;CUNEIFORM SIGN IGI DIB;Lo;0;L;;;;;N;;;;;
+12148;CUNEIFORM SIGN IGI RI;Lo;0;L;;;;;N;;;;;
+12149;CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD;Lo;0;L;;;;;N;;;;;
+1214A;CUNEIFORM SIGN IGI GUNU;Lo;0;L;;;;;N;;;;;
+1214B;CUNEIFORM SIGN IL;Lo;0;L;;;;;N;;;;;
+1214C;CUNEIFORM SIGN IL TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1214D;CUNEIFORM SIGN IL2;Lo;0;L;;;;;N;;;;;
+1214E;CUNEIFORM SIGN IM;Lo;0;L;;;;;N;;;;;
+1214F;CUNEIFORM SIGN IM TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12150;CUNEIFORM SIGN IM CROSSING IM;Lo;0;L;;;;;N;;;;;
+12151;CUNEIFORM SIGN IM OPPOSING IM;Lo;0;L;;;;;N;;;;;
+12152;CUNEIFORM SIGN IM SQUARED;Lo;0;L;;;;;N;;;;;
+12153;CUNEIFORM SIGN IMIN;Lo;0;L;;;;;N;;;;;
+12154;CUNEIFORM SIGN IN;Lo;0;L;;;;;N;;;;;
+12155;CUNEIFORM SIGN IR;Lo;0;L;;;;;N;;;;;
+12156;CUNEIFORM SIGN ISH;Lo;0;L;;;;;N;;;;;
+12157;CUNEIFORM SIGN KA;Lo;0;L;;;;;N;;;;;
+12158;CUNEIFORM SIGN KA TIMES A;Lo;0;L;;;;;N;;;;;
+12159;CUNEIFORM SIGN KA TIMES AD;Lo;0;L;;;;;N;;;;;
+1215A;CUNEIFORM SIGN KA TIMES AD PLUS KU3;Lo;0;L;;;;;N;;;;;
+1215B;CUNEIFORM SIGN KA TIMES ASH2;Lo;0;L;;;;;N;;;;;
+1215C;CUNEIFORM SIGN KA TIMES BAD;Lo;0;L;;;;;N;;;;;
+1215D;CUNEIFORM SIGN KA TIMES BALAG;Lo;0;L;;;;;N;;;;;
+1215E;CUNEIFORM SIGN KA TIMES BAR;Lo;0;L;;;;;N;;;;;
+1215F;CUNEIFORM SIGN KA TIMES BI;Lo;0;L;;;;;N;;;;;
+12160;CUNEIFORM SIGN KA TIMES ERIN2;Lo;0;L;;;;;N;;;;;
+12161;CUNEIFORM SIGN KA TIMES ESH2;Lo;0;L;;;;;N;;;;;
+12162;CUNEIFORM SIGN KA TIMES GA;Lo;0;L;;;;;N;;;;;
+12163;CUNEIFORM SIGN KA TIMES GAL;Lo;0;L;;;;;N;;;;;
+12164;CUNEIFORM SIGN KA TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12165;CUNEIFORM SIGN KA TIMES GAR;Lo;0;L;;;;;N;;;;;
+12166;CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A;Lo;0;L;;;;;N;;;;;
+12167;CUNEIFORM SIGN KA TIMES GI;Lo;0;L;;;;;N;;;;;
+12168;CUNEIFORM SIGN KA TIMES GIR2;Lo;0;L;;;;;N;;;;;
+12169;CUNEIFORM SIGN KA TIMES GISH PLUS SAR;Lo;0;L;;;;;N;;;;;
+1216A;CUNEIFORM SIGN KA TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;;
+1216B;CUNEIFORM SIGN KA TIMES GU;Lo;0;L;;;;;N;;;;;
+1216C;CUNEIFORM SIGN KA TIMES GUR7;Lo;0;L;;;;;N;;;;;
+1216D;CUNEIFORM SIGN KA TIMES IGI;Lo;0;L;;;;;N;;;;;
+1216E;CUNEIFORM SIGN KA TIMES IM;Lo;0;L;;;;;N;;;;;
+1216F;CUNEIFORM SIGN KA TIMES KAK;Lo;0;L;;;;;N;;;;;
+12170;CUNEIFORM SIGN KA TIMES KI;Lo;0;L;;;;;N;;;;;
+12171;CUNEIFORM SIGN KA TIMES KID;Lo;0;L;;;;;N;;;;;
+12172;CUNEIFORM SIGN KA TIMES LI;Lo;0;L;;;;;N;;;;;
+12173;CUNEIFORM SIGN KA TIMES LU;Lo;0;L;;;;;N;;;;;
+12174;CUNEIFORM SIGN KA TIMES ME;Lo;0;L;;;;;N;;;;;
+12175;CUNEIFORM SIGN KA TIMES ME PLUS DU;Lo;0;L;;;;;N;;;;;
+12176;CUNEIFORM SIGN KA TIMES ME PLUS GI;Lo;0;L;;;;;N;;;;;
+12177;CUNEIFORM SIGN KA TIMES ME PLUS TE;Lo;0;L;;;;;N;;;;;
+12178;CUNEIFORM SIGN KA TIMES MI;Lo;0;L;;;;;N;;;;;
+12179;CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ;Lo;0;L;;;;;N;;;;;
+1217A;CUNEIFORM SIGN KA TIMES NE;Lo;0;L;;;;;N;;;;;
+1217B;CUNEIFORM SIGN KA TIMES NUN;Lo;0;L;;;;;N;;;;;
+1217C;CUNEIFORM SIGN KA TIMES PI;Lo;0;L;;;;;N;;;;;
+1217D;CUNEIFORM SIGN KA TIMES RU;Lo;0;L;;;;;N;;;;;
+1217E;CUNEIFORM SIGN KA TIMES SA;Lo;0;L;;;;;N;;;;;
+1217F;CUNEIFORM SIGN KA TIMES SAR;Lo;0;L;;;;;N;;;;;
+12180;CUNEIFORM SIGN KA TIMES SHA;Lo;0;L;;;;;N;;;;;
+12181;CUNEIFORM SIGN KA TIMES SHE;Lo;0;L;;;;;N;;;;;
+12182;CUNEIFORM SIGN KA TIMES SHID;Lo;0;L;;;;;N;;;;;
+12183;CUNEIFORM SIGN KA TIMES SHU;Lo;0;L;;;;;N;;;;;
+12184;CUNEIFORM SIGN KA TIMES SIG;Lo;0;L;;;;;N;;;;;
+12185;CUNEIFORM SIGN KA TIMES SUHUR;Lo;0;L;;;;;N;;;;;
+12186;CUNEIFORM SIGN KA TIMES TAR;Lo;0;L;;;;;N;;;;;
+12187;CUNEIFORM SIGN KA TIMES U;Lo;0;L;;;;;N;;;;;
+12188;CUNEIFORM SIGN KA TIMES U2;Lo;0;L;;;;;N;;;;;
+12189;CUNEIFORM SIGN KA TIMES UD;Lo;0;L;;;;;N;;;;;
+1218A;CUNEIFORM SIGN KA TIMES UMUM TIMES PA;Lo;0;L;;;;;N;;;;;
+1218B;CUNEIFORM SIGN KA TIMES USH;Lo;0;L;;;;;N;;;;;
+1218C;CUNEIFORM SIGN KA TIMES ZI;Lo;0;L;;;;;N;;;;;
+1218D;CUNEIFORM SIGN KA2;Lo;0;L;;;;;N;;;;;
+1218E;CUNEIFORM SIGN KA2 CROSSING KA2;Lo;0;L;;;;;N;;;;;
+1218F;CUNEIFORM SIGN KAB;Lo;0;L;;;;;N;;;;;
+12190;CUNEIFORM SIGN KAD2;Lo;0;L;;;;;N;;;;;
+12191;CUNEIFORM SIGN KAD3;Lo;0;L;;;;;N;;;;;
+12192;CUNEIFORM SIGN KAD4;Lo;0;L;;;;;N;;;;;
+12193;CUNEIFORM SIGN KAD5;Lo;0;L;;;;;N;;;;;
+12194;CUNEIFORM SIGN KAD5 OVER KAD5;Lo;0;L;;;;;N;;;;;
+12195;CUNEIFORM SIGN KAK;Lo;0;L;;;;;N;;;;;
+12196;CUNEIFORM SIGN KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12197;CUNEIFORM SIGN KAL;Lo;0;L;;;;;N;;;;;
+12198;CUNEIFORM SIGN KAL TIMES BAD;Lo;0;L;;;;;N;;;;;
+12199;CUNEIFORM SIGN KAL CROSSING KAL;Lo;0;L;;;;;N;;;;;
+1219A;CUNEIFORM SIGN KAM2;Lo;0;L;;;;;N;;;;;
+1219B;CUNEIFORM SIGN KAM4;Lo;0;L;;;;;N;;;;;
+1219C;CUNEIFORM SIGN KASKAL;Lo;0;L;;;;;N;;;;;
+1219D;CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;;
+1219E;CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;;
+1219F;CUNEIFORM SIGN KESH2;Lo;0;L;;;;;N;;;;;
+121A0;CUNEIFORM SIGN KI;Lo;0;L;;;;;N;;;;;
+121A1;CUNEIFORM SIGN KI TIMES BAD;Lo;0;L;;;;;N;;;;;
+121A2;CUNEIFORM SIGN KI TIMES U;Lo;0;L;;;;;N;;;;;
+121A3;CUNEIFORM SIGN KI TIMES UD;Lo;0;L;;;;;N;;;;;
+121A4;CUNEIFORM SIGN KID;Lo;0;L;;;;;N;;;;;
+121A5;CUNEIFORM SIGN KIN;Lo;0;L;;;;;N;;;;;
+121A6;CUNEIFORM SIGN KISAL;Lo;0;L;;;;;N;;;;;
+121A7;CUNEIFORM SIGN KISH;Lo;0;L;;;;;N;;;;;
+121A8;CUNEIFORM SIGN KISIM5;Lo;0;L;;;;;N;;;;;
+121A9;CUNEIFORM SIGN KISIM5 OVER KISIM5;Lo;0;L;;;;;N;;;;;
+121AA;CUNEIFORM SIGN KU;Lo;0;L;;;;;N;;;;;
+121AB;CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2;Lo;0;L;;;;;N;;;;;
+121AC;CUNEIFORM SIGN KU3;Lo;0;L;;;;;N;;;;;
+121AD;CUNEIFORM SIGN KU4;Lo;0;L;;;;;N;;;;;
+121AE;CUNEIFORM SIGN KU4 VARIANT FORM;Lo;0;L;;;;;N;;;;;
+121AF;CUNEIFORM SIGN KU7;Lo;0;L;;;;;N;;;;;
+121B0;CUNEIFORM SIGN KUL;Lo;0;L;;;;;N;;;;;
+121B1;CUNEIFORM SIGN KUL GUNU;Lo;0;L;;;;;N;;;;;
+121B2;CUNEIFORM SIGN KUN;Lo;0;L;;;;;N;;;;;
+121B3;CUNEIFORM SIGN KUR;Lo;0;L;;;;;N;;;;;
+121B4;CUNEIFORM SIGN KUR OPPOSING KUR;Lo;0;L;;;;;N;;;;;
+121B5;CUNEIFORM SIGN KUSHU2;Lo;0;L;;;;;N;;;;;
+121B6;CUNEIFORM SIGN KWU318;Lo;0;L;;;;;N;;;;;
+121B7;CUNEIFORM SIGN LA;Lo;0;L;;;;;N;;;;;
+121B8;CUNEIFORM SIGN LAGAB;Lo;0;L;;;;;N;;;;;
+121B9;CUNEIFORM SIGN LAGAB TIMES A;Lo;0;L;;;;;N;;;;;
+121BA;CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;;
+121BB;CUNEIFORM SIGN LAGAB TIMES A PLUS GAR;Lo;0;L;;;;;N;;;;;
+121BC;CUNEIFORM SIGN LAGAB TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;;
+121BD;CUNEIFORM SIGN LAGAB TIMES AL;Lo;0;L;;;;;N;;;;;
+121BE;CUNEIFORM SIGN LAGAB TIMES AN;Lo;0;L;;;;;N;;;;;
+121BF;CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU;Lo;0;L;;;;;N;;;;;
+121C0;CUNEIFORM SIGN LAGAB TIMES BAD;Lo;0;L;;;;;N;;;;;
+121C1;CUNEIFORM SIGN LAGAB TIMES BI;Lo;0;L;;;;;N;;;;;
+121C2;CUNEIFORM SIGN LAGAB TIMES DAR;Lo;0;L;;;;;N;;;;;
+121C3;CUNEIFORM SIGN LAGAB TIMES EN;Lo;0;L;;;;;N;;;;;
+121C4;CUNEIFORM SIGN LAGAB TIMES GA;Lo;0;L;;;;;N;;;;;
+121C5;CUNEIFORM SIGN LAGAB TIMES GAR;Lo;0;L;;;;;N;;;;;
+121C6;CUNEIFORM SIGN LAGAB TIMES GUD;Lo;0;L;;;;;N;;;;;
+121C7;CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD;Lo;0;L;;;;;N;;;;;
+121C8;CUNEIFORM SIGN LAGAB TIMES HA;Lo;0;L;;;;;N;;;;;
+121C9;CUNEIFORM SIGN LAGAB TIMES HAL;Lo;0;L;;;;;N;;;;;
+121CA;CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN;Lo;0;L;;;;;N;;;;;
+121CB;CUNEIFORM SIGN LAGAB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+121CC;CUNEIFORM SIGN LAGAB TIMES IM;Lo;0;L;;;;;N;;;;;
+121CD;CUNEIFORM SIGN LAGAB TIMES IM PLUS HA;Lo;0;L;;;;;N;;;;;
+121CE;CUNEIFORM SIGN LAGAB TIMES IM PLUS LU;Lo;0;L;;;;;N;;;;;
+121CF;CUNEIFORM SIGN LAGAB TIMES KI;Lo;0;L;;;;;N;;;;;
+121D0;CUNEIFORM SIGN LAGAB TIMES KIN;Lo;0;L;;;;;N;;;;;
+121D1;CUNEIFORM SIGN LAGAB TIMES KU3;Lo;0;L;;;;;N;;;;;
+121D2;CUNEIFORM SIGN LAGAB TIMES KUL;Lo;0;L;;;;;N;;;;;
+121D3;CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A;Lo;0;L;;;;;N;;;;;
+121D4;CUNEIFORM SIGN LAGAB TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+121D5;CUNEIFORM SIGN LAGAB TIMES LISH;Lo;0;L;;;;;N;;;;;
+121D6;CUNEIFORM SIGN LAGAB TIMES LU;Lo;0;L;;;;;N;;;;;
+121D7;CUNEIFORM SIGN LAGAB TIMES LUL;Lo;0;L;;;;;N;;;;;
+121D8;CUNEIFORM SIGN LAGAB TIMES ME;Lo;0;L;;;;;N;;;;;
+121D9;CUNEIFORM SIGN LAGAB TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+121DA;CUNEIFORM SIGN LAGAB TIMES MUSH;Lo;0;L;;;;;N;;;;;
+121DB;CUNEIFORM SIGN LAGAB TIMES NE;Lo;0;L;;;;;N;;;;;
+121DC;CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;;
+121DD;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2;Lo;0;L;;;;;N;;;;;
+121DE;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU;Lo;0;L;;;;;N;;;;;
+121DF;CUNEIFORM SIGN LAGAB TIMES SHU2;Lo;0;L;;;;;N;;;;;
+121E0;CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2;Lo;0;L;;;;;N;;;;;
+121E1;CUNEIFORM SIGN LAGAB TIMES SUM;Lo;0;L;;;;;N;;;;;
+121E2;CUNEIFORM SIGN LAGAB TIMES TAG;Lo;0;L;;;;;N;;;;;
+121E3;CUNEIFORM SIGN LAGAB TIMES TAK4;Lo;0;L;;;;;N;;;;;
+121E4;CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA;Lo;0;L;;;;;N;;;;;
+121E5;CUNEIFORM SIGN LAGAB TIMES U;Lo;0;L;;;;;N;;;;;
+121E6;CUNEIFORM SIGN LAGAB TIMES U PLUS A;Lo;0;L;;;;;N;;;;;
+121E7;CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;;
+121E8;CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;;
+121E9;CUNEIFORM SIGN LAGAB TIMES UD;Lo;0;L;;;;;N;;;;;
+121EA;CUNEIFORM SIGN LAGAB TIMES USH;Lo;0;L;;;;;N;;;;;
+121EB;CUNEIFORM SIGN LAGAB SQUARED;Lo;0;L;;;;;N;;;;;
+121EC;CUNEIFORM SIGN LAGAR;Lo;0;L;;;;;N;;;;;
+121ED;CUNEIFORM SIGN LAGAR TIMES SHE;Lo;0;L;;;;;N;;;;;
+121EE;CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;;
+121EF;CUNEIFORM SIGN LAGAR GUNU;Lo;0;L;;;;;N;;;;;
+121F0;CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE;Lo;0;L;;;;;N;;;;;
+121F1;CUNEIFORM SIGN LAHSHU;Lo;0;L;;;;;N;;;;;
+121F2;CUNEIFORM SIGN LAL;Lo;0;L;;;;;N;;;;;
+121F3;CUNEIFORM SIGN LAL TIMES LAL;Lo;0;L;;;;;N;;;;;
+121F4;CUNEIFORM SIGN LAM;Lo;0;L;;;;;N;;;;;
+121F5;CUNEIFORM SIGN LAM TIMES KUR;Lo;0;L;;;;;N;;;;;
+121F6;CUNEIFORM SIGN LAM TIMES KUR PLUS RU;Lo;0;L;;;;;N;;;;;
+121F7;CUNEIFORM SIGN LI;Lo;0;L;;;;;N;;;;;
+121F8;CUNEIFORM SIGN LIL;Lo;0;L;;;;;N;;;;;
+121F9;CUNEIFORM SIGN LIMMU2;Lo;0;L;;;;;N;;;;;
+121FA;CUNEIFORM SIGN LISH;Lo;0;L;;;;;N;;;;;
+121FB;CUNEIFORM SIGN LU;Lo;0;L;;;;;N;;;;;
+121FC;CUNEIFORM SIGN LU TIMES BAD;Lo;0;L;;;;;N;;;;;
+121FD;CUNEIFORM SIGN LU2;Lo;0;L;;;;;N;;;;;
+121FE;CUNEIFORM SIGN LU2 TIMES AL;Lo;0;L;;;;;N;;;;;
+121FF;CUNEIFORM SIGN LU2 TIMES BAD;Lo;0;L;;;;;N;;;;;
+12200;CUNEIFORM SIGN LU2 TIMES ESH2;Lo;0;L;;;;;N;;;;;
+12201;CUNEIFORM SIGN LU2 TIMES ESH2 TENU;Lo;0;L;;;;;N;;;;;
+12202;CUNEIFORM SIGN LU2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12203;CUNEIFORM SIGN LU2 TIMES HI TIMES BAD;Lo;0;L;;;;;N;;;;;
+12204;CUNEIFORM SIGN LU2 TIMES IM;Lo;0;L;;;;;N;;;;;
+12205;CUNEIFORM SIGN LU2 TIMES KAD2;Lo;0;L;;;;;N;;;;;
+12206;CUNEIFORM SIGN LU2 TIMES KAD3;Lo;0;L;;;;;N;;;;;
+12207;CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH;Lo;0;L;;;;;N;;;;;
+12208;CUNEIFORM SIGN LU2 TIMES KI;Lo;0;L;;;;;N;;;;;
+12209;CUNEIFORM SIGN LU2 TIMES LA PLUS ASH;Lo;0;L;;;;;N;;;;;
+1220A;CUNEIFORM SIGN LU2 TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+1220B;CUNEIFORM SIGN LU2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+1220C;CUNEIFORM SIGN LU2 TIMES NE;Lo;0;L;;;;;N;;;;;
+1220D;CUNEIFORM SIGN LU2 TIMES NU;Lo;0;L;;;;;N;;;;;
+1220E;CUNEIFORM SIGN LU2 TIMES SI PLUS ASH;Lo;0;L;;;;;N;;;;;
+1220F;CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU;Lo;0;L;;;;;N;;;;;
+12210;CUNEIFORM SIGN LU2 TIMES TUG2;Lo;0;L;;;;;N;;;;;
+12211;CUNEIFORM SIGN LU2 TENU;Lo;0;L;;;;;N;;;;;
+12212;CUNEIFORM SIGN LU2 CROSSING LU2;Lo;0;L;;;;;N;;;;;
+12213;CUNEIFORM SIGN LU2 OPPOSING LU2;Lo;0;L;;;;;N;;;;;
+12214;CUNEIFORM SIGN LU2 SQUARED;Lo;0;L;;;;;N;;;;;
+12215;CUNEIFORM SIGN LU2 SHESHIG;Lo;0;L;;;;;N;;;;;
+12216;CUNEIFORM SIGN LU3;Lo;0;L;;;;;N;;;;;
+12217;CUNEIFORM SIGN LUGAL;Lo;0;L;;;;;N;;;;;
+12218;CUNEIFORM SIGN LUGAL OVER LUGAL;Lo;0;L;;;;;N;;;;;
+12219;CUNEIFORM SIGN LUGAL OPPOSING LUGAL;Lo;0;L;;;;;N;;;;;
+1221A;CUNEIFORM SIGN LUGAL SHESHIG;Lo;0;L;;;;;N;;;;;
+1221B;CUNEIFORM SIGN LUH;Lo;0;L;;;;;N;;;;;
+1221C;CUNEIFORM SIGN LUL;Lo;0;L;;;;;N;;;;;
+1221D;CUNEIFORM SIGN LUM;Lo;0;L;;;;;N;;;;;
+1221E;CUNEIFORM SIGN LUM OVER LUM;Lo;0;L;;;;;N;;;;;
+1221F;CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+12220;CUNEIFORM SIGN MA;Lo;0;L;;;;;N;;;;;
+12221;CUNEIFORM SIGN MA TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12222;CUNEIFORM SIGN MA GUNU;Lo;0;L;;;;;N;;;;;
+12223;CUNEIFORM SIGN MA2;Lo;0;L;;;;;N;;;;;
+12224;CUNEIFORM SIGN MAH;Lo;0;L;;;;;N;;;;;
+12225;CUNEIFORM SIGN MAR;Lo;0;L;;;;;N;;;;;
+12226;CUNEIFORM SIGN MASH;Lo;0;L;;;;;N;;;;;
+12227;CUNEIFORM SIGN MASH2;Lo;0;L;;;;;N;;;;;
+12228;CUNEIFORM SIGN ME;Lo;0;L;;;;;N;;;;;
+12229;CUNEIFORM SIGN MES;Lo;0;L;;;;;N;;;;;
+1222A;CUNEIFORM SIGN MI;Lo;0;L;;;;;N;;;;;
+1222B;CUNEIFORM SIGN MIN;Lo;0;L;;;;;N;;;;;
+1222C;CUNEIFORM SIGN MU;Lo;0;L;;;;;N;;;;;
+1222D;CUNEIFORM SIGN MU OVER MU;Lo;0;L;;;;;N;;;;;
+1222E;CUNEIFORM SIGN MUG;Lo;0;L;;;;;N;;;;;
+1222F;CUNEIFORM SIGN MUG GUNU;Lo;0;L;;;;;N;;;;;
+12230;CUNEIFORM SIGN MUNSUB;Lo;0;L;;;;;N;;;;;
+12231;CUNEIFORM SIGN MURGU2;Lo;0;L;;;;;N;;;;;
+12232;CUNEIFORM SIGN MUSH;Lo;0;L;;;;;N;;;;;
+12233;CUNEIFORM SIGN MUSH TIMES A;Lo;0;L;;;;;N;;;;;
+12234;CUNEIFORM SIGN MUSH TIMES KUR;Lo;0;L;;;;;N;;;;;
+12235;CUNEIFORM SIGN MUSH TIMES ZA;Lo;0;L;;;;;N;;;;;
+12236;CUNEIFORM SIGN MUSH OVER MUSH;Lo;0;L;;;;;N;;;;;
+12237;CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA;Lo;0;L;;;;;N;;;;;
+12238;CUNEIFORM SIGN MUSH CROSSING MUSH;Lo;0;L;;;;;N;;;;;
+12239;CUNEIFORM SIGN MUSH3;Lo;0;L;;;;;N;;;;;
+1223A;CUNEIFORM SIGN MUSH3 TIMES A;Lo;0;L;;;;;N;;;;;
+1223B;CUNEIFORM SIGN MUSH3 TIMES A PLUS DI;Lo;0;L;;;;;N;;;;;
+1223C;CUNEIFORM SIGN MUSH3 TIMES DI;Lo;0;L;;;;;N;;;;;
+1223D;CUNEIFORM SIGN MUSH3 GUNU;Lo;0;L;;;;;N;;;;;
+1223E;CUNEIFORM SIGN NA;Lo;0;L;;;;;N;;;;;
+1223F;CUNEIFORM SIGN NA2;Lo;0;L;;;;;N;;;;;
+12240;CUNEIFORM SIGN NAGA;Lo;0;L;;;;;N;;;;;
+12241;CUNEIFORM SIGN NAGA INVERTED;Lo;0;L;;;;;N;;;;;
+12242;CUNEIFORM SIGN NAGA TIMES SHU TENU;Lo;0;L;;;;;N;;;;;
+12243;CUNEIFORM SIGN NAGA OPPOSING NAGA;Lo;0;L;;;;;N;;;;;
+12244;CUNEIFORM SIGN NAGAR;Lo;0;L;;;;;N;;;;;
+12245;CUNEIFORM SIGN NAM NUTILLU;Lo;0;L;;;;;N;;;;;
+12246;CUNEIFORM SIGN NAM;Lo;0;L;;;;;N;;;;;
+12247;CUNEIFORM SIGN NAM2;Lo;0;L;;;;;N;;;;;
+12248;CUNEIFORM SIGN NE;Lo;0;L;;;;;N;;;;;
+12249;CUNEIFORM SIGN NE TIMES A;Lo;0;L;;;;;N;;;;;
+1224A;CUNEIFORM SIGN NE TIMES UD;Lo;0;L;;;;;N;;;;;
+1224B;CUNEIFORM SIGN NE SHESHIG;Lo;0;L;;;;;N;;;;;
+1224C;CUNEIFORM SIGN NI;Lo;0;L;;;;;N;;;;;
+1224D;CUNEIFORM SIGN NI TIMES E;Lo;0;L;;;;;N;;;;;
+1224E;CUNEIFORM SIGN NI2;Lo;0;L;;;;;N;;;;;
+1224F;CUNEIFORM SIGN NIM;Lo;0;L;;;;;N;;;;;
+12250;CUNEIFORM SIGN NIM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12251;CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12252;CUNEIFORM SIGN NINDA2;Lo;0;L;;;;;N;;;;;
+12253;CUNEIFORM SIGN NINDA2 TIMES AN;Lo;0;L;;;;;N;;;;;
+12254;CUNEIFORM SIGN NINDA2 TIMES ASH;Lo;0;L;;;;;N;;;;;
+12255;CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH;Lo;0;L;;;;;N;;;;;
+12256;CUNEIFORM SIGN NINDA2 TIMES GUD;Lo;0;L;;;;;N;;;;;
+12257;CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12258;CUNEIFORM SIGN NINDA2 TIMES NE;Lo;0;L;;;;;N;;;;;
+12259;CUNEIFORM SIGN NINDA2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+1225A;CUNEIFORM SIGN NINDA2 TIMES SHE;Lo;0;L;;;;;N;;;;;
+1225B;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN;Lo;0;L;;;;;N;;;;;
+1225C;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH;Lo;0;L;;;;;N;;;;;
+1225D;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH;Lo;0;L;;;;;N;;;;;
+1225E;CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;;
+1225F;CUNEIFORM SIGN NINDA2 TIMES USH;Lo;0;L;;;;;N;;;;;
+12260;CUNEIFORM SIGN NISAG;Lo;0;L;;;;;N;;;;;
+12261;CUNEIFORM SIGN NU;Lo;0;L;;;;;N;;;;;
+12262;CUNEIFORM SIGN NU11;Lo;0;L;;;;;N;;;;;
+12263;CUNEIFORM SIGN NUN;Lo;0;L;;;;;N;;;;;
+12264;CUNEIFORM SIGN NUN LAGAR TIMES GAR;Lo;0;L;;;;;N;;;;;
+12265;CUNEIFORM SIGN NUN LAGAR TIMES MASH;Lo;0;L;;;;;N;;;;;
+12266;CUNEIFORM SIGN NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;;
+12267;CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;;
+12268;CUNEIFORM SIGN NUN LAGAR TIMES USH;Lo;0;L;;;;;N;;;;;
+12269;CUNEIFORM SIGN NUN TENU;Lo;0;L;;;;;N;;;;;
+1226A;CUNEIFORM SIGN NUN OVER NUN;Lo;0;L;;;;;N;;;;;
+1226B;CUNEIFORM SIGN NUN CROSSING NUN;Lo;0;L;;;;;N;;;;;
+1226C;CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR;Lo;0;L;;;;;N;;;;;
+1226D;CUNEIFORM SIGN NUNUZ;Lo;0;L;;;;;N;;;;;
+1226E;CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB;Lo;0;L;;;;;N;;;;;
+1226F;CUNEIFORM SIGN NUNUZ AB2 TIMES BI;Lo;0;L;;;;;N;;;;;
+12270;CUNEIFORM SIGN NUNUZ AB2 TIMES DUG;Lo;0;L;;;;;N;;;;;
+12271;CUNEIFORM SIGN NUNUZ AB2 TIMES GUD;Lo;0;L;;;;;N;;;;;
+12272;CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12273;CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3;Lo;0;L;;;;;N;;;;;
+12274;CUNEIFORM SIGN NUNUZ AB2 TIMES LA;Lo;0;L;;;;;N;;;;;
+12275;CUNEIFORM SIGN NUNUZ AB2 TIMES NE;Lo;0;L;;;;;N;;;;;
+12276;CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3;Lo;0;L;;;;;N;;;;;
+12277;CUNEIFORM SIGN NUNUZ AB2 TIMES U2;Lo;0;L;;;;;N;;;;;
+12278;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;;
+12279;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U;Lo;0;L;;;;;N;;;;;
+1227A;CUNEIFORM SIGN PA;Lo;0;L;;;;;N;;;;;
+1227B;CUNEIFORM SIGN PAD;Lo;0;L;;;;;N;;;;;
+1227C;CUNEIFORM SIGN PAN;Lo;0;L;;;;;N;;;;;
+1227D;CUNEIFORM SIGN PAP;Lo;0;L;;;;;N;;;;;
+1227E;CUNEIFORM SIGN PESH2;Lo;0;L;;;;;N;;;;;
+1227F;CUNEIFORM SIGN PI;Lo;0;L;;;;;N;;;;;
+12280;CUNEIFORM SIGN PI TIMES A;Lo;0;L;;;;;N;;;;;
+12281;CUNEIFORM SIGN PI TIMES AB;Lo;0;L;;;;;N;;;;;
+12282;CUNEIFORM SIGN PI TIMES BI;Lo;0;L;;;;;N;;;;;
+12283;CUNEIFORM SIGN PI TIMES BU;Lo;0;L;;;;;N;;;;;
+12284;CUNEIFORM SIGN PI TIMES E;Lo;0;L;;;;;N;;;;;
+12285;CUNEIFORM SIGN PI TIMES I;Lo;0;L;;;;;N;;;;;
+12286;CUNEIFORM SIGN PI TIMES IB;Lo;0;L;;;;;N;;;;;
+12287;CUNEIFORM SIGN PI TIMES U;Lo;0;L;;;;;N;;;;;
+12288;CUNEIFORM SIGN PI TIMES U2;Lo;0;L;;;;;N;;;;;
+12289;CUNEIFORM SIGN PI CROSSING PI;Lo;0;L;;;;;N;;;;;
+1228A;CUNEIFORM SIGN PIRIG;Lo;0;L;;;;;N;;;;;
+1228B;CUNEIFORM SIGN PIRIG TIMES KAL;Lo;0;L;;;;;N;;;;;
+1228C;CUNEIFORM SIGN PIRIG TIMES UD;Lo;0;L;;;;;N;;;;;
+1228D;CUNEIFORM SIGN PIRIG TIMES ZA;Lo;0;L;;;;;N;;;;;
+1228E;CUNEIFORM SIGN PIRIG OPPOSING PIRIG;Lo;0;L;;;;;N;;;;;
+1228F;CUNEIFORM SIGN RA;Lo;0;L;;;;;N;;;;;
+12290;CUNEIFORM SIGN RAB;Lo;0;L;;;;;N;;;;;
+12291;CUNEIFORM SIGN RI;Lo;0;L;;;;;N;;;;;
+12292;CUNEIFORM SIGN RU;Lo;0;L;;;;;N;;;;;
+12293;CUNEIFORM SIGN SA;Lo;0;L;;;;;N;;;;;
+12294;CUNEIFORM SIGN SAG NUTILLU;Lo;0;L;;;;;N;;;;;
+12295;CUNEIFORM SIGN SAG;Lo;0;L;;;;;N;;;;;
+12296;CUNEIFORM SIGN SAG TIMES A;Lo;0;L;;;;;N;;;;;
+12297;CUNEIFORM SIGN SAG TIMES DU;Lo;0;L;;;;;N;;;;;
+12298;CUNEIFORM SIGN SAG TIMES DUB;Lo;0;L;;;;;N;;;;;
+12299;CUNEIFORM SIGN SAG TIMES HA;Lo;0;L;;;;;N;;;;;
+1229A;CUNEIFORM SIGN SAG TIMES KAK;Lo;0;L;;;;;N;;;;;
+1229B;CUNEIFORM SIGN SAG TIMES KUR;Lo;0;L;;;;;N;;;;;
+1229C;CUNEIFORM SIGN SAG TIMES LUM;Lo;0;L;;;;;N;;;;;
+1229D;CUNEIFORM SIGN SAG TIMES MI;Lo;0;L;;;;;N;;;;;
+1229E;CUNEIFORM SIGN SAG TIMES NUN;Lo;0;L;;;;;N;;;;;
+1229F;CUNEIFORM SIGN SAG TIMES SAL;Lo;0;L;;;;;N;;;;;
+122A0;CUNEIFORM SIGN SAG TIMES SHID;Lo;0;L;;;;;N;;;;;
+122A1;CUNEIFORM SIGN SAG TIMES TAB;Lo;0;L;;;;;N;;;;;
+122A2;CUNEIFORM SIGN SAG TIMES U2;Lo;0;L;;;;;N;;;;;
+122A3;CUNEIFORM SIGN SAG TIMES UB;Lo;0;L;;;;;N;;;;;
+122A4;CUNEIFORM SIGN SAG TIMES UM;Lo;0;L;;;;;N;;;;;
+122A5;CUNEIFORM SIGN SAG TIMES UR;Lo;0;L;;;;;N;;;;;
+122A6;CUNEIFORM SIGN SAG TIMES USH;Lo;0;L;;;;;N;;;;;
+122A7;CUNEIFORM SIGN SAG OVER SAG;Lo;0;L;;;;;N;;;;;
+122A8;CUNEIFORM SIGN SAG GUNU;Lo;0;L;;;;;N;;;;;
+122A9;CUNEIFORM SIGN SAL;Lo;0;L;;;;;N;;;;;
+122AA;CUNEIFORM SIGN SAL LAGAB TIMES ASH2;Lo;0;L;;;;;N;;;;;
+122AB;CUNEIFORM SIGN SANGA2;Lo;0;L;;;;;N;;;;;
+122AC;CUNEIFORM SIGN SAR;Lo;0;L;;;;;N;;;;;
+122AD;CUNEIFORM SIGN SHA;Lo;0;L;;;;;N;;;;;
+122AE;CUNEIFORM SIGN SHA3;Lo;0;L;;;;;N;;;;;
+122AF;CUNEIFORM SIGN SHA3 TIMES A;Lo;0;L;;;;;N;;;;;
+122B0;CUNEIFORM SIGN SHA3 TIMES BAD;Lo;0;L;;;;;N;;;;;
+122B1;CUNEIFORM SIGN SHA3 TIMES GISH;Lo;0;L;;;;;N;;;;;
+122B2;CUNEIFORM SIGN SHA3 TIMES NE;Lo;0;L;;;;;N;;;;;
+122B3;CUNEIFORM SIGN SHA3 TIMES SHU2;Lo;0;L;;;;;N;;;;;
+122B4;CUNEIFORM SIGN SHA3 TIMES TUR;Lo;0;L;;;;;N;;;;;
+122B5;CUNEIFORM SIGN SHA3 TIMES U;Lo;0;L;;;;;N;;;;;
+122B6;CUNEIFORM SIGN SHA3 TIMES U PLUS A;Lo;0;L;;;;;N;;;;;
+122B7;CUNEIFORM SIGN SHA6;Lo;0;L;;;;;N;;;;;
+122B8;CUNEIFORM SIGN SHAB6;Lo;0;L;;;;;N;;;;;
+122B9;CUNEIFORM SIGN SHAR2;Lo;0;L;;;;;N;;;;;
+122BA;CUNEIFORM SIGN SHE;Lo;0;L;;;;;N;;;;;
+122BB;CUNEIFORM SIGN SHE HU;Lo;0;L;;;;;N;;;;;
+122BC;CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+122BD;CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+122BE;CUNEIFORM SIGN SHEG9;Lo;0;L;;;;;N;;;;;
+122BF;CUNEIFORM SIGN SHEN;Lo;0;L;;;;;N;;;;;
+122C0;CUNEIFORM SIGN SHESH;Lo;0;L;;;;;N;;;;;
+122C1;CUNEIFORM SIGN SHESH2;Lo;0;L;;;;;N;;;;;
+122C2;CUNEIFORM SIGN SHESHLAM;Lo;0;L;;;;;N;;;;;
+122C3;CUNEIFORM SIGN SHID;Lo;0;L;;;;;N;;;;;
+122C4;CUNEIFORM SIGN SHID TIMES A;Lo;0;L;;;;;N;;;;;
+122C5;CUNEIFORM SIGN SHID TIMES IM;Lo;0;L;;;;;N;;;;;
+122C6;CUNEIFORM SIGN SHIM;Lo;0;L;;;;;N;;;;;
+122C7;CUNEIFORM SIGN SHIM TIMES A;Lo;0;L;;;;;N;;;;;
+122C8;CUNEIFORM SIGN SHIM TIMES BAL;Lo;0;L;;;;;N;;;;;
+122C9;CUNEIFORM SIGN SHIM TIMES BULUG;Lo;0;L;;;;;N;;;;;
+122CA;CUNEIFORM SIGN SHIM TIMES DIN;Lo;0;L;;;;;N;;;;;
+122CB;CUNEIFORM SIGN SHIM TIMES GAR;Lo;0;L;;;;;N;;;;;
+122CC;CUNEIFORM SIGN SHIM TIMES IGI;Lo;0;L;;;;;N;;;;;
+122CD;CUNEIFORM SIGN SHIM TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+122CE;CUNEIFORM SIGN SHIM TIMES KUSHU2;Lo;0;L;;;;;N;;;;;
+122CF;CUNEIFORM SIGN SHIM TIMES LUL;Lo;0;L;;;;;N;;;;;
+122D0;CUNEIFORM SIGN SHIM TIMES MUG;Lo;0;L;;;;;N;;;;;
+122D1;CUNEIFORM SIGN SHIM TIMES SAL;Lo;0;L;;;;;N;;;;;
+122D2;CUNEIFORM SIGN SHINIG;Lo;0;L;;;;;N;;;;;
+122D3;CUNEIFORM SIGN SHIR;Lo;0;L;;;;;N;;;;;
+122D4;CUNEIFORM SIGN SHIR TENU;Lo;0;L;;;;;N;;;;;
+122D5;CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR;Lo;0;L;;;;;N;;;;;
+122D6;CUNEIFORM SIGN SHITA;Lo;0;L;;;;;N;;;;;
+122D7;CUNEIFORM SIGN SHU;Lo;0;L;;;;;N;;;;;
+122D8;CUNEIFORM SIGN SHU OVER INVERTED SHU;Lo;0;L;;;;;N;;;;;
+122D9;CUNEIFORM SIGN SHU2;Lo;0;L;;;;;N;;;;;
+122DA;CUNEIFORM SIGN SHUBUR;Lo;0;L;;;;;N;;;;;
+122DB;CUNEIFORM SIGN SI;Lo;0;L;;;;;N;;;;;
+122DC;CUNEIFORM SIGN SI GUNU;Lo;0;L;;;;;N;;;;;
+122DD;CUNEIFORM SIGN SIG;Lo;0;L;;;;;N;;;;;
+122DE;CUNEIFORM SIGN SIG4;Lo;0;L;;;;;N;;;;;
+122DF;CUNEIFORM SIGN SIG4 OVER SIG4 SHU2;Lo;0;L;;;;;N;;;;;
+122E0;CUNEIFORM SIGN SIK2;Lo;0;L;;;;;N;;;;;
+122E1;CUNEIFORM SIGN SILA3;Lo;0;L;;;;;N;;;;;
+122E2;CUNEIFORM SIGN SU;Lo;0;L;;;;;N;;;;;
+122E3;CUNEIFORM SIGN SU OVER SU;Lo;0;L;;;;;N;;;;;
+122E4;CUNEIFORM SIGN SUD;Lo;0;L;;;;;N;;;;;
+122E5;CUNEIFORM SIGN SUD2;Lo;0;L;;;;;N;;;;;
+122E6;CUNEIFORM SIGN SUHUR;Lo;0;L;;;;;N;;;;;
+122E7;CUNEIFORM SIGN SUM;Lo;0;L;;;;;N;;;;;
+122E8;CUNEIFORM SIGN SUMASH;Lo;0;L;;;;;N;;;;;
+122E9;CUNEIFORM SIGN SUR;Lo;0;L;;;;;N;;;;;
+122EA;CUNEIFORM SIGN SUR9;Lo;0;L;;;;;N;;;;;
+122EB;CUNEIFORM SIGN TA;Lo;0;L;;;;;N;;;;;
+122EC;CUNEIFORM SIGN TA ASTERISK;Lo;0;L;;;;;N;;;;;
+122ED;CUNEIFORM SIGN TA TIMES HI;Lo;0;L;;;;;N;;;;;
+122EE;CUNEIFORM SIGN TA TIMES MI;Lo;0;L;;;;;N;;;;;
+122EF;CUNEIFORM SIGN TA GUNU;Lo;0;L;;;;;N;;;;;
+122F0;CUNEIFORM SIGN TAB;Lo;0;L;;;;;N;;;;;
+122F1;CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH;Lo;0;L;;;;;N;;;;;
+122F2;CUNEIFORM SIGN TAB SQUARED;Lo;0;L;;;;;N;;;;;
+122F3;CUNEIFORM SIGN TAG;Lo;0;L;;;;;N;;;;;
+122F4;CUNEIFORM SIGN TAG TIMES BI;Lo;0;L;;;;;N;;;;;
+122F5;CUNEIFORM SIGN TAG TIMES GUD;Lo;0;L;;;;;N;;;;;
+122F6;CUNEIFORM SIGN TAG TIMES SHE;Lo;0;L;;;;;N;;;;;
+122F7;CUNEIFORM SIGN TAG TIMES SHU;Lo;0;L;;;;;N;;;;;
+122F8;CUNEIFORM SIGN TAG TIMES TUG2;Lo;0;L;;;;;N;;;;;
+122F9;CUNEIFORM SIGN TAG TIMES UD;Lo;0;L;;;;;N;;;;;
+122FA;CUNEIFORM SIGN TAK4;Lo;0;L;;;;;N;;;;;
+122FB;CUNEIFORM SIGN TAR;Lo;0;L;;;;;N;;;;;
+122FC;CUNEIFORM SIGN TE;Lo;0;L;;;;;N;;;;;
+122FD;CUNEIFORM SIGN TE GUNU;Lo;0;L;;;;;N;;;;;
+122FE;CUNEIFORM SIGN TI;Lo;0;L;;;;;N;;;;;
+122FF;CUNEIFORM SIGN TI TENU;Lo;0;L;;;;;N;;;;;
+12300;CUNEIFORM SIGN TIL;Lo;0;L;;;;;N;;;;;
+12301;CUNEIFORM SIGN TIR;Lo;0;L;;;;;N;;;;;
+12302;CUNEIFORM SIGN TIR TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12303;CUNEIFORM SIGN TIR OVER TIR;Lo;0;L;;;;;N;;;;;
+12304;CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+12305;CUNEIFORM SIGN TU;Lo;0;L;;;;;N;;;;;
+12306;CUNEIFORM SIGN TUG2;Lo;0;L;;;;;N;;;;;
+12307;CUNEIFORM SIGN TUK;Lo;0;L;;;;;N;;;;;
+12308;CUNEIFORM SIGN TUM;Lo;0;L;;;;;N;;;;;
+12309;CUNEIFORM SIGN TUR;Lo;0;L;;;;;N;;;;;
+1230A;CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA;Lo;0;L;;;;;N;;;;;
+1230B;CUNEIFORM SIGN U;Lo;0;L;;;;;N;;;;;
+1230C;CUNEIFORM SIGN U GUD;Lo;0;L;;;;;N;;;;;
+1230D;CUNEIFORM SIGN U U U;Lo;0;L;;;;;N;;;;;
+1230E;CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+1230F;CUNEIFORM SIGN U OVER U SUR OVER SUR;Lo;0;L;;;;;N;;;;;
+12310;CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED;Lo;0;L;;;;;N;;;;;
+12311;CUNEIFORM SIGN U2;Lo;0;L;;;;;N;;;;;
+12312;CUNEIFORM SIGN UB;Lo;0;L;;;;;N;;;;;
+12313;CUNEIFORM SIGN UD;Lo;0;L;;;;;N;;;;;
+12314;CUNEIFORM SIGN UD KUSHU2;Lo;0;L;;;;;N;;;;;
+12315;CUNEIFORM SIGN UD TIMES BAD;Lo;0;L;;;;;N;;;;;
+12316;CUNEIFORM SIGN UD TIMES MI;Lo;0;L;;;;;N;;;;;
+12317;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;;
+12318;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU;Lo;0;L;;;;;N;;;;;
+12319;CUNEIFORM SIGN UD GUNU;Lo;0;L;;;;;N;;;;;
+1231A;CUNEIFORM SIGN UD SHESHIG;Lo;0;L;;;;;N;;;;;
+1231B;CUNEIFORM SIGN UD SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;;
+1231C;CUNEIFORM SIGN UDUG;Lo;0;L;;;;;N;;;;;
+1231D;CUNEIFORM SIGN UM;Lo;0;L;;;;;N;;;;;
+1231E;CUNEIFORM SIGN UM TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+1231F;CUNEIFORM SIGN UM TIMES ME PLUS DA;Lo;0;L;;;;;N;;;;;
+12320;CUNEIFORM SIGN UM TIMES SHA3;Lo;0;L;;;;;N;;;;;
+12321;CUNEIFORM SIGN UM TIMES U;Lo;0;L;;;;;N;;;;;
+12322;CUNEIFORM SIGN UMBIN;Lo;0;L;;;;;N;;;;;
+12323;CUNEIFORM SIGN UMUM;Lo;0;L;;;;;N;;;;;
+12324;CUNEIFORM SIGN UMUM TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+12325;CUNEIFORM SIGN UMUM TIMES PA;Lo;0;L;;;;;N;;;;;
+12326;CUNEIFORM SIGN UN;Lo;0;L;;;;;N;;;;;
+12327;CUNEIFORM SIGN UN GUNU;Lo;0;L;;;;;N;;;;;
+12328;CUNEIFORM SIGN UR;Lo;0;L;;;;;N;;;;;
+12329;CUNEIFORM SIGN UR CROSSING UR;Lo;0;L;;;;;N;;;;;
+1232A;CUNEIFORM SIGN UR SHESHIG;Lo;0;L;;;;;N;;;;;
+1232B;CUNEIFORM SIGN UR2;Lo;0;L;;;;;N;;;;;
+1232C;CUNEIFORM SIGN UR2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;;
+1232D;CUNEIFORM SIGN UR2 TIMES A PLUS NA;Lo;0;L;;;;;N;;;;;
+1232E;CUNEIFORM SIGN UR2 TIMES AL;Lo;0;L;;;;;N;;;;;
+1232F;CUNEIFORM SIGN UR2 TIMES HA;Lo;0;L;;;;;N;;;;;
+12330;CUNEIFORM SIGN UR2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+12331;CUNEIFORM SIGN UR2 TIMES U2;Lo;0;L;;;;;N;;;;;
+12332;CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;;
+12333;CUNEIFORM SIGN UR2 TIMES U2 PLUS BI;Lo;0;L;;;;;N;;;;;
+12334;CUNEIFORM SIGN UR4;Lo;0;L;;;;;N;;;;;
+12335;CUNEIFORM SIGN URI;Lo;0;L;;;;;N;;;;;
+12336;CUNEIFORM SIGN URI3;Lo;0;L;;;;;N;;;;;
+12337;CUNEIFORM SIGN URU;Lo;0;L;;;;;N;;;;;
+12338;CUNEIFORM SIGN URU TIMES A;Lo;0;L;;;;;N;;;;;
+12339;CUNEIFORM SIGN URU TIMES ASHGAB;Lo;0;L;;;;;N;;;;;
+1233A;CUNEIFORM SIGN URU TIMES BAR;Lo;0;L;;;;;N;;;;;
+1233B;CUNEIFORM SIGN URU TIMES DUN;Lo;0;L;;;;;N;;;;;
+1233C;CUNEIFORM SIGN URU TIMES GA;Lo;0;L;;;;;N;;;;;
+1233D;CUNEIFORM SIGN URU TIMES GAL;Lo;0;L;;;;;N;;;;;
+1233E;CUNEIFORM SIGN URU TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1233F;CUNEIFORM SIGN URU TIMES GAR;Lo;0;L;;;;;N;;;;;
+12340;CUNEIFORM SIGN URU TIMES GU;Lo;0;L;;;;;N;;;;;
+12341;CUNEIFORM SIGN URU TIMES HA;Lo;0;L;;;;;N;;;;;
+12342;CUNEIFORM SIGN URU TIMES IGI;Lo;0;L;;;;;N;;;;;
+12343;CUNEIFORM SIGN URU TIMES IM;Lo;0;L;;;;;N;;;;;
+12344;CUNEIFORM SIGN URU TIMES ISH;Lo;0;L;;;;;N;;;;;
+12345;CUNEIFORM SIGN URU TIMES KI;Lo;0;L;;;;;N;;;;;
+12346;CUNEIFORM SIGN URU TIMES LUM;Lo;0;L;;;;;N;;;;;
+12347;CUNEIFORM SIGN URU TIMES MIN;Lo;0;L;;;;;N;;;;;
+12348;CUNEIFORM SIGN URU TIMES PA;Lo;0;L;;;;;N;;;;;
+12349;CUNEIFORM SIGN URU TIMES SHE;Lo;0;L;;;;;N;;;;;
+1234A;CUNEIFORM SIGN URU TIMES SIG4;Lo;0;L;;;;;N;;;;;
+1234B;CUNEIFORM SIGN URU TIMES TU;Lo;0;L;;;;;N;;;;;
+1234C;CUNEIFORM SIGN URU TIMES U PLUS GUD;Lo;0;L;;;;;N;;;;;
+1234D;CUNEIFORM SIGN URU TIMES UD;Lo;0;L;;;;;N;;;;;
+1234E;CUNEIFORM SIGN URU TIMES URUDA;Lo;0;L;;;;;N;;;;;
+1234F;CUNEIFORM SIGN URUDA;Lo;0;L;;;;;N;;;;;
+12350;CUNEIFORM SIGN URUDA TIMES U;Lo;0;L;;;;;N;;;;;
+12351;CUNEIFORM SIGN USH;Lo;0;L;;;;;N;;;;;
+12352;CUNEIFORM SIGN USH TIMES A;Lo;0;L;;;;;N;;;;;
+12353;CUNEIFORM SIGN USH TIMES KU;Lo;0;L;;;;;N;;;;;
+12354;CUNEIFORM SIGN USH TIMES KUR;Lo;0;L;;;;;N;;;;;
+12355;CUNEIFORM SIGN USH TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12356;CUNEIFORM SIGN USHX;Lo;0;L;;;;;N;;;;;
+12357;CUNEIFORM SIGN USH2;Lo;0;L;;;;;N;;;;;
+12358;CUNEIFORM SIGN USHUMX;Lo;0;L;;;;;N;;;;;
+12359;CUNEIFORM SIGN UTUKI;Lo;0;L;;;;;N;;;;;
+1235A;CUNEIFORM SIGN UZ3;Lo;0;L;;;;;N;;;;;
+1235B;CUNEIFORM SIGN UZ3 TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+1235C;CUNEIFORM SIGN UZU;Lo;0;L;;;;;N;;;;;
+1235D;CUNEIFORM SIGN ZA;Lo;0;L;;;;;N;;;;;
+1235E;CUNEIFORM SIGN ZA TENU;Lo;0;L;;;;;N;;;;;
+1235F;CUNEIFORM SIGN ZA SQUARED TIMES KUR;Lo;0;L;;;;;N;;;;;
+12360;CUNEIFORM SIGN ZAG;Lo;0;L;;;;;N;;;;;
+12361;CUNEIFORM SIGN ZAMX;Lo;0;L;;;;;N;;;;;
+12362;CUNEIFORM SIGN ZE2;Lo;0;L;;;;;N;;;;;
+12363;CUNEIFORM SIGN ZI;Lo;0;L;;;;;N;;;;;
+12364;CUNEIFORM SIGN ZI OVER ZI;Lo;0;L;;;;;N;;;;;
+12365;CUNEIFORM SIGN ZI3;Lo;0;L;;;;;N;;;;;
+12366;CUNEIFORM SIGN ZIB;Lo;0;L;;;;;N;;;;;
+12367;CUNEIFORM SIGN ZIB KABA TENU;Lo;0;L;;;;;N;;;;;
+12368;CUNEIFORM SIGN ZIG;Lo;0;L;;;;;N;;;;;
+12369;CUNEIFORM SIGN ZIZ2;Lo;0;L;;;;;N;;;;;
+1236A;CUNEIFORM SIGN ZU;Lo;0;L;;;;;N;;;;;
+1236B;CUNEIFORM SIGN ZU5;Lo;0;L;;;;;N;;;;;
+1236C;CUNEIFORM SIGN ZU5 TIMES A;Lo;0;L;;;;;N;;;;;
+1236D;CUNEIFORM SIGN ZUBUR;Lo;0;L;;;;;N;;;;;
+1236E;CUNEIFORM SIGN ZUM;Lo;0;L;;;;;N;;;;;
+1236F;CUNEIFORM SIGN KAP ELAMITE;Lo;0;L;;;;;N;;;;;
+12370;CUNEIFORM SIGN AB TIMES NUN;Lo;0;L;;;;;N;;;;;
+12371;CUNEIFORM SIGN AB2 TIMES A;Lo;0;L;;;;;N;;;;;
+12372;CUNEIFORM SIGN AMAR TIMES KUG;Lo;0;L;;;;;N;;;;;
+12373;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH;Lo;0;L;;;;;N;;;;;
+12374;CUNEIFORM SIGN DAG3;Lo;0;L;;;;;N;;;;;
+12375;CUNEIFORM SIGN DISH PLUS SHU;Lo;0;L;;;;;N;;;;;
+12376;CUNEIFORM SIGN DUB TIMES SHE;Lo;0;L;;;;;N;;;;;
+12377;CUNEIFORM SIGN EZEN TIMES GUD;Lo;0;L;;;;;N;;;;;
+12378;CUNEIFORM SIGN EZEN TIMES SHE;Lo;0;L;;;;;N;;;;;
+12379;CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A;Lo;0;L;;;;;N;;;;;
+1237A;CUNEIFORM SIGN GA2 TIMES ASH2;Lo;0;L;;;;;N;;;;;
+1237B;CUNEIFORM SIGN GE22;Lo;0;L;;;;;N;;;;;
+1237C;CUNEIFORM SIGN GIG;Lo;0;L;;;;;N;;;;;
+1237D;CUNEIFORM SIGN HUSH;Lo;0;L;;;;;N;;;;;
+1237E;CUNEIFORM SIGN KA TIMES ANSHE;Lo;0;L;;;;;N;;;;;
+1237F;CUNEIFORM SIGN KA TIMES ASH3;Lo;0;L;;;;;N;;;;;
+12380;CUNEIFORM SIGN KA TIMES GISH;Lo;0;L;;;;;N;;;;;
+12381;CUNEIFORM SIGN KA TIMES GUD;Lo;0;L;;;;;N;;;;;
+12382;CUNEIFORM SIGN KA TIMES HI TIMES ASH2;Lo;0;L;;;;;N;;;;;
+12383;CUNEIFORM SIGN KA TIMES LUM;Lo;0;L;;;;;N;;;;;
+12384;CUNEIFORM SIGN KA TIMES PA;Lo;0;L;;;;;N;;;;;
+12385;CUNEIFORM SIGN KA TIMES SHUL;Lo;0;L;;;;;N;;;;;
+12386;CUNEIFORM SIGN KA TIMES TU;Lo;0;L;;;;;N;;;;;
+12387;CUNEIFORM SIGN KA TIMES UR2;Lo;0;L;;;;;N;;;;;
+12388;CUNEIFORM SIGN LAGAB TIMES GI;Lo;0;L;;;;;N;;;;;
+12389;CUNEIFORM SIGN LU2 SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;;
+1238A;CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL;Lo;0;L;;;;;N;;;;;
+1238B;CUNEIFORM SIGN LU2 TIMES SHU;Lo;0;L;;;;;N;;;;;
+1238C;CUNEIFORM SIGN MESH;Lo;0;L;;;;;N;;;;;
+1238D;CUNEIFORM SIGN MUSH3 TIMES ZA;Lo;0;L;;;;;N;;;;;
+1238E;CUNEIFORM SIGN NA4;Lo;0;L;;;;;N;;;;;
+1238F;CUNEIFORM SIGN NIN;Lo;0;L;;;;;N;;;;;
+12390;CUNEIFORM SIGN NIN9;Lo;0;L;;;;;N;;;;;
+12391;CUNEIFORM SIGN NINDA2 TIMES BAL;Lo;0;L;;;;;N;;;;;
+12392;CUNEIFORM SIGN NINDA2 TIMES GI;Lo;0;L;;;;;N;;;;;
+12393;CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES;Lo;0;L;;;;;N;;;;;
+12394;CUNEIFORM SIGN PESH2 ASTERISK;Lo;0;L;;;;;N;;;;;
+12395;CUNEIFORM SIGN PIR2;Lo;0;L;;;;;N;;;;;
+12396;CUNEIFORM SIGN SAG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12397;CUNEIFORM SIGN TI2;Lo;0;L;;;;;N;;;;;
+12398;CUNEIFORM SIGN UM TIMES ME;Lo;0;L;;;;;N;;;;;
+12399;CUNEIFORM SIGN U U;Lo;0;L;;;;;N;;;;;
+12400;CUNEIFORM NUMERIC SIGN TWO ASH;Nl;0;L;;;;2;N;;;;;
+12401;CUNEIFORM NUMERIC SIGN THREE ASH;Nl;0;L;;;;3;N;;;;;
+12402;CUNEIFORM NUMERIC SIGN FOUR ASH;Nl;0;L;;;;4;N;;;;;
+12403;CUNEIFORM NUMERIC SIGN FIVE ASH;Nl;0;L;;;;5;N;;;;;
+12404;CUNEIFORM NUMERIC SIGN SIX ASH;Nl;0;L;;;;6;N;;;;;
+12405;CUNEIFORM NUMERIC SIGN SEVEN ASH;Nl;0;L;;;;7;N;;;;;
+12406;CUNEIFORM NUMERIC SIGN EIGHT ASH;Nl;0;L;;;;8;N;;;;;
+12407;CUNEIFORM NUMERIC SIGN NINE ASH;Nl;0;L;;;;9;N;;;;;
+12408;CUNEIFORM NUMERIC SIGN THREE DISH;Nl;0;L;;;;3;N;;;;;
+12409;CUNEIFORM NUMERIC SIGN FOUR DISH;Nl;0;L;;;;4;N;;;;;
+1240A;CUNEIFORM NUMERIC SIGN FIVE DISH;Nl;0;L;;;;5;N;;;;;
+1240B;CUNEIFORM NUMERIC SIGN SIX DISH;Nl;0;L;;;;6;N;;;;;
+1240C;CUNEIFORM NUMERIC SIGN SEVEN DISH;Nl;0;L;;;;7;N;;;;;
+1240D;CUNEIFORM NUMERIC SIGN EIGHT DISH;Nl;0;L;;;;8;N;;;;;
+1240E;CUNEIFORM NUMERIC SIGN NINE DISH;Nl;0;L;;;;9;N;;;;;
+1240F;CUNEIFORM NUMERIC SIGN FOUR U;Nl;0;L;;;;4;N;;;;;
+12410;CUNEIFORM NUMERIC SIGN FIVE U;Nl;0;L;;;;5;N;;;;;
+12411;CUNEIFORM NUMERIC SIGN SIX U;Nl;0;L;;;;6;N;;;;;
+12412;CUNEIFORM NUMERIC SIGN SEVEN U;Nl;0;L;;;;7;N;;;;;
+12413;CUNEIFORM NUMERIC SIGN EIGHT U;Nl;0;L;;;;8;N;;;;;
+12414;CUNEIFORM NUMERIC SIGN NINE U;Nl;0;L;;;;9;N;;;;;
+12415;CUNEIFORM NUMERIC SIGN ONE GESH2;Nl;0;L;;;;1;N;;;;;
+12416;CUNEIFORM NUMERIC SIGN TWO GESH2;Nl;0;L;;;;2;N;;;;;
+12417;CUNEIFORM NUMERIC SIGN THREE GESH2;Nl;0;L;;;;3;N;;;;;
+12418;CUNEIFORM NUMERIC SIGN FOUR GESH2;Nl;0;L;;;;4;N;;;;;
+12419;CUNEIFORM NUMERIC SIGN FIVE GESH2;Nl;0;L;;;;5;N;;;;;
+1241A;CUNEIFORM NUMERIC SIGN SIX GESH2;Nl;0;L;;;;6;N;;;;;
+1241B;CUNEIFORM NUMERIC SIGN SEVEN GESH2;Nl;0;L;;;;7;N;;;;;
+1241C;CUNEIFORM NUMERIC SIGN EIGHT GESH2;Nl;0;L;;;;8;N;;;;;
+1241D;CUNEIFORM NUMERIC SIGN NINE GESH2;Nl;0;L;;;;9;N;;;;;
+1241E;CUNEIFORM NUMERIC SIGN ONE GESHU;Nl;0;L;;;;1;N;;;;;
+1241F;CUNEIFORM NUMERIC SIGN TWO GESHU;Nl;0;L;;;;2;N;;;;;
+12420;CUNEIFORM NUMERIC SIGN THREE GESHU;Nl;0;L;;;;3;N;;;;;
+12421;CUNEIFORM NUMERIC SIGN FOUR GESHU;Nl;0;L;;;;4;N;;;;;
+12422;CUNEIFORM NUMERIC SIGN FIVE GESHU;Nl;0;L;;;;5;N;;;;;
+12423;CUNEIFORM NUMERIC SIGN TWO SHAR2;Nl;0;L;;;;2;N;;;;;
+12424;CUNEIFORM NUMERIC SIGN THREE SHAR2;Nl;0;L;;;;3;N;;;;;
+12425;CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM;Nl;0;L;;;;3;N;;;;;
+12426;CUNEIFORM NUMERIC SIGN FOUR SHAR2;Nl;0;L;;;;4;N;;;;;
+12427;CUNEIFORM NUMERIC SIGN FIVE SHAR2;Nl;0;L;;;;5;N;;;;;
+12428;CUNEIFORM NUMERIC SIGN SIX SHAR2;Nl;0;L;;;;6;N;;;;;
+12429;CUNEIFORM NUMERIC SIGN SEVEN SHAR2;Nl;0;L;;;;7;N;;;;;
+1242A;CUNEIFORM NUMERIC SIGN EIGHT SHAR2;Nl;0;L;;;;8;N;;;;;
+1242B;CUNEIFORM NUMERIC SIGN NINE SHAR2;Nl;0;L;;;;9;N;;;;;
+1242C;CUNEIFORM NUMERIC SIGN ONE SHARU;Nl;0;L;;;;1;N;;;;;
+1242D;CUNEIFORM NUMERIC SIGN TWO SHARU;Nl;0;L;;;;2;N;;;;;
+1242E;CUNEIFORM NUMERIC SIGN THREE SHARU;Nl;0;L;;;;3;N;;;;;
+1242F;CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM;Nl;0;L;;;;3;N;;;;;
+12430;CUNEIFORM NUMERIC SIGN FOUR SHARU;Nl;0;L;;;;4;N;;;;;
+12431;CUNEIFORM NUMERIC SIGN FIVE SHARU;Nl;0;L;;;;5;N;;;;;
+12432;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH;Nl;0;L;;;;216000;N;;;;;
+12433;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN;Nl;0;L;;;;432000;N;;;;;
+12434;CUNEIFORM NUMERIC SIGN ONE BURU;Nl;0;L;;;;1;N;;;;;
+12435;CUNEIFORM NUMERIC SIGN TWO BURU;Nl;0;L;;;;2;N;;;;;
+12436;CUNEIFORM NUMERIC SIGN THREE BURU;Nl;0;L;;;;3;N;;;;;
+12437;CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM;Nl;0;L;;;;3;N;;;;;
+12438;CUNEIFORM NUMERIC SIGN FOUR BURU;Nl;0;L;;;;4;N;;;;;
+12439;CUNEIFORM NUMERIC SIGN FIVE BURU;Nl;0;L;;;;5;N;;;;;
+1243A;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16;Nl;0;L;;;;3;N;;;;;
+1243B;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21;Nl;0;L;;;;3;N;;;;;
+1243C;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU;Nl;0;L;;;;4;N;;;;;
+1243D;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4;Nl;0;L;;;;4;N;;;;;
+1243E;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A;Nl;0;L;;;;4;N;;;;;
+1243F;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B;Nl;0;L;;;;4;N;;;;;
+12440;CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9;Nl;0;L;;;;6;N;;;;;
+12441;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3;Nl;0;L;;;;7;N;;;;;
+12442;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A;Nl;0;L;;;;7;N;;;;;
+12443;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B;Nl;0;L;;;;7;N;;;;;
+12444;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU;Nl;0;L;;;;8;N;;;;;
+12445;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3;Nl;0;L;;;;8;N;;;;;
+12446;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU;Nl;0;L;;;;9;N;;;;;
+12447;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3;Nl;0;L;;;;9;N;;;;;
+12448;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4;Nl;0;L;;;;9;N;;;;;
+12449;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A;Nl;0;L;;;;9;N;;;;;
+1244A;CUNEIFORM NUMERIC SIGN TWO ASH TENU;Nl;0;L;;;;2;N;;;;;
+1244B;CUNEIFORM NUMERIC SIGN THREE ASH TENU;Nl;0;L;;;;3;N;;;;;
+1244C;CUNEIFORM NUMERIC SIGN FOUR ASH TENU;Nl;0;L;;;;4;N;;;;;
+1244D;CUNEIFORM NUMERIC SIGN FIVE ASH TENU;Nl;0;L;;;;5;N;;;;;
+1244E;CUNEIFORM NUMERIC SIGN SIX ASH TENU;Nl;0;L;;;;6;N;;;;;
+1244F;CUNEIFORM NUMERIC SIGN ONE BAN2;Nl;0;L;;;;1;N;;;;;
+12450;CUNEIFORM NUMERIC SIGN TWO BAN2;Nl;0;L;;;;2;N;;;;;
+12451;CUNEIFORM NUMERIC SIGN THREE BAN2;Nl;0;L;;;;3;N;;;;;
+12452;CUNEIFORM NUMERIC SIGN FOUR BAN2;Nl;0;L;;;;4;N;;;;;
+12453;CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM;Nl;0;L;;;;4;N;;;;;
+12454;CUNEIFORM NUMERIC SIGN FIVE BAN2;Nl;0;L;;;;5;N;;;;;
+12455;CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM;Nl;0;L;;;;5;N;;;;;
+12456;CUNEIFORM NUMERIC SIGN NIGIDAMIN;Nl;0;L;;;;2;N;;;;;
+12457;CUNEIFORM NUMERIC SIGN NIGIDAESH;Nl;0;L;;;;3;N;;;;;
+12458;CUNEIFORM NUMERIC SIGN ONE ESHE3;Nl;0;L;;;;1;N;;;;;
+12459;CUNEIFORM NUMERIC SIGN TWO ESHE3;Nl;0;L;;;;2;N;;;;;
+1245A;CUNEIFORM NUMERIC SIGN ONE THIRD DISH;Nl;0;L;;;;1/3;N;;;;;
+1245B;CUNEIFORM NUMERIC SIGN TWO THIRDS DISH;Nl;0;L;;;;2/3;N;;;;;
+1245C;CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH;Nl;0;L;;;;5/6;N;;;;;
+1245D;CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A;Nl;0;L;;;;1/3;N;;;;;
+1245E;CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A;Nl;0;L;;;;2/3;N;;;;;
+1245F;CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH;Nl;0;L;;;;1/8;N;;;;;
+12460;CUNEIFORM NUMERIC SIGN ONE QUARTER ASH;Nl;0;L;;;;1/4;N;;;;;
+12461;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH;Nl;0;L;;;;1/6;N;;;;;
+12462;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER;Nl;0;L;;;;1/4;N;;;;;
+12463;CUNEIFORM NUMERIC SIGN ONE QUARTER GUR;Nl;0;L;;;;1/4;N;;;;;
+12464;CUNEIFORM NUMERIC SIGN ONE HALF GUR;Nl;0;L;;;;1/2;N;;;;;
+12465;CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD;Nl;0;L;;;;1/3;N;;;;;
+12466;CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS;Nl;0;L;;;;2/3;N;;;;;
+12467;CUNEIFORM NUMERIC SIGN ELAMITE FORTY;Nl;0;L;;;;40;N;;;;;
+12468;CUNEIFORM NUMERIC SIGN ELAMITE FIFTY;Nl;0;L;;;;50;N;;;;;
+12469;CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM;Nl;0;L;;;;4;N;;;;;
+1246A;CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM;Nl;0;L;;;;5;N;;;;;
+1246B;CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM;Nl;0;L;;;;6;N;;;;;
+1246C;CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM;Nl;0;L;;;;7;N;;;;;
+1246D;CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM;Nl;0;L;;;;8;N;;;;;
+1246E;CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM;Nl;0;L;;;;9;N;;;;;
+12470;CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER;Po;0;L;;;;;N;;;;;
+12471;CUNEIFORM PUNCTUATION SIGN VERTICAL COLON;Po;0;L;;;;;N;;;;;
+12472;CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON;Po;0;L;;;;;N;;;;;
+12473;CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON;Po;0;L;;;;;N;;;;;
+12474;CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON;Po;0;L;;;;;N;;;;;
+12480;CUNEIFORM SIGN AB TIMES NUN TENU;Lo;0;L;;;;;N;;;;;
+12481;CUNEIFORM SIGN AB TIMES SHU2;Lo;0;L;;;;;N;;;;;
+12482;CUNEIFORM SIGN AD TIMES ESH2;Lo;0;L;;;;;N;;;;;
+12483;CUNEIFORM SIGN BAD TIMES DISH TENU;Lo;0;L;;;;;N;;;;;
+12484;CUNEIFORM SIGN BAHAR2 TIMES AB2;Lo;0;L;;;;;N;;;;;
+12485;CUNEIFORM SIGN BAHAR2 TIMES NI;Lo;0;L;;;;;N;;;;;
+12486;CUNEIFORM SIGN BAHAR2 TIMES ZA;Lo;0;L;;;;;N;;;;;
+12487;CUNEIFORM SIGN BU OVER BU TIMES NA2;Lo;0;L;;;;;N;;;;;
+12488;CUNEIFORM SIGN DA TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12489;CUNEIFORM SIGN DAG TIMES KUR;Lo;0;L;;;;;N;;;;;
+1248A;CUNEIFORM SIGN DIM TIMES IGI;Lo;0;L;;;;;N;;;;;
+1248B;CUNEIFORM SIGN DIM TIMES U U U;Lo;0;L;;;;;N;;;;;
+1248C;CUNEIFORM SIGN DIM2 TIMES UD;Lo;0;L;;;;;N;;;;;
+1248D;CUNEIFORM SIGN DUG TIMES ANSHE;Lo;0;L;;;;;N;;;;;
+1248E;CUNEIFORM SIGN DUG TIMES ASH;Lo;0;L;;;;;N;;;;;
+1248F;CUNEIFORM SIGN DUG TIMES ASH AT LEFT;Lo;0;L;;;;;N;;;;;
+12490;CUNEIFORM SIGN DUG TIMES DIN;Lo;0;L;;;;;N;;;;;
+12491;CUNEIFORM SIGN DUG TIMES DUN;Lo;0;L;;;;;N;;;;;
+12492;CUNEIFORM SIGN DUG TIMES ERIN2;Lo;0;L;;;;;N;;;;;
+12493;CUNEIFORM SIGN DUG TIMES GA;Lo;0;L;;;;;N;;;;;
+12494;CUNEIFORM SIGN DUG TIMES GI;Lo;0;L;;;;;N;;;;;
+12495;CUNEIFORM SIGN DUG TIMES GIR2 GUNU;Lo;0;L;;;;;N;;;;;
+12496;CUNEIFORM SIGN DUG TIMES GISH;Lo;0;L;;;;;N;;;;;
+12497;CUNEIFORM SIGN DUG TIMES HA;Lo;0;L;;;;;N;;;;;
+12498;CUNEIFORM SIGN DUG TIMES HI;Lo;0;L;;;;;N;;;;;
+12499;CUNEIFORM SIGN DUG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+1249A;CUNEIFORM SIGN DUG TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+1249B;CUNEIFORM SIGN DUG TIMES KUR;Lo;0;L;;;;;N;;;;;
+1249C;CUNEIFORM SIGN DUG TIMES KUSHU2;Lo;0;L;;;;;N;;;;;
+1249D;CUNEIFORM SIGN DUG TIMES KUSHU2 PLUS KASKAL;Lo;0;L;;;;;N;;;;;
+1249E;CUNEIFORM SIGN DUG TIMES LAK-020;Lo;0;L;;;;;N;;;;;
+1249F;CUNEIFORM SIGN DUG TIMES LAM;Lo;0;L;;;;;N;;;;;
+124A0;CUNEIFORM SIGN DUG TIMES LAM TIMES KUR;Lo;0;L;;;;;N;;;;;
+124A1;CUNEIFORM SIGN DUG TIMES LUH PLUS GISH;Lo;0;L;;;;;N;;;;;
+124A2;CUNEIFORM SIGN DUG TIMES MASH;Lo;0;L;;;;;N;;;;;
+124A3;CUNEIFORM SIGN DUG TIMES MES;Lo;0;L;;;;;N;;;;;
+124A4;CUNEIFORM SIGN DUG TIMES MI;Lo;0;L;;;;;N;;;;;
+124A5;CUNEIFORM SIGN DUG TIMES NI;Lo;0;L;;;;;N;;;;;
+124A6;CUNEIFORM SIGN DUG TIMES PI;Lo;0;L;;;;;N;;;;;
+124A7;CUNEIFORM SIGN DUG TIMES SHE;Lo;0;L;;;;;N;;;;;
+124A8;CUNEIFORM SIGN DUG TIMES SI GUNU;Lo;0;L;;;;;N;;;;;
+124A9;CUNEIFORM SIGN E2 TIMES KUR;Lo;0;L;;;;;N;;;;;
+124AA;CUNEIFORM SIGN E2 TIMES PAP;Lo;0;L;;;;;N;;;;;
+124AB;CUNEIFORM SIGN ERIN2 X;Lo;0;L;;;;;N;;;;;
+124AC;CUNEIFORM SIGN ESH2 CROSSING ESH2;Lo;0;L;;;;;N;;;;;
+124AD;CUNEIFORM SIGN EZEN SHESHIG TIMES ASH;Lo;0;L;;;;;N;;;;;
+124AE;CUNEIFORM SIGN EZEN SHESHIG TIMES HI;Lo;0;L;;;;;N;;;;;
+124AF;CUNEIFORM SIGN EZEN SHESHIG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+124B0;CUNEIFORM SIGN EZEN SHESHIG TIMES LA;Lo;0;L;;;;;N;;;;;
+124B1;CUNEIFORM SIGN EZEN SHESHIG TIMES LAL;Lo;0;L;;;;;N;;;;;
+124B2;CUNEIFORM SIGN EZEN SHESHIG TIMES ME;Lo;0;L;;;;;N;;;;;
+124B3;CUNEIFORM SIGN EZEN SHESHIG TIMES MES;Lo;0;L;;;;;N;;;;;
+124B4;CUNEIFORM SIGN EZEN SHESHIG TIMES SU;Lo;0;L;;;;;N;;;;;
+124B5;CUNEIFORM SIGN EZEN TIMES SU;Lo;0;L;;;;;N;;;;;
+124B6;CUNEIFORM SIGN GA2 TIMES BAHAR2;Lo;0;L;;;;;N;;;;;
+124B7;CUNEIFORM SIGN GA2 TIMES DIM GUNU;Lo;0;L;;;;;N;;;;;
+124B8;CUNEIFORM SIGN GA2 TIMES DUG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+124B9;CUNEIFORM SIGN GA2 TIMES DUG TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+124BA;CUNEIFORM SIGN GA2 TIMES EREN;Lo;0;L;;;;;N;;;;;
+124BB;CUNEIFORM SIGN GA2 TIMES GA;Lo;0;L;;;;;N;;;;;
+124BC;CUNEIFORM SIGN GA2 TIMES GAR PLUS DI;Lo;0;L;;;;;N;;;;;
+124BD;CUNEIFORM SIGN GA2 TIMES GAR PLUS NE;Lo;0;L;;;;;N;;;;;
+124BE;CUNEIFORM SIGN GA2 TIMES HA PLUS A;Lo;0;L;;;;;N;;;;;
+124BF;CUNEIFORM SIGN GA2 TIMES KUSHU2 PLUS KASKAL;Lo;0;L;;;;;N;;;;;
+124C0;CUNEIFORM SIGN GA2 TIMES LAM;Lo;0;L;;;;;N;;;;;
+124C1;CUNEIFORM SIGN GA2 TIMES LAM TIMES KUR;Lo;0;L;;;;;N;;;;;
+124C2;CUNEIFORM SIGN GA2 TIMES LUH;Lo;0;L;;;;;N;;;;;
+124C3;CUNEIFORM SIGN GA2 TIMES MUSH;Lo;0;L;;;;;N;;;;;
+124C4;CUNEIFORM SIGN GA2 TIMES NE;Lo;0;L;;;;;N;;;;;
+124C5;CUNEIFORM SIGN GA2 TIMES NE PLUS E2;Lo;0;L;;;;;N;;;;;
+124C6;CUNEIFORM SIGN GA2 TIMES NE PLUS GI;Lo;0;L;;;;;N;;;;;
+124C7;CUNEIFORM SIGN GA2 TIMES SHIM;Lo;0;L;;;;;N;;;;;
+124C8;CUNEIFORM SIGN GA2 TIMES ZIZ2;Lo;0;L;;;;;N;;;;;
+124C9;CUNEIFORM SIGN GABA ROTATED NINETY DEGREES;Lo;0;L;;;;;N;;;;;
+124CA;CUNEIFORM SIGN GESHTIN TIMES U;Lo;0;L;;;;;N;;;;;
+124CB;CUNEIFORM SIGN GISH TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;;
+124CC;CUNEIFORM SIGN GU2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+124CD;CUNEIFORM SIGN GUD PLUS GISH TIMES TAK4;Lo;0;L;;;;;N;;;;;
+124CE;CUNEIFORM SIGN HA TENU GUNU;Lo;0;L;;;;;N;;;;;
+124CF;CUNEIFORM SIGN HI TIMES ASH OVER HI TIMES ASH;Lo;0;L;;;;;N;;;;;
+124D0;CUNEIFORM SIGN KA TIMES BU;Lo;0;L;;;;;N;;;;;
+124D1;CUNEIFORM SIGN KA TIMES KA;Lo;0;L;;;;;N;;;;;
+124D2;CUNEIFORM SIGN KA TIMES U U U;Lo;0;L;;;;;N;;;;;
+124D3;CUNEIFORM SIGN KA TIMES UR;Lo;0;L;;;;;N;;;;;
+124D4;CUNEIFORM SIGN LAGAB TIMES ZU OVER ZU;Lo;0;L;;;;;N;;;;;
+124D5;CUNEIFORM SIGN LAK-003;Lo;0;L;;;;;N;;;;;
+124D6;CUNEIFORM SIGN LAK-021;Lo;0;L;;;;;N;;;;;
+124D7;CUNEIFORM SIGN LAK-025;Lo;0;L;;;;;N;;;;;
+124D8;CUNEIFORM SIGN LAK-030;Lo;0;L;;;;;N;;;;;
+124D9;CUNEIFORM SIGN LAK-050;Lo;0;L;;;;;N;;;;;
+124DA;CUNEIFORM SIGN LAK-051;Lo;0;L;;;;;N;;;;;
+124DB;CUNEIFORM SIGN LAK-062;Lo;0;L;;;;;N;;;;;
+124DC;CUNEIFORM SIGN LAK-079 OVER LAK-079 GUNU;Lo;0;L;;;;;N;;;;;
+124DD;CUNEIFORM SIGN LAK-080;Lo;0;L;;;;;N;;;;;
+124DE;CUNEIFORM SIGN LAK-081 OVER LAK-081;Lo;0;L;;;;;N;;;;;
+124DF;CUNEIFORM SIGN LAK-092;Lo;0;L;;;;;N;;;;;
+124E0;CUNEIFORM SIGN LAK-130;Lo;0;L;;;;;N;;;;;
+124E1;CUNEIFORM SIGN LAK-142;Lo;0;L;;;;;N;;;;;
+124E2;CUNEIFORM SIGN LAK-210;Lo;0;L;;;;;N;;;;;
+124E3;CUNEIFORM SIGN LAK-219;Lo;0;L;;;;;N;;;;;
+124E4;CUNEIFORM SIGN LAK-220;Lo;0;L;;;;;N;;;;;
+124E5;CUNEIFORM SIGN LAK-225;Lo;0;L;;;;;N;;;;;
+124E6;CUNEIFORM SIGN LAK-228;Lo;0;L;;;;;N;;;;;
+124E7;CUNEIFORM SIGN LAK-238;Lo;0;L;;;;;N;;;;;
+124E8;CUNEIFORM SIGN LAK-265;Lo;0;L;;;;;N;;;;;
+124E9;CUNEIFORM SIGN LAK-266;Lo;0;L;;;;;N;;;;;
+124EA;CUNEIFORM SIGN LAK-343;Lo;0;L;;;;;N;;;;;
+124EB;CUNEIFORM SIGN LAK-347;Lo;0;L;;;;;N;;;;;
+124EC;CUNEIFORM SIGN LAK-348;Lo;0;L;;;;;N;;;;;
+124ED;CUNEIFORM SIGN LAK-383;Lo;0;L;;;;;N;;;;;
+124EE;CUNEIFORM SIGN LAK-384;Lo;0;L;;;;;N;;;;;
+124EF;CUNEIFORM SIGN LAK-390;Lo;0;L;;;;;N;;;;;
+124F0;CUNEIFORM SIGN LAK-441;Lo;0;L;;;;;N;;;;;
+124F1;CUNEIFORM SIGN LAK-449;Lo;0;L;;;;;N;;;;;
+124F2;CUNEIFORM SIGN LAK-449 TIMES GU;Lo;0;L;;;;;N;;;;;
+124F3;CUNEIFORM SIGN LAK-449 TIMES IGI;Lo;0;L;;;;;N;;;;;
+124F4;CUNEIFORM SIGN LAK-449 TIMES PAP PLUS LU3;Lo;0;L;;;;;N;;;;;
+124F5;CUNEIFORM SIGN LAK-449 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;;
+124F6;CUNEIFORM SIGN LAK-449 TIMES U2 PLUS BA;Lo;0;L;;;;;N;;;;;
+124F7;CUNEIFORM SIGN LAK-450;Lo;0;L;;;;;N;;;;;
+124F8;CUNEIFORM SIGN LAK-457;Lo;0;L;;;;;N;;;;;
+124F9;CUNEIFORM SIGN LAK-470;Lo;0;L;;;;;N;;;;;
+124FA;CUNEIFORM SIGN LAK-483;Lo;0;L;;;;;N;;;;;
+124FB;CUNEIFORM SIGN LAK-490;Lo;0;L;;;;;N;;;;;
+124FC;CUNEIFORM SIGN LAK-492;Lo;0;L;;;;;N;;;;;
+124FD;CUNEIFORM SIGN LAK-493;Lo;0;L;;;;;N;;;;;
+124FE;CUNEIFORM SIGN LAK-495;Lo;0;L;;;;;N;;;;;
+124FF;CUNEIFORM SIGN LAK-550;Lo;0;L;;;;;N;;;;;
+12500;CUNEIFORM SIGN LAK-608;Lo;0;L;;;;;N;;;;;
+12501;CUNEIFORM SIGN LAK-617;Lo;0;L;;;;;N;;;;;
+12502;CUNEIFORM SIGN LAK-617 TIMES ASH;Lo;0;L;;;;;N;;;;;
+12503;CUNEIFORM SIGN LAK-617 TIMES BAD;Lo;0;L;;;;;N;;;;;
+12504;CUNEIFORM SIGN LAK-617 TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;;
+12505;CUNEIFORM SIGN LAK-617 TIMES KU3;Lo;0;L;;;;;N;;;;;
+12506;CUNEIFORM SIGN LAK-617 TIMES LA;Lo;0;L;;;;;N;;;;;
+12507;CUNEIFORM SIGN LAK-617 TIMES TAR;Lo;0;L;;;;;N;;;;;
+12508;CUNEIFORM SIGN LAK-617 TIMES TE;Lo;0;L;;;;;N;;;;;
+12509;CUNEIFORM SIGN LAK-617 TIMES U2;Lo;0;L;;;;;N;;;;;
+1250A;CUNEIFORM SIGN LAK-617 TIMES UD;Lo;0;L;;;;;N;;;;;
+1250B;CUNEIFORM SIGN LAK-617 TIMES URUDA;Lo;0;L;;;;;N;;;;;
+1250C;CUNEIFORM SIGN LAK-636;Lo;0;L;;;;;N;;;;;
+1250D;CUNEIFORM SIGN LAK-648;Lo;0;L;;;;;N;;;;;
+1250E;CUNEIFORM SIGN LAK-648 TIMES DUB;Lo;0;L;;;;;N;;;;;
+1250F;CUNEIFORM SIGN LAK-648 TIMES GA;Lo;0;L;;;;;N;;;;;
+12510;CUNEIFORM SIGN LAK-648 TIMES IGI;Lo;0;L;;;;;N;;;;;
+12511;CUNEIFORM SIGN LAK-648 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12512;CUNEIFORM SIGN LAK-648 TIMES NI;Lo;0;L;;;;;N;;;;;
+12513;CUNEIFORM SIGN LAK-648 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;;
+12514;CUNEIFORM SIGN LAK-648 TIMES SHESH PLUS KI;Lo;0;L;;;;;N;;;;;
+12515;CUNEIFORM SIGN LAK-648 TIMES UD;Lo;0;L;;;;;N;;;;;
+12516;CUNEIFORM SIGN LAK-648 TIMES URUDA;Lo;0;L;;;;;N;;;;;
+12517;CUNEIFORM SIGN LAK-724;Lo;0;L;;;;;N;;;;;
+12518;CUNEIFORM SIGN LAK-749;Lo;0;L;;;;;N;;;;;
+12519;CUNEIFORM SIGN LU2 GUNU TIMES ASH;Lo;0;L;;;;;N;;;;;
+1251A;CUNEIFORM SIGN LU2 TIMES DISH;Lo;0;L;;;;;N;;;;;
+1251B;CUNEIFORM SIGN LU2 TIMES HAL;Lo;0;L;;;;;N;;;;;
+1251C;CUNEIFORM SIGN LU2 TIMES PAP;Lo;0;L;;;;;N;;;;;
+1251D;CUNEIFORM SIGN LU2 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;;
+1251E;CUNEIFORM SIGN LU2 TIMES TAK4;Lo;0;L;;;;;N;;;;;
+1251F;CUNEIFORM SIGN MI PLUS ZA7;Lo;0;L;;;;;N;;;;;
+12520;CUNEIFORM SIGN MUSH OVER MUSH TIMES GA;Lo;0;L;;;;;N;;;;;
+12521;CUNEIFORM SIGN MUSH OVER MUSH TIMES KAK;Lo;0;L;;;;;N;;;;;
+12522;CUNEIFORM SIGN NINDA2 TIMES DIM GUNU;Lo;0;L;;;;;N;;;;;
+12523;CUNEIFORM SIGN NINDA2 TIMES GISH;Lo;0;L;;;;;N;;;;;
+12524;CUNEIFORM SIGN NINDA2 TIMES GUL;Lo;0;L;;;;;N;;;;;
+12525;CUNEIFORM SIGN NINDA2 TIMES HI;Lo;0;L;;;;;N;;;;;
+12526;CUNEIFORM SIGN NINDA2 TIMES KESH2;Lo;0;L;;;;;N;;;;;
+12527;CUNEIFORM SIGN NINDA2 TIMES LAK-050;Lo;0;L;;;;;N;;;;;
+12528;CUNEIFORM SIGN NINDA2 TIMES MASH;Lo;0;L;;;;;N;;;;;
+12529;CUNEIFORM SIGN NINDA2 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;;
+1252A;CUNEIFORM SIGN NINDA2 TIMES U;Lo;0;L;;;;;N;;;;;
+1252B;CUNEIFORM SIGN NINDA2 TIMES U PLUS U;Lo;0;L;;;;;N;;;;;
+1252C;CUNEIFORM SIGN NINDA2 TIMES URUDA;Lo;0;L;;;;;N;;;;;
+1252D;CUNEIFORM SIGN SAG GUNU TIMES HA;Lo;0;L;;;;;N;;;;;
+1252E;CUNEIFORM SIGN SAG TIMES EN;Lo;0;L;;;;;N;;;;;
+1252F;CUNEIFORM SIGN SAG TIMES SHE AT LEFT;Lo;0;L;;;;;N;;;;;
+12530;CUNEIFORM SIGN SAG TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12531;CUNEIFORM SIGN SHA6 TENU;Lo;0;L;;;;;N;;;;;
+12532;CUNEIFORM SIGN SHE OVER SHE;Lo;0;L;;;;;N;;;;;
+12533;CUNEIFORM SIGN SHE PLUS HUB2;Lo;0;L;;;;;N;;;;;
+12534;CUNEIFORM SIGN SHE PLUS NAM2;Lo;0;L;;;;;N;;;;;
+12535;CUNEIFORM SIGN SHE PLUS SAR;Lo;0;L;;;;;N;;;;;
+12536;CUNEIFORM SIGN SHU2 PLUS DUG TIMES NI;Lo;0;L;;;;;N;;;;;
+12537;CUNEIFORM SIGN SHU2 PLUS E2 TIMES AN;Lo;0;L;;;;;N;;;;;
+12538;CUNEIFORM SIGN SI TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12539;CUNEIFORM SIGN TAK4 PLUS SAG;Lo;0;L;;;;;N;;;;;
+1253A;CUNEIFORM SIGN TUM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1253B;CUNEIFORM SIGN TUM TIMES THREE DISH;Lo;0;L;;;;;N;;;;;
+1253C;CUNEIFORM SIGN UR2 INVERTED;Lo;0;L;;;;;N;;;;;
+1253D;CUNEIFORM SIGN UR2 TIMES UD;Lo;0;L;;;;;N;;;;;
+1253E;CUNEIFORM SIGN URU TIMES DARA3;Lo;0;L;;;;;N;;;;;
+1253F;CUNEIFORM SIGN URU TIMES LAK-668;Lo;0;L;;;;;N;;;;;
+12540;CUNEIFORM SIGN URU TIMES LU3;Lo;0;L;;;;;N;;;;;
+12541;CUNEIFORM SIGN ZA7;Lo;0;L;;;;;N;;;;;
+12542;CUNEIFORM SIGN ZU OVER ZU PLUS SAR;Lo;0;L;;;;;N;;;;;
+12543;CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU;Lo;0;L;;;;;N;;;;;
+13000;EGYPTIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;;
+13001;EGYPTIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;;
+13002;EGYPTIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;;
+13003;EGYPTIAN HIEROGLYPH A004;Lo;0;L;;;;;N;;;;;
+13004;EGYPTIAN HIEROGLYPH A005;Lo;0;L;;;;;N;;;;;
+13005;EGYPTIAN HIEROGLYPH A005A;Lo;0;L;;;;;N;;;;;
+13006;EGYPTIAN HIEROGLYPH A006;Lo;0;L;;;;;N;;;;;
+13007;EGYPTIAN HIEROGLYPH A006A;Lo;0;L;;;;;N;;;;;
+13008;EGYPTIAN HIEROGLYPH A006B;Lo;0;L;;;;;N;;;;;
+13009;EGYPTIAN HIEROGLYPH A007;Lo;0;L;;;;;N;;;;;
+1300A;EGYPTIAN HIEROGLYPH A008;Lo;0;L;;;;;N;;;;;
+1300B;EGYPTIAN HIEROGLYPH A009;Lo;0;L;;;;;N;;;;;
+1300C;EGYPTIAN HIEROGLYPH A010;Lo;0;L;;;;;N;;;;;
+1300D;EGYPTIAN HIEROGLYPH A011;Lo;0;L;;;;;N;;;;;
+1300E;EGYPTIAN HIEROGLYPH A012;Lo;0;L;;;;;N;;;;;
+1300F;EGYPTIAN HIEROGLYPH A013;Lo;0;L;;;;;N;;;;;
+13010;EGYPTIAN HIEROGLYPH A014;Lo;0;L;;;;;N;;;;;
+13011;EGYPTIAN HIEROGLYPH A014A;Lo;0;L;;;;;N;;;;;
+13012;EGYPTIAN HIEROGLYPH A015;Lo;0;L;;;;;N;;;;;
+13013;EGYPTIAN HIEROGLYPH A016;Lo;0;L;;;;;N;;;;;
+13014;EGYPTIAN HIEROGLYPH A017;Lo;0;L;;;;;N;;;;;
+13015;EGYPTIAN HIEROGLYPH A017A;Lo;0;L;;;;;N;;;;;
+13016;EGYPTIAN HIEROGLYPH A018;Lo;0;L;;;;;N;;;;;
+13017;EGYPTIAN HIEROGLYPH A019;Lo;0;L;;;;;N;;;;;
+13018;EGYPTIAN HIEROGLYPH A020;Lo;0;L;;;;;N;;;;;
+13019;EGYPTIAN HIEROGLYPH A021;Lo;0;L;;;;;N;;;;;
+1301A;EGYPTIAN HIEROGLYPH A022;Lo;0;L;;;;;N;;;;;
+1301B;EGYPTIAN HIEROGLYPH A023;Lo;0;L;;;;;N;;;;;
+1301C;EGYPTIAN HIEROGLYPH A024;Lo;0;L;;;;;N;;;;;
+1301D;EGYPTIAN HIEROGLYPH A025;Lo;0;L;;;;;N;;;;;
+1301E;EGYPTIAN HIEROGLYPH A026;Lo;0;L;;;;;N;;;;;
+1301F;EGYPTIAN HIEROGLYPH A027;Lo;0;L;;;;;N;;;;;
+13020;EGYPTIAN HIEROGLYPH A028;Lo;0;L;;;;;N;;;;;
+13021;EGYPTIAN HIEROGLYPH A029;Lo;0;L;;;;;N;;;;;
+13022;EGYPTIAN HIEROGLYPH A030;Lo;0;L;;;;;N;;;;;
+13023;EGYPTIAN HIEROGLYPH A031;Lo;0;L;;;;;N;;;;;
+13024;EGYPTIAN HIEROGLYPH A032;Lo;0;L;;;;;N;;;;;
+13025;EGYPTIAN HIEROGLYPH A032A;Lo;0;L;;;;;N;;;;;
+13026;EGYPTIAN HIEROGLYPH A033;Lo;0;L;;;;;N;;;;;
+13027;EGYPTIAN HIEROGLYPH A034;Lo;0;L;;;;;N;;;;;
+13028;EGYPTIAN HIEROGLYPH A035;Lo;0;L;;;;;N;;;;;
+13029;EGYPTIAN HIEROGLYPH A036;Lo;0;L;;;;;N;;;;;
+1302A;EGYPTIAN HIEROGLYPH A037;Lo;0;L;;;;;N;;;;;
+1302B;EGYPTIAN HIEROGLYPH A038;Lo;0;L;;;;;N;;;;;
+1302C;EGYPTIAN HIEROGLYPH A039;Lo;0;L;;;;;N;;;;;
+1302D;EGYPTIAN HIEROGLYPH A040;Lo;0;L;;;;;N;;;;;
+1302E;EGYPTIAN HIEROGLYPH A040A;Lo;0;L;;;;;N;;;;;
+1302F;EGYPTIAN HIEROGLYPH A041;Lo;0;L;;;;;N;;;;;
+13030;EGYPTIAN HIEROGLYPH A042;Lo;0;L;;;;;N;;;;;
+13031;EGYPTIAN HIEROGLYPH A042A;Lo;0;L;;;;;N;;;;;
+13032;EGYPTIAN HIEROGLYPH A043;Lo;0;L;;;;;N;;;;;
+13033;EGYPTIAN HIEROGLYPH A043A;Lo;0;L;;;;;N;;;;;
+13034;EGYPTIAN HIEROGLYPH A044;Lo;0;L;;;;;N;;;;;
+13035;EGYPTIAN HIEROGLYPH A045;Lo;0;L;;;;;N;;;;;
+13036;EGYPTIAN HIEROGLYPH A045A;Lo;0;L;;;;;N;;;;;
+13037;EGYPTIAN HIEROGLYPH A046;Lo;0;L;;;;;N;;;;;
+13038;EGYPTIAN HIEROGLYPH A047;Lo;0;L;;;;;N;;;;;
+13039;EGYPTIAN HIEROGLYPH A048;Lo;0;L;;;;;N;;;;;
+1303A;EGYPTIAN HIEROGLYPH A049;Lo;0;L;;;;;N;;;;;
+1303B;EGYPTIAN HIEROGLYPH A050;Lo;0;L;;;;;N;;;;;
+1303C;EGYPTIAN HIEROGLYPH A051;Lo;0;L;;;;;N;;;;;
+1303D;EGYPTIAN HIEROGLYPH A052;Lo;0;L;;;;;N;;;;;
+1303E;EGYPTIAN HIEROGLYPH A053;Lo;0;L;;;;;N;;;;;
+1303F;EGYPTIAN HIEROGLYPH A054;Lo;0;L;;;;;N;;;;;
+13040;EGYPTIAN HIEROGLYPH A055;Lo;0;L;;;;;N;;;;;
+13041;EGYPTIAN HIEROGLYPH A056;Lo;0;L;;;;;N;;;;;
+13042;EGYPTIAN HIEROGLYPH A057;Lo;0;L;;;;;N;;;;;
+13043;EGYPTIAN HIEROGLYPH A058;Lo;0;L;;;;;N;;;;;
+13044;EGYPTIAN HIEROGLYPH A059;Lo;0;L;;;;;N;;;;;
+13045;EGYPTIAN HIEROGLYPH A060;Lo;0;L;;;;;N;;;;;
+13046;EGYPTIAN HIEROGLYPH A061;Lo;0;L;;;;;N;;;;;
+13047;EGYPTIAN HIEROGLYPH A062;Lo;0;L;;;;;N;;;;;
+13048;EGYPTIAN HIEROGLYPH A063;Lo;0;L;;;;;N;;;;;
+13049;EGYPTIAN HIEROGLYPH A064;Lo;0;L;;;;;N;;;;;
+1304A;EGYPTIAN HIEROGLYPH A065;Lo;0;L;;;;;N;;;;;
+1304B;EGYPTIAN HIEROGLYPH A066;Lo;0;L;;;;;N;;;;;
+1304C;EGYPTIAN HIEROGLYPH A067;Lo;0;L;;;;;N;;;;;
+1304D;EGYPTIAN HIEROGLYPH A068;Lo;0;L;;;;;N;;;;;
+1304E;EGYPTIAN HIEROGLYPH A069;Lo;0;L;;;;;N;;;;;
+1304F;EGYPTIAN HIEROGLYPH A070;Lo;0;L;;;;;N;;;;;
+13050;EGYPTIAN HIEROGLYPH B001;Lo;0;L;;;;;N;;;;;
+13051;EGYPTIAN HIEROGLYPH B002;Lo;0;L;;;;;N;;;;;
+13052;EGYPTIAN HIEROGLYPH B003;Lo;0;L;;;;;N;;;;;
+13053;EGYPTIAN HIEROGLYPH B004;Lo;0;L;;;;;N;;;;;
+13054;EGYPTIAN HIEROGLYPH B005;Lo;0;L;;;;;N;;;;;
+13055;EGYPTIAN HIEROGLYPH B005A;Lo;0;L;;;;;N;;;;;
+13056;EGYPTIAN HIEROGLYPH B006;Lo;0;L;;;;;N;;;;;
+13057;EGYPTIAN HIEROGLYPH B007;Lo;0;L;;;;;N;;;;;
+13058;EGYPTIAN HIEROGLYPH B008;Lo;0;L;;;;;N;;;;;
+13059;EGYPTIAN HIEROGLYPH B009;Lo;0;L;;;;;N;;;;;
+1305A;EGYPTIAN HIEROGLYPH C001;Lo;0;L;;;;;N;;;;;
+1305B;EGYPTIAN HIEROGLYPH C002;Lo;0;L;;;;;N;;;;;
+1305C;EGYPTIAN HIEROGLYPH C002A;Lo;0;L;;;;;N;;;;;
+1305D;EGYPTIAN HIEROGLYPH C002B;Lo;0;L;;;;;N;;;;;
+1305E;EGYPTIAN HIEROGLYPH C002C;Lo;0;L;;;;;N;;;;;
+1305F;EGYPTIAN HIEROGLYPH C003;Lo;0;L;;;;;N;;;;;
+13060;EGYPTIAN HIEROGLYPH C004;Lo;0;L;;;;;N;;;;;
+13061;EGYPTIAN HIEROGLYPH C005;Lo;0;L;;;;;N;;;;;
+13062;EGYPTIAN HIEROGLYPH C006;Lo;0;L;;;;;N;;;;;
+13063;EGYPTIAN HIEROGLYPH C007;Lo;0;L;;;;;N;;;;;
+13064;EGYPTIAN HIEROGLYPH C008;Lo;0;L;;;;;N;;;;;
+13065;EGYPTIAN HIEROGLYPH C009;Lo;0;L;;;;;N;;;;;
+13066;EGYPTIAN HIEROGLYPH C010;Lo;0;L;;;;;N;;;;;
+13067;EGYPTIAN HIEROGLYPH C010A;Lo;0;L;;;;;N;;;;;
+13068;EGYPTIAN HIEROGLYPH C011;Lo;0;L;;;;;N;;;;;
+13069;EGYPTIAN HIEROGLYPH C012;Lo;0;L;;;;;N;;;;;
+1306A;EGYPTIAN HIEROGLYPH C013;Lo;0;L;;;;;N;;;;;
+1306B;EGYPTIAN HIEROGLYPH C014;Lo;0;L;;;;;N;;;;;
+1306C;EGYPTIAN HIEROGLYPH C015;Lo;0;L;;;;;N;;;;;
+1306D;EGYPTIAN HIEROGLYPH C016;Lo;0;L;;;;;N;;;;;
+1306E;EGYPTIAN HIEROGLYPH C017;Lo;0;L;;;;;N;;;;;
+1306F;EGYPTIAN HIEROGLYPH C018;Lo;0;L;;;;;N;;;;;
+13070;EGYPTIAN HIEROGLYPH C019;Lo;0;L;;;;;N;;;;;
+13071;EGYPTIAN HIEROGLYPH C020;Lo;0;L;;;;;N;;;;;
+13072;EGYPTIAN HIEROGLYPH C021;Lo;0;L;;;;;N;;;;;
+13073;EGYPTIAN HIEROGLYPH C022;Lo;0;L;;;;;N;;;;;
+13074;EGYPTIAN HIEROGLYPH C023;Lo;0;L;;;;;N;;;;;
+13075;EGYPTIAN HIEROGLYPH C024;Lo;0;L;;;;;N;;;;;
+13076;EGYPTIAN HIEROGLYPH D001;Lo;0;L;;;;;N;;;;;
+13077;EGYPTIAN HIEROGLYPH D002;Lo;0;L;;;;;N;;;;;
+13078;EGYPTIAN HIEROGLYPH D003;Lo;0;L;;;;;N;;;;;
+13079;EGYPTIAN HIEROGLYPH D004;Lo;0;L;;;;;N;;;;;
+1307A;EGYPTIAN HIEROGLYPH D005;Lo;0;L;;;;;N;;;;;
+1307B;EGYPTIAN HIEROGLYPH D006;Lo;0;L;;;;;N;;;;;
+1307C;EGYPTIAN HIEROGLYPH D007;Lo;0;L;;;;;N;;;;;
+1307D;EGYPTIAN HIEROGLYPH D008;Lo;0;L;;;;;N;;;;;
+1307E;EGYPTIAN HIEROGLYPH D008A;Lo;0;L;;;;;N;;;;;
+1307F;EGYPTIAN HIEROGLYPH D009;Lo;0;L;;;;;N;;;;;
+13080;EGYPTIAN HIEROGLYPH D010;Lo;0;L;;;;;N;;;;;
+13081;EGYPTIAN HIEROGLYPH D011;Lo;0;L;;;;;N;;;;;
+13082;EGYPTIAN HIEROGLYPH D012;Lo;0;L;;;;;N;;;;;
+13083;EGYPTIAN HIEROGLYPH D013;Lo;0;L;;;;;N;;;;;
+13084;EGYPTIAN HIEROGLYPH D014;Lo;0;L;;;;;N;;;;;
+13085;EGYPTIAN HIEROGLYPH D015;Lo;0;L;;;;;N;;;;;
+13086;EGYPTIAN HIEROGLYPH D016;Lo;0;L;;;;;N;;;;;
+13087;EGYPTIAN HIEROGLYPH D017;Lo;0;L;;;;;N;;;;;
+13088;EGYPTIAN HIEROGLYPH D018;Lo;0;L;;;;;N;;;;;
+13089;EGYPTIAN HIEROGLYPH D019;Lo;0;L;;;;;N;;;;;
+1308A;EGYPTIAN HIEROGLYPH D020;Lo;0;L;;;;;N;;;;;
+1308B;EGYPTIAN HIEROGLYPH D021;Lo;0;L;;;;;N;;;;;
+1308C;EGYPTIAN HIEROGLYPH D022;Lo;0;L;;;;;N;;;;;
+1308D;EGYPTIAN HIEROGLYPH D023;Lo;0;L;;;;;N;;;;;
+1308E;EGYPTIAN HIEROGLYPH D024;Lo;0;L;;;;;N;;;;;
+1308F;EGYPTIAN HIEROGLYPH D025;Lo;0;L;;;;;N;;;;;
+13090;EGYPTIAN HIEROGLYPH D026;Lo;0;L;;;;;N;;;;;
+13091;EGYPTIAN HIEROGLYPH D027;Lo;0;L;;;;;N;;;;;
+13092;EGYPTIAN HIEROGLYPH D027A;Lo;0;L;;;;;N;;;;;
+13093;EGYPTIAN HIEROGLYPH D028;Lo;0;L;;;;;N;;;;;
+13094;EGYPTIAN HIEROGLYPH D029;Lo;0;L;;;;;N;;;;;
+13095;EGYPTIAN HIEROGLYPH D030;Lo;0;L;;;;;N;;;;;
+13096;EGYPTIAN HIEROGLYPH D031;Lo;0;L;;;;;N;;;;;
+13097;EGYPTIAN HIEROGLYPH D031A;Lo;0;L;;;;;N;;;;;
+13098;EGYPTIAN HIEROGLYPH D032;Lo;0;L;;;;;N;;;;;
+13099;EGYPTIAN HIEROGLYPH D033;Lo;0;L;;;;;N;;;;;
+1309A;EGYPTIAN HIEROGLYPH D034;Lo;0;L;;;;;N;;;;;
+1309B;EGYPTIAN HIEROGLYPH D034A;Lo;0;L;;;;;N;;;;;
+1309C;EGYPTIAN HIEROGLYPH D035;Lo;0;L;;;;;N;;;;;
+1309D;EGYPTIAN HIEROGLYPH D036;Lo;0;L;;;;;N;;;;;
+1309E;EGYPTIAN HIEROGLYPH D037;Lo;0;L;;;;;N;;;;;
+1309F;EGYPTIAN HIEROGLYPH D038;Lo;0;L;;;;;N;;;;;
+130A0;EGYPTIAN HIEROGLYPH D039;Lo;0;L;;;;;N;;;;;
+130A1;EGYPTIAN HIEROGLYPH D040;Lo;0;L;;;;;N;;;;;
+130A2;EGYPTIAN HIEROGLYPH D041;Lo;0;L;;;;;N;;;;;
+130A3;EGYPTIAN HIEROGLYPH D042;Lo;0;L;;;;;N;;;;;
+130A4;EGYPTIAN HIEROGLYPH D043;Lo;0;L;;;;;N;;;;;
+130A5;EGYPTIAN HIEROGLYPH D044;Lo;0;L;;;;;N;;;;;
+130A6;EGYPTIAN HIEROGLYPH D045;Lo;0;L;;;;;N;;;;;
+130A7;EGYPTIAN HIEROGLYPH D046;Lo;0;L;;;;;N;;;;;
+130A8;EGYPTIAN HIEROGLYPH D046A;Lo;0;L;;;;;N;;;;;
+130A9;EGYPTIAN HIEROGLYPH D047;Lo;0;L;;;;;N;;;;;
+130AA;EGYPTIAN HIEROGLYPH D048;Lo;0;L;;;;;N;;;;;
+130AB;EGYPTIAN HIEROGLYPH D048A;Lo;0;L;;;;;N;;;;;
+130AC;EGYPTIAN HIEROGLYPH D049;Lo;0;L;;;;;N;;;;;
+130AD;EGYPTIAN HIEROGLYPH D050;Lo;0;L;;;;;N;;;;;
+130AE;EGYPTIAN HIEROGLYPH D050A;Lo;0;L;;;;;N;;;;;
+130AF;EGYPTIAN HIEROGLYPH D050B;Lo;0;L;;;;;N;;;;;
+130B0;EGYPTIAN HIEROGLYPH D050C;Lo;0;L;;;;;N;;;;;
+130B1;EGYPTIAN HIEROGLYPH D050D;Lo;0;L;;;;;N;;;;;
+130B2;EGYPTIAN HIEROGLYPH D050E;Lo;0;L;;;;;N;;;;;
+130B3;EGYPTIAN HIEROGLYPH D050F;Lo;0;L;;;;;N;;;;;
+130B4;EGYPTIAN HIEROGLYPH D050G;Lo;0;L;;;;;N;;;;;
+130B5;EGYPTIAN HIEROGLYPH D050H;Lo;0;L;;;;;N;;;;;
+130B6;EGYPTIAN HIEROGLYPH D050I;Lo;0;L;;;;;N;;;;;
+130B7;EGYPTIAN HIEROGLYPH D051;Lo;0;L;;;;;N;;;;;
+130B8;EGYPTIAN HIEROGLYPH D052;Lo;0;L;;;;;N;;;;;
+130B9;EGYPTIAN HIEROGLYPH D052A;Lo;0;L;;;;;N;;;;;
+130BA;EGYPTIAN HIEROGLYPH D053;Lo;0;L;;;;;N;;;;;
+130BB;EGYPTIAN HIEROGLYPH D054;Lo;0;L;;;;;N;;;;;
+130BC;EGYPTIAN HIEROGLYPH D054A;Lo;0;L;;;;;N;;;;;
+130BD;EGYPTIAN HIEROGLYPH D055;Lo;0;L;;;;;N;;;;;
+130BE;EGYPTIAN HIEROGLYPH D056;Lo;0;L;;;;;N;;;;;
+130BF;EGYPTIAN HIEROGLYPH D057;Lo;0;L;;;;;N;;;;;
+130C0;EGYPTIAN HIEROGLYPH D058;Lo;0;L;;;;;N;;;;;
+130C1;EGYPTIAN HIEROGLYPH D059;Lo;0;L;;;;;N;;;;;
+130C2;EGYPTIAN HIEROGLYPH D060;Lo;0;L;;;;;N;;;;;
+130C3;EGYPTIAN HIEROGLYPH D061;Lo;0;L;;;;;N;;;;;
+130C4;EGYPTIAN HIEROGLYPH D062;Lo;0;L;;;;;N;;;;;
+130C5;EGYPTIAN HIEROGLYPH D063;Lo;0;L;;;;;N;;;;;
+130C6;EGYPTIAN HIEROGLYPH D064;Lo;0;L;;;;;N;;;;;
+130C7;EGYPTIAN HIEROGLYPH D065;Lo;0;L;;;;;N;;;;;
+130C8;EGYPTIAN HIEROGLYPH D066;Lo;0;L;;;;;N;;;;;
+130C9;EGYPTIAN HIEROGLYPH D067;Lo;0;L;;;;;N;;;;;
+130CA;EGYPTIAN HIEROGLYPH D067A;Lo;0;L;;;;;N;;;;;
+130CB;EGYPTIAN HIEROGLYPH D067B;Lo;0;L;;;;;N;;;;;
+130CC;EGYPTIAN HIEROGLYPH D067C;Lo;0;L;;;;;N;;;;;
+130CD;EGYPTIAN HIEROGLYPH D067D;Lo;0;L;;;;;N;;;;;
+130CE;EGYPTIAN HIEROGLYPH D067E;Lo;0;L;;;;;N;;;;;
+130CF;EGYPTIAN HIEROGLYPH D067F;Lo;0;L;;;;;N;;;;;
+130D0;EGYPTIAN HIEROGLYPH D067G;Lo;0;L;;;;;N;;;;;
+130D1;EGYPTIAN HIEROGLYPH D067H;Lo;0;L;;;;;N;;;;;
+130D2;EGYPTIAN HIEROGLYPH E001;Lo;0;L;;;;;N;;;;;
+130D3;EGYPTIAN HIEROGLYPH E002;Lo;0;L;;;;;N;;;;;
+130D4;EGYPTIAN HIEROGLYPH E003;Lo;0;L;;;;;N;;;;;
+130D5;EGYPTIAN HIEROGLYPH E004;Lo;0;L;;;;;N;;;;;
+130D6;EGYPTIAN HIEROGLYPH E005;Lo;0;L;;;;;N;;;;;
+130D7;EGYPTIAN HIEROGLYPH E006;Lo;0;L;;;;;N;;;;;
+130D8;EGYPTIAN HIEROGLYPH E007;Lo;0;L;;;;;N;;;;;
+130D9;EGYPTIAN HIEROGLYPH E008;Lo;0;L;;;;;N;;;;;
+130DA;EGYPTIAN HIEROGLYPH E008A;Lo;0;L;;;;;N;;;;;
+130DB;EGYPTIAN HIEROGLYPH E009;Lo;0;L;;;;;N;;;;;
+130DC;EGYPTIAN HIEROGLYPH E009A;Lo;0;L;;;;;N;;;;;
+130DD;EGYPTIAN HIEROGLYPH E010;Lo;0;L;;;;;N;;;;;
+130DE;EGYPTIAN HIEROGLYPH E011;Lo;0;L;;;;;N;;;;;
+130DF;EGYPTIAN HIEROGLYPH E012;Lo;0;L;;;;;N;;;;;
+130E0;EGYPTIAN HIEROGLYPH E013;Lo;0;L;;;;;N;;;;;
+130E1;EGYPTIAN HIEROGLYPH E014;Lo;0;L;;;;;N;;;;;
+130E2;EGYPTIAN HIEROGLYPH E015;Lo;0;L;;;;;N;;;;;
+130E3;EGYPTIAN HIEROGLYPH E016;Lo;0;L;;;;;N;;;;;
+130E4;EGYPTIAN HIEROGLYPH E016A;Lo;0;L;;;;;N;;;;;
+130E5;EGYPTIAN HIEROGLYPH E017;Lo;0;L;;;;;N;;;;;
+130E6;EGYPTIAN HIEROGLYPH E017A;Lo;0;L;;;;;N;;;;;
+130E7;EGYPTIAN HIEROGLYPH E018;Lo;0;L;;;;;N;;;;;
+130E8;EGYPTIAN HIEROGLYPH E019;Lo;0;L;;;;;N;;;;;
+130E9;EGYPTIAN HIEROGLYPH E020;Lo;0;L;;;;;N;;;;;
+130EA;EGYPTIAN HIEROGLYPH E020A;Lo;0;L;;;;;N;;;;;
+130EB;EGYPTIAN HIEROGLYPH E021;Lo;0;L;;;;;N;;;;;
+130EC;EGYPTIAN HIEROGLYPH E022;Lo;0;L;;;;;N;;;;;
+130ED;EGYPTIAN HIEROGLYPH E023;Lo;0;L;;;;;N;;;;;
+130EE;EGYPTIAN HIEROGLYPH E024;Lo;0;L;;;;;N;;;;;
+130EF;EGYPTIAN HIEROGLYPH E025;Lo;0;L;;;;;N;;;;;
+130F0;EGYPTIAN HIEROGLYPH E026;Lo;0;L;;;;;N;;;;;
+130F1;EGYPTIAN HIEROGLYPH E027;Lo;0;L;;;;;N;;;;;
+130F2;EGYPTIAN HIEROGLYPH E028;Lo;0;L;;;;;N;;;;;
+130F3;EGYPTIAN HIEROGLYPH E028A;Lo;0;L;;;;;N;;;;;
+130F4;EGYPTIAN HIEROGLYPH E029;Lo;0;L;;;;;N;;;;;
+130F5;EGYPTIAN HIEROGLYPH E030;Lo;0;L;;;;;N;;;;;
+130F6;EGYPTIAN HIEROGLYPH E031;Lo;0;L;;;;;N;;;;;
+130F7;EGYPTIAN HIEROGLYPH E032;Lo;0;L;;;;;N;;;;;
+130F8;EGYPTIAN HIEROGLYPH E033;Lo;0;L;;;;;N;;;;;
+130F9;EGYPTIAN HIEROGLYPH E034;Lo;0;L;;;;;N;;;;;
+130FA;EGYPTIAN HIEROGLYPH E034A;Lo;0;L;;;;;N;;;;;
+130FB;EGYPTIAN HIEROGLYPH E036;Lo;0;L;;;;;N;;;;;
+130FC;EGYPTIAN HIEROGLYPH E037;Lo;0;L;;;;;N;;;;;
+130FD;EGYPTIAN HIEROGLYPH E038;Lo;0;L;;;;;N;;;;;
+130FE;EGYPTIAN HIEROGLYPH F001;Lo;0;L;;;;;N;;;;;
+130FF;EGYPTIAN HIEROGLYPH F001A;Lo;0;L;;;;;N;;;;;
+13100;EGYPTIAN HIEROGLYPH F002;Lo;0;L;;;;;N;;;;;
+13101;EGYPTIAN HIEROGLYPH F003;Lo;0;L;;;;;N;;;;;
+13102;EGYPTIAN HIEROGLYPH F004;Lo;0;L;;;;;N;;;;;
+13103;EGYPTIAN HIEROGLYPH F005;Lo;0;L;;;;;N;;;;;
+13104;EGYPTIAN HIEROGLYPH F006;Lo;0;L;;;;;N;;;;;
+13105;EGYPTIAN HIEROGLYPH F007;Lo;0;L;;;;;N;;;;;
+13106;EGYPTIAN HIEROGLYPH F008;Lo;0;L;;;;;N;;;;;
+13107;EGYPTIAN HIEROGLYPH F009;Lo;0;L;;;;;N;;;;;
+13108;EGYPTIAN HIEROGLYPH F010;Lo;0;L;;;;;N;;;;;
+13109;EGYPTIAN HIEROGLYPH F011;Lo;0;L;;;;;N;;;;;
+1310A;EGYPTIAN HIEROGLYPH F012;Lo;0;L;;;;;N;;;;;
+1310B;EGYPTIAN HIEROGLYPH F013;Lo;0;L;;;;;N;;;;;
+1310C;EGYPTIAN HIEROGLYPH F013A;Lo;0;L;;;;;N;;;;;
+1310D;EGYPTIAN HIEROGLYPH F014;Lo;0;L;;;;;N;;;;;
+1310E;EGYPTIAN HIEROGLYPH F015;Lo;0;L;;;;;N;;;;;
+1310F;EGYPTIAN HIEROGLYPH F016;Lo;0;L;;;;;N;;;;;
+13110;EGYPTIAN HIEROGLYPH F017;Lo;0;L;;;;;N;;;;;
+13111;EGYPTIAN HIEROGLYPH F018;Lo;0;L;;;;;N;;;;;
+13112;EGYPTIAN HIEROGLYPH F019;Lo;0;L;;;;;N;;;;;
+13113;EGYPTIAN HIEROGLYPH F020;Lo;0;L;;;;;N;;;;;
+13114;EGYPTIAN HIEROGLYPH F021;Lo;0;L;;;;;N;;;;;
+13115;EGYPTIAN HIEROGLYPH F021A;Lo;0;L;;;;;N;;;;;
+13116;EGYPTIAN HIEROGLYPH F022;Lo;0;L;;;;;N;;;;;
+13117;EGYPTIAN HIEROGLYPH F023;Lo;0;L;;;;;N;;;;;
+13118;EGYPTIAN HIEROGLYPH F024;Lo;0;L;;;;;N;;;;;
+13119;EGYPTIAN HIEROGLYPH F025;Lo;0;L;;;;;N;;;;;
+1311A;EGYPTIAN HIEROGLYPH F026;Lo;0;L;;;;;N;;;;;
+1311B;EGYPTIAN HIEROGLYPH F027;Lo;0;L;;;;;N;;;;;
+1311C;EGYPTIAN HIEROGLYPH F028;Lo;0;L;;;;;N;;;;;
+1311D;EGYPTIAN HIEROGLYPH F029;Lo;0;L;;;;;N;;;;;
+1311E;EGYPTIAN HIEROGLYPH F030;Lo;0;L;;;;;N;;;;;
+1311F;EGYPTIAN HIEROGLYPH F031;Lo;0;L;;;;;N;;;;;
+13120;EGYPTIAN HIEROGLYPH F031A;Lo;0;L;;;;;N;;;;;
+13121;EGYPTIAN HIEROGLYPH F032;Lo;0;L;;;;;N;;;;;
+13122;EGYPTIAN HIEROGLYPH F033;Lo;0;L;;;;;N;;;;;
+13123;EGYPTIAN HIEROGLYPH F034;Lo;0;L;;;;;N;;;;;
+13124;EGYPTIAN HIEROGLYPH F035;Lo;0;L;;;;;N;;;;;
+13125;EGYPTIAN HIEROGLYPH F036;Lo;0;L;;;;;N;;;;;
+13126;EGYPTIAN HIEROGLYPH F037;Lo;0;L;;;;;N;;;;;
+13127;EGYPTIAN HIEROGLYPH F037A;Lo;0;L;;;;;N;;;;;
+13128;EGYPTIAN HIEROGLYPH F038;Lo;0;L;;;;;N;;;;;
+13129;EGYPTIAN HIEROGLYPH F038A;Lo;0;L;;;;;N;;;;;
+1312A;EGYPTIAN HIEROGLYPH F039;Lo;0;L;;;;;N;;;;;
+1312B;EGYPTIAN HIEROGLYPH F040;Lo;0;L;;;;;N;;;;;
+1312C;EGYPTIAN HIEROGLYPH F041;Lo;0;L;;;;;N;;;;;
+1312D;EGYPTIAN HIEROGLYPH F042;Lo;0;L;;;;;N;;;;;
+1312E;EGYPTIAN HIEROGLYPH F043;Lo;0;L;;;;;N;;;;;
+1312F;EGYPTIAN HIEROGLYPH F044;Lo;0;L;;;;;N;;;;;
+13130;EGYPTIAN HIEROGLYPH F045;Lo;0;L;;;;;N;;;;;
+13131;EGYPTIAN HIEROGLYPH F045A;Lo;0;L;;;;;N;;;;;
+13132;EGYPTIAN HIEROGLYPH F046;Lo;0;L;;;;;N;;;;;
+13133;EGYPTIAN HIEROGLYPH F046A;Lo;0;L;;;;;N;;;;;
+13134;EGYPTIAN HIEROGLYPH F047;Lo;0;L;;;;;N;;;;;
+13135;EGYPTIAN HIEROGLYPH F047A;Lo;0;L;;;;;N;;;;;
+13136;EGYPTIAN HIEROGLYPH F048;Lo;0;L;;;;;N;;;;;
+13137;EGYPTIAN HIEROGLYPH F049;Lo;0;L;;;;;N;;;;;
+13138;EGYPTIAN HIEROGLYPH F050;Lo;0;L;;;;;N;;;;;
+13139;EGYPTIAN HIEROGLYPH F051;Lo;0;L;;;;;N;;;;;
+1313A;EGYPTIAN HIEROGLYPH F051A;Lo;0;L;;;;;N;;;;;
+1313B;EGYPTIAN HIEROGLYPH F051B;Lo;0;L;;;;;N;;;;;
+1313C;EGYPTIAN HIEROGLYPH F051C;Lo;0;L;;;;;N;;;;;
+1313D;EGYPTIAN HIEROGLYPH F052;Lo;0;L;;;;;N;;;;;
+1313E;EGYPTIAN HIEROGLYPH F053;Lo;0;L;;;;;N;;;;;
+1313F;EGYPTIAN HIEROGLYPH G001;Lo;0;L;;;;;N;;;;;
+13140;EGYPTIAN HIEROGLYPH G002;Lo;0;L;;;;;N;;;;;
+13141;EGYPTIAN HIEROGLYPH G003;Lo;0;L;;;;;N;;;;;
+13142;EGYPTIAN HIEROGLYPH G004;Lo;0;L;;;;;N;;;;;
+13143;EGYPTIAN HIEROGLYPH G005;Lo;0;L;;;;;N;;;;;
+13144;EGYPTIAN HIEROGLYPH G006;Lo;0;L;;;;;N;;;;;
+13145;EGYPTIAN HIEROGLYPH G006A;Lo;0;L;;;;;N;;;;;
+13146;EGYPTIAN HIEROGLYPH G007;Lo;0;L;;;;;N;;;;;
+13147;EGYPTIAN HIEROGLYPH G007A;Lo;0;L;;;;;N;;;;;
+13148;EGYPTIAN HIEROGLYPH G007B;Lo;0;L;;;;;N;;;;;
+13149;EGYPTIAN HIEROGLYPH G008;Lo;0;L;;;;;N;;;;;
+1314A;EGYPTIAN HIEROGLYPH G009;Lo;0;L;;;;;N;;;;;
+1314B;EGYPTIAN HIEROGLYPH G010;Lo;0;L;;;;;N;;;;;
+1314C;EGYPTIAN HIEROGLYPH G011;Lo;0;L;;;;;N;;;;;
+1314D;EGYPTIAN HIEROGLYPH G011A;Lo;0;L;;;;;N;;;;;
+1314E;EGYPTIAN HIEROGLYPH G012;Lo;0;L;;;;;N;;;;;
+1314F;EGYPTIAN HIEROGLYPH G013;Lo;0;L;;;;;N;;;;;
+13150;EGYPTIAN HIEROGLYPH G014;Lo;0;L;;;;;N;;;;;
+13151;EGYPTIAN HIEROGLYPH G015;Lo;0;L;;;;;N;;;;;
+13152;EGYPTIAN HIEROGLYPH G016;Lo;0;L;;;;;N;;;;;
+13153;EGYPTIAN HIEROGLYPH G017;Lo;0;L;;;;;N;;;;;
+13154;EGYPTIAN HIEROGLYPH G018;Lo;0;L;;;;;N;;;;;
+13155;EGYPTIAN HIEROGLYPH G019;Lo;0;L;;;;;N;;;;;
+13156;EGYPTIAN HIEROGLYPH G020;Lo;0;L;;;;;N;;;;;
+13157;EGYPTIAN HIEROGLYPH G020A;Lo;0;L;;;;;N;;;;;
+13158;EGYPTIAN HIEROGLYPH G021;Lo;0;L;;;;;N;;;;;
+13159;EGYPTIAN HIEROGLYPH G022;Lo;0;L;;;;;N;;;;;
+1315A;EGYPTIAN HIEROGLYPH G023;Lo;0;L;;;;;N;;;;;
+1315B;EGYPTIAN HIEROGLYPH G024;Lo;0;L;;;;;N;;;;;
+1315C;EGYPTIAN HIEROGLYPH G025;Lo;0;L;;;;;N;;;;;
+1315D;EGYPTIAN HIEROGLYPH G026;Lo;0;L;;;;;N;;;;;
+1315E;EGYPTIAN HIEROGLYPH G026A;Lo;0;L;;;;;N;;;;;
+1315F;EGYPTIAN HIEROGLYPH G027;Lo;0;L;;;;;N;;;;;
+13160;EGYPTIAN HIEROGLYPH G028;Lo;0;L;;;;;N;;;;;
+13161;EGYPTIAN HIEROGLYPH G029;Lo;0;L;;;;;N;;;;;
+13162;EGYPTIAN HIEROGLYPH G030;Lo;0;L;;;;;N;;;;;
+13163;EGYPTIAN HIEROGLYPH G031;Lo;0;L;;;;;N;;;;;
+13164;EGYPTIAN HIEROGLYPH G032;Lo;0;L;;;;;N;;;;;
+13165;EGYPTIAN HIEROGLYPH G033;Lo;0;L;;;;;N;;;;;
+13166;EGYPTIAN HIEROGLYPH G034;Lo;0;L;;;;;N;;;;;
+13167;EGYPTIAN HIEROGLYPH G035;Lo;0;L;;;;;N;;;;;
+13168;EGYPTIAN HIEROGLYPH G036;Lo;0;L;;;;;N;;;;;
+13169;EGYPTIAN HIEROGLYPH G036A;Lo;0;L;;;;;N;;;;;
+1316A;EGYPTIAN HIEROGLYPH G037;Lo;0;L;;;;;N;;;;;
+1316B;EGYPTIAN HIEROGLYPH G037A;Lo;0;L;;;;;N;;;;;
+1316C;EGYPTIAN HIEROGLYPH G038;Lo;0;L;;;;;N;;;;;
+1316D;EGYPTIAN HIEROGLYPH G039;Lo;0;L;;;;;N;;;;;
+1316E;EGYPTIAN HIEROGLYPH G040;Lo;0;L;;;;;N;;;;;
+1316F;EGYPTIAN HIEROGLYPH G041;Lo;0;L;;;;;N;;;;;
+13170;EGYPTIAN HIEROGLYPH G042;Lo;0;L;;;;;N;;;;;
+13171;EGYPTIAN HIEROGLYPH G043;Lo;0;L;;;;;N;;;;;
+13172;EGYPTIAN HIEROGLYPH G043A;Lo;0;L;;;;;N;;;;;
+13173;EGYPTIAN HIEROGLYPH G044;Lo;0;L;;;;;N;;;;;
+13174;EGYPTIAN HIEROGLYPH G045;Lo;0;L;;;;;N;;;;;
+13175;EGYPTIAN HIEROGLYPH G045A;Lo;0;L;;;;;N;;;;;
+13176;EGYPTIAN HIEROGLYPH G046;Lo;0;L;;;;;N;;;;;
+13177;EGYPTIAN HIEROGLYPH G047;Lo;0;L;;;;;N;;;;;
+13178;EGYPTIAN HIEROGLYPH G048;Lo;0;L;;;;;N;;;;;
+13179;EGYPTIAN HIEROGLYPH G049;Lo;0;L;;;;;N;;;;;
+1317A;EGYPTIAN HIEROGLYPH G050;Lo;0;L;;;;;N;;;;;
+1317B;EGYPTIAN HIEROGLYPH G051;Lo;0;L;;;;;N;;;;;
+1317C;EGYPTIAN HIEROGLYPH G052;Lo;0;L;;;;;N;;;;;
+1317D;EGYPTIAN HIEROGLYPH G053;Lo;0;L;;;;;N;;;;;
+1317E;EGYPTIAN HIEROGLYPH G054;Lo;0;L;;;;;N;;;;;
+1317F;EGYPTIAN HIEROGLYPH H001;Lo;0;L;;;;;N;;;;;
+13180;EGYPTIAN HIEROGLYPH H002;Lo;0;L;;;;;N;;;;;
+13181;EGYPTIAN HIEROGLYPH H003;Lo;0;L;;;;;N;;;;;
+13182;EGYPTIAN HIEROGLYPH H004;Lo;0;L;;;;;N;;;;;
+13183;EGYPTIAN HIEROGLYPH H005;Lo;0;L;;;;;N;;;;;
+13184;EGYPTIAN HIEROGLYPH H006;Lo;0;L;;;;;N;;;;;
+13185;EGYPTIAN HIEROGLYPH H006A;Lo;0;L;;;;;N;;;;;
+13186;EGYPTIAN HIEROGLYPH H007;Lo;0;L;;;;;N;;;;;
+13187;EGYPTIAN HIEROGLYPH H008;Lo;0;L;;;;;N;;;;;
+13188;EGYPTIAN HIEROGLYPH I001;Lo;0;L;;;;;N;;;;;
+13189;EGYPTIAN HIEROGLYPH I002;Lo;0;L;;;;;N;;;;;
+1318A;EGYPTIAN HIEROGLYPH I003;Lo;0;L;;;;;N;;;;;
+1318B;EGYPTIAN HIEROGLYPH I004;Lo;0;L;;;;;N;;;;;
+1318C;EGYPTIAN HIEROGLYPH I005;Lo;0;L;;;;;N;;;;;
+1318D;EGYPTIAN HIEROGLYPH I005A;Lo;0;L;;;;;N;;;;;
+1318E;EGYPTIAN HIEROGLYPH I006;Lo;0;L;;;;;N;;;;;
+1318F;EGYPTIAN HIEROGLYPH I007;Lo;0;L;;;;;N;;;;;
+13190;EGYPTIAN HIEROGLYPH I008;Lo;0;L;;;;;N;;;;;
+13191;EGYPTIAN HIEROGLYPH I009;Lo;0;L;;;;;N;;;;;
+13192;EGYPTIAN HIEROGLYPH I009A;Lo;0;L;;;;;N;;;;;
+13193;EGYPTIAN HIEROGLYPH I010;Lo;0;L;;;;;N;;;;;
+13194;EGYPTIAN HIEROGLYPH I010A;Lo;0;L;;;;;N;;;;;
+13195;EGYPTIAN HIEROGLYPH I011;Lo;0;L;;;;;N;;;;;
+13196;EGYPTIAN HIEROGLYPH I011A;Lo;0;L;;;;;N;;;;;
+13197;EGYPTIAN HIEROGLYPH I012;Lo;0;L;;;;;N;;;;;
+13198;EGYPTIAN HIEROGLYPH I013;Lo;0;L;;;;;N;;;;;
+13199;EGYPTIAN HIEROGLYPH I014;Lo;0;L;;;;;N;;;;;
+1319A;EGYPTIAN HIEROGLYPH I015;Lo;0;L;;;;;N;;;;;
+1319B;EGYPTIAN HIEROGLYPH K001;Lo;0;L;;;;;N;;;;;
+1319C;EGYPTIAN HIEROGLYPH K002;Lo;0;L;;;;;N;;;;;
+1319D;EGYPTIAN HIEROGLYPH K003;Lo;0;L;;;;;N;;;;;
+1319E;EGYPTIAN HIEROGLYPH K004;Lo;0;L;;;;;N;;;;;
+1319F;EGYPTIAN HIEROGLYPH K005;Lo;0;L;;;;;N;;;;;
+131A0;EGYPTIAN HIEROGLYPH K006;Lo;0;L;;;;;N;;;;;
+131A1;EGYPTIAN HIEROGLYPH K007;Lo;0;L;;;;;N;;;;;
+131A2;EGYPTIAN HIEROGLYPH K008;Lo;0;L;;;;;N;;;;;
+131A3;EGYPTIAN HIEROGLYPH L001;Lo;0;L;;;;;N;;;;;
+131A4;EGYPTIAN HIEROGLYPH L002;Lo;0;L;;;;;N;;;;;
+131A5;EGYPTIAN HIEROGLYPH L002A;Lo;0;L;;;;;N;;;;;
+131A6;EGYPTIAN HIEROGLYPH L003;Lo;0;L;;;;;N;;;;;
+131A7;EGYPTIAN HIEROGLYPH L004;Lo;0;L;;;;;N;;;;;
+131A8;EGYPTIAN HIEROGLYPH L005;Lo;0;L;;;;;N;;;;;
+131A9;EGYPTIAN HIEROGLYPH L006;Lo;0;L;;;;;N;;;;;
+131AA;EGYPTIAN HIEROGLYPH L006A;Lo;0;L;;;;;N;;;;;
+131AB;EGYPTIAN HIEROGLYPH L007;Lo;0;L;;;;;N;;;;;
+131AC;EGYPTIAN HIEROGLYPH L008;Lo;0;L;;;;;N;;;;;
+131AD;EGYPTIAN HIEROGLYPH M001;Lo;0;L;;;;;N;;;;;
+131AE;EGYPTIAN HIEROGLYPH M001A;Lo;0;L;;;;;N;;;;;
+131AF;EGYPTIAN HIEROGLYPH M001B;Lo;0;L;;;;;N;;;;;
+131B0;EGYPTIAN HIEROGLYPH M002;Lo;0;L;;;;;N;;;;;
+131B1;EGYPTIAN HIEROGLYPH M003;Lo;0;L;;;;;N;;;;;
+131B2;EGYPTIAN HIEROGLYPH M003A;Lo;0;L;;;;;N;;;;;
+131B3;EGYPTIAN HIEROGLYPH M004;Lo;0;L;;;;;N;;;;;
+131B4;EGYPTIAN HIEROGLYPH M005;Lo;0;L;;;;;N;;;;;
+131B5;EGYPTIAN HIEROGLYPH M006;Lo;0;L;;;;;N;;;;;
+131B6;EGYPTIAN HIEROGLYPH M007;Lo;0;L;;;;;N;;;;;
+131B7;EGYPTIAN HIEROGLYPH M008;Lo;0;L;;;;;N;;;;;
+131B8;EGYPTIAN HIEROGLYPH M009;Lo;0;L;;;;;N;;;;;
+131B9;EGYPTIAN HIEROGLYPH M010;Lo;0;L;;;;;N;;;;;
+131BA;EGYPTIAN HIEROGLYPH M010A;Lo;0;L;;;;;N;;;;;
+131BB;EGYPTIAN HIEROGLYPH M011;Lo;0;L;;;;;N;;;;;
+131BC;EGYPTIAN HIEROGLYPH M012;Lo;0;L;;;;;N;;;;;
+131BD;EGYPTIAN HIEROGLYPH M012A;Lo;0;L;;;;;N;;;;;
+131BE;EGYPTIAN HIEROGLYPH M012B;Lo;0;L;;;;;N;;;;;
+131BF;EGYPTIAN HIEROGLYPH M012C;Lo;0;L;;;;;N;;;;;
+131C0;EGYPTIAN HIEROGLYPH M012D;Lo;0;L;;;;;N;;;;;
+131C1;EGYPTIAN HIEROGLYPH M012E;Lo;0;L;;;;;N;;;;;
+131C2;EGYPTIAN HIEROGLYPH M012F;Lo;0;L;;;;;N;;;;;
+131C3;EGYPTIAN HIEROGLYPH M012G;Lo;0;L;;;;;N;;;;;
+131C4;EGYPTIAN HIEROGLYPH M012H;Lo;0;L;;;;;N;;;;;
+131C5;EGYPTIAN HIEROGLYPH M013;Lo;0;L;;;;;N;;;;;
+131C6;EGYPTIAN HIEROGLYPH M014;Lo;0;L;;;;;N;;;;;
+131C7;EGYPTIAN HIEROGLYPH M015;Lo;0;L;;;;;N;;;;;
+131C8;EGYPTIAN HIEROGLYPH M015A;Lo;0;L;;;;;N;;;;;
+131C9;EGYPTIAN HIEROGLYPH M016;Lo;0;L;;;;;N;;;;;
+131CA;EGYPTIAN HIEROGLYPH M016A;Lo;0;L;;;;;N;;;;;
+131CB;EGYPTIAN HIEROGLYPH M017;Lo;0;L;;;;;N;;;;;
+131CC;EGYPTIAN HIEROGLYPH M017A;Lo;0;L;;;;;N;;;;;
+131CD;EGYPTIAN HIEROGLYPH M018;Lo;0;L;;;;;N;;;;;
+131CE;EGYPTIAN HIEROGLYPH M019;Lo;0;L;;;;;N;;;;;
+131CF;EGYPTIAN HIEROGLYPH M020;Lo;0;L;;;;;N;;;;;
+131D0;EGYPTIAN HIEROGLYPH M021;Lo;0;L;;;;;N;;;;;
+131D1;EGYPTIAN HIEROGLYPH M022;Lo;0;L;;;;;N;;;;;
+131D2;EGYPTIAN HIEROGLYPH M022A;Lo;0;L;;;;;N;;;;;
+131D3;EGYPTIAN HIEROGLYPH M023;Lo;0;L;;;;;N;;;;;
+131D4;EGYPTIAN HIEROGLYPH M024;Lo;0;L;;;;;N;;;;;
+131D5;EGYPTIAN HIEROGLYPH M024A;Lo;0;L;;;;;N;;;;;
+131D6;EGYPTIAN HIEROGLYPH M025;Lo;0;L;;;;;N;;;;;
+131D7;EGYPTIAN HIEROGLYPH M026;Lo;0;L;;;;;N;;;;;
+131D8;EGYPTIAN HIEROGLYPH M027;Lo;0;L;;;;;N;;;;;
+131D9;EGYPTIAN HIEROGLYPH M028;Lo;0;L;;;;;N;;;;;
+131DA;EGYPTIAN HIEROGLYPH M028A;Lo;0;L;;;;;N;;;;;
+131DB;EGYPTIAN HIEROGLYPH M029;Lo;0;L;;;;;N;;;;;
+131DC;EGYPTIAN HIEROGLYPH M030;Lo;0;L;;;;;N;;;;;
+131DD;EGYPTIAN HIEROGLYPH M031;Lo;0;L;;;;;N;;;;;
+131DE;EGYPTIAN HIEROGLYPH M031A;Lo;0;L;;;;;N;;;;;
+131DF;EGYPTIAN HIEROGLYPH M032;Lo;0;L;;;;;N;;;;;
+131E0;EGYPTIAN HIEROGLYPH M033;Lo;0;L;;;;;N;;;;;
+131E1;EGYPTIAN HIEROGLYPH M033A;Lo;0;L;;;;;N;;;;;
+131E2;EGYPTIAN HIEROGLYPH M033B;Lo;0;L;;;;;N;;;;;
+131E3;EGYPTIAN HIEROGLYPH M034;Lo;0;L;;;;;N;;;;;
+131E4;EGYPTIAN HIEROGLYPH M035;Lo;0;L;;;;;N;;;;;
+131E5;EGYPTIAN HIEROGLYPH M036;Lo;0;L;;;;;N;;;;;
+131E6;EGYPTIAN HIEROGLYPH M037;Lo;0;L;;;;;N;;;;;
+131E7;EGYPTIAN HIEROGLYPH M038;Lo;0;L;;;;;N;;;;;
+131E8;EGYPTIAN HIEROGLYPH M039;Lo;0;L;;;;;N;;;;;
+131E9;EGYPTIAN HIEROGLYPH M040;Lo;0;L;;;;;N;;;;;
+131EA;EGYPTIAN HIEROGLYPH M040A;Lo;0;L;;;;;N;;;;;
+131EB;EGYPTIAN HIEROGLYPH M041;Lo;0;L;;;;;N;;;;;
+131EC;EGYPTIAN HIEROGLYPH M042;Lo;0;L;;;;;N;;;;;
+131ED;EGYPTIAN HIEROGLYPH M043;Lo;0;L;;;;;N;;;;;
+131EE;EGYPTIAN HIEROGLYPH M044;Lo;0;L;;;;;N;;;;;
+131EF;EGYPTIAN HIEROGLYPH N001;Lo;0;L;;;;;N;;;;;
+131F0;EGYPTIAN HIEROGLYPH N002;Lo;0;L;;;;;N;;;;;
+131F1;EGYPTIAN HIEROGLYPH N003;Lo;0;L;;;;;N;;;;;
+131F2;EGYPTIAN HIEROGLYPH N004;Lo;0;L;;;;;N;;;;;
+131F3;EGYPTIAN HIEROGLYPH N005;Lo;0;L;;;;;N;;;;;
+131F4;EGYPTIAN HIEROGLYPH N006;Lo;0;L;;;;;N;;;;;
+131F5;EGYPTIAN HIEROGLYPH N007;Lo;0;L;;;;;N;;;;;
+131F6;EGYPTIAN HIEROGLYPH N008;Lo;0;L;;;;;N;;;;;
+131F7;EGYPTIAN HIEROGLYPH N009;Lo;0;L;;;;;N;;;;;
+131F8;EGYPTIAN HIEROGLYPH N010;Lo;0;L;;;;;N;;;;;
+131F9;EGYPTIAN HIEROGLYPH N011;Lo;0;L;;;;;N;;;;;
+131FA;EGYPTIAN HIEROGLYPH N012;Lo;0;L;;;;;N;;;;;
+131FB;EGYPTIAN HIEROGLYPH N013;Lo;0;L;;;;;N;;;;;
+131FC;EGYPTIAN HIEROGLYPH N014;Lo;0;L;;;;;N;;;;;
+131FD;EGYPTIAN HIEROGLYPH N015;Lo;0;L;;;;;N;;;;;
+131FE;EGYPTIAN HIEROGLYPH N016;Lo;0;L;;;;;N;;;;;
+131FF;EGYPTIAN HIEROGLYPH N017;Lo;0;L;;;;;N;;;;;
+13200;EGYPTIAN HIEROGLYPH N018;Lo;0;L;;;;;N;;;;;
+13201;EGYPTIAN HIEROGLYPH N018A;Lo;0;L;;;;;N;;;;;
+13202;EGYPTIAN HIEROGLYPH N018B;Lo;0;L;;;;;N;;;;;
+13203;EGYPTIAN HIEROGLYPH N019;Lo;0;L;;;;;N;;;;;
+13204;EGYPTIAN HIEROGLYPH N020;Lo;0;L;;;;;N;;;;;
+13205;EGYPTIAN HIEROGLYPH N021;Lo;0;L;;;;;N;;;;;
+13206;EGYPTIAN HIEROGLYPH N022;Lo;0;L;;;;;N;;;;;
+13207;EGYPTIAN HIEROGLYPH N023;Lo;0;L;;;;;N;;;;;
+13208;EGYPTIAN HIEROGLYPH N024;Lo;0;L;;;;;N;;;;;
+13209;EGYPTIAN HIEROGLYPH N025;Lo;0;L;;;;;N;;;;;
+1320A;EGYPTIAN HIEROGLYPH N025A;Lo;0;L;;;;;N;;;;;
+1320B;EGYPTIAN HIEROGLYPH N026;Lo;0;L;;;;;N;;;;;
+1320C;EGYPTIAN HIEROGLYPH N027;Lo;0;L;;;;;N;;;;;
+1320D;EGYPTIAN HIEROGLYPH N028;Lo;0;L;;;;;N;;;;;
+1320E;EGYPTIAN HIEROGLYPH N029;Lo;0;L;;;;;N;;;;;
+1320F;EGYPTIAN HIEROGLYPH N030;Lo;0;L;;;;;N;;;;;
+13210;EGYPTIAN HIEROGLYPH N031;Lo;0;L;;;;;N;;;;;
+13211;EGYPTIAN HIEROGLYPH N032;Lo;0;L;;;;;N;;;;;
+13212;EGYPTIAN HIEROGLYPH N033;Lo;0;L;;;;;N;;;;;
+13213;EGYPTIAN HIEROGLYPH N033A;Lo;0;L;;;;;N;;;;;
+13214;EGYPTIAN HIEROGLYPH N034;Lo;0;L;;;;;N;;;;;
+13215;EGYPTIAN HIEROGLYPH N034A;Lo;0;L;;;;;N;;;;;
+13216;EGYPTIAN HIEROGLYPH N035;Lo;0;L;;;;;N;;;;;
+13217;EGYPTIAN HIEROGLYPH N035A;Lo;0;L;;;;;N;;;;;
+13218;EGYPTIAN HIEROGLYPH N036;Lo;0;L;;;;;N;;;;;
+13219;EGYPTIAN HIEROGLYPH N037;Lo;0;L;;;;;N;;;;;
+1321A;EGYPTIAN HIEROGLYPH N037A;Lo;0;L;;;;;N;;;;;
+1321B;EGYPTIAN HIEROGLYPH N038;Lo;0;L;;;;;N;;;;;
+1321C;EGYPTIAN HIEROGLYPH N039;Lo;0;L;;;;;N;;;;;
+1321D;EGYPTIAN HIEROGLYPH N040;Lo;0;L;;;;;N;;;;;
+1321E;EGYPTIAN HIEROGLYPH N041;Lo;0;L;;;;;N;;;;;
+1321F;EGYPTIAN HIEROGLYPH N042;Lo;0;L;;;;;N;;;;;
+13220;EGYPTIAN HIEROGLYPH NL001;Lo;0;L;;;;;N;;;;;
+13221;EGYPTIAN HIEROGLYPH NL002;Lo;0;L;;;;;N;;;;;
+13222;EGYPTIAN HIEROGLYPH NL003;Lo;0;L;;;;;N;;;;;
+13223;EGYPTIAN HIEROGLYPH NL004;Lo;0;L;;;;;N;;;;;
+13224;EGYPTIAN HIEROGLYPH NL005;Lo;0;L;;;;;N;;;;;
+13225;EGYPTIAN HIEROGLYPH NL005A;Lo;0;L;;;;;N;;;;;
+13226;EGYPTIAN HIEROGLYPH NL006;Lo;0;L;;;;;N;;;;;
+13227;EGYPTIAN HIEROGLYPH NL007;Lo;0;L;;;;;N;;;;;
+13228;EGYPTIAN HIEROGLYPH NL008;Lo;0;L;;;;;N;;;;;
+13229;EGYPTIAN HIEROGLYPH NL009;Lo;0;L;;;;;N;;;;;
+1322A;EGYPTIAN HIEROGLYPH NL010;Lo;0;L;;;;;N;;;;;
+1322B;EGYPTIAN HIEROGLYPH NL011;Lo;0;L;;;;;N;;;;;
+1322C;EGYPTIAN HIEROGLYPH NL012;Lo;0;L;;;;;N;;;;;
+1322D;EGYPTIAN HIEROGLYPH NL013;Lo;0;L;;;;;N;;;;;
+1322E;EGYPTIAN HIEROGLYPH NL014;Lo;0;L;;;;;N;;;;;
+1322F;EGYPTIAN HIEROGLYPH NL015;Lo;0;L;;;;;N;;;;;
+13230;EGYPTIAN HIEROGLYPH NL016;Lo;0;L;;;;;N;;;;;
+13231;EGYPTIAN HIEROGLYPH NL017;Lo;0;L;;;;;N;;;;;
+13232;EGYPTIAN HIEROGLYPH NL017A;Lo;0;L;;;;;N;;;;;
+13233;EGYPTIAN HIEROGLYPH NL018;Lo;0;L;;;;;N;;;;;
+13234;EGYPTIAN HIEROGLYPH NL019;Lo;0;L;;;;;N;;;;;
+13235;EGYPTIAN HIEROGLYPH NL020;Lo;0;L;;;;;N;;;;;
+13236;EGYPTIAN HIEROGLYPH NU001;Lo;0;L;;;;;N;;;;;
+13237;EGYPTIAN HIEROGLYPH NU002;Lo;0;L;;;;;N;;;;;
+13238;EGYPTIAN HIEROGLYPH NU003;Lo;0;L;;;;;N;;;;;
+13239;EGYPTIAN HIEROGLYPH NU004;Lo;0;L;;;;;N;;;;;
+1323A;EGYPTIAN HIEROGLYPH NU005;Lo;0;L;;;;;N;;;;;
+1323B;EGYPTIAN HIEROGLYPH NU006;Lo;0;L;;;;;N;;;;;
+1323C;EGYPTIAN HIEROGLYPH NU007;Lo;0;L;;;;;N;;;;;
+1323D;EGYPTIAN HIEROGLYPH NU008;Lo;0;L;;;;;N;;;;;
+1323E;EGYPTIAN HIEROGLYPH NU009;Lo;0;L;;;;;N;;;;;
+1323F;EGYPTIAN HIEROGLYPH NU010;Lo;0;L;;;;;N;;;;;
+13240;EGYPTIAN HIEROGLYPH NU010A;Lo;0;L;;;;;N;;;;;
+13241;EGYPTIAN HIEROGLYPH NU011;Lo;0;L;;;;;N;;;;;
+13242;EGYPTIAN HIEROGLYPH NU011A;Lo;0;L;;;;;N;;;;;
+13243;EGYPTIAN HIEROGLYPH NU012;Lo;0;L;;;;;N;;;;;
+13244;EGYPTIAN HIEROGLYPH NU013;Lo;0;L;;;;;N;;;;;
+13245;EGYPTIAN HIEROGLYPH NU014;Lo;0;L;;;;;N;;;;;
+13246;EGYPTIAN HIEROGLYPH NU015;Lo;0;L;;;;;N;;;;;
+13247;EGYPTIAN HIEROGLYPH NU016;Lo;0;L;;;;;N;;;;;
+13248;EGYPTIAN HIEROGLYPH NU017;Lo;0;L;;;;;N;;;;;
+13249;EGYPTIAN HIEROGLYPH NU018;Lo;0;L;;;;;N;;;;;
+1324A;EGYPTIAN HIEROGLYPH NU018A;Lo;0;L;;;;;N;;;;;
+1324B;EGYPTIAN HIEROGLYPH NU019;Lo;0;L;;;;;N;;;;;
+1324C;EGYPTIAN HIEROGLYPH NU020;Lo;0;L;;;;;N;;;;;
+1324D;EGYPTIAN HIEROGLYPH NU021;Lo;0;L;;;;;N;;;;;
+1324E;EGYPTIAN HIEROGLYPH NU022;Lo;0;L;;;;;N;;;;;
+1324F;EGYPTIAN HIEROGLYPH NU022A;Lo;0;L;;;;;N;;;;;
+13250;EGYPTIAN HIEROGLYPH O001;Lo;0;L;;;;;N;;;;;
+13251;EGYPTIAN HIEROGLYPH O001A;Lo;0;L;;;;;N;;;;;
+13252;EGYPTIAN HIEROGLYPH O002;Lo;0;L;;;;;N;;;;;
+13253;EGYPTIAN HIEROGLYPH O003;Lo;0;L;;;;;N;;;;;
+13254;EGYPTIAN HIEROGLYPH O004;Lo;0;L;;;;;N;;;;;
+13255;EGYPTIAN HIEROGLYPH O005;Lo;0;L;;;;;N;;;;;
+13256;EGYPTIAN HIEROGLYPH O005A;Lo;0;L;;;;;N;;;;;
+13257;EGYPTIAN HIEROGLYPH O006;Lo;0;L;;;;;N;;;;;
+13258;EGYPTIAN HIEROGLYPH O006A;Lo;0;L;;;;;N;;;;;
+13259;EGYPTIAN HIEROGLYPH O006B;Lo;0;L;;;;;N;;;;;
+1325A;EGYPTIAN HIEROGLYPH O006C;Lo;0;L;;;;;N;;;;;
+1325B;EGYPTIAN HIEROGLYPH O006D;Lo;0;L;;;;;N;;;;;
+1325C;EGYPTIAN HIEROGLYPH O006E;Lo;0;L;;;;;N;;;;;
+1325D;EGYPTIAN HIEROGLYPH O006F;Lo;0;L;;;;;N;;;;;
+1325E;EGYPTIAN HIEROGLYPH O007;Lo;0;L;;;;;N;;;;;
+1325F;EGYPTIAN HIEROGLYPH O008;Lo;0;L;;;;;N;;;;;
+13260;EGYPTIAN HIEROGLYPH O009;Lo;0;L;;;;;N;;;;;
+13261;EGYPTIAN HIEROGLYPH O010;Lo;0;L;;;;;N;;;;;
+13262;EGYPTIAN HIEROGLYPH O010A;Lo;0;L;;;;;N;;;;;
+13263;EGYPTIAN HIEROGLYPH O010B;Lo;0;L;;;;;N;;;;;
+13264;EGYPTIAN HIEROGLYPH O010C;Lo;0;L;;;;;N;;;;;
+13265;EGYPTIAN HIEROGLYPH O011;Lo;0;L;;;;;N;;;;;
+13266;EGYPTIAN HIEROGLYPH O012;Lo;0;L;;;;;N;;;;;
+13267;EGYPTIAN HIEROGLYPH O013;Lo;0;L;;;;;N;;;;;
+13268;EGYPTIAN HIEROGLYPH O014;Lo;0;L;;;;;N;;;;;
+13269;EGYPTIAN HIEROGLYPH O015;Lo;0;L;;;;;N;;;;;
+1326A;EGYPTIAN HIEROGLYPH O016;Lo;0;L;;;;;N;;;;;
+1326B;EGYPTIAN HIEROGLYPH O017;Lo;0;L;;;;;N;;;;;
+1326C;EGYPTIAN HIEROGLYPH O018;Lo;0;L;;;;;N;;;;;
+1326D;EGYPTIAN HIEROGLYPH O019;Lo;0;L;;;;;N;;;;;
+1326E;EGYPTIAN HIEROGLYPH O019A;Lo;0;L;;;;;N;;;;;
+1326F;EGYPTIAN HIEROGLYPH O020;Lo;0;L;;;;;N;;;;;
+13270;EGYPTIAN HIEROGLYPH O020A;Lo;0;L;;;;;N;;;;;
+13271;EGYPTIAN HIEROGLYPH O021;Lo;0;L;;;;;N;;;;;
+13272;EGYPTIAN HIEROGLYPH O022;Lo;0;L;;;;;N;;;;;
+13273;EGYPTIAN HIEROGLYPH O023;Lo;0;L;;;;;N;;;;;
+13274;EGYPTIAN HIEROGLYPH O024;Lo;0;L;;;;;N;;;;;
+13275;EGYPTIAN HIEROGLYPH O024A;Lo;0;L;;;;;N;;;;;
+13276;EGYPTIAN HIEROGLYPH O025;Lo;0;L;;;;;N;;;;;
+13277;EGYPTIAN HIEROGLYPH O025A;Lo;0;L;;;;;N;;;;;
+13278;EGYPTIAN HIEROGLYPH O026;Lo;0;L;;;;;N;;;;;
+13279;EGYPTIAN HIEROGLYPH O027;Lo;0;L;;;;;N;;;;;
+1327A;EGYPTIAN HIEROGLYPH O028;Lo;0;L;;;;;N;;;;;
+1327B;EGYPTIAN HIEROGLYPH O029;Lo;0;L;;;;;N;;;;;
+1327C;EGYPTIAN HIEROGLYPH O029A;Lo;0;L;;;;;N;;;;;
+1327D;EGYPTIAN HIEROGLYPH O030;Lo;0;L;;;;;N;;;;;
+1327E;EGYPTIAN HIEROGLYPH O030A;Lo;0;L;;;;;N;;;;;
+1327F;EGYPTIAN HIEROGLYPH O031;Lo;0;L;;;;;N;;;;;
+13280;EGYPTIAN HIEROGLYPH O032;Lo;0;L;;;;;N;;;;;
+13281;EGYPTIAN HIEROGLYPH O033;Lo;0;L;;;;;N;;;;;
+13282;EGYPTIAN HIEROGLYPH O033A;Lo;0;L;;;;;N;;;;;
+13283;EGYPTIAN HIEROGLYPH O034;Lo;0;L;;;;;N;;;;;
+13284;EGYPTIAN HIEROGLYPH O035;Lo;0;L;;;;;N;;;;;
+13285;EGYPTIAN HIEROGLYPH O036;Lo;0;L;;;;;N;;;;;
+13286;EGYPTIAN HIEROGLYPH O036A;Lo;0;L;;;;;N;;;;;
+13287;EGYPTIAN HIEROGLYPH O036B;Lo;0;L;;;;;N;;;;;
+13288;EGYPTIAN HIEROGLYPH O036C;Lo;0;L;;;;;N;;;;;
+13289;EGYPTIAN HIEROGLYPH O036D;Lo;0;L;;;;;N;;;;;
+1328A;EGYPTIAN HIEROGLYPH O037;Lo;0;L;;;;;N;;;;;
+1328B;EGYPTIAN HIEROGLYPH O038;Lo;0;L;;;;;N;;;;;
+1328C;EGYPTIAN HIEROGLYPH O039;Lo;0;L;;;;;N;;;;;
+1328D;EGYPTIAN HIEROGLYPH O040;Lo;0;L;;;;;N;;;;;
+1328E;EGYPTIAN HIEROGLYPH O041;Lo;0;L;;;;;N;;;;;
+1328F;EGYPTIAN HIEROGLYPH O042;Lo;0;L;;;;;N;;;;;
+13290;EGYPTIAN HIEROGLYPH O043;Lo;0;L;;;;;N;;;;;
+13291;EGYPTIAN HIEROGLYPH O044;Lo;0;L;;;;;N;;;;;
+13292;EGYPTIAN HIEROGLYPH O045;Lo;0;L;;;;;N;;;;;
+13293;EGYPTIAN HIEROGLYPH O046;Lo;0;L;;;;;N;;;;;
+13294;EGYPTIAN HIEROGLYPH O047;Lo;0;L;;;;;N;;;;;
+13295;EGYPTIAN HIEROGLYPH O048;Lo;0;L;;;;;N;;;;;
+13296;EGYPTIAN HIEROGLYPH O049;Lo;0;L;;;;;N;;;;;
+13297;EGYPTIAN HIEROGLYPH O050;Lo;0;L;;;;;N;;;;;
+13298;EGYPTIAN HIEROGLYPH O050A;Lo;0;L;;;;;N;;;;;
+13299;EGYPTIAN HIEROGLYPH O050B;Lo;0;L;;;;;N;;;;;
+1329A;EGYPTIAN HIEROGLYPH O051;Lo;0;L;;;;;N;;;;;
+1329B;EGYPTIAN HIEROGLYPH P001;Lo;0;L;;;;;N;;;;;
+1329C;EGYPTIAN HIEROGLYPH P001A;Lo;0;L;;;;;N;;;;;
+1329D;EGYPTIAN HIEROGLYPH P002;Lo;0;L;;;;;N;;;;;
+1329E;EGYPTIAN HIEROGLYPH P003;Lo;0;L;;;;;N;;;;;
+1329F;EGYPTIAN HIEROGLYPH P003A;Lo;0;L;;;;;N;;;;;
+132A0;EGYPTIAN HIEROGLYPH P004;Lo;0;L;;;;;N;;;;;
+132A1;EGYPTIAN HIEROGLYPH P005;Lo;0;L;;;;;N;;;;;
+132A2;EGYPTIAN HIEROGLYPH P006;Lo;0;L;;;;;N;;;;;
+132A3;EGYPTIAN HIEROGLYPH P007;Lo;0;L;;;;;N;;;;;
+132A4;EGYPTIAN HIEROGLYPH P008;Lo;0;L;;;;;N;;;;;
+132A5;EGYPTIAN HIEROGLYPH P009;Lo;0;L;;;;;N;;;;;
+132A6;EGYPTIAN HIEROGLYPH P010;Lo;0;L;;;;;N;;;;;
+132A7;EGYPTIAN HIEROGLYPH P011;Lo;0;L;;;;;N;;;;;
+132A8;EGYPTIAN HIEROGLYPH Q001;Lo;0;L;;;;;N;;;;;
+132A9;EGYPTIAN HIEROGLYPH Q002;Lo;0;L;;;;;N;;;;;
+132AA;EGYPTIAN HIEROGLYPH Q003;Lo;0;L;;;;;N;;;;;
+132AB;EGYPTIAN HIEROGLYPH Q004;Lo;0;L;;;;;N;;;;;
+132AC;EGYPTIAN HIEROGLYPH Q005;Lo;0;L;;;;;N;;;;;
+132AD;EGYPTIAN HIEROGLYPH Q006;Lo;0;L;;;;;N;;;;;
+132AE;EGYPTIAN HIEROGLYPH Q007;Lo;0;L;;;;;N;;;;;
+132AF;EGYPTIAN HIEROGLYPH R001;Lo;0;L;;;;;N;;;;;
+132B0;EGYPTIAN HIEROGLYPH R002;Lo;0;L;;;;;N;;;;;
+132B1;EGYPTIAN HIEROGLYPH R002A;Lo;0;L;;;;;N;;;;;
+132B2;EGYPTIAN HIEROGLYPH R003;Lo;0;L;;;;;N;;;;;
+132B3;EGYPTIAN HIEROGLYPH R003A;Lo;0;L;;;;;N;;;;;
+132B4;EGYPTIAN HIEROGLYPH R003B;Lo;0;L;;;;;N;;;;;
+132B5;EGYPTIAN HIEROGLYPH R004;Lo;0;L;;;;;N;;;;;
+132B6;EGYPTIAN HIEROGLYPH R005;Lo;0;L;;;;;N;;;;;
+132B7;EGYPTIAN HIEROGLYPH R006;Lo;0;L;;;;;N;;;;;
+132B8;EGYPTIAN HIEROGLYPH R007;Lo;0;L;;;;;N;;;;;
+132B9;EGYPTIAN HIEROGLYPH R008;Lo;0;L;;;;;N;;;;;
+132BA;EGYPTIAN HIEROGLYPH R009;Lo;0;L;;;;;N;;;;;
+132BB;EGYPTIAN HIEROGLYPH R010;Lo;0;L;;;;;N;;;;;
+132BC;EGYPTIAN HIEROGLYPH R010A;Lo;0;L;;;;;N;;;;;
+132BD;EGYPTIAN HIEROGLYPH R011;Lo;0;L;;;;;N;;;;;
+132BE;EGYPTIAN HIEROGLYPH R012;Lo;0;L;;;;;N;;;;;
+132BF;EGYPTIAN HIEROGLYPH R013;Lo;0;L;;;;;N;;;;;
+132C0;EGYPTIAN HIEROGLYPH R014;Lo;0;L;;;;;N;;;;;
+132C1;EGYPTIAN HIEROGLYPH R015;Lo;0;L;;;;;N;;;;;
+132C2;EGYPTIAN HIEROGLYPH R016;Lo;0;L;;;;;N;;;;;
+132C3;EGYPTIAN HIEROGLYPH R016A;Lo;0;L;;;;;N;;;;;
+132C4;EGYPTIAN HIEROGLYPH R017;Lo;0;L;;;;;N;;;;;
+132C5;EGYPTIAN HIEROGLYPH R018;Lo;0;L;;;;;N;;;;;
+132C6;EGYPTIAN HIEROGLYPH R019;Lo;0;L;;;;;N;;;;;
+132C7;EGYPTIAN HIEROGLYPH R020;Lo;0;L;;;;;N;;;;;
+132C8;EGYPTIAN HIEROGLYPH R021;Lo;0;L;;;;;N;;;;;
+132C9;EGYPTIAN HIEROGLYPH R022;Lo;0;L;;;;;N;;;;;
+132CA;EGYPTIAN HIEROGLYPH R023;Lo;0;L;;;;;N;;;;;
+132CB;EGYPTIAN HIEROGLYPH R024;Lo;0;L;;;;;N;;;;;
+132CC;EGYPTIAN HIEROGLYPH R025;Lo;0;L;;;;;N;;;;;
+132CD;EGYPTIAN HIEROGLYPH R026;Lo;0;L;;;;;N;;;;;
+132CE;EGYPTIAN HIEROGLYPH R027;Lo;0;L;;;;;N;;;;;
+132CF;EGYPTIAN HIEROGLYPH R028;Lo;0;L;;;;;N;;;;;
+132D0;EGYPTIAN HIEROGLYPH R029;Lo;0;L;;;;;N;;;;;
+132D1;EGYPTIAN HIEROGLYPH S001;Lo;0;L;;;;;N;;;;;
+132D2;EGYPTIAN HIEROGLYPH S002;Lo;0;L;;;;;N;;;;;
+132D3;EGYPTIAN HIEROGLYPH S002A;Lo;0;L;;;;;N;;;;;
+132D4;EGYPTIAN HIEROGLYPH S003;Lo;0;L;;;;;N;;;;;
+132D5;EGYPTIAN HIEROGLYPH S004;Lo;0;L;;;;;N;;;;;
+132D6;EGYPTIAN HIEROGLYPH S005;Lo;0;L;;;;;N;;;;;
+132D7;EGYPTIAN HIEROGLYPH S006;Lo;0;L;;;;;N;;;;;
+132D8;EGYPTIAN HIEROGLYPH S006A;Lo;0;L;;;;;N;;;;;
+132D9;EGYPTIAN HIEROGLYPH S007;Lo;0;L;;;;;N;;;;;
+132DA;EGYPTIAN HIEROGLYPH S008;Lo;0;L;;;;;N;;;;;
+132DB;EGYPTIAN HIEROGLYPH S009;Lo;0;L;;;;;N;;;;;
+132DC;EGYPTIAN HIEROGLYPH S010;Lo;0;L;;;;;N;;;;;
+132DD;EGYPTIAN HIEROGLYPH S011;Lo;0;L;;;;;N;;;;;
+132DE;EGYPTIAN HIEROGLYPH S012;Lo;0;L;;;;;N;;;;;
+132DF;EGYPTIAN HIEROGLYPH S013;Lo;0;L;;;;;N;;;;;
+132E0;EGYPTIAN HIEROGLYPH S014;Lo;0;L;;;;;N;;;;;
+132E1;EGYPTIAN HIEROGLYPH S014A;Lo;0;L;;;;;N;;;;;
+132E2;EGYPTIAN HIEROGLYPH S014B;Lo;0;L;;;;;N;;;;;
+132E3;EGYPTIAN HIEROGLYPH S015;Lo;0;L;;;;;N;;;;;
+132E4;EGYPTIAN HIEROGLYPH S016;Lo;0;L;;;;;N;;;;;
+132E5;EGYPTIAN HIEROGLYPH S017;Lo;0;L;;;;;N;;;;;
+132E6;EGYPTIAN HIEROGLYPH S017A;Lo;0;L;;;;;N;;;;;
+132E7;EGYPTIAN HIEROGLYPH S018;Lo;0;L;;;;;N;;;;;
+132E8;EGYPTIAN HIEROGLYPH S019;Lo;0;L;;;;;N;;;;;
+132E9;EGYPTIAN HIEROGLYPH S020;Lo;0;L;;;;;N;;;;;
+132EA;EGYPTIAN HIEROGLYPH S021;Lo;0;L;;;;;N;;;;;
+132EB;EGYPTIAN HIEROGLYPH S022;Lo;0;L;;;;;N;;;;;
+132EC;EGYPTIAN HIEROGLYPH S023;Lo;0;L;;;;;N;;;;;
+132ED;EGYPTIAN HIEROGLYPH S024;Lo;0;L;;;;;N;;;;;
+132EE;EGYPTIAN HIEROGLYPH S025;Lo;0;L;;;;;N;;;;;
+132EF;EGYPTIAN HIEROGLYPH S026;Lo;0;L;;;;;N;;;;;
+132F0;EGYPTIAN HIEROGLYPH S026A;Lo;0;L;;;;;N;;;;;
+132F1;EGYPTIAN HIEROGLYPH S026B;Lo;0;L;;;;;N;;;;;
+132F2;EGYPTIAN HIEROGLYPH S027;Lo;0;L;;;;;N;;;;;
+132F3;EGYPTIAN HIEROGLYPH S028;Lo;0;L;;;;;N;;;;;
+132F4;EGYPTIAN HIEROGLYPH S029;Lo;0;L;;;;;N;;;;;
+132F5;EGYPTIAN HIEROGLYPH S030;Lo;0;L;;;;;N;;;;;
+132F6;EGYPTIAN HIEROGLYPH S031;Lo;0;L;;;;;N;;;;;
+132F7;EGYPTIAN HIEROGLYPH S032;Lo;0;L;;;;;N;;;;;
+132F8;EGYPTIAN HIEROGLYPH S033;Lo;0;L;;;;;N;;;;;
+132F9;EGYPTIAN HIEROGLYPH S034;Lo;0;L;;;;;N;;;;;
+132FA;EGYPTIAN HIEROGLYPH S035;Lo;0;L;;;;;N;;;;;
+132FB;EGYPTIAN HIEROGLYPH S035A;Lo;0;L;;;;;N;;;;;
+132FC;EGYPTIAN HIEROGLYPH S036;Lo;0;L;;;;;N;;;;;
+132FD;EGYPTIAN HIEROGLYPH S037;Lo;0;L;;;;;N;;;;;
+132FE;EGYPTIAN HIEROGLYPH S038;Lo;0;L;;;;;N;;;;;
+132FF;EGYPTIAN HIEROGLYPH S039;Lo;0;L;;;;;N;;;;;
+13300;EGYPTIAN HIEROGLYPH S040;Lo;0;L;;;;;N;;;;;
+13301;EGYPTIAN HIEROGLYPH S041;Lo;0;L;;;;;N;;;;;
+13302;EGYPTIAN HIEROGLYPH S042;Lo;0;L;;;;;N;;;;;
+13303;EGYPTIAN HIEROGLYPH S043;Lo;0;L;;;;;N;;;;;
+13304;EGYPTIAN HIEROGLYPH S044;Lo;0;L;;;;;N;;;;;
+13305;EGYPTIAN HIEROGLYPH S045;Lo;0;L;;;;;N;;;;;
+13306;EGYPTIAN HIEROGLYPH S046;Lo;0;L;;;;;N;;;;;
+13307;EGYPTIAN HIEROGLYPH T001;Lo;0;L;;;;;N;;;;;
+13308;EGYPTIAN HIEROGLYPH T002;Lo;0;L;;;;;N;;;;;
+13309;EGYPTIAN HIEROGLYPH T003;Lo;0;L;;;;;N;;;;;
+1330A;EGYPTIAN HIEROGLYPH T003A;Lo;0;L;;;;;N;;;;;
+1330B;EGYPTIAN HIEROGLYPH T004;Lo;0;L;;;;;N;;;;;
+1330C;EGYPTIAN HIEROGLYPH T005;Lo;0;L;;;;;N;;;;;
+1330D;EGYPTIAN HIEROGLYPH T006;Lo;0;L;;;;;N;;;;;
+1330E;EGYPTIAN HIEROGLYPH T007;Lo;0;L;;;;;N;;;;;
+1330F;EGYPTIAN HIEROGLYPH T007A;Lo;0;L;;;;;N;;;;;
+13310;EGYPTIAN HIEROGLYPH T008;Lo;0;L;;;;;N;;;;;
+13311;EGYPTIAN HIEROGLYPH T008A;Lo;0;L;;;;;N;;;;;
+13312;EGYPTIAN HIEROGLYPH T009;Lo;0;L;;;;;N;;;;;
+13313;EGYPTIAN HIEROGLYPH T009A;Lo;0;L;;;;;N;;;;;
+13314;EGYPTIAN HIEROGLYPH T010;Lo;0;L;;;;;N;;;;;
+13315;EGYPTIAN HIEROGLYPH T011;Lo;0;L;;;;;N;;;;;
+13316;EGYPTIAN HIEROGLYPH T011A;Lo;0;L;;;;;N;;;;;
+13317;EGYPTIAN HIEROGLYPH T012;Lo;0;L;;;;;N;;;;;
+13318;EGYPTIAN HIEROGLYPH T013;Lo;0;L;;;;;N;;;;;
+13319;EGYPTIAN HIEROGLYPH T014;Lo;0;L;;;;;N;;;;;
+1331A;EGYPTIAN HIEROGLYPH T015;Lo;0;L;;;;;N;;;;;
+1331B;EGYPTIAN HIEROGLYPH T016;Lo;0;L;;;;;N;;;;;
+1331C;EGYPTIAN HIEROGLYPH T016A;Lo;0;L;;;;;N;;;;;
+1331D;EGYPTIAN HIEROGLYPH T017;Lo;0;L;;;;;N;;;;;
+1331E;EGYPTIAN HIEROGLYPH T018;Lo;0;L;;;;;N;;;;;
+1331F;EGYPTIAN HIEROGLYPH T019;Lo;0;L;;;;;N;;;;;
+13320;EGYPTIAN HIEROGLYPH T020;Lo;0;L;;;;;N;;;;;
+13321;EGYPTIAN HIEROGLYPH T021;Lo;0;L;;;;;N;;;;;
+13322;EGYPTIAN HIEROGLYPH T022;Lo;0;L;;;;;N;;;;;
+13323;EGYPTIAN HIEROGLYPH T023;Lo;0;L;;;;;N;;;;;
+13324;EGYPTIAN HIEROGLYPH T024;Lo;0;L;;;;;N;;;;;
+13325;EGYPTIAN HIEROGLYPH T025;Lo;0;L;;;;;N;;;;;
+13326;EGYPTIAN HIEROGLYPH T026;Lo;0;L;;;;;N;;;;;
+13327;EGYPTIAN HIEROGLYPH T027;Lo;0;L;;;;;N;;;;;
+13328;EGYPTIAN HIEROGLYPH T028;Lo;0;L;;;;;N;;;;;
+13329;EGYPTIAN HIEROGLYPH T029;Lo;0;L;;;;;N;;;;;
+1332A;EGYPTIAN HIEROGLYPH T030;Lo;0;L;;;;;N;;;;;
+1332B;EGYPTIAN HIEROGLYPH T031;Lo;0;L;;;;;N;;;;;
+1332C;EGYPTIAN HIEROGLYPH T032;Lo;0;L;;;;;N;;;;;
+1332D;EGYPTIAN HIEROGLYPH T032A;Lo;0;L;;;;;N;;;;;
+1332E;EGYPTIAN HIEROGLYPH T033;Lo;0;L;;;;;N;;;;;
+1332F;EGYPTIAN HIEROGLYPH T033A;Lo;0;L;;;;;N;;;;;
+13330;EGYPTIAN HIEROGLYPH T034;Lo;0;L;;;;;N;;;;;
+13331;EGYPTIAN HIEROGLYPH T035;Lo;0;L;;;;;N;;;;;
+13332;EGYPTIAN HIEROGLYPH T036;Lo;0;L;;;;;N;;;;;
+13333;EGYPTIAN HIEROGLYPH U001;Lo;0;L;;;;;N;;;;;
+13334;EGYPTIAN HIEROGLYPH U002;Lo;0;L;;;;;N;;;;;
+13335;EGYPTIAN HIEROGLYPH U003;Lo;0;L;;;;;N;;;;;
+13336;EGYPTIAN HIEROGLYPH U004;Lo;0;L;;;;;N;;;;;
+13337;EGYPTIAN HIEROGLYPH U005;Lo;0;L;;;;;N;;;;;
+13338;EGYPTIAN HIEROGLYPH U006;Lo;0;L;;;;;N;;;;;
+13339;EGYPTIAN HIEROGLYPH U006A;Lo;0;L;;;;;N;;;;;
+1333A;EGYPTIAN HIEROGLYPH U006B;Lo;0;L;;;;;N;;;;;
+1333B;EGYPTIAN HIEROGLYPH U007;Lo;0;L;;;;;N;;;;;
+1333C;EGYPTIAN HIEROGLYPH U008;Lo;0;L;;;;;N;;;;;
+1333D;EGYPTIAN HIEROGLYPH U009;Lo;0;L;;;;;N;;;;;
+1333E;EGYPTIAN HIEROGLYPH U010;Lo;0;L;;;;;N;;;;;
+1333F;EGYPTIAN HIEROGLYPH U011;Lo;0;L;;;;;N;;;;;
+13340;EGYPTIAN HIEROGLYPH U012;Lo;0;L;;;;;N;;;;;
+13341;EGYPTIAN HIEROGLYPH U013;Lo;0;L;;;;;N;;;;;
+13342;EGYPTIAN HIEROGLYPH U014;Lo;0;L;;;;;N;;;;;
+13343;EGYPTIAN HIEROGLYPH U015;Lo;0;L;;;;;N;;;;;
+13344;EGYPTIAN HIEROGLYPH U016;Lo;0;L;;;;;N;;;;;
+13345;EGYPTIAN HIEROGLYPH U017;Lo;0;L;;;;;N;;;;;
+13346;EGYPTIAN HIEROGLYPH U018;Lo;0;L;;;;;N;;;;;
+13347;EGYPTIAN HIEROGLYPH U019;Lo;0;L;;;;;N;;;;;
+13348;EGYPTIAN HIEROGLYPH U020;Lo;0;L;;;;;N;;;;;
+13349;EGYPTIAN HIEROGLYPH U021;Lo;0;L;;;;;N;;;;;
+1334A;EGYPTIAN HIEROGLYPH U022;Lo;0;L;;;;;N;;;;;
+1334B;EGYPTIAN HIEROGLYPH U023;Lo;0;L;;;;;N;;;;;
+1334C;EGYPTIAN HIEROGLYPH U023A;Lo;0;L;;;;;N;;;;;
+1334D;EGYPTIAN HIEROGLYPH U024;Lo;0;L;;;;;N;;;;;
+1334E;EGYPTIAN HIEROGLYPH U025;Lo;0;L;;;;;N;;;;;
+1334F;EGYPTIAN HIEROGLYPH U026;Lo;0;L;;;;;N;;;;;
+13350;EGYPTIAN HIEROGLYPH U027;Lo;0;L;;;;;N;;;;;
+13351;EGYPTIAN HIEROGLYPH U028;Lo;0;L;;;;;N;;;;;
+13352;EGYPTIAN HIEROGLYPH U029;Lo;0;L;;;;;N;;;;;
+13353;EGYPTIAN HIEROGLYPH U029A;Lo;0;L;;;;;N;;;;;
+13354;EGYPTIAN HIEROGLYPH U030;Lo;0;L;;;;;N;;;;;
+13355;EGYPTIAN HIEROGLYPH U031;Lo;0;L;;;;;N;;;;;
+13356;EGYPTIAN HIEROGLYPH U032;Lo;0;L;;;;;N;;;;;
+13357;EGYPTIAN HIEROGLYPH U032A;Lo;0;L;;;;;N;;;;;
+13358;EGYPTIAN HIEROGLYPH U033;Lo;0;L;;;;;N;;;;;
+13359;EGYPTIAN HIEROGLYPH U034;Lo;0;L;;;;;N;;;;;
+1335A;EGYPTIAN HIEROGLYPH U035;Lo;0;L;;;;;N;;;;;
+1335B;EGYPTIAN HIEROGLYPH U036;Lo;0;L;;;;;N;;;;;
+1335C;EGYPTIAN HIEROGLYPH U037;Lo;0;L;;;;;N;;;;;
+1335D;EGYPTIAN HIEROGLYPH U038;Lo;0;L;;;;;N;;;;;
+1335E;EGYPTIAN HIEROGLYPH U039;Lo;0;L;;;;;N;;;;;
+1335F;EGYPTIAN HIEROGLYPH U040;Lo;0;L;;;;;N;;;;;
+13360;EGYPTIAN HIEROGLYPH U041;Lo;0;L;;;;;N;;;;;
+13361;EGYPTIAN HIEROGLYPH U042;Lo;0;L;;;;;N;;;;;
+13362;EGYPTIAN HIEROGLYPH V001;Lo;0;L;;;;;N;;;;;
+13363;EGYPTIAN HIEROGLYPH V001A;Lo;0;L;;;;;N;;;;;
+13364;EGYPTIAN HIEROGLYPH V001B;Lo;0;L;;;;;N;;;;;
+13365;EGYPTIAN HIEROGLYPH V001C;Lo;0;L;;;;;N;;;;;
+13366;EGYPTIAN HIEROGLYPH V001D;Lo;0;L;;;;;N;;;;;
+13367;EGYPTIAN HIEROGLYPH V001E;Lo;0;L;;;;;N;;;;;
+13368;EGYPTIAN HIEROGLYPH V001F;Lo;0;L;;;;;N;;;;;
+13369;EGYPTIAN HIEROGLYPH V001G;Lo;0;L;;;;;N;;;;;
+1336A;EGYPTIAN HIEROGLYPH V001H;Lo;0;L;;;;;N;;;;;
+1336B;EGYPTIAN HIEROGLYPH V001I;Lo;0;L;;;;;N;;;;;
+1336C;EGYPTIAN HIEROGLYPH V002;Lo;0;L;;;;;N;;;;;
+1336D;EGYPTIAN HIEROGLYPH V002A;Lo;0;L;;;;;N;;;;;
+1336E;EGYPTIAN HIEROGLYPH V003;Lo;0;L;;;;;N;;;;;
+1336F;EGYPTIAN HIEROGLYPH V004;Lo;0;L;;;;;N;;;;;
+13370;EGYPTIAN HIEROGLYPH V005;Lo;0;L;;;;;N;;;;;
+13371;EGYPTIAN HIEROGLYPH V006;Lo;0;L;;;;;N;;;;;
+13372;EGYPTIAN HIEROGLYPH V007;Lo;0;L;;;;;N;;;;;
+13373;EGYPTIAN HIEROGLYPH V007A;Lo;0;L;;;;;N;;;;;
+13374;EGYPTIAN HIEROGLYPH V007B;Lo;0;L;;;;;N;;;;;
+13375;EGYPTIAN HIEROGLYPH V008;Lo;0;L;;;;;N;;;;;
+13376;EGYPTIAN HIEROGLYPH V009;Lo;0;L;;;;;N;;;;;
+13377;EGYPTIAN HIEROGLYPH V010;Lo;0;L;;;;;N;;;;;
+13378;EGYPTIAN HIEROGLYPH V011;Lo;0;L;;;;;N;;;;;
+13379;EGYPTIAN HIEROGLYPH V011A;Lo;0;L;;;;;N;;;;;
+1337A;EGYPTIAN HIEROGLYPH V011B;Lo;0;L;;;;;N;;;;;
+1337B;EGYPTIAN HIEROGLYPH V011C;Lo;0;L;;;;;N;;;;;
+1337C;EGYPTIAN HIEROGLYPH V012;Lo;0;L;;;;;N;;;;;
+1337D;EGYPTIAN HIEROGLYPH V012A;Lo;0;L;;;;;N;;;;;
+1337E;EGYPTIAN HIEROGLYPH V012B;Lo;0;L;;;;;N;;;;;
+1337F;EGYPTIAN HIEROGLYPH V013;Lo;0;L;;;;;N;;;;;
+13380;EGYPTIAN HIEROGLYPH V014;Lo;0;L;;;;;N;;;;;
+13381;EGYPTIAN HIEROGLYPH V015;Lo;0;L;;;;;N;;;;;
+13382;EGYPTIAN HIEROGLYPH V016;Lo;0;L;;;;;N;;;;;
+13383;EGYPTIAN HIEROGLYPH V017;Lo;0;L;;;;;N;;;;;
+13384;EGYPTIAN HIEROGLYPH V018;Lo;0;L;;;;;N;;;;;
+13385;EGYPTIAN HIEROGLYPH V019;Lo;0;L;;;;;N;;;;;
+13386;EGYPTIAN HIEROGLYPH V020;Lo;0;L;;;;;N;;;;;
+13387;EGYPTIAN HIEROGLYPH V020A;Lo;0;L;;;;;N;;;;;
+13388;EGYPTIAN HIEROGLYPH V020B;Lo;0;L;;;;;N;;;;;
+13389;EGYPTIAN HIEROGLYPH V020C;Lo;0;L;;;;;N;;;;;
+1338A;EGYPTIAN HIEROGLYPH V020D;Lo;0;L;;;;;N;;;;;
+1338B;EGYPTIAN HIEROGLYPH V020E;Lo;0;L;;;;;N;;;;;
+1338C;EGYPTIAN HIEROGLYPH V020F;Lo;0;L;;;;;N;;;;;
+1338D;EGYPTIAN HIEROGLYPH V020G;Lo;0;L;;;;;N;;;;;
+1338E;EGYPTIAN HIEROGLYPH V020H;Lo;0;L;;;;;N;;;;;
+1338F;EGYPTIAN HIEROGLYPH V020I;Lo;0;L;;;;;N;;;;;
+13390;EGYPTIAN HIEROGLYPH V020J;Lo;0;L;;;;;N;;;;;
+13391;EGYPTIAN HIEROGLYPH V020K;Lo;0;L;;;;;N;;;;;
+13392;EGYPTIAN HIEROGLYPH V020L;Lo;0;L;;;;;N;;;;;
+13393;EGYPTIAN HIEROGLYPH V021;Lo;0;L;;;;;N;;;;;
+13394;EGYPTIAN HIEROGLYPH V022;Lo;0;L;;;;;N;;;;;
+13395;EGYPTIAN HIEROGLYPH V023;Lo;0;L;;;;;N;;;;;
+13396;EGYPTIAN HIEROGLYPH V023A;Lo;0;L;;;;;N;;;;;
+13397;EGYPTIAN HIEROGLYPH V024;Lo;0;L;;;;;N;;;;;
+13398;EGYPTIAN HIEROGLYPH V025;Lo;0;L;;;;;N;;;;;
+13399;EGYPTIAN HIEROGLYPH V026;Lo;0;L;;;;;N;;;;;
+1339A;EGYPTIAN HIEROGLYPH V027;Lo;0;L;;;;;N;;;;;
+1339B;EGYPTIAN HIEROGLYPH V028;Lo;0;L;;;;;N;;;;;
+1339C;EGYPTIAN HIEROGLYPH V028A;Lo;0;L;;;;;N;;;;;
+1339D;EGYPTIAN HIEROGLYPH V029;Lo;0;L;;;;;N;;;;;
+1339E;EGYPTIAN HIEROGLYPH V029A;Lo;0;L;;;;;N;;;;;
+1339F;EGYPTIAN HIEROGLYPH V030;Lo;0;L;;;;;N;;;;;
+133A0;EGYPTIAN HIEROGLYPH V030A;Lo;0;L;;;;;N;;;;;
+133A1;EGYPTIAN HIEROGLYPH V031;Lo;0;L;;;;;N;;;;;
+133A2;EGYPTIAN HIEROGLYPH V031A;Lo;0;L;;;;;N;;;;;
+133A3;EGYPTIAN HIEROGLYPH V032;Lo;0;L;;;;;N;;;;;
+133A4;EGYPTIAN HIEROGLYPH V033;Lo;0;L;;;;;N;;;;;
+133A5;EGYPTIAN HIEROGLYPH V033A;Lo;0;L;;;;;N;;;;;
+133A6;EGYPTIAN HIEROGLYPH V034;Lo;0;L;;;;;N;;;;;
+133A7;EGYPTIAN HIEROGLYPH V035;Lo;0;L;;;;;N;;;;;
+133A8;EGYPTIAN HIEROGLYPH V036;Lo;0;L;;;;;N;;;;;
+133A9;EGYPTIAN HIEROGLYPH V037;Lo;0;L;;;;;N;;;;;
+133AA;EGYPTIAN HIEROGLYPH V037A;Lo;0;L;;;;;N;;;;;
+133AB;EGYPTIAN HIEROGLYPH V038;Lo;0;L;;;;;N;;;;;
+133AC;EGYPTIAN HIEROGLYPH V039;Lo;0;L;;;;;N;;;;;
+133AD;EGYPTIAN HIEROGLYPH V040;Lo;0;L;;;;;N;;;;;
+133AE;EGYPTIAN HIEROGLYPH V040A;Lo;0;L;;;;;N;;;;;
+133AF;EGYPTIAN HIEROGLYPH W001;Lo;0;L;;;;;N;;;;;
+133B0;EGYPTIAN HIEROGLYPH W002;Lo;0;L;;;;;N;;;;;
+133B1;EGYPTIAN HIEROGLYPH W003;Lo;0;L;;;;;N;;;;;
+133B2;EGYPTIAN HIEROGLYPH W003A;Lo;0;L;;;;;N;;;;;
+133B3;EGYPTIAN HIEROGLYPH W004;Lo;0;L;;;;;N;;;;;
+133B4;EGYPTIAN HIEROGLYPH W005;Lo;0;L;;;;;N;;;;;
+133B5;EGYPTIAN HIEROGLYPH W006;Lo;0;L;;;;;N;;;;;
+133B6;EGYPTIAN HIEROGLYPH W007;Lo;0;L;;;;;N;;;;;
+133B7;EGYPTIAN HIEROGLYPH W008;Lo;0;L;;;;;N;;;;;
+133B8;EGYPTIAN HIEROGLYPH W009;Lo;0;L;;;;;N;;;;;
+133B9;EGYPTIAN HIEROGLYPH W009A;Lo;0;L;;;;;N;;;;;
+133BA;EGYPTIAN HIEROGLYPH W010;Lo;0;L;;;;;N;;;;;
+133BB;EGYPTIAN HIEROGLYPH W010A;Lo;0;L;;;;;N;;;;;
+133BC;EGYPTIAN HIEROGLYPH W011;Lo;0;L;;;;;N;;;;;
+133BD;EGYPTIAN HIEROGLYPH W012;Lo;0;L;;;;;N;;;;;
+133BE;EGYPTIAN HIEROGLYPH W013;Lo;0;L;;;;;N;;;;;
+133BF;EGYPTIAN HIEROGLYPH W014;Lo;0;L;;;;;N;;;;;
+133C0;EGYPTIAN HIEROGLYPH W014A;Lo;0;L;;;;;N;;;;;
+133C1;EGYPTIAN HIEROGLYPH W015;Lo;0;L;;;;;N;;;;;
+133C2;EGYPTIAN HIEROGLYPH W016;Lo;0;L;;;;;N;;;;;
+133C3;EGYPTIAN HIEROGLYPH W017;Lo;0;L;;;;;N;;;;;
+133C4;EGYPTIAN HIEROGLYPH W017A;Lo;0;L;;;;;N;;;;;
+133C5;EGYPTIAN HIEROGLYPH W018;Lo;0;L;;;;;N;;;;;
+133C6;EGYPTIAN HIEROGLYPH W018A;Lo;0;L;;;;;N;;;;;
+133C7;EGYPTIAN HIEROGLYPH W019;Lo;0;L;;;;;N;;;;;
+133C8;EGYPTIAN HIEROGLYPH W020;Lo;0;L;;;;;N;;;;;
+133C9;EGYPTIAN HIEROGLYPH W021;Lo;0;L;;;;;N;;;;;
+133CA;EGYPTIAN HIEROGLYPH W022;Lo;0;L;;;;;N;;;;;
+133CB;EGYPTIAN HIEROGLYPH W023;Lo;0;L;;;;;N;;;;;
+133CC;EGYPTIAN HIEROGLYPH W024;Lo;0;L;;;;;N;;;;;
+133CD;EGYPTIAN HIEROGLYPH W024A;Lo;0;L;;;;;N;;;;;
+133CE;EGYPTIAN HIEROGLYPH W025;Lo;0;L;;;;;N;;;;;
+133CF;EGYPTIAN HIEROGLYPH X001;Lo;0;L;;;;;N;;;;;
+133D0;EGYPTIAN HIEROGLYPH X002;Lo;0;L;;;;;N;;;;;
+133D1;EGYPTIAN HIEROGLYPH X003;Lo;0;L;;;;;N;;;;;
+133D2;EGYPTIAN HIEROGLYPH X004;Lo;0;L;;;;;N;;;;;
+133D3;EGYPTIAN HIEROGLYPH X004A;Lo;0;L;;;;;N;;;;;
+133D4;EGYPTIAN HIEROGLYPH X004B;Lo;0;L;;;;;N;;;;;
+133D5;EGYPTIAN HIEROGLYPH X005;Lo;0;L;;;;;N;;;;;
+133D6;EGYPTIAN HIEROGLYPH X006;Lo;0;L;;;;;N;;;;;
+133D7;EGYPTIAN HIEROGLYPH X006A;Lo;0;L;;;;;N;;;;;
+133D8;EGYPTIAN HIEROGLYPH X007;Lo;0;L;;;;;N;;;;;
+133D9;EGYPTIAN HIEROGLYPH X008;Lo;0;L;;;;;N;;;;;
+133DA;EGYPTIAN HIEROGLYPH X008A;Lo;0;L;;;;;N;;;;;
+133DB;EGYPTIAN HIEROGLYPH Y001;Lo;0;L;;;;;N;;;;;
+133DC;EGYPTIAN HIEROGLYPH Y001A;Lo;0;L;;;;;N;;;;;
+133DD;EGYPTIAN HIEROGLYPH Y002;Lo;0;L;;;;;N;;;;;
+133DE;EGYPTIAN HIEROGLYPH Y003;Lo;0;L;;;;;N;;;;;
+133DF;EGYPTIAN HIEROGLYPH Y004;Lo;0;L;;;;;N;;;;;
+133E0;EGYPTIAN HIEROGLYPH Y005;Lo;0;L;;;;;N;;;;;
+133E1;EGYPTIAN HIEROGLYPH Y006;Lo;0;L;;;;;N;;;;;
+133E2;EGYPTIAN HIEROGLYPH Y007;Lo;0;L;;;;;N;;;;;
+133E3;EGYPTIAN HIEROGLYPH Y008;Lo;0;L;;;;;N;;;;;
+133E4;EGYPTIAN HIEROGLYPH Z001;Lo;0;L;;;;;N;;;;;
+133E5;EGYPTIAN HIEROGLYPH Z002;Lo;0;L;;;;;N;;;;;
+133E6;EGYPTIAN HIEROGLYPH Z002A;Lo;0;L;;;;;N;;;;;
+133E7;EGYPTIAN HIEROGLYPH Z002B;Lo;0;L;;;;;N;;;;;
+133E8;EGYPTIAN HIEROGLYPH Z002C;Lo;0;L;;;;;N;;;;;
+133E9;EGYPTIAN HIEROGLYPH Z002D;Lo;0;L;;;;;N;;;;;
+133EA;EGYPTIAN HIEROGLYPH Z003;Lo;0;L;;;;;N;;;;;
+133EB;EGYPTIAN HIEROGLYPH Z003A;Lo;0;L;;;;;N;;;;;
+133EC;EGYPTIAN HIEROGLYPH Z003B;Lo;0;L;;;;;N;;;;;
+133ED;EGYPTIAN HIEROGLYPH Z004;Lo;0;L;;;;;N;;;;;
+133EE;EGYPTIAN HIEROGLYPH Z004A;Lo;0;L;;;;;N;;;;;
+133EF;EGYPTIAN HIEROGLYPH Z005;Lo;0;L;;;;;N;;;;;
+133F0;EGYPTIAN HIEROGLYPH Z005A;Lo;0;L;;;;;N;;;;;
+133F1;EGYPTIAN HIEROGLYPH Z006;Lo;0;L;;;;;N;;;;;
+133F2;EGYPTIAN HIEROGLYPH Z007;Lo;0;L;;;;;N;;;;;
+133F3;EGYPTIAN HIEROGLYPH Z008;Lo;0;L;;;;;N;;;;;
+133F4;EGYPTIAN HIEROGLYPH Z009;Lo;0;L;;;;;N;;;;;
+133F5;EGYPTIAN HIEROGLYPH Z010;Lo;0;L;;;;;N;;;;;
+133F6;EGYPTIAN HIEROGLYPH Z011;Lo;0;L;;;;;N;;;;;
+133F7;EGYPTIAN HIEROGLYPH Z012;Lo;0;L;;;;;N;;;;;
+133F8;EGYPTIAN HIEROGLYPH Z013;Lo;0;L;;;;;N;;;;;
+133F9;EGYPTIAN HIEROGLYPH Z014;Lo;0;L;;;;;N;;;;;
+133FA;EGYPTIAN HIEROGLYPH Z015;Lo;0;L;;;;;N;;;;;
+133FB;EGYPTIAN HIEROGLYPH Z015A;Lo;0;L;;;;;N;;;;;
+133FC;EGYPTIAN HIEROGLYPH Z015B;Lo;0;L;;;;;N;;;;;
+133FD;EGYPTIAN HIEROGLYPH Z015C;Lo;0;L;;;;;N;;;;;
+133FE;EGYPTIAN HIEROGLYPH Z015D;Lo;0;L;;;;;N;;;;;
+133FF;EGYPTIAN HIEROGLYPH Z015E;Lo;0;L;;;;;N;;;;;
+13400;EGYPTIAN HIEROGLYPH Z015F;Lo;0;L;;;;;N;;;;;
+13401;EGYPTIAN HIEROGLYPH Z015G;Lo;0;L;;;;;N;;;;;
+13402;EGYPTIAN HIEROGLYPH Z015H;Lo;0;L;;;;;N;;;;;
+13403;EGYPTIAN HIEROGLYPH Z015I;Lo;0;L;;;;;N;;;;;
+13404;EGYPTIAN HIEROGLYPH Z016;Lo;0;L;;;;;N;;;;;
+13405;EGYPTIAN HIEROGLYPH Z016A;Lo;0;L;;;;;N;;;;;
+13406;EGYPTIAN HIEROGLYPH Z016B;Lo;0;L;;;;;N;;;;;
+13407;EGYPTIAN HIEROGLYPH Z016C;Lo;0;L;;;;;N;;;;;
+13408;EGYPTIAN HIEROGLYPH Z016D;Lo;0;L;;;;;N;;;;;
+13409;EGYPTIAN HIEROGLYPH Z016E;Lo;0;L;;;;;N;;;;;
+1340A;EGYPTIAN HIEROGLYPH Z016F;Lo;0;L;;;;;N;;;;;
+1340B;EGYPTIAN HIEROGLYPH Z016G;Lo;0;L;;;;;N;;;;;
+1340C;EGYPTIAN HIEROGLYPH Z016H;Lo;0;L;;;;;N;;;;;
+1340D;EGYPTIAN HIEROGLYPH AA001;Lo;0;L;;;;;N;;;;;
+1340E;EGYPTIAN HIEROGLYPH AA002;Lo;0;L;;;;;N;;;;;
+1340F;EGYPTIAN HIEROGLYPH AA003;Lo;0;L;;;;;N;;;;;
+13410;EGYPTIAN HIEROGLYPH AA004;Lo;0;L;;;;;N;;;;;
+13411;EGYPTIAN HIEROGLYPH AA005;Lo;0;L;;;;;N;;;;;
+13412;EGYPTIAN HIEROGLYPH AA006;Lo;0;L;;;;;N;;;;;
+13413;EGYPTIAN HIEROGLYPH AA007;Lo;0;L;;;;;N;;;;;
+13414;EGYPTIAN HIEROGLYPH AA007A;Lo;0;L;;;;;N;;;;;
+13415;EGYPTIAN HIEROGLYPH AA007B;Lo;0;L;;;;;N;;;;;
+13416;EGYPTIAN HIEROGLYPH AA008;Lo;0;L;;;;;N;;;;;
+13417;EGYPTIAN HIEROGLYPH AA009;Lo;0;L;;;;;N;;;;;
+13418;EGYPTIAN HIEROGLYPH AA010;Lo;0;L;;;;;N;;;;;
+13419;EGYPTIAN HIEROGLYPH AA011;Lo;0;L;;;;;N;;;;;
+1341A;EGYPTIAN HIEROGLYPH AA012;Lo;0;L;;;;;N;;;;;
+1341B;EGYPTIAN HIEROGLYPH AA013;Lo;0;L;;;;;N;;;;;
+1341C;EGYPTIAN HIEROGLYPH AA014;Lo;0;L;;;;;N;;;;;
+1341D;EGYPTIAN HIEROGLYPH AA015;Lo;0;L;;;;;N;;;;;
+1341E;EGYPTIAN HIEROGLYPH AA016;Lo;0;L;;;;;N;;;;;
+1341F;EGYPTIAN HIEROGLYPH AA017;Lo;0;L;;;;;N;;;;;
+13420;EGYPTIAN HIEROGLYPH AA018;Lo;0;L;;;;;N;;;;;
+13421;EGYPTIAN HIEROGLYPH AA019;Lo;0;L;;;;;N;;;;;
+13422;EGYPTIAN HIEROGLYPH AA020;Lo;0;L;;;;;N;;;;;
+13423;EGYPTIAN HIEROGLYPH AA021;Lo;0;L;;;;;N;;;;;
+13424;EGYPTIAN HIEROGLYPH AA022;Lo;0;L;;;;;N;;;;;
+13425;EGYPTIAN HIEROGLYPH AA023;Lo;0;L;;;;;N;;;;;
+13426;EGYPTIAN HIEROGLYPH AA024;Lo;0;L;;;;;N;;;;;
+13427;EGYPTIAN HIEROGLYPH AA025;Lo;0;L;;;;;N;;;;;
+13428;EGYPTIAN HIEROGLYPH AA026;Lo;0;L;;;;;N;;;;;
+13429;EGYPTIAN HIEROGLYPH AA027;Lo;0;L;;;;;N;;;;;
+1342A;EGYPTIAN HIEROGLYPH AA028;Lo;0;L;;;;;N;;;;;
+1342B;EGYPTIAN HIEROGLYPH AA029;Lo;0;L;;;;;N;;;;;
+1342C;EGYPTIAN HIEROGLYPH AA030;Lo;0;L;;;;;N;;;;;
+1342D;EGYPTIAN HIEROGLYPH AA031;Lo;0;L;;;;;N;;;;;
+1342E;EGYPTIAN HIEROGLYPH AA032;Lo;0;L;;;;;N;;;;;
+14400;ANATOLIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;;
+14401;ANATOLIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;;
+14402;ANATOLIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;;
+14403;ANATOLIAN HIEROGLYPH A004;Lo;0;L;;;;;N;;;;;
+14404;ANATOLIAN HIEROGLYPH A005;Lo;0;L;;;;;N;;;;;
+14405;ANATOLIAN HIEROGLYPH A006;Lo;0;L;;;;;N;;;;;
+14406;ANATOLIAN HIEROGLYPH A007;Lo;0;L;;;;;N;;;;;
+14407;ANATOLIAN HIEROGLYPH A008;Lo;0;L;;;;;N;;;;;
+14408;ANATOLIAN HIEROGLYPH A009;Lo;0;L;;;;;N;;;;;
+14409;ANATOLIAN HIEROGLYPH A010;Lo;0;L;;;;;N;;;;;
+1440A;ANATOLIAN HIEROGLYPH A010A;Lo;0;L;;;;;N;;;;;
+1440B;ANATOLIAN HIEROGLYPH A011;Lo;0;L;;;;;N;;;;;
+1440C;ANATOLIAN HIEROGLYPH A012;Lo;0;L;;;;;N;;;;;
+1440D;ANATOLIAN HIEROGLYPH A013;Lo;0;L;;;;;N;;;;;
+1440E;ANATOLIAN HIEROGLYPH A014;Lo;0;L;;;;;N;;;;;
+1440F;ANATOLIAN HIEROGLYPH A015;Lo;0;L;;;;;N;;;;;
+14410;ANATOLIAN HIEROGLYPH A016;Lo;0;L;;;;;N;;;;;
+14411;ANATOLIAN HIEROGLYPH A017;Lo;0;L;;;;;N;;;;;
+14412;ANATOLIAN HIEROGLYPH A018;Lo;0;L;;;;;N;;;;;
+14413;ANATOLIAN HIEROGLYPH A019;Lo;0;L;;;;;N;;;;;
+14414;ANATOLIAN HIEROGLYPH A020;Lo;0;L;;;;;N;;;;;
+14415;ANATOLIAN HIEROGLYPH A021;Lo;0;L;;;;;N;;;;;
+14416;ANATOLIAN HIEROGLYPH A022;Lo;0;L;;;;;N;;;;;
+14417;ANATOLIAN HIEROGLYPH A023;Lo;0;L;;;;;N;;;;;
+14418;ANATOLIAN HIEROGLYPH A024;Lo;0;L;;;;;N;;;;;
+14419;ANATOLIAN HIEROGLYPH A025;Lo;0;L;;;;;N;;;;;
+1441A;ANATOLIAN HIEROGLYPH A026;Lo;0;L;;;;;N;;;;;
+1441B;ANATOLIAN HIEROGLYPH A026A;Lo;0;L;;;;;N;;;;;
+1441C;ANATOLIAN HIEROGLYPH A027;Lo;0;L;;;;;N;;;;;
+1441D;ANATOLIAN HIEROGLYPH A028;Lo;0;L;;;;;N;;;;;
+1441E;ANATOLIAN HIEROGLYPH A029;Lo;0;L;;;;;N;;;;;
+1441F;ANATOLIAN HIEROGLYPH A030;Lo;0;L;;;;;N;;;;;
+14420;ANATOLIAN HIEROGLYPH A031;Lo;0;L;;;;;N;;;;;
+14421;ANATOLIAN HIEROGLYPH A032;Lo;0;L;;;;;N;;;;;
+14422;ANATOLIAN HIEROGLYPH A033;Lo;0;L;;;;;N;;;;;
+14423;ANATOLIAN HIEROGLYPH A034;Lo;0;L;;;;;N;;;;;
+14424;ANATOLIAN HIEROGLYPH A035;Lo;0;L;;;;;N;;;;;
+14425;ANATOLIAN HIEROGLYPH A036;Lo;0;L;;;;;N;;;;;
+14426;ANATOLIAN HIEROGLYPH A037;Lo;0;L;;;;;N;;;;;
+14427;ANATOLIAN HIEROGLYPH A038;Lo;0;L;;;;;N;;;;;
+14428;ANATOLIAN HIEROGLYPH A039;Lo;0;L;;;;;N;;;;;
+14429;ANATOLIAN HIEROGLYPH A039A;Lo;0;L;;;;;N;;;;;
+1442A;ANATOLIAN HIEROGLYPH A040;Lo;0;L;;;;;N;;;;;
+1442B;ANATOLIAN HIEROGLYPH A041;Lo;0;L;;;;;N;;;;;
+1442C;ANATOLIAN HIEROGLYPH A041A;Lo;0;L;;;;;N;;;;;
+1442D;ANATOLIAN HIEROGLYPH A042;Lo;0;L;;;;;N;;;;;
+1442E;ANATOLIAN HIEROGLYPH A043;Lo;0;L;;;;;N;;;;;
+1442F;ANATOLIAN HIEROGLYPH A044;Lo;0;L;;;;;N;;;;;
+14430;ANATOLIAN HIEROGLYPH A045;Lo;0;L;;;;;N;;;;;
+14431;ANATOLIAN HIEROGLYPH A045A;Lo;0;L;;;;;N;;;;;
+14432;ANATOLIAN HIEROGLYPH A046;Lo;0;L;;;;;N;;;;;
+14433;ANATOLIAN HIEROGLYPH A046A;Lo;0;L;;;;;N;;;;;
+14434;ANATOLIAN HIEROGLYPH A046B;Lo;0;L;;;;;N;;;;;
+14435;ANATOLIAN HIEROGLYPH A047;Lo;0;L;;;;;N;;;;;
+14436;ANATOLIAN HIEROGLYPH A048;Lo;0;L;;;;;N;;;;;
+14437;ANATOLIAN HIEROGLYPH A049;Lo;0;L;;;;;N;;;;;
+14438;ANATOLIAN HIEROGLYPH A050;Lo;0;L;;;;;N;;;;;
+14439;ANATOLIAN HIEROGLYPH A051;Lo;0;L;;;;;N;;;;;
+1443A;ANATOLIAN HIEROGLYPH A052;Lo;0;L;;;;;N;;;;;
+1443B;ANATOLIAN HIEROGLYPH A053;Lo;0;L;;;;;N;;;;;
+1443C;ANATOLIAN HIEROGLYPH A054;Lo;0;L;;;;;N;;;;;
+1443D;ANATOLIAN HIEROGLYPH A055;Lo;0;L;;;;;N;;;;;
+1443E;ANATOLIAN HIEROGLYPH A056;Lo;0;L;;;;;N;;;;;
+1443F;ANATOLIAN HIEROGLYPH A057;Lo;0;L;;;;;N;;;;;
+14440;ANATOLIAN HIEROGLYPH A058;Lo;0;L;;;;;N;;;;;
+14441;ANATOLIAN HIEROGLYPH A059;Lo;0;L;;;;;N;;;;;
+14442;ANATOLIAN HIEROGLYPH A060;Lo;0;L;;;;;N;;;;;
+14443;ANATOLIAN HIEROGLYPH A061;Lo;0;L;;;;;N;;;;;
+14444;ANATOLIAN HIEROGLYPH A062;Lo;0;L;;;;;N;;;;;
+14445;ANATOLIAN HIEROGLYPH A063;Lo;0;L;;;;;N;;;;;
+14446;ANATOLIAN HIEROGLYPH A064;Lo;0;L;;;;;N;;;;;
+14447;ANATOLIAN HIEROGLYPH A065;Lo;0;L;;;;;N;;;;;
+14448;ANATOLIAN HIEROGLYPH A066;Lo;0;L;;;;;N;;;;;
+14449;ANATOLIAN HIEROGLYPH A066A;Lo;0;L;;;;;N;;;;;
+1444A;ANATOLIAN HIEROGLYPH A066B;Lo;0;L;;;;;N;;;;;
+1444B;ANATOLIAN HIEROGLYPH A066C;Lo;0;L;;;;;N;;;;;
+1444C;ANATOLIAN HIEROGLYPH A067;Lo;0;L;;;;;N;;;;;
+1444D;ANATOLIAN HIEROGLYPH A068;Lo;0;L;;;;;N;;;;;
+1444E;ANATOLIAN HIEROGLYPH A069;Lo;0;L;;;;;N;;;;;
+1444F;ANATOLIAN HIEROGLYPH A070;Lo;0;L;;;;;N;;;;;
+14450;ANATOLIAN HIEROGLYPH A071;Lo;0;L;;;;;N;;;;;
+14451;ANATOLIAN HIEROGLYPH A072;Lo;0;L;;;;;N;;;;;
+14452;ANATOLIAN HIEROGLYPH A073;Lo;0;L;;;;;N;;;;;
+14453;ANATOLIAN HIEROGLYPH A074;Lo;0;L;;;;;N;;;;;
+14454;ANATOLIAN HIEROGLYPH A075;Lo;0;L;;;;;N;;;;;
+14455;ANATOLIAN HIEROGLYPH A076;Lo;0;L;;;;;N;;;;;
+14456;ANATOLIAN HIEROGLYPH A077;Lo;0;L;;;;;N;;;;;
+14457;ANATOLIAN HIEROGLYPH A078;Lo;0;L;;;;;N;;;;;
+14458;ANATOLIAN HIEROGLYPH A079;Lo;0;L;;;;;N;;;;;
+14459;ANATOLIAN HIEROGLYPH A080;Lo;0;L;;;;;N;;;;;
+1445A;ANATOLIAN HIEROGLYPH A081;Lo;0;L;;;;;N;;;;;
+1445B;ANATOLIAN HIEROGLYPH A082;Lo;0;L;;;;;N;;;;;
+1445C;ANATOLIAN HIEROGLYPH A083;Lo;0;L;;;;;N;;;;;
+1445D;ANATOLIAN HIEROGLYPH A084;Lo;0;L;;;;;N;;;;;
+1445E;ANATOLIAN HIEROGLYPH A085;Lo;0;L;;;;;N;;;;;
+1445F;ANATOLIAN HIEROGLYPH A086;Lo;0;L;;;;;N;;;;;
+14460;ANATOLIAN HIEROGLYPH A087;Lo;0;L;;;;;N;;;;;
+14461;ANATOLIAN HIEROGLYPH A088;Lo;0;L;;;;;N;;;;;
+14462;ANATOLIAN HIEROGLYPH A089;Lo;0;L;;;;;N;;;;;
+14463;ANATOLIAN HIEROGLYPH A090;Lo;0;L;;;;;N;;;;;
+14464;ANATOLIAN HIEROGLYPH A091;Lo;0;L;;;;;N;;;;;
+14465;ANATOLIAN HIEROGLYPH A092;Lo;0;L;;;;;N;;;;;
+14466;ANATOLIAN HIEROGLYPH A093;Lo;0;L;;;;;N;;;;;
+14467;ANATOLIAN HIEROGLYPH A094;Lo;0;L;;;;;N;;;;;
+14468;ANATOLIAN HIEROGLYPH A095;Lo;0;L;;;;;N;;;;;
+14469;ANATOLIAN HIEROGLYPH A096;Lo;0;L;;;;;N;;;;;
+1446A;ANATOLIAN HIEROGLYPH A097;Lo;0;L;;;;;N;;;;;
+1446B;ANATOLIAN HIEROGLYPH A097A;Lo;0;L;;;;;N;;;;;
+1446C;ANATOLIAN HIEROGLYPH A098;Lo;0;L;;;;;N;;;;;
+1446D;ANATOLIAN HIEROGLYPH A098A;Lo;0;L;;;;;N;;;;;
+1446E;ANATOLIAN HIEROGLYPH A099;Lo;0;L;;;;;N;;;;;
+1446F;ANATOLIAN HIEROGLYPH A100;Lo;0;L;;;;;N;;;;;
+14470;ANATOLIAN HIEROGLYPH A100A;Lo;0;L;;;;;N;;;;;
+14471;ANATOLIAN HIEROGLYPH A101;Lo;0;L;;;;;N;;;;;
+14472;ANATOLIAN HIEROGLYPH A101A;Lo;0;L;;;;;N;;;;;
+14473;ANATOLIAN HIEROGLYPH A102;Lo;0;L;;;;;N;;;;;
+14474;ANATOLIAN HIEROGLYPH A102A;Lo;0;L;;;;;N;;;;;
+14475;ANATOLIAN HIEROGLYPH A103;Lo;0;L;;;;;N;;;;;
+14476;ANATOLIAN HIEROGLYPH A104;Lo;0;L;;;;;N;;;;;
+14477;ANATOLIAN HIEROGLYPH A104A;Lo;0;L;;;;;N;;;;;
+14478;ANATOLIAN HIEROGLYPH A104B;Lo;0;L;;;;;N;;;;;
+14479;ANATOLIAN HIEROGLYPH A104C;Lo;0;L;;;;;N;;;;;
+1447A;ANATOLIAN HIEROGLYPH A105;Lo;0;L;;;;;N;;;;;
+1447B;ANATOLIAN HIEROGLYPH A105A;Lo;0;L;;;;;N;;;;;
+1447C;ANATOLIAN HIEROGLYPH A105B;Lo;0;L;;;;;N;;;;;
+1447D;ANATOLIAN HIEROGLYPH A106;Lo;0;L;;;;;N;;;;;
+1447E;ANATOLIAN HIEROGLYPH A107;Lo;0;L;;;;;N;;;;;
+1447F;ANATOLIAN HIEROGLYPH A107A;Lo;0;L;;;;;N;;;;;
+14480;ANATOLIAN HIEROGLYPH A107B;Lo;0;L;;;;;N;;;;;
+14481;ANATOLIAN HIEROGLYPH A107C;Lo;0;L;;;;;N;;;;;
+14482;ANATOLIAN HIEROGLYPH A108;Lo;0;L;;;;;N;;;;;
+14483;ANATOLIAN HIEROGLYPH A109;Lo;0;L;;;;;N;;;;;
+14484;ANATOLIAN HIEROGLYPH A110;Lo;0;L;;;;;N;;;;;
+14485;ANATOLIAN HIEROGLYPH A110A;Lo;0;L;;;;;N;;;;;
+14486;ANATOLIAN HIEROGLYPH A110B;Lo;0;L;;;;;N;;;;;
+14487;ANATOLIAN HIEROGLYPH A111;Lo;0;L;;;;;N;;;;;
+14488;ANATOLIAN HIEROGLYPH A112;Lo;0;L;;;;;N;;;;;
+14489;ANATOLIAN HIEROGLYPH A113;Lo;0;L;;;;;N;;;;;
+1448A;ANATOLIAN HIEROGLYPH A114;Lo;0;L;;;;;N;;;;;
+1448B;ANATOLIAN HIEROGLYPH A115;Lo;0;L;;;;;N;;;;;
+1448C;ANATOLIAN HIEROGLYPH A115A;Lo;0;L;;;;;N;;;;;
+1448D;ANATOLIAN HIEROGLYPH A116;Lo;0;L;;;;;N;;;;;
+1448E;ANATOLIAN HIEROGLYPH A117;Lo;0;L;;;;;N;;;;;
+1448F;ANATOLIAN HIEROGLYPH A118;Lo;0;L;;;;;N;;;;;
+14490;ANATOLIAN HIEROGLYPH A119;Lo;0;L;;;;;N;;;;;
+14491;ANATOLIAN HIEROGLYPH A120;Lo;0;L;;;;;N;;;;;
+14492;ANATOLIAN HIEROGLYPH A121;Lo;0;L;;;;;N;;;;;
+14493;ANATOLIAN HIEROGLYPH A122;Lo;0;L;;;;;N;;;;;
+14494;ANATOLIAN HIEROGLYPH A123;Lo;0;L;;;;;N;;;;;
+14495;ANATOLIAN HIEROGLYPH A124;Lo;0;L;;;;;N;;;;;
+14496;ANATOLIAN HIEROGLYPH A125;Lo;0;L;;;;;N;;;;;
+14497;ANATOLIAN HIEROGLYPH A125A;Lo;0;L;;;;;N;;;;;
+14498;ANATOLIAN HIEROGLYPH A126;Lo;0;L;;;;;N;;;;;
+14499;ANATOLIAN HIEROGLYPH A127;Lo;0;L;;;;;N;;;;;
+1449A;ANATOLIAN HIEROGLYPH A128;Lo;0;L;;;;;N;;;;;
+1449B;ANATOLIAN HIEROGLYPH A129;Lo;0;L;;;;;N;;;;;
+1449C;ANATOLIAN HIEROGLYPH A130;Lo;0;L;;;;;N;;;;;
+1449D;ANATOLIAN HIEROGLYPH A131;Lo;0;L;;;;;N;;;;;
+1449E;ANATOLIAN HIEROGLYPH A132;Lo;0;L;;;;;N;;;;;
+1449F;ANATOLIAN HIEROGLYPH A133;Lo;0;L;;;;;N;;;;;
+144A0;ANATOLIAN HIEROGLYPH A134;Lo;0;L;;;;;N;;;;;
+144A1;ANATOLIAN HIEROGLYPH A135;Lo;0;L;;;;;N;;;;;
+144A2;ANATOLIAN HIEROGLYPH A135A;Lo;0;L;;;;;N;;;;;
+144A3;ANATOLIAN HIEROGLYPH A136;Lo;0;L;;;;;N;;;;;
+144A4;ANATOLIAN HIEROGLYPH A137;Lo;0;L;;;;;N;;;;;
+144A5;ANATOLIAN HIEROGLYPH A138;Lo;0;L;;;;;N;;;;;
+144A6;ANATOLIAN HIEROGLYPH A139;Lo;0;L;;;;;N;;;;;
+144A7;ANATOLIAN HIEROGLYPH A140;Lo;0;L;;;;;N;;;;;
+144A8;ANATOLIAN HIEROGLYPH A141;Lo;0;L;;;;;N;;;;;
+144A9;ANATOLIAN HIEROGLYPH A142;Lo;0;L;;;;;N;;;;;
+144AA;ANATOLIAN HIEROGLYPH A143;Lo;0;L;;;;;N;;;;;
+144AB;ANATOLIAN HIEROGLYPH A144;Lo;0;L;;;;;N;;;;;
+144AC;ANATOLIAN HIEROGLYPH A145;Lo;0;L;;;;;N;;;;;
+144AD;ANATOLIAN HIEROGLYPH A146;Lo;0;L;;;;;N;;;;;
+144AE;ANATOLIAN HIEROGLYPH A147;Lo;0;L;;;;;N;;;;;
+144AF;ANATOLIAN HIEROGLYPH A148;Lo;0;L;;;;;N;;;;;
+144B0;ANATOLIAN HIEROGLYPH A149;Lo;0;L;;;;;N;;;;;
+144B1;ANATOLIAN HIEROGLYPH A150;Lo;0;L;;;;;N;;;;;
+144B2;ANATOLIAN HIEROGLYPH A151;Lo;0;L;;;;;N;;;;;
+144B3;ANATOLIAN HIEROGLYPH A152;Lo;0;L;;;;;N;;;;;
+144B4;ANATOLIAN HIEROGLYPH A153;Lo;0;L;;;;;N;;;;;
+144B5;ANATOLIAN HIEROGLYPH A154;Lo;0;L;;;;;N;;;;;
+144B6;ANATOLIAN HIEROGLYPH A155;Lo;0;L;;;;;N;;;;;
+144B7;ANATOLIAN HIEROGLYPH A156;Lo;0;L;;;;;N;;;;;
+144B8;ANATOLIAN HIEROGLYPH A157;Lo;0;L;;;;;N;;;;;
+144B9;ANATOLIAN HIEROGLYPH A158;Lo;0;L;;;;;N;;;;;
+144BA;ANATOLIAN HIEROGLYPH A159;Lo;0;L;;;;;N;;;;;
+144BB;ANATOLIAN HIEROGLYPH A160;Lo;0;L;;;;;N;;;;;
+144BC;ANATOLIAN HIEROGLYPH A161;Lo;0;L;;;;;N;;;;;
+144BD;ANATOLIAN HIEROGLYPH A162;Lo;0;L;;;;;N;;;;;
+144BE;ANATOLIAN HIEROGLYPH A163;Lo;0;L;;;;;N;;;;;
+144BF;ANATOLIAN HIEROGLYPH A164;Lo;0;L;;;;;N;;;;;
+144C0;ANATOLIAN HIEROGLYPH A165;Lo;0;L;;;;;N;;;;;
+144C1;ANATOLIAN HIEROGLYPH A166;Lo;0;L;;;;;N;;;;;
+144C2;ANATOLIAN HIEROGLYPH A167;Lo;0;L;;;;;N;;;;;
+144C3;ANATOLIAN HIEROGLYPH A168;Lo;0;L;;;;;N;;;;;
+144C4;ANATOLIAN HIEROGLYPH A169;Lo;0;L;;;;;N;;;;;
+144C5;ANATOLIAN HIEROGLYPH A170;Lo;0;L;;;;;N;;;;;
+144C6;ANATOLIAN HIEROGLYPH A171;Lo;0;L;;;;;N;;;;;
+144C7;ANATOLIAN HIEROGLYPH A172;Lo;0;L;;;;;N;;;;;
+144C8;ANATOLIAN HIEROGLYPH A173;Lo;0;L;;;;;N;;;;;
+144C9;ANATOLIAN HIEROGLYPH A174;Lo;0;L;;;;;N;;;;;
+144CA;ANATOLIAN HIEROGLYPH A175;Lo;0;L;;;;;N;;;;;
+144CB;ANATOLIAN HIEROGLYPH A176;Lo;0;L;;;;;N;;;;;
+144CC;ANATOLIAN HIEROGLYPH A177;Lo;0;L;;;;;N;;;;;
+144CD;ANATOLIAN HIEROGLYPH A178;Lo;0;L;;;;;N;;;;;
+144CE;ANATOLIAN HIEROGLYPH A179;Lo;0;L;;;;;N;;;;;
+144CF;ANATOLIAN HIEROGLYPH A180;Lo;0;L;;;;;N;;;;;
+144D0;ANATOLIAN HIEROGLYPH A181;Lo;0;L;;;;;N;;;;;
+144D1;ANATOLIAN HIEROGLYPH A182;Lo;0;L;;;;;N;;;;;
+144D2;ANATOLIAN HIEROGLYPH A183;Lo;0;L;;;;;N;;;;;
+144D3;ANATOLIAN HIEROGLYPH A184;Lo;0;L;;;;;N;;;;;
+144D4;ANATOLIAN HIEROGLYPH A185;Lo;0;L;;;;;N;;;;;
+144D5;ANATOLIAN HIEROGLYPH A186;Lo;0;L;;;;;N;;;;;
+144D6;ANATOLIAN HIEROGLYPH A187;Lo;0;L;;;;;N;;;;;
+144D7;ANATOLIAN HIEROGLYPH A188;Lo;0;L;;;;;N;;;;;
+144D8;ANATOLIAN HIEROGLYPH A189;Lo;0;L;;;;;N;;;;;
+144D9;ANATOLIAN HIEROGLYPH A190;Lo;0;L;;;;;N;;;;;
+144DA;ANATOLIAN HIEROGLYPH A191;Lo;0;L;;;;;N;;;;;
+144DB;ANATOLIAN HIEROGLYPH A192;Lo;0;L;;;;;N;;;;;
+144DC;ANATOLIAN HIEROGLYPH A193;Lo;0;L;;;;;N;;;;;
+144DD;ANATOLIAN HIEROGLYPH A194;Lo;0;L;;;;;N;;;;;
+144DE;ANATOLIAN HIEROGLYPH A195;Lo;0;L;;;;;N;;;;;
+144DF;ANATOLIAN HIEROGLYPH A196;Lo;0;L;;;;;N;;;;;
+144E0;ANATOLIAN HIEROGLYPH A197;Lo;0;L;;;;;N;;;;;
+144E1;ANATOLIAN HIEROGLYPH A198;Lo;0;L;;;;;N;;;;;
+144E2;ANATOLIAN HIEROGLYPH A199;Lo;0;L;;;;;N;;;;;
+144E3;ANATOLIAN HIEROGLYPH A200;Lo;0;L;;;;;N;;;;;
+144E4;ANATOLIAN HIEROGLYPH A201;Lo;0;L;;;;;N;;;;;
+144E5;ANATOLIAN HIEROGLYPH A202;Lo;0;L;;;;;N;;;;;
+144E6;ANATOLIAN HIEROGLYPH A202A;Lo;0;L;;;;;N;;;;;
+144E7;ANATOLIAN HIEROGLYPH A202B;Lo;0;L;;;;;N;;;;;
+144E8;ANATOLIAN HIEROGLYPH A203;Lo;0;L;;;;;N;;;;;
+144E9;ANATOLIAN HIEROGLYPH A204;Lo;0;L;;;;;N;;;;;
+144EA;ANATOLIAN HIEROGLYPH A205;Lo;0;L;;;;;N;;;;;
+144EB;ANATOLIAN HIEROGLYPH A206;Lo;0;L;;;;;N;;;;;
+144EC;ANATOLIAN HIEROGLYPH A207;Lo;0;L;;;;;N;;;;;
+144ED;ANATOLIAN HIEROGLYPH A207A;Lo;0;L;;;;;N;;;;;
+144EE;ANATOLIAN HIEROGLYPH A208;Lo;0;L;;;;;N;;;;;
+144EF;ANATOLIAN HIEROGLYPH A209;Lo;0;L;;;;;N;;;;;
+144F0;ANATOLIAN HIEROGLYPH A209A;Lo;0;L;;;;;N;;;;;
+144F1;ANATOLIAN HIEROGLYPH A210;Lo;0;L;;;;;N;;;;;
+144F2;ANATOLIAN HIEROGLYPH A211;Lo;0;L;;;;;N;;;;;
+144F3;ANATOLIAN HIEROGLYPH A212;Lo;0;L;;;;;N;;;;;
+144F4;ANATOLIAN HIEROGLYPH A213;Lo;0;L;;;;;N;;;;;
+144F5;ANATOLIAN HIEROGLYPH A214;Lo;0;L;;;;;N;;;;;
+144F6;ANATOLIAN HIEROGLYPH A215;Lo;0;L;;;;;N;;;;;
+144F7;ANATOLIAN HIEROGLYPH A215A;Lo;0;L;;;;;N;;;;;
+144F8;ANATOLIAN HIEROGLYPH A216;Lo;0;L;;;;;N;;;;;
+144F9;ANATOLIAN HIEROGLYPH A216A;Lo;0;L;;;;;N;;;;;
+144FA;ANATOLIAN HIEROGLYPH A217;Lo;0;L;;;;;N;;;;;
+144FB;ANATOLIAN HIEROGLYPH A218;Lo;0;L;;;;;N;;;;;
+144FC;ANATOLIAN HIEROGLYPH A219;Lo;0;L;;;;;N;;;;;
+144FD;ANATOLIAN HIEROGLYPH A220;Lo;0;L;;;;;N;;;;;
+144FE;ANATOLIAN HIEROGLYPH A221;Lo;0;L;;;;;N;;;;;
+144FF;ANATOLIAN HIEROGLYPH A222;Lo;0;L;;;;;N;;;;;
+14500;ANATOLIAN HIEROGLYPH A223;Lo;0;L;;;;;N;;;;;
+14501;ANATOLIAN HIEROGLYPH A224;Lo;0;L;;;;;N;;;;;
+14502;ANATOLIAN HIEROGLYPH A225;Lo;0;L;;;;;N;;;;;
+14503;ANATOLIAN HIEROGLYPH A226;Lo;0;L;;;;;N;;;;;
+14504;ANATOLIAN HIEROGLYPH A227;Lo;0;L;;;;;N;;;;;
+14505;ANATOLIAN HIEROGLYPH A227A;Lo;0;L;;;;;N;;;;;
+14506;ANATOLIAN HIEROGLYPH A228;Lo;0;L;;;;;N;;;;;
+14507;ANATOLIAN HIEROGLYPH A229;Lo;0;L;;;;;N;;;;;
+14508;ANATOLIAN HIEROGLYPH A230;Lo;0;L;;;;;N;;;;;
+14509;ANATOLIAN HIEROGLYPH A231;Lo;0;L;;;;;N;;;;;
+1450A;ANATOLIAN HIEROGLYPH A232;Lo;0;L;;;;;N;;;;;
+1450B;ANATOLIAN HIEROGLYPH A233;Lo;0;L;;;;;N;;;;;
+1450C;ANATOLIAN HIEROGLYPH A234;Lo;0;L;;;;;N;;;;;
+1450D;ANATOLIAN HIEROGLYPH A235;Lo;0;L;;;;;N;;;;;
+1450E;ANATOLIAN HIEROGLYPH A236;Lo;0;L;;;;;N;;;;;
+1450F;ANATOLIAN HIEROGLYPH A237;Lo;0;L;;;;;N;;;;;
+14510;ANATOLIAN HIEROGLYPH A238;Lo;0;L;;;;;N;;;;;
+14511;ANATOLIAN HIEROGLYPH A239;Lo;0;L;;;;;N;;;;;
+14512;ANATOLIAN HIEROGLYPH A240;Lo;0;L;;;;;N;;;;;
+14513;ANATOLIAN HIEROGLYPH A241;Lo;0;L;;;;;N;;;;;
+14514;ANATOLIAN HIEROGLYPH A242;Lo;0;L;;;;;N;;;;;
+14515;ANATOLIAN HIEROGLYPH A243;Lo;0;L;;;;;N;;;;;
+14516;ANATOLIAN HIEROGLYPH A244;Lo;0;L;;;;;N;;;;;
+14517;ANATOLIAN HIEROGLYPH A245;Lo;0;L;;;;;N;;;;;
+14518;ANATOLIAN HIEROGLYPH A246;Lo;0;L;;;;;N;;;;;
+14519;ANATOLIAN HIEROGLYPH A247;Lo;0;L;;;;;N;;;;;
+1451A;ANATOLIAN HIEROGLYPH A248;Lo;0;L;;;;;N;;;;;
+1451B;ANATOLIAN HIEROGLYPH A249;Lo;0;L;;;;;N;;;;;
+1451C;ANATOLIAN HIEROGLYPH A250;Lo;0;L;;;;;N;;;;;
+1451D;ANATOLIAN HIEROGLYPH A251;Lo;0;L;;;;;N;;;;;
+1451E;ANATOLIAN HIEROGLYPH A252;Lo;0;L;;;;;N;;;;;
+1451F;ANATOLIAN HIEROGLYPH A253;Lo;0;L;;;;;N;;;;;
+14520;ANATOLIAN HIEROGLYPH A254;Lo;0;L;;;;;N;;;;;
+14521;ANATOLIAN HIEROGLYPH A255;Lo;0;L;;;;;N;;;;;
+14522;ANATOLIAN HIEROGLYPH A256;Lo;0;L;;;;;N;;;;;
+14523;ANATOLIAN HIEROGLYPH A257;Lo;0;L;;;;;N;;;;;
+14524;ANATOLIAN HIEROGLYPH A258;Lo;0;L;;;;;N;;;;;
+14525;ANATOLIAN HIEROGLYPH A259;Lo;0;L;;;;;N;;;;;
+14526;ANATOLIAN HIEROGLYPH A260;Lo;0;L;;;;;N;;;;;
+14527;ANATOLIAN HIEROGLYPH A261;Lo;0;L;;;;;N;;;;;
+14528;ANATOLIAN HIEROGLYPH A262;Lo;0;L;;;;;N;;;;;
+14529;ANATOLIAN HIEROGLYPH A263;Lo;0;L;;;;;N;;;;;
+1452A;ANATOLIAN HIEROGLYPH A264;Lo;0;L;;;;;N;;;;;
+1452B;ANATOLIAN HIEROGLYPH A265;Lo;0;L;;;;;N;;;;;
+1452C;ANATOLIAN HIEROGLYPH A266;Lo;0;L;;;;;N;;;;;
+1452D;ANATOLIAN HIEROGLYPH A267;Lo;0;L;;;;;N;;;;;
+1452E;ANATOLIAN HIEROGLYPH A267A;Lo;0;L;;;;;N;;;;;
+1452F;ANATOLIAN HIEROGLYPH A268;Lo;0;L;;;;;N;;;;;
+14530;ANATOLIAN HIEROGLYPH A269;Lo;0;L;;;;;N;;;;;
+14531;ANATOLIAN HIEROGLYPH A270;Lo;0;L;;;;;N;;;;;
+14532;ANATOLIAN HIEROGLYPH A271;Lo;0;L;;;;;N;;;;;
+14533;ANATOLIAN HIEROGLYPH A272;Lo;0;L;;;;;N;;;;;
+14534;ANATOLIAN HIEROGLYPH A273;Lo;0;L;;;;;N;;;;;
+14535;ANATOLIAN HIEROGLYPH A274;Lo;0;L;;;;;N;;;;;
+14536;ANATOLIAN HIEROGLYPH A275;Lo;0;L;;;;;N;;;;;
+14537;ANATOLIAN HIEROGLYPH A276;Lo;0;L;;;;;N;;;;;
+14538;ANATOLIAN HIEROGLYPH A277;Lo;0;L;;;;;N;;;;;
+14539;ANATOLIAN HIEROGLYPH A278;Lo;0;L;;;;;N;;;;;
+1453A;ANATOLIAN HIEROGLYPH A279;Lo;0;L;;;;;N;;;;;
+1453B;ANATOLIAN HIEROGLYPH A280;Lo;0;L;;;;;N;;;;;
+1453C;ANATOLIAN HIEROGLYPH A281;Lo;0;L;;;;;N;;;;;
+1453D;ANATOLIAN HIEROGLYPH A282;Lo;0;L;;;;;N;;;;;
+1453E;ANATOLIAN HIEROGLYPH A283;Lo;0;L;;;;;N;;;;;
+1453F;ANATOLIAN HIEROGLYPH A284;Lo;0;L;;;;;N;;;;;
+14540;ANATOLIAN HIEROGLYPH A285;Lo;0;L;;;;;N;;;;;
+14541;ANATOLIAN HIEROGLYPH A286;Lo;0;L;;;;;N;;;;;
+14542;ANATOLIAN HIEROGLYPH A287;Lo;0;L;;;;;N;;;;;
+14543;ANATOLIAN HIEROGLYPH A288;Lo;0;L;;;;;N;;;;;
+14544;ANATOLIAN HIEROGLYPH A289;Lo;0;L;;;;;N;;;;;
+14545;ANATOLIAN HIEROGLYPH A289A;Lo;0;L;;;;;N;;;;;
+14546;ANATOLIAN HIEROGLYPH A290;Lo;0;L;;;;;N;;;;;
+14547;ANATOLIAN HIEROGLYPH A291;Lo;0;L;;;;;N;;;;;
+14548;ANATOLIAN HIEROGLYPH A292;Lo;0;L;;;;;N;;;;;
+14549;ANATOLIAN HIEROGLYPH A293;Lo;0;L;;;;;N;;;;;
+1454A;ANATOLIAN HIEROGLYPH A294;Lo;0;L;;;;;N;;;;;
+1454B;ANATOLIAN HIEROGLYPH A294A;Lo;0;L;;;;;N;;;;;
+1454C;ANATOLIAN HIEROGLYPH A295;Lo;0;L;;;;;N;;;;;
+1454D;ANATOLIAN HIEROGLYPH A296;Lo;0;L;;;;;N;;;;;
+1454E;ANATOLIAN HIEROGLYPH A297;Lo;0;L;;;;;N;;;;;
+1454F;ANATOLIAN HIEROGLYPH A298;Lo;0;L;;;;;N;;;;;
+14550;ANATOLIAN HIEROGLYPH A299;Lo;0;L;;;;;N;;;;;
+14551;ANATOLIAN HIEROGLYPH A299A;Lo;0;L;;;;;N;;;;;
+14552;ANATOLIAN HIEROGLYPH A300;Lo;0;L;;;;;N;;;;;
+14553;ANATOLIAN HIEROGLYPH A301;Lo;0;L;;;;;N;;;;;
+14554;ANATOLIAN HIEROGLYPH A302;Lo;0;L;;;;;N;;;;;
+14555;ANATOLIAN HIEROGLYPH A303;Lo;0;L;;;;;N;;;;;
+14556;ANATOLIAN HIEROGLYPH A304;Lo;0;L;;;;;N;;;;;
+14557;ANATOLIAN HIEROGLYPH A305;Lo;0;L;;;;;N;;;;;
+14558;ANATOLIAN HIEROGLYPH A306;Lo;0;L;;;;;N;;;;;
+14559;ANATOLIAN HIEROGLYPH A307;Lo;0;L;;;;;N;;;;;
+1455A;ANATOLIAN HIEROGLYPH A308;Lo;0;L;;;;;N;;;;;
+1455B;ANATOLIAN HIEROGLYPH A309;Lo;0;L;;;;;N;;;;;
+1455C;ANATOLIAN HIEROGLYPH A309A;Lo;0;L;;;;;N;;;;;
+1455D;ANATOLIAN HIEROGLYPH A310;Lo;0;L;;;;;N;;;;;
+1455E;ANATOLIAN HIEROGLYPH A311;Lo;0;L;;;;;N;;;;;
+1455F;ANATOLIAN HIEROGLYPH A312;Lo;0;L;;;;;N;;;;;
+14560;ANATOLIAN HIEROGLYPH A313;Lo;0;L;;;;;N;;;;;
+14561;ANATOLIAN HIEROGLYPH A314;Lo;0;L;;;;;N;;;;;
+14562;ANATOLIAN HIEROGLYPH A315;Lo;0;L;;;;;N;;;;;
+14563;ANATOLIAN HIEROGLYPH A316;Lo;0;L;;;;;N;;;;;
+14564;ANATOLIAN HIEROGLYPH A317;Lo;0;L;;;;;N;;;;;
+14565;ANATOLIAN HIEROGLYPH A318;Lo;0;L;;;;;N;;;;;
+14566;ANATOLIAN HIEROGLYPH A319;Lo;0;L;;;;;N;;;;;
+14567;ANATOLIAN HIEROGLYPH A320;Lo;0;L;;;;;N;;;;;
+14568;ANATOLIAN HIEROGLYPH A321;Lo;0;L;;;;;N;;;;;
+14569;ANATOLIAN HIEROGLYPH A322;Lo;0;L;;;;;N;;;;;
+1456A;ANATOLIAN HIEROGLYPH A323;Lo;0;L;;;;;N;;;;;
+1456B;ANATOLIAN HIEROGLYPH A324;Lo;0;L;;;;;N;;;;;
+1456C;ANATOLIAN HIEROGLYPH A325;Lo;0;L;;;;;N;;;;;
+1456D;ANATOLIAN HIEROGLYPH A326;Lo;0;L;;;;;N;;;;;
+1456E;ANATOLIAN HIEROGLYPH A327;Lo;0;L;;;;;N;;;;;
+1456F;ANATOLIAN HIEROGLYPH A328;Lo;0;L;;;;;N;;;;;
+14570;ANATOLIAN HIEROGLYPH A329;Lo;0;L;;;;;N;;;;;
+14571;ANATOLIAN HIEROGLYPH A329A;Lo;0;L;;;;;N;;;;;
+14572;ANATOLIAN HIEROGLYPH A330;Lo;0;L;;;;;N;;;;;
+14573;ANATOLIAN HIEROGLYPH A331;Lo;0;L;;;;;N;;;;;
+14574;ANATOLIAN HIEROGLYPH A332A;Lo;0;L;;;;;N;;;;;
+14575;ANATOLIAN HIEROGLYPH A332B;Lo;0;L;;;;;N;;;;;
+14576;ANATOLIAN HIEROGLYPH A332C;Lo;0;L;;;;;N;;;;;
+14577;ANATOLIAN HIEROGLYPH A333;Lo;0;L;;;;;N;;;;;
+14578;ANATOLIAN HIEROGLYPH A334;Lo;0;L;;;;;N;;;;;
+14579;ANATOLIAN HIEROGLYPH A335;Lo;0;L;;;;;N;;;;;
+1457A;ANATOLIAN HIEROGLYPH A336;Lo;0;L;;;;;N;;;;;
+1457B;ANATOLIAN HIEROGLYPH A336A;Lo;0;L;;;;;N;;;;;
+1457C;ANATOLIAN HIEROGLYPH A336B;Lo;0;L;;;;;N;;;;;
+1457D;ANATOLIAN HIEROGLYPH A336C;Lo;0;L;;;;;N;;;;;
+1457E;ANATOLIAN HIEROGLYPH A337;Lo;0;L;;;;;N;;;;;
+1457F;ANATOLIAN HIEROGLYPH A338;Lo;0;L;;;;;N;;;;;
+14580;ANATOLIAN HIEROGLYPH A339;Lo;0;L;;;;;N;;;;;
+14581;ANATOLIAN HIEROGLYPH A340;Lo;0;L;;;;;N;;;;;
+14582;ANATOLIAN HIEROGLYPH A341;Lo;0;L;;;;;N;;;;;
+14583;ANATOLIAN HIEROGLYPH A342;Lo;0;L;;;;;N;;;;;
+14584;ANATOLIAN HIEROGLYPH A343;Lo;0;L;;;;;N;;;;;
+14585;ANATOLIAN HIEROGLYPH A344;Lo;0;L;;;;;N;;;;;
+14586;ANATOLIAN HIEROGLYPH A345;Lo;0;L;;;;;N;;;;;
+14587;ANATOLIAN HIEROGLYPH A346;Lo;0;L;;;;;N;;;;;
+14588;ANATOLIAN HIEROGLYPH A347;Lo;0;L;;;;;N;;;;;
+14589;ANATOLIAN HIEROGLYPH A348;Lo;0;L;;;;;N;;;;;
+1458A;ANATOLIAN HIEROGLYPH A349;Lo;0;L;;;;;N;;;;;
+1458B;ANATOLIAN HIEROGLYPH A350;Lo;0;L;;;;;N;;;;;
+1458C;ANATOLIAN HIEROGLYPH A351;Lo;0;L;;;;;N;;;;;
+1458D;ANATOLIAN HIEROGLYPH A352;Lo;0;L;;;;;N;;;;;
+1458E;ANATOLIAN HIEROGLYPH A353;Lo;0;L;;;;;N;;;;;
+1458F;ANATOLIAN HIEROGLYPH A354;Lo;0;L;;;;;N;;;;;
+14590;ANATOLIAN HIEROGLYPH A355;Lo;0;L;;;;;N;;;;;
+14591;ANATOLIAN HIEROGLYPH A356;Lo;0;L;;;;;N;;;;;
+14592;ANATOLIAN HIEROGLYPH A357;Lo;0;L;;;;;N;;;;;
+14593;ANATOLIAN HIEROGLYPH A358;Lo;0;L;;;;;N;;;;;
+14594;ANATOLIAN HIEROGLYPH A359;Lo;0;L;;;;;N;;;;;
+14595;ANATOLIAN HIEROGLYPH A359A;Lo;0;L;;;;;N;;;;;
+14596;ANATOLIAN HIEROGLYPH A360;Lo;0;L;;;;;N;;;;;
+14597;ANATOLIAN HIEROGLYPH A361;Lo;0;L;;;;;N;;;;;
+14598;ANATOLIAN HIEROGLYPH A362;Lo;0;L;;;;;N;;;;;
+14599;ANATOLIAN HIEROGLYPH A363;Lo;0;L;;;;;N;;;;;
+1459A;ANATOLIAN HIEROGLYPH A364;Lo;0;L;;;;;N;;;;;
+1459B;ANATOLIAN HIEROGLYPH A364A;Lo;0;L;;;;;N;;;;;
+1459C;ANATOLIAN HIEROGLYPH A365;Lo;0;L;;;;;N;;;;;
+1459D;ANATOLIAN HIEROGLYPH A366;Lo;0;L;;;;;N;;;;;
+1459E;ANATOLIAN HIEROGLYPH A367;Lo;0;L;;;;;N;;;;;
+1459F;ANATOLIAN HIEROGLYPH A368;Lo;0;L;;;;;N;;;;;
+145A0;ANATOLIAN HIEROGLYPH A368A;Lo;0;L;;;;;N;;;;;
+145A1;ANATOLIAN HIEROGLYPH A369;Lo;0;L;;;;;N;;;;;
+145A2;ANATOLIAN HIEROGLYPH A370;Lo;0;L;;;;;N;;;;;
+145A3;ANATOLIAN HIEROGLYPH A371;Lo;0;L;;;;;N;;;;;
+145A4;ANATOLIAN HIEROGLYPH A371A;Lo;0;L;;;;;N;;;;;
+145A5;ANATOLIAN HIEROGLYPH A372;Lo;0;L;;;;;N;;;;;
+145A6;ANATOLIAN HIEROGLYPH A373;Lo;0;L;;;;;N;;;;;
+145A7;ANATOLIAN HIEROGLYPH A374;Lo;0;L;;;;;N;;;;;
+145A8;ANATOLIAN HIEROGLYPH A375;Lo;0;L;;;;;N;;;;;
+145A9;ANATOLIAN HIEROGLYPH A376;Lo;0;L;;;;;N;;;;;
+145AA;ANATOLIAN HIEROGLYPH A377;Lo;0;L;;;;;N;;;;;
+145AB;ANATOLIAN HIEROGLYPH A378;Lo;0;L;;;;;N;;;;;
+145AC;ANATOLIAN HIEROGLYPH A379;Lo;0;L;;;;;N;;;;;
+145AD;ANATOLIAN HIEROGLYPH A380;Lo;0;L;;;;;N;;;;;
+145AE;ANATOLIAN HIEROGLYPH A381;Lo;0;L;;;;;N;;;;;
+145AF;ANATOLIAN HIEROGLYPH A381A;Lo;0;L;;;;;N;;;;;
+145B0;ANATOLIAN HIEROGLYPH A382;Lo;0;L;;;;;N;;;;;
+145B1;ANATOLIAN HIEROGLYPH A383 RA OR RI;Lo;0;L;;;;;N;;;;;
+145B2;ANATOLIAN HIEROGLYPH A383A;Lo;0;L;;;;;N;;;;;
+145B3;ANATOLIAN HIEROGLYPH A384;Lo;0;L;;;;;N;;;;;
+145B4;ANATOLIAN HIEROGLYPH A385;Lo;0;L;;;;;N;;;;;
+145B5;ANATOLIAN HIEROGLYPH A386;Lo;0;L;;;;;N;;;;;
+145B6;ANATOLIAN HIEROGLYPH A386A;Lo;0;L;;;;;N;;;;;
+145B7;ANATOLIAN HIEROGLYPH A387;Lo;0;L;;;;;N;;;;;
+145B8;ANATOLIAN HIEROGLYPH A388;Lo;0;L;;;;;N;;;;;
+145B9;ANATOLIAN HIEROGLYPH A389;Lo;0;L;;;;;N;;;;;
+145BA;ANATOLIAN HIEROGLYPH A390;Lo;0;L;;;;;N;;;;;
+145BB;ANATOLIAN HIEROGLYPH A391;Lo;0;L;;;;;N;;;;;
+145BC;ANATOLIAN HIEROGLYPH A392;Lo;0;L;;;;;N;;;;;
+145BD;ANATOLIAN HIEROGLYPH A393 EIGHT;Lo;0;L;;;;;N;;;;;
+145BE;ANATOLIAN HIEROGLYPH A394;Lo;0;L;;;;;N;;;;;
+145BF;ANATOLIAN HIEROGLYPH A395;Lo;0;L;;;;;N;;;;;
+145C0;ANATOLIAN HIEROGLYPH A396;Lo;0;L;;;;;N;;;;;
+145C1;ANATOLIAN HIEROGLYPH A397;Lo;0;L;;;;;N;;;;;
+145C2;ANATOLIAN HIEROGLYPH A398;Lo;0;L;;;;;N;;;;;
+145C3;ANATOLIAN HIEROGLYPH A399;Lo;0;L;;;;;N;;;;;
+145C4;ANATOLIAN HIEROGLYPH A400;Lo;0;L;;;;;N;;;;;
+145C5;ANATOLIAN HIEROGLYPH A401;Lo;0;L;;;;;N;;;;;
+145C6;ANATOLIAN HIEROGLYPH A402;Lo;0;L;;;;;N;;;;;
+145C7;ANATOLIAN HIEROGLYPH A403;Lo;0;L;;;;;N;;;;;
+145C8;ANATOLIAN HIEROGLYPH A404;Lo;0;L;;;;;N;;;;;
+145C9;ANATOLIAN HIEROGLYPH A405;Lo;0;L;;;;;N;;;;;
+145CA;ANATOLIAN HIEROGLYPH A406;Lo;0;L;;;;;N;;;;;
+145CB;ANATOLIAN HIEROGLYPH A407;Lo;0;L;;;;;N;;;;;
+145CC;ANATOLIAN HIEROGLYPH A408;Lo;0;L;;;;;N;;;;;
+145CD;ANATOLIAN HIEROGLYPH A409;Lo;0;L;;;;;N;;;;;
+145CE;ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK;Lo;0;L;;;;;N;;;;;
+145CF;ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK;Lo;0;L;;;;;N;;;;;
+145D0;ANATOLIAN HIEROGLYPH A411;Lo;0;L;;;;;N;;;;;
+145D1;ANATOLIAN HIEROGLYPH A412;Lo;0;L;;;;;N;;;;;
+145D2;ANATOLIAN HIEROGLYPH A413;Lo;0;L;;;;;N;;;;;
+145D3;ANATOLIAN HIEROGLYPH A414;Lo;0;L;;;;;N;;;;;
+145D4;ANATOLIAN HIEROGLYPH A415;Lo;0;L;;;;;N;;;;;
+145D5;ANATOLIAN HIEROGLYPH A416;Lo;0;L;;;;;N;;;;;
+145D6;ANATOLIAN HIEROGLYPH A417;Lo;0;L;;;;;N;;;;;
+145D7;ANATOLIAN HIEROGLYPH A418;Lo;0;L;;;;;N;;;;;
+145D8;ANATOLIAN HIEROGLYPH A419;Lo;0;L;;;;;N;;;;;
+145D9;ANATOLIAN HIEROGLYPH A420;Lo;0;L;;;;;N;;;;;
+145DA;ANATOLIAN HIEROGLYPH A421;Lo;0;L;;;;;N;;;;;
+145DB;ANATOLIAN HIEROGLYPH A422;Lo;0;L;;;;;N;;;;;
+145DC;ANATOLIAN HIEROGLYPH A423;Lo;0;L;;;;;N;;;;;
+145DD;ANATOLIAN HIEROGLYPH A424;Lo;0;L;;;;;N;;;;;
+145DE;ANATOLIAN HIEROGLYPH A425;Lo;0;L;;;;;N;;;;;
+145DF;ANATOLIAN HIEROGLYPH A426;Lo;0;L;;;;;N;;;;;
+145E0;ANATOLIAN HIEROGLYPH A427;Lo;0;L;;;;;N;;;;;
+145E1;ANATOLIAN HIEROGLYPH A428;Lo;0;L;;;;;N;;;;;
+145E2;ANATOLIAN HIEROGLYPH A429;Lo;0;L;;;;;N;;;;;
+145E3;ANATOLIAN HIEROGLYPH A430;Lo;0;L;;;;;N;;;;;
+145E4;ANATOLIAN HIEROGLYPH A431;Lo;0;L;;;;;N;;;;;
+145E5;ANATOLIAN HIEROGLYPH A432;Lo;0;L;;;;;N;;;;;
+145E6;ANATOLIAN HIEROGLYPH A433;Lo;0;L;;;;;N;;;;;
+145E7;ANATOLIAN HIEROGLYPH A434;Lo;0;L;;;;;N;;;;;
+145E8;ANATOLIAN HIEROGLYPH A435;Lo;0;L;;;;;N;;;;;
+145E9;ANATOLIAN HIEROGLYPH A436;Lo;0;L;;;;;N;;;;;
+145EA;ANATOLIAN HIEROGLYPH A437;Lo;0;L;;;;;N;;;;;
+145EB;ANATOLIAN HIEROGLYPH A438;Lo;0;L;;;;;N;;;;;
+145EC;ANATOLIAN HIEROGLYPH A439;Lo;0;L;;;;;N;;;;;
+145ED;ANATOLIAN HIEROGLYPH A440;Lo;0;L;;;;;N;;;;;
+145EE;ANATOLIAN HIEROGLYPH A441;Lo;0;L;;;;;N;;;;;
+145EF;ANATOLIAN HIEROGLYPH A442;Lo;0;L;;;;;N;;;;;
+145F0;ANATOLIAN HIEROGLYPH A443;Lo;0;L;;;;;N;;;;;
+145F1;ANATOLIAN HIEROGLYPH A444;Lo;0;L;;;;;N;;;;;
+145F2;ANATOLIAN HIEROGLYPH A445;Lo;0;L;;;;;N;;;;;
+145F3;ANATOLIAN HIEROGLYPH A446;Lo;0;L;;;;;N;;;;;
+145F4;ANATOLIAN HIEROGLYPH A447;Lo;0;L;;;;;N;;;;;
+145F5;ANATOLIAN HIEROGLYPH A448;Lo;0;L;;;;;N;;;;;
+145F6;ANATOLIAN HIEROGLYPH A449;Lo;0;L;;;;;N;;;;;
+145F7;ANATOLIAN HIEROGLYPH A450;Lo;0;L;;;;;N;;;;;
+145F8;ANATOLIAN HIEROGLYPH A450A;Lo;0;L;;;;;N;;;;;
+145F9;ANATOLIAN HIEROGLYPH A451;Lo;0;L;;;;;N;;;;;
+145FA;ANATOLIAN HIEROGLYPH A452;Lo;0;L;;;;;N;;;;;
+145FB;ANATOLIAN HIEROGLYPH A453;Lo;0;L;;;;;N;;;;;
+145FC;ANATOLIAN HIEROGLYPH A454;Lo;0;L;;;;;N;;;;;
+145FD;ANATOLIAN HIEROGLYPH A455;Lo;0;L;;;;;N;;;;;
+145FE;ANATOLIAN HIEROGLYPH A456;Lo;0;L;;;;;N;;;;;
+145FF;ANATOLIAN HIEROGLYPH A457;Lo;0;L;;;;;N;;;;;
+14600;ANATOLIAN HIEROGLYPH A457A;Lo;0;L;;;;;N;;;;;
+14601;ANATOLIAN HIEROGLYPH A458;Lo;0;L;;;;;N;;;;;
+14602;ANATOLIAN HIEROGLYPH A459;Lo;0;L;;;;;N;;;;;
+14603;ANATOLIAN HIEROGLYPH A460;Lo;0;L;;;;;N;;;;;
+14604;ANATOLIAN HIEROGLYPH A461;Lo;0;L;;;;;N;;;;;
+14605;ANATOLIAN HIEROGLYPH A462;Lo;0;L;;;;;N;;;;;
+14606;ANATOLIAN HIEROGLYPH A463;Lo;0;L;;;;;N;;;;;
+14607;ANATOLIAN HIEROGLYPH A464;Lo;0;L;;;;;N;;;;;
+14608;ANATOLIAN HIEROGLYPH A465;Lo;0;L;;;;;N;;;;;
+14609;ANATOLIAN HIEROGLYPH A466;Lo;0;L;;;;;N;;;;;
+1460A;ANATOLIAN HIEROGLYPH A467;Lo;0;L;;;;;N;;;;;
+1460B;ANATOLIAN HIEROGLYPH A468;Lo;0;L;;;;;N;;;;;
+1460C;ANATOLIAN HIEROGLYPH A469;Lo;0;L;;;;;N;;;;;
+1460D;ANATOLIAN HIEROGLYPH A470;Lo;0;L;;;;;N;;;;;
+1460E;ANATOLIAN HIEROGLYPH A471;Lo;0;L;;;;;N;;;;;
+1460F;ANATOLIAN HIEROGLYPH A472;Lo;0;L;;;;;N;;;;;
+14610;ANATOLIAN HIEROGLYPH A473;Lo;0;L;;;;;N;;;;;
+14611;ANATOLIAN HIEROGLYPH A474;Lo;0;L;;;;;N;;;;;
+14612;ANATOLIAN HIEROGLYPH A475;Lo;0;L;;;;;N;;;;;
+14613;ANATOLIAN HIEROGLYPH A476;Lo;0;L;;;;;N;;;;;
+14614;ANATOLIAN HIEROGLYPH A477;Lo;0;L;;;;;N;;;;;
+14615;ANATOLIAN HIEROGLYPH A478;Lo;0;L;;;;;N;;;;;
+14616;ANATOLIAN HIEROGLYPH A479;Lo;0;L;;;;;N;;;;;
+14617;ANATOLIAN HIEROGLYPH A480;Lo;0;L;;;;;N;;;;;
+14618;ANATOLIAN HIEROGLYPH A481;Lo;0;L;;;;;N;;;;;
+14619;ANATOLIAN HIEROGLYPH A482;Lo;0;L;;;;;N;;;;;
+1461A;ANATOLIAN HIEROGLYPH A483;Lo;0;L;;;;;N;;;;;
+1461B;ANATOLIAN HIEROGLYPH A484;Lo;0;L;;;;;N;;;;;
+1461C;ANATOLIAN HIEROGLYPH A485;Lo;0;L;;;;;N;;;;;
+1461D;ANATOLIAN HIEROGLYPH A486;Lo;0;L;;;;;N;;;;;
+1461E;ANATOLIAN HIEROGLYPH A487;Lo;0;L;;;;;N;;;;;
+1461F;ANATOLIAN HIEROGLYPH A488;Lo;0;L;;;;;N;;;;;
+14620;ANATOLIAN HIEROGLYPH A489;Lo;0;L;;;;;N;;;;;
+14621;ANATOLIAN HIEROGLYPH A490;Lo;0;L;;;;;N;;;;;
+14622;ANATOLIAN HIEROGLYPH A491;Lo;0;L;;;;;N;;;;;
+14623;ANATOLIAN HIEROGLYPH A492;Lo;0;L;;;;;N;;;;;
+14624;ANATOLIAN HIEROGLYPH A493;Lo;0;L;;;;;N;;;;;
+14625;ANATOLIAN HIEROGLYPH A494;Lo;0;L;;;;;N;;;;;
+14626;ANATOLIAN HIEROGLYPH A495;Lo;0;L;;;;;N;;;;;
+14627;ANATOLIAN HIEROGLYPH A496;Lo;0;L;;;;;N;;;;;
+14628;ANATOLIAN HIEROGLYPH A497;Lo;0;L;;;;;N;;;;;
+14629;ANATOLIAN HIEROGLYPH A501;Lo;0;L;;;;;N;;;;;
+1462A;ANATOLIAN HIEROGLYPH A502;Lo;0;L;;;;;N;;;;;
+1462B;ANATOLIAN HIEROGLYPH A503;Lo;0;L;;;;;N;;;;;
+1462C;ANATOLIAN HIEROGLYPH A504;Lo;0;L;;;;;N;;;;;
+1462D;ANATOLIAN HIEROGLYPH A505;Lo;0;L;;;;;N;;;;;
+1462E;ANATOLIAN HIEROGLYPH A506;Lo;0;L;;;;;N;;;;;
+1462F;ANATOLIAN HIEROGLYPH A507;Lo;0;L;;;;;N;;;;;
+14630;ANATOLIAN HIEROGLYPH A508;Lo;0;L;;;;;N;;;;;
+14631;ANATOLIAN HIEROGLYPH A509;Lo;0;L;;;;;N;;;;;
+14632;ANATOLIAN HIEROGLYPH A510;Lo;0;L;;;;;N;;;;;
+14633;ANATOLIAN HIEROGLYPH A511;Lo;0;L;;;;;N;;;;;
+14634;ANATOLIAN HIEROGLYPH A512;Lo;0;L;;;;;N;;;;;
+14635;ANATOLIAN HIEROGLYPH A513;Lo;0;L;;;;;N;;;;;
+14636;ANATOLIAN HIEROGLYPH A514;Lo;0;L;;;;;N;;;;;
+14637;ANATOLIAN HIEROGLYPH A515;Lo;0;L;;;;;N;;;;;
+14638;ANATOLIAN HIEROGLYPH A516;Lo;0;L;;;;;N;;;;;
+14639;ANATOLIAN HIEROGLYPH A517;Lo;0;L;;;;;N;;;;;
+1463A;ANATOLIAN HIEROGLYPH A518;Lo;0;L;;;;;N;;;;;
+1463B;ANATOLIAN HIEROGLYPH A519;Lo;0;L;;;;;N;;;;;
+1463C;ANATOLIAN HIEROGLYPH A520;Lo;0;L;;;;;N;;;;;
+1463D;ANATOLIAN HIEROGLYPH A521;Lo;0;L;;;;;N;;;;;
+1463E;ANATOLIAN HIEROGLYPH A522;Lo;0;L;;;;;N;;;;;
+1463F;ANATOLIAN HIEROGLYPH A523;Lo;0;L;;;;;N;;;;;
+14640;ANATOLIAN HIEROGLYPH A524;Lo;0;L;;;;;N;;;;;
+14641;ANATOLIAN HIEROGLYPH A525;Lo;0;L;;;;;N;;;;;
+14642;ANATOLIAN HIEROGLYPH A526;Lo;0;L;;;;;N;;;;;
+14643;ANATOLIAN HIEROGLYPH A527;Lo;0;L;;;;;N;;;;;
+14644;ANATOLIAN HIEROGLYPH A528;Lo;0;L;;;;;N;;;;;
+14645;ANATOLIAN HIEROGLYPH A529;Lo;0;L;;;;;N;;;;;
+14646;ANATOLIAN HIEROGLYPH A530;Lo;0;L;;;;;N;;;;;
+16800;BAMUM LETTER PHASE-A NGKUE MFON;Lo;0;L;;;;;N;;;;;
+16801;BAMUM LETTER PHASE-A GBIEE FON;Lo;0;L;;;;;N;;;;;
+16802;BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE;Lo;0;L;;;;;N;;;;;
+16803;BAMUM LETTER PHASE-A PON MFON PIPAEMBA;Lo;0;L;;;;;N;;;;;
+16804;BAMUM LETTER PHASE-A NAA MFON;Lo;0;L;;;;;N;;;;;
+16805;BAMUM LETTER PHASE-A SHUENSHUET;Lo;0;L;;;;;N;;;;;
+16806;BAMUM LETTER PHASE-A TITA MFON;Lo;0;L;;;;;N;;;;;
+16807;BAMUM LETTER PHASE-A NZA MFON;Lo;0;L;;;;;N;;;;;
+16808;BAMUM LETTER PHASE-A SHINDA PA NJI;Lo;0;L;;;;;N;;;;;
+16809;BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE;Lo;0;L;;;;;N;;;;;
+1680A;BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA;Lo;0;L;;;;;N;;;;;
+1680B;BAMUM LETTER PHASE-A MAEMBGBIEE;Lo;0;L;;;;;N;;;;;
+1680C;BAMUM LETTER PHASE-A TU MAEMBA;Lo;0;L;;;;;N;;;;;
+1680D;BAMUM LETTER PHASE-A NGANGU;Lo;0;L;;;;;N;;;;;
+1680E;BAMUM LETTER PHASE-A MAEMVEUX;Lo;0;L;;;;;N;;;;;
+1680F;BAMUM LETTER PHASE-A MANSUAE;Lo;0;L;;;;;N;;;;;
+16810;BAMUM LETTER PHASE-A MVEUAENGAM;Lo;0;L;;;;;N;;;;;
+16811;BAMUM LETTER PHASE-A SEUNYAM;Lo;0;L;;;;;N;;;;;
+16812;BAMUM LETTER PHASE-A NTOQPEN;Lo;0;L;;;;;N;;;;;
+16813;BAMUM LETTER PHASE-A KEUKEUTNDA;Lo;0;L;;;;;N;;;;;
+16814;BAMUM LETTER PHASE-A NKINDI;Lo;0;L;;;;;N;;;;;
+16815;BAMUM LETTER PHASE-A SUU;Lo;0;L;;;;;N;;;;;
+16816;BAMUM LETTER PHASE-A NGKUENZEUM;Lo;0;L;;;;;N;;;;;
+16817;BAMUM LETTER PHASE-A LAPAQ;Lo;0;L;;;;;N;;;;;
+16818;BAMUM LETTER PHASE-A LET KUT;Lo;0;L;;;;;N;;;;;
+16819;BAMUM LETTER PHASE-A NTAP MFAA;Lo;0;L;;;;;N;;;;;
+1681A;BAMUM LETTER PHASE-A MAEKEUP;Lo;0;L;;;;;N;;;;;
+1681B;BAMUM LETTER PHASE-A PASHAE;Lo;0;L;;;;;N;;;;;
+1681C;BAMUM LETTER PHASE-A GHEUAERAE;Lo;0;L;;;;;N;;;;;
+1681D;BAMUM LETTER PHASE-A PAMSHAE;Lo;0;L;;;;;N;;;;;
+1681E;BAMUM LETTER PHASE-A MON NGGEUAET;Lo;0;L;;;;;N;;;;;
+1681F;BAMUM LETTER PHASE-A NZUN MEUT;Lo;0;L;;;;;N;;;;;
+16820;BAMUM LETTER PHASE-A U YUQ NAE;Lo;0;L;;;;;N;;;;;
+16821;BAMUM LETTER PHASE-A GHEUAEGHEUAE;Lo;0;L;;;;;N;;;;;
+16822;BAMUM LETTER PHASE-A NTAP NTAA;Lo;0;L;;;;;N;;;;;
+16823;BAMUM LETTER PHASE-A SISA;Lo;0;L;;;;;N;;;;;
+16824;BAMUM LETTER PHASE-A MGBASA;Lo;0;L;;;;;N;;;;;
+16825;BAMUM LETTER PHASE-A MEUNJOMNDEUQ;Lo;0;L;;;;;N;;;;;
+16826;BAMUM LETTER PHASE-A MOOMPUQ;Lo;0;L;;;;;N;;;;;
+16827;BAMUM LETTER PHASE-A KAFA;Lo;0;L;;;;;N;;;;;
+16828;BAMUM LETTER PHASE-A PA LEERAEWA;Lo;0;L;;;;;N;;;;;
+16829;BAMUM LETTER PHASE-A NDA LEERAEWA;Lo;0;L;;;;;N;;;;;
+1682A;BAMUM LETTER PHASE-A PET;Lo;0;L;;;;;N;;;;;
+1682B;BAMUM LETTER PHASE-A MAEMKPEN;Lo;0;L;;;;;N;;;;;
+1682C;BAMUM LETTER PHASE-A NIKA;Lo;0;L;;;;;N;;;;;
+1682D;BAMUM LETTER PHASE-A PUP;Lo;0;L;;;;;N;;;;;
+1682E;BAMUM LETTER PHASE-A TUAEP;Lo;0;L;;;;;N;;;;;
+1682F;BAMUM LETTER PHASE-A LUAEP;Lo;0;L;;;;;N;;;;;
+16830;BAMUM LETTER PHASE-A SONJAM;Lo;0;L;;;;;N;;;;;
+16831;BAMUM LETTER PHASE-A TEUTEUWEN;Lo;0;L;;;;;N;;;;;
+16832;BAMUM LETTER PHASE-A MAENYI;Lo;0;L;;;;;N;;;;;
+16833;BAMUM LETTER PHASE-A KET;Lo;0;L;;;;;N;;;;;
+16834;BAMUM LETTER PHASE-A NDAANGGEUAET;Lo;0;L;;;;;N;;;;;
+16835;BAMUM LETTER PHASE-A KUOQ;Lo;0;L;;;;;N;;;;;
+16836;BAMUM LETTER PHASE-A MOOMEUT;Lo;0;L;;;;;N;;;;;
+16837;BAMUM LETTER PHASE-A SHUM;Lo;0;L;;;;;N;;;;;
+16838;BAMUM LETTER PHASE-A LOMMAE;Lo;0;L;;;;;N;;;;;
+16839;BAMUM LETTER PHASE-A FIRI;Lo;0;L;;;;;N;;;;;
+1683A;BAMUM LETTER PHASE-A ROM;Lo;0;L;;;;;N;;;;;
+1683B;BAMUM LETTER PHASE-A KPOQ;Lo;0;L;;;;;N;;;;;
+1683C;BAMUM LETTER PHASE-A SOQ;Lo;0;L;;;;;N;;;;;
+1683D;BAMUM LETTER PHASE-A MAP PIEET;Lo;0;L;;;;;N;;;;;
+1683E;BAMUM LETTER PHASE-A SHIRAE;Lo;0;L;;;;;N;;;;;
+1683F;BAMUM LETTER PHASE-A NTAP;Lo;0;L;;;;;N;;;;;
+16840;BAMUM LETTER PHASE-A SHOQ NSHUT YUM;Lo;0;L;;;;;N;;;;;
+16841;BAMUM LETTER PHASE-A NYIT MONGKEUAEQ;Lo;0;L;;;;;N;;;;;
+16842;BAMUM LETTER PHASE-A PAARAE;Lo;0;L;;;;;N;;;;;
+16843;BAMUM LETTER PHASE-A NKAARAE;Lo;0;L;;;;;N;;;;;
+16844;BAMUM LETTER PHASE-A UNKNOWN;Lo;0;L;;;;;N;;;;;
+16845;BAMUM LETTER PHASE-A NGGEN;Lo;0;L;;;;;N;;;;;
+16846;BAMUM LETTER PHASE-A MAESI;Lo;0;L;;;;;N;;;;;
+16847;BAMUM LETTER PHASE-A NJAM;Lo;0;L;;;;;N;;;;;
+16848;BAMUM LETTER PHASE-A MBANYI;Lo;0;L;;;;;N;;;;;
+16849;BAMUM LETTER PHASE-A NYET;Lo;0;L;;;;;N;;;;;
+1684A;BAMUM LETTER PHASE-A TEUAEN;Lo;0;L;;;;;N;;;;;
+1684B;BAMUM LETTER PHASE-A SOT;Lo;0;L;;;;;N;;;;;
+1684C;BAMUM LETTER PHASE-A PAAM;Lo;0;L;;;;;N;;;;;
+1684D;BAMUM LETTER PHASE-A NSHIEE;Lo;0;L;;;;;N;;;;;
+1684E;BAMUM LETTER PHASE-A MAEM;Lo;0;L;;;;;N;;;;;
+1684F;BAMUM LETTER PHASE-A NYI;Lo;0;L;;;;;N;;;;;
+16850;BAMUM LETTER PHASE-A KAQ;Lo;0;L;;;;;N;;;;;
+16851;BAMUM LETTER PHASE-A NSHA;Lo;0;L;;;;;N;;;;;
+16852;BAMUM LETTER PHASE-A VEE;Lo;0;L;;;;;N;;;;;
+16853;BAMUM LETTER PHASE-A LU;Lo;0;L;;;;;N;;;;;
+16854;BAMUM LETTER PHASE-A NEN;Lo;0;L;;;;;N;;;;;
+16855;BAMUM LETTER PHASE-A NAQ;Lo;0;L;;;;;N;;;;;
+16856;BAMUM LETTER PHASE-A MBAQ;Lo;0;L;;;;;N;;;;;
+16857;BAMUM LETTER PHASE-B NSHUET;Lo;0;L;;;;;N;;;;;
+16858;BAMUM LETTER PHASE-B TU MAEMGBIEE;Lo;0;L;;;;;N;;;;;
+16859;BAMUM LETTER PHASE-B SIEE;Lo;0;L;;;;;N;;;;;
+1685A;BAMUM LETTER PHASE-B SET TU;Lo;0;L;;;;;N;;;;;
+1685B;BAMUM LETTER PHASE-B LOM NTEUM;Lo;0;L;;;;;N;;;;;
+1685C;BAMUM LETTER PHASE-B MBA MAELEE;Lo;0;L;;;;;N;;;;;
+1685D;BAMUM LETTER PHASE-B KIEEM;Lo;0;L;;;;;N;;;;;
+1685E;BAMUM LETTER PHASE-B YEURAE;Lo;0;L;;;;;N;;;;;
+1685F;BAMUM LETTER PHASE-B MBAARAE;Lo;0;L;;;;;N;;;;;
+16860;BAMUM LETTER PHASE-B KAM;Lo;0;L;;;;;N;;;;;
+16861;BAMUM LETTER PHASE-B PEESHI;Lo;0;L;;;;;N;;;;;
+16862;BAMUM LETTER PHASE-B YAFU LEERAEWA;Lo;0;L;;;;;N;;;;;
+16863;BAMUM LETTER PHASE-B LAM NSHUT NYAM;Lo;0;L;;;;;N;;;;;
+16864;BAMUM LETTER PHASE-B NTIEE SHEUOQ;Lo;0;L;;;;;N;;;;;
+16865;BAMUM LETTER PHASE-B NDU NJAA;Lo;0;L;;;;;N;;;;;
+16866;BAMUM LETTER PHASE-B GHEUGHEUAEM;Lo;0;L;;;;;N;;;;;
+16867;BAMUM LETTER PHASE-B PIT;Lo;0;L;;;;;N;;;;;
+16868;BAMUM LETTER PHASE-B TU NSIEE;Lo;0;L;;;;;N;;;;;
+16869;BAMUM LETTER PHASE-B SHET NJAQ;Lo;0;L;;;;;N;;;;;
+1686A;BAMUM LETTER PHASE-B SHEUAEQTU;Lo;0;L;;;;;N;;;;;
+1686B;BAMUM LETTER PHASE-B MFON TEUAEQ;Lo;0;L;;;;;N;;;;;
+1686C;BAMUM LETTER PHASE-B MBIT MBAAKET;Lo;0;L;;;;;N;;;;;
+1686D;BAMUM LETTER PHASE-B NYI NTEUM;Lo;0;L;;;;;N;;;;;
+1686E;BAMUM LETTER PHASE-B KEUPUQ;Lo;0;L;;;;;N;;;;;
+1686F;BAMUM LETTER PHASE-B GHEUGHEN;Lo;0;L;;;;;N;;;;;
+16870;BAMUM LETTER PHASE-B KEUYEUX;Lo;0;L;;;;;N;;;;;
+16871;BAMUM LETTER PHASE-B LAANAE;Lo;0;L;;;;;N;;;;;
+16872;BAMUM LETTER PHASE-B PARUM;Lo;0;L;;;;;N;;;;;
+16873;BAMUM LETTER PHASE-B VEUM;Lo;0;L;;;;;N;;;;;
+16874;BAMUM LETTER PHASE-B NGKINDI MVOP;Lo;0;L;;;;;N;;;;;
+16875;BAMUM LETTER PHASE-B NGGEU MBU;Lo;0;L;;;;;N;;;;;
+16876;BAMUM LETTER PHASE-B WUAET;Lo;0;L;;;;;N;;;;;
+16877;BAMUM LETTER PHASE-B SAKEUAE;Lo;0;L;;;;;N;;;;;
+16878;BAMUM LETTER PHASE-B TAAM;Lo;0;L;;;;;N;;;;;
+16879;BAMUM LETTER PHASE-B MEUQ;Lo;0;L;;;;;N;;;;;
+1687A;BAMUM LETTER PHASE-B NGGUOQ;Lo;0;L;;;;;N;;;;;
+1687B;BAMUM LETTER PHASE-B NGGUOQ LARGE;Lo;0;L;;;;;N;;;;;
+1687C;BAMUM LETTER PHASE-B MFIYAQ;Lo;0;L;;;;;N;;;;;
+1687D;BAMUM LETTER PHASE-B SUE;Lo;0;L;;;;;N;;;;;
+1687E;BAMUM LETTER PHASE-B MBEURI;Lo;0;L;;;;;N;;;;;
+1687F;BAMUM LETTER PHASE-B MONTIEEN;Lo;0;L;;;;;N;;;;;
+16880;BAMUM LETTER PHASE-B NYAEMAE;Lo;0;L;;;;;N;;;;;
+16881;BAMUM LETTER PHASE-B PUNGAAM;Lo;0;L;;;;;N;;;;;
+16882;BAMUM LETTER PHASE-B MEUT NGGEET;Lo;0;L;;;;;N;;;;;
+16883;BAMUM LETTER PHASE-B FEUX;Lo;0;L;;;;;N;;;;;
+16884;BAMUM LETTER PHASE-B MBUOQ;Lo;0;L;;;;;N;;;;;
+16885;BAMUM LETTER PHASE-B FEE;Lo;0;L;;;;;N;;;;;
+16886;BAMUM LETTER PHASE-B KEUAEM;Lo;0;L;;;;;N;;;;;
+16887;BAMUM LETTER PHASE-B MA NJEUAENA;Lo;0;L;;;;;N;;;;;
+16888;BAMUM LETTER PHASE-B MA NJUQA;Lo;0;L;;;;;N;;;;;
+16889;BAMUM LETTER PHASE-B LET;Lo;0;L;;;;;N;;;;;
+1688A;BAMUM LETTER PHASE-B NGGAAM;Lo;0;L;;;;;N;;;;;
+1688B;BAMUM LETTER PHASE-B NSEN;Lo;0;L;;;;;N;;;;;
+1688C;BAMUM LETTER PHASE-B MA;Lo;0;L;;;;;N;;;;;
+1688D;BAMUM LETTER PHASE-B KIQ;Lo;0;L;;;;;N;;;;;
+1688E;BAMUM LETTER PHASE-B NGOM;Lo;0;L;;;;;N;;;;;
+1688F;BAMUM LETTER PHASE-C NGKUE MAEMBA;Lo;0;L;;;;;N;;;;;
+16890;BAMUM LETTER PHASE-C NZA;Lo;0;L;;;;;N;;;;;
+16891;BAMUM LETTER PHASE-C YUM;Lo;0;L;;;;;N;;;;;
+16892;BAMUM LETTER PHASE-C WANGKUOQ;Lo;0;L;;;;;N;;;;;
+16893;BAMUM LETTER PHASE-C NGGEN;Lo;0;L;;;;;N;;;;;
+16894;BAMUM LETTER PHASE-C NDEUAEREE;Lo;0;L;;;;;N;;;;;
+16895;BAMUM LETTER PHASE-C NGKAQ;Lo;0;L;;;;;N;;;;;
+16896;BAMUM LETTER PHASE-C GHARAE;Lo;0;L;;;;;N;;;;;
+16897;BAMUM LETTER PHASE-C MBEEKEET;Lo;0;L;;;;;N;;;;;
+16898;BAMUM LETTER PHASE-C GBAYI;Lo;0;L;;;;;N;;;;;
+16899;BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN;Lo;0;L;;;;;N;;;;;
+1689A;BAMUM LETTER PHASE-C NTU MBIT;Lo;0;L;;;;;N;;;;;
+1689B;BAMUM LETTER PHASE-C MBEUM;Lo;0;L;;;;;N;;;;;
+1689C;BAMUM LETTER PHASE-C PIRIEEN;Lo;0;L;;;;;N;;;;;
+1689D;BAMUM LETTER PHASE-C NDOMBU;Lo;0;L;;;;;N;;;;;
+1689E;BAMUM LETTER PHASE-C MBAA CABBAGE-TREE;Lo;0;L;;;;;N;;;;;
+1689F;BAMUM LETTER PHASE-C KEUSHEUAEP;Lo;0;L;;;;;N;;;;;
+168A0;BAMUM LETTER PHASE-C GHAP;Lo;0;L;;;;;N;;;;;
+168A1;BAMUM LETTER PHASE-C KEUKAQ;Lo;0;L;;;;;N;;;;;
+168A2;BAMUM LETTER PHASE-C YU MUOMAE;Lo;0;L;;;;;N;;;;;
+168A3;BAMUM LETTER PHASE-C NZEUM;Lo;0;L;;;;;N;;;;;
+168A4;BAMUM LETTER PHASE-C MBUE;Lo;0;L;;;;;N;;;;;
+168A5;BAMUM LETTER PHASE-C NSEUAEN;Lo;0;L;;;;;N;;;;;
+168A6;BAMUM LETTER PHASE-C MBIT;Lo;0;L;;;;;N;;;;;
+168A7;BAMUM LETTER PHASE-C YEUQ;Lo;0;L;;;;;N;;;;;
+168A8;BAMUM LETTER PHASE-C KPARAQ;Lo;0;L;;;;;N;;;;;
+168A9;BAMUM LETTER PHASE-C KAA;Lo;0;L;;;;;N;;;;;
+168AA;BAMUM LETTER PHASE-C SEUX;Lo;0;L;;;;;N;;;;;
+168AB;BAMUM LETTER PHASE-C NDIDA;Lo;0;L;;;;;N;;;;;
+168AC;BAMUM LETTER PHASE-C TAASHAE;Lo;0;L;;;;;N;;;;;
+168AD;BAMUM LETTER PHASE-C NJUEQ;Lo;0;L;;;;;N;;;;;
+168AE;BAMUM LETTER PHASE-C TITA YUE;Lo;0;L;;;;;N;;;;;
+168AF;BAMUM LETTER PHASE-C SUAET;Lo;0;L;;;;;N;;;;;
+168B0;BAMUM LETTER PHASE-C NGGUAEN NYAM;Lo;0;L;;;;;N;;;;;
+168B1;BAMUM LETTER PHASE-C VEUX;Lo;0;L;;;;;N;;;;;
+168B2;BAMUM LETTER PHASE-C NANSANAQ;Lo;0;L;;;;;N;;;;;
+168B3;BAMUM LETTER PHASE-C MA KEUAERI;Lo;0;L;;;;;N;;;;;
+168B4;BAMUM LETTER PHASE-C NTAA;Lo;0;L;;;;;N;;;;;
+168B5;BAMUM LETTER PHASE-C NGGUON;Lo;0;L;;;;;N;;;;;
+168B6;BAMUM LETTER PHASE-C LAP;Lo;0;L;;;;;N;;;;;
+168B7;BAMUM LETTER PHASE-C MBIRIEEN;Lo;0;L;;;;;N;;;;;
+168B8;BAMUM LETTER PHASE-C MGBASAQ;Lo;0;L;;;;;N;;;;;
+168B9;BAMUM LETTER PHASE-C NTEUNGBA;Lo;0;L;;;;;N;;;;;
+168BA;BAMUM LETTER PHASE-C TEUTEUX;Lo;0;L;;;;;N;;;;;
+168BB;BAMUM LETTER PHASE-C NGGUM;Lo;0;L;;;;;N;;;;;
+168BC;BAMUM LETTER PHASE-C FUE;Lo;0;L;;;;;N;;;;;
+168BD;BAMUM LETTER PHASE-C NDEUT;Lo;0;L;;;;;N;;;;;
+168BE;BAMUM LETTER PHASE-C NSA;Lo;0;L;;;;;N;;;;;
+168BF;BAMUM LETTER PHASE-C NSHAQ;Lo;0;L;;;;;N;;;;;
+168C0;BAMUM LETTER PHASE-C BUNG;Lo;0;L;;;;;N;;;;;
+168C1;BAMUM LETTER PHASE-C VEUAEPEN;Lo;0;L;;;;;N;;;;;
+168C2;BAMUM LETTER PHASE-C MBERAE;Lo;0;L;;;;;N;;;;;
+168C3;BAMUM LETTER PHASE-C RU;Lo;0;L;;;;;N;;;;;
+168C4;BAMUM LETTER PHASE-C NJAEM;Lo;0;L;;;;;N;;;;;
+168C5;BAMUM LETTER PHASE-C LAM;Lo;0;L;;;;;N;;;;;
+168C6;BAMUM LETTER PHASE-C TITUAEP;Lo;0;L;;;;;N;;;;;
+168C7;BAMUM LETTER PHASE-C NSUOT NGOM;Lo;0;L;;;;;N;;;;;
+168C8;BAMUM LETTER PHASE-C NJEEEE;Lo;0;L;;;;;N;;;;;
+168C9;BAMUM LETTER PHASE-C KET;Lo;0;L;;;;;N;;;;;
+168CA;BAMUM LETTER PHASE-C NGGU;Lo;0;L;;;;;N;;;;;
+168CB;BAMUM LETTER PHASE-C MAESI;Lo;0;L;;;;;N;;;;;
+168CC;BAMUM LETTER PHASE-C MBUAEM;Lo;0;L;;;;;N;;;;;
+168CD;BAMUM LETTER PHASE-C LU;Lo;0;L;;;;;N;;;;;
+168CE;BAMUM LETTER PHASE-C KUT;Lo;0;L;;;;;N;;;;;
+168CF;BAMUM LETTER PHASE-C NJAM;Lo;0;L;;;;;N;;;;;
+168D0;BAMUM LETTER PHASE-C NGOM;Lo;0;L;;;;;N;;;;;
+168D1;BAMUM LETTER PHASE-C WUP;Lo;0;L;;;;;N;;;;;
+168D2;BAMUM LETTER PHASE-C NGGUEET;Lo;0;L;;;;;N;;;;;
+168D3;BAMUM LETTER PHASE-C NSOM;Lo;0;L;;;;;N;;;;;
+168D4;BAMUM LETTER PHASE-C NTEN;Lo;0;L;;;;;N;;;;;
+168D5;BAMUM LETTER PHASE-C KUOP NKAARAE;Lo;0;L;;;;;N;;;;;
+168D6;BAMUM LETTER PHASE-C NSUN;Lo;0;L;;;;;N;;;;;
+168D7;BAMUM LETTER PHASE-C NDAM;Lo;0;L;;;;;N;;;;;
+168D8;BAMUM LETTER PHASE-C MA NSIEE;Lo;0;L;;;;;N;;;;;
+168D9;BAMUM LETTER PHASE-C YAA;Lo;0;L;;;;;N;;;;;
+168DA;BAMUM LETTER PHASE-C NDAP;Lo;0;L;;;;;N;;;;;
+168DB;BAMUM LETTER PHASE-C SHUEQ;Lo;0;L;;;;;N;;;;;
+168DC;BAMUM LETTER PHASE-C SETFON;Lo;0;L;;;;;N;;;;;
+168DD;BAMUM LETTER PHASE-C MBI;Lo;0;L;;;;;N;;;;;
+168DE;BAMUM LETTER PHASE-C MAEMBA;Lo;0;L;;;;;N;;;;;
+168DF;BAMUM LETTER PHASE-C MBANYI;Lo;0;L;;;;;N;;;;;
+168E0;BAMUM LETTER PHASE-C KEUSEUX;Lo;0;L;;;;;N;;;;;
+168E1;BAMUM LETTER PHASE-C MBEUX;Lo;0;L;;;;;N;;;;;
+168E2;BAMUM LETTER PHASE-C KEUM;Lo;0;L;;;;;N;;;;;
+168E3;BAMUM LETTER PHASE-C MBAA PICKET;Lo;0;L;;;;;N;;;;;
+168E4;BAMUM LETTER PHASE-C YUWOQ;Lo;0;L;;;;;N;;;;;
+168E5;BAMUM LETTER PHASE-C NJEUX;Lo;0;L;;;;;N;;;;;
+168E6;BAMUM LETTER PHASE-C MIEE;Lo;0;L;;;;;N;;;;;
+168E7;BAMUM LETTER PHASE-C MUAE;Lo;0;L;;;;;N;;;;;
+168E8;BAMUM LETTER PHASE-C SHIQ;Lo;0;L;;;;;N;;;;;
+168E9;BAMUM LETTER PHASE-C KEN LAW;Lo;0;L;;;;;N;;;;;
+168EA;BAMUM LETTER PHASE-C KEN FATIGUE;Lo;0;L;;;;;N;;;;;
+168EB;BAMUM LETTER PHASE-C NGAQ;Lo;0;L;;;;;N;;;;;
+168EC;BAMUM LETTER PHASE-C NAQ;Lo;0;L;;;;;N;;;;;
+168ED;BAMUM LETTER PHASE-C LIQ;Lo;0;L;;;;;N;;;;;
+168EE;BAMUM LETTER PHASE-C PIN;Lo;0;L;;;;;N;;;;;
+168EF;BAMUM LETTER PHASE-C PEN;Lo;0;L;;;;;N;;;;;
+168F0;BAMUM LETTER PHASE-C TET;Lo;0;L;;;;;N;;;;;
+168F1;BAMUM LETTER PHASE-D MBUO;Lo;0;L;;;;;N;;;;;
+168F2;BAMUM LETTER PHASE-D WAP;Lo;0;L;;;;;N;;;;;
+168F3;BAMUM LETTER PHASE-D NJI;Lo;0;L;;;;;N;;;;;
+168F4;BAMUM LETTER PHASE-D MFON;Lo;0;L;;;;;N;;;;;
+168F5;BAMUM LETTER PHASE-D NJIEE;Lo;0;L;;;;;N;;;;;
+168F6;BAMUM LETTER PHASE-D LIEE;Lo;0;L;;;;;N;;;;;
+168F7;BAMUM LETTER PHASE-D NJEUT;Lo;0;L;;;;;N;;;;;
+168F8;BAMUM LETTER PHASE-D NSHEE;Lo;0;L;;;;;N;;;;;
+168F9;BAMUM LETTER PHASE-D NGGAAMAE;Lo;0;L;;;;;N;;;;;
+168FA;BAMUM LETTER PHASE-D NYAM;Lo;0;L;;;;;N;;;;;
+168FB;BAMUM LETTER PHASE-D WUAEN;Lo;0;L;;;;;N;;;;;
+168FC;BAMUM LETTER PHASE-D NGKUN;Lo;0;L;;;;;N;;;;;
+168FD;BAMUM LETTER PHASE-D SHEE;Lo;0;L;;;;;N;;;;;
+168FE;BAMUM LETTER PHASE-D NGKAP;Lo;0;L;;;;;N;;;;;
+168FF;BAMUM LETTER PHASE-D KEUAETMEUN;Lo;0;L;;;;;N;;;;;
+16900;BAMUM LETTER PHASE-D TEUT;Lo;0;L;;;;;N;;;;;
+16901;BAMUM LETTER PHASE-D SHEUAE;Lo;0;L;;;;;N;;;;;
+16902;BAMUM LETTER PHASE-D NJAP;Lo;0;L;;;;;N;;;;;
+16903;BAMUM LETTER PHASE-D SUE;Lo;0;L;;;;;N;;;;;
+16904;BAMUM LETTER PHASE-D KET;Lo;0;L;;;;;N;;;;;
+16905;BAMUM LETTER PHASE-D YAEMMAE;Lo;0;L;;;;;N;;;;;
+16906;BAMUM LETTER PHASE-D KUOM;Lo;0;L;;;;;N;;;;;
+16907;BAMUM LETTER PHASE-D SAP;Lo;0;L;;;;;N;;;;;
+16908;BAMUM LETTER PHASE-D MFEUT;Lo;0;L;;;;;N;;;;;
+16909;BAMUM LETTER PHASE-D NDEUX;Lo;0;L;;;;;N;;;;;
+1690A;BAMUM LETTER PHASE-D MALEERI;Lo;0;L;;;;;N;;;;;
+1690B;BAMUM LETTER PHASE-D MEUT;Lo;0;L;;;;;N;;;;;
+1690C;BAMUM LETTER PHASE-D SEUAEQ;Lo;0;L;;;;;N;;;;;
+1690D;BAMUM LETTER PHASE-D YEN;Lo;0;L;;;;;N;;;;;
+1690E;BAMUM LETTER PHASE-D NJEUAEM;Lo;0;L;;;;;N;;;;;
+1690F;BAMUM LETTER PHASE-D KEUOT MBUAE;Lo;0;L;;;;;N;;;;;
+16910;BAMUM LETTER PHASE-D NGKEURI;Lo;0;L;;;;;N;;;;;
+16911;BAMUM LETTER PHASE-D TU;Lo;0;L;;;;;N;;;;;
+16912;BAMUM LETTER PHASE-D GHAA;Lo;0;L;;;;;N;;;;;
+16913;BAMUM LETTER PHASE-D NGKYEE;Lo;0;L;;;;;N;;;;;
+16914;BAMUM LETTER PHASE-D FEUFEUAET;Lo;0;L;;;;;N;;;;;
+16915;BAMUM LETTER PHASE-D NDEE;Lo;0;L;;;;;N;;;;;
+16916;BAMUM LETTER PHASE-D MGBOFUM;Lo;0;L;;;;;N;;;;;
+16917;BAMUM LETTER PHASE-D LEUAEP;Lo;0;L;;;;;N;;;;;
+16918;BAMUM LETTER PHASE-D NDON;Lo;0;L;;;;;N;;;;;
+16919;BAMUM LETTER PHASE-D MONI;Lo;0;L;;;;;N;;;;;
+1691A;BAMUM LETTER PHASE-D MGBEUN;Lo;0;L;;;;;N;;;;;
+1691B;BAMUM LETTER PHASE-D PUUT;Lo;0;L;;;;;N;;;;;
+1691C;BAMUM LETTER PHASE-D MGBIEE;Lo;0;L;;;;;N;;;;;
+1691D;BAMUM LETTER PHASE-D MFO;Lo;0;L;;;;;N;;;;;
+1691E;BAMUM LETTER PHASE-D LUM;Lo;0;L;;;;;N;;;;;
+1691F;BAMUM LETTER PHASE-D NSIEEP;Lo;0;L;;;;;N;;;;;
+16920;BAMUM LETTER PHASE-D MBAA;Lo;0;L;;;;;N;;;;;
+16921;BAMUM LETTER PHASE-D KWAET;Lo;0;L;;;;;N;;;;;
+16922;BAMUM LETTER PHASE-D NYET;Lo;0;L;;;;;N;;;;;
+16923;BAMUM LETTER PHASE-D TEUAEN;Lo;0;L;;;;;N;;;;;
+16924;BAMUM LETTER PHASE-D SOT;Lo;0;L;;;;;N;;;;;
+16925;BAMUM LETTER PHASE-D YUWOQ;Lo;0;L;;;;;N;;;;;
+16926;BAMUM LETTER PHASE-D KEUM;Lo;0;L;;;;;N;;;;;
+16927;BAMUM LETTER PHASE-D RAEM;Lo;0;L;;;;;N;;;;;
+16928;BAMUM LETTER PHASE-D TEEEE;Lo;0;L;;;;;N;;;;;
+16929;BAMUM LETTER PHASE-D NGKEUAEQ;Lo;0;L;;;;;N;;;;;
+1692A;BAMUM LETTER PHASE-D MFEUAE;Lo;0;L;;;;;N;;;;;
+1692B;BAMUM LETTER PHASE-D NSIEET;Lo;0;L;;;;;N;;;;;
+1692C;BAMUM LETTER PHASE-D KEUP;Lo;0;L;;;;;N;;;;;
+1692D;BAMUM LETTER PHASE-D PIP;Lo;0;L;;;;;N;;;;;
+1692E;BAMUM LETTER PHASE-D PEUTAE;Lo;0;L;;;;;N;;;;;
+1692F;BAMUM LETTER PHASE-D NYUE;Lo;0;L;;;;;N;;;;;
+16930;BAMUM LETTER PHASE-D LET;Lo;0;L;;;;;N;;;;;
+16931;BAMUM LETTER PHASE-D NGGAAM;Lo;0;L;;;;;N;;;;;
+16932;BAMUM LETTER PHASE-D MFIEE;Lo;0;L;;;;;N;;;;;
+16933;BAMUM LETTER PHASE-D NGGWAEN;Lo;0;L;;;;;N;;;;;
+16934;BAMUM LETTER PHASE-D YUOM;Lo;0;L;;;;;N;;;;;
+16935;BAMUM LETTER PHASE-D PAP;Lo;0;L;;;;;N;;;;;
+16936;BAMUM LETTER PHASE-D YUOP;Lo;0;L;;;;;N;;;;;
+16937;BAMUM LETTER PHASE-D NDAM;Lo;0;L;;;;;N;;;;;
+16938;BAMUM LETTER PHASE-D NTEUM;Lo;0;L;;;;;N;;;;;
+16939;BAMUM LETTER PHASE-D SUAE;Lo;0;L;;;;;N;;;;;
+1693A;BAMUM LETTER PHASE-D KUN;Lo;0;L;;;;;N;;;;;
+1693B;BAMUM LETTER PHASE-D NGGEUX;Lo;0;L;;;;;N;;;;;
+1693C;BAMUM LETTER PHASE-D NGKIEE;Lo;0;L;;;;;N;;;;;
+1693D;BAMUM LETTER PHASE-D TUOT;Lo;0;L;;;;;N;;;;;
+1693E;BAMUM LETTER PHASE-D MEUN;Lo;0;L;;;;;N;;;;;
+1693F;BAMUM LETTER PHASE-D KUQ;Lo;0;L;;;;;N;;;;;
+16940;BAMUM LETTER PHASE-D NSUM;Lo;0;L;;;;;N;;;;;
+16941;BAMUM LETTER PHASE-D TEUN;Lo;0;L;;;;;N;;;;;
+16942;BAMUM LETTER PHASE-D MAENJET;Lo;0;L;;;;;N;;;;;
+16943;BAMUM LETTER PHASE-D NGGAP;Lo;0;L;;;;;N;;;;;
+16944;BAMUM LETTER PHASE-D LEUM;Lo;0;L;;;;;N;;;;;
+16945;BAMUM LETTER PHASE-D NGGUOM;Lo;0;L;;;;;N;;;;;
+16946;BAMUM LETTER PHASE-D NSHUT;Lo;0;L;;;;;N;;;;;
+16947;BAMUM LETTER PHASE-D NJUEQ;Lo;0;L;;;;;N;;;;;
+16948;BAMUM LETTER PHASE-D GHEUAE;Lo;0;L;;;;;N;;;;;
+16949;BAMUM LETTER PHASE-D KU;Lo;0;L;;;;;N;;;;;
+1694A;BAMUM LETTER PHASE-D REN OLD;Lo;0;L;;;;;N;;;;;
+1694B;BAMUM LETTER PHASE-D TAE;Lo;0;L;;;;;N;;;;;
+1694C;BAMUM LETTER PHASE-D TOQ;Lo;0;L;;;;;N;;;;;
+1694D;BAMUM LETTER PHASE-D NYI;Lo;0;L;;;;;N;;;;;
+1694E;BAMUM LETTER PHASE-D RII;Lo;0;L;;;;;N;;;;;
+1694F;BAMUM LETTER PHASE-D LEEEE;Lo;0;L;;;;;N;;;;;
+16950;BAMUM LETTER PHASE-D MEEEE;Lo;0;L;;;;;N;;;;;
+16951;BAMUM LETTER PHASE-D M;Lo;0;L;;;;;N;;;;;
+16952;BAMUM LETTER PHASE-D SUU;Lo;0;L;;;;;N;;;;;
+16953;BAMUM LETTER PHASE-D MU;Lo;0;L;;;;;N;;;;;
+16954;BAMUM LETTER PHASE-D SHII;Lo;0;L;;;;;N;;;;;
+16955;BAMUM LETTER PHASE-D SHEUX;Lo;0;L;;;;;N;;;;;
+16956;BAMUM LETTER PHASE-D KYEE;Lo;0;L;;;;;N;;;;;
+16957;BAMUM LETTER PHASE-D NU;Lo;0;L;;;;;N;;;;;
+16958;BAMUM LETTER PHASE-D SHU;Lo;0;L;;;;;N;;;;;
+16959;BAMUM LETTER PHASE-D NTEE;Lo;0;L;;;;;N;;;;;
+1695A;BAMUM LETTER PHASE-D PEE;Lo;0;L;;;;;N;;;;;
+1695B;BAMUM LETTER PHASE-D NI;Lo;0;L;;;;;N;;;;;
+1695C;BAMUM LETTER PHASE-D SHOQ;Lo;0;L;;;;;N;;;;;
+1695D;BAMUM LETTER PHASE-D PUQ;Lo;0;L;;;;;N;;;;;
+1695E;BAMUM LETTER PHASE-D MVOP;Lo;0;L;;;;;N;;;;;
+1695F;BAMUM LETTER PHASE-D LOQ;Lo;0;L;;;;;N;;;;;
+16960;BAMUM LETTER PHASE-D REN MUCH;Lo;0;L;;;;;N;;;;;
+16961;BAMUM LETTER PHASE-D TI;Lo;0;L;;;;;N;;;;;
+16962;BAMUM LETTER PHASE-D NTUU;Lo;0;L;;;;;N;;;;;
+16963;BAMUM LETTER PHASE-D MBAA SEVEN;Lo;0;L;;;;;N;;;;;
+16964;BAMUM LETTER PHASE-D SAQ;Lo;0;L;;;;;N;;;;;
+16965;BAMUM LETTER PHASE-D FAA;Lo;0;L;;;;;N;;;;;
+16966;BAMUM LETTER PHASE-E NDAP;Lo;0;L;;;;;N;;;;;
+16967;BAMUM LETTER PHASE-E TOON;Lo;0;L;;;;;N;;;;;
+16968;BAMUM LETTER PHASE-E MBEUM;Lo;0;L;;;;;N;;;;;
+16969;BAMUM LETTER PHASE-E LAP;Lo;0;L;;;;;N;;;;;
+1696A;BAMUM LETTER PHASE-E VOM;Lo;0;L;;;;;N;;;;;
+1696B;BAMUM LETTER PHASE-E LOON;Lo;0;L;;;;;N;;;;;
+1696C;BAMUM LETTER PHASE-E PAA;Lo;0;L;;;;;N;;;;;
+1696D;BAMUM LETTER PHASE-E SOM;Lo;0;L;;;;;N;;;;;
+1696E;BAMUM LETTER PHASE-E RAQ;Lo;0;L;;;;;N;;;;;
+1696F;BAMUM LETTER PHASE-E NSHUOP;Lo;0;L;;;;;N;;;;;
+16970;BAMUM LETTER PHASE-E NDUN;Lo;0;L;;;;;N;;;;;
+16971;BAMUM LETTER PHASE-E PUAE;Lo;0;L;;;;;N;;;;;
+16972;BAMUM LETTER PHASE-E TAM;Lo;0;L;;;;;N;;;;;
+16973;BAMUM LETTER PHASE-E NGKA;Lo;0;L;;;;;N;;;;;
+16974;BAMUM LETTER PHASE-E KPEUX;Lo;0;L;;;;;N;;;;;
+16975;BAMUM LETTER PHASE-E WUO;Lo;0;L;;;;;N;;;;;
+16976;BAMUM LETTER PHASE-E SEE;Lo;0;L;;;;;N;;;;;
+16977;BAMUM LETTER PHASE-E NGGEUAET;Lo;0;L;;;;;N;;;;;
+16978;BAMUM LETTER PHASE-E PAAM;Lo;0;L;;;;;N;;;;;
+16979;BAMUM LETTER PHASE-E TOO;Lo;0;L;;;;;N;;;;;
+1697A;BAMUM LETTER PHASE-E KUOP;Lo;0;L;;;;;N;;;;;
+1697B;BAMUM LETTER PHASE-E LOM;Lo;0;L;;;;;N;;;;;
+1697C;BAMUM LETTER PHASE-E NSHIEE;Lo;0;L;;;;;N;;;;;
+1697D;BAMUM LETTER PHASE-E NGOP;Lo;0;L;;;;;N;;;;;
+1697E;BAMUM LETTER PHASE-E MAEM;Lo;0;L;;;;;N;;;;;
+1697F;BAMUM LETTER PHASE-E NGKEUX;Lo;0;L;;;;;N;;;;;
+16980;BAMUM LETTER PHASE-E NGOQ;Lo;0;L;;;;;N;;;;;
+16981;BAMUM LETTER PHASE-E NSHUE;Lo;0;L;;;;;N;;;;;
+16982;BAMUM LETTER PHASE-E RIMGBA;Lo;0;L;;;;;N;;;;;
+16983;BAMUM LETTER PHASE-E NJEUX;Lo;0;L;;;;;N;;;;;
+16984;BAMUM LETTER PHASE-E PEEM;Lo;0;L;;;;;N;;;;;
+16985;BAMUM LETTER PHASE-E SAA;Lo;0;L;;;;;N;;;;;
+16986;BAMUM LETTER PHASE-E NGGURAE;Lo;0;L;;;;;N;;;;;
+16987;BAMUM LETTER PHASE-E MGBA;Lo;0;L;;;;;N;;;;;
+16988;BAMUM LETTER PHASE-E GHEUX;Lo;0;L;;;;;N;;;;;
+16989;BAMUM LETTER PHASE-E NGKEUAEM;Lo;0;L;;;;;N;;;;;
+1698A;BAMUM LETTER PHASE-E NJAEMLI;Lo;0;L;;;;;N;;;;;
+1698B;BAMUM LETTER PHASE-E MAP;Lo;0;L;;;;;N;;;;;
+1698C;BAMUM LETTER PHASE-E LOOT;Lo;0;L;;;;;N;;;;;
+1698D;BAMUM LETTER PHASE-E NGGEEEE;Lo;0;L;;;;;N;;;;;
+1698E;BAMUM LETTER PHASE-E NDIQ;Lo;0;L;;;;;N;;;;;
+1698F;BAMUM LETTER PHASE-E TAEN NTEUM;Lo;0;L;;;;;N;;;;;
+16990;BAMUM LETTER PHASE-E SET;Lo;0;L;;;;;N;;;;;
+16991;BAMUM LETTER PHASE-E PUM;Lo;0;L;;;;;N;;;;;
+16992;BAMUM LETTER PHASE-E NDAA SOFTNESS;Lo;0;L;;;;;N;;;;;
+16993;BAMUM LETTER PHASE-E NGGUAESHAE NYAM;Lo;0;L;;;;;N;;;;;
+16994;BAMUM LETTER PHASE-E YIEE;Lo;0;L;;;;;N;;;;;
+16995;BAMUM LETTER PHASE-E GHEUN;Lo;0;L;;;;;N;;;;;
+16996;BAMUM LETTER PHASE-E TUAE;Lo;0;L;;;;;N;;;;;
+16997;BAMUM LETTER PHASE-E YEUAE;Lo;0;L;;;;;N;;;;;
+16998;BAMUM LETTER PHASE-E PO;Lo;0;L;;;;;N;;;;;
+16999;BAMUM LETTER PHASE-E TUMAE;Lo;0;L;;;;;N;;;;;
+1699A;BAMUM LETTER PHASE-E KEUAE;Lo;0;L;;;;;N;;;;;
+1699B;BAMUM LETTER PHASE-E SUAEN;Lo;0;L;;;;;N;;;;;
+1699C;BAMUM LETTER PHASE-E TEUAEQ;Lo;0;L;;;;;N;;;;;
+1699D;BAMUM LETTER PHASE-E VEUAE;Lo;0;L;;;;;N;;;;;
+1699E;BAMUM LETTER PHASE-E WEUX;Lo;0;L;;;;;N;;;;;
+1699F;BAMUM LETTER PHASE-E LAAM;Lo;0;L;;;;;N;;;;;
+169A0;BAMUM LETTER PHASE-E PU;Lo;0;L;;;;;N;;;;;
+169A1;BAMUM LETTER PHASE-E TAAQ;Lo;0;L;;;;;N;;;;;
+169A2;BAMUM LETTER PHASE-E GHAAMAE;Lo;0;L;;;;;N;;;;;
+169A3;BAMUM LETTER PHASE-E NGEUREUT;Lo;0;L;;;;;N;;;;;
+169A4;BAMUM LETTER PHASE-E SHEUAEQ;Lo;0;L;;;;;N;;;;;
+169A5;BAMUM LETTER PHASE-E MGBEN;Lo;0;L;;;;;N;;;;;
+169A6;BAMUM LETTER PHASE-E MBEE;Lo;0;L;;;;;N;;;;;
+169A7;BAMUM LETTER PHASE-E NZAQ;Lo;0;L;;;;;N;;;;;
+169A8;BAMUM LETTER PHASE-E NKOM;Lo;0;L;;;;;N;;;;;
+169A9;BAMUM LETTER PHASE-E GBET;Lo;0;L;;;;;N;;;;;
+169AA;BAMUM LETTER PHASE-E TUM;Lo;0;L;;;;;N;;;;;
+169AB;BAMUM LETTER PHASE-E KUET;Lo;0;L;;;;;N;;;;;
+169AC;BAMUM LETTER PHASE-E YAP;Lo;0;L;;;;;N;;;;;
+169AD;BAMUM LETTER PHASE-E NYI CLEAVER;Lo;0;L;;;;;N;;;;;
+169AE;BAMUM LETTER PHASE-E YIT;Lo;0;L;;;;;N;;;;;
+169AF;BAMUM LETTER PHASE-E MFEUQ;Lo;0;L;;;;;N;;;;;
+169B0;BAMUM LETTER PHASE-E NDIAQ;Lo;0;L;;;;;N;;;;;
+169B1;BAMUM LETTER PHASE-E PIEEQ;Lo;0;L;;;;;N;;;;;
+169B2;BAMUM LETTER PHASE-E YUEQ;Lo;0;L;;;;;N;;;;;
+169B3;BAMUM LETTER PHASE-E LEUAEM;Lo;0;L;;;;;N;;;;;
+169B4;BAMUM LETTER PHASE-E FUE;Lo;0;L;;;;;N;;;;;
+169B5;BAMUM LETTER PHASE-E GBEUX;Lo;0;L;;;;;N;;;;;
+169B6;BAMUM LETTER PHASE-E NGKUP;Lo;0;L;;;;;N;;;;;
+169B7;BAMUM LETTER PHASE-E KET;Lo;0;L;;;;;N;;;;;
+169B8;BAMUM LETTER PHASE-E MAE;Lo;0;L;;;;;N;;;;;
+169B9;BAMUM LETTER PHASE-E NGKAAMI;Lo;0;L;;;;;N;;;;;
+169BA;BAMUM LETTER PHASE-E GHET;Lo;0;L;;;;;N;;;;;
+169BB;BAMUM LETTER PHASE-E FA;Lo;0;L;;;;;N;;;;;
+169BC;BAMUM LETTER PHASE-E NTUM;Lo;0;L;;;;;N;;;;;
+169BD;BAMUM LETTER PHASE-E PEUT;Lo;0;L;;;;;N;;;;;
+169BE;BAMUM LETTER PHASE-E YEUM;Lo;0;L;;;;;N;;;;;
+169BF;BAMUM LETTER PHASE-E NGGEUAE;Lo;0;L;;;;;N;;;;;
+169C0;BAMUM LETTER PHASE-E NYI BETWEEN;Lo;0;L;;;;;N;;;;;
+169C1;BAMUM LETTER PHASE-E NZUQ;Lo;0;L;;;;;N;;;;;
+169C2;BAMUM LETTER PHASE-E POON;Lo;0;L;;;;;N;;;;;
+169C3;BAMUM LETTER PHASE-E MIEE;Lo;0;L;;;;;N;;;;;
+169C4;BAMUM LETTER PHASE-E FUET;Lo;0;L;;;;;N;;;;;
+169C5;BAMUM LETTER PHASE-E NAE;Lo;0;L;;;;;N;;;;;
+169C6;BAMUM LETTER PHASE-E MUAE;Lo;0;L;;;;;N;;;;;
+169C7;BAMUM LETTER PHASE-E GHEUAE;Lo;0;L;;;;;N;;;;;
+169C8;BAMUM LETTER PHASE-E FU I;Lo;0;L;;;;;N;;;;;
+169C9;BAMUM LETTER PHASE-E MVI;Lo;0;L;;;;;N;;;;;
+169CA;BAMUM LETTER PHASE-E PUAQ;Lo;0;L;;;;;N;;;;;
+169CB;BAMUM LETTER PHASE-E NGKUM;Lo;0;L;;;;;N;;;;;
+169CC;BAMUM LETTER PHASE-E KUT;Lo;0;L;;;;;N;;;;;
+169CD;BAMUM LETTER PHASE-E PIET;Lo;0;L;;;;;N;;;;;
+169CE;BAMUM LETTER PHASE-E NTAP;Lo;0;L;;;;;N;;;;;
+169CF;BAMUM LETTER PHASE-E YEUAET;Lo;0;L;;;;;N;;;;;
+169D0;BAMUM LETTER PHASE-E NGGUP;Lo;0;L;;;;;N;;;;;
+169D1;BAMUM LETTER PHASE-E PA PEOPLE;Lo;0;L;;;;;N;;;;;
+169D2;BAMUM LETTER PHASE-E FU CALL;Lo;0;L;;;;;N;;;;;
+169D3;BAMUM LETTER PHASE-E FOM;Lo;0;L;;;;;N;;;;;
+169D4;BAMUM LETTER PHASE-E NJEE;Lo;0;L;;;;;N;;;;;
+169D5;BAMUM LETTER PHASE-E A;Lo;0;L;;;;;N;;;;;
+169D6;BAMUM LETTER PHASE-E TOQ;Lo;0;L;;;;;N;;;;;
+169D7;BAMUM LETTER PHASE-E O;Lo;0;L;;;;;N;;;;;
+169D8;BAMUM LETTER PHASE-E I;Lo;0;L;;;;;N;;;;;
+169D9;BAMUM LETTER PHASE-E LAQ;Lo;0;L;;;;;N;;;;;
+169DA;BAMUM LETTER PHASE-E PA PLURAL;Lo;0;L;;;;;N;;;;;
+169DB;BAMUM LETTER PHASE-E TAA;Lo;0;L;;;;;N;;;;;
+169DC;BAMUM LETTER PHASE-E TAQ;Lo;0;L;;;;;N;;;;;
+169DD;BAMUM LETTER PHASE-E NDAA MY HOUSE;Lo;0;L;;;;;N;;;;;
+169DE;BAMUM LETTER PHASE-E SHIQ;Lo;0;L;;;;;N;;;;;
+169DF;BAMUM LETTER PHASE-E YEUX;Lo;0;L;;;;;N;;;;;
+169E0;BAMUM LETTER PHASE-E NGUAE;Lo;0;L;;;;;N;;;;;
+169E1;BAMUM LETTER PHASE-E YUAEN;Lo;0;L;;;;;N;;;;;
+169E2;BAMUM LETTER PHASE-E YOQ SWIMMING;Lo;0;L;;;;;N;;;;;
+169E3;BAMUM LETTER PHASE-E YOQ COVER;Lo;0;L;;;;;N;;;;;
+169E4;BAMUM LETTER PHASE-E YUQ;Lo;0;L;;;;;N;;;;;
+169E5;BAMUM LETTER PHASE-E YUN;Lo;0;L;;;;;N;;;;;
+169E6;BAMUM LETTER PHASE-E KEUX;Lo;0;L;;;;;N;;;;;
+169E7;BAMUM LETTER PHASE-E PEUX;Lo;0;L;;;;;N;;;;;
+169E8;BAMUM LETTER PHASE-E NJEE EPOCH;Lo;0;L;;;;;N;;;;;
+169E9;BAMUM LETTER PHASE-E PUE;Lo;0;L;;;;;N;;;;;
+169EA;BAMUM LETTER PHASE-E WUE;Lo;0;L;;;;;N;;;;;
+169EB;BAMUM LETTER PHASE-E FEE;Lo;0;L;;;;;N;;;;;
+169EC;BAMUM LETTER PHASE-E VEE;Lo;0;L;;;;;N;;;;;
+169ED;BAMUM LETTER PHASE-E LU;Lo;0;L;;;;;N;;;;;
+169EE;BAMUM LETTER PHASE-E MI;Lo;0;L;;;;;N;;;;;
+169EF;BAMUM LETTER PHASE-E REUX;Lo;0;L;;;;;N;;;;;
+169F0;BAMUM LETTER PHASE-E RAE;Lo;0;L;;;;;N;;;;;
+169F1;BAMUM LETTER PHASE-E NGUAET;Lo;0;L;;;;;N;;;;;
+169F2;BAMUM LETTER PHASE-E NGA;Lo;0;L;;;;;N;;;;;
+169F3;BAMUM LETTER PHASE-E SHO;Lo;0;L;;;;;N;;;;;
+169F4;BAMUM LETTER PHASE-E SHOQ;Lo;0;L;;;;;N;;;;;
+169F5;BAMUM LETTER PHASE-E FU REMEDY;Lo;0;L;;;;;N;;;;;
+169F6;BAMUM LETTER PHASE-E NA;Lo;0;L;;;;;N;;;;;
+169F7;BAMUM LETTER PHASE-E PI;Lo;0;L;;;;;N;;;;;
+169F8;BAMUM LETTER PHASE-E LOQ;Lo;0;L;;;;;N;;;;;
+169F9;BAMUM LETTER PHASE-E KO;Lo;0;L;;;;;N;;;;;
+169FA;BAMUM LETTER PHASE-E MEN;Lo;0;L;;;;;N;;;;;
+169FB;BAMUM LETTER PHASE-E MA;Lo;0;L;;;;;N;;;;;
+169FC;BAMUM LETTER PHASE-E MAQ;Lo;0;L;;;;;N;;;;;
+169FD;BAMUM LETTER PHASE-E TEU;Lo;0;L;;;;;N;;;;;
+169FE;BAMUM LETTER PHASE-E KI;Lo;0;L;;;;;N;;;;;
+169FF;BAMUM LETTER PHASE-E MON;Lo;0;L;;;;;N;;;;;
+16A00;BAMUM LETTER PHASE-E TEN;Lo;0;L;;;;;N;;;;;
+16A01;BAMUM LETTER PHASE-E FAQ;Lo;0;L;;;;;N;;;;;
+16A02;BAMUM LETTER PHASE-E GHOM;Lo;0;L;;;;;N;;;;;
+16A03;BAMUM LETTER PHASE-F KA;Lo;0;L;;;;;N;;;;;
+16A04;BAMUM LETTER PHASE-F U;Lo;0;L;;;;;N;;;;;
+16A05;BAMUM LETTER PHASE-F KU;Lo;0;L;;;;;N;;;;;
+16A06;BAMUM LETTER PHASE-F EE;Lo;0;L;;;;;N;;;;;
+16A07;BAMUM LETTER PHASE-F REE;Lo;0;L;;;;;N;;;;;
+16A08;BAMUM LETTER PHASE-F TAE;Lo;0;L;;;;;N;;;;;
+16A09;BAMUM LETTER PHASE-F NYI;Lo;0;L;;;;;N;;;;;
+16A0A;BAMUM LETTER PHASE-F LA;Lo;0;L;;;;;N;;;;;
+16A0B;BAMUM LETTER PHASE-F RII;Lo;0;L;;;;;N;;;;;
+16A0C;BAMUM LETTER PHASE-F RIEE;Lo;0;L;;;;;N;;;;;
+16A0D;BAMUM LETTER PHASE-F MEEEE;Lo;0;L;;;;;N;;;;;
+16A0E;BAMUM LETTER PHASE-F TAA;Lo;0;L;;;;;N;;;;;
+16A0F;BAMUM LETTER PHASE-F NDAA;Lo;0;L;;;;;N;;;;;
+16A10;BAMUM LETTER PHASE-F NJAEM;Lo;0;L;;;;;N;;;;;
+16A11;BAMUM LETTER PHASE-F M;Lo;0;L;;;;;N;;;;;
+16A12;BAMUM LETTER PHASE-F SUU;Lo;0;L;;;;;N;;;;;
+16A13;BAMUM LETTER PHASE-F SHII;Lo;0;L;;;;;N;;;;;
+16A14;BAMUM LETTER PHASE-F SI;Lo;0;L;;;;;N;;;;;
+16A15;BAMUM LETTER PHASE-F SEUX;Lo;0;L;;;;;N;;;;;
+16A16;BAMUM LETTER PHASE-F KYEE;Lo;0;L;;;;;N;;;;;
+16A17;BAMUM LETTER PHASE-F KET;Lo;0;L;;;;;N;;;;;
+16A18;BAMUM LETTER PHASE-F NUAE;Lo;0;L;;;;;N;;;;;
+16A19;BAMUM LETTER PHASE-F NU;Lo;0;L;;;;;N;;;;;
+16A1A;BAMUM LETTER PHASE-F NJUAE;Lo;0;L;;;;;N;;;;;
+16A1B;BAMUM LETTER PHASE-F YOQ;Lo;0;L;;;;;N;;;;;
+16A1C;BAMUM LETTER PHASE-F SHU;Lo;0;L;;;;;N;;;;;
+16A1D;BAMUM LETTER PHASE-F YA;Lo;0;L;;;;;N;;;;;
+16A1E;BAMUM LETTER PHASE-F NSHA;Lo;0;L;;;;;N;;;;;
+16A1F;BAMUM LETTER PHASE-F PEUX;Lo;0;L;;;;;N;;;;;
+16A20;BAMUM LETTER PHASE-F NTEE;Lo;0;L;;;;;N;;;;;
+16A21;BAMUM LETTER PHASE-F WUE;Lo;0;L;;;;;N;;;;;
+16A22;BAMUM LETTER PHASE-F PEE;Lo;0;L;;;;;N;;;;;
+16A23;BAMUM LETTER PHASE-F RU;Lo;0;L;;;;;N;;;;;
+16A24;BAMUM LETTER PHASE-F NI;Lo;0;L;;;;;N;;;;;
+16A25;BAMUM LETTER PHASE-F REUX;Lo;0;L;;;;;N;;;;;
+16A26;BAMUM LETTER PHASE-F KEN;Lo;0;L;;;;;N;;;;;
+16A27;BAMUM LETTER PHASE-F NGKWAEN;Lo;0;L;;;;;N;;;;;
+16A28;BAMUM LETTER PHASE-F NGGA;Lo;0;L;;;;;N;;;;;
+16A29;BAMUM LETTER PHASE-F SHO;Lo;0;L;;;;;N;;;;;
+16A2A;BAMUM LETTER PHASE-F PUAE;Lo;0;L;;;;;N;;;;;
+16A2B;BAMUM LETTER PHASE-F FOM;Lo;0;L;;;;;N;;;;;
+16A2C;BAMUM LETTER PHASE-F WA;Lo;0;L;;;;;N;;;;;
+16A2D;BAMUM LETTER PHASE-F LI;Lo;0;L;;;;;N;;;;;
+16A2E;BAMUM LETTER PHASE-F LOQ;Lo;0;L;;;;;N;;;;;
+16A2F;BAMUM LETTER PHASE-F KO;Lo;0;L;;;;;N;;;;;
+16A30;BAMUM LETTER PHASE-F MBEN;Lo;0;L;;;;;N;;;;;
+16A31;BAMUM LETTER PHASE-F REN;Lo;0;L;;;;;N;;;;;
+16A32;BAMUM LETTER PHASE-F MA;Lo;0;L;;;;;N;;;;;
+16A33;BAMUM LETTER PHASE-F MO;Lo;0;L;;;;;N;;;;;
+16A34;BAMUM LETTER PHASE-F MBAA;Lo;0;L;;;;;N;;;;;
+16A35;BAMUM LETTER PHASE-F TET;Lo;0;L;;;;;N;;;;;
+16A36;BAMUM LETTER PHASE-F KPA;Lo;0;L;;;;;N;;;;;
+16A37;BAMUM LETTER PHASE-F SAMBA;Lo;0;L;;;;;N;;;;;
+16A38;BAMUM LETTER PHASE-F VUEQ;Lo;0;L;;;;;N;;;;;
+16A40;MRO LETTER TA;Lo;0;L;;;;;N;;;;;
+16A41;MRO LETTER NGI;Lo;0;L;;;;;N;;;;;
+16A42;MRO LETTER YO;Lo;0;L;;;;;N;;;;;
+16A43;MRO LETTER MIM;Lo;0;L;;;;;N;;;;;
+16A44;MRO LETTER BA;Lo;0;L;;;;;N;;;;;
+16A45;MRO LETTER DA;Lo;0;L;;;;;N;;;;;
+16A46;MRO LETTER A;Lo;0;L;;;;;N;;;;;
+16A47;MRO LETTER PHI;Lo;0;L;;;;;N;;;;;
+16A48;MRO LETTER KHAI;Lo;0;L;;;;;N;;;;;
+16A49;MRO LETTER HAO;Lo;0;L;;;;;N;;;;;
+16A4A;MRO LETTER DAI;Lo;0;L;;;;;N;;;;;
+16A4B;MRO LETTER CHU;Lo;0;L;;;;;N;;;;;
+16A4C;MRO LETTER KEAAE;Lo;0;L;;;;;N;;;;;
+16A4D;MRO LETTER OL;Lo;0;L;;;;;N;;;;;
+16A4E;MRO LETTER MAEM;Lo;0;L;;;;;N;;;;;
+16A4F;MRO LETTER NIN;Lo;0;L;;;;;N;;;;;
+16A50;MRO LETTER PA;Lo;0;L;;;;;N;;;;;
+16A51;MRO LETTER OO;Lo;0;L;;;;;N;;;;;
+16A52;MRO LETTER O;Lo;0;L;;;;;N;;;;;
+16A53;MRO LETTER RO;Lo;0;L;;;;;N;;;;;
+16A54;MRO LETTER SHI;Lo;0;L;;;;;N;;;;;
+16A55;MRO LETTER THEA;Lo;0;L;;;;;N;;;;;
+16A56;MRO LETTER EA;Lo;0;L;;;;;N;;;;;
+16A57;MRO LETTER WA;Lo;0;L;;;;;N;;;;;
+16A58;MRO LETTER E;Lo;0;L;;;;;N;;;;;
+16A59;MRO LETTER KO;Lo;0;L;;;;;N;;;;;
+16A5A;MRO LETTER LAN;Lo;0;L;;;;;N;;;;;
+16A5B;MRO LETTER LA;Lo;0;L;;;;;N;;;;;
+16A5C;MRO LETTER HAI;Lo;0;L;;;;;N;;;;;
+16A5D;MRO LETTER RI;Lo;0;L;;;;;N;;;;;
+16A5E;MRO LETTER TEK;Lo;0;L;;;;;N;;;;;
+16A60;MRO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+16A61;MRO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+16A62;MRO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+16A63;MRO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+16A64;MRO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+16A65;MRO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+16A66;MRO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+16A67;MRO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+16A68;MRO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+16A69;MRO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+16A6E;MRO DANDA;Po;0;L;;;;;N;;;;;
+16A6F;MRO DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+16AD0;BASSA VAH LETTER ENNI;Lo;0;L;;;;;N;;;;;
+16AD1;BASSA VAH LETTER KA;Lo;0;L;;;;;N;;;;;
+16AD2;BASSA VAH LETTER SE;Lo;0;L;;;;;N;;;;;
+16AD3;BASSA VAH LETTER FA;Lo;0;L;;;;;N;;;;;
+16AD4;BASSA VAH LETTER MBE;Lo;0;L;;;;;N;;;;;
+16AD5;BASSA VAH LETTER YIE;Lo;0;L;;;;;N;;;;;
+16AD6;BASSA VAH LETTER GAH;Lo;0;L;;;;;N;;;;;
+16AD7;BASSA VAH LETTER DHII;Lo;0;L;;;;;N;;;;;
+16AD8;BASSA VAH LETTER KPAH;Lo;0;L;;;;;N;;;;;
+16AD9;BASSA VAH LETTER JO;Lo;0;L;;;;;N;;;;;
+16ADA;BASSA VAH LETTER HWAH;Lo;0;L;;;;;N;;;;;
+16ADB;BASSA VAH LETTER WA;Lo;0;L;;;;;N;;;;;
+16ADC;BASSA VAH LETTER ZO;Lo;0;L;;;;;N;;;;;
+16ADD;BASSA VAH LETTER GBU;Lo;0;L;;;;;N;;;;;
+16ADE;BASSA VAH LETTER DO;Lo;0;L;;;;;N;;;;;
+16ADF;BASSA VAH LETTER CE;Lo;0;L;;;;;N;;;;;
+16AE0;BASSA VAH LETTER UWU;Lo;0;L;;;;;N;;;;;
+16AE1;BASSA VAH LETTER TO;Lo;0;L;;;;;N;;;;;
+16AE2;BASSA VAH LETTER BA;Lo;0;L;;;;;N;;;;;
+16AE3;BASSA VAH LETTER VU;Lo;0;L;;;;;N;;;;;
+16AE4;BASSA VAH LETTER YEIN;Lo;0;L;;;;;N;;;;;
+16AE5;BASSA VAH LETTER PA;Lo;0;L;;;;;N;;;;;
+16AE6;BASSA VAH LETTER WADDA;Lo;0;L;;;;;N;;;;;
+16AE7;BASSA VAH LETTER A;Lo;0;L;;;;;N;;;;;
+16AE8;BASSA VAH LETTER O;Lo;0;L;;;;;N;;;;;
+16AE9;BASSA VAH LETTER OO;Lo;0;L;;;;;N;;;;;
+16AEA;BASSA VAH LETTER U;Lo;0;L;;;;;N;;;;;
+16AEB;BASSA VAH LETTER EE;Lo;0;L;;;;;N;;;;;
+16AEC;BASSA VAH LETTER E;Lo;0;L;;;;;N;;;;;
+16AED;BASSA VAH LETTER I;Lo;0;L;;;;;N;;;;;
+16AF0;BASSA VAH COMBINING HIGH TONE;Mn;1;NSM;;;;;N;;;;;
+16AF1;BASSA VAH COMBINING LOW TONE;Mn;1;NSM;;;;;N;;;;;
+16AF2;BASSA VAH COMBINING MID TONE;Mn;1;NSM;;;;;N;;;;;
+16AF3;BASSA VAH COMBINING LOW-MID TONE;Mn;1;NSM;;;;;N;;;;;
+16AF4;BASSA VAH COMBINING HIGH-LOW TONE;Mn;1;NSM;;;;;N;;;;;
+16AF5;BASSA VAH FULL STOP;Po;0;L;;;;;N;;;;;
+16B00;PAHAWH HMONG VOWEL KEEB;Lo;0;L;;;;;N;;;;;
+16B01;PAHAWH HMONG VOWEL KEEV;Lo;0;L;;;;;N;;;;;
+16B02;PAHAWH HMONG VOWEL KIB;Lo;0;L;;;;;N;;;;;
+16B03;PAHAWH HMONG VOWEL KIV;Lo;0;L;;;;;N;;;;;
+16B04;PAHAWH HMONG VOWEL KAUB;Lo;0;L;;;;;N;;;;;
+16B05;PAHAWH HMONG VOWEL KAUV;Lo;0;L;;;;;N;;;;;
+16B06;PAHAWH HMONG VOWEL KUB;Lo;0;L;;;;;N;;;;;
+16B07;PAHAWH HMONG VOWEL KUV;Lo;0;L;;;;;N;;;;;
+16B08;PAHAWH HMONG VOWEL KEB;Lo;0;L;;;;;N;;;;;
+16B09;PAHAWH HMONG VOWEL KEV;Lo;0;L;;;;;N;;;;;
+16B0A;PAHAWH HMONG VOWEL KAIB;Lo;0;L;;;;;N;;;;;
+16B0B;PAHAWH HMONG VOWEL KAIV;Lo;0;L;;;;;N;;;;;
+16B0C;PAHAWH HMONG VOWEL KOOB;Lo;0;L;;;;;N;;;;;
+16B0D;PAHAWH HMONG VOWEL KOOV;Lo;0;L;;;;;N;;;;;
+16B0E;PAHAWH HMONG VOWEL KAWB;Lo;0;L;;;;;N;;;;;
+16B0F;PAHAWH HMONG VOWEL KAWV;Lo;0;L;;;;;N;;;;;
+16B10;PAHAWH HMONG VOWEL KUAB;Lo;0;L;;;;;N;;;;;
+16B11;PAHAWH HMONG VOWEL KUAV;Lo;0;L;;;;;N;;;;;
+16B12;PAHAWH HMONG VOWEL KOB;Lo;0;L;;;;;N;;;;;
+16B13;PAHAWH HMONG VOWEL KOV;Lo;0;L;;;;;N;;;;;
+16B14;PAHAWH HMONG VOWEL KIAB;Lo;0;L;;;;;N;;;;;
+16B15;PAHAWH HMONG VOWEL KIAV;Lo;0;L;;;;;N;;;;;
+16B16;PAHAWH HMONG VOWEL KAB;Lo;0;L;;;;;N;;;;;
+16B17;PAHAWH HMONG VOWEL KAV;Lo;0;L;;;;;N;;;;;
+16B18;PAHAWH HMONG VOWEL KWB;Lo;0;L;;;;;N;;;;;
+16B19;PAHAWH HMONG VOWEL KWV;Lo;0;L;;;;;N;;;;;
+16B1A;PAHAWH HMONG VOWEL KAAB;Lo;0;L;;;;;N;;;;;
+16B1B;PAHAWH HMONG VOWEL KAAV;Lo;0;L;;;;;N;;;;;
+16B1C;PAHAWH HMONG CONSONANT VAU;Lo;0;L;;;;;N;;;;;
+16B1D;PAHAWH HMONG CONSONANT NTSAU;Lo;0;L;;;;;N;;;;;
+16B1E;PAHAWH HMONG CONSONANT LAU;Lo;0;L;;;;;N;;;;;
+16B1F;PAHAWH HMONG CONSONANT HAU;Lo;0;L;;;;;N;;;;;
+16B20;PAHAWH HMONG CONSONANT NLAU;Lo;0;L;;;;;N;;;;;
+16B21;PAHAWH HMONG CONSONANT RAU;Lo;0;L;;;;;N;;;;;
+16B22;PAHAWH HMONG CONSONANT NKAU;Lo;0;L;;;;;N;;;;;
+16B23;PAHAWH HMONG CONSONANT QHAU;Lo;0;L;;;;;N;;;;;
+16B24;PAHAWH HMONG CONSONANT YAU;Lo;0;L;;;;;N;;;;;
+16B25;PAHAWH HMONG CONSONANT HLAU;Lo;0;L;;;;;N;;;;;
+16B26;PAHAWH HMONG CONSONANT MAU;Lo;0;L;;;;;N;;;;;
+16B27;PAHAWH HMONG CONSONANT CHAU;Lo;0;L;;;;;N;;;;;
+16B28;PAHAWH HMONG CONSONANT NCHAU;Lo;0;L;;;;;N;;;;;
+16B29;PAHAWH HMONG CONSONANT HNAU;Lo;0;L;;;;;N;;;;;
+16B2A;PAHAWH HMONG CONSONANT PLHAU;Lo;0;L;;;;;N;;;;;
+16B2B;PAHAWH HMONG CONSONANT NTHAU;Lo;0;L;;;;;N;;;;;
+16B2C;PAHAWH HMONG CONSONANT NAU;Lo;0;L;;;;;N;;;;;
+16B2D;PAHAWH HMONG CONSONANT AU;Lo;0;L;;;;;N;;;;;
+16B2E;PAHAWH HMONG CONSONANT XAU;Lo;0;L;;;;;N;;;;;
+16B2F;PAHAWH HMONG CONSONANT CAU;Lo;0;L;;;;;N;;;;;
+16B30;PAHAWH HMONG MARK CIM TUB;Mn;230;NSM;;;;;N;;;;;
+16B31;PAHAWH HMONG MARK CIM SO;Mn;230;NSM;;;;;N;;;;;
+16B32;PAHAWH HMONG MARK CIM KES;Mn;230;NSM;;;;;N;;;;;
+16B33;PAHAWH HMONG MARK CIM KHAV;Mn;230;NSM;;;;;N;;;;;
+16B34;PAHAWH HMONG MARK CIM SUAM;Mn;230;NSM;;;;;N;;;;;
+16B35;PAHAWH HMONG MARK CIM HOM;Mn;230;NSM;;;;;N;;;;;
+16B36;PAHAWH HMONG MARK CIM TAUM;Mn;230;NSM;;;;;N;;;;;
+16B37;PAHAWH HMONG SIGN VOS THOM;Po;0;L;;;;;N;;;;;
+16B38;PAHAWH HMONG SIGN VOS TSHAB CEEB;Po;0;L;;;;;N;;;;;
+16B39;PAHAWH HMONG SIGN CIM CHEEM;Po;0;L;;;;;N;;;;;
+16B3A;PAHAWH HMONG SIGN VOS THIAB;Po;0;L;;;;;N;;;;;
+16B3B;PAHAWH HMONG SIGN VOS FEEM;Po;0;L;;;;;N;;;;;
+16B3C;PAHAWH HMONG SIGN XYEEM NTXIV;So;0;L;;;;;N;;;;;
+16B3D;PAHAWH HMONG SIGN XYEEM RHO;So;0;L;;;;;N;;;;;
+16B3E;PAHAWH HMONG SIGN XYEEM TOV;So;0;L;;;;;N;;;;;
+16B3F;PAHAWH HMONG SIGN XYEEM FAIB;So;0;L;;;;;N;;;;;
+16B40;PAHAWH HMONG SIGN VOS SEEV;Lm;0;L;;;;;N;;;;;
+16B41;PAHAWH HMONG SIGN MEEJ SUAB;Lm;0;L;;;;;N;;;;;
+16B42;PAHAWH HMONG SIGN VOS NRUA;Lm;0;L;;;;;N;;;;;
+16B43;PAHAWH HMONG SIGN IB YAM;Lm;0;L;;;;;N;;;;;
+16B44;PAHAWH HMONG SIGN XAUS;Po;0;L;;;;;N;;;;;
+16B45;PAHAWH HMONG SIGN CIM TSOV ROG;So;0;L;;;;;N;;;;;
+16B50;PAHAWH HMONG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+16B51;PAHAWH HMONG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+16B52;PAHAWH HMONG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+16B53;PAHAWH HMONG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+16B54;PAHAWH HMONG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+16B55;PAHAWH HMONG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+16B56;PAHAWH HMONG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+16B57;PAHAWH HMONG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+16B58;PAHAWH HMONG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+16B59;PAHAWH HMONG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+16B5B;PAHAWH HMONG NUMBER TENS;No;0;L;;;;10;N;;;;;
+16B5C;PAHAWH HMONG NUMBER HUNDREDS;No;0;L;;;;100;N;;;;;
+16B5D;PAHAWH HMONG NUMBER TEN THOUSANDS;No;0;L;;;;10000;N;;;;;
+16B5E;PAHAWH HMONG NUMBER MILLIONS;No;0;L;;;;1000000;N;;;;;
+16B5F;PAHAWH HMONG NUMBER HUNDRED MILLIONS;No;0;L;;;;100000000;N;;;;;
+16B60;PAHAWH HMONG NUMBER TEN BILLIONS;No;0;L;;;;10000000000;N;;;;;
+16B61;PAHAWH HMONG NUMBER TRILLIONS;No;0;L;;;;1000000000000;N;;;;;
+16B63;PAHAWH HMONG SIGN VOS LUB;Lo;0;L;;;;;N;;;;;
+16B64;PAHAWH HMONG SIGN XYOO;Lo;0;L;;;;;N;;;;;
+16B65;PAHAWH HMONG SIGN HLI;Lo;0;L;;;;;N;;;;;
+16B66;PAHAWH HMONG SIGN THIRD-STAGE HLI;Lo;0;L;;;;;N;;;;;
+16B67;PAHAWH HMONG SIGN ZWJ THAJ;Lo;0;L;;;;;N;;;;;
+16B68;PAHAWH HMONG SIGN HNUB;Lo;0;L;;;;;N;;;;;
+16B69;PAHAWH HMONG SIGN NQIG;Lo;0;L;;;;;N;;;;;
+16B6A;PAHAWH HMONG SIGN XIAB;Lo;0;L;;;;;N;;;;;
+16B6B;PAHAWH HMONG SIGN NTUJ;Lo;0;L;;;;;N;;;;;
+16B6C;PAHAWH HMONG SIGN AV;Lo;0;L;;;;;N;;;;;
+16B6D;PAHAWH HMONG SIGN TXHEEJ CEEV;Lo;0;L;;;;;N;;;;;
+16B6E;PAHAWH HMONG SIGN MEEJ TSEEB;Lo;0;L;;;;;N;;;;;
+16B6F;PAHAWH HMONG SIGN TAU;Lo;0;L;;;;;N;;;;;
+16B70;PAHAWH HMONG SIGN LOS;Lo;0;L;;;;;N;;;;;
+16B71;PAHAWH HMONG SIGN MUS;Lo;0;L;;;;;N;;;;;
+16B72;PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG;Lo;0;L;;;;;N;;;;;
+16B73;PAHAWH HMONG SIGN CIM CUAM TSHOOJ;Lo;0;L;;;;;N;;;;;
+16B74;PAHAWH HMONG SIGN CIM TXWV;Lo;0;L;;;;;N;;;;;
+16B75;PAHAWH HMONG SIGN CIM TXWV CHWV;Lo;0;L;;;;;N;;;;;
+16B76;PAHAWH HMONG SIGN CIM PUB DAWB;Lo;0;L;;;;;N;;;;;
+16B77;PAHAWH HMONG SIGN CIM NRES TOS;Lo;0;L;;;;;N;;;;;
+16B7D;PAHAWH HMONG CLAN SIGN TSHEEJ;Lo;0;L;;;;;N;;;;;
+16B7E;PAHAWH HMONG CLAN SIGN YEEG;Lo;0;L;;;;;N;;;;;
+16B7F;PAHAWH HMONG CLAN SIGN LIS;Lo;0;L;;;;;N;;;;;
+16B80;PAHAWH HMONG CLAN SIGN LAUJ;Lo;0;L;;;;;N;;;;;
+16B81;PAHAWH HMONG CLAN SIGN XYOOJ;Lo;0;L;;;;;N;;;;;
+16B82;PAHAWH HMONG CLAN SIGN KOO;Lo;0;L;;;;;N;;;;;
+16B83;PAHAWH HMONG CLAN SIGN HAWJ;Lo;0;L;;;;;N;;;;;
+16B84;PAHAWH HMONG CLAN SIGN MUAS;Lo;0;L;;;;;N;;;;;
+16B85;PAHAWH HMONG CLAN SIGN THOJ;Lo;0;L;;;;;N;;;;;
+16B86;PAHAWH HMONG CLAN SIGN TSAB;Lo;0;L;;;;;N;;;;;
+16B87;PAHAWH HMONG CLAN SIGN PHAB;Lo;0;L;;;;;N;;;;;
+16B88;PAHAWH HMONG CLAN SIGN KHAB;Lo;0;L;;;;;N;;;;;
+16B89;PAHAWH HMONG CLAN SIGN HAM;Lo;0;L;;;;;N;;;;;
+16B8A;PAHAWH HMONG CLAN SIGN VAJ;Lo;0;L;;;;;N;;;;;
+16B8B;PAHAWH HMONG CLAN SIGN FAJ;Lo;0;L;;;;;N;;;;;
+16B8C;PAHAWH HMONG CLAN SIGN YAJ;Lo;0;L;;;;;N;;;;;
+16B8D;PAHAWH HMONG CLAN SIGN TSWB;Lo;0;L;;;;;N;;;;;
+16B8E;PAHAWH HMONG CLAN SIGN KWM;Lo;0;L;;;;;N;;;;;
+16B8F;PAHAWH HMONG CLAN SIGN VWJ;Lo;0;L;;;;;N;;;;;
+16F00;MIAO LETTER PA;Lo;0;L;;;;;N;;;;;
+16F01;MIAO LETTER BA;Lo;0;L;;;;;N;;;;;
+16F02;MIAO LETTER YI PA;Lo;0;L;;;;;N;;;;;
+16F03;MIAO LETTER PLA;Lo;0;L;;;;;N;;;;;
+16F04;MIAO LETTER MA;Lo;0;L;;;;;N;;;;;
+16F05;MIAO LETTER MHA;Lo;0;L;;;;;N;;;;;
+16F06;MIAO LETTER ARCHAIC MA;Lo;0;L;;;;;N;;;;;
+16F07;MIAO LETTER FA;Lo;0;L;;;;;N;;;;;
+16F08;MIAO LETTER VA;Lo;0;L;;;;;N;;;;;
+16F09;MIAO LETTER VFA;Lo;0;L;;;;;N;;;;;
+16F0A;MIAO LETTER TA;Lo;0;L;;;;;N;;;;;
+16F0B;MIAO LETTER DA;Lo;0;L;;;;;N;;;;;
+16F0C;MIAO LETTER YI TTA;Lo;0;L;;;;;N;;;;;
+16F0D;MIAO LETTER YI TA;Lo;0;L;;;;;N;;;;;
+16F0E;MIAO LETTER TTA;Lo;0;L;;;;;N;;;;;
+16F0F;MIAO LETTER DDA;Lo;0;L;;;;;N;;;;;
+16F10;MIAO LETTER NA;Lo;0;L;;;;;N;;;;;
+16F11;MIAO LETTER NHA;Lo;0;L;;;;;N;;;;;
+16F12;MIAO LETTER YI NNA;Lo;0;L;;;;;N;;;;;
+16F13;MIAO LETTER ARCHAIC NA;Lo;0;L;;;;;N;;;;;
+16F14;MIAO LETTER NNA;Lo;0;L;;;;;N;;;;;
+16F15;MIAO LETTER NNHA;Lo;0;L;;;;;N;;;;;
+16F16;MIAO LETTER LA;Lo;0;L;;;;;N;;;;;
+16F17;MIAO LETTER LYA;Lo;0;L;;;;;N;;;;;
+16F18;MIAO LETTER LHA;Lo;0;L;;;;;N;;;;;
+16F19;MIAO LETTER LHYA;Lo;0;L;;;;;N;;;;;
+16F1A;MIAO LETTER TLHA;Lo;0;L;;;;;N;;;;;
+16F1B;MIAO LETTER DLHA;Lo;0;L;;;;;N;;;;;
+16F1C;MIAO LETTER TLHYA;Lo;0;L;;;;;N;;;;;
+16F1D;MIAO LETTER DLHYA;Lo;0;L;;;;;N;;;;;
+16F1E;MIAO LETTER KA;Lo;0;L;;;;;N;;;;;
+16F1F;MIAO LETTER GA;Lo;0;L;;;;;N;;;;;
+16F20;MIAO LETTER YI KA;Lo;0;L;;;;;N;;;;;
+16F21;MIAO LETTER QA;Lo;0;L;;;;;N;;;;;
+16F22;MIAO LETTER QGA;Lo;0;L;;;;;N;;;;;
+16F23;MIAO LETTER NGA;Lo;0;L;;;;;N;;;;;
+16F24;MIAO LETTER NGHA;Lo;0;L;;;;;N;;;;;
+16F25;MIAO LETTER ARCHAIC NGA;Lo;0;L;;;;;N;;;;;
+16F26;MIAO LETTER HA;Lo;0;L;;;;;N;;;;;
+16F27;MIAO LETTER XA;Lo;0;L;;;;;N;;;;;
+16F28;MIAO LETTER GHA;Lo;0;L;;;;;N;;;;;
+16F29;MIAO LETTER GHHA;Lo;0;L;;;;;N;;;;;
+16F2A;MIAO LETTER TSSA;Lo;0;L;;;;;N;;;;;
+16F2B;MIAO LETTER DZZA;Lo;0;L;;;;;N;;;;;
+16F2C;MIAO LETTER NYA;Lo;0;L;;;;;N;;;;;
+16F2D;MIAO LETTER NYHA;Lo;0;L;;;;;N;;;;;
+16F2E;MIAO LETTER TSHA;Lo;0;L;;;;;N;;;;;
+16F2F;MIAO LETTER DZHA;Lo;0;L;;;;;N;;;;;
+16F30;MIAO LETTER YI TSHA;Lo;0;L;;;;;N;;;;;
+16F31;MIAO LETTER YI DZHA;Lo;0;L;;;;;N;;;;;
+16F32;MIAO LETTER REFORMED TSHA;Lo;0;L;;;;;N;;;;;
+16F33;MIAO LETTER SHA;Lo;0;L;;;;;N;;;;;
+16F34;MIAO LETTER SSA;Lo;0;L;;;;;N;;;;;
+16F35;MIAO LETTER ZHA;Lo;0;L;;;;;N;;;;;
+16F36;MIAO LETTER ZSHA;Lo;0;L;;;;;N;;;;;
+16F37;MIAO LETTER TSA;Lo;0;L;;;;;N;;;;;
+16F38;MIAO LETTER DZA;Lo;0;L;;;;;N;;;;;
+16F39;MIAO LETTER YI TSA;Lo;0;L;;;;;N;;;;;
+16F3A;MIAO LETTER SA;Lo;0;L;;;;;N;;;;;
+16F3B;MIAO LETTER ZA;Lo;0;L;;;;;N;;;;;
+16F3C;MIAO LETTER ZSA;Lo;0;L;;;;;N;;;;;
+16F3D;MIAO LETTER ZZA;Lo;0;L;;;;;N;;;;;
+16F3E;MIAO LETTER ZZSA;Lo;0;L;;;;;N;;;;;
+16F3F;MIAO LETTER ARCHAIC ZZA;Lo;0;L;;;;;N;;;;;
+16F40;MIAO LETTER ZZYA;Lo;0;L;;;;;N;;;;;
+16F41;MIAO LETTER ZZSYA;Lo;0;L;;;;;N;;;;;
+16F42;MIAO LETTER WA;Lo;0;L;;;;;N;;;;;
+16F43;MIAO LETTER AH;Lo;0;L;;;;;N;;;;;
+16F44;MIAO LETTER HHA;Lo;0;L;;;;;N;;;;;
+16F50;MIAO LETTER NASALIZATION;Lo;0;L;;;;;N;;;;;
+16F51;MIAO SIGN ASPIRATION;Mc;0;L;;;;;N;;;;;
+16F52;MIAO SIGN REFORMED VOICING;Mc;0;L;;;;;N;;;;;
+16F53;MIAO SIGN REFORMED ASPIRATION;Mc;0;L;;;;;N;;;;;
+16F54;MIAO VOWEL SIGN A;Mc;0;L;;;;;N;;;;;
+16F55;MIAO VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+16F56;MIAO VOWEL SIGN AHH;Mc;0;L;;;;;N;;;;;
+16F57;MIAO VOWEL SIGN AN;Mc;0;L;;;;;N;;;;;
+16F58;MIAO VOWEL SIGN ANG;Mc;0;L;;;;;N;;;;;
+16F59;MIAO VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+16F5A;MIAO VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+16F5B;MIAO VOWEL SIGN WO;Mc;0;L;;;;;N;;;;;
+16F5C;MIAO VOWEL SIGN W;Mc;0;L;;;;;N;;;;;
+16F5D;MIAO VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+16F5E;MIAO VOWEL SIGN EN;Mc;0;L;;;;;N;;;;;
+16F5F;MIAO VOWEL SIGN ENG;Mc;0;L;;;;;N;;;;;
+16F60;MIAO VOWEL SIGN OEY;Mc;0;L;;;;;N;;;;;
+16F61;MIAO VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+16F62;MIAO VOWEL SIGN IA;Mc;0;L;;;;;N;;;;;
+16F63;MIAO VOWEL SIGN IAN;Mc;0;L;;;;;N;;;;;
+16F64;MIAO VOWEL SIGN IANG;Mc;0;L;;;;;N;;;;;
+16F65;MIAO VOWEL SIGN IO;Mc;0;L;;;;;N;;;;;
+16F66;MIAO VOWEL SIGN IE;Mc;0;L;;;;;N;;;;;
+16F67;MIAO VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+16F68;MIAO VOWEL SIGN IU;Mc;0;L;;;;;N;;;;;
+16F69;MIAO VOWEL SIGN ING;Mc;0;L;;;;;N;;;;;
+16F6A;MIAO VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+16F6B;MIAO VOWEL SIGN UA;Mc;0;L;;;;;N;;;;;
+16F6C;MIAO VOWEL SIGN UAN;Mc;0;L;;;;;N;;;;;
+16F6D;MIAO VOWEL SIGN UANG;Mc;0;L;;;;;N;;;;;
+16F6E;MIAO VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+16F6F;MIAO VOWEL SIGN UEI;Mc;0;L;;;;;N;;;;;
+16F70;MIAO VOWEL SIGN UNG;Mc;0;L;;;;;N;;;;;
+16F71;MIAO VOWEL SIGN Y;Mc;0;L;;;;;N;;;;;
+16F72;MIAO VOWEL SIGN YI;Mc;0;L;;;;;N;;;;;
+16F73;MIAO VOWEL SIGN AE;Mc;0;L;;;;;N;;;;;
+16F74;MIAO VOWEL SIGN AEE;Mc;0;L;;;;;N;;;;;
+16F75;MIAO VOWEL SIGN ERR;Mc;0;L;;;;;N;;;;;
+16F76;MIAO VOWEL SIGN ROUNDED ERR;Mc;0;L;;;;;N;;;;;
+16F77;MIAO VOWEL SIGN ER;Mc;0;L;;;;;N;;;;;
+16F78;MIAO VOWEL SIGN ROUNDED ER;Mc;0;L;;;;;N;;;;;
+16F79;MIAO VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+16F7A;MIAO VOWEL SIGN EI;Mc;0;L;;;;;N;;;;;
+16F7B;MIAO VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+16F7C;MIAO VOWEL SIGN OU;Mc;0;L;;;;;N;;;;;
+16F7D;MIAO VOWEL SIGN N;Mc;0;L;;;;;N;;;;;
+16F7E;MIAO VOWEL SIGN NG;Mc;0;L;;;;;N;;;;;
+16F8F;MIAO TONE RIGHT;Mn;0;NSM;;;;;N;;;;;
+16F90;MIAO TONE TOP RIGHT;Mn;0;NSM;;;;;N;;;;;
+16F91;MIAO TONE ABOVE;Mn;0;NSM;;;;;N;;;;;
+16F92;MIAO TONE BELOW;Mn;0;NSM;;;;;N;;;;;
+16F93;MIAO LETTER TONE-2;Lm;0;L;;;;;N;;;;;
+16F94;MIAO LETTER TONE-3;Lm;0;L;;;;;N;;;;;
+16F95;MIAO LETTER TONE-4;Lm;0;L;;;;;N;;;;;
+16F96;MIAO LETTER TONE-5;Lm;0;L;;;;;N;;;;;
+16F97;MIAO LETTER TONE-6;Lm;0;L;;;;;N;;;;;
+16F98;MIAO LETTER TONE-7;Lm;0;L;;;;;N;;;;;
+16F99;MIAO LETTER TONE-8;Lm;0;L;;;;;N;;;;;
+16F9A;MIAO LETTER REFORMED TONE-1;Lm;0;L;;;;;N;;;;;
+16F9B;MIAO LETTER REFORMED TONE-2;Lm;0;L;;;;;N;;;;;
+16F9C;MIAO LETTER REFORMED TONE-4;Lm;0;L;;;;;N;;;;;
+16F9D;MIAO LETTER REFORMED TONE-5;Lm;0;L;;;;;N;;;;;
+16F9E;MIAO LETTER REFORMED TONE-6;Lm;0;L;;;;;N;;;;;
+16F9F;MIAO LETTER REFORMED TONE-8;Lm;0;L;;;;;N;;;;;
+16FE0;TANGUT ITERATION MARK;Lm;0;L;;;;;N;;;;;
+17000;<Tangut Ideograph, First>;Lo;0;L;;;;;N;;;;;
+187EC;<Tangut Ideograph, Last>;Lo;0;L;;;;;N;;;;;
+18800;TANGUT COMPONENT-001;Lo;0;L;;;;;N;;;;;
+18801;TANGUT COMPONENT-002;Lo;0;L;;;;;N;;;;;
+18802;TANGUT COMPONENT-003;Lo;0;L;;;;;N;;;;;
+18803;TANGUT COMPONENT-004;Lo;0;L;;;;;N;;;;;
+18804;TANGUT COMPONENT-005;Lo;0;L;;;;;N;;;;;
+18805;TANGUT COMPONENT-006;Lo;0;L;;;;;N;;;;;
+18806;TANGUT COMPONENT-007;Lo;0;L;;;;;N;;;;;
+18807;TANGUT COMPONENT-008;Lo;0;L;;;;;N;;;;;
+18808;TANGUT COMPONENT-009;Lo;0;L;;;;;N;;;;;
+18809;TANGUT COMPONENT-010;Lo;0;L;;;;;N;;;;;
+1880A;TANGUT COMPONENT-011;Lo;0;L;;;;;N;;;;;
+1880B;TANGUT COMPONENT-012;Lo;0;L;;;;;N;;;;;
+1880C;TANGUT COMPONENT-013;Lo;0;L;;;;;N;;;;;
+1880D;TANGUT COMPONENT-014;Lo;0;L;;;;;N;;;;;
+1880E;TANGUT COMPONENT-015;Lo;0;L;;;;;N;;;;;
+1880F;TANGUT COMPONENT-016;Lo;0;L;;;;;N;;;;;
+18810;TANGUT COMPONENT-017;Lo;0;L;;;;;N;;;;;
+18811;TANGUT COMPONENT-018;Lo;0;L;;;;;N;;;;;
+18812;TANGUT COMPONENT-019;Lo;0;L;;;;;N;;;;;
+18813;TANGUT COMPONENT-020;Lo;0;L;;;;;N;;;;;
+18814;TANGUT COMPONENT-021;Lo;0;L;;;;;N;;;;;
+18815;TANGUT COMPONENT-022;Lo;0;L;;;;;N;;;;;
+18816;TANGUT COMPONENT-023;Lo;0;L;;;;;N;;;;;
+18817;TANGUT COMPONENT-024;Lo;0;L;;;;;N;;;;;
+18818;TANGUT COMPONENT-025;Lo;0;L;;;;;N;;;;;
+18819;TANGUT COMPONENT-026;Lo;0;L;;;;;N;;;;;
+1881A;TANGUT COMPONENT-027;Lo;0;L;;;;;N;;;;;
+1881B;TANGUT COMPONENT-028;Lo;0;L;;;;;N;;;;;
+1881C;TANGUT COMPONENT-029;Lo;0;L;;;;;N;;;;;
+1881D;TANGUT COMPONENT-030;Lo;0;L;;;;;N;;;;;
+1881E;TANGUT COMPONENT-031;Lo;0;L;;;;;N;;;;;
+1881F;TANGUT COMPONENT-032;Lo;0;L;;;;;N;;;;;
+18820;TANGUT COMPONENT-033;Lo;0;L;;;;;N;;;;;
+18821;TANGUT COMPONENT-034;Lo;0;L;;;;;N;;;;;
+18822;TANGUT COMPONENT-035;Lo;0;L;;;;;N;;;;;
+18823;TANGUT COMPONENT-036;Lo;0;L;;;;;N;;;;;
+18824;TANGUT COMPONENT-037;Lo;0;L;;;;;N;;;;;
+18825;TANGUT COMPONENT-038;Lo;0;L;;;;;N;;;;;
+18826;TANGUT COMPONENT-039;Lo;0;L;;;;;N;;;;;
+18827;TANGUT COMPONENT-040;Lo;0;L;;;;;N;;;;;
+18828;TANGUT COMPONENT-041;Lo;0;L;;;;;N;;;;;
+18829;TANGUT COMPONENT-042;Lo;0;L;;;;;N;;;;;
+1882A;TANGUT COMPONENT-043;Lo;0;L;;;;;N;;;;;
+1882B;TANGUT COMPONENT-044;Lo;0;L;;;;;N;;;;;
+1882C;TANGUT COMPONENT-045;Lo;0;L;;;;;N;;;;;
+1882D;TANGUT COMPONENT-046;Lo;0;L;;;;;N;;;;;
+1882E;TANGUT COMPONENT-047;Lo;0;L;;;;;N;;;;;
+1882F;TANGUT COMPONENT-048;Lo;0;L;;;;;N;;;;;
+18830;TANGUT COMPONENT-049;Lo;0;L;;;;;N;;;;;
+18831;TANGUT COMPONENT-050;Lo;0;L;;;;;N;;;;;
+18832;TANGUT COMPONENT-051;Lo;0;L;;;;;N;;;;;
+18833;TANGUT COMPONENT-052;Lo;0;L;;;;;N;;;;;
+18834;TANGUT COMPONENT-053;Lo;0;L;;;;;N;;;;;
+18835;TANGUT COMPONENT-054;Lo;0;L;;;;;N;;;;;
+18836;TANGUT COMPONENT-055;Lo;0;L;;;;;N;;;;;
+18837;TANGUT COMPONENT-056;Lo;0;L;;;;;N;;;;;
+18838;TANGUT COMPONENT-057;Lo;0;L;;;;;N;;;;;
+18839;TANGUT COMPONENT-058;Lo;0;L;;;;;N;;;;;
+1883A;TANGUT COMPONENT-059;Lo;0;L;;;;;N;;;;;
+1883B;TANGUT COMPONENT-060;Lo;0;L;;;;;N;;;;;
+1883C;TANGUT COMPONENT-061;Lo;0;L;;;;;N;;;;;
+1883D;TANGUT COMPONENT-062;Lo;0;L;;;;;N;;;;;
+1883E;TANGUT COMPONENT-063;Lo;0;L;;;;;N;;;;;
+1883F;TANGUT COMPONENT-064;Lo;0;L;;;;;N;;;;;
+18840;TANGUT COMPONENT-065;Lo;0;L;;;;;N;;;;;
+18841;TANGUT COMPONENT-066;Lo;0;L;;;;;N;;;;;
+18842;TANGUT COMPONENT-067;Lo;0;L;;;;;N;;;;;
+18843;TANGUT COMPONENT-068;Lo;0;L;;;;;N;;;;;
+18844;TANGUT COMPONENT-069;Lo;0;L;;;;;N;;;;;
+18845;TANGUT COMPONENT-070;Lo;0;L;;;;;N;;;;;
+18846;TANGUT COMPONENT-071;Lo;0;L;;;;;N;;;;;
+18847;TANGUT COMPONENT-072;Lo;0;L;;;;;N;;;;;
+18848;TANGUT COMPONENT-073;Lo;0;L;;;;;N;;;;;
+18849;TANGUT COMPONENT-074;Lo;0;L;;;;;N;;;;;
+1884A;TANGUT COMPONENT-075;Lo;0;L;;;;;N;;;;;
+1884B;TANGUT COMPONENT-076;Lo;0;L;;;;;N;;;;;
+1884C;TANGUT COMPONENT-077;Lo;0;L;;;;;N;;;;;
+1884D;TANGUT COMPONENT-078;Lo;0;L;;;;;N;;;;;
+1884E;TANGUT COMPONENT-079;Lo;0;L;;;;;N;;;;;
+1884F;TANGUT COMPONENT-080;Lo;0;L;;;;;N;;;;;
+18850;TANGUT COMPONENT-081;Lo;0;L;;;;;N;;;;;
+18851;TANGUT COMPONENT-082;Lo;0;L;;;;;N;;;;;
+18852;TANGUT COMPONENT-083;Lo;0;L;;;;;N;;;;;
+18853;TANGUT COMPONENT-084;Lo;0;L;;;;;N;;;;;
+18854;TANGUT COMPONENT-085;Lo;0;L;;;;;N;;;;;
+18855;TANGUT COMPONENT-086;Lo;0;L;;;;;N;;;;;
+18856;TANGUT COMPONENT-087;Lo;0;L;;;;;N;;;;;
+18857;TANGUT COMPONENT-088;Lo;0;L;;;;;N;;;;;
+18858;TANGUT COMPONENT-089;Lo;0;L;;;;;N;;;;;
+18859;TANGUT COMPONENT-090;Lo;0;L;;;;;N;;;;;
+1885A;TANGUT COMPONENT-091;Lo;0;L;;;;;N;;;;;
+1885B;TANGUT COMPONENT-092;Lo;0;L;;;;;N;;;;;
+1885C;TANGUT COMPONENT-093;Lo;0;L;;;;;N;;;;;
+1885D;TANGUT COMPONENT-094;Lo;0;L;;;;;N;;;;;
+1885E;TANGUT COMPONENT-095;Lo;0;L;;;;;N;;;;;
+1885F;TANGUT COMPONENT-096;Lo;0;L;;;;;N;;;;;
+18860;TANGUT COMPONENT-097;Lo;0;L;;;;;N;;;;;
+18861;TANGUT COMPONENT-098;Lo;0;L;;;;;N;;;;;
+18862;TANGUT COMPONENT-099;Lo;0;L;;;;;N;;;;;
+18863;TANGUT COMPONENT-100;Lo;0;L;;;;;N;;;;;
+18864;TANGUT COMPONENT-101;Lo;0;L;;;;;N;;;;;
+18865;TANGUT COMPONENT-102;Lo;0;L;;;;;N;;;;;
+18866;TANGUT COMPONENT-103;Lo;0;L;;;;;N;;;;;
+18867;TANGUT COMPONENT-104;Lo;0;L;;;;;N;;;;;
+18868;TANGUT COMPONENT-105;Lo;0;L;;;;;N;;;;;
+18869;TANGUT COMPONENT-106;Lo;0;L;;;;;N;;;;;
+1886A;TANGUT COMPONENT-107;Lo;0;L;;;;;N;;;;;
+1886B;TANGUT COMPONENT-108;Lo;0;L;;;;;N;;;;;
+1886C;TANGUT COMPONENT-109;Lo;0;L;;;;;N;;;;;
+1886D;TANGUT COMPONENT-110;Lo;0;L;;;;;N;;;;;
+1886E;TANGUT COMPONENT-111;Lo;0;L;;;;;N;;;;;
+1886F;TANGUT COMPONENT-112;Lo;0;L;;;;;N;;;;;
+18870;TANGUT COMPONENT-113;Lo;0;L;;;;;N;;;;;
+18871;TANGUT COMPONENT-114;Lo;0;L;;;;;N;;;;;
+18872;TANGUT COMPONENT-115;Lo;0;L;;;;;N;;;;;
+18873;TANGUT COMPONENT-116;Lo;0;L;;;;;N;;;;;
+18874;TANGUT COMPONENT-117;Lo;0;L;;;;;N;;;;;
+18875;TANGUT COMPONENT-118;Lo;0;L;;;;;N;;;;;
+18876;TANGUT COMPONENT-119;Lo;0;L;;;;;N;;;;;
+18877;TANGUT COMPONENT-120;Lo;0;L;;;;;N;;;;;
+18878;TANGUT COMPONENT-121;Lo;0;L;;;;;N;;;;;
+18879;TANGUT COMPONENT-122;Lo;0;L;;;;;N;;;;;
+1887A;TANGUT COMPONENT-123;Lo;0;L;;;;;N;;;;;
+1887B;TANGUT COMPONENT-124;Lo;0;L;;;;;N;;;;;
+1887C;TANGUT COMPONENT-125;Lo;0;L;;;;;N;;;;;
+1887D;TANGUT COMPONENT-126;Lo;0;L;;;;;N;;;;;
+1887E;TANGUT COMPONENT-127;Lo;0;L;;;;;N;;;;;
+1887F;TANGUT COMPONENT-128;Lo;0;L;;;;;N;;;;;
+18880;TANGUT COMPONENT-129;Lo;0;L;;;;;N;;;;;
+18881;TANGUT COMPONENT-130;Lo;0;L;;;;;N;;;;;
+18882;TANGUT COMPONENT-131;Lo;0;L;;;;;N;;;;;
+18883;TANGUT COMPONENT-132;Lo;0;L;;;;;N;;;;;
+18884;TANGUT COMPONENT-133;Lo;0;L;;;;;N;;;;;
+18885;TANGUT COMPONENT-134;Lo;0;L;;;;;N;;;;;
+18886;TANGUT COMPONENT-135;Lo;0;L;;;;;N;;;;;
+18887;TANGUT COMPONENT-136;Lo;0;L;;;;;N;;;;;
+18888;TANGUT COMPONENT-137;Lo;0;L;;;;;N;;;;;
+18889;TANGUT COMPONENT-138;Lo;0;L;;;;;N;;;;;
+1888A;TANGUT COMPONENT-139;Lo;0;L;;;;;N;;;;;
+1888B;TANGUT COMPONENT-140;Lo;0;L;;;;;N;;;;;
+1888C;TANGUT COMPONENT-141;Lo;0;L;;;;;N;;;;;
+1888D;TANGUT COMPONENT-142;Lo;0;L;;;;;N;;;;;
+1888E;TANGUT COMPONENT-143;Lo;0;L;;;;;N;;;;;
+1888F;TANGUT COMPONENT-144;Lo;0;L;;;;;N;;;;;
+18890;TANGUT COMPONENT-145;Lo;0;L;;;;;N;;;;;
+18891;TANGUT COMPONENT-146;Lo;0;L;;;;;N;;;;;
+18892;TANGUT COMPONENT-147;Lo;0;L;;;;;N;;;;;
+18893;TANGUT COMPONENT-148;Lo;0;L;;;;;N;;;;;
+18894;TANGUT COMPONENT-149;Lo;0;L;;;;;N;;;;;
+18895;TANGUT COMPONENT-150;Lo;0;L;;;;;N;;;;;
+18896;TANGUT COMPONENT-151;Lo;0;L;;;;;N;;;;;
+18897;TANGUT COMPONENT-152;Lo;0;L;;;;;N;;;;;
+18898;TANGUT COMPONENT-153;Lo;0;L;;;;;N;;;;;
+18899;TANGUT COMPONENT-154;Lo;0;L;;;;;N;;;;;
+1889A;TANGUT COMPONENT-155;Lo;0;L;;;;;N;;;;;
+1889B;TANGUT COMPONENT-156;Lo;0;L;;;;;N;;;;;
+1889C;TANGUT COMPONENT-157;Lo;0;L;;;;;N;;;;;
+1889D;TANGUT COMPONENT-158;Lo;0;L;;;;;N;;;;;
+1889E;TANGUT COMPONENT-159;Lo;0;L;;;;;N;;;;;
+1889F;TANGUT COMPONENT-160;Lo;0;L;;;;;N;;;;;
+188A0;TANGUT COMPONENT-161;Lo;0;L;;;;;N;;;;;
+188A1;TANGUT COMPONENT-162;Lo;0;L;;;;;N;;;;;
+188A2;TANGUT COMPONENT-163;Lo;0;L;;;;;N;;;;;
+188A3;TANGUT COMPONENT-164;Lo;0;L;;;;;N;;;;;
+188A4;TANGUT COMPONENT-165;Lo;0;L;;;;;N;;;;;
+188A5;TANGUT COMPONENT-166;Lo;0;L;;;;;N;;;;;
+188A6;TANGUT COMPONENT-167;Lo;0;L;;;;;N;;;;;
+188A7;TANGUT COMPONENT-168;Lo;0;L;;;;;N;;;;;
+188A8;TANGUT COMPONENT-169;Lo;0;L;;;;;N;;;;;
+188A9;TANGUT COMPONENT-170;Lo;0;L;;;;;N;;;;;
+188AA;TANGUT COMPONENT-171;Lo;0;L;;;;;N;;;;;
+188AB;TANGUT COMPONENT-172;Lo;0;L;;;;;N;;;;;
+188AC;TANGUT COMPONENT-173;Lo;0;L;;;;;N;;;;;
+188AD;TANGUT COMPONENT-174;Lo;0;L;;;;;N;;;;;
+188AE;TANGUT COMPONENT-175;Lo;0;L;;;;;N;;;;;
+188AF;TANGUT COMPONENT-176;Lo;0;L;;;;;N;;;;;
+188B0;TANGUT COMPONENT-177;Lo;0;L;;;;;N;;;;;
+188B1;TANGUT COMPONENT-178;Lo;0;L;;;;;N;;;;;
+188B2;TANGUT COMPONENT-179;Lo;0;L;;;;;N;;;;;
+188B3;TANGUT COMPONENT-180;Lo;0;L;;;;;N;;;;;
+188B4;TANGUT COMPONENT-181;Lo;0;L;;;;;N;;;;;
+188B5;TANGUT COMPONENT-182;Lo;0;L;;;;;N;;;;;
+188B6;TANGUT COMPONENT-183;Lo;0;L;;;;;N;;;;;
+188B7;TANGUT COMPONENT-184;Lo;0;L;;;;;N;;;;;
+188B8;TANGUT COMPONENT-185;Lo;0;L;;;;;N;;;;;
+188B9;TANGUT COMPONENT-186;Lo;0;L;;;;;N;;;;;
+188BA;TANGUT COMPONENT-187;Lo;0;L;;;;;N;;;;;
+188BB;TANGUT COMPONENT-188;Lo;0;L;;;;;N;;;;;
+188BC;TANGUT COMPONENT-189;Lo;0;L;;;;;N;;;;;
+188BD;TANGUT COMPONENT-190;Lo;0;L;;;;;N;;;;;
+188BE;TANGUT COMPONENT-191;Lo;0;L;;;;;N;;;;;
+188BF;TANGUT COMPONENT-192;Lo;0;L;;;;;N;;;;;
+188C0;TANGUT COMPONENT-193;Lo;0;L;;;;;N;;;;;
+188C1;TANGUT COMPONENT-194;Lo;0;L;;;;;N;;;;;
+188C2;TANGUT COMPONENT-195;Lo;0;L;;;;;N;;;;;
+188C3;TANGUT COMPONENT-196;Lo;0;L;;;;;N;;;;;
+188C4;TANGUT COMPONENT-197;Lo;0;L;;;;;N;;;;;
+188C5;TANGUT COMPONENT-198;Lo;0;L;;;;;N;;;;;
+188C6;TANGUT COMPONENT-199;Lo;0;L;;;;;N;;;;;
+188C7;TANGUT COMPONENT-200;Lo;0;L;;;;;N;;;;;
+188C8;TANGUT COMPONENT-201;Lo;0;L;;;;;N;;;;;
+188C9;TANGUT COMPONENT-202;Lo;0;L;;;;;N;;;;;
+188CA;TANGUT COMPONENT-203;Lo;0;L;;;;;N;;;;;
+188CB;TANGUT COMPONENT-204;Lo;0;L;;;;;N;;;;;
+188CC;TANGUT COMPONENT-205;Lo;0;L;;;;;N;;;;;
+188CD;TANGUT COMPONENT-206;Lo;0;L;;;;;N;;;;;
+188CE;TANGUT COMPONENT-207;Lo;0;L;;;;;N;;;;;
+188CF;TANGUT COMPONENT-208;Lo;0;L;;;;;N;;;;;
+188D0;TANGUT COMPONENT-209;Lo;0;L;;;;;N;;;;;
+188D1;TANGUT COMPONENT-210;Lo;0;L;;;;;N;;;;;
+188D2;TANGUT COMPONENT-211;Lo;0;L;;;;;N;;;;;
+188D3;TANGUT COMPONENT-212;Lo;0;L;;;;;N;;;;;
+188D4;TANGUT COMPONENT-213;Lo;0;L;;;;;N;;;;;
+188D5;TANGUT COMPONENT-214;Lo;0;L;;;;;N;;;;;
+188D6;TANGUT COMPONENT-215;Lo;0;L;;;;;N;;;;;
+188D7;TANGUT COMPONENT-216;Lo;0;L;;;;;N;;;;;
+188D8;TANGUT COMPONENT-217;Lo;0;L;;;;;N;;;;;
+188D9;TANGUT COMPONENT-218;Lo;0;L;;;;;N;;;;;
+188DA;TANGUT COMPONENT-219;Lo;0;L;;;;;N;;;;;
+188DB;TANGUT COMPONENT-220;Lo;0;L;;;;;N;;;;;
+188DC;TANGUT COMPONENT-221;Lo;0;L;;;;;N;;;;;
+188DD;TANGUT COMPONENT-222;Lo;0;L;;;;;N;;;;;
+188DE;TANGUT COMPONENT-223;Lo;0;L;;;;;N;;;;;
+188DF;TANGUT COMPONENT-224;Lo;0;L;;;;;N;;;;;
+188E0;TANGUT COMPONENT-225;Lo;0;L;;;;;N;;;;;
+188E1;TANGUT COMPONENT-226;Lo;0;L;;;;;N;;;;;
+188E2;TANGUT COMPONENT-227;Lo;0;L;;;;;N;;;;;
+188E3;TANGUT COMPONENT-228;Lo;0;L;;;;;N;;;;;
+188E4;TANGUT COMPONENT-229;Lo;0;L;;;;;N;;;;;
+188E5;TANGUT COMPONENT-230;Lo;0;L;;;;;N;;;;;
+188E6;TANGUT COMPONENT-231;Lo;0;L;;;;;N;;;;;
+188E7;TANGUT COMPONENT-232;Lo;0;L;;;;;N;;;;;
+188E8;TANGUT COMPONENT-233;Lo;0;L;;;;;N;;;;;
+188E9;TANGUT COMPONENT-234;Lo;0;L;;;;;N;;;;;
+188EA;TANGUT COMPONENT-235;Lo;0;L;;;;;N;;;;;
+188EB;TANGUT COMPONENT-236;Lo;0;L;;;;;N;;;;;
+188EC;TANGUT COMPONENT-237;Lo;0;L;;;;;N;;;;;
+188ED;TANGUT COMPONENT-238;Lo;0;L;;;;;N;;;;;
+188EE;TANGUT COMPONENT-239;Lo;0;L;;;;;N;;;;;
+188EF;TANGUT COMPONENT-240;Lo;0;L;;;;;N;;;;;
+188F0;TANGUT COMPONENT-241;Lo;0;L;;;;;N;;;;;
+188F1;TANGUT COMPONENT-242;Lo;0;L;;;;;N;;;;;
+188F2;TANGUT COMPONENT-243;Lo;0;L;;;;;N;;;;;
+188F3;TANGUT COMPONENT-244;Lo;0;L;;;;;N;;;;;
+188F4;TANGUT COMPONENT-245;Lo;0;L;;;;;N;;;;;
+188F5;TANGUT COMPONENT-246;Lo;0;L;;;;;N;;;;;
+188F6;TANGUT COMPONENT-247;Lo;0;L;;;;;N;;;;;
+188F7;TANGUT COMPONENT-248;Lo;0;L;;;;;N;;;;;
+188F8;TANGUT COMPONENT-249;Lo;0;L;;;;;N;;;;;
+188F9;TANGUT COMPONENT-250;Lo;0;L;;;;;N;;;;;
+188FA;TANGUT COMPONENT-251;Lo;0;L;;;;;N;;;;;
+188FB;TANGUT COMPONENT-252;Lo;0;L;;;;;N;;;;;
+188FC;TANGUT COMPONENT-253;Lo;0;L;;;;;N;;;;;
+188FD;TANGUT COMPONENT-254;Lo;0;L;;;;;N;;;;;
+188FE;TANGUT COMPONENT-255;Lo;0;L;;;;;N;;;;;
+188FF;TANGUT COMPONENT-256;Lo;0;L;;;;;N;;;;;
+18900;TANGUT COMPONENT-257;Lo;0;L;;;;;N;;;;;
+18901;TANGUT COMPONENT-258;Lo;0;L;;;;;N;;;;;
+18902;TANGUT COMPONENT-259;Lo;0;L;;;;;N;;;;;
+18903;TANGUT COMPONENT-260;Lo;0;L;;;;;N;;;;;
+18904;TANGUT COMPONENT-261;Lo;0;L;;;;;N;;;;;
+18905;TANGUT COMPONENT-262;Lo;0;L;;;;;N;;;;;
+18906;TANGUT COMPONENT-263;Lo;0;L;;;;;N;;;;;
+18907;TANGUT COMPONENT-264;Lo;0;L;;;;;N;;;;;
+18908;TANGUT COMPONENT-265;Lo;0;L;;;;;N;;;;;
+18909;TANGUT COMPONENT-266;Lo;0;L;;;;;N;;;;;
+1890A;TANGUT COMPONENT-267;Lo;0;L;;;;;N;;;;;
+1890B;TANGUT COMPONENT-268;Lo;0;L;;;;;N;;;;;
+1890C;TANGUT COMPONENT-269;Lo;0;L;;;;;N;;;;;
+1890D;TANGUT COMPONENT-270;Lo;0;L;;;;;N;;;;;
+1890E;TANGUT COMPONENT-271;Lo;0;L;;;;;N;;;;;
+1890F;TANGUT COMPONENT-272;Lo;0;L;;;;;N;;;;;
+18910;TANGUT COMPONENT-273;Lo;0;L;;;;;N;;;;;
+18911;TANGUT COMPONENT-274;Lo;0;L;;;;;N;;;;;
+18912;TANGUT COMPONENT-275;Lo;0;L;;;;;N;;;;;
+18913;TANGUT COMPONENT-276;Lo;0;L;;;;;N;;;;;
+18914;TANGUT COMPONENT-277;Lo;0;L;;;;;N;;;;;
+18915;TANGUT COMPONENT-278;Lo;0;L;;;;;N;;;;;
+18916;TANGUT COMPONENT-279;Lo;0;L;;;;;N;;;;;
+18917;TANGUT COMPONENT-280;Lo;0;L;;;;;N;;;;;
+18918;TANGUT COMPONENT-281;Lo;0;L;;;;;N;;;;;
+18919;TANGUT COMPONENT-282;Lo;0;L;;;;;N;;;;;
+1891A;TANGUT COMPONENT-283;Lo;0;L;;;;;N;;;;;
+1891B;TANGUT COMPONENT-284;Lo;0;L;;;;;N;;;;;
+1891C;TANGUT COMPONENT-285;Lo;0;L;;;;;N;;;;;
+1891D;TANGUT COMPONENT-286;Lo;0;L;;;;;N;;;;;
+1891E;TANGUT COMPONENT-287;Lo;0;L;;;;;N;;;;;
+1891F;TANGUT COMPONENT-288;Lo;0;L;;;;;N;;;;;
+18920;TANGUT COMPONENT-289;Lo;0;L;;;;;N;;;;;
+18921;TANGUT COMPONENT-290;Lo;0;L;;;;;N;;;;;
+18922;TANGUT COMPONENT-291;Lo;0;L;;;;;N;;;;;
+18923;TANGUT COMPONENT-292;Lo;0;L;;;;;N;;;;;
+18924;TANGUT COMPONENT-293;Lo;0;L;;;;;N;;;;;
+18925;TANGUT COMPONENT-294;Lo;0;L;;;;;N;;;;;
+18926;TANGUT COMPONENT-295;Lo;0;L;;;;;N;;;;;
+18927;TANGUT COMPONENT-296;Lo;0;L;;;;;N;;;;;
+18928;TANGUT COMPONENT-297;Lo;0;L;;;;;N;;;;;
+18929;TANGUT COMPONENT-298;Lo;0;L;;;;;N;;;;;
+1892A;TANGUT COMPONENT-299;Lo;0;L;;;;;N;;;;;
+1892B;TANGUT COMPONENT-300;Lo;0;L;;;;;N;;;;;
+1892C;TANGUT COMPONENT-301;Lo;0;L;;;;;N;;;;;
+1892D;TANGUT COMPONENT-302;Lo;0;L;;;;;N;;;;;
+1892E;TANGUT COMPONENT-303;Lo;0;L;;;;;N;;;;;
+1892F;TANGUT COMPONENT-304;Lo;0;L;;;;;N;;;;;
+18930;TANGUT COMPONENT-305;Lo;0;L;;;;;N;;;;;
+18931;TANGUT COMPONENT-306;Lo;0;L;;;;;N;;;;;
+18932;TANGUT COMPONENT-307;Lo;0;L;;;;;N;;;;;
+18933;TANGUT COMPONENT-308;Lo;0;L;;;;;N;;;;;
+18934;TANGUT COMPONENT-309;Lo;0;L;;;;;N;;;;;
+18935;TANGUT COMPONENT-310;Lo;0;L;;;;;N;;;;;
+18936;TANGUT COMPONENT-311;Lo;0;L;;;;;N;;;;;
+18937;TANGUT COMPONENT-312;Lo;0;L;;;;;N;;;;;
+18938;TANGUT COMPONENT-313;Lo;0;L;;;;;N;;;;;
+18939;TANGUT COMPONENT-314;Lo;0;L;;;;;N;;;;;
+1893A;TANGUT COMPONENT-315;Lo;0;L;;;;;N;;;;;
+1893B;TANGUT COMPONENT-316;Lo;0;L;;;;;N;;;;;
+1893C;TANGUT COMPONENT-317;Lo;0;L;;;;;N;;;;;
+1893D;TANGUT COMPONENT-318;Lo;0;L;;;;;N;;;;;
+1893E;TANGUT COMPONENT-319;Lo;0;L;;;;;N;;;;;
+1893F;TANGUT COMPONENT-320;Lo;0;L;;;;;N;;;;;
+18940;TANGUT COMPONENT-321;Lo;0;L;;;;;N;;;;;
+18941;TANGUT COMPONENT-322;Lo;0;L;;;;;N;;;;;
+18942;TANGUT COMPONENT-323;Lo;0;L;;;;;N;;;;;
+18943;TANGUT COMPONENT-324;Lo;0;L;;;;;N;;;;;
+18944;TANGUT COMPONENT-325;Lo;0;L;;;;;N;;;;;
+18945;TANGUT COMPONENT-326;Lo;0;L;;;;;N;;;;;
+18946;TANGUT COMPONENT-327;Lo;0;L;;;;;N;;;;;
+18947;TANGUT COMPONENT-328;Lo;0;L;;;;;N;;;;;
+18948;TANGUT COMPONENT-329;Lo;0;L;;;;;N;;;;;
+18949;TANGUT COMPONENT-330;Lo;0;L;;;;;N;;;;;
+1894A;TANGUT COMPONENT-331;Lo;0;L;;;;;N;;;;;
+1894B;TANGUT COMPONENT-332;Lo;0;L;;;;;N;;;;;
+1894C;TANGUT COMPONENT-333;Lo;0;L;;;;;N;;;;;
+1894D;TANGUT COMPONENT-334;Lo;0;L;;;;;N;;;;;
+1894E;TANGUT COMPONENT-335;Lo;0;L;;;;;N;;;;;
+1894F;TANGUT COMPONENT-336;Lo;0;L;;;;;N;;;;;
+18950;TANGUT COMPONENT-337;Lo;0;L;;;;;N;;;;;
+18951;TANGUT COMPONENT-338;Lo;0;L;;;;;N;;;;;
+18952;TANGUT COMPONENT-339;Lo;0;L;;;;;N;;;;;
+18953;TANGUT COMPONENT-340;Lo;0;L;;;;;N;;;;;
+18954;TANGUT COMPONENT-341;Lo;0;L;;;;;N;;;;;
+18955;TANGUT COMPONENT-342;Lo;0;L;;;;;N;;;;;
+18956;TANGUT COMPONENT-343;Lo;0;L;;;;;N;;;;;
+18957;TANGUT COMPONENT-344;Lo;0;L;;;;;N;;;;;
+18958;TANGUT COMPONENT-345;Lo;0;L;;;;;N;;;;;
+18959;TANGUT COMPONENT-346;Lo;0;L;;;;;N;;;;;
+1895A;TANGUT COMPONENT-347;Lo;0;L;;;;;N;;;;;
+1895B;TANGUT COMPONENT-348;Lo;0;L;;;;;N;;;;;
+1895C;TANGUT COMPONENT-349;Lo;0;L;;;;;N;;;;;
+1895D;TANGUT COMPONENT-350;Lo;0;L;;;;;N;;;;;
+1895E;TANGUT COMPONENT-351;Lo;0;L;;;;;N;;;;;
+1895F;TANGUT COMPONENT-352;Lo;0;L;;;;;N;;;;;
+18960;TANGUT COMPONENT-353;Lo;0;L;;;;;N;;;;;
+18961;TANGUT COMPONENT-354;Lo;0;L;;;;;N;;;;;
+18962;TANGUT COMPONENT-355;Lo;0;L;;;;;N;;;;;
+18963;TANGUT COMPONENT-356;Lo;0;L;;;;;N;;;;;
+18964;TANGUT COMPONENT-357;Lo;0;L;;;;;N;;;;;
+18965;TANGUT COMPONENT-358;Lo;0;L;;;;;N;;;;;
+18966;TANGUT COMPONENT-359;Lo;0;L;;;;;N;;;;;
+18967;TANGUT COMPONENT-360;Lo;0;L;;;;;N;;;;;
+18968;TANGUT COMPONENT-361;Lo;0;L;;;;;N;;;;;
+18969;TANGUT COMPONENT-362;Lo;0;L;;;;;N;;;;;
+1896A;TANGUT COMPONENT-363;Lo;0;L;;;;;N;;;;;
+1896B;TANGUT COMPONENT-364;Lo;0;L;;;;;N;;;;;
+1896C;TANGUT COMPONENT-365;Lo;0;L;;;;;N;;;;;
+1896D;TANGUT COMPONENT-366;Lo;0;L;;;;;N;;;;;
+1896E;TANGUT COMPONENT-367;Lo;0;L;;;;;N;;;;;
+1896F;TANGUT COMPONENT-368;Lo;0;L;;;;;N;;;;;
+18970;TANGUT COMPONENT-369;Lo;0;L;;;;;N;;;;;
+18971;TANGUT COMPONENT-370;Lo;0;L;;;;;N;;;;;
+18972;TANGUT COMPONENT-371;Lo;0;L;;;;;N;;;;;
+18973;TANGUT COMPONENT-372;Lo;0;L;;;;;N;;;;;
+18974;TANGUT COMPONENT-373;Lo;0;L;;;;;N;;;;;
+18975;TANGUT COMPONENT-374;Lo;0;L;;;;;N;;;;;
+18976;TANGUT COMPONENT-375;Lo;0;L;;;;;N;;;;;
+18977;TANGUT COMPONENT-376;Lo;0;L;;;;;N;;;;;
+18978;TANGUT COMPONENT-377;Lo;0;L;;;;;N;;;;;
+18979;TANGUT COMPONENT-378;Lo;0;L;;;;;N;;;;;
+1897A;TANGUT COMPONENT-379;Lo;0;L;;;;;N;;;;;
+1897B;TANGUT COMPONENT-380;Lo;0;L;;;;;N;;;;;
+1897C;TANGUT COMPONENT-381;Lo;0;L;;;;;N;;;;;
+1897D;TANGUT COMPONENT-382;Lo;0;L;;;;;N;;;;;
+1897E;TANGUT COMPONENT-383;Lo;0;L;;;;;N;;;;;
+1897F;TANGUT COMPONENT-384;Lo;0;L;;;;;N;;;;;
+18980;TANGUT COMPONENT-385;Lo;0;L;;;;;N;;;;;
+18981;TANGUT COMPONENT-386;Lo;0;L;;;;;N;;;;;
+18982;TANGUT COMPONENT-387;Lo;0;L;;;;;N;;;;;
+18983;TANGUT COMPONENT-388;Lo;0;L;;;;;N;;;;;
+18984;TANGUT COMPONENT-389;Lo;0;L;;;;;N;;;;;
+18985;TANGUT COMPONENT-390;Lo;0;L;;;;;N;;;;;
+18986;TANGUT COMPONENT-391;Lo;0;L;;;;;N;;;;;
+18987;TANGUT COMPONENT-392;Lo;0;L;;;;;N;;;;;
+18988;TANGUT COMPONENT-393;Lo;0;L;;;;;N;;;;;
+18989;TANGUT COMPONENT-394;Lo;0;L;;;;;N;;;;;
+1898A;TANGUT COMPONENT-395;Lo;0;L;;;;;N;;;;;
+1898B;TANGUT COMPONENT-396;Lo;0;L;;;;;N;;;;;
+1898C;TANGUT COMPONENT-397;Lo;0;L;;;;;N;;;;;
+1898D;TANGUT COMPONENT-398;Lo;0;L;;;;;N;;;;;
+1898E;TANGUT COMPONENT-399;Lo;0;L;;;;;N;;;;;
+1898F;TANGUT COMPONENT-400;Lo;0;L;;;;;N;;;;;
+18990;TANGUT COMPONENT-401;Lo;0;L;;;;;N;;;;;
+18991;TANGUT COMPONENT-402;Lo;0;L;;;;;N;;;;;
+18992;TANGUT COMPONENT-403;Lo;0;L;;;;;N;;;;;
+18993;TANGUT COMPONENT-404;Lo;0;L;;;;;N;;;;;
+18994;TANGUT COMPONENT-405;Lo;0;L;;;;;N;;;;;
+18995;TANGUT COMPONENT-406;Lo;0;L;;;;;N;;;;;
+18996;TANGUT COMPONENT-407;Lo;0;L;;;;;N;;;;;
+18997;TANGUT COMPONENT-408;Lo;0;L;;;;;N;;;;;
+18998;TANGUT COMPONENT-409;Lo;0;L;;;;;N;;;;;
+18999;TANGUT COMPONENT-410;Lo;0;L;;;;;N;;;;;
+1899A;TANGUT COMPONENT-411;Lo;0;L;;;;;N;;;;;
+1899B;TANGUT COMPONENT-412;Lo;0;L;;;;;N;;;;;
+1899C;TANGUT COMPONENT-413;Lo;0;L;;;;;N;;;;;
+1899D;TANGUT COMPONENT-414;Lo;0;L;;;;;N;;;;;
+1899E;TANGUT COMPONENT-415;Lo;0;L;;;;;N;;;;;
+1899F;TANGUT COMPONENT-416;Lo;0;L;;;;;N;;;;;
+189A0;TANGUT COMPONENT-417;Lo;0;L;;;;;N;;;;;
+189A1;TANGUT COMPONENT-418;Lo;0;L;;;;;N;;;;;
+189A2;TANGUT COMPONENT-419;Lo;0;L;;;;;N;;;;;
+189A3;TANGUT COMPONENT-420;Lo;0;L;;;;;N;;;;;
+189A4;TANGUT COMPONENT-421;Lo;0;L;;;;;N;;;;;
+189A5;TANGUT COMPONENT-422;Lo;0;L;;;;;N;;;;;
+189A6;TANGUT COMPONENT-423;Lo;0;L;;;;;N;;;;;
+189A7;TANGUT COMPONENT-424;Lo;0;L;;;;;N;;;;;
+189A8;TANGUT COMPONENT-425;Lo;0;L;;;;;N;;;;;
+189A9;TANGUT COMPONENT-426;Lo;0;L;;;;;N;;;;;
+189AA;TANGUT COMPONENT-427;Lo;0;L;;;;;N;;;;;
+189AB;TANGUT COMPONENT-428;Lo;0;L;;;;;N;;;;;
+189AC;TANGUT COMPONENT-429;Lo;0;L;;;;;N;;;;;
+189AD;TANGUT COMPONENT-430;Lo;0;L;;;;;N;;;;;
+189AE;TANGUT COMPONENT-431;Lo;0;L;;;;;N;;;;;
+189AF;TANGUT COMPONENT-432;Lo;0;L;;;;;N;;;;;
+189B0;TANGUT COMPONENT-433;Lo;0;L;;;;;N;;;;;
+189B1;TANGUT COMPONENT-434;Lo;0;L;;;;;N;;;;;
+189B2;TANGUT COMPONENT-435;Lo;0;L;;;;;N;;;;;
+189B3;TANGUT COMPONENT-436;Lo;0;L;;;;;N;;;;;
+189B4;TANGUT COMPONENT-437;Lo;0;L;;;;;N;;;;;
+189B5;TANGUT COMPONENT-438;Lo;0;L;;;;;N;;;;;
+189B6;TANGUT COMPONENT-439;Lo;0;L;;;;;N;;;;;
+189B7;TANGUT COMPONENT-440;Lo;0;L;;;;;N;;;;;
+189B8;TANGUT COMPONENT-441;Lo;0;L;;;;;N;;;;;
+189B9;TANGUT COMPONENT-442;Lo;0;L;;;;;N;;;;;
+189BA;TANGUT COMPONENT-443;Lo;0;L;;;;;N;;;;;
+189BB;TANGUT COMPONENT-444;Lo;0;L;;;;;N;;;;;
+189BC;TANGUT COMPONENT-445;Lo;0;L;;;;;N;;;;;
+189BD;TANGUT COMPONENT-446;Lo;0;L;;;;;N;;;;;
+189BE;TANGUT COMPONENT-447;Lo;0;L;;;;;N;;;;;
+189BF;TANGUT COMPONENT-448;Lo;0;L;;;;;N;;;;;
+189C0;TANGUT COMPONENT-449;Lo;0;L;;;;;N;;;;;
+189C1;TANGUT COMPONENT-450;Lo;0;L;;;;;N;;;;;
+189C2;TANGUT COMPONENT-451;Lo;0;L;;;;;N;;;;;
+189C3;TANGUT COMPONENT-452;Lo;0;L;;;;;N;;;;;
+189C4;TANGUT COMPONENT-453;Lo;0;L;;;;;N;;;;;
+189C5;TANGUT COMPONENT-454;Lo;0;L;;;;;N;;;;;
+189C6;TANGUT COMPONENT-455;Lo;0;L;;;;;N;;;;;
+189C7;TANGUT COMPONENT-456;Lo;0;L;;;;;N;;;;;
+189C8;TANGUT COMPONENT-457;Lo;0;L;;;;;N;;;;;
+189C9;TANGUT COMPONENT-458;Lo;0;L;;;;;N;;;;;
+189CA;TANGUT COMPONENT-459;Lo;0;L;;;;;N;;;;;
+189CB;TANGUT COMPONENT-460;Lo;0;L;;;;;N;;;;;
+189CC;TANGUT COMPONENT-461;Lo;0;L;;;;;N;;;;;
+189CD;TANGUT COMPONENT-462;Lo;0;L;;;;;N;;;;;
+189CE;TANGUT COMPONENT-463;Lo;0;L;;;;;N;;;;;
+189CF;TANGUT COMPONENT-464;Lo;0;L;;;;;N;;;;;
+189D0;TANGUT COMPONENT-465;Lo;0;L;;;;;N;;;;;
+189D1;TANGUT COMPONENT-466;Lo;0;L;;;;;N;;;;;
+189D2;TANGUT COMPONENT-467;Lo;0;L;;;;;N;;;;;
+189D3;TANGUT COMPONENT-468;Lo;0;L;;;;;N;;;;;
+189D4;TANGUT COMPONENT-469;Lo;0;L;;;;;N;;;;;
+189D5;TANGUT COMPONENT-470;Lo;0;L;;;;;N;;;;;
+189D6;TANGUT COMPONENT-471;Lo;0;L;;;;;N;;;;;
+189D7;TANGUT COMPONENT-472;Lo;0;L;;;;;N;;;;;
+189D8;TANGUT COMPONENT-473;Lo;0;L;;;;;N;;;;;
+189D9;TANGUT COMPONENT-474;Lo;0;L;;;;;N;;;;;
+189DA;TANGUT COMPONENT-475;Lo;0;L;;;;;N;;;;;
+189DB;TANGUT COMPONENT-476;Lo;0;L;;;;;N;;;;;
+189DC;TANGUT COMPONENT-477;Lo;0;L;;;;;N;;;;;
+189DD;TANGUT COMPONENT-478;Lo;0;L;;;;;N;;;;;
+189DE;TANGUT COMPONENT-479;Lo;0;L;;;;;N;;;;;
+189DF;TANGUT COMPONENT-480;Lo;0;L;;;;;N;;;;;
+189E0;TANGUT COMPONENT-481;Lo;0;L;;;;;N;;;;;
+189E1;TANGUT COMPONENT-482;Lo;0;L;;;;;N;;;;;
+189E2;TANGUT COMPONENT-483;Lo;0;L;;;;;N;;;;;
+189E3;TANGUT COMPONENT-484;Lo;0;L;;;;;N;;;;;
+189E4;TANGUT COMPONENT-485;Lo;0;L;;;;;N;;;;;
+189E5;TANGUT COMPONENT-486;Lo;0;L;;;;;N;;;;;
+189E6;TANGUT COMPONENT-487;Lo;0;L;;;;;N;;;;;
+189E7;TANGUT COMPONENT-488;Lo;0;L;;;;;N;;;;;
+189E8;TANGUT COMPONENT-489;Lo;0;L;;;;;N;;;;;
+189E9;TANGUT COMPONENT-490;Lo;0;L;;;;;N;;;;;
+189EA;TANGUT COMPONENT-491;Lo;0;L;;;;;N;;;;;
+189EB;TANGUT COMPONENT-492;Lo;0;L;;;;;N;;;;;
+189EC;TANGUT COMPONENT-493;Lo;0;L;;;;;N;;;;;
+189ED;TANGUT COMPONENT-494;Lo;0;L;;;;;N;;;;;
+189EE;TANGUT COMPONENT-495;Lo;0;L;;;;;N;;;;;
+189EF;TANGUT COMPONENT-496;Lo;0;L;;;;;N;;;;;
+189F0;TANGUT COMPONENT-497;Lo;0;L;;;;;N;;;;;
+189F1;TANGUT COMPONENT-498;Lo;0;L;;;;;N;;;;;
+189F2;TANGUT COMPONENT-499;Lo;0;L;;;;;N;;;;;
+189F3;TANGUT COMPONENT-500;Lo;0;L;;;;;N;;;;;
+189F4;TANGUT COMPONENT-501;Lo;0;L;;;;;N;;;;;
+189F5;TANGUT COMPONENT-502;Lo;0;L;;;;;N;;;;;
+189F6;TANGUT COMPONENT-503;Lo;0;L;;;;;N;;;;;
+189F7;TANGUT COMPONENT-504;Lo;0;L;;;;;N;;;;;
+189F8;TANGUT COMPONENT-505;Lo;0;L;;;;;N;;;;;
+189F9;TANGUT COMPONENT-506;Lo;0;L;;;;;N;;;;;
+189FA;TANGUT COMPONENT-507;Lo;0;L;;;;;N;;;;;
+189FB;TANGUT COMPONENT-508;Lo;0;L;;;;;N;;;;;
+189FC;TANGUT COMPONENT-509;Lo;0;L;;;;;N;;;;;
+189FD;TANGUT COMPONENT-510;Lo;0;L;;;;;N;;;;;
+189FE;TANGUT COMPONENT-511;Lo;0;L;;;;;N;;;;;
+189FF;TANGUT COMPONENT-512;Lo;0;L;;;;;N;;;;;
+18A00;TANGUT COMPONENT-513;Lo;0;L;;;;;N;;;;;
+18A01;TANGUT COMPONENT-514;Lo;0;L;;;;;N;;;;;
+18A02;TANGUT COMPONENT-515;Lo;0;L;;;;;N;;;;;
+18A03;TANGUT COMPONENT-516;Lo;0;L;;;;;N;;;;;
+18A04;TANGUT COMPONENT-517;Lo;0;L;;;;;N;;;;;
+18A05;TANGUT COMPONENT-518;Lo;0;L;;;;;N;;;;;
+18A06;TANGUT COMPONENT-519;Lo;0;L;;;;;N;;;;;
+18A07;TANGUT COMPONENT-520;Lo;0;L;;;;;N;;;;;
+18A08;TANGUT COMPONENT-521;Lo;0;L;;;;;N;;;;;
+18A09;TANGUT COMPONENT-522;Lo;0;L;;;;;N;;;;;
+18A0A;TANGUT COMPONENT-523;Lo;0;L;;;;;N;;;;;
+18A0B;TANGUT COMPONENT-524;Lo;0;L;;;;;N;;;;;
+18A0C;TANGUT COMPONENT-525;Lo;0;L;;;;;N;;;;;
+18A0D;TANGUT COMPONENT-526;Lo;0;L;;;;;N;;;;;
+18A0E;TANGUT COMPONENT-527;Lo;0;L;;;;;N;;;;;
+18A0F;TANGUT COMPONENT-528;Lo;0;L;;;;;N;;;;;
+18A10;TANGUT COMPONENT-529;Lo;0;L;;;;;N;;;;;
+18A11;TANGUT COMPONENT-530;Lo;0;L;;;;;N;;;;;
+18A12;TANGUT COMPONENT-531;Lo;0;L;;;;;N;;;;;
+18A13;TANGUT COMPONENT-532;Lo;0;L;;;;;N;;;;;
+18A14;TANGUT COMPONENT-533;Lo;0;L;;;;;N;;;;;
+18A15;TANGUT COMPONENT-534;Lo;0;L;;;;;N;;;;;
+18A16;TANGUT COMPONENT-535;Lo;0;L;;;;;N;;;;;
+18A17;TANGUT COMPONENT-536;Lo;0;L;;;;;N;;;;;
+18A18;TANGUT COMPONENT-537;Lo;0;L;;;;;N;;;;;
+18A19;TANGUT COMPONENT-538;Lo;0;L;;;;;N;;;;;
+18A1A;TANGUT COMPONENT-539;Lo;0;L;;;;;N;;;;;
+18A1B;TANGUT COMPONENT-540;Lo;0;L;;;;;N;;;;;
+18A1C;TANGUT COMPONENT-541;Lo;0;L;;;;;N;;;;;
+18A1D;TANGUT COMPONENT-542;Lo;0;L;;;;;N;;;;;
+18A1E;TANGUT COMPONENT-543;Lo;0;L;;;;;N;;;;;
+18A1F;TANGUT COMPONENT-544;Lo;0;L;;;;;N;;;;;
+18A20;TANGUT COMPONENT-545;Lo;0;L;;;;;N;;;;;
+18A21;TANGUT COMPONENT-546;Lo;0;L;;;;;N;;;;;
+18A22;TANGUT COMPONENT-547;Lo;0;L;;;;;N;;;;;
+18A23;TANGUT COMPONENT-548;Lo;0;L;;;;;N;;;;;
+18A24;TANGUT COMPONENT-549;Lo;0;L;;;;;N;;;;;
+18A25;TANGUT COMPONENT-550;Lo;0;L;;;;;N;;;;;
+18A26;TANGUT COMPONENT-551;Lo;0;L;;;;;N;;;;;
+18A27;TANGUT COMPONENT-552;Lo;0;L;;;;;N;;;;;
+18A28;TANGUT COMPONENT-553;Lo;0;L;;;;;N;;;;;
+18A29;TANGUT COMPONENT-554;Lo;0;L;;;;;N;;;;;
+18A2A;TANGUT COMPONENT-555;Lo;0;L;;;;;N;;;;;
+18A2B;TANGUT COMPONENT-556;Lo;0;L;;;;;N;;;;;
+18A2C;TANGUT COMPONENT-557;Lo;0;L;;;;;N;;;;;
+18A2D;TANGUT COMPONENT-558;Lo;0;L;;;;;N;;;;;
+18A2E;TANGUT COMPONENT-559;Lo;0;L;;;;;N;;;;;
+18A2F;TANGUT COMPONENT-560;Lo;0;L;;;;;N;;;;;
+18A30;TANGUT COMPONENT-561;Lo;0;L;;;;;N;;;;;
+18A31;TANGUT COMPONENT-562;Lo;0;L;;;;;N;;;;;
+18A32;TANGUT COMPONENT-563;Lo;0;L;;;;;N;;;;;
+18A33;TANGUT COMPONENT-564;Lo;0;L;;;;;N;;;;;
+18A34;TANGUT COMPONENT-565;Lo;0;L;;;;;N;;;;;
+18A35;TANGUT COMPONENT-566;Lo;0;L;;;;;N;;;;;
+18A36;TANGUT COMPONENT-567;Lo;0;L;;;;;N;;;;;
+18A37;TANGUT COMPONENT-568;Lo;0;L;;;;;N;;;;;
+18A38;TANGUT COMPONENT-569;Lo;0;L;;;;;N;;;;;
+18A39;TANGUT COMPONENT-570;Lo;0;L;;;;;N;;;;;
+18A3A;TANGUT COMPONENT-571;Lo;0;L;;;;;N;;;;;
+18A3B;TANGUT COMPONENT-572;Lo;0;L;;;;;N;;;;;
+18A3C;TANGUT COMPONENT-573;Lo;0;L;;;;;N;;;;;
+18A3D;TANGUT COMPONENT-574;Lo;0;L;;;;;N;;;;;
+18A3E;TANGUT COMPONENT-575;Lo;0;L;;;;;N;;;;;
+18A3F;TANGUT COMPONENT-576;Lo;0;L;;;;;N;;;;;
+18A40;TANGUT COMPONENT-577;Lo;0;L;;;;;N;;;;;
+18A41;TANGUT COMPONENT-578;Lo;0;L;;;;;N;;;;;
+18A42;TANGUT COMPONENT-579;Lo;0;L;;;;;N;;;;;
+18A43;TANGUT COMPONENT-580;Lo;0;L;;;;;N;;;;;
+18A44;TANGUT COMPONENT-581;Lo;0;L;;;;;N;;;;;
+18A45;TANGUT COMPONENT-582;Lo;0;L;;;;;N;;;;;
+18A46;TANGUT COMPONENT-583;Lo;0;L;;;;;N;;;;;
+18A47;TANGUT COMPONENT-584;Lo;0;L;;;;;N;;;;;
+18A48;TANGUT COMPONENT-585;Lo;0;L;;;;;N;;;;;
+18A49;TANGUT COMPONENT-586;Lo;0;L;;;;;N;;;;;
+18A4A;TANGUT COMPONENT-587;Lo;0;L;;;;;N;;;;;
+18A4B;TANGUT COMPONENT-588;Lo;0;L;;;;;N;;;;;
+18A4C;TANGUT COMPONENT-589;Lo;0;L;;;;;N;;;;;
+18A4D;TANGUT COMPONENT-590;Lo;0;L;;;;;N;;;;;
+18A4E;TANGUT COMPONENT-591;Lo;0;L;;;;;N;;;;;
+18A4F;TANGUT COMPONENT-592;Lo;0;L;;;;;N;;;;;
+18A50;TANGUT COMPONENT-593;Lo;0;L;;;;;N;;;;;
+18A51;TANGUT COMPONENT-594;Lo;0;L;;;;;N;;;;;
+18A52;TANGUT COMPONENT-595;Lo;0;L;;;;;N;;;;;
+18A53;TANGUT COMPONENT-596;Lo;0;L;;;;;N;;;;;
+18A54;TANGUT COMPONENT-597;Lo;0;L;;;;;N;;;;;
+18A55;TANGUT COMPONENT-598;Lo;0;L;;;;;N;;;;;
+18A56;TANGUT COMPONENT-599;Lo;0;L;;;;;N;;;;;
+18A57;TANGUT COMPONENT-600;Lo;0;L;;;;;N;;;;;
+18A58;TANGUT COMPONENT-601;Lo;0;L;;;;;N;;;;;
+18A59;TANGUT COMPONENT-602;Lo;0;L;;;;;N;;;;;
+18A5A;TANGUT COMPONENT-603;Lo;0;L;;;;;N;;;;;
+18A5B;TANGUT COMPONENT-604;Lo;0;L;;;;;N;;;;;
+18A5C;TANGUT COMPONENT-605;Lo;0;L;;;;;N;;;;;
+18A5D;TANGUT COMPONENT-606;Lo;0;L;;;;;N;;;;;
+18A5E;TANGUT COMPONENT-607;Lo;0;L;;;;;N;;;;;
+18A5F;TANGUT COMPONENT-608;Lo;0;L;;;;;N;;;;;
+18A60;TANGUT COMPONENT-609;Lo;0;L;;;;;N;;;;;
+18A61;TANGUT COMPONENT-610;Lo;0;L;;;;;N;;;;;
+18A62;TANGUT COMPONENT-611;Lo;0;L;;;;;N;;;;;
+18A63;TANGUT COMPONENT-612;Lo;0;L;;;;;N;;;;;
+18A64;TANGUT COMPONENT-613;Lo;0;L;;;;;N;;;;;
+18A65;TANGUT COMPONENT-614;Lo;0;L;;;;;N;;;;;
+18A66;TANGUT COMPONENT-615;Lo;0;L;;;;;N;;;;;
+18A67;TANGUT COMPONENT-616;Lo;0;L;;;;;N;;;;;
+18A68;TANGUT COMPONENT-617;Lo;0;L;;;;;N;;;;;
+18A69;TANGUT COMPONENT-618;Lo;0;L;;;;;N;;;;;
+18A6A;TANGUT COMPONENT-619;Lo;0;L;;;;;N;;;;;
+18A6B;TANGUT COMPONENT-620;Lo;0;L;;;;;N;;;;;
+18A6C;TANGUT COMPONENT-621;Lo;0;L;;;;;N;;;;;
+18A6D;TANGUT COMPONENT-622;Lo;0;L;;;;;N;;;;;
+18A6E;TANGUT COMPONENT-623;Lo;0;L;;;;;N;;;;;
+18A6F;TANGUT COMPONENT-624;Lo;0;L;;;;;N;;;;;
+18A70;TANGUT COMPONENT-625;Lo;0;L;;;;;N;;;;;
+18A71;TANGUT COMPONENT-626;Lo;0;L;;;;;N;;;;;
+18A72;TANGUT COMPONENT-627;Lo;0;L;;;;;N;;;;;
+18A73;TANGUT COMPONENT-628;Lo;0;L;;;;;N;;;;;
+18A74;TANGUT COMPONENT-629;Lo;0;L;;;;;N;;;;;
+18A75;TANGUT COMPONENT-630;Lo;0;L;;;;;N;;;;;
+18A76;TANGUT COMPONENT-631;Lo;0;L;;;;;N;;;;;
+18A77;TANGUT COMPONENT-632;Lo;0;L;;;;;N;;;;;
+18A78;TANGUT COMPONENT-633;Lo;0;L;;;;;N;;;;;
+18A79;TANGUT COMPONENT-634;Lo;0;L;;;;;N;;;;;
+18A7A;TANGUT COMPONENT-635;Lo;0;L;;;;;N;;;;;
+18A7B;TANGUT COMPONENT-636;Lo;0;L;;;;;N;;;;;
+18A7C;TANGUT COMPONENT-637;Lo;0;L;;;;;N;;;;;
+18A7D;TANGUT COMPONENT-638;Lo;0;L;;;;;N;;;;;
+18A7E;TANGUT COMPONENT-639;Lo;0;L;;;;;N;;;;;
+18A7F;TANGUT COMPONENT-640;Lo;0;L;;;;;N;;;;;
+18A80;TANGUT COMPONENT-641;Lo;0;L;;;;;N;;;;;
+18A81;TANGUT COMPONENT-642;Lo;0;L;;;;;N;;;;;
+18A82;TANGUT COMPONENT-643;Lo;0;L;;;;;N;;;;;
+18A83;TANGUT COMPONENT-644;Lo;0;L;;;;;N;;;;;
+18A84;TANGUT COMPONENT-645;Lo;0;L;;;;;N;;;;;
+18A85;TANGUT COMPONENT-646;Lo;0;L;;;;;N;;;;;
+18A86;TANGUT COMPONENT-647;Lo;0;L;;;;;N;;;;;
+18A87;TANGUT COMPONENT-648;Lo;0;L;;;;;N;;;;;
+18A88;TANGUT COMPONENT-649;Lo;0;L;;;;;N;;;;;
+18A89;TANGUT COMPONENT-650;Lo;0;L;;;;;N;;;;;
+18A8A;TANGUT COMPONENT-651;Lo;0;L;;;;;N;;;;;
+18A8B;TANGUT COMPONENT-652;Lo;0;L;;;;;N;;;;;
+18A8C;TANGUT COMPONENT-653;Lo;0;L;;;;;N;;;;;
+18A8D;TANGUT COMPONENT-654;Lo;0;L;;;;;N;;;;;
+18A8E;TANGUT COMPONENT-655;Lo;0;L;;;;;N;;;;;
+18A8F;TANGUT COMPONENT-656;Lo;0;L;;;;;N;;;;;
+18A90;TANGUT COMPONENT-657;Lo;0;L;;;;;N;;;;;
+18A91;TANGUT COMPONENT-658;Lo;0;L;;;;;N;;;;;
+18A92;TANGUT COMPONENT-659;Lo;0;L;;;;;N;;;;;
+18A93;TANGUT COMPONENT-660;Lo;0;L;;;;;N;;;;;
+18A94;TANGUT COMPONENT-661;Lo;0;L;;;;;N;;;;;
+18A95;TANGUT COMPONENT-662;Lo;0;L;;;;;N;;;;;
+18A96;TANGUT COMPONENT-663;Lo;0;L;;;;;N;;;;;
+18A97;TANGUT COMPONENT-664;Lo;0;L;;;;;N;;;;;
+18A98;TANGUT COMPONENT-665;Lo;0;L;;;;;N;;;;;
+18A99;TANGUT COMPONENT-666;Lo;0;L;;;;;N;;;;;
+18A9A;TANGUT COMPONENT-667;Lo;0;L;;;;;N;;;;;
+18A9B;TANGUT COMPONENT-668;Lo;0;L;;;;;N;;;;;
+18A9C;TANGUT COMPONENT-669;Lo;0;L;;;;;N;;;;;
+18A9D;TANGUT COMPONENT-670;Lo;0;L;;;;;N;;;;;
+18A9E;TANGUT COMPONENT-671;Lo;0;L;;;;;N;;;;;
+18A9F;TANGUT COMPONENT-672;Lo;0;L;;;;;N;;;;;
+18AA0;TANGUT COMPONENT-673;Lo;0;L;;;;;N;;;;;
+18AA1;TANGUT COMPONENT-674;Lo;0;L;;;;;N;;;;;
+18AA2;TANGUT COMPONENT-675;Lo;0;L;;;;;N;;;;;
+18AA3;TANGUT COMPONENT-676;Lo;0;L;;;;;N;;;;;
+18AA4;TANGUT COMPONENT-677;Lo;0;L;;;;;N;;;;;
+18AA5;TANGUT COMPONENT-678;Lo;0;L;;;;;N;;;;;
+18AA6;TANGUT COMPONENT-679;Lo;0;L;;;;;N;;;;;
+18AA7;TANGUT COMPONENT-680;Lo;0;L;;;;;N;;;;;
+18AA8;TANGUT COMPONENT-681;Lo;0;L;;;;;N;;;;;
+18AA9;TANGUT COMPONENT-682;Lo;0;L;;;;;N;;;;;
+18AAA;TANGUT COMPONENT-683;Lo;0;L;;;;;N;;;;;
+18AAB;TANGUT COMPONENT-684;Lo;0;L;;;;;N;;;;;
+18AAC;TANGUT COMPONENT-685;Lo;0;L;;;;;N;;;;;
+18AAD;TANGUT COMPONENT-686;Lo;0;L;;;;;N;;;;;
+18AAE;TANGUT COMPONENT-687;Lo;0;L;;;;;N;;;;;
+18AAF;TANGUT COMPONENT-688;Lo;0;L;;;;;N;;;;;
+18AB0;TANGUT COMPONENT-689;Lo;0;L;;;;;N;;;;;
+18AB1;TANGUT COMPONENT-690;Lo;0;L;;;;;N;;;;;
+18AB2;TANGUT COMPONENT-691;Lo;0;L;;;;;N;;;;;
+18AB3;TANGUT COMPONENT-692;Lo;0;L;;;;;N;;;;;
+18AB4;TANGUT COMPONENT-693;Lo;0;L;;;;;N;;;;;
+18AB5;TANGUT COMPONENT-694;Lo;0;L;;;;;N;;;;;
+18AB6;TANGUT COMPONENT-695;Lo;0;L;;;;;N;;;;;
+18AB7;TANGUT COMPONENT-696;Lo;0;L;;;;;N;;;;;
+18AB8;TANGUT COMPONENT-697;Lo;0;L;;;;;N;;;;;
+18AB9;TANGUT COMPONENT-698;Lo;0;L;;;;;N;;;;;
+18ABA;TANGUT COMPONENT-699;Lo;0;L;;;;;N;;;;;
+18ABB;TANGUT COMPONENT-700;Lo;0;L;;;;;N;;;;;
+18ABC;TANGUT COMPONENT-701;Lo;0;L;;;;;N;;;;;
+18ABD;TANGUT COMPONENT-702;Lo;0;L;;;;;N;;;;;
+18ABE;TANGUT COMPONENT-703;Lo;0;L;;;;;N;;;;;
+18ABF;TANGUT COMPONENT-704;Lo;0;L;;;;;N;;;;;
+18AC0;TANGUT COMPONENT-705;Lo;0;L;;;;;N;;;;;
+18AC1;TANGUT COMPONENT-706;Lo;0;L;;;;;N;;;;;
+18AC2;TANGUT COMPONENT-707;Lo;0;L;;;;;N;;;;;
+18AC3;TANGUT COMPONENT-708;Lo;0;L;;;;;N;;;;;
+18AC4;TANGUT COMPONENT-709;Lo;0;L;;;;;N;;;;;
+18AC5;TANGUT COMPONENT-710;Lo;0;L;;;;;N;;;;;
+18AC6;TANGUT COMPONENT-711;Lo;0;L;;;;;N;;;;;
+18AC7;TANGUT COMPONENT-712;Lo;0;L;;;;;N;;;;;
+18AC8;TANGUT COMPONENT-713;Lo;0;L;;;;;N;;;;;
+18AC9;TANGUT COMPONENT-714;Lo;0;L;;;;;N;;;;;
+18ACA;TANGUT COMPONENT-715;Lo;0;L;;;;;N;;;;;
+18ACB;TANGUT COMPONENT-716;Lo;0;L;;;;;N;;;;;
+18ACC;TANGUT COMPONENT-717;Lo;0;L;;;;;N;;;;;
+18ACD;TANGUT COMPONENT-718;Lo;0;L;;;;;N;;;;;
+18ACE;TANGUT COMPONENT-719;Lo;0;L;;;;;N;;;;;
+18ACF;TANGUT COMPONENT-720;Lo;0;L;;;;;N;;;;;
+18AD0;TANGUT COMPONENT-721;Lo;0;L;;;;;N;;;;;
+18AD1;TANGUT COMPONENT-722;Lo;0;L;;;;;N;;;;;
+18AD2;TANGUT COMPONENT-723;Lo;0;L;;;;;N;;;;;
+18AD3;TANGUT COMPONENT-724;Lo;0;L;;;;;N;;;;;
+18AD4;TANGUT COMPONENT-725;Lo;0;L;;;;;N;;;;;
+18AD5;TANGUT COMPONENT-726;Lo;0;L;;;;;N;;;;;
+18AD6;TANGUT COMPONENT-727;Lo;0;L;;;;;N;;;;;
+18AD7;TANGUT COMPONENT-728;Lo;0;L;;;;;N;;;;;
+18AD8;TANGUT COMPONENT-729;Lo;0;L;;;;;N;;;;;
+18AD9;TANGUT COMPONENT-730;Lo;0;L;;;;;N;;;;;
+18ADA;TANGUT COMPONENT-731;Lo;0;L;;;;;N;;;;;
+18ADB;TANGUT COMPONENT-732;Lo;0;L;;;;;N;;;;;
+18ADC;TANGUT COMPONENT-733;Lo;0;L;;;;;N;;;;;
+18ADD;TANGUT COMPONENT-734;Lo;0;L;;;;;N;;;;;
+18ADE;TANGUT COMPONENT-735;Lo;0;L;;;;;N;;;;;
+18ADF;TANGUT COMPONENT-736;Lo;0;L;;;;;N;;;;;
+18AE0;TANGUT COMPONENT-737;Lo;0;L;;;;;N;;;;;
+18AE1;TANGUT COMPONENT-738;Lo;0;L;;;;;N;;;;;
+18AE2;TANGUT COMPONENT-739;Lo;0;L;;;;;N;;;;;
+18AE3;TANGUT COMPONENT-740;Lo;0;L;;;;;N;;;;;
+18AE4;TANGUT COMPONENT-741;Lo;0;L;;;;;N;;;;;
+18AE5;TANGUT COMPONENT-742;Lo;0;L;;;;;N;;;;;
+18AE6;TANGUT COMPONENT-743;Lo;0;L;;;;;N;;;;;
+18AE7;TANGUT COMPONENT-744;Lo;0;L;;;;;N;;;;;
+18AE8;TANGUT COMPONENT-745;Lo;0;L;;;;;N;;;;;
+18AE9;TANGUT COMPONENT-746;Lo;0;L;;;;;N;;;;;
+18AEA;TANGUT COMPONENT-747;Lo;0;L;;;;;N;;;;;
+18AEB;TANGUT COMPONENT-748;Lo;0;L;;;;;N;;;;;
+18AEC;TANGUT COMPONENT-749;Lo;0;L;;;;;N;;;;;
+18AED;TANGUT COMPONENT-750;Lo;0;L;;;;;N;;;;;
+18AEE;TANGUT COMPONENT-751;Lo;0;L;;;;;N;;;;;
+18AEF;TANGUT COMPONENT-752;Lo;0;L;;;;;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;;;;;
+1B000;KATAKANA LETTER ARCHAIC E;Lo;0;L;;;;;N;;;;;
+1B001;HIRAGANA LETTER ARCHAIC YE;Lo;0;L;;;;;N;;;;;
+1BC00;DUPLOYAN LETTER H;Lo;0;L;;;;;N;;;;;
+1BC01;DUPLOYAN LETTER X;Lo;0;L;;;;;N;;;;;
+1BC02;DUPLOYAN LETTER P;Lo;0;L;;;;;N;;;;;
+1BC03;DUPLOYAN LETTER T;Lo;0;L;;;;;N;;;;;
+1BC04;DUPLOYAN LETTER F;Lo;0;L;;;;;N;;;;;
+1BC05;DUPLOYAN LETTER K;Lo;0;L;;;;;N;;;;;
+1BC06;DUPLOYAN LETTER L;Lo;0;L;;;;;N;;;;;
+1BC07;DUPLOYAN LETTER B;Lo;0;L;;;;;N;;;;;
+1BC08;DUPLOYAN LETTER D;Lo;0;L;;;;;N;;;;;
+1BC09;DUPLOYAN LETTER V;Lo;0;L;;;;;N;;;;;
+1BC0A;DUPLOYAN LETTER G;Lo;0;L;;;;;N;;;;;
+1BC0B;DUPLOYAN LETTER R;Lo;0;L;;;;;N;;;;;
+1BC0C;DUPLOYAN LETTER P N;Lo;0;L;;;;;N;;;;;
+1BC0D;DUPLOYAN LETTER D S;Lo;0;L;;;;;N;;;;;
+1BC0E;DUPLOYAN LETTER F N;Lo;0;L;;;;;N;;;;;
+1BC0F;DUPLOYAN LETTER K M;Lo;0;L;;;;;N;;;;;
+1BC10;DUPLOYAN LETTER R S;Lo;0;L;;;;;N;;;;;
+1BC11;DUPLOYAN LETTER TH;Lo;0;L;;;;;N;;;;;
+1BC12;DUPLOYAN LETTER SLOAN DH;Lo;0;L;;;;;N;;;;;
+1BC13;DUPLOYAN LETTER DH;Lo;0;L;;;;;N;;;;;
+1BC14;DUPLOYAN LETTER KK;Lo;0;L;;;;;N;;;;;
+1BC15;DUPLOYAN LETTER SLOAN J;Lo;0;L;;;;;N;;;;;
+1BC16;DUPLOYAN LETTER HL;Lo;0;L;;;;;N;;;;;
+1BC17;DUPLOYAN LETTER LH;Lo;0;L;;;;;N;;;;;
+1BC18;DUPLOYAN LETTER RH;Lo;0;L;;;;;N;;;;;
+1BC19;DUPLOYAN LETTER M;Lo;0;L;;;;;N;;;;;
+1BC1A;DUPLOYAN LETTER N;Lo;0;L;;;;;N;;;;;
+1BC1B;DUPLOYAN LETTER J;Lo;0;L;;;;;N;;;;;
+1BC1C;DUPLOYAN LETTER S;Lo;0;L;;;;;N;;;;;
+1BC1D;DUPLOYAN LETTER M N;Lo;0;L;;;;;N;;;;;
+1BC1E;DUPLOYAN LETTER N M;Lo;0;L;;;;;N;;;;;
+1BC1F;DUPLOYAN LETTER J M;Lo;0;L;;;;;N;;;;;
+1BC20;DUPLOYAN LETTER S J;Lo;0;L;;;;;N;;;;;
+1BC21;DUPLOYAN LETTER M WITH DOT;Lo;0;L;;;;;N;;;;;
+1BC22;DUPLOYAN LETTER N WITH DOT;Lo;0;L;;;;;N;;;;;
+1BC23;DUPLOYAN LETTER J WITH DOT;Lo;0;L;;;;;N;;;;;
+1BC24;DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE;Lo;0;L;;;;;N;;;;;
+1BC25;DUPLOYAN LETTER S WITH DOT;Lo;0;L;;;;;N;;;;;
+1BC26;DUPLOYAN LETTER S WITH DOT BELOW;Lo;0;L;;;;;N;;;;;
+1BC27;DUPLOYAN LETTER M S;Lo;0;L;;;;;N;;;;;
+1BC28;DUPLOYAN LETTER N S;Lo;0;L;;;;;N;;;;;
+1BC29;DUPLOYAN LETTER J S;Lo;0;L;;;;;N;;;;;
+1BC2A;DUPLOYAN LETTER S S;Lo;0;L;;;;;N;;;;;
+1BC2B;DUPLOYAN LETTER M N S;Lo;0;L;;;;;N;;;;;
+1BC2C;DUPLOYAN LETTER N M S;Lo;0;L;;;;;N;;;;;
+1BC2D;DUPLOYAN LETTER J M S;Lo;0;L;;;;;N;;;;;
+1BC2E;DUPLOYAN LETTER S J S;Lo;0;L;;;;;N;;;;;
+1BC2F;DUPLOYAN LETTER J S WITH DOT;Lo;0;L;;;;;N;;;;;
+1BC30;DUPLOYAN LETTER J N;Lo;0;L;;;;;N;;;;;
+1BC31;DUPLOYAN LETTER J N S;Lo;0;L;;;;;N;;;;;
+1BC32;DUPLOYAN LETTER S T;Lo;0;L;;;;;N;;;;;
+1BC33;DUPLOYAN LETTER S T R;Lo;0;L;;;;;N;;;;;
+1BC34;DUPLOYAN LETTER S P;Lo;0;L;;;;;N;;;;;
+1BC35;DUPLOYAN LETTER S P R;Lo;0;L;;;;;N;;;;;
+1BC36;DUPLOYAN LETTER T S;Lo;0;L;;;;;N;;;;;
+1BC37;DUPLOYAN LETTER T R S;Lo;0;L;;;;;N;;;;;
+1BC38;DUPLOYAN LETTER W;Lo;0;L;;;;;N;;;;;
+1BC39;DUPLOYAN LETTER WH;Lo;0;L;;;;;N;;;;;
+1BC3A;DUPLOYAN LETTER W R;Lo;0;L;;;;;N;;;;;
+1BC3B;DUPLOYAN LETTER S N;Lo;0;L;;;;;N;;;;;
+1BC3C;DUPLOYAN LETTER S M;Lo;0;L;;;;;N;;;;;
+1BC3D;DUPLOYAN LETTER K R S;Lo;0;L;;;;;N;;;;;
+1BC3E;DUPLOYAN LETTER G R S;Lo;0;L;;;;;N;;;;;
+1BC3F;DUPLOYAN LETTER S K;Lo;0;L;;;;;N;;;;;
+1BC40;DUPLOYAN LETTER S K R;Lo;0;L;;;;;N;;;;;
+1BC41;DUPLOYAN LETTER A;Lo;0;L;;;;;N;;;;;
+1BC42;DUPLOYAN LETTER SLOAN OW;Lo;0;L;;;;;N;;;;;
+1BC43;DUPLOYAN LETTER OA;Lo;0;L;;;;;N;;;;;
+1BC44;DUPLOYAN LETTER O;Lo;0;L;;;;;N;;;;;
+1BC45;DUPLOYAN LETTER AOU;Lo;0;L;;;;;N;;;;;
+1BC46;DUPLOYAN LETTER I;Lo;0;L;;;;;N;;;;;
+1BC47;DUPLOYAN LETTER E;Lo;0;L;;;;;N;;;;;
+1BC48;DUPLOYAN LETTER IE;Lo;0;L;;;;;N;;;;;
+1BC49;DUPLOYAN LETTER SHORT I;Lo;0;L;;;;;N;;;;;
+1BC4A;DUPLOYAN LETTER UI;Lo;0;L;;;;;N;;;;;
+1BC4B;DUPLOYAN LETTER EE;Lo;0;L;;;;;N;;;;;
+1BC4C;DUPLOYAN LETTER SLOAN EH;Lo;0;L;;;;;N;;;;;
+1BC4D;DUPLOYAN LETTER ROMANIAN I;Lo;0;L;;;;;N;;;;;
+1BC4E;DUPLOYAN LETTER SLOAN EE;Lo;0;L;;;;;N;;;;;
+1BC4F;DUPLOYAN LETTER LONG I;Lo;0;L;;;;;N;;;;;
+1BC50;DUPLOYAN LETTER YE;Lo;0;L;;;;;N;;;;;
+1BC51;DUPLOYAN LETTER U;Lo;0;L;;;;;N;;;;;
+1BC52;DUPLOYAN LETTER EU;Lo;0;L;;;;;N;;;;;
+1BC53;DUPLOYAN LETTER XW;Lo;0;L;;;;;N;;;;;
+1BC54;DUPLOYAN LETTER U N;Lo;0;L;;;;;N;;;;;
+1BC55;DUPLOYAN LETTER LONG U;Lo;0;L;;;;;N;;;;;
+1BC56;DUPLOYAN LETTER ROMANIAN U;Lo;0;L;;;;;N;;;;;
+1BC57;DUPLOYAN LETTER UH;Lo;0;L;;;;;N;;;;;
+1BC58;DUPLOYAN LETTER SLOAN U;Lo;0;L;;;;;N;;;;;
+1BC59;DUPLOYAN LETTER OOH;Lo;0;L;;;;;N;;;;;
+1BC5A;DUPLOYAN LETTER OW;Lo;0;L;;;;;N;;;;;
+1BC5B;DUPLOYAN LETTER OU;Lo;0;L;;;;;N;;;;;
+1BC5C;DUPLOYAN LETTER WA;Lo;0;L;;;;;N;;;;;
+1BC5D;DUPLOYAN LETTER WO;Lo;0;L;;;;;N;;;;;
+1BC5E;DUPLOYAN LETTER WI;Lo;0;L;;;;;N;;;;;
+1BC5F;DUPLOYAN LETTER WEI;Lo;0;L;;;;;N;;;;;
+1BC60;DUPLOYAN LETTER WOW;Lo;0;L;;;;;N;;;;;
+1BC61;DUPLOYAN LETTER NASAL U;Lo;0;L;;;;;N;;;;;
+1BC62;DUPLOYAN LETTER NASAL O;Lo;0;L;;;;;N;;;;;
+1BC63;DUPLOYAN LETTER NASAL I;Lo;0;L;;;;;N;;;;;
+1BC64;DUPLOYAN LETTER NASAL A;Lo;0;L;;;;;N;;;;;
+1BC65;DUPLOYAN LETTER PERNIN AN;Lo;0;L;;;;;N;;;;;
+1BC66;DUPLOYAN LETTER PERNIN AM;Lo;0;L;;;;;N;;;;;
+1BC67;DUPLOYAN LETTER SLOAN EN;Lo;0;L;;;;;N;;;;;
+1BC68;DUPLOYAN LETTER SLOAN AN;Lo;0;L;;;;;N;;;;;
+1BC69;DUPLOYAN LETTER SLOAN ON;Lo;0;L;;;;;N;;;;;
+1BC6A;DUPLOYAN LETTER VOCALIC M;Lo;0;L;;;;;N;;;;;
+1BC70;DUPLOYAN AFFIX LEFT HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;;
+1BC71;DUPLOYAN AFFIX MID HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;;
+1BC72;DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;;
+1BC73;DUPLOYAN AFFIX LOW VERTICAL SECANT;Lo;0;L;;;;;N;;;;;
+1BC74;DUPLOYAN AFFIX MID VERTICAL SECANT;Lo;0;L;;;;;N;;;;;
+1BC75;DUPLOYAN AFFIX HIGH VERTICAL SECANT;Lo;0;L;;;;;N;;;;;
+1BC76;DUPLOYAN AFFIX ATTACHED SECANT;Lo;0;L;;;;;N;;;;;
+1BC77;DUPLOYAN AFFIX ATTACHED LEFT-TO-RIGHT SECANT;Lo;0;L;;;;;N;;;;;
+1BC78;DUPLOYAN AFFIX ATTACHED TANGENT;Lo;0;L;;;;;N;;;;;
+1BC79;DUPLOYAN AFFIX ATTACHED TAIL;Lo;0;L;;;;;N;;;;;
+1BC7A;DUPLOYAN AFFIX ATTACHED E HOOK;Lo;0;L;;;;;N;;;;;
+1BC7B;DUPLOYAN AFFIX ATTACHED I HOOK;Lo;0;L;;;;;N;;;;;
+1BC7C;DUPLOYAN AFFIX ATTACHED TANGENT HOOK;Lo;0;L;;;;;N;;;;;
+1BC80;DUPLOYAN AFFIX HIGH ACUTE;Lo;0;L;;;;;N;;;;;
+1BC81;DUPLOYAN AFFIX HIGH TIGHT ACUTE;Lo;0;L;;;;;N;;;;;
+1BC82;DUPLOYAN AFFIX HIGH GRAVE;Lo;0;L;;;;;N;;;;;
+1BC83;DUPLOYAN AFFIX HIGH LONG GRAVE;Lo;0;L;;;;;N;;;;;
+1BC84;DUPLOYAN AFFIX HIGH DOT;Lo;0;L;;;;;N;;;;;
+1BC85;DUPLOYAN AFFIX HIGH CIRCLE;Lo;0;L;;;;;N;;;;;
+1BC86;DUPLOYAN AFFIX HIGH LINE;Lo;0;L;;;;;N;;;;;
+1BC87;DUPLOYAN AFFIX HIGH WAVE;Lo;0;L;;;;;N;;;;;
+1BC88;DUPLOYAN AFFIX HIGH VERTICAL;Lo;0;L;;;;;N;;;;;
+1BC90;DUPLOYAN AFFIX LOW ACUTE;Lo;0;L;;;;;N;;;;;
+1BC91;DUPLOYAN AFFIX LOW TIGHT ACUTE;Lo;0;L;;;;;N;;;;;
+1BC92;DUPLOYAN AFFIX LOW GRAVE;Lo;0;L;;;;;N;;;;;
+1BC93;DUPLOYAN AFFIX LOW LONG GRAVE;Lo;0;L;;;;;N;;;;;
+1BC94;DUPLOYAN AFFIX LOW DOT;Lo;0;L;;;;;N;;;;;
+1BC95;DUPLOYAN AFFIX LOW CIRCLE;Lo;0;L;;;;;N;;;;;
+1BC96;DUPLOYAN AFFIX LOW LINE;Lo;0;L;;;;;N;;;;;
+1BC97;DUPLOYAN AFFIX LOW WAVE;Lo;0;L;;;;;N;;;;;
+1BC98;DUPLOYAN AFFIX LOW VERTICAL;Lo;0;L;;;;;N;;;;;
+1BC99;DUPLOYAN AFFIX LOW ARROW;Lo;0;L;;;;;N;;;;;
+1BC9C;DUPLOYAN SIGN O WITH CROSS;So;0;L;;;;;N;;;;;
+1BC9D;DUPLOYAN THICK LETTER SELECTOR;Mn;0;NSM;;;;;N;;;;;
+1BC9E;DUPLOYAN DOUBLE MARK;Mn;1;NSM;;;;;N;;;;;
+1BC9F;DUPLOYAN PUNCTUATION CHINOOK FULL STOP;Po;0;L;;;;;N;;;;;
+1BCA0;SHORTHAND FORMAT LETTER OVERLAP;Cf;0;BN;;;;;N;;;;;
+1BCA1;SHORTHAND FORMAT CONTINUING OVERLAP;Cf;0;BN;;;;;N;;;;;
+1BCA2;SHORTHAND FORMAT DOWN STEP;Cf;0;BN;;;;;N;;;;;
+1BCA3;SHORTHAND FORMAT UP STEP;Cf;0;BN;;;;;N;;;;;
+1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;;
+1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;;
+1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;;
+1D003;BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON;So;0;L;;;;;N;;;;;
+1D004;BYZANTINE MUSICAL SYMBOL OXEIA DIPLI;So;0;L;;;;;N;;;;;
+1D005;BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON;So;0;L;;;;;N;;;;;
+1D006;BYZANTINE MUSICAL SYMBOL VAREIA DIPLI;So;0;L;;;;;N;;;;;
+1D007;BYZANTINE MUSICAL SYMBOL KATHISTI;So;0;L;;;;;N;;;;;
+1D008;BYZANTINE MUSICAL SYMBOL SYRMATIKI;So;0;L;;;;;N;;;;;
+1D009;BYZANTINE MUSICAL SYMBOL PARAKLITIKI;So;0;L;;;;;N;;;;;
+1D00A;BYZANTINE MUSICAL SYMBOL YPOKRISIS;So;0;L;;;;;N;;;;;
+1D00B;BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI;So;0;L;;;;;N;;;;;
+1D00C;BYZANTINE MUSICAL SYMBOL KREMASTI;So;0;L;;;;;N;;;;;
+1D00D;BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON;So;0;L;;;;;N;;;;;
+1D00E;BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON;So;0;L;;;;;N;;;;;
+1D00F;BYZANTINE MUSICAL SYMBOL TELEIA;So;0;L;;;;;N;;;;;
+1D010;BYZANTINE MUSICAL SYMBOL KENTIMATA;So;0;L;;;;;N;;;;;
+1D011;BYZANTINE MUSICAL SYMBOL APOSTROFOS;So;0;L;;;;;N;;;;;
+1D012;BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI;So;0;L;;;;;N;;;;;
+1D013;BYZANTINE MUSICAL SYMBOL SYNEVMA;So;0;L;;;;;N;;;;;
+1D014;BYZANTINE MUSICAL SYMBOL THITA;So;0;L;;;;;N;;;;;
+1D015;BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION;So;0;L;;;;;N;;;;;
+1D016;BYZANTINE MUSICAL SYMBOL GORGON ARCHAION;So;0;L;;;;;N;;;;;
+1D017;BYZANTINE MUSICAL SYMBOL PSILON;So;0;L;;;;;N;;;;;
+1D018;BYZANTINE MUSICAL SYMBOL CHAMILON;So;0;L;;;;;N;;;;;
+1D019;BYZANTINE MUSICAL SYMBOL VATHY;So;0;L;;;;;N;;;;;
+1D01A;BYZANTINE MUSICAL SYMBOL ISON ARCHAION;So;0;L;;;;;N;;;;;
+1D01B;BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION;So;0;L;;;;;N;;;;;
+1D01C;BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION;So;0;L;;;;;N;;;;;
+1D01D;BYZANTINE MUSICAL SYMBOL SAXIMATA;So;0;L;;;;;N;;;;;
+1D01E;BYZANTINE MUSICAL SYMBOL PARICHON;So;0;L;;;;;N;;;;;
+1D01F;BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA;So;0;L;;;;;N;;;;;
+1D020;BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION;So;0;L;;;;;N;;;;;
+1D021;BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION;So;0;L;;;;;N;;;;;
+1D022;BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION;So;0;L;;;;;N;;;;;
+1D023;BYZANTINE MUSICAL SYMBOL APOTHEMA;So;0;L;;;;;N;;;;;
+1D024;BYZANTINE MUSICAL SYMBOL KLASMA;So;0;L;;;;;N;;;;;
+1D025;BYZANTINE MUSICAL SYMBOL REVMA;So;0;L;;;;;N;;;;;
+1D026;BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION;So;0;L;;;;;N;;;;;
+1D027;BYZANTINE MUSICAL SYMBOL TINAGMA;So;0;L;;;;;N;;;;;
+1D028;BYZANTINE MUSICAL SYMBOL ANATRICHISMA;So;0;L;;;;;N;;;;;
+1D029;BYZANTINE MUSICAL SYMBOL SEISMA;So;0;L;;;;;N;;;;;
+1D02A;BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION;So;0;L;;;;;N;;;;;
+1D02B;BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU;So;0;L;;;;;N;;;;;
+1D02C;BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION;So;0;L;;;;;N;;;;;
+1D02D;BYZANTINE MUSICAL SYMBOL THEMA;So;0;L;;;;;N;;;;;
+1D02E;BYZANTINE MUSICAL SYMBOL LEMOI;So;0;L;;;;;N;;;;;
+1D02F;BYZANTINE MUSICAL SYMBOL DYO;So;0;L;;;;;N;;;;;
+1D030;BYZANTINE MUSICAL SYMBOL TRIA;So;0;L;;;;;N;;;;;
+1D031;BYZANTINE MUSICAL SYMBOL TESSERA;So;0;L;;;;;N;;;;;
+1D032;BYZANTINE MUSICAL SYMBOL KRATIMATA;So;0;L;;;;;N;;;;;
+1D033;BYZANTINE MUSICAL SYMBOL APESO EXO NEO;So;0;L;;;;;N;;;;;
+1D034;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION;So;0;L;;;;;N;;;;;
+1D035;BYZANTINE MUSICAL SYMBOL IMIFTHORA;So;0;L;;;;;N;;;;;
+1D036;BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION;So;0;L;;;;;N;;;;;
+1D037;BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON;So;0;L;;;;;N;;;;;
+1D038;BYZANTINE MUSICAL SYMBOL PELASTON;So;0;L;;;;;N;;;;;
+1D039;BYZANTINE MUSICAL SYMBOL PSIFISTON;So;0;L;;;;;N;;;;;
+1D03A;BYZANTINE MUSICAL SYMBOL KONTEVMA;So;0;L;;;;;N;;;;;
+1D03B;BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION;So;0;L;;;;;N;;;;;
+1D03C;BYZANTINE MUSICAL SYMBOL RAPISMA;So;0;L;;;;;N;;;;;
+1D03D;BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION;So;0;L;;;;;N;;;;;
+1D03E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION;So;0;L;;;;;N;;;;;
+1D03F;BYZANTINE MUSICAL SYMBOL ICHADIN;So;0;L;;;;;N;;;;;
+1D040;BYZANTINE MUSICAL SYMBOL NANA;So;0;L;;;;;N;;;;;
+1D041;BYZANTINE MUSICAL SYMBOL PETASMA;So;0;L;;;;;N;;;;;
+1D042;BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO;So;0;L;;;;;N;;;;;
+1D043;BYZANTINE MUSICAL SYMBOL TROMIKON ALLO;So;0;L;;;;;N;;;;;
+1D044;BYZANTINE MUSICAL SYMBOL STRAGGISMATA;So;0;L;;;;;N;;;;;
+1D045;BYZANTINE MUSICAL SYMBOL GRONTHISMATA;So;0;L;;;;;N;;;;;
+1D046;BYZANTINE MUSICAL SYMBOL ISON NEO;So;0;L;;;;;N;;;;;
+1D047;BYZANTINE MUSICAL SYMBOL OLIGON NEO;So;0;L;;;;;N;;;;;
+1D048;BYZANTINE MUSICAL SYMBOL OXEIA NEO;So;0;L;;;;;N;;;;;
+1D049;BYZANTINE MUSICAL SYMBOL PETASTI;So;0;L;;;;;N;;;;;
+1D04A;BYZANTINE MUSICAL SYMBOL KOUFISMA;So;0;L;;;;;N;;;;;
+1D04B;BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA;So;0;L;;;;;N;;;;;
+1D04C;BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA;So;0;L;;;;;N;;;;;
+1D04D;BYZANTINE MUSICAL SYMBOL PELASTON NEO;So;0;L;;;;;N;;;;;
+1D04E;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO;So;0;L;;;;;N;;;;;
+1D04F;BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO;So;0;L;;;;;N;;;;;
+1D050;BYZANTINE MUSICAL SYMBOL YPSILI;So;0;L;;;;;N;;;;;
+1D051;BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO;So;0;L;;;;;N;;;;;
+1D052;BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO;So;0;L;;;;;N;;;;;
+1D053;BYZANTINE MUSICAL SYMBOL YPORROI;So;0;L;;;;;N;;;;;
+1D054;BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON;So;0;L;;;;;N;;;;;
+1D055;BYZANTINE MUSICAL SYMBOL ELAFRON;So;0;L;;;;;N;;;;;
+1D056;BYZANTINE MUSICAL SYMBOL CHAMILI;So;0;L;;;;;N;;;;;
+1D057;BYZANTINE MUSICAL SYMBOL MIKRON ISON;So;0;L;;;;;N;;;;;
+1D058;BYZANTINE MUSICAL SYMBOL VAREIA NEO;So;0;L;;;;;N;;;;;
+1D059;BYZANTINE MUSICAL SYMBOL PIASMA NEO;So;0;L;;;;;N;;;;;
+1D05A;BYZANTINE MUSICAL SYMBOL PSIFISTON NEO;So;0;L;;;;;N;;;;;
+1D05B;BYZANTINE MUSICAL SYMBOL OMALON;So;0;L;;;;;N;;;;;
+1D05C;BYZANTINE MUSICAL SYMBOL ANTIKENOMA;So;0;L;;;;;N;;;;;
+1D05D;BYZANTINE MUSICAL SYMBOL LYGISMA;So;0;L;;;;;N;;;;;
+1D05E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO;So;0;L;;;;;N;;;;;
+1D05F;BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO;So;0;L;;;;;N;;;;;
+1D060;BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA;So;0;L;;;;;N;;;;;
+1D061;BYZANTINE MUSICAL SYMBOL KYLISMA;So;0;L;;;;;N;;;;;
+1D062;BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA;So;0;L;;;;;N;;;;;
+1D063;BYZANTINE MUSICAL SYMBOL TROMIKON NEO;So;0;L;;;;;N;;;;;
+1D064;BYZANTINE MUSICAL SYMBOL EKSTREPTON;So;0;L;;;;;N;;;;;
+1D065;BYZANTINE MUSICAL SYMBOL SYNAGMA NEO;So;0;L;;;;;N;;;;;
+1D066;BYZANTINE MUSICAL SYMBOL SYRMA;So;0;L;;;;;N;;;;;
+1D067;BYZANTINE MUSICAL SYMBOL CHOREVMA NEO;So;0;L;;;;;N;;;;;
+1D068;BYZANTINE MUSICAL SYMBOL EPEGERMA;So;0;L;;;;;N;;;;;
+1D069;BYZANTINE MUSICAL SYMBOL SEISMA NEO;So;0;L;;;;;N;;;;;
+1D06A;BYZANTINE MUSICAL SYMBOL XIRON KLASMA;So;0;L;;;;;N;;;;;
+1D06B;BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON;So;0;L;;;;;N;;;;;
+1D06C;BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA;So;0;L;;;;;N;;;;;
+1D06D;BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA;So;0;L;;;;;N;;;;;
+1D06E;BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA;So;0;L;;;;;N;;;;;
+1D06F;BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA;So;0;L;;;;;N;;;;;
+1D070;BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA;So;0;L;;;;;N;;;;;
+1D071;BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA;So;0;L;;;;;N;;;;;
+1D072;BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON;So;0;L;;;;;N;;;;;
+1D073;BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON;So;0;L;;;;;N;;;;;
+1D074;BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON;So;0;L;;;;;N;;;;;
+1D075;BYZANTINE MUSICAL SYMBOL OYRANISMA NEO;So;0;L;;;;;N;;;;;
+1D076;BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO;So;0;L;;;;;N;;;;;
+1D077;BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO;So;0;L;;;;;N;;;;;
+1D078;BYZANTINE MUSICAL SYMBOL THEMA APLOUN;So;0;L;;;;;N;;;;;
+1D079;BYZANTINE MUSICAL SYMBOL THES KAI APOTHES;So;0;L;;;;;N;;;;;
+1D07A;BYZANTINE MUSICAL SYMBOL KATAVASMA;So;0;L;;;;;N;;;;;
+1D07B;BYZANTINE MUSICAL SYMBOL ENDOFONON;So;0;L;;;;;N;;;;;
+1D07C;BYZANTINE MUSICAL SYMBOL YFEN KATO;So;0;L;;;;;N;;;;;
+1D07D;BYZANTINE MUSICAL SYMBOL YFEN ANO;So;0;L;;;;;N;;;;;
+1D07E;BYZANTINE MUSICAL SYMBOL STAVROS;So;0;L;;;;;N;;;;;
+1D07F;BYZANTINE MUSICAL SYMBOL KLASMA ANO;So;0;L;;;;;N;;;;;
+1D080;BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION;So;0;L;;;;;N;;;;;
+1D081;BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION;So;0;L;;;;;N;;;;;
+1D082;BYZANTINE MUSICAL SYMBOL KRATIMA ALLO;So;0;L;;;;;N;;;;;
+1D083;BYZANTINE MUSICAL SYMBOL KRATIMA NEO;So;0;L;;;;;N;;;;;
+1D084;BYZANTINE MUSICAL SYMBOL APODERMA NEO;So;0;L;;;;;N;;;;;
+1D085;BYZANTINE MUSICAL SYMBOL APLI;So;0;L;;;;;N;;;;;
+1D086;BYZANTINE MUSICAL SYMBOL DIPLI;So;0;L;;;;;N;;;;;
+1D087;BYZANTINE MUSICAL SYMBOL TRIPLI;So;0;L;;;;;N;;;;;
+1D088;BYZANTINE MUSICAL SYMBOL TETRAPLI;So;0;L;;;;;N;;;;;
+1D089;BYZANTINE MUSICAL SYMBOL KORONIS;So;0;L;;;;;N;;;;;
+1D08A;BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU;So;0;L;;;;;N;;;;;
+1D08B;BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON;So;0;L;;;;;N;;;;;
+1D08C;BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON;So;0;L;;;;;N;;;;;
+1D08D;BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON;So;0;L;;;;;N;;;;;
+1D08E;BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU;So;0;L;;;;;N;;;;;
+1D08F;BYZANTINE MUSICAL SYMBOL GORGON NEO ANO;So;0;L;;;;;N;;;;;
+1D090;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA;So;0;L;;;;;N;;;;;
+1D091;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;;
+1D092;BYZANTINE MUSICAL SYMBOL DIGORGON;So;0;L;;;;;N;;;;;
+1D093;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO;So;0;L;;;;;N;;;;;
+1D094;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO;So;0;L;;;;;N;;;;;
+1D095;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;;
+1D096;BYZANTINE MUSICAL SYMBOL TRIGORGON;So;0;L;;;;;N;;;;;
+1D097;BYZANTINE MUSICAL SYMBOL ARGON;So;0;L;;;;;N;;;;;
+1D098;BYZANTINE MUSICAL SYMBOL IMIDIARGON;So;0;L;;;;;N;;;;;
+1D099;BYZANTINE MUSICAL SYMBOL DIARGON;So;0;L;;;;;N;;;;;
+1D09A;BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI;So;0;L;;;;;N;;;;;
+1D09B;BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI;So;0;L;;;;;N;;;;;
+1D09C;BYZANTINE MUSICAL SYMBOL AGOGI ARGI;So;0;L;;;;;N;;;;;
+1D09D;BYZANTINE MUSICAL SYMBOL AGOGI METRIA;So;0;L;;;;;N;;;;;
+1D09E;BYZANTINE MUSICAL SYMBOL AGOGI MESI;So;0;L;;;;;N;;;;;
+1D09F;BYZANTINE MUSICAL SYMBOL AGOGI GORGI;So;0;L;;;;;N;;;;;
+1D0A0;BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI;So;0;L;;;;;N;;;;;
+1D0A1;BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI;So;0;L;;;;;N;;;;;
+1D0A2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A3;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A4;BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS;So;0;L;;;;;N;;;;;
+1D0A5;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS;So;0;L;;;;;N;;;;;
+1D0A6;BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A7;BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS;So;0;L;;;;;N;;;;;
+1D0A8;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A9;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS;So;0;L;;;;;N;;;;;
+1D0AA;BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS;So;0;L;;;;;N;;;;;
+1D0AB;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS;So;0;L;;;;;N;;;;;
+1D0AC;BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS;So;0;L;;;;;N;;;;;
+1D0AD;BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS;So;0;L;;;;;N;;;;;
+1D0AE;BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS;So;0;L;;;;;N;;;;;
+1D0AF;BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS;So;0;L;;;;;N;;;;;
+1D0B0;BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS;So;0;L;;;;;N;;;;;
+1D0B1;BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS;So;0;L;;;;;N;;;;;
+1D0B2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS;So;0;L;;;;;N;;;;;
+1D0B3;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0B4;BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN;So;0;L;;;;;N;;;;;
+1D0B5;BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN;So;0;L;;;;;N;;;;;
+1D0B6;BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU;So;0;L;;;;;N;;;;;
+1D0B7;BYZANTINE MUSICAL SYMBOL IMIFONON;So;0;L;;;;;N;;;;;
+1D0B8;BYZANTINE MUSICAL SYMBOL IMIFTHORON;So;0;L;;;;;N;;;;;
+1D0B9;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU;So;0;L;;;;;N;;;;;
+1D0BA;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA;So;0;L;;;;;N;;;;;
+1D0BB;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA;So;0;L;;;;;N;;;;;
+1D0BC;BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS;So;0;L;;;;;N;;;;;
+1D0BD;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI;So;0;L;;;;;N;;;;;
+1D0BE;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI;So;0;L;;;;;N;;;;;
+1D0BF;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE;So;0;L;;;;;N;;;;;
+1D0C0;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO;So;0;L;;;;;N;;;;;
+1D0C1;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO;So;0;L;;;;;N;;;;;
+1D0C2;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO;So;0;L;;;;;N;;;;;
+1D0C3;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS;So;0;L;;;;;N;;;;;
+1D0C4;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS;So;0;L;;;;;N;;;;;
+1D0C5;BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS;So;0;L;;;;;N;;;;;
+1D0C6;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI;So;0;L;;;;;N;;;;;
+1D0C7;BYZANTINE MUSICAL SYMBOL FTHORA NENANO;So;0;L;;;;;N;;;;;
+1D0C8;BYZANTINE MUSICAL SYMBOL CHROA ZYGOS;So;0;L;;;;;N;;;;;
+1D0C9;BYZANTINE MUSICAL SYMBOL CHROA KLITON;So;0;L;;;;;N;;;;;
+1D0CA;BYZANTINE MUSICAL SYMBOL CHROA SPATHI;So;0;L;;;;;N;;;;;
+1D0CB;BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION;So;0;L;;;;;N;;;;;
+1D0CC;BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA;So;0;L;;;;;N;;;;;
+1D0CD;BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION;So;0;L;;;;;N;;;;;
+1D0CE;BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION;So;0;L;;;;;N;;;;;
+1D0CF;BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION;So;0;L;;;;;N;;;;;
+1D0D0;BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D1;BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;;
+1D0D2;BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;;
+1D0D3;BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D4;BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D5;BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;;
+1D0D6;BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;;
+1D0D7;BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D8;BYZANTINE MUSICAL SYMBOL GENIKI DIESIS;So;0;L;;;;;N;;;;;
+1D0D9;BYZANTINE MUSICAL SYMBOL GENIKI YFESIS;So;0;L;;;;;N;;;;;
+1D0DA;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI;So;0;L;;;;;N;;;;;
+1D0DB;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI;So;0;L;;;;;N;;;;;
+1D0DC;BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI;So;0;L;;;;;N;;;;;
+1D0DD;BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS;So;0;L;;;;;N;;;;;
+1D0DE;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS;So;0;L;;;;;N;;;;;
+1D0DF;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU;So;0;L;;;;;N;;;;;
+1D0E0;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU;So;0;L;;;;;N;;;;;
+1D0E1;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU;So;0;L;;;;;N;;;;;
+1D0E2;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS;So;0;L;;;;;N;;;;;
+1D0E3;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU;So;0;L;;;;;N;;;;;
+1D0E4;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU;So;0;L;;;;;N;;;;;
+1D0E5;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU;So;0;L;;;;;N;;;;;
+1D0E6;BYZANTINE MUSICAL SYMBOL DIGRAMMA GG;So;0;L;;;;;N;;;;;
+1D0E7;BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU;So;0;L;;;;;N;;;;;
+1D0E8;BYZANTINE MUSICAL SYMBOL STIGMA;So;0;L;;;;;N;;;;;
+1D0E9;BYZANTINE MUSICAL SYMBOL ARKTIKO PA;So;0;L;;;;;N;;;;;
+1D0EA;BYZANTINE MUSICAL SYMBOL ARKTIKO VOU;So;0;L;;;;;N;;;;;
+1D0EB;BYZANTINE MUSICAL SYMBOL ARKTIKO GA;So;0;L;;;;;N;;;;;
+1D0EC;BYZANTINE MUSICAL SYMBOL ARKTIKO DI;So;0;L;;;;;N;;;;;
+1D0ED;BYZANTINE MUSICAL SYMBOL ARKTIKO KE;So;0;L;;;;;N;;;;;
+1D0EE;BYZANTINE MUSICAL SYMBOL ARKTIKO ZO;So;0;L;;;;;N;;;;;
+1D0EF;BYZANTINE MUSICAL SYMBOL ARKTIKO NI;So;0;L;;;;;N;;;;;
+1D0F0;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO;So;0;L;;;;;N;;;;;
+1D0F1;BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO;So;0;L;;;;;N;;;;;
+1D0F2;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO;So;0;L;;;;;N;;;;;
+1D0F3;BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO;So;0;L;;;;;N;;;;;
+1D0F4;BYZANTINE MUSICAL SYMBOL KLASMA KATO;So;0;L;;;;;N;;;;;
+1D0F5;BYZANTINE MUSICAL SYMBOL GORGON NEO KATO;So;0;L;;;;;N;;;;;
+1D100;MUSICAL SYMBOL SINGLE BARLINE;So;0;L;;;;;N;;;;;
+1D101;MUSICAL SYMBOL DOUBLE BARLINE;So;0;L;;;;;N;;;;;
+1D102;MUSICAL SYMBOL FINAL BARLINE;So;0;L;;;;;N;;;;;
+1D103;MUSICAL SYMBOL REVERSE FINAL BARLINE;So;0;L;;;;;N;;;;;
+1D104;MUSICAL SYMBOL DASHED BARLINE;So;0;L;;;;;N;;;;;
+1D105;MUSICAL SYMBOL SHORT BARLINE;So;0;L;;;;;N;;;;;
+1D106;MUSICAL SYMBOL LEFT REPEAT SIGN;So;0;L;;;;;N;;;;;
+1D107;MUSICAL SYMBOL RIGHT REPEAT SIGN;So;0;L;;;;;N;;;;;
+1D108;MUSICAL SYMBOL REPEAT DOTS;So;0;L;;;;;N;;;;;
+1D109;MUSICAL SYMBOL DAL SEGNO;So;0;L;;;;;N;;;;;
+1D10A;MUSICAL SYMBOL DA CAPO;So;0;L;;;;;N;;;;;
+1D10B;MUSICAL SYMBOL SEGNO;So;0;L;;;;;N;;;;;
+1D10C;MUSICAL SYMBOL CODA;So;0;L;;;;;N;;;;;
+1D10D;MUSICAL SYMBOL REPEATED FIGURE-1;So;0;L;;;;;N;;;;;
+1D10E;MUSICAL SYMBOL REPEATED FIGURE-2;So;0;L;;;;;N;;;;;
+1D10F;MUSICAL SYMBOL REPEATED FIGURE-3;So;0;L;;;;;N;;;;;
+1D110;MUSICAL SYMBOL FERMATA;So;0;L;;;;;N;;;;;
+1D111;MUSICAL SYMBOL FERMATA BELOW;So;0;L;;;;;N;;;;;
+1D112;MUSICAL SYMBOL BREATH MARK;So;0;L;;;;;N;;;;;
+1D113;MUSICAL SYMBOL CAESURA;So;0;L;;;;;N;;;;;
+1D114;MUSICAL SYMBOL BRACE;So;0;L;;;;;N;;;;;
+1D115;MUSICAL SYMBOL BRACKET;So;0;L;;;;;N;;;;;
+1D116;MUSICAL SYMBOL ONE-LINE STAFF;So;0;L;;;;;N;;;;;
+1D117;MUSICAL SYMBOL TWO-LINE STAFF;So;0;L;;;;;N;;;;;
+1D118;MUSICAL SYMBOL THREE-LINE STAFF;So;0;L;;;;;N;;;;;
+1D119;MUSICAL SYMBOL FOUR-LINE STAFF;So;0;L;;;;;N;;;;;
+1D11A;MUSICAL SYMBOL FIVE-LINE STAFF;So;0;L;;;;;N;;;;;
+1D11B;MUSICAL SYMBOL SIX-LINE STAFF;So;0;L;;;;;N;;;;;
+1D11C;MUSICAL SYMBOL SIX-STRING FRETBOARD;So;0;L;;;;;N;;;;;
+1D11D;MUSICAL SYMBOL FOUR-STRING FRETBOARD;So;0;L;;;;;N;;;;;
+1D11E;MUSICAL SYMBOL G CLEF;So;0;L;;;;;N;;;;;
+1D11F;MUSICAL SYMBOL G CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;;
+1D120;MUSICAL SYMBOL G CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;;
+1D121;MUSICAL SYMBOL C CLEF;So;0;L;;;;;N;;;;;
+1D122;MUSICAL SYMBOL F CLEF;So;0;L;;;;;N;;;;;
+1D123;MUSICAL SYMBOL F CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;;
+1D124;MUSICAL SYMBOL F CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;;
+1D125;MUSICAL SYMBOL DRUM CLEF-1;So;0;L;;;;;N;;;;;
+1D126;MUSICAL SYMBOL DRUM CLEF-2;So;0;L;;;;;N;;;;;
+1D129;MUSICAL SYMBOL MULTIPLE MEASURE REST;So;0;L;;;;;N;;;;;
+1D12A;MUSICAL SYMBOL DOUBLE SHARP;So;0;L;;;;;N;;;;;
+1D12B;MUSICAL SYMBOL DOUBLE FLAT;So;0;L;;;;;N;;;;;
+1D12C;MUSICAL SYMBOL FLAT UP;So;0;L;;;;;N;;;;;
+1D12D;MUSICAL SYMBOL FLAT DOWN;So;0;L;;;;;N;;;;;
+1D12E;MUSICAL SYMBOL NATURAL UP;So;0;L;;;;;N;;;;;
+1D12F;MUSICAL SYMBOL NATURAL DOWN;So;0;L;;;;;N;;;;;
+1D130;MUSICAL SYMBOL SHARP UP;So;0;L;;;;;N;;;;;
+1D131;MUSICAL SYMBOL SHARP DOWN;So;0;L;;;;;N;;;;;
+1D132;MUSICAL SYMBOL QUARTER TONE SHARP;So;0;L;;;;;N;;;;;
+1D133;MUSICAL SYMBOL QUARTER TONE FLAT;So;0;L;;;;;N;;;;;
+1D134;MUSICAL SYMBOL COMMON TIME;So;0;L;;;;;N;;;;;
+1D135;MUSICAL SYMBOL CUT TIME;So;0;L;;;;;N;;;;;
+1D136;MUSICAL SYMBOL OTTAVA ALTA;So;0;L;;;;;N;;;;;
+1D137;MUSICAL SYMBOL OTTAVA BASSA;So;0;L;;;;;N;;;;;
+1D138;MUSICAL SYMBOL QUINDICESIMA ALTA;So;0;L;;;;;N;;;;;
+1D139;MUSICAL SYMBOL QUINDICESIMA BASSA;So;0;L;;;;;N;;;;;
+1D13A;MUSICAL SYMBOL MULTI REST;So;0;L;;;;;N;;;;;
+1D13B;MUSICAL SYMBOL WHOLE REST;So;0;L;;;;;N;;;;;
+1D13C;MUSICAL SYMBOL HALF REST;So;0;L;;;;;N;;;;;
+1D13D;MUSICAL SYMBOL QUARTER REST;So;0;L;;;;;N;;;;;
+1D13E;MUSICAL SYMBOL EIGHTH REST;So;0;L;;;;;N;;;;;
+1D13F;MUSICAL SYMBOL SIXTEENTH REST;So;0;L;;;;;N;;;;;
+1D140;MUSICAL SYMBOL THIRTY-SECOND REST;So;0;L;;;;;N;;;;;
+1D141;MUSICAL SYMBOL SIXTY-FOURTH REST;So;0;L;;;;;N;;;;;
+1D142;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST;So;0;L;;;;;N;;;;;
+1D143;MUSICAL SYMBOL X NOTEHEAD;So;0;L;;;;;N;;;;;
+1D144;MUSICAL SYMBOL PLUS NOTEHEAD;So;0;L;;;;;N;;;;;
+1D145;MUSICAL SYMBOL CIRCLE X NOTEHEAD;So;0;L;;;;;N;;;;;
+1D146;MUSICAL SYMBOL SQUARE NOTEHEAD WHITE;So;0;L;;;;;N;;;;;
+1D147;MUSICAL SYMBOL SQUARE NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D148;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE;So;0;L;;;;;N;;;;;
+1D149;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK;So;0;L;;;;;N;;;;;
+1D14A;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE;So;0;L;;;;;N;;;;;
+1D14B;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK;So;0;L;;;;;N;;;;;
+1D14C;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE;So;0;L;;;;;N;;;;;
+1D14D;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK;So;0;L;;;;;N;;;;;
+1D14E;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;;
+1D14F;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;;
+1D150;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE;So;0;L;;;;;N;;;;;
+1D151;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK;So;0;L;;;;;N;;;;;
+1D152;MUSICAL SYMBOL MOON NOTEHEAD WHITE;So;0;L;;;;;N;;;;;
+1D153;MUSICAL SYMBOL MOON NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D154;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;;
+1D155;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;;
+1D156;MUSICAL SYMBOL PARENTHESIS NOTEHEAD;So;0;L;;;;;N;;;;;
+1D157;MUSICAL SYMBOL VOID NOTEHEAD;So;0;L;;;;;N;;;;;
+1D158;MUSICAL SYMBOL NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D159;MUSICAL SYMBOL NULL NOTEHEAD;So;0;L;;;;;N;;;;;
+1D15A;MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE;So;0;L;;;;;N;;;;;
+1D15B;MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D15C;MUSICAL SYMBOL BREVE;So;0;L;;;;;N;;;;;
+1D15D;MUSICAL SYMBOL WHOLE NOTE;So;0;L;;;;;N;;;;;
+1D15E;MUSICAL SYMBOL HALF NOTE;So;0;L;1D157 1D165;;;;N;;;;;
+1D15F;MUSICAL SYMBOL QUARTER NOTE;So;0;L;1D158 1D165;;;;N;;;;;
+1D160;MUSICAL SYMBOL EIGHTH NOTE;So;0;L;1D15F 1D16E;;;;N;;;;;
+1D161;MUSICAL SYMBOL SIXTEENTH NOTE;So;0;L;1D15F 1D16F;;;;N;;;;;
+1D162;MUSICAL SYMBOL THIRTY-SECOND NOTE;So;0;L;1D15F 1D170;;;;N;;;;;
+1D163;MUSICAL SYMBOL SIXTY-FOURTH NOTE;So;0;L;1D15F 1D171;;;;N;;;;;
+1D164;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE;So;0;L;1D15F 1D172;;;;N;;;;;
+1D165;MUSICAL SYMBOL COMBINING STEM;Mc;216;L;;;;;N;;;;;
+1D166;MUSICAL SYMBOL COMBINING SPRECHGESANG STEM;Mc;216;L;;;;;N;;;;;
+1D167;MUSICAL SYMBOL COMBINING TREMOLO-1;Mn;1;NSM;;;;;N;;;;;
+1D168;MUSICAL SYMBOL COMBINING TREMOLO-2;Mn;1;NSM;;;;;N;;;;;
+1D169;MUSICAL SYMBOL COMBINING TREMOLO-3;Mn;1;NSM;;;;;N;;;;;
+1D16A;MUSICAL SYMBOL FINGERED TREMOLO-1;So;0;L;;;;;N;;;;;
+1D16B;MUSICAL SYMBOL FINGERED TREMOLO-2;So;0;L;;;;;N;;;;;
+1D16C;MUSICAL SYMBOL FINGERED TREMOLO-3;So;0;L;;;;;N;;;;;
+1D16D;MUSICAL SYMBOL COMBINING AUGMENTATION DOT;Mc;226;L;;;;;N;;;;;
+1D16E;MUSICAL SYMBOL COMBINING FLAG-1;Mc;216;L;;;;;N;;;;;
+1D16F;MUSICAL SYMBOL COMBINING FLAG-2;Mc;216;L;;;;;N;;;;;
+1D170;MUSICAL SYMBOL COMBINING FLAG-3;Mc;216;L;;;;;N;;;;;
+1D171;MUSICAL SYMBOL COMBINING FLAG-4;Mc;216;L;;;;;N;;;;;
+1D172;MUSICAL SYMBOL COMBINING FLAG-5;Mc;216;L;;;;;N;;;;;
+1D173;MUSICAL SYMBOL BEGIN BEAM;Cf;0;BN;;;;;N;;;;;
+1D174;MUSICAL SYMBOL END BEAM;Cf;0;BN;;;;;N;;;;;
+1D175;MUSICAL SYMBOL BEGIN TIE;Cf;0;BN;;;;;N;;;;;
+1D176;MUSICAL SYMBOL END TIE;Cf;0;BN;;;;;N;;;;;
+1D177;MUSICAL SYMBOL BEGIN SLUR;Cf;0;BN;;;;;N;;;;;
+1D178;MUSICAL SYMBOL END SLUR;Cf;0;BN;;;;;N;;;;;
+1D179;MUSICAL SYMBOL BEGIN PHRASE;Cf;0;BN;;;;;N;;;;;
+1D17A;MUSICAL SYMBOL END PHRASE;Cf;0;BN;;;;;N;;;;;
+1D17B;MUSICAL SYMBOL COMBINING ACCENT;Mn;220;NSM;;;;;N;;;;;
+1D17C;MUSICAL SYMBOL COMBINING STACCATO;Mn;220;NSM;;;;;N;;;;;
+1D17D;MUSICAL SYMBOL COMBINING TENUTO;Mn;220;NSM;;;;;N;;;;;
+1D17E;MUSICAL SYMBOL COMBINING STACCATISSIMO;Mn;220;NSM;;;;;N;;;;;
+1D17F;MUSICAL SYMBOL COMBINING MARCATO;Mn;220;NSM;;;;;N;;;;;
+1D180;MUSICAL SYMBOL COMBINING MARCATO-STACCATO;Mn;220;NSM;;;;;N;;;;;
+1D181;MUSICAL SYMBOL COMBINING ACCENT-STACCATO;Mn;220;NSM;;;;;N;;;;;
+1D182;MUSICAL SYMBOL COMBINING LOURE;Mn;220;NSM;;;;;N;;;;;
+1D183;MUSICAL SYMBOL ARPEGGIATO UP;So;0;L;;;;;N;;;;;
+1D184;MUSICAL SYMBOL ARPEGGIATO DOWN;So;0;L;;;;;N;;;;;
+1D185;MUSICAL SYMBOL COMBINING DOIT;Mn;230;NSM;;;;;N;;;;;
+1D186;MUSICAL SYMBOL COMBINING RIP;Mn;230;NSM;;;;;N;;;;;
+1D187;MUSICAL SYMBOL COMBINING FLIP;Mn;230;NSM;;;;;N;;;;;
+1D188;MUSICAL SYMBOL COMBINING SMEAR;Mn;230;NSM;;;;;N;;;;;
+1D189;MUSICAL SYMBOL COMBINING BEND;Mn;230;NSM;;;;;N;;;;;
+1D18A;MUSICAL SYMBOL COMBINING DOUBLE TONGUE;Mn;220;NSM;;;;;N;;;;;
+1D18B;MUSICAL SYMBOL COMBINING TRIPLE TONGUE;Mn;220;NSM;;;;;N;;;;;
+1D18C;MUSICAL SYMBOL RINFORZANDO;So;0;L;;;;;N;;;;;
+1D18D;MUSICAL SYMBOL SUBITO;So;0;L;;;;;N;;;;;
+1D18E;MUSICAL SYMBOL Z;So;0;L;;;;;N;;;;;
+1D18F;MUSICAL SYMBOL PIANO;So;0;L;;;;;N;;;;;
+1D190;MUSICAL SYMBOL MEZZO;So;0;L;;;;;N;;;;;
+1D191;MUSICAL SYMBOL FORTE;So;0;L;;;;;N;;;;;
+1D192;MUSICAL SYMBOL CRESCENDO;So;0;L;;;;;N;;;;;
+1D193;MUSICAL SYMBOL DECRESCENDO;So;0;L;;;;;N;;;;;
+1D194;MUSICAL SYMBOL GRACE NOTE SLASH;So;0;L;;;;;N;;;;;
+1D195;MUSICAL SYMBOL GRACE NOTE NO SLASH;So;0;L;;;;;N;;;;;
+1D196;MUSICAL SYMBOL TR;So;0;L;;;;;N;;;;;
+1D197;MUSICAL SYMBOL TURN;So;0;L;;;;;N;;;;;
+1D198;MUSICAL SYMBOL INVERTED TURN;So;0;L;;;;;N;;;;;
+1D199;MUSICAL SYMBOL TURN SLASH;So;0;L;;;;;N;;;;;
+1D19A;MUSICAL SYMBOL TURN UP;So;0;L;;;;;N;;;;;
+1D19B;MUSICAL SYMBOL ORNAMENT STROKE-1;So;0;L;;;;;N;;;;;
+1D19C;MUSICAL SYMBOL ORNAMENT STROKE-2;So;0;L;;;;;N;;;;;
+1D19D;MUSICAL SYMBOL ORNAMENT STROKE-3;So;0;L;;;;;N;;;;;
+1D19E;MUSICAL SYMBOL ORNAMENT STROKE-4;So;0;L;;;;;N;;;;;
+1D19F;MUSICAL SYMBOL ORNAMENT STROKE-5;So;0;L;;;;;N;;;;;
+1D1A0;MUSICAL SYMBOL ORNAMENT STROKE-6;So;0;L;;;;;N;;;;;
+1D1A1;MUSICAL SYMBOL ORNAMENT STROKE-7;So;0;L;;;;;N;;;;;
+1D1A2;MUSICAL SYMBOL ORNAMENT STROKE-8;So;0;L;;;;;N;;;;;
+1D1A3;MUSICAL SYMBOL ORNAMENT STROKE-9;So;0;L;;;;;N;;;;;
+1D1A4;MUSICAL SYMBOL ORNAMENT STROKE-10;So;0;L;;;;;N;;;;;
+1D1A5;MUSICAL SYMBOL ORNAMENT STROKE-11;So;0;L;;;;;N;;;;;
+1D1A6;MUSICAL SYMBOL HAUPTSTIMME;So;0;L;;;;;N;;;;;
+1D1A7;MUSICAL SYMBOL NEBENSTIMME;So;0;L;;;;;N;;;;;
+1D1A8;MUSICAL SYMBOL END OF STIMME;So;0;L;;;;;N;;;;;
+1D1A9;MUSICAL SYMBOL DEGREE SLASH;So;0;L;;;;;N;;;;;
+1D1AA;MUSICAL SYMBOL COMBINING DOWN BOW;Mn;230;NSM;;;;;N;;;;;
+1D1AB;MUSICAL SYMBOL COMBINING UP BOW;Mn;230;NSM;;;;;N;;;;;
+1D1AC;MUSICAL SYMBOL COMBINING HARMONIC;Mn;230;NSM;;;;;N;;;;;
+1D1AD;MUSICAL SYMBOL COMBINING SNAP PIZZICATO;Mn;230;NSM;;;;;N;;;;;
+1D1AE;MUSICAL SYMBOL PEDAL MARK;So;0;L;;;;;N;;;;;
+1D1AF;MUSICAL SYMBOL PEDAL UP MARK;So;0;L;;;;;N;;;;;
+1D1B0;MUSICAL SYMBOL HALF PEDAL MARK;So;0;L;;;;;N;;;;;
+1D1B1;MUSICAL SYMBOL GLISSANDO UP;So;0;L;;;;;N;;;;;
+1D1B2;MUSICAL SYMBOL GLISSANDO DOWN;So;0;L;;;;;N;;;;;
+1D1B3;MUSICAL SYMBOL WITH FINGERNAILS;So;0;L;;;;;N;;;;;
+1D1B4;MUSICAL SYMBOL DAMP;So;0;L;;;;;N;;;;;
+1D1B5;MUSICAL SYMBOL DAMP ALL;So;0;L;;;;;N;;;;;
+1D1B6;MUSICAL SYMBOL MAXIMA;So;0;L;;;;;N;;;;;
+1D1B7;MUSICAL SYMBOL LONGA;So;0;L;;;;;N;;;;;
+1D1B8;MUSICAL SYMBOL BREVIS;So;0;L;;;;;N;;;;;
+1D1B9;MUSICAL SYMBOL SEMIBREVIS WHITE;So;0;L;;;;;N;;;;;
+1D1BA;MUSICAL SYMBOL SEMIBREVIS BLACK;So;0;L;;;;;N;;;;;
+1D1BB;MUSICAL SYMBOL MINIMA;So;0;L;1D1B9 1D165;;;;N;;;;;
+1D1BC;MUSICAL SYMBOL MINIMA BLACK;So;0;L;1D1BA 1D165;;;;N;;;;;
+1D1BD;MUSICAL SYMBOL SEMIMINIMA WHITE;So;0;L;1D1BB 1D16E;;;;N;;;;;
+1D1BE;MUSICAL SYMBOL SEMIMINIMA BLACK;So;0;L;1D1BC 1D16E;;;;N;;;;;
+1D1BF;MUSICAL SYMBOL FUSA WHITE;So;0;L;1D1BB 1D16F;;;;N;;;;;
+1D1C0;MUSICAL SYMBOL FUSA BLACK;So;0;L;1D1BC 1D16F;;;;N;;;;;
+1D1C1;MUSICAL SYMBOL LONGA PERFECTA REST;So;0;L;;;;;N;;;;;
+1D1C2;MUSICAL SYMBOL LONGA IMPERFECTA REST;So;0;L;;;;;N;;;;;
+1D1C3;MUSICAL SYMBOL BREVIS REST;So;0;L;;;;;N;;;;;
+1D1C4;MUSICAL SYMBOL SEMIBREVIS REST;So;0;L;;;;;N;;;;;
+1D1C5;MUSICAL SYMBOL MINIMA REST;So;0;L;;;;;N;;;;;
+1D1C6;MUSICAL SYMBOL SEMIMINIMA REST;So;0;L;;;;;N;;;;;
+1D1C7;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;;
+1D1C8;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;;
+1D1C9;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;;
+1D1CA;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;;
+1D1CB;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;;
+1D1CC;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;;
+1D1CD;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2;So;0;L;;;;;N;;;;;
+1D1CE;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3;So;0;L;;;;;N;;;;;
+1D1CF;MUSICAL SYMBOL CROIX;So;0;L;;;;;N;;;;;
+1D1D0;MUSICAL SYMBOL GREGORIAN C CLEF;So;0;L;;;;;N;;;;;
+1D1D1;MUSICAL SYMBOL GREGORIAN F CLEF;So;0;L;;;;;N;;;;;
+1D1D2;MUSICAL SYMBOL SQUARE B;So;0;L;;;;;N;;;;;
+1D1D3;MUSICAL SYMBOL VIRGA;So;0;L;;;;;N;;;;;
+1D1D4;MUSICAL SYMBOL PODATUS;So;0;L;;;;;N;;;;;
+1D1D5;MUSICAL SYMBOL CLIVIS;So;0;L;;;;;N;;;;;
+1D1D6;MUSICAL SYMBOL SCANDICUS;So;0;L;;;;;N;;;;;
+1D1D7;MUSICAL SYMBOL CLIMACUS;So;0;L;;;;;N;;;;;
+1D1D8;MUSICAL SYMBOL TORCULUS;So;0;L;;;;;N;;;;;
+1D1D9;MUSICAL SYMBOL PORRECTUS;So;0;L;;;;;N;;;;;
+1D1DA;MUSICAL SYMBOL PORRECTUS FLEXUS;So;0;L;;;;;N;;;;;
+1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;;
+1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;;
+1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;;
+1D1DE;MUSICAL SYMBOL KIEVAN C CLEF;So;0;L;;;;;N;;;;;
+1D1DF;MUSICAL SYMBOL KIEVAN END OF PIECE;So;0;L;;;;;N;;;;;
+1D1E0;MUSICAL SYMBOL KIEVAN FINAL NOTE;So;0;L;;;;;N;;;;;
+1D1E1;MUSICAL SYMBOL KIEVAN RECITATIVE MARK;So;0;L;;;;;N;;;;;
+1D1E2;MUSICAL SYMBOL KIEVAN WHOLE NOTE;So;0;L;;;;;N;;;;;
+1D1E3;MUSICAL SYMBOL KIEVAN HALF NOTE;So;0;L;;;;;N;;;;;
+1D1E4;MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM DOWN;So;0;L;;;;;N;;;;;
+1D1E5;MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM UP;So;0;L;;;;;N;;;;;
+1D1E6;MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM DOWN;So;0;L;;;;;N;;;;;
+1D1E7;MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM UP;So;0;L;;;;;N;;;;;
+1D1E8;MUSICAL SYMBOL KIEVAN FLAT SIGN;So;0;L;;;;;N;;;;;
+1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;;
+1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;;
+1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;;
+1D203;GREEK VOCAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;;
+1D204;GREEK VOCAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;;
+1D205;GREEK VOCAL NOTATION SYMBOL-6;So;0;ON;;;;;N;;;;;
+1D206;GREEK VOCAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;;
+1D207;GREEK VOCAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;;
+1D208;GREEK VOCAL NOTATION SYMBOL-9;So;0;ON;;;;;N;;;;;
+1D209;GREEK VOCAL NOTATION SYMBOL-10;So;0;ON;;;;;N;;;;;
+1D20A;GREEK VOCAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;;
+1D20B;GREEK VOCAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;;
+1D20C;GREEK VOCAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;;
+1D20D;GREEK VOCAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;;
+1D20E;GREEK VOCAL NOTATION SYMBOL-15;So;0;ON;;;;;N;;;;;
+1D20F;GREEK VOCAL NOTATION SYMBOL-16;So;0;ON;;;;;N;;;;;
+1D210;GREEK VOCAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;;
+1D211;GREEK VOCAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;;
+1D212;GREEK VOCAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;;
+1D213;GREEK VOCAL NOTATION SYMBOL-20;So;0;ON;;;;;N;;;;;
+1D214;GREEK VOCAL NOTATION SYMBOL-21;So;0;ON;;;;;N;;;;;
+1D215;GREEK VOCAL NOTATION SYMBOL-22;So;0;ON;;;;;N;;;;;
+1D216;GREEK VOCAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;;
+1D217;GREEK VOCAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;;
+1D218;GREEK VOCAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;;
+1D219;GREEK VOCAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;;
+1D21A;GREEK VOCAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;;
+1D21B;GREEK VOCAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;;
+1D21C;GREEK VOCAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;;
+1D21D;GREEK INSTRUMENTAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;;
+1D21E;GREEK INSTRUMENTAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;;
+1D21F;GREEK INSTRUMENTAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;;
+1D220;GREEK INSTRUMENTAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;;
+1D221;GREEK INSTRUMENTAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;;
+1D222;GREEK INSTRUMENTAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;;
+1D223;GREEK INSTRUMENTAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;;
+1D224;GREEK INSTRUMENTAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;;
+1D225;GREEK INSTRUMENTAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;;
+1D226;GREEK INSTRUMENTAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;;
+1D227;GREEK INSTRUMENTAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;;
+1D228;GREEK INSTRUMENTAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;;
+1D229;GREEK INSTRUMENTAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;;
+1D22A;GREEK INSTRUMENTAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;;
+1D22B;GREEK INSTRUMENTAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;;
+1D22C;GREEK INSTRUMENTAL NOTATION SYMBOL-25;So;0;ON;;;;;N;;;;;
+1D22D;GREEK INSTRUMENTAL NOTATION SYMBOL-26;So;0;ON;;;;;N;;;;;
+1D22E;GREEK INSTRUMENTAL NOTATION SYMBOL-27;So;0;ON;;;;;N;;;;;
+1D22F;GREEK INSTRUMENTAL NOTATION SYMBOL-29;So;0;ON;;;;;N;;;;;
+1D230;GREEK INSTRUMENTAL NOTATION SYMBOL-30;So;0;ON;;;;;N;;;;;
+1D231;GREEK INSTRUMENTAL NOTATION SYMBOL-32;So;0;ON;;;;;N;;;;;
+1D232;GREEK INSTRUMENTAL NOTATION SYMBOL-36;So;0;ON;;;;;N;;;;;
+1D233;GREEK INSTRUMENTAL NOTATION SYMBOL-37;So;0;ON;;;;;N;;;;;
+1D234;GREEK INSTRUMENTAL NOTATION SYMBOL-38;So;0;ON;;;;;N;;;;;
+1D235;GREEK INSTRUMENTAL NOTATION SYMBOL-39;So;0;ON;;;;;N;;;;;
+1D236;GREEK INSTRUMENTAL NOTATION SYMBOL-40;So;0;ON;;;;;N;;;;;
+1D237;GREEK INSTRUMENTAL NOTATION SYMBOL-42;So;0;ON;;;;;N;;;;;
+1D238;GREEK INSTRUMENTAL NOTATION SYMBOL-43;So;0;ON;;;;;N;;;;;
+1D239;GREEK INSTRUMENTAL NOTATION SYMBOL-45;So;0;ON;;;;;N;;;;;
+1D23A;GREEK INSTRUMENTAL NOTATION SYMBOL-47;So;0;ON;;;;;N;;;;;
+1D23B;GREEK INSTRUMENTAL NOTATION SYMBOL-48;So;0;ON;;;;;N;;;;;
+1D23C;GREEK INSTRUMENTAL NOTATION SYMBOL-49;So;0;ON;;;;;N;;;;;
+1D23D;GREEK INSTRUMENTAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;;
+1D23E;GREEK INSTRUMENTAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;;
+1D23F;GREEK INSTRUMENTAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;;
+1D240;GREEK INSTRUMENTAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;;
+1D241;GREEK INSTRUMENTAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;;
+1D242;COMBINING GREEK MUSICAL TRISEME;Mn;230;NSM;;;;;N;;;;;
+1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;;
+1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;;
+1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;;
+1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;;;;
+1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;;;;
+1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;;;;
+1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;;;;
+1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;;;;
+1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;;;;
+1D306;TETRAGRAM FOR CENTRE;So;0;ON;;;;;N;;;;;
+1D307;TETRAGRAM FOR FULL CIRCLE;So;0;ON;;;;;N;;;;;
+1D308;TETRAGRAM FOR MIRED;So;0;ON;;;;;N;;;;;
+1D309;TETRAGRAM FOR BARRIER;So;0;ON;;;;;N;;;;;
+1D30A;TETRAGRAM FOR KEEPING SMALL;So;0;ON;;;;;N;;;;;
+1D30B;TETRAGRAM FOR CONTRARIETY;So;0;ON;;;;;N;;;;;
+1D30C;TETRAGRAM FOR ASCENT;So;0;ON;;;;;N;;;;;
+1D30D;TETRAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;;
+1D30E;TETRAGRAM FOR BRANCHING OUT;So;0;ON;;;;;N;;;;;
+1D30F;TETRAGRAM FOR DEFECTIVENESS OR DISTORTION;So;0;ON;;;;;N;;;;;
+1D310;TETRAGRAM FOR DIVERGENCE;So;0;ON;;;;;N;;;;;
+1D311;TETRAGRAM FOR YOUTHFULNESS;So;0;ON;;;;;N;;;;;
+1D312;TETRAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;;
+1D313;TETRAGRAM FOR PENETRATION;So;0;ON;;;;;N;;;;;
+1D314;TETRAGRAM FOR REACH;So;0;ON;;;;;N;;;;;
+1D315;TETRAGRAM FOR CONTACT;So;0;ON;;;;;N;;;;;
+1D316;TETRAGRAM FOR HOLDING BACK;So;0;ON;;;;;N;;;;;
+1D317;TETRAGRAM FOR WAITING;So;0;ON;;;;;N;;;;;
+1D318;TETRAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;;
+1D319;TETRAGRAM FOR ADVANCE;So;0;ON;;;;;N;;;;;
+1D31A;TETRAGRAM FOR RELEASE;So;0;ON;;;;;N;;;;;
+1D31B;TETRAGRAM FOR RESISTANCE;So;0;ON;;;;;N;;;;;
+1D31C;TETRAGRAM FOR EASE;So;0;ON;;;;;N;;;;;
+1D31D;TETRAGRAM FOR JOY;So;0;ON;;;;;N;;;;;
+1D31E;TETRAGRAM FOR CONTENTION;So;0;ON;;;;;N;;;;;
+1D31F;TETRAGRAM FOR ENDEAVOUR;So;0;ON;;;;;N;;;;;
+1D320;TETRAGRAM FOR DUTIES;So;0;ON;;;;;N;;;;;
+1D321;TETRAGRAM FOR CHANGE;So;0;ON;;;;;N;;;;;
+1D322;TETRAGRAM FOR DECISIVENESS;So;0;ON;;;;;N;;;;;
+1D323;TETRAGRAM FOR BOLD RESOLUTION;So;0;ON;;;;;N;;;;;
+1D324;TETRAGRAM FOR PACKING;So;0;ON;;;;;N;;;;;
+1D325;TETRAGRAM FOR LEGION;So;0;ON;;;;;N;;;;;
+1D326;TETRAGRAM FOR CLOSENESS;So;0;ON;;;;;N;;;;;
+1D327;TETRAGRAM FOR KINSHIP;So;0;ON;;;;;N;;;;;
+1D328;TETRAGRAM FOR GATHERING;So;0;ON;;;;;N;;;;;
+1D329;TETRAGRAM FOR STRENGTH;So;0;ON;;;;;N;;;;;
+1D32A;TETRAGRAM FOR PURITY;So;0;ON;;;;;N;;;;;
+1D32B;TETRAGRAM FOR FULLNESS;So;0;ON;;;;;N;;;;;
+1D32C;TETRAGRAM FOR RESIDENCE;So;0;ON;;;;;N;;;;;
+1D32D;TETRAGRAM FOR LAW OR MODEL;So;0;ON;;;;;N;;;;;
+1D32E;TETRAGRAM FOR RESPONSE;So;0;ON;;;;;N;;;;;
+1D32F;TETRAGRAM FOR GOING TO MEET;So;0;ON;;;;;N;;;;;
+1D330;TETRAGRAM FOR ENCOUNTERS;So;0;ON;;;;;N;;;;;
+1D331;TETRAGRAM FOR STOVE;So;0;ON;;;;;N;;;;;
+1D332;TETRAGRAM FOR GREATNESS;So;0;ON;;;;;N;;;;;
+1D333;TETRAGRAM FOR ENLARGEMENT;So;0;ON;;;;;N;;;;;
+1D334;TETRAGRAM FOR PATTERN;So;0;ON;;;;;N;;;;;
+1D335;TETRAGRAM FOR RITUAL;So;0;ON;;;;;N;;;;;
+1D336;TETRAGRAM FOR FLIGHT;So;0;ON;;;;;N;;;;;
+1D337;TETRAGRAM FOR VASTNESS OR WASTING;So;0;ON;;;;;N;;;;;
+1D338;TETRAGRAM FOR CONSTANCY;So;0;ON;;;;;N;;;;;
+1D339;TETRAGRAM FOR MEASURE;So;0;ON;;;;;N;;;;;
+1D33A;TETRAGRAM FOR ETERNITY;So;0;ON;;;;;N;;;;;
+1D33B;TETRAGRAM FOR UNITY;So;0;ON;;;;;N;;;;;
+1D33C;TETRAGRAM FOR DIMINISHMENT;So;0;ON;;;;;N;;;;;
+1D33D;TETRAGRAM FOR CLOSED MOUTH;So;0;ON;;;;;N;;;;;
+1D33E;TETRAGRAM FOR GUARDEDNESS;So;0;ON;;;;;N;;;;;
+1D33F;TETRAGRAM FOR GATHERING IN;So;0;ON;;;;;N;;;;;
+1D340;TETRAGRAM FOR MASSING;So;0;ON;;;;;N;;;;;
+1D341;TETRAGRAM FOR ACCUMULATION;So;0;ON;;;;;N;;;;;
+1D342;TETRAGRAM FOR EMBELLISHMENT;So;0;ON;;;;;N;;;;;
+1D343;TETRAGRAM FOR DOUBT;So;0;ON;;;;;N;;;;;
+1D344;TETRAGRAM FOR WATCH;So;0;ON;;;;;N;;;;;
+1D345;TETRAGRAM FOR SINKING;So;0;ON;;;;;N;;;;;
+1D346;TETRAGRAM FOR INNER;So;0;ON;;;;;N;;;;;
+1D347;TETRAGRAM FOR DEPARTURE;So;0;ON;;;;;N;;;;;
+1D348;TETRAGRAM FOR DARKENING;So;0;ON;;;;;N;;;;;
+1D349;TETRAGRAM FOR DIMMING;So;0;ON;;;;;N;;;;;
+1D34A;TETRAGRAM FOR EXHAUSTION;So;0;ON;;;;;N;;;;;
+1D34B;TETRAGRAM FOR SEVERANCE;So;0;ON;;;;;N;;;;;
+1D34C;TETRAGRAM FOR STOPPAGE;So;0;ON;;;;;N;;;;;
+1D34D;TETRAGRAM FOR HARDNESS;So;0;ON;;;;;N;;;;;
+1D34E;TETRAGRAM FOR COMPLETION;So;0;ON;;;;;N;;;;;
+1D34F;TETRAGRAM FOR CLOSURE;So;0;ON;;;;;N;;;;;
+1D350;TETRAGRAM FOR FAILURE;So;0;ON;;;;;N;;;;;
+1D351;TETRAGRAM FOR AGGRAVATION;So;0;ON;;;;;N;;;;;
+1D352;TETRAGRAM FOR COMPLIANCE;So;0;ON;;;;;N;;;;;
+1D353;TETRAGRAM FOR ON THE VERGE;So;0;ON;;;;;N;;;;;
+1D354;TETRAGRAM FOR DIFFICULTIES;So;0;ON;;;;;N;;;;;
+1D355;TETRAGRAM FOR LABOURING;So;0;ON;;;;;N;;;;;
+1D356;TETRAGRAM FOR FOSTERING;So;0;ON;;;;;N;;;;;
+1D360;COUNTING ROD UNIT DIGIT ONE;No;0;L;;;;1;N;;;;;
+1D361;COUNTING ROD UNIT DIGIT TWO;No;0;L;;;;2;N;;;;;
+1D362;COUNTING ROD UNIT DIGIT THREE;No;0;L;;;;3;N;;;;;
+1D363;COUNTING ROD UNIT DIGIT FOUR;No;0;L;;;;4;N;;;;;
+1D364;COUNTING ROD UNIT DIGIT FIVE;No;0;L;;;;5;N;;;;;
+1D365;COUNTING ROD UNIT DIGIT SIX;No;0;L;;;;6;N;;;;;
+1D366;COUNTING ROD UNIT DIGIT SEVEN;No;0;L;;;;7;N;;;;;
+1D367;COUNTING ROD UNIT DIGIT EIGHT;No;0;L;;;;8;N;;;;;
+1D368;COUNTING ROD UNIT DIGIT NINE;No;0;L;;;;9;N;;;;;
+1D369;COUNTING ROD TENS DIGIT ONE;No;0;L;;;;10;N;;;;;
+1D36A;COUNTING ROD TENS DIGIT TWO;No;0;L;;;;20;N;;;;;
+1D36B;COUNTING ROD TENS DIGIT THREE;No;0;L;;;;30;N;;;;;
+1D36C;COUNTING ROD TENS DIGIT FOUR;No;0;L;;;;40;N;;;;;
+1D36D;COUNTING ROD TENS DIGIT FIVE;No;0;L;;;;50;N;;;;;
+1D36E;COUNTING ROD TENS DIGIT SIX;No;0;L;;;;60;N;;;;;
+1D36F;COUNTING ROD TENS DIGIT SEVEN;No;0;L;;;;70;N;;;;;
+1D370;COUNTING ROD TENS DIGIT EIGHT;No;0;L;;;;80;N;;;;;
+1D371;COUNTING ROD TENS DIGIT NINE;No;0;L;;;;90;N;;;;;
+1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D403;MATHEMATICAL BOLD CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D404;MATHEMATICAL BOLD CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D405;MATHEMATICAL BOLD CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D406;MATHEMATICAL BOLD CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D407;MATHEMATICAL BOLD CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D408;MATHEMATICAL BOLD CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D409;MATHEMATICAL BOLD CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D40A;MATHEMATICAL BOLD CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D40B;MATHEMATICAL BOLD CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D40C;MATHEMATICAL BOLD CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D40D;MATHEMATICAL BOLD CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D40E;MATHEMATICAL BOLD CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D40F;MATHEMATICAL BOLD CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D410;MATHEMATICAL BOLD CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D411;MATHEMATICAL BOLD CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D412;MATHEMATICAL BOLD CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D413;MATHEMATICAL BOLD CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D414;MATHEMATICAL BOLD CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D415;MATHEMATICAL BOLD CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D416;MATHEMATICAL BOLD CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D417;MATHEMATICAL BOLD CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D418;MATHEMATICAL BOLD CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D419;MATHEMATICAL BOLD CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D41A;MATHEMATICAL BOLD SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D41B;MATHEMATICAL BOLD SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D41C;MATHEMATICAL BOLD SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D41D;MATHEMATICAL BOLD SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D41E;MATHEMATICAL BOLD SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D41F;MATHEMATICAL BOLD SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D420;MATHEMATICAL BOLD SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D421;MATHEMATICAL BOLD SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D422;MATHEMATICAL BOLD SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D423;MATHEMATICAL BOLD SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D424;MATHEMATICAL BOLD SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D425;MATHEMATICAL BOLD SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D426;MATHEMATICAL BOLD SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D427;MATHEMATICAL BOLD SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D428;MATHEMATICAL BOLD SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D429;MATHEMATICAL BOLD SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D42A;MATHEMATICAL BOLD SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D42B;MATHEMATICAL BOLD SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D42C;MATHEMATICAL BOLD SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D42D;MATHEMATICAL BOLD SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D42E;MATHEMATICAL BOLD SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D42F;MATHEMATICAL BOLD SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D430;MATHEMATICAL BOLD SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D431;MATHEMATICAL BOLD SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D432;MATHEMATICAL BOLD SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D433;MATHEMATICAL BOLD SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D434;MATHEMATICAL ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D435;MATHEMATICAL ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D436;MATHEMATICAL ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D437;MATHEMATICAL ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D438;MATHEMATICAL ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D439;MATHEMATICAL ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D43A;MATHEMATICAL ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D43B;MATHEMATICAL ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D43C;MATHEMATICAL ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D43D;MATHEMATICAL ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D43E;MATHEMATICAL ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D43F;MATHEMATICAL ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D440;MATHEMATICAL ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D441;MATHEMATICAL ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D442;MATHEMATICAL ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D443;MATHEMATICAL ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D444;MATHEMATICAL ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D445;MATHEMATICAL ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D446;MATHEMATICAL ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D447;MATHEMATICAL ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D448;MATHEMATICAL ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D449;MATHEMATICAL ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D44A;MATHEMATICAL ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D44B;MATHEMATICAL ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D44C;MATHEMATICAL ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D44D;MATHEMATICAL ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D44E;MATHEMATICAL ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D44F;MATHEMATICAL ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D450;MATHEMATICAL ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D451;MATHEMATICAL ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D452;MATHEMATICAL ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D453;MATHEMATICAL ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D454;MATHEMATICAL ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D456;MATHEMATICAL ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D457;MATHEMATICAL ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D458;MATHEMATICAL ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D459;MATHEMATICAL ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D45A;MATHEMATICAL ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D45B;MATHEMATICAL ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D45C;MATHEMATICAL ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D45D;MATHEMATICAL ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D45E;MATHEMATICAL ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D45F;MATHEMATICAL ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D460;MATHEMATICAL ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D461;MATHEMATICAL ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D462;MATHEMATICAL ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D463;MATHEMATICAL ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D464;MATHEMATICAL ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D465;MATHEMATICAL ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D466;MATHEMATICAL ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D467;MATHEMATICAL ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D468;MATHEMATICAL BOLD ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D469;MATHEMATICAL BOLD ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D46A;MATHEMATICAL BOLD ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D46B;MATHEMATICAL BOLD ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D46C;MATHEMATICAL BOLD ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D46D;MATHEMATICAL BOLD ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D46E;MATHEMATICAL BOLD ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D46F;MATHEMATICAL BOLD ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D470;MATHEMATICAL BOLD ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D471;MATHEMATICAL BOLD ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D472;MATHEMATICAL BOLD ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D473;MATHEMATICAL BOLD ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D474;MATHEMATICAL BOLD ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D475;MATHEMATICAL BOLD ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D476;MATHEMATICAL BOLD ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D477;MATHEMATICAL BOLD ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D478;MATHEMATICAL BOLD ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D479;MATHEMATICAL BOLD ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D47A;MATHEMATICAL BOLD ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D47B;MATHEMATICAL BOLD ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D47C;MATHEMATICAL BOLD ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D47D;MATHEMATICAL BOLD ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D47E;MATHEMATICAL BOLD ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D47F;MATHEMATICAL BOLD ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D480;MATHEMATICAL BOLD ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D481;MATHEMATICAL BOLD ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D482;MATHEMATICAL BOLD ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D483;MATHEMATICAL BOLD ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D484;MATHEMATICAL BOLD ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D485;MATHEMATICAL BOLD ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D486;MATHEMATICAL BOLD ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D487;MATHEMATICAL BOLD ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D488;MATHEMATICAL BOLD ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D489;MATHEMATICAL BOLD ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D48A;MATHEMATICAL BOLD ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D48B;MATHEMATICAL BOLD ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D48C;MATHEMATICAL BOLD ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D48D;MATHEMATICAL BOLD ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D48E;MATHEMATICAL BOLD ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D48F;MATHEMATICAL BOLD ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D490;MATHEMATICAL BOLD ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D491;MATHEMATICAL BOLD ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D492;MATHEMATICAL BOLD ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D493;MATHEMATICAL BOLD ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D494;MATHEMATICAL BOLD ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D495;MATHEMATICAL BOLD ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D496;MATHEMATICAL BOLD ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D497;MATHEMATICAL BOLD ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D498;MATHEMATICAL BOLD ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D499;MATHEMATICAL BOLD ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D49A;MATHEMATICAL BOLD ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D49B;MATHEMATICAL BOLD ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D49C;MATHEMATICAL SCRIPT CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D49E;MATHEMATICAL SCRIPT CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D49F;MATHEMATICAL SCRIPT CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D4A2;MATHEMATICAL SCRIPT CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D4A5;MATHEMATICAL SCRIPT CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D4A6;MATHEMATICAL SCRIPT CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D4A9;MATHEMATICAL SCRIPT CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D4AA;MATHEMATICAL SCRIPT CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D4AB;MATHEMATICAL SCRIPT CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D4AC;MATHEMATICAL SCRIPT CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D4AE;MATHEMATICAL SCRIPT CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D4AF;MATHEMATICAL SCRIPT CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D4B0;MATHEMATICAL SCRIPT CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D4B1;MATHEMATICAL SCRIPT CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D4B2;MATHEMATICAL SCRIPT CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D4B3;MATHEMATICAL SCRIPT CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D4B4;MATHEMATICAL SCRIPT CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D4B5;MATHEMATICAL SCRIPT CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D4B6;MATHEMATICAL SCRIPT SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D4B7;MATHEMATICAL SCRIPT SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D4B8;MATHEMATICAL SCRIPT SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D4B9;MATHEMATICAL SCRIPT SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D4BB;MATHEMATICAL SCRIPT SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D4BD;MATHEMATICAL SCRIPT SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D4BE;MATHEMATICAL SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D4BF;MATHEMATICAL SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D4C0;MATHEMATICAL SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D4C1;MATHEMATICAL SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D4C2;MATHEMATICAL SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D4C3;MATHEMATICAL SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D4C5;MATHEMATICAL SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D4C6;MATHEMATICAL SCRIPT SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D4C7;MATHEMATICAL SCRIPT SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D4C8;MATHEMATICAL SCRIPT SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D4C9;MATHEMATICAL SCRIPT SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D4CA;MATHEMATICAL SCRIPT SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D4CB;MATHEMATICAL SCRIPT SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D4CC;MATHEMATICAL SCRIPT SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D4CD;MATHEMATICAL SCRIPT SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D4CE;MATHEMATICAL SCRIPT SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D4CF;MATHEMATICAL SCRIPT SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D4D0;MATHEMATICAL BOLD SCRIPT CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D4D1;MATHEMATICAL BOLD SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D4D2;MATHEMATICAL BOLD SCRIPT CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D4D3;MATHEMATICAL BOLD SCRIPT CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D4D4;MATHEMATICAL BOLD SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D4D5;MATHEMATICAL BOLD SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D4D6;MATHEMATICAL BOLD SCRIPT CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D4D7;MATHEMATICAL BOLD SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D4D8;MATHEMATICAL BOLD SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D4D9;MATHEMATICAL BOLD SCRIPT CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D4DA;MATHEMATICAL BOLD SCRIPT CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D4DB;MATHEMATICAL BOLD SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D4DC;MATHEMATICAL BOLD SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D4DD;MATHEMATICAL BOLD SCRIPT CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D4DE;MATHEMATICAL BOLD SCRIPT CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D4DF;MATHEMATICAL BOLD SCRIPT CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D4E0;MATHEMATICAL BOLD SCRIPT CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D4E1;MATHEMATICAL BOLD SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D4E2;MATHEMATICAL BOLD SCRIPT CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D4E3;MATHEMATICAL BOLD SCRIPT CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D4E4;MATHEMATICAL BOLD SCRIPT CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D4E5;MATHEMATICAL BOLD SCRIPT CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D4E6;MATHEMATICAL BOLD SCRIPT CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D4E7;MATHEMATICAL BOLD SCRIPT CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D4E8;MATHEMATICAL BOLD SCRIPT CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D4E9;MATHEMATICAL BOLD SCRIPT CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D4EA;MATHEMATICAL BOLD SCRIPT SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D4EB;MATHEMATICAL BOLD SCRIPT SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D4EC;MATHEMATICAL BOLD SCRIPT SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D4ED;MATHEMATICAL BOLD SCRIPT SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D4EE;MATHEMATICAL BOLD SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D4EF;MATHEMATICAL BOLD SCRIPT SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D4F0;MATHEMATICAL BOLD SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D4F1;MATHEMATICAL BOLD SCRIPT SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D4F2;MATHEMATICAL BOLD SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D4F3;MATHEMATICAL BOLD SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D4F4;MATHEMATICAL BOLD SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D4F5;MATHEMATICAL BOLD SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D4F6;MATHEMATICAL BOLD SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D4F7;MATHEMATICAL BOLD SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D4F8;MATHEMATICAL BOLD SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D4F9;MATHEMATICAL BOLD SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D4FA;MATHEMATICAL BOLD SCRIPT SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D4FB;MATHEMATICAL BOLD SCRIPT SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D4FC;MATHEMATICAL BOLD SCRIPT SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D4FD;MATHEMATICAL BOLD SCRIPT SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D4FE;MATHEMATICAL BOLD SCRIPT SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D4FF;MATHEMATICAL BOLD SCRIPT SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D500;MATHEMATICAL BOLD SCRIPT SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D501;MATHEMATICAL BOLD SCRIPT SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D502;MATHEMATICAL BOLD SCRIPT SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D503;MATHEMATICAL BOLD SCRIPT SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D504;MATHEMATICAL FRAKTUR CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D505;MATHEMATICAL FRAKTUR CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D507;MATHEMATICAL FRAKTUR CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D508;MATHEMATICAL FRAKTUR CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D509;MATHEMATICAL FRAKTUR CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D50A;MATHEMATICAL FRAKTUR CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D50D;MATHEMATICAL FRAKTUR CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D50E;MATHEMATICAL FRAKTUR CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D50F;MATHEMATICAL FRAKTUR CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D510;MATHEMATICAL FRAKTUR CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D511;MATHEMATICAL FRAKTUR CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D512;MATHEMATICAL FRAKTUR CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D513;MATHEMATICAL FRAKTUR CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D514;MATHEMATICAL FRAKTUR CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D516;MATHEMATICAL FRAKTUR CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D517;MATHEMATICAL FRAKTUR CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D518;MATHEMATICAL FRAKTUR CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D519;MATHEMATICAL FRAKTUR CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D51A;MATHEMATICAL FRAKTUR CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D51B;MATHEMATICAL FRAKTUR CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D51C;MATHEMATICAL FRAKTUR CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D51E;MATHEMATICAL FRAKTUR SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D51F;MATHEMATICAL FRAKTUR SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D520;MATHEMATICAL FRAKTUR SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D521;MATHEMATICAL FRAKTUR SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D522;MATHEMATICAL FRAKTUR SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D523;MATHEMATICAL FRAKTUR SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D524;MATHEMATICAL FRAKTUR SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D525;MATHEMATICAL FRAKTUR SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D526;MATHEMATICAL FRAKTUR SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D527;MATHEMATICAL FRAKTUR SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D528;MATHEMATICAL FRAKTUR SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D529;MATHEMATICAL FRAKTUR SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D52A;MATHEMATICAL FRAKTUR SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D52B;MATHEMATICAL FRAKTUR SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D52C;MATHEMATICAL FRAKTUR SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D52D;MATHEMATICAL FRAKTUR SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D52E;MATHEMATICAL FRAKTUR SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D52F;MATHEMATICAL FRAKTUR SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D530;MATHEMATICAL FRAKTUR SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D531;MATHEMATICAL FRAKTUR SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D532;MATHEMATICAL FRAKTUR SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D533;MATHEMATICAL FRAKTUR SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D534;MATHEMATICAL FRAKTUR SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D535;MATHEMATICAL FRAKTUR SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D536;MATHEMATICAL FRAKTUR SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D537;MATHEMATICAL FRAKTUR SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D538;MATHEMATICAL DOUBLE-STRUCK CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D539;MATHEMATICAL DOUBLE-STRUCK CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D53B;MATHEMATICAL DOUBLE-STRUCK CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D53C;MATHEMATICAL DOUBLE-STRUCK CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D53D;MATHEMATICAL DOUBLE-STRUCK CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D53E;MATHEMATICAL DOUBLE-STRUCK CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D540;MATHEMATICAL DOUBLE-STRUCK CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D541;MATHEMATICAL DOUBLE-STRUCK CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D542;MATHEMATICAL DOUBLE-STRUCK CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D543;MATHEMATICAL DOUBLE-STRUCK CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D544;MATHEMATICAL DOUBLE-STRUCK CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D546;MATHEMATICAL DOUBLE-STRUCK CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D54A;MATHEMATICAL DOUBLE-STRUCK CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D54B;MATHEMATICAL DOUBLE-STRUCK CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D54C;MATHEMATICAL DOUBLE-STRUCK CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D54D;MATHEMATICAL DOUBLE-STRUCK CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D54E;MATHEMATICAL DOUBLE-STRUCK CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D54F;MATHEMATICAL DOUBLE-STRUCK CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D550;MATHEMATICAL DOUBLE-STRUCK CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D552;MATHEMATICAL DOUBLE-STRUCK SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D553;MATHEMATICAL DOUBLE-STRUCK SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D554;MATHEMATICAL DOUBLE-STRUCK SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D555;MATHEMATICAL DOUBLE-STRUCK SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D556;MATHEMATICAL DOUBLE-STRUCK SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D557;MATHEMATICAL DOUBLE-STRUCK SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D558;MATHEMATICAL DOUBLE-STRUCK SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D559;MATHEMATICAL DOUBLE-STRUCK SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D55A;MATHEMATICAL DOUBLE-STRUCK SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D55B;MATHEMATICAL DOUBLE-STRUCK SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D55C;MATHEMATICAL DOUBLE-STRUCK SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D55D;MATHEMATICAL DOUBLE-STRUCK SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D55E;MATHEMATICAL DOUBLE-STRUCK SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D55F;MATHEMATICAL DOUBLE-STRUCK SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D560;MATHEMATICAL DOUBLE-STRUCK SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D561;MATHEMATICAL DOUBLE-STRUCK SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D562;MATHEMATICAL DOUBLE-STRUCK SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D563;MATHEMATICAL DOUBLE-STRUCK SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D564;MATHEMATICAL DOUBLE-STRUCK SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D565;MATHEMATICAL DOUBLE-STRUCK SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D566;MATHEMATICAL DOUBLE-STRUCK SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D567;MATHEMATICAL DOUBLE-STRUCK SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D568;MATHEMATICAL DOUBLE-STRUCK SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D569;MATHEMATICAL DOUBLE-STRUCK SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D56A;MATHEMATICAL DOUBLE-STRUCK SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D56B;MATHEMATICAL DOUBLE-STRUCK SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D56C;MATHEMATICAL BOLD FRAKTUR CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D56D;MATHEMATICAL BOLD FRAKTUR CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D56E;MATHEMATICAL BOLD FRAKTUR CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D56F;MATHEMATICAL BOLD FRAKTUR CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D570;MATHEMATICAL BOLD FRAKTUR CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D571;MATHEMATICAL BOLD FRAKTUR CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D572;MATHEMATICAL BOLD FRAKTUR CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D573;MATHEMATICAL BOLD FRAKTUR CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D574;MATHEMATICAL BOLD FRAKTUR CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D575;MATHEMATICAL BOLD FRAKTUR CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D576;MATHEMATICAL BOLD FRAKTUR CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D577;MATHEMATICAL BOLD FRAKTUR CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D578;MATHEMATICAL BOLD FRAKTUR CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D579;MATHEMATICAL BOLD FRAKTUR CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D57A;MATHEMATICAL BOLD FRAKTUR CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D57B;MATHEMATICAL BOLD FRAKTUR CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D57C;MATHEMATICAL BOLD FRAKTUR CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D57D;MATHEMATICAL BOLD FRAKTUR CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D57E;MATHEMATICAL BOLD FRAKTUR CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D57F;MATHEMATICAL BOLD FRAKTUR CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D580;MATHEMATICAL BOLD FRAKTUR CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D581;MATHEMATICAL BOLD FRAKTUR CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D582;MATHEMATICAL BOLD FRAKTUR CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D583;MATHEMATICAL BOLD FRAKTUR CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D584;MATHEMATICAL BOLD FRAKTUR CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D585;MATHEMATICAL BOLD FRAKTUR CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D586;MATHEMATICAL BOLD FRAKTUR SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D587;MATHEMATICAL BOLD FRAKTUR SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D588;MATHEMATICAL BOLD FRAKTUR SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D589;MATHEMATICAL BOLD FRAKTUR SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D58A;MATHEMATICAL BOLD FRAKTUR SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D58B;MATHEMATICAL BOLD FRAKTUR SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D58C;MATHEMATICAL BOLD FRAKTUR SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D58D;MATHEMATICAL BOLD FRAKTUR SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D58E;MATHEMATICAL BOLD FRAKTUR SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D58F;MATHEMATICAL BOLD FRAKTUR SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D590;MATHEMATICAL BOLD FRAKTUR SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D591;MATHEMATICAL BOLD FRAKTUR SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D592;MATHEMATICAL BOLD FRAKTUR SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D593;MATHEMATICAL BOLD FRAKTUR SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D594;MATHEMATICAL BOLD FRAKTUR SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D595;MATHEMATICAL BOLD FRAKTUR SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D596;MATHEMATICAL BOLD FRAKTUR SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D597;MATHEMATICAL BOLD FRAKTUR SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D598;MATHEMATICAL BOLD FRAKTUR SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D599;MATHEMATICAL BOLD FRAKTUR SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D59A;MATHEMATICAL BOLD FRAKTUR SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D59B;MATHEMATICAL BOLD FRAKTUR SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D59C;MATHEMATICAL BOLD FRAKTUR SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D59D;MATHEMATICAL BOLD FRAKTUR SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D59E;MATHEMATICAL BOLD FRAKTUR SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D59F;MATHEMATICAL BOLD FRAKTUR SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D5A0;MATHEMATICAL SANS-SERIF CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D5A1;MATHEMATICAL SANS-SERIF CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D5A2;MATHEMATICAL SANS-SERIF CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D5A3;MATHEMATICAL SANS-SERIF CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D5A4;MATHEMATICAL SANS-SERIF CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D5A5;MATHEMATICAL SANS-SERIF CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D5A6;MATHEMATICAL SANS-SERIF CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D5A7;MATHEMATICAL SANS-SERIF CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D5A8;MATHEMATICAL SANS-SERIF CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D5A9;MATHEMATICAL SANS-SERIF CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D5AA;MATHEMATICAL SANS-SERIF CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D5AB;MATHEMATICAL SANS-SERIF CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D5AC;MATHEMATICAL SANS-SERIF CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D5AD;MATHEMATICAL SANS-SERIF CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D5AE;MATHEMATICAL SANS-SERIF CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D5AF;MATHEMATICAL SANS-SERIF CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D5B0;MATHEMATICAL SANS-SERIF CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D5B1;MATHEMATICAL SANS-SERIF CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D5B2;MATHEMATICAL SANS-SERIF CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D5B3;MATHEMATICAL SANS-SERIF CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D5B4;MATHEMATICAL SANS-SERIF CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D5B5;MATHEMATICAL SANS-SERIF CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D5B6;MATHEMATICAL SANS-SERIF CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D5B7;MATHEMATICAL SANS-SERIF CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D5B8;MATHEMATICAL SANS-SERIF CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D5B9;MATHEMATICAL SANS-SERIF CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D5BA;MATHEMATICAL SANS-SERIF SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D5BB;MATHEMATICAL SANS-SERIF SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D5BC;MATHEMATICAL SANS-SERIF SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D5BD;MATHEMATICAL SANS-SERIF SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D5BE;MATHEMATICAL SANS-SERIF SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D5BF;MATHEMATICAL SANS-SERIF SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D5C0;MATHEMATICAL SANS-SERIF SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D5C1;MATHEMATICAL SANS-SERIF SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D5C2;MATHEMATICAL SANS-SERIF SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D5C3;MATHEMATICAL SANS-SERIF SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D5C4;MATHEMATICAL SANS-SERIF SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D5C5;MATHEMATICAL SANS-SERIF SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D5C6;MATHEMATICAL SANS-SERIF SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D5C7;MATHEMATICAL SANS-SERIF SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D5C8;MATHEMATICAL SANS-SERIF SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D5C9;MATHEMATICAL SANS-SERIF SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D5CA;MATHEMATICAL SANS-SERIF SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D5CB;MATHEMATICAL SANS-SERIF SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D5CC;MATHEMATICAL SANS-SERIF SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D5CD;MATHEMATICAL SANS-SERIF SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D5CE;MATHEMATICAL SANS-SERIF SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D5CF;MATHEMATICAL SANS-SERIF SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D5D0;MATHEMATICAL SANS-SERIF SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D5D1;MATHEMATICAL SANS-SERIF SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D5D2;MATHEMATICAL SANS-SERIF SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D5D3;MATHEMATICAL SANS-SERIF SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D5D4;MATHEMATICAL SANS-SERIF BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D5D5;MATHEMATICAL SANS-SERIF BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D5D6;MATHEMATICAL SANS-SERIF BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D5D7;MATHEMATICAL SANS-SERIF BOLD CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D5D8;MATHEMATICAL SANS-SERIF BOLD CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D5D9;MATHEMATICAL SANS-SERIF BOLD CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D5DA;MATHEMATICAL SANS-SERIF BOLD CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D5DB;MATHEMATICAL SANS-SERIF BOLD CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D5DC;MATHEMATICAL SANS-SERIF BOLD CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D5DD;MATHEMATICAL SANS-SERIF BOLD CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D5DE;MATHEMATICAL SANS-SERIF BOLD CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D5DF;MATHEMATICAL SANS-SERIF BOLD CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D5E0;MATHEMATICAL SANS-SERIF BOLD CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D5E1;MATHEMATICAL SANS-SERIF BOLD CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D5E2;MATHEMATICAL SANS-SERIF BOLD CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D5E3;MATHEMATICAL SANS-SERIF BOLD CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D5E4;MATHEMATICAL SANS-SERIF BOLD CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D5E5;MATHEMATICAL SANS-SERIF BOLD CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D5E6;MATHEMATICAL SANS-SERIF BOLD CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D5E7;MATHEMATICAL SANS-SERIF BOLD CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D5E8;MATHEMATICAL SANS-SERIF BOLD CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D5E9;MATHEMATICAL SANS-SERIF BOLD CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D5EA;MATHEMATICAL SANS-SERIF BOLD CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D5EB;MATHEMATICAL SANS-SERIF BOLD CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D5EC;MATHEMATICAL SANS-SERIF BOLD CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D5ED;MATHEMATICAL SANS-SERIF BOLD CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D5EE;MATHEMATICAL SANS-SERIF BOLD SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D5EF;MATHEMATICAL SANS-SERIF BOLD SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D5F0;MATHEMATICAL SANS-SERIF BOLD SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D5F1;MATHEMATICAL SANS-SERIF BOLD SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D5F2;MATHEMATICAL SANS-SERIF BOLD SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D5F3;MATHEMATICAL SANS-SERIF BOLD SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D5F4;MATHEMATICAL SANS-SERIF BOLD SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D5F5;MATHEMATICAL SANS-SERIF BOLD SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D5F6;MATHEMATICAL SANS-SERIF BOLD SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D5F7;MATHEMATICAL SANS-SERIF BOLD SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D5F8;MATHEMATICAL SANS-SERIF BOLD SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D5F9;MATHEMATICAL SANS-SERIF BOLD SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D5FA;MATHEMATICAL SANS-SERIF BOLD SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D5FB;MATHEMATICAL SANS-SERIF BOLD SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D5FC;MATHEMATICAL SANS-SERIF BOLD SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D5FD;MATHEMATICAL SANS-SERIF BOLD SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D5FE;MATHEMATICAL SANS-SERIF BOLD SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D5FF;MATHEMATICAL SANS-SERIF BOLD SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D600;MATHEMATICAL SANS-SERIF BOLD SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D601;MATHEMATICAL SANS-SERIF BOLD SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D602;MATHEMATICAL SANS-SERIF BOLD SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D603;MATHEMATICAL SANS-SERIF BOLD SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D604;MATHEMATICAL SANS-SERIF BOLD SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D605;MATHEMATICAL SANS-SERIF BOLD SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D606;MATHEMATICAL SANS-SERIF BOLD SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D607;MATHEMATICAL SANS-SERIF BOLD SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D608;MATHEMATICAL SANS-SERIF ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D609;MATHEMATICAL SANS-SERIF ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D60A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D60B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D60C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D60D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D60E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D60F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D610;MATHEMATICAL SANS-SERIF ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D611;MATHEMATICAL SANS-SERIF ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D612;MATHEMATICAL SANS-SERIF ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D613;MATHEMATICAL SANS-SERIF ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D614;MATHEMATICAL SANS-SERIF ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D615;MATHEMATICAL SANS-SERIF ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D616;MATHEMATICAL SANS-SERIF ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D617;MATHEMATICAL SANS-SERIF ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D618;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D619;MATHEMATICAL SANS-SERIF ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D61A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D61B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D61C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D61D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D61E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D61F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D620;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D621;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D622;MATHEMATICAL SANS-SERIF ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D623;MATHEMATICAL SANS-SERIF ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D624;MATHEMATICAL SANS-SERIF ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D625;MATHEMATICAL SANS-SERIF ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D626;MATHEMATICAL SANS-SERIF ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D627;MATHEMATICAL SANS-SERIF ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D628;MATHEMATICAL SANS-SERIF ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D629;MATHEMATICAL SANS-SERIF ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D62A;MATHEMATICAL SANS-SERIF ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D62B;MATHEMATICAL SANS-SERIF ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D62C;MATHEMATICAL SANS-SERIF ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D62D;MATHEMATICAL SANS-SERIF ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D62E;MATHEMATICAL SANS-SERIF ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D62F;MATHEMATICAL SANS-SERIF ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D630;MATHEMATICAL SANS-SERIF ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D631;MATHEMATICAL SANS-SERIF ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D632;MATHEMATICAL SANS-SERIF ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D633;MATHEMATICAL SANS-SERIF ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D634;MATHEMATICAL SANS-SERIF ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D635;MATHEMATICAL SANS-SERIF ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D636;MATHEMATICAL SANS-SERIF ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D637;MATHEMATICAL SANS-SERIF ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D638;MATHEMATICAL SANS-SERIF ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D639;MATHEMATICAL SANS-SERIF ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D63A;MATHEMATICAL SANS-SERIF ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D63B;MATHEMATICAL SANS-SERIF ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D63C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D63D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D63E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D63F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D640;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D641;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D642;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D643;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D644;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D645;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D646;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D647;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D648;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D649;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D64A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D64B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D64C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D64D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D64E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D64F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D650;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D651;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D652;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D653;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D654;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D655;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D656;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D657;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D658;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D659;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D65A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D65B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D65C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D65D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D65E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D65F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D660;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D661;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D662;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D663;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D664;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D665;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D666;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D667;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D668;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D669;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D66A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D66B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D66C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D66D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D66E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D66F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D670;MATHEMATICAL MONOSPACE CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D671;MATHEMATICAL MONOSPACE CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D672;MATHEMATICAL MONOSPACE CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D673;MATHEMATICAL MONOSPACE CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D674;MATHEMATICAL MONOSPACE CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D675;MATHEMATICAL MONOSPACE CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D676;MATHEMATICAL MONOSPACE CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D677;MATHEMATICAL MONOSPACE CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D678;MATHEMATICAL MONOSPACE CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D679;MATHEMATICAL MONOSPACE CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D67A;MATHEMATICAL MONOSPACE CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D67B;MATHEMATICAL MONOSPACE CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D67C;MATHEMATICAL MONOSPACE CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D67D;MATHEMATICAL MONOSPACE CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D67E;MATHEMATICAL MONOSPACE CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D67F;MATHEMATICAL MONOSPACE CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D680;MATHEMATICAL MONOSPACE CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D681;MATHEMATICAL MONOSPACE CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D682;MATHEMATICAL MONOSPACE CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D683;MATHEMATICAL MONOSPACE CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D684;MATHEMATICAL MONOSPACE CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D685;MATHEMATICAL MONOSPACE CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D686;MATHEMATICAL MONOSPACE CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D687;MATHEMATICAL MONOSPACE CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D688;MATHEMATICAL MONOSPACE CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D689;MATHEMATICAL MONOSPACE CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D68A;MATHEMATICAL MONOSPACE SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D68B;MATHEMATICAL MONOSPACE SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D68C;MATHEMATICAL MONOSPACE SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D68D;MATHEMATICAL MONOSPACE SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D68E;MATHEMATICAL MONOSPACE SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D68F;MATHEMATICAL MONOSPACE SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D690;MATHEMATICAL MONOSPACE SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D691;MATHEMATICAL MONOSPACE SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D692;MATHEMATICAL MONOSPACE SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D693;MATHEMATICAL MONOSPACE SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D694;MATHEMATICAL MONOSPACE SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D695;MATHEMATICAL MONOSPACE SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D696;MATHEMATICAL MONOSPACE SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D697;MATHEMATICAL MONOSPACE SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D698;MATHEMATICAL MONOSPACE SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D699;MATHEMATICAL MONOSPACE SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D69A;MATHEMATICAL MONOSPACE SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D69B;MATHEMATICAL MONOSPACE SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D69C;MATHEMATICAL MONOSPACE SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D69D;MATHEMATICAL MONOSPACE SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D69E;MATHEMATICAL MONOSPACE SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D69F;MATHEMATICAL MONOSPACE SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D6A0;MATHEMATICAL MONOSPACE SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D6A1;MATHEMATICAL MONOSPACE SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D6A2;MATHEMATICAL MONOSPACE SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D6A4;MATHEMATICAL ITALIC SMALL DOTLESS I;Ll;0;L;<font> 0131;;;;N;;;;;
+1D6A5;MATHEMATICAL ITALIC SMALL DOTLESS J;Ll;0;L;<font> 0237;;;;N;;;;;
+1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D6A9;MATHEMATICAL BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D6AA;MATHEMATICAL BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D6AB;MATHEMATICAL BOLD CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D6AC;MATHEMATICAL BOLD CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D6AD;MATHEMATICAL BOLD CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D6AE;MATHEMATICAL BOLD CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D6AF;MATHEMATICAL BOLD CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D6B0;MATHEMATICAL BOLD CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D6B1;MATHEMATICAL BOLD CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D6B2;MATHEMATICAL BOLD CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D6B3;MATHEMATICAL BOLD CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D6B4;MATHEMATICAL BOLD CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D6B5;MATHEMATICAL BOLD CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D6B6;MATHEMATICAL BOLD CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D6B7;MATHEMATICAL BOLD CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D6B8;MATHEMATICAL BOLD CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D6B9;MATHEMATICAL BOLD CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D6BA;MATHEMATICAL BOLD CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D6BB;MATHEMATICAL BOLD CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D6BC;MATHEMATICAL BOLD CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D6BD;MATHEMATICAL BOLD CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D6BE;MATHEMATICAL BOLD CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D6BF;MATHEMATICAL BOLD CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D6C0;MATHEMATICAL BOLD CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D6C1;MATHEMATICAL BOLD NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D6C2;MATHEMATICAL BOLD SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D6C3;MATHEMATICAL BOLD SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D6C4;MATHEMATICAL BOLD SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D6C5;MATHEMATICAL BOLD SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D6C6;MATHEMATICAL BOLD SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D6C7;MATHEMATICAL BOLD SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D6C8;MATHEMATICAL BOLD SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D6C9;MATHEMATICAL BOLD SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D6CA;MATHEMATICAL BOLD SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D6CB;MATHEMATICAL BOLD SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D6CC;MATHEMATICAL BOLD SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D6CD;MATHEMATICAL BOLD SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D6CE;MATHEMATICAL BOLD SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D6CF;MATHEMATICAL BOLD SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D6D0;MATHEMATICAL BOLD SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D6D1;MATHEMATICAL BOLD SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D6D2;MATHEMATICAL BOLD SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D6D3;MATHEMATICAL BOLD SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D6D4;MATHEMATICAL BOLD SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D6D5;MATHEMATICAL BOLD SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D6D6;MATHEMATICAL BOLD SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D6D7;MATHEMATICAL BOLD SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D6D8;MATHEMATICAL BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D6D9;MATHEMATICAL BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D6DA;MATHEMATICAL BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;;
+1D6DC;MATHEMATICAL BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D6DD;MATHEMATICAL BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D6DE;MATHEMATICAL BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D6DF;MATHEMATICAL BOLD PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D6E0;MATHEMATICAL BOLD RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D6E1;MATHEMATICAL BOLD PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D6E2;MATHEMATICAL ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D6E3;MATHEMATICAL ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D6E4;MATHEMATICAL ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D6E5;MATHEMATICAL ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D6E6;MATHEMATICAL ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D6E7;MATHEMATICAL ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D6E8;MATHEMATICAL ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D6E9;MATHEMATICAL ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D6EA;MATHEMATICAL ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D6EB;MATHEMATICAL ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D6EC;MATHEMATICAL ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D6ED;MATHEMATICAL ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D6EE;MATHEMATICAL ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D6EF;MATHEMATICAL ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D6F0;MATHEMATICAL ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D6F1;MATHEMATICAL ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D6F2;MATHEMATICAL ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D6F3;MATHEMATICAL ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D6F4;MATHEMATICAL ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D6F5;MATHEMATICAL ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D6F6;MATHEMATICAL ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D6F7;MATHEMATICAL ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D6F8;MATHEMATICAL ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D6F9;MATHEMATICAL ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D6FA;MATHEMATICAL ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D6FB;MATHEMATICAL ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D6FC;MATHEMATICAL ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D6FD;MATHEMATICAL ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D6FE;MATHEMATICAL ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D6FF;MATHEMATICAL ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D700;MATHEMATICAL ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D701;MATHEMATICAL ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D702;MATHEMATICAL ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D703;MATHEMATICAL ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D704;MATHEMATICAL ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D705;MATHEMATICAL ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D706;MATHEMATICAL ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D707;MATHEMATICAL ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D708;MATHEMATICAL ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D709;MATHEMATICAL ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D70A;MATHEMATICAL ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D70B;MATHEMATICAL ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D70C;MATHEMATICAL ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D70D;MATHEMATICAL ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D70E;MATHEMATICAL ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D70F;MATHEMATICAL ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D710;MATHEMATICAL ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D711;MATHEMATICAL ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D712;MATHEMATICAL ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D713;MATHEMATICAL ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D714;MATHEMATICAL ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;;
+1D716;MATHEMATICAL ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D717;MATHEMATICAL ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D718;MATHEMATICAL ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D719;MATHEMATICAL ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D71A;MATHEMATICAL ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D71B;MATHEMATICAL ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D71C;MATHEMATICAL BOLD ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D71D;MATHEMATICAL BOLD ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D71E;MATHEMATICAL BOLD ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D71F;MATHEMATICAL BOLD ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D720;MATHEMATICAL BOLD ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D721;MATHEMATICAL BOLD ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D722;MATHEMATICAL BOLD ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D723;MATHEMATICAL BOLD ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D724;MATHEMATICAL BOLD ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D725;MATHEMATICAL BOLD ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D726;MATHEMATICAL BOLD ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D727;MATHEMATICAL BOLD ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D728;MATHEMATICAL BOLD ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D729;MATHEMATICAL BOLD ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D72A;MATHEMATICAL BOLD ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D72B;MATHEMATICAL BOLD ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D72C;MATHEMATICAL BOLD ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D72D;MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D72E;MATHEMATICAL BOLD ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D72F;MATHEMATICAL BOLD ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D730;MATHEMATICAL BOLD ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D731;MATHEMATICAL BOLD ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D732;MATHEMATICAL BOLD ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D733;MATHEMATICAL BOLD ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D734;MATHEMATICAL BOLD ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D735;MATHEMATICAL BOLD ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D736;MATHEMATICAL BOLD ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D737;MATHEMATICAL BOLD ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D738;MATHEMATICAL BOLD ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D739;MATHEMATICAL BOLD ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D73A;MATHEMATICAL BOLD ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D73B;MATHEMATICAL BOLD ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D73C;MATHEMATICAL BOLD ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D73D;MATHEMATICAL BOLD ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D73E;MATHEMATICAL BOLD ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D73F;MATHEMATICAL BOLD ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D740;MATHEMATICAL BOLD ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D741;MATHEMATICAL BOLD ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D742;MATHEMATICAL BOLD ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D743;MATHEMATICAL BOLD ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D744;MATHEMATICAL BOLD ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D745;MATHEMATICAL BOLD ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D746;MATHEMATICAL BOLD ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D747;MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D748;MATHEMATICAL BOLD ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D749;MATHEMATICAL BOLD ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D74A;MATHEMATICAL BOLD ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D74B;MATHEMATICAL BOLD ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D74C;MATHEMATICAL BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D74D;MATHEMATICAL BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D74E;MATHEMATICAL BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;;
+1D750;MATHEMATICAL BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D751;MATHEMATICAL BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D752;MATHEMATICAL BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D753;MATHEMATICAL BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D754;MATHEMATICAL BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D755;MATHEMATICAL BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D756;MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D757;MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D758;MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D759;MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D75A;MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D75B;MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D75C;MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D75D;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D75E;MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D75F;MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D760;MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D761;MATHEMATICAL SANS-SERIF BOLD CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D762;MATHEMATICAL SANS-SERIF BOLD CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D763;MATHEMATICAL SANS-SERIF BOLD CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D764;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D765;MATHEMATICAL SANS-SERIF BOLD CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D766;MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D767;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D768;MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D769;MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D76A;MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D76B;MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D76C;MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D76D;MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D76E;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D76F;MATHEMATICAL SANS-SERIF BOLD NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D770;MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D771;MATHEMATICAL SANS-SERIF BOLD SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D772;MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D773;MATHEMATICAL SANS-SERIF BOLD SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D774;MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D775;MATHEMATICAL SANS-SERIF BOLD SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D776;MATHEMATICAL SANS-SERIF BOLD SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D777;MATHEMATICAL SANS-SERIF BOLD SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D778;MATHEMATICAL SANS-SERIF BOLD SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D779;MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D77A;MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D77B;MATHEMATICAL SANS-SERIF BOLD SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D77C;MATHEMATICAL SANS-SERIF BOLD SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D77D;MATHEMATICAL SANS-SERIF BOLD SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D77E;MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D77F;MATHEMATICAL SANS-SERIF BOLD SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D780;MATHEMATICAL SANS-SERIF BOLD SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D781;MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D782;MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D783;MATHEMATICAL SANS-SERIF BOLD SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D784;MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D785;MATHEMATICAL SANS-SERIF BOLD SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D786;MATHEMATICAL SANS-SERIF BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D787;MATHEMATICAL SANS-SERIF BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D788;MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;;
+1D78A;MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D78B;MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D78C;MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D78D;MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D78E;MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D78F;MATHEMATICAL SANS-SERIF BOLD PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D790;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D791;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D792;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D793;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D794;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D795;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D796;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D797;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D798;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D799;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D79A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D79B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D79C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D79D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D79E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D79F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D7A0;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D7A1;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D7A2;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D7A3;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D7A4;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D7A5;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D7A6;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D7A7;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D7A8;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D7A9;MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D7AA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D7AB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D7AC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D7AD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D7AE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D7AF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D7B0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D7B1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D7B2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D7B3;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D7B4;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D7B5;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D7B6;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D7B7;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D7B8;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D7B9;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D7BA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D7BB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D7BC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D7BD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D7BE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D7BF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D7C0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D7C1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D7C2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;;
+1D7C4;MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D7C5;MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D7C6;MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D7C7;MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D7C8;MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D7C9;MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D7CA;MATHEMATICAL BOLD CAPITAL DIGAMMA;Lu;0;L;<font> 03DC;;;;N;;;;;
+1D7CB;MATHEMATICAL BOLD SMALL DIGAMMA;Ll;0;L;<font> 03DD;;;;N;;;;;
+1D7CE;MATHEMATICAL BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7CF;MATHEMATICAL BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7D0;MATHEMATICAL BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7D1;MATHEMATICAL BOLD DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7D2;MATHEMATICAL BOLD DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7D3;MATHEMATICAL BOLD DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7D4;MATHEMATICAL BOLD DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7D5;MATHEMATICAL BOLD DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7D6;MATHEMATICAL BOLD DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7D7;MATHEMATICAL BOLD DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7D8;MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7D9;MATHEMATICAL DOUBLE-STRUCK DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7DA;MATHEMATICAL DOUBLE-STRUCK DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7DB;MATHEMATICAL DOUBLE-STRUCK DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7DC;MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7DD;MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7DE;MATHEMATICAL DOUBLE-STRUCK DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7DF;MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7E0;MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7E1;MATHEMATICAL DOUBLE-STRUCK DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7E2;MATHEMATICAL SANS-SERIF DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7E3;MATHEMATICAL SANS-SERIF DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7E4;MATHEMATICAL SANS-SERIF DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7E5;MATHEMATICAL SANS-SERIF DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7E6;MATHEMATICAL SANS-SERIF DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7E7;MATHEMATICAL SANS-SERIF DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7E8;MATHEMATICAL SANS-SERIF DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7E9;MATHEMATICAL SANS-SERIF DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7EA;MATHEMATICAL SANS-SERIF DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7EB;MATHEMATICAL SANS-SERIF DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7EC;MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7ED;MATHEMATICAL SANS-SERIF BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7EE;MATHEMATICAL SANS-SERIF BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7EF;MATHEMATICAL SANS-SERIF BOLD DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7F0;MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7F1;MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7F2;MATHEMATICAL SANS-SERIF BOLD DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7F3;MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7F4;MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7F5;MATHEMATICAL SANS-SERIF BOLD DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7F6;MATHEMATICAL MONOSPACE DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7F7;MATHEMATICAL MONOSPACE DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7F8;MATHEMATICAL MONOSPACE DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7F9;MATHEMATICAL MONOSPACE DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7FA;MATHEMATICAL MONOSPACE DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7FB;MATHEMATICAL MONOSPACE DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7FC;MATHEMATICAL MONOSPACE DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D800;SIGNWRITING HAND-FIST INDEX;So;0;L;;;;;N;;;;;
+1D801;SIGNWRITING HAND-CIRCLE INDEX;So;0;L;;;;;N;;;;;
+1D802;SIGNWRITING HAND-CUP INDEX;So;0;L;;;;;N;;;;;
+1D803;SIGNWRITING HAND-OVAL INDEX;So;0;L;;;;;N;;;;;
+1D804;SIGNWRITING HAND-HINGE INDEX;So;0;L;;;;;N;;;;;
+1D805;SIGNWRITING HAND-ANGLE INDEX;So;0;L;;;;;N;;;;;
+1D806;SIGNWRITING HAND-FIST INDEX BENT;So;0;L;;;;;N;;;;;
+1D807;SIGNWRITING HAND-CIRCLE INDEX BENT;So;0;L;;;;;N;;;;;
+1D808;SIGNWRITING HAND-FIST THUMB UNDER INDEX BENT;So;0;L;;;;;N;;;;;
+1D809;SIGNWRITING HAND-FIST INDEX RAISED KNUCKLE;So;0;L;;;;;N;;;;;
+1D80A;SIGNWRITING HAND-FIST INDEX CUPPED;So;0;L;;;;;N;;;;;
+1D80B;SIGNWRITING HAND-FIST INDEX HINGED;So;0;L;;;;;N;;;;;
+1D80C;SIGNWRITING HAND-FIST INDEX HINGED LOW;So;0;L;;;;;N;;;;;
+1D80D;SIGNWRITING HAND-CIRCLE INDEX HINGE;So;0;L;;;;;N;;;;;
+1D80E;SIGNWRITING HAND-FIST INDEX MIDDLE;So;0;L;;;;;N;;;;;
+1D80F;SIGNWRITING HAND-CIRCLE INDEX MIDDLE;So;0;L;;;;;N;;;;;
+1D810;SIGNWRITING HAND-FIST INDEX MIDDLE BENT;So;0;L;;;;;N;;;;;
+1D811;SIGNWRITING HAND-FIST INDEX MIDDLE RAISED KNUCKLES;So;0;L;;;;;N;;;;;
+1D812;SIGNWRITING HAND-FIST INDEX MIDDLE HINGED;So;0;L;;;;;N;;;;;
+1D813;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED;So;0;L;;;;;N;;;;;
+1D814;SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP;So;0;L;;;;;N;;;;;
+1D815;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED;So;0;L;;;;;N;;;;;
+1D816;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED INDEX BENT;So;0;L;;;;;N;;;;;
+1D817;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED MIDDLE BENT;So;0;L;;;;;N;;;;;
+1D818;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED;So;0;L;;;;;N;;;;;
+1D819;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED;So;0;L;;;;;N;;;;;
+1D81A;SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED;So;0;L;;;;;N;;;;;
+1D81B;SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSSED;So;0;L;;;;;N;;;;;
+1D81C;SIGNWRITING HAND-FIST MIDDLE BENT OVER INDEX;So;0;L;;;;;N;;;;;
+1D81D;SIGNWRITING HAND-FIST INDEX BENT OVER MIDDLE;So;0;L;;;;;N;;;;;
+1D81E;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB;So;0;L;;;;;N;;;;;
+1D81F;SIGNWRITING HAND-CIRCLE INDEX MIDDLE THUMB;So;0;L;;;;;N;;;;;
+1D820;SIGNWRITING HAND-FIST INDEX MIDDLE STRAIGHT THUMB BENT;So;0;L;;;;;N;;;;;
+1D821;SIGNWRITING HAND-FIST INDEX MIDDLE BENT THUMB STRAIGHT;So;0;L;;;;;N;;;;;
+1D822;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB BENT;So;0;L;;;;;N;;;;;
+1D823;SIGNWRITING HAND-FIST INDEX MIDDLE HINGED SPREAD THUMB SIDE;So;0;L;;;;;N;;;;;
+1D824;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB SIDE;So;0;L;;;;;N;;;;;
+1D825;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB CONJOINED;So;0;L;;;;;N;;;;;
+1D826;SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP THUMB SIDE;So;0;L;;;;;N;;;;;
+1D827;SIGNWRITING HAND-FIST INDEX MIDDLE UP SPREAD THUMB FORWARD;So;0;L;;;;;N;;;;;
+1D828;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CUPPED;So;0;L;;;;;N;;;;;
+1D829;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CIRCLED;So;0;L;;;;;N;;;;;
+1D82A;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HOOKED;So;0;L;;;;;N;;;;;
+1D82B;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HINGED;So;0;L;;;;;N;;;;;
+1D82C;SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE STRAIGHT;So;0;L;;;;;N;;;;;
+1D82D;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE;So;0;L;;;;;N;;;;;
+1D82E;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE CONJOINED;So;0;L;;;;;N;;;;;
+1D82F;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE BENT;So;0;L;;;;;N;;;;;
+1D830;SIGNWRITING HAND-FIST MIDDLE THUMB HOOKED INDEX UP;So;0;L;;;;;N;;;;;
+1D831;SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE UP;So;0;L;;;;;N;;;;;
+1D832;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED THUMB SIDE;So;0;L;;;;;N;;;;;
+1D833;SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED THUMB SIDE;So;0;L;;;;;N;;;;;
+1D834;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB FORWARD;So;0;L;;;;;N;;;;;
+1D835;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED THUMB FORWARD;So;0;L;;;;;N;;;;;
+1D836;SIGNWRITING HAND-FIST MIDDLE THUMB CUPPED INDEX UP;So;0;L;;;;;N;;;;;
+1D837;SIGNWRITING HAND-FIST INDEX THUMB CUPPED MIDDLE UP;So;0;L;;;;;N;;;;;
+1D838;SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX UP;So;0;L;;;;;N;;;;;
+1D839;SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX HINGED;So;0;L;;;;;N;;;;;
+1D83A;SIGNWRITING HAND-FIST INDEX THUMB ANGLED OUT MIDDLE UP;So;0;L;;;;;N;;;;;
+1D83B;SIGNWRITING HAND-FIST INDEX THUMB ANGLED IN MIDDLE UP;So;0;L;;;;;N;;;;;
+1D83C;SIGNWRITING HAND-FIST INDEX THUMB CIRCLED MIDDLE UP;So;0;L;;;;;N;;;;;
+1D83D;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CONJOINED HINGED;So;0;L;;;;;N;;;;;
+1D83E;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED OUT;So;0;L;;;;;N;;;;;
+1D83F;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED;So;0;L;;;;;N;;;;;
+1D840;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX UP;So;0;L;;;;;N;;;;;
+1D841;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX CROSSED;So;0;L;;;;;N;;;;;
+1D842;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED INDEX UP;So;0;L;;;;;N;;;;;
+1D843;SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE HINGED;So;0;L;;;;;N;;;;;
+1D844;SIGNWRITING HAND-FLAT FOUR FINGERS;So;0;L;;;;;N;;;;;
+1D845;SIGNWRITING HAND-FLAT FOUR FINGERS BENT;So;0;L;;;;;N;;;;;
+1D846;SIGNWRITING HAND-FLAT FOUR FINGERS HINGED;So;0;L;;;;;N;;;;;
+1D847;SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;;
+1D848;SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED SPLIT;So;0;L;;;;;N;;;;;
+1D849;SIGNWRITING HAND-CLAW FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;;
+1D84A;SIGNWRITING HAND-FIST FOUR FINGERS CONJOINED BENT;So;0;L;;;;;N;;;;;
+1D84B;SIGNWRITING HAND-HINGE FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;;
+1D84C;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;;
+1D84D;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;;
+1D84E;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD FOUR BENT;So;0;L;;;;;N;;;;;
+1D84F;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD FOUR BENT;So;0;L;;;;;N;;;;;
+1D850;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD BENT;So;0;L;;;;;N;;;;;
+1D851;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD BENT;So;0;L;;;;;N;;;;;
+1D852;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD THUMB FORWARD;So;0;L;;;;;N;;;;;
+1D853;SIGNWRITING HAND-CUP FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;;
+1D854;SIGNWRITING HAND-CUP FIVE FINGERS SPREAD OPEN;So;0;L;;;;;N;;;;;
+1D855;SIGNWRITING HAND-HINGE FIVE FINGERS SPREAD OPEN;So;0;L;;;;;N;;;;;
+1D856;SIGNWRITING HAND-OVAL FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;;
+1D857;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED;So;0;L;;;;;N;;;;;
+1D858;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED THUMB SIDE;So;0;L;;;;;N;;;;;
+1D859;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED NO THUMB;So;0;L;;;;;N;;;;;
+1D85A;SIGNWRITING HAND-FLAT;So;0;L;;;;;N;;;;;
+1D85B;SIGNWRITING HAND-FLAT BETWEEN PALM FACINGS;So;0;L;;;;;N;;;;;
+1D85C;SIGNWRITING HAND-FLAT HEEL;So;0;L;;;;;N;;;;;
+1D85D;SIGNWRITING HAND-FLAT THUMB SIDE;So;0;L;;;;;N;;;;;
+1D85E;SIGNWRITING HAND-FLAT HEEL THUMB SIDE;So;0;L;;;;;N;;;;;
+1D85F;SIGNWRITING HAND-FLAT THUMB BENT;So;0;L;;;;;N;;;;;
+1D860;SIGNWRITING HAND-FLAT THUMB FORWARD;So;0;L;;;;;N;;;;;
+1D861;SIGNWRITING HAND-FLAT SPLIT INDEX THUMB SIDE;So;0;L;;;;;N;;;;;
+1D862;SIGNWRITING HAND-FLAT SPLIT CENTRE;So;0;L;;;;;N;;;;;
+1D863;SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE;So;0;L;;;;;N;;;;;
+1D864;SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE BENT;So;0;L;;;;;N;;;;;
+1D865;SIGNWRITING HAND-FLAT SPLIT LITTLE;So;0;L;;;;;N;;;;;
+1D866;SIGNWRITING HAND-CLAW;So;0;L;;;;;N;;;;;
+1D867;SIGNWRITING HAND-CLAW THUMB SIDE;So;0;L;;;;;N;;;;;
+1D868;SIGNWRITING HAND-CLAW NO THUMB;So;0;L;;;;;N;;;;;
+1D869;SIGNWRITING HAND-CLAW THUMB FORWARD;So;0;L;;;;;N;;;;;
+1D86A;SIGNWRITING HAND-HOOK CURLICUE;So;0;L;;;;;N;;;;;
+1D86B;SIGNWRITING HAND-HOOK;So;0;L;;;;;N;;;;;
+1D86C;SIGNWRITING HAND-CUP OPEN;So;0;L;;;;;N;;;;;
+1D86D;SIGNWRITING HAND-CUP;So;0;L;;;;;N;;;;;
+1D86E;SIGNWRITING HAND-CUP OPEN THUMB SIDE;So;0;L;;;;;N;;;;;
+1D86F;SIGNWRITING HAND-CUP THUMB SIDE;So;0;L;;;;;N;;;;;
+1D870;SIGNWRITING HAND-CUP OPEN NO THUMB;So;0;L;;;;;N;;;;;
+1D871;SIGNWRITING HAND-CUP NO THUMB;So;0;L;;;;;N;;;;;
+1D872;SIGNWRITING HAND-CUP OPEN THUMB FORWARD;So;0;L;;;;;N;;;;;
+1D873;SIGNWRITING HAND-CUP THUMB FORWARD;So;0;L;;;;;N;;;;;
+1D874;SIGNWRITING HAND-CURLICUE OPEN;So;0;L;;;;;N;;;;;
+1D875;SIGNWRITING HAND-CURLICUE;So;0;L;;;;;N;;;;;
+1D876;SIGNWRITING HAND-CIRCLE;So;0;L;;;;;N;;;;;
+1D877;SIGNWRITING HAND-OVAL;So;0;L;;;;;N;;;;;
+1D878;SIGNWRITING HAND-OVAL THUMB SIDE;So;0;L;;;;;N;;;;;
+1D879;SIGNWRITING HAND-OVAL NO THUMB;So;0;L;;;;;N;;;;;
+1D87A;SIGNWRITING HAND-OVAL THUMB FORWARD;So;0;L;;;;;N;;;;;
+1D87B;SIGNWRITING HAND-HINGE OPEN;So;0;L;;;;;N;;;;;
+1D87C;SIGNWRITING HAND-HINGE OPEN THUMB FORWARD;So;0;L;;;;;N;;;;;
+1D87D;SIGNWRITING HAND-HINGE;So;0;L;;;;;N;;;;;
+1D87E;SIGNWRITING HAND-HINGE SMALL;So;0;L;;;;;N;;;;;
+1D87F;SIGNWRITING HAND-HINGE OPEN THUMB SIDE;So;0;L;;;;;N;;;;;
+1D880;SIGNWRITING HAND-HINGE THUMB SIDE;So;0;L;;;;;N;;;;;
+1D881;SIGNWRITING HAND-HINGE OPEN NO THUMB;So;0;L;;;;;N;;;;;
+1D882;SIGNWRITING HAND-HINGE NO THUMB;So;0;L;;;;;N;;;;;
+1D883;SIGNWRITING HAND-HINGE THUMB SIDE TOUCHING INDEX;So;0;L;;;;;N;;;;;
+1D884;SIGNWRITING HAND-HINGE THUMB BETWEEN MIDDLE RING;So;0;L;;;;;N;;;;;
+1D885;SIGNWRITING HAND-ANGLE;So;0;L;;;;;N;;;;;
+1D886;SIGNWRITING HAND-FIST INDEX MIDDLE RING;So;0;L;;;;;N;;;;;
+1D887;SIGNWRITING HAND-CIRCLE INDEX MIDDLE RING;So;0;L;;;;;N;;;;;
+1D888;SIGNWRITING HAND-HINGE INDEX MIDDLE RING;So;0;L;;;;;N;;;;;
+1D889;SIGNWRITING HAND-ANGLE INDEX MIDDLE RING;So;0;L;;;;;N;;;;;
+1D88A;SIGNWRITING HAND-HINGE LITTLE;So;0;L;;;;;N;;;;;
+1D88B;SIGNWRITING HAND-FIST INDEX MIDDLE RING BENT;So;0;L;;;;;N;;;;;
+1D88C;SIGNWRITING HAND-FIST INDEX MIDDLE RING CONJOINED;So;0;L;;;;;N;;;;;
+1D88D;SIGNWRITING HAND-HINGE INDEX MIDDLE RING CONJOINED;So;0;L;;;;;N;;;;;
+1D88E;SIGNWRITING HAND-FIST LITTLE DOWN;So;0;L;;;;;N;;;;;
+1D88F;SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE STRAIGHT;So;0;L;;;;;N;;;;;
+1D890;SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE CURVED;So;0;L;;;;;N;;;;;
+1D891;SIGNWRITING HAND-FIST LITTLE DOWN OTHERS CIRCLED;So;0;L;;;;;N;;;;;
+1D892;SIGNWRITING HAND-FIST LITTLE UP;So;0;L;;;;;N;;;;;
+1D893;SIGNWRITING HAND-FIST THUMB UNDER LITTLE UP;So;0;L;;;;;N;;;;;
+1D894;SIGNWRITING HAND-CIRCLE LITTLE UP;So;0;L;;;;;N;;;;;
+1D895;SIGNWRITING HAND-OVAL LITTLE UP;So;0;L;;;;;N;;;;;
+1D896;SIGNWRITING HAND-ANGLE LITTLE UP;So;0;L;;;;;N;;;;;
+1D897;SIGNWRITING HAND-FIST LITTLE RAISED KNUCKLE;So;0;L;;;;;N;;;;;
+1D898;SIGNWRITING HAND-FIST LITTLE BENT;So;0;L;;;;;N;;;;;
+1D899;SIGNWRITING HAND-FIST LITTLE TOUCHES THUMB;So;0;L;;;;;N;;;;;
+1D89A;SIGNWRITING HAND-FIST LITTLE THUMB;So;0;L;;;;;N;;;;;
+1D89B;SIGNWRITING HAND-HINGE LITTLE THUMB;So;0;L;;;;;N;;;;;
+1D89C;SIGNWRITING HAND-FIST LITTLE INDEX THUMB;So;0;L;;;;;N;;;;;
+1D89D;SIGNWRITING HAND-HINGE LITTLE INDEX THUMB;So;0;L;;;;;N;;;;;
+1D89E;SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB OUT;So;0;L;;;;;N;;;;;
+1D89F;SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB;So;0;L;;;;;N;;;;;
+1D8A0;SIGNWRITING HAND-FIST LITTLE INDEX;So;0;L;;;;;N;;;;;
+1D8A1;SIGNWRITING HAND-CIRCLE LITTLE INDEX;So;0;L;;;;;N;;;;;
+1D8A2;SIGNWRITING HAND-HINGE LITTLE INDEX;So;0;L;;;;;N;;;;;
+1D8A3;SIGNWRITING HAND-ANGLE LITTLE INDEX;So;0;L;;;;;N;;;;;
+1D8A4;SIGNWRITING HAND-FIST INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;;
+1D8A5;SIGNWRITING HAND-CIRCLE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;;
+1D8A6;SIGNWRITING HAND-HINGE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;;
+1D8A7;SIGNWRITING HAND-HINGE RING;So;0;L;;;;;N;;;;;
+1D8A8;SIGNWRITING HAND-ANGLE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;;
+1D8A9;SIGNWRITING HAND-FIST INDEX MIDDLE CROSS LITTLE;So;0;L;;;;;N;;;;;
+1D8AA;SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSS LITTLE;So;0;L;;;;;N;;;;;
+1D8AB;SIGNWRITING HAND-FIST RING DOWN;So;0;L;;;;;N;;;;;
+1D8AC;SIGNWRITING HAND-HINGE RING DOWN INDEX THUMB HOOK MIDDLE;So;0;L;;;;;N;;;;;
+1D8AD;SIGNWRITING HAND-ANGLE RING DOWN MIDDLE THUMB INDEX CROSS;So;0;L;;;;;N;;;;;
+1D8AE;SIGNWRITING HAND-FIST RING UP;So;0;L;;;;;N;;;;;
+1D8AF;SIGNWRITING HAND-FIST RING RAISED KNUCKLE;So;0;L;;;;;N;;;;;
+1D8B0;SIGNWRITING HAND-FIST RING LITTLE;So;0;L;;;;;N;;;;;
+1D8B1;SIGNWRITING HAND-CIRCLE RING LITTLE;So;0;L;;;;;N;;;;;
+1D8B2;SIGNWRITING HAND-OVAL RING LITTLE;So;0;L;;;;;N;;;;;
+1D8B3;SIGNWRITING HAND-ANGLE RING LITTLE;So;0;L;;;;;N;;;;;
+1D8B4;SIGNWRITING HAND-FIST RING MIDDLE;So;0;L;;;;;N;;;;;
+1D8B5;SIGNWRITING HAND-FIST RING MIDDLE CONJOINED;So;0;L;;;;;N;;;;;
+1D8B6;SIGNWRITING HAND-FIST RING MIDDLE RAISED KNUCKLES;So;0;L;;;;;N;;;;;
+1D8B7;SIGNWRITING HAND-FIST RING INDEX;So;0;L;;;;;N;;;;;
+1D8B8;SIGNWRITING HAND-FIST RING THUMB;So;0;L;;;;;N;;;;;
+1D8B9;SIGNWRITING HAND-HOOK RING THUMB;So;0;L;;;;;N;;;;;
+1D8BA;SIGNWRITING HAND-FIST INDEX RING LITTLE;So;0;L;;;;;N;;;;;
+1D8BB;SIGNWRITING HAND-CIRCLE INDEX RING LITTLE;So;0;L;;;;;N;;;;;
+1D8BC;SIGNWRITING HAND-CURLICUE INDEX RING LITTLE ON;So;0;L;;;;;N;;;;;
+1D8BD;SIGNWRITING HAND-HOOK INDEX RING LITTLE OUT;So;0;L;;;;;N;;;;;
+1D8BE;SIGNWRITING HAND-HOOK INDEX RING LITTLE IN;So;0;L;;;;;N;;;;;
+1D8BF;SIGNWRITING HAND-HOOK INDEX RING LITTLE UNDER;So;0;L;;;;;N;;;;;
+1D8C0;SIGNWRITING HAND-CUP INDEX RING LITTLE;So;0;L;;;;;N;;;;;
+1D8C1;SIGNWRITING HAND-HINGE INDEX RING LITTLE;So;0;L;;;;;N;;;;;
+1D8C2;SIGNWRITING HAND-ANGLE INDEX RING LITTLE OUT;So;0;L;;;;;N;;;;;
+1D8C3;SIGNWRITING HAND-ANGLE INDEX RING LITTLE;So;0;L;;;;;N;;;;;
+1D8C4;SIGNWRITING HAND-FIST MIDDLE DOWN;So;0;L;;;;;N;;;;;
+1D8C5;SIGNWRITING HAND-HINGE MIDDLE;So;0;L;;;;;N;;;;;
+1D8C6;SIGNWRITING HAND-FIST MIDDLE UP;So;0;L;;;;;N;;;;;
+1D8C7;SIGNWRITING HAND-CIRCLE MIDDLE UP;So;0;L;;;;;N;;;;;
+1D8C8;SIGNWRITING HAND-FIST MIDDLE RAISED KNUCKLE;So;0;L;;;;;N;;;;;
+1D8C9;SIGNWRITING HAND-FIST MIDDLE UP THUMB SIDE;So;0;L;;;;;N;;;;;
+1D8CA;SIGNWRITING HAND-HOOK MIDDLE THUMB;So;0;L;;;;;N;;;;;
+1D8CB;SIGNWRITING HAND-FIST MIDDLE THUMB LITTLE;So;0;L;;;;;N;;;;;
+1D8CC;SIGNWRITING HAND-FIST MIDDLE LITTLE;So;0;L;;;;;N;;;;;
+1D8CD;SIGNWRITING HAND-FIST MIDDLE RING LITTLE;So;0;L;;;;;N;;;;;
+1D8CE;SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;;
+1D8CF;SIGNWRITING HAND-CURLICUE MIDDLE RING LITTLE ON;So;0;L;;;;;N;;;;;
+1D8D0;SIGNWRITING HAND-CUP MIDDLE RING LITTLE;So;0;L;;;;;N;;;;;
+1D8D1;SIGNWRITING HAND-HINGE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;;
+1D8D2;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE OUT;So;0;L;;;;;N;;;;;
+1D8D3;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE IN;So;0;L;;;;;N;;;;;
+1D8D4;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;;
+1D8D5;SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE BENT;So;0;L;;;;;N;;;;;
+1D8D6;SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED;So;0;L;;;;;N;;;;;
+1D8D7;SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED SIDE;So;0;L;;;;;N;;;;;
+1D8D8;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED OUT;So;0;L;;;;;N;;;;;
+1D8D9;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED IN;So;0;L;;;;;N;;;;;
+1D8DA;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED;So;0;L;;;;;N;;;;;
+1D8DB;SIGNWRITING HAND-HINGE INDEX HINGED;So;0;L;;;;;N;;;;;
+1D8DC;SIGNWRITING HAND-FIST INDEX THUMB SIDE;So;0;L;;;;;N;;;;;
+1D8DD;SIGNWRITING HAND-HINGE INDEX THUMB SIDE;So;0;L;;;;;N;;;;;
+1D8DE;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB DIAGONAL;So;0;L;;;;;N;;;;;
+1D8DF;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB CONJOINED;So;0;L;;;;;N;;;;;
+1D8E0;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB BENT;So;0;L;;;;;N;;;;;
+1D8E1;SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX BENT;So;0;L;;;;;N;;;;;
+1D8E2;SIGNWRITING HAND-FIST INDEX THUMB SIDE BOTH BENT;So;0;L;;;;;N;;;;;
+1D8E3;SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX HINGE;So;0;L;;;;;N;;;;;
+1D8E4;SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX STRAIGHT;So;0;L;;;;;N;;;;;
+1D8E5;SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX BENT;So;0;L;;;;;N;;;;;
+1D8E6;SIGNWRITING HAND-FIST INDEX THUMB HOOK;So;0;L;;;;;N;;;;;
+1D8E7;SIGNWRITING HAND-FIST INDEX THUMB CURLICUE;So;0;L;;;;;N;;;;;
+1D8E8;SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB INSIDE;So;0;L;;;;;N;;;;;
+1D8E9;SIGNWRITING HAND-CLAW INDEX THUMB CURVE THUMB INSIDE;So;0;L;;;;;N;;;;;
+1D8EA;SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB UNDER;So;0;L;;;;;N;;;;;
+1D8EB;SIGNWRITING HAND-FIST INDEX THUMB CIRCLE;So;0;L;;;;;N;;;;;
+1D8EC;SIGNWRITING HAND-CUP INDEX THUMB;So;0;L;;;;;N;;;;;
+1D8ED;SIGNWRITING HAND-CUP INDEX THUMB OPEN;So;0;L;;;;;N;;;;;
+1D8EE;SIGNWRITING HAND-HINGE INDEX THUMB OPEN;So;0;L;;;;;N;;;;;
+1D8EF;SIGNWRITING HAND-HINGE INDEX THUMB LARGE;So;0;L;;;;;N;;;;;
+1D8F0;SIGNWRITING HAND-HINGE INDEX THUMB;So;0;L;;;;;N;;;;;
+1D8F1;SIGNWRITING HAND-HINGE INDEX THUMB SMALL;So;0;L;;;;;N;;;;;
+1D8F2;SIGNWRITING HAND-ANGLE INDEX THUMB OUT;So;0;L;;;;;N;;;;;
+1D8F3;SIGNWRITING HAND-ANGLE INDEX THUMB IN;So;0;L;;;;;N;;;;;
+1D8F4;SIGNWRITING HAND-ANGLE INDEX THUMB;So;0;L;;;;;N;;;;;
+1D8F5;SIGNWRITING HAND-FIST THUMB;So;0;L;;;;;N;;;;;
+1D8F6;SIGNWRITING HAND-FIST THUMB HEEL;So;0;L;;;;;N;;;;;
+1D8F7;SIGNWRITING HAND-FIST THUMB SIDE DIAGONAL;So;0;L;;;;;N;;;;;
+1D8F8;SIGNWRITING HAND-FIST THUMB SIDE CONJOINED;So;0;L;;;;;N;;;;;
+1D8F9;SIGNWRITING HAND-FIST THUMB SIDE BENT;So;0;L;;;;;N;;;;;
+1D8FA;SIGNWRITING HAND-FIST THUMB FORWARD;So;0;L;;;;;N;;;;;
+1D8FB;SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE;So;0;L;;;;;N;;;;;
+1D8FC;SIGNWRITING HAND-FIST THUMB BETWEEN MIDDLE RING;So;0;L;;;;;N;;;;;
+1D8FD;SIGNWRITING HAND-FIST THUMB BETWEEN RING LITTLE;So;0;L;;;;;N;;;;;
+1D8FE;SIGNWRITING HAND-FIST THUMB UNDER TWO FINGERS;So;0;L;;;;;N;;;;;
+1D8FF;SIGNWRITING HAND-FIST THUMB OVER TWO FINGERS;So;0;L;;;;;N;;;;;
+1D900;SIGNWRITING HAND-FIST THUMB UNDER THREE FINGERS;So;0;L;;;;;N;;;;;
+1D901;SIGNWRITING HAND-FIST THUMB UNDER FOUR FINGERS;So;0;L;;;;;N;;;;;
+1D902;SIGNWRITING HAND-FIST THUMB OVER FOUR RAISED KNUCKLES;So;0;L;;;;;N;;;;;
+1D903;SIGNWRITING HAND-FIST;So;0;L;;;;;N;;;;;
+1D904;SIGNWRITING HAND-FIST HEEL;So;0;L;;;;;N;;;;;
+1D905;SIGNWRITING TOUCH SINGLE;So;0;L;;;;;N;;;;;
+1D906;SIGNWRITING TOUCH MULTIPLE;So;0;L;;;;;N;;;;;
+1D907;SIGNWRITING TOUCH BETWEEN;So;0;L;;;;;N;;;;;
+1D908;SIGNWRITING GRASP SINGLE;So;0;L;;;;;N;;;;;
+1D909;SIGNWRITING GRASP MULTIPLE;So;0;L;;;;;N;;;;;
+1D90A;SIGNWRITING GRASP BETWEEN;So;0;L;;;;;N;;;;;
+1D90B;SIGNWRITING STRIKE SINGLE;So;0;L;;;;;N;;;;;
+1D90C;SIGNWRITING STRIKE MULTIPLE;So;0;L;;;;;N;;;;;
+1D90D;SIGNWRITING STRIKE BETWEEN;So;0;L;;;;;N;;;;;
+1D90E;SIGNWRITING BRUSH SINGLE;So;0;L;;;;;N;;;;;
+1D90F;SIGNWRITING BRUSH MULTIPLE;So;0;L;;;;;N;;;;;
+1D910;SIGNWRITING BRUSH BETWEEN;So;0;L;;;;;N;;;;;
+1D911;SIGNWRITING RUB SINGLE;So;0;L;;;;;N;;;;;
+1D912;SIGNWRITING RUB MULTIPLE;So;0;L;;;;;N;;;;;
+1D913;SIGNWRITING RUB BETWEEN;So;0;L;;;;;N;;;;;
+1D914;SIGNWRITING SURFACE SYMBOLS;So;0;L;;;;;N;;;;;
+1D915;SIGNWRITING SURFACE BETWEEN;So;0;L;;;;;N;;;;;
+1D916;SIGNWRITING SQUEEZE LARGE SINGLE;So;0;L;;;;;N;;;;;
+1D917;SIGNWRITING SQUEEZE SMALL SINGLE;So;0;L;;;;;N;;;;;
+1D918;SIGNWRITING SQUEEZE LARGE MULTIPLE;So;0;L;;;;;N;;;;;
+1D919;SIGNWRITING SQUEEZE SMALL MULTIPLE;So;0;L;;;;;N;;;;;
+1D91A;SIGNWRITING SQUEEZE SEQUENTIAL;So;0;L;;;;;N;;;;;
+1D91B;SIGNWRITING FLICK LARGE SINGLE;So;0;L;;;;;N;;;;;
+1D91C;SIGNWRITING FLICK SMALL SINGLE;So;0;L;;;;;N;;;;;
+1D91D;SIGNWRITING FLICK LARGE MULTIPLE;So;0;L;;;;;N;;;;;
+1D91E;SIGNWRITING FLICK SMALL MULTIPLE;So;0;L;;;;;N;;;;;
+1D91F;SIGNWRITING FLICK SEQUENTIAL;So;0;L;;;;;N;;;;;
+1D920;SIGNWRITING SQUEEZE FLICK ALTERNATING;So;0;L;;;;;N;;;;;
+1D921;SIGNWRITING MOVEMENT-HINGE UP DOWN LARGE;So;0;L;;;;;N;;;;;
+1D922;SIGNWRITING MOVEMENT-HINGE UP DOWN SMALL;So;0;L;;;;;N;;;;;
+1D923;SIGNWRITING MOVEMENT-HINGE UP SEQUENTIAL;So;0;L;;;;;N;;;;;
+1D924;SIGNWRITING MOVEMENT-HINGE DOWN SEQUENTIAL;So;0;L;;;;;N;;;;;
+1D925;SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING LARGE;So;0;L;;;;;N;;;;;
+1D926;SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING SMALL;So;0;L;;;;;N;;;;;
+1D927;SIGNWRITING MOVEMENT-HINGE SIDE TO SIDE SCISSORS;So;0;L;;;;;N;;;;;
+1D928;SIGNWRITING MOVEMENT-WALLPLANE FINGER CONTACT;So;0;L;;;;;N;;;;;
+1D929;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CONTACT;So;0;L;;;;;N;;;;;
+1D92A;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT SMALL;So;0;L;;;;;N;;;;;
+1D92B;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT MEDIUM;So;0;L;;;;;N;;;;;
+1D92C;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGE;So;0;L;;;;;N;;;;;
+1D92D;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGEST;So;0;L;;;;;N;;;;;
+1D92E;SIGNWRITING MOVEMENT-WALLPLANE SINGLE WRIST FLEX;So;0;L;;;;;N;;;;;
+1D92F;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE STRAIGHT;So;0;L;;;;;N;;;;;
+1D930;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE WRIST FLEX;So;0;L;;;;;N;;;;;
+1D931;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING;So;0;L;;;;;N;;;;;
+1D932;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;;
+1D933;SIGNWRITING MOVEMENT-WALLPLANE CROSS;So;0;L;;;;;N;;;;;
+1D934;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE STRAIGHT MOVEMENT;So;0;L;;;;;N;;;;;
+1D935;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE WRIST FLEX;So;0;L;;;;;N;;;;;
+1D936;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING;So;0;L;;;;;N;;;;;
+1D937;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;;
+1D938;SIGNWRITING MOVEMENT-WALLPLANE BEND SMALL;So;0;L;;;;;N;;;;;
+1D939;SIGNWRITING MOVEMENT-WALLPLANE BEND MEDIUM;So;0;L;;;;;N;;;;;
+1D93A;SIGNWRITING MOVEMENT-WALLPLANE BEND LARGE;So;0;L;;;;;N;;;;;
+1D93B;SIGNWRITING MOVEMENT-WALLPLANE CORNER SMALL;So;0;L;;;;;N;;;;;
+1D93C;SIGNWRITING MOVEMENT-WALLPLANE CORNER MEDIUM;So;0;L;;;;;N;;;;;
+1D93D;SIGNWRITING MOVEMENT-WALLPLANE CORNER LARGE;So;0;L;;;;;N;;;;;
+1D93E;SIGNWRITING MOVEMENT-WALLPLANE CORNER ROTATION;So;0;L;;;;;N;;;;;
+1D93F;SIGNWRITING MOVEMENT-WALLPLANE CHECK SMALL;So;0;L;;;;;N;;;;;
+1D940;SIGNWRITING MOVEMENT-WALLPLANE CHECK MEDIUM;So;0;L;;;;;N;;;;;
+1D941;SIGNWRITING MOVEMENT-WALLPLANE CHECK LARGE;So;0;L;;;;;N;;;;;
+1D942;SIGNWRITING MOVEMENT-WALLPLANE BOX SMALL;So;0;L;;;;;N;;;;;
+1D943;SIGNWRITING MOVEMENT-WALLPLANE BOX MEDIUM;So;0;L;;;;;N;;;;;
+1D944;SIGNWRITING MOVEMENT-WALLPLANE BOX LARGE;So;0;L;;;;;N;;;;;
+1D945;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG SMALL;So;0;L;;;;;N;;;;;
+1D946;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG MEDIUM;So;0;L;;;;;N;;;;;
+1D947;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG LARGE;So;0;L;;;;;N;;;;;
+1D948;SIGNWRITING MOVEMENT-WALLPLANE PEAKS SMALL;So;0;L;;;;;N;;;;;
+1D949;SIGNWRITING MOVEMENT-WALLPLANE PEAKS MEDIUM;So;0;L;;;;;N;;;;;
+1D94A;SIGNWRITING MOVEMENT-WALLPLANE PEAKS LARGE;So;0;L;;;;;N;;;;;
+1D94B;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;;
+1D94C;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;;
+1D94D;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE ALTERNATING;So;0;L;;;;;N;;;;;
+1D94E;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;;
+1D94F;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;;
+1D950;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;;
+1D951;SIGNWRITING TRAVEL-WALLPLANE SHAKING;So;0;L;;;;;N;;;;;
+1D952;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL SINGLE;So;0;L;;;;;N;;;;;
+1D953;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL DOUBLE;So;0;L;;;;;N;;;;;
+1D954;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL TRIPLE;So;0;L;;;;;N;;;;;
+1D955;SIGNWRITING MOVEMENT-DIAGONAL AWAY SMALL;So;0;L;;;;;N;;;;;
+1D956;SIGNWRITING MOVEMENT-DIAGONAL AWAY MEDIUM;So;0;L;;;;;N;;;;;
+1D957;SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGE;So;0;L;;;;;N;;;;;
+1D958;SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGEST;So;0;L;;;;;N;;;;;
+1D959;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS SMALL;So;0;L;;;;;N;;;;;
+1D95A;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS MEDIUM;So;0;L;;;;;N;;;;;
+1D95B;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGE;So;0;L;;;;;N;;;;;
+1D95C;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGEST;So;0;L;;;;;N;;;;;
+1D95D;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY SMALL;So;0;L;;;;;N;;;;;
+1D95E;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY MEDIUM;So;0;L;;;;;N;;;;;
+1D95F;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGE;So;0;L;;;;;N;;;;;
+1D960;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGEST;So;0;L;;;;;N;;;;;
+1D961;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS SMALL;So;0;L;;;;;N;;;;;
+1D962;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS MEDIUM;So;0;L;;;;;N;;;;;
+1D963;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGE;So;0;L;;;;;N;;;;;
+1D964;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGEST;So;0;L;;;;;N;;;;;
+1D965;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT SMALL;So;0;L;;;;;N;;;;;
+1D966;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT MEDIUM;So;0;L;;;;;N;;;;;
+1D967;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGE;So;0;L;;;;;N;;;;;
+1D968;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGEST;So;0;L;;;;;N;;;;;
+1D969;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE WRIST FLEX;So;0;L;;;;;N;;;;;
+1D96A;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE STRAIGHT;So;0;L;;;;;N;;;;;
+1D96B;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE WRIST FLEX;So;0;L;;;;;N;;;;;
+1D96C;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING;So;0;L;;;;;N;;;;;
+1D96D;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;;
+1D96E;SIGNWRITING MOVEMENT-FLOORPLANE CROSS;So;0;L;;;;;N;;;;;
+1D96F;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE STRAIGHT MOVEMENT;So;0;L;;;;;N;;;;;
+1D970;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE WRIST FLEX;So;0;L;;;;;N;;;;;
+1D971;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING MOVEMENT;So;0;L;;;;;N;;;;;
+1D972;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;;
+1D973;SIGNWRITING MOVEMENT-FLOORPLANE BEND;So;0;L;;;;;N;;;;;
+1D974;SIGNWRITING MOVEMENT-FLOORPLANE CORNER SMALL;So;0;L;;;;;N;;;;;
+1D975;SIGNWRITING MOVEMENT-FLOORPLANE CORNER MEDIUM;So;0;L;;;;;N;;;;;
+1D976;SIGNWRITING MOVEMENT-FLOORPLANE CORNER LARGE;So;0;L;;;;;N;;;;;
+1D977;SIGNWRITING MOVEMENT-FLOORPLANE CHECK;So;0;L;;;;;N;;;;;
+1D978;SIGNWRITING MOVEMENT-FLOORPLANE BOX SMALL;So;0;L;;;;;N;;;;;
+1D979;SIGNWRITING MOVEMENT-FLOORPLANE BOX MEDIUM;So;0;L;;;;;N;;;;;
+1D97A;SIGNWRITING MOVEMENT-FLOORPLANE BOX LARGE;So;0;L;;;;;N;;;;;
+1D97B;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG SMALL;So;0;L;;;;;N;;;;;
+1D97C;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG MEDIUM;So;0;L;;;;;N;;;;;
+1D97D;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG LARGE;So;0;L;;;;;N;;;;;
+1D97E;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS SMALL;So;0;L;;;;;N;;;;;
+1D97F;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS MEDIUM;So;0;L;;;;;N;;;;;
+1D980;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS LARGE;So;0;L;;;;;N;;;;;
+1D981;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;;
+1D982;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;;
+1D983;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;;
+1D984;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;;
+1D985;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;;
+1D986;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE ALTERNATING;So;0;L;;;;;N;;;;;
+1D987;SIGNWRITING TRAVEL-FLOORPLANE SHAKING;So;0;L;;;;;N;;;;;
+1D988;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER SMALL;So;0;L;;;;;N;;;;;
+1D989;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER MEDIUM;So;0;L;;;;;N;;;;;
+1D98A;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGE;So;0;L;;;;;N;;;;;
+1D98B;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGEST;So;0;L;;;;;N;;;;;
+1D98C;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE SMALL;So;0;L;;;;;N;;;;;
+1D98D;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE MEDIUM;So;0;L;;;;;N;;;;;
+1D98E;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGE;So;0;L;;;;;N;;;;;
+1D98F;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGEST;So;0;L;;;;;N;;;;;
+1D990;SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE SMALL;So;0;L;;;;;N;;;;;
+1D991;SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE MEDIUM;So;0;L;;;;;N;;;;;
+1D992;SIGNWRITING MOVEMENT-WALLPLANE HUMP SMALL;So;0;L;;;;;N;;;;;
+1D993;SIGNWRITING MOVEMENT-WALLPLANE HUMP MEDIUM;So;0;L;;;;;N;;;;;
+1D994;SIGNWRITING MOVEMENT-WALLPLANE HUMP LARGE;So;0;L;;;;;N;;;;;
+1D995;SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL;So;0;L;;;;;N;;;;;
+1D996;SIGNWRITING MOVEMENT-WALLPLANE LOOP MEDIUM;So;0;L;;;;;N;;;;;
+1D997;SIGNWRITING MOVEMENT-WALLPLANE LOOP LARGE;So;0;L;;;;;N;;;;;
+1D998;SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL DOUBLE;So;0;L;;;;;N;;;;;
+1D999;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE SMALL;So;0;L;;;;;N;;;;;
+1D99A;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE MEDIUM;So;0;L;;;;;N;;;;;
+1D99B;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE LARGE;So;0;L;;;;;N;;;;;
+1D99C;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE SMALL;So;0;L;;;;;N;;;;;
+1D99D;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE MEDIUM;So;0;L;;;;;N;;;;;
+1D99E;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE LARGE;So;0;L;;;;;N;;;;;
+1D99F;SIGNWRITING MOVEMENT-WALLPLANE CURVE THEN STRAIGHT;So;0;L;;;;;N;;;;;
+1D9A0;SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS SMALL;So;0;L;;;;;N;;;;;
+1D9A1;SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS MEDIUM;So;0;L;;;;;N;;;;;
+1D9A2;SIGNWRITING ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;;
+1D9A3;SIGNWRITING ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;;
+1D9A4;SIGNWRITING ROTATION-WALLPLANE ALTERNATE;So;0;L;;;;;N;;;;;
+1D9A5;SIGNWRITING MOVEMENT-WALLPLANE SHAKING;So;0;L;;;;;N;;;;;
+1D9A6;SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING FRONT WALL;So;0;L;;;;;N;;;;;
+1D9A7;SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING FRONT WALL;So;0;L;;;;;N;;;;;
+1D9A8;SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING FRONT WALL;So;0;L;;;;;N;;;;;
+1D9A9;SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING FRONT WALL;So;0;L;;;;;N;;;;;
+1D9AA;SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING FRONT WALL;So;0;L;;;;;N;;;;;
+1D9AB;SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING FRONT WALL;So;0;L;;;;;N;;;;;
+1D9AC;SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING FRONT WALL;So;0;L;;;;;N;;;;;
+1D9AD;SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING CHEST;So;0;L;;;;;N;;;;;
+1D9AE;SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING CHEST;So;0;L;;;;;N;;;;;
+1D9AF;SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING CHEST;So;0;L;;;;;N;;;;;
+1D9B0;SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING CHEST;So;0;L;;;;;N;;;;;
+1D9B1;SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING CHEST;So;0;L;;;;;N;;;;;
+1D9B2;SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING CHEST;So;0;L;;;;;N;;;;;
+1D9B3;SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING CHEST;So;0;L;;;;;N;;;;;
+1D9B4;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH SMALL;So;0;L;;;;;N;;;;;
+1D9B5;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH MEDIUM;So;0;L;;;;;N;;;;;
+1D9B6;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH LARGE;So;0;L;;;;;N;;;;;
+1D9B7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING SMALL;So;0;L;;;;;N;;;;;
+1D9B8;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING LARGE;So;0;L;;;;;N;;;;;
+1D9B9;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL DOUBLE;So;0;L;;;;;N;;;;;
+1D9BA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE DOUBLE;So;0;L;;;;;N;;;;;
+1D9BB;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL TRIPLE;So;0;L;;;;;N;;;;;
+1D9BC;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE TRIPLE;So;0;L;;;;;N;;;;;
+1D9BD;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL SINGLE;So;0;L;;;;;N;;;;;
+1D9BE;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE SINGLE;So;0;L;;;;;N;;;;;
+1D9BF;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL DOUBLE;So;0;L;;;;;N;;;;;
+1D9C0;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE DOUBLE;So;0;L;;;;;N;;;;;
+1D9C1;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING SMALL;So;0;L;;;;;N;;;;;
+1D9C2;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING LARGE;So;0;L;;;;;N;;;;;
+1D9C3;SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING CEILING;So;0;L;;;;;N;;;;;
+1D9C4;SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING CEILING;So;0;L;;;;;N;;;;;
+1D9C5;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING CEILING;So;0;L;;;;;N;;;;;
+1D9C6;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR SMALL;So;0;L;;;;;N;;;;;
+1D9C7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR LARGE;So;0;L;;;;;N;;;;;
+1D9C8;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR SMALL DOUBLE;So;0;L;;;;;N;;;;;
+1D9C9;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR LARGE DOUBLE;So;0;L;;;;;N;;;;;
+1D9CA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE SMALL TRIPLE;So;0;L;;;;;N;;;;;
+1D9CB;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE LARGE TRIPLE;So;0;L;;;;;N;;;;;
+1D9CC;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL SINGLE;So;0;L;;;;;N;;;;;
+1D9CD;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE SINGLE;So;0;L;;;;;N;;;;;
+1D9CE;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL DOUBLE;So;0;L;;;;;N;;;;;
+1D9CF;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE DOUBLE;So;0;L;;;;;N;;;;;
+1D9D0;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR SMALL;So;0;L;;;;;N;;;;;
+1D9D1;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR LARGE;So;0;L;;;;;N;;;;;
+1D9D2;SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING FLOOR;So;0;L;;;;;N;;;;;
+1D9D3;SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING FLOOR;So;0;L;;;;;N;;;;;
+1D9D4;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING FLOOR;So;0;L;;;;;N;;;;;
+1D9D5;SIGNWRITING MOVEMENT-FLOORPLANE CURVE SMALL;So;0;L;;;;;N;;;;;
+1D9D6;SIGNWRITING MOVEMENT-FLOORPLANE CURVE MEDIUM;So;0;L;;;;;N;;;;;
+1D9D7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGE;So;0;L;;;;;N;;;;;
+1D9D8;SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGEST;So;0;L;;;;;N;;;;;
+1D9D9;SIGNWRITING MOVEMENT-FLOORPLANE CURVE COMBINED;So;0;L;;;;;N;;;;;
+1D9DA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP SMALL;So;0;L;;;;;N;;;;;
+1D9DB;SIGNWRITING MOVEMENT-FLOORPLANE LOOP SMALL;So;0;L;;;;;N;;;;;
+1D9DC;SIGNWRITING MOVEMENT-FLOORPLANE WAVE SNAKE;So;0;L;;;;;N;;;;;
+1D9DD;SIGNWRITING MOVEMENT-FLOORPLANE WAVE SMALL;So;0;L;;;;;N;;;;;
+1D9DE;SIGNWRITING MOVEMENT-FLOORPLANE WAVE LARGE;So;0;L;;;;;N;;;;;
+1D9DF;SIGNWRITING ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;;
+1D9E0;SIGNWRITING ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;;
+1D9E1;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;;
+1D9E2;SIGNWRITING MOVEMENT-FLOORPLANE SHAKING PARALLEL;So;0;L;;;;;N;;;;;
+1D9E3;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL SINGLE;So;0;L;;;;;N;;;;;
+1D9E4;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM SINGLE;So;0;L;;;;;N;;;;;
+1D9E5;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL DOUBLE;So;0;L;;;;;N;;;;;
+1D9E6;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM DOUBLE;So;0;L;;;;;N;;;;;
+1D9E7;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL SINGLE;So;0;L;;;;;N;;;;;
+1D9E8;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM SINGLE;So;0;L;;;;;N;;;;;
+1D9E9;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE SINGLE;So;0;L;;;;;N;;;;;
+1D9EA;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL DOUBLE;So;0;L;;;;;N;;;;;
+1D9EB;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM DOUBLE;So;0;L;;;;;N;;;;;
+1D9EC;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE DOUBLE;So;0;L;;;;;N;;;;;
+1D9ED;SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT SINGLE;So;0;L;;;;;N;;;;;
+1D9EE;SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT DOUBLE;So;0;L;;;;;N;;;;;
+1D9EF;SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL SINGLE;So;0;L;;;;;N;;;;;
+1D9F0;SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL DOUBLE;So;0;L;;;;;N;;;;;
+1D9F1;SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES SINGLE;So;0;L;;;;;N;;;;;
+1D9F2;SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES DOUBLE;So;0;L;;;;;N;;;;;
+1D9F3;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL SINGLE;So;0;L;;;;;N;;;;;
+1D9F4;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL DOUBLE;So;0;L;;;;;N;;;;;
+1D9F5;SIGNWRITING DYNAMIC ARROWHEAD SMALL;So;0;L;;;;;N;;;;;
+1D9F6;SIGNWRITING DYNAMIC ARROWHEAD LARGE;So;0;L;;;;;N;;;;;
+1D9F7;SIGNWRITING DYNAMIC FAST;So;0;L;;;;;N;;;;;
+1D9F8;SIGNWRITING DYNAMIC SLOW;So;0;L;;;;;N;;;;;
+1D9F9;SIGNWRITING DYNAMIC TENSE;So;0;L;;;;;N;;;;;
+1D9FA;SIGNWRITING DYNAMIC RELAXED;So;0;L;;;;;N;;;;;
+1D9FB;SIGNWRITING DYNAMIC SIMULTANEOUS;So;0;L;;;;;N;;;;;
+1D9FC;SIGNWRITING DYNAMIC SIMULTANEOUS ALTERNATING;So;0;L;;;;;N;;;;;
+1D9FD;SIGNWRITING DYNAMIC EVERY OTHER TIME;So;0;L;;;;;N;;;;;
+1D9FE;SIGNWRITING DYNAMIC GRADUAL;So;0;L;;;;;N;;;;;
+1D9FF;SIGNWRITING HEAD;So;0;L;;;;;N;;;;;
+1DA00;SIGNWRITING HEAD RIM;Mn;0;NSM;;;;;N;;;;;
+1DA01;SIGNWRITING HEAD MOVEMENT-WALLPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;;
+1DA02;SIGNWRITING HEAD MOVEMENT-WALLPLANE TILT;Mn;0;NSM;;;;;N;;;;;
+1DA03;SIGNWRITING HEAD MOVEMENT-FLOORPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;;
+1DA04;SIGNWRITING HEAD MOVEMENT-WALLPLANE CURVE;Mn;0;NSM;;;;;N;;;;;
+1DA05;SIGNWRITING HEAD MOVEMENT-FLOORPLANE CURVE;Mn;0;NSM;;;;;N;;;;;
+1DA06;SIGNWRITING HEAD MOVEMENT CIRCLE;Mn;0;NSM;;;;;N;;;;;
+1DA07;SIGNWRITING FACE DIRECTION POSITION NOSE FORWARD TILTING;Mn;0;NSM;;;;;N;;;;;
+1DA08;SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN;Mn;0;NSM;;;;;N;;;;;
+1DA09;SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN TILTING;Mn;0;NSM;;;;;N;;;;;
+1DA0A;SIGNWRITING EYEBROWS STRAIGHT UP;Mn;0;NSM;;;;;N;;;;;
+1DA0B;SIGNWRITING EYEBROWS STRAIGHT NEUTRAL;Mn;0;NSM;;;;;N;;;;;
+1DA0C;SIGNWRITING EYEBROWS STRAIGHT DOWN;Mn;0;NSM;;;;;N;;;;;
+1DA0D;SIGNWRITING DREAMY EYEBROWS NEUTRAL DOWN;Mn;0;NSM;;;;;N;;;;;
+1DA0E;SIGNWRITING DREAMY EYEBROWS DOWN NEUTRAL;Mn;0;NSM;;;;;N;;;;;
+1DA0F;SIGNWRITING DREAMY EYEBROWS UP NEUTRAL;Mn;0;NSM;;;;;N;;;;;
+1DA10;SIGNWRITING DREAMY EYEBROWS NEUTRAL UP;Mn;0;NSM;;;;;N;;;;;
+1DA11;SIGNWRITING FOREHEAD NEUTRAL;Mn;0;NSM;;;;;N;;;;;
+1DA12;SIGNWRITING FOREHEAD CONTACT;Mn;0;NSM;;;;;N;;;;;
+1DA13;SIGNWRITING FOREHEAD WRINKLED;Mn;0;NSM;;;;;N;;;;;
+1DA14;SIGNWRITING EYES OPEN;Mn;0;NSM;;;;;N;;;;;
+1DA15;SIGNWRITING EYES SQUEEZED;Mn;0;NSM;;;;;N;;;;;
+1DA16;SIGNWRITING EYES CLOSED;Mn;0;NSM;;;;;N;;;;;
+1DA17;SIGNWRITING EYE BLINK SINGLE;Mn;0;NSM;;;;;N;;;;;
+1DA18;SIGNWRITING EYE BLINK MULTIPLE;Mn;0;NSM;;;;;N;;;;;
+1DA19;SIGNWRITING EYES HALF OPEN;Mn;0;NSM;;;;;N;;;;;
+1DA1A;SIGNWRITING EYES WIDE OPEN;Mn;0;NSM;;;;;N;;;;;
+1DA1B;SIGNWRITING EYES HALF CLOSED;Mn;0;NSM;;;;;N;;;;;
+1DA1C;SIGNWRITING EYES WIDENING MOVEMENT;Mn;0;NSM;;;;;N;;;;;
+1DA1D;SIGNWRITING EYE WINK;Mn;0;NSM;;;;;N;;;;;
+1DA1E;SIGNWRITING EYELASHES UP;Mn;0;NSM;;;;;N;;;;;
+1DA1F;SIGNWRITING EYELASHES DOWN;Mn;0;NSM;;;;;N;;;;;
+1DA20;SIGNWRITING EYELASHES FLUTTERING;Mn;0;NSM;;;;;N;;;;;
+1DA21;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;;
+1DA22;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT DOUBLE;Mn;0;NSM;;;;;N;;;;;
+1DA23;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT ALTERNATING;Mn;0;NSM;;;;;N;;;;;
+1DA24;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;;
+1DA25;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT DOUBLE;Mn;0;NSM;;;;;N;;;;;
+1DA26;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT ALTERNATING;Mn;0;NSM;;;;;N;;;;;
+1DA27;SIGNWRITING EYEGAZE-WALLPLANE CURVED;Mn;0;NSM;;;;;N;;;;;
+1DA28;SIGNWRITING EYEGAZE-FLOORPLANE CURVED;Mn;0;NSM;;;;;N;;;;;
+1DA29;SIGNWRITING EYEGAZE-WALLPLANE CIRCLING;Mn;0;NSM;;;;;N;;;;;
+1DA2A;SIGNWRITING CHEEKS PUFFED;Mn;0;NSM;;;;;N;;;;;
+1DA2B;SIGNWRITING CHEEKS NEUTRAL;Mn;0;NSM;;;;;N;;;;;
+1DA2C;SIGNWRITING CHEEKS SUCKED;Mn;0;NSM;;;;;N;;;;;
+1DA2D;SIGNWRITING TENSE CHEEKS HIGH;Mn;0;NSM;;;;;N;;;;;
+1DA2E;SIGNWRITING TENSE CHEEKS MIDDLE;Mn;0;NSM;;;;;N;;;;;
+1DA2F;SIGNWRITING TENSE CHEEKS LOW;Mn;0;NSM;;;;;N;;;;;
+1DA30;SIGNWRITING EARS;Mn;0;NSM;;;;;N;;;;;
+1DA31;SIGNWRITING NOSE NEUTRAL;Mn;0;NSM;;;;;N;;;;;
+1DA32;SIGNWRITING NOSE CONTACT;Mn;0;NSM;;;;;N;;;;;
+1DA33;SIGNWRITING NOSE WRINKLES;Mn;0;NSM;;;;;N;;;;;
+1DA34;SIGNWRITING NOSE WIGGLES;Mn;0;NSM;;;;;N;;;;;
+1DA35;SIGNWRITING AIR BLOWING OUT;Mn;0;NSM;;;;;N;;;;;
+1DA36;SIGNWRITING AIR SUCKING IN;Mn;0;NSM;;;;;N;;;;;
+1DA37;SIGNWRITING AIR BLOW SMALL ROTATIONS;So;0;L;;;;;N;;;;;
+1DA38;SIGNWRITING AIR SUCK SMALL ROTATIONS;So;0;L;;;;;N;;;;;
+1DA39;SIGNWRITING BREATH INHALE;So;0;L;;;;;N;;;;;
+1DA3A;SIGNWRITING BREATH EXHALE;So;0;L;;;;;N;;;;;
+1DA3B;SIGNWRITING MOUTH CLOSED NEUTRAL;Mn;0;NSM;;;;;N;;;;;
+1DA3C;SIGNWRITING MOUTH CLOSED FORWARD;Mn;0;NSM;;;;;N;;;;;
+1DA3D;SIGNWRITING MOUTH CLOSED CONTACT;Mn;0;NSM;;;;;N;;;;;
+1DA3E;SIGNWRITING MOUTH SMILE;Mn;0;NSM;;;;;N;;;;;
+1DA3F;SIGNWRITING MOUTH SMILE WRINKLED;Mn;0;NSM;;;;;N;;;;;
+1DA40;SIGNWRITING MOUTH SMILE OPEN;Mn;0;NSM;;;;;N;;;;;
+1DA41;SIGNWRITING MOUTH FROWN;Mn;0;NSM;;;;;N;;;;;
+1DA42;SIGNWRITING MOUTH FROWN WRINKLED;Mn;0;NSM;;;;;N;;;;;
+1DA43;SIGNWRITING MOUTH FROWN OPEN;Mn;0;NSM;;;;;N;;;;;
+1DA44;SIGNWRITING MOUTH OPEN CIRCLE;Mn;0;NSM;;;;;N;;;;;
+1DA45;SIGNWRITING MOUTH OPEN FORWARD;Mn;0;NSM;;;;;N;;;;;
+1DA46;SIGNWRITING MOUTH OPEN WRINKLED;Mn;0;NSM;;;;;N;;;;;
+1DA47;SIGNWRITING MOUTH OPEN OVAL;Mn;0;NSM;;;;;N;;;;;
+1DA48;SIGNWRITING MOUTH OPEN OVAL WRINKLED;Mn;0;NSM;;;;;N;;;;;
+1DA49;SIGNWRITING MOUTH OPEN OVAL YAWN;Mn;0;NSM;;;;;N;;;;;
+1DA4A;SIGNWRITING MOUTH OPEN RECTANGLE;Mn;0;NSM;;;;;N;;;;;
+1DA4B;SIGNWRITING MOUTH OPEN RECTANGLE WRINKLED;Mn;0;NSM;;;;;N;;;;;
+1DA4C;SIGNWRITING MOUTH OPEN RECTANGLE YAWN;Mn;0;NSM;;;;;N;;;;;
+1DA4D;SIGNWRITING MOUTH KISS;Mn;0;NSM;;;;;N;;;;;
+1DA4E;SIGNWRITING MOUTH KISS FORWARD;Mn;0;NSM;;;;;N;;;;;
+1DA4F;SIGNWRITING MOUTH KISS WRINKLED;Mn;0;NSM;;;;;N;;;;;
+1DA50;SIGNWRITING MOUTH TENSE;Mn;0;NSM;;;;;N;;;;;
+1DA51;SIGNWRITING MOUTH TENSE FORWARD;Mn;0;NSM;;;;;N;;;;;
+1DA52;SIGNWRITING MOUTH TENSE SUCKED;Mn;0;NSM;;;;;N;;;;;
+1DA53;SIGNWRITING LIPS PRESSED TOGETHER;Mn;0;NSM;;;;;N;;;;;
+1DA54;SIGNWRITING LIP LOWER OVER UPPER;Mn;0;NSM;;;;;N;;;;;
+1DA55;SIGNWRITING LIP UPPER OVER LOWER;Mn;0;NSM;;;;;N;;;;;
+1DA56;SIGNWRITING MOUTH CORNERS;Mn;0;NSM;;;;;N;;;;;
+1DA57;SIGNWRITING MOUTH WRINKLES SINGLE;Mn;0;NSM;;;;;N;;;;;
+1DA58;SIGNWRITING MOUTH WRINKLES DOUBLE;Mn;0;NSM;;;;;N;;;;;
+1DA59;SIGNWRITING TONGUE STICKING OUT FAR;Mn;0;NSM;;;;;N;;;;;
+1DA5A;SIGNWRITING TONGUE LICKING LIPS;Mn;0;NSM;;;;;N;;;;;
+1DA5B;SIGNWRITING TONGUE TIP BETWEEN LIPS;Mn;0;NSM;;;;;N;;;;;
+1DA5C;SIGNWRITING TONGUE TIP TOUCHING INSIDE MOUTH;Mn;0;NSM;;;;;N;;;;;
+1DA5D;SIGNWRITING TONGUE INSIDE MOUTH RELAXED;Mn;0;NSM;;;;;N;;;;;
+1DA5E;SIGNWRITING TONGUE MOVES AGAINST CHEEK;Mn;0;NSM;;;;;N;;;;;
+1DA5F;SIGNWRITING TONGUE CENTRE STICKING OUT;Mn;0;NSM;;;;;N;;;;;
+1DA60;SIGNWRITING TONGUE CENTRE INSIDE MOUTH;Mn;0;NSM;;;;;N;;;;;
+1DA61;SIGNWRITING TEETH;Mn;0;NSM;;;;;N;;;;;
+1DA62;SIGNWRITING TEETH MOVEMENT;Mn;0;NSM;;;;;N;;;;;
+1DA63;SIGNWRITING TEETH ON TONGUE;Mn;0;NSM;;;;;N;;;;;
+1DA64;SIGNWRITING TEETH ON TONGUE MOVEMENT;Mn;0;NSM;;;;;N;;;;;
+1DA65;SIGNWRITING TEETH ON LIPS;Mn;0;NSM;;;;;N;;;;;
+1DA66;SIGNWRITING TEETH ON LIPS MOVEMENT;Mn;0;NSM;;;;;N;;;;;
+1DA67;SIGNWRITING TEETH BITE LIPS;Mn;0;NSM;;;;;N;;;;;
+1DA68;SIGNWRITING MOVEMENT-WALLPLANE JAW;Mn;0;NSM;;;;;N;;;;;
+1DA69;SIGNWRITING MOVEMENT-FLOORPLANE JAW;Mn;0;NSM;;;;;N;;;;;
+1DA6A;SIGNWRITING NECK;Mn;0;NSM;;;;;N;;;;;
+1DA6B;SIGNWRITING HAIR;Mn;0;NSM;;;;;N;;;;;
+1DA6C;SIGNWRITING EXCITEMENT;Mn;0;NSM;;;;;N;;;;;
+1DA6D;SIGNWRITING SHOULDER HIP SPINE;So;0;L;;;;;N;;;;;
+1DA6E;SIGNWRITING SHOULDER HIP POSITIONS;So;0;L;;;;;N;;;;;
+1DA6F;SIGNWRITING WALLPLANE SHOULDER HIP MOVE;So;0;L;;;;;N;;;;;
+1DA70;SIGNWRITING FLOORPLANE SHOULDER HIP MOVE;So;0;L;;;;;N;;;;;
+1DA71;SIGNWRITING SHOULDER TILTING FROM WAIST;So;0;L;;;;;N;;;;;
+1DA72;SIGNWRITING TORSO-WALLPLANE STRAIGHT STRETCH;So;0;L;;;;;N;;;;;
+1DA73;SIGNWRITING TORSO-WALLPLANE CURVED BEND;So;0;L;;;;;N;;;;;
+1DA74;SIGNWRITING TORSO-FLOORPLANE TWISTING;So;0;L;;;;;N;;;;;
+1DA75;SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS;Mn;0;NSM;;;;;N;;;;;
+1DA76;SIGNWRITING LIMB COMBINATION;So;0;L;;;;;N;;;;;
+1DA77;SIGNWRITING LIMB LENGTH-1;So;0;L;;;;;N;;;;;
+1DA78;SIGNWRITING LIMB LENGTH-2;So;0;L;;;;;N;;;;;
+1DA79;SIGNWRITING LIMB LENGTH-3;So;0;L;;;;;N;;;;;
+1DA7A;SIGNWRITING LIMB LENGTH-4;So;0;L;;;;;N;;;;;
+1DA7B;SIGNWRITING LIMB LENGTH-5;So;0;L;;;;;N;;;;;
+1DA7C;SIGNWRITING LIMB LENGTH-6;So;0;L;;;;;N;;;;;
+1DA7D;SIGNWRITING LIMB LENGTH-7;So;0;L;;;;;N;;;;;
+1DA7E;SIGNWRITING FINGER;So;0;L;;;;;N;;;;;
+1DA7F;SIGNWRITING LOCATION-WALLPLANE SPACE;So;0;L;;;;;N;;;;;
+1DA80;SIGNWRITING LOCATION-FLOORPLANE SPACE;So;0;L;;;;;N;;;;;
+1DA81;SIGNWRITING LOCATION HEIGHT;So;0;L;;;;;N;;;;;
+1DA82;SIGNWRITING LOCATION WIDTH;So;0;L;;;;;N;;;;;
+1DA83;SIGNWRITING LOCATION DEPTH;So;0;L;;;;;N;;;;;
+1DA84;SIGNWRITING LOCATION HEAD NECK;Mn;0;NSM;;;;;N;;;;;
+1DA85;SIGNWRITING LOCATION TORSO;So;0;L;;;;;N;;;;;
+1DA86;SIGNWRITING LOCATION LIMBS DIGITS;So;0;L;;;;;N;;;;;
+1DA87;SIGNWRITING COMMA;Po;0;L;;;;;N;;;;;
+1DA88;SIGNWRITING FULL STOP;Po;0;L;;;;;N;;;;;
+1DA89;SIGNWRITING SEMICOLON;Po;0;L;;;;;N;;;;;
+1DA8A;SIGNWRITING COLON;Po;0;L;;;;;N;;;;;
+1DA8B;SIGNWRITING PARENTHESIS;Po;0;L;;;;;N;;;;;
+1DA9B;SIGNWRITING FILL MODIFIER-2;Mn;0;NSM;;;;;N;;;;;
+1DA9C;SIGNWRITING FILL MODIFIER-3;Mn;0;NSM;;;;;N;;;;;
+1DA9D;SIGNWRITING FILL MODIFIER-4;Mn;0;NSM;;;;;N;;;;;
+1DA9E;SIGNWRITING FILL MODIFIER-5;Mn;0;NSM;;;;;N;;;;;
+1DA9F;SIGNWRITING FILL MODIFIER-6;Mn;0;NSM;;;;;N;;;;;
+1DAA1;SIGNWRITING ROTATION MODIFIER-2;Mn;0;NSM;;;;;N;;;;;
+1DAA2;SIGNWRITING ROTATION MODIFIER-3;Mn;0;NSM;;;;;N;;;;;
+1DAA3;SIGNWRITING ROTATION MODIFIER-4;Mn;0;NSM;;;;;N;;;;;
+1DAA4;SIGNWRITING ROTATION MODIFIER-5;Mn;0;NSM;;;;;N;;;;;
+1DAA5;SIGNWRITING ROTATION MODIFIER-6;Mn;0;NSM;;;;;N;;;;;
+1DAA6;SIGNWRITING ROTATION MODIFIER-7;Mn;0;NSM;;;;;N;;;;;
+1DAA7;SIGNWRITING ROTATION MODIFIER-8;Mn;0;NSM;;;;;N;;;;;
+1DAA8;SIGNWRITING ROTATION MODIFIER-9;Mn;0;NSM;;;;;N;;;;;
+1DAA9;SIGNWRITING ROTATION MODIFIER-10;Mn;0;NSM;;;;;N;;;;;
+1DAAA;SIGNWRITING ROTATION MODIFIER-11;Mn;0;NSM;;;;;N;;;;;
+1DAAB;SIGNWRITING ROTATION MODIFIER-12;Mn;0;NSM;;;;;N;;;;;
+1DAAC;SIGNWRITING ROTATION MODIFIER-13;Mn;0;NSM;;;;;N;;;;;
+1DAAD;SIGNWRITING ROTATION MODIFIER-14;Mn;0;NSM;;;;;N;;;;;
+1DAAE;SIGNWRITING ROTATION MODIFIER-15;Mn;0;NSM;;;;;N;;;;;
+1DAAF;SIGNWRITING ROTATION MODIFIER-16;Mn;0;NSM;;;;;N;;;;;
+1E000;COMBINING GLAGOLITIC LETTER AZU;Mn;230;NSM;;;;;N;;;;;
+1E001;COMBINING GLAGOLITIC LETTER BUKY;Mn;230;NSM;;;;;N;;;;;
+1E002;COMBINING GLAGOLITIC LETTER VEDE;Mn;230;NSM;;;;;N;;;;;
+1E003;COMBINING GLAGOLITIC LETTER GLAGOLI;Mn;230;NSM;;;;;N;;;;;
+1E004;COMBINING GLAGOLITIC LETTER DOBRO;Mn;230;NSM;;;;;N;;;;;
+1E005;COMBINING GLAGOLITIC LETTER YESTU;Mn;230;NSM;;;;;N;;;;;
+1E006;COMBINING GLAGOLITIC LETTER ZHIVETE;Mn;230;NSM;;;;;N;;;;;
+1E008;COMBINING GLAGOLITIC LETTER ZEMLJA;Mn;230;NSM;;;;;N;;;;;
+1E009;COMBINING GLAGOLITIC LETTER IZHE;Mn;230;NSM;;;;;N;;;;;
+1E00A;COMBINING GLAGOLITIC LETTER INITIAL IZHE;Mn;230;NSM;;;;;N;;;;;
+1E00B;COMBINING GLAGOLITIC LETTER I;Mn;230;NSM;;;;;N;;;;;
+1E00C;COMBINING GLAGOLITIC LETTER DJERVI;Mn;230;NSM;;;;;N;;;;;
+1E00D;COMBINING GLAGOLITIC LETTER KAKO;Mn;230;NSM;;;;;N;;;;;
+1E00E;COMBINING GLAGOLITIC LETTER LJUDIJE;Mn;230;NSM;;;;;N;;;;;
+1E00F;COMBINING GLAGOLITIC LETTER MYSLITE;Mn;230;NSM;;;;;N;;;;;
+1E010;COMBINING GLAGOLITIC LETTER NASHI;Mn;230;NSM;;;;;N;;;;;
+1E011;COMBINING GLAGOLITIC LETTER ONU;Mn;230;NSM;;;;;N;;;;;
+1E012;COMBINING GLAGOLITIC LETTER POKOJI;Mn;230;NSM;;;;;N;;;;;
+1E013;COMBINING GLAGOLITIC LETTER RITSI;Mn;230;NSM;;;;;N;;;;;
+1E014;COMBINING GLAGOLITIC LETTER SLOVO;Mn;230;NSM;;;;;N;;;;;
+1E015;COMBINING GLAGOLITIC LETTER TVRIDO;Mn;230;NSM;;;;;N;;;;;
+1E016;COMBINING GLAGOLITIC LETTER UKU;Mn;230;NSM;;;;;N;;;;;
+1E017;COMBINING GLAGOLITIC LETTER FRITU;Mn;230;NSM;;;;;N;;;;;
+1E018;COMBINING GLAGOLITIC LETTER HERU;Mn;230;NSM;;;;;N;;;;;
+1E01B;COMBINING GLAGOLITIC LETTER SHTA;Mn;230;NSM;;;;;N;;;;;
+1E01C;COMBINING GLAGOLITIC LETTER TSI;Mn;230;NSM;;;;;N;;;;;
+1E01D;COMBINING GLAGOLITIC LETTER CHRIVI;Mn;230;NSM;;;;;N;;;;;
+1E01E;COMBINING GLAGOLITIC LETTER SHA;Mn;230;NSM;;;;;N;;;;;
+1E01F;COMBINING GLAGOLITIC LETTER YERU;Mn;230;NSM;;;;;N;;;;;
+1E020;COMBINING GLAGOLITIC LETTER YERI;Mn;230;NSM;;;;;N;;;;;
+1E021;COMBINING GLAGOLITIC LETTER YATI;Mn;230;NSM;;;;;N;;;;;
+1E023;COMBINING GLAGOLITIC LETTER YU;Mn;230;NSM;;;;;N;;;;;
+1E024;COMBINING GLAGOLITIC LETTER SMALL YUS;Mn;230;NSM;;;;;N;;;;;
+1E026;COMBINING GLAGOLITIC LETTER YO;Mn;230;NSM;;;;;N;;;;;
+1E027;COMBINING GLAGOLITIC LETTER IOTATED SMALL YUS;Mn;230;NSM;;;;;N;;;;;
+1E028;COMBINING GLAGOLITIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;;
+1E029;COMBINING GLAGOLITIC LETTER IOTATED BIG YUS;Mn;230;NSM;;;;;N;;;;;
+1E02A;COMBINING GLAGOLITIC LETTER FITA;Mn;230;NSM;;;;;N;;;;;
+1E800;MENDE KIKAKUI SYLLABLE M001 KI;Lo;0;R;;;;;N;;;;;
+1E801;MENDE KIKAKUI SYLLABLE M002 KA;Lo;0;R;;;;;N;;;;;
+1E802;MENDE KIKAKUI SYLLABLE M003 KU;Lo;0;R;;;;;N;;;;;
+1E803;MENDE KIKAKUI SYLLABLE M065 KEE;Lo;0;R;;;;;N;;;;;
+1E804;MENDE KIKAKUI SYLLABLE M095 KE;Lo;0;R;;;;;N;;;;;
+1E805;MENDE KIKAKUI SYLLABLE M076 KOO;Lo;0;R;;;;;N;;;;;
+1E806;MENDE KIKAKUI SYLLABLE M048 KO;Lo;0;R;;;;;N;;;;;
+1E807;MENDE KIKAKUI SYLLABLE M179 KUA;Lo;0;R;;;;;N;;;;;
+1E808;MENDE KIKAKUI SYLLABLE M004 WI;Lo;0;R;;;;;N;;;;;
+1E809;MENDE KIKAKUI SYLLABLE M005 WA;Lo;0;R;;;;;N;;;;;
+1E80A;MENDE KIKAKUI SYLLABLE M006 WU;Lo;0;R;;;;;N;;;;;
+1E80B;MENDE KIKAKUI SYLLABLE M126 WEE;Lo;0;R;;;;;N;;;;;
+1E80C;MENDE KIKAKUI SYLLABLE M118 WE;Lo;0;R;;;;;N;;;;;
+1E80D;MENDE KIKAKUI SYLLABLE M114 WOO;Lo;0;R;;;;;N;;;;;
+1E80E;MENDE KIKAKUI SYLLABLE M045 WO;Lo;0;R;;;;;N;;;;;
+1E80F;MENDE KIKAKUI SYLLABLE M194 WUI;Lo;0;R;;;;;N;;;;;
+1E810;MENDE KIKAKUI SYLLABLE M143 WEI;Lo;0;R;;;;;N;;;;;
+1E811;MENDE KIKAKUI SYLLABLE M061 WVI;Lo;0;R;;;;;N;;;;;
+1E812;MENDE KIKAKUI SYLLABLE M049 WVA;Lo;0;R;;;;;N;;;;;
+1E813;MENDE KIKAKUI SYLLABLE M139 WVE;Lo;0;R;;;;;N;;;;;
+1E814;MENDE KIKAKUI SYLLABLE M007 MIN;Lo;0;R;;;;;N;;;;;
+1E815;MENDE KIKAKUI SYLLABLE M008 MAN;Lo;0;R;;;;;N;;;;;
+1E816;MENDE KIKAKUI SYLLABLE M009 MUN;Lo;0;R;;;;;N;;;;;
+1E817;MENDE KIKAKUI SYLLABLE M059 MEN;Lo;0;R;;;;;N;;;;;
+1E818;MENDE KIKAKUI SYLLABLE M094 MON;Lo;0;R;;;;;N;;;;;
+1E819;MENDE KIKAKUI SYLLABLE M154 MUAN;Lo;0;R;;;;;N;;;;;
+1E81A;MENDE KIKAKUI SYLLABLE M189 MUEN;Lo;0;R;;;;;N;;;;;
+1E81B;MENDE KIKAKUI SYLLABLE M010 BI;Lo;0;R;;;;;N;;;;;
+1E81C;MENDE KIKAKUI SYLLABLE M011 BA;Lo;0;R;;;;;N;;;;;
+1E81D;MENDE KIKAKUI SYLLABLE M012 BU;Lo;0;R;;;;;N;;;;;
+1E81E;MENDE KIKAKUI SYLLABLE M150 BEE;Lo;0;R;;;;;N;;;;;
+1E81F;MENDE KIKAKUI SYLLABLE M097 BE;Lo;0;R;;;;;N;;;;;
+1E820;MENDE KIKAKUI SYLLABLE M103 BOO;Lo;0;R;;;;;N;;;;;
+1E821;MENDE KIKAKUI SYLLABLE M138 BO;Lo;0;R;;;;;N;;;;;
+1E822;MENDE KIKAKUI SYLLABLE M013 I;Lo;0;R;;;;;N;;;;;
+1E823;MENDE KIKAKUI SYLLABLE M014 A;Lo;0;R;;;;;N;;;;;
+1E824;MENDE KIKAKUI SYLLABLE M015 U;Lo;0;R;;;;;N;;;;;
+1E825;MENDE KIKAKUI SYLLABLE M163 EE;Lo;0;R;;;;;N;;;;;
+1E826;MENDE KIKAKUI SYLLABLE M100 E;Lo;0;R;;;;;N;;;;;
+1E827;MENDE KIKAKUI SYLLABLE M165 OO;Lo;0;R;;;;;N;;;;;
+1E828;MENDE KIKAKUI SYLLABLE M147 O;Lo;0;R;;;;;N;;;;;
+1E829;MENDE KIKAKUI SYLLABLE M137 EI;Lo;0;R;;;;;N;;;;;
+1E82A;MENDE KIKAKUI SYLLABLE M131 IN;Lo;0;R;;;;;N;;;;;
+1E82B;MENDE KIKAKUI SYLLABLE M135 IN;Lo;0;R;;;;;N;;;;;
+1E82C;MENDE KIKAKUI SYLLABLE M195 AN;Lo;0;R;;;;;N;;;;;
+1E82D;MENDE KIKAKUI SYLLABLE M178 EN;Lo;0;R;;;;;N;;;;;
+1E82E;MENDE KIKAKUI SYLLABLE M019 SI;Lo;0;R;;;;;N;;;;;
+1E82F;MENDE KIKAKUI SYLLABLE M020 SA;Lo;0;R;;;;;N;;;;;
+1E830;MENDE KIKAKUI SYLLABLE M021 SU;Lo;0;R;;;;;N;;;;;
+1E831;MENDE KIKAKUI SYLLABLE M162 SEE;Lo;0;R;;;;;N;;;;;
+1E832;MENDE KIKAKUI SYLLABLE M116 SE;Lo;0;R;;;;;N;;;;;
+1E833;MENDE KIKAKUI SYLLABLE M136 SOO;Lo;0;R;;;;;N;;;;;
+1E834;MENDE KIKAKUI SYLLABLE M079 SO;Lo;0;R;;;;;N;;;;;
+1E835;MENDE KIKAKUI SYLLABLE M196 SIA;Lo;0;R;;;;;N;;;;;
+1E836;MENDE KIKAKUI SYLLABLE M025 LI;Lo;0;R;;;;;N;;;;;
+1E837;MENDE KIKAKUI SYLLABLE M026 LA;Lo;0;R;;;;;N;;;;;
+1E838;MENDE KIKAKUI SYLLABLE M027 LU;Lo;0;R;;;;;N;;;;;
+1E839;MENDE KIKAKUI SYLLABLE M084 LEE;Lo;0;R;;;;;N;;;;;
+1E83A;MENDE KIKAKUI SYLLABLE M073 LE;Lo;0;R;;;;;N;;;;;
+1E83B;MENDE KIKAKUI SYLLABLE M054 LOO;Lo;0;R;;;;;N;;;;;
+1E83C;MENDE KIKAKUI SYLLABLE M153 LO;Lo;0;R;;;;;N;;;;;
+1E83D;MENDE KIKAKUI SYLLABLE M110 LONG LE;Lo;0;R;;;;;N;;;;;
+1E83E;MENDE KIKAKUI SYLLABLE M016 DI;Lo;0;R;;;;;N;;;;;
+1E83F;MENDE KIKAKUI SYLLABLE M017 DA;Lo;0;R;;;;;N;;;;;
+1E840;MENDE KIKAKUI SYLLABLE M018 DU;Lo;0;R;;;;;N;;;;;
+1E841;MENDE KIKAKUI SYLLABLE M089 DEE;Lo;0;R;;;;;N;;;;;
+1E842;MENDE KIKAKUI SYLLABLE M180 DOO;Lo;0;R;;;;;N;;;;;
+1E843;MENDE KIKAKUI SYLLABLE M181 DO;Lo;0;R;;;;;N;;;;;
+1E844;MENDE KIKAKUI SYLLABLE M022 TI;Lo;0;R;;;;;N;;;;;
+1E845;MENDE KIKAKUI SYLLABLE M023 TA;Lo;0;R;;;;;N;;;;;
+1E846;MENDE KIKAKUI SYLLABLE M024 TU;Lo;0;R;;;;;N;;;;;
+1E847;MENDE KIKAKUI SYLLABLE M091 TEE;Lo;0;R;;;;;N;;;;;
+1E848;MENDE KIKAKUI SYLLABLE M055 TE;Lo;0;R;;;;;N;;;;;
+1E849;MENDE KIKAKUI SYLLABLE M104 TOO;Lo;0;R;;;;;N;;;;;
+1E84A;MENDE KIKAKUI SYLLABLE M069 TO;Lo;0;R;;;;;N;;;;;
+1E84B;MENDE KIKAKUI SYLLABLE M028 JI;Lo;0;R;;;;;N;;;;;
+1E84C;MENDE KIKAKUI SYLLABLE M029 JA;Lo;0;R;;;;;N;;;;;
+1E84D;MENDE KIKAKUI SYLLABLE M030 JU;Lo;0;R;;;;;N;;;;;
+1E84E;MENDE KIKAKUI SYLLABLE M157 JEE;Lo;0;R;;;;;N;;;;;
+1E84F;MENDE KIKAKUI SYLLABLE M113 JE;Lo;0;R;;;;;N;;;;;
+1E850;MENDE KIKAKUI SYLLABLE M160 JOO;Lo;0;R;;;;;N;;;;;
+1E851;MENDE KIKAKUI SYLLABLE M063 JO;Lo;0;R;;;;;N;;;;;
+1E852;MENDE KIKAKUI SYLLABLE M175 LONG JO;Lo;0;R;;;;;N;;;;;
+1E853;MENDE KIKAKUI SYLLABLE M031 YI;Lo;0;R;;;;;N;;;;;
+1E854;MENDE KIKAKUI SYLLABLE M032 YA;Lo;0;R;;;;;N;;;;;
+1E855;MENDE KIKAKUI SYLLABLE M033 YU;Lo;0;R;;;;;N;;;;;
+1E856;MENDE KIKAKUI SYLLABLE M109 YEE;Lo;0;R;;;;;N;;;;;
+1E857;MENDE KIKAKUI SYLLABLE M080 YE;Lo;0;R;;;;;N;;;;;
+1E858;MENDE KIKAKUI SYLLABLE M141 YOO;Lo;0;R;;;;;N;;;;;
+1E859;MENDE KIKAKUI SYLLABLE M121 YO;Lo;0;R;;;;;N;;;;;
+1E85A;MENDE KIKAKUI SYLLABLE M034 FI;Lo;0;R;;;;;N;;;;;
+1E85B;MENDE KIKAKUI SYLLABLE M035 FA;Lo;0;R;;;;;N;;;;;
+1E85C;MENDE KIKAKUI SYLLABLE M036 FU;Lo;0;R;;;;;N;;;;;
+1E85D;MENDE KIKAKUI SYLLABLE M078 FEE;Lo;0;R;;;;;N;;;;;
+1E85E;MENDE KIKAKUI SYLLABLE M075 FE;Lo;0;R;;;;;N;;;;;
+1E85F;MENDE KIKAKUI SYLLABLE M133 FOO;Lo;0;R;;;;;N;;;;;
+1E860;MENDE KIKAKUI SYLLABLE M088 FO;Lo;0;R;;;;;N;;;;;
+1E861;MENDE KIKAKUI SYLLABLE M197 FUA;Lo;0;R;;;;;N;;;;;
+1E862;MENDE KIKAKUI SYLLABLE M101 FAN;Lo;0;R;;;;;N;;;;;
+1E863;MENDE KIKAKUI SYLLABLE M037 NIN;Lo;0;R;;;;;N;;;;;
+1E864;MENDE KIKAKUI SYLLABLE M038 NAN;Lo;0;R;;;;;N;;;;;
+1E865;MENDE KIKAKUI SYLLABLE M039 NUN;Lo;0;R;;;;;N;;;;;
+1E866;MENDE KIKAKUI SYLLABLE M117 NEN;Lo;0;R;;;;;N;;;;;
+1E867;MENDE KIKAKUI SYLLABLE M169 NON;Lo;0;R;;;;;N;;;;;
+1E868;MENDE KIKAKUI SYLLABLE M176 HI;Lo;0;R;;;;;N;;;;;
+1E869;MENDE KIKAKUI SYLLABLE M041 HA;Lo;0;R;;;;;N;;;;;
+1E86A;MENDE KIKAKUI SYLLABLE M186 HU;Lo;0;R;;;;;N;;;;;
+1E86B;MENDE KIKAKUI SYLLABLE M040 HEE;Lo;0;R;;;;;N;;;;;
+1E86C;MENDE KIKAKUI SYLLABLE M096 HE;Lo;0;R;;;;;N;;;;;
+1E86D;MENDE KIKAKUI SYLLABLE M042 HOO;Lo;0;R;;;;;N;;;;;
+1E86E;MENDE KIKAKUI SYLLABLE M140 HO;Lo;0;R;;;;;N;;;;;
+1E86F;MENDE KIKAKUI SYLLABLE M083 HEEI;Lo;0;R;;;;;N;;;;;
+1E870;MENDE KIKAKUI SYLLABLE M128 HOOU;Lo;0;R;;;;;N;;;;;
+1E871;MENDE KIKAKUI SYLLABLE M053 HIN;Lo;0;R;;;;;N;;;;;
+1E872;MENDE KIKAKUI SYLLABLE M130 HAN;Lo;0;R;;;;;N;;;;;
+1E873;MENDE KIKAKUI SYLLABLE M087 HUN;Lo;0;R;;;;;N;;;;;
+1E874;MENDE KIKAKUI SYLLABLE M052 HEN;Lo;0;R;;;;;N;;;;;
+1E875;MENDE KIKAKUI SYLLABLE M193 HON;Lo;0;R;;;;;N;;;;;
+1E876;MENDE KIKAKUI SYLLABLE M046 HUAN;Lo;0;R;;;;;N;;;;;
+1E877;MENDE KIKAKUI SYLLABLE M090 NGGI;Lo;0;R;;;;;N;;;;;
+1E878;MENDE KIKAKUI SYLLABLE M043 NGGA;Lo;0;R;;;;;N;;;;;
+1E879;MENDE KIKAKUI SYLLABLE M082 NGGU;Lo;0;R;;;;;N;;;;;
+1E87A;MENDE KIKAKUI SYLLABLE M115 NGGEE;Lo;0;R;;;;;N;;;;;
+1E87B;MENDE KIKAKUI SYLLABLE M146 NGGE;Lo;0;R;;;;;N;;;;;
+1E87C;MENDE KIKAKUI SYLLABLE M156 NGGOO;Lo;0;R;;;;;N;;;;;
+1E87D;MENDE KIKAKUI SYLLABLE M120 NGGO;Lo;0;R;;;;;N;;;;;
+1E87E;MENDE KIKAKUI SYLLABLE M159 NGGAA;Lo;0;R;;;;;N;;;;;
+1E87F;MENDE KIKAKUI SYLLABLE M127 NGGUA;Lo;0;R;;;;;N;;;;;
+1E880;MENDE KIKAKUI SYLLABLE M086 LONG NGGE;Lo;0;R;;;;;N;;;;;
+1E881;MENDE KIKAKUI SYLLABLE M106 LONG NGGOO;Lo;0;R;;;;;N;;;;;
+1E882;MENDE KIKAKUI SYLLABLE M183 LONG NGGO;Lo;0;R;;;;;N;;;;;
+1E883;MENDE KIKAKUI SYLLABLE M155 GI;Lo;0;R;;;;;N;;;;;
+1E884;MENDE KIKAKUI SYLLABLE M111 GA;Lo;0;R;;;;;N;;;;;
+1E885;MENDE KIKAKUI SYLLABLE M168 GU;Lo;0;R;;;;;N;;;;;
+1E886;MENDE KIKAKUI SYLLABLE M190 GEE;Lo;0;R;;;;;N;;;;;
+1E887;MENDE KIKAKUI SYLLABLE M166 GUEI;Lo;0;R;;;;;N;;;;;
+1E888;MENDE KIKAKUI SYLLABLE M167 GUAN;Lo;0;R;;;;;N;;;;;
+1E889;MENDE KIKAKUI SYLLABLE M184 NGEN;Lo;0;R;;;;;N;;;;;
+1E88A;MENDE KIKAKUI SYLLABLE M057 NGON;Lo;0;R;;;;;N;;;;;
+1E88B;MENDE KIKAKUI SYLLABLE M177 NGUAN;Lo;0;R;;;;;N;;;;;
+1E88C;MENDE KIKAKUI SYLLABLE M068 PI;Lo;0;R;;;;;N;;;;;
+1E88D;MENDE KIKAKUI SYLLABLE M099 PA;Lo;0;R;;;;;N;;;;;
+1E88E;MENDE KIKAKUI SYLLABLE M050 PU;Lo;0;R;;;;;N;;;;;
+1E88F;MENDE KIKAKUI SYLLABLE M081 PEE;Lo;0;R;;;;;N;;;;;
+1E890;MENDE KIKAKUI SYLLABLE M051 PE;Lo;0;R;;;;;N;;;;;
+1E891;MENDE KIKAKUI SYLLABLE M102 POO;Lo;0;R;;;;;N;;;;;
+1E892;MENDE KIKAKUI SYLLABLE M066 PO;Lo;0;R;;;;;N;;;;;
+1E893;MENDE KIKAKUI SYLLABLE M145 MBI;Lo;0;R;;;;;N;;;;;
+1E894;MENDE KIKAKUI SYLLABLE M062 MBA;Lo;0;R;;;;;N;;;;;
+1E895;MENDE KIKAKUI SYLLABLE M122 MBU;Lo;0;R;;;;;N;;;;;
+1E896;MENDE KIKAKUI SYLLABLE M047 MBEE;Lo;0;R;;;;;N;;;;;
+1E897;MENDE KIKAKUI SYLLABLE M188 MBEE;Lo;0;R;;;;;N;;;;;
+1E898;MENDE KIKAKUI SYLLABLE M072 MBE;Lo;0;R;;;;;N;;;;;
+1E899;MENDE KIKAKUI SYLLABLE M172 MBOO;Lo;0;R;;;;;N;;;;;
+1E89A;MENDE KIKAKUI SYLLABLE M174 MBO;Lo;0;R;;;;;N;;;;;
+1E89B;MENDE KIKAKUI SYLLABLE M187 MBUU;Lo;0;R;;;;;N;;;;;
+1E89C;MENDE KIKAKUI SYLLABLE M161 LONG MBE;Lo;0;R;;;;;N;;;;;
+1E89D;MENDE KIKAKUI SYLLABLE M105 LONG MBOO;Lo;0;R;;;;;N;;;;;
+1E89E;MENDE KIKAKUI SYLLABLE M142 LONG MBO;Lo;0;R;;;;;N;;;;;
+1E89F;MENDE KIKAKUI SYLLABLE M132 KPI;Lo;0;R;;;;;N;;;;;
+1E8A0;MENDE KIKAKUI SYLLABLE M092 KPA;Lo;0;R;;;;;N;;;;;
+1E8A1;MENDE KIKAKUI SYLLABLE M074 KPU;Lo;0;R;;;;;N;;;;;
+1E8A2;MENDE KIKAKUI SYLLABLE M044 KPEE;Lo;0;R;;;;;N;;;;;
+1E8A3;MENDE KIKAKUI SYLLABLE M108 KPE;Lo;0;R;;;;;N;;;;;
+1E8A4;MENDE KIKAKUI SYLLABLE M112 KPOO;Lo;0;R;;;;;N;;;;;
+1E8A5;MENDE KIKAKUI SYLLABLE M158 KPO;Lo;0;R;;;;;N;;;;;
+1E8A6;MENDE KIKAKUI SYLLABLE M124 GBI;Lo;0;R;;;;;N;;;;;
+1E8A7;MENDE KIKAKUI SYLLABLE M056 GBA;Lo;0;R;;;;;N;;;;;
+1E8A8;MENDE KIKAKUI SYLLABLE M148 GBU;Lo;0;R;;;;;N;;;;;
+1E8A9;MENDE KIKAKUI SYLLABLE M093 GBEE;Lo;0;R;;;;;N;;;;;
+1E8AA;MENDE KIKAKUI SYLLABLE M107 GBE;Lo;0;R;;;;;N;;;;;
+1E8AB;MENDE KIKAKUI SYLLABLE M071 GBOO;Lo;0;R;;;;;N;;;;;
+1E8AC;MENDE KIKAKUI SYLLABLE M070 GBO;Lo;0;R;;;;;N;;;;;
+1E8AD;MENDE KIKAKUI SYLLABLE M171 RA;Lo;0;R;;;;;N;;;;;
+1E8AE;MENDE KIKAKUI SYLLABLE M123 NDI;Lo;0;R;;;;;N;;;;;
+1E8AF;MENDE KIKAKUI SYLLABLE M129 NDA;Lo;0;R;;;;;N;;;;;
+1E8B0;MENDE KIKAKUI SYLLABLE M125 NDU;Lo;0;R;;;;;N;;;;;
+1E8B1;MENDE KIKAKUI SYLLABLE M191 NDEE;Lo;0;R;;;;;N;;;;;
+1E8B2;MENDE KIKAKUI SYLLABLE M119 NDE;Lo;0;R;;;;;N;;;;;
+1E8B3;MENDE KIKAKUI SYLLABLE M067 NDOO;Lo;0;R;;;;;N;;;;;
+1E8B4;MENDE KIKAKUI SYLLABLE M064 NDO;Lo;0;R;;;;;N;;;;;
+1E8B5;MENDE KIKAKUI SYLLABLE M152 NJA;Lo;0;R;;;;;N;;;;;
+1E8B6;MENDE KIKAKUI SYLLABLE M192 NJU;Lo;0;R;;;;;N;;;;;
+1E8B7;MENDE KIKAKUI SYLLABLE M149 NJEE;Lo;0;R;;;;;N;;;;;
+1E8B8;MENDE KIKAKUI SYLLABLE M134 NJOO;Lo;0;R;;;;;N;;;;;
+1E8B9;MENDE KIKAKUI SYLLABLE M182 VI;Lo;0;R;;;;;N;;;;;
+1E8BA;MENDE KIKAKUI SYLLABLE M185 VA;Lo;0;R;;;;;N;;;;;
+1E8BB;MENDE KIKAKUI SYLLABLE M151 VU;Lo;0;R;;;;;N;;;;;
+1E8BC;MENDE KIKAKUI SYLLABLE M173 VEE;Lo;0;R;;;;;N;;;;;
+1E8BD;MENDE KIKAKUI SYLLABLE M085 VE;Lo;0;R;;;;;N;;;;;
+1E8BE;MENDE KIKAKUI SYLLABLE M144 VOO;Lo;0;R;;;;;N;;;;;
+1E8BF;MENDE KIKAKUI SYLLABLE M077 VO;Lo;0;R;;;;;N;;;;;
+1E8C0;MENDE KIKAKUI SYLLABLE M164 NYIN;Lo;0;R;;;;;N;;;;;
+1E8C1;MENDE KIKAKUI SYLLABLE M058 NYAN;Lo;0;R;;;;;N;;;;;
+1E8C2;MENDE KIKAKUI SYLLABLE M170 NYUN;Lo;0;R;;;;;N;;;;;
+1E8C3;MENDE KIKAKUI SYLLABLE M098 NYEN;Lo;0;R;;;;;N;;;;;
+1E8C4;MENDE KIKAKUI SYLLABLE M060 NYON;Lo;0;R;;;;;N;;;;;
+1E8C7;MENDE KIKAKUI DIGIT ONE;No;0;R;;;;1;N;;;;;
+1E8C8;MENDE KIKAKUI DIGIT TWO;No;0;R;;;;2;N;;;;;
+1E8C9;MENDE KIKAKUI DIGIT THREE;No;0;R;;;;3;N;;;;;
+1E8CA;MENDE KIKAKUI DIGIT FOUR;No;0;R;;;;4;N;;;;;
+1E8CB;MENDE KIKAKUI DIGIT FIVE;No;0;R;;;;5;N;;;;;
+1E8CC;MENDE KIKAKUI DIGIT SIX;No;0;R;;;;6;N;;;;;
+1E8CD;MENDE KIKAKUI DIGIT SEVEN;No;0;R;;;;7;N;;;;;
+1E8CE;MENDE KIKAKUI DIGIT EIGHT;No;0;R;;;;8;N;;;;;
+1E8CF;MENDE KIKAKUI DIGIT NINE;No;0;R;;;;9;N;;;;;
+1E8D0;MENDE KIKAKUI COMBINING NUMBER TEENS;Mn;220;NSM;;;;;N;;;;;
+1E8D1;MENDE KIKAKUI COMBINING NUMBER TENS;Mn;220;NSM;;;;;N;;;;;
+1E8D2;MENDE KIKAKUI COMBINING NUMBER HUNDREDS;Mn;220;NSM;;;;;N;;;;;
+1E8D3;MENDE KIKAKUI COMBINING NUMBER THOUSANDS;Mn;220;NSM;;;;;N;;;;;
+1E8D4;MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS;Mn;220;NSM;;;;;N;;;;;
+1E8D5;MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS;Mn;220;NSM;;;;;N;;;;;
+1E8D6;MENDE KIKAKUI COMBINING NUMBER MILLIONS;Mn;220;NSM;;;;;N;;;;;
+1E900;ADLAM CAPITAL LETTER ALIF;Lu;0;R;;;;;N;;;;1E922;
+1E901;ADLAM CAPITAL LETTER DAALI;Lu;0;R;;;;;N;;;;1E923;
+1E902;ADLAM CAPITAL LETTER LAAM;Lu;0;R;;;;;N;;;;1E924;
+1E903;ADLAM CAPITAL LETTER MIIM;Lu;0;R;;;;;N;;;;1E925;
+1E904;ADLAM CAPITAL LETTER BA;Lu;0;R;;;;;N;;;;1E926;
+1E905;ADLAM CAPITAL LETTER SINNYIIYHE;Lu;0;R;;;;;N;;;;1E927;
+1E906;ADLAM CAPITAL LETTER PE;Lu;0;R;;;;;N;;;;1E928;
+1E907;ADLAM CAPITAL LETTER BHE;Lu;0;R;;;;;N;;;;1E929;
+1E908;ADLAM CAPITAL LETTER RA;Lu;0;R;;;;;N;;;;1E92A;
+1E909;ADLAM CAPITAL LETTER E;Lu;0;R;;;;;N;;;;1E92B;
+1E90A;ADLAM CAPITAL LETTER FA;Lu;0;R;;;;;N;;;;1E92C;
+1E90B;ADLAM CAPITAL LETTER I;Lu;0;R;;;;;N;;;;1E92D;
+1E90C;ADLAM CAPITAL LETTER O;Lu;0;R;;;;;N;;;;1E92E;
+1E90D;ADLAM CAPITAL LETTER DHA;Lu;0;R;;;;;N;;;;1E92F;
+1E90E;ADLAM CAPITAL LETTER YHE;Lu;0;R;;;;;N;;;;1E930;
+1E90F;ADLAM CAPITAL LETTER WAW;Lu;0;R;;;;;N;;;;1E931;
+1E910;ADLAM CAPITAL LETTER NUN;Lu;0;R;;;;;N;;;;1E932;
+1E911;ADLAM CAPITAL LETTER KAF;Lu;0;R;;;;;N;;;;1E933;
+1E912;ADLAM CAPITAL LETTER YA;Lu;0;R;;;;;N;;;;1E934;
+1E913;ADLAM CAPITAL LETTER U;Lu;0;R;;;;;N;;;;1E935;
+1E914;ADLAM CAPITAL LETTER JIIM;Lu;0;R;;;;;N;;;;1E936;
+1E915;ADLAM CAPITAL LETTER CHI;Lu;0;R;;;;;N;;;;1E937;
+1E916;ADLAM CAPITAL LETTER HA;Lu;0;R;;;;;N;;;;1E938;
+1E917;ADLAM CAPITAL LETTER QAAF;Lu;0;R;;;;;N;;;;1E939;
+1E918;ADLAM CAPITAL LETTER GA;Lu;0;R;;;;;N;;;;1E93A;
+1E919;ADLAM CAPITAL LETTER NYA;Lu;0;R;;;;;N;;;;1E93B;
+1E91A;ADLAM CAPITAL LETTER TU;Lu;0;R;;;;;N;;;;1E93C;
+1E91B;ADLAM CAPITAL LETTER NHA;Lu;0;R;;;;;N;;;;1E93D;
+1E91C;ADLAM CAPITAL LETTER VA;Lu;0;R;;;;;N;;;;1E93E;
+1E91D;ADLAM CAPITAL LETTER KHA;Lu;0;R;;;;;N;;;;1E93F;
+1E91E;ADLAM CAPITAL LETTER GBE;Lu;0;R;;;;;N;;;;1E940;
+1E91F;ADLAM CAPITAL LETTER ZAL;Lu;0;R;;;;;N;;;;1E941;
+1E920;ADLAM CAPITAL LETTER KPO;Lu;0;R;;;;;N;;;;1E942;
+1E921;ADLAM CAPITAL LETTER SHA;Lu;0;R;;;;;N;;;;1E943;
+1E922;ADLAM SMALL LETTER ALIF;Ll;0;R;;;;;N;;;1E900;;1E900
+1E923;ADLAM SMALL LETTER DAALI;Ll;0;R;;;;;N;;;1E901;;1E901
+1E924;ADLAM SMALL LETTER LAAM;Ll;0;R;;;;;N;;;1E902;;1E902
+1E925;ADLAM SMALL LETTER MIIM;Ll;0;R;;;;;N;;;1E903;;1E903
+1E926;ADLAM SMALL LETTER BA;Ll;0;R;;;;;N;;;1E904;;1E904
+1E927;ADLAM SMALL LETTER SINNYIIYHE;Ll;0;R;;;;;N;;;1E905;;1E905
+1E928;ADLAM SMALL LETTER PE;Ll;0;R;;;;;N;;;1E906;;1E906
+1E929;ADLAM SMALL LETTER BHE;Ll;0;R;;;;;N;;;1E907;;1E907
+1E92A;ADLAM SMALL LETTER RA;Ll;0;R;;;;;N;;;1E908;;1E908
+1E92B;ADLAM SMALL LETTER E;Ll;0;R;;;;;N;;;1E909;;1E909
+1E92C;ADLAM SMALL LETTER FA;Ll;0;R;;;;;N;;;1E90A;;1E90A
+1E92D;ADLAM SMALL LETTER I;Ll;0;R;;;;;N;;;1E90B;;1E90B
+1E92E;ADLAM SMALL LETTER O;Ll;0;R;;;;;N;;;1E90C;;1E90C
+1E92F;ADLAM SMALL LETTER DHA;Ll;0;R;;;;;N;;;1E90D;;1E90D
+1E930;ADLAM SMALL LETTER YHE;Ll;0;R;;;;;N;;;1E90E;;1E90E
+1E931;ADLAM SMALL LETTER WAW;Ll;0;R;;;;;N;;;1E90F;;1E90F
+1E932;ADLAM SMALL LETTER NUN;Ll;0;R;;;;;N;;;1E910;;1E910
+1E933;ADLAM SMALL LETTER KAF;Ll;0;R;;;;;N;;;1E911;;1E911
+1E934;ADLAM SMALL LETTER YA;Ll;0;R;;;;;N;;;1E912;;1E912
+1E935;ADLAM SMALL LETTER U;Ll;0;R;;;;;N;;;1E913;;1E913
+1E936;ADLAM SMALL LETTER JIIM;Ll;0;R;;;;;N;;;1E914;;1E914
+1E937;ADLAM SMALL LETTER CHI;Ll;0;R;;;;;N;;;1E915;;1E915
+1E938;ADLAM SMALL LETTER HA;Ll;0;R;;;;;N;;;1E916;;1E916
+1E939;ADLAM SMALL LETTER QAAF;Ll;0;R;;;;;N;;;1E917;;1E917
+1E93A;ADLAM SMALL LETTER GA;Ll;0;R;;;;;N;;;1E918;;1E918
+1E93B;ADLAM SMALL LETTER NYA;Ll;0;R;;;;;N;;;1E919;;1E919
+1E93C;ADLAM SMALL LETTER TU;Ll;0;R;;;;;N;;;1E91A;;1E91A
+1E93D;ADLAM SMALL LETTER NHA;Ll;0;R;;;;;N;;;1E91B;;1E91B
+1E93E;ADLAM SMALL LETTER VA;Ll;0;R;;;;;N;;;1E91C;;1E91C
+1E93F;ADLAM SMALL LETTER KHA;Ll;0;R;;;;;N;;;1E91D;;1E91D
+1E940;ADLAM SMALL LETTER GBE;Ll;0;R;;;;;N;;;1E91E;;1E91E
+1E941;ADLAM SMALL LETTER ZAL;Ll;0;R;;;;;N;;;1E91F;;1E91F
+1E942;ADLAM SMALL LETTER KPO;Ll;0;R;;;;;N;;;1E920;;1E920
+1E943;ADLAM SMALL LETTER SHA;Ll;0;R;;;;;N;;;1E921;;1E921
+1E944;ADLAM ALIF LENGTHENER;Mn;230;NSM;;;;;N;;;;;
+1E945;ADLAM VOWEL LENGTHENER;Mn;230;NSM;;;;;N;;;;;
+1E946;ADLAM GEMINATION MARK;Mn;230;NSM;;;;;N;;;;;
+1E947;ADLAM HAMZA;Mn;230;NSM;;;;;N;;;;;
+1E948;ADLAM CONSONANT MODIFIER;Mn;230;NSM;;;;;N;;;;;
+1E949;ADLAM GEMINATE CONSONANT MODIFIER;Mn;230;NSM;;;;;N;;;;;
+1E94A;ADLAM NUKTA;Mn;7;NSM;;;;;N;;;;;
+1E950;ADLAM DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;;
+1E951;ADLAM DIGIT ONE;Nd;0;R;;1;1;1;N;;;;;
+1E952;ADLAM DIGIT TWO;Nd;0;R;;2;2;2;N;;;;;
+1E953;ADLAM DIGIT THREE;Nd;0;R;;3;3;3;N;;;;;
+1E954;ADLAM DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;;
+1E955;ADLAM DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;;
+1E956;ADLAM DIGIT SIX;Nd;0;R;;6;6;6;N;;;;;
+1E957;ADLAM DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;;
+1E958;ADLAM DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;;
+1E959;ADLAM DIGIT NINE;Nd;0;R;;9;9;9;N;;;;;
+1E95E;ADLAM INITIAL EXCLAMATION MARK;Po;0;R;;;;;N;;;;;
+1E95F;ADLAM INITIAL QUESTION MARK;Po;0;R;;;;;N;;;;;
+1EE00;ARABIC MATHEMATICAL ALEF;Lo;0;AL;<font> 0627;;;;N;;;;;
+1EE01;ARABIC MATHEMATICAL BEH;Lo;0;AL;<font> 0628;;;;N;;;;;
+1EE02;ARABIC MATHEMATICAL JEEM;Lo;0;AL;<font> 062C;;;;N;;;;;
+1EE03;ARABIC MATHEMATICAL DAL;Lo;0;AL;<font> 062F;;;;N;;;;;
+1EE05;ARABIC MATHEMATICAL WAW;Lo;0;AL;<font> 0648;;;;N;;;;;
+1EE06;ARABIC MATHEMATICAL ZAIN;Lo;0;AL;<font> 0632;;;;N;;;;;
+1EE07;ARABIC MATHEMATICAL HAH;Lo;0;AL;<font> 062D;;;;N;;;;;
+1EE08;ARABIC MATHEMATICAL TAH;Lo;0;AL;<font> 0637;;;;N;;;;;
+1EE09;ARABIC MATHEMATICAL YEH;Lo;0;AL;<font> 064A;;;;N;;;;;
+1EE0A;ARABIC MATHEMATICAL KAF;Lo;0;AL;<font> 0643;;;;N;;;;;
+1EE0B;ARABIC MATHEMATICAL LAM;Lo;0;AL;<font> 0644;;;;N;;;;;
+1EE0C;ARABIC MATHEMATICAL MEEM;Lo;0;AL;<font> 0645;;;;N;;;;;
+1EE0D;ARABIC MATHEMATICAL NOON;Lo;0;AL;<font> 0646;;;;N;;;;;
+1EE0E;ARABIC MATHEMATICAL SEEN;Lo;0;AL;<font> 0633;;;;N;;;;;
+1EE0F;ARABIC MATHEMATICAL AIN;Lo;0;AL;<font> 0639;;;;N;;;;;
+1EE10;ARABIC MATHEMATICAL FEH;Lo;0;AL;<font> 0641;;;;N;;;;;
+1EE11;ARABIC MATHEMATICAL SAD;Lo;0;AL;<font> 0635;;;;N;;;;;
+1EE12;ARABIC MATHEMATICAL QAF;Lo;0;AL;<font> 0642;;;;N;;;;;
+1EE13;ARABIC MATHEMATICAL REH;Lo;0;AL;<font> 0631;;;;N;;;;;
+1EE14;ARABIC MATHEMATICAL SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;;
+1EE15;ARABIC MATHEMATICAL TEH;Lo;0;AL;<font> 062A;;;;N;;;;;
+1EE16;ARABIC MATHEMATICAL THEH;Lo;0;AL;<font> 062B;;;;N;;;;;
+1EE17;ARABIC MATHEMATICAL KHAH;Lo;0;AL;<font> 062E;;;;N;;;;;
+1EE18;ARABIC MATHEMATICAL THAL;Lo;0;AL;<font> 0630;;;;N;;;;;
+1EE19;ARABIC MATHEMATICAL DAD;Lo;0;AL;<font> 0636;;;;N;;;;;
+1EE1A;ARABIC MATHEMATICAL ZAH;Lo;0;AL;<font> 0638;;;;N;;;;;
+1EE1B;ARABIC MATHEMATICAL GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;;
+1EE1C;ARABIC MATHEMATICAL DOTLESS BEH;Lo;0;AL;<font> 066E;;;;N;;;;;
+1EE1D;ARABIC MATHEMATICAL DOTLESS NOON;Lo;0;AL;<font> 06BA;;;;N;;;;;
+1EE1E;ARABIC MATHEMATICAL DOTLESS FEH;Lo;0;AL;<font> 06A1;;;;N;;;;;
+1EE1F;ARABIC MATHEMATICAL DOTLESS QAF;Lo;0;AL;<font> 066F;;;;N;;;;;
+1EE21;ARABIC MATHEMATICAL INITIAL BEH;Lo;0;AL;<font> 0628;;;;N;;;;;
+1EE22;ARABIC MATHEMATICAL INITIAL JEEM;Lo;0;AL;<font> 062C;;;;N;;;;;
+1EE24;ARABIC MATHEMATICAL INITIAL HEH;Lo;0;AL;<font> 0647;;;;N;;;;;
+1EE27;ARABIC MATHEMATICAL INITIAL HAH;Lo;0;AL;<font> 062D;;;;N;;;;;
+1EE29;ARABIC MATHEMATICAL INITIAL YEH;Lo;0;AL;<font> 064A;;;;N;;;;;
+1EE2A;ARABIC MATHEMATICAL INITIAL KAF;Lo;0;AL;<font> 0643;;;;N;;;;;
+1EE2B;ARABIC MATHEMATICAL INITIAL LAM;Lo;0;AL;<font> 0644;;;;N;;;;;
+1EE2C;ARABIC MATHEMATICAL INITIAL MEEM;Lo;0;AL;<font> 0645;;;;N;;;;;
+1EE2D;ARABIC MATHEMATICAL INITIAL NOON;Lo;0;AL;<font> 0646;;;;N;;;;;
+1EE2E;ARABIC MATHEMATICAL INITIAL SEEN;Lo;0;AL;<font> 0633;;;;N;;;;;
+1EE2F;ARABIC MATHEMATICAL INITIAL AIN;Lo;0;AL;<font> 0639;;;;N;;;;;
+1EE30;ARABIC MATHEMATICAL INITIAL FEH;Lo;0;AL;<font> 0641;;;;N;;;;;
+1EE31;ARABIC MATHEMATICAL INITIAL SAD;Lo;0;AL;<font> 0635;;;;N;;;;;
+1EE32;ARABIC MATHEMATICAL INITIAL QAF;Lo;0;AL;<font> 0642;;;;N;;;;;
+1EE34;ARABIC MATHEMATICAL INITIAL SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;;
+1EE35;ARABIC MATHEMATICAL INITIAL TEH;Lo;0;AL;<font> 062A;;;;N;;;;;
+1EE36;ARABIC MATHEMATICAL INITIAL THEH;Lo;0;AL;<font> 062B;;;;N;;;;;
+1EE37;ARABIC MATHEMATICAL INITIAL KHAH;Lo;0;AL;<font> 062E;;;;N;;;;;
+1EE39;ARABIC MATHEMATICAL INITIAL DAD;Lo;0;AL;<font> 0636;;;;N;;;;;
+1EE3B;ARABIC MATHEMATICAL INITIAL GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;;
+1EE42;ARABIC MATHEMATICAL TAILED JEEM;Lo;0;AL;<font> 062C;;;;N;;;;;
+1EE47;ARABIC MATHEMATICAL TAILED HAH;Lo;0;AL;<font> 062D;;;;N;;;;;
+1EE49;ARABIC MATHEMATICAL TAILED YEH;Lo;0;AL;<font> 064A;;;;N;;;;;
+1EE4B;ARABIC MATHEMATICAL TAILED LAM;Lo;0;AL;<font> 0644;;;;N;;;;;
+1EE4D;ARABIC MATHEMATICAL TAILED NOON;Lo;0;AL;<font> 0646;;;;N;;;;;
+1EE4E;ARABIC MATHEMATICAL TAILED SEEN;Lo;0;AL;<font> 0633;;;;N;;;;;
+1EE4F;ARABIC MATHEMATICAL TAILED AIN;Lo;0;AL;<font> 0639;;;;N;;;;;
+1EE51;ARABIC MATHEMATICAL TAILED SAD;Lo;0;AL;<font> 0635;;;;N;;;;;
+1EE52;ARABIC MATHEMATICAL TAILED QAF;Lo;0;AL;<font> 0642;;;;N;;;;;
+1EE54;ARABIC MATHEMATICAL TAILED SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;;
+1EE57;ARABIC MATHEMATICAL TAILED KHAH;Lo;0;AL;<font> 062E;;;;N;;;;;
+1EE59;ARABIC MATHEMATICAL TAILED DAD;Lo;0;AL;<font> 0636;;;;N;;;;;
+1EE5B;ARABIC MATHEMATICAL TAILED GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;;
+1EE5D;ARABIC MATHEMATICAL TAILED DOTLESS NOON;Lo;0;AL;<font> 06BA;;;;N;;;;;
+1EE5F;ARABIC MATHEMATICAL TAILED DOTLESS QAF;Lo;0;AL;<font> 066F;;;;N;;;;;
+1EE61;ARABIC MATHEMATICAL STRETCHED BEH;Lo;0;AL;<font> 0628;;;;N;;;;;
+1EE62;ARABIC MATHEMATICAL STRETCHED JEEM;Lo;0;AL;<font> 062C;;;;N;;;;;
+1EE64;ARABIC MATHEMATICAL STRETCHED HEH;Lo;0;AL;<font> 0647;;;;N;;;;;
+1EE67;ARABIC MATHEMATICAL STRETCHED HAH;Lo;0;AL;<font> 062D;;;;N;;;;;
+1EE68;ARABIC MATHEMATICAL STRETCHED TAH;Lo;0;AL;<font> 0637;;;;N;;;;;
+1EE69;ARABIC MATHEMATICAL STRETCHED YEH;Lo;0;AL;<font> 064A;;;;N;;;;;
+1EE6A;ARABIC MATHEMATICAL STRETCHED KAF;Lo;0;AL;<font> 0643;;;;N;;;;;
+1EE6C;ARABIC MATHEMATICAL STRETCHED MEEM;Lo;0;AL;<font> 0645;;;;N;;;;;
+1EE6D;ARABIC MATHEMATICAL STRETCHED NOON;Lo;0;AL;<font> 0646;;;;N;;;;;
+1EE6E;ARABIC MATHEMATICAL STRETCHED SEEN;Lo;0;AL;<font> 0633;;;;N;;;;;
+1EE6F;ARABIC MATHEMATICAL STRETCHED AIN;Lo;0;AL;<font> 0639;;;;N;;;;;
+1EE70;ARABIC MATHEMATICAL STRETCHED FEH;Lo;0;AL;<font> 0641;;;;N;;;;;
+1EE71;ARABIC MATHEMATICAL STRETCHED SAD;Lo;0;AL;<font> 0635;;;;N;;;;;
+1EE72;ARABIC MATHEMATICAL STRETCHED QAF;Lo;0;AL;<font> 0642;;;;N;;;;;
+1EE74;ARABIC MATHEMATICAL STRETCHED SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;;
+1EE75;ARABIC MATHEMATICAL STRETCHED TEH;Lo;0;AL;<font> 062A;;;;N;;;;;
+1EE76;ARABIC MATHEMATICAL STRETCHED THEH;Lo;0;AL;<font> 062B;;;;N;;;;;
+1EE77;ARABIC MATHEMATICAL STRETCHED KHAH;Lo;0;AL;<font> 062E;;;;N;;;;;
+1EE79;ARABIC MATHEMATICAL STRETCHED DAD;Lo;0;AL;<font> 0636;;;;N;;;;;
+1EE7A;ARABIC MATHEMATICAL STRETCHED ZAH;Lo;0;AL;<font> 0638;;;;N;;;;;
+1EE7B;ARABIC MATHEMATICAL STRETCHED GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;;
+1EE7C;ARABIC MATHEMATICAL STRETCHED DOTLESS BEH;Lo;0;AL;<font> 066E;;;;N;;;;;
+1EE7E;ARABIC MATHEMATICAL STRETCHED DOTLESS FEH;Lo;0;AL;<font> 06A1;;;;N;;;;;
+1EE80;ARABIC MATHEMATICAL LOOPED ALEF;Lo;0;AL;<font> 0627;;;;N;;;;;
+1EE81;ARABIC MATHEMATICAL LOOPED BEH;Lo;0;AL;<font> 0628;;;;N;;;;;
+1EE82;ARABIC MATHEMATICAL LOOPED JEEM;Lo;0;AL;<font> 062C;;;;N;;;;;
+1EE83;ARABIC MATHEMATICAL LOOPED DAL;Lo;0;AL;<font> 062F;;;;N;;;;;
+1EE84;ARABIC MATHEMATICAL LOOPED HEH;Lo;0;AL;<font> 0647;;;;N;;;;;
+1EE85;ARABIC MATHEMATICAL LOOPED WAW;Lo;0;AL;<font> 0648;;;;N;;;;;
+1EE86;ARABIC MATHEMATICAL LOOPED ZAIN;Lo;0;AL;<font> 0632;;;;N;;;;;
+1EE87;ARABIC MATHEMATICAL LOOPED HAH;Lo;0;AL;<font> 062D;;;;N;;;;;
+1EE88;ARABIC MATHEMATICAL LOOPED TAH;Lo;0;AL;<font> 0637;;;;N;;;;;
+1EE89;ARABIC MATHEMATICAL LOOPED YEH;Lo;0;AL;<font> 064A;;;;N;;;;;
+1EE8B;ARABIC MATHEMATICAL LOOPED LAM;Lo;0;AL;<font> 0644;;;;N;;;;;
+1EE8C;ARABIC MATHEMATICAL LOOPED MEEM;Lo;0;AL;<font> 0645;;;;N;;;;;
+1EE8D;ARABIC MATHEMATICAL LOOPED NOON;Lo;0;AL;<font> 0646;;;;N;;;;;
+1EE8E;ARABIC MATHEMATICAL LOOPED SEEN;Lo;0;AL;<font> 0633;;;;N;;;;;
+1EE8F;ARABIC MATHEMATICAL LOOPED AIN;Lo;0;AL;<font> 0639;;;;N;;;;;
+1EE90;ARABIC MATHEMATICAL LOOPED FEH;Lo;0;AL;<font> 0641;;;;N;;;;;
+1EE91;ARABIC MATHEMATICAL LOOPED SAD;Lo;0;AL;<font> 0635;;;;N;;;;;
+1EE92;ARABIC MATHEMATICAL LOOPED QAF;Lo;0;AL;<font> 0642;;;;N;;;;;
+1EE93;ARABIC MATHEMATICAL LOOPED REH;Lo;0;AL;<font> 0631;;;;N;;;;;
+1EE94;ARABIC MATHEMATICAL LOOPED SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;;
+1EE95;ARABIC MATHEMATICAL LOOPED TEH;Lo;0;AL;<font> 062A;;;;N;;;;;
+1EE96;ARABIC MATHEMATICAL LOOPED THEH;Lo;0;AL;<font> 062B;;;;N;;;;;
+1EE97;ARABIC MATHEMATICAL LOOPED KHAH;Lo;0;AL;<font> 062E;;;;N;;;;;
+1EE98;ARABIC MATHEMATICAL LOOPED THAL;Lo;0;AL;<font> 0630;;;;N;;;;;
+1EE99;ARABIC MATHEMATICAL LOOPED DAD;Lo;0;AL;<font> 0636;;;;N;;;;;
+1EE9A;ARABIC MATHEMATICAL LOOPED ZAH;Lo;0;AL;<font> 0638;;;;N;;;;;
+1EE9B;ARABIC MATHEMATICAL LOOPED GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;;
+1EEA1;ARABIC MATHEMATICAL DOUBLE-STRUCK BEH;Lo;0;AL;<font> 0628;;;;N;;;;;
+1EEA2;ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM;Lo;0;AL;<font> 062C;;;;N;;;;;
+1EEA3;ARABIC MATHEMATICAL DOUBLE-STRUCK DAL;Lo;0;AL;<font> 062F;;;;N;;;;;
+1EEA5;ARABIC MATHEMATICAL DOUBLE-STRUCK WAW;Lo;0;AL;<font> 0648;;;;N;;;;;
+1EEA6;ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN;Lo;0;AL;<font> 0632;;;;N;;;;;
+1EEA7;ARABIC MATHEMATICAL DOUBLE-STRUCK HAH;Lo;0;AL;<font> 062D;;;;N;;;;;
+1EEA8;ARABIC MATHEMATICAL DOUBLE-STRUCK TAH;Lo;0;AL;<font> 0637;;;;N;;;;;
+1EEA9;ARABIC MATHEMATICAL DOUBLE-STRUCK YEH;Lo;0;AL;<font> 064A;;;;N;;;;;
+1EEAB;ARABIC MATHEMATICAL DOUBLE-STRUCK LAM;Lo;0;AL;<font> 0644;;;;N;;;;;
+1EEAC;ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM;Lo;0;AL;<font> 0645;;;;N;;;;;
+1EEAD;ARABIC MATHEMATICAL DOUBLE-STRUCK NOON;Lo;0;AL;<font> 0646;;;;N;;;;;
+1EEAE;ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN;Lo;0;AL;<font> 0633;;;;N;;;;;
+1EEAF;ARABIC MATHEMATICAL DOUBLE-STRUCK AIN;Lo;0;AL;<font> 0639;;;;N;;;;;
+1EEB0;ARABIC MATHEMATICAL DOUBLE-STRUCK FEH;Lo;0;AL;<font> 0641;;;;N;;;;;
+1EEB1;ARABIC MATHEMATICAL DOUBLE-STRUCK SAD;Lo;0;AL;<font> 0635;;;;N;;;;;
+1EEB2;ARABIC MATHEMATICAL DOUBLE-STRUCK QAF;Lo;0;AL;<font> 0642;;;;N;;;;;
+1EEB3;ARABIC MATHEMATICAL DOUBLE-STRUCK REH;Lo;0;AL;<font> 0631;;;;N;;;;;
+1EEB4;ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;;
+1EEB5;ARABIC MATHEMATICAL DOUBLE-STRUCK TEH;Lo;0;AL;<font> 062A;;;;N;;;;;
+1EEB6;ARABIC MATHEMATICAL DOUBLE-STRUCK THEH;Lo;0;AL;<font> 062B;;;;N;;;;;
+1EEB7;ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH;Lo;0;AL;<font> 062E;;;;N;;;;;
+1EEB8;ARABIC MATHEMATICAL DOUBLE-STRUCK THAL;Lo;0;AL;<font> 0630;;;;N;;;;;
+1EEB9;ARABIC MATHEMATICAL DOUBLE-STRUCK DAD;Lo;0;AL;<font> 0636;;;;N;;;;;
+1EEBA;ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH;Lo;0;AL;<font> 0638;;;;N;;;;;
+1EEBB;ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;;
+1EEF0;ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL;Sm;0;ON;;;;;N;;;;;
+1EEF1;ARABIC MATHEMATICAL OPERATOR HAH WITH DAL;Sm;0;ON;;;;;N;;;;;
+1F000;MAHJONG TILE EAST WIND;So;0;ON;;;;;N;;;;;
+1F001;MAHJONG TILE SOUTH WIND;So;0;ON;;;;;N;;;;;
+1F002;MAHJONG TILE WEST WIND;So;0;ON;;;;;N;;;;;
+1F003;MAHJONG TILE NORTH WIND;So;0;ON;;;;;N;;;;;
+1F004;MAHJONG TILE RED DRAGON;So;0;ON;;;;;N;;;;;
+1F005;MAHJONG TILE GREEN DRAGON;So;0;ON;;;;;N;;;;;
+1F006;MAHJONG TILE WHITE DRAGON;So;0;ON;;;;;N;;;;;
+1F007;MAHJONG TILE ONE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F008;MAHJONG TILE TWO OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F009;MAHJONG TILE THREE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00A;MAHJONG TILE FOUR OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00B;MAHJONG TILE FIVE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00C;MAHJONG TILE SIX OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00D;MAHJONG TILE SEVEN OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00E;MAHJONG TILE EIGHT OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00F;MAHJONG TILE NINE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F010;MAHJONG TILE ONE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F011;MAHJONG TILE TWO OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F012;MAHJONG TILE THREE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F013;MAHJONG TILE FOUR OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F014;MAHJONG TILE FIVE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F015;MAHJONG TILE SIX OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F016;MAHJONG TILE SEVEN OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F017;MAHJONG TILE EIGHT OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F018;MAHJONG TILE NINE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F019;MAHJONG TILE ONE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01A;MAHJONG TILE TWO OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01B;MAHJONG TILE THREE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01C;MAHJONG TILE FOUR OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01D;MAHJONG TILE FIVE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01E;MAHJONG TILE SIX OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01F;MAHJONG TILE SEVEN OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F020;MAHJONG TILE EIGHT OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F021;MAHJONG TILE NINE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F022;MAHJONG TILE PLUM;So;0;ON;;;;;N;;;;;
+1F023;MAHJONG TILE ORCHID;So;0;ON;;;;;N;;;;;
+1F024;MAHJONG TILE BAMBOO;So;0;ON;;;;;N;;;;;
+1F025;MAHJONG TILE CHRYSANTHEMUM;So;0;ON;;;;;N;;;;;
+1F026;MAHJONG TILE SPRING;So;0;ON;;;;;N;;;;;
+1F027;MAHJONG TILE SUMMER;So;0;ON;;;;;N;;;;;
+1F028;MAHJONG TILE AUTUMN;So;0;ON;;;;;N;;;;;
+1F029;MAHJONG TILE WINTER;So;0;ON;;;;;N;;;;;
+1F02A;MAHJONG TILE JOKER;So;0;ON;;;;;N;;;;;
+1F02B;MAHJONG TILE BACK;So;0;ON;;;;;N;;;;;
+1F030;DOMINO TILE HORIZONTAL BACK;So;0;ON;;;;;N;;;;;
+1F031;DOMINO TILE HORIZONTAL-00-00;So;0;ON;;;;;N;;;;;
+1F032;DOMINO TILE HORIZONTAL-00-01;So;0;ON;;;;;N;;;;;
+1F033;DOMINO TILE HORIZONTAL-00-02;So;0;ON;;;;;N;;;;;
+1F034;DOMINO TILE HORIZONTAL-00-03;So;0;ON;;;;;N;;;;;
+1F035;DOMINO TILE HORIZONTAL-00-04;So;0;ON;;;;;N;;;;;
+1F036;DOMINO TILE HORIZONTAL-00-05;So;0;ON;;;;;N;;;;;
+1F037;DOMINO TILE HORIZONTAL-00-06;So;0;ON;;;;;N;;;;;
+1F038;DOMINO TILE HORIZONTAL-01-00;So;0;ON;;;;;N;;;;;
+1F039;DOMINO TILE HORIZONTAL-01-01;So;0;ON;;;;;N;;;;;
+1F03A;DOMINO TILE HORIZONTAL-01-02;So;0;ON;;;;;N;;;;;
+1F03B;DOMINO TILE HORIZONTAL-01-03;So;0;ON;;;;;N;;;;;
+1F03C;DOMINO TILE HORIZONTAL-01-04;So;0;ON;;;;;N;;;;;
+1F03D;DOMINO TILE HORIZONTAL-01-05;So;0;ON;;;;;N;;;;;
+1F03E;DOMINO TILE HORIZONTAL-01-06;So;0;ON;;;;;N;;;;;
+1F03F;DOMINO TILE HORIZONTAL-02-00;So;0;ON;;;;;N;;;;;
+1F040;DOMINO TILE HORIZONTAL-02-01;So;0;ON;;;;;N;;;;;
+1F041;DOMINO TILE HORIZONTAL-02-02;So;0;ON;;;;;N;;;;;
+1F042;DOMINO TILE HORIZONTAL-02-03;So;0;ON;;;;;N;;;;;
+1F043;DOMINO TILE HORIZONTAL-02-04;So;0;ON;;;;;N;;;;;
+1F044;DOMINO TILE HORIZONTAL-02-05;So;0;ON;;;;;N;;;;;
+1F045;DOMINO TILE HORIZONTAL-02-06;So;0;ON;;;;;N;;;;;
+1F046;DOMINO TILE HORIZONTAL-03-00;So;0;ON;;;;;N;;;;;
+1F047;DOMINO TILE HORIZONTAL-03-01;So;0;ON;;;;;N;;;;;
+1F048;DOMINO TILE HORIZONTAL-03-02;So;0;ON;;;;;N;;;;;
+1F049;DOMINO TILE HORIZONTAL-03-03;So;0;ON;;;;;N;;;;;
+1F04A;DOMINO TILE HORIZONTAL-03-04;So;0;ON;;;;;N;;;;;
+1F04B;DOMINO TILE HORIZONTAL-03-05;So;0;ON;;;;;N;;;;;
+1F04C;DOMINO TILE HORIZONTAL-03-06;So;0;ON;;;;;N;;;;;
+1F04D;DOMINO TILE HORIZONTAL-04-00;So;0;ON;;;;;N;;;;;
+1F04E;DOMINO TILE HORIZONTAL-04-01;So;0;ON;;;;;N;;;;;
+1F04F;DOMINO TILE HORIZONTAL-04-02;So;0;ON;;;;;N;;;;;
+1F050;DOMINO TILE HORIZONTAL-04-03;So;0;ON;;;;;N;;;;;
+1F051;DOMINO TILE HORIZONTAL-04-04;So;0;ON;;;;;N;;;;;
+1F052;DOMINO TILE HORIZONTAL-04-05;So;0;ON;;;;;N;;;;;
+1F053;DOMINO TILE HORIZONTAL-04-06;So;0;ON;;;;;N;;;;;
+1F054;DOMINO TILE HORIZONTAL-05-00;So;0;ON;;;;;N;;;;;
+1F055;DOMINO TILE HORIZONTAL-05-01;So;0;ON;;;;;N;;;;;
+1F056;DOMINO TILE HORIZONTAL-05-02;So;0;ON;;;;;N;;;;;
+1F057;DOMINO TILE HORIZONTAL-05-03;So;0;ON;;;;;N;;;;;
+1F058;DOMINO TILE HORIZONTAL-05-04;So;0;ON;;;;;N;;;;;
+1F059;DOMINO TILE HORIZONTAL-05-05;So;0;ON;;;;;N;;;;;
+1F05A;DOMINO TILE HORIZONTAL-05-06;So;0;ON;;;;;N;;;;;
+1F05B;DOMINO TILE HORIZONTAL-06-00;So;0;ON;;;;;N;;;;;
+1F05C;DOMINO TILE HORIZONTAL-06-01;So;0;ON;;;;;N;;;;;
+1F05D;DOMINO TILE HORIZONTAL-06-02;So;0;ON;;;;;N;;;;;
+1F05E;DOMINO TILE HORIZONTAL-06-03;So;0;ON;;;;;N;;;;;
+1F05F;DOMINO TILE HORIZONTAL-06-04;So;0;ON;;;;;N;;;;;
+1F060;DOMINO TILE HORIZONTAL-06-05;So;0;ON;;;;;N;;;;;
+1F061;DOMINO TILE HORIZONTAL-06-06;So;0;ON;;;;;N;;;;;
+1F062;DOMINO TILE VERTICAL BACK;So;0;ON;;;;;N;;;;;
+1F063;DOMINO TILE VERTICAL-00-00;So;0;ON;;;;;N;;;;;
+1F064;DOMINO TILE VERTICAL-00-01;So;0;ON;;;;;N;;;;;
+1F065;DOMINO TILE VERTICAL-00-02;So;0;ON;;;;;N;;;;;
+1F066;DOMINO TILE VERTICAL-00-03;So;0;ON;;;;;N;;;;;
+1F067;DOMINO TILE VERTICAL-00-04;So;0;ON;;;;;N;;;;;
+1F068;DOMINO TILE VERTICAL-00-05;So;0;ON;;;;;N;;;;;
+1F069;DOMINO TILE VERTICAL-00-06;So;0;ON;;;;;N;;;;;
+1F06A;DOMINO TILE VERTICAL-01-00;So;0;ON;;;;;N;;;;;
+1F06B;DOMINO TILE VERTICAL-01-01;So;0;ON;;;;;N;;;;;
+1F06C;DOMINO TILE VERTICAL-01-02;So;0;ON;;;;;N;;;;;
+1F06D;DOMINO TILE VERTICAL-01-03;So;0;ON;;;;;N;;;;;
+1F06E;DOMINO TILE VERTICAL-01-04;So;0;ON;;;;;N;;;;;
+1F06F;DOMINO TILE VERTICAL-01-05;So;0;ON;;;;;N;;;;;
+1F070;DOMINO TILE VERTICAL-01-06;So;0;ON;;;;;N;;;;;
+1F071;DOMINO TILE VERTICAL-02-00;So;0;ON;;;;;N;;;;;
+1F072;DOMINO TILE VERTICAL-02-01;So;0;ON;;;;;N;;;;;
+1F073;DOMINO TILE VERTICAL-02-02;So;0;ON;;;;;N;;;;;
+1F074;DOMINO TILE VERTICAL-02-03;So;0;ON;;;;;N;;;;;
+1F075;DOMINO TILE VERTICAL-02-04;So;0;ON;;;;;N;;;;;
+1F076;DOMINO TILE VERTICAL-02-05;So;0;ON;;;;;N;;;;;
+1F077;DOMINO TILE VERTICAL-02-06;So;0;ON;;;;;N;;;;;
+1F078;DOMINO TILE VERTICAL-03-00;So;0;ON;;;;;N;;;;;
+1F079;DOMINO TILE VERTICAL-03-01;So;0;ON;;;;;N;;;;;
+1F07A;DOMINO TILE VERTICAL-03-02;So;0;ON;;;;;N;;;;;
+1F07B;DOMINO TILE VERTICAL-03-03;So;0;ON;;;;;N;;;;;
+1F07C;DOMINO TILE VERTICAL-03-04;So;0;ON;;;;;N;;;;;
+1F07D;DOMINO TILE VERTICAL-03-05;So;0;ON;;;;;N;;;;;
+1F07E;DOMINO TILE VERTICAL-03-06;So;0;ON;;;;;N;;;;;
+1F07F;DOMINO TILE VERTICAL-04-00;So;0;ON;;;;;N;;;;;
+1F080;DOMINO TILE VERTICAL-04-01;So;0;ON;;;;;N;;;;;
+1F081;DOMINO TILE VERTICAL-04-02;So;0;ON;;;;;N;;;;;
+1F082;DOMINO TILE VERTICAL-04-03;So;0;ON;;;;;N;;;;;
+1F083;DOMINO TILE VERTICAL-04-04;So;0;ON;;;;;N;;;;;
+1F084;DOMINO TILE VERTICAL-04-05;So;0;ON;;;;;N;;;;;
+1F085;DOMINO TILE VERTICAL-04-06;So;0;ON;;;;;N;;;;;
+1F086;DOMINO TILE VERTICAL-05-00;So;0;ON;;;;;N;;;;;
+1F087;DOMINO TILE VERTICAL-05-01;So;0;ON;;;;;N;;;;;
+1F088;DOMINO TILE VERTICAL-05-02;So;0;ON;;;;;N;;;;;
+1F089;DOMINO TILE VERTICAL-05-03;So;0;ON;;;;;N;;;;;
+1F08A;DOMINO TILE VERTICAL-05-04;So;0;ON;;;;;N;;;;;
+1F08B;DOMINO TILE VERTICAL-05-05;So;0;ON;;;;;N;;;;;
+1F08C;DOMINO TILE VERTICAL-05-06;So;0;ON;;;;;N;;;;;
+1F08D;DOMINO TILE VERTICAL-06-00;So;0;ON;;;;;N;;;;;
+1F08E;DOMINO TILE VERTICAL-06-01;So;0;ON;;;;;N;;;;;
+1F08F;DOMINO TILE VERTICAL-06-02;So;0;ON;;;;;N;;;;;
+1F090;DOMINO TILE VERTICAL-06-03;So;0;ON;;;;;N;;;;;
+1F091;DOMINO TILE VERTICAL-06-04;So;0;ON;;;;;N;;;;;
+1F092;DOMINO TILE VERTICAL-06-05;So;0;ON;;;;;N;;;;;
+1F093;DOMINO TILE VERTICAL-06-06;So;0;ON;;;;;N;;;;;
+1F0A0;PLAYING CARD BACK;So;0;ON;;;;;N;;;;;
+1F0A1;PLAYING CARD ACE OF SPADES;So;0;ON;;;;;N;;;;;
+1F0A2;PLAYING CARD TWO OF SPADES;So;0;ON;;;;;N;;;;;
+1F0A3;PLAYING CARD THREE OF SPADES;So;0;ON;;;;;N;;;;;
+1F0A4;PLAYING CARD FOUR OF SPADES;So;0;ON;;;;;N;;;;;
+1F0A5;PLAYING CARD FIVE OF SPADES;So;0;ON;;;;;N;;;;;
+1F0A6;PLAYING CARD SIX OF SPADES;So;0;ON;;;;;N;;;;;
+1F0A7;PLAYING CARD SEVEN OF SPADES;So;0;ON;;;;;N;;;;;
+1F0A8;PLAYING CARD EIGHT OF SPADES;So;0;ON;;;;;N;;;;;
+1F0A9;PLAYING CARD NINE OF SPADES;So;0;ON;;;;;N;;;;;
+1F0AA;PLAYING CARD TEN OF SPADES;So;0;ON;;;;;N;;;;;
+1F0AB;PLAYING CARD JACK OF SPADES;So;0;ON;;;;;N;;;;;
+1F0AC;PLAYING CARD KNIGHT OF SPADES;So;0;ON;;;;;N;;;;;
+1F0AD;PLAYING CARD QUEEN OF SPADES;So;0;ON;;;;;N;;;;;
+1F0AE;PLAYING CARD KING OF SPADES;So;0;ON;;;;;N;;;;;
+1F0B1;PLAYING CARD ACE OF HEARTS;So;0;ON;;;;;N;;;;;
+1F0B2;PLAYING CARD TWO OF HEARTS;So;0;ON;;;;;N;;;;;
+1F0B3;PLAYING CARD THREE OF HEARTS;So;0;ON;;;;;N;;;;;
+1F0B4;PLAYING CARD FOUR OF HEARTS;So;0;ON;;;;;N;;;;;
+1F0B5;PLAYING CARD FIVE OF HEARTS;So;0;ON;;;;;N;;;;;
+1F0B6;PLAYING CARD SIX OF HEARTS;So;0;ON;;;;;N;;;;;
+1F0B7;PLAYING CARD SEVEN OF HEARTS;So;0;ON;;;;;N;;;;;
+1F0B8;PLAYING CARD EIGHT OF HEARTS;So;0;ON;;;;;N;;;;;
+1F0B9;PLAYING CARD NINE OF HEARTS;So;0;ON;;;;;N;;;;;
+1F0BA;PLAYING CARD TEN OF HEARTS;So;0;ON;;;;;N;;;;;
+1F0BB;PLAYING CARD JACK OF HEARTS;So;0;ON;;;;;N;;;;;
+1F0BC;PLAYING CARD KNIGHT OF HEARTS;So;0;ON;;;;;N;;;;;
+1F0BD;PLAYING CARD QUEEN OF HEARTS;So;0;ON;;;;;N;;;;;
+1F0BE;PLAYING CARD KING OF HEARTS;So;0;ON;;;;;N;;;;;
+1F0BF;PLAYING CARD RED JOKER;So;0;ON;;;;;N;;;;;
+1F0C1;PLAYING CARD ACE OF DIAMONDS;So;0;ON;;;;;N;;;;;
+1F0C2;PLAYING CARD TWO OF DIAMONDS;So;0;ON;;;;;N;;;;;
+1F0C3;PLAYING CARD THREE OF DIAMONDS;So;0;ON;;;;;N;;;;;
+1F0C4;PLAYING CARD FOUR OF DIAMONDS;So;0;ON;;;;;N;;;;;
+1F0C5;PLAYING CARD FIVE OF DIAMONDS;So;0;ON;;;;;N;;;;;
+1F0C6;PLAYING CARD SIX OF DIAMONDS;So;0;ON;;;;;N;;;;;
+1F0C7;PLAYING CARD SEVEN OF DIAMONDS;So;0;ON;;;;;N;;;;;
+1F0C8;PLAYING CARD EIGHT OF DIAMONDS;So;0;ON;;;;;N;;;;;
+1F0C9;PLAYING CARD NINE OF DIAMONDS;So;0;ON;;;;;N;;;;;
+1F0CA;PLAYING CARD TEN OF DIAMONDS;So;0;ON;;;;;N;;;;;
+1F0CB;PLAYING CARD JACK OF DIAMONDS;So;0;ON;;;;;N;;;;;
+1F0CC;PLAYING CARD KNIGHT OF DIAMONDS;So;0;ON;;;;;N;;;;;
+1F0CD;PLAYING CARD QUEEN OF DIAMONDS;So;0;ON;;;;;N;;;;;
+1F0CE;PLAYING CARD KING OF DIAMONDS;So;0;ON;;;;;N;;;;;
+1F0CF;PLAYING CARD BLACK JOKER;So;0;ON;;;;;N;;;;;
+1F0D1;PLAYING CARD ACE OF CLUBS;So;0;ON;;;;;N;;;;;
+1F0D2;PLAYING CARD TWO OF CLUBS;So;0;ON;;;;;N;;;;;
+1F0D3;PLAYING CARD THREE OF CLUBS;So;0;ON;;;;;N;;;;;
+1F0D4;PLAYING CARD FOUR OF CLUBS;So;0;ON;;;;;N;;;;;
+1F0D5;PLAYING CARD FIVE OF CLUBS;So;0;ON;;;;;N;;;;;
+1F0D6;PLAYING CARD SIX OF CLUBS;So;0;ON;;;;;N;;;;;
+1F0D7;PLAYING CARD SEVEN OF CLUBS;So;0;ON;;;;;N;;;;;
+1F0D8;PLAYING CARD EIGHT OF CLUBS;So;0;ON;;;;;N;;;;;
+1F0D9;PLAYING CARD NINE OF CLUBS;So;0;ON;;;;;N;;;;;
+1F0DA;PLAYING CARD TEN OF CLUBS;So;0;ON;;;;;N;;;;;
+1F0DB;PLAYING CARD JACK OF CLUBS;So;0;ON;;;;;N;;;;;
+1F0DC;PLAYING CARD KNIGHT OF CLUBS;So;0;ON;;;;;N;;;;;
+1F0DD;PLAYING CARD QUEEN OF CLUBS;So;0;ON;;;;;N;;;;;
+1F0DE;PLAYING CARD KING OF CLUBS;So;0;ON;;;;;N;;;;;
+1F0DF;PLAYING CARD WHITE JOKER;So;0;ON;;;;;N;;;;;
+1F0E0;PLAYING CARD FOOL;So;0;ON;;;;;N;;;;;
+1F0E1;PLAYING CARD TRUMP-1;So;0;ON;;;;;N;;;;;
+1F0E2;PLAYING CARD TRUMP-2;So;0;ON;;;;;N;;;;;
+1F0E3;PLAYING CARD TRUMP-3;So;0;ON;;;;;N;;;;;
+1F0E4;PLAYING CARD TRUMP-4;So;0;ON;;;;;N;;;;;
+1F0E5;PLAYING CARD TRUMP-5;So;0;ON;;;;;N;;;;;
+1F0E6;PLAYING CARD TRUMP-6;So;0;ON;;;;;N;;;;;
+1F0E7;PLAYING CARD TRUMP-7;So;0;ON;;;;;N;;;;;
+1F0E8;PLAYING CARD TRUMP-8;So;0;ON;;;;;N;;;;;
+1F0E9;PLAYING CARD TRUMP-9;So;0;ON;;;;;N;;;;;
+1F0EA;PLAYING CARD TRUMP-10;So;0;ON;;;;;N;;;;;
+1F0EB;PLAYING CARD TRUMP-11;So;0;ON;;;;;N;;;;;
+1F0EC;PLAYING CARD TRUMP-12;So;0;ON;;;;;N;;;;;
+1F0ED;PLAYING CARD TRUMP-13;So;0;ON;;;;;N;;;;;
+1F0EE;PLAYING CARD TRUMP-14;So;0;ON;;;;;N;;;;;
+1F0EF;PLAYING CARD TRUMP-15;So;0;ON;;;;;N;;;;;
+1F0F0;PLAYING CARD TRUMP-16;So;0;ON;;;;;N;;;;;
+1F0F1;PLAYING CARD TRUMP-17;So;0;ON;;;;;N;;;;;
+1F0F2;PLAYING CARD TRUMP-18;So;0;ON;;;;;N;;;;;
+1F0F3;PLAYING CARD TRUMP-19;So;0;ON;;;;;N;;;;;
+1F0F4;PLAYING CARD TRUMP-20;So;0;ON;;;;;N;;;;;
+1F0F5;PLAYING CARD TRUMP-21;So;0;ON;;;;;N;;;;;
+1F100;DIGIT ZERO FULL STOP;No;0;EN;<compat> 0030 002E;;0;0;N;;;;;
+1F101;DIGIT ZERO COMMA;No;0;EN;<compat> 0030 002C;;0;0;N;;;;;
+1F102;DIGIT ONE COMMA;No;0;EN;<compat> 0031 002C;;1;1;N;;;;;
+1F103;DIGIT TWO COMMA;No;0;EN;<compat> 0032 002C;;2;2;N;;;;;
+1F104;DIGIT THREE COMMA;No;0;EN;<compat> 0033 002C;;3;3;N;;;;;
+1F105;DIGIT FOUR COMMA;No;0;EN;<compat> 0034 002C;;4;4;N;;;;;
+1F106;DIGIT FIVE COMMA;No;0;EN;<compat> 0035 002C;;5;5;N;;;;;
+1F107;DIGIT SIX COMMA;No;0;EN;<compat> 0036 002C;;6;6;N;;;;;
+1F108;DIGIT SEVEN COMMA;No;0;EN;<compat> 0037 002C;;7;7;N;;;;;
+1F109;DIGIT EIGHT COMMA;No;0;EN;<compat> 0038 002C;;8;8;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;;;;;
+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;;;;;
+1F113;PARENTHESIZED LATIN CAPITAL LETTER D;So;0;L;<compat> 0028 0044 0029;;;;N;;;;;
+1F114;PARENTHESIZED LATIN CAPITAL LETTER E;So;0;L;<compat> 0028 0045 0029;;;;N;;;;;
+1F115;PARENTHESIZED LATIN CAPITAL LETTER F;So;0;L;<compat> 0028 0046 0029;;;;N;;;;;
+1F116;PARENTHESIZED LATIN CAPITAL LETTER G;So;0;L;<compat> 0028 0047 0029;;;;N;;;;;
+1F117;PARENTHESIZED LATIN CAPITAL LETTER H;So;0;L;<compat> 0028 0048 0029;;;;N;;;;;
+1F118;PARENTHESIZED LATIN CAPITAL LETTER I;So;0;L;<compat> 0028 0049 0029;;;;N;;;;;
+1F119;PARENTHESIZED LATIN CAPITAL LETTER J;So;0;L;<compat> 0028 004A 0029;;;;N;;;;;
+1F11A;PARENTHESIZED LATIN CAPITAL LETTER K;So;0;L;<compat> 0028 004B 0029;;;;N;;;;;
+1F11B;PARENTHESIZED LATIN CAPITAL LETTER L;So;0;L;<compat> 0028 004C 0029;;;;N;;;;;
+1F11C;PARENTHESIZED LATIN CAPITAL LETTER M;So;0;L;<compat> 0028 004D 0029;;;;N;;;;;
+1F11D;PARENTHESIZED LATIN CAPITAL LETTER N;So;0;L;<compat> 0028 004E 0029;;;;N;;;;;
+1F11E;PARENTHESIZED LATIN CAPITAL LETTER O;So;0;L;<compat> 0028 004F 0029;;;;N;;;;;
+1F11F;PARENTHESIZED LATIN CAPITAL LETTER P;So;0;L;<compat> 0028 0050 0029;;;;N;;;;;
+1F120;PARENTHESIZED LATIN CAPITAL LETTER Q;So;0;L;<compat> 0028 0051 0029;;;;N;;;;;
+1F121;PARENTHESIZED LATIN CAPITAL LETTER R;So;0;L;<compat> 0028 0052 0029;;;;N;;;;;
+1F122;PARENTHESIZED LATIN CAPITAL LETTER S;So;0;L;<compat> 0028 0053 0029;;;;N;;;;;
+1F123;PARENTHESIZED LATIN CAPITAL LETTER T;So;0;L;<compat> 0028 0054 0029;;;;N;;;;;
+1F124;PARENTHESIZED LATIN CAPITAL LETTER U;So;0;L;<compat> 0028 0055 0029;;;;N;;;;;
+1F125;PARENTHESIZED LATIN CAPITAL LETTER V;So;0;L;<compat> 0028 0056 0029;;;;N;;;;;
+1F126;PARENTHESIZED LATIN CAPITAL LETTER W;So;0;L;<compat> 0028 0057 0029;;;;N;;;;;
+1F127;PARENTHESIZED LATIN CAPITAL LETTER X;So;0;L;<compat> 0028 0058 0029;;;;N;;;;;
+1F128;PARENTHESIZED LATIN CAPITAL LETTER Y;So;0;L;<compat> 0028 0059 0029;;;;N;;;;;
+1F129;PARENTHESIZED LATIN CAPITAL LETTER Z;So;0;L;<compat> 0028 005A 0029;;;;N;;;;;
+1F12A;TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S;So;0;L;<compat> 3014 0053 3015;;;;N;;;;;
+1F12B;CIRCLED ITALIC LATIN CAPITAL LETTER C;So;0;L;<circle> 0043;;;;N;;;;;
+1F12C;CIRCLED ITALIC LATIN CAPITAL LETTER R;So;0;L;<circle> 0052;;;;N;;;;;
+1F12D;CIRCLED CD;So;0;L;<circle> 0043 0044;;;;N;;;;;
+1F12E;CIRCLED WZ;So;0;L;<circle> 0057 005A;;;;N;;;;;
+1F130;SQUARED LATIN CAPITAL LETTER A;So;0;L;<square> 0041;;;;N;;;;;
+1F131;SQUARED LATIN CAPITAL LETTER B;So;0;L;<square> 0042;;;;N;;;;;
+1F132;SQUARED LATIN CAPITAL LETTER C;So;0;L;<square> 0043;;;;N;;;;;
+1F133;SQUARED LATIN CAPITAL LETTER D;So;0;L;<square> 0044;;;;N;;;;;
+1F134;SQUARED LATIN CAPITAL LETTER E;So;0;L;<square> 0045;;;;N;;;;;
+1F135;SQUARED LATIN CAPITAL LETTER F;So;0;L;<square> 0046;;;;N;;;;;
+1F136;SQUARED LATIN CAPITAL LETTER G;So;0;L;<square> 0047;;;;N;;;;;
+1F137;SQUARED LATIN CAPITAL LETTER H;So;0;L;<square> 0048;;;;N;;;;;
+1F138;SQUARED LATIN CAPITAL LETTER I;So;0;L;<square> 0049;;;;N;;;;;
+1F139;SQUARED LATIN CAPITAL LETTER J;So;0;L;<square> 004A;;;;N;;;;;
+1F13A;SQUARED LATIN CAPITAL LETTER K;So;0;L;<square> 004B;;;;N;;;;;
+1F13B;SQUARED LATIN CAPITAL LETTER L;So;0;L;<square> 004C;;;;N;;;;;
+1F13C;SQUARED LATIN CAPITAL LETTER M;So;0;L;<square> 004D;;;;N;;;;;
+1F13D;SQUARED LATIN CAPITAL LETTER N;So;0;L;<square> 004E;;;;N;;;;;
+1F13E;SQUARED LATIN CAPITAL LETTER O;So;0;L;<square> 004F;;;;N;;;;;
+1F13F;SQUARED LATIN CAPITAL LETTER P;So;0;L;<square> 0050;;;;N;;;;;
+1F140;SQUARED LATIN CAPITAL LETTER Q;So;0;L;<square> 0051;;;;N;;;;;
+1F141;SQUARED LATIN CAPITAL LETTER R;So;0;L;<square> 0052;;;;N;;;;;
+1F142;SQUARED LATIN CAPITAL LETTER S;So;0;L;<square> 0053;;;;N;;;;;
+1F143;SQUARED LATIN CAPITAL LETTER T;So;0;L;<square> 0054;;;;N;;;;;
+1F144;SQUARED LATIN CAPITAL LETTER U;So;0;L;<square> 0055;;;;N;;;;;
+1F145;SQUARED LATIN CAPITAL LETTER V;So;0;L;<square> 0056;;;;N;;;;;
+1F146;SQUARED LATIN CAPITAL LETTER W;So;0;L;<square> 0057;;;;N;;;;;
+1F147;SQUARED LATIN CAPITAL LETTER X;So;0;L;<square> 0058;;;;N;;;;;
+1F148;SQUARED LATIN CAPITAL LETTER Y;So;0;L;<square> 0059;;;;N;;;;;
+1F149;SQUARED LATIN CAPITAL LETTER Z;So;0;L;<square> 005A;;;;N;;;;;
+1F14A;SQUARED HV;So;0;L;<square> 0048 0056;;;;N;;;;;
+1F14B;SQUARED MV;So;0;L;<square> 004D 0056;;;;N;;;;;
+1F14C;SQUARED SD;So;0;L;<square> 0053 0044;;;;N;;;;;
+1F14D;SQUARED SS;So;0;L;<square> 0053 0053;;;;N;;;;;
+1F14E;SQUARED PPV;So;0;L;<square> 0050 0050 0056;;;;N;;;;;
+1F14F;SQUARED WC;So;0;L;<square> 0057 0043;;;;N;;;;;
+1F150;NEGATIVE CIRCLED LATIN CAPITAL LETTER A;So;0;L;;;;;N;;;;;
+1F151;NEGATIVE CIRCLED LATIN CAPITAL LETTER B;So;0;L;;;;;N;;;;;
+1F152;NEGATIVE CIRCLED LATIN CAPITAL LETTER C;So;0;L;;;;;N;;;;;
+1F153;NEGATIVE CIRCLED LATIN CAPITAL LETTER D;So;0;L;;;;;N;;;;;
+1F154;NEGATIVE CIRCLED LATIN CAPITAL LETTER E;So;0;L;;;;;N;;;;;
+1F155;NEGATIVE CIRCLED LATIN CAPITAL LETTER F;So;0;L;;;;;N;;;;;
+1F156;NEGATIVE CIRCLED LATIN CAPITAL LETTER G;So;0;L;;;;;N;;;;;
+1F157;NEGATIVE CIRCLED LATIN CAPITAL LETTER H;So;0;L;;;;;N;;;;;
+1F158;NEGATIVE CIRCLED LATIN CAPITAL LETTER I;So;0;L;;;;;N;;;;;
+1F159;NEGATIVE CIRCLED LATIN CAPITAL LETTER J;So;0;L;;;;;N;;;;;
+1F15A;NEGATIVE CIRCLED LATIN CAPITAL LETTER K;So;0;L;;;;;N;;;;;
+1F15B;NEGATIVE CIRCLED LATIN CAPITAL LETTER L;So;0;L;;;;;N;;;;;
+1F15C;NEGATIVE CIRCLED LATIN CAPITAL LETTER M;So;0;L;;;;;N;;;;;
+1F15D;NEGATIVE CIRCLED LATIN CAPITAL LETTER N;So;0;L;;;;;N;;;;;
+1F15E;NEGATIVE CIRCLED LATIN CAPITAL LETTER O;So;0;L;;;;;N;;;;;
+1F15F;NEGATIVE CIRCLED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;;
+1F160;NEGATIVE CIRCLED LATIN CAPITAL LETTER Q;So;0;L;;;;;N;;;;;
+1F161;NEGATIVE CIRCLED LATIN CAPITAL LETTER R;So;0;L;;;;;N;;;;;
+1F162;NEGATIVE CIRCLED LATIN CAPITAL LETTER S;So;0;L;;;;;N;;;;;
+1F163;NEGATIVE CIRCLED LATIN CAPITAL LETTER T;So;0;L;;;;;N;;;;;
+1F164;NEGATIVE CIRCLED LATIN CAPITAL LETTER U;So;0;L;;;;;N;;;;;
+1F165;NEGATIVE CIRCLED LATIN CAPITAL LETTER V;So;0;L;;;;;N;;;;;
+1F166;NEGATIVE CIRCLED LATIN CAPITAL LETTER W;So;0;L;;;;;N;;;;;
+1F167;NEGATIVE CIRCLED LATIN CAPITAL LETTER X;So;0;L;;;;;N;;;;;
+1F168;NEGATIVE CIRCLED LATIN CAPITAL LETTER Y;So;0;L;;;;;N;;;;;
+1F169;NEGATIVE CIRCLED LATIN CAPITAL LETTER Z;So;0;L;;;;;N;;;;;
+1F16A;RAISED MC SIGN;So;0;ON;<super> 004D 0043;;;;N;;;;;
+1F16B;RAISED MD SIGN;So;0;ON;<super> 004D 0044;;;;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;;;;;
+1F173;NEGATIVE SQUARED LATIN CAPITAL LETTER D;So;0;L;;;;;N;;;;;
+1F174;NEGATIVE SQUARED LATIN CAPITAL LETTER E;So;0;L;;;;;N;;;;;
+1F175;NEGATIVE SQUARED LATIN CAPITAL LETTER F;So;0;L;;;;;N;;;;;
+1F176;NEGATIVE SQUARED LATIN CAPITAL LETTER G;So;0;L;;;;;N;;;;;
+1F177;NEGATIVE SQUARED LATIN CAPITAL LETTER H;So;0;L;;;;;N;;;;;
+1F178;NEGATIVE SQUARED LATIN CAPITAL LETTER I;So;0;L;;;;;N;;;;;
+1F179;NEGATIVE SQUARED LATIN CAPITAL LETTER J;So;0;L;;;;;N;;;;;
+1F17A;NEGATIVE SQUARED LATIN CAPITAL LETTER K;So;0;L;;;;;N;;;;;
+1F17B;NEGATIVE SQUARED LATIN CAPITAL LETTER L;So;0;L;;;;;N;;;;;
+1F17C;NEGATIVE SQUARED LATIN CAPITAL LETTER M;So;0;L;;;;;N;;;;;
+1F17D;NEGATIVE SQUARED LATIN CAPITAL LETTER N;So;0;L;;;;;N;;;;;
+1F17E;NEGATIVE SQUARED LATIN CAPITAL LETTER O;So;0;L;;;;;N;;;;;
+1F17F;NEGATIVE SQUARED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;;
+1F180;NEGATIVE SQUARED LATIN CAPITAL LETTER Q;So;0;L;;;;;N;;;;;
+1F181;NEGATIVE SQUARED LATIN CAPITAL LETTER R;So;0;L;;;;;N;;;;;
+1F182;NEGATIVE SQUARED LATIN CAPITAL LETTER S;So;0;L;;;;;N;;;;;
+1F183;NEGATIVE SQUARED LATIN CAPITAL LETTER T;So;0;L;;;;;N;;;;;
+1F184;NEGATIVE SQUARED LATIN CAPITAL LETTER U;So;0;L;;;;;N;;;;;
+1F185;NEGATIVE SQUARED LATIN CAPITAL LETTER V;So;0;L;;;;;N;;;;;
+1F186;NEGATIVE SQUARED LATIN CAPITAL LETTER W;So;0;L;;;;;N;;;;;
+1F187;NEGATIVE SQUARED LATIN CAPITAL LETTER X;So;0;L;;;;;N;;;;;
+1F188;NEGATIVE SQUARED LATIN CAPITAL LETTER Y;So;0;L;;;;;N;;;;;
+1F189;NEGATIVE SQUARED LATIN CAPITAL LETTER Z;So;0;L;;;;;N;;;;;
+1F18A;CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;;
+1F18B;NEGATIVE SQUARED IC;So;0;L;;;;;N;;;;;
+1F18C;NEGATIVE SQUARED PA;So;0;L;;;;;N;;;;;
+1F18D;NEGATIVE SQUARED SA;So;0;L;;;;;N;;;;;
+1F18E;NEGATIVE SQUARED AB;So;0;L;;;;;N;;;;;
+1F18F;NEGATIVE SQUARED WC;So;0;L;;;;;N;;;;;
+1F190;SQUARE DJ;So;0;L;<square> 0044 004A;;;;N;;;;;
+1F191;SQUARED CL;So;0;L;;;;;N;;;;;
+1F192;SQUARED COOL;So;0;L;;;;;N;;;;;
+1F193;SQUARED FREE;So;0;L;;;;;N;;;;;
+1F194;SQUARED ID;So;0;L;;;;;N;;;;;
+1F195;SQUARED NEW;So;0;L;;;;;N;;;;;
+1F196;SQUARED NG;So;0;L;;;;;N;;;;;
+1F197;SQUARED OK;So;0;L;;;;;N;;;;;
+1F198;SQUARED SOS;So;0;L;;;;;N;;;;;
+1F199;SQUARED UP WITH EXCLAMATION MARK;So;0;L;;;;;N;;;;;
+1F19A;SQUARED VS;So;0;L;;;;;N;;;;;
+1F19B;SQUARED THREE D;So;0;L;;;;;N;;;;;
+1F19C;SQUARED SECOND SCREEN;So;0;L;;;;;N;;;;;
+1F19D;SQUARED TWO K;So;0;L;;;;;N;;;;;
+1F19E;SQUARED FOUR K;So;0;L;;;;;N;;;;;
+1F19F;SQUARED EIGHT K;So;0;L;;;;;N;;;;;
+1F1A0;SQUARED FIVE POINT ONE;So;0;L;;;;;N;;;;;
+1F1A1;SQUARED SEVEN POINT ONE;So;0;L;;;;;N;;;;;
+1F1A2;SQUARED TWENTY-TWO POINT TWO;So;0;L;;;;;N;;;;;
+1F1A3;SQUARED SIXTY P;So;0;L;;;;;N;;;;;
+1F1A4;SQUARED ONE HUNDRED TWENTY P;So;0;L;;;;;N;;;;;
+1F1A5;SQUARED LATIN SMALL LETTER D;So;0;L;;;;;N;;;;;
+1F1A6;SQUARED HC;So;0;L;;;;;N;;;;;
+1F1A7;SQUARED HDR;So;0;L;;;;;N;;;;;
+1F1A8;SQUARED HI-RES;So;0;L;;;;;N;;;;;
+1F1A9;SQUARED LOSSLESS;So;0;L;;;;;N;;;;;
+1F1AA;SQUARED SHV;So;0;L;;;;;N;;;;;
+1F1AB;SQUARED UHD;So;0;L;;;;;N;;;;;
+1F1AC;SQUARED VOD;So;0;L;;;;;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;;;;;
+1F1E9;REGIONAL INDICATOR SYMBOL LETTER D;So;0;L;;;;;N;;;;;
+1F1EA;REGIONAL INDICATOR SYMBOL LETTER E;So;0;L;;;;;N;;;;;
+1F1EB;REGIONAL INDICATOR SYMBOL LETTER F;So;0;L;;;;;N;;;;;
+1F1EC;REGIONAL INDICATOR SYMBOL LETTER G;So;0;L;;;;;N;;;;;
+1F1ED;REGIONAL INDICATOR SYMBOL LETTER H;So;0;L;;;;;N;;;;;
+1F1EE;REGIONAL INDICATOR SYMBOL LETTER I;So;0;L;;;;;N;;;;;
+1F1EF;REGIONAL INDICATOR SYMBOL LETTER J;So;0;L;;;;;N;;;;;
+1F1F0;REGIONAL INDICATOR SYMBOL LETTER K;So;0;L;;;;;N;;;;;
+1F1F1;REGIONAL INDICATOR SYMBOL LETTER L;So;0;L;;;;;N;;;;;
+1F1F2;REGIONAL INDICATOR SYMBOL LETTER M;So;0;L;;;;;N;;;;;
+1F1F3;REGIONAL INDICATOR SYMBOL LETTER N;So;0;L;;;;;N;;;;;
+1F1F4;REGIONAL INDICATOR SYMBOL LETTER O;So;0;L;;;;;N;;;;;
+1F1F5;REGIONAL INDICATOR SYMBOL LETTER P;So;0;L;;;;;N;;;;;
+1F1F6;REGIONAL INDICATOR SYMBOL LETTER Q;So;0;L;;;;;N;;;;;
+1F1F7;REGIONAL INDICATOR SYMBOL LETTER R;So;0;L;;;;;N;;;;;
+1F1F8;REGIONAL INDICATOR SYMBOL LETTER S;So;0;L;;;;;N;;;;;
+1F1F9;REGIONAL INDICATOR SYMBOL LETTER T;So;0;L;;;;;N;;;;;
+1F1FA;REGIONAL INDICATOR SYMBOL LETTER U;So;0;L;;;;;N;;;;;
+1F1FB;REGIONAL INDICATOR SYMBOL LETTER V;So;0;L;;;;;N;;;;;
+1F1FC;REGIONAL INDICATOR SYMBOL LETTER W;So;0;L;;;;;N;;;;;
+1F1FD;REGIONAL INDICATOR SYMBOL LETTER X;So;0;L;;;;;N;;;;;
+1F1FE;REGIONAL INDICATOR SYMBOL LETTER Y;So;0;L;;;;;N;;;;;
+1F1FF;REGIONAL INDICATOR SYMBOL LETTER Z;So;0;L;;;;;N;;;;;
+1F200;SQUARE HIRAGANA HOKA;So;0;L;<square> 307B 304B;;;;N;;;;;
+1F201;SQUARED KATAKANA KOKO;So;0;L;<square> 30B3 30B3;;;;N;;;;;
+1F202;SQUARED KATAKANA SA;So;0;L;<square> 30B5;;;;N;;;;;
+1F210;SQUARED CJK UNIFIED IDEOGRAPH-624B;So;0;L;<square> 624B;;;;N;;;;;
+1F211;SQUARED CJK UNIFIED IDEOGRAPH-5B57;So;0;L;<square> 5B57;;;;N;;;;;
+1F212;SQUARED CJK UNIFIED IDEOGRAPH-53CC;So;0;L;<square> 53CC;;;;N;;;;;
+1F213;SQUARED KATAKANA DE;So;0;L;<square> 30C7;;;;N;;;;;
+1F214;SQUARED CJK UNIFIED IDEOGRAPH-4E8C;So;0;L;<square> 4E8C;;;;N;;;;;
+1F215;SQUARED CJK UNIFIED IDEOGRAPH-591A;So;0;L;<square> 591A;;;;N;;;;;
+1F216;SQUARED CJK UNIFIED IDEOGRAPH-89E3;So;0;L;<square> 89E3;;;;N;;;;;
+1F217;SQUARED CJK UNIFIED IDEOGRAPH-5929;So;0;L;<square> 5929;;;;N;;;;;
+1F218;SQUARED CJK UNIFIED IDEOGRAPH-4EA4;So;0;L;<square> 4EA4;;;;N;;;;;
+1F219;SQUARED CJK UNIFIED IDEOGRAPH-6620;So;0;L;<square> 6620;;;;N;;;;;
+1F21A;SQUARED CJK UNIFIED IDEOGRAPH-7121;So;0;L;<square> 7121;;;;N;;;;;
+1F21B;SQUARED CJK UNIFIED IDEOGRAPH-6599;So;0;L;<square> 6599;;;;N;;;;;
+1F21C;SQUARED CJK UNIFIED IDEOGRAPH-524D;So;0;L;<square> 524D;;;;N;;;;;
+1F21D;SQUARED CJK UNIFIED IDEOGRAPH-5F8C;So;0;L;<square> 5F8C;;;;N;;;;;
+1F21E;SQUARED CJK UNIFIED IDEOGRAPH-518D;So;0;L;<square> 518D;;;;N;;;;;
+1F21F;SQUARED CJK UNIFIED IDEOGRAPH-65B0;So;0;L;<square> 65B0;;;;N;;;;;
+1F220;SQUARED CJK UNIFIED IDEOGRAPH-521D;So;0;L;<square> 521D;;;;N;;;;;
+1F221;SQUARED CJK UNIFIED IDEOGRAPH-7D42;So;0;L;<square> 7D42;;;;N;;;;;
+1F222;SQUARED CJK UNIFIED IDEOGRAPH-751F;So;0;L;<square> 751F;;;;N;;;;;
+1F223;SQUARED CJK UNIFIED IDEOGRAPH-8CA9;So;0;L;<square> 8CA9;;;;N;;;;;
+1F224;SQUARED CJK UNIFIED IDEOGRAPH-58F0;So;0;L;<square> 58F0;;;;N;;;;;
+1F225;SQUARED CJK UNIFIED IDEOGRAPH-5439;So;0;L;<square> 5439;;;;N;;;;;
+1F226;SQUARED CJK UNIFIED IDEOGRAPH-6F14;So;0;L;<square> 6F14;;;;N;;;;;
+1F227;SQUARED CJK UNIFIED IDEOGRAPH-6295;So;0;L;<square> 6295;;;;N;;;;;
+1F228;SQUARED CJK UNIFIED IDEOGRAPH-6355;So;0;L;<square> 6355;;;;N;;;;;
+1F229;SQUARED CJK UNIFIED IDEOGRAPH-4E00;So;0;L;<square> 4E00;;;;N;;;;;
+1F22A;SQUARED CJK UNIFIED IDEOGRAPH-4E09;So;0;L;<square> 4E09;;;;N;;;;;
+1F22B;SQUARED CJK UNIFIED IDEOGRAPH-904A;So;0;L;<square> 904A;;;;N;;;;;
+1F22C;SQUARED CJK UNIFIED IDEOGRAPH-5DE6;So;0;L;<square> 5DE6;;;;N;;;;;
+1F22D;SQUARED CJK UNIFIED IDEOGRAPH-4E2D;So;0;L;<square> 4E2D;;;;N;;;;;
+1F22E;SQUARED CJK UNIFIED IDEOGRAPH-53F3;So;0;L;<square> 53F3;;;;N;;;;;
+1F22F;SQUARED CJK UNIFIED IDEOGRAPH-6307;So;0;L;<square> 6307;;;;N;;;;;
+1F230;SQUARED CJK UNIFIED IDEOGRAPH-8D70;So;0;L;<square> 8D70;;;;N;;;;;
+1F231;SQUARED CJK UNIFIED IDEOGRAPH-6253;So;0;L;<square> 6253;;;;N;;;;;
+1F232;SQUARED CJK UNIFIED IDEOGRAPH-7981;So;0;L;<square> 7981;;;;N;;;;;
+1F233;SQUARED CJK UNIFIED IDEOGRAPH-7A7A;So;0;L;<square> 7A7A;;;;N;;;;;
+1F234;SQUARED CJK UNIFIED IDEOGRAPH-5408;So;0;L;<square> 5408;;;;N;;;;;
+1F235;SQUARED CJK UNIFIED IDEOGRAPH-6E80;So;0;L;<square> 6E80;;;;N;;;;;
+1F236;SQUARED CJK UNIFIED IDEOGRAPH-6709;So;0;L;<square> 6709;;;;N;;;;;
+1F237;SQUARED CJK UNIFIED IDEOGRAPH-6708;So;0;L;<square> 6708;;;;N;;;;;
+1F238;SQUARED CJK UNIFIED IDEOGRAPH-7533;So;0;L;<square> 7533;;;;N;;;;;
+1F239;SQUARED CJK UNIFIED IDEOGRAPH-5272;So;0;L;<square> 5272;;;;N;;;;;
+1F23A;SQUARED CJK UNIFIED IDEOGRAPH-55B6;So;0;L;<square> 55B6;;;;N;;;;;
+1F23B;SQUARED CJK UNIFIED IDEOGRAPH-914D;So;0;L;<square> 914D;;;;N;;;;;
+1F240;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C;So;0;L;<compat> 3014 672C 3015;;;;N;;;;;
+1F241;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09;So;0;L;<compat> 3014 4E09 3015;;;;N;;;;;
+1F242;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C;So;0;L;<compat> 3014 4E8C 3015;;;;N;;;;;
+1F243;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89;So;0;L;<compat> 3014 5B89 3015;;;;N;;;;;
+1F244;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9;So;0;L;<compat> 3014 70B9 3015;;;;N;;;;;
+1F245;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253;So;0;L;<compat> 3014 6253 3015;;;;N;;;;;
+1F246;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7;So;0;L;<compat> 3014 76D7 3015;;;;N;;;;;
+1F247;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD;So;0;L;<compat> 3014 52DD 3015;;;;N;;;;;
+1F248;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557;So;0;L;<compat> 3014 6557 3015;;;;N;;;;;
+1F250;CIRCLED IDEOGRAPH ADVANTAGE;So;0;L;<circle> 5F97;;;;N;;;;;
+1F251;CIRCLED IDEOGRAPH ACCEPT;So;0;L;<circle> 53EF;;;;N;;;;;
+1F300;CYCLONE;So;0;ON;;;;;N;;;;;
+1F301;FOGGY;So;0;ON;;;;;N;;;;;
+1F302;CLOSED UMBRELLA;So;0;ON;;;;;N;;;;;
+1F303;NIGHT WITH STARS;So;0;ON;;;;;N;;;;;
+1F304;SUNRISE OVER MOUNTAINS;So;0;ON;;;;;N;;;;;
+1F305;SUNRISE;So;0;ON;;;;;N;;;;;
+1F306;CITYSCAPE AT DUSK;So;0;ON;;;;;N;;;;;
+1F307;SUNSET OVER BUILDINGS;So;0;ON;;;;;N;;;;;
+1F308;RAINBOW;So;0;ON;;;;;N;;;;;
+1F309;BRIDGE AT NIGHT;So;0;ON;;;;;N;;;;;
+1F30A;WATER WAVE;So;0;ON;;;;;N;;;;;
+1F30B;VOLCANO;So;0;ON;;;;;N;;;;;
+1F30C;MILKY WAY;So;0;ON;;;;;N;;;;;
+1F30D;EARTH GLOBE EUROPE-AFRICA;So;0;ON;;;;;N;;;;;
+1F30E;EARTH GLOBE AMERICAS;So;0;ON;;;;;N;;;;;
+1F30F;EARTH GLOBE ASIA-AUSTRALIA;So;0;ON;;;;;N;;;;;
+1F310;GLOBE WITH MERIDIANS;So;0;ON;;;;;N;;;;;
+1F311;NEW MOON SYMBOL;So;0;ON;;;;;N;;;;;
+1F312;WAXING CRESCENT MOON SYMBOL;So;0;ON;;;;;N;;;;;
+1F313;FIRST QUARTER MOON SYMBOL;So;0;ON;;;;;N;;;;;
+1F314;WAXING GIBBOUS MOON SYMBOL;So;0;ON;;;;;N;;;;;
+1F315;FULL MOON SYMBOL;So;0;ON;;;;;N;;;;;
+1F316;WANING GIBBOUS MOON SYMBOL;So;0;ON;;;;;N;;;;;
+1F317;LAST QUARTER MOON SYMBOL;So;0;ON;;;;;N;;;;;
+1F318;WANING CRESCENT MOON SYMBOL;So;0;ON;;;;;N;;;;;
+1F319;CRESCENT MOON;So;0;ON;;;;;N;;;;;
+1F31A;NEW MOON WITH FACE;So;0;ON;;;;;N;;;;;
+1F31B;FIRST QUARTER MOON WITH FACE;So;0;ON;;;;;N;;;;;
+1F31C;LAST QUARTER MOON WITH FACE;So;0;ON;;;;;N;;;;;
+1F31D;FULL MOON WITH FACE;So;0;ON;;;;;N;;;;;
+1F31E;SUN WITH FACE;So;0;ON;;;;;N;;;;;
+1F31F;GLOWING STAR;So;0;ON;;;;;N;;;;;
+1F320;SHOOTING STAR;So;0;ON;;;;;N;;;;;
+1F321;THERMOMETER;So;0;ON;;;;;N;;;;;
+1F322;BLACK DROPLET;So;0;ON;;;;;N;;;;;
+1F323;WHITE SUN;So;0;ON;;;;;N;;;;;
+1F324;WHITE SUN WITH SMALL CLOUD;So;0;ON;;;;;N;;;;;
+1F325;WHITE SUN BEHIND CLOUD;So;0;ON;;;;;N;;;;;
+1F326;WHITE SUN BEHIND CLOUD WITH RAIN;So;0;ON;;;;;N;;;;;
+1F327;CLOUD WITH RAIN;So;0;ON;;;;;N;;;;;
+1F328;CLOUD WITH SNOW;So;0;ON;;;;;N;;;;;
+1F329;CLOUD WITH LIGHTNING;So;0;ON;;;;;N;;;;;
+1F32A;CLOUD WITH TORNADO;So;0;ON;;;;;N;;;;;
+1F32B;FOG;So;0;ON;;;;;N;;;;;
+1F32C;WIND BLOWING FACE;So;0;ON;;;;;N;;;;;
+1F32D;HOT DOG;So;0;ON;;;;;N;;;;;
+1F32E;TACO;So;0;ON;;;;;N;;;;;
+1F32F;BURRITO;So;0;ON;;;;;N;;;;;
+1F330;CHESTNUT;So;0;ON;;;;;N;;;;;
+1F331;SEEDLING;So;0;ON;;;;;N;;;;;
+1F332;EVERGREEN TREE;So;0;ON;;;;;N;;;;;
+1F333;DECIDUOUS TREE;So;0;ON;;;;;N;;;;;
+1F334;PALM TREE;So;0;ON;;;;;N;;;;;
+1F335;CACTUS;So;0;ON;;;;;N;;;;;
+1F336;HOT PEPPER;So;0;ON;;;;;N;;;;;
+1F337;TULIP;So;0;ON;;;;;N;;;;;
+1F338;CHERRY BLOSSOM;So;0;ON;;;;;N;;;;;
+1F339;ROSE;So;0;ON;;;;;N;;;;;
+1F33A;HIBISCUS;So;0;ON;;;;;N;;;;;
+1F33B;SUNFLOWER;So;0;ON;;;;;N;;;;;
+1F33C;BLOSSOM;So;0;ON;;;;;N;;;;;
+1F33D;EAR OF MAIZE;So;0;ON;;;;;N;;;;;
+1F33E;EAR OF RICE;So;0;ON;;;;;N;;;;;
+1F33F;HERB;So;0;ON;;;;;N;;;;;
+1F340;FOUR LEAF CLOVER;So;0;ON;;;;;N;;;;;
+1F341;MAPLE LEAF;So;0;ON;;;;;N;;;;;
+1F342;FALLEN LEAF;So;0;ON;;;;;N;;;;;
+1F343;LEAF FLUTTERING IN WIND;So;0;ON;;;;;N;;;;;
+1F344;MUSHROOM;So;0;ON;;;;;N;;;;;
+1F345;TOMATO;So;0;ON;;;;;N;;;;;
+1F346;AUBERGINE;So;0;ON;;;;;N;;;;;
+1F347;GRAPES;So;0;ON;;;;;N;;;;;
+1F348;MELON;So;0;ON;;;;;N;;;;;
+1F349;WATERMELON;So;0;ON;;;;;N;;;;;
+1F34A;TANGERINE;So;0;ON;;;;;N;;;;;
+1F34B;LEMON;So;0;ON;;;;;N;;;;;
+1F34C;BANANA;So;0;ON;;;;;N;;;;;
+1F34D;PINEAPPLE;So;0;ON;;;;;N;;;;;
+1F34E;RED APPLE;So;0;ON;;;;;N;;;;;
+1F34F;GREEN APPLE;So;0;ON;;;;;N;;;;;
+1F350;PEAR;So;0;ON;;;;;N;;;;;
+1F351;PEACH;So;0;ON;;;;;N;;;;;
+1F352;CHERRIES;So;0;ON;;;;;N;;;;;
+1F353;STRAWBERRY;So;0;ON;;;;;N;;;;;
+1F354;HAMBURGER;So;0;ON;;;;;N;;;;;
+1F355;SLICE OF PIZZA;So;0;ON;;;;;N;;;;;
+1F356;MEAT ON BONE;So;0;ON;;;;;N;;;;;
+1F357;POULTRY LEG;So;0;ON;;;;;N;;;;;
+1F358;RICE CRACKER;So;0;ON;;;;;N;;;;;
+1F359;RICE BALL;So;0;ON;;;;;N;;;;;
+1F35A;COOKED RICE;So;0;ON;;;;;N;;;;;
+1F35B;CURRY AND RICE;So;0;ON;;;;;N;;;;;
+1F35C;STEAMING BOWL;So;0;ON;;;;;N;;;;;
+1F35D;SPAGHETTI;So;0;ON;;;;;N;;;;;
+1F35E;BREAD;So;0;ON;;;;;N;;;;;
+1F35F;FRENCH FRIES;So;0;ON;;;;;N;;;;;
+1F360;ROASTED SWEET POTATO;So;0;ON;;;;;N;;;;;
+1F361;DANGO;So;0;ON;;;;;N;;;;;
+1F362;ODEN;So;0;ON;;;;;N;;;;;
+1F363;SUSHI;So;0;ON;;;;;N;;;;;
+1F364;FRIED SHRIMP;So;0;ON;;;;;N;;;;;
+1F365;FISH CAKE WITH SWIRL DESIGN;So;0;ON;;;;;N;;;;;
+1F366;SOFT ICE CREAM;So;0;ON;;;;;N;;;;;
+1F367;SHAVED ICE;So;0;ON;;;;;N;;;;;
+1F368;ICE CREAM;So;0;ON;;;;;N;;;;;
+1F369;DOUGHNUT;So;0;ON;;;;;N;;;;;
+1F36A;COOKIE;So;0;ON;;;;;N;;;;;
+1F36B;CHOCOLATE BAR;So;0;ON;;;;;N;;;;;
+1F36C;CANDY;So;0;ON;;;;;N;;;;;
+1F36D;LOLLIPOP;So;0;ON;;;;;N;;;;;
+1F36E;CUSTARD;So;0;ON;;;;;N;;;;;
+1F36F;HONEY POT;So;0;ON;;;;;N;;;;;
+1F370;SHORTCAKE;So;0;ON;;;;;N;;;;;
+1F371;BENTO BOX;So;0;ON;;;;;N;;;;;
+1F372;POT OF FOOD;So;0;ON;;;;;N;;;;;
+1F373;COOKING;So;0;ON;;;;;N;;;;;
+1F374;FORK AND KNIFE;So;0;ON;;;;;N;;;;;
+1F375;TEACUP WITHOUT HANDLE;So;0;ON;;;;;N;;;;;
+1F376;SAKE BOTTLE AND CUP;So;0;ON;;;;;N;;;;;
+1F377;WINE GLASS;So;0;ON;;;;;N;;;;;
+1F378;COCKTAIL GLASS;So;0;ON;;;;;N;;;;;
+1F379;TROPICAL DRINK;So;0;ON;;;;;N;;;;;
+1F37A;BEER MUG;So;0;ON;;;;;N;;;;;
+1F37B;CLINKING BEER MUGS;So;0;ON;;;;;N;;;;;
+1F37C;BABY BOTTLE;So;0;ON;;;;;N;;;;;
+1F37D;FORK AND KNIFE WITH PLATE;So;0;ON;;;;;N;;;;;
+1F37E;BOTTLE WITH POPPING CORK;So;0;ON;;;;;N;;;;;
+1F37F;POPCORN;So;0;ON;;;;;N;;;;;
+1F380;RIBBON;So;0;ON;;;;;N;;;;;
+1F381;WRAPPED PRESENT;So;0;ON;;;;;N;;;;;
+1F382;BIRTHDAY CAKE;So;0;ON;;;;;N;;;;;
+1F383;JACK-O-LANTERN;So;0;ON;;;;;N;;;;;
+1F384;CHRISTMAS TREE;So;0;ON;;;;;N;;;;;
+1F385;FATHER CHRISTMAS;So;0;ON;;;;;N;;;;;
+1F386;FIREWORKS;So;0;ON;;;;;N;;;;;
+1F387;FIREWORK SPARKLER;So;0;ON;;;;;N;;;;;
+1F388;BALLOON;So;0;ON;;;;;N;;;;;
+1F389;PARTY POPPER;So;0;ON;;;;;N;;;;;
+1F38A;CONFETTI BALL;So;0;ON;;;;;N;;;;;
+1F38B;TANABATA TREE;So;0;ON;;;;;N;;;;;
+1F38C;CROSSED FLAGS;So;0;ON;;;;;N;;;;;
+1F38D;PINE DECORATION;So;0;ON;;;;;N;;;;;
+1F38E;JAPANESE DOLLS;So;0;ON;;;;;N;;;;;
+1F38F;CARP STREAMER;So;0;ON;;;;;N;;;;;
+1F390;WIND CHIME;So;0;ON;;;;;N;;;;;
+1F391;MOON VIEWING CEREMONY;So;0;ON;;;;;N;;;;;
+1F392;SCHOOL SATCHEL;So;0;ON;;;;;N;;;;;
+1F393;GRADUATION CAP;So;0;ON;;;;;N;;;;;
+1F394;HEART WITH TIP ON THE LEFT;So;0;ON;;;;;N;;;;;
+1F395;BOUQUET OF FLOWERS;So;0;ON;;;;;N;;;;;
+1F396;MILITARY MEDAL;So;0;ON;;;;;N;;;;;
+1F397;REMINDER RIBBON;So;0;ON;;;;;N;;;;;
+1F398;MUSICAL KEYBOARD WITH JACKS;So;0;ON;;;;;N;;;;;
+1F399;STUDIO MICROPHONE;So;0;ON;;;;;N;;;;;
+1F39A;LEVEL SLIDER;So;0;ON;;;;;N;;;;;
+1F39B;CONTROL KNOBS;So;0;ON;;;;;N;;;;;
+1F39C;BEAMED ASCENDING MUSICAL NOTES;So;0;ON;;;;;N;;;;;
+1F39D;BEAMED DESCENDING MUSICAL NOTES;So;0;ON;;;;;N;;;;;
+1F39E;FILM FRAMES;So;0;ON;;;;;N;;;;;
+1F39F;ADMISSION TICKETS;So;0;ON;;;;;N;;;;;
+1F3A0;CAROUSEL HORSE;So;0;ON;;;;;N;;;;;
+1F3A1;FERRIS WHEEL;So;0;ON;;;;;N;;;;;
+1F3A2;ROLLER COASTER;So;0;ON;;;;;N;;;;;
+1F3A3;FISHING POLE AND FISH;So;0;ON;;;;;N;;;;;
+1F3A4;MICROPHONE;So;0;ON;;;;;N;;;;;
+1F3A5;MOVIE CAMERA;So;0;ON;;;;;N;;;;;
+1F3A6;CINEMA;So;0;ON;;;;;N;;;;;
+1F3A7;HEADPHONE;So;0;ON;;;;;N;;;;;
+1F3A8;ARTIST PALETTE;So;0;ON;;;;;N;;;;;
+1F3A9;TOP HAT;So;0;ON;;;;;N;;;;;
+1F3AA;CIRCUS TENT;So;0;ON;;;;;N;;;;;
+1F3AB;TICKET;So;0;ON;;;;;N;;;;;
+1F3AC;CLAPPER BOARD;So;0;ON;;;;;N;;;;;
+1F3AD;PERFORMING ARTS;So;0;ON;;;;;N;;;;;
+1F3AE;VIDEO GAME;So;0;ON;;;;;N;;;;;
+1F3AF;DIRECT HIT;So;0;ON;;;;;N;;;;;
+1F3B0;SLOT MACHINE;So;0;ON;;;;;N;;;;;
+1F3B1;BILLIARDS;So;0;ON;;;;;N;;;;;
+1F3B2;GAME DIE;So;0;ON;;;;;N;;;;;
+1F3B3;BOWLING;So;0;ON;;;;;N;;;;;
+1F3B4;FLOWER PLAYING CARDS;So;0;ON;;;;;N;;;;;
+1F3B5;MUSICAL NOTE;So;0;ON;;;;;N;;;;;
+1F3B6;MULTIPLE MUSICAL NOTES;So;0;ON;;;;;N;;;;;
+1F3B7;SAXOPHONE;So;0;ON;;;;;N;;;;;
+1F3B8;GUITAR;So;0;ON;;;;;N;;;;;
+1F3B9;MUSICAL KEYBOARD;So;0;ON;;;;;N;;;;;
+1F3BA;TRUMPET;So;0;ON;;;;;N;;;;;
+1F3BB;VIOLIN;So;0;ON;;;;;N;;;;;
+1F3BC;MUSICAL SCORE;So;0;ON;;;;;N;;;;;
+1F3BD;RUNNING SHIRT WITH SASH;So;0;ON;;;;;N;;;;;
+1F3BE;TENNIS RACQUET AND BALL;So;0;ON;;;;;N;;;;;
+1F3BF;SKI AND SKI BOOT;So;0;ON;;;;;N;;;;;
+1F3C0;BASKETBALL AND HOOP;So;0;ON;;;;;N;;;;;
+1F3C1;CHEQUERED FLAG;So;0;ON;;;;;N;;;;;
+1F3C2;SNOWBOARDER;So;0;ON;;;;;N;;;;;
+1F3C3;RUNNER;So;0;ON;;;;;N;;;;;
+1F3C4;SURFER;So;0;ON;;;;;N;;;;;
+1F3C5;SPORTS MEDAL;So;0;ON;;;;;N;;;;;
+1F3C6;TROPHY;So;0;ON;;;;;N;;;;;
+1F3C7;HORSE RACING;So;0;ON;;;;;N;;;;;
+1F3C8;AMERICAN FOOTBALL;So;0;ON;;;;;N;;;;;
+1F3C9;RUGBY FOOTBALL;So;0;ON;;;;;N;;;;;
+1F3CA;SWIMMER;So;0;ON;;;;;N;;;;;
+1F3CB;WEIGHT LIFTER;So;0;ON;;;;;N;;;;;
+1F3CC;GOLFER;So;0;ON;;;;;N;;;;;
+1F3CD;RACING MOTORCYCLE;So;0;ON;;;;;N;;;;;
+1F3CE;RACING CAR;So;0;ON;;;;;N;;;;;
+1F3CF;CRICKET BAT AND BALL;So;0;ON;;;;;N;;;;;
+1F3D0;VOLLEYBALL;So;0;ON;;;;;N;;;;;
+1F3D1;FIELD HOCKEY STICK AND BALL;So;0;ON;;;;;N;;;;;
+1F3D2;ICE HOCKEY STICK AND PUCK;So;0;ON;;;;;N;;;;;
+1F3D3;TABLE TENNIS PADDLE AND BALL;So;0;ON;;;;;N;;;;;
+1F3D4;SNOW CAPPED MOUNTAIN;So;0;ON;;;;;N;;;;;
+1F3D5;CAMPING;So;0;ON;;;;;N;;;;;
+1F3D6;BEACH WITH UMBRELLA;So;0;ON;;;;;N;;;;;
+1F3D7;BUILDING CONSTRUCTION;So;0;ON;;;;;N;;;;;
+1F3D8;HOUSE BUILDINGS;So;0;ON;;;;;N;;;;;
+1F3D9;CITYSCAPE;So;0;ON;;;;;N;;;;;
+1F3DA;DERELICT HOUSE BUILDING;So;0;ON;;;;;N;;;;;
+1F3DB;CLASSICAL BUILDING;So;0;ON;;;;;N;;;;;
+1F3DC;DESERT;So;0;ON;;;;;N;;;;;
+1F3DD;DESERT ISLAND;So;0;ON;;;;;N;;;;;
+1F3DE;NATIONAL PARK;So;0;ON;;;;;N;;;;;
+1F3DF;STADIUM;So;0;ON;;;;;N;;;;;
+1F3E0;HOUSE BUILDING;So;0;ON;;;;;N;;;;;
+1F3E1;HOUSE WITH GARDEN;So;0;ON;;;;;N;;;;;
+1F3E2;OFFICE BUILDING;So;0;ON;;;;;N;;;;;
+1F3E3;JAPANESE POST OFFICE;So;0;ON;;;;;N;;;;;
+1F3E4;EUROPEAN POST OFFICE;So;0;ON;;;;;N;;;;;
+1F3E5;HOSPITAL;So;0;ON;;;;;N;;;;;
+1F3E6;BANK;So;0;ON;;;;;N;;;;;
+1F3E7;AUTOMATED TELLER MACHINE;So;0;ON;;;;;N;;;;;
+1F3E8;HOTEL;So;0;ON;;;;;N;;;;;
+1F3E9;LOVE HOTEL;So;0;ON;;;;;N;;;;;
+1F3EA;CONVENIENCE STORE;So;0;ON;;;;;N;;;;;
+1F3EB;SCHOOL;So;0;ON;;;;;N;;;;;
+1F3EC;DEPARTMENT STORE;So;0;ON;;;;;N;;;;;
+1F3ED;FACTORY;So;0;ON;;;;;N;;;;;
+1F3EE;IZAKAYA LANTERN;So;0;ON;;;;;N;;;;;
+1F3EF;JAPANESE CASTLE;So;0;ON;;;;;N;;;;;
+1F3F0;EUROPEAN CASTLE;So;0;ON;;;;;N;;;;;
+1F3F1;WHITE PENNANT;So;0;ON;;;;;N;;;;;
+1F3F2;BLACK PENNANT;So;0;ON;;;;;N;;;;;
+1F3F3;WAVING WHITE FLAG;So;0;ON;;;;;N;;;;;
+1F3F4;WAVING BLACK FLAG;So;0;ON;;;;;N;;;;;
+1F3F5;ROSETTE;So;0;ON;;;;;N;;;;;
+1F3F6;BLACK ROSETTE;So;0;ON;;;;;N;;;;;
+1F3F7;LABEL;So;0;ON;;;;;N;;;;;
+1F3F8;BADMINTON RACQUET AND SHUTTLECOCK;So;0;ON;;;;;N;;;;;
+1F3F9;BOW AND ARROW;So;0;ON;;;;;N;;;;;
+1F3FA;AMPHORA;So;0;ON;;;;;N;;;;;
+1F3FB;EMOJI MODIFIER FITZPATRICK TYPE-1-2;Sk;0;ON;;;;;N;;;;;
+1F3FC;EMOJI MODIFIER FITZPATRICK TYPE-3;Sk;0;ON;;;;;N;;;;;
+1F3FD;EMOJI MODIFIER FITZPATRICK TYPE-4;Sk;0;ON;;;;;N;;;;;
+1F3FE;EMOJI MODIFIER FITZPATRICK TYPE-5;Sk;0;ON;;;;;N;;;;;
+1F3FF;EMOJI MODIFIER FITZPATRICK TYPE-6;Sk;0;ON;;;;;N;;;;;
+1F400;RAT;So;0;ON;;;;;N;;;;;
+1F401;MOUSE;So;0;ON;;;;;N;;;;;
+1F402;OX;So;0;ON;;;;;N;;;;;
+1F403;WATER BUFFALO;So;0;ON;;;;;N;;;;;
+1F404;COW;So;0;ON;;;;;N;;;;;
+1F405;TIGER;So;0;ON;;;;;N;;;;;
+1F406;LEOPARD;So;0;ON;;;;;N;;;;;
+1F407;RABBIT;So;0;ON;;;;;N;;;;;
+1F408;CAT;So;0;ON;;;;;N;;;;;
+1F409;DRAGON;So;0;ON;;;;;N;;;;;
+1F40A;CROCODILE;So;0;ON;;;;;N;;;;;
+1F40B;WHALE;So;0;ON;;;;;N;;;;;
+1F40C;SNAIL;So;0;ON;;;;;N;;;;;
+1F40D;SNAKE;So;0;ON;;;;;N;;;;;
+1F40E;HORSE;So;0;ON;;;;;N;;;;;
+1F40F;RAM;So;0;ON;;;;;N;;;;;
+1F410;GOAT;So;0;ON;;;;;N;;;;;
+1F411;SHEEP;So;0;ON;;;;;N;;;;;
+1F412;MONKEY;So;0;ON;;;;;N;;;;;
+1F413;ROOSTER;So;0;ON;;;;;N;;;;;
+1F414;CHICKEN;So;0;ON;;;;;N;;;;;
+1F415;DOG;So;0;ON;;;;;N;;;;;
+1F416;PIG;So;0;ON;;;;;N;;;;;
+1F417;BOAR;So;0;ON;;;;;N;;;;;
+1F418;ELEPHANT;So;0;ON;;;;;N;;;;;
+1F419;OCTOPUS;So;0;ON;;;;;N;;;;;
+1F41A;SPIRAL SHELL;So;0;ON;;;;;N;;;;;
+1F41B;BUG;So;0;ON;;;;;N;;;;;
+1F41C;ANT;So;0;ON;;;;;N;;;;;
+1F41D;HONEYBEE;So;0;ON;;;;;N;;;;;
+1F41E;LADY BEETLE;So;0;ON;;;;;N;;;;;
+1F41F;FISH;So;0;ON;;;;;N;;;;;
+1F420;TROPICAL FISH;So;0;ON;;;;;N;;;;;
+1F421;BLOWFISH;So;0;ON;;;;;N;;;;;
+1F422;TURTLE;So;0;ON;;;;;N;;;;;
+1F423;HATCHING CHICK;So;0;ON;;;;;N;;;;;
+1F424;BABY CHICK;So;0;ON;;;;;N;;;;;
+1F425;FRONT-FACING BABY CHICK;So;0;ON;;;;;N;;;;;
+1F426;BIRD;So;0;ON;;;;;N;;;;;
+1F427;PENGUIN;So;0;ON;;;;;N;;;;;
+1F428;KOALA;So;0;ON;;;;;N;;;;;
+1F429;POODLE;So;0;ON;;;;;N;;;;;
+1F42A;DROMEDARY CAMEL;So;0;ON;;;;;N;;;;;
+1F42B;BACTRIAN CAMEL;So;0;ON;;;;;N;;;;;
+1F42C;DOLPHIN;So;0;ON;;;;;N;;;;;
+1F42D;MOUSE FACE;So;0;ON;;;;;N;;;;;
+1F42E;COW FACE;So;0;ON;;;;;N;;;;;
+1F42F;TIGER FACE;So;0;ON;;;;;N;;;;;
+1F430;RABBIT FACE;So;0;ON;;;;;N;;;;;
+1F431;CAT FACE;So;0;ON;;;;;N;;;;;
+1F432;DRAGON FACE;So;0;ON;;;;;N;;;;;
+1F433;SPOUTING WHALE;So;0;ON;;;;;N;;;;;
+1F434;HORSE FACE;So;0;ON;;;;;N;;;;;
+1F435;MONKEY FACE;So;0;ON;;;;;N;;;;;
+1F436;DOG FACE;So;0;ON;;;;;N;;;;;
+1F437;PIG FACE;So;0;ON;;;;;N;;;;;
+1F438;FROG FACE;So;0;ON;;;;;N;;;;;
+1F439;HAMSTER FACE;So;0;ON;;;;;N;;;;;
+1F43A;WOLF FACE;So;0;ON;;;;;N;;;;;
+1F43B;BEAR FACE;So;0;ON;;;;;N;;;;;
+1F43C;PANDA FACE;So;0;ON;;;;;N;;;;;
+1F43D;PIG NOSE;So;0;ON;;;;;N;;;;;
+1F43E;PAW PRINTS;So;0;ON;;;;;N;;;;;
+1F43F;CHIPMUNK;So;0;ON;;;;;N;;;;;
+1F440;EYES;So;0;ON;;;;;N;;;;;
+1F441;EYE;So;0;ON;;;;;N;;;;;
+1F442;EAR;So;0;ON;;;;;N;;;;;
+1F443;NOSE;So;0;ON;;;;;N;;;;;
+1F444;MOUTH;So;0;ON;;;;;N;;;;;
+1F445;TONGUE;So;0;ON;;;;;N;;;;;
+1F446;WHITE UP POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;;
+1F447;WHITE DOWN POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;;
+1F448;WHITE LEFT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;;
+1F449;WHITE RIGHT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;;
+1F44A;FISTED HAND SIGN;So;0;ON;;;;;N;;;;;
+1F44B;WAVING HAND SIGN;So;0;ON;;;;;N;;;;;
+1F44C;OK HAND SIGN;So;0;ON;;;;;N;;;;;
+1F44D;THUMBS UP SIGN;So;0;ON;;;;;N;;;;;
+1F44E;THUMBS DOWN SIGN;So;0;ON;;;;;N;;;;;
+1F44F;CLAPPING HANDS SIGN;So;0;ON;;;;;N;;;;;
+1F450;OPEN HANDS SIGN;So;0;ON;;;;;N;;;;;
+1F451;CROWN;So;0;ON;;;;;N;;;;;
+1F452;WOMANS HAT;So;0;ON;;;;;N;;;;;
+1F453;EYEGLASSES;So;0;ON;;;;;N;;;;;
+1F454;NECKTIE;So;0;ON;;;;;N;;;;;
+1F455;T-SHIRT;So;0;ON;;;;;N;;;;;
+1F456;JEANS;So;0;ON;;;;;N;;;;;
+1F457;DRESS;So;0;ON;;;;;N;;;;;
+1F458;KIMONO;So;0;ON;;;;;N;;;;;
+1F459;BIKINI;So;0;ON;;;;;N;;;;;
+1F45A;WOMANS CLOTHES;So;0;ON;;;;;N;;;;;
+1F45B;PURSE;So;0;ON;;;;;N;;;;;
+1F45C;HANDBAG;So;0;ON;;;;;N;;;;;
+1F45D;POUCH;So;0;ON;;;;;N;;;;;
+1F45E;MANS SHOE;So;0;ON;;;;;N;;;;;
+1F45F;ATHLETIC SHOE;So;0;ON;;;;;N;;;;;
+1F460;HIGH-HEELED SHOE;So;0;ON;;;;;N;;;;;
+1F461;WOMANS SANDAL;So;0;ON;;;;;N;;;;;
+1F462;WOMANS BOOTS;So;0;ON;;;;;N;;;;;
+1F463;FOOTPRINTS;So;0;ON;;;;;N;;;;;
+1F464;BUST IN SILHOUETTE;So;0;ON;;;;;N;;;;;
+1F465;BUSTS IN SILHOUETTE;So;0;ON;;;;;N;;;;;
+1F466;BOY;So;0;ON;;;;;N;;;;;
+1F467;GIRL;So;0;ON;;;;;N;;;;;
+1F468;MAN;So;0;ON;;;;;N;;;;;
+1F469;WOMAN;So;0;ON;;;;;N;;;;;
+1F46A;FAMILY;So;0;ON;;;;;N;;;;;
+1F46B;MAN AND WOMAN HOLDING HANDS;So;0;ON;;;;;N;;;;;
+1F46C;TWO MEN HOLDING HANDS;So;0;ON;;;;;N;;;;;
+1F46D;TWO WOMEN HOLDING HANDS;So;0;ON;;;;;N;;;;;
+1F46E;POLICE OFFICER;So;0;ON;;;;;N;;;;;
+1F46F;WOMAN WITH BUNNY EARS;So;0;ON;;;;;N;;;;;
+1F470;BRIDE WITH VEIL;So;0;ON;;;;;N;;;;;
+1F471;PERSON WITH BLOND HAIR;So;0;ON;;;;;N;;;;;
+1F472;MAN WITH GUA PI MAO;So;0;ON;;;;;N;;;;;
+1F473;MAN WITH TURBAN;So;0;ON;;;;;N;;;;;
+1F474;OLDER MAN;So;0;ON;;;;;N;;;;;
+1F475;OLDER WOMAN;So;0;ON;;;;;N;;;;;
+1F476;BABY;So;0;ON;;;;;N;;;;;
+1F477;CONSTRUCTION WORKER;So;0;ON;;;;;N;;;;;
+1F478;PRINCESS;So;0;ON;;;;;N;;;;;
+1F479;JAPANESE OGRE;So;0;ON;;;;;N;;;;;
+1F47A;JAPANESE GOBLIN;So;0;ON;;;;;N;;;;;
+1F47B;GHOST;So;0;ON;;;;;N;;;;;
+1F47C;BABY ANGEL;So;0;ON;;;;;N;;;;;
+1F47D;EXTRATERRESTRIAL ALIEN;So;0;ON;;;;;N;;;;;
+1F47E;ALIEN MONSTER;So;0;ON;;;;;N;;;;;
+1F47F;IMP;So;0;ON;;;;;N;;;;;
+1F480;SKULL;So;0;ON;;;;;N;;;;;
+1F481;INFORMATION DESK PERSON;So;0;ON;;;;;N;;;;;
+1F482;GUARDSMAN;So;0;ON;;;;;N;;;;;
+1F483;DANCER;So;0;ON;;;;;N;;;;;
+1F484;LIPSTICK;So;0;ON;;;;;N;;;;;
+1F485;NAIL POLISH;So;0;ON;;;;;N;;;;;
+1F486;FACE MASSAGE;So;0;ON;;;;;N;;;;;
+1F487;HAIRCUT;So;0;ON;;;;;N;;;;;
+1F488;BARBER POLE;So;0;ON;;;;;N;;;;;
+1F489;SYRINGE;So;0;ON;;;;;N;;;;;
+1F48A;PILL;So;0;ON;;;;;N;;;;;
+1F48B;KISS MARK;So;0;ON;;;;;N;;;;;
+1F48C;LOVE LETTER;So;0;ON;;;;;N;;;;;
+1F48D;RING;So;0;ON;;;;;N;;;;;
+1F48E;GEM STONE;So;0;ON;;;;;N;;;;;
+1F48F;KISS;So;0;ON;;;;;N;;;;;
+1F490;BOUQUET;So;0;ON;;;;;N;;;;;
+1F491;COUPLE WITH HEART;So;0;ON;;;;;N;;;;;
+1F492;WEDDING;So;0;ON;;;;;N;;;;;
+1F493;BEATING HEART;So;0;ON;;;;;N;;;;;
+1F494;BROKEN HEART;So;0;ON;;;;;N;;;;;
+1F495;TWO HEARTS;So;0;ON;;;;;N;;;;;
+1F496;SPARKLING HEART;So;0;ON;;;;;N;;;;;
+1F497;GROWING HEART;So;0;ON;;;;;N;;;;;
+1F498;HEART WITH ARROW;So;0;ON;;;;;N;;;;;
+1F499;BLUE HEART;So;0;ON;;;;;N;;;;;
+1F49A;GREEN HEART;So;0;ON;;;;;N;;;;;
+1F49B;YELLOW HEART;So;0;ON;;;;;N;;;;;
+1F49C;PURPLE HEART;So;0;ON;;;;;N;;;;;
+1F49D;HEART WITH RIBBON;So;0;ON;;;;;N;;;;;
+1F49E;REVOLVING HEARTS;So;0;ON;;;;;N;;;;;
+1F49F;HEART DECORATION;So;0;ON;;;;;N;;;;;
+1F4A0;DIAMOND SHAPE WITH A DOT INSIDE;So;0;ON;;;;;N;;;;;
+1F4A1;ELECTRIC LIGHT BULB;So;0;ON;;;;;N;;;;;
+1F4A2;ANGER SYMBOL;So;0;ON;;;;;N;;;;;
+1F4A3;BOMB;So;0;ON;;;;;N;;;;;
+1F4A4;SLEEPING SYMBOL;So;0;ON;;;;;N;;;;;
+1F4A5;COLLISION SYMBOL;So;0;ON;;;;;N;;;;;
+1F4A6;SPLASHING SWEAT SYMBOL;So;0;ON;;;;;N;;;;;
+1F4A7;DROPLET;So;0;ON;;;;;N;;;;;
+1F4A8;DASH SYMBOL;So;0;ON;;;;;N;;;;;
+1F4A9;PILE OF POO;So;0;ON;;;;;N;;;;;
+1F4AA;FLEXED BICEPS;So;0;ON;;;;;N;;;;;
+1F4AB;DIZZY SYMBOL;So;0;ON;;;;;N;;;;;
+1F4AC;SPEECH BALLOON;So;0;ON;;;;;N;;;;;
+1F4AD;THOUGHT BALLOON;So;0;ON;;;;;N;;;;;
+1F4AE;WHITE FLOWER;So;0;ON;;;;;N;;;;;
+1F4AF;HUNDRED POINTS SYMBOL;So;0;ON;;;;;N;;;;;
+1F4B0;MONEY BAG;So;0;ON;;;;;N;;;;;
+1F4B1;CURRENCY EXCHANGE;So;0;ON;;;;;N;;;;;
+1F4B2;HEAVY DOLLAR SIGN;So;0;ON;;;;;N;;;;;
+1F4B3;CREDIT CARD;So;0;ON;;;;;N;;;;;
+1F4B4;BANKNOTE WITH YEN SIGN;So;0;ON;;;;;N;;;;;
+1F4B5;BANKNOTE WITH DOLLAR SIGN;So;0;ON;;;;;N;;;;;
+1F4B6;BANKNOTE WITH EURO SIGN;So;0;ON;;;;;N;;;;;
+1F4B7;BANKNOTE WITH POUND SIGN;So;0;ON;;;;;N;;;;;
+1F4B8;MONEY WITH WINGS;So;0;ON;;;;;N;;;;;
+1F4B9;CHART WITH UPWARDS TREND AND YEN SIGN;So;0;ON;;;;;N;;;;;
+1F4BA;SEAT;So;0;ON;;;;;N;;;;;
+1F4BB;PERSONAL COMPUTER;So;0;ON;;;;;N;;;;;
+1F4BC;BRIEFCASE;So;0;ON;;;;;N;;;;;
+1F4BD;MINIDISC;So;0;ON;;;;;N;;;;;
+1F4BE;FLOPPY DISK;So;0;ON;;;;;N;;;;;
+1F4BF;OPTICAL DISC;So;0;ON;;;;;N;;;;;
+1F4C0;DVD;So;0;ON;;;;;N;;;;;
+1F4C1;FILE FOLDER;So;0;ON;;;;;N;;;;;
+1F4C2;OPEN FILE FOLDER;So;0;ON;;;;;N;;;;;
+1F4C3;PAGE WITH CURL;So;0;ON;;;;;N;;;;;
+1F4C4;PAGE FACING UP;So;0;ON;;;;;N;;;;;
+1F4C5;CALENDAR;So;0;ON;;;;;N;;;;;
+1F4C6;TEAR-OFF CALENDAR;So;0;ON;;;;;N;;;;;
+1F4C7;CARD INDEX;So;0;ON;;;;;N;;;;;
+1F4C8;CHART WITH UPWARDS TREND;So;0;ON;;;;;N;;;;;
+1F4C9;CHART WITH DOWNWARDS TREND;So;0;ON;;;;;N;;;;;
+1F4CA;BAR CHART;So;0;ON;;;;;N;;;;;
+1F4CB;CLIPBOARD;So;0;ON;;;;;N;;;;;
+1F4CC;PUSHPIN;So;0;ON;;;;;N;;;;;
+1F4CD;ROUND PUSHPIN;So;0;ON;;;;;N;;;;;
+1F4CE;PAPERCLIP;So;0;ON;;;;;N;;;;;
+1F4CF;STRAIGHT RULER;So;0;ON;;;;;N;;;;;
+1F4D0;TRIANGULAR RULER;So;0;ON;;;;;N;;;;;
+1F4D1;BOOKMARK TABS;So;0;ON;;;;;N;;;;;
+1F4D2;LEDGER;So;0;ON;;;;;N;;;;;
+1F4D3;NOTEBOOK;So;0;ON;;;;;N;;;;;
+1F4D4;NOTEBOOK WITH DECORATIVE COVER;So;0;ON;;;;;N;;;;;
+1F4D5;CLOSED BOOK;So;0;ON;;;;;N;;;;;
+1F4D6;OPEN BOOK;So;0;ON;;;;;N;;;;;
+1F4D7;GREEN BOOK;So;0;ON;;;;;N;;;;;
+1F4D8;BLUE BOOK;So;0;ON;;;;;N;;;;;
+1F4D9;ORANGE BOOK;So;0;ON;;;;;N;;;;;
+1F4DA;BOOKS;So;0;ON;;;;;N;;;;;
+1F4DB;NAME BADGE;So;0;ON;;;;;N;;;;;
+1F4DC;SCROLL;So;0;ON;;;;;N;;;;;
+1F4DD;MEMO;So;0;ON;;;;;N;;;;;
+1F4DE;TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;;
+1F4DF;PAGER;So;0;ON;;;;;N;;;;;
+1F4E0;FAX MACHINE;So;0;ON;;;;;N;;;;;
+1F4E1;SATELLITE ANTENNA;So;0;ON;;;;;N;;;;;
+1F4E2;PUBLIC ADDRESS LOUDSPEAKER;So;0;ON;;;;;N;;;;;
+1F4E3;CHEERING MEGAPHONE;So;0;ON;;;;;N;;;;;
+1F4E4;OUTBOX TRAY;So;0;ON;;;;;N;;;;;
+1F4E5;INBOX TRAY;So;0;ON;;;;;N;;;;;
+1F4E6;PACKAGE;So;0;ON;;;;;N;;;;;
+1F4E7;E-MAIL SYMBOL;So;0;ON;;;;;N;;;;;
+1F4E8;INCOMING ENVELOPE;So;0;ON;;;;;N;;;;;
+1F4E9;ENVELOPE WITH DOWNWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;;
+1F4EA;CLOSED MAILBOX WITH LOWERED FLAG;So;0;ON;;;;;N;;;;;
+1F4EB;CLOSED MAILBOX WITH RAISED FLAG;So;0;ON;;;;;N;;;;;
+1F4EC;OPEN MAILBOX WITH RAISED FLAG;So;0;ON;;;;;N;;;;;
+1F4ED;OPEN MAILBOX WITH LOWERED FLAG;So;0;ON;;;;;N;;;;;
+1F4EE;POSTBOX;So;0;ON;;;;;N;;;;;
+1F4EF;POSTAL HORN;So;0;ON;;;;;N;;;;;
+1F4F0;NEWSPAPER;So;0;ON;;;;;N;;;;;
+1F4F1;MOBILE PHONE;So;0;ON;;;;;N;;;;;
+1F4F2;MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT;So;0;ON;;;;;N;;;;;
+1F4F3;VIBRATION MODE;So;0;ON;;;;;N;;;;;
+1F4F4;MOBILE PHONE OFF;So;0;ON;;;;;N;;;;;
+1F4F5;NO MOBILE PHONES;So;0;ON;;;;;N;;;;;
+1F4F6;ANTENNA WITH BARS;So;0;ON;;;;;N;;;;;
+1F4F7;CAMERA;So;0;ON;;;;;N;;;;;
+1F4F8;CAMERA WITH FLASH;So;0;ON;;;;;N;;;;;
+1F4F9;VIDEO CAMERA;So;0;ON;;;;;N;;;;;
+1F4FA;TELEVISION;So;0;ON;;;;;N;;;;;
+1F4FB;RADIO;So;0;ON;;;;;N;;;;;
+1F4FC;VIDEOCASSETTE;So;0;ON;;;;;N;;;;;
+1F4FD;FILM PROJECTOR;So;0;ON;;;;;N;;;;;
+1F4FE;PORTABLE STEREO;So;0;ON;;;;;N;;;;;
+1F4FF;PRAYER BEADS;So;0;ON;;;;;N;;;;;
+1F500;TWISTED RIGHTWARDS ARROWS;So;0;ON;;;;;N;;;;;
+1F501;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;;
+1F502;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY;So;0;ON;;;;;N;;;;;
+1F503;CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;;
+1F504;ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;;
+1F505;LOW BRIGHTNESS SYMBOL;So;0;ON;;;;;N;;;;;
+1F506;HIGH BRIGHTNESS SYMBOL;So;0;ON;;;;;N;;;;;
+1F507;SPEAKER WITH CANCELLATION STROKE;So;0;ON;;;;;N;;;;;
+1F508;SPEAKER;So;0;ON;;;;;N;;;;;
+1F509;SPEAKER WITH ONE SOUND WAVE;So;0;ON;;;;;N;;;;;
+1F50A;SPEAKER WITH THREE SOUND WAVES;So;0;ON;;;;;N;;;;;
+1F50B;BATTERY;So;0;ON;;;;;N;;;;;
+1F50C;ELECTRIC PLUG;So;0;ON;;;;;N;;;;;
+1F50D;LEFT-POINTING MAGNIFYING GLASS;So;0;ON;;;;;N;;;;;
+1F50E;RIGHT-POINTING MAGNIFYING GLASS;So;0;ON;;;;;N;;;;;
+1F50F;LOCK WITH INK PEN;So;0;ON;;;;;N;;;;;
+1F510;CLOSED LOCK WITH KEY;So;0;ON;;;;;N;;;;;
+1F511;KEY;So;0;ON;;;;;N;;;;;
+1F512;LOCK;So;0;ON;;;;;N;;;;;
+1F513;OPEN LOCK;So;0;ON;;;;;N;;;;;
+1F514;BELL;So;0;ON;;;;;N;;;;;
+1F515;BELL WITH CANCELLATION STROKE;So;0;ON;;;;;N;;;;;
+1F516;BOOKMARK;So;0;ON;;;;;N;;;;;
+1F517;LINK SYMBOL;So;0;ON;;;;;N;;;;;
+1F518;RADIO BUTTON;So;0;ON;;;;;N;;;;;
+1F519;BACK WITH LEFTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;;
+1F51A;END WITH LEFTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;;
+1F51B;ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE;So;0;ON;;;;;N;;;;;
+1F51C;SOON WITH RIGHTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;;
+1F51D;TOP WITH UPWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;;
+1F51E;NO ONE UNDER EIGHTEEN SYMBOL;So;0;ON;;;;;N;;;;;
+1F51F;KEYCAP TEN;So;0;ON;;;;;N;;;;;
+1F520;INPUT SYMBOL FOR LATIN CAPITAL LETTERS;So;0;ON;;;;;N;;;;;
+1F521;INPUT SYMBOL FOR LATIN SMALL LETTERS;So;0;ON;;;;;N;;;;;
+1F522;INPUT SYMBOL FOR NUMBERS;So;0;ON;;;;;N;;;;;
+1F523;INPUT SYMBOL FOR SYMBOLS;So;0;ON;;;;;N;;;;;
+1F524;INPUT SYMBOL FOR LATIN LETTERS;So;0;ON;;;;;N;;;;;
+1F525;FIRE;So;0;ON;;;;;N;;;;;
+1F526;ELECTRIC TORCH;So;0;ON;;;;;N;;;;;
+1F527;WRENCH;So;0;ON;;;;;N;;;;;
+1F528;HAMMER;So;0;ON;;;;;N;;;;;
+1F529;NUT AND BOLT;So;0;ON;;;;;N;;;;;
+1F52A;HOCHO;So;0;ON;;;;;N;;;;;
+1F52B;PISTOL;So;0;ON;;;;;N;;;;;
+1F52C;MICROSCOPE;So;0;ON;;;;;N;;;;;
+1F52D;TELESCOPE;So;0;ON;;;;;N;;;;;
+1F52E;CRYSTAL BALL;So;0;ON;;;;;N;;;;;
+1F52F;SIX POINTED STAR WITH MIDDLE DOT;So;0;ON;;;;;N;;;;;
+1F530;JAPANESE SYMBOL FOR BEGINNER;So;0;ON;;;;;N;;;;;
+1F531;TRIDENT EMBLEM;So;0;ON;;;;;N;;;;;
+1F532;BLACK SQUARE BUTTON;So;0;ON;;;;;N;;;;;
+1F533;WHITE SQUARE BUTTON;So;0;ON;;;;;N;;;;;
+1F534;LARGE RED CIRCLE;So;0;ON;;;;;N;;;;;
+1F535;LARGE BLUE CIRCLE;So;0;ON;;;;;N;;;;;
+1F536;LARGE ORANGE DIAMOND;So;0;ON;;;;;N;;;;;
+1F537;LARGE BLUE DIAMOND;So;0;ON;;;;;N;;;;;
+1F538;SMALL ORANGE DIAMOND;So;0;ON;;;;;N;;;;;
+1F539;SMALL BLUE DIAMOND;So;0;ON;;;;;N;;;;;
+1F53A;UP-POINTING RED TRIANGLE;So;0;ON;;;;;N;;;;;
+1F53B;DOWN-POINTING RED TRIANGLE;So;0;ON;;;;;N;;;;;
+1F53C;UP-POINTING SMALL RED TRIANGLE;So;0;ON;;;;;N;;;;;
+1F53D;DOWN-POINTING SMALL RED TRIANGLE;So;0;ON;;;;;N;;;;;
+1F53E;LOWER RIGHT SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+1F53F;UPPER RIGHT SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+1F540;CIRCLED CROSS POMMEE;So;0;ON;;;;;N;;;;;
+1F541;CROSS POMMEE WITH HALF-CIRCLE BELOW;So;0;ON;;;;;N;;;;;
+1F542;CROSS POMMEE;So;0;ON;;;;;N;;;;;
+1F543;NOTCHED LEFT SEMICIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;;
+1F544;NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;;
+1F545;SYMBOL FOR MARKS CHAPTER;So;0;ON;;;;;N;;;;;
+1F546;WHITE LATIN CROSS;So;0;ON;;;;;N;;;;;
+1F547;HEAVY LATIN CROSS;So;0;ON;;;;;N;;;;;
+1F548;CELTIC CROSS;So;0;ON;;;;;N;;;;;
+1F549;OM SYMBOL;So;0;ON;;;;;N;;;;;
+1F54A;DOVE OF PEACE;So;0;ON;;;;;N;;;;;
+1F54B;KAABA;So;0;ON;;;;;N;;;;;
+1F54C;MOSQUE;So;0;ON;;;;;N;;;;;
+1F54D;SYNAGOGUE;So;0;ON;;;;;N;;;;;
+1F54E;MENORAH WITH NINE BRANCHES;So;0;ON;;;;;N;;;;;
+1F54F;BOWL OF HYGIEIA;So;0;ON;;;;;N;;;;;
+1F550;CLOCK FACE ONE OCLOCK;So;0;ON;;;;;N;;;;;
+1F551;CLOCK FACE TWO OCLOCK;So;0;ON;;;;;N;;;;;
+1F552;CLOCK FACE THREE OCLOCK;So;0;ON;;;;;N;;;;;
+1F553;CLOCK FACE FOUR OCLOCK;So;0;ON;;;;;N;;;;;
+1F554;CLOCK FACE FIVE OCLOCK;So;0;ON;;;;;N;;;;;
+1F555;CLOCK FACE SIX OCLOCK;So;0;ON;;;;;N;;;;;
+1F556;CLOCK FACE SEVEN OCLOCK;So;0;ON;;;;;N;;;;;
+1F557;CLOCK FACE EIGHT OCLOCK;So;0;ON;;;;;N;;;;;
+1F558;CLOCK FACE NINE OCLOCK;So;0;ON;;;;;N;;;;;
+1F559;CLOCK FACE TEN OCLOCK;So;0;ON;;;;;N;;;;;
+1F55A;CLOCK FACE ELEVEN OCLOCK;So;0;ON;;;;;N;;;;;
+1F55B;CLOCK FACE TWELVE OCLOCK;So;0;ON;;;;;N;;;;;
+1F55C;CLOCK FACE ONE-THIRTY;So;0;ON;;;;;N;;;;;
+1F55D;CLOCK FACE TWO-THIRTY;So;0;ON;;;;;N;;;;;
+1F55E;CLOCK FACE THREE-THIRTY;So;0;ON;;;;;N;;;;;
+1F55F;CLOCK FACE FOUR-THIRTY;So;0;ON;;;;;N;;;;;
+1F560;CLOCK FACE FIVE-THIRTY;So;0;ON;;;;;N;;;;;
+1F561;CLOCK FACE SIX-THIRTY;So;0;ON;;;;;N;;;;;
+1F562;CLOCK FACE SEVEN-THIRTY;So;0;ON;;;;;N;;;;;
+1F563;CLOCK FACE EIGHT-THIRTY;So;0;ON;;;;;N;;;;;
+1F564;CLOCK FACE NINE-THIRTY;So;0;ON;;;;;N;;;;;
+1F565;CLOCK FACE TEN-THIRTY;So;0;ON;;;;;N;;;;;
+1F566;CLOCK FACE ELEVEN-THIRTY;So;0;ON;;;;;N;;;;;
+1F567;CLOCK FACE TWELVE-THIRTY;So;0;ON;;;;;N;;;;;
+1F568;RIGHT SPEAKER;So;0;ON;;;;;N;;;;;
+1F569;RIGHT SPEAKER WITH ONE SOUND WAVE;So;0;ON;;;;;N;;;;;
+1F56A;RIGHT SPEAKER WITH THREE SOUND WAVES;So;0;ON;;;;;N;;;;;
+1F56B;BULLHORN;So;0;ON;;;;;N;;;;;
+1F56C;BULLHORN WITH SOUND WAVES;So;0;ON;;;;;N;;;;;
+1F56D;RINGING BELL;So;0;ON;;;;;N;;;;;
+1F56E;BOOK;So;0;ON;;;;;N;;;;;
+1F56F;CANDLE;So;0;ON;;;;;N;;;;;
+1F570;MANTELPIECE CLOCK;So;0;ON;;;;;N;;;;;
+1F571;BLACK SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;;
+1F572;NO PIRACY;So;0;ON;;;;;N;;;;;
+1F573;HOLE;So;0;ON;;;;;N;;;;;
+1F574;MAN IN BUSINESS SUIT LEVITATING;So;0;ON;;;;;N;;;;;
+1F575;SLEUTH OR SPY;So;0;ON;;;;;N;;;;;
+1F576;DARK SUNGLASSES;So;0;ON;;;;;N;;;;;
+1F577;SPIDER;So;0;ON;;;;;N;;;;;
+1F578;SPIDER WEB;So;0;ON;;;;;N;;;;;
+1F579;JOYSTICK;So;0;ON;;;;;N;;;;;
+1F57A;MAN DANCING;So;0;ON;;;;;N;;;;;
+1F57B;LEFT HAND TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;;
+1F57C;TELEPHONE RECEIVER WITH PAGE;So;0;ON;;;;;N;;;;;
+1F57D;RIGHT HAND TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;;
+1F57E;WHITE TOUCHTONE TELEPHONE;So;0;ON;;;;;N;;;;;
+1F57F;BLACK TOUCHTONE TELEPHONE;So;0;ON;;;;;N;;;;;
+1F580;TELEPHONE ON TOP OF MODEM;So;0;ON;;;;;N;;;;;
+1F581;CLAMSHELL MOBILE PHONE;So;0;ON;;;;;N;;;;;
+1F582;BACK OF ENVELOPE;So;0;ON;;;;;N;;;;;
+1F583;STAMPED ENVELOPE;So;0;ON;;;;;N;;;;;
+1F584;ENVELOPE WITH LIGHTNING;So;0;ON;;;;;N;;;;;
+1F585;FLYING ENVELOPE;So;0;ON;;;;;N;;;;;
+1F586;PEN OVER STAMPED ENVELOPE;So;0;ON;;;;;N;;;;;
+1F587;LINKED PAPERCLIPS;So;0;ON;;;;;N;;;;;
+1F588;BLACK PUSHPIN;So;0;ON;;;;;N;;;;;
+1F589;LOWER LEFT PENCIL;So;0;ON;;;;;N;;;;;
+1F58A;LOWER LEFT BALLPOINT PEN;So;0;ON;;;;;N;;;;;
+1F58B;LOWER LEFT FOUNTAIN PEN;So;0;ON;;;;;N;;;;;
+1F58C;LOWER LEFT PAINTBRUSH;So;0;ON;;;;;N;;;;;
+1F58D;LOWER LEFT CRAYON;So;0;ON;;;;;N;;;;;
+1F58E;LEFT WRITING HAND;So;0;ON;;;;;N;;;;;
+1F58F;TURNED OK HAND SIGN;So;0;ON;;;;;N;;;;;
+1F590;RAISED HAND WITH FINGERS SPLAYED;So;0;ON;;;;;N;;;;;
+1F591;REVERSED RAISED HAND WITH FINGERS SPLAYED;So;0;ON;;;;;N;;;;;
+1F592;REVERSED THUMBS UP SIGN;So;0;ON;;;;;N;;;;;
+1F593;REVERSED THUMBS DOWN SIGN;So;0;ON;;;;;N;;;;;
+1F594;REVERSED VICTORY HAND;So;0;ON;;;;;N;;;;;
+1F595;REVERSED HAND WITH MIDDLE FINGER EXTENDED;So;0;ON;;;;;N;;;;;
+1F596;RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS;So;0;ON;;;;;N;;;;;
+1F597;WHITE DOWN POINTING LEFT HAND INDEX;So;0;ON;;;;;N;;;;;
+1F598;SIDEWAYS WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;;
+1F599;SIDEWAYS WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;;
+1F59A;SIDEWAYS BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;;
+1F59B;SIDEWAYS BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;;
+1F59C;BLACK LEFT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;;
+1F59D;BLACK RIGHT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;;
+1F59E;SIDEWAYS WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;;
+1F59F;SIDEWAYS WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;;
+1F5A0;SIDEWAYS BLACK UP POINTING INDEX;So;0;ON;;;;;N;;;;;
+1F5A1;SIDEWAYS BLACK DOWN POINTING INDEX;So;0;ON;;;;;N;;;;;
+1F5A2;BLACK UP POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;;
+1F5A3;BLACK DOWN POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;;
+1F5A4;BLACK HEART;So;0;ON;;;;;N;;;;;
+1F5A5;DESKTOP COMPUTER;So;0;ON;;;;;N;;;;;
+1F5A6;KEYBOARD AND MOUSE;So;0;ON;;;;;N;;;;;
+1F5A7;THREE NETWORKED COMPUTERS;So;0;ON;;;;;N;;;;;
+1F5A8;PRINTER;So;0;ON;;;;;N;;;;;
+1F5A9;POCKET CALCULATOR;So;0;ON;;;;;N;;;;;
+1F5AA;BLACK HARD SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;;
+1F5AB;WHITE HARD SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;;
+1F5AC;SOFT SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;;
+1F5AD;TAPE CARTRIDGE;So;0;ON;;;;;N;;;;;
+1F5AE;WIRED KEYBOARD;So;0;ON;;;;;N;;;;;
+1F5AF;ONE BUTTON MOUSE;So;0;ON;;;;;N;;;;;
+1F5B0;TWO BUTTON MOUSE;So;0;ON;;;;;N;;;;;
+1F5B1;THREE BUTTON MOUSE;So;0;ON;;;;;N;;;;;
+1F5B2;TRACKBALL;So;0;ON;;;;;N;;;;;
+1F5B3;OLD PERSONAL COMPUTER;So;0;ON;;;;;N;;;;;
+1F5B4;HARD DISK;So;0;ON;;;;;N;;;;;
+1F5B5;SCREEN;So;0;ON;;;;;N;;;;;
+1F5B6;PRINTER ICON;So;0;ON;;;;;N;;;;;
+1F5B7;FAX ICON;So;0;ON;;;;;N;;;;;
+1F5B8;OPTICAL DISC ICON;So;0;ON;;;;;N;;;;;
+1F5B9;DOCUMENT WITH TEXT;So;0;ON;;;;;N;;;;;
+1F5BA;DOCUMENT WITH TEXT AND PICTURE;So;0;ON;;;;;N;;;;;
+1F5BB;DOCUMENT WITH PICTURE;So;0;ON;;;;;N;;;;;
+1F5BC;FRAME WITH PICTURE;So;0;ON;;;;;N;;;;;
+1F5BD;FRAME WITH TILES;So;0;ON;;;;;N;;;;;
+1F5BE;FRAME WITH AN X;So;0;ON;;;;;N;;;;;
+1F5BF;BLACK FOLDER;So;0;ON;;;;;N;;;;;
+1F5C0;FOLDER;So;0;ON;;;;;N;;;;;
+1F5C1;OPEN FOLDER;So;0;ON;;;;;N;;;;;
+1F5C2;CARD INDEX DIVIDERS;So;0;ON;;;;;N;;;;;
+1F5C3;CARD FILE BOX;So;0;ON;;;;;N;;;;;
+1F5C4;FILE CABINET;So;0;ON;;;;;N;;;;;
+1F5C5;EMPTY NOTE;So;0;ON;;;;;N;;;;;
+1F5C6;EMPTY NOTE PAGE;So;0;ON;;;;;N;;;;;
+1F5C7;EMPTY NOTE PAD;So;0;ON;;;;;N;;;;;
+1F5C8;NOTE;So;0;ON;;;;;N;;;;;
+1F5C9;NOTE PAGE;So;0;ON;;;;;N;;;;;
+1F5CA;NOTE PAD;So;0;ON;;;;;N;;;;;
+1F5CB;EMPTY DOCUMENT;So;0;ON;;;;;N;;;;;
+1F5CC;EMPTY PAGE;So;0;ON;;;;;N;;;;;
+1F5CD;EMPTY PAGES;So;0;ON;;;;;N;;;;;
+1F5CE;DOCUMENT;So;0;ON;;;;;N;;;;;
+1F5CF;PAGE;So;0;ON;;;;;N;;;;;
+1F5D0;PAGES;So;0;ON;;;;;N;;;;;
+1F5D1;WASTEBASKET;So;0;ON;;;;;N;;;;;
+1F5D2;SPIRAL NOTE PAD;So;0;ON;;;;;N;;;;;
+1F5D3;SPIRAL CALENDAR PAD;So;0;ON;;;;;N;;;;;
+1F5D4;DESKTOP WINDOW;So;0;ON;;;;;N;;;;;
+1F5D5;MINIMIZE;So;0;ON;;;;;N;;;;;
+1F5D6;MAXIMIZE;So;0;ON;;;;;N;;;;;
+1F5D7;OVERLAP;So;0;ON;;;;;N;;;;;
+1F5D8;CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS;So;0;ON;;;;;N;;;;;
+1F5D9;CANCELLATION X;So;0;ON;;;;;N;;;;;
+1F5DA;INCREASE FONT SIZE SYMBOL;So;0;ON;;;;;N;;;;;
+1F5DB;DECREASE FONT SIZE SYMBOL;So;0;ON;;;;;N;;;;;
+1F5DC;COMPRESSION;So;0;ON;;;;;N;;;;;
+1F5DD;OLD KEY;So;0;ON;;;;;N;;;;;
+1F5DE;ROLLED-UP NEWSPAPER;So;0;ON;;;;;N;;;;;
+1F5DF;PAGE WITH CIRCLED TEXT;So;0;ON;;;;;N;;;;;
+1F5E0;STOCK CHART;So;0;ON;;;;;N;;;;;
+1F5E1;DAGGER KNIFE;So;0;ON;;;;;N;;;;;
+1F5E2;LIPS;So;0;ON;;;;;N;;;;;
+1F5E3;SPEAKING HEAD IN SILHOUETTE;So;0;ON;;;;;N;;;;;
+1F5E4;THREE RAYS ABOVE;So;0;ON;;;;;N;;;;;
+1F5E5;THREE RAYS BELOW;So;0;ON;;;;;N;;;;;
+1F5E6;THREE RAYS LEFT;So;0;ON;;;;;N;;;;;
+1F5E7;THREE RAYS RIGHT;So;0;ON;;;;;N;;;;;
+1F5E8;LEFT SPEECH BUBBLE;So;0;ON;;;;;N;;;;;
+1F5E9;RIGHT SPEECH BUBBLE;So;0;ON;;;;;N;;;;;
+1F5EA;TWO SPEECH BUBBLES;So;0;ON;;;;;N;;;;;
+1F5EB;THREE SPEECH BUBBLES;So;0;ON;;;;;N;;;;;
+1F5EC;LEFT THOUGHT BUBBLE;So;0;ON;;;;;N;;;;;
+1F5ED;RIGHT THOUGHT BUBBLE;So;0;ON;;;;;N;;;;;
+1F5EE;LEFT ANGER BUBBLE;So;0;ON;;;;;N;;;;;
+1F5EF;RIGHT ANGER BUBBLE;So;0;ON;;;;;N;;;;;
+1F5F0;MOOD BUBBLE;So;0;ON;;;;;N;;;;;
+1F5F1;LIGHTNING MOOD BUBBLE;So;0;ON;;;;;N;;;;;
+1F5F2;LIGHTNING MOOD;So;0;ON;;;;;N;;;;;
+1F5F3;BALLOT BOX WITH BALLOT;So;0;ON;;;;;N;;;;;
+1F5F4;BALLOT SCRIPT X;So;0;ON;;;;;N;;;;;
+1F5F5;BALLOT BOX WITH SCRIPT X;So;0;ON;;;;;N;;;;;
+1F5F6;BALLOT BOLD SCRIPT X;So;0;ON;;;;;N;;;;;
+1F5F7;BALLOT BOX WITH BOLD SCRIPT X;So;0;ON;;;;;N;;;;;
+1F5F8;LIGHT CHECK MARK;So;0;ON;;;;;N;;;;;
+1F5F9;BALLOT BOX WITH BOLD CHECK;So;0;ON;;;;;N;;;;;
+1F5FA;WORLD MAP;So;0;ON;;;;;N;;;;;
+1F5FB;MOUNT FUJI;So;0;ON;;;;;N;;;;;
+1F5FC;TOKYO TOWER;So;0;ON;;;;;N;;;;;
+1F5FD;STATUE OF LIBERTY;So;0;ON;;;;;N;;;;;
+1F5FE;SILHOUETTE OF JAPAN;So;0;ON;;;;;N;;;;;
+1F5FF;MOYAI;So;0;ON;;;;;N;;;;;
+1F600;GRINNING FACE;So;0;ON;;;;;N;;;;;
+1F601;GRINNING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;;
+1F602;FACE WITH TEARS OF JOY;So;0;ON;;;;;N;;;;;
+1F603;SMILING FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;;
+1F604;SMILING FACE WITH OPEN MOUTH AND SMILING EYES;So;0;ON;;;;;N;;;;;
+1F605;SMILING FACE WITH OPEN MOUTH AND COLD SWEAT;So;0;ON;;;;;N;;;;;
+1F606;SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES;So;0;ON;;;;;N;;;;;
+1F607;SMILING FACE WITH HALO;So;0;ON;;;;;N;;;;;
+1F608;SMILING FACE WITH HORNS;So;0;ON;;;;;N;;;;;
+1F609;WINKING FACE;So;0;ON;;;;;N;;;;;
+1F60A;SMILING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;;
+1F60B;FACE SAVOURING DELICIOUS FOOD;So;0;ON;;;;;N;;;;;
+1F60C;RELIEVED FACE;So;0;ON;;;;;N;;;;;
+1F60D;SMILING FACE WITH HEART-SHAPED EYES;So;0;ON;;;;;N;;;;;
+1F60E;SMILING FACE WITH SUNGLASSES;So;0;ON;;;;;N;;;;;
+1F60F;SMIRKING FACE;So;0;ON;;;;;N;;;;;
+1F610;NEUTRAL FACE;So;0;ON;;;;;N;;;;;
+1F611;EXPRESSIONLESS FACE;So;0;ON;;;;;N;;;;;
+1F612;UNAMUSED FACE;So;0;ON;;;;;N;;;;;
+1F613;FACE WITH COLD SWEAT;So;0;ON;;;;;N;;;;;
+1F614;PENSIVE FACE;So;0;ON;;;;;N;;;;;
+1F615;CONFUSED FACE;So;0;ON;;;;;N;;;;;
+1F616;CONFOUNDED FACE;So;0;ON;;;;;N;;;;;
+1F617;KISSING FACE;So;0;ON;;;;;N;;;;;
+1F618;FACE THROWING A KISS;So;0;ON;;;;;N;;;;;
+1F619;KISSING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;;
+1F61A;KISSING FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;;
+1F61B;FACE WITH STUCK-OUT TONGUE;So;0;ON;;;;;N;;;;;
+1F61C;FACE WITH STUCK-OUT TONGUE AND WINKING EYE;So;0;ON;;;;;N;;;;;
+1F61D;FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES;So;0;ON;;;;;N;;;;;
+1F61E;DISAPPOINTED FACE;So;0;ON;;;;;N;;;;;
+1F61F;WORRIED FACE;So;0;ON;;;;;N;;;;;
+1F620;ANGRY FACE;So;0;ON;;;;;N;;;;;
+1F621;POUTING FACE;So;0;ON;;;;;N;;;;;
+1F622;CRYING FACE;So;0;ON;;;;;N;;;;;
+1F623;PERSEVERING FACE;So;0;ON;;;;;N;;;;;
+1F624;FACE WITH LOOK OF TRIUMPH;So;0;ON;;;;;N;;;;;
+1F625;DISAPPOINTED BUT RELIEVED FACE;So;0;ON;;;;;N;;;;;
+1F626;FROWNING FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;;
+1F627;ANGUISHED FACE;So;0;ON;;;;;N;;;;;
+1F628;FEARFUL FACE;So;0;ON;;;;;N;;;;;
+1F629;WEARY FACE;So;0;ON;;;;;N;;;;;
+1F62A;SLEEPY FACE;So;0;ON;;;;;N;;;;;
+1F62B;TIRED FACE;So;0;ON;;;;;N;;;;;
+1F62C;GRIMACING FACE;So;0;ON;;;;;N;;;;;
+1F62D;LOUDLY CRYING FACE;So;0;ON;;;;;N;;;;;
+1F62E;FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;;
+1F62F;HUSHED FACE;So;0;ON;;;;;N;;;;;
+1F630;FACE WITH OPEN MOUTH AND COLD SWEAT;So;0;ON;;;;;N;;;;;
+1F631;FACE SCREAMING IN FEAR;So;0;ON;;;;;N;;;;;
+1F632;ASTONISHED FACE;So;0;ON;;;;;N;;;;;
+1F633;FLUSHED FACE;So;0;ON;;;;;N;;;;;
+1F634;SLEEPING FACE;So;0;ON;;;;;N;;;;;
+1F635;DIZZY FACE;So;0;ON;;;;;N;;;;;
+1F636;FACE WITHOUT MOUTH;So;0;ON;;;;;N;;;;;
+1F637;FACE WITH MEDICAL MASK;So;0;ON;;;;;N;;;;;
+1F638;GRINNING CAT FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;;
+1F639;CAT FACE WITH TEARS OF JOY;So;0;ON;;;;;N;;;;;
+1F63A;SMILING CAT FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;;
+1F63B;SMILING CAT FACE WITH HEART-SHAPED EYES;So;0;ON;;;;;N;;;;;
+1F63C;CAT FACE WITH WRY SMILE;So;0;ON;;;;;N;;;;;
+1F63D;KISSING CAT FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;;
+1F63E;POUTING CAT FACE;So;0;ON;;;;;N;;;;;
+1F63F;CRYING CAT FACE;So;0;ON;;;;;N;;;;;
+1F640;WEARY CAT FACE;So;0;ON;;;;;N;;;;;
+1F641;SLIGHTLY FROWNING FACE;So;0;ON;;;;;N;;;;;
+1F642;SLIGHTLY SMILING FACE;So;0;ON;;;;;N;;;;;
+1F643;UPSIDE-DOWN FACE;So;0;ON;;;;;N;;;;;
+1F644;FACE WITH ROLLING EYES;So;0;ON;;;;;N;;;;;
+1F645;FACE WITH NO GOOD GESTURE;So;0;ON;;;;;N;;;;;
+1F646;FACE WITH OK GESTURE;So;0;ON;;;;;N;;;;;
+1F647;PERSON BOWING DEEPLY;So;0;ON;;;;;N;;;;;
+1F648;SEE-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;;
+1F649;HEAR-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;;
+1F64A;SPEAK-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;;
+1F64B;HAPPY PERSON RAISING ONE HAND;So;0;ON;;;;;N;;;;;
+1F64C;PERSON RAISING BOTH HANDS IN CELEBRATION;So;0;ON;;;;;N;;;;;
+1F64D;PERSON FROWNING;So;0;ON;;;;;N;;;;;
+1F64E;PERSON WITH POUTING FACE;So;0;ON;;;;;N;;;;;
+1F64F;PERSON WITH FOLDED HANDS;So;0;ON;;;;;N;;;;;
+1F650;NORTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;;
+1F651;SOUTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;;
+1F652;NORTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;;
+1F653;SOUTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;;
+1F654;TURNED NORTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;;
+1F655;TURNED SOUTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;;
+1F656;TURNED NORTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;;
+1F657;TURNED SOUTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;;
+1F658;NORTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;;
+1F659;SOUTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;;
+1F65A;NORTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;;
+1F65B;SOUTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;;
+1F65C;HEAVY NORTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;;
+1F65D;HEAVY SOUTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;;
+1F65E;HEAVY NORTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;;
+1F65F;HEAVY SOUTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;;
+1F660;NORTH WEST POINTING BUD;So;0;ON;;;;;N;;;;;
+1F661;SOUTH WEST POINTING BUD;So;0;ON;;;;;N;;;;;
+1F662;NORTH EAST POINTING BUD;So;0;ON;;;;;N;;;;;
+1F663;SOUTH EAST POINTING BUD;So;0;ON;;;;;N;;;;;
+1F664;HEAVY NORTH WEST POINTING BUD;So;0;ON;;;;;N;;;;;
+1F665;HEAVY SOUTH WEST POINTING BUD;So;0;ON;;;;;N;;;;;
+1F666;HEAVY NORTH EAST POINTING BUD;So;0;ON;;;;;N;;;;;
+1F667;HEAVY SOUTH EAST POINTING BUD;So;0;ON;;;;;N;;;;;
+1F668;HOLLOW QUILT SQUARE ORNAMENT;So;0;ON;;;;;N;;;;;
+1F669;HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE;So;0;ON;;;;;N;;;;;
+1F66A;SOLID QUILT SQUARE ORNAMENT;So;0;ON;;;;;N;;;;;
+1F66B;SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE;So;0;ON;;;;;N;;;;;
+1F66C;LEFTWARDS ROCKET;So;0;ON;;;;;N;;;;;
+1F66D;UPWARDS ROCKET;So;0;ON;;;;;N;;;;;
+1F66E;RIGHTWARDS ROCKET;So;0;ON;;;;;N;;;;;
+1F66F;DOWNWARDS ROCKET;So;0;ON;;;;;N;;;;;
+1F670;SCRIPT LIGATURE ET ORNAMENT;So;0;ON;;;;;N;;;;;
+1F671;HEAVY SCRIPT LIGATURE ET ORNAMENT;So;0;ON;;;;;N;;;;;
+1F672;LIGATURE OPEN ET ORNAMENT;So;0;ON;;;;;N;;;;;
+1F673;HEAVY LIGATURE OPEN ET ORNAMENT;So;0;ON;;;;;N;;;;;
+1F674;HEAVY AMPERSAND ORNAMENT;So;0;ON;;;;;N;;;;;
+1F675;SWASH AMPERSAND ORNAMENT;So;0;ON;;;;;N;;;;;
+1F676;SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+1F677;SANS-SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+1F678;SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+1F679;HEAVY INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;;
+1F67A;SANS-SERIF INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;;
+1F67B;HEAVY SANS-SERIF INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;;
+1F67C;VERY HEAVY SOLIDUS;So;0;ON;;;;;N;;;;;
+1F67D;VERY HEAVY REVERSE SOLIDUS;So;0;ON;;;;;N;;;;;
+1F67E;CHECKER BOARD;So;0;ON;;;;;N;;;;;
+1F67F;REVERSE CHECKER BOARD;So;0;ON;;;;;N;;;;;
+1F680;ROCKET;So;0;ON;;;;;N;;;;;
+1F681;HELICOPTER;So;0;ON;;;;;N;;;;;
+1F682;STEAM LOCOMOTIVE;So;0;ON;;;;;N;;;;;
+1F683;RAILWAY CAR;So;0;ON;;;;;N;;;;;
+1F684;HIGH-SPEED TRAIN;So;0;ON;;;;;N;;;;;
+1F685;HIGH-SPEED TRAIN WITH BULLET NOSE;So;0;ON;;;;;N;;;;;
+1F686;TRAIN;So;0;ON;;;;;N;;;;;
+1F687;METRO;So;0;ON;;;;;N;;;;;
+1F688;LIGHT RAIL;So;0;ON;;;;;N;;;;;
+1F689;STATION;So;0;ON;;;;;N;;;;;
+1F68A;TRAM;So;0;ON;;;;;N;;;;;
+1F68B;TRAM CAR;So;0;ON;;;;;N;;;;;
+1F68C;BUS;So;0;ON;;;;;N;;;;;
+1F68D;ONCOMING BUS;So;0;ON;;;;;N;;;;;
+1F68E;TROLLEYBUS;So;0;ON;;;;;N;;;;;
+1F68F;BUS STOP;So;0;ON;;;;;N;;;;;
+1F690;MINIBUS;So;0;ON;;;;;N;;;;;
+1F691;AMBULANCE;So;0;ON;;;;;N;;;;;
+1F692;FIRE ENGINE;So;0;ON;;;;;N;;;;;
+1F693;POLICE CAR;So;0;ON;;;;;N;;;;;
+1F694;ONCOMING POLICE CAR;So;0;ON;;;;;N;;;;;
+1F695;TAXI;So;0;ON;;;;;N;;;;;
+1F696;ONCOMING TAXI;So;0;ON;;;;;N;;;;;
+1F697;AUTOMOBILE;So;0;ON;;;;;N;;;;;
+1F698;ONCOMING AUTOMOBILE;So;0;ON;;;;;N;;;;;
+1F699;RECREATIONAL VEHICLE;So;0;ON;;;;;N;;;;;
+1F69A;DELIVERY TRUCK;So;0;ON;;;;;N;;;;;
+1F69B;ARTICULATED LORRY;So;0;ON;;;;;N;;;;;
+1F69C;TRACTOR;So;0;ON;;;;;N;;;;;
+1F69D;MONORAIL;So;0;ON;;;;;N;;;;;
+1F69E;MOUNTAIN RAILWAY;So;0;ON;;;;;N;;;;;
+1F69F;SUSPENSION RAILWAY;So;0;ON;;;;;N;;;;;
+1F6A0;MOUNTAIN CABLEWAY;So;0;ON;;;;;N;;;;;
+1F6A1;AERIAL TRAMWAY;So;0;ON;;;;;N;;;;;
+1F6A2;SHIP;So;0;ON;;;;;N;;;;;
+1F6A3;ROWBOAT;So;0;ON;;;;;N;;;;;
+1F6A4;SPEEDBOAT;So;0;ON;;;;;N;;;;;
+1F6A5;HORIZONTAL TRAFFIC LIGHT;So;0;ON;;;;;N;;;;;
+1F6A6;VERTICAL TRAFFIC LIGHT;So;0;ON;;;;;N;;;;;
+1F6A7;CONSTRUCTION SIGN;So;0;ON;;;;;N;;;;;
+1F6A8;POLICE CARS REVOLVING LIGHT;So;0;ON;;;;;N;;;;;
+1F6A9;TRIANGULAR FLAG ON POST;So;0;ON;;;;;N;;;;;
+1F6AA;DOOR;So;0;ON;;;;;N;;;;;
+1F6AB;NO ENTRY SIGN;So;0;ON;;;;;N;;;;;
+1F6AC;SMOKING SYMBOL;So;0;ON;;;;;N;;;;;
+1F6AD;NO SMOKING SYMBOL;So;0;ON;;;;;N;;;;;
+1F6AE;PUT LITTER IN ITS PLACE SYMBOL;So;0;ON;;;;;N;;;;;
+1F6AF;DO NOT LITTER SYMBOL;So;0;ON;;;;;N;;;;;
+1F6B0;POTABLE WATER SYMBOL;So;0;ON;;;;;N;;;;;
+1F6B1;NON-POTABLE WATER SYMBOL;So;0;ON;;;;;N;;;;;
+1F6B2;BICYCLE;So;0;ON;;;;;N;;;;;
+1F6B3;NO BICYCLES;So;0;ON;;;;;N;;;;;
+1F6B4;BICYCLIST;So;0;ON;;;;;N;;;;;
+1F6B5;MOUNTAIN BICYCLIST;So;0;ON;;;;;N;;;;;
+1F6B6;PEDESTRIAN;So;0;ON;;;;;N;;;;;
+1F6B7;NO PEDESTRIANS;So;0;ON;;;;;N;;;;;
+1F6B8;CHILDREN CROSSING;So;0;ON;;;;;N;;;;;
+1F6B9;MENS SYMBOL;So;0;ON;;;;;N;;;;;
+1F6BA;WOMENS SYMBOL;So;0;ON;;;;;N;;;;;
+1F6BB;RESTROOM;So;0;ON;;;;;N;;;;;
+1F6BC;BABY SYMBOL;So;0;ON;;;;;N;;;;;
+1F6BD;TOILET;So;0;ON;;;;;N;;;;;
+1F6BE;WATER CLOSET;So;0;ON;;;;;N;;;;;
+1F6BF;SHOWER;So;0;ON;;;;;N;;;;;
+1F6C0;BATH;So;0;ON;;;;;N;;;;;
+1F6C1;BATHTUB;So;0;ON;;;;;N;;;;;
+1F6C2;PASSPORT CONTROL;So;0;ON;;;;;N;;;;;
+1F6C3;CUSTOMS;So;0;ON;;;;;N;;;;;
+1F6C4;BAGGAGE CLAIM;So;0;ON;;;;;N;;;;;
+1F6C5;LEFT LUGGAGE;So;0;ON;;;;;N;;;;;
+1F6C6;TRIANGLE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;;
+1F6C7;PROHIBITED SIGN;So;0;ON;;;;;N;;;;;
+1F6C8;CIRCLED INFORMATION SOURCE;So;0;ON;;;;;N;;;;;
+1F6C9;BOYS SYMBOL;So;0;ON;;;;;N;;;;;
+1F6CA;GIRLS SYMBOL;So;0;ON;;;;;N;;;;;
+1F6CB;COUCH AND LAMP;So;0;ON;;;;;N;;;;;
+1F6CC;SLEEPING ACCOMMODATION;So;0;ON;;;;;N;;;;;
+1F6CD;SHOPPING BAGS;So;0;ON;;;;;N;;;;;
+1F6CE;BELLHOP BELL;So;0;ON;;;;;N;;;;;
+1F6CF;BED;So;0;ON;;;;;N;;;;;
+1F6D0;PLACE OF WORSHIP;So;0;ON;;;;;N;;;;;
+1F6D1;OCTAGONAL SIGN;So;0;ON;;;;;N;;;;;
+1F6D2;SHOPPING TROLLEY;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;;;;;
+1F6E3;MOTORWAY;So;0;ON;;;;;N;;;;;
+1F6E4;RAILWAY TRACK;So;0;ON;;;;;N;;;;;
+1F6E5;MOTOR BOAT;So;0;ON;;;;;N;;;;;
+1F6E6;UP-POINTING MILITARY AIRPLANE;So;0;ON;;;;;N;;;;;
+1F6E7;UP-POINTING AIRPLANE;So;0;ON;;;;;N;;;;;
+1F6E8;UP-POINTING SMALL AIRPLANE;So;0;ON;;;;;N;;;;;
+1F6E9;SMALL AIRPLANE;So;0;ON;;;;;N;;;;;
+1F6EA;NORTHEAST-POINTING AIRPLANE;So;0;ON;;;;;N;;;;;
+1F6EB;AIRPLANE DEPARTURE;So;0;ON;;;;;N;;;;;
+1F6EC;AIRPLANE ARRIVING;So;0;ON;;;;;N;;;;;
+1F6F0;SATELLITE;So;0;ON;;;;;N;;;;;
+1F6F1;ONCOMING FIRE ENGINE;So;0;ON;;;;;N;;;;;
+1F6F2;DIESEL LOCOMOTIVE;So;0;ON;;;;;N;;;;;
+1F6F3;PASSENGER SHIP;So;0;ON;;;;;N;;;;;
+1F6F4;SCOOTER;So;0;ON;;;;;N;;;;;
+1F6F5;MOTOR SCOOTER;So;0;ON;;;;;N;;;;;
+1F6F6;CANOE;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;;;;;
+1F703;ALCHEMICAL SYMBOL FOR EARTH;So;0;ON;;;;;N;;;;;
+1F704;ALCHEMICAL SYMBOL FOR WATER;So;0;ON;;;;;N;;;;;
+1F705;ALCHEMICAL SYMBOL FOR AQUAFORTIS;So;0;ON;;;;;N;;;;;
+1F706;ALCHEMICAL SYMBOL FOR AQUA REGIA;So;0;ON;;;;;N;;;;;
+1F707;ALCHEMICAL SYMBOL FOR AQUA REGIA-2;So;0;ON;;;;;N;;;;;
+1F708;ALCHEMICAL SYMBOL FOR AQUA VITAE;So;0;ON;;;;;N;;;;;
+1F709;ALCHEMICAL SYMBOL FOR AQUA VITAE-2;So;0;ON;;;;;N;;;;;
+1F70A;ALCHEMICAL SYMBOL FOR VINEGAR;So;0;ON;;;;;N;;;;;
+1F70B;ALCHEMICAL SYMBOL FOR VINEGAR-2;So;0;ON;;;;;N;;;;;
+1F70C;ALCHEMICAL SYMBOL FOR VINEGAR-3;So;0;ON;;;;;N;;;;;
+1F70D;ALCHEMICAL SYMBOL FOR SULFUR;So;0;ON;;;;;N;;;;;
+1F70E;ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR;So;0;ON;;;;;N;;;;;
+1F70F;ALCHEMICAL SYMBOL FOR BLACK SULFUR;So;0;ON;;;;;N;;;;;
+1F710;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE;So;0;ON;;;;;N;;;;;
+1F711;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-2;So;0;ON;;;;;N;;;;;
+1F712;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3;So;0;ON;;;;;N;;;;;
+1F713;ALCHEMICAL SYMBOL FOR CINNABAR;So;0;ON;;;;;N;;;;;
+1F714;ALCHEMICAL SYMBOL FOR SALT;So;0;ON;;;;;N;;;;;
+1F715;ALCHEMICAL SYMBOL FOR NITRE;So;0;ON;;;;;N;;;;;
+1F716;ALCHEMICAL SYMBOL FOR VITRIOL;So;0;ON;;;;;N;;;;;
+1F717;ALCHEMICAL SYMBOL FOR VITRIOL-2;So;0;ON;;;;;N;;;;;
+1F718;ALCHEMICAL SYMBOL FOR ROCK SALT;So;0;ON;;;;;N;;;;;
+1F719;ALCHEMICAL SYMBOL FOR ROCK SALT-2;So;0;ON;;;;;N;;;;;
+1F71A;ALCHEMICAL SYMBOL FOR GOLD;So;0;ON;;;;;N;;;;;
+1F71B;ALCHEMICAL SYMBOL FOR SILVER;So;0;ON;;;;;N;;;;;
+1F71C;ALCHEMICAL SYMBOL FOR IRON ORE;So;0;ON;;;;;N;;;;;
+1F71D;ALCHEMICAL SYMBOL FOR IRON ORE-2;So;0;ON;;;;;N;;;;;
+1F71E;ALCHEMICAL SYMBOL FOR CROCUS OF IRON;So;0;ON;;;;;N;;;;;
+1F71F;ALCHEMICAL SYMBOL FOR REGULUS OF IRON;So;0;ON;;;;;N;;;;;
+1F720;ALCHEMICAL SYMBOL FOR COPPER ORE;So;0;ON;;;;;N;;;;;
+1F721;ALCHEMICAL SYMBOL FOR IRON-COPPER ORE;So;0;ON;;;;;N;;;;;
+1F722;ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER;So;0;ON;;;;;N;;;;;
+1F723;ALCHEMICAL SYMBOL FOR CROCUS OF COPPER;So;0;ON;;;;;N;;;;;
+1F724;ALCHEMICAL SYMBOL FOR CROCUS OF COPPER-2;So;0;ON;;;;;N;;;;;
+1F725;ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE;So;0;ON;;;;;N;;;;;
+1F726;ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE;So;0;ON;;;;;N;;;;;
+1F727;ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER;So;0;ON;;;;;N;;;;;
+1F728;ALCHEMICAL SYMBOL FOR VERDIGRIS;So;0;ON;;;;;N;;;;;
+1F729;ALCHEMICAL SYMBOL FOR TIN ORE;So;0;ON;;;;;N;;;;;
+1F72A;ALCHEMICAL SYMBOL FOR LEAD ORE;So;0;ON;;;;;N;;;;;
+1F72B;ALCHEMICAL SYMBOL FOR ANTIMONY ORE;So;0;ON;;;;;N;;;;;
+1F72C;ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY;So;0;ON;;;;;N;;;;;
+1F72D;ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY;So;0;ON;;;;;N;;;;;
+1F72E;ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY;So;0;ON;;;;;N;;;;;
+1F72F;ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY;So;0;ON;;;;;N;;;;;
+1F730;ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY;So;0;ON;;;;;N;;;;;
+1F731;ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY-2;So;0;ON;;;;;N;;;;;
+1F732;ALCHEMICAL SYMBOL FOR REGULUS;So;0;ON;;;;;N;;;;;
+1F733;ALCHEMICAL SYMBOL FOR REGULUS-2;So;0;ON;;;;;N;;;;;
+1F734;ALCHEMICAL SYMBOL FOR REGULUS-3;So;0;ON;;;;;N;;;;;
+1F735;ALCHEMICAL SYMBOL FOR REGULUS-4;So;0;ON;;;;;N;;;;;
+1F736;ALCHEMICAL SYMBOL FOR ALKALI;So;0;ON;;;;;N;;;;;
+1F737;ALCHEMICAL SYMBOL FOR ALKALI-2;So;0;ON;;;;;N;;;;;
+1F738;ALCHEMICAL SYMBOL FOR MARCASITE;So;0;ON;;;;;N;;;;;
+1F739;ALCHEMICAL SYMBOL FOR SAL-AMMONIAC;So;0;ON;;;;;N;;;;;
+1F73A;ALCHEMICAL SYMBOL FOR ARSENIC;So;0;ON;;;;;N;;;;;
+1F73B;ALCHEMICAL SYMBOL FOR REALGAR;So;0;ON;;;;;N;;;;;
+1F73C;ALCHEMICAL SYMBOL FOR REALGAR-2;So;0;ON;;;;;N;;;;;
+1F73D;ALCHEMICAL SYMBOL FOR AURIPIGMENT;So;0;ON;;;;;N;;;;;
+1F73E;ALCHEMICAL SYMBOL FOR BISMUTH ORE;So;0;ON;;;;;N;;;;;
+1F73F;ALCHEMICAL SYMBOL FOR TARTAR;So;0;ON;;;;;N;;;;;
+1F740;ALCHEMICAL SYMBOL FOR TARTAR-2;So;0;ON;;;;;N;;;;;
+1F741;ALCHEMICAL SYMBOL FOR QUICK LIME;So;0;ON;;;;;N;;;;;
+1F742;ALCHEMICAL SYMBOL FOR BORAX;So;0;ON;;;;;N;;;;;
+1F743;ALCHEMICAL SYMBOL FOR BORAX-2;So;0;ON;;;;;N;;;;;
+1F744;ALCHEMICAL SYMBOL FOR BORAX-3;So;0;ON;;;;;N;;;;;
+1F745;ALCHEMICAL SYMBOL FOR ALUM;So;0;ON;;;;;N;;;;;
+1F746;ALCHEMICAL SYMBOL FOR OIL;So;0;ON;;;;;N;;;;;
+1F747;ALCHEMICAL SYMBOL FOR SPIRIT;So;0;ON;;;;;N;;;;;
+1F748;ALCHEMICAL SYMBOL FOR TINCTURE;So;0;ON;;;;;N;;;;;
+1F749;ALCHEMICAL SYMBOL FOR GUM;So;0;ON;;;;;N;;;;;
+1F74A;ALCHEMICAL SYMBOL FOR WAX;So;0;ON;;;;;N;;;;;
+1F74B;ALCHEMICAL SYMBOL FOR POWDER;So;0;ON;;;;;N;;;;;
+1F74C;ALCHEMICAL SYMBOL FOR CALX;So;0;ON;;;;;N;;;;;
+1F74D;ALCHEMICAL SYMBOL FOR TUTTY;So;0;ON;;;;;N;;;;;
+1F74E;ALCHEMICAL SYMBOL FOR CAPUT MORTUUM;So;0;ON;;;;;N;;;;;
+1F74F;ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE;So;0;ON;;;;;N;;;;;
+1F750;ALCHEMICAL SYMBOL FOR CADUCEUS;So;0;ON;;;;;N;;;;;
+1F751;ALCHEMICAL SYMBOL FOR TRIDENT;So;0;ON;;;;;N;;;;;
+1F752;ALCHEMICAL SYMBOL FOR STARRED TRIDENT;So;0;ON;;;;;N;;;;;
+1F753;ALCHEMICAL SYMBOL FOR LODESTONE;So;0;ON;;;;;N;;;;;
+1F754;ALCHEMICAL SYMBOL FOR SOAP;So;0;ON;;;;;N;;;;;
+1F755;ALCHEMICAL SYMBOL FOR URINE;So;0;ON;;;;;N;;;;;
+1F756;ALCHEMICAL SYMBOL FOR HORSE DUNG;So;0;ON;;;;;N;;;;;
+1F757;ALCHEMICAL SYMBOL FOR ASHES;So;0;ON;;;;;N;;;;;
+1F758;ALCHEMICAL SYMBOL FOR POT ASHES;So;0;ON;;;;;N;;;;;
+1F759;ALCHEMICAL SYMBOL FOR BRICK;So;0;ON;;;;;N;;;;;
+1F75A;ALCHEMICAL SYMBOL FOR POWDERED BRICK;So;0;ON;;;;;N;;;;;
+1F75B;ALCHEMICAL SYMBOL FOR AMALGAM;So;0;ON;;;;;N;;;;;
+1F75C;ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM;So;0;ON;;;;;N;;;;;
+1F75D;ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2;So;0;ON;;;;;N;;;;;
+1F75E;ALCHEMICAL SYMBOL FOR SUBLIMATION;So;0;ON;;;;;N;;;;;
+1F75F;ALCHEMICAL SYMBOL FOR PRECIPITATE;So;0;ON;;;;;N;;;;;
+1F760;ALCHEMICAL SYMBOL FOR DISTILL;So;0;ON;;;;;N;;;;;
+1F761;ALCHEMICAL SYMBOL FOR DISSOLVE;So;0;ON;;;;;N;;;;;
+1F762;ALCHEMICAL SYMBOL FOR DISSOLVE-2;So;0;ON;;;;;N;;;;;
+1F763;ALCHEMICAL SYMBOL FOR PURIFY;So;0;ON;;;;;N;;;;;
+1F764;ALCHEMICAL SYMBOL FOR PUTREFACTION;So;0;ON;;;;;N;;;;;
+1F765;ALCHEMICAL SYMBOL FOR CRUCIBLE;So;0;ON;;;;;N;;;;;
+1F766;ALCHEMICAL SYMBOL FOR CRUCIBLE-2;So;0;ON;;;;;N;;;;;
+1F767;ALCHEMICAL SYMBOL FOR CRUCIBLE-3;So;0;ON;;;;;N;;;;;
+1F768;ALCHEMICAL SYMBOL FOR CRUCIBLE-4;So;0;ON;;;;;N;;;;;
+1F769;ALCHEMICAL SYMBOL FOR CRUCIBLE-5;So;0;ON;;;;;N;;;;;
+1F76A;ALCHEMICAL SYMBOL FOR ALEMBIC;So;0;ON;;;;;N;;;;;
+1F76B;ALCHEMICAL SYMBOL FOR BATH OF MARY;So;0;ON;;;;;N;;;;;
+1F76C;ALCHEMICAL SYMBOL FOR BATH OF VAPOURS;So;0;ON;;;;;N;;;;;
+1F76D;ALCHEMICAL SYMBOL FOR RETORT;So;0;ON;;;;;N;;;;;
+1F76E;ALCHEMICAL SYMBOL FOR HOUR;So;0;ON;;;;;N;;;;;
+1F76F;ALCHEMICAL SYMBOL FOR NIGHT;So;0;ON;;;;;N;;;;;
+1F770;ALCHEMICAL SYMBOL FOR DAY-NIGHT;So;0;ON;;;;;N;;;;;
+1F771;ALCHEMICAL SYMBOL FOR MONTH;So;0;ON;;;;;N;;;;;
+1F772;ALCHEMICAL SYMBOL FOR HALF DRAM;So;0;ON;;;;;N;;;;;
+1F773;ALCHEMICAL SYMBOL FOR HALF OUNCE;So;0;ON;;;;;N;;;;;
+1F780;BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;;
+1F781;BLACK UP-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;;
+1F782;BLACK RIGHT-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;;
+1F783;BLACK DOWN-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;;
+1F784;BLACK SLIGHTLY SMALL CIRCLE;So;0;ON;;;;;N;;;;;
+1F785;MEDIUM BOLD WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+1F786;BOLD WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+1F787;HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+1F788;VERY HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+1F789;EXTREMELY HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+1F78A;WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE;So;0;ON;;;;;N;;;;;
+1F78B;ROUND TARGET;So;0;ON;;;;;N;;;;;
+1F78C;BLACK TINY SQUARE;So;0;ON;;;;;N;;;;;
+1F78D;BLACK SLIGHTLY SMALL SQUARE;So;0;ON;;;;;N;;;;;
+1F78E;LIGHT WHITE SQUARE;So;0;ON;;;;;N;;;;;
+1F78F;MEDIUM WHITE SQUARE;So;0;ON;;;;;N;;;;;
+1F790;BOLD WHITE SQUARE;So;0;ON;;;;;N;;;;;
+1F791;HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;;
+1F792;VERY HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;;
+1F793;EXTREMELY HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;;
+1F794;WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;;
+1F795;WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE;So;0;ON;;;;;N;;;;;
+1F796;SQUARE TARGET;So;0;ON;;;;;N;;;;;
+1F797;BLACK TINY DIAMOND;So;0;ON;;;;;N;;;;;
+1F798;BLACK VERY SMALL DIAMOND;So;0;ON;;;;;N;;;;;
+1F799;BLACK MEDIUM SMALL DIAMOND;So;0;ON;;;;;N;;;;;
+1F79A;WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND;So;0;ON;;;;;N;;;;;
+1F79B;WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;;
+1F79C;DIAMOND TARGET;So;0;ON;;;;;N;;;;;
+1F79D;BLACK TINY LOZENGE;So;0;ON;;;;;N;;;;;
+1F79E;BLACK VERY SMALL LOZENGE;So;0;ON;;;;;N;;;;;
+1F79F;BLACK MEDIUM SMALL LOZENGE;So;0;ON;;;;;N;;;;;
+1F7A0;WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;;
+1F7A1;THIN GREEK CROSS;So;0;ON;;;;;N;;;;;
+1F7A2;LIGHT GREEK CROSS;So;0;ON;;;;;N;;;;;
+1F7A3;MEDIUM GREEK CROSS;So;0;ON;;;;;N;;;;;
+1F7A4;BOLD GREEK CROSS;So;0;ON;;;;;N;;;;;
+1F7A5;VERY BOLD GREEK CROSS;So;0;ON;;;;;N;;;;;
+1F7A6;VERY HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;;
+1F7A7;EXTREMELY HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;;
+1F7A8;THIN SALTIRE;So;0;ON;;;;;N;;;;;
+1F7A9;LIGHT SALTIRE;So;0;ON;;;;;N;;;;;
+1F7AA;MEDIUM SALTIRE;So;0;ON;;;;;N;;;;;
+1F7AB;BOLD SALTIRE;So;0;ON;;;;;N;;;;;
+1F7AC;HEAVY SALTIRE;So;0;ON;;;;;N;;;;;
+1F7AD;VERY HEAVY SALTIRE;So;0;ON;;;;;N;;;;;
+1F7AE;EXTREMELY HEAVY SALTIRE;So;0;ON;;;;;N;;;;;
+1F7AF;LIGHT FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+1F7B0;MEDIUM FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+1F7B1;BOLD FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+1F7B2;HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+1F7B3;VERY HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+1F7B4;EXTREMELY HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+1F7B5;LIGHT SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+1F7B6;MEDIUM SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+1F7B7;BOLD SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+1F7B8;HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+1F7B9;VERY HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+1F7BA;EXTREMELY HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+1F7BB;LIGHT EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+1F7BC;MEDIUM EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+1F7BD;BOLD EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+1F7BE;HEAVY EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+1F7BF;VERY HEAVY EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+1F7C0;LIGHT THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+1F7C1;MEDIUM THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+1F7C2;THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+1F7C3;MEDIUM THREE POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;;
+1F7C4;LIGHT FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+1F7C5;MEDIUM FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+1F7C6;FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+1F7C7;MEDIUM FOUR POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;;
+1F7C8;REVERSE LIGHT FOUR POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;;
+1F7C9;LIGHT FIVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+1F7CA;HEAVY FIVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+1F7CB;MEDIUM SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+1F7CC;HEAVY SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+1F7CD;SIX POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;;
+1F7CE;MEDIUM EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+1F7CF;HEAVY EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+1F7D0;VERY HEAVY EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+1F7D1;HEAVY EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;;
+1F7D2;LIGHT TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+1F7D3;HEAVY TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+1F7D4;HEAVY TWELVE POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;;
+1F800;LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F801;UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F802;RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F803;DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F804;LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F805;UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F806;RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F807;DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F808;LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F809;UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F80A;RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F80B;DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F810;LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F811;UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F812;RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F813;DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F814;LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F815;UPWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F816;RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F817;DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F818;HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F819;HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F81A;HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F81B;HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F81C;HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F81D;HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F81E;HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F81F;HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F820;LEFTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;;
+1F821;UPWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;;
+1F822;RIGHTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;;
+1F823;DOWNWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;;
+1F824;LEFTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;;
+1F825;UPWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;;
+1F826;RIGHTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;;
+1F827;DOWNWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;;
+1F828;LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;;
+1F829;UPWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;;
+1F82A;RIGHTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;;
+1F82B;DOWNWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;;
+1F82C;LEFTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;;
+1F82D;UPWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;;
+1F82E;RIGHTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;;
+1F82F;DOWNWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;;
+1F830;LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;;
+1F831;UPWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;;
+1F832;RIGHTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;;
+1F833;DOWNWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;;
+1F834;LEFTWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;;
+1F835;UPWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;;
+1F836;RIGHTWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;;
+1F837;DOWNWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;;
+1F838;LEFTWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;;
+1F839;UPWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;;
+1F83A;RIGHTWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;;
+1F83B;DOWNWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;;
+1F83C;LEFTWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;;
+1F83D;UPWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;;
+1F83E;RIGHTWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;;
+1F83F;DOWNWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;;
+1F840;LEFTWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;;
+1F841;UPWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;;
+1F842;RIGHTWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;;
+1F843;DOWNWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;;
+1F844;LEFTWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;;
+1F845;UPWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;;
+1F846;RIGHTWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;;
+1F847;DOWNWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;;
+1F850;LEFTWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;;
+1F851;UPWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;;
+1F852;RIGHTWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;;
+1F853;DOWNWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;;
+1F854;NORTH WEST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;;
+1F855;NORTH EAST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;;
+1F856;SOUTH EAST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;;
+1F857;SOUTH WEST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;;
+1F858;LEFT RIGHT SANS-SERIF ARROW;So;0;ON;;;;;N;;;;;
+1F859;UP DOWN SANS-SERIF ARROW;So;0;ON;;;;;N;;;;;
+1F860;WIDE-HEADED LEFTWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;;
+1F861;WIDE-HEADED UPWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;;
+1F862;WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;;
+1F863;WIDE-HEADED DOWNWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;;
+1F864;WIDE-HEADED NORTH WEST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;;
+1F865;WIDE-HEADED NORTH EAST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;;
+1F866;WIDE-HEADED SOUTH EAST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;;
+1F867;WIDE-HEADED SOUTH WEST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;;
+1F868;WIDE-HEADED LEFTWARDS BARB ARROW;So;0;ON;;;;;N;;;;;
+1F869;WIDE-HEADED UPWARDS BARB ARROW;So;0;ON;;;;;N;;;;;
+1F86A;WIDE-HEADED RIGHTWARDS BARB ARROW;So;0;ON;;;;;N;;;;;
+1F86B;WIDE-HEADED DOWNWARDS BARB ARROW;So;0;ON;;;;;N;;;;;
+1F86C;WIDE-HEADED NORTH WEST BARB ARROW;So;0;ON;;;;;N;;;;;
+1F86D;WIDE-HEADED NORTH EAST BARB ARROW;So;0;ON;;;;;N;;;;;
+1F86E;WIDE-HEADED SOUTH EAST BARB ARROW;So;0;ON;;;;;N;;;;;
+1F86F;WIDE-HEADED SOUTH WEST BARB ARROW;So;0;ON;;;;;N;;;;;
+1F870;WIDE-HEADED LEFTWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;;
+1F871;WIDE-HEADED UPWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;;
+1F872;WIDE-HEADED RIGHTWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;;
+1F873;WIDE-HEADED DOWNWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;;
+1F874;WIDE-HEADED NORTH WEST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;;
+1F875;WIDE-HEADED NORTH EAST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;;
+1F876;WIDE-HEADED SOUTH EAST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;;
+1F877;WIDE-HEADED SOUTH WEST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;;
+1F878;WIDE-HEADED LEFTWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;;
+1F879;WIDE-HEADED UPWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;;
+1F87A;WIDE-HEADED RIGHTWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;;
+1F87B;WIDE-HEADED DOWNWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;;
+1F87C;WIDE-HEADED NORTH WEST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;;
+1F87D;WIDE-HEADED NORTH EAST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;;
+1F87E;WIDE-HEADED SOUTH EAST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;;
+1F87F;WIDE-HEADED SOUTH WEST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;;
+1F880;WIDE-HEADED LEFTWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;;
+1F881;WIDE-HEADED UPWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;;
+1F882;WIDE-HEADED RIGHTWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;;
+1F883;WIDE-HEADED DOWNWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;;
+1F884;WIDE-HEADED NORTH WEST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;;
+1F885;WIDE-HEADED NORTH EAST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;;
+1F886;WIDE-HEADED SOUTH EAST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;;
+1F887;WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;;
+1F890;LEFTWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F891;UPWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F892;RIGHTWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F893;DOWNWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F894;LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F895;UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F896;RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F897;DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
+1F898;LEFTWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;;
+1F899;UPWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;;
+1F89A;RIGHTWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;;
+1F89B;DOWNWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;;
+1F89C;HEAVY ARROW SHAFT WIDTH ONE;So;0;ON;;;;;N;;;;;
+1F89D;HEAVY ARROW SHAFT WIDTH TWO THIRDS;So;0;ON;;;;;N;;;;;
+1F89E;HEAVY ARROW SHAFT WIDTH ONE HALF;So;0;ON;;;;;N;;;;;
+1F89F;HEAVY ARROW SHAFT WIDTH ONE THIRD;So;0;ON;;;;;N;;;;;
+1F8A0;LEFTWARDS BOTTOM-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;;
+1F8A1;RIGHTWARDS BOTTOM SHADED WHITE ARROW;So;0;ON;;;;;N;;;;;
+1F8A2;LEFTWARDS TOP SHADED WHITE ARROW;So;0;ON;;;;;N;;;;;
+1F8A3;RIGHTWARDS TOP SHADED WHITE ARROW;So;0;ON;;;;;N;;;;;
+1F8A4;LEFTWARDS LEFT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;;
+1F8A5;RIGHTWARDS RIGHT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;;
+1F8A6;LEFTWARDS RIGHT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;;
+1F8A7;RIGHTWARDS LEFT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;;
+1F8A8;LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;;
+1F8A9;RIGHTWARDS BACK-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;;
+1F8AA;LEFTWARDS FRONT-TILTED SHADOWED WHITE ARROW;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;;;;;
+1F910;ZIPPER-MOUTH FACE;So;0;ON;;;;;N;;;;;
+1F911;MONEY-MOUTH FACE;So;0;ON;;;;;N;;;;;
+1F912;FACE WITH THERMOMETER;So;0;ON;;;;;N;;;;;
+1F913;NERD FACE;So;0;ON;;;;;N;;;;;
+1F914;THINKING FACE;So;0;ON;;;;;N;;;;;
+1F915;FACE WITH HEAD-BANDAGE;So;0;ON;;;;;N;;;;;
+1F916;ROBOT FACE;So;0;ON;;;;;N;;;;;
+1F917;HUGGING FACE;So;0;ON;;;;;N;;;;;
+1F918;SIGN OF THE HORNS;So;0;ON;;;;;N;;;;;
+1F919;CALL ME HAND;So;0;ON;;;;;N;;;;;
+1F91A;RAISED BACK OF HAND;So;0;ON;;;;;N;;;;;
+1F91B;LEFT-FACING FIST;So;0;ON;;;;;N;;;;;
+1F91C;RIGHT-FACING FIST;So;0;ON;;;;;N;;;;;
+1F91D;HANDSHAKE;So;0;ON;;;;;N;;;;;
+1F91E;HAND WITH INDEX AND MIDDLE FINGERS CROSSED;So;0;ON;;;;;N;;;;;
+1F920;FACE WITH COWBOY HAT;So;0;ON;;;;;N;;;;;
+1F921;CLOWN FACE;So;0;ON;;;;;N;;;;;
+1F922;NAUSEATED FACE;So;0;ON;;;;;N;;;;;
+1F923;ROLLING ON THE FLOOR LAUGHING;So;0;ON;;;;;N;;;;;
+1F924;DROOLING FACE;So;0;ON;;;;;N;;;;;
+1F925;LYING FACE;So;0;ON;;;;;N;;;;;
+1F926;FACE PALM;So;0;ON;;;;;N;;;;;
+1F927;SNEEZING FACE;So;0;ON;;;;;N;;;;;
+1F930;PREGNANT WOMAN;So;0;ON;;;;;N;;;;;
+1F933;SELFIE;So;0;ON;;;;;N;;;;;
+1F934;PRINCE;So;0;ON;;;;;N;;;;;
+1F935;MAN IN TUXEDO;So;0;ON;;;;;N;;;;;
+1F936;MOTHER CHRISTMAS;So;0;ON;;;;;N;;;;;
+1F937;SHRUG;So;0;ON;;;;;N;;;;;
+1F938;PERSON DOING CARTWHEEL;So;0;ON;;;;;N;;;;;
+1F939;JUGGLING;So;0;ON;;;;;N;;;;;
+1F93A;FENCER;So;0;ON;;;;;N;;;;;
+1F93B;MODERN PENTATHLON;So;0;ON;;;;;N;;;;;
+1F93C;WRESTLERS;So;0;ON;;;;;N;;;;;
+1F93D;WATER POLO;So;0;ON;;;;;N;;;;;
+1F93E;HANDBALL;So;0;ON;;;;;N;;;;;
+1F940;WILTED FLOWER;So;0;ON;;;;;N;;;;;
+1F941;DRUM WITH DRUMSTICKS;So;0;ON;;;;;N;;;;;
+1F942;CLINKING GLASSES;So;0;ON;;;;;N;;;;;
+1F943;TUMBLER GLASS;So;0;ON;;;;;N;;;;;
+1F944;SPOON;So;0;ON;;;;;N;;;;;
+1F945;GOAL NET;So;0;ON;;;;;N;;;;;
+1F946;RIFLE;So;0;ON;;;;;N;;;;;
+1F947;FIRST PLACE MEDAL;So;0;ON;;;;;N;;;;;
+1F948;SECOND PLACE MEDAL;So;0;ON;;;;;N;;;;;
+1F949;THIRD PLACE MEDAL;So;0;ON;;;;;N;;;;;
+1F94A;BOXING GLOVE;So;0;ON;;;;;N;;;;;
+1F94B;MARTIAL ARTS UNIFORM;So;0;ON;;;;;N;;;;;
+1F950;CROISSANT;So;0;ON;;;;;N;;;;;
+1F951;AVOCADO;So;0;ON;;;;;N;;;;;
+1F952;CUCUMBER;So;0;ON;;;;;N;;;;;
+1F953;BACON;So;0;ON;;;;;N;;;;;
+1F954;POTATO;So;0;ON;;;;;N;;;;;
+1F955;CARROT;So;0;ON;;;;;N;;;;;
+1F956;BAGUETTE BREAD;So;0;ON;;;;;N;;;;;
+1F957;GREEN SALAD;So;0;ON;;;;;N;;;;;
+1F958;SHALLOW PAN OF FOOD;So;0;ON;;;;;N;;;;;
+1F959;STUFFED FLATBREAD;So;0;ON;;;;;N;;;;;
+1F95A;EGG;So;0;ON;;;;;N;;;;;
+1F95B;GLASS OF MILK;So;0;ON;;;;;N;;;;;
+1F95C;PEANUTS;So;0;ON;;;;;N;;;;;
+1F95D;KIWIFRUIT;So;0;ON;;;;;N;;;;;
+1F95E;PANCAKES;So;0;ON;;;;;N;;;;;
+1F980;CRAB;So;0;ON;;;;;N;;;;;
+1F981;LION FACE;So;0;ON;;;;;N;;;;;
+1F982;SCORPION;So;0;ON;;;;;N;;;;;
+1F983;TURKEY;So;0;ON;;;;;N;;;;;
+1F984;UNICORN FACE;So;0;ON;;;;;N;;;;;
+1F985;EAGLE;So;0;ON;;;;;N;;;;;
+1F986;DUCK;So;0;ON;;;;;N;;;;;
+1F987;BAT;So;0;ON;;;;;N;;;;;
+1F988;SHARK;So;0;ON;;;;;N;;;;;
+1F989;OWL;So;0;ON;;;;;N;;;;;
+1F98A;FOX FACE;So;0;ON;;;;;N;;;;;
+1F98B;BUTTERFLY;So;0;ON;;;;;N;;;;;
+1F98C;DEER;So;0;ON;;;;;N;;;;;
+1F98D;GORILLA;So;0;ON;;;;;N;;;;;
+1F98E;LIZARD;So;0;ON;;;;;N;;;;;
+1F98F;RHINOCEROS;So;0;ON;;;;;N;;;;;
+1F990;SHRIMP;So;0;ON;;;;;N;;;;;
+1F991;SQUID;So;0;ON;;;;;N;;;;;
+1F9C0;CHEESE WEDGE;So;0;ON;;;;;N;;;;;
+20000;<CJK Ideograph Extension B, First>;Lo;0;L;;;;;N;;;;;
+2A6D6;<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;;;;;
+2B81D;<CJK Ideograph Extension D, Last>;Lo;0;L;;;;;N;;;;;
+2B820;<CJK Ideograph Extension E, First>;Lo;0;L;;;;;N;;;;;
+2CEA1;<CJK Ideograph Extension E, Last>;Lo;0;L;;;;;N;;;;;
+2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;;
+2F801;CJK COMPATIBILITY IDEOGRAPH-2F801;Lo;0;L;4E38;;;;N;;;;;
+2F802;CJK COMPATIBILITY IDEOGRAPH-2F802;Lo;0;L;4E41;;;;N;;;;;
+2F803;CJK COMPATIBILITY IDEOGRAPH-2F803;Lo;0;L;20122;;;;N;;;;;
+2F804;CJK COMPATIBILITY IDEOGRAPH-2F804;Lo;0;L;4F60;;;;N;;;;;
+2F805;CJK COMPATIBILITY IDEOGRAPH-2F805;Lo;0;L;4FAE;;;;N;;;;;
+2F806;CJK COMPATIBILITY IDEOGRAPH-2F806;Lo;0;L;4FBB;;;;N;;;;;
+2F807;CJK COMPATIBILITY IDEOGRAPH-2F807;Lo;0;L;5002;;;;N;;;;;
+2F808;CJK COMPATIBILITY IDEOGRAPH-2F808;Lo;0;L;507A;;;;N;;;;;
+2F809;CJK COMPATIBILITY IDEOGRAPH-2F809;Lo;0;L;5099;;;;N;;;;;
+2F80A;CJK COMPATIBILITY IDEOGRAPH-2F80A;Lo;0;L;50E7;;;;N;;;;;
+2F80B;CJK COMPATIBILITY IDEOGRAPH-2F80B;Lo;0;L;50CF;;;;N;;;;;
+2F80C;CJK COMPATIBILITY IDEOGRAPH-2F80C;Lo;0;L;349E;;;;N;;;;;
+2F80D;CJK COMPATIBILITY IDEOGRAPH-2F80D;Lo;0;L;2063A;;;;N;;;;;
+2F80E;CJK COMPATIBILITY IDEOGRAPH-2F80E;Lo;0;L;514D;;;;N;;;;;
+2F80F;CJK COMPATIBILITY IDEOGRAPH-2F80F;Lo;0;L;5154;;;;N;;;;;
+2F810;CJK COMPATIBILITY IDEOGRAPH-2F810;Lo;0;L;5164;;;;N;;;;;
+2F811;CJK COMPATIBILITY IDEOGRAPH-2F811;Lo;0;L;5177;;;;N;;;;;
+2F812;CJK COMPATIBILITY IDEOGRAPH-2F812;Lo;0;L;2051C;;;;N;;;;;
+2F813;CJK COMPATIBILITY IDEOGRAPH-2F813;Lo;0;L;34B9;;;;N;;;;;
+2F814;CJK COMPATIBILITY IDEOGRAPH-2F814;Lo;0;L;5167;;;;N;;;;;
+2F815;CJK COMPATIBILITY IDEOGRAPH-2F815;Lo;0;L;518D;;;;N;;;;;
+2F816;CJK COMPATIBILITY IDEOGRAPH-2F816;Lo;0;L;2054B;;;;N;;;;;
+2F817;CJK COMPATIBILITY IDEOGRAPH-2F817;Lo;0;L;5197;;;;N;;;;;
+2F818;CJK COMPATIBILITY IDEOGRAPH-2F818;Lo;0;L;51A4;;;;N;;;;;
+2F819;CJK COMPATIBILITY IDEOGRAPH-2F819;Lo;0;L;4ECC;;;;N;;;;;
+2F81A;CJK COMPATIBILITY IDEOGRAPH-2F81A;Lo;0;L;51AC;;;;N;;;;;
+2F81B;CJK COMPATIBILITY IDEOGRAPH-2F81B;Lo;0;L;51B5;;;;N;;;;;
+2F81C;CJK COMPATIBILITY IDEOGRAPH-2F81C;Lo;0;L;291DF;;;;N;;;;;
+2F81D;CJK COMPATIBILITY IDEOGRAPH-2F81D;Lo;0;L;51F5;;;;N;;;;;
+2F81E;CJK COMPATIBILITY IDEOGRAPH-2F81E;Lo;0;L;5203;;;;N;;;;;
+2F81F;CJK COMPATIBILITY IDEOGRAPH-2F81F;Lo;0;L;34DF;;;;N;;;;;
+2F820;CJK COMPATIBILITY IDEOGRAPH-2F820;Lo;0;L;523B;;;;N;;;;;
+2F821;CJK COMPATIBILITY IDEOGRAPH-2F821;Lo;0;L;5246;;;;N;;;;;
+2F822;CJK COMPATIBILITY IDEOGRAPH-2F822;Lo;0;L;5272;;;;N;;;;;
+2F823;CJK COMPATIBILITY IDEOGRAPH-2F823;Lo;0;L;5277;;;;N;;;;;
+2F824;CJK COMPATIBILITY IDEOGRAPH-2F824;Lo;0;L;3515;;;;N;;;;;
+2F825;CJK COMPATIBILITY IDEOGRAPH-2F825;Lo;0;L;52C7;;;;N;;;;;
+2F826;CJK COMPATIBILITY IDEOGRAPH-2F826;Lo;0;L;52C9;;;;N;;;;;
+2F827;CJK COMPATIBILITY IDEOGRAPH-2F827;Lo;0;L;52E4;;;;N;;;;;
+2F828;CJK COMPATIBILITY IDEOGRAPH-2F828;Lo;0;L;52FA;;;;N;;;;;
+2F829;CJK COMPATIBILITY IDEOGRAPH-2F829;Lo;0;L;5305;;;;N;;;;;
+2F82A;CJK COMPATIBILITY IDEOGRAPH-2F82A;Lo;0;L;5306;;;;N;;;;;
+2F82B;CJK COMPATIBILITY IDEOGRAPH-2F82B;Lo;0;L;5317;;;;N;;;;;
+2F82C;CJK COMPATIBILITY IDEOGRAPH-2F82C;Lo;0;L;5349;;;;N;;;;;
+2F82D;CJK COMPATIBILITY IDEOGRAPH-2F82D;Lo;0;L;5351;;;;N;;;;;
+2F82E;CJK COMPATIBILITY IDEOGRAPH-2F82E;Lo;0;L;535A;;;;N;;;;;
+2F82F;CJK COMPATIBILITY IDEOGRAPH-2F82F;Lo;0;L;5373;;;;N;;;;;
+2F830;CJK COMPATIBILITY IDEOGRAPH-2F830;Lo;0;L;537D;;;;N;;;;;
+2F831;CJK COMPATIBILITY IDEOGRAPH-2F831;Lo;0;L;537F;;;;N;;;;;
+2F832;CJK COMPATIBILITY IDEOGRAPH-2F832;Lo;0;L;537F;;;;N;;;;;
+2F833;CJK COMPATIBILITY IDEOGRAPH-2F833;Lo;0;L;537F;;;;N;;;;;
+2F834;CJK COMPATIBILITY IDEOGRAPH-2F834;Lo;0;L;20A2C;;;;N;;;;;
+2F835;CJK COMPATIBILITY IDEOGRAPH-2F835;Lo;0;L;7070;;;;N;;;;;
+2F836;CJK COMPATIBILITY IDEOGRAPH-2F836;Lo;0;L;53CA;;;;N;;;;;
+2F837;CJK COMPATIBILITY IDEOGRAPH-2F837;Lo;0;L;53DF;;;;N;;;;;
+2F838;CJK COMPATIBILITY IDEOGRAPH-2F838;Lo;0;L;20B63;;;;N;;;;;
+2F839;CJK COMPATIBILITY IDEOGRAPH-2F839;Lo;0;L;53EB;;;;N;;;;;
+2F83A;CJK COMPATIBILITY IDEOGRAPH-2F83A;Lo;0;L;53F1;;;;N;;;;;
+2F83B;CJK COMPATIBILITY IDEOGRAPH-2F83B;Lo;0;L;5406;;;;N;;;;;
+2F83C;CJK COMPATIBILITY IDEOGRAPH-2F83C;Lo;0;L;549E;;;;N;;;;;
+2F83D;CJK COMPATIBILITY IDEOGRAPH-2F83D;Lo;0;L;5438;;;;N;;;;;
+2F83E;CJK COMPATIBILITY IDEOGRAPH-2F83E;Lo;0;L;5448;;;;N;;;;;
+2F83F;CJK COMPATIBILITY IDEOGRAPH-2F83F;Lo;0;L;5468;;;;N;;;;;
+2F840;CJK COMPATIBILITY IDEOGRAPH-2F840;Lo;0;L;54A2;;;;N;;;;;
+2F841;CJK COMPATIBILITY IDEOGRAPH-2F841;Lo;0;L;54F6;;;;N;;;;;
+2F842;CJK COMPATIBILITY IDEOGRAPH-2F842;Lo;0;L;5510;;;;N;;;;;
+2F843;CJK COMPATIBILITY IDEOGRAPH-2F843;Lo;0;L;5553;;;;N;;;;;
+2F844;CJK COMPATIBILITY IDEOGRAPH-2F844;Lo;0;L;5563;;;;N;;;;;
+2F845;CJK COMPATIBILITY IDEOGRAPH-2F845;Lo;0;L;5584;;;;N;;;;;
+2F846;CJK COMPATIBILITY IDEOGRAPH-2F846;Lo;0;L;5584;;;;N;;;;;
+2F847;CJK COMPATIBILITY IDEOGRAPH-2F847;Lo;0;L;5599;;;;N;;;;;
+2F848;CJK COMPATIBILITY IDEOGRAPH-2F848;Lo;0;L;55AB;;;;N;;;;;
+2F849;CJK COMPATIBILITY IDEOGRAPH-2F849;Lo;0;L;55B3;;;;N;;;;;
+2F84A;CJK COMPATIBILITY IDEOGRAPH-2F84A;Lo;0;L;55C2;;;;N;;;;;
+2F84B;CJK COMPATIBILITY IDEOGRAPH-2F84B;Lo;0;L;5716;;;;N;;;;;
+2F84C;CJK COMPATIBILITY IDEOGRAPH-2F84C;Lo;0;L;5606;;;;N;;;;;
+2F84D;CJK COMPATIBILITY IDEOGRAPH-2F84D;Lo;0;L;5717;;;;N;;;;;
+2F84E;CJK COMPATIBILITY IDEOGRAPH-2F84E;Lo;0;L;5651;;;;N;;;;;
+2F84F;CJK COMPATIBILITY IDEOGRAPH-2F84F;Lo;0;L;5674;;;;N;;;;;
+2F850;CJK COMPATIBILITY IDEOGRAPH-2F850;Lo;0;L;5207;;;;N;;;;;
+2F851;CJK COMPATIBILITY IDEOGRAPH-2F851;Lo;0;L;58EE;;;;N;;;;;
+2F852;CJK COMPATIBILITY IDEOGRAPH-2F852;Lo;0;L;57CE;;;;N;;;;;
+2F853;CJK COMPATIBILITY IDEOGRAPH-2F853;Lo;0;L;57F4;;;;N;;;;;
+2F854;CJK COMPATIBILITY IDEOGRAPH-2F854;Lo;0;L;580D;;;;N;;;;;
+2F855;CJK COMPATIBILITY IDEOGRAPH-2F855;Lo;0;L;578B;;;;N;;;;;
+2F856;CJK COMPATIBILITY IDEOGRAPH-2F856;Lo;0;L;5832;;;;N;;;;;
+2F857;CJK COMPATIBILITY IDEOGRAPH-2F857;Lo;0;L;5831;;;;N;;;;;
+2F858;CJK COMPATIBILITY IDEOGRAPH-2F858;Lo;0;L;58AC;;;;N;;;;;
+2F859;CJK COMPATIBILITY IDEOGRAPH-2F859;Lo;0;L;214E4;;;;N;;;;;
+2F85A;CJK COMPATIBILITY IDEOGRAPH-2F85A;Lo;0;L;58F2;;;;N;;;;;
+2F85B;CJK COMPATIBILITY IDEOGRAPH-2F85B;Lo;0;L;58F7;;;;N;;;;;
+2F85C;CJK COMPATIBILITY IDEOGRAPH-2F85C;Lo;0;L;5906;;;;N;;;;;
+2F85D;CJK COMPATIBILITY IDEOGRAPH-2F85D;Lo;0;L;591A;;;;N;;;;;
+2F85E;CJK COMPATIBILITY IDEOGRAPH-2F85E;Lo;0;L;5922;;;;N;;;;;
+2F85F;CJK COMPATIBILITY IDEOGRAPH-2F85F;Lo;0;L;5962;;;;N;;;;;
+2F860;CJK COMPATIBILITY IDEOGRAPH-2F860;Lo;0;L;216A8;;;;N;;;;;
+2F861;CJK COMPATIBILITY IDEOGRAPH-2F861;Lo;0;L;216EA;;;;N;;;;;
+2F862;CJK COMPATIBILITY IDEOGRAPH-2F862;Lo;0;L;59EC;;;;N;;;;;
+2F863;CJK COMPATIBILITY IDEOGRAPH-2F863;Lo;0;L;5A1B;;;;N;;;;;
+2F864;CJK COMPATIBILITY IDEOGRAPH-2F864;Lo;0;L;5A27;;;;N;;;;;
+2F865;CJK COMPATIBILITY IDEOGRAPH-2F865;Lo;0;L;59D8;;;;N;;;;;
+2F866;CJK COMPATIBILITY IDEOGRAPH-2F866;Lo;0;L;5A66;;;;N;;;;;
+2F867;CJK COMPATIBILITY IDEOGRAPH-2F867;Lo;0;L;36EE;;;;N;;;;;
+2F868;CJK COMPATIBILITY IDEOGRAPH-2F868;Lo;0;L;36FC;;;;N;;;;;
+2F869;CJK COMPATIBILITY IDEOGRAPH-2F869;Lo;0;L;5B08;;;;N;;;;;
+2F86A;CJK COMPATIBILITY IDEOGRAPH-2F86A;Lo;0;L;5B3E;;;;N;;;;;
+2F86B;CJK COMPATIBILITY IDEOGRAPH-2F86B;Lo;0;L;5B3E;;;;N;;;;;
+2F86C;CJK COMPATIBILITY IDEOGRAPH-2F86C;Lo;0;L;219C8;;;;N;;;;;
+2F86D;CJK COMPATIBILITY IDEOGRAPH-2F86D;Lo;0;L;5BC3;;;;N;;;;;
+2F86E;CJK COMPATIBILITY IDEOGRAPH-2F86E;Lo;0;L;5BD8;;;;N;;;;;
+2F86F;CJK COMPATIBILITY IDEOGRAPH-2F86F;Lo;0;L;5BE7;;;;N;;;;;
+2F870;CJK COMPATIBILITY IDEOGRAPH-2F870;Lo;0;L;5BF3;;;;N;;;;;
+2F871;CJK COMPATIBILITY IDEOGRAPH-2F871;Lo;0;L;21B18;;;;N;;;;;
+2F872;CJK COMPATIBILITY IDEOGRAPH-2F872;Lo;0;L;5BFF;;;;N;;;;;
+2F873;CJK COMPATIBILITY IDEOGRAPH-2F873;Lo;0;L;5C06;;;;N;;;;;
+2F874;CJK COMPATIBILITY IDEOGRAPH-2F874;Lo;0;L;5F53;;;;N;;;;;
+2F875;CJK COMPATIBILITY IDEOGRAPH-2F875;Lo;0;L;5C22;;;;N;;;;;
+2F876;CJK COMPATIBILITY IDEOGRAPH-2F876;Lo;0;L;3781;;;;N;;;;;
+2F877;CJK COMPATIBILITY IDEOGRAPH-2F877;Lo;0;L;5C60;;;;N;;;;;
+2F878;CJK COMPATIBILITY IDEOGRAPH-2F878;Lo;0;L;5C6E;;;;N;;;;;
+2F879;CJK COMPATIBILITY IDEOGRAPH-2F879;Lo;0;L;5CC0;;;;N;;;;;
+2F87A;CJK COMPATIBILITY IDEOGRAPH-2F87A;Lo;0;L;5C8D;;;;N;;;;;
+2F87B;CJK COMPATIBILITY IDEOGRAPH-2F87B;Lo;0;L;21DE4;;;;N;;;;;
+2F87C;CJK COMPATIBILITY IDEOGRAPH-2F87C;Lo;0;L;5D43;;;;N;;;;;
+2F87D;CJK COMPATIBILITY IDEOGRAPH-2F87D;Lo;0;L;21DE6;;;;N;;;;;
+2F87E;CJK COMPATIBILITY IDEOGRAPH-2F87E;Lo;0;L;5D6E;;;;N;;;;;
+2F87F;CJK COMPATIBILITY IDEOGRAPH-2F87F;Lo;0;L;5D6B;;;;N;;;;;
+2F880;CJK COMPATIBILITY IDEOGRAPH-2F880;Lo;0;L;5D7C;;;;N;;;;;
+2F881;CJK COMPATIBILITY IDEOGRAPH-2F881;Lo;0;L;5DE1;;;;N;;;;;
+2F882;CJK COMPATIBILITY IDEOGRAPH-2F882;Lo;0;L;5DE2;;;;N;;;;;
+2F883;CJK COMPATIBILITY IDEOGRAPH-2F883;Lo;0;L;382F;;;;N;;;;;
+2F884;CJK COMPATIBILITY IDEOGRAPH-2F884;Lo;0;L;5DFD;;;;N;;;;;
+2F885;CJK COMPATIBILITY IDEOGRAPH-2F885;Lo;0;L;5E28;;;;N;;;;;
+2F886;CJK COMPATIBILITY IDEOGRAPH-2F886;Lo;0;L;5E3D;;;;N;;;;;
+2F887;CJK COMPATIBILITY IDEOGRAPH-2F887;Lo;0;L;5E69;;;;N;;;;;
+2F888;CJK COMPATIBILITY IDEOGRAPH-2F888;Lo;0;L;3862;;;;N;;;;;
+2F889;CJK COMPATIBILITY IDEOGRAPH-2F889;Lo;0;L;22183;;;;N;;;;;
+2F88A;CJK COMPATIBILITY IDEOGRAPH-2F88A;Lo;0;L;387C;;;;N;;;;;
+2F88B;CJK COMPATIBILITY IDEOGRAPH-2F88B;Lo;0;L;5EB0;;;;N;;;;;
+2F88C;CJK COMPATIBILITY IDEOGRAPH-2F88C;Lo;0;L;5EB3;;;;N;;;;;
+2F88D;CJK COMPATIBILITY IDEOGRAPH-2F88D;Lo;0;L;5EB6;;;;N;;;;;
+2F88E;CJK COMPATIBILITY IDEOGRAPH-2F88E;Lo;0;L;5ECA;;;;N;;;;;
+2F88F;CJK COMPATIBILITY IDEOGRAPH-2F88F;Lo;0;L;2A392;;;;N;;;;;
+2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;9;N;;;;;
+2F891;CJK COMPATIBILITY IDEOGRAPH-2F891;Lo;0;L;22331;;;;N;;;;;
+2F892;CJK COMPATIBILITY IDEOGRAPH-2F892;Lo;0;L;22331;;;;N;;;;;
+2F893;CJK COMPATIBILITY IDEOGRAPH-2F893;Lo;0;L;8201;;;;N;;;;;
+2F894;CJK COMPATIBILITY IDEOGRAPH-2F894;Lo;0;L;5F22;;;;N;;;;;
+2F895;CJK COMPATIBILITY IDEOGRAPH-2F895;Lo;0;L;5F22;;;;N;;;;;
+2F896;CJK COMPATIBILITY IDEOGRAPH-2F896;Lo;0;L;38C7;;;;N;;;;;
+2F897;CJK COMPATIBILITY IDEOGRAPH-2F897;Lo;0;L;232B8;;;;N;;;;;
+2F898;CJK COMPATIBILITY IDEOGRAPH-2F898;Lo;0;L;261DA;;;;N;;;;;
+2F899;CJK COMPATIBILITY IDEOGRAPH-2F899;Lo;0;L;5F62;;;;N;;;;;
+2F89A;CJK COMPATIBILITY IDEOGRAPH-2F89A;Lo;0;L;5F6B;;;;N;;;;;
+2F89B;CJK COMPATIBILITY IDEOGRAPH-2F89B;Lo;0;L;38E3;;;;N;;;;;
+2F89C;CJK COMPATIBILITY IDEOGRAPH-2F89C;Lo;0;L;5F9A;;;;N;;;;;
+2F89D;CJK COMPATIBILITY IDEOGRAPH-2F89D;Lo;0;L;5FCD;;;;N;;;;;
+2F89E;CJK COMPATIBILITY IDEOGRAPH-2F89E;Lo;0;L;5FD7;;;;N;;;;;
+2F89F;CJK COMPATIBILITY IDEOGRAPH-2F89F;Lo;0;L;5FF9;;;;N;;;;;
+2F8A0;CJK COMPATIBILITY IDEOGRAPH-2F8A0;Lo;0;L;6081;;;;N;;;;;
+2F8A1;CJK COMPATIBILITY IDEOGRAPH-2F8A1;Lo;0;L;393A;;;;N;;;;;
+2F8A2;CJK COMPATIBILITY IDEOGRAPH-2F8A2;Lo;0;L;391C;;;;N;;;;;
+2F8A3;CJK COMPATIBILITY IDEOGRAPH-2F8A3;Lo;0;L;6094;;;;N;;;;;
+2F8A4;CJK COMPATIBILITY IDEOGRAPH-2F8A4;Lo;0;L;226D4;;;;N;;;;;
+2F8A5;CJK COMPATIBILITY IDEOGRAPH-2F8A5;Lo;0;L;60C7;;;;N;;;;;
+2F8A6;CJK COMPATIBILITY IDEOGRAPH-2F8A6;Lo;0;L;6148;;;;N;;;;;
+2F8A7;CJK COMPATIBILITY IDEOGRAPH-2F8A7;Lo;0;L;614C;;;;N;;;;;
+2F8A8;CJK COMPATIBILITY IDEOGRAPH-2F8A8;Lo;0;L;614E;;;;N;;;;;
+2F8A9;CJK COMPATIBILITY IDEOGRAPH-2F8A9;Lo;0;L;614C;;;;N;;;;;
+2F8AA;CJK COMPATIBILITY IDEOGRAPH-2F8AA;Lo;0;L;617A;;;;N;;;;;
+2F8AB;CJK COMPATIBILITY IDEOGRAPH-2F8AB;Lo;0;L;618E;;;;N;;;;;
+2F8AC;CJK COMPATIBILITY IDEOGRAPH-2F8AC;Lo;0;L;61B2;;;;N;;;;;
+2F8AD;CJK COMPATIBILITY IDEOGRAPH-2F8AD;Lo;0;L;61A4;;;;N;;;;;
+2F8AE;CJK COMPATIBILITY IDEOGRAPH-2F8AE;Lo;0;L;61AF;;;;N;;;;;
+2F8AF;CJK COMPATIBILITY IDEOGRAPH-2F8AF;Lo;0;L;61DE;;;;N;;;;;
+2F8B0;CJK COMPATIBILITY IDEOGRAPH-2F8B0;Lo;0;L;61F2;;;;N;;;;;
+2F8B1;CJK COMPATIBILITY IDEOGRAPH-2F8B1;Lo;0;L;61F6;;;;N;;;;;
+2F8B2;CJK COMPATIBILITY IDEOGRAPH-2F8B2;Lo;0;L;6210;;;;N;;;;;
+2F8B3;CJK COMPATIBILITY IDEOGRAPH-2F8B3;Lo;0;L;621B;;;;N;;;;;
+2F8B4;CJK COMPATIBILITY IDEOGRAPH-2F8B4;Lo;0;L;625D;;;;N;;;;;
+2F8B5;CJK COMPATIBILITY IDEOGRAPH-2F8B5;Lo;0;L;62B1;;;;N;;;;;
+2F8B6;CJK COMPATIBILITY IDEOGRAPH-2F8B6;Lo;0;L;62D4;;;;N;;;;;
+2F8B7;CJK COMPATIBILITY IDEOGRAPH-2F8B7;Lo;0;L;6350;;;;N;;;;;
+2F8B8;CJK COMPATIBILITY IDEOGRAPH-2F8B8;Lo;0;L;22B0C;;;;N;;;;;
+2F8B9;CJK COMPATIBILITY IDEOGRAPH-2F8B9;Lo;0;L;633D;;;;N;;;;;
+2F8BA;CJK COMPATIBILITY IDEOGRAPH-2F8BA;Lo;0;L;62FC;;;;N;;;;;
+2F8BB;CJK COMPATIBILITY IDEOGRAPH-2F8BB;Lo;0;L;6368;;;;N;;;;;
+2F8BC;CJK COMPATIBILITY IDEOGRAPH-2F8BC;Lo;0;L;6383;;;;N;;;;;
+2F8BD;CJK COMPATIBILITY IDEOGRAPH-2F8BD;Lo;0;L;63E4;;;;N;;;;;
+2F8BE;CJK COMPATIBILITY IDEOGRAPH-2F8BE;Lo;0;L;22BF1;;;;N;;;;;
+2F8BF;CJK COMPATIBILITY IDEOGRAPH-2F8BF;Lo;0;L;6422;;;;N;;;;;
+2F8C0;CJK COMPATIBILITY IDEOGRAPH-2F8C0;Lo;0;L;63C5;;;;N;;;;;
+2F8C1;CJK COMPATIBILITY IDEOGRAPH-2F8C1;Lo;0;L;63A9;;;;N;;;;;
+2F8C2;CJK COMPATIBILITY IDEOGRAPH-2F8C2;Lo;0;L;3A2E;;;;N;;;;;
+2F8C3;CJK COMPATIBILITY IDEOGRAPH-2F8C3;Lo;0;L;6469;;;;N;;;;;
+2F8C4;CJK COMPATIBILITY IDEOGRAPH-2F8C4;Lo;0;L;647E;;;;N;;;;;
+2F8C5;CJK COMPATIBILITY IDEOGRAPH-2F8C5;Lo;0;L;649D;;;;N;;;;;
+2F8C6;CJK COMPATIBILITY IDEOGRAPH-2F8C6;Lo;0;L;6477;;;;N;;;;;
+2F8C7;CJK COMPATIBILITY IDEOGRAPH-2F8C7;Lo;0;L;3A6C;;;;N;;;;;
+2F8C8;CJK COMPATIBILITY IDEOGRAPH-2F8C8;Lo;0;L;654F;;;;N;;;;;
+2F8C9;CJK COMPATIBILITY IDEOGRAPH-2F8C9;Lo;0;L;656C;;;;N;;;;;
+2F8CA;CJK COMPATIBILITY IDEOGRAPH-2F8CA;Lo;0;L;2300A;;;;N;;;;;
+2F8CB;CJK COMPATIBILITY IDEOGRAPH-2F8CB;Lo;0;L;65E3;;;;N;;;;;
+2F8CC;CJK COMPATIBILITY IDEOGRAPH-2F8CC;Lo;0;L;66F8;;;;N;;;;;
+2F8CD;CJK COMPATIBILITY IDEOGRAPH-2F8CD;Lo;0;L;6649;;;;N;;;;;
+2F8CE;CJK COMPATIBILITY IDEOGRAPH-2F8CE;Lo;0;L;3B19;;;;N;;;;;
+2F8CF;CJK COMPATIBILITY IDEOGRAPH-2F8CF;Lo;0;L;6691;;;;N;;;;;
+2F8D0;CJK COMPATIBILITY IDEOGRAPH-2F8D0;Lo;0;L;3B08;;;;N;;;;;
+2F8D1;CJK COMPATIBILITY IDEOGRAPH-2F8D1;Lo;0;L;3AE4;;;;N;;;;;
+2F8D2;CJK COMPATIBILITY IDEOGRAPH-2F8D2;Lo;0;L;5192;;;;N;;;;;
+2F8D3;CJK COMPATIBILITY IDEOGRAPH-2F8D3;Lo;0;L;5195;;;;N;;;;;
+2F8D4;CJK COMPATIBILITY IDEOGRAPH-2F8D4;Lo;0;L;6700;;;;N;;;;;
+2F8D5;CJK COMPATIBILITY IDEOGRAPH-2F8D5;Lo;0;L;669C;;;;N;;;;;
+2F8D6;CJK COMPATIBILITY IDEOGRAPH-2F8D6;Lo;0;L;80AD;;;;N;;;;;
+2F8D7;CJK COMPATIBILITY IDEOGRAPH-2F8D7;Lo;0;L;43D9;;;;N;;;;;
+2F8D8;CJK COMPATIBILITY IDEOGRAPH-2F8D8;Lo;0;L;6717;;;;N;;;;;
+2F8D9;CJK COMPATIBILITY IDEOGRAPH-2F8D9;Lo;0;L;671B;;;;N;;;;;
+2F8DA;CJK COMPATIBILITY IDEOGRAPH-2F8DA;Lo;0;L;6721;;;;N;;;;;
+2F8DB;CJK COMPATIBILITY IDEOGRAPH-2F8DB;Lo;0;L;675E;;;;N;;;;;
+2F8DC;CJK COMPATIBILITY IDEOGRAPH-2F8DC;Lo;0;L;6753;;;;N;;;;;
+2F8DD;CJK COMPATIBILITY IDEOGRAPH-2F8DD;Lo;0;L;233C3;;;;N;;;;;
+2F8DE;CJK COMPATIBILITY IDEOGRAPH-2F8DE;Lo;0;L;3B49;;;;N;;;;;
+2F8DF;CJK COMPATIBILITY IDEOGRAPH-2F8DF;Lo;0;L;67FA;;;;N;;;;;
+2F8E0;CJK COMPATIBILITY IDEOGRAPH-2F8E0;Lo;0;L;6785;;;;N;;;;;
+2F8E1;CJK COMPATIBILITY IDEOGRAPH-2F8E1;Lo;0;L;6852;;;;N;;;;;
+2F8E2;CJK COMPATIBILITY IDEOGRAPH-2F8E2;Lo;0;L;6885;;;;N;;;;;
+2F8E3;CJK COMPATIBILITY IDEOGRAPH-2F8E3;Lo;0;L;2346D;;;;N;;;;;
+2F8E4;CJK COMPATIBILITY IDEOGRAPH-2F8E4;Lo;0;L;688E;;;;N;;;;;
+2F8E5;CJK COMPATIBILITY IDEOGRAPH-2F8E5;Lo;0;L;681F;;;;N;;;;;
+2F8E6;CJK COMPATIBILITY IDEOGRAPH-2F8E6;Lo;0;L;6914;;;;N;;;;;
+2F8E7;CJK COMPATIBILITY IDEOGRAPH-2F8E7;Lo;0;L;3B9D;;;;N;;;;;
+2F8E8;CJK COMPATIBILITY IDEOGRAPH-2F8E8;Lo;0;L;6942;;;;N;;;;;
+2F8E9;CJK COMPATIBILITY IDEOGRAPH-2F8E9;Lo;0;L;69A3;;;;N;;;;;
+2F8EA;CJK COMPATIBILITY IDEOGRAPH-2F8EA;Lo;0;L;69EA;;;;N;;;;;
+2F8EB;CJK COMPATIBILITY IDEOGRAPH-2F8EB;Lo;0;L;6AA8;;;;N;;;;;
+2F8EC;CJK COMPATIBILITY IDEOGRAPH-2F8EC;Lo;0;L;236A3;;;;N;;;;;
+2F8ED;CJK COMPATIBILITY IDEOGRAPH-2F8ED;Lo;0;L;6ADB;;;;N;;;;;
+2F8EE;CJK COMPATIBILITY IDEOGRAPH-2F8EE;Lo;0;L;3C18;;;;N;;;;;
+2F8EF;CJK COMPATIBILITY IDEOGRAPH-2F8EF;Lo;0;L;6B21;;;;N;;;;;
+2F8F0;CJK COMPATIBILITY IDEOGRAPH-2F8F0;Lo;0;L;238A7;;;;N;;;;;
+2F8F1;CJK COMPATIBILITY IDEOGRAPH-2F8F1;Lo;0;L;6B54;;;;N;;;;;
+2F8F2;CJK COMPATIBILITY IDEOGRAPH-2F8F2;Lo;0;L;3C4E;;;;N;;;;;
+2F8F3;CJK COMPATIBILITY IDEOGRAPH-2F8F3;Lo;0;L;6B72;;;;N;;;;;
+2F8F4;CJK COMPATIBILITY IDEOGRAPH-2F8F4;Lo;0;L;6B9F;;;;N;;;;;
+2F8F5;CJK COMPATIBILITY IDEOGRAPH-2F8F5;Lo;0;L;6BBA;;;;N;;;;;
+2F8F6;CJK COMPATIBILITY IDEOGRAPH-2F8F6;Lo;0;L;6BBB;;;;N;;;;;
+2F8F7;CJK COMPATIBILITY IDEOGRAPH-2F8F7;Lo;0;L;23A8D;;;;N;;;;;
+2F8F8;CJK COMPATIBILITY IDEOGRAPH-2F8F8;Lo;0;L;21D0B;;;;N;;;;;
+2F8F9;CJK COMPATIBILITY IDEOGRAPH-2F8F9;Lo;0;L;23AFA;;;;N;;;;;
+2F8FA;CJK COMPATIBILITY IDEOGRAPH-2F8FA;Lo;0;L;6C4E;;;;N;;;;;
+2F8FB;CJK COMPATIBILITY IDEOGRAPH-2F8FB;Lo;0;L;23CBC;;;;N;;;;;
+2F8FC;CJK COMPATIBILITY IDEOGRAPH-2F8FC;Lo;0;L;6CBF;;;;N;;;;;
+2F8FD;CJK COMPATIBILITY IDEOGRAPH-2F8FD;Lo;0;L;6CCD;;;;N;;;;;
+2F8FE;CJK COMPATIBILITY IDEOGRAPH-2F8FE;Lo;0;L;6C67;;;;N;;;;;
+2F8FF;CJK COMPATIBILITY IDEOGRAPH-2F8FF;Lo;0;L;6D16;;;;N;;;;;
+2F900;CJK COMPATIBILITY IDEOGRAPH-2F900;Lo;0;L;6D3E;;;;N;;;;;
+2F901;CJK COMPATIBILITY IDEOGRAPH-2F901;Lo;0;L;6D77;;;;N;;;;;
+2F902;CJK COMPATIBILITY IDEOGRAPH-2F902;Lo;0;L;6D41;;;;N;;;;;
+2F903;CJK COMPATIBILITY IDEOGRAPH-2F903;Lo;0;L;6D69;;;;N;;;;;
+2F904;CJK COMPATIBILITY IDEOGRAPH-2F904;Lo;0;L;6D78;;;;N;;;;;
+2F905;CJK COMPATIBILITY IDEOGRAPH-2F905;Lo;0;L;6D85;;;;N;;;;;
+2F906;CJK COMPATIBILITY IDEOGRAPH-2F906;Lo;0;L;23D1E;;;;N;;;;;
+2F907;CJK COMPATIBILITY IDEOGRAPH-2F907;Lo;0;L;6D34;;;;N;;;;;
+2F908;CJK COMPATIBILITY IDEOGRAPH-2F908;Lo;0;L;6E2F;;;;N;;;;;
+2F909;CJK COMPATIBILITY IDEOGRAPH-2F909;Lo;0;L;6E6E;;;;N;;;;;
+2F90A;CJK COMPATIBILITY IDEOGRAPH-2F90A;Lo;0;L;3D33;;;;N;;;;;
+2F90B;CJK COMPATIBILITY IDEOGRAPH-2F90B;Lo;0;L;6ECB;;;;N;;;;;
+2F90C;CJK COMPATIBILITY IDEOGRAPH-2F90C;Lo;0;L;6EC7;;;;N;;;;;
+2F90D;CJK COMPATIBILITY IDEOGRAPH-2F90D;Lo;0;L;23ED1;;;;N;;;;;
+2F90E;CJK COMPATIBILITY IDEOGRAPH-2F90E;Lo;0;L;6DF9;;;;N;;;;;
+2F90F;CJK COMPATIBILITY IDEOGRAPH-2F90F;Lo;0;L;6F6E;;;;N;;;;;
+2F910;CJK COMPATIBILITY IDEOGRAPH-2F910;Lo;0;L;23F5E;;;;N;;;;;
+2F911;CJK COMPATIBILITY IDEOGRAPH-2F911;Lo;0;L;23F8E;;;;N;;;;;
+2F912;CJK COMPATIBILITY IDEOGRAPH-2F912;Lo;0;L;6FC6;;;;N;;;;;
+2F913;CJK COMPATIBILITY IDEOGRAPH-2F913;Lo;0;L;7039;;;;N;;;;;
+2F914;CJK COMPATIBILITY IDEOGRAPH-2F914;Lo;0;L;701E;;;;N;;;;;
+2F915;CJK COMPATIBILITY IDEOGRAPH-2F915;Lo;0;L;701B;;;;N;;;;;
+2F916;CJK COMPATIBILITY IDEOGRAPH-2F916;Lo;0;L;3D96;;;;N;;;;;
+2F917;CJK COMPATIBILITY IDEOGRAPH-2F917;Lo;0;L;704A;;;;N;;;;;
+2F918;CJK COMPATIBILITY IDEOGRAPH-2F918;Lo;0;L;707D;;;;N;;;;;
+2F919;CJK COMPATIBILITY IDEOGRAPH-2F919;Lo;0;L;7077;;;;N;;;;;
+2F91A;CJK COMPATIBILITY IDEOGRAPH-2F91A;Lo;0;L;70AD;;;;N;;;;;
+2F91B;CJK COMPATIBILITY IDEOGRAPH-2F91B;Lo;0;L;20525;;;;N;;;;;
+2F91C;CJK COMPATIBILITY IDEOGRAPH-2F91C;Lo;0;L;7145;;;;N;;;;;
+2F91D;CJK COMPATIBILITY IDEOGRAPH-2F91D;Lo;0;L;24263;;;;N;;;;;
+2F91E;CJK COMPATIBILITY IDEOGRAPH-2F91E;Lo;0;L;719C;;;;N;;;;;
+2F91F;CJK COMPATIBILITY IDEOGRAPH-2F91F;Lo;0;L;243AB;;;;N;;;;;
+2F920;CJK COMPATIBILITY IDEOGRAPH-2F920;Lo;0;L;7228;;;;N;;;;;
+2F921;CJK COMPATIBILITY IDEOGRAPH-2F921;Lo;0;L;7235;;;;N;;;;;
+2F922;CJK COMPATIBILITY IDEOGRAPH-2F922;Lo;0;L;7250;;;;N;;;;;
+2F923;CJK COMPATIBILITY IDEOGRAPH-2F923;Lo;0;L;24608;;;;N;;;;;
+2F924;CJK COMPATIBILITY IDEOGRAPH-2F924;Lo;0;L;7280;;;;N;;;;;
+2F925;CJK COMPATIBILITY IDEOGRAPH-2F925;Lo;0;L;7295;;;;N;;;;;
+2F926;CJK COMPATIBILITY IDEOGRAPH-2F926;Lo;0;L;24735;;;;N;;;;;
+2F927;CJK COMPATIBILITY IDEOGRAPH-2F927;Lo;0;L;24814;;;;N;;;;;
+2F928;CJK COMPATIBILITY IDEOGRAPH-2F928;Lo;0;L;737A;;;;N;;;;;
+2F929;CJK COMPATIBILITY IDEOGRAPH-2F929;Lo;0;L;738B;;;;N;;;;;
+2F92A;CJK COMPATIBILITY IDEOGRAPH-2F92A;Lo;0;L;3EAC;;;;N;;;;;
+2F92B;CJK COMPATIBILITY IDEOGRAPH-2F92B;Lo;0;L;73A5;;;;N;;;;;
+2F92C;CJK COMPATIBILITY IDEOGRAPH-2F92C;Lo;0;L;3EB8;;;;N;;;;;
+2F92D;CJK COMPATIBILITY IDEOGRAPH-2F92D;Lo;0;L;3EB8;;;;N;;;;;
+2F92E;CJK COMPATIBILITY IDEOGRAPH-2F92E;Lo;0;L;7447;;;;N;;;;;
+2F92F;CJK COMPATIBILITY IDEOGRAPH-2F92F;Lo;0;L;745C;;;;N;;;;;
+2F930;CJK COMPATIBILITY IDEOGRAPH-2F930;Lo;0;L;7471;;;;N;;;;;
+2F931;CJK COMPATIBILITY IDEOGRAPH-2F931;Lo;0;L;7485;;;;N;;;;;
+2F932;CJK COMPATIBILITY IDEOGRAPH-2F932;Lo;0;L;74CA;;;;N;;;;;
+2F933;CJK COMPATIBILITY IDEOGRAPH-2F933;Lo;0;L;3F1B;;;;N;;;;;
+2F934;CJK COMPATIBILITY IDEOGRAPH-2F934;Lo;0;L;7524;;;;N;;;;;
+2F935;CJK COMPATIBILITY IDEOGRAPH-2F935;Lo;0;L;24C36;;;;N;;;;;
+2F936;CJK COMPATIBILITY IDEOGRAPH-2F936;Lo;0;L;753E;;;;N;;;;;
+2F937;CJK COMPATIBILITY IDEOGRAPH-2F937;Lo;0;L;24C92;;;;N;;;;;
+2F938;CJK COMPATIBILITY IDEOGRAPH-2F938;Lo;0;L;7570;;;;N;;;;;
+2F939;CJK COMPATIBILITY IDEOGRAPH-2F939;Lo;0;L;2219F;;;;N;;;;;
+2F93A;CJK COMPATIBILITY IDEOGRAPH-2F93A;Lo;0;L;7610;;;;N;;;;;
+2F93B;CJK COMPATIBILITY IDEOGRAPH-2F93B;Lo;0;L;24FA1;;;;N;;;;;
+2F93C;CJK COMPATIBILITY IDEOGRAPH-2F93C;Lo;0;L;24FB8;;;;N;;;;;
+2F93D;CJK COMPATIBILITY IDEOGRAPH-2F93D;Lo;0;L;25044;;;;N;;;;;
+2F93E;CJK COMPATIBILITY IDEOGRAPH-2F93E;Lo;0;L;3FFC;;;;N;;;;;
+2F93F;CJK COMPATIBILITY IDEOGRAPH-2F93F;Lo;0;L;4008;;;;N;;;;;
+2F940;CJK COMPATIBILITY IDEOGRAPH-2F940;Lo;0;L;76F4;;;;N;;;;;
+2F941;CJK COMPATIBILITY IDEOGRAPH-2F941;Lo;0;L;250F3;;;;N;;;;;
+2F942;CJK COMPATIBILITY IDEOGRAPH-2F942;Lo;0;L;250F2;;;;N;;;;;
+2F943;CJK COMPATIBILITY IDEOGRAPH-2F943;Lo;0;L;25119;;;;N;;;;;
+2F944;CJK COMPATIBILITY IDEOGRAPH-2F944;Lo;0;L;25133;;;;N;;;;;
+2F945;CJK COMPATIBILITY IDEOGRAPH-2F945;Lo;0;L;771E;;;;N;;;;;
+2F946;CJK COMPATIBILITY IDEOGRAPH-2F946;Lo;0;L;771F;;;;N;;;;;
+2F947;CJK COMPATIBILITY IDEOGRAPH-2F947;Lo;0;L;771F;;;;N;;;;;
+2F948;CJK COMPATIBILITY IDEOGRAPH-2F948;Lo;0;L;774A;;;;N;;;;;
+2F949;CJK COMPATIBILITY IDEOGRAPH-2F949;Lo;0;L;4039;;;;N;;;;;
+2F94A;CJK COMPATIBILITY IDEOGRAPH-2F94A;Lo;0;L;778B;;;;N;;;;;
+2F94B;CJK COMPATIBILITY IDEOGRAPH-2F94B;Lo;0;L;4046;;;;N;;;;;
+2F94C;CJK COMPATIBILITY IDEOGRAPH-2F94C;Lo;0;L;4096;;;;N;;;;;
+2F94D;CJK COMPATIBILITY IDEOGRAPH-2F94D;Lo;0;L;2541D;;;;N;;;;;
+2F94E;CJK COMPATIBILITY IDEOGRAPH-2F94E;Lo;0;L;784E;;;;N;;;;;
+2F94F;CJK COMPATIBILITY IDEOGRAPH-2F94F;Lo;0;L;788C;;;;N;;;;;
+2F950;CJK COMPATIBILITY IDEOGRAPH-2F950;Lo;0;L;78CC;;;;N;;;;;
+2F951;CJK COMPATIBILITY IDEOGRAPH-2F951;Lo;0;L;40E3;;;;N;;;;;
+2F952;CJK COMPATIBILITY IDEOGRAPH-2F952;Lo;0;L;25626;;;;N;;;;;
+2F953;CJK COMPATIBILITY IDEOGRAPH-2F953;Lo;0;L;7956;;;;N;;;;;
+2F954;CJK COMPATIBILITY IDEOGRAPH-2F954;Lo;0;L;2569A;;;;N;;;;;
+2F955;CJK COMPATIBILITY IDEOGRAPH-2F955;Lo;0;L;256C5;;;;N;;;;;
+2F956;CJK COMPATIBILITY IDEOGRAPH-2F956;Lo;0;L;798F;;;;N;;;;;
+2F957;CJK COMPATIBILITY IDEOGRAPH-2F957;Lo;0;L;79EB;;;;N;;;;;
+2F958;CJK COMPATIBILITY IDEOGRAPH-2F958;Lo;0;L;412F;;;;N;;;;;
+2F959;CJK COMPATIBILITY IDEOGRAPH-2F959;Lo;0;L;7A40;;;;N;;;;;
+2F95A;CJK COMPATIBILITY IDEOGRAPH-2F95A;Lo;0;L;7A4A;;;;N;;;;;
+2F95B;CJK COMPATIBILITY IDEOGRAPH-2F95B;Lo;0;L;7A4F;;;;N;;;;;
+2F95C;CJK COMPATIBILITY IDEOGRAPH-2F95C;Lo;0;L;2597C;;;;N;;;;;
+2F95D;CJK COMPATIBILITY IDEOGRAPH-2F95D;Lo;0;L;25AA7;;;;N;;;;;
+2F95E;CJK COMPATIBILITY IDEOGRAPH-2F95E;Lo;0;L;25AA7;;;;N;;;;;
+2F95F;CJK COMPATIBILITY IDEOGRAPH-2F95F;Lo;0;L;7AEE;;;;N;;;;;
+2F960;CJK COMPATIBILITY IDEOGRAPH-2F960;Lo;0;L;4202;;;;N;;;;;
+2F961;CJK COMPATIBILITY IDEOGRAPH-2F961;Lo;0;L;25BAB;;;;N;;;;;
+2F962;CJK COMPATIBILITY IDEOGRAPH-2F962;Lo;0;L;7BC6;;;;N;;;;;
+2F963;CJK COMPATIBILITY IDEOGRAPH-2F963;Lo;0;L;7BC9;;;;N;;;;;
+2F964;CJK COMPATIBILITY IDEOGRAPH-2F964;Lo;0;L;4227;;;;N;;;;;
+2F965;CJK COMPATIBILITY IDEOGRAPH-2F965;Lo;0;L;25C80;;;;N;;;;;
+2F966;CJK COMPATIBILITY IDEOGRAPH-2F966;Lo;0;L;7CD2;;;;N;;;;;
+2F967;CJK COMPATIBILITY IDEOGRAPH-2F967;Lo;0;L;42A0;;;;N;;;;;
+2F968;CJK COMPATIBILITY IDEOGRAPH-2F968;Lo;0;L;7CE8;;;;N;;;;;
+2F969;CJK COMPATIBILITY IDEOGRAPH-2F969;Lo;0;L;7CE3;;;;N;;;;;
+2F96A;CJK COMPATIBILITY IDEOGRAPH-2F96A;Lo;0;L;7D00;;;;N;;;;;
+2F96B;CJK COMPATIBILITY IDEOGRAPH-2F96B;Lo;0;L;25F86;;;;N;;;;;
+2F96C;CJK COMPATIBILITY IDEOGRAPH-2F96C;Lo;0;L;7D63;;;;N;;;;;
+2F96D;CJK COMPATIBILITY IDEOGRAPH-2F96D;Lo;0;L;4301;;;;N;;;;;
+2F96E;CJK COMPATIBILITY IDEOGRAPH-2F96E;Lo;0;L;7DC7;;;;N;;;;;
+2F96F;CJK COMPATIBILITY IDEOGRAPH-2F96F;Lo;0;L;7E02;;;;N;;;;;
+2F970;CJK COMPATIBILITY IDEOGRAPH-2F970;Lo;0;L;7E45;;;;N;;;;;
+2F971;CJK COMPATIBILITY IDEOGRAPH-2F971;Lo;0;L;4334;;;;N;;;;;
+2F972;CJK COMPATIBILITY IDEOGRAPH-2F972;Lo;0;L;26228;;;;N;;;;;
+2F973;CJK COMPATIBILITY IDEOGRAPH-2F973;Lo;0;L;26247;;;;N;;;;;
+2F974;CJK COMPATIBILITY IDEOGRAPH-2F974;Lo;0;L;4359;;;;N;;;;;
+2F975;CJK COMPATIBILITY IDEOGRAPH-2F975;Lo;0;L;262D9;;;;N;;;;;
+2F976;CJK COMPATIBILITY IDEOGRAPH-2F976;Lo;0;L;7F7A;;;;N;;;;;
+2F977;CJK COMPATIBILITY IDEOGRAPH-2F977;Lo;0;L;2633E;;;;N;;;;;
+2F978;CJK COMPATIBILITY IDEOGRAPH-2F978;Lo;0;L;7F95;;;;N;;;;;
+2F979;CJK COMPATIBILITY IDEOGRAPH-2F979;Lo;0;L;7FFA;;;;N;;;;;
+2F97A;CJK COMPATIBILITY IDEOGRAPH-2F97A;Lo;0;L;8005;;;;N;;;;;
+2F97B;CJK COMPATIBILITY IDEOGRAPH-2F97B;Lo;0;L;264DA;;;;N;;;;;
+2F97C;CJK COMPATIBILITY IDEOGRAPH-2F97C;Lo;0;L;26523;;;;N;;;;;
+2F97D;CJK COMPATIBILITY IDEOGRAPH-2F97D;Lo;0;L;8060;;;;N;;;;;
+2F97E;CJK COMPATIBILITY IDEOGRAPH-2F97E;Lo;0;L;265A8;;;;N;;;;;
+2F97F;CJK COMPATIBILITY IDEOGRAPH-2F97F;Lo;0;L;8070;;;;N;;;;;
+2F980;CJK COMPATIBILITY IDEOGRAPH-2F980;Lo;0;L;2335F;;;;N;;;;;
+2F981;CJK COMPATIBILITY IDEOGRAPH-2F981;Lo;0;L;43D5;;;;N;;;;;
+2F982;CJK COMPATIBILITY IDEOGRAPH-2F982;Lo;0;L;80B2;;;;N;;;;;
+2F983;CJK COMPATIBILITY IDEOGRAPH-2F983;Lo;0;L;8103;;;;N;;;;;
+2F984;CJK COMPATIBILITY IDEOGRAPH-2F984;Lo;0;L;440B;;;;N;;;;;
+2F985;CJK COMPATIBILITY IDEOGRAPH-2F985;Lo;0;L;813E;;;;N;;;;;
+2F986;CJK COMPATIBILITY IDEOGRAPH-2F986;Lo;0;L;5AB5;;;;N;;;;;
+2F987;CJK COMPATIBILITY IDEOGRAPH-2F987;Lo;0;L;267A7;;;;N;;;;;
+2F988;CJK COMPATIBILITY IDEOGRAPH-2F988;Lo;0;L;267B5;;;;N;;;;;
+2F989;CJK COMPATIBILITY IDEOGRAPH-2F989;Lo;0;L;23393;;;;N;;;;;
+2F98A;CJK COMPATIBILITY IDEOGRAPH-2F98A;Lo;0;L;2339C;;;;N;;;;;
+2F98B;CJK COMPATIBILITY IDEOGRAPH-2F98B;Lo;0;L;8201;;;;N;;;;;
+2F98C;CJK COMPATIBILITY IDEOGRAPH-2F98C;Lo;0;L;8204;;;;N;;;;;
+2F98D;CJK COMPATIBILITY IDEOGRAPH-2F98D;Lo;0;L;8F9E;;;;N;;;;;
+2F98E;CJK COMPATIBILITY IDEOGRAPH-2F98E;Lo;0;L;446B;;;;N;;;;;
+2F98F;CJK COMPATIBILITY IDEOGRAPH-2F98F;Lo;0;L;8291;;;;N;;;;;
+2F990;CJK COMPATIBILITY IDEOGRAPH-2F990;Lo;0;L;828B;;;;N;;;;;
+2F991;CJK COMPATIBILITY IDEOGRAPH-2F991;Lo;0;L;829D;;;;N;;;;;
+2F992;CJK COMPATIBILITY IDEOGRAPH-2F992;Lo;0;L;52B3;;;;N;;;;;
+2F993;CJK COMPATIBILITY IDEOGRAPH-2F993;Lo;0;L;82B1;;;;N;;;;;
+2F994;CJK COMPATIBILITY IDEOGRAPH-2F994;Lo;0;L;82B3;;;;N;;;;;
+2F995;CJK COMPATIBILITY IDEOGRAPH-2F995;Lo;0;L;82BD;;;;N;;;;;
+2F996;CJK COMPATIBILITY IDEOGRAPH-2F996;Lo;0;L;82E6;;;;N;;;;;
+2F997;CJK COMPATIBILITY IDEOGRAPH-2F997;Lo;0;L;26B3C;;;;N;;;;;
+2F998;CJK COMPATIBILITY IDEOGRAPH-2F998;Lo;0;L;82E5;;;;N;;;;;
+2F999;CJK COMPATIBILITY IDEOGRAPH-2F999;Lo;0;L;831D;;;;N;;;;;
+2F99A;CJK COMPATIBILITY IDEOGRAPH-2F99A;Lo;0;L;8363;;;;N;;;;;
+2F99B;CJK COMPATIBILITY IDEOGRAPH-2F99B;Lo;0;L;83AD;;;;N;;;;;
+2F99C;CJK COMPATIBILITY IDEOGRAPH-2F99C;Lo;0;L;8323;;;;N;;;;;
+2F99D;CJK COMPATIBILITY IDEOGRAPH-2F99D;Lo;0;L;83BD;;;;N;;;;;
+2F99E;CJK COMPATIBILITY IDEOGRAPH-2F99E;Lo;0;L;83E7;;;;N;;;;;
+2F99F;CJK COMPATIBILITY IDEOGRAPH-2F99F;Lo;0;L;8457;;;;N;;;;;
+2F9A0;CJK COMPATIBILITY IDEOGRAPH-2F9A0;Lo;0;L;8353;;;;N;;;;;
+2F9A1;CJK COMPATIBILITY IDEOGRAPH-2F9A1;Lo;0;L;83CA;;;;N;;;;;
+2F9A2;CJK COMPATIBILITY IDEOGRAPH-2F9A2;Lo;0;L;83CC;;;;N;;;;;
+2F9A3;CJK COMPATIBILITY IDEOGRAPH-2F9A3;Lo;0;L;83DC;;;;N;;;;;
+2F9A4;CJK COMPATIBILITY IDEOGRAPH-2F9A4;Lo;0;L;26C36;;;;N;;;;;
+2F9A5;CJK COMPATIBILITY IDEOGRAPH-2F9A5;Lo;0;L;26D6B;;;;N;;;;;
+2F9A6;CJK COMPATIBILITY IDEOGRAPH-2F9A6;Lo;0;L;26CD5;;;;N;;;;;
+2F9A7;CJK COMPATIBILITY IDEOGRAPH-2F9A7;Lo;0;L;452B;;;;N;;;;;
+2F9A8;CJK COMPATIBILITY IDEOGRAPH-2F9A8;Lo;0;L;84F1;;;;N;;;;;
+2F9A9;CJK COMPATIBILITY IDEOGRAPH-2F9A9;Lo;0;L;84F3;;;;N;;;;;
+2F9AA;CJK COMPATIBILITY IDEOGRAPH-2F9AA;Lo;0;L;8516;;;;N;;;;;
+2F9AB;CJK COMPATIBILITY IDEOGRAPH-2F9AB;Lo;0;L;273CA;;;;N;;;;;
+2F9AC;CJK COMPATIBILITY IDEOGRAPH-2F9AC;Lo;0;L;8564;;;;N;;;;;
+2F9AD;CJK COMPATIBILITY IDEOGRAPH-2F9AD;Lo;0;L;26F2C;;;;N;;;;;
+2F9AE;CJK COMPATIBILITY IDEOGRAPH-2F9AE;Lo;0;L;455D;;;;N;;;;;
+2F9AF;CJK COMPATIBILITY IDEOGRAPH-2F9AF;Lo;0;L;4561;;;;N;;;;;
+2F9B0;CJK COMPATIBILITY IDEOGRAPH-2F9B0;Lo;0;L;26FB1;;;;N;;;;;
+2F9B1;CJK COMPATIBILITY IDEOGRAPH-2F9B1;Lo;0;L;270D2;;;;N;;;;;
+2F9B2;CJK COMPATIBILITY IDEOGRAPH-2F9B2;Lo;0;L;456B;;;;N;;;;;
+2F9B3;CJK COMPATIBILITY IDEOGRAPH-2F9B3;Lo;0;L;8650;;;;N;;;;;
+2F9B4;CJK COMPATIBILITY IDEOGRAPH-2F9B4;Lo;0;L;865C;;;;N;;;;;
+2F9B5;CJK COMPATIBILITY IDEOGRAPH-2F9B5;Lo;0;L;8667;;;;N;;;;;
+2F9B6;CJK COMPATIBILITY IDEOGRAPH-2F9B6;Lo;0;L;8669;;;;N;;;;;
+2F9B7;CJK COMPATIBILITY IDEOGRAPH-2F9B7;Lo;0;L;86A9;;;;N;;;;;
+2F9B8;CJK COMPATIBILITY IDEOGRAPH-2F9B8;Lo;0;L;8688;;;;N;;;;;
+2F9B9;CJK COMPATIBILITY IDEOGRAPH-2F9B9;Lo;0;L;870E;;;;N;;;;;
+2F9BA;CJK COMPATIBILITY IDEOGRAPH-2F9BA;Lo;0;L;86E2;;;;N;;;;;
+2F9BB;CJK COMPATIBILITY IDEOGRAPH-2F9BB;Lo;0;L;8779;;;;N;;;;;
+2F9BC;CJK COMPATIBILITY IDEOGRAPH-2F9BC;Lo;0;L;8728;;;;N;;;;;
+2F9BD;CJK COMPATIBILITY IDEOGRAPH-2F9BD;Lo;0;L;876B;;;;N;;;;;
+2F9BE;CJK COMPATIBILITY IDEOGRAPH-2F9BE;Lo;0;L;8786;;;;N;;;;;
+2F9BF;CJK COMPATIBILITY IDEOGRAPH-2F9BF;Lo;0;L;45D7;;;;N;;;;;
+2F9C0;CJK COMPATIBILITY IDEOGRAPH-2F9C0;Lo;0;L;87E1;;;;N;;;;;
+2F9C1;CJK COMPATIBILITY IDEOGRAPH-2F9C1;Lo;0;L;8801;;;;N;;;;;
+2F9C2;CJK COMPATIBILITY IDEOGRAPH-2F9C2;Lo;0;L;45F9;;;;N;;;;;
+2F9C3;CJK COMPATIBILITY IDEOGRAPH-2F9C3;Lo;0;L;8860;;;;N;;;;;
+2F9C4;CJK COMPATIBILITY IDEOGRAPH-2F9C4;Lo;0;L;8863;;;;N;;;;;
+2F9C5;CJK COMPATIBILITY IDEOGRAPH-2F9C5;Lo;0;L;27667;;;;N;;;;;
+2F9C6;CJK COMPATIBILITY IDEOGRAPH-2F9C6;Lo;0;L;88D7;;;;N;;;;;
+2F9C7;CJK COMPATIBILITY IDEOGRAPH-2F9C7;Lo;0;L;88DE;;;;N;;;;;
+2F9C8;CJK COMPATIBILITY IDEOGRAPH-2F9C8;Lo;0;L;4635;;;;N;;;;;
+2F9C9;CJK COMPATIBILITY IDEOGRAPH-2F9C9;Lo;0;L;88FA;;;;N;;;;;
+2F9CA;CJK COMPATIBILITY IDEOGRAPH-2F9CA;Lo;0;L;34BB;;;;N;;;;;
+2F9CB;CJK COMPATIBILITY IDEOGRAPH-2F9CB;Lo;0;L;278AE;;;;N;;;;;
+2F9CC;CJK COMPATIBILITY IDEOGRAPH-2F9CC;Lo;0;L;27966;;;;N;;;;;
+2F9CD;CJK COMPATIBILITY IDEOGRAPH-2F9CD;Lo;0;L;46BE;;;;N;;;;;
+2F9CE;CJK COMPATIBILITY IDEOGRAPH-2F9CE;Lo;0;L;46C7;;;;N;;;;;
+2F9CF;CJK COMPATIBILITY IDEOGRAPH-2F9CF;Lo;0;L;8AA0;;;;N;;;;;
+2F9D0;CJK COMPATIBILITY IDEOGRAPH-2F9D0;Lo;0;L;8AED;;;;N;;;;;
+2F9D1;CJK COMPATIBILITY IDEOGRAPH-2F9D1;Lo;0;L;8B8A;;;;N;;;;;
+2F9D2;CJK COMPATIBILITY IDEOGRAPH-2F9D2;Lo;0;L;8C55;;;;N;;;;;
+2F9D3;CJK COMPATIBILITY IDEOGRAPH-2F9D3;Lo;0;L;27CA8;;;;N;;;;;
+2F9D4;CJK COMPATIBILITY IDEOGRAPH-2F9D4;Lo;0;L;8CAB;;;;N;;;;;
+2F9D5;CJK COMPATIBILITY IDEOGRAPH-2F9D5;Lo;0;L;8CC1;;;;N;;;;;
+2F9D6;CJK COMPATIBILITY IDEOGRAPH-2F9D6;Lo;0;L;8D1B;;;;N;;;;;
+2F9D7;CJK COMPATIBILITY IDEOGRAPH-2F9D7;Lo;0;L;8D77;;;;N;;;;;
+2F9D8;CJK COMPATIBILITY IDEOGRAPH-2F9D8;Lo;0;L;27F2F;;;;N;;;;;
+2F9D9;CJK COMPATIBILITY IDEOGRAPH-2F9D9;Lo;0;L;20804;;;;N;;;;;
+2F9DA;CJK COMPATIBILITY IDEOGRAPH-2F9DA;Lo;0;L;8DCB;;;;N;;;;;
+2F9DB;CJK COMPATIBILITY IDEOGRAPH-2F9DB;Lo;0;L;8DBC;;;;N;;;;;
+2F9DC;CJK COMPATIBILITY IDEOGRAPH-2F9DC;Lo;0;L;8DF0;;;;N;;;;;
+2F9DD;CJK COMPATIBILITY IDEOGRAPH-2F9DD;Lo;0;L;208DE;;;;N;;;;;
+2F9DE;CJK COMPATIBILITY IDEOGRAPH-2F9DE;Lo;0;L;8ED4;;;;N;;;;;
+2F9DF;CJK COMPATIBILITY IDEOGRAPH-2F9DF;Lo;0;L;8F38;;;;N;;;;;
+2F9E0;CJK COMPATIBILITY IDEOGRAPH-2F9E0;Lo;0;L;285D2;;;;N;;;;;
+2F9E1;CJK COMPATIBILITY IDEOGRAPH-2F9E1;Lo;0;L;285ED;;;;N;;;;;
+2F9E2;CJK COMPATIBILITY IDEOGRAPH-2F9E2;Lo;0;L;9094;;;;N;;;;;
+2F9E3;CJK COMPATIBILITY IDEOGRAPH-2F9E3;Lo;0;L;90F1;;;;N;;;;;
+2F9E4;CJK COMPATIBILITY IDEOGRAPH-2F9E4;Lo;0;L;9111;;;;N;;;;;
+2F9E5;CJK COMPATIBILITY IDEOGRAPH-2F9E5;Lo;0;L;2872E;;;;N;;;;;
+2F9E6;CJK COMPATIBILITY IDEOGRAPH-2F9E6;Lo;0;L;911B;;;;N;;;;;
+2F9E7;CJK COMPATIBILITY IDEOGRAPH-2F9E7;Lo;0;L;9238;;;;N;;;;;
+2F9E8;CJK COMPATIBILITY IDEOGRAPH-2F9E8;Lo;0;L;92D7;;;;N;;;;;
+2F9E9;CJK COMPATIBILITY IDEOGRAPH-2F9E9;Lo;0;L;92D8;;;;N;;;;;
+2F9EA;CJK COMPATIBILITY IDEOGRAPH-2F9EA;Lo;0;L;927C;;;;N;;;;;
+2F9EB;CJK COMPATIBILITY IDEOGRAPH-2F9EB;Lo;0;L;93F9;;;;N;;;;;
+2F9EC;CJK COMPATIBILITY IDEOGRAPH-2F9EC;Lo;0;L;9415;;;;N;;;;;
+2F9ED;CJK COMPATIBILITY IDEOGRAPH-2F9ED;Lo;0;L;28BFA;;;;N;;;;;
+2F9EE;CJK COMPATIBILITY IDEOGRAPH-2F9EE;Lo;0;L;958B;;;;N;;;;;
+2F9EF;CJK COMPATIBILITY IDEOGRAPH-2F9EF;Lo;0;L;4995;;;;N;;;;;
+2F9F0;CJK COMPATIBILITY IDEOGRAPH-2F9F0;Lo;0;L;95B7;;;;N;;;;;
+2F9F1;CJK COMPATIBILITY IDEOGRAPH-2F9F1;Lo;0;L;28D77;;;;N;;;;;
+2F9F2;CJK COMPATIBILITY IDEOGRAPH-2F9F2;Lo;0;L;49E6;;;;N;;;;;
+2F9F3;CJK COMPATIBILITY IDEOGRAPH-2F9F3;Lo;0;L;96C3;;;;N;;;;;
+2F9F4;CJK COMPATIBILITY IDEOGRAPH-2F9F4;Lo;0;L;5DB2;;;;N;;;;;
+2F9F5;CJK COMPATIBILITY IDEOGRAPH-2F9F5;Lo;0;L;9723;;;;N;;;;;
+2F9F6;CJK COMPATIBILITY IDEOGRAPH-2F9F6;Lo;0;L;29145;;;;N;;;;;
+2F9F7;CJK COMPATIBILITY IDEOGRAPH-2F9F7;Lo;0;L;2921A;;;;N;;;;;
+2F9F8;CJK COMPATIBILITY IDEOGRAPH-2F9F8;Lo;0;L;4A6E;;;;N;;;;;
+2F9F9;CJK COMPATIBILITY IDEOGRAPH-2F9F9;Lo;0;L;4A76;;;;N;;;;;
+2F9FA;CJK COMPATIBILITY IDEOGRAPH-2F9FA;Lo;0;L;97E0;;;;N;;;;;
+2F9FB;CJK COMPATIBILITY IDEOGRAPH-2F9FB;Lo;0;L;2940A;;;;N;;;;;
+2F9FC;CJK COMPATIBILITY IDEOGRAPH-2F9FC;Lo;0;L;4AB2;;;;N;;;;;
+2F9FD;CJK COMPATIBILITY IDEOGRAPH-2F9FD;Lo;0;L;29496;;;;N;;;;;
+2F9FE;CJK COMPATIBILITY IDEOGRAPH-2F9FE;Lo;0;L;980B;;;;N;;;;;
+2F9FF;CJK COMPATIBILITY IDEOGRAPH-2F9FF;Lo;0;L;980B;;;;N;;;;;
+2FA00;CJK COMPATIBILITY IDEOGRAPH-2FA00;Lo;0;L;9829;;;;N;;;;;
+2FA01;CJK COMPATIBILITY IDEOGRAPH-2FA01;Lo;0;L;295B6;;;;N;;;;;
+2FA02;CJK COMPATIBILITY IDEOGRAPH-2FA02;Lo;0;L;98E2;;;;N;;;;;
+2FA03;CJK COMPATIBILITY IDEOGRAPH-2FA03;Lo;0;L;4B33;;;;N;;;;;
+2FA04;CJK COMPATIBILITY IDEOGRAPH-2FA04;Lo;0;L;9929;;;;N;;;;;
+2FA05;CJK COMPATIBILITY IDEOGRAPH-2FA05;Lo;0;L;99A7;;;;N;;;;;
+2FA06;CJK COMPATIBILITY IDEOGRAPH-2FA06;Lo;0;L;99C2;;;;N;;;;;
+2FA07;CJK COMPATIBILITY IDEOGRAPH-2FA07;Lo;0;L;99FE;;;;N;;;;;
+2FA08;CJK COMPATIBILITY IDEOGRAPH-2FA08;Lo;0;L;4BCE;;;;N;;;;;
+2FA09;CJK COMPATIBILITY IDEOGRAPH-2FA09;Lo;0;L;29B30;;;;N;;;;;
+2FA0A;CJK COMPATIBILITY IDEOGRAPH-2FA0A;Lo;0;L;9B12;;;;N;;;;;
+2FA0B;CJK COMPATIBILITY IDEOGRAPH-2FA0B;Lo;0;L;9C40;;;;N;;;;;
+2FA0C;CJK COMPATIBILITY IDEOGRAPH-2FA0C;Lo;0;L;9CFD;;;;N;;;;;
+2FA0D;CJK COMPATIBILITY IDEOGRAPH-2FA0D;Lo;0;L;4CCE;;;;N;;;;;
+2FA0E;CJK COMPATIBILITY IDEOGRAPH-2FA0E;Lo;0;L;4CED;;;;N;;;;;
+2FA0F;CJK COMPATIBILITY IDEOGRAPH-2FA0F;Lo;0;L;9D67;;;;N;;;;;
+2FA10;CJK COMPATIBILITY IDEOGRAPH-2FA10;Lo;0;L;2A0CE;;;;N;;;;;
+2FA11;CJK COMPATIBILITY IDEOGRAPH-2FA11;Lo;0;L;4CF8;;;;N;;;;;
+2FA12;CJK COMPATIBILITY IDEOGRAPH-2FA12;Lo;0;L;2A105;;;;N;;;;;
+2FA13;CJK COMPATIBILITY IDEOGRAPH-2FA13;Lo;0;L;2A20E;;;;N;;;;;
+2FA14;CJK COMPATIBILITY IDEOGRAPH-2FA14;Lo;0;L;2A291;;;;N;;;;;
+2FA15;CJK COMPATIBILITY IDEOGRAPH-2FA15;Lo;0;L;9EBB;;;;N;;;;;
+2FA16;CJK COMPATIBILITY IDEOGRAPH-2FA16;Lo;0;L;4D56;;;;N;;;;;
+2FA17;CJK COMPATIBILITY IDEOGRAPH-2FA17;Lo;0;L;9EF9;;;;N;;;;;
+2FA18;CJK COMPATIBILITY IDEOGRAPH-2FA18;Lo;0;L;9EFE;;;;N;;;;;
+2FA19;CJK COMPATIBILITY IDEOGRAPH-2FA19;Lo;0;L;9F05;;;;N;;;;;
+2FA1A;CJK COMPATIBILITY IDEOGRAPH-2FA1A;Lo;0;L;9F0F;;;;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;;;;;
+E0001;LANGUAGE TAG;Cf;0;BN;;;;;N;;;;;
+E0020;TAG SPACE;Cf;0;BN;;;;;N;;;;;
+E0021;TAG EXCLAMATION MARK;Cf;0;BN;;;;;N;;;;;
+E0022;TAG QUOTATION MARK;Cf;0;BN;;;;;N;;;;;
+E0023;TAG NUMBER SIGN;Cf;0;BN;;;;;N;;;;;
+E0024;TAG DOLLAR SIGN;Cf;0;BN;;;;;N;;;;;
+E0025;TAG PERCENT SIGN;Cf;0;BN;;;;;N;;;;;
+E0026;TAG AMPERSAND;Cf;0;BN;;;;;N;;;;;
+E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;;
+E0028;TAG LEFT PARENTHESIS;Cf;0;BN;;;;;N;;;;;
+E0029;TAG RIGHT PARENTHESIS;Cf;0;BN;;;;;N;;;;;
+E002A;TAG ASTERISK;Cf;0;BN;;;;;N;;;;;
+E002B;TAG PLUS SIGN;Cf;0;BN;;;;;N;;;;;
+E002C;TAG COMMA;Cf;0;BN;;;;;N;;;;;
+E002D;TAG HYPHEN-MINUS;Cf;0;BN;;;;;N;;;;;
+E002E;TAG FULL STOP;Cf;0;BN;;;;;N;;;;;
+E002F;TAG SOLIDUS;Cf;0;BN;;;;;N;;;;;
+E0030;TAG DIGIT ZERO;Cf;0;BN;;;;;N;;;;;
+E0031;TAG DIGIT ONE;Cf;0;BN;;;;;N;;;;;
+E0032;TAG DIGIT TWO;Cf;0;BN;;;;;N;;;;;
+E0033;TAG DIGIT THREE;Cf;0;BN;;;;;N;;;;;
+E0034;TAG DIGIT FOUR;Cf;0;BN;;;;;N;;;;;
+E0035;TAG DIGIT FIVE;Cf;0;BN;;;;;N;;;;;
+E0036;TAG DIGIT SIX;Cf;0;BN;;;;;N;;;;;
+E0037;TAG DIGIT SEVEN;Cf;0;BN;;;;;N;;;;;
+E0038;TAG DIGIT EIGHT;Cf;0;BN;;;;;N;;;;;
+E0039;TAG DIGIT NINE;Cf;0;BN;;;;;N;;;;;
+E003A;TAG COLON;Cf;0;BN;;;;;N;;;;;
+E003B;TAG SEMICOLON;Cf;0;BN;;;;;N;;;;;
+E003C;TAG LESS-THAN SIGN;Cf;0;BN;;;;;N;;;;;
+E003D;TAG EQUALS SIGN;Cf;0;BN;;;;;N;;;;;
+E003E;TAG GREATER-THAN SIGN;Cf;0;BN;;;;;N;;;;;
+E003F;TAG QUESTION MARK;Cf;0;BN;;;;;N;;;;;
+E0040;TAG COMMERCIAL AT;Cf;0;BN;;;;;N;;;;;
+E0041;TAG LATIN CAPITAL LETTER A;Cf;0;BN;;;;;N;;;;;
+E0042;TAG LATIN CAPITAL LETTER B;Cf;0;BN;;;;;N;;;;;
+E0043;TAG LATIN CAPITAL LETTER C;Cf;0;BN;;;;;N;;;;;
+E0044;TAG LATIN CAPITAL LETTER D;Cf;0;BN;;;;;N;;;;;
+E0045;TAG LATIN CAPITAL LETTER E;Cf;0;BN;;;;;N;;;;;
+E0046;TAG LATIN CAPITAL LETTER F;Cf;0;BN;;;;;N;;;;;
+E0047;TAG LATIN CAPITAL LETTER G;Cf;0;BN;;;;;N;;;;;
+E0048;TAG LATIN CAPITAL LETTER H;Cf;0;BN;;;;;N;;;;;
+E0049;TAG LATIN CAPITAL LETTER I;Cf;0;BN;;;;;N;;;;;
+E004A;TAG LATIN CAPITAL LETTER J;Cf;0;BN;;;;;N;;;;;
+E004B;TAG LATIN CAPITAL LETTER K;Cf;0;BN;;;;;N;;;;;
+E004C;TAG LATIN CAPITAL LETTER L;Cf;0;BN;;;;;N;;;;;
+E004D;TAG LATIN CAPITAL LETTER M;Cf;0;BN;;;;;N;;;;;
+E004E;TAG LATIN CAPITAL LETTER N;Cf;0;BN;;;;;N;;;;;
+E004F;TAG LATIN CAPITAL LETTER O;Cf;0;BN;;;;;N;;;;;
+E0050;TAG LATIN CAPITAL LETTER P;Cf;0;BN;;;;;N;;;;;
+E0051;TAG LATIN CAPITAL LETTER Q;Cf;0;BN;;;;;N;;;;;
+E0052;TAG LATIN CAPITAL LETTER R;Cf;0;BN;;;;;N;;;;;
+E0053;TAG LATIN CAPITAL LETTER S;Cf;0;BN;;;;;N;;;;;
+E0054;TAG LATIN CAPITAL LETTER T;Cf;0;BN;;;;;N;;;;;
+E0055;TAG LATIN CAPITAL LETTER U;Cf;0;BN;;;;;N;;;;;
+E0056;TAG LATIN CAPITAL LETTER V;Cf;0;BN;;;;;N;;;;;
+E0057;TAG LATIN CAPITAL LETTER W;Cf;0;BN;;;;;N;;;;;
+E0058;TAG LATIN CAPITAL LETTER X;Cf;0;BN;;;;;N;;;;;
+E0059;TAG LATIN CAPITAL LETTER Y;Cf;0;BN;;;;;N;;;;;
+E005A;TAG LATIN CAPITAL LETTER Z;Cf;0;BN;;;;;N;;;;;
+E005B;TAG LEFT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;;
+E005C;TAG REVERSE SOLIDUS;Cf;0;BN;;;;;N;;;;;
+E005D;TAG RIGHT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;;
+E005E;TAG CIRCUMFLEX ACCENT;Cf;0;BN;;;;;N;;;;;
+E005F;TAG LOW LINE;Cf;0;BN;;;;;N;;;;;
+E0060;TAG GRAVE ACCENT;Cf;0;BN;;;;;N;;;;;
+E0061;TAG LATIN SMALL LETTER A;Cf;0;BN;;;;;N;;;;;
+E0062;TAG LATIN SMALL LETTER B;Cf;0;BN;;;;;N;;;;;
+E0063;TAG LATIN SMALL LETTER C;Cf;0;BN;;;;;N;;;;;
+E0064;TAG LATIN SMALL LETTER D;Cf;0;BN;;;;;N;;;;;
+E0065;TAG LATIN SMALL LETTER E;Cf;0;BN;;;;;N;;;;;
+E0066;TAG LATIN SMALL LETTER F;Cf;0;BN;;;;;N;;;;;
+E0067;TAG LATIN SMALL LETTER G;Cf;0;BN;;;;;N;;;;;
+E0068;TAG LATIN SMALL LETTER H;Cf;0;BN;;;;;N;;;;;
+E0069;TAG LATIN SMALL LETTER I;Cf;0;BN;;;;;N;;;;;
+E006A;TAG LATIN SMALL LETTER J;Cf;0;BN;;;;;N;;;;;
+E006B;TAG LATIN SMALL LETTER K;Cf;0;BN;;;;;N;;;;;
+E006C;TAG LATIN SMALL LETTER L;Cf;0;BN;;;;;N;;;;;
+E006D;TAG LATIN SMALL LETTER M;Cf;0;BN;;;;;N;;;;;
+E006E;TAG LATIN SMALL LETTER N;Cf;0;BN;;;;;N;;;;;
+E006F;TAG LATIN SMALL LETTER O;Cf;0;BN;;;;;N;;;;;
+E0070;TAG LATIN SMALL LETTER P;Cf;0;BN;;;;;N;;;;;
+E0071;TAG LATIN SMALL LETTER Q;Cf;0;BN;;;;;N;;;;;
+E0072;TAG LATIN SMALL LETTER R;Cf;0;BN;;;;;N;;;;;
+E0073;TAG LATIN SMALL LETTER S;Cf;0;BN;;;;;N;;;;;
+E0074;TAG LATIN SMALL LETTER T;Cf;0;BN;;;;;N;;;;;
+E0075;TAG LATIN SMALL LETTER U;Cf;0;BN;;;;;N;;;;;
+E0076;TAG LATIN SMALL LETTER V;Cf;0;BN;;;;;N;;;;;
+E0077;TAG LATIN SMALL LETTER W;Cf;0;BN;;;;;N;;;;;
+E0078;TAG LATIN SMALL LETTER X;Cf;0;BN;;;;;N;;;;;
+E0079;TAG LATIN SMALL LETTER Y;Cf;0;BN;;;;;N;;;;;
+E007A;TAG LATIN SMALL LETTER Z;Cf;0;BN;;;;;N;;;;;
+E007B;TAG LEFT CURLY BRACKET;Cf;0;BN;;;;;N;;;;;
+E007C;TAG VERTICAL LINE;Cf;0;BN;;;;;N;;;;;
+E007D;TAG RIGHT CURLY BRACKET;Cf;0;BN;;;;;N;;;;;
+E007E;TAG TILDE;Cf;0;BN;;;;;N;;;;;
+E007F;CANCEL TAG;Cf;0;BN;;;;;N;;;;;
+E0100;VARIATION SELECTOR-17;Mn;0;NSM;;;;;N;;;;;
+E0101;VARIATION SELECTOR-18;Mn;0;NSM;;;;;N;;;;;
+E0102;VARIATION SELECTOR-19;Mn;0;NSM;;;;;N;;;;;
+E0103;VARIATION SELECTOR-20;Mn;0;NSM;;;;;N;;;;;
+E0104;VARIATION SELECTOR-21;Mn;0;NSM;;;;;N;;;;;
+E0105;VARIATION SELECTOR-22;Mn;0;NSM;;;;;N;;;;;
+E0106;VARIATION SELECTOR-23;Mn;0;NSM;;;;;N;;;;;
+E0107;VARIATION SELECTOR-24;Mn;0;NSM;;;;;N;;;;;
+E0108;VARIATION SELECTOR-25;Mn;0;NSM;;;;;N;;;;;
+E0109;VARIATION SELECTOR-26;Mn;0;NSM;;;;;N;;;;;
+E010A;VARIATION SELECTOR-27;Mn;0;NSM;;;;;N;;;;;
+E010B;VARIATION SELECTOR-28;Mn;0;NSM;;;;;N;;;;;
+E010C;VARIATION SELECTOR-29;Mn;0;NSM;;;;;N;;;;;
+E010D;VARIATION SELECTOR-30;Mn;0;NSM;;;;;N;;;;;
+E010E;VARIATION SELECTOR-31;Mn;0;NSM;;;;;N;;;;;
+E010F;VARIATION SELECTOR-32;Mn;0;NSM;;;;;N;;;;;
+E0110;VARIATION SELECTOR-33;Mn;0;NSM;;;;;N;;;;;
+E0111;VARIATION SELECTOR-34;Mn;0;NSM;;;;;N;;;;;
+E0112;VARIATION SELECTOR-35;Mn;0;NSM;;;;;N;;;;;
+E0113;VARIATION SELECTOR-36;Mn;0;NSM;;;;;N;;;;;
+E0114;VARIATION SELECTOR-37;Mn;0;NSM;;;;;N;;;;;
+E0115;VARIATION SELECTOR-38;Mn;0;NSM;;;;;N;;;;;
+E0116;VARIATION SELECTOR-39;Mn;0;NSM;;;;;N;;;;;
+E0117;VARIATION SELECTOR-40;Mn;0;NSM;;;;;N;;;;;
+E0118;VARIATION SELECTOR-41;Mn;0;NSM;;;;;N;;;;;
+E0119;VARIATION SELECTOR-42;Mn;0;NSM;;;;;N;;;;;
+E011A;VARIATION SELECTOR-43;Mn;0;NSM;;;;;N;;;;;
+E011B;VARIATION SELECTOR-44;Mn;0;NSM;;;;;N;;;;;
+E011C;VARIATION SELECTOR-45;Mn;0;NSM;;;;;N;;;;;
+E011D;VARIATION SELECTOR-46;Mn;0;NSM;;;;;N;;;;;
+E011E;VARIATION SELECTOR-47;Mn;0;NSM;;;;;N;;;;;
+E011F;VARIATION SELECTOR-48;Mn;0;NSM;;;;;N;;;;;
+E0120;VARIATION SELECTOR-49;Mn;0;NSM;;;;;N;;;;;
+E0121;VARIATION SELECTOR-50;Mn;0;NSM;;;;;N;;;;;
+E0122;VARIATION SELECTOR-51;Mn;0;NSM;;;;;N;;;;;
+E0123;VARIATION SELECTOR-52;Mn;0;NSM;;;;;N;;;;;
+E0124;VARIATION SELECTOR-53;Mn;0;NSM;;;;;N;;;;;
+E0125;VARIATION SELECTOR-54;Mn;0;NSM;;;;;N;;;;;
+E0126;VARIATION SELECTOR-55;Mn;0;NSM;;;;;N;;;;;
+E0127;VARIATION SELECTOR-56;Mn;0;NSM;;;;;N;;;;;
+E0128;VARIATION SELECTOR-57;Mn;0;NSM;;;;;N;;;;;
+E0129;VARIATION SELECTOR-58;Mn;0;NSM;;;;;N;;;;;
+E012A;VARIATION SELECTOR-59;Mn;0;NSM;;;;;N;;;;;
+E012B;VARIATION SELECTOR-60;Mn;0;NSM;;;;;N;;;;;
+E012C;VARIATION SELECTOR-61;Mn;0;NSM;;;;;N;;;;;
+E012D;VARIATION SELECTOR-62;Mn;0;NSM;;;;;N;;;;;
+E012E;VARIATION SELECTOR-63;Mn;0;NSM;;;;;N;;;;;
+E012F;VARIATION SELECTOR-64;Mn;0;NSM;;;;;N;;;;;
+E0130;VARIATION SELECTOR-65;Mn;0;NSM;;;;;N;;;;;
+E0131;VARIATION SELECTOR-66;Mn;0;NSM;;;;;N;;;;;
+E0132;VARIATION SELECTOR-67;Mn;0;NSM;;;;;N;;;;;
+E0133;VARIATION SELECTOR-68;Mn;0;NSM;;;;;N;;;;;
+E0134;VARIATION SELECTOR-69;Mn;0;NSM;;;;;N;;;;;
+E0135;VARIATION SELECTOR-70;Mn;0;NSM;;;;;N;;;;;
+E0136;VARIATION SELECTOR-71;Mn;0;NSM;;;;;N;;;;;
+E0137;VARIATION SELECTOR-72;Mn;0;NSM;;;;;N;;;;;
+E0138;VARIATION SELECTOR-73;Mn;0;NSM;;;;;N;;;;;
+E0139;VARIATION SELECTOR-74;Mn;0;NSM;;;;;N;;;;;
+E013A;VARIATION SELECTOR-75;Mn;0;NSM;;;;;N;;;;;
+E013B;VARIATION SELECTOR-76;Mn;0;NSM;;;;;N;;;;;
+E013C;VARIATION SELECTOR-77;Mn;0;NSM;;;;;N;;;;;
+E013D;VARIATION SELECTOR-78;Mn;0;NSM;;;;;N;;;;;
+E013E;VARIATION SELECTOR-79;Mn;0;NSM;;;;;N;;;;;
+E013F;VARIATION SELECTOR-80;Mn;0;NSM;;;;;N;;;;;
+E0140;VARIATION SELECTOR-81;Mn;0;NSM;;;;;N;;;;;
+E0141;VARIATION SELECTOR-82;Mn;0;NSM;;;;;N;;;;;
+E0142;VARIATION SELECTOR-83;Mn;0;NSM;;;;;N;;;;;
+E0143;VARIATION SELECTOR-84;Mn;0;NSM;;;;;N;;;;;
+E0144;VARIATION SELECTOR-85;Mn;0;NSM;;;;;N;;;;;
+E0145;VARIATION SELECTOR-86;Mn;0;NSM;;;;;N;;;;;
+E0146;VARIATION SELECTOR-87;Mn;0;NSM;;;;;N;;;;;
+E0147;VARIATION SELECTOR-88;Mn;0;NSM;;;;;N;;;;;
+E0148;VARIATION SELECTOR-89;Mn;0;NSM;;;;;N;;;;;
+E0149;VARIATION SELECTOR-90;Mn;0;NSM;;;;;N;;;;;
+E014A;VARIATION SELECTOR-91;Mn;0;NSM;;;;;N;;;;;
+E014B;VARIATION SELECTOR-92;Mn;0;NSM;;;;;N;;;;;
+E014C;VARIATION SELECTOR-93;Mn;0;NSM;;;;;N;;;;;
+E014D;VARIATION SELECTOR-94;Mn;0;NSM;;;;;N;;;;;
+E014E;VARIATION SELECTOR-95;Mn;0;NSM;;;;;N;;;;;
+E014F;VARIATION SELECTOR-96;Mn;0;NSM;;;;;N;;;;;
+E0150;VARIATION SELECTOR-97;Mn;0;NSM;;;;;N;;;;;
+E0151;VARIATION SELECTOR-98;Mn;0;NSM;;;;;N;;;;;
+E0152;VARIATION SELECTOR-99;Mn;0;NSM;;;;;N;;;;;
+E0153;VARIATION SELECTOR-100;Mn;0;NSM;;;;;N;;;;;
+E0154;VARIATION SELECTOR-101;Mn;0;NSM;;;;;N;;;;;
+E0155;VARIATION SELECTOR-102;Mn;0;NSM;;;;;N;;;;;
+E0156;VARIATION SELECTOR-103;Mn;0;NSM;;;;;N;;;;;
+E0157;VARIATION SELECTOR-104;Mn;0;NSM;;;;;N;;;;;
+E0158;VARIATION SELECTOR-105;Mn;0;NSM;;;;;N;;;;;
+E0159;VARIATION SELECTOR-106;Mn;0;NSM;;;;;N;;;;;
+E015A;VARIATION SELECTOR-107;Mn;0;NSM;;;;;N;;;;;
+E015B;VARIATION SELECTOR-108;Mn;0;NSM;;;;;N;;;;;
+E015C;VARIATION SELECTOR-109;Mn;0;NSM;;;;;N;;;;;
+E015D;VARIATION SELECTOR-110;Mn;0;NSM;;;;;N;;;;;
+E015E;VARIATION SELECTOR-111;Mn;0;NSM;;;;;N;;;;;
+E015F;VARIATION SELECTOR-112;Mn;0;NSM;;;;;N;;;;;
+E0160;VARIATION SELECTOR-113;Mn;0;NSM;;;;;N;;;;;
+E0161;VARIATION SELECTOR-114;Mn;0;NSM;;;;;N;;;;;
+E0162;VARIATION SELECTOR-115;Mn;0;NSM;;;;;N;;;;;
+E0163;VARIATION SELECTOR-116;Mn;0;NSM;;;;;N;;;;;
+E0164;VARIATION SELECTOR-117;Mn;0;NSM;;;;;N;;;;;
+E0165;VARIATION SELECTOR-118;Mn;0;NSM;;;;;N;;;;;
+E0166;VARIATION SELECTOR-119;Mn;0;NSM;;;;;N;;;;;
+E0167;VARIATION SELECTOR-120;Mn;0;NSM;;;;;N;;;;;
+E0168;VARIATION SELECTOR-121;Mn;0;NSM;;;;;N;;;;;
+E0169;VARIATION SELECTOR-122;Mn;0;NSM;;;;;N;;;;;
+E016A;VARIATION SELECTOR-123;Mn;0;NSM;;;;;N;;;;;
+E016B;VARIATION SELECTOR-124;Mn;0;NSM;;;;;N;;;;;
+E016C;VARIATION SELECTOR-125;Mn;0;NSM;;;;;N;;;;;
+E016D;VARIATION SELECTOR-126;Mn;0;NSM;;;;;N;;;;;
+E016E;VARIATION SELECTOR-127;Mn;0;NSM;;;;;N;;;;;
+E016F;VARIATION SELECTOR-128;Mn;0;NSM;;;;;N;;;;;
+E0170;VARIATION SELECTOR-129;Mn;0;NSM;;;;;N;;;;;
+E0171;VARIATION SELECTOR-130;Mn;0;NSM;;;;;N;;;;;
+E0172;VARIATION SELECTOR-131;Mn;0;NSM;;;;;N;;;;;
+E0173;VARIATION SELECTOR-132;Mn;0;NSM;;;;;N;;;;;
+E0174;VARIATION SELECTOR-133;Mn;0;NSM;;;;;N;;;;;
+E0175;VARIATION SELECTOR-134;Mn;0;NSM;;;;;N;;;;;
+E0176;VARIATION SELECTOR-135;Mn;0;NSM;;;;;N;;;;;
+E0177;VARIATION SELECTOR-136;Mn;0;NSM;;;;;N;;;;;
+E0178;VARIATION SELECTOR-137;Mn;0;NSM;;;;;N;;;;;
+E0179;VARIATION SELECTOR-138;Mn;0;NSM;;;;;N;;;;;
+E017A;VARIATION SELECTOR-139;Mn;0;NSM;;;;;N;;;;;
+E017B;VARIATION SELECTOR-140;Mn;0;NSM;;;;;N;;;;;
+E017C;VARIATION SELECTOR-141;Mn;0;NSM;;;;;N;;;;;
+E017D;VARIATION SELECTOR-142;Mn;0;NSM;;;;;N;;;;;
+E017E;VARIATION SELECTOR-143;Mn;0;NSM;;;;;N;;;;;
+E017F;VARIATION SELECTOR-144;Mn;0;NSM;;;;;N;;;;;
+E0180;VARIATION SELECTOR-145;Mn;0;NSM;;;;;N;;;;;
+E0181;VARIATION SELECTOR-146;Mn;0;NSM;;;;;N;;;;;
+E0182;VARIATION SELECTOR-147;Mn;0;NSM;;;;;N;;;;;
+E0183;VARIATION SELECTOR-148;Mn;0;NSM;;;;;N;;;;;
+E0184;VARIATION SELECTOR-149;Mn;0;NSM;;;;;N;;;;;
+E0185;VARIATION SELECTOR-150;Mn;0;NSM;;;;;N;;;;;
+E0186;VARIATION SELECTOR-151;Mn;0;NSM;;;;;N;;;;;
+E0187;VARIATION SELECTOR-152;Mn;0;NSM;;;;;N;;;;;
+E0188;VARIATION SELECTOR-153;Mn;0;NSM;;;;;N;;;;;
+E0189;VARIATION SELECTOR-154;Mn;0;NSM;;;;;N;;;;;
+E018A;VARIATION SELECTOR-155;Mn;0;NSM;;;;;N;;;;;
+E018B;VARIATION SELECTOR-156;Mn;0;NSM;;;;;N;;;;;
+E018C;VARIATION SELECTOR-157;Mn;0;NSM;;;;;N;;;;;
+E018D;VARIATION SELECTOR-158;Mn;0;NSM;;;;;N;;;;;
+E018E;VARIATION SELECTOR-159;Mn;0;NSM;;;;;N;;;;;
+E018F;VARIATION SELECTOR-160;Mn;0;NSM;;;;;N;;;;;
+E0190;VARIATION SELECTOR-161;Mn;0;NSM;;;;;N;;;;;
+E0191;VARIATION SELECTOR-162;Mn;0;NSM;;;;;N;;;;;
+E0192;VARIATION SELECTOR-163;Mn;0;NSM;;;;;N;;;;;
+E0193;VARIATION SELECTOR-164;Mn;0;NSM;;;;;N;;;;;
+E0194;VARIATION SELECTOR-165;Mn;0;NSM;;;;;N;;;;;
+E0195;VARIATION SELECTOR-166;Mn;0;NSM;;;;;N;;;;;
+E0196;VARIATION SELECTOR-167;Mn;0;NSM;;;;;N;;;;;
+E0197;VARIATION SELECTOR-168;Mn;0;NSM;;;;;N;;;;;
+E0198;VARIATION SELECTOR-169;Mn;0;NSM;;;;;N;;;;;
+E0199;VARIATION SELECTOR-170;Mn;0;NSM;;;;;N;;;;;
+E019A;VARIATION SELECTOR-171;Mn;0;NSM;;;;;N;;;;;
+E019B;VARIATION SELECTOR-172;Mn;0;NSM;;;;;N;;;;;
+E019C;VARIATION SELECTOR-173;Mn;0;NSM;;;;;N;;;;;
+E019D;VARIATION SELECTOR-174;Mn;0;NSM;;;;;N;;;;;
+E019E;VARIATION SELECTOR-175;Mn;0;NSM;;;;;N;;;;;
+E019F;VARIATION SELECTOR-176;Mn;0;NSM;;;;;N;;;;;
+E01A0;VARIATION SELECTOR-177;Mn;0;NSM;;;;;N;;;;;
+E01A1;VARIATION SELECTOR-178;Mn;0;NSM;;;;;N;;;;;
+E01A2;VARIATION SELECTOR-179;Mn;0;NSM;;;;;N;;;;;
+E01A3;VARIATION SELECTOR-180;Mn;0;NSM;;;;;N;;;;;
+E01A4;VARIATION SELECTOR-181;Mn;0;NSM;;;;;N;;;;;
+E01A5;VARIATION SELECTOR-182;Mn;0;NSM;;;;;N;;;;;
+E01A6;VARIATION SELECTOR-183;Mn;0;NSM;;;;;N;;;;;
+E01A7;VARIATION SELECTOR-184;Mn;0;NSM;;;;;N;;;;;
+E01A8;VARIATION SELECTOR-185;Mn;0;NSM;;;;;N;;;;;
+E01A9;VARIATION SELECTOR-186;Mn;0;NSM;;;;;N;;;;;
+E01AA;VARIATION SELECTOR-187;Mn;0;NSM;;;;;N;;;;;
+E01AB;VARIATION SELECTOR-188;Mn;0;NSM;;;;;N;;;;;
+E01AC;VARIATION SELECTOR-189;Mn;0;NSM;;;;;N;;;;;
+E01AD;VARIATION SELECTOR-190;Mn;0;NSM;;;;;N;;;;;
+E01AE;VARIATION SELECTOR-191;Mn;0;NSM;;;;;N;;;;;
+E01AF;VARIATION SELECTOR-192;Mn;0;NSM;;;;;N;;;;;
+E01B0;VARIATION SELECTOR-193;Mn;0;NSM;;;;;N;;;;;
+E01B1;VARIATION SELECTOR-194;Mn;0;NSM;;;;;N;;;;;
+E01B2;VARIATION SELECTOR-195;Mn;0;NSM;;;;;N;;;;;
+E01B3;VARIATION SELECTOR-196;Mn;0;NSM;;;;;N;;;;;
+E01B4;VARIATION SELECTOR-197;Mn;0;NSM;;;;;N;;;;;
+E01B5;VARIATION SELECTOR-198;Mn;0;NSM;;;;;N;;;;;
+E01B6;VARIATION SELECTOR-199;Mn;0;NSM;;;;;N;;;;;
+E01B7;VARIATION SELECTOR-200;Mn;0;NSM;;;;;N;;;;;
+E01B8;VARIATION SELECTOR-201;Mn;0;NSM;;;;;N;;;;;
+E01B9;VARIATION SELECTOR-202;Mn;0;NSM;;;;;N;;;;;
+E01BA;VARIATION SELECTOR-203;Mn;0;NSM;;;;;N;;;;;
+E01BB;VARIATION SELECTOR-204;Mn;0;NSM;;;;;N;;;;;
+E01BC;VARIATION SELECTOR-205;Mn;0;NSM;;;;;N;;;;;
+E01BD;VARIATION SELECTOR-206;Mn;0;NSM;;;;;N;;;;;
+E01BE;VARIATION SELECTOR-207;Mn;0;NSM;;;;;N;;;;;
+E01BF;VARIATION SELECTOR-208;Mn;0;NSM;;;;;N;;;;;
+E01C0;VARIATION SELECTOR-209;Mn;0;NSM;;;;;N;;;;;
+E01C1;VARIATION SELECTOR-210;Mn;0;NSM;;;;;N;;;;;
+E01C2;VARIATION SELECTOR-211;Mn;0;NSM;;;;;N;;;;;
+E01C3;VARIATION SELECTOR-212;Mn;0;NSM;;;;;N;;;;;
+E01C4;VARIATION SELECTOR-213;Mn;0;NSM;;;;;N;;;;;
+E01C5;VARIATION SELECTOR-214;Mn;0;NSM;;;;;N;;;;;
+E01C6;VARIATION SELECTOR-215;Mn;0;NSM;;;;;N;;;;;
+E01C7;VARIATION SELECTOR-216;Mn;0;NSM;;;;;N;;;;;
+E01C8;VARIATION SELECTOR-217;Mn;0;NSM;;;;;N;;;;;
+E01C9;VARIATION SELECTOR-218;Mn;0;NSM;;;;;N;;;;;
+E01CA;VARIATION SELECTOR-219;Mn;0;NSM;;;;;N;;;;;
+E01CB;VARIATION SELECTOR-220;Mn;0;NSM;;;;;N;;;;;
+E01CC;VARIATION SELECTOR-221;Mn;0;NSM;;;;;N;;;;;
+E01CD;VARIATION SELECTOR-222;Mn;0;NSM;;;;;N;;;;;
+E01CE;VARIATION SELECTOR-223;Mn;0;NSM;;;;;N;;;;;
+E01CF;VARIATION SELECTOR-224;Mn;0;NSM;;;;;N;;;;;
+E01D0;VARIATION SELECTOR-225;Mn;0;NSM;;;;;N;;;;;
+E01D1;VARIATION SELECTOR-226;Mn;0;NSM;;;;;N;;;;;
+E01D2;VARIATION SELECTOR-227;Mn;0;NSM;;;;;N;;;;;
+E01D3;VARIATION SELECTOR-228;Mn;0;NSM;;;;;N;;;;;
+E01D4;VARIATION SELECTOR-229;Mn;0;NSM;;;;;N;;;;;
+E01D5;VARIATION SELECTOR-230;Mn;0;NSM;;;;;N;;;;;
+E01D6;VARIATION SELECTOR-231;Mn;0;NSM;;;;;N;;;;;
+E01D7;VARIATION SELECTOR-232;Mn;0;NSM;;;;;N;;;;;
+E01D8;VARIATION SELECTOR-233;Mn;0;NSM;;;;;N;;;;;
+E01D9;VARIATION SELECTOR-234;Mn;0;NSM;;;;;N;;;;;
+E01DA;VARIATION SELECTOR-235;Mn;0;NSM;;;;;N;;;;;
+E01DB;VARIATION SELECTOR-236;Mn;0;NSM;;;;;N;;;;;
+E01DC;VARIATION SELECTOR-237;Mn;0;NSM;;;;;N;;;;;
+E01DD;VARIATION SELECTOR-238;Mn;0;NSM;;;;;N;;;;;
+E01DE;VARIATION SELECTOR-239;Mn;0;NSM;;;;;N;;;;;
+E01DF;VARIATION SELECTOR-240;Mn;0;NSM;;;;;N;;;;;
+E01E0;VARIATION SELECTOR-241;Mn;0;NSM;;;;;N;;;;;
+E01E1;VARIATION SELECTOR-242;Mn;0;NSM;;;;;N;;;;;
+E01E2;VARIATION SELECTOR-243;Mn;0;NSM;;;;;N;;;;;
+E01E3;VARIATION SELECTOR-244;Mn;0;NSM;;;;;N;;;;;
+E01E4;VARIATION SELECTOR-245;Mn;0;NSM;;;;;N;;;;;
+E01E5;VARIATION SELECTOR-246;Mn;0;NSM;;;;;N;;;;;
+E01E6;VARIATION SELECTOR-247;Mn;0;NSM;;;;;N;;;;;
+E01E7;VARIATION SELECTOR-248;Mn;0;NSM;;;;;N;;;;;
+E01E8;VARIATION SELECTOR-249;Mn;0;NSM;;;;;N;;;;;
+E01E9;VARIATION SELECTOR-250;Mn;0;NSM;;;;;N;;;;;
+E01EA;VARIATION SELECTOR-251;Mn;0;NSM;;;;;N;;;;;
+E01EB;VARIATION SELECTOR-252;Mn;0;NSM;;;;;N;;;;;
+E01EC;VARIATION SELECTOR-253;Mn;0;NSM;;;;;N;;;;;
+E01ED;VARIATION SELECTOR-254;Mn;0;NSM;;;;;N;;;;;
+E01EE;VARIATION SELECTOR-255;Mn;0;NSM;;;;;N;;;;;
+E01EF;VARIATION SELECTOR-256;Mn;0;NSM;;;;;N;;;;;
+F0000;<Plane 15 Private Use, First>;Co;0;L;;;;;N;;;;;
+FFFFD;<Plane 15 Private Use, Last>;Co;0;L;;;;;N;;;;;
+100000;<Plane 16 Private Use, First>;Co;0;L;;;;;N;;;;;
+10FFFD;<Plane 16 Private Use, Last>;Co;0;L;;;;;N;;;;;
diff --git a/test/functional/fixtures/bigfile_oneline.txt b/test/functional/fixtures/bigfile_oneline.txt
new file mode 100644
index 0000000000..263e81ebf0
--- /dev/null
+++ b/test/functional/fixtures/bigfile_oneline.txt
@@ -0,0 +1,593 @@
+0000;<control>;Cc;0;BN;;;;;N;NULL;;;; 0001;<control>;Cc;0;BN;;;;;N;START OF HEADING;;;; 0002;<control>;Cc;0;BN;;;;;N;START OF TEXT;;;; 0003;<control>;Cc;0;BN;;;;;N;END OF TEXT;;;; 0004;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION;;;; 0005;<control>;Cc;0;BN;;;;;N;ENQUIRY;;;; 0006;<control>;Cc;0;BN;;;;;N;ACKNOWLEDGE;;;; 0007;<control>;Cc;0;BN;;;;;N;BELL;;;; 0008;<control>;Cc;0;BN;;;;;N;BACKSPACE;;;; 0009;<control>;Cc;0;S;;;;;N;CHARACTER TABULATION;;;; 000A;<control>;Cc;0;B;;;;;N;LINE FEED (LF);;;; 000B;<control>;Cc;0;S;;;;;N;LINE TABULATION;;;; 000C;<control>;Cc;0;WS;;;;;N;FORM FEED (FF);;;; 000D;<control>;Cc;0;B;;;;;N;CARRIAGE RETURN (CR);;;; 000E;<control>;Cc;0;BN;;;;;N;SHIFT OUT;;;; 000F;<control>;Cc;0;BN;;;;;N;SHIFT IN;;;; 0010;<control>;Cc;0;BN;;;;;N;DATA LINK ESCAPE;;;; 0011;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL ONE;;;; 0012;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL TWO;;;; 0013;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL THREE;;;; 0014;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL FOUR;;;; 0015;<control>;Cc;0;BN;;;;;N;NEGATIVE ACKNOWLEDGE;;;; 0016;<control>;Cc;0;BN;;;;;N;SYNCHRONOUS IDLE;;;; 0017;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION BLOCK;;;; 0018;<control>;Cc;0;BN;;;;;N;CANCEL;;;; 0019;<control>;Cc;0;BN;;;;;N;END OF MEDIUM;;;; 001A;<control>;Cc;0;BN;;;;;N;SUBSTITUTE;;;; 001B;<control>;Cc;0;BN;;;;;N;ESCAPE;;;; 001C;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR FOUR;;;; 001D;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR THREE;;;; 001E;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR TWO;;;; 001F;<control>;Cc;0;S;;;;;N;INFORMATION SEPARATOR ONE;;;; 0020;SPACE;Zs;0;WS;;;;;N;;;;; 0021;EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; 0022;QUOTATION MARK;Po;0;ON;;;;;N;;;;; 0023;NUMBER SIGN;Po;0;ET;;;;;N;;;;; 0024;DOLLAR SIGN;Sc;0;ET;;;;;N;;;;; 0025;PERCENT SIGN;Po;0;ET;;;;;N;;;;; 0026;AMPERSAND;Po;0;ON;;;;;N;;;;; 0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;; 0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;; 0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;; 002A;ASTERISK;Po;0;ON;;;;;N;;;;; 002B;PLUS SIGN;Sm;0;ES;;;;;N;;;;; 002C;COMMA;Po;0;CS;;;;;N;;;;; 002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;; 002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;; 002F;SOLIDUS;Po;0;CS;;;;;N;SLASH;;;; 0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;; 0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;; 0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;; 0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;; 0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;; 0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;; 0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;; 0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;; 0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;; 0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;; 003A;COLON;Po;0;CS;;;;;N;;;;; 003B;SEMICOLON;Po;0;ON;;;;;N;;;;; 003C;LESS-THAN SIGN;Sm;0;ON;;;;;Y;;;;; 003D;EQUALS SIGN;Sm;0;ON;;;;;N;;;;; 003E;GREATER-THAN SIGN;Sm;0;ON;;;;;Y;;;;; 003F;QUESTION MARK;Po;0;ON;;;;;N;;;;; 0040;COMMERCIAL AT;Po;0;ON;;;;;N;;;;; 0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061; 0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062; 0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063; 0044;LATIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;0064; 0045;LATIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;0065; 0046;LATIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;0066; 0047;LATIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;0067; 0048;LATIN CAPITAL LETTER H;Lu;0;L;;;;;N;;;;0068; 0049;LATIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;0069; 004A;LATIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;006A; 004B;LATIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;006B; 004C;LATIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;006C; 004D;LATIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;006D; 004E;LATIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;006E; 004F;LATIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;006F; 0050;LATIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;0070; 0051;LATIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;0071; 0052;LATIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;0072; 0053;LATIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;0073; 0054;LATIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;0074; 0055;LATIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0075; 0056;LATIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;0076; 0057;LATIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;0077; 0058;LATIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;0078; 0059;LATIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;0079; 005A;LATIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;007A; 005B;LEFT SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING SQUARE BRACKET;;;; 005C;REVERSE SOLIDUS;Po;0;ON;;;;;N;BACKSLASH;;;; 005D;RIGHT SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING SQUARE BRACKET;;;; 005E;CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;SPACING CIRCUMFLEX;;;; 005F;LOW LINE;Pc;0;ON;;;;;N;SPACING UNDERSCORE;;;; 0060;GRAVE ACCENT;Sk;0;ON;;;;;N;SPACING GRAVE;;;; 0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041 0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042 0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043 0064;LATIN SMALL LETTER D;Ll;0;L;;;;;N;;;0044;;0044 0065;LATIN SMALL LETTER E;Ll;0;L;;;;;N;;;0045;;0045 0066;LATIN SMALL LETTER F;Ll;0;L;;;;;N;;;0046;;0046 0067;LATIN SMALL LETTER G;Ll;0;L;;;;;N;;;0047;;0047 0068;LATIN SMALL LETTER H;Ll;0;L;;;;;N;;;0048;;0048 0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049 006A;LATIN SMALL LETTER J;Ll;0;L;;;;;N;;;004A;;004A 006B;LATIN SMALL LETTER K;Ll;0;L;;;;;N;;;004B;;004B 006C;LATIN SMALL LETTER L;Ll;0;L;;;;;N;;;004C;;004C 006D;LATIN SMALL LETTER M;Ll;0;L;;;;;N;;;004D;;004D 006E;LATIN SMALL LETTER N;Ll;0;L;;;;;N;;;004E;;004E 006F;LATIN SMALL LETTER O;Ll;0;L;;;;;N;;;004F;;004F 0070;LATIN SMALL LETTER P;Ll;0;L;;;;;N;;;0050;;0050 0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051 0072;LATIN SMALL LETTER R;Ll;0;L;;;;;N;;;0052;;0052 0073;LATIN SMALL LETTER S;Ll;0;L;;;;;N;;;0053;;0053 0074;LATIN SMALL LETTER T;Ll;0;L;;;;;N;;;0054;;0054 0075;LATIN SMALL LETTER U;Ll;0;L;;;;;N;;;0055;;0055 0076;LATIN SMALL LETTER V;Ll;0;L;;;;;N;;;0056;;0056 0077;LATIN SMALL LETTER W;Ll;0;L;;;;;N;;;0057;;0057 0078;LATIN SMALL LETTER X;Ll;0;L;;;;;N;;;0058;;0058 0079;LATIN SMALL LETTER Y;Ll;0;L;;;;;N;;;0059;;0059 007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A 007B;LEFT CURLY BRACKET;Ps;0;ON;;;;;Y;OPENING CURLY BRACKET;;;; 007C;VERTICAL LINE;Sm;0;ON;;;;;N;VERTICAL BAR;;;; 007D;RIGHT CURLY BRACKET;Pe;0;ON;;;;;Y;CLOSING CURLY BRACKET;;;; 007E;TILDE;Sm;0;ON;;;;;N;;;;; 007F;<control>;Cc;0;BN;;;;;N;DELETE;;;; 0080;<control>;Cc;0;BN;;;;;N;;;;; 0081;<control>;Cc;0;BN;;;;;N;;;;; 0082;<control>;Cc;0;BN;;;;;N;BREAK PERMITTED HERE;;;; 0083;<control>;Cc;0;BN;;;;;N;NO BREAK HERE;;;; 0084;<control>;Cc;0;BN;;;;;N;;;;; 0085;<control>;Cc;0;B;;;;;N;NEXT LINE (NEL);;;; 0086;<control>;Cc;0;BN;;;;;N;START OF SELECTED AREA;;;; 0087;<control>;Cc;0;BN;;;;;N;END OF SELECTED AREA;;;; 0088;<control>;Cc;0;BN;;;;;N;CHARACTER TABULATION SET;;;; 0089;<control>;Cc;0;BN;;;;;N;CHARACTER TABULATION WITH JUSTIFICATION;;;; 008A;<control>;Cc;0;BN;;;;;N;LINE TABULATION SET;;;; 008B;<control>;Cc;0;BN;;;;;N;PARTIAL LINE FORWARD;;;; 008C;<control>;Cc;0;BN;;;;;N;PARTIAL LINE BACKWARD;;;; 008D;<control>;Cc;0;BN;;;;;N;REVERSE LINE FEED;;;; 008E;<control>;Cc;0;BN;;;;;N;SINGLE SHIFT TWO;;;; 008F;<control>;Cc;0;BN;;;;;N;SINGLE SHIFT THREE;;;; 0090;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL STRING;;;; 0091;<control>;Cc;0;BN;;;;;N;PRIVATE USE ONE;;;; 0092;<control>;Cc;0;BN;;;;;N;PRIVATE USE TWO;;;; 0093;<control>;Cc;0;BN;;;;;N;SET TRANSMIT STATE;;;; 0094;<control>;Cc;0;BN;;;;;N;CANCEL CHARACTER;;;; 0095;<control>;Cc;0;BN;;;;;N;MESSAGE WAITING;;;; 0096;<control>;Cc;0;BN;;;;;N;START OF GUARDED AREA;;;; 0097;<control>;Cc;0;BN;;;;;N;END OF GUARDED AREA;;;; 0098;<control>;Cc;0;BN;;;;;N;START OF STRING;;;; 0099;<control>;Cc;0;BN;;;;;N;;;;; 009A;<control>;Cc;0;BN;;;;;N;SINGLE CHARACTER INTRODUCER;;;; 009B;<control>;Cc;0;BN;;;;;N;CONTROL SEQUENCE INTRODUCER;;;; 009C;<control>;Cc;0;BN;;;;;N;STRING TERMINATOR;;;; 009D;<control>;Cc;0;BN;;;;;N;OPERATING SYSTEM COMMAND;;;; 009E;<control>;Cc;0;BN;;;;;N;PRIVACY MESSAGE;;;; 009F;<control>;Cc;0;BN;;;;;N;APPLICATION PROGRAM COMMAND;;;; 00A0;NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;NON-BREAKING SPACE;;;; 00A1;INVERTED EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; 00A2;CENT SIGN;Sc;0;ET;;;;;N;;;;; 00A3;POUND SIGN;Sc;0;ET;;;;;N;;;;; 00A4;CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; 00A5;YEN SIGN;Sc;0;ET;;;;;N;;;;; 00A6;BROKEN BAR;So;0;ON;;;;;N;BROKEN VERTICAL BAR;;;; 00A7;SECTION SIGN;Po;0;ON;;;;;N;;;;; 00A8;DIAERESIS;Sk;0;ON;<compat> 0020 0308;;;;N;SPACING DIAERESIS;;;; 00A9;COPYRIGHT SIGN;So;0;ON;;;;;N;;;;; 00AA;FEMININE ORDINAL INDICATOR;Lo;0;L;<super> 0061;;;;N;;;;; 00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;;;; 00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;; 00AD;SOFT HYPHEN;Cf;0;BN;;;;;N;;;;; 00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;; 00AF;MACRON;Sk;0;ON;<compat> 0020 0304;;;;N;SPACING MACRON;;;; 00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;; 00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;; 00B2;SUPERSCRIPT TWO;No;0;EN;<super> 0032;;2;2;N;SUPERSCRIPT DIGIT TWO;;;; 00B3;SUPERSCRIPT THREE;No;0;EN;<super> 0033;;3;3;N;SUPERSCRIPT DIGIT THREE;;;; 00B4;ACUTE ACCENT;Sk;0;ON;<compat> 0020 0301;;;;N;SPACING ACUTE;;;; 00B5;MICRO SIGN;Ll;0;L;<compat> 03BC;;;;N;;;039C;;039C 00B6;PILCROW SIGN;Po;0;ON;;;;;N;PARAGRAPH SIGN;;;; 00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;; 00B8;CEDILLA;Sk;0;ON;<compat> 0020 0327;;;;N;SPACING CEDILLA;;;; 00B9;SUPERSCRIPT ONE;No;0;EN;<super> 0031;;1;1;N;SUPERSCRIPT DIGIT ONE;;;; 00BA;MASCULINE ORDINAL INDICATOR;Lo;0;L;<super> 006F;;;;N;;;;; 00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;;;; 00BC;VULGAR FRACTION ONE QUARTER;No;0;ON;<fraction> 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;; 00BD;VULGAR FRACTION ONE HALF;No;0;ON;<fraction> 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;; 00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON;<fraction> 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;; 00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;; 00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0; 00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1; 00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2; 00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3; 00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4; 00C5;LATIN CAPITAL LETTER A WITH RING ABOVE;Lu;0;L;0041 030A;;;;N;LATIN CAPITAL LETTER A RING;;;00E5; 00C6;LATIN CAPITAL LETTER AE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER A E;;;00E6; 00C7;LATIN CAPITAL LETTER C WITH CEDILLA;Lu;0;L;0043 0327;;;;N;LATIN CAPITAL LETTER C CEDILLA;;;00E7; 00C8;LATIN CAPITAL LETTER E WITH GRAVE;Lu;0;L;0045 0300;;;;N;LATIN CAPITAL LETTER E GRAVE;;;00E8; 00C9;LATIN CAPITAL LETTER E WITH ACUTE;Lu;0;L;0045 0301;;;;N;LATIN CAPITAL LETTER E ACUTE;;;00E9; 00CA;LATIN CAPITAL LETTER E WITH CIRCUMFLEX;Lu;0;L;0045 0302;;;;N;LATIN CAPITAL LETTER E CIRCUMFLEX;;;00EA; 00CB;LATIN CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;0045 0308;;;;N;LATIN CAPITAL LETTER E DIAERESIS;;;00EB; 00CC;LATIN CAPITAL LETTER I WITH GRAVE;Lu;0;L;0049 0300;;;;N;LATIN CAPITAL LETTER I GRAVE;;;00EC; 00CD;LATIN CAPITAL LETTER I WITH ACUTE;Lu;0;L;0049 0301;;;;N;LATIN CAPITAL LETTER I ACUTE;;;00ED; 00CE;LATIN CAPITAL LETTER I WITH CIRCUMFLEX;Lu;0;L;0049 0302;;;;N;LATIN CAPITAL LETTER I CIRCUMFLEX;;;00EE; 00CF;LATIN CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0049 0308;;;;N;LATIN CAPITAL LETTER I DIAERESIS;;;00EF; 00D0;LATIN CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;00F0; 00D1;LATIN CAPITAL LETTER N WITH TILDE;Lu;0;L;004E 0303;;;;N;LATIN CAPITAL LETTER N TILDE;;;00F1; 00D2;LATIN CAPITAL LETTER O WITH GRAVE;Lu;0;L;004F 0300;;;;N;LATIN CAPITAL LETTER O GRAVE;;;00F2; 00D3;LATIN CAPITAL LETTER O WITH ACUTE;Lu;0;L;004F 0301;;;;N;LATIN CAPITAL LETTER O ACUTE;;;00F3; 00D4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX;Lu;0;L;004F 0302;;;;N;LATIN CAPITAL LETTER O CIRCUMFLEX;;;00F4; 00D5;LATIN CAPITAL LETTER O WITH TILDE;Lu;0;L;004F 0303;;;;N;LATIN CAPITAL LETTER O TILDE;;;00F5; 00D6;LATIN CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;004F 0308;;;;N;LATIN CAPITAL LETTER O DIAERESIS;;;00F6; 00D7;MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;; 00D8;LATIN CAPITAL LETTER O WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O SLASH;;;00F8; 00D9;LATIN CAPITAL LETTER U WITH GRAVE;Lu;0;L;0055 0300;;;;N;LATIN CAPITAL LETTER U GRAVE;;;00F9; 00DA;LATIN CAPITAL LETTER U WITH ACUTE;Lu;0;L;0055 0301;;;;N;LATIN CAPITAL LETTER U ACUTE;;;00FA; 00DB;LATIN CAPITAL LETTER U WITH CIRCUMFLEX;Lu;0;L;0055 0302;;;;N;LATIN CAPITAL LETTER U CIRCUMFLEX;;;00FB; 00DC;LATIN CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0055 0308;;;;N;LATIN CAPITAL LETTER U DIAERESIS;;;00FC; 00DD;LATIN CAPITAL LETTER Y WITH ACUTE;Lu;0;L;0059 0301;;;;N;LATIN CAPITAL LETTER Y ACUTE;;;00FD; 00DE;LATIN CAPITAL LETTER THORN;Lu;0;L;;;;;N;;;;00FE; 00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;;;; 00E0;LATIN SMALL LETTER A WITH GRAVE;Ll;0;L;0061 0300;;;;N;LATIN SMALL LETTER A GRAVE;;00C0;;00C0 00E1;LATIN SMALL LETTER A WITH ACUTE;Ll;0;L;0061 0301;;;;N;LATIN SMALL LETTER A ACUTE;;00C1;;00C1 00E2;LATIN SMALL LETTER A WITH CIRCUMFLEX;Ll;0;L;0061 0302;;;;N;LATIN SMALL LETTER A CIRCUMFLEX;;00C2;;00C2 00E3;LATIN SMALL LETTER A WITH TILDE;Ll;0;L;0061 0303;;;;N;LATIN SMALL LETTER A TILDE;;00C3;;00C3 00E4;LATIN SMALL LETTER A WITH DIAERESIS;Ll;0;L;0061 0308;;;;N;LATIN SMALL LETTER A DIAERESIS;;00C4;;00C4 00E5;LATIN SMALL LETTER A WITH RING ABOVE;Ll;0;L;0061 030A;;;;N;LATIN SMALL LETTER A RING;;00C5;;00C5 00E6;LATIN SMALL LETTER AE;Ll;0;L;;;;;N;LATIN SMALL LETTER A E;;00C6;;00C6 00E7;LATIN SMALL LETTER C WITH CEDILLA;Ll;0;L;0063 0327;;;;N;LATIN SMALL LETTER C CEDILLA;;00C7;;00C7 00E8;LATIN SMALL LETTER E WITH GRAVE;Ll;0;L;0065 0300;;;;N;LATIN SMALL LETTER E GRAVE;;00C8;;00C8 00E9;LATIN SMALL LETTER E WITH ACUTE;Ll;0;L;0065 0301;;;;N;LATIN SMALL LETTER E ACUTE;;00C9;;00C9 00EA;LATIN SMALL LETTER E WITH CIRCUMFLEX;Ll;0;L;0065 0302;;;;N;LATIN SMALL LETTER E CIRCUMFLEX;;00CA;;00CA 00EB;LATIN SMALL LETTER E WITH DIAERESIS;Ll;0;L;0065 0308;;;;N;LATIN SMALL LETTER E DIAERESIS;;00CB;;00CB 00EC;LATIN SMALL LETTER I WITH GRAVE;Ll;0;L;0069 0300;;;;N;LATIN SMALL LETTER I GRAVE;;00CC;;00CC 00ED;LATIN SMALL LETTER I WITH ACUTE;Ll;0;L;0069 0301;;;;N;LATIN SMALL LETTER I ACUTE;;00CD;;00CD 00EE;LATIN SMALL LETTER I WITH CIRCUMFLEX;Ll;0;L;0069 0302;;;;N;LATIN SMALL LETTER I CIRCUMFLEX;;00CE;;00CE 00EF;LATIN SMALL LETTER I WITH DIAERESIS;Ll;0;L;0069 0308;;;;N;LATIN SMALL LETTER I DIAERESIS;;00CF;;00CF 00F0;LATIN SMALL LETTER ETH;Ll;0;L;;;;;N;;;00D0;;00D0 00F1;LATIN SMALL LETTER N WITH TILDE;Ll;0;L;006E 0303;;;;N;LATIN SMALL LETTER N TILDE;;00D1;;00D1 00F2;LATIN SMALL LETTER O WITH GRAVE;Ll;0;L;006F 0300;;;;N;LATIN SMALL LETTER O GRAVE;;00D2;;00D2 00F3;LATIN SMALL LETTER O WITH ACUTE;Ll;0;L;006F 0301;;;;N;LATIN SMALL LETTER O ACUTE;;00D3;;00D3 00F4;LATIN SMALL LETTER O WITH CIRCUMFLEX;Ll;0;L;006F 0302;;;;N;LATIN SMALL LETTER O CIRCUMFLEX;;00D4;;00D4 00F5;LATIN SMALL LETTER O WITH TILDE;Ll;0;L;006F 0303;;;;N;LATIN SMALL LETTER O TILDE;;00D5;;00D5 00F6;LATIN SMALL LETTER O WITH DIAERESIS;Ll;0;L;006F 0308;;;;N;LATIN SMALL LETTER O DIAERESIS;;00D6;;00D6 00F7;DIVISION SIGN;Sm;0;ON;;;;;N;;;;; 00F8;LATIN SMALL LETTER O WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER O SLASH;;00D8;;00D8 00F9;LATIN SMALL LETTER U WITH GRAVE;Ll;0;L;0075 0300;;;;N;LATIN SMALL LETTER U GRAVE;;00D9;;00D9 00FA;LATIN SMALL LETTER U WITH ACUTE;Ll;0;L;0075 0301;;;;N;LATIN SMALL LETTER U ACUTE;;00DA;;00DA 00FB;LATIN SMALL LETTER U WITH CIRCUMFLEX;Ll;0;L;0075 0302;;;;N;LATIN SMALL LETTER U CIRCUMFLEX;;00DB;;00DB 00FC;LATIN SMALL LETTER U WITH DIAERESIS;Ll;0;L;0075 0308;;;;N;LATIN SMALL LETTER U DIAERESIS;;00DC;;00DC 00FD;LATIN SMALL LETTER Y WITH ACUTE;Ll;0;L;0079 0301;;;;N;LATIN SMALL LETTER Y ACUTE;;00DD;;00DD 00FE;LATIN SMALL LETTER THORN;Ll;0;L;;;;;N;;;00DE;;00DE 00FF;LATIN SMALL LETTER Y WITH DIAERESIS;Ll;0;L;0079 0308;;;;N;LATIN SMALL LETTER Y DIAERESIS;;0178;;0178 0100;LATIN CAPITAL LETTER A WITH MACRON;Lu;0;L;0041 0304;;;;N;LATIN CAPITAL LETTER A MACRON;;;0101; 0101;LATIN SMALL LETTER A WITH MACRON;Ll;0;L;0061 0304;;;;N;LATIN SMALL LETTER A MACRON;;0100;;0100 0102;LATIN CAPITAL LETTER A WITH BREVE;Lu;0;L;0041 0306;;;;N;LATIN CAPITAL LETTER A BREVE;;;0103; 0103;LATIN SMALL LETTER A WITH BREVE;Ll;0;L;0061 0306;;;;N;LATIN SMALL LETTER A BREVE;;0102;;0102 0104;LATIN CAPITAL LETTER A WITH OGONEK;Lu;0;L;0041 0328;;;;N;LATIN CAPITAL LETTER A OGONEK;;;0105; 0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104 0106;LATIN CAPITAL LETTER C WITH ACUTE;Lu;0;L;0043 0301;;;;N;LATIN CAPITAL LETTER C ACUTE;;;0107; 0107;LATIN SMALL LETTER C WITH ACUTE;Ll;0;L;0063 0301;;;;N;LATIN SMALL LETTER C ACUTE;;0106;;0106 0108;LATIN CAPITAL LETTER C WITH CIRCUMFLEX;Lu;0;L;0043 0302;;;;N;LATIN CAPITAL LETTER C CIRCUMFLEX;;;0109; 0109;LATIN SMALL LETTER C WITH CIRCUMFLEX;Ll;0;L;0063 0302;;;;N;LATIN SMALL LETTER C CIRCUMFLEX;;0108;;0108 010A;LATIN CAPITAL LETTER C WITH DOT ABOVE;Lu;0;L;0043 0307;;;;N;LATIN CAPITAL LETTER C DOT;;;010B; 010B;LATIN SMALL LETTER C WITH DOT ABOVE;Ll;0;L;0063 0307;;;;N;LATIN SMALL LETTER C DOT;;010A;;010A 010C;LATIN CAPITAL LETTER C WITH CARON;Lu;0;L;0043 030C;;;;N;LATIN CAPITAL LETTER C HACEK;;;010D; 010D;LATIN SMALL LETTER C WITH CARON;Ll;0;L;0063 030C;;;;N;LATIN SMALL LETTER C HACEK;;010C;;010C 010E;LATIN CAPITAL LETTER D WITH CARON;Lu;0;L;0044 030C;;;;N;LATIN CAPITAL LETTER D HACEK;;;010F; 010F;LATIN SMALL LETTER D WITH CARON;Ll;0;L;0064 030C;;;;N;LATIN SMALL LETTER D HACEK;;010E;;010E 0110;LATIN CAPITAL LETTER D WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D BAR;;;0111; 0111;LATIN SMALL LETTER D WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER D BAR;;0110;;0110 0112;LATIN CAPITAL LETTER E WITH MACRON;Lu;0;L;0045 0304;;;;N;LATIN CAPITAL LETTER E MACRON;;;0113; 0113;LATIN SMALL LETTER E WITH MACRON;Ll;0;L;0065 0304;;;;N;LATIN SMALL LETTER E MACRON;;0112;;0112 0114;LATIN CAPITAL LETTER E WITH BREVE;Lu;0;L;0045 0306;;;;N;LATIN CAPITAL LETTER E BREVE;;;0115; 0115;LATIN SMALL LETTER E WITH BREVE;Ll;0;L;0065 0306;;;;N;LATIN SMALL LETTER E BREVE;;0114;;0114 0116;LATIN CAPITAL LETTER E WITH DOT ABOVE;Lu;0;L;0045 0307;;;;N;LATIN CAPITAL LETTER E DOT;;;0117; 0117;LATIN SMALL LETTER E WITH DOT ABOVE;Ll;0;L;0065 0307;;;;N;LATIN SMALL LETTER E DOT;;0116;;0116 0118;LATIN CAPITAL LETTER E WITH OGONEK;Lu;0;L;0045 0328;;;;N;LATIN CAPITAL LETTER E OGONEK;;;0119; 0119;LATIN SMALL LETTER E WITH OGONEK;Ll;0;L;0065 0328;;;;N;LATIN SMALL LETTER E OGONEK;;0118;;0118 011A;LATIN CAPITAL LETTER E WITH CARON;Lu;0;L;0045 030C;;;;N;LATIN CAPITAL LETTER E HACEK;;;011B; 011B;LATIN SMALL LETTER E WITH CARON;Ll;0;L;0065 030C;;;;N;LATIN SMALL LETTER E HACEK;;011A;;011A 011C;LATIN CAPITAL LETTER G WITH CIRCUMFLEX;Lu;0;L;0047 0302;;;;N;LATIN CAPITAL LETTER G CIRCUMFLEX;;;011D; 011D;LATIN SMALL LETTER G WITH CIRCUMFLEX;Ll;0;L;0067 0302;;;;N;LATIN SMALL LETTER G CIRCUMFLEX;;011C;;011C 011E;LATIN CAPITAL LETTER G WITH BREVE;Lu;0;L;0047 0306;;;;N;LATIN CAPITAL LETTER G BREVE;;;011F; 011F;LATIN SMALL LETTER G WITH BREVE;Ll;0;L;0067 0306;;;;N;LATIN SMALL LETTER G BREVE;;011E;;011E 0120;LATIN CAPITAL LETTER G WITH DOT ABOVE;Lu;0;L;0047 0307;;;;N;LATIN CAPITAL LETTER G DOT;;;0121; 0121;LATIN SMALL LETTER G WITH DOT ABOVE;Ll;0;L;0067 0307;;;;N;LATIN SMALL LETTER G DOT;;0120;;0120 0122;LATIN CAPITAL LETTER G WITH CEDILLA;Lu;0;L;0047 0327;;;;N;LATIN CAPITAL LETTER G CEDILLA;;;0123; 0123;LATIN SMALL LETTER G WITH CEDILLA;Ll;0;L;0067 0327;;;;N;LATIN SMALL LETTER G CEDILLA;;0122;;0122 0124;LATIN CAPITAL LETTER H WITH CIRCUMFLEX;Lu;0;L;0048 0302;;;;N;LATIN CAPITAL LETTER H CIRCUMFLEX;;;0125; 0125;LATIN SMALL LETTER H WITH CIRCUMFLEX;Ll;0;L;0068 0302;;;;N;LATIN SMALL LETTER H CIRCUMFLEX;;0124;;0124 0126;LATIN CAPITAL LETTER H WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER H BAR;;;0127; 0127;LATIN SMALL LETTER H WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER H BAR;;0126;;0126 0128;LATIN CAPITAL LETTER I WITH TILDE;Lu;0;L;0049 0303;;;;N;LATIN CAPITAL LETTER I TILDE;;;0129; 0129;LATIN SMALL LETTER I WITH TILDE;Ll;0;L;0069 0303;;;;N;LATIN SMALL LETTER I TILDE;;0128;;0128 012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B; 012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A 012C;LATIN CAPITAL LETTER I WITH BREVE;Lu;0;L;0049 0306;;;;N;LATIN CAPITAL LETTER I BREVE;;;012D; 012D;LATIN SMALL LETTER I WITH BREVE;Ll;0;L;0069 0306;;;;N;LATIN SMALL LETTER I BREVE;;012C;;012C 012E;LATIN CAPITAL LETTER I WITH OGONEK;Lu;0;L;0049 0328;;;;N;LATIN CAPITAL LETTER I OGONEK;;;012F; 012F;LATIN SMALL LETTER I WITH OGONEK;Ll;0;L;0069 0328;;;;N;LATIN SMALL LETTER I OGONEK;;012E;;012E 0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069; 0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049 0132;LATIN CAPITAL LIGATURE IJ;Lu;0;L;<compat> 0049 004A;;;;N;LATIN CAPITAL LETTER I J;;;0133; 0133;LATIN SMALL LIGATURE IJ;Ll;0;L;<compat> 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132 0134;LATIN CAPITAL LETTER J WITH CIRCUMFLEX;Lu;0;L;004A 0302;;;;N;LATIN CAPITAL LETTER J CIRCUMFLEX;;;0135; 0135;LATIN SMALL LETTER J WITH CIRCUMFLEX;Ll;0;L;006A 0302;;;;N;LATIN SMALL LETTER J CIRCUMFLEX;;0134;;0134 0136;LATIN CAPITAL LETTER K WITH CEDILLA;Lu;0;L;004B 0327;;;;N;LATIN CAPITAL LETTER K CEDILLA;;;0137; 0137;LATIN SMALL LETTER K WITH CEDILLA;Ll;0;L;006B 0327;;;;N;LATIN SMALL LETTER K CEDILLA;;0136;;0136 0138;LATIN SMALL LETTER KRA;Ll;0;L;;;;;N;;;;; 0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A; 013A;LATIN SMALL LETTER L WITH ACUTE;Ll;0;L;006C 0301;;;;N;LATIN SMALL LETTER L ACUTE;;0139;;0139 013B;LATIN CAPITAL LETTER L WITH CEDILLA;Lu;0;L;004C 0327;;;;N;LATIN CAPITAL LETTER L CEDILLA;;;013C; 013C;LATIN SMALL LETTER L WITH CEDILLA;Ll;0;L;006C 0327;;;;N;LATIN SMALL LETTER L CEDILLA;;013B;;013B 013D;LATIN CAPITAL LETTER L WITH CARON;Lu;0;L;004C 030C;;;;N;LATIN CAPITAL LETTER L HACEK;;;013E; 013E;LATIN SMALL LETTER L WITH CARON;Ll;0;L;006C 030C;;;;N;LATIN SMALL LETTER L HACEK;;013D;;013D 013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L;<compat> 004C 00B7;;;;N;;;;0140; 0140;LATIN SMALL LETTER L WITH MIDDLE DOT;Ll;0;L;<compat> 006C 00B7;;;;N;;;013F;;013F 0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142; 0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141 0143;LATIN CAPITAL LETTER N WITH ACUTE;Lu;0;L;004E 0301;;;;N;LATIN CAPITAL LETTER N ACUTE;;;0144; 0144;LATIN SMALL LETTER N WITH ACUTE;Ll;0;L;006E 0301;;;;N;LATIN SMALL LETTER N ACUTE;;0143;;0143 0145;LATIN CAPITAL LETTER N WITH CEDILLA;Lu;0;L;004E 0327;;;;N;LATIN CAPITAL LETTER N CEDILLA;;;0146; 0146;LATIN SMALL LETTER N WITH CEDILLA;Ll;0;L;006E 0327;;;;N;LATIN SMALL LETTER N CEDILLA;;0145;;0145 0147;LATIN CAPITAL LETTER N WITH CARON;Lu;0;L;004E 030C;;;;N;LATIN CAPITAL LETTER N HACEK;;;0148; 0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147 0149;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE;Ll;0;L;<compat> 02BC 006E;;;;N;LATIN SMALL LETTER APOSTROPHE N;;;; 014A;LATIN CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;014B; 014B;LATIN SMALL LETTER ENG;Ll;0;L;;;;;N;;;014A;;014A 014C;LATIN CAPITAL LETTER O WITH MACRON;Lu;0;L;004F 0304;;;;N;LATIN CAPITAL LETTER O MACRON;;;014D; 014D;LATIN SMALL LETTER O WITH MACRON;Ll;0;L;006F 0304;;;;N;LATIN SMALL LETTER O MACRON;;014C;;014C 014E;LATIN CAPITAL LETTER O WITH BREVE;Lu;0;L;004F 0306;;;;N;LATIN CAPITAL LETTER O BREVE;;;014F; 014F;LATIN SMALL LETTER O WITH BREVE;Ll;0;L;006F 0306;;;;N;LATIN SMALL LETTER O BREVE;;014E;;014E 0150;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE;Lu;0;L;004F 030B;;;;N;LATIN CAPITAL LETTER O DOUBLE ACUTE;;;0151; 0151;LATIN SMALL LETTER O WITH DOUBLE ACUTE;Ll;0;L;006F 030B;;;;N;LATIN SMALL LETTER O DOUBLE ACUTE;;0150;;0150 0152;LATIN CAPITAL LIGATURE OE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O E;;;0153; 0153;LATIN SMALL LIGATURE OE;Ll;0;L;;;;;N;LATIN SMALL LETTER O E;;0152;;0152 0154;LATIN CAPITAL LETTER R WITH ACUTE;Lu;0;L;0052 0301;;;;N;LATIN CAPITAL LETTER R ACUTE;;;0155; 0155;LATIN SMALL LETTER R WITH ACUTE;Ll;0;L;0072 0301;;;;N;LATIN SMALL LETTER R ACUTE;;0154;;0154 0156;LATIN CAPITAL LETTER R WITH CEDILLA;Lu;0;L;0052 0327;;;;N;LATIN CAPITAL LETTER R CEDILLA;;;0157; 0157;LATIN SMALL LETTER R WITH CEDILLA;Ll;0;L;0072 0327;;;;N;LATIN SMALL LETTER R CEDILLA;;0156;;0156 0158;LATIN CAPITAL LETTER R WITH CARON;Lu;0;L;0052 030C;;;;N;LATIN CAPITAL LETTER R HACEK;;;0159; 0159;LATIN SMALL LETTER R WITH CARON;Ll;0;L;0072 030C;;;;N;LATIN SMALL LETTER R HACEK;;0158;;0158 015A;LATIN CAPITAL LETTER S WITH ACUTE;Lu;0;L;0053 0301;;;;N;LATIN CAPITAL LETTER S ACUTE;;;015B; 015B;LATIN SMALL LETTER S WITH ACUTE;Ll;0;L;0073 0301;;;;N;LATIN SMALL LETTER S ACUTE;;015A;;015A 015C;LATIN CAPITAL LETTER S WITH CIRCUMFLEX;Lu;0;L;0053 0302;;;;N;LATIN CAPITAL LETTER S CIRCUMFLEX;;;015D; 015D;LATIN SMALL LETTER S WITH CIRCUMFLEX;Ll;0;L;0073 0302;;;;N;LATIN SMALL LETTER S CIRCUMFLEX;;015C;;015C 015E;LATIN CAPITAL LETTER S WITH CEDILLA;Lu;0;L;0053 0327;;;;N;LATIN CAPITAL LETTER S CEDILLA;;;015F; 015F;LATIN SMALL LETTER S WITH CEDILLA;Ll;0;L;0073 0327;;;;N;LATIN SMALL LETTER S CEDILLA;;015E;;015E 0160;LATIN CAPITAL LETTER S WITH CARON;Lu;0;L;0053 030C;;;;N;LATIN CAPITAL LETTER S HACEK;;;0161; 0161;LATIN SMALL LETTER S WITH CARON;Ll;0;L;0073 030C;;;;N;LATIN SMALL LETTER S HACEK;;0160;;0160 0162;LATIN CAPITAL LETTER T WITH CEDILLA;Lu;0;L;0054 0327;;;;N;LATIN CAPITAL LETTER T CEDILLA;;;0163; 0163;LATIN SMALL LETTER T WITH CEDILLA;Ll;0;L;0074 0327;;;;N;LATIN SMALL LETTER T CEDILLA;;0162;;0162 0164;LATIN CAPITAL LETTER T WITH CARON;Lu;0;L;0054 030C;;;;N;LATIN CAPITAL LETTER T HACEK;;;0165; 0165;LATIN SMALL LETTER T WITH CARON;Ll;0;L;0074 030C;;;;N;LATIN SMALL LETTER T HACEK;;0164;;0164 0166;LATIN CAPITAL LETTER T WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T BAR;;;0167; 0167;LATIN SMALL LETTER T WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER T BAR;;0166;;0166 0168;LATIN CAPITAL LETTER U WITH TILDE;Lu;0;L;0055 0303;;;;N;LATIN CAPITAL LETTER U TILDE;;;0169; 0169;LATIN SMALL LETTER U WITH TILDE;Ll;0;L;0075 0303;;;;N;LATIN SMALL LETTER U TILDE;;0168;;0168 016A;LATIN CAPITAL LETTER U WITH MACRON;Lu;0;L;0055 0304;;;;N;LATIN CAPITAL LETTER U MACRON;;;016B; 016B;LATIN SMALL LETTER U WITH MACRON;Ll;0;L;0075 0304;;;;N;LATIN SMALL LETTER U MACRON;;016A;;016A 016C;LATIN CAPITAL LETTER U WITH BREVE;Lu;0;L;0055 0306;;;;N;LATIN CAPITAL LETTER U BREVE;;;016D; 016D;LATIN SMALL LETTER U WITH BREVE;Ll;0;L;0075 0306;;;;N;LATIN SMALL LETTER U BREVE;;016C;;016C 016E;LATIN CAPITAL LETTER U WITH RING ABOVE;Lu;0;L;0055 030A;;;;N;LATIN CAPITAL LETTER U RING;;;016F; 016F;LATIN SMALL LETTER U WITH RING ABOVE;Ll;0;L;0075 030A;;;;N;LATIN SMALL LETTER U RING;;016E;;016E 0170;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0055 030B;;;;N;LATIN CAPITAL LETTER U DOUBLE ACUTE;;;0171; 0171;LATIN SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0075 030B;;;;N;LATIN SMALL LETTER U DOUBLE ACUTE;;0170;;0170 0172;LATIN CAPITAL LETTER U WITH OGONEK;Lu;0;L;0055 0328;;;;N;LATIN CAPITAL LETTER U OGONEK;;;0173; 0173;LATIN SMALL LETTER U WITH OGONEK;Ll;0;L;0075 0328;;;;N;LATIN SMALL LETTER U OGONEK;;0172;;0172 0174;LATIN CAPITAL LETTER W WITH CIRCUMFLEX;Lu;0;L;0057 0302;;;;N;LATIN CAPITAL LETTER W CIRCUMFLEX;;;0175; 0175;LATIN SMALL LETTER W WITH CIRCUMFLEX;Ll;0;L;0077 0302;;;;N;LATIN SMALL LETTER W CIRCUMFLEX;;0174;;0174 0176;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX;Lu;0;L;0059 0302;;;;N;LATIN CAPITAL LETTER Y CIRCUMFLEX;;;0177; 0177;LATIN SMALL LETTER Y WITH CIRCUMFLEX;Ll;0;L;0079 0302;;;;N;LATIN SMALL LETTER Y CIRCUMFLEX;;0176;;0176 0178;LATIN CAPITAL LETTER Y WITH DIAERESIS;Lu;0;L;0059 0308;;;;N;LATIN CAPITAL LETTER Y DIAERESIS;;;00FF; 0179;LATIN CAPITAL LETTER Z WITH ACUTE;Lu;0;L;005A 0301;;;;N;LATIN CAPITAL LETTER Z ACUTE;;;017A; 017A;LATIN SMALL LETTER Z WITH ACUTE;Ll;0;L;007A 0301;;;;N;LATIN SMALL LETTER Z ACUTE;;0179;;0179 017B;LATIN CAPITAL LETTER Z WITH DOT ABOVE;Lu;0;L;005A 0307;;;;N;LATIN CAPITAL LETTER Z DOT;;;017C; 017C;LATIN SMALL LETTER Z WITH DOT ABOVE;Ll;0;L;007A 0307;;;;N;LATIN SMALL LETTER Z DOT;;017B;;017B 017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E; 017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D 017F;LATIN SMALL LETTER LONG S;Ll;0;L;<compat> 0073;;;;N;;;0053;;0053 0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;0243;;0243 0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253; 0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183; 0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182 0184;LATIN CAPITAL LETTER TONE SIX;Lu;0;L;;;;;N;;;;0185; 0185;LATIN SMALL LETTER TONE SIX;Ll;0;L;;;;;N;;;0184;;0184 0186;LATIN CAPITAL LETTER OPEN O;Lu;0;L;;;;;N;;;;0254; 0187;LATIN CAPITAL LETTER C WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER C HOOK;;;0188; 0188;LATIN SMALL LETTER C WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER C HOOK;;0187;;0187 0189;LATIN CAPITAL LETTER AFRICAN D;Lu;0;L;;;;;N;;;;0256; 018A;LATIN CAPITAL LETTER D WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D HOOK;;;0257; 018B;LATIN CAPITAL LETTER D WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D TOPBAR;;;018C; 018C;LATIN SMALL LETTER D WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER D TOPBAR;;018B;;018B 018D;LATIN SMALL LETTER TURNED DELTA;Ll;0;L;;;;;N;;;;; 018E;LATIN CAPITAL LETTER REVERSED E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER TURNED E;;;01DD; 018F;LATIN CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;0259; 0190;LATIN CAPITAL LETTER OPEN E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER EPSILON;;;025B; 0191;LATIN CAPITAL LETTER F WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER F HOOK;;;0192; 0192;LATIN SMALL LETTER F WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT F;;0191;;0191 0193;LATIN CAPITAL LETTER G WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G HOOK;;;0260; 0194;LATIN CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;0263; 0195;LATIN SMALL LETTER HV;Ll;0;L;;;;;N;LATIN SMALL LETTER H V;;01F6;;01F6 0196;LATIN CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;0269; 0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268; 0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199; 0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198 019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;023D;;023D 019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;; 019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F; 019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272; 019E;LATIN SMALL LETTER N WITH LONG RIGHT LEG;Ll;0;L;;;;;N;;;0220;;0220 019F;LATIN CAPITAL LETTER O WITH MIDDLE TILDE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED O;;;0275; 01A0;LATIN CAPITAL LETTER O WITH HORN;Lu;0;L;004F 031B;;;;N;LATIN CAPITAL LETTER O HORN;;;01A1; 01A1;LATIN SMALL LETTER O WITH HORN;Ll;0;L;006F 031B;;;;N;LATIN SMALL LETTER O HORN;;01A0;;01A0 01A2;LATIN CAPITAL LETTER OI;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O I;;;01A3; 01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;;01A2;;01A2 01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5; 01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4 01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;;;0280; 01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8; 01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7 01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283; 01AA;LATIN LETTER REVERSED ESH LOOP;Ll;0;L;;;;;N;;;;; 01AB;LATIN SMALL LETTER T WITH PALATAL HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T PALATAL HOOK;;;; 01AC;LATIN CAPITAL LETTER T WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T HOOK;;;01AD; 01AD;LATIN SMALL LETTER T WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T HOOK;;01AC;;01AC 01AE;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T RETROFLEX HOOK;;;0288; 01AF;LATIN CAPITAL LETTER U WITH HORN;Lu;0;L;0055 031B;;;;N;LATIN CAPITAL LETTER U HORN;;;01B0; 01B0;LATIN SMALL LETTER U WITH HORN;Ll;0;L;0075 031B;;;;N;LATIN SMALL LETTER U HORN;;01AF;;01AF 01B1;LATIN CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;028A; 01B2;LATIN CAPITAL LETTER V WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER SCRIPT V;;;028B; 01B3;LATIN CAPITAL LETTER Y WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Y HOOK;;;01B4; 01B4;LATIN SMALL LETTER Y WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Y HOOK;;01B3;;01B3 01B5;LATIN CAPITAL LETTER Z WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Z BAR;;;01B6; 01B6;LATIN SMALL LETTER Z WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER Z BAR;;01B5;;01B5 01B7;LATIN CAPITAL LETTER EZH;Lu;0;L;;;;;N;LATIN CAPITAL LETTER YOGH;;;0292; 01B8;LATIN CAPITAL LETTER EZH REVERSED;Lu;0;L;;;;;N;LATIN CAPITAL LETTER REVERSED YOGH;;;01B9; 01B9;LATIN SMALL LETTER EZH REVERSED;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED YOGH;;01B8;;01B8 01BA;LATIN SMALL LETTER EZH WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH WITH TAIL;;;; 01BB;LATIN LETTER TWO WITH STROKE;Lo;0;L;;;;;N;LATIN LETTER TWO BAR;;;; 01BC;LATIN CAPITAL LETTER TONE FIVE;Lu;0;L;;;;;N;;;;01BD; 01BD;LATIN SMALL LETTER TONE FIVE;Ll;0;L;;;;;N;;;01BC;;01BC 01BE;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER INVERTED GLOTTAL STOP BAR;;;; 01BF;LATIN LETTER WYNN;Ll;0;L;;;;;N;;;01F7;;01F7 01C0;LATIN LETTER DENTAL CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE;;;; 01C1;LATIN LETTER LATERAL CLICK;Lo;0;L;;;;;N;LATIN LETTER DOUBLE PIPE;;;; 01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;; 01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;; 01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L;<compat> 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5 01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L;<compat> 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6;01C5 01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L;<compat> 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5 01C7;LATIN CAPITAL LETTER LJ;Lu;0;L;<compat> 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8 01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L;<compat> 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9;01C8 01C9;LATIN SMALL LETTER LJ;Ll;0;L;<compat> 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8 01CA;LATIN CAPITAL LETTER NJ;Lu;0;L;<compat> 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB 01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L;<compat> 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC;01CB 01CC;LATIN SMALL LETTER NJ;Ll;0;L;<compat> 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB 01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE; 01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD 01CF;LATIN CAPITAL LETTER I WITH CARON;Lu;0;L;0049 030C;;;;N;LATIN CAPITAL LETTER I HACEK;;;01D0; 01D0;LATIN SMALL LETTER I WITH CARON;Ll;0;L;0069 030C;;;;N;LATIN SMALL LETTER I HACEK;;01CF;;01CF 01D1;LATIN CAPITAL LETTER O WITH CARON;Lu;0;L;004F 030C;;;;N;LATIN CAPITAL LETTER O HACEK;;;01D2; 01D2;LATIN SMALL LETTER O WITH CARON;Ll;0;L;006F 030C;;;;N;LATIN SMALL LETTER O HACEK;;01D1;;01D1 01D3;LATIN CAPITAL LETTER U WITH CARON;Lu;0;L;0055 030C;;;;N;LATIN CAPITAL LETTER U HACEK;;;01D4; 01D4;LATIN SMALL LETTER U WITH CARON;Ll;0;L;0075 030C;;;;N;LATIN SMALL LETTER U HACEK;;01D3;;01D3 01D5;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON;Lu;0;L;00DC 0304;;;;N;LATIN CAPITAL LETTER U DIAERESIS MACRON;;;01D6; 01D6;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON;Ll;0;L;00FC 0304;;;;N;LATIN SMALL LETTER U DIAERESIS MACRON;;01D5;;01D5 01D7;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE;Lu;0;L;00DC 0301;;;;N;LATIN CAPITAL LETTER U DIAERESIS ACUTE;;;01D8; 01D8;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE;Ll;0;L;00FC 0301;;;;N;LATIN SMALL LETTER U DIAERESIS ACUTE;;01D7;;01D7 01D9;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON;Lu;0;L;00DC 030C;;;;N;LATIN CAPITAL LETTER U DIAERESIS HACEK;;;01DA; 01DA;LATIN SMALL LETTER U WITH DIAERESIS AND CARON;Ll;0;L;00FC 030C;;;;N;LATIN SMALL LETTER U DIAERESIS HACEK;;01D9;;01D9 01DB;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE;Lu;0;L;00DC 0300;;;;N;LATIN CAPITAL LETTER U DIAERESIS GRAVE;;;01DC; 01DC;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE;Ll;0;L;00FC 0300;;;;N;LATIN SMALL LETTER U DIAERESIS GRAVE;;01DB;;01DB 01DD;LATIN SMALL LETTER TURNED E;Ll;0;L;;;;;N;;;018E;;018E 01DE;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON;Lu;0;L;00C4 0304;;;;N;LATIN CAPITAL LETTER A DIAERESIS MACRON;;;01DF; 01DF;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON;Ll;0;L;00E4 0304;;;;N;LATIN SMALL LETTER A DIAERESIS MACRON;;01DE;;01DE 01E0;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON;Lu;0;L;0226 0304;;;;N;LATIN CAPITAL LETTER A DOT MACRON;;;01E1; 01E1;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON;Ll;0;L;0227 0304;;;;N;LATIN SMALL LETTER A DOT MACRON;;01E0;;01E0 01E2;LATIN CAPITAL LETTER AE WITH MACRON;Lu;0;L;00C6 0304;;;;N;LATIN CAPITAL LETTER A E MACRON;;;01E3; 01E3;LATIN SMALL LETTER AE WITH MACRON;Ll;0;L;00E6 0304;;;;N;LATIN SMALL LETTER A E MACRON;;01E2;;01E2 01E4;LATIN CAPITAL LETTER G WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G BAR;;;01E5; 01E5;LATIN SMALL LETTER G WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER G BAR;;01E4;;01E4 01E6;LATIN CAPITAL LETTER G WITH CARON;Lu;0;L;0047 030C;;;;N;LATIN CAPITAL LETTER G HACEK;;;01E7; 01E7;LATIN SMALL LETTER G WITH CARON;Ll;0;L;0067 030C;;;;N;LATIN SMALL LETTER G HACEK;;01E6;;01E6 01E8;LATIN CAPITAL LETTER K WITH CARON;Lu;0;L;004B 030C;;;;N;LATIN CAPITAL LETTER K HACEK;;;01E9; 01E9;LATIN SMALL LETTER K WITH CARON;Ll;0;L;006B 030C;;;;N;LATIN SMALL LETTER K HACEK;;01E8;;01E8 01EA;LATIN CAPITAL LETTER O WITH OGONEK;Lu;0;L;004F 0328;;;;N;LATIN CAPITAL LETTER O OGONEK;;;01EB; 01EB;LATIN SMALL LETTER O WITH OGONEK;Ll;0;L;006F 0328;;;;N;LATIN SMALL LETTER O OGONEK;;01EA;;01EA 01EC;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON;Lu;0;L;01EA 0304;;;;N;LATIN CAPITAL LETTER O OGONEK MACRON;;;01ED; 01ED;LATIN SMALL LETTER O WITH OGONEK AND MACRON;Ll;0;L;01EB 0304;;;;N;LATIN SMALL LETTER O OGONEK MACRON;;01EC;;01EC 01EE;LATIN CAPITAL LETTER EZH WITH CARON;Lu;0;L;01B7 030C;;;;N;LATIN CAPITAL LETTER YOGH HACEK;;;01EF; 01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE 01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;; 01F1;LATIN CAPITAL LETTER DZ;Lu;0;L;<compat> 0044 005A;;;;N;;;;01F3;01F2 01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L;<compat> 0044 007A;;;;N;;;01F1;01F3;01F2 01F3;LATIN SMALL LETTER DZ;Ll;0;L;<compat> 0064 007A;;;;N;;;01F1;;01F2 01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5; 01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4 01F6;LATIN CAPITAL LETTER HWAIR;Lu;0;L;;;;;N;;;;0195; 01F7;LATIN CAPITAL LETTER WYNN;Lu;0;L;;;;;N;;;;01BF; 01F8;LATIN CAPITAL LETTER N WITH GRAVE;Lu;0;L;004E 0300;;;;N;;;;01F9; 01F9;LATIN SMALL LETTER N WITH GRAVE;Ll;0;L;006E 0300;;;;N;;;01F8;;01F8 01FA;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE;Lu;0;L;00C5 0301;;;;N;;;;01FB; 01FB;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE;Ll;0;L;00E5 0301;;;;N;;;01FA;;01FA 01FC;LATIN CAPITAL LETTER AE WITH ACUTE;Lu;0;L;00C6 0301;;;;N;;;;01FD; 01FD;LATIN SMALL LETTER AE WITH ACUTE;Ll;0;L;00E6 0301;;;;N;;;01FC;;01FC 01FE;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE;Lu;0;L;00D8 0301;;;;N;;;;01FF; 01FF;LATIN SMALL LETTER O WITH STROKE AND ACUTE;Ll;0;L;00F8 0301;;;;N;;;01FE;;01FE 0200;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE;Lu;0;L;0041 030F;;;;N;;;;0201; 0201;LATIN SMALL LETTER A WITH DOUBLE GRAVE;Ll;0;L;0061 030F;;;;N;;;0200;;0200 0202;LATIN CAPITAL LETTER A WITH INVERTED BREVE;Lu;0;L;0041 0311;;;;N;;;;0203; 0203;LATIN SMALL LETTER A WITH INVERTED BREVE;Ll;0;L;0061 0311;;;;N;;;0202;;0202 0204;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE;Lu;0;L;0045 030F;;;;N;;;;0205; 0205;LATIN SMALL LETTER E WITH DOUBLE GRAVE;Ll;0;L;0065 030F;;;;N;;;0204;;0204 0206;LATIN CAPITAL LETTER E WITH INVERTED BREVE;Lu;0;L;0045 0311;;;;N;;;;0207; 0207;LATIN SMALL LETTER E WITH INVERTED BREVE;Ll;0;L;0065 0311;;;;N;;;0206;;0206 0208;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE;Lu;0;L;0049 030F;;;;N;;;;0209; 0209;LATIN SMALL LETTER I WITH DOUBLE GRAVE;Ll;0;L;0069 030F;;;;N;;;0208;;0208 020A;LATIN CAPITAL LETTER I WITH INVERTED BREVE;Lu;0;L;0049 0311;;;;N;;;;020B; 020B;LATIN SMALL LETTER I WITH INVERTED BREVE;Ll;0;L;0069 0311;;;;N;;;020A;;020A 020C;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE;Lu;0;L;004F 030F;;;;N;;;;020D; 020D;LATIN SMALL LETTER O WITH DOUBLE GRAVE;Ll;0;L;006F 030F;;;;N;;;020C;;020C 020E;LATIN CAPITAL LETTER O WITH INVERTED BREVE;Lu;0;L;004F 0311;;;;N;;;;020F; 020F;LATIN SMALL LETTER O WITH INVERTED BREVE;Ll;0;L;006F 0311;;;;N;;;020E;;020E 0210;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE;Lu;0;L;0052 030F;;;;N;;;;0211; 0211;LATIN SMALL LETTER R WITH DOUBLE GRAVE;Ll;0;L;0072 030F;;;;N;;;0210;;0210 0212;LATIN CAPITAL LETTER R WITH INVERTED BREVE;Lu;0;L;0052 0311;;;;N;;;;0213; 0213;LATIN SMALL LETTER R WITH INVERTED BREVE;Ll;0;L;0072 0311;;;;N;;;0212;;0212 0214;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE;Lu;0;L;0055 030F;;;;N;;;;0215; 0215;LATIN SMALL LETTER U WITH DOUBLE GRAVE;Ll;0;L;0075 030F;;;;N;;;0214;;0214 0216;LATIN CAPITAL LETTER U WITH INVERTED BREVE;Lu;0;L;0055 0311;;;;N;;;;0217; 0217;LATIN SMALL LETTER U WITH INVERTED BREVE;Ll;0;L;0075 0311;;;;N;;;0216;;0216 0218;LATIN CAPITAL LETTER S WITH COMMA BELOW;Lu;0;L;0053 0326;;;;N;;;;0219; 0219;LATIN SMALL LETTER S WITH COMMA BELOW;Ll;0;L;0073 0326;;;;N;;;0218;;0218 021A;LATIN CAPITAL LETTER T WITH COMMA BELOW;Lu;0;L;0054 0326;;;;N;;;;021B; 021B;LATIN SMALL LETTER T WITH COMMA BELOW;Ll;0;L;0074 0326;;;;N;;;021A;;021A 021C;LATIN CAPITAL LETTER YOGH;Lu;0;L;;;;;N;;;;021D; 021D;LATIN SMALL LETTER YOGH;Ll;0;L;;;;;N;;;021C;;021C 021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F; 021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E 0220;LATIN CAPITAL LETTER N WITH LONG RIGHT LEG;Lu;0;L;;;;;N;;;;019E; 0221;LATIN SMALL LETTER D WITH CURL;Ll;0;L;;;;;N;;;;; 0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223; 0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222 0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225; 0225;LATIN SMALL LETTER Z WITH HOOK;Ll;0;L;;;;;N;;;0224;;0224 0226;LATIN CAPITAL LETTER A WITH DOT ABOVE;Lu;0;L;0041 0307;;;;N;;;;0227; 0227;LATIN SMALL LETTER A WITH DOT ABOVE;Ll;0;L;0061 0307;;;;N;;;0226;;0226 0228;LATIN CAPITAL LETTER E WITH CEDILLA;Lu;0;L;0045 0327;;;;N;;;;0229; 0229;LATIN SMALL LETTER E WITH CEDILLA;Ll;0;L;0065 0327;;;;N;;;0228;;0228 022A;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON;Lu;0;L;00D6 0304;;;;N;;;;022B; 022B;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON;Ll;0;L;00F6 0304;;;;N;;;022A;;022A 022C;LATIN CAPITAL LETTER O WITH TILDE AND MACRON;Lu;0;L;00D5 0304;;;;N;;;;022D; 022D;LATIN SMALL LETTER O WITH TILDE AND MACRON;Ll;0;L;00F5 0304;;;;N;;;022C;;022C 022E;LATIN CAPITAL LETTER O WITH DOT ABOVE;Lu;0;L;004F 0307;;;;N;;;;022F; 022F;LATIN SMALL LETTER O WITH DOT ABOVE;Ll;0;L;006F 0307;;;;N;;;022E;;022E 0230;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON;Lu;0;L;022E 0304;;;;N;;;;0231; 0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230 0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233; 0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232 0234;LATIN SMALL LETTER L WITH CURL;Ll;0;L;;;;;N;;;;; 0235;LATIN SMALL LETTER N WITH CURL;Ll;0;L;;;;;N;;;;; 0236;LATIN SMALL LETTER T WITH CURL;Ll;0;L;;;;;N;;;;; 0237;LATIN SMALL LETTER DOTLESS J;Ll;0;L;;;;;N;;;;; 0238;LATIN SMALL LETTER DB DIGRAPH;Ll;0;L;;;;;N;;;;; 0239;LATIN SMALL LETTER QP DIGRAPH;Ll;0;L;;;;;N;;;;; 023A;LATIN CAPITAL LETTER A WITH STROKE;Lu;0;L;;;;;N;;;;2C65; 023B;LATIN CAPITAL LETTER C WITH STROKE;Lu;0;L;;;;;N;;;;023C; 023C;LATIN SMALL LETTER C WITH STROKE;Ll;0;L;;;;;N;;;023B;;023B 023D;LATIN CAPITAL LETTER L WITH BAR;Lu;0;L;;;;;N;;;;019A; 023E;LATIN CAPITAL LETTER T WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;2C66; 023F;LATIN SMALL LETTER S WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7E;;2C7E 0240;LATIN SMALL LETTER Z WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7F;;2C7F 0241;LATIN CAPITAL LETTER GLOTTAL STOP;Lu;0;L;;;;;N;;;;0242; 0242;LATIN SMALL LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;0241;;0241 0243;LATIN CAPITAL LETTER B WITH STROKE;Lu;0;L;;;;;N;;;;0180; 0244;LATIN CAPITAL LETTER U BAR;Lu;0;L;;;;;N;;;;0289; 0245;LATIN CAPITAL LETTER TURNED V;Lu;0;L;;;;;N;;;;028C; 0246;LATIN CAPITAL LETTER E WITH STROKE;Lu;0;L;;;;;N;;;;0247; 0247;LATIN SMALL LETTER E WITH STROKE;Ll;0;L;;;;;N;;;0246;;0246 0248;LATIN CAPITAL LETTER J WITH STROKE;Lu;0;L;;;;;N;;;;0249; 0249;LATIN SMALL LETTER J WITH STROKE;Ll;0;L;;;;;N;;;0248;;0248 024A;LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL;Lu;0;L;;;;;N;;;;024B; 024B;LATIN SMALL LETTER Q WITH HOOK TAIL;Ll;0;L;;;;;N;;;024A;;024A 024C;LATIN CAPITAL LETTER R WITH STROKE;Lu;0;L;;;;;N;;;;024D; 024D;LATIN SMALL LETTER R WITH STROKE;Ll;0;L;;;;;N;;;024C;;024C 024E;LATIN CAPITAL LETTER Y WITH STROKE;Lu;0;L;;;;;N;;;;024F; 024F;LATIN SMALL LETTER Y WITH STROKE;Ll;0;L;;;;;N;;;024E;;024E 0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;2C6F;;2C6F 0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;2C6D;;2C6D 0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;2C70;;2C70 0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181 0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186 0255;LATIN SMALL LETTER C WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER C CURL;;;; 0256;LATIN SMALL LETTER D WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER D RETROFLEX HOOK;;0189;;0189 0257;LATIN SMALL LETTER D WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER D HOOK;;018A;;018A 0258;LATIN SMALL LETTER REVERSED E;Ll;0;L;;;;;N;;;;; 0259;LATIN SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;018F;;018F 025A;LATIN SMALL LETTER SCHWA WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCHWA HOOK;;;; 025B;LATIN SMALL LETTER OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER EPSILON;;0190;;0190 025C;LATIN SMALL LETTER REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON;;A7AB;;A7AB 025D;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON HOOK;;;; 025E;LATIN SMALL LETTER CLOSED REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED REVERSED EPSILON;;;; 025F;LATIN SMALL LETTER DOTLESS J WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR;;;; 0260;LATIN SMALL LETTER G WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER G HOOK;;0193;;0193 0261;LATIN SMALL LETTER SCRIPT G;Ll;0;L;;;;;N;;;A7AC;;A7AC 0262;LATIN LETTER SMALL CAPITAL G;Ll;0;L;;;;;N;;;;; 0263;LATIN SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0194;;0194 0264;LATIN SMALL LETTER RAMS HORN;Ll;0;L;;;;;N;LATIN SMALL LETTER BABY GAMMA;;;; 0265;LATIN SMALL LETTER TURNED H;Ll;0;L;;;;;N;;;A78D;;A78D 0266;LATIN SMALL LETTER H WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER H HOOK;;A7AA;;A7AA 0267;LATIN SMALL LETTER HENG WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER HENG HOOK;;;; 0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197 0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196 026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;A7AE;;A7AE 026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;2C62;;2C62 026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;A7AD;;A7AD 026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;; 026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;; 026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C 0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;; 0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;2C6E;;2C6E 0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D 0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;; 0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;; 0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F 0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;; 0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;; 0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;; 0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;; 027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;; 027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;; 027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;; 027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;2C64;;2C64 027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;; 027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;; 0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;;01A6;;01A6 0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;; 0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;;; 0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9 0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;; 0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;; 0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;; 0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;A7B1;;A7B1 0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE 0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;0244;;0244 028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1 028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2 028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;0245;;0245 028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;; 028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;; 028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;; 0290;LATIN SMALL LETTER Z WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Z RETROFLEX HOOK;;;; 0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;; 0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7 0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;; 0294;LATIN LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; 0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;; 0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;; 0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;; 0298;LATIN LETTER BILABIAL CLICK;Ll;0;L;;;;;N;LATIN LETTER BULLSEYE;;;; 0299;LATIN LETTER SMALL CAPITAL B;Ll;0;L;;;;;N;;;;; 029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;; 029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;; 029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;; 029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;A7B2;;A7B2 029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;A7B0;;A7B0 029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;; 02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;; 02A1;LATIN LETTER GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER GLOTTAL STOP BAR;;;; 02A2;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP BAR;;;; 02A3;LATIN SMALL LETTER DZ DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z;;;; 02A4;LATIN SMALL LETTER DEZH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D YOGH;;;; 02A5;LATIN SMALL LETTER DZ DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z CURL;;;; 02A6;LATIN SMALL LETTER TS DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T S;;;; 02A7;LATIN SMALL LETTER TESH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T ESH;;;; 02A8;LATIN SMALL LETTER TC DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER T C CURL;;;; 02A9;LATIN SMALL LETTER FENG DIGRAPH;Ll;0;L;;;;;N;;;;; 02AA;LATIN SMALL LETTER LS DIGRAPH;Ll;0;L;;;;;N;;;;; 02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;; 02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; 02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; 02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK;Ll;0;L;;;;;N;;;;; 02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;Ll;0;L;;;;;N;;;;; 02B0;MODIFIER LETTER SMALL H;Lm;0;L;<super> 0068;;;;N;;;;; 02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L;<super> 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;; 02B2;MODIFIER LETTER SMALL J;Lm;0;L;<super> 006A;;;;N;;;;; 02B3;MODIFIER LETTER SMALL R;Lm;0;L;<super> 0072;;;;N;;;;; 02B4;MODIFIER LETTER SMALL TURNED R;Lm;0;L;<super> 0279;;;;N;;;;; 02B5;MODIFIER LETTER SMALL TURNED R WITH HOOK;Lm;0;L;<super> 027B;;;;N;MODIFIER LETTER SMALL TURNED R HOOK;;;; 02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L;<super> 0281;;;;N;;;;; 02B7;MODIFIER LETTER SMALL W;Lm;0;L;<super> 0077;;;;N;;;;; 02B8;MODIFIER LETTER SMALL Y;Lm;0;L;<super> 0079;;;;N;;;;; 02B9;MODIFIER LETTER PRIME;Lm;0;ON;;;;;N;;;;; 02BA;MODIFIER LETTER DOUBLE PRIME;Lm;0;ON;;;;;N;;;;; 02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;; 02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;; 02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;; 02BE;MODIFIER LETTER RIGHT HALF RING;Lm;0;L;;;;;N;;;;; 02BF;MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; 02C0;MODIFIER LETTER GLOTTAL STOP;Lm;0;L;;;;;N;;;;; 02C1;MODIFIER LETTER REVERSED GLOTTAL STOP;Lm;0;L;;;;;N;;;;; 02C2;MODIFIER LETTER LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; 02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; 02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; 02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; 02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;; 02C7;CARON;Lm;0;ON;;;;;N;MODIFIER LETTER HACEK;;;; 02C8;MODIFIER LETTER VERTICAL LINE;Lm;0;ON;;;;;N;;;;; 02C9;MODIFIER LETTER MACRON;Lm;0;ON;;;;;N;;;;; 02CA;MODIFIER LETTER ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER ACUTE;;;; 02CB;MODIFIER LETTER GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER GRAVE;;;; 02CC;MODIFIER LETTER LOW VERTICAL LINE;Lm;0;ON;;;;;N;;;;; 02CD;MODIFIER LETTER LOW MACRON;Lm;0;ON;;;;;N;;;;; 02CE;MODIFIER LETTER LOW GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;; 02CF;MODIFIER LETTER LOW ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;; 02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; 02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; 02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;; 02D3;MODIFIER LETTER CENTRED LEFT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED LEFT HALF RING;;;; 02D4;MODIFIER LETTER UP TACK;Sk;0;ON;;;;;N;;;;; 02D5;MODIFIER LETTER DOWN TACK;Sk;0;ON;;;;;N;;;;; 02D6;MODIFIER LETTER PLUS SIGN;Sk;0;ON;;;;;N;;;;; 02D7;MODIFIER LETTER MINUS SIGN;Sk;0;ON;;;;;N;;;;; 02D8;BREVE;Sk;0;ON;<compat> 0020 0306;;;;N;SPACING BREVE;;;; 02D9;DOT ABOVE;Sk;0;ON;<compat> 0020 0307;;;;N;SPACING DOT ABOVE;;;; 02DA;RING ABOVE;Sk;0;ON;<compat> 0020 030A;;;;N;SPACING RING ABOVE;;;; 02DB;OGONEK;Sk;0;ON;<compat> 0020 0328;;;;N;SPACING OGONEK;;;; 02DC;SMALL TILDE;Sk;0;ON;<compat> 0020 0303;;;;N;SPACING TILDE;;;; 02DD;DOUBLE ACUTE ACCENT;Sk;0;ON;<compat> 0020 030B;;;;N;SPACING DOUBLE ACUTE;;;; 02DE;MODIFIER LETTER RHOTIC HOOK;Sk;0;ON;;;;;N;;;;; 02DF;MODIFIER LETTER CROSS ACCENT;Sk;0;ON;;;;;N;;;;; 02E0;MODIFIER LETTER SMALL GAMMA;Lm;0;L;<super> 0263;;;;N;;;;; 02E1;MODIFIER LETTER SMALL L;Lm;0;L;<super> 006C;;;;N;;;;; 02E2;MODIFIER LETTER SMALL S;Lm;0;L;<super> 0073;;;;N;;;;; 02E3;MODIFIER LETTER SMALL X;Lm;0;L;<super> 0078;;;;N;;;;; 02E4;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP;Lm;0;L;<super> 0295;;;;N;;;;; 02E5;MODIFIER LETTER EXTRA-HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; 02E6;MODIFIER LETTER HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; 02E7;MODIFIER LETTER MID TONE BAR;Sk;0;ON;;;;;N;;;;; 02E8;MODIFIER LETTER LOW TONE BAR;Sk;0;ON;;;;;N;;;;; 02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;; 02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; 02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; 02EC;MODIFIER LETTER VOICING;Lm;0;ON;;;;;N;;;;; 02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;; 02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;; 02EF;MODIFIER LETTER LOW DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; 02F0;MODIFIER LETTER LOW UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; 02F1;MODIFIER LETTER LOW LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; 02F2;MODIFIER LETTER LOW RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; 02F3;MODIFIER LETTER LOW RING;Sk;0;ON;;;;;N;;;;; 02F4;MODIFIER LETTER MIDDLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;; 02F5;MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;; 02F6;MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT;Sk;0;ON;;;;;N;;;;; 02F7;MODIFIER LETTER LOW TILDE;Sk;0;ON;;;;;N;;;;; 02F8;MODIFIER LETTER RAISED COLON;Sk;0;ON;;;;;N;;;;; 02F9;MODIFIER LETTER BEGIN HIGH TONE;Sk;0;ON;;;;;N;;;;; 02FA;MODIFIER LETTER END HIGH TONE;Sk;0;ON;;;;;N;;;;; 02FB;MODIFIER LETTER BEGIN LOW TONE;Sk;0;ON;;;;;N;;;;; 02FC;MODIFIER LETTER END LOW TONE;Sk;0;ON;;;;;N;;;;; 02FD;MODIFIER LETTER SHELF;Sk;0;ON;;;;;N;;;;; 02FE;MODIFIER LETTER OPEN SHELF;Sk;0;ON;;;;;N;;;;; 02FF;MODIFIER LETTER LOW LEFT ARROW;Sk;0;ON;;;;;N;;;;; 0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;;;; 0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;;;; 0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;; 0303;COMBINING TILDE;Mn;230;NSM;;;;;N;NON-SPACING TILDE;;;; 0304;COMBINING MACRON;Mn;230;NSM;;;;;N;NON-SPACING MACRON;;;; 0305;COMBINING OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING OVERSCORE;;;; 0306;COMBINING BREVE;Mn;230;NSM;;;;;N;NON-SPACING BREVE;;;; 0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;; 0308;COMBINING DIAERESIS;Mn;230;NSM;;;;;N;NON-SPACING DIAERESIS;;;; 0309;COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;NON-SPACING HOOK ABOVE;;;; 030A;COMBINING RING ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RING ABOVE;;;; 030B;COMBINING DOUBLE ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE ACUTE;;;; 030C;COMBINING CARON;Mn;230;NSM;;;;;N;NON-SPACING HACEK;;;; 030D;COMBINING VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL LINE ABOVE;;;; 030E;COMBINING DOUBLE VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE VERTICAL LINE ABOVE;;;; 030F;COMBINING DOUBLE GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE GRAVE;;;; 0310;COMBINING CANDRABINDU;Mn;230;NSM;;;;;N;NON-SPACING CANDRABINDU;;;; 0311;COMBINING INVERTED BREVE;Mn;230;NSM;;;;;N;NON-SPACING INVERTED BREVE;;;; 0312;COMBINING TURNED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING TURNED COMMA ABOVE;;;; 0313;COMBINING COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING COMMA ABOVE;;;; 0314;COMBINING REVERSED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING REVERSED COMMA ABOVE;;;; 0315;COMBINING COMMA ABOVE RIGHT;Mn;232;NSM;;;;;N;NON-SPACING COMMA ABOVE RIGHT;;;; 0316;COMBINING GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING GRAVE BELOW;;;; 0317;COMBINING ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING ACUTE BELOW;;;; 0318;COMBINING LEFT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT TACK BELOW;;;; 0319;COMBINING RIGHT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT TACK BELOW;;;; 031A;COMBINING LEFT ANGLE ABOVE;Mn;232;NSM;;;;;N;NON-SPACING LEFT ANGLE ABOVE;;;; 031B;COMBINING HORN;Mn;216;NSM;;;;;N;NON-SPACING HORN;;;; 031C;COMBINING LEFT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT HALF RING BELOW;;;; 031D;COMBINING UP TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING UP TACK BELOW;;;; 031E;COMBINING DOWN TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOWN TACK BELOW;;;; 031F;COMBINING PLUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING PLUS SIGN BELOW;;;; 0320;COMBINING MINUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING MINUS SIGN BELOW;;;; 0321;COMBINING PALATALIZED HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING PALATALIZED HOOK BELOW;;;; 0322;COMBINING RETROFLEX HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING RETROFLEX HOOK BELOW;;;; 0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;; 0324;COMBINING DIAERESIS BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE DOT BELOW;;;; 0325;COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;; 0326;COMBINING COMMA BELOW;Mn;220;NSM;;;;;N;NON-SPACING COMMA BELOW;;;; 0327;COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;; 0328;COMBINING OGONEK;Mn;202;NSM;;;;;N;NON-SPACING OGONEK;;;; 0329;COMBINING VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;NON-SPACING VERTICAL LINE BELOW;;;; 032A;COMBINING BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BRIDGE BELOW;;;; 032B;COMBINING INVERTED DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED DOUBLE ARCH BELOW;;;; 032C;COMBINING CARON BELOW;Mn;220;NSM;;;;;N;NON-SPACING HACEK BELOW;;;; 032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;; 032E;COMBINING BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BREVE BELOW;;;; 032F;COMBINING INVERTED BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BREVE BELOW;;;; 0330;COMBINING TILDE BELOW;Mn;220;NSM;;;;;N;NON-SPACING TILDE BELOW;;;; 0331;COMBINING MACRON BELOW;Mn;220;NSM;;;;;N;NON-SPACING MACRON BELOW;;;; 0332;COMBINING LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING UNDERSCORE;;;; 0333;COMBINING DOUBLE LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE UNDERSCORE;;;; 0334;COMBINING TILDE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING TILDE OVERLAY;;;; 0335;COMBINING SHORT STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT BAR OVERLAY;;;; 0336;COMBINING LONG STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG BAR OVERLAY;;;; 0337;COMBINING SHORT SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT SLASH OVERLAY;;;; 0338;COMBINING LONG SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG SLASH OVERLAY;;;; 0339;COMBINING RIGHT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT HALF RING BELOW;;;; 033A;COMBINING INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BRIDGE BELOW;;;; 033B;COMBINING SQUARE BELOW;Mn;220;NSM;;;;;N;NON-SPACING SQUARE BELOW;;;; 033C;COMBINING SEAGULL BELOW;Mn;220;NSM;;;;;N;NON-SPACING SEAGULL BELOW;;;; 033D;COMBINING X ABOVE;Mn;230;NSM;;;;;N;NON-SPACING X ABOVE;;;; 033E;COMBINING VERTICAL TILDE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL TILDE;;;; 033F;COMBINING DOUBLE OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE OVERSCORE;;;; 0340;COMBINING GRAVE TONE MARK;Mn;230;NSM;0300;;;;N;NON-SPACING GRAVE TONE MARK;;;; 0341;COMBINING ACUTE TONE MARK;Mn;230;NSM;0301;;;;N;NON-SPACING ACUTE TONE MARK;;;; 0342;COMBINING GREEK PERISPOMENI;Mn;230;NSM;;;;;N;;;;; 0343;COMBINING GREEK KORONIS;Mn;230;NSM;0313;;;;N;;;;; 0344;COMBINING GREEK DIALYTIKA TONOS;Mn;230;NSM;0308 0301;;;;N;GREEK NON-SPACING DIAERESIS TONOS;;;; 0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA BELOW;;0399;;0399 0346;COMBINING BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; 0347;COMBINING EQUALS SIGN BELOW;Mn;220;NSM;;;;;N;;;;; 0348;COMBINING DOUBLE VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;;;;; 0349;COMBINING LEFT ANGLE BELOW;Mn;220;NSM;;;;;N;;;;; 034A;COMBINING NOT TILDE ABOVE;Mn;230;NSM;;;;;N;;;;; 034B;COMBINING HOMOTHETIC ABOVE;Mn;230;NSM;;;;;N;;;;; 034C;COMBINING ALMOST EQUAL TO ABOVE;Mn;230;NSM;;;;;N;;;;; 034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; 034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;; 034F;COMBINING GRAPHEME JOINER;Mn;0;NSM;;;;;N;;;;; 0350;COMBINING RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; 0351;COMBINING LEFT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; 0352;COMBINING FERMATA;Mn;230;NSM;;;;;N;;;;; 0353;COMBINING X BELOW;Mn;220;NSM;;;;;N;;;;; 0354;COMBINING LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; 0355;COMBINING RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; 0356;COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; 0357;COMBINING RIGHT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; 0358;COMBINING DOT ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;; 0359;COMBINING ASTERISK BELOW;Mn;220;NSM;;;;;N;;;;; 035A;COMBINING DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; 035B;COMBINING ZIGZAG ABOVE;Mn;230;NSM;;;;;N;;;;; 035C;COMBINING DOUBLE BREVE BELOW;Mn;233;NSM;;;;;N;;;;; 035D;COMBINING DOUBLE BREVE;Mn;234;NSM;;;;;N;;;;; 035E;COMBINING DOUBLE MACRON;Mn;234;NSM;;;;;N;;;;; 035F;COMBINING DOUBLE MACRON BELOW;Mn;233;NSM;;;;;N;;;;; 0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;; 0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;; 0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;; 0363;COMBINING LATIN SMALL LETTER A;Mn;230;NSM;;;;;N;;;;; 0364;COMBINING LATIN SMALL LETTER E;Mn;230;NSM;;;;;N;;;;; 0365;COMBINING LATIN SMALL LETTER I;Mn;230;NSM;;;;;N;;;;; 0366;COMBINING LATIN SMALL LETTER O;Mn;230;NSM;;;;;N;;;;; 0367;COMBINING LATIN SMALL LETTER U;Mn;230;NSM;;;;;N;;;;; 0368;COMBINING LATIN SMALL LETTER C;Mn;230;NSM;;;;;N;;;;; 0369;COMBINING LATIN SMALL LETTER D;Mn;230;NSM;;;;;N;;;;; 036A;COMBINING LATIN SMALL LETTER H;Mn;230;NSM;;;;;N;;;;; 036B;COMBINING LATIN SMALL LETTER M;Mn;230;NSM;;;;;N;;;;; 036C;COMBINING LATIN SMALL LETTER R;Mn;230;NSM;;;;;N;;;;; 036D;COMBINING LATIN SMALL LETTER T;Mn;230;NSM;;;;;N;;;;; 036E;COMBINING LATIN SMALL LETTER V;Mn;230;NSM;;;;;N;;;;; 036F;COMBINING LATIN SMALL LETTER X;Mn;230;NSM;;;;;N;;;;; 0370;GREEK CAPITAL LETTER HETA;Lu;0;L;;;;;N;;;;0371; 0371;GREEK SMALL LETTER HETA;Ll;0;L;;;;;N;;;0370;;0370 0372;GREEK CAPITAL LETTER ARCHAIC SAMPI;Lu;0;L;;;;;N;;;;0373; 0373;GREEK SMALL LETTER ARCHAIC SAMPI;Ll;0;L;;;;;N;;;0372;;0372 0374;GREEK NUMERAL SIGN;Lm;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;;;; 0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;;;; 0376;GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA;Lu;0;L;;;;;N;;;;0377; 0377;GREEK SMALL LETTER PAMPHYLIAN DIGAMMA;Ll;0;L;;;;;N;;;0376;;0376 037A;GREEK YPOGEGRAMMENI;Lm;0;L;<compat> 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;; 037B;GREEK SMALL REVERSED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FD;;03FD 037C;GREEK SMALL DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FE;;03FE 037D;GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FF;;03FF 037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;;;; 037F;GREEK CAPITAL LETTER YOT;Lu;0;L;;;;;N;;;;03F3; 0384;GREEK TONOS;Sk;0;ON;<compat> 0020 0301;;;;N;GREEK SPACING TONOS;;;; 0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;; 0386;GREEK CAPITAL LETTER ALPHA WITH TONOS;Lu;0;L;0391 0301;;;;N;GREEK CAPITAL LETTER ALPHA TONOS;;;03AC; 0387;GREEK ANO TELEIA;Po;0;ON;00B7;;;;N;;;;; 0388;GREEK CAPITAL LETTER EPSILON WITH TONOS;Lu;0;L;0395 0301;;;;N;GREEK CAPITAL LETTER EPSILON TONOS;;;03AD; 0389;GREEK CAPITAL LETTER ETA WITH TONOS;Lu;0;L;0397 0301;;;;N;GREEK CAPITAL LETTER ETA TONOS;;;03AE; 038A;GREEK CAPITAL LETTER IOTA WITH TONOS;Lu;0;L;0399 0301;;;;N;GREEK CAPITAL LETTER IOTA TONOS;;;03AF; 038C;GREEK CAPITAL LETTER OMICRON WITH TONOS;Lu;0;L;039F 0301;;;;N;GREEK CAPITAL LETTER OMICRON TONOS;;;03CC; 038E;GREEK CAPITAL LETTER UPSILON WITH TONOS;Lu;0;L;03A5 0301;;;;N;GREEK CAPITAL LETTER UPSILON TONOS;;;03CD; 038F;GREEK CAPITAL LETTER OMEGA WITH TONOS;Lu;0;L;03A9 0301;;;;N;GREEK CAPITAL LETTER OMEGA TONOS;;;03CE; 0390;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS;Ll;0;L;03CA 0301;;;;N;GREEK SMALL LETTER IOTA DIAERESIS TONOS;;;; 0391;GREEK CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;03B1; 0392;GREEK CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;03B2; 0393;GREEK CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;03B3; 0394;GREEK CAPITAL LETTER DELTA;Lu;0;L;;;;;N;;;;03B4; 0395;GREEK CAPITAL LETTER EPSILON;Lu;0;L;;;;;N;;;;03B5; 0396;GREEK CAPITAL LETTER ZETA;Lu;0;L;;;;;N;;;;03B6; 0397;GREEK CAPITAL LETTER ETA;Lu;0;L;;;;;N;;;;03B7; 0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8; 0399;GREEK CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;03B9; 039A;GREEK CAPITAL LETTER KAPPA;Lu;0;L;;;;;N;;;;03BA; 039B;GREEK CAPITAL LETTER LAMDA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER LAMBDA;;;03BB; 039C;GREEK CAPITAL LETTER MU;Lu;0;L;;;;;N;;;;03BC; 039D;GREEK CAPITAL LETTER NU;Lu;0;L;;;;;N;;;;03BD; 039E;GREEK CAPITAL LETTER XI;Lu;0;L;;;;;N;;;;03BE; 039F;GREEK CAPITAL LETTER OMICRON;Lu;0;L;;;;;N;;;;03BF; 03A0;GREEK CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;03C0; 03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1; 03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3; 03A4;GREEK CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;03C4; 03A5;GREEK CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;03C5; 03A6;GREEK CAPITAL LETTER PHI;Lu;0;L;;;;;N;;;;03C6; 03A7;GREEK CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;03C7; 03A8;GREEK CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;03C8; 03A9;GREEK CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;03C9; 03AA;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA;Lu;0;L;0399 0308;;;;N;GREEK CAPITAL LETTER IOTA DIAERESIS;;;03CA; 03AB;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA;Lu;0;L;03A5 0308;;;;N;GREEK CAPITAL LETTER UPSILON DIAERESIS;;;03CB; 03AC;GREEK SMALL LETTER ALPHA WITH TONOS;Ll;0;L;03B1 0301;;;;N;GREEK SMALL LETTER ALPHA TONOS;;0386;;0386 03AD;GREEK SMALL LETTER EPSILON WITH TONOS;Ll;0;L;03B5 0301;;;;N;GREEK SMALL LETTER EPSILON TONOS;;0388;;0388 03AE;GREEK SMALL LETTER ETA WITH TONOS;Ll;0;L;03B7 0301;;;;N;GREEK SMALL LETTER ETA TONOS;;0389;;0389 03AF;GREEK SMALL LETTER IOTA WITH TONOS;Ll;0;L;03B9 0301;;;;N;GREEK SMALL LETTER IOTA TONOS;;038A;;038A 03B0;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS;Ll;0;L;03CB 0301;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS TONOS;;;; 03B1;GREEK SMALL LETTER ALPHA;Ll;0;L;;;;;N;;;0391;;0391 03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392 03B3;GREEK SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0393;;0393 03B4;GREEK SMALL LETTER DELTA;Ll;0;L;;;;;N;;;0394;;0394 03B5;GREEK SMALL LETTER EPSILON;Ll;0;L;;;;;N;;;0395;;0395 03B6;GREEK SMALL LETTER ZETA;Ll;0;L;;;;;N;;;0396;;0396 03B7;GREEK SMALL LETTER ETA;Ll;0;L;;;;;N;;;0397;;0397 03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398 03B9;GREEK SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0399;;0399 03BA;GREEK SMALL LETTER KAPPA;Ll;0;L;;;;;N;;;039A;;039A 03BB;GREEK SMALL LETTER LAMDA;Ll;0;L;;;;;N;GREEK SMALL LETTER LAMBDA;;039B;;039B 03BC;GREEK SMALL LETTER MU;Ll;0;L;;;;;N;;;039C;;039C 03BD;GREEK SMALL LETTER NU;Ll;0;L;;;;;N;;;039D;;039D 03BE;GREEK SMALL LETTER XI;Ll;0;L;;;;;N;;;039E;;039E 03BF;GREEK SMALL LETTER OMICRON;Ll;0;L;;;;;N;;;039F;;039F 03C0;GREEK SMALL LETTER PI;Ll;0;L;;;;;N;;;03A0;;03A0 03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1 03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 03C4;GREEK SMALL LETTER TAU;Ll;0;L;;;;;N;;;03A4;;03A4 03C5;GREEK SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;03A5;;03A5 03C6;GREEK SMALL LETTER PHI;Ll;0;L;;;;;N;;;03A6;;03A6 03C7;GREEK SMALL LETTER CHI;Ll;0;L;;;;;N;;;03A7;;03A7 03C8;GREEK SMALL LETTER PSI;Ll;0;L;;;;;N;;;03A8;;03A8 03C9;GREEK SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;03A9;;03A9 03CA;GREEK SMALL LETTER IOTA WITH DIALYTIKA;Ll;0;L;03B9 0308;;;;N;GREEK SMALL LETTER IOTA DIAERESIS;;03AA;;03AA 03CB;GREEK SMALL LETTER UPSILON WITH DIALYTIKA;Ll;0;L;03C5 0308;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS;;03AB;;03AB 03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C 03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E 03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F 03CF;GREEK CAPITAL KAI SYMBOL;Lu;0;L;;;;;N;;;;03D7; 03D0;GREEK BETA SYMBOL;Ll;0;L;<compat> 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392 03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398 03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L;<compat> 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;; 03D3;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL;Lu;0;L;03D2 0301;;;;N;GREEK CAPITAL LETTER UPSILON HOOK TONOS;;;; 03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;; 03D5;GREEK PHI SYMBOL;Ll;0;L;<compat> 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6 03D6;GREEK PI SYMBOL;Ll;0;L;<compat> 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0 03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;03CF;;03CF 03D8;GREEK LETTER ARCHAIC KOPPA;Lu;0;L;;;;;N;;;;03D9; 03D9;GREEK SMALL LETTER ARCHAIC KOPPA;Ll;0;L;;;;;N;;;03D8;;03D8 03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB; 03DB;GREEK SMALL LETTER STIGMA;Ll;0;L;;;;;N;;;03DA;;03DA 03DC;GREEK LETTER DIGAMMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DIGAMMA;;;03DD; 03DD;GREEK SMALL LETTER DIGAMMA;Ll;0;L;;;;;N;;;03DC;;03DC 03DE;GREEK LETTER KOPPA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KOPPA;;;03DF; 03DF;GREEK SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;03DE;;03DE 03E0;GREEK LETTER SAMPI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SAMPI;;;03E1; 03E1;GREEK SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;03E0;;03E0 03E2;COPTIC CAPITAL LETTER SHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHEI;;;03E3; 03E3;COPTIC SMALL LETTER SHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER SHEI;;03E2;;03E2 03E4;COPTIC CAPITAL LETTER FEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER FEI;;;03E5; 03E5;COPTIC SMALL LETTER FEI;Ll;0;L;;;;;N;GREEK SMALL LETTER FEI;;03E4;;03E4 03E6;COPTIC CAPITAL LETTER KHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KHEI;;;03E7; 03E7;COPTIC SMALL LETTER KHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER KHEI;;03E6;;03E6 03E8;COPTIC CAPITAL LETTER HORI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER HORI;;;03E9; 03E9;COPTIC SMALL LETTER HORI;Ll;0;L;;;;;N;GREEK SMALL LETTER HORI;;03E8;;03E8 03EA;COPTIC CAPITAL LETTER GANGIA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER GANGIA;;;03EB; 03EB;COPTIC SMALL LETTER GANGIA;Ll;0;L;;;;;N;GREEK SMALL LETTER GANGIA;;03EA;;03EA 03EC;COPTIC CAPITAL LETTER SHIMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHIMA;;;03ED; 03ED;COPTIC SMALL LETTER SHIMA;Ll;0;L;;;;;N;GREEK SMALL LETTER SHIMA;;03EC;;03EC 03EE;COPTIC CAPITAL LETTER DEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DEI;;;03EF; 03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE 03F0;GREEK KAPPA SYMBOL;Ll;0;L;<compat> 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A 03F1;GREEK RHO SYMBOL;Ll;0;L;<compat> 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1 03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L;<compat> 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03F9;;03F9 03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;037F;;037F 03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L;<compat> 0398;;;;N;;;;03B8; 03F5;GREEK LUNATE EPSILON SYMBOL;Ll;0;L;<compat> 03B5;;;;N;;;0395;;0395 03F6;GREEK REVERSED LUNATE EPSILON SYMBOL;Sm;0;ON;;;;;N;;;;; 03F7;GREEK CAPITAL LETTER SHO;Lu;0;L;;;;;N;;;;03F8; 03F8;GREEK SMALL LETTER SHO;Ll;0;L;;;;;N;;;03F7;;03F7 03F9;GREEK CAPITAL LUNATE SIGMA SYMBOL;Lu;0;L;<compat> 03A3;;;;N;;;;03F2; 03FA;GREEK CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;03FB; 03FB;GREEK SMALL LETTER SAN;Ll;0;L;;;;;N;;;03FA;;03FA 03FC;GREEK RHO WITH STROKE SYMBOL;Ll;0;L;;;;;N;;;;; 03FD;GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037B; 03FE;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037C; 03FF;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037D; 0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450; 0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451; 0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;;;0452; 0403;CYRILLIC CAPITAL LETTER GJE;Lu;0;L;0413 0301;;;;N;;;;0453; 0404;CYRILLIC CAPITAL LETTER UKRAINIAN IE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER E;;;0454; 0405;CYRILLIC CAPITAL LETTER DZE;Lu;0;L;;;;;N;;;;0455; 0406;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER I;;;0456; 0407;CYRILLIC CAPITAL LETTER YI;Lu;0;L;0406 0308;;;;N;;;;0457; 0408;CYRILLIC CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;0458; 0409;CYRILLIC CAPITAL LETTER LJE;Lu;0;L;;;;;N;;;;0459; 040A;CYRILLIC CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;045A; 040B;CYRILLIC CAPITAL LETTER TSHE;Lu;0;L;;;;;N;;;;045B; 040C;CYRILLIC CAPITAL LETTER KJE;Lu;0;L;041A 0301;;;;N;;;;045C; 040D;CYRILLIC CAPITAL LETTER I WITH GRAVE;Lu;0;L;0418 0300;;;;N;;;;045D; 040E;CYRILLIC CAPITAL LETTER SHORT U;Lu;0;L;0423 0306;;;;N;;;;045E; 040F;CYRILLIC CAPITAL LETTER DZHE;Lu;0;L;;;;;N;;;;045F; 0410;CYRILLIC CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0430; 0411;CYRILLIC CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;0431; 0412;CYRILLIC CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;0432; 0413;CYRILLIC CAPITAL LETTER GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE;;;0433; 0414;CYRILLIC CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;0434; 0415;CYRILLIC CAPITAL LETTER IE;Lu;0;L;;;;;N;;;;0435; 0416;CYRILLIC CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;0436; 0417;CYRILLIC CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;0437; 0418;CYRILLIC CAPITAL LETTER I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER II;;;0438; 0419;CYRILLIC CAPITAL LETTER SHORT I;Lu;0;L;0418 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT II;;;0439; 041A;CYRILLIC CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;043A; 041B;CYRILLIC CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;043B; 041C;CYRILLIC CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;043C; 041D;CYRILLIC CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;043D; 041E;CYRILLIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;043E; 041F;CYRILLIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;043F; 0420;CYRILLIC CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;0440; 0421;CYRILLIC CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;0441; 0422;CYRILLIC CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;0442; 0423;CYRILLIC CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0443; 0424;CYRILLIC CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;0444; 0425;CYRILLIC CAPITAL LETTER HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA;;;0445; 0426;CYRILLIC CAPITAL LETTER TSE;Lu;0;L;;;;;N;;;;0446; 0427;CYRILLIC CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;0447; 0428;CYRILLIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0448; 0429;CYRILLIC CAPITAL LETTER SHCHA;Lu;0;L;;;;;N;;;;0449; 042A;CYRILLIC CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;044A; 042B;CYRILLIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER YERI;;;044B; 042C;CYRILLIC CAPITAL LETTER SOFT SIGN;Lu;0;L;;;;;N;;;;044C; 042D;CYRILLIC CAPITAL LETTER E;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED E;;;044D; 042E;CYRILLIC CAPITAL LETTER YU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IU;;;044E; 042F;CYRILLIC CAPITAL LETTER YA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IA;;;044F; 0430;CYRILLIC SMALL LETTER A;Ll;0;L;;;;;N;;;0410;;0410 0431;CYRILLIC SMALL LETTER BE;Ll;0;L;;;;;N;;;0411;;0411 0432;CYRILLIC SMALL LETTER VE;Ll;0;L;;;;;N;;;0412;;0412 0433;CYRILLIC SMALL LETTER GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE;;0413;;0413 0434;CYRILLIC SMALL LETTER DE;Ll;0;L;;;;;N;;;0414;;0414 0435;CYRILLIC SMALL LETTER IE;Ll;0;L;;;;;N;;;0415;;0415 0436;CYRILLIC SMALL LETTER ZHE;Ll;0;L;;;;;N;;;0416;;0416 0437;CYRILLIC SMALL LETTER ZE;Ll;0;L;;;;;N;;;0417;;0417 0438;CYRILLIC SMALL LETTER I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER II;;0418;;0418 0439;CYRILLIC SMALL LETTER SHORT I;Ll;0;L;0438 0306;;;;N;CYRILLIC SMALL LETTER SHORT II;;0419;;0419 043A;CYRILLIC SMALL LETTER KA;Ll;0;L;;;;;N;;;041A;;041A 043B;CYRILLIC SMALL LETTER EL;Ll;0;L;;;;;N;;;041B;;041B 043C;CYRILLIC SMALL LETTER EM;Ll;0;L;;;;;N;;;041C;;041C 043D;CYRILLIC SMALL LETTER EN;Ll;0;L;;;;;N;;;041D;;041D 043E;CYRILLIC SMALL LETTER O;Ll;0;L;;;;;N;;;041E;;041E 043F;CYRILLIC SMALL LETTER PE;Ll;0;L;;;;;N;;;041F;;041F 0440;CYRILLIC SMALL LETTER ER;Ll;0;L;;;;;N;;;0420;;0420 0441;CYRILLIC SMALL LETTER ES;Ll;0;L;;;;;N;;;0421;;0421 0442;CYRILLIC SMALL LETTER TE;Ll;0;L;;;;;N;;;0422;;0422 0443;CYRILLIC SMALL LETTER U;Ll;0;L;;;;;N;;;0423;;0423 0444;CYRILLIC SMALL LETTER EF;Ll;0;L;;;;;N;;;0424;;0424 0445;CYRILLIC SMALL LETTER HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA;;0425;;0425 0446;CYRILLIC SMALL LETTER TSE;Ll;0;L;;;;;N;;;0426;;0426 0447;CYRILLIC SMALL LETTER CHE;Ll;0;L;;;;;N;;;0427;;0427 0448;CYRILLIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;0428;;0428 0449;CYRILLIC SMALL LETTER SHCHA;Ll;0;L;;;;;N;;;0429;;0429 044A;CYRILLIC SMALL LETTER HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A 044B;CYRILLIC SMALL LETTER YERU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER YERI;;042B;;042B 044C;CYRILLIC SMALL LETTER SOFT SIGN;Ll;0;L;;;;;N;;;042C;;042C 044D;CYRILLIC SMALL LETTER E;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED E;;042D;;042D 044E;CYRILLIC SMALL LETTER YU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IU;;042E;;042E 044F;CYRILLIC SMALL LETTER YA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IA;;042F;;042F 0450;CYRILLIC SMALL LETTER IE WITH GRAVE;Ll;0;L;0435 0300;;;;N;;;0400;;0400 0451;CYRILLIC SMALL LETTER IO;Ll;0;L;0435 0308;;;;N;;;0401;;0401 0452;CYRILLIC SMALL LETTER DJE;Ll;0;L;;;;;N;;;0402;;0402 0453;CYRILLIC SMALL LETTER GJE;Ll;0;L;0433 0301;;;;N;;;0403;;0403 0454;CYRILLIC SMALL LETTER UKRAINIAN IE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER E;;0404;;0404 0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405 0456;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER I;;0406;;0406 0457;CYRILLIC SMALL LETTER YI;Ll;0;L;0456 0308;;;;N;;;0407;;0407 0458;CYRILLIC SMALL LETTER JE;Ll;0;L;;;;;N;;;0408;;0408 0459;CYRILLIC SMALL LETTER LJE;Ll;0;L;;;;;N;;;0409;;0409 045A;CYRILLIC SMALL LETTER NJE;Ll;0;L;;;;;N;;;040A;;040A 045B;CYRILLIC SMALL LETTER TSHE;Ll;0;L;;;;;N;;;040B;;040B 045C;CYRILLIC SMALL LETTER KJE;Ll;0;L;043A 0301;;;;N;;;040C;;040C 045D;CYRILLIC SMALL LETTER I WITH GRAVE;Ll;0;L;0438 0300;;;;N;;;040D;;040D 045E;CYRILLIC SMALL LETTER SHORT U;Ll;0;L;0443 0306;;;;N;;;040E;;040E 045F;CYRILLIC SMALL LETTER DZHE;Ll;0;L;;;;;N;;;040F;;040F 0460;CYRILLIC CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;0461; 0461;CYRILLIC SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;0460;;0460 0462;CYRILLIC CAPITAL LETTER YAT;Lu;0;L;;;;;N;;;;0463; 0463;CYRILLIC SMALL LETTER YAT;Ll;0;L;;;;;N;;;0462;;0462 0464;CYRILLIC CAPITAL LETTER IOTIFIED E;Lu;0;L;;;;;N;;;;0465; 0465;CYRILLIC SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;0464;;0464 0466;CYRILLIC CAPITAL LETTER LITTLE YUS;Lu;0;L;;;;;N;;;;0467; 0467;CYRILLIC SMALL LETTER LITTLE YUS;Ll;0;L;;;;;N;;;0466;;0466 0468;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS;Lu;0;L;;;;;N;;;;0469; 0469;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS;Ll;0;L;;;;;N;;;0468;;0468 046A;CYRILLIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;046B; 046B;CYRILLIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;046A;;046A 046C;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS;Lu;0;L;;;;;N;;;;046D; 046D;CYRILLIC SMALL LETTER IOTIFIED BIG YUS;Ll;0;L;;;;;N;;;046C;;046C 046E;CYRILLIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;046F; 046F;CYRILLIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;046E;;046E 0470;CYRILLIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;0471; 0471;CYRILLIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;0470;;0470 0472;CYRILLIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;0473; 0473;CYRILLIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;0472;;0472 0474;CYRILLIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;0475; 0475;CYRILLIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;0474;;0474 0476;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Lu;0;L;0474 030F;;;;N;CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE;;;0477; 0477;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Ll;0;L;0475 030F;;;;N;CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE;;0476;;0476 0478;CYRILLIC CAPITAL LETTER UK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER UK DIGRAPH;;;0479; 0479;CYRILLIC SMALL LETTER UK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER UK DIGRAPH;;0478;;0478 047A;CYRILLIC CAPITAL LETTER ROUND OMEGA;Lu;0;L;;;;;N;;;;047B; 047B;CYRILLIC SMALL LETTER ROUND OMEGA;Ll;0;L;;;;;N;;;047A;;047A 047C;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER OMEGA TITLO;;;047D; 047D;CYRILLIC SMALL LETTER OMEGA WITH TITLO;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER OMEGA TITLO;;047C;;047C 047E;CYRILLIC CAPITAL LETTER OT;Lu;0;L;;;;;N;;;;047F; 047F;CYRILLIC SMALL LETTER OT;Ll;0;L;;;;;N;;;047E;;047E 0480;CYRILLIC CAPITAL LETTER KOPPA;Lu;0;L;;;;;N;;;;0481; 0481;CYRILLIC SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;0480;;0480 0482;CYRILLIC THOUSANDS SIGN;So;0;L;;;;;N;;;;; 0483;COMBINING CYRILLIC TITLO;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING TITLO;;;; 0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;; 0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;; 0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;; 0487;COMBINING CYRILLIC POKRYTIE;Mn;230;NSM;;;;;N;;;;; 0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;; 0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; 048A;CYRILLIC CAPITAL LETTER SHORT I WITH TAIL;Lu;0;L;;;;;N;;;;048B; 048B;CYRILLIC SMALL LETTER SHORT I WITH TAIL;Ll;0;L;;;;;N;;;048A;;048A 048C;CYRILLIC CAPITAL LETTER SEMISOFT SIGN;Lu;0;L;;;;;N;;;;048D; 048D;CYRILLIC SMALL LETTER SEMISOFT SIGN;Ll;0;L;;;;;N;;;048C;;048C 048E;CYRILLIC CAPITAL LETTER ER WITH TICK;Lu;0;L;;;;;N;;;;048F; 048F;CYRILLIC SMALL LETTER ER WITH TICK;Ll;0;L;;;;;N;;;048E;;048E 0490;CYRILLIC CAPITAL LETTER GHE WITH UPTURN;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE WITH UPTURN;;;0491; 0491;CYRILLIC SMALL LETTER GHE WITH UPTURN;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE WITH UPTURN;;0490;;0490 0492;CYRILLIC CAPITAL LETTER GHE WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE BAR;;;0493; 0493;CYRILLIC SMALL LETTER GHE WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE BAR;;0492;;0492 0494;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE HOOK;;;0495; 0495;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE HOOK;;0494;;0494 0496;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER;;;0497; 0497;CYRILLIC SMALL LETTER ZHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER;;0496;;0496 0498;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZE CEDILLA;;;0499; 0499;CYRILLIC SMALL LETTER ZE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZE CEDILLA;;0498;;0498 049A;CYRILLIC CAPITAL LETTER KA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER;;;049B; 049B;CYRILLIC SMALL LETTER KA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER;;049A;;049A 049C;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA VERTICAL BAR;;;049D; 049D;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA VERTICAL BAR;;049C;;049C 049E;CYRILLIC CAPITAL LETTER KA WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA BAR;;;049F; 049F;CYRILLIC SMALL LETTER KA WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA BAR;;049E;;049E 04A0;CYRILLIC CAPITAL LETTER BASHKIR KA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED GE KA;;;04A1; 04A1;CYRILLIC SMALL LETTER BASHKIR KA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED GE KA;;04A0;;04A0 04A2;CYRILLIC CAPITAL LETTER EN WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER;;;04A3; 04A3;CYRILLIC SMALL LETTER EN WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER;;04A2;;04A2 04A4;CYRILLIC CAPITAL LIGATURE EN GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN GE;;;04A5; 04A5;CYRILLIC SMALL LIGATURE EN GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN GE;;04A4;;04A4 04A6;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER PE HOOK;;;04A7; 04A7;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER PE HOOK;;04A6;;04A6 04A8;CYRILLIC CAPITAL LETTER ABKHASIAN HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER O HOOK;;;04A9; 04A9;CYRILLIC SMALL LETTER ABKHASIAN HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER O HOOK;;04A8;;04A8 04AA;CYRILLIC CAPITAL LETTER ES WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ES CEDILLA;;;04AB; 04AB;CYRILLIC SMALL LETTER ES WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ES CEDILLA;;04AA;;04AA 04AC;CYRILLIC CAPITAL LETTER TE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER;;;04AD; 04AD;CYRILLIC SMALL LETTER TE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER;;04AC;;04AC 04AE;CYRILLIC CAPITAL LETTER STRAIGHT U;Lu;0;L;;;;;N;;;;04AF; 04AF;CYRILLIC SMALL LETTER STRAIGHT U;Ll;0;L;;;;;N;;;04AE;;04AE 04B0;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER STRAIGHT U BAR;;;04B1; 04B1;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER STRAIGHT U BAR;;04B0;;04B0 04B2;CYRILLIC CAPITAL LETTER HA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER;;;04B3; 04B3;CYRILLIC SMALL LETTER HA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER;;04B2;;04B2 04B4;CYRILLIC CAPITAL LIGATURE TE TSE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE TSE;;;04B5; 04B5;CYRILLIC SMALL LIGATURE TE TSE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE TSE;;04B4;;04B4 04B6;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER;;;04B7; 04B7;CYRILLIC SMALL LETTER CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER;;04B6;;04B6 04B8;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE VERTICAL BAR;;;04B9; 04B9;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE VERTICAL BAR;;04B8;;04B8 04BA;CYRILLIC CAPITAL LETTER SHHA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER H;;;04BB; 04BB;CYRILLIC SMALL LETTER SHHA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER H;;04BA;;04BA 04BC;CYRILLIC CAPITAL LETTER ABKHASIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK;;;04BD; 04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC 04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF; 04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE 04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;04CF; 04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2; 04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1 04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4; 04C4;CYRILLIC SMALL LETTER KA WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA HOOK;;04C3;;04C3 04C5;CYRILLIC CAPITAL LETTER EL WITH TAIL;Lu;0;L;;;;;N;;;;04C6; 04C6;CYRILLIC SMALL LETTER EL WITH TAIL;Ll;0;L;;;;;N;;;04C5;;04C5 04C7;CYRILLIC CAPITAL LETTER EN WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN HOOK;;;04C8; 04C8;CYRILLIC SMALL LETTER EN WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN HOOK;;04C7;;04C7 04C9;CYRILLIC CAPITAL LETTER EN WITH TAIL;Lu;0;L;;;;;N;;;;04CA; 04CA;CYRILLIC SMALL LETTER EN WITH TAIL;Ll;0;L;;;;;N;;;04C9;;04C9 04CB;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER;;;04CC; 04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB 04CD;CYRILLIC CAPITAL LETTER EM WITH TAIL;Lu;0;L;;;;;N;;;;04CE; 04CE;CYRILLIC SMALL LETTER EM WITH TAIL;Ll;0;L;;;;;N;;;04CD;;04CD 04CF;CYRILLIC SMALL LETTER PALOCHKA;Ll;0;L;;;;;N;;;04C0;;04C0 04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1; 04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0 04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3; 04D3;CYRILLIC SMALL LETTER A WITH DIAERESIS;Ll;0;L;0430 0308;;;;N;;;04D2;;04D2 04D4;CYRILLIC CAPITAL LIGATURE A IE;Lu;0;L;;;;;N;;;;04D5; 04D5;CYRILLIC SMALL LIGATURE A IE;Ll;0;L;;;;;N;;;04D4;;04D4 04D6;CYRILLIC CAPITAL LETTER IE WITH BREVE;Lu;0;L;0415 0306;;;;N;;;;04D7; 04D7;CYRILLIC SMALL LETTER IE WITH BREVE;Ll;0;L;0435 0306;;;;N;;;04D6;;04D6 04D8;CYRILLIC CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;04D9; 04D9;CYRILLIC SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;04D8;;04D8 04DA;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS;Lu;0;L;04D8 0308;;;;N;;;;04DB; 04DB;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS;Ll;0;L;04D9 0308;;;;N;;;04DA;;04DA 04DC;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS;Lu;0;L;0416 0308;;;;N;;;;04DD; 04DD;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS;Ll;0;L;0436 0308;;;;N;;;04DC;;04DC 04DE;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS;Lu;0;L;0417 0308;;;;N;;;;04DF; 04DF;CYRILLIC SMALL LETTER ZE WITH DIAERESIS;Ll;0;L;0437 0308;;;;N;;;04DE;;04DE 04E0;CYRILLIC CAPITAL LETTER ABKHASIAN DZE;Lu;0;L;;;;;N;;;;04E1; 04E1;CYRILLIC SMALL LETTER ABKHASIAN DZE;Ll;0;L;;;;;N;;;04E0;;04E0 04E2;CYRILLIC CAPITAL LETTER I WITH MACRON;Lu;0;L;0418 0304;;;;N;;;;04E3; 04E3;CYRILLIC SMALL LETTER I WITH MACRON;Ll;0;L;0438 0304;;;;N;;;04E2;;04E2 04E4;CYRILLIC CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0418 0308;;;;N;;;;04E5; 04E5;CYRILLIC SMALL LETTER I WITH DIAERESIS;Ll;0;L;0438 0308;;;;N;;;04E4;;04E4 04E6;CYRILLIC CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;041E 0308;;;;N;;;;04E7; 04E7;CYRILLIC SMALL LETTER O WITH DIAERESIS;Ll;0;L;043E 0308;;;;N;;;04E6;;04E6 04E8;CYRILLIC CAPITAL LETTER BARRED O;Lu;0;L;;;;;N;;;;04E9; 04E9;CYRILLIC SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;04E8;;04E8 04EA;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS;Lu;0;L;04E8 0308;;;;N;;;;04EB; 04EB;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS;Ll;0;L;04E9 0308;;;;N;;;04EA;;04EA 04EC;CYRILLIC CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;042D 0308;;;;N;;;;04ED; 04ED;CYRILLIC SMALL LETTER E WITH DIAERESIS;Ll;0;L;044D 0308;;;;N;;;04EC;;04EC 04EE;CYRILLIC CAPITAL LETTER U WITH MACRON;Lu;0;L;0423 0304;;;;N;;;;04EF; 04EF;CYRILLIC SMALL LETTER U WITH MACRON;Ll;0;L;0443 0304;;;;N;;;04EE;;04EE 04F0;CYRILLIC CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0423 0308;;;;N;;;;04F1; 04F1;CYRILLIC SMALL LETTER U WITH DIAERESIS;Ll;0;L;0443 0308;;;;N;;;04F0;;04F0 04F2;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0423 030B;;;;N;;;;04F3; 04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2 04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5; 04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4 04F6;CYRILLIC CAPITAL LETTER GHE WITH DESCENDER;Lu;0;L;;;;;N;;;;04F7; 04F7;CYRILLIC SMALL LETTER GHE WITH DESCENDER;Ll;0;L;;;;;N;;;04F6;;04F6 04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9; 04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8 04FA;CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK;Lu;0;L;;;;;N;;;;04FB; 04FB;CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK;Ll;0;L;;;;;N;;;04FA;;04FA 04FC;CYRILLIC CAPITAL LETTER HA WITH HOOK;Lu;0;L;;;;;N;;;;04FD; 04FD;CYRILLIC SMALL LETTER HA WITH HOOK;Ll;0;L;;;;;N;;;04FC;;04FC 04FE;CYRILLIC CAPITAL LETTER HA WITH STROKE;Lu;0;L;;;;;N;;;;04FF; 04FF;CYRILLIC SMALL LETTER HA WITH STROKE;Ll;0;L;;;;;N;;;04FE;;04FE 0500;CYRILLIC CAPITAL LETTER KOMI DE;Lu;0;L;;;;;N;;;;0501; 0501;CYRILLIC SMALL LETTER KOMI DE;Ll;0;L;;;;;N;;;0500;;0500 0502;CYRILLIC CAPITAL LETTER KOMI DJE;Lu;0;L;;;;;N;;;;0503; 0503;CYRILLIC SMALL LETTER KOMI DJE;Ll;0;L;;;;;N;;;0502;;0502 0504;CYRILLIC CAPITAL LETTER KOMI ZJE;Lu;0;L;;;;;N;;;;0505; 0505;CYRILLIC SMALL LETTER KOMI ZJE;Ll;0;L;;;;;N;;;0504;;0504 0506;CYRILLIC CAPITAL LETTER KOMI DZJE;Lu;0;L;;;;;N;;;;0507; 0507;CYRILLIC SMALL LETTER KOMI DZJE;Ll;0;L;;;;;N;;;0506;;0506 0508;CYRILLIC CAPITAL LETTER KOMI LJE;Lu;0;L;;;;;N;;;;0509; 0509;CYRILLIC SMALL LETTER KOMI LJE;Ll;0;L;;;;;N;;;0508;;0508 050A;CYRILLIC CAPITAL LETTER KOMI NJE;Lu;0;L;;;;;N;;;;050B; 050B;CYRILLIC SMALL LETTER KOMI NJE;Ll;0;L;;;;;N;;;050A;;050A 050C;CYRILLIC CAPITAL LETTER KOMI SJE;Lu;0;L;;;;;N;;;;050D; 050D;CYRILLIC SMALL LETTER KOMI SJE;Ll;0;L;;;;;N;;;050C;;050C 050E;CYRILLIC CAPITAL LETTER KOMI TJE;Lu;0;L;;;;;N;;;;050F; 050F;CYRILLIC SMALL LETTER KOMI TJE;Ll;0;L;;;;;N;;;050E;;050E 0510;CYRILLIC CAPITAL LETTER REVERSED ZE;Lu;0;L;;;;;N;;;;0511; 0511;CYRILLIC SMALL LETTER REVERSED ZE;Ll;0;L;;;;;N;;;0510;;0510 0512;CYRILLIC CAPITAL LETTER EL WITH HOOK;Lu;0;L;;;;;N;;;;0513; 0513;CYRILLIC SMALL LETTER EL WITH HOOK;Ll;0;L;;;;;N;;;0512;;0512 0514;CYRILLIC CAPITAL LETTER LHA;Lu;0;L;;;;;N;;;;0515; 0515;CYRILLIC SMALL LETTER LHA;Ll;0;L;;;;;N;;;0514;;0514 0516;CYRILLIC CAPITAL LETTER RHA;Lu;0;L;;;;;N;;;;0517; 0517;CYRILLIC SMALL LETTER RHA;Ll;0;L;;;;;N;;;0516;;0516 0518;CYRILLIC CAPITAL LETTER YAE;Lu;0;L;;;;;N;;;;0519; 0519;CYRILLIC SMALL LETTER YAE;Ll;0;L;;;;;N;;;0518;;0518 051A;CYRILLIC CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;051B; 051B;CYRILLIC SMALL LETTER QA;Ll;0;L;;;;;N;;;051A;;051A 051C;CYRILLIC CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;051D; 051D;CYRILLIC SMALL LETTER WE;Ll;0;L;;;;;N;;;051C;;051C 051E;CYRILLIC CAPITAL LETTER ALEUT KA;Lu;0;L;;;;;N;;;;051F; 051F;CYRILLIC SMALL LETTER ALEUT KA;Ll;0;L;;;;;N;;;051E;;051E 0520;CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0521; 0521;CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0520;;0520 0522;CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0523; 0523;CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0522;;0522 0524;CYRILLIC CAPITAL LETTER PE WITH DESCENDER;Lu;0;L;;;;;N;;;;0525; 0525;CYRILLIC SMALL LETTER PE WITH DESCENDER;Ll;0;L;;;;;N;;;0524;;0524 0526;CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER;Lu;0;L;;;;;N;;;;0527; 0527;CYRILLIC SMALL LETTER SHHA WITH DESCENDER;Ll;0;L;;;;;N;;;0526;;0526 0528;CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK;Lu;0;L;;;;;N;;;;0529; 0529;CYRILLIC SMALL LETTER EN WITH LEFT HOOK;Ll;0;L;;;;;N;;;0528;;0528 052A;CYRILLIC CAPITAL LETTER DZZHE;Lu;0;L;;;;;N;;;;052B; 052B;CYRILLIC SMALL LETTER DZZHE;Ll;0;L;;;;;N;;;052A;;052A 052C;CYRILLIC CAPITAL LETTER DCHE;Lu;0;L;;;;;N;;;;052D; 052D;CYRILLIC SMALL LETTER DCHE;Ll;0;L;;;;;N;;;052C;;052C 052E;CYRILLIC CAPITAL LETTER EL WITH DESCENDER;Lu;0;L;;;;;N;;;;052F; 052F;CYRILLIC SMALL LETTER EL WITH DESCENDER;Ll;0;L;;;;;N;;;052E;;052E 0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561; 0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562; 0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563; 0534;ARMENIAN CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;0564; 0535;ARMENIAN CAPITAL LETTER ECH;Lu;0;L;;;;;N;;;;0565; 0536;ARMENIAN CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;0566; 0537;ARMENIAN CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;0567; 0538;ARMENIAN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;0568; 0539;ARMENIAN CAPITAL LETTER TO;Lu;0;L;;;;;N;;;;0569; 053A;ARMENIAN CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;056A; 053B;ARMENIAN CAPITAL LETTER INI;Lu;0;L;;;;;N;;;;056B; 053C;ARMENIAN CAPITAL LETTER LIWN;Lu;0;L;;;;;N;;;;056C; 053D;ARMENIAN CAPITAL LETTER XEH;Lu;0;L;;;;;N;;;;056D; 053E;ARMENIAN CAPITAL LETTER CA;Lu;0;L;;;;;N;;;;056E; 053F;ARMENIAN CAPITAL LETTER KEN;Lu;0;L;;;;;N;;;;056F; 0540;ARMENIAN CAPITAL LETTER HO;Lu;0;L;;;;;N;;;;0570; 0541;ARMENIAN CAPITAL LETTER JA;Lu;0;L;;;;;N;;;;0571; 0542;ARMENIAN CAPITAL LETTER GHAD;Lu;0;L;;;;;N;ARMENIAN CAPITAL LETTER LAD;;;0572; 0543;ARMENIAN CAPITAL LETTER CHEH;Lu;0;L;;;;;N;;;;0573; 0544;ARMENIAN CAPITAL LETTER MEN;Lu;0;L;;;;;N;;;;0574; 0545;ARMENIAN CAPITAL LETTER YI;Lu;0;L;;;;;N;;;;0575; 0546;ARMENIAN CAPITAL LETTER NOW;Lu;0;L;;;;;N;;;;0576; 0547;ARMENIAN CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0577; 0548;ARMENIAN CAPITAL LETTER VO;Lu;0;L;;;;;N;;;;0578; 0549;ARMENIAN CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;0579; 054A;ARMENIAN CAPITAL LETTER PEH;Lu;0;L;;;;;N;;;;057A; 054B;ARMENIAN CAPITAL LETTER JHEH;Lu;0;L;;;;;N;;;;057B; 054C;ARMENIAN CAPITAL LETTER RA;Lu;0;L;;;;;N;;;;057C; 054D;ARMENIAN CAPITAL LETTER SEH;Lu;0;L;;;;;N;;;;057D; 054E;ARMENIAN CAPITAL LETTER VEW;Lu;0;L;;;;;N;;;;057E; 054F;ARMENIAN CAPITAL LETTER TIWN;Lu;0;L;;;;;N;;;;057F; 0550;ARMENIAN CAPITAL LETTER REH;Lu;0;L;;;;;N;;;;0580; 0551;ARMENIAN CAPITAL LETTER CO;Lu;0;L;;;;;N;;;;0581; 0552;ARMENIAN CAPITAL LETTER YIWN;Lu;0;L;;;;;N;;;;0582; 0553;ARMENIAN CAPITAL LETTER PIWR;Lu;0;L;;;;;N;;;;0583; 0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584; 0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585; 0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586; 0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; 055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;; 055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;; 055C;ARMENIAN EXCLAMATION MARK;Po;0;L;;;;;N;;;;; 055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;; 055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;; 055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;; 0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531 0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532 0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533 0564;ARMENIAN SMALL LETTER DA;Ll;0;L;;;;;N;;;0534;;0534 0565;ARMENIAN SMALL LETTER ECH;Ll;0;L;;;;;N;;;0535;;0535 0566;ARMENIAN SMALL LETTER ZA;Ll;0;L;;;;;N;;;0536;;0536 0567;ARMENIAN SMALL LETTER EH;Ll;0;L;;;;;N;;;0537;;0537 0568;ARMENIAN SMALL LETTER ET;Ll;0;L;;;;;N;;;0538;;0538 0569;ARMENIAN SMALL LETTER TO;Ll;0;L;;;;;N;;;0539;;0539 056A;ARMENIAN SMALL LETTER ZHE;Ll;0;L;;;;;N;;;053A;;053A 056B;ARMENIAN SMALL LETTER INI;Ll;0;L;;;;;N;;;053B;;053B 056C;ARMENIAN SMALL LETTER LIWN;Ll;0;L;;;;;N;;;053C;;053C 056D;ARMENIAN SMALL LETTER XEH;Ll;0;L;;;;;N;;;053D;;053D 056E;ARMENIAN SMALL LETTER CA;Ll;0;L;;;;;N;;;053E;;053E 056F;ARMENIAN SMALL LETTER KEN;Ll;0;L;;;;;N;;;053F;;053F 0570;ARMENIAN SMALL LETTER HO;Ll;0;L;;;;;N;;;0540;;0540 0571;ARMENIAN SMALL LETTER JA;Ll;0;L;;;;;N;;;0541;;0541 0572;ARMENIAN SMALL LETTER GHAD;Ll;0;L;;;;;N;ARMENIAN SMALL LETTER LAD;;0542;;0542 0573;ARMENIAN SMALL LETTER CHEH;Ll;0;L;;;;;N;;;0543;;0543 0574;ARMENIAN SMALL LETTER MEN;Ll;0;L;;;;;N;;;0544;;0544 0575;ARMENIAN SMALL LETTER YI;Ll;0;L;;;;;N;;;0545;;0545 0576;ARMENIAN SMALL LETTER NOW;Ll;0;L;;;;;N;;;0546;;0546 0577;ARMENIAN SMALL LETTER SHA;Ll;0;L;;;;;N;;;0547;;0547 0578;ARMENIAN SMALL LETTER VO;Ll;0;L;;;;;N;;;0548;;0548 0579;ARMENIAN SMALL LETTER CHA;Ll;0;L;;;;;N;;;0549;;0549 057A;ARMENIAN SMALL LETTER PEH;Ll;0;L;;;;;N;;;054A;;054A 057B;ARMENIAN SMALL LETTER JHEH;Ll;0;L;;;;;N;;;054B;;054B 057C;ARMENIAN SMALL LETTER RA;Ll;0;L;;;;;N;;;054C;;054C 057D;ARMENIAN SMALL LETTER SEH;Ll;0;L;;;;;N;;;054D;;054D 057E;ARMENIAN SMALL LETTER VEW;Ll;0;L;;;;;N;;;054E;;054E 057F;ARMENIAN SMALL LETTER TIWN;Ll;0;L;;;;;N;;;054F;;054F 0580;ARMENIAN SMALL LETTER REH;Ll;0;L;;;;;N;;;0550;;0550 0581;ARMENIAN SMALL LETTER CO;Ll;0;L;;;;;N;;;0551;;0551 0582;ARMENIAN SMALL LETTER YIWN;Ll;0;L;;;;;N;;;0552;;0552 0583;ARMENIAN SMALL LETTER PIWR;Ll;0;L;;;;;N;;;0553;;0553 0584;ARMENIAN SMALL LETTER KEH;Ll;0;L;;;;;N;;;0554;;0554 0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555 0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556 0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L;<compat> 0565 0582;;;;N;;;;; 0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;; 058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;; 058D;RIGHT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;; 058E;LEFT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;; 058F;ARMENIAN DRAM SIGN;Sc;0;ET;;;;;N;;;;; 0591;HEBREW ACCENT ETNAHTA;Mn;220;NSM;;;;;N;;;;; 0592;HEBREW ACCENT SEGOL;Mn;230;NSM;;;;;N;;;;; 0593;HEBREW ACCENT SHALSHELET;Mn;230;NSM;;;;;N;;;;; 0594;HEBREW ACCENT ZAQEF QATAN;Mn;230;NSM;;;;;N;;;;; 0595;HEBREW ACCENT ZAQEF GADOL;Mn;230;NSM;;;;;N;;;;; 0596;HEBREW ACCENT TIPEHA;Mn;220;NSM;;;;;N;;;;; 0597;HEBREW ACCENT REVIA;Mn;230;NSM;;;;;N;;;;; 0598;HEBREW ACCENT ZARQA;Mn;230;NSM;;;;;N;;;;; 0599;HEBREW ACCENT PASHTA;Mn;230;NSM;;;;;N;;;;; 059A;HEBREW ACCENT YETIV;Mn;222;NSM;;;;;N;;;;; 059B;HEBREW ACCENT TEVIR;Mn;220;NSM;;;;;N;;;;; 059C;HEBREW ACCENT GERESH;Mn;230;NSM;;;;;N;;;;; 059D;HEBREW ACCENT GERESH MUQDAM;Mn;230;NSM;;;;;N;;;;; 059E;HEBREW ACCENT GERSHAYIM;Mn;230;NSM;;;;;N;;;;; 059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;; 05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;; 05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;; 05A2;HEBREW ACCENT ATNAH HAFUKH;Mn;220;NSM;;;;;N;;;;; 05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;; 05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;; 05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;;;; 05A6;HEBREW ACCENT MERKHA KEFULA;Mn;220;NSM;;;;;N;;;;; 05A7;HEBREW ACCENT DARGA;Mn;220;NSM;;;;;N;;;;; 05A8;HEBREW ACCENT QADMA;Mn;230;NSM;;;;;N;;;;; 05A9;HEBREW ACCENT TELISHA QETANA;Mn;230;NSM;;;;;N;;;;; 05AA;HEBREW ACCENT YERAH BEN YOMO;Mn;220;NSM;;;;;N;;;;; 05AB;HEBREW ACCENT OLE;Mn;230;NSM;;;;;N;;;;; 05AC;HEBREW ACCENT ILUY;Mn;230;NSM;;;;;N;;;;; 05AD;HEBREW ACCENT DEHI;Mn;222;NSM;;;;;N;;;;; 05AE;HEBREW ACCENT ZINOR;Mn;228;NSM;;;;;N;;;;; 05AF;HEBREW MARK MASORA CIRCLE;Mn;230;NSM;;;;;N;;;;; 05B0;HEBREW POINT SHEVA;Mn;10;NSM;;;;;N;;;;; 05B1;HEBREW POINT HATAF SEGOL;Mn;11;NSM;;;;;N;;;;; 05B2;HEBREW POINT HATAF PATAH;Mn;12;NSM;;;;;N;;;;; 05B3;HEBREW POINT HATAF QAMATS;Mn;13;NSM;;;;;N;;;;; 05B4;HEBREW POINT HIRIQ;Mn;14;NSM;;;;;N;;;;; 05B5;HEBREW POINT TSERE;Mn;15;NSM;;;;;N;;;;; 05B6;HEBREW POINT SEGOL;Mn;16;NSM;;;;;N;;;;; 05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;; 05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;; 05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;; 05BA;HEBREW POINT HOLAM HASER FOR VAV;Mn;19;NSM;;;;;N;;;;; 05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;; 05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;;;; 05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;;;; 05BE;HEBREW PUNCTUATION MAQAF;Pd;0;R;;;;;N;;;;; 05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;; 05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;;;; 05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;; 05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;; 05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;;;; 05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;; 05C5;HEBREW MARK LOWER DOT;Mn;220;NSM;;;;;N;;;;; 05C6;HEBREW PUNCTUATION NUN HAFUKHA;Po;0;R;;;;;N;;;;; 05C7;HEBREW POINT QAMATS QATAN;Mn;18;NSM;;;;;N;;;;; 05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;; 05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;; 05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;; 05D3;HEBREW LETTER DALET;Lo;0;R;;;;;N;;;;; 05D4;HEBREW LETTER HE;Lo;0;R;;;;;N;;;;; 05D5;HEBREW LETTER VAV;Lo;0;R;;;;;N;;;;; 05D6;HEBREW LETTER ZAYIN;Lo;0;R;;;;;N;;;;; 05D7;HEBREW LETTER HET;Lo;0;R;;;;;N;;;;; 05D8;HEBREW LETTER TET;Lo;0;R;;;;;N;;;;; 05D9;HEBREW LETTER YOD;Lo;0;R;;;;;N;;;;; 05DA;HEBREW LETTER FINAL KAF;Lo;0;R;;;;;N;;;;; 05DB;HEBREW LETTER KAF;Lo;0;R;;;;;N;;;;; 05DC;HEBREW LETTER LAMED;Lo;0;R;;;;;N;;;;; 05DD;HEBREW LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; 05DE;HEBREW LETTER MEM;Lo;0;R;;;;;N;;;;; 05DF;HEBREW LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; 05E0;HEBREW LETTER NUN;Lo;0;R;;;;;N;;;;; 05E1;HEBREW LETTER SAMEKH;Lo;0;R;;;;;N;;;;; 05E2;HEBREW LETTER AYIN;Lo;0;R;;;;;N;;;;; 05E3;HEBREW LETTER FINAL PE;Lo;0;R;;;;;N;;;;; 05E4;HEBREW LETTER PE;Lo;0;R;;;;;N;;;;; 05E5;HEBREW LETTER FINAL TSADI;Lo;0;R;;;;;N;;;;; 05E6;HEBREW LETTER TSADI;Lo;0;R;;;;;N;;;;; 05E7;HEBREW LETTER QOF;Lo;0;R;;;;;N;;;;; 05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;; 05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;; 05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;; 05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;; 05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;; 05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;; 05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;; 05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;; 0600;ARABIC NUMBER SIGN;Cf;0;AN;;;;;N;;;;; 0601;ARABIC SIGN SANAH;Cf;0;AN;;;;;N;;;;; 0602;ARABIC FOOTNOTE MARKER;Cf;0;AN;;;;;N;;;;; 0603;ARABIC SIGN SAFHA;Cf;0;AN;;;;;N;;;;; 0604;ARABIC SIGN SAMVAT;Cf;0;AN;;;;;N;;;;; 0605;ARABIC NUMBER MARK ABOVE;Cf;0;AN;;;;;N;;;;; 0606;ARABIC-INDIC CUBE ROOT;Sm;0;ON;;;;;N;;;;; 0607;ARABIC-INDIC FOURTH ROOT;Sm;0;ON;;;;;N;;;;; 0608;ARABIC RAY;Sm;0;AL;;;;;N;;;;; 0609;ARABIC-INDIC PER MILLE SIGN;Po;0;ET;;;;;N;;;;; 060A;ARABIC-INDIC PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; 060B;AFGHANI SIGN;Sc;0;AL;;;;;N;;;;; 060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;; 060D;ARABIC DATE SEPARATOR;Po;0;AL;;;;;N;;;;; 060E;ARABIC POETIC VERSE SIGN;So;0;ON;;;;;N;;;;; 060F;ARABIC SIGN MISRA;So;0;ON;;;;;N;;;;; 0610;ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM;Mn;230;NSM;;;;;N;;;;; 0611;ARABIC SIGN ALAYHE ASSALLAM;Mn;230;NSM;;;;;N;;;;; 0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;; 0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;; 0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;; 0615;ARABIC SMALL HIGH TAH;Mn;230;NSM;;;;;N;;;;; 0616;ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH;Mn;230;NSM;;;;;N;;;;; 0617;ARABIC SMALL HIGH ZAIN;Mn;230;NSM;;;;;N;;;;; 0618;ARABIC SMALL FATHA;Mn;30;NSM;;;;;N;;;;; 0619;ARABIC SMALL DAMMA;Mn;31;NSM;;;;;N;;;;; 061A;ARABIC SMALL KASRA;Mn;32;NSM;;;;;N;;;;; 061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;; 061C;ARABIC LETTER MARK;Cf;0;AL;;;;;N;;;;; 061E;ARABIC TRIPLE DOT PUNCTUATION MARK;Po;0;AL;;;;;N;;;;; 061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;; 0620;ARABIC LETTER KASHMIRI YEH;Lo;0;AL;;;;;N;;;;; 0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;; 0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;; 0623;ARABIC LETTER ALEF WITH HAMZA ABOVE;Lo;0;AL;0627 0654;;;;N;ARABIC LETTER HAMZAH ON ALEF;;;; 0624;ARABIC LETTER WAW WITH HAMZA ABOVE;Lo;0;AL;0648 0654;;;;N;ARABIC LETTER HAMZAH ON WAW;;;; 0625;ARABIC LETTER ALEF WITH HAMZA BELOW;Lo;0;AL;0627 0655;;;;N;ARABIC LETTER HAMZAH UNDER ALEF;;;; 0626;ARABIC LETTER YEH WITH HAMZA ABOVE;Lo;0;AL;064A 0654;;;;N;ARABIC LETTER HAMZAH ON YA;;;; 0627;ARABIC LETTER ALEF;Lo;0;AL;;;;;N;;;;; 0628;ARABIC LETTER BEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA;;;; 0629;ARABIC LETTER TEH MARBUTA;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH;;;; 062A;ARABIC LETTER TEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA;;;; 062B;ARABIC LETTER THEH;Lo;0;AL;;;;;N;ARABIC LETTER THAA;;;; 062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;; 062D;ARABIC LETTER HAH;Lo;0;AL;;;;;N;ARABIC LETTER HAA;;;; 062E;ARABIC LETTER KHAH;Lo;0;AL;;;;;N;ARABIC LETTER KHAA;;;; 062F;ARABIC LETTER DAL;Lo;0;AL;;;;;N;;;;; 0630;ARABIC LETTER THAL;Lo;0;AL;;;;;N;;;;; 0631;ARABIC LETTER REH;Lo;0;AL;;;;;N;ARABIC LETTER RA;;;; 0632;ARABIC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; 0633;ARABIC LETTER SEEN;Lo;0;AL;;;;;N;;;;; 0634;ARABIC LETTER SHEEN;Lo;0;AL;;;;;N;;;;; 0635;ARABIC LETTER SAD;Lo;0;AL;;;;;N;;;;; 0636;ARABIC LETTER DAD;Lo;0;AL;;;;;N;;;;; 0637;ARABIC LETTER TAH;Lo;0;AL;;;;;N;;;;; 0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;; 0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;; 063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;; 063B;ARABIC LETTER KEHEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 063C;ARABIC LETTER KEHEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; 063D;ARABIC LETTER FARSI YEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; 063E;ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 063F;ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;; 0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;; 0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;; 0643;ARABIC LETTER KAF;Lo;0;AL;;;;;N;ARABIC LETTER CAF;;;; 0644;ARABIC LETTER LAM;Lo;0;AL;;;;;N;;;;; 0645;ARABIC LETTER MEEM;Lo;0;AL;;;;;N;;;;; 0646;ARABIC LETTER NOON;Lo;0;AL;;;;;N;;;;; 0647;ARABIC LETTER HEH;Lo;0;AL;;;;;N;ARABIC LETTER HA;;;; 0648;ARABIC LETTER WAW;Lo;0;AL;;;;;N;;;;; 0649;ARABIC LETTER ALEF MAKSURA;Lo;0;AL;;;;;N;ARABIC LETTER ALEF MAQSURAH;;;; 064A;ARABIC LETTER YEH;Lo;0;AL;;;;;N;ARABIC LETTER YA;;;; 064B;ARABIC FATHATAN;Mn;27;NSM;;;;;N;;;;; 064C;ARABIC DAMMATAN;Mn;28;NSM;;;;;N;;;;; 064D;ARABIC KASRATAN;Mn;29;NSM;;;;;N;;;;; 064E;ARABIC FATHA;Mn;30;NSM;;;;;N;ARABIC FATHAH;;;; 064F;ARABIC DAMMA;Mn;31;NSM;;;;;N;ARABIC DAMMAH;;;; 0650;ARABIC KASRA;Mn;32;NSM;;;;;N;ARABIC KASRAH;;;; 0651;ARABIC SHADDA;Mn;33;NSM;;;;;N;ARABIC SHADDAH;;;; 0652;ARABIC SUKUN;Mn;34;NSM;;;;;N;;;;; 0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;; 0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;; 0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; 0656;ARABIC SUBSCRIPT ALEF;Mn;220;NSM;;;;;N;;;;; 0657;ARABIC INVERTED DAMMA;Mn;230;NSM;;;;;N;;;;; 0658;ARABIC MARK NOON GHUNNA;Mn;230;NSM;;;;;N;;;;; 0659;ARABIC ZWARAKAY;Mn;230;NSM;;;;;N;;;;; 065A;ARABIC VOWEL SIGN SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; 065B;ARABIC VOWEL SIGN INVERTED SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; 065C;ARABIC VOWEL SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; 065D;ARABIC REVERSED DAMMA;Mn;230;NSM;;;;;N;;;;; 065E;ARABIC FATHA WITH TWO DOTS;Mn;230;NSM;;;;;N;;;;; 065F;ARABIC WAVY HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; 0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;; 0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;; 0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;; 0663;ARABIC-INDIC DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;; 0664;ARABIC-INDIC DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;; 0665;ARABIC-INDIC DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;; 0666;ARABIC-INDIC DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;; 0667;ARABIC-INDIC DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;; 0668;ARABIC-INDIC DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;; 0669;ARABIC-INDIC DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;; 066A;ARABIC PERCENT SIGN;Po;0;ET;;;;;N;;;;; 066B;ARABIC DECIMAL SEPARATOR;Po;0;AN;;;;;N;;;;; 066C;ARABIC THOUSANDS SEPARATOR;Po;0;AN;;;;;N;;;;; 066D;ARABIC FIVE POINTED STAR;Po;0;AL;;;;;N;;;;; 066E;ARABIC LETTER DOTLESS BEH;Lo;0;AL;;;;;N;;;;; 066F;ARABIC LETTER DOTLESS QAF;Lo;0;AL;;;;;N;;;;; 0670;ARABIC LETTER SUPERSCRIPT ALEF;Mn;35;NSM;;;;;N;ARABIC ALEF ABOVE;;;; 0671;ARABIC LETTER ALEF WASLA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAT WASL ON ALEF;;;; 0672;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH ON ALEF;;;; 0673;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH UNDER ALEF;;;; 0674;ARABIC LETTER HIGH HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HIGH HAMZAH;;;; 0675;ARABIC LETTER HIGH HAMZA ALEF;Lo;0;AL;<compat> 0627 0674;;;;N;ARABIC LETTER HIGH HAMZAH ALEF;;;; 0676;ARABIC LETTER HIGH HAMZA WAW;Lo;0;AL;<compat> 0648 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW;;;; 0677;ARABIC LETTER U WITH HAMZA ABOVE;Lo;0;AL;<compat> 06C7 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH;;;; 0678;ARABIC LETTER HIGH HAMZA YEH;Lo;0;AL;<compat> 064A 0674;;;;N;ARABIC LETTER HIGH HAMZAH YA;;;; 0679;ARABIC LETTER TTEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH SMALL TAH;;;; 067A;ARABIC LETTER TTEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE;;;; 067B;ARABIC LETTER BEEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW;;;; 067C;ARABIC LETTER TEH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH RING;;;; 067D;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD;;;; 067E;ARABIC LETTER PEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS BELOW;;;; 067F;ARABIC LETTER TEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH FOUR DOTS ABOVE;;;; 0680;ARABIC LETTER BEHEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH FOUR DOTS BELOW;;;; 0681;ARABIC LETTER HAH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH ON HAA;;;; 0682;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE;;;; 0683;ARABIC LETTER NYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS;;;; 0684;ARABIC LETTER DYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL;;;; 0685;ARABIC LETTER HAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH THREE DOTS ABOVE;;;; 0686;ARABIC LETTER TCHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD;;;; 0687;ARABIC LETTER TCHEHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE FOUR DOTS;;;; 0688;ARABIC LETTER DDAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH SMALL TAH;;;; 0689;ARABIC LETTER DAL WITH RING;Lo;0;AL;;;;;N;;;;; 068A;ARABIC LETTER DAL WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; 068B;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; 068C;ARABIC LETTER DAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS ABOVE;;;; 068D;ARABIC LETTER DDAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS BELOW;;;; 068E;ARABIC LETTER DUL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE;;;; 068F;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD;;;; 0690;ARABIC LETTER DAL WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 0691;ARABIC LETTER RREH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL TAH;;;; 0692;ARABIC LETTER REH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V;;;; 0693;ARABIC LETTER REH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH RING;;;; 0694;ARABIC LETTER REH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW;;;; 0695;ARABIC LETTER REH WITH SMALL V BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V BELOW;;;; 0696;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE;;;; 0697;ARABIC LETTER REH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH TWO DOTS ABOVE;;;; 0698;ARABIC LETTER JEH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH THREE DOTS ABOVE;;;; 0699;ARABIC LETTER REH WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH FOUR DOTS ABOVE;;;; 069A;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; 069B;ARABIC LETTER SEEN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; 069C;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 069D;ARABIC LETTER SAD WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; 069E;ARABIC LETTER SAD WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 069F;ARABIC LETTER TAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 06A0;ARABIC LETTER AIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 06A1;ARABIC LETTER DOTLESS FEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS FA;;;; 06A2;ARABIC LETTER FEH WITH DOT MOVED BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT MOVED BELOW;;;; 06A3;ARABIC LETTER FEH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT BELOW;;;; 06A4;ARABIC LETTER VEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS ABOVE;;;; 06A5;ARABIC LETTER FEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS BELOW;;;; 06A6;ARABIC LETTER PEHEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH FOUR DOTS ABOVE;;;; 06A7;ARABIC LETTER QAF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; 06A8;ARABIC LETTER QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 06A9;ARABIC LETTER KEHEH;Lo;0;AL;;;;;N;ARABIC LETTER OPEN CAF;;;; 06AA;ARABIC LETTER SWASH KAF;Lo;0;AL;;;;;N;ARABIC LETTER SWASH CAF;;;; 06AB;ARABIC LETTER KAF WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH RING;;;; 06AC;ARABIC LETTER KAF WITH DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH DOT ABOVE;;;; 06AD;ARABIC LETTER NG;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS ABOVE;;;; 06AE;ARABIC LETTER KAF WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS BELOW;;;; 06AF;ARABIC LETTER GAF;Lo;0;AL;;;;;N;;;;; 06B0;ARABIC LETTER GAF WITH RING;Lo;0;AL;;;;;N;;;;; 06B1;ARABIC LETTER NGOEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS ABOVE;;;; 06B2;ARABIC LETTER GAF WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; 06B3;ARABIC LETTER GUEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW;;;; 06B4;ARABIC LETTER GAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 06B5;ARABIC LETTER LAM WITH SMALL V;Lo;0;AL;;;;;N;;;;; 06B6;ARABIC LETTER LAM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; 06B7;ARABIC LETTER LAM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 06B8;ARABIC LETTER LAM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; 06B9;ARABIC LETTER NOON WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; 06BA;ARABIC LETTER NOON GHUNNA;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON;;;; 06BB;ARABIC LETTER RNOON;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON WITH SMALL TAH;;;; 06BC;ARABIC LETTER NOON WITH RING;Lo;0;AL;;;;;N;;;;; 06BD;ARABIC LETTER NOON WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 06BE;ARABIC LETTER HEH DOACHASHMEE;Lo;0;AL;;;;;N;ARABIC LETTER KNOTTED HA;;;; 06BF;ARABIC LETTER TCHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; 06C0;ARABIC LETTER HEH WITH YEH ABOVE;Lo;0;AL;06D5 0654;;;;N;ARABIC LETTER HAMZAH ON HA;;;; 06C1;ARABIC LETTER HEH GOAL;Lo;0;AL;;;;;N;ARABIC LETTER HA GOAL;;;; 06C2;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE;Lo;0;AL;06C1 0654;;;;N;ARABIC LETTER HAMZAH ON HA GOAL;;;; 06C3;ARABIC LETTER TEH MARBUTA GOAL;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH GOAL;;;; 06C4;ARABIC LETTER WAW WITH RING;Lo;0;AL;;;;;N;;;;; 06C5;ARABIC LETTER KIRGHIZ OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH BAR;;;; 06C6;ARABIC LETTER OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH SMALL V;;;; 06C7;ARABIC LETTER U;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH DAMMAH;;;; 06C8;ARABIC LETTER YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH ALEF ABOVE;;;; 06C9;ARABIC LETTER KIRGHIZ YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH INVERTED SMALL V;;;; 06CA;ARABIC LETTER WAW WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 06CB;ARABIC LETTER VE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH THREE DOTS ABOVE;;;; 06CC;ARABIC LETTER FARSI YEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS YA;;;; 06CD;ARABIC LETTER YEH WITH TAIL;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TAIL;;;; 06CE;ARABIC LETTER YEH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH SMALL V;;;; 06CF;ARABIC LETTER WAW WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; 06D0;ARABIC LETTER E;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW;;;; 06D1;ARABIC LETTER YEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH THREE DOTS BELOW;;;; 06D2;ARABIC LETTER YEH BARREE;Lo;0;AL;;;;;N;ARABIC LETTER YA BARREE;;;; 06D3;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE;Lo;0;AL;06D2 0654;;;;N;ARABIC LETTER HAMZAH ON YA BARREE;;;; 06D4;ARABIC FULL STOP;Po;0;AL;;;;;N;ARABIC PERIOD;;;; 06D5;ARABIC LETTER AE;Lo;0;AL;;;;;N;;;;; 06D6;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; 06D7;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; 06D8;ARABIC SMALL HIGH MEEM INITIAL FORM;Mn;230;NSM;;;;;N;;;;; 06D9;ARABIC SMALL HIGH LAM ALEF;Mn;230;NSM;;;;;N;;;;; 06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;; 06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;; 06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;; 06DD;ARABIC END OF AYAH;Cf;0;AN;;;;;N;;;;; 06DE;ARABIC START OF RUB EL HIZB;So;0;ON;;;;;N;;;;; 06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;; 06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;; 06E1;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH;Mn;230;NSM;;;;;N;;;;; 06E2;ARABIC SMALL HIGH MEEM ISOLATED FORM;Mn;230;NSM;;;;;N;;;;; 06E3;ARABIC SMALL LOW SEEN;Mn;220;NSM;;;;;N;;;;; 06E4;ARABIC SMALL HIGH MADDA;Mn;230;NSM;;;;;N;;;;; 06E5;ARABIC SMALL WAW;Lm;0;AL;;;;;N;;;;; 06E6;ARABIC SMALL YEH;Lm;0;AL;;;;;N;;;;; 06E7;ARABIC SMALL HIGH YEH;Mn;230;NSM;;;;;N;;;;; 06E8;ARABIC SMALL HIGH NOON;Mn;230;NSM;;;;;N;;;;; 06E9;ARABIC PLACE OF SAJDAH;So;0;ON;;;;;N;;;;; 06EA;ARABIC EMPTY CENTRE LOW STOP;Mn;220;NSM;;;;;N;;;;; 06EB;ARABIC EMPTY CENTRE HIGH STOP;Mn;230;NSM;;;;;N;;;;; 06EC;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE;Mn;230;NSM;;;;;N;;;;; 06ED;ARABIC SMALL LOW MEEM;Mn;220;NSM;;;;;N;;;;; 06EE;ARABIC LETTER DAL WITH INVERTED V;Lo;0;AL;;;;;N;;;;; 06EF;ARABIC LETTER REH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; 06F0;EXTENDED ARABIC-INDIC DIGIT ZERO;Nd;0;EN;;0;0;0;N;EASTERN ARABIC-INDIC DIGIT ZERO;;;; 06F1;EXTENDED ARABIC-INDIC DIGIT ONE;Nd;0;EN;;1;1;1;N;EASTERN ARABIC-INDIC DIGIT ONE;;;; 06F2;EXTENDED ARABIC-INDIC DIGIT TWO;Nd;0;EN;;2;2;2;N;EASTERN ARABIC-INDIC DIGIT TWO;;;; 06F3;EXTENDED ARABIC-INDIC DIGIT THREE;Nd;0;EN;;3;3;3;N;EASTERN ARABIC-INDIC DIGIT THREE;;;; 06F4;EXTENDED ARABIC-INDIC DIGIT FOUR;Nd;0;EN;;4;4;4;N;EASTERN ARABIC-INDIC DIGIT FOUR;;;; 06F5;EXTENDED ARABIC-INDIC DIGIT FIVE;Nd;0;EN;;5;5;5;N;EASTERN ARABIC-INDIC DIGIT FIVE;;;; 06F6;EXTENDED ARABIC-INDIC DIGIT SIX;Nd;0;EN;;6;6;6;N;EASTERN ARABIC-INDIC DIGIT SIX;;;; 06F7;EXTENDED ARABIC-INDIC DIGIT SEVEN;Nd;0;EN;;7;7;7;N;EASTERN ARABIC-INDIC DIGIT SEVEN;;;; 06F8;EXTENDED ARABIC-INDIC DIGIT EIGHT;Nd;0;EN;;8;8;8;N;EASTERN ARABIC-INDIC DIGIT EIGHT;;;; 06F9;EXTENDED ARABIC-INDIC DIGIT NINE;Nd;0;EN;;9;9;9;N;EASTERN ARABIC-INDIC DIGIT NINE;;;; 06FA;ARABIC LETTER SHEEN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; 06FB;ARABIC LETTER DAD WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; 06FC;ARABIC LETTER GHAIN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; 06FD;ARABIC SIGN SINDHI AMPERSAND;So;0;AL;;;;;N;;;;; 06FE;ARABIC SIGN SINDHI POSTPOSITION MEN;So;0;AL;;;;;N;;;;; 06FF;ARABIC LETTER HEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; 0700;SYRIAC END OF PARAGRAPH;Po;0;AL;;;;;N;;;;; 0701;SYRIAC SUPRALINEAR FULL STOP;Po;0;AL;;;;;N;;;;; 0702;SYRIAC SUBLINEAR FULL STOP;Po;0;AL;;;;;N;;;;; 0703;SYRIAC SUPRALINEAR COLON;Po;0;AL;;;;;N;;;;; 0704;SYRIAC SUBLINEAR COLON;Po;0;AL;;;;;N;;;;; 0705;SYRIAC HORIZONTAL COLON;Po;0;AL;;;;;N;;;;; 0706;SYRIAC COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; 0707;SYRIAC COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; 0708;SYRIAC SUPRALINEAR COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; 0709;SYRIAC SUBLINEAR COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; 070A;SYRIAC CONTRACTION;Po;0;AL;;;;;N;;;;; 070B;SYRIAC HARKLEAN OBELUS;Po;0;AL;;;;;N;;;;; 070C;SYRIAC HARKLEAN METOBELUS;Po;0;AL;;;;;N;;;;; 070D;SYRIAC HARKLEAN ASTERISCUS;Po;0;AL;;;;;N;;;;; 070F;SYRIAC ABBREVIATION MARK;Cf;0;AL;;;;;N;;;;; 0710;SYRIAC LETTER ALAPH;Lo;0;AL;;;;;N;;;;; 0711;SYRIAC LETTER SUPERSCRIPT ALAPH;Mn;36;NSM;;;;;N;;;;; 0712;SYRIAC LETTER BETH;Lo;0;AL;;;;;N;;;;; 0713;SYRIAC LETTER GAMAL;Lo;0;AL;;;;;N;;;;; 0714;SYRIAC LETTER GAMAL GARSHUNI;Lo;0;AL;;;;;N;;;;; 0715;SYRIAC LETTER DALATH;Lo;0;AL;;;;;N;;;;; 0716;SYRIAC LETTER DOTLESS DALATH RISH;Lo;0;AL;;;;;N;;;;; 0717;SYRIAC LETTER HE;Lo;0;AL;;;;;N;;;;; 0718;SYRIAC LETTER WAW;Lo;0;AL;;;;;N;;;;; 0719;SYRIAC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; 071A;SYRIAC LETTER HETH;Lo;0;AL;;;;;N;;;;; 071B;SYRIAC LETTER TETH;Lo;0;AL;;;;;N;;;;; 071C;SYRIAC LETTER TETH GARSHUNI;Lo;0;AL;;;;;N;;;;; 071D;SYRIAC LETTER YUDH;Lo;0;AL;;;;;N;;;;; 071E;SYRIAC LETTER YUDH HE;Lo;0;AL;;;;;N;;;;; 071F;SYRIAC LETTER KAPH;Lo;0;AL;;;;;N;;;;; 0720;SYRIAC LETTER LAMADH;Lo;0;AL;;;;;N;;;;; 0721;SYRIAC LETTER MIM;Lo;0;AL;;;;;N;;;;; 0722;SYRIAC LETTER NUN;Lo;0;AL;;;;;N;;;;; 0723;SYRIAC LETTER SEMKATH;Lo;0;AL;;;;;N;;;;; 0724;SYRIAC LETTER FINAL SEMKATH;Lo;0;AL;;;;;N;;;;; 0725;SYRIAC LETTER E;Lo;0;AL;;;;;N;;;;; 0726;SYRIAC LETTER PE;Lo;0;AL;;;;;N;;;;; 0727;SYRIAC LETTER REVERSED PE;Lo;0;AL;;;;;N;;;;; 0728;SYRIAC LETTER SADHE;Lo;0;AL;;;;;N;;;;; 0729;SYRIAC LETTER QAPH;Lo;0;AL;;;;;N;;;;; 072A;SYRIAC LETTER RISH;Lo;0;AL;;;;;N;;;;; 072B;SYRIAC LETTER SHIN;Lo;0;AL;;;;;N;;;;; 072C;SYRIAC LETTER TAW;Lo;0;AL;;;;;N;;;;; 072D;SYRIAC LETTER PERSIAN BHETH;Lo;0;AL;;;;;N;;;;; 072E;SYRIAC LETTER PERSIAN GHAMAL;Lo;0;AL;;;;;N;;;;; 072F;SYRIAC LETTER PERSIAN DHALATH;Lo;0;AL;;;;;N;;;;; 0730;SYRIAC PTHAHA ABOVE;Mn;230;NSM;;;;;N;;;;; 0731;SYRIAC PTHAHA BELOW;Mn;220;NSM;;;;;N;;;;; 0732;SYRIAC PTHAHA DOTTED;Mn;230;NSM;;;;;N;;;;; 0733;SYRIAC ZQAPHA ABOVE;Mn;230;NSM;;;;;N;;;;; 0734;SYRIAC ZQAPHA BELOW;Mn;220;NSM;;;;;N;;;;; 0735;SYRIAC ZQAPHA DOTTED;Mn;230;NSM;;;;;N;;;;; 0736;SYRIAC RBASA ABOVE;Mn;230;NSM;;;;;N;;;;; 0737;SYRIAC RBASA BELOW;Mn;220;NSM;;;;;N;;;;; 0738;SYRIAC DOTTED ZLAMA HORIZONTAL;Mn;220;NSM;;;;;N;;;;; 0739;SYRIAC DOTTED ZLAMA ANGULAR;Mn;220;NSM;;;;;N;;;;; 073A;SYRIAC HBASA ABOVE;Mn;230;NSM;;;;;N;;;;; 073B;SYRIAC HBASA BELOW;Mn;220;NSM;;;;;N;;;;; 073C;SYRIAC HBASA-ESASA DOTTED;Mn;220;NSM;;;;;N;;;;; 073D;SYRIAC ESASA ABOVE;Mn;230;NSM;;;;;N;;;;; 073E;SYRIAC ESASA BELOW;Mn;220;NSM;;;;;N;;;;; 073F;SYRIAC RWAHA;Mn;230;NSM;;;;;N;;;;; 0740;SYRIAC FEMININE DOT;Mn;230;NSM;;;;;N;;;;; 0741;SYRIAC QUSHSHAYA;Mn;230;NSM;;;;;N;;;;; 0742;SYRIAC RUKKAKHA;Mn;220;NSM;;;;;N;;;;; 0743;SYRIAC TWO VERTICAL DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; 0744;SYRIAC TWO VERTICAL DOTS BELOW;Mn;220;NSM;;;;;N;;;;; 0745;SYRIAC THREE DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; 0746;SYRIAC THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; 0747;SYRIAC OBLIQUE LINE ABOVE;Mn;230;NSM;;;;;N;;;;; 0748;SYRIAC OBLIQUE LINE BELOW;Mn;220;NSM;;;;;N;;;;; 0749;SYRIAC MUSIC;Mn;230;NSM;;;;;N;;;;; 074A;SYRIAC BARREKH;Mn;230;NSM;;;;;N;;;;; 074D;SYRIAC LETTER SOGDIAN ZHAIN;Lo;0;AL;;;;;N;;;;; 074E;SYRIAC LETTER SOGDIAN KHAPH;Lo;0;AL;;;;;N;;;;; 074F;SYRIAC LETTER SOGDIAN FE;Lo;0;AL;;;;;N;;;;; 0750;ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW;Lo;0;AL;;;;;N;;;;; 0751;ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 0752;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; 0753;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 0754;ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; 0755;ARABIC LETTER BEH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; 0756;ARABIC LETTER BEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; 0757;ARABIC LETTER HAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 0758;ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; 0759;ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; 075A;ARABIC LETTER DAL WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; 075B;ARABIC LETTER REH WITH STROKE;Lo;0;AL;;;;;N;;;;; 075C;ARABIC LETTER SEEN WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 075D;ARABIC LETTER AIN WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 075E;ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE;Lo;0;AL;;;;;N;;;;; 075F;ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; 0760;ARABIC LETTER FEH WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; 0761;ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; 0762;ARABIC LETTER KEHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; 0763;ARABIC LETTER KEHEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 0764;ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; 0765;ARABIC LETTER MEEM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; 0766;ARABIC LETTER MEEM WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; 0767;ARABIC LETTER NOON WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; 0768;ARABIC LETTER NOON WITH SMALL TAH;Lo;0;AL;;;;;N;;;;; 0769;ARABIC LETTER NOON WITH SMALL V;Lo;0;AL;;;;;N;;;;; 076A;ARABIC LETTER LAM WITH BAR;Lo;0;AL;;;;;N;;;;; 076B;ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; 076C;ARABIC LETTER REH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; 076D;ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; 076E;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW;Lo;0;AL;;;;;N;;;;; 076F;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; 0770;ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; 0771;ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; 0772;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;; 0773;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; 0774;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; 0775;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; 0776;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; 0777;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; 0778;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; 0779;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; 077A;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; 077B;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; 077C;ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; 077D;ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE;Lo;0;AL;;;;;N;;;;; 077E;ARABIC LETTER SEEN WITH INVERTED V;Lo;0;AL;;;;;N;;;;; 077F;ARABIC LETTER KAF WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;; 0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;; 0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;; 0783;THAANA LETTER RAA;Lo;0;AL;;;;;N;;;;; 0784;THAANA LETTER BAA;Lo;0;AL;;;;;N;;;;; 0785;THAANA LETTER LHAVIYANI;Lo;0;AL;;;;;N;;;;; 0786;THAANA LETTER KAAFU;Lo;0;AL;;;;;N;;;;; 0787;THAANA LETTER ALIFU;Lo;0;AL;;;;;N;;;;; 0788;THAANA LETTER VAAVU;Lo;0;AL;;;;;N;;;;; 0789;THAANA LETTER MEEMU;Lo;0;AL;;;;;N;;;;; 078A;THAANA LETTER FAAFU;Lo;0;AL;;;;;N;;;;; 078B;THAANA LETTER DHAALU;Lo;0;AL;;;;;N;;;;; 078C;THAANA LETTER THAA;Lo;0;AL;;;;;N;;;;; 078D;THAANA LETTER LAAMU;Lo;0;AL;;;;;N;;;;; 078E;THAANA LETTER GAAFU;Lo;0;AL;;;;;N;;;;; 078F;THAANA LETTER GNAVIYANI;Lo;0;AL;;;;;N;;;;; 0790;THAANA LETTER SEENU;Lo;0;AL;;;;;N;;;;; 0791;THAANA LETTER DAVIYANI;Lo;0;AL;;;;;N;;;;; 0792;THAANA LETTER ZAVIYANI;Lo;0;AL;;;;;N;;;;; 0793;THAANA LETTER TAVIYANI;Lo;0;AL;;;;;N;;;;; 0794;THAANA LETTER YAA;Lo;0;AL;;;;;N;;;;; 0795;THAANA LETTER PAVIYANI;Lo;0;AL;;;;;N;;;;; 0796;THAANA LETTER JAVIYANI;Lo;0;AL;;;;;N;;;;; 0797;THAANA LETTER CHAVIYANI;Lo;0;AL;;;;;N;;;;; 0798;THAANA LETTER TTAA;Lo;0;AL;;;;;N;;;;; 0799;THAANA LETTER HHAA;Lo;0;AL;;;;;N;;;;; 079A;THAANA LETTER KHAA;Lo;0;AL;;;;;N;;;;; 079B;THAANA LETTER THAALU;Lo;0;AL;;;;;N;;;;; 079C;THAANA LETTER ZAA;Lo;0;AL;;;;;N;;;;; 079D;THAANA LETTER SHEENU;Lo;0;AL;;;;;N;;;;; 079E;THAANA LETTER SAADHU;Lo;0;AL;;;;;N;;;;; 079F;THAANA LETTER DAADHU;Lo;0;AL;;;;;N;;;;; 07A0;THAANA LETTER TO;Lo;0;AL;;;;;N;;;;; 07A1;THAANA LETTER ZO;Lo;0;AL;;;;;N;;;;; 07A2;THAANA LETTER AINU;Lo;0;AL;;;;;N;;;;; 07A3;THAANA LETTER GHAINU;Lo;0;AL;;;;;N;;;;; 07A4;THAANA LETTER QAAFU;Lo;0;AL;;;;;N;;;;; 07A5;THAANA LETTER WAAVU;Lo;0;AL;;;;;N;;;;; 07A6;THAANA ABAFILI;Mn;0;NSM;;;;;N;;;;; 07A7;THAANA AABAAFILI;Mn;0;NSM;;;;;N;;;;; 07A8;THAANA IBIFILI;Mn;0;NSM;;;;;N;;;;; 07A9;THAANA EEBEEFILI;Mn;0;NSM;;;;;N;;;;; 07AA;THAANA UBUFILI;Mn;0;NSM;;;;;N;;;;; 07AB;THAANA OOBOOFILI;Mn;0;NSM;;;;;N;;;;; 07AC;THAANA EBEFILI;Mn;0;NSM;;;;;N;;;;; 07AD;THAANA EYBEYFILI;Mn;0;NSM;;;;;N;;;;; 07AE;THAANA OBOFILI;Mn;0;NSM;;;;;N;;;;; 07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;; 07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;; 07B1;THAANA LETTER NAA;Lo;0;AL;;;;;N;;;;; 07C0;NKO DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;; 07C1;NKO DIGIT ONE;Nd;0;R;;1;1;1;N;;;;; 07C2;NKO DIGIT TWO;Nd;0;R;;2;2;2;N;;;;; 07C3;NKO DIGIT THREE;Nd;0;R;;3;3;3;N;;;;; 07C4;NKO DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;; 07C5;NKO DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;; 07C6;NKO DIGIT SIX;Nd;0;R;;6;6;6;N;;;;; 07C7;NKO DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;; 07C8;NKO DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;; 07C9;NKO DIGIT NINE;Nd;0;R;;9;9;9;N;;;;; 07CA;NKO LETTER A;Lo;0;R;;;;;N;;;;; 07CB;NKO LETTER EE;Lo;0;R;;;;;N;;;;; 07CC;NKO LETTER I;Lo;0;R;;;;;N;;;;; 07CD;NKO LETTER E;Lo;0;R;;;;;N;;;;; 07CE;NKO LETTER U;Lo;0;R;;;;;N;;;;; 07CF;NKO LETTER OO;Lo;0;R;;;;;N;;;;; 07D0;NKO LETTER O;Lo;0;R;;;;;N;;;;; 07D1;NKO LETTER DAGBASINNA;Lo;0;R;;;;;N;;;;; 07D2;NKO LETTER N;Lo;0;R;;;;;N;;;;; 07D3;NKO LETTER BA;Lo;0;R;;;;;N;;;;; 07D4;NKO LETTER PA;Lo;0;R;;;;;N;;;;; 07D5;NKO LETTER TA;Lo;0;R;;;;;N;;;;; 07D6;NKO LETTER JA;Lo;0;R;;;;;N;;;;; 07D7;NKO LETTER CHA;Lo;0;R;;;;;N;;;;; 07D8;NKO LETTER DA;Lo;0;R;;;;;N;;;;; 07D9;NKO LETTER RA;Lo;0;R;;;;;N;;;;; 07DA;NKO LETTER RRA;Lo;0;R;;;;;N;;;;; 07DB;NKO LETTER SA;Lo;0;R;;;;;N;;;;; 07DC;NKO LETTER GBA;Lo;0;R;;;;;N;;;;; 07DD;NKO LETTER FA;Lo;0;R;;;;;N;;;;; 07DE;NKO LETTER KA;Lo;0;R;;;;;N;;;;; 07DF;NKO LETTER LA;Lo;0;R;;;;;N;;;;; 07E0;NKO LETTER NA WOLOSO;Lo;0;R;;;;;N;;;;; 07E1;NKO LETTER MA;Lo;0;R;;;;;N;;;;; 07E2;NKO LETTER NYA;Lo;0;R;;;;;N;;;;; 07E3;NKO LETTER NA;Lo;0;R;;;;;N;;;;; 07E4;NKO LETTER HA;Lo;0;R;;;;;N;;;;; 07E5;NKO LETTER WA;Lo;0;R;;;;;N;;;;; 07E6;NKO LETTER YA;Lo;0;R;;;;;N;;;;; 07E7;NKO LETTER NYA WOLOSO;Lo;0;R;;;;;N;;;;; 07E8;NKO LETTER JONA JA;Lo;0;R;;;;;N;;;;; 07E9;NKO LETTER JONA CHA;Lo;0;R;;;;;N;;;;; 07EA;NKO LETTER JONA RA;Lo;0;R;;;;;N;;;;; 07EB;NKO COMBINING SHORT HIGH TONE;Mn;230;NSM;;;;;N;;;;; 07EC;NKO COMBINING SHORT LOW TONE;Mn;230;NSM;;;;;N;;;;; 07ED;NKO COMBINING SHORT RISING TONE;Mn;230;NSM;;;;;N;;;;; 07EE;NKO COMBINING LONG DESCENDING TONE;Mn;230;NSM;;;;;N;;;;; 07EF;NKO COMBINING LONG HIGH TONE;Mn;230;NSM;;;;;N;;;;; 07F0;NKO COMBINING LONG LOW TONE;Mn;230;NSM;;;;;N;;;;; 07F1;NKO COMBINING LONG RISING TONE;Mn;230;NSM;;;;;N;;;;; 07F2;NKO COMBINING NASALIZATION MARK;Mn;220;NSM;;;;;N;;;;; 07F3;NKO COMBINING DOUBLE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; 07F4;NKO HIGH TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; 07F5;NKO LOW TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; 07F6;NKO SYMBOL OO DENNEN;So;0;ON;;;;;N;;;;; 07F7;NKO SYMBOL GBAKURUNEN;Po;0;ON;;;;;N;;;;; 07F8;NKO COMMA;Po;0;ON;;;;;N;;;;; 07F9;NKO EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; 07FA;NKO LAJANYALAN;Lm;0;R;;;;;N;;;;; 0800;SAMARITAN LETTER ALAF;Lo;0;R;;;;;N;;;;; 0801;SAMARITAN LETTER BIT;Lo;0;R;;;;;N;;;;; 0802;SAMARITAN LETTER GAMAN;Lo;0;R;;;;;N;;;;; 0803;SAMARITAN LETTER DALAT;Lo;0;R;;;;;N;;;;; 0804;SAMARITAN LETTER IY;Lo;0;R;;;;;N;;;;; 0805;SAMARITAN LETTER BAA;Lo;0;R;;;;;N;;;;; 0806;SAMARITAN LETTER ZEN;Lo;0;R;;;;;N;;;;; 0807;SAMARITAN LETTER IT;Lo;0;R;;;;;N;;;;; 0808;SAMARITAN LETTER TIT;Lo;0;R;;;;;N;;;;; 0809;SAMARITAN LETTER YUT;Lo;0;R;;;;;N;;;;; 080A;SAMARITAN LETTER KAAF;Lo;0;R;;;;;N;;;;; 080B;SAMARITAN LETTER LABAT;Lo;0;R;;;;;N;;;;; 080C;SAMARITAN LETTER MIM;Lo;0;R;;;;;N;;;;; 080D;SAMARITAN LETTER NUN;Lo;0;R;;;;;N;;;;; 080E;SAMARITAN LETTER SINGAAT;Lo;0;R;;;;;N;;;;; 080F;SAMARITAN LETTER IN;Lo;0;R;;;;;N;;;;; 0810;SAMARITAN LETTER FI;Lo;0;R;;;;;N;;;;; 0811;SAMARITAN LETTER TSAADIY;Lo;0;R;;;;;N;;;;; 0812;SAMARITAN LETTER QUF;Lo;0;R;;;;;N;;;;; 0813;SAMARITAN LETTER RISH;Lo;0;R;;;;;N;;;;; 0814;SAMARITAN LETTER SHAN;Lo;0;R;;;;;N;;;;; 0815;SAMARITAN LETTER TAAF;Lo;0;R;;;;;N;;;;; 0816;SAMARITAN MARK IN;Mn;230;NSM;;;;;N;;;;; 0817;SAMARITAN MARK IN-ALAF;Mn;230;NSM;;;;;N;;;;; 0818;SAMARITAN MARK OCCLUSION;Mn;230;NSM;;;;;N;;;;; 0819;SAMARITAN MARK DAGESH;Mn;230;NSM;;;;;N;;;;; 081A;SAMARITAN MODIFIER LETTER EPENTHETIC YUT;Lm;0;R;;;;;N;;;;; 081B;SAMARITAN MARK EPENTHETIC YUT;Mn;230;NSM;;;;;N;;;;; 081C;SAMARITAN VOWEL SIGN LONG E;Mn;230;NSM;;;;;N;;;;; 081D;SAMARITAN VOWEL SIGN E;Mn;230;NSM;;;;;N;;;;; 081E;SAMARITAN VOWEL SIGN OVERLONG AA;Mn;230;NSM;;;;;N;;;;; 081F;SAMARITAN VOWEL SIGN LONG AA;Mn;230;NSM;;;;;N;;;;; 0820;SAMARITAN VOWEL SIGN AA;Mn;230;NSM;;;;;N;;;;; 0821;SAMARITAN VOWEL SIGN OVERLONG A;Mn;230;NSM;;;;;N;;;;; 0822;SAMARITAN VOWEL SIGN LONG A;Mn;230;NSM;;;;;N;;;;; 0823;SAMARITAN VOWEL SIGN A;Mn;230;NSM;;;;;N;;;;; 0824;SAMARITAN MODIFIER LETTER SHORT A;Lm;0;R;;;;;N;;;;; 0825;SAMARITAN VOWEL SIGN SHORT A;Mn;230;NSM;;;;;N;;;;; 0826;SAMARITAN VOWEL SIGN LONG U;Mn;230;NSM;;;;;N;;;;; 0827;SAMARITAN VOWEL SIGN U;Mn;230;NSM;;;;;N;;;;; 0828;SAMARITAN MODIFIER LETTER I;Lm;0;R;;;;;N;;;;; 0829;SAMARITAN VOWEL SIGN LONG I;Mn;230;NSM;;;;;N;;;;; 082A;SAMARITAN VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; 082B;SAMARITAN VOWEL SIGN O;Mn;230;NSM;;;;;N;;;;; 082C;SAMARITAN VOWEL SIGN SUKUN;Mn;230;NSM;;;;;N;;;;; 082D;SAMARITAN MARK NEQUDAA;Mn;230;NSM;;;;;N;;;;; 0830;SAMARITAN PUNCTUATION NEQUDAA;Po;0;R;;;;;N;;;;; 0831;SAMARITAN PUNCTUATION AFSAAQ;Po;0;R;;;;;N;;;;; 0832;SAMARITAN PUNCTUATION ANGED;Po;0;R;;;;;N;;;;; 0833;SAMARITAN PUNCTUATION BAU;Po;0;R;;;;;N;;;;; 0834;SAMARITAN PUNCTUATION ATMAAU;Po;0;R;;;;;N;;;;; 0835;SAMARITAN PUNCTUATION SHIYYAALAA;Po;0;R;;;;;N;;;;; 0836;SAMARITAN ABBREVIATION MARK;Po;0;R;;;;;N;;;;; 0837;SAMARITAN PUNCTUATION MELODIC QITSA;Po;0;R;;;;;N;;;;; 0838;SAMARITAN PUNCTUATION ZIQAA;Po;0;R;;;;;N;;;;; 0839;SAMARITAN PUNCTUATION QITSA;Po;0;R;;;;;N;;;;; 083A;SAMARITAN PUNCTUATION ZAEF;Po;0;R;;;;;N;;;;; 083B;SAMARITAN PUNCTUATION TURU;Po;0;R;;;;;N;;;;; 083C;SAMARITAN PUNCTUATION ARKAANU;Po;0;R;;;;;N;;;;; 083D;SAMARITAN PUNCTUATION SOF MASHFAAT;Po;0;R;;;;;N;;;;; 083E;SAMARITAN PUNCTUATION ANNAAU;Po;0;R;;;;;N;;;;; 0840;MANDAIC LETTER HALQA;Lo;0;R;;;;;N;;;;; 0841;MANDAIC LETTER AB;Lo;0;R;;;;;N;;;;; 0842;MANDAIC LETTER AG;Lo;0;R;;;;;N;;;;; 0843;MANDAIC LETTER AD;Lo;0;R;;;;;N;;;;; 0844;MANDAIC LETTER AH;Lo;0;R;;;;;N;;;;; 0845;MANDAIC LETTER USHENNA;Lo;0;R;;;;;N;;;;; 0846;MANDAIC LETTER AZ;Lo;0;R;;;;;N;;;;; 0847;MANDAIC LETTER IT;Lo;0;R;;;;;N;;;;; 0848;MANDAIC LETTER ATT;Lo;0;R;;;;;N;;;;; 0849;MANDAIC LETTER AKSA;Lo;0;R;;;;;N;;;;; 084A;MANDAIC LETTER AK;Lo;0;R;;;;;N;;;;; 084B;MANDAIC LETTER AL;Lo;0;R;;;;;N;;;;; 084C;MANDAIC LETTER AM;Lo;0;R;;;;;N;;;;; 084D;MANDAIC LETTER AN;Lo;0;R;;;;;N;;;;; 084E;MANDAIC LETTER AS;Lo;0;R;;;;;N;;;;; 084F;MANDAIC LETTER IN;Lo;0;R;;;;;N;;;;; 0850;MANDAIC LETTER AP;Lo;0;R;;;;;N;;;;; 0851;MANDAIC LETTER ASZ;Lo;0;R;;;;;N;;;;; 0852;MANDAIC LETTER AQ;Lo;0;R;;;;;N;;;;; 0853;MANDAIC LETTER AR;Lo;0;R;;;;;N;;;;; 0854;MANDAIC LETTER ASH;Lo;0;R;;;;;N;;;;; 0855;MANDAIC LETTER AT;Lo;0;R;;;;;N;;;;; 0856;MANDAIC LETTER DUSHENNA;Lo;0;R;;;;;N;;;;; 0857;MANDAIC LETTER KAD;Lo;0;R;;;;;N;;;;; 0858;MANDAIC LETTER AIN;Lo;0;R;;;;;N;;;;; 0859;MANDAIC AFFRICATION MARK;Mn;220;NSM;;;;;N;;;;; 085A;MANDAIC VOCALIZATION MARK;Mn;220;NSM;;;;;N;;;;; 085B;MANDAIC GEMINATION MARK;Mn;220;NSM;;;;;N;;;;; 085E;MANDAIC PUNCTUATION;Po;0;R;;;;;N;;;;; 08A0;ARABIC LETTER BEH WITH SMALL V BELOW;Lo;0;AL;;;;;N;;;;; 08A1;ARABIC LETTER BEH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; 08A2;ARABIC LETTER JEEM WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 08A3;ARABIC LETTER TAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 08A4;ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 08A5;ARABIC LETTER QAF WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; 08A6;ARABIC LETTER LAM WITH DOUBLE BAR;Lo;0;AL;;;;;N;;;;; 08A7;ARABIC LETTER MEEM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; 08A8;ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; 08A9;ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; 08AA;ARABIC LETTER REH WITH LOOP;Lo;0;AL;;;;;N;;;;; 08AB;ARABIC LETTER WAW WITH DOT WITHIN;Lo;0;AL;;;;;N;;;;; 08AC;ARABIC LETTER ROHINGYA YEH;Lo;0;AL;;;;;N;;;;; 08AD;ARABIC LETTER LOW ALEF;Lo;0;AL;;;;;N;;;;; 08AE;ARABIC LETTER DAL WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; 08AF;ARABIC LETTER SAD WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; 08B0;ARABIC LETTER GAF WITH INVERTED STROKE;Lo;0;AL;;;;;N;;;;; 08B1;ARABIC LETTER STRAIGHT WAW;Lo;0;AL;;;;;N;;;;; 08B2;ARABIC LETTER ZAIN WITH INVERTED V ABOVE;Lo;0;AL;;;;;N;;;;; 08B3;ARABIC LETTER AIN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; 08B4;ARABIC LETTER KAF WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; 08B6;ARABIC LETTER BEH WITH SMALL MEEM ABOVE;Lo;0;AL;;;;;N;;;;; 08B7;ARABIC LETTER PEH WITH SMALL MEEM ABOVE;Lo;0;AL;;;;;N;;;;; 08B8;ARABIC LETTER TEH WITH SMALL TEH ABOVE;Lo;0;AL;;;;;N;;;;; 08B9;ARABIC LETTER REH WITH SMALL NOON ABOVE;Lo;0;AL;;;;;N;;;;; 08BA;ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE;Lo;0;AL;;;;;N;;;;; 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;;;;; 08D4;ARABIC SMALL HIGH WORD AR-RUB;Mn;230;NSM;;;;;N;;;;; 08D5;ARABIC SMALL HIGH SAD;Mn;230;NSM;;;;;N;;;;; 08D6;ARABIC SMALL HIGH AIN;Mn;230;NSM;;;;;N;;;;; 08D7;ARABIC SMALL HIGH QAF;Mn;230;NSM;;;;;N;;;;; 08D8;ARABIC SMALL HIGH NOON WITH KASRA;Mn;230;NSM;;;;;N;;;;; 08D9;ARABIC SMALL LOW NOON WITH KASRA;Mn;230;NSM;;;;;N;;;;; 08DA;ARABIC SMALL HIGH WORD ATH-THALATHA;Mn;230;NSM;;;;;N;;;;; 08DB;ARABIC SMALL HIGH WORD AS-SAJDA;Mn;230;NSM;;;;;N;;;;; 08DC;ARABIC SMALL HIGH WORD AN-NISF;Mn;230;NSM;;;;;N;;;;; 08DD;ARABIC SMALL HIGH WORD SAKTA;Mn;230;NSM;;;;;N;;;;; 08DE;ARABIC SMALL HIGH WORD QIF;Mn;230;NSM;;;;;N;;;;; 08DF;ARABIC SMALL HIGH WORD WAQFA;Mn;230;NSM;;;;;N;;;;; 08E0;ARABIC SMALL HIGH FOOTNOTE MARKER;Mn;230;NSM;;;;;N;;;;; 08E1;ARABIC SMALL HIGH SIGN SAFHA;Mn;230;NSM;;;;;N;;;;; 08E2;ARABIC DISPUTED END OF AYAH;Cf;0;AN;;;;;N;;;;; 08E3;ARABIC TURNED DAMMA BELOW;Mn;220;NSM;;;;;N;;;;; 08E4;ARABIC CURLY FATHA;Mn;230;NSM;;;;;N;;;;; 08E5;ARABIC CURLY DAMMA;Mn;230;NSM;;;;;N;;;;; 08E6;ARABIC CURLY KASRA;Mn;220;NSM;;;;;N;;;;; 08E7;ARABIC CURLY FATHATAN;Mn;230;NSM;;;;;N;;;;; 08E8;ARABIC CURLY DAMMATAN;Mn;230;NSM;;;;;N;;;;; 08E9;ARABIC CURLY KASRATAN;Mn;220;NSM;;;;;N;;;;; 08EA;ARABIC TONE ONE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; 08EB;ARABIC TONE TWO DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; 08EC;ARABIC TONE LOOP ABOVE;Mn;230;NSM;;;;;N;;;;; 08ED;ARABIC TONE ONE DOT BELOW;Mn;220;NSM;;;;;N;;;;; 08EE;ARABIC TONE TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; 08EF;ARABIC TONE LOOP BELOW;Mn;220;NSM;;;;;N;;;;; 08F0;ARABIC OPEN FATHATAN;Mn;27;NSM;;;;;N;;;;; 08F1;ARABIC OPEN DAMMATAN;Mn;28;NSM;;;;;N;;;;; 08F2;ARABIC OPEN KASRATAN;Mn;29;NSM;;;;;N;;;;; 08F3;ARABIC SMALL HIGH WAW;Mn;230;NSM;;;;;N;;;;; 08F4;ARABIC FATHA WITH RING;Mn;230;NSM;;;;;N;;;;; 08F5;ARABIC FATHA WITH DOT ABOVE;Mn;230;NSM;;;;;N;;;;; 08F6;ARABIC KASRA WITH DOT BELOW;Mn;220;NSM;;;;;N;;;;; 08F7;ARABIC LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; 08F8;ARABIC RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; 08F9;ARABIC LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; 08FA;ARABIC RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; 08FB;ARABIC DOUBLE RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; 08FC;ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT;Mn;230;NSM;;;;;N;;;;; 08FD;ARABIC RIGHT ARROWHEAD ABOVE WITH DOT;Mn;230;NSM;;;;;N;;;;; 08FE;ARABIC DAMMA WITH DOT;Mn;230;NSM;;;;;N;;;;; 08FF;ARABIC MARK SIDEWAYS NOON GHUNNA;Mn;230;NSM;;;;;N;;;;; 0900;DEVANAGARI SIGN INVERTED CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;; 0904;DEVANAGARI LETTER SHORT A;Lo;0;L;;;;;N;;;;; 0905;DEVANAGARI LETTER A;Lo;0;L;;;;;N;;;;; 0906;DEVANAGARI LETTER AA;Lo;0;L;;;;;N;;;;; 0907;DEVANAGARI LETTER I;Lo;0;L;;;;;N;;;;; 0908;DEVANAGARI LETTER II;Lo;0;L;;;;;N;;;;; 0909;DEVANAGARI LETTER U;Lo;0;L;;;;;N;;;;; 090A;DEVANAGARI LETTER UU;Lo;0;L;;;;;N;;;;; 090B;DEVANAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; 090C;DEVANAGARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; 090D;DEVANAGARI LETTER CANDRA E;Lo;0;L;;;;;N;;;;; 090E;DEVANAGARI LETTER SHORT E;Lo;0;L;;;;;N;;;;; 090F;DEVANAGARI LETTER E;Lo;0;L;;;;;N;;;;; 0910;DEVANAGARI LETTER AI;Lo;0;L;;;;;N;;;;; 0911;DEVANAGARI LETTER CANDRA O;Lo;0;L;;;;;N;;;;; 0912;DEVANAGARI LETTER SHORT O;Lo;0;L;;;;;N;;;;; 0913;DEVANAGARI LETTER O;Lo;0;L;;;;;N;;;;; 0914;DEVANAGARI LETTER AU;Lo;0;L;;;;;N;;;;; 0915;DEVANAGARI LETTER KA;Lo;0;L;;;;;N;;;;; 0916;DEVANAGARI LETTER KHA;Lo;0;L;;;;;N;;;;; 0917;DEVANAGARI LETTER GA;Lo;0;L;;;;;N;;;;; 0918;DEVANAGARI LETTER GHA;Lo;0;L;;;;;N;;;;; 0919;DEVANAGARI LETTER NGA;Lo;0;L;;;;;N;;;;; 091A;DEVANAGARI LETTER CA;Lo;0;L;;;;;N;;;;; 091B;DEVANAGARI LETTER CHA;Lo;0;L;;;;;N;;;;; 091C;DEVANAGARI LETTER JA;Lo;0;L;;;;;N;;;;; 091D;DEVANAGARI LETTER JHA;Lo;0;L;;;;;N;;;;; 091E;DEVANAGARI LETTER NYA;Lo;0;L;;;;;N;;;;; 091F;DEVANAGARI LETTER TTA;Lo;0;L;;;;;N;;;;; 0920;DEVANAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;; 0921;DEVANAGARI LETTER DDA;Lo;0;L;;;;;N;;;;; 0922;DEVANAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;; 0923;DEVANAGARI LETTER NNA;Lo;0;L;;;;;N;;;;; 0924;DEVANAGARI LETTER TA;Lo;0;L;;;;;N;;;;; 0925;DEVANAGARI LETTER THA;Lo;0;L;;;;;N;;;;; 0926;DEVANAGARI LETTER DA;Lo;0;L;;;;;N;;;;; 0927;DEVANAGARI LETTER DHA;Lo;0;L;;;;;N;;;;; 0928;DEVANAGARI LETTER NA;Lo;0;L;;;;;N;;;;; 0929;DEVANAGARI LETTER NNNA;Lo;0;L;0928 093C;;;;N;;;;; 092A;DEVANAGARI LETTER PA;Lo;0;L;;;;;N;;;;; 092B;DEVANAGARI LETTER PHA;Lo;0;L;;;;;N;;;;; 092C;DEVANAGARI LETTER BA;Lo;0;L;;;;;N;;;;; 092D;DEVANAGARI LETTER BHA;Lo;0;L;;;;;N;;;;; 092E;DEVANAGARI LETTER MA;Lo;0;L;;;;;N;;;;; 092F;DEVANAGARI LETTER YA;Lo;0;L;;;;;N;;;;; 0930;DEVANAGARI LETTER RA;Lo;0;L;;;;;N;;;;; 0931;DEVANAGARI LETTER RRA;Lo;0;L;0930 093C;;;;N;;;;; 0932;DEVANAGARI LETTER LA;Lo;0;L;;;;;N;;;;; 0933;DEVANAGARI LETTER LLA;Lo;0;L;;;;;N;;;;; 0934;DEVANAGARI LETTER LLLA;Lo;0;L;0933 093C;;;;N;;;;; 0935;DEVANAGARI LETTER VA;Lo;0;L;;;;;N;;;;; 0936;DEVANAGARI LETTER SHA;Lo;0;L;;;;;N;;;;; 0937;DEVANAGARI LETTER SSA;Lo;0;L;;;;;N;;;;; 0938;DEVANAGARI LETTER SA;Lo;0;L;;;;;N;;;;; 0939;DEVANAGARI LETTER HA;Lo;0;L;;;;;N;;;;; 093A;DEVANAGARI VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; 093B;DEVANAGARI VOWEL SIGN OOE;Mc;0;L;;;;;N;;;;; 093C;DEVANAGARI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; 093D;DEVANAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; 093E;DEVANAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 093F;DEVANAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; 0940;DEVANAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; 0941;DEVANAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 0942;DEVANAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 0943;DEVANAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; 0944;DEVANAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; 0945;DEVANAGARI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; 0946;DEVANAGARI VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; 0947;DEVANAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; 0948;DEVANAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; 0949;DEVANAGARI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; 094A;DEVANAGARI VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; 094B;DEVANAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; 094C;DEVANAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; 094D;DEVANAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; 094E;DEVANAGARI VOWEL SIGN PRISHTHAMATRA E;Mc;0;L;;;;;N;;;;; 094F;DEVANAGARI VOWEL SIGN AW;Mc;0;L;;;;;N;;;;; 0950;DEVANAGARI OM;Lo;0;L;;;;;N;;;;; 0951;DEVANAGARI STRESS SIGN UDATTA;Mn;230;NSM;;;;;N;;;;; 0952;DEVANAGARI STRESS SIGN ANUDATTA;Mn;220;NSM;;;;;N;;;;; 0953;DEVANAGARI GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; 0954;DEVANAGARI ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; 0955;DEVANAGARI VOWEL SIGN CANDRA LONG E;Mn;0;NSM;;;;;N;;;;; 0956;DEVANAGARI VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; 0957;DEVANAGARI VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;; 0958;DEVANAGARI LETTER QA;Lo;0;L;0915 093C;;;;N;;;;; 0959;DEVANAGARI LETTER KHHA;Lo;0;L;0916 093C;;;;N;;;;; 095A;DEVANAGARI LETTER GHHA;Lo;0;L;0917 093C;;;;N;;;;; 095B;DEVANAGARI LETTER ZA;Lo;0;L;091C 093C;;;;N;;;;; 095C;DEVANAGARI LETTER DDDHA;Lo;0;L;0921 093C;;;;N;;;;; 095D;DEVANAGARI LETTER RHA;Lo;0;L;0922 093C;;;;N;;;;; 095E;DEVANAGARI LETTER FA;Lo;0;L;092B 093C;;;;N;;;;; 095F;DEVANAGARI LETTER YYA;Lo;0;L;092F 093C;;;;N;;;;; 0960;DEVANAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 0961;DEVANAGARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; 0962;DEVANAGARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; 0963;DEVANAGARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; 0964;DEVANAGARI DANDA;Po;0;L;;;;;N;;;;; 0965;DEVANAGARI DOUBLE DANDA;Po;0;L;;;;;N;;;;; 0966;DEVANAGARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 0967;DEVANAGARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 0968;DEVANAGARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 0969;DEVANAGARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 096A;DEVANAGARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 096B;DEVANAGARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 096C;DEVANAGARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 096D;DEVANAGARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; 0971;DEVANAGARI SIGN HIGH SPACING DOT;Lm;0;L;;;;;N;;;;; 0972;DEVANAGARI LETTER CANDRA A;Lo;0;L;;;;;N;;;;; 0973;DEVANAGARI LETTER OE;Lo;0;L;;;;;N;;;;; 0974;DEVANAGARI LETTER OOE;Lo;0;L;;;;;N;;;;; 0975;DEVANAGARI LETTER AW;Lo;0;L;;;;;N;;;;; 0976;DEVANAGARI LETTER UE;Lo;0;L;;;;;N;;;;; 0977;DEVANAGARI LETTER UUE;Lo;0;L;;;;;N;;;;; 0978;DEVANAGARI LETTER MARWARI DDA;Lo;0;L;;;;;N;;;;; 0979;DEVANAGARI LETTER ZHA;Lo;0;L;;;;;N;;;;; 097A;DEVANAGARI LETTER HEAVY YA;Lo;0;L;;;;;N;;;;; 097B;DEVANAGARI LETTER GGA;Lo;0;L;;;;;N;;;;; 097C;DEVANAGARI LETTER JJA;Lo;0;L;;;;;N;;;;; 097D;DEVANAGARI LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; 097E;DEVANAGARI LETTER DDDA;Lo;0;L;;;;;N;;;;; 097F;DEVANAGARI LETTER BBA;Lo;0;L;;;;;N;;;;; 0980;BENGALI ANJI;Lo;0;L;;;;;N;;;;; 0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; 0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;; 0985;BENGALI LETTER A;Lo;0;L;;;;;N;;;;; 0986;BENGALI LETTER AA;Lo;0;L;;;;;N;;;;; 0987;BENGALI LETTER I;Lo;0;L;;;;;N;;;;; 0988;BENGALI LETTER II;Lo;0;L;;;;;N;;;;; 0989;BENGALI LETTER U;Lo;0;L;;;;;N;;;;; 098A;BENGALI LETTER UU;Lo;0;L;;;;;N;;;;; 098B;BENGALI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; 098C;BENGALI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; 098F;BENGALI LETTER E;Lo;0;L;;;;;N;;;;; 0990;BENGALI LETTER AI;Lo;0;L;;;;;N;;;;; 0993;BENGALI LETTER O;Lo;0;L;;;;;N;;;;; 0994;BENGALI LETTER AU;Lo;0;L;;;;;N;;;;; 0995;BENGALI LETTER KA;Lo;0;L;;;;;N;;;;; 0996;BENGALI LETTER KHA;Lo;0;L;;;;;N;;;;; 0997;BENGALI LETTER GA;Lo;0;L;;;;;N;;;;; 0998;BENGALI LETTER GHA;Lo;0;L;;;;;N;;;;; 0999;BENGALI LETTER NGA;Lo;0;L;;;;;N;;;;; 099A;BENGALI LETTER CA;Lo;0;L;;;;;N;;;;; 099B;BENGALI LETTER CHA;Lo;0;L;;;;;N;;;;; 099C;BENGALI LETTER JA;Lo;0;L;;;;;N;;;;; 099D;BENGALI LETTER JHA;Lo;0;L;;;;;N;;;;; 099E;BENGALI LETTER NYA;Lo;0;L;;;;;N;;;;; 099F;BENGALI LETTER TTA;Lo;0;L;;;;;N;;;;; 09A0;BENGALI LETTER TTHA;Lo;0;L;;;;;N;;;;; 09A1;BENGALI LETTER DDA;Lo;0;L;;;;;N;;;;; 09A2;BENGALI LETTER DDHA;Lo;0;L;;;;;N;;;;; 09A3;BENGALI LETTER NNA;Lo;0;L;;;;;N;;;;; 09A4;BENGALI LETTER TA;Lo;0;L;;;;;N;;;;; 09A5;BENGALI LETTER THA;Lo;0;L;;;;;N;;;;; 09A6;BENGALI LETTER DA;Lo;0;L;;;;;N;;;;; 09A7;BENGALI LETTER DHA;Lo;0;L;;;;;N;;;;; 09A8;BENGALI LETTER NA;Lo;0;L;;;;;N;;;;; 09AA;BENGALI LETTER PA;Lo;0;L;;;;;N;;;;; 09AB;BENGALI LETTER PHA;Lo;0;L;;;;;N;;;;; 09AC;BENGALI LETTER BA;Lo;0;L;;;;;N;;;;; 09AD;BENGALI LETTER BHA;Lo;0;L;;;;;N;;;;; 09AE;BENGALI LETTER MA;Lo;0;L;;;;;N;;;;; 09AF;BENGALI LETTER YA;Lo;0;L;;;;;N;;;;; 09B0;BENGALI LETTER RA;Lo;0;L;;;;;N;;;;; 09B2;BENGALI LETTER LA;Lo;0;L;;;;;N;;;;; 09B6;BENGALI LETTER SHA;Lo;0;L;;;;;N;;;;; 09B7;BENGALI LETTER SSA;Lo;0;L;;;;;N;;;;; 09B8;BENGALI LETTER SA;Lo;0;L;;;;;N;;;;; 09B9;BENGALI LETTER HA;Lo;0;L;;;;;N;;;;; 09BC;BENGALI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; 09BD;BENGALI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; 09BE;BENGALI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 09BF;BENGALI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; 09C0;BENGALI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; 09C1;BENGALI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 09C2;BENGALI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 09C3;BENGALI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; 09C4;BENGALI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; 09C7;BENGALI VOWEL SIGN E;Mc;0;L;;;;;N;;;;; 09C8;BENGALI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; 09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;; 09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;; 09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; 09CE;BENGALI LETTER KHANDA TA;Lo;0;L;;;;;N;;;;; 09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;; 09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;; 09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;; 09DF;BENGALI LETTER YYA;Lo;0;L;09AF 09BC;;;;N;;;;; 09E0;BENGALI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 09E1;BENGALI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; 09E2;BENGALI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; 09E3;BENGALI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; 09E6;BENGALI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 09E7;BENGALI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 09E8;BENGALI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 09E9;BENGALI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 09EA;BENGALI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 09EB;BENGALI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 09EC;BENGALI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 09ED;BENGALI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 09EE;BENGALI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 09EF;BENGALI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 09F0;BENGALI LETTER RA WITH MIDDLE DIAGONAL;Lo;0;L;;;;;N;;;;; 09F1;BENGALI LETTER RA WITH LOWER DIAGONAL;Lo;0;L;;;;;N;BENGALI LETTER VA WITH LOWER DIAGONAL;;;; 09F2;BENGALI RUPEE MARK;Sc;0;ET;;;;;N;;;;; 09F3;BENGALI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; 09F4;BENGALI CURRENCY NUMERATOR ONE;No;0;L;;;;1/16;N;;;;; 09F5;BENGALI CURRENCY NUMERATOR TWO;No;0;L;;;;1/8;N;;;;; 09F6;BENGALI CURRENCY NUMERATOR THREE;No;0;L;;;;3/16;N;;;;; 09F7;BENGALI CURRENCY NUMERATOR FOUR;No;0;L;;;;1/4;N;;;;; 09F8;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR;No;0;L;;;;3/4;N;;;;; 09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;; 09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;; 09FB;BENGALI GANDA MARK;Sc;0;ET;;;;;N;;;;; 0A01;GURMUKHI SIGN ADAK BINDI;Mn;0;NSM;;;;;N;;;;; 0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;; 0A03;GURMUKHI SIGN VISARGA;Mc;0;L;;;;;N;;;;; 0A05;GURMUKHI LETTER A;Lo;0;L;;;;;N;;;;; 0A06;GURMUKHI LETTER AA;Lo;0;L;;;;;N;;;;; 0A07;GURMUKHI LETTER I;Lo;0;L;;;;;N;;;;; 0A08;GURMUKHI LETTER II;Lo;0;L;;;;;N;;;;; 0A09;GURMUKHI LETTER U;Lo;0;L;;;;;N;;;;; 0A0A;GURMUKHI LETTER UU;Lo;0;L;;;;;N;;;;; 0A0F;GURMUKHI LETTER EE;Lo;0;L;;;;;N;;;;; 0A10;GURMUKHI LETTER AI;Lo;0;L;;;;;N;;;;; 0A13;GURMUKHI LETTER OO;Lo;0;L;;;;;N;;;;; 0A14;GURMUKHI LETTER AU;Lo;0;L;;;;;N;;;;; 0A15;GURMUKHI LETTER KA;Lo;0;L;;;;;N;;;;; 0A16;GURMUKHI LETTER KHA;Lo;0;L;;;;;N;;;;; 0A17;GURMUKHI LETTER GA;Lo;0;L;;;;;N;;;;; 0A18;GURMUKHI LETTER GHA;Lo;0;L;;;;;N;;;;; 0A19;GURMUKHI LETTER NGA;Lo;0;L;;;;;N;;;;; 0A1A;GURMUKHI LETTER CA;Lo;0;L;;;;;N;;;;; 0A1B;GURMUKHI LETTER CHA;Lo;0;L;;;;;N;;;;; 0A1C;GURMUKHI LETTER JA;Lo;0;L;;;;;N;;;;; 0A1D;GURMUKHI LETTER JHA;Lo;0;L;;;;;N;;;;; 0A1E;GURMUKHI LETTER NYA;Lo;0;L;;;;;N;;;;; 0A1F;GURMUKHI LETTER TTA;Lo;0;L;;;;;N;;;;; 0A20;GURMUKHI LETTER TTHA;Lo;0;L;;;;;N;;;;; 0A21;GURMUKHI LETTER DDA;Lo;0;L;;;;;N;;;;; 0A22;GURMUKHI LETTER DDHA;Lo;0;L;;;;;N;;;;; 0A23;GURMUKHI LETTER NNA;Lo;0;L;;;;;N;;;;; 0A24;GURMUKHI LETTER TA;Lo;0;L;;;;;N;;;;; 0A25;GURMUKHI LETTER THA;Lo;0;L;;;;;N;;;;; 0A26;GURMUKHI LETTER DA;Lo;0;L;;;;;N;;;;; 0A27;GURMUKHI LETTER DHA;Lo;0;L;;;;;N;;;;; 0A28;GURMUKHI LETTER NA;Lo;0;L;;;;;N;;;;; 0A2A;GURMUKHI LETTER PA;Lo;0;L;;;;;N;;;;; 0A2B;GURMUKHI LETTER PHA;Lo;0;L;;;;;N;;;;; 0A2C;GURMUKHI LETTER BA;Lo;0;L;;;;;N;;;;; 0A2D;GURMUKHI LETTER BHA;Lo;0;L;;;;;N;;;;; 0A2E;GURMUKHI LETTER MA;Lo;0;L;;;;;N;;;;; 0A2F;GURMUKHI LETTER YA;Lo;0;L;;;;;N;;;;; 0A30;GURMUKHI LETTER RA;Lo;0;L;;;;;N;;;;; 0A32;GURMUKHI LETTER LA;Lo;0;L;;;;;N;;;;; 0A33;GURMUKHI LETTER LLA;Lo;0;L;0A32 0A3C;;;;N;;;;; 0A35;GURMUKHI LETTER VA;Lo;0;L;;;;;N;;;;; 0A36;GURMUKHI LETTER SHA;Lo;0;L;0A38 0A3C;;;;N;;;;; 0A38;GURMUKHI LETTER SA;Lo;0;L;;;;;N;;;;; 0A39;GURMUKHI LETTER HA;Lo;0;L;;;;;N;;;;; 0A3C;GURMUKHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; 0A3E;GURMUKHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 0A3F;GURMUKHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; 0A40;GURMUKHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; 0A41;GURMUKHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 0A42;GURMUKHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 0A47;GURMUKHI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; 0A48;GURMUKHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; 0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; 0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; 0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; 0A51;GURMUKHI SIGN UDAAT;Mn;0;NSM;;;;;N;;;;; 0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;; 0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;; 0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;; 0A5C;GURMUKHI LETTER RRA;Lo;0;L;;;;;N;;;;; 0A5E;GURMUKHI LETTER FA;Lo;0;L;0A2B 0A3C;;;;N;;;;; 0A66;GURMUKHI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 0A67;GURMUKHI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 0A68;GURMUKHI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 0A69;GURMUKHI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 0A6A;GURMUKHI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 0A6B;GURMUKHI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 0A6C;GURMUKHI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 0A6D;GURMUKHI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 0A6E;GURMUKHI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 0A6F;GURMUKHI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 0A70;GURMUKHI TIPPI;Mn;0;NSM;;;;;N;;;;; 0A71;GURMUKHI ADDAK;Mn;0;NSM;;;;;N;;;;; 0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;; 0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;; 0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;; 0A75;GURMUKHI SIGN YAKASH;Mn;0;NSM;;;;;N;;;;; 0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;; 0A85;GUJARATI LETTER A;Lo;0;L;;;;;N;;;;; 0A86;GUJARATI LETTER AA;Lo;0;L;;;;;N;;;;; 0A87;GUJARATI LETTER I;Lo;0;L;;;;;N;;;;; 0A88;GUJARATI LETTER II;Lo;0;L;;;;;N;;;;; 0A89;GUJARATI LETTER U;Lo;0;L;;;;;N;;;;; 0A8A;GUJARATI LETTER UU;Lo;0;L;;;;;N;;;;; 0A8B;GUJARATI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; 0A8C;GUJARATI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; 0A8D;GUJARATI VOWEL CANDRA E;Lo;0;L;;;;;N;;;;; 0A8F;GUJARATI LETTER E;Lo;0;L;;;;;N;;;;; 0A90;GUJARATI LETTER AI;Lo;0;L;;;;;N;;;;; 0A91;GUJARATI VOWEL CANDRA O;Lo;0;L;;;;;N;;;;; 0A93;GUJARATI LETTER O;Lo;0;L;;;;;N;;;;; 0A94;GUJARATI LETTER AU;Lo;0;L;;;;;N;;;;; 0A95;GUJARATI LETTER KA;Lo;0;L;;;;;N;;;;; 0A96;GUJARATI LETTER KHA;Lo;0;L;;;;;N;;;;; 0A97;GUJARATI LETTER GA;Lo;0;L;;;;;N;;;;; 0A98;GUJARATI LETTER GHA;Lo;0;L;;;;;N;;;;; 0A99;GUJARATI LETTER NGA;Lo;0;L;;;;;N;;;;; 0A9A;GUJARATI LETTER CA;Lo;0;L;;;;;N;;;;; 0A9B;GUJARATI LETTER CHA;Lo;0;L;;;;;N;;;;; 0A9C;GUJARATI LETTER JA;Lo;0;L;;;;;N;;;;; 0A9D;GUJARATI LETTER JHA;Lo;0;L;;;;;N;;;;; 0A9E;GUJARATI LETTER NYA;Lo;0;L;;;;;N;;;;; 0A9F;GUJARATI LETTER TTA;Lo;0;L;;;;;N;;;;; 0AA0;GUJARATI LETTER TTHA;Lo;0;L;;;;;N;;;;; 0AA1;GUJARATI LETTER DDA;Lo;0;L;;;;;N;;;;; 0AA2;GUJARATI LETTER DDHA;Lo;0;L;;;;;N;;;;; 0AA3;GUJARATI LETTER NNA;Lo;0;L;;;;;N;;;;; 0AA4;GUJARATI LETTER TA;Lo;0;L;;;;;N;;;;; 0AA5;GUJARATI LETTER THA;Lo;0;L;;;;;N;;;;; 0AA6;GUJARATI LETTER DA;Lo;0;L;;;;;N;;;;; 0AA7;GUJARATI LETTER DHA;Lo;0;L;;;;;N;;;;; 0AA8;GUJARATI LETTER NA;Lo;0;L;;;;;N;;;;; 0AAA;GUJARATI LETTER PA;Lo;0;L;;;;;N;;;;; 0AAB;GUJARATI LETTER PHA;Lo;0;L;;;;;N;;;;; 0AAC;GUJARATI LETTER BA;Lo;0;L;;;;;N;;;;; 0AAD;GUJARATI LETTER BHA;Lo;0;L;;;;;N;;;;; 0AAE;GUJARATI LETTER MA;Lo;0;L;;;;;N;;;;; 0AAF;GUJARATI LETTER YA;Lo;0;L;;;;;N;;;;; 0AB0;GUJARATI LETTER RA;Lo;0;L;;;;;N;;;;; 0AB2;GUJARATI LETTER LA;Lo;0;L;;;;;N;;;;; 0AB3;GUJARATI LETTER LLA;Lo;0;L;;;;;N;;;;; 0AB5;GUJARATI LETTER VA;Lo;0;L;;;;;N;;;;; 0AB6;GUJARATI LETTER SHA;Lo;0;L;;;;;N;;;;; 0AB7;GUJARATI LETTER SSA;Lo;0;L;;;;;N;;;;; 0AB8;GUJARATI LETTER SA;Lo;0;L;;;;;N;;;;; 0AB9;GUJARATI LETTER HA;Lo;0;L;;;;;N;;;;; 0ABC;GUJARATI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; 0ABD;GUJARATI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; 0ABE;GUJARATI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 0ABF;GUJARATI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; 0AC0;GUJARATI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; 0AC1;GUJARATI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 0AC2;GUJARATI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 0AC3;GUJARATI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; 0AC4;GUJARATI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; 0AC5;GUJARATI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; 0AC7;GUJARATI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; 0AC8;GUJARATI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; 0AC9;GUJARATI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; 0ACB;GUJARATI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; 0ACC;GUJARATI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; 0ACD;GUJARATI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; 0AD0;GUJARATI OM;Lo;0;L;;;;;N;;;;; 0AE0;GUJARATI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 0AE1;GUJARATI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; 0AE2;GUJARATI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; 0AE3;GUJARATI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; 0AE6;GUJARATI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 0AE7;GUJARATI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 0AE8;GUJARATI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 0AE9;GUJARATI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 0AEA;GUJARATI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 0AEB;GUJARATI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 0AEC;GUJARATI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 0AED;GUJARATI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 0AEE;GUJARATI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 0AF0;GUJARATI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; 0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; 0AF9;GUJARATI LETTER ZHA;Lo;0;L;;;;;N;;;;; 0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; 0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;; 0B05;ORIYA LETTER A;Lo;0;L;;;;;N;;;;; 0B06;ORIYA LETTER AA;Lo;0;L;;;;;N;;;;; 0B07;ORIYA LETTER I;Lo;0;L;;;;;N;;;;; 0B08;ORIYA LETTER II;Lo;0;L;;;;;N;;;;; 0B09;ORIYA LETTER U;Lo;0;L;;;;;N;;;;; 0B0A;ORIYA LETTER UU;Lo;0;L;;;;;N;;;;; 0B0B;ORIYA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; 0B0C;ORIYA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; 0B0F;ORIYA LETTER E;Lo;0;L;;;;;N;;;;; 0B10;ORIYA LETTER AI;Lo;0;L;;;;;N;;;;; 0B13;ORIYA LETTER O;Lo;0;L;;;;;N;;;;; 0B14;ORIYA LETTER AU;Lo;0;L;;;;;N;;;;; 0B15;ORIYA LETTER KA;Lo;0;L;;;;;N;;;;; 0B16;ORIYA LETTER KHA;Lo;0;L;;;;;N;;;;; 0B17;ORIYA LETTER GA;Lo;0;L;;;;;N;;;;; 0B18;ORIYA LETTER GHA;Lo;0;L;;;;;N;;;;; 0B19;ORIYA LETTER NGA;Lo;0;L;;;;;N;;;;; 0B1A;ORIYA LETTER CA;Lo;0;L;;;;;N;;;;; 0B1B;ORIYA LETTER CHA;Lo;0;L;;;;;N;;;;; 0B1C;ORIYA LETTER JA;Lo;0;L;;;;;N;;;;; 0B1D;ORIYA LETTER JHA;Lo;0;L;;;;;N;;;;; 0B1E;ORIYA LETTER NYA;Lo;0;L;;;;;N;;;;; 0B1F;ORIYA LETTER TTA;Lo;0;L;;;;;N;;;;; 0B20;ORIYA LETTER TTHA;Lo;0;L;;;;;N;;;;; 0B21;ORIYA LETTER DDA;Lo;0;L;;;;;N;;;;; 0B22;ORIYA LETTER DDHA;Lo;0;L;;;;;N;;;;; 0B23;ORIYA LETTER NNA;Lo;0;L;;;;;N;;;;; 0B24;ORIYA LETTER TA;Lo;0;L;;;;;N;;;;; 0B25;ORIYA LETTER THA;Lo;0;L;;;;;N;;;;; 0B26;ORIYA LETTER DA;Lo;0;L;;;;;N;;;;; 0B27;ORIYA LETTER DHA;Lo;0;L;;;;;N;;;;; 0B28;ORIYA LETTER NA;Lo;0;L;;;;;N;;;;; 0B2A;ORIYA LETTER PA;Lo;0;L;;;;;N;;;;; 0B2B;ORIYA LETTER PHA;Lo;0;L;;;;;N;;;;; 0B2C;ORIYA LETTER BA;Lo;0;L;;;;;N;;;;; 0B2D;ORIYA LETTER BHA;Lo;0;L;;;;;N;;;;; 0B2E;ORIYA LETTER MA;Lo;0;L;;;;;N;;;;; 0B2F;ORIYA LETTER YA;Lo;0;L;;;;;N;;;;; 0B30;ORIYA LETTER RA;Lo;0;L;;;;;N;;;;; 0B32;ORIYA LETTER LA;Lo;0;L;;;;;N;;;;; 0B33;ORIYA LETTER LLA;Lo;0;L;;;;;N;;;;; 0B35;ORIYA LETTER VA;Lo;0;L;;;;;N;;;;; 0B36;ORIYA LETTER SHA;Lo;0;L;;;;;N;;;;; 0B37;ORIYA LETTER SSA;Lo;0;L;;;;;N;;;;; 0B38;ORIYA LETTER SA;Lo;0;L;;;;;N;;;;; 0B39;ORIYA LETTER HA;Lo;0;L;;;;;N;;;;; 0B3C;ORIYA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; 0B3D;ORIYA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; 0B3E;ORIYA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 0B3F;ORIYA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; 0B40;ORIYA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; 0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; 0B44;ORIYA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; 0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; 0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;; 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;;;;; 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;;;;; 0B5D;ORIYA LETTER RHA;Lo;0;L;0B22 0B3C;;;;N;;;;; 0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;; 0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; 0B62;ORIYA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; 0B63;ORIYA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; 0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 0B69;ORIYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 0B6A;ORIYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 0B6B;ORIYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 0B6C;ORIYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 0B6D;ORIYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 0B6E;ORIYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 0B6F;ORIYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 0B70;ORIYA ISSHAR;So;0;L;;;;;N;;;;; 0B71;ORIYA LETTER WA;Lo;0;L;;;;;N;;;;; 0B72;ORIYA FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; 0B73;ORIYA FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; 0B74;ORIYA FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; 0B75;ORIYA FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; 0B76;ORIYA FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; 0B77;ORIYA FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; 0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 0B83;TAMIL SIGN VISARGA;Lo;0;L;;;;;N;;;;; 0B85;TAMIL LETTER A;Lo;0;L;;;;;N;;;;; 0B86;TAMIL LETTER AA;Lo;0;L;;;;;N;;;;; 0B87;TAMIL LETTER I;Lo;0;L;;;;;N;;;;; 0B88;TAMIL LETTER II;Lo;0;L;;;;;N;;;;; 0B89;TAMIL LETTER U;Lo;0;L;;;;;N;;;;; 0B8A;TAMIL LETTER UU;Lo;0;L;;;;;N;;;;; 0B8E;TAMIL LETTER E;Lo;0;L;;;;;N;;;;; 0B8F;TAMIL LETTER EE;Lo;0;L;;;;;N;;;;; 0B90;TAMIL LETTER AI;Lo;0;L;;;;;N;;;;; 0B92;TAMIL LETTER O;Lo;0;L;;;;;N;;;;; 0B93;TAMIL LETTER OO;Lo;0;L;;;;;N;;;;; 0B94;TAMIL LETTER AU;Lo;0;L;0B92 0BD7;;;;N;;;;; 0B95;TAMIL LETTER KA;Lo;0;L;;;;;N;;;;; 0B99;TAMIL LETTER NGA;Lo;0;L;;;;;N;;;;; 0B9A;TAMIL LETTER CA;Lo;0;L;;;;;N;;;;; 0B9C;TAMIL LETTER JA;Lo;0;L;;;;;N;;;;; 0B9E;TAMIL LETTER NYA;Lo;0;L;;;;;N;;;;; 0B9F;TAMIL LETTER TTA;Lo;0;L;;;;;N;;;;; 0BA3;TAMIL LETTER NNA;Lo;0;L;;;;;N;;;;; 0BA4;TAMIL LETTER TA;Lo;0;L;;;;;N;;;;; 0BA8;TAMIL LETTER NA;Lo;0;L;;;;;N;;;;; 0BA9;TAMIL LETTER NNNA;Lo;0;L;;;;;N;;;;; 0BAA;TAMIL LETTER PA;Lo;0;L;;;;;N;;;;; 0BAE;TAMIL LETTER MA;Lo;0;L;;;;;N;;;;; 0BAF;TAMIL LETTER YA;Lo;0;L;;;;;N;;;;; 0BB0;TAMIL LETTER RA;Lo;0;L;;;;;N;;;;; 0BB1;TAMIL LETTER RRA;Lo;0;L;;;;;N;;;;; 0BB2;TAMIL LETTER LA;Lo;0;L;;;;;N;;;;; 0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;; 0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;; 0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;; 0BB6;TAMIL LETTER SHA;Lo;0;L;;;;;N;;;;; 0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;; 0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;; 0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;; 0BBE;TAMIL VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 0BBF;TAMIL VOWEL SIGN I;Mc;0;L;;;;;N;;;;; 0BC0;TAMIL VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; 0BC1;TAMIL VOWEL SIGN U;Mc;0;L;;;;;N;;;;; 0BC2;TAMIL VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; 0BC6;TAMIL VOWEL SIGN E;Mc;0;L;;;;;N;;;;; 0BC7;TAMIL VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; 0BC8;TAMIL VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; 0BCA;TAMIL VOWEL SIGN O;Mc;0;L;0BC6 0BBE;;;;N;;;;; 0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;; 0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;; 0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; 0BD0;TAMIL OM;Lo;0;L;;;;;N;;;;; 0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;; 0BE6;TAMIL DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 0BEA;TAMIL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 0BEB;TAMIL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 0BEC;TAMIL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 0BED;TAMIL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 0BEE;TAMIL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 0BEF;TAMIL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 0BF0;TAMIL NUMBER TEN;No;0;L;;;;10;N;;;;; 0BF1;TAMIL NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; 0BF2;TAMIL NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; 0BF3;TAMIL DAY SIGN;So;0;ON;;;;;N;;;;; 0BF4;TAMIL MONTH SIGN;So;0;ON;;;;;N;;;;; 0BF5;TAMIL YEAR SIGN;So;0;ON;;;;;N;;;;; 0BF6;TAMIL DEBIT SIGN;So;0;ON;;;;;N;;;;; 0BF7;TAMIL CREDIT SIGN;So;0;ON;;;;;N;;;;; 0BF8;TAMIL AS ABOVE SIGN;So;0;ON;;;;;N;;;;; 0BF9;TAMIL RUPEE SIGN;Sc;0;ET;;;;;N;;;;; 0BFA;TAMIL NUMBER SIGN;So;0;ON;;;;;N;;;;; 0C00;TELUGU SIGN COMBINING CANDRABINDU ABOVE;Mn;0;NSM;;;;;N;;;;; 0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; 0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; 0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;; 0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;; 0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;; 0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;; 0C08;TELUGU LETTER II;Lo;0;L;;;;;N;;;;; 0C09;TELUGU LETTER U;Lo;0;L;;;;;N;;;;; 0C0A;TELUGU LETTER UU;Lo;0;L;;;;;N;;;;; 0C0B;TELUGU LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; 0C0C;TELUGU LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; 0C0E;TELUGU LETTER E;Lo;0;L;;;;;N;;;;; 0C0F;TELUGU LETTER EE;Lo;0;L;;;;;N;;;;; 0C10;TELUGU LETTER AI;Lo;0;L;;;;;N;;;;; 0C12;TELUGU LETTER O;Lo;0;L;;;;;N;;;;; 0C13;TELUGU LETTER OO;Lo;0;L;;;;;N;;;;; 0C14;TELUGU LETTER AU;Lo;0;L;;;;;N;;;;; 0C15;TELUGU LETTER KA;Lo;0;L;;;;;N;;;;; 0C16;TELUGU LETTER KHA;Lo;0;L;;;;;N;;;;; 0C17;TELUGU LETTER GA;Lo;0;L;;;;;N;;;;; 0C18;TELUGU LETTER GHA;Lo;0;L;;;;;N;;;;; 0C19;TELUGU LETTER NGA;Lo;0;L;;;;;N;;;;; 0C1A;TELUGU LETTER CA;Lo;0;L;;;;;N;;;;; 0C1B;TELUGU LETTER CHA;Lo;0;L;;;;;N;;;;; 0C1C;TELUGU LETTER JA;Lo;0;L;;;;;N;;;;; 0C1D;TELUGU LETTER JHA;Lo;0;L;;;;;N;;;;; 0C1E;TELUGU LETTER NYA;Lo;0;L;;;;;N;;;;; 0C1F;TELUGU LETTER TTA;Lo;0;L;;;;;N;;;;; 0C20;TELUGU LETTER TTHA;Lo;0;L;;;;;N;;;;; 0C21;TELUGU LETTER DDA;Lo;0;L;;;;;N;;;;; 0C22;TELUGU LETTER DDHA;Lo;0;L;;;;;N;;;;; 0C23;TELUGU LETTER NNA;Lo;0;L;;;;;N;;;;; 0C24;TELUGU LETTER TA;Lo;0;L;;;;;N;;;;; 0C25;TELUGU LETTER THA;Lo;0;L;;;;;N;;;;; 0C26;TELUGU LETTER DA;Lo;0;L;;;;;N;;;;; 0C27;TELUGU LETTER DHA;Lo;0;L;;;;;N;;;;; 0C28;TELUGU LETTER NA;Lo;0;L;;;;;N;;;;; 0C2A;TELUGU LETTER PA;Lo;0;L;;;;;N;;;;; 0C2B;TELUGU LETTER PHA;Lo;0;L;;;;;N;;;;; 0C2C;TELUGU LETTER BA;Lo;0;L;;;;;N;;;;; 0C2D;TELUGU LETTER BHA;Lo;0;L;;;;;N;;;;; 0C2E;TELUGU LETTER MA;Lo;0;L;;;;;N;;;;; 0C2F;TELUGU LETTER YA;Lo;0;L;;;;;N;;;;; 0C30;TELUGU LETTER RA;Lo;0;L;;;;;N;;;;; 0C31;TELUGU LETTER RRA;Lo;0;L;;;;;N;;;;; 0C32;TELUGU LETTER LA;Lo;0;L;;;;;N;;;;; 0C33;TELUGU LETTER LLA;Lo;0;L;;;;;N;;;;; 0C34;TELUGU LETTER LLLA;Lo;0;L;;;;;N;;;;; 0C35;TELUGU LETTER VA;Lo;0;L;;;;;N;;;;; 0C36;TELUGU LETTER SHA;Lo;0;L;;;;;N;;;;; 0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;; 0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;; 0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;; 0C3D;TELUGU SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; 0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; 0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; 0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; 0C41;TELUGU VOWEL SIGN U;Mc;0;L;;;;;N;;;;; 0C42;TELUGU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; 0C43;TELUGU VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; 0C44;TELUGU VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; 0C46;TELUGU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; 0C47;TELUGU VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; 0C48;TELUGU VOWEL SIGN AI;Mn;0;NSM;0C46 0C56;;;;N;;;;; 0C4A;TELUGU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; 0C4B;TELUGU VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; 0C4C;TELUGU VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; 0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; 0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;; 0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;; 0C58;TELUGU LETTER TSA;Lo;0;L;;;;;N;;;;; 0C59;TELUGU LETTER DZA;Lo;0;L;;;;;N;;;;; 0C5A;TELUGU LETTER RRRA;Lo;0;L;;;;;N;;;;; 0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; 0C62;TELUGU VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; 0C63;TELUGU VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; 0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 0C69;TELUGU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 0C6A;TELUGU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 0C6B;TELUGU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 0C6C;TELUGU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 0C78;TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR;No;0;ON;;;;0;N;;;;; 0C79;TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR;No;0;ON;;;;1;N;;;;; 0C7A;TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR;No;0;ON;;;;2;N;;;;; 0C7B;TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR;No;0;ON;;;;3;N;;;;; 0C7C;TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR;No;0;ON;;;;1;N;;;;; 0C7D;TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR;No;0;ON;;;;2;N;;;;; 0C7E;TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR;No;0;ON;;;;3;N;;;;; 0C7F;TELUGU SIGN TUUMU;So;0;L;;;;;N;;;;; 0C80;KANNADA SIGN SPACING CANDRABINDU;Lo;0;L;;;;;N;;;;; 0C81;KANNADA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; 0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; 0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;; 0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;; 0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;; 0C88;KANNADA LETTER II;Lo;0;L;;;;;N;;;;; 0C89;KANNADA LETTER U;Lo;0;L;;;;;N;;;;; 0C8A;KANNADA LETTER UU;Lo;0;L;;;;;N;;;;; 0C8B;KANNADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; 0C8C;KANNADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; 0C8E;KANNADA LETTER E;Lo;0;L;;;;;N;;;;; 0C8F;KANNADA LETTER EE;Lo;0;L;;;;;N;;;;; 0C90;KANNADA LETTER AI;Lo;0;L;;;;;N;;;;; 0C92;KANNADA LETTER O;Lo;0;L;;;;;N;;;;; 0C93;KANNADA LETTER OO;Lo;0;L;;;;;N;;;;; 0C94;KANNADA LETTER AU;Lo;0;L;;;;;N;;;;; 0C95;KANNADA LETTER KA;Lo;0;L;;;;;N;;;;; 0C96;KANNADA LETTER KHA;Lo;0;L;;;;;N;;;;; 0C97;KANNADA LETTER GA;Lo;0;L;;;;;N;;;;; 0C98;KANNADA LETTER GHA;Lo;0;L;;;;;N;;;;; 0C99;KANNADA LETTER NGA;Lo;0;L;;;;;N;;;;; 0C9A;KANNADA LETTER CA;Lo;0;L;;;;;N;;;;; 0C9B;KANNADA LETTER CHA;Lo;0;L;;;;;N;;;;; 0C9C;KANNADA LETTER JA;Lo;0;L;;;;;N;;;;; 0C9D;KANNADA LETTER JHA;Lo;0;L;;;;;N;;;;; 0C9E;KANNADA LETTER NYA;Lo;0;L;;;;;N;;;;; 0C9F;KANNADA LETTER TTA;Lo;0;L;;;;;N;;;;; 0CA0;KANNADA LETTER TTHA;Lo;0;L;;;;;N;;;;; 0CA1;KANNADA LETTER DDA;Lo;0;L;;;;;N;;;;; 0CA2;KANNADA LETTER DDHA;Lo;0;L;;;;;N;;;;; 0CA3;KANNADA LETTER NNA;Lo;0;L;;;;;N;;;;; 0CA4;KANNADA LETTER TA;Lo;0;L;;;;;N;;;;; 0CA5;KANNADA LETTER THA;Lo;0;L;;;;;N;;;;; 0CA6;KANNADA LETTER DA;Lo;0;L;;;;;N;;;;; 0CA7;KANNADA LETTER DHA;Lo;0;L;;;;;N;;;;; 0CA8;KANNADA LETTER NA;Lo;0;L;;;;;N;;;;; 0CAA;KANNADA LETTER PA;Lo;0;L;;;;;N;;;;; 0CAB;KANNADA LETTER PHA;Lo;0;L;;;;;N;;;;; 0CAC;KANNADA LETTER BA;Lo;0;L;;;;;N;;;;; 0CAD;KANNADA LETTER BHA;Lo;0;L;;;;;N;;;;; 0CAE;KANNADA LETTER MA;Lo;0;L;;;;;N;;;;; 0CAF;KANNADA LETTER YA;Lo;0;L;;;;;N;;;;; 0CB0;KANNADA LETTER RA;Lo;0;L;;;;;N;;;;; 0CB1;KANNADA LETTER RRA;Lo;0;L;;;;;N;;;;; 0CB2;KANNADA LETTER LA;Lo;0;L;;;;;N;;;;; 0CB3;KANNADA LETTER LLA;Lo;0;L;;;;;N;;;;; 0CB5;KANNADA LETTER VA;Lo;0;L;;;;;N;;;;; 0CB6;KANNADA LETTER SHA;Lo;0;L;;;;;N;;;;; 0CB7;KANNADA LETTER SSA;Lo;0;L;;;;;N;;;;; 0CB8;KANNADA LETTER SA;Lo;0;L;;;;;N;;;;; 0CB9;KANNADA LETTER HA;Lo;0;L;;;;;N;;;;; 0CBC;KANNADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; 0CBD;KANNADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; 0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 0CBF;KANNADA VOWEL SIGN I;Mn;0;L;;;;;N;;;;; 0CC0;KANNADA VOWEL SIGN II;Mc;0;L;0CBF 0CD5;;;;N;;;;; 0CC1;KANNADA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; 0CC2;KANNADA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; 0CC3;KANNADA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; 0CC4;KANNADA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; 0CC6;KANNADA VOWEL SIGN E;Mn;0;L;;;;;N;;;;; 0CC7;KANNADA VOWEL SIGN EE;Mc;0;L;0CC6 0CD5;;;;N;;;;; 0CC8;KANNADA VOWEL SIGN AI;Mc;0;L;0CC6 0CD6;;;;N;;;;; 0CCA;KANNADA VOWEL SIGN O;Mc;0;L;0CC6 0CC2;;;;N;;;;; 0CCB;KANNADA VOWEL SIGN OO;Mc;0;L;0CCA 0CD5;;;;N;;;;; 0CCC;KANNADA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; 0CCD;KANNADA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; 0CD5;KANNADA LENGTH MARK;Mc;0;L;;;;;N;;;;; 0CD6;KANNADA AI LENGTH MARK;Mc;0;L;;;;;N;;;;; 0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;; 0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; 0CE2;KANNADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; 0CE3;KANNADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; 0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 0CE9;KANNADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 0CEA;KANNADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 0CEB;KANNADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 0CEC;KANNADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 0CF1;KANNADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; 0CF2;KANNADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; 0D01;MALAYALAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; 0D03;MALAYALAM SIGN VISARGA;Mc;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;;;;; 0D08;MALAYALAM LETTER II;Lo;0;L;;;;;N;;;;; 0D09;MALAYALAM LETTER U;Lo;0;L;;;;;N;;;;; 0D0A;MALAYALAM LETTER UU;Lo;0;L;;;;;N;;;;; 0D0B;MALAYALAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; 0D0C;MALAYALAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; 0D0E;MALAYALAM LETTER E;Lo;0;L;;;;;N;;;;; 0D0F;MALAYALAM LETTER EE;Lo;0;L;;;;;N;;;;; 0D10;MALAYALAM LETTER AI;Lo;0;L;;;;;N;;;;; 0D12;MALAYALAM LETTER O;Lo;0;L;;;;;N;;;;; 0D13;MALAYALAM LETTER OO;Lo;0;L;;;;;N;;;;; 0D14;MALAYALAM LETTER AU;Lo;0;L;;;;;N;;;;; 0D15;MALAYALAM LETTER KA;Lo;0;L;;;;;N;;;;; 0D16;MALAYALAM LETTER KHA;Lo;0;L;;;;;N;;;;; 0D17;MALAYALAM LETTER GA;Lo;0;L;;;;;N;;;;; 0D18;MALAYALAM LETTER GHA;Lo;0;L;;;;;N;;;;; 0D19;MALAYALAM LETTER NGA;Lo;0;L;;;;;N;;;;; 0D1A;MALAYALAM LETTER CA;Lo;0;L;;;;;N;;;;; 0D1B;MALAYALAM LETTER CHA;Lo;0;L;;;;;N;;;;; 0D1C;MALAYALAM LETTER JA;Lo;0;L;;;;;N;;;;; 0D1D;MALAYALAM LETTER JHA;Lo;0;L;;;;;N;;;;; 0D1E;MALAYALAM LETTER NYA;Lo;0;L;;;;;N;;;;; 0D1F;MALAYALAM LETTER TTA;Lo;0;L;;;;;N;;;;; 0D20;MALAYALAM LETTER TTHA;Lo;0;L;;;;;N;;;;; 0D21;MALAYALAM LETTER DDA;Lo;0;L;;;;;N;;;;; 0D22;MALAYALAM LETTER DDHA;Lo;0;L;;;;;N;;;;; 0D23;MALAYALAM LETTER NNA;Lo;0;L;;;;;N;;;;; 0D24;MALAYALAM LETTER TA;Lo;0;L;;;;;N;;;;; 0D25;MALAYALAM LETTER THA;Lo;0;L;;;;;N;;;;; 0D26;MALAYALAM LETTER DA;Lo;0;L;;;;;N;;;;; 0D27;MALAYALAM LETTER DHA;Lo;0;L;;;;;N;;;;; 0D28;MALAYALAM LETTER NA;Lo;0;L;;;;;N;;;;; 0D29;MALAYALAM LETTER NNNA;Lo;0;L;;;;;N;;;;; 0D2A;MALAYALAM LETTER PA;Lo;0;L;;;;;N;;;;; 0D2B;MALAYALAM LETTER PHA;Lo;0;L;;;;;N;;;;; 0D2C;MALAYALAM LETTER BA;Lo;0;L;;;;;N;;;;; 0D2D;MALAYALAM LETTER BHA;Lo;0;L;;;;;N;;;;; 0D2E;MALAYALAM LETTER MA;Lo;0;L;;;;;N;;;;; 0D2F;MALAYALAM LETTER YA;Lo;0;L;;;;;N;;;;; 0D30;MALAYALAM LETTER RA;Lo;0;L;;;;;N;;;;; 0D31;MALAYALAM LETTER RRA;Lo;0;L;;;;;N;;;;; 0D32;MALAYALAM LETTER LA;Lo;0;L;;;;;N;;;;; 0D33;MALAYALAM LETTER LLA;Lo;0;L;;;;;N;;;;; 0D34;MALAYALAM LETTER LLLA;Lo;0;L;;;;;N;;;;; 0D35;MALAYALAM LETTER VA;Lo;0;L;;;;;N;;;;; 0D36;MALAYALAM LETTER SHA;Lo;0;L;;;;;N;;;;; 0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;; 0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;; 0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;; 0D3A;MALAYALAM LETTER TTTA;Lo;0;L;;;;;N;;;;; 0D3D;MALAYALAM SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; 0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; 0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; 0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; 0D44;MALAYALAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; 0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; 0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; 0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; 0D4A;MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;; 0D4B;MALAYALAM VOWEL SIGN OO;Mc;0;L;0D47 0D3E;;;;N;;;;; 0D4C;MALAYALAM VOWEL SIGN AU;Mc;0;L;0D46 0D57;;;;N;;;;; 0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; 0D4E;MALAYALAM LETTER DOT REPH;Lo;0;L;;;;;N;;;;; 0D4F;MALAYALAM SIGN PARA;So;0;L;;;;;N;;;;; 0D54;MALAYALAM LETTER CHILLU M;Lo;0;L;;;;;N;;;;; 0D55;MALAYALAM LETTER CHILLU Y;Lo;0;L;;;;;N;;;;; 0D56;MALAYALAM LETTER CHILLU LLL;Lo;0;L;;;;;N;;;;; 0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;; 0D58;MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH;No;0;L;;;;1/160;N;;;;; 0D59;MALAYALAM FRACTION ONE FORTIETH;No;0;L;;;;1/40;N;;;;; 0D5A;MALAYALAM FRACTION THREE EIGHTIETHS;No;0;L;;;;3/80;N;;;;; 0D5B;MALAYALAM FRACTION ONE TWENTIETH;No;0;L;;;;1/20;N;;;;; 0D5C;MALAYALAM FRACTION ONE TENTH;No;0;L;;;;1/10;N;;;;; 0D5D;MALAYALAM FRACTION THREE TWENTIETHS;No;0;L;;;;3/20;N;;;;; 0D5E;MALAYALAM FRACTION ONE FIFTH;No;0;L;;;;1/5;N;;;;; 0D5F;MALAYALAM LETTER ARCHAIC II;Lo;0;L;;;;;N;;;;; 0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; 0D62;MALAYALAM VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; 0D63;MALAYALAM VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; 0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 0D69;MALAYALAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 0D6A;MALAYALAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 0D6B;MALAYALAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 0D6C;MALAYALAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 0D70;MALAYALAM NUMBER TEN;No;0;L;;;;10;N;;;;; 0D71;MALAYALAM NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; 0D72;MALAYALAM NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; 0D73;MALAYALAM FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; 0D74;MALAYALAM FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; 0D75;MALAYALAM FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; 0D76;MALAYALAM FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; 0D77;MALAYALAM FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; 0D78;MALAYALAM FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; 0D79;MALAYALAM DATE MARK;So;0;L;;;;;N;;;;; 0D7A;MALAYALAM LETTER CHILLU NN;Lo;0;L;;;;;N;;;;; 0D7B;MALAYALAM LETTER CHILLU N;Lo;0;L;;;;;N;;;;; 0D7C;MALAYALAM LETTER CHILLU RR;Lo;0;L;;;;;N;;;;; 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;;;;; 0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;; 0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;; 0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;; 0D86;SINHALA LETTER AAYANNA;Lo;0;L;;;;;N;;;;; 0D87;SINHALA LETTER AEYANNA;Lo;0;L;;;;;N;;;;; 0D88;SINHALA LETTER AEEYANNA;Lo;0;L;;;;;N;;;;; 0D89;SINHALA LETTER IYANNA;Lo;0;L;;;;;N;;;;; 0D8A;SINHALA LETTER IIYANNA;Lo;0;L;;;;;N;;;;; 0D8B;SINHALA LETTER UYANNA;Lo;0;L;;;;;N;;;;; 0D8C;SINHALA LETTER UUYANNA;Lo;0;L;;;;;N;;;;; 0D8D;SINHALA LETTER IRUYANNA;Lo;0;L;;;;;N;;;;; 0D8E;SINHALA LETTER IRUUYANNA;Lo;0;L;;;;;N;;;;; 0D8F;SINHALA LETTER ILUYANNA;Lo;0;L;;;;;N;;;;; 0D90;SINHALA LETTER ILUUYANNA;Lo;0;L;;;;;N;;;;; 0D91;SINHALA LETTER EYANNA;Lo;0;L;;;;;N;;;;; 0D92;SINHALA LETTER EEYANNA;Lo;0;L;;;;;N;;;;; 0D93;SINHALA LETTER AIYANNA;Lo;0;L;;;;;N;;;;; 0D94;SINHALA LETTER OYANNA;Lo;0;L;;;;;N;;;;; 0D95;SINHALA LETTER OOYANNA;Lo;0;L;;;;;N;;;;; 0D96;SINHALA LETTER AUYANNA;Lo;0;L;;;;;N;;;;; 0D9A;SINHALA LETTER ALPAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; 0D9B;SINHALA LETTER MAHAAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; 0D9C;SINHALA LETTER ALPAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; 0D9D;SINHALA LETTER MAHAAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; 0D9E;SINHALA LETTER KANTAJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; 0D9F;SINHALA LETTER SANYAKA GAYANNA;Lo;0;L;;;;;N;;;;; 0DA0;SINHALA LETTER ALPAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; 0DA1;SINHALA LETTER MAHAAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; 0DA2;SINHALA LETTER ALPAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; 0DA3;SINHALA LETTER MAHAAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; 0DA4;SINHALA LETTER TAALUJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; 0DA5;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA;Lo;0;L;;;;;N;;;;; 0DA6;SINHALA LETTER SANYAKA JAYANNA;Lo;0;L;;;;;N;;;;; 0DA7;SINHALA LETTER ALPAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; 0DA8;SINHALA LETTER MAHAAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; 0DA9;SINHALA LETTER ALPAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; 0DAA;SINHALA LETTER MAHAAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; 0DAB;SINHALA LETTER MUURDHAJA NAYANNA;Lo;0;L;;;;;N;;;;; 0DAC;SINHALA LETTER SANYAKA DDAYANNA;Lo;0;L;;;;;N;;;;; 0DAD;SINHALA LETTER ALPAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; 0DAE;SINHALA LETTER MAHAAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; 0DAF;SINHALA LETTER ALPAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; 0DB0;SINHALA LETTER MAHAAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; 0DB1;SINHALA LETTER DANTAJA NAYANNA;Lo;0;L;;;;;N;;;;; 0DB3;SINHALA LETTER SANYAKA DAYANNA;Lo;0;L;;;;;N;;;;; 0DB4;SINHALA LETTER ALPAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; 0DB5;SINHALA LETTER MAHAAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; 0DB6;SINHALA LETTER ALPAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; 0DB7;SINHALA LETTER MAHAAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; 0DB8;SINHALA LETTER MAYANNA;Lo;0;L;;;;;N;;;;; 0DB9;SINHALA LETTER AMBA BAYANNA;Lo;0;L;;;;;N;;;;; 0DBA;SINHALA LETTER YAYANNA;Lo;0;L;;;;;N;;;;; 0DBB;SINHALA LETTER RAYANNA;Lo;0;L;;;;;N;;;;; 0DBD;SINHALA LETTER DANTAJA LAYANNA;Lo;0;L;;;;;N;;;;; 0DC0;SINHALA LETTER VAYANNA;Lo;0;L;;;;;N;;;;; 0DC1;SINHALA LETTER TAALUJA SAYANNA;Lo;0;L;;;;;N;;;;; 0DC2;SINHALA LETTER MUURDHAJA SAYANNA;Lo;0;L;;;;;N;;;;; 0DC3;SINHALA LETTER DANTAJA SAYANNA;Lo;0;L;;;;;N;;;;; 0DC4;SINHALA LETTER HAYANNA;Lo;0;L;;;;;N;;;;; 0DC5;SINHALA LETTER MUURDHAJA LAYANNA;Lo;0;L;;;;;N;;;;; 0DC6;SINHALA LETTER FAYANNA;Lo;0;L;;;;;N;;;;; 0DCA;SINHALA SIGN AL-LAKUNA;Mn;9;NSM;;;;;N;;;;; 0DCF;SINHALA VOWEL SIGN AELA-PILLA;Mc;0;L;;;;;N;;;;; 0DD0;SINHALA VOWEL SIGN KETTI AEDA-PILLA;Mc;0;L;;;;;N;;;;; 0DD1;SINHALA VOWEL SIGN DIGA AEDA-PILLA;Mc;0;L;;;;;N;;;;; 0DD2;SINHALA VOWEL SIGN KETTI IS-PILLA;Mn;0;NSM;;;;;N;;;;; 0DD3;SINHALA VOWEL SIGN DIGA IS-PILLA;Mn;0;NSM;;;;;N;;;;; 0DD4;SINHALA VOWEL SIGN KETTI PAA-PILLA;Mn;0;NSM;;;;;N;;;;; 0DD6;SINHALA VOWEL SIGN DIGA PAA-PILLA;Mn;0;NSM;;;;;N;;;;; 0DD8;SINHALA VOWEL SIGN GAETTA-PILLA;Mc;0;L;;;;;N;;;;; 0DD9;SINHALA VOWEL SIGN KOMBUVA;Mc;0;L;;;;;N;;;;; 0DDA;SINHALA VOWEL SIGN DIGA KOMBUVA;Mc;0;L;0DD9 0DCA;;;;N;;;;; 0DDB;SINHALA VOWEL SIGN KOMBU DEKA;Mc;0;L;;;;;N;;;;; 0DDC;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA;Mc;0;L;0DD9 0DCF;;;;N;;;;; 0DDD;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA;Mc;0;L;0DDC 0DCA;;;;N;;;;; 0DDE;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA;Mc;0;L;0DD9 0DDF;;;;N;;;;; 0DDF;SINHALA VOWEL SIGN GAYANUKITTA;Mc;0;L;;;;;N;;;;; 0DE6;SINHALA LITH DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 0DE7;SINHALA LITH DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 0DE8;SINHALA LITH DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 0DE9;SINHALA LITH DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 0DEA;SINHALA LITH DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 0DEB;SINHALA LITH DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 0DEC;SINHALA LITH DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 0DED;SINHALA LITH DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 0DEE;SINHALA LITH DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 0DEF;SINHALA LITH DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 0DF2;SINHALA VOWEL SIGN DIGA GAETTA-PILLA;Mc;0;L;;;;;N;;;;; 0DF3;SINHALA VOWEL SIGN DIGA GAYANUKITTA;Mc;0;L;;;;;N;;;;; 0DF4;SINHALA PUNCTUATION KUNDDALIYA;Po;0;L;;;;;N;;;;; 0E01;THAI CHARACTER KO KAI;Lo;0;L;;;;;N;THAI LETTER KO KAI;;;; 0E02;THAI CHARACTER KHO KHAI;Lo;0;L;;;;;N;THAI LETTER KHO KHAI;;;; 0E03;THAI CHARACTER KHO KHUAT;Lo;0;L;;;;;N;THAI LETTER KHO KHUAT;;;; 0E04;THAI CHARACTER KHO KHWAI;Lo;0;L;;;;;N;THAI LETTER KHO KHWAI;;;; 0E05;THAI CHARACTER KHO KHON;Lo;0;L;;;;;N;THAI LETTER KHO KHON;;;; 0E06;THAI CHARACTER KHO RAKHANG;Lo;0;L;;;;;N;THAI LETTER KHO RAKHANG;;;; 0E07;THAI CHARACTER NGO NGU;Lo;0;L;;;;;N;THAI LETTER NGO NGU;;;; 0E08;THAI CHARACTER CHO CHAN;Lo;0;L;;;;;N;THAI LETTER CHO CHAN;;;; 0E09;THAI CHARACTER CHO CHING;Lo;0;L;;;;;N;THAI LETTER CHO CHING;;;; 0E0A;THAI CHARACTER CHO CHANG;Lo;0;L;;;;;N;THAI LETTER CHO CHANG;;;; 0E0B;THAI CHARACTER SO SO;Lo;0;L;;;;;N;THAI LETTER SO SO;;;; 0E0C;THAI CHARACTER CHO CHOE;Lo;0;L;;;;;N;THAI LETTER CHO CHOE;;;; 0E0D;THAI CHARACTER YO YING;Lo;0;L;;;;;N;THAI LETTER YO YING;;;; 0E0E;THAI CHARACTER DO CHADA;Lo;0;L;;;;;N;THAI LETTER DO CHADA;;;; 0E0F;THAI CHARACTER TO PATAK;Lo;0;L;;;;;N;THAI LETTER TO PATAK;;;; 0E10;THAI CHARACTER THO THAN;Lo;0;L;;;;;N;THAI LETTER THO THAN;;;; 0E11;THAI CHARACTER THO NANGMONTHO;Lo;0;L;;;;;N;THAI LETTER THO NANGMONTHO;;;; 0E12;THAI CHARACTER THO PHUTHAO;Lo;0;L;;;;;N;THAI LETTER THO PHUTHAO;;;; 0E13;THAI CHARACTER NO NEN;Lo;0;L;;;;;N;THAI LETTER NO NEN;;;; 0E14;THAI CHARACTER DO DEK;Lo;0;L;;;;;N;THAI LETTER DO DEK;;;; 0E15;THAI CHARACTER TO TAO;Lo;0;L;;;;;N;THAI LETTER TO TAO;;;; 0E16;THAI CHARACTER THO THUNG;Lo;0;L;;;;;N;THAI LETTER THO THUNG;;;; 0E17;THAI CHARACTER THO THAHAN;Lo;0;L;;;;;N;THAI LETTER THO THAHAN;;;; 0E18;THAI CHARACTER THO THONG;Lo;0;L;;;;;N;THAI LETTER THO THONG;;;; 0E19;THAI CHARACTER NO NU;Lo;0;L;;;;;N;THAI LETTER NO NU;;;; 0E1A;THAI CHARACTER BO BAIMAI;Lo;0;L;;;;;N;THAI LETTER BO BAIMAI;;;; 0E1B;THAI CHARACTER PO PLA;Lo;0;L;;;;;N;THAI LETTER PO PLA;;;; 0E1C;THAI CHARACTER PHO PHUNG;Lo;0;L;;;;;N;THAI LETTER PHO PHUNG;;;; 0E1D;THAI CHARACTER FO FA;Lo;0;L;;;;;N;THAI LETTER FO FA;;;; 0E1E;THAI CHARACTER PHO PHAN;Lo;0;L;;;;;N;THAI LETTER PHO PHAN;;;; 0E1F;THAI CHARACTER FO FAN;Lo;0;L;;;;;N;THAI LETTER FO FAN;;;; 0E20;THAI CHARACTER PHO SAMPHAO;Lo;0;L;;;;;N;THAI LETTER PHO SAMPHAO;;;; 0E21;THAI CHARACTER MO MA;Lo;0;L;;;;;N;THAI LETTER MO MA;;;; 0E22;THAI CHARACTER YO YAK;Lo;0;L;;;;;N;THAI LETTER YO YAK;;;; 0E23;THAI CHARACTER RO RUA;Lo;0;L;;;;;N;THAI LETTER RO RUA;;;; 0E24;THAI CHARACTER RU;Lo;0;L;;;;;N;THAI LETTER RU;;;; 0E25;THAI CHARACTER LO LING;Lo;0;L;;;;;N;THAI LETTER LO LING;;;; 0E26;THAI CHARACTER LU;Lo;0;L;;;;;N;THAI LETTER LU;;;; 0E27;THAI CHARACTER WO WAEN;Lo;0;L;;;;;N;THAI LETTER WO WAEN;;;; 0E28;THAI CHARACTER SO SALA;Lo;0;L;;;;;N;THAI LETTER SO SALA;;;; 0E29;THAI CHARACTER SO RUSI;Lo;0;L;;;;;N;THAI LETTER SO RUSI;;;; 0E2A;THAI CHARACTER SO SUA;Lo;0;L;;;;;N;THAI LETTER SO SUA;;;; 0E2B;THAI CHARACTER HO HIP;Lo;0;L;;;;;N;THAI LETTER HO HIP;;;; 0E2C;THAI CHARACTER LO CHULA;Lo;0;L;;;;;N;THAI LETTER LO CHULA;;;; 0E2D;THAI CHARACTER O ANG;Lo;0;L;;;;;N;THAI LETTER O ANG;;;; 0E2E;THAI CHARACTER HO NOKHUK;Lo;0;L;;;;;N;THAI LETTER HO NOK HUK;;;; 0E2F;THAI CHARACTER PAIYANNOI;Lo;0;L;;;;;N;THAI PAI YAN NOI;;;; 0E30;THAI CHARACTER SARA A;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA A;;;; 0E31;THAI CHARACTER MAI HAN-AKAT;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI HAN-AKAT;;;; 0E32;THAI CHARACTER SARA AA;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AA;;;; 0E33;THAI CHARACTER SARA AM;Lo;0;L;<compat> 0E4D 0E32;;;;N;THAI VOWEL SIGN SARA AM;;;; 0E34;THAI CHARACTER SARA I;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA I;;;; 0E35;THAI CHARACTER SARA II;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA II;;;; 0E36;THAI CHARACTER SARA UE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UE;;;; 0E37;THAI CHARACTER SARA UEE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UEE;;;; 0E38;THAI CHARACTER SARA U;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA U;;;; 0E39;THAI CHARACTER SARA UU;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA UU;;;; 0E3A;THAI CHARACTER PHINTHU;Mn;9;NSM;;;;;N;THAI VOWEL SIGN PHINTHU;;;; 0E3F;THAI CURRENCY SYMBOL BAHT;Sc;0;ET;;;;;N;THAI BAHT SIGN;;;; 0E40;THAI CHARACTER SARA E;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA E;;;; 0E41;THAI CHARACTER SARA AE;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AE;;;; 0E42;THAI CHARACTER SARA O;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA O;;;; 0E43;THAI CHARACTER SARA AI MAIMUAN;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MUAN;;;; 0E44;THAI CHARACTER SARA AI MAIMALAI;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MALAI;;;; 0E45;THAI CHARACTER LAKKHANGYAO;Lo;0;L;;;;;N;THAI LAK KHANG YAO;;;; 0E46;THAI CHARACTER MAIYAMOK;Lm;0;L;;;;;N;THAI MAI YAMOK;;;; 0E47;THAI CHARACTER MAITAIKHU;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI TAI KHU;;;; 0E48;THAI CHARACTER MAI EK;Mn;107;NSM;;;;;N;THAI TONE MAI EK;;;; 0E49;THAI CHARACTER MAI THO;Mn;107;NSM;;;;;N;THAI TONE MAI THO;;;; 0E4A;THAI CHARACTER MAI TRI;Mn;107;NSM;;;;;N;THAI TONE MAI TRI;;;; 0E4B;THAI CHARACTER MAI CHATTAWA;Mn;107;NSM;;;;;N;THAI TONE MAI CHATTAWA;;;; 0E4C;THAI CHARACTER THANTHAKHAT;Mn;0;NSM;;;;;N;THAI THANTHAKHAT;;;; 0E4D;THAI CHARACTER NIKHAHIT;Mn;0;NSM;;;;;N;THAI NIKKHAHIT;;;; 0E4E;THAI CHARACTER YAMAKKAN;Mn;0;NSM;;;;;N;THAI YAMAKKAN;;;; 0E4F;THAI CHARACTER FONGMAN;Po;0;L;;;;;N;THAI FONGMAN;;;; 0E50;THAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 0E51;THAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 0E52;THAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 0E53;THAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 0E54;THAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 0E55;THAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 0E56;THAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 0E57;THAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 0E58;THAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 0E59;THAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 0E5A;THAI CHARACTER ANGKHANKHU;Po;0;L;;;;;N;THAI ANGKHANKHU;;;; 0E5B;THAI CHARACTER KHOMUT;Po;0;L;;;;;N;THAI KHOMUT;;;; 0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;; 0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;; 0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;; 0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;; 0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;; 0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;; 0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;; 0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;; 0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;; 0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;; 0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;; 0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;; 0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;; 0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;; 0E9C;LAO LETTER PHO SUNG;Lo;0;L;;;;;N;;;;; 0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;; 0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;; 0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;; 0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;; 0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;; 0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;; 0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;; 0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;; 0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;; 0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;; 0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;; 0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;; 0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;; 0EB0;LAO VOWEL SIGN A;Lo;0;L;;;;;N;;;;; 0EB1;LAO VOWEL SIGN MAI KAN;Mn;0;NSM;;;;;N;;;;; 0EB2;LAO VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; 0EB3;LAO VOWEL SIGN AM;Lo;0;L;<compat> 0ECD 0EB2;;;;N;;;;; 0EB4;LAO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; 0EB5;LAO VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; 0EB6;LAO VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; 0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; 0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;; 0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;; 0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;; 0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;; 0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;; 0EC0;LAO VOWEL SIGN E;Lo;0;L;;;;;N;;;;; 0EC1;LAO VOWEL SIGN EI;Lo;0;L;;;;;N;;;;; 0EC2;LAO VOWEL SIGN O;Lo;0;L;;;;;N;;;;; 0EC3;LAO VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; 0EC4;LAO VOWEL SIGN AI;Lo;0;L;;;;;N;;;;; 0EC6;LAO KO LA;Lm;0;L;;;;;N;;;;; 0EC8;LAO TONE MAI EK;Mn;122;NSM;;;;;N;;;;; 0EC9;LAO TONE MAI THO;Mn;122;NSM;;;;;N;;;;; 0ECA;LAO TONE MAI TI;Mn;122;NSM;;;;;N;;;;; 0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;; 0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;; 0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;; 0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 0ED3;LAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 0ED4;LAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 0ED5;LAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 0ED6;LAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 0ED7;LAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 0ED8;LAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 0ED9;LAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 0EDC;LAO HO NO;Lo;0;L;<compat> 0EAB 0E99;;;;N;;;;; 0EDD;LAO HO MO;Lo;0;L;<compat> 0EAB 0EA1;;;;N;;;;; 0EDE;LAO LETTER KHMU GO;Lo;0;L;;;;;N;;;;; 0EDF;LAO LETTER KHMU NYO;Lo;0;L;;;;;N;;;;; 0F00;TIBETAN SYLLABLE OM;Lo;0;L;;;;;N;;;;; 0F01;TIBETAN MARK GTER YIG MGO TRUNCATED A;So;0;L;;;;;N;;;;; 0F02;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA;So;0;L;;;;;N;;;;; 0F03;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA;So;0;L;;;;;N;;;;; 0F04;TIBETAN MARK INITIAL YIG MGO MDUN MA;Po;0;L;;;;;N;TIBETAN SINGLE ORNAMENT;;;; 0F05;TIBETAN MARK CLOSING YIG MGO SGAB MA;Po;0;L;;;;;N;;;;; 0F06;TIBETAN MARK CARET YIG MGO PHUR SHAD MA;Po;0;L;;;;;N;;;;; 0F07;TIBETAN MARK YIG MGO TSHEG SHAD MA;Po;0;L;;;;;N;;;;; 0F08;TIBETAN MARK SBRUL SHAD;Po;0;L;;;;;N;TIBETAN RGYANSHAD;;;; 0F09;TIBETAN MARK BSKUR YIG MGO;Po;0;L;;;;;N;;;;; 0F0A;TIBETAN MARK BKA- SHOG YIG MGO;Po;0;L;;;;;N;;;;; 0F0B;TIBETAN MARK INTERSYLLABIC TSHEG;Po;0;L;;;;;N;TIBETAN TSEG;;;; 0F0C;TIBETAN MARK DELIMITER TSHEG BSTAR;Po;0;L;<noBreak> 0F0B;;;;N;;;;; 0F0D;TIBETAN MARK SHAD;Po;0;L;;;;;N;TIBETAN SHAD;;;; 0F0E;TIBETAN MARK NYIS SHAD;Po;0;L;;;;;N;TIBETAN DOUBLE SHAD;;;; 0F0F;TIBETAN MARK TSHEG SHAD;Po;0;L;;;;;N;;;;; 0F10;TIBETAN MARK NYIS TSHEG SHAD;Po;0;L;;;;;N;;;;; 0F11;TIBETAN MARK RIN CHEN SPUNGS SHAD;Po;0;L;;;;;N;TIBETAN RINCHANPHUNGSHAD;;;; 0F12;TIBETAN MARK RGYA GRAM SHAD;Po;0;L;;;;;N;;;;; 0F13;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN;So;0;L;;;;;N;;;;; 0F14;TIBETAN MARK GTER TSHEG;Po;0;L;;;;;N;TIBETAN COMMA;;;; 0F15;TIBETAN LOGOTYPE SIGN CHAD RTAGS;So;0;L;;;;;N;;;;; 0F16;TIBETAN LOGOTYPE SIGN LHAG RTAGS;So;0;L;;;;;N;;;;; 0F17;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS;So;0;L;;;;;N;;;;; 0F18;TIBETAN ASTROLOGICAL SIGN -KHYUD PA;Mn;220;NSM;;;;;N;;;;; 0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS;Mn;220;NSM;;;;;N;;;;; 0F1A;TIBETAN SIGN RDEL DKAR GCIG;So;0;L;;;;;N;;;;; 0F1B;TIBETAN SIGN RDEL DKAR GNYIS;So;0;L;;;;;N;;;;; 0F1C;TIBETAN SIGN RDEL DKAR GSUM;So;0;L;;;;;N;;;;; 0F1D;TIBETAN SIGN RDEL NAG GCIG;So;0;L;;;;;N;;;;; 0F1E;TIBETAN SIGN RDEL NAG GNYIS;So;0;L;;;;;N;;;;; 0F1F;TIBETAN SIGN RDEL DKAR RDEL NAG;So;0;L;;;;;N;;;;; 0F20;TIBETAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 0F21;TIBETAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 0F22;TIBETAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 0F23;TIBETAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 0F24;TIBETAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 0F25;TIBETAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 0F26;TIBETAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;1/2;N;;;;; 0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;3/2;N;;;;; 0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;5/2;N;;;;; 0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;7/2;N;;;;; 0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;9/2;N;;;;; 0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;11/2;N;;;;; 0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;13/2;N;;;;; 0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;15/2;N;;;;; 0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;17/2;N;;;;; 0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;N;;;;; 0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;;;; 0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;;;; 0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;;;; 0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;;;; 0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;;;; 0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;;;; 0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;Y;;;;; 0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;Y;;;;; 0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;Y;TIBETAN LEFT BRACE;;;; 0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;Y;TIBETAN RIGHT BRACE;;;; 0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;;;; 0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;;;; 0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;; 0F41;TIBETAN LETTER KHA;Lo;0;L;;;;;N;;;;; 0F42;TIBETAN LETTER GA;Lo;0;L;;;;;N;;;;; 0F43;TIBETAN LETTER GHA;Lo;0;L;0F42 0FB7;;;;N;;;;; 0F44;TIBETAN LETTER NGA;Lo;0;L;;;;;N;;;;; 0F45;TIBETAN LETTER CA;Lo;0;L;;;;;N;;;;; 0F46;TIBETAN LETTER CHA;Lo;0;L;;;;;N;;;;; 0F47;TIBETAN LETTER JA;Lo;0;L;;;;;N;;;;; 0F49;TIBETAN LETTER NYA;Lo;0;L;;;;;N;;;;; 0F4A;TIBETAN LETTER TTA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED TA;;;; 0F4B;TIBETAN LETTER TTHA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED THA;;;; 0F4C;TIBETAN LETTER DDA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED DA;;;; 0F4D;TIBETAN LETTER DDHA;Lo;0;L;0F4C 0FB7;;;;N;;;;; 0F4E;TIBETAN LETTER NNA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED NA;;;; 0F4F;TIBETAN LETTER TA;Lo;0;L;;;;;N;;;;; 0F50;TIBETAN LETTER THA;Lo;0;L;;;;;N;;;;; 0F51;TIBETAN LETTER DA;Lo;0;L;;;;;N;;;;; 0F52;TIBETAN LETTER DHA;Lo;0;L;0F51 0FB7;;;;N;;;;; 0F53;TIBETAN LETTER NA;Lo;0;L;;;;;N;;;;; 0F54;TIBETAN LETTER PA;Lo;0;L;;;;;N;;;;; 0F55;TIBETAN LETTER PHA;Lo;0;L;;;;;N;;;;; 0F56;TIBETAN LETTER BA;Lo;0;L;;;;;N;;;;; 0F57;TIBETAN LETTER BHA;Lo;0;L;0F56 0FB7;;;;N;;;;; 0F58;TIBETAN LETTER MA;Lo;0;L;;;;;N;;;;; 0F59;TIBETAN LETTER TSA;Lo;0;L;;;;;N;;;;; 0F5A;TIBETAN LETTER TSHA;Lo;0;L;;;;;N;;;;; 0F5B;TIBETAN LETTER DZA;Lo;0;L;;;;;N;;;;; 0F5C;TIBETAN LETTER DZHA;Lo;0;L;0F5B 0FB7;;;;N;;;;; 0F5D;TIBETAN LETTER WA;Lo;0;L;;;;;N;;;;; 0F5E;TIBETAN LETTER ZHA;Lo;0;L;;;;;N;;;;; 0F5F;TIBETAN LETTER ZA;Lo;0;L;;;;;N;;;;; 0F60;TIBETAN LETTER -A;Lo;0;L;;;;;N;TIBETAN LETTER AA;;;; 0F61;TIBETAN LETTER YA;Lo;0;L;;;;;N;;;;; 0F62;TIBETAN LETTER RA;Lo;0;L;;;;;N;;;;; 0F63;TIBETAN LETTER LA;Lo;0;L;;;;;N;;;;; 0F64;TIBETAN LETTER SHA;Lo;0;L;;;;;N;;;;; 0F65;TIBETAN LETTER SSA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED SHA;;;; 0F66;TIBETAN LETTER SA;Lo;0;L;;;;;N;;;;; 0F67;TIBETAN LETTER HA;Lo;0;L;;;;;N;;;;; 0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;; 0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;; 0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;;;; 0F6B;TIBETAN LETTER KKA;Lo;0;L;;;;;N;;;;; 0F6C;TIBETAN LETTER RRA;Lo;0;L;;;;;N;;;;; 0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;; 0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;; 0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;; 0F74;TIBETAN VOWEL SIGN U;Mn;132;NSM;;;;;N;;;;; 0F75;TIBETAN VOWEL SIGN UU;Mn;0;NSM;0F71 0F74;;;;N;;;;; 0F76;TIBETAN VOWEL SIGN VOCALIC R;Mn;0;NSM;0FB2 0F80;;;;N;;;;; 0F77;TIBETAN VOWEL SIGN VOCALIC RR;Mn;0;NSM;<compat> 0FB2 0F81;;;;N;;;;; 0F78;TIBETAN VOWEL SIGN VOCALIC L;Mn;0;NSM;0FB3 0F80;;;;N;;;;; 0F79;TIBETAN VOWEL SIGN VOCALIC LL;Mn;0;NSM;<compat> 0FB3 0F81;;;;N;;;;; 0F7A;TIBETAN VOWEL SIGN E;Mn;130;NSM;;;;;N;;;;; 0F7B;TIBETAN VOWEL SIGN EE;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AI;;;; 0F7C;TIBETAN VOWEL SIGN O;Mn;130;NSM;;;;;N;;;;; 0F7D;TIBETAN VOWEL SIGN OO;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AU;;;; 0F7E;TIBETAN SIGN RJES SU NGA RO;Mn;0;NSM;;;;;N;TIBETAN ANUSVARA;;;; 0F7F;TIBETAN SIGN RNAM BCAD;Mc;0;L;;;;;N;TIBETAN VISARGA;;;; 0F80;TIBETAN VOWEL SIGN REVERSED I;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN SHORT I;;;; 0F81;TIBETAN VOWEL SIGN REVERSED II;Mn;0;NSM;0F71 0F80;;;;N;;;;; 0F82;TIBETAN SIGN NYI ZLA NAA DA;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU WITH ORNAMENT;;;; 0F83;TIBETAN SIGN SNA LDAN;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU;;;; 0F84;TIBETAN MARK HALANTA;Mn;9;NSM;;;;;N;TIBETAN VIRAMA;;;; 0F85;TIBETAN MARK PALUTA;Po;0;L;;;;;N;TIBETAN CHUCHENYIGE;;;; 0F86;TIBETAN SIGN LCI RTAGS;Mn;230;NSM;;;;;N;;;;; 0F87;TIBETAN SIGN YANG RTAGS;Mn;230;NSM;;;;;N;;;;; 0F88;TIBETAN SIGN LCE TSA CAN;Lo;0;L;;;;;N;;;;; 0F89;TIBETAN SIGN MCHU CAN;Lo;0;L;;;;;N;;;;; 0F8A;TIBETAN SIGN GRU CAN RGYINGS;Lo;0;L;;;;;N;;;;; 0F8B;TIBETAN SIGN GRU MED RGYINGS;Lo;0;L;;;;;N;;;;; 0F8C;TIBETAN SIGN INVERTED MCHU CAN;Lo;0;L;;;;;N;;;;; 0F8D;TIBETAN SUBJOINED SIGN LCE TSA CAN;Mn;0;NSM;;;;;N;;;;; 0F8E;TIBETAN SUBJOINED SIGN MCHU CAN;Mn;0;NSM;;;;;N;;;;; 0F8F;TIBETAN SUBJOINED SIGN INVERTED MCHU CAN;Mn;0;NSM;;;;;N;;;;; 0F90;TIBETAN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;; 0F91;TIBETAN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;; 0F92;TIBETAN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;; 0F93;TIBETAN SUBJOINED LETTER GHA;Mn;0;NSM;0F92 0FB7;;;;N;;;;; 0F94;TIBETAN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;; 0F95;TIBETAN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;; 0F96;TIBETAN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;; 0F97;TIBETAN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;; 0F99;TIBETAN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;; 0F9A;TIBETAN SUBJOINED LETTER TTA;Mn;0;NSM;;;;;N;;;;; 0F9B;TIBETAN SUBJOINED LETTER TTHA;Mn;0;NSM;;;;;N;;;;; 0F9C;TIBETAN SUBJOINED LETTER DDA;Mn;0;NSM;;;;;N;;;;; 0F9D;TIBETAN SUBJOINED LETTER DDHA;Mn;0;NSM;0F9C 0FB7;;;;N;;;;; 0F9E;TIBETAN SUBJOINED LETTER NNA;Mn;0;NSM;;;;;N;;;;; 0F9F;TIBETAN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;; 0FA0;TIBETAN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;; 0FA1;TIBETAN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;; 0FA2;TIBETAN SUBJOINED LETTER DHA;Mn;0;NSM;0FA1 0FB7;;;;N;;;;; 0FA3;TIBETAN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;; 0FA4;TIBETAN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;; 0FA5;TIBETAN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;; 0FA6;TIBETAN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;; 0FA7;TIBETAN SUBJOINED LETTER BHA;Mn;0;NSM;0FA6 0FB7;;;;N;;;;; 0FA8;TIBETAN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;; 0FA9;TIBETAN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;; 0FAA;TIBETAN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;; 0FAB;TIBETAN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;; 0FAC;TIBETAN SUBJOINED LETTER DZHA;Mn;0;NSM;0FAB 0FB7;;;;N;;;;; 0FAD;TIBETAN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;;;; 0FAE;TIBETAN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;; 0FAF;TIBETAN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;; 0FB0;TIBETAN SUBJOINED LETTER -A;Mn;0;NSM;;;;;N;;;;; 0FB1;TIBETAN SUBJOINED LETTER YA;Mn;0;NSM;;;;;N;;;;; 0FB2;TIBETAN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;;;; 0FB3;TIBETAN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;; 0FB4;TIBETAN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;; 0FB5;TIBETAN SUBJOINED LETTER SSA;Mn;0;NSM;;;;;N;;;;; 0FB6;TIBETAN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;; 0FB7;TIBETAN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;; 0FB8;TIBETAN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;; 0FB9;TIBETAN SUBJOINED LETTER KSSA;Mn;0;NSM;0F90 0FB5;;;;N;;;;; 0FBA;TIBETAN SUBJOINED LETTER FIXED-FORM WA;Mn;0;NSM;;;;;N;;;;; 0FBB;TIBETAN SUBJOINED LETTER FIXED-FORM YA;Mn;0;NSM;;;;;N;;;;; 0FBC;TIBETAN SUBJOINED LETTER FIXED-FORM RA;Mn;0;NSM;;;;;N;;;;; 0FBE;TIBETAN KU RU KHA;So;0;L;;;;;N;;;;; 0FBF;TIBETAN KU RU KHA BZHI MIG CAN;So;0;L;;;;;N;;;;; 0FC0;TIBETAN CANTILLATION SIGN HEAVY BEAT;So;0;L;;;;;N;;;;; 0FC1;TIBETAN CANTILLATION SIGN LIGHT BEAT;So;0;L;;;;;N;;;;; 0FC2;TIBETAN CANTILLATION SIGN CANG TE-U;So;0;L;;;;;N;;;;; 0FC3;TIBETAN CANTILLATION SIGN SBUB -CHAL;So;0;L;;;;;N;;;;; 0FC4;TIBETAN SYMBOL DRIL BU;So;0;L;;;;;N;;;;; 0FC5;TIBETAN SYMBOL RDO RJE;So;0;L;;;;;N;;;;; 0FC6;TIBETAN SYMBOL PADMA GDAN;Mn;220;NSM;;;;;N;;;;; 0FC7;TIBETAN SYMBOL RDO RJE RGYA GRAM;So;0;L;;;;;N;;;;; 0FC8;TIBETAN SYMBOL PHUR PA;So;0;L;;;;;N;;;;; 0FC9;TIBETAN SYMBOL NOR BU;So;0;L;;;;;N;;;;; 0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;;;; 0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;;;; 0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;;;; 0FCE;TIBETAN SIGN RDEL NAG RDEL DKAR;So;0;L;;;;;N;;;;; 0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;;;; 0FD0;TIBETAN MARK BSKA- SHOG GI MGO RGYAN;Po;0;L;;;;;N;;;;; 0FD1;TIBETAN MARK MNYAM YIG GI MGO RGYAN;Po;0;L;;;;;N;;;;; 0FD2;TIBETAN MARK NYIS TSHEG;Po;0;L;;;;;N;;;;; 0FD3;TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA;Po;0;L;;;;;N;;;;; 0FD4;TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA;Po;0;L;;;;;N;;;;; 0FD5;RIGHT-FACING SVASTI SIGN;So;0;L;;;;;N;;;;; 0FD6;LEFT-FACING SVASTI SIGN;So;0;L;;;;;N;;;;; 0FD7;RIGHT-FACING SVASTI SIGN WITH DOTS;So;0;L;;;;;N;;;;; 0FD8;LEFT-FACING SVASTI SIGN WITH DOTS;So;0;L;;;;;N;;;;; 0FD9;TIBETAN MARK LEADING MCHAN RTAGS;Po;0;L;;;;;N;;;;; 0FDA;TIBETAN MARK TRAILING MCHAN RTAGS;Po;0;L;;;;;N;;;;; 1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;; 1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;; 1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;; 1003;MYANMAR LETTER GHA;Lo;0;L;;;;;N;;;;; 1004;MYANMAR LETTER NGA;Lo;0;L;;;;;N;;;;; 1005;MYANMAR LETTER CA;Lo;0;L;;;;;N;;;;; 1006;MYANMAR LETTER CHA;Lo;0;L;;;;;N;;;;; 1007;MYANMAR LETTER JA;Lo;0;L;;;;;N;;;;; 1008;MYANMAR LETTER JHA;Lo;0;L;;;;;N;;;;; 1009;MYANMAR LETTER NYA;Lo;0;L;;;;;N;;;;; 100A;MYANMAR LETTER NNYA;Lo;0;L;;;;;N;;;;; 100B;MYANMAR LETTER TTA;Lo;0;L;;;;;N;;;;; 100C;MYANMAR LETTER TTHA;Lo;0;L;;;;;N;;;;; 100D;MYANMAR LETTER DDA;Lo;0;L;;;;;N;;;;; 100E;MYANMAR LETTER DDHA;Lo;0;L;;;;;N;;;;; 100F;MYANMAR LETTER NNA;Lo;0;L;;;;;N;;;;; 1010;MYANMAR LETTER TA;Lo;0;L;;;;;N;;;;; 1011;MYANMAR LETTER THA;Lo;0;L;;;;;N;;;;; 1012;MYANMAR LETTER DA;Lo;0;L;;;;;N;;;;; 1013;MYANMAR LETTER DHA;Lo;0;L;;;;;N;;;;; 1014;MYANMAR LETTER NA;Lo;0;L;;;;;N;;;;; 1015;MYANMAR LETTER PA;Lo;0;L;;;;;N;;;;; 1016;MYANMAR LETTER PHA;Lo;0;L;;;;;N;;;;; 1017;MYANMAR LETTER BA;Lo;0;L;;;;;N;;;;; 1018;MYANMAR LETTER BHA;Lo;0;L;;;;;N;;;;; 1019;MYANMAR LETTER MA;Lo;0;L;;;;;N;;;;; 101A;MYANMAR LETTER YA;Lo;0;L;;;;;N;;;;; 101B;MYANMAR LETTER RA;Lo;0;L;;;;;N;;;;; 101C;MYANMAR LETTER LA;Lo;0;L;;;;;N;;;;; 101D;MYANMAR LETTER WA;Lo;0;L;;;;;N;;;;; 101E;MYANMAR LETTER SA;Lo;0;L;;;;;N;;;;; 101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;; 1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;; 1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;; 1022;MYANMAR LETTER SHAN A;Lo;0;L;;;;;N;;;;; 1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;; 1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;; 1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;; 1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;; 1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;; 1028;MYANMAR LETTER MON E;Lo;0;L;;;;;N;;;;; 1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;; 102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;; 102B;MYANMAR VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;; 102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; 102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; 102F;MYANMAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;; 1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; 1033;MYANMAR VOWEL SIGN MON II;Mn;0;NSM;;;;;N;;;;; 1034;MYANMAR VOWEL SIGN MON O;Mn;0;NSM;;;;;N;;;;; 1035;MYANMAR VOWEL SIGN E ABOVE;Mn;0;NSM;;;;;N;;;;; 1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;; 1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;; 1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; 103A;MYANMAR SIGN ASAT;Mn;9;NSM;;;;;N;;;;; 103B;MYANMAR CONSONANT SIGN MEDIAL YA;Mc;0;L;;;;;N;;;;; 103C;MYANMAR CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; 103D;MYANMAR CONSONANT SIGN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; 103E;MYANMAR CONSONANT SIGN MEDIAL HA;Mn;0;NSM;;;;;N;;;;; 103F;MYANMAR LETTER GREAT SA;Lo;0;L;;;;;N;;;;; 1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 1043;MYANMAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 1044;MYANMAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 1045;MYANMAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 1046;MYANMAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 1047;MYANMAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 1048;MYANMAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 1049;MYANMAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 104A;MYANMAR SIGN LITTLE SECTION;Po;0;L;;;;;N;;;;; 104B;MYANMAR SIGN SECTION;Po;0;L;;;;;N;;;;; 104C;MYANMAR SYMBOL LOCATIVE;Po;0;L;;;;;N;;;;; 104D;MYANMAR SYMBOL COMPLETED;Po;0;L;;;;;N;;;;; 104E;MYANMAR SYMBOL AFOREMENTIONED;Po;0;L;;;;;N;;;;; 104F;MYANMAR SYMBOL GENITIVE;Po;0;L;;;;;N;;;;; 1050;MYANMAR LETTER SHA;Lo;0;L;;;;;N;;;;; 1051;MYANMAR LETTER SSA;Lo;0;L;;;;;N;;;;; 1052;MYANMAR LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; 1053;MYANMAR LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 1054;MYANMAR LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; 1055;MYANMAR LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; 1056;MYANMAR VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; 1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; 1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; 1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; 105A;MYANMAR LETTER MON NGA;Lo;0;L;;;;;N;;;;; 105B;MYANMAR LETTER MON JHA;Lo;0;L;;;;;N;;;;; 105C;MYANMAR LETTER MON BBA;Lo;0;L;;;;;N;;;;; 105D;MYANMAR LETTER MON BBE;Lo;0;L;;;;;N;;;;; 105E;MYANMAR CONSONANT SIGN MON MEDIAL NA;Mn;0;NSM;;;;;N;;;;; 105F;MYANMAR CONSONANT SIGN MON MEDIAL MA;Mn;0;NSM;;;;;N;;;;; 1060;MYANMAR CONSONANT SIGN MON MEDIAL LA;Mn;0;NSM;;;;;N;;;;; 1061;MYANMAR LETTER SGAW KAREN SHA;Lo;0;L;;;;;N;;;;; 1062;MYANMAR VOWEL SIGN SGAW KAREN EU;Mc;0;L;;;;;N;;;;; 1063;MYANMAR TONE MARK SGAW KAREN HATHI;Mc;0;L;;;;;N;;;;; 1064;MYANMAR TONE MARK SGAW KAREN KE PHO;Mc;0;L;;;;;N;;;;; 1065;MYANMAR LETTER WESTERN PWO KAREN THA;Lo;0;L;;;;;N;;;;; 1066;MYANMAR LETTER WESTERN PWO KAREN PWA;Lo;0;L;;;;;N;;;;; 1067;MYANMAR VOWEL SIGN WESTERN PWO KAREN EU;Mc;0;L;;;;;N;;;;; 1068;MYANMAR VOWEL SIGN WESTERN PWO KAREN UE;Mc;0;L;;;;;N;;;;; 1069;MYANMAR SIGN WESTERN PWO KAREN TONE-1;Mc;0;L;;;;;N;;;;; 106A;MYANMAR SIGN WESTERN PWO KAREN TONE-2;Mc;0;L;;;;;N;;;;; 106B;MYANMAR SIGN WESTERN PWO KAREN TONE-3;Mc;0;L;;;;;N;;;;; 106C;MYANMAR SIGN WESTERN PWO KAREN TONE-4;Mc;0;L;;;;;N;;;;; 106D;MYANMAR SIGN WESTERN PWO KAREN TONE-5;Mc;0;L;;;;;N;;;;; 106E;MYANMAR LETTER EASTERN PWO KAREN NNA;Lo;0;L;;;;;N;;;;; 106F;MYANMAR LETTER EASTERN PWO KAREN YWA;Lo;0;L;;;;;N;;;;; 1070;MYANMAR LETTER EASTERN PWO KAREN GHWA;Lo;0;L;;;;;N;;;;; 1071;MYANMAR VOWEL SIGN GEBA KAREN I;Mn;0;NSM;;;;;N;;;;; 1072;MYANMAR VOWEL SIGN KAYAH OE;Mn;0;NSM;;;;;N;;;;; 1073;MYANMAR VOWEL SIGN KAYAH U;Mn;0;NSM;;;;;N;;;;; 1074;MYANMAR VOWEL SIGN KAYAH EE;Mn;0;NSM;;;;;N;;;;; 1075;MYANMAR LETTER SHAN KA;Lo;0;L;;;;;N;;;;; 1076;MYANMAR LETTER SHAN KHA;Lo;0;L;;;;;N;;;;; 1077;MYANMAR LETTER SHAN GA;Lo;0;L;;;;;N;;;;; 1078;MYANMAR LETTER SHAN CA;Lo;0;L;;;;;N;;;;; 1079;MYANMAR LETTER SHAN ZA;Lo;0;L;;;;;N;;;;; 107A;MYANMAR LETTER SHAN NYA;Lo;0;L;;;;;N;;;;; 107B;MYANMAR LETTER SHAN DA;Lo;0;L;;;;;N;;;;; 107C;MYANMAR LETTER SHAN NA;Lo;0;L;;;;;N;;;;; 107D;MYANMAR LETTER SHAN PHA;Lo;0;L;;;;;N;;;;; 107E;MYANMAR LETTER SHAN FA;Lo;0;L;;;;;N;;;;; 107F;MYANMAR LETTER SHAN BA;Lo;0;L;;;;;N;;;;; 1080;MYANMAR LETTER SHAN THA;Lo;0;L;;;;;N;;;;; 1081;MYANMAR LETTER SHAN HA;Lo;0;L;;;;;N;;;;; 1082;MYANMAR CONSONANT SIGN SHAN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; 1083;MYANMAR VOWEL SIGN SHAN AA;Mc;0;L;;;;;N;;;;; 1084;MYANMAR VOWEL SIGN SHAN E;Mc;0;L;;;;;N;;;;; 1085;MYANMAR VOWEL SIGN SHAN E ABOVE;Mn;0;NSM;;;;;N;;;;; 1086;MYANMAR VOWEL SIGN SHAN FINAL Y;Mn;0;NSM;;;;;N;;;;; 1087;MYANMAR SIGN SHAN TONE-2;Mc;0;L;;;;;N;;;;; 1088;MYANMAR SIGN SHAN TONE-3;Mc;0;L;;;;;N;;;;; 1089;MYANMAR SIGN SHAN TONE-5;Mc;0;L;;;;;N;;;;; 108A;MYANMAR SIGN SHAN TONE-6;Mc;0;L;;;;;N;;;;; 108B;MYANMAR SIGN SHAN COUNCIL TONE-2;Mc;0;L;;;;;N;;;;; 108C;MYANMAR SIGN SHAN COUNCIL TONE-3;Mc;0;L;;;;;N;;;;; 108D;MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE;Mn;220;NSM;;;;;N;;;;; 108E;MYANMAR LETTER RUMAI PALAUNG FA;Lo;0;L;;;;;N;;;;; 108F;MYANMAR SIGN RUMAI PALAUNG TONE-5;Mc;0;L;;;;;N;;;;; 1090;MYANMAR SHAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 1091;MYANMAR SHAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 1092;MYANMAR SHAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 1093;MYANMAR SHAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 1094;MYANMAR SHAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 1095;MYANMAR SHAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 1096;MYANMAR SHAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 1097;MYANMAR SHAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 1098;MYANMAR SHAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 1099;MYANMAR SHAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 109A;MYANMAR SIGN KHAMTI TONE-1;Mc;0;L;;;;;N;;;;; 109B;MYANMAR SIGN KHAMTI TONE-3;Mc;0;L;;;;;N;;;;; 109C;MYANMAR VOWEL SIGN AITON A;Mc;0;L;;;;;N;;;;; 109D;MYANMAR VOWEL SIGN AITON AI;Mn;0;NSM;;;;;N;;;;; 109E;MYANMAR SYMBOL SHAN ONE;So;0;L;;;;;N;;;;; 109F;MYANMAR SYMBOL SHAN EXCLAMATION;So;0;L;;;;;N;;;;; 10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;;;2D00; 10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;;;2D01; 10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;;;2D02; 10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;;;2D03; 10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;2D04; 10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;;;2D05; 10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;;;2D06; 10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;;;2D07; 10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;;;2D08; 10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;;;2D09; 10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;;;2D0A; 10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;;;2D0B; 10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;;;2D0C; 10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;;;2D0D; 10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;;;2D0E; 10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;;;2D0F; 10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;;;2D10; 10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;2D11; 10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;;;2D12; 10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;;;2D13; 10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;;;2D14; 10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;;;2D15; 10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;;;2D16; 10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;;;2D17; 10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;;;2D18; 10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;;;2D19; 10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;;;2D1A; 10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;;;2D1B; 10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;;;2D1C; 10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;;;2D1D; 10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;;;2D1E; 10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;;;2D1F; 10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;;;2D20; 10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;;;2D21; 10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;;;2D22; 10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;2D23; 10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;2D24; 10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;;;2D25; 10C7;GEORGIAN CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;2D27; 10CD;GEORGIAN CAPITAL LETTER AEN;Lu;0;L;;;;;N;;;;2D2D; 10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;; 10D1;GEORGIAN LETTER BAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;;; 10D2;GEORGIAN LETTER GAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;;; 10D3;GEORGIAN LETTER DON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;;; 10D4;GEORGIAN LETTER EN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;;; 10D5;GEORGIAN LETTER VIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;;; 10D6;GEORGIAN LETTER ZEN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;;; 10D7;GEORGIAN LETTER TAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;;; 10D8;GEORGIAN LETTER IN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;;; 10D9;GEORGIAN LETTER KAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;;; 10DA;GEORGIAN LETTER LAS;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;;; 10DB;GEORGIAN LETTER MAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;;; 10DC;GEORGIAN LETTER NAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;;; 10DD;GEORGIAN LETTER ON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;;; 10DE;GEORGIAN LETTER PAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;;; 10DF;GEORGIAN LETTER ZHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;;; 10E0;GEORGIAN LETTER RAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;;; 10E1;GEORGIAN LETTER SAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;;; 10E2;GEORGIAN LETTER TAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;;; 10E3;GEORGIAN LETTER UN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;;; 10E4;GEORGIAN LETTER PHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;;; 10E5;GEORGIAN LETTER KHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;;; 10E6;GEORGIAN LETTER GHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;;; 10E7;GEORGIAN LETTER QAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;;; 10E8;GEORGIAN LETTER SHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;;; 10E9;GEORGIAN LETTER CHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;;; 10EA;GEORGIAN LETTER CAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;;; 10EB;GEORGIAN LETTER JIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;;; 10EC;GEORGIAN LETTER CIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;;; 10ED;GEORGIAN LETTER CHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;;; 10EE;GEORGIAN LETTER XAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;;; 10EF;GEORGIAN LETTER JHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;;; 10F0;GEORGIAN LETTER HAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;;; 10F1;GEORGIAN LETTER HE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;;; 10F2;GEORGIAN LETTER HIE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;;; 10F3;GEORGIAN LETTER WE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;;; 10F4;GEORGIAN LETTER HAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;;; 10F5;GEORGIAN LETTER HOE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;;; 10F6;GEORGIAN LETTER FI;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;;; 10F7;GEORGIAN LETTER YN;Lo;0;L;;;;;N;;;;; 10F8;GEORGIAN LETTER ELIFI;Lo;0;L;;;;;N;;;;; 10F9;GEORGIAN LETTER TURNED GAN;Lo;0;L;;;;;N;;;;; 10FA;GEORGIAN LETTER AIN;Lo;0;L;;;;;N;;;;; 10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; 10FC;MODIFIER LETTER GEORGIAN NAR;Lm;0;L;<super> 10DC;;;;N;;;;; 10FD;GEORGIAN LETTER AEN;Lo;0;L;;;;;N;;;;; 10FE;GEORGIAN LETTER HARD SIGN;Lo;0;L;;;;;N;;;;; 10FF;GEORGIAN LETTER LABIAL SIGN;Lo;0;L;;;;;N;;;;; 1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;;;; 1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;; 1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;;;; 1103;HANGUL CHOSEONG TIKEUT;Lo;0;L;;;;;N;;;;; 1104;HANGUL CHOSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;;;; 1105;HANGUL CHOSEONG RIEUL;Lo;0;L;;;;;N;;;;; 1106;HANGUL CHOSEONG MIEUM;Lo;0;L;;;;;N;;;;; 1107;HANGUL CHOSEONG PIEUP;Lo;0;L;;;;;N;;;;; 1108;HANGUL CHOSEONG SSANGPIEUP;Lo;0;L;;;;;N;;;;; 1109;HANGUL CHOSEONG SIOS;Lo;0;L;;;;;N;;;;; 110A;HANGUL CHOSEONG SSANGSIOS;Lo;0;L;;;;;N;;;;; 110B;HANGUL CHOSEONG IEUNG;Lo;0;L;;;;;N;;;;; 110C;HANGUL CHOSEONG CIEUC;Lo;0;L;;;;;N;;;;; 110D;HANGUL CHOSEONG SSANGCIEUC;Lo;0;L;;;;;N;;;;; 110E;HANGUL CHOSEONG CHIEUCH;Lo;0;L;;;;;N;;;;; 110F;HANGUL CHOSEONG KHIEUKH;Lo;0;L;;;;;N;;;;; 1110;HANGUL CHOSEONG THIEUTH;Lo;0;L;;;;;N;;;;; 1111;HANGUL CHOSEONG PHIEUPH;Lo;0;L;;;;;N;;;;; 1112;HANGUL CHOSEONG HIEUH;Lo;0;L;;;;;N;;;;; 1113;HANGUL CHOSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; 1114;HANGUL CHOSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; 1115;HANGUL CHOSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; 1116;HANGUL CHOSEONG NIEUN-PIEUP;Lo;0;L;;;;;N;;;;; 1117;HANGUL CHOSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; 1118;HANGUL CHOSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; 1119;HANGUL CHOSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; 111A;HANGUL CHOSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; 111B;HANGUL CHOSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; 111C;HANGUL CHOSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; 111D;HANGUL CHOSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; 111E;HANGUL CHOSEONG PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; 111F;HANGUL CHOSEONG PIEUP-NIEUN;Lo;0;L;;;;;N;;;;; 1120;HANGUL CHOSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; 1121;HANGUL CHOSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; 1122;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; 1123;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; 1124;HANGUL CHOSEONG PIEUP-SIOS-PIEUP;Lo;0;L;;;;;N;;;;; 1125;HANGUL CHOSEONG PIEUP-SSANGSIOS;Lo;0;L;;;;;N;;;;; 1126;HANGUL CHOSEONG PIEUP-SIOS-CIEUC;Lo;0;L;;;;;N;;;;; 1127;HANGUL CHOSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; 1128;HANGUL CHOSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; 1129;HANGUL CHOSEONG PIEUP-THIEUTH;Lo;0;L;;;;;N;;;;; 112A;HANGUL CHOSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; 112B;HANGUL CHOSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; 112C;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP;Lo;0;L;;;;;N;;;;; 112D;HANGUL CHOSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; 112E;HANGUL CHOSEONG SIOS-NIEUN;Lo;0;L;;;;;N;;;;; 112F;HANGUL CHOSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; 1130;HANGUL CHOSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; 1131;HANGUL CHOSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; 1132;HANGUL CHOSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; 1133;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; 1134;HANGUL CHOSEONG SIOS-SSANGSIOS;Lo;0;L;;;;;N;;;;; 1135;HANGUL CHOSEONG SIOS-IEUNG;Lo;0;L;;;;;N;;;;; 1136;HANGUL CHOSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; 1137;HANGUL CHOSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; 1138;HANGUL CHOSEONG SIOS-KHIEUKH;Lo;0;L;;;;;N;;;;; 1139;HANGUL CHOSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; 113A;HANGUL CHOSEONG SIOS-PHIEUPH;Lo;0;L;;;;;N;;;;; 113B;HANGUL CHOSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; 113C;HANGUL CHOSEONG CHITUEUMSIOS;Lo;0;L;;;;;N;;;;; 113D;HANGUL CHOSEONG CHITUEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; 113E;HANGUL CHOSEONG CEONGCHIEUMSIOS;Lo;0;L;;;;;N;;;;; 113F;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; 1140;HANGUL CHOSEONG PANSIOS;Lo;0;L;;;;;N;;;;; 1141;HANGUL CHOSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; 1142;HANGUL CHOSEONG IEUNG-TIKEUT;Lo;0;L;;;;;N;;;;; 1143;HANGUL CHOSEONG IEUNG-MIEUM;Lo;0;L;;;;;N;;;;; 1144;HANGUL CHOSEONG IEUNG-PIEUP;Lo;0;L;;;;;N;;;;; 1145;HANGUL CHOSEONG IEUNG-SIOS;Lo;0;L;;;;;N;;;;; 1146;HANGUL CHOSEONG IEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; 1147;HANGUL CHOSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; 1148;HANGUL CHOSEONG IEUNG-CIEUC;Lo;0;L;;;;;N;;;;; 1149;HANGUL CHOSEONG IEUNG-CHIEUCH;Lo;0;L;;;;;N;;;;; 114A;HANGUL CHOSEONG IEUNG-THIEUTH;Lo;0;L;;;;;N;;;;; 114B;HANGUL CHOSEONG IEUNG-PHIEUPH;Lo;0;L;;;;;N;;;;; 114C;HANGUL CHOSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; 114D;HANGUL CHOSEONG CIEUC-IEUNG;Lo;0;L;;;;;N;;;;; 114E;HANGUL CHOSEONG CHITUEUMCIEUC;Lo;0;L;;;;;N;;;;; 114F;HANGUL CHOSEONG CHITUEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; 1150;HANGUL CHOSEONG CEONGCHIEUMCIEUC;Lo;0;L;;;;;N;;;;; 1151;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; 1152;HANGUL CHOSEONG CHIEUCH-KHIEUKH;Lo;0;L;;;;;N;;;;; 1153;HANGUL CHOSEONG CHIEUCH-HIEUH;Lo;0;L;;;;;N;;;;; 1154;HANGUL CHOSEONG CHITUEUMCHIEUCH;Lo;0;L;;;;;N;;;;; 1155;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH;Lo;0;L;;;;;N;;;;; 1156;HANGUL CHOSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; 1157;HANGUL CHOSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; 1158;HANGUL CHOSEONG SSANGHIEUH;Lo;0;L;;;;;N;;;;; 1159;HANGUL CHOSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; 115A;HANGUL CHOSEONG KIYEOK-TIKEUT;Lo;0;L;;;;;N;;;;; 115B;HANGUL CHOSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; 115C;HANGUL CHOSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;;;; 115D;HANGUL CHOSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;;;; 115E;HANGUL CHOSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; 115F;HANGUL CHOSEONG FILLER;Lo;0;L;;;;;N;;;;; 1160;HANGUL JUNGSEONG FILLER;Lo;0;L;;;;;N;;;;; 1161;HANGUL JUNGSEONG A;Lo;0;L;;;;;N;;;;; 1162;HANGUL JUNGSEONG AE;Lo;0;L;;;;;N;;;;; 1163;HANGUL JUNGSEONG YA;Lo;0;L;;;;;N;;;;; 1164;HANGUL JUNGSEONG YAE;Lo;0;L;;;;;N;;;;; 1165;HANGUL JUNGSEONG EO;Lo;0;L;;;;;N;;;;; 1166;HANGUL JUNGSEONG E;Lo;0;L;;;;;N;;;;; 1167;HANGUL JUNGSEONG YEO;Lo;0;L;;;;;N;;;;; 1168;HANGUL JUNGSEONG YE;Lo;0;L;;;;;N;;;;; 1169;HANGUL JUNGSEONG O;Lo;0;L;;;;;N;;;;; 116A;HANGUL JUNGSEONG WA;Lo;0;L;;;;;N;;;;; 116B;HANGUL JUNGSEONG WAE;Lo;0;L;;;;;N;;;;; 116C;HANGUL JUNGSEONG OE;Lo;0;L;;;;;N;;;;; 116D;HANGUL JUNGSEONG YO;Lo;0;L;;;;;N;;;;; 116E;HANGUL JUNGSEONG U;Lo;0;L;;;;;N;;;;; 116F;HANGUL JUNGSEONG WEO;Lo;0;L;;;;;N;;;;; 1170;HANGUL JUNGSEONG WE;Lo;0;L;;;;;N;;;;; 1171;HANGUL JUNGSEONG WI;Lo;0;L;;;;;N;;;;; 1172;HANGUL JUNGSEONG YU;Lo;0;L;;;;;N;;;;; 1173;HANGUL JUNGSEONG EU;Lo;0;L;;;;;N;;;;; 1174;HANGUL JUNGSEONG YI;Lo;0;L;;;;;N;;;;; 1175;HANGUL JUNGSEONG I;Lo;0;L;;;;;N;;;;; 1176;HANGUL JUNGSEONG A-O;Lo;0;L;;;;;N;;;;; 1177;HANGUL JUNGSEONG A-U;Lo;0;L;;;;;N;;;;; 1178;HANGUL JUNGSEONG YA-O;Lo;0;L;;;;;N;;;;; 1179;HANGUL JUNGSEONG YA-YO;Lo;0;L;;;;;N;;;;; 117A;HANGUL JUNGSEONG EO-O;Lo;0;L;;;;;N;;;;; 117B;HANGUL JUNGSEONG EO-U;Lo;0;L;;;;;N;;;;; 117C;HANGUL JUNGSEONG EO-EU;Lo;0;L;;;;;N;;;;; 117D;HANGUL JUNGSEONG YEO-O;Lo;0;L;;;;;N;;;;; 117E;HANGUL JUNGSEONG YEO-U;Lo;0;L;;;;;N;;;;; 117F;HANGUL JUNGSEONG O-EO;Lo;0;L;;;;;N;;;;; 1180;HANGUL JUNGSEONG O-E;Lo;0;L;;;;;N;;;;; 1181;HANGUL JUNGSEONG O-YE;Lo;0;L;;;;;N;;;;; 1182;HANGUL JUNGSEONG O-O;Lo;0;L;;;;;N;;;;; 1183;HANGUL JUNGSEONG O-U;Lo;0;L;;;;;N;;;;; 1184;HANGUL JUNGSEONG YO-YA;Lo;0;L;;;;;N;;;;; 1185;HANGUL JUNGSEONG YO-YAE;Lo;0;L;;;;;N;;;;; 1186;HANGUL JUNGSEONG YO-YEO;Lo;0;L;;;;;N;;;;; 1187;HANGUL JUNGSEONG YO-O;Lo;0;L;;;;;N;;;;; 1188;HANGUL JUNGSEONG YO-I;Lo;0;L;;;;;N;;;;; 1189;HANGUL JUNGSEONG U-A;Lo;0;L;;;;;N;;;;; 118A;HANGUL JUNGSEONG U-AE;Lo;0;L;;;;;N;;;;; 118B;HANGUL JUNGSEONG U-EO-EU;Lo;0;L;;;;;N;;;;; 118C;HANGUL JUNGSEONG U-YE;Lo;0;L;;;;;N;;;;; 118D;HANGUL JUNGSEONG U-U;Lo;0;L;;;;;N;;;;; 118E;HANGUL JUNGSEONG YU-A;Lo;0;L;;;;;N;;;;; 118F;HANGUL JUNGSEONG YU-EO;Lo;0;L;;;;;N;;;;; 1190;HANGUL JUNGSEONG YU-E;Lo;0;L;;;;;N;;;;; 1191;HANGUL JUNGSEONG YU-YEO;Lo;0;L;;;;;N;;;;; 1192;HANGUL JUNGSEONG YU-YE;Lo;0;L;;;;;N;;;;; 1193;HANGUL JUNGSEONG YU-U;Lo;0;L;;;;;N;;;;; 1194;HANGUL JUNGSEONG YU-I;Lo;0;L;;;;;N;;;;; 1195;HANGUL JUNGSEONG EU-U;Lo;0;L;;;;;N;;;;; 1196;HANGUL JUNGSEONG EU-EU;Lo;0;L;;;;;N;;;;; 1197;HANGUL JUNGSEONG YI-U;Lo;0;L;;;;;N;;;;; 1198;HANGUL JUNGSEONG I-A;Lo;0;L;;;;;N;;;;; 1199;HANGUL JUNGSEONG I-YA;Lo;0;L;;;;;N;;;;; 119A;HANGUL JUNGSEONG I-O;Lo;0;L;;;;;N;;;;; 119B;HANGUL JUNGSEONG I-U;Lo;0;L;;;;;N;;;;; 119C;HANGUL JUNGSEONG I-EU;Lo;0;L;;;;;N;;;;; 119D;HANGUL JUNGSEONG I-ARAEA;Lo;0;L;;;;;N;;;;; 119E;HANGUL JUNGSEONG ARAEA;Lo;0;L;;;;;N;;;;; 119F;HANGUL JUNGSEONG ARAEA-EO;Lo;0;L;;;;;N;;;;; 11A0;HANGUL JUNGSEONG ARAEA-U;Lo;0;L;;;;;N;;;;; 11A1;HANGUL JUNGSEONG ARAEA-I;Lo;0;L;;;;;N;;;;; 11A2;HANGUL JUNGSEONG SSANGARAEA;Lo;0;L;;;;;N;;;;; 11A3;HANGUL JUNGSEONG A-EU;Lo;0;L;;;;;N;;;;; 11A4;HANGUL JUNGSEONG YA-U;Lo;0;L;;;;;N;;;;; 11A5;HANGUL JUNGSEONG YEO-YA;Lo;0;L;;;;;N;;;;; 11A6;HANGUL JUNGSEONG O-YA;Lo;0;L;;;;;N;;;;; 11A7;HANGUL JUNGSEONG O-YAE;Lo;0;L;;;;;N;;;;; 11A8;HANGUL JONGSEONG KIYEOK;Lo;0;L;;;;;N;;;;; 11A9;HANGUL JONGSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;; 11AA;HANGUL JONGSEONG KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; 11AB;HANGUL JONGSEONG NIEUN;Lo;0;L;;;;;N;;;;; 11AC;HANGUL JONGSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;;;; 11AD;HANGUL JONGSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;;;; 11AE;HANGUL JONGSEONG TIKEUT;Lo;0;L;;;;;N;;;;; 11AF;HANGUL JONGSEONG RIEUL;Lo;0;L;;;;;N;;;;; 11B0;HANGUL JONGSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;;;; 11B1;HANGUL JONGSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;;;; 11B2;HANGUL JONGSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;;;; 11B3;HANGUL JONGSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;;;; 11B4;HANGUL JONGSEONG RIEUL-THIEUTH;Lo;0;L;;;;;N;;;;; 11B5;HANGUL JONGSEONG RIEUL-PHIEUPH;Lo;0;L;;;;;N;;;;; 11B6;HANGUL JONGSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; 11B7;HANGUL JONGSEONG MIEUM;Lo;0;L;;;;;N;;;;; 11B8;HANGUL JONGSEONG PIEUP;Lo;0;L;;;;;N;;;;; 11B9;HANGUL JONGSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; 11BA;HANGUL JONGSEONG SIOS;Lo;0;L;;;;;N;;;;; 11BB;HANGUL JONGSEONG SSANGSIOS;Lo;0;L;;;;;N;;;;; 11BC;HANGUL JONGSEONG IEUNG;Lo;0;L;;;;;N;;;;; 11BD;HANGUL JONGSEONG CIEUC;Lo;0;L;;;;;N;;;;; 11BE;HANGUL JONGSEONG CHIEUCH;Lo;0;L;;;;;N;;;;; 11BF;HANGUL JONGSEONG KHIEUKH;Lo;0;L;;;;;N;;;;; 11C0;HANGUL JONGSEONG THIEUTH;Lo;0;L;;;;;N;;;;; 11C1;HANGUL JONGSEONG PHIEUPH;Lo;0;L;;;;;N;;;;; 11C2;HANGUL JONGSEONG HIEUH;Lo;0;L;;;;;N;;;;; 11C3;HANGUL JONGSEONG KIYEOK-RIEUL;Lo;0;L;;;;;N;;;;; 11C4;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; 11C5;HANGUL JONGSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; 11C6;HANGUL JONGSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; 11C7;HANGUL JONGSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; 11C8;HANGUL JONGSEONG NIEUN-PANSIOS;Lo;0;L;;;;;N;;;;; 11C9;HANGUL JONGSEONG NIEUN-THIEUTH;Lo;0;L;;;;;N;;;;; 11CA;HANGUL JONGSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; 11CB;HANGUL JONGSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; 11CC;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; 11CD;HANGUL JONGSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; 11CE;HANGUL JONGSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; 11CF;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH;Lo;0;L;;;;;N;;;;; 11D0;HANGUL JONGSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; 11D1;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; 11D2;HANGUL JONGSEONG RIEUL-MIEUM-SIOS;Lo;0;L;;;;;N;;;;; 11D3;HANGUL JONGSEONG RIEUL-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; 11D4;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; 11D5;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; 11D6;HANGUL JONGSEONG RIEUL-SSANGSIOS;Lo;0;L;;;;;N;;;;; 11D7;HANGUL JONGSEONG RIEUL-PANSIOS;Lo;0;L;;;;;N;;;;; 11D8;HANGUL JONGSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; 11D9;HANGUL JONGSEONG RIEUL-YEORINHIEUH;Lo;0;L;;;;;N;;;;; 11DA;HANGUL JONGSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; 11DB;HANGUL JONGSEONG MIEUM-RIEUL;Lo;0;L;;;;;N;;;;; 11DC;HANGUL JONGSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; 11DD;HANGUL JONGSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; 11DE;HANGUL JONGSEONG MIEUM-SSANGSIOS;Lo;0;L;;;;;N;;;;; 11DF;HANGUL JONGSEONG MIEUM-PANSIOS;Lo;0;L;;;;;N;;;;; 11E0;HANGUL JONGSEONG MIEUM-CHIEUCH;Lo;0;L;;;;;N;;;;; 11E1;HANGUL JONGSEONG MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; 11E2;HANGUL JONGSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; 11E3;HANGUL JONGSEONG PIEUP-RIEUL;Lo;0;L;;;;;N;;;;; 11E4;HANGUL JONGSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; 11E5;HANGUL JONGSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; 11E6;HANGUL JONGSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; 11E7;HANGUL JONGSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; 11E8;HANGUL JONGSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; 11E9;HANGUL JONGSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; 11EA;HANGUL JONGSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; 11EB;HANGUL JONGSEONG PANSIOS;Lo;0;L;;;;;N;;;;; 11EC;HANGUL JONGSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; 11ED;HANGUL JONGSEONG IEUNG-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; 11EE;HANGUL JONGSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; 11EF;HANGUL JONGSEONG IEUNG-KHIEUKH;Lo;0;L;;;;;N;;;;; 11F0;HANGUL JONGSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; 11F1;HANGUL JONGSEONG YESIEUNG-SIOS;Lo;0;L;;;;;N;;;;; 11F2;HANGUL JONGSEONG YESIEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; 11F3;HANGUL JONGSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; 11F4;HANGUL JONGSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; 11F5;HANGUL JONGSEONG HIEUH-NIEUN;Lo;0;L;;;;;N;;;;; 11F6;HANGUL JONGSEONG HIEUH-RIEUL;Lo;0;L;;;;;N;;;;; 11F7;HANGUL JONGSEONG HIEUH-MIEUM;Lo;0;L;;;;;N;;;;; 11F8;HANGUL JONGSEONG HIEUH-PIEUP;Lo;0;L;;;;;N;;;;; 11F9;HANGUL JONGSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; 11FA;HANGUL JONGSEONG KIYEOK-NIEUN;Lo;0;L;;;;;N;;;;; 11FB;HANGUL JONGSEONG KIYEOK-PIEUP;Lo;0;L;;;;;N;;;;; 11FC;HANGUL JONGSEONG KIYEOK-CHIEUCH;Lo;0;L;;;;;N;;;;; 11FD;HANGUL JONGSEONG KIYEOK-KHIEUKH;Lo;0;L;;;;;N;;;;; 11FE;HANGUL JONGSEONG KIYEOK-HIEUH;Lo;0;L;;;;;N;;;;; 11FF;HANGUL JONGSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; 1200;ETHIOPIC SYLLABLE HA;Lo;0;L;;;;;N;;;;; 1201;ETHIOPIC SYLLABLE HU;Lo;0;L;;;;;N;;;;; 1202;ETHIOPIC SYLLABLE HI;Lo;0;L;;;;;N;;;;; 1203;ETHIOPIC SYLLABLE HAA;Lo;0;L;;;;;N;;;;; 1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;; 1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;; 1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;; 1207;ETHIOPIC SYLLABLE HOA;Lo;0;L;;;;;N;;;;; 1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;; 1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;; 120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;; 120B;ETHIOPIC SYLLABLE LAA;Lo;0;L;;;;;N;;;;; 120C;ETHIOPIC SYLLABLE LEE;Lo;0;L;;;;;N;;;;; 120D;ETHIOPIC SYLLABLE LE;Lo;0;L;;;;;N;;;;; 120E;ETHIOPIC SYLLABLE LO;Lo;0;L;;;;;N;;;;; 120F;ETHIOPIC SYLLABLE LWA;Lo;0;L;;;;;N;;;;; 1210;ETHIOPIC SYLLABLE HHA;Lo;0;L;;;;;N;;;;; 1211;ETHIOPIC SYLLABLE HHU;Lo;0;L;;;;;N;;;;; 1212;ETHIOPIC SYLLABLE HHI;Lo;0;L;;;;;N;;;;; 1213;ETHIOPIC SYLLABLE HHAA;Lo;0;L;;;;;N;;;;; 1214;ETHIOPIC SYLLABLE HHEE;Lo;0;L;;;;;N;;;;; 1215;ETHIOPIC SYLLABLE HHE;Lo;0;L;;;;;N;;;;; 1216;ETHIOPIC SYLLABLE HHO;Lo;0;L;;;;;N;;;;; 1217;ETHIOPIC SYLLABLE HHWA;Lo;0;L;;;;;N;;;;; 1218;ETHIOPIC SYLLABLE MA;Lo;0;L;;;;;N;;;;; 1219;ETHIOPIC SYLLABLE MU;Lo;0;L;;;;;N;;;;; 121A;ETHIOPIC SYLLABLE MI;Lo;0;L;;;;;N;;;;; 121B;ETHIOPIC SYLLABLE MAA;Lo;0;L;;;;;N;;;;; 121C;ETHIOPIC SYLLABLE MEE;Lo;0;L;;;;;N;;;;; 121D;ETHIOPIC SYLLABLE ME;Lo;0;L;;;;;N;;;;; 121E;ETHIOPIC SYLLABLE MO;Lo;0;L;;;;;N;;;;; 121F;ETHIOPIC SYLLABLE MWA;Lo;0;L;;;;;N;;;;; 1220;ETHIOPIC SYLLABLE SZA;Lo;0;L;;;;;N;;;;; 1221;ETHIOPIC SYLLABLE SZU;Lo;0;L;;;;;N;;;;; 1222;ETHIOPIC SYLLABLE SZI;Lo;0;L;;;;;N;;;;; 1223;ETHIOPIC SYLLABLE SZAA;Lo;0;L;;;;;N;;;;; 1224;ETHIOPIC SYLLABLE SZEE;Lo;0;L;;;;;N;;;;; 1225;ETHIOPIC SYLLABLE SZE;Lo;0;L;;;;;N;;;;; 1226;ETHIOPIC SYLLABLE SZO;Lo;0;L;;;;;N;;;;; 1227;ETHIOPIC SYLLABLE SZWA;Lo;0;L;;;;;N;;;;; 1228;ETHIOPIC SYLLABLE RA;Lo;0;L;;;;;N;;;;; 1229;ETHIOPIC SYLLABLE RU;Lo;0;L;;;;;N;;;;; 122A;ETHIOPIC SYLLABLE RI;Lo;0;L;;;;;N;;;;; 122B;ETHIOPIC SYLLABLE RAA;Lo;0;L;;;;;N;;;;; 122C;ETHIOPIC SYLLABLE REE;Lo;0;L;;;;;N;;;;; 122D;ETHIOPIC SYLLABLE RE;Lo;0;L;;;;;N;;;;; 122E;ETHIOPIC SYLLABLE RO;Lo;0;L;;;;;N;;;;; 122F;ETHIOPIC SYLLABLE RWA;Lo;0;L;;;;;N;;;;; 1230;ETHIOPIC SYLLABLE SA;Lo;0;L;;;;;N;;;;; 1231;ETHIOPIC SYLLABLE SU;Lo;0;L;;;;;N;;;;; 1232;ETHIOPIC SYLLABLE SI;Lo;0;L;;;;;N;;;;; 1233;ETHIOPIC SYLLABLE SAA;Lo;0;L;;;;;N;;;;; 1234;ETHIOPIC SYLLABLE SEE;Lo;0;L;;;;;N;;;;; 1235;ETHIOPIC SYLLABLE SE;Lo;0;L;;;;;N;;;;; 1236;ETHIOPIC SYLLABLE SO;Lo;0;L;;;;;N;;;;; 1237;ETHIOPIC SYLLABLE SWA;Lo;0;L;;;;;N;;;;; 1238;ETHIOPIC SYLLABLE SHA;Lo;0;L;;;;;N;;;;; 1239;ETHIOPIC SYLLABLE SHU;Lo;0;L;;;;;N;;;;; 123A;ETHIOPIC SYLLABLE SHI;Lo;0;L;;;;;N;;;;; 123B;ETHIOPIC SYLLABLE SHAA;Lo;0;L;;;;;N;;;;; 123C;ETHIOPIC SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; 123D;ETHIOPIC SYLLABLE SHE;Lo;0;L;;;;;N;;;;; 123E;ETHIOPIC SYLLABLE SHO;Lo;0;L;;;;;N;;;;; 123F;ETHIOPIC SYLLABLE SHWA;Lo;0;L;;;;;N;;;;; 1240;ETHIOPIC SYLLABLE QA;Lo;0;L;;;;;N;;;;; 1241;ETHIOPIC SYLLABLE QU;Lo;0;L;;;;;N;;;;; 1242;ETHIOPIC SYLLABLE QI;Lo;0;L;;;;;N;;;;; 1243;ETHIOPIC SYLLABLE QAA;Lo;0;L;;;;;N;;;;; 1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;; 1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;; 1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;; 1247;ETHIOPIC SYLLABLE QOA;Lo;0;L;;;;;N;;;;; 1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;; 124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;; 124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;; 124C;ETHIOPIC SYLLABLE QWEE;Lo;0;L;;;;;N;;;;; 124D;ETHIOPIC SYLLABLE QWE;Lo;0;L;;;;;N;;;;; 1250;ETHIOPIC SYLLABLE QHA;Lo;0;L;;;;;N;;;;; 1251;ETHIOPIC SYLLABLE QHU;Lo;0;L;;;;;N;;;;; 1252;ETHIOPIC SYLLABLE QHI;Lo;0;L;;;;;N;;;;; 1253;ETHIOPIC SYLLABLE QHAA;Lo;0;L;;;;;N;;;;; 1254;ETHIOPIC SYLLABLE QHEE;Lo;0;L;;;;;N;;;;; 1255;ETHIOPIC SYLLABLE QHE;Lo;0;L;;;;;N;;;;; 1256;ETHIOPIC SYLLABLE QHO;Lo;0;L;;;;;N;;;;; 1258;ETHIOPIC SYLLABLE QHWA;Lo;0;L;;;;;N;;;;; 125A;ETHIOPIC SYLLABLE QHWI;Lo;0;L;;;;;N;;;;; 125B;ETHIOPIC SYLLABLE QHWAA;Lo;0;L;;;;;N;;;;; 125C;ETHIOPIC SYLLABLE QHWEE;Lo;0;L;;;;;N;;;;; 125D;ETHIOPIC SYLLABLE QHWE;Lo;0;L;;;;;N;;;;; 1260;ETHIOPIC SYLLABLE BA;Lo;0;L;;;;;N;;;;; 1261;ETHIOPIC SYLLABLE BU;Lo;0;L;;;;;N;;;;; 1262;ETHIOPIC SYLLABLE BI;Lo;0;L;;;;;N;;;;; 1263;ETHIOPIC SYLLABLE BAA;Lo;0;L;;;;;N;;;;; 1264;ETHIOPIC SYLLABLE BEE;Lo;0;L;;;;;N;;;;; 1265;ETHIOPIC SYLLABLE BE;Lo;0;L;;;;;N;;;;; 1266;ETHIOPIC SYLLABLE BO;Lo;0;L;;;;;N;;;;; 1267;ETHIOPIC SYLLABLE BWA;Lo;0;L;;;;;N;;;;; 1268;ETHIOPIC SYLLABLE VA;Lo;0;L;;;;;N;;;;; 1269;ETHIOPIC SYLLABLE VU;Lo;0;L;;;;;N;;;;; 126A;ETHIOPIC SYLLABLE VI;Lo;0;L;;;;;N;;;;; 126B;ETHIOPIC SYLLABLE VAA;Lo;0;L;;;;;N;;;;; 126C;ETHIOPIC SYLLABLE VEE;Lo;0;L;;;;;N;;;;; 126D;ETHIOPIC SYLLABLE VE;Lo;0;L;;;;;N;;;;; 126E;ETHIOPIC SYLLABLE VO;Lo;0;L;;;;;N;;;;; 126F;ETHIOPIC SYLLABLE VWA;Lo;0;L;;;;;N;;;;; 1270;ETHIOPIC SYLLABLE TA;Lo;0;L;;;;;N;;;;; 1271;ETHIOPIC SYLLABLE TU;Lo;0;L;;;;;N;;;;; 1272;ETHIOPIC SYLLABLE TI;Lo;0;L;;;;;N;;;;; 1273;ETHIOPIC SYLLABLE TAA;Lo;0;L;;;;;N;;;;; 1274;ETHIOPIC SYLLABLE TEE;Lo;0;L;;;;;N;;;;; 1275;ETHIOPIC SYLLABLE TE;Lo;0;L;;;;;N;;;;; 1276;ETHIOPIC SYLLABLE TO;Lo;0;L;;;;;N;;;;; 1277;ETHIOPIC SYLLABLE TWA;Lo;0;L;;;;;N;;;;; 1278;ETHIOPIC SYLLABLE CA;Lo;0;L;;;;;N;;;;; 1279;ETHIOPIC SYLLABLE CU;Lo;0;L;;;;;N;;;;; 127A;ETHIOPIC SYLLABLE CI;Lo;0;L;;;;;N;;;;; 127B;ETHIOPIC SYLLABLE CAA;Lo;0;L;;;;;N;;;;; 127C;ETHIOPIC SYLLABLE CEE;Lo;0;L;;;;;N;;;;; 127D;ETHIOPIC SYLLABLE CE;Lo;0;L;;;;;N;;;;; 127E;ETHIOPIC SYLLABLE CO;Lo;0;L;;;;;N;;;;; 127F;ETHIOPIC SYLLABLE CWA;Lo;0;L;;;;;N;;;;; 1280;ETHIOPIC SYLLABLE XA;Lo;0;L;;;;;N;;;;; 1281;ETHIOPIC SYLLABLE XU;Lo;0;L;;;;;N;;;;; 1282;ETHIOPIC SYLLABLE XI;Lo;0;L;;;;;N;;;;; 1283;ETHIOPIC SYLLABLE XAA;Lo;0;L;;;;;N;;;;; 1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;; 1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;; 1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;; 1287;ETHIOPIC SYLLABLE XOA;Lo;0;L;;;;;N;;;;; 1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;; 128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;; 128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;; 128C;ETHIOPIC SYLLABLE XWEE;Lo;0;L;;;;;N;;;;; 128D;ETHIOPIC SYLLABLE XWE;Lo;0;L;;;;;N;;;;; 1290;ETHIOPIC SYLLABLE NA;Lo;0;L;;;;;N;;;;; 1291;ETHIOPIC SYLLABLE NU;Lo;0;L;;;;;N;;;;; 1292;ETHIOPIC SYLLABLE NI;Lo;0;L;;;;;N;;;;; 1293;ETHIOPIC SYLLABLE NAA;Lo;0;L;;;;;N;;;;; 1294;ETHIOPIC SYLLABLE NEE;Lo;0;L;;;;;N;;;;; 1295;ETHIOPIC SYLLABLE NE;Lo;0;L;;;;;N;;;;; 1296;ETHIOPIC SYLLABLE NO;Lo;0;L;;;;;N;;;;; 1297;ETHIOPIC SYLLABLE NWA;Lo;0;L;;;;;N;;;;; 1298;ETHIOPIC SYLLABLE NYA;Lo;0;L;;;;;N;;;;; 1299;ETHIOPIC SYLLABLE NYU;Lo;0;L;;;;;N;;;;; 129A;ETHIOPIC SYLLABLE NYI;Lo;0;L;;;;;N;;;;; 129B;ETHIOPIC SYLLABLE NYAA;Lo;0;L;;;;;N;;;;; 129C;ETHIOPIC SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; 129D;ETHIOPIC SYLLABLE NYE;Lo;0;L;;;;;N;;;;; 129E;ETHIOPIC SYLLABLE NYO;Lo;0;L;;;;;N;;;;; 129F;ETHIOPIC SYLLABLE NYWA;Lo;0;L;;;;;N;;;;; 12A0;ETHIOPIC SYLLABLE GLOTTAL A;Lo;0;L;;;;;N;;;;; 12A1;ETHIOPIC SYLLABLE GLOTTAL U;Lo;0;L;;;;;N;;;;; 12A2;ETHIOPIC SYLLABLE GLOTTAL I;Lo;0;L;;;;;N;;;;; 12A3;ETHIOPIC SYLLABLE GLOTTAL AA;Lo;0;L;;;;;N;;;;; 12A4;ETHIOPIC SYLLABLE GLOTTAL EE;Lo;0;L;;;;;N;;;;; 12A5;ETHIOPIC SYLLABLE GLOTTAL E;Lo;0;L;;;;;N;;;;; 12A6;ETHIOPIC SYLLABLE GLOTTAL O;Lo;0;L;;;;;N;;;;; 12A7;ETHIOPIC SYLLABLE GLOTTAL WA;Lo;0;L;;;;;N;;;;; 12A8;ETHIOPIC SYLLABLE KA;Lo;0;L;;;;;N;;;;; 12A9;ETHIOPIC SYLLABLE KU;Lo;0;L;;;;;N;;;;; 12AA;ETHIOPIC SYLLABLE KI;Lo;0;L;;;;;N;;;;; 12AB;ETHIOPIC SYLLABLE KAA;Lo;0;L;;;;;N;;;;; 12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;; 12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;; 12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;; 12AF;ETHIOPIC SYLLABLE KOA;Lo;0;L;;;;;N;;;;; 12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;; 12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;; 12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;; 12B4;ETHIOPIC SYLLABLE KWEE;Lo;0;L;;;;;N;;;;; 12B5;ETHIOPIC SYLLABLE KWE;Lo;0;L;;;;;N;;;;; 12B8;ETHIOPIC SYLLABLE KXA;Lo;0;L;;;;;N;;;;; 12B9;ETHIOPIC SYLLABLE KXU;Lo;0;L;;;;;N;;;;; 12BA;ETHIOPIC SYLLABLE KXI;Lo;0;L;;;;;N;;;;; 12BB;ETHIOPIC SYLLABLE KXAA;Lo;0;L;;;;;N;;;;; 12BC;ETHIOPIC SYLLABLE KXEE;Lo;0;L;;;;;N;;;;; 12BD;ETHIOPIC SYLLABLE KXE;Lo;0;L;;;;;N;;;;; 12BE;ETHIOPIC SYLLABLE KXO;Lo;0;L;;;;;N;;;;; 12C0;ETHIOPIC SYLLABLE KXWA;Lo;0;L;;;;;N;;;;; 12C2;ETHIOPIC SYLLABLE KXWI;Lo;0;L;;;;;N;;;;; 12C3;ETHIOPIC SYLLABLE KXWAA;Lo;0;L;;;;;N;;;;; 12C4;ETHIOPIC SYLLABLE KXWEE;Lo;0;L;;;;;N;;;;; 12C5;ETHIOPIC SYLLABLE KXWE;Lo;0;L;;;;;N;;;;; 12C8;ETHIOPIC SYLLABLE WA;Lo;0;L;;;;;N;;;;; 12C9;ETHIOPIC SYLLABLE WU;Lo;0;L;;;;;N;;;;; 12CA;ETHIOPIC SYLLABLE WI;Lo;0;L;;;;;N;;;;; 12CB;ETHIOPIC SYLLABLE WAA;Lo;0;L;;;;;N;;;;; 12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;; 12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;; 12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;; 12CF;ETHIOPIC SYLLABLE WOA;Lo;0;L;;;;;N;;;;; 12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;; 12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;; 12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;; 12D3;ETHIOPIC SYLLABLE PHARYNGEAL AA;Lo;0;L;;;;;N;;;;; 12D4;ETHIOPIC SYLLABLE PHARYNGEAL EE;Lo;0;L;;;;;N;;;;; 12D5;ETHIOPIC SYLLABLE PHARYNGEAL E;Lo;0;L;;;;;N;;;;; 12D6;ETHIOPIC SYLLABLE PHARYNGEAL O;Lo;0;L;;;;;N;;;;; 12D8;ETHIOPIC SYLLABLE ZA;Lo;0;L;;;;;N;;;;; 12D9;ETHIOPIC SYLLABLE ZU;Lo;0;L;;;;;N;;;;; 12DA;ETHIOPIC SYLLABLE ZI;Lo;0;L;;;;;N;;;;; 12DB;ETHIOPIC SYLLABLE ZAA;Lo;0;L;;;;;N;;;;; 12DC;ETHIOPIC SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; 12DD;ETHIOPIC SYLLABLE ZE;Lo;0;L;;;;;N;;;;; 12DE;ETHIOPIC SYLLABLE ZO;Lo;0;L;;;;;N;;;;; 12DF;ETHIOPIC SYLLABLE ZWA;Lo;0;L;;;;;N;;;;; 12E0;ETHIOPIC SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; 12E1;ETHIOPIC SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; 12E2;ETHIOPIC SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; 12E3;ETHIOPIC SYLLABLE ZHAA;Lo;0;L;;;;;N;;;;; 12E4;ETHIOPIC SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; 12E5;ETHIOPIC SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; 12E6;ETHIOPIC SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; 12E7;ETHIOPIC SYLLABLE ZHWA;Lo;0;L;;;;;N;;;;; 12E8;ETHIOPIC SYLLABLE YA;Lo;0;L;;;;;N;;;;; 12E9;ETHIOPIC SYLLABLE YU;Lo;0;L;;;;;N;;;;; 12EA;ETHIOPIC SYLLABLE YI;Lo;0;L;;;;;N;;;;; 12EB;ETHIOPIC SYLLABLE YAA;Lo;0;L;;;;;N;;;;; 12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;; 12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;; 12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;; 12EF;ETHIOPIC SYLLABLE YOA;Lo;0;L;;;;;N;;;;; 12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;; 12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;; 12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;; 12F3;ETHIOPIC SYLLABLE DAA;Lo;0;L;;;;;N;;;;; 12F4;ETHIOPIC SYLLABLE DEE;Lo;0;L;;;;;N;;;;; 12F5;ETHIOPIC SYLLABLE DE;Lo;0;L;;;;;N;;;;; 12F6;ETHIOPIC SYLLABLE DO;Lo;0;L;;;;;N;;;;; 12F7;ETHIOPIC SYLLABLE DWA;Lo;0;L;;;;;N;;;;; 12F8;ETHIOPIC SYLLABLE DDA;Lo;0;L;;;;;N;;;;; 12F9;ETHIOPIC SYLLABLE DDU;Lo;0;L;;;;;N;;;;; 12FA;ETHIOPIC SYLLABLE DDI;Lo;0;L;;;;;N;;;;; 12FB;ETHIOPIC SYLLABLE DDAA;Lo;0;L;;;;;N;;;;; 12FC;ETHIOPIC SYLLABLE DDEE;Lo;0;L;;;;;N;;;;; 12FD;ETHIOPIC SYLLABLE DDE;Lo;0;L;;;;;N;;;;; 12FE;ETHIOPIC SYLLABLE DDO;Lo;0;L;;;;;N;;;;; 12FF;ETHIOPIC SYLLABLE DDWA;Lo;0;L;;;;;N;;;;; 1300;ETHIOPIC SYLLABLE JA;Lo;0;L;;;;;N;;;;; 1301;ETHIOPIC SYLLABLE JU;Lo;0;L;;;;;N;;;;; 1302;ETHIOPIC SYLLABLE JI;Lo;0;L;;;;;N;;;;; 1303;ETHIOPIC SYLLABLE JAA;Lo;0;L;;;;;N;;;;; 1304;ETHIOPIC SYLLABLE JEE;Lo;0;L;;;;;N;;;;; 1305;ETHIOPIC SYLLABLE JE;Lo;0;L;;;;;N;;;;; 1306;ETHIOPIC SYLLABLE JO;Lo;0;L;;;;;N;;;;; 1307;ETHIOPIC SYLLABLE JWA;Lo;0;L;;;;;N;;;;; 1308;ETHIOPIC SYLLABLE GA;Lo;0;L;;;;;N;;;;; 1309;ETHIOPIC SYLLABLE GU;Lo;0;L;;;;;N;;;;; 130A;ETHIOPIC SYLLABLE GI;Lo;0;L;;;;;N;;;;; 130B;ETHIOPIC SYLLABLE GAA;Lo;0;L;;;;;N;;;;; 130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;; 130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;; 130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;; 130F;ETHIOPIC SYLLABLE GOA;Lo;0;L;;;;;N;;;;; 1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;; 1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;; 1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;; 1314;ETHIOPIC SYLLABLE GWEE;Lo;0;L;;;;;N;;;;; 1315;ETHIOPIC SYLLABLE GWE;Lo;0;L;;;;;N;;;;; 1318;ETHIOPIC SYLLABLE GGA;Lo;0;L;;;;;N;;;;; 1319;ETHIOPIC SYLLABLE GGU;Lo;0;L;;;;;N;;;;; 131A;ETHIOPIC SYLLABLE GGI;Lo;0;L;;;;;N;;;;; 131B;ETHIOPIC SYLLABLE GGAA;Lo;0;L;;;;;N;;;;; 131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;; 131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;; 131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;; 131F;ETHIOPIC SYLLABLE GGWAA;Lo;0;L;;;;;N;;;;; 1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;; 1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;; 1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;; 1323;ETHIOPIC SYLLABLE THAA;Lo;0;L;;;;;N;;;;; 1324;ETHIOPIC SYLLABLE THEE;Lo;0;L;;;;;N;;;;; 1325;ETHIOPIC SYLLABLE THE;Lo;0;L;;;;;N;;;;; 1326;ETHIOPIC SYLLABLE THO;Lo;0;L;;;;;N;;;;; 1327;ETHIOPIC SYLLABLE THWA;Lo;0;L;;;;;N;;;;; 1328;ETHIOPIC SYLLABLE CHA;Lo;0;L;;;;;N;;;;; 1329;ETHIOPIC SYLLABLE CHU;Lo;0;L;;;;;N;;;;; 132A;ETHIOPIC SYLLABLE CHI;Lo;0;L;;;;;N;;;;; 132B;ETHIOPIC SYLLABLE CHAA;Lo;0;L;;;;;N;;;;; 132C;ETHIOPIC SYLLABLE CHEE;Lo;0;L;;;;;N;;;;; 132D;ETHIOPIC SYLLABLE CHE;Lo;0;L;;;;;N;;;;; 132E;ETHIOPIC SYLLABLE CHO;Lo;0;L;;;;;N;;;;; 132F;ETHIOPIC SYLLABLE CHWA;Lo;0;L;;;;;N;;;;; 1330;ETHIOPIC SYLLABLE PHA;Lo;0;L;;;;;N;;;;; 1331;ETHIOPIC SYLLABLE PHU;Lo;0;L;;;;;N;;;;; 1332;ETHIOPIC SYLLABLE PHI;Lo;0;L;;;;;N;;;;; 1333;ETHIOPIC SYLLABLE PHAA;Lo;0;L;;;;;N;;;;; 1334;ETHIOPIC SYLLABLE PHEE;Lo;0;L;;;;;N;;;;; 1335;ETHIOPIC SYLLABLE PHE;Lo;0;L;;;;;N;;;;; 1336;ETHIOPIC SYLLABLE PHO;Lo;0;L;;;;;N;;;;; 1337;ETHIOPIC SYLLABLE PHWA;Lo;0;L;;;;;N;;;;; 1338;ETHIOPIC SYLLABLE TSA;Lo;0;L;;;;;N;;;;; 1339;ETHIOPIC SYLLABLE TSU;Lo;0;L;;;;;N;;;;; 133A;ETHIOPIC SYLLABLE TSI;Lo;0;L;;;;;N;;;;; 133B;ETHIOPIC SYLLABLE TSAA;Lo;0;L;;;;;N;;;;; 133C;ETHIOPIC SYLLABLE TSEE;Lo;0;L;;;;;N;;;;; 133D;ETHIOPIC SYLLABLE TSE;Lo;0;L;;;;;N;;;;; 133E;ETHIOPIC SYLLABLE TSO;Lo;0;L;;;;;N;;;;; 133F;ETHIOPIC SYLLABLE TSWA;Lo;0;L;;;;;N;;;;; 1340;ETHIOPIC SYLLABLE TZA;Lo;0;L;;;;;N;;;;; 1341;ETHIOPIC SYLLABLE TZU;Lo;0;L;;;;;N;;;;; 1342;ETHIOPIC SYLLABLE TZI;Lo;0;L;;;;;N;;;;; 1343;ETHIOPIC SYLLABLE TZAA;Lo;0;L;;;;;N;;;;; 1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;; 1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;; 1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;; 1347;ETHIOPIC SYLLABLE TZOA;Lo;0;L;;;;;N;;;;; 1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;; 1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;; 134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;; 134B;ETHIOPIC SYLLABLE FAA;Lo;0;L;;;;;N;;;;; 134C;ETHIOPIC SYLLABLE FEE;Lo;0;L;;;;;N;;;;; 134D;ETHIOPIC SYLLABLE FE;Lo;0;L;;;;;N;;;;; 134E;ETHIOPIC SYLLABLE FO;Lo;0;L;;;;;N;;;;; 134F;ETHIOPIC SYLLABLE FWA;Lo;0;L;;;;;N;;;;; 1350;ETHIOPIC SYLLABLE PA;Lo;0;L;;;;;N;;;;; 1351;ETHIOPIC SYLLABLE PU;Lo;0;L;;;;;N;;;;; 1352;ETHIOPIC SYLLABLE PI;Lo;0;L;;;;;N;;;;; 1353;ETHIOPIC SYLLABLE PAA;Lo;0;L;;;;;N;;;;; 1354;ETHIOPIC SYLLABLE PEE;Lo;0;L;;;;;N;;;;; 1355;ETHIOPIC SYLLABLE PE;Lo;0;L;;;;;N;;;;; 1356;ETHIOPIC SYLLABLE PO;Lo;0;L;;;;;N;;;;; 1357;ETHIOPIC SYLLABLE PWA;Lo;0;L;;;;;N;;;;; 1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;; 1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;; 135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;; 135D;ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK;Mn;230;NSM;;;;;N;;;;; 135E;ETHIOPIC COMBINING VOWEL LENGTH MARK;Mn;230;NSM;;;;;N;;;;; 135F;ETHIOPIC COMBINING GEMINATION MARK;Mn;230;NSM;;;;;N;;;;; 1360;ETHIOPIC SECTION MARK;Po;0;L;;;;;N;;;;; 1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;; 1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;; 1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;; 1364;ETHIOPIC SEMICOLON;Po;0;L;;;;;N;;;;; 1365;ETHIOPIC COLON;Po;0;L;;;;;N;;;;; 1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;; 1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;; 1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; 1369;ETHIOPIC DIGIT ONE;No;0;L;;;1;1;N;;;;; 136A;ETHIOPIC DIGIT TWO;No;0;L;;;2;2;N;;;;; 136B;ETHIOPIC DIGIT THREE;No;0;L;;;3;3;N;;;;; 136C;ETHIOPIC DIGIT FOUR;No;0;L;;;4;4;N;;;;; 136D;ETHIOPIC DIGIT FIVE;No;0;L;;;5;5;N;;;;; 136E;ETHIOPIC DIGIT SIX;No;0;L;;;6;6;N;;;;; 136F;ETHIOPIC DIGIT SEVEN;No;0;L;;;7;7;N;;;;; 1370;ETHIOPIC DIGIT EIGHT;No;0;L;;;8;8;N;;;;; 1371;ETHIOPIC DIGIT NINE;No;0;L;;;9;9;N;;;;; 1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;; 1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; 1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; 1375;ETHIOPIC NUMBER FORTY;No;0;L;;;;40;N;;;;; 1376;ETHIOPIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; 1377;ETHIOPIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; 1378;ETHIOPIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; 1379;ETHIOPIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; 137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;; 137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;; 137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; 1380;ETHIOPIC SYLLABLE SEBATBEIT MWA;Lo;0;L;;;;;N;;;;; 1381;ETHIOPIC SYLLABLE MWI;Lo;0;L;;;;;N;;;;; 1382;ETHIOPIC SYLLABLE MWEE;Lo;0;L;;;;;N;;;;; 1383;ETHIOPIC SYLLABLE MWE;Lo;0;L;;;;;N;;;;; 1384;ETHIOPIC SYLLABLE SEBATBEIT BWA;Lo;0;L;;;;;N;;;;; 1385;ETHIOPIC SYLLABLE BWI;Lo;0;L;;;;;N;;;;; 1386;ETHIOPIC SYLLABLE BWEE;Lo;0;L;;;;;N;;;;; 1387;ETHIOPIC SYLLABLE BWE;Lo;0;L;;;;;N;;;;; 1388;ETHIOPIC SYLLABLE SEBATBEIT FWA;Lo;0;L;;;;;N;;;;; 1389;ETHIOPIC SYLLABLE FWI;Lo;0;L;;;;;N;;;;; 138A;ETHIOPIC SYLLABLE FWEE;Lo;0;L;;;;;N;;;;; 138B;ETHIOPIC SYLLABLE FWE;Lo;0;L;;;;;N;;;;; 138C;ETHIOPIC SYLLABLE SEBATBEIT PWA;Lo;0;L;;;;;N;;;;; 138D;ETHIOPIC SYLLABLE PWI;Lo;0;L;;;;;N;;;;; 138E;ETHIOPIC SYLLABLE PWEE;Lo;0;L;;;;;N;;;;; 138F;ETHIOPIC SYLLABLE PWE;Lo;0;L;;;;;N;;;;; 1390;ETHIOPIC TONAL MARK YIZET;So;0;ON;;;;;N;;;;; 1391;ETHIOPIC TONAL MARK DERET;So;0;ON;;;;;N;;;;; 1392;ETHIOPIC TONAL MARK RIKRIK;So;0;ON;;;;;N;;;;; 1393;ETHIOPIC TONAL MARK SHORT RIKRIK;So;0;ON;;;;;N;;;;; 1394;ETHIOPIC TONAL MARK DIFAT;So;0;ON;;;;;N;;;;; 1395;ETHIOPIC TONAL MARK KENAT;So;0;ON;;;;;N;;;;; 1396;ETHIOPIC TONAL MARK CHIRET;So;0;ON;;;;;N;;;;; 1397;ETHIOPIC TONAL MARK HIDET;So;0;ON;;;;;N;;;;; 1398;ETHIOPIC TONAL MARK DERET-HIDET;So;0;ON;;;;;N;;;;; 1399;ETHIOPIC TONAL MARK KURT;So;0;ON;;;;;N;;;;; 13A0;CHEROKEE LETTER A;Lu;0;L;;;;;N;;;;AB70; 13A1;CHEROKEE LETTER E;Lu;0;L;;;;;N;;;;AB71; 13A2;CHEROKEE LETTER I;Lu;0;L;;;;;N;;;;AB72; 13A3;CHEROKEE LETTER O;Lu;0;L;;;;;N;;;;AB73; 13A4;CHEROKEE LETTER U;Lu;0;L;;;;;N;;;;AB74; 13A5;CHEROKEE LETTER V;Lu;0;L;;;;;N;;;;AB75; 13A6;CHEROKEE LETTER GA;Lu;0;L;;;;;N;;;;AB76; 13A7;CHEROKEE LETTER KA;Lu;0;L;;;;;N;;;;AB77; 13A8;CHEROKEE LETTER GE;Lu;0;L;;;;;N;;;;AB78; 13A9;CHEROKEE LETTER GI;Lu;0;L;;;;;N;;;;AB79; 13AA;CHEROKEE LETTER GO;Lu;0;L;;;;;N;;;;AB7A; 13AB;CHEROKEE LETTER GU;Lu;0;L;;;;;N;;;;AB7B; 13AC;CHEROKEE LETTER GV;Lu;0;L;;;;;N;;;;AB7C; 13AD;CHEROKEE LETTER HA;Lu;0;L;;;;;N;;;;AB7D; 13AE;CHEROKEE LETTER HE;Lu;0;L;;;;;N;;;;AB7E; 13AF;CHEROKEE LETTER HI;Lu;0;L;;;;;N;;;;AB7F; 13B0;CHEROKEE LETTER HO;Lu;0;L;;;;;N;;;;AB80; 13B1;CHEROKEE LETTER HU;Lu;0;L;;;;;N;;;;AB81; 13B2;CHEROKEE LETTER HV;Lu;0;L;;;;;N;;;;AB82; 13B3;CHEROKEE LETTER LA;Lu;0;L;;;;;N;;;;AB83; 13B4;CHEROKEE LETTER LE;Lu;0;L;;;;;N;;;;AB84; 13B5;CHEROKEE LETTER LI;Lu;0;L;;;;;N;;;;AB85; 13B6;CHEROKEE LETTER LO;Lu;0;L;;;;;N;;;;AB86; 13B7;CHEROKEE LETTER LU;Lu;0;L;;;;;N;;;;AB87; 13B8;CHEROKEE LETTER LV;Lu;0;L;;;;;N;;;;AB88; 13B9;CHEROKEE LETTER MA;Lu;0;L;;;;;N;;;;AB89; 13BA;CHEROKEE LETTER ME;Lu;0;L;;;;;N;;;;AB8A; 13BB;CHEROKEE LETTER MI;Lu;0;L;;;;;N;;;;AB8B; 13BC;CHEROKEE LETTER MO;Lu;0;L;;;;;N;;;;AB8C; 13BD;CHEROKEE LETTER MU;Lu;0;L;;;;;N;;;;AB8D; 13BE;CHEROKEE LETTER NA;Lu;0;L;;;;;N;;;;AB8E; 13BF;CHEROKEE LETTER HNA;Lu;0;L;;;;;N;;;;AB8F; 13C0;CHEROKEE LETTER NAH;Lu;0;L;;;;;N;;;;AB90; 13C1;CHEROKEE LETTER NE;Lu;0;L;;;;;N;;;;AB91; 13C2;CHEROKEE LETTER NI;Lu;0;L;;;;;N;;;;AB92; 13C3;CHEROKEE LETTER NO;Lu;0;L;;;;;N;;;;AB93; 13C4;CHEROKEE LETTER NU;Lu;0;L;;;;;N;;;;AB94; 13C5;CHEROKEE LETTER NV;Lu;0;L;;;;;N;;;;AB95; 13C6;CHEROKEE LETTER QUA;Lu;0;L;;;;;N;;;;AB96; 13C7;CHEROKEE LETTER QUE;Lu;0;L;;;;;N;;;;AB97; 13C8;CHEROKEE LETTER QUI;Lu;0;L;;;;;N;;;;AB98; 13C9;CHEROKEE LETTER QUO;Lu;0;L;;;;;N;;;;AB99; 13CA;CHEROKEE LETTER QUU;Lu;0;L;;;;;N;;;;AB9A; 13CB;CHEROKEE LETTER QUV;Lu;0;L;;;;;N;;;;AB9B; 13CC;CHEROKEE LETTER SA;Lu;0;L;;;;;N;;;;AB9C; 13CD;CHEROKEE LETTER S;Lu;0;L;;;;;N;;;;AB9D; 13CE;CHEROKEE LETTER SE;Lu;0;L;;;;;N;;;;AB9E; 13CF;CHEROKEE LETTER SI;Lu;0;L;;;;;N;;;;AB9F; 13D0;CHEROKEE LETTER SO;Lu;0;L;;;;;N;;;;ABA0; 13D1;CHEROKEE LETTER SU;Lu;0;L;;;;;N;;;;ABA1; 13D2;CHEROKEE LETTER SV;Lu;0;L;;;;;N;;;;ABA2; 13D3;CHEROKEE LETTER DA;Lu;0;L;;;;;N;;;;ABA3; 13D4;CHEROKEE LETTER TA;Lu;0;L;;;;;N;;;;ABA4; 13D5;CHEROKEE LETTER DE;Lu;0;L;;;;;N;;;;ABA5; 13D6;CHEROKEE LETTER TE;Lu;0;L;;;;;N;;;;ABA6; 13D7;CHEROKEE LETTER DI;Lu;0;L;;;;;N;;;;ABA7; 13D8;CHEROKEE LETTER TI;Lu;0;L;;;;;N;;;;ABA8; 13D9;CHEROKEE LETTER DO;Lu;0;L;;;;;N;;;;ABA9; 13DA;CHEROKEE LETTER DU;Lu;0;L;;;;;N;;;;ABAA; 13DB;CHEROKEE LETTER DV;Lu;0;L;;;;;N;;;;ABAB; 13DC;CHEROKEE LETTER DLA;Lu;0;L;;;;;N;;;;ABAC; 13DD;CHEROKEE LETTER TLA;Lu;0;L;;;;;N;;;;ABAD; 13DE;CHEROKEE LETTER TLE;Lu;0;L;;;;;N;;;;ABAE; 13DF;CHEROKEE LETTER TLI;Lu;0;L;;;;;N;;;;ABAF; 13E0;CHEROKEE LETTER TLO;Lu;0;L;;;;;N;;;;ABB0; 13E1;CHEROKEE LETTER TLU;Lu;0;L;;;;;N;;;;ABB1; 13E2;CHEROKEE LETTER TLV;Lu;0;L;;;;;N;;;;ABB2; 13E3;CHEROKEE LETTER TSA;Lu;0;L;;;;;N;;;;ABB3; 13E4;CHEROKEE LETTER TSE;Lu;0;L;;;;;N;;;;ABB4; 13E5;CHEROKEE LETTER TSI;Lu;0;L;;;;;N;;;;ABB5; 13E6;CHEROKEE LETTER TSO;Lu;0;L;;;;;N;;;;ABB6; 13E7;CHEROKEE LETTER TSU;Lu;0;L;;;;;N;;;;ABB7; 13E8;CHEROKEE LETTER TSV;Lu;0;L;;;;;N;;;;ABB8; 13E9;CHEROKEE LETTER WA;Lu;0;L;;;;;N;;;;ABB9; 13EA;CHEROKEE LETTER WE;Lu;0;L;;;;;N;;;;ABBA; 13EB;CHEROKEE LETTER WI;Lu;0;L;;;;;N;;;;ABBB; 13EC;CHEROKEE LETTER WO;Lu;0;L;;;;;N;;;;ABBC; 13ED;CHEROKEE LETTER WU;Lu;0;L;;;;;N;;;;ABBD; 13EE;CHEROKEE LETTER WV;Lu;0;L;;;;;N;;;;ABBE; 13EF;CHEROKEE LETTER YA;Lu;0;L;;;;;N;;;;ABBF; 13F0;CHEROKEE LETTER YE;Lu;0;L;;;;;N;;;;13F8; 13F1;CHEROKEE LETTER YI;Lu;0;L;;;;;N;;;;13F9; 13F2;CHEROKEE LETTER YO;Lu;0;L;;;;;N;;;;13FA; 13F3;CHEROKEE LETTER YU;Lu;0;L;;;;;N;;;;13FB; 13F4;CHEROKEE LETTER YV;Lu;0;L;;;;;N;;;;13FC; 13F5;CHEROKEE LETTER MV;Lu;0;L;;;;;N;;;;13FD; 13F8;CHEROKEE SMALL LETTER YE;Ll;0;L;;;;;N;;;13F0;;13F0 13F9;CHEROKEE SMALL LETTER YI;Ll;0;L;;;;;N;;;13F1;;13F1 13FA;CHEROKEE SMALL LETTER YO;Ll;0;L;;;;;N;;;13F2;;13F2 13FB;CHEROKEE SMALL LETTER YU;Ll;0;L;;;;;N;;;13F3;;13F3 13FC;CHEROKEE SMALL LETTER YV;Ll;0;L;;;;;N;;;13F4;;13F4 13FD;CHEROKEE SMALL LETTER MV;Ll;0;L;;;;;N;;;13F5;;13F5 1400;CANADIAN SYLLABICS HYPHEN;Pd;0;ON;;;;;N;;;;; 1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;; 1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;; 1403;CANADIAN SYLLABICS I;Lo;0;L;;;;;N;;;;; 1404;CANADIAN SYLLABICS II;Lo;0;L;;;;;N;;;;; 1405;CANADIAN SYLLABICS O;Lo;0;L;;;;;N;;;;; 1406;CANADIAN SYLLABICS OO;Lo;0;L;;;;;N;;;;; 1407;CANADIAN SYLLABICS Y-CREE OO;Lo;0;L;;;;;N;;;;; 1408;CANADIAN SYLLABICS CARRIER EE;Lo;0;L;;;;;N;;;;; 1409;CANADIAN SYLLABICS CARRIER I;Lo;0;L;;;;;N;;;;; 140A;CANADIAN SYLLABICS A;Lo;0;L;;;;;N;;;;; 140B;CANADIAN SYLLABICS AA;Lo;0;L;;;;;N;;;;; 140C;CANADIAN SYLLABICS WE;Lo;0;L;;;;;N;;;;; 140D;CANADIAN SYLLABICS WEST-CREE WE;Lo;0;L;;;;;N;;;;; 140E;CANADIAN SYLLABICS WI;Lo;0;L;;;;;N;;;;; 140F;CANADIAN SYLLABICS WEST-CREE WI;Lo;0;L;;;;;N;;;;; 1410;CANADIAN SYLLABICS WII;Lo;0;L;;;;;N;;;;; 1411;CANADIAN SYLLABICS WEST-CREE WII;Lo;0;L;;;;;N;;;;; 1412;CANADIAN SYLLABICS WO;Lo;0;L;;;;;N;;;;; 1413;CANADIAN SYLLABICS WEST-CREE WO;Lo;0;L;;;;;N;;;;; 1414;CANADIAN SYLLABICS WOO;Lo;0;L;;;;;N;;;;; 1415;CANADIAN SYLLABICS WEST-CREE WOO;Lo;0;L;;;;;N;;;;; 1416;CANADIAN SYLLABICS NASKAPI WOO;Lo;0;L;;;;;N;;;;; 1417;CANADIAN SYLLABICS WA;Lo;0;L;;;;;N;;;;; 1418;CANADIAN SYLLABICS WEST-CREE WA;Lo;0;L;;;;;N;;;;; 1419;CANADIAN SYLLABICS WAA;Lo;0;L;;;;;N;;;;; 141A;CANADIAN SYLLABICS WEST-CREE WAA;Lo;0;L;;;;;N;;;;; 141B;CANADIAN SYLLABICS NASKAPI WAA;Lo;0;L;;;;;N;;;;; 141C;CANADIAN SYLLABICS AI;Lo;0;L;;;;;N;;;;; 141D;CANADIAN SYLLABICS Y-CREE W;Lo;0;L;;;;;N;;;;; 141E;CANADIAN SYLLABICS GLOTTAL STOP;Lo;0;L;;;;;N;;;;; 141F;CANADIAN SYLLABICS FINAL ACUTE;Lo;0;L;;;;;N;;;;; 1420;CANADIAN SYLLABICS FINAL GRAVE;Lo;0;L;;;;;N;;;;; 1421;CANADIAN SYLLABICS FINAL BOTTOM HALF RING;Lo;0;L;;;;;N;;;;; 1422;CANADIAN SYLLABICS FINAL TOP HALF RING;Lo;0;L;;;;;N;;;;; 1423;CANADIAN SYLLABICS FINAL RIGHT HALF RING;Lo;0;L;;;;;N;;;;; 1424;CANADIAN SYLLABICS FINAL RING;Lo;0;L;;;;;N;;;;; 1425;CANADIAN SYLLABICS FINAL DOUBLE ACUTE;Lo;0;L;;;;;N;;;;; 1426;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES;Lo;0;L;;;;;N;;;;; 1427;CANADIAN SYLLABICS FINAL MIDDLE DOT;Lo;0;L;;;;;N;;;;; 1428;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE;Lo;0;L;;;;;N;;;;; 1429;CANADIAN SYLLABICS FINAL PLUS;Lo;0;L;;;;;N;;;;; 142A;CANADIAN SYLLABICS FINAL DOWN TACK;Lo;0;L;;;;;N;;;;; 142B;CANADIAN SYLLABICS EN;Lo;0;L;;;;;N;;;;; 142C;CANADIAN SYLLABICS IN;Lo;0;L;;;;;N;;;;; 142D;CANADIAN SYLLABICS ON;Lo;0;L;;;;;N;;;;; 142E;CANADIAN SYLLABICS AN;Lo;0;L;;;;;N;;;;; 142F;CANADIAN SYLLABICS PE;Lo;0;L;;;;;N;;;;; 1430;CANADIAN SYLLABICS PAAI;Lo;0;L;;;;;N;;;;; 1431;CANADIAN SYLLABICS PI;Lo;0;L;;;;;N;;;;; 1432;CANADIAN SYLLABICS PII;Lo;0;L;;;;;N;;;;; 1433;CANADIAN SYLLABICS PO;Lo;0;L;;;;;N;;;;; 1434;CANADIAN SYLLABICS POO;Lo;0;L;;;;;N;;;;; 1435;CANADIAN SYLLABICS Y-CREE POO;Lo;0;L;;;;;N;;;;; 1436;CANADIAN SYLLABICS CARRIER HEE;Lo;0;L;;;;;N;;;;; 1437;CANADIAN SYLLABICS CARRIER HI;Lo;0;L;;;;;N;;;;; 1438;CANADIAN SYLLABICS PA;Lo;0;L;;;;;N;;;;; 1439;CANADIAN SYLLABICS PAA;Lo;0;L;;;;;N;;;;; 143A;CANADIAN SYLLABICS PWE;Lo;0;L;;;;;N;;;;; 143B;CANADIAN SYLLABICS WEST-CREE PWE;Lo;0;L;;;;;N;;;;; 143C;CANADIAN SYLLABICS PWI;Lo;0;L;;;;;N;;;;; 143D;CANADIAN SYLLABICS WEST-CREE PWI;Lo;0;L;;;;;N;;;;; 143E;CANADIAN SYLLABICS PWII;Lo;0;L;;;;;N;;;;; 143F;CANADIAN SYLLABICS WEST-CREE PWII;Lo;0;L;;;;;N;;;;; 1440;CANADIAN SYLLABICS PWO;Lo;0;L;;;;;N;;;;; 1441;CANADIAN SYLLABICS WEST-CREE PWO;Lo;0;L;;;;;N;;;;; 1442;CANADIAN SYLLABICS PWOO;Lo;0;L;;;;;N;;;;; 1443;CANADIAN SYLLABICS WEST-CREE PWOO;Lo;0;L;;;;;N;;;;; 1444;CANADIAN SYLLABICS PWA;Lo;0;L;;;;;N;;;;; 1445;CANADIAN SYLLABICS WEST-CREE PWA;Lo;0;L;;;;;N;;;;; 1446;CANADIAN SYLLABICS PWAA;Lo;0;L;;;;;N;;;;; 1447;CANADIAN SYLLABICS WEST-CREE PWAA;Lo;0;L;;;;;N;;;;; 1448;CANADIAN SYLLABICS Y-CREE PWAA;Lo;0;L;;;;;N;;;;; 1449;CANADIAN SYLLABICS P;Lo;0;L;;;;;N;;;;; 144A;CANADIAN SYLLABICS WEST-CREE P;Lo;0;L;;;;;N;;;;; 144B;CANADIAN SYLLABICS CARRIER H;Lo;0;L;;;;;N;;;;; 144C;CANADIAN SYLLABICS TE;Lo;0;L;;;;;N;;;;; 144D;CANADIAN SYLLABICS TAAI;Lo;0;L;;;;;N;;;;; 144E;CANADIAN SYLLABICS TI;Lo;0;L;;;;;N;;;;; 144F;CANADIAN SYLLABICS TII;Lo;0;L;;;;;N;;;;; 1450;CANADIAN SYLLABICS TO;Lo;0;L;;;;;N;;;;; 1451;CANADIAN SYLLABICS TOO;Lo;0;L;;;;;N;;;;; 1452;CANADIAN SYLLABICS Y-CREE TOO;Lo;0;L;;;;;N;;;;; 1453;CANADIAN SYLLABICS CARRIER DEE;Lo;0;L;;;;;N;;;;; 1454;CANADIAN SYLLABICS CARRIER DI;Lo;0;L;;;;;N;;;;; 1455;CANADIAN SYLLABICS TA;Lo;0;L;;;;;N;;;;; 1456;CANADIAN SYLLABICS TAA;Lo;0;L;;;;;N;;;;; 1457;CANADIAN SYLLABICS TWE;Lo;0;L;;;;;N;;;;; 1458;CANADIAN SYLLABICS WEST-CREE TWE;Lo;0;L;;;;;N;;;;; 1459;CANADIAN SYLLABICS TWI;Lo;0;L;;;;;N;;;;; 145A;CANADIAN SYLLABICS WEST-CREE TWI;Lo;0;L;;;;;N;;;;; 145B;CANADIAN SYLLABICS TWII;Lo;0;L;;;;;N;;;;; 145C;CANADIAN SYLLABICS WEST-CREE TWII;Lo;0;L;;;;;N;;;;; 145D;CANADIAN SYLLABICS TWO;Lo;0;L;;;;;N;;;;; 145E;CANADIAN SYLLABICS WEST-CREE TWO;Lo;0;L;;;;;N;;;;; 145F;CANADIAN SYLLABICS TWOO;Lo;0;L;;;;;N;;;;; 1460;CANADIAN SYLLABICS WEST-CREE TWOO;Lo;0;L;;;;;N;;;;; 1461;CANADIAN SYLLABICS TWA;Lo;0;L;;;;;N;;;;; 1462;CANADIAN SYLLABICS WEST-CREE TWA;Lo;0;L;;;;;N;;;;; 1463;CANADIAN SYLLABICS TWAA;Lo;0;L;;;;;N;;;;; 1464;CANADIAN SYLLABICS WEST-CREE TWAA;Lo;0;L;;;;;N;;;;; 1465;CANADIAN SYLLABICS NASKAPI TWAA;Lo;0;L;;;;;N;;;;; 1466;CANADIAN SYLLABICS T;Lo;0;L;;;;;N;;;;; 1467;CANADIAN SYLLABICS TTE;Lo;0;L;;;;;N;;;;; 1468;CANADIAN SYLLABICS TTI;Lo;0;L;;;;;N;;;;; 1469;CANADIAN SYLLABICS TTO;Lo;0;L;;;;;N;;;;; 146A;CANADIAN SYLLABICS TTA;Lo;0;L;;;;;N;;;;; 146B;CANADIAN SYLLABICS KE;Lo;0;L;;;;;N;;;;; 146C;CANADIAN SYLLABICS KAAI;Lo;0;L;;;;;N;;;;; 146D;CANADIAN SYLLABICS KI;Lo;0;L;;;;;N;;;;; 146E;CANADIAN SYLLABICS KII;Lo;0;L;;;;;N;;;;; 146F;CANADIAN SYLLABICS KO;Lo;0;L;;;;;N;;;;; 1470;CANADIAN SYLLABICS KOO;Lo;0;L;;;;;N;;;;; 1471;CANADIAN SYLLABICS Y-CREE KOO;Lo;0;L;;;;;N;;;;; 1472;CANADIAN SYLLABICS KA;Lo;0;L;;;;;N;;;;; 1473;CANADIAN SYLLABICS KAA;Lo;0;L;;;;;N;;;;; 1474;CANADIAN SYLLABICS KWE;Lo;0;L;;;;;N;;;;; 1475;CANADIAN SYLLABICS WEST-CREE KWE;Lo;0;L;;;;;N;;;;; 1476;CANADIAN SYLLABICS KWI;Lo;0;L;;;;;N;;;;; 1477;CANADIAN SYLLABICS WEST-CREE KWI;Lo;0;L;;;;;N;;;;; 1478;CANADIAN SYLLABICS KWII;Lo;0;L;;;;;N;;;;; 1479;CANADIAN SYLLABICS WEST-CREE KWII;Lo;0;L;;;;;N;;;;; 147A;CANADIAN SYLLABICS KWO;Lo;0;L;;;;;N;;;;; 147B;CANADIAN SYLLABICS WEST-CREE KWO;Lo;0;L;;;;;N;;;;; 147C;CANADIAN SYLLABICS KWOO;Lo;0;L;;;;;N;;;;; 147D;CANADIAN SYLLABICS WEST-CREE KWOO;Lo;0;L;;;;;N;;;;; 147E;CANADIAN SYLLABICS KWA;Lo;0;L;;;;;N;;;;; 147F;CANADIAN SYLLABICS WEST-CREE KWA;Lo;0;L;;;;;N;;;;; 1480;CANADIAN SYLLABICS KWAA;Lo;0;L;;;;;N;;;;; 1481;CANADIAN SYLLABICS WEST-CREE KWAA;Lo;0;L;;;;;N;;;;; 1482;CANADIAN SYLLABICS NASKAPI KWAA;Lo;0;L;;;;;N;;;;; 1483;CANADIAN SYLLABICS K;Lo;0;L;;;;;N;;;;; 1484;CANADIAN SYLLABICS KW;Lo;0;L;;;;;N;;;;; 1485;CANADIAN SYLLABICS SOUTH-SLAVEY KEH;Lo;0;L;;;;;N;;;;; 1486;CANADIAN SYLLABICS SOUTH-SLAVEY KIH;Lo;0;L;;;;;N;;;;; 1487;CANADIAN SYLLABICS SOUTH-SLAVEY KOH;Lo;0;L;;;;;N;;;;; 1488;CANADIAN SYLLABICS SOUTH-SLAVEY KAH;Lo;0;L;;;;;N;;;;; 1489;CANADIAN SYLLABICS CE;Lo;0;L;;;;;N;;;;; 148A;CANADIAN SYLLABICS CAAI;Lo;0;L;;;;;N;;;;; 148B;CANADIAN SYLLABICS CI;Lo;0;L;;;;;N;;;;; 148C;CANADIAN SYLLABICS CII;Lo;0;L;;;;;N;;;;; 148D;CANADIAN SYLLABICS CO;Lo;0;L;;;;;N;;;;; 148E;CANADIAN SYLLABICS COO;Lo;0;L;;;;;N;;;;; 148F;CANADIAN SYLLABICS Y-CREE COO;Lo;0;L;;;;;N;;;;; 1490;CANADIAN SYLLABICS CA;Lo;0;L;;;;;N;;;;; 1491;CANADIAN SYLLABICS CAA;Lo;0;L;;;;;N;;;;; 1492;CANADIAN SYLLABICS CWE;Lo;0;L;;;;;N;;;;; 1493;CANADIAN SYLLABICS WEST-CREE CWE;Lo;0;L;;;;;N;;;;; 1494;CANADIAN SYLLABICS CWI;Lo;0;L;;;;;N;;;;; 1495;CANADIAN SYLLABICS WEST-CREE CWI;Lo;0;L;;;;;N;;;;; 1496;CANADIAN SYLLABICS CWII;Lo;0;L;;;;;N;;;;; 1497;CANADIAN SYLLABICS WEST-CREE CWII;Lo;0;L;;;;;N;;;;; 1498;CANADIAN SYLLABICS CWO;Lo;0;L;;;;;N;;;;; 1499;CANADIAN SYLLABICS WEST-CREE CWO;Lo;0;L;;;;;N;;;;; 149A;CANADIAN SYLLABICS CWOO;Lo;0;L;;;;;N;;;;; 149B;CANADIAN SYLLABICS WEST-CREE CWOO;Lo;0;L;;;;;N;;;;; 149C;CANADIAN SYLLABICS CWA;Lo;0;L;;;;;N;;;;; 149D;CANADIAN SYLLABICS WEST-CREE CWA;Lo;0;L;;;;;N;;;;; 149E;CANADIAN SYLLABICS CWAA;Lo;0;L;;;;;N;;;;; 149F;CANADIAN SYLLABICS WEST-CREE CWAA;Lo;0;L;;;;;N;;;;; 14A0;CANADIAN SYLLABICS NASKAPI CWAA;Lo;0;L;;;;;N;;;;; 14A1;CANADIAN SYLLABICS C;Lo;0;L;;;;;N;;;;; 14A2;CANADIAN SYLLABICS SAYISI TH;Lo;0;L;;;;;N;;;;; 14A3;CANADIAN SYLLABICS ME;Lo;0;L;;;;;N;;;;; 14A4;CANADIAN SYLLABICS MAAI;Lo;0;L;;;;;N;;;;; 14A5;CANADIAN SYLLABICS MI;Lo;0;L;;;;;N;;;;; 14A6;CANADIAN SYLLABICS MII;Lo;0;L;;;;;N;;;;; 14A7;CANADIAN SYLLABICS MO;Lo;0;L;;;;;N;;;;; 14A8;CANADIAN SYLLABICS MOO;Lo;0;L;;;;;N;;;;; 14A9;CANADIAN SYLLABICS Y-CREE MOO;Lo;0;L;;;;;N;;;;; 14AA;CANADIAN SYLLABICS MA;Lo;0;L;;;;;N;;;;; 14AB;CANADIAN SYLLABICS MAA;Lo;0;L;;;;;N;;;;; 14AC;CANADIAN SYLLABICS MWE;Lo;0;L;;;;;N;;;;; 14AD;CANADIAN SYLLABICS WEST-CREE MWE;Lo;0;L;;;;;N;;;;; 14AE;CANADIAN SYLLABICS MWI;Lo;0;L;;;;;N;;;;; 14AF;CANADIAN SYLLABICS WEST-CREE MWI;Lo;0;L;;;;;N;;;;; 14B0;CANADIAN SYLLABICS MWII;Lo;0;L;;;;;N;;;;; 14B1;CANADIAN SYLLABICS WEST-CREE MWII;Lo;0;L;;;;;N;;;;; 14B2;CANADIAN SYLLABICS MWO;Lo;0;L;;;;;N;;;;; 14B3;CANADIAN SYLLABICS WEST-CREE MWO;Lo;0;L;;;;;N;;;;; 14B4;CANADIAN SYLLABICS MWOO;Lo;0;L;;;;;N;;;;; 14B5;CANADIAN SYLLABICS WEST-CREE MWOO;Lo;0;L;;;;;N;;;;; 14B6;CANADIAN SYLLABICS MWA;Lo;0;L;;;;;N;;;;; 14B7;CANADIAN SYLLABICS WEST-CREE MWA;Lo;0;L;;;;;N;;;;; 14B8;CANADIAN SYLLABICS MWAA;Lo;0;L;;;;;N;;;;; 14B9;CANADIAN SYLLABICS WEST-CREE MWAA;Lo;0;L;;;;;N;;;;; 14BA;CANADIAN SYLLABICS NASKAPI MWAA;Lo;0;L;;;;;N;;;;; 14BB;CANADIAN SYLLABICS M;Lo;0;L;;;;;N;;;;; 14BC;CANADIAN SYLLABICS WEST-CREE M;Lo;0;L;;;;;N;;;;; 14BD;CANADIAN SYLLABICS MH;Lo;0;L;;;;;N;;;;; 14BE;CANADIAN SYLLABICS ATHAPASCAN M;Lo;0;L;;;;;N;;;;; 14BF;CANADIAN SYLLABICS SAYISI M;Lo;0;L;;;;;N;;;;; 14C0;CANADIAN SYLLABICS NE;Lo;0;L;;;;;N;;;;; 14C1;CANADIAN SYLLABICS NAAI;Lo;0;L;;;;;N;;;;; 14C2;CANADIAN SYLLABICS NI;Lo;0;L;;;;;N;;;;; 14C3;CANADIAN SYLLABICS NII;Lo;0;L;;;;;N;;;;; 14C4;CANADIAN SYLLABICS NO;Lo;0;L;;;;;N;;;;; 14C5;CANADIAN SYLLABICS NOO;Lo;0;L;;;;;N;;;;; 14C6;CANADIAN SYLLABICS Y-CREE NOO;Lo;0;L;;;;;N;;;;; 14C7;CANADIAN SYLLABICS NA;Lo;0;L;;;;;N;;;;; 14C8;CANADIAN SYLLABICS NAA;Lo;0;L;;;;;N;;;;; 14C9;CANADIAN SYLLABICS NWE;Lo;0;L;;;;;N;;;;; 14CA;CANADIAN SYLLABICS WEST-CREE NWE;Lo;0;L;;;;;N;;;;; 14CB;CANADIAN SYLLABICS NWA;Lo;0;L;;;;;N;;;;; 14CC;CANADIAN SYLLABICS WEST-CREE NWA;Lo;0;L;;;;;N;;;;; 14CD;CANADIAN SYLLABICS NWAA;Lo;0;L;;;;;N;;;;; 14CE;CANADIAN SYLLABICS WEST-CREE NWAA;Lo;0;L;;;;;N;;;;; 14CF;CANADIAN SYLLABICS NASKAPI NWAA;Lo;0;L;;;;;N;;;;; 14D0;CANADIAN SYLLABICS N;Lo;0;L;;;;;N;;;;; 14D1;CANADIAN SYLLABICS CARRIER NG;Lo;0;L;;;;;N;;;;; 14D2;CANADIAN SYLLABICS NH;Lo;0;L;;;;;N;;;;; 14D3;CANADIAN SYLLABICS LE;Lo;0;L;;;;;N;;;;; 14D4;CANADIAN SYLLABICS LAAI;Lo;0;L;;;;;N;;;;; 14D5;CANADIAN SYLLABICS LI;Lo;0;L;;;;;N;;;;; 14D6;CANADIAN SYLLABICS LII;Lo;0;L;;;;;N;;;;; 14D7;CANADIAN SYLLABICS LO;Lo;0;L;;;;;N;;;;; 14D8;CANADIAN SYLLABICS LOO;Lo;0;L;;;;;N;;;;; 14D9;CANADIAN SYLLABICS Y-CREE LOO;Lo;0;L;;;;;N;;;;; 14DA;CANADIAN SYLLABICS LA;Lo;0;L;;;;;N;;;;; 14DB;CANADIAN SYLLABICS LAA;Lo;0;L;;;;;N;;;;; 14DC;CANADIAN SYLLABICS LWE;Lo;0;L;;;;;N;;;;; 14DD;CANADIAN SYLLABICS WEST-CREE LWE;Lo;0;L;;;;;N;;;;; 14DE;CANADIAN SYLLABICS LWI;Lo;0;L;;;;;N;;;;; 14DF;CANADIAN SYLLABICS WEST-CREE LWI;Lo;0;L;;;;;N;;;;; 14E0;CANADIAN SYLLABICS LWII;Lo;0;L;;;;;N;;;;; 14E1;CANADIAN SYLLABICS WEST-CREE LWII;Lo;0;L;;;;;N;;;;; 14E2;CANADIAN SYLLABICS LWO;Lo;0;L;;;;;N;;;;; 14E3;CANADIAN SYLLABICS WEST-CREE LWO;Lo;0;L;;;;;N;;;;; 14E4;CANADIAN SYLLABICS LWOO;Lo;0;L;;;;;N;;;;; 14E5;CANADIAN SYLLABICS WEST-CREE LWOO;Lo;0;L;;;;;N;;;;; 14E6;CANADIAN SYLLABICS LWA;Lo;0;L;;;;;N;;;;; 14E7;CANADIAN SYLLABICS WEST-CREE LWA;Lo;0;L;;;;;N;;;;; 14E8;CANADIAN SYLLABICS LWAA;Lo;0;L;;;;;N;;;;; 14E9;CANADIAN SYLLABICS WEST-CREE LWAA;Lo;0;L;;;;;N;;;;; 14EA;CANADIAN SYLLABICS L;Lo;0;L;;;;;N;;;;; 14EB;CANADIAN SYLLABICS WEST-CREE L;Lo;0;L;;;;;N;;;;; 14EC;CANADIAN SYLLABICS MEDIAL L;Lo;0;L;;;;;N;;;;; 14ED;CANADIAN SYLLABICS SE;Lo;0;L;;;;;N;;;;; 14EE;CANADIAN SYLLABICS SAAI;Lo;0;L;;;;;N;;;;; 14EF;CANADIAN SYLLABICS SI;Lo;0;L;;;;;N;;;;; 14F0;CANADIAN SYLLABICS SII;Lo;0;L;;;;;N;;;;; 14F1;CANADIAN SYLLABICS SO;Lo;0;L;;;;;N;;;;; 14F2;CANADIAN SYLLABICS SOO;Lo;0;L;;;;;N;;;;; 14F3;CANADIAN SYLLABICS Y-CREE SOO;Lo;0;L;;;;;N;;;;; 14F4;CANADIAN SYLLABICS SA;Lo;0;L;;;;;N;;;;; 14F5;CANADIAN SYLLABICS SAA;Lo;0;L;;;;;N;;;;; 14F6;CANADIAN SYLLABICS SWE;Lo;0;L;;;;;N;;;;; 14F7;CANADIAN SYLLABICS WEST-CREE SWE;Lo;0;L;;;;;N;;;;; 14F8;CANADIAN SYLLABICS SWI;Lo;0;L;;;;;N;;;;; 14F9;CANADIAN SYLLABICS WEST-CREE SWI;Lo;0;L;;;;;N;;;;; 14FA;CANADIAN SYLLABICS SWII;Lo;0;L;;;;;N;;;;; 14FB;CANADIAN SYLLABICS WEST-CREE SWII;Lo;0;L;;;;;N;;;;; 14FC;CANADIAN SYLLABICS SWO;Lo;0;L;;;;;N;;;;; 14FD;CANADIAN SYLLABICS WEST-CREE SWO;Lo;0;L;;;;;N;;;;; 14FE;CANADIAN SYLLABICS SWOO;Lo;0;L;;;;;N;;;;; 14FF;CANADIAN SYLLABICS WEST-CREE SWOO;Lo;0;L;;;;;N;;;;; 1500;CANADIAN SYLLABICS SWA;Lo;0;L;;;;;N;;;;; 1501;CANADIAN SYLLABICS WEST-CREE SWA;Lo;0;L;;;;;N;;;;; 1502;CANADIAN SYLLABICS SWAA;Lo;0;L;;;;;N;;;;; 1503;CANADIAN SYLLABICS WEST-CREE SWAA;Lo;0;L;;;;;N;;;;; 1504;CANADIAN SYLLABICS NASKAPI SWAA;Lo;0;L;;;;;N;;;;; 1505;CANADIAN SYLLABICS S;Lo;0;L;;;;;N;;;;; 1506;CANADIAN SYLLABICS ATHAPASCAN S;Lo;0;L;;;;;N;;;;; 1507;CANADIAN SYLLABICS SW;Lo;0;L;;;;;N;;;;; 1508;CANADIAN SYLLABICS BLACKFOOT S;Lo;0;L;;;;;N;;;;; 1509;CANADIAN SYLLABICS MOOSE-CREE SK;Lo;0;L;;;;;N;;;;; 150A;CANADIAN SYLLABICS NASKAPI SKW;Lo;0;L;;;;;N;;;;; 150B;CANADIAN SYLLABICS NASKAPI S-W;Lo;0;L;;;;;N;;;;; 150C;CANADIAN SYLLABICS NASKAPI SPWA;Lo;0;L;;;;;N;;;;; 150D;CANADIAN SYLLABICS NASKAPI STWA;Lo;0;L;;;;;N;;;;; 150E;CANADIAN SYLLABICS NASKAPI SKWA;Lo;0;L;;;;;N;;;;; 150F;CANADIAN SYLLABICS NASKAPI SCWA;Lo;0;L;;;;;N;;;;; 1510;CANADIAN SYLLABICS SHE;Lo;0;L;;;;;N;;;;; 1511;CANADIAN SYLLABICS SHI;Lo;0;L;;;;;N;;;;; 1512;CANADIAN SYLLABICS SHII;Lo;0;L;;;;;N;;;;; 1513;CANADIAN SYLLABICS SHO;Lo;0;L;;;;;N;;;;; 1514;CANADIAN SYLLABICS SHOO;Lo;0;L;;;;;N;;;;; 1515;CANADIAN SYLLABICS SHA;Lo;0;L;;;;;N;;;;; 1516;CANADIAN SYLLABICS SHAA;Lo;0;L;;;;;N;;;;; 1517;CANADIAN SYLLABICS SHWE;Lo;0;L;;;;;N;;;;; 1518;CANADIAN SYLLABICS WEST-CREE SHWE;Lo;0;L;;;;;N;;;;; 1519;CANADIAN SYLLABICS SHWI;Lo;0;L;;;;;N;;;;; 151A;CANADIAN SYLLABICS WEST-CREE SHWI;Lo;0;L;;;;;N;;;;; 151B;CANADIAN SYLLABICS SHWII;Lo;0;L;;;;;N;;;;; 151C;CANADIAN SYLLABICS WEST-CREE SHWII;Lo;0;L;;;;;N;;;;; 151D;CANADIAN SYLLABICS SHWO;Lo;0;L;;;;;N;;;;; 151E;CANADIAN SYLLABICS WEST-CREE SHWO;Lo;0;L;;;;;N;;;;; 151F;CANADIAN SYLLABICS SHWOO;Lo;0;L;;;;;N;;;;; 1520;CANADIAN SYLLABICS WEST-CREE SHWOO;Lo;0;L;;;;;N;;;;; 1521;CANADIAN SYLLABICS SHWA;Lo;0;L;;;;;N;;;;; 1522;CANADIAN SYLLABICS WEST-CREE SHWA;Lo;0;L;;;;;N;;;;; 1523;CANADIAN SYLLABICS SHWAA;Lo;0;L;;;;;N;;;;; 1524;CANADIAN SYLLABICS WEST-CREE SHWAA;Lo;0;L;;;;;N;;;;; 1525;CANADIAN SYLLABICS SH;Lo;0;L;;;;;N;;;;; 1526;CANADIAN SYLLABICS YE;Lo;0;L;;;;;N;;;;; 1527;CANADIAN SYLLABICS YAAI;Lo;0;L;;;;;N;;;;; 1528;CANADIAN SYLLABICS YI;Lo;0;L;;;;;N;;;;; 1529;CANADIAN SYLLABICS YII;Lo;0;L;;;;;N;;;;; 152A;CANADIAN SYLLABICS YO;Lo;0;L;;;;;N;;;;; 152B;CANADIAN SYLLABICS YOO;Lo;0;L;;;;;N;;;;; 152C;CANADIAN SYLLABICS Y-CREE YOO;Lo;0;L;;;;;N;;;;; 152D;CANADIAN SYLLABICS YA;Lo;0;L;;;;;N;;;;; 152E;CANADIAN SYLLABICS YAA;Lo;0;L;;;;;N;;;;; 152F;CANADIAN SYLLABICS YWE;Lo;0;L;;;;;N;;;;; 1530;CANADIAN SYLLABICS WEST-CREE YWE;Lo;0;L;;;;;N;;;;; 1531;CANADIAN SYLLABICS YWI;Lo;0;L;;;;;N;;;;; 1532;CANADIAN SYLLABICS WEST-CREE YWI;Lo;0;L;;;;;N;;;;; 1533;CANADIAN SYLLABICS YWII;Lo;0;L;;;;;N;;;;; 1534;CANADIAN SYLLABICS WEST-CREE YWII;Lo;0;L;;;;;N;;;;; 1535;CANADIAN SYLLABICS YWO;Lo;0;L;;;;;N;;;;; 1536;CANADIAN SYLLABICS WEST-CREE YWO;Lo;0;L;;;;;N;;;;; 1537;CANADIAN SYLLABICS YWOO;Lo;0;L;;;;;N;;;;; 1538;CANADIAN SYLLABICS WEST-CREE YWOO;Lo;0;L;;;;;N;;;;; 1539;CANADIAN SYLLABICS YWA;Lo;0;L;;;;;N;;;;; 153A;CANADIAN SYLLABICS WEST-CREE YWA;Lo;0;L;;;;;N;;;;; 153B;CANADIAN SYLLABICS YWAA;Lo;0;L;;;;;N;;;;; 153C;CANADIAN SYLLABICS WEST-CREE YWAA;Lo;0;L;;;;;N;;;;; 153D;CANADIAN SYLLABICS NASKAPI YWAA;Lo;0;L;;;;;N;;;;; 153E;CANADIAN SYLLABICS Y;Lo;0;L;;;;;N;;;;; 153F;CANADIAN SYLLABICS BIBLE-CREE Y;Lo;0;L;;;;;N;;;;; 1540;CANADIAN SYLLABICS WEST-CREE Y;Lo;0;L;;;;;N;;;;; 1541;CANADIAN SYLLABICS SAYISI YI;Lo;0;L;;;;;N;;;;; 1542;CANADIAN SYLLABICS RE;Lo;0;L;;;;;N;;;;; 1543;CANADIAN SYLLABICS R-CREE RE;Lo;0;L;;;;;N;;;;; 1544;CANADIAN SYLLABICS WEST-CREE LE;Lo;0;L;;;;;N;;;;; 1545;CANADIAN SYLLABICS RAAI;Lo;0;L;;;;;N;;;;; 1546;CANADIAN SYLLABICS RI;Lo;0;L;;;;;N;;;;; 1547;CANADIAN SYLLABICS RII;Lo;0;L;;;;;N;;;;; 1548;CANADIAN SYLLABICS RO;Lo;0;L;;;;;N;;;;; 1549;CANADIAN SYLLABICS ROO;Lo;0;L;;;;;N;;;;; 154A;CANADIAN SYLLABICS WEST-CREE LO;Lo;0;L;;;;;N;;;;; 154B;CANADIAN SYLLABICS RA;Lo;0;L;;;;;N;;;;; 154C;CANADIAN SYLLABICS RAA;Lo;0;L;;;;;N;;;;; 154D;CANADIAN SYLLABICS WEST-CREE LA;Lo;0;L;;;;;N;;;;; 154E;CANADIAN SYLLABICS RWAA;Lo;0;L;;;;;N;;;;; 154F;CANADIAN SYLLABICS WEST-CREE RWAA;Lo;0;L;;;;;N;;;;; 1550;CANADIAN SYLLABICS R;Lo;0;L;;;;;N;;;;; 1551;CANADIAN SYLLABICS WEST-CREE R;Lo;0;L;;;;;N;;;;; 1552;CANADIAN SYLLABICS MEDIAL R;Lo;0;L;;;;;N;;;;; 1553;CANADIAN SYLLABICS FE;Lo;0;L;;;;;N;;;;; 1554;CANADIAN SYLLABICS FAAI;Lo;0;L;;;;;N;;;;; 1555;CANADIAN SYLLABICS FI;Lo;0;L;;;;;N;;;;; 1556;CANADIAN SYLLABICS FII;Lo;0;L;;;;;N;;;;; 1557;CANADIAN SYLLABICS FO;Lo;0;L;;;;;N;;;;; 1558;CANADIAN SYLLABICS FOO;Lo;0;L;;;;;N;;;;; 1559;CANADIAN SYLLABICS FA;Lo;0;L;;;;;N;;;;; 155A;CANADIAN SYLLABICS FAA;Lo;0;L;;;;;N;;;;; 155B;CANADIAN SYLLABICS FWAA;Lo;0;L;;;;;N;;;;; 155C;CANADIAN SYLLABICS WEST-CREE FWAA;Lo;0;L;;;;;N;;;;; 155D;CANADIAN SYLLABICS F;Lo;0;L;;;;;N;;;;; 155E;CANADIAN SYLLABICS THE;Lo;0;L;;;;;N;;;;; 155F;CANADIAN SYLLABICS N-CREE THE;Lo;0;L;;;;;N;;;;; 1560;CANADIAN SYLLABICS THI;Lo;0;L;;;;;N;;;;; 1561;CANADIAN SYLLABICS N-CREE THI;Lo;0;L;;;;;N;;;;; 1562;CANADIAN SYLLABICS THII;Lo;0;L;;;;;N;;;;; 1563;CANADIAN SYLLABICS N-CREE THII;Lo;0;L;;;;;N;;;;; 1564;CANADIAN SYLLABICS THO;Lo;0;L;;;;;N;;;;; 1565;CANADIAN SYLLABICS THOO;Lo;0;L;;;;;N;;;;; 1566;CANADIAN SYLLABICS THA;Lo;0;L;;;;;N;;;;; 1567;CANADIAN SYLLABICS THAA;Lo;0;L;;;;;N;;;;; 1568;CANADIAN SYLLABICS THWAA;Lo;0;L;;;;;N;;;;; 1569;CANADIAN SYLLABICS WEST-CREE THWAA;Lo;0;L;;;;;N;;;;; 156A;CANADIAN SYLLABICS TH;Lo;0;L;;;;;N;;;;; 156B;CANADIAN SYLLABICS TTHE;Lo;0;L;;;;;N;;;;; 156C;CANADIAN SYLLABICS TTHI;Lo;0;L;;;;;N;;;;; 156D;CANADIAN SYLLABICS TTHO;Lo;0;L;;;;;N;;;;; 156E;CANADIAN SYLLABICS TTHA;Lo;0;L;;;;;N;;;;; 156F;CANADIAN SYLLABICS TTH;Lo;0;L;;;;;N;;;;; 1570;CANADIAN SYLLABICS TYE;Lo;0;L;;;;;N;;;;; 1571;CANADIAN SYLLABICS TYI;Lo;0;L;;;;;N;;;;; 1572;CANADIAN SYLLABICS TYO;Lo;0;L;;;;;N;;;;; 1573;CANADIAN SYLLABICS TYA;Lo;0;L;;;;;N;;;;; 1574;CANADIAN SYLLABICS NUNAVIK HE;Lo;0;L;;;;;N;;;;; 1575;CANADIAN SYLLABICS NUNAVIK HI;Lo;0;L;;;;;N;;;;; 1576;CANADIAN SYLLABICS NUNAVIK HII;Lo;0;L;;;;;N;;;;; 1577;CANADIAN SYLLABICS NUNAVIK HO;Lo;0;L;;;;;N;;;;; 1578;CANADIAN SYLLABICS NUNAVIK HOO;Lo;0;L;;;;;N;;;;; 1579;CANADIAN SYLLABICS NUNAVIK HA;Lo;0;L;;;;;N;;;;; 157A;CANADIAN SYLLABICS NUNAVIK HAA;Lo;0;L;;;;;N;;;;; 157B;CANADIAN SYLLABICS NUNAVIK H;Lo;0;L;;;;;N;;;;; 157C;CANADIAN SYLLABICS NUNAVUT H;Lo;0;L;;;;;N;;;;; 157D;CANADIAN SYLLABICS HK;Lo;0;L;;;;;N;;;;; 157E;CANADIAN SYLLABICS QAAI;Lo;0;L;;;;;N;;;;; 157F;CANADIAN SYLLABICS QI;Lo;0;L;;;;;N;;;;; 1580;CANADIAN SYLLABICS QII;Lo;0;L;;;;;N;;;;; 1581;CANADIAN SYLLABICS QO;Lo;0;L;;;;;N;;;;; 1582;CANADIAN SYLLABICS QOO;Lo;0;L;;;;;N;;;;; 1583;CANADIAN SYLLABICS QA;Lo;0;L;;;;;N;;;;; 1584;CANADIAN SYLLABICS QAA;Lo;0;L;;;;;N;;;;; 1585;CANADIAN SYLLABICS Q;Lo;0;L;;;;;N;;;;; 1586;CANADIAN SYLLABICS TLHE;Lo;0;L;;;;;N;;;;; 1587;CANADIAN SYLLABICS TLHI;Lo;0;L;;;;;N;;;;; 1588;CANADIAN SYLLABICS TLHO;Lo;0;L;;;;;N;;;;; 1589;CANADIAN SYLLABICS TLHA;Lo;0;L;;;;;N;;;;; 158A;CANADIAN SYLLABICS WEST-CREE RE;Lo;0;L;;;;;N;;;;; 158B;CANADIAN SYLLABICS WEST-CREE RI;Lo;0;L;;;;;N;;;;; 158C;CANADIAN SYLLABICS WEST-CREE RO;Lo;0;L;;;;;N;;;;; 158D;CANADIAN SYLLABICS WEST-CREE RA;Lo;0;L;;;;;N;;;;; 158E;CANADIAN SYLLABICS NGAAI;Lo;0;L;;;;;N;;;;; 158F;CANADIAN SYLLABICS NGI;Lo;0;L;;;;;N;;;;; 1590;CANADIAN SYLLABICS NGII;Lo;0;L;;;;;N;;;;; 1591;CANADIAN SYLLABICS NGO;Lo;0;L;;;;;N;;;;; 1592;CANADIAN SYLLABICS NGOO;Lo;0;L;;;;;N;;;;; 1593;CANADIAN SYLLABICS NGA;Lo;0;L;;;;;N;;;;; 1594;CANADIAN SYLLABICS NGAA;Lo;0;L;;;;;N;;;;; 1595;CANADIAN SYLLABICS NG;Lo;0;L;;;;;N;;;;; 1596;CANADIAN SYLLABICS NNG;Lo;0;L;;;;;N;;;;; 1597;CANADIAN SYLLABICS SAYISI SHE;Lo;0;L;;;;;N;;;;; 1598;CANADIAN SYLLABICS SAYISI SHI;Lo;0;L;;;;;N;;;;; 1599;CANADIAN SYLLABICS SAYISI SHO;Lo;0;L;;;;;N;;;;; 159A;CANADIAN SYLLABICS SAYISI SHA;Lo;0;L;;;;;N;;;;; 159B;CANADIAN SYLLABICS WOODS-CREE THE;Lo;0;L;;;;;N;;;;; 159C;CANADIAN SYLLABICS WOODS-CREE THI;Lo;0;L;;;;;N;;;;; 159D;CANADIAN SYLLABICS WOODS-CREE THO;Lo;0;L;;;;;N;;;;; 159E;CANADIAN SYLLABICS WOODS-CREE THA;Lo;0;L;;;;;N;;;;; 159F;CANADIAN SYLLABICS WOODS-CREE TH;Lo;0;L;;;;;N;;;;; 15A0;CANADIAN SYLLABICS LHI;Lo;0;L;;;;;N;;;;; 15A1;CANADIAN SYLLABICS LHII;Lo;0;L;;;;;N;;;;; 15A2;CANADIAN SYLLABICS LHO;Lo;0;L;;;;;N;;;;; 15A3;CANADIAN SYLLABICS LHOO;Lo;0;L;;;;;N;;;;; 15A4;CANADIAN SYLLABICS LHA;Lo;0;L;;;;;N;;;;; 15A5;CANADIAN SYLLABICS LHAA;Lo;0;L;;;;;N;;;;; 15A6;CANADIAN SYLLABICS LH;Lo;0;L;;;;;N;;;;; 15A7;CANADIAN SYLLABICS TH-CREE THE;Lo;0;L;;;;;N;;;;; 15A8;CANADIAN SYLLABICS TH-CREE THI;Lo;0;L;;;;;N;;;;; 15A9;CANADIAN SYLLABICS TH-CREE THII;Lo;0;L;;;;;N;;;;; 15AA;CANADIAN SYLLABICS TH-CREE THO;Lo;0;L;;;;;N;;;;; 15AB;CANADIAN SYLLABICS TH-CREE THOO;Lo;0;L;;;;;N;;;;; 15AC;CANADIAN SYLLABICS TH-CREE THA;Lo;0;L;;;;;N;;;;; 15AD;CANADIAN SYLLABICS TH-CREE THAA;Lo;0;L;;;;;N;;;;; 15AE;CANADIAN SYLLABICS TH-CREE TH;Lo;0;L;;;;;N;;;;; 15AF;CANADIAN SYLLABICS AIVILIK B;Lo;0;L;;;;;N;;;;; 15B0;CANADIAN SYLLABICS BLACKFOOT E;Lo;0;L;;;;;N;;;;; 15B1;CANADIAN SYLLABICS BLACKFOOT I;Lo;0;L;;;;;N;;;;; 15B2;CANADIAN SYLLABICS BLACKFOOT O;Lo;0;L;;;;;N;;;;; 15B3;CANADIAN SYLLABICS BLACKFOOT A;Lo;0;L;;;;;N;;;;; 15B4;CANADIAN SYLLABICS BLACKFOOT WE;Lo;0;L;;;;;N;;;;; 15B5;CANADIAN SYLLABICS BLACKFOOT WI;Lo;0;L;;;;;N;;;;; 15B6;CANADIAN SYLLABICS BLACKFOOT WO;Lo;0;L;;;;;N;;;;; 15B7;CANADIAN SYLLABICS BLACKFOOT WA;Lo;0;L;;;;;N;;;;; 15B8;CANADIAN SYLLABICS BLACKFOOT NE;Lo;0;L;;;;;N;;;;; 15B9;CANADIAN SYLLABICS BLACKFOOT NI;Lo;0;L;;;;;N;;;;; 15BA;CANADIAN SYLLABICS BLACKFOOT NO;Lo;0;L;;;;;N;;;;; 15BB;CANADIAN SYLLABICS BLACKFOOT NA;Lo;0;L;;;;;N;;;;; 15BC;CANADIAN SYLLABICS BLACKFOOT KE;Lo;0;L;;;;;N;;;;; 15BD;CANADIAN SYLLABICS BLACKFOOT KI;Lo;0;L;;;;;N;;;;; 15BE;CANADIAN SYLLABICS BLACKFOOT KO;Lo;0;L;;;;;N;;;;; 15BF;CANADIAN SYLLABICS BLACKFOOT KA;Lo;0;L;;;;;N;;;;; 15C0;CANADIAN SYLLABICS SAYISI HE;Lo;0;L;;;;;N;;;;; 15C1;CANADIAN SYLLABICS SAYISI HI;Lo;0;L;;;;;N;;;;; 15C2;CANADIAN SYLLABICS SAYISI HO;Lo;0;L;;;;;N;;;;; 15C3;CANADIAN SYLLABICS SAYISI HA;Lo;0;L;;;;;N;;;;; 15C4;CANADIAN SYLLABICS CARRIER GHU;Lo;0;L;;;;;N;;;;; 15C5;CANADIAN SYLLABICS CARRIER GHO;Lo;0;L;;;;;N;;;;; 15C6;CANADIAN SYLLABICS CARRIER GHE;Lo;0;L;;;;;N;;;;; 15C7;CANADIAN SYLLABICS CARRIER GHEE;Lo;0;L;;;;;N;;;;; 15C8;CANADIAN SYLLABICS CARRIER GHI;Lo;0;L;;;;;N;;;;; 15C9;CANADIAN SYLLABICS CARRIER GHA;Lo;0;L;;;;;N;;;;; 15CA;CANADIAN SYLLABICS CARRIER RU;Lo;0;L;;;;;N;;;;; 15CB;CANADIAN SYLLABICS CARRIER RO;Lo;0;L;;;;;N;;;;; 15CC;CANADIAN SYLLABICS CARRIER RE;Lo;0;L;;;;;N;;;;; 15CD;CANADIAN SYLLABICS CARRIER REE;Lo;0;L;;;;;N;;;;; 15CE;CANADIAN SYLLABICS CARRIER RI;Lo;0;L;;;;;N;;;;; 15CF;CANADIAN SYLLABICS CARRIER RA;Lo;0;L;;;;;N;;;;; 15D0;CANADIAN SYLLABICS CARRIER WU;Lo;0;L;;;;;N;;;;; 15D1;CANADIAN SYLLABICS CARRIER WO;Lo;0;L;;;;;N;;;;; 15D2;CANADIAN SYLLABICS CARRIER WE;Lo;0;L;;;;;N;;;;; 15D3;CANADIAN SYLLABICS CARRIER WEE;Lo;0;L;;;;;N;;;;; 15D4;CANADIAN SYLLABICS CARRIER WI;Lo;0;L;;;;;N;;;;; 15D5;CANADIAN SYLLABICS CARRIER WA;Lo;0;L;;;;;N;;;;; 15D6;CANADIAN SYLLABICS CARRIER HWU;Lo;0;L;;;;;N;;;;; 15D7;CANADIAN SYLLABICS CARRIER HWO;Lo;0;L;;;;;N;;;;; 15D8;CANADIAN SYLLABICS CARRIER HWE;Lo;0;L;;;;;N;;;;; 15D9;CANADIAN SYLLABICS CARRIER HWEE;Lo;0;L;;;;;N;;;;; 15DA;CANADIAN SYLLABICS CARRIER HWI;Lo;0;L;;;;;N;;;;; 15DB;CANADIAN SYLLABICS CARRIER HWA;Lo;0;L;;;;;N;;;;; 15DC;CANADIAN SYLLABICS CARRIER THU;Lo;0;L;;;;;N;;;;; 15DD;CANADIAN SYLLABICS CARRIER THO;Lo;0;L;;;;;N;;;;; 15DE;CANADIAN SYLLABICS CARRIER THE;Lo;0;L;;;;;N;;;;; 15DF;CANADIAN SYLLABICS CARRIER THEE;Lo;0;L;;;;;N;;;;; 15E0;CANADIAN SYLLABICS CARRIER THI;Lo;0;L;;;;;N;;;;; 15E1;CANADIAN SYLLABICS CARRIER THA;Lo;0;L;;;;;N;;;;; 15E2;CANADIAN SYLLABICS CARRIER TTU;Lo;0;L;;;;;N;;;;; 15E3;CANADIAN SYLLABICS CARRIER TTO;Lo;0;L;;;;;N;;;;; 15E4;CANADIAN SYLLABICS CARRIER TTE;Lo;0;L;;;;;N;;;;; 15E5;CANADIAN SYLLABICS CARRIER TTEE;Lo;0;L;;;;;N;;;;; 15E6;CANADIAN SYLLABICS CARRIER TTI;Lo;0;L;;;;;N;;;;; 15E7;CANADIAN SYLLABICS CARRIER TTA;Lo;0;L;;;;;N;;;;; 15E8;CANADIAN SYLLABICS CARRIER PU;Lo;0;L;;;;;N;;;;; 15E9;CANADIAN SYLLABICS CARRIER PO;Lo;0;L;;;;;N;;;;; 15EA;CANADIAN SYLLABICS CARRIER PE;Lo;0;L;;;;;N;;;;; 15EB;CANADIAN SYLLABICS CARRIER PEE;Lo;0;L;;;;;N;;;;; 15EC;CANADIAN SYLLABICS CARRIER PI;Lo;0;L;;;;;N;;;;; 15ED;CANADIAN SYLLABICS CARRIER PA;Lo;0;L;;;;;N;;;;; 15EE;CANADIAN SYLLABICS CARRIER P;Lo;0;L;;;;;N;;;;; 15EF;CANADIAN SYLLABICS CARRIER GU;Lo;0;L;;;;;N;;;;; 15F0;CANADIAN SYLLABICS CARRIER GO;Lo;0;L;;;;;N;;;;; 15F1;CANADIAN SYLLABICS CARRIER GE;Lo;0;L;;;;;N;;;;; 15F2;CANADIAN SYLLABICS CARRIER GEE;Lo;0;L;;;;;N;;;;; 15F3;CANADIAN SYLLABICS CARRIER GI;Lo;0;L;;;;;N;;;;; 15F4;CANADIAN SYLLABICS CARRIER GA;Lo;0;L;;;;;N;;;;; 15F5;CANADIAN SYLLABICS CARRIER KHU;Lo;0;L;;;;;N;;;;; 15F6;CANADIAN SYLLABICS CARRIER KHO;Lo;0;L;;;;;N;;;;; 15F7;CANADIAN SYLLABICS CARRIER KHE;Lo;0;L;;;;;N;;;;; 15F8;CANADIAN SYLLABICS CARRIER KHEE;Lo;0;L;;;;;N;;;;; 15F9;CANADIAN SYLLABICS CARRIER KHI;Lo;0;L;;;;;N;;;;; 15FA;CANADIAN SYLLABICS CARRIER KHA;Lo;0;L;;;;;N;;;;; 15FB;CANADIAN SYLLABICS CARRIER KKU;Lo;0;L;;;;;N;;;;; 15FC;CANADIAN SYLLABICS CARRIER KKO;Lo;0;L;;;;;N;;;;; 15FD;CANADIAN SYLLABICS CARRIER KKE;Lo;0;L;;;;;N;;;;; 15FE;CANADIAN SYLLABICS CARRIER KKEE;Lo;0;L;;;;;N;;;;; 15FF;CANADIAN SYLLABICS CARRIER KKI;Lo;0;L;;;;;N;;;;; 1600;CANADIAN SYLLABICS CARRIER KKA;Lo;0;L;;;;;N;;;;; 1601;CANADIAN SYLLABICS CARRIER KK;Lo;0;L;;;;;N;;;;; 1602;CANADIAN SYLLABICS CARRIER NU;Lo;0;L;;;;;N;;;;; 1603;CANADIAN SYLLABICS CARRIER NO;Lo;0;L;;;;;N;;;;; 1604;CANADIAN SYLLABICS CARRIER NE;Lo;0;L;;;;;N;;;;; 1605;CANADIAN SYLLABICS CARRIER NEE;Lo;0;L;;;;;N;;;;; 1606;CANADIAN SYLLABICS CARRIER NI;Lo;0;L;;;;;N;;;;; 1607;CANADIAN SYLLABICS CARRIER NA;Lo;0;L;;;;;N;;;;; 1608;CANADIAN SYLLABICS CARRIER MU;Lo;0;L;;;;;N;;;;; 1609;CANADIAN SYLLABICS CARRIER MO;Lo;0;L;;;;;N;;;;; 160A;CANADIAN SYLLABICS CARRIER ME;Lo;0;L;;;;;N;;;;; 160B;CANADIAN SYLLABICS CARRIER MEE;Lo;0;L;;;;;N;;;;; 160C;CANADIAN SYLLABICS CARRIER MI;Lo;0;L;;;;;N;;;;; 160D;CANADIAN SYLLABICS CARRIER MA;Lo;0;L;;;;;N;;;;; 160E;CANADIAN SYLLABICS CARRIER YU;Lo;0;L;;;;;N;;;;; 160F;CANADIAN SYLLABICS CARRIER YO;Lo;0;L;;;;;N;;;;; 1610;CANADIAN SYLLABICS CARRIER YE;Lo;0;L;;;;;N;;;;; 1611;CANADIAN SYLLABICS CARRIER YEE;Lo;0;L;;;;;N;;;;; 1612;CANADIAN SYLLABICS CARRIER YI;Lo;0;L;;;;;N;;;;; 1613;CANADIAN SYLLABICS CARRIER YA;Lo;0;L;;;;;N;;;;; 1614;CANADIAN SYLLABICS CARRIER JU;Lo;0;L;;;;;N;;;;; 1615;CANADIAN SYLLABICS SAYISI JU;Lo;0;L;;;;;N;;;;; 1616;CANADIAN SYLLABICS CARRIER JO;Lo;0;L;;;;;N;;;;; 1617;CANADIAN SYLLABICS CARRIER JE;Lo;0;L;;;;;N;;;;; 1618;CANADIAN SYLLABICS CARRIER JEE;Lo;0;L;;;;;N;;;;; 1619;CANADIAN SYLLABICS CARRIER JI;Lo;0;L;;;;;N;;;;; 161A;CANADIAN SYLLABICS SAYISI JI;Lo;0;L;;;;;N;;;;; 161B;CANADIAN SYLLABICS CARRIER JA;Lo;0;L;;;;;N;;;;; 161C;CANADIAN SYLLABICS CARRIER JJU;Lo;0;L;;;;;N;;;;; 161D;CANADIAN SYLLABICS CARRIER JJO;Lo;0;L;;;;;N;;;;; 161E;CANADIAN SYLLABICS CARRIER JJE;Lo;0;L;;;;;N;;;;; 161F;CANADIAN SYLLABICS CARRIER JJEE;Lo;0;L;;;;;N;;;;; 1620;CANADIAN SYLLABICS CARRIER JJI;Lo;0;L;;;;;N;;;;; 1621;CANADIAN SYLLABICS CARRIER JJA;Lo;0;L;;;;;N;;;;; 1622;CANADIAN SYLLABICS CARRIER LU;Lo;0;L;;;;;N;;;;; 1623;CANADIAN SYLLABICS CARRIER LO;Lo;0;L;;;;;N;;;;; 1624;CANADIAN SYLLABICS CARRIER LE;Lo;0;L;;;;;N;;;;; 1625;CANADIAN SYLLABICS CARRIER LEE;Lo;0;L;;;;;N;;;;; 1626;CANADIAN SYLLABICS CARRIER LI;Lo;0;L;;;;;N;;;;; 1627;CANADIAN SYLLABICS CARRIER LA;Lo;0;L;;;;;N;;;;; 1628;CANADIAN SYLLABICS CARRIER DLU;Lo;0;L;;;;;N;;;;; 1629;CANADIAN SYLLABICS CARRIER DLO;Lo;0;L;;;;;N;;;;; 162A;CANADIAN SYLLABICS CARRIER DLE;Lo;0;L;;;;;N;;;;; 162B;CANADIAN SYLLABICS CARRIER DLEE;Lo;0;L;;;;;N;;;;; 162C;CANADIAN SYLLABICS CARRIER DLI;Lo;0;L;;;;;N;;;;; 162D;CANADIAN SYLLABICS CARRIER DLA;Lo;0;L;;;;;N;;;;; 162E;CANADIAN SYLLABICS CARRIER LHU;Lo;0;L;;;;;N;;;;; 162F;CANADIAN SYLLABICS CARRIER LHO;Lo;0;L;;;;;N;;;;; 1630;CANADIAN SYLLABICS CARRIER LHE;Lo;0;L;;;;;N;;;;; 1631;CANADIAN SYLLABICS CARRIER LHEE;Lo;0;L;;;;;N;;;;; 1632;CANADIAN SYLLABICS CARRIER LHI;Lo;0;L;;;;;N;;;;; 1633;CANADIAN SYLLABICS CARRIER LHA;Lo;0;L;;;;;N;;;;; 1634;CANADIAN SYLLABICS CARRIER TLHU;Lo;0;L;;;;;N;;;;; 1635;CANADIAN SYLLABICS CARRIER TLHO;Lo;0;L;;;;;N;;;;; 1636;CANADIAN SYLLABICS CARRIER TLHE;Lo;0;L;;;;;N;;;;; 1637;CANADIAN SYLLABICS CARRIER TLHEE;Lo;0;L;;;;;N;;;;; 1638;CANADIAN SYLLABICS CARRIER TLHI;Lo;0;L;;;;;N;;;;; 1639;CANADIAN SYLLABICS CARRIER TLHA;Lo;0;L;;;;;N;;;;; 163A;CANADIAN SYLLABICS CARRIER TLU;Lo;0;L;;;;;N;;;;; 163B;CANADIAN SYLLABICS CARRIER TLO;Lo;0;L;;;;;N;;;;; 163C;CANADIAN SYLLABICS CARRIER TLE;Lo;0;L;;;;;N;;;;; 163D;CANADIAN SYLLABICS CARRIER TLEE;Lo;0;L;;;;;N;;;;; 163E;CANADIAN SYLLABICS CARRIER TLI;Lo;0;L;;;;;N;;;;; 163F;CANADIAN SYLLABICS CARRIER TLA;Lo;0;L;;;;;N;;;;; 1640;CANADIAN SYLLABICS CARRIER ZU;Lo;0;L;;;;;N;;;;; 1641;CANADIAN SYLLABICS CARRIER ZO;Lo;0;L;;;;;N;;;;; 1642;CANADIAN SYLLABICS CARRIER ZE;Lo;0;L;;;;;N;;;;; 1643;CANADIAN SYLLABICS CARRIER ZEE;Lo;0;L;;;;;N;;;;; 1644;CANADIAN SYLLABICS CARRIER ZI;Lo;0;L;;;;;N;;;;; 1645;CANADIAN SYLLABICS CARRIER ZA;Lo;0;L;;;;;N;;;;; 1646;CANADIAN SYLLABICS CARRIER Z;Lo;0;L;;;;;N;;;;; 1647;CANADIAN SYLLABICS CARRIER INITIAL Z;Lo;0;L;;;;;N;;;;; 1648;CANADIAN SYLLABICS CARRIER DZU;Lo;0;L;;;;;N;;;;; 1649;CANADIAN SYLLABICS CARRIER DZO;Lo;0;L;;;;;N;;;;; 164A;CANADIAN SYLLABICS CARRIER DZE;Lo;0;L;;;;;N;;;;; 164B;CANADIAN SYLLABICS CARRIER DZEE;Lo;0;L;;;;;N;;;;; 164C;CANADIAN SYLLABICS CARRIER DZI;Lo;0;L;;;;;N;;;;; 164D;CANADIAN SYLLABICS CARRIER DZA;Lo;0;L;;;;;N;;;;; 164E;CANADIAN SYLLABICS CARRIER SU;Lo;0;L;;;;;N;;;;; 164F;CANADIAN SYLLABICS CARRIER SO;Lo;0;L;;;;;N;;;;; 1650;CANADIAN SYLLABICS CARRIER SE;Lo;0;L;;;;;N;;;;; 1651;CANADIAN SYLLABICS CARRIER SEE;Lo;0;L;;;;;N;;;;; 1652;CANADIAN SYLLABICS CARRIER SI;Lo;0;L;;;;;N;;;;; 1653;CANADIAN SYLLABICS CARRIER SA;Lo;0;L;;;;;N;;;;; 1654;CANADIAN SYLLABICS CARRIER SHU;Lo;0;L;;;;;N;;;;; 1655;CANADIAN SYLLABICS CARRIER SHO;Lo;0;L;;;;;N;;;;; 1656;CANADIAN SYLLABICS CARRIER SHE;Lo;0;L;;;;;N;;;;; 1657;CANADIAN SYLLABICS CARRIER SHEE;Lo;0;L;;;;;N;;;;; 1658;CANADIAN SYLLABICS CARRIER SHI;Lo;0;L;;;;;N;;;;; 1659;CANADIAN SYLLABICS CARRIER SHA;Lo;0;L;;;;;N;;;;; 165A;CANADIAN SYLLABICS CARRIER SH;Lo;0;L;;;;;N;;;;; 165B;CANADIAN SYLLABICS CARRIER TSU;Lo;0;L;;;;;N;;;;; 165C;CANADIAN SYLLABICS CARRIER TSO;Lo;0;L;;;;;N;;;;; 165D;CANADIAN SYLLABICS CARRIER TSE;Lo;0;L;;;;;N;;;;; 165E;CANADIAN SYLLABICS CARRIER TSEE;Lo;0;L;;;;;N;;;;; 165F;CANADIAN SYLLABICS CARRIER TSI;Lo;0;L;;;;;N;;;;; 1660;CANADIAN SYLLABICS CARRIER TSA;Lo;0;L;;;;;N;;;;; 1661;CANADIAN SYLLABICS CARRIER CHU;Lo;0;L;;;;;N;;;;; 1662;CANADIAN SYLLABICS CARRIER CHO;Lo;0;L;;;;;N;;;;; 1663;CANADIAN SYLLABICS CARRIER CHE;Lo;0;L;;;;;N;;;;; 1664;CANADIAN SYLLABICS CARRIER CHEE;Lo;0;L;;;;;N;;;;; 1665;CANADIAN SYLLABICS CARRIER CHI;Lo;0;L;;;;;N;;;;; 1666;CANADIAN SYLLABICS CARRIER CHA;Lo;0;L;;;;;N;;;;; 1667;CANADIAN SYLLABICS CARRIER TTSU;Lo;0;L;;;;;N;;;;; 1668;CANADIAN SYLLABICS CARRIER TTSO;Lo;0;L;;;;;N;;;;; 1669;CANADIAN SYLLABICS CARRIER TTSE;Lo;0;L;;;;;N;;;;; 166A;CANADIAN SYLLABICS CARRIER TTSEE;Lo;0;L;;;;;N;;;;; 166B;CANADIAN SYLLABICS CARRIER TTSI;Lo;0;L;;;;;N;;;;; 166C;CANADIAN SYLLABICS CARRIER TTSA;Lo;0;L;;;;;N;;;;; 166D;CANADIAN SYLLABICS CHI SIGN;Po;0;L;;;;;N;;;;; 166E;CANADIAN SYLLABICS FULL STOP;Po;0;L;;;;;N;;;;; 166F;CANADIAN SYLLABICS QAI;Lo;0;L;;;;;N;;;;; 1670;CANADIAN SYLLABICS NGAI;Lo;0;L;;;;;N;;;;; 1671;CANADIAN SYLLABICS NNGI;Lo;0;L;;;;;N;;;;; 1672;CANADIAN SYLLABICS NNGII;Lo;0;L;;;;;N;;;;; 1673;CANADIAN SYLLABICS NNGO;Lo;0;L;;;;;N;;;;; 1674;CANADIAN SYLLABICS NNGOO;Lo;0;L;;;;;N;;;;; 1675;CANADIAN SYLLABICS NNGA;Lo;0;L;;;;;N;;;;; 1676;CANADIAN SYLLABICS NNGAA;Lo;0;L;;;;;N;;;;; 1677;CANADIAN SYLLABICS WOODS-CREE THWEE;Lo;0;L;;;;;N;;;;; 1678;CANADIAN SYLLABICS WOODS-CREE THWI;Lo;0;L;;;;;N;;;;; 1679;CANADIAN SYLLABICS WOODS-CREE THWII;Lo;0;L;;;;;N;;;;; 167A;CANADIAN SYLLABICS WOODS-CREE THWO;Lo;0;L;;;;;N;;;;; 167B;CANADIAN SYLLABICS WOODS-CREE THWOO;Lo;0;L;;;;;N;;;;; 167C;CANADIAN SYLLABICS WOODS-CREE THWA;Lo;0;L;;;;;N;;;;; 167D;CANADIAN SYLLABICS WOODS-CREE THWAA;Lo;0;L;;;;;N;;;;; 167E;CANADIAN SYLLABICS WOODS-CREE FINAL TH;Lo;0;L;;;;;N;;;;; 167F;CANADIAN SYLLABICS BLACKFOOT W;Lo;0;L;;;;;N;;;;; 1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;; 1681;OGHAM LETTER BEITH;Lo;0;L;;;;;N;;;;; 1682;OGHAM LETTER LUIS;Lo;0;L;;;;;N;;;;; 1683;OGHAM LETTER FEARN;Lo;0;L;;;;;N;;;;; 1684;OGHAM LETTER SAIL;Lo;0;L;;;;;N;;;;; 1685;OGHAM LETTER NION;Lo;0;L;;;;;N;;;;; 1686;OGHAM LETTER UATH;Lo;0;L;;;;;N;;;;; 1687;OGHAM LETTER DAIR;Lo;0;L;;;;;N;;;;; 1688;OGHAM LETTER TINNE;Lo;0;L;;;;;N;;;;; 1689;OGHAM LETTER COLL;Lo;0;L;;;;;N;;;;; 168A;OGHAM LETTER CEIRT;Lo;0;L;;;;;N;;;;; 168B;OGHAM LETTER MUIN;Lo;0;L;;;;;N;;;;; 168C;OGHAM LETTER GORT;Lo;0;L;;;;;N;;;;; 168D;OGHAM LETTER NGEADAL;Lo;0;L;;;;;N;;;;; 168E;OGHAM LETTER STRAIF;Lo;0;L;;;;;N;;;;; 168F;OGHAM LETTER RUIS;Lo;0;L;;;;;N;;;;; 1690;OGHAM LETTER AILM;Lo;0;L;;;;;N;;;;; 1691;OGHAM LETTER ONN;Lo;0;L;;;;;N;;;;; 1692;OGHAM LETTER UR;Lo;0;L;;;;;N;;;;; 1693;OGHAM LETTER EADHADH;Lo;0;L;;;;;N;;;;; 1694;OGHAM LETTER IODHADH;Lo;0;L;;;;;N;;;;; 1695;OGHAM LETTER EABHADH;Lo;0;L;;;;;N;;;;; 1696;OGHAM LETTER OR;Lo;0;L;;;;;N;;;;; 1697;OGHAM LETTER UILLEANN;Lo;0;L;;;;;N;;;;; 1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;; 1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;; 169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;; 169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;Y;;;;; 169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;Y;;;;; 16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;; 16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;; 16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;; 16A3;RUNIC LETTER YR;Lo;0;L;;;;;N;;;;; 16A4;RUNIC LETTER Y;Lo;0;L;;;;;N;;;;; 16A5;RUNIC LETTER W;Lo;0;L;;;;;N;;;;; 16A6;RUNIC LETTER THURISAZ THURS THORN;Lo;0;L;;;;;N;;;;; 16A7;RUNIC LETTER ETH;Lo;0;L;;;;;N;;;;; 16A8;RUNIC LETTER ANSUZ A;Lo;0;L;;;;;N;;;;; 16A9;RUNIC LETTER OS O;Lo;0;L;;;;;N;;;;; 16AA;RUNIC LETTER AC A;Lo;0;L;;;;;N;;;;; 16AB;RUNIC LETTER AESC;Lo;0;L;;;;;N;;;;; 16AC;RUNIC LETTER LONG-BRANCH-OSS O;Lo;0;L;;;;;N;;;;; 16AD;RUNIC LETTER SHORT-TWIG-OSS O;Lo;0;L;;;;;N;;;;; 16AE;RUNIC LETTER O;Lo;0;L;;;;;N;;;;; 16AF;RUNIC LETTER OE;Lo;0;L;;;;;N;;;;; 16B0;RUNIC LETTER ON;Lo;0;L;;;;;N;;;;; 16B1;RUNIC LETTER RAIDO RAD REID R;Lo;0;L;;;;;N;;;;; 16B2;RUNIC LETTER KAUNA;Lo;0;L;;;;;N;;;;; 16B3;RUNIC LETTER CEN;Lo;0;L;;;;;N;;;;; 16B4;RUNIC LETTER KAUN K;Lo;0;L;;;;;N;;;;; 16B5;RUNIC LETTER G;Lo;0;L;;;;;N;;;;; 16B6;RUNIC LETTER ENG;Lo;0;L;;;;;N;;;;; 16B7;RUNIC LETTER GEBO GYFU G;Lo;0;L;;;;;N;;;;; 16B8;RUNIC LETTER GAR;Lo;0;L;;;;;N;;;;; 16B9;RUNIC LETTER WUNJO WYNN W;Lo;0;L;;;;;N;;;;; 16BA;RUNIC LETTER HAGLAZ H;Lo;0;L;;;;;N;;;;; 16BB;RUNIC LETTER HAEGL H;Lo;0;L;;;;;N;;;;; 16BC;RUNIC LETTER LONG-BRANCH-HAGALL H;Lo;0;L;;;;;N;;;;; 16BD;RUNIC LETTER SHORT-TWIG-HAGALL H;Lo;0;L;;;;;N;;;;; 16BE;RUNIC LETTER NAUDIZ NYD NAUD N;Lo;0;L;;;;;N;;;;; 16BF;RUNIC LETTER SHORT-TWIG-NAUD N;Lo;0;L;;;;;N;;;;; 16C0;RUNIC LETTER DOTTED-N;Lo;0;L;;;;;N;;;;; 16C1;RUNIC LETTER ISAZ IS ISS I;Lo;0;L;;;;;N;;;;; 16C2;RUNIC LETTER E;Lo;0;L;;;;;N;;;;; 16C3;RUNIC LETTER JERAN J;Lo;0;L;;;;;N;;;;; 16C4;RUNIC LETTER GER;Lo;0;L;;;;;N;;;;; 16C5;RUNIC LETTER LONG-BRANCH-AR AE;Lo;0;L;;;;;N;;;;; 16C6;RUNIC LETTER SHORT-TWIG-AR A;Lo;0;L;;;;;N;;;;; 16C7;RUNIC LETTER IWAZ EOH;Lo;0;L;;;;;N;;;;; 16C8;RUNIC LETTER PERTHO PEORTH P;Lo;0;L;;;;;N;;;;; 16C9;RUNIC LETTER ALGIZ EOLHX;Lo;0;L;;;;;N;;;;; 16CA;RUNIC LETTER SOWILO S;Lo;0;L;;;;;N;;;;; 16CB;RUNIC LETTER SIGEL LONG-BRANCH-SOL S;Lo;0;L;;;;;N;;;;; 16CC;RUNIC LETTER SHORT-TWIG-SOL S;Lo;0;L;;;;;N;;;;; 16CD;RUNIC LETTER C;Lo;0;L;;;;;N;;;;; 16CE;RUNIC LETTER Z;Lo;0;L;;;;;N;;;;; 16CF;RUNIC LETTER TIWAZ TIR TYR T;Lo;0;L;;;;;N;;;;; 16D0;RUNIC LETTER SHORT-TWIG-TYR T;Lo;0;L;;;;;N;;;;; 16D1;RUNIC LETTER D;Lo;0;L;;;;;N;;;;; 16D2;RUNIC LETTER BERKANAN BEORC BJARKAN B;Lo;0;L;;;;;N;;;;; 16D3;RUNIC LETTER SHORT-TWIG-BJARKAN B;Lo;0;L;;;;;N;;;;; 16D4;RUNIC LETTER DOTTED-P;Lo;0;L;;;;;N;;;;; 16D5;RUNIC LETTER OPEN-P;Lo;0;L;;;;;N;;;;; 16D6;RUNIC LETTER EHWAZ EH E;Lo;0;L;;;;;N;;;;; 16D7;RUNIC LETTER MANNAZ MAN M;Lo;0;L;;;;;N;;;;; 16D8;RUNIC LETTER LONG-BRANCH-MADR M;Lo;0;L;;;;;N;;;;; 16D9;RUNIC LETTER SHORT-TWIG-MADR M;Lo;0;L;;;;;N;;;;; 16DA;RUNIC LETTER LAUKAZ LAGU LOGR L;Lo;0;L;;;;;N;;;;; 16DB;RUNIC LETTER DOTTED-L;Lo;0;L;;;;;N;;;;; 16DC;RUNIC LETTER INGWAZ;Lo;0;L;;;;;N;;;;; 16DD;RUNIC LETTER ING;Lo;0;L;;;;;N;;;;; 16DE;RUNIC LETTER DAGAZ DAEG D;Lo;0;L;;;;;N;;;;; 16DF;RUNIC LETTER OTHALAN ETHEL O;Lo;0;L;;;;;N;;;;; 16E0;RUNIC LETTER EAR;Lo;0;L;;;;;N;;;;; 16E1;RUNIC LETTER IOR;Lo;0;L;;;;;N;;;;; 16E2;RUNIC LETTER CWEORTH;Lo;0;L;;;;;N;;;;; 16E3;RUNIC LETTER CALC;Lo;0;L;;;;;N;;;;; 16E4;RUNIC LETTER CEALC;Lo;0;L;;;;;N;;;;; 16E5;RUNIC LETTER STAN;Lo;0;L;;;;;N;;;;; 16E6;RUNIC LETTER LONG-BRANCH-YR;Lo;0;L;;;;;N;;;;; 16E7;RUNIC LETTER SHORT-TWIG-YR;Lo;0;L;;;;;N;;;;; 16E8;RUNIC LETTER ICELANDIC-YR;Lo;0;L;;;;;N;;;;; 16E9;RUNIC LETTER Q;Lo;0;L;;;;;N;;;;; 16EA;RUNIC LETTER X;Lo;0;L;;;;;N;;;;; 16EB;RUNIC SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; 16EC;RUNIC MULTIPLE PUNCTUATION;Po;0;L;;;;;N;;;;; 16ED;RUNIC CROSS PUNCTUATION;Po;0;L;;;;;N;;;;; 16EE;RUNIC ARLAUG SYMBOL;Nl;0;L;;;;17;N;;;;; 16EF;RUNIC TVIMADUR SYMBOL;Nl;0;L;;;;18;N;;;;; 16F0;RUNIC BELGTHOR SYMBOL;Nl;0;L;;;;19;N;;;;; 16F1;RUNIC LETTER K;Lo;0;L;;;;;N;;;;; 16F2;RUNIC LETTER SH;Lo;0;L;;;;;N;;;;; 16F3;RUNIC LETTER OO;Lo;0;L;;;;;N;;;;; 16F4;RUNIC LETTER FRANKS CASKET OS;Lo;0;L;;;;;N;;;;; 16F5;RUNIC LETTER FRANKS CASKET IS;Lo;0;L;;;;;N;;;;; 16F6;RUNIC LETTER FRANKS CASKET EH;Lo;0;L;;;;;N;;;;; 16F7;RUNIC LETTER FRANKS CASKET AC;Lo;0;L;;;;;N;;;;; 16F8;RUNIC LETTER FRANKS CASKET AESC;Lo;0;L;;;;;N;;;;; 1700;TAGALOG LETTER A;Lo;0;L;;;;;N;;;;; 1701;TAGALOG LETTER I;Lo;0;L;;;;;N;;;;; 1702;TAGALOG LETTER U;Lo;0;L;;;;;N;;;;; 1703;TAGALOG LETTER KA;Lo;0;L;;;;;N;;;;; 1704;TAGALOG LETTER GA;Lo;0;L;;;;;N;;;;; 1705;TAGALOG LETTER NGA;Lo;0;L;;;;;N;;;;; 1706;TAGALOG LETTER TA;Lo;0;L;;;;;N;;;;; 1707;TAGALOG LETTER DA;Lo;0;L;;;;;N;;;;; 1708;TAGALOG LETTER NA;Lo;0;L;;;;;N;;;;; 1709;TAGALOG LETTER PA;Lo;0;L;;;;;N;;;;; 170A;TAGALOG LETTER BA;Lo;0;L;;;;;N;;;;; 170B;TAGALOG LETTER MA;Lo;0;L;;;;;N;;;;; 170C;TAGALOG LETTER YA;Lo;0;L;;;;;N;;;;; 170E;TAGALOG LETTER LA;Lo;0;L;;;;;N;;;;; 170F;TAGALOG LETTER WA;Lo;0;L;;;;;N;;;;; 1710;TAGALOG LETTER SA;Lo;0;L;;;;;N;;;;; 1711;TAGALOG LETTER HA;Lo;0;L;;;;;N;;;;; 1712;TAGALOG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; 1713;TAGALOG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 1714;TAGALOG SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; 1720;HANUNOO LETTER A;Lo;0;L;;;;;N;;;;; 1721;HANUNOO LETTER I;Lo;0;L;;;;;N;;;;; 1722;HANUNOO LETTER U;Lo;0;L;;;;;N;;;;; 1723;HANUNOO LETTER KA;Lo;0;L;;;;;N;;;;; 1724;HANUNOO LETTER GA;Lo;0;L;;;;;N;;;;; 1725;HANUNOO LETTER NGA;Lo;0;L;;;;;N;;;;; 1726;HANUNOO LETTER TA;Lo;0;L;;;;;N;;;;; 1727;HANUNOO LETTER DA;Lo;0;L;;;;;N;;;;; 1728;HANUNOO LETTER NA;Lo;0;L;;;;;N;;;;; 1729;HANUNOO LETTER PA;Lo;0;L;;;;;N;;;;; 172A;HANUNOO LETTER BA;Lo;0;L;;;;;N;;;;; 172B;HANUNOO LETTER MA;Lo;0;L;;;;;N;;;;; 172C;HANUNOO LETTER YA;Lo;0;L;;;;;N;;;;; 172D;HANUNOO LETTER RA;Lo;0;L;;;;;N;;;;; 172E;HANUNOO LETTER LA;Lo;0;L;;;;;N;;;;; 172F;HANUNOO LETTER WA;Lo;0;L;;;;;N;;;;; 1730;HANUNOO LETTER SA;Lo;0;L;;;;;N;;;;; 1731;HANUNOO LETTER HA;Lo;0;L;;;;;N;;;;; 1732;HANUNOO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; 1733;HANUNOO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 1734;HANUNOO SIGN PAMUDPOD;Mn;9;NSM;;;;;N;;;;; 1735;PHILIPPINE SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; 1736;PHILIPPINE DOUBLE PUNCTUATION;Po;0;L;;;;;N;;;;; 1740;BUHID LETTER A;Lo;0;L;;;;;N;;;;; 1741;BUHID LETTER I;Lo;0;L;;;;;N;;;;; 1742;BUHID LETTER U;Lo;0;L;;;;;N;;;;; 1743;BUHID LETTER KA;Lo;0;L;;;;;N;;;;; 1744;BUHID LETTER GA;Lo;0;L;;;;;N;;;;; 1745;BUHID LETTER NGA;Lo;0;L;;;;;N;;;;; 1746;BUHID LETTER TA;Lo;0;L;;;;;N;;;;; 1747;BUHID LETTER DA;Lo;0;L;;;;;N;;;;; 1748;BUHID LETTER NA;Lo;0;L;;;;;N;;;;; 1749;BUHID LETTER PA;Lo;0;L;;;;;N;;;;; 174A;BUHID LETTER BA;Lo;0;L;;;;;N;;;;; 174B;BUHID LETTER MA;Lo;0;L;;;;;N;;;;; 174C;BUHID LETTER YA;Lo;0;L;;;;;N;;;;; 174D;BUHID LETTER RA;Lo;0;L;;;;;N;;;;; 174E;BUHID LETTER LA;Lo;0;L;;;;;N;;;;; 174F;BUHID LETTER WA;Lo;0;L;;;;;N;;;;; 1750;BUHID LETTER SA;Lo;0;L;;;;;N;;;;; 1751;BUHID LETTER HA;Lo;0;L;;;;;N;;;;; 1752;BUHID VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; 1753;BUHID VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 1760;TAGBANWA LETTER A;Lo;0;L;;;;;N;;;;; 1761;TAGBANWA LETTER I;Lo;0;L;;;;;N;;;;; 1762;TAGBANWA LETTER U;Lo;0;L;;;;;N;;;;; 1763;TAGBANWA LETTER KA;Lo;0;L;;;;;N;;;;; 1764;TAGBANWA LETTER GA;Lo;0;L;;;;;N;;;;; 1765;TAGBANWA LETTER NGA;Lo;0;L;;;;;N;;;;; 1766;TAGBANWA LETTER TA;Lo;0;L;;;;;N;;;;; 1767;TAGBANWA LETTER DA;Lo;0;L;;;;;N;;;;; 1768;TAGBANWA LETTER NA;Lo;0;L;;;;;N;;;;; 1769;TAGBANWA LETTER PA;Lo;0;L;;;;;N;;;;; 176A;TAGBANWA LETTER BA;Lo;0;L;;;;;N;;;;; 176B;TAGBANWA LETTER MA;Lo;0;L;;;;;N;;;;; 176C;TAGBANWA LETTER YA;Lo;0;L;;;;;N;;;;; 176E;TAGBANWA LETTER LA;Lo;0;L;;;;;N;;;;; 176F;TAGBANWA LETTER WA;Lo;0;L;;;;;N;;;;; 1770;TAGBANWA LETTER SA;Lo;0;L;;;;;N;;;;; 1772;TAGBANWA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; 1773;TAGBANWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 1780;KHMER LETTER KA;Lo;0;L;;;;;N;;;;; 1781;KHMER LETTER KHA;Lo;0;L;;;;;N;;;;; 1782;KHMER LETTER KO;Lo;0;L;;;;;N;;;;; 1783;KHMER LETTER KHO;Lo;0;L;;;;;N;;;;; 1784;KHMER LETTER NGO;Lo;0;L;;;;;N;;;;; 1785;KHMER LETTER CA;Lo;0;L;;;;;N;;;;; 1786;KHMER LETTER CHA;Lo;0;L;;;;;N;;;;; 1787;KHMER LETTER CO;Lo;0;L;;;;;N;;;;; 1788;KHMER LETTER CHO;Lo;0;L;;;;;N;;;;; 1789;KHMER LETTER NYO;Lo;0;L;;;;;N;;;;; 178A;KHMER LETTER DA;Lo;0;L;;;;;N;;;;; 178B;KHMER LETTER TTHA;Lo;0;L;;;;;N;;;;; 178C;KHMER LETTER DO;Lo;0;L;;;;;N;;;;; 178D;KHMER LETTER TTHO;Lo;0;L;;;;;N;;;;; 178E;KHMER LETTER NNO;Lo;0;L;;;;;N;;;;; 178F;KHMER LETTER TA;Lo;0;L;;;;;N;;;;; 1790;KHMER LETTER THA;Lo;0;L;;;;;N;;;;; 1791;KHMER LETTER TO;Lo;0;L;;;;;N;;;;; 1792;KHMER LETTER THO;Lo;0;L;;;;;N;;;;; 1793;KHMER LETTER NO;Lo;0;L;;;;;N;;;;; 1794;KHMER LETTER BA;Lo;0;L;;;;;N;;;;; 1795;KHMER LETTER PHA;Lo;0;L;;;;;N;;;;; 1796;KHMER LETTER PO;Lo;0;L;;;;;N;;;;; 1797;KHMER LETTER PHO;Lo;0;L;;;;;N;;;;; 1798;KHMER LETTER MO;Lo;0;L;;;;;N;;;;; 1799;KHMER LETTER YO;Lo;0;L;;;;;N;;;;; 179A;KHMER LETTER RO;Lo;0;L;;;;;N;;;;; 179B;KHMER LETTER LO;Lo;0;L;;;;;N;;;;; 179C;KHMER LETTER VO;Lo;0;L;;;;;N;;;;; 179D;KHMER LETTER SHA;Lo;0;L;;;;;N;;;;; 179E;KHMER LETTER SSO;Lo;0;L;;;;;N;;;;; 179F;KHMER LETTER SA;Lo;0;L;;;;;N;;;;; 17A0;KHMER LETTER HA;Lo;0;L;;;;;N;;;;; 17A1;KHMER LETTER LA;Lo;0;L;;;;;N;;;;; 17A2;KHMER LETTER QA;Lo;0;L;;;;;N;;;;; 17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;;;; 17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;;;; 17A5;KHMER INDEPENDENT VOWEL QI;Lo;0;L;;;;;N;;;;; 17A6;KHMER INDEPENDENT VOWEL QII;Lo;0;L;;;;;N;;;;; 17A7;KHMER INDEPENDENT VOWEL QU;Lo;0;L;;;;;N;;;;; 17A8;KHMER INDEPENDENT VOWEL QUK;Lo;0;L;;;;;N;;;;; 17A9;KHMER INDEPENDENT VOWEL QUU;Lo;0;L;;;;;N;;;;; 17AA;KHMER INDEPENDENT VOWEL QUUV;Lo;0;L;;;;;N;;;;; 17AB;KHMER INDEPENDENT VOWEL RY;Lo;0;L;;;;;N;;;;; 17AC;KHMER INDEPENDENT VOWEL RYY;Lo;0;L;;;;;N;;;;; 17AD;KHMER INDEPENDENT VOWEL LY;Lo;0;L;;;;;N;;;;; 17AE;KHMER INDEPENDENT VOWEL LYY;Lo;0;L;;;;;N;;;;; 17AF;KHMER INDEPENDENT VOWEL QE;Lo;0;L;;;;;N;;;;; 17B0;KHMER INDEPENDENT VOWEL QAI;Lo;0;L;;;;;N;;;;; 17B1;KHMER INDEPENDENT VOWEL QOO TYPE ONE;Lo;0;L;;;;;N;;;;; 17B2;KHMER INDEPENDENT VOWEL QOO TYPE TWO;Lo;0;L;;;;;N;;;;; 17B3;KHMER INDEPENDENT VOWEL QAU;Lo;0;L;;;;;N;;;;; 17B4;KHMER VOWEL INHERENT AQ;Mn;0;NSM;;;;;N;;;;; 17B5;KHMER VOWEL INHERENT AA;Mn;0;NSM;;;;;N;;;;; 17B6;KHMER VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 17B7;KHMER VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; 17B8;KHMER VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; 17B9;KHMER VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; 17BA;KHMER VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; 17BB;KHMER VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 17BC;KHMER VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 17BD;KHMER VOWEL SIGN UA;Mn;0;NSM;;;;;N;;;;; 17BE;KHMER VOWEL SIGN OE;Mc;0;L;;;;;N;;;;; 17BF;KHMER VOWEL SIGN YA;Mc;0;L;;;;;N;;;;; 17C0;KHMER VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; 17C1;KHMER VOWEL SIGN E;Mc;0;L;;;;;N;;;;; 17C2;KHMER VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; 17C3;KHMER VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; 17C4;KHMER VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; 17C5;KHMER VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; 17C6;KHMER SIGN NIKAHIT;Mn;0;NSM;;;;;N;;;;; 17C7;KHMER SIGN REAHMUK;Mc;0;L;;;;;N;;;;; 17C8;KHMER SIGN YUUKALEAPINTU;Mc;0;L;;;;;N;;;;; 17C9;KHMER SIGN MUUSIKATOAN;Mn;0;NSM;;;;;N;;;;; 17CA;KHMER SIGN TRIISAP;Mn;0;NSM;;;;;N;;;;; 17CB;KHMER SIGN BANTOC;Mn;0;NSM;;;;;N;;;;; 17CC;KHMER SIGN ROBAT;Mn;0;NSM;;;;;N;;;;; 17CD;KHMER SIGN TOANDAKHIAT;Mn;0;NSM;;;;;N;;;;; 17CE;KHMER SIGN KAKABAT;Mn;0;NSM;;;;;N;;;;; 17CF;KHMER SIGN AHSDA;Mn;0;NSM;;;;;N;;;;; 17D0;KHMER SIGN SAMYOK SANNYA;Mn;0;NSM;;;;;N;;;;; 17D1;KHMER SIGN VIRIAM;Mn;0;NSM;;;;;N;;;;; 17D2;KHMER SIGN COENG;Mn;9;NSM;;;;;N;;;;; 17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;;;; 17D4;KHMER SIGN KHAN;Po;0;L;;;;;N;;;;; 17D5;KHMER SIGN BARIYOOSAN;Po;0;L;;;;;N;;;;; 17D6;KHMER SIGN CAMNUC PII KUUH;Po;0;L;;;;;N;;;;; 17D7;KHMER SIGN LEK TOO;Lm;0;L;;;;;N;;;;; 17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;;;; 17D9;KHMER SIGN PHNAEK MUAN;Po;0;L;;;;;N;;;;; 17DA;KHMER SIGN KOOMUUT;Po;0;L;;;;;N;;;;; 17DB;KHMER CURRENCY SYMBOL RIEL;Sc;0;ET;;;;;N;;;;; 17DC;KHMER SIGN AVAKRAHASANYA;Lo;0;L;;;;;N;;;;; 17DD;KHMER SIGN ATTHACAN;Mn;230;NSM;;;;;N;;;;; 17E0;KHMER DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 17E1;KHMER DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 17E2;KHMER DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 17E3;KHMER DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 17E4;KHMER DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 17E5;KHMER DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 17E6;KHMER DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 17E7;KHMER DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 17E8;KHMER DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 17E9;KHMER DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 17F0;KHMER SYMBOL LEK ATTAK SON;No;0;ON;;;;0;N;;;;; 17F1;KHMER SYMBOL LEK ATTAK MUOY;No;0;ON;;;;1;N;;;;; 17F2;KHMER SYMBOL LEK ATTAK PII;No;0;ON;;;;2;N;;;;; 17F3;KHMER SYMBOL LEK ATTAK BEI;No;0;ON;;;;3;N;;;;; 17F4;KHMER SYMBOL LEK ATTAK BUON;No;0;ON;;;;4;N;;;;; 17F5;KHMER SYMBOL LEK ATTAK PRAM;No;0;ON;;;;5;N;;;;; 17F6;KHMER SYMBOL LEK ATTAK PRAM-MUOY;No;0;ON;;;;6;N;;;;; 17F7;KHMER SYMBOL LEK ATTAK PRAM-PII;No;0;ON;;;;7;N;;;;; 17F8;KHMER SYMBOL LEK ATTAK PRAM-BEI;No;0;ON;;;;8;N;;;;; 17F9;KHMER SYMBOL LEK ATTAK PRAM-BUON;No;0;ON;;;;9;N;;;;; 1800;MONGOLIAN BIRGA;Po;0;ON;;;;;N;;;;; 1801;MONGOLIAN ELLIPSIS;Po;0;ON;;;;;N;;;;; 1802;MONGOLIAN COMMA;Po;0;ON;;;;;N;;;;; 1803;MONGOLIAN FULL STOP;Po;0;ON;;;;;N;;;;; 1804;MONGOLIAN COLON;Po;0;ON;;;;;N;;;;; 1805;MONGOLIAN FOUR DOTS;Po;0;ON;;;;;N;;;;; 1806;MONGOLIAN TODO SOFT HYPHEN;Pd;0;ON;;;;;N;;;;; 1807;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER;Po;0;ON;;;;;N;;;;; 1808;MONGOLIAN MANCHU COMMA;Po;0;ON;;;;;N;;;;; 1809;MONGOLIAN MANCHU FULL STOP;Po;0;ON;;;;;N;;;;; 180A;MONGOLIAN NIRUGU;Po;0;ON;;;;;N;;;;; 180B;MONGOLIAN FREE VARIATION SELECTOR ONE;Mn;0;NSM;;;;;N;;;;; 180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Mn;0;NSM;;;;;N;;;;; 180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Mn;0;NSM;;;;;N;;;;; 180E;MONGOLIAN VOWEL SEPARATOR;Cf;0;BN;;;;;N;;;;; 1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 1813;MONGOLIAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 1814;MONGOLIAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 1815;MONGOLIAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 1816;MONGOLIAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 1817;MONGOLIAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 1818;MONGOLIAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 1819;MONGOLIAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 1820;MONGOLIAN LETTER A;Lo;0;L;;;;;N;;;;; 1821;MONGOLIAN LETTER E;Lo;0;L;;;;;N;;;;; 1822;MONGOLIAN LETTER I;Lo;0;L;;;;;N;;;;; 1823;MONGOLIAN LETTER O;Lo;0;L;;;;;N;;;;; 1824;MONGOLIAN LETTER U;Lo;0;L;;;;;N;;;;; 1825;MONGOLIAN LETTER OE;Lo;0;L;;;;;N;;;;; 1826;MONGOLIAN LETTER UE;Lo;0;L;;;;;N;;;;; 1827;MONGOLIAN LETTER EE;Lo;0;L;;;;;N;;;;; 1828;MONGOLIAN LETTER NA;Lo;0;L;;;;;N;;;;; 1829;MONGOLIAN LETTER ANG;Lo;0;L;;;;;N;;;;; 182A;MONGOLIAN LETTER BA;Lo;0;L;;;;;N;;;;; 182B;MONGOLIAN LETTER PA;Lo;0;L;;;;;N;;;;; 182C;MONGOLIAN LETTER QA;Lo;0;L;;;;;N;;;;; 182D;MONGOLIAN LETTER GA;Lo;0;L;;;;;N;;;;; 182E;MONGOLIAN LETTER MA;Lo;0;L;;;;;N;;;;; 182F;MONGOLIAN LETTER LA;Lo;0;L;;;;;N;;;;; 1830;MONGOLIAN LETTER SA;Lo;0;L;;;;;N;;;;; 1831;MONGOLIAN LETTER SHA;Lo;0;L;;;;;N;;;;; 1832;MONGOLIAN LETTER TA;Lo;0;L;;;;;N;;;;; 1833;MONGOLIAN LETTER DA;Lo;0;L;;;;;N;;;;; 1834;MONGOLIAN LETTER CHA;Lo;0;L;;;;;N;;;;; 1835;MONGOLIAN LETTER JA;Lo;0;L;;;;;N;;;;; 1836;MONGOLIAN LETTER YA;Lo;0;L;;;;;N;;;;; 1837;MONGOLIAN LETTER RA;Lo;0;L;;;;;N;;;;; 1838;MONGOLIAN LETTER WA;Lo;0;L;;;;;N;;;;; 1839;MONGOLIAN LETTER FA;Lo;0;L;;;;;N;;;;; 183A;MONGOLIAN LETTER KA;Lo;0;L;;;;;N;;;;; 183B;MONGOLIAN LETTER KHA;Lo;0;L;;;;;N;;;;; 183C;MONGOLIAN LETTER TSA;Lo;0;L;;;;;N;;;;; 183D;MONGOLIAN LETTER ZA;Lo;0;L;;;;;N;;;;; 183E;MONGOLIAN LETTER HAA;Lo;0;L;;;;;N;;;;; 183F;MONGOLIAN LETTER ZRA;Lo;0;L;;;;;N;;;;; 1840;MONGOLIAN LETTER LHA;Lo;0;L;;;;;N;;;;; 1841;MONGOLIAN LETTER ZHI;Lo;0;L;;;;;N;;;;; 1842;MONGOLIAN LETTER CHI;Lo;0;L;;;;;N;;;;; 1843;MONGOLIAN LETTER TODO LONG VOWEL SIGN;Lm;0;L;;;;;N;;;;; 1844;MONGOLIAN LETTER TODO E;Lo;0;L;;;;;N;;;;; 1845;MONGOLIAN LETTER TODO I;Lo;0;L;;;;;N;;;;; 1846;MONGOLIAN LETTER TODO O;Lo;0;L;;;;;N;;;;; 1847;MONGOLIAN LETTER TODO U;Lo;0;L;;;;;N;;;;; 1848;MONGOLIAN LETTER TODO OE;Lo;0;L;;;;;N;;;;; 1849;MONGOLIAN LETTER TODO UE;Lo;0;L;;;;;N;;;;; 184A;MONGOLIAN LETTER TODO ANG;Lo;0;L;;;;;N;;;;; 184B;MONGOLIAN LETTER TODO BA;Lo;0;L;;;;;N;;;;; 184C;MONGOLIAN LETTER TODO PA;Lo;0;L;;;;;N;;;;; 184D;MONGOLIAN LETTER TODO QA;Lo;0;L;;;;;N;;;;; 184E;MONGOLIAN LETTER TODO GA;Lo;0;L;;;;;N;;;;; 184F;MONGOLIAN LETTER TODO MA;Lo;0;L;;;;;N;;;;; 1850;MONGOLIAN LETTER TODO TA;Lo;0;L;;;;;N;;;;; 1851;MONGOLIAN LETTER TODO DA;Lo;0;L;;;;;N;;;;; 1852;MONGOLIAN LETTER TODO CHA;Lo;0;L;;;;;N;;;;; 1853;MONGOLIAN LETTER TODO JA;Lo;0;L;;;;;N;;;;; 1854;MONGOLIAN LETTER TODO TSA;Lo;0;L;;;;;N;;;;; 1855;MONGOLIAN LETTER TODO YA;Lo;0;L;;;;;N;;;;; 1856;MONGOLIAN LETTER TODO WA;Lo;0;L;;;;;N;;;;; 1857;MONGOLIAN LETTER TODO KA;Lo;0;L;;;;;N;;;;; 1858;MONGOLIAN LETTER TODO GAA;Lo;0;L;;;;;N;;;;; 1859;MONGOLIAN LETTER TODO HAA;Lo;0;L;;;;;N;;;;; 185A;MONGOLIAN LETTER TODO JIA;Lo;0;L;;;;;N;;;;; 185B;MONGOLIAN LETTER TODO NIA;Lo;0;L;;;;;N;;;;; 185C;MONGOLIAN LETTER TODO DZA;Lo;0;L;;;;;N;;;;; 185D;MONGOLIAN LETTER SIBE E;Lo;0;L;;;;;N;;;;; 185E;MONGOLIAN LETTER SIBE I;Lo;0;L;;;;;N;;;;; 185F;MONGOLIAN LETTER SIBE IY;Lo;0;L;;;;;N;;;;; 1860;MONGOLIAN LETTER SIBE UE;Lo;0;L;;;;;N;;;;; 1861;MONGOLIAN LETTER SIBE U;Lo;0;L;;;;;N;;;;; 1862;MONGOLIAN LETTER SIBE ANG;Lo;0;L;;;;;N;;;;; 1863;MONGOLIAN LETTER SIBE KA;Lo;0;L;;;;;N;;;;; 1864;MONGOLIAN LETTER SIBE GA;Lo;0;L;;;;;N;;;;; 1865;MONGOLIAN LETTER SIBE HA;Lo;0;L;;;;;N;;;;; 1866;MONGOLIAN LETTER SIBE PA;Lo;0;L;;;;;N;;;;; 1867;MONGOLIAN LETTER SIBE SHA;Lo;0;L;;;;;N;;;;; 1868;MONGOLIAN LETTER SIBE TA;Lo;0;L;;;;;N;;;;; 1869;MONGOLIAN LETTER SIBE DA;Lo;0;L;;;;;N;;;;; 186A;MONGOLIAN LETTER SIBE JA;Lo;0;L;;;;;N;;;;; 186B;MONGOLIAN LETTER SIBE FA;Lo;0;L;;;;;N;;;;; 186C;MONGOLIAN LETTER SIBE GAA;Lo;0;L;;;;;N;;;;; 186D;MONGOLIAN LETTER SIBE HAA;Lo;0;L;;;;;N;;;;; 186E;MONGOLIAN LETTER SIBE TSA;Lo;0;L;;;;;N;;;;; 186F;MONGOLIAN LETTER SIBE ZA;Lo;0;L;;;;;N;;;;; 1870;MONGOLIAN LETTER SIBE RAA;Lo;0;L;;;;;N;;;;; 1871;MONGOLIAN LETTER SIBE CHA;Lo;0;L;;;;;N;;;;; 1872;MONGOLIAN LETTER SIBE ZHA;Lo;0;L;;;;;N;;;;; 1873;MONGOLIAN LETTER MANCHU I;Lo;0;L;;;;;N;;;;; 1874;MONGOLIAN LETTER MANCHU KA;Lo;0;L;;;;;N;;;;; 1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;; 1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;; 1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;; 1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;; 1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;; 1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;; 1883;MONGOLIAN LETTER ALI GALI UBADAMA;Lo;0;L;;;;;N;;;;; 1884;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA;Lo;0;L;;;;;N;;;;; 1885;MONGOLIAN LETTER ALI GALI BALUDA;Mn;0;NSM;;;;;N;;;;; 1886;MONGOLIAN LETTER ALI GALI THREE BALUDA;Mn;0;NSM;;;;;N;;;;; 1887;MONGOLIAN LETTER ALI GALI A;Lo;0;L;;;;;N;;;;; 1888;MONGOLIAN LETTER ALI GALI I;Lo;0;L;;;;;N;;;;; 1889;MONGOLIAN LETTER ALI GALI KA;Lo;0;L;;;;;N;;;;; 188A;MONGOLIAN LETTER ALI GALI NGA;Lo;0;L;;;;;N;;;;; 188B;MONGOLIAN LETTER ALI GALI CA;Lo;0;L;;;;;N;;;;; 188C;MONGOLIAN LETTER ALI GALI TTA;Lo;0;L;;;;;N;;;;; 188D;MONGOLIAN LETTER ALI GALI TTHA;Lo;0;L;;;;;N;;;;; 188E;MONGOLIAN LETTER ALI GALI DDA;Lo;0;L;;;;;N;;;;; 188F;MONGOLIAN LETTER ALI GALI NNA;Lo;0;L;;;;;N;;;;; 1890;MONGOLIAN LETTER ALI GALI TA;Lo;0;L;;;;;N;;;;; 1891;MONGOLIAN LETTER ALI GALI DA;Lo;0;L;;;;;N;;;;; 1892;MONGOLIAN LETTER ALI GALI PA;Lo;0;L;;;;;N;;;;; 1893;MONGOLIAN LETTER ALI GALI PHA;Lo;0;L;;;;;N;;;;; 1894;MONGOLIAN LETTER ALI GALI SSA;Lo;0;L;;;;;N;;;;; 1895;MONGOLIAN LETTER ALI GALI ZHA;Lo;0;L;;;;;N;;;;; 1896;MONGOLIAN LETTER ALI GALI ZA;Lo;0;L;;;;;N;;;;; 1897;MONGOLIAN LETTER ALI GALI AH;Lo;0;L;;;;;N;;;;; 1898;MONGOLIAN LETTER TODO ALI GALI TA;Lo;0;L;;;;;N;;;;; 1899;MONGOLIAN LETTER TODO ALI GALI ZHA;Lo;0;L;;;;;N;;;;; 189A;MONGOLIAN LETTER MANCHU ALI GALI GHA;Lo;0;L;;;;;N;;;;; 189B;MONGOLIAN LETTER MANCHU ALI GALI NGA;Lo;0;L;;;;;N;;;;; 189C;MONGOLIAN LETTER MANCHU ALI GALI CA;Lo;0;L;;;;;N;;;;; 189D;MONGOLIAN LETTER MANCHU ALI GALI JHA;Lo;0;L;;;;;N;;;;; 189E;MONGOLIAN LETTER MANCHU ALI GALI TTA;Lo;0;L;;;;;N;;;;; 189F;MONGOLIAN LETTER MANCHU ALI GALI DDHA;Lo;0;L;;;;;N;;;;; 18A0;MONGOLIAN LETTER MANCHU ALI GALI TA;Lo;0;L;;;;;N;;;;; 18A1;MONGOLIAN LETTER MANCHU ALI GALI DHA;Lo;0;L;;;;;N;;;;; 18A2;MONGOLIAN LETTER MANCHU ALI GALI SSA;Lo;0;L;;;;;N;;;;; 18A3;MONGOLIAN LETTER MANCHU ALI GALI CYA;Lo;0;L;;;;;N;;;;; 18A4;MONGOLIAN LETTER MANCHU ALI GALI ZHA;Lo;0;L;;;;;N;;;;; 18A5;MONGOLIAN LETTER MANCHU ALI GALI ZA;Lo;0;L;;;;;N;;;;; 18A6;MONGOLIAN LETTER ALI GALI HALF U;Lo;0;L;;;;;N;;;;; 18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;; 18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;; 18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;; 18AA;MONGOLIAN LETTER MANCHU ALI GALI LHA;Lo;0;L;;;;;N;;;;; 18B0;CANADIAN SYLLABICS OY;Lo;0;L;;;;;N;;;;; 18B1;CANADIAN SYLLABICS AY;Lo;0;L;;;;;N;;;;; 18B2;CANADIAN SYLLABICS AAY;Lo;0;L;;;;;N;;;;; 18B3;CANADIAN SYLLABICS WAY;Lo;0;L;;;;;N;;;;; 18B4;CANADIAN SYLLABICS POY;Lo;0;L;;;;;N;;;;; 18B5;CANADIAN SYLLABICS PAY;Lo;0;L;;;;;N;;;;; 18B6;CANADIAN SYLLABICS PWOY;Lo;0;L;;;;;N;;;;; 18B7;CANADIAN SYLLABICS TAY;Lo;0;L;;;;;N;;;;; 18B8;CANADIAN SYLLABICS KAY;Lo;0;L;;;;;N;;;;; 18B9;CANADIAN SYLLABICS KWAY;Lo;0;L;;;;;N;;;;; 18BA;CANADIAN SYLLABICS MAY;Lo;0;L;;;;;N;;;;; 18BB;CANADIAN SYLLABICS NOY;Lo;0;L;;;;;N;;;;; 18BC;CANADIAN SYLLABICS NAY;Lo;0;L;;;;;N;;;;; 18BD;CANADIAN SYLLABICS LAY;Lo;0;L;;;;;N;;;;; 18BE;CANADIAN SYLLABICS SOY;Lo;0;L;;;;;N;;;;; 18BF;CANADIAN SYLLABICS SAY;Lo;0;L;;;;;N;;;;; 18C0;CANADIAN SYLLABICS SHOY;Lo;0;L;;;;;N;;;;; 18C1;CANADIAN SYLLABICS SHAY;Lo;0;L;;;;;N;;;;; 18C2;CANADIAN SYLLABICS SHWOY;Lo;0;L;;;;;N;;;;; 18C3;CANADIAN SYLLABICS YOY;Lo;0;L;;;;;N;;;;; 18C4;CANADIAN SYLLABICS YAY;Lo;0;L;;;;;N;;;;; 18C5;CANADIAN SYLLABICS RAY;Lo;0;L;;;;;N;;;;; 18C6;CANADIAN SYLLABICS NWI;Lo;0;L;;;;;N;;;;; 18C7;CANADIAN SYLLABICS OJIBWAY NWI;Lo;0;L;;;;;N;;;;; 18C8;CANADIAN SYLLABICS NWII;Lo;0;L;;;;;N;;;;; 18C9;CANADIAN SYLLABICS OJIBWAY NWII;Lo;0;L;;;;;N;;;;; 18CA;CANADIAN SYLLABICS NWO;Lo;0;L;;;;;N;;;;; 18CB;CANADIAN SYLLABICS OJIBWAY NWO;Lo;0;L;;;;;N;;;;; 18CC;CANADIAN SYLLABICS NWOO;Lo;0;L;;;;;N;;;;; 18CD;CANADIAN SYLLABICS OJIBWAY NWOO;Lo;0;L;;;;;N;;;;; 18CE;CANADIAN SYLLABICS RWEE;Lo;0;L;;;;;N;;;;; 18CF;CANADIAN SYLLABICS RWI;Lo;0;L;;;;;N;;;;; 18D0;CANADIAN SYLLABICS RWII;Lo;0;L;;;;;N;;;;; 18D1;CANADIAN SYLLABICS RWO;Lo;0;L;;;;;N;;;;; 18D2;CANADIAN SYLLABICS RWOO;Lo;0;L;;;;;N;;;;; 18D3;CANADIAN SYLLABICS RWA;Lo;0;L;;;;;N;;;;; 18D4;CANADIAN SYLLABICS OJIBWAY P;Lo;0;L;;;;;N;;;;; 18D5;CANADIAN SYLLABICS OJIBWAY T;Lo;0;L;;;;;N;;;;; 18D6;CANADIAN SYLLABICS OJIBWAY K;Lo;0;L;;;;;N;;;;; 18D7;CANADIAN SYLLABICS OJIBWAY C;Lo;0;L;;;;;N;;;;; 18D8;CANADIAN SYLLABICS OJIBWAY M;Lo;0;L;;;;;N;;;;; 18D9;CANADIAN SYLLABICS OJIBWAY N;Lo;0;L;;;;;N;;;;; 18DA;CANADIAN SYLLABICS OJIBWAY S;Lo;0;L;;;;;N;;;;; 18DB;CANADIAN SYLLABICS OJIBWAY SH;Lo;0;L;;;;;N;;;;; 18DC;CANADIAN SYLLABICS EASTERN W;Lo;0;L;;;;;N;;;;; 18DD;CANADIAN SYLLABICS WESTERN W;Lo;0;L;;;;;N;;;;; 18DE;CANADIAN SYLLABICS FINAL SMALL RING;Lo;0;L;;;;;N;;;;; 18DF;CANADIAN SYLLABICS FINAL RAISED DOT;Lo;0;L;;;;;N;;;;; 18E0;CANADIAN SYLLABICS R-CREE RWE;Lo;0;L;;;;;N;;;;; 18E1;CANADIAN SYLLABICS WEST-CREE LOO;Lo;0;L;;;;;N;;;;; 18E2;CANADIAN SYLLABICS WEST-CREE LAA;Lo;0;L;;;;;N;;;;; 18E3;CANADIAN SYLLABICS THWE;Lo;0;L;;;;;N;;;;; 18E4;CANADIAN SYLLABICS THWA;Lo;0;L;;;;;N;;;;; 18E5;CANADIAN SYLLABICS TTHWE;Lo;0;L;;;;;N;;;;; 18E6;CANADIAN SYLLABICS TTHOO;Lo;0;L;;;;;N;;;;; 18E7;CANADIAN SYLLABICS TTHAA;Lo;0;L;;;;;N;;;;; 18E8;CANADIAN SYLLABICS TLHWE;Lo;0;L;;;;;N;;;;; 18E9;CANADIAN SYLLABICS TLHOO;Lo;0;L;;;;;N;;;;; 18EA;CANADIAN SYLLABICS SAYISI SHWE;Lo;0;L;;;;;N;;;;; 18EB;CANADIAN SYLLABICS SAYISI SHOO;Lo;0;L;;;;;N;;;;; 18EC;CANADIAN SYLLABICS SAYISI HOO;Lo;0;L;;;;;N;;;;; 18ED;CANADIAN SYLLABICS CARRIER GWU;Lo;0;L;;;;;N;;;;; 18EE;CANADIAN SYLLABICS CARRIER DENE GEE;Lo;0;L;;;;;N;;;;; 18EF;CANADIAN SYLLABICS CARRIER GAA;Lo;0;L;;;;;N;;;;; 18F0;CANADIAN SYLLABICS CARRIER GWA;Lo;0;L;;;;;N;;;;; 18F1;CANADIAN SYLLABICS SAYISI JUU;Lo;0;L;;;;;N;;;;; 18F2;CANADIAN SYLLABICS CARRIER JWA;Lo;0;L;;;;;N;;;;; 18F3;CANADIAN SYLLABICS BEAVER DENE L;Lo;0;L;;;;;N;;;;; 18F4;CANADIAN SYLLABICS BEAVER DENE R;Lo;0;L;;;;;N;;;;; 18F5;CANADIAN SYLLABICS CARRIER DENTAL S;Lo;0;L;;;;;N;;;;; 1900;LIMBU VOWEL-CARRIER LETTER;Lo;0;L;;;;;N;;;;; 1901;LIMBU LETTER KA;Lo;0;L;;;;;N;;;;; 1902;LIMBU LETTER KHA;Lo;0;L;;;;;N;;;;; 1903;LIMBU LETTER GA;Lo;0;L;;;;;N;;;;; 1904;LIMBU LETTER GHA;Lo;0;L;;;;;N;;;;; 1905;LIMBU LETTER NGA;Lo;0;L;;;;;N;;;;; 1906;LIMBU LETTER CA;Lo;0;L;;;;;N;;;;; 1907;LIMBU LETTER CHA;Lo;0;L;;;;;N;;;;; 1908;LIMBU LETTER JA;Lo;0;L;;;;;N;;;;; 1909;LIMBU LETTER JHA;Lo;0;L;;;;;N;;;;; 190A;LIMBU LETTER YAN;Lo;0;L;;;;;N;;;;; 190B;LIMBU LETTER TA;Lo;0;L;;;;;N;;;;; 190C;LIMBU LETTER THA;Lo;0;L;;;;;N;;;;; 190D;LIMBU LETTER DA;Lo;0;L;;;;;N;;;;; 190E;LIMBU LETTER DHA;Lo;0;L;;;;;N;;;;; 190F;LIMBU LETTER NA;Lo;0;L;;;;;N;;;;; 1910;LIMBU LETTER PA;Lo;0;L;;;;;N;;;;; 1911;LIMBU LETTER PHA;Lo;0;L;;;;;N;;;;; 1912;LIMBU LETTER BA;Lo;0;L;;;;;N;;;;; 1913;LIMBU LETTER BHA;Lo;0;L;;;;;N;;;;; 1914;LIMBU LETTER MA;Lo;0;L;;;;;N;;;;; 1915;LIMBU LETTER YA;Lo;0;L;;;;;N;;;;; 1916;LIMBU LETTER RA;Lo;0;L;;;;;N;;;;; 1917;LIMBU LETTER LA;Lo;0;L;;;;;N;;;;; 1918;LIMBU LETTER WA;Lo;0;L;;;;;N;;;;; 1919;LIMBU LETTER SHA;Lo;0;L;;;;;N;;;;; 191A;LIMBU LETTER SSA;Lo;0;L;;;;;N;;;;; 191B;LIMBU LETTER SA;Lo;0;L;;;;;N;;;;; 191C;LIMBU LETTER HA;Lo;0;L;;;;;N;;;;; 191D;LIMBU LETTER GYAN;Lo;0;L;;;;;N;;;;; 191E;LIMBU LETTER TRA;Lo;0;L;;;;;N;;;;; 1920;LIMBU VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;; 1921;LIMBU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; 1922;LIMBU VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 1923;LIMBU VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; 1924;LIMBU VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; 1925;LIMBU VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; 1926;LIMBU VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; 1927;LIMBU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; 1928;LIMBU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; 1929;LIMBU SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; 192A;LIMBU SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; 192B;LIMBU SUBJOINED LETTER WA;Mc;0;L;;;;;N;;;;; 1930;LIMBU SMALL LETTER KA;Mc;0;L;;;;;N;;;;; 1931;LIMBU SMALL LETTER NGA;Mc;0;L;;;;;N;;;;; 1932;LIMBU SMALL LETTER ANUSVARA;Mn;0;NSM;;;;;N;;;;; 1933;LIMBU SMALL LETTER TA;Mc;0;L;;;;;N;;;;; 1934;LIMBU SMALL LETTER NA;Mc;0;L;;;;;N;;;;; 1935;LIMBU SMALL LETTER PA;Mc;0;L;;;;;N;;;;; 1936;LIMBU SMALL LETTER MA;Mc;0;L;;;;;N;;;;; 1937;LIMBU SMALL LETTER RA;Mc;0;L;;;;;N;;;;; 1938;LIMBU SMALL LETTER LA;Mc;0;L;;;;;N;;;;; 1939;LIMBU SIGN MUKPHRENG;Mn;222;NSM;;;;;N;;;;; 193A;LIMBU SIGN KEMPHRENG;Mn;230;NSM;;;;;N;;;;; 193B;LIMBU SIGN SA-I;Mn;220;NSM;;;;;N;;;;; 1940;LIMBU SIGN LOO;So;0;ON;;;;;N;;;;; 1944;LIMBU EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; 1945;LIMBU QUESTION MARK;Po;0;ON;;;;;N;;;;; 1946;LIMBU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 1947;LIMBU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 1948;LIMBU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 1949;LIMBU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 194A;LIMBU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 194B;LIMBU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 194C;LIMBU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 194D;LIMBU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 194E;LIMBU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 194F;LIMBU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 1950;TAI LE LETTER KA;Lo;0;L;;;;;N;;;;; 1951;TAI LE LETTER XA;Lo;0;L;;;;;N;;;;; 1952;TAI LE LETTER NGA;Lo;0;L;;;;;N;;;;; 1953;TAI LE LETTER TSA;Lo;0;L;;;;;N;;;;; 1954;TAI LE LETTER SA;Lo;0;L;;;;;N;;;;; 1955;TAI LE LETTER YA;Lo;0;L;;;;;N;;;;; 1956;TAI LE LETTER TA;Lo;0;L;;;;;N;;;;; 1957;TAI LE LETTER THA;Lo;0;L;;;;;N;;;;; 1958;TAI LE LETTER LA;Lo;0;L;;;;;N;;;;; 1959;TAI LE LETTER PA;Lo;0;L;;;;;N;;;;; 195A;TAI LE LETTER PHA;Lo;0;L;;;;;N;;;;; 195B;TAI LE LETTER MA;Lo;0;L;;;;;N;;;;; 195C;TAI LE LETTER FA;Lo;0;L;;;;;N;;;;; 195D;TAI LE LETTER VA;Lo;0;L;;;;;N;;;;; 195E;TAI LE LETTER HA;Lo;0;L;;;;;N;;;;; 195F;TAI LE LETTER QA;Lo;0;L;;;;;N;;;;; 1960;TAI LE LETTER KHA;Lo;0;L;;;;;N;;;;; 1961;TAI LE LETTER TSHA;Lo;0;L;;;;;N;;;;; 1962;TAI LE LETTER NA;Lo;0;L;;;;;N;;;;; 1963;TAI LE LETTER A;Lo;0;L;;;;;N;;;;; 1964;TAI LE LETTER I;Lo;0;L;;;;;N;;;;; 1965;TAI LE LETTER EE;Lo;0;L;;;;;N;;;;; 1966;TAI LE LETTER EH;Lo;0;L;;;;;N;;;;; 1967;TAI LE LETTER U;Lo;0;L;;;;;N;;;;; 1968;TAI LE LETTER OO;Lo;0;L;;;;;N;;;;; 1969;TAI LE LETTER O;Lo;0;L;;;;;N;;;;; 196A;TAI LE LETTER UE;Lo;0;L;;;;;N;;;;; 196B;TAI LE LETTER E;Lo;0;L;;;;;N;;;;; 196C;TAI LE LETTER AUE;Lo;0;L;;;;;N;;;;; 196D;TAI LE LETTER AI;Lo;0;L;;;;;N;;;;; 1970;TAI LE LETTER TONE-2;Lo;0;L;;;;;N;;;;; 1971;TAI LE LETTER TONE-3;Lo;0;L;;;;;N;;;;; 1972;TAI LE LETTER TONE-4;Lo;0;L;;;;;N;;;;; 1973;TAI LE LETTER TONE-5;Lo;0;L;;;;;N;;;;; 1974;TAI LE LETTER TONE-6;Lo;0;L;;;;;N;;;;; 1980;NEW TAI LUE LETTER HIGH QA;Lo;0;L;;;;;N;;;;; 1981;NEW TAI LUE LETTER LOW QA;Lo;0;L;;;;;N;;;;; 1982;NEW TAI LUE LETTER HIGH KA;Lo;0;L;;;;;N;;;;; 1983;NEW TAI LUE LETTER HIGH XA;Lo;0;L;;;;;N;;;;; 1984;NEW TAI LUE LETTER HIGH NGA;Lo;0;L;;;;;N;;;;; 1985;NEW TAI LUE LETTER LOW KA;Lo;0;L;;;;;N;;;;; 1986;NEW TAI LUE LETTER LOW XA;Lo;0;L;;;;;N;;;;; 1987;NEW TAI LUE LETTER LOW NGA;Lo;0;L;;;;;N;;;;; 1988;NEW TAI LUE LETTER HIGH TSA;Lo;0;L;;;;;N;;;;; 1989;NEW TAI LUE LETTER HIGH SA;Lo;0;L;;;;;N;;;;; 198A;NEW TAI LUE LETTER HIGH YA;Lo;0;L;;;;;N;;;;; 198B;NEW TAI LUE LETTER LOW TSA;Lo;0;L;;;;;N;;;;; 198C;NEW TAI LUE LETTER LOW SA;Lo;0;L;;;;;N;;;;; 198D;NEW TAI LUE LETTER LOW YA;Lo;0;L;;;;;N;;;;; 198E;NEW TAI LUE LETTER HIGH TA;Lo;0;L;;;;;N;;;;; 198F;NEW TAI LUE LETTER HIGH THA;Lo;0;L;;;;;N;;;;; 1990;NEW TAI LUE LETTER HIGH NA;Lo;0;L;;;;;N;;;;; 1991;NEW TAI LUE LETTER LOW TA;Lo;0;L;;;;;N;;;;; 1992;NEW TAI LUE LETTER LOW THA;Lo;0;L;;;;;N;;;;; 1993;NEW TAI LUE LETTER LOW NA;Lo;0;L;;;;;N;;;;; 1994;NEW TAI LUE LETTER HIGH PA;Lo;0;L;;;;;N;;;;; 1995;NEW TAI LUE LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; 1996;NEW TAI LUE LETTER HIGH MA;Lo;0;L;;;;;N;;;;; 1997;NEW TAI LUE LETTER LOW PA;Lo;0;L;;;;;N;;;;; 1998;NEW TAI LUE LETTER LOW PHA;Lo;0;L;;;;;N;;;;; 1999;NEW TAI LUE LETTER LOW MA;Lo;0;L;;;;;N;;;;; 199A;NEW TAI LUE LETTER HIGH FA;Lo;0;L;;;;;N;;;;; 199B;NEW TAI LUE LETTER HIGH VA;Lo;0;L;;;;;N;;;;; 199C;NEW TAI LUE LETTER HIGH LA;Lo;0;L;;;;;N;;;;; 199D;NEW TAI LUE LETTER LOW FA;Lo;0;L;;;;;N;;;;; 199E;NEW TAI LUE LETTER LOW VA;Lo;0;L;;;;;N;;;;; 199F;NEW TAI LUE LETTER LOW LA;Lo;0;L;;;;;N;;;;; 19A0;NEW TAI LUE LETTER HIGH HA;Lo;0;L;;;;;N;;;;; 19A1;NEW TAI LUE LETTER HIGH DA;Lo;0;L;;;;;N;;;;; 19A2;NEW TAI LUE LETTER HIGH BA;Lo;0;L;;;;;N;;;;; 19A3;NEW TAI LUE LETTER LOW HA;Lo;0;L;;;;;N;;;;; 19A4;NEW TAI LUE LETTER LOW DA;Lo;0;L;;;;;N;;;;; 19A5;NEW TAI LUE LETTER LOW BA;Lo;0;L;;;;;N;;;;; 19A6;NEW TAI LUE LETTER HIGH KVA;Lo;0;L;;;;;N;;;;; 19A7;NEW TAI LUE LETTER HIGH XVA;Lo;0;L;;;;;N;;;;; 19A8;NEW TAI LUE LETTER LOW KVA;Lo;0;L;;;;;N;;;;; 19A9;NEW TAI LUE LETTER LOW XVA;Lo;0;L;;;;;N;;;;; 19AA;NEW TAI LUE LETTER HIGH SUA;Lo;0;L;;;;;N;;;;; 19AB;NEW TAI LUE LETTER LOW SUA;Lo;0;L;;;;;N;;;;; 19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Lo;0;L;;;;;N;;;;; 19B1;NEW TAI LUE VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; 19B2;NEW TAI LUE VOWEL SIGN II;Lo;0;L;;;;;N;;;;; 19B3;NEW TAI LUE VOWEL SIGN U;Lo;0;L;;;;;N;;;;; 19B4;NEW TAI LUE VOWEL SIGN UU;Lo;0;L;;;;;N;;;;; 19B5;NEW TAI LUE VOWEL SIGN E;Lo;0;L;;;;;N;;;;; 19B6;NEW TAI LUE VOWEL SIGN AE;Lo;0;L;;;;;N;;;;; 19B7;NEW TAI LUE VOWEL SIGN O;Lo;0;L;;;;;N;;;;; 19B8;NEW TAI LUE VOWEL SIGN OA;Lo;0;L;;;;;N;;;;; 19B9;NEW TAI LUE VOWEL SIGN UE;Lo;0;L;;;;;N;;;;; 19BA;NEW TAI LUE VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; 19BB;NEW TAI LUE VOWEL SIGN AAY;Lo;0;L;;;;;N;;;;; 19BC;NEW TAI LUE VOWEL SIGN UY;Lo;0;L;;;;;N;;;;; 19BD;NEW TAI LUE VOWEL SIGN OY;Lo;0;L;;;;;N;;;;; 19BE;NEW TAI LUE VOWEL SIGN OAY;Lo;0;L;;;;;N;;;;; 19BF;NEW TAI LUE VOWEL SIGN UEY;Lo;0;L;;;;;N;;;;; 19C0;NEW TAI LUE VOWEL SIGN IY;Lo;0;L;;;;;N;;;;; 19C1;NEW TAI LUE LETTER FINAL V;Lo;0;L;;;;;N;;;;; 19C2;NEW TAI LUE LETTER FINAL NG;Lo;0;L;;;;;N;;;;; 19C3;NEW TAI LUE LETTER FINAL N;Lo;0;L;;;;;N;;;;; 19C4;NEW TAI LUE LETTER FINAL M;Lo;0;L;;;;;N;;;;; 19C5;NEW TAI LUE LETTER FINAL K;Lo;0;L;;;;;N;;;;; 19C6;NEW TAI LUE LETTER FINAL D;Lo;0;L;;;;;N;;;;; 19C7;NEW TAI LUE LETTER FINAL B;Lo;0;L;;;;;N;;;;; 19C8;NEW TAI LUE TONE MARK-1;Lo;0;L;;;;;N;;;;; 19C9;NEW TAI LUE TONE MARK-2;Lo;0;L;;;;;N;;;;; 19D0;NEW TAI LUE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 19D1;NEW TAI LUE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 19D2;NEW TAI LUE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 19D3;NEW TAI LUE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 19D4;NEW TAI LUE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 19D5;NEW TAI LUE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 19D6;NEW TAI LUE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 19D7;NEW TAI LUE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 19D8;NEW TAI LUE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 19D9;NEW TAI LUE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 19DA;NEW TAI LUE THAM DIGIT ONE;No;0;L;;;1;1;N;;;;; 19DE;NEW TAI LUE SIGN LAE;So;0;ON;;;;;N;;;;; 19DF;NEW TAI LUE SIGN LAEV;So;0;ON;;;;;N;;;;; 19E0;KHMER SYMBOL PATHAMASAT;So;0;ON;;;;;N;;;;; 19E1;KHMER SYMBOL MUOY KOET;So;0;ON;;;;;N;;;;; 19E2;KHMER SYMBOL PII KOET;So;0;ON;;;;;N;;;;; 19E3;KHMER SYMBOL BEI KOET;So;0;ON;;;;;N;;;;; 19E4;KHMER SYMBOL BUON KOET;So;0;ON;;;;;N;;;;; 19E5;KHMER SYMBOL PRAM KOET;So;0;ON;;;;;N;;;;; 19E6;KHMER SYMBOL PRAM-MUOY KOET;So;0;ON;;;;;N;;;;; 19E7;KHMER SYMBOL PRAM-PII KOET;So;0;ON;;;;;N;;;;; 19E8;KHMER SYMBOL PRAM-BEI KOET;So;0;ON;;;;;N;;;;; 19E9;KHMER SYMBOL PRAM-BUON KOET;So;0;ON;;;;;N;;;;; 19EA;KHMER SYMBOL DAP KOET;So;0;ON;;;;;N;;;;; 19EB;KHMER SYMBOL DAP-MUOY KOET;So;0;ON;;;;;N;;;;; 19EC;KHMER SYMBOL DAP-PII KOET;So;0;ON;;;;;N;;;;; 19ED;KHMER SYMBOL DAP-BEI KOET;So;0;ON;;;;;N;;;;; 19EE;KHMER SYMBOL DAP-BUON KOET;So;0;ON;;;;;N;;;;; 19EF;KHMER SYMBOL DAP-PRAM KOET;So;0;ON;;;;;N;;;;; 19F0;KHMER SYMBOL TUTEYASAT;So;0;ON;;;;;N;;;;; 19F1;KHMER SYMBOL MUOY ROC;So;0;ON;;;;;N;;;;; 19F2;KHMER SYMBOL PII ROC;So;0;ON;;;;;N;;;;; 19F3;KHMER SYMBOL BEI ROC;So;0;ON;;;;;N;;;;; 19F4;KHMER SYMBOL BUON ROC;So;0;ON;;;;;N;;;;; 19F5;KHMER SYMBOL PRAM ROC;So;0;ON;;;;;N;;;;; 19F6;KHMER SYMBOL PRAM-MUOY ROC;So;0;ON;;;;;N;;;;; 19F7;KHMER SYMBOL PRAM-PII ROC;So;0;ON;;;;;N;;;;; 19F8;KHMER SYMBOL PRAM-BEI ROC;So;0;ON;;;;;N;;;;; 19F9;KHMER SYMBOL PRAM-BUON ROC;So;0;ON;;;;;N;;;;; 19FA;KHMER SYMBOL DAP ROC;So;0;ON;;;;;N;;;;; 19FB;KHMER SYMBOL DAP-MUOY ROC;So;0;ON;;;;;N;;;;; 19FC;KHMER SYMBOL DAP-PII ROC;So;0;ON;;;;;N;;;;; 19FD;KHMER SYMBOL DAP-BEI ROC;So;0;ON;;;;;N;;;;; 19FE;KHMER SYMBOL DAP-BUON ROC;So;0;ON;;;;;N;;;;; 19FF;KHMER SYMBOL DAP-PRAM ROC;So;0;ON;;;;;N;;;;; 1A00;BUGINESE LETTER KA;Lo;0;L;;;;;N;;;;; 1A01;BUGINESE LETTER GA;Lo;0;L;;;;;N;;;;; 1A02;BUGINESE LETTER NGA;Lo;0;L;;;;;N;;;;; 1A03;BUGINESE LETTER NGKA;Lo;0;L;;;;;N;;;;; 1A04;BUGINESE LETTER PA;Lo;0;L;;;;;N;;;;; 1A05;BUGINESE LETTER BA;Lo;0;L;;;;;N;;;;; 1A06;BUGINESE LETTER MA;Lo;0;L;;;;;N;;;;; 1A07;BUGINESE LETTER MPA;Lo;0;L;;;;;N;;;;; 1A08;BUGINESE LETTER TA;Lo;0;L;;;;;N;;;;; 1A09;BUGINESE LETTER DA;Lo;0;L;;;;;N;;;;; 1A0A;BUGINESE LETTER NA;Lo;0;L;;;;;N;;;;; 1A0B;BUGINESE LETTER NRA;Lo;0;L;;;;;N;;;;; 1A0C;BUGINESE LETTER CA;Lo;0;L;;;;;N;;;;; 1A0D;BUGINESE LETTER JA;Lo;0;L;;;;;N;;;;; 1A0E;BUGINESE LETTER NYA;Lo;0;L;;;;;N;;;;; 1A0F;BUGINESE LETTER NYCA;Lo;0;L;;;;;N;;;;; 1A10;BUGINESE LETTER YA;Lo;0;L;;;;;N;;;;; 1A11;BUGINESE LETTER RA;Lo;0;L;;;;;N;;;;; 1A12;BUGINESE LETTER LA;Lo;0;L;;;;;N;;;;; 1A13;BUGINESE LETTER VA;Lo;0;L;;;;;N;;;;; 1A14;BUGINESE LETTER SA;Lo;0;L;;;;;N;;;;; 1A15;BUGINESE LETTER A;Lo;0;L;;;;;N;;;;; 1A16;BUGINESE LETTER HA;Lo;0;L;;;;;N;;;;; 1A17;BUGINESE VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; 1A18;BUGINESE VOWEL SIGN U;Mn;220;NSM;;;;;N;;;;; 1A19;BUGINESE VOWEL SIGN E;Mc;0;L;;;;;N;;;;; 1A1A;BUGINESE VOWEL SIGN O;Mc;0;L;;;;;N;;;;; 1A1B;BUGINESE VOWEL SIGN AE;Mn;0;NSM;;;;;N;;;;; 1A1E;BUGINESE PALLAWA;Po;0;L;;;;;N;;;;; 1A1F;BUGINESE END OF SECTION;Po;0;L;;;;;N;;;;; 1A20;TAI THAM LETTER HIGH KA;Lo;0;L;;;;;N;;;;; 1A21;TAI THAM LETTER HIGH KHA;Lo;0;L;;;;;N;;;;; 1A22;TAI THAM LETTER HIGH KXA;Lo;0;L;;;;;N;;;;; 1A23;TAI THAM LETTER LOW KA;Lo;0;L;;;;;N;;;;; 1A24;TAI THAM LETTER LOW KXA;Lo;0;L;;;;;N;;;;; 1A25;TAI THAM LETTER LOW KHA;Lo;0;L;;;;;N;;;;; 1A26;TAI THAM LETTER NGA;Lo;0;L;;;;;N;;;;; 1A27;TAI THAM LETTER HIGH CA;Lo;0;L;;;;;N;;;;; 1A28;TAI THAM LETTER HIGH CHA;Lo;0;L;;;;;N;;;;; 1A29;TAI THAM LETTER LOW CA;Lo;0;L;;;;;N;;;;; 1A2A;TAI THAM LETTER LOW SA;Lo;0;L;;;;;N;;;;; 1A2B;TAI THAM LETTER LOW CHA;Lo;0;L;;;;;N;;;;; 1A2C;TAI THAM LETTER NYA;Lo;0;L;;;;;N;;;;; 1A2D;TAI THAM LETTER RATA;Lo;0;L;;;;;N;;;;; 1A2E;TAI THAM LETTER HIGH RATHA;Lo;0;L;;;;;N;;;;; 1A2F;TAI THAM LETTER DA;Lo;0;L;;;;;N;;;;; 1A30;TAI THAM LETTER LOW RATHA;Lo;0;L;;;;;N;;;;; 1A31;TAI THAM LETTER RANA;Lo;0;L;;;;;N;;;;; 1A32;TAI THAM LETTER HIGH TA;Lo;0;L;;;;;N;;;;; 1A33;TAI THAM LETTER HIGH THA;Lo;0;L;;;;;N;;;;; 1A34;TAI THAM LETTER LOW TA;Lo;0;L;;;;;N;;;;; 1A35;TAI THAM LETTER LOW THA;Lo;0;L;;;;;N;;;;; 1A36;TAI THAM LETTER NA;Lo;0;L;;;;;N;;;;; 1A37;TAI THAM LETTER BA;Lo;0;L;;;;;N;;;;; 1A38;TAI THAM LETTER HIGH PA;Lo;0;L;;;;;N;;;;; 1A39;TAI THAM LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; 1A3A;TAI THAM LETTER HIGH FA;Lo;0;L;;;;;N;;;;; 1A3B;TAI THAM LETTER LOW PA;Lo;0;L;;;;;N;;;;; 1A3C;TAI THAM LETTER LOW FA;Lo;0;L;;;;;N;;;;; 1A3D;TAI THAM LETTER LOW PHA;Lo;0;L;;;;;N;;;;; 1A3E;TAI THAM LETTER MA;Lo;0;L;;;;;N;;;;; 1A3F;TAI THAM LETTER LOW YA;Lo;0;L;;;;;N;;;;; 1A40;TAI THAM LETTER HIGH YA;Lo;0;L;;;;;N;;;;; 1A41;TAI THAM LETTER RA;Lo;0;L;;;;;N;;;;; 1A42;TAI THAM LETTER RUE;Lo;0;L;;;;;N;;;;; 1A43;TAI THAM LETTER LA;Lo;0;L;;;;;N;;;;; 1A44;TAI THAM LETTER LUE;Lo;0;L;;;;;N;;;;; 1A45;TAI THAM LETTER WA;Lo;0;L;;;;;N;;;;; 1A46;TAI THAM LETTER HIGH SHA;Lo;0;L;;;;;N;;;;; 1A47;TAI THAM LETTER HIGH SSA;Lo;0;L;;;;;N;;;;; 1A48;TAI THAM LETTER HIGH SA;Lo;0;L;;;;;N;;;;; 1A49;TAI THAM LETTER HIGH HA;Lo;0;L;;;;;N;;;;; 1A4A;TAI THAM LETTER LLA;Lo;0;L;;;;;N;;;;; 1A4B;TAI THAM LETTER A;Lo;0;L;;;;;N;;;;; 1A4C;TAI THAM LETTER LOW HA;Lo;0;L;;;;;N;;;;; 1A4D;TAI THAM LETTER I;Lo;0;L;;;;;N;;;;; 1A4E;TAI THAM LETTER II;Lo;0;L;;;;;N;;;;; 1A4F;TAI THAM LETTER U;Lo;0;L;;;;;N;;;;; 1A50;TAI THAM LETTER UU;Lo;0;L;;;;;N;;;;; 1A51;TAI THAM LETTER EE;Lo;0;L;;;;;N;;;;; 1A52;TAI THAM LETTER OO;Lo;0;L;;;;;N;;;;; 1A53;TAI THAM LETTER LAE;Lo;0;L;;;;;N;;;;; 1A54;TAI THAM LETTER GREAT SA;Lo;0;L;;;;;N;;;;; 1A55;TAI THAM CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; 1A56;TAI THAM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;; 1A57;TAI THAM CONSONANT SIGN LA TANG LAI;Mc;0;L;;;;;N;;;;; 1A58;TAI THAM SIGN MAI KANG LAI;Mn;0;NSM;;;;;N;;;;; 1A59;TAI THAM CONSONANT SIGN FINAL NGA;Mn;0;NSM;;;;;N;;;;; 1A5A;TAI THAM CONSONANT SIGN LOW PA;Mn;0;NSM;;;;;N;;;;; 1A5B;TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA;Mn;0;NSM;;;;;N;;;;; 1A5C;TAI THAM CONSONANT SIGN MA;Mn;0;NSM;;;;;N;;;;; 1A5D;TAI THAM CONSONANT SIGN BA;Mn;0;NSM;;;;;N;;;;; 1A5E;TAI THAM CONSONANT SIGN SA;Mn;0;NSM;;;;;N;;;;; 1A60;TAI THAM SIGN SAKOT;Mn;9;NSM;;;;;N;;;;; 1A61;TAI THAM VOWEL SIGN A;Mc;0;L;;;;;N;;;;; 1A62;TAI THAM VOWEL SIGN MAI SAT;Mn;0;NSM;;;;;N;;;;; 1A63;TAI THAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 1A64;TAI THAM VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;; 1A65;TAI THAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; 1A66;TAI THAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; 1A67;TAI THAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; 1A68;TAI THAM VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;; 1A69;TAI THAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 1A6A;TAI THAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 1A6B;TAI THAM VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; 1A6C;TAI THAM VOWEL SIGN OA BELOW;Mn;0;NSM;;;;;N;;;;; 1A6D;TAI THAM VOWEL SIGN OY;Mc;0;L;;;;;N;;;;; 1A6E;TAI THAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; 1A6F;TAI THAM VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; 1A70;TAI THAM VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; 1A71;TAI THAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; 1A72;TAI THAM VOWEL SIGN THAM AI;Mc;0;L;;;;;N;;;;; 1A73;TAI THAM VOWEL SIGN OA ABOVE;Mn;0;NSM;;;;;N;;;;; 1A74;TAI THAM SIGN MAI KANG;Mn;0;NSM;;;;;N;;;;; 1A75;TAI THAM SIGN TONE-1;Mn;230;NSM;;;;;N;;;;; 1A76;TAI THAM SIGN TONE-2;Mn;230;NSM;;;;;N;;;;; 1A77;TAI THAM SIGN KHUEN TONE-3;Mn;230;NSM;;;;;N;;;;; 1A78;TAI THAM SIGN KHUEN TONE-4;Mn;230;NSM;;;;;N;;;;; 1A79;TAI THAM SIGN KHUEN TONE-5;Mn;230;NSM;;;;;N;;;;; 1A7A;TAI THAM SIGN RA HAAM;Mn;230;NSM;;;;;N;;;;; 1A7B;TAI THAM SIGN MAI SAM;Mn;230;NSM;;;;;N;;;;; 1A7C;TAI THAM SIGN KHUEN-LUE KARAN;Mn;230;NSM;;;;;N;;;;; 1A7F;TAI THAM COMBINING CRYPTOGRAMMIC DOT;Mn;220;NSM;;;;;N;;;;; 1A80;TAI THAM HORA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 1A81;TAI THAM HORA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 1A82;TAI THAM HORA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 1A83;TAI THAM HORA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 1A84;TAI THAM HORA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 1A85;TAI THAM HORA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 1A86;TAI THAM HORA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 1A87;TAI THAM HORA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 1A88;TAI THAM HORA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 1A89;TAI THAM HORA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 1A90;TAI THAM THAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 1A91;TAI THAM THAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 1A92;TAI THAM THAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 1A93;TAI THAM THAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 1A94;TAI THAM THAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 1A95;TAI THAM THAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 1A96;TAI THAM THAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 1A97;TAI THAM THAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 1A98;TAI THAM THAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 1A99;TAI THAM THAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 1AA0;TAI THAM SIGN WIANG;Po;0;L;;;;;N;;;;; 1AA1;TAI THAM SIGN WIANGWAAK;Po;0;L;;;;;N;;;;; 1AA2;TAI THAM SIGN SAWAN;Po;0;L;;;;;N;;;;; 1AA3;TAI THAM SIGN KEOW;Po;0;L;;;;;N;;;;; 1AA4;TAI THAM SIGN HOY;Po;0;L;;;;;N;;;;; 1AA5;TAI THAM SIGN DOKMAI;Po;0;L;;;;;N;;;;; 1AA6;TAI THAM SIGN REVERSED ROTATED RANA;Po;0;L;;;;;N;;;;; 1AA7;TAI THAM SIGN MAI YAMOK;Lm;0;L;;;;;N;;;;; 1AA8;TAI THAM SIGN KAAN;Po;0;L;;;;;N;;;;; 1AA9;TAI THAM SIGN KAANKUU;Po;0;L;;;;;N;;;;; 1AAA;TAI THAM SIGN SATKAAN;Po;0;L;;;;;N;;;;; 1AAB;TAI THAM SIGN SATKAANKUU;Po;0;L;;;;;N;;;;; 1AAC;TAI THAM SIGN HANG;Po;0;L;;;;;N;;;;; 1AAD;TAI THAM SIGN CAANG;Po;0;L;;;;;N;;;;; 1AB0;COMBINING DOUBLED CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;;;;; 1AB1;COMBINING DIAERESIS-RING;Mn;230;NSM;;;;;N;;;;; 1AB2;COMBINING INFINITY;Mn;230;NSM;;;;;N;;;;; 1AB3;COMBINING DOWNWARDS ARROW;Mn;230;NSM;;;;;N;;;;; 1AB4;COMBINING TRIPLE DOT;Mn;230;NSM;;;;;N;;;;; 1AB5;COMBINING X-X BELOW;Mn;220;NSM;;;;;N;;;;; 1AB6;COMBINING WIGGLY LINE BELOW;Mn;220;NSM;;;;;N;;;;; 1AB7;COMBINING OPEN MARK BELOW;Mn;220;NSM;;;;;N;;;;; 1AB8;COMBINING DOUBLE OPEN MARK BELOW;Mn;220;NSM;;;;;N;;;;; 1AB9;COMBINING LIGHT CENTRALIZATION STROKE BELOW;Mn;220;NSM;;;;;N;;;;; 1ABA;COMBINING STRONG CENTRALIZATION STROKE BELOW;Mn;220;NSM;;;;;N;;;;; 1ABB;COMBINING PARENTHESES ABOVE;Mn;230;NSM;;;;;N;;;;; 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;;;;; 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;;;;; 1B03;BALINESE SIGN SURANG;Mn;0;NSM;;;;;N;;;;; 1B04;BALINESE SIGN BISAH;Mc;0;L;;;;;N;;;;; 1B05;BALINESE LETTER AKARA;Lo;0;L;;;;;N;;;;; 1B06;BALINESE LETTER AKARA TEDUNG;Lo;0;L;1B05 1B35;;;;N;;;;; 1B07;BALINESE LETTER IKARA;Lo;0;L;;;;;N;;;;; 1B08;BALINESE LETTER IKARA TEDUNG;Lo;0;L;1B07 1B35;;;;N;;;;; 1B09;BALINESE LETTER UKARA;Lo;0;L;;;;;N;;;;; 1B0A;BALINESE LETTER UKARA TEDUNG;Lo;0;L;1B09 1B35;;;;N;;;;; 1B0B;BALINESE LETTER RA REPA;Lo;0;L;;;;;N;;;;; 1B0C;BALINESE LETTER RA REPA TEDUNG;Lo;0;L;1B0B 1B35;;;;N;;;;; 1B0D;BALINESE LETTER LA LENGA;Lo;0;L;;;;;N;;;;; 1B0E;BALINESE LETTER LA LENGA TEDUNG;Lo;0;L;1B0D 1B35;;;;N;;;;; 1B0F;BALINESE LETTER EKARA;Lo;0;L;;;;;N;;;;; 1B10;BALINESE LETTER AIKARA;Lo;0;L;;;;;N;;;;; 1B11;BALINESE LETTER OKARA;Lo;0;L;;;;;N;;;;; 1B12;BALINESE LETTER OKARA TEDUNG;Lo;0;L;1B11 1B35;;;;N;;;;; 1B13;BALINESE LETTER KA;Lo;0;L;;;;;N;;;;; 1B14;BALINESE LETTER KA MAHAPRANA;Lo;0;L;;;;;N;;;;; 1B15;BALINESE LETTER GA;Lo;0;L;;;;;N;;;;; 1B16;BALINESE LETTER GA GORA;Lo;0;L;;;;;N;;;;; 1B17;BALINESE LETTER NGA;Lo;0;L;;;;;N;;;;; 1B18;BALINESE LETTER CA;Lo;0;L;;;;;N;;;;; 1B19;BALINESE LETTER CA LACA;Lo;0;L;;;;;N;;;;; 1B1A;BALINESE LETTER JA;Lo;0;L;;;;;N;;;;; 1B1B;BALINESE LETTER JA JERA;Lo;0;L;;;;;N;;;;; 1B1C;BALINESE LETTER NYA;Lo;0;L;;;;;N;;;;; 1B1D;BALINESE LETTER TA LATIK;Lo;0;L;;;;;N;;;;; 1B1E;BALINESE LETTER TA MURDA MAHAPRANA;Lo;0;L;;;;;N;;;;; 1B1F;BALINESE LETTER DA MURDA ALPAPRANA;Lo;0;L;;;;;N;;;;; 1B20;BALINESE LETTER DA MURDA MAHAPRANA;Lo;0;L;;;;;N;;;;; 1B21;BALINESE LETTER NA RAMBAT;Lo;0;L;;;;;N;;;;; 1B22;BALINESE LETTER TA;Lo;0;L;;;;;N;;;;; 1B23;BALINESE LETTER TA TAWA;Lo;0;L;;;;;N;;;;; 1B24;BALINESE LETTER DA;Lo;0;L;;;;;N;;;;; 1B25;BALINESE LETTER DA MADU;Lo;0;L;;;;;N;;;;; 1B26;BALINESE LETTER NA;Lo;0;L;;;;;N;;;;; 1B27;BALINESE LETTER PA;Lo;0;L;;;;;N;;;;; 1B28;BALINESE LETTER PA KAPAL;Lo;0;L;;;;;N;;;;; 1B29;BALINESE LETTER BA;Lo;0;L;;;;;N;;;;; 1B2A;BALINESE LETTER BA KEMBANG;Lo;0;L;;;;;N;;;;; 1B2B;BALINESE LETTER MA;Lo;0;L;;;;;N;;;;; 1B2C;BALINESE LETTER YA;Lo;0;L;;;;;N;;;;; 1B2D;BALINESE LETTER RA;Lo;0;L;;;;;N;;;;; 1B2E;BALINESE LETTER LA;Lo;0;L;;;;;N;;;;; 1B2F;BALINESE LETTER WA;Lo;0;L;;;;;N;;;;; 1B30;BALINESE LETTER SA SAGA;Lo;0;L;;;;;N;;;;; 1B31;BALINESE LETTER SA SAPA;Lo;0;L;;;;;N;;;;; 1B32;BALINESE LETTER SA;Lo;0;L;;;;;N;;;;; 1B33;BALINESE LETTER HA;Lo;0;L;;;;;N;;;;; 1B34;BALINESE SIGN REREKAN;Mn;7;NSM;;;;;N;;;;; 1B35;BALINESE VOWEL SIGN TEDUNG;Mc;0;L;;;;;N;;;;; 1B36;BALINESE VOWEL SIGN ULU;Mn;0;NSM;;;;;N;;;;; 1B37;BALINESE VOWEL SIGN ULU SARI;Mn;0;NSM;;;;;N;;;;; 1B38;BALINESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;; 1B39;BALINESE VOWEL SIGN SUKU ILUT;Mn;0;NSM;;;;;N;;;;; 1B3A;BALINESE VOWEL SIGN RA REPA;Mn;0;NSM;;;;;N;;;;; 1B3B;BALINESE VOWEL SIGN RA REPA TEDUNG;Mc;0;L;1B3A 1B35;;;;N;;;;; 1B3C;BALINESE VOWEL SIGN LA LENGA;Mn;0;NSM;;;;;N;;;;; 1B3D;BALINESE VOWEL SIGN LA LENGA TEDUNG;Mc;0;L;1B3C 1B35;;;;N;;;;; 1B3E;BALINESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;; 1B3F;BALINESE VOWEL SIGN TALING REPA;Mc;0;L;;;;;N;;;;; 1B40;BALINESE VOWEL SIGN TALING TEDUNG;Mc;0;L;1B3E 1B35;;;;N;;;;; 1B41;BALINESE VOWEL SIGN TALING REPA TEDUNG;Mc;0;L;1B3F 1B35;;;;N;;;;; 1B42;BALINESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;; 1B43;BALINESE VOWEL SIGN PEPET TEDUNG;Mc;0;L;1B42 1B35;;;;N;;;;; 1B44;BALINESE ADEG ADEG;Mc;9;L;;;;;N;;;;; 1B45;BALINESE LETTER KAF SASAK;Lo;0;L;;;;;N;;;;; 1B46;BALINESE LETTER KHOT SASAK;Lo;0;L;;;;;N;;;;; 1B47;BALINESE LETTER TZIR SASAK;Lo;0;L;;;;;N;;;;; 1B48;BALINESE LETTER EF SASAK;Lo;0;L;;;;;N;;;;; 1B49;BALINESE LETTER VE SASAK;Lo;0;L;;;;;N;;;;; 1B4A;BALINESE LETTER ZAL SASAK;Lo;0;L;;;;;N;;;;; 1B4B;BALINESE LETTER ASYURA SASAK;Lo;0;L;;;;;N;;;;; 1B50;BALINESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 1B51;BALINESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 1B52;BALINESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 1B53;BALINESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 1B54;BALINESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 1B55;BALINESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 1B56;BALINESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 1B57;BALINESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 1B58;BALINESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 1B59;BALINESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 1B5A;BALINESE PANTI;Po;0;L;;;;;N;;;;; 1B5B;BALINESE PAMADA;Po;0;L;;;;;N;;;;; 1B5C;BALINESE WINDU;Po;0;L;;;;;N;;;;; 1B5D;BALINESE CARIK PAMUNGKAH;Po;0;L;;;;;N;;;;; 1B5E;BALINESE CARIK SIKI;Po;0;L;;;;;N;;;;; 1B5F;BALINESE CARIK PAREREN;Po;0;L;;;;;N;;;;; 1B60;BALINESE PAMENENG;Po;0;L;;;;;N;;;;; 1B61;BALINESE MUSICAL SYMBOL DONG;So;0;L;;;;;N;;;;; 1B62;BALINESE MUSICAL SYMBOL DENG;So;0;L;;;;;N;;;;; 1B63;BALINESE MUSICAL SYMBOL DUNG;So;0;L;;;;;N;;;;; 1B64;BALINESE MUSICAL SYMBOL DANG;So;0;L;;;;;N;;;;; 1B65;BALINESE MUSICAL SYMBOL DANG SURANG;So;0;L;;;;;N;;;;; 1B66;BALINESE MUSICAL SYMBOL DING;So;0;L;;;;;N;;;;; 1B67;BALINESE MUSICAL SYMBOL DAENG;So;0;L;;;;;N;;;;; 1B68;BALINESE MUSICAL SYMBOL DEUNG;So;0;L;;;;;N;;;;; 1B69;BALINESE MUSICAL SYMBOL DAING;So;0;L;;;;;N;;;;; 1B6A;BALINESE MUSICAL SYMBOL DANG GEDE;So;0;L;;;;;N;;;;; 1B6B;BALINESE MUSICAL SYMBOL COMBINING TEGEH;Mn;230;NSM;;;;;N;;;;; 1B6C;BALINESE MUSICAL SYMBOL COMBINING ENDEP;Mn;220;NSM;;;;;N;;;;; 1B6D;BALINESE MUSICAL SYMBOL COMBINING KEMPUL;Mn;230;NSM;;;;;N;;;;; 1B6E;BALINESE MUSICAL SYMBOL COMBINING KEMPLI;Mn;230;NSM;;;;;N;;;;; 1B6F;BALINESE MUSICAL SYMBOL COMBINING JEGOGAN;Mn;230;NSM;;;;;N;;;;; 1B70;BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; 1B71;BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; 1B72;BALINESE MUSICAL SYMBOL COMBINING BENDE;Mn;230;NSM;;;;;N;;;;; 1B73;BALINESE MUSICAL SYMBOL COMBINING GONG;Mn;230;NSM;;;;;N;;;;; 1B74;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG;So;0;L;;;;;N;;;;; 1B75;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG;So;0;L;;;;;N;;;;; 1B76;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK;So;0;L;;;;;N;;;;; 1B77;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK;So;0;L;;;;;N;;;;; 1B78;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG;So;0;L;;;;;N;;;;; 1B79;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG;So;0;L;;;;;N;;;;; 1B7A;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK;So;0;L;;;;;N;;;;; 1B7B;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK;So;0;L;;;;;N;;;;; 1B7C;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING;So;0;L;;;;;N;;;;; 1B80;SUNDANESE SIGN PANYECEK;Mn;0;NSM;;;;;N;;;;; 1B81;SUNDANESE SIGN PANGLAYAR;Mn;0;NSM;;;;;N;;;;; 1B82;SUNDANESE SIGN PANGWISAD;Mc;0;L;;;;;N;;;;; 1B83;SUNDANESE LETTER A;Lo;0;L;;;;;N;;;;; 1B84;SUNDANESE LETTER I;Lo;0;L;;;;;N;;;;; 1B85;SUNDANESE LETTER U;Lo;0;L;;;;;N;;;;; 1B86;SUNDANESE LETTER AE;Lo;0;L;;;;;N;;;;; 1B87;SUNDANESE LETTER O;Lo;0;L;;;;;N;;;;; 1B88;SUNDANESE LETTER E;Lo;0;L;;;;;N;;;;; 1B89;SUNDANESE LETTER EU;Lo;0;L;;;;;N;;;;; 1B8A;SUNDANESE LETTER KA;Lo;0;L;;;;;N;;;;; 1B8B;SUNDANESE LETTER QA;Lo;0;L;;;;;N;;;;; 1B8C;SUNDANESE LETTER GA;Lo;0;L;;;;;N;;;;; 1B8D;SUNDANESE LETTER NGA;Lo;0;L;;;;;N;;;;; 1B8E;SUNDANESE LETTER CA;Lo;0;L;;;;;N;;;;; 1B8F;SUNDANESE LETTER JA;Lo;0;L;;;;;N;;;;; 1B90;SUNDANESE LETTER ZA;Lo;0;L;;;;;N;;;;; 1B91;SUNDANESE LETTER NYA;Lo;0;L;;;;;N;;;;; 1B92;SUNDANESE LETTER TA;Lo;0;L;;;;;N;;;;; 1B93;SUNDANESE LETTER DA;Lo;0;L;;;;;N;;;;; 1B94;SUNDANESE LETTER NA;Lo;0;L;;;;;N;;;;; 1B95;SUNDANESE LETTER PA;Lo;0;L;;;;;N;;;;; 1B96;SUNDANESE LETTER FA;Lo;0;L;;;;;N;;;;; 1B97;SUNDANESE LETTER VA;Lo;0;L;;;;;N;;;;; 1B98;SUNDANESE LETTER BA;Lo;0;L;;;;;N;;;;; 1B99;SUNDANESE LETTER MA;Lo;0;L;;;;;N;;;;; 1B9A;SUNDANESE LETTER YA;Lo;0;L;;;;;N;;;;; 1B9B;SUNDANESE LETTER RA;Lo;0;L;;;;;N;;;;; 1B9C;SUNDANESE LETTER LA;Lo;0;L;;;;;N;;;;; 1B9D;SUNDANESE LETTER WA;Lo;0;L;;;;;N;;;;; 1B9E;SUNDANESE LETTER SA;Lo;0;L;;;;;N;;;;; 1B9F;SUNDANESE LETTER XA;Lo;0;L;;;;;N;;;;; 1BA0;SUNDANESE LETTER HA;Lo;0;L;;;;;N;;;;; 1BA1;SUNDANESE CONSONANT SIGN PAMINGKAL;Mc;0;L;;;;;N;;;;; 1BA2;SUNDANESE CONSONANT SIGN PANYAKRA;Mn;0;NSM;;;;;N;;;;; 1BA3;SUNDANESE CONSONANT SIGN PANYIKU;Mn;0;NSM;;;;;N;;;;; 1BA4;SUNDANESE VOWEL SIGN PANGHULU;Mn;0;NSM;;;;;N;;;;; 1BA5;SUNDANESE VOWEL SIGN PANYUKU;Mn;0;NSM;;;;;N;;;;; 1BA6;SUNDANESE VOWEL SIGN PANAELAENG;Mc;0;L;;;;;N;;;;; 1BA7;SUNDANESE VOWEL SIGN PANOLONG;Mc;0;L;;;;;N;;;;; 1BA8;SUNDANESE VOWEL SIGN PAMEPET;Mn;0;NSM;;;;;N;;;;; 1BA9;SUNDANESE VOWEL SIGN PANEULEUNG;Mn;0;NSM;;;;;N;;;;; 1BAA;SUNDANESE SIGN PAMAAEH;Mc;9;L;;;;;N;;;;; 1BAB;SUNDANESE SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; 1BAC;SUNDANESE CONSONANT SIGN PASANGAN MA;Mn;0;NSM;;;;;N;;;;; 1BAD;SUNDANESE CONSONANT SIGN PASANGAN WA;Mn;0;NSM;;;;;N;;;;; 1BAE;SUNDANESE LETTER KHA;Lo;0;L;;;;;N;;;;; 1BAF;SUNDANESE LETTER SYA;Lo;0;L;;;;;N;;;;; 1BB0;SUNDANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 1BB1;SUNDANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 1BB2;SUNDANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 1BB3;SUNDANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 1BB4;SUNDANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 1BB5;SUNDANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 1BB6;SUNDANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 1BB7;SUNDANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 1BB8;SUNDANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 1BB9;SUNDANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 1BBA;SUNDANESE AVAGRAHA;Lo;0;L;;;;;N;;;;; 1BBB;SUNDANESE LETTER REU;Lo;0;L;;;;;N;;;;; 1BBC;SUNDANESE LETTER LEU;Lo;0;L;;;;;N;;;;; 1BBD;SUNDANESE LETTER BHA;Lo;0;L;;;;;N;;;;; 1BBE;SUNDANESE LETTER FINAL K;Lo;0;L;;;;;N;;;;; 1BBF;SUNDANESE LETTER FINAL M;Lo;0;L;;;;;N;;;;; 1BC0;BATAK LETTER A;Lo;0;L;;;;;N;;;;; 1BC1;BATAK LETTER SIMALUNGUN A;Lo;0;L;;;;;N;;;;; 1BC2;BATAK LETTER HA;Lo;0;L;;;;;N;;;;; 1BC3;BATAK LETTER SIMALUNGUN HA;Lo;0;L;;;;;N;;;;; 1BC4;BATAK LETTER MANDAILING HA;Lo;0;L;;;;;N;;;;; 1BC5;BATAK LETTER BA;Lo;0;L;;;;;N;;;;; 1BC6;BATAK LETTER KARO BA;Lo;0;L;;;;;N;;;;; 1BC7;BATAK LETTER PA;Lo;0;L;;;;;N;;;;; 1BC8;BATAK LETTER SIMALUNGUN PA;Lo;0;L;;;;;N;;;;; 1BC9;BATAK LETTER NA;Lo;0;L;;;;;N;;;;; 1BCA;BATAK LETTER MANDAILING NA;Lo;0;L;;;;;N;;;;; 1BCB;BATAK LETTER WA;Lo;0;L;;;;;N;;;;; 1BCC;BATAK LETTER SIMALUNGUN WA;Lo;0;L;;;;;N;;;;; 1BCD;BATAK LETTER PAKPAK WA;Lo;0;L;;;;;N;;;;; 1BCE;BATAK LETTER GA;Lo;0;L;;;;;N;;;;; 1BCF;BATAK LETTER SIMALUNGUN GA;Lo;0;L;;;;;N;;;;; 1BD0;BATAK LETTER JA;Lo;0;L;;;;;N;;;;; 1BD1;BATAK LETTER DA;Lo;0;L;;;;;N;;;;; 1BD2;BATAK LETTER RA;Lo;0;L;;;;;N;;;;; 1BD3;BATAK LETTER SIMALUNGUN RA;Lo;0;L;;;;;N;;;;; 1BD4;BATAK LETTER MA;Lo;0;L;;;;;N;;;;; 1BD5;BATAK LETTER SIMALUNGUN MA;Lo;0;L;;;;;N;;;;; 1BD6;BATAK LETTER SOUTHERN TA;Lo;0;L;;;;;N;;;;; 1BD7;BATAK LETTER NORTHERN TA;Lo;0;L;;;;;N;;;;; 1BD8;BATAK LETTER SA;Lo;0;L;;;;;N;;;;; 1BD9;BATAK LETTER SIMALUNGUN SA;Lo;0;L;;;;;N;;;;; 1BDA;BATAK LETTER MANDAILING SA;Lo;0;L;;;;;N;;;;; 1BDB;BATAK LETTER YA;Lo;0;L;;;;;N;;;;; 1BDC;BATAK LETTER SIMALUNGUN YA;Lo;0;L;;;;;N;;;;; 1BDD;BATAK LETTER NGA;Lo;0;L;;;;;N;;;;; 1BDE;BATAK LETTER LA;Lo;0;L;;;;;N;;;;; 1BDF;BATAK LETTER SIMALUNGUN LA;Lo;0;L;;;;;N;;;;; 1BE0;BATAK LETTER NYA;Lo;0;L;;;;;N;;;;; 1BE1;BATAK LETTER CA;Lo;0;L;;;;;N;;;;; 1BE2;BATAK LETTER NDA;Lo;0;L;;;;;N;;;;; 1BE3;BATAK LETTER MBA;Lo;0;L;;;;;N;;;;; 1BE4;BATAK LETTER I;Lo;0;L;;;;;N;;;;; 1BE5;BATAK LETTER U;Lo;0;L;;;;;N;;;;; 1BE6;BATAK SIGN TOMPI;Mn;7;NSM;;;;;N;;;;; 1BE7;BATAK VOWEL SIGN E;Mc;0;L;;;;;N;;;;; 1BE8;BATAK VOWEL SIGN PAKPAK E;Mn;0;NSM;;;;;N;;;;; 1BE9;BATAK VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; 1BEA;BATAK VOWEL SIGN I;Mc;0;L;;;;;N;;;;; 1BEB;BATAK VOWEL SIGN KARO I;Mc;0;L;;;;;N;;;;; 1BEC;BATAK VOWEL SIGN O;Mc;0;L;;;;;N;;;;; 1BED;BATAK VOWEL SIGN KARO O;Mn;0;NSM;;;;;N;;;;; 1BEE;BATAK VOWEL SIGN U;Mc;0;L;;;;;N;;;;; 1BEF;BATAK VOWEL SIGN U FOR SIMALUNGUN SA;Mn;0;NSM;;;;;N;;;;; 1BF0;BATAK CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; 1BF1;BATAK CONSONANT SIGN H;Mn;0;NSM;;;;;N;;;;; 1BF2;BATAK PANGOLAT;Mc;9;L;;;;;N;;;;; 1BF3;BATAK PANONGONAN;Mc;9;L;;;;;N;;;;; 1BFC;BATAK SYMBOL BINDU NA METEK;Po;0;L;;;;;N;;;;; 1BFD;BATAK SYMBOL BINDU PINARBORAS;Po;0;L;;;;;N;;;;; 1BFE;BATAK SYMBOL BINDU JUDUL;Po;0;L;;;;;N;;;;; 1BFF;BATAK SYMBOL BINDU PANGOLAT;Po;0;L;;;;;N;;;;; 1C00;LEPCHA LETTER KA;Lo;0;L;;;;;N;;;;; 1C01;LEPCHA LETTER KLA;Lo;0;L;;;;;N;;;;; 1C02;LEPCHA LETTER KHA;Lo;0;L;;;;;N;;;;; 1C03;LEPCHA LETTER GA;Lo;0;L;;;;;N;;;;; 1C04;LEPCHA LETTER GLA;Lo;0;L;;;;;N;;;;; 1C05;LEPCHA LETTER NGA;Lo;0;L;;;;;N;;;;; 1C06;LEPCHA LETTER CA;Lo;0;L;;;;;N;;;;; 1C07;LEPCHA LETTER CHA;Lo;0;L;;;;;N;;;;; 1C08;LEPCHA LETTER JA;Lo;0;L;;;;;N;;;;; 1C09;LEPCHA LETTER NYA;Lo;0;L;;;;;N;;;;; 1C0A;LEPCHA LETTER TA;Lo;0;L;;;;;N;;;;; 1C0B;LEPCHA LETTER THA;Lo;0;L;;;;;N;;;;; 1C0C;LEPCHA LETTER DA;Lo;0;L;;;;;N;;;;; 1C0D;LEPCHA LETTER NA;Lo;0;L;;;;;N;;;;; 1C0E;LEPCHA LETTER PA;Lo;0;L;;;;;N;;;;; 1C0F;LEPCHA LETTER PLA;Lo;0;L;;;;;N;;;;; 1C10;LEPCHA LETTER PHA;Lo;0;L;;;;;N;;;;; 1C11;LEPCHA LETTER FA;Lo;0;L;;;;;N;;;;; 1C12;LEPCHA LETTER FLA;Lo;0;L;;;;;N;;;;; 1C13;LEPCHA LETTER BA;Lo;0;L;;;;;N;;;;; 1C14;LEPCHA LETTER BLA;Lo;0;L;;;;;N;;;;; 1C15;LEPCHA LETTER MA;Lo;0;L;;;;;N;;;;; 1C16;LEPCHA LETTER MLA;Lo;0;L;;;;;N;;;;; 1C17;LEPCHA LETTER TSA;Lo;0;L;;;;;N;;;;; 1C18;LEPCHA LETTER TSHA;Lo;0;L;;;;;N;;;;; 1C19;LEPCHA LETTER DZA;Lo;0;L;;;;;N;;;;; 1C1A;LEPCHA LETTER YA;Lo;0;L;;;;;N;;;;; 1C1B;LEPCHA LETTER RA;Lo;0;L;;;;;N;;;;; 1C1C;LEPCHA LETTER LA;Lo;0;L;;;;;N;;;;; 1C1D;LEPCHA LETTER HA;Lo;0;L;;;;;N;;;;; 1C1E;LEPCHA LETTER HLA;Lo;0;L;;;;;N;;;;; 1C1F;LEPCHA LETTER VA;Lo;0;L;;;;;N;;;;; 1C20;LEPCHA LETTER SA;Lo;0;L;;;;;N;;;;; 1C21;LEPCHA LETTER SHA;Lo;0;L;;;;;N;;;;; 1C22;LEPCHA LETTER WA;Lo;0;L;;;;;N;;;;; 1C23;LEPCHA LETTER A;Lo;0;L;;;;;N;;;;; 1C24;LEPCHA SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; 1C25;LEPCHA SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; 1C26;LEPCHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 1C27;LEPCHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; 1C28;LEPCHA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; 1C29;LEPCHA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; 1C2A;LEPCHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; 1C2B;LEPCHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; 1C2C;LEPCHA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; 1C2D;LEPCHA CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;; 1C2E;LEPCHA CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;; 1C2F;LEPCHA CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;; 1C30;LEPCHA CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; 1C31;LEPCHA CONSONANT SIGN P;Mn;0;NSM;;;;;N;;;;; 1C32;LEPCHA CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; 1C33;LEPCHA CONSONANT SIGN T;Mn;0;NSM;;;;;N;;;;; 1C34;LEPCHA CONSONANT SIGN NYIN-DO;Mc;0;L;;;;;N;;;;; 1C35;LEPCHA CONSONANT SIGN KANG;Mc;0;L;;;;;N;;;;; 1C36;LEPCHA SIGN RAN;Mn;0;NSM;;;;;N;;;;; 1C37;LEPCHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; 1C3B;LEPCHA PUNCTUATION TA-ROL;Po;0;L;;;;;N;;;;; 1C3C;LEPCHA PUNCTUATION NYET THYOOM TA-ROL;Po;0;L;;;;;N;;;;; 1C3D;LEPCHA PUNCTUATION CER-WA;Po;0;L;;;;;N;;;;; 1C3E;LEPCHA PUNCTUATION TSHOOK CER-WA;Po;0;L;;;;;N;;;;; 1C3F;LEPCHA PUNCTUATION TSHOOK;Po;0;L;;;;;N;;;;; 1C40;LEPCHA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 1C41;LEPCHA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 1C42;LEPCHA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 1C43;LEPCHA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 1C44;LEPCHA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 1C45;LEPCHA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 1C46;LEPCHA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 1C47;LEPCHA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 1C48;LEPCHA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 1C49;LEPCHA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 1C4D;LEPCHA LETTER TTA;Lo;0;L;;;;;N;;;;; 1C4E;LEPCHA LETTER TTHA;Lo;0;L;;;;;N;;;;; 1C4F;LEPCHA LETTER DDA;Lo;0;L;;;;;N;;;;; 1C50;OL CHIKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 1C51;OL CHIKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 1C52;OL CHIKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 1C53;OL CHIKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 1C54;OL CHIKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 1C55;OL CHIKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 1C56;OL CHIKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 1C57;OL CHIKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 1C58;OL CHIKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 1C59;OL CHIKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 1C5A;OL CHIKI LETTER LA;Lo;0;L;;;;;N;;;;; 1C5B;OL CHIKI LETTER AT;Lo;0;L;;;;;N;;;;; 1C5C;OL CHIKI LETTER AG;Lo;0;L;;;;;N;;;;; 1C5D;OL CHIKI LETTER ANG;Lo;0;L;;;;;N;;;;; 1C5E;OL CHIKI LETTER AL;Lo;0;L;;;;;N;;;;; 1C5F;OL CHIKI LETTER LAA;Lo;0;L;;;;;N;;;;; 1C60;OL CHIKI LETTER AAK;Lo;0;L;;;;;N;;;;; 1C61;OL CHIKI LETTER AAJ;Lo;0;L;;;;;N;;;;; 1C62;OL CHIKI LETTER AAM;Lo;0;L;;;;;N;;;;; 1C63;OL CHIKI LETTER AAW;Lo;0;L;;;;;N;;;;; 1C64;OL CHIKI LETTER LI;Lo;0;L;;;;;N;;;;; 1C65;OL CHIKI LETTER IS;Lo;0;L;;;;;N;;;;; 1C66;OL CHIKI LETTER IH;Lo;0;L;;;;;N;;;;; 1C67;OL CHIKI LETTER INY;Lo;0;L;;;;;N;;;;; 1C68;OL CHIKI LETTER IR;Lo;0;L;;;;;N;;;;; 1C69;OL CHIKI LETTER LU;Lo;0;L;;;;;N;;;;; 1C6A;OL CHIKI LETTER UC;Lo;0;L;;;;;N;;;;; 1C6B;OL CHIKI LETTER UD;Lo;0;L;;;;;N;;;;; 1C6C;OL CHIKI LETTER UNN;Lo;0;L;;;;;N;;;;; 1C6D;OL CHIKI LETTER UY;Lo;0;L;;;;;N;;;;; 1C6E;OL CHIKI LETTER LE;Lo;0;L;;;;;N;;;;; 1C6F;OL CHIKI LETTER EP;Lo;0;L;;;;;N;;;;; 1C70;OL CHIKI LETTER EDD;Lo;0;L;;;;;N;;;;; 1C71;OL CHIKI LETTER EN;Lo;0;L;;;;;N;;;;; 1C72;OL CHIKI LETTER ERR;Lo;0;L;;;;;N;;;;; 1C73;OL CHIKI LETTER LO;Lo;0;L;;;;;N;;;;; 1C74;OL CHIKI LETTER OTT;Lo;0;L;;;;;N;;;;; 1C75;OL CHIKI LETTER OB;Lo;0;L;;;;;N;;;;; 1C76;OL CHIKI LETTER OV;Lo;0;L;;;;;N;;;;; 1C77;OL CHIKI LETTER OH;Lo;0;L;;;;;N;;;;; 1C78;OL CHIKI MU TTUDDAG;Lm;0;L;;;;;N;;;;; 1C79;OL CHIKI GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; 1C7A;OL CHIKI MU-GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; 1C7B;OL CHIKI RELAA;Lm;0;L;;;;;N;;;;; 1C7C;OL CHIKI PHAARKAA;Lm;0;L;;;;;N;;;;; 1C7D;OL CHIKI AHAD;Lm;0;L;;;;;N;;;;; 1C7E;OL CHIKI PUNCTUATION MUCAAD;Po;0;L;;;;;N;;;;; 1C7F;OL CHIKI PUNCTUATION DOUBLE MUCAAD;Po;0;L;;;;;N;;;;; 1C80;CYRILLIC SMALL LETTER ROUNDED VE;Ll;0;L;;;;;N;;;0412;;0412 1C81;CYRILLIC SMALL LETTER LONG-LEGGED DE;Ll;0;L;;;;;N;;;0414;;0414 1C82;CYRILLIC SMALL LETTER NARROW O;Ll;0;L;;;;;N;;;041E;;041E 1C83;CYRILLIC SMALL LETTER WIDE ES;Ll;0;L;;;;;N;;;0421;;0421 1C84;CYRILLIC SMALL LETTER TALL TE;Ll;0;L;;;;;N;;;0422;;0422 1C85;CYRILLIC SMALL LETTER THREE-LEGGED TE;Ll;0;L;;;;;N;;;0422;;0422 1C86;CYRILLIC SMALL LETTER TALL HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A 1C87;CYRILLIC SMALL LETTER TALL YAT;Ll;0;L;;;;;N;;;0462;;0462 1C88;CYRILLIC SMALL LETTER UNBLENDED UK;Ll;0;L;;;;;N;;;A64A;;A64A 1CC0;SUNDANESE PUNCTUATION BINDU SURYA;Po;0;L;;;;;N;;;;; 1CC1;SUNDANESE PUNCTUATION BINDU PANGLONG;Po;0;L;;;;;N;;;;; 1CC2;SUNDANESE PUNCTUATION BINDU PURNAMA;Po;0;L;;;;;N;;;;; 1CC3;SUNDANESE PUNCTUATION BINDU CAKRA;Po;0;L;;;;;N;;;;; 1CC4;SUNDANESE PUNCTUATION BINDU LEU SATANGA;Po;0;L;;;;;N;;;;; 1CC5;SUNDANESE PUNCTUATION BINDU KA SATANGA;Po;0;L;;;;;N;;;;; 1CC6;SUNDANESE PUNCTUATION BINDU DA SATANGA;Po;0;L;;;;;N;;;;; 1CC7;SUNDANESE PUNCTUATION BINDU BA SATANGA;Po;0;L;;;;;N;;;;; 1CD0;VEDIC TONE KARSHANA;Mn;230;NSM;;;;;N;;;;; 1CD1;VEDIC TONE SHARA;Mn;230;NSM;;;;;N;;;;; 1CD2;VEDIC TONE PRENKHA;Mn;230;NSM;;;;;N;;;;; 1CD3;VEDIC SIGN NIHSHVASA;Po;0;L;;;;;N;;;;; 1CD4;VEDIC SIGN YAJURVEDIC MIDLINE SVARITA;Mn;1;NSM;;;;;N;;;;; 1CD5;VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; 1CD6;VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; 1CD7;VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; 1CD8;VEDIC TONE CANDRA BELOW;Mn;220;NSM;;;;;N;;;;; 1CD9;VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER;Mn;220;NSM;;;;;N;;;;; 1CDA;VEDIC TONE DOUBLE SVARITA;Mn;230;NSM;;;;;N;;;;; 1CDB;VEDIC TONE TRIPLE SVARITA;Mn;230;NSM;;;;;N;;;;; 1CDC;VEDIC TONE KATHAKA ANUDATTA;Mn;220;NSM;;;;;N;;;;; 1CDD;VEDIC TONE DOT BELOW;Mn;220;NSM;;;;;N;;;;; 1CDE;VEDIC TONE TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; 1CDF;VEDIC TONE THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; 1CE0;VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA;Mn;230;NSM;;;;;N;;;;; 1CE1;VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA;Mc;0;L;;;;;N;;;;; 1CE2;VEDIC SIGN VISARGA SVARITA;Mn;1;NSM;;;;;N;;;;; 1CE3;VEDIC SIGN VISARGA UDATTA;Mn;1;NSM;;;;;N;;;;; 1CE4;VEDIC SIGN REVERSED VISARGA UDATTA;Mn;1;NSM;;;;;N;;;;; 1CE5;VEDIC SIGN VISARGA ANUDATTA;Mn;1;NSM;;;;;N;;;;; 1CE6;VEDIC SIGN REVERSED VISARGA ANUDATTA;Mn;1;NSM;;;;;N;;;;; 1CE7;VEDIC SIGN VISARGA UDATTA WITH TAIL;Mn;1;NSM;;;;;N;;;;; 1CE8;VEDIC SIGN VISARGA ANUDATTA WITH TAIL;Mn;1;NSM;;;;;N;;;;; 1CE9;VEDIC SIGN ANUSVARA ANTARGOMUKHA;Lo;0;L;;;;;N;;;;; 1CEA;VEDIC SIGN ANUSVARA BAHIRGOMUKHA;Lo;0;L;;;;;N;;;;; 1CEB;VEDIC SIGN ANUSVARA VAMAGOMUKHA;Lo;0;L;;;;;N;;;;; 1CEC;VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL;Lo;0;L;;;;;N;;;;; 1CED;VEDIC SIGN TIRYAK;Mn;220;NSM;;;;;N;;;;; 1CEE;VEDIC SIGN HEXIFORM LONG ANUSVARA;Lo;0;L;;;;;N;;;;; 1CEF;VEDIC SIGN LONG ANUSVARA;Lo;0;L;;;;;N;;;;; 1CF0;VEDIC SIGN RTHANG LONG ANUSVARA;Lo;0;L;;;;;N;;;;; 1CF1;VEDIC SIGN ANUSVARA UBHAYATO MUKHA;Lo;0;L;;;;;N;;;;; 1CF2;VEDIC SIGN ARDHAVISARGA;Mc;0;L;;;;;N;;;;; 1CF3;VEDIC SIGN ROTATED ARDHAVISARGA;Mc;0;L;;;;;N;;;;; 1CF4;VEDIC TONE CANDRA ABOVE;Mn;230;NSM;;;;;N;;;;; 1CF5;VEDIC SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; 1CF6;VEDIC SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; 1CF8;VEDIC TONE RING ABOVE;Mn;230;NSM;;;;;N;;;;; 1CF9;VEDIC TONE DOUBLE RING ABOVE;Mn;230;NSM;;;;;N;;;;; 1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;; 1D01;LATIN LETTER SMALL CAPITAL AE;Ll;0;L;;;;;N;;;;; 1D02;LATIN SMALL LETTER TURNED AE;Ll;0;L;;;;;N;;;;; 1D03;LATIN LETTER SMALL CAPITAL BARRED B;Ll;0;L;;;;;N;;;;; 1D04;LATIN LETTER SMALL CAPITAL C;Ll;0;L;;;;;N;;;;; 1D05;LATIN LETTER SMALL CAPITAL D;Ll;0;L;;;;;N;;;;; 1D06;LATIN LETTER SMALL CAPITAL ETH;Ll;0;L;;;;;N;;;;; 1D07;LATIN LETTER SMALL CAPITAL E;Ll;0;L;;;;;N;;;;; 1D08;LATIN SMALL LETTER TURNED OPEN E;Ll;0;L;;;;;N;;;;; 1D09;LATIN SMALL LETTER TURNED I;Ll;0;L;;;;;N;;;;; 1D0A;LATIN LETTER SMALL CAPITAL J;Ll;0;L;;;;;N;;;;; 1D0B;LATIN LETTER SMALL CAPITAL K;Ll;0;L;;;;;N;;;;; 1D0C;LATIN LETTER SMALL CAPITAL L WITH STROKE;Ll;0;L;;;;;N;;;;; 1D0D;LATIN LETTER SMALL CAPITAL M;Ll;0;L;;;;;N;;;;; 1D0E;LATIN LETTER SMALL CAPITAL REVERSED N;Ll;0;L;;;;;N;;;;; 1D0F;LATIN LETTER SMALL CAPITAL O;Ll;0;L;;;;;N;;;;; 1D10;LATIN LETTER SMALL CAPITAL OPEN O;Ll;0;L;;;;;N;;;;; 1D11;LATIN SMALL LETTER SIDEWAYS O;Ll;0;L;;;;;N;;;;; 1D12;LATIN SMALL LETTER SIDEWAYS OPEN O;Ll;0;L;;;;;N;;;;; 1D13;LATIN SMALL LETTER SIDEWAYS O WITH STROKE;Ll;0;L;;;;;N;;;;; 1D14;LATIN SMALL LETTER TURNED OE;Ll;0;L;;;;;N;;;;; 1D15;LATIN LETTER SMALL CAPITAL OU;Ll;0;L;;;;;N;;;;; 1D16;LATIN SMALL LETTER TOP HALF O;Ll;0;L;;;;;N;;;;; 1D17;LATIN SMALL LETTER BOTTOM HALF O;Ll;0;L;;;;;N;;;;; 1D18;LATIN LETTER SMALL CAPITAL P;Ll;0;L;;;;;N;;;;; 1D19;LATIN LETTER SMALL CAPITAL REVERSED R;Ll;0;L;;;;;N;;;;; 1D1A;LATIN LETTER SMALL CAPITAL TURNED R;Ll;0;L;;;;;N;;;;; 1D1B;LATIN LETTER SMALL CAPITAL T;Ll;0;L;;;;;N;;;;; 1D1C;LATIN LETTER SMALL CAPITAL U;Ll;0;L;;;;;N;;;;; 1D1D;LATIN SMALL LETTER SIDEWAYS U;Ll;0;L;;;;;N;;;;; 1D1E;LATIN SMALL LETTER SIDEWAYS DIAERESIZED U;Ll;0;L;;;;;N;;;;; 1D1F;LATIN SMALL LETTER SIDEWAYS TURNED M;Ll;0;L;;;;;N;;;;; 1D20;LATIN LETTER SMALL CAPITAL V;Ll;0;L;;;;;N;;;;; 1D21;LATIN LETTER SMALL CAPITAL W;Ll;0;L;;;;;N;;;;; 1D22;LATIN LETTER SMALL CAPITAL Z;Ll;0;L;;;;;N;;;;; 1D23;LATIN LETTER SMALL CAPITAL EZH;Ll;0;L;;;;;N;;;;; 1D24;LATIN LETTER VOICED LARYNGEAL SPIRANT;Ll;0;L;;;;;N;;;;; 1D25;LATIN LETTER AIN;Ll;0;L;;;;;N;;;;; 1D26;GREEK LETTER SMALL CAPITAL GAMMA;Ll;0;L;;;;;N;;;;; 1D27;GREEK LETTER SMALL CAPITAL LAMDA;Ll;0;L;;;;;N;;;;; 1D28;GREEK LETTER SMALL CAPITAL PI;Ll;0;L;;;;;N;;;;; 1D29;GREEK LETTER SMALL CAPITAL RHO;Ll;0;L;;;;;N;;;;; 1D2A;GREEK LETTER SMALL CAPITAL PSI;Ll;0;L;;;;;N;;;;; 1D2B;CYRILLIC LETTER SMALL CAPITAL EL;Ll;0;L;;;;;N;;;;; 1D2C;MODIFIER LETTER CAPITAL A;Lm;0;L;<super> 0041;;;;N;;;;; 1D2D;MODIFIER LETTER CAPITAL AE;Lm;0;L;<super> 00C6;;;;N;;;;; 1D2E;MODIFIER LETTER CAPITAL B;Lm;0;L;<super> 0042;;;;N;;;;; 1D2F;MODIFIER LETTER CAPITAL BARRED B;Lm;0;L;;;;;N;;;;; 1D30;MODIFIER LETTER CAPITAL D;Lm;0;L;<super> 0044;;;;N;;;;; 1D31;MODIFIER LETTER CAPITAL E;Lm;0;L;<super> 0045;;;;N;;;;; 1D32;MODIFIER LETTER CAPITAL REVERSED E;Lm;0;L;<super> 018E;;;;N;;;;; 1D33;MODIFIER LETTER CAPITAL G;Lm;0;L;<super> 0047;;;;N;;;;; 1D34;MODIFIER LETTER CAPITAL H;Lm;0;L;<super> 0048;;;;N;;;;; 1D35;MODIFIER LETTER CAPITAL I;Lm;0;L;<super> 0049;;;;N;;;;; 1D36;MODIFIER LETTER CAPITAL J;Lm;0;L;<super> 004A;;;;N;;;;; 1D37;MODIFIER LETTER CAPITAL K;Lm;0;L;<super> 004B;;;;N;;;;; 1D38;MODIFIER LETTER CAPITAL L;Lm;0;L;<super> 004C;;;;N;;;;; 1D39;MODIFIER LETTER CAPITAL M;Lm;0;L;<super> 004D;;;;N;;;;; 1D3A;MODIFIER LETTER CAPITAL N;Lm;0;L;<super> 004E;;;;N;;;;; 1D3B;MODIFIER LETTER CAPITAL REVERSED N;Lm;0;L;;;;;N;;;;; 1D3C;MODIFIER LETTER CAPITAL O;Lm;0;L;<super> 004F;;;;N;;;;; 1D3D;MODIFIER LETTER CAPITAL OU;Lm;0;L;<super> 0222;;;;N;;;;; 1D3E;MODIFIER LETTER CAPITAL P;Lm;0;L;<super> 0050;;;;N;;;;; 1D3F;MODIFIER LETTER CAPITAL R;Lm;0;L;<super> 0052;;;;N;;;;; 1D40;MODIFIER LETTER CAPITAL T;Lm;0;L;<super> 0054;;;;N;;;;; 1D41;MODIFIER LETTER CAPITAL U;Lm;0;L;<super> 0055;;;;N;;;;; 1D42;MODIFIER LETTER CAPITAL W;Lm;0;L;<super> 0057;;;;N;;;;; 1D43;MODIFIER LETTER SMALL A;Lm;0;L;<super> 0061;;;;N;;;;; 1D44;MODIFIER LETTER SMALL TURNED A;Lm;0;L;<super> 0250;;;;N;;;;; 1D45;MODIFIER LETTER SMALL ALPHA;Lm;0;L;<super> 0251;;;;N;;;;; 1D46;MODIFIER LETTER SMALL TURNED AE;Lm;0;L;<super> 1D02;;;;N;;;;; 1D47;MODIFIER LETTER SMALL B;Lm;0;L;<super> 0062;;;;N;;;;; 1D48;MODIFIER LETTER SMALL D;Lm;0;L;<super> 0064;;;;N;;;;; 1D49;MODIFIER LETTER SMALL E;Lm;0;L;<super> 0065;;;;N;;;;; 1D4A;MODIFIER LETTER SMALL SCHWA;Lm;0;L;<super> 0259;;;;N;;;;; 1D4B;MODIFIER LETTER SMALL OPEN E;Lm;0;L;<super> 025B;;;;N;;;;; 1D4C;MODIFIER LETTER SMALL TURNED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;; 1D4D;MODIFIER LETTER SMALL G;Lm;0;L;<super> 0067;;;;N;;;;; 1D4E;MODIFIER LETTER SMALL TURNED I;Lm;0;L;;;;;N;;;;; 1D4F;MODIFIER LETTER SMALL K;Lm;0;L;<super> 006B;;;;N;;;;; 1D50;MODIFIER LETTER SMALL M;Lm;0;L;<super> 006D;;;;N;;;;; 1D51;MODIFIER LETTER SMALL ENG;Lm;0;L;<super> 014B;;;;N;;;;; 1D52;MODIFIER LETTER SMALL O;Lm;0;L;<super> 006F;;;;N;;;;; 1D53;MODIFIER LETTER SMALL OPEN O;Lm;0;L;<super> 0254;;;;N;;;;; 1D54;MODIFIER LETTER SMALL TOP HALF O;Lm;0;L;<super> 1D16;;;;N;;;;; 1D55;MODIFIER LETTER SMALL BOTTOM HALF O;Lm;0;L;<super> 1D17;;;;N;;;;; 1D56;MODIFIER LETTER SMALL P;Lm;0;L;<super> 0070;;;;N;;;;; 1D57;MODIFIER LETTER SMALL T;Lm;0;L;<super> 0074;;;;N;;;;; 1D58;MODIFIER LETTER SMALL U;Lm;0;L;<super> 0075;;;;N;;;;; 1D59;MODIFIER LETTER SMALL SIDEWAYS U;Lm;0;L;<super> 1D1D;;;;N;;;;; 1D5A;MODIFIER LETTER SMALL TURNED M;Lm;0;L;<super> 026F;;;;N;;;;; 1D5B;MODIFIER LETTER SMALL V;Lm;0;L;<super> 0076;;;;N;;;;; 1D5C;MODIFIER LETTER SMALL AIN;Lm;0;L;<super> 1D25;;;;N;;;;; 1D5D;MODIFIER LETTER SMALL BETA;Lm;0;L;<super> 03B2;;;;N;;;;; 1D5E;MODIFIER LETTER SMALL GREEK GAMMA;Lm;0;L;<super> 03B3;;;;N;;;;; 1D5F;MODIFIER LETTER SMALL DELTA;Lm;0;L;<super> 03B4;;;;N;;;;; 1D60;MODIFIER LETTER SMALL GREEK PHI;Lm;0;L;<super> 03C6;;;;N;;;;; 1D61;MODIFIER LETTER SMALL CHI;Lm;0;L;<super> 03C7;;;;N;;;;; 1D62;LATIN SUBSCRIPT SMALL LETTER I;Lm;0;L;<sub> 0069;;;;N;;;;; 1D63;LATIN SUBSCRIPT SMALL LETTER R;Lm;0;L;<sub> 0072;;;;N;;;;; 1D64;LATIN SUBSCRIPT SMALL LETTER U;Lm;0;L;<sub> 0075;;;;N;;;;; 1D65;LATIN SUBSCRIPT SMALL LETTER V;Lm;0;L;<sub> 0076;;;;N;;;;; 1D66;GREEK SUBSCRIPT SMALL LETTER BETA;Lm;0;L;<sub> 03B2;;;;N;;;;; 1D67;GREEK SUBSCRIPT SMALL LETTER GAMMA;Lm;0;L;<sub> 03B3;;;;N;;;;; 1D68;GREEK SUBSCRIPT SMALL LETTER RHO;Lm;0;L;<sub> 03C1;;;;N;;;;; 1D69;GREEK SUBSCRIPT SMALL LETTER PHI;Lm;0;L;<sub> 03C6;;;;N;;;;; 1D6A;GREEK SUBSCRIPT SMALL LETTER CHI;Lm;0;L;<sub> 03C7;;;;N;;;;; 1D6B;LATIN SMALL LETTER UE;Ll;0;L;;;;;N;;;;; 1D6C;LATIN SMALL LETTER B WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; 1D6D;LATIN SMALL LETTER D WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; 1D6E;LATIN SMALL LETTER F WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; 1D6F;LATIN SMALL LETTER M WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; 1D70;LATIN SMALL LETTER N WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; 1D71;LATIN SMALL LETTER P WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; 1D72;LATIN SMALL LETTER R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; 1D73;LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE;Ll;0;L;;;;;N;;;;; 1D74;LATIN SMALL LETTER S WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; 1D75;LATIN SMALL LETTER T WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; 1D76;LATIN SMALL LETTER Z WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; 1D77;LATIN SMALL LETTER TURNED G;Ll;0;L;;;;;N;;;;; 1D78;MODIFIER LETTER CYRILLIC EN;Lm;0;L;<super> 043D;;;;N;;;;; 1D79;LATIN SMALL LETTER INSULAR G;Ll;0;L;;;;;N;;;A77D;;A77D 1D7A;LATIN SMALL LETTER TH WITH STRIKETHROUGH;Ll;0;L;;;;;N;;;;; 1D7B;LATIN SMALL CAPITAL LETTER I WITH STROKE;Ll;0;L;;;;;N;;;;; 1D7C;LATIN SMALL LETTER IOTA WITH STROKE;Ll;0;L;;;;;N;;;;; 1D7D;LATIN SMALL LETTER P WITH STROKE;Ll;0;L;;;;;N;;;2C63;;2C63 1D7E;LATIN SMALL CAPITAL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;;; 1D7F;LATIN SMALL LETTER UPSILON WITH STROKE;Ll;0;L;;;;;N;;;;; 1D80;LATIN SMALL LETTER B WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; 1D81;LATIN SMALL LETTER D WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; 1D82;LATIN SMALL LETTER F WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; 1D83;LATIN SMALL LETTER G WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; 1D84;LATIN SMALL LETTER K WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; 1D85;LATIN SMALL LETTER L WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; 1D86;LATIN SMALL LETTER M WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; 1D87;LATIN SMALL LETTER N WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; 1D88;LATIN SMALL LETTER P WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; 1D89;LATIN SMALL LETTER R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; 1D8A;LATIN SMALL LETTER S WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; 1D8B;LATIN SMALL LETTER ESH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; 1D8C;LATIN SMALL LETTER V WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; 1D8D;LATIN SMALL LETTER X WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; 1D8E;LATIN SMALL LETTER Z WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; 1D8F;LATIN SMALL LETTER A WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; 1D90;LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; 1D91;LATIN SMALL LETTER D WITH HOOK AND TAIL;Ll;0;L;;;;;N;;;;; 1D92;LATIN SMALL LETTER E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; 1D93;LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; 1D94;LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; 1D95;LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; 1D96;LATIN SMALL LETTER I WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; 1D97;LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; 1D98;LATIN SMALL LETTER ESH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; 1D99;LATIN SMALL LETTER U WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; 1D9A;LATIN SMALL LETTER EZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; 1D9B;MODIFIER LETTER SMALL TURNED ALPHA;Lm;0;L;<super> 0252;;;;N;;;;; 1D9C;MODIFIER LETTER SMALL C;Lm;0;L;<super> 0063;;;;N;;;;; 1D9D;MODIFIER LETTER SMALL C WITH CURL;Lm;0;L;<super> 0255;;;;N;;;;; 1D9E;MODIFIER LETTER SMALL ETH;Lm;0;L;<super> 00F0;;;;N;;;;; 1D9F;MODIFIER LETTER SMALL REVERSED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;; 1DA0;MODIFIER LETTER SMALL F;Lm;0;L;<super> 0066;;;;N;;;;; 1DA1;MODIFIER LETTER SMALL DOTLESS J WITH STROKE;Lm;0;L;<super> 025F;;;;N;;;;; 1DA2;MODIFIER LETTER SMALL SCRIPT G;Lm;0;L;<super> 0261;;;;N;;;;; 1DA3;MODIFIER LETTER SMALL TURNED H;Lm;0;L;<super> 0265;;;;N;;;;; 1DA4;MODIFIER LETTER SMALL I WITH STROKE;Lm;0;L;<super> 0268;;;;N;;;;; 1DA5;MODIFIER LETTER SMALL IOTA;Lm;0;L;<super> 0269;;;;N;;;;; 1DA6;MODIFIER LETTER SMALL CAPITAL I;Lm;0;L;<super> 026A;;;;N;;;;; 1DA7;MODIFIER LETTER SMALL CAPITAL I WITH STROKE;Lm;0;L;<super> 1D7B;;;;N;;;;; 1DA8;MODIFIER LETTER SMALL J WITH CROSSED-TAIL;Lm;0;L;<super> 029D;;;;N;;;;; 1DA9;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK;Lm;0;L;<super> 026D;;;;N;;;;; 1DAA;MODIFIER LETTER SMALL L WITH PALATAL HOOK;Lm;0;L;<super> 1D85;;;;N;;;;; 1DAB;MODIFIER LETTER SMALL CAPITAL L;Lm;0;L;<super> 029F;;;;N;;;;; 1DAC;MODIFIER LETTER SMALL M WITH HOOK;Lm;0;L;<super> 0271;;;;N;;;;; 1DAD;MODIFIER LETTER SMALL TURNED M WITH LONG LEG;Lm;0;L;<super> 0270;;;;N;;;;; 1DAE;MODIFIER LETTER SMALL N WITH LEFT HOOK;Lm;0;L;<super> 0272;;;;N;;;;; 1DAF;MODIFIER LETTER SMALL N WITH RETROFLEX HOOK;Lm;0;L;<super> 0273;;;;N;;;;; 1DB0;MODIFIER LETTER SMALL CAPITAL N;Lm;0;L;<super> 0274;;;;N;;;;; 1DB1;MODIFIER LETTER SMALL BARRED O;Lm;0;L;<super> 0275;;;;N;;;;; 1DB2;MODIFIER LETTER SMALL PHI;Lm;0;L;<super> 0278;;;;N;;;;; 1DB3;MODIFIER LETTER SMALL S WITH HOOK;Lm;0;L;<super> 0282;;;;N;;;;; 1DB4;MODIFIER LETTER SMALL ESH;Lm;0;L;<super> 0283;;;;N;;;;; 1DB5;MODIFIER LETTER SMALL T WITH PALATAL HOOK;Lm;0;L;<super> 01AB;;;;N;;;;; 1DB6;MODIFIER LETTER SMALL U BAR;Lm;0;L;<super> 0289;;;;N;;;;; 1DB7;MODIFIER LETTER SMALL UPSILON;Lm;0;L;<super> 028A;;;;N;;;;; 1DB8;MODIFIER LETTER SMALL CAPITAL U;Lm;0;L;<super> 1D1C;;;;N;;;;; 1DB9;MODIFIER LETTER SMALL V WITH HOOK;Lm;0;L;<super> 028B;;;;N;;;;; 1DBA;MODIFIER LETTER SMALL TURNED V;Lm;0;L;<super> 028C;;;;N;;;;; 1DBB;MODIFIER LETTER SMALL Z;Lm;0;L;<super> 007A;;;;N;;;;; 1DBC;MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK;Lm;0;L;<super> 0290;;;;N;;;;; 1DBD;MODIFIER LETTER SMALL Z WITH CURL;Lm;0;L;<super> 0291;;;;N;;;;; 1DBE;MODIFIER LETTER SMALL EZH;Lm;0;L;<super> 0292;;;;N;;;;; 1DBF;MODIFIER LETTER SMALL THETA;Lm;0;L;<super> 03B8;;;;N;;;;; 1DC0;COMBINING DOTTED GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; 1DC1;COMBINING DOTTED ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; 1DC2;COMBINING SNAKE BELOW;Mn;220;NSM;;;;;N;;;;; 1DC3;COMBINING SUSPENSION MARK;Mn;230;NSM;;;;;N;;;;; 1DC4;COMBINING MACRON-ACUTE;Mn;230;NSM;;;;;N;;;;; 1DC5;COMBINING GRAVE-MACRON;Mn;230;NSM;;;;;N;;;;; 1DC6;COMBINING MACRON-GRAVE;Mn;230;NSM;;;;;N;;;;; 1DC7;COMBINING ACUTE-MACRON;Mn;230;NSM;;;;;N;;;;; 1DC8;COMBINING GRAVE-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;; 1DC9;COMBINING ACUTE-GRAVE-ACUTE;Mn;230;NSM;;;;;N;;;;; 1DCA;COMBINING LATIN SMALL LETTER R BELOW;Mn;220;NSM;;;;;N;;;;; 1DCB;COMBINING BREVE-MACRON;Mn;230;NSM;;;;;N;;;;; 1DCC;COMBINING MACRON-BREVE;Mn;230;NSM;;;;;N;;;;; 1DCD;COMBINING DOUBLE CIRCUMFLEX ABOVE;Mn;234;NSM;;;;;N;;;;; 1DCE;COMBINING OGONEK ABOVE;Mn;214;NSM;;;;;N;;;;; 1DCF;COMBINING ZIGZAG BELOW;Mn;220;NSM;;;;;N;;;;; 1DD0;COMBINING IS BELOW;Mn;202;NSM;;;;;N;;;;; 1DD1;COMBINING UR ABOVE;Mn;230;NSM;;;;;N;;;;; 1DD2;COMBINING US ABOVE;Mn;230;NSM;;;;;N;;;;; 1DD3;COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE;Mn;230;NSM;;;;;N;;;;; 1DD4;COMBINING LATIN SMALL LETTER AE;Mn;230;NSM;;;;;N;;;;; 1DD5;COMBINING LATIN SMALL LETTER AO;Mn;230;NSM;;;;;N;;;;; 1DD6;COMBINING LATIN SMALL LETTER AV;Mn;230;NSM;;;;;N;;;;; 1DD7;COMBINING LATIN SMALL LETTER C CEDILLA;Mn;230;NSM;;;;;N;;;;; 1DD8;COMBINING LATIN SMALL LETTER INSULAR D;Mn;230;NSM;;;;;N;;;;; 1DD9;COMBINING LATIN SMALL LETTER ETH;Mn;230;NSM;;;;;N;;;;; 1DDA;COMBINING LATIN SMALL LETTER G;Mn;230;NSM;;;;;N;;;;; 1DDB;COMBINING LATIN LETTER SMALL CAPITAL G;Mn;230;NSM;;;;;N;;;;; 1DDC;COMBINING LATIN SMALL LETTER K;Mn;230;NSM;;;;;N;;;;; 1DDD;COMBINING LATIN SMALL LETTER L;Mn;230;NSM;;;;;N;;;;; 1DDE;COMBINING LATIN LETTER SMALL CAPITAL L;Mn;230;NSM;;;;;N;;;;; 1DDF;COMBINING LATIN LETTER SMALL CAPITAL M;Mn;230;NSM;;;;;N;;;;; 1DE0;COMBINING LATIN SMALL LETTER N;Mn;230;NSM;;;;;N;;;;; 1DE1;COMBINING LATIN LETTER SMALL CAPITAL N;Mn;230;NSM;;;;;N;;;;; 1DE2;COMBINING LATIN LETTER SMALL CAPITAL R;Mn;230;NSM;;;;;N;;;;; 1DE3;COMBINING LATIN SMALL LETTER R ROTUNDA;Mn;230;NSM;;;;;N;;;;; 1DE4;COMBINING LATIN SMALL LETTER S;Mn;230;NSM;;;;;N;;;;; 1DE5;COMBINING LATIN SMALL LETTER LONG S;Mn;230;NSM;;;;;N;;;;; 1DE6;COMBINING LATIN SMALL LETTER Z;Mn;230;NSM;;;;;N;;;;; 1DE7;COMBINING LATIN SMALL LETTER ALPHA;Mn;230;NSM;;;;;N;;;;; 1DE8;COMBINING LATIN SMALL LETTER B;Mn;230;NSM;;;;;N;;;;; 1DE9;COMBINING LATIN SMALL LETTER BETA;Mn;230;NSM;;;;;N;;;;; 1DEA;COMBINING LATIN SMALL LETTER SCHWA;Mn;230;NSM;;;;;N;;;;; 1DEB;COMBINING LATIN SMALL LETTER F;Mn;230;NSM;;;;;N;;;;; 1DEC;COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE;Mn;230;NSM;;;;;N;;;;; 1DED;COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE;Mn;230;NSM;;;;;N;;;;; 1DEE;COMBINING LATIN SMALL LETTER P;Mn;230;NSM;;;;;N;;;;; 1DEF;COMBINING LATIN SMALL LETTER ESH;Mn;230;NSM;;;;;N;;;;; 1DF0;COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE;Mn;230;NSM;;;;;N;;;;; 1DF1;COMBINING LATIN SMALL LETTER W;Mn;230;NSM;;;;;N;;;;; 1DF2;COMBINING LATIN SMALL LETTER A WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; 1DF3;COMBINING LATIN SMALL LETTER O WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; 1DF4;COMBINING LATIN SMALL LETTER U WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; 1DF5;COMBINING UP TACK ABOVE;Mn;230;NSM;;;;;N;;;;; 1DFB;COMBINING DELETION MARK;Mn;230;NSM;;;;;N;;;;; 1DFC;COMBINING DOUBLE INVERTED BREVE BELOW;Mn;233;NSM;;;;;N;;;;; 1DFD;COMBINING ALMOST EQUAL TO BELOW;Mn;220;NSM;;;;;N;;;;; 1DFE;COMBINING LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; 1DFF;COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; 1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01; 1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00 1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03; 1E03;LATIN SMALL LETTER B WITH DOT ABOVE;Ll;0;L;0062 0307;;;;N;;;1E02;;1E02 1E04;LATIN CAPITAL LETTER B WITH DOT BELOW;Lu;0;L;0042 0323;;;;N;;;;1E05; 1E05;LATIN SMALL LETTER B WITH DOT BELOW;Ll;0;L;0062 0323;;;;N;;;1E04;;1E04 1E06;LATIN CAPITAL LETTER B WITH LINE BELOW;Lu;0;L;0042 0331;;;;N;;;;1E07; 1E07;LATIN SMALL LETTER B WITH LINE BELOW;Ll;0;L;0062 0331;;;;N;;;1E06;;1E06 1E08;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE;Lu;0;L;00C7 0301;;;;N;;;;1E09; 1E09;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE;Ll;0;L;00E7 0301;;;;N;;;1E08;;1E08 1E0A;LATIN CAPITAL LETTER D WITH DOT ABOVE;Lu;0;L;0044 0307;;;;N;;;;1E0B; 1E0B;LATIN SMALL LETTER D WITH DOT ABOVE;Ll;0;L;0064 0307;;;;N;;;1E0A;;1E0A 1E0C;LATIN CAPITAL LETTER D WITH DOT BELOW;Lu;0;L;0044 0323;;;;N;;;;1E0D; 1E0D;LATIN SMALL LETTER D WITH DOT BELOW;Ll;0;L;0064 0323;;;;N;;;1E0C;;1E0C 1E0E;LATIN CAPITAL LETTER D WITH LINE BELOW;Lu;0;L;0044 0331;;;;N;;;;1E0F; 1E0F;LATIN SMALL LETTER D WITH LINE BELOW;Ll;0;L;0064 0331;;;;N;;;1E0E;;1E0E 1E10;LATIN CAPITAL LETTER D WITH CEDILLA;Lu;0;L;0044 0327;;;;N;;;;1E11; 1E11;LATIN SMALL LETTER D WITH CEDILLA;Ll;0;L;0064 0327;;;;N;;;1E10;;1E10 1E12;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW;Lu;0;L;0044 032D;;;;N;;;;1E13; 1E13;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW;Ll;0;L;0064 032D;;;;N;;;1E12;;1E12 1E14;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE;Lu;0;L;0112 0300;;;;N;;;;1E15; 1E15;LATIN SMALL LETTER E WITH MACRON AND GRAVE;Ll;0;L;0113 0300;;;;N;;;1E14;;1E14 1E16;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE;Lu;0;L;0112 0301;;;;N;;;;1E17; 1E17;LATIN SMALL LETTER E WITH MACRON AND ACUTE;Ll;0;L;0113 0301;;;;N;;;1E16;;1E16 1E18;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW;Lu;0;L;0045 032D;;;;N;;;;1E19; 1E19;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW;Ll;0;L;0065 032D;;;;N;;;1E18;;1E18 1E1A;LATIN CAPITAL LETTER E WITH TILDE BELOW;Lu;0;L;0045 0330;;;;N;;;;1E1B; 1E1B;LATIN SMALL LETTER E WITH TILDE BELOW;Ll;0;L;0065 0330;;;;N;;;1E1A;;1E1A 1E1C;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE;Lu;0;L;0228 0306;;;;N;;;;1E1D; 1E1D;LATIN SMALL LETTER E WITH CEDILLA AND BREVE;Ll;0;L;0229 0306;;;;N;;;1E1C;;1E1C 1E1E;LATIN CAPITAL LETTER F WITH DOT ABOVE;Lu;0;L;0046 0307;;;;N;;;;1E1F; 1E1F;LATIN SMALL LETTER F WITH DOT ABOVE;Ll;0;L;0066 0307;;;;N;;;1E1E;;1E1E 1E20;LATIN CAPITAL LETTER G WITH MACRON;Lu;0;L;0047 0304;;;;N;;;;1E21; 1E21;LATIN SMALL LETTER G WITH MACRON;Ll;0;L;0067 0304;;;;N;;;1E20;;1E20 1E22;LATIN CAPITAL LETTER H WITH DOT ABOVE;Lu;0;L;0048 0307;;;;N;;;;1E23; 1E23;LATIN SMALL LETTER H WITH DOT ABOVE;Ll;0;L;0068 0307;;;;N;;;1E22;;1E22 1E24;LATIN CAPITAL LETTER H WITH DOT BELOW;Lu;0;L;0048 0323;;;;N;;;;1E25; 1E25;LATIN SMALL LETTER H WITH DOT BELOW;Ll;0;L;0068 0323;;;;N;;;1E24;;1E24 1E26;LATIN CAPITAL LETTER H WITH DIAERESIS;Lu;0;L;0048 0308;;;;N;;;;1E27; 1E27;LATIN SMALL LETTER H WITH DIAERESIS;Ll;0;L;0068 0308;;;;N;;;1E26;;1E26 1E28;LATIN CAPITAL LETTER H WITH CEDILLA;Lu;0;L;0048 0327;;;;N;;;;1E29; 1E29;LATIN SMALL LETTER H WITH CEDILLA;Ll;0;L;0068 0327;;;;N;;;1E28;;1E28 1E2A;LATIN CAPITAL LETTER H WITH BREVE BELOW;Lu;0;L;0048 032E;;;;N;;;;1E2B; 1E2B;LATIN SMALL LETTER H WITH BREVE BELOW;Ll;0;L;0068 032E;;;;N;;;1E2A;;1E2A 1E2C;LATIN CAPITAL LETTER I WITH TILDE BELOW;Lu;0;L;0049 0330;;;;N;;;;1E2D; 1E2D;LATIN SMALL LETTER I WITH TILDE BELOW;Ll;0;L;0069 0330;;;;N;;;1E2C;;1E2C 1E2E;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE;Lu;0;L;00CF 0301;;;;N;;;;1E2F; 1E2F;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE;Ll;0;L;00EF 0301;;;;N;;;1E2E;;1E2E 1E30;LATIN CAPITAL LETTER K WITH ACUTE;Lu;0;L;004B 0301;;;;N;;;;1E31; 1E31;LATIN SMALL LETTER K WITH ACUTE;Ll;0;L;006B 0301;;;;N;;;1E30;;1E30 1E32;LATIN CAPITAL LETTER K WITH DOT BELOW;Lu;0;L;004B 0323;;;;N;;;;1E33; 1E33;LATIN SMALL LETTER K WITH DOT BELOW;Ll;0;L;006B 0323;;;;N;;;1E32;;1E32 1E34;LATIN CAPITAL LETTER K WITH LINE BELOW;Lu;0;L;004B 0331;;;;N;;;;1E35; 1E35;LATIN SMALL LETTER K WITH LINE BELOW;Ll;0;L;006B 0331;;;;N;;;1E34;;1E34 1E36;LATIN CAPITAL LETTER L WITH DOT BELOW;Lu;0;L;004C 0323;;;;N;;;;1E37; 1E37;LATIN SMALL LETTER L WITH DOT BELOW;Ll;0;L;006C 0323;;;;N;;;1E36;;1E36 1E38;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON;Lu;0;L;1E36 0304;;;;N;;;;1E39; 1E39;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON;Ll;0;L;1E37 0304;;;;N;;;1E38;;1E38 1E3A;LATIN CAPITAL LETTER L WITH LINE BELOW;Lu;0;L;004C 0331;;;;N;;;;1E3B; 1E3B;LATIN SMALL LETTER L WITH LINE BELOW;Ll;0;L;006C 0331;;;;N;;;1E3A;;1E3A 1E3C;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW;Lu;0;L;004C 032D;;;;N;;;;1E3D; 1E3D;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW;Ll;0;L;006C 032D;;;;N;;;1E3C;;1E3C 1E3E;LATIN CAPITAL LETTER M WITH ACUTE;Lu;0;L;004D 0301;;;;N;;;;1E3F; 1E3F;LATIN SMALL LETTER M WITH ACUTE;Ll;0;L;006D 0301;;;;N;;;1E3E;;1E3E 1E40;LATIN CAPITAL LETTER M WITH DOT ABOVE;Lu;0;L;004D 0307;;;;N;;;;1E41; 1E41;LATIN SMALL LETTER M WITH DOT ABOVE;Ll;0;L;006D 0307;;;;N;;;1E40;;1E40 1E42;LATIN CAPITAL LETTER M WITH DOT BELOW;Lu;0;L;004D 0323;;;;N;;;;1E43; 1E43;LATIN SMALL LETTER M WITH DOT BELOW;Ll;0;L;006D 0323;;;;N;;;1E42;;1E42 1E44;LATIN CAPITAL LETTER N WITH DOT ABOVE;Lu;0;L;004E 0307;;;;N;;;;1E45; 1E45;LATIN SMALL LETTER N WITH DOT ABOVE;Ll;0;L;006E 0307;;;;N;;;1E44;;1E44 1E46;LATIN CAPITAL LETTER N WITH DOT BELOW;Lu;0;L;004E 0323;;;;N;;;;1E47; 1E47;LATIN SMALL LETTER N WITH DOT BELOW;Ll;0;L;006E 0323;;;;N;;;1E46;;1E46 1E48;LATIN CAPITAL LETTER N WITH LINE BELOW;Lu;0;L;004E 0331;;;;N;;;;1E49; 1E49;LATIN SMALL LETTER N WITH LINE BELOW;Ll;0;L;006E 0331;;;;N;;;1E48;;1E48 1E4A;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW;Lu;0;L;004E 032D;;;;N;;;;1E4B; 1E4B;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW;Ll;0;L;006E 032D;;;;N;;;1E4A;;1E4A 1E4C;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE;Lu;0;L;00D5 0301;;;;N;;;;1E4D; 1E4D;LATIN SMALL LETTER O WITH TILDE AND ACUTE;Ll;0;L;00F5 0301;;;;N;;;1E4C;;1E4C 1E4E;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS;Lu;0;L;00D5 0308;;;;N;;;;1E4F; 1E4F;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS;Ll;0;L;00F5 0308;;;;N;;;1E4E;;1E4E 1E50;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE;Lu;0;L;014C 0300;;;;N;;;;1E51; 1E51;LATIN SMALL LETTER O WITH MACRON AND GRAVE;Ll;0;L;014D 0300;;;;N;;;1E50;;1E50 1E52;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE;Lu;0;L;014C 0301;;;;N;;;;1E53; 1E53;LATIN SMALL LETTER O WITH MACRON AND ACUTE;Ll;0;L;014D 0301;;;;N;;;1E52;;1E52 1E54;LATIN CAPITAL LETTER P WITH ACUTE;Lu;0;L;0050 0301;;;;N;;;;1E55; 1E55;LATIN SMALL LETTER P WITH ACUTE;Ll;0;L;0070 0301;;;;N;;;1E54;;1E54 1E56;LATIN CAPITAL LETTER P WITH DOT ABOVE;Lu;0;L;0050 0307;;;;N;;;;1E57; 1E57;LATIN SMALL LETTER P WITH DOT ABOVE;Ll;0;L;0070 0307;;;;N;;;1E56;;1E56 1E58;LATIN CAPITAL LETTER R WITH DOT ABOVE;Lu;0;L;0052 0307;;;;N;;;;1E59; 1E59;LATIN SMALL LETTER R WITH DOT ABOVE;Ll;0;L;0072 0307;;;;N;;;1E58;;1E58 1E5A;LATIN CAPITAL LETTER R WITH DOT BELOW;Lu;0;L;0052 0323;;;;N;;;;1E5B; 1E5B;LATIN SMALL LETTER R WITH DOT BELOW;Ll;0;L;0072 0323;;;;N;;;1E5A;;1E5A 1E5C;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON;Lu;0;L;1E5A 0304;;;;N;;;;1E5D; 1E5D;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON;Ll;0;L;1E5B 0304;;;;N;;;1E5C;;1E5C 1E5E;LATIN CAPITAL LETTER R WITH LINE BELOW;Lu;0;L;0052 0331;;;;N;;;;1E5F; 1E5F;LATIN SMALL LETTER R WITH LINE BELOW;Ll;0;L;0072 0331;;;;N;;;1E5E;;1E5E 1E60;LATIN CAPITAL LETTER S WITH DOT ABOVE;Lu;0;L;0053 0307;;;;N;;;;1E61; 1E61;LATIN SMALL LETTER S WITH DOT ABOVE;Ll;0;L;0073 0307;;;;N;;;1E60;;1E60 1E62;LATIN CAPITAL LETTER S WITH DOT BELOW;Lu;0;L;0053 0323;;;;N;;;;1E63; 1E63;LATIN SMALL LETTER S WITH DOT BELOW;Ll;0;L;0073 0323;;;;N;;;1E62;;1E62 1E64;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE;Lu;0;L;015A 0307;;;;N;;;;1E65; 1E65;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE;Ll;0;L;015B 0307;;;;N;;;1E64;;1E64 1E66;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE;Lu;0;L;0160 0307;;;;N;;;;1E67; 1E67;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE;Ll;0;L;0161 0307;;;;N;;;1E66;;1E66 1E68;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE;Lu;0;L;1E62 0307;;;;N;;;;1E69; 1E69;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE;Ll;0;L;1E63 0307;;;;N;;;1E68;;1E68 1E6A;LATIN CAPITAL LETTER T WITH DOT ABOVE;Lu;0;L;0054 0307;;;;N;;;;1E6B; 1E6B;LATIN SMALL LETTER T WITH DOT ABOVE;Ll;0;L;0074 0307;;;;N;;;1E6A;;1E6A 1E6C;LATIN CAPITAL LETTER T WITH DOT BELOW;Lu;0;L;0054 0323;;;;N;;;;1E6D; 1E6D;LATIN SMALL LETTER T WITH DOT BELOW;Ll;0;L;0074 0323;;;;N;;;1E6C;;1E6C 1E6E;LATIN CAPITAL LETTER T WITH LINE BELOW;Lu;0;L;0054 0331;;;;N;;;;1E6F; 1E6F;LATIN SMALL LETTER T WITH LINE BELOW;Ll;0;L;0074 0331;;;;N;;;1E6E;;1E6E 1E70;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW;Lu;0;L;0054 032D;;;;N;;;;1E71; 1E71;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW;Ll;0;L;0074 032D;;;;N;;;1E70;;1E70 1E72;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW;Lu;0;L;0055 0324;;;;N;;;;1E73; 1E73;LATIN SMALL LETTER U WITH DIAERESIS BELOW;Ll;0;L;0075 0324;;;;N;;;1E72;;1E72 1E74;LATIN CAPITAL LETTER U WITH TILDE BELOW;Lu;0;L;0055 0330;;;;N;;;;1E75; 1E75;LATIN SMALL LETTER U WITH TILDE BELOW;Ll;0;L;0075 0330;;;;N;;;1E74;;1E74 1E76;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW;Lu;0;L;0055 032D;;;;N;;;;1E77; 1E77;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW;Ll;0;L;0075 032D;;;;N;;;1E76;;1E76 1E78;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE;Lu;0;L;0168 0301;;;;N;;;;1E79; 1E79;LATIN SMALL LETTER U WITH TILDE AND ACUTE;Ll;0;L;0169 0301;;;;N;;;1E78;;1E78 1E7A;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS;Lu;0;L;016A 0308;;;;N;;;;1E7B; 1E7B;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS;Ll;0;L;016B 0308;;;;N;;;1E7A;;1E7A 1E7C;LATIN CAPITAL LETTER V WITH TILDE;Lu;0;L;0056 0303;;;;N;;;;1E7D; 1E7D;LATIN SMALL LETTER V WITH TILDE;Ll;0;L;0076 0303;;;;N;;;1E7C;;1E7C 1E7E;LATIN CAPITAL LETTER V WITH DOT BELOW;Lu;0;L;0056 0323;;;;N;;;;1E7F; 1E7F;LATIN SMALL LETTER V WITH DOT BELOW;Ll;0;L;0076 0323;;;;N;;;1E7E;;1E7E 1E80;LATIN CAPITAL LETTER W WITH GRAVE;Lu;0;L;0057 0300;;;;N;;;;1E81; 1E81;LATIN SMALL LETTER W WITH GRAVE;Ll;0;L;0077 0300;;;;N;;;1E80;;1E80 1E82;LATIN CAPITAL LETTER W WITH ACUTE;Lu;0;L;0057 0301;;;;N;;;;1E83; 1E83;LATIN SMALL LETTER W WITH ACUTE;Ll;0;L;0077 0301;;;;N;;;1E82;;1E82 1E84;LATIN CAPITAL LETTER W WITH DIAERESIS;Lu;0;L;0057 0308;;;;N;;;;1E85; 1E85;LATIN SMALL LETTER W WITH DIAERESIS;Ll;0;L;0077 0308;;;;N;;;1E84;;1E84 1E86;LATIN CAPITAL LETTER W WITH DOT ABOVE;Lu;0;L;0057 0307;;;;N;;;;1E87; 1E87;LATIN SMALL LETTER W WITH DOT ABOVE;Ll;0;L;0077 0307;;;;N;;;1E86;;1E86 1E88;LATIN CAPITAL LETTER W WITH DOT BELOW;Lu;0;L;0057 0323;;;;N;;;;1E89; 1E89;LATIN SMALL LETTER W WITH DOT BELOW;Ll;0;L;0077 0323;;;;N;;;1E88;;1E88 1E8A;LATIN CAPITAL LETTER X WITH DOT ABOVE;Lu;0;L;0058 0307;;;;N;;;;1E8B; 1E8B;LATIN SMALL LETTER X WITH DOT ABOVE;Ll;0;L;0078 0307;;;;N;;;1E8A;;1E8A 1E8C;LATIN CAPITAL LETTER X WITH DIAERESIS;Lu;0;L;0058 0308;;;;N;;;;1E8D; 1E8D;LATIN SMALL LETTER X WITH DIAERESIS;Ll;0;L;0078 0308;;;;N;;;1E8C;;1E8C 1E8E;LATIN CAPITAL LETTER Y WITH DOT ABOVE;Lu;0;L;0059 0307;;;;N;;;;1E8F; 1E8F;LATIN SMALL LETTER Y WITH DOT ABOVE;Ll;0;L;0079 0307;;;;N;;;1E8E;;1E8E 1E90;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX;Lu;0;L;005A 0302;;;;N;;;;1E91; 1E91;LATIN SMALL LETTER Z WITH CIRCUMFLEX;Ll;0;L;007A 0302;;;;N;;;1E90;;1E90 1E92;LATIN CAPITAL LETTER Z WITH DOT BELOW;Lu;0;L;005A 0323;;;;N;;;;1E93; 1E93;LATIN SMALL LETTER Z WITH DOT BELOW;Ll;0;L;007A 0323;;;;N;;;1E92;;1E92 1E94;LATIN CAPITAL LETTER Z WITH LINE BELOW;Lu;0;L;005A 0331;;;;N;;;;1E95; 1E95;LATIN SMALL LETTER Z WITH LINE BELOW;Ll;0;L;007A 0331;;;;N;;;1E94;;1E94 1E96;LATIN SMALL LETTER H WITH LINE BELOW;Ll;0;L;0068 0331;;;;N;;;;; 1E97;LATIN SMALL LETTER T WITH DIAERESIS;Ll;0;L;0074 0308;;;;N;;;;; 1E98;LATIN SMALL LETTER W WITH RING ABOVE;Ll;0;L;0077 030A;;;;N;;;;; 1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;; 1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L;<compat> 0061 02BE;;;;N;;;;; 1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60 1E9C;LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;;; 1E9D;LATIN SMALL LETTER LONG S WITH HIGH STROKE;Ll;0;L;;;;;N;;;;; 1E9E;LATIN CAPITAL LETTER SHARP S;Lu;0;L;;;;;N;;;;00DF; 1E9F;LATIN SMALL LETTER DELTA;Ll;0;L;;;;;N;;;;; 1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1; 1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0 1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3; 1EA3;LATIN SMALL LETTER A WITH HOOK ABOVE;Ll;0;L;0061 0309;;;;N;;;1EA2;;1EA2 1EA4;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00C2 0301;;;;N;;;;1EA5; 1EA5;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00E2 0301;;;;N;;;1EA4;;1EA4 1EA6;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00C2 0300;;;;N;;;;1EA7; 1EA7;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00E2 0300;;;;N;;;1EA6;;1EA6 1EA8;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00C2 0309;;;;N;;;;1EA9; 1EA9;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00E2 0309;;;;N;;;1EA8;;1EA8 1EAA;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE;Lu;0;L;00C2 0303;;;;N;;;;1EAB; 1EAB;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE;Ll;0;L;00E2 0303;;;;N;;;1EAA;;1EAA 1EAC;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EA0 0302;;;;N;;;;1EAD; 1EAD;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EA1 0302;;;;N;;;1EAC;;1EAC 1EAE;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE;Lu;0;L;0102 0301;;;;N;;;;1EAF; 1EAF;LATIN SMALL LETTER A WITH BREVE AND ACUTE;Ll;0;L;0103 0301;;;;N;;;1EAE;;1EAE 1EB0;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE;Lu;0;L;0102 0300;;;;N;;;;1EB1; 1EB1;LATIN SMALL LETTER A WITH BREVE AND GRAVE;Ll;0;L;0103 0300;;;;N;;;1EB0;;1EB0 1EB2;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE;Lu;0;L;0102 0309;;;;N;;;;1EB3; 1EB3;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE;Ll;0;L;0103 0309;;;;N;;;1EB2;;1EB2 1EB4;LATIN CAPITAL LETTER A WITH BREVE AND TILDE;Lu;0;L;0102 0303;;;;N;;;;1EB5; 1EB5;LATIN SMALL LETTER A WITH BREVE AND TILDE;Ll;0;L;0103 0303;;;;N;;;1EB4;;1EB4 1EB6;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW;Lu;0;L;1EA0 0306;;;;N;;;;1EB7; 1EB7;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW;Ll;0;L;1EA1 0306;;;;N;;;1EB6;;1EB6 1EB8;LATIN CAPITAL LETTER E WITH DOT BELOW;Lu;0;L;0045 0323;;;;N;;;;1EB9; 1EB9;LATIN SMALL LETTER E WITH DOT BELOW;Ll;0;L;0065 0323;;;;N;;;1EB8;;1EB8 1EBA;LATIN CAPITAL LETTER E WITH HOOK ABOVE;Lu;0;L;0045 0309;;;;N;;;;1EBB; 1EBB;LATIN SMALL LETTER E WITH HOOK ABOVE;Ll;0;L;0065 0309;;;;N;;;1EBA;;1EBA 1EBC;LATIN CAPITAL LETTER E WITH TILDE;Lu;0;L;0045 0303;;;;N;;;;1EBD; 1EBD;LATIN SMALL LETTER E WITH TILDE;Ll;0;L;0065 0303;;;;N;;;1EBC;;1EBC 1EBE;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00CA 0301;;;;N;;;;1EBF; 1EBF;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00EA 0301;;;;N;;;1EBE;;1EBE 1EC0;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00CA 0300;;;;N;;;;1EC1; 1EC1;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00EA 0300;;;;N;;;1EC0;;1EC0 1EC2;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00CA 0309;;;;N;;;;1EC3; 1EC3;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00EA 0309;;;;N;;;1EC2;;1EC2 1EC4;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE;Lu;0;L;00CA 0303;;;;N;;;;1EC5; 1EC5;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE;Ll;0;L;00EA 0303;;;;N;;;1EC4;;1EC4 1EC6;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EB8 0302;;;;N;;;;1EC7; 1EC7;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EB9 0302;;;;N;;;1EC6;;1EC6 1EC8;LATIN CAPITAL LETTER I WITH HOOK ABOVE;Lu;0;L;0049 0309;;;;N;;;;1EC9; 1EC9;LATIN SMALL LETTER I WITH HOOK ABOVE;Ll;0;L;0069 0309;;;;N;;;1EC8;;1EC8 1ECA;LATIN CAPITAL LETTER I WITH DOT BELOW;Lu;0;L;0049 0323;;;;N;;;;1ECB; 1ECB;LATIN SMALL LETTER I WITH DOT BELOW;Ll;0;L;0069 0323;;;;N;;;1ECA;;1ECA 1ECC;LATIN CAPITAL LETTER O WITH DOT BELOW;Lu;0;L;004F 0323;;;;N;;;;1ECD; 1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC 1ECE;LATIN CAPITAL LETTER O WITH HOOK ABOVE;Lu;0;L;004F 0309;;;;N;;;;1ECF; 1ECF;LATIN SMALL LETTER O WITH HOOK ABOVE;Ll;0;L;006F 0309;;;;N;;;1ECE;;1ECE 1ED0;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00D4 0301;;;;N;;;;1ED1; 1ED1;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00F4 0301;;;;N;;;1ED0;;1ED0 1ED2;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00D4 0300;;;;N;;;;1ED3; 1ED3;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00F4 0300;;;;N;;;1ED2;;1ED2 1ED4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00D4 0309;;;;N;;;;1ED5; 1ED5;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00F4 0309;;;;N;;;1ED4;;1ED4 1ED6;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE;Lu;0;L;00D4 0303;;;;N;;;;1ED7; 1ED7;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE;Ll;0;L;00F4 0303;;;;N;;;1ED6;;1ED6 1ED8;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1ECC 0302;;;;N;;;;1ED9; 1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8 1EDA;LATIN CAPITAL LETTER O WITH HORN AND ACUTE;Lu;0;L;01A0 0301;;;;N;;;;1EDB; 1EDB;LATIN SMALL LETTER O WITH HORN AND ACUTE;Ll;0;L;01A1 0301;;;;N;;;1EDA;;1EDA 1EDC;LATIN CAPITAL LETTER O WITH HORN AND GRAVE;Lu;0;L;01A0 0300;;;;N;;;;1EDD; 1EDD;LATIN SMALL LETTER O WITH HORN AND GRAVE;Ll;0;L;01A1 0300;;;;N;;;1EDC;;1EDC 1EDE;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE;Lu;0;L;01A0 0309;;;;N;;;;1EDF; 1EDF;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE;Ll;0;L;01A1 0309;;;;N;;;1EDE;;1EDE 1EE0;LATIN CAPITAL LETTER O WITH HORN AND TILDE;Lu;0;L;01A0 0303;;;;N;;;;1EE1; 1EE1;LATIN SMALL LETTER O WITH HORN AND TILDE;Ll;0;L;01A1 0303;;;;N;;;1EE0;;1EE0 1EE2;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW;Lu;0;L;01A0 0323;;;;N;;;;1EE3; 1EE3;LATIN SMALL LETTER O WITH HORN AND DOT BELOW;Ll;0;L;01A1 0323;;;;N;;;1EE2;;1EE2 1EE4;LATIN CAPITAL LETTER U WITH DOT BELOW;Lu;0;L;0055 0323;;;;N;;;;1EE5; 1EE5;LATIN SMALL LETTER U WITH DOT BELOW;Ll;0;L;0075 0323;;;;N;;;1EE4;;1EE4 1EE6;LATIN CAPITAL LETTER U WITH HOOK ABOVE;Lu;0;L;0055 0309;;;;N;;;;1EE7; 1EE7;LATIN SMALL LETTER U WITH HOOK ABOVE;Ll;0;L;0075 0309;;;;N;;;1EE6;;1EE6 1EE8;LATIN CAPITAL LETTER U WITH HORN AND ACUTE;Lu;0;L;01AF 0301;;;;N;;;;1EE9; 1EE9;LATIN SMALL LETTER U WITH HORN AND ACUTE;Ll;0;L;01B0 0301;;;;N;;;1EE8;;1EE8 1EEA;LATIN CAPITAL LETTER U WITH HORN AND GRAVE;Lu;0;L;01AF 0300;;;;N;;;;1EEB; 1EEB;LATIN SMALL LETTER U WITH HORN AND GRAVE;Ll;0;L;01B0 0300;;;;N;;;1EEA;;1EEA 1EEC;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE;Lu;0;L;01AF 0309;;;;N;;;;1EED; 1EED;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE;Ll;0;L;01B0 0309;;;;N;;;1EEC;;1EEC 1EEE;LATIN CAPITAL LETTER U WITH HORN AND TILDE;Lu;0;L;01AF 0303;;;;N;;;;1EEF; 1EEF;LATIN SMALL LETTER U WITH HORN AND TILDE;Ll;0;L;01B0 0303;;;;N;;;1EEE;;1EEE 1EF0;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW;Lu;0;L;01AF 0323;;;;N;;;;1EF1; 1EF1;LATIN SMALL LETTER U WITH HORN AND DOT BELOW;Ll;0;L;01B0 0323;;;;N;;;1EF0;;1EF0 1EF2;LATIN CAPITAL LETTER Y WITH GRAVE;Lu;0;L;0059 0300;;;;N;;;;1EF3; 1EF3;LATIN SMALL LETTER Y WITH GRAVE;Ll;0;L;0079 0300;;;;N;;;1EF2;;1EF2 1EF4;LATIN CAPITAL LETTER Y WITH DOT BELOW;Lu;0;L;0059 0323;;;;N;;;;1EF5; 1EF5;LATIN SMALL LETTER Y WITH DOT BELOW;Ll;0;L;0079 0323;;;;N;;;1EF4;;1EF4 1EF6;LATIN CAPITAL LETTER Y WITH HOOK ABOVE;Lu;0;L;0059 0309;;;;N;;;;1EF7; 1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6 1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9; 1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8 1EFA;LATIN CAPITAL LETTER MIDDLE-WELSH LL;Lu;0;L;;;;;N;;;;1EFB; 1EFB;LATIN SMALL LETTER MIDDLE-WELSH LL;Ll;0;L;;;;;N;;;1EFA;;1EFA 1EFC;LATIN CAPITAL LETTER MIDDLE-WELSH V;Lu;0;L;;;;;N;;;;1EFD; 1EFD;LATIN SMALL LETTER MIDDLE-WELSH V;Ll;0;L;;;;;N;;;1EFC;;1EFC 1EFE;LATIN CAPITAL LETTER Y WITH LOOP;Lu;0;L;;;;;N;;;;1EFF; 1EFF;LATIN SMALL LETTER Y WITH LOOP;Ll;0;L;;;;;N;;;1EFE;;1EFE 1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08 1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09 1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A 1F03;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA;Ll;0;L;1F01 0300;;;;N;;;1F0B;;1F0B 1F04;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA;Ll;0;L;1F00 0301;;;;N;;;1F0C;;1F0C 1F05;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA;Ll;0;L;1F01 0301;;;;N;;;1F0D;;1F0D 1F06;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI;Ll;0;L;1F00 0342;;;;N;;;1F0E;;1F0E 1F07;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI;Ll;0;L;1F01 0342;;;;N;;;1F0F;;1F0F 1F08;GREEK CAPITAL LETTER ALPHA WITH PSILI;Lu;0;L;0391 0313;;;;N;;;;1F00; 1F09;GREEK CAPITAL LETTER ALPHA WITH DASIA;Lu;0;L;0391 0314;;;;N;;;;1F01; 1F0A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA;Lu;0;L;1F08 0300;;;;N;;;;1F02; 1F0B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA;Lu;0;L;1F09 0300;;;;N;;;;1F03; 1F0C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA;Lu;0;L;1F08 0301;;;;N;;;;1F04; 1F0D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA;Lu;0;L;1F09 0301;;;;N;;;;1F05; 1F0E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI;Lu;0;L;1F08 0342;;;;N;;;;1F06; 1F0F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI;Lu;0;L;1F09 0342;;;;N;;;;1F07; 1F10;GREEK SMALL LETTER EPSILON WITH PSILI;Ll;0;L;03B5 0313;;;;N;;;1F18;;1F18 1F11;GREEK SMALL LETTER EPSILON WITH DASIA;Ll;0;L;03B5 0314;;;;N;;;1F19;;1F19 1F12;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA;Ll;0;L;1F10 0300;;;;N;;;1F1A;;1F1A 1F13;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA;Ll;0;L;1F11 0300;;;;N;;;1F1B;;1F1B 1F14;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA;Ll;0;L;1F10 0301;;;;N;;;1F1C;;1F1C 1F15;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA;Ll;0;L;1F11 0301;;;;N;;;1F1D;;1F1D 1F18;GREEK CAPITAL LETTER EPSILON WITH PSILI;Lu;0;L;0395 0313;;;;N;;;;1F10; 1F19;GREEK CAPITAL LETTER EPSILON WITH DASIA;Lu;0;L;0395 0314;;;;N;;;;1F11; 1F1A;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA;Lu;0;L;1F18 0300;;;;N;;;;1F12; 1F1B;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA;Lu;0;L;1F19 0300;;;;N;;;;1F13; 1F1C;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA;Lu;0;L;1F18 0301;;;;N;;;;1F14; 1F1D;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA;Lu;0;L;1F19 0301;;;;N;;;;1F15; 1F20;GREEK SMALL LETTER ETA WITH PSILI;Ll;0;L;03B7 0313;;;;N;;;1F28;;1F28 1F21;GREEK SMALL LETTER ETA WITH DASIA;Ll;0;L;03B7 0314;;;;N;;;1F29;;1F29 1F22;GREEK SMALL LETTER ETA WITH PSILI AND VARIA;Ll;0;L;1F20 0300;;;;N;;;1F2A;;1F2A 1F23;GREEK SMALL LETTER ETA WITH DASIA AND VARIA;Ll;0;L;1F21 0300;;;;N;;;1F2B;;1F2B 1F24;GREEK SMALL LETTER ETA WITH PSILI AND OXIA;Ll;0;L;1F20 0301;;;;N;;;1F2C;;1F2C 1F25;GREEK SMALL LETTER ETA WITH DASIA AND OXIA;Ll;0;L;1F21 0301;;;;N;;;1F2D;;1F2D 1F26;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI;Ll;0;L;1F20 0342;;;;N;;;1F2E;;1F2E 1F27;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI;Ll;0;L;1F21 0342;;;;N;;;1F2F;;1F2F 1F28;GREEK CAPITAL LETTER ETA WITH PSILI;Lu;0;L;0397 0313;;;;N;;;;1F20; 1F29;GREEK CAPITAL LETTER ETA WITH DASIA;Lu;0;L;0397 0314;;;;N;;;;1F21; 1F2A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA;Lu;0;L;1F28 0300;;;;N;;;;1F22; 1F2B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA;Lu;0;L;1F29 0300;;;;N;;;;1F23; 1F2C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA;Lu;0;L;1F28 0301;;;;N;;;;1F24; 1F2D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA;Lu;0;L;1F29 0301;;;;N;;;;1F25; 1F2E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI;Lu;0;L;1F28 0342;;;;N;;;;1F26; 1F2F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI;Lu;0;L;1F29 0342;;;;N;;;;1F27; 1F30;GREEK SMALL LETTER IOTA WITH PSILI;Ll;0;L;03B9 0313;;;;N;;;1F38;;1F38 1F31;GREEK SMALL LETTER IOTA WITH DASIA;Ll;0;L;03B9 0314;;;;N;;;1F39;;1F39 1F32;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA;Ll;0;L;1F30 0300;;;;N;;;1F3A;;1F3A 1F33;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA;Ll;0;L;1F31 0300;;;;N;;;1F3B;;1F3B 1F34;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA;Ll;0;L;1F30 0301;;;;N;;;1F3C;;1F3C 1F35;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA;Ll;0;L;1F31 0301;;;;N;;;1F3D;;1F3D 1F36;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI;Ll;0;L;1F30 0342;;;;N;;;1F3E;;1F3E 1F37;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI;Ll;0;L;1F31 0342;;;;N;;;1F3F;;1F3F 1F38;GREEK CAPITAL LETTER IOTA WITH PSILI;Lu;0;L;0399 0313;;;;N;;;;1F30; 1F39;GREEK CAPITAL LETTER IOTA WITH DASIA;Lu;0;L;0399 0314;;;;N;;;;1F31; 1F3A;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA;Lu;0;L;1F38 0300;;;;N;;;;1F32; 1F3B;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA;Lu;0;L;1F39 0300;;;;N;;;;1F33; 1F3C;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA;Lu;0;L;1F38 0301;;;;N;;;;1F34; 1F3D;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA;Lu;0;L;1F39 0301;;;;N;;;;1F35; 1F3E;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI;Lu;0;L;1F38 0342;;;;N;;;;1F36; 1F3F;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI;Lu;0;L;1F39 0342;;;;N;;;;1F37; 1F40;GREEK SMALL LETTER OMICRON WITH PSILI;Ll;0;L;03BF 0313;;;;N;;;1F48;;1F48 1F41;GREEK SMALL LETTER OMICRON WITH DASIA;Ll;0;L;03BF 0314;;;;N;;;1F49;;1F49 1F42;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA;Ll;0;L;1F40 0300;;;;N;;;1F4A;;1F4A 1F43;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA;Ll;0;L;1F41 0300;;;;N;;;1F4B;;1F4B 1F44;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA;Ll;0;L;1F40 0301;;;;N;;;1F4C;;1F4C 1F45;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA;Ll;0;L;1F41 0301;;;;N;;;1F4D;;1F4D 1F48;GREEK CAPITAL LETTER OMICRON WITH PSILI;Lu;0;L;039F 0313;;;;N;;;;1F40; 1F49;GREEK CAPITAL LETTER OMICRON WITH DASIA;Lu;0;L;039F 0314;;;;N;;;;1F41; 1F4A;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA;Lu;0;L;1F48 0300;;;;N;;;;1F42; 1F4B;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA;Lu;0;L;1F49 0300;;;;N;;;;1F43; 1F4C;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA;Lu;0;L;1F48 0301;;;;N;;;;1F44; 1F4D;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA;Lu;0;L;1F49 0301;;;;N;;;;1F45; 1F50;GREEK SMALL LETTER UPSILON WITH PSILI;Ll;0;L;03C5 0313;;;;N;;;;; 1F51;GREEK SMALL LETTER UPSILON WITH DASIA;Ll;0;L;03C5 0314;;;;N;;;1F59;;1F59 1F52;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA;Ll;0;L;1F50 0300;;;;N;;;;; 1F53;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA;Ll;0;L;1F51 0300;;;;N;;;1F5B;;1F5B 1F54;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA;Ll;0;L;1F50 0301;;;;N;;;;; 1F55;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA;Ll;0;L;1F51 0301;;;;N;;;1F5D;;1F5D 1F56;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI;Ll;0;L;1F50 0342;;;;N;;;;; 1F57;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI;Ll;0;L;1F51 0342;;;;N;;;1F5F;;1F5F 1F59;GREEK CAPITAL LETTER UPSILON WITH DASIA;Lu;0;L;03A5 0314;;;;N;;;;1F51; 1F5B;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA;Lu;0;L;1F59 0300;;;;N;;;;1F53; 1F5D;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA;Lu;0;L;1F59 0301;;;;N;;;;1F55; 1F5F;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI;Lu;0;L;1F59 0342;;;;N;;;;1F57; 1F60;GREEK SMALL LETTER OMEGA WITH PSILI;Ll;0;L;03C9 0313;;;;N;;;1F68;;1F68 1F61;GREEK SMALL LETTER OMEGA WITH DASIA;Ll;0;L;03C9 0314;;;;N;;;1F69;;1F69 1F62;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA;Ll;0;L;1F60 0300;;;;N;;;1F6A;;1F6A 1F63;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA;Ll;0;L;1F61 0300;;;;N;;;1F6B;;1F6B 1F64;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA;Ll;0;L;1F60 0301;;;;N;;;1F6C;;1F6C 1F65;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA;Ll;0;L;1F61 0301;;;;N;;;1F6D;;1F6D 1F66;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI;Ll;0;L;1F60 0342;;;;N;;;1F6E;;1F6E 1F67;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI;Ll;0;L;1F61 0342;;;;N;;;1F6F;;1F6F 1F68;GREEK CAPITAL LETTER OMEGA WITH PSILI;Lu;0;L;03A9 0313;;;;N;;;;1F60; 1F69;GREEK CAPITAL LETTER OMEGA WITH DASIA;Lu;0;L;03A9 0314;;;;N;;;;1F61; 1F6A;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA;Lu;0;L;1F68 0300;;;;N;;;;1F62; 1F6B;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA;Lu;0;L;1F69 0300;;;;N;;;;1F63; 1F6C;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA;Lu;0;L;1F68 0301;;;;N;;;;1F64; 1F6D;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA;Lu;0;L;1F69 0301;;;;N;;;;1F65; 1F6E;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI;Lu;0;L;1F68 0342;;;;N;;;;1F66; 1F6F;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI;Lu;0;L;1F69 0342;;;;N;;;;1F67; 1F70;GREEK SMALL LETTER ALPHA WITH VARIA;Ll;0;L;03B1 0300;;;;N;;;1FBA;;1FBA 1F71;GREEK SMALL LETTER ALPHA WITH OXIA;Ll;0;L;03AC;;;;N;;;1FBB;;1FBB 1F72;GREEK SMALL LETTER EPSILON WITH VARIA;Ll;0;L;03B5 0300;;;;N;;;1FC8;;1FC8 1F73;GREEK SMALL LETTER EPSILON WITH OXIA;Ll;0;L;03AD;;;;N;;;1FC9;;1FC9 1F74;GREEK SMALL LETTER ETA WITH VARIA;Ll;0;L;03B7 0300;;;;N;;;1FCA;;1FCA 1F75;GREEK SMALL LETTER ETA WITH OXIA;Ll;0;L;03AE;;;;N;;;1FCB;;1FCB 1F76;GREEK SMALL LETTER IOTA WITH VARIA;Ll;0;L;03B9 0300;;;;N;;;1FDA;;1FDA 1F77;GREEK SMALL LETTER IOTA WITH OXIA;Ll;0;L;03AF;;;;N;;;1FDB;;1FDB 1F78;GREEK SMALL LETTER OMICRON WITH VARIA;Ll;0;L;03BF 0300;;;;N;;;1FF8;;1FF8 1F79;GREEK SMALL LETTER OMICRON WITH OXIA;Ll;0;L;03CC;;;;N;;;1FF9;;1FF9 1F7A;GREEK SMALL LETTER UPSILON WITH VARIA;Ll;0;L;03C5 0300;;;;N;;;1FEA;;1FEA 1F7B;GREEK SMALL LETTER UPSILON WITH OXIA;Ll;0;L;03CD;;;;N;;;1FEB;;1FEB 1F7C;GREEK SMALL LETTER OMEGA WITH VARIA;Ll;0;L;03C9 0300;;;;N;;;1FFA;;1FFA 1F7D;GREEK SMALL LETTER OMEGA WITH OXIA;Ll;0;L;03CE;;;;N;;;1FFB;;1FFB 1F80;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F00 0345;;;;N;;;1F88;;1F88 1F81;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F01 0345;;;;N;;;1F89;;1F89 1F82;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F02 0345;;;;N;;;1F8A;;1F8A 1F83;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F03 0345;;;;N;;;1F8B;;1F8B 1F84;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F04 0345;;;;N;;;1F8C;;1F8C 1F85;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F05 0345;;;;N;;;1F8D;;1F8D 1F86;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F06 0345;;;;N;;;1F8E;;1F8E 1F87;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F07 0345;;;;N;;;1F8F;;1F8F 1F88;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F08 0345;;;;N;;;;1F80; 1F89;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F09 0345;;;;N;;;;1F81; 1F8A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0A 0345;;;;N;;;;1F82; 1F8B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0B 0345;;;;N;;;;1F83; 1F8C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0C 0345;;;;N;;;;1F84; 1F8D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0D 0345;;;;N;;;;1F85; 1F8E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0E 0345;;;;N;;;;1F86; 1F8F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0F 0345;;;;N;;;;1F87; 1F90;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F20 0345;;;;N;;;1F98;;1F98 1F91;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F21 0345;;;;N;;;1F99;;1F99 1F92;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F22 0345;;;;N;;;1F9A;;1F9A 1F93;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F23 0345;;;;N;;;1F9B;;1F9B 1F94;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F24 0345;;;;N;;;1F9C;;1F9C 1F95;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F25 0345;;;;N;;;1F9D;;1F9D 1F96;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F26 0345;;;;N;;;1F9E;;1F9E 1F97;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F27 0345;;;;N;;;1F9F;;1F9F 1F98;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F28 0345;;;;N;;;;1F90; 1F99;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F29 0345;;;;N;;;;1F91; 1F9A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2A 0345;;;;N;;;;1F92; 1F9B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2B 0345;;;;N;;;;1F93; 1F9C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2C 0345;;;;N;;;;1F94; 1F9D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2D 0345;;;;N;;;;1F95; 1F9E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2E 0345;;;;N;;;;1F96; 1F9F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2F 0345;;;;N;;;;1F97; 1FA0;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F60 0345;;;;N;;;1FA8;;1FA8 1FA1;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F61 0345;;;;N;;;1FA9;;1FA9 1FA2;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F62 0345;;;;N;;;1FAA;;1FAA 1FA3;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F63 0345;;;;N;;;1FAB;;1FAB 1FA4;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F64 0345;;;;N;;;1FAC;;1FAC 1FA5;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F65 0345;;;;N;;;1FAD;;1FAD 1FA6;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F66 0345;;;;N;;;1FAE;;1FAE 1FA7;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F67 0345;;;;N;;;1FAF;;1FAF 1FA8;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F68 0345;;;;N;;;;1FA0; 1FA9;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F69 0345;;;;N;;;;1FA1; 1FAA;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6A 0345;;;;N;;;;1FA2; 1FAB;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6B 0345;;;;N;;;;1FA3; 1FAC;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6C 0345;;;;N;;;;1FA4; 1FAD;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6D 0345;;;;N;;;;1FA5; 1FAE;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6E 0345;;;;N;;;;1FA6; 1FAF;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6F 0345;;;;N;;;;1FA7; 1FB0;GREEK SMALL LETTER ALPHA WITH VRACHY;Ll;0;L;03B1 0306;;;;N;;;1FB8;;1FB8 1FB1;GREEK SMALL LETTER ALPHA WITH MACRON;Ll;0;L;03B1 0304;;;;N;;;1FB9;;1FB9 1FB2;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F70 0345;;;;N;;;;; 1FB3;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI;Ll;0;L;03B1 0345;;;;N;;;1FBC;;1FBC 1FB4;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AC 0345;;;;N;;;;; 1FB6;GREEK SMALL LETTER ALPHA WITH PERISPOMENI;Ll;0;L;03B1 0342;;;;N;;;;; 1FB7;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FB6 0345;;;;N;;;;; 1FB8;GREEK CAPITAL LETTER ALPHA WITH VRACHY;Lu;0;L;0391 0306;;;;N;;;;1FB0; 1FB9;GREEK CAPITAL LETTER ALPHA WITH MACRON;Lu;0;L;0391 0304;;;;N;;;;1FB1; 1FBA;GREEK CAPITAL LETTER ALPHA WITH VARIA;Lu;0;L;0391 0300;;;;N;;;;1F70; 1FBB;GREEK CAPITAL LETTER ALPHA WITH OXIA;Lu;0;L;0386;;;;N;;;;1F71; 1FBC;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI;Lt;0;L;0391 0345;;;;N;;;;1FB3; 1FBD;GREEK KORONIS;Sk;0;ON;<compat> 0020 0313;;;;N;;;;; 1FBE;GREEK PROSGEGRAMMENI;Ll;0;L;03B9;;;;N;;;0399;;0399 1FBF;GREEK PSILI;Sk;0;ON;<compat> 0020 0313;;;;N;;;;; 1FC0;GREEK PERISPOMENI;Sk;0;ON;<compat> 0020 0342;;;;N;;;;; 1FC1;GREEK DIALYTIKA AND PERISPOMENI;Sk;0;ON;00A8 0342;;;;N;;;;; 1FC2;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F74 0345;;;;N;;;;; 1FC3;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI;Ll;0;L;03B7 0345;;;;N;;;1FCC;;1FCC 1FC4;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AE 0345;;;;N;;;;; 1FC6;GREEK SMALL LETTER ETA WITH PERISPOMENI;Ll;0;L;03B7 0342;;;;N;;;;; 1FC7;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FC6 0345;;;;N;;;;; 1FC8;GREEK CAPITAL LETTER EPSILON WITH VARIA;Lu;0;L;0395 0300;;;;N;;;;1F72; 1FC9;GREEK CAPITAL LETTER EPSILON WITH OXIA;Lu;0;L;0388;;;;N;;;;1F73; 1FCA;GREEK CAPITAL LETTER ETA WITH VARIA;Lu;0;L;0397 0300;;;;N;;;;1F74; 1FCB;GREEK CAPITAL LETTER ETA WITH OXIA;Lu;0;L;0389;;;;N;;;;1F75; 1FCC;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI;Lt;0;L;0397 0345;;;;N;;;;1FC3; 1FCD;GREEK PSILI AND VARIA;Sk;0;ON;1FBF 0300;;;;N;;;;; 1FCE;GREEK PSILI AND OXIA;Sk;0;ON;1FBF 0301;;;;N;;;;; 1FCF;GREEK PSILI AND PERISPOMENI;Sk;0;ON;1FBF 0342;;;;N;;;;; 1FD0;GREEK SMALL LETTER IOTA WITH VRACHY;Ll;0;L;03B9 0306;;;;N;;;1FD8;;1FD8 1FD1;GREEK SMALL LETTER IOTA WITH MACRON;Ll;0;L;03B9 0304;;;;N;;;1FD9;;1FD9 1FD2;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA;Ll;0;L;03CA 0300;;;;N;;;;; 1FD3;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA;Ll;0;L;0390;;;;N;;;;; 1FD6;GREEK SMALL LETTER IOTA WITH PERISPOMENI;Ll;0;L;03B9 0342;;;;N;;;;; 1FD7;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CA 0342;;;;N;;;;; 1FD8;GREEK CAPITAL LETTER IOTA WITH VRACHY;Lu;0;L;0399 0306;;;;N;;;;1FD0; 1FD9;GREEK CAPITAL LETTER IOTA WITH MACRON;Lu;0;L;0399 0304;;;;N;;;;1FD1; 1FDA;GREEK CAPITAL LETTER IOTA WITH VARIA;Lu;0;L;0399 0300;;;;N;;;;1F76; 1FDB;GREEK CAPITAL LETTER IOTA WITH OXIA;Lu;0;L;038A;;;;N;;;;1F77; 1FDD;GREEK DASIA AND VARIA;Sk;0;ON;1FFE 0300;;;;N;;;;; 1FDE;GREEK DASIA AND OXIA;Sk;0;ON;1FFE 0301;;;;N;;;;; 1FDF;GREEK DASIA AND PERISPOMENI;Sk;0;ON;1FFE 0342;;;;N;;;;; 1FE0;GREEK SMALL LETTER UPSILON WITH VRACHY;Ll;0;L;03C5 0306;;;;N;;;1FE8;;1FE8 1FE1;GREEK SMALL LETTER UPSILON WITH MACRON;Ll;0;L;03C5 0304;;;;N;;;1FE9;;1FE9 1FE2;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA;Ll;0;L;03CB 0300;;;;N;;;;; 1FE3;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA;Ll;0;L;03B0;;;;N;;;;; 1FE4;GREEK SMALL LETTER RHO WITH PSILI;Ll;0;L;03C1 0313;;;;N;;;;; 1FE5;GREEK SMALL LETTER RHO WITH DASIA;Ll;0;L;03C1 0314;;;;N;;;1FEC;;1FEC 1FE6;GREEK SMALL LETTER UPSILON WITH PERISPOMENI;Ll;0;L;03C5 0342;;;;N;;;;; 1FE7;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CB 0342;;;;N;;;;; 1FE8;GREEK CAPITAL LETTER UPSILON WITH VRACHY;Lu;0;L;03A5 0306;;;;N;;;;1FE0; 1FE9;GREEK CAPITAL LETTER UPSILON WITH MACRON;Lu;0;L;03A5 0304;;;;N;;;;1FE1; 1FEA;GREEK CAPITAL LETTER UPSILON WITH VARIA;Lu;0;L;03A5 0300;;;;N;;;;1F7A; 1FEB;GREEK CAPITAL LETTER UPSILON WITH OXIA;Lu;0;L;038E;;;;N;;;;1F7B; 1FEC;GREEK CAPITAL LETTER RHO WITH DASIA;Lu;0;L;03A1 0314;;;;N;;;;1FE5; 1FED;GREEK DIALYTIKA AND VARIA;Sk;0;ON;00A8 0300;;;;N;;;;; 1FEE;GREEK DIALYTIKA AND OXIA;Sk;0;ON;0385;;;;N;;;;; 1FEF;GREEK VARIA;Sk;0;ON;0060;;;;N;;;;; 1FF2;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F7C 0345;;;;N;;;;; 1FF3;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI;Ll;0;L;03C9 0345;;;;N;;;1FFC;;1FFC 1FF4;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03CE 0345;;;;N;;;;; 1FF6;GREEK SMALL LETTER OMEGA WITH PERISPOMENI;Ll;0;L;03C9 0342;;;;N;;;;; 1FF7;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FF6 0345;;;;N;;;;; 1FF8;GREEK CAPITAL LETTER OMICRON WITH VARIA;Lu;0;L;039F 0300;;;;N;;;;1F78; 1FF9;GREEK CAPITAL LETTER OMICRON WITH OXIA;Lu;0;L;038C;;;;N;;;;1F79; 1FFA;GREEK CAPITAL LETTER OMEGA WITH VARIA;Lu;0;L;03A9 0300;;;;N;;;;1F7C; 1FFB;GREEK CAPITAL LETTER OMEGA WITH OXIA;Lu;0;L;038F;;;;N;;;;1F7D; 1FFC;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI;Lt;0;L;03A9 0345;;;;N;;;;1FF3; 1FFD;GREEK OXIA;Sk;0;ON;00B4;;;;N;;;;; 1FFE;GREEK DASIA;Sk;0;ON;<compat> 0020 0314;;;;N;;;;; 2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;; 2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;; 2002;EN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; 2003;EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; 2004;THREE-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; 2005;FOUR-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; 2006;SIX-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; 2007;FIGURE SPACE;Zs;0;WS;<noBreak> 0020;;;;N;;;;; 2008;PUNCTUATION SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; 2009;THIN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; 200A;HAIR SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; 200B;ZERO WIDTH SPACE;Cf;0;BN;;;;;N;;;;; 200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;; 200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;; 200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;; 200F;RIGHT-TO-LEFT MARK;Cf;0;R;;;;;N;;;;; 2010;HYPHEN;Pd;0;ON;;;;;N;;;;; 2011;NON-BREAKING HYPHEN;Pd;0;ON;<noBreak> 2010;;;;N;;;;; 2012;FIGURE DASH;Pd;0;ON;;;;;N;;;;; 2013;EN DASH;Pd;0;ON;;;;;N;;;;; 2014;EM DASH;Pd;0;ON;;;;;N;;;;; 2015;HORIZONTAL BAR;Pd;0;ON;;;;;N;QUOTATION DASH;;;; 2016;DOUBLE VERTICAL LINE;Po;0;ON;;;;;N;DOUBLE VERTICAL BAR;;;; 2017;DOUBLE LOW LINE;Po;0;ON;<compat> 0020 0333;;;;N;SPACING DOUBLE UNDERSCORE;;;; 2018;LEFT SINGLE QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE TURNED COMMA QUOTATION MARK;;;; 2019;RIGHT SINGLE QUOTATION MARK;Pf;0;ON;;;;;N;SINGLE COMMA QUOTATION MARK;;;; 201A;SINGLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW SINGLE COMMA QUOTATION MARK;;;; 201B;SINGLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE REVERSED COMMA QUOTATION MARK;;;; 201C;LEFT DOUBLE QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE TURNED COMMA QUOTATION MARK;;;; 201D;RIGHT DOUBLE QUOTATION MARK;Pf;0;ON;;;;;N;DOUBLE COMMA QUOTATION MARK;;;; 201E;DOUBLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW DOUBLE COMMA QUOTATION MARK;;;; 201F;DOUBLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE REVERSED COMMA QUOTATION MARK;;;; 2020;DAGGER;Po;0;ON;;;;;N;;;;; 2021;DOUBLE DAGGER;Po;0;ON;;;;;N;;;;; 2022;BULLET;Po;0;ON;;;;;N;;;;; 2023;TRIANGULAR BULLET;Po;0;ON;;;;;N;;;;; 2024;ONE DOT LEADER;Po;0;ON;<compat> 002E;;;;N;;;;; 2025;TWO DOT LEADER;Po;0;ON;<compat> 002E 002E;;;;N;;;;; 2026;HORIZONTAL ELLIPSIS;Po;0;ON;<compat> 002E 002E 002E;;;;N;;;;; 2027;HYPHENATION POINT;Po;0;ON;;;;;N;;;;; 2028;LINE SEPARATOR;Zl;0;WS;;;;;N;;;;; 2029;PARAGRAPH SEPARATOR;Zp;0;B;;;;;N;;;;; 202A;LEFT-TO-RIGHT EMBEDDING;Cf;0;LRE;;;;;N;;;;; 202B;RIGHT-TO-LEFT EMBEDDING;Cf;0;RLE;;;;;N;;;;; 202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;; 202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;; 202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;; 202F;NARROW NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;;;;; 2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;; 2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; 2032;PRIME;Po;0;ET;;;;;N;;;;; 2033;DOUBLE PRIME;Po;0;ET;<compat> 2032 2032;;;;N;;;;; 2034;TRIPLE PRIME;Po;0;ET;<compat> 2032 2032 2032;;;;N;;;;; 2035;REVERSED PRIME;Po;0;ON;;;;;N;;;;; 2036;REVERSED DOUBLE PRIME;Po;0;ON;<compat> 2035 2035;;;;N;;;;; 2037;REVERSED TRIPLE PRIME;Po;0;ON;<compat> 2035 2035 2035;;;;N;;;;; 2038;CARET;Po;0;ON;;;;;N;;;;; 2039;SINGLE LEFT-POINTING ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING SINGLE GUILLEMET;;;; 203A;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING SINGLE GUILLEMET;;;; 203B;REFERENCE MARK;Po;0;ON;;;;;N;;;;; 203C;DOUBLE EXCLAMATION MARK;Po;0;ON;<compat> 0021 0021;;;;N;;;;; 203D;INTERROBANG;Po;0;ON;;;;;N;;;;; 203E;OVERLINE;Po;0;ON;<compat> 0020 0305;;;;N;SPACING OVERSCORE;;;; 203F;UNDERTIE;Pc;0;ON;;;;;N;;;;; 2040;CHARACTER TIE;Pc;0;ON;;;;;N;;;;; 2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;; 2042;ASTERISM;Po;0;ON;;;;;N;;;;; 2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;; 2044;FRACTION SLASH;Sm;0;CS;;;;;N;;;;; 2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;; 2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;; 2047;DOUBLE QUESTION MARK;Po;0;ON;<compat> 003F 003F;;;;N;;;;; 2048;QUESTION EXCLAMATION MARK;Po;0;ON;<compat> 003F 0021;;;;N;;;;; 2049;EXCLAMATION QUESTION MARK;Po;0;ON;<compat> 0021 003F;;;;N;;;;; 204A;TIRONIAN SIGN ET;Po;0;ON;;;;;N;;;;; 204B;REVERSED PILCROW SIGN;Po;0;ON;;;;;N;;;;; 204C;BLACK LEFTWARDS BULLET;Po;0;ON;;;;;N;;;;; 204D;BLACK RIGHTWARDS BULLET;Po;0;ON;;;;;N;;;;; 204E;LOW ASTERISK;Po;0;ON;;;;;N;;;;; 204F;REVERSED SEMICOLON;Po;0;ON;;;;;N;;;;; 2050;CLOSE UP;Po;0;ON;;;;;N;;;;; 2051;TWO ASTERISKS ALIGNED VERTICALLY;Po;0;ON;;;;;N;;;;; 2052;COMMERCIAL MINUS SIGN;Sm;0;ON;;;;;N;;;;; 2053;SWUNG DASH;Po;0;ON;;;;;N;;;;; 2054;INVERTED UNDERTIE;Pc;0;ON;;;;;N;;;;; 2055;FLOWER PUNCTUATION MARK;Po;0;ON;;;;;N;;;;; 2056;THREE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; 2057;QUADRUPLE PRIME;Po;0;ON;<compat> 2032 2032 2032 2032;;;;N;;;;; 2058;FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; 2059;FIVE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; 205A;TWO DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; 205B;FOUR DOT MARK;Po;0;ON;;;;;N;;;;; 205C;DOTTED CROSS;Po;0;ON;;;;;N;;;;; 205D;TRICOLON;Po;0;ON;;;;;N;;;;; 205E;VERTICAL FOUR DOTS;Po;0;ON;;;;;N;;;;; 205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; 2060;WORD JOINER;Cf;0;BN;;;;;N;;;;; 2061;FUNCTION APPLICATION;Cf;0;BN;;;;;N;;;;; 2062;INVISIBLE TIMES;Cf;0;BN;;;;;N;;;;; 2063;INVISIBLE SEPARATOR;Cf;0;BN;;;;;N;;;;; 2064;INVISIBLE PLUS;Cf;0;BN;;;;;N;;;;; 2066;LEFT-TO-RIGHT ISOLATE;Cf;0;LRI;;;;;N;;;;; 2067;RIGHT-TO-LEFT ISOLATE;Cf;0;RLI;;;;;N;;;;; 2068;FIRST STRONG ISOLATE;Cf;0;FSI;;;;;N;;;;; 2069;POP DIRECTIONAL ISOLATE;Cf;0;PDI;;;;;N;;;;; 206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; 206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; 206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; 206D;ACTIVATE ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; 206E;NATIONAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; 206F;NOMINAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; 2070;SUPERSCRIPT ZERO;No;0;EN;<super> 0030;;0;0;N;SUPERSCRIPT DIGIT ZERO;;;; 2071;SUPERSCRIPT LATIN SMALL LETTER I;Lm;0;L;<super> 0069;;;;N;;;;; 2074;SUPERSCRIPT FOUR;No;0;EN;<super> 0034;;4;4;N;SUPERSCRIPT DIGIT FOUR;;;; 2075;SUPERSCRIPT FIVE;No;0;EN;<super> 0035;;5;5;N;SUPERSCRIPT DIGIT FIVE;;;; 2076;SUPERSCRIPT SIX;No;0;EN;<super> 0036;;6;6;N;SUPERSCRIPT DIGIT SIX;;;; 2077;SUPERSCRIPT SEVEN;No;0;EN;<super> 0037;;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;; 2078;SUPERSCRIPT EIGHT;No;0;EN;<super> 0038;;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;; 2079;SUPERSCRIPT NINE;No;0;EN;<super> 0039;;9;9;N;SUPERSCRIPT DIGIT NINE;;;; 207A;SUPERSCRIPT PLUS SIGN;Sm;0;ES;<super> 002B;;;;N;;;;; 207B;SUPERSCRIPT MINUS;Sm;0;ES;<super> 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;; 207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON;<super> 003D;;;;N;;;;; 207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON;<super> 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;; 207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<super> 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;; 207F;SUPERSCRIPT LATIN SMALL LETTER N;Lm;0;L;<super> 006E;;;;N;;;;; 2080;SUBSCRIPT ZERO;No;0;EN;<sub> 0030;;0;0;N;SUBSCRIPT DIGIT ZERO;;;; 2081;SUBSCRIPT ONE;No;0;EN;<sub> 0031;;1;1;N;SUBSCRIPT DIGIT ONE;;;; 2082;SUBSCRIPT TWO;No;0;EN;<sub> 0032;;2;2;N;SUBSCRIPT DIGIT TWO;;;; 2083;SUBSCRIPT THREE;No;0;EN;<sub> 0033;;3;3;N;SUBSCRIPT DIGIT THREE;;;; 2084;SUBSCRIPT FOUR;No;0;EN;<sub> 0034;;4;4;N;SUBSCRIPT DIGIT FOUR;;;; 2085;SUBSCRIPT FIVE;No;0;EN;<sub> 0035;;5;5;N;SUBSCRIPT DIGIT FIVE;;;; 2086;SUBSCRIPT SIX;No;0;EN;<sub> 0036;;6;6;N;SUBSCRIPT DIGIT SIX;;;; 2087;SUBSCRIPT SEVEN;No;0;EN;<sub> 0037;;7;7;N;SUBSCRIPT DIGIT SEVEN;;;; 2088;SUBSCRIPT EIGHT;No;0;EN;<sub> 0038;;8;8;N;SUBSCRIPT DIGIT EIGHT;;;; 2089;SUBSCRIPT NINE;No;0;EN;<sub> 0039;;9;9;N;SUBSCRIPT DIGIT NINE;;;; 208A;SUBSCRIPT PLUS SIGN;Sm;0;ES;<sub> 002B;;;;N;;;;; 208B;SUBSCRIPT MINUS;Sm;0;ES;<sub> 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;; 208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON;<sub> 003D;;;;N;;;;; 208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON;<sub> 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;; 208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<sub> 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;; 2090;LATIN SUBSCRIPT SMALL LETTER A;Lm;0;L;<sub> 0061;;;;N;;;;; 2091;LATIN SUBSCRIPT SMALL LETTER E;Lm;0;L;<sub> 0065;;;;N;;;;; 2092;LATIN SUBSCRIPT SMALL LETTER O;Lm;0;L;<sub> 006F;;;;N;;;;; 2093;LATIN SUBSCRIPT SMALL LETTER X;Lm;0;L;<sub> 0078;;;;N;;;;; 2094;LATIN SUBSCRIPT SMALL LETTER SCHWA;Lm;0;L;<sub> 0259;;;;N;;;;; 2095;LATIN SUBSCRIPT SMALL LETTER H;Lm;0;L;<sub> 0068;;;;N;;;;; 2096;LATIN SUBSCRIPT SMALL LETTER K;Lm;0;L;<sub> 006B;;;;N;;;;; 2097;LATIN SUBSCRIPT SMALL LETTER L;Lm;0;L;<sub> 006C;;;;N;;;;; 2098;LATIN SUBSCRIPT SMALL LETTER M;Lm;0;L;<sub> 006D;;;;N;;;;; 2099;LATIN SUBSCRIPT SMALL LETTER N;Lm;0;L;<sub> 006E;;;;N;;;;; 209A;LATIN SUBSCRIPT SMALL LETTER P;Lm;0;L;<sub> 0070;;;;N;;;;; 209B;LATIN SUBSCRIPT SMALL LETTER S;Lm;0;L;<sub> 0073;;;;N;;;;; 209C;LATIN SUBSCRIPT SMALL LETTER T;Lm;0;L;<sub> 0074;;;;N;;;;; 20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; 20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;; 20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;; 20A3;FRENCH FRANC SIGN;Sc;0;ET;;;;;N;;;;; 20A4;LIRA SIGN;Sc;0;ET;;;;;N;;;;; 20A5;MILL SIGN;Sc;0;ET;;;;;N;;;;; 20A6;NAIRA SIGN;Sc;0;ET;;;;;N;;;;; 20A7;PESETA SIGN;Sc;0;ET;;;;;N;;;;; 20A8;RUPEE SIGN;Sc;0;ET;<compat> 0052 0073;;;;N;;;;; 20A9;WON SIGN;Sc;0;ET;;;;;N;;;;; 20AA;NEW SHEQEL SIGN;Sc;0;ET;;;;;N;;;;; 20AB;DONG SIGN;Sc;0;ET;;;;;N;;;;; 20AC;EURO SIGN;Sc;0;ET;;;;;N;;;;; 20AD;KIP SIGN;Sc;0;ET;;;;;N;;;;; 20AE;TUGRIK SIGN;Sc;0;ET;;;;;N;;;;; 20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;; 20B0;GERMAN PENNY SIGN;Sc;0;ET;;;;;N;;;;; 20B1;PESO SIGN;Sc;0;ET;;;;;N;;;;; 20B2;GUARANI SIGN;Sc;0;ET;;;;;N;;;;; 20B3;AUSTRAL SIGN;Sc;0;ET;;;;;N;;;;; 20B4;HRYVNIA SIGN;Sc;0;ET;;;;;N;;;;; 20B5;CEDI SIGN;Sc;0;ET;;;;;N;;;;; 20B6;LIVRE TOURNOIS SIGN;Sc;0;ET;;;;;N;;;;; 20B7;SPESMILO SIGN;Sc;0;ET;;;;;N;;;;; 20B8;TENGE SIGN;Sc;0;ET;;;;;N;;;;; 20B9;INDIAN RUPEE SIGN;Sc;0;ET;;;;;N;;;;; 20BA;TURKISH LIRA SIGN;Sc;0;ET;;;;;N;;;;; 20BB;NORDIC MARK SIGN;Sc;0;ET;;;;;N;;;;; 20BC;MANAT SIGN;Sc;0;ET;;;;;N;;;;; 20BD;RUBLE SIGN;Sc;0;ET;;;;;N;;;;; 20BE;LARI SIGN;Sc;0;ET;;;;;N;;;;; 20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;; 20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;; 20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;; 20D3;COMBINING SHORT VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT VERTICAL BAR OVERLAY;;;; 20D4;COMBINING ANTICLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING ANTICLOCKWISE ARROW ABOVE;;;; 20D5;COMBINING CLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING CLOCKWISE ARROW ABOVE;;;; 20D6;COMBINING LEFT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT ARROW ABOVE;;;; 20D7;COMBINING RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT ARROW ABOVE;;;; 20D8;COMBINING RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING RING OVERLAY;;;; 20D9;COMBINING CLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING CLOCKWISE RING OVERLAY;;;; 20DA;COMBINING ANTICLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING ANTICLOCKWISE RING OVERLAY;;;; 20DB;COMBINING THREE DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING THREE DOTS ABOVE;;;; 20DC;COMBINING FOUR DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING FOUR DOTS ABOVE;;;; 20DD;COMBINING ENCLOSING CIRCLE;Me;0;NSM;;;;;N;ENCLOSING CIRCLE;;;; 20DE;COMBINING ENCLOSING SQUARE;Me;0;NSM;;;;;N;ENCLOSING SQUARE;;;; 20DF;COMBINING ENCLOSING DIAMOND;Me;0;NSM;;;;;N;ENCLOSING DIAMOND;;;; 20E0;COMBINING ENCLOSING CIRCLE BACKSLASH;Me;0;NSM;;;;;N;ENCLOSING CIRCLE SLASH;;;; 20E1;COMBINING LEFT RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT RIGHT ARROW ABOVE;;;; 20E2;COMBINING ENCLOSING SCREEN;Me;0;NSM;;;;;N;;;;; 20E3;COMBINING ENCLOSING KEYCAP;Me;0;NSM;;;;;N;;;;; 20E4;COMBINING ENCLOSING UPWARD POINTING TRIANGLE;Me;0;NSM;;;;;N;;;;; 20E5;COMBINING REVERSE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; 20E6;COMBINING DOUBLE VERTICAL STROKE OVERLAY;Mn;1;NSM;;;;;N;;;;; 20E7;COMBINING ANNUITY SYMBOL;Mn;230;NSM;;;;;N;;;;; 20E8;COMBINING TRIPLE UNDERDOT;Mn;220;NSM;;;;;N;;;;; 20E9;COMBINING WIDE BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; 20EA;COMBINING LEFTWARDS ARROW OVERLAY;Mn;1;NSM;;;;;N;;;;; 20EB;COMBINING LONG DOUBLE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; 20EC;COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; 20ED;COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; 20EE;COMBINING LEFT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; 20EF;COMBINING RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; 20F0;COMBINING ASTERISK ABOVE;Mn;230;NSM;;;;;N;;;;; 2100;ACCOUNT OF;So;0;ON;<compat> 0061 002F 0063;;;;N;;;;; 2101;ADDRESSED TO THE SUBJECT;So;0;ON;<compat> 0061 002F 0073;;;;N;;;;; 2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L;<font> 0043;;;;N;DOUBLE-STRUCK C;;;; 2103;DEGREE CELSIUS;So;0;ON;<compat> 00B0 0043;;;;N;DEGREES CENTIGRADE;;;; 2104;CENTRE LINE SYMBOL;So;0;ON;;;;;N;C L SYMBOL;;;; 2105;CARE OF;So;0;ON;<compat> 0063 002F 006F;;;;N;;;;; 2106;CADA UNA;So;0;ON;<compat> 0063 002F 0075;;;;N;;;;; 2107;EULER CONSTANT;Lu;0;L;<compat> 0190;;;;N;EULERS;;;; 2108;SCRUPLE;So;0;ON;;;;;N;;;;; 2109;DEGREE FAHRENHEIT;So;0;ON;<compat> 00B0 0046;;;;N;DEGREES FAHRENHEIT;;;; 210A;SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; 210B;SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;SCRIPT H;;;; 210C;BLACK-LETTER CAPITAL H;Lu;0;L;<font> 0048;;;;N;BLACK-LETTER H;;;; 210D;DOUBLE-STRUCK CAPITAL H;Lu;0;L;<font> 0048;;;;N;DOUBLE-STRUCK H;;;; 210E;PLANCK CONSTANT;Ll;0;L;<font> 0068;;;;N;;;;; 210F;PLANCK CONSTANT OVER TWO PI;Ll;0;L;<font> 0127;;;;N;PLANCK CONSTANT OVER 2 PI;;;; 2110;SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;SCRIPT I;;;; 2111;BLACK-LETTER CAPITAL I;Lu;0;L;<font> 0049;;;;N;BLACK-LETTER I;;;; 2112;SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;SCRIPT L;;;; 2113;SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; 2114;L B BAR SYMBOL;So;0;ON;;;;;N;;;;; 2115;DOUBLE-STRUCK CAPITAL N;Lu;0;L;<font> 004E;;;;N;DOUBLE-STRUCK N;;;; 2116;NUMERO SIGN;So;0;ON;<compat> 004E 006F;;;;N;NUMERO;;;; 2117;SOUND RECORDING COPYRIGHT;So;0;ON;;;;;N;;;;; 2118;SCRIPT CAPITAL P;Sm;0;ON;;;;;N;SCRIPT P;;;; 2119;DOUBLE-STRUCK CAPITAL P;Lu;0;L;<font> 0050;;;;N;DOUBLE-STRUCK P;;;; 211A;DOUBLE-STRUCK CAPITAL Q;Lu;0;L;<font> 0051;;;;N;DOUBLE-STRUCK Q;;;; 211B;SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;SCRIPT R;;;; 211C;BLACK-LETTER CAPITAL R;Lu;0;L;<font> 0052;;;;N;BLACK-LETTER R;;;; 211D;DOUBLE-STRUCK CAPITAL R;Lu;0;L;<font> 0052;;;;N;DOUBLE-STRUCK R;;;; 211E;PRESCRIPTION TAKE;So;0;ON;;;;;N;;;;; 211F;RESPONSE;So;0;ON;;;;;N;;;;; 2120;SERVICE MARK;So;0;ON;<super> 0053 004D;;;;N;;;;; 2121;TELEPHONE SIGN;So;0;ON;<compat> 0054 0045 004C;;;;N;T E L SYMBOL;;;; 2122;TRADE MARK SIGN;So;0;ON;<super> 0054 004D;;;;N;TRADEMARK;;;; 2123;VERSICLE;So;0;ON;;;;;N;;;;; 2124;DOUBLE-STRUCK CAPITAL Z;Lu;0;L;<font> 005A;;;;N;DOUBLE-STRUCK Z;;;; 2125;OUNCE SIGN;So;0;ON;;;;;N;OUNCE;;;; 2126;OHM SIGN;Lu;0;L;03A9;;;;N;OHM;;;03C9; 2127;INVERTED OHM SIGN;So;0;ON;;;;;N;MHO;;;; 2128;BLACK-LETTER CAPITAL Z;Lu;0;L;<font> 005A;;;;N;BLACK-LETTER Z;;;; 2129;TURNED GREEK SMALL LETTER IOTA;So;0;ON;;;;;N;;;;; 212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B; 212B;ANGSTROM SIGN;Lu;0;L;00C5;;;;N;ANGSTROM UNIT;;;00E5; 212C;SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;SCRIPT B;;;; 212D;BLACK-LETTER CAPITAL C;Lu;0;L;<font> 0043;;;;N;BLACK-LETTER C;;;; 212E;ESTIMATED SYMBOL;So;0;ET;;;;;N;;;;; 212F;SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; 2130;SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;SCRIPT E;;;; 2131;SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;SCRIPT F;;;; 2132;TURNED CAPITAL F;Lu;0;L;;;;;N;TURNED F;;;214E; 2133;SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;SCRIPT M;;;; 2134;SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; 2135;ALEF SYMBOL;Lo;0;L;<compat> 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;; 2136;BET SYMBOL;Lo;0;L;<compat> 05D1;;;;N;SECOND TRANSFINITE CARDINAL;;;; 2137;GIMEL SYMBOL;Lo;0;L;<compat> 05D2;;;;N;THIRD TRANSFINITE CARDINAL;;;; 2138;DALET SYMBOL;Lo;0;L;<compat> 05D3;;;;N;FOURTH TRANSFINITE CARDINAL;;;; 2139;INFORMATION SOURCE;Ll;0;L;<font> 0069;;;;N;;;;; 213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;; 213B;FACSIMILE SIGN;So;0;ON;<compat> 0046 0041 0058;;;;N;;;;; 213C;DOUBLE-STRUCK SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; 213D;DOUBLE-STRUCK SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; 213E;DOUBLE-STRUCK CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; 213F;DOUBLE-STRUCK CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; 2140;DOUBLE-STRUCK N-ARY SUMMATION;Sm;0;ON;<font> 2211;;;;Y;;;;; 2141;TURNED SANS-SERIF CAPITAL G;Sm;0;ON;;;;;N;;;;; 2142;TURNED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;; 2143;REVERSED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;; 2144;TURNED SANS-SERIF CAPITAL Y;Sm;0;ON;;;;;N;;;;; 2145;DOUBLE-STRUCK ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; 2146;DOUBLE-STRUCK ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; 2147;DOUBLE-STRUCK ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; 2148;DOUBLE-STRUCK ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; 2149;DOUBLE-STRUCK ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; 214A;PROPERTY LINE;So;0;ON;;;;;N;;;;; 214B;TURNED AMPERSAND;Sm;0;ON;;;;;N;;;;; 214C;PER SIGN;So;0;ON;;;;;N;;;;; 214D;AKTIESELSKAB;So;0;ON;;;;;N;;;;; 214E;TURNED SMALL F;Ll;0;L;;;;;N;;;2132;;2132 214F;SYMBOL FOR SAMARITAN SOURCE;So;0;L;;;;;N;;;;; 2150;VULGAR FRACTION ONE SEVENTH;No;0;ON;<fraction> 0031 2044 0037;;;1/7;N;;;;; 2151;VULGAR FRACTION ONE NINTH;No;0;ON;<fraction> 0031 2044 0039;;;1/9;N;;;;; 2152;VULGAR FRACTION ONE TENTH;No;0;ON;<fraction> 0031 2044 0031 0030;;;1/10;N;;;;; 2153;VULGAR FRACTION ONE THIRD;No;0;ON;<fraction> 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;; 2154;VULGAR FRACTION TWO THIRDS;No;0;ON;<fraction> 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;; 2155;VULGAR FRACTION ONE FIFTH;No;0;ON;<fraction> 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;; 2156;VULGAR FRACTION TWO FIFTHS;No;0;ON;<fraction> 0032 2044 0035;;;2/5;N;FRACTION TWO FIFTHS;;;; 2157;VULGAR FRACTION THREE FIFTHS;No;0;ON;<fraction> 0033 2044 0035;;;3/5;N;FRACTION THREE FIFTHS;;;; 2158;VULGAR FRACTION FOUR FIFTHS;No;0;ON;<fraction> 0034 2044 0035;;;4/5;N;FRACTION FOUR FIFTHS;;;; 2159;VULGAR FRACTION ONE SIXTH;No;0;ON;<fraction> 0031 2044 0036;;;1/6;N;FRACTION ONE SIXTH;;;; 215A;VULGAR FRACTION FIVE SIXTHS;No;0;ON;<fraction> 0035 2044 0036;;;5/6;N;FRACTION FIVE SIXTHS;;;; 215B;VULGAR FRACTION ONE EIGHTH;No;0;ON;<fraction> 0031 2044 0038;;;1/8;N;FRACTION ONE EIGHTH;;;; 215C;VULGAR FRACTION THREE EIGHTHS;No;0;ON;<fraction> 0033 2044 0038;;;3/8;N;FRACTION THREE EIGHTHS;;;; 215D;VULGAR FRACTION FIVE EIGHTHS;No;0;ON;<fraction> 0035 2044 0038;;;5/8;N;FRACTION FIVE EIGHTHS;;;; 215E;VULGAR FRACTION SEVEN EIGHTHS;No;0;ON;<fraction> 0037 2044 0038;;;7/8;N;FRACTION SEVEN EIGHTHS;;;; 215F;FRACTION NUMERATOR ONE;No;0;ON;<fraction> 0031 2044;;;1;N;;;;; 2160;ROMAN NUMERAL ONE;Nl;0;L;<compat> 0049;;;1;N;;;;2170; 2161;ROMAN NUMERAL TWO;Nl;0;L;<compat> 0049 0049;;;2;N;;;;2171; 2162;ROMAN NUMERAL THREE;Nl;0;L;<compat> 0049 0049 0049;;;3;N;;;;2172; 2163;ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0049 0056;;;4;N;;;;2173; 2164;ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0056;;;5;N;;;;2174; 2165;ROMAN NUMERAL SIX;Nl;0;L;<compat> 0056 0049;;;6;N;;;;2175; 2166;ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0056 0049 0049;;;7;N;;;;2176; 2167;ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0056 0049 0049 0049;;;8;N;;;;2177; 2168;ROMAN NUMERAL NINE;Nl;0;L;<compat> 0049 0058;;;9;N;;;;2178; 2169;ROMAN NUMERAL TEN;Nl;0;L;<compat> 0058;;;10;N;;;;2179; 216A;ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0058 0049;;;11;N;;;;217A; 216B;ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0058 0049 0049;;;12;N;;;;217B; 216C;ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 004C;;;50;N;;;;217C; 216D;ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0043;;;100;N;;;;217D; 216E;ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0044;;;500;N;;;;217E; 216F;ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 004D;;;1000;N;;;;217F; 2170;SMALL ROMAN NUMERAL ONE;Nl;0;L;<compat> 0069;;;1;N;;;2160;;2160 2171;SMALL ROMAN NUMERAL TWO;Nl;0;L;<compat> 0069 0069;;;2;N;;;2161;;2161 2172;SMALL ROMAN NUMERAL THREE;Nl;0;L;<compat> 0069 0069 0069;;;3;N;;;2162;;2162 2173;SMALL ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0069 0076;;;4;N;;;2163;;2163 2174;SMALL ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0076;;;5;N;;;2164;;2164 2175;SMALL ROMAN NUMERAL SIX;Nl;0;L;<compat> 0076 0069;;;6;N;;;2165;;2165 2176;SMALL ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0076 0069 0069;;;7;N;;;2166;;2166 2177;SMALL ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0076 0069 0069 0069;;;8;N;;;2167;;2167 2178;SMALL ROMAN NUMERAL NINE;Nl;0;L;<compat> 0069 0078;;;9;N;;;2168;;2168 2179;SMALL ROMAN NUMERAL TEN;Nl;0;L;<compat> 0078;;;10;N;;;2169;;2169 217A;SMALL ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0078 0069;;;11;N;;;216A;;216A 217B;SMALL ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0078 0069 0069;;;12;N;;;216B;;216B 217C;SMALL ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 006C;;;50;N;;;216C;;216C 217D;SMALL ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0063;;;100;N;;;216D;;216D 217E;SMALL ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0064;;;500;N;;;216E;;216E 217F;SMALL ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 006D;;;1000;N;;;216F;;216F 2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;; 2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;; 2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;; 2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Lu;0;L;;;;;N;;;;2184; 2184;LATIN SMALL LETTER REVERSED C;Ll;0;L;;;;;N;;;2183;;2183 2185;ROMAN NUMERAL SIX LATE FORM;Nl;0;L;;;;6;N;;;;; 2186;ROMAN NUMERAL FIFTY EARLY FORM;Nl;0;L;;;;50;N;;;;; 2187;ROMAN NUMERAL FIFTY THOUSAND;Nl;0;L;;;;50000;N;;;;; 2188;ROMAN NUMERAL ONE HUNDRED THOUSAND;Nl;0;L;;;;100000;N;;;;; 2189;VULGAR FRACTION ZERO THIRDS;No;0;ON;<fraction> 0030 2044 0033;;;0;N;;;;; 218A;TURNED DIGIT TWO;So;0;ON;;;;;N;;;;; 218B;TURNED DIGIT THREE;So;0;ON;;;;;N;;;;; 2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;; 2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;; 2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;; 2193;DOWNWARDS ARROW;Sm;0;ON;;;;;N;DOWN ARROW;;;; 2194;LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; 2195;UP DOWN ARROW;So;0;ON;;;;;N;;;;; 2196;NORTH WEST ARROW;So;0;ON;;;;;N;UPPER LEFT ARROW;;;; 2197;NORTH EAST ARROW;So;0;ON;;;;;N;UPPER RIGHT ARROW;;;; 2198;SOUTH EAST ARROW;So;0;ON;;;;;N;LOWER RIGHT ARROW;;;; 2199;SOUTH WEST ARROW;So;0;ON;;;;;N;LOWER LEFT ARROW;;;; 219A;LEFTWARDS ARROW WITH STROKE;Sm;0;ON;2190 0338;;;;N;LEFT ARROW WITH STROKE;;;; 219B;RIGHTWARDS ARROW WITH STROKE;Sm;0;ON;2192 0338;;;;N;RIGHT ARROW WITH STROKE;;;; 219C;LEFTWARDS WAVE ARROW;So;0;ON;;;;;N;LEFT WAVE ARROW;;;; 219D;RIGHTWARDS WAVE ARROW;So;0;ON;;;;;N;RIGHT WAVE ARROW;;;; 219E;LEFTWARDS TWO HEADED ARROW;So;0;ON;;;;;N;LEFT TWO HEADED ARROW;;;; 219F;UPWARDS TWO HEADED ARROW;So;0;ON;;;;;N;UP TWO HEADED ARROW;;;; 21A0;RIGHTWARDS TWO HEADED ARROW;Sm;0;ON;;;;;N;RIGHT TWO HEADED ARROW;;;; 21A1;DOWNWARDS TWO HEADED ARROW;So;0;ON;;;;;N;DOWN TWO HEADED ARROW;;;; 21A2;LEFTWARDS ARROW WITH TAIL;So;0;ON;;;;;N;LEFT ARROW WITH TAIL;;;; 21A3;RIGHTWARDS ARROW WITH TAIL;Sm;0;ON;;;;;N;RIGHT ARROW WITH TAIL;;;; 21A4;LEFTWARDS ARROW FROM BAR;So;0;ON;;;;;N;LEFT ARROW FROM BAR;;;; 21A5;UPWARDS ARROW FROM BAR;So;0;ON;;;;;N;UP ARROW FROM BAR;;;; 21A6;RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;RIGHT ARROW FROM BAR;;;; 21A7;DOWNWARDS ARROW FROM BAR;So;0;ON;;;;;N;DOWN ARROW FROM BAR;;;; 21A8;UP DOWN ARROW WITH BASE;So;0;ON;;;;;N;;;;; 21A9;LEFTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;LEFT ARROW WITH HOOK;;;; 21AA;RIGHTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;RIGHT ARROW WITH HOOK;;;; 21AB;LEFTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;LEFT ARROW WITH LOOP;;;; 21AC;RIGHTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;RIGHT ARROW WITH LOOP;;;; 21AD;LEFT RIGHT WAVE ARROW;So;0;ON;;;;;N;;;;; 21AE;LEFT RIGHT ARROW WITH STROKE;Sm;0;ON;2194 0338;;;;N;;;;; 21AF;DOWNWARDS ZIGZAG ARROW;So;0;ON;;;;;N;DOWN ZIGZAG ARROW;;;; 21B0;UPWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP LEFT;;;; 21B1;UPWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP RIGHT;;;; 21B2;DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP LEFT;;;; 21B3;DOWNWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP RIGHT;;;; 21B4;RIGHTWARDS ARROW WITH CORNER DOWNWARDS;So;0;ON;;;;;N;RIGHT ARROW WITH CORNER DOWN;;;; 21B5;DOWNWARDS ARROW WITH CORNER LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH CORNER LEFT;;;; 21B6;ANTICLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; 21B7;CLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; 21B8;NORTH WEST ARROW TO LONG BAR;So;0;ON;;;;;N;UPPER LEFT ARROW TO LONG BAR;;;; 21B9;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR;;;; 21BA;ANTICLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; 21BB;CLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; 21BC;LEFTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB UP;;;; 21BD;LEFTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB DOWN;;;; 21BE;UPWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB RIGHT;;;; 21BF;UPWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB LEFT;;;; 21C0;RIGHTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB UP;;;; 21C1;RIGHTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB DOWN;;;; 21C2;DOWNWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB RIGHT;;;; 21C3;DOWNWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB LEFT;;;; 21C4;RIGHTWARDS ARROW OVER LEFTWARDS ARROW;So;0;ON;;;;;N;RIGHT ARROW OVER LEFT ARROW;;;; 21C5;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW;So;0;ON;;;;;N;UP ARROW LEFT OF DOWN ARROW;;;; 21C6;LEFTWARDS ARROW OVER RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT ARROW OVER RIGHT ARROW;;;; 21C7;LEFTWARDS PAIRED ARROWS;So;0;ON;;;;;N;LEFT PAIRED ARROWS;;;; 21C8;UPWARDS PAIRED ARROWS;So;0;ON;;;;;N;UP PAIRED ARROWS;;;; 21C9;RIGHTWARDS PAIRED ARROWS;So;0;ON;;;;;N;RIGHT PAIRED ARROWS;;;; 21CA;DOWNWARDS PAIRED ARROWS;So;0;ON;;;;;N;DOWN PAIRED ARROWS;;;; 21CB;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON;So;0;ON;;;;;N;LEFT HARPOON OVER RIGHT HARPOON;;;; 21CC;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON;So;0;ON;;;;;N;RIGHT HARPOON OVER LEFT HARPOON;;;; 21CD;LEFTWARDS DOUBLE ARROW WITH STROKE;So;0;ON;21D0 0338;;;;N;LEFT DOUBLE ARROW WITH STROKE;;;; 21CE;LEFT RIGHT DOUBLE ARROW WITH STROKE;Sm;0;ON;21D4 0338;;;;N;;;;; 21CF;RIGHTWARDS DOUBLE ARROW WITH STROKE;Sm;0;ON;21D2 0338;;;;N;RIGHT DOUBLE ARROW WITH STROKE;;;; 21D0;LEFTWARDS DOUBLE ARROW;So;0;ON;;;;;N;LEFT DOUBLE ARROW;;;; 21D1;UPWARDS DOUBLE ARROW;So;0;ON;;;;;N;UP DOUBLE ARROW;;;; 21D2;RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;RIGHT DOUBLE ARROW;;;; 21D3;DOWNWARDS DOUBLE ARROW;So;0;ON;;;;;N;DOWN DOUBLE ARROW;;;; 21D4;LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; 21D5;UP DOWN DOUBLE ARROW;So;0;ON;;;;;N;;;;; 21D6;NORTH WEST DOUBLE ARROW;So;0;ON;;;;;N;UPPER LEFT DOUBLE ARROW;;;; 21D7;NORTH EAST DOUBLE ARROW;So;0;ON;;;;;N;UPPER RIGHT DOUBLE ARROW;;;; 21D8;SOUTH EAST DOUBLE ARROW;So;0;ON;;;;;N;LOWER RIGHT DOUBLE ARROW;;;; 21D9;SOUTH WEST DOUBLE ARROW;So;0;ON;;;;;N;LOWER LEFT DOUBLE ARROW;;;; 21DA;LEFTWARDS TRIPLE ARROW;So;0;ON;;;;;N;LEFT TRIPLE ARROW;;;; 21DB;RIGHTWARDS TRIPLE ARROW;So;0;ON;;;;;N;RIGHT TRIPLE ARROW;;;; 21DC;LEFTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;LEFT SQUIGGLE ARROW;;;; 21DD;RIGHTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;RIGHT SQUIGGLE ARROW;;;; 21DE;UPWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;UP ARROW WITH DOUBLE STROKE;;;; 21DF;DOWNWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;DOWN ARROW WITH DOUBLE STROKE;;;; 21E0;LEFTWARDS DASHED ARROW;So;0;ON;;;;;N;LEFT DASHED ARROW;;;; 21E1;UPWARDS DASHED ARROW;So;0;ON;;;;;N;UP DASHED ARROW;;;; 21E2;RIGHTWARDS DASHED ARROW;So;0;ON;;;;;N;RIGHT DASHED ARROW;;;; 21E3;DOWNWARDS DASHED ARROW;So;0;ON;;;;;N;DOWN DASHED ARROW;;;; 21E4;LEFTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR;;;; 21E5;RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;RIGHT ARROW TO BAR;;;; 21E6;LEFTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE LEFT ARROW;;;; 21E7;UPWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE UP ARROW;;;; 21E8;RIGHTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE RIGHT ARROW;;;; 21E9;DOWNWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE DOWN ARROW;;;; 21EA;UPWARDS WHITE ARROW FROM BAR;So;0;ON;;;;;N;WHITE UP ARROW FROM BAR;;;; 21EB;UPWARDS WHITE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; 21EC;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; 21ED;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; 21EE;UPWARDS WHITE DOUBLE ARROW;So;0;ON;;;;;N;;;;; 21EF;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; 21F0;RIGHTWARDS WHITE ARROW FROM WALL;So;0;ON;;;;;N;;;;; 21F1;NORTH WEST ARROW TO CORNER;So;0;ON;;;;;N;;;;; 21F2;SOUTH EAST ARROW TO CORNER;So;0;ON;;;;;N;;;;; 21F3;UP DOWN WHITE ARROW;So;0;ON;;;;;N;;;;; 21F4;RIGHT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; 21F5;DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW;Sm;0;ON;;;;;N;;;;; 21F6;THREE RIGHTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; 21F7;LEFTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 21F8;RIGHTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 21F9;LEFT RIGHT ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 21FA;LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 21FB;RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 21FC;LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 21FD;LEFTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; 21FE;RIGHTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; 21FF;LEFT RIGHT OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; 2200;FOR ALL;Sm;0;ON;;;;;N;;;;; 2201;COMPLEMENT;Sm;0;ON;;;;;Y;;;;; 2202;PARTIAL DIFFERENTIAL;Sm;0;ON;;;;;Y;;;;; 2203;THERE EXISTS;Sm;0;ON;;;;;Y;;;;; 2204;THERE DOES NOT EXIST;Sm;0;ON;2203 0338;;;;Y;;;;; 2205;EMPTY SET;Sm;0;ON;;;;;N;;;;; 2206;INCREMENT;Sm;0;ON;;;;;N;;;;; 2207;NABLA;Sm;0;ON;;;;;N;;;;; 2208;ELEMENT OF;Sm;0;ON;;;;;Y;;;;; 2209;NOT AN ELEMENT OF;Sm;0;ON;2208 0338;;;;Y;;;;; 220A;SMALL ELEMENT OF;Sm;0;ON;;;;;Y;;;;; 220B;CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; 220C;DOES NOT CONTAIN AS MEMBER;Sm;0;ON;220B 0338;;;;Y;;;;; 220D;SMALL CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; 220E;END OF PROOF;Sm;0;ON;;;;;N;;;;; 220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;; 2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;; 2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;; 2212;MINUS SIGN;Sm;0;ES;;;;;N;;;;; 2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;; 2214;DOT PLUS;Sm;0;ON;;;;;N;;;;; 2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; 2216;SET MINUS;Sm;0;ON;;;;;Y;;;;; 2217;ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; 2218;RING OPERATOR;Sm;0;ON;;;;;N;;;;; 2219;BULLET OPERATOR;Sm;0;ON;;;;;N;;;;; 221A;SQUARE ROOT;Sm;0;ON;;;;;Y;;;;; 221B;CUBE ROOT;Sm;0;ON;;;;;Y;;;;; 221C;FOURTH ROOT;Sm;0;ON;;;;;Y;;;;; 221D;PROPORTIONAL TO;Sm;0;ON;;;;;Y;;;;; 221E;INFINITY;Sm;0;ON;;;;;N;;;;; 221F;RIGHT ANGLE;Sm;0;ON;;;;;Y;;;;; 2220;ANGLE;Sm;0;ON;;;;;Y;;;;; 2221;MEASURED ANGLE;Sm;0;ON;;;;;Y;;;;; 2222;SPHERICAL ANGLE;Sm;0;ON;;;;;Y;;;;; 2223;DIVIDES;Sm;0;ON;;;;;N;;;;; 2224;DOES NOT DIVIDE;Sm;0;ON;2223 0338;;;;Y;;;;; 2225;PARALLEL TO;Sm;0;ON;;;;;N;;;;; 2226;NOT PARALLEL TO;Sm;0;ON;2225 0338;;;;Y;;;;; 2227;LOGICAL AND;Sm;0;ON;;;;;N;;;;; 2228;LOGICAL OR;Sm;0;ON;;;;;N;;;;; 2229;INTERSECTION;Sm;0;ON;;;;;N;;;;; 222A;UNION;Sm;0;ON;;;;;N;;;;; 222B;INTEGRAL;Sm;0;ON;;;;;Y;;;;; 222C;DOUBLE INTEGRAL;Sm;0;ON;<compat> 222B 222B;;;;Y;;;;; 222D;TRIPLE INTEGRAL;Sm;0;ON;<compat> 222B 222B 222B;;;;Y;;;;; 222E;CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; 222F;SURFACE INTEGRAL;Sm;0;ON;<compat> 222E 222E;;;;Y;;;;; 2230;VOLUME INTEGRAL;Sm;0;ON;<compat> 222E 222E 222E;;;;Y;;;;; 2231;CLOCKWISE INTEGRAL;Sm;0;ON;;;;;Y;;;;; 2232;CLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; 2233;ANTICLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; 2234;THEREFORE;Sm;0;ON;;;;;N;;;;; 2235;BECAUSE;Sm;0;ON;;;;;N;;;;; 2236;RATIO;Sm;0;ON;;;;;N;;;;; 2237;PROPORTION;Sm;0;ON;;;;;N;;;;; 2238;DOT MINUS;Sm;0;ON;;;;;N;;;;; 2239;EXCESS;Sm;0;ON;;;;;Y;;;;; 223A;GEOMETRIC PROPORTION;Sm;0;ON;;;;;N;;;;; 223B;HOMOTHETIC;Sm;0;ON;;;;;Y;;;;; 223C;TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; 223D;REVERSED TILDE;Sm;0;ON;;;;;Y;;;;; 223E;INVERTED LAZY S;Sm;0;ON;;;;;Y;;;;; 223F;SINE WAVE;Sm;0;ON;;;;;Y;;;;; 2240;WREATH PRODUCT;Sm;0;ON;;;;;Y;;;;; 2241;NOT TILDE;Sm;0;ON;223C 0338;;;;Y;;;;; 2242;MINUS TILDE;Sm;0;ON;;;;;Y;;;;; 2243;ASYMPTOTICALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2244;NOT ASYMPTOTICALLY EQUAL TO;Sm;0;ON;2243 0338;;;;Y;;;;; 2245;APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2246;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2247;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO;Sm;0;ON;2245 0338;;;;Y;;;;; 2248;ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2249;NOT ALMOST EQUAL TO;Sm;0;ON;2248 0338;;;;Y;;;;; 224A;ALMOST EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; 224B;TRIPLE TILDE;Sm;0;ON;;;;;Y;;;;; 224C;ALL EQUAL TO;Sm;0;ON;;;;;Y;;;;; 224D;EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; 224E;GEOMETRICALLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; 224F;DIFFERENCE BETWEEN;Sm;0;ON;;;;;N;;;;; 2250;APPROACHES THE LIMIT;Sm;0;ON;;;;;N;;;;; 2251;GEOMETRICALLY EQUAL TO;Sm;0;ON;;;;;N;;;;; 2252;APPROXIMATELY EQUAL TO OR THE IMAGE OF;Sm;0;ON;;;;;Y;;;;; 2253;IMAGE OF OR APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2254;COLON EQUALS;Sm;0;ON;;;;;Y;COLON EQUAL;;;; 2255;EQUALS COLON;Sm;0;ON;;;;;Y;EQUAL COLON;;;; 2256;RING IN EQUAL TO;Sm;0;ON;;;;;N;;;;; 2257;RING EQUAL TO;Sm;0;ON;;;;;N;;;;; 2258;CORRESPONDS TO;Sm;0;ON;;;;;N;;;;; 2259;ESTIMATES;Sm;0;ON;;;;;N;;;;; 225A;EQUIANGULAR TO;Sm;0;ON;;;;;N;;;;; 225B;STAR EQUALS;Sm;0;ON;;;;;N;;;;; 225C;DELTA EQUAL TO;Sm;0;ON;;;;;N;;;;; 225D;EQUAL TO BY DEFINITION;Sm;0;ON;;;;;N;;;;; 225E;MEASURED BY;Sm;0;ON;;;;;N;;;;; 225F;QUESTIONED EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2260;NOT EQUAL TO;Sm;0;ON;003D 0338;;;;Y;;;;; 2261;IDENTICAL TO;Sm;0;ON;;;;;N;;;;; 2262;NOT IDENTICAL TO;Sm;0;ON;2261 0338;;;;Y;;;;; 2263;STRICTLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; 2264;LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUAL TO;;;; 2265;GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUAL TO;;;; 2266;LESS-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OVER EQUAL TO;;;; 2267;GREATER-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OVER EQUAL TO;;;; 2268;LESS-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUAL TO;;;; 2269;GREATER-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUAL TO;;;; 226A;MUCH LESS-THAN;Sm;0;ON;;;;;Y;MUCH LESS THAN;;;; 226B;MUCH GREATER-THAN;Sm;0;ON;;;;;Y;MUCH GREATER THAN;;;; 226C;BETWEEN;Sm;0;ON;;;;;N;;;;; 226D;NOT EQUIVALENT TO;Sm;0;ON;224D 0338;;;;N;;;;; 226E;NOT LESS-THAN;Sm;0;ON;003C 0338;;;;Y;NOT LESS THAN;;;; 226F;NOT GREATER-THAN;Sm;0;ON;003E 0338;;;;Y;NOT GREATER THAN;;;; 2270;NEITHER LESS-THAN NOR EQUAL TO;Sm;0;ON;2264 0338;;;;Y;NEITHER LESS THAN NOR EQUAL TO;;;; 2271;NEITHER GREATER-THAN NOR EQUAL TO;Sm;0;ON;2265 0338;;;;Y;NEITHER GREATER THAN NOR EQUAL TO;;;; 2272;LESS-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUIVALENT TO;;;; 2273;GREATER-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUIVALENT TO;;;; 2274;NEITHER LESS-THAN NOR EQUIVALENT TO;Sm;0;ON;2272 0338;;;;Y;NEITHER LESS THAN NOR EQUIVALENT TO;;;; 2275;NEITHER GREATER-THAN NOR EQUIVALENT TO;Sm;0;ON;2273 0338;;;;Y;NEITHER GREATER THAN NOR EQUIVALENT TO;;;; 2276;LESS-THAN OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN OR GREATER THAN;;;; 2277;GREATER-THAN OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN OR LESS THAN;;;; 2278;NEITHER LESS-THAN NOR GREATER-THAN;Sm;0;ON;2276 0338;;;;Y;NEITHER LESS THAN NOR GREATER THAN;;;; 2279;NEITHER GREATER-THAN NOR LESS-THAN;Sm;0;ON;2277 0338;;;;Y;NEITHER GREATER THAN NOR LESS THAN;;;; 227A;PRECEDES;Sm;0;ON;;;;;Y;;;;; 227B;SUCCEEDS;Sm;0;ON;;;;;Y;;;;; 227C;PRECEDES OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; 227D;SUCCEEDS OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; 227E;PRECEDES OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; 227F;SUCCEEDS OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; 2280;DOES NOT PRECEDE;Sm;0;ON;227A 0338;;;;Y;;;;; 2281;DOES NOT SUCCEED;Sm;0;ON;227B 0338;;;;Y;;;;; 2282;SUBSET OF;Sm;0;ON;;;;;Y;;;;; 2283;SUPERSET OF;Sm;0;ON;;;;;Y;;;;; 2284;NOT A SUBSET OF;Sm;0;ON;2282 0338;;;;Y;;;;; 2285;NOT A SUPERSET OF;Sm;0;ON;2283 0338;;;;Y;;;;; 2286;SUBSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2287;SUPERSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2288;NEITHER A SUBSET OF NOR EQUAL TO;Sm;0;ON;2286 0338;;;;Y;;;;; 2289;NEITHER A SUPERSET OF NOR EQUAL TO;Sm;0;ON;2287 0338;;;;Y;;;;; 228A;SUBSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUBSET OF OR NOT EQUAL TO;;;; 228B;SUPERSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUPERSET OF OR NOT EQUAL TO;;;; 228C;MULTISET;Sm;0;ON;;;;;Y;;;;; 228D;MULTISET MULTIPLICATION;Sm;0;ON;;;;;N;;;;; 228E;MULTISET UNION;Sm;0;ON;;;;;N;;;;; 228F;SQUARE IMAGE OF;Sm;0;ON;;;;;Y;;;;; 2290;SQUARE ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; 2291;SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2292;SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2293;SQUARE CAP;Sm;0;ON;;;;;N;;;;; 2294;SQUARE CUP;Sm;0;ON;;;;;N;;;;; 2295;CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; 2296;CIRCLED MINUS;Sm;0;ON;;;;;N;;;;; 2297;CIRCLED TIMES;Sm;0;ON;;;;;N;;;;; 2298;CIRCLED DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; 2299;CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; 229A;CIRCLED RING OPERATOR;Sm;0;ON;;;;;N;;;;; 229B;CIRCLED ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; 229C;CIRCLED EQUALS;Sm;0;ON;;;;;N;;;;; 229D;CIRCLED DASH;Sm;0;ON;;;;;N;;;;; 229E;SQUARED PLUS;Sm;0;ON;;;;;N;;;;; 229F;SQUARED MINUS;Sm;0;ON;;;;;N;;;;; 22A0;SQUARED TIMES;Sm;0;ON;;;;;N;;;;; 22A1;SQUARED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; 22A2;RIGHT TACK;Sm;0;ON;;;;;Y;;;;; 22A3;LEFT TACK;Sm;0;ON;;;;;Y;;;;; 22A4;DOWN TACK;Sm;0;ON;;;;;N;;;;; 22A5;UP TACK;Sm;0;ON;;;;;N;;;;; 22A6;ASSERTION;Sm;0;ON;;;;;Y;;;;; 22A7;MODELS;Sm;0;ON;;;;;Y;;;;; 22A8;TRUE;Sm;0;ON;;;;;Y;;;;; 22A9;FORCES;Sm;0;ON;;;;;Y;;;;; 22AA;TRIPLE VERTICAL BAR RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; 22AB;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; 22AC;DOES NOT PROVE;Sm;0;ON;22A2 0338;;;;Y;;;;; 22AD;NOT TRUE;Sm;0;ON;22A8 0338;;;;Y;;;;; 22AE;DOES NOT FORCE;Sm;0;ON;22A9 0338;;;;Y;;;;; 22AF;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;22AB 0338;;;;Y;;;;; 22B0;PRECEDES UNDER RELATION;Sm;0;ON;;;;;Y;;;;; 22B1;SUCCEEDS UNDER RELATION;Sm;0;ON;;;;;Y;;;;; 22B2;NORMAL SUBGROUP OF;Sm;0;ON;;;;;Y;;;;; 22B3;CONTAINS AS NORMAL SUBGROUP;Sm;0;ON;;;;;Y;;;;; 22B4;NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; 22B5;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; 22B6;ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; 22B7;IMAGE OF;Sm;0;ON;;;;;Y;;;;; 22B8;MULTIMAP;Sm;0;ON;;;;;Y;;;;; 22B9;HERMITIAN CONJUGATE MATRIX;Sm;0;ON;;;;;N;;;;; 22BA;INTERCALATE;Sm;0;ON;;;;;N;;;;; 22BB;XOR;Sm;0;ON;;;;;N;;;;; 22BC;NAND;Sm;0;ON;;;;;N;;;;; 22BD;NOR;Sm;0;ON;;;;;N;;;;; 22BE;RIGHT ANGLE WITH ARC;Sm;0;ON;;;;;Y;;;;; 22BF;RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; 22C0;N-ARY LOGICAL AND;Sm;0;ON;;;;;N;;;;; 22C1;N-ARY LOGICAL OR;Sm;0;ON;;;;;N;;;;; 22C2;N-ARY INTERSECTION;Sm;0;ON;;;;;N;;;;; 22C3;N-ARY UNION;Sm;0;ON;;;;;N;;;;; 22C4;DIAMOND OPERATOR;Sm;0;ON;;;;;N;;;;; 22C5;DOT OPERATOR;Sm;0;ON;;;;;N;;;;; 22C6;STAR OPERATOR;Sm;0;ON;;;;;N;;;;; 22C7;DIVISION TIMES;Sm;0;ON;;;;;N;;;;; 22C8;BOWTIE;Sm;0;ON;;;;;N;;;;; 22C9;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; 22CA;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; 22CB;LEFT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; 22CC;RIGHT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; 22CD;REVERSED TILDE EQUALS;Sm;0;ON;;;;;Y;;;;; 22CE;CURLY LOGICAL OR;Sm;0;ON;;;;;N;;;;; 22CF;CURLY LOGICAL AND;Sm;0;ON;;;;;N;;;;; 22D0;DOUBLE SUBSET;Sm;0;ON;;;;;Y;;;;; 22D1;DOUBLE SUPERSET;Sm;0;ON;;;;;Y;;;;; 22D2;DOUBLE INTERSECTION;Sm;0;ON;;;;;N;;;;; 22D3;DOUBLE UNION;Sm;0;ON;;;;;N;;;;; 22D4;PITCHFORK;Sm;0;ON;;;;;N;;;;; 22D5;EQUAL AND PARALLEL TO;Sm;0;ON;;;;;N;;;;; 22D6;LESS-THAN WITH DOT;Sm;0;ON;;;;;Y;LESS THAN WITH DOT;;;; 22D7;GREATER-THAN WITH DOT;Sm;0;ON;;;;;Y;GREATER THAN WITH DOT;;;; 22D8;VERY MUCH LESS-THAN;Sm;0;ON;;;;;Y;VERY MUCH LESS THAN;;;; 22D9;VERY MUCH GREATER-THAN;Sm;0;ON;;;;;Y;VERY MUCH GREATER THAN;;;; 22DA;LESS-THAN EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN EQUAL TO OR GREATER THAN;;;; 22DB;GREATER-THAN EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN EQUAL TO OR LESS THAN;;;; 22DC;EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR LESS THAN;;;; 22DD;EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR GREATER THAN;;;; 22DE;EQUAL TO OR PRECEDES;Sm;0;ON;;;;;Y;;;;; 22DF;EQUAL TO OR SUCCEEDS;Sm;0;ON;;;;;Y;;;;; 22E0;DOES NOT PRECEDE OR EQUAL;Sm;0;ON;227C 0338;;;;Y;;;;; 22E1;DOES NOT SUCCEED OR EQUAL;Sm;0;ON;227D 0338;;;;Y;;;;; 22E2;NOT SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;2291 0338;;;;Y;;;;; 22E3;NOT SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;2292 0338;;;;Y;;;;; 22E4;SQUARE IMAGE OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; 22E5;SQUARE ORIGINAL OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; 22E6;LESS-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUIVALENT TO;;;; 22E7;GREATER-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUIVALENT TO;;;; 22E8;PRECEDES BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; 22E9;SUCCEEDS BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; 22EA;NOT NORMAL SUBGROUP OF;Sm;0;ON;22B2 0338;;;;Y;;;;; 22EB;DOES NOT CONTAIN AS NORMAL SUBGROUP;Sm;0;ON;22B3 0338;;;;Y;;;;; 22EC;NOT NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;22B4 0338;;;;Y;;;;; 22ED;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL;Sm;0;ON;22B5 0338;;;;Y;;;;; 22EE;VERTICAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; 22EF;MIDLINE HORIZONTAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; 22F0;UP RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; 22F1;DOWN RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; 22F2;ELEMENT OF WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; 22F3;ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; 22F4;SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; 22F5;ELEMENT OF WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; 22F6;ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; 22F7;SMALL ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; 22F8;ELEMENT OF WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; 22F9;ELEMENT OF WITH TWO HORIZONTAL STROKES;Sm;0;ON;;;;;Y;;;;; 22FA;CONTAINS WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; 22FB;CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; 22FC;SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; 22FD;CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; 22FE;SMALL CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; 22FF;Z NOTATION BAG MEMBERSHIP;Sm;0;ON;;;;;Y;;;;; 2300;DIAMETER SIGN;So;0;ON;;;;;N;;;;; 2301;ELECTRIC ARROW;So;0;ON;;;;;N;;;;; 2302;HOUSE;So;0;ON;;;;;N;;;;; 2303;UP ARROWHEAD;So;0;ON;;;;;N;;;;; 2304;DOWN ARROWHEAD;So;0;ON;;;;;N;;;;; 2305;PROJECTIVE;So;0;ON;;;;;N;;;;; 2306;PERSPECTIVE;So;0;ON;;;;;N;;;;; 2307;WAVY LINE;So;0;ON;;;;;N;;;;; 2308;LEFT CEILING;Ps;0;ON;;;;;Y;;;;; 2309;RIGHT CEILING;Pe;0;ON;;;;;Y;;;;; 230A;LEFT FLOOR;Ps;0;ON;;;;;Y;;;;; 230B;RIGHT FLOOR;Pe;0;ON;;;;;Y;;;;; 230C;BOTTOM RIGHT CROP;So;0;ON;;;;;N;;;;; 230D;BOTTOM LEFT CROP;So;0;ON;;;;;N;;;;; 230E;TOP RIGHT CROP;So;0;ON;;;;;N;;;;; 230F;TOP LEFT CROP;So;0;ON;;;;;N;;;;; 2310;REVERSED NOT SIGN;So;0;ON;;;;;N;;;;; 2311;SQUARE LOZENGE;So;0;ON;;;;;N;;;;; 2312;ARC;So;0;ON;;;;;N;;;;; 2313;SEGMENT;So;0;ON;;;;;N;;;;; 2314;SECTOR;So;0;ON;;;;;N;;;;; 2315;TELEPHONE RECORDER;So;0;ON;;;;;N;;;;; 2316;POSITION INDICATOR;So;0;ON;;;;;N;;;;; 2317;VIEWDATA SQUARE;So;0;ON;;;;;N;;;;; 2318;PLACE OF INTEREST SIGN;So;0;ON;;;;;N;COMMAND KEY;;;; 2319;TURNED NOT SIGN;So;0;ON;;;;;N;;;;; 231A;WATCH;So;0;ON;;;;;N;;;;; 231B;HOURGLASS;So;0;ON;;;;;N;;;;; 231C;TOP LEFT CORNER;So;0;ON;;;;;N;;;;; 231D;TOP RIGHT CORNER;So;0;ON;;;;;N;;;;; 231E;BOTTOM LEFT CORNER;So;0;ON;;;;;N;;;;; 231F;BOTTOM RIGHT CORNER;So;0;ON;;;;;N;;;;; 2320;TOP HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; 2321;BOTTOM HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; 2322;FROWN;So;0;ON;;;;;N;;;;; 2323;SMILE;So;0;ON;;;;;N;;;;; 2324;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS;So;0;ON;;;;;N;ENTER KEY;;;; 2325;OPTION KEY;So;0;ON;;;;;N;;;;; 2326;ERASE TO THE RIGHT;So;0;ON;;;;;N;DELETE TO THE RIGHT KEY;;;; 2327;X IN A RECTANGLE BOX;So;0;ON;;;;;N;CLEAR KEY;;;; 2328;KEYBOARD;So;0;ON;;;;;N;;;;; 2329;LEFT-POINTING ANGLE BRACKET;Ps;0;ON;3008;;;;Y;BRA;;;; 232A;RIGHT-POINTING ANGLE BRACKET;Pe;0;ON;3009;;;;Y;KET;;;; 232B;ERASE TO THE LEFT;So;0;ON;;;;;N;DELETE TO THE LEFT KEY;;;; 232C;BENZENE RING;So;0;ON;;;;;N;;;;; 232D;CYLINDRICITY;So;0;ON;;;;;N;;;;; 232E;ALL AROUND-PROFILE;So;0;ON;;;;;N;;;;; 232F;SYMMETRY;So;0;ON;;;;;N;;;;; 2330;TOTAL RUNOUT;So;0;ON;;;;;N;;;;; 2331;DIMENSION ORIGIN;So;0;ON;;;;;N;;;;; 2332;CONICAL TAPER;So;0;ON;;;;;N;;;;; 2333;SLOPE;So;0;ON;;;;;N;;;;; 2334;COUNTERBORE;So;0;ON;;;;;N;;;;; 2335;COUNTERSINK;So;0;ON;;;;;N;;;;; 2336;APL FUNCTIONAL SYMBOL I-BEAM;So;0;L;;;;;N;;;;; 2337;APL FUNCTIONAL SYMBOL SQUISH QUAD;So;0;L;;;;;N;;;;; 2338;APL FUNCTIONAL SYMBOL QUAD EQUAL;So;0;L;;;;;N;;;;; 2339;APL FUNCTIONAL SYMBOL QUAD DIVIDE;So;0;L;;;;;N;;;;; 233A;APL FUNCTIONAL SYMBOL QUAD DIAMOND;So;0;L;;;;;N;;;;; 233B;APL FUNCTIONAL SYMBOL QUAD JOT;So;0;L;;;;;N;;;;; 233C;APL FUNCTIONAL SYMBOL QUAD CIRCLE;So;0;L;;;;;N;;;;; 233D;APL FUNCTIONAL SYMBOL CIRCLE STILE;So;0;L;;;;;N;;;;; 233E;APL FUNCTIONAL SYMBOL CIRCLE JOT;So;0;L;;;;;N;;;;; 233F;APL FUNCTIONAL SYMBOL SLASH BAR;So;0;L;;;;;N;;;;; 2340;APL FUNCTIONAL SYMBOL BACKSLASH BAR;So;0;L;;;;;N;;;;; 2341;APL FUNCTIONAL SYMBOL QUAD SLASH;So;0;L;;;;;N;;;;; 2342;APL FUNCTIONAL SYMBOL QUAD BACKSLASH;So;0;L;;;;;N;;;;; 2343;APL FUNCTIONAL SYMBOL QUAD LESS-THAN;So;0;L;;;;;N;;;;; 2344;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN;So;0;L;;;;;N;;;;; 2345;APL FUNCTIONAL SYMBOL LEFTWARDS VANE;So;0;L;;;;;N;;;;; 2346;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE;So;0;L;;;;;N;;;;; 2347;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW;So;0;L;;;;;N;;;;; 2348;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW;So;0;L;;;;;N;;;;; 2349;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH;So;0;L;;;;;N;;;;; 234A;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR;So;0;L;;;;;N;;;;; 234B;APL FUNCTIONAL SYMBOL DELTA STILE;So;0;L;;;;;N;;;;; 234C;APL FUNCTIONAL SYMBOL QUAD DOWN CARET;So;0;L;;;;;N;;;;; 234D;APL FUNCTIONAL SYMBOL QUAD DELTA;So;0;L;;;;;N;;;;; 234E;APL FUNCTIONAL SYMBOL DOWN TACK JOT;So;0;L;;;;;N;;;;; 234F;APL FUNCTIONAL SYMBOL UPWARDS VANE;So;0;L;;;;;N;;;;; 2350;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW;So;0;L;;;;;N;;;;; 2351;APL FUNCTIONAL SYMBOL UP TACK OVERBAR;So;0;L;;;;;N;;;;; 2352;APL FUNCTIONAL SYMBOL DEL STILE;So;0;L;;;;;N;;;;; 2353;APL FUNCTIONAL SYMBOL QUAD UP CARET;So;0;L;;;;;N;;;;; 2354;APL FUNCTIONAL SYMBOL QUAD DEL;So;0;L;;;;;N;;;;; 2355;APL FUNCTIONAL SYMBOL UP TACK JOT;So;0;L;;;;;N;;;;; 2356;APL FUNCTIONAL SYMBOL DOWNWARDS VANE;So;0;L;;;;;N;;;;; 2357;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW;So;0;L;;;;;N;;;;; 2358;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR;So;0;L;;;;;N;;;;; 2359;APL FUNCTIONAL SYMBOL DELTA UNDERBAR;So;0;L;;;;;N;;;;; 235A;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR;So;0;L;;;;;N;;;;; 235B;APL FUNCTIONAL SYMBOL JOT UNDERBAR;So;0;L;;;;;N;;;;; 235C;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR;So;0;L;;;;;N;;;;; 235D;APL FUNCTIONAL SYMBOL UP SHOE JOT;So;0;L;;;;;N;;;;; 235E;APL FUNCTIONAL SYMBOL QUOTE QUAD;So;0;L;;;;;N;;;;; 235F;APL FUNCTIONAL SYMBOL CIRCLE STAR;So;0;L;;;;;N;;;;; 2360;APL FUNCTIONAL SYMBOL QUAD COLON;So;0;L;;;;;N;;;;; 2361;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS;So;0;L;;;;;N;;;;; 2362;APL FUNCTIONAL SYMBOL DEL DIAERESIS;So;0;L;;;;;N;;;;; 2363;APL FUNCTIONAL SYMBOL STAR DIAERESIS;So;0;L;;;;;N;;;;; 2364;APL FUNCTIONAL SYMBOL JOT DIAERESIS;So;0;L;;;;;N;;;;; 2365;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS;So;0;L;;;;;N;;;;; 2366;APL FUNCTIONAL SYMBOL DOWN SHOE STILE;So;0;L;;;;;N;;;;; 2367;APL FUNCTIONAL SYMBOL LEFT SHOE STILE;So;0;L;;;;;N;;;;; 2368;APL FUNCTIONAL SYMBOL TILDE DIAERESIS;So;0;L;;;;;N;;;;; 2369;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS;So;0;L;;;;;N;;;;; 236A;APL FUNCTIONAL SYMBOL COMMA BAR;So;0;L;;;;;N;;;;; 236B;APL FUNCTIONAL SYMBOL DEL TILDE;So;0;L;;;;;N;;;;; 236C;APL FUNCTIONAL SYMBOL ZILDE;So;0;L;;;;;N;;;;; 236D;APL FUNCTIONAL SYMBOL STILE TILDE;So;0;L;;;;;N;;;;; 236E;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR;So;0;L;;;;;N;;;;; 236F;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL;So;0;L;;;;;N;;;;; 2370;APL FUNCTIONAL SYMBOL QUAD QUESTION;So;0;L;;;;;N;;;;; 2371;APL FUNCTIONAL SYMBOL DOWN CARET TILDE;So;0;L;;;;;N;;;;; 2372;APL FUNCTIONAL SYMBOL UP CARET TILDE;So;0;L;;;;;N;;;;; 2373;APL FUNCTIONAL SYMBOL IOTA;So;0;L;;;;;N;;;;; 2374;APL FUNCTIONAL SYMBOL RHO;So;0;L;;;;;N;;;;; 2375;APL FUNCTIONAL SYMBOL OMEGA;So;0;L;;;;;N;;;;; 2376;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR;So;0;L;;;;;N;;;;; 2377;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR;So;0;L;;;;;N;;;;; 2378;APL FUNCTIONAL SYMBOL IOTA UNDERBAR;So;0;L;;;;;N;;;;; 2379;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR;So;0;L;;;;;N;;;;; 237A;APL FUNCTIONAL SYMBOL ALPHA;So;0;L;;;;;N;;;;; 237B;NOT CHECK MARK;So;0;ON;;;;;N;;;;; 237C;RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW;Sm;0;ON;;;;;N;;;;; 237D;SHOULDERED OPEN BOX;So;0;ON;;;;;N;;;;; 237E;BELL SYMBOL;So;0;ON;;;;;N;;;;; 237F;VERTICAL LINE WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; 2380;INSERTION SYMBOL;So;0;ON;;;;;N;;;;; 2381;CONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; 2382;DISCONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; 2383;EMPHASIS SYMBOL;So;0;ON;;;;;N;;;;; 2384;COMPOSITION SYMBOL;So;0;ON;;;;;N;;;;; 2385;WHITE SQUARE WITH CENTRE VERTICAL LINE;So;0;ON;;;;;N;;;;; 2386;ENTER SYMBOL;So;0;ON;;;;;N;;;;; 2387;ALTERNATIVE KEY SYMBOL;So;0;ON;;;;;N;;;;; 2388;HELM SYMBOL;So;0;ON;;;;;N;;;;; 2389;CIRCLED HORIZONTAL BAR WITH NOTCH;So;0;ON;;;;;N;;;;; 238A;CIRCLED TRIANGLE DOWN;So;0;ON;;;;;N;;;;; 238B;BROKEN CIRCLE WITH NORTHWEST ARROW;So;0;ON;;;;;N;;;;; 238C;UNDO SYMBOL;So;0;ON;;;;;N;;;;; 238D;MONOSTABLE SYMBOL;So;0;ON;;;;;N;;;;; 238E;HYSTERESIS SYMBOL;So;0;ON;;;;;N;;;;; 238F;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL;So;0;ON;;;;;N;;;;; 2390;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL;So;0;ON;;;;;N;;;;; 2391;PASSIVE-PULL-DOWN-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; 2392;PASSIVE-PULL-UP-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; 2393;DIRECT CURRENT SYMBOL FORM TWO;So;0;ON;;;;;N;;;;; 2394;SOFTWARE-FUNCTION SYMBOL;So;0;ON;;;;;N;;;;; 2395;APL FUNCTIONAL SYMBOL QUAD;So;0;L;;;;;N;;;;; 2396;DECIMAL SEPARATOR KEY SYMBOL;So;0;ON;;;;;N;;;;; 2397;PREVIOUS PAGE;So;0;ON;;;;;N;;;;; 2398;NEXT PAGE;So;0;ON;;;;;N;;;;; 2399;PRINT SCREEN SYMBOL;So;0;ON;;;;;N;;;;; 239A;CLEAR SCREEN SYMBOL;So;0;ON;;;;;N;;;;; 239B;LEFT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;; 239C;LEFT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;; 239D;LEFT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;; 239E;RIGHT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;; 239F;RIGHT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;; 23A0;RIGHT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;; 23A1;LEFT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;; 23A2;LEFT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; 23A3;LEFT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;; 23A4;RIGHT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;; 23A5;RIGHT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; 23A6;RIGHT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;; 23A7;LEFT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;; 23A8;LEFT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;; 23A9;LEFT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;; 23AA;CURLY BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; 23AB;RIGHT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;; 23AC;RIGHT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;; 23AD;RIGHT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;; 23AE;INTEGRAL EXTENSION;Sm;0;ON;;;;;N;;;;; 23AF;HORIZONTAL LINE EXTENSION;Sm;0;ON;;;;;N;;;;; 23B0;UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; 23B1;UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; 23B2;SUMMATION TOP;Sm;0;ON;;;;;N;;;;; 23B3;SUMMATION BOTTOM;Sm;0;ON;;;;;N;;;;; 23B4;TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; 23B5;BOTTOM SQUARE BRACKET;So;0;ON;;;;;N;;;;; 23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; 23B7;RADICAL SYMBOL BOTTOM;So;0;ON;;;;;N;;;;; 23B8;LEFT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; 23B9;RIGHT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; 23BA;HORIZONTAL SCAN LINE-1;So;0;ON;;;;;N;;;;; 23BB;HORIZONTAL SCAN LINE-3;So;0;ON;;;;;N;;;;; 23BC;HORIZONTAL SCAN LINE-7;So;0;ON;;;;;N;;;;; 23BD;HORIZONTAL SCAN LINE-9;So;0;ON;;;;;N;;;;; 23BE;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT;So;0;ON;;;;;N;;;;; 23BF;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT;So;0;ON;;;;;N;;;;; 23C0;DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE;So;0;ON;;;;;N;;;;; 23C1;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;; 23C2;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;; 23C3;DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; 23C4;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; 23C5;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; 23C6;DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE;So;0;ON;;;;;N;;;;; 23C7;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;; 23C8;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;; 23C9;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;;;;; 23CA;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;;;;; 23CB;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT;So;0;ON;;;;;N;;;;; 23CC;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT;So;0;ON;;;;;N;;;;; 23CD;SQUARE FOOT;So;0;ON;;;;;N;;;;; 23CE;RETURN SYMBOL;So;0;ON;;;;;N;;;;; 23CF;EJECT SYMBOL;So;0;ON;;;;;N;;;;; 23D0;VERTICAL LINE EXTENSION;So;0;ON;;;;;N;;;;; 23D1;METRICAL BREVE;So;0;ON;;;;;N;;;;; 23D2;METRICAL LONG OVER SHORT;So;0;ON;;;;;N;;;;; 23D3;METRICAL SHORT OVER LONG;So;0;ON;;;;;N;;;;; 23D4;METRICAL LONG OVER TWO SHORTS;So;0;ON;;;;;N;;;;; 23D5;METRICAL TWO SHORTS OVER LONG;So;0;ON;;;;;N;;;;; 23D6;METRICAL TWO SHORTS JOINED;So;0;ON;;;;;N;;;;; 23D7;METRICAL TRISEME;So;0;ON;;;;;N;;;;; 23D8;METRICAL TETRASEME;So;0;ON;;;;;N;;;;; 23D9;METRICAL PENTASEME;So;0;ON;;;;;N;;;;; 23DA;EARTH GROUND;So;0;ON;;;;;N;;;;; 23DB;FUSE;So;0;ON;;;;;N;;;;; 23DC;TOP PARENTHESIS;Sm;0;ON;;;;;N;;;;; 23DD;BOTTOM PARENTHESIS;Sm;0;ON;;;;;N;;;;; 23DE;TOP CURLY BRACKET;Sm;0;ON;;;;;N;;;;; 23DF;BOTTOM CURLY BRACKET;Sm;0;ON;;;;;N;;;;; 23E0;TOP TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;;;; 23E1;BOTTOM TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;;;; 23E2;WHITE TRAPEZIUM;So;0;ON;;;;;N;;;;; 23E3;BENZENE RING WITH CIRCLE;So;0;ON;;;;;N;;;;; 23E4;STRAIGHTNESS;So;0;ON;;;;;N;;;;; 23E5;FLATNESS;So;0;ON;;;;;N;;;;; 23E6;AC CURRENT;So;0;ON;;;;;N;;;;; 23E7;ELECTRICAL INTERSECTION;So;0;ON;;;;;N;;;;; 23E8;DECIMAL EXPONENT SYMBOL;So;0;ON;;;;;N;;;;; 23E9;BLACK RIGHT-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; 23EA;BLACK LEFT-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; 23EB;BLACK UP-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; 23EC;BLACK DOWN-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; 23ED;BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; 23EE;BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; 23EF;BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR;So;0;ON;;;;;N;;;;; 23F0;ALARM CLOCK;So;0;ON;;;;;N;;;;; 23F1;STOPWATCH;So;0;ON;;;;;N;;;;; 23F2;TIMER CLOCK;So;0;ON;;;;;N;;;;; 23F3;HOURGLASS WITH FLOWING SAND;So;0;ON;;;;;N;;;;; 23F4;BLACK MEDIUM LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; 23F5;BLACK MEDIUM RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; 23F6;BLACK MEDIUM UP-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; 23F7;BLACK MEDIUM DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; 23F8;DOUBLE VERTICAL BAR;So;0;ON;;;;;N;;;;; 23F9;BLACK SQUARE FOR STOP;So;0;ON;;;;;N;;;;; 23FA;BLACK CIRCLE FOR RECORD;So;0;ON;;;;;N;;;;; 23FB;POWER SYMBOL;So;0;ON;;;;;N;;;;; 23FC;POWER ON-OFF SYMBOL;So;0;ON;;;;;N;;;;; 23FD;POWER ON SYMBOL;So;0;ON;;;;;N;;;;; 23FE;POWER SLEEP SYMBOL;So;0;ON;;;;;N;;;;; 2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;; 2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;; 2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;; 2403;SYMBOL FOR END OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR END OF TEXT;;;; 2404;SYMBOL FOR END OF TRANSMISSION;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION;;;; 2405;SYMBOL FOR ENQUIRY;So;0;ON;;;;;N;GRAPHIC FOR ENQUIRY;;;; 2406;SYMBOL FOR ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR ACKNOWLEDGE;;;; 2407;SYMBOL FOR BELL;So;0;ON;;;;;N;GRAPHIC FOR BELL;;;; 2408;SYMBOL FOR BACKSPACE;So;0;ON;;;;;N;GRAPHIC FOR BACKSPACE;;;; 2409;SYMBOL FOR HORIZONTAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR HORIZONTAL TABULATION;;;; 240A;SYMBOL FOR LINE FEED;So;0;ON;;;;;N;GRAPHIC FOR LINE FEED;;;; 240B;SYMBOL FOR VERTICAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR VERTICAL TABULATION;;;; 240C;SYMBOL FOR FORM FEED;So;0;ON;;;;;N;GRAPHIC FOR FORM FEED;;;; 240D;SYMBOL FOR CARRIAGE RETURN;So;0;ON;;;;;N;GRAPHIC FOR CARRIAGE RETURN;;;; 240E;SYMBOL FOR SHIFT OUT;So;0;ON;;;;;N;GRAPHIC FOR SHIFT OUT;;;; 240F;SYMBOL FOR SHIFT IN;So;0;ON;;;;;N;GRAPHIC FOR SHIFT IN;;;; 2410;SYMBOL FOR DATA LINK ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR DATA LINK ESCAPE;;;; 2411;SYMBOL FOR DEVICE CONTROL ONE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL ONE;;;; 2412;SYMBOL FOR DEVICE CONTROL TWO;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL TWO;;;; 2413;SYMBOL FOR DEVICE CONTROL THREE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL THREE;;;; 2414;SYMBOL FOR DEVICE CONTROL FOUR;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL FOUR;;;; 2415;SYMBOL FOR NEGATIVE ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR NEGATIVE ACKNOWLEDGE;;;; 2416;SYMBOL FOR SYNCHRONOUS IDLE;So;0;ON;;;;;N;GRAPHIC FOR SYNCHRONOUS IDLE;;;; 2417;SYMBOL FOR END OF TRANSMISSION BLOCK;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION BLOCK;;;; 2418;SYMBOL FOR CANCEL;So;0;ON;;;;;N;GRAPHIC FOR CANCEL;;;; 2419;SYMBOL FOR END OF MEDIUM;So;0;ON;;;;;N;GRAPHIC FOR END OF MEDIUM;;;; 241A;SYMBOL FOR SUBSTITUTE;So;0;ON;;;;;N;GRAPHIC FOR SUBSTITUTE;;;; 241B;SYMBOL FOR ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR ESCAPE;;;; 241C;SYMBOL FOR FILE SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR FILE SEPARATOR;;;; 241D;SYMBOL FOR GROUP SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR GROUP SEPARATOR;;;; 241E;SYMBOL FOR RECORD SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR RECORD SEPARATOR;;;; 241F;SYMBOL FOR UNIT SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR UNIT SEPARATOR;;;; 2420;SYMBOL FOR SPACE;So;0;ON;;;;;N;GRAPHIC FOR SPACE;;;; 2421;SYMBOL FOR DELETE;So;0;ON;;;;;N;GRAPHIC FOR DELETE;;;; 2422;BLANK SYMBOL;So;0;ON;;;;;N;BLANK;;;; 2423;OPEN BOX;So;0;ON;;;;;N;;;;; 2424;SYMBOL FOR NEWLINE;So;0;ON;;;;;N;GRAPHIC FOR NEWLINE;;;; 2425;SYMBOL FOR DELETE FORM TWO;So;0;ON;;;;;N;;;;; 2426;SYMBOL FOR SUBSTITUTE FORM TWO;So;0;ON;;;;;N;;;;; 2440;OCR HOOK;So;0;ON;;;;;N;;;;; 2441;OCR CHAIR;So;0;ON;;;;;N;;;;; 2442;OCR FORK;So;0;ON;;;;;N;;;;; 2443;OCR INVERTED FORK;So;0;ON;;;;;N;;;;; 2444;OCR BELT BUCKLE;So;0;ON;;;;;N;;;;; 2445;OCR BOW TIE;So;0;ON;;;;;N;;;;; 2446;OCR BRANCH BANK IDENTIFICATION;So;0;ON;;;;;N;;;;; 2447;OCR AMOUNT OF CHECK;So;0;ON;;;;;N;;;;; 2448;OCR DASH;So;0;ON;;;;;N;;;;; 2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;; 244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;; 2460;CIRCLED DIGIT ONE;No;0;ON;<circle> 0031;;1;1;N;;;;; 2461;CIRCLED DIGIT TWO;No;0;ON;<circle> 0032;;2;2;N;;;;; 2462;CIRCLED DIGIT THREE;No;0;ON;<circle> 0033;;3;3;N;;;;; 2463;CIRCLED DIGIT FOUR;No;0;ON;<circle> 0034;;4;4;N;;;;; 2464;CIRCLED DIGIT FIVE;No;0;ON;<circle> 0035;;5;5;N;;;;; 2465;CIRCLED DIGIT SIX;No;0;ON;<circle> 0036;;6;6;N;;;;; 2466;CIRCLED DIGIT SEVEN;No;0;ON;<circle> 0037;;7;7;N;;;;; 2467;CIRCLED DIGIT EIGHT;No;0;ON;<circle> 0038;;8;8;N;;;;; 2468;CIRCLED DIGIT NINE;No;0;ON;<circle> 0039;;9;9;N;;;;; 2469;CIRCLED NUMBER TEN;No;0;ON;<circle> 0031 0030;;;10;N;;;;; 246A;CIRCLED NUMBER ELEVEN;No;0;ON;<circle> 0031 0031;;;11;N;;;;; 246B;CIRCLED NUMBER TWELVE;No;0;ON;<circle> 0031 0032;;;12;N;;;;; 246C;CIRCLED NUMBER THIRTEEN;No;0;ON;<circle> 0031 0033;;;13;N;;;;; 246D;CIRCLED NUMBER FOURTEEN;No;0;ON;<circle> 0031 0034;;;14;N;;;;; 246E;CIRCLED NUMBER FIFTEEN;No;0;ON;<circle> 0031 0035;;;15;N;;;;; 246F;CIRCLED NUMBER SIXTEEN;No;0;ON;<circle> 0031 0036;;;16;N;;;;; 2470;CIRCLED NUMBER SEVENTEEN;No;0;ON;<circle> 0031 0037;;;17;N;;;;; 2471;CIRCLED NUMBER EIGHTEEN;No;0;ON;<circle> 0031 0038;;;18;N;;;;; 2472;CIRCLED NUMBER NINETEEN;No;0;ON;<circle> 0031 0039;;;19;N;;;;; 2473;CIRCLED NUMBER TWENTY;No;0;ON;<circle> 0032 0030;;;20;N;;;;; 2474;PARENTHESIZED DIGIT ONE;No;0;ON;<compat> 0028 0031 0029;;1;1;N;;;;; 2475;PARENTHESIZED DIGIT TWO;No;0;ON;<compat> 0028 0032 0029;;2;2;N;;;;; 2476;PARENTHESIZED DIGIT THREE;No;0;ON;<compat> 0028 0033 0029;;3;3;N;;;;; 2477;PARENTHESIZED DIGIT FOUR;No;0;ON;<compat> 0028 0034 0029;;4;4;N;;;;; 2478;PARENTHESIZED DIGIT FIVE;No;0;ON;<compat> 0028 0035 0029;;5;5;N;;;;; 2479;PARENTHESIZED DIGIT SIX;No;0;ON;<compat> 0028 0036 0029;;6;6;N;;;;; 247A;PARENTHESIZED DIGIT SEVEN;No;0;ON;<compat> 0028 0037 0029;;7;7;N;;;;; 247B;PARENTHESIZED DIGIT EIGHT;No;0;ON;<compat> 0028 0038 0029;;8;8;N;;;;; 247C;PARENTHESIZED DIGIT NINE;No;0;ON;<compat> 0028 0039 0029;;9;9;N;;;;; 247D;PARENTHESIZED NUMBER TEN;No;0;ON;<compat> 0028 0031 0030 0029;;;10;N;;;;; 247E;PARENTHESIZED NUMBER ELEVEN;No;0;ON;<compat> 0028 0031 0031 0029;;;11;N;;;;; 247F;PARENTHESIZED NUMBER TWELVE;No;0;ON;<compat> 0028 0031 0032 0029;;;12;N;;;;; 2480;PARENTHESIZED NUMBER THIRTEEN;No;0;ON;<compat> 0028 0031 0033 0029;;;13;N;;;;; 2481;PARENTHESIZED NUMBER FOURTEEN;No;0;ON;<compat> 0028 0031 0034 0029;;;14;N;;;;; 2482;PARENTHESIZED NUMBER FIFTEEN;No;0;ON;<compat> 0028 0031 0035 0029;;;15;N;;;;; 2483;PARENTHESIZED NUMBER SIXTEEN;No;0;ON;<compat> 0028 0031 0036 0029;;;16;N;;;;; 2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;ON;<compat> 0028 0031 0037 0029;;;17;N;;;;; 2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;ON;<compat> 0028 0031 0038 0029;;;18;N;;;;; 2486;PARENTHESIZED NUMBER NINETEEN;No;0;ON;<compat> 0028 0031 0039 0029;;;19;N;;;;; 2487;PARENTHESIZED NUMBER TWENTY;No;0;ON;<compat> 0028 0032 0030 0029;;;20;N;;;;; 2488;DIGIT ONE FULL STOP;No;0;EN;<compat> 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;; 2489;DIGIT TWO FULL STOP;No;0;EN;<compat> 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;; 248A;DIGIT THREE FULL STOP;No;0;EN;<compat> 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;; 248B;DIGIT FOUR FULL STOP;No;0;EN;<compat> 0034 002E;;4;4;N;DIGIT FOUR PERIOD;;;; 248C;DIGIT FIVE FULL STOP;No;0;EN;<compat> 0035 002E;;5;5;N;DIGIT FIVE PERIOD;;;; 248D;DIGIT SIX FULL STOP;No;0;EN;<compat> 0036 002E;;6;6;N;DIGIT SIX PERIOD;;;; 248E;DIGIT SEVEN FULL STOP;No;0;EN;<compat> 0037 002E;;7;7;N;DIGIT SEVEN PERIOD;;;; 248F;DIGIT EIGHT FULL STOP;No;0;EN;<compat> 0038 002E;;8;8;N;DIGIT EIGHT PERIOD;;;; 2490;DIGIT NINE FULL STOP;No;0;EN;<compat> 0039 002E;;9;9;N;DIGIT NINE PERIOD;;;; 2491;NUMBER TEN FULL STOP;No;0;EN;<compat> 0031 0030 002E;;;10;N;NUMBER TEN PERIOD;;;; 2492;NUMBER ELEVEN FULL STOP;No;0;EN;<compat> 0031 0031 002E;;;11;N;NUMBER ELEVEN PERIOD;;;; 2493;NUMBER TWELVE FULL STOP;No;0;EN;<compat> 0031 0032 002E;;;12;N;NUMBER TWELVE PERIOD;;;; 2494;NUMBER THIRTEEN FULL STOP;No;0;EN;<compat> 0031 0033 002E;;;13;N;NUMBER THIRTEEN PERIOD;;;; 2495;NUMBER FOURTEEN FULL STOP;No;0;EN;<compat> 0031 0034 002E;;;14;N;NUMBER FOURTEEN PERIOD;;;; 2496;NUMBER FIFTEEN FULL STOP;No;0;EN;<compat> 0031 0035 002E;;;15;N;NUMBER FIFTEEN PERIOD;;;; 2497;NUMBER SIXTEEN FULL STOP;No;0;EN;<compat> 0031 0036 002E;;;16;N;NUMBER SIXTEEN PERIOD;;;; 2498;NUMBER SEVENTEEN FULL STOP;No;0;EN;<compat> 0031 0037 002E;;;17;N;NUMBER SEVENTEEN PERIOD;;;; 2499;NUMBER EIGHTEEN FULL STOP;No;0;EN;<compat> 0031 0038 002E;;;18;N;NUMBER EIGHTEEN PERIOD;;;; 249A;NUMBER NINETEEN FULL STOP;No;0;EN;<compat> 0031 0039 002E;;;19;N;NUMBER NINETEEN PERIOD;;;; 249B;NUMBER TWENTY FULL STOP;No;0;EN;<compat> 0032 0030 002E;;;20;N;NUMBER TWENTY PERIOD;;;; 249C;PARENTHESIZED LATIN SMALL LETTER A;So;0;L;<compat> 0028 0061 0029;;;;N;;;;; 249D;PARENTHESIZED LATIN SMALL LETTER B;So;0;L;<compat> 0028 0062 0029;;;;N;;;;; 249E;PARENTHESIZED LATIN SMALL LETTER C;So;0;L;<compat> 0028 0063 0029;;;;N;;;;; 249F;PARENTHESIZED LATIN SMALL LETTER D;So;0;L;<compat> 0028 0064 0029;;;;N;;;;; 24A0;PARENTHESIZED LATIN SMALL LETTER E;So;0;L;<compat> 0028 0065 0029;;;;N;;;;; 24A1;PARENTHESIZED LATIN SMALL LETTER F;So;0;L;<compat> 0028 0066 0029;;;;N;;;;; 24A2;PARENTHESIZED LATIN SMALL LETTER G;So;0;L;<compat> 0028 0067 0029;;;;N;;;;; 24A3;PARENTHESIZED LATIN SMALL LETTER H;So;0;L;<compat> 0028 0068 0029;;;;N;;;;; 24A4;PARENTHESIZED LATIN SMALL LETTER I;So;0;L;<compat> 0028 0069 0029;;;;N;;;;; 24A5;PARENTHESIZED LATIN SMALL LETTER J;So;0;L;<compat> 0028 006A 0029;;;;N;;;;; 24A6;PARENTHESIZED LATIN SMALL LETTER K;So;0;L;<compat> 0028 006B 0029;;;;N;;;;; 24A7;PARENTHESIZED LATIN SMALL LETTER L;So;0;L;<compat> 0028 006C 0029;;;;N;;;;; 24A8;PARENTHESIZED LATIN SMALL LETTER M;So;0;L;<compat> 0028 006D 0029;;;;N;;;;; 24A9;PARENTHESIZED LATIN SMALL LETTER N;So;0;L;<compat> 0028 006E 0029;;;;N;;;;; 24AA;PARENTHESIZED LATIN SMALL LETTER O;So;0;L;<compat> 0028 006F 0029;;;;N;;;;; 24AB;PARENTHESIZED LATIN SMALL LETTER P;So;0;L;<compat> 0028 0070 0029;;;;N;;;;; 24AC;PARENTHESIZED LATIN SMALL LETTER Q;So;0;L;<compat> 0028 0071 0029;;;;N;;;;; 24AD;PARENTHESIZED LATIN SMALL LETTER R;So;0;L;<compat> 0028 0072 0029;;;;N;;;;; 24AE;PARENTHESIZED LATIN SMALL LETTER S;So;0;L;<compat> 0028 0073 0029;;;;N;;;;; 24AF;PARENTHESIZED LATIN SMALL LETTER T;So;0;L;<compat> 0028 0074 0029;;;;N;;;;; 24B0;PARENTHESIZED LATIN SMALL LETTER U;So;0;L;<compat> 0028 0075 0029;;;;N;;;;; 24B1;PARENTHESIZED LATIN SMALL LETTER V;So;0;L;<compat> 0028 0076 0029;;;;N;;;;; 24B2;PARENTHESIZED LATIN SMALL LETTER W;So;0;L;<compat> 0028 0077 0029;;;;N;;;;; 24B3;PARENTHESIZED LATIN SMALL LETTER X;So;0;L;<compat> 0028 0078 0029;;;;N;;;;; 24B4;PARENTHESIZED LATIN SMALL LETTER Y;So;0;L;<compat> 0028 0079 0029;;;;N;;;;; 24B5;PARENTHESIZED LATIN SMALL LETTER Z;So;0;L;<compat> 0028 007A 0029;;;;N;;;;; 24B6;CIRCLED LATIN CAPITAL LETTER A;So;0;L;<circle> 0041;;;;N;;;;24D0; 24B7;CIRCLED LATIN CAPITAL LETTER B;So;0;L;<circle> 0042;;;;N;;;;24D1; 24B8;CIRCLED LATIN CAPITAL LETTER C;So;0;L;<circle> 0043;;;;N;;;;24D2; 24B9;CIRCLED LATIN CAPITAL LETTER D;So;0;L;<circle> 0044;;;;N;;;;24D3; 24BA;CIRCLED LATIN CAPITAL LETTER E;So;0;L;<circle> 0045;;;;N;;;;24D4; 24BB;CIRCLED LATIN CAPITAL LETTER F;So;0;L;<circle> 0046;;;;N;;;;24D5; 24BC;CIRCLED LATIN CAPITAL LETTER G;So;0;L;<circle> 0047;;;;N;;;;24D6; 24BD;CIRCLED LATIN CAPITAL LETTER H;So;0;L;<circle> 0048;;;;N;;;;24D7; 24BE;CIRCLED LATIN CAPITAL LETTER I;So;0;L;<circle> 0049;;;;N;;;;24D8; 24BF;CIRCLED LATIN CAPITAL LETTER J;So;0;L;<circle> 004A;;;;N;;;;24D9; 24C0;CIRCLED LATIN CAPITAL LETTER K;So;0;L;<circle> 004B;;;;N;;;;24DA; 24C1;CIRCLED LATIN CAPITAL LETTER L;So;0;L;<circle> 004C;;;;N;;;;24DB; 24C2;CIRCLED LATIN CAPITAL LETTER M;So;0;L;<circle> 004D;;;;N;;;;24DC; 24C3;CIRCLED LATIN CAPITAL LETTER N;So;0;L;<circle> 004E;;;;N;;;;24DD; 24C4;CIRCLED LATIN CAPITAL LETTER O;So;0;L;<circle> 004F;;;;N;;;;24DE; 24C5;CIRCLED LATIN CAPITAL LETTER P;So;0;L;<circle> 0050;;;;N;;;;24DF; 24C6;CIRCLED LATIN CAPITAL LETTER Q;So;0;L;<circle> 0051;;;;N;;;;24E0; 24C7;CIRCLED LATIN CAPITAL LETTER R;So;0;L;<circle> 0052;;;;N;;;;24E1; 24C8;CIRCLED LATIN CAPITAL LETTER S;So;0;L;<circle> 0053;;;;N;;;;24E2; 24C9;CIRCLED LATIN CAPITAL LETTER T;So;0;L;<circle> 0054;;;;N;;;;24E3; 24CA;CIRCLED LATIN CAPITAL LETTER U;So;0;L;<circle> 0055;;;;N;;;;24E4; 24CB;CIRCLED LATIN CAPITAL LETTER V;So;0;L;<circle> 0056;;;;N;;;;24E5; 24CC;CIRCLED LATIN CAPITAL LETTER W;So;0;L;<circle> 0057;;;;N;;;;24E6; 24CD;CIRCLED LATIN CAPITAL LETTER X;So;0;L;<circle> 0058;;;;N;;;;24E7; 24CE;CIRCLED LATIN CAPITAL LETTER Y;So;0;L;<circle> 0059;;;;N;;;;24E8; 24CF;CIRCLED LATIN CAPITAL LETTER Z;So;0;L;<circle> 005A;;;;N;;;;24E9; 24D0;CIRCLED LATIN SMALL LETTER A;So;0;L;<circle> 0061;;;;N;;;24B6;;24B6 24D1;CIRCLED LATIN SMALL LETTER B;So;0;L;<circle> 0062;;;;N;;;24B7;;24B7 24D2;CIRCLED LATIN SMALL LETTER C;So;0;L;<circle> 0063;;;;N;;;24B8;;24B8 24D3;CIRCLED LATIN SMALL LETTER D;So;0;L;<circle> 0064;;;;N;;;24B9;;24B9 24D4;CIRCLED LATIN SMALL LETTER E;So;0;L;<circle> 0065;;;;N;;;24BA;;24BA 24D5;CIRCLED LATIN SMALL LETTER F;So;0;L;<circle> 0066;;;;N;;;24BB;;24BB 24D6;CIRCLED LATIN SMALL LETTER G;So;0;L;<circle> 0067;;;;N;;;24BC;;24BC 24D7;CIRCLED LATIN SMALL LETTER H;So;0;L;<circle> 0068;;;;N;;;24BD;;24BD 24D8;CIRCLED LATIN SMALL LETTER I;So;0;L;<circle> 0069;;;;N;;;24BE;;24BE 24D9;CIRCLED LATIN SMALL LETTER J;So;0;L;<circle> 006A;;;;N;;;24BF;;24BF 24DA;CIRCLED LATIN SMALL LETTER K;So;0;L;<circle> 006B;;;;N;;;24C0;;24C0 24DB;CIRCLED LATIN SMALL LETTER L;So;0;L;<circle> 006C;;;;N;;;24C1;;24C1 24DC;CIRCLED LATIN SMALL LETTER M;So;0;L;<circle> 006D;;;;N;;;24C2;;24C2 24DD;CIRCLED LATIN SMALL LETTER N;So;0;L;<circle> 006E;;;;N;;;24C3;;24C3 24DE;CIRCLED LATIN SMALL LETTER O;So;0;L;<circle> 006F;;;;N;;;24C4;;24C4 24DF;CIRCLED LATIN SMALL LETTER P;So;0;L;<circle> 0070;;;;N;;;24C5;;24C5 24E0;CIRCLED LATIN SMALL LETTER Q;So;0;L;<circle> 0071;;;;N;;;24C6;;24C6 24E1;CIRCLED LATIN SMALL LETTER R;So;0;L;<circle> 0072;;;;N;;;24C7;;24C7 24E2;CIRCLED LATIN SMALL LETTER S;So;0;L;<circle> 0073;;;;N;;;24C8;;24C8 24E3;CIRCLED LATIN SMALL LETTER T;So;0;L;<circle> 0074;;;;N;;;24C9;;24C9 24E4;CIRCLED LATIN SMALL LETTER U;So;0;L;<circle> 0075;;;;N;;;24CA;;24CA 24E5;CIRCLED LATIN SMALL LETTER V;So;0;L;<circle> 0076;;;;N;;;24CB;;24CB 24E6;CIRCLED LATIN SMALL LETTER W;So;0;L;<circle> 0077;;;;N;;;24CC;;24CC 24E7;CIRCLED LATIN SMALL LETTER X;So;0;L;<circle> 0078;;;;N;;;24CD;;24CD 24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L;<circle> 0079;;;;N;;;24CE;;24CE 24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L;<circle> 007A;;;;N;;;24CF;;24CF 24EA;CIRCLED DIGIT ZERO;No;0;ON;<circle> 0030;;0;0;N;;;;; 24EB;NEGATIVE CIRCLED NUMBER ELEVEN;No;0;ON;;;;11;N;;;;; 24EC;NEGATIVE CIRCLED NUMBER TWELVE;No;0;ON;;;;12;N;;;;; 24ED;NEGATIVE CIRCLED NUMBER THIRTEEN;No;0;ON;;;;13;N;;;;; 24EE;NEGATIVE CIRCLED NUMBER FOURTEEN;No;0;ON;;;;14;N;;;;; 24EF;NEGATIVE CIRCLED NUMBER FIFTEEN;No;0;ON;;;;15;N;;;;; 24F0;NEGATIVE CIRCLED NUMBER SIXTEEN;No;0;ON;;;;16;N;;;;; 24F1;NEGATIVE CIRCLED NUMBER SEVENTEEN;No;0;ON;;;;17;N;;;;; 24F2;NEGATIVE CIRCLED NUMBER EIGHTEEN;No;0;ON;;;;18;N;;;;; 24F3;NEGATIVE CIRCLED NUMBER NINETEEN;No;0;ON;;;;19;N;;;;; 24F4;NEGATIVE CIRCLED NUMBER TWENTY;No;0;ON;;;;20;N;;;;; 24F5;DOUBLE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;;;;; 24F6;DOUBLE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;;;;; 24F7;DOUBLE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;;;;; 24F8;DOUBLE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;;;;; 24F9;DOUBLE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;;;;; 24FA;DOUBLE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;;;;; 24FB;DOUBLE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;;;;; 24FC;DOUBLE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;;;;; 24FD;DOUBLE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;;;;; 24FE;DOUBLE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;;;;; 24FF;NEGATIVE CIRCLED DIGIT ZERO;No;0;ON;;;0;0;N;;;;; 2500;BOX DRAWINGS LIGHT HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT HORIZONTAL;;;; 2501;BOX DRAWINGS HEAVY HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY HORIZONTAL;;;; 2502;BOX DRAWINGS LIGHT VERTICAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL;;;; 2503;BOX DRAWINGS HEAVY VERTICAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL;;;; 2504;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH HORIZONTAL;;;; 2505;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH HORIZONTAL;;;; 2506;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH VERTICAL;;;; 2507;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH VERTICAL;;;; 2508;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH HORIZONTAL;;;; 2509;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH HORIZONTAL;;;; 250A;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH VERTICAL;;;; 250B;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH VERTICAL;;;; 250C;BOX DRAWINGS LIGHT DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND RIGHT;;;; 250D;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT HEAVY;;;; 250E;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT LIGHT;;;; 250F;BOX DRAWINGS HEAVY DOWN AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND RIGHT;;;; 2510;BOX DRAWINGS LIGHT DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND LEFT;;;; 2511;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT HEAVY;;;; 2512;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT LIGHT;;;; 2513;BOX DRAWINGS HEAVY DOWN AND LEFT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND LEFT;;;; 2514;BOX DRAWINGS LIGHT UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT UP AND RIGHT;;;; 2515;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT HEAVY;;;; 2516;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT LIGHT;;;; 2517;BOX DRAWINGS HEAVY UP AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY UP AND RIGHT;;;; 2518;BOX DRAWINGS LIGHT UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT UP AND LEFT;;;; 2519;BOX DRAWINGS UP LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT HEAVY;;;; 251A;BOX DRAWINGS UP HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT LIGHT;;;; 251B;BOX DRAWINGS HEAVY UP AND LEFT;So;0;ON;;;;;N;FORMS HEAVY UP AND LEFT;;;; 251C;BOX DRAWINGS LIGHT VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND RIGHT;;;; 251D;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND RIGHT HEAVY;;;; 251E;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT DOWN LIGHT;;;; 251F;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT UP LIGHT;;;; 2520;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND RIGHT LIGHT;;;; 2521;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT UP HEAVY;;;; 2522;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT DOWN HEAVY;;;; 2523;BOX DRAWINGS HEAVY VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND RIGHT;;;; 2524;BOX DRAWINGS LIGHT VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND LEFT;;;; 2525;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND LEFT HEAVY;;;; 2526;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT DOWN LIGHT;;;; 2527;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT UP LIGHT;;;; 2528;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND LEFT LIGHT;;;; 2529;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT UP HEAVY;;;; 252A;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT DOWN HEAVY;;;; 252B;BOX DRAWINGS HEAVY VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND LEFT;;;; 252C;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOWN AND HORIZONTAL;;;; 252D;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT DOWN LIGHT;;;; 252E;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT DOWN LIGHT;;;; 252F;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND HORIZONTAL HEAVY;;;; 2530;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND HORIZONTAL LIGHT;;;; 2531;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT DOWN HEAVY;;;; 2532;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT DOWN HEAVY;;;; 2533;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOWN AND HORIZONTAL;;;; 2534;BOX DRAWINGS LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT UP AND HORIZONTAL;;;; 2535;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT UP LIGHT;;;; 2536;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT UP LIGHT;;;; 2537;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND HORIZONTAL HEAVY;;;; 2538;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND HORIZONTAL LIGHT;;;; 2539;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT UP HEAVY;;;; 253A;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT UP HEAVY;;;; 253B;BOX DRAWINGS HEAVY UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY UP AND HORIZONTAL;;;; 253C;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND HORIZONTAL;;;; 253D;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT;;;; 253E;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT;;;; 253F;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY;;;; 2540;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT;;;; 2541;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT;;;; 2542;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT;;;; 2543;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT;;;; 2544;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT;;;; 2545;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT;;;; 2546;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT;;;; 2547;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY;;;; 2548;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY;;;; 2549;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY;;;; 254A;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY;;;; 254B;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND HORIZONTAL;;;; 254C;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH HORIZONTAL;;;; 254D;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH HORIZONTAL;;;; 254E;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH VERTICAL;;;; 254F;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH VERTICAL;;;; 2550;BOX DRAWINGS DOUBLE HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE HORIZONTAL;;;; 2551;BOX DRAWINGS DOUBLE VERTICAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL;;;; 2552;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND RIGHT DOUBLE;;;; 2553;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND RIGHT SINGLE;;;; 2554;BOX DRAWINGS DOUBLE DOWN AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND RIGHT;;;; 2555;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND LEFT DOUBLE;;;; 2556;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND LEFT SINGLE;;;; 2557;BOX DRAWINGS DOUBLE DOWN AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND LEFT;;;; 2558;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND RIGHT DOUBLE;;;; 2559;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND RIGHT SINGLE;;;; 255A;BOX DRAWINGS DOUBLE UP AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE UP AND RIGHT;;;; 255B;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND LEFT DOUBLE;;;; 255C;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND LEFT SINGLE;;;; 255D;BOX DRAWINGS DOUBLE UP AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE UP AND LEFT;;;; 255E;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND RIGHT DOUBLE;;;; 255F;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND RIGHT SINGLE;;;; 2560;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND RIGHT;;;; 2561;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND LEFT DOUBLE;;;; 2562;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND LEFT SINGLE;;;; 2563;BOX DRAWINGS DOUBLE VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND LEFT;;;; 2564;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND HORIZONTAL DOUBLE;;;; 2565;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND HORIZONTAL SINGLE;;;; 2566;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND HORIZONTAL;;;; 2567;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND HORIZONTAL DOUBLE;;;; 2568;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND HORIZONTAL SINGLE;;;; 2569;BOX DRAWINGS DOUBLE UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE UP AND HORIZONTAL;;;; 256A;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE;;;; 256B;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE;;;; 256C;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND HORIZONTAL;;;; 256D;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND RIGHT;;;; 256E;BOX DRAWINGS LIGHT ARC DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND LEFT;;;; 256F;BOX DRAWINGS LIGHT ARC UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND LEFT;;;; 2570;BOX DRAWINGS LIGHT ARC UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND RIGHT;;;; 2571;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;;;; 2572;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;;;; 2573;BOX DRAWINGS LIGHT DIAGONAL CROSS;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL CROSS;;;; 2574;BOX DRAWINGS LIGHT LEFT;So;0;ON;;;;;N;FORMS LIGHT LEFT;;;; 2575;BOX DRAWINGS LIGHT UP;So;0;ON;;;;;N;FORMS LIGHT UP;;;; 2576;BOX DRAWINGS LIGHT RIGHT;So;0;ON;;;;;N;FORMS LIGHT RIGHT;;;; 2577;BOX DRAWINGS LIGHT DOWN;So;0;ON;;;;;N;FORMS LIGHT DOWN;;;; 2578;BOX DRAWINGS HEAVY LEFT;So;0;ON;;;;;N;FORMS HEAVY LEFT;;;; 2579;BOX DRAWINGS HEAVY UP;So;0;ON;;;;;N;FORMS HEAVY UP;;;; 257A;BOX DRAWINGS HEAVY RIGHT;So;0;ON;;;;;N;FORMS HEAVY RIGHT;;;; 257B;BOX DRAWINGS HEAVY DOWN;So;0;ON;;;;;N;FORMS HEAVY DOWN;;;; 257C;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT;So;0;ON;;;;;N;FORMS LIGHT LEFT AND HEAVY RIGHT;;;; 257D;BOX DRAWINGS LIGHT UP AND HEAVY DOWN;So;0;ON;;;;;N;FORMS LIGHT UP AND HEAVY DOWN;;;; 257E;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT;So;0;ON;;;;;N;FORMS HEAVY LEFT AND LIGHT RIGHT;;;; 257F;BOX DRAWINGS HEAVY UP AND LIGHT DOWN;So;0;ON;;;;;N;FORMS HEAVY UP AND LIGHT DOWN;;;; 2580;UPPER HALF BLOCK;So;0;ON;;;;;N;;;;; 2581;LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; 2582;LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; 2583;LOWER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; 2584;LOWER HALF BLOCK;So;0;ON;;;;;N;;;;; 2585;LOWER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; 2586;LOWER THREE QUARTERS BLOCK;So;0;ON;;;;;N;LOWER THREE QUARTER BLOCK;;;; 2587;LOWER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; 2588;FULL BLOCK;So;0;ON;;;;;N;;;;; 2589;LEFT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; 258A;LEFT THREE QUARTERS BLOCK;So;0;ON;;;;;N;LEFT THREE QUARTER BLOCK;;;; 258B;LEFT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; 258C;LEFT HALF BLOCK;So;0;ON;;;;;N;;;;; 258D;LEFT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; 258E;LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; 258F;LEFT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; 2590;RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;; 2591;LIGHT SHADE;So;0;ON;;;;;N;;;;; 2592;MEDIUM SHADE;So;0;ON;;;;;N;;;;; 2593;DARK SHADE;So;0;ON;;;;;N;;;;; 2594;UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; 2595;RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; 2596;QUADRANT LOWER LEFT;So;0;ON;;;;;N;;;;; 2597;QUADRANT LOWER RIGHT;So;0;ON;;;;;N;;;;; 2598;QUADRANT UPPER LEFT;So;0;ON;;;;;N;;;;; 2599;QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; 259A;QUADRANT UPPER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; 259B;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;; 259C;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; 259D;QUADRANT UPPER RIGHT;So;0;ON;;;;;N;;;;; 259E;QUADRANT UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;; 259F;QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; 25A0;BLACK SQUARE;So;0;ON;;;;;N;;;;; 25A1;WHITE SQUARE;So;0;ON;;;;;N;;;;; 25A2;WHITE SQUARE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; 25A3;WHITE SQUARE CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; 25A4;SQUARE WITH HORIZONTAL FILL;So;0;ON;;;;;N;;;;; 25A5;SQUARE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; 25A6;SQUARE WITH ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; 25A7;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;; 25A8;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;; 25A9;SQUARE WITH DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; 25AA;BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; 25AB;WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;; 25AC;BLACK RECTANGLE;So;0;ON;;;;;N;;;;; 25AD;WHITE RECTANGLE;So;0;ON;;;;;N;;;;; 25AE;BLACK VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; 25AF;WHITE VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; 25B0;BLACK PARALLELOGRAM;So;0;ON;;;;;N;;;;; 25B1;WHITE PARALLELOGRAM;So;0;ON;;;;;N;;;;; 25B2;BLACK UP-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING TRIANGLE;;;; 25B3;WHITE UP-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE;;;; 25B4;BLACK UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING SMALL TRIANGLE;;;; 25B5;WHITE UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING SMALL TRIANGLE;;;; 25B6;BLACK RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING TRIANGLE;;;; 25B7;WHITE RIGHT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE RIGHT POINTING TRIANGLE;;;; 25B8;BLACK RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING SMALL TRIANGLE;;;; 25B9;WHITE RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE RIGHT POINTING SMALL TRIANGLE;;;; 25BA;BLACK RIGHT-POINTING POINTER;So;0;ON;;;;;N;BLACK RIGHT POINTING POINTER;;;; 25BB;WHITE RIGHT-POINTING POINTER;So;0;ON;;;;;N;WHITE RIGHT POINTING POINTER;;;; 25BC;BLACK DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING TRIANGLE;;;; 25BD;WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING TRIANGLE;;;; 25BE;BLACK DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING SMALL TRIANGLE;;;; 25BF;WHITE DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING SMALL TRIANGLE;;;; 25C0;BLACK LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING TRIANGLE;;;; 25C1;WHITE LEFT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE LEFT POINTING TRIANGLE;;;; 25C2;BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING SMALL TRIANGLE;;;; 25C3;WHITE LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE LEFT POINTING SMALL TRIANGLE;;;; 25C4;BLACK LEFT-POINTING POINTER;So;0;ON;;;;;N;BLACK LEFT POINTING POINTER;;;; 25C5;WHITE LEFT-POINTING POINTER;So;0;ON;;;;;N;WHITE LEFT POINTING POINTER;;;; 25C6;BLACK DIAMOND;So;0;ON;;;;;N;;;;; 25C7;WHITE DIAMOND;So;0;ON;;;;;N;;;;; 25C8;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; 25C9;FISHEYE;So;0;ON;;;;;N;;;;; 25CA;LOZENGE;So;0;ON;;;;;N;;;;; 25CB;WHITE CIRCLE;So;0;ON;;;;;N;;;;; 25CC;DOTTED CIRCLE;So;0;ON;;;;;N;;;;; 25CD;CIRCLE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; 25CE;BULLSEYE;So;0;ON;;;;;N;;;;; 25CF;BLACK CIRCLE;So;0;ON;;;;;N;;;;; 25D0;CIRCLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; 25D1;CIRCLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; 25D2;CIRCLE WITH LOWER HALF BLACK;So;0;ON;;;;;N;;;;; 25D3;CIRCLE WITH UPPER HALF BLACK;So;0;ON;;;;;N;;;;; 25D4;CIRCLE WITH UPPER RIGHT QUADRANT BLACK;So;0;ON;;;;;N;;;;; 25D5;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK;So;0;ON;;;;;N;;;;; 25D6;LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; 25D7;RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; 25D8;INVERSE BULLET;So;0;ON;;;;;N;;;;; 25D9;INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; 25DA;UPPER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; 25DB;LOWER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; 25DC;UPPER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; 25DD;UPPER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; 25DE;LOWER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; 25DF;LOWER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; 25E0;UPPER HALF CIRCLE;So;0;ON;;;;;N;;;;; 25E1;LOWER HALF CIRCLE;So;0;ON;;;;;N;;;;; 25E2;BLACK LOWER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; 25E3;BLACK LOWER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; 25E4;BLACK UPPER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; 25E5;BLACK UPPER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; 25E6;WHITE BULLET;So;0;ON;;;;;N;;;;; 25E7;SQUARE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; 25E8;SQUARE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; 25E9;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; 25EA;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; 25EB;WHITE SQUARE WITH VERTICAL BISECTING LINE;So;0;ON;;;;;N;;;;; 25EC;WHITE UP-POINTING TRIANGLE WITH DOT;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE WITH DOT;;;; 25ED;UP-POINTING TRIANGLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH LEFT HALF BLACK;;;; 25EE;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH RIGHT HALF BLACK;;;; 25EF;LARGE CIRCLE;So;0;ON;;;;;N;;;;; 25F0;WHITE SQUARE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; 25F1;WHITE SQUARE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; 25F2;WHITE SQUARE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; 25F3;WHITE SQUARE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; 25F4;WHITE CIRCLE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; 25F5;WHITE CIRCLE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; 25F6;WHITE CIRCLE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; 25F7;WHITE CIRCLE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; 25F8;UPPER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;; 25F9;UPPER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;; 25FA;LOWER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;; 25FB;WHITE MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;; 25FC;BLACK MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;; 25FD;WHITE MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;; 25FE;BLACK MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;; 25FF;LOWER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;; 2600;BLACK SUN WITH RAYS;So;0;ON;;;;;N;;;;; 2601;CLOUD;So;0;ON;;;;;N;;;;; 2602;UMBRELLA;So;0;ON;;;;;N;;;;; 2603;SNOWMAN;So;0;ON;;;;;N;;;;; 2604;COMET;So;0;ON;;;;;N;;;;; 2605;BLACK STAR;So;0;ON;;;;;N;;;;; 2606;WHITE STAR;So;0;ON;;;;;N;;;;; 2607;LIGHTNING;So;0;ON;;;;;N;;;;; 2608;THUNDERSTORM;So;0;ON;;;;;N;;;;; 2609;SUN;So;0;ON;;;;;N;;;;; 260A;ASCENDING NODE;So;0;ON;;;;;N;;;;; 260B;DESCENDING NODE;So;0;ON;;;;;N;;;;; 260C;CONJUNCTION;So;0;ON;;;;;N;;;;; 260D;OPPOSITION;So;0;ON;;;;;N;;;;; 260E;BLACK TELEPHONE;So;0;ON;;;;;N;;;;; 260F;WHITE TELEPHONE;So;0;ON;;;;;N;;;;; 2610;BALLOT BOX;So;0;ON;;;;;N;;;;; 2611;BALLOT BOX WITH CHECK;So;0;ON;;;;;N;;;;; 2612;BALLOT BOX WITH X;So;0;ON;;;;;N;;;;; 2613;SALTIRE;So;0;ON;;;;;N;;;;; 2614;UMBRELLA WITH RAIN DROPS;So;0;ON;;;;;N;;;;; 2615;HOT BEVERAGE;So;0;ON;;;;;N;;;;; 2616;WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; 2617;BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; 2618;SHAMROCK;So;0;ON;;;;;N;;;;; 2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; 261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; 261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; 261C;WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; 261D;WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; 261E;WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; 261F;WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; 2620;SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; 2621;CAUTION SIGN;So;0;ON;;;;;N;;;;; 2622;RADIOACTIVE SIGN;So;0;ON;;;;;N;;;;; 2623;BIOHAZARD SIGN;So;0;ON;;;;;N;;;;; 2624;CADUCEUS;So;0;ON;;;;;N;;;;; 2625;ANKH;So;0;ON;;;;;N;;;;; 2626;ORTHODOX CROSS;So;0;ON;;;;;N;;;;; 2627;CHI RHO;So;0;ON;;;;;N;;;;; 2628;CROSS OF LORRAINE;So;0;ON;;;;;N;;;;; 2629;CROSS OF JERUSALEM;So;0;ON;;;;;N;;;;; 262A;STAR AND CRESCENT;So;0;ON;;;;;N;;;;; 262B;FARSI SYMBOL;So;0;ON;;;;;N;SYMBOL OF IRAN;;;; 262C;ADI SHAKTI;So;0;ON;;;;;N;;;;; 262D;HAMMER AND SICKLE;So;0;ON;;;;;N;;;;; 262E;PEACE SYMBOL;So;0;ON;;;;;N;;;;; 262F;YIN YANG;So;0;ON;;;;;N;;;;; 2630;TRIGRAM FOR HEAVEN;So;0;ON;;;;;N;;;;; 2631;TRIGRAM FOR LAKE;So;0;ON;;;;;N;;;;; 2632;TRIGRAM FOR FIRE;So;0;ON;;;;;N;;;;; 2633;TRIGRAM FOR THUNDER;So;0;ON;;;;;N;;;;; 2634;TRIGRAM FOR WIND;So;0;ON;;;;;N;;;;; 2635;TRIGRAM FOR WATER;So;0;ON;;;;;N;;;;; 2636;TRIGRAM FOR MOUNTAIN;So;0;ON;;;;;N;;;;; 2637;TRIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; 2638;WHEEL OF DHARMA;So;0;ON;;;;;N;;;;; 2639;WHITE FROWNING FACE;So;0;ON;;;;;N;;;;; 263A;WHITE SMILING FACE;So;0;ON;;;;;N;;;;; 263B;BLACK SMILING FACE;So;0;ON;;;;;N;;;;; 263C;WHITE SUN WITH RAYS;So;0;ON;;;;;N;;;;; 263D;FIRST QUARTER MOON;So;0;ON;;;;;N;;;;; 263E;LAST QUARTER MOON;So;0;ON;;;;;N;;;;; 263F;MERCURY;So;0;ON;;;;;N;;;;; 2640;FEMALE SIGN;So;0;ON;;;;;N;;;;; 2641;EARTH;So;0;ON;;;;;N;;;;; 2642;MALE SIGN;So;0;ON;;;;;N;;;;; 2643;JUPITER;So;0;ON;;;;;N;;;;; 2644;SATURN;So;0;ON;;;;;N;;;;; 2645;URANUS;So;0;ON;;;;;N;;;;; 2646;NEPTUNE;So;0;ON;;;;;N;;;;; 2647;PLUTO;So;0;ON;;;;;N;;;;; 2648;ARIES;So;0;ON;;;;;N;;;;; 2649;TAURUS;So;0;ON;;;;;N;;;;; 264A;GEMINI;So;0;ON;;;;;N;;;;; 264B;CANCER;So;0;ON;;;;;N;;;;; 264C;LEO;So;0;ON;;;;;N;;;;; 264D;VIRGO;So;0;ON;;;;;N;;;;; 264E;LIBRA;So;0;ON;;;;;N;;;;; 264F;SCORPIUS;So;0;ON;;;;;N;;;;; 2650;SAGITTARIUS;So;0;ON;;;;;N;;;;; 2651;CAPRICORN;So;0;ON;;;;;N;;;;; 2652;AQUARIUS;So;0;ON;;;;;N;;;;; 2653;PISCES;So;0;ON;;;;;N;;;;; 2654;WHITE CHESS KING;So;0;ON;;;;;N;;;;; 2655;WHITE CHESS QUEEN;So;0;ON;;;;;N;;;;; 2656;WHITE CHESS ROOK;So;0;ON;;;;;N;;;;; 2657;WHITE CHESS BISHOP;So;0;ON;;;;;N;;;;; 2658;WHITE CHESS KNIGHT;So;0;ON;;;;;N;;;;; 2659;WHITE CHESS PAWN;So;0;ON;;;;;N;;;;; 265A;BLACK CHESS KING;So;0;ON;;;;;N;;;;; 265B;BLACK CHESS QUEEN;So;0;ON;;;;;N;;;;; 265C;BLACK CHESS ROOK;So;0;ON;;;;;N;;;;; 265D;BLACK CHESS BISHOP;So;0;ON;;;;;N;;;;; 265E;BLACK CHESS KNIGHT;So;0;ON;;;;;N;;;;; 265F;BLACK CHESS PAWN;So;0;ON;;;;;N;;;;; 2660;BLACK SPADE SUIT;So;0;ON;;;;;N;;;;; 2661;WHITE HEART SUIT;So;0;ON;;;;;N;;;;; 2662;WHITE DIAMOND SUIT;So;0;ON;;;;;N;;;;; 2663;BLACK CLUB SUIT;So;0;ON;;;;;N;;;;; 2664;WHITE SPADE SUIT;So;0;ON;;;;;N;;;;; 2665;BLACK HEART SUIT;So;0;ON;;;;;N;;;;; 2666;BLACK DIAMOND SUIT;So;0;ON;;;;;N;;;;; 2667;WHITE CLUB SUIT;So;0;ON;;;;;N;;;;; 2668;HOT SPRINGS;So;0;ON;;;;;N;;;;; 2669;QUARTER NOTE;So;0;ON;;;;;N;;;;; 266A;EIGHTH NOTE;So;0;ON;;;;;N;;;;; 266B;BEAMED EIGHTH NOTES;So;0;ON;;;;;N;BARRED EIGHTH NOTES;;;; 266C;BEAMED SIXTEENTH NOTES;So;0;ON;;;;;N;BARRED SIXTEENTH NOTES;;;; 266D;MUSIC FLAT SIGN;So;0;ON;;;;;N;FLAT;;;; 266E;MUSIC NATURAL SIGN;So;0;ON;;;;;N;NATURAL;;;; 266F;MUSIC SHARP SIGN;Sm;0;ON;;;;;N;SHARP;;;; 2670;WEST SYRIAC CROSS;So;0;ON;;;;;N;;;;; 2671;EAST SYRIAC CROSS;So;0;ON;;;;;N;;;;; 2672;UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; 2673;RECYCLING SYMBOL FOR TYPE-1 PLASTICS;So;0;ON;;;;;N;;;;; 2674;RECYCLING SYMBOL FOR TYPE-2 PLASTICS;So;0;ON;;;;;N;;;;; 2675;RECYCLING SYMBOL FOR TYPE-3 PLASTICS;So;0;ON;;;;;N;;;;; 2676;RECYCLING SYMBOL FOR TYPE-4 PLASTICS;So;0;ON;;;;;N;;;;; 2677;RECYCLING SYMBOL FOR TYPE-5 PLASTICS;So;0;ON;;;;;N;;;;; 2678;RECYCLING SYMBOL FOR TYPE-6 PLASTICS;So;0;ON;;;;;N;;;;; 2679;RECYCLING SYMBOL FOR TYPE-7 PLASTICS;So;0;ON;;;;;N;;;;; 267A;RECYCLING SYMBOL FOR GENERIC MATERIALS;So;0;ON;;;;;N;;;;; 267B;BLACK UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; 267C;RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; 267D;PARTIALLY-RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; 267E;PERMANENT PAPER SIGN;So;0;ON;;;;;N;;;;; 267F;WHEELCHAIR SYMBOL;So;0;ON;;;;;N;;;;; 2680;DIE FACE-1;So;0;ON;;;;;N;;;;; 2681;DIE FACE-2;So;0;ON;;;;;N;;;;; 2682;DIE FACE-3;So;0;ON;;;;;N;;;;; 2683;DIE FACE-4;So;0;ON;;;;;N;;;;; 2684;DIE FACE-5;So;0;ON;;;;;N;;;;; 2685;DIE FACE-6;So;0;ON;;;;;N;;;;; 2686;WHITE CIRCLE WITH DOT RIGHT;So;0;ON;;;;;N;;;;; 2687;WHITE CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;; 2688;BLACK CIRCLE WITH WHITE DOT RIGHT;So;0;ON;;;;;N;;;;; 2689;BLACK CIRCLE WITH TWO WHITE DOTS;So;0;ON;;;;;N;;;;; 268A;MONOGRAM FOR YANG;So;0;ON;;;;;N;;;;; 268B;MONOGRAM FOR YIN;So;0;ON;;;;;N;;;;; 268C;DIGRAM FOR GREATER YANG;So;0;ON;;;;;N;;;;; 268D;DIGRAM FOR LESSER YIN;So;0;ON;;;;;N;;;;; 268E;DIGRAM FOR LESSER YANG;So;0;ON;;;;;N;;;;; 268F;DIGRAM FOR GREATER YIN;So;0;ON;;;;;N;;;;; 2690;WHITE FLAG;So;0;ON;;;;;N;;;;; 2691;BLACK FLAG;So;0;ON;;;;;N;;;;; 2692;HAMMER AND PICK;So;0;ON;;;;;N;;;;; 2693;ANCHOR;So;0;ON;;;;;N;;;;; 2694;CROSSED SWORDS;So;0;ON;;;;;N;;;;; 2695;STAFF OF AESCULAPIUS;So;0;ON;;;;;N;;;;; 2696;SCALES;So;0;ON;;;;;N;;;;; 2697;ALEMBIC;So;0;ON;;;;;N;;;;; 2698;FLOWER;So;0;ON;;;;;N;;;;; 2699;GEAR;So;0;ON;;;;;N;;;;; 269A;STAFF OF HERMES;So;0;ON;;;;;N;;;;; 269B;ATOM SYMBOL;So;0;ON;;;;;N;;;;; 269C;FLEUR-DE-LIS;So;0;ON;;;;;N;;;;; 269D;OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; 269E;THREE LINES CONVERGING RIGHT;So;0;ON;;;;;N;;;;; 269F;THREE LINES CONVERGING LEFT;So;0;ON;;;;;N;;;;; 26A0;WARNING SIGN;So;0;ON;;;;;N;;;;; 26A1;HIGH VOLTAGE SIGN;So;0;ON;;;;;N;;;;; 26A2;DOUBLED FEMALE SIGN;So;0;ON;;;;;N;;;;; 26A3;DOUBLED MALE SIGN;So;0;ON;;;;;N;;;;; 26A4;INTERLOCKED FEMALE AND MALE SIGN;So;0;ON;;;;;N;;;;; 26A5;MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; 26A6;MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; 26A7;MALE WITH STROKE AND MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; 26A8;VERTICAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; 26A9;HORIZONTAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; 26AA;MEDIUM WHITE CIRCLE;So;0;ON;;;;;N;;;;; 26AB;MEDIUM BLACK CIRCLE;So;0;ON;;;;;N;;;;; 26AC;MEDIUM SMALL WHITE CIRCLE;So;0;L;;;;;N;;;;; 26AD;MARRIAGE SYMBOL;So;0;ON;;;;;N;;;;; 26AE;DIVORCE SYMBOL;So;0;ON;;;;;N;;;;; 26AF;UNMARRIED PARTNERSHIP SYMBOL;So;0;ON;;;;;N;;;;; 26B0;COFFIN;So;0;ON;;;;;N;;;;; 26B1;FUNERAL URN;So;0;ON;;;;;N;;;;; 26B2;NEUTER;So;0;ON;;;;;N;;;;; 26B3;CERES;So;0;ON;;;;;N;;;;; 26B4;PALLAS;So;0;ON;;;;;N;;;;; 26B5;JUNO;So;0;ON;;;;;N;;;;; 26B6;VESTA;So;0;ON;;;;;N;;;;; 26B7;CHIRON;So;0;ON;;;;;N;;;;; 26B8;BLACK MOON LILITH;So;0;ON;;;;;N;;;;; 26B9;SEXTILE;So;0;ON;;;;;N;;;;; 26BA;SEMISEXTILE;So;0;ON;;;;;N;;;;; 26BB;QUINCUNX;So;0;ON;;;;;N;;;;; 26BC;SESQUIQUADRATE;So;0;ON;;;;;N;;;;; 26BD;SOCCER BALL;So;0;ON;;;;;N;;;;; 26BE;BASEBALL;So;0;ON;;;;;N;;;;; 26BF;SQUARED KEY;So;0;ON;;;;;N;;;;; 26C0;WHITE DRAUGHTS MAN;So;0;ON;;;;;N;;;;; 26C1;WHITE DRAUGHTS KING;So;0;ON;;;;;N;;;;; 26C2;BLACK DRAUGHTS MAN;So;0;ON;;;;;N;;;;; 26C3;BLACK DRAUGHTS KING;So;0;ON;;;;;N;;;;; 26C4;SNOWMAN WITHOUT SNOW;So;0;ON;;;;;N;;;;; 26C5;SUN BEHIND CLOUD;So;0;ON;;;;;N;;;;; 26C6;RAIN;So;0;ON;;;;;N;;;;; 26C7;BLACK SNOWMAN;So;0;ON;;;;;N;;;;; 26C8;THUNDER CLOUD AND RAIN;So;0;ON;;;;;N;;;;; 26C9;TURNED WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; 26CA;TURNED BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; 26CB;WHITE DIAMOND IN SQUARE;So;0;ON;;;;;N;;;;; 26CC;CROSSING LANES;So;0;ON;;;;;N;;;;; 26CD;DISABLED CAR;So;0;ON;;;;;N;;;;; 26CE;OPHIUCHUS;So;0;ON;;;;;N;;;;; 26CF;PICK;So;0;ON;;;;;N;;;;; 26D0;CAR SLIDING;So;0;ON;;;;;N;;;;; 26D1;HELMET WITH WHITE CROSS;So;0;ON;;;;;N;;;;; 26D2;CIRCLED CROSSING LANES;So;0;ON;;;;;N;;;;; 26D3;CHAINS;So;0;ON;;;;;N;;;;; 26D4;NO ENTRY;So;0;ON;;;;;N;;;;; 26D5;ALTERNATE ONE-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; 26D6;BLACK TWO-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; 26D7;WHITE TWO-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; 26D8;BLACK LEFT LANE MERGE;So;0;ON;;;;;N;;;;; 26D9;WHITE LEFT LANE MERGE;So;0;ON;;;;;N;;;;; 26DA;DRIVE SLOW SIGN;So;0;ON;;;;;N;;;;; 26DB;HEAVY WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; 26DC;LEFT CLOSED ENTRY;So;0;ON;;;;;N;;;;; 26DD;SQUARED SALTIRE;So;0;ON;;;;;N;;;;; 26DE;FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE;So;0;ON;;;;;N;;;;; 26DF;BLACK TRUCK;So;0;ON;;;;;N;;;;; 26E0;RESTRICTED LEFT ENTRY-1;So;0;ON;;;;;N;;;;; 26E1;RESTRICTED LEFT ENTRY-2;So;0;ON;;;;;N;;;;; 26E2;ASTRONOMICAL SYMBOL FOR URANUS;So;0;ON;;;;;N;;;;; 26E3;HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE;So;0;ON;;;;;N;;;;; 26E4;PENTAGRAM;So;0;ON;;;;;N;;;;; 26E5;RIGHT-HANDED INTERLACED PENTAGRAM;So;0;ON;;;;;N;;;;; 26E6;LEFT-HANDED INTERLACED PENTAGRAM;So;0;ON;;;;;N;;;;; 26E7;INVERTED PENTAGRAM;So;0;ON;;;;;N;;;;; 26E8;BLACK CROSS ON SHIELD;So;0;ON;;;;;N;;;;; 26E9;SHINTO SHRINE;So;0;ON;;;;;N;;;;; 26EA;CHURCH;So;0;ON;;;;;N;;;;; 26EB;CASTLE;So;0;ON;;;;;N;;;;; 26EC;HISTORIC SITE;So;0;ON;;;;;N;;;;; 26ED;GEAR WITHOUT HUB;So;0;ON;;;;;N;;;;; 26EE;GEAR WITH HANDLES;So;0;ON;;;;;N;;;;; 26EF;MAP SYMBOL FOR LIGHTHOUSE;So;0;ON;;;;;N;;;;; 26F0;MOUNTAIN;So;0;ON;;;;;N;;;;; 26F1;UMBRELLA ON GROUND;So;0;ON;;;;;N;;;;; 26F2;FOUNTAIN;So;0;ON;;;;;N;;;;; 26F3;FLAG IN HOLE;So;0;ON;;;;;N;;;;; 26F4;FERRY;So;0;ON;;;;;N;;;;; 26F5;SAILBOAT;So;0;ON;;;;;N;;;;; 26F6;SQUARE FOUR CORNERS;So;0;ON;;;;;N;;;;; 26F7;SKIER;So;0;ON;;;;;N;;;;; 26F8;ICE SKATE;So;0;ON;;;;;N;;;;; 26F9;PERSON WITH BALL;So;0;ON;;;;;N;;;;; 26FA;TENT;So;0;ON;;;;;N;;;;; 26FB;JAPANESE BANK SYMBOL;So;0;ON;;;;;N;;;;; 26FC;HEADSTONE GRAVEYARD SYMBOL;So;0;ON;;;;;N;;;;; 26FD;FUEL PUMP;So;0;ON;;;;;N;;;;; 26FE;CUP ON BLACK SQUARE;So;0;ON;;;;;N;;;;; 26FF;WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE;So;0;ON;;;;;N;;;;; 2700;BLACK SAFETY SCISSORS;So;0;ON;;;;;N;;;;; 2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;; 2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;; 2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;; 2704;WHITE SCISSORS;So;0;ON;;;;;N;;;;; 2705;WHITE HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; 2706;TELEPHONE LOCATION SIGN;So;0;ON;;;;;N;;;;; 2707;TAPE DRIVE;So;0;ON;;;;;N;;;;; 2708;AIRPLANE;So;0;ON;;;;;N;;;;; 2709;ENVELOPE;So;0;ON;;;;;N;;;;; 270A;RAISED FIST;So;0;ON;;;;;N;;;;; 270B;RAISED HAND;So;0;ON;;;;;N;;;;; 270C;VICTORY HAND;So;0;ON;;;;;N;;;;; 270D;WRITING HAND;So;0;ON;;;;;N;;;;; 270E;LOWER RIGHT PENCIL;So;0;ON;;;;;N;;;;; 270F;PENCIL;So;0;ON;;;;;N;;;;; 2710;UPPER RIGHT PENCIL;So;0;ON;;;;;N;;;;; 2711;WHITE NIB;So;0;ON;;;;;N;;;;; 2712;BLACK NIB;So;0;ON;;;;;N;;;;; 2713;CHECK MARK;So;0;ON;;;;;N;;;;; 2714;HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; 2715;MULTIPLICATION X;So;0;ON;;;;;N;;;;; 2716;HEAVY MULTIPLICATION X;So;0;ON;;;;;N;;;;; 2717;BALLOT X;So;0;ON;;;;;N;;;;; 2718;HEAVY BALLOT X;So;0;ON;;;;;N;;;;; 2719;OUTLINED GREEK CROSS;So;0;ON;;;;;N;;;;; 271A;HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; 271B;OPEN CENTRE CROSS;So;0;ON;;;;;N;OPEN CENTER CROSS;;;; 271C;HEAVY OPEN CENTRE CROSS;So;0;ON;;;;;N;HEAVY OPEN CENTER CROSS;;;; 271D;LATIN CROSS;So;0;ON;;;;;N;;;;; 271E;SHADOWED WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; 271F;OUTLINED LATIN CROSS;So;0;ON;;;;;N;;;;; 2720;MALTESE CROSS;So;0;ON;;;;;N;;;;; 2721;STAR OF DAVID;So;0;ON;;;;;N;;;;; 2722;FOUR TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 2723;FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 2724;HEAVY FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 2725;FOUR CLUB-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 2726;BLACK FOUR POINTED STAR;So;0;ON;;;;;N;;;;; 2727;WHITE FOUR POINTED STAR;So;0;ON;;;;;N;;;;; 2728;SPARKLES;So;0;ON;;;;;N;;;;; 2729;STRESS OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; 272A;CIRCLED WHITE STAR;So;0;ON;;;;;N;;;;; 272B;OPEN CENTRE BLACK STAR;So;0;ON;;;;;N;OPEN CENTER BLACK STAR;;;; 272C;BLACK CENTRE WHITE STAR;So;0;ON;;;;;N;BLACK CENTER WHITE STAR;;;; 272D;OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; 272E;HEAVY OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; 272F;PINWHEEL STAR;So;0;ON;;;;;N;;;;; 2730;SHADOWED WHITE STAR;So;0;ON;;;;;N;;;;; 2731;HEAVY ASTERISK;So;0;ON;;;;;N;;;;; 2732;OPEN CENTRE ASTERISK;So;0;ON;;;;;N;OPEN CENTER ASTERISK;;;; 2733;EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 2734;EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; 2735;EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; 2736;SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; 2737;EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; 2738;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; 2739;TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; 273A;SIXTEEN POINTED ASTERISK;So;0;ON;;;;;N;;;;; 273B;TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 273C;OPEN CENTRE TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;OPEN CENTER TEARDROP-SPOKED ASTERISK;;;; 273D;HEAVY TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 273E;SIX PETALLED BLACK AND WHITE FLORETTE;So;0;ON;;;;;N;;;;; 273F;BLACK FLORETTE;So;0;ON;;;;;N;;;;; 2740;WHITE FLORETTE;So;0;ON;;;;;N;;;;; 2741;EIGHT PETALLED OUTLINED BLACK FLORETTE;So;0;ON;;;;;N;;;;; 2742;CIRCLED OPEN CENTRE EIGHT POINTED STAR;So;0;ON;;;;;N;CIRCLED OPEN CENTER EIGHT POINTED STAR;;;; 2743;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK;So;0;ON;;;;;N;;;;; 2744;SNOWFLAKE;So;0;ON;;;;;N;;;;; 2745;TIGHT TRIFOLIATE SNOWFLAKE;So;0;ON;;;;;N;;;;; 2746;HEAVY CHEVRON SNOWFLAKE;So;0;ON;;;;;N;;;;; 2747;SPARKLE;So;0;ON;;;;;N;;;;; 2748;HEAVY SPARKLE;So;0;ON;;;;;N;;;;; 2749;BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 274A;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; 274B;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; 274C;CROSS MARK;So;0;ON;;;;;N;;;;; 274D;SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; 274E;NEGATIVE SQUARED CROSS MARK;So;0;ON;;;;;N;;;;; 274F;LOWER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; 2750;UPPER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; 2751;LOWER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; 2752;UPPER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; 2753;BLACK QUESTION MARK ORNAMENT;So;0;ON;;;;;N;;;;; 2754;WHITE QUESTION MARK ORNAMENT;So;0;ON;;;;;N;;;;; 2755;WHITE EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; 2756;BLACK DIAMOND MINUS WHITE X;So;0;ON;;;;;N;;;;; 2757;HEAVY EXCLAMATION MARK SYMBOL;So;0;ON;;;;;N;;;;; 2758;LIGHT VERTICAL BAR;So;0;ON;;;;;N;;;;; 2759;MEDIUM VERTICAL BAR;So;0;ON;;;;;N;;;;; 275A;HEAVY VERTICAL BAR;So;0;ON;;;;;N;;;;; 275B;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; 275C;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; 275D;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; 275E;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; 275F;HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; 2760;HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; 2761;CURVED STEM PARAGRAPH SIGN ORNAMENT;So;0;ON;;;;;N;;;;; 2762;HEAVY EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; 2763;HEAVY HEART EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; 2764;HEAVY BLACK HEART;So;0;ON;;;;;N;;;;; 2765;ROTATED HEAVY BLACK HEART BULLET;So;0;ON;;;;;N;;;;; 2766;FLORAL HEART;So;0;ON;;;;;N;;;;; 2767;ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; 2768;MEDIUM LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;; 2769;MEDIUM RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;; 276A;MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;; 276B;MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;; 276C;MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; 276D;MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; 276E;HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT;Ps;0;ON;;;;;Y;;;;; 276F;HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT;Pe;0;ON;;;;;Y;;;;; 2770;HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; 2771;HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; 2772;LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; 2773;LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; 2774;MEDIUM LEFT CURLY BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; 2775;MEDIUM RIGHT CURLY BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; 2776;DINGBAT NEGATIVE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED DIGIT ONE;;;; 2777;DINGBAT NEGATIVE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED DIGIT TWO;;;; 2778;DINGBAT NEGATIVE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED DIGIT THREE;;;; 2779;DINGBAT NEGATIVE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED DIGIT FOUR;;;; 277A;DINGBAT NEGATIVE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED DIGIT FIVE;;;; 277B;DINGBAT NEGATIVE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED DIGIT SIX;;;; 277C;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED DIGIT SEVEN;;;; 277D;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED DIGIT EIGHT;;;; 277E;DINGBAT NEGATIVE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED DIGIT NINE;;;; 277F;DINGBAT NEGATIVE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED NUMBER TEN;;;; 2780;DINGBAT CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;CIRCLED SANS-SERIF DIGIT ONE;;;; 2781;DINGBAT CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;CIRCLED SANS-SERIF DIGIT TWO;;;; 2782;DINGBAT CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;CIRCLED SANS-SERIF DIGIT THREE;;;; 2783;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;CIRCLED SANS-SERIF DIGIT FOUR;;;; 2784;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;CIRCLED SANS-SERIF DIGIT FIVE;;;; 2785;DINGBAT CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;CIRCLED SANS-SERIF DIGIT SIX;;;; 2786;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;CIRCLED SANS-SERIF DIGIT SEVEN;;;; 2787;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;CIRCLED SANS-SERIF DIGIT EIGHT;;;; 2788;DINGBAT CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;CIRCLED SANS-SERIF DIGIT NINE;;;; 2789;DINGBAT CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;CIRCLED SANS-SERIF NUMBER TEN;;;; 278A;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED SANS-SERIF DIGIT ONE;;;; 278B;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED SANS-SERIF DIGIT TWO;;;; 278C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED SANS-SERIF DIGIT THREE;;;; 278D;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED SANS-SERIF DIGIT FOUR;;;; 278E;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED SANS-SERIF DIGIT FIVE;;;; 278F;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED SANS-SERIF DIGIT SIX;;;; 2790;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED SANS-SERIF DIGIT SEVEN;;;; 2791;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED SANS-SERIF DIGIT EIGHT;;;; 2792;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED SANS-SERIF DIGIT NINE;;;; 2793;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED SANS-SERIF NUMBER TEN;;;; 2794;HEAVY WIDE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WIDE-HEADED RIGHT ARROW;;;; 2795;HEAVY PLUS SIGN;So;0;ON;;;;;N;;;;; 2796;HEAVY MINUS SIGN;So;0;ON;;;;;N;;;;; 2797;HEAVY DIVISION SIGN;So;0;ON;;;;;N;;;;; 2798;HEAVY SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT ARROW;;;; 2799;HEAVY RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY RIGHT ARROW;;;; 279A;HEAVY NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT ARROW;;;; 279B;DRAFTING POINT RIGHTWARDS ARROW;So;0;ON;;;;;N;DRAFTING POINT RIGHT ARROW;;;; 279C;HEAVY ROUND-TIPPED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY ROUND-TIPPED RIGHT ARROW;;;; 279D;TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;TRIANGLE-HEADED RIGHT ARROW;;;; 279E;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TRIANGLE-HEADED RIGHT ARROW;;;; 279F;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;DASHED TRIANGLE-HEADED RIGHT ARROW;;;; 27A0;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW;;;; 27A1;BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK RIGHT ARROW;;;; 27A2;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D TOP-LIGHTED RIGHT ARROWHEAD;;;; 27A3;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD;;;; 27A4;BLACK RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;BLACK RIGHT ARROWHEAD;;;; 27A5;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED DOWN AND RIGHT ARROW;;;; 27A6;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED UP AND RIGHT ARROW;;;; 27A7;SQUAT BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;SQUAT BLACK RIGHT ARROW;;;; 27A8;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY CONCAVE-POINTED BLACK RIGHT ARROW;;;; 27A9;RIGHT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;RIGHT-SHADED WHITE RIGHT ARROW;;;; 27AA;LEFT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT-SHADED WHITE RIGHT ARROW;;;; 27AB;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;BACK-TILTED SHADOWED WHITE RIGHT ARROW;;;; 27AC;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;FRONT-TILTED SHADOWED WHITE RIGHT ARROW;;;; 27AD;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; 27AE;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; 27AF;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; 27B0;CURLY LOOP;So;0;ON;;;;;N;;;;; 27B1;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; 27B2;CIRCLED HEAVY WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;CIRCLED HEAVY WHITE RIGHT ARROW;;;; 27B3;WHITE-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;WHITE-FEATHERED RIGHT ARROW;;;; 27B4;BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED LOWER RIGHT ARROW;;;; 27B5;BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK-FEATHERED RIGHT ARROW;;;; 27B6;BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED UPPER RIGHT ARROW;;;; 27B7;HEAVY BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED LOWER RIGHT ARROW;;;; 27B8;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED RIGHT ARROW;;;; 27B9;HEAVY BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED UPPER RIGHT ARROW;;;; 27BA;TEARDROP-BARBED RIGHTWARDS ARROW;So;0;ON;;;;;N;TEARDROP-BARBED RIGHT ARROW;;;; 27BB;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TEARDROP-SHANKED RIGHT ARROW;;;; 27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;; 27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;; 27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;; 27BF;DOUBLE CURLY LOOP;So;0;ON;;;;;N;;;;; 27C0;THREE DIMENSIONAL ANGLE;Sm;0;ON;;;;;Y;;;;; 27C1;WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE;Sm;0;ON;;;;;N;;;;; 27C2;PERPENDICULAR;Sm;0;ON;;;;;N;;;;; 27C3;OPEN SUBSET;Sm;0;ON;;;;;Y;;;;; 27C4;OPEN SUPERSET;Sm;0;ON;;;;;Y;;;;; 27C5;LEFT S-SHAPED BAG DELIMITER;Ps;0;ON;;;;;Y;;;;; 27C6;RIGHT S-SHAPED BAG DELIMITER;Pe;0;ON;;;;;Y;;;;; 27C7;OR WITH DOT INSIDE;Sm;0;ON;;;;;N;;;;; 27C8;REVERSE SOLIDUS PRECEDING SUBSET;Sm;0;ON;;;;;Y;;;;; 27C9;SUPERSET PRECEDING SOLIDUS;Sm;0;ON;;;;;Y;;;;; 27CA;VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; 27CB;MATHEMATICAL RISING DIAGONAL;Sm;0;ON;;;;;Y;;;;; 27CC;LONG DIVISION;Sm;0;ON;;;;;Y;;;;; 27CD;MATHEMATICAL FALLING DIAGONAL;Sm;0;ON;;;;;Y;;;;; 27CE;SQUARED LOGICAL AND;Sm;0;ON;;;;;N;;;;; 27CF;SQUARED LOGICAL OR;Sm;0;ON;;;;;N;;;;; 27D0;WHITE DIAMOND WITH CENTRED DOT;Sm;0;ON;;;;;N;;;;; 27D1;AND WITH DOT;Sm;0;ON;;;;;N;;;;; 27D2;ELEMENT OF OPENING UPWARDS;Sm;0;ON;;;;;N;;;;; 27D3;LOWER RIGHT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;; 27D4;UPPER LEFT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;; 27D5;LEFT OUTER JOIN;Sm;0;ON;;;;;Y;;;;; 27D6;RIGHT OUTER JOIN;Sm;0;ON;;;;;Y;;;;; 27D7;FULL OUTER JOIN;Sm;0;ON;;;;;N;;;;; 27D8;LARGE UP TACK;Sm;0;ON;;;;;N;;;;; 27D9;LARGE DOWN TACK;Sm;0;ON;;;;;N;;;;; 27DA;LEFT AND RIGHT DOUBLE TURNSTILE;Sm;0;ON;;;;;N;;;;; 27DB;LEFT AND RIGHT TACK;Sm;0;ON;;;;;N;;;;; 27DC;LEFT MULTIMAP;Sm;0;ON;;;;;Y;;;;; 27DD;LONG RIGHT TACK;Sm;0;ON;;;;;Y;;;;; 27DE;LONG LEFT TACK;Sm;0;ON;;;;;Y;;;;; 27DF;UP TACK WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; 27E0;LOZENGE DIVIDED BY HORIZONTAL RULE;Sm;0;ON;;;;;N;;;;; 27E1;WHITE CONCAVE-SIDED DIAMOND;Sm;0;ON;;;;;N;;;;; 27E2;WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;; 27E3;WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;; 27E4;WHITE SQUARE WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;; 27E5;WHITE SQUARE WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;; 27E6;MATHEMATICAL LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;;;;; 27E7;MATHEMATICAL RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;;;;; 27E8;MATHEMATICAL LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; 27E9;MATHEMATICAL RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; 27EA;MATHEMATICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; 27EB;MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; 27EC;MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; 27ED;MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; 27EE;MATHEMATICAL LEFT FLATTENED PARENTHESIS;Ps;0;ON;;;;;Y;;;;; 27EF;MATHEMATICAL RIGHT FLATTENED PARENTHESIS;Pe;0;ON;;;;;Y;;;;; 27F0;UPWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; 27F1;DOWNWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; 27F2;ANTICLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; 27F3;CLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; 27F4;RIGHT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; 27F5;LONG LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; 27F6;LONG RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; 27F7;LONG LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; 27F8;LONG LEFTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; 27F9;LONG RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; 27FA;LONG LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; 27FB;LONG LEFTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; 27FC;LONG RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; 27FD;LONG LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; 27FE;LONG RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; 27FF;LONG RIGHTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; 2800;BRAILLE PATTERN BLANK;So;0;L;;;;;N;;;;; 2801;BRAILLE PATTERN DOTS-1;So;0;L;;;;;N;;;;; 2802;BRAILLE PATTERN DOTS-2;So;0;L;;;;;N;;;;; 2803;BRAILLE PATTERN DOTS-12;So;0;L;;;;;N;;;;; 2804;BRAILLE PATTERN DOTS-3;So;0;L;;;;;N;;;;; 2805;BRAILLE PATTERN DOTS-13;So;0;L;;;;;N;;;;; 2806;BRAILLE PATTERN DOTS-23;So;0;L;;;;;N;;;;; 2807;BRAILLE PATTERN DOTS-123;So;0;L;;;;;N;;;;; 2808;BRAILLE PATTERN DOTS-4;So;0;L;;;;;N;;;;; 2809;BRAILLE PATTERN DOTS-14;So;0;L;;;;;N;;;;; 280A;BRAILLE PATTERN DOTS-24;So;0;L;;;;;N;;;;; 280B;BRAILLE PATTERN DOTS-124;So;0;L;;;;;N;;;;; 280C;BRAILLE PATTERN DOTS-34;So;0;L;;;;;N;;;;; 280D;BRAILLE PATTERN DOTS-134;So;0;L;;;;;N;;;;; 280E;BRAILLE PATTERN DOTS-234;So;0;L;;;;;N;;;;; 280F;BRAILLE PATTERN DOTS-1234;So;0;L;;;;;N;;;;; 2810;BRAILLE PATTERN DOTS-5;So;0;L;;;;;N;;;;; 2811;BRAILLE PATTERN DOTS-15;So;0;L;;;;;N;;;;; 2812;BRAILLE PATTERN DOTS-25;So;0;L;;;;;N;;;;; 2813;BRAILLE PATTERN DOTS-125;So;0;L;;;;;N;;;;; 2814;BRAILLE PATTERN DOTS-35;So;0;L;;;;;N;;;;; 2815;BRAILLE PATTERN DOTS-135;So;0;L;;;;;N;;;;; 2816;BRAILLE PATTERN DOTS-235;So;0;L;;;;;N;;;;; 2817;BRAILLE PATTERN DOTS-1235;So;0;L;;;;;N;;;;; 2818;BRAILLE PATTERN DOTS-45;So;0;L;;;;;N;;;;; 2819;BRAILLE PATTERN DOTS-145;So;0;L;;;;;N;;;;; 281A;BRAILLE PATTERN DOTS-245;So;0;L;;;;;N;;;;; 281B;BRAILLE PATTERN DOTS-1245;So;0;L;;;;;N;;;;; 281C;BRAILLE PATTERN DOTS-345;So;0;L;;;;;N;;;;; 281D;BRAILLE PATTERN DOTS-1345;So;0;L;;;;;N;;;;; 281E;BRAILLE PATTERN DOTS-2345;So;0;L;;;;;N;;;;; 281F;BRAILLE PATTERN DOTS-12345;So;0;L;;;;;N;;;;; 2820;BRAILLE PATTERN DOTS-6;So;0;L;;;;;N;;;;; 2821;BRAILLE PATTERN DOTS-16;So;0;L;;;;;N;;;;; 2822;BRAILLE PATTERN DOTS-26;So;0;L;;;;;N;;;;; 2823;BRAILLE PATTERN DOTS-126;So;0;L;;;;;N;;;;; 2824;BRAILLE PATTERN DOTS-36;So;0;L;;;;;N;;;;; 2825;BRAILLE PATTERN DOTS-136;So;0;L;;;;;N;;;;; 2826;BRAILLE PATTERN DOTS-236;So;0;L;;;;;N;;;;; 2827;BRAILLE PATTERN DOTS-1236;So;0;L;;;;;N;;;;; 2828;BRAILLE PATTERN DOTS-46;So;0;L;;;;;N;;;;; 2829;BRAILLE PATTERN DOTS-146;So;0;L;;;;;N;;;;; 282A;BRAILLE PATTERN DOTS-246;So;0;L;;;;;N;;;;; 282B;BRAILLE PATTERN DOTS-1246;So;0;L;;;;;N;;;;; 282C;BRAILLE PATTERN DOTS-346;So;0;L;;;;;N;;;;; 282D;BRAILLE PATTERN DOTS-1346;So;0;L;;;;;N;;;;; 282E;BRAILLE PATTERN DOTS-2346;So;0;L;;;;;N;;;;; 282F;BRAILLE PATTERN DOTS-12346;So;0;L;;;;;N;;;;; 2830;BRAILLE PATTERN DOTS-56;So;0;L;;;;;N;;;;; 2831;BRAILLE PATTERN DOTS-156;So;0;L;;;;;N;;;;; 2832;BRAILLE PATTERN DOTS-256;So;0;L;;;;;N;;;;; 2833;BRAILLE PATTERN DOTS-1256;So;0;L;;;;;N;;;;; 2834;BRAILLE PATTERN DOTS-356;So;0;L;;;;;N;;;;; 2835;BRAILLE PATTERN DOTS-1356;So;0;L;;;;;N;;;;; 2836;BRAILLE PATTERN DOTS-2356;So;0;L;;;;;N;;;;; 2837;BRAILLE PATTERN DOTS-12356;So;0;L;;;;;N;;;;; 2838;BRAILLE PATTERN DOTS-456;So;0;L;;;;;N;;;;; 2839;BRAILLE PATTERN DOTS-1456;So;0;L;;;;;N;;;;; 283A;BRAILLE PATTERN DOTS-2456;So;0;L;;;;;N;;;;; 283B;BRAILLE PATTERN DOTS-12456;So;0;L;;;;;N;;;;; 283C;BRAILLE PATTERN DOTS-3456;So;0;L;;;;;N;;;;; 283D;BRAILLE PATTERN DOTS-13456;So;0;L;;;;;N;;;;; 283E;BRAILLE PATTERN DOTS-23456;So;0;L;;;;;N;;;;; 283F;BRAILLE PATTERN DOTS-123456;So;0;L;;;;;N;;;;; 2840;BRAILLE PATTERN DOTS-7;So;0;L;;;;;N;;;;; 2841;BRAILLE PATTERN DOTS-17;So;0;L;;;;;N;;;;; 2842;BRAILLE PATTERN DOTS-27;So;0;L;;;;;N;;;;; 2843;BRAILLE PATTERN DOTS-127;So;0;L;;;;;N;;;;; 2844;BRAILLE PATTERN DOTS-37;So;0;L;;;;;N;;;;; 2845;BRAILLE PATTERN DOTS-137;So;0;L;;;;;N;;;;; 2846;BRAILLE PATTERN DOTS-237;So;0;L;;;;;N;;;;; 2847;BRAILLE PATTERN DOTS-1237;So;0;L;;;;;N;;;;; 2848;BRAILLE PATTERN DOTS-47;So;0;L;;;;;N;;;;; 2849;BRAILLE PATTERN DOTS-147;So;0;L;;;;;N;;;;; 284A;BRAILLE PATTERN DOTS-247;So;0;L;;;;;N;;;;; 284B;BRAILLE PATTERN DOTS-1247;So;0;L;;;;;N;;;;; 284C;BRAILLE PATTERN DOTS-347;So;0;L;;;;;N;;;;; 284D;BRAILLE PATTERN DOTS-1347;So;0;L;;;;;N;;;;; 284E;BRAILLE PATTERN DOTS-2347;So;0;L;;;;;N;;;;; 284F;BRAILLE PATTERN DOTS-12347;So;0;L;;;;;N;;;;; 2850;BRAILLE PATTERN DOTS-57;So;0;L;;;;;N;;;;; 2851;BRAILLE PATTERN DOTS-157;So;0;L;;;;;N;;;;; 2852;BRAILLE PATTERN DOTS-257;So;0;L;;;;;N;;;;; 2853;BRAILLE PATTERN DOTS-1257;So;0;L;;;;;N;;;;; 2854;BRAILLE PATTERN DOTS-357;So;0;L;;;;;N;;;;; 2855;BRAILLE PATTERN DOTS-1357;So;0;L;;;;;N;;;;; 2856;BRAILLE PATTERN DOTS-2357;So;0;L;;;;;N;;;;; 2857;BRAILLE PATTERN DOTS-12357;So;0;L;;;;;N;;;;; 2858;BRAILLE PATTERN DOTS-457;So;0;L;;;;;N;;;;; 2859;BRAILLE PATTERN DOTS-1457;So;0;L;;;;;N;;;;; 285A;BRAILLE PATTERN DOTS-2457;So;0;L;;;;;N;;;;; 285B;BRAILLE PATTERN DOTS-12457;So;0;L;;;;;N;;;;; 285C;BRAILLE PATTERN DOTS-3457;So;0;L;;;;;N;;;;; 285D;BRAILLE PATTERN DOTS-13457;So;0;L;;;;;N;;;;; 285E;BRAILLE PATTERN DOTS-23457;So;0;L;;;;;N;;;;; 285F;BRAILLE PATTERN DOTS-123457;So;0;L;;;;;N;;;;; 2860;BRAILLE PATTERN DOTS-67;So;0;L;;;;;N;;;;; 2861;BRAILLE PATTERN DOTS-167;So;0;L;;;;;N;;;;; 2862;BRAILLE PATTERN DOTS-267;So;0;L;;;;;N;;;;; 2863;BRAILLE PATTERN DOTS-1267;So;0;L;;;;;N;;;;; 2864;BRAILLE PATTERN DOTS-367;So;0;L;;;;;N;;;;; 2865;BRAILLE PATTERN DOTS-1367;So;0;L;;;;;N;;;;; 2866;BRAILLE PATTERN DOTS-2367;So;0;L;;;;;N;;;;; 2867;BRAILLE PATTERN DOTS-12367;So;0;L;;;;;N;;;;; 2868;BRAILLE PATTERN DOTS-467;So;0;L;;;;;N;;;;; 2869;BRAILLE PATTERN DOTS-1467;So;0;L;;;;;N;;;;; 286A;BRAILLE PATTERN DOTS-2467;So;0;L;;;;;N;;;;; 286B;BRAILLE PATTERN DOTS-12467;So;0;L;;;;;N;;;;; 286C;BRAILLE PATTERN DOTS-3467;So;0;L;;;;;N;;;;; 286D;BRAILLE PATTERN DOTS-13467;So;0;L;;;;;N;;;;; 286E;BRAILLE PATTERN DOTS-23467;So;0;L;;;;;N;;;;; 286F;BRAILLE PATTERN DOTS-123467;So;0;L;;;;;N;;;;; 2870;BRAILLE PATTERN DOTS-567;So;0;L;;;;;N;;;;; 2871;BRAILLE PATTERN DOTS-1567;So;0;L;;;;;N;;;;; 2872;BRAILLE PATTERN DOTS-2567;So;0;L;;;;;N;;;;; 2873;BRAILLE PATTERN DOTS-12567;So;0;L;;;;;N;;;;; 2874;BRAILLE PATTERN DOTS-3567;So;0;L;;;;;N;;;;; 2875;BRAILLE PATTERN DOTS-13567;So;0;L;;;;;N;;;;; 2876;BRAILLE PATTERN DOTS-23567;So;0;L;;;;;N;;;;; 2877;BRAILLE PATTERN DOTS-123567;So;0;L;;;;;N;;;;; 2878;BRAILLE PATTERN DOTS-4567;So;0;L;;;;;N;;;;; 2879;BRAILLE PATTERN DOTS-14567;So;0;L;;;;;N;;;;; 287A;BRAILLE PATTERN DOTS-24567;So;0;L;;;;;N;;;;; 287B;BRAILLE PATTERN DOTS-124567;So;0;L;;;;;N;;;;; 287C;BRAILLE PATTERN DOTS-34567;So;0;L;;;;;N;;;;; 287D;BRAILLE PATTERN DOTS-134567;So;0;L;;;;;N;;;;; 287E;BRAILLE PATTERN DOTS-234567;So;0;L;;;;;N;;;;; 287F;BRAILLE PATTERN DOTS-1234567;So;0;L;;;;;N;;;;; 2880;BRAILLE PATTERN DOTS-8;So;0;L;;;;;N;;;;; 2881;BRAILLE PATTERN DOTS-18;So;0;L;;;;;N;;;;; 2882;BRAILLE PATTERN DOTS-28;So;0;L;;;;;N;;;;; 2883;BRAILLE PATTERN DOTS-128;So;0;L;;;;;N;;;;; 2884;BRAILLE PATTERN DOTS-38;So;0;L;;;;;N;;;;; 2885;BRAILLE PATTERN DOTS-138;So;0;L;;;;;N;;;;; 2886;BRAILLE PATTERN DOTS-238;So;0;L;;;;;N;;;;; 2887;BRAILLE PATTERN DOTS-1238;So;0;L;;;;;N;;;;; 2888;BRAILLE PATTERN DOTS-48;So;0;L;;;;;N;;;;; 2889;BRAILLE PATTERN DOTS-148;So;0;L;;;;;N;;;;; 288A;BRAILLE PATTERN DOTS-248;So;0;L;;;;;N;;;;; 288B;BRAILLE PATTERN DOTS-1248;So;0;L;;;;;N;;;;; 288C;BRAILLE PATTERN DOTS-348;So;0;L;;;;;N;;;;; 288D;BRAILLE PATTERN DOTS-1348;So;0;L;;;;;N;;;;; 288E;BRAILLE PATTERN DOTS-2348;So;0;L;;;;;N;;;;; 288F;BRAILLE PATTERN DOTS-12348;So;0;L;;;;;N;;;;; 2890;BRAILLE PATTERN DOTS-58;So;0;L;;;;;N;;;;; 2891;BRAILLE PATTERN DOTS-158;So;0;L;;;;;N;;;;; 2892;BRAILLE PATTERN DOTS-258;So;0;L;;;;;N;;;;; 2893;BRAILLE PATTERN DOTS-1258;So;0;L;;;;;N;;;;; 2894;BRAILLE PATTERN DOTS-358;So;0;L;;;;;N;;;;; 2895;BRAILLE PATTERN DOTS-1358;So;0;L;;;;;N;;;;; 2896;BRAILLE PATTERN DOTS-2358;So;0;L;;;;;N;;;;; 2897;BRAILLE PATTERN DOTS-12358;So;0;L;;;;;N;;;;; 2898;BRAILLE PATTERN DOTS-458;So;0;L;;;;;N;;;;; 2899;BRAILLE PATTERN DOTS-1458;So;0;L;;;;;N;;;;; 289A;BRAILLE PATTERN DOTS-2458;So;0;L;;;;;N;;;;; 289B;BRAILLE PATTERN DOTS-12458;So;0;L;;;;;N;;;;; 289C;BRAILLE PATTERN DOTS-3458;So;0;L;;;;;N;;;;; 289D;BRAILLE PATTERN DOTS-13458;So;0;L;;;;;N;;;;; 289E;BRAILLE PATTERN DOTS-23458;So;0;L;;;;;N;;;;; 289F;BRAILLE PATTERN DOTS-123458;So;0;L;;;;;N;;;;; 28A0;BRAILLE PATTERN DOTS-68;So;0;L;;;;;N;;;;; 28A1;BRAILLE PATTERN DOTS-168;So;0;L;;;;;N;;;;; 28A2;BRAILLE PATTERN DOTS-268;So;0;L;;;;;N;;;;; 28A3;BRAILLE PATTERN DOTS-1268;So;0;L;;;;;N;;;;; 28A4;BRAILLE PATTERN DOTS-368;So;0;L;;;;;N;;;;; 28A5;BRAILLE PATTERN DOTS-1368;So;0;L;;;;;N;;;;; 28A6;BRAILLE PATTERN DOTS-2368;So;0;L;;;;;N;;;;; 28A7;BRAILLE PATTERN DOTS-12368;So;0;L;;;;;N;;;;; 28A8;BRAILLE PATTERN DOTS-468;So;0;L;;;;;N;;;;; 28A9;BRAILLE PATTERN DOTS-1468;So;0;L;;;;;N;;;;; 28AA;BRAILLE PATTERN DOTS-2468;So;0;L;;;;;N;;;;; 28AB;BRAILLE PATTERN DOTS-12468;So;0;L;;;;;N;;;;; 28AC;BRAILLE PATTERN DOTS-3468;So;0;L;;;;;N;;;;; 28AD;BRAILLE PATTERN DOTS-13468;So;0;L;;;;;N;;;;; 28AE;BRAILLE PATTERN DOTS-23468;So;0;L;;;;;N;;;;; 28AF;BRAILLE PATTERN DOTS-123468;So;0;L;;;;;N;;;;; 28B0;BRAILLE PATTERN DOTS-568;So;0;L;;;;;N;;;;; 28B1;BRAILLE PATTERN DOTS-1568;So;0;L;;;;;N;;;;; 28B2;BRAILLE PATTERN DOTS-2568;So;0;L;;;;;N;;;;; 28B3;BRAILLE PATTERN DOTS-12568;So;0;L;;;;;N;;;;; 28B4;BRAILLE PATTERN DOTS-3568;So;0;L;;;;;N;;;;; 28B5;BRAILLE PATTERN DOTS-13568;So;0;L;;;;;N;;;;; 28B6;BRAILLE PATTERN DOTS-23568;So;0;L;;;;;N;;;;; 28B7;BRAILLE PATTERN DOTS-123568;So;0;L;;;;;N;;;;; 28B8;BRAILLE PATTERN DOTS-4568;So;0;L;;;;;N;;;;; 28B9;BRAILLE PATTERN DOTS-14568;So;0;L;;;;;N;;;;; 28BA;BRAILLE PATTERN DOTS-24568;So;0;L;;;;;N;;;;; 28BB;BRAILLE PATTERN DOTS-124568;So;0;L;;;;;N;;;;; 28BC;BRAILLE PATTERN DOTS-34568;So;0;L;;;;;N;;;;; 28BD;BRAILLE PATTERN DOTS-134568;So;0;L;;;;;N;;;;; 28BE;BRAILLE PATTERN DOTS-234568;So;0;L;;;;;N;;;;; 28BF;BRAILLE PATTERN DOTS-1234568;So;0;L;;;;;N;;;;; 28C0;BRAILLE PATTERN DOTS-78;So;0;L;;;;;N;;;;; 28C1;BRAILLE PATTERN DOTS-178;So;0;L;;;;;N;;;;; 28C2;BRAILLE PATTERN DOTS-278;So;0;L;;;;;N;;;;; 28C3;BRAILLE PATTERN DOTS-1278;So;0;L;;;;;N;;;;; 28C4;BRAILLE PATTERN DOTS-378;So;0;L;;;;;N;;;;; 28C5;BRAILLE PATTERN DOTS-1378;So;0;L;;;;;N;;;;; 28C6;BRAILLE PATTERN DOTS-2378;So;0;L;;;;;N;;;;; 28C7;BRAILLE PATTERN DOTS-12378;So;0;L;;;;;N;;;;; 28C8;BRAILLE PATTERN DOTS-478;So;0;L;;;;;N;;;;; 28C9;BRAILLE PATTERN DOTS-1478;So;0;L;;;;;N;;;;; 28CA;BRAILLE PATTERN DOTS-2478;So;0;L;;;;;N;;;;; 28CB;BRAILLE PATTERN DOTS-12478;So;0;L;;;;;N;;;;; 28CC;BRAILLE PATTERN DOTS-3478;So;0;L;;;;;N;;;;; 28CD;BRAILLE PATTERN DOTS-13478;So;0;L;;;;;N;;;;; 28CE;BRAILLE PATTERN DOTS-23478;So;0;L;;;;;N;;;;; 28CF;BRAILLE PATTERN DOTS-123478;So;0;L;;;;;N;;;;; 28D0;BRAILLE PATTERN DOTS-578;So;0;L;;;;;N;;;;; 28D1;BRAILLE PATTERN DOTS-1578;So;0;L;;;;;N;;;;; 28D2;BRAILLE PATTERN DOTS-2578;So;0;L;;;;;N;;;;; 28D3;BRAILLE PATTERN DOTS-12578;So;0;L;;;;;N;;;;; 28D4;BRAILLE PATTERN DOTS-3578;So;0;L;;;;;N;;;;; 28D5;BRAILLE PATTERN DOTS-13578;So;0;L;;;;;N;;;;; 28D6;BRAILLE PATTERN DOTS-23578;So;0;L;;;;;N;;;;; 28D7;BRAILLE PATTERN DOTS-123578;So;0;L;;;;;N;;;;; 28D8;BRAILLE PATTERN DOTS-4578;So;0;L;;;;;N;;;;; 28D9;BRAILLE PATTERN DOTS-14578;So;0;L;;;;;N;;;;; 28DA;BRAILLE PATTERN DOTS-24578;So;0;L;;;;;N;;;;; 28DB;BRAILLE PATTERN DOTS-124578;So;0;L;;;;;N;;;;; 28DC;BRAILLE PATTERN DOTS-34578;So;0;L;;;;;N;;;;; 28DD;BRAILLE PATTERN DOTS-134578;So;0;L;;;;;N;;;;; 28DE;BRAILLE PATTERN DOTS-234578;So;0;L;;;;;N;;;;; 28DF;BRAILLE PATTERN DOTS-1234578;So;0;L;;;;;N;;;;; 28E0;BRAILLE PATTERN DOTS-678;So;0;L;;;;;N;;;;; 28E1;BRAILLE PATTERN DOTS-1678;So;0;L;;;;;N;;;;; 28E2;BRAILLE PATTERN DOTS-2678;So;0;L;;;;;N;;;;; 28E3;BRAILLE PATTERN DOTS-12678;So;0;L;;;;;N;;;;; 28E4;BRAILLE PATTERN DOTS-3678;So;0;L;;;;;N;;;;; 28E5;BRAILLE PATTERN DOTS-13678;So;0;L;;;;;N;;;;; 28E6;BRAILLE PATTERN DOTS-23678;So;0;L;;;;;N;;;;; 28E7;BRAILLE PATTERN DOTS-123678;So;0;L;;;;;N;;;;; 28E8;BRAILLE PATTERN DOTS-4678;So;0;L;;;;;N;;;;; 28E9;BRAILLE PATTERN DOTS-14678;So;0;L;;;;;N;;;;; 28EA;BRAILLE PATTERN DOTS-24678;So;0;L;;;;;N;;;;; 28EB;BRAILLE PATTERN DOTS-124678;So;0;L;;;;;N;;;;; 28EC;BRAILLE PATTERN DOTS-34678;So;0;L;;;;;N;;;;; 28ED;BRAILLE PATTERN DOTS-134678;So;0;L;;;;;N;;;;; 28EE;BRAILLE PATTERN DOTS-234678;So;0;L;;;;;N;;;;; 28EF;BRAILLE PATTERN DOTS-1234678;So;0;L;;;;;N;;;;; 28F0;BRAILLE PATTERN DOTS-5678;So;0;L;;;;;N;;;;; 28F1;BRAILLE PATTERN DOTS-15678;So;0;L;;;;;N;;;;; 28F2;BRAILLE PATTERN DOTS-25678;So;0;L;;;;;N;;;;; 28F3;BRAILLE PATTERN DOTS-125678;So;0;L;;;;;N;;;;; 28F4;BRAILLE PATTERN DOTS-35678;So;0;L;;;;;N;;;;; 28F5;BRAILLE PATTERN DOTS-135678;So;0;L;;;;;N;;;;; 28F6;BRAILLE PATTERN DOTS-235678;So;0;L;;;;;N;;;;; 28F7;BRAILLE PATTERN DOTS-1235678;So;0;L;;;;;N;;;;; 28F8;BRAILLE PATTERN DOTS-45678;So;0;L;;;;;N;;;;; 28F9;BRAILLE PATTERN DOTS-145678;So;0;L;;;;;N;;;;; 28FA;BRAILLE PATTERN DOTS-245678;So;0;L;;;;;N;;;;; 28FB;BRAILLE PATTERN DOTS-1245678;So;0;L;;;;;N;;;;; 28FC;BRAILLE PATTERN DOTS-345678;So;0;L;;;;;N;;;;; 28FD;BRAILLE PATTERN DOTS-1345678;So;0;L;;;;;N;;;;; 28FE;BRAILLE PATTERN DOTS-2345678;So;0;L;;;;;N;;;;; 28FF;BRAILLE PATTERN DOTS-12345678;So;0;L;;;;;N;;;;; 2900;RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2901;RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2902;LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2903;RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2904;LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2905;RIGHTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; 2906;LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; 2907;RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; 2908;DOWNWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; 2909;UPWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; 290A;UPWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;; 290B;DOWNWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;; 290C;LEFTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;; 290D;RIGHTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;; 290E;LEFTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; 290F;RIGHTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; 2910;RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; 2911;RIGHTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; 2912;UPWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;; 2913;DOWNWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;; 2914;RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2915;RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2916;RIGHTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; 2917;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2918;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2919;LEFTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;; 291A;RIGHTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;; 291B;LEFTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;; 291C;RIGHTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;; 291D;LEFTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; 291E;RIGHTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; 291F;LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; 2920;RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; 2921;NORTH WEST AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; 2922;NORTH EAST AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;; 2923;NORTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; 2924;NORTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; 2925;SOUTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; 2926;SOUTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; 2927;NORTH WEST ARROW AND NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; 2928;NORTH EAST ARROW AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; 2929;SOUTH EAST ARROW AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;; 292A;SOUTH WEST ARROW AND NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;; 292B;RISING DIAGONAL CROSSING FALLING DIAGONAL;Sm;0;ON;;;;;N;;;;; 292C;FALLING DIAGONAL CROSSING RISING DIAGONAL;Sm;0;ON;;;;;N;;;;; 292D;SOUTH EAST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; 292E;NORTH EAST ARROW CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; 292F;FALLING DIAGONAL CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; 2930;RISING DIAGONAL CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; 2931;NORTH EAST ARROW CROSSING NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;; 2932;NORTH WEST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; 2933;WAVE ARROW POINTING DIRECTLY RIGHT;Sm;0;ON;;;;;N;;;;; 2934;ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS;Sm;0;ON;;;;;N;;;;; 2935;ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS;Sm;0;ON;;;;;N;;;;; 2936;ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS;Sm;0;ON;;;;;N;;;;; 2937;ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS;Sm;0;ON;;;;;N;;;;; 2938;RIGHT-SIDE ARC CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; 2939;LEFT-SIDE ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; 293A;TOP ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; 293B;BOTTOM ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; 293C;TOP ARC CLOCKWISE ARROW WITH MINUS;Sm;0;ON;;;;;N;;;;; 293D;TOP ARC ANTICLOCKWISE ARROW WITH PLUS;Sm;0;ON;;;;;N;;;;; 293E;LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; 293F;LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; 2940;ANTICLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; 2941;CLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; 2942;RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; 2943;LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; 2944;SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; 2945;RIGHTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;; 2946;LEFTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;; 2947;RIGHTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; 2948;LEFT RIGHT ARROW THROUGH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; 2949;UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; 294A;LEFT BARB UP RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;; 294B;LEFT BARB DOWN RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;; 294C;UP BARB RIGHT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;; 294D;UP BARB LEFT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;; 294E;LEFT BARB UP RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;; 294F;UP BARB RIGHT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;; 2950;LEFT BARB DOWN RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;; 2951;UP BARB LEFT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;; 2952;LEFTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;; 2953;RIGHTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;; 2954;UPWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;; 2955;DOWNWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;; 2956;LEFTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;; 2957;RIGHTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;; 2958;UPWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;; 2959;DOWNWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;; 295A;LEFTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;; 295B;RIGHTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;; 295C;UPWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;; 295D;DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;; 295E;LEFTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;; 295F;RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;; 2960;UPWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;; 2961;DOWNWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;; 2962;LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; 2963;UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; 2964;RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; 2965;DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; 2966;LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;; 2967;LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; 2968;RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;; 2969;RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; 296A;LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;; 296B;LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;; 296C;RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;; 296D;RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;; 296E;UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; 296F;DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; 2970;RIGHT DOUBLE ARROW WITH ROUNDED HEAD;Sm;0;ON;;;;;N;;;;; 2971;EQUALS SIGN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; 2972;TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; 2973;LEFTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; 2974;RIGHTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; 2975;RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; 2976;LESS-THAN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; 2977;LEFTWARDS ARROW THROUGH LESS-THAN;Sm;0;ON;;;;;N;;;;; 2978;GREATER-THAN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; 2979;SUBSET ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; 297A;LEFTWARDS ARROW THROUGH SUBSET;Sm;0;ON;;;;;N;;;;; 297B;SUPERSET ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; 297C;LEFT FISH TAIL;Sm;0;ON;;;;;N;;;;; 297D;RIGHT FISH TAIL;Sm;0;ON;;;;;N;;;;; 297E;UP FISH TAIL;Sm;0;ON;;;;;N;;;;; 297F;DOWN FISH TAIL;Sm;0;ON;;;;;N;;;;; 2980;TRIPLE VERTICAL BAR DELIMITER;Sm;0;ON;;;;;N;;;;; 2981;Z NOTATION SPOT;Sm;0;ON;;;;;N;;;;; 2982;Z NOTATION TYPE COLON;Sm;0;ON;;;;;N;;;;; 2983;LEFT WHITE CURLY BRACKET;Ps;0;ON;;;;;Y;;;;; 2984;RIGHT WHITE CURLY BRACKET;Pe;0;ON;;;;;Y;;;;; 2985;LEFT WHITE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; 2986;RIGHT WHITE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; 2987;Z NOTATION LEFT IMAGE BRACKET;Ps;0;ON;;;;;Y;;;;; 2988;Z NOTATION RIGHT IMAGE BRACKET;Pe;0;ON;;;;;Y;;;;; 2989;Z NOTATION LEFT BINDING BRACKET;Ps;0;ON;;;;;Y;;;;; 298A;Z NOTATION RIGHT BINDING BRACKET;Pe;0;ON;;;;;Y;;;;; 298B;LEFT SQUARE BRACKET WITH UNDERBAR;Ps;0;ON;;;;;Y;;;;; 298C;RIGHT SQUARE BRACKET WITH UNDERBAR;Pe;0;ON;;;;;Y;;;;; 298D;LEFT SQUARE BRACKET WITH TICK IN TOP CORNER;Ps;0;ON;;;;;Y;;;;; 298E;RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Pe;0;ON;;;;;Y;;;;; 298F;LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Ps;0;ON;;;;;Y;;;;; 2990;RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER;Pe;0;ON;;;;;Y;;;;; 2991;LEFT ANGLE BRACKET WITH DOT;Ps;0;ON;;;;;Y;;;;; 2992;RIGHT ANGLE BRACKET WITH DOT;Pe;0;ON;;;;;Y;;;;; 2993;LEFT ARC LESS-THAN BRACKET;Ps;0;ON;;;;;Y;;;;; 2994;RIGHT ARC GREATER-THAN BRACKET;Pe;0;ON;;;;;Y;;;;; 2995;DOUBLE LEFT ARC GREATER-THAN BRACKET;Ps;0;ON;;;;;Y;;;;; 2996;DOUBLE RIGHT ARC LESS-THAN BRACKET;Pe;0;ON;;;;;Y;;;;; 2997;LEFT BLACK TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; 2998;RIGHT BLACK TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; 2999;DOTTED FENCE;Sm;0;ON;;;;;N;;;;; 299A;VERTICAL ZIGZAG LINE;Sm;0;ON;;;;;N;;;;; 299B;MEASURED ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;; 299C;RIGHT ANGLE VARIANT WITH SQUARE;Sm;0;ON;;;;;Y;;;;; 299D;MEASURED RIGHT ANGLE WITH DOT;Sm;0;ON;;;;;Y;;;;; 299E;ANGLE WITH S INSIDE;Sm;0;ON;;;;;Y;;;;; 299F;ACUTE ANGLE;Sm;0;ON;;;;;Y;;;;; 29A0;SPHERICAL ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;; 29A1;SPHERICAL ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;; 29A2;TURNED ANGLE;Sm;0;ON;;;;;Y;;;;; 29A3;REVERSED ANGLE;Sm;0;ON;;;;;Y;;;;; 29A4;ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; 29A5;REVERSED ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; 29A6;OBLIQUE ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;; 29A7;OBLIQUE ANGLE OPENING DOWN;Sm;0;ON;;;;;Y;;;;; 29A8;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT;Sm;0;ON;;;;;Y;;;;; 29A9;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT;Sm;0;ON;;;;;Y;;;;; 29AA;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT;Sm;0;ON;;;;;Y;;;;; 29AB;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT;Sm;0;ON;;;;;Y;;;;; 29AC;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP;Sm;0;ON;;;;;Y;;;;; 29AD;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP;Sm;0;ON;;;;;Y;;;;; 29AE;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN;Sm;0;ON;;;;;Y;;;;; 29AF;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN;Sm;0;ON;;;;;Y;;;;; 29B0;REVERSED EMPTY SET;Sm;0;ON;;;;;N;;;;; 29B1;EMPTY SET WITH OVERBAR;Sm;0;ON;;;;;N;;;;; 29B2;EMPTY SET WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; 29B3;EMPTY SET WITH RIGHT ARROW ABOVE;Sm;0;ON;;;;;N;;;;; 29B4;EMPTY SET WITH LEFT ARROW ABOVE;Sm;0;ON;;;;;N;;;;; 29B5;CIRCLE WITH HORIZONTAL BAR;Sm;0;ON;;;;;N;;;;; 29B6;CIRCLED VERTICAL BAR;Sm;0;ON;;;;;N;;;;; 29B7;CIRCLED PARALLEL;Sm;0;ON;;;;;N;;;;; 29B8;CIRCLED REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;; 29B9;CIRCLED PERPENDICULAR;Sm;0;ON;;;;;N;;;;; 29BA;CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR;Sm;0;ON;;;;;N;;;;; 29BB;CIRCLE WITH SUPERIMPOSED X;Sm;0;ON;;;;;N;;;;; 29BC;CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN;Sm;0;ON;;;;;N;;;;; 29BD;UP ARROW THROUGH CIRCLE;Sm;0;ON;;;;;N;;;;; 29BE;CIRCLED WHITE BULLET;Sm;0;ON;;;;;N;;;;; 29BF;CIRCLED BULLET;Sm;0;ON;;;;;N;;;;; 29C0;CIRCLED LESS-THAN;Sm;0;ON;;;;;Y;;;;; 29C1;CIRCLED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; 29C2;CIRCLE WITH SMALL CIRCLE TO THE RIGHT;Sm;0;ON;;;;;Y;;;;; 29C3;CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT;Sm;0;ON;;;;;Y;;;;; 29C4;SQUARED RISING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;; 29C5;SQUARED FALLING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;; 29C6;SQUARED ASTERISK;Sm;0;ON;;;;;N;;;;; 29C7;SQUARED SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; 29C8;SQUARED SQUARE;Sm;0;ON;;;;;N;;;;; 29C9;TWO JOINED SQUARES;Sm;0;ON;;;;;Y;;;;; 29CA;TRIANGLE WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; 29CB;TRIANGLE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; 29CC;S IN TRIANGLE;Sm;0;ON;;;;;N;;;;; 29CD;TRIANGLE WITH SERIFS AT BOTTOM;Sm;0;ON;;;;;N;;;;; 29CE;RIGHT TRIANGLE ABOVE LEFT TRIANGLE;Sm;0;ON;;;;;Y;;;;; 29CF;LEFT TRIANGLE BESIDE VERTICAL BAR;Sm;0;ON;;;;;Y;;;;; 29D0;VERTICAL BAR BESIDE RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; 29D1;BOWTIE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; 29D2;BOWTIE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; 29D3;BLACK BOWTIE;Sm;0;ON;;;;;N;;;;; 29D4;TIMES WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; 29D5;TIMES WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; 29D6;WHITE HOURGLASS;Sm;0;ON;;;;;N;;;;; 29D7;BLACK HOURGLASS;Sm;0;ON;;;;;N;;;;; 29D8;LEFT WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;; 29D9;RIGHT WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;; 29DA;LEFT DOUBLE WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;; 29DB;RIGHT DOUBLE WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;; 29DC;INCOMPLETE INFINITY;Sm;0;ON;;;;;Y;;;;; 29DD;TIE OVER INFINITY;Sm;0;ON;;;;;N;;;;; 29DE;INFINITY NEGATED WITH VERTICAL BAR;Sm;0;ON;;;;;N;;;;; 29DF;DOUBLE-ENDED MULTIMAP;Sm;0;ON;;;;;N;;;;; 29E0;SQUARE WITH CONTOURED OUTLINE;Sm;0;ON;;;;;N;;;;; 29E1;INCREASES AS;Sm;0;ON;;;;;Y;;;;; 29E2;SHUFFLE PRODUCT;Sm;0;ON;;;;;N;;;;; 29E3;EQUALS SIGN AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;; 29E4;EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;; 29E5;IDENTICAL TO AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;; 29E6;GLEICH STARK;Sm;0;ON;;;;;N;;;;; 29E7;THERMODYNAMIC;Sm;0;ON;;;;;N;;;;; 29E8;DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; 29E9;DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; 29EA;BLACK DIAMOND WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; 29EB;BLACK LOZENGE;Sm;0;ON;;;;;N;;;;; 29EC;WHITE CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; 29ED;BLACK CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; 29EE;ERROR-BARRED WHITE SQUARE;Sm;0;ON;;;;;N;;;;; 29EF;ERROR-BARRED BLACK SQUARE;Sm;0;ON;;;;;N;;;;; 29F0;ERROR-BARRED WHITE DIAMOND;Sm;0;ON;;;;;N;;;;; 29F1;ERROR-BARRED BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; 29F2;ERROR-BARRED WHITE CIRCLE;Sm;0;ON;;;;;N;;;;; 29F3;ERROR-BARRED BLACK CIRCLE;Sm;0;ON;;;;;N;;;;; 29F4;RULE-DELAYED;Sm;0;ON;;;;;Y;;;;; 29F5;REVERSE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;; 29F6;SOLIDUS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; 29F7;REVERSE SOLIDUS WITH HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; 29F8;BIG SOLIDUS;Sm;0;ON;;;;;Y;;;;; 29F9;BIG REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;; 29FA;DOUBLE PLUS;Sm;0;ON;;;;;N;;;;; 29FB;TRIPLE PLUS;Sm;0;ON;;;;;N;;;;; 29FC;LEFT-POINTING CURVED ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; 29FD;RIGHT-POINTING CURVED ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; 29FE;TINY;Sm;0;ON;;;;;N;;;;; 29FF;MINY;Sm;0;ON;;;;;N;;;;; 2A00;N-ARY CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; 2A01;N-ARY CIRCLED PLUS OPERATOR;Sm;0;ON;;;;;N;;;;; 2A02;N-ARY CIRCLED TIMES OPERATOR;Sm;0;ON;;;;;N;;;;; 2A03;N-ARY UNION OPERATOR WITH DOT;Sm;0;ON;;;;;N;;;;; 2A04;N-ARY UNION OPERATOR WITH PLUS;Sm;0;ON;;;;;N;;;;; 2A05;N-ARY SQUARE INTERSECTION OPERATOR;Sm;0;ON;;;;;N;;;;; 2A06;N-ARY SQUARE UNION OPERATOR;Sm;0;ON;;;;;N;;;;; 2A07;TWO LOGICAL AND OPERATOR;Sm;0;ON;;;;;N;;;;; 2A08;TWO LOGICAL OR OPERATOR;Sm;0;ON;;;;;N;;;;; 2A09;N-ARY TIMES OPERATOR;Sm;0;ON;;;;;N;;;;; 2A0A;MODULO TWO SUM;Sm;0;ON;;;;;Y;;;;; 2A0B;SUMMATION WITH INTEGRAL;Sm;0;ON;;;;;Y;;;;; 2A0C;QUADRUPLE INTEGRAL OPERATOR;Sm;0;ON;<compat> 222B 222B 222B 222B;;;;Y;;;;; 2A0D;FINITE PART INTEGRAL;Sm;0;ON;;;;;Y;;;;; 2A0E;INTEGRAL WITH DOUBLE STROKE;Sm;0;ON;;;;;Y;;;;; 2A0F;INTEGRAL AVERAGE WITH SLASH;Sm;0;ON;;;;;Y;;;;; 2A10;CIRCULATION FUNCTION;Sm;0;ON;;;;;Y;;;;; 2A11;ANTICLOCKWISE INTEGRATION;Sm;0;ON;;;;;Y;;;;; 2A12;LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;; 2A13;LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;; 2A14;LINE INTEGRATION NOT INCLUDING THE POLE;Sm;0;ON;;;;;Y;;;;; 2A15;INTEGRAL AROUND A POINT OPERATOR;Sm;0;ON;;;;;Y;;;;; 2A16;QUATERNION INTEGRAL OPERATOR;Sm;0;ON;;;;;Y;;;;; 2A17;INTEGRAL WITH LEFTWARDS ARROW WITH HOOK;Sm;0;ON;;;;;Y;;;;; 2A18;INTEGRAL WITH TIMES SIGN;Sm;0;ON;;;;;Y;;;;; 2A19;INTEGRAL WITH INTERSECTION;Sm;0;ON;;;;;Y;;;;; 2A1A;INTEGRAL WITH UNION;Sm;0;ON;;;;;Y;;;;; 2A1B;INTEGRAL WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; 2A1C;INTEGRAL WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; 2A1D;JOIN;Sm;0;ON;;;;;N;;;;; 2A1E;LARGE LEFT TRIANGLE OPERATOR;Sm;0;ON;;;;;Y;;;;; 2A1F;Z NOTATION SCHEMA COMPOSITION;Sm;0;ON;;;;;Y;;;;; 2A20;Z NOTATION SCHEMA PIPING;Sm;0;ON;;;;;Y;;;;; 2A21;Z NOTATION SCHEMA PROJECTION;Sm;0;ON;;;;;Y;;;;; 2A22;PLUS SIGN WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; 2A23;PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE;Sm;0;ON;;;;;N;;;;; 2A24;PLUS SIGN WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;; 2A25;PLUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; 2A26;PLUS SIGN WITH TILDE BELOW;Sm;0;ON;;;;;Y;;;;; 2A27;PLUS SIGN WITH SUBSCRIPT TWO;Sm;0;ON;;;;;N;;;;; 2A28;PLUS SIGN WITH BLACK TRIANGLE;Sm;0;ON;;;;;N;;;;; 2A29;MINUS SIGN WITH COMMA ABOVE;Sm;0;ON;;;;;Y;;;;; 2A2A;MINUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; 2A2B;MINUS SIGN WITH FALLING DOTS;Sm;0;ON;;;;;Y;;;;; 2A2C;MINUS SIGN WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;; 2A2D;PLUS SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; 2A2E;PLUS SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; 2A2F;VECTOR OR CROSS PRODUCT;Sm;0;ON;;;;;N;;;;; 2A30;MULTIPLICATION SIGN WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; 2A31;MULTIPLICATION SIGN WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; 2A32;SEMIDIRECT PRODUCT WITH BOTTOM CLOSED;Sm;0;ON;;;;;N;;;;; 2A33;SMASH PRODUCT;Sm;0;ON;;;;;N;;;;; 2A34;MULTIPLICATION SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; 2A35;MULTIPLICATION SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; 2A36;CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;N;;;;; 2A37;MULTIPLICATION SIGN IN DOUBLE CIRCLE;Sm;0;ON;;;;;N;;;;; 2A38;CIRCLED DIVISION SIGN;Sm;0;ON;;;;;N;;;;; 2A39;PLUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; 2A3A;MINUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; 2A3B;MULTIPLICATION SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; 2A3C;INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;; 2A3D;RIGHTHAND INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;; 2A3E;Z NOTATION RELATIONAL COMPOSITION;Sm;0;ON;;;;;Y;;;;; 2A3F;AMALGAMATION OR COPRODUCT;Sm;0;ON;;;;;N;;;;; 2A40;INTERSECTION WITH DOT;Sm;0;ON;;;;;N;;;;; 2A41;UNION WITH MINUS SIGN;Sm;0;ON;;;;;N;;;;; 2A42;UNION WITH OVERBAR;Sm;0;ON;;;;;N;;;;; 2A43;INTERSECTION WITH OVERBAR;Sm;0;ON;;;;;N;;;;; 2A44;INTERSECTION WITH LOGICAL AND;Sm;0;ON;;;;;N;;;;; 2A45;UNION WITH LOGICAL OR;Sm;0;ON;;;;;N;;;;; 2A46;UNION ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;; 2A47;INTERSECTION ABOVE UNION;Sm;0;ON;;;;;N;;;;; 2A48;UNION ABOVE BAR ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;; 2A49;INTERSECTION ABOVE BAR ABOVE UNION;Sm;0;ON;;;;;N;;;;; 2A4A;UNION BESIDE AND JOINED WITH UNION;Sm;0;ON;;;;;N;;;;; 2A4B;INTERSECTION BESIDE AND JOINED WITH INTERSECTION;Sm;0;ON;;;;;N;;;;; 2A4C;CLOSED UNION WITH SERIFS;Sm;0;ON;;;;;N;;;;; 2A4D;CLOSED INTERSECTION WITH SERIFS;Sm;0;ON;;;;;N;;;;; 2A4E;DOUBLE SQUARE INTERSECTION;Sm;0;ON;;;;;N;;;;; 2A4F;DOUBLE SQUARE UNION;Sm;0;ON;;;;;N;;;;; 2A50;CLOSED UNION WITH SERIFS AND SMASH PRODUCT;Sm;0;ON;;;;;N;;;;; 2A51;LOGICAL AND WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; 2A52;LOGICAL OR WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; 2A53;DOUBLE LOGICAL AND;Sm;0;ON;;;;;N;;;;; 2A54;DOUBLE LOGICAL OR;Sm;0;ON;;;;;N;;;;; 2A55;TWO INTERSECTING LOGICAL AND;Sm;0;ON;;;;;N;;;;; 2A56;TWO INTERSECTING LOGICAL OR;Sm;0;ON;;;;;N;;;;; 2A57;SLOPING LARGE OR;Sm;0;ON;;;;;Y;;;;; 2A58;SLOPING LARGE AND;Sm;0;ON;;;;;Y;;;;; 2A59;LOGICAL OR OVERLAPPING LOGICAL AND;Sm;0;ON;;;;;N;;;;; 2A5A;LOGICAL AND WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;; 2A5B;LOGICAL OR WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;; 2A5C;LOGICAL AND WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;; 2A5D;LOGICAL OR WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;; 2A5E;LOGICAL AND WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;; 2A5F;LOGICAL AND WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; 2A60;LOGICAL AND WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;; 2A61;SMALL VEE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; 2A62;LOGICAL OR WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;; 2A63;LOGICAL OR WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;; 2A64;Z NOTATION DOMAIN ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;; 2A65;Z NOTATION RANGE ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;; 2A66;EQUALS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; 2A67;IDENTICAL WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; 2A68;TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2A69;TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2A6A;TILDE OPERATOR WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; 2A6B;TILDE OPERATOR WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;; 2A6C;SIMILAR MINUS SIMILAR;Sm;0;ON;;;;;Y;;;;; 2A6D;CONGRUENT WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; 2A6E;EQUALS WITH ASTERISK;Sm;0;ON;;;;;N;;;;; 2A6F;ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;Y;;;;; 2A70;APPROXIMATELY EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2A71;EQUALS SIGN ABOVE PLUS SIGN;Sm;0;ON;;;;;N;;;;; 2A72;PLUS SIGN ABOVE EQUALS SIGN;Sm;0;ON;;;;;N;;;;; 2A73;EQUALS SIGN ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; 2A74;DOUBLE COLON EQUAL;Sm;0;ON;<compat> 003A 003A 003D;;;;Y;;;;; 2A75;TWO CONSECUTIVE EQUALS SIGNS;Sm;0;ON;<compat> 003D 003D;;;;N;;;;; 2A76;THREE CONSECUTIVE EQUALS SIGNS;Sm;0;ON;<compat> 003D 003D 003D;;;;N;;;;; 2A77;EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW;Sm;0;ON;;;;;N;;;;; 2A78;EQUIVALENT WITH FOUR DOTS ABOVE;Sm;0;ON;;;;;N;;;;; 2A79;LESS-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;; 2A7A;GREATER-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;; 2A7B;LESS-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;; 2A7C;GREATER-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;; 2A7D;LESS-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2A7E;GREATER-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2A7F;LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; 2A80;GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; 2A81;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; 2A82;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; 2A83;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT;Sm;0;ON;;;;;Y;;;;; 2A84;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT;Sm;0;ON;;;;;Y;;;;; 2A85;LESS-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;; 2A86;GREATER-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;; 2A87;LESS-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2A88;GREATER-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2A89;LESS-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;; 2A8A;GREATER-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;; 2A8B;LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;; 2A8C;GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;; 2A8D;LESS-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;; 2A8E;GREATER-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;; 2A8F;LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;; 2A90;GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;; 2A91;LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;; 2A92;GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;; 2A93;LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; 2A94;GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; 2A95;SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; 2A96;SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; 2A97;SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; 2A98;SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; 2A99;DOUBLE-LINE EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; 2A9A;DOUBLE-LINE EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; 2A9B;DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; 2A9C;DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; 2A9D;SIMILAR OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; 2A9E;SIMILAR OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; 2A9F;SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; 2AA0;SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; 2AA1;DOUBLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;; 2AA2;DOUBLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; 2AA3;DOUBLE NESTED LESS-THAN WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; 2AA4;GREATER-THAN OVERLAPPING LESS-THAN;Sm;0;ON;;;;;N;;;;; 2AA5;GREATER-THAN BESIDE LESS-THAN;Sm;0;ON;;;;;N;;;;; 2AA6;LESS-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;; 2AA7;GREATER-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;; 2AA8;LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; 2AA9;GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; 2AAA;SMALLER THAN;Sm;0;ON;;;;;Y;;;;; 2AAB;LARGER THAN;Sm;0;ON;;;;;Y;;;;; 2AAC;SMALLER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2AAD;LARGER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2AAE;EQUALS SIGN WITH BUMPY ABOVE;Sm;0;ON;;;;;N;;;;; 2AAF;PRECEDES ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; 2AB0;SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; 2AB1;PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2AB2;SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2AB3;PRECEDES ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; 2AB4;SUCCEEDS ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; 2AB5;PRECEDES ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2AB6;SUCCEEDS ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2AB7;PRECEDES ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2AB8;SUCCEEDS ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2AB9;PRECEDES ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2ABA;SUCCEEDS ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2ABB;DOUBLE PRECEDES;Sm;0;ON;;;;;Y;;;;; 2ABC;DOUBLE SUCCEEDS;Sm;0;ON;;;;;Y;;;;; 2ABD;SUBSET WITH DOT;Sm;0;ON;;;;;Y;;;;; 2ABE;SUPERSET WITH DOT;Sm;0;ON;;;;;Y;;;;; 2ABF;SUBSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;; 2AC0;SUPERSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;; 2AC1;SUBSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;; 2AC2;SUPERSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;; 2AC3;SUBSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; 2AC4;SUPERSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; 2AC5;SUBSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; 2AC6;SUPERSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; 2AC7;SUBSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; 2AC8;SUPERSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; 2AC9;SUBSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2ACA;SUPERSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2ACB;SUBSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2ACC;SUPERSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2ACD;SQUARE LEFT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; 2ACE;SQUARE RIGHT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; 2ACF;CLOSED SUBSET;Sm;0;ON;;;;;Y;;;;; 2AD0;CLOSED SUPERSET;Sm;0;ON;;;;;Y;;;;; 2AD1;CLOSED SUBSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2AD2;CLOSED SUPERSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2AD3;SUBSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;; 2AD4;SUPERSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;; 2AD5;SUBSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;; 2AD6;SUPERSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;; 2AD7;SUPERSET BESIDE SUBSET;Sm;0;ON;;;;;N;;;;; 2AD8;SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET;Sm;0;ON;;;;;N;;;;; 2AD9;ELEMENT OF OPENING DOWNWARDS;Sm;0;ON;;;;;N;;;;; 2ADA;PITCHFORK WITH TEE TOP;Sm;0;ON;;;;;N;;;;; 2ADB;TRANSVERSAL INTERSECTION;Sm;0;ON;;;;;N;;;;; 2ADC;FORKING;Sm;0;ON;2ADD 0338;;;;Y;;;;; 2ADD;NONFORKING;Sm;0;ON;;;;;N;;;;; 2ADE;SHORT LEFT TACK;Sm;0;ON;;;;;Y;;;;; 2ADF;SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;; 2AE0;SHORT UP TACK;Sm;0;ON;;;;;N;;;;; 2AE1;PERPENDICULAR WITH S;Sm;0;ON;;;;;N;;;;; 2AE2;VERTICAL BAR TRIPLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; 2AE3;DOUBLE VERTICAL BAR LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; 2AE4;VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; 2AE5;DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; 2AE6;LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL;Sm;0;ON;;;;;Y;;;;; 2AE7;SHORT DOWN TACK WITH OVERBAR;Sm;0;ON;;;;;N;;;;; 2AE8;SHORT UP TACK WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; 2AE9;SHORT UP TACK ABOVE SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;; 2AEA;DOUBLE DOWN TACK;Sm;0;ON;;;;;N;;;;; 2AEB;DOUBLE UP TACK;Sm;0;ON;;;;;N;;;;; 2AEC;DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;; 2AED;REVERSED DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;; 2AEE;DOES NOT DIVIDE WITH REVERSED NEGATION SLASH;Sm;0;ON;;;;;Y;;;;; 2AEF;VERTICAL LINE WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; 2AF0;VERTICAL LINE WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;; 2AF1;DOWN TACK WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;; 2AF2;PARALLEL WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; 2AF3;PARALLEL WITH TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; 2AF4;TRIPLE VERTICAL BAR BINARY RELATION;Sm;0;ON;;;;;N;;;;; 2AF5;TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; 2AF6;TRIPLE COLON OPERATOR;Sm;0;ON;;;;;N;;;;; 2AF7;TRIPLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;; 2AF8;TRIPLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; 2AF9;DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2AFA;DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; 2AFB;TRIPLE SOLIDUS BINARY RELATION;Sm;0;ON;;;;;Y;;;;; 2AFC;LARGE TRIPLE VERTICAL BAR OPERATOR;Sm;0;ON;;;;;N;;;;; 2AFD;DOUBLE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;; 2AFE;WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;; 2AFF;N-ARY WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;; 2B00;NORTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;; 2B01;NORTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;; 2B02;SOUTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;; 2B03;SOUTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;; 2B04;LEFT RIGHT WHITE ARROW;So;0;ON;;;;;N;;;;; 2B05;LEFTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; 2B06;UPWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; 2B07;DOWNWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; 2B08;NORTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;; 2B09;NORTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; 2B0A;SOUTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;; 2B0B;SOUTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; 2B0C;LEFT RIGHT BLACK ARROW;So;0;ON;;;;;N;;;;; 2B0D;UP DOWN BLACK ARROW;So;0;ON;;;;;N;;;;; 2B0E;RIGHTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; 2B0F;RIGHTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; 2B10;LEFTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; 2B11;LEFTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; 2B12;SQUARE WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; 2B13;SQUARE WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; 2B14;SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; 2B15;SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; 2B16;DIAMOND WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; 2B17;DIAMOND WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; 2B18;DIAMOND WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; 2B19;DIAMOND WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; 2B1A;DOTTED SQUARE;So;0;ON;;;;;N;;;;; 2B1B;BLACK LARGE SQUARE;So;0;ON;;;;;N;;;;; 2B1C;WHITE LARGE SQUARE;So;0;ON;;;;;N;;;;; 2B1D;BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; 2B1E;WHITE VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; 2B1F;BLACK PENTAGON;So;0;ON;;;;;N;;;;; 2B20;WHITE PENTAGON;So;0;ON;;;;;N;;;;; 2B21;WHITE HEXAGON;So;0;ON;;;;;N;;;;; 2B22;BLACK HEXAGON;So;0;ON;;;;;N;;;;; 2B23;HORIZONTAL BLACK HEXAGON;So;0;ON;;;;;N;;;;; 2B24;BLACK LARGE CIRCLE;So;0;ON;;;;;N;;;;; 2B25;BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; 2B26;WHITE MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; 2B27;BLACK MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; 2B28;WHITE MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; 2B29;BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; 2B2A;BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;; 2B2B;WHITE SMALL LOZENGE;So;0;ON;;;;;N;;;;; 2B2C;BLACK HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; 2B2D;WHITE HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; 2B2E;BLACK VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; 2B2F;WHITE VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; 2B30;LEFT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; 2B31;THREE LEFTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; 2B32;LEFT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; 2B33;LONG LEFTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; 2B34;LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2B35;LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2B36;LEFTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; 2B37;LEFTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; 2B38;LEFTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; 2B39;LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2B3A;LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2B3B;LEFTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; 2B3C;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2B3D;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2B3E;LEFTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; 2B3F;WAVE ARROW POINTING DIRECTLY LEFT;Sm;0;ON;;;;;N;;;;; 2B40;EQUALS SIGN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; 2B41;REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; 2B42;LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; 2B43;RIGHTWARDS ARROW THROUGH GREATER-THAN;Sm;0;ON;;;;;N;;;;; 2B44;RIGHTWARDS ARROW THROUGH SUPERSET;Sm;0;ON;;;;;N;;;;; 2B45;LEFTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; 2B46;RIGHTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; 2B47;REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; 2B48;RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; 2B49;TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; 2B4A;LEFTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; 2B4B;LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; 2B4C;RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; 2B4D;DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW;So;0;ON;;;;;N;;;;; 2B4E;SHORT SLANTED NORTH ARROW;So;0;ON;;;;;N;;;;; 2B4F;SHORT BACKSLANTED SOUTH ARROW;So;0;ON;;;;;N;;;;; 2B50;WHITE MEDIUM STAR;So;0;ON;;;;;N;;;;; 2B51;BLACK SMALL STAR;So;0;ON;;;;;N;;;;; 2B52;WHITE SMALL STAR;So;0;ON;;;;;N;;;;; 2B53;BLACK RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; 2B54;WHITE RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; 2B55;HEAVY LARGE CIRCLE;So;0;ON;;;;;N;;;;; 2B56;HEAVY OVAL WITH OVAL INSIDE;So;0;ON;;;;;N;;;;; 2B57;HEAVY CIRCLE WITH CIRCLE INSIDE;So;0;ON;;;;;N;;;;; 2B58;HEAVY CIRCLE;So;0;ON;;;;;N;;;;; 2B59;HEAVY CIRCLED SALTIRE;So;0;ON;;;;;N;;;;; 2B5A;SLANTED NORTH ARROW WITH HOOKED HEAD;So;0;ON;;;;;N;;;;; 2B5B;BACKSLANTED SOUTH ARROW WITH HOOKED TAIL;So;0;ON;;;;;N;;;;; 2B5C;SLANTED NORTH ARROW WITH HORIZONTAL TAIL;So;0;ON;;;;;N;;;;; 2B5D;BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL;So;0;ON;;;;;N;;;;; 2B5E;BENT ARROW POINTING DOWNWARDS THEN NORTH EAST;So;0;ON;;;;;N;;;;; 2B5F;SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST;So;0;ON;;;;;N;;;;; 2B60;LEFTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; 2B61;UPWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; 2B62;RIGHTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; 2B63;DOWNWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; 2B64;LEFT RIGHT TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; 2B65;UP DOWN TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; 2B66;NORTH WEST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; 2B67;NORTH EAST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; 2B68;SOUTH EAST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; 2B69;SOUTH WEST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; 2B6A;LEFTWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; 2B6B;UPWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; 2B6C;RIGHTWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; 2B6D;DOWNWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; 2B6E;CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; 2B6F;ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; 2B70;LEFTWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; 2B71;UPWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; 2B72;RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; 2B73;DOWNWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; 2B76;NORTH WEST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; 2B77;NORTH EAST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; 2B78;SOUTH EAST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; 2B79;SOUTH WEST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; 2B7A;LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; 2B7B;UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; 2B7C;RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; 2B7D;DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; 2B7E;HORIZONTAL TAB KEY;So;0;ON;;;;;N;;;;; 2B7F;VERTICAL TAB KEY;So;0;ON;;;;;N;;;;; 2B80;LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; 2B81;UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; 2B82;RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; 2B83;DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; 2B84;LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; 2B85;UPWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; 2B86;RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; 2B87;DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; 2B88;LEFTWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; 2B89;UPWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; 2B8A;RIGHTWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; 2B8B;DOWNWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; 2B8C;ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW;So;0;ON;;;;;N;;;;; 2B8D;ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW;So;0;ON;;;;;N;;;;; 2B8E;ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW;So;0;ON;;;;;N;;;;; 2B8F;ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW;So;0;ON;;;;;N;;;;; 2B90;RETURN LEFT;So;0;ON;;;;;N;;;;; 2B91;RETURN RIGHT;So;0;ON;;;;;N;;;;; 2B92;NEWLINE LEFT;So;0;ON;;;;;N;;;;; 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;;;;; 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;;;;; 2B9B;THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; 2B9C;BLACK LEFTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; 2B9D;BLACK UPWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; 2B9E;BLACK RIGHTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; 2B9F;BLACK DOWNWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; 2BA0;DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS;So;0;ON;;;;;N;;;;; 2BA1;DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS;So;0;ON;;;;;N;;;;; 2BA2;UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS;So;0;ON;;;;;N;;;;; 2BA3;UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS;So;0;ON;;;;;N;;;;; 2BA4;LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS;So;0;ON;;;;;N;;;;; 2BA5;RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS;So;0;ON;;;;;N;;;;; 2BA6;LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS;So;0;ON;;;;;N;;;;; 2BA7;RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS;So;0;ON;;;;;N;;;;; 2BA8;BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW;So;0;ON;;;;;N;;;;; 2BA9;BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;;;;; 2BAA;BLACK CURVED UPWARDS AND LEFTWARDS ARROW;So;0;ON;;;;;N;;;;; 2BAB;BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;;;;; 2BAC;BLACK CURVED LEFTWARDS AND UPWARDS ARROW;So;0;ON;;;;;N;;;;; 2BAD;BLACK CURVED RIGHTWARDS AND UPWARDS ARROW;So;0;ON;;;;;N;;;;; 2BAE;BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; 2BAF;BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; 2BB0;RIBBON ARROW DOWN LEFT;So;0;ON;;;;;N;;;;; 2BB1;RIBBON ARROW DOWN RIGHT;So;0;ON;;;;;N;;;;; 2BB2;RIBBON ARROW UP LEFT;So;0;ON;;;;;N;;;;; 2BB3;RIBBON ARROW UP RIGHT;So;0;ON;;;;;N;;;;; 2BB4;RIBBON ARROW LEFT UP;So;0;ON;;;;;N;;;;; 2BB5;RIBBON ARROW RIGHT UP;So;0;ON;;;;;N;;;;; 2BB6;RIBBON ARROW LEFT DOWN;So;0;ON;;;;;N;;;;; 2BB7;RIBBON ARROW RIGHT DOWN;So;0;ON;;;;;N;;;;; 2BB8;UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; 2BB9;UP ARROWHEAD IN A RECTANGLE BOX;So;0;ON;;;;;N;;;;; 2BBD;BALLOT BOX WITH LIGHT X;So;0;ON;;;;;N;;;;; 2BBE;CIRCLED X;So;0;ON;;;;;N;;;;; 2BBF;CIRCLED BOLD X;So;0;ON;;;;;N;;;;; 2BC0;BLACK SQUARE CENTRED;So;0;ON;;;;;N;;;;; 2BC1;BLACK DIAMOND CENTRED;So;0;ON;;;;;N;;;;; 2BC2;TURNED BLACK PENTAGON;So;0;ON;;;;;N;;;;; 2BC3;HORIZONTAL BLACK OCTAGON;So;0;ON;;;;;N;;;;; 2BC4;BLACK OCTAGON;So;0;ON;;;;;N;;;;; 2BC5;BLACK MEDIUM UP-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; 2BC6;BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; 2BC7;BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; 2BC8;BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; 2BCA;TOP HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; 2BCB;BOTTOM HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; 2BCC;LIGHT FOUR POINTED BLACK CUSP;So;0;ON;;;;;N;;;;; 2BCD;ROTATED LIGHT FOUR POINTED BLACK CUSP;So;0;ON;;;;;N;;;;; 2BCE;WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;; 2BCF;ROTATED WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;; 2BD0;SQUARE POSITION INDICATOR;So;0;ON;;;;;N;;;;; 2BD1;UNCERTAINTY SIGN;So;0;ON;;;;;N;;;;; 2BEC;LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; 2BED;UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; 2BEE;RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; 2BEF;DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; 2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30; 2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31; 2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32; 2C03;GLAGOLITIC CAPITAL LETTER GLAGOLI;Lu;0;L;;;;;N;;;;2C33; 2C04;GLAGOLITIC CAPITAL LETTER DOBRO;Lu;0;L;;;;;N;;;;2C34; 2C05;GLAGOLITIC CAPITAL LETTER YESTU;Lu;0;L;;;;;N;;;;2C35; 2C06;GLAGOLITIC CAPITAL LETTER ZHIVETE;Lu;0;L;;;;;N;;;;2C36; 2C07;GLAGOLITIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;2C37; 2C08;GLAGOLITIC CAPITAL LETTER ZEMLJA;Lu;0;L;;;;;N;;;;2C38; 2C09;GLAGOLITIC CAPITAL LETTER IZHE;Lu;0;L;;;;;N;;;;2C39; 2C0A;GLAGOLITIC CAPITAL LETTER INITIAL IZHE;Lu;0;L;;;;;N;;;;2C3A; 2C0B;GLAGOLITIC CAPITAL LETTER I;Lu;0;L;;;;;N;;;;2C3B; 2C0C;GLAGOLITIC CAPITAL LETTER DJERVI;Lu;0;L;;;;;N;;;;2C3C; 2C0D;GLAGOLITIC CAPITAL LETTER KAKO;Lu;0;L;;;;;N;;;;2C3D; 2C0E;GLAGOLITIC CAPITAL LETTER LJUDIJE;Lu;0;L;;;;;N;;;;2C3E; 2C0F;GLAGOLITIC CAPITAL LETTER MYSLITE;Lu;0;L;;;;;N;;;;2C3F; 2C10;GLAGOLITIC CAPITAL LETTER NASHI;Lu;0;L;;;;;N;;;;2C40; 2C11;GLAGOLITIC CAPITAL LETTER ONU;Lu;0;L;;;;;N;;;;2C41; 2C12;GLAGOLITIC CAPITAL LETTER POKOJI;Lu;0;L;;;;;N;;;;2C42; 2C13;GLAGOLITIC CAPITAL LETTER RITSI;Lu;0;L;;;;;N;;;;2C43; 2C14;GLAGOLITIC CAPITAL LETTER SLOVO;Lu;0;L;;;;;N;;;;2C44; 2C15;GLAGOLITIC CAPITAL LETTER TVRIDO;Lu;0;L;;;;;N;;;;2C45; 2C16;GLAGOLITIC CAPITAL LETTER UKU;Lu;0;L;;;;;N;;;;2C46; 2C17;GLAGOLITIC CAPITAL LETTER FRITU;Lu;0;L;;;;;N;;;;2C47; 2C18;GLAGOLITIC CAPITAL LETTER HERU;Lu;0;L;;;;;N;;;;2C48; 2C19;GLAGOLITIC CAPITAL LETTER OTU;Lu;0;L;;;;;N;;;;2C49; 2C1A;GLAGOLITIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;2C4A; 2C1B;GLAGOLITIC CAPITAL LETTER SHTA;Lu;0;L;;;;;N;;;;2C4B; 2C1C;GLAGOLITIC CAPITAL LETTER TSI;Lu;0;L;;;;;N;;;;2C4C; 2C1D;GLAGOLITIC CAPITAL LETTER CHRIVI;Lu;0;L;;;;;N;;;;2C4D; 2C1E;GLAGOLITIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;2C4E; 2C1F;GLAGOLITIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;;;;2C4F; 2C20;GLAGOLITIC CAPITAL LETTER YERI;Lu;0;L;;;;;N;;;;2C50; 2C21;GLAGOLITIC CAPITAL LETTER YATI;Lu;0;L;;;;;N;;;;2C51; 2C22;GLAGOLITIC CAPITAL LETTER SPIDERY HA;Lu;0;L;;;;;N;;;;2C52; 2C23;GLAGOLITIC CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;2C53; 2C24;GLAGOLITIC CAPITAL LETTER SMALL YUS;Lu;0;L;;;;;N;;;;2C54; 2C25;GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL;Lu;0;L;;;;;N;;;;2C55; 2C26;GLAGOLITIC CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;2C56; 2C27;GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS;Lu;0;L;;;;;N;;;;2C57; 2C28;GLAGOLITIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;2C58; 2C29;GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS;Lu;0;L;;;;;N;;;;2C59; 2C2A;GLAGOLITIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;2C5A; 2C2B;GLAGOLITIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;2C5B; 2C2C;GLAGOLITIC CAPITAL LETTER SHTAPIC;Lu;0;L;;;;;N;;;;2C5C; 2C2D;GLAGOLITIC CAPITAL LETTER TROKUTASTI A;Lu;0;L;;;;;N;;;;2C5D; 2C2E;GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE;Lu;0;L;;;;;N;;;;2C5E; 2C30;GLAGOLITIC SMALL LETTER AZU;Ll;0;L;;;;;N;;;2C00;;2C00 2C31;GLAGOLITIC SMALL LETTER BUKY;Ll;0;L;;;;;N;;;2C01;;2C01 2C32;GLAGOLITIC SMALL LETTER VEDE;Ll;0;L;;;;;N;;;2C02;;2C02 2C33;GLAGOLITIC SMALL LETTER GLAGOLI;Ll;0;L;;;;;N;;;2C03;;2C03 2C34;GLAGOLITIC SMALL LETTER DOBRO;Ll;0;L;;;;;N;;;2C04;;2C04 2C35;GLAGOLITIC SMALL LETTER YESTU;Ll;0;L;;;;;N;;;2C05;;2C05 2C36;GLAGOLITIC SMALL LETTER ZHIVETE;Ll;0;L;;;;;N;;;2C06;;2C06 2C37;GLAGOLITIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;2C07;;2C07 2C38;GLAGOLITIC SMALL LETTER ZEMLJA;Ll;0;L;;;;;N;;;2C08;;2C08 2C39;GLAGOLITIC SMALL LETTER IZHE;Ll;0;L;;;;;N;;;2C09;;2C09 2C3A;GLAGOLITIC SMALL LETTER INITIAL IZHE;Ll;0;L;;;;;N;;;2C0A;;2C0A 2C3B;GLAGOLITIC SMALL LETTER I;Ll;0;L;;;;;N;;;2C0B;;2C0B 2C3C;GLAGOLITIC SMALL LETTER DJERVI;Ll;0;L;;;;;N;;;2C0C;;2C0C 2C3D;GLAGOLITIC SMALL LETTER KAKO;Ll;0;L;;;;;N;;;2C0D;;2C0D 2C3E;GLAGOLITIC SMALL LETTER LJUDIJE;Ll;0;L;;;;;N;;;2C0E;;2C0E 2C3F;GLAGOLITIC SMALL LETTER MYSLITE;Ll;0;L;;;;;N;;;2C0F;;2C0F 2C40;GLAGOLITIC SMALL LETTER NASHI;Ll;0;L;;;;;N;;;2C10;;2C10 2C41;GLAGOLITIC SMALL LETTER ONU;Ll;0;L;;;;;N;;;2C11;;2C11 2C42;GLAGOLITIC SMALL LETTER POKOJI;Ll;0;L;;;;;N;;;2C12;;2C12 2C43;GLAGOLITIC SMALL LETTER RITSI;Ll;0;L;;;;;N;;;2C13;;2C13 2C44;GLAGOLITIC SMALL LETTER SLOVO;Ll;0;L;;;;;N;;;2C14;;2C14 2C45;GLAGOLITIC SMALL LETTER TVRIDO;Ll;0;L;;;;;N;;;2C15;;2C15 2C46;GLAGOLITIC SMALL LETTER UKU;Ll;0;L;;;;;N;;;2C16;;2C16 2C47;GLAGOLITIC SMALL LETTER FRITU;Ll;0;L;;;;;N;;;2C17;;2C17 2C48;GLAGOLITIC SMALL LETTER HERU;Ll;0;L;;;;;N;;;2C18;;2C18 2C49;GLAGOLITIC SMALL LETTER OTU;Ll;0;L;;;;;N;;;2C19;;2C19 2C4A;GLAGOLITIC SMALL LETTER PE;Ll;0;L;;;;;N;;;2C1A;;2C1A 2C4B;GLAGOLITIC SMALL LETTER SHTA;Ll;0;L;;;;;N;;;2C1B;;2C1B 2C4C;GLAGOLITIC SMALL LETTER TSI;Ll;0;L;;;;;N;;;2C1C;;2C1C 2C4D;GLAGOLITIC SMALL LETTER CHRIVI;Ll;0;L;;;;;N;;;2C1D;;2C1D 2C4E;GLAGOLITIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;2C1E;;2C1E 2C4F;GLAGOLITIC SMALL LETTER YERU;Ll;0;L;;;;;N;;;2C1F;;2C1F 2C50;GLAGOLITIC SMALL LETTER YERI;Ll;0;L;;;;;N;;;2C20;;2C20 2C51;GLAGOLITIC SMALL LETTER YATI;Ll;0;L;;;;;N;;;2C21;;2C21 2C52;GLAGOLITIC SMALL LETTER SPIDERY HA;Ll;0;L;;;;;N;;;2C22;;2C22 2C53;GLAGOLITIC SMALL LETTER YU;Ll;0;L;;;;;N;;;2C23;;2C23 2C54;GLAGOLITIC SMALL LETTER SMALL YUS;Ll;0;L;;;;;N;;;2C24;;2C24 2C55;GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL;Ll;0;L;;;;;N;;;2C25;;2C25 2C56;GLAGOLITIC SMALL LETTER YO;Ll;0;L;;;;;N;;;2C26;;2C26 2C57;GLAGOLITIC SMALL LETTER IOTATED SMALL YUS;Ll;0;L;;;;;N;;;2C27;;2C27 2C58;GLAGOLITIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;2C28;;2C28 2C59;GLAGOLITIC SMALL LETTER IOTATED BIG YUS;Ll;0;L;;;;;N;;;2C29;;2C29 2C5A;GLAGOLITIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;2C2A;;2C2A 2C5B;GLAGOLITIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;2C2B;;2C2B 2C5C;GLAGOLITIC SMALL LETTER SHTAPIC;Ll;0;L;;;;;N;;;2C2C;;2C2C 2C5D;GLAGOLITIC SMALL LETTER TROKUTASTI A;Ll;0;L;;;;;N;;;2C2D;;2C2D 2C5E;GLAGOLITIC SMALL LETTER LATINATE MYSLITE;Ll;0;L;;;;;N;;;2C2E;;2C2E 2C60;LATIN CAPITAL LETTER L WITH DOUBLE BAR;Lu;0;L;;;;;N;;;;2C61; 2C61;LATIN SMALL LETTER L WITH DOUBLE BAR;Ll;0;L;;;;;N;;;2C60;;2C60 2C62;LATIN CAPITAL LETTER L WITH MIDDLE TILDE;Lu;0;L;;;;;N;;;;026B; 2C63;LATIN CAPITAL LETTER P WITH STROKE;Lu;0;L;;;;;N;;;;1D7D; 2C64;LATIN CAPITAL LETTER R WITH TAIL;Lu;0;L;;;;;N;;;;027D; 2C65;LATIN SMALL LETTER A WITH STROKE;Ll;0;L;;;;;N;;;023A;;023A 2C66;LATIN SMALL LETTER T WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;023E;;023E 2C67;LATIN CAPITAL LETTER H WITH DESCENDER;Lu;0;L;;;;;N;;;;2C68; 2C68;LATIN SMALL LETTER H WITH DESCENDER;Ll;0;L;;;;;N;;;2C67;;2C67 2C69;LATIN CAPITAL LETTER K WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6A; 2C6A;LATIN SMALL LETTER K WITH DESCENDER;Ll;0;L;;;;;N;;;2C69;;2C69 2C6B;LATIN CAPITAL LETTER Z WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6C; 2C6C;LATIN SMALL LETTER Z WITH DESCENDER;Ll;0;L;;;;;N;;;2C6B;;2C6B 2C6D;LATIN CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;0251; 2C6E;LATIN CAPITAL LETTER M WITH HOOK;Lu;0;L;;;;;N;;;;0271; 2C6F;LATIN CAPITAL LETTER TURNED A;Lu;0;L;;;;;N;;;;0250; 2C70;LATIN CAPITAL LETTER TURNED ALPHA;Lu;0;L;;;;;N;;;;0252; 2C71;LATIN SMALL LETTER V WITH RIGHT HOOK;Ll;0;L;;;;;N;;;;; 2C72;LATIN CAPITAL LETTER W WITH HOOK;Lu;0;L;;;;;N;;;;2C73; 2C73;LATIN SMALL LETTER W WITH HOOK;Ll;0;L;;;;;N;;;2C72;;2C72 2C74;LATIN SMALL LETTER V WITH CURL;Ll;0;L;;;;;N;;;;; 2C75;LATIN CAPITAL LETTER HALF H;Lu;0;L;;;;;N;;;;2C76; 2C76;LATIN SMALL LETTER HALF H;Ll;0;L;;;;;N;;;2C75;;2C75 2C77;LATIN SMALL LETTER TAILLESS PHI;Ll;0;L;;;;;N;;;;; 2C78;LATIN SMALL LETTER E WITH NOTCH;Ll;0;L;;;;;N;;;;; 2C79;LATIN SMALL LETTER TURNED R WITH TAIL;Ll;0;L;;;;;N;;;;; 2C7A;LATIN SMALL LETTER O WITH LOW RING INSIDE;Ll;0;L;;;;;N;;;;; 2C7B;LATIN LETTER SMALL CAPITAL TURNED E;Ll;0;L;;;;;N;;;;; 2C7C;LATIN SUBSCRIPT SMALL LETTER J;Lm;0;L;<sub> 006A;;;;N;;;;; 2C7D;MODIFIER LETTER CAPITAL V;Lm;0;L;<super> 0056;;;;N;;;;; 2C7E;LATIN CAPITAL LETTER S WITH SWASH TAIL;Lu;0;L;;;;;N;;;;023F; 2C7F;LATIN CAPITAL LETTER Z WITH SWASH TAIL;Lu;0;L;;;;;N;;;;0240; 2C80;COPTIC CAPITAL LETTER ALFA;Lu;0;L;;;;;N;;;;2C81; 2C81;COPTIC SMALL LETTER ALFA;Ll;0;L;;;;;N;;;2C80;;2C80 2C82;COPTIC CAPITAL LETTER VIDA;Lu;0;L;;;;;N;;;;2C83; 2C83;COPTIC SMALL LETTER VIDA;Ll;0;L;;;;;N;;;2C82;;2C82 2C84;COPTIC CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;2C85; 2C85;COPTIC SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;2C84;;2C84 2C86;COPTIC CAPITAL LETTER DALDA;Lu;0;L;;;;;N;;;;2C87; 2C87;COPTIC SMALL LETTER DALDA;Ll;0;L;;;;;N;;;2C86;;2C86 2C88;COPTIC CAPITAL LETTER EIE;Lu;0;L;;;;;N;;;;2C89; 2C89;COPTIC SMALL LETTER EIE;Ll;0;L;;;;;N;;;2C88;;2C88 2C8A;COPTIC CAPITAL LETTER SOU;Lu;0;L;;;;;N;;;;2C8B; 2C8B;COPTIC SMALL LETTER SOU;Ll;0;L;;;;;N;;;2C8A;;2C8A 2C8C;COPTIC CAPITAL LETTER ZATA;Lu;0;L;;;;;N;;;;2C8D; 2C8D;COPTIC SMALL LETTER ZATA;Ll;0;L;;;;;N;;;2C8C;;2C8C 2C8E;COPTIC CAPITAL LETTER HATE;Lu;0;L;;;;;N;;;;2C8F; 2C8F;COPTIC SMALL LETTER HATE;Ll;0;L;;;;;N;;;2C8E;;2C8E 2C90;COPTIC CAPITAL LETTER THETHE;Lu;0;L;;;;;N;;;;2C91; 2C91;COPTIC SMALL LETTER THETHE;Ll;0;L;;;;;N;;;2C90;;2C90 2C92;COPTIC CAPITAL LETTER IAUDA;Lu;0;L;;;;;N;;;;2C93; 2C93;COPTIC SMALL LETTER IAUDA;Ll;0;L;;;;;N;;;2C92;;2C92 2C94;COPTIC CAPITAL LETTER KAPA;Lu;0;L;;;;;N;;;;2C95; 2C95;COPTIC SMALL LETTER KAPA;Ll;0;L;;;;;N;;;2C94;;2C94 2C96;COPTIC CAPITAL LETTER LAULA;Lu;0;L;;;;;N;;;;2C97; 2C97;COPTIC SMALL LETTER LAULA;Ll;0;L;;;;;N;;;2C96;;2C96 2C98;COPTIC CAPITAL LETTER MI;Lu;0;L;;;;;N;;;;2C99; 2C99;COPTIC SMALL LETTER MI;Ll;0;L;;;;;N;;;2C98;;2C98 2C9A;COPTIC CAPITAL LETTER NI;Lu;0;L;;;;;N;;;;2C9B; 2C9B;COPTIC SMALL LETTER NI;Ll;0;L;;;;;N;;;2C9A;;2C9A 2C9C;COPTIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;2C9D; 2C9D;COPTIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;2C9C;;2C9C 2C9E;COPTIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;2C9F; 2C9F;COPTIC SMALL LETTER O;Ll;0;L;;;;;N;;;2C9E;;2C9E 2CA0;COPTIC CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;2CA1; 2CA1;COPTIC SMALL LETTER PI;Ll;0;L;;;;;N;;;2CA0;;2CA0 2CA2;COPTIC CAPITAL LETTER RO;Lu;0;L;;;;;N;;;;2CA3; 2CA3;COPTIC SMALL LETTER RO;Ll;0;L;;;;;N;;;2CA2;;2CA2 2CA4;COPTIC CAPITAL LETTER SIMA;Lu;0;L;;;;;N;;;;2CA5; 2CA5;COPTIC SMALL LETTER SIMA;Ll;0;L;;;;;N;;;2CA4;;2CA4 2CA6;COPTIC CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;2CA7; 2CA7;COPTIC SMALL LETTER TAU;Ll;0;L;;;;;N;;;2CA6;;2CA6 2CA8;COPTIC CAPITAL LETTER UA;Lu;0;L;;;;;N;;;;2CA9; 2CA9;COPTIC SMALL LETTER UA;Ll;0;L;;;;;N;;;2CA8;;2CA8 2CAA;COPTIC CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;2CAB; 2CAB;COPTIC SMALL LETTER FI;Ll;0;L;;;;;N;;;2CAA;;2CAA 2CAC;COPTIC CAPITAL LETTER KHI;Lu;0;L;;;;;N;;;;2CAD; 2CAD;COPTIC SMALL LETTER KHI;Ll;0;L;;;;;N;;;2CAC;;2CAC 2CAE;COPTIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;2CAF; 2CAF;COPTIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;2CAE;;2CAE 2CB0;COPTIC CAPITAL LETTER OOU;Lu;0;L;;;;;N;;;;2CB1; 2CB1;COPTIC SMALL LETTER OOU;Ll;0;L;;;;;N;;;2CB0;;2CB0 2CB2;COPTIC CAPITAL LETTER DIALECT-P ALEF;Lu;0;L;;;;;N;;;;2CB3; 2CB3;COPTIC SMALL LETTER DIALECT-P ALEF;Ll;0;L;;;;;N;;;2CB2;;2CB2 2CB4;COPTIC CAPITAL LETTER OLD COPTIC AIN;Lu;0;L;;;;;N;;;;2CB5; 2CB5;COPTIC SMALL LETTER OLD COPTIC AIN;Ll;0;L;;;;;N;;;2CB4;;2CB4 2CB6;COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE;Lu;0;L;;;;;N;;;;2CB7; 2CB7;COPTIC SMALL LETTER CRYPTOGRAMMIC EIE;Ll;0;L;;;;;N;;;2CB6;;2CB6 2CB8;COPTIC CAPITAL LETTER DIALECT-P KAPA;Lu;0;L;;;;;N;;;;2CB9; 2CB9;COPTIC SMALL LETTER DIALECT-P KAPA;Ll;0;L;;;;;N;;;2CB8;;2CB8 2CBA;COPTIC CAPITAL LETTER DIALECT-P NI;Lu;0;L;;;;;N;;;;2CBB; 2CBB;COPTIC SMALL LETTER DIALECT-P NI;Ll;0;L;;;;;N;;;2CBA;;2CBA 2CBC;COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI;Lu;0;L;;;;;N;;;;2CBD; 2CBD;COPTIC SMALL LETTER CRYPTOGRAMMIC NI;Ll;0;L;;;;;N;;;2CBC;;2CBC 2CBE;COPTIC CAPITAL LETTER OLD COPTIC OOU;Lu;0;L;;;;;N;;;;2CBF; 2CBF;COPTIC SMALL LETTER OLD COPTIC OOU;Ll;0;L;;;;;N;;;2CBE;;2CBE 2CC0;COPTIC CAPITAL LETTER SAMPI;Lu;0;L;;;;;N;;;;2CC1; 2CC1;COPTIC SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;2CC0;;2CC0 2CC2;COPTIC CAPITAL LETTER CROSSED SHEI;Lu;0;L;;;;;N;;;;2CC3; 2CC3;COPTIC SMALL LETTER CROSSED SHEI;Ll;0;L;;;;;N;;;2CC2;;2CC2 2CC4;COPTIC CAPITAL LETTER OLD COPTIC SHEI;Lu;0;L;;;;;N;;;;2CC5; 2CC5;COPTIC SMALL LETTER OLD COPTIC SHEI;Ll;0;L;;;;;N;;;2CC4;;2CC4 2CC6;COPTIC CAPITAL LETTER OLD COPTIC ESH;Lu;0;L;;;;;N;;;;2CC7; 2CC7;COPTIC SMALL LETTER OLD COPTIC ESH;Ll;0;L;;;;;N;;;2CC6;;2CC6 2CC8;COPTIC CAPITAL LETTER AKHMIMIC KHEI;Lu;0;L;;;;;N;;;;2CC9; 2CC9;COPTIC SMALL LETTER AKHMIMIC KHEI;Ll;0;L;;;;;N;;;2CC8;;2CC8 2CCA;COPTIC CAPITAL LETTER DIALECT-P HORI;Lu;0;L;;;;;N;;;;2CCB; 2CCB;COPTIC SMALL LETTER DIALECT-P HORI;Ll;0;L;;;;;N;;;2CCA;;2CCA 2CCC;COPTIC CAPITAL LETTER OLD COPTIC HORI;Lu;0;L;;;;;N;;;;2CCD; 2CCD;COPTIC SMALL LETTER OLD COPTIC HORI;Ll;0;L;;;;;N;;;2CCC;;2CCC 2CCE;COPTIC CAPITAL LETTER OLD COPTIC HA;Lu;0;L;;;;;N;;;;2CCF; 2CCF;COPTIC SMALL LETTER OLD COPTIC HA;Ll;0;L;;;;;N;;;2CCE;;2CCE 2CD0;COPTIC CAPITAL LETTER L-SHAPED HA;Lu;0;L;;;;;N;;;;2CD1; 2CD1;COPTIC SMALL LETTER L-SHAPED HA;Ll;0;L;;;;;N;;;2CD0;;2CD0 2CD2;COPTIC CAPITAL LETTER OLD COPTIC HEI;Lu;0;L;;;;;N;;;;2CD3; 2CD3;COPTIC SMALL LETTER OLD COPTIC HEI;Ll;0;L;;;;;N;;;2CD2;;2CD2 2CD4;COPTIC CAPITAL LETTER OLD COPTIC HAT;Lu;0;L;;;;;N;;;;2CD5; 2CD5;COPTIC SMALL LETTER OLD COPTIC HAT;Ll;0;L;;;;;N;;;2CD4;;2CD4 2CD6;COPTIC CAPITAL LETTER OLD COPTIC GANGIA;Lu;0;L;;;;;N;;;;2CD7; 2CD7;COPTIC SMALL LETTER OLD COPTIC GANGIA;Ll;0;L;;;;;N;;;2CD6;;2CD6 2CD8;COPTIC CAPITAL LETTER OLD COPTIC DJA;Lu;0;L;;;;;N;;;;2CD9; 2CD9;COPTIC SMALL LETTER OLD COPTIC DJA;Ll;0;L;;;;;N;;;2CD8;;2CD8 2CDA;COPTIC CAPITAL LETTER OLD COPTIC SHIMA;Lu;0;L;;;;;N;;;;2CDB; 2CDB;COPTIC SMALL LETTER OLD COPTIC SHIMA;Ll;0;L;;;;;N;;;2CDA;;2CDA 2CDC;COPTIC CAPITAL LETTER OLD NUBIAN SHIMA;Lu;0;L;;;;;N;;;;2CDD; 2CDD;COPTIC SMALL LETTER OLD NUBIAN SHIMA;Ll;0;L;;;;;N;;;2CDC;;2CDC 2CDE;COPTIC CAPITAL LETTER OLD NUBIAN NGI;Lu;0;L;;;;;N;;;;2CDF; 2CDF;COPTIC SMALL LETTER OLD NUBIAN NGI;Ll;0;L;;;;;N;;;2CDE;;2CDE 2CE0;COPTIC CAPITAL LETTER OLD NUBIAN NYI;Lu;0;L;;;;;N;;;;2CE1; 2CE1;COPTIC SMALL LETTER OLD NUBIAN NYI;Ll;0;L;;;;;N;;;2CE0;;2CE0 2CE2;COPTIC CAPITAL LETTER OLD NUBIAN WAU;Lu;0;L;;;;;N;;;;2CE3; 2CE3;COPTIC SMALL LETTER OLD NUBIAN WAU;Ll;0;L;;;;;N;;;2CE2;;2CE2 2CE4;COPTIC SYMBOL KAI;Ll;0;L;;;;;N;;;;; 2CE5;COPTIC SYMBOL MI RO;So;0;ON;;;;;N;;;;; 2CE6;COPTIC SYMBOL PI RO;So;0;ON;;;;;N;;;;; 2CE7;COPTIC SYMBOL STAUROS;So;0;ON;;;;;N;;;;; 2CE8;COPTIC SYMBOL TAU RO;So;0;ON;;;;;N;;;;; 2CE9;COPTIC SYMBOL KHI RO;So;0;ON;;;;;N;;;;; 2CEA;COPTIC SYMBOL SHIMA SIMA;So;0;ON;;;;;N;;;;; 2CEB;COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI;Lu;0;L;;;;;N;;;;2CEC; 2CEC;COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI;Ll;0;L;;;;;N;;;2CEB;;2CEB 2CED;COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA;Lu;0;L;;;;;N;;;;2CEE; 2CEE;COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA;Ll;0;L;;;;;N;;;2CED;;2CED 2CEF;COPTIC COMBINING NI ABOVE;Mn;230;NSM;;;;;N;;;;; 2CF0;COPTIC COMBINING SPIRITUS ASPER;Mn;230;NSM;;;;;N;;;;; 2CF1;COPTIC COMBINING SPIRITUS LENIS;Mn;230;NSM;;;;;N;;;;; 2CF2;COPTIC CAPITAL LETTER BOHAIRIC KHEI;Lu;0;L;;;;;N;;;;2CF3; 2CF3;COPTIC SMALL LETTER BOHAIRIC KHEI;Ll;0;L;;;;;N;;;2CF2;;2CF2 2CF9;COPTIC OLD NUBIAN FULL STOP;Po;0;ON;;;;;N;;;;; 2CFA;COPTIC OLD NUBIAN DIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; 2CFB;COPTIC OLD NUBIAN INDIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; 2CFC;COPTIC OLD NUBIAN VERSE DIVIDER;Po;0;ON;;;;;N;;;;; 2CFD;COPTIC FRACTION ONE HALF;No;0;ON;;;;1/2;N;;;;; 2CFE;COPTIC FULL STOP;Po;0;ON;;;;;N;;;;; 2CFF;COPTIC MORPHOLOGICAL DIVIDER;Po;0;ON;;;;;N;;;;; 2D00;GEORGIAN SMALL LETTER AN;Ll;0;L;;;;;N;;;10A0;;10A0 2D01;GEORGIAN SMALL LETTER BAN;Ll;0;L;;;;;N;;;10A1;;10A1 2D02;GEORGIAN SMALL LETTER GAN;Ll;0;L;;;;;N;;;10A2;;10A2 2D03;GEORGIAN SMALL LETTER DON;Ll;0;L;;;;;N;;;10A3;;10A3 2D04;GEORGIAN SMALL LETTER EN;Ll;0;L;;;;;N;;;10A4;;10A4 2D05;GEORGIAN SMALL LETTER VIN;Ll;0;L;;;;;N;;;10A5;;10A5 2D06;GEORGIAN SMALL LETTER ZEN;Ll;0;L;;;;;N;;;10A6;;10A6 2D07;GEORGIAN SMALL LETTER TAN;Ll;0;L;;;;;N;;;10A7;;10A7 2D08;GEORGIAN SMALL LETTER IN;Ll;0;L;;;;;N;;;10A8;;10A8 2D09;GEORGIAN SMALL LETTER KAN;Ll;0;L;;;;;N;;;10A9;;10A9 2D0A;GEORGIAN SMALL LETTER LAS;Ll;0;L;;;;;N;;;10AA;;10AA 2D0B;GEORGIAN SMALL LETTER MAN;Ll;0;L;;;;;N;;;10AB;;10AB 2D0C;GEORGIAN SMALL LETTER NAR;Ll;0;L;;;;;N;;;10AC;;10AC 2D0D;GEORGIAN SMALL LETTER ON;Ll;0;L;;;;;N;;;10AD;;10AD 2D0E;GEORGIAN SMALL LETTER PAR;Ll;0;L;;;;;N;;;10AE;;10AE 2D0F;GEORGIAN SMALL LETTER ZHAR;Ll;0;L;;;;;N;;;10AF;;10AF 2D10;GEORGIAN SMALL LETTER RAE;Ll;0;L;;;;;N;;;10B0;;10B0 2D11;GEORGIAN SMALL LETTER SAN;Ll;0;L;;;;;N;;;10B1;;10B1 2D12;GEORGIAN SMALL LETTER TAR;Ll;0;L;;;;;N;;;10B2;;10B2 2D13;GEORGIAN SMALL LETTER UN;Ll;0;L;;;;;N;;;10B3;;10B3 2D14;GEORGIAN SMALL LETTER PHAR;Ll;0;L;;;;;N;;;10B4;;10B4 2D15;GEORGIAN SMALL LETTER KHAR;Ll;0;L;;;;;N;;;10B5;;10B5 2D16;GEORGIAN SMALL LETTER GHAN;Ll;0;L;;;;;N;;;10B6;;10B6 2D17;GEORGIAN SMALL LETTER QAR;Ll;0;L;;;;;N;;;10B7;;10B7 2D18;GEORGIAN SMALL LETTER SHIN;Ll;0;L;;;;;N;;;10B8;;10B8 2D19;GEORGIAN SMALL LETTER CHIN;Ll;0;L;;;;;N;;;10B9;;10B9 2D1A;GEORGIAN SMALL LETTER CAN;Ll;0;L;;;;;N;;;10BA;;10BA 2D1B;GEORGIAN SMALL LETTER JIL;Ll;0;L;;;;;N;;;10BB;;10BB 2D1C;GEORGIAN SMALL LETTER CIL;Ll;0;L;;;;;N;;;10BC;;10BC 2D1D;GEORGIAN SMALL LETTER CHAR;Ll;0;L;;;;;N;;;10BD;;10BD 2D1E;GEORGIAN SMALL LETTER XAN;Ll;0;L;;;;;N;;;10BE;;10BE 2D1F;GEORGIAN SMALL LETTER JHAN;Ll;0;L;;;;;N;;;10BF;;10BF 2D20;GEORGIAN SMALL LETTER HAE;Ll;0;L;;;;;N;;;10C0;;10C0 2D21;GEORGIAN SMALL LETTER HE;Ll;0;L;;;;;N;;;10C1;;10C1 2D22;GEORGIAN SMALL LETTER HIE;Ll;0;L;;;;;N;;;10C2;;10C2 2D23;GEORGIAN SMALL LETTER WE;Ll;0;L;;;;;N;;;10C3;;10C3 2D24;GEORGIAN SMALL LETTER HAR;Ll;0;L;;;;;N;;;10C4;;10C4 2D25;GEORGIAN SMALL LETTER HOE;Ll;0;L;;;;;N;;;10C5;;10C5 2D27;GEORGIAN SMALL LETTER YN;Ll;0;L;;;;;N;;;10C7;;10C7 2D2D;GEORGIAN SMALL LETTER AEN;Ll;0;L;;;;;N;;;10CD;;10CD 2D30;TIFINAGH LETTER YA;Lo;0;L;;;;;N;;;;; 2D31;TIFINAGH LETTER YAB;Lo;0;L;;;;;N;;;;; 2D32;TIFINAGH LETTER YABH;Lo;0;L;;;;;N;;;;; 2D33;TIFINAGH LETTER YAG;Lo;0;L;;;;;N;;;;; 2D34;TIFINAGH LETTER YAGHH;Lo;0;L;;;;;N;;;;; 2D35;TIFINAGH LETTER BERBER ACADEMY YAJ;Lo;0;L;;;;;N;;;;; 2D36;TIFINAGH LETTER YAJ;Lo;0;L;;;;;N;;;;; 2D37;TIFINAGH LETTER YAD;Lo;0;L;;;;;N;;;;; 2D38;TIFINAGH LETTER YADH;Lo;0;L;;;;;N;;;;; 2D39;TIFINAGH LETTER YADD;Lo;0;L;;;;;N;;;;; 2D3A;TIFINAGH LETTER YADDH;Lo;0;L;;;;;N;;;;; 2D3B;TIFINAGH LETTER YEY;Lo;0;L;;;;;N;;;;; 2D3C;TIFINAGH LETTER YAF;Lo;0;L;;;;;N;;;;; 2D3D;TIFINAGH LETTER YAK;Lo;0;L;;;;;N;;;;; 2D3E;TIFINAGH LETTER TUAREG YAK;Lo;0;L;;;;;N;;;;; 2D3F;TIFINAGH LETTER YAKHH;Lo;0;L;;;;;N;;;;; 2D40;TIFINAGH LETTER YAH;Lo;0;L;;;;;N;;;;; 2D41;TIFINAGH LETTER BERBER ACADEMY YAH;Lo;0;L;;;;;N;;;;; 2D42;TIFINAGH LETTER TUAREG YAH;Lo;0;L;;;;;N;;;;; 2D43;TIFINAGH LETTER YAHH;Lo;0;L;;;;;N;;;;; 2D44;TIFINAGH LETTER YAA;Lo;0;L;;;;;N;;;;; 2D45;TIFINAGH LETTER YAKH;Lo;0;L;;;;;N;;;;; 2D46;TIFINAGH LETTER TUAREG YAKH;Lo;0;L;;;;;N;;;;; 2D47;TIFINAGH LETTER YAQ;Lo;0;L;;;;;N;;;;; 2D48;TIFINAGH LETTER TUAREG YAQ;Lo;0;L;;;;;N;;;;; 2D49;TIFINAGH LETTER YI;Lo;0;L;;;;;N;;;;; 2D4A;TIFINAGH LETTER YAZH;Lo;0;L;;;;;N;;;;; 2D4B;TIFINAGH LETTER AHAGGAR YAZH;Lo;0;L;;;;;N;;;;; 2D4C;TIFINAGH LETTER TUAREG YAZH;Lo;0;L;;;;;N;;;;; 2D4D;TIFINAGH LETTER YAL;Lo;0;L;;;;;N;;;;; 2D4E;TIFINAGH LETTER YAM;Lo;0;L;;;;;N;;;;; 2D4F;TIFINAGH LETTER YAN;Lo;0;L;;;;;N;;;;; 2D50;TIFINAGH LETTER TUAREG YAGN;Lo;0;L;;;;;N;;;;; 2D51;TIFINAGH LETTER TUAREG YANG;Lo;0;L;;;;;N;;;;; 2D52;TIFINAGH LETTER YAP;Lo;0;L;;;;;N;;;;; 2D53;TIFINAGH LETTER YU;Lo;0;L;;;;;N;;;;; 2D54;TIFINAGH LETTER YAR;Lo;0;L;;;;;N;;;;; 2D55;TIFINAGH LETTER YARR;Lo;0;L;;;;;N;;;;; 2D56;TIFINAGH LETTER YAGH;Lo;0;L;;;;;N;;;;; 2D57;TIFINAGH LETTER TUAREG YAGH;Lo;0;L;;;;;N;;;;; 2D58;TIFINAGH LETTER AYER YAGH;Lo;0;L;;;;;N;;;;; 2D59;TIFINAGH LETTER YAS;Lo;0;L;;;;;N;;;;; 2D5A;TIFINAGH LETTER YASS;Lo;0;L;;;;;N;;;;; 2D5B;TIFINAGH LETTER YASH;Lo;0;L;;;;;N;;;;; 2D5C;TIFINAGH LETTER YAT;Lo;0;L;;;;;N;;;;; 2D5D;TIFINAGH LETTER YATH;Lo;0;L;;;;;N;;;;; 2D5E;TIFINAGH LETTER YACH;Lo;0;L;;;;;N;;;;; 2D5F;TIFINAGH LETTER YATT;Lo;0;L;;;;;N;;;;; 2D60;TIFINAGH LETTER YAV;Lo;0;L;;;;;N;;;;; 2D61;TIFINAGH LETTER YAW;Lo;0;L;;;;;N;;;;; 2D62;TIFINAGH LETTER YAY;Lo;0;L;;;;;N;;;;; 2D63;TIFINAGH LETTER YAZ;Lo;0;L;;;;;N;;;;; 2D64;TIFINAGH LETTER TAWELLEMET YAZ;Lo;0;L;;;;;N;;;;; 2D65;TIFINAGH LETTER YAZZ;Lo;0;L;;;;;N;;;;; 2D66;TIFINAGH LETTER YE;Lo;0;L;;;;;N;;;;; 2D67;TIFINAGH LETTER YO;Lo;0;L;;;;;N;;;;; 2D6F;TIFINAGH MODIFIER LETTER LABIALIZATION MARK;Lm;0;L;<super> 2D61;;;;N;;;;; 2D70;TIFINAGH SEPARATOR MARK;Po;0;L;;;;;N;;;;; 2D7F;TIFINAGH CONSONANT JOINER;Mn;9;NSM;;;;;N;;;;; 2D80;ETHIOPIC SYLLABLE LOA;Lo;0;L;;;;;N;;;;; 2D81;ETHIOPIC SYLLABLE MOA;Lo;0;L;;;;;N;;;;; 2D82;ETHIOPIC SYLLABLE ROA;Lo;0;L;;;;;N;;;;; 2D83;ETHIOPIC SYLLABLE SOA;Lo;0;L;;;;;N;;;;; 2D84;ETHIOPIC SYLLABLE SHOA;Lo;0;L;;;;;N;;;;; 2D85;ETHIOPIC SYLLABLE BOA;Lo;0;L;;;;;N;;;;; 2D86;ETHIOPIC SYLLABLE TOA;Lo;0;L;;;;;N;;;;; 2D87;ETHIOPIC SYLLABLE COA;Lo;0;L;;;;;N;;;;; 2D88;ETHIOPIC SYLLABLE NOA;Lo;0;L;;;;;N;;;;; 2D89;ETHIOPIC SYLLABLE NYOA;Lo;0;L;;;;;N;;;;; 2D8A;ETHIOPIC SYLLABLE GLOTTAL OA;Lo;0;L;;;;;N;;;;; 2D8B;ETHIOPIC SYLLABLE ZOA;Lo;0;L;;;;;N;;;;; 2D8C;ETHIOPIC SYLLABLE DOA;Lo;0;L;;;;;N;;;;; 2D8D;ETHIOPIC SYLLABLE DDOA;Lo;0;L;;;;;N;;;;; 2D8E;ETHIOPIC SYLLABLE JOA;Lo;0;L;;;;;N;;;;; 2D8F;ETHIOPIC SYLLABLE THOA;Lo;0;L;;;;;N;;;;; 2D90;ETHIOPIC SYLLABLE CHOA;Lo;0;L;;;;;N;;;;; 2D91;ETHIOPIC SYLLABLE PHOA;Lo;0;L;;;;;N;;;;; 2D92;ETHIOPIC SYLLABLE POA;Lo;0;L;;;;;N;;;;; 2D93;ETHIOPIC SYLLABLE GGWA;Lo;0;L;;;;;N;;;;; 2D94;ETHIOPIC SYLLABLE GGWI;Lo;0;L;;;;;N;;;;; 2D95;ETHIOPIC SYLLABLE GGWEE;Lo;0;L;;;;;N;;;;; 2D96;ETHIOPIC SYLLABLE GGWE;Lo;0;L;;;;;N;;;;; 2DA0;ETHIOPIC SYLLABLE SSA;Lo;0;L;;;;;N;;;;; 2DA1;ETHIOPIC SYLLABLE SSU;Lo;0;L;;;;;N;;;;; 2DA2;ETHIOPIC SYLLABLE SSI;Lo;0;L;;;;;N;;;;; 2DA3;ETHIOPIC SYLLABLE SSAA;Lo;0;L;;;;;N;;;;; 2DA4;ETHIOPIC SYLLABLE SSEE;Lo;0;L;;;;;N;;;;; 2DA5;ETHIOPIC SYLLABLE SSE;Lo;0;L;;;;;N;;;;; 2DA6;ETHIOPIC SYLLABLE SSO;Lo;0;L;;;;;N;;;;; 2DA8;ETHIOPIC SYLLABLE CCA;Lo;0;L;;;;;N;;;;; 2DA9;ETHIOPIC SYLLABLE CCU;Lo;0;L;;;;;N;;;;; 2DAA;ETHIOPIC SYLLABLE CCI;Lo;0;L;;;;;N;;;;; 2DAB;ETHIOPIC SYLLABLE CCAA;Lo;0;L;;;;;N;;;;; 2DAC;ETHIOPIC SYLLABLE CCEE;Lo;0;L;;;;;N;;;;; 2DAD;ETHIOPIC SYLLABLE CCE;Lo;0;L;;;;;N;;;;; 2DAE;ETHIOPIC SYLLABLE CCO;Lo;0;L;;;;;N;;;;; 2DB0;ETHIOPIC SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; 2DB1;ETHIOPIC SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; 2DB2;ETHIOPIC SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; 2DB3;ETHIOPIC SYLLABLE ZZAA;Lo;0;L;;;;;N;;;;; 2DB4;ETHIOPIC SYLLABLE ZZEE;Lo;0;L;;;;;N;;;;; 2DB5;ETHIOPIC SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; 2DB6;ETHIOPIC SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; 2DB8;ETHIOPIC SYLLABLE CCHA;Lo;0;L;;;;;N;;;;; 2DB9;ETHIOPIC SYLLABLE CCHU;Lo;0;L;;;;;N;;;;; 2DBA;ETHIOPIC SYLLABLE CCHI;Lo;0;L;;;;;N;;;;; 2DBB;ETHIOPIC SYLLABLE CCHAA;Lo;0;L;;;;;N;;;;; 2DBC;ETHIOPIC SYLLABLE CCHEE;Lo;0;L;;;;;N;;;;; 2DBD;ETHIOPIC SYLLABLE CCHE;Lo;0;L;;;;;N;;;;; 2DBE;ETHIOPIC SYLLABLE CCHO;Lo;0;L;;;;;N;;;;; 2DC0;ETHIOPIC SYLLABLE QYA;Lo;0;L;;;;;N;;;;; 2DC1;ETHIOPIC SYLLABLE QYU;Lo;0;L;;;;;N;;;;; 2DC2;ETHIOPIC SYLLABLE QYI;Lo;0;L;;;;;N;;;;; 2DC3;ETHIOPIC SYLLABLE QYAA;Lo;0;L;;;;;N;;;;; 2DC4;ETHIOPIC SYLLABLE QYEE;Lo;0;L;;;;;N;;;;; 2DC5;ETHIOPIC SYLLABLE QYE;Lo;0;L;;;;;N;;;;; 2DC6;ETHIOPIC SYLLABLE QYO;Lo;0;L;;;;;N;;;;; 2DC8;ETHIOPIC SYLLABLE KYA;Lo;0;L;;;;;N;;;;; 2DC9;ETHIOPIC SYLLABLE KYU;Lo;0;L;;;;;N;;;;; 2DCA;ETHIOPIC SYLLABLE KYI;Lo;0;L;;;;;N;;;;; 2DCB;ETHIOPIC SYLLABLE KYAA;Lo;0;L;;;;;N;;;;; 2DCC;ETHIOPIC SYLLABLE KYEE;Lo;0;L;;;;;N;;;;; 2DCD;ETHIOPIC SYLLABLE KYE;Lo;0;L;;;;;N;;;;; 2DCE;ETHIOPIC SYLLABLE KYO;Lo;0;L;;;;;N;;;;; 2DD0;ETHIOPIC SYLLABLE XYA;Lo;0;L;;;;;N;;;;; 2DD1;ETHIOPIC SYLLABLE XYU;Lo;0;L;;;;;N;;;;; 2DD2;ETHIOPIC SYLLABLE XYI;Lo;0;L;;;;;N;;;;; 2DD3;ETHIOPIC SYLLABLE XYAA;Lo;0;L;;;;;N;;;;; 2DD4;ETHIOPIC SYLLABLE XYEE;Lo;0;L;;;;;N;;;;; 2DD5;ETHIOPIC SYLLABLE XYE;Lo;0;L;;;;;N;;;;; 2DD6;ETHIOPIC SYLLABLE XYO;Lo;0;L;;;;;N;;;;; 2DD8;ETHIOPIC SYLLABLE GYA;Lo;0;L;;;;;N;;;;; 2DD9;ETHIOPIC SYLLABLE GYU;Lo;0;L;;;;;N;;;;; 2DDA;ETHIOPIC SYLLABLE GYI;Lo;0;L;;;;;N;;;;; 2DDB;ETHIOPIC SYLLABLE GYAA;Lo;0;L;;;;;N;;;;; 2DDC;ETHIOPIC SYLLABLE GYEE;Lo;0;L;;;;;N;;;;; 2DDD;ETHIOPIC SYLLABLE GYE;Lo;0;L;;;;;N;;;;; 2DDE;ETHIOPIC SYLLABLE GYO;Lo;0;L;;;;;N;;;;; 2DE0;COMBINING CYRILLIC LETTER BE;Mn;230;NSM;;;;;N;;;;; 2DE1;COMBINING CYRILLIC LETTER VE;Mn;230;NSM;;;;;N;;;;; 2DE2;COMBINING CYRILLIC LETTER GHE;Mn;230;NSM;;;;;N;;;;; 2DE3;COMBINING CYRILLIC LETTER DE;Mn;230;NSM;;;;;N;;;;; 2DE4;COMBINING CYRILLIC LETTER ZHE;Mn;230;NSM;;;;;N;;;;; 2DE5;COMBINING CYRILLIC LETTER ZE;Mn;230;NSM;;;;;N;;;;; 2DE6;COMBINING CYRILLIC LETTER KA;Mn;230;NSM;;;;;N;;;;; 2DE7;COMBINING CYRILLIC LETTER EL;Mn;230;NSM;;;;;N;;;;; 2DE8;COMBINING CYRILLIC LETTER EM;Mn;230;NSM;;;;;N;;;;; 2DE9;COMBINING CYRILLIC LETTER EN;Mn;230;NSM;;;;;N;;;;; 2DEA;COMBINING CYRILLIC LETTER O;Mn;230;NSM;;;;;N;;;;; 2DEB;COMBINING CYRILLIC LETTER PE;Mn;230;NSM;;;;;N;;;;; 2DEC;COMBINING CYRILLIC LETTER ER;Mn;230;NSM;;;;;N;;;;; 2DED;COMBINING CYRILLIC LETTER ES;Mn;230;NSM;;;;;N;;;;; 2DEE;COMBINING CYRILLIC LETTER TE;Mn;230;NSM;;;;;N;;;;; 2DEF;COMBINING CYRILLIC LETTER HA;Mn;230;NSM;;;;;N;;;;; 2DF0;COMBINING CYRILLIC LETTER TSE;Mn;230;NSM;;;;;N;;;;; 2DF1;COMBINING CYRILLIC LETTER CHE;Mn;230;NSM;;;;;N;;;;; 2DF2;COMBINING CYRILLIC LETTER SHA;Mn;230;NSM;;;;;N;;;;; 2DF3;COMBINING CYRILLIC LETTER SHCHA;Mn;230;NSM;;;;;N;;;;; 2DF4;COMBINING CYRILLIC LETTER FITA;Mn;230;NSM;;;;;N;;;;; 2DF5;COMBINING CYRILLIC LETTER ES-TE;Mn;230;NSM;;;;;N;;;;; 2DF6;COMBINING CYRILLIC LETTER A;Mn;230;NSM;;;;;N;;;;; 2DF7;COMBINING CYRILLIC LETTER IE;Mn;230;NSM;;;;;N;;;;; 2DF8;COMBINING CYRILLIC LETTER DJERV;Mn;230;NSM;;;;;N;;;;; 2DF9;COMBINING CYRILLIC LETTER MONOGRAPH UK;Mn;230;NSM;;;;;N;;;;; 2DFA;COMBINING CYRILLIC LETTER YAT;Mn;230;NSM;;;;;N;;;;; 2DFB;COMBINING CYRILLIC LETTER YU;Mn;230;NSM;;;;;N;;;;; 2DFC;COMBINING CYRILLIC LETTER IOTIFIED A;Mn;230;NSM;;;;;N;;;;; 2DFD;COMBINING CYRILLIC LETTER LITTLE YUS;Mn;230;NSM;;;;;N;;;;; 2DFE;COMBINING CYRILLIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;; 2DFF;COMBINING CYRILLIC LETTER IOTIFIED BIG YUS;Mn;230;NSM;;;;;N;;;;; 2E00;RIGHT ANGLE SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; 2E01;RIGHT ANGLE DOTTED SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; 2E02;LEFT SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; 2E03;RIGHT SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; 2E04;LEFT DOTTED SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; 2E05;RIGHT DOTTED SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; 2E06;RAISED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; 2E07;RAISED DOTTED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; 2E08;DOTTED TRANSPOSITION MARKER;Po;0;ON;;;;;N;;;;; 2E09;LEFT TRANSPOSITION BRACKET;Pi;0;ON;;;;;Y;;;;; 2E0A;RIGHT TRANSPOSITION BRACKET;Pf;0;ON;;;;;Y;;;;; 2E0B;RAISED SQUARE;Po;0;ON;;;;;N;;;;; 2E0C;LEFT RAISED OMISSION BRACKET;Pi;0;ON;;;;;Y;;;;; 2E0D;RIGHT RAISED OMISSION BRACKET;Pf;0;ON;;;;;Y;;;;; 2E0E;EDITORIAL CORONIS;Po;0;ON;;;;;N;;;;; 2E0F;PARAGRAPHOS;Po;0;ON;;;;;N;;;;; 2E10;FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; 2E11;REVERSED FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; 2E12;HYPODIASTOLE;Po;0;ON;;;;;N;;;;; 2E13;DOTTED OBELOS;Po;0;ON;;;;;N;;;;; 2E14;DOWNWARDS ANCORA;Po;0;ON;;;;;N;;;;; 2E15;UPWARDS ANCORA;Po;0;ON;;;;;N;;;;; 2E16;DOTTED RIGHT-POINTING ANGLE;Po;0;ON;;;;;N;;;;; 2E17;DOUBLE OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;; 2E18;INVERTED INTERROBANG;Po;0;ON;;;;;N;;;;; 2E19;PALM BRANCH;Po;0;ON;;;;;N;;;;; 2E1A;HYPHEN WITH DIAERESIS;Pd;0;ON;;;;;N;;;;; 2E1B;TILDE WITH RING ABOVE;Po;0;ON;;;;;N;;;;; 2E1C;LEFT LOW PARAPHRASE BRACKET;Pi;0;ON;;;;;Y;;;;; 2E1D;RIGHT LOW PARAPHRASE BRACKET;Pf;0;ON;;;;;Y;;;;; 2E1E;TILDE WITH DOT ABOVE;Po;0;ON;;;;;N;;;;; 2E1F;TILDE WITH DOT BELOW;Po;0;ON;;;;;N;;;;; 2E20;LEFT VERTICAL BAR WITH QUILL;Pi;0;ON;;;;;Y;;;;; 2E21;RIGHT VERTICAL BAR WITH QUILL;Pf;0;ON;;;;;Y;;;;; 2E22;TOP LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; 2E23;TOP RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; 2E24;BOTTOM LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; 2E25;BOTTOM RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; 2E26;LEFT SIDEWAYS U BRACKET;Ps;0;ON;;;;;Y;;;;; 2E27;RIGHT SIDEWAYS U BRACKET;Pe;0;ON;;;;;Y;;;;; 2E28;LEFT DOUBLE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; 2E29;RIGHT DOUBLE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; 2E2A;TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; 2E2B;ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;; 2E2C;SQUARED FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; 2E2D;FIVE DOT MARK;Po;0;ON;;;;;N;;;;; 2E2E;REVERSED QUESTION MARK;Po;0;ON;;;;;N;;;;; 2E2F;VERTICAL TILDE;Lm;0;ON;;;;;N;;;;; 2E30;RING POINT;Po;0;ON;;;;;N;;;;; 2E31;WORD SEPARATOR MIDDLE DOT;Po;0;ON;;;;;N;;;;; 2E32;TURNED COMMA;Po;0;ON;;;;;N;;;;; 2E33;RAISED DOT;Po;0;ON;;;;;N;;;;; 2E34;RAISED COMMA;Po;0;ON;;;;;N;;;;; 2E35;TURNED SEMICOLON;Po;0;ON;;;;;N;;;;; 2E36;DAGGER WITH LEFT GUARD;Po;0;ON;;;;;N;;;;; 2E37;DAGGER WITH RIGHT GUARD;Po;0;ON;;;;;N;;;;; 2E38;TURNED DAGGER;Po;0;ON;;;;;N;;;;; 2E39;TOP HALF SECTION SIGN;Po;0;ON;;;;;N;;;;; 2E3A;TWO-EM DASH;Pd;0;ON;;;;;N;;;;; 2E3B;THREE-EM DASH;Pd;0;ON;;;;;N;;;;; 2E3C;STENOGRAPHIC FULL STOP;Po;0;ON;;;;;N;;;;; 2E3D;VERTICAL SIX DOTS;Po;0;ON;;;;;N;;;;; 2E3E;WIGGLY VERTICAL LINE;Po;0;ON;;;;;N;;;;; 2E3F;CAPITULUM;Po;0;ON;;;;;N;;;;; 2E40;DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;; 2E41;REVERSED COMMA;Po;0;ON;;;;;N;;;;; 2E42;DOUBLE LOW-REVERSED-9 QUOTATION MARK;Ps;0;ON;;;;;N;;;;; 2E43;DASH WITH LEFT UPTURN;Po;0;ON;;;;;N;;;;; 2E44;DOUBLE SUSPENSION MARK;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;;;;; 2E83;CJK RADICAL SECOND TWO;So;0;ON;;;;;N;;;;; 2E84;CJK RADICAL SECOND THREE;So;0;ON;;;;;N;;;;; 2E85;CJK RADICAL PERSON;So;0;ON;;;;;N;;;;; 2E86;CJK RADICAL BOX;So;0;ON;;;;;N;;;;; 2E87;CJK RADICAL TABLE;So;0;ON;;;;;N;;;;; 2E88;CJK RADICAL KNIFE ONE;So;0;ON;;;;;N;;;;; 2E89;CJK RADICAL KNIFE TWO;So;0;ON;;;;;N;;;;; 2E8A;CJK RADICAL DIVINATION;So;0;ON;;;;;N;;;;; 2E8B;CJK RADICAL SEAL;So;0;ON;;;;;N;;;;; 2E8C;CJK RADICAL SMALL ONE;So;0;ON;;;;;N;;;;; 2E8D;CJK RADICAL SMALL TWO;So;0;ON;;;;;N;;;;; 2E8E;CJK RADICAL LAME ONE;So;0;ON;;;;;N;;;;; 2E8F;CJK RADICAL LAME TWO;So;0;ON;;;;;N;;;;; 2E90;CJK RADICAL LAME THREE;So;0;ON;;;;;N;;;;; 2E91;CJK RADICAL LAME FOUR;So;0;ON;;;;;N;;;;; 2E92;CJK RADICAL SNAKE;So;0;ON;;;;;N;;;;; 2E93;CJK RADICAL THREAD;So;0;ON;;;;;N;;;;; 2E94;CJK RADICAL SNOUT ONE;So;0;ON;;;;;N;;;;; 2E95;CJK RADICAL SNOUT TWO;So;0;ON;;;;;N;;;;; 2E96;CJK RADICAL HEART ONE;So;0;ON;;;;;N;;;;; 2E97;CJK RADICAL HEART TWO;So;0;ON;;;;;N;;;;; 2E98;CJK RADICAL HAND;So;0;ON;;;;;N;;;;; 2E99;CJK RADICAL RAP;So;0;ON;;;;;N;;;;; 2E9B;CJK RADICAL CHOKE;So;0;ON;;;;;N;;;;; 2E9C;CJK RADICAL SUN;So;0;ON;;;;;N;;;;; 2E9D;CJK RADICAL MOON;So;0;ON;;;;;N;;;;; 2E9E;CJK RADICAL DEATH;So;0;ON;;;;;N;;;;; 2E9F;CJK RADICAL MOTHER;So;0;ON;<compat> 6BCD;;;;N;;;;; 2EA0;CJK RADICAL CIVILIAN;So;0;ON;;;;;N;;;;; 2EA1;CJK RADICAL WATER ONE;So;0;ON;;;;;N;;;;; 2EA2;CJK RADICAL WATER TWO;So;0;ON;;;;;N;;;;; 2EA3;CJK RADICAL FIRE;So;0;ON;;;;;N;;;;; 2EA4;CJK RADICAL PAW ONE;So;0;ON;;;;;N;;;;; 2EA5;CJK RADICAL PAW TWO;So;0;ON;;;;;N;;;;; 2EA6;CJK RADICAL SIMPLIFIED HALF TREE TRUNK;So;0;ON;;;;;N;;;;; 2EA7;CJK RADICAL COW;So;0;ON;;;;;N;;;;; 2EA8;CJK RADICAL DOG;So;0;ON;;;;;N;;;;; 2EA9;CJK RADICAL JADE;So;0;ON;;;;;N;;;;; 2EAA;CJK RADICAL BOLT OF CLOTH;So;0;ON;;;;;N;;;;; 2EAB;CJK RADICAL EYE;So;0;ON;;;;;N;;;;; 2EAC;CJK RADICAL SPIRIT ONE;So;0;ON;;;;;N;;;;; 2EAD;CJK RADICAL SPIRIT TWO;So;0;ON;;;;;N;;;;; 2EAE;CJK RADICAL BAMBOO;So;0;ON;;;;;N;;;;; 2EAF;CJK RADICAL SILK;So;0;ON;;;;;N;;;;; 2EB0;CJK RADICAL C-SIMPLIFIED SILK;So;0;ON;;;;;N;;;;; 2EB1;CJK RADICAL NET ONE;So;0;ON;;;;;N;;;;; 2EB2;CJK RADICAL NET TWO;So;0;ON;;;;;N;;;;; 2EB3;CJK RADICAL NET THREE;So;0;ON;;;;;N;;;;; 2EB4;CJK RADICAL NET FOUR;So;0;ON;;;;;N;;;;; 2EB5;CJK RADICAL MESH;So;0;ON;;;;;N;;;;; 2EB6;CJK RADICAL SHEEP;So;0;ON;;;;;N;;;;; 2EB7;CJK RADICAL RAM;So;0;ON;;;;;N;;;;; 2EB8;CJK RADICAL EWE;So;0;ON;;;;;N;;;;; 2EB9;CJK RADICAL OLD;So;0;ON;;;;;N;;;;; 2EBA;CJK RADICAL BRUSH ONE;So;0;ON;;;;;N;;;;; 2EBB;CJK RADICAL BRUSH TWO;So;0;ON;;;;;N;;;;; 2EBC;CJK RADICAL MEAT;So;0;ON;;;;;N;;;;; 2EBD;CJK RADICAL MORTAR;So;0;ON;;;;;N;;;;; 2EBE;CJK RADICAL GRASS ONE;So;0;ON;;;;;N;;;;; 2EBF;CJK RADICAL GRASS TWO;So;0;ON;;;;;N;;;;; 2EC0;CJK RADICAL GRASS THREE;So;0;ON;;;;;N;;;;; 2EC1;CJK RADICAL TIGER;So;0;ON;;;;;N;;;;; 2EC2;CJK RADICAL CLOTHES;So;0;ON;;;;;N;;;;; 2EC3;CJK RADICAL WEST ONE;So;0;ON;;;;;N;;;;; 2EC4;CJK RADICAL WEST TWO;So;0;ON;;;;;N;;;;; 2EC5;CJK RADICAL C-SIMPLIFIED SEE;So;0;ON;;;;;N;;;;; 2EC6;CJK RADICAL SIMPLIFIED HORN;So;0;ON;;;;;N;;;;; 2EC7;CJK RADICAL HORN;So;0;ON;;;;;N;;;;; 2EC8;CJK RADICAL C-SIMPLIFIED SPEECH;So;0;ON;;;;;N;;;;; 2EC9;CJK RADICAL C-SIMPLIFIED SHELL;So;0;ON;;;;;N;;;;; 2ECA;CJK RADICAL FOOT;So;0;ON;;;;;N;;;;; 2ECB;CJK RADICAL C-SIMPLIFIED CART;So;0;ON;;;;;N;;;;; 2ECC;CJK RADICAL SIMPLIFIED WALK;So;0;ON;;;;;N;;;;; 2ECD;CJK RADICAL WALK ONE;So;0;ON;;;;;N;;;;; 2ECE;CJK RADICAL WALK TWO;So;0;ON;;;;;N;;;;; 2ECF;CJK RADICAL CITY;So;0;ON;;;;;N;;;;; 2ED0;CJK RADICAL C-SIMPLIFIED GOLD;So;0;ON;;;;;N;;;;; 2ED1;CJK RADICAL LONG ONE;So;0;ON;;;;;N;;;;; 2ED2;CJK RADICAL LONG TWO;So;0;ON;;;;;N;;;;; 2ED3;CJK RADICAL C-SIMPLIFIED LONG;So;0;ON;;;;;N;;;;; 2ED4;CJK RADICAL C-SIMPLIFIED GATE;So;0;ON;;;;;N;;;;; 2ED5;CJK RADICAL MOUND ONE;So;0;ON;;;;;N;;;;; 2ED6;CJK RADICAL MOUND TWO;So;0;ON;;;;;N;;;;; 2ED7;CJK RADICAL RAIN;So;0;ON;;;;;N;;;;; 2ED8;CJK RADICAL BLUE;So;0;ON;;;;;N;;;;; 2ED9;CJK RADICAL C-SIMPLIFIED TANNED LEATHER;So;0;ON;;;;;N;;;;; 2EDA;CJK RADICAL C-SIMPLIFIED LEAF;So;0;ON;;;;;N;;;;; 2EDB;CJK RADICAL C-SIMPLIFIED WIND;So;0;ON;;;;;N;;;;; 2EDC;CJK RADICAL C-SIMPLIFIED FLY;So;0;ON;;;;;N;;;;; 2EDD;CJK RADICAL EAT ONE;So;0;ON;;;;;N;;;;; 2EDE;CJK RADICAL EAT TWO;So;0;ON;;;;;N;;;;; 2EDF;CJK RADICAL EAT THREE;So;0;ON;;;;;N;;;;; 2EE0;CJK RADICAL C-SIMPLIFIED EAT;So;0;ON;;;;;N;;;;; 2EE1;CJK RADICAL HEAD;So;0;ON;;;;;N;;;;; 2EE2;CJK RADICAL C-SIMPLIFIED HORSE;So;0;ON;;;;;N;;;;; 2EE3;CJK RADICAL BONE;So;0;ON;;;;;N;;;;; 2EE4;CJK RADICAL GHOST;So;0;ON;;;;;N;;;;; 2EE5;CJK RADICAL C-SIMPLIFIED FISH;So;0;ON;;;;;N;;;;; 2EE6;CJK RADICAL C-SIMPLIFIED BIRD;So;0;ON;;;;;N;;;;; 2EE7;CJK RADICAL C-SIMPLIFIED SALT;So;0;ON;;;;;N;;;;; 2EE8;CJK RADICAL SIMPLIFIED WHEAT;So;0;ON;;;;;N;;;;; 2EE9;CJK RADICAL SIMPLIFIED YELLOW;So;0;ON;;;;;N;;;;; 2EEA;CJK RADICAL C-SIMPLIFIED FROG;So;0;ON;;;;;N;;;;; 2EEB;CJK RADICAL J-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; 2EEC;CJK RADICAL C-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; 2EED;CJK RADICAL J-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; 2EEE;CJK RADICAL C-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; 2EEF;CJK RADICAL J-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; 2EF0;CJK RADICAL C-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; 2EF1;CJK RADICAL TURTLE;So;0;ON;;;;;N;;;;; 2EF2;CJK RADICAL J-SIMPLIFIED TURTLE;So;0;ON;;;;;N;;;;; 2EF3;CJK RADICAL C-SIMPLIFIED TURTLE;So;0;ON;<compat> 9F9F;;;;N;;;;; 2F00;KANGXI RADICAL ONE;So;0;ON;<compat> 4E00;;;;N;;;;; 2F01;KANGXI RADICAL LINE;So;0;ON;<compat> 4E28;;;;N;;;;; 2F02;KANGXI RADICAL DOT;So;0;ON;<compat> 4E36;;;;N;;;;; 2F03;KANGXI RADICAL SLASH;So;0;ON;<compat> 4E3F;;;;N;;;;; 2F04;KANGXI RADICAL SECOND;So;0;ON;<compat> 4E59;;;;N;;;;; 2F05;KANGXI RADICAL HOOK;So;0;ON;<compat> 4E85;;;;N;;;;; 2F06;KANGXI RADICAL TWO;So;0;ON;<compat> 4E8C;;;;N;;;;; 2F07;KANGXI RADICAL LID;So;0;ON;<compat> 4EA0;;;;N;;;;; 2F08;KANGXI RADICAL MAN;So;0;ON;<compat> 4EBA;;;;N;;;;; 2F09;KANGXI RADICAL LEGS;So;0;ON;<compat> 513F;;;;N;;;;; 2F0A;KANGXI RADICAL ENTER;So;0;ON;<compat> 5165;;;;N;;;;; 2F0B;KANGXI RADICAL EIGHT;So;0;ON;<compat> 516B;;;;N;;;;; 2F0C;KANGXI RADICAL DOWN BOX;So;0;ON;<compat> 5182;;;;N;;;;; 2F0D;KANGXI RADICAL COVER;So;0;ON;<compat> 5196;;;;N;;;;; 2F0E;KANGXI RADICAL ICE;So;0;ON;<compat> 51AB;;;;N;;;;; 2F0F;KANGXI RADICAL TABLE;So;0;ON;<compat> 51E0;;;;N;;;;; 2F10;KANGXI RADICAL OPEN BOX;So;0;ON;<compat> 51F5;;;;N;;;;; 2F11;KANGXI RADICAL KNIFE;So;0;ON;<compat> 5200;;;;N;;;;; 2F12;KANGXI RADICAL POWER;So;0;ON;<compat> 529B;;;;N;;;;; 2F13;KANGXI RADICAL WRAP;So;0;ON;<compat> 52F9;;;;N;;;;; 2F14;KANGXI RADICAL SPOON;So;0;ON;<compat> 5315;;;;N;;;;; 2F15;KANGXI RADICAL RIGHT OPEN BOX;So;0;ON;<compat> 531A;;;;N;;;;; 2F16;KANGXI RADICAL HIDING ENCLOSURE;So;0;ON;<compat> 5338;;;;N;;;;; 2F17;KANGXI RADICAL TEN;So;0;ON;<compat> 5341;;;;N;;;;; 2F18;KANGXI RADICAL DIVINATION;So;0;ON;<compat> 535C;;;;N;;;;; 2F19;KANGXI RADICAL SEAL;So;0;ON;<compat> 5369;;;;N;;;;; 2F1A;KANGXI RADICAL CLIFF;So;0;ON;<compat> 5382;;;;N;;;;; 2F1B;KANGXI RADICAL PRIVATE;So;0;ON;<compat> 53B6;;;;N;;;;; 2F1C;KANGXI RADICAL AGAIN;So;0;ON;<compat> 53C8;;;;N;;;;; 2F1D;KANGXI RADICAL MOUTH;So;0;ON;<compat> 53E3;;;;N;;;;; 2F1E;KANGXI RADICAL ENCLOSURE;So;0;ON;<compat> 56D7;;;;N;;;;; 2F1F;KANGXI RADICAL EARTH;So;0;ON;<compat> 571F;;;;N;;;;; 2F20;KANGXI RADICAL SCHOLAR;So;0;ON;<compat> 58EB;;;;N;;;;; 2F21;KANGXI RADICAL GO;So;0;ON;<compat> 5902;;;;N;;;;; 2F22;KANGXI RADICAL GO SLOWLY;So;0;ON;<compat> 590A;;;;N;;;;; 2F23;KANGXI RADICAL EVENING;So;0;ON;<compat> 5915;;;;N;;;;; 2F24;KANGXI RADICAL BIG;So;0;ON;<compat> 5927;;;;N;;;;; 2F25;KANGXI RADICAL WOMAN;So;0;ON;<compat> 5973;;;;N;;;;; 2F26;KANGXI RADICAL CHILD;So;0;ON;<compat> 5B50;;;;N;;;;; 2F27;KANGXI RADICAL ROOF;So;0;ON;<compat> 5B80;;;;N;;;;; 2F28;KANGXI RADICAL INCH;So;0;ON;<compat> 5BF8;;;;N;;;;; 2F29;KANGXI RADICAL SMALL;So;0;ON;<compat> 5C0F;;;;N;;;;; 2F2A;KANGXI RADICAL LAME;So;0;ON;<compat> 5C22;;;;N;;;;; 2F2B;KANGXI RADICAL CORPSE;So;0;ON;<compat> 5C38;;;;N;;;;; 2F2C;KANGXI RADICAL SPROUT;So;0;ON;<compat> 5C6E;;;;N;;;;; 2F2D;KANGXI RADICAL MOUNTAIN;So;0;ON;<compat> 5C71;;;;N;;;;; 2F2E;KANGXI RADICAL RIVER;So;0;ON;<compat> 5DDB;;;;N;;;;; 2F2F;KANGXI RADICAL WORK;So;0;ON;<compat> 5DE5;;;;N;;;;; 2F30;KANGXI RADICAL ONESELF;So;0;ON;<compat> 5DF1;;;;N;;;;; 2F31;KANGXI RADICAL TURBAN;So;0;ON;<compat> 5DFE;;;;N;;;;; 2F32;KANGXI RADICAL DRY;So;0;ON;<compat> 5E72;;;;N;;;;; 2F33;KANGXI RADICAL SHORT THREAD;So;0;ON;<compat> 5E7A;;;;N;;;;; 2F34;KANGXI RADICAL DOTTED CLIFF;So;0;ON;<compat> 5E7F;;;;N;;;;; 2F35;KANGXI RADICAL LONG STRIDE;So;0;ON;<compat> 5EF4;;;;N;;;;; 2F36;KANGXI RADICAL TWO HANDS;So;0;ON;<compat> 5EFE;;;;N;;;;; 2F37;KANGXI RADICAL SHOOT;So;0;ON;<compat> 5F0B;;;;N;;;;; 2F38;KANGXI RADICAL BOW;So;0;ON;<compat> 5F13;;;;N;;;;; 2F39;KANGXI RADICAL SNOUT;So;0;ON;<compat> 5F50;;;;N;;;;; 2F3A;KANGXI RADICAL BRISTLE;So;0;ON;<compat> 5F61;;;;N;;;;; 2F3B;KANGXI RADICAL STEP;So;0;ON;<compat> 5F73;;;;N;;;;; 2F3C;KANGXI RADICAL HEART;So;0;ON;<compat> 5FC3;;;;N;;;;; 2F3D;KANGXI RADICAL HALBERD;So;0;ON;<compat> 6208;;;;N;;;;; 2F3E;KANGXI RADICAL DOOR;So;0;ON;<compat> 6236;;;;N;;;;; 2F3F;KANGXI RADICAL HAND;So;0;ON;<compat> 624B;;;;N;;;;; 2F40;KANGXI RADICAL BRANCH;So;0;ON;<compat> 652F;;;;N;;;;; 2F41;KANGXI RADICAL RAP;So;0;ON;<compat> 6534;;;;N;;;;; 2F42;KANGXI RADICAL SCRIPT;So;0;ON;<compat> 6587;;;;N;;;;; 2F43;KANGXI RADICAL DIPPER;So;0;ON;<compat> 6597;;;;N;;;;; 2F44;KANGXI RADICAL AXE;So;0;ON;<compat> 65A4;;;;N;;;;; 2F45;KANGXI RADICAL SQUARE;So;0;ON;<compat> 65B9;;;;N;;;;; 2F46;KANGXI RADICAL NOT;So;0;ON;<compat> 65E0;;;;N;;;;; 2F47;KANGXI RADICAL SUN;So;0;ON;<compat> 65E5;;;;N;;;;; 2F48;KANGXI RADICAL SAY;So;0;ON;<compat> 66F0;;;;N;;;;; 2F49;KANGXI RADICAL MOON;So;0;ON;<compat> 6708;;;;N;;;;; 2F4A;KANGXI RADICAL TREE;So;0;ON;<compat> 6728;;;;N;;;;; 2F4B;KANGXI RADICAL LACK;So;0;ON;<compat> 6B20;;;;N;;;;; 2F4C;KANGXI RADICAL STOP;So;0;ON;<compat> 6B62;;;;N;;;;; 2F4D;KANGXI RADICAL DEATH;So;0;ON;<compat> 6B79;;;;N;;;;; 2F4E;KANGXI RADICAL WEAPON;So;0;ON;<compat> 6BB3;;;;N;;;;; 2F4F;KANGXI RADICAL DO NOT;So;0;ON;<compat> 6BCB;;;;N;;;;; 2F50;KANGXI RADICAL COMPARE;So;0;ON;<compat> 6BD4;;;;N;;;;; 2F51;KANGXI RADICAL FUR;So;0;ON;<compat> 6BDB;;;;N;;;;; 2F52;KANGXI RADICAL CLAN;So;0;ON;<compat> 6C0F;;;;N;;;;; 2F53;KANGXI RADICAL STEAM;So;0;ON;<compat> 6C14;;;;N;;;;; 2F54;KANGXI RADICAL WATER;So;0;ON;<compat> 6C34;;;;N;;;;; 2F55;KANGXI RADICAL FIRE;So;0;ON;<compat> 706B;;;;N;;;;; 2F56;KANGXI RADICAL CLAW;So;0;ON;<compat> 722A;;;;N;;;;; 2F57;KANGXI RADICAL FATHER;So;0;ON;<compat> 7236;;;;N;;;;; 2F58;KANGXI RADICAL DOUBLE X;So;0;ON;<compat> 723B;;;;N;;;;; 2F59;KANGXI RADICAL HALF TREE TRUNK;So;0;ON;<compat> 723F;;;;N;;;;; 2F5A;KANGXI RADICAL SLICE;So;0;ON;<compat> 7247;;;;N;;;;; 2F5B;KANGXI RADICAL FANG;So;0;ON;<compat> 7259;;;;N;;;;; 2F5C;KANGXI RADICAL COW;So;0;ON;<compat> 725B;;;;N;;;;; 2F5D;KANGXI RADICAL DOG;So;0;ON;<compat> 72AC;;;;N;;;;; 2F5E;KANGXI RADICAL PROFOUND;So;0;ON;<compat> 7384;;;;N;;;;; 2F5F;KANGXI RADICAL JADE;So;0;ON;<compat> 7389;;;;N;;;;; 2F60;KANGXI RADICAL MELON;So;0;ON;<compat> 74DC;;;;N;;;;; 2F61;KANGXI RADICAL TILE;So;0;ON;<compat> 74E6;;;;N;;;;; 2F62;KANGXI RADICAL SWEET;So;0;ON;<compat> 7518;;;;N;;;;; 2F63;KANGXI RADICAL LIFE;So;0;ON;<compat> 751F;;;;N;;;;; 2F64;KANGXI RADICAL USE;So;0;ON;<compat> 7528;;;;N;;;;; 2F65;KANGXI RADICAL FIELD;So;0;ON;<compat> 7530;;;;N;;;;; 2F66;KANGXI RADICAL BOLT OF CLOTH;So;0;ON;<compat> 758B;;;;N;;;;; 2F67;KANGXI RADICAL SICKNESS;So;0;ON;<compat> 7592;;;;N;;;;; 2F68;KANGXI RADICAL DOTTED TENT;So;0;ON;<compat> 7676;;;;N;;;;; 2F69;KANGXI RADICAL WHITE;So;0;ON;<compat> 767D;;;;N;;;;; 2F6A;KANGXI RADICAL SKIN;So;0;ON;<compat> 76AE;;;;N;;;;; 2F6B;KANGXI RADICAL DISH;So;0;ON;<compat> 76BF;;;;N;;;;; 2F6C;KANGXI RADICAL EYE;So;0;ON;<compat> 76EE;;;;N;;;;; 2F6D;KANGXI RADICAL SPEAR;So;0;ON;<compat> 77DB;;;;N;;;;; 2F6E;KANGXI RADICAL ARROW;So;0;ON;<compat> 77E2;;;;N;;;;; 2F6F;KANGXI RADICAL STONE;So;0;ON;<compat> 77F3;;;;N;;;;; 2F70;KANGXI RADICAL SPIRIT;So;0;ON;<compat> 793A;;;;N;;;;; 2F71;KANGXI RADICAL TRACK;So;0;ON;<compat> 79B8;;;;N;;;;; 2F72;KANGXI RADICAL GRAIN;So;0;ON;<compat> 79BE;;;;N;;;;; 2F73;KANGXI RADICAL CAVE;So;0;ON;<compat> 7A74;;;;N;;;;; 2F74;KANGXI RADICAL STAND;So;0;ON;<compat> 7ACB;;;;N;;;;; 2F75;KANGXI RADICAL BAMBOO;So;0;ON;<compat> 7AF9;;;;N;;;;; 2F76;KANGXI RADICAL RICE;So;0;ON;<compat> 7C73;;;;N;;;;; 2F77;KANGXI RADICAL SILK;So;0;ON;<compat> 7CF8;;;;N;;;;; 2F78;KANGXI RADICAL JAR;So;0;ON;<compat> 7F36;;;;N;;;;; 2F79;KANGXI RADICAL NET;So;0;ON;<compat> 7F51;;;;N;;;;; 2F7A;KANGXI RADICAL SHEEP;So;0;ON;<compat> 7F8A;;;;N;;;;; 2F7B;KANGXI RADICAL FEATHER;So;0;ON;<compat> 7FBD;;;;N;;;;; 2F7C;KANGXI RADICAL OLD;So;0;ON;<compat> 8001;;;;N;;;;; 2F7D;KANGXI RADICAL AND;So;0;ON;<compat> 800C;;;;N;;;;; 2F7E;KANGXI RADICAL PLOW;So;0;ON;<compat> 8012;;;;N;;;;; 2F7F;KANGXI RADICAL EAR;So;0;ON;<compat> 8033;;;;N;;;;; 2F80;KANGXI RADICAL BRUSH;So;0;ON;<compat> 807F;;;;N;;;;; 2F81;KANGXI RADICAL MEAT;So;0;ON;<compat> 8089;;;;N;;;;; 2F82;KANGXI RADICAL MINISTER;So;0;ON;<compat> 81E3;;;;N;;;;; 2F83;KANGXI RADICAL SELF;So;0;ON;<compat> 81EA;;;;N;;;;; 2F84;KANGXI RADICAL ARRIVE;So;0;ON;<compat> 81F3;;;;N;;;;; 2F85;KANGXI RADICAL MORTAR;So;0;ON;<compat> 81FC;;;;N;;;;; 2F86;KANGXI RADICAL TONGUE;So;0;ON;<compat> 820C;;;;N;;;;; 2F87;KANGXI RADICAL OPPOSE;So;0;ON;<compat> 821B;;;;N;;;;; 2F88;KANGXI RADICAL BOAT;So;0;ON;<compat> 821F;;;;N;;;;; 2F89;KANGXI RADICAL STOPPING;So;0;ON;<compat> 826E;;;;N;;;;; 2F8A;KANGXI RADICAL COLOR;So;0;ON;<compat> 8272;;;;N;;;;; 2F8B;KANGXI RADICAL GRASS;So;0;ON;<compat> 8278;;;;N;;;;; 2F8C;KANGXI RADICAL TIGER;So;0;ON;<compat> 864D;;;;N;;;;; 2F8D;KANGXI RADICAL INSECT;So;0;ON;<compat> 866B;;;;N;;;;; 2F8E;KANGXI RADICAL BLOOD;So;0;ON;<compat> 8840;;;;N;;;;; 2F8F;KANGXI RADICAL WALK ENCLOSURE;So;0;ON;<compat> 884C;;;;N;;;;; 2F90;KANGXI RADICAL CLOTHES;So;0;ON;<compat> 8863;;;;N;;;;; 2F91;KANGXI RADICAL WEST;So;0;ON;<compat> 897E;;;;N;;;;; 2F92;KANGXI RADICAL SEE;So;0;ON;<compat> 898B;;;;N;;;;; 2F93;KANGXI RADICAL HORN;So;0;ON;<compat> 89D2;;;;N;;;;; 2F94;KANGXI RADICAL SPEECH;So;0;ON;<compat> 8A00;;;;N;;;;; 2F95;KANGXI RADICAL VALLEY;So;0;ON;<compat> 8C37;;;;N;;;;; 2F96;KANGXI RADICAL BEAN;So;0;ON;<compat> 8C46;;;;N;;;;; 2F97;KANGXI RADICAL PIG;So;0;ON;<compat> 8C55;;;;N;;;;; 2F98;KANGXI RADICAL BADGER;So;0;ON;<compat> 8C78;;;;N;;;;; 2F99;KANGXI RADICAL SHELL;So;0;ON;<compat> 8C9D;;;;N;;;;; 2F9A;KANGXI RADICAL RED;So;0;ON;<compat> 8D64;;;;N;;;;; 2F9B;KANGXI RADICAL RUN;So;0;ON;<compat> 8D70;;;;N;;;;; 2F9C;KANGXI RADICAL FOOT;So;0;ON;<compat> 8DB3;;;;N;;;;; 2F9D;KANGXI RADICAL BODY;So;0;ON;<compat> 8EAB;;;;N;;;;; 2F9E;KANGXI RADICAL CART;So;0;ON;<compat> 8ECA;;;;N;;;;; 2F9F;KANGXI RADICAL BITTER;So;0;ON;<compat> 8F9B;;;;N;;;;; 2FA0;KANGXI RADICAL MORNING;So;0;ON;<compat> 8FB0;;;;N;;;;; 2FA1;KANGXI RADICAL WALK;So;0;ON;<compat> 8FB5;;;;N;;;;; 2FA2;KANGXI RADICAL CITY;So;0;ON;<compat> 9091;;;;N;;;;; 2FA3;KANGXI RADICAL WINE;So;0;ON;<compat> 9149;;;;N;;;;; 2FA4;KANGXI RADICAL DISTINGUISH;So;0;ON;<compat> 91C6;;;;N;;;;; 2FA5;KANGXI RADICAL VILLAGE;So;0;ON;<compat> 91CC;;;;N;;;;; 2FA6;KANGXI RADICAL GOLD;So;0;ON;<compat> 91D1;;;;N;;;;; 2FA7;KANGXI RADICAL LONG;So;0;ON;<compat> 9577;;;;N;;;;; 2FA8;KANGXI RADICAL GATE;So;0;ON;<compat> 9580;;;;N;;;;; 2FA9;KANGXI RADICAL MOUND;So;0;ON;<compat> 961C;;;;N;;;;; 2FAA;KANGXI RADICAL SLAVE;So;0;ON;<compat> 96B6;;;;N;;;;; 2FAB;KANGXI RADICAL SHORT TAILED BIRD;So;0;ON;<compat> 96B9;;;;N;;;;; 2FAC;KANGXI RADICAL RAIN;So;0;ON;<compat> 96E8;;;;N;;;;; 2FAD;KANGXI RADICAL BLUE;So;0;ON;<compat> 9751;;;;N;;;;; 2FAE;KANGXI RADICAL WRONG;So;0;ON;<compat> 975E;;;;N;;;;; 2FAF;KANGXI RADICAL FACE;So;0;ON;<compat> 9762;;;;N;;;;; 2FB0;KANGXI RADICAL LEATHER;So;0;ON;<compat> 9769;;;;N;;;;; 2FB1;KANGXI RADICAL TANNED LEATHER;So;0;ON;<compat> 97CB;;;;N;;;;; 2FB2;KANGXI RADICAL LEEK;So;0;ON;<compat> 97ED;;;;N;;;;; 2FB3;KANGXI RADICAL SOUND;So;0;ON;<compat> 97F3;;;;N;;;;; 2FB4;KANGXI RADICAL LEAF;So;0;ON;<compat> 9801;;;;N;;;;; 2FB5;KANGXI RADICAL WIND;So;0;ON;<compat> 98A8;;;;N;;;;; 2FB6;KANGXI RADICAL FLY;So;0;ON;<compat> 98DB;;;;N;;;;; 2FB7;KANGXI RADICAL EAT;So;0;ON;<compat> 98DF;;;;N;;;;; 2FB8;KANGXI RADICAL HEAD;So;0;ON;<compat> 9996;;;;N;;;;; 2FB9;KANGXI RADICAL FRAGRANT;So;0;ON;<compat> 9999;;;;N;;;;; 2FBA;KANGXI RADICAL HORSE;So;0;ON;<compat> 99AC;;;;N;;;;; 2FBB;KANGXI RADICAL BONE;So;0;ON;<compat> 9AA8;;;;N;;;;; 2FBC;KANGXI RADICAL TALL;So;0;ON;<compat> 9AD8;;;;N;;;;; 2FBD;KANGXI RADICAL HAIR;So;0;ON;<compat> 9ADF;;;;N;;;;; 2FBE;KANGXI RADICAL FIGHT;So;0;ON;<compat> 9B25;;;;N;;;;; 2FBF;KANGXI RADICAL SACRIFICIAL WINE;So;0;ON;<compat> 9B2F;;;;N;;;;; 2FC0;KANGXI RADICAL CAULDRON;So;0;ON;<compat> 9B32;;;;N;;;;; 2FC1;KANGXI RADICAL GHOST;So;0;ON;<compat> 9B3C;;;;N;;;;; 2FC2;KANGXI RADICAL FISH;So;0;ON;<compat> 9B5A;;;;N;;;;; 2FC3;KANGXI RADICAL BIRD;So;0;ON;<compat> 9CE5;;;;N;;;;; 2FC4;KANGXI RADICAL SALT;So;0;ON;<compat> 9E75;;;;N;;;;; 2FC5;KANGXI RADICAL DEER;So;0;ON;<compat> 9E7F;;;;N;;;;; 2FC6;KANGXI RADICAL WHEAT;So;0;ON;<compat> 9EA5;;;;N;;;;; 2FC7;KANGXI RADICAL HEMP;So;0;ON;<compat> 9EBB;;;;N;;;;; 2FC8;KANGXI RADICAL YELLOW;So;0;ON;<compat> 9EC3;;;;N;;;;; 2FC9;KANGXI RADICAL MILLET;So;0;ON;<compat> 9ECD;;;;N;;;;; 2FCA;KANGXI RADICAL BLACK;So;0;ON;<compat> 9ED1;;;;N;;;;; 2FCB;KANGXI RADICAL EMBROIDERY;So;0;ON;<compat> 9EF9;;;;N;;;;; 2FCC;KANGXI RADICAL FROG;So;0;ON;<compat> 9EFD;;;;N;;;;; 2FCD;KANGXI RADICAL TRIPOD;So;0;ON;<compat> 9F0E;;;;N;;;;; 2FCE;KANGXI RADICAL DRUM;So;0;ON;<compat> 9F13;;;;N;;;;; 2FCF;KANGXI RADICAL RAT;So;0;ON;<compat> 9F20;;;;N;;;;; 2FD0;KANGXI RADICAL NOSE;So;0;ON;<compat> 9F3B;;;;N;;;;; 2FD1;KANGXI RADICAL EVEN;So;0;ON;<compat> 9F4A;;;;N;;;;; 2FD2;KANGXI RADICAL TOOTH;So;0;ON;<compat> 9F52;;;;N;;;;; 2FD3;KANGXI RADICAL DRAGON;So;0;ON;<compat> 9F8D;;;;N;;;;; 2FD4;KANGXI RADICAL TURTLE;So;0;ON;<compat> 9F9C;;;;N;;;;; 2FD5;KANGXI RADICAL FLUTE;So;0;ON;<compat> 9FA0;;;;N;;;;; 2FF0;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT;So;0;ON;;;;;N;;;;; 2FF1;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW;So;0;ON;;;;;N;;;;; 2FF2;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT;So;0;ON;;;;;N;;;;; 2FF3;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW;So;0;ON;;;;;N;;;;; 2FF4;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND;So;0;ON;;;;;N;;;;; 2FF5;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE;So;0;ON;;;;;N;;;;; 2FF6;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW;So;0;ON;;;;;N;;;;; 2FF7;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT;So;0;ON;;;;;N;;;;; 2FF8;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT;So;0;ON;;;;;N;;;;; 2FF9;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT;So;0;ON;;;;;N;;;;; 2FFA;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT;So;0;ON;;;;;N;;;;; 2FFB;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID;So;0;ON;;;;;N;;;;; 3000;IDEOGRAPHIC SPACE;Zs;0;WS;<wide> 0020;;;;N;;;;; 3001;IDEOGRAPHIC COMMA;Po;0;ON;;;;;N;;;;; 3002;IDEOGRAPHIC FULL STOP;Po;0;ON;;;;;N;IDEOGRAPHIC PERIOD;;;; 3003;DITTO MARK;Po;0;ON;;;;;N;;;;; 3004;JAPANESE INDUSTRIAL STANDARD SYMBOL;So;0;ON;;;;;N;;;;; 3005;IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; 3006;IDEOGRAPHIC CLOSING MARK;Lo;0;L;;;;;N;;;;; 3007;IDEOGRAPHIC NUMBER ZERO;Nl;0;L;;;;0;N;;;;; 3008;LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING ANGLE BRACKET;;;; 3009;RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING ANGLE BRACKET;;;; 300A;LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING DOUBLE ANGLE BRACKET;;;; 300B;RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING DOUBLE ANGLE BRACKET;;;; 300C;LEFT CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING CORNER BRACKET;;;; 300D;RIGHT CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING CORNER BRACKET;;;; 300E;LEFT WHITE CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE CORNER BRACKET;;;; 300F;RIGHT WHITE CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE CORNER BRACKET;;;; 3010;LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING BLACK LENTICULAR BRACKET;;;; 3011;RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING BLACK LENTICULAR BRACKET;;;; 3012;POSTAL MARK;So;0;ON;;;;;N;;;;; 3013;GETA MARK;So;0;ON;;;;;N;;;;; 3014;LEFT TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING TORTOISE SHELL BRACKET;;;; 3015;RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING TORTOISE SHELL BRACKET;;;; 3016;LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE LENTICULAR BRACKET;;;; 3017;RIGHT WHITE LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE LENTICULAR BRACKET;;;; 3018;LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE TORTOISE SHELL BRACKET;;;; 3019;RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE TORTOISE SHELL BRACKET;;;; 301A;LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE SQUARE BRACKET;;;; 301B;RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE SQUARE BRACKET;;;; 301C;WAVE DASH;Pd;0;ON;;;;;N;;;;; 301D;REVERSED DOUBLE PRIME QUOTATION MARK;Ps;0;ON;;;;;N;;;;; 301E;DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; 301F;LOW DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; 3020;POSTAL MARK FACE;So;0;ON;;;;;N;;;;; 3021;HANGZHOU NUMERAL ONE;Nl;0;L;;;;1;N;;;;; 3022;HANGZHOU NUMERAL TWO;Nl;0;L;;;;2;N;;;;; 3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;; 3024;HANGZHOU NUMERAL FOUR;Nl;0;L;;;;4;N;;;;; 3025;HANGZHOU NUMERAL FIVE;Nl;0;L;;;;5;N;;;;; 3026;HANGZHOU NUMERAL SIX;Nl;0;L;;;;6;N;;;;; 3027;HANGZHOU NUMERAL SEVEN;Nl;0;L;;;;7;N;;;;; 3028;HANGZHOU NUMERAL EIGHT;Nl;0;L;;;;8;N;;;;; 3029;HANGZHOU NUMERAL NINE;Nl;0;L;;;;9;N;;;;; 302A;IDEOGRAPHIC LEVEL TONE MARK;Mn;218;NSM;;;;;N;;;;; 302B;IDEOGRAPHIC RISING TONE MARK;Mn;228;NSM;;;;;N;;;;; 302C;IDEOGRAPHIC DEPARTING TONE MARK;Mn;232;NSM;;;;;N;;;;; 302D;IDEOGRAPHIC ENTERING TONE MARK;Mn;222;NSM;;;;;N;;;;; 302E;HANGUL SINGLE DOT TONE MARK;Mc;224;L;;;;;N;;;;; 302F;HANGUL DOUBLE DOT TONE MARK;Mc;224;L;;;;;N;;;;; 3030;WAVY DASH;Pd;0;ON;;;;;N;;;;; 3031;VERTICAL KANA REPEAT MARK;Lm;0;L;;;;;N;;;;; 3032;VERTICAL KANA REPEAT WITH VOICED SOUND MARK;Lm;0;L;;;;;N;;;;; 3033;VERTICAL KANA REPEAT MARK UPPER HALF;Lm;0;L;;;;;N;;;;; 3034;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF;Lm;0;L;;;;;N;;;;; 3035;VERTICAL KANA REPEAT MARK LOWER HALF;Lm;0;L;;;;;N;;;;; 3036;CIRCLED POSTAL MARK;So;0;ON;<compat> 3012;;;;N;;;;; 3037;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL;So;0;ON;;;;;N;;;;; 3038;HANGZHOU NUMERAL TEN;Nl;0;L;<compat> 5341;;;10;N;;;;; 3039;HANGZHOU NUMERAL TWENTY;Nl;0;L;<compat> 5344;;;20;N;;;;; 303A;HANGZHOU NUMERAL THIRTY;Nl;0;L;<compat> 5345;;;30;N;;;;; 303B;VERTICAL IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; 303C;MASU MARK;Lo;0;L;;;;;N;;;;; 303D;PART ALTERNATION MARK;Po;0;ON;;;;;N;;;;; 303E;IDEOGRAPHIC VARIATION INDICATOR;So;0;ON;;;;;N;;;;; 303F;IDEOGRAPHIC HALF FILL SPACE;So;0;ON;;;;;N;;;;; 3041;HIRAGANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; 3042;HIRAGANA LETTER A;Lo;0;L;;;;;N;;;;; 3043;HIRAGANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; 3044;HIRAGANA LETTER I;Lo;0;L;;;;;N;;;;; 3045;HIRAGANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; 3046;HIRAGANA LETTER U;Lo;0;L;;;;;N;;;;; 3047;HIRAGANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; 3048;HIRAGANA LETTER E;Lo;0;L;;;;;N;;;;; 3049;HIRAGANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; 304A;HIRAGANA LETTER O;Lo;0;L;;;;;N;;;;; 304B;HIRAGANA LETTER KA;Lo;0;L;;;;;N;;;;; 304C;HIRAGANA LETTER GA;Lo;0;L;304B 3099;;;;N;;;;; 304D;HIRAGANA LETTER KI;Lo;0;L;;;;;N;;;;; 304E;HIRAGANA LETTER GI;Lo;0;L;304D 3099;;;;N;;;;; 304F;HIRAGANA LETTER KU;Lo;0;L;;;;;N;;;;; 3050;HIRAGANA LETTER GU;Lo;0;L;304F 3099;;;;N;;;;; 3051;HIRAGANA LETTER KE;Lo;0;L;;;;;N;;;;; 3052;HIRAGANA LETTER GE;Lo;0;L;3051 3099;;;;N;;;;; 3053;HIRAGANA LETTER KO;Lo;0;L;;;;;N;;;;; 3054;HIRAGANA LETTER GO;Lo;0;L;3053 3099;;;;N;;;;; 3055;HIRAGANA LETTER SA;Lo;0;L;;;;;N;;;;; 3056;HIRAGANA LETTER ZA;Lo;0;L;3055 3099;;;;N;;;;; 3057;HIRAGANA LETTER SI;Lo;0;L;;;;;N;;;;; 3058;HIRAGANA LETTER ZI;Lo;0;L;3057 3099;;;;N;;;;; 3059;HIRAGANA LETTER SU;Lo;0;L;;;;;N;;;;; 305A;HIRAGANA LETTER ZU;Lo;0;L;3059 3099;;;;N;;;;; 305B;HIRAGANA LETTER SE;Lo;0;L;;;;;N;;;;; 305C;HIRAGANA LETTER ZE;Lo;0;L;305B 3099;;;;N;;;;; 305D;HIRAGANA LETTER SO;Lo;0;L;;;;;N;;;;; 305E;HIRAGANA LETTER ZO;Lo;0;L;305D 3099;;;;N;;;;; 305F;HIRAGANA LETTER TA;Lo;0;L;;;;;N;;;;; 3060;HIRAGANA LETTER DA;Lo;0;L;305F 3099;;;;N;;;;; 3061;HIRAGANA LETTER TI;Lo;0;L;;;;;N;;;;; 3062;HIRAGANA LETTER DI;Lo;0;L;3061 3099;;;;N;;;;; 3063;HIRAGANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; 3064;HIRAGANA LETTER TU;Lo;0;L;;;;;N;;;;; 3065;HIRAGANA LETTER DU;Lo;0;L;3064 3099;;;;N;;;;; 3066;HIRAGANA LETTER TE;Lo;0;L;;;;;N;;;;; 3067;HIRAGANA LETTER DE;Lo;0;L;3066 3099;;;;N;;;;; 3068;HIRAGANA LETTER TO;Lo;0;L;;;;;N;;;;; 3069;HIRAGANA LETTER DO;Lo;0;L;3068 3099;;;;N;;;;; 306A;HIRAGANA LETTER NA;Lo;0;L;;;;;N;;;;; 306B;HIRAGANA LETTER NI;Lo;0;L;;;;;N;;;;; 306C;HIRAGANA LETTER NU;Lo;0;L;;;;;N;;;;; 306D;HIRAGANA LETTER NE;Lo;0;L;;;;;N;;;;; 306E;HIRAGANA LETTER NO;Lo;0;L;;;;;N;;;;; 306F;HIRAGANA LETTER HA;Lo;0;L;;;;;N;;;;; 3070;HIRAGANA LETTER BA;Lo;0;L;306F 3099;;;;N;;;;; 3071;HIRAGANA LETTER PA;Lo;0;L;306F 309A;;;;N;;;;; 3072;HIRAGANA LETTER HI;Lo;0;L;;;;;N;;;;; 3073;HIRAGANA LETTER BI;Lo;0;L;3072 3099;;;;N;;;;; 3074;HIRAGANA LETTER PI;Lo;0;L;3072 309A;;;;N;;;;; 3075;HIRAGANA LETTER HU;Lo;0;L;;;;;N;;;;; 3076;HIRAGANA LETTER BU;Lo;0;L;3075 3099;;;;N;;;;; 3077;HIRAGANA LETTER PU;Lo;0;L;3075 309A;;;;N;;;;; 3078;HIRAGANA LETTER HE;Lo;0;L;;;;;N;;;;; 3079;HIRAGANA LETTER BE;Lo;0;L;3078 3099;;;;N;;;;; 307A;HIRAGANA LETTER PE;Lo;0;L;3078 309A;;;;N;;;;; 307B;HIRAGANA LETTER HO;Lo;0;L;;;;;N;;;;; 307C;HIRAGANA LETTER BO;Lo;0;L;307B 3099;;;;N;;;;; 307D;HIRAGANA LETTER PO;Lo;0;L;307B 309A;;;;N;;;;; 307E;HIRAGANA LETTER MA;Lo;0;L;;;;;N;;;;; 307F;HIRAGANA LETTER MI;Lo;0;L;;;;;N;;;;; 3080;HIRAGANA LETTER MU;Lo;0;L;;;;;N;;;;; 3081;HIRAGANA LETTER ME;Lo;0;L;;;;;N;;;;; 3082;HIRAGANA LETTER MO;Lo;0;L;;;;;N;;;;; 3083;HIRAGANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; 3084;HIRAGANA LETTER YA;Lo;0;L;;;;;N;;;;; 3085;HIRAGANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; 3086;HIRAGANA LETTER YU;Lo;0;L;;;;;N;;;;; 3087;HIRAGANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; 3088;HIRAGANA LETTER YO;Lo;0;L;;;;;N;;;;; 3089;HIRAGANA LETTER RA;Lo;0;L;;;;;N;;;;; 308A;HIRAGANA LETTER RI;Lo;0;L;;;;;N;;;;; 308B;HIRAGANA LETTER RU;Lo;0;L;;;;;N;;;;; 308C;HIRAGANA LETTER RE;Lo;0;L;;;;;N;;;;; 308D;HIRAGANA LETTER RO;Lo;0;L;;;;;N;;;;; 308E;HIRAGANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; 308F;HIRAGANA LETTER WA;Lo;0;L;;;;;N;;;;; 3090;HIRAGANA LETTER WI;Lo;0;L;;;;;N;;;;; 3091;HIRAGANA LETTER WE;Lo;0;L;;;;;N;;;;; 3092;HIRAGANA LETTER WO;Lo;0;L;;;;;N;;;;; 3093;HIRAGANA LETTER N;Lo;0;L;;;;;N;;;;; 3094;HIRAGANA LETTER VU;Lo;0;L;3046 3099;;;;N;;;;; 3095;HIRAGANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; 3096;HIRAGANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; 3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;; 309A;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;;;; 309B;KATAKANA-HIRAGANA VOICED SOUND MARK;Sk;0;ON;<compat> 0020 3099;;;;N;;;;; 309C;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Sk;0;ON;<compat> 0020 309A;;;;N;;;;; 309D;HIRAGANA ITERATION MARK;Lm;0;L;;;;;N;;;;; 309E;HIRAGANA VOICED ITERATION MARK;Lm;0;L;309D 3099;;;;N;;;;; 309F;HIRAGANA DIGRAPH YORI;Lo;0;L;<vertical> 3088 308A;;;;N;;;;; 30A0;KATAKANA-HIRAGANA DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;; 30A1;KATAKANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; 30A2;KATAKANA LETTER A;Lo;0;L;;;;;N;;;;; 30A3;KATAKANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; 30A4;KATAKANA LETTER I;Lo;0;L;;;;;N;;;;; 30A5;KATAKANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; 30A6;KATAKANA LETTER U;Lo;0;L;;;;;N;;;;; 30A7;KATAKANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; 30A8;KATAKANA LETTER E;Lo;0;L;;;;;N;;;;; 30A9;KATAKANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; 30AA;KATAKANA LETTER O;Lo;0;L;;;;;N;;;;; 30AB;KATAKANA LETTER KA;Lo;0;L;;;;;N;;;;; 30AC;KATAKANA LETTER GA;Lo;0;L;30AB 3099;;;;N;;;;; 30AD;KATAKANA LETTER KI;Lo;0;L;;;;;N;;;;; 30AE;KATAKANA LETTER GI;Lo;0;L;30AD 3099;;;;N;;;;; 30AF;KATAKANA LETTER KU;Lo;0;L;;;;;N;;;;; 30B0;KATAKANA LETTER GU;Lo;0;L;30AF 3099;;;;N;;;;; 30B1;KATAKANA LETTER KE;Lo;0;L;;;;;N;;;;; 30B2;KATAKANA LETTER GE;Lo;0;L;30B1 3099;;;;N;;;;; 30B3;KATAKANA LETTER KO;Lo;0;L;;;;;N;;;;; 30B4;KATAKANA LETTER GO;Lo;0;L;30B3 3099;;;;N;;;;; 30B5;KATAKANA LETTER SA;Lo;0;L;;;;;N;;;;; 30B6;KATAKANA LETTER ZA;Lo;0;L;30B5 3099;;;;N;;;;; 30B7;KATAKANA LETTER SI;Lo;0;L;;;;;N;;;;; 30B8;KATAKANA LETTER ZI;Lo;0;L;30B7 3099;;;;N;;;;; 30B9;KATAKANA LETTER SU;Lo;0;L;;;;;N;;;;; 30BA;KATAKANA LETTER ZU;Lo;0;L;30B9 3099;;;;N;;;;; 30BB;KATAKANA LETTER SE;Lo;0;L;;;;;N;;;;; 30BC;KATAKANA LETTER ZE;Lo;0;L;30BB 3099;;;;N;;;;; 30BD;KATAKANA LETTER SO;Lo;0;L;;;;;N;;;;; 30BE;KATAKANA LETTER ZO;Lo;0;L;30BD 3099;;;;N;;;;; 30BF;KATAKANA LETTER TA;Lo;0;L;;;;;N;;;;; 30C0;KATAKANA LETTER DA;Lo;0;L;30BF 3099;;;;N;;;;; 30C1;KATAKANA LETTER TI;Lo;0;L;;;;;N;;;;; 30C2;KATAKANA LETTER DI;Lo;0;L;30C1 3099;;;;N;;;;; 30C3;KATAKANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; 30C4;KATAKANA LETTER TU;Lo;0;L;;;;;N;;;;; 30C5;KATAKANA LETTER DU;Lo;0;L;30C4 3099;;;;N;;;;; 30C6;KATAKANA LETTER TE;Lo;0;L;;;;;N;;;;; 30C7;KATAKANA LETTER DE;Lo;0;L;30C6 3099;;;;N;;;;; 30C8;KATAKANA LETTER TO;Lo;0;L;;;;;N;;;;; 30C9;KATAKANA LETTER DO;Lo;0;L;30C8 3099;;;;N;;;;; 30CA;KATAKANA LETTER NA;Lo;0;L;;;;;N;;;;; 30CB;KATAKANA LETTER NI;Lo;0;L;;;;;N;;;;; 30CC;KATAKANA LETTER NU;Lo;0;L;;;;;N;;;;; 30CD;KATAKANA LETTER NE;Lo;0;L;;;;;N;;;;; 30CE;KATAKANA LETTER NO;Lo;0;L;;;;;N;;;;; 30CF;KATAKANA LETTER HA;Lo;0;L;;;;;N;;;;; 30D0;KATAKANA LETTER BA;Lo;0;L;30CF 3099;;;;N;;;;; 30D1;KATAKANA LETTER PA;Lo;0;L;30CF 309A;;;;N;;;;; 30D2;KATAKANA LETTER HI;Lo;0;L;;;;;N;;;;; 30D3;KATAKANA LETTER BI;Lo;0;L;30D2 3099;;;;N;;;;; 30D4;KATAKANA LETTER PI;Lo;0;L;30D2 309A;;;;N;;;;; 30D5;KATAKANA LETTER HU;Lo;0;L;;;;;N;;;;; 30D6;KATAKANA LETTER BU;Lo;0;L;30D5 3099;;;;N;;;;; 30D7;KATAKANA LETTER PU;Lo;0;L;30D5 309A;;;;N;;;;; 30D8;KATAKANA LETTER HE;Lo;0;L;;;;;N;;;;; 30D9;KATAKANA LETTER BE;Lo;0;L;30D8 3099;;;;N;;;;; 30DA;KATAKANA LETTER PE;Lo;0;L;30D8 309A;;;;N;;;;; 30DB;KATAKANA LETTER HO;Lo;0;L;;;;;N;;;;; 30DC;KATAKANA LETTER BO;Lo;0;L;30DB 3099;;;;N;;;;; 30DD;KATAKANA LETTER PO;Lo;0;L;30DB 309A;;;;N;;;;; 30DE;KATAKANA LETTER MA;Lo;0;L;;;;;N;;;;; 30DF;KATAKANA LETTER MI;Lo;0;L;;;;;N;;;;; 30E0;KATAKANA LETTER MU;Lo;0;L;;;;;N;;;;; 30E1;KATAKANA LETTER ME;Lo;0;L;;;;;N;;;;; 30E2;KATAKANA LETTER MO;Lo;0;L;;;;;N;;;;; 30E3;KATAKANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; 30E4;KATAKANA LETTER YA;Lo;0;L;;;;;N;;;;; 30E5;KATAKANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; 30E6;KATAKANA LETTER YU;Lo;0;L;;;;;N;;;;; 30E7;KATAKANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; 30E8;KATAKANA LETTER YO;Lo;0;L;;;;;N;;;;; 30E9;KATAKANA LETTER RA;Lo;0;L;;;;;N;;;;; 30EA;KATAKANA LETTER RI;Lo;0;L;;;;;N;;;;; 30EB;KATAKANA LETTER RU;Lo;0;L;;;;;N;;;;; 30EC;KATAKANA LETTER RE;Lo;0;L;;;;;N;;;;; 30ED;KATAKANA LETTER RO;Lo;0;L;;;;;N;;;;; 30EE;KATAKANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; 30EF;KATAKANA LETTER WA;Lo;0;L;;;;;N;;;;; 30F0;KATAKANA LETTER WI;Lo;0;L;;;;;N;;;;; 30F1;KATAKANA LETTER WE;Lo;0;L;;;;;N;;;;; 30F2;KATAKANA LETTER WO;Lo;0;L;;;;;N;;;;; 30F3;KATAKANA LETTER N;Lo;0;L;;;;;N;;;;; 30F4;KATAKANA LETTER VU;Lo;0;L;30A6 3099;;;;N;;;;; 30F5;KATAKANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; 30F6;KATAKANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; 30F7;KATAKANA LETTER VA;Lo;0;L;30EF 3099;;;;N;;;;; 30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;; 30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;; 30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;; 30FB;KATAKANA MIDDLE DOT;Po;0;ON;;;;;N;;;;; 30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;; 30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;; 30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;; 30FF;KATAKANA DIGRAPH KOTO;Lo;0;L;<vertical> 30B3 30C8;;;;N;;;;; 3105;BOPOMOFO LETTER B;Lo;0;L;;;;;N;;;;; 3106;BOPOMOFO LETTER P;Lo;0;L;;;;;N;;;;; 3107;BOPOMOFO LETTER M;Lo;0;L;;;;;N;;;;; 3108;BOPOMOFO LETTER F;Lo;0;L;;;;;N;;;;; 3109;BOPOMOFO LETTER D;Lo;0;L;;;;;N;;;;; 310A;BOPOMOFO LETTER T;Lo;0;L;;;;;N;;;;; 310B;BOPOMOFO LETTER N;Lo;0;L;;;;;N;;;;; 310C;BOPOMOFO LETTER L;Lo;0;L;;;;;N;;;;; 310D;BOPOMOFO LETTER G;Lo;0;L;;;;;N;;;;; 310E;BOPOMOFO LETTER K;Lo;0;L;;;;;N;;;;; 310F;BOPOMOFO LETTER H;Lo;0;L;;;;;N;;;;; 3110;BOPOMOFO LETTER J;Lo;0;L;;;;;N;;;;; 3111;BOPOMOFO LETTER Q;Lo;0;L;;;;;N;;;;; 3112;BOPOMOFO LETTER X;Lo;0;L;;;;;N;;;;; 3113;BOPOMOFO LETTER ZH;Lo;0;L;;;;;N;;;;; 3114;BOPOMOFO LETTER CH;Lo;0;L;;;;;N;;;;; 3115;BOPOMOFO LETTER SH;Lo;0;L;;;;;N;;;;; 3116;BOPOMOFO LETTER R;Lo;0;L;;;;;N;;;;; 3117;BOPOMOFO LETTER Z;Lo;0;L;;;;;N;;;;; 3118;BOPOMOFO LETTER C;Lo;0;L;;;;;N;;;;; 3119;BOPOMOFO LETTER S;Lo;0;L;;;;;N;;;;; 311A;BOPOMOFO LETTER A;Lo;0;L;;;;;N;;;;; 311B;BOPOMOFO LETTER O;Lo;0;L;;;;;N;;;;; 311C;BOPOMOFO LETTER E;Lo;0;L;;;;;N;;;;; 311D;BOPOMOFO LETTER EH;Lo;0;L;;;;;N;;;;; 311E;BOPOMOFO LETTER AI;Lo;0;L;;;;;N;;;;; 311F;BOPOMOFO LETTER EI;Lo;0;L;;;;;N;;;;; 3120;BOPOMOFO LETTER AU;Lo;0;L;;;;;N;;;;; 3121;BOPOMOFO LETTER OU;Lo;0;L;;;;;N;;;;; 3122;BOPOMOFO LETTER AN;Lo;0;L;;;;;N;;;;; 3123;BOPOMOFO LETTER EN;Lo;0;L;;;;;N;;;;; 3124;BOPOMOFO LETTER ANG;Lo;0;L;;;;;N;;;;; 3125;BOPOMOFO LETTER ENG;Lo;0;L;;;;;N;;;;; 3126;BOPOMOFO LETTER ER;Lo;0;L;;;;;N;;;;; 3127;BOPOMOFO LETTER I;Lo;0;L;;;;;N;;;;; 3128;BOPOMOFO LETTER U;Lo;0;L;;;;;N;;;;; 3129;BOPOMOFO LETTER IU;Lo;0;L;;;;;N;;;;; 312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;; 312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;; 312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;; 312D;BOPOMOFO LETTER IH;Lo;0;L;;;;;N;;;;; 3131;HANGUL LETTER KIYEOK;Lo;0;L;<compat> 1100;;;;N;HANGUL LETTER GIYEOG;;;; 3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L;<compat> 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;; 3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<compat> 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; 3134;HANGUL LETTER NIEUN;Lo;0;L;<compat> 1102;;;;N;;;;; 3135;HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<compat> 11AC;;;;N;HANGUL LETTER NIEUN JIEUJ;;;; 3136;HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<compat> 11AD;;;;N;HANGUL LETTER NIEUN HIEUH;;;; 3137;HANGUL LETTER TIKEUT;Lo;0;L;<compat> 1103;;;;N;HANGUL LETTER DIGEUD;;;; 3138;HANGUL LETTER SSANGTIKEUT;Lo;0;L;<compat> 1104;;;;N;HANGUL LETTER SSANG DIGEUD;;;; 3139;HANGUL LETTER RIEUL;Lo;0;L;<compat> 1105;;;;N;HANGUL LETTER LIEUL;;;; 313A;HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<compat> 11B0;;;;N;HANGUL LETTER LIEUL GIYEOG;;;; 313B;HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<compat> 11B1;;;;N;HANGUL LETTER LIEUL MIEUM;;;; 313C;HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<compat> 11B2;;;;N;HANGUL LETTER LIEUL BIEUB;;;; 313D;HANGUL LETTER RIEUL-SIOS;Lo;0;L;<compat> 11B3;;;;N;HANGUL LETTER LIEUL SIOS;;;; 313E;HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<compat> 11B4;;;;N;HANGUL LETTER LIEUL TIEUT;;;; 313F;HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<compat> 11B5;;;;N;HANGUL LETTER LIEUL PIEUP;;;; 3140;HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<compat> 111A;;;;N;HANGUL LETTER LIEUL HIEUH;;;; 3141;HANGUL LETTER MIEUM;Lo;0;L;<compat> 1106;;;;N;;;;; 3142;HANGUL LETTER PIEUP;Lo;0;L;<compat> 1107;;;;N;HANGUL LETTER BIEUB;;;; 3143;HANGUL LETTER SSANGPIEUP;Lo;0;L;<compat> 1108;;;;N;HANGUL LETTER SSANG BIEUB;;;; 3144;HANGUL LETTER PIEUP-SIOS;Lo;0;L;<compat> 1121;;;;N;HANGUL LETTER BIEUB SIOS;;;; 3145;HANGUL LETTER SIOS;Lo;0;L;<compat> 1109;;;;N;;;;; 3146;HANGUL LETTER SSANGSIOS;Lo;0;L;<compat> 110A;;;;N;HANGUL LETTER SSANG SIOS;;;; 3147;HANGUL LETTER IEUNG;Lo;0;L;<compat> 110B;;;;N;;;;; 3148;HANGUL LETTER CIEUC;Lo;0;L;<compat> 110C;;;;N;HANGUL LETTER JIEUJ;;;; 3149;HANGUL LETTER SSANGCIEUC;Lo;0;L;<compat> 110D;;;;N;HANGUL LETTER SSANG JIEUJ;;;; 314A;HANGUL LETTER CHIEUCH;Lo;0;L;<compat> 110E;;;;N;HANGUL LETTER CIEUC;;;; 314B;HANGUL LETTER KHIEUKH;Lo;0;L;<compat> 110F;;;;N;HANGUL LETTER KIYEOK;;;; 314C;HANGUL LETTER THIEUTH;Lo;0;L;<compat> 1110;;;;N;HANGUL LETTER TIEUT;;;; 314D;HANGUL LETTER PHIEUPH;Lo;0;L;<compat> 1111;;;;N;HANGUL LETTER PIEUP;;;; 314E;HANGUL LETTER HIEUH;Lo;0;L;<compat> 1112;;;;N;;;;; 314F;HANGUL LETTER A;Lo;0;L;<compat> 1161;;;;N;;;;; 3150;HANGUL LETTER AE;Lo;0;L;<compat> 1162;;;;N;;;;; 3151;HANGUL LETTER YA;Lo;0;L;<compat> 1163;;;;N;;;;; 3152;HANGUL LETTER YAE;Lo;0;L;<compat> 1164;;;;N;;;;; 3153;HANGUL LETTER EO;Lo;0;L;<compat> 1165;;;;N;;;;; 3154;HANGUL LETTER E;Lo;0;L;<compat> 1166;;;;N;;;;; 3155;HANGUL LETTER YEO;Lo;0;L;<compat> 1167;;;;N;;;;; 3156;HANGUL LETTER YE;Lo;0;L;<compat> 1168;;;;N;;;;; 3157;HANGUL LETTER O;Lo;0;L;<compat> 1169;;;;N;;;;; 3158;HANGUL LETTER WA;Lo;0;L;<compat> 116A;;;;N;;;;; 3159;HANGUL LETTER WAE;Lo;0;L;<compat> 116B;;;;N;;;;; 315A;HANGUL LETTER OE;Lo;0;L;<compat> 116C;;;;N;;;;; 315B;HANGUL LETTER YO;Lo;0;L;<compat> 116D;;;;N;;;;; 315C;HANGUL LETTER U;Lo;0;L;<compat> 116E;;;;N;;;;; 315D;HANGUL LETTER WEO;Lo;0;L;<compat> 116F;;;;N;;;;; 315E;HANGUL LETTER WE;Lo;0;L;<compat> 1170;;;;N;;;;; 315F;HANGUL LETTER WI;Lo;0;L;<compat> 1171;;;;N;;;;; 3160;HANGUL LETTER YU;Lo;0;L;<compat> 1172;;;;N;;;;; 3161;HANGUL LETTER EU;Lo;0;L;<compat> 1173;;;;N;;;;; 3162;HANGUL LETTER YI;Lo;0;L;<compat> 1174;;;;N;;;;; 3163;HANGUL LETTER I;Lo;0;L;<compat> 1175;;;;N;;;;; 3164;HANGUL FILLER;Lo;0;L;<compat> 1160;;;;N;HANGUL CAE OM;;;; 3165;HANGUL LETTER SSANGNIEUN;Lo;0;L;<compat> 1114;;;;N;HANGUL LETTER SSANG NIEUN;;;; 3166;HANGUL LETTER NIEUN-TIKEUT;Lo;0;L;<compat> 1115;;;;N;HANGUL LETTER NIEUN DIGEUD;;;; 3167;HANGUL LETTER NIEUN-SIOS;Lo;0;L;<compat> 11C7;;;;N;HANGUL LETTER NIEUN SIOS;;;; 3168;HANGUL LETTER NIEUN-PANSIOS;Lo;0;L;<compat> 11C8;;;;N;HANGUL LETTER NIEUN BAN CHI EUM;;;; 3169;HANGUL LETTER RIEUL-KIYEOK-SIOS;Lo;0;L;<compat> 11CC;;;;N;HANGUL LETTER LIEUL GIYEOG SIOS;;;; 316A;HANGUL LETTER RIEUL-TIKEUT;Lo;0;L;<compat> 11CE;;;;N;HANGUL LETTER LIEUL DIGEUD;;;; 316B;HANGUL LETTER RIEUL-PIEUP-SIOS;Lo;0;L;<compat> 11D3;;;;N;HANGUL LETTER LIEUL BIEUB SIOS;;;; 316C;HANGUL LETTER RIEUL-PANSIOS;Lo;0;L;<compat> 11D7;;;;N;HANGUL LETTER LIEUL BAN CHI EUM;;;; 316D;HANGUL LETTER RIEUL-YEORINHIEUH;Lo;0;L;<compat> 11D9;;;;N;HANGUL LETTER LIEUL YEOLIN HIEUH;;;; 316E;HANGUL LETTER MIEUM-PIEUP;Lo;0;L;<compat> 111C;;;;N;HANGUL LETTER MIEUM BIEUB;;;; 316F;HANGUL LETTER MIEUM-SIOS;Lo;0;L;<compat> 11DD;;;;N;HANGUL LETTER MIEUM SIOS;;;; 3170;HANGUL LETTER MIEUM-PANSIOS;Lo;0;L;<compat> 11DF;;;;N;HANGUL LETTER BIEUB BAN CHI EUM;;;; 3171;HANGUL LETTER KAPYEOUNMIEUM;Lo;0;L;<compat> 111D;;;;N;HANGUL LETTER MIEUM SUN GYEONG EUM;;;; 3172;HANGUL LETTER PIEUP-KIYEOK;Lo;0;L;<compat> 111E;;;;N;HANGUL LETTER BIEUB GIYEOG;;;; 3173;HANGUL LETTER PIEUP-TIKEUT;Lo;0;L;<compat> 1120;;;;N;HANGUL LETTER BIEUB DIGEUD;;;; 3174;HANGUL LETTER PIEUP-SIOS-KIYEOK;Lo;0;L;<compat> 1122;;;;N;HANGUL LETTER BIEUB SIOS GIYEOG;;;; 3175;HANGUL LETTER PIEUP-SIOS-TIKEUT;Lo;0;L;<compat> 1123;;;;N;HANGUL LETTER BIEUB SIOS DIGEUD;;;; 3176;HANGUL LETTER PIEUP-CIEUC;Lo;0;L;<compat> 1127;;;;N;HANGUL LETTER BIEUB JIEUJ;;;; 3177;HANGUL LETTER PIEUP-THIEUTH;Lo;0;L;<compat> 1129;;;;N;HANGUL LETTER BIEUB TIEUT;;;; 3178;HANGUL LETTER KAPYEOUNPIEUP;Lo;0;L;<compat> 112B;;;;N;HANGUL LETTER BIEUB SUN GYEONG EUM;;;; 3179;HANGUL LETTER KAPYEOUNSSANGPIEUP;Lo;0;L;<compat> 112C;;;;N;HANGUL LETTER SSANG BIEUB SUN GYEONG EUM;;;; 317A;HANGUL LETTER SIOS-KIYEOK;Lo;0;L;<compat> 112D;;;;N;HANGUL LETTER SIOS GIYEOG;;;; 317B;HANGUL LETTER SIOS-NIEUN;Lo;0;L;<compat> 112E;;;;N;HANGUL LETTER SIOS NIEUN;;;; 317C;HANGUL LETTER SIOS-TIKEUT;Lo;0;L;<compat> 112F;;;;N;HANGUL LETTER SIOS DIGEUD;;;; 317D;HANGUL LETTER SIOS-PIEUP;Lo;0;L;<compat> 1132;;;;N;HANGUL LETTER SIOS BIEUB;;;; 317E;HANGUL LETTER SIOS-CIEUC;Lo;0;L;<compat> 1136;;;;N;HANGUL LETTER SIOS JIEUJ;;;; 317F;HANGUL LETTER PANSIOS;Lo;0;L;<compat> 1140;;;;N;HANGUL LETTER BAN CHI EUM;;;; 3180;HANGUL LETTER SSANGIEUNG;Lo;0;L;<compat> 1147;;;;N;HANGUL LETTER SSANG IEUNG;;;; 3181;HANGUL LETTER YESIEUNG;Lo;0;L;<compat> 114C;;;;N;HANGUL LETTER NGIEUNG;;;; 3182;HANGUL LETTER YESIEUNG-SIOS;Lo;0;L;<compat> 11F1;;;;N;HANGUL LETTER NGIEUNG SIOS;;;; 3183;HANGUL LETTER YESIEUNG-PANSIOS;Lo;0;L;<compat> 11F2;;;;N;HANGUL LETTER NGIEUNG BAN CHI EUM;;;; 3184;HANGUL LETTER KAPYEOUNPHIEUPH;Lo;0;L;<compat> 1157;;;;N;HANGUL LETTER PIEUP SUN GYEONG EUM;;;; 3185;HANGUL LETTER SSANGHIEUH;Lo;0;L;<compat> 1158;;;;N;HANGUL LETTER SSANG HIEUH;;;; 3186;HANGUL LETTER YEORINHIEUH;Lo;0;L;<compat> 1159;;;;N;HANGUL LETTER YEOLIN HIEUH;;;; 3187;HANGUL LETTER YO-YA;Lo;0;L;<compat> 1184;;;;N;HANGUL LETTER YOYA;;;; 3188;HANGUL LETTER YO-YAE;Lo;0;L;<compat> 1185;;;;N;HANGUL LETTER YOYAE;;;; 3189;HANGUL LETTER YO-I;Lo;0;L;<compat> 1188;;;;N;HANGUL LETTER YOI;;;; 318A;HANGUL LETTER YU-YEO;Lo;0;L;<compat> 1191;;;;N;HANGUL LETTER YUYEO;;;; 318B;HANGUL LETTER YU-YE;Lo;0;L;<compat> 1192;;;;N;HANGUL LETTER YUYE;;;; 318C;HANGUL LETTER YU-I;Lo;0;L;<compat> 1194;;;;N;HANGUL LETTER YUI;;;; 318D;HANGUL LETTER ARAEA;Lo;0;L;<compat> 119E;;;;N;HANGUL LETTER ALAE A;;;; 318E;HANGUL LETTER ARAEAE;Lo;0;L;<compat> 11A1;;;;N;HANGUL LETTER ALAE AE;;;; 3190;IDEOGRAPHIC ANNOTATION LINKING MARK;So;0;L;;;;;N;KANBUN TATETEN;;;; 3191;IDEOGRAPHIC ANNOTATION REVERSE MARK;So;0;L;;;;;N;KAERITEN RE;;;; 3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L;<super> 4E00;;;1;N;KAERITEN ITI;;;; 3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L;<super> 4E8C;;;2;N;KAERITEN NI;;;; 3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L;<super> 4E09;;;3;N;KAERITEN SAN;;;; 3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L;<super> 56DB;;;4;N;KAERITEN SI;;;; 3196;IDEOGRAPHIC ANNOTATION TOP MARK;So;0;L;<super> 4E0A;;;;N;KAERITEN ZYOU;;;; 3197;IDEOGRAPHIC ANNOTATION MIDDLE MARK;So;0;L;<super> 4E2D;;;;N;KAERITEN TYUU;;;; 3198;IDEOGRAPHIC ANNOTATION BOTTOM MARK;So;0;L;<super> 4E0B;;;;N;KAERITEN GE;;;; 3199;IDEOGRAPHIC ANNOTATION FIRST MARK;So;0;L;<super> 7532;;;;N;KAERITEN KOU;;;; 319A;IDEOGRAPHIC ANNOTATION SECOND MARK;So;0;L;<super> 4E59;;;;N;KAERITEN OTU;;;; 319B;IDEOGRAPHIC ANNOTATION THIRD MARK;So;0;L;<super> 4E19;;;;N;KAERITEN HEI;;;; 319C;IDEOGRAPHIC ANNOTATION FOURTH MARK;So;0;L;<super> 4E01;;;;N;KAERITEN TEI;;;; 319D;IDEOGRAPHIC ANNOTATION HEAVEN MARK;So;0;L;<super> 5929;;;;N;KAERITEN TEN;;;; 319E;IDEOGRAPHIC ANNOTATION EARTH MARK;So;0;L;<super> 5730;;;;N;KAERITEN TI;;;; 319F;IDEOGRAPHIC ANNOTATION MAN MARK;So;0;L;<super> 4EBA;;;;N;KAERITEN ZIN;;;; 31A0;BOPOMOFO LETTER BU;Lo;0;L;;;;;N;;;;; 31A1;BOPOMOFO LETTER ZI;Lo;0;L;;;;;N;;;;; 31A2;BOPOMOFO LETTER JI;Lo;0;L;;;;;N;;;;; 31A3;BOPOMOFO LETTER GU;Lo;0;L;;;;;N;;;;; 31A4;BOPOMOFO LETTER EE;Lo;0;L;;;;;N;;;;; 31A5;BOPOMOFO LETTER ENN;Lo;0;L;;;;;N;;;;; 31A6;BOPOMOFO LETTER OO;Lo;0;L;;;;;N;;;;; 31A7;BOPOMOFO LETTER ONN;Lo;0;L;;;;;N;;;;; 31A8;BOPOMOFO LETTER IR;Lo;0;L;;;;;N;;;;; 31A9;BOPOMOFO LETTER ANN;Lo;0;L;;;;;N;;;;; 31AA;BOPOMOFO LETTER INN;Lo;0;L;;;;;N;;;;; 31AB;BOPOMOFO LETTER UNN;Lo;0;L;;;;;N;;;;; 31AC;BOPOMOFO LETTER IM;Lo;0;L;;;;;N;;;;; 31AD;BOPOMOFO LETTER NGG;Lo;0;L;;;;;N;;;;; 31AE;BOPOMOFO LETTER AINN;Lo;0;L;;;;;N;;;;; 31AF;BOPOMOFO LETTER AUNN;Lo;0;L;;;;;N;;;;; 31B0;BOPOMOFO LETTER AM;Lo;0;L;;;;;N;;;;; 31B1;BOPOMOFO LETTER OM;Lo;0;L;;;;;N;;;;; 31B2;BOPOMOFO LETTER ONG;Lo;0;L;;;;;N;;;;; 31B3;BOPOMOFO LETTER INNN;Lo;0;L;;;;;N;;;;; 31B4;BOPOMOFO FINAL LETTER P;Lo;0;L;;;;;N;;;;; 31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;; 31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;; 31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;; 31B8;BOPOMOFO LETTER GH;Lo;0;L;;;;;N;;;;; 31B9;BOPOMOFO LETTER LH;Lo;0;L;;;;;N;;;;; 31BA;BOPOMOFO LETTER ZY;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;;;;; 31C3;CJK STROKE BXG;So;0;ON;;;;;N;;;;; 31C4;CJK STROKE SW;So;0;ON;;;;;N;;;;; 31C5;CJK STROKE HZZ;So;0;ON;;;;;N;;;;; 31C6;CJK STROKE HZG;So;0;ON;;;;;N;;;;; 31C7;CJK STROKE HP;So;0;ON;;;;;N;;;;; 31C8;CJK STROKE HZWG;So;0;ON;;;;;N;;;;; 31C9;CJK STROKE SZWG;So;0;ON;;;;;N;;;;; 31CA;CJK STROKE HZT;So;0;ON;;;;;N;;;;; 31CB;CJK STROKE HZZP;So;0;ON;;;;;N;;;;; 31CC;CJK STROKE HPWG;So;0;ON;;;;;N;;;;; 31CD;CJK STROKE HZW;So;0;ON;;;;;N;;;;; 31CE;CJK STROKE HZZZ;So;0;ON;;;;;N;;;;; 31CF;CJK STROKE N;So;0;ON;;;;;N;;;;; 31D0;CJK STROKE H;So;0;ON;;;;;N;;;;; 31D1;CJK STROKE S;So;0;ON;;;;;N;;;;; 31D2;CJK STROKE P;So;0;ON;;;;;N;;;;; 31D3;CJK STROKE SP;So;0;ON;;;;;N;;;;; 31D4;CJK STROKE D;So;0;ON;;;;;N;;;;; 31D5;CJK STROKE HZ;So;0;ON;;;;;N;;;;; 31D6;CJK STROKE HG;So;0;ON;;;;;N;;;;; 31D7;CJK STROKE SZ;So;0;ON;;;;;N;;;;; 31D8;CJK STROKE SWZ;So;0;ON;;;;;N;;;;; 31D9;CJK STROKE ST;So;0;ON;;;;;N;;;;; 31DA;CJK STROKE SG;So;0;ON;;;;;N;;;;; 31DB;CJK STROKE PD;So;0;ON;;;;;N;;;;; 31DC;CJK STROKE PZ;So;0;ON;;;;;N;;;;; 31DD;CJK STROKE TN;So;0;ON;;;;;N;;;;; 31DE;CJK STROKE SZZ;So;0;ON;;;;;N;;;;; 31DF;CJK STROKE SWG;So;0;ON;;;;;N;;;;; 31E0;CJK STROKE HXWG;So;0;ON;;;;;N;;;;; 31E1;CJK STROKE HZZZG;So;0;ON;;;;;N;;;;; 31E2;CJK STROKE PG;So;0;ON;;;;;N;;;;; 31E3;CJK STROKE Q;So;0;ON;;;;;N;;;;; 31F0;KATAKANA LETTER SMALL KU;Lo;0;L;;;;;N;;;;; 31F1;KATAKANA LETTER SMALL SI;Lo;0;L;;;;;N;;;;; 31F2;KATAKANA LETTER SMALL SU;Lo;0;L;;;;;N;;;;; 31F3;KATAKANA LETTER SMALL TO;Lo;0;L;;;;;N;;;;; 31F4;KATAKANA LETTER SMALL NU;Lo;0;L;;;;;N;;;;; 31F5;KATAKANA LETTER SMALL HA;Lo;0;L;;;;;N;;;;; 31F6;KATAKANA LETTER SMALL HI;Lo;0;L;;;;;N;;;;; 31F7;KATAKANA LETTER SMALL HU;Lo;0;L;;;;;N;;;;; 31F8;KATAKANA LETTER SMALL HE;Lo;0;L;;;;;N;;;;; 31F9;KATAKANA LETTER SMALL HO;Lo;0;L;;;;;N;;;;; 31FA;KATAKANA LETTER SMALL MU;Lo;0;L;;;;;N;;;;; 31FB;KATAKANA LETTER SMALL RA;Lo;0;L;;;;;N;;;;; 31FC;KATAKANA LETTER SMALL RI;Lo;0;L;;;;;N;;;;; 31FD;KATAKANA LETTER SMALL RU;Lo;0;L;;;;;N;;;;; 31FE;KATAKANA LETTER SMALL RE;Lo;0;L;;;;;N;;;;; 31FF;KATAKANA LETTER SMALL RO;Lo;0;L;;;;;N;;;;; 3200;PARENTHESIZED HANGUL KIYEOK;So;0;L;<compat> 0028 1100 0029;;;;N;PARENTHESIZED HANGUL GIYEOG;;;; 3201;PARENTHESIZED HANGUL NIEUN;So;0;L;<compat> 0028 1102 0029;;;;N;;;;; 3202;PARENTHESIZED HANGUL TIKEUT;So;0;L;<compat> 0028 1103 0029;;;;N;PARENTHESIZED HANGUL DIGEUD;;;; 3203;PARENTHESIZED HANGUL RIEUL;So;0;L;<compat> 0028 1105 0029;;;;N;PARENTHESIZED HANGUL LIEUL;;;; 3204;PARENTHESIZED HANGUL MIEUM;So;0;L;<compat> 0028 1106 0029;;;;N;;;;; 3205;PARENTHESIZED HANGUL PIEUP;So;0;L;<compat> 0028 1107 0029;;;;N;PARENTHESIZED HANGUL BIEUB;;;; 3206;PARENTHESIZED HANGUL SIOS;So;0;L;<compat> 0028 1109 0029;;;;N;;;;; 3207;PARENTHESIZED HANGUL IEUNG;So;0;L;<compat> 0028 110B 0029;;;;N;;;;; 3208;PARENTHESIZED HANGUL CIEUC;So;0;L;<compat> 0028 110C 0029;;;;N;PARENTHESIZED HANGUL JIEUJ;;;; 3209;PARENTHESIZED HANGUL CHIEUCH;So;0;L;<compat> 0028 110E 0029;;;;N;PARENTHESIZED HANGUL CIEUC;;;; 320A;PARENTHESIZED HANGUL KHIEUKH;So;0;L;<compat> 0028 110F 0029;;;;N;PARENTHESIZED HANGUL KIYEOK;;;; 320B;PARENTHESIZED HANGUL THIEUTH;So;0;L;<compat> 0028 1110 0029;;;;N;PARENTHESIZED HANGUL TIEUT;;;; 320C;PARENTHESIZED HANGUL PHIEUPH;So;0;L;<compat> 0028 1111 0029;;;;N;PARENTHESIZED HANGUL PIEUP;;;; 320D;PARENTHESIZED HANGUL HIEUH;So;0;L;<compat> 0028 1112 0029;;;;N;;;;; 320E;PARENTHESIZED HANGUL KIYEOK A;So;0;L;<compat> 0028 1100 1161 0029;;;;N;PARENTHESIZED HANGUL GA;;;; 320F;PARENTHESIZED HANGUL NIEUN A;So;0;L;<compat> 0028 1102 1161 0029;;;;N;PARENTHESIZED HANGUL NA;;;; 3210;PARENTHESIZED HANGUL TIKEUT A;So;0;L;<compat> 0028 1103 1161 0029;;;;N;PARENTHESIZED HANGUL DA;;;; 3211;PARENTHESIZED HANGUL RIEUL A;So;0;L;<compat> 0028 1105 1161 0029;;;;N;PARENTHESIZED HANGUL LA;;;; 3212;PARENTHESIZED HANGUL MIEUM A;So;0;L;<compat> 0028 1106 1161 0029;;;;N;PARENTHESIZED HANGUL MA;;;; 3213;PARENTHESIZED HANGUL PIEUP A;So;0;L;<compat> 0028 1107 1161 0029;;;;N;PARENTHESIZED HANGUL BA;;;; 3214;PARENTHESIZED HANGUL SIOS A;So;0;L;<compat> 0028 1109 1161 0029;;;;N;PARENTHESIZED HANGUL SA;;;; 3215;PARENTHESIZED HANGUL IEUNG A;So;0;L;<compat> 0028 110B 1161 0029;;;;N;PARENTHESIZED HANGUL A;;;; 3216;PARENTHESIZED HANGUL CIEUC A;So;0;L;<compat> 0028 110C 1161 0029;;;;N;PARENTHESIZED HANGUL JA;;;; 3217;PARENTHESIZED HANGUL CHIEUCH A;So;0;L;<compat> 0028 110E 1161 0029;;;;N;PARENTHESIZED HANGUL CA;;;; 3218;PARENTHESIZED HANGUL KHIEUKH A;So;0;L;<compat> 0028 110F 1161 0029;;;;N;PARENTHESIZED HANGUL KA;;;; 3219;PARENTHESIZED HANGUL THIEUTH A;So;0;L;<compat> 0028 1110 1161 0029;;;;N;PARENTHESIZED HANGUL TA;;;; 321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L;<compat> 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;; 321B;PARENTHESIZED HANGUL HIEUH A;So;0;L;<compat> 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;; 321C;PARENTHESIZED HANGUL CIEUC U;So;0;L;<compat> 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;; 321D;PARENTHESIZED KOREAN CHARACTER OJEON;So;0;ON;<compat> 0028 110B 1169 110C 1165 11AB 0029;;;;N;;;;; 321E;PARENTHESIZED KOREAN CHARACTER O HU;So;0;ON;<compat> 0028 110B 1169 1112 116E 0029;;;;N;;;;; 3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L;<compat> 0028 4E00 0029;;;1;N;;;;; 3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L;<compat> 0028 4E8C 0029;;;2;N;;;;; 3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L;<compat> 0028 4E09 0029;;;3;N;;;;; 3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L;<compat> 0028 56DB 0029;;;4;N;;;;; 3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L;<compat> 0028 4E94 0029;;;5;N;;;;; 3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L;<compat> 0028 516D 0029;;;6;N;;;;; 3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L;<compat> 0028 4E03 0029;;;7;N;;;;; 3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L;<compat> 0028 516B 0029;;;8;N;;;;; 3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L;<compat> 0028 4E5D 0029;;;9;N;;;;; 3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L;<compat> 0028 5341 0029;;;10;N;;;;; 322A;PARENTHESIZED IDEOGRAPH MOON;So;0;L;<compat> 0028 6708 0029;;;;N;;;;; 322B;PARENTHESIZED IDEOGRAPH FIRE;So;0;L;<compat> 0028 706B 0029;;;;N;;;;; 322C;PARENTHESIZED IDEOGRAPH WATER;So;0;L;<compat> 0028 6C34 0029;;;;N;;;;; 322D;PARENTHESIZED IDEOGRAPH WOOD;So;0;L;<compat> 0028 6728 0029;;;;N;;;;; 322E;PARENTHESIZED IDEOGRAPH METAL;So;0;L;<compat> 0028 91D1 0029;;;;N;;;;; 322F;PARENTHESIZED IDEOGRAPH EARTH;So;0;L;<compat> 0028 571F 0029;;;;N;;;;; 3230;PARENTHESIZED IDEOGRAPH SUN;So;0;L;<compat> 0028 65E5 0029;;;;N;;;;; 3231;PARENTHESIZED IDEOGRAPH STOCK;So;0;L;<compat> 0028 682A 0029;;;;N;;;;; 3232;PARENTHESIZED IDEOGRAPH HAVE;So;0;L;<compat> 0028 6709 0029;;;;N;;;;; 3233;PARENTHESIZED IDEOGRAPH SOCIETY;So;0;L;<compat> 0028 793E 0029;;;;N;;;;; 3234;PARENTHESIZED IDEOGRAPH NAME;So;0;L;<compat> 0028 540D 0029;;;;N;;;;; 3235;PARENTHESIZED IDEOGRAPH SPECIAL;So;0;L;<compat> 0028 7279 0029;;;;N;;;;; 3236;PARENTHESIZED IDEOGRAPH FINANCIAL;So;0;L;<compat> 0028 8CA1 0029;;;;N;;;;; 3237;PARENTHESIZED IDEOGRAPH CONGRATULATION;So;0;L;<compat> 0028 795D 0029;;;;N;;;;; 3238;PARENTHESIZED IDEOGRAPH LABOR;So;0;L;<compat> 0028 52B4 0029;;;;N;;;;; 3239;PARENTHESIZED IDEOGRAPH REPRESENT;So;0;L;<compat> 0028 4EE3 0029;;;;N;;;;; 323A;PARENTHESIZED IDEOGRAPH CALL;So;0;L;<compat> 0028 547C 0029;;;;N;;;;; 323B;PARENTHESIZED IDEOGRAPH STUDY;So;0;L;<compat> 0028 5B66 0029;;;;N;;;;; 323C;PARENTHESIZED IDEOGRAPH SUPERVISE;So;0;L;<compat> 0028 76E3 0029;;;;N;;;;; 323D;PARENTHESIZED IDEOGRAPH ENTERPRISE;So;0;L;<compat> 0028 4F01 0029;;;;N;;;;; 323E;PARENTHESIZED IDEOGRAPH RESOURCE;So;0;L;<compat> 0028 8CC7 0029;;;;N;;;;; 323F;PARENTHESIZED IDEOGRAPH ALLIANCE;So;0;L;<compat> 0028 5354 0029;;;;N;;;;; 3240;PARENTHESIZED IDEOGRAPH FESTIVAL;So;0;L;<compat> 0028 796D 0029;;;;N;;;;; 3241;PARENTHESIZED IDEOGRAPH REST;So;0;L;<compat> 0028 4F11 0029;;;;N;;;;; 3242;PARENTHESIZED IDEOGRAPH SELF;So;0;L;<compat> 0028 81EA 0029;;;;N;;;;; 3243;PARENTHESIZED IDEOGRAPH REACH;So;0;L;<compat> 0028 81F3 0029;;;;N;;;;; 3244;CIRCLED IDEOGRAPH QUESTION;So;0;L;<circle> 554F;;;;N;;;;; 3245;CIRCLED IDEOGRAPH KINDERGARTEN;So;0;L;<circle> 5E7C;;;;N;;;;; 3246;CIRCLED IDEOGRAPH SCHOOL;So;0;L;<circle> 6587;;;;N;;;;; 3247;CIRCLED IDEOGRAPH KOTO;So;0;L;<circle> 7B8F;;;;N;;;;; 3248;CIRCLED NUMBER TEN ON BLACK SQUARE;No;0;L;;;;10;N;;;;; 3249;CIRCLED NUMBER TWENTY ON BLACK SQUARE;No;0;L;;;;20;N;;;;; 324A;CIRCLED NUMBER THIRTY ON BLACK SQUARE;No;0;L;;;;30;N;;;;; 324B;CIRCLED NUMBER FORTY ON BLACK SQUARE;No;0;L;;;;40;N;;;;; 324C;CIRCLED NUMBER FIFTY ON BLACK SQUARE;No;0;L;;;;50;N;;;;; 324D;CIRCLED NUMBER SIXTY ON BLACK SQUARE;No;0;L;;;;60;N;;;;; 324E;CIRCLED NUMBER SEVENTY ON BLACK SQUARE;No;0;L;;;;70;N;;;;; 324F;CIRCLED NUMBER EIGHTY ON BLACK SQUARE;No;0;L;;;;80;N;;;;; 3250;PARTNERSHIP SIGN;So;0;ON;<square> 0050 0054 0045;;;;N;;;;; 3251;CIRCLED NUMBER TWENTY ONE;No;0;ON;<circle> 0032 0031;;;21;N;;;;; 3252;CIRCLED NUMBER TWENTY TWO;No;0;ON;<circle> 0032 0032;;;22;N;;;;; 3253;CIRCLED NUMBER TWENTY THREE;No;0;ON;<circle> 0032 0033;;;23;N;;;;; 3254;CIRCLED NUMBER TWENTY FOUR;No;0;ON;<circle> 0032 0034;;;24;N;;;;; 3255;CIRCLED NUMBER TWENTY FIVE;No;0;ON;<circle> 0032 0035;;;25;N;;;;; 3256;CIRCLED NUMBER TWENTY SIX;No;0;ON;<circle> 0032 0036;;;26;N;;;;; 3257;CIRCLED NUMBER TWENTY SEVEN;No;0;ON;<circle> 0032 0037;;;27;N;;;;; 3258;CIRCLED NUMBER TWENTY EIGHT;No;0;ON;<circle> 0032 0038;;;28;N;;;;; 3259;CIRCLED NUMBER TWENTY NINE;No;0;ON;<circle> 0032 0039;;;29;N;;;;; 325A;CIRCLED NUMBER THIRTY;No;0;ON;<circle> 0033 0030;;;30;N;;;;; 325B;CIRCLED NUMBER THIRTY ONE;No;0;ON;<circle> 0033 0031;;;31;N;;;;; 325C;CIRCLED NUMBER THIRTY TWO;No;0;ON;<circle> 0033 0032;;;32;N;;;;; 325D;CIRCLED NUMBER THIRTY THREE;No;0;ON;<circle> 0033 0033;;;33;N;;;;; 325E;CIRCLED NUMBER THIRTY FOUR;No;0;ON;<circle> 0033 0034;;;34;N;;;;; 325F;CIRCLED NUMBER THIRTY FIVE;No;0;ON;<circle> 0033 0035;;;35;N;;;;; 3260;CIRCLED HANGUL KIYEOK;So;0;L;<circle> 1100;;;;N;CIRCLED HANGUL GIYEOG;;;; 3261;CIRCLED HANGUL NIEUN;So;0;L;<circle> 1102;;;;N;;;;; 3262;CIRCLED HANGUL TIKEUT;So;0;L;<circle> 1103;;;;N;CIRCLED HANGUL DIGEUD;;;; 3263;CIRCLED HANGUL RIEUL;So;0;L;<circle> 1105;;;;N;CIRCLED HANGUL LIEUL;;;; 3264;CIRCLED HANGUL MIEUM;So;0;L;<circle> 1106;;;;N;;;;; 3265;CIRCLED HANGUL PIEUP;So;0;L;<circle> 1107;;;;N;CIRCLED HANGUL BIEUB;;;; 3266;CIRCLED HANGUL SIOS;So;0;L;<circle> 1109;;;;N;;;;; 3267;CIRCLED HANGUL IEUNG;So;0;L;<circle> 110B;;;;N;;;;; 3268;CIRCLED HANGUL CIEUC;So;0;L;<circle> 110C;;;;N;CIRCLED HANGUL JIEUJ;;;; 3269;CIRCLED HANGUL CHIEUCH;So;0;L;<circle> 110E;;;;N;CIRCLED HANGUL CIEUC;;;; 326A;CIRCLED HANGUL KHIEUKH;So;0;L;<circle> 110F;;;;N;CIRCLED HANGUL KIYEOK;;;; 326B;CIRCLED HANGUL THIEUTH;So;0;L;<circle> 1110;;;;N;CIRCLED HANGUL TIEUT;;;; 326C;CIRCLED HANGUL PHIEUPH;So;0;L;<circle> 1111;;;;N;CIRCLED HANGUL PIEUP;;;; 326D;CIRCLED HANGUL HIEUH;So;0;L;<circle> 1112;;;;N;;;;; 326E;CIRCLED HANGUL KIYEOK A;So;0;L;<circle> 1100 1161;;;;N;CIRCLED HANGUL GA;;;; 326F;CIRCLED HANGUL NIEUN A;So;0;L;<circle> 1102 1161;;;;N;CIRCLED HANGUL NA;;;; 3270;CIRCLED HANGUL TIKEUT A;So;0;L;<circle> 1103 1161;;;;N;CIRCLED HANGUL DA;;;; 3271;CIRCLED HANGUL RIEUL A;So;0;L;<circle> 1105 1161;;;;N;CIRCLED HANGUL LA;;;; 3272;CIRCLED HANGUL MIEUM A;So;0;L;<circle> 1106 1161;;;;N;CIRCLED HANGUL MA;;;; 3273;CIRCLED HANGUL PIEUP A;So;0;L;<circle> 1107 1161;;;;N;CIRCLED HANGUL BA;;;; 3274;CIRCLED HANGUL SIOS A;So;0;L;<circle> 1109 1161;;;;N;CIRCLED HANGUL SA;;;; 3275;CIRCLED HANGUL IEUNG A;So;0;L;<circle> 110B 1161;;;;N;CIRCLED HANGUL A;;;; 3276;CIRCLED HANGUL CIEUC A;So;0;L;<circle> 110C 1161;;;;N;CIRCLED HANGUL JA;;;; 3277;CIRCLED HANGUL CHIEUCH A;So;0;L;<circle> 110E 1161;;;;N;CIRCLED HANGUL CA;;;; 3278;CIRCLED HANGUL KHIEUKH A;So;0;L;<circle> 110F 1161;;;;N;CIRCLED HANGUL KA;;;; 3279;CIRCLED HANGUL THIEUTH A;So;0;L;<circle> 1110 1161;;;;N;CIRCLED HANGUL TA;;;; 327A;CIRCLED HANGUL PHIEUPH A;So;0;L;<circle> 1111 1161;;;;N;CIRCLED HANGUL PA;;;; 327B;CIRCLED HANGUL HIEUH A;So;0;L;<circle> 1112 1161;;;;N;CIRCLED HANGUL HA;;;; 327C;CIRCLED KOREAN CHARACTER CHAMKO;So;0;ON;<circle> 110E 1161 11B7 1100 1169;;;;N;;;;; 327D;CIRCLED KOREAN CHARACTER JUEUI;So;0;ON;<circle> 110C 116E 110B 1174;;;;N;;;;; 327E;CIRCLED HANGUL IEUNG U;So;0;ON;<circle> 110B 116E;;;;N;;;;; 327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;; 3280;CIRCLED IDEOGRAPH ONE;No;0;L;<circle> 4E00;;;1;N;;;;; 3281;CIRCLED IDEOGRAPH TWO;No;0;L;<circle> 4E8C;;;2;N;;;;; 3282;CIRCLED IDEOGRAPH THREE;No;0;L;<circle> 4E09;;;3;N;;;;; 3283;CIRCLED IDEOGRAPH FOUR;No;0;L;<circle> 56DB;;;4;N;;;;; 3284;CIRCLED IDEOGRAPH FIVE;No;0;L;<circle> 4E94;;;5;N;;;;; 3285;CIRCLED IDEOGRAPH SIX;No;0;L;<circle> 516D;;;6;N;;;;; 3286;CIRCLED IDEOGRAPH SEVEN;No;0;L;<circle> 4E03;;;7;N;;;;; 3287;CIRCLED IDEOGRAPH EIGHT;No;0;L;<circle> 516B;;;8;N;;;;; 3288;CIRCLED IDEOGRAPH NINE;No;0;L;<circle> 4E5D;;;9;N;;;;; 3289;CIRCLED IDEOGRAPH TEN;No;0;L;<circle> 5341;;;10;N;;;;; 328A;CIRCLED IDEOGRAPH MOON;So;0;L;<circle> 6708;;;;N;;;;; 328B;CIRCLED IDEOGRAPH FIRE;So;0;L;<circle> 706B;;;;N;;;;; 328C;CIRCLED IDEOGRAPH WATER;So;0;L;<circle> 6C34;;;;N;;;;; 328D;CIRCLED IDEOGRAPH WOOD;So;0;L;<circle> 6728;;;;N;;;;; 328E;CIRCLED IDEOGRAPH METAL;So;0;L;<circle> 91D1;;;;N;;;;; 328F;CIRCLED IDEOGRAPH EARTH;So;0;L;<circle> 571F;;;;N;;;;; 3290;CIRCLED IDEOGRAPH SUN;So;0;L;<circle> 65E5;;;;N;;;;; 3291;CIRCLED IDEOGRAPH STOCK;So;0;L;<circle> 682A;;;;N;;;;; 3292;CIRCLED IDEOGRAPH HAVE;So;0;L;<circle> 6709;;;;N;;;;; 3293;CIRCLED IDEOGRAPH SOCIETY;So;0;L;<circle> 793E;;;;N;;;;; 3294;CIRCLED IDEOGRAPH NAME;So;0;L;<circle> 540D;;;;N;;;;; 3295;CIRCLED IDEOGRAPH SPECIAL;So;0;L;<circle> 7279;;;;N;;;;; 3296;CIRCLED IDEOGRAPH FINANCIAL;So;0;L;<circle> 8CA1;;;;N;;;;; 3297;CIRCLED IDEOGRAPH CONGRATULATION;So;0;L;<circle> 795D;;;;N;;;;; 3298;CIRCLED IDEOGRAPH LABOR;So;0;L;<circle> 52B4;;;;N;;;;; 3299;CIRCLED IDEOGRAPH SECRET;So;0;L;<circle> 79D8;;;;N;;;;; 329A;CIRCLED IDEOGRAPH MALE;So;0;L;<circle> 7537;;;;N;;;;; 329B;CIRCLED IDEOGRAPH FEMALE;So;0;L;<circle> 5973;;;;N;;;;; 329C;CIRCLED IDEOGRAPH SUITABLE;So;0;L;<circle> 9069;;;;N;;;;; 329D;CIRCLED IDEOGRAPH EXCELLENT;So;0;L;<circle> 512A;;;;N;;;;; 329E;CIRCLED IDEOGRAPH PRINT;So;0;L;<circle> 5370;;;;N;;;;; 329F;CIRCLED IDEOGRAPH ATTENTION;So;0;L;<circle> 6CE8;;;;N;;;;; 32A0;CIRCLED IDEOGRAPH ITEM;So;0;L;<circle> 9805;;;;N;;;;; 32A1;CIRCLED IDEOGRAPH REST;So;0;L;<circle> 4F11;;;;N;;;;; 32A2;CIRCLED IDEOGRAPH COPY;So;0;L;<circle> 5199;;;;N;;;;; 32A3;CIRCLED IDEOGRAPH CORRECT;So;0;L;<circle> 6B63;;;;N;;;;; 32A4;CIRCLED IDEOGRAPH HIGH;So;0;L;<circle> 4E0A;;;;N;;;;; 32A5;CIRCLED IDEOGRAPH CENTRE;So;0;L;<circle> 4E2D;;;;N;CIRCLED IDEOGRAPH CENTER;;;; 32A6;CIRCLED IDEOGRAPH LOW;So;0;L;<circle> 4E0B;;;;N;;;;; 32A7;CIRCLED IDEOGRAPH LEFT;So;0;L;<circle> 5DE6;;;;N;;;;; 32A8;CIRCLED IDEOGRAPH RIGHT;So;0;L;<circle> 53F3;;;;N;;;;; 32A9;CIRCLED IDEOGRAPH MEDICINE;So;0;L;<circle> 533B;;;;N;;;;; 32AA;CIRCLED IDEOGRAPH RELIGION;So;0;L;<circle> 5B97;;;;N;;;;; 32AB;CIRCLED IDEOGRAPH STUDY;So;0;L;<circle> 5B66;;;;N;;;;; 32AC;CIRCLED IDEOGRAPH SUPERVISE;So;0;L;<circle> 76E3;;;;N;;;;; 32AD;CIRCLED IDEOGRAPH ENTERPRISE;So;0;L;<circle> 4F01;;;;N;;;;; 32AE;CIRCLED IDEOGRAPH RESOURCE;So;0;L;<circle> 8CC7;;;;N;;;;; 32AF;CIRCLED IDEOGRAPH ALLIANCE;So;0;L;<circle> 5354;;;;N;;;;; 32B0;CIRCLED IDEOGRAPH NIGHT;So;0;L;<circle> 591C;;;;N;;;;; 32B1;CIRCLED NUMBER THIRTY SIX;No;0;ON;<circle> 0033 0036;;;36;N;;;;; 32B2;CIRCLED NUMBER THIRTY SEVEN;No;0;ON;<circle> 0033 0037;;;37;N;;;;; 32B3;CIRCLED NUMBER THIRTY EIGHT;No;0;ON;<circle> 0033 0038;;;38;N;;;;; 32B4;CIRCLED NUMBER THIRTY NINE;No;0;ON;<circle> 0033 0039;;;39;N;;;;; 32B5;CIRCLED NUMBER FORTY;No;0;ON;<circle> 0034 0030;;;40;N;;;;; 32B6;CIRCLED NUMBER FORTY ONE;No;0;ON;<circle> 0034 0031;;;41;N;;;;; 32B7;CIRCLED NUMBER FORTY TWO;No;0;ON;<circle> 0034 0032;;;42;N;;;;; 32B8;CIRCLED NUMBER FORTY THREE;No;0;ON;<circle> 0034 0033;;;43;N;;;;; 32B9;CIRCLED NUMBER FORTY FOUR;No;0;ON;<circle> 0034 0034;;;44;N;;;;; 32BA;CIRCLED NUMBER FORTY FIVE;No;0;ON;<circle> 0034 0035;;;45;N;;;;; 32BB;CIRCLED NUMBER FORTY SIX;No;0;ON;<circle> 0034 0036;;;46;N;;;;; 32BC;CIRCLED NUMBER FORTY SEVEN;No;0;ON;<circle> 0034 0037;;;47;N;;;;; 32BD;CIRCLED NUMBER FORTY EIGHT;No;0;ON;<circle> 0034 0038;;;48;N;;;;; 32BE;CIRCLED NUMBER FORTY NINE;No;0;ON;<circle> 0034 0039;;;49;N;;;;; 32BF;CIRCLED NUMBER FIFTY;No;0;ON;<circle> 0035 0030;;;50;N;;;;; 32C0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY;So;0;L;<compat> 0031 6708;;;;N;;;;; 32C1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY;So;0;L;<compat> 0032 6708;;;;N;;;;; 32C2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH;So;0;L;<compat> 0033 6708;;;;N;;;;; 32C3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL;So;0;L;<compat> 0034 6708;;;;N;;;;; 32C4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY;So;0;L;<compat> 0035 6708;;;;N;;;;; 32C5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE;So;0;L;<compat> 0036 6708;;;;N;;;;; 32C6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY;So;0;L;<compat> 0037 6708;;;;N;;;;; 32C7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST;So;0;L;<compat> 0038 6708;;;;N;;;;; 32C8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER;So;0;L;<compat> 0039 6708;;;;N;;;;; 32C9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER;So;0;L;<compat> 0031 0030 6708;;;;N;;;;; 32CA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER;So;0;L;<compat> 0031 0031 6708;;;;N;;;;; 32CB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER;So;0;L;<compat> 0031 0032 6708;;;;N;;;;; 32CC;SQUARE HG;So;0;ON;<square> 0048 0067;;;;N;;;;; 32CD;SQUARE ERG;So;0;ON;<square> 0065 0072 0067;;;;N;;;;; 32CE;SQUARE EV;So;0;ON;<square> 0065 0056;;;;N;;;;; 32CF;LIMITED LIABILITY SIGN;So;0;ON;<square> 004C 0054 0044;;;;N;;;;; 32D0;CIRCLED KATAKANA A;So;0;L;<circle> 30A2;;;;N;;;;; 32D1;CIRCLED KATAKANA I;So;0;L;<circle> 30A4;;;;N;;;;; 32D2;CIRCLED KATAKANA U;So;0;L;<circle> 30A6;;;;N;;;;; 32D3;CIRCLED KATAKANA E;So;0;L;<circle> 30A8;;;;N;;;;; 32D4;CIRCLED KATAKANA O;So;0;L;<circle> 30AA;;;;N;;;;; 32D5;CIRCLED KATAKANA KA;So;0;L;<circle> 30AB;;;;N;;;;; 32D6;CIRCLED KATAKANA KI;So;0;L;<circle> 30AD;;;;N;;;;; 32D7;CIRCLED KATAKANA KU;So;0;L;<circle> 30AF;;;;N;;;;; 32D8;CIRCLED KATAKANA KE;So;0;L;<circle> 30B1;;;;N;;;;; 32D9;CIRCLED KATAKANA KO;So;0;L;<circle> 30B3;;;;N;;;;; 32DA;CIRCLED KATAKANA SA;So;0;L;<circle> 30B5;;;;N;;;;; 32DB;CIRCLED KATAKANA SI;So;0;L;<circle> 30B7;;;;N;;;;; 32DC;CIRCLED KATAKANA SU;So;0;L;<circle> 30B9;;;;N;;;;; 32DD;CIRCLED KATAKANA SE;So;0;L;<circle> 30BB;;;;N;;;;; 32DE;CIRCLED KATAKANA SO;So;0;L;<circle> 30BD;;;;N;;;;; 32DF;CIRCLED KATAKANA TA;So;0;L;<circle> 30BF;;;;N;;;;; 32E0;CIRCLED KATAKANA TI;So;0;L;<circle> 30C1;;;;N;;;;; 32E1;CIRCLED KATAKANA TU;So;0;L;<circle> 30C4;;;;N;;;;; 32E2;CIRCLED KATAKANA TE;So;0;L;<circle> 30C6;;;;N;;;;; 32E3;CIRCLED KATAKANA TO;So;0;L;<circle> 30C8;;;;N;;;;; 32E4;CIRCLED KATAKANA NA;So;0;L;<circle> 30CA;;;;N;;;;; 32E5;CIRCLED KATAKANA NI;So;0;L;<circle> 30CB;;;;N;;;;; 32E6;CIRCLED KATAKANA NU;So;0;L;<circle> 30CC;;;;N;;;;; 32E7;CIRCLED KATAKANA NE;So;0;L;<circle> 30CD;;;;N;;;;; 32E8;CIRCLED KATAKANA NO;So;0;L;<circle> 30CE;;;;N;;;;; 32E9;CIRCLED KATAKANA HA;So;0;L;<circle> 30CF;;;;N;;;;; 32EA;CIRCLED KATAKANA HI;So;0;L;<circle> 30D2;;;;N;;;;; 32EB;CIRCLED KATAKANA HU;So;0;L;<circle> 30D5;;;;N;;;;; 32EC;CIRCLED KATAKANA HE;So;0;L;<circle> 30D8;;;;N;;;;; 32ED;CIRCLED KATAKANA HO;So;0;L;<circle> 30DB;;;;N;;;;; 32EE;CIRCLED KATAKANA MA;So;0;L;<circle> 30DE;;;;N;;;;; 32EF;CIRCLED KATAKANA MI;So;0;L;<circle> 30DF;;;;N;;;;; 32F0;CIRCLED KATAKANA MU;So;0;L;<circle> 30E0;;;;N;;;;; 32F1;CIRCLED KATAKANA ME;So;0;L;<circle> 30E1;;;;N;;;;; 32F2;CIRCLED KATAKANA MO;So;0;L;<circle> 30E2;;;;N;;;;; 32F3;CIRCLED KATAKANA YA;So;0;L;<circle> 30E4;;;;N;;;;; 32F4;CIRCLED KATAKANA YU;So;0;L;<circle> 30E6;;;;N;;;;; 32F5;CIRCLED KATAKANA YO;So;0;L;<circle> 30E8;;;;N;;;;; 32F6;CIRCLED KATAKANA RA;So;0;L;<circle> 30E9;;;;N;;;;; 32F7;CIRCLED KATAKANA RI;So;0;L;<circle> 30EA;;;;N;;;;; 32F8;CIRCLED KATAKANA RU;So;0;L;<circle> 30EB;;;;N;;;;; 32F9;CIRCLED KATAKANA RE;So;0;L;<circle> 30EC;;;;N;;;;; 32FA;CIRCLED KATAKANA RO;So;0;L;<circle> 30ED;;;;N;;;;; 32FB;CIRCLED KATAKANA WA;So;0;L;<circle> 30EF;;;;N;;;;; 32FC;CIRCLED KATAKANA WI;So;0;L;<circle> 30F0;;;;N;;;;; 32FD;CIRCLED KATAKANA WE;So;0;L;<circle> 30F1;;;;N;;;;; 32FE;CIRCLED KATAKANA WO;So;0;L;<circle> 30F2;;;;N;;;;; 3300;SQUARE APAATO;So;0;L;<square> 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;; 3301;SQUARE ARUHUA;So;0;L;<square> 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;; 3302;SQUARE ANPEA;So;0;L;<square> 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;; 3303;SQUARE AARU;So;0;L;<square> 30A2 30FC 30EB;;;;N;SQUARED AARU;;;; 3304;SQUARE ININGU;So;0;L;<square> 30A4 30CB 30F3 30B0;;;;N;SQUARED ININGU;;;; 3305;SQUARE INTI;So;0;L;<square> 30A4 30F3 30C1;;;;N;SQUARED INTI;;;; 3306;SQUARE UON;So;0;L;<square> 30A6 30A9 30F3;;;;N;SQUARED UON;;;; 3307;SQUARE ESUKUUDO;So;0;L;<square> 30A8 30B9 30AF 30FC 30C9;;;;N;SQUARED ESUKUUDO;;;; 3308;SQUARE EEKAA;So;0;L;<square> 30A8 30FC 30AB 30FC;;;;N;SQUARED EEKAA;;;; 3309;SQUARE ONSU;So;0;L;<square> 30AA 30F3 30B9;;;;N;SQUARED ONSU;;;; 330A;SQUARE OOMU;So;0;L;<square> 30AA 30FC 30E0;;;;N;SQUARED OOMU;;;; 330B;SQUARE KAIRI;So;0;L;<square> 30AB 30A4 30EA;;;;N;SQUARED KAIRI;;;; 330C;SQUARE KARATTO;So;0;L;<square> 30AB 30E9 30C3 30C8;;;;N;SQUARED KARATTO;;;; 330D;SQUARE KARORII;So;0;L;<square> 30AB 30ED 30EA 30FC;;;;N;SQUARED KARORII;;;; 330E;SQUARE GARON;So;0;L;<square> 30AC 30ED 30F3;;;;N;SQUARED GARON;;;; 330F;SQUARE GANMA;So;0;L;<square> 30AC 30F3 30DE;;;;N;SQUARED GANMA;;;; 3310;SQUARE GIGA;So;0;L;<square> 30AE 30AC;;;;N;SQUARED GIGA;;;; 3311;SQUARE GINII;So;0;L;<square> 30AE 30CB 30FC;;;;N;SQUARED GINII;;;; 3312;SQUARE KYURII;So;0;L;<square> 30AD 30E5 30EA 30FC;;;;N;SQUARED KYURII;;;; 3313;SQUARE GIRUDAA;So;0;L;<square> 30AE 30EB 30C0 30FC;;;;N;SQUARED GIRUDAA;;;; 3314;SQUARE KIRO;So;0;L;<square> 30AD 30ED;;;;N;SQUARED KIRO;;;; 3315;SQUARE KIROGURAMU;So;0;L;<square> 30AD 30ED 30B0 30E9 30E0;;;;N;SQUARED KIROGURAMU;;;; 3316;SQUARE KIROMEETORU;So;0;L;<square> 30AD 30ED 30E1 30FC 30C8 30EB;;;;N;SQUARED KIROMEETORU;;;; 3317;SQUARE KIROWATTO;So;0;L;<square> 30AD 30ED 30EF 30C3 30C8;;;;N;SQUARED KIROWATTO;;;; 3318;SQUARE GURAMU;So;0;L;<square> 30B0 30E9 30E0;;;;N;SQUARED GURAMU;;;; 3319;SQUARE GURAMUTON;So;0;L;<square> 30B0 30E9 30E0 30C8 30F3;;;;N;SQUARED GURAMUTON;;;; 331A;SQUARE KURUZEIRO;So;0;L;<square> 30AF 30EB 30BC 30A4 30ED;;;;N;SQUARED KURUZEIRO;;;; 331B;SQUARE KUROONE;So;0;L;<square> 30AF 30ED 30FC 30CD;;;;N;SQUARED KUROONE;;;; 331C;SQUARE KEESU;So;0;L;<square> 30B1 30FC 30B9;;;;N;SQUARED KEESU;;;; 331D;SQUARE KORUNA;So;0;L;<square> 30B3 30EB 30CA;;;;N;SQUARED KORUNA;;;; 331E;SQUARE KOOPO;So;0;L;<square> 30B3 30FC 30DD;;;;N;SQUARED KOOPO;;;; 331F;SQUARE SAIKURU;So;0;L;<square> 30B5 30A4 30AF 30EB;;;;N;SQUARED SAIKURU;;;; 3320;SQUARE SANTIIMU;So;0;L;<square> 30B5 30F3 30C1 30FC 30E0;;;;N;SQUARED SANTIIMU;;;; 3321;SQUARE SIRINGU;So;0;L;<square> 30B7 30EA 30F3 30B0;;;;N;SQUARED SIRINGU;;;; 3322;SQUARE SENTI;So;0;L;<square> 30BB 30F3 30C1;;;;N;SQUARED SENTI;;;; 3323;SQUARE SENTO;So;0;L;<square> 30BB 30F3 30C8;;;;N;SQUARED SENTO;;;; 3324;SQUARE DAASU;So;0;L;<square> 30C0 30FC 30B9;;;;N;SQUARED DAASU;;;; 3325;SQUARE DESI;So;0;L;<square> 30C7 30B7;;;;N;SQUARED DESI;;;; 3326;SQUARE DORU;So;0;L;<square> 30C9 30EB;;;;N;SQUARED DORU;;;; 3327;SQUARE TON;So;0;L;<square> 30C8 30F3;;;;N;SQUARED TON;;;; 3328;SQUARE NANO;So;0;L;<square> 30CA 30CE;;;;N;SQUARED NANO;;;; 3329;SQUARE NOTTO;So;0;L;<square> 30CE 30C3 30C8;;;;N;SQUARED NOTTO;;;; 332A;SQUARE HAITU;So;0;L;<square> 30CF 30A4 30C4;;;;N;SQUARED HAITU;;;; 332B;SQUARE PAASENTO;So;0;L;<square> 30D1 30FC 30BB 30F3 30C8;;;;N;SQUARED PAASENTO;;;; 332C;SQUARE PAATU;So;0;L;<square> 30D1 30FC 30C4;;;;N;SQUARED PAATU;;;; 332D;SQUARE BAARERU;So;0;L;<square> 30D0 30FC 30EC 30EB;;;;N;SQUARED BAARERU;;;; 332E;SQUARE PIASUTORU;So;0;L;<square> 30D4 30A2 30B9 30C8 30EB;;;;N;SQUARED PIASUTORU;;;; 332F;SQUARE PIKURU;So;0;L;<square> 30D4 30AF 30EB;;;;N;SQUARED PIKURU;;;; 3330;SQUARE PIKO;So;0;L;<square> 30D4 30B3;;;;N;SQUARED PIKO;;;; 3331;SQUARE BIRU;So;0;L;<square> 30D3 30EB;;;;N;SQUARED BIRU;;;; 3332;SQUARE HUARADDO;So;0;L;<square> 30D5 30A1 30E9 30C3 30C9;;;;N;SQUARED HUARADDO;;;; 3333;SQUARE HUIITO;So;0;L;<square> 30D5 30A3 30FC 30C8;;;;N;SQUARED HUIITO;;;; 3334;SQUARE BUSSYERU;So;0;L;<square> 30D6 30C3 30B7 30A7 30EB;;;;N;SQUARED BUSSYERU;;;; 3335;SQUARE HURAN;So;0;L;<square> 30D5 30E9 30F3;;;;N;SQUARED HURAN;;;; 3336;SQUARE HEKUTAARU;So;0;L;<square> 30D8 30AF 30BF 30FC 30EB;;;;N;SQUARED HEKUTAARU;;;; 3337;SQUARE PESO;So;0;L;<square> 30DA 30BD;;;;N;SQUARED PESO;;;; 3338;SQUARE PENIHI;So;0;L;<square> 30DA 30CB 30D2;;;;N;SQUARED PENIHI;;;; 3339;SQUARE HERUTU;So;0;L;<square> 30D8 30EB 30C4;;;;N;SQUARED HERUTU;;;; 333A;SQUARE PENSU;So;0;L;<square> 30DA 30F3 30B9;;;;N;SQUARED PENSU;;;; 333B;SQUARE PEEZI;So;0;L;<square> 30DA 30FC 30B8;;;;N;SQUARED PEEZI;;;; 333C;SQUARE BEETA;So;0;L;<square> 30D9 30FC 30BF;;;;N;SQUARED BEETA;;;; 333D;SQUARE POINTO;So;0;L;<square> 30DD 30A4 30F3 30C8;;;;N;SQUARED POINTO;;;; 333E;SQUARE BORUTO;So;0;L;<square> 30DC 30EB 30C8;;;;N;SQUARED BORUTO;;;; 333F;SQUARE HON;So;0;L;<square> 30DB 30F3;;;;N;SQUARED HON;;;; 3340;SQUARE PONDO;So;0;L;<square> 30DD 30F3 30C9;;;;N;SQUARED PONDO;;;; 3341;SQUARE HOORU;So;0;L;<square> 30DB 30FC 30EB;;;;N;SQUARED HOORU;;;; 3342;SQUARE HOON;So;0;L;<square> 30DB 30FC 30F3;;;;N;SQUARED HOON;;;; 3343;SQUARE MAIKURO;So;0;L;<square> 30DE 30A4 30AF 30ED;;;;N;SQUARED MAIKURO;;;; 3344;SQUARE MAIRU;So;0;L;<square> 30DE 30A4 30EB;;;;N;SQUARED MAIRU;;;; 3345;SQUARE MAHHA;So;0;L;<square> 30DE 30C3 30CF;;;;N;SQUARED MAHHA;;;; 3346;SQUARE MARUKU;So;0;L;<square> 30DE 30EB 30AF;;;;N;SQUARED MARUKU;;;; 3347;SQUARE MANSYON;So;0;L;<square> 30DE 30F3 30B7 30E7 30F3;;;;N;SQUARED MANSYON;;;; 3348;SQUARE MIKURON;So;0;L;<square> 30DF 30AF 30ED 30F3;;;;N;SQUARED MIKURON;;;; 3349;SQUARE MIRI;So;0;L;<square> 30DF 30EA;;;;N;SQUARED MIRI;;;; 334A;SQUARE MIRIBAARU;So;0;L;<square> 30DF 30EA 30D0 30FC 30EB;;;;N;SQUARED MIRIBAARU;;;; 334B;SQUARE MEGA;So;0;L;<square> 30E1 30AC;;;;N;SQUARED MEGA;;;; 334C;SQUARE MEGATON;So;0;L;<square> 30E1 30AC 30C8 30F3;;;;N;SQUARED MEGATON;;;; 334D;SQUARE MEETORU;So;0;L;<square> 30E1 30FC 30C8 30EB;;;;N;SQUARED MEETORU;;;; 334E;SQUARE YAADO;So;0;L;<square> 30E4 30FC 30C9;;;;N;SQUARED YAADO;;;; 334F;SQUARE YAARU;So;0;L;<square> 30E4 30FC 30EB;;;;N;SQUARED YAARU;;;; 3350;SQUARE YUAN;So;0;L;<square> 30E6 30A2 30F3;;;;N;SQUARED YUAN;;;; 3351;SQUARE RITTORU;So;0;L;<square> 30EA 30C3 30C8 30EB;;;;N;SQUARED RITTORU;;;; 3352;SQUARE RIRA;So;0;L;<square> 30EA 30E9;;;;N;SQUARED RIRA;;;; 3353;SQUARE RUPII;So;0;L;<square> 30EB 30D4 30FC;;;;N;SQUARED RUPII;;;; 3354;SQUARE RUUBURU;So;0;L;<square> 30EB 30FC 30D6 30EB;;;;N;SQUARED RUUBURU;;;; 3355;SQUARE REMU;So;0;L;<square> 30EC 30E0;;;;N;SQUARED REMU;;;; 3356;SQUARE RENTOGEN;So;0;L;<square> 30EC 30F3 30C8 30B2 30F3;;;;N;SQUARED RENTOGEN;;;; 3357;SQUARE WATTO;So;0;L;<square> 30EF 30C3 30C8;;;;N;SQUARED WATTO;;;; 3358;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO;So;0;L;<compat> 0030 70B9;;;;N;;;;; 3359;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE;So;0;L;<compat> 0031 70B9;;;;N;;;;; 335A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO;So;0;L;<compat> 0032 70B9;;;;N;;;;; 335B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE;So;0;L;<compat> 0033 70B9;;;;N;;;;; 335C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR;So;0;L;<compat> 0034 70B9;;;;N;;;;; 335D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE;So;0;L;<compat> 0035 70B9;;;;N;;;;; 335E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX;So;0;L;<compat> 0036 70B9;;;;N;;;;; 335F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN;So;0;L;<compat> 0037 70B9;;;;N;;;;; 3360;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT;So;0;L;<compat> 0038 70B9;;;;N;;;;; 3361;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE;So;0;L;<compat> 0039 70B9;;;;N;;;;; 3362;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN;So;0;L;<compat> 0031 0030 70B9;;;;N;;;;; 3363;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN;So;0;L;<compat> 0031 0031 70B9;;;;N;;;;; 3364;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE;So;0;L;<compat> 0031 0032 70B9;;;;N;;;;; 3365;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN;So;0;L;<compat> 0031 0033 70B9;;;;N;;;;; 3366;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN;So;0;L;<compat> 0031 0034 70B9;;;;N;;;;; 3367;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN;So;0;L;<compat> 0031 0035 70B9;;;;N;;;;; 3368;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN;So;0;L;<compat> 0031 0036 70B9;;;;N;;;;; 3369;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN;So;0;L;<compat> 0031 0037 70B9;;;;N;;;;; 336A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN;So;0;L;<compat> 0031 0038 70B9;;;;N;;;;; 336B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN;So;0;L;<compat> 0031 0039 70B9;;;;N;;;;; 336C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY;So;0;L;<compat> 0032 0030 70B9;;;;N;;;;; 336D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE;So;0;L;<compat> 0032 0031 70B9;;;;N;;;;; 336E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO;So;0;L;<compat> 0032 0032 70B9;;;;N;;;;; 336F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE;So;0;L;<compat> 0032 0033 70B9;;;;N;;;;; 3370;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR;So;0;L;<compat> 0032 0034 70B9;;;;N;;;;; 3371;SQUARE HPA;So;0;L;<square> 0068 0050 0061;;;;N;;;;; 3372;SQUARE DA;So;0;L;<square> 0064 0061;;;;N;;;;; 3373;SQUARE AU;So;0;L;<square> 0041 0055;;;;N;;;;; 3374;SQUARE BAR;So;0;L;<square> 0062 0061 0072;;;;N;;;;; 3375;SQUARE OV;So;0;L;<square> 006F 0056;;;;N;;;;; 3376;SQUARE PC;So;0;L;<square> 0070 0063;;;;N;;;;; 3377;SQUARE DM;So;0;ON;<square> 0064 006D;;;;N;;;;; 3378;SQUARE DM SQUARED;So;0;ON;<square> 0064 006D 00B2;;;;N;;;;; 3379;SQUARE DM CUBED;So;0;ON;<square> 0064 006D 00B3;;;;N;;;;; 337A;SQUARE IU;So;0;ON;<square> 0049 0055;;;;N;;;;; 337B;SQUARE ERA NAME HEISEI;So;0;L;<square> 5E73 6210;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME HEISEI;;;; 337C;SQUARE ERA NAME SYOUWA;So;0;L;<square> 662D 548C;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA;;;; 337D;SQUARE ERA NAME TAISYOU;So;0;L;<square> 5927 6B63;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU;;;; 337E;SQUARE ERA NAME MEIZI;So;0;L;<square> 660E 6CBB;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME MEIZI;;;; 337F;SQUARE CORPORATION;So;0;L;<square> 682A 5F0F 4F1A 793E;;;;N;SQUARED FOUR IDEOGRAPHS CORPORATION;;;; 3380;SQUARE PA AMPS;So;0;L;<square> 0070 0041;;;;N;SQUARED PA AMPS;;;; 3381;SQUARE NA;So;0;L;<square> 006E 0041;;;;N;SQUARED NA;;;; 3382;SQUARE MU A;So;0;L;<square> 03BC 0041;;;;N;SQUARED MU A;;;; 3383;SQUARE MA;So;0;L;<square> 006D 0041;;;;N;SQUARED MA;;;; 3384;SQUARE KA;So;0;L;<square> 006B 0041;;;;N;SQUARED KA;;;; 3385;SQUARE KB;So;0;L;<square> 004B 0042;;;;N;SQUARED KB;;;; 3386;SQUARE MB;So;0;L;<square> 004D 0042;;;;N;SQUARED MB;;;; 3387;SQUARE GB;So;0;L;<square> 0047 0042;;;;N;SQUARED GB;;;; 3388;SQUARE CAL;So;0;L;<square> 0063 0061 006C;;;;N;SQUARED CAL;;;; 3389;SQUARE KCAL;So;0;L;<square> 006B 0063 0061 006C;;;;N;SQUARED KCAL;;;; 338A;SQUARE PF;So;0;L;<square> 0070 0046;;;;N;SQUARED PF;;;; 338B;SQUARE NF;So;0;L;<square> 006E 0046;;;;N;SQUARED NF;;;; 338C;SQUARE MU F;So;0;L;<square> 03BC 0046;;;;N;SQUARED MU F;;;; 338D;SQUARE MU G;So;0;L;<square> 03BC 0067;;;;N;SQUARED MU G;;;; 338E;SQUARE MG;So;0;L;<square> 006D 0067;;;;N;SQUARED MG;;;; 338F;SQUARE KG;So;0;L;<square> 006B 0067;;;;N;SQUARED KG;;;; 3390;SQUARE HZ;So;0;L;<square> 0048 007A;;;;N;SQUARED HZ;;;; 3391;SQUARE KHZ;So;0;L;<square> 006B 0048 007A;;;;N;SQUARED KHZ;;;; 3392;SQUARE MHZ;So;0;L;<square> 004D 0048 007A;;;;N;SQUARED MHZ;;;; 3393;SQUARE GHZ;So;0;L;<square> 0047 0048 007A;;;;N;SQUARED GHZ;;;; 3394;SQUARE THZ;So;0;L;<square> 0054 0048 007A;;;;N;SQUARED THZ;;;; 3395;SQUARE MU L;So;0;L;<square> 03BC 2113;;;;N;SQUARED MU L;;;; 3396;SQUARE ML;So;0;L;<square> 006D 2113;;;;N;SQUARED ML;;;; 3397;SQUARE DL;So;0;L;<square> 0064 2113;;;;N;SQUARED DL;;;; 3398;SQUARE KL;So;0;L;<square> 006B 2113;;;;N;SQUARED KL;;;; 3399;SQUARE FM;So;0;L;<square> 0066 006D;;;;N;SQUARED FM;;;; 339A;SQUARE NM;So;0;L;<square> 006E 006D;;;;N;SQUARED NM;;;; 339B;SQUARE MU M;So;0;L;<square> 03BC 006D;;;;N;SQUARED MU M;;;; 339C;SQUARE MM;So;0;L;<square> 006D 006D;;;;N;SQUARED MM;;;; 339D;SQUARE CM;So;0;L;<square> 0063 006D;;;;N;SQUARED CM;;;; 339E;SQUARE KM;So;0;L;<square> 006B 006D;;;;N;SQUARED KM;;;; 339F;SQUARE MM SQUARED;So;0;L;<square> 006D 006D 00B2;;;;N;SQUARED MM SQUARED;;;; 33A0;SQUARE CM SQUARED;So;0;L;<square> 0063 006D 00B2;;;;N;SQUARED CM SQUARED;;;; 33A1;SQUARE M SQUARED;So;0;L;<square> 006D 00B2;;;;N;SQUARED M SQUARED;;;; 33A2;SQUARE KM SQUARED;So;0;L;<square> 006B 006D 00B2;;;;N;SQUARED KM SQUARED;;;; 33A3;SQUARE MM CUBED;So;0;L;<square> 006D 006D 00B3;;;;N;SQUARED MM CUBED;;;; 33A4;SQUARE CM CUBED;So;0;L;<square> 0063 006D 00B3;;;;N;SQUARED CM CUBED;;;; 33A5;SQUARE M CUBED;So;0;L;<square> 006D 00B3;;;;N;SQUARED M CUBED;;;; 33A6;SQUARE KM CUBED;So;0;L;<square> 006B 006D 00B3;;;;N;SQUARED KM CUBED;;;; 33A7;SQUARE M OVER S;So;0;L;<square> 006D 2215 0073;;;;N;SQUARED M OVER S;;;; 33A8;SQUARE M OVER S SQUARED;So;0;L;<square> 006D 2215 0073 00B2;;;;N;SQUARED M OVER S SQUARED;;;; 33A9;SQUARE PA;So;0;L;<square> 0050 0061;;;;N;SQUARED PA;;;; 33AA;SQUARE KPA;So;0;L;<square> 006B 0050 0061;;;;N;SQUARED KPA;;;; 33AB;SQUARE MPA;So;0;L;<square> 004D 0050 0061;;;;N;SQUARED MPA;;;; 33AC;SQUARE GPA;So;0;L;<square> 0047 0050 0061;;;;N;SQUARED GPA;;;; 33AD;SQUARE RAD;So;0;L;<square> 0072 0061 0064;;;;N;SQUARED RAD;;;; 33AE;SQUARE RAD OVER S;So;0;L;<square> 0072 0061 0064 2215 0073;;;;N;SQUARED RAD OVER S;;;; 33AF;SQUARE RAD OVER S SQUARED;So;0;L;<square> 0072 0061 0064 2215 0073 00B2;;;;N;SQUARED RAD OVER S SQUARED;;;; 33B0;SQUARE PS;So;0;L;<square> 0070 0073;;;;N;SQUARED PS;;;; 33B1;SQUARE NS;So;0;L;<square> 006E 0073;;;;N;SQUARED NS;;;; 33B2;SQUARE MU S;So;0;L;<square> 03BC 0073;;;;N;SQUARED MU S;;;; 33B3;SQUARE MS;So;0;L;<square> 006D 0073;;;;N;SQUARED MS;;;; 33B4;SQUARE PV;So;0;L;<square> 0070 0056;;;;N;SQUARED PV;;;; 33B5;SQUARE NV;So;0;L;<square> 006E 0056;;;;N;SQUARED NV;;;; 33B6;SQUARE MU V;So;0;L;<square> 03BC 0056;;;;N;SQUARED MU V;;;; 33B7;SQUARE MV;So;0;L;<square> 006D 0056;;;;N;SQUARED MV;;;; 33B8;SQUARE KV;So;0;L;<square> 006B 0056;;;;N;SQUARED KV;;;; 33B9;SQUARE MV MEGA;So;0;L;<square> 004D 0056;;;;N;SQUARED MV MEGA;;;; 33BA;SQUARE PW;So;0;L;<square> 0070 0057;;;;N;SQUARED PW;;;; 33BB;SQUARE NW;So;0;L;<square> 006E 0057;;;;N;SQUARED NW;;;; 33BC;SQUARE MU W;So;0;L;<square> 03BC 0057;;;;N;SQUARED MU W;;;; 33BD;SQUARE MW;So;0;L;<square> 006D 0057;;;;N;SQUARED MW;;;; 33BE;SQUARE KW;So;0;L;<square> 006B 0057;;;;N;SQUARED KW;;;; 33BF;SQUARE MW MEGA;So;0;L;<square> 004D 0057;;;;N;SQUARED MW MEGA;;;; 33C0;SQUARE K OHM;So;0;L;<square> 006B 03A9;;;;N;SQUARED K OHM;;;; 33C1;SQUARE M OHM;So;0;L;<square> 004D 03A9;;;;N;SQUARED M OHM;;;; 33C2;SQUARE AM;So;0;L;<square> 0061 002E 006D 002E;;;;N;SQUARED AM;;;; 33C3;SQUARE BQ;So;0;L;<square> 0042 0071;;;;N;SQUARED BQ;;;; 33C4;SQUARE CC;So;0;L;<square> 0063 0063;;;;N;SQUARED CC;;;; 33C5;SQUARE CD;So;0;L;<square> 0063 0064;;;;N;SQUARED CD;;;; 33C6;SQUARE C OVER KG;So;0;L;<square> 0043 2215 006B 0067;;;;N;SQUARED C OVER KG;;;; 33C7;SQUARE CO;So;0;L;<square> 0043 006F 002E;;;;N;SQUARED CO;;;; 33C8;SQUARE DB;So;0;L;<square> 0064 0042;;;;N;SQUARED DB;;;; 33C9;SQUARE GY;So;0;L;<square> 0047 0079;;;;N;SQUARED GY;;;; 33CA;SQUARE HA;So;0;L;<square> 0068 0061;;;;N;SQUARED HA;;;; 33CB;SQUARE HP;So;0;L;<square> 0048 0050;;;;N;SQUARED HP;;;; 33CC;SQUARE IN;So;0;L;<square> 0069 006E;;;;N;SQUARED IN;;;; 33CD;SQUARE KK;So;0;L;<square> 004B 004B;;;;N;SQUARED KK;;;; 33CE;SQUARE KM CAPITAL;So;0;L;<square> 004B 004D;;;;N;SQUARED KM CAPITAL;;;; 33CF;SQUARE KT;So;0;L;<square> 006B 0074;;;;N;SQUARED KT;;;; 33D0;SQUARE LM;So;0;L;<square> 006C 006D;;;;N;SQUARED LM;;;; 33D1;SQUARE LN;So;0;L;<square> 006C 006E;;;;N;SQUARED LN;;;; 33D2;SQUARE LOG;So;0;L;<square> 006C 006F 0067;;;;N;SQUARED LOG;;;; 33D3;SQUARE LX;So;0;L;<square> 006C 0078;;;;N;SQUARED LX;;;; 33D4;SQUARE MB SMALL;So;0;L;<square> 006D 0062;;;;N;SQUARED MB SMALL;;;; 33D5;SQUARE MIL;So;0;L;<square> 006D 0069 006C;;;;N;SQUARED MIL;;;; 33D6;SQUARE MOL;So;0;L;<square> 006D 006F 006C;;;;N;SQUARED MOL;;;; 33D7;SQUARE PH;So;0;L;<square> 0050 0048;;;;N;SQUARED PH;;;; 33D8;SQUARE PM;So;0;L;<square> 0070 002E 006D 002E;;;;N;SQUARED PM;;;; 33D9;SQUARE PPM;So;0;L;<square> 0050 0050 004D;;;;N;SQUARED PPM;;;; 33DA;SQUARE PR;So;0;L;<square> 0050 0052;;;;N;SQUARED PR;;;; 33DB;SQUARE SR;So;0;L;<square> 0073 0072;;;;N;SQUARED SR;;;; 33DC;SQUARE SV;So;0;L;<square> 0053 0076;;;;N;SQUARED SV;;;; 33DD;SQUARE WB;So;0;L;<square> 0057 0062;;;;N;SQUARED WB;;;; 33DE;SQUARE V OVER M;So;0;ON;<square> 0056 2215 006D;;;;N;;;;; 33DF;SQUARE A OVER M;So;0;ON;<square> 0041 2215 006D;;;;N;;;;; 33E0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE;So;0;L;<compat> 0031 65E5;;;;N;;;;; 33E1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO;So;0;L;<compat> 0032 65E5;;;;N;;;;; 33E2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE;So;0;L;<compat> 0033 65E5;;;;N;;;;; 33E3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR;So;0;L;<compat> 0034 65E5;;;;N;;;;; 33E4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE;So;0;L;<compat> 0035 65E5;;;;N;;;;; 33E5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX;So;0;L;<compat> 0036 65E5;;;;N;;;;; 33E6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN;So;0;L;<compat> 0037 65E5;;;;N;;;;; 33E7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT;So;0;L;<compat> 0038 65E5;;;;N;;;;; 33E8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE;So;0;L;<compat> 0039 65E5;;;;N;;;;; 33E9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN;So;0;L;<compat> 0031 0030 65E5;;;;N;;;;; 33EA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN;So;0;L;<compat> 0031 0031 65E5;;;;N;;;;; 33EB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE;So;0;L;<compat> 0031 0032 65E5;;;;N;;;;; 33EC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN;So;0;L;<compat> 0031 0033 65E5;;;;N;;;;; 33ED;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN;So;0;L;<compat> 0031 0034 65E5;;;;N;;;;; 33EE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN;So;0;L;<compat> 0031 0035 65E5;;;;N;;;;; 33EF;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN;So;0;L;<compat> 0031 0036 65E5;;;;N;;;;; 33F0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN;So;0;L;<compat> 0031 0037 65E5;;;;N;;;;; 33F1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN;So;0;L;<compat> 0031 0038 65E5;;;;N;;;;; 33F2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN;So;0;L;<compat> 0031 0039 65E5;;;;N;;;;; 33F3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY;So;0;L;<compat> 0032 0030 65E5;;;;N;;;;; 33F4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE;So;0;L;<compat> 0032 0031 65E5;;;;N;;;;; 33F5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO;So;0;L;<compat> 0032 0032 65E5;;;;N;;;;; 33F6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE;So;0;L;<compat> 0032 0033 65E5;;;;N;;;;; 33F7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR;So;0;L;<compat> 0032 0034 65E5;;;;N;;;;; 33F8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE;So;0;L;<compat> 0032 0035 65E5;;;;N;;;;; 33F9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX;So;0;L;<compat> 0032 0036 65E5;;;;N;;;;; 33FA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN;So;0;L;<compat> 0032 0037 65E5;;;;N;;;;; 33FB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT;So;0;L;<compat> 0032 0038 65E5;;;;N;;;;; 33FC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE;So;0;L;<compat> 0032 0039 65E5;;;;N;;;;; 33FD;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY;So;0;L;<compat> 0033 0030 65E5;;;;N;;;;; 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;;;;; 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;;;;; 4DC3;HEXAGRAM FOR YOUTHFUL FOLLY;So;0;ON;;;;;N;;;;; 4DC4;HEXAGRAM FOR WAITING;So;0;ON;;;;;N;;;;; 4DC5;HEXAGRAM FOR CONFLICT;So;0;ON;;;;;N;;;;; 4DC6;HEXAGRAM FOR THE ARMY;So;0;ON;;;;;N;;;;; 4DC7;HEXAGRAM FOR HOLDING TOGETHER;So;0;ON;;;;;N;;;;; 4DC8;HEXAGRAM FOR SMALL TAMING;So;0;ON;;;;;N;;;;; 4DC9;HEXAGRAM FOR TREADING;So;0;ON;;;;;N;;;;; 4DCA;HEXAGRAM FOR PEACE;So;0;ON;;;;;N;;;;; 4DCB;HEXAGRAM FOR STANDSTILL;So;0;ON;;;;;N;;;;; 4DCC;HEXAGRAM FOR FELLOWSHIP;So;0;ON;;;;;N;;;;; 4DCD;HEXAGRAM FOR GREAT POSSESSION;So;0;ON;;;;;N;;;;; 4DCE;HEXAGRAM FOR MODESTY;So;0;ON;;;;;N;;;;; 4DCF;HEXAGRAM FOR ENTHUSIASM;So;0;ON;;;;;N;;;;; 4DD0;HEXAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;; 4DD1;HEXAGRAM FOR WORK ON THE DECAYED;So;0;ON;;;;;N;;;;; 4DD2;HEXAGRAM FOR APPROACH;So;0;ON;;;;;N;;;;; 4DD3;HEXAGRAM FOR CONTEMPLATION;So;0;ON;;;;;N;;;;; 4DD4;HEXAGRAM FOR BITING THROUGH;So;0;ON;;;;;N;;;;; 4DD5;HEXAGRAM FOR GRACE;So;0;ON;;;;;N;;;;; 4DD6;HEXAGRAM FOR SPLITTING APART;So;0;ON;;;;;N;;;;; 4DD7;HEXAGRAM FOR RETURN;So;0;ON;;;;;N;;;;; 4DD8;HEXAGRAM FOR INNOCENCE;So;0;ON;;;;;N;;;;; 4DD9;HEXAGRAM FOR GREAT TAMING;So;0;ON;;;;;N;;;;; 4DDA;HEXAGRAM FOR MOUTH CORNERS;So;0;ON;;;;;N;;;;; 4DDB;HEXAGRAM FOR GREAT PREPONDERANCE;So;0;ON;;;;;N;;;;; 4DDC;HEXAGRAM FOR THE ABYSMAL WATER;So;0;ON;;;;;N;;;;; 4DDD;HEXAGRAM FOR THE CLINGING FIRE;So;0;ON;;;;;N;;;;; 4DDE;HEXAGRAM FOR INFLUENCE;So;0;ON;;;;;N;;;;; 4DDF;HEXAGRAM FOR DURATION;So;0;ON;;;;;N;;;;; 4DE0;HEXAGRAM FOR RETREAT;So;0;ON;;;;;N;;;;; 4DE1;HEXAGRAM FOR GREAT POWER;So;0;ON;;;;;N;;;;; 4DE2;HEXAGRAM FOR PROGRESS;So;0;ON;;;;;N;;;;; 4DE3;HEXAGRAM FOR DARKENING OF THE LIGHT;So;0;ON;;;;;N;;;;; 4DE4;HEXAGRAM FOR THE FAMILY;So;0;ON;;;;;N;;;;; 4DE5;HEXAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;; 4DE6;HEXAGRAM FOR OBSTRUCTION;So;0;ON;;;;;N;;;;; 4DE7;HEXAGRAM FOR DELIVERANCE;So;0;ON;;;;;N;;;;; 4DE8;HEXAGRAM FOR DECREASE;So;0;ON;;;;;N;;;;; 4DE9;HEXAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;; 4DEA;HEXAGRAM FOR BREAKTHROUGH;So;0;ON;;;;;N;;;;; 4DEB;HEXAGRAM FOR COMING TO MEET;So;0;ON;;;;;N;;;;; 4DEC;HEXAGRAM FOR GATHERING TOGETHER;So;0;ON;;;;;N;;;;; 4DED;HEXAGRAM FOR PUSHING UPWARD;So;0;ON;;;;;N;;;;; 4DEE;HEXAGRAM FOR OPPRESSION;So;0;ON;;;;;N;;;;; 4DEF;HEXAGRAM FOR THE WELL;So;0;ON;;;;;N;;;;; 4DF0;HEXAGRAM FOR REVOLUTION;So;0;ON;;;;;N;;;;; 4DF1;HEXAGRAM FOR THE CAULDRON;So;0;ON;;;;;N;;;;; 4DF2;HEXAGRAM FOR THE AROUSING THUNDER;So;0;ON;;;;;N;;;;; 4DF3;HEXAGRAM FOR THE KEEPING STILL MOUNTAIN;So;0;ON;;;;;N;;;;; 4DF4;HEXAGRAM FOR DEVELOPMENT;So;0;ON;;;;;N;;;;; 4DF5;HEXAGRAM FOR THE MARRYING MAIDEN;So;0;ON;;;;;N;;;;; 4DF6;HEXAGRAM FOR ABUNDANCE;So;0;ON;;;;;N;;;;; 4DF7;HEXAGRAM FOR THE WANDERER;So;0;ON;;;;;N;;;;; 4DF8;HEXAGRAM FOR THE GENTLE WIND;So;0;ON;;;;;N;;;;; 4DF9;HEXAGRAM FOR THE JOYOUS LAKE;So;0;ON;;;;;N;;;;; 4DFA;HEXAGRAM FOR DISPERSION;So;0;ON;;;;;N;;;;; 4DFB;HEXAGRAM FOR LIMITATION;So;0;ON;;;;;N;;;;; 4DFC;HEXAGRAM FOR INNER TRUTH;So;0;ON;;;;;N;;;;; 4DFD;HEXAGRAM FOR SMALL PREPONDERANCE;So;0;ON;;;;;N;;;;; 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;;;;; 9FD5;<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;;;;; A003;YI SYLLABLE IP;Lo;0;L;;;;;N;;;;; A004;YI SYLLABLE IET;Lo;0;L;;;;;N;;;;; A005;YI SYLLABLE IEX;Lo;0;L;;;;;N;;;;; A006;YI SYLLABLE IE;Lo;0;L;;;;;N;;;;; A007;YI SYLLABLE IEP;Lo;0;L;;;;;N;;;;; A008;YI SYLLABLE AT;Lo;0;L;;;;;N;;;;; A009;YI SYLLABLE AX;Lo;0;L;;;;;N;;;;; A00A;YI SYLLABLE A;Lo;0;L;;;;;N;;;;; A00B;YI SYLLABLE AP;Lo;0;L;;;;;N;;;;; A00C;YI SYLLABLE UOX;Lo;0;L;;;;;N;;;;; A00D;YI SYLLABLE UO;Lo;0;L;;;;;N;;;;; A00E;YI SYLLABLE UOP;Lo;0;L;;;;;N;;;;; A00F;YI SYLLABLE OT;Lo;0;L;;;;;N;;;;; A010;YI SYLLABLE OX;Lo;0;L;;;;;N;;;;; A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;; A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;; A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;; A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;; A015;YI SYLLABLE WU;Lm;0;L;;;;;N;;;;; A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;; A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;; A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;; A019;YI SYLLABLE BIP;Lo;0;L;;;;;N;;;;; A01A;YI SYLLABLE BIET;Lo;0;L;;;;;N;;;;; A01B;YI SYLLABLE BIEX;Lo;0;L;;;;;N;;;;; A01C;YI SYLLABLE BIE;Lo;0;L;;;;;N;;;;; A01D;YI SYLLABLE BIEP;Lo;0;L;;;;;N;;;;; A01E;YI SYLLABLE BAT;Lo;0;L;;;;;N;;;;; A01F;YI SYLLABLE BAX;Lo;0;L;;;;;N;;;;; A020;YI SYLLABLE BA;Lo;0;L;;;;;N;;;;; A021;YI SYLLABLE BAP;Lo;0;L;;;;;N;;;;; A022;YI SYLLABLE BUOX;Lo;0;L;;;;;N;;;;; A023;YI SYLLABLE BUO;Lo;0;L;;;;;N;;;;; A024;YI SYLLABLE BUOP;Lo;0;L;;;;;N;;;;; A025;YI SYLLABLE BOT;Lo;0;L;;;;;N;;;;; A026;YI SYLLABLE BOX;Lo;0;L;;;;;N;;;;; A027;YI SYLLABLE BO;Lo;0;L;;;;;N;;;;; A028;YI SYLLABLE BOP;Lo;0;L;;;;;N;;;;; A029;YI SYLLABLE BEX;Lo;0;L;;;;;N;;;;; A02A;YI SYLLABLE BE;Lo;0;L;;;;;N;;;;; A02B;YI SYLLABLE BEP;Lo;0;L;;;;;N;;;;; A02C;YI SYLLABLE BUT;Lo;0;L;;;;;N;;;;; A02D;YI SYLLABLE BUX;Lo;0;L;;;;;N;;;;; A02E;YI SYLLABLE BU;Lo;0;L;;;;;N;;;;; A02F;YI SYLLABLE BUP;Lo;0;L;;;;;N;;;;; A030;YI SYLLABLE BURX;Lo;0;L;;;;;N;;;;; A031;YI SYLLABLE BUR;Lo;0;L;;;;;N;;;;; A032;YI SYLLABLE BYT;Lo;0;L;;;;;N;;;;; A033;YI SYLLABLE BYX;Lo;0;L;;;;;N;;;;; A034;YI SYLLABLE BY;Lo;0;L;;;;;N;;;;; A035;YI SYLLABLE BYP;Lo;0;L;;;;;N;;;;; A036;YI SYLLABLE BYRX;Lo;0;L;;;;;N;;;;; A037;YI SYLLABLE BYR;Lo;0;L;;;;;N;;;;; A038;YI SYLLABLE PIT;Lo;0;L;;;;;N;;;;; A039;YI SYLLABLE PIX;Lo;0;L;;;;;N;;;;; A03A;YI SYLLABLE PI;Lo;0;L;;;;;N;;;;; A03B;YI SYLLABLE PIP;Lo;0;L;;;;;N;;;;; A03C;YI SYLLABLE PIEX;Lo;0;L;;;;;N;;;;; A03D;YI SYLLABLE PIE;Lo;0;L;;;;;N;;;;; A03E;YI SYLLABLE PIEP;Lo;0;L;;;;;N;;;;; A03F;YI SYLLABLE PAT;Lo;0;L;;;;;N;;;;; A040;YI SYLLABLE PAX;Lo;0;L;;;;;N;;;;; A041;YI SYLLABLE PA;Lo;0;L;;;;;N;;;;; A042;YI SYLLABLE PAP;Lo;0;L;;;;;N;;;;; A043;YI SYLLABLE PUOX;Lo;0;L;;;;;N;;;;; A044;YI SYLLABLE PUO;Lo;0;L;;;;;N;;;;; A045;YI SYLLABLE PUOP;Lo;0;L;;;;;N;;;;; A046;YI SYLLABLE POT;Lo;0;L;;;;;N;;;;; A047;YI SYLLABLE POX;Lo;0;L;;;;;N;;;;; A048;YI SYLLABLE PO;Lo;0;L;;;;;N;;;;; A049;YI SYLLABLE POP;Lo;0;L;;;;;N;;;;; A04A;YI SYLLABLE PUT;Lo;0;L;;;;;N;;;;; A04B;YI SYLLABLE PUX;Lo;0;L;;;;;N;;;;; A04C;YI SYLLABLE PU;Lo;0;L;;;;;N;;;;; A04D;YI SYLLABLE PUP;Lo;0;L;;;;;N;;;;; A04E;YI SYLLABLE PURX;Lo;0;L;;;;;N;;;;; A04F;YI SYLLABLE PUR;Lo;0;L;;;;;N;;;;; A050;YI SYLLABLE PYT;Lo;0;L;;;;;N;;;;; A051;YI SYLLABLE PYX;Lo;0;L;;;;;N;;;;; A052;YI SYLLABLE PY;Lo;0;L;;;;;N;;;;; A053;YI SYLLABLE PYP;Lo;0;L;;;;;N;;;;; A054;YI SYLLABLE PYRX;Lo;0;L;;;;;N;;;;; A055;YI SYLLABLE PYR;Lo;0;L;;;;;N;;;;; A056;YI SYLLABLE BBIT;Lo;0;L;;;;;N;;;;; A057;YI SYLLABLE BBIX;Lo;0;L;;;;;N;;;;; A058;YI SYLLABLE BBI;Lo;0;L;;;;;N;;;;; A059;YI SYLLABLE BBIP;Lo;0;L;;;;;N;;;;; A05A;YI SYLLABLE BBIET;Lo;0;L;;;;;N;;;;; A05B;YI SYLLABLE BBIEX;Lo;0;L;;;;;N;;;;; A05C;YI SYLLABLE BBIE;Lo;0;L;;;;;N;;;;; A05D;YI SYLLABLE BBIEP;Lo;0;L;;;;;N;;;;; A05E;YI SYLLABLE BBAT;Lo;0;L;;;;;N;;;;; A05F;YI SYLLABLE BBAX;Lo;0;L;;;;;N;;;;; A060;YI SYLLABLE BBA;Lo;0;L;;;;;N;;;;; A061;YI SYLLABLE BBAP;Lo;0;L;;;;;N;;;;; A062;YI SYLLABLE BBUOX;Lo;0;L;;;;;N;;;;; A063;YI SYLLABLE BBUO;Lo;0;L;;;;;N;;;;; A064;YI SYLLABLE BBUOP;Lo;0;L;;;;;N;;;;; A065;YI SYLLABLE BBOT;Lo;0;L;;;;;N;;;;; A066;YI SYLLABLE BBOX;Lo;0;L;;;;;N;;;;; A067;YI SYLLABLE BBO;Lo;0;L;;;;;N;;;;; A068;YI SYLLABLE BBOP;Lo;0;L;;;;;N;;;;; A069;YI SYLLABLE BBEX;Lo;0;L;;;;;N;;;;; A06A;YI SYLLABLE BBE;Lo;0;L;;;;;N;;;;; A06B;YI SYLLABLE BBEP;Lo;0;L;;;;;N;;;;; A06C;YI SYLLABLE BBUT;Lo;0;L;;;;;N;;;;; A06D;YI SYLLABLE BBUX;Lo;0;L;;;;;N;;;;; A06E;YI SYLLABLE BBU;Lo;0;L;;;;;N;;;;; A06F;YI SYLLABLE BBUP;Lo;0;L;;;;;N;;;;; A070;YI SYLLABLE BBURX;Lo;0;L;;;;;N;;;;; A071;YI SYLLABLE BBUR;Lo;0;L;;;;;N;;;;; A072;YI SYLLABLE BBYT;Lo;0;L;;;;;N;;;;; A073;YI SYLLABLE BBYX;Lo;0;L;;;;;N;;;;; A074;YI SYLLABLE BBY;Lo;0;L;;;;;N;;;;; A075;YI SYLLABLE BBYP;Lo;0;L;;;;;N;;;;; A076;YI SYLLABLE NBIT;Lo;0;L;;;;;N;;;;; A077;YI SYLLABLE NBIX;Lo;0;L;;;;;N;;;;; A078;YI SYLLABLE NBI;Lo;0;L;;;;;N;;;;; A079;YI SYLLABLE NBIP;Lo;0;L;;;;;N;;;;; A07A;YI SYLLABLE NBIEX;Lo;0;L;;;;;N;;;;; A07B;YI SYLLABLE NBIE;Lo;0;L;;;;;N;;;;; A07C;YI SYLLABLE NBIEP;Lo;0;L;;;;;N;;;;; A07D;YI SYLLABLE NBAT;Lo;0;L;;;;;N;;;;; A07E;YI SYLLABLE NBAX;Lo;0;L;;;;;N;;;;; A07F;YI SYLLABLE NBA;Lo;0;L;;;;;N;;;;; A080;YI SYLLABLE NBAP;Lo;0;L;;;;;N;;;;; A081;YI SYLLABLE NBOT;Lo;0;L;;;;;N;;;;; A082;YI SYLLABLE NBOX;Lo;0;L;;;;;N;;;;; A083;YI SYLLABLE NBO;Lo;0;L;;;;;N;;;;; A084;YI SYLLABLE NBOP;Lo;0;L;;;;;N;;;;; A085;YI SYLLABLE NBUT;Lo;0;L;;;;;N;;;;; A086;YI SYLLABLE NBUX;Lo;0;L;;;;;N;;;;; A087;YI SYLLABLE NBU;Lo;0;L;;;;;N;;;;; A088;YI SYLLABLE NBUP;Lo;0;L;;;;;N;;;;; A089;YI SYLLABLE NBURX;Lo;0;L;;;;;N;;;;; A08A;YI SYLLABLE NBUR;Lo;0;L;;;;;N;;;;; A08B;YI SYLLABLE NBYT;Lo;0;L;;;;;N;;;;; A08C;YI SYLLABLE NBYX;Lo;0;L;;;;;N;;;;; A08D;YI SYLLABLE NBY;Lo;0;L;;;;;N;;;;; A08E;YI SYLLABLE NBYP;Lo;0;L;;;;;N;;;;; A08F;YI SYLLABLE NBYRX;Lo;0;L;;;;;N;;;;; A090;YI SYLLABLE NBYR;Lo;0;L;;;;;N;;;;; A091;YI SYLLABLE HMIT;Lo;0;L;;;;;N;;;;; A092;YI SYLLABLE HMIX;Lo;0;L;;;;;N;;;;; A093;YI SYLLABLE HMI;Lo;0;L;;;;;N;;;;; A094;YI SYLLABLE HMIP;Lo;0;L;;;;;N;;;;; A095;YI SYLLABLE HMIEX;Lo;0;L;;;;;N;;;;; A096;YI SYLLABLE HMIE;Lo;0;L;;;;;N;;;;; A097;YI SYLLABLE HMIEP;Lo;0;L;;;;;N;;;;; A098;YI SYLLABLE HMAT;Lo;0;L;;;;;N;;;;; A099;YI SYLLABLE HMAX;Lo;0;L;;;;;N;;;;; A09A;YI SYLLABLE HMA;Lo;0;L;;;;;N;;;;; A09B;YI SYLLABLE HMAP;Lo;0;L;;;;;N;;;;; A09C;YI SYLLABLE HMUOX;Lo;0;L;;;;;N;;;;; A09D;YI SYLLABLE HMUO;Lo;0;L;;;;;N;;;;; A09E;YI SYLLABLE HMUOP;Lo;0;L;;;;;N;;;;; A09F;YI SYLLABLE HMOT;Lo;0;L;;;;;N;;;;; A0A0;YI SYLLABLE HMOX;Lo;0;L;;;;;N;;;;; A0A1;YI SYLLABLE HMO;Lo;0;L;;;;;N;;;;; A0A2;YI SYLLABLE HMOP;Lo;0;L;;;;;N;;;;; A0A3;YI SYLLABLE HMUT;Lo;0;L;;;;;N;;;;; A0A4;YI SYLLABLE HMUX;Lo;0;L;;;;;N;;;;; A0A5;YI SYLLABLE HMU;Lo;0;L;;;;;N;;;;; A0A6;YI SYLLABLE HMUP;Lo;0;L;;;;;N;;;;; A0A7;YI SYLLABLE HMURX;Lo;0;L;;;;;N;;;;; A0A8;YI SYLLABLE HMUR;Lo;0;L;;;;;N;;;;; A0A9;YI SYLLABLE HMYX;Lo;0;L;;;;;N;;;;; A0AA;YI SYLLABLE HMY;Lo;0;L;;;;;N;;;;; A0AB;YI SYLLABLE HMYP;Lo;0;L;;;;;N;;;;; A0AC;YI SYLLABLE HMYRX;Lo;0;L;;;;;N;;;;; A0AD;YI SYLLABLE HMYR;Lo;0;L;;;;;N;;;;; A0AE;YI SYLLABLE MIT;Lo;0;L;;;;;N;;;;; A0AF;YI SYLLABLE MIX;Lo;0;L;;;;;N;;;;; A0B0;YI SYLLABLE MI;Lo;0;L;;;;;N;;;;; A0B1;YI SYLLABLE MIP;Lo;0;L;;;;;N;;;;; A0B2;YI SYLLABLE MIEX;Lo;0;L;;;;;N;;;;; A0B3;YI SYLLABLE MIE;Lo;0;L;;;;;N;;;;; A0B4;YI SYLLABLE MIEP;Lo;0;L;;;;;N;;;;; A0B5;YI SYLLABLE MAT;Lo;0;L;;;;;N;;;;; A0B6;YI SYLLABLE MAX;Lo;0;L;;;;;N;;;;; A0B7;YI SYLLABLE MA;Lo;0;L;;;;;N;;;;; A0B8;YI SYLLABLE MAP;Lo;0;L;;;;;N;;;;; A0B9;YI SYLLABLE MUOT;Lo;0;L;;;;;N;;;;; A0BA;YI SYLLABLE MUOX;Lo;0;L;;;;;N;;;;; A0BB;YI SYLLABLE MUO;Lo;0;L;;;;;N;;;;; A0BC;YI SYLLABLE MUOP;Lo;0;L;;;;;N;;;;; A0BD;YI SYLLABLE MOT;Lo;0;L;;;;;N;;;;; A0BE;YI SYLLABLE MOX;Lo;0;L;;;;;N;;;;; A0BF;YI SYLLABLE MO;Lo;0;L;;;;;N;;;;; A0C0;YI SYLLABLE MOP;Lo;0;L;;;;;N;;;;; A0C1;YI SYLLABLE MEX;Lo;0;L;;;;;N;;;;; A0C2;YI SYLLABLE ME;Lo;0;L;;;;;N;;;;; A0C3;YI SYLLABLE MUT;Lo;0;L;;;;;N;;;;; A0C4;YI SYLLABLE MUX;Lo;0;L;;;;;N;;;;; A0C5;YI SYLLABLE MU;Lo;0;L;;;;;N;;;;; A0C6;YI SYLLABLE MUP;Lo;0;L;;;;;N;;;;; A0C7;YI SYLLABLE MURX;Lo;0;L;;;;;N;;;;; A0C8;YI SYLLABLE MUR;Lo;0;L;;;;;N;;;;; A0C9;YI SYLLABLE MYT;Lo;0;L;;;;;N;;;;; A0CA;YI SYLLABLE MYX;Lo;0;L;;;;;N;;;;; A0CB;YI SYLLABLE MY;Lo;0;L;;;;;N;;;;; A0CC;YI SYLLABLE MYP;Lo;0;L;;;;;N;;;;; A0CD;YI SYLLABLE FIT;Lo;0;L;;;;;N;;;;; A0CE;YI SYLLABLE FIX;Lo;0;L;;;;;N;;;;; A0CF;YI SYLLABLE FI;Lo;0;L;;;;;N;;;;; A0D0;YI SYLLABLE FIP;Lo;0;L;;;;;N;;;;; A0D1;YI SYLLABLE FAT;Lo;0;L;;;;;N;;;;; A0D2;YI SYLLABLE FAX;Lo;0;L;;;;;N;;;;; A0D3;YI SYLLABLE FA;Lo;0;L;;;;;N;;;;; A0D4;YI SYLLABLE FAP;Lo;0;L;;;;;N;;;;; A0D5;YI SYLLABLE FOX;Lo;0;L;;;;;N;;;;; A0D6;YI SYLLABLE FO;Lo;0;L;;;;;N;;;;; A0D7;YI SYLLABLE FOP;Lo;0;L;;;;;N;;;;; A0D8;YI SYLLABLE FUT;Lo;0;L;;;;;N;;;;; A0D9;YI SYLLABLE FUX;Lo;0;L;;;;;N;;;;; A0DA;YI SYLLABLE FU;Lo;0;L;;;;;N;;;;; A0DB;YI SYLLABLE FUP;Lo;0;L;;;;;N;;;;; A0DC;YI SYLLABLE FURX;Lo;0;L;;;;;N;;;;; A0DD;YI SYLLABLE FUR;Lo;0;L;;;;;N;;;;; A0DE;YI SYLLABLE FYT;Lo;0;L;;;;;N;;;;; A0DF;YI SYLLABLE FYX;Lo;0;L;;;;;N;;;;; A0E0;YI SYLLABLE FY;Lo;0;L;;;;;N;;;;; A0E1;YI SYLLABLE FYP;Lo;0;L;;;;;N;;;;; A0E2;YI SYLLABLE VIT;Lo;0;L;;;;;N;;;;; A0E3;YI SYLLABLE VIX;Lo;0;L;;;;;N;;;;; A0E4;YI SYLLABLE VI;Lo;0;L;;;;;N;;;;; A0E5;YI SYLLABLE VIP;Lo;0;L;;;;;N;;;;; A0E6;YI SYLLABLE VIET;Lo;0;L;;;;;N;;;;; A0E7;YI SYLLABLE VIEX;Lo;0;L;;;;;N;;;;; A0E8;YI SYLLABLE VIE;Lo;0;L;;;;;N;;;;; A0E9;YI SYLLABLE VIEP;Lo;0;L;;;;;N;;;;; A0EA;YI SYLLABLE VAT;Lo;0;L;;;;;N;;;;; A0EB;YI SYLLABLE VAX;Lo;0;L;;;;;N;;;;; A0EC;YI SYLLABLE VA;Lo;0;L;;;;;N;;;;; A0ED;YI SYLLABLE VAP;Lo;0;L;;;;;N;;;;; A0EE;YI SYLLABLE VOT;Lo;0;L;;;;;N;;;;; A0EF;YI SYLLABLE VOX;Lo;0;L;;;;;N;;;;; A0F0;YI SYLLABLE VO;Lo;0;L;;;;;N;;;;; A0F1;YI SYLLABLE VOP;Lo;0;L;;;;;N;;;;; A0F2;YI SYLLABLE VEX;Lo;0;L;;;;;N;;;;; A0F3;YI SYLLABLE VEP;Lo;0;L;;;;;N;;;;; A0F4;YI SYLLABLE VUT;Lo;0;L;;;;;N;;;;; A0F5;YI SYLLABLE VUX;Lo;0;L;;;;;N;;;;; A0F6;YI SYLLABLE VU;Lo;0;L;;;;;N;;;;; A0F7;YI SYLLABLE VUP;Lo;0;L;;;;;N;;;;; A0F8;YI SYLLABLE VURX;Lo;0;L;;;;;N;;;;; A0F9;YI SYLLABLE VUR;Lo;0;L;;;;;N;;;;; A0FA;YI SYLLABLE VYT;Lo;0;L;;;;;N;;;;; A0FB;YI SYLLABLE VYX;Lo;0;L;;;;;N;;;;; A0FC;YI SYLLABLE VY;Lo;0;L;;;;;N;;;;; A0FD;YI SYLLABLE VYP;Lo;0;L;;;;;N;;;;; A0FE;YI SYLLABLE VYRX;Lo;0;L;;;;;N;;;;; A0FF;YI SYLLABLE VYR;Lo;0;L;;;;;N;;;;; A100;YI SYLLABLE DIT;Lo;0;L;;;;;N;;;;; A101;YI SYLLABLE DIX;Lo;0;L;;;;;N;;;;; A102;YI SYLLABLE DI;Lo;0;L;;;;;N;;;;; A103;YI SYLLABLE DIP;Lo;0;L;;;;;N;;;;; A104;YI SYLLABLE DIEX;Lo;0;L;;;;;N;;;;; A105;YI SYLLABLE DIE;Lo;0;L;;;;;N;;;;; A106;YI SYLLABLE DIEP;Lo;0;L;;;;;N;;;;; A107;YI SYLLABLE DAT;Lo;0;L;;;;;N;;;;; A108;YI SYLLABLE DAX;Lo;0;L;;;;;N;;;;; A109;YI SYLLABLE DA;Lo;0;L;;;;;N;;;;; A10A;YI SYLLABLE DAP;Lo;0;L;;;;;N;;;;; A10B;YI SYLLABLE DUOX;Lo;0;L;;;;;N;;;;; A10C;YI SYLLABLE DUO;Lo;0;L;;;;;N;;;;; A10D;YI SYLLABLE DOT;Lo;0;L;;;;;N;;;;; A10E;YI SYLLABLE DOX;Lo;0;L;;;;;N;;;;; A10F;YI SYLLABLE DO;Lo;0;L;;;;;N;;;;; A110;YI SYLLABLE DOP;Lo;0;L;;;;;N;;;;; A111;YI SYLLABLE DEX;Lo;0;L;;;;;N;;;;; A112;YI SYLLABLE DE;Lo;0;L;;;;;N;;;;; A113;YI SYLLABLE DEP;Lo;0;L;;;;;N;;;;; A114;YI SYLLABLE DUT;Lo;0;L;;;;;N;;;;; A115;YI SYLLABLE DUX;Lo;0;L;;;;;N;;;;; A116;YI SYLLABLE DU;Lo;0;L;;;;;N;;;;; A117;YI SYLLABLE DUP;Lo;0;L;;;;;N;;;;; A118;YI SYLLABLE DURX;Lo;0;L;;;;;N;;;;; A119;YI SYLLABLE DUR;Lo;0;L;;;;;N;;;;; A11A;YI SYLLABLE TIT;Lo;0;L;;;;;N;;;;; A11B;YI SYLLABLE TIX;Lo;0;L;;;;;N;;;;; A11C;YI SYLLABLE TI;Lo;0;L;;;;;N;;;;; A11D;YI SYLLABLE TIP;Lo;0;L;;;;;N;;;;; A11E;YI SYLLABLE TIEX;Lo;0;L;;;;;N;;;;; A11F;YI SYLLABLE TIE;Lo;0;L;;;;;N;;;;; A120;YI SYLLABLE TIEP;Lo;0;L;;;;;N;;;;; A121;YI SYLLABLE TAT;Lo;0;L;;;;;N;;;;; A122;YI SYLLABLE TAX;Lo;0;L;;;;;N;;;;; A123;YI SYLLABLE TA;Lo;0;L;;;;;N;;;;; A124;YI SYLLABLE TAP;Lo;0;L;;;;;N;;;;; A125;YI SYLLABLE TUOT;Lo;0;L;;;;;N;;;;; A126;YI SYLLABLE TUOX;Lo;0;L;;;;;N;;;;; A127;YI SYLLABLE TUO;Lo;0;L;;;;;N;;;;; A128;YI SYLLABLE TUOP;Lo;0;L;;;;;N;;;;; A129;YI SYLLABLE TOT;Lo;0;L;;;;;N;;;;; A12A;YI SYLLABLE TOX;Lo;0;L;;;;;N;;;;; A12B;YI SYLLABLE TO;Lo;0;L;;;;;N;;;;; A12C;YI SYLLABLE TOP;Lo;0;L;;;;;N;;;;; A12D;YI SYLLABLE TEX;Lo;0;L;;;;;N;;;;; A12E;YI SYLLABLE TE;Lo;0;L;;;;;N;;;;; A12F;YI SYLLABLE TEP;Lo;0;L;;;;;N;;;;; A130;YI SYLLABLE TUT;Lo;0;L;;;;;N;;;;; A131;YI SYLLABLE TUX;Lo;0;L;;;;;N;;;;; A132;YI SYLLABLE TU;Lo;0;L;;;;;N;;;;; A133;YI SYLLABLE TUP;Lo;0;L;;;;;N;;;;; A134;YI SYLLABLE TURX;Lo;0;L;;;;;N;;;;; A135;YI SYLLABLE TUR;Lo;0;L;;;;;N;;;;; A136;YI SYLLABLE DDIT;Lo;0;L;;;;;N;;;;; A137;YI SYLLABLE DDIX;Lo;0;L;;;;;N;;;;; A138;YI SYLLABLE DDI;Lo;0;L;;;;;N;;;;; A139;YI SYLLABLE DDIP;Lo;0;L;;;;;N;;;;; A13A;YI SYLLABLE DDIEX;Lo;0;L;;;;;N;;;;; A13B;YI SYLLABLE DDIE;Lo;0;L;;;;;N;;;;; A13C;YI SYLLABLE DDIEP;Lo;0;L;;;;;N;;;;; A13D;YI SYLLABLE DDAT;Lo;0;L;;;;;N;;;;; A13E;YI SYLLABLE DDAX;Lo;0;L;;;;;N;;;;; A13F;YI SYLLABLE DDA;Lo;0;L;;;;;N;;;;; A140;YI SYLLABLE DDAP;Lo;0;L;;;;;N;;;;; A141;YI SYLLABLE DDUOX;Lo;0;L;;;;;N;;;;; A142;YI SYLLABLE DDUO;Lo;0;L;;;;;N;;;;; A143;YI SYLLABLE DDUOP;Lo;0;L;;;;;N;;;;; A144;YI SYLLABLE DDOT;Lo;0;L;;;;;N;;;;; A145;YI SYLLABLE DDOX;Lo;0;L;;;;;N;;;;; A146;YI SYLLABLE DDO;Lo;0;L;;;;;N;;;;; A147;YI SYLLABLE DDOP;Lo;0;L;;;;;N;;;;; A148;YI SYLLABLE DDEX;Lo;0;L;;;;;N;;;;; A149;YI SYLLABLE DDE;Lo;0;L;;;;;N;;;;; A14A;YI SYLLABLE DDEP;Lo;0;L;;;;;N;;;;; A14B;YI SYLLABLE DDUT;Lo;0;L;;;;;N;;;;; A14C;YI SYLLABLE DDUX;Lo;0;L;;;;;N;;;;; A14D;YI SYLLABLE DDU;Lo;0;L;;;;;N;;;;; A14E;YI SYLLABLE DDUP;Lo;0;L;;;;;N;;;;; A14F;YI SYLLABLE DDURX;Lo;0;L;;;;;N;;;;; A150;YI SYLLABLE DDUR;Lo;0;L;;;;;N;;;;; A151;YI SYLLABLE NDIT;Lo;0;L;;;;;N;;;;; A152;YI SYLLABLE NDIX;Lo;0;L;;;;;N;;;;; A153;YI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; A154;YI SYLLABLE NDIP;Lo;0;L;;;;;N;;;;; A155;YI SYLLABLE NDIEX;Lo;0;L;;;;;N;;;;; A156;YI SYLLABLE NDIE;Lo;0;L;;;;;N;;;;; A157;YI SYLLABLE NDAT;Lo;0;L;;;;;N;;;;; A158;YI SYLLABLE NDAX;Lo;0;L;;;;;N;;;;; A159;YI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; A15A;YI SYLLABLE NDAP;Lo;0;L;;;;;N;;;;; A15B;YI SYLLABLE NDOT;Lo;0;L;;;;;N;;;;; A15C;YI SYLLABLE NDOX;Lo;0;L;;;;;N;;;;; A15D;YI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; A15E;YI SYLLABLE NDOP;Lo;0;L;;;;;N;;;;; A15F;YI SYLLABLE NDEX;Lo;0;L;;;;;N;;;;; A160;YI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; A161;YI SYLLABLE NDEP;Lo;0;L;;;;;N;;;;; A162;YI SYLLABLE NDUT;Lo;0;L;;;;;N;;;;; A163;YI SYLLABLE NDUX;Lo;0;L;;;;;N;;;;; A164;YI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; A165;YI SYLLABLE NDUP;Lo;0;L;;;;;N;;;;; A166;YI SYLLABLE NDURX;Lo;0;L;;;;;N;;;;; A167;YI SYLLABLE NDUR;Lo;0;L;;;;;N;;;;; A168;YI SYLLABLE HNIT;Lo;0;L;;;;;N;;;;; A169;YI SYLLABLE HNIX;Lo;0;L;;;;;N;;;;; A16A;YI SYLLABLE HNI;Lo;0;L;;;;;N;;;;; A16B;YI SYLLABLE HNIP;Lo;0;L;;;;;N;;;;; A16C;YI SYLLABLE HNIET;Lo;0;L;;;;;N;;;;; A16D;YI SYLLABLE HNIEX;Lo;0;L;;;;;N;;;;; A16E;YI SYLLABLE HNIE;Lo;0;L;;;;;N;;;;; A16F;YI SYLLABLE HNIEP;Lo;0;L;;;;;N;;;;; A170;YI SYLLABLE HNAT;Lo;0;L;;;;;N;;;;; A171;YI SYLLABLE HNAX;Lo;0;L;;;;;N;;;;; A172;YI SYLLABLE HNA;Lo;0;L;;;;;N;;;;; A173;YI SYLLABLE HNAP;Lo;0;L;;;;;N;;;;; A174;YI SYLLABLE HNUOX;Lo;0;L;;;;;N;;;;; A175;YI SYLLABLE HNUO;Lo;0;L;;;;;N;;;;; A176;YI SYLLABLE HNOT;Lo;0;L;;;;;N;;;;; A177;YI SYLLABLE HNOX;Lo;0;L;;;;;N;;;;; A178;YI SYLLABLE HNOP;Lo;0;L;;;;;N;;;;; A179;YI SYLLABLE HNEX;Lo;0;L;;;;;N;;;;; A17A;YI SYLLABLE HNE;Lo;0;L;;;;;N;;;;; A17B;YI SYLLABLE HNEP;Lo;0;L;;;;;N;;;;; A17C;YI SYLLABLE HNUT;Lo;0;L;;;;;N;;;;; A17D;YI SYLLABLE NIT;Lo;0;L;;;;;N;;;;; A17E;YI SYLLABLE NIX;Lo;0;L;;;;;N;;;;; A17F;YI SYLLABLE NI;Lo;0;L;;;;;N;;;;; A180;YI SYLLABLE NIP;Lo;0;L;;;;;N;;;;; A181;YI SYLLABLE NIEX;Lo;0;L;;;;;N;;;;; A182;YI SYLLABLE NIE;Lo;0;L;;;;;N;;;;; A183;YI SYLLABLE NIEP;Lo;0;L;;;;;N;;;;; A184;YI SYLLABLE NAX;Lo;0;L;;;;;N;;;;; A185;YI SYLLABLE NA;Lo;0;L;;;;;N;;;;; A186;YI SYLLABLE NAP;Lo;0;L;;;;;N;;;;; A187;YI SYLLABLE NUOX;Lo;0;L;;;;;N;;;;; A188;YI SYLLABLE NUO;Lo;0;L;;;;;N;;;;; A189;YI SYLLABLE NUOP;Lo;0;L;;;;;N;;;;; A18A;YI SYLLABLE NOT;Lo;0;L;;;;;N;;;;; A18B;YI SYLLABLE NOX;Lo;0;L;;;;;N;;;;; A18C;YI SYLLABLE NO;Lo;0;L;;;;;N;;;;; A18D;YI SYLLABLE NOP;Lo;0;L;;;;;N;;;;; A18E;YI SYLLABLE NEX;Lo;0;L;;;;;N;;;;; A18F;YI SYLLABLE NE;Lo;0;L;;;;;N;;;;; A190;YI SYLLABLE NEP;Lo;0;L;;;;;N;;;;; A191;YI SYLLABLE NUT;Lo;0;L;;;;;N;;;;; A192;YI SYLLABLE NUX;Lo;0;L;;;;;N;;;;; A193;YI SYLLABLE NU;Lo;0;L;;;;;N;;;;; A194;YI SYLLABLE NUP;Lo;0;L;;;;;N;;;;; A195;YI SYLLABLE NURX;Lo;0;L;;;;;N;;;;; A196;YI SYLLABLE NUR;Lo;0;L;;;;;N;;;;; A197;YI SYLLABLE HLIT;Lo;0;L;;;;;N;;;;; A198;YI SYLLABLE HLIX;Lo;0;L;;;;;N;;;;; A199;YI SYLLABLE HLI;Lo;0;L;;;;;N;;;;; A19A;YI SYLLABLE HLIP;Lo;0;L;;;;;N;;;;; A19B;YI SYLLABLE HLIEX;Lo;0;L;;;;;N;;;;; A19C;YI SYLLABLE HLIE;Lo;0;L;;;;;N;;;;; A19D;YI SYLLABLE HLIEP;Lo;0;L;;;;;N;;;;; A19E;YI SYLLABLE HLAT;Lo;0;L;;;;;N;;;;; A19F;YI SYLLABLE HLAX;Lo;0;L;;;;;N;;;;; A1A0;YI SYLLABLE HLA;Lo;0;L;;;;;N;;;;; A1A1;YI SYLLABLE HLAP;Lo;0;L;;;;;N;;;;; A1A2;YI SYLLABLE HLUOX;Lo;0;L;;;;;N;;;;; A1A3;YI SYLLABLE HLUO;Lo;0;L;;;;;N;;;;; A1A4;YI SYLLABLE HLUOP;Lo;0;L;;;;;N;;;;; A1A5;YI SYLLABLE HLOX;Lo;0;L;;;;;N;;;;; A1A6;YI SYLLABLE HLO;Lo;0;L;;;;;N;;;;; A1A7;YI SYLLABLE HLOP;Lo;0;L;;;;;N;;;;; A1A8;YI SYLLABLE HLEX;Lo;0;L;;;;;N;;;;; A1A9;YI SYLLABLE HLE;Lo;0;L;;;;;N;;;;; A1AA;YI SYLLABLE HLEP;Lo;0;L;;;;;N;;;;; A1AB;YI SYLLABLE HLUT;Lo;0;L;;;;;N;;;;; A1AC;YI SYLLABLE HLUX;Lo;0;L;;;;;N;;;;; A1AD;YI SYLLABLE HLU;Lo;0;L;;;;;N;;;;; A1AE;YI SYLLABLE HLUP;Lo;0;L;;;;;N;;;;; A1AF;YI SYLLABLE HLURX;Lo;0;L;;;;;N;;;;; A1B0;YI SYLLABLE HLUR;Lo;0;L;;;;;N;;;;; A1B1;YI SYLLABLE HLYT;Lo;0;L;;;;;N;;;;; A1B2;YI SYLLABLE HLYX;Lo;0;L;;;;;N;;;;; A1B3;YI SYLLABLE HLY;Lo;0;L;;;;;N;;;;; A1B4;YI SYLLABLE HLYP;Lo;0;L;;;;;N;;;;; A1B5;YI SYLLABLE HLYRX;Lo;0;L;;;;;N;;;;; A1B6;YI SYLLABLE HLYR;Lo;0;L;;;;;N;;;;; A1B7;YI SYLLABLE LIT;Lo;0;L;;;;;N;;;;; A1B8;YI SYLLABLE LIX;Lo;0;L;;;;;N;;;;; A1B9;YI SYLLABLE LI;Lo;0;L;;;;;N;;;;; A1BA;YI SYLLABLE LIP;Lo;0;L;;;;;N;;;;; A1BB;YI SYLLABLE LIET;Lo;0;L;;;;;N;;;;; A1BC;YI SYLLABLE LIEX;Lo;0;L;;;;;N;;;;; A1BD;YI SYLLABLE LIE;Lo;0;L;;;;;N;;;;; A1BE;YI SYLLABLE LIEP;Lo;0;L;;;;;N;;;;; A1BF;YI SYLLABLE LAT;Lo;0;L;;;;;N;;;;; A1C0;YI SYLLABLE LAX;Lo;0;L;;;;;N;;;;; A1C1;YI SYLLABLE LA;Lo;0;L;;;;;N;;;;; A1C2;YI SYLLABLE LAP;Lo;0;L;;;;;N;;;;; A1C3;YI SYLLABLE LUOT;Lo;0;L;;;;;N;;;;; A1C4;YI SYLLABLE LUOX;Lo;0;L;;;;;N;;;;; A1C5;YI SYLLABLE LUO;Lo;0;L;;;;;N;;;;; A1C6;YI SYLLABLE LUOP;Lo;0;L;;;;;N;;;;; A1C7;YI SYLLABLE LOT;Lo;0;L;;;;;N;;;;; A1C8;YI SYLLABLE LOX;Lo;0;L;;;;;N;;;;; A1C9;YI SYLLABLE LO;Lo;0;L;;;;;N;;;;; A1CA;YI SYLLABLE LOP;Lo;0;L;;;;;N;;;;; A1CB;YI SYLLABLE LEX;Lo;0;L;;;;;N;;;;; A1CC;YI SYLLABLE LE;Lo;0;L;;;;;N;;;;; A1CD;YI SYLLABLE LEP;Lo;0;L;;;;;N;;;;; A1CE;YI SYLLABLE LUT;Lo;0;L;;;;;N;;;;; A1CF;YI SYLLABLE LUX;Lo;0;L;;;;;N;;;;; A1D0;YI SYLLABLE LU;Lo;0;L;;;;;N;;;;; A1D1;YI SYLLABLE LUP;Lo;0;L;;;;;N;;;;; A1D2;YI SYLLABLE LURX;Lo;0;L;;;;;N;;;;; A1D3;YI SYLLABLE LUR;Lo;0;L;;;;;N;;;;; A1D4;YI SYLLABLE LYT;Lo;0;L;;;;;N;;;;; A1D5;YI SYLLABLE LYX;Lo;0;L;;;;;N;;;;; A1D6;YI SYLLABLE LY;Lo;0;L;;;;;N;;;;; A1D7;YI SYLLABLE LYP;Lo;0;L;;;;;N;;;;; A1D8;YI SYLLABLE LYRX;Lo;0;L;;;;;N;;;;; A1D9;YI SYLLABLE LYR;Lo;0;L;;;;;N;;;;; A1DA;YI SYLLABLE GIT;Lo;0;L;;;;;N;;;;; A1DB;YI SYLLABLE GIX;Lo;0;L;;;;;N;;;;; A1DC;YI SYLLABLE GI;Lo;0;L;;;;;N;;;;; A1DD;YI SYLLABLE GIP;Lo;0;L;;;;;N;;;;; A1DE;YI SYLLABLE GIET;Lo;0;L;;;;;N;;;;; A1DF;YI SYLLABLE GIEX;Lo;0;L;;;;;N;;;;; A1E0;YI SYLLABLE GIE;Lo;0;L;;;;;N;;;;; A1E1;YI SYLLABLE GIEP;Lo;0;L;;;;;N;;;;; A1E2;YI SYLLABLE GAT;Lo;0;L;;;;;N;;;;; A1E3;YI SYLLABLE GAX;Lo;0;L;;;;;N;;;;; A1E4;YI SYLLABLE GA;Lo;0;L;;;;;N;;;;; A1E5;YI SYLLABLE GAP;Lo;0;L;;;;;N;;;;; A1E6;YI SYLLABLE GUOT;Lo;0;L;;;;;N;;;;; A1E7;YI SYLLABLE GUOX;Lo;0;L;;;;;N;;;;; A1E8;YI SYLLABLE GUO;Lo;0;L;;;;;N;;;;; A1E9;YI SYLLABLE GUOP;Lo;0;L;;;;;N;;;;; A1EA;YI SYLLABLE GOT;Lo;0;L;;;;;N;;;;; A1EB;YI SYLLABLE GOX;Lo;0;L;;;;;N;;;;; A1EC;YI SYLLABLE GO;Lo;0;L;;;;;N;;;;; A1ED;YI SYLLABLE GOP;Lo;0;L;;;;;N;;;;; A1EE;YI SYLLABLE GET;Lo;0;L;;;;;N;;;;; A1EF;YI SYLLABLE GEX;Lo;0;L;;;;;N;;;;; A1F0;YI SYLLABLE GE;Lo;0;L;;;;;N;;;;; A1F1;YI SYLLABLE GEP;Lo;0;L;;;;;N;;;;; A1F2;YI SYLLABLE GUT;Lo;0;L;;;;;N;;;;; A1F3;YI SYLLABLE GUX;Lo;0;L;;;;;N;;;;; A1F4;YI SYLLABLE GU;Lo;0;L;;;;;N;;;;; A1F5;YI SYLLABLE GUP;Lo;0;L;;;;;N;;;;; A1F6;YI SYLLABLE GURX;Lo;0;L;;;;;N;;;;; A1F7;YI SYLLABLE GUR;Lo;0;L;;;;;N;;;;; A1F8;YI SYLLABLE KIT;Lo;0;L;;;;;N;;;;; A1F9;YI SYLLABLE KIX;Lo;0;L;;;;;N;;;;; A1FA;YI SYLLABLE KI;Lo;0;L;;;;;N;;;;; A1FB;YI SYLLABLE KIP;Lo;0;L;;;;;N;;;;; A1FC;YI SYLLABLE KIEX;Lo;0;L;;;;;N;;;;; A1FD;YI SYLLABLE KIE;Lo;0;L;;;;;N;;;;; A1FE;YI SYLLABLE KIEP;Lo;0;L;;;;;N;;;;; A1FF;YI SYLLABLE KAT;Lo;0;L;;;;;N;;;;; A200;YI SYLLABLE KAX;Lo;0;L;;;;;N;;;;; A201;YI SYLLABLE KA;Lo;0;L;;;;;N;;;;; A202;YI SYLLABLE KAP;Lo;0;L;;;;;N;;;;; A203;YI SYLLABLE KUOX;Lo;0;L;;;;;N;;;;; A204;YI SYLLABLE KUO;Lo;0;L;;;;;N;;;;; A205;YI SYLLABLE KUOP;Lo;0;L;;;;;N;;;;; A206;YI SYLLABLE KOT;Lo;0;L;;;;;N;;;;; A207;YI SYLLABLE KOX;Lo;0;L;;;;;N;;;;; A208;YI SYLLABLE KO;Lo;0;L;;;;;N;;;;; A209;YI SYLLABLE KOP;Lo;0;L;;;;;N;;;;; A20A;YI SYLLABLE KET;Lo;0;L;;;;;N;;;;; A20B;YI SYLLABLE KEX;Lo;0;L;;;;;N;;;;; A20C;YI SYLLABLE KE;Lo;0;L;;;;;N;;;;; A20D;YI SYLLABLE KEP;Lo;0;L;;;;;N;;;;; A20E;YI SYLLABLE KUT;Lo;0;L;;;;;N;;;;; A20F;YI SYLLABLE KUX;Lo;0;L;;;;;N;;;;; A210;YI SYLLABLE KU;Lo;0;L;;;;;N;;;;; A211;YI SYLLABLE KUP;Lo;0;L;;;;;N;;;;; A212;YI SYLLABLE KURX;Lo;0;L;;;;;N;;;;; A213;YI SYLLABLE KUR;Lo;0;L;;;;;N;;;;; A214;YI SYLLABLE GGIT;Lo;0;L;;;;;N;;;;; A215;YI SYLLABLE GGIX;Lo;0;L;;;;;N;;;;; A216;YI SYLLABLE GGI;Lo;0;L;;;;;N;;;;; A217;YI SYLLABLE GGIEX;Lo;0;L;;;;;N;;;;; A218;YI SYLLABLE GGIE;Lo;0;L;;;;;N;;;;; A219;YI SYLLABLE GGIEP;Lo;0;L;;;;;N;;;;; A21A;YI SYLLABLE GGAT;Lo;0;L;;;;;N;;;;; A21B;YI SYLLABLE GGAX;Lo;0;L;;;;;N;;;;; A21C;YI SYLLABLE GGA;Lo;0;L;;;;;N;;;;; A21D;YI SYLLABLE GGAP;Lo;0;L;;;;;N;;;;; A21E;YI SYLLABLE GGUOT;Lo;0;L;;;;;N;;;;; A21F;YI SYLLABLE GGUOX;Lo;0;L;;;;;N;;;;; A220;YI SYLLABLE GGUO;Lo;0;L;;;;;N;;;;; A221;YI SYLLABLE GGUOP;Lo;0;L;;;;;N;;;;; A222;YI SYLLABLE GGOT;Lo;0;L;;;;;N;;;;; A223;YI SYLLABLE GGOX;Lo;0;L;;;;;N;;;;; A224;YI SYLLABLE GGO;Lo;0;L;;;;;N;;;;; A225;YI SYLLABLE GGOP;Lo;0;L;;;;;N;;;;; A226;YI SYLLABLE GGET;Lo;0;L;;;;;N;;;;; A227;YI SYLLABLE GGEX;Lo;0;L;;;;;N;;;;; A228;YI SYLLABLE GGE;Lo;0;L;;;;;N;;;;; A229;YI SYLLABLE GGEP;Lo;0;L;;;;;N;;;;; A22A;YI SYLLABLE GGUT;Lo;0;L;;;;;N;;;;; A22B;YI SYLLABLE GGUX;Lo;0;L;;;;;N;;;;; A22C;YI SYLLABLE GGU;Lo;0;L;;;;;N;;;;; A22D;YI SYLLABLE GGUP;Lo;0;L;;;;;N;;;;; A22E;YI SYLLABLE GGURX;Lo;0;L;;;;;N;;;;; A22F;YI SYLLABLE GGUR;Lo;0;L;;;;;N;;;;; A230;YI SYLLABLE MGIEX;Lo;0;L;;;;;N;;;;; A231;YI SYLLABLE MGIE;Lo;0;L;;;;;N;;;;; A232;YI SYLLABLE MGAT;Lo;0;L;;;;;N;;;;; A233;YI SYLLABLE MGAX;Lo;0;L;;;;;N;;;;; A234;YI SYLLABLE MGA;Lo;0;L;;;;;N;;;;; A235;YI SYLLABLE MGAP;Lo;0;L;;;;;N;;;;; A236;YI SYLLABLE MGUOX;Lo;0;L;;;;;N;;;;; A237;YI SYLLABLE MGUO;Lo;0;L;;;;;N;;;;; A238;YI SYLLABLE MGUOP;Lo;0;L;;;;;N;;;;; A239;YI SYLLABLE MGOT;Lo;0;L;;;;;N;;;;; A23A;YI SYLLABLE MGOX;Lo;0;L;;;;;N;;;;; A23B;YI SYLLABLE MGO;Lo;0;L;;;;;N;;;;; A23C;YI SYLLABLE MGOP;Lo;0;L;;;;;N;;;;; A23D;YI SYLLABLE MGEX;Lo;0;L;;;;;N;;;;; A23E;YI SYLLABLE MGE;Lo;0;L;;;;;N;;;;; A23F;YI SYLLABLE MGEP;Lo;0;L;;;;;N;;;;; A240;YI SYLLABLE MGUT;Lo;0;L;;;;;N;;;;; A241;YI SYLLABLE MGUX;Lo;0;L;;;;;N;;;;; A242;YI SYLLABLE MGU;Lo;0;L;;;;;N;;;;; A243;YI SYLLABLE MGUP;Lo;0;L;;;;;N;;;;; A244;YI SYLLABLE MGURX;Lo;0;L;;;;;N;;;;; A245;YI SYLLABLE MGUR;Lo;0;L;;;;;N;;;;; A246;YI SYLLABLE HXIT;Lo;0;L;;;;;N;;;;; A247;YI SYLLABLE HXIX;Lo;0;L;;;;;N;;;;; A248;YI SYLLABLE HXI;Lo;0;L;;;;;N;;;;; A249;YI SYLLABLE HXIP;Lo;0;L;;;;;N;;;;; A24A;YI SYLLABLE HXIET;Lo;0;L;;;;;N;;;;; A24B;YI SYLLABLE HXIEX;Lo;0;L;;;;;N;;;;; A24C;YI SYLLABLE HXIE;Lo;0;L;;;;;N;;;;; A24D;YI SYLLABLE HXIEP;Lo;0;L;;;;;N;;;;; A24E;YI SYLLABLE HXAT;Lo;0;L;;;;;N;;;;; A24F;YI SYLLABLE HXAX;Lo;0;L;;;;;N;;;;; A250;YI SYLLABLE HXA;Lo;0;L;;;;;N;;;;; A251;YI SYLLABLE HXAP;Lo;0;L;;;;;N;;;;; A252;YI SYLLABLE HXUOT;Lo;0;L;;;;;N;;;;; A253;YI SYLLABLE HXUOX;Lo;0;L;;;;;N;;;;; A254;YI SYLLABLE HXUO;Lo;0;L;;;;;N;;;;; A255;YI SYLLABLE HXUOP;Lo;0;L;;;;;N;;;;; A256;YI SYLLABLE HXOT;Lo;0;L;;;;;N;;;;; A257;YI SYLLABLE HXOX;Lo;0;L;;;;;N;;;;; A258;YI SYLLABLE HXO;Lo;0;L;;;;;N;;;;; A259;YI SYLLABLE HXOP;Lo;0;L;;;;;N;;;;; A25A;YI SYLLABLE HXEX;Lo;0;L;;;;;N;;;;; A25B;YI SYLLABLE HXE;Lo;0;L;;;;;N;;;;; A25C;YI SYLLABLE HXEP;Lo;0;L;;;;;N;;;;; A25D;YI SYLLABLE NGIEX;Lo;0;L;;;;;N;;;;; A25E;YI SYLLABLE NGIE;Lo;0;L;;;;;N;;;;; A25F;YI SYLLABLE NGIEP;Lo;0;L;;;;;N;;;;; A260;YI SYLLABLE NGAT;Lo;0;L;;;;;N;;;;; A261;YI SYLLABLE NGAX;Lo;0;L;;;;;N;;;;; A262;YI SYLLABLE NGA;Lo;0;L;;;;;N;;;;; A263;YI SYLLABLE NGAP;Lo;0;L;;;;;N;;;;; A264;YI SYLLABLE NGUOT;Lo;0;L;;;;;N;;;;; A265;YI SYLLABLE NGUOX;Lo;0;L;;;;;N;;;;; A266;YI SYLLABLE NGUO;Lo;0;L;;;;;N;;;;; A267;YI SYLLABLE NGOT;Lo;0;L;;;;;N;;;;; A268;YI SYLLABLE NGOX;Lo;0;L;;;;;N;;;;; A269;YI SYLLABLE NGO;Lo;0;L;;;;;N;;;;; A26A;YI SYLLABLE NGOP;Lo;0;L;;;;;N;;;;; A26B;YI SYLLABLE NGEX;Lo;0;L;;;;;N;;;;; A26C;YI SYLLABLE NGE;Lo;0;L;;;;;N;;;;; A26D;YI SYLLABLE NGEP;Lo;0;L;;;;;N;;;;; A26E;YI SYLLABLE HIT;Lo;0;L;;;;;N;;;;; A26F;YI SYLLABLE HIEX;Lo;0;L;;;;;N;;;;; A270;YI SYLLABLE HIE;Lo;0;L;;;;;N;;;;; A271;YI SYLLABLE HAT;Lo;0;L;;;;;N;;;;; A272;YI SYLLABLE HAX;Lo;0;L;;;;;N;;;;; A273;YI SYLLABLE HA;Lo;0;L;;;;;N;;;;; A274;YI SYLLABLE HAP;Lo;0;L;;;;;N;;;;; A275;YI SYLLABLE HUOT;Lo;0;L;;;;;N;;;;; A276;YI SYLLABLE HUOX;Lo;0;L;;;;;N;;;;; A277;YI SYLLABLE HUO;Lo;0;L;;;;;N;;;;; A278;YI SYLLABLE HUOP;Lo;0;L;;;;;N;;;;; A279;YI SYLLABLE HOT;Lo;0;L;;;;;N;;;;; A27A;YI SYLLABLE HOX;Lo;0;L;;;;;N;;;;; A27B;YI SYLLABLE HO;Lo;0;L;;;;;N;;;;; A27C;YI SYLLABLE HOP;Lo;0;L;;;;;N;;;;; A27D;YI SYLLABLE HEX;Lo;0;L;;;;;N;;;;; A27E;YI SYLLABLE HE;Lo;0;L;;;;;N;;;;; A27F;YI SYLLABLE HEP;Lo;0;L;;;;;N;;;;; A280;YI SYLLABLE WAT;Lo;0;L;;;;;N;;;;; A281;YI SYLLABLE WAX;Lo;0;L;;;;;N;;;;; A282;YI SYLLABLE WA;Lo;0;L;;;;;N;;;;; A283;YI SYLLABLE WAP;Lo;0;L;;;;;N;;;;; A284;YI SYLLABLE WUOX;Lo;0;L;;;;;N;;;;; A285;YI SYLLABLE WUO;Lo;0;L;;;;;N;;;;; A286;YI SYLLABLE WUOP;Lo;0;L;;;;;N;;;;; A287;YI SYLLABLE WOX;Lo;0;L;;;;;N;;;;; A288;YI SYLLABLE WO;Lo;0;L;;;;;N;;;;; A289;YI SYLLABLE WOP;Lo;0;L;;;;;N;;;;; A28A;YI SYLLABLE WEX;Lo;0;L;;;;;N;;;;; A28B;YI SYLLABLE WE;Lo;0;L;;;;;N;;;;; A28C;YI SYLLABLE WEP;Lo;0;L;;;;;N;;;;; A28D;YI SYLLABLE ZIT;Lo;0;L;;;;;N;;;;; A28E;YI SYLLABLE ZIX;Lo;0;L;;;;;N;;;;; A28F;YI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; A290;YI SYLLABLE ZIP;Lo;0;L;;;;;N;;;;; A291;YI SYLLABLE ZIEX;Lo;0;L;;;;;N;;;;; A292;YI SYLLABLE ZIE;Lo;0;L;;;;;N;;;;; A293;YI SYLLABLE ZIEP;Lo;0;L;;;;;N;;;;; A294;YI SYLLABLE ZAT;Lo;0;L;;;;;N;;;;; A295;YI SYLLABLE ZAX;Lo;0;L;;;;;N;;;;; A296;YI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; A297;YI SYLLABLE ZAP;Lo;0;L;;;;;N;;;;; A298;YI SYLLABLE ZUOX;Lo;0;L;;;;;N;;;;; A299;YI SYLLABLE ZUO;Lo;0;L;;;;;N;;;;; A29A;YI SYLLABLE ZUOP;Lo;0;L;;;;;N;;;;; A29B;YI SYLLABLE ZOT;Lo;0;L;;;;;N;;;;; A29C;YI SYLLABLE ZOX;Lo;0;L;;;;;N;;;;; A29D;YI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; A29E;YI SYLLABLE ZOP;Lo;0;L;;;;;N;;;;; A29F;YI SYLLABLE ZEX;Lo;0;L;;;;;N;;;;; A2A0;YI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; A2A1;YI SYLLABLE ZEP;Lo;0;L;;;;;N;;;;; A2A2;YI SYLLABLE ZUT;Lo;0;L;;;;;N;;;;; A2A3;YI SYLLABLE ZUX;Lo;0;L;;;;;N;;;;; A2A4;YI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; A2A5;YI SYLLABLE ZUP;Lo;0;L;;;;;N;;;;; A2A6;YI SYLLABLE ZURX;Lo;0;L;;;;;N;;;;; A2A7;YI SYLLABLE ZUR;Lo;0;L;;;;;N;;;;; A2A8;YI SYLLABLE ZYT;Lo;0;L;;;;;N;;;;; A2A9;YI SYLLABLE ZYX;Lo;0;L;;;;;N;;;;; A2AA;YI SYLLABLE ZY;Lo;0;L;;;;;N;;;;; A2AB;YI SYLLABLE ZYP;Lo;0;L;;;;;N;;;;; A2AC;YI SYLLABLE ZYRX;Lo;0;L;;;;;N;;;;; A2AD;YI SYLLABLE ZYR;Lo;0;L;;;;;N;;;;; A2AE;YI SYLLABLE CIT;Lo;0;L;;;;;N;;;;; A2AF;YI SYLLABLE CIX;Lo;0;L;;;;;N;;;;; A2B0;YI SYLLABLE CI;Lo;0;L;;;;;N;;;;; A2B1;YI SYLLABLE CIP;Lo;0;L;;;;;N;;;;; A2B2;YI SYLLABLE CIET;Lo;0;L;;;;;N;;;;; A2B3;YI SYLLABLE CIEX;Lo;0;L;;;;;N;;;;; A2B4;YI SYLLABLE CIE;Lo;0;L;;;;;N;;;;; A2B5;YI SYLLABLE CIEP;Lo;0;L;;;;;N;;;;; A2B6;YI SYLLABLE CAT;Lo;0;L;;;;;N;;;;; A2B7;YI SYLLABLE CAX;Lo;0;L;;;;;N;;;;; A2B8;YI SYLLABLE CA;Lo;0;L;;;;;N;;;;; A2B9;YI SYLLABLE CAP;Lo;0;L;;;;;N;;;;; A2BA;YI SYLLABLE CUOX;Lo;0;L;;;;;N;;;;; A2BB;YI SYLLABLE CUO;Lo;0;L;;;;;N;;;;; A2BC;YI SYLLABLE CUOP;Lo;0;L;;;;;N;;;;; A2BD;YI SYLLABLE COT;Lo;0;L;;;;;N;;;;; A2BE;YI SYLLABLE COX;Lo;0;L;;;;;N;;;;; A2BF;YI SYLLABLE CO;Lo;0;L;;;;;N;;;;; A2C0;YI SYLLABLE COP;Lo;0;L;;;;;N;;;;; A2C1;YI SYLLABLE CEX;Lo;0;L;;;;;N;;;;; A2C2;YI SYLLABLE CE;Lo;0;L;;;;;N;;;;; A2C3;YI SYLLABLE CEP;Lo;0;L;;;;;N;;;;; A2C4;YI SYLLABLE CUT;Lo;0;L;;;;;N;;;;; A2C5;YI SYLLABLE CUX;Lo;0;L;;;;;N;;;;; A2C6;YI SYLLABLE CU;Lo;0;L;;;;;N;;;;; A2C7;YI SYLLABLE CUP;Lo;0;L;;;;;N;;;;; A2C8;YI SYLLABLE CURX;Lo;0;L;;;;;N;;;;; A2C9;YI SYLLABLE CUR;Lo;0;L;;;;;N;;;;; A2CA;YI SYLLABLE CYT;Lo;0;L;;;;;N;;;;; A2CB;YI SYLLABLE CYX;Lo;0;L;;;;;N;;;;; A2CC;YI SYLLABLE CY;Lo;0;L;;;;;N;;;;; A2CD;YI SYLLABLE CYP;Lo;0;L;;;;;N;;;;; A2CE;YI SYLLABLE CYRX;Lo;0;L;;;;;N;;;;; A2CF;YI SYLLABLE CYR;Lo;0;L;;;;;N;;;;; A2D0;YI SYLLABLE ZZIT;Lo;0;L;;;;;N;;;;; A2D1;YI SYLLABLE ZZIX;Lo;0;L;;;;;N;;;;; A2D2;YI SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; A2D3;YI SYLLABLE ZZIP;Lo;0;L;;;;;N;;;;; A2D4;YI SYLLABLE ZZIET;Lo;0;L;;;;;N;;;;; A2D5;YI SYLLABLE ZZIEX;Lo;0;L;;;;;N;;;;; A2D6;YI SYLLABLE ZZIE;Lo;0;L;;;;;N;;;;; A2D7;YI SYLLABLE ZZIEP;Lo;0;L;;;;;N;;;;; A2D8;YI SYLLABLE ZZAT;Lo;0;L;;;;;N;;;;; A2D9;YI SYLLABLE ZZAX;Lo;0;L;;;;;N;;;;; A2DA;YI SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; A2DB;YI SYLLABLE ZZAP;Lo;0;L;;;;;N;;;;; A2DC;YI SYLLABLE ZZOX;Lo;0;L;;;;;N;;;;; A2DD;YI SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; A2DE;YI SYLLABLE ZZOP;Lo;0;L;;;;;N;;;;; A2DF;YI SYLLABLE ZZEX;Lo;0;L;;;;;N;;;;; A2E0;YI SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; A2E1;YI SYLLABLE ZZEP;Lo;0;L;;;;;N;;;;; A2E2;YI SYLLABLE ZZUX;Lo;0;L;;;;;N;;;;; A2E3;YI SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; A2E4;YI SYLLABLE ZZUP;Lo;0;L;;;;;N;;;;; A2E5;YI SYLLABLE ZZURX;Lo;0;L;;;;;N;;;;; A2E6;YI SYLLABLE ZZUR;Lo;0;L;;;;;N;;;;; A2E7;YI SYLLABLE ZZYT;Lo;0;L;;;;;N;;;;; A2E8;YI SYLLABLE ZZYX;Lo;0;L;;;;;N;;;;; A2E9;YI SYLLABLE ZZY;Lo;0;L;;;;;N;;;;; A2EA;YI SYLLABLE ZZYP;Lo;0;L;;;;;N;;;;; A2EB;YI SYLLABLE ZZYRX;Lo;0;L;;;;;N;;;;; A2EC;YI SYLLABLE ZZYR;Lo;0;L;;;;;N;;;;; A2ED;YI SYLLABLE NZIT;Lo;0;L;;;;;N;;;;; A2EE;YI SYLLABLE NZIX;Lo;0;L;;;;;N;;;;; A2EF;YI SYLLABLE NZI;Lo;0;L;;;;;N;;;;; A2F0;YI SYLLABLE NZIP;Lo;0;L;;;;;N;;;;; A2F1;YI SYLLABLE NZIEX;Lo;0;L;;;;;N;;;;; A2F2;YI SYLLABLE NZIE;Lo;0;L;;;;;N;;;;; A2F3;YI SYLLABLE NZIEP;Lo;0;L;;;;;N;;;;; A2F4;YI SYLLABLE NZAT;Lo;0;L;;;;;N;;;;; A2F5;YI SYLLABLE NZAX;Lo;0;L;;;;;N;;;;; A2F6;YI SYLLABLE NZA;Lo;0;L;;;;;N;;;;; A2F7;YI SYLLABLE NZAP;Lo;0;L;;;;;N;;;;; A2F8;YI SYLLABLE NZUOX;Lo;0;L;;;;;N;;;;; A2F9;YI SYLLABLE NZUO;Lo;0;L;;;;;N;;;;; A2FA;YI SYLLABLE NZOX;Lo;0;L;;;;;N;;;;; A2FB;YI SYLLABLE NZOP;Lo;0;L;;;;;N;;;;; A2FC;YI SYLLABLE NZEX;Lo;0;L;;;;;N;;;;; A2FD;YI SYLLABLE NZE;Lo;0;L;;;;;N;;;;; A2FE;YI SYLLABLE NZUX;Lo;0;L;;;;;N;;;;; A2FF;YI SYLLABLE NZU;Lo;0;L;;;;;N;;;;; A300;YI SYLLABLE NZUP;Lo;0;L;;;;;N;;;;; A301;YI SYLLABLE NZURX;Lo;0;L;;;;;N;;;;; A302;YI SYLLABLE NZUR;Lo;0;L;;;;;N;;;;; A303;YI SYLLABLE NZYT;Lo;0;L;;;;;N;;;;; A304;YI SYLLABLE NZYX;Lo;0;L;;;;;N;;;;; A305;YI SYLLABLE NZY;Lo;0;L;;;;;N;;;;; A306;YI SYLLABLE NZYP;Lo;0;L;;;;;N;;;;; A307;YI SYLLABLE NZYRX;Lo;0;L;;;;;N;;;;; A308;YI SYLLABLE NZYR;Lo;0;L;;;;;N;;;;; A309;YI SYLLABLE SIT;Lo;0;L;;;;;N;;;;; A30A;YI SYLLABLE SIX;Lo;0;L;;;;;N;;;;; A30B;YI SYLLABLE SI;Lo;0;L;;;;;N;;;;; A30C;YI SYLLABLE SIP;Lo;0;L;;;;;N;;;;; A30D;YI SYLLABLE SIEX;Lo;0;L;;;;;N;;;;; A30E;YI SYLLABLE SIE;Lo;0;L;;;;;N;;;;; A30F;YI SYLLABLE SIEP;Lo;0;L;;;;;N;;;;; A310;YI SYLLABLE SAT;Lo;0;L;;;;;N;;;;; A311;YI SYLLABLE SAX;Lo;0;L;;;;;N;;;;; A312;YI SYLLABLE SA;Lo;0;L;;;;;N;;;;; A313;YI SYLLABLE SAP;Lo;0;L;;;;;N;;;;; A314;YI SYLLABLE SUOX;Lo;0;L;;;;;N;;;;; A315;YI SYLLABLE SUO;Lo;0;L;;;;;N;;;;; A316;YI SYLLABLE SUOP;Lo;0;L;;;;;N;;;;; A317;YI SYLLABLE SOT;Lo;0;L;;;;;N;;;;; A318;YI SYLLABLE SOX;Lo;0;L;;;;;N;;;;; A319;YI SYLLABLE SO;Lo;0;L;;;;;N;;;;; A31A;YI SYLLABLE SOP;Lo;0;L;;;;;N;;;;; A31B;YI SYLLABLE SEX;Lo;0;L;;;;;N;;;;; A31C;YI SYLLABLE SE;Lo;0;L;;;;;N;;;;; A31D;YI SYLLABLE SEP;Lo;0;L;;;;;N;;;;; A31E;YI SYLLABLE SUT;Lo;0;L;;;;;N;;;;; A31F;YI SYLLABLE SUX;Lo;0;L;;;;;N;;;;; A320;YI SYLLABLE SU;Lo;0;L;;;;;N;;;;; A321;YI SYLLABLE SUP;Lo;0;L;;;;;N;;;;; A322;YI SYLLABLE SURX;Lo;0;L;;;;;N;;;;; A323;YI SYLLABLE SUR;Lo;0;L;;;;;N;;;;; A324;YI SYLLABLE SYT;Lo;0;L;;;;;N;;;;; A325;YI SYLLABLE SYX;Lo;0;L;;;;;N;;;;; A326;YI SYLLABLE SY;Lo;0;L;;;;;N;;;;; A327;YI SYLLABLE SYP;Lo;0;L;;;;;N;;;;; A328;YI SYLLABLE SYRX;Lo;0;L;;;;;N;;;;; A329;YI SYLLABLE SYR;Lo;0;L;;;;;N;;;;; A32A;YI SYLLABLE SSIT;Lo;0;L;;;;;N;;;;; A32B;YI SYLLABLE SSIX;Lo;0;L;;;;;N;;;;; A32C;YI SYLLABLE SSI;Lo;0;L;;;;;N;;;;; A32D;YI SYLLABLE SSIP;Lo;0;L;;;;;N;;;;; A32E;YI SYLLABLE SSIEX;Lo;0;L;;;;;N;;;;; A32F;YI SYLLABLE SSIE;Lo;0;L;;;;;N;;;;; A330;YI SYLLABLE SSIEP;Lo;0;L;;;;;N;;;;; A331;YI SYLLABLE SSAT;Lo;0;L;;;;;N;;;;; A332;YI SYLLABLE SSAX;Lo;0;L;;;;;N;;;;; A333;YI SYLLABLE SSA;Lo;0;L;;;;;N;;;;; A334;YI SYLLABLE SSAP;Lo;0;L;;;;;N;;;;; A335;YI SYLLABLE SSOT;Lo;0;L;;;;;N;;;;; A336;YI SYLLABLE SSOX;Lo;0;L;;;;;N;;;;; A337;YI SYLLABLE SSO;Lo;0;L;;;;;N;;;;; A338;YI SYLLABLE SSOP;Lo;0;L;;;;;N;;;;; A339;YI SYLLABLE SSEX;Lo;0;L;;;;;N;;;;; A33A;YI SYLLABLE SSE;Lo;0;L;;;;;N;;;;; A33B;YI SYLLABLE SSEP;Lo;0;L;;;;;N;;;;; A33C;YI SYLLABLE SSUT;Lo;0;L;;;;;N;;;;; A33D;YI SYLLABLE SSUX;Lo;0;L;;;;;N;;;;; A33E;YI SYLLABLE SSU;Lo;0;L;;;;;N;;;;; A33F;YI SYLLABLE SSUP;Lo;0;L;;;;;N;;;;; A340;YI SYLLABLE SSYT;Lo;0;L;;;;;N;;;;; A341;YI SYLLABLE SSYX;Lo;0;L;;;;;N;;;;; A342;YI SYLLABLE SSY;Lo;0;L;;;;;N;;;;; A343;YI SYLLABLE SSYP;Lo;0;L;;;;;N;;;;; A344;YI SYLLABLE SSYRX;Lo;0;L;;;;;N;;;;; A345;YI SYLLABLE SSYR;Lo;0;L;;;;;N;;;;; A346;YI SYLLABLE ZHAT;Lo;0;L;;;;;N;;;;; A347;YI SYLLABLE ZHAX;Lo;0;L;;;;;N;;;;; A348;YI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; A349;YI SYLLABLE ZHAP;Lo;0;L;;;;;N;;;;; A34A;YI SYLLABLE ZHUOX;Lo;0;L;;;;;N;;;;; A34B;YI SYLLABLE ZHUO;Lo;0;L;;;;;N;;;;; A34C;YI SYLLABLE ZHUOP;Lo;0;L;;;;;N;;;;; A34D;YI SYLLABLE ZHOT;Lo;0;L;;;;;N;;;;; A34E;YI SYLLABLE ZHOX;Lo;0;L;;;;;N;;;;; A34F;YI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; A350;YI SYLLABLE ZHOP;Lo;0;L;;;;;N;;;;; A351;YI SYLLABLE ZHET;Lo;0;L;;;;;N;;;;; A352;YI SYLLABLE ZHEX;Lo;0;L;;;;;N;;;;; A353;YI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; A354;YI SYLLABLE ZHEP;Lo;0;L;;;;;N;;;;; A355;YI SYLLABLE ZHUT;Lo;0;L;;;;;N;;;;; A356;YI SYLLABLE ZHUX;Lo;0;L;;;;;N;;;;; A357;YI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; A358;YI SYLLABLE ZHUP;Lo;0;L;;;;;N;;;;; A359;YI SYLLABLE ZHURX;Lo;0;L;;;;;N;;;;; A35A;YI SYLLABLE ZHUR;Lo;0;L;;;;;N;;;;; A35B;YI SYLLABLE ZHYT;Lo;0;L;;;;;N;;;;; A35C;YI SYLLABLE ZHYX;Lo;0;L;;;;;N;;;;; A35D;YI SYLLABLE ZHY;Lo;0;L;;;;;N;;;;; A35E;YI SYLLABLE ZHYP;Lo;0;L;;;;;N;;;;; A35F;YI SYLLABLE ZHYRX;Lo;0;L;;;;;N;;;;; A360;YI SYLLABLE ZHYR;Lo;0;L;;;;;N;;;;; A361;YI SYLLABLE CHAT;Lo;0;L;;;;;N;;;;; A362;YI SYLLABLE CHAX;Lo;0;L;;;;;N;;;;; A363;YI SYLLABLE CHA;Lo;0;L;;;;;N;;;;; A364;YI SYLLABLE CHAP;Lo;0;L;;;;;N;;;;; A365;YI SYLLABLE CHUOT;Lo;0;L;;;;;N;;;;; A366;YI SYLLABLE CHUOX;Lo;0;L;;;;;N;;;;; A367;YI SYLLABLE CHUO;Lo;0;L;;;;;N;;;;; A368;YI SYLLABLE CHUOP;Lo;0;L;;;;;N;;;;; A369;YI SYLLABLE CHOT;Lo;0;L;;;;;N;;;;; A36A;YI SYLLABLE CHOX;Lo;0;L;;;;;N;;;;; A36B;YI SYLLABLE CHO;Lo;0;L;;;;;N;;;;; A36C;YI SYLLABLE CHOP;Lo;0;L;;;;;N;;;;; A36D;YI SYLLABLE CHET;Lo;0;L;;;;;N;;;;; A36E;YI SYLLABLE CHEX;Lo;0;L;;;;;N;;;;; A36F;YI SYLLABLE CHE;Lo;0;L;;;;;N;;;;; A370;YI SYLLABLE CHEP;Lo;0;L;;;;;N;;;;; A371;YI SYLLABLE CHUX;Lo;0;L;;;;;N;;;;; A372;YI SYLLABLE CHU;Lo;0;L;;;;;N;;;;; A373;YI SYLLABLE CHUP;Lo;0;L;;;;;N;;;;; A374;YI SYLLABLE CHURX;Lo;0;L;;;;;N;;;;; A375;YI SYLLABLE CHUR;Lo;0;L;;;;;N;;;;; A376;YI SYLLABLE CHYT;Lo;0;L;;;;;N;;;;; A377;YI SYLLABLE CHYX;Lo;0;L;;;;;N;;;;; A378;YI SYLLABLE CHY;Lo;0;L;;;;;N;;;;; A379;YI SYLLABLE CHYP;Lo;0;L;;;;;N;;;;; A37A;YI SYLLABLE CHYRX;Lo;0;L;;;;;N;;;;; A37B;YI SYLLABLE CHYR;Lo;0;L;;;;;N;;;;; A37C;YI SYLLABLE RRAX;Lo;0;L;;;;;N;;;;; A37D;YI SYLLABLE RRA;Lo;0;L;;;;;N;;;;; A37E;YI SYLLABLE RRUOX;Lo;0;L;;;;;N;;;;; A37F;YI SYLLABLE RRUO;Lo;0;L;;;;;N;;;;; A380;YI SYLLABLE RROT;Lo;0;L;;;;;N;;;;; A381;YI SYLLABLE RROX;Lo;0;L;;;;;N;;;;; A382;YI SYLLABLE RRO;Lo;0;L;;;;;N;;;;; A383;YI SYLLABLE RROP;Lo;0;L;;;;;N;;;;; A384;YI SYLLABLE RRET;Lo;0;L;;;;;N;;;;; A385;YI SYLLABLE RREX;Lo;0;L;;;;;N;;;;; A386;YI SYLLABLE RRE;Lo;0;L;;;;;N;;;;; A387;YI SYLLABLE RREP;Lo;0;L;;;;;N;;;;; A388;YI SYLLABLE RRUT;Lo;0;L;;;;;N;;;;; A389;YI SYLLABLE RRUX;Lo;0;L;;;;;N;;;;; A38A;YI SYLLABLE RRU;Lo;0;L;;;;;N;;;;; A38B;YI SYLLABLE RRUP;Lo;0;L;;;;;N;;;;; A38C;YI SYLLABLE RRURX;Lo;0;L;;;;;N;;;;; A38D;YI SYLLABLE RRUR;Lo;0;L;;;;;N;;;;; A38E;YI SYLLABLE RRYT;Lo;0;L;;;;;N;;;;; A38F;YI SYLLABLE RRYX;Lo;0;L;;;;;N;;;;; A390;YI SYLLABLE RRY;Lo;0;L;;;;;N;;;;; A391;YI SYLLABLE RRYP;Lo;0;L;;;;;N;;;;; A392;YI SYLLABLE RRYRX;Lo;0;L;;;;;N;;;;; A393;YI SYLLABLE RRYR;Lo;0;L;;;;;N;;;;; A394;YI SYLLABLE NRAT;Lo;0;L;;;;;N;;;;; A395;YI SYLLABLE NRAX;Lo;0;L;;;;;N;;;;; A396;YI SYLLABLE NRA;Lo;0;L;;;;;N;;;;; A397;YI SYLLABLE NRAP;Lo;0;L;;;;;N;;;;; A398;YI SYLLABLE NROX;Lo;0;L;;;;;N;;;;; A399;YI SYLLABLE NRO;Lo;0;L;;;;;N;;;;; A39A;YI SYLLABLE NROP;Lo;0;L;;;;;N;;;;; A39B;YI SYLLABLE NRET;Lo;0;L;;;;;N;;;;; A39C;YI SYLLABLE NREX;Lo;0;L;;;;;N;;;;; A39D;YI SYLLABLE NRE;Lo;0;L;;;;;N;;;;; A39E;YI SYLLABLE NREP;Lo;0;L;;;;;N;;;;; A39F;YI SYLLABLE NRUT;Lo;0;L;;;;;N;;;;; A3A0;YI SYLLABLE NRUX;Lo;0;L;;;;;N;;;;; A3A1;YI SYLLABLE NRU;Lo;0;L;;;;;N;;;;; A3A2;YI SYLLABLE NRUP;Lo;0;L;;;;;N;;;;; A3A3;YI SYLLABLE NRURX;Lo;0;L;;;;;N;;;;; A3A4;YI SYLLABLE NRUR;Lo;0;L;;;;;N;;;;; A3A5;YI SYLLABLE NRYT;Lo;0;L;;;;;N;;;;; A3A6;YI SYLLABLE NRYX;Lo;0;L;;;;;N;;;;; A3A7;YI SYLLABLE NRY;Lo;0;L;;;;;N;;;;; A3A8;YI SYLLABLE NRYP;Lo;0;L;;;;;N;;;;; A3A9;YI SYLLABLE NRYRX;Lo;0;L;;;;;N;;;;; A3AA;YI SYLLABLE NRYR;Lo;0;L;;;;;N;;;;; A3AB;YI SYLLABLE SHAT;Lo;0;L;;;;;N;;;;; A3AC;YI SYLLABLE SHAX;Lo;0;L;;;;;N;;;;; A3AD;YI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; A3AE;YI SYLLABLE SHAP;Lo;0;L;;;;;N;;;;; A3AF;YI SYLLABLE SHUOX;Lo;0;L;;;;;N;;;;; A3B0;YI SYLLABLE SHUO;Lo;0;L;;;;;N;;;;; A3B1;YI SYLLABLE SHUOP;Lo;0;L;;;;;N;;;;; A3B2;YI SYLLABLE SHOT;Lo;0;L;;;;;N;;;;; A3B3;YI SYLLABLE SHOX;Lo;0;L;;;;;N;;;;; A3B4;YI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; A3B5;YI SYLLABLE SHOP;Lo;0;L;;;;;N;;;;; A3B6;YI SYLLABLE SHET;Lo;0;L;;;;;N;;;;; A3B7;YI SYLLABLE SHEX;Lo;0;L;;;;;N;;;;; A3B8;YI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; A3B9;YI SYLLABLE SHEP;Lo;0;L;;;;;N;;;;; A3BA;YI SYLLABLE SHUT;Lo;0;L;;;;;N;;;;; A3BB;YI SYLLABLE SHUX;Lo;0;L;;;;;N;;;;; A3BC;YI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; A3BD;YI SYLLABLE SHUP;Lo;0;L;;;;;N;;;;; A3BE;YI SYLLABLE SHURX;Lo;0;L;;;;;N;;;;; A3BF;YI SYLLABLE SHUR;Lo;0;L;;;;;N;;;;; A3C0;YI SYLLABLE SHYT;Lo;0;L;;;;;N;;;;; A3C1;YI SYLLABLE SHYX;Lo;0;L;;;;;N;;;;; A3C2;YI SYLLABLE SHY;Lo;0;L;;;;;N;;;;; A3C3;YI SYLLABLE SHYP;Lo;0;L;;;;;N;;;;; A3C4;YI SYLLABLE SHYRX;Lo;0;L;;;;;N;;;;; A3C5;YI SYLLABLE SHYR;Lo;0;L;;;;;N;;;;; A3C6;YI SYLLABLE RAT;Lo;0;L;;;;;N;;;;; A3C7;YI SYLLABLE RAX;Lo;0;L;;;;;N;;;;; A3C8;YI SYLLABLE RA;Lo;0;L;;;;;N;;;;; A3C9;YI SYLLABLE RAP;Lo;0;L;;;;;N;;;;; A3CA;YI SYLLABLE RUOX;Lo;0;L;;;;;N;;;;; A3CB;YI SYLLABLE RUO;Lo;0;L;;;;;N;;;;; A3CC;YI SYLLABLE RUOP;Lo;0;L;;;;;N;;;;; A3CD;YI SYLLABLE ROT;Lo;0;L;;;;;N;;;;; A3CE;YI SYLLABLE ROX;Lo;0;L;;;;;N;;;;; A3CF;YI SYLLABLE RO;Lo;0;L;;;;;N;;;;; A3D0;YI SYLLABLE ROP;Lo;0;L;;;;;N;;;;; A3D1;YI SYLLABLE REX;Lo;0;L;;;;;N;;;;; A3D2;YI SYLLABLE RE;Lo;0;L;;;;;N;;;;; A3D3;YI SYLLABLE REP;Lo;0;L;;;;;N;;;;; A3D4;YI SYLLABLE RUT;Lo;0;L;;;;;N;;;;; A3D5;YI SYLLABLE RUX;Lo;0;L;;;;;N;;;;; A3D6;YI SYLLABLE RU;Lo;0;L;;;;;N;;;;; A3D7;YI SYLLABLE RUP;Lo;0;L;;;;;N;;;;; A3D8;YI SYLLABLE RURX;Lo;0;L;;;;;N;;;;; A3D9;YI SYLLABLE RUR;Lo;0;L;;;;;N;;;;; A3DA;YI SYLLABLE RYT;Lo;0;L;;;;;N;;;;; A3DB;YI SYLLABLE RYX;Lo;0;L;;;;;N;;;;; A3DC;YI SYLLABLE RY;Lo;0;L;;;;;N;;;;; A3DD;YI SYLLABLE RYP;Lo;0;L;;;;;N;;;;; A3DE;YI SYLLABLE RYRX;Lo;0;L;;;;;N;;;;; A3DF;YI SYLLABLE RYR;Lo;0;L;;;;;N;;;;; A3E0;YI SYLLABLE JIT;Lo;0;L;;;;;N;;;;; A3E1;YI SYLLABLE JIX;Lo;0;L;;;;;N;;;;; A3E2;YI SYLLABLE JI;Lo;0;L;;;;;N;;;;; A3E3;YI SYLLABLE JIP;Lo;0;L;;;;;N;;;;; A3E4;YI SYLLABLE JIET;Lo;0;L;;;;;N;;;;; A3E5;YI SYLLABLE JIEX;Lo;0;L;;;;;N;;;;; A3E6;YI SYLLABLE JIE;Lo;0;L;;;;;N;;;;; A3E7;YI SYLLABLE JIEP;Lo;0;L;;;;;N;;;;; A3E8;YI SYLLABLE JUOT;Lo;0;L;;;;;N;;;;; A3E9;YI SYLLABLE JUOX;Lo;0;L;;;;;N;;;;; A3EA;YI SYLLABLE JUO;Lo;0;L;;;;;N;;;;; A3EB;YI SYLLABLE JUOP;Lo;0;L;;;;;N;;;;; A3EC;YI SYLLABLE JOT;Lo;0;L;;;;;N;;;;; A3ED;YI SYLLABLE JOX;Lo;0;L;;;;;N;;;;; A3EE;YI SYLLABLE JO;Lo;0;L;;;;;N;;;;; A3EF;YI SYLLABLE JOP;Lo;0;L;;;;;N;;;;; A3F0;YI SYLLABLE JUT;Lo;0;L;;;;;N;;;;; A3F1;YI SYLLABLE JUX;Lo;0;L;;;;;N;;;;; A3F2;YI SYLLABLE JU;Lo;0;L;;;;;N;;;;; A3F3;YI SYLLABLE JUP;Lo;0;L;;;;;N;;;;; A3F4;YI SYLLABLE JURX;Lo;0;L;;;;;N;;;;; A3F5;YI SYLLABLE JUR;Lo;0;L;;;;;N;;;;; A3F6;YI SYLLABLE JYT;Lo;0;L;;;;;N;;;;; A3F7;YI SYLLABLE JYX;Lo;0;L;;;;;N;;;;; A3F8;YI SYLLABLE JY;Lo;0;L;;;;;N;;;;; A3F9;YI SYLLABLE JYP;Lo;0;L;;;;;N;;;;; A3FA;YI SYLLABLE JYRX;Lo;0;L;;;;;N;;;;; A3FB;YI SYLLABLE JYR;Lo;0;L;;;;;N;;;;; A3FC;YI SYLLABLE QIT;Lo;0;L;;;;;N;;;;; A3FD;YI SYLLABLE QIX;Lo;0;L;;;;;N;;;;; A3FE;YI SYLLABLE QI;Lo;0;L;;;;;N;;;;; A3FF;YI SYLLABLE QIP;Lo;0;L;;;;;N;;;;; A400;YI SYLLABLE QIET;Lo;0;L;;;;;N;;;;; A401;YI SYLLABLE QIEX;Lo;0;L;;;;;N;;;;; A402;YI SYLLABLE QIE;Lo;0;L;;;;;N;;;;; A403;YI SYLLABLE QIEP;Lo;0;L;;;;;N;;;;; A404;YI SYLLABLE QUOT;Lo;0;L;;;;;N;;;;; A405;YI SYLLABLE QUOX;Lo;0;L;;;;;N;;;;; A406;YI SYLLABLE QUO;Lo;0;L;;;;;N;;;;; A407;YI SYLLABLE QUOP;Lo;0;L;;;;;N;;;;; A408;YI SYLLABLE QOT;Lo;0;L;;;;;N;;;;; A409;YI SYLLABLE QOX;Lo;0;L;;;;;N;;;;; A40A;YI SYLLABLE QO;Lo;0;L;;;;;N;;;;; A40B;YI SYLLABLE QOP;Lo;0;L;;;;;N;;;;; A40C;YI SYLLABLE QUT;Lo;0;L;;;;;N;;;;; A40D;YI SYLLABLE QUX;Lo;0;L;;;;;N;;;;; A40E;YI SYLLABLE QU;Lo;0;L;;;;;N;;;;; A40F;YI SYLLABLE QUP;Lo;0;L;;;;;N;;;;; A410;YI SYLLABLE QURX;Lo;0;L;;;;;N;;;;; A411;YI SYLLABLE QUR;Lo;0;L;;;;;N;;;;; A412;YI SYLLABLE QYT;Lo;0;L;;;;;N;;;;; A413;YI SYLLABLE QYX;Lo;0;L;;;;;N;;;;; A414;YI SYLLABLE QY;Lo;0;L;;;;;N;;;;; A415;YI SYLLABLE QYP;Lo;0;L;;;;;N;;;;; A416;YI SYLLABLE QYRX;Lo;0;L;;;;;N;;;;; A417;YI SYLLABLE QYR;Lo;0;L;;;;;N;;;;; A418;YI SYLLABLE JJIT;Lo;0;L;;;;;N;;;;; A419;YI SYLLABLE JJIX;Lo;0;L;;;;;N;;;;; A41A;YI SYLLABLE JJI;Lo;0;L;;;;;N;;;;; A41B;YI SYLLABLE JJIP;Lo;0;L;;;;;N;;;;; A41C;YI SYLLABLE JJIET;Lo;0;L;;;;;N;;;;; A41D;YI SYLLABLE JJIEX;Lo;0;L;;;;;N;;;;; A41E;YI SYLLABLE JJIE;Lo;0;L;;;;;N;;;;; A41F;YI SYLLABLE JJIEP;Lo;0;L;;;;;N;;;;; A420;YI SYLLABLE JJUOX;Lo;0;L;;;;;N;;;;; A421;YI SYLLABLE JJUO;Lo;0;L;;;;;N;;;;; A422;YI SYLLABLE JJUOP;Lo;0;L;;;;;N;;;;; A423;YI SYLLABLE JJOT;Lo;0;L;;;;;N;;;;; A424;YI SYLLABLE JJOX;Lo;0;L;;;;;N;;;;; A425;YI SYLLABLE JJO;Lo;0;L;;;;;N;;;;; A426;YI SYLLABLE JJOP;Lo;0;L;;;;;N;;;;; A427;YI SYLLABLE JJUT;Lo;0;L;;;;;N;;;;; A428;YI SYLLABLE JJUX;Lo;0;L;;;;;N;;;;; A429;YI SYLLABLE JJU;Lo;0;L;;;;;N;;;;; A42A;YI SYLLABLE JJUP;Lo;0;L;;;;;N;;;;; A42B;YI SYLLABLE JJURX;Lo;0;L;;;;;N;;;;; A42C;YI SYLLABLE JJUR;Lo;0;L;;;;;N;;;;; A42D;YI SYLLABLE JJYT;Lo;0;L;;;;;N;;;;; A42E;YI SYLLABLE JJYX;Lo;0;L;;;;;N;;;;; A42F;YI SYLLABLE JJY;Lo;0;L;;;;;N;;;;; A430;YI SYLLABLE JJYP;Lo;0;L;;;;;N;;;;; A431;YI SYLLABLE NJIT;Lo;0;L;;;;;N;;;;; A432;YI SYLLABLE NJIX;Lo;0;L;;;;;N;;;;; A433;YI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; A434;YI SYLLABLE NJIP;Lo;0;L;;;;;N;;;;; A435;YI SYLLABLE NJIET;Lo;0;L;;;;;N;;;;; A436;YI SYLLABLE NJIEX;Lo;0;L;;;;;N;;;;; A437;YI SYLLABLE NJIE;Lo;0;L;;;;;N;;;;; A438;YI SYLLABLE NJIEP;Lo;0;L;;;;;N;;;;; A439;YI SYLLABLE NJUOX;Lo;0;L;;;;;N;;;;; A43A;YI SYLLABLE NJUO;Lo;0;L;;;;;N;;;;; A43B;YI SYLLABLE NJOT;Lo;0;L;;;;;N;;;;; A43C;YI SYLLABLE NJOX;Lo;0;L;;;;;N;;;;; A43D;YI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; A43E;YI SYLLABLE NJOP;Lo;0;L;;;;;N;;;;; A43F;YI SYLLABLE NJUX;Lo;0;L;;;;;N;;;;; A440;YI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; A441;YI SYLLABLE NJUP;Lo;0;L;;;;;N;;;;; A442;YI SYLLABLE NJURX;Lo;0;L;;;;;N;;;;; A443;YI SYLLABLE NJUR;Lo;0;L;;;;;N;;;;; A444;YI SYLLABLE NJYT;Lo;0;L;;;;;N;;;;; A445;YI SYLLABLE NJYX;Lo;0;L;;;;;N;;;;; A446;YI SYLLABLE NJY;Lo;0;L;;;;;N;;;;; A447;YI SYLLABLE NJYP;Lo;0;L;;;;;N;;;;; A448;YI SYLLABLE NJYRX;Lo;0;L;;;;;N;;;;; A449;YI SYLLABLE NJYR;Lo;0;L;;;;;N;;;;; A44A;YI SYLLABLE NYIT;Lo;0;L;;;;;N;;;;; A44B;YI SYLLABLE NYIX;Lo;0;L;;;;;N;;;;; A44C;YI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; A44D;YI SYLLABLE NYIP;Lo;0;L;;;;;N;;;;; A44E;YI SYLLABLE NYIET;Lo;0;L;;;;;N;;;;; A44F;YI SYLLABLE NYIEX;Lo;0;L;;;;;N;;;;; A450;YI SYLLABLE NYIE;Lo;0;L;;;;;N;;;;; A451;YI SYLLABLE NYIEP;Lo;0;L;;;;;N;;;;; A452;YI SYLLABLE NYUOX;Lo;0;L;;;;;N;;;;; A453;YI SYLLABLE NYUO;Lo;0;L;;;;;N;;;;; A454;YI SYLLABLE NYUOP;Lo;0;L;;;;;N;;;;; A455;YI SYLLABLE NYOT;Lo;0;L;;;;;N;;;;; A456;YI SYLLABLE NYOX;Lo;0;L;;;;;N;;;;; A457;YI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; A458;YI SYLLABLE NYOP;Lo;0;L;;;;;N;;;;; A459;YI SYLLABLE NYUT;Lo;0;L;;;;;N;;;;; A45A;YI SYLLABLE NYUX;Lo;0;L;;;;;N;;;;; A45B;YI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; A45C;YI SYLLABLE NYUP;Lo;0;L;;;;;N;;;;; A45D;YI SYLLABLE XIT;Lo;0;L;;;;;N;;;;; A45E;YI SYLLABLE XIX;Lo;0;L;;;;;N;;;;; A45F;YI SYLLABLE XI;Lo;0;L;;;;;N;;;;; A460;YI SYLLABLE XIP;Lo;0;L;;;;;N;;;;; A461;YI SYLLABLE XIET;Lo;0;L;;;;;N;;;;; A462;YI SYLLABLE XIEX;Lo;0;L;;;;;N;;;;; A463;YI SYLLABLE XIE;Lo;0;L;;;;;N;;;;; A464;YI SYLLABLE XIEP;Lo;0;L;;;;;N;;;;; A465;YI SYLLABLE XUOX;Lo;0;L;;;;;N;;;;; A466;YI SYLLABLE XUO;Lo;0;L;;;;;N;;;;; A467;YI SYLLABLE XOT;Lo;0;L;;;;;N;;;;; A468;YI SYLLABLE XOX;Lo;0;L;;;;;N;;;;; A469;YI SYLLABLE XO;Lo;0;L;;;;;N;;;;; A46A;YI SYLLABLE XOP;Lo;0;L;;;;;N;;;;; A46B;YI SYLLABLE XYT;Lo;0;L;;;;;N;;;;; A46C;YI SYLLABLE XYX;Lo;0;L;;;;;N;;;;; A46D;YI SYLLABLE XY;Lo;0;L;;;;;N;;;;; A46E;YI SYLLABLE XYP;Lo;0;L;;;;;N;;;;; A46F;YI SYLLABLE XYRX;Lo;0;L;;;;;N;;;;; A470;YI SYLLABLE XYR;Lo;0;L;;;;;N;;;;; A471;YI SYLLABLE YIT;Lo;0;L;;;;;N;;;;; A472;YI SYLLABLE YIX;Lo;0;L;;;;;N;;;;; A473;YI SYLLABLE YI;Lo;0;L;;;;;N;;;;; A474;YI SYLLABLE YIP;Lo;0;L;;;;;N;;;;; A475;YI SYLLABLE YIET;Lo;0;L;;;;;N;;;;; A476;YI SYLLABLE YIEX;Lo;0;L;;;;;N;;;;; A477;YI SYLLABLE YIE;Lo;0;L;;;;;N;;;;; A478;YI SYLLABLE YIEP;Lo;0;L;;;;;N;;;;; A479;YI SYLLABLE YUOT;Lo;0;L;;;;;N;;;;; A47A;YI SYLLABLE YUOX;Lo;0;L;;;;;N;;;;; A47B;YI SYLLABLE YUO;Lo;0;L;;;;;N;;;;; A47C;YI SYLLABLE YUOP;Lo;0;L;;;;;N;;;;; A47D;YI SYLLABLE YOT;Lo;0;L;;;;;N;;;;; A47E;YI SYLLABLE YOX;Lo;0;L;;;;;N;;;;; A47F;YI SYLLABLE YO;Lo;0;L;;;;;N;;;;; A480;YI SYLLABLE YOP;Lo;0;L;;;;;N;;;;; A481;YI SYLLABLE YUT;Lo;0;L;;;;;N;;;;; A482;YI SYLLABLE YUX;Lo;0;L;;;;;N;;;;; A483;YI SYLLABLE YU;Lo;0;L;;;;;N;;;;; A484;YI SYLLABLE YUP;Lo;0;L;;;;;N;;;;; A485;YI SYLLABLE YURX;Lo;0;L;;;;;N;;;;; A486;YI SYLLABLE YUR;Lo;0;L;;;;;N;;;;; A487;YI SYLLABLE YYT;Lo;0;L;;;;;N;;;;; A488;YI SYLLABLE YYX;Lo;0;L;;;;;N;;;;; A489;YI SYLLABLE YY;Lo;0;L;;;;;N;;;;; A48A;YI SYLLABLE YYP;Lo;0;L;;;;;N;;;;; A48B;YI SYLLABLE YYRX;Lo;0;L;;;;;N;;;;; A48C;YI SYLLABLE YYR;Lo;0;L;;;;;N;;;;; A490;YI RADICAL QOT;So;0;ON;;;;;N;;;;; A491;YI RADICAL LI;So;0;ON;;;;;N;;;;; A492;YI RADICAL KIT;So;0;ON;;;;;N;;;;; A493;YI RADICAL NYIP;So;0;ON;;;;;N;;;;; A494;YI RADICAL CYP;So;0;ON;;;;;N;;;;; A495;YI RADICAL SSI;So;0;ON;;;;;N;;;;; A496;YI RADICAL GGOP;So;0;ON;;;;;N;;;;; A497;YI RADICAL GEP;So;0;ON;;;;;N;;;;; A498;YI RADICAL MI;So;0;ON;;;;;N;;;;; A499;YI RADICAL HXIT;So;0;ON;;;;;N;;;;; A49A;YI RADICAL LYR;So;0;ON;;;;;N;;;;; A49B;YI RADICAL BBUT;So;0;ON;;;;;N;;;;; A49C;YI RADICAL MOP;So;0;ON;;;;;N;;;;; A49D;YI RADICAL YO;So;0;ON;;;;;N;;;;; A49E;YI RADICAL PUT;So;0;ON;;;;;N;;;;; A49F;YI RADICAL HXUO;So;0;ON;;;;;N;;;;; A4A0;YI RADICAL TAT;So;0;ON;;;;;N;;;;; A4A1;YI RADICAL GA;So;0;ON;;;;;N;;;;; A4A2;YI RADICAL ZUP;So;0;ON;;;;;N;;;;; A4A3;YI RADICAL CYT;So;0;ON;;;;;N;;;;; A4A4;YI RADICAL DDUR;So;0;ON;;;;;N;;;;; A4A5;YI RADICAL BUR;So;0;ON;;;;;N;;;;; A4A6;YI RADICAL GGUO;So;0;ON;;;;;N;;;;; A4A7;YI RADICAL NYOP;So;0;ON;;;;;N;;;;; A4A8;YI RADICAL TU;So;0;ON;;;;;N;;;;; A4A9;YI RADICAL OP;So;0;ON;;;;;N;;;;; A4AA;YI RADICAL JJUT;So;0;ON;;;;;N;;;;; A4AB;YI RADICAL ZOT;So;0;ON;;;;;N;;;;; A4AC;YI RADICAL PYT;So;0;ON;;;;;N;;;;; A4AD;YI RADICAL HMO;So;0;ON;;;;;N;;;;; A4AE;YI RADICAL YIT;So;0;ON;;;;;N;;;;; A4AF;YI RADICAL VUR;So;0;ON;;;;;N;;;;; A4B0;YI RADICAL SHY;So;0;ON;;;;;N;;;;; A4B1;YI RADICAL VEP;So;0;ON;;;;;N;;;;; A4B2;YI RADICAL ZA;So;0;ON;;;;;N;;;;; A4B3;YI RADICAL JO;So;0;ON;;;;;N;;;;; A4B4;YI RADICAL NZUP;So;0;ON;;;;;N;;;;; A4B5;YI RADICAL JJY;So;0;ON;;;;;N;;;;; A4B6;YI RADICAL GOT;So;0;ON;;;;;N;;;;; A4B7;YI RADICAL JJIE;So;0;ON;;;;;N;;;;; A4B8;YI RADICAL WO;So;0;ON;;;;;N;;;;; A4B9;YI RADICAL DU;So;0;ON;;;;;N;;;;; A4BA;YI RADICAL SHUR;So;0;ON;;;;;N;;;;; A4BB;YI RADICAL LIE;So;0;ON;;;;;N;;;;; A4BC;YI RADICAL CY;So;0;ON;;;;;N;;;;; A4BD;YI RADICAL CUOP;So;0;ON;;;;;N;;;;; A4BE;YI RADICAL CIP;So;0;ON;;;;;N;;;;; A4BF;YI RADICAL HXOP;So;0;ON;;;;;N;;;;; A4C0;YI RADICAL SHAT;So;0;ON;;;;;N;;;;; A4C1;YI RADICAL ZUR;So;0;ON;;;;;N;;;;; A4C2;YI RADICAL SHOP;So;0;ON;;;;;N;;;;; A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;; A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;; A4C5;YI RADICAL NBIE;So;0;ON;;;;;N;;;;; A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;; A4D0;LISU LETTER BA;Lo;0;L;;;;;N;;;;; A4D1;LISU LETTER PA;Lo;0;L;;;;;N;;;;; A4D2;LISU LETTER PHA;Lo;0;L;;;;;N;;;;; A4D3;LISU LETTER DA;Lo;0;L;;;;;N;;;;; A4D4;LISU LETTER TA;Lo;0;L;;;;;N;;;;; A4D5;LISU LETTER THA;Lo;0;L;;;;;N;;;;; A4D6;LISU LETTER GA;Lo;0;L;;;;;N;;;;; A4D7;LISU LETTER KA;Lo;0;L;;;;;N;;;;; A4D8;LISU LETTER KHA;Lo;0;L;;;;;N;;;;; A4D9;LISU LETTER JA;Lo;0;L;;;;;N;;;;; A4DA;LISU LETTER CA;Lo;0;L;;;;;N;;;;; A4DB;LISU LETTER CHA;Lo;0;L;;;;;N;;;;; A4DC;LISU LETTER DZA;Lo;0;L;;;;;N;;;;; A4DD;LISU LETTER TSA;Lo;0;L;;;;;N;;;;; A4DE;LISU LETTER TSHA;Lo;0;L;;;;;N;;;;; A4DF;LISU LETTER MA;Lo;0;L;;;;;N;;;;; A4E0;LISU LETTER NA;Lo;0;L;;;;;N;;;;; A4E1;LISU LETTER LA;Lo;0;L;;;;;N;;;;; A4E2;LISU LETTER SA;Lo;0;L;;;;;N;;;;; A4E3;LISU LETTER ZHA;Lo;0;L;;;;;N;;;;; A4E4;LISU LETTER ZA;Lo;0;L;;;;;N;;;;; A4E5;LISU LETTER NGA;Lo;0;L;;;;;N;;;;; A4E6;LISU LETTER HA;Lo;0;L;;;;;N;;;;; A4E7;LISU LETTER XA;Lo;0;L;;;;;N;;;;; A4E8;LISU LETTER HHA;Lo;0;L;;;;;N;;;;; A4E9;LISU LETTER FA;Lo;0;L;;;;;N;;;;; A4EA;LISU LETTER WA;Lo;0;L;;;;;N;;;;; A4EB;LISU LETTER SHA;Lo;0;L;;;;;N;;;;; A4EC;LISU LETTER YA;Lo;0;L;;;;;N;;;;; A4ED;LISU LETTER GHA;Lo;0;L;;;;;N;;;;; A4EE;LISU LETTER A;Lo;0;L;;;;;N;;;;; A4EF;LISU LETTER AE;Lo;0;L;;;;;N;;;;; A4F0;LISU LETTER E;Lo;0;L;;;;;N;;;;; A4F1;LISU LETTER EU;Lo;0;L;;;;;N;;;;; A4F2;LISU LETTER I;Lo;0;L;;;;;N;;;;; A4F3;LISU LETTER O;Lo;0;L;;;;;N;;;;; A4F4;LISU LETTER U;Lo;0;L;;;;;N;;;;; A4F5;LISU LETTER UE;Lo;0;L;;;;;N;;;;; A4F6;LISU LETTER UH;Lo;0;L;;;;;N;;;;; A4F7;LISU LETTER OE;Lo;0;L;;;;;N;;;;; A4F8;LISU LETTER TONE MYA TI;Lm;0;L;;;;;N;;;;; A4F9;LISU LETTER TONE NA PO;Lm;0;L;;;;;N;;;;; A4FA;LISU LETTER TONE MYA CYA;Lm;0;L;;;;;N;;;;; A4FB;LISU LETTER TONE MYA BO;Lm;0;L;;;;;N;;;;; A4FC;LISU LETTER TONE MYA NA;Lm;0;L;;;;;N;;;;; A4FD;LISU LETTER TONE MYA JEU;Lm;0;L;;;;;N;;;;; A4FE;LISU PUNCTUATION COMMA;Po;0;L;;;;;N;;;;; A4FF;LISU PUNCTUATION FULL STOP;Po;0;L;;;;;N;;;;; A500;VAI SYLLABLE EE;Lo;0;L;;;;;N;;;;; A501;VAI SYLLABLE EEN;Lo;0;L;;;;;N;;;;; A502;VAI SYLLABLE HEE;Lo;0;L;;;;;N;;;;; A503;VAI SYLLABLE WEE;Lo;0;L;;;;;N;;;;; A504;VAI SYLLABLE WEEN;Lo;0;L;;;;;N;;;;; A505;VAI SYLLABLE PEE;Lo;0;L;;;;;N;;;;; A506;VAI SYLLABLE BHEE;Lo;0;L;;;;;N;;;;; A507;VAI SYLLABLE BEE;Lo;0;L;;;;;N;;;;; A508;VAI SYLLABLE MBEE;Lo;0;L;;;;;N;;;;; A509;VAI SYLLABLE KPEE;Lo;0;L;;;;;N;;;;; A50A;VAI SYLLABLE MGBEE;Lo;0;L;;;;;N;;;;; A50B;VAI SYLLABLE GBEE;Lo;0;L;;;;;N;;;;; A50C;VAI SYLLABLE FEE;Lo;0;L;;;;;N;;;;; A50D;VAI SYLLABLE VEE;Lo;0;L;;;;;N;;;;; A50E;VAI SYLLABLE TEE;Lo;0;L;;;;;N;;;;; A50F;VAI SYLLABLE THEE;Lo;0;L;;;;;N;;;;; A510;VAI SYLLABLE DHEE;Lo;0;L;;;;;N;;;;; A511;VAI SYLLABLE DHHEE;Lo;0;L;;;;;N;;;;; A512;VAI SYLLABLE LEE;Lo;0;L;;;;;N;;;;; A513;VAI SYLLABLE REE;Lo;0;L;;;;;N;;;;; A514;VAI SYLLABLE DEE;Lo;0;L;;;;;N;;;;; A515;VAI SYLLABLE NDEE;Lo;0;L;;;;;N;;;;; A516;VAI SYLLABLE SEE;Lo;0;L;;;;;N;;;;; A517;VAI SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; A518;VAI SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; A519;VAI SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; A51A;VAI SYLLABLE CEE;Lo;0;L;;;;;N;;;;; A51B;VAI SYLLABLE JEE;Lo;0;L;;;;;N;;;;; A51C;VAI SYLLABLE NJEE;Lo;0;L;;;;;N;;;;; A51D;VAI SYLLABLE YEE;Lo;0;L;;;;;N;;;;; A51E;VAI SYLLABLE KEE;Lo;0;L;;;;;N;;;;; A51F;VAI SYLLABLE NGGEE;Lo;0;L;;;;;N;;;;; A520;VAI SYLLABLE GEE;Lo;0;L;;;;;N;;;;; A521;VAI SYLLABLE MEE;Lo;0;L;;;;;N;;;;; A522;VAI SYLLABLE NEE;Lo;0;L;;;;;N;;;;; A523;VAI SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; A524;VAI SYLLABLE I;Lo;0;L;;;;;N;;;;; A525;VAI SYLLABLE IN;Lo;0;L;;;;;N;;;;; A526;VAI SYLLABLE HI;Lo;0;L;;;;;N;;;;; A527;VAI SYLLABLE HIN;Lo;0;L;;;;;N;;;;; A528;VAI SYLLABLE WI;Lo;0;L;;;;;N;;;;; A529;VAI SYLLABLE WIN;Lo;0;L;;;;;N;;;;; A52A;VAI SYLLABLE PI;Lo;0;L;;;;;N;;;;; A52B;VAI SYLLABLE BHI;Lo;0;L;;;;;N;;;;; A52C;VAI SYLLABLE BI;Lo;0;L;;;;;N;;;;; A52D;VAI SYLLABLE MBI;Lo;0;L;;;;;N;;;;; A52E;VAI SYLLABLE KPI;Lo;0;L;;;;;N;;;;; A52F;VAI SYLLABLE MGBI;Lo;0;L;;;;;N;;;;; A530;VAI SYLLABLE GBI;Lo;0;L;;;;;N;;;;; A531;VAI SYLLABLE FI;Lo;0;L;;;;;N;;;;; A532;VAI SYLLABLE VI;Lo;0;L;;;;;N;;;;; A533;VAI SYLLABLE TI;Lo;0;L;;;;;N;;;;; A534;VAI SYLLABLE THI;Lo;0;L;;;;;N;;;;; A535;VAI SYLLABLE DHI;Lo;0;L;;;;;N;;;;; A536;VAI SYLLABLE DHHI;Lo;0;L;;;;;N;;;;; A537;VAI SYLLABLE LI;Lo;0;L;;;;;N;;;;; A538;VAI SYLLABLE RI;Lo;0;L;;;;;N;;;;; A539;VAI SYLLABLE DI;Lo;0;L;;;;;N;;;;; A53A;VAI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; A53B;VAI SYLLABLE SI;Lo;0;L;;;;;N;;;;; A53C;VAI SYLLABLE SHI;Lo;0;L;;;;;N;;;;; A53D;VAI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; A53E;VAI SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; A53F;VAI SYLLABLE CI;Lo;0;L;;;;;N;;;;; A540;VAI SYLLABLE JI;Lo;0;L;;;;;N;;;;; A541;VAI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; A542;VAI SYLLABLE YI;Lo;0;L;;;;;N;;;;; A543;VAI SYLLABLE KI;Lo;0;L;;;;;N;;;;; A544;VAI SYLLABLE NGGI;Lo;0;L;;;;;N;;;;; A545;VAI SYLLABLE GI;Lo;0;L;;;;;N;;;;; A546;VAI SYLLABLE MI;Lo;0;L;;;;;N;;;;; A547;VAI SYLLABLE NI;Lo;0;L;;;;;N;;;;; A548;VAI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; A549;VAI SYLLABLE A;Lo;0;L;;;;;N;;;;; A54A;VAI SYLLABLE AN;Lo;0;L;;;;;N;;;;; A54B;VAI SYLLABLE NGAN;Lo;0;L;;;;;N;;;;; A54C;VAI SYLLABLE HA;Lo;0;L;;;;;N;;;;; A54D;VAI SYLLABLE HAN;Lo;0;L;;;;;N;;;;; A54E;VAI SYLLABLE WA;Lo;0;L;;;;;N;;;;; A54F;VAI SYLLABLE WAN;Lo;0;L;;;;;N;;;;; A550;VAI SYLLABLE PA;Lo;0;L;;;;;N;;;;; A551;VAI SYLLABLE BHA;Lo;0;L;;;;;N;;;;; A552;VAI SYLLABLE BA;Lo;0;L;;;;;N;;;;; A553;VAI SYLLABLE MBA;Lo;0;L;;;;;N;;;;; A554;VAI SYLLABLE KPA;Lo;0;L;;;;;N;;;;; A555;VAI SYLLABLE KPAN;Lo;0;L;;;;;N;;;;; A556;VAI SYLLABLE MGBA;Lo;0;L;;;;;N;;;;; A557;VAI SYLLABLE GBA;Lo;0;L;;;;;N;;;;; A558;VAI SYLLABLE FA;Lo;0;L;;;;;N;;;;; A559;VAI SYLLABLE VA;Lo;0;L;;;;;N;;;;; A55A;VAI SYLLABLE TA;Lo;0;L;;;;;N;;;;; A55B;VAI SYLLABLE THA;Lo;0;L;;;;;N;;;;; A55C;VAI SYLLABLE DHA;Lo;0;L;;;;;N;;;;; A55D;VAI SYLLABLE DHHA;Lo;0;L;;;;;N;;;;; A55E;VAI SYLLABLE LA;Lo;0;L;;;;;N;;;;; A55F;VAI SYLLABLE RA;Lo;0;L;;;;;N;;;;; A560;VAI SYLLABLE DA;Lo;0;L;;;;;N;;;;; A561;VAI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; A562;VAI SYLLABLE SA;Lo;0;L;;;;;N;;;;; A563;VAI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; A564;VAI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; A565;VAI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; A566;VAI SYLLABLE CA;Lo;0;L;;;;;N;;;;; A567;VAI SYLLABLE JA;Lo;0;L;;;;;N;;;;; A568;VAI SYLLABLE NJA;Lo;0;L;;;;;N;;;;; A569;VAI SYLLABLE YA;Lo;0;L;;;;;N;;;;; A56A;VAI SYLLABLE KA;Lo;0;L;;;;;N;;;;; A56B;VAI SYLLABLE KAN;Lo;0;L;;;;;N;;;;; A56C;VAI SYLLABLE NGGA;Lo;0;L;;;;;N;;;;; A56D;VAI SYLLABLE GA;Lo;0;L;;;;;N;;;;; A56E;VAI SYLLABLE MA;Lo;0;L;;;;;N;;;;; A56F;VAI SYLLABLE NA;Lo;0;L;;;;;N;;;;; A570;VAI SYLLABLE NYA;Lo;0;L;;;;;N;;;;; A571;VAI SYLLABLE OO;Lo;0;L;;;;;N;;;;; A572;VAI SYLLABLE OON;Lo;0;L;;;;;N;;;;; A573;VAI SYLLABLE HOO;Lo;0;L;;;;;N;;;;; A574;VAI SYLLABLE WOO;Lo;0;L;;;;;N;;;;; A575;VAI SYLLABLE WOON;Lo;0;L;;;;;N;;;;; A576;VAI SYLLABLE POO;Lo;0;L;;;;;N;;;;; A577;VAI SYLLABLE BHOO;Lo;0;L;;;;;N;;;;; A578;VAI SYLLABLE BOO;Lo;0;L;;;;;N;;;;; A579;VAI SYLLABLE MBOO;Lo;0;L;;;;;N;;;;; A57A;VAI SYLLABLE KPOO;Lo;0;L;;;;;N;;;;; A57B;VAI SYLLABLE MGBOO;Lo;0;L;;;;;N;;;;; A57C;VAI SYLLABLE GBOO;Lo;0;L;;;;;N;;;;; A57D;VAI SYLLABLE FOO;Lo;0;L;;;;;N;;;;; A57E;VAI SYLLABLE VOO;Lo;0;L;;;;;N;;;;; A57F;VAI SYLLABLE TOO;Lo;0;L;;;;;N;;;;; A580;VAI SYLLABLE THOO;Lo;0;L;;;;;N;;;;; A581;VAI SYLLABLE DHOO;Lo;0;L;;;;;N;;;;; A582;VAI SYLLABLE DHHOO;Lo;0;L;;;;;N;;;;; A583;VAI SYLLABLE LOO;Lo;0;L;;;;;N;;;;; A584;VAI SYLLABLE ROO;Lo;0;L;;;;;N;;;;; A585;VAI SYLLABLE DOO;Lo;0;L;;;;;N;;;;; A586;VAI SYLLABLE NDOO;Lo;0;L;;;;;N;;;;; A587;VAI SYLLABLE SOO;Lo;0;L;;;;;N;;;;; A588;VAI SYLLABLE SHOO;Lo;0;L;;;;;N;;;;; A589;VAI SYLLABLE ZOO;Lo;0;L;;;;;N;;;;; A58A;VAI SYLLABLE ZHOO;Lo;0;L;;;;;N;;;;; A58B;VAI SYLLABLE COO;Lo;0;L;;;;;N;;;;; A58C;VAI SYLLABLE JOO;Lo;0;L;;;;;N;;;;; A58D;VAI SYLLABLE NJOO;Lo;0;L;;;;;N;;;;; A58E;VAI SYLLABLE YOO;Lo;0;L;;;;;N;;;;; A58F;VAI SYLLABLE KOO;Lo;0;L;;;;;N;;;;; A590;VAI SYLLABLE NGGOO;Lo;0;L;;;;;N;;;;; A591;VAI SYLLABLE GOO;Lo;0;L;;;;;N;;;;; A592;VAI SYLLABLE MOO;Lo;0;L;;;;;N;;;;; A593;VAI SYLLABLE NOO;Lo;0;L;;;;;N;;;;; A594;VAI SYLLABLE NYOO;Lo;0;L;;;;;N;;;;; A595;VAI SYLLABLE U;Lo;0;L;;;;;N;;;;; A596;VAI SYLLABLE UN;Lo;0;L;;;;;N;;;;; A597;VAI SYLLABLE HU;Lo;0;L;;;;;N;;;;; A598;VAI SYLLABLE HUN;Lo;0;L;;;;;N;;;;; A599;VAI SYLLABLE WU;Lo;0;L;;;;;N;;;;; A59A;VAI SYLLABLE WUN;Lo;0;L;;;;;N;;;;; A59B;VAI SYLLABLE PU;Lo;0;L;;;;;N;;;;; A59C;VAI SYLLABLE BHU;Lo;0;L;;;;;N;;;;; A59D;VAI SYLLABLE BU;Lo;0;L;;;;;N;;;;; A59E;VAI SYLLABLE MBU;Lo;0;L;;;;;N;;;;; A59F;VAI SYLLABLE KPU;Lo;0;L;;;;;N;;;;; A5A0;VAI SYLLABLE MGBU;Lo;0;L;;;;;N;;;;; A5A1;VAI SYLLABLE GBU;Lo;0;L;;;;;N;;;;; A5A2;VAI SYLLABLE FU;Lo;0;L;;;;;N;;;;; A5A3;VAI SYLLABLE VU;Lo;0;L;;;;;N;;;;; A5A4;VAI SYLLABLE TU;Lo;0;L;;;;;N;;;;; A5A5;VAI SYLLABLE THU;Lo;0;L;;;;;N;;;;; A5A6;VAI SYLLABLE DHU;Lo;0;L;;;;;N;;;;; A5A7;VAI SYLLABLE DHHU;Lo;0;L;;;;;N;;;;; A5A8;VAI SYLLABLE LU;Lo;0;L;;;;;N;;;;; A5A9;VAI SYLLABLE RU;Lo;0;L;;;;;N;;;;; A5AA;VAI SYLLABLE DU;Lo;0;L;;;;;N;;;;; A5AB;VAI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; A5AC;VAI SYLLABLE SU;Lo;0;L;;;;;N;;;;; A5AD;VAI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; A5AE;VAI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; A5AF;VAI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; A5B0;VAI SYLLABLE CU;Lo;0;L;;;;;N;;;;; A5B1;VAI SYLLABLE JU;Lo;0;L;;;;;N;;;;; A5B2;VAI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; A5B3;VAI SYLLABLE YU;Lo;0;L;;;;;N;;;;; A5B4;VAI SYLLABLE KU;Lo;0;L;;;;;N;;;;; A5B5;VAI SYLLABLE NGGU;Lo;0;L;;;;;N;;;;; A5B6;VAI SYLLABLE GU;Lo;0;L;;;;;N;;;;; A5B7;VAI SYLLABLE MU;Lo;0;L;;;;;N;;;;; A5B8;VAI SYLLABLE NU;Lo;0;L;;;;;N;;;;; A5B9;VAI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; A5BA;VAI SYLLABLE O;Lo;0;L;;;;;N;;;;; A5BB;VAI SYLLABLE ON;Lo;0;L;;;;;N;;;;; A5BC;VAI SYLLABLE NGON;Lo;0;L;;;;;N;;;;; A5BD;VAI SYLLABLE HO;Lo;0;L;;;;;N;;;;; A5BE;VAI SYLLABLE HON;Lo;0;L;;;;;N;;;;; A5BF;VAI SYLLABLE WO;Lo;0;L;;;;;N;;;;; A5C0;VAI SYLLABLE WON;Lo;0;L;;;;;N;;;;; A5C1;VAI SYLLABLE PO;Lo;0;L;;;;;N;;;;; A5C2;VAI SYLLABLE BHO;Lo;0;L;;;;;N;;;;; A5C3;VAI SYLLABLE BO;Lo;0;L;;;;;N;;;;; A5C4;VAI SYLLABLE MBO;Lo;0;L;;;;;N;;;;; A5C5;VAI SYLLABLE KPO;Lo;0;L;;;;;N;;;;; A5C6;VAI SYLLABLE MGBO;Lo;0;L;;;;;N;;;;; A5C7;VAI SYLLABLE GBO;Lo;0;L;;;;;N;;;;; A5C8;VAI SYLLABLE GBON;Lo;0;L;;;;;N;;;;; A5C9;VAI SYLLABLE FO;Lo;0;L;;;;;N;;;;; A5CA;VAI SYLLABLE VO;Lo;0;L;;;;;N;;;;; A5CB;VAI SYLLABLE TO;Lo;0;L;;;;;N;;;;; A5CC;VAI SYLLABLE THO;Lo;0;L;;;;;N;;;;; A5CD;VAI SYLLABLE DHO;Lo;0;L;;;;;N;;;;; A5CE;VAI SYLLABLE DHHO;Lo;0;L;;;;;N;;;;; A5CF;VAI SYLLABLE LO;Lo;0;L;;;;;N;;;;; A5D0;VAI SYLLABLE RO;Lo;0;L;;;;;N;;;;; A5D1;VAI SYLLABLE DO;Lo;0;L;;;;;N;;;;; A5D2;VAI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; A5D3;VAI SYLLABLE SO;Lo;0;L;;;;;N;;;;; A5D4;VAI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; A5D5;VAI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; A5D6;VAI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; A5D7;VAI SYLLABLE CO;Lo;0;L;;;;;N;;;;; A5D8;VAI SYLLABLE JO;Lo;0;L;;;;;N;;;;; A5D9;VAI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; A5DA;VAI SYLLABLE YO;Lo;0;L;;;;;N;;;;; A5DB;VAI SYLLABLE KO;Lo;0;L;;;;;N;;;;; A5DC;VAI SYLLABLE NGGO;Lo;0;L;;;;;N;;;;; A5DD;VAI SYLLABLE GO;Lo;0;L;;;;;N;;;;; A5DE;VAI SYLLABLE MO;Lo;0;L;;;;;N;;;;; A5DF;VAI SYLLABLE NO;Lo;0;L;;;;;N;;;;; A5E0;VAI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; A5E1;VAI SYLLABLE E;Lo;0;L;;;;;N;;;;; A5E2;VAI SYLLABLE EN;Lo;0;L;;;;;N;;;;; A5E3;VAI SYLLABLE NGEN;Lo;0;L;;;;;N;;;;; A5E4;VAI SYLLABLE HE;Lo;0;L;;;;;N;;;;; A5E5;VAI SYLLABLE HEN;Lo;0;L;;;;;N;;;;; A5E6;VAI SYLLABLE WE;Lo;0;L;;;;;N;;;;; A5E7;VAI SYLLABLE WEN;Lo;0;L;;;;;N;;;;; A5E8;VAI SYLLABLE PE;Lo;0;L;;;;;N;;;;; A5E9;VAI SYLLABLE BHE;Lo;0;L;;;;;N;;;;; A5EA;VAI SYLLABLE BE;Lo;0;L;;;;;N;;;;; A5EB;VAI SYLLABLE MBE;Lo;0;L;;;;;N;;;;; A5EC;VAI SYLLABLE KPE;Lo;0;L;;;;;N;;;;; A5ED;VAI SYLLABLE KPEN;Lo;0;L;;;;;N;;;;; A5EE;VAI SYLLABLE MGBE;Lo;0;L;;;;;N;;;;; A5EF;VAI SYLLABLE GBE;Lo;0;L;;;;;N;;;;; A5F0;VAI SYLLABLE GBEN;Lo;0;L;;;;;N;;;;; A5F1;VAI SYLLABLE FE;Lo;0;L;;;;;N;;;;; A5F2;VAI SYLLABLE VE;Lo;0;L;;;;;N;;;;; A5F3;VAI SYLLABLE TE;Lo;0;L;;;;;N;;;;; A5F4;VAI SYLLABLE THE;Lo;0;L;;;;;N;;;;; A5F5;VAI SYLLABLE DHE;Lo;0;L;;;;;N;;;;; A5F6;VAI SYLLABLE DHHE;Lo;0;L;;;;;N;;;;; A5F7;VAI SYLLABLE LE;Lo;0;L;;;;;N;;;;; A5F8;VAI SYLLABLE RE;Lo;0;L;;;;;N;;;;; A5F9;VAI SYLLABLE DE;Lo;0;L;;;;;N;;;;; A5FA;VAI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; A5FB;VAI SYLLABLE SE;Lo;0;L;;;;;N;;;;; A5FC;VAI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; A5FD;VAI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; A5FE;VAI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; A5FF;VAI SYLLABLE CE;Lo;0;L;;;;;N;;;;; A600;VAI SYLLABLE JE;Lo;0;L;;;;;N;;;;; A601;VAI SYLLABLE NJE;Lo;0;L;;;;;N;;;;; A602;VAI SYLLABLE YE;Lo;0;L;;;;;N;;;;; A603;VAI SYLLABLE KE;Lo;0;L;;;;;N;;;;; A604;VAI SYLLABLE NGGE;Lo;0;L;;;;;N;;;;; A605;VAI SYLLABLE NGGEN;Lo;0;L;;;;;N;;;;; A606;VAI SYLLABLE GE;Lo;0;L;;;;;N;;;;; A607;VAI SYLLABLE GEN;Lo;0;L;;;;;N;;;;; A608;VAI SYLLABLE ME;Lo;0;L;;;;;N;;;;; A609;VAI SYLLABLE NE;Lo;0;L;;;;;N;;;;; A60A;VAI SYLLABLE NYE;Lo;0;L;;;;;N;;;;; A60B;VAI SYLLABLE NG;Lo;0;L;;;;;N;;;;; A60C;VAI SYLLABLE LENGTHENER;Lm;0;L;;;;;N;;;;; A60D;VAI COMMA;Po;0;ON;;;;;N;;;;; A60E;VAI FULL STOP;Po;0;ON;;;;;N;;;;; A60F;VAI QUESTION MARK;Po;0;ON;;;;;N;;;;; A610;VAI SYLLABLE NDOLE FA;Lo;0;L;;;;;N;;;;; A611;VAI SYLLABLE NDOLE KA;Lo;0;L;;;;;N;;;;; A612;VAI SYLLABLE NDOLE SOO;Lo;0;L;;;;;N;;;;; A613;VAI SYMBOL FEENG;Lo;0;L;;;;;N;;;;; A614;VAI SYMBOL KEENG;Lo;0;L;;;;;N;;;;; A615;VAI SYMBOL TING;Lo;0;L;;;;;N;;;;; A616;VAI SYMBOL NII;Lo;0;L;;;;;N;;;;; A617;VAI SYMBOL BANG;Lo;0;L;;;;;N;;;;; A618;VAI SYMBOL FAA;Lo;0;L;;;;;N;;;;; A619;VAI SYMBOL TAA;Lo;0;L;;;;;N;;;;; A61A;VAI SYMBOL DANG;Lo;0;L;;;;;N;;;;; A61B;VAI SYMBOL DOONG;Lo;0;L;;;;;N;;;;; A61C;VAI SYMBOL KUNG;Lo;0;L;;;;;N;;;;; A61D;VAI SYMBOL TONG;Lo;0;L;;;;;N;;;;; A61E;VAI SYMBOL DO-O;Lo;0;L;;;;;N;;;;; A61F;VAI SYMBOL JONG;Lo;0;L;;;;;N;;;;; A620;VAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; A621;VAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; A622;VAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; A623;VAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; A624;VAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; A625;VAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; A626;VAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; A627;VAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; A628;VAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; A629;VAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; A62A;VAI SYLLABLE NDOLE MA;Lo;0;L;;;;;N;;;;; A62B;VAI SYLLABLE NDOLE DO;Lo;0;L;;;;;N;;;;; A640;CYRILLIC CAPITAL LETTER ZEMLYA;Lu;0;L;;;;;N;;;;A641; A641;CYRILLIC SMALL LETTER ZEMLYA;Ll;0;L;;;;;N;;;A640;;A640 A642;CYRILLIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;A643; A643;CYRILLIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;A642;;A642 A644;CYRILLIC CAPITAL LETTER REVERSED DZE;Lu;0;L;;;;;N;;;;A645; A645;CYRILLIC SMALL LETTER REVERSED DZE;Ll;0;L;;;;;N;;;A644;;A644 A646;CYRILLIC CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;A647; A647;CYRILLIC SMALL LETTER IOTA;Ll;0;L;;;;;N;;;A646;;A646 A648;CYRILLIC CAPITAL LETTER DJERV;Lu;0;L;;;;;N;;;;A649; A649;CYRILLIC SMALL LETTER DJERV;Ll;0;L;;;;;N;;;A648;;A648 A64A;CYRILLIC CAPITAL LETTER MONOGRAPH UK;Lu;0;L;;;;;N;;;;A64B; A64B;CYRILLIC SMALL LETTER MONOGRAPH UK;Ll;0;L;;;;;N;;;A64A;;A64A A64C;CYRILLIC CAPITAL LETTER BROAD OMEGA;Lu;0;L;;;;;N;;;;A64D; A64D;CYRILLIC SMALL LETTER BROAD OMEGA;Ll;0;L;;;;;N;;;A64C;;A64C A64E;CYRILLIC CAPITAL LETTER NEUTRAL YER;Lu;0;L;;;;;N;;;;A64F; A64F;CYRILLIC SMALL LETTER NEUTRAL YER;Ll;0;L;;;;;N;;;A64E;;A64E A650;CYRILLIC CAPITAL LETTER YERU WITH BACK YER;Lu;0;L;;;;;N;;;;A651; A651;CYRILLIC SMALL LETTER YERU WITH BACK YER;Ll;0;L;;;;;N;;;A650;;A650 A652;CYRILLIC CAPITAL LETTER IOTIFIED YAT;Lu;0;L;;;;;N;;;;A653; A653;CYRILLIC SMALL LETTER IOTIFIED YAT;Ll;0;L;;;;;N;;;A652;;A652 A654;CYRILLIC CAPITAL LETTER REVERSED YU;Lu;0;L;;;;;N;;;;A655; A655;CYRILLIC SMALL LETTER REVERSED YU;Ll;0;L;;;;;N;;;A654;;A654 A656;CYRILLIC CAPITAL LETTER IOTIFIED A;Lu;0;L;;;;;N;;;;A657; A657;CYRILLIC SMALL LETTER IOTIFIED A;Ll;0;L;;;;;N;;;A656;;A656 A658;CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A659; A659;CYRILLIC SMALL LETTER CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A658;;A658 A65A;CYRILLIC CAPITAL LETTER BLENDED YUS;Lu;0;L;;;;;N;;;;A65B; A65B;CYRILLIC SMALL LETTER BLENDED YUS;Ll;0;L;;;;;N;;;A65A;;A65A A65C;CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A65D; A65D;CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A65C;;A65C A65E;CYRILLIC CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;A65F; A65F;CYRILLIC SMALL LETTER YN;Ll;0;L;;;;;N;;;A65E;;A65E A660;CYRILLIC CAPITAL LETTER REVERSED TSE;Lu;0;L;;;;;N;;;;A661; A661;CYRILLIC SMALL LETTER REVERSED TSE;Ll;0;L;;;;;N;;;A660;;A660 A662;CYRILLIC CAPITAL LETTER SOFT DE;Lu;0;L;;;;;N;;;;A663; A663;CYRILLIC SMALL LETTER SOFT DE;Ll;0;L;;;;;N;;;A662;;A662 A664;CYRILLIC CAPITAL LETTER SOFT EL;Lu;0;L;;;;;N;;;;A665; A665;CYRILLIC SMALL LETTER SOFT EL;Ll;0;L;;;;;N;;;A664;;A664 A666;CYRILLIC CAPITAL LETTER SOFT EM;Lu;0;L;;;;;N;;;;A667; A667;CYRILLIC SMALL LETTER SOFT EM;Ll;0;L;;;;;N;;;A666;;A666 A668;CYRILLIC CAPITAL LETTER MONOCULAR O;Lu;0;L;;;;;N;;;;A669; A669;CYRILLIC SMALL LETTER MONOCULAR O;Ll;0;L;;;;;N;;;A668;;A668 A66A;CYRILLIC CAPITAL LETTER BINOCULAR O;Lu;0;L;;;;;N;;;;A66B; A66B;CYRILLIC SMALL LETTER BINOCULAR O;Ll;0;L;;;;;N;;;A66A;;A66A A66C;CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O;Lu;0;L;;;;;N;;;;A66D; A66D;CYRILLIC SMALL LETTER DOUBLE MONOCULAR O;Ll;0;L;;;;;N;;;A66C;;A66C A66E;CYRILLIC LETTER MULTIOCULAR O;Lo;0;L;;;;;N;;;;; A66F;COMBINING CYRILLIC VZMET;Mn;230;NSM;;;;;N;;;;; A670;COMBINING CYRILLIC TEN MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; A671;COMBINING CYRILLIC HUNDRED MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; A672;COMBINING CYRILLIC THOUSAND MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; A673;SLAVONIC ASTERISK;Po;0;ON;;;;;N;;;;; A674;COMBINING CYRILLIC LETTER UKRAINIAN IE;Mn;230;NSM;;;;;N;;;;; A675;COMBINING CYRILLIC LETTER I;Mn;230;NSM;;;;;N;;;;; A676;COMBINING CYRILLIC LETTER YI;Mn;230;NSM;;;;;N;;;;; A677;COMBINING CYRILLIC LETTER U;Mn;230;NSM;;;;;N;;;;; A678;COMBINING CYRILLIC LETTER HARD SIGN;Mn;230;NSM;;;;;N;;;;; A679;COMBINING CYRILLIC LETTER YERU;Mn;230;NSM;;;;;N;;;;; A67A;COMBINING CYRILLIC LETTER SOFT SIGN;Mn;230;NSM;;;;;N;;;;; A67B;COMBINING CYRILLIC LETTER OMEGA;Mn;230;NSM;;;;;N;;;;; A67C;COMBINING CYRILLIC KAVYKA;Mn;230;NSM;;;;;N;;;;; A67D;COMBINING CYRILLIC PAYEROK;Mn;230;NSM;;;;;N;;;;; A67E;CYRILLIC KAVYKA;Po;0;ON;;;;;N;;;;; A67F;CYRILLIC PAYEROK;Lm;0;ON;;;;;N;;;;; A680;CYRILLIC CAPITAL LETTER DWE;Lu;0;L;;;;;N;;;;A681; A681;CYRILLIC SMALL LETTER DWE;Ll;0;L;;;;;N;;;A680;;A680 A682;CYRILLIC CAPITAL LETTER DZWE;Lu;0;L;;;;;N;;;;A683; A683;CYRILLIC SMALL LETTER DZWE;Ll;0;L;;;;;N;;;A682;;A682 A684;CYRILLIC CAPITAL LETTER ZHWE;Lu;0;L;;;;;N;;;;A685; A685;CYRILLIC SMALL LETTER ZHWE;Ll;0;L;;;;;N;;;A684;;A684 A686;CYRILLIC CAPITAL LETTER CCHE;Lu;0;L;;;;;N;;;;A687; A687;CYRILLIC SMALL LETTER CCHE;Ll;0;L;;;;;N;;;A686;;A686 A688;CYRILLIC CAPITAL LETTER DZZE;Lu;0;L;;;;;N;;;;A689; A689;CYRILLIC SMALL LETTER DZZE;Ll;0;L;;;;;N;;;A688;;A688 A68A;CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;A68B; A68B;CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;A68A;;A68A A68C;CYRILLIC CAPITAL LETTER TWE;Lu;0;L;;;;;N;;;;A68D; A68D;CYRILLIC SMALL LETTER TWE;Ll;0;L;;;;;N;;;A68C;;A68C A68E;CYRILLIC CAPITAL LETTER TSWE;Lu;0;L;;;;;N;;;;A68F; A68F;CYRILLIC SMALL LETTER TSWE;Ll;0;L;;;;;N;;;A68E;;A68E A690;CYRILLIC CAPITAL LETTER TSSE;Lu;0;L;;;;;N;;;;A691; A691;CYRILLIC SMALL LETTER TSSE;Ll;0;L;;;;;N;;;A690;;A690 A692;CYRILLIC CAPITAL LETTER TCHE;Lu;0;L;;;;;N;;;;A693; A693;CYRILLIC SMALL LETTER TCHE;Ll;0;L;;;;;N;;;A692;;A692 A694;CYRILLIC CAPITAL LETTER HWE;Lu;0;L;;;;;N;;;;A695; A695;CYRILLIC SMALL LETTER HWE;Ll;0;L;;;;;N;;;A694;;A694 A696;CYRILLIC CAPITAL LETTER SHWE;Lu;0;L;;;;;N;;;;A697; A697;CYRILLIC SMALL LETTER SHWE;Ll;0;L;;;;;N;;;A696;;A696 A698;CYRILLIC CAPITAL LETTER DOUBLE O;Lu;0;L;;;;;N;;;;A699; A699;CYRILLIC SMALL LETTER DOUBLE O;Ll;0;L;;;;;N;;;A698;;A698 A69A;CYRILLIC CAPITAL LETTER CROSSED O;Lu;0;L;;;;;N;;;;A69B; A69B;CYRILLIC SMALL LETTER CROSSED O;Ll;0;L;;;;;N;;;A69A;;A69A A69C;MODIFIER LETTER CYRILLIC HARD SIGN;Lm;0;L;<super> 044A;;;;N;;;;; A69D;MODIFIER LETTER CYRILLIC SOFT SIGN;Lm;0;L;<super> 044C;;;;N;;;;; A69E;COMBINING CYRILLIC LETTER EF;Mn;230;NSM;;;;;N;;;;; A69F;COMBINING CYRILLIC LETTER IOTIFIED E;Mn;230;NSM;;;;;N;;;;; A6A0;BAMUM LETTER A;Lo;0;L;;;;;N;;;;; A6A1;BAMUM LETTER KA;Lo;0;L;;;;;N;;;;; A6A2;BAMUM LETTER U;Lo;0;L;;;;;N;;;;; A6A3;BAMUM LETTER KU;Lo;0;L;;;;;N;;;;; A6A4;BAMUM LETTER EE;Lo;0;L;;;;;N;;;;; A6A5;BAMUM LETTER REE;Lo;0;L;;;;;N;;;;; A6A6;BAMUM LETTER TAE;Lo;0;L;;;;;N;;;;; A6A7;BAMUM LETTER O;Lo;0;L;;;;;N;;;;; A6A8;BAMUM LETTER NYI;Lo;0;L;;;;;N;;;;; A6A9;BAMUM LETTER I;Lo;0;L;;;;;N;;;;; A6AA;BAMUM LETTER LA;Lo;0;L;;;;;N;;;;; A6AB;BAMUM LETTER PA;Lo;0;L;;;;;N;;;;; A6AC;BAMUM LETTER RII;Lo;0;L;;;;;N;;;;; A6AD;BAMUM LETTER RIEE;Lo;0;L;;;;;N;;;;; A6AE;BAMUM LETTER LEEEE;Lo;0;L;;;;;N;;;;; A6AF;BAMUM LETTER MEEEE;Lo;0;L;;;;;N;;;;; A6B0;BAMUM LETTER TAA;Lo;0;L;;;;;N;;;;; A6B1;BAMUM LETTER NDAA;Lo;0;L;;;;;N;;;;; A6B2;BAMUM LETTER NJAEM;Lo;0;L;;;;;N;;;;; A6B3;BAMUM LETTER M;Lo;0;L;;;;;N;;;;; A6B4;BAMUM LETTER SUU;Lo;0;L;;;;;N;;;;; A6B5;BAMUM LETTER MU;Lo;0;L;;;;;N;;;;; A6B6;BAMUM LETTER SHII;Lo;0;L;;;;;N;;;;; A6B7;BAMUM LETTER SI;Lo;0;L;;;;;N;;;;; A6B8;BAMUM LETTER SHEUX;Lo;0;L;;;;;N;;;;; A6B9;BAMUM LETTER SEUX;Lo;0;L;;;;;N;;;;; A6BA;BAMUM LETTER KYEE;Lo;0;L;;;;;N;;;;; A6BB;BAMUM LETTER KET;Lo;0;L;;;;;N;;;;; A6BC;BAMUM LETTER NUAE;Lo;0;L;;;;;N;;;;; A6BD;BAMUM LETTER NU;Lo;0;L;;;;;N;;;;; A6BE;BAMUM LETTER NJUAE;Lo;0;L;;;;;N;;;;; A6BF;BAMUM LETTER YOQ;Lo;0;L;;;;;N;;;;; A6C0;BAMUM LETTER SHU;Lo;0;L;;;;;N;;;;; A6C1;BAMUM LETTER YUQ;Lo;0;L;;;;;N;;;;; A6C2;BAMUM LETTER YA;Lo;0;L;;;;;N;;;;; A6C3;BAMUM LETTER NSHA;Lo;0;L;;;;;N;;;;; A6C4;BAMUM LETTER KEUX;Lo;0;L;;;;;N;;;;; A6C5;BAMUM LETTER PEUX;Lo;0;L;;;;;N;;;;; A6C6;BAMUM LETTER NJEE;Lo;0;L;;;;;N;;;;; A6C7;BAMUM LETTER NTEE;Lo;0;L;;;;;N;;;;; A6C8;BAMUM LETTER PUE;Lo;0;L;;;;;N;;;;; A6C9;BAMUM LETTER WUE;Lo;0;L;;;;;N;;;;; A6CA;BAMUM LETTER PEE;Lo;0;L;;;;;N;;;;; A6CB;BAMUM LETTER FEE;Lo;0;L;;;;;N;;;;; A6CC;BAMUM LETTER RU;Lo;0;L;;;;;N;;;;; A6CD;BAMUM LETTER LU;Lo;0;L;;;;;N;;;;; A6CE;BAMUM LETTER MI;Lo;0;L;;;;;N;;;;; A6CF;BAMUM LETTER NI;Lo;0;L;;;;;N;;;;; A6D0;BAMUM LETTER REUX;Lo;0;L;;;;;N;;;;; A6D1;BAMUM LETTER RAE;Lo;0;L;;;;;N;;;;; A6D2;BAMUM LETTER KEN;Lo;0;L;;;;;N;;;;; A6D3;BAMUM LETTER NGKWAEN;Lo;0;L;;;;;N;;;;; A6D4;BAMUM LETTER NGGA;Lo;0;L;;;;;N;;;;; A6D5;BAMUM LETTER NGA;Lo;0;L;;;;;N;;;;; A6D6;BAMUM LETTER SHO;Lo;0;L;;;;;N;;;;; A6D7;BAMUM LETTER PUAE;Lo;0;L;;;;;N;;;;; A6D8;BAMUM LETTER FU;Lo;0;L;;;;;N;;;;; A6D9;BAMUM LETTER FOM;Lo;0;L;;;;;N;;;;; A6DA;BAMUM LETTER WA;Lo;0;L;;;;;N;;;;; A6DB;BAMUM LETTER NA;Lo;0;L;;;;;N;;;;; A6DC;BAMUM LETTER LI;Lo;0;L;;;;;N;;;;; A6DD;BAMUM LETTER PI;Lo;0;L;;;;;N;;;;; A6DE;BAMUM LETTER LOQ;Lo;0;L;;;;;N;;;;; A6DF;BAMUM LETTER KO;Lo;0;L;;;;;N;;;;; A6E0;BAMUM LETTER MBEN;Lo;0;L;;;;;N;;;;; A6E1;BAMUM LETTER REN;Lo;0;L;;;;;N;;;;; A6E2;BAMUM LETTER MEN;Lo;0;L;;;;;N;;;;; A6E3;BAMUM LETTER MA;Lo;0;L;;;;;N;;;;; A6E4;BAMUM LETTER TI;Lo;0;L;;;;;N;;;;; A6E5;BAMUM LETTER KI;Lo;0;L;;;;;N;;;;; A6E6;BAMUM LETTER MO;Nl;0;L;;;;1;N;;;;; A6E7;BAMUM LETTER MBAA;Nl;0;L;;;;2;N;;;;; A6E8;BAMUM LETTER TET;Nl;0;L;;;;3;N;;;;; A6E9;BAMUM LETTER KPA;Nl;0;L;;;;4;N;;;;; A6EA;BAMUM LETTER TEN;Nl;0;L;;;;5;N;;;;; A6EB;BAMUM LETTER NTUU;Nl;0;L;;;;6;N;;;;; A6EC;BAMUM LETTER SAMBA;Nl;0;L;;;;7;N;;;;; A6ED;BAMUM LETTER FAAMAE;Nl;0;L;;;;8;N;;;;; A6EE;BAMUM LETTER KOVUU;Nl;0;L;;;;9;N;;;;; A6EF;BAMUM LETTER KOGHOM;Nl;0;L;;;;0;N;;;;; A6F0;BAMUM COMBINING MARK KOQNDON;Mn;230;NSM;;;;;N;;;;; A6F1;BAMUM COMBINING MARK TUKWENTIS;Mn;230;NSM;;;;;N;;;;; A6F2;BAMUM NJAEMLI;Po;0;L;;;;;N;;;;; A6F3;BAMUM FULL STOP;Po;0;L;;;;;N;;;;; A6F4;BAMUM COLON;Po;0;L;;;;;N;;;;; A6F5;BAMUM COMMA;Po;0;L;;;;;N;;;;; A6F6;BAMUM SEMICOLON;Po;0;L;;;;;N;;;;; A6F7;BAMUM QUESTION MARK;Po;0;L;;;;;N;;;;; A700;MODIFIER LETTER CHINESE TONE YIN PING;Sk;0;ON;;;;;N;;;;; A701;MODIFIER LETTER CHINESE TONE YANG PING;Sk;0;ON;;;;;N;;;;; A702;MODIFIER LETTER CHINESE TONE YIN SHANG;Sk;0;ON;;;;;N;;;;; A703;MODIFIER LETTER CHINESE TONE YANG SHANG;Sk;0;ON;;;;;N;;;;; A704;MODIFIER LETTER CHINESE TONE YIN QU;Sk;0;ON;;;;;N;;;;; A705;MODIFIER LETTER CHINESE TONE YANG QU;Sk;0;ON;;;;;N;;;;; A706;MODIFIER LETTER CHINESE TONE YIN RU;Sk;0;ON;;;;;N;;;;; A707;MODIFIER LETTER CHINESE TONE YANG RU;Sk;0;ON;;;;;N;;;;; A708;MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; A709;MODIFIER LETTER HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; A70A;MODIFIER LETTER MID DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; A70B;MODIFIER LETTER LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; A70C;MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; A70D;MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; A70E;MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; A70F;MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; A710;MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; A711;MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; A712;MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; A713;MODIFIER LETTER HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; A714;MODIFIER LETTER MID LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; A715;MODIFIER LETTER LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; A716;MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; A717;MODIFIER LETTER DOT VERTICAL BAR;Lm;0;ON;;;;;N;;;;; A718;MODIFIER LETTER DOT SLASH;Lm;0;ON;;;;;N;;;;; A719;MODIFIER LETTER DOT HORIZONTAL BAR;Lm;0;ON;;;;;N;;;;; A71A;MODIFIER LETTER LOWER RIGHT CORNER ANGLE;Lm;0;ON;;;;;N;;;;; A71B;MODIFIER LETTER RAISED UP ARROW;Lm;0;ON;;;;;N;;;;; A71C;MODIFIER LETTER RAISED DOWN ARROW;Lm;0;ON;;;;;N;;;;; A71D;MODIFIER LETTER RAISED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; A71E;MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; A71F;MODIFIER LETTER LOW INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; A720;MODIFIER LETTER STRESS AND HIGH TONE;Sk;0;ON;;;;;N;;;;; A721;MODIFIER LETTER STRESS AND LOW TONE;Sk;0;ON;;;;;N;;;;; A722;LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF;Lu;0;L;;;;;N;;;;A723; A723;LATIN SMALL LETTER EGYPTOLOGICAL ALEF;Ll;0;L;;;;;N;;;A722;;A722 A724;LATIN CAPITAL LETTER EGYPTOLOGICAL AIN;Lu;0;L;;;;;N;;;;A725; A725;LATIN SMALL LETTER EGYPTOLOGICAL AIN;Ll;0;L;;;;;N;;;A724;;A724 A726;LATIN CAPITAL LETTER HENG;Lu;0;L;;;;;N;;;;A727; A727;LATIN SMALL LETTER HENG;Ll;0;L;;;;;N;;;A726;;A726 A728;LATIN CAPITAL LETTER TZ;Lu;0;L;;;;;N;;;;A729; A729;LATIN SMALL LETTER TZ;Ll;0;L;;;;;N;;;A728;;A728 A72A;LATIN CAPITAL LETTER TRESILLO;Lu;0;L;;;;;N;;;;A72B; A72B;LATIN SMALL LETTER TRESILLO;Ll;0;L;;;;;N;;;A72A;;A72A A72C;LATIN CAPITAL LETTER CUATRILLO;Lu;0;L;;;;;N;;;;A72D; A72D;LATIN SMALL LETTER CUATRILLO;Ll;0;L;;;;;N;;;A72C;;A72C A72E;LATIN CAPITAL LETTER CUATRILLO WITH COMMA;Lu;0;L;;;;;N;;;;A72F; A72F;LATIN SMALL LETTER CUATRILLO WITH COMMA;Ll;0;L;;;;;N;;;A72E;;A72E A730;LATIN LETTER SMALL CAPITAL F;Ll;0;L;;;;;N;;;;; A731;LATIN LETTER SMALL CAPITAL S;Ll;0;L;;;;;N;;;;; A732;LATIN CAPITAL LETTER AA;Lu;0;L;;;;;N;;;;A733; A733;LATIN SMALL LETTER AA;Ll;0;L;;;;;N;;;A732;;A732 A734;LATIN CAPITAL LETTER AO;Lu;0;L;;;;;N;;;;A735; A735;LATIN SMALL LETTER AO;Ll;0;L;;;;;N;;;A734;;A734 A736;LATIN CAPITAL LETTER AU;Lu;0;L;;;;;N;;;;A737; A737;LATIN SMALL LETTER AU;Ll;0;L;;;;;N;;;A736;;A736 A738;LATIN CAPITAL LETTER AV;Lu;0;L;;;;;N;;;;A739; A739;LATIN SMALL LETTER AV;Ll;0;L;;;;;N;;;A738;;A738 A73A;LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR;Lu;0;L;;;;;N;;;;A73B; A73B;LATIN SMALL LETTER AV WITH HORIZONTAL BAR;Ll;0;L;;;;;N;;;A73A;;A73A A73C;LATIN CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;A73D; A73D;LATIN SMALL LETTER AY;Ll;0;L;;;;;N;;;A73C;;A73C A73E;LATIN CAPITAL LETTER REVERSED C WITH DOT;Lu;0;L;;;;;N;;;;A73F; A73F;LATIN SMALL LETTER REVERSED C WITH DOT;Ll;0;L;;;;;N;;;A73E;;A73E A740;LATIN CAPITAL LETTER K WITH STROKE;Lu;0;L;;;;;N;;;;A741; A741;LATIN SMALL LETTER K WITH STROKE;Ll;0;L;;;;;N;;;A740;;A740 A742;LATIN CAPITAL LETTER K WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A743; A743;LATIN SMALL LETTER K WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A742;;A742 A744;LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A745; A745;LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE;Ll;0;L;;;;;N;;;A744;;A744 A746;LATIN CAPITAL LETTER BROKEN L;Lu;0;L;;;;;N;;;;A747; A747;LATIN SMALL LETTER BROKEN L;Ll;0;L;;;;;N;;;A746;;A746 A748;LATIN CAPITAL LETTER L WITH HIGH STROKE;Lu;0;L;;;;;N;;;;A749; A749;LATIN SMALL LETTER L WITH HIGH STROKE;Ll;0;L;;;;;N;;;A748;;A748 A74A;LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY;Lu;0;L;;;;;N;;;;A74B; A74B;LATIN SMALL LETTER O WITH LONG STROKE OVERLAY;Ll;0;L;;;;;N;;;A74A;;A74A A74C;LATIN CAPITAL LETTER O WITH LOOP;Lu;0;L;;;;;N;;;;A74D; A74D;LATIN SMALL LETTER O WITH LOOP;Ll;0;L;;;;;N;;;A74C;;A74C A74E;LATIN CAPITAL LETTER OO;Lu;0;L;;;;;N;;;;A74F; A74F;LATIN SMALL LETTER OO;Ll;0;L;;;;;N;;;A74E;;A74E A750;LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A751; A751;LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A750;;A750 A752;LATIN CAPITAL LETTER P WITH FLOURISH;Lu;0;L;;;;;N;;;;A753; A753;LATIN SMALL LETTER P WITH FLOURISH;Ll;0;L;;;;;N;;;A752;;A752 A754;LATIN CAPITAL LETTER P WITH SQUIRREL TAIL;Lu;0;L;;;;;N;;;;A755; A755;LATIN SMALL LETTER P WITH SQUIRREL TAIL;Ll;0;L;;;;;N;;;A754;;A754 A756;LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A757; A757;LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A756;;A756 A758;LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A759; A759;LATIN SMALL LETTER Q WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A758;;A758 A75A;LATIN CAPITAL LETTER R ROTUNDA;Lu;0;L;;;;;N;;;;A75B; A75B;LATIN SMALL LETTER R ROTUNDA;Ll;0;L;;;;;N;;;A75A;;A75A A75C;LATIN CAPITAL LETTER RUM ROTUNDA;Lu;0;L;;;;;N;;;;A75D; A75D;LATIN SMALL LETTER RUM ROTUNDA;Ll;0;L;;;;;N;;;A75C;;A75C A75E;LATIN CAPITAL LETTER V WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A75F; A75F;LATIN SMALL LETTER V WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A75E;;A75E A760;LATIN CAPITAL LETTER VY;Lu;0;L;;;;;N;;;;A761; A761;LATIN SMALL LETTER VY;Ll;0;L;;;;;N;;;A760;;A760 A762;LATIN CAPITAL LETTER VISIGOTHIC Z;Lu;0;L;;;;;N;;;;A763; A763;LATIN SMALL LETTER VISIGOTHIC Z;Ll;0;L;;;;;N;;;A762;;A762 A764;LATIN CAPITAL LETTER THORN WITH STROKE;Lu;0;L;;;;;N;;;;A765; A765;LATIN SMALL LETTER THORN WITH STROKE;Ll;0;L;;;;;N;;;A764;;A764 A766;LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A767; A767;LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A766;;A766 A768;LATIN CAPITAL LETTER VEND;Lu;0;L;;;;;N;;;;A769; A769;LATIN SMALL LETTER VEND;Ll;0;L;;;;;N;;;A768;;A768 A76A;LATIN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;A76B; A76B;LATIN SMALL LETTER ET;Ll;0;L;;;;;N;;;A76A;;A76A A76C;LATIN CAPITAL LETTER IS;Lu;0;L;;;;;N;;;;A76D; A76D;LATIN SMALL LETTER IS;Ll;0;L;;;;;N;;;A76C;;A76C A76E;LATIN CAPITAL LETTER CON;Lu;0;L;;;;;N;;;;A76F; A76F;LATIN SMALL LETTER CON;Ll;0;L;;;;;N;;;A76E;;A76E A770;MODIFIER LETTER US;Lm;0;L;<super> A76F;;;;N;;;;; A771;LATIN SMALL LETTER DUM;Ll;0;L;;;;;N;;;;; A772;LATIN SMALL LETTER LUM;Ll;0;L;;;;;N;;;;; A773;LATIN SMALL LETTER MUM;Ll;0;L;;;;;N;;;;; A774;LATIN SMALL LETTER NUM;Ll;0;L;;;;;N;;;;; A775;LATIN SMALL LETTER RUM;Ll;0;L;;;;;N;;;;; A776;LATIN LETTER SMALL CAPITAL RUM;Ll;0;L;;;;;N;;;;; A777;LATIN SMALL LETTER TUM;Ll;0;L;;;;;N;;;;; A778;LATIN SMALL LETTER UM;Ll;0;L;;;;;N;;;;; A779;LATIN CAPITAL LETTER INSULAR D;Lu;0;L;;;;;N;;;;A77A; A77A;LATIN SMALL LETTER INSULAR D;Ll;0;L;;;;;N;;;A779;;A779 A77B;LATIN CAPITAL LETTER INSULAR F;Lu;0;L;;;;;N;;;;A77C; A77C;LATIN SMALL LETTER INSULAR F;Ll;0;L;;;;;N;;;A77B;;A77B A77D;LATIN CAPITAL LETTER INSULAR G;Lu;0;L;;;;;N;;;;1D79; A77E;LATIN CAPITAL LETTER TURNED INSULAR G;Lu;0;L;;;;;N;;;;A77F; A77F;LATIN SMALL LETTER TURNED INSULAR G;Ll;0;L;;;;;N;;;A77E;;A77E A780;LATIN CAPITAL LETTER TURNED L;Lu;0;L;;;;;N;;;;A781; A781;LATIN SMALL LETTER TURNED L;Ll;0;L;;;;;N;;;A780;;A780 A782;LATIN CAPITAL LETTER INSULAR R;Lu;0;L;;;;;N;;;;A783; A783;LATIN SMALL LETTER INSULAR R;Ll;0;L;;;;;N;;;A782;;A782 A784;LATIN CAPITAL LETTER INSULAR S;Lu;0;L;;;;;N;;;;A785; A785;LATIN SMALL LETTER INSULAR S;Ll;0;L;;;;;N;;;A784;;A784 A786;LATIN CAPITAL LETTER INSULAR T;Lu;0;L;;;;;N;;;;A787; A787;LATIN SMALL LETTER INSULAR T;Ll;0;L;;;;;N;;;A786;;A786 A788;MODIFIER LETTER LOW CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;;;;; A789;MODIFIER LETTER COLON;Sk;0;L;;;;;N;;;;; A78A;MODIFIER LETTER SHORT EQUALS SIGN;Sk;0;L;;;;;N;;;;; A78B;LATIN CAPITAL LETTER SALTILLO;Lu;0;L;;;;;N;;;;A78C; A78C;LATIN SMALL LETTER SALTILLO;Ll;0;L;;;;;N;;;A78B;;A78B A78D;LATIN CAPITAL LETTER TURNED H;Lu;0;L;;;;;N;;;;0265; A78E;LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT;Ll;0;L;;;;;N;;;;; A78F;LATIN LETTER SINOLOGICAL DOT;Lo;0;L;;;;;N;;;;; A790;LATIN CAPITAL LETTER N WITH DESCENDER;Lu;0;L;;;;;N;;;;A791; A791;LATIN SMALL LETTER N WITH DESCENDER;Ll;0;L;;;;;N;;;A790;;A790 A792;LATIN CAPITAL LETTER C WITH BAR;Lu;0;L;;;;;N;;;;A793; A793;LATIN SMALL LETTER C WITH BAR;Ll;0;L;;;;;N;;;A792;;A792 A794;LATIN SMALL LETTER C WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; A795;LATIN SMALL LETTER H WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; A796;LATIN CAPITAL LETTER B WITH FLOURISH;Lu;0;L;;;;;N;;;;A797; A797;LATIN SMALL LETTER B WITH FLOURISH;Ll;0;L;;;;;N;;;A796;;A796 A798;LATIN CAPITAL LETTER F WITH STROKE;Lu;0;L;;;;;N;;;;A799; A799;LATIN SMALL LETTER F WITH STROKE;Ll;0;L;;;;;N;;;A798;;A798 A79A;LATIN CAPITAL LETTER VOLAPUK AE;Lu;0;L;;;;;N;;;;A79B; A79B;LATIN SMALL LETTER VOLAPUK AE;Ll;0;L;;;;;N;;;A79A;;A79A A79C;LATIN CAPITAL LETTER VOLAPUK OE;Lu;0;L;;;;;N;;;;A79D; A79D;LATIN SMALL LETTER VOLAPUK OE;Ll;0;L;;;;;N;;;A79C;;A79C A79E;LATIN CAPITAL LETTER VOLAPUK UE;Lu;0;L;;;;;N;;;;A79F; A79F;LATIN SMALL LETTER VOLAPUK UE;Ll;0;L;;;;;N;;;A79E;;A79E A7A0;LATIN CAPITAL LETTER G WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A1; A7A1;LATIN SMALL LETTER G WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A0;;A7A0 A7A2;LATIN CAPITAL LETTER K WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A3; A7A3;LATIN SMALL LETTER K WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A2;;A7A2 A7A4;LATIN CAPITAL LETTER N WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A5; A7A5;LATIN SMALL LETTER N WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A4;;A7A4 A7A6;LATIN CAPITAL LETTER R WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A7; A7A7;LATIN SMALL LETTER R WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A6;;A7A6 A7A8;LATIN CAPITAL LETTER S WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A9; A7A9;LATIN SMALL LETTER S WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A8;;A7A8 A7AA;LATIN CAPITAL LETTER H WITH HOOK;Lu;0;L;;;;;N;;;;0266; A7AB;LATIN CAPITAL LETTER REVERSED OPEN E;Lu;0;L;;;;;N;;;;025C; A7AC;LATIN CAPITAL LETTER SCRIPT G;Lu;0;L;;;;;N;;;;0261; A7AD;LATIN CAPITAL LETTER L WITH BELT;Lu;0;L;;;;;N;;;;026C; A7AE;LATIN CAPITAL LETTER SMALL CAPITAL I;Lu;0;L;;;;;N;;;;026A; A7B0;LATIN CAPITAL LETTER TURNED K;Lu;0;L;;;;;N;;;;029E; A7B1;LATIN CAPITAL LETTER TURNED T;Lu;0;L;;;;;N;;;;0287; A7B2;LATIN CAPITAL LETTER J WITH CROSSED-TAIL;Lu;0;L;;;;;N;;;;029D; A7B3;LATIN CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;AB53; A7B4;LATIN CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;A7B5; A7B5;LATIN SMALL LETTER BETA;Ll;0;L;;;;;N;;;A7B4;;A7B4 A7B6;LATIN CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;A7B7; A7B7;LATIN SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;A7B6;;A7B6 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;;;;; A7FA;LATIN LETTER SMALL CAPITAL TURNED M;Ll;0;L;;;;;N;;;;; A7FB;LATIN EPIGRAPHIC LETTER REVERSED F;Lo;0;L;;;;;N;;;;; A7FC;LATIN EPIGRAPHIC LETTER REVERSED P;Lo;0;L;;;;;N;;;;; A7FD;LATIN EPIGRAPHIC LETTER INVERTED M;Lo;0;L;;;;;N;;;;; A7FE;LATIN EPIGRAPHIC LETTER I LONGA;Lo;0;L;;;;;N;;;;; A7FF;LATIN EPIGRAPHIC LETTER ARCHAIC M;Lo;0;L;;;;;N;;;;; A800;SYLOTI NAGRI LETTER A;Lo;0;L;;;;;N;;;;; A801;SYLOTI NAGRI LETTER I;Lo;0;L;;;;;N;;;;; A802;SYLOTI NAGRI SIGN DVISVARA;Mn;0;NSM;;;;;N;;;;; A803;SYLOTI NAGRI LETTER U;Lo;0;L;;;;;N;;;;; A804;SYLOTI NAGRI LETTER E;Lo;0;L;;;;;N;;;;; A805;SYLOTI NAGRI LETTER O;Lo;0;L;;;;;N;;;;; A806;SYLOTI NAGRI SIGN HASANTA;Mn;9;NSM;;;;;N;;;;; A807;SYLOTI NAGRI LETTER KO;Lo;0;L;;;;;N;;;;; A808;SYLOTI NAGRI LETTER KHO;Lo;0;L;;;;;N;;;;; A809;SYLOTI NAGRI LETTER GO;Lo;0;L;;;;;N;;;;; A80A;SYLOTI NAGRI LETTER GHO;Lo;0;L;;;;;N;;;;; A80B;SYLOTI NAGRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; A80C;SYLOTI NAGRI LETTER CO;Lo;0;L;;;;;N;;;;; A80D;SYLOTI NAGRI LETTER CHO;Lo;0;L;;;;;N;;;;; A80E;SYLOTI NAGRI LETTER JO;Lo;0;L;;;;;N;;;;; A80F;SYLOTI NAGRI LETTER JHO;Lo;0;L;;;;;N;;;;; A810;SYLOTI NAGRI LETTER TTO;Lo;0;L;;;;;N;;;;; A811;SYLOTI NAGRI LETTER TTHO;Lo;0;L;;;;;N;;;;; A812;SYLOTI NAGRI LETTER DDO;Lo;0;L;;;;;N;;;;; A813;SYLOTI NAGRI LETTER DDHO;Lo;0;L;;;;;N;;;;; A814;SYLOTI NAGRI LETTER TO;Lo;0;L;;;;;N;;;;; A815;SYLOTI NAGRI LETTER THO;Lo;0;L;;;;;N;;;;; A816;SYLOTI NAGRI LETTER DO;Lo;0;L;;;;;N;;;;; A817;SYLOTI NAGRI LETTER DHO;Lo;0;L;;;;;N;;;;; A818;SYLOTI NAGRI LETTER NO;Lo;0;L;;;;;N;;;;; A819;SYLOTI NAGRI LETTER PO;Lo;0;L;;;;;N;;;;; A81A;SYLOTI NAGRI LETTER PHO;Lo;0;L;;;;;N;;;;; A81B;SYLOTI NAGRI LETTER BO;Lo;0;L;;;;;N;;;;; A81C;SYLOTI NAGRI LETTER BHO;Lo;0;L;;;;;N;;;;; A81D;SYLOTI NAGRI LETTER MO;Lo;0;L;;;;;N;;;;; A81E;SYLOTI NAGRI LETTER RO;Lo;0;L;;;;;N;;;;; A81F;SYLOTI NAGRI LETTER LO;Lo;0;L;;;;;N;;;;; A820;SYLOTI NAGRI LETTER RRO;Lo;0;L;;;;;N;;;;; A821;SYLOTI NAGRI LETTER SO;Lo;0;L;;;;;N;;;;; A822;SYLOTI NAGRI LETTER HO;Lo;0;L;;;;;N;;;;; A823;SYLOTI NAGRI VOWEL SIGN A;Mc;0;L;;;;;N;;;;; A824;SYLOTI NAGRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; A825;SYLOTI NAGRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; A826;SYLOTI NAGRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; A827;SYLOTI NAGRI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; 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;;;;; 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;;;;; A833;NORTH INDIC FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; A834;NORTH INDIC FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; A835;NORTH INDIC FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; A836;NORTH INDIC QUARTER MARK;So;0;L;;;;;N;;;;; A837;NORTH INDIC PLACEHOLDER MARK;So;0;L;;;;;N;;;;; A838;NORTH INDIC RUPEE MARK;Sc;0;ET;;;;;N;;;;; A839;NORTH INDIC QUANTITY MARK;So;0;ET;;;;;N;;;;; A840;PHAGS-PA LETTER KA;Lo;0;L;;;;;N;;;;; A841;PHAGS-PA LETTER KHA;Lo;0;L;;;;;N;;;;; A842;PHAGS-PA LETTER GA;Lo;0;L;;;;;N;;;;; A843;PHAGS-PA LETTER NGA;Lo;0;L;;;;;N;;;;; A844;PHAGS-PA LETTER CA;Lo;0;L;;;;;N;;;;; A845;PHAGS-PA LETTER CHA;Lo;0;L;;;;;N;;;;; A846;PHAGS-PA LETTER JA;Lo;0;L;;;;;N;;;;; A847;PHAGS-PA LETTER NYA;Lo;0;L;;;;;N;;;;; A848;PHAGS-PA LETTER TA;Lo;0;L;;;;;N;;;;; A849;PHAGS-PA LETTER THA;Lo;0;L;;;;;N;;;;; A84A;PHAGS-PA LETTER DA;Lo;0;L;;;;;N;;;;; A84B;PHAGS-PA LETTER NA;Lo;0;L;;;;;N;;;;; A84C;PHAGS-PA LETTER PA;Lo;0;L;;;;;N;;;;; A84D;PHAGS-PA LETTER PHA;Lo;0;L;;;;;N;;;;; A84E;PHAGS-PA LETTER BA;Lo;0;L;;;;;N;;;;; A84F;PHAGS-PA LETTER MA;Lo;0;L;;;;;N;;;;; A850;PHAGS-PA LETTER TSA;Lo;0;L;;;;;N;;;;; A851;PHAGS-PA LETTER TSHA;Lo;0;L;;;;;N;;;;; A852;PHAGS-PA LETTER DZA;Lo;0;L;;;;;N;;;;; A853;PHAGS-PA LETTER WA;Lo;0;L;;;;;N;;;;; A854;PHAGS-PA LETTER ZHA;Lo;0;L;;;;;N;;;;; A855;PHAGS-PA LETTER ZA;Lo;0;L;;;;;N;;;;; A856;PHAGS-PA LETTER SMALL A;Lo;0;L;;;;;N;;;;; A857;PHAGS-PA LETTER YA;Lo;0;L;;;;;N;;;;; A858;PHAGS-PA LETTER RA;Lo;0;L;;;;;N;;;;; A859;PHAGS-PA LETTER LA;Lo;0;L;;;;;N;;;;; A85A;PHAGS-PA LETTER SHA;Lo;0;L;;;;;N;;;;; A85B;PHAGS-PA LETTER SA;Lo;0;L;;;;;N;;;;; A85C;PHAGS-PA LETTER HA;Lo;0;L;;;;;N;;;;; A85D;PHAGS-PA LETTER A;Lo;0;L;;;;;N;;;;; A85E;PHAGS-PA LETTER I;Lo;0;L;;;;;N;;;;; A85F;PHAGS-PA LETTER U;Lo;0;L;;;;;N;;;;; A860;PHAGS-PA LETTER E;Lo;0;L;;;;;N;;;;; A861;PHAGS-PA LETTER O;Lo;0;L;;;;;N;;;;; A862;PHAGS-PA LETTER QA;Lo;0;L;;;;;N;;;;; A863;PHAGS-PA LETTER XA;Lo;0;L;;;;;N;;;;; A864;PHAGS-PA LETTER FA;Lo;0;L;;;;;N;;;;; A865;PHAGS-PA LETTER GGA;Lo;0;L;;;;;N;;;;; A866;PHAGS-PA LETTER EE;Lo;0;L;;;;;N;;;;; A867;PHAGS-PA SUBJOINED LETTER WA;Lo;0;L;;;;;N;;;;; A868;PHAGS-PA SUBJOINED LETTER YA;Lo;0;L;;;;;N;;;;; A869;PHAGS-PA LETTER TTA;Lo;0;L;;;;;N;;;;; A86A;PHAGS-PA LETTER TTHA;Lo;0;L;;;;;N;;;;; A86B;PHAGS-PA LETTER DDA;Lo;0;L;;;;;N;;;;; A86C;PHAGS-PA LETTER NNA;Lo;0;L;;;;;N;;;;; A86D;PHAGS-PA LETTER ALTERNATE YA;Lo;0;L;;;;;N;;;;; A86E;PHAGS-PA LETTER VOICELESS SHA;Lo;0;L;;;;;N;;;;; A86F;PHAGS-PA LETTER VOICED HA;Lo;0;L;;;;;N;;;;; A870;PHAGS-PA LETTER ASPIRATED FA;Lo;0;L;;;;;N;;;;; A871;PHAGS-PA SUBJOINED LETTER RA;Lo;0;L;;;;;N;;;;; A872;PHAGS-PA SUPERFIXED LETTER RA;Lo;0;L;;;;;N;;;;; A873;PHAGS-PA LETTER CANDRABINDU;Lo;0;L;;;;;N;;;;; A874;PHAGS-PA SINGLE HEAD MARK;Po;0;ON;;;;;N;;;;; A875;PHAGS-PA DOUBLE HEAD MARK;Po;0;ON;;;;;N;;;;; A876;PHAGS-PA MARK SHAD;Po;0;ON;;;;;N;;;;; A877;PHAGS-PA MARK DOUBLE SHAD;Po;0;ON;;;;;N;;;;; A880;SAURASHTRA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; A881;SAURASHTRA SIGN VISARGA;Mc;0;L;;;;;N;;;;; A882;SAURASHTRA LETTER A;Lo;0;L;;;;;N;;;;; A883;SAURASHTRA LETTER AA;Lo;0;L;;;;;N;;;;; A884;SAURASHTRA LETTER I;Lo;0;L;;;;;N;;;;; A885;SAURASHTRA LETTER II;Lo;0;L;;;;;N;;;;; A886;SAURASHTRA LETTER U;Lo;0;L;;;;;N;;;;; A887;SAURASHTRA LETTER UU;Lo;0;L;;;;;N;;;;; A888;SAURASHTRA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; A889;SAURASHTRA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; A88A;SAURASHTRA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; A88B;SAURASHTRA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; A88C;SAURASHTRA LETTER E;Lo;0;L;;;;;N;;;;; A88D;SAURASHTRA LETTER EE;Lo;0;L;;;;;N;;;;; A88E;SAURASHTRA LETTER AI;Lo;0;L;;;;;N;;;;; A88F;SAURASHTRA LETTER O;Lo;0;L;;;;;N;;;;; A890;SAURASHTRA LETTER OO;Lo;0;L;;;;;N;;;;; A891;SAURASHTRA LETTER AU;Lo;0;L;;;;;N;;;;; A892;SAURASHTRA LETTER KA;Lo;0;L;;;;;N;;;;; A893;SAURASHTRA LETTER KHA;Lo;0;L;;;;;N;;;;; A894;SAURASHTRA LETTER GA;Lo;0;L;;;;;N;;;;; A895;SAURASHTRA LETTER GHA;Lo;0;L;;;;;N;;;;; A896;SAURASHTRA LETTER NGA;Lo;0;L;;;;;N;;;;; A897;SAURASHTRA LETTER CA;Lo;0;L;;;;;N;;;;; A898;SAURASHTRA LETTER CHA;Lo;0;L;;;;;N;;;;; A899;SAURASHTRA LETTER JA;Lo;0;L;;;;;N;;;;; A89A;SAURASHTRA LETTER JHA;Lo;0;L;;;;;N;;;;; A89B;SAURASHTRA LETTER NYA;Lo;0;L;;;;;N;;;;; A89C;SAURASHTRA LETTER TTA;Lo;0;L;;;;;N;;;;; A89D;SAURASHTRA LETTER TTHA;Lo;0;L;;;;;N;;;;; A89E;SAURASHTRA LETTER DDA;Lo;0;L;;;;;N;;;;; A89F;SAURASHTRA LETTER DDHA;Lo;0;L;;;;;N;;;;; A8A0;SAURASHTRA LETTER NNA;Lo;0;L;;;;;N;;;;; A8A1;SAURASHTRA LETTER TA;Lo;0;L;;;;;N;;;;; A8A2;SAURASHTRA LETTER THA;Lo;0;L;;;;;N;;;;; A8A3;SAURASHTRA LETTER DA;Lo;0;L;;;;;N;;;;; A8A4;SAURASHTRA LETTER DHA;Lo;0;L;;;;;N;;;;; A8A5;SAURASHTRA LETTER NA;Lo;0;L;;;;;N;;;;; A8A6;SAURASHTRA LETTER PA;Lo;0;L;;;;;N;;;;; A8A7;SAURASHTRA LETTER PHA;Lo;0;L;;;;;N;;;;; A8A8;SAURASHTRA LETTER BA;Lo;0;L;;;;;N;;;;; A8A9;SAURASHTRA LETTER BHA;Lo;0;L;;;;;N;;;;; A8AA;SAURASHTRA LETTER MA;Lo;0;L;;;;;N;;;;; A8AB;SAURASHTRA LETTER YA;Lo;0;L;;;;;N;;;;; A8AC;SAURASHTRA LETTER RA;Lo;0;L;;;;;N;;;;; A8AD;SAURASHTRA LETTER LA;Lo;0;L;;;;;N;;;;; A8AE;SAURASHTRA LETTER VA;Lo;0;L;;;;;N;;;;; A8AF;SAURASHTRA LETTER SHA;Lo;0;L;;;;;N;;;;; A8B0;SAURASHTRA LETTER SSA;Lo;0;L;;;;;N;;;;; A8B1;SAURASHTRA LETTER SA;Lo;0;L;;;;;N;;;;; A8B2;SAURASHTRA LETTER HA;Lo;0;L;;;;;N;;;;; A8B3;SAURASHTRA LETTER LLA;Lo;0;L;;;;;N;;;;; A8B4;SAURASHTRA CONSONANT SIGN HAARU;Mc;0;L;;;;;N;;;;; A8B5;SAURASHTRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; A8B6;SAURASHTRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; A8B7;SAURASHTRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; A8B8;SAURASHTRA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; A8B9;SAURASHTRA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; A8BA;SAURASHTRA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; A8BB;SAURASHTRA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; A8BC;SAURASHTRA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;; A8BD;SAURASHTRA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;; A8BE;SAURASHTRA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; A8BF;SAURASHTRA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; A8C0;SAURASHTRA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; A8C1;SAURASHTRA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; A8C2;SAURASHTRA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; A8C3;SAURASHTRA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; A8C4;SAURASHTRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; A8C5;SAURASHTRA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; A8CE;SAURASHTRA DANDA;Po;0;L;;;;;N;;;;; A8CF;SAURASHTRA DOUBLE DANDA;Po;0;L;;;;;N;;;;; A8D0;SAURASHTRA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; A8D1;SAURASHTRA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; A8D2;SAURASHTRA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; A8D3;SAURASHTRA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; A8D4;SAURASHTRA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; A8D5;SAURASHTRA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; A8D6;SAURASHTRA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; A8D7;SAURASHTRA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; A8D8;SAURASHTRA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; A8D9;SAURASHTRA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; A8E0;COMBINING DEVANAGARI DIGIT ZERO;Mn;230;NSM;;;;;N;;;;; A8E1;COMBINING DEVANAGARI DIGIT ONE;Mn;230;NSM;;;;;N;;;;; A8E2;COMBINING DEVANAGARI DIGIT TWO;Mn;230;NSM;;;;;N;;;;; A8E3;COMBINING DEVANAGARI DIGIT THREE;Mn;230;NSM;;;;;N;;;;; A8E4;COMBINING DEVANAGARI DIGIT FOUR;Mn;230;NSM;;;;;N;;;;; A8E5;COMBINING DEVANAGARI DIGIT FIVE;Mn;230;NSM;;;;;N;;;;; A8E6;COMBINING DEVANAGARI DIGIT SIX;Mn;230;NSM;;;;;N;;;;; A8E7;COMBINING DEVANAGARI DIGIT SEVEN;Mn;230;NSM;;;;;N;;;;; A8E8;COMBINING DEVANAGARI DIGIT EIGHT;Mn;230;NSM;;;;;N;;;;; A8E9;COMBINING DEVANAGARI DIGIT NINE;Mn;230;NSM;;;;;N;;;;; A8EA;COMBINING DEVANAGARI LETTER A;Mn;230;NSM;;;;;N;;;;; A8EB;COMBINING DEVANAGARI LETTER U;Mn;230;NSM;;;;;N;;;;; A8EC;COMBINING DEVANAGARI LETTER KA;Mn;230;NSM;;;;;N;;;;; A8ED;COMBINING DEVANAGARI LETTER NA;Mn;230;NSM;;;;;N;;;;; A8EE;COMBINING DEVANAGARI LETTER PA;Mn;230;NSM;;;;;N;;;;; A8EF;COMBINING DEVANAGARI LETTER RA;Mn;230;NSM;;;;;N;;;;; A8F0;COMBINING DEVANAGARI LETTER VI;Mn;230;NSM;;;;;N;;;;; A8F1;COMBINING DEVANAGARI SIGN AVAGRAHA;Mn;230;NSM;;;;;N;;;;; A8F2;DEVANAGARI SIGN SPACING CANDRABINDU;Lo;0;L;;;;;N;;;;; A8F3;DEVANAGARI SIGN CANDRABINDU VIRAMA;Lo;0;L;;;;;N;;;;; A8F4;DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA;Lo;0;L;;;;;N;;;;; A8F5;DEVANAGARI SIGN CANDRABINDU TWO;Lo;0;L;;;;;N;;;;; A8F6;DEVANAGARI SIGN CANDRABINDU THREE;Lo;0;L;;;;;N;;;;; A8F7;DEVANAGARI SIGN CANDRABINDU AVAGRAHA;Lo;0;L;;;;;N;;;;; A8F8;DEVANAGARI SIGN PUSHPIKA;Po;0;L;;;;;N;;;;; A8F9;DEVANAGARI GAP FILLER;Po;0;L;;;;;N;;;;; A8FA;DEVANAGARI CARET;Po;0;L;;;;;N;;;;; A8FB;DEVANAGARI HEADSTROKE;Lo;0;L;;;;;N;;;;; A8FC;DEVANAGARI SIGN SIDDHAM;Po;0;L;;;;;N;;;;; A8FD;DEVANAGARI JAIN OM;Lo;0;L;;;;;N;;;;; A900;KAYAH LI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; A901;KAYAH LI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; A902;KAYAH LI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; A903;KAYAH LI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; A904;KAYAH LI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; A905;KAYAH LI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; A906;KAYAH LI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; A907;KAYAH LI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; A908;KAYAH LI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; A909;KAYAH LI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; A90A;KAYAH LI LETTER KA;Lo;0;L;;;;;N;;;;; A90B;KAYAH LI LETTER KHA;Lo;0;L;;;;;N;;;;; A90C;KAYAH LI LETTER GA;Lo;0;L;;;;;N;;;;; A90D;KAYAH LI LETTER NGA;Lo;0;L;;;;;N;;;;; A90E;KAYAH LI LETTER SA;Lo;0;L;;;;;N;;;;; A90F;KAYAH LI LETTER SHA;Lo;0;L;;;;;N;;;;; A910;KAYAH LI LETTER ZA;Lo;0;L;;;;;N;;;;; A911;KAYAH LI LETTER NYA;Lo;0;L;;;;;N;;;;; A912;KAYAH LI LETTER TA;Lo;0;L;;;;;N;;;;; A913;KAYAH LI LETTER HTA;Lo;0;L;;;;;N;;;;; A914;KAYAH LI LETTER NA;Lo;0;L;;;;;N;;;;; A915;KAYAH LI LETTER PA;Lo;0;L;;;;;N;;;;; A916;KAYAH LI LETTER PHA;Lo;0;L;;;;;N;;;;; A917;KAYAH LI LETTER MA;Lo;0;L;;;;;N;;;;; A918;KAYAH LI LETTER DA;Lo;0;L;;;;;N;;;;; A919;KAYAH LI LETTER BA;Lo;0;L;;;;;N;;;;; A91A;KAYAH LI LETTER RA;Lo;0;L;;;;;N;;;;; A91B;KAYAH LI LETTER YA;Lo;0;L;;;;;N;;;;; A91C;KAYAH LI LETTER LA;Lo;0;L;;;;;N;;;;; A91D;KAYAH LI LETTER WA;Lo;0;L;;;;;N;;;;; A91E;KAYAH LI LETTER THA;Lo;0;L;;;;;N;;;;; A91F;KAYAH LI LETTER HA;Lo;0;L;;;;;N;;;;; A920;KAYAH LI LETTER VA;Lo;0;L;;;;;N;;;;; A921;KAYAH LI LETTER CA;Lo;0;L;;;;;N;;;;; A922;KAYAH LI LETTER A;Lo;0;L;;;;;N;;;;; A923;KAYAH LI LETTER OE;Lo;0;L;;;;;N;;;;; A924;KAYAH LI LETTER I;Lo;0;L;;;;;N;;;;; A925;KAYAH LI LETTER OO;Lo;0;L;;;;;N;;;;; A926;KAYAH LI VOWEL UE;Mn;0;NSM;;;;;N;;;;; A927;KAYAH LI VOWEL E;Mn;0;NSM;;;;;N;;;;; A928;KAYAH LI VOWEL U;Mn;0;NSM;;;;;N;;;;; A929;KAYAH LI VOWEL EE;Mn;0;NSM;;;;;N;;;;; A92A;KAYAH LI VOWEL O;Mn;0;NSM;;;;;N;;;;; A92B;KAYAH LI TONE PLOPHU;Mn;220;NSM;;;;;N;;;;; A92C;KAYAH LI TONE CALYA;Mn;220;NSM;;;;;N;;;;; A92D;KAYAH LI TONE CALYA PLOPHU;Mn;220;NSM;;;;;N;;;;; A92E;KAYAH LI SIGN CWI;Po;0;L;;;;;N;;;;; A92F;KAYAH LI SIGN SHYA;Po;0;L;;;;;N;;;;; A930;REJANG LETTER KA;Lo;0;L;;;;;N;;;;; A931;REJANG LETTER GA;Lo;0;L;;;;;N;;;;; A932;REJANG LETTER NGA;Lo;0;L;;;;;N;;;;; A933;REJANG LETTER TA;Lo;0;L;;;;;N;;;;; A934;REJANG LETTER DA;Lo;0;L;;;;;N;;;;; A935;REJANG LETTER NA;Lo;0;L;;;;;N;;;;; A936;REJANG LETTER PA;Lo;0;L;;;;;N;;;;; A937;REJANG LETTER BA;Lo;0;L;;;;;N;;;;; A938;REJANG LETTER MA;Lo;0;L;;;;;N;;;;; A939;REJANG LETTER CA;Lo;0;L;;;;;N;;;;; A93A;REJANG LETTER JA;Lo;0;L;;;;;N;;;;; A93B;REJANG LETTER NYA;Lo;0;L;;;;;N;;;;; A93C;REJANG LETTER SA;Lo;0;L;;;;;N;;;;; A93D;REJANG LETTER RA;Lo;0;L;;;;;N;;;;; A93E;REJANG LETTER LA;Lo;0;L;;;;;N;;;;; A93F;REJANG LETTER YA;Lo;0;L;;;;;N;;;;; A940;REJANG LETTER WA;Lo;0;L;;;;;N;;;;; A941;REJANG LETTER HA;Lo;0;L;;;;;N;;;;; A942;REJANG LETTER MBA;Lo;0;L;;;;;N;;;;; A943;REJANG LETTER NGGA;Lo;0;L;;;;;N;;;;; A944;REJANG LETTER NDA;Lo;0;L;;;;;N;;;;; A945;REJANG LETTER NYJA;Lo;0;L;;;;;N;;;;; A946;REJANG LETTER A;Lo;0;L;;;;;N;;;;; A947;REJANG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; A948;REJANG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; A949;REJANG VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; A94A;REJANG VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; A94B;REJANG VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; A94C;REJANG VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; A94D;REJANG VOWEL SIGN EU;Mn;0;NSM;;;;;N;;;;; A94E;REJANG VOWEL SIGN EA;Mn;0;NSM;;;;;N;;;;; A94F;REJANG CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; A950;REJANG CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; A951;REJANG CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; A952;REJANG CONSONANT SIGN H;Mc;0;L;;;;;N;;;;; A953;REJANG VIRAMA;Mc;9;L;;;;;N;;;;; A95F;REJANG SECTION MARK;Po;0;L;;;;;N;;;;; A960;HANGUL CHOSEONG TIKEUT-MIEUM;Lo;0;L;;;;;N;;;;; A961;HANGUL CHOSEONG TIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; A962;HANGUL CHOSEONG TIKEUT-SIOS;Lo;0;L;;;;;N;;;;; A963;HANGUL CHOSEONG TIKEUT-CIEUC;Lo;0;L;;;;;N;;;;; A964;HANGUL CHOSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;;;; A965;HANGUL CHOSEONG RIEUL-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; A966;HANGUL CHOSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; A967;HANGUL CHOSEONG RIEUL-SSANGTIKEUT;Lo;0;L;;;;;N;;;;; A968;HANGUL CHOSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;;;; A969;HANGUL CHOSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;;;; A96A;HANGUL CHOSEONG RIEUL-SSANGPIEUP;Lo;0;L;;;;;N;;;;; A96B;HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; A96C;HANGUL CHOSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;;;; A96D;HANGUL CHOSEONG RIEUL-CIEUC;Lo;0;L;;;;;N;;;;; A96E;HANGUL CHOSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; A96F;HANGUL CHOSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; A970;HANGUL CHOSEONG MIEUM-TIKEUT;Lo;0;L;;;;;N;;;;; A971;HANGUL CHOSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; A972;HANGUL CHOSEONG PIEUP-SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; A973;HANGUL CHOSEONG PIEUP-KHIEUKH;Lo;0;L;;;;;N;;;;; A974;HANGUL CHOSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; A975;HANGUL CHOSEONG SSANGSIOS-PIEUP;Lo;0;L;;;;;N;;;;; A976;HANGUL CHOSEONG IEUNG-RIEUL;Lo;0;L;;;;;N;;;;; A977;HANGUL CHOSEONG IEUNG-HIEUH;Lo;0;L;;;;;N;;;;; A978;HANGUL CHOSEONG SSANGCIEUC-HIEUH;Lo;0;L;;;;;N;;;;; A979;HANGUL CHOSEONG SSANGTHIEUTH;Lo;0;L;;;;;N;;;;; A97A;HANGUL CHOSEONG PHIEUPH-HIEUH;Lo;0;L;;;;;N;;;;; A97B;HANGUL CHOSEONG HIEUH-SIOS;Lo;0;L;;;;;N;;;;; A97C;HANGUL CHOSEONG SSANGYEORINHIEUH;Lo;0;L;;;;;N;;;;; A980;JAVANESE SIGN PANYANGGA;Mn;0;NSM;;;;;N;;;;; A981;JAVANESE SIGN CECAK;Mn;0;NSM;;;;;N;;;;; A982;JAVANESE SIGN LAYAR;Mn;0;NSM;;;;;N;;;;; A983;JAVANESE SIGN WIGNYAN;Mc;0;L;;;;;N;;;;; A984;JAVANESE LETTER A;Lo;0;L;;;;;N;;;;; A985;JAVANESE LETTER I KAWI;Lo;0;L;;;;;N;;;;; A986;JAVANESE LETTER I;Lo;0;L;;;;;N;;;;; A987;JAVANESE LETTER II;Lo;0;L;;;;;N;;;;; A988;JAVANESE LETTER U;Lo;0;L;;;;;N;;;;; A989;JAVANESE LETTER PA CEREK;Lo;0;L;;;;;N;;;;; A98A;JAVANESE LETTER NGA LELET;Lo;0;L;;;;;N;;;;; A98B;JAVANESE LETTER NGA LELET RASWADI;Lo;0;L;;;;;N;;;;; A98C;JAVANESE LETTER E;Lo;0;L;;;;;N;;;;; A98D;JAVANESE LETTER AI;Lo;0;L;;;;;N;;;;; A98E;JAVANESE LETTER O;Lo;0;L;;;;;N;;;;; A98F;JAVANESE LETTER KA;Lo;0;L;;;;;N;;;;; A990;JAVANESE LETTER KA SASAK;Lo;0;L;;;;;N;;;;; A991;JAVANESE LETTER KA MURDA;Lo;0;L;;;;;N;;;;; A992;JAVANESE LETTER GA;Lo;0;L;;;;;N;;;;; A993;JAVANESE LETTER GA MURDA;Lo;0;L;;;;;N;;;;; A994;JAVANESE LETTER NGA;Lo;0;L;;;;;N;;;;; A995;JAVANESE LETTER CA;Lo;0;L;;;;;N;;;;; A996;JAVANESE LETTER CA MURDA;Lo;0;L;;;;;N;;;;; A997;JAVANESE LETTER JA;Lo;0;L;;;;;N;;;;; A998;JAVANESE LETTER NYA MURDA;Lo;0;L;;;;;N;;;;; A999;JAVANESE LETTER JA MAHAPRANA;Lo;0;L;;;;;N;;;;; A99A;JAVANESE LETTER NYA;Lo;0;L;;;;;N;;;;; A99B;JAVANESE LETTER TTA;Lo;0;L;;;;;N;;;;; A99C;JAVANESE LETTER TTA MAHAPRANA;Lo;0;L;;;;;N;;;;; A99D;JAVANESE LETTER DDA;Lo;0;L;;;;;N;;;;; A99E;JAVANESE LETTER DDA MAHAPRANA;Lo;0;L;;;;;N;;;;; A99F;JAVANESE LETTER NA MURDA;Lo;0;L;;;;;N;;;;; A9A0;JAVANESE LETTER TA;Lo;0;L;;;;;N;;;;; A9A1;JAVANESE LETTER TA MURDA;Lo;0;L;;;;;N;;;;; A9A2;JAVANESE LETTER DA;Lo;0;L;;;;;N;;;;; A9A3;JAVANESE LETTER DA MAHAPRANA;Lo;0;L;;;;;N;;;;; A9A4;JAVANESE LETTER NA;Lo;0;L;;;;;N;;;;; A9A5;JAVANESE LETTER PA;Lo;0;L;;;;;N;;;;; A9A6;JAVANESE LETTER PA MURDA;Lo;0;L;;;;;N;;;;; A9A7;JAVANESE LETTER BA;Lo;0;L;;;;;N;;;;; A9A8;JAVANESE LETTER BA MURDA;Lo;0;L;;;;;N;;;;; A9A9;JAVANESE LETTER MA;Lo;0;L;;;;;N;;;;; A9AA;JAVANESE LETTER YA;Lo;0;L;;;;;N;;;;; A9AB;JAVANESE LETTER RA;Lo;0;L;;;;;N;;;;; A9AC;JAVANESE LETTER RA AGUNG;Lo;0;L;;;;;N;;;;; A9AD;JAVANESE LETTER LA;Lo;0;L;;;;;N;;;;; A9AE;JAVANESE LETTER WA;Lo;0;L;;;;;N;;;;; A9AF;JAVANESE LETTER SA MURDA;Lo;0;L;;;;;N;;;;; A9B0;JAVANESE LETTER SA MAHAPRANA;Lo;0;L;;;;;N;;;;; A9B1;JAVANESE LETTER SA;Lo;0;L;;;;;N;;;;; A9B2;JAVANESE LETTER HA;Lo;0;L;;;;;N;;;;; A9B3;JAVANESE SIGN CECAK TELU;Mn;7;NSM;;;;;N;;;;; A9B4;JAVANESE VOWEL SIGN TARUNG;Mc;0;L;;;;;N;;;;; A9B5;JAVANESE VOWEL SIGN TOLONG;Mc;0;L;;;;;N;;;;; A9B6;JAVANESE VOWEL SIGN WULU;Mn;0;NSM;;;;;N;;;;; A9B7;JAVANESE VOWEL SIGN WULU MELIK;Mn;0;NSM;;;;;N;;;;; A9B8;JAVANESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;; A9B9;JAVANESE VOWEL SIGN SUKU MENDUT;Mn;0;NSM;;;;;N;;;;; A9BA;JAVANESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;; A9BB;JAVANESE VOWEL SIGN DIRGA MURE;Mc;0;L;;;;;N;;;;; A9BC;JAVANESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;; A9BD;JAVANESE CONSONANT SIGN KERET;Mc;0;L;;;;;N;;;;; A9BE;JAVANESE CONSONANT SIGN PENGKAL;Mc;0;L;;;;;N;;;;; A9BF;JAVANESE CONSONANT SIGN CAKRA;Mc;0;L;;;;;N;;;;; A9C0;JAVANESE PANGKON;Mc;9;L;;;;;N;;;;; A9C1;JAVANESE LEFT RERENGGAN;Po;0;L;;;;;N;;;;; A9C2;JAVANESE RIGHT RERENGGAN;Po;0;L;;;;;N;;;;; A9C3;JAVANESE PADA ANDAP;Po;0;L;;;;;N;;;;; A9C4;JAVANESE PADA MADYA;Po;0;L;;;;;N;;;;; A9C5;JAVANESE PADA LUHUR;Po;0;L;;;;;N;;;;; A9C6;JAVANESE PADA WINDU;Po;0;L;;;;;N;;;;; A9C7;JAVANESE PADA PANGKAT;Po;0;L;;;;;N;;;;; A9C8;JAVANESE PADA LINGSA;Po;0;L;;;;;N;;;;; A9C9;JAVANESE PADA LUNGSI;Po;0;L;;;;;N;;;;; A9CA;JAVANESE PADA ADEG;Po;0;L;;;;;N;;;;; A9CB;JAVANESE PADA ADEG ADEG;Po;0;L;;;;;N;;;;; A9CC;JAVANESE PADA PISELEH;Po;0;L;;;;;N;;;;; A9CD;JAVANESE TURNED PADA PISELEH;Po;0;L;;;;;N;;;;; A9CF;JAVANESE PANGRANGKEP;Lm;0;L;;;;;N;;;;; A9D0;JAVANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; A9D1;JAVANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; A9D2;JAVANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; A9D3;JAVANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; A9D4;JAVANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; A9D5;JAVANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; A9D6;JAVANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; A9D7;JAVANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; A9D8;JAVANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; A9D9;JAVANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; A9DE;JAVANESE PADA TIRTA TUMETES;Po;0;L;;;;;N;;;;; A9DF;JAVANESE PADA ISEN-ISEN;Po;0;L;;;;;N;;;;; A9E0;MYANMAR LETTER SHAN GHA;Lo;0;L;;;;;N;;;;; A9E1;MYANMAR LETTER SHAN CHA;Lo;0;L;;;;;N;;;;; A9E2;MYANMAR LETTER SHAN JHA;Lo;0;L;;;;;N;;;;; A9E3;MYANMAR LETTER SHAN NNA;Lo;0;L;;;;;N;;;;; A9E4;MYANMAR LETTER SHAN BHA;Lo;0;L;;;;;N;;;;; A9E5;MYANMAR SIGN SHAN SAW;Mn;0;NSM;;;;;N;;;;; A9E6;MYANMAR MODIFIER LETTER SHAN REDUPLICATION;Lm;0;L;;;;;N;;;;; A9E7;MYANMAR LETTER TAI LAING NYA;Lo;0;L;;;;;N;;;;; A9E8;MYANMAR LETTER TAI LAING FA;Lo;0;L;;;;;N;;;;; A9E9;MYANMAR LETTER TAI LAING GA;Lo;0;L;;;;;N;;;;; A9EA;MYANMAR LETTER TAI LAING GHA;Lo;0;L;;;;;N;;;;; A9EB;MYANMAR LETTER TAI LAING JA;Lo;0;L;;;;;N;;;;; A9EC;MYANMAR LETTER TAI LAING JHA;Lo;0;L;;;;;N;;;;; A9ED;MYANMAR LETTER TAI LAING DDA;Lo;0;L;;;;;N;;;;; A9EE;MYANMAR LETTER TAI LAING DDHA;Lo;0;L;;;;;N;;;;; A9EF;MYANMAR LETTER TAI LAING NNA;Lo;0;L;;;;;N;;;;; A9F0;MYANMAR TAI LAING DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; A9F1;MYANMAR TAI LAING DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; A9F2;MYANMAR TAI LAING DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; A9F3;MYANMAR TAI LAING DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; A9F4;MYANMAR TAI LAING DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; A9F5;MYANMAR TAI LAING DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; A9F6;MYANMAR TAI LAING DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; A9F7;MYANMAR TAI LAING DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; A9F8;MYANMAR TAI LAING DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; A9F9;MYANMAR TAI LAING DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; A9FA;MYANMAR LETTER TAI LAING LLA;Lo;0;L;;;;;N;;;;; A9FB;MYANMAR LETTER TAI LAING DA;Lo;0;L;;;;;N;;;;; A9FC;MYANMAR LETTER TAI LAING DHA;Lo;0;L;;;;;N;;;;; A9FD;MYANMAR LETTER TAI LAING BA;Lo;0;L;;;;;N;;;;; A9FE;MYANMAR LETTER TAI LAING BHA;Lo;0;L;;;;;N;;;;; AA00;CHAM LETTER A;Lo;0;L;;;;;N;;;;; AA01;CHAM LETTER I;Lo;0;L;;;;;N;;;;; AA02;CHAM LETTER U;Lo;0;L;;;;;N;;;;; AA03;CHAM LETTER E;Lo;0;L;;;;;N;;;;; AA04;CHAM LETTER AI;Lo;0;L;;;;;N;;;;; AA05;CHAM LETTER O;Lo;0;L;;;;;N;;;;; AA06;CHAM LETTER KA;Lo;0;L;;;;;N;;;;; AA07;CHAM LETTER KHA;Lo;0;L;;;;;N;;;;; AA08;CHAM LETTER GA;Lo;0;L;;;;;N;;;;; AA09;CHAM LETTER GHA;Lo;0;L;;;;;N;;;;; AA0A;CHAM LETTER NGUE;Lo;0;L;;;;;N;;;;; AA0B;CHAM LETTER NGA;Lo;0;L;;;;;N;;;;; AA0C;CHAM LETTER CHA;Lo;0;L;;;;;N;;;;; AA0D;CHAM LETTER CHHA;Lo;0;L;;;;;N;;;;; AA0E;CHAM LETTER JA;Lo;0;L;;;;;N;;;;; AA0F;CHAM LETTER JHA;Lo;0;L;;;;;N;;;;; AA10;CHAM LETTER NHUE;Lo;0;L;;;;;N;;;;; AA11;CHAM LETTER NHA;Lo;0;L;;;;;N;;;;; AA12;CHAM LETTER NHJA;Lo;0;L;;;;;N;;;;; AA13;CHAM LETTER TA;Lo;0;L;;;;;N;;;;; AA14;CHAM LETTER THA;Lo;0;L;;;;;N;;;;; AA15;CHAM LETTER DA;Lo;0;L;;;;;N;;;;; AA16;CHAM LETTER DHA;Lo;0;L;;;;;N;;;;; AA17;CHAM LETTER NUE;Lo;0;L;;;;;N;;;;; AA18;CHAM LETTER NA;Lo;0;L;;;;;N;;;;; AA19;CHAM LETTER DDA;Lo;0;L;;;;;N;;;;; AA1A;CHAM LETTER PA;Lo;0;L;;;;;N;;;;; AA1B;CHAM LETTER PPA;Lo;0;L;;;;;N;;;;; AA1C;CHAM LETTER PHA;Lo;0;L;;;;;N;;;;; AA1D;CHAM LETTER BA;Lo;0;L;;;;;N;;;;; AA1E;CHAM LETTER BHA;Lo;0;L;;;;;N;;;;; AA1F;CHAM LETTER MUE;Lo;0;L;;;;;N;;;;; AA20;CHAM LETTER MA;Lo;0;L;;;;;N;;;;; AA21;CHAM LETTER BBA;Lo;0;L;;;;;N;;;;; AA22;CHAM LETTER YA;Lo;0;L;;;;;N;;;;; AA23;CHAM LETTER RA;Lo;0;L;;;;;N;;;;; AA24;CHAM LETTER LA;Lo;0;L;;;;;N;;;;; AA25;CHAM LETTER VA;Lo;0;L;;;;;N;;;;; AA26;CHAM LETTER SSA;Lo;0;L;;;;;N;;;;; AA27;CHAM LETTER SA;Lo;0;L;;;;;N;;;;; AA28;CHAM LETTER HA;Lo;0;L;;;;;N;;;;; AA29;CHAM VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; AA2A;CHAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; AA2B;CHAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; AA2C;CHAM VOWEL SIGN EI;Mn;0;NSM;;;;;N;;;;; AA2D;CHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; AA2E;CHAM VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; AA2F;CHAM VOWEL SIGN O;Mc;0;L;;;;;N;;;;; AA30;CHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; AA31;CHAM VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; AA32;CHAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; AA33;CHAM CONSONANT SIGN YA;Mc;0;L;;;;;N;;;;; AA34;CHAM CONSONANT SIGN RA;Mc;0;L;;;;;N;;;;; AA35;CHAM CONSONANT SIGN LA;Mn;0;NSM;;;;;N;;;;; AA36;CHAM CONSONANT SIGN WA;Mn;0;NSM;;;;;N;;;;; AA40;CHAM LETTER FINAL K;Lo;0;L;;;;;N;;;;; AA41;CHAM LETTER FINAL G;Lo;0;L;;;;;N;;;;; AA42;CHAM LETTER FINAL NG;Lo;0;L;;;;;N;;;;; AA43;CHAM CONSONANT SIGN FINAL NG;Mn;0;NSM;;;;;N;;;;; AA44;CHAM LETTER FINAL CH;Lo;0;L;;;;;N;;;;; AA45;CHAM LETTER FINAL T;Lo;0;L;;;;;N;;;;; AA46;CHAM LETTER FINAL N;Lo;0;L;;;;;N;;;;; AA47;CHAM LETTER FINAL P;Lo;0;L;;;;;N;;;;; AA48;CHAM LETTER FINAL Y;Lo;0;L;;;;;N;;;;; AA49;CHAM LETTER FINAL R;Lo;0;L;;;;;N;;;;; AA4A;CHAM LETTER FINAL L;Lo;0;L;;;;;N;;;;; AA4B;CHAM LETTER FINAL SS;Lo;0;L;;;;;N;;;;; AA4C;CHAM CONSONANT SIGN FINAL M;Mn;0;NSM;;;;;N;;;;; AA4D;CHAM CONSONANT SIGN FINAL H;Mc;0;L;;;;;N;;;;; AA50;CHAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; AA51;CHAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; AA52;CHAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; AA53;CHAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; AA54;CHAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; AA55;CHAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; AA56;CHAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; AA57;CHAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; AA58;CHAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; AA59;CHAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; AA5C;CHAM PUNCTUATION SPIRAL;Po;0;L;;;;;N;;;;; AA5D;CHAM PUNCTUATION DANDA;Po;0;L;;;;;N;;;;; AA5E;CHAM PUNCTUATION DOUBLE DANDA;Po;0;L;;;;;N;;;;; AA5F;CHAM PUNCTUATION TRIPLE DANDA;Po;0;L;;;;;N;;;;; AA60;MYANMAR LETTER KHAMTI GA;Lo;0;L;;;;;N;;;;; AA61;MYANMAR LETTER KHAMTI CA;Lo;0;L;;;;;N;;;;; AA62;MYANMAR LETTER KHAMTI CHA;Lo;0;L;;;;;N;;;;; AA63;MYANMAR LETTER KHAMTI JA;Lo;0;L;;;;;N;;;;; AA64;MYANMAR LETTER KHAMTI JHA;Lo;0;L;;;;;N;;;;; AA65;MYANMAR LETTER KHAMTI NYA;Lo;0;L;;;;;N;;;;; AA66;MYANMAR LETTER KHAMTI TTA;Lo;0;L;;;;;N;;;;; AA67;MYANMAR LETTER KHAMTI TTHA;Lo;0;L;;;;;N;;;;; AA68;MYANMAR LETTER KHAMTI DDA;Lo;0;L;;;;;N;;;;; AA69;MYANMAR LETTER KHAMTI DDHA;Lo;0;L;;;;;N;;;;; AA6A;MYANMAR LETTER KHAMTI DHA;Lo;0;L;;;;;N;;;;; AA6B;MYANMAR LETTER KHAMTI NA;Lo;0;L;;;;;N;;;;; AA6C;MYANMAR LETTER KHAMTI SA;Lo;0;L;;;;;N;;;;; AA6D;MYANMAR LETTER KHAMTI HA;Lo;0;L;;;;;N;;;;; AA6E;MYANMAR LETTER KHAMTI HHA;Lo;0;L;;;;;N;;;;; AA6F;MYANMAR LETTER KHAMTI FA;Lo;0;L;;;;;N;;;;; AA70;MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION;Lm;0;L;;;;;N;;;;; AA71;MYANMAR LETTER KHAMTI XA;Lo;0;L;;;;;N;;;;; AA72;MYANMAR LETTER KHAMTI ZA;Lo;0;L;;;;;N;;;;; AA73;MYANMAR LETTER KHAMTI RA;Lo;0;L;;;;;N;;;;; AA74;MYANMAR LOGOGRAM KHAMTI OAY;Lo;0;L;;;;;N;;;;; AA75;MYANMAR LOGOGRAM KHAMTI QN;Lo;0;L;;;;;N;;;;; AA76;MYANMAR LOGOGRAM KHAMTI HM;Lo;0;L;;;;;N;;;;; AA77;MYANMAR SYMBOL AITON EXCLAMATION;So;0;L;;;;;N;;;;; AA78;MYANMAR SYMBOL AITON ONE;So;0;L;;;;;N;;;;; AA79;MYANMAR SYMBOL AITON TWO;So;0;L;;;;;N;;;;; AA7A;MYANMAR LETTER AITON RA;Lo;0;L;;;;;N;;;;; AA7B;MYANMAR SIGN PAO KAREN TONE;Mc;0;L;;;;;N;;;;; AA7C;MYANMAR SIGN TAI LAING TONE-2;Mn;0;NSM;;;;;N;;;;; AA7D;MYANMAR SIGN TAI LAING TONE-5;Mc;0;L;;;;;N;;;;; AA7E;MYANMAR LETTER SHWE PALAUNG CHA;Lo;0;L;;;;;N;;;;; AA7F;MYANMAR LETTER SHWE PALAUNG SHA;Lo;0;L;;;;;N;;;;; AA80;TAI VIET LETTER LOW KO;Lo;0;L;;;;;N;;;;; AA81;TAI VIET LETTER HIGH KO;Lo;0;L;;;;;N;;;;; AA82;TAI VIET LETTER LOW KHO;Lo;0;L;;;;;N;;;;; AA83;TAI VIET LETTER HIGH KHO;Lo;0;L;;;;;N;;;;; AA84;TAI VIET LETTER LOW KHHO;Lo;0;L;;;;;N;;;;; AA85;TAI VIET LETTER HIGH KHHO;Lo;0;L;;;;;N;;;;; AA86;TAI VIET LETTER LOW GO;Lo;0;L;;;;;N;;;;; AA87;TAI VIET LETTER HIGH GO;Lo;0;L;;;;;N;;;;; AA88;TAI VIET LETTER LOW NGO;Lo;0;L;;;;;N;;;;; AA89;TAI VIET LETTER HIGH NGO;Lo;0;L;;;;;N;;;;; AA8A;TAI VIET LETTER LOW CO;Lo;0;L;;;;;N;;;;; AA8B;TAI VIET LETTER HIGH CO;Lo;0;L;;;;;N;;;;; AA8C;TAI VIET LETTER LOW CHO;Lo;0;L;;;;;N;;;;; AA8D;TAI VIET LETTER HIGH CHO;Lo;0;L;;;;;N;;;;; AA8E;TAI VIET LETTER LOW SO;Lo;0;L;;;;;N;;;;; AA8F;TAI VIET LETTER HIGH SO;Lo;0;L;;;;;N;;;;; AA90;TAI VIET LETTER LOW NYO;Lo;0;L;;;;;N;;;;; AA91;TAI VIET LETTER HIGH NYO;Lo;0;L;;;;;N;;;;; AA92;TAI VIET LETTER LOW DO;Lo;0;L;;;;;N;;;;; AA93;TAI VIET LETTER HIGH DO;Lo;0;L;;;;;N;;;;; AA94;TAI VIET LETTER LOW TO;Lo;0;L;;;;;N;;;;; AA95;TAI VIET LETTER HIGH TO;Lo;0;L;;;;;N;;;;; AA96;TAI VIET LETTER LOW THO;Lo;0;L;;;;;N;;;;; AA97;TAI VIET LETTER HIGH THO;Lo;0;L;;;;;N;;;;; AA98;TAI VIET LETTER LOW NO;Lo;0;L;;;;;N;;;;; AA99;TAI VIET LETTER HIGH NO;Lo;0;L;;;;;N;;;;; AA9A;TAI VIET LETTER LOW BO;Lo;0;L;;;;;N;;;;; AA9B;TAI VIET LETTER HIGH BO;Lo;0;L;;;;;N;;;;; AA9C;TAI VIET LETTER LOW PO;Lo;0;L;;;;;N;;;;; AA9D;TAI VIET LETTER HIGH PO;Lo;0;L;;;;;N;;;;; AA9E;TAI VIET LETTER LOW PHO;Lo;0;L;;;;;N;;;;; AA9F;TAI VIET LETTER HIGH PHO;Lo;0;L;;;;;N;;;;; AAA0;TAI VIET LETTER LOW FO;Lo;0;L;;;;;N;;;;; AAA1;TAI VIET LETTER HIGH FO;Lo;0;L;;;;;N;;;;; AAA2;TAI VIET LETTER LOW MO;Lo;0;L;;;;;N;;;;; AAA3;TAI VIET LETTER HIGH MO;Lo;0;L;;;;;N;;;;; AAA4;TAI VIET LETTER LOW YO;Lo;0;L;;;;;N;;;;; AAA5;TAI VIET LETTER HIGH YO;Lo;0;L;;;;;N;;;;; AAA6;TAI VIET LETTER LOW RO;Lo;0;L;;;;;N;;;;; AAA7;TAI VIET LETTER HIGH RO;Lo;0;L;;;;;N;;;;; AAA8;TAI VIET LETTER LOW LO;Lo;0;L;;;;;N;;;;; AAA9;TAI VIET LETTER HIGH LO;Lo;0;L;;;;;N;;;;; AAAA;TAI VIET LETTER LOW VO;Lo;0;L;;;;;N;;;;; AAAB;TAI VIET LETTER HIGH VO;Lo;0;L;;;;;N;;;;; AAAC;TAI VIET LETTER LOW HO;Lo;0;L;;;;;N;;;;; AAAD;TAI VIET LETTER HIGH HO;Lo;0;L;;;;;N;;;;; AAAE;TAI VIET LETTER LOW O;Lo;0;L;;;;;N;;;;; AAAF;TAI VIET LETTER HIGH O;Lo;0;L;;;;;N;;;;; AAB0;TAI VIET MAI KANG;Mn;230;NSM;;;;;N;;;;; AAB1;TAI VIET VOWEL AA;Lo;0;L;;;;;N;;;;; AAB2;TAI VIET VOWEL I;Mn;230;NSM;;;;;N;;;;; AAB3;TAI VIET VOWEL UE;Mn;230;NSM;;;;;N;;;;; AAB4;TAI VIET VOWEL U;Mn;220;NSM;;;;;N;;;;; AAB5;TAI VIET VOWEL E;Lo;0;L;;;;;N;;;;; AAB6;TAI VIET VOWEL O;Lo;0;L;;;;;N;;;;; AAB7;TAI VIET MAI KHIT;Mn;230;NSM;;;;;N;;;;; AAB8;TAI VIET VOWEL IA;Mn;230;NSM;;;;;N;;;;; AAB9;TAI VIET VOWEL UEA;Lo;0;L;;;;;N;;;;; AABA;TAI VIET VOWEL UA;Lo;0;L;;;;;N;;;;; AABB;TAI VIET VOWEL AUE;Lo;0;L;;;;;N;;;;; AABC;TAI VIET VOWEL AY;Lo;0;L;;;;;N;;;;; AABD;TAI VIET VOWEL AN;Lo;0;L;;;;;N;;;;; AABE;TAI VIET VOWEL AM;Mn;230;NSM;;;;;N;;;;; AABF;TAI VIET TONE MAI EK;Mn;230;NSM;;;;;N;;;;; AAC0;TAI VIET TONE MAI NUENG;Lo;0;L;;;;;N;;;;; AAC1;TAI VIET TONE MAI THO;Mn;230;NSM;;;;;N;;;;; AAC2;TAI VIET TONE MAI SONG;Lo;0;L;;;;;N;;;;; AADB;TAI VIET SYMBOL KON;Lo;0;L;;;;;N;;;;; AADC;TAI VIET SYMBOL NUENG;Lo;0;L;;;;;N;;;;; AADD;TAI VIET SYMBOL SAM;Lm;0;L;;;;;N;;;;; AADE;TAI VIET SYMBOL HO HOI;Po;0;L;;;;;N;;;;; AADF;TAI VIET SYMBOL KOI KOI;Po;0;L;;;;;N;;;;; AAE0;MEETEI MAYEK LETTER E;Lo;0;L;;;;;N;;;;; AAE1;MEETEI MAYEK LETTER O;Lo;0;L;;;;;N;;;;; AAE2;MEETEI MAYEK LETTER CHA;Lo;0;L;;;;;N;;;;; AAE3;MEETEI MAYEK LETTER NYA;Lo;0;L;;;;;N;;;;; AAE4;MEETEI MAYEK LETTER TTA;Lo;0;L;;;;;N;;;;; AAE5;MEETEI MAYEK LETTER TTHA;Lo;0;L;;;;;N;;;;; AAE6;MEETEI MAYEK LETTER DDA;Lo;0;L;;;;;N;;;;; AAE7;MEETEI MAYEK LETTER DDHA;Lo;0;L;;;;;N;;;;; AAE8;MEETEI MAYEK LETTER NNA;Lo;0;L;;;;;N;;;;; AAE9;MEETEI MAYEK LETTER SHA;Lo;0;L;;;;;N;;;;; AAEA;MEETEI MAYEK LETTER SSA;Lo;0;L;;;;;N;;;;; AAEB;MEETEI MAYEK VOWEL SIGN II;Mc;0;L;;;;;N;;;;; AAEC;MEETEI MAYEK VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; AAED;MEETEI MAYEK VOWEL SIGN AAI;Mn;0;NSM;;;;;N;;;;; AAEE;MEETEI MAYEK VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; AAEF;MEETEI MAYEK VOWEL SIGN AAU;Mc;0;L;;;;;N;;;;; AAF0;MEETEI MAYEK CHEIKHAN;Po;0;L;;;;;N;;;;; AAF1;MEETEI MAYEK AHANG KHUDAM;Po;0;L;;;;;N;;;;; AAF2;MEETEI MAYEK ANJI;Lo;0;L;;;;;N;;;;; AAF3;MEETEI MAYEK SYLLABLE REPETITION MARK;Lm;0;L;;;;;N;;;;; AAF4;MEETEI MAYEK WORD REPETITION MARK;Lm;0;L;;;;;N;;;;; AAF5;MEETEI MAYEK VOWEL SIGN VISARGA;Mc;0;L;;;;;N;;;;; AAF6;MEETEI MAYEK VIRAMA;Mn;9;NSM;;;;;N;;;;; AB01;ETHIOPIC SYLLABLE TTHU;Lo;0;L;;;;;N;;;;; AB02;ETHIOPIC SYLLABLE TTHI;Lo;0;L;;;;;N;;;;; AB03;ETHIOPIC SYLLABLE TTHAA;Lo;0;L;;;;;N;;;;; AB04;ETHIOPIC SYLLABLE TTHEE;Lo;0;L;;;;;N;;;;; AB05;ETHIOPIC SYLLABLE TTHE;Lo;0;L;;;;;N;;;;; AB06;ETHIOPIC SYLLABLE TTHO;Lo;0;L;;;;;N;;;;; AB09;ETHIOPIC SYLLABLE DDHU;Lo;0;L;;;;;N;;;;; AB0A;ETHIOPIC SYLLABLE DDHI;Lo;0;L;;;;;N;;;;; AB0B;ETHIOPIC SYLLABLE DDHAA;Lo;0;L;;;;;N;;;;; AB0C;ETHIOPIC SYLLABLE DDHEE;Lo;0;L;;;;;N;;;;; AB0D;ETHIOPIC SYLLABLE DDHE;Lo;0;L;;;;;N;;;;; AB0E;ETHIOPIC SYLLABLE DDHO;Lo;0;L;;;;;N;;;;; AB11;ETHIOPIC SYLLABLE DZU;Lo;0;L;;;;;N;;;;; AB12;ETHIOPIC SYLLABLE DZI;Lo;0;L;;;;;N;;;;; AB13;ETHIOPIC SYLLABLE DZAA;Lo;0;L;;;;;N;;;;; AB14;ETHIOPIC SYLLABLE DZEE;Lo;0;L;;;;;N;;;;; AB15;ETHIOPIC SYLLABLE DZE;Lo;0;L;;;;;N;;;;; AB16;ETHIOPIC SYLLABLE DZO;Lo;0;L;;;;;N;;;;; AB20;ETHIOPIC SYLLABLE CCHHA;Lo;0;L;;;;;N;;;;; AB21;ETHIOPIC SYLLABLE CCHHU;Lo;0;L;;;;;N;;;;; AB22;ETHIOPIC SYLLABLE CCHHI;Lo;0;L;;;;;N;;;;; AB23;ETHIOPIC SYLLABLE CCHHAA;Lo;0;L;;;;;N;;;;; AB24;ETHIOPIC SYLLABLE CCHHEE;Lo;0;L;;;;;N;;;;; AB25;ETHIOPIC SYLLABLE CCHHE;Lo;0;L;;;;;N;;;;; AB26;ETHIOPIC SYLLABLE CCHHO;Lo;0;L;;;;;N;;;;; AB28;ETHIOPIC SYLLABLE BBA;Lo;0;L;;;;;N;;;;; AB29;ETHIOPIC SYLLABLE BBU;Lo;0;L;;;;;N;;;;; AB2A;ETHIOPIC SYLLABLE BBI;Lo;0;L;;;;;N;;;;; AB2B;ETHIOPIC SYLLABLE BBAA;Lo;0;L;;;;;N;;;;; AB2C;ETHIOPIC SYLLABLE BBEE;Lo;0;L;;;;;N;;;;; AB2D;ETHIOPIC SYLLABLE BBE;Lo;0;L;;;;;N;;;;; AB2E;ETHIOPIC SYLLABLE BBO;Lo;0;L;;;;;N;;;;; AB30;LATIN SMALL LETTER BARRED ALPHA;Ll;0;L;;;;;N;;;;; AB31;LATIN SMALL LETTER A REVERSED-SCHWA;Ll;0;L;;;;;N;;;;; AB32;LATIN SMALL LETTER BLACKLETTER E;Ll;0;L;;;;;N;;;;; AB33;LATIN SMALL LETTER BARRED E;Ll;0;L;;;;;N;;;;; AB34;LATIN SMALL LETTER E WITH FLOURISH;Ll;0;L;;;;;N;;;;; AB35;LATIN SMALL LETTER LENIS F;Ll;0;L;;;;;N;;;;; AB36;LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; AB37;LATIN SMALL LETTER L WITH INVERTED LAZY S;Ll;0;L;;;;;N;;;;; AB38;LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE;Ll;0;L;;;;;N;;;;; AB39;LATIN SMALL LETTER L WITH MIDDLE RING;Ll;0;L;;;;;N;;;;; AB3A;LATIN SMALL LETTER M WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; AB3B;LATIN SMALL LETTER N WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; AB3C;LATIN SMALL LETTER ENG WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; AB3D;LATIN SMALL LETTER BLACKLETTER O;Ll;0;L;;;;;N;;;;; AB3E;LATIN SMALL LETTER BLACKLETTER O WITH STROKE;Ll;0;L;;;;;N;;;;; AB3F;LATIN SMALL LETTER OPEN O WITH STROKE;Ll;0;L;;;;;N;;;;; AB40;LATIN SMALL LETTER INVERTED OE;Ll;0;L;;;;;N;;;;; AB41;LATIN SMALL LETTER TURNED OE WITH STROKE;Ll;0;L;;;;;N;;;;; AB42;LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE;Ll;0;L;;;;;N;;;;; AB43;LATIN SMALL LETTER TURNED O OPEN-O;Ll;0;L;;;;;N;;;;; AB44;LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE;Ll;0;L;;;;;N;;;;; AB45;LATIN SMALL LETTER STIRRUP R;Ll;0;L;;;;;N;;;;; AB46;LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG;Ll;0;L;;;;;N;;;;; AB47;LATIN SMALL LETTER R WITHOUT HANDLE;Ll;0;L;;;;;N;;;;; AB48;LATIN SMALL LETTER DOUBLE R;Ll;0;L;;;;;N;;;;; AB49;LATIN SMALL LETTER R WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; AB4A;LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; AB4B;LATIN SMALL LETTER SCRIPT R;Ll;0;L;;;;;N;;;;; AB4C;LATIN SMALL LETTER SCRIPT R WITH RING;Ll;0;L;;;;;N;;;;; AB4D;LATIN SMALL LETTER BASELINE ESH;Ll;0;L;;;;;N;;;;; AB4E;LATIN SMALL LETTER U WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; AB4F;LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; AB50;LATIN SMALL LETTER UI;Ll;0;L;;;;;N;;;;; AB51;LATIN SMALL LETTER TURNED UI;Ll;0;L;;;;;N;;;;; AB52;LATIN SMALL LETTER U WITH LEFT HOOK;Ll;0;L;;;;;N;;;;; AB53;LATIN SMALL LETTER CHI;Ll;0;L;;;;;N;;;A7B3;;A7B3 AB54;LATIN SMALL LETTER CHI WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;; AB55;LATIN SMALL LETTER CHI WITH LOW LEFT SERIF;Ll;0;L;;;;;N;;;;; AB56;LATIN SMALL LETTER X WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;; AB57;LATIN SMALL LETTER X WITH LONG LEFT LEG;Ll;0;L;;;;;N;;;;; AB58;LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING;Ll;0;L;;;;;N;;;;; AB59;LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF;Ll;0;L;;;;;N;;;;; AB5A;LATIN SMALL LETTER Y WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; AB5B;MODIFIER BREVE WITH INVERTED BREVE;Sk;0;L;;;;;N;;;;; AB5C;MODIFIER LETTER SMALL HENG;Lm;0;L;<super> A727;;;;N;;;;; AB5D;MODIFIER LETTER SMALL L WITH INVERTED LAZY S;Lm;0;L;<super> AB37;;;;N;;;;; AB5E;MODIFIER LETTER SMALL L WITH MIDDLE TILDE;Lm;0;L;<super> 026B;;;;N;;;;; AB5F;MODIFIER LETTER SMALL U WITH LEFT HOOK;Lm;0;L;<super> AB52;;;;N;;;;; AB60;LATIN SMALL LETTER SAKHA YAT;Ll;0;L;;;;;N;;;;; AB61;LATIN SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;;; AB62;LATIN SMALL LETTER OPEN OE;Ll;0;L;;;;;N;;;;; AB63;LATIN SMALL LETTER UO;Ll;0;L;;;;;N;;;;; AB64;LATIN SMALL LETTER INVERTED ALPHA;Ll;0;L;;;;;N;;;;; AB65;GREEK LETTER SMALL CAPITAL OMEGA;Ll;0;L;;;;;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 AB73;CHEROKEE SMALL LETTER O;Ll;0;L;;;;;N;;;13A3;;13A3 AB74;CHEROKEE SMALL LETTER U;Ll;0;L;;;;;N;;;13A4;;13A4 AB75;CHEROKEE SMALL LETTER V;Ll;0;L;;;;;N;;;13A5;;13A5 AB76;CHEROKEE SMALL LETTER GA;Ll;0;L;;;;;N;;;13A6;;13A6 AB77;CHEROKEE SMALL LETTER KA;Ll;0;L;;;;;N;;;13A7;;13A7 AB78;CHEROKEE SMALL LETTER GE;Ll;0;L;;;;;N;;;13A8;;13A8 AB79;CHEROKEE SMALL LETTER GI;Ll;0;L;;;;;N;;;13A9;;13A9 AB7A;CHEROKEE SMALL LETTER GO;Ll;0;L;;;;;N;;;13AA;;13AA AB7B;CHEROKEE SMALL LETTER GU;Ll;0;L;;;;;N;;;13AB;;13AB AB7C;CHEROKEE SMALL LETTER GV;Ll;0;L;;;;;N;;;13AC;;13AC AB7D;CHEROKEE SMALL LETTER HA;Ll;0;L;;;;;N;;;13AD;;13AD AB7E;CHEROKEE SMALL LETTER HE;Ll;0;L;;;;;N;;;13AE;;13AE AB7F;CHEROKEE SMALL LETTER HI;Ll;0;L;;;;;N;;;13AF;;13AF AB80;CHEROKEE SMALL LETTER HO;Ll;0;L;;;;;N;;;13B0;;13B0 AB81;CHEROKEE SMALL LETTER HU;Ll;0;L;;;;;N;;;13B1;;13B1 AB82;CHEROKEE SMALL LETTER HV;Ll;0;L;;;;;N;;;13B2;;13B2 AB83;CHEROKEE SMALL LETTER LA;Ll;0;L;;;;;N;;;13B3;;13B3 AB84;CHEROKEE SMALL LETTER LE;Ll;0;L;;;;;N;;;13B4;;13B4 AB85;CHEROKEE SMALL LETTER LI;Ll;0;L;;;;;N;;;13B5;;13B5 AB86;CHEROKEE SMALL LETTER LO;Ll;0;L;;;;;N;;;13B6;;13B6 AB87;CHEROKEE SMALL LETTER LU;Ll;0;L;;;;;N;;;13B7;;13B7 AB88;CHEROKEE SMALL LETTER LV;Ll;0;L;;;;;N;;;13B8;;13B8 AB89;CHEROKEE SMALL LETTER MA;Ll;0;L;;;;;N;;;13B9;;13B9 AB8A;CHEROKEE SMALL LETTER ME;Ll;0;L;;;;;N;;;13BA;;13BA AB8B;CHEROKEE SMALL LETTER MI;Ll;0;L;;;;;N;;;13BB;;13BB AB8C;CHEROKEE SMALL LETTER MO;Ll;0;L;;;;;N;;;13BC;;13BC AB8D;CHEROKEE SMALL LETTER MU;Ll;0;L;;;;;N;;;13BD;;13BD AB8E;CHEROKEE SMALL LETTER NA;Ll;0;L;;;;;N;;;13BE;;13BE AB8F;CHEROKEE SMALL LETTER HNA;Ll;0;L;;;;;N;;;13BF;;13BF AB90;CHEROKEE SMALL LETTER NAH;Ll;0;L;;;;;N;;;13C0;;13C0 AB91;CHEROKEE SMALL LETTER NE;Ll;0;L;;;;;N;;;13C1;;13C1 AB92;CHEROKEE SMALL LETTER NI;Ll;0;L;;;;;N;;;13C2;;13C2 AB93;CHEROKEE SMALL LETTER NO;Ll;0;L;;;;;N;;;13C3;;13C3 AB94;CHEROKEE SMALL LETTER NU;Ll;0;L;;;;;N;;;13C4;;13C4 AB95;CHEROKEE SMALL LETTER NV;Ll;0;L;;;;;N;;;13C5;;13C5 AB96;CHEROKEE SMALL LETTER QUA;Ll;0;L;;;;;N;;;13C6;;13C6 AB97;CHEROKEE SMALL LETTER QUE;Ll;0;L;;;;;N;;;13C7;;13C7 AB98;CHEROKEE SMALL LETTER QUI;Ll;0;L;;;;;N;;;13C8;;13C8 AB99;CHEROKEE SMALL LETTER QUO;Ll;0;L;;;;;N;;;13C9;;13C9 AB9A;CHEROKEE SMALL LETTER QUU;Ll;0;L;;;;;N;;;13CA;;13CA AB9B;CHEROKEE SMALL LETTER QUV;Ll;0;L;;;;;N;;;13CB;;13CB AB9C;CHEROKEE SMALL LETTER SA;Ll;0;L;;;;;N;;;13CC;;13CC AB9D;CHEROKEE SMALL LETTER S;Ll;0;L;;;;;N;;;13CD;;13CD AB9E;CHEROKEE SMALL LETTER SE;Ll;0;L;;;;;N;;;13CE;;13CE AB9F;CHEROKEE SMALL LETTER SI;Ll;0;L;;;;;N;;;13CF;;13CF ABA0;CHEROKEE SMALL LETTER SO;Ll;0;L;;;;;N;;;13D0;;13D0 ABA1;CHEROKEE SMALL LETTER SU;Ll;0;L;;;;;N;;;13D1;;13D1 ABA2;CHEROKEE SMALL LETTER SV;Ll;0;L;;;;;N;;;13D2;;13D2 ABA3;CHEROKEE SMALL LETTER DA;Ll;0;L;;;;;N;;;13D3;;13D3 ABA4;CHEROKEE SMALL LETTER TA;Ll;0;L;;;;;N;;;13D4;;13D4 ABA5;CHEROKEE SMALL LETTER DE;Ll;0;L;;;;;N;;;13D5;;13D5 ABA6;CHEROKEE SMALL LETTER TE;Ll;0;L;;;;;N;;;13D6;;13D6 ABA7;CHEROKEE SMALL LETTER DI;Ll;0;L;;;;;N;;;13D7;;13D7 ABA8;CHEROKEE SMALL LETTER TI;Ll;0;L;;;;;N;;;13D8;;13D8 ABA9;CHEROKEE SMALL LETTER DO;Ll;0;L;;;;;N;;;13D9;;13D9 ABAA;CHEROKEE SMALL LETTER DU;Ll;0;L;;;;;N;;;13DA;;13DA ABAB;CHEROKEE SMALL LETTER DV;Ll;0;L;;;;;N;;;13DB;;13DB ABAC;CHEROKEE SMALL LETTER DLA;Ll;0;L;;;;;N;;;13DC;;13DC ABAD;CHEROKEE SMALL LETTER TLA;Ll;0;L;;;;;N;;;13DD;;13DD ABAE;CHEROKEE SMALL LETTER TLE;Ll;0;L;;;;;N;;;13DE;;13DE ABAF;CHEROKEE SMALL LETTER TLI;Ll;0;L;;;;;N;;;13DF;;13DF ABB0;CHEROKEE SMALL LETTER TLO;Ll;0;L;;;;;N;;;13E0;;13E0 ABB1;CHEROKEE SMALL LETTER TLU;Ll;0;L;;;;;N;;;13E1;;13E1 ABB2;CHEROKEE SMALL LETTER TLV;Ll;0;L;;;;;N;;;13E2;;13E2 ABB3;CHEROKEE SMALL LETTER TSA;Ll;0;L;;;;;N;;;13E3;;13E3 ABB4;CHEROKEE SMALL LETTER TSE;Ll;0;L;;;;;N;;;13E4;;13E4 ABB5;CHEROKEE SMALL LETTER TSI;Ll;0;L;;;;;N;;;13E5;;13E5 ABB6;CHEROKEE SMALL LETTER TSO;Ll;0;L;;;;;N;;;13E6;;13E6 ABB7;CHEROKEE SMALL LETTER TSU;Ll;0;L;;;;;N;;;13E7;;13E7 ABB8;CHEROKEE SMALL LETTER TSV;Ll;0;L;;;;;N;;;13E8;;13E8 ABB9;CHEROKEE SMALL LETTER WA;Ll;0;L;;;;;N;;;13E9;;13E9 ABBA;CHEROKEE SMALL LETTER WE;Ll;0;L;;;;;N;;;13EA;;13EA ABBB;CHEROKEE SMALL LETTER WI;Ll;0;L;;;;;N;;;13EB;;13EB ABBC;CHEROKEE SMALL LETTER WO;Ll;0;L;;;;;N;;;13EC;;13EC ABBD;CHEROKEE SMALL LETTER WU;Ll;0;L;;;;;N;;;13ED;;13ED ABBE;CHEROKEE SMALL LETTER WV;Ll;0;L;;;;;N;;;13EE;;13EE ABBF;CHEROKEE SMALL LETTER YA;Ll;0;L;;;;;N;;;13EF;;13EF ABC0;MEETEI MAYEK LETTER KOK;Lo;0;L;;;;;N;;;;; ABC1;MEETEI MAYEK LETTER SAM;Lo;0;L;;;;;N;;;;; ABC2;MEETEI MAYEK LETTER LAI;Lo;0;L;;;;;N;;;;; ABC3;MEETEI MAYEK LETTER MIT;Lo;0;L;;;;;N;;;;; ABC4;MEETEI MAYEK LETTER PA;Lo;0;L;;;;;N;;;;; ABC5;MEETEI MAYEK LETTER NA;Lo;0;L;;;;;N;;;;; ABC6;MEETEI MAYEK LETTER CHIL;Lo;0;L;;;;;N;;;;; ABC7;MEETEI MAYEK LETTER TIL;Lo;0;L;;;;;N;;;;; ABC8;MEETEI MAYEK LETTER KHOU;Lo;0;L;;;;;N;;;;; ABC9;MEETEI MAYEK LETTER NGOU;Lo;0;L;;;;;N;;;;; ABCA;MEETEI MAYEK LETTER THOU;Lo;0;L;;;;;N;;;;; ABCB;MEETEI MAYEK LETTER WAI;Lo;0;L;;;;;N;;;;; ABCC;MEETEI MAYEK LETTER YANG;Lo;0;L;;;;;N;;;;; ABCD;MEETEI MAYEK LETTER HUK;Lo;0;L;;;;;N;;;;; ABCE;MEETEI MAYEK LETTER UN;Lo;0;L;;;;;N;;;;; ABCF;MEETEI MAYEK LETTER I;Lo;0;L;;;;;N;;;;; ABD0;MEETEI MAYEK LETTER PHAM;Lo;0;L;;;;;N;;;;; ABD1;MEETEI MAYEK LETTER ATIYA;Lo;0;L;;;;;N;;;;; ABD2;MEETEI MAYEK LETTER GOK;Lo;0;L;;;;;N;;;;; ABD3;MEETEI MAYEK LETTER JHAM;Lo;0;L;;;;;N;;;;; ABD4;MEETEI MAYEK LETTER RAI;Lo;0;L;;;;;N;;;;; ABD5;MEETEI MAYEK LETTER BA;Lo;0;L;;;;;N;;;;; ABD6;MEETEI MAYEK LETTER JIL;Lo;0;L;;;;;N;;;;; ABD7;MEETEI MAYEK LETTER DIL;Lo;0;L;;;;;N;;;;; ABD8;MEETEI MAYEK LETTER GHOU;Lo;0;L;;;;;N;;;;; ABD9;MEETEI MAYEK LETTER DHOU;Lo;0;L;;;;;N;;;;; ABDA;MEETEI MAYEK LETTER BHAM;Lo;0;L;;;;;N;;;;; ABDB;MEETEI MAYEK LETTER KOK LONSUM;Lo;0;L;;;;;N;;;;; ABDC;MEETEI MAYEK LETTER LAI LONSUM;Lo;0;L;;;;;N;;;;; ABDD;MEETEI MAYEK LETTER MIT LONSUM;Lo;0;L;;;;;N;;;;; ABDE;MEETEI MAYEK LETTER PA LONSUM;Lo;0;L;;;;;N;;;;; ABDF;MEETEI MAYEK LETTER NA LONSUM;Lo;0;L;;;;;N;;;;; ABE0;MEETEI MAYEK LETTER TIL LONSUM;Lo;0;L;;;;;N;;;;; ABE1;MEETEI MAYEK LETTER NGOU LONSUM;Lo;0;L;;;;;N;;;;; ABE2;MEETEI MAYEK LETTER I LONSUM;Lo;0;L;;;;;N;;;;; ABE3;MEETEI MAYEK VOWEL SIGN ONAP;Mc;0;L;;;;;N;;;;; ABE4;MEETEI MAYEK VOWEL SIGN INAP;Mc;0;L;;;;;N;;;;; ABE5;MEETEI MAYEK VOWEL SIGN ANAP;Mn;0;NSM;;;;;N;;;;; ABE6;MEETEI MAYEK VOWEL SIGN YENAP;Mc;0;L;;;;;N;;;;; ABE7;MEETEI MAYEK VOWEL SIGN SOUNAP;Mc;0;L;;;;;N;;;;; ABE8;MEETEI MAYEK VOWEL SIGN UNAP;Mn;0;NSM;;;;;N;;;;; ABE9;MEETEI MAYEK VOWEL SIGN CHEINAP;Mc;0;L;;;;;N;;;;; ABEA;MEETEI MAYEK VOWEL SIGN NUNG;Mc;0;L;;;;;N;;;;; ABEB;MEETEI MAYEK CHEIKHEI;Po;0;L;;;;;N;;;;; ABEC;MEETEI MAYEK LUM IYEK;Mc;0;L;;;;;N;;;;; ABED;MEETEI MAYEK APUN IYEK;Mn;9;NSM;;;;;N;;;;; ABF0;MEETEI MAYEK DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; ABF1;MEETEI MAYEK DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; ABF2;MEETEI MAYEK DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; ABF3;MEETEI MAYEK DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; ABF4;MEETEI MAYEK DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; ABF5;MEETEI MAYEK DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; ABF6;MEETEI MAYEK DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; ABF7;MEETEI MAYEK DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; ABF8;MEETEI MAYEK DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; ABF9;MEETEI MAYEK DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; AC00;<Hangul Syllable, First>;Lo;0;L;;;;;N;;;;; D7A3;<Hangul Syllable, Last>;Lo;0;L;;;;;N;;;;; D7B0;HANGUL JUNGSEONG O-YEO;Lo;0;L;;;;;N;;;;; D7B1;HANGUL JUNGSEONG O-O-I;Lo;0;L;;;;;N;;;;; D7B2;HANGUL JUNGSEONG YO-A;Lo;0;L;;;;;N;;;;; D7B3;HANGUL JUNGSEONG YO-AE;Lo;0;L;;;;;N;;;;; D7B4;HANGUL JUNGSEONG YO-EO;Lo;0;L;;;;;N;;;;; D7B5;HANGUL JUNGSEONG U-YEO;Lo;0;L;;;;;N;;;;; D7B6;HANGUL JUNGSEONG U-I-I;Lo;0;L;;;;;N;;;;; D7B7;HANGUL JUNGSEONG YU-AE;Lo;0;L;;;;;N;;;;; D7B8;HANGUL JUNGSEONG YU-O;Lo;0;L;;;;;N;;;;; D7B9;HANGUL JUNGSEONG EU-A;Lo;0;L;;;;;N;;;;; D7BA;HANGUL JUNGSEONG EU-EO;Lo;0;L;;;;;N;;;;; D7BB;HANGUL JUNGSEONG EU-E;Lo;0;L;;;;;N;;;;; D7BC;HANGUL JUNGSEONG EU-O;Lo;0;L;;;;;N;;;;; D7BD;HANGUL JUNGSEONG I-YA-O;Lo;0;L;;;;;N;;;;; D7BE;HANGUL JUNGSEONG I-YAE;Lo;0;L;;;;;N;;;;; D7BF;HANGUL JUNGSEONG I-YEO;Lo;0;L;;;;;N;;;;; D7C0;HANGUL JUNGSEONG I-YE;Lo;0;L;;;;;N;;;;; D7C1;HANGUL JUNGSEONG I-O-I;Lo;0;L;;;;;N;;;;; D7C2;HANGUL JUNGSEONG I-YO;Lo;0;L;;;;;N;;;;; D7C3;HANGUL JUNGSEONG I-YU;Lo;0;L;;;;;N;;;;; D7C4;HANGUL JUNGSEONG I-I;Lo;0;L;;;;;N;;;;; D7C5;HANGUL JUNGSEONG ARAEA-A;Lo;0;L;;;;;N;;;;; D7C6;HANGUL JUNGSEONG ARAEA-E;Lo;0;L;;;;;N;;;;; D7CB;HANGUL JONGSEONG NIEUN-RIEUL;Lo;0;L;;;;;N;;;;; D7CC;HANGUL JONGSEONG NIEUN-CHIEUCH;Lo;0;L;;;;;N;;;;; D7CD;HANGUL JONGSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;;;; D7CE;HANGUL JONGSEONG SSANGTIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; D7CF;HANGUL JONGSEONG TIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; D7D0;HANGUL JONGSEONG TIKEUT-SIOS;Lo;0;L;;;;;N;;;;; D7D1;HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; D7D2;HANGUL JONGSEONG TIKEUT-CIEUC;Lo;0;L;;;;;N;;;;; D7D3;HANGUL JONGSEONG TIKEUT-CHIEUCH;Lo;0;L;;;;;N;;;;; D7D4;HANGUL JONGSEONG TIKEUT-THIEUTH;Lo;0;L;;;;;N;;;;; D7D5;HANGUL JONGSEONG RIEUL-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; D7D6;HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH;Lo;0;L;;;;;N;;;;; D7D7;HANGUL JONGSEONG SSANGRIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; D7D8;HANGUL JONGSEONG RIEUL-MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; D7D9;HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; D7DA;HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; D7DB;HANGUL JONGSEONG RIEUL-YESIEUNG;Lo;0;L;;;;;N;;;;; D7DC;HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH;Lo;0;L;;;;;N;;;;; D7DD;HANGUL JONGSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; D7DE;HANGUL JONGSEONG MIEUM-NIEUN;Lo;0;L;;;;;N;;;;; D7DF;HANGUL JONGSEONG MIEUM-SSANGNIEUN;Lo;0;L;;;;;N;;;;; D7E0;HANGUL JONGSEONG SSANGMIEUM;Lo;0;L;;;;;N;;;;; D7E1;HANGUL JONGSEONG MIEUM-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; D7E2;HANGUL JONGSEONG MIEUM-CIEUC;Lo;0;L;;;;;N;;;;; D7E3;HANGUL JONGSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; D7E4;HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH;Lo;0;L;;;;;N;;;;; D7E5;HANGUL JONGSEONG PIEUP-MIEUM;Lo;0;L;;;;;N;;;;; D7E6;HANGUL JONGSEONG SSANGPIEUP;Lo;0;L;;;;;N;;;;; D7E7;HANGUL JONGSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; D7E8;HANGUL JONGSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; D7E9;HANGUL JONGSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; D7EA;HANGUL JONGSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; D7EB;HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; D7EC;HANGUL JONGSEONG SSANGSIOS-KIYEOK;Lo;0;L;;;;;N;;;;; D7ED;HANGUL JONGSEONG SSANGSIOS-TIKEUT;Lo;0;L;;;;;N;;;;; D7EE;HANGUL JONGSEONG SIOS-PANSIOS;Lo;0;L;;;;;N;;;;; D7EF;HANGUL JONGSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; D7F0;HANGUL JONGSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; D7F1;HANGUL JONGSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; D7F2;HANGUL JONGSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; D7F3;HANGUL JONGSEONG PANSIOS-PIEUP;Lo;0;L;;;;;N;;;;; D7F4;HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; D7F5;HANGUL JONGSEONG YESIEUNG-MIEUM;Lo;0;L;;;;;N;;;;; D7F6;HANGUL JONGSEONG YESIEUNG-HIEUH;Lo;0;L;;;;;N;;;;; D7F7;HANGUL JONGSEONG CIEUC-PIEUP;Lo;0;L;;;;;N;;;;; D7F8;HANGUL JONGSEONG CIEUC-SSANGPIEUP;Lo;0;L;;;;;N;;;;; D7F9;HANGUL JONGSEONG SSANGCIEUC;Lo;0;L;;;;;N;;;;; D7FA;HANGUL JONGSEONG PHIEUPH-SIOS;Lo;0;L;;;;;N;;;;; D7FB;HANGUL JONGSEONG PHIEUPH-THIEUTH;Lo;0;L;;;;;N;;;;; D800;<Non Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;; DB7F;<Non Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;; DB80;<Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;; DBFF;<Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;; DC00;<Low Surrogate, First>;Cs;0;L;;;;;N;;;;; DFFF;<Low Surrogate, Last>;Cs;0;L;;;;;N;;;;; E000;<Private Use, First>;Co;0;L;;;;;N;;;;; F8FF;<Private Use, Last>;Co;0;L;;;;;N;;;;; F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;; F901;CJK COMPATIBILITY IDEOGRAPH-F901;Lo;0;L;66F4;;;;N;;;;; F902;CJK COMPATIBILITY IDEOGRAPH-F902;Lo;0;L;8ECA;;;;N;;;;; F903;CJK COMPATIBILITY IDEOGRAPH-F903;Lo;0;L;8CC8;;;;N;;;;; F904;CJK COMPATIBILITY IDEOGRAPH-F904;Lo;0;L;6ED1;;;;N;;;;; F905;CJK COMPATIBILITY IDEOGRAPH-F905;Lo;0;L;4E32;;;;N;;;;; F906;CJK COMPATIBILITY IDEOGRAPH-F906;Lo;0;L;53E5;;;;N;;;;; F907;CJK COMPATIBILITY IDEOGRAPH-F907;Lo;0;L;9F9C;;;;N;;;;; F908;CJK COMPATIBILITY IDEOGRAPH-F908;Lo;0;L;9F9C;;;;N;;;;; F909;CJK COMPATIBILITY IDEOGRAPH-F909;Lo;0;L;5951;;;;N;;;;; F90A;CJK COMPATIBILITY IDEOGRAPH-F90A;Lo;0;L;91D1;;;;N;;;;; F90B;CJK COMPATIBILITY IDEOGRAPH-F90B;Lo;0;L;5587;;;;N;;;;; F90C;CJK COMPATIBILITY IDEOGRAPH-F90C;Lo;0;L;5948;;;;N;;;;; F90D;CJK COMPATIBILITY IDEOGRAPH-F90D;Lo;0;L;61F6;;;;N;;;;; F90E;CJK COMPATIBILITY IDEOGRAPH-F90E;Lo;0;L;7669;;;;N;;;;; F90F;CJK COMPATIBILITY IDEOGRAPH-F90F;Lo;0;L;7F85;;;;N;;;;; F910;CJK COMPATIBILITY IDEOGRAPH-F910;Lo;0;L;863F;;;;N;;;;; F911;CJK COMPATIBILITY IDEOGRAPH-F911;Lo;0;L;87BA;;;;N;;;;; F912;CJK COMPATIBILITY IDEOGRAPH-F912;Lo;0;L;88F8;;;;N;;;;; F913;CJK COMPATIBILITY IDEOGRAPH-F913;Lo;0;L;908F;;;;N;;;;; F914;CJK COMPATIBILITY IDEOGRAPH-F914;Lo;0;L;6A02;;;;N;;;;; F915;CJK COMPATIBILITY IDEOGRAPH-F915;Lo;0;L;6D1B;;;;N;;;;; F916;CJK COMPATIBILITY IDEOGRAPH-F916;Lo;0;L;70D9;;;;N;;;;; F917;CJK COMPATIBILITY IDEOGRAPH-F917;Lo;0;L;73DE;;;;N;;;;; F918;CJK COMPATIBILITY IDEOGRAPH-F918;Lo;0;L;843D;;;;N;;;;; F919;CJK COMPATIBILITY IDEOGRAPH-F919;Lo;0;L;916A;;;;N;;;;; F91A;CJK COMPATIBILITY IDEOGRAPH-F91A;Lo;0;L;99F1;;;;N;;;;; F91B;CJK COMPATIBILITY IDEOGRAPH-F91B;Lo;0;L;4E82;;;;N;;;;; F91C;CJK COMPATIBILITY IDEOGRAPH-F91C;Lo;0;L;5375;;;;N;;;;; F91D;CJK COMPATIBILITY IDEOGRAPH-F91D;Lo;0;L;6B04;;;;N;;;;; F91E;CJK COMPATIBILITY IDEOGRAPH-F91E;Lo;0;L;721B;;;;N;;;;; F91F;CJK COMPATIBILITY IDEOGRAPH-F91F;Lo;0;L;862D;;;;N;;;;; F920;CJK COMPATIBILITY IDEOGRAPH-F920;Lo;0;L;9E1E;;;;N;;;;; F921;CJK COMPATIBILITY IDEOGRAPH-F921;Lo;0;L;5D50;;;;N;;;;; F922;CJK COMPATIBILITY IDEOGRAPH-F922;Lo;0;L;6FEB;;;;N;;;;; F923;CJK COMPATIBILITY IDEOGRAPH-F923;Lo;0;L;85CD;;;;N;;;;; F924;CJK COMPATIBILITY IDEOGRAPH-F924;Lo;0;L;8964;;;;N;;;;; F925;CJK COMPATIBILITY IDEOGRAPH-F925;Lo;0;L;62C9;;;;N;;;;; F926;CJK COMPATIBILITY IDEOGRAPH-F926;Lo;0;L;81D8;;;;N;;;;; F927;CJK COMPATIBILITY IDEOGRAPH-F927;Lo;0;L;881F;;;;N;;;;; F928;CJK COMPATIBILITY IDEOGRAPH-F928;Lo;0;L;5ECA;;;;N;;;;; F929;CJK COMPATIBILITY IDEOGRAPH-F929;Lo;0;L;6717;;;;N;;;;; F92A;CJK COMPATIBILITY IDEOGRAPH-F92A;Lo;0;L;6D6A;;;;N;;;;; F92B;CJK COMPATIBILITY IDEOGRAPH-F92B;Lo;0;L;72FC;;;;N;;;;; F92C;CJK COMPATIBILITY IDEOGRAPH-F92C;Lo;0;L;90CE;;;;N;;;;; F92D;CJK COMPATIBILITY IDEOGRAPH-F92D;Lo;0;L;4F86;;;;N;;;;; F92E;CJK COMPATIBILITY IDEOGRAPH-F92E;Lo;0;L;51B7;;;;N;;;;; F92F;CJK COMPATIBILITY IDEOGRAPH-F92F;Lo;0;L;52DE;;;;N;;;;; F930;CJK COMPATIBILITY IDEOGRAPH-F930;Lo;0;L;64C4;;;;N;;;;; F931;CJK COMPATIBILITY IDEOGRAPH-F931;Lo;0;L;6AD3;;;;N;;;;; F932;CJK COMPATIBILITY IDEOGRAPH-F932;Lo;0;L;7210;;;;N;;;;; F933;CJK COMPATIBILITY IDEOGRAPH-F933;Lo;0;L;76E7;;;;N;;;;; F934;CJK COMPATIBILITY IDEOGRAPH-F934;Lo;0;L;8001;;;;N;;;;; F935;CJK COMPATIBILITY IDEOGRAPH-F935;Lo;0;L;8606;;;;N;;;;; F936;CJK COMPATIBILITY IDEOGRAPH-F936;Lo;0;L;865C;;;;N;;;;; F937;CJK COMPATIBILITY IDEOGRAPH-F937;Lo;0;L;8DEF;;;;N;;;;; F938;CJK COMPATIBILITY IDEOGRAPH-F938;Lo;0;L;9732;;;;N;;;;; F939;CJK COMPATIBILITY IDEOGRAPH-F939;Lo;0;L;9B6F;;;;N;;;;; F93A;CJK COMPATIBILITY IDEOGRAPH-F93A;Lo;0;L;9DFA;;;;N;;;;; F93B;CJK COMPATIBILITY IDEOGRAPH-F93B;Lo;0;L;788C;;;;N;;;;; F93C;CJK COMPATIBILITY IDEOGRAPH-F93C;Lo;0;L;797F;;;;N;;;;; F93D;CJK COMPATIBILITY IDEOGRAPH-F93D;Lo;0;L;7DA0;;;;N;;;;; F93E;CJK COMPATIBILITY IDEOGRAPH-F93E;Lo;0;L;83C9;;;;N;;;;; F93F;CJK COMPATIBILITY IDEOGRAPH-F93F;Lo;0;L;9304;;;;N;;;;; F940;CJK COMPATIBILITY IDEOGRAPH-F940;Lo;0;L;9E7F;;;;N;;;;; F941;CJK COMPATIBILITY IDEOGRAPH-F941;Lo;0;L;8AD6;;;;N;;;;; F942;CJK COMPATIBILITY IDEOGRAPH-F942;Lo;0;L;58DF;;;;N;;;;; F943;CJK COMPATIBILITY IDEOGRAPH-F943;Lo;0;L;5F04;;;;N;;;;; F944;CJK COMPATIBILITY IDEOGRAPH-F944;Lo;0;L;7C60;;;;N;;;;; F945;CJK COMPATIBILITY IDEOGRAPH-F945;Lo;0;L;807E;;;;N;;;;; F946;CJK COMPATIBILITY IDEOGRAPH-F946;Lo;0;L;7262;;;;N;;;;; F947;CJK COMPATIBILITY IDEOGRAPH-F947;Lo;0;L;78CA;;;;N;;;;; F948;CJK COMPATIBILITY IDEOGRAPH-F948;Lo;0;L;8CC2;;;;N;;;;; F949;CJK COMPATIBILITY IDEOGRAPH-F949;Lo;0;L;96F7;;;;N;;;;; F94A;CJK COMPATIBILITY IDEOGRAPH-F94A;Lo;0;L;58D8;;;;N;;;;; F94B;CJK COMPATIBILITY IDEOGRAPH-F94B;Lo;0;L;5C62;;;;N;;;;; F94C;CJK COMPATIBILITY IDEOGRAPH-F94C;Lo;0;L;6A13;;;;N;;;;; F94D;CJK COMPATIBILITY IDEOGRAPH-F94D;Lo;0;L;6DDA;;;;N;;;;; F94E;CJK COMPATIBILITY IDEOGRAPH-F94E;Lo;0;L;6F0F;;;;N;;;;; F94F;CJK COMPATIBILITY IDEOGRAPH-F94F;Lo;0;L;7D2F;;;;N;;;;; F950;CJK COMPATIBILITY IDEOGRAPH-F950;Lo;0;L;7E37;;;;N;;;;; F951;CJK COMPATIBILITY IDEOGRAPH-F951;Lo;0;L;964B;;;;N;;;;; F952;CJK COMPATIBILITY IDEOGRAPH-F952;Lo;0;L;52D2;;;;N;;;;; F953;CJK COMPATIBILITY IDEOGRAPH-F953;Lo;0;L;808B;;;;N;;;;; F954;CJK COMPATIBILITY IDEOGRAPH-F954;Lo;0;L;51DC;;;;N;;;;; F955;CJK COMPATIBILITY IDEOGRAPH-F955;Lo;0;L;51CC;;;;N;;;;; F956;CJK COMPATIBILITY IDEOGRAPH-F956;Lo;0;L;7A1C;;;;N;;;;; F957;CJK COMPATIBILITY IDEOGRAPH-F957;Lo;0;L;7DBE;;;;N;;;;; F958;CJK COMPATIBILITY IDEOGRAPH-F958;Lo;0;L;83F1;;;;N;;;;; F959;CJK COMPATIBILITY IDEOGRAPH-F959;Lo;0;L;9675;;;;N;;;;; F95A;CJK COMPATIBILITY IDEOGRAPH-F95A;Lo;0;L;8B80;;;;N;;;;; F95B;CJK COMPATIBILITY IDEOGRAPH-F95B;Lo;0;L;62CF;;;;N;;;;; F95C;CJK COMPATIBILITY IDEOGRAPH-F95C;Lo;0;L;6A02;;;;N;;;;; F95D;CJK COMPATIBILITY IDEOGRAPH-F95D;Lo;0;L;8AFE;;;;N;;;;; F95E;CJK COMPATIBILITY IDEOGRAPH-F95E;Lo;0;L;4E39;;;;N;;;;; F95F;CJK COMPATIBILITY IDEOGRAPH-F95F;Lo;0;L;5BE7;;;;N;;;;; F960;CJK COMPATIBILITY IDEOGRAPH-F960;Lo;0;L;6012;;;;N;;;;; F961;CJK COMPATIBILITY IDEOGRAPH-F961;Lo;0;L;7387;;;;N;;;;; F962;CJK COMPATIBILITY IDEOGRAPH-F962;Lo;0;L;7570;;;;N;;;;; F963;CJK COMPATIBILITY IDEOGRAPH-F963;Lo;0;L;5317;;;;N;;;;; F964;CJK COMPATIBILITY IDEOGRAPH-F964;Lo;0;L;78FB;;;;N;;;;; F965;CJK COMPATIBILITY IDEOGRAPH-F965;Lo;0;L;4FBF;;;;N;;;;; F966;CJK COMPATIBILITY IDEOGRAPH-F966;Lo;0;L;5FA9;;;;N;;;;; F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;; F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;; F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;; F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;; F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;3;N;;;;; F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;; F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;; F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;; F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;; F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;; F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;; F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;; F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;10;N;;;;; F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;; F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;; F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;; F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;; F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;2;N;;;;; F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;; F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;; F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;; F97C;CJK COMPATIBILITY IDEOGRAPH-F97C;Lo;0;L;826F;;;;N;;;;; F97D;CJK COMPATIBILITY IDEOGRAPH-F97D;Lo;0;L;8AD2;;;;N;;;;; F97E;CJK COMPATIBILITY IDEOGRAPH-F97E;Lo;0;L;91CF;;;;N;;;;; F97F;CJK COMPATIBILITY IDEOGRAPH-F97F;Lo;0;L;52F5;;;;N;;;;; F980;CJK COMPATIBILITY IDEOGRAPH-F980;Lo;0;L;5442;;;;N;;;;; F981;CJK COMPATIBILITY IDEOGRAPH-F981;Lo;0;L;5973;;;;N;;;;; F982;CJK COMPATIBILITY IDEOGRAPH-F982;Lo;0;L;5EEC;;;;N;;;;; F983;CJK COMPATIBILITY IDEOGRAPH-F983;Lo;0;L;65C5;;;;N;;;;; F984;CJK COMPATIBILITY IDEOGRAPH-F984;Lo;0;L;6FFE;;;;N;;;;; F985;CJK COMPATIBILITY IDEOGRAPH-F985;Lo;0;L;792A;;;;N;;;;; F986;CJK COMPATIBILITY IDEOGRAPH-F986;Lo;0;L;95AD;;;;N;;;;; F987;CJK COMPATIBILITY IDEOGRAPH-F987;Lo;0;L;9A6A;;;;N;;;;; F988;CJK COMPATIBILITY IDEOGRAPH-F988;Lo;0;L;9E97;;;;N;;;;; F989;CJK COMPATIBILITY IDEOGRAPH-F989;Lo;0;L;9ECE;;;;N;;;;; F98A;CJK COMPATIBILITY IDEOGRAPH-F98A;Lo;0;L;529B;;;;N;;;;; F98B;CJK COMPATIBILITY IDEOGRAPH-F98B;Lo;0;L;66C6;;;;N;;;;; F98C;CJK COMPATIBILITY IDEOGRAPH-F98C;Lo;0;L;6B77;;;;N;;;;; F98D;CJK COMPATIBILITY IDEOGRAPH-F98D;Lo;0;L;8F62;;;;N;;;;; F98E;CJK COMPATIBILITY IDEOGRAPH-F98E;Lo;0;L;5E74;;;;N;;;;; F98F;CJK COMPATIBILITY IDEOGRAPH-F98F;Lo;0;L;6190;;;;N;;;;; F990;CJK COMPATIBILITY IDEOGRAPH-F990;Lo;0;L;6200;;;;N;;;;; F991;CJK COMPATIBILITY IDEOGRAPH-F991;Lo;0;L;649A;;;;N;;;;; F992;CJK COMPATIBILITY IDEOGRAPH-F992;Lo;0;L;6F23;;;;N;;;;; F993;CJK COMPATIBILITY IDEOGRAPH-F993;Lo;0;L;7149;;;;N;;;;; F994;CJK COMPATIBILITY IDEOGRAPH-F994;Lo;0;L;7489;;;;N;;;;; F995;CJK COMPATIBILITY IDEOGRAPH-F995;Lo;0;L;79CA;;;;N;;;;; F996;CJK COMPATIBILITY IDEOGRAPH-F996;Lo;0;L;7DF4;;;;N;;;;; F997;CJK COMPATIBILITY IDEOGRAPH-F997;Lo;0;L;806F;;;;N;;;;; F998;CJK COMPATIBILITY IDEOGRAPH-F998;Lo;0;L;8F26;;;;N;;;;; F999;CJK COMPATIBILITY IDEOGRAPH-F999;Lo;0;L;84EE;;;;N;;;;; F99A;CJK COMPATIBILITY IDEOGRAPH-F99A;Lo;0;L;9023;;;;N;;;;; F99B;CJK COMPATIBILITY IDEOGRAPH-F99B;Lo;0;L;934A;;;;N;;;;; F99C;CJK COMPATIBILITY IDEOGRAPH-F99C;Lo;0;L;5217;;;;N;;;;; F99D;CJK COMPATIBILITY IDEOGRAPH-F99D;Lo;0;L;52A3;;;;N;;;;; F99E;CJK COMPATIBILITY IDEOGRAPH-F99E;Lo;0;L;54BD;;;;N;;;;; F99F;CJK COMPATIBILITY IDEOGRAPH-F99F;Lo;0;L;70C8;;;;N;;;;; F9A0;CJK COMPATIBILITY IDEOGRAPH-F9A0;Lo;0;L;88C2;;;;N;;;;; F9A1;CJK COMPATIBILITY IDEOGRAPH-F9A1;Lo;0;L;8AAA;;;;N;;;;; F9A2;CJK COMPATIBILITY IDEOGRAPH-F9A2;Lo;0;L;5EC9;;;;N;;;;; F9A3;CJK COMPATIBILITY IDEOGRAPH-F9A3;Lo;0;L;5FF5;;;;N;;;;; F9A4;CJK COMPATIBILITY IDEOGRAPH-F9A4;Lo;0;L;637B;;;;N;;;;; F9A5;CJK COMPATIBILITY IDEOGRAPH-F9A5;Lo;0;L;6BAE;;;;N;;;;; F9A6;CJK COMPATIBILITY IDEOGRAPH-F9A6;Lo;0;L;7C3E;;;;N;;;;; F9A7;CJK COMPATIBILITY IDEOGRAPH-F9A7;Lo;0;L;7375;;;;N;;;;; F9A8;CJK COMPATIBILITY IDEOGRAPH-F9A8;Lo;0;L;4EE4;;;;N;;;;; F9A9;CJK COMPATIBILITY IDEOGRAPH-F9A9;Lo;0;L;56F9;;;;N;;;;; F9AA;CJK COMPATIBILITY IDEOGRAPH-F9AA;Lo;0;L;5BE7;;;;N;;;;; F9AB;CJK COMPATIBILITY IDEOGRAPH-F9AB;Lo;0;L;5DBA;;;;N;;;;; F9AC;CJK COMPATIBILITY IDEOGRAPH-F9AC;Lo;0;L;601C;;;;N;;;;; F9AD;CJK COMPATIBILITY IDEOGRAPH-F9AD;Lo;0;L;73B2;;;;N;;;;; F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;; F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;; F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;; F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;; F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;0;N;;;;; F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;; F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;; F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;; F9B6;CJK COMPATIBILITY IDEOGRAPH-F9B6;Lo;0;L;79AE;;;;N;;;;; F9B7;CJK COMPATIBILITY IDEOGRAPH-F9B7;Lo;0;L;91B4;;;;N;;;;; F9B8;CJK COMPATIBILITY IDEOGRAPH-F9B8;Lo;0;L;96B8;;;;N;;;;; F9B9;CJK COMPATIBILITY IDEOGRAPH-F9B9;Lo;0;L;60E1;;;;N;;;;; F9BA;CJK COMPATIBILITY IDEOGRAPH-F9BA;Lo;0;L;4E86;;;;N;;;;; F9BB;CJK COMPATIBILITY IDEOGRAPH-F9BB;Lo;0;L;50DA;;;;N;;;;; F9BC;CJK COMPATIBILITY IDEOGRAPH-F9BC;Lo;0;L;5BEE;;;;N;;;;; F9BD;CJK COMPATIBILITY IDEOGRAPH-F9BD;Lo;0;L;5C3F;;;;N;;;;; F9BE;CJK COMPATIBILITY IDEOGRAPH-F9BE;Lo;0;L;6599;;;;N;;;;; F9BF;CJK COMPATIBILITY IDEOGRAPH-F9BF;Lo;0;L;6A02;;;;N;;;;; F9C0;CJK COMPATIBILITY IDEOGRAPH-F9C0;Lo;0;L;71CE;;;;N;;;;; F9C1;CJK COMPATIBILITY IDEOGRAPH-F9C1;Lo;0;L;7642;;;;N;;;;; F9C2;CJK COMPATIBILITY IDEOGRAPH-F9C2;Lo;0;L;84FC;;;;N;;;;; F9C3;CJK COMPATIBILITY IDEOGRAPH-F9C3;Lo;0;L;907C;;;;N;;;;; F9C4;CJK COMPATIBILITY IDEOGRAPH-F9C4;Lo;0;L;9F8D;;;;N;;;;; F9C5;CJK COMPATIBILITY IDEOGRAPH-F9C5;Lo;0;L;6688;;;;N;;;;; F9C6;CJK COMPATIBILITY IDEOGRAPH-F9C6;Lo;0;L;962E;;;;N;;;;; F9C7;CJK COMPATIBILITY IDEOGRAPH-F9C7;Lo;0;L;5289;;;;N;;;;; F9C8;CJK COMPATIBILITY IDEOGRAPH-F9C8;Lo;0;L;677B;;;;N;;;;; F9C9;CJK COMPATIBILITY IDEOGRAPH-F9C9;Lo;0;L;67F3;;;;N;;;;; F9CA;CJK COMPATIBILITY IDEOGRAPH-F9CA;Lo;0;L;6D41;;;;N;;;;; F9CB;CJK COMPATIBILITY IDEOGRAPH-F9CB;Lo;0;L;6E9C;;;;N;;;;; F9CC;CJK COMPATIBILITY IDEOGRAPH-F9CC;Lo;0;L;7409;;;;N;;;;; F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;; F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;; F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;; F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;; F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;6;N;;;;; F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;; F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;6;N;;;;; F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;; F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;; F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;; F9D7;CJK COMPATIBILITY IDEOGRAPH-F9D7;Lo;0;L;8F2A;;;;N;;;;; F9D8;CJK COMPATIBILITY IDEOGRAPH-F9D8;Lo;0;L;5F8B;;;;N;;;;; F9D9;CJK COMPATIBILITY IDEOGRAPH-F9D9;Lo;0;L;6144;;;;N;;;;; F9DA;CJK COMPATIBILITY IDEOGRAPH-F9DA;Lo;0;L;6817;;;;N;;;;; F9DB;CJK COMPATIBILITY IDEOGRAPH-F9DB;Lo;0;L;7387;;;;N;;;;; F9DC;CJK COMPATIBILITY IDEOGRAPH-F9DC;Lo;0;L;9686;;;;N;;;;; F9DD;CJK COMPATIBILITY IDEOGRAPH-F9DD;Lo;0;L;5229;;;;N;;;;; F9DE;CJK COMPATIBILITY IDEOGRAPH-F9DE;Lo;0;L;540F;;;;N;;;;; F9DF;CJK COMPATIBILITY IDEOGRAPH-F9DF;Lo;0;L;5C65;;;;N;;;;; F9E0;CJK COMPATIBILITY IDEOGRAPH-F9E0;Lo;0;L;6613;;;;N;;;;; F9E1;CJK COMPATIBILITY IDEOGRAPH-F9E1;Lo;0;L;674E;;;;N;;;;; F9E2;CJK COMPATIBILITY IDEOGRAPH-F9E2;Lo;0;L;68A8;;;;N;;;;; F9E3;CJK COMPATIBILITY IDEOGRAPH-F9E3;Lo;0;L;6CE5;;;;N;;;;; F9E4;CJK COMPATIBILITY IDEOGRAPH-F9E4;Lo;0;L;7406;;;;N;;;;; F9E5;CJK COMPATIBILITY IDEOGRAPH-F9E5;Lo;0;L;75E2;;;;N;;;;; F9E6;CJK COMPATIBILITY IDEOGRAPH-F9E6;Lo;0;L;7F79;;;;N;;;;; F9E7;CJK COMPATIBILITY IDEOGRAPH-F9E7;Lo;0;L;88CF;;;;N;;;;; F9E8;CJK COMPATIBILITY IDEOGRAPH-F9E8;Lo;0;L;88E1;;;;N;;;;; F9E9;CJK COMPATIBILITY IDEOGRAPH-F9E9;Lo;0;L;91CC;;;;N;;;;; F9EA;CJK COMPATIBILITY IDEOGRAPH-F9EA;Lo;0;L;96E2;;;;N;;;;; F9EB;CJK COMPATIBILITY IDEOGRAPH-F9EB;Lo;0;L;533F;;;;N;;;;; F9EC;CJK COMPATIBILITY IDEOGRAPH-F9EC;Lo;0;L;6EBA;;;;N;;;;; F9ED;CJK COMPATIBILITY IDEOGRAPH-F9ED;Lo;0;L;541D;;;;N;;;;; F9EE;CJK COMPATIBILITY IDEOGRAPH-F9EE;Lo;0;L;71D0;;;;N;;;;; F9EF;CJK COMPATIBILITY IDEOGRAPH-F9EF;Lo;0;L;7498;;;;N;;;;; F9F0;CJK COMPATIBILITY IDEOGRAPH-F9F0;Lo;0;L;85FA;;;;N;;;;; F9F1;CJK COMPATIBILITY IDEOGRAPH-F9F1;Lo;0;L;96A3;;;;N;;;;; F9F2;CJK COMPATIBILITY IDEOGRAPH-F9F2;Lo;0;L;9C57;;;;N;;;;; F9F3;CJK COMPATIBILITY IDEOGRAPH-F9F3;Lo;0;L;9E9F;;;;N;;;;; F9F4;CJK COMPATIBILITY IDEOGRAPH-F9F4;Lo;0;L;6797;;;;N;;;;; F9F5;CJK COMPATIBILITY IDEOGRAPH-F9F5;Lo;0;L;6DCB;;;;N;;;;; F9F6;CJK COMPATIBILITY IDEOGRAPH-F9F6;Lo;0;L;81E8;;;;N;;;;; F9F7;CJK COMPATIBILITY IDEOGRAPH-F9F7;Lo;0;L;7ACB;;;;N;;;;; F9F8;CJK COMPATIBILITY IDEOGRAPH-F9F8;Lo;0;L;7B20;;;;N;;;;; F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;; F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;; F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;; F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;; F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;10;N;;;;; F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;; F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;; FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;; FA01;CJK COMPATIBILITY IDEOGRAPH-FA01;Lo;0;L;5EA6;;;;N;;;;; FA02;CJK COMPATIBILITY IDEOGRAPH-FA02;Lo;0;L;62D3;;;;N;;;;; FA03;CJK COMPATIBILITY IDEOGRAPH-FA03;Lo;0;L;7CD6;;;;N;;;;; FA04;CJK COMPATIBILITY IDEOGRAPH-FA04;Lo;0;L;5B85;;;;N;;;;; FA05;CJK COMPATIBILITY IDEOGRAPH-FA05;Lo;0;L;6D1E;;;;N;;;;; FA06;CJK COMPATIBILITY IDEOGRAPH-FA06;Lo;0;L;66B4;;;;N;;;;; FA07;CJK COMPATIBILITY IDEOGRAPH-FA07;Lo;0;L;8F3B;;;;N;;;;; FA08;CJK COMPATIBILITY IDEOGRAPH-FA08;Lo;0;L;884C;;;;N;;;;; FA09;CJK COMPATIBILITY IDEOGRAPH-FA09;Lo;0;L;964D;;;;N;;;;; FA0A;CJK COMPATIBILITY IDEOGRAPH-FA0A;Lo;0;L;898B;;;;N;;;;; FA0B;CJK COMPATIBILITY IDEOGRAPH-FA0B;Lo;0;L;5ED3;;;;N;;;;; FA0C;CJK COMPATIBILITY IDEOGRAPH-FA0C;Lo;0;L;5140;;;;N;;;;; FA0D;CJK COMPATIBILITY IDEOGRAPH-FA0D;Lo;0;L;55C0;;;;N;;;;; FA0E;CJK COMPATIBILITY IDEOGRAPH-FA0E;Lo;0;L;;;;;N;;;;; FA0F;CJK COMPATIBILITY IDEOGRAPH-FA0F;Lo;0;L;;;;;N;;;;; FA10;CJK COMPATIBILITY IDEOGRAPH-FA10;Lo;0;L;585A;;;;N;;;;; FA11;CJK COMPATIBILITY IDEOGRAPH-FA11;Lo;0;L;;;;;N;;;;; FA12;CJK COMPATIBILITY IDEOGRAPH-FA12;Lo;0;L;6674;;;;N;;;;; FA13;CJK COMPATIBILITY IDEOGRAPH-FA13;Lo;0;L;;;;;N;;;;; FA14;CJK COMPATIBILITY IDEOGRAPH-FA14;Lo;0;L;;;;;N;;;;; FA15;CJK COMPATIBILITY IDEOGRAPH-FA15;Lo;0;L;51DE;;;;N;;;;; FA16;CJK COMPATIBILITY IDEOGRAPH-FA16;Lo;0;L;732A;;;;N;;;;; FA17;CJK COMPATIBILITY IDEOGRAPH-FA17;Lo;0;L;76CA;;;;N;;;;; FA18;CJK COMPATIBILITY IDEOGRAPH-FA18;Lo;0;L;793C;;;;N;;;;; FA19;CJK COMPATIBILITY IDEOGRAPH-FA19;Lo;0;L;795E;;;;N;;;;; FA1A;CJK COMPATIBILITY IDEOGRAPH-FA1A;Lo;0;L;7965;;;;N;;;;; FA1B;CJK COMPATIBILITY IDEOGRAPH-FA1B;Lo;0;L;798F;;;;N;;;;; FA1C;CJK COMPATIBILITY IDEOGRAPH-FA1C;Lo;0;L;9756;;;;N;;;;; FA1D;CJK COMPATIBILITY IDEOGRAPH-FA1D;Lo;0;L;7CBE;;;;N;;;;; FA1E;CJK COMPATIBILITY IDEOGRAPH-FA1E;Lo;0;L;7FBD;;;;N;;;;; FA1F;CJK COMPATIBILITY IDEOGRAPH-FA1F;Lo;0;L;;;;;N;;;;; FA20;CJK COMPATIBILITY IDEOGRAPH-FA20;Lo;0;L;8612;;;;N;;;;; FA21;CJK COMPATIBILITY IDEOGRAPH-FA21;Lo;0;L;;;;;N;;;;; FA22;CJK COMPATIBILITY IDEOGRAPH-FA22;Lo;0;L;8AF8;;;;N;;;;; FA23;CJK COMPATIBILITY IDEOGRAPH-FA23;Lo;0;L;;;;;N;;;;; FA24;CJK COMPATIBILITY IDEOGRAPH-FA24;Lo;0;L;;;;;N;;;;; FA25;CJK COMPATIBILITY IDEOGRAPH-FA25;Lo;0;L;9038;;;;N;;;;; FA26;CJK COMPATIBILITY IDEOGRAPH-FA26;Lo;0;L;90FD;;;;N;;;;; FA27;CJK COMPATIBILITY IDEOGRAPH-FA27;Lo;0;L;;;;;N;;;;; FA28;CJK COMPATIBILITY IDEOGRAPH-FA28;Lo;0;L;;;;;N;;;;; FA29;CJK COMPATIBILITY IDEOGRAPH-FA29;Lo;0;L;;;;;N;;;;; FA2A;CJK COMPATIBILITY IDEOGRAPH-FA2A;Lo;0;L;98EF;;;;N;;;;; FA2B;CJK COMPATIBILITY IDEOGRAPH-FA2B;Lo;0;L;98FC;;;;N;;;;; FA2C;CJK COMPATIBILITY IDEOGRAPH-FA2C;Lo;0;L;9928;;;;N;;;;; FA2D;CJK COMPATIBILITY IDEOGRAPH-FA2D;Lo;0;L;9DB4;;;;N;;;;; FA2E;CJK COMPATIBILITY IDEOGRAPH-FA2E;Lo;0;L;90DE;;;;N;;;;; FA2F;CJK COMPATIBILITY IDEOGRAPH-FA2F;Lo;0;L;96B7;;;;N;;;;; FA30;CJK COMPATIBILITY IDEOGRAPH-FA30;Lo;0;L;4FAE;;;;N;;;;; FA31;CJK COMPATIBILITY IDEOGRAPH-FA31;Lo;0;L;50E7;;;;N;;;;; FA32;CJK COMPATIBILITY IDEOGRAPH-FA32;Lo;0;L;514D;;;;N;;;;; FA33;CJK COMPATIBILITY IDEOGRAPH-FA33;Lo;0;L;52C9;;;;N;;;;; FA34;CJK COMPATIBILITY IDEOGRAPH-FA34;Lo;0;L;52E4;;;;N;;;;; FA35;CJK COMPATIBILITY IDEOGRAPH-FA35;Lo;0;L;5351;;;;N;;;;; FA36;CJK COMPATIBILITY IDEOGRAPH-FA36;Lo;0;L;559D;;;;N;;;;; FA37;CJK COMPATIBILITY IDEOGRAPH-FA37;Lo;0;L;5606;;;;N;;;;; FA38;CJK COMPATIBILITY IDEOGRAPH-FA38;Lo;0;L;5668;;;;N;;;;; FA39;CJK COMPATIBILITY IDEOGRAPH-FA39;Lo;0;L;5840;;;;N;;;;; FA3A;CJK COMPATIBILITY IDEOGRAPH-FA3A;Lo;0;L;58A8;;;;N;;;;; FA3B;CJK COMPATIBILITY IDEOGRAPH-FA3B;Lo;0;L;5C64;;;;N;;;;; FA3C;CJK COMPATIBILITY IDEOGRAPH-FA3C;Lo;0;L;5C6E;;;;N;;;;; FA3D;CJK COMPATIBILITY IDEOGRAPH-FA3D;Lo;0;L;6094;;;;N;;;;; FA3E;CJK COMPATIBILITY IDEOGRAPH-FA3E;Lo;0;L;6168;;;;N;;;;; FA3F;CJK COMPATIBILITY IDEOGRAPH-FA3F;Lo;0;L;618E;;;;N;;;;; FA40;CJK COMPATIBILITY IDEOGRAPH-FA40;Lo;0;L;61F2;;;;N;;;;; FA41;CJK COMPATIBILITY IDEOGRAPH-FA41;Lo;0;L;654F;;;;N;;;;; FA42;CJK COMPATIBILITY IDEOGRAPH-FA42;Lo;0;L;65E2;;;;N;;;;; FA43;CJK COMPATIBILITY IDEOGRAPH-FA43;Lo;0;L;6691;;;;N;;;;; FA44;CJK COMPATIBILITY IDEOGRAPH-FA44;Lo;0;L;6885;;;;N;;;;; FA45;CJK COMPATIBILITY IDEOGRAPH-FA45;Lo;0;L;6D77;;;;N;;;;; FA46;CJK COMPATIBILITY IDEOGRAPH-FA46;Lo;0;L;6E1A;;;;N;;;;; FA47;CJK COMPATIBILITY IDEOGRAPH-FA47;Lo;0;L;6F22;;;;N;;;;; FA48;CJK COMPATIBILITY IDEOGRAPH-FA48;Lo;0;L;716E;;;;N;;;;; FA49;CJK COMPATIBILITY IDEOGRAPH-FA49;Lo;0;L;722B;;;;N;;;;; FA4A;CJK COMPATIBILITY IDEOGRAPH-FA4A;Lo;0;L;7422;;;;N;;;;; FA4B;CJK COMPATIBILITY IDEOGRAPH-FA4B;Lo;0;L;7891;;;;N;;;;; FA4C;CJK COMPATIBILITY IDEOGRAPH-FA4C;Lo;0;L;793E;;;;N;;;;; FA4D;CJK COMPATIBILITY IDEOGRAPH-FA4D;Lo;0;L;7949;;;;N;;;;; FA4E;CJK COMPATIBILITY IDEOGRAPH-FA4E;Lo;0;L;7948;;;;N;;;;; FA4F;CJK COMPATIBILITY IDEOGRAPH-FA4F;Lo;0;L;7950;;;;N;;;;; FA50;CJK COMPATIBILITY IDEOGRAPH-FA50;Lo;0;L;7956;;;;N;;;;; FA51;CJK COMPATIBILITY IDEOGRAPH-FA51;Lo;0;L;795D;;;;N;;;;; FA52;CJK COMPATIBILITY IDEOGRAPH-FA52;Lo;0;L;798D;;;;N;;;;; FA53;CJK COMPATIBILITY IDEOGRAPH-FA53;Lo;0;L;798E;;;;N;;;;; FA54;CJK COMPATIBILITY IDEOGRAPH-FA54;Lo;0;L;7A40;;;;N;;;;; FA55;CJK COMPATIBILITY IDEOGRAPH-FA55;Lo;0;L;7A81;;;;N;;;;; FA56;CJK COMPATIBILITY IDEOGRAPH-FA56;Lo;0;L;7BC0;;;;N;;;;; FA57;CJK COMPATIBILITY IDEOGRAPH-FA57;Lo;0;L;7DF4;;;;N;;;;; FA58;CJK COMPATIBILITY IDEOGRAPH-FA58;Lo;0;L;7E09;;;;N;;;;; FA59;CJK COMPATIBILITY IDEOGRAPH-FA59;Lo;0;L;7E41;;;;N;;;;; FA5A;CJK COMPATIBILITY IDEOGRAPH-FA5A;Lo;0;L;7F72;;;;N;;;;; FA5B;CJK COMPATIBILITY IDEOGRAPH-FA5B;Lo;0;L;8005;;;;N;;;;; FA5C;CJK COMPATIBILITY IDEOGRAPH-FA5C;Lo;0;L;81ED;;;;N;;;;; FA5D;CJK COMPATIBILITY IDEOGRAPH-FA5D;Lo;0;L;8279;;;;N;;;;; FA5E;CJK COMPATIBILITY IDEOGRAPH-FA5E;Lo;0;L;8279;;;;N;;;;; FA5F;CJK COMPATIBILITY IDEOGRAPH-FA5F;Lo;0;L;8457;;;;N;;;;; FA60;CJK COMPATIBILITY IDEOGRAPH-FA60;Lo;0;L;8910;;;;N;;;;; FA61;CJK COMPATIBILITY IDEOGRAPH-FA61;Lo;0;L;8996;;;;N;;;;; FA62;CJK COMPATIBILITY IDEOGRAPH-FA62;Lo;0;L;8B01;;;;N;;;;; FA63;CJK COMPATIBILITY IDEOGRAPH-FA63;Lo;0;L;8B39;;;;N;;;;; FA64;CJK COMPATIBILITY IDEOGRAPH-FA64;Lo;0;L;8CD3;;;;N;;;;; FA65;CJK COMPATIBILITY IDEOGRAPH-FA65;Lo;0;L;8D08;;;;N;;;;; FA66;CJK COMPATIBILITY IDEOGRAPH-FA66;Lo;0;L;8FB6;;;;N;;;;; FA67;CJK COMPATIBILITY IDEOGRAPH-FA67;Lo;0;L;9038;;;;N;;;;; FA68;CJK COMPATIBILITY IDEOGRAPH-FA68;Lo;0;L;96E3;;;;N;;;;; FA69;CJK COMPATIBILITY IDEOGRAPH-FA69;Lo;0;L;97FF;;;;N;;;;; FA6A;CJK COMPATIBILITY IDEOGRAPH-FA6A;Lo;0;L;983B;;;;N;;;;; FA6B;CJK COMPATIBILITY IDEOGRAPH-FA6B;Lo;0;L;6075;;;;N;;;;; FA6C;CJK COMPATIBILITY IDEOGRAPH-FA6C;Lo;0;L;242EE;;;;N;;;;; FA6D;CJK COMPATIBILITY IDEOGRAPH-FA6D;Lo;0;L;8218;;;;N;;;;; FA70;CJK COMPATIBILITY IDEOGRAPH-FA70;Lo;0;L;4E26;;;;N;;;;; FA71;CJK COMPATIBILITY IDEOGRAPH-FA71;Lo;0;L;51B5;;;;N;;;;; FA72;CJK COMPATIBILITY IDEOGRAPH-FA72;Lo;0;L;5168;;;;N;;;;; FA73;CJK COMPATIBILITY IDEOGRAPH-FA73;Lo;0;L;4F80;;;;N;;;;; FA74;CJK COMPATIBILITY IDEOGRAPH-FA74;Lo;0;L;5145;;;;N;;;;; FA75;CJK COMPATIBILITY IDEOGRAPH-FA75;Lo;0;L;5180;;;;N;;;;; FA76;CJK COMPATIBILITY IDEOGRAPH-FA76;Lo;0;L;52C7;;;;N;;;;; FA77;CJK COMPATIBILITY IDEOGRAPH-FA77;Lo;0;L;52FA;;;;N;;;;; FA78;CJK COMPATIBILITY IDEOGRAPH-FA78;Lo;0;L;559D;;;;N;;;;; FA79;CJK COMPATIBILITY IDEOGRAPH-FA79;Lo;0;L;5555;;;;N;;;;; FA7A;CJK COMPATIBILITY IDEOGRAPH-FA7A;Lo;0;L;5599;;;;N;;;;; FA7B;CJK COMPATIBILITY IDEOGRAPH-FA7B;Lo;0;L;55E2;;;;N;;;;; FA7C;CJK COMPATIBILITY IDEOGRAPH-FA7C;Lo;0;L;585A;;;;N;;;;; FA7D;CJK COMPATIBILITY IDEOGRAPH-FA7D;Lo;0;L;58B3;;;;N;;;;; FA7E;CJK COMPATIBILITY IDEOGRAPH-FA7E;Lo;0;L;5944;;;;N;;;;; FA7F;CJK COMPATIBILITY IDEOGRAPH-FA7F;Lo;0;L;5954;;;;N;;;;; FA80;CJK COMPATIBILITY IDEOGRAPH-FA80;Lo;0;L;5A62;;;;N;;;;; FA81;CJK COMPATIBILITY IDEOGRAPH-FA81;Lo;0;L;5B28;;;;N;;;;; FA82;CJK COMPATIBILITY IDEOGRAPH-FA82;Lo;0;L;5ED2;;;;N;;;;; FA83;CJK COMPATIBILITY IDEOGRAPH-FA83;Lo;0;L;5ED9;;;;N;;;;; FA84;CJK COMPATIBILITY IDEOGRAPH-FA84;Lo;0;L;5F69;;;;N;;;;; FA85;CJK COMPATIBILITY IDEOGRAPH-FA85;Lo;0;L;5FAD;;;;N;;;;; FA86;CJK COMPATIBILITY IDEOGRAPH-FA86;Lo;0;L;60D8;;;;N;;;;; FA87;CJK COMPATIBILITY IDEOGRAPH-FA87;Lo;0;L;614E;;;;N;;;;; FA88;CJK COMPATIBILITY IDEOGRAPH-FA88;Lo;0;L;6108;;;;N;;;;; FA89;CJK COMPATIBILITY IDEOGRAPH-FA89;Lo;0;L;618E;;;;N;;;;; FA8A;CJK COMPATIBILITY IDEOGRAPH-FA8A;Lo;0;L;6160;;;;N;;;;; FA8B;CJK COMPATIBILITY IDEOGRAPH-FA8B;Lo;0;L;61F2;;;;N;;;;; FA8C;CJK COMPATIBILITY IDEOGRAPH-FA8C;Lo;0;L;6234;;;;N;;;;; FA8D;CJK COMPATIBILITY IDEOGRAPH-FA8D;Lo;0;L;63C4;;;;N;;;;; FA8E;CJK COMPATIBILITY IDEOGRAPH-FA8E;Lo;0;L;641C;;;;N;;;;; FA8F;CJK COMPATIBILITY IDEOGRAPH-FA8F;Lo;0;L;6452;;;;N;;;;; FA90;CJK COMPATIBILITY IDEOGRAPH-FA90;Lo;0;L;6556;;;;N;;;;; FA91;CJK COMPATIBILITY IDEOGRAPH-FA91;Lo;0;L;6674;;;;N;;;;; FA92;CJK COMPATIBILITY IDEOGRAPH-FA92;Lo;0;L;6717;;;;N;;;;; FA93;CJK COMPATIBILITY IDEOGRAPH-FA93;Lo;0;L;671B;;;;N;;;;; FA94;CJK COMPATIBILITY IDEOGRAPH-FA94;Lo;0;L;6756;;;;N;;;;; FA95;CJK COMPATIBILITY IDEOGRAPH-FA95;Lo;0;L;6B79;;;;N;;;;; FA96;CJK COMPATIBILITY IDEOGRAPH-FA96;Lo;0;L;6BBA;;;;N;;;;; FA97;CJK COMPATIBILITY IDEOGRAPH-FA97;Lo;0;L;6D41;;;;N;;;;; FA98;CJK COMPATIBILITY IDEOGRAPH-FA98;Lo;0;L;6EDB;;;;N;;;;; FA99;CJK COMPATIBILITY IDEOGRAPH-FA99;Lo;0;L;6ECB;;;;N;;;;; FA9A;CJK COMPATIBILITY IDEOGRAPH-FA9A;Lo;0;L;6F22;;;;N;;;;; FA9B;CJK COMPATIBILITY IDEOGRAPH-FA9B;Lo;0;L;701E;;;;N;;;;; FA9C;CJK COMPATIBILITY IDEOGRAPH-FA9C;Lo;0;L;716E;;;;N;;;;; FA9D;CJK COMPATIBILITY IDEOGRAPH-FA9D;Lo;0;L;77A7;;;;N;;;;; FA9E;CJK COMPATIBILITY IDEOGRAPH-FA9E;Lo;0;L;7235;;;;N;;;;; FA9F;CJK COMPATIBILITY IDEOGRAPH-FA9F;Lo;0;L;72AF;;;;N;;;;; FAA0;CJK COMPATIBILITY IDEOGRAPH-FAA0;Lo;0;L;732A;;;;N;;;;; FAA1;CJK COMPATIBILITY IDEOGRAPH-FAA1;Lo;0;L;7471;;;;N;;;;; FAA2;CJK COMPATIBILITY IDEOGRAPH-FAA2;Lo;0;L;7506;;;;N;;;;; FAA3;CJK COMPATIBILITY IDEOGRAPH-FAA3;Lo;0;L;753B;;;;N;;;;; FAA4;CJK COMPATIBILITY IDEOGRAPH-FAA4;Lo;0;L;761D;;;;N;;;;; FAA5;CJK COMPATIBILITY IDEOGRAPH-FAA5;Lo;0;L;761F;;;;N;;;;; FAA6;CJK COMPATIBILITY IDEOGRAPH-FAA6;Lo;0;L;76CA;;;;N;;;;; FAA7;CJK COMPATIBILITY IDEOGRAPH-FAA7;Lo;0;L;76DB;;;;N;;;;; FAA8;CJK COMPATIBILITY IDEOGRAPH-FAA8;Lo;0;L;76F4;;;;N;;;;; FAA9;CJK COMPATIBILITY IDEOGRAPH-FAA9;Lo;0;L;774A;;;;N;;;;; FAAA;CJK COMPATIBILITY IDEOGRAPH-FAAA;Lo;0;L;7740;;;;N;;;;; FAAB;CJK COMPATIBILITY IDEOGRAPH-FAAB;Lo;0;L;78CC;;;;N;;;;; FAAC;CJK COMPATIBILITY IDEOGRAPH-FAAC;Lo;0;L;7AB1;;;;N;;;;; FAAD;CJK COMPATIBILITY IDEOGRAPH-FAAD;Lo;0;L;7BC0;;;;N;;;;; FAAE;CJK COMPATIBILITY IDEOGRAPH-FAAE;Lo;0;L;7C7B;;;;N;;;;; FAAF;CJK COMPATIBILITY IDEOGRAPH-FAAF;Lo;0;L;7D5B;;;;N;;;;; FAB0;CJK COMPATIBILITY IDEOGRAPH-FAB0;Lo;0;L;7DF4;;;;N;;;;; FAB1;CJK COMPATIBILITY IDEOGRAPH-FAB1;Lo;0;L;7F3E;;;;N;;;;; FAB2;CJK COMPATIBILITY IDEOGRAPH-FAB2;Lo;0;L;8005;;;;N;;;;; FAB3;CJK COMPATIBILITY IDEOGRAPH-FAB3;Lo;0;L;8352;;;;N;;;;; FAB4;CJK COMPATIBILITY IDEOGRAPH-FAB4;Lo;0;L;83EF;;;;N;;;;; FAB5;CJK COMPATIBILITY IDEOGRAPH-FAB5;Lo;0;L;8779;;;;N;;;;; FAB6;CJK COMPATIBILITY IDEOGRAPH-FAB6;Lo;0;L;8941;;;;N;;;;; FAB7;CJK COMPATIBILITY IDEOGRAPH-FAB7;Lo;0;L;8986;;;;N;;;;; FAB8;CJK COMPATIBILITY IDEOGRAPH-FAB8;Lo;0;L;8996;;;;N;;;;; FAB9;CJK COMPATIBILITY IDEOGRAPH-FAB9;Lo;0;L;8ABF;;;;N;;;;; FABA;CJK COMPATIBILITY IDEOGRAPH-FABA;Lo;0;L;8AF8;;;;N;;;;; FABB;CJK COMPATIBILITY IDEOGRAPH-FABB;Lo;0;L;8ACB;;;;N;;;;; FABC;CJK COMPATIBILITY IDEOGRAPH-FABC;Lo;0;L;8B01;;;;N;;;;; FABD;CJK COMPATIBILITY IDEOGRAPH-FABD;Lo;0;L;8AFE;;;;N;;;;; FABE;CJK COMPATIBILITY IDEOGRAPH-FABE;Lo;0;L;8AED;;;;N;;;;; FABF;CJK COMPATIBILITY IDEOGRAPH-FABF;Lo;0;L;8B39;;;;N;;;;; FAC0;CJK COMPATIBILITY IDEOGRAPH-FAC0;Lo;0;L;8B8A;;;;N;;;;; FAC1;CJK COMPATIBILITY IDEOGRAPH-FAC1;Lo;0;L;8D08;;;;N;;;;; FAC2;CJK COMPATIBILITY IDEOGRAPH-FAC2;Lo;0;L;8F38;;;;N;;;;; FAC3;CJK COMPATIBILITY IDEOGRAPH-FAC3;Lo;0;L;9072;;;;N;;;;; FAC4;CJK COMPATIBILITY IDEOGRAPH-FAC4;Lo;0;L;9199;;;;N;;;;; FAC5;CJK COMPATIBILITY IDEOGRAPH-FAC5;Lo;0;L;9276;;;;N;;;;; FAC6;CJK COMPATIBILITY IDEOGRAPH-FAC6;Lo;0;L;967C;;;;N;;;;; FAC7;CJK COMPATIBILITY IDEOGRAPH-FAC7;Lo;0;L;96E3;;;;N;;;;; FAC8;CJK COMPATIBILITY IDEOGRAPH-FAC8;Lo;0;L;9756;;;;N;;;;; FAC9;CJK COMPATIBILITY IDEOGRAPH-FAC9;Lo;0;L;97DB;;;;N;;;;; FACA;CJK COMPATIBILITY IDEOGRAPH-FACA;Lo;0;L;97FF;;;;N;;;;; FACB;CJK COMPATIBILITY IDEOGRAPH-FACB;Lo;0;L;980B;;;;N;;;;; FACC;CJK COMPATIBILITY IDEOGRAPH-FACC;Lo;0;L;983B;;;;N;;;;; FACD;CJK COMPATIBILITY IDEOGRAPH-FACD;Lo;0;L;9B12;;;;N;;;;; FACE;CJK COMPATIBILITY IDEOGRAPH-FACE;Lo;0;L;9F9C;;;;N;;;;; FACF;CJK COMPATIBILITY IDEOGRAPH-FACF;Lo;0;L;2284A;;;;N;;;;; FAD0;CJK COMPATIBILITY IDEOGRAPH-FAD0;Lo;0;L;22844;;;;N;;;;; FAD1;CJK COMPATIBILITY IDEOGRAPH-FAD1;Lo;0;L;233D5;;;;N;;;;; FAD2;CJK COMPATIBILITY IDEOGRAPH-FAD2;Lo;0;L;3B9D;;;;N;;;;; FAD3;CJK COMPATIBILITY IDEOGRAPH-FAD3;Lo;0;L;4018;;;;N;;;;; FAD4;CJK COMPATIBILITY IDEOGRAPH-FAD4;Lo;0;L;4039;;;;N;;;;; FAD5;CJK COMPATIBILITY IDEOGRAPH-FAD5;Lo;0;L;25249;;;;N;;;;; FAD6;CJK COMPATIBILITY IDEOGRAPH-FAD6;Lo;0;L;25CD0;;;;N;;;;; FAD7;CJK COMPATIBILITY IDEOGRAPH-FAD7;Lo;0;L;27ED3;;;;N;;;;; FAD8;CJK COMPATIBILITY IDEOGRAPH-FAD8;Lo;0;L;9F43;;;;N;;;;; FAD9;CJK COMPATIBILITY IDEOGRAPH-FAD9;Lo;0;L;9F8E;;;;N;;;;; FB00;LATIN SMALL LIGATURE FF;Ll;0;L;<compat> 0066 0066;;;;N;;;;; FB01;LATIN SMALL LIGATURE FI;Ll;0;L;<compat> 0066 0069;;;;N;;;;; FB02;LATIN SMALL LIGATURE FL;Ll;0;L;<compat> 0066 006C;;;;N;;;;; FB03;LATIN SMALL LIGATURE FFI;Ll;0;L;<compat> 0066 0066 0069;;;;N;;;;; FB04;LATIN SMALL LIGATURE FFL;Ll;0;L;<compat> 0066 0066 006C;;;;N;;;;; FB05;LATIN SMALL LIGATURE LONG S T;Ll;0;L;<compat> 017F 0074;;;;N;;;;; FB06;LATIN SMALL LIGATURE ST;Ll;0;L;<compat> 0073 0074;;;;N;;;;; FB13;ARMENIAN SMALL LIGATURE MEN NOW;Ll;0;L;<compat> 0574 0576;;;;N;;;;; FB14;ARMENIAN SMALL LIGATURE MEN ECH;Ll;0;L;<compat> 0574 0565;;;;N;;;;; FB15;ARMENIAN SMALL LIGATURE MEN INI;Ll;0;L;<compat> 0574 056B;;;;N;;;;; FB16;ARMENIAN SMALL LIGATURE VEW NOW;Ll;0;L;<compat> 057E 0576;;;;N;;;;; FB17;ARMENIAN SMALL LIGATURE MEN XEH;Ll;0;L;<compat> 0574 056D;;;;N;;;;; FB1D;HEBREW LETTER YOD WITH HIRIQ;Lo;0;R;05D9 05B4;;;;N;;;;; FB1E;HEBREW POINT JUDEO-SPANISH VARIKA;Mn;26;NSM;;;;;N;HEBREW POINT VARIKA;;;; FB1F;HEBREW LIGATURE YIDDISH YOD YOD PATAH;Lo;0;R;05F2 05B7;;;;N;;;;; FB20;HEBREW LETTER ALTERNATIVE AYIN;Lo;0;R;<font> 05E2;;;;N;;;;; FB21;HEBREW LETTER WIDE ALEF;Lo;0;R;<font> 05D0;;;;N;;;;; FB22;HEBREW LETTER WIDE DALET;Lo;0;R;<font> 05D3;;;;N;;;;; FB23;HEBREW LETTER WIDE HE;Lo;0;R;<font> 05D4;;;;N;;;;; FB24;HEBREW LETTER WIDE KAF;Lo;0;R;<font> 05DB;;;;N;;;;; FB25;HEBREW LETTER WIDE LAMED;Lo;0;R;<font> 05DC;;;;N;;;;; FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R;<font> 05DD;;;;N;;;;; FB27;HEBREW LETTER WIDE RESH;Lo;0;R;<font> 05E8;;;;N;;;;; FB28;HEBREW LETTER WIDE TAV;Lo;0;R;<font> 05EA;;;;N;;;;; FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ES;<font> 002B;;;;N;;;;; FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;; FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;; FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;; FB2D;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT;Lo;0;R;FB49 05C2;;;;N;;;;; FB2E;HEBREW LETTER ALEF WITH PATAH;Lo;0;R;05D0 05B7;;;;N;;;;; FB2F;HEBREW LETTER ALEF WITH QAMATS;Lo;0;R;05D0 05B8;;;;N;;;;; FB30;HEBREW LETTER ALEF WITH MAPIQ;Lo;0;R;05D0 05BC;;;;N;;;;; FB31;HEBREW LETTER BET WITH DAGESH;Lo;0;R;05D1 05BC;;;;N;;;;; FB32;HEBREW LETTER GIMEL WITH DAGESH;Lo;0;R;05D2 05BC;;;;N;;;;; FB33;HEBREW LETTER DALET WITH DAGESH;Lo;0;R;05D3 05BC;;;;N;;;;; FB34;HEBREW LETTER HE WITH MAPIQ;Lo;0;R;05D4 05BC;;;;N;;;;; FB35;HEBREW LETTER VAV WITH DAGESH;Lo;0;R;05D5 05BC;;;;N;;;;; FB36;HEBREW LETTER ZAYIN WITH DAGESH;Lo;0;R;05D6 05BC;;;;N;;;;; FB38;HEBREW LETTER TET WITH DAGESH;Lo;0;R;05D8 05BC;;;;N;;;;; FB39;HEBREW LETTER YOD WITH DAGESH;Lo;0;R;05D9 05BC;;;;N;;;;; FB3A;HEBREW LETTER FINAL KAF WITH DAGESH;Lo;0;R;05DA 05BC;;;;N;;;;; FB3B;HEBREW LETTER KAF WITH DAGESH;Lo;0;R;05DB 05BC;;;;N;;;;; FB3C;HEBREW LETTER LAMED WITH DAGESH;Lo;0;R;05DC 05BC;;;;N;;;;; FB3E;HEBREW LETTER MEM WITH DAGESH;Lo;0;R;05DE 05BC;;;;N;;;;; FB40;HEBREW LETTER NUN WITH DAGESH;Lo;0;R;05E0 05BC;;;;N;;;;; FB41;HEBREW LETTER SAMEKH WITH DAGESH;Lo;0;R;05E1 05BC;;;;N;;;;; FB43;HEBREW LETTER FINAL PE WITH DAGESH;Lo;0;R;05E3 05BC;;;;N;;;;; FB44;HEBREW LETTER PE WITH DAGESH;Lo;0;R;05E4 05BC;;;;N;;;;; FB46;HEBREW LETTER TSADI WITH DAGESH;Lo;0;R;05E6 05BC;;;;N;;;;; FB47;HEBREW LETTER QOF WITH DAGESH;Lo;0;R;05E7 05BC;;;;N;;;;; FB48;HEBREW LETTER RESH WITH DAGESH;Lo;0;R;05E8 05BC;;;;N;;;;; FB49;HEBREW LETTER SHIN WITH DAGESH;Lo;0;R;05E9 05BC;;;;N;;;;; FB4A;HEBREW LETTER TAV WITH DAGESH;Lo;0;R;05EA 05BC;;;;N;;;;; FB4B;HEBREW LETTER VAV WITH HOLAM;Lo;0;R;05D5 05B9;;;;N;;;;; FB4C;HEBREW LETTER BET WITH RAFE;Lo;0;R;05D1 05BF;;;;N;;;;; FB4D;HEBREW LETTER KAF WITH RAFE;Lo;0;R;05DB 05BF;;;;N;;;;; FB4E;HEBREW LETTER PE WITH RAFE;Lo;0;R;05E4 05BF;;;;N;;;;; FB4F;HEBREW LIGATURE ALEF LAMED;Lo;0;R;<compat> 05D0 05DC;;;;N;;;;; FB50;ARABIC LETTER ALEF WASLA ISOLATED FORM;Lo;0;AL;<isolated> 0671;;;;N;;;;; FB51;ARABIC LETTER ALEF WASLA FINAL FORM;Lo;0;AL;<final> 0671;;;;N;;;;; FB52;ARABIC LETTER BEEH ISOLATED FORM;Lo;0;AL;<isolated> 067B;;;;N;;;;; FB53;ARABIC LETTER BEEH FINAL FORM;Lo;0;AL;<final> 067B;;;;N;;;;; FB54;ARABIC LETTER BEEH INITIAL FORM;Lo;0;AL;<initial> 067B;;;;N;;;;; FB55;ARABIC LETTER BEEH MEDIAL FORM;Lo;0;AL;<medial> 067B;;;;N;;;;; FB56;ARABIC LETTER PEH ISOLATED FORM;Lo;0;AL;<isolated> 067E;;;;N;;;;; FB57;ARABIC LETTER PEH FINAL FORM;Lo;0;AL;<final> 067E;;;;N;;;;; FB58;ARABIC LETTER PEH INITIAL FORM;Lo;0;AL;<initial> 067E;;;;N;;;;; FB59;ARABIC LETTER PEH MEDIAL FORM;Lo;0;AL;<medial> 067E;;;;N;;;;; FB5A;ARABIC LETTER BEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0680;;;;N;;;;; FB5B;ARABIC LETTER BEHEH FINAL FORM;Lo;0;AL;<final> 0680;;;;N;;;;; FB5C;ARABIC LETTER BEHEH INITIAL FORM;Lo;0;AL;<initial> 0680;;;;N;;;;; FB5D;ARABIC LETTER BEHEH MEDIAL FORM;Lo;0;AL;<medial> 0680;;;;N;;;;; FB5E;ARABIC LETTER TTEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067A;;;;N;;;;; FB5F;ARABIC LETTER TTEHEH FINAL FORM;Lo;0;AL;<final> 067A;;;;N;;;;; FB60;ARABIC LETTER TTEHEH INITIAL FORM;Lo;0;AL;<initial> 067A;;;;N;;;;; FB61;ARABIC LETTER TTEHEH MEDIAL FORM;Lo;0;AL;<medial> 067A;;;;N;;;;; FB62;ARABIC LETTER TEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067F;;;;N;;;;; FB63;ARABIC LETTER TEHEH FINAL FORM;Lo;0;AL;<final> 067F;;;;N;;;;; FB64;ARABIC LETTER TEHEH INITIAL FORM;Lo;0;AL;<initial> 067F;;;;N;;;;; FB65;ARABIC LETTER TEHEH MEDIAL FORM;Lo;0;AL;<medial> 067F;;;;N;;;;; FB66;ARABIC LETTER TTEH ISOLATED FORM;Lo;0;AL;<isolated> 0679;;;;N;;;;; FB67;ARABIC LETTER TTEH FINAL FORM;Lo;0;AL;<final> 0679;;;;N;;;;; FB68;ARABIC LETTER TTEH INITIAL FORM;Lo;0;AL;<initial> 0679;;;;N;;;;; FB69;ARABIC LETTER TTEH MEDIAL FORM;Lo;0;AL;<medial> 0679;;;;N;;;;; FB6A;ARABIC LETTER VEH ISOLATED FORM;Lo;0;AL;<isolated> 06A4;;;;N;;;;; FB6B;ARABIC LETTER VEH FINAL FORM;Lo;0;AL;<final> 06A4;;;;N;;;;; FB6C;ARABIC LETTER VEH INITIAL FORM;Lo;0;AL;<initial> 06A4;;;;N;;;;; FB6D;ARABIC LETTER VEH MEDIAL FORM;Lo;0;AL;<medial> 06A4;;;;N;;;;; FB6E;ARABIC LETTER PEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A6;;;;N;;;;; FB6F;ARABIC LETTER PEHEH FINAL FORM;Lo;0;AL;<final> 06A6;;;;N;;;;; FB70;ARABIC LETTER PEHEH INITIAL FORM;Lo;0;AL;<initial> 06A6;;;;N;;;;; FB71;ARABIC LETTER PEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A6;;;;N;;;;; FB72;ARABIC LETTER DYEH ISOLATED FORM;Lo;0;AL;<isolated> 0684;;;;N;;;;; FB73;ARABIC LETTER DYEH FINAL FORM;Lo;0;AL;<final> 0684;;;;N;;;;; FB74;ARABIC LETTER DYEH INITIAL FORM;Lo;0;AL;<initial> 0684;;;;N;;;;; FB75;ARABIC LETTER DYEH MEDIAL FORM;Lo;0;AL;<medial> 0684;;;;N;;;;; FB76;ARABIC LETTER NYEH ISOLATED FORM;Lo;0;AL;<isolated> 0683;;;;N;;;;; FB77;ARABIC LETTER NYEH FINAL FORM;Lo;0;AL;<final> 0683;;;;N;;;;; FB78;ARABIC LETTER NYEH INITIAL FORM;Lo;0;AL;<initial> 0683;;;;N;;;;; FB79;ARABIC LETTER NYEH MEDIAL FORM;Lo;0;AL;<medial> 0683;;;;N;;;;; FB7A;ARABIC LETTER TCHEH ISOLATED FORM;Lo;0;AL;<isolated> 0686;;;;N;;;;; FB7B;ARABIC LETTER TCHEH FINAL FORM;Lo;0;AL;<final> 0686;;;;N;;;;; FB7C;ARABIC LETTER TCHEH INITIAL FORM;Lo;0;AL;<initial> 0686;;;;N;;;;; FB7D;ARABIC LETTER TCHEH MEDIAL FORM;Lo;0;AL;<medial> 0686;;;;N;;;;; FB7E;ARABIC LETTER TCHEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0687;;;;N;;;;; FB7F;ARABIC LETTER TCHEHEH FINAL FORM;Lo;0;AL;<final> 0687;;;;N;;;;; FB80;ARABIC LETTER TCHEHEH INITIAL FORM;Lo;0;AL;<initial> 0687;;;;N;;;;; FB81;ARABIC LETTER TCHEHEH MEDIAL FORM;Lo;0;AL;<medial> 0687;;;;N;;;;; FB82;ARABIC LETTER DDAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068D;;;;N;;;;; FB83;ARABIC LETTER DDAHAL FINAL FORM;Lo;0;AL;<final> 068D;;;;N;;;;; FB84;ARABIC LETTER DAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068C;;;;N;;;;; FB85;ARABIC LETTER DAHAL FINAL FORM;Lo;0;AL;<final> 068C;;;;N;;;;; FB86;ARABIC LETTER DUL ISOLATED FORM;Lo;0;AL;<isolated> 068E;;;;N;;;;; FB87;ARABIC LETTER DUL FINAL FORM;Lo;0;AL;<final> 068E;;;;N;;;;; FB88;ARABIC LETTER DDAL ISOLATED FORM;Lo;0;AL;<isolated> 0688;;;;N;;;;; FB89;ARABIC LETTER DDAL FINAL FORM;Lo;0;AL;<final> 0688;;;;N;;;;; FB8A;ARABIC LETTER JEH ISOLATED FORM;Lo;0;AL;<isolated> 0698;;;;N;;;;; FB8B;ARABIC LETTER JEH FINAL FORM;Lo;0;AL;<final> 0698;;;;N;;;;; FB8C;ARABIC LETTER RREH ISOLATED FORM;Lo;0;AL;<isolated> 0691;;;;N;;;;; FB8D;ARABIC LETTER RREH FINAL FORM;Lo;0;AL;<final> 0691;;;;N;;;;; FB8E;ARABIC LETTER KEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A9;;;;N;;;;; FB8F;ARABIC LETTER KEHEH FINAL FORM;Lo;0;AL;<final> 06A9;;;;N;;;;; FB90;ARABIC LETTER KEHEH INITIAL FORM;Lo;0;AL;<initial> 06A9;;;;N;;;;; FB91;ARABIC LETTER KEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A9;;;;N;;;;; FB92;ARABIC LETTER GAF ISOLATED FORM;Lo;0;AL;<isolated> 06AF;;;;N;;;;; FB93;ARABIC LETTER GAF FINAL FORM;Lo;0;AL;<final> 06AF;;;;N;;;;; FB94;ARABIC LETTER GAF INITIAL FORM;Lo;0;AL;<initial> 06AF;;;;N;;;;; FB95;ARABIC LETTER GAF MEDIAL FORM;Lo;0;AL;<medial> 06AF;;;;N;;;;; FB96;ARABIC LETTER GUEH ISOLATED FORM;Lo;0;AL;<isolated> 06B3;;;;N;;;;; FB97;ARABIC LETTER GUEH FINAL FORM;Lo;0;AL;<final> 06B3;;;;N;;;;; FB98;ARABIC LETTER GUEH INITIAL FORM;Lo;0;AL;<initial> 06B3;;;;N;;;;; FB99;ARABIC LETTER GUEH MEDIAL FORM;Lo;0;AL;<medial> 06B3;;;;N;;;;; FB9A;ARABIC LETTER NGOEH ISOLATED FORM;Lo;0;AL;<isolated> 06B1;;;;N;;;;; FB9B;ARABIC LETTER NGOEH FINAL FORM;Lo;0;AL;<final> 06B1;;;;N;;;;; FB9C;ARABIC LETTER NGOEH INITIAL FORM;Lo;0;AL;<initial> 06B1;;;;N;;;;; FB9D;ARABIC LETTER NGOEH MEDIAL FORM;Lo;0;AL;<medial> 06B1;;;;N;;;;; FB9E;ARABIC LETTER NOON GHUNNA ISOLATED FORM;Lo;0;AL;<isolated> 06BA;;;;N;;;;; FB9F;ARABIC LETTER NOON GHUNNA FINAL FORM;Lo;0;AL;<final> 06BA;;;;N;;;;; FBA0;ARABIC LETTER RNOON ISOLATED FORM;Lo;0;AL;<isolated> 06BB;;;;N;;;;; FBA1;ARABIC LETTER RNOON FINAL FORM;Lo;0;AL;<final> 06BB;;;;N;;;;; FBA2;ARABIC LETTER RNOON INITIAL FORM;Lo;0;AL;<initial> 06BB;;;;N;;;;; FBA3;ARABIC LETTER RNOON MEDIAL FORM;Lo;0;AL;<medial> 06BB;;;;N;;;;; FBA4;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06C0;;;;N;;;;; FBA5;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM;Lo;0;AL;<final> 06C0;;;;N;;;;; FBA6;ARABIC LETTER HEH GOAL ISOLATED FORM;Lo;0;AL;<isolated> 06C1;;;;N;;;;; FBA7;ARABIC LETTER HEH GOAL FINAL FORM;Lo;0;AL;<final> 06C1;;;;N;;;;; FBA8;ARABIC LETTER HEH GOAL INITIAL FORM;Lo;0;AL;<initial> 06C1;;;;N;;;;; FBA9;ARABIC LETTER HEH GOAL MEDIAL FORM;Lo;0;AL;<medial> 06C1;;;;N;;;;; FBAA;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM;Lo;0;AL;<isolated> 06BE;;;;N;;;;; FBAB;ARABIC LETTER HEH DOACHASHMEE FINAL FORM;Lo;0;AL;<final> 06BE;;;;N;;;;; FBAC;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM;Lo;0;AL;<initial> 06BE;;;;N;;;;; FBAD;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM;Lo;0;AL;<medial> 06BE;;;;N;;;;; FBAE;ARABIC LETTER YEH BARREE ISOLATED FORM;Lo;0;AL;<isolated> 06D2;;;;N;;;;; FBAF;ARABIC LETTER YEH BARREE FINAL FORM;Lo;0;AL;<final> 06D2;;;;N;;;;; FBB0;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06D3;;;;N;;;;; FBB1;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 06D3;;;;N;;;;; FBB2;ARABIC SYMBOL DOT ABOVE;Sk;0;AL;;;;;N;;;;; FBB3;ARABIC SYMBOL DOT BELOW;Sk;0;AL;;;;;N;;;;; FBB4;ARABIC SYMBOL TWO DOTS ABOVE;Sk;0;AL;;;;;N;;;;; FBB5;ARABIC SYMBOL TWO DOTS BELOW;Sk;0;AL;;;;;N;;;;; FBB6;ARABIC SYMBOL THREE DOTS ABOVE;Sk;0;AL;;;;;N;;;;; FBB7;ARABIC SYMBOL THREE DOTS BELOW;Sk;0;AL;;;;;N;;;;; FBB8;ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE;Sk;0;AL;;;;;N;;;;; FBB9;ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW;Sk;0;AL;;;;;N;;;;; FBBA;ARABIC SYMBOL FOUR DOTS ABOVE;Sk;0;AL;;;;;N;;;;; FBBB;ARABIC SYMBOL FOUR DOTS BELOW;Sk;0;AL;;;;;N;;;;; FBBC;ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW;Sk;0;AL;;;;;N;;;;; FBBD;ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE;Sk;0;AL;;;;;N;;;;; FBBE;ARABIC SYMBOL TWO DOTS VERTICALLY BELOW;Sk;0;AL;;;;;N;;;;; FBBF;ARABIC SYMBOL RING;Sk;0;AL;;;;;N;;;;; FBC0;ARABIC SYMBOL SMALL TAH ABOVE;Sk;0;AL;;;;;N;;;;; FBC1;ARABIC SYMBOL SMALL TAH BELOW;Sk;0;AL;;;;;N;;;;; FBD3;ARABIC LETTER NG ISOLATED FORM;Lo;0;AL;<isolated> 06AD;;;;N;;;;; FBD4;ARABIC LETTER NG FINAL FORM;Lo;0;AL;<final> 06AD;;;;N;;;;; FBD5;ARABIC LETTER NG INITIAL FORM;Lo;0;AL;<initial> 06AD;;;;N;;;;; FBD6;ARABIC LETTER NG MEDIAL FORM;Lo;0;AL;<medial> 06AD;;;;N;;;;; FBD7;ARABIC LETTER U ISOLATED FORM;Lo;0;AL;<isolated> 06C7;;;;N;;;;; FBD8;ARABIC LETTER U FINAL FORM;Lo;0;AL;<final> 06C7;;;;N;;;;; FBD9;ARABIC LETTER OE ISOLATED FORM;Lo;0;AL;<isolated> 06C6;;;;N;;;;; FBDA;ARABIC LETTER OE FINAL FORM;Lo;0;AL;<final> 06C6;;;;N;;;;; FBDB;ARABIC LETTER YU ISOLATED FORM;Lo;0;AL;<isolated> 06C8;;;;N;;;;; FBDC;ARABIC LETTER YU FINAL FORM;Lo;0;AL;<final> 06C8;;;;N;;;;; FBDD;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0677;;;;N;;;;; FBDE;ARABIC LETTER VE ISOLATED FORM;Lo;0;AL;<isolated> 06CB;;;;N;;;;; FBDF;ARABIC LETTER VE FINAL FORM;Lo;0;AL;<final> 06CB;;;;N;;;;; FBE0;ARABIC LETTER KIRGHIZ OE ISOLATED FORM;Lo;0;AL;<isolated> 06C5;;;;N;;;;; FBE1;ARABIC LETTER KIRGHIZ OE FINAL FORM;Lo;0;AL;<final> 06C5;;;;N;;;;; FBE2;ARABIC LETTER KIRGHIZ YU ISOLATED FORM;Lo;0;AL;<isolated> 06C9;;;;N;;;;; FBE3;ARABIC LETTER KIRGHIZ YU FINAL FORM;Lo;0;AL;<final> 06C9;;;;N;;;;; FBE4;ARABIC LETTER E ISOLATED FORM;Lo;0;AL;<isolated> 06D0;;;;N;;;;; FBE5;ARABIC LETTER E FINAL FORM;Lo;0;AL;<final> 06D0;;;;N;;;;; FBE6;ARABIC LETTER E INITIAL FORM;Lo;0;AL;<initial> 06D0;;;;N;;;;; FBE7;ARABIC LETTER E MEDIAL FORM;Lo;0;AL;<medial> 06D0;;;;N;;;;; FBE8;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0649;;;;N;;;;; FBE9;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM;Lo;0;AL;<medial> 0649;;;;N;;;;; FBEA;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0626 0627;;;;N;;;;; FBEB;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM;Lo;0;AL;<final> 0626 0627;;;;N;;;;; FBEC;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D5;;;;N;;;;; FBED;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM;Lo;0;AL;<final> 0626 06D5;;;;N;;;;; FBEE;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM;Lo;0;AL;<isolated> 0626 0648;;;;N;;;;; FBEF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM;Lo;0;AL;<final> 0626 0648;;;;N;;;;; FBF0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C7;;;;N;;;;; FBF1;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM;Lo;0;AL;<final> 0626 06C7;;;;N;;;;; FBF2;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C6;;;;N;;;;; FBF3;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM;Lo;0;AL;<final> 0626 06C6;;;;N;;;;; FBF4;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C8;;;;N;;;;; FBF5;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM;Lo;0;AL;<final> 0626 06C8;;;;N;;;;; FBF6;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D0;;;;N;;;;; FBF7;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM;Lo;0;AL;<final> 0626 06D0;;;;N;;;;; FBF8;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM;Lo;0;AL;<initial> 0626 06D0;;;;N;;;;; FBF9;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;; FBFA;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;; FBFB;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0626 0649;;;;N;;;;; FBFC;ARABIC LETTER FARSI YEH ISOLATED FORM;Lo;0;AL;<isolated> 06CC;;;;N;;;;; FBFD;ARABIC LETTER FARSI YEH FINAL FORM;Lo;0;AL;<final> 06CC;;;;N;;;;; FBFE;ARABIC LETTER FARSI YEH INITIAL FORM;Lo;0;AL;<initial> 06CC;;;;N;;;;; FBFF;ARABIC LETTER FARSI YEH MEDIAL FORM;Lo;0;AL;<medial> 06CC;;;;N;;;;; FC00;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 062C;;;;N;;;;; FC01;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0626 062D;;;;N;;;;; FC02;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 0645;;;;N;;;;; FC03;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;; FC04;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0626 064A;;;;N;;;;; FC05;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 062C;;;;N;;;;; FC06;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062D;;;;N;;;;; FC07;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062E;;;;N;;;;; FC08;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 0645;;;;N;;;;; FC09;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0628 0649;;;;N;;;;; FC0A;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0628 064A;;;;N;;;;; FC0B;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 062C;;;;N;;;;; FC0C;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062D;;;;N;;;;; FC0D;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062E;;;;N;;;;; FC0E;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 0645;;;;N;;;;; FC0F;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062A 0649;;;;N;;;;; FC10;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062A 064A;;;;N;;;;; FC11;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 062C;;;;N;;;;; FC12;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 0645;;;;N;;;;; FC13;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062B 0649;;;;N;;;;; FC14;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062B 064A;;;;N;;;;; FC15;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062C 062D;;;;N;;;;; FC16;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C 0645;;;;N;;;;; FC17;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 062C;;;;N;;;;; FC18;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 0645;;;;N;;;;; FC19;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 062C;;;;N;;;;; FC1A;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062E 062D;;;;N;;;;; FC1B;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 0645;;;;N;;;;; FC1C;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 062C;;;;N;;;;; FC1D;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062D;;;;N;;;;; FC1E;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062E;;;;N;;;;; FC1F;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 0645;;;;N;;;;; FC20;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0635 062D;;;;N;;;;; FC21;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0645;;;;N;;;;; FC22;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 062C;;;;N;;;;; FC23;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062D;;;;N;;;;; FC24;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062E;;;;N;;;;; FC25;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 0645;;;;N;;;;; FC26;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0637 062D;;;;N;;;;; FC27;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0637 0645;;;;N;;;;; FC28;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0638 0645;;;;N;;;;; FC29;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 062C;;;;N;;;;; FC2A;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 0645;;;;N;;;;; FC2B;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 062C;;;;N;;;;; FC2C;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 0645;;;;N;;;;; FC2D;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 062C;;;;N;;;;; FC2E;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062D;;;;N;;;;; FC2F;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062E;;;;N;;;;; FC30;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 0645;;;;N;;;;; FC31;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0641 0649;;;;N;;;;; FC32;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0641 064A;;;;N;;;;; FC33;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0642 062D;;;;N;;;;; FC34;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0642 0645;;;;N;;;;; FC35;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0642 0649;;;;N;;;;; FC36;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0642 064A;;;;N;;;;; FC37;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0643 0627;;;;N;;;;; FC38;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 062C;;;;N;;;;; FC39;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062D;;;;N;;;;; FC3A;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062E;;;;N;;;;; FC3B;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0644;;;;N;;;;; FC3C;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0645;;;;N;;;;; FC3D;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0643 0649;;;;N;;;;; FC3E;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0643 064A;;;;N;;;;; FC3F;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 062C;;;;N;;;;; FC40;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062D;;;;N;;;;; FC41;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062E;;;;N;;;;; FC42;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 0645;;;;N;;;;; FC43;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0644 0649;;;;N;;;;; FC44;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0644 064A;;;;N;;;;; FC45;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 062C;;;;N;;;;; FC46;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D;;;;N;;;;; FC47;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062E;;;;N;;;;; FC48;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 0645;;;;N;;;;; FC49;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0645 0649;;;;N;;;;; FC4A;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0645 064A;;;;N;;;;; FC4B;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 062C;;;;N;;;;; FC4C;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062D;;;;N;;;;; FC4D;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062E;;;;N;;;;; FC4E;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 0645;;;;N;;;;; FC4F;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0646 0649;;;;N;;;;; FC50;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0646 064A;;;;N;;;;; FC51;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 062C;;;;N;;;;; FC52;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 0645;;;;N;;;;; FC53;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0647 0649;;;;N;;;;; FC54;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0647 064A;;;;N;;;;; FC55;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 062C;;;;N;;;;; FC56;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062D;;;;N;;;;; FC57;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062E;;;;N;;;;; FC58;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 0645;;;;N;;;;; FC59;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 064A 0649;;;;N;;;;; FC5A;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A 064A;;;;N;;;;; FC5B;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0630 0670;;;;N;;;;; FC5C;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0631 0670;;;;N;;;;; FC5D;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0649 0670;;;;N;;;;; FC5E;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C 0651;;;;N;;;;; FC5F;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D 0651;;;;N;;;;; FC60;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E 0651;;;;N;;;;; FC61;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F 0651;;;;N;;;;; FC62;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650 0651;;;;N;;;;; FC63;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651 0670;;;;N;;;;; FC64;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM;Lo;0;AL;<final> 0626 0631;;;;N;;;;; FC65;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0626 0632;;;;N;;;;; FC66;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM;Lo;0;AL;<final> 0626 0645;;;;N;;;;; FC67;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM;Lo;0;AL;<final> 0626 0646;;;;N;;;;; FC68;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;; FC69;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM;Lo;0;AL;<final> 0626 064A;;;;N;;;;; FC6A;ARABIC LIGATURE BEH WITH REH FINAL FORM;Lo;0;AL;<final> 0628 0631;;;;N;;;;; FC6B;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0628 0632;;;;N;;;;; FC6C;ARABIC LIGATURE BEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0628 0645;;;;N;;;;; FC6D;ARABIC LIGATURE BEH WITH NOON FINAL FORM;Lo;0;AL;<final> 0628 0646;;;;N;;;;; FC6E;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0628 0649;;;;N;;;;; FC6F;ARABIC LIGATURE BEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 064A;;;;N;;;;; FC70;ARABIC LIGATURE TEH WITH REH FINAL FORM;Lo;0;AL;<final> 062A 0631;;;;N;;;;; FC71;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062A 0632;;;;N;;;;; FC72;ARABIC LIGATURE TEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062A 0645;;;;N;;;;; FC73;ARABIC LIGATURE TEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062A 0646;;;;N;;;;; FC74;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0649;;;;N;;;;; FC75;ARABIC LIGATURE TEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 064A;;;;N;;;;; FC76;ARABIC LIGATURE THEH WITH REH FINAL FORM;Lo;0;AL;<final> 062B 0631;;;;N;;;;; FC77;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062B 0632;;;;N;;;;; FC78;ARABIC LIGATURE THEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062B 0645;;;;N;;;;; FC79;ARABIC LIGATURE THEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062B 0646;;;;N;;;;; FC7A;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062B 0649;;;;N;;;;; FC7B;ARABIC LIGATURE THEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062B 064A;;;;N;;;;; FC7C;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0641 0649;;;;N;;;;; FC7D;ARABIC LIGATURE FEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 064A;;;;N;;;;; FC7E;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0642 0649;;;;N;;;;; FC7F;ARABIC LIGATURE QAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 064A;;;;N;;;;; FC80;ARABIC LIGATURE KAF WITH ALEF FINAL FORM;Lo;0;AL;<final> 0643 0627;;;;N;;;;; FC81;ARABIC LIGATURE KAF WITH LAM FINAL FORM;Lo;0;AL;<final> 0643 0644;;;;N;;;;; FC82;ARABIC LIGATURE KAF WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645;;;;N;;;;; FC83;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0643 0649;;;;N;;;;; FC84;ARABIC LIGATURE KAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 064A;;;;N;;;;; FC85;ARABIC LIGATURE LAM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 0645;;;;N;;;;; FC86;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 0649;;;;N;;;;; FC87;ARABIC LIGATURE LAM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 064A;;;;N;;;;; FC88;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0645 0627;;;;N;;;;; FC89;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0645 0645;;;;N;;;;; FC8A;ARABIC LIGATURE NOON WITH REH FINAL FORM;Lo;0;AL;<final> 0646 0631;;;;N;;;;; FC8B;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0646 0632;;;;N;;;;; FC8C;ARABIC LIGATURE NOON WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 0645;;;;N;;;;; FC8D;ARABIC LIGATURE NOON WITH NOON FINAL FORM;Lo;0;AL;<final> 0646 0646;;;;N;;;;; FC8E;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0649;;;;N;;;;; FC8F;ARABIC LIGATURE NOON WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 064A;;;;N;;;;; FC90;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM;Lo;0;AL;<final> 0649 0670;;;;N;;;;; FC91;ARABIC LIGATURE YEH WITH REH FINAL FORM;Lo;0;AL;<final> 064A 0631;;;;N;;;;; FC92;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 064A 0632;;;;N;;;;; FC93;ARABIC LIGATURE YEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645;;;;N;;;;; FC94;ARABIC LIGATURE YEH WITH NOON FINAL FORM;Lo;0;AL;<final> 064A 0646;;;;N;;;;; FC95;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 064A 0649;;;;N;;;;; FC96;ARABIC LIGATURE YEH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 064A;;;;N;;;;; FC97;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0626 062C;;;;N;;;;; FC98;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0626 062D;;;;N;;;;; FC99;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0626 062E;;;;N;;;;; FC9A;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0626 0645;;;;N;;;;; FC9B;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0626 0647;;;;N;;;;; FC9C;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0628 062C;;;;N;;;;; FC9D;ARABIC LIGATURE BEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0628 062D;;;;N;;;;; FC9E;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0628 062E;;;;N;;;;; FC9F;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0628 0645;;;;N;;;;; FCA0;ARABIC LIGATURE BEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0628 0647;;;;N;;;;; FCA1;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C;;;;N;;;;; FCA2;ARABIC LIGATURE TEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 062D;;;;N;;;;; FCA3;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 062E;;;;N;;;;; FCA4;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645;;;;N;;;;; FCA5;ARABIC LIGATURE TEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 062A 0647;;;;N;;;;; FCA6;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062B 0645;;;;N;;;;; FCA7;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 062D;;;;N;;;;; FCA8;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062C 0645;;;;N;;;;; FCA9;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062D 062C;;;;N;;;;; FCAA;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062D 0645;;;;N;;;;; FCAB;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062E 062C;;;;N;;;;; FCAC;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062E 0645;;;;N;;;;; FCAD;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062C;;;;N;;;;; FCAE;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062D;;;;N;;;;; FCAF;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0633 062E;;;;N;;;;; FCB0;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645;;;;N;;;;; FCB1;ARABIC LIGATURE SAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D;;;;N;;;;; FCB2;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0635 062E;;;;N;;;;; FCB3;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645;;;;N;;;;; FCB4;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062C;;;;N;;;;; FCB5;ARABIC LIGATURE DAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0636 062D;;;;N;;;;; FCB6;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0636 062E;;;;N;;;;; FCB7;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 0645;;;;N;;;;; FCB8;ARABIC LIGATURE TAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 062D;;;;N;;;;; FCB9;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0638 0645;;;;N;;;;; FCBA;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C;;;;N;;;;; FCBB;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645;;;;N;;;;; FCBC;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 063A 062C;;;;N;;;;; FCBD;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 063A 0645;;;;N;;;;; FCBE;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062C;;;;N;;;;; FCBF;ARABIC LIGATURE FEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0641 062D;;;;N;;;;; FCC0;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0641 062E;;;;N;;;;; FCC1;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 0645;;;;N;;;;; FCC2;ARABIC LIGATURE QAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 062D;;;;N;;;;; FCC3;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0642 0645;;;;N;;;;; FCC4;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0643 062C;;;;N;;;;; FCC5;ARABIC LIGATURE KAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0643 062D;;;;N;;;;; FCC6;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0643 062E;;;;N;;;;; FCC7;ARABIC LIGATURE KAF WITH LAM INITIAL FORM;Lo;0;AL;<initial> 0643 0644;;;;N;;;;; FCC8;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645;;;;N;;;;; FCC9;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C;;;;N;;;;; FCCA;ARABIC LIGATURE LAM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 062D;;;;N;;;;; FCCB;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0644 062E;;;;N;;;;; FCCC;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 0645;;;;N;;;;; FCCD;ARABIC LIGATURE LAM WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0644 0647;;;;N;;;;; FCCE;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C;;;;N;;;;; FCCF;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062D;;;;N;;;;; FCD0;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062E;;;;N;;;;; FCD1;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 0645;;;;N;;;;; FCD2;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C;;;;N;;;;; FCD3;ARABIC LIGATURE NOON WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062D;;;;N;;;;; FCD4;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0646 062E;;;;N;;;;; FCD5;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 0645;;;;N;;;;; FCD6;ARABIC LIGATURE NOON WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0646 0647;;;;N;;;;; FCD7;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 062C;;;;N;;;;; FCD8;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645;;;;N;;;;; FCD9;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM;Lo;0;AL;<initial> 0647 0670;;;;N;;;;; FCDA;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 064A 062C;;;;N;;;;; FCDB;ARABIC LIGATURE YEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 064A 062D;;;;N;;;;; FCDC;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 064A 062E;;;;N;;;;; FCDD;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645;;;;N;;;;; FCDE;ARABIC LIGATURE YEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 064A 0647;;;;N;;;;; FCDF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0626 0645;;;;N;;;;; FCE0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0626 0647;;;;N;;;;; FCE1;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0628 0645;;;;N;;;;; FCE2;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0628 0647;;;;N;;;;; FCE3;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062A 0645;;;;N;;;;; FCE4;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062A 0647;;;;N;;;;; FCE5;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062B 0645;;;;N;;;;; FCE6;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062B 0647;;;;N;;;;; FCE7;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 0645;;;;N;;;;; FCE8;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0633 0647;;;;N;;;;; FCE9;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 0645;;;;N;;;;; FCEA;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0634 0647;;;;N;;;;; FCEB;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM;Lo;0;AL;<medial> 0643 0644;;;;N;;;;; FCEC;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0643 0645;;;;N;;;;; FCED;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0644 0645;;;;N;;;;; FCEE;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0646 0645;;;;N;;;;; FCEF;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0646 0647;;;;N;;;;; FCF0;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 064A 0645;;;;N;;;;; FCF1;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 064A 0647;;;;N;;;;; FCF2;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E 0651;;;;N;;;;; FCF3;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F 0651;;;;N;;;;; FCF4;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650 0651;;;;N;;;;; FCF5;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0637 0649;;;;N;;;;; FCF6;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0637 064A;;;;N;;;;; FCF7;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0639 0649;;;;N;;;;; FCF8;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0639 064A;;;;N;;;;; FCF9;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 063A 0649;;;;N;;;;; FCFA;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 063A 064A;;;;N;;;;; FCFB;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0633 0649;;;;N;;;;; FCFC;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0633 064A;;;;N;;;;; FCFD;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0634 0649;;;;N;;;;; FCFE;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0634 064A;;;;N;;;;; FCFF;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062D 0649;;;;N;;;;; FD00;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062D 064A;;;;N;;;;; FD01;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062C 0649;;;;N;;;;; FD02;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062C 064A;;;;N;;;;; FD03;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062E 0649;;;;N;;;;; FD04;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062E 064A;;;;N;;;;; FD05;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0649;;;;N;;;;; FD06;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0635 064A;;;;N;;;;; FD07;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0636 0649;;;;N;;;;; FD08;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0636 064A;;;;N;;;;; FD09;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 062C;;;;N;;;;; FD0A;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062D;;;;N;;;;; FD0B;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062E;;;;N;;;;; FD0C;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 0645;;;;N;;;;; FD0D;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0634 0631;;;;N;;;;; FD0E;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0633 0631;;;;N;;;;; FD0F;ARABIC LIGATURE SAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0635 0631;;;;N;;;;; FD10;ARABIC LIGATURE DAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0636 0631;;;;N;;;;; FD11;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0637 0649;;;;N;;;;; FD12;ARABIC LIGATURE TAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 064A;;;;N;;;;; FD13;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0649;;;;N;;;;; FD14;ARABIC LIGATURE AIN WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 064A;;;;N;;;;; FD15;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0649;;;;N;;;;; FD16;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 064A;;;;N;;;;; FD17;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 0649;;;;N;;;;; FD18;ARABIC LIGATURE SEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 064A;;;;N;;;;; FD19;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0634 0649;;;;N;;;;; FD1A;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 064A;;;;N;;;;; FD1B;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0649;;;;N;;;;; FD1C;ARABIC LIGATURE HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 064A;;;;N;;;;; FD1D;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0649;;;;N;;;;; FD1E;ARABIC LIGATURE JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 064A;;;;N;;;;; FD1F;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062E 0649;;;;N;;;;; FD20;ARABIC LIGATURE KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062E 064A;;;;N;;;;; FD21;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0635 0649;;;;N;;;;; FD22;ARABIC LIGATURE SAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 064A;;;;N;;;;; FD23;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 0649;;;;N;;;;; FD24;ARABIC LIGATURE DAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 064A;;;;N;;;;; FD25;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM;Lo;0;AL;<final> 0634 062C;;;;N;;;;; FD26;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM;Lo;0;AL;<final> 0634 062D;;;;N;;;;; FD27;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 062E;;;;N;;;;; FD28;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645;;;;N;;;;; FD29;ARABIC LIGATURE SHEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0634 0631;;;;N;;;;; FD2A;ARABIC LIGATURE SEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0633 0631;;;;N;;;;; FD2B;ARABIC LIGATURE SAD WITH REH FINAL FORM;Lo;0;AL;<final> 0635 0631;;;;N;;;;; FD2C;ARABIC LIGATURE DAD WITH REH FINAL FORM;Lo;0;AL;<final> 0636 0631;;;;N;;;;; FD2D;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062C;;;;N;;;;; FD2E;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0634 062D;;;;N;;;;; FD2F;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 062E;;;;N;;;;; FD30;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645;;;;N;;;;; FD31;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0633 0647;;;;N;;;;; FD32;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0634 0647;;;;N;;;;; FD33;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645;;;;N;;;;; FD34;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 062C;;;;N;;;;; FD35;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062D;;;;N;;;;; FD36;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062E;;;;N;;;;; FD37;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 062C;;;;N;;;;; FD38;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062D;;;;N;;;;; FD39;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062E;;;;N;;;;; FD3A;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0637 0645;;;;N;;;;; FD3B;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0638 0645;;;;N;;;;; FD3C;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM;Lo;0;AL;<final> 0627 064B;;;;N;;;;; FD3D;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0627 064B;;;;N;;;;; FD3E;ORNATE LEFT PARENTHESIS;Pe;0;ON;;;;;N;;;;; FD3F;ORNATE RIGHT PARENTHESIS;Ps;0;ON;;;;;N;;;;; FD50;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C 0645;;;;N;;;;; FD51;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM;Lo;0;AL;<final> 062A 062D 062C;;;;N;;;;; FD52;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 062C;;;;N;;;;; FD53;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 0645;;;;N;;;;; FD54;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062E 0645;;;;N;;;;; FD55;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062C;;;;N;;;;; FD56;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062D;;;;N;;;;; FD57;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062E;;;;N;;;;; FD58;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 062C 0645 062D;;;;N;;;;; FD59;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 0645 062D;;;;N;;;;; FD5A;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 0645 064A;;;;N;;;;; FD5B;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0645 0649;;;;N;;;;; FD5C;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062D 062C;;;;N;;;;; FD5D;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062C 062D;;;;N;;;;; FD5E;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062C 0649;;;;N;;;;; FD5F;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0633 0645 062D;;;;N;;;;; FD60;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062D;;;;N;;;;; FD61;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062C;;;;N;;;;; FD62;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0633 0645 0645;;;;N;;;;; FD63;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 0645;;;;N;;;;; FD64;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM;Lo;0;AL;<final> 0635 062D 062D;;;;N;;;;; FD65;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D 062D;;;;N;;;;; FD66;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0635 0645 0645;;;;N;;;;; FD67;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 062D 0645;;;;N;;;;; FD68;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062D 0645;;;;N;;;;; FD69;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062C 064A;;;;N;;;;; FD6A;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 0645 062E;;;;N;;;;; FD6B;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 0645 062E;;;;N;;;;; FD6C;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645 0645;;;;N;;;;; FD6D;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645 0645;;;;N;;;;; FD6E;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 062D 0649;;;;N;;;;; FD6F;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0636 062E 0645;;;;N;;;;; FD70;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062E 0645;;;;N;;;;; FD71;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0637 0645 062D;;;;N;;;;; FD72;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 0645 062D;;;;N;;;;; FD73;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645 0645;;;;N;;;;; FD74;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 0645 064A;;;;N;;;;; FD75;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 062C 0645;;;;N;;;;; FD76;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 0645 0645;;;;N;;;;; FD77;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645 0645;;;;N;;;;; FD78;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0645 0649;;;;N;;;;; FD79;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 063A 0645 0645;;;;N;;;;; FD7A;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 0645 064A;;;;N;;;;; FD7B;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0645 0649;;;;N;;;;; FD7C;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0641 062E 0645;;;;N;;;;; FD7D;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062E 0645;;;;N;;;;; FD7E;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0642 0645 062D;;;;N;;;;; FD7F;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0642 0645 0645;;;;N;;;;; FD80;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062D 0645;;;;N;;;;; FD81;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062D 064A;;;;N;;;;; FD82;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 062D 0649;;;;N;;;;; FD83;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 062C;;;;N;;;;; FD84;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 062C;;;;N;;;;; FD85;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062E 0645;;;;N;;;;; FD86;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062E 0645;;;;N;;;;; FD87;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0644 0645 062D;;;;N;;;;; FD88;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 0645 062D;;;;N;;;;; FD89;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 062C;;;;N;;;;; FD8A;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 0645;;;;N;;;;; FD8B;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062D 064A;;;;N;;;;; FD8C;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062D;;;;N;;;;; FD8D;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C 0645;;;;N;;;;; FD8E;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 062C;;;;N;;;;; FD8F;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 0645;;;;N;;;;; FD92;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062E;;;;N;;;;; FD93;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 062C;;;;N;;;;; FD94;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 0645;;;;N;;;;; FD95;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062D 0645;;;;N;;;;; FD96;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062D 0649;;;;N;;;;; FD97;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 062C 0645;;;;N;;;;; FD98;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C 0645;;;;N;;;;; FD99;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062C 0649;;;;N;;;;; FD9A;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 0645 064A;;;;N;;;;; FD9B;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0645 0649;;;;N;;;;; FD9C;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645 0645;;;;N;;;;; FD9D;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645 0645;;;;N;;;;; FD9E;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062E 064A;;;;N;;;;; FD9F;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062C 064A;;;;N;;;;; FDA0;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062C 0649;;;;N;;;;; FDA1;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062E 064A;;;;N;;;;; FDA2;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062E 0649;;;;N;;;;; FDA3;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 0645 064A;;;;N;;;;; FDA4;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0645 0649;;;;N;;;;; FDA5;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 0645 064A;;;;N;;;;; FDA6;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 062D 0649;;;;N;;;;; FDA7;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0645 0649;;;;N;;;;; FDA8;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062E 0649;;;;N;;;;; FDA9;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 062D 064A;;;;N;;;;; FDAA;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062D 064A;;;;N;;;;; FDAB;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 062D 064A;;;;N;;;;; FDAC;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062C 064A;;;;N;;;;; FDAD;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 0645 064A;;;;N;;;;; FDAE;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062D 064A;;;;N;;;;; FDAF;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062C 064A;;;;N;;;;; FDB0;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 0645 064A;;;;N;;;;; FDB1;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 0645 064A;;;;N;;;;; FDB2;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 0645 064A;;;;N;;;;; FDB3;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062D 064A;;;;N;;;;; FDB4;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 0645 062D;;;;N;;;;; FDB5;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062D 0645;;;;N;;;;; FDB6;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 0645 064A;;;;N;;;;; FDB7;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 0645 064A;;;;N;;;;; FDB8;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062C 062D;;;;N;;;;; FDB9;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062E 064A;;;;N;;;;; FDBA;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 0645;;;;N;;;;; FDBB;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645 0645;;;;N;;;;; FDBC;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 0645;;;;N;;;;; FDBD;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0646 062C 062D;;;;N;;;;; FDBE;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 062D 064A;;;;N;;;;; FDBF;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 062C 064A;;;;N;;;;; FDC0;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062C 064A;;;;N;;;;; FDC1;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 0645 064A;;;;N;;;;; FDC2;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062D 064A;;;;N;;;;; FDC3;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645 0645;;;;N;;;;; FDC4;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C 0645;;;;N;;;;; FDC5;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645 0645;;;;N;;;;; FDC6;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 062E 064A;;;;N;;;;; FDC7;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062C 064A;;;;N;;;;; FDF0;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 06D2;;;;N;;;;; FDF1;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0642 0644 06D2;;;;N;;;;; FDF2;ARABIC LIGATURE ALLAH ISOLATED FORM;Lo;0;AL;<isolated> 0627 0644 0644 0647;;;;N;;;;; FDF3;ARABIC LIGATURE AKBAR ISOLATED FORM;Lo;0;AL;<isolated> 0627 0643 0628 0631;;;;N;;;;; FDF4;ARABIC LIGATURE MOHAMMAD ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D 0645 062F;;;;N;;;;; FDF5;ARABIC LIGATURE SALAM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0639 0645;;;;N;;;;; FDF6;ARABIC LIGATURE RASOUL ISOLATED FORM;Lo;0;AL;<isolated> 0631 0633 0648 0644;;;;N;;;;; FDF7;ARABIC LIGATURE ALAYHE ISOLATED FORM;Lo;0;AL;<isolated> 0639 0644 064A 0647;;;;N;;;;; FDF8;ARABIC LIGATURE WASALLAM ISOLATED FORM;Lo;0;AL;<isolated> 0648 0633 0644 0645;;;;N;;;;; FDF9;ARABIC LIGATURE SALLA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0649;;;;N;;;;; FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL;<isolated> 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;;;;N;ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM;;;; FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL;<isolated> 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;; FDFC;RIAL SIGN;Sc;0;AL;<isolated> 0631 06CC 0627 0644;;;;N;;;;; FDFD;ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM;So;0;ON;;;;;N;;;;; FE00;VARIATION SELECTOR-1;Mn;0;NSM;;;;;N;;;;; FE01;VARIATION SELECTOR-2;Mn;0;NSM;;;;;N;;;;; FE02;VARIATION SELECTOR-3;Mn;0;NSM;;;;;N;;;;; FE03;VARIATION SELECTOR-4;Mn;0;NSM;;;;;N;;;;; FE04;VARIATION SELECTOR-5;Mn;0;NSM;;;;;N;;;;; FE05;VARIATION SELECTOR-6;Mn;0;NSM;;;;;N;;;;; FE06;VARIATION SELECTOR-7;Mn;0;NSM;;;;;N;;;;; FE07;VARIATION SELECTOR-8;Mn;0;NSM;;;;;N;;;;; FE08;VARIATION SELECTOR-9;Mn;0;NSM;;;;;N;;;;; FE09;VARIATION SELECTOR-10;Mn;0;NSM;;;;;N;;;;; FE0A;VARIATION SELECTOR-11;Mn;0;NSM;;;;;N;;;;; FE0B;VARIATION SELECTOR-12;Mn;0;NSM;;;;;N;;;;; FE0C;VARIATION SELECTOR-13;Mn;0;NSM;;;;;N;;;;; FE0D;VARIATION SELECTOR-14;Mn;0;NSM;;;;;N;;;;; FE0E;VARIATION SELECTOR-15;Mn;0;NSM;;;;;N;;;;; FE0F;VARIATION SELECTOR-16;Mn;0;NSM;;;;;N;;;;; FE10;PRESENTATION FORM FOR VERTICAL COMMA;Po;0;ON;<vertical> 002C;;;;N;;;;; FE11;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA;Po;0;ON;<vertical> 3001;;;;N;;;;; FE12;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP;Po;0;ON;<vertical> 3002;;;;N;;;;; FE13;PRESENTATION FORM FOR VERTICAL COLON;Po;0;ON;<vertical> 003A;;;;N;;;;; FE14;PRESENTATION FORM FOR VERTICAL SEMICOLON;Po;0;ON;<vertical> 003B;;;;N;;;;; FE15;PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK;Po;0;ON;<vertical> 0021;;;;N;;;;; FE16;PRESENTATION FORM FOR VERTICAL QUESTION MARK;Po;0;ON;<vertical> 003F;;;;N;;;;; FE17;PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;<vertical> 3016;;;;N;;;;; FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET;Pe;0;ON;<vertical> 3017;;;;N;;;;; FE19;PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS;Po;0;ON;<vertical> 2026;;;;N;;;;; FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;; FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;; FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; FE24;COMBINING MACRON LEFT HALF;Mn;230;NSM;;;;;N;;;;; FE25;COMBINING MACRON RIGHT HALF;Mn;230;NSM;;;;;N;;;;; FE26;COMBINING CONJOINING MACRON;Mn;230;NSM;;;;;N;;;;; FE27;COMBINING LIGATURE LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; FE28;COMBINING LIGATURE RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; FE29;COMBINING TILDE LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; FE2A;COMBINING TILDE RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; FE2B;COMBINING MACRON LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; FE2C;COMBINING MACRON RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; FE2D;COMBINING CONJOINING MACRON BELOW;Mn;220;NSM;;;;;N;;;;; FE2E;COMBINING CYRILLIC TITLO LEFT HALF;Mn;230;NSM;;;;;N;;;;; FE2F;COMBINING CYRILLIC TITLO RIGHT HALF;Mn;230;NSM;;;;;N;;;;; FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON;<vertical> 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;; FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON;<vertical> 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;; FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON;<vertical> 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;; FE33;PRESENTATION FORM FOR VERTICAL LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING UNDERSCORE;;;; FE34;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE;;;; FE35;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS;Ps;0;ON;<vertical> 0028;;;;N;GLYPH FOR VERTICAL OPENING PARENTHESIS;;;; FE36;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS;Pe;0;ON;<vertical> 0029;;;;N;GLYPH FOR VERTICAL CLOSING PARENTHESIS;;;; FE37;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET;Ps;0;ON;<vertical> 007B;;;;N;GLYPH FOR VERTICAL OPENING CURLY BRACKET;;;; FE38;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET;Pe;0;ON;<vertical> 007D;;;;N;GLYPH FOR VERTICAL CLOSING CURLY BRACKET;;;; FE39;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<vertical> 3014;;;;N;GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET;;;; FE3A;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<vertical> 3015;;;;N;GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET;;;; FE3B;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;<vertical> 3010;;;;N;GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET;;;; FE3C;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;<vertical> 3011;;;;N;GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET;;;; FE3D;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;<vertical> 300A;;;;N;GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET;;;; FE3E;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;<vertical> 300B;;;;N;GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET;;;; FE3F;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET;Ps;0;ON;<vertical> 3008;;;;N;GLYPH FOR VERTICAL OPENING ANGLE BRACKET;;;; FE40;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET;Pe;0;ON;<vertical> 3009;;;;N;GLYPH FOR VERTICAL CLOSING ANGLE BRACKET;;;; FE41;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET;Ps;0;ON;<vertical> 300C;;;;N;GLYPH FOR VERTICAL OPENING CORNER BRACKET;;;; FE42;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET;Pe;0;ON;<vertical> 300D;;;;N;GLYPH FOR VERTICAL CLOSING CORNER BRACKET;;;; FE43;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET;Ps;0;ON;<vertical> 300E;;;;N;GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET;;;; FE44;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET;Pe;0;ON;<vertical> 300F;;;;N;GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET;;;; FE45;SESAME DOT;Po;0;ON;;;;;N;;;;; FE46;WHITE SESAME DOT;Po;0;ON;;;;;N;;;;; FE47;PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET;Ps;0;ON;<vertical> 005B;;;;N;;;;; FE48;PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET;Pe;0;ON;<vertical> 005D;;;;N;;;;; FE49;DASHED OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DASHED OVERSCORE;;;; FE4A;CENTRELINE OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING CENTERLINE OVERSCORE;;;; FE4B;WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING WAVY OVERSCORE;;;; FE4C;DOUBLE WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DOUBLE WAVY OVERSCORE;;;; FE4D;DASHED LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING DASHED UNDERSCORE;;;; FE4E;CENTRELINE LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING CENTERLINE UNDERSCORE;;;; FE4F;WAVY LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING WAVY UNDERSCORE;;;; FE50;SMALL COMMA;Po;0;CS;<small> 002C;;;;N;;;;; FE51;SMALL IDEOGRAPHIC COMMA;Po;0;ON;<small> 3001;;;;N;;;;; FE52;SMALL FULL STOP;Po;0;CS;<small> 002E;;;;N;SMALL PERIOD;;;; FE54;SMALL SEMICOLON;Po;0;ON;<small> 003B;;;;N;;;;; FE55;SMALL COLON;Po;0;CS;<small> 003A;;;;N;;;;; FE56;SMALL QUESTION MARK;Po;0;ON;<small> 003F;;;;N;;;;; FE57;SMALL EXCLAMATION MARK;Po;0;ON;<small> 0021;;;;N;;;;; FE58;SMALL EM DASH;Pd;0;ON;<small> 2014;;;;N;;;;; FE59;SMALL LEFT PARENTHESIS;Ps;0;ON;<small> 0028;;;;Y;SMALL OPENING PARENTHESIS;;;; FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON;<small> 0029;;;;Y;SMALL CLOSING PARENTHESIS;;;; FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON;<small> 007B;;;;Y;SMALL OPENING CURLY BRACKET;;;; FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON;<small> 007D;;;;Y;SMALL CLOSING CURLY BRACKET;;;; FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<small> 3014;;;;Y;SMALL OPENING TORTOISE SHELL BRACKET;;;; FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<small> 3015;;;;Y;SMALL CLOSING TORTOISE SHELL BRACKET;;;; FE5F;SMALL NUMBER SIGN;Po;0;ET;<small> 0023;;;;N;;;;; FE60;SMALL AMPERSAND;Po;0;ON;<small> 0026;;;;N;;;;; FE61;SMALL ASTERISK;Po;0;ON;<small> 002A;;;;N;;;;; FE62;SMALL PLUS SIGN;Sm;0;ES;<small> 002B;;;;N;;;;; FE63;SMALL HYPHEN-MINUS;Pd;0;ES;<small> 002D;;;;N;;;;; FE64;SMALL LESS-THAN SIGN;Sm;0;ON;<small> 003C;;;;Y;;;;; FE65;SMALL GREATER-THAN SIGN;Sm;0;ON;<small> 003E;;;;Y;;;;; FE66;SMALL EQUALS SIGN;Sm;0;ON;<small> 003D;;;;N;;;;; FE68;SMALL REVERSE SOLIDUS;Po;0;ON;<small> 005C;;;;N;SMALL BACKSLASH;;;; FE69;SMALL DOLLAR SIGN;Sc;0;ET;<small> 0024;;;;N;;;;; FE6A;SMALL PERCENT SIGN;Po;0;ET;<small> 0025;;;;N;;;;; FE6B;SMALL COMMERCIAL AT;Po;0;ON;<small> 0040;;;;N;;;;; FE70;ARABIC FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064B;;;;N;ARABIC SPACING FATHATAN;;;; FE71;ARABIC TATWEEL WITH FATHATAN ABOVE;Lo;0;AL;<medial> 0640 064B;;;;N;ARABIC FATHATAN ON TATWEEL;;;; FE72;ARABIC DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C;;;;N;ARABIC SPACING DAMMATAN;;;; FE73;ARABIC TAIL FRAGMENT;Lo;0;AL;;;;;N;;;;; FE74;ARABIC KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D;;;;N;ARABIC SPACING KASRATAN;;;; FE76;ARABIC FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E;;;;N;ARABIC SPACING FATHAH;;;; FE77;ARABIC FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E;;;;N;ARABIC FATHAH ON TATWEEL;;;; FE78;ARABIC DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F;;;;N;ARABIC SPACING DAMMAH;;;; FE79;ARABIC DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F;;;;N;ARABIC DAMMAH ON TATWEEL;;;; FE7A;ARABIC KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650;;;;N;ARABIC SPACING KASRAH;;;; FE7B;ARABIC KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650;;;;N;ARABIC KASRAH ON TATWEEL;;;; FE7C;ARABIC SHADDA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651;;;;N;ARABIC SPACING SHADDAH;;;; FE7D;ARABIC SHADDA MEDIAL FORM;Lo;0;AL;<medial> 0640 0651;;;;N;ARABIC SHADDAH ON TATWEEL;;;; FE7E;ARABIC SUKUN ISOLATED FORM;Lo;0;AL;<isolated> 0020 0652;;;;N;ARABIC SPACING SUKUN;;;; FE7F;ARABIC SUKUN MEDIAL FORM;Lo;0;AL;<medial> 0640 0652;;;;N;ARABIC SUKUN ON TATWEEL;;;; FE80;ARABIC LETTER HAMZA ISOLATED FORM;Lo;0;AL;<isolated> 0621;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH;;;; FE81;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF;;;; FE82;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON ALEF;;;; FE83;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF;;;; FE84;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON ALEF;;;; FE85;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0624;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW;;;; FE86;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0624;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON WAW;;;; FE87;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF;;;; FE88;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF;;;; FE89;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0626;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON YA;;;; FE8A;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0626;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON YA;;;; FE8B;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM;Lo;0;AL;<initial> 0626;;;;N;GLYPH FOR INITIAL ARABIC HAMZAH ON YA;;;; FE8C;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM;Lo;0;AL;<medial> 0626;;;;N;GLYPH FOR MEDIAL ARABIC HAMZAH ON YA;;;; FE8D;ARABIC LETTER ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0627;;;;N;GLYPH FOR ISOLATE ARABIC ALEF;;;; FE8E;ARABIC LETTER ALEF FINAL FORM;Lo;0;AL;<final> 0627;;;;N;GLYPH FOR FINAL ARABIC ALEF;;;; FE8F;ARABIC LETTER BEH ISOLATED FORM;Lo;0;AL;<isolated> 0628;;;;N;GLYPH FOR ISOLATE ARABIC BAA;;;; FE90;ARABIC LETTER BEH FINAL FORM;Lo;0;AL;<final> 0628;;;;N;GLYPH FOR FINAL ARABIC BAA;;;; FE91;ARABIC LETTER BEH INITIAL FORM;Lo;0;AL;<initial> 0628;;;;N;GLYPH FOR INITIAL ARABIC BAA;;;; FE92;ARABIC LETTER BEH MEDIAL FORM;Lo;0;AL;<medial> 0628;;;;N;GLYPH FOR MEDIAL ARABIC BAA;;;; FE93;ARABIC LETTER TEH MARBUTA ISOLATED FORM;Lo;0;AL;<isolated> 0629;;;;N;GLYPH FOR ISOLATE ARABIC TAA MARBUTAH;;;; FE94;ARABIC LETTER TEH MARBUTA FINAL FORM;Lo;0;AL;<final> 0629;;;;N;GLYPH FOR FINAL ARABIC TAA MARBUTAH;;;; FE95;ARABIC LETTER TEH ISOLATED FORM;Lo;0;AL;<isolated> 062A;;;;N;GLYPH FOR ISOLATE ARABIC TAA;;;; FE96;ARABIC LETTER TEH FINAL FORM;Lo;0;AL;<final> 062A;;;;N;GLYPH FOR FINAL ARABIC TAA;;;; FE97;ARABIC LETTER TEH INITIAL FORM;Lo;0;AL;<initial> 062A;;;;N;GLYPH FOR INITIAL ARABIC TAA;;;; FE98;ARABIC LETTER TEH MEDIAL FORM;Lo;0;AL;<medial> 062A;;;;N;GLYPH FOR MEDIAL ARABIC TAA;;;; FE99;ARABIC LETTER THEH ISOLATED FORM;Lo;0;AL;<isolated> 062B;;;;N;GLYPH FOR ISOLATE ARABIC THAA;;;; FE9A;ARABIC LETTER THEH FINAL FORM;Lo;0;AL;<final> 062B;;;;N;GLYPH FOR FINAL ARABIC THAA;;;; FE9B;ARABIC LETTER THEH INITIAL FORM;Lo;0;AL;<initial> 062B;;;;N;GLYPH FOR INITIAL ARABIC THAA;;;; FE9C;ARABIC LETTER THEH MEDIAL FORM;Lo;0;AL;<medial> 062B;;;;N;GLYPH FOR MEDIAL ARABIC THAA;;;; FE9D;ARABIC LETTER JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C;;;;N;GLYPH FOR ISOLATE ARABIC JEEM;;;; FE9E;ARABIC LETTER JEEM FINAL FORM;Lo;0;AL;<final> 062C;;;;N;GLYPH FOR FINAL ARABIC JEEM;;;; FE9F;ARABIC LETTER JEEM INITIAL FORM;Lo;0;AL;<initial> 062C;;;;N;GLYPH FOR INITIAL ARABIC JEEM;;;; FEA0;ARABIC LETTER JEEM MEDIAL FORM;Lo;0;AL;<medial> 062C;;;;N;GLYPH FOR MEDIAL ARABIC JEEM;;;; FEA1;ARABIC LETTER HAH ISOLATED FORM;Lo;0;AL;<isolated> 062D;;;;N;GLYPH FOR ISOLATE ARABIC HAA;;;; FEA2;ARABIC LETTER HAH FINAL FORM;Lo;0;AL;<final> 062D;;;;N;GLYPH FOR FINAL ARABIC HAA;;;; FEA3;ARABIC LETTER HAH INITIAL FORM;Lo;0;AL;<initial> 062D;;;;N;GLYPH FOR INITIAL ARABIC HAA;;;; FEA4;ARABIC LETTER HAH MEDIAL FORM;Lo;0;AL;<medial> 062D;;;;N;GLYPH FOR MEDIAL ARABIC HAA;;;; FEA5;ARABIC LETTER KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062E;;;;N;GLYPH FOR ISOLATE ARABIC KHAA;;;; FEA6;ARABIC LETTER KHAH FINAL FORM;Lo;0;AL;<final> 062E;;;;N;GLYPH FOR FINAL ARABIC KHAA;;;; FEA7;ARABIC LETTER KHAH INITIAL FORM;Lo;0;AL;<initial> 062E;;;;N;GLYPH FOR INITIAL ARABIC KHAA;;;; FEA8;ARABIC LETTER KHAH MEDIAL FORM;Lo;0;AL;<medial> 062E;;;;N;GLYPH FOR MEDIAL ARABIC KHAA;;;; FEA9;ARABIC LETTER DAL ISOLATED FORM;Lo;0;AL;<isolated> 062F;;;;N;GLYPH FOR ISOLATE ARABIC DAL;;;; FEAA;ARABIC LETTER DAL FINAL FORM;Lo;0;AL;<final> 062F;;;;N;GLYPH FOR FINAL ARABIC DAL;;;; FEAB;ARABIC LETTER THAL ISOLATED FORM;Lo;0;AL;<isolated> 0630;;;;N;GLYPH FOR ISOLATE ARABIC THAL;;;; FEAC;ARABIC LETTER THAL FINAL FORM;Lo;0;AL;<final> 0630;;;;N;GLYPH FOR FINAL ARABIC THAL;;;; FEAD;ARABIC LETTER REH ISOLATED FORM;Lo;0;AL;<isolated> 0631;;;;N;GLYPH FOR ISOLATE ARABIC RA;;;; FEAE;ARABIC LETTER REH FINAL FORM;Lo;0;AL;<final> 0631;;;;N;GLYPH FOR FINAL ARABIC RA;;;; FEAF;ARABIC LETTER ZAIN ISOLATED FORM;Lo;0;AL;<isolated> 0632;;;;N;GLYPH FOR ISOLATE ARABIC ZAIN;;;; FEB0;ARABIC LETTER ZAIN FINAL FORM;Lo;0;AL;<final> 0632;;;;N;GLYPH FOR FINAL ARABIC ZAIN;;;; FEB1;ARABIC LETTER SEEN ISOLATED FORM;Lo;0;AL;<isolated> 0633;;;;N;GLYPH FOR ISOLATE ARABIC SEEN;;;; FEB2;ARABIC LETTER SEEN FINAL FORM;Lo;0;AL;<final> 0633;;;;N;GLYPH FOR FINAL ARABIC SEEN;;;; FEB3;ARABIC LETTER SEEN INITIAL FORM;Lo;0;AL;<initial> 0633;;;;N;GLYPH FOR INITIAL ARABIC SEEN;;;; FEB4;ARABIC LETTER SEEN MEDIAL FORM;Lo;0;AL;<medial> 0633;;;;N;GLYPH FOR MEDIAL ARABIC SEEN;;;; FEB5;ARABIC LETTER SHEEN ISOLATED FORM;Lo;0;AL;<isolated> 0634;;;;N;GLYPH FOR ISOLATE ARABIC SHEEN;;;; FEB6;ARABIC LETTER SHEEN FINAL FORM;Lo;0;AL;<final> 0634;;;;N;GLYPH FOR FINAL ARABIC SHEEN;;;; FEB7;ARABIC LETTER SHEEN INITIAL FORM;Lo;0;AL;<initial> 0634;;;;N;GLYPH FOR INITIAL ARABIC SHEEN;;;; FEB8;ARABIC LETTER SHEEN MEDIAL FORM;Lo;0;AL;<medial> 0634;;;;N;GLYPH FOR MEDIAL ARABIC SHEEN;;;; FEB9;ARABIC LETTER SAD ISOLATED FORM;Lo;0;AL;<isolated> 0635;;;;N;GLYPH FOR ISOLATE ARABIC SAD;;;; FEBA;ARABIC LETTER SAD FINAL FORM;Lo;0;AL;<final> 0635;;;;N;GLYPH FOR FINAL ARABIC SAD;;;; FEBB;ARABIC LETTER SAD INITIAL FORM;Lo;0;AL;<initial> 0635;;;;N;GLYPH FOR INITIAL ARABIC SAD;;;; FEBC;ARABIC LETTER SAD MEDIAL FORM;Lo;0;AL;<medial> 0635;;;;N;GLYPH FOR MEDIAL ARABIC SAD;;;; FEBD;ARABIC LETTER DAD ISOLATED FORM;Lo;0;AL;<isolated> 0636;;;;N;GLYPH FOR ISOLATE ARABIC DAD;;;; FEBE;ARABIC LETTER DAD FINAL FORM;Lo;0;AL;<final> 0636;;;;N;GLYPH FOR FINAL ARABIC DAD;;;; FEBF;ARABIC LETTER DAD INITIAL FORM;Lo;0;AL;<initial> 0636;;;;N;GLYPH FOR INITIAL ARABIC DAD;;;; FEC0;ARABIC LETTER DAD MEDIAL FORM;Lo;0;AL;<medial> 0636;;;;N;GLYPH FOR MEDIAL ARABIC DAD;;;; FEC1;ARABIC LETTER TAH ISOLATED FORM;Lo;0;AL;<isolated> 0637;;;;N;GLYPH FOR ISOLATE ARABIC TAH;;;; FEC2;ARABIC LETTER TAH FINAL FORM;Lo;0;AL;<final> 0637;;;;N;GLYPH FOR FINAL ARABIC TAH;;;; FEC3;ARABIC LETTER TAH INITIAL FORM;Lo;0;AL;<initial> 0637;;;;N;GLYPH FOR INITIAL ARABIC TAH;;;; FEC4;ARABIC LETTER TAH MEDIAL FORM;Lo;0;AL;<medial> 0637;;;;N;GLYPH FOR MEDIAL ARABIC TAH;;;; FEC5;ARABIC LETTER ZAH ISOLATED FORM;Lo;0;AL;<isolated> 0638;;;;N;GLYPH FOR ISOLATE ARABIC DHAH;;;; FEC6;ARABIC LETTER ZAH FINAL FORM;Lo;0;AL;<final> 0638;;;;N;GLYPH FOR FINAL ARABIC DHAH;;;; FEC7;ARABIC LETTER ZAH INITIAL FORM;Lo;0;AL;<initial> 0638;;;;N;GLYPH FOR INITIAL ARABIC DHAH;;;; FEC8;ARABIC LETTER ZAH MEDIAL FORM;Lo;0;AL;<medial> 0638;;;;N;GLYPH FOR MEDIAL ARABIC DHAH;;;; FEC9;ARABIC LETTER AIN ISOLATED FORM;Lo;0;AL;<isolated> 0639;;;;N;GLYPH FOR ISOLATE ARABIC AIN;;;; FECA;ARABIC LETTER AIN FINAL FORM;Lo;0;AL;<final> 0639;;;;N;GLYPH FOR FINAL ARABIC AIN;;;; FECB;ARABIC LETTER AIN INITIAL FORM;Lo;0;AL;<initial> 0639;;;;N;GLYPH FOR INITIAL ARABIC AIN;;;; FECC;ARABIC LETTER AIN MEDIAL FORM;Lo;0;AL;<medial> 0639;;;;N;GLYPH FOR MEDIAL ARABIC AIN;;;; FECD;ARABIC LETTER GHAIN ISOLATED FORM;Lo;0;AL;<isolated> 063A;;;;N;GLYPH FOR ISOLATE ARABIC GHAIN;;;; FECE;ARABIC LETTER GHAIN FINAL FORM;Lo;0;AL;<final> 063A;;;;N;GLYPH FOR FINAL ARABIC GHAIN;;;; FECF;ARABIC LETTER GHAIN INITIAL FORM;Lo;0;AL;<initial> 063A;;;;N;GLYPH FOR INITIAL ARABIC GHAIN;;;; FED0;ARABIC LETTER GHAIN MEDIAL FORM;Lo;0;AL;<medial> 063A;;;;N;GLYPH FOR MEDIAL ARABIC GHAIN;;;; FED1;ARABIC LETTER FEH ISOLATED FORM;Lo;0;AL;<isolated> 0641;;;;N;GLYPH FOR ISOLATE ARABIC FA;;;; FED2;ARABIC LETTER FEH FINAL FORM;Lo;0;AL;<final> 0641;;;;N;GLYPH FOR FINAL ARABIC FA;;;; FED3;ARABIC LETTER FEH INITIAL FORM;Lo;0;AL;<initial> 0641;;;;N;GLYPH FOR INITIAL ARABIC FA;;;; FED4;ARABIC LETTER FEH MEDIAL FORM;Lo;0;AL;<medial> 0641;;;;N;GLYPH FOR MEDIAL ARABIC FA;;;; FED5;ARABIC LETTER QAF ISOLATED FORM;Lo;0;AL;<isolated> 0642;;;;N;GLYPH FOR ISOLATE ARABIC QAF;;;; FED6;ARABIC LETTER QAF FINAL FORM;Lo;0;AL;<final> 0642;;;;N;GLYPH FOR FINAL ARABIC QAF;;;; FED7;ARABIC LETTER QAF INITIAL FORM;Lo;0;AL;<initial> 0642;;;;N;GLYPH FOR INITIAL ARABIC QAF;;;; FED8;ARABIC LETTER QAF MEDIAL FORM;Lo;0;AL;<medial> 0642;;;;N;GLYPH FOR MEDIAL ARABIC QAF;;;; FED9;ARABIC LETTER KAF ISOLATED FORM;Lo;0;AL;<isolated> 0643;;;;N;GLYPH FOR ISOLATE ARABIC CAF;;;; FEDA;ARABIC LETTER KAF FINAL FORM;Lo;0;AL;<final> 0643;;;;N;GLYPH FOR FINAL ARABIC CAF;;;; FEDB;ARABIC LETTER KAF INITIAL FORM;Lo;0;AL;<initial> 0643;;;;N;GLYPH FOR INITIAL ARABIC CAF;;;; FEDC;ARABIC LETTER KAF MEDIAL FORM;Lo;0;AL;<medial> 0643;;;;N;GLYPH FOR MEDIAL ARABIC CAF;;;; FEDD;ARABIC LETTER LAM ISOLATED FORM;Lo;0;AL;<isolated> 0644;;;;N;GLYPH FOR ISOLATE ARABIC LAM;;;; FEDE;ARABIC LETTER LAM FINAL FORM;Lo;0;AL;<final> 0644;;;;N;GLYPH FOR FINAL ARABIC LAM;;;; FEDF;ARABIC LETTER LAM INITIAL FORM;Lo;0;AL;<initial> 0644;;;;N;GLYPH FOR INITIAL ARABIC LAM;;;; FEE0;ARABIC LETTER LAM MEDIAL FORM;Lo;0;AL;<medial> 0644;;;;N;GLYPH FOR MEDIAL ARABIC LAM;;;; FEE1;ARABIC LETTER MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645;;;;N;GLYPH FOR ISOLATE ARABIC MEEM;;;; FEE2;ARABIC LETTER MEEM FINAL FORM;Lo;0;AL;<final> 0645;;;;N;GLYPH FOR FINAL ARABIC MEEM;;;; FEE3;ARABIC LETTER MEEM INITIAL FORM;Lo;0;AL;<initial> 0645;;;;N;GLYPH FOR INITIAL ARABIC MEEM;;;; FEE4;ARABIC LETTER MEEM MEDIAL FORM;Lo;0;AL;<medial> 0645;;;;N;GLYPH FOR MEDIAL ARABIC MEEM;;;; FEE5;ARABIC LETTER NOON ISOLATED FORM;Lo;0;AL;<isolated> 0646;;;;N;GLYPH FOR ISOLATE ARABIC NOON;;;; FEE6;ARABIC LETTER NOON FINAL FORM;Lo;0;AL;<final> 0646;;;;N;GLYPH FOR FINAL ARABIC NOON;;;; FEE7;ARABIC LETTER NOON INITIAL FORM;Lo;0;AL;<initial> 0646;;;;N;GLYPH FOR INITIAL ARABIC NOON;;;; FEE8;ARABIC LETTER NOON MEDIAL FORM;Lo;0;AL;<medial> 0646;;;;N;GLYPH FOR MEDIAL ARABIC NOON;;;; FEE9;ARABIC LETTER HEH ISOLATED FORM;Lo;0;AL;<isolated> 0647;;;;N;GLYPH FOR ISOLATE ARABIC HA;;;; FEEA;ARABIC LETTER HEH FINAL FORM;Lo;0;AL;<final> 0647;;;;N;GLYPH FOR FINAL ARABIC HA;;;; FEEB;ARABIC LETTER HEH INITIAL FORM;Lo;0;AL;<initial> 0647;;;;N;GLYPH FOR INITIAL ARABIC HA;;;; FEEC;ARABIC LETTER HEH MEDIAL FORM;Lo;0;AL;<medial> 0647;;;;N;GLYPH FOR MEDIAL ARABIC HA;;;; FEED;ARABIC LETTER WAW ISOLATED FORM;Lo;0;AL;<isolated> 0648;;;;N;GLYPH FOR ISOLATE ARABIC WAW;;;; FEEE;ARABIC LETTER WAW FINAL FORM;Lo;0;AL;<final> 0648;;;;N;GLYPH FOR FINAL ARABIC WAW;;;; FEEF;ARABIC LETTER ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0649;;;;N;GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH;;;; FEF0;ARABIC LETTER ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0649;;;;N;GLYPH FOR FINAL ARABIC ALEF MAQSURAH;;;; FEF1;ARABIC LETTER YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A;;;;N;GLYPH FOR ISOLATE ARABIC YA;;;; FEF2;ARABIC LETTER YEH FINAL FORM;Lo;0;AL;<final> 064A;;;;N;GLYPH FOR FINAL ARABIC YA;;;; FEF3;ARABIC LETTER YEH INITIAL FORM;Lo;0;AL;<initial> 064A;;;;N;GLYPH FOR INITIAL ARABIC YA;;;; FEF4;ARABIC LETTER YEH MEDIAL FORM;Lo;0;AL;<medial> 064A;;;;N;GLYPH FOR MEDIAL ARABIC YA;;;; FEF5;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF;;;; FEF6;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF;;;; FEF7;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; FEF8;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; FEF9;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0644 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; FEFA;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0644 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; FEFB;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0644 0627;;;;N;GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF;;;; FEFC;ARABIC LIGATURE LAM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0644 0627;;;;N;GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF;;;; FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;; FF01;FULLWIDTH EXCLAMATION MARK;Po;0;ON;<wide> 0021;;;;N;;;;; FF02;FULLWIDTH QUOTATION MARK;Po;0;ON;<wide> 0022;;;;N;;;;; FF03;FULLWIDTH NUMBER SIGN;Po;0;ET;<wide> 0023;;;;N;;;;; FF04;FULLWIDTH DOLLAR SIGN;Sc;0;ET;<wide> 0024;;;;N;;;;; FF05;FULLWIDTH PERCENT SIGN;Po;0;ET;<wide> 0025;;;;N;;;;; FF06;FULLWIDTH AMPERSAND;Po;0;ON;<wide> 0026;;;;N;;;;; FF07;FULLWIDTH APOSTROPHE;Po;0;ON;<wide> 0027;;;;N;;;;; FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON;<wide> 0028;;;;Y;FULLWIDTH OPENING PARENTHESIS;;;; FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON;<wide> 0029;;;;Y;FULLWIDTH CLOSING PARENTHESIS;;;; FF0A;FULLWIDTH ASTERISK;Po;0;ON;<wide> 002A;;;;N;;;;; FF0B;FULLWIDTH PLUS SIGN;Sm;0;ES;<wide> 002B;;;;N;;;;; FF0C;FULLWIDTH COMMA;Po;0;CS;<wide> 002C;;;;N;;;;; FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ES;<wide> 002D;;;;N;;;;; FF0E;FULLWIDTH FULL STOP;Po;0;CS;<wide> 002E;;;;N;FULLWIDTH PERIOD;;;; FF0F;FULLWIDTH SOLIDUS;Po;0;CS;<wide> 002F;;;;N;FULLWIDTH SLASH;;;; FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN;<wide> 0030;0;0;0;N;;;;; FF11;FULLWIDTH DIGIT ONE;Nd;0;EN;<wide> 0031;1;1;1;N;;;;; FF12;FULLWIDTH DIGIT TWO;Nd;0;EN;<wide> 0032;2;2;2;N;;;;; FF13;FULLWIDTH DIGIT THREE;Nd;0;EN;<wide> 0033;3;3;3;N;;;;; FF14;FULLWIDTH DIGIT FOUR;Nd;0;EN;<wide> 0034;4;4;4;N;;;;; FF15;FULLWIDTH DIGIT FIVE;Nd;0;EN;<wide> 0035;5;5;5;N;;;;; FF16;FULLWIDTH DIGIT SIX;Nd;0;EN;<wide> 0036;6;6;6;N;;;;; FF17;FULLWIDTH DIGIT SEVEN;Nd;0;EN;<wide> 0037;7;7;7;N;;;;; FF18;FULLWIDTH DIGIT EIGHT;Nd;0;EN;<wide> 0038;8;8;8;N;;;;; FF19;FULLWIDTH DIGIT NINE;Nd;0;EN;<wide> 0039;9;9;9;N;;;;; FF1A;FULLWIDTH COLON;Po;0;CS;<wide> 003A;;;;N;;;;; FF1B;FULLWIDTH SEMICOLON;Po;0;ON;<wide> 003B;;;;N;;;;; FF1C;FULLWIDTH LESS-THAN SIGN;Sm;0;ON;<wide> 003C;;;;Y;;;;; FF1D;FULLWIDTH EQUALS SIGN;Sm;0;ON;<wide> 003D;;;;N;;;;; FF1E;FULLWIDTH GREATER-THAN SIGN;Sm;0;ON;<wide> 003E;;;;Y;;;;; FF1F;FULLWIDTH QUESTION MARK;Po;0;ON;<wide> 003F;;;;N;;;;; FF20;FULLWIDTH COMMERCIAL AT;Po;0;ON;<wide> 0040;;;;N;;;;; FF21;FULLWIDTH LATIN CAPITAL LETTER A;Lu;0;L;<wide> 0041;;;;N;;;;FF41; FF22;FULLWIDTH LATIN CAPITAL LETTER B;Lu;0;L;<wide> 0042;;;;N;;;;FF42; FF23;FULLWIDTH LATIN CAPITAL LETTER C;Lu;0;L;<wide> 0043;;;;N;;;;FF43; FF24;FULLWIDTH LATIN CAPITAL LETTER D;Lu;0;L;<wide> 0044;;;;N;;;;FF44; FF25;FULLWIDTH LATIN CAPITAL LETTER E;Lu;0;L;<wide> 0045;;;;N;;;;FF45; FF26;FULLWIDTH LATIN CAPITAL LETTER F;Lu;0;L;<wide> 0046;;;;N;;;;FF46; FF27;FULLWIDTH LATIN CAPITAL LETTER G;Lu;0;L;<wide> 0047;;;;N;;;;FF47; FF28;FULLWIDTH LATIN CAPITAL LETTER H;Lu;0;L;<wide> 0048;;;;N;;;;FF48; FF29;FULLWIDTH LATIN CAPITAL LETTER I;Lu;0;L;<wide> 0049;;;;N;;;;FF49; FF2A;FULLWIDTH LATIN CAPITAL LETTER J;Lu;0;L;<wide> 004A;;;;N;;;;FF4A; FF2B;FULLWIDTH LATIN CAPITAL LETTER K;Lu;0;L;<wide> 004B;;;;N;;;;FF4B; FF2C;FULLWIDTH LATIN CAPITAL LETTER L;Lu;0;L;<wide> 004C;;;;N;;;;FF4C; FF2D;FULLWIDTH LATIN CAPITAL LETTER M;Lu;0;L;<wide> 004D;;;;N;;;;FF4D; FF2E;FULLWIDTH LATIN CAPITAL LETTER N;Lu;0;L;<wide> 004E;;;;N;;;;FF4E; FF2F;FULLWIDTH LATIN CAPITAL LETTER O;Lu;0;L;<wide> 004F;;;;N;;;;FF4F; FF30;FULLWIDTH LATIN CAPITAL LETTER P;Lu;0;L;<wide> 0050;;;;N;;;;FF50; FF31;FULLWIDTH LATIN CAPITAL LETTER Q;Lu;0;L;<wide> 0051;;;;N;;;;FF51; FF32;FULLWIDTH LATIN CAPITAL LETTER R;Lu;0;L;<wide> 0052;;;;N;;;;FF52; FF33;FULLWIDTH LATIN CAPITAL LETTER S;Lu;0;L;<wide> 0053;;;;N;;;;FF53; FF34;FULLWIDTH LATIN CAPITAL LETTER T;Lu;0;L;<wide> 0054;;;;N;;;;FF54; FF35;FULLWIDTH LATIN CAPITAL LETTER U;Lu;0;L;<wide> 0055;;;;N;;;;FF55; FF36;FULLWIDTH LATIN CAPITAL LETTER V;Lu;0;L;<wide> 0056;;;;N;;;;FF56; FF37;FULLWIDTH LATIN CAPITAL LETTER W;Lu;0;L;<wide> 0057;;;;N;;;;FF57; FF38;FULLWIDTH LATIN CAPITAL LETTER X;Lu;0;L;<wide> 0058;;;;N;;;;FF58; FF39;FULLWIDTH LATIN CAPITAL LETTER Y;Lu;0;L;<wide> 0059;;;;N;;;;FF59; FF3A;FULLWIDTH LATIN CAPITAL LETTER Z;Lu;0;L;<wide> 005A;;;;N;;;;FF5A; FF3B;FULLWIDTH LEFT SQUARE BRACKET;Ps;0;ON;<wide> 005B;;;;Y;FULLWIDTH OPENING SQUARE BRACKET;;;; FF3C;FULLWIDTH REVERSE SOLIDUS;Po;0;ON;<wide> 005C;;;;N;FULLWIDTH BACKSLASH;;;; FF3D;FULLWIDTH RIGHT SQUARE BRACKET;Pe;0;ON;<wide> 005D;;;;Y;FULLWIDTH CLOSING SQUARE BRACKET;;;; FF3E;FULLWIDTH CIRCUMFLEX ACCENT;Sk;0;ON;<wide> 005E;;;;N;FULLWIDTH SPACING CIRCUMFLEX;;;; FF3F;FULLWIDTH LOW LINE;Pc;0;ON;<wide> 005F;;;;N;FULLWIDTH SPACING UNDERSCORE;;;; FF40;FULLWIDTH GRAVE ACCENT;Sk;0;ON;<wide> 0060;;;;N;FULLWIDTH SPACING GRAVE;;;; FF41;FULLWIDTH LATIN SMALL LETTER A;Ll;0;L;<wide> 0061;;;;N;;;FF21;;FF21 FF42;FULLWIDTH LATIN SMALL LETTER B;Ll;0;L;<wide> 0062;;;;N;;;FF22;;FF22 FF43;FULLWIDTH LATIN SMALL LETTER C;Ll;0;L;<wide> 0063;;;;N;;;FF23;;FF23 FF44;FULLWIDTH LATIN SMALL LETTER D;Ll;0;L;<wide> 0064;;;;N;;;FF24;;FF24 FF45;FULLWIDTH LATIN SMALL LETTER E;Ll;0;L;<wide> 0065;;;;N;;;FF25;;FF25 FF46;FULLWIDTH LATIN SMALL LETTER F;Ll;0;L;<wide> 0066;;;;N;;;FF26;;FF26 FF47;FULLWIDTH LATIN SMALL LETTER G;Ll;0;L;<wide> 0067;;;;N;;;FF27;;FF27 FF48;FULLWIDTH LATIN SMALL LETTER H;Ll;0;L;<wide> 0068;;;;N;;;FF28;;FF28 FF49;FULLWIDTH LATIN SMALL LETTER I;Ll;0;L;<wide> 0069;;;;N;;;FF29;;FF29 FF4A;FULLWIDTH LATIN SMALL LETTER J;Ll;0;L;<wide> 006A;;;;N;;;FF2A;;FF2A FF4B;FULLWIDTH LATIN SMALL LETTER K;Ll;0;L;<wide> 006B;;;;N;;;FF2B;;FF2B FF4C;FULLWIDTH LATIN SMALL LETTER L;Ll;0;L;<wide> 006C;;;;N;;;FF2C;;FF2C FF4D;FULLWIDTH LATIN SMALL LETTER M;Ll;0;L;<wide> 006D;;;;N;;;FF2D;;FF2D FF4E;FULLWIDTH LATIN SMALL LETTER N;Ll;0;L;<wide> 006E;;;;N;;;FF2E;;FF2E FF4F;FULLWIDTH LATIN SMALL LETTER O;Ll;0;L;<wide> 006F;;;;N;;;FF2F;;FF2F FF50;FULLWIDTH LATIN SMALL LETTER P;Ll;0;L;<wide> 0070;;;;N;;;FF30;;FF30 FF51;FULLWIDTH LATIN SMALL LETTER Q;Ll;0;L;<wide> 0071;;;;N;;;FF31;;FF31 FF52;FULLWIDTH LATIN SMALL LETTER R;Ll;0;L;<wide> 0072;;;;N;;;FF32;;FF32 FF53;FULLWIDTH LATIN SMALL LETTER S;Ll;0;L;<wide> 0073;;;;N;;;FF33;;FF33 FF54;FULLWIDTH LATIN SMALL LETTER T;Ll;0;L;<wide> 0074;;;;N;;;FF34;;FF34 FF55;FULLWIDTH LATIN SMALL LETTER U;Ll;0;L;<wide> 0075;;;;N;;;FF35;;FF35 FF56;FULLWIDTH LATIN SMALL LETTER V;Ll;0;L;<wide> 0076;;;;N;;;FF36;;FF36 FF57;FULLWIDTH LATIN SMALL LETTER W;Ll;0;L;<wide> 0077;;;;N;;;FF37;;FF37 FF58;FULLWIDTH LATIN SMALL LETTER X;Ll;0;L;<wide> 0078;;;;N;;;FF38;;FF38 FF59;FULLWIDTH LATIN SMALL LETTER Y;Ll;0;L;<wide> 0079;;;;N;;;FF39;;FF39 FF5A;FULLWIDTH LATIN SMALL LETTER Z;Ll;0;L;<wide> 007A;;;;N;;;FF3A;;FF3A FF5B;FULLWIDTH LEFT CURLY BRACKET;Ps;0;ON;<wide> 007B;;;;Y;FULLWIDTH OPENING CURLY BRACKET;;;; FF5C;FULLWIDTH VERTICAL LINE;Sm;0;ON;<wide> 007C;;;;N;FULLWIDTH VERTICAL BAR;;;; FF5D;FULLWIDTH RIGHT CURLY BRACKET;Pe;0;ON;<wide> 007D;;;;Y;FULLWIDTH CLOSING CURLY BRACKET;;;; FF5E;FULLWIDTH TILDE;Sm;0;ON;<wide> 007E;;;;N;FULLWIDTH SPACING TILDE;;;; FF5F;FULLWIDTH LEFT WHITE PARENTHESIS;Ps;0;ON;<wide> 2985;;;;Y;;;;; FF60;FULLWIDTH RIGHT WHITE PARENTHESIS;Pe;0;ON;<wide> 2986;;;;Y;;;;; FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON;<narrow> 3002;;;;N;HALFWIDTH IDEOGRAPHIC PERIOD;;;; FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON;<narrow> 300C;;;;Y;HALFWIDTH OPENING CORNER BRACKET;;;; FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON;<narrow> 300D;;;;Y;HALFWIDTH CLOSING CORNER BRACKET;;;; FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON;<narrow> 3001;;;;N;;;;; FF65;HALFWIDTH KATAKANA MIDDLE DOT;Po;0;ON;<narrow> 30FB;;;;N;;;;; FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L;<narrow> 30F2;;;;N;;;;; FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L;<narrow> 30A1;;;;N;;;;; FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L;<narrow> 30A3;;;;N;;;;; FF69;HALFWIDTH KATAKANA LETTER SMALL U;Lo;0;L;<narrow> 30A5;;;;N;;;;; FF6A;HALFWIDTH KATAKANA LETTER SMALL E;Lo;0;L;<narrow> 30A7;;;;N;;;;; FF6B;HALFWIDTH KATAKANA LETTER SMALL O;Lo;0;L;<narrow> 30A9;;;;N;;;;; FF6C;HALFWIDTH KATAKANA LETTER SMALL YA;Lo;0;L;<narrow> 30E3;;;;N;;;;; FF6D;HALFWIDTH KATAKANA LETTER SMALL YU;Lo;0;L;<narrow> 30E5;;;;N;;;;; FF6E;HALFWIDTH KATAKANA LETTER SMALL YO;Lo;0;L;<narrow> 30E7;;;;N;;;;; FF6F;HALFWIDTH KATAKANA LETTER SMALL TU;Lo;0;L;<narrow> 30C3;;;;N;;;;; FF70;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;<narrow> 30FC;;;;N;;;;; FF71;HALFWIDTH KATAKANA LETTER A;Lo;0;L;<narrow> 30A2;;;;N;;;;; FF72;HALFWIDTH KATAKANA LETTER I;Lo;0;L;<narrow> 30A4;;;;N;;;;; FF73;HALFWIDTH KATAKANA LETTER U;Lo;0;L;<narrow> 30A6;;;;N;;;;; FF74;HALFWIDTH KATAKANA LETTER E;Lo;0;L;<narrow> 30A8;;;;N;;;;; FF75;HALFWIDTH KATAKANA LETTER O;Lo;0;L;<narrow> 30AA;;;;N;;;;; FF76;HALFWIDTH KATAKANA LETTER KA;Lo;0;L;<narrow> 30AB;;;;N;;;;; FF77;HALFWIDTH KATAKANA LETTER KI;Lo;0;L;<narrow> 30AD;;;;N;;;;; FF78;HALFWIDTH KATAKANA LETTER KU;Lo;0;L;<narrow> 30AF;;;;N;;;;; FF79;HALFWIDTH KATAKANA LETTER KE;Lo;0;L;<narrow> 30B1;;;;N;;;;; FF7A;HALFWIDTH KATAKANA LETTER KO;Lo;0;L;<narrow> 30B3;;;;N;;;;; FF7B;HALFWIDTH KATAKANA LETTER SA;Lo;0;L;<narrow> 30B5;;;;N;;;;; FF7C;HALFWIDTH KATAKANA LETTER SI;Lo;0;L;<narrow> 30B7;;;;N;;;;; FF7D;HALFWIDTH KATAKANA LETTER SU;Lo;0;L;<narrow> 30B9;;;;N;;;;; FF7E;HALFWIDTH KATAKANA LETTER SE;Lo;0;L;<narrow> 30BB;;;;N;;;;; FF7F;HALFWIDTH KATAKANA LETTER SO;Lo;0;L;<narrow> 30BD;;;;N;;;;; FF80;HALFWIDTH KATAKANA LETTER TA;Lo;0;L;<narrow> 30BF;;;;N;;;;; FF81;HALFWIDTH KATAKANA LETTER TI;Lo;0;L;<narrow> 30C1;;;;N;;;;; FF82;HALFWIDTH KATAKANA LETTER TU;Lo;0;L;<narrow> 30C4;;;;N;;;;; FF83;HALFWIDTH KATAKANA LETTER TE;Lo;0;L;<narrow> 30C6;;;;N;;;;; FF84;HALFWIDTH KATAKANA LETTER TO;Lo;0;L;<narrow> 30C8;;;;N;;;;; FF85;HALFWIDTH KATAKANA LETTER NA;Lo;0;L;<narrow> 30CA;;;;N;;;;; FF86;HALFWIDTH KATAKANA LETTER NI;Lo;0;L;<narrow> 30CB;;;;N;;;;; FF87;HALFWIDTH KATAKANA LETTER NU;Lo;0;L;<narrow> 30CC;;;;N;;;;; FF88;HALFWIDTH KATAKANA LETTER NE;Lo;0;L;<narrow> 30CD;;;;N;;;;; FF89;HALFWIDTH KATAKANA LETTER NO;Lo;0;L;<narrow> 30CE;;;;N;;;;; FF8A;HALFWIDTH KATAKANA LETTER HA;Lo;0;L;<narrow> 30CF;;;;N;;;;; FF8B;HALFWIDTH KATAKANA LETTER HI;Lo;0;L;<narrow> 30D2;;;;N;;;;; FF8C;HALFWIDTH KATAKANA LETTER HU;Lo;0;L;<narrow> 30D5;;;;N;;;;; FF8D;HALFWIDTH KATAKANA LETTER HE;Lo;0;L;<narrow> 30D8;;;;N;;;;; FF8E;HALFWIDTH KATAKANA LETTER HO;Lo;0;L;<narrow> 30DB;;;;N;;;;; FF8F;HALFWIDTH KATAKANA LETTER MA;Lo;0;L;<narrow> 30DE;;;;N;;;;; FF90;HALFWIDTH KATAKANA LETTER MI;Lo;0;L;<narrow> 30DF;;;;N;;;;; FF91;HALFWIDTH KATAKANA LETTER MU;Lo;0;L;<narrow> 30E0;;;;N;;;;; FF92;HALFWIDTH KATAKANA LETTER ME;Lo;0;L;<narrow> 30E1;;;;N;;;;; FF93;HALFWIDTH KATAKANA LETTER MO;Lo;0;L;<narrow> 30E2;;;;N;;;;; FF94;HALFWIDTH KATAKANA LETTER YA;Lo;0;L;<narrow> 30E4;;;;N;;;;; FF95;HALFWIDTH KATAKANA LETTER YU;Lo;0;L;<narrow> 30E6;;;;N;;;;; FF96;HALFWIDTH KATAKANA LETTER YO;Lo;0;L;<narrow> 30E8;;;;N;;;;; FF97;HALFWIDTH KATAKANA LETTER RA;Lo;0;L;<narrow> 30E9;;;;N;;;;; FF98;HALFWIDTH KATAKANA LETTER RI;Lo;0;L;<narrow> 30EA;;;;N;;;;; FF99;HALFWIDTH KATAKANA LETTER RU;Lo;0;L;<narrow> 30EB;;;;N;;;;; FF9A;HALFWIDTH KATAKANA LETTER RE;Lo;0;L;<narrow> 30EC;;;;N;;;;; FF9B;HALFWIDTH KATAKANA LETTER RO;Lo;0;L;<narrow> 30ED;;;;N;;;;; FF9C;HALFWIDTH KATAKANA LETTER WA;Lo;0;L;<narrow> 30EF;;;;N;;;;; FF9D;HALFWIDTH KATAKANA LETTER N;Lo;0;L;<narrow> 30F3;;;;N;;;;; FF9E;HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L;<narrow> 3099;;;;N;;;;; FF9F;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L;<narrow> 309A;;;;N;;;;; FFA0;HALFWIDTH HANGUL FILLER;Lo;0;L;<narrow> 3164;;;;N;HALFWIDTH HANGUL CAE OM;;;; FFA1;HALFWIDTH HANGUL LETTER KIYEOK;Lo;0;L;<narrow> 3131;;;;N;HALFWIDTH HANGUL LETTER GIYEOG;;;; FFA2;HALFWIDTH HANGUL LETTER SSANGKIYEOK;Lo;0;L;<narrow> 3132;;;;N;HALFWIDTH HANGUL LETTER SSANG GIYEOG;;;; FFA3;HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<narrow> 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;; FFA4;HALFWIDTH HANGUL LETTER NIEUN;Lo;0;L;<narrow> 3134;;;;N;;;;; FFA5;HALFWIDTH HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<narrow> 3135;;;;N;HALFWIDTH HANGUL LETTER NIEUN JIEUJ;;;; FFA6;HALFWIDTH HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<narrow> 3136;;;;N;HALFWIDTH HANGUL LETTER NIEUN HIEUH;;;; FFA7;HALFWIDTH HANGUL LETTER TIKEUT;Lo;0;L;<narrow> 3137;;;;N;HALFWIDTH HANGUL LETTER DIGEUD;;;; FFA8;HALFWIDTH HANGUL LETTER SSANGTIKEUT;Lo;0;L;<narrow> 3138;;;;N;HALFWIDTH HANGUL LETTER SSANG DIGEUD;;;; FFA9;HALFWIDTH HANGUL LETTER RIEUL;Lo;0;L;<narrow> 3139;;;;N;HALFWIDTH HANGUL LETTER LIEUL;;;; FFAA;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<narrow> 313A;;;;N;HALFWIDTH HANGUL LETTER LIEUL GIYEOG;;;; FFAB;HALFWIDTH HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<narrow> 313B;;;;N;HALFWIDTH HANGUL LETTER LIEUL MIEUM;;;; FFAC;HALFWIDTH HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<narrow> 313C;;;;N;HALFWIDTH HANGUL LETTER LIEUL BIEUB;;;; FFAD;HALFWIDTH HANGUL LETTER RIEUL-SIOS;Lo;0;L;<narrow> 313D;;;;N;HALFWIDTH HANGUL LETTER LIEUL SIOS;;;; FFAE;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<narrow> 313E;;;;N;HALFWIDTH HANGUL LETTER LIEUL TIEUT;;;; FFAF;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<narrow> 313F;;;;N;HALFWIDTH HANGUL LETTER LIEUL PIEUP;;;; FFB0;HALFWIDTH HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<narrow> 3140;;;;N;HALFWIDTH HANGUL LETTER LIEUL HIEUH;;;; FFB1;HALFWIDTH HANGUL LETTER MIEUM;Lo;0;L;<narrow> 3141;;;;N;;;;; FFB2;HALFWIDTH HANGUL LETTER PIEUP;Lo;0;L;<narrow> 3142;;;;N;HALFWIDTH HANGUL LETTER BIEUB;;;; FFB3;HALFWIDTH HANGUL LETTER SSANGPIEUP;Lo;0;L;<narrow> 3143;;;;N;HALFWIDTH HANGUL LETTER SSANG BIEUB;;;; FFB4;HALFWIDTH HANGUL LETTER PIEUP-SIOS;Lo;0;L;<narrow> 3144;;;;N;HALFWIDTH HANGUL LETTER BIEUB SIOS;;;; FFB5;HALFWIDTH HANGUL LETTER SIOS;Lo;0;L;<narrow> 3145;;;;N;;;;; FFB6;HALFWIDTH HANGUL LETTER SSANGSIOS;Lo;0;L;<narrow> 3146;;;;N;HALFWIDTH HANGUL LETTER SSANG SIOS;;;; FFB7;HALFWIDTH HANGUL LETTER IEUNG;Lo;0;L;<narrow> 3147;;;;N;;;;; FFB8;HALFWIDTH HANGUL LETTER CIEUC;Lo;0;L;<narrow> 3148;;;;N;HALFWIDTH HANGUL LETTER JIEUJ;;;; FFB9;HALFWIDTH HANGUL LETTER SSANGCIEUC;Lo;0;L;<narrow> 3149;;;;N;HALFWIDTH HANGUL LETTER SSANG JIEUJ;;;; FFBA;HALFWIDTH HANGUL LETTER CHIEUCH;Lo;0;L;<narrow> 314A;;;;N;HALFWIDTH HANGUL LETTER CIEUC;;;; FFBB;HALFWIDTH HANGUL LETTER KHIEUKH;Lo;0;L;<narrow> 314B;;;;N;HALFWIDTH HANGUL LETTER KIYEOK;;;; FFBC;HALFWIDTH HANGUL LETTER THIEUTH;Lo;0;L;<narrow> 314C;;;;N;HALFWIDTH HANGUL LETTER TIEUT;;;; FFBD;HALFWIDTH HANGUL LETTER PHIEUPH;Lo;0;L;<narrow> 314D;;;;N;HALFWIDTH HANGUL LETTER PIEUP;;;; FFBE;HALFWIDTH HANGUL LETTER HIEUH;Lo;0;L;<narrow> 314E;;;;N;;;;; FFC2;HALFWIDTH HANGUL LETTER A;Lo;0;L;<narrow> 314F;;;;N;;;;; FFC3;HALFWIDTH HANGUL LETTER AE;Lo;0;L;<narrow> 3150;;;;N;;;;; FFC4;HALFWIDTH HANGUL LETTER YA;Lo;0;L;<narrow> 3151;;;;N;;;;; FFC5;HALFWIDTH HANGUL LETTER YAE;Lo;0;L;<narrow> 3152;;;;N;;;;; FFC6;HALFWIDTH HANGUL LETTER EO;Lo;0;L;<narrow> 3153;;;;N;;;;; FFC7;HALFWIDTH HANGUL LETTER E;Lo;0;L;<narrow> 3154;;;;N;;;;; FFCA;HALFWIDTH HANGUL LETTER YEO;Lo;0;L;<narrow> 3155;;;;N;;;;; FFCB;HALFWIDTH HANGUL LETTER YE;Lo;0;L;<narrow> 3156;;;;N;;;;; FFCC;HALFWIDTH HANGUL LETTER O;Lo;0;L;<narrow> 3157;;;;N;;;;; FFCD;HALFWIDTH HANGUL LETTER WA;Lo;0;L;<narrow> 3158;;;;N;;;;; FFCE;HALFWIDTH HANGUL LETTER WAE;Lo;0;L;<narrow> 3159;;;;N;;;;; FFCF;HALFWIDTH HANGUL LETTER OE;Lo;0;L;<narrow> 315A;;;;N;;;;; FFD2;HALFWIDTH HANGUL LETTER YO;Lo;0;L;<narrow> 315B;;;;N;;;;; FFD3;HALFWIDTH HANGUL LETTER U;Lo;0;L;<narrow> 315C;;;;N;;;;; FFD4;HALFWIDTH HANGUL LETTER WEO;Lo;0;L;<narrow> 315D;;;;N;;;;; FFD5;HALFWIDTH HANGUL LETTER WE;Lo;0;L;<narrow> 315E;;;;N;;;;; FFD6;HALFWIDTH HANGUL LETTER WI;Lo;0;L;<narrow> 315F;;;;N;;;;; FFD7;HALFWIDTH HANGUL LETTER YU;Lo;0;L;<narrow> 3160;;;;N;;;;; FFDA;HALFWIDTH HANGUL LETTER EU;Lo;0;L;<narrow> 3161;;;;N;;;;; FFDB;HALFWIDTH HANGUL LETTER YI;Lo;0;L;<narrow> 3162;;;;N;;;;; FFDC;HALFWIDTH HANGUL LETTER I;Lo;0;L;<narrow> 3163;;;;N;;;;; FFE0;FULLWIDTH CENT SIGN;Sc;0;ET;<wide> 00A2;;;;N;;;;; FFE1;FULLWIDTH POUND SIGN;Sc;0;ET;<wide> 00A3;;;;N;;;;; FFE2;FULLWIDTH NOT SIGN;Sm;0;ON;<wide> 00AC;;;;N;;;;; FFE3;FULLWIDTH MACRON;Sk;0;ON;<wide> 00AF;;;;N;FULLWIDTH SPACING MACRON;;;; FFE4;FULLWIDTH BROKEN BAR;So;0;ON;<wide> 00A6;;;;N;FULLWIDTH BROKEN VERTICAL BAR;;;; FFE5;FULLWIDTH YEN SIGN;Sc;0;ET;<wide> 00A5;;;;N;;;;; FFE6;FULLWIDTH WON SIGN;Sc;0;ET;<wide> 20A9;;;;N;;;;; FFE8;HALFWIDTH FORMS LIGHT VERTICAL;So;0;ON;<narrow> 2502;;;;N;;;;; FFE9;HALFWIDTH LEFTWARDS ARROW;Sm;0;ON;<narrow> 2190;;;;N;;;;; FFEA;HALFWIDTH UPWARDS ARROW;Sm;0;ON;<narrow> 2191;;;;N;;;;; FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON;<narrow> 2192;;;;N;;;;; FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON;<narrow> 2193;;;;N;;;;; FFED;HALFWIDTH BLACK SQUARE;So;0;ON;<narrow> 25A0;;;;N;;;;; FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON;<narrow> 25CB;;;;N;;;;; FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;ON;;;;;N;;;;; FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;ON;;;;;N;;;;; FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;ON;;;;;N;;;;; FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 10000;LINEAR B SYLLABLE B008 A;Lo;0;L;;;;;N;;;;; 10001;LINEAR B SYLLABLE B038 E;Lo;0;L;;;;;N;;;;; 10002;LINEAR B SYLLABLE B028 I;Lo;0;L;;;;;N;;;;; 10003;LINEAR B SYLLABLE B061 O;Lo;0;L;;;;;N;;;;; 10004;LINEAR B SYLLABLE B010 U;Lo;0;L;;;;;N;;;;; 10005;LINEAR B SYLLABLE B001 DA;Lo;0;L;;;;;N;;;;; 10006;LINEAR B SYLLABLE B045 DE;Lo;0;L;;;;;N;;;;; 10007;LINEAR B SYLLABLE B007 DI;Lo;0;L;;;;;N;;;;; 10008;LINEAR B SYLLABLE B014 DO;Lo;0;L;;;;;N;;;;; 10009;LINEAR B SYLLABLE B051 DU;Lo;0;L;;;;;N;;;;; 1000A;LINEAR B SYLLABLE B057 JA;Lo;0;L;;;;;N;;;;; 1000B;LINEAR B SYLLABLE B046 JE;Lo;0;L;;;;;N;;;;; 1000D;LINEAR B SYLLABLE B036 JO;Lo;0;L;;;;;N;;;;; 1000E;LINEAR B SYLLABLE B065 JU;Lo;0;L;;;;;N;;;;; 1000F;LINEAR B SYLLABLE B077 KA;Lo;0;L;;;;;N;;;;; 10010;LINEAR B SYLLABLE B044 KE;Lo;0;L;;;;;N;;;;; 10011;LINEAR B SYLLABLE B067 KI;Lo;0;L;;;;;N;;;;; 10012;LINEAR B SYLLABLE B070 KO;Lo;0;L;;;;;N;;;;; 10013;LINEAR B SYLLABLE B081 KU;Lo;0;L;;;;;N;;;;; 10014;LINEAR B SYLLABLE B080 MA;Lo;0;L;;;;;N;;;;; 10015;LINEAR B SYLLABLE B013 ME;Lo;0;L;;;;;N;;;;; 10016;LINEAR B SYLLABLE B073 MI;Lo;0;L;;;;;N;;;;; 10017;LINEAR B SYLLABLE B015 MO;Lo;0;L;;;;;N;;;;; 10018;LINEAR B SYLLABLE B023 MU;Lo;0;L;;;;;N;;;;; 10019;LINEAR B SYLLABLE B006 NA;Lo;0;L;;;;;N;;;;; 1001A;LINEAR B SYLLABLE B024 NE;Lo;0;L;;;;;N;;;;; 1001B;LINEAR B SYLLABLE B030 NI;Lo;0;L;;;;;N;;;;; 1001C;LINEAR B SYLLABLE B052 NO;Lo;0;L;;;;;N;;;;; 1001D;LINEAR B SYLLABLE B055 NU;Lo;0;L;;;;;N;;;;; 1001E;LINEAR B SYLLABLE B003 PA;Lo;0;L;;;;;N;;;;; 1001F;LINEAR B SYLLABLE B072 PE;Lo;0;L;;;;;N;;;;; 10020;LINEAR B SYLLABLE B039 PI;Lo;0;L;;;;;N;;;;; 10021;LINEAR B SYLLABLE B011 PO;Lo;0;L;;;;;N;;;;; 10022;LINEAR B SYLLABLE B050 PU;Lo;0;L;;;;;N;;;;; 10023;LINEAR B SYLLABLE B016 QA;Lo;0;L;;;;;N;;;;; 10024;LINEAR B SYLLABLE B078 QE;Lo;0;L;;;;;N;;;;; 10025;LINEAR B SYLLABLE B021 QI;Lo;0;L;;;;;N;;;;; 10026;LINEAR B SYLLABLE B032 QO;Lo;0;L;;;;;N;;;;; 10028;LINEAR B SYLLABLE B060 RA;Lo;0;L;;;;;N;;;;; 10029;LINEAR B SYLLABLE B027 RE;Lo;0;L;;;;;N;;;;; 1002A;LINEAR B SYLLABLE B053 RI;Lo;0;L;;;;;N;;;;; 1002B;LINEAR B SYLLABLE B002 RO;Lo;0;L;;;;;N;;;;; 1002C;LINEAR B SYLLABLE B026 RU;Lo;0;L;;;;;N;;;;; 1002D;LINEAR B SYLLABLE B031 SA;Lo;0;L;;;;;N;;;;; 1002E;LINEAR B SYLLABLE B009 SE;Lo;0;L;;;;;N;;;;; 1002F;LINEAR B SYLLABLE B041 SI;Lo;0;L;;;;;N;;;;; 10030;LINEAR B SYLLABLE B012 SO;Lo;0;L;;;;;N;;;;; 10031;LINEAR B SYLLABLE B058 SU;Lo;0;L;;;;;N;;;;; 10032;LINEAR B SYLLABLE B059 TA;Lo;0;L;;;;;N;;;;; 10033;LINEAR B SYLLABLE B004 TE;Lo;0;L;;;;;N;;;;; 10034;LINEAR B SYLLABLE B037 TI;Lo;0;L;;;;;N;;;;; 10035;LINEAR B SYLLABLE B005 TO;Lo;0;L;;;;;N;;;;; 10036;LINEAR B SYLLABLE B069 TU;Lo;0;L;;;;;N;;;;; 10037;LINEAR B SYLLABLE B054 WA;Lo;0;L;;;;;N;;;;; 10038;LINEAR B SYLLABLE B075 WE;Lo;0;L;;;;;N;;;;; 10039;LINEAR B SYLLABLE B040 WI;Lo;0;L;;;;;N;;;;; 1003A;LINEAR B SYLLABLE B042 WO;Lo;0;L;;;;;N;;;;; 1003C;LINEAR B SYLLABLE B017 ZA;Lo;0;L;;;;;N;;;;; 1003D;LINEAR B SYLLABLE B074 ZE;Lo;0;L;;;;;N;;;;; 1003F;LINEAR B SYLLABLE B020 ZO;Lo;0;L;;;;;N;;;;; 10040;LINEAR B SYLLABLE B025 A2;Lo;0;L;;;;;N;;;;; 10041;LINEAR B SYLLABLE B043 A3;Lo;0;L;;;;;N;;;;; 10042;LINEAR B SYLLABLE B085 AU;Lo;0;L;;;;;N;;;;; 10043;LINEAR B SYLLABLE B071 DWE;Lo;0;L;;;;;N;;;;; 10044;LINEAR B SYLLABLE B090 DWO;Lo;0;L;;;;;N;;;;; 10045;LINEAR B SYLLABLE B048 NWA;Lo;0;L;;;;;N;;;;; 10046;LINEAR B SYLLABLE B029 PU2;Lo;0;L;;;;;N;;;;; 10047;LINEAR B SYLLABLE B062 PTE;Lo;0;L;;;;;N;;;;; 10048;LINEAR B SYLLABLE B076 RA2;Lo;0;L;;;;;N;;;;; 10049;LINEAR B SYLLABLE B033 RA3;Lo;0;L;;;;;N;;;;; 1004A;LINEAR B SYLLABLE B068 RO2;Lo;0;L;;;;;N;;;;; 1004B;LINEAR B SYLLABLE B066 TA2;Lo;0;L;;;;;N;;;;; 1004C;LINEAR B SYLLABLE B087 TWE;Lo;0;L;;;;;N;;;;; 1004D;LINEAR B SYLLABLE B091 TWO;Lo;0;L;;;;;N;;;;; 10050;LINEAR B SYMBOL B018;Lo;0;L;;;;;N;;;;; 10051;LINEAR B SYMBOL B019;Lo;0;L;;;;;N;;;;; 10052;LINEAR B SYMBOL B022;Lo;0;L;;;;;N;;;;; 10053;LINEAR B SYMBOL B034;Lo;0;L;;;;;N;;;;; 10054;LINEAR B SYMBOL B047;Lo;0;L;;;;;N;;;;; 10055;LINEAR B SYMBOL B049;Lo;0;L;;;;;N;;;;; 10056;LINEAR B SYMBOL B056;Lo;0;L;;;;;N;;;;; 10057;LINEAR B SYMBOL B063;Lo;0;L;;;;;N;;;;; 10058;LINEAR B SYMBOL B064;Lo;0;L;;;;;N;;;;; 10059;LINEAR B SYMBOL B079;Lo;0;L;;;;;N;;;;; 1005A;LINEAR B SYMBOL B082;Lo;0;L;;;;;N;;;;; 1005B;LINEAR B SYMBOL B083;Lo;0;L;;;;;N;;;;; 1005C;LINEAR B SYMBOL B086;Lo;0;L;;;;;N;;;;; 1005D;LINEAR B SYMBOL B089;Lo;0;L;;;;;N;;;;; 10080;LINEAR B IDEOGRAM B100 MAN;Lo;0;L;;;;;N;;;;; 10081;LINEAR B IDEOGRAM B102 WOMAN;Lo;0;L;;;;;N;;;;; 10082;LINEAR B IDEOGRAM B104 DEER;Lo;0;L;;;;;N;;;;; 10083;LINEAR B IDEOGRAM B105 EQUID;Lo;0;L;;;;;N;;;;; 10084;LINEAR B IDEOGRAM B105F MARE;Lo;0;L;;;;;N;;;;; 10085;LINEAR B IDEOGRAM B105M STALLION;Lo;0;L;;;;;N;;;;; 10086;LINEAR B IDEOGRAM B106F EWE;Lo;0;L;;;;;N;;;;; 10087;LINEAR B IDEOGRAM B106M RAM;Lo;0;L;;;;;N;;;;; 10088;LINEAR B IDEOGRAM B107F SHE-GOAT;Lo;0;L;;;;;N;;;;; 10089;LINEAR B IDEOGRAM B107M HE-GOAT;Lo;0;L;;;;;N;;;;; 1008A;LINEAR B IDEOGRAM B108F SOW;Lo;0;L;;;;;N;;;;; 1008B;LINEAR B IDEOGRAM B108M BOAR;Lo;0;L;;;;;N;;;;; 1008C;LINEAR B IDEOGRAM B109F COW;Lo;0;L;;;;;N;;;;; 1008D;LINEAR B IDEOGRAM B109M BULL;Lo;0;L;;;;;N;;;;; 1008E;LINEAR B IDEOGRAM B120 WHEAT;Lo;0;L;;;;;N;;;;; 1008F;LINEAR B IDEOGRAM B121 BARLEY;Lo;0;L;;;;;N;;;;; 10090;LINEAR B IDEOGRAM B122 OLIVE;Lo;0;L;;;;;N;;;;; 10091;LINEAR B IDEOGRAM B123 SPICE;Lo;0;L;;;;;N;;;;; 10092;LINEAR B IDEOGRAM B125 CYPERUS;Lo;0;L;;;;;N;;;;; 10093;LINEAR B MONOGRAM B127 KAPO;Lo;0;L;;;;;N;;;;; 10094;LINEAR B MONOGRAM B128 KANAKO;Lo;0;L;;;;;N;;;;; 10095;LINEAR B IDEOGRAM B130 OIL;Lo;0;L;;;;;N;;;;; 10096;LINEAR B IDEOGRAM B131 WINE;Lo;0;L;;;;;N;;;;; 10097;LINEAR B IDEOGRAM B132;Lo;0;L;;;;;N;;;;; 10098;LINEAR B MONOGRAM B133 AREPA;Lo;0;L;;;;;N;;;;; 10099;LINEAR B MONOGRAM B135 MERI;Lo;0;L;;;;;N;;;;; 1009A;LINEAR B IDEOGRAM B140 BRONZE;Lo;0;L;;;;;N;;;;; 1009B;LINEAR B IDEOGRAM B141 GOLD;Lo;0;L;;;;;N;;;;; 1009C;LINEAR B IDEOGRAM B142;Lo;0;L;;;;;N;;;;; 1009D;LINEAR B IDEOGRAM B145 WOOL;Lo;0;L;;;;;N;;;;; 1009E;LINEAR B IDEOGRAM B146;Lo;0;L;;;;;N;;;;; 1009F;LINEAR B IDEOGRAM B150;Lo;0;L;;;;;N;;;;; 100A0;LINEAR B IDEOGRAM B151 HORN;Lo;0;L;;;;;N;;;;; 100A1;LINEAR B IDEOGRAM B152;Lo;0;L;;;;;N;;;;; 100A2;LINEAR B IDEOGRAM B153;Lo;0;L;;;;;N;;;;; 100A3;LINEAR B IDEOGRAM B154;Lo;0;L;;;;;N;;;;; 100A4;LINEAR B MONOGRAM B156 TURO2;Lo;0;L;;;;;N;;;;; 100A5;LINEAR B IDEOGRAM B157;Lo;0;L;;;;;N;;;;; 100A6;LINEAR B IDEOGRAM B158;Lo;0;L;;;;;N;;;;; 100A7;LINEAR B IDEOGRAM B159 CLOTH;Lo;0;L;;;;;N;;;;; 100A8;LINEAR B IDEOGRAM B160;Lo;0;L;;;;;N;;;;; 100A9;LINEAR B IDEOGRAM B161;Lo;0;L;;;;;N;;;;; 100AA;LINEAR B IDEOGRAM B162 GARMENT;Lo;0;L;;;;;N;;;;; 100AB;LINEAR B IDEOGRAM B163 ARMOUR;Lo;0;L;;;;;N;;;;; 100AC;LINEAR B IDEOGRAM B164;Lo;0;L;;;;;N;;;;; 100AD;LINEAR B IDEOGRAM B165;Lo;0;L;;;;;N;;;;; 100AE;LINEAR B IDEOGRAM B166;Lo;0;L;;;;;N;;;;; 100AF;LINEAR B IDEOGRAM B167;Lo;0;L;;;;;N;;;;; 100B0;LINEAR B IDEOGRAM B168;Lo;0;L;;;;;N;;;;; 100B1;LINEAR B IDEOGRAM B169;Lo;0;L;;;;;N;;;;; 100B2;LINEAR B IDEOGRAM B170;Lo;0;L;;;;;N;;;;; 100B3;LINEAR B IDEOGRAM B171;Lo;0;L;;;;;N;;;;; 100B4;LINEAR B IDEOGRAM B172;Lo;0;L;;;;;N;;;;; 100B5;LINEAR B IDEOGRAM B173 MONTH;Lo;0;L;;;;;N;;;;; 100B6;LINEAR B IDEOGRAM B174;Lo;0;L;;;;;N;;;;; 100B7;LINEAR B IDEOGRAM B176 TREE;Lo;0;L;;;;;N;;;;; 100B8;LINEAR B IDEOGRAM B177;Lo;0;L;;;;;N;;;;; 100B9;LINEAR B IDEOGRAM B178;Lo;0;L;;;;;N;;;;; 100BA;LINEAR B IDEOGRAM B179;Lo;0;L;;;;;N;;;;; 100BB;LINEAR B IDEOGRAM B180;Lo;0;L;;;;;N;;;;; 100BC;LINEAR B IDEOGRAM B181;Lo;0;L;;;;;N;;;;; 100BD;LINEAR B IDEOGRAM B182;Lo;0;L;;;;;N;;;;; 100BE;LINEAR B IDEOGRAM B183;Lo;0;L;;;;;N;;;;; 100BF;LINEAR B IDEOGRAM B184;Lo;0;L;;;;;N;;;;; 100C0;LINEAR B IDEOGRAM B185;Lo;0;L;;;;;N;;;;; 100C1;LINEAR B IDEOGRAM B189;Lo;0;L;;;;;N;;;;; 100C2;LINEAR B IDEOGRAM B190;Lo;0;L;;;;;N;;;;; 100C3;LINEAR B IDEOGRAM B191 HELMET;Lo;0;L;;;;;N;;;;; 100C4;LINEAR B IDEOGRAM B220 FOOTSTOOL;Lo;0;L;;;;;N;;;;; 100C5;LINEAR B IDEOGRAM B225 BATHTUB;Lo;0;L;;;;;N;;;;; 100C6;LINEAR B IDEOGRAM B230 SPEAR;Lo;0;L;;;;;N;;;;; 100C7;LINEAR B IDEOGRAM B231 ARROW;Lo;0;L;;;;;N;;;;; 100C8;LINEAR B IDEOGRAM B232;Lo;0;L;;;;;N;;;;; 100C9;LINEAR B IDEOGRAM B233 SWORD;Lo;0;L;;;;;N;;;;; 100CA;LINEAR B IDEOGRAM B234;Lo;0;L;;;;;N;;;;; 100CB;LINEAR B IDEOGRAM B236;Lo;0;L;;;;;N;;;;; 100CC;LINEAR B IDEOGRAM B240 WHEELED CHARIOT;Lo;0;L;;;;;N;;;;; 100CD;LINEAR B IDEOGRAM B241 CHARIOT;Lo;0;L;;;;;N;;;;; 100CE;LINEAR B IDEOGRAM B242 CHARIOT FRAME;Lo;0;L;;;;;N;;;;; 100CF;LINEAR B IDEOGRAM B243 WHEEL;Lo;0;L;;;;;N;;;;; 100D0;LINEAR B IDEOGRAM B245;Lo;0;L;;;;;N;;;;; 100D1;LINEAR B IDEOGRAM B246;Lo;0;L;;;;;N;;;;; 100D2;LINEAR B MONOGRAM B247 DIPTE;Lo;0;L;;;;;N;;;;; 100D3;LINEAR B IDEOGRAM B248;Lo;0;L;;;;;N;;;;; 100D4;LINEAR B IDEOGRAM B249;Lo;0;L;;;;;N;;;;; 100D5;LINEAR B IDEOGRAM B251;Lo;0;L;;;;;N;;;;; 100D6;LINEAR B IDEOGRAM B252;Lo;0;L;;;;;N;;;;; 100D7;LINEAR B IDEOGRAM B253;Lo;0;L;;;;;N;;;;; 100D8;LINEAR B IDEOGRAM B254 DART;Lo;0;L;;;;;N;;;;; 100D9;LINEAR B IDEOGRAM B255;Lo;0;L;;;;;N;;;;; 100DA;LINEAR B IDEOGRAM B256;Lo;0;L;;;;;N;;;;; 100DB;LINEAR B IDEOGRAM B257;Lo;0;L;;;;;N;;;;; 100DC;LINEAR B IDEOGRAM B258;Lo;0;L;;;;;N;;;;; 100DD;LINEAR B IDEOGRAM B259;Lo;0;L;;;;;N;;;;; 100DE;LINEAR B IDEOGRAM VESSEL B155;Lo;0;L;;;;;N;;;;; 100DF;LINEAR B IDEOGRAM VESSEL B200;Lo;0;L;;;;;N;;;;; 100E0;LINEAR B IDEOGRAM VESSEL B201;Lo;0;L;;;;;N;;;;; 100E1;LINEAR B IDEOGRAM VESSEL B202;Lo;0;L;;;;;N;;;;; 100E2;LINEAR B IDEOGRAM VESSEL B203;Lo;0;L;;;;;N;;;;; 100E3;LINEAR B IDEOGRAM VESSEL B204;Lo;0;L;;;;;N;;;;; 100E4;LINEAR B IDEOGRAM VESSEL B205;Lo;0;L;;;;;N;;;;; 100E5;LINEAR B IDEOGRAM VESSEL B206;Lo;0;L;;;;;N;;;;; 100E6;LINEAR B IDEOGRAM VESSEL B207;Lo;0;L;;;;;N;;;;; 100E7;LINEAR B IDEOGRAM VESSEL B208;Lo;0;L;;;;;N;;;;; 100E8;LINEAR B IDEOGRAM VESSEL B209;Lo;0;L;;;;;N;;;;; 100E9;LINEAR B IDEOGRAM VESSEL B210;Lo;0;L;;;;;N;;;;; 100EA;LINEAR B IDEOGRAM VESSEL B211;Lo;0;L;;;;;N;;;;; 100EB;LINEAR B IDEOGRAM VESSEL B212;Lo;0;L;;;;;N;;;;; 100EC;LINEAR B IDEOGRAM VESSEL B213;Lo;0;L;;;;;N;;;;; 100ED;LINEAR B IDEOGRAM VESSEL B214;Lo;0;L;;;;;N;;;;; 100EE;LINEAR B IDEOGRAM VESSEL B215;Lo;0;L;;;;;N;;;;; 100EF;LINEAR B IDEOGRAM VESSEL B216;Lo;0;L;;;;;N;;;;; 100F0;LINEAR B IDEOGRAM VESSEL B217;Lo;0;L;;;;;N;;;;; 100F1;LINEAR B IDEOGRAM VESSEL B218;Lo;0;L;;;;;N;;;;; 100F2;LINEAR B IDEOGRAM VESSEL B219;Lo;0;L;;;;;N;;;;; 100F3;LINEAR B IDEOGRAM VESSEL B221;Lo;0;L;;;;;N;;;;; 100F4;LINEAR B IDEOGRAM VESSEL B222;Lo;0;L;;;;;N;;;;; 100F5;LINEAR B IDEOGRAM VESSEL B226;Lo;0;L;;;;;N;;;;; 100F6;LINEAR B IDEOGRAM VESSEL B227;Lo;0;L;;;;;N;;;;; 100F7;LINEAR B IDEOGRAM VESSEL B228;Lo;0;L;;;;;N;;;;; 100F8;LINEAR B IDEOGRAM VESSEL B229;Lo;0;L;;;;;N;;;;; 100F9;LINEAR B IDEOGRAM VESSEL B250;Lo;0;L;;;;;N;;;;; 100FA;LINEAR B IDEOGRAM VESSEL B305;Lo;0;L;;;;;N;;;;; 10100;AEGEAN WORD SEPARATOR LINE;Po;0;L;;;;;N;;;;; 10101;AEGEAN WORD SEPARATOR DOT;Po;0;ON;;;;;N;;;;; 10102;AEGEAN CHECK MARK;Po;0;L;;;;;N;;;;; 10107;AEGEAN NUMBER ONE;No;0;L;;;;1;N;;;;; 10108;AEGEAN NUMBER TWO;No;0;L;;;;2;N;;;;; 10109;AEGEAN NUMBER THREE;No;0;L;;;;3;N;;;;; 1010A;AEGEAN NUMBER FOUR;No;0;L;;;;4;N;;;;; 1010B;AEGEAN NUMBER FIVE;No;0;L;;;;5;N;;;;; 1010C;AEGEAN NUMBER SIX;No;0;L;;;;6;N;;;;; 1010D;AEGEAN NUMBER SEVEN;No;0;L;;;;7;N;;;;; 1010E;AEGEAN NUMBER EIGHT;No;0;L;;;;8;N;;;;; 1010F;AEGEAN NUMBER NINE;No;0;L;;;;9;N;;;;; 10110;AEGEAN NUMBER TEN;No;0;L;;;;10;N;;;;; 10111;AEGEAN NUMBER TWENTY;No;0;L;;;;20;N;;;;; 10112;AEGEAN NUMBER THIRTY;No;0;L;;;;30;N;;;;; 10113;AEGEAN NUMBER FORTY;No;0;L;;;;40;N;;;;; 10114;AEGEAN NUMBER FIFTY;No;0;L;;;;50;N;;;;; 10115;AEGEAN NUMBER SIXTY;No;0;L;;;;60;N;;;;; 10116;AEGEAN NUMBER SEVENTY;No;0;L;;;;70;N;;;;; 10117;AEGEAN NUMBER EIGHTY;No;0;L;;;;80;N;;;;; 10118;AEGEAN NUMBER NINETY;No;0;L;;;;90;N;;;;; 10119;AEGEAN NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; 1011A;AEGEAN NUMBER TWO HUNDRED;No;0;L;;;;200;N;;;;; 1011B;AEGEAN NUMBER THREE HUNDRED;No;0;L;;;;300;N;;;;; 1011C;AEGEAN NUMBER FOUR HUNDRED;No;0;L;;;;400;N;;;;; 1011D;AEGEAN NUMBER FIVE HUNDRED;No;0;L;;;;500;N;;;;; 1011E;AEGEAN NUMBER SIX HUNDRED;No;0;L;;;;600;N;;;;; 1011F;AEGEAN NUMBER SEVEN HUNDRED;No;0;L;;;;700;N;;;;; 10120;AEGEAN NUMBER EIGHT HUNDRED;No;0;L;;;;800;N;;;;; 10121;AEGEAN NUMBER NINE HUNDRED;No;0;L;;;;900;N;;;;; 10122;AEGEAN NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; 10123;AEGEAN NUMBER TWO THOUSAND;No;0;L;;;;2000;N;;;;; 10124;AEGEAN NUMBER THREE THOUSAND;No;0;L;;;;3000;N;;;;; 10125;AEGEAN NUMBER FOUR THOUSAND;No;0;L;;;;4000;N;;;;; 10126;AEGEAN NUMBER FIVE THOUSAND;No;0;L;;;;5000;N;;;;; 10127;AEGEAN NUMBER SIX THOUSAND;No;0;L;;;;6000;N;;;;; 10128;AEGEAN NUMBER SEVEN THOUSAND;No;0;L;;;;7000;N;;;;; 10129;AEGEAN NUMBER EIGHT THOUSAND;No;0;L;;;;8000;N;;;;; 1012A;AEGEAN NUMBER NINE THOUSAND;No;0;L;;;;9000;N;;;;; 1012B;AEGEAN NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; 1012C;AEGEAN NUMBER TWENTY THOUSAND;No;0;L;;;;20000;N;;;;; 1012D;AEGEAN NUMBER THIRTY THOUSAND;No;0;L;;;;30000;N;;;;; 1012E;AEGEAN NUMBER FORTY THOUSAND;No;0;L;;;;40000;N;;;;; 1012F;AEGEAN NUMBER FIFTY THOUSAND;No;0;L;;;;50000;N;;;;; 10130;AEGEAN NUMBER SIXTY THOUSAND;No;0;L;;;;60000;N;;;;; 10131;AEGEAN NUMBER SEVENTY THOUSAND;No;0;L;;;;70000;N;;;;; 10132;AEGEAN NUMBER EIGHTY THOUSAND;No;0;L;;;;80000;N;;;;; 10133;AEGEAN NUMBER NINETY THOUSAND;No;0;L;;;;90000;N;;;;; 10137;AEGEAN WEIGHT BASE UNIT;So;0;L;;;;;N;;;;; 10138;AEGEAN WEIGHT FIRST SUBUNIT;So;0;L;;;;;N;;;;; 10139;AEGEAN WEIGHT SECOND SUBUNIT;So;0;L;;;;;N;;;;; 1013A;AEGEAN WEIGHT THIRD SUBUNIT;So;0;L;;;;;N;;;;; 1013B;AEGEAN WEIGHT FOURTH SUBUNIT;So;0;L;;;;;N;;;;; 1013C;AEGEAN DRY MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; 1013D;AEGEAN LIQUID MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; 1013E;AEGEAN MEASURE SECOND SUBUNIT;So;0;L;;;;;N;;;;; 1013F;AEGEAN MEASURE THIRD SUBUNIT;So;0;L;;;;;N;;;;; 10140;GREEK ACROPHONIC ATTIC ONE QUARTER;Nl;0;ON;;;;1/4;N;;;;; 10141;GREEK ACROPHONIC ATTIC ONE HALF;Nl;0;ON;;;;1/2;N;;;;; 10142;GREEK ACROPHONIC ATTIC ONE DRACHMA;Nl;0;ON;;;;1;N;;;;; 10143;GREEK ACROPHONIC ATTIC FIVE;Nl;0;ON;;;;5;N;;;;; 10144;GREEK ACROPHONIC ATTIC FIFTY;Nl;0;ON;;;;50;N;;;;; 10145;GREEK ACROPHONIC ATTIC FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; 10146;GREEK ACROPHONIC ATTIC FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; 10147;GREEK ACROPHONIC ATTIC FIFTY THOUSAND;Nl;0;ON;;;;50000;N;;;;; 10148;GREEK ACROPHONIC ATTIC FIVE TALENTS;Nl;0;ON;;;;5;N;;;;; 10149;GREEK ACROPHONIC ATTIC TEN TALENTS;Nl;0;ON;;;;10;N;;;;; 1014A;GREEK ACROPHONIC ATTIC FIFTY TALENTS;Nl;0;ON;;;;50;N;;;;; 1014B;GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS;Nl;0;ON;;;;100;N;;;;; 1014C;GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS;Nl;0;ON;;;;500;N;;;;; 1014D;GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS;Nl;0;ON;;;;1000;N;;;;; 1014E;GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS;Nl;0;ON;;;;5000;N;;;;; 1014F;GREEK ACROPHONIC ATTIC FIVE STATERS;Nl;0;ON;;;;5;N;;;;; 10150;GREEK ACROPHONIC ATTIC TEN STATERS;Nl;0;ON;;;;10;N;;;;; 10151;GREEK ACROPHONIC ATTIC FIFTY STATERS;Nl;0;ON;;;;50;N;;;;; 10152;GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS;Nl;0;ON;;;;100;N;;;;; 10153;GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS;Nl;0;ON;;;;500;N;;;;; 10154;GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS;Nl;0;ON;;;;1000;N;;;;; 10155;GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS;Nl;0;ON;;;;10000;N;;;;; 10156;GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS;Nl;0;ON;;;;50000;N;;;;; 10157;GREEK ACROPHONIC ATTIC TEN MNAS;Nl;0;ON;;;;10;N;;;;; 10158;GREEK ACROPHONIC HERAEUM ONE PLETHRON;Nl;0;ON;;;;1;N;;;;; 10159;GREEK ACROPHONIC THESPIAN ONE;Nl;0;ON;;;;1;N;;;;; 1015A;GREEK ACROPHONIC HERMIONIAN ONE;Nl;0;ON;;;;1;N;;;;; 1015B;GREEK ACROPHONIC EPIDAUREAN TWO;Nl;0;ON;;;;2;N;;;;; 1015C;GREEK ACROPHONIC THESPIAN TWO;Nl;0;ON;;;;2;N;;;;; 1015D;GREEK ACROPHONIC CYRENAIC TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; 1015E;GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; 1015F;GREEK ACROPHONIC TROEZENIAN FIVE;Nl;0;ON;;;;5;N;;;;; 10160;GREEK ACROPHONIC TROEZENIAN TEN;Nl;0;ON;;;;10;N;;;;; 10161;GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM;Nl;0;ON;;;;10;N;;;;; 10162;GREEK ACROPHONIC HERMIONIAN TEN;Nl;0;ON;;;;10;N;;;;; 10163;GREEK ACROPHONIC MESSENIAN TEN;Nl;0;ON;;;;10;N;;;;; 10164;GREEK ACROPHONIC THESPIAN TEN;Nl;0;ON;;;;10;N;;;;; 10165;GREEK ACROPHONIC THESPIAN THIRTY;Nl;0;ON;;;;30;N;;;;; 10166;GREEK ACROPHONIC TROEZENIAN FIFTY;Nl;0;ON;;;;50;N;;;;; 10167;GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM;Nl;0;ON;;;;50;N;;;;; 10168;GREEK ACROPHONIC HERMIONIAN FIFTY;Nl;0;ON;;;;50;N;;;;; 10169;GREEK ACROPHONIC THESPIAN FIFTY;Nl;0;ON;;;;50;N;;;;; 1016A;GREEK ACROPHONIC THESPIAN ONE HUNDRED;Nl;0;ON;;;;100;N;;;;; 1016B;GREEK ACROPHONIC THESPIAN THREE HUNDRED;Nl;0;ON;;;;300;N;;;;; 1016C;GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; 1016D;GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; 1016E;GREEK ACROPHONIC THESPIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; 1016F;GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; 10170;GREEK ACROPHONIC NAXIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; 10171;GREEK ACROPHONIC THESPIAN ONE THOUSAND;Nl;0;ON;;;;1000;N;;;;; 10172;GREEK ACROPHONIC THESPIAN FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; 10173;GREEK ACROPHONIC DELPHIC FIVE MNAS;Nl;0;ON;;;;5;N;;;;; 10174;GREEK ACROPHONIC STRATIAN FIFTY MNAS;Nl;0;ON;;;;50;N;;;;; 10175;GREEK ONE HALF SIGN;No;0;ON;;;;1/2;N;;;;; 10176;GREEK ONE HALF SIGN ALTERNATE FORM;No;0;ON;;;;1/2;N;;;;; 10177;GREEK TWO THIRDS SIGN;No;0;ON;;;;2/3;N;;;;; 10178;GREEK THREE QUARTERS SIGN;No;0;ON;;;;3/4;N;;;;; 10179;GREEK YEAR SIGN;So;0;ON;;;;;N;;;;; 1017A;GREEK TALENT SIGN;So;0;ON;;;;;N;;;;; 1017B;GREEK DRACHMA SIGN;So;0;ON;;;;;N;;;;; 1017C;GREEK OBOL SIGN;So;0;ON;;;;;N;;;;; 1017D;GREEK TWO OBOLS SIGN;So;0;ON;;;;;N;;;;; 1017E;GREEK THREE OBOLS SIGN;So;0;ON;;;;;N;;;;; 1017F;GREEK FOUR OBOLS SIGN;So;0;ON;;;;;N;;;;; 10180;GREEK FIVE OBOLS SIGN;So;0;ON;;;;;N;;;;; 10181;GREEK METRETES SIGN;So;0;ON;;;;;N;;;;; 10182;GREEK KYATHOS BASE SIGN;So;0;ON;;;;;N;;;;; 10183;GREEK LITRA SIGN;So;0;ON;;;;;N;;;;; 10184;GREEK OUNKIA SIGN;So;0;ON;;;;;N;;;;; 10185;GREEK XESTES SIGN;So;0;ON;;;;;N;;;;; 10186;GREEK ARTABE SIGN;So;0;ON;;;;;N;;;;; 10187;GREEK AROURA SIGN;So;0;ON;;;;;N;;;;; 10188;GREEK GRAMMA SIGN;So;0;ON;;;;;N;;;;; 10189;GREEK TRYBLION BASE SIGN;So;0;ON;;;;;N;;;;; 1018A;GREEK ZERO SIGN;No;0;ON;;;;0;N;;;;; 1018B;GREEK ONE QUARTER SIGN;No;0;ON;;;;1/4;N;;;;; 1018C;GREEK SINUSOID SIGN;So;0;ON;;;;;N;;;;; 1018D;GREEK INDICTION SIGN;So;0;L;;;;;N;;;;; 1018E;NOMISMA SIGN;So;0;L;;;;;N;;;;; 10190;ROMAN SEXTANS SIGN;So;0;ON;;;;;N;;;;; 10191;ROMAN UNCIA SIGN;So;0;ON;;;;;N;;;;; 10192;ROMAN SEMUNCIA SIGN;So;0;ON;;;;;N;;;;; 10193;ROMAN SEXTULA SIGN;So;0;ON;;;;;N;;;;; 10194;ROMAN DIMIDIA SEXTULA SIGN;So;0;ON;;;;;N;;;;; 10195;ROMAN SILIQUA SIGN;So;0;ON;;;;;N;;;;; 10196;ROMAN DENARIUS SIGN;So;0;ON;;;;;N;;;;; 10197;ROMAN QUINARIUS SIGN;So;0;ON;;;;;N;;;;; 10198;ROMAN SESTERTIUS SIGN;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;;;;; 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;;;;; 101D2;PHAISTOS DISC SIGN TATTOOED HEAD;So;0;L;;;;;N;;;;; 101D3;PHAISTOS DISC SIGN CAPTIVE;So;0;L;;;;;N;;;;; 101D4;PHAISTOS DISC SIGN CHILD;So;0;L;;;;;N;;;;; 101D5;PHAISTOS DISC SIGN WOMAN;So;0;L;;;;;N;;;;; 101D6;PHAISTOS DISC SIGN HELMET;So;0;L;;;;;N;;;;; 101D7;PHAISTOS DISC SIGN GAUNTLET;So;0;L;;;;;N;;;;; 101D8;PHAISTOS DISC SIGN TIARA;So;0;L;;;;;N;;;;; 101D9;PHAISTOS DISC SIGN ARROW;So;0;L;;;;;N;;;;; 101DA;PHAISTOS DISC SIGN BOW;So;0;L;;;;;N;;;;; 101DB;PHAISTOS DISC SIGN SHIELD;So;0;L;;;;;N;;;;; 101DC;PHAISTOS DISC SIGN CLUB;So;0;L;;;;;N;;;;; 101DD;PHAISTOS DISC SIGN MANACLES;So;0;L;;;;;N;;;;; 101DE;PHAISTOS DISC SIGN MATTOCK;So;0;L;;;;;N;;;;; 101DF;PHAISTOS DISC SIGN SAW;So;0;L;;;;;N;;;;; 101E0;PHAISTOS DISC SIGN LID;So;0;L;;;;;N;;;;; 101E1;PHAISTOS DISC SIGN BOOMERANG;So;0;L;;;;;N;;;;; 101E2;PHAISTOS DISC SIGN CARPENTRY PLANE;So;0;L;;;;;N;;;;; 101E3;PHAISTOS DISC SIGN DOLIUM;So;0;L;;;;;N;;;;; 101E4;PHAISTOS DISC SIGN COMB;So;0;L;;;;;N;;;;; 101E5;PHAISTOS DISC SIGN SLING;So;0;L;;;;;N;;;;; 101E6;PHAISTOS DISC SIGN COLUMN;So;0;L;;;;;N;;;;; 101E7;PHAISTOS DISC SIGN BEEHIVE;So;0;L;;;;;N;;;;; 101E8;PHAISTOS DISC SIGN SHIP;So;0;L;;;;;N;;;;; 101E9;PHAISTOS DISC SIGN HORN;So;0;L;;;;;N;;;;; 101EA;PHAISTOS DISC SIGN HIDE;So;0;L;;;;;N;;;;; 101EB;PHAISTOS DISC SIGN BULLS LEG;So;0;L;;;;;N;;;;; 101EC;PHAISTOS DISC SIGN CAT;So;0;L;;;;;N;;;;; 101ED;PHAISTOS DISC SIGN RAM;So;0;L;;;;;N;;;;; 101EE;PHAISTOS DISC SIGN EAGLE;So;0;L;;;;;N;;;;; 101EF;PHAISTOS DISC SIGN DOVE;So;0;L;;;;;N;;;;; 101F0;PHAISTOS DISC SIGN TUNNY;So;0;L;;;;;N;;;;; 101F1;PHAISTOS DISC SIGN BEE;So;0;L;;;;;N;;;;; 101F2;PHAISTOS DISC SIGN PLANE TREE;So;0;L;;;;;N;;;;; 101F3;PHAISTOS DISC SIGN VINE;So;0;L;;;;;N;;;;; 101F4;PHAISTOS DISC SIGN PAPYRUS;So;0;L;;;;;N;;;;; 101F5;PHAISTOS DISC SIGN ROSETTE;So;0;L;;;;;N;;;;; 101F6;PHAISTOS DISC SIGN LILY;So;0;L;;;;;N;;;;; 101F7;PHAISTOS DISC SIGN OX BACK;So;0;L;;;;;N;;;;; 101F8;PHAISTOS DISC SIGN FLUTE;So;0;L;;;;;N;;;;; 101F9;PHAISTOS DISC SIGN GRATER;So;0;L;;;;;N;;;;; 101FA;PHAISTOS DISC SIGN STRAINER;So;0;L;;;;;N;;;;; 101FB;PHAISTOS DISC SIGN SMALL AXE;So;0;L;;;;;N;;;;; 101FC;PHAISTOS DISC SIGN WAVY BAND;So;0;L;;;;;N;;;;; 101FD;PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE;Mn;220;NSM;;;;;N;;;;; 10280;LYCIAN LETTER A;Lo;0;L;;;;;N;;;;; 10281;LYCIAN LETTER E;Lo;0;L;;;;;N;;;;; 10282;LYCIAN LETTER B;Lo;0;L;;;;;N;;;;; 10283;LYCIAN LETTER BH;Lo;0;L;;;;;N;;;;; 10284;LYCIAN LETTER G;Lo;0;L;;;;;N;;;;; 10285;LYCIAN LETTER D;Lo;0;L;;;;;N;;;;; 10286;LYCIAN LETTER I;Lo;0;L;;;;;N;;;;; 10287;LYCIAN LETTER W;Lo;0;L;;;;;N;;;;; 10288;LYCIAN LETTER Z;Lo;0;L;;;;;N;;;;; 10289;LYCIAN LETTER TH;Lo;0;L;;;;;N;;;;; 1028A;LYCIAN LETTER J;Lo;0;L;;;;;N;;;;; 1028B;LYCIAN LETTER K;Lo;0;L;;;;;N;;;;; 1028C;LYCIAN LETTER Q;Lo;0;L;;;;;N;;;;; 1028D;LYCIAN LETTER L;Lo;0;L;;;;;N;;;;; 1028E;LYCIAN LETTER M;Lo;0;L;;;;;N;;;;; 1028F;LYCIAN LETTER N;Lo;0;L;;;;;N;;;;; 10290;LYCIAN LETTER MM;Lo;0;L;;;;;N;;;;; 10291;LYCIAN LETTER NN;Lo;0;L;;;;;N;;;;; 10292;LYCIAN LETTER U;Lo;0;L;;;;;N;;;;; 10293;LYCIAN LETTER P;Lo;0;L;;;;;N;;;;; 10294;LYCIAN LETTER KK;Lo;0;L;;;;;N;;;;; 10295;LYCIAN LETTER R;Lo;0;L;;;;;N;;;;; 10296;LYCIAN LETTER S;Lo;0;L;;;;;N;;;;; 10297;LYCIAN LETTER T;Lo;0;L;;;;;N;;;;; 10298;LYCIAN LETTER TT;Lo;0;L;;;;;N;;;;; 10299;LYCIAN LETTER AN;Lo;0;L;;;;;N;;;;; 1029A;LYCIAN LETTER EN;Lo;0;L;;;;;N;;;;; 1029B;LYCIAN LETTER H;Lo;0;L;;;;;N;;;;; 1029C;LYCIAN LETTER X;Lo;0;L;;;;;N;;;;; 102A0;CARIAN LETTER A;Lo;0;L;;;;;N;;;;; 102A1;CARIAN LETTER P2;Lo;0;L;;;;;N;;;;; 102A2;CARIAN LETTER D;Lo;0;L;;;;;N;;;;; 102A3;CARIAN LETTER L;Lo;0;L;;;;;N;;;;; 102A4;CARIAN LETTER UUU;Lo;0;L;;;;;N;;;;; 102A5;CARIAN LETTER R;Lo;0;L;;;;;N;;;;; 102A6;CARIAN LETTER LD;Lo;0;L;;;;;N;;;;; 102A7;CARIAN LETTER A2;Lo;0;L;;;;;N;;;;; 102A8;CARIAN LETTER Q;Lo;0;L;;;;;N;;;;; 102A9;CARIAN LETTER B;Lo;0;L;;;;;N;;;;; 102AA;CARIAN LETTER M;Lo;0;L;;;;;N;;;;; 102AB;CARIAN LETTER O;Lo;0;L;;;;;N;;;;; 102AC;CARIAN LETTER D2;Lo;0;L;;;;;N;;;;; 102AD;CARIAN LETTER T;Lo;0;L;;;;;N;;;;; 102AE;CARIAN LETTER SH;Lo;0;L;;;;;N;;;;; 102AF;CARIAN LETTER SH2;Lo;0;L;;;;;N;;;;; 102B0;CARIAN LETTER S;Lo;0;L;;;;;N;;;;; 102B1;CARIAN LETTER C-18;Lo;0;L;;;;;N;;;;; 102B2;CARIAN LETTER U;Lo;0;L;;;;;N;;;;; 102B3;CARIAN LETTER NN;Lo;0;L;;;;;N;;;;; 102B4;CARIAN LETTER X;Lo;0;L;;;;;N;;;;; 102B5;CARIAN LETTER N;Lo;0;L;;;;;N;;;;; 102B6;CARIAN LETTER TT2;Lo;0;L;;;;;N;;;;; 102B7;CARIAN LETTER P;Lo;0;L;;;;;N;;;;; 102B8;CARIAN LETTER SS;Lo;0;L;;;;;N;;;;; 102B9;CARIAN LETTER I;Lo;0;L;;;;;N;;;;; 102BA;CARIAN LETTER E;Lo;0;L;;;;;N;;;;; 102BB;CARIAN LETTER UUUU;Lo;0;L;;;;;N;;;;; 102BC;CARIAN LETTER K;Lo;0;L;;;;;N;;;;; 102BD;CARIAN LETTER K2;Lo;0;L;;;;;N;;;;; 102BE;CARIAN LETTER ND;Lo;0;L;;;;;N;;;;; 102BF;CARIAN LETTER UU;Lo;0;L;;;;;N;;;;; 102C0;CARIAN LETTER G;Lo;0;L;;;;;N;;;;; 102C1;CARIAN LETTER G2;Lo;0;L;;;;;N;;;;; 102C2;CARIAN LETTER ST;Lo;0;L;;;;;N;;;;; 102C3;CARIAN LETTER ST2;Lo;0;L;;;;;N;;;;; 102C4;CARIAN LETTER NG;Lo;0;L;;;;;N;;;;; 102C5;CARIAN LETTER II;Lo;0;L;;;;;N;;;;; 102C6;CARIAN LETTER C-39;Lo;0;L;;;;;N;;;;; 102C7;CARIAN LETTER TT;Lo;0;L;;;;;N;;;;; 102C8;CARIAN LETTER UUU2;Lo;0;L;;;;;N;;;;; 102C9;CARIAN LETTER RR;Lo;0;L;;;;;N;;;;; 102CA;CARIAN LETTER MB;Lo;0;L;;;;;N;;;;; 102CB;CARIAN LETTER MB2;Lo;0;L;;;;;N;;;;; 102CC;CARIAN LETTER MB3;Lo;0;L;;;;;N;;;;; 102CD;CARIAN LETTER MB4;Lo;0;L;;;;;N;;;;; 102CE;CARIAN LETTER LD2;Lo;0;L;;;;;N;;;;; 102CF;CARIAN LETTER E2;Lo;0;L;;;;;N;;;;; 102D0;CARIAN LETTER UUU3;Lo;0;L;;;;;N;;;;; 102E0;COPTIC EPACT THOUSANDS MARK;Mn;220;NSM;;;;;N;;;;; 102E1;COPTIC EPACT DIGIT ONE;No;0;EN;;;;1;N;;;;; 102E2;COPTIC EPACT DIGIT TWO;No;0;EN;;;;2;N;;;;; 102E3;COPTIC EPACT DIGIT THREE;No;0;EN;;;;3;N;;;;; 102E4;COPTIC EPACT DIGIT FOUR;No;0;EN;;;;4;N;;;;; 102E5;COPTIC EPACT DIGIT FIVE;No;0;EN;;;;5;N;;;;; 102E6;COPTIC EPACT DIGIT SIX;No;0;EN;;;;6;N;;;;; 102E7;COPTIC EPACT DIGIT SEVEN;No;0;EN;;;;7;N;;;;; 102E8;COPTIC EPACT DIGIT EIGHT;No;0;EN;;;;8;N;;;;; 102E9;COPTIC EPACT DIGIT NINE;No;0;EN;;;;9;N;;;;; 102EA;COPTIC EPACT NUMBER TEN;No;0;EN;;;;10;N;;;;; 102EB;COPTIC EPACT NUMBER TWENTY;No;0;EN;;;;20;N;;;;; 102EC;COPTIC EPACT NUMBER THIRTY;No;0;EN;;;;30;N;;;;; 102ED;COPTIC EPACT NUMBER FORTY;No;0;EN;;;;40;N;;;;; 102EE;COPTIC EPACT NUMBER FIFTY;No;0;EN;;;;50;N;;;;; 102EF;COPTIC EPACT NUMBER SIXTY;No;0;EN;;;;60;N;;;;; 102F0;COPTIC EPACT NUMBER SEVENTY;No;0;EN;;;;70;N;;;;; 102F1;COPTIC EPACT NUMBER EIGHTY;No;0;EN;;;;80;N;;;;; 102F2;COPTIC EPACT NUMBER NINETY;No;0;EN;;;;90;N;;;;; 102F3;COPTIC EPACT NUMBER ONE HUNDRED;No;0;EN;;;;100;N;;;;; 102F4;COPTIC EPACT NUMBER TWO HUNDRED;No;0;EN;;;;200;N;;;;; 102F5;COPTIC EPACT NUMBER THREE HUNDRED;No;0;EN;;;;300;N;;;;; 102F6;COPTIC EPACT NUMBER FOUR HUNDRED;No;0;EN;;;;400;N;;;;; 102F7;COPTIC EPACT NUMBER FIVE HUNDRED;No;0;EN;;;;500;N;;;;; 102F8;COPTIC EPACT NUMBER SIX HUNDRED;No;0;EN;;;;600;N;;;;; 102F9;COPTIC EPACT NUMBER SEVEN HUNDRED;No;0;EN;;;;700;N;;;;; 102FA;COPTIC EPACT NUMBER EIGHT HUNDRED;No;0;EN;;;;800;N;;;;; 102FB;COPTIC EPACT NUMBER NINE HUNDRED;No;0;EN;;;;900;N;;;;; 10300;OLD ITALIC LETTER A;Lo;0;L;;;;;N;;;;; 10301;OLD ITALIC LETTER BE;Lo;0;L;;;;;N;;;;; 10302;OLD ITALIC LETTER KE;Lo;0;L;;;;;N;;;;; 10303;OLD ITALIC LETTER DE;Lo;0;L;;;;;N;;;;; 10304;OLD ITALIC LETTER E;Lo;0;L;;;;;N;;;;; 10305;OLD ITALIC LETTER VE;Lo;0;L;;;;;N;;;;; 10306;OLD ITALIC LETTER ZE;Lo;0;L;;;;;N;;;;; 10307;OLD ITALIC LETTER HE;Lo;0;L;;;;;N;;;;; 10308;OLD ITALIC LETTER THE;Lo;0;L;;;;;N;;;;; 10309;OLD ITALIC LETTER I;Lo;0;L;;;;;N;;;;; 1030A;OLD ITALIC LETTER KA;Lo;0;L;;;;;N;;;;; 1030B;OLD ITALIC LETTER EL;Lo;0;L;;;;;N;;;;; 1030C;OLD ITALIC LETTER EM;Lo;0;L;;;;;N;;;;; 1030D;OLD ITALIC LETTER EN;Lo;0;L;;;;;N;;;;; 1030E;OLD ITALIC LETTER ESH;Lo;0;L;;;;;N;;;;; 1030F;OLD ITALIC LETTER O;Lo;0;L;;;;;N;;;;; 10310;OLD ITALIC LETTER PE;Lo;0;L;;;;;N;;;;; 10311;OLD ITALIC LETTER SHE;Lo;0;L;;;;;N;;;;; 10312;OLD ITALIC LETTER KU;Lo;0;L;;;;;N;;;;; 10313;OLD ITALIC LETTER ER;Lo;0;L;;;;;N;;;;; 10314;OLD ITALIC LETTER ES;Lo;0;L;;;;;N;;;;; 10315;OLD ITALIC LETTER TE;Lo;0;L;;;;;N;;;;; 10316;OLD ITALIC LETTER U;Lo;0;L;;;;;N;;;;; 10317;OLD ITALIC LETTER EKS;Lo;0;L;;;;;N;;;;; 10318;OLD ITALIC LETTER PHE;Lo;0;L;;;;;N;;;;; 10319;OLD ITALIC LETTER KHE;Lo;0;L;;;;;N;;;;; 1031A;OLD ITALIC LETTER EF;Lo;0;L;;;;;N;;;;; 1031B;OLD ITALIC LETTER ERS;Lo;0;L;;;;;N;;;;; 1031C;OLD ITALIC LETTER CHE;Lo;0;L;;;;;N;;;;; 1031D;OLD ITALIC LETTER II;Lo;0;L;;;;;N;;;;; 1031E;OLD ITALIC LETTER UU;Lo;0;L;;;;;N;;;;; 1031F;OLD ITALIC LETTER ESS;Lo;0;L;;;;;N;;;;; 10320;OLD ITALIC NUMERAL ONE;No;0;L;;;;1;N;;;;; 10321;OLD ITALIC NUMERAL FIVE;No;0;L;;;;5;N;;;;; 10322;OLD ITALIC NUMERAL TEN;No;0;L;;;;10;N;;;;; 10323;OLD ITALIC NUMERAL FIFTY;No;0;L;;;;50;N;;;;; 10330;GOTHIC LETTER AHSA;Lo;0;L;;;;;N;;;;; 10331;GOTHIC LETTER BAIRKAN;Lo;0;L;;;;;N;;;;; 10332;GOTHIC LETTER GIBA;Lo;0;L;;;;;N;;;;; 10333;GOTHIC LETTER DAGS;Lo;0;L;;;;;N;;;;; 10334;GOTHIC LETTER AIHVUS;Lo;0;L;;;;;N;;;;; 10335;GOTHIC LETTER QAIRTHRA;Lo;0;L;;;;;N;;;;; 10336;GOTHIC LETTER IUJA;Lo;0;L;;;;;N;;;;; 10337;GOTHIC LETTER HAGL;Lo;0;L;;;;;N;;;;; 10338;GOTHIC LETTER THIUTH;Lo;0;L;;;;;N;;;;; 10339;GOTHIC LETTER EIS;Lo;0;L;;;;;N;;;;; 1033A;GOTHIC LETTER KUSMA;Lo;0;L;;;;;N;;;;; 1033B;GOTHIC LETTER LAGUS;Lo;0;L;;;;;N;;;;; 1033C;GOTHIC LETTER MANNA;Lo;0;L;;;;;N;;;;; 1033D;GOTHIC LETTER NAUTHS;Lo;0;L;;;;;N;;;;; 1033E;GOTHIC LETTER JER;Lo;0;L;;;;;N;;;;; 1033F;GOTHIC LETTER URUS;Lo;0;L;;;;;N;;;;; 10340;GOTHIC LETTER PAIRTHRA;Lo;0;L;;;;;N;;;;; 10341;GOTHIC LETTER NINETY;Nl;0;L;;;;90;N;;;;; 10342;GOTHIC LETTER RAIDA;Lo;0;L;;;;;N;;;;; 10343;GOTHIC LETTER SAUIL;Lo;0;L;;;;;N;;;;; 10344;GOTHIC LETTER TEIWS;Lo;0;L;;;;;N;;;;; 10345;GOTHIC LETTER WINJA;Lo;0;L;;;;;N;;;;; 10346;GOTHIC LETTER FAIHU;Lo;0;L;;;;;N;;;;; 10347;GOTHIC LETTER IGGWS;Lo;0;L;;;;;N;;;;; 10348;GOTHIC LETTER HWAIR;Lo;0;L;;;;;N;;;;; 10349;GOTHIC LETTER OTHAL;Lo;0;L;;;;;N;;;;; 1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;900;N;;;;; 10350;OLD PERMIC LETTER AN;Lo;0;L;;;;;N;;;;; 10351;OLD PERMIC LETTER BUR;Lo;0;L;;;;;N;;;;; 10352;OLD PERMIC LETTER GAI;Lo;0;L;;;;;N;;;;; 10353;OLD PERMIC LETTER DOI;Lo;0;L;;;;;N;;;;; 10354;OLD PERMIC LETTER E;Lo;0;L;;;;;N;;;;; 10355;OLD PERMIC LETTER ZHOI;Lo;0;L;;;;;N;;;;; 10356;OLD PERMIC LETTER DZHOI;Lo;0;L;;;;;N;;;;; 10357;OLD PERMIC LETTER ZATA;Lo;0;L;;;;;N;;;;; 10358;OLD PERMIC LETTER DZITA;Lo;0;L;;;;;N;;;;; 10359;OLD PERMIC LETTER I;Lo;0;L;;;;;N;;;;; 1035A;OLD PERMIC LETTER KOKE;Lo;0;L;;;;;N;;;;; 1035B;OLD PERMIC LETTER LEI;Lo;0;L;;;;;N;;;;; 1035C;OLD PERMIC LETTER MENOE;Lo;0;L;;;;;N;;;;; 1035D;OLD PERMIC LETTER NENOE;Lo;0;L;;;;;N;;;;; 1035E;OLD PERMIC LETTER VOOI;Lo;0;L;;;;;N;;;;; 1035F;OLD PERMIC LETTER PEEI;Lo;0;L;;;;;N;;;;; 10360;OLD PERMIC LETTER REI;Lo;0;L;;;;;N;;;;; 10361;OLD PERMIC LETTER SII;Lo;0;L;;;;;N;;;;; 10362;OLD PERMIC LETTER TAI;Lo;0;L;;;;;N;;;;; 10363;OLD PERMIC LETTER U;Lo;0;L;;;;;N;;;;; 10364;OLD PERMIC LETTER CHERY;Lo;0;L;;;;;N;;;;; 10365;OLD PERMIC LETTER SHOOI;Lo;0;L;;;;;N;;;;; 10366;OLD PERMIC LETTER SHCHOOI;Lo;0;L;;;;;N;;;;; 10367;OLD PERMIC LETTER YRY;Lo;0;L;;;;;N;;;;; 10368;OLD PERMIC LETTER YERU;Lo;0;L;;;;;N;;;;; 10369;OLD PERMIC LETTER O;Lo;0;L;;;;;N;;;;; 1036A;OLD PERMIC LETTER OO;Lo;0;L;;;;;N;;;;; 1036B;OLD PERMIC LETTER EF;Lo;0;L;;;;;N;;;;; 1036C;OLD PERMIC LETTER HA;Lo;0;L;;;;;N;;;;; 1036D;OLD PERMIC LETTER TSIU;Lo;0;L;;;;;N;;;;; 1036E;OLD PERMIC LETTER VER;Lo;0;L;;;;;N;;;;; 1036F;OLD PERMIC LETTER YER;Lo;0;L;;;;;N;;;;; 10370;OLD PERMIC LETTER YERI;Lo;0;L;;;;;N;;;;; 10371;OLD PERMIC LETTER YAT;Lo;0;L;;;;;N;;;;; 10372;OLD PERMIC LETTER IE;Lo;0;L;;;;;N;;;;; 10373;OLD PERMIC LETTER YU;Lo;0;L;;;;;N;;;;; 10374;OLD PERMIC LETTER YA;Lo;0;L;;;;;N;;;;; 10375;OLD PERMIC LETTER IA;Lo;0;L;;;;;N;;;;; 10376;COMBINING OLD PERMIC LETTER AN;Mn;230;NSM;;;;;N;;;;; 10377;COMBINING OLD PERMIC LETTER DOI;Mn;230;NSM;;;;;N;;;;; 10378;COMBINING OLD PERMIC LETTER ZATA;Mn;230;NSM;;;;;N;;;;; 10379;COMBINING OLD PERMIC LETTER NENOE;Mn;230;NSM;;;;;N;;;;; 1037A;COMBINING OLD PERMIC LETTER SII;Mn;230;NSM;;;;;N;;;;; 10380;UGARITIC LETTER ALPA;Lo;0;L;;;;;N;;;;; 10381;UGARITIC LETTER BETA;Lo;0;L;;;;;N;;;;; 10382;UGARITIC LETTER GAMLA;Lo;0;L;;;;;N;;;;; 10383;UGARITIC LETTER KHA;Lo;0;L;;;;;N;;;;; 10384;UGARITIC LETTER DELTA;Lo;0;L;;;;;N;;;;; 10385;UGARITIC LETTER HO;Lo;0;L;;;;;N;;;;; 10386;UGARITIC LETTER WO;Lo;0;L;;;;;N;;;;; 10387;UGARITIC LETTER ZETA;Lo;0;L;;;;;N;;;;; 10388;UGARITIC LETTER HOTA;Lo;0;L;;;;;N;;;;; 10389;UGARITIC LETTER TET;Lo;0;L;;;;;N;;;;; 1038A;UGARITIC LETTER YOD;Lo;0;L;;;;;N;;;;; 1038B;UGARITIC LETTER KAF;Lo;0;L;;;;;N;;;;; 1038C;UGARITIC LETTER SHIN;Lo;0;L;;;;;N;;;;; 1038D;UGARITIC LETTER LAMDA;Lo;0;L;;;;;N;;;;; 1038E;UGARITIC LETTER MEM;Lo;0;L;;;;;N;;;;; 1038F;UGARITIC LETTER DHAL;Lo;0;L;;;;;N;;;;; 10390;UGARITIC LETTER NUN;Lo;0;L;;;;;N;;;;; 10391;UGARITIC LETTER ZU;Lo;0;L;;;;;N;;;;; 10392;UGARITIC LETTER SAMKA;Lo;0;L;;;;;N;;;;; 10393;UGARITIC LETTER AIN;Lo;0;L;;;;;N;;;;; 10394;UGARITIC LETTER PU;Lo;0;L;;;;;N;;;;; 10395;UGARITIC LETTER SADE;Lo;0;L;;;;;N;;;;; 10396;UGARITIC LETTER QOPA;Lo;0;L;;;;;N;;;;; 10397;UGARITIC LETTER RASHA;Lo;0;L;;;;;N;;;;; 10398;UGARITIC LETTER THANNA;Lo;0;L;;;;;N;;;;; 10399;UGARITIC LETTER GHAIN;Lo;0;L;;;;;N;;;;; 1039A;UGARITIC LETTER TO;Lo;0;L;;;;;N;;;;; 1039B;UGARITIC LETTER I;Lo;0;L;;;;;N;;;;; 1039C;UGARITIC LETTER U;Lo;0;L;;;;;N;;;;; 1039D;UGARITIC LETTER SSU;Lo;0;L;;;;;N;;;;; 1039F;UGARITIC WORD DIVIDER;Po;0;L;;;;;N;;;;; 103A0;OLD PERSIAN SIGN A;Lo;0;L;;;;;N;;;;; 103A1;OLD PERSIAN SIGN I;Lo;0;L;;;;;N;;;;; 103A2;OLD PERSIAN SIGN U;Lo;0;L;;;;;N;;;;; 103A3;OLD PERSIAN SIGN KA;Lo;0;L;;;;;N;;;;; 103A4;OLD PERSIAN SIGN KU;Lo;0;L;;;;;N;;;;; 103A5;OLD PERSIAN SIGN GA;Lo;0;L;;;;;N;;;;; 103A6;OLD PERSIAN SIGN GU;Lo;0;L;;;;;N;;;;; 103A7;OLD PERSIAN SIGN XA;Lo;0;L;;;;;N;;;;; 103A8;OLD PERSIAN SIGN CA;Lo;0;L;;;;;N;;;;; 103A9;OLD PERSIAN SIGN JA;Lo;0;L;;;;;N;;;;; 103AA;OLD PERSIAN SIGN JI;Lo;0;L;;;;;N;;;;; 103AB;OLD PERSIAN SIGN TA;Lo;0;L;;;;;N;;;;; 103AC;OLD PERSIAN SIGN TU;Lo;0;L;;;;;N;;;;; 103AD;OLD PERSIAN SIGN DA;Lo;0;L;;;;;N;;;;; 103AE;OLD PERSIAN SIGN DI;Lo;0;L;;;;;N;;;;; 103AF;OLD PERSIAN SIGN DU;Lo;0;L;;;;;N;;;;; 103B0;OLD PERSIAN SIGN THA;Lo;0;L;;;;;N;;;;; 103B1;OLD PERSIAN SIGN PA;Lo;0;L;;;;;N;;;;; 103B2;OLD PERSIAN SIGN BA;Lo;0;L;;;;;N;;;;; 103B3;OLD PERSIAN SIGN FA;Lo;0;L;;;;;N;;;;; 103B4;OLD PERSIAN SIGN NA;Lo;0;L;;;;;N;;;;; 103B5;OLD PERSIAN SIGN NU;Lo;0;L;;;;;N;;;;; 103B6;OLD PERSIAN SIGN MA;Lo;0;L;;;;;N;;;;; 103B7;OLD PERSIAN SIGN MI;Lo;0;L;;;;;N;;;;; 103B8;OLD PERSIAN SIGN MU;Lo;0;L;;;;;N;;;;; 103B9;OLD PERSIAN SIGN YA;Lo;0;L;;;;;N;;;;; 103BA;OLD PERSIAN SIGN VA;Lo;0;L;;;;;N;;;;; 103BB;OLD PERSIAN SIGN VI;Lo;0;L;;;;;N;;;;; 103BC;OLD PERSIAN SIGN RA;Lo;0;L;;;;;N;;;;; 103BD;OLD PERSIAN SIGN RU;Lo;0;L;;;;;N;;;;; 103BE;OLD PERSIAN SIGN LA;Lo;0;L;;;;;N;;;;; 103BF;OLD PERSIAN SIGN SA;Lo;0;L;;;;;N;;;;; 103C0;OLD PERSIAN SIGN ZA;Lo;0;L;;;;;N;;;;; 103C1;OLD PERSIAN SIGN SHA;Lo;0;L;;;;;N;;;;; 103C2;OLD PERSIAN SIGN SSA;Lo;0;L;;;;;N;;;;; 103C3;OLD PERSIAN SIGN HA;Lo;0;L;;;;;N;;;;; 103C8;OLD PERSIAN SIGN AURAMAZDAA;Lo;0;L;;;;;N;;;;; 103C9;OLD PERSIAN SIGN AURAMAZDAA-2;Lo;0;L;;;;;N;;;;; 103CA;OLD PERSIAN SIGN AURAMAZDAAHA;Lo;0;L;;;;;N;;;;; 103CB;OLD PERSIAN SIGN XSHAAYATHIYA;Lo;0;L;;;;;N;;;;; 103CC;OLD PERSIAN SIGN DAHYAAUSH;Lo;0;L;;;;;N;;;;; 103CD;OLD PERSIAN SIGN DAHYAAUSH-2;Lo;0;L;;;;;N;;;;; 103CE;OLD PERSIAN SIGN BAGA;Lo;0;L;;;;;N;;;;; 103CF;OLD PERSIAN SIGN BUUMISH;Lo;0;L;;;;;N;;;;; 103D0;OLD PERSIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; 103D1;OLD PERSIAN NUMBER ONE;Nl;0;L;;;;1;N;;;;; 103D2;OLD PERSIAN NUMBER TWO;Nl;0;L;;;;2;N;;;;; 103D3;OLD PERSIAN NUMBER TEN;Nl;0;L;;;;10;N;;;;; 103D4;OLD PERSIAN NUMBER TWENTY;Nl;0;L;;;;20;N;;;;; 103D5;OLD PERSIAN NUMBER HUNDRED;Nl;0;L;;;;100;N;;;;; 10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428; 10401;DESERET CAPITAL LETTER LONG E;Lu;0;L;;;;;N;;;;10429; 10402;DESERET CAPITAL LETTER LONG A;Lu;0;L;;;;;N;;;;1042A; 10403;DESERET CAPITAL LETTER LONG AH;Lu;0;L;;;;;N;;;;1042B; 10404;DESERET CAPITAL LETTER LONG O;Lu;0;L;;;;;N;;;;1042C; 10405;DESERET CAPITAL LETTER LONG OO;Lu;0;L;;;;;N;;;;1042D; 10406;DESERET CAPITAL LETTER SHORT I;Lu;0;L;;;;;N;;;;1042E; 10407;DESERET CAPITAL LETTER SHORT E;Lu;0;L;;;;;N;;;;1042F; 10408;DESERET CAPITAL LETTER SHORT A;Lu;0;L;;;;;N;;;;10430; 10409;DESERET CAPITAL LETTER SHORT AH;Lu;0;L;;;;;N;;;;10431; 1040A;DESERET CAPITAL LETTER SHORT O;Lu;0;L;;;;;N;;;;10432; 1040B;DESERET CAPITAL LETTER SHORT OO;Lu;0;L;;;;;N;;;;10433; 1040C;DESERET CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;10434; 1040D;DESERET CAPITAL LETTER OW;Lu;0;L;;;;;N;;;;10435; 1040E;DESERET CAPITAL LETTER WU;Lu;0;L;;;;;N;;;;10436; 1040F;DESERET CAPITAL LETTER YEE;Lu;0;L;;;;;N;;;;10437; 10410;DESERET CAPITAL LETTER H;Lu;0;L;;;;;N;;;;10438; 10411;DESERET CAPITAL LETTER PEE;Lu;0;L;;;;;N;;;;10439; 10412;DESERET CAPITAL LETTER BEE;Lu;0;L;;;;;N;;;;1043A; 10413;DESERET CAPITAL LETTER TEE;Lu;0;L;;;;;N;;;;1043B; 10414;DESERET CAPITAL LETTER DEE;Lu;0;L;;;;;N;;;;1043C; 10415;DESERET CAPITAL LETTER CHEE;Lu;0;L;;;;;N;;;;1043D; 10416;DESERET CAPITAL LETTER JEE;Lu;0;L;;;;;N;;;;1043E; 10417;DESERET CAPITAL LETTER KAY;Lu;0;L;;;;;N;;;;1043F; 10418;DESERET CAPITAL LETTER GAY;Lu;0;L;;;;;N;;;;10440; 10419;DESERET CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;10441; 1041A;DESERET CAPITAL LETTER VEE;Lu;0;L;;;;;N;;;;10442; 1041B;DESERET CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;10443; 1041C;DESERET CAPITAL LETTER THEE;Lu;0;L;;;;;N;;;;10444; 1041D;DESERET CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;10445; 1041E;DESERET CAPITAL LETTER ZEE;Lu;0;L;;;;;N;;;;10446; 1041F;DESERET CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;10447; 10420;DESERET CAPITAL LETTER ZHEE;Lu;0;L;;;;;N;;;;10448; 10421;DESERET CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;10449; 10422;DESERET CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;1044A; 10423;DESERET CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;1044B; 10424;DESERET CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;1044C; 10425;DESERET CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;1044D; 10426;DESERET CAPITAL LETTER OI;Lu;0;L;;;;;N;;;;1044E; 10427;DESERET CAPITAL LETTER EW;Lu;0;L;;;;;N;;;;1044F; 10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400 10429;DESERET SMALL LETTER LONG E;Ll;0;L;;;;;N;;;10401;;10401 1042A;DESERET SMALL LETTER LONG A;Ll;0;L;;;;;N;;;10402;;10402 1042B;DESERET SMALL LETTER LONG AH;Ll;0;L;;;;;N;;;10403;;10403 1042C;DESERET SMALL LETTER LONG O;Ll;0;L;;;;;N;;;10404;;10404 1042D;DESERET SMALL LETTER LONG OO;Ll;0;L;;;;;N;;;10405;;10405 1042E;DESERET SMALL LETTER SHORT I;Ll;0;L;;;;;N;;;10406;;10406 1042F;DESERET SMALL LETTER SHORT E;Ll;0;L;;;;;N;;;10407;;10407 10430;DESERET SMALL LETTER SHORT A;Ll;0;L;;;;;N;;;10408;;10408 10431;DESERET SMALL LETTER SHORT AH;Ll;0;L;;;;;N;;;10409;;10409 10432;DESERET SMALL LETTER SHORT O;Ll;0;L;;;;;N;;;1040A;;1040A 10433;DESERET SMALL LETTER SHORT OO;Ll;0;L;;;;;N;;;1040B;;1040B 10434;DESERET SMALL LETTER AY;Ll;0;L;;;;;N;;;1040C;;1040C 10435;DESERET SMALL LETTER OW;Ll;0;L;;;;;N;;;1040D;;1040D 10436;DESERET SMALL LETTER WU;Ll;0;L;;;;;N;;;1040E;;1040E 10437;DESERET SMALL LETTER YEE;Ll;0;L;;;;;N;;;1040F;;1040F 10438;DESERET SMALL LETTER H;Ll;0;L;;;;;N;;;10410;;10410 10439;DESERET SMALL LETTER PEE;Ll;0;L;;;;;N;;;10411;;10411 1043A;DESERET SMALL LETTER BEE;Ll;0;L;;;;;N;;;10412;;10412 1043B;DESERET SMALL LETTER TEE;Ll;0;L;;;;;N;;;10413;;10413 1043C;DESERET SMALL LETTER DEE;Ll;0;L;;;;;N;;;10414;;10414 1043D;DESERET SMALL LETTER CHEE;Ll;0;L;;;;;N;;;10415;;10415 1043E;DESERET SMALL LETTER JEE;Ll;0;L;;;;;N;;;10416;;10416 1043F;DESERET SMALL LETTER KAY;Ll;0;L;;;;;N;;;10417;;10417 10440;DESERET SMALL LETTER GAY;Ll;0;L;;;;;N;;;10418;;10418 10441;DESERET SMALL LETTER EF;Ll;0;L;;;;;N;;;10419;;10419 10442;DESERET SMALL LETTER VEE;Ll;0;L;;;;;N;;;1041A;;1041A 10443;DESERET SMALL LETTER ETH;Ll;0;L;;;;;N;;;1041B;;1041B 10444;DESERET SMALL LETTER THEE;Ll;0;L;;;;;N;;;1041C;;1041C 10445;DESERET SMALL LETTER ES;Ll;0;L;;;;;N;;;1041D;;1041D 10446;DESERET SMALL LETTER ZEE;Ll;0;L;;;;;N;;;1041E;;1041E 10447;DESERET SMALL LETTER ESH;Ll;0;L;;;;;N;;;1041F;;1041F 10448;DESERET SMALL LETTER ZHEE;Ll;0;L;;;;;N;;;10420;;10420 10449;DESERET SMALL LETTER ER;Ll;0;L;;;;;N;;;10421;;10421 1044A;DESERET SMALL LETTER EL;Ll;0;L;;;;;N;;;10422;;10422 1044B;DESERET SMALL LETTER EM;Ll;0;L;;;;;N;;;10423;;10423 1044C;DESERET SMALL LETTER EN;Ll;0;L;;;;;N;;;10424;;10424 1044D;DESERET SMALL LETTER ENG;Ll;0;L;;;;;N;;;10425;;10425 1044E;DESERET SMALL LETTER OI;Ll;0;L;;;;;N;;;10426;;10426 1044F;DESERET SMALL LETTER EW;Ll;0;L;;;;;N;;;10427;;10427 10450;SHAVIAN LETTER PEEP;Lo;0;L;;;;;N;;;;; 10451;SHAVIAN LETTER TOT;Lo;0;L;;;;;N;;;;; 10452;SHAVIAN LETTER KICK;Lo;0;L;;;;;N;;;;; 10453;SHAVIAN LETTER FEE;Lo;0;L;;;;;N;;;;; 10454;SHAVIAN LETTER THIGH;Lo;0;L;;;;;N;;;;; 10455;SHAVIAN LETTER SO;Lo;0;L;;;;;N;;;;; 10456;SHAVIAN LETTER SURE;Lo;0;L;;;;;N;;;;; 10457;SHAVIAN LETTER CHURCH;Lo;0;L;;;;;N;;;;; 10458;SHAVIAN LETTER YEA;Lo;0;L;;;;;N;;;;; 10459;SHAVIAN LETTER HUNG;Lo;0;L;;;;;N;;;;; 1045A;SHAVIAN LETTER BIB;Lo;0;L;;;;;N;;;;; 1045B;SHAVIAN LETTER DEAD;Lo;0;L;;;;;N;;;;; 1045C;SHAVIAN LETTER GAG;Lo;0;L;;;;;N;;;;; 1045D;SHAVIAN LETTER VOW;Lo;0;L;;;;;N;;;;; 1045E;SHAVIAN LETTER THEY;Lo;0;L;;;;;N;;;;; 1045F;SHAVIAN LETTER ZOO;Lo;0;L;;;;;N;;;;; 10460;SHAVIAN LETTER MEASURE;Lo;0;L;;;;;N;;;;; 10461;SHAVIAN LETTER JUDGE;Lo;0;L;;;;;N;;;;; 10462;SHAVIAN LETTER WOE;Lo;0;L;;;;;N;;;;; 10463;SHAVIAN LETTER HA-HA;Lo;0;L;;;;;N;;;;; 10464;SHAVIAN LETTER LOLL;Lo;0;L;;;;;N;;;;; 10465;SHAVIAN LETTER MIME;Lo;0;L;;;;;N;;;;; 10466;SHAVIAN LETTER IF;Lo;0;L;;;;;N;;;;; 10467;SHAVIAN LETTER EGG;Lo;0;L;;;;;N;;;;; 10468;SHAVIAN LETTER ASH;Lo;0;L;;;;;N;;;;; 10469;SHAVIAN LETTER ADO;Lo;0;L;;;;;N;;;;; 1046A;SHAVIAN LETTER ON;Lo;0;L;;;;;N;;;;; 1046B;SHAVIAN LETTER WOOL;Lo;0;L;;;;;N;;;;; 1046C;SHAVIAN LETTER OUT;Lo;0;L;;;;;N;;;;; 1046D;SHAVIAN LETTER AH;Lo;0;L;;;;;N;;;;; 1046E;SHAVIAN LETTER ROAR;Lo;0;L;;;;;N;;;;; 1046F;SHAVIAN LETTER NUN;Lo;0;L;;;;;N;;;;; 10470;SHAVIAN LETTER EAT;Lo;0;L;;;;;N;;;;; 10471;SHAVIAN LETTER AGE;Lo;0;L;;;;;N;;;;; 10472;SHAVIAN LETTER ICE;Lo;0;L;;;;;N;;;;; 10473;SHAVIAN LETTER UP;Lo;0;L;;;;;N;;;;; 10474;SHAVIAN LETTER OAK;Lo;0;L;;;;;N;;;;; 10475;SHAVIAN LETTER OOZE;Lo;0;L;;;;;N;;;;; 10476;SHAVIAN LETTER OIL;Lo;0;L;;;;;N;;;;; 10477;SHAVIAN LETTER AWE;Lo;0;L;;;;;N;;;;; 10478;SHAVIAN LETTER ARE;Lo;0;L;;;;;N;;;;; 10479;SHAVIAN LETTER OR;Lo;0;L;;;;;N;;;;; 1047A;SHAVIAN LETTER AIR;Lo;0;L;;;;;N;;;;; 1047B;SHAVIAN LETTER ERR;Lo;0;L;;;;;N;;;;; 1047C;SHAVIAN LETTER ARRAY;Lo;0;L;;;;;N;;;;; 1047D;SHAVIAN LETTER EAR;Lo;0;L;;;;;N;;;;; 1047E;SHAVIAN LETTER IAN;Lo;0;L;;;;;N;;;;; 1047F;SHAVIAN LETTER YEW;Lo;0;L;;;;;N;;;;; 10480;OSMANYA LETTER ALEF;Lo;0;L;;;;;N;;;;; 10481;OSMANYA LETTER BA;Lo;0;L;;;;;N;;;;; 10482;OSMANYA LETTER TA;Lo;0;L;;;;;N;;;;; 10483;OSMANYA LETTER JA;Lo;0;L;;;;;N;;;;; 10484;OSMANYA LETTER XA;Lo;0;L;;;;;N;;;;; 10485;OSMANYA LETTER KHA;Lo;0;L;;;;;N;;;;; 10486;OSMANYA LETTER DEEL;Lo;0;L;;;;;N;;;;; 10487;OSMANYA LETTER RA;Lo;0;L;;;;;N;;;;; 10488;OSMANYA LETTER SA;Lo;0;L;;;;;N;;;;; 10489;OSMANYA LETTER SHIIN;Lo;0;L;;;;;N;;;;; 1048A;OSMANYA LETTER DHA;Lo;0;L;;;;;N;;;;; 1048B;OSMANYA LETTER CAYN;Lo;0;L;;;;;N;;;;; 1048C;OSMANYA LETTER GA;Lo;0;L;;;;;N;;;;; 1048D;OSMANYA LETTER FA;Lo;0;L;;;;;N;;;;; 1048E;OSMANYA LETTER QAAF;Lo;0;L;;;;;N;;;;; 1048F;OSMANYA LETTER KAAF;Lo;0;L;;;;;N;;;;; 10490;OSMANYA LETTER LAAN;Lo;0;L;;;;;N;;;;; 10491;OSMANYA LETTER MIIN;Lo;0;L;;;;;N;;;;; 10492;OSMANYA LETTER NUUN;Lo;0;L;;;;;N;;;;; 10493;OSMANYA LETTER WAW;Lo;0;L;;;;;N;;;;; 10494;OSMANYA LETTER HA;Lo;0;L;;;;;N;;;;; 10495;OSMANYA LETTER YA;Lo;0;L;;;;;N;;;;; 10496;OSMANYA LETTER A;Lo;0;L;;;;;N;;;;; 10497;OSMANYA LETTER E;Lo;0;L;;;;;N;;;;; 10498;OSMANYA LETTER I;Lo;0;L;;;;;N;;;;; 10499;OSMANYA LETTER O;Lo;0;L;;;;;N;;;;; 1049A;OSMANYA LETTER U;Lo;0;L;;;;;N;;;;; 1049B;OSMANYA LETTER AA;Lo;0;L;;;;;N;;;;; 1049C;OSMANYA LETTER EE;Lo;0;L;;;;;N;;;;; 1049D;OSMANYA LETTER OO;Lo;0;L;;;;;N;;;;; 104A0;OSMANYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 104A1;OSMANYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 104A2;OSMANYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 104A3;OSMANYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 104A4;OSMANYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 104A5;OSMANYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 104A6;OSMANYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 104A7;OSMANYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 104A8;OSMANYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 104A9;OSMANYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 104B0;OSAGE CAPITAL LETTER A;Lu;0;L;;;;;N;;;;104D8; 104B1;OSAGE CAPITAL LETTER AI;Lu;0;L;;;;;N;;;;104D9; 104B2;OSAGE CAPITAL LETTER AIN;Lu;0;L;;;;;N;;;;104DA; 104B3;OSAGE CAPITAL LETTER AH;Lu;0;L;;;;;N;;;;104DB; 104B4;OSAGE CAPITAL LETTER BRA;Lu;0;L;;;;;N;;;;104DC; 104B5;OSAGE CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;104DD; 104B6;OSAGE CAPITAL LETTER EHCHA;Lu;0;L;;;;;N;;;;104DE; 104B7;OSAGE CAPITAL LETTER E;Lu;0;L;;;;;N;;;;104DF; 104B8;OSAGE CAPITAL LETTER EIN;Lu;0;L;;;;;N;;;;104E0; 104B9;OSAGE CAPITAL LETTER HA;Lu;0;L;;;;;N;;;;104E1; 104BA;OSAGE CAPITAL LETTER HYA;Lu;0;L;;;;;N;;;;104E2; 104BB;OSAGE CAPITAL LETTER I;Lu;0;L;;;;;N;;;;104E3; 104BC;OSAGE CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;104E4; 104BD;OSAGE CAPITAL LETTER EHKA;Lu;0;L;;;;;N;;;;104E5; 104BE;OSAGE CAPITAL LETTER KYA;Lu;0;L;;;;;N;;;;104E6; 104BF;OSAGE CAPITAL LETTER LA;Lu;0;L;;;;;N;;;;104E7; 104C0;OSAGE CAPITAL LETTER MA;Lu;0;L;;;;;N;;;;104E8; 104C1;OSAGE CAPITAL LETTER NA;Lu;0;L;;;;;N;;;;104E9; 104C2;OSAGE CAPITAL LETTER O;Lu;0;L;;;;;N;;;;104EA; 104C3;OSAGE CAPITAL LETTER OIN;Lu;0;L;;;;;N;;;;104EB; 104C4;OSAGE CAPITAL LETTER PA;Lu;0;L;;;;;N;;;;104EC; 104C5;OSAGE CAPITAL LETTER EHPA;Lu;0;L;;;;;N;;;;104ED; 104C6;OSAGE CAPITAL LETTER SA;Lu;0;L;;;;;N;;;;104EE; 104C7;OSAGE CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;104EF; 104C8;OSAGE CAPITAL LETTER TA;Lu;0;L;;;;;N;;;;104F0; 104C9;OSAGE CAPITAL LETTER EHTA;Lu;0;L;;;;;N;;;;104F1; 104CA;OSAGE CAPITAL LETTER TSA;Lu;0;L;;;;;N;;;;104F2; 104CB;OSAGE CAPITAL LETTER EHTSA;Lu;0;L;;;;;N;;;;104F3; 104CC;OSAGE CAPITAL LETTER TSHA;Lu;0;L;;;;;N;;;;104F4; 104CD;OSAGE CAPITAL LETTER DHA;Lu;0;L;;;;;N;;;;104F5; 104CE;OSAGE CAPITAL LETTER U;Lu;0;L;;;;;N;;;;104F6; 104CF;OSAGE CAPITAL LETTER WA;Lu;0;L;;;;;N;;;;104F7; 104D0;OSAGE CAPITAL LETTER KHA;Lu;0;L;;;;;N;;;;104F8; 104D1;OSAGE CAPITAL LETTER GHA;Lu;0;L;;;;;N;;;;104F9; 104D2;OSAGE CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;104FA; 104D3;OSAGE CAPITAL LETTER ZHA;Lu;0;L;;;;;N;;;;104FB; 104D8;OSAGE SMALL LETTER A;Ll;0;L;;;;;N;;;104B0;;104B0 104D9;OSAGE SMALL LETTER AI;Ll;0;L;;;;;N;;;104B1;;104B1 104DA;OSAGE SMALL LETTER AIN;Ll;0;L;;;;;N;;;104B2;;104B2 104DB;OSAGE SMALL LETTER AH;Ll;0;L;;;;;N;;;104B3;;104B3 104DC;OSAGE SMALL LETTER BRA;Ll;0;L;;;;;N;;;104B4;;104B4 104DD;OSAGE SMALL LETTER CHA;Ll;0;L;;;;;N;;;104B5;;104B5 104DE;OSAGE SMALL LETTER EHCHA;Ll;0;L;;;;;N;;;104B6;;104B6 104DF;OSAGE SMALL LETTER E;Ll;0;L;;;;;N;;;104B7;;104B7 104E0;OSAGE SMALL LETTER EIN;Ll;0;L;;;;;N;;;104B8;;104B8 104E1;OSAGE SMALL LETTER HA;Ll;0;L;;;;;N;;;104B9;;104B9 104E2;OSAGE SMALL LETTER HYA;Ll;0;L;;;;;N;;;104BA;;104BA 104E3;OSAGE SMALL LETTER I;Ll;0;L;;;;;N;;;104BB;;104BB 104E4;OSAGE SMALL LETTER KA;Ll;0;L;;;;;N;;;104BC;;104BC 104E5;OSAGE SMALL LETTER EHKA;Ll;0;L;;;;;N;;;104BD;;104BD 104E6;OSAGE SMALL LETTER KYA;Ll;0;L;;;;;N;;;104BE;;104BE 104E7;OSAGE SMALL LETTER LA;Ll;0;L;;;;;N;;;104BF;;104BF 104E8;OSAGE SMALL LETTER MA;Ll;0;L;;;;;N;;;104C0;;104C0 104E9;OSAGE SMALL LETTER NA;Ll;0;L;;;;;N;;;104C1;;104C1 104EA;OSAGE SMALL LETTER O;Ll;0;L;;;;;N;;;104C2;;104C2 104EB;OSAGE SMALL LETTER OIN;Ll;0;L;;;;;N;;;104C3;;104C3 104EC;OSAGE SMALL LETTER PA;Ll;0;L;;;;;N;;;104C4;;104C4 104ED;OSAGE SMALL LETTER EHPA;Ll;0;L;;;;;N;;;104C5;;104C5 104EE;OSAGE SMALL LETTER SA;Ll;0;L;;;;;N;;;104C6;;104C6 104EF;OSAGE SMALL LETTER SHA;Ll;0;L;;;;;N;;;104C7;;104C7 104F0;OSAGE SMALL LETTER TA;Ll;0;L;;;;;N;;;104C8;;104C8 104F1;OSAGE SMALL LETTER EHTA;Ll;0;L;;;;;N;;;104C9;;104C9 104F2;OSAGE SMALL LETTER TSA;Ll;0;L;;;;;N;;;104CA;;104CA 104F3;OSAGE SMALL LETTER EHTSA;Ll;0;L;;;;;N;;;104CB;;104CB 104F4;OSAGE SMALL LETTER TSHA;Ll;0;L;;;;;N;;;104CC;;104CC 104F5;OSAGE SMALL LETTER DHA;Ll;0;L;;;;;N;;;104CD;;104CD 104F6;OSAGE SMALL LETTER U;Ll;0;L;;;;;N;;;104CE;;104CE 104F7;OSAGE SMALL LETTER WA;Ll;0;L;;;;;N;;;104CF;;104CF 104F8;OSAGE SMALL LETTER KHA;Ll;0;L;;;;;N;;;104D0;;104D0 104F9;OSAGE SMALL LETTER GHA;Ll;0;L;;;;;N;;;104D1;;104D1 104FA;OSAGE SMALL LETTER ZA;Ll;0;L;;;;;N;;;104D2;;104D2 104FB;OSAGE SMALL LETTER ZHA;Ll;0;L;;;;;N;;;104D3;;104D3 10500;ELBASAN LETTER A;Lo;0;L;;;;;N;;;;; 10501;ELBASAN LETTER BE;Lo;0;L;;;;;N;;;;; 10502;ELBASAN LETTER CE;Lo;0;L;;;;;N;;;;; 10503;ELBASAN LETTER CHE;Lo;0;L;;;;;N;;;;; 10504;ELBASAN LETTER DE;Lo;0;L;;;;;N;;;;; 10505;ELBASAN LETTER NDE;Lo;0;L;;;;;N;;;;; 10506;ELBASAN LETTER DHE;Lo;0;L;;;;;N;;;;; 10507;ELBASAN LETTER EI;Lo;0;L;;;;;N;;;;; 10508;ELBASAN LETTER E;Lo;0;L;;;;;N;;;;; 10509;ELBASAN LETTER FE;Lo;0;L;;;;;N;;;;; 1050A;ELBASAN LETTER GE;Lo;0;L;;;;;N;;;;; 1050B;ELBASAN LETTER GJE;Lo;0;L;;;;;N;;;;; 1050C;ELBASAN LETTER HE;Lo;0;L;;;;;N;;;;; 1050D;ELBASAN LETTER I;Lo;0;L;;;;;N;;;;; 1050E;ELBASAN LETTER JE;Lo;0;L;;;;;N;;;;; 1050F;ELBASAN LETTER KE;Lo;0;L;;;;;N;;;;; 10510;ELBASAN LETTER LE;Lo;0;L;;;;;N;;;;; 10511;ELBASAN LETTER LLE;Lo;0;L;;;;;N;;;;; 10512;ELBASAN LETTER ME;Lo;0;L;;;;;N;;;;; 10513;ELBASAN LETTER NE;Lo;0;L;;;;;N;;;;; 10514;ELBASAN LETTER NA;Lo;0;L;;;;;N;;;;; 10515;ELBASAN LETTER NJE;Lo;0;L;;;;;N;;;;; 10516;ELBASAN LETTER O;Lo;0;L;;;;;N;;;;; 10517;ELBASAN LETTER PE;Lo;0;L;;;;;N;;;;; 10518;ELBASAN LETTER QE;Lo;0;L;;;;;N;;;;; 10519;ELBASAN LETTER RE;Lo;0;L;;;;;N;;;;; 1051A;ELBASAN LETTER RRE;Lo;0;L;;;;;N;;;;; 1051B;ELBASAN LETTER SE;Lo;0;L;;;;;N;;;;; 1051C;ELBASAN LETTER SHE;Lo;0;L;;;;;N;;;;; 1051D;ELBASAN LETTER TE;Lo;0;L;;;;;N;;;;; 1051E;ELBASAN LETTER THE;Lo;0;L;;;;;N;;;;; 1051F;ELBASAN LETTER U;Lo;0;L;;;;;N;;;;; 10520;ELBASAN LETTER VE;Lo;0;L;;;;;N;;;;; 10521;ELBASAN LETTER XE;Lo;0;L;;;;;N;;;;; 10522;ELBASAN LETTER Y;Lo;0;L;;;;;N;;;;; 10523;ELBASAN LETTER ZE;Lo;0;L;;;;;N;;;;; 10524;ELBASAN LETTER ZHE;Lo;0;L;;;;;N;;;;; 10525;ELBASAN LETTER GHE;Lo;0;L;;;;;N;;;;; 10526;ELBASAN LETTER GHAMMA;Lo;0;L;;;;;N;;;;; 10527;ELBASAN LETTER KHE;Lo;0;L;;;;;N;;;;; 10530;CAUCASIAN ALBANIAN LETTER ALT;Lo;0;L;;;;;N;;;;; 10531;CAUCASIAN ALBANIAN LETTER BET;Lo;0;L;;;;;N;;;;; 10532;CAUCASIAN ALBANIAN LETTER GIM;Lo;0;L;;;;;N;;;;; 10533;CAUCASIAN ALBANIAN LETTER DAT;Lo;0;L;;;;;N;;;;; 10534;CAUCASIAN ALBANIAN LETTER EB;Lo;0;L;;;;;N;;;;; 10535;CAUCASIAN ALBANIAN LETTER ZARL;Lo;0;L;;;;;N;;;;; 10536;CAUCASIAN ALBANIAN LETTER EYN;Lo;0;L;;;;;N;;;;; 10537;CAUCASIAN ALBANIAN LETTER ZHIL;Lo;0;L;;;;;N;;;;; 10538;CAUCASIAN ALBANIAN LETTER TAS;Lo;0;L;;;;;N;;;;; 10539;CAUCASIAN ALBANIAN LETTER CHA;Lo;0;L;;;;;N;;;;; 1053A;CAUCASIAN ALBANIAN LETTER YOWD;Lo;0;L;;;;;N;;;;; 1053B;CAUCASIAN ALBANIAN LETTER ZHA;Lo;0;L;;;;;N;;;;; 1053C;CAUCASIAN ALBANIAN LETTER IRB;Lo;0;L;;;;;N;;;;; 1053D;CAUCASIAN ALBANIAN LETTER SHA;Lo;0;L;;;;;N;;;;; 1053E;CAUCASIAN ALBANIAN LETTER LAN;Lo;0;L;;;;;N;;;;; 1053F;CAUCASIAN ALBANIAN LETTER INYA;Lo;0;L;;;;;N;;;;; 10540;CAUCASIAN ALBANIAN LETTER XEYN;Lo;0;L;;;;;N;;;;; 10541;CAUCASIAN ALBANIAN LETTER DYAN;Lo;0;L;;;;;N;;;;; 10542;CAUCASIAN ALBANIAN LETTER CAR;Lo;0;L;;;;;N;;;;; 10543;CAUCASIAN ALBANIAN LETTER JHOX;Lo;0;L;;;;;N;;;;; 10544;CAUCASIAN ALBANIAN LETTER KAR;Lo;0;L;;;;;N;;;;; 10545;CAUCASIAN ALBANIAN LETTER LYIT;Lo;0;L;;;;;N;;;;; 10546;CAUCASIAN ALBANIAN LETTER HEYT;Lo;0;L;;;;;N;;;;; 10547;CAUCASIAN ALBANIAN LETTER QAY;Lo;0;L;;;;;N;;;;; 10548;CAUCASIAN ALBANIAN LETTER AOR;Lo;0;L;;;;;N;;;;; 10549;CAUCASIAN ALBANIAN LETTER CHOY;Lo;0;L;;;;;N;;;;; 1054A;CAUCASIAN ALBANIAN LETTER CHI;Lo;0;L;;;;;N;;;;; 1054B;CAUCASIAN ALBANIAN LETTER CYAY;Lo;0;L;;;;;N;;;;; 1054C;CAUCASIAN ALBANIAN LETTER MAQ;Lo;0;L;;;;;N;;;;; 1054D;CAUCASIAN ALBANIAN LETTER QAR;Lo;0;L;;;;;N;;;;; 1054E;CAUCASIAN ALBANIAN LETTER NOWC;Lo;0;L;;;;;N;;;;; 1054F;CAUCASIAN ALBANIAN LETTER DZYAY;Lo;0;L;;;;;N;;;;; 10550;CAUCASIAN ALBANIAN LETTER SHAK;Lo;0;L;;;;;N;;;;; 10551;CAUCASIAN ALBANIAN LETTER JAYN;Lo;0;L;;;;;N;;;;; 10552;CAUCASIAN ALBANIAN LETTER ON;Lo;0;L;;;;;N;;;;; 10553;CAUCASIAN ALBANIAN LETTER TYAY;Lo;0;L;;;;;N;;;;; 10554;CAUCASIAN ALBANIAN LETTER FAM;Lo;0;L;;;;;N;;;;; 10555;CAUCASIAN ALBANIAN LETTER DZAY;Lo;0;L;;;;;N;;;;; 10556;CAUCASIAN ALBANIAN LETTER CHAT;Lo;0;L;;;;;N;;;;; 10557;CAUCASIAN ALBANIAN LETTER PEN;Lo;0;L;;;;;N;;;;; 10558;CAUCASIAN ALBANIAN LETTER GHEYS;Lo;0;L;;;;;N;;;;; 10559;CAUCASIAN ALBANIAN LETTER RAT;Lo;0;L;;;;;N;;;;; 1055A;CAUCASIAN ALBANIAN LETTER SEYK;Lo;0;L;;;;;N;;;;; 1055B;CAUCASIAN ALBANIAN LETTER VEYZ;Lo;0;L;;;;;N;;;;; 1055C;CAUCASIAN ALBANIAN LETTER TIWR;Lo;0;L;;;;;N;;;;; 1055D;CAUCASIAN ALBANIAN LETTER SHOY;Lo;0;L;;;;;N;;;;; 1055E;CAUCASIAN ALBANIAN LETTER IWN;Lo;0;L;;;;;N;;;;; 1055F;CAUCASIAN ALBANIAN LETTER CYAW;Lo;0;L;;;;;N;;;;; 10560;CAUCASIAN ALBANIAN LETTER CAYN;Lo;0;L;;;;;N;;;;; 10561;CAUCASIAN ALBANIAN LETTER YAYD;Lo;0;L;;;;;N;;;;; 10562;CAUCASIAN ALBANIAN LETTER PIWR;Lo;0;L;;;;;N;;;;; 10563;CAUCASIAN ALBANIAN LETTER KIW;Lo;0;L;;;;;N;;;;; 1056F;CAUCASIAN ALBANIAN CITATION MARK;Po;0;L;;;;;N;;;;; 10600;LINEAR A SIGN AB001;Lo;0;L;;;;;N;;;;; 10601;LINEAR A SIGN AB002;Lo;0;L;;;;;N;;;;; 10602;LINEAR A SIGN AB003;Lo;0;L;;;;;N;;;;; 10603;LINEAR A SIGN AB004;Lo;0;L;;;;;N;;;;; 10604;LINEAR A SIGN AB005;Lo;0;L;;;;;N;;;;; 10605;LINEAR A SIGN AB006;Lo;0;L;;;;;N;;;;; 10606;LINEAR A SIGN AB007;Lo;0;L;;;;;N;;;;; 10607;LINEAR A SIGN AB008;Lo;0;L;;;;;N;;;;; 10608;LINEAR A SIGN AB009;Lo;0;L;;;;;N;;;;; 10609;LINEAR A SIGN AB010;Lo;0;L;;;;;N;;;;; 1060A;LINEAR A SIGN AB011;Lo;0;L;;;;;N;;;;; 1060B;LINEAR A SIGN AB013;Lo;0;L;;;;;N;;;;; 1060C;LINEAR A SIGN AB016;Lo;0;L;;;;;N;;;;; 1060D;LINEAR A SIGN AB017;Lo;0;L;;;;;N;;;;; 1060E;LINEAR A SIGN AB020;Lo;0;L;;;;;N;;;;; 1060F;LINEAR A SIGN AB021;Lo;0;L;;;;;N;;;;; 10610;LINEAR A SIGN AB021F;Lo;0;L;;;;;N;;;;; 10611;LINEAR A SIGN AB021M;Lo;0;L;;;;;N;;;;; 10612;LINEAR A SIGN AB022;Lo;0;L;;;;;N;;;;; 10613;LINEAR A SIGN AB022F;Lo;0;L;;;;;N;;;;; 10614;LINEAR A SIGN AB022M;Lo;0;L;;;;;N;;;;; 10615;LINEAR A SIGN AB023;Lo;0;L;;;;;N;;;;; 10616;LINEAR A SIGN AB023M;Lo;0;L;;;;;N;;;;; 10617;LINEAR A SIGN AB024;Lo;0;L;;;;;N;;;;; 10618;LINEAR A SIGN AB026;Lo;0;L;;;;;N;;;;; 10619;LINEAR A SIGN AB027;Lo;0;L;;;;;N;;;;; 1061A;LINEAR A SIGN AB028;Lo;0;L;;;;;N;;;;; 1061B;LINEAR A SIGN A028B;Lo;0;L;;;;;N;;;;; 1061C;LINEAR A SIGN AB029;Lo;0;L;;;;;N;;;;; 1061D;LINEAR A SIGN AB030;Lo;0;L;;;;;N;;;;; 1061E;LINEAR A SIGN AB031;Lo;0;L;;;;;N;;;;; 1061F;LINEAR A SIGN AB034;Lo;0;L;;;;;N;;;;; 10620;LINEAR A SIGN AB037;Lo;0;L;;;;;N;;;;; 10621;LINEAR A SIGN AB038;Lo;0;L;;;;;N;;;;; 10622;LINEAR A SIGN AB039;Lo;0;L;;;;;N;;;;; 10623;LINEAR A SIGN AB040;Lo;0;L;;;;;N;;;;; 10624;LINEAR A SIGN AB041;Lo;0;L;;;;;N;;;;; 10625;LINEAR A SIGN AB044;Lo;0;L;;;;;N;;;;; 10626;LINEAR A SIGN AB045;Lo;0;L;;;;;N;;;;; 10627;LINEAR A SIGN AB046;Lo;0;L;;;;;N;;;;; 10628;LINEAR A SIGN AB047;Lo;0;L;;;;;N;;;;; 10629;LINEAR A SIGN AB048;Lo;0;L;;;;;N;;;;; 1062A;LINEAR A SIGN AB049;Lo;0;L;;;;;N;;;;; 1062B;LINEAR A SIGN AB050;Lo;0;L;;;;;N;;;;; 1062C;LINEAR A SIGN AB051;Lo;0;L;;;;;N;;;;; 1062D;LINEAR A SIGN AB053;Lo;0;L;;;;;N;;;;; 1062E;LINEAR A SIGN AB054;Lo;0;L;;;;;N;;;;; 1062F;LINEAR A SIGN AB055;Lo;0;L;;;;;N;;;;; 10630;LINEAR A SIGN AB056;Lo;0;L;;;;;N;;;;; 10631;LINEAR A SIGN AB057;Lo;0;L;;;;;N;;;;; 10632;LINEAR A SIGN AB058;Lo;0;L;;;;;N;;;;; 10633;LINEAR A SIGN AB059;Lo;0;L;;;;;N;;;;; 10634;LINEAR A SIGN AB060;Lo;0;L;;;;;N;;;;; 10635;LINEAR A SIGN AB061;Lo;0;L;;;;;N;;;;; 10636;LINEAR A SIGN AB065;Lo;0;L;;;;;N;;;;; 10637;LINEAR A SIGN AB066;Lo;0;L;;;;;N;;;;; 10638;LINEAR A SIGN AB067;Lo;0;L;;;;;N;;;;; 10639;LINEAR A SIGN AB069;Lo;0;L;;;;;N;;;;; 1063A;LINEAR A SIGN AB070;Lo;0;L;;;;;N;;;;; 1063B;LINEAR A SIGN AB073;Lo;0;L;;;;;N;;;;; 1063C;LINEAR A SIGN AB074;Lo;0;L;;;;;N;;;;; 1063D;LINEAR A SIGN AB076;Lo;0;L;;;;;N;;;;; 1063E;LINEAR A SIGN AB077;Lo;0;L;;;;;N;;;;; 1063F;LINEAR A SIGN AB078;Lo;0;L;;;;;N;;;;; 10640;LINEAR A SIGN AB079;Lo;0;L;;;;;N;;;;; 10641;LINEAR A SIGN AB080;Lo;0;L;;;;;N;;;;; 10642;LINEAR A SIGN AB081;Lo;0;L;;;;;N;;;;; 10643;LINEAR A SIGN AB082;Lo;0;L;;;;;N;;;;; 10644;LINEAR A SIGN AB085;Lo;0;L;;;;;N;;;;; 10645;LINEAR A SIGN AB086;Lo;0;L;;;;;N;;;;; 10646;LINEAR A SIGN AB087;Lo;0;L;;;;;N;;;;; 10647;LINEAR A SIGN A100-102;Lo;0;L;;;;;N;;;;; 10648;LINEAR A SIGN AB118;Lo;0;L;;;;;N;;;;; 10649;LINEAR A SIGN AB120;Lo;0;L;;;;;N;;;;; 1064A;LINEAR A SIGN A120B;Lo;0;L;;;;;N;;;;; 1064B;LINEAR A SIGN AB122;Lo;0;L;;;;;N;;;;; 1064C;LINEAR A SIGN AB123;Lo;0;L;;;;;N;;;;; 1064D;LINEAR A SIGN AB131A;Lo;0;L;;;;;N;;;;; 1064E;LINEAR A SIGN AB131B;Lo;0;L;;;;;N;;;;; 1064F;LINEAR A SIGN A131C;Lo;0;L;;;;;N;;;;; 10650;LINEAR A SIGN AB164;Lo;0;L;;;;;N;;;;; 10651;LINEAR A SIGN AB171;Lo;0;L;;;;;N;;;;; 10652;LINEAR A SIGN AB180;Lo;0;L;;;;;N;;;;; 10653;LINEAR A SIGN AB188;Lo;0;L;;;;;N;;;;; 10654;LINEAR A SIGN AB191;Lo;0;L;;;;;N;;;;; 10655;LINEAR A SIGN A301;Lo;0;L;;;;;N;;;;; 10656;LINEAR A SIGN A302;Lo;0;L;;;;;N;;;;; 10657;LINEAR A SIGN A303;Lo;0;L;;;;;N;;;;; 10658;LINEAR A SIGN A304;Lo;0;L;;;;;N;;;;; 10659;LINEAR A SIGN A305;Lo;0;L;;;;;N;;;;; 1065A;LINEAR A SIGN A306;Lo;0;L;;;;;N;;;;; 1065B;LINEAR A SIGN A307;Lo;0;L;;;;;N;;;;; 1065C;LINEAR A SIGN A308;Lo;0;L;;;;;N;;;;; 1065D;LINEAR A SIGN A309A;Lo;0;L;;;;;N;;;;; 1065E;LINEAR A SIGN A309B;Lo;0;L;;;;;N;;;;; 1065F;LINEAR A SIGN A309C;Lo;0;L;;;;;N;;;;; 10660;LINEAR A SIGN A310;Lo;0;L;;;;;N;;;;; 10661;LINEAR A SIGN A311;Lo;0;L;;;;;N;;;;; 10662;LINEAR A SIGN A312;Lo;0;L;;;;;N;;;;; 10663;LINEAR A SIGN A313A;Lo;0;L;;;;;N;;;;; 10664;LINEAR A SIGN A313B;Lo;0;L;;;;;N;;;;; 10665;LINEAR A SIGN A313C;Lo;0;L;;;;;N;;;;; 10666;LINEAR A SIGN A314;Lo;0;L;;;;;N;;;;; 10667;LINEAR A SIGN A315;Lo;0;L;;;;;N;;;;; 10668;LINEAR A SIGN A316;Lo;0;L;;;;;N;;;;; 10669;LINEAR A SIGN A317;Lo;0;L;;;;;N;;;;; 1066A;LINEAR A SIGN A318;Lo;0;L;;;;;N;;;;; 1066B;LINEAR A SIGN A319;Lo;0;L;;;;;N;;;;; 1066C;LINEAR A SIGN A320;Lo;0;L;;;;;N;;;;; 1066D;LINEAR A SIGN A321;Lo;0;L;;;;;N;;;;; 1066E;LINEAR A SIGN A322;Lo;0;L;;;;;N;;;;; 1066F;LINEAR A SIGN A323;Lo;0;L;;;;;N;;;;; 10670;LINEAR A SIGN A324;Lo;0;L;;;;;N;;;;; 10671;LINEAR A SIGN A325;Lo;0;L;;;;;N;;;;; 10672;LINEAR A SIGN A326;Lo;0;L;;;;;N;;;;; 10673;LINEAR A SIGN A327;Lo;0;L;;;;;N;;;;; 10674;LINEAR A SIGN A328;Lo;0;L;;;;;N;;;;; 10675;LINEAR A SIGN A329;Lo;0;L;;;;;N;;;;; 10676;LINEAR A SIGN A330;Lo;0;L;;;;;N;;;;; 10677;LINEAR A SIGN A331;Lo;0;L;;;;;N;;;;; 10678;LINEAR A SIGN A332;Lo;0;L;;;;;N;;;;; 10679;LINEAR A SIGN A333;Lo;0;L;;;;;N;;;;; 1067A;LINEAR A SIGN A334;Lo;0;L;;;;;N;;;;; 1067B;LINEAR A SIGN A335;Lo;0;L;;;;;N;;;;; 1067C;LINEAR A SIGN A336;Lo;0;L;;;;;N;;;;; 1067D;LINEAR A SIGN A337;Lo;0;L;;;;;N;;;;; 1067E;LINEAR A SIGN A338;Lo;0;L;;;;;N;;;;; 1067F;LINEAR A SIGN A339;Lo;0;L;;;;;N;;;;; 10680;LINEAR A SIGN A340;Lo;0;L;;;;;N;;;;; 10681;LINEAR A SIGN A341;Lo;0;L;;;;;N;;;;; 10682;LINEAR A SIGN A342;Lo;0;L;;;;;N;;;;; 10683;LINEAR A SIGN A343;Lo;0;L;;;;;N;;;;; 10684;LINEAR A SIGN A344;Lo;0;L;;;;;N;;;;; 10685;LINEAR A SIGN A345;Lo;0;L;;;;;N;;;;; 10686;LINEAR A SIGN A346;Lo;0;L;;;;;N;;;;; 10687;LINEAR A SIGN A347;Lo;0;L;;;;;N;;;;; 10688;LINEAR A SIGN A348;Lo;0;L;;;;;N;;;;; 10689;LINEAR A SIGN A349;Lo;0;L;;;;;N;;;;; 1068A;LINEAR A SIGN A350;Lo;0;L;;;;;N;;;;; 1068B;LINEAR A SIGN A351;Lo;0;L;;;;;N;;;;; 1068C;LINEAR A SIGN A352;Lo;0;L;;;;;N;;;;; 1068D;LINEAR A SIGN A353;Lo;0;L;;;;;N;;;;; 1068E;LINEAR A SIGN A354;Lo;0;L;;;;;N;;;;; 1068F;LINEAR A SIGN A355;Lo;0;L;;;;;N;;;;; 10690;LINEAR A SIGN A356;Lo;0;L;;;;;N;;;;; 10691;LINEAR A SIGN A357;Lo;0;L;;;;;N;;;;; 10692;LINEAR A SIGN A358;Lo;0;L;;;;;N;;;;; 10693;LINEAR A SIGN A359;Lo;0;L;;;;;N;;;;; 10694;LINEAR A SIGN A360;Lo;0;L;;;;;N;;;;; 10695;LINEAR A SIGN A361;Lo;0;L;;;;;N;;;;; 10696;LINEAR A SIGN A362;Lo;0;L;;;;;N;;;;; 10697;LINEAR A SIGN A363;Lo;0;L;;;;;N;;;;; 10698;LINEAR A SIGN A364;Lo;0;L;;;;;N;;;;; 10699;LINEAR A SIGN A365;Lo;0;L;;;;;N;;;;; 1069A;LINEAR A SIGN A366;Lo;0;L;;;;;N;;;;; 1069B;LINEAR A SIGN A367;Lo;0;L;;;;;N;;;;; 1069C;LINEAR A SIGN A368;Lo;0;L;;;;;N;;;;; 1069D;LINEAR A SIGN A369;Lo;0;L;;;;;N;;;;; 1069E;LINEAR A SIGN A370;Lo;0;L;;;;;N;;;;; 1069F;LINEAR A SIGN A371;Lo;0;L;;;;;N;;;;; 106A0;LINEAR A SIGN A400-VAS;Lo;0;L;;;;;N;;;;; 106A1;LINEAR A SIGN A401-VAS;Lo;0;L;;;;;N;;;;; 106A2;LINEAR A SIGN A402-VAS;Lo;0;L;;;;;N;;;;; 106A3;LINEAR A SIGN A403-VAS;Lo;0;L;;;;;N;;;;; 106A4;LINEAR A SIGN A404-VAS;Lo;0;L;;;;;N;;;;; 106A5;LINEAR A SIGN A405-VAS;Lo;0;L;;;;;N;;;;; 106A6;LINEAR A SIGN A406-VAS;Lo;0;L;;;;;N;;;;; 106A7;LINEAR A SIGN A407-VAS;Lo;0;L;;;;;N;;;;; 106A8;LINEAR A SIGN A408-VAS;Lo;0;L;;;;;N;;;;; 106A9;LINEAR A SIGN A409-VAS;Lo;0;L;;;;;N;;;;; 106AA;LINEAR A SIGN A410-VAS;Lo;0;L;;;;;N;;;;; 106AB;LINEAR A SIGN A411-VAS;Lo;0;L;;;;;N;;;;; 106AC;LINEAR A SIGN A412-VAS;Lo;0;L;;;;;N;;;;; 106AD;LINEAR A SIGN A413-VAS;Lo;0;L;;;;;N;;;;; 106AE;LINEAR A SIGN A414-VAS;Lo;0;L;;;;;N;;;;; 106AF;LINEAR A SIGN A415-VAS;Lo;0;L;;;;;N;;;;; 106B0;LINEAR A SIGN A416-VAS;Lo;0;L;;;;;N;;;;; 106B1;LINEAR A SIGN A417-VAS;Lo;0;L;;;;;N;;;;; 106B2;LINEAR A SIGN A418-VAS;Lo;0;L;;;;;N;;;;; 106B3;LINEAR A SIGN A501;Lo;0;L;;;;;N;;;;; 106B4;LINEAR A SIGN A502;Lo;0;L;;;;;N;;;;; 106B5;LINEAR A SIGN A503;Lo;0;L;;;;;N;;;;; 106B6;LINEAR A SIGN A504;Lo;0;L;;;;;N;;;;; 106B7;LINEAR A SIGN A505;Lo;0;L;;;;;N;;;;; 106B8;LINEAR A SIGN A506;Lo;0;L;;;;;N;;;;; 106B9;LINEAR A SIGN A508;Lo;0;L;;;;;N;;;;; 106BA;LINEAR A SIGN A509;Lo;0;L;;;;;N;;;;; 106BB;LINEAR A SIGN A510;Lo;0;L;;;;;N;;;;; 106BC;LINEAR A SIGN A511;Lo;0;L;;;;;N;;;;; 106BD;LINEAR A SIGN A512;Lo;0;L;;;;;N;;;;; 106BE;LINEAR A SIGN A513;Lo;0;L;;;;;N;;;;; 106BF;LINEAR A SIGN A515;Lo;0;L;;;;;N;;;;; 106C0;LINEAR A SIGN A516;Lo;0;L;;;;;N;;;;; 106C1;LINEAR A SIGN A520;Lo;0;L;;;;;N;;;;; 106C2;LINEAR A SIGN A521;Lo;0;L;;;;;N;;;;; 106C3;LINEAR A SIGN A523;Lo;0;L;;;;;N;;;;; 106C4;LINEAR A SIGN A524;Lo;0;L;;;;;N;;;;; 106C5;LINEAR A SIGN A525;Lo;0;L;;;;;N;;;;; 106C6;LINEAR A SIGN A526;Lo;0;L;;;;;N;;;;; 106C7;LINEAR A SIGN A527;Lo;0;L;;;;;N;;;;; 106C8;LINEAR A SIGN A528;Lo;0;L;;;;;N;;;;; 106C9;LINEAR A SIGN A529;Lo;0;L;;;;;N;;;;; 106CA;LINEAR A SIGN A530;Lo;0;L;;;;;N;;;;; 106CB;LINEAR A SIGN A531;Lo;0;L;;;;;N;;;;; 106CC;LINEAR A SIGN A532;Lo;0;L;;;;;N;;;;; 106CD;LINEAR A SIGN A534;Lo;0;L;;;;;N;;;;; 106CE;LINEAR A SIGN A535;Lo;0;L;;;;;N;;;;; 106CF;LINEAR A SIGN A536;Lo;0;L;;;;;N;;;;; 106D0;LINEAR A SIGN A537;Lo;0;L;;;;;N;;;;; 106D1;LINEAR A SIGN A538;Lo;0;L;;;;;N;;;;; 106D2;LINEAR A SIGN A539;Lo;0;L;;;;;N;;;;; 106D3;LINEAR A SIGN A540;Lo;0;L;;;;;N;;;;; 106D4;LINEAR A SIGN A541;Lo;0;L;;;;;N;;;;; 106D5;LINEAR A SIGN A542;Lo;0;L;;;;;N;;;;; 106D6;LINEAR A SIGN A545;Lo;0;L;;;;;N;;;;; 106D7;LINEAR A SIGN A547;Lo;0;L;;;;;N;;;;; 106D8;LINEAR A SIGN A548;Lo;0;L;;;;;N;;;;; 106D9;LINEAR A SIGN A549;Lo;0;L;;;;;N;;;;; 106DA;LINEAR A SIGN A550;Lo;0;L;;;;;N;;;;; 106DB;LINEAR A SIGN A551;Lo;0;L;;;;;N;;;;; 106DC;LINEAR A SIGN A552;Lo;0;L;;;;;N;;;;; 106DD;LINEAR A SIGN A553;Lo;0;L;;;;;N;;;;; 106DE;LINEAR A SIGN A554;Lo;0;L;;;;;N;;;;; 106DF;LINEAR A SIGN A555;Lo;0;L;;;;;N;;;;; 106E0;LINEAR A SIGN A556;Lo;0;L;;;;;N;;;;; 106E1;LINEAR A SIGN A557;Lo;0;L;;;;;N;;;;; 106E2;LINEAR A SIGN A559;Lo;0;L;;;;;N;;;;; 106E3;LINEAR A SIGN A563;Lo;0;L;;;;;N;;;;; 106E4;LINEAR A SIGN A564;Lo;0;L;;;;;N;;;;; 106E5;LINEAR A SIGN A565;Lo;0;L;;;;;N;;;;; 106E6;LINEAR A SIGN A566;Lo;0;L;;;;;N;;;;; 106E7;LINEAR A SIGN A568;Lo;0;L;;;;;N;;;;; 106E8;LINEAR A SIGN A569;Lo;0;L;;;;;N;;;;; 106E9;LINEAR A SIGN A570;Lo;0;L;;;;;N;;;;; 106EA;LINEAR A SIGN A571;Lo;0;L;;;;;N;;;;; 106EB;LINEAR A SIGN A572;Lo;0;L;;;;;N;;;;; 106EC;LINEAR A SIGN A573;Lo;0;L;;;;;N;;;;; 106ED;LINEAR A SIGN A574;Lo;0;L;;;;;N;;;;; 106EE;LINEAR A SIGN A575;Lo;0;L;;;;;N;;;;; 106EF;LINEAR A SIGN A576;Lo;0;L;;;;;N;;;;; 106F0;LINEAR A SIGN A577;Lo;0;L;;;;;N;;;;; 106F1;LINEAR A SIGN A578;Lo;0;L;;;;;N;;;;; 106F2;LINEAR A SIGN A579;Lo;0;L;;;;;N;;;;; 106F3;LINEAR A SIGN A580;Lo;0;L;;;;;N;;;;; 106F4;LINEAR A SIGN A581;Lo;0;L;;;;;N;;;;; 106F5;LINEAR A SIGN A582;Lo;0;L;;;;;N;;;;; 106F6;LINEAR A SIGN A583;Lo;0;L;;;;;N;;;;; 106F7;LINEAR A SIGN A584;Lo;0;L;;;;;N;;;;; 106F8;LINEAR A SIGN A585;Lo;0;L;;;;;N;;;;; 106F9;LINEAR A SIGN A586;Lo;0;L;;;;;N;;;;; 106FA;LINEAR A SIGN A587;Lo;0;L;;;;;N;;;;; 106FB;LINEAR A SIGN A588;Lo;0;L;;;;;N;;;;; 106FC;LINEAR A SIGN A589;Lo;0;L;;;;;N;;;;; 106FD;LINEAR A SIGN A591;Lo;0;L;;;;;N;;;;; 106FE;LINEAR A SIGN A592;Lo;0;L;;;;;N;;;;; 106FF;LINEAR A SIGN A594;Lo;0;L;;;;;N;;;;; 10700;LINEAR A SIGN A595;Lo;0;L;;;;;N;;;;; 10701;LINEAR A SIGN A596;Lo;0;L;;;;;N;;;;; 10702;LINEAR A SIGN A598;Lo;0;L;;;;;N;;;;; 10703;LINEAR A SIGN A600;Lo;0;L;;;;;N;;;;; 10704;LINEAR A SIGN A601;Lo;0;L;;;;;N;;;;; 10705;LINEAR A SIGN A602;Lo;0;L;;;;;N;;;;; 10706;LINEAR A SIGN A603;Lo;0;L;;;;;N;;;;; 10707;LINEAR A SIGN A604;Lo;0;L;;;;;N;;;;; 10708;LINEAR A SIGN A606;Lo;0;L;;;;;N;;;;; 10709;LINEAR A SIGN A608;Lo;0;L;;;;;N;;;;; 1070A;LINEAR A SIGN A609;Lo;0;L;;;;;N;;;;; 1070B;LINEAR A SIGN A610;Lo;0;L;;;;;N;;;;; 1070C;LINEAR A SIGN A611;Lo;0;L;;;;;N;;;;; 1070D;LINEAR A SIGN A612;Lo;0;L;;;;;N;;;;; 1070E;LINEAR A SIGN A613;Lo;0;L;;;;;N;;;;; 1070F;LINEAR A SIGN A614;Lo;0;L;;;;;N;;;;; 10710;LINEAR A SIGN A615;Lo;0;L;;;;;N;;;;; 10711;LINEAR A SIGN A616;Lo;0;L;;;;;N;;;;; 10712;LINEAR A SIGN A617;Lo;0;L;;;;;N;;;;; 10713;LINEAR A SIGN A618;Lo;0;L;;;;;N;;;;; 10714;LINEAR A SIGN A619;Lo;0;L;;;;;N;;;;; 10715;LINEAR A SIGN A620;Lo;0;L;;;;;N;;;;; 10716;LINEAR A SIGN A621;Lo;0;L;;;;;N;;;;; 10717;LINEAR A SIGN A622;Lo;0;L;;;;;N;;;;; 10718;LINEAR A SIGN A623;Lo;0;L;;;;;N;;;;; 10719;LINEAR A SIGN A624;Lo;0;L;;;;;N;;;;; 1071A;LINEAR A SIGN A626;Lo;0;L;;;;;N;;;;; 1071B;LINEAR A SIGN A627;Lo;0;L;;;;;N;;;;; 1071C;LINEAR A SIGN A628;Lo;0;L;;;;;N;;;;; 1071D;LINEAR A SIGN A629;Lo;0;L;;;;;N;;;;; 1071E;LINEAR A SIGN A634;Lo;0;L;;;;;N;;;;; 1071F;LINEAR A SIGN A637;Lo;0;L;;;;;N;;;;; 10720;LINEAR A SIGN A638;Lo;0;L;;;;;N;;;;; 10721;LINEAR A SIGN A640;Lo;0;L;;;;;N;;;;; 10722;LINEAR A SIGN A642;Lo;0;L;;;;;N;;;;; 10723;LINEAR A SIGN A643;Lo;0;L;;;;;N;;;;; 10724;LINEAR A SIGN A644;Lo;0;L;;;;;N;;;;; 10725;LINEAR A SIGN A645;Lo;0;L;;;;;N;;;;; 10726;LINEAR A SIGN A646;Lo;0;L;;;;;N;;;;; 10727;LINEAR A SIGN A648;Lo;0;L;;;;;N;;;;; 10728;LINEAR A SIGN A649;Lo;0;L;;;;;N;;;;; 10729;LINEAR A SIGN A651;Lo;0;L;;;;;N;;;;; 1072A;LINEAR A SIGN A652;Lo;0;L;;;;;N;;;;; 1072B;LINEAR A SIGN A653;Lo;0;L;;;;;N;;;;; 1072C;LINEAR A SIGN A654;Lo;0;L;;;;;N;;;;; 1072D;LINEAR A SIGN A655;Lo;0;L;;;;;N;;;;; 1072E;LINEAR A SIGN A656;Lo;0;L;;;;;N;;;;; 1072F;LINEAR A SIGN A657;Lo;0;L;;;;;N;;;;; 10730;LINEAR A SIGN A658;Lo;0;L;;;;;N;;;;; 10731;LINEAR A SIGN A659;Lo;0;L;;;;;N;;;;; 10732;LINEAR A SIGN A660;Lo;0;L;;;;;N;;;;; 10733;LINEAR A SIGN A661;Lo;0;L;;;;;N;;;;; 10734;LINEAR A SIGN A662;Lo;0;L;;;;;N;;;;; 10735;LINEAR A SIGN A663;Lo;0;L;;;;;N;;;;; 10736;LINEAR A SIGN A664;Lo;0;L;;;;;N;;;;; 10740;LINEAR A SIGN A701 A;Lo;0;L;;;;;N;;;;; 10741;LINEAR A SIGN A702 B;Lo;0;L;;;;;N;;;;; 10742;LINEAR A SIGN A703 D;Lo;0;L;;;;;N;;;;; 10743;LINEAR A SIGN A704 E;Lo;0;L;;;;;N;;;;; 10744;LINEAR A SIGN A705 F;Lo;0;L;;;;;N;;;;; 10745;LINEAR A SIGN A706 H;Lo;0;L;;;;;N;;;;; 10746;LINEAR A SIGN A707 J;Lo;0;L;;;;;N;;;;; 10747;LINEAR A SIGN A708 K;Lo;0;L;;;;;N;;;;; 10748;LINEAR A SIGN A709 L;Lo;0;L;;;;;N;;;;; 10749;LINEAR A SIGN A709-2 L2;Lo;0;L;;;;;N;;;;; 1074A;LINEAR A SIGN A709-3 L3;Lo;0;L;;;;;N;;;;; 1074B;LINEAR A SIGN A709-4 L4;Lo;0;L;;;;;N;;;;; 1074C;LINEAR A SIGN A709-6 L6;Lo;0;L;;;;;N;;;;; 1074D;LINEAR A SIGN A710 W;Lo;0;L;;;;;N;;;;; 1074E;LINEAR A SIGN A711 X;Lo;0;L;;;;;N;;;;; 1074F;LINEAR A SIGN A712 Y;Lo;0;L;;;;;N;;;;; 10750;LINEAR A SIGN A713 OMEGA;Lo;0;L;;;;;N;;;;; 10751;LINEAR A SIGN A714 ABB;Lo;0;L;;;;;N;;;;; 10752;LINEAR A SIGN A715 BB;Lo;0;L;;;;;N;;;;; 10753;LINEAR A SIGN A717 DD;Lo;0;L;;;;;N;;;;; 10754;LINEAR A SIGN A726 EYYY;Lo;0;L;;;;;N;;;;; 10755;LINEAR A SIGN A732 JE;Lo;0;L;;;;;N;;;;; 10760;LINEAR A SIGN A800;Lo;0;L;;;;;N;;;;; 10761;LINEAR A SIGN A801;Lo;0;L;;;;;N;;;;; 10762;LINEAR A SIGN A802;Lo;0;L;;;;;N;;;;; 10763;LINEAR A SIGN A803;Lo;0;L;;;;;N;;;;; 10764;LINEAR A SIGN A804;Lo;0;L;;;;;N;;;;; 10765;LINEAR A SIGN A805;Lo;0;L;;;;;N;;;;; 10766;LINEAR A SIGN A806;Lo;0;L;;;;;N;;;;; 10767;LINEAR A SIGN A807;Lo;0;L;;;;;N;;;;; 10800;CYPRIOT SYLLABLE A;Lo;0;R;;;;;N;;;;; 10801;CYPRIOT SYLLABLE E;Lo;0;R;;;;;N;;;;; 10802;CYPRIOT SYLLABLE I;Lo;0;R;;;;;N;;;;; 10803;CYPRIOT SYLLABLE O;Lo;0;R;;;;;N;;;;; 10804;CYPRIOT SYLLABLE U;Lo;0;R;;;;;N;;;;; 10805;CYPRIOT SYLLABLE JA;Lo;0;R;;;;;N;;;;; 10808;CYPRIOT SYLLABLE JO;Lo;0;R;;;;;N;;;;; 1080A;CYPRIOT SYLLABLE KA;Lo;0;R;;;;;N;;;;; 1080B;CYPRIOT SYLLABLE KE;Lo;0;R;;;;;N;;;;; 1080C;CYPRIOT SYLLABLE KI;Lo;0;R;;;;;N;;;;; 1080D;CYPRIOT SYLLABLE KO;Lo;0;R;;;;;N;;;;; 1080E;CYPRIOT SYLLABLE KU;Lo;0;R;;;;;N;;;;; 1080F;CYPRIOT SYLLABLE LA;Lo;0;R;;;;;N;;;;; 10810;CYPRIOT SYLLABLE LE;Lo;0;R;;;;;N;;;;; 10811;CYPRIOT SYLLABLE LI;Lo;0;R;;;;;N;;;;; 10812;CYPRIOT SYLLABLE LO;Lo;0;R;;;;;N;;;;; 10813;CYPRIOT SYLLABLE LU;Lo;0;R;;;;;N;;;;; 10814;CYPRIOT SYLLABLE MA;Lo;0;R;;;;;N;;;;; 10815;CYPRIOT SYLLABLE ME;Lo;0;R;;;;;N;;;;; 10816;CYPRIOT SYLLABLE MI;Lo;0;R;;;;;N;;;;; 10817;CYPRIOT SYLLABLE MO;Lo;0;R;;;;;N;;;;; 10818;CYPRIOT SYLLABLE MU;Lo;0;R;;;;;N;;;;; 10819;CYPRIOT SYLLABLE NA;Lo;0;R;;;;;N;;;;; 1081A;CYPRIOT SYLLABLE NE;Lo;0;R;;;;;N;;;;; 1081B;CYPRIOT SYLLABLE NI;Lo;0;R;;;;;N;;;;; 1081C;CYPRIOT SYLLABLE NO;Lo;0;R;;;;;N;;;;; 1081D;CYPRIOT SYLLABLE NU;Lo;0;R;;;;;N;;;;; 1081E;CYPRIOT SYLLABLE PA;Lo;0;R;;;;;N;;;;; 1081F;CYPRIOT SYLLABLE PE;Lo;0;R;;;;;N;;;;; 10820;CYPRIOT SYLLABLE PI;Lo;0;R;;;;;N;;;;; 10821;CYPRIOT SYLLABLE PO;Lo;0;R;;;;;N;;;;; 10822;CYPRIOT SYLLABLE PU;Lo;0;R;;;;;N;;;;; 10823;CYPRIOT SYLLABLE RA;Lo;0;R;;;;;N;;;;; 10824;CYPRIOT SYLLABLE RE;Lo;0;R;;;;;N;;;;; 10825;CYPRIOT SYLLABLE RI;Lo;0;R;;;;;N;;;;; 10826;CYPRIOT SYLLABLE RO;Lo;0;R;;;;;N;;;;; 10827;CYPRIOT SYLLABLE RU;Lo;0;R;;;;;N;;;;; 10828;CYPRIOT SYLLABLE SA;Lo;0;R;;;;;N;;;;; 10829;CYPRIOT SYLLABLE SE;Lo;0;R;;;;;N;;;;; 1082A;CYPRIOT SYLLABLE SI;Lo;0;R;;;;;N;;;;; 1082B;CYPRIOT SYLLABLE SO;Lo;0;R;;;;;N;;;;; 1082C;CYPRIOT SYLLABLE SU;Lo;0;R;;;;;N;;;;; 1082D;CYPRIOT SYLLABLE TA;Lo;0;R;;;;;N;;;;; 1082E;CYPRIOT SYLLABLE TE;Lo;0;R;;;;;N;;;;; 1082F;CYPRIOT SYLLABLE TI;Lo;0;R;;;;;N;;;;; 10830;CYPRIOT SYLLABLE TO;Lo;0;R;;;;;N;;;;; 10831;CYPRIOT SYLLABLE TU;Lo;0;R;;;;;N;;;;; 10832;CYPRIOT SYLLABLE WA;Lo;0;R;;;;;N;;;;; 10833;CYPRIOT SYLLABLE WE;Lo;0;R;;;;;N;;;;; 10834;CYPRIOT SYLLABLE WI;Lo;0;R;;;;;N;;;;; 10835;CYPRIOT SYLLABLE WO;Lo;0;R;;;;;N;;;;; 10837;CYPRIOT SYLLABLE XA;Lo;0;R;;;;;N;;;;; 10838;CYPRIOT SYLLABLE XE;Lo;0;R;;;;;N;;;;; 1083C;CYPRIOT SYLLABLE ZA;Lo;0;R;;;;;N;;;;; 1083F;CYPRIOT SYLLABLE ZO;Lo;0;R;;;;;N;;;;; 10840;IMPERIAL ARAMAIC LETTER ALEPH;Lo;0;R;;;;;N;;;;; 10841;IMPERIAL ARAMAIC LETTER BETH;Lo;0;R;;;;;N;;;;; 10842;IMPERIAL ARAMAIC LETTER GIMEL;Lo;0;R;;;;;N;;;;; 10843;IMPERIAL ARAMAIC LETTER DALETH;Lo;0;R;;;;;N;;;;; 10844;IMPERIAL ARAMAIC LETTER HE;Lo;0;R;;;;;N;;;;; 10845;IMPERIAL ARAMAIC LETTER WAW;Lo;0;R;;;;;N;;;;; 10846;IMPERIAL ARAMAIC LETTER ZAYIN;Lo;0;R;;;;;N;;;;; 10847;IMPERIAL ARAMAIC LETTER HETH;Lo;0;R;;;;;N;;;;; 10848;IMPERIAL ARAMAIC LETTER TETH;Lo;0;R;;;;;N;;;;; 10849;IMPERIAL ARAMAIC LETTER YODH;Lo;0;R;;;;;N;;;;; 1084A;IMPERIAL ARAMAIC LETTER KAPH;Lo;0;R;;;;;N;;;;; 1084B;IMPERIAL ARAMAIC LETTER LAMEDH;Lo;0;R;;;;;N;;;;; 1084C;IMPERIAL ARAMAIC LETTER MEM;Lo;0;R;;;;;N;;;;; 1084D;IMPERIAL ARAMAIC LETTER NUN;Lo;0;R;;;;;N;;;;; 1084E;IMPERIAL ARAMAIC LETTER SAMEKH;Lo;0;R;;;;;N;;;;; 1084F;IMPERIAL ARAMAIC LETTER AYIN;Lo;0;R;;;;;N;;;;; 10850;IMPERIAL ARAMAIC LETTER PE;Lo;0;R;;;;;N;;;;; 10851;IMPERIAL ARAMAIC LETTER SADHE;Lo;0;R;;;;;N;;;;; 10852;IMPERIAL ARAMAIC LETTER QOPH;Lo;0;R;;;;;N;;;;; 10853;IMPERIAL ARAMAIC LETTER RESH;Lo;0;R;;;;;N;;;;; 10854;IMPERIAL ARAMAIC LETTER SHIN;Lo;0;R;;;;;N;;;;; 10855;IMPERIAL ARAMAIC LETTER TAW;Lo;0;R;;;;;N;;;;; 10857;IMPERIAL ARAMAIC SECTION SIGN;Po;0;R;;;;;N;;;;; 10858;IMPERIAL ARAMAIC NUMBER ONE;No;0;R;;;;1;N;;;;; 10859;IMPERIAL ARAMAIC NUMBER TWO;No;0;R;;;;2;N;;;;; 1085A;IMPERIAL ARAMAIC NUMBER THREE;No;0;R;;;;3;N;;;;; 1085B;IMPERIAL ARAMAIC NUMBER TEN;No;0;R;;;;10;N;;;;; 1085C;IMPERIAL ARAMAIC NUMBER TWENTY;No;0;R;;;;20;N;;;;; 1085D;IMPERIAL ARAMAIC NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; 1085E;IMPERIAL ARAMAIC NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; 1085F;IMPERIAL ARAMAIC NUMBER TEN THOUSAND;No;0;R;;;;10000;N;;;;; 10860;PALMYRENE LETTER ALEPH;Lo;0;R;;;;;N;;;;; 10861;PALMYRENE LETTER BETH;Lo;0;R;;;;;N;;;;; 10862;PALMYRENE LETTER GIMEL;Lo;0;R;;;;;N;;;;; 10863;PALMYRENE LETTER DALETH;Lo;0;R;;;;;N;;;;; 10864;PALMYRENE LETTER HE;Lo;0;R;;;;;N;;;;; 10865;PALMYRENE LETTER WAW;Lo;0;R;;;;;N;;;;; 10866;PALMYRENE LETTER ZAYIN;Lo;0;R;;;;;N;;;;; 10867;PALMYRENE LETTER HETH;Lo;0;R;;;;;N;;;;; 10868;PALMYRENE LETTER TETH;Lo;0;R;;;;;N;;;;; 10869;PALMYRENE LETTER YODH;Lo;0;R;;;;;N;;;;; 1086A;PALMYRENE LETTER KAPH;Lo;0;R;;;;;N;;;;; 1086B;PALMYRENE LETTER LAMEDH;Lo;0;R;;;;;N;;;;; 1086C;PALMYRENE LETTER MEM;Lo;0;R;;;;;N;;;;; 1086D;PALMYRENE LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; 1086E;PALMYRENE LETTER NUN;Lo;0;R;;;;;N;;;;; 1086F;PALMYRENE LETTER SAMEKH;Lo;0;R;;;;;N;;;;; 10870;PALMYRENE LETTER AYIN;Lo;0;R;;;;;N;;;;; 10871;PALMYRENE LETTER PE;Lo;0;R;;;;;N;;;;; 10872;PALMYRENE LETTER SADHE;Lo;0;R;;;;;N;;;;; 10873;PALMYRENE LETTER QOPH;Lo;0;R;;;;;N;;;;; 10874;PALMYRENE LETTER RESH;Lo;0;R;;;;;N;;;;; 10875;PALMYRENE LETTER SHIN;Lo;0;R;;;;;N;;;;; 10876;PALMYRENE LETTER TAW;Lo;0;R;;;;;N;;;;; 10877;PALMYRENE LEFT-POINTING FLEURON;So;0;R;;;;;N;;;;; 10878;PALMYRENE RIGHT-POINTING FLEURON;So;0;R;;;;;N;;;;; 10879;PALMYRENE NUMBER ONE;No;0;R;;;;1;N;;;;; 1087A;PALMYRENE NUMBER TWO;No;0;R;;;;2;N;;;;; 1087B;PALMYRENE NUMBER THREE;No;0;R;;;;3;N;;;;; 1087C;PALMYRENE NUMBER FOUR;No;0;R;;;;4;N;;;;; 1087D;PALMYRENE NUMBER FIVE;No;0;R;;;;5;N;;;;; 1087E;PALMYRENE NUMBER TEN;No;0;R;;;;10;N;;;;; 1087F;PALMYRENE NUMBER TWENTY;No;0;R;;;;20;N;;;;; 10880;NABATAEAN LETTER FINAL ALEPH;Lo;0;R;;;;;N;;;;; 10881;NABATAEAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; 10882;NABATAEAN LETTER FINAL BETH;Lo;0;R;;;;;N;;;;; 10883;NABATAEAN LETTER BETH;Lo;0;R;;;;;N;;;;; 10884;NABATAEAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; 10885;NABATAEAN LETTER DALETH;Lo;0;R;;;;;N;;;;; 10886;NABATAEAN LETTER FINAL HE;Lo;0;R;;;;;N;;;;; 10887;NABATAEAN LETTER HE;Lo;0;R;;;;;N;;;;; 10888;NABATAEAN LETTER WAW;Lo;0;R;;;;;N;;;;; 10889;NABATAEAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; 1088A;NABATAEAN LETTER HETH;Lo;0;R;;;;;N;;;;; 1088B;NABATAEAN LETTER TETH;Lo;0;R;;;;;N;;;;; 1088C;NABATAEAN LETTER FINAL YODH;Lo;0;R;;;;;N;;;;; 1088D;NABATAEAN LETTER YODH;Lo;0;R;;;;;N;;;;; 1088E;NABATAEAN LETTER FINAL KAPH;Lo;0;R;;;;;N;;;;; 1088F;NABATAEAN LETTER KAPH;Lo;0;R;;;;;N;;;;; 10890;NABATAEAN LETTER FINAL LAMEDH;Lo;0;R;;;;;N;;;;; 10891;NABATAEAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; 10892;NABATAEAN LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; 10893;NABATAEAN LETTER MEM;Lo;0;R;;;;;N;;;;; 10894;NABATAEAN LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; 10895;NABATAEAN LETTER NUN;Lo;0;R;;;;;N;;;;; 10896;NABATAEAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; 10897;NABATAEAN LETTER AYIN;Lo;0;R;;;;;N;;;;; 10898;NABATAEAN LETTER PE;Lo;0;R;;;;;N;;;;; 10899;NABATAEAN LETTER SADHE;Lo;0;R;;;;;N;;;;; 1089A;NABATAEAN LETTER QOPH;Lo;0;R;;;;;N;;;;; 1089B;NABATAEAN LETTER RESH;Lo;0;R;;;;;N;;;;; 1089C;NABATAEAN LETTER FINAL SHIN;Lo;0;R;;;;;N;;;;; 1089D;NABATAEAN LETTER SHIN;Lo;0;R;;;;;N;;;;; 1089E;NABATAEAN LETTER TAW;Lo;0;R;;;;;N;;;;; 108A7;NABATAEAN NUMBER ONE;No;0;R;;;;1;N;;;;; 108A8;NABATAEAN NUMBER TWO;No;0;R;;;;2;N;;;;; 108A9;NABATAEAN NUMBER THREE;No;0;R;;;;3;N;;;;; 108AA;NABATAEAN NUMBER FOUR;No;0;R;;;;4;N;;;;; 108AB;NABATAEAN CRUCIFORM NUMBER FOUR;No;0;R;;;;4;N;;;;; 108AC;NABATAEAN NUMBER FIVE;No;0;R;;;;5;N;;;;; 108AD;NABATAEAN NUMBER TEN;No;0;R;;;;10;N;;;;; 108AE;NABATAEAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; 108AF;NABATAEAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; 108E0;HATRAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; 108E1;HATRAN LETTER BETH;Lo;0;R;;;;;N;;;;; 108E2;HATRAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; 108E3;HATRAN LETTER DALETH-RESH;Lo;0;R;;;;;N;;;;; 108E4;HATRAN LETTER HE;Lo;0;R;;;;;N;;;;; 108E5;HATRAN LETTER WAW;Lo;0;R;;;;;N;;;;; 108E6;HATRAN LETTER ZAYN;Lo;0;R;;;;;N;;;;; 108E7;HATRAN LETTER HETH;Lo;0;R;;;;;N;;;;; 108E8;HATRAN LETTER TETH;Lo;0;R;;;;;N;;;;; 108E9;HATRAN LETTER YODH;Lo;0;R;;;;;N;;;;; 108EA;HATRAN LETTER KAPH;Lo;0;R;;;;;N;;;;; 108EB;HATRAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; 108EC;HATRAN LETTER MEM;Lo;0;R;;;;;N;;;;; 108ED;HATRAN LETTER NUN;Lo;0;R;;;;;N;;;;; 108EE;HATRAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; 108EF;HATRAN LETTER AYN;Lo;0;R;;;;;N;;;;; 108F0;HATRAN LETTER PE;Lo;0;R;;;;;N;;;;; 108F1;HATRAN LETTER SADHE;Lo;0;R;;;;;N;;;;; 108F2;HATRAN LETTER QOPH;Lo;0;R;;;;;N;;;;; 108F4;HATRAN LETTER SHIN;Lo;0;R;;;;;N;;;;; 108F5;HATRAN LETTER TAW;Lo;0;R;;;;;N;;;;; 108FB;HATRAN NUMBER ONE;No;0;R;;;;1;N;;;;; 108FC;HATRAN NUMBER FIVE;No;0;R;;;;5;N;;;;; 108FD;HATRAN NUMBER TEN;No;0;R;;;;10;N;;;;; 108FE;HATRAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; 108FF;HATRAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; 10900;PHOENICIAN LETTER ALF;Lo;0;R;;;;;N;;;;; 10901;PHOENICIAN LETTER BET;Lo;0;R;;;;;N;;;;; 10902;PHOENICIAN LETTER GAML;Lo;0;R;;;;;N;;;;; 10903;PHOENICIAN LETTER DELT;Lo;0;R;;;;;N;;;;; 10904;PHOENICIAN LETTER HE;Lo;0;R;;;;;N;;;;; 10905;PHOENICIAN LETTER WAU;Lo;0;R;;;;;N;;;;; 10906;PHOENICIAN LETTER ZAI;Lo;0;R;;;;;N;;;;; 10907;PHOENICIAN LETTER HET;Lo;0;R;;;;;N;;;;; 10908;PHOENICIAN LETTER TET;Lo;0;R;;;;;N;;;;; 10909;PHOENICIAN LETTER YOD;Lo;0;R;;;;;N;;;;; 1090A;PHOENICIAN LETTER KAF;Lo;0;R;;;;;N;;;;; 1090B;PHOENICIAN LETTER LAMD;Lo;0;R;;;;;N;;;;; 1090C;PHOENICIAN LETTER MEM;Lo;0;R;;;;;N;;;;; 1090D;PHOENICIAN LETTER NUN;Lo;0;R;;;;;N;;;;; 1090E;PHOENICIAN LETTER SEMK;Lo;0;R;;;;;N;;;;; 1090F;PHOENICIAN LETTER AIN;Lo;0;R;;;;;N;;;;; 10910;PHOENICIAN LETTER PE;Lo;0;R;;;;;N;;;;; 10911;PHOENICIAN LETTER SADE;Lo;0;R;;;;;N;;;;; 10912;PHOENICIAN LETTER QOF;Lo;0;R;;;;;N;;;;; 10913;PHOENICIAN LETTER ROSH;Lo;0;R;;;;;N;;;;; 10914;PHOENICIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; 10915;PHOENICIAN LETTER TAU;Lo;0;R;;;;;N;;;;; 10916;PHOENICIAN NUMBER ONE;No;0;R;;;;1;N;;;;; 10917;PHOENICIAN NUMBER TEN;No;0;R;;;;10;N;;;;; 10918;PHOENICIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; 10919;PHOENICIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; 1091A;PHOENICIAN NUMBER TWO;No;0;R;;;;2;N;;;;; 1091B;PHOENICIAN NUMBER THREE;No;0;R;;;;3;N;;;;; 1091F;PHOENICIAN WORD SEPARATOR;Po;0;ON;;;;;N;;;;; 10920;LYDIAN LETTER A;Lo;0;R;;;;;N;;;;; 10921;LYDIAN LETTER B;Lo;0;R;;;;;N;;;;; 10922;LYDIAN LETTER G;Lo;0;R;;;;;N;;;;; 10923;LYDIAN LETTER D;Lo;0;R;;;;;N;;;;; 10924;LYDIAN LETTER E;Lo;0;R;;;;;N;;;;; 10925;LYDIAN LETTER V;Lo;0;R;;;;;N;;;;; 10926;LYDIAN LETTER I;Lo;0;R;;;;;N;;;;; 10927;LYDIAN LETTER Y;Lo;0;R;;;;;N;;;;; 10928;LYDIAN LETTER K;Lo;0;R;;;;;N;;;;; 10929;LYDIAN LETTER L;Lo;0;R;;;;;N;;;;; 1092A;LYDIAN LETTER M;Lo;0;R;;;;;N;;;;; 1092B;LYDIAN LETTER N;Lo;0;R;;;;;N;;;;; 1092C;LYDIAN LETTER O;Lo;0;R;;;;;N;;;;; 1092D;LYDIAN LETTER R;Lo;0;R;;;;;N;;;;; 1092E;LYDIAN LETTER SS;Lo;0;R;;;;;N;;;;; 1092F;LYDIAN LETTER T;Lo;0;R;;;;;N;;;;; 10930;LYDIAN LETTER U;Lo;0;R;;;;;N;;;;; 10931;LYDIAN LETTER F;Lo;0;R;;;;;N;;;;; 10932;LYDIAN LETTER Q;Lo;0;R;;;;;N;;;;; 10933;LYDIAN LETTER S;Lo;0;R;;;;;N;;;;; 10934;LYDIAN LETTER TT;Lo;0;R;;;;;N;;;;; 10935;LYDIAN LETTER AN;Lo;0;R;;;;;N;;;;; 10936;LYDIAN LETTER EN;Lo;0;R;;;;;N;;;;; 10937;LYDIAN LETTER LY;Lo;0;R;;;;;N;;;;; 10938;LYDIAN LETTER NN;Lo;0;R;;;;;N;;;;; 10939;LYDIAN LETTER C;Lo;0;R;;;;;N;;;;; 1093F;LYDIAN TRIANGULAR MARK;Po;0;R;;;;;N;;;;; 10980;MEROITIC HIEROGLYPHIC LETTER A;Lo;0;R;;;;;N;;;;; 10981;MEROITIC HIEROGLYPHIC LETTER E;Lo;0;R;;;;;N;;;;; 10982;MEROITIC HIEROGLYPHIC LETTER I;Lo;0;R;;;;;N;;;;; 10983;MEROITIC HIEROGLYPHIC LETTER O;Lo;0;R;;;;;N;;;;; 10984;MEROITIC HIEROGLYPHIC LETTER YA;Lo;0;R;;;;;N;;;;; 10985;MEROITIC HIEROGLYPHIC LETTER WA;Lo;0;R;;;;;N;;;;; 10986;MEROITIC HIEROGLYPHIC LETTER BA;Lo;0;R;;;;;N;;;;; 10987;MEROITIC HIEROGLYPHIC LETTER BA-2;Lo;0;R;;;;;N;;;;; 10988;MEROITIC HIEROGLYPHIC LETTER PA;Lo;0;R;;;;;N;;;;; 10989;MEROITIC HIEROGLYPHIC LETTER MA;Lo;0;R;;;;;N;;;;; 1098A;MEROITIC HIEROGLYPHIC LETTER NA;Lo;0;R;;;;;N;;;;; 1098B;MEROITIC HIEROGLYPHIC LETTER NA-2;Lo;0;R;;;;;N;;;;; 1098C;MEROITIC HIEROGLYPHIC LETTER NE;Lo;0;R;;;;;N;;;;; 1098D;MEROITIC HIEROGLYPHIC LETTER NE-2;Lo;0;R;;;;;N;;;;; 1098E;MEROITIC HIEROGLYPHIC LETTER RA;Lo;0;R;;;;;N;;;;; 1098F;MEROITIC HIEROGLYPHIC LETTER RA-2;Lo;0;R;;;;;N;;;;; 10990;MEROITIC HIEROGLYPHIC LETTER LA;Lo;0;R;;;;;N;;;;; 10991;MEROITIC HIEROGLYPHIC LETTER KHA;Lo;0;R;;;;;N;;;;; 10992;MEROITIC HIEROGLYPHIC LETTER HHA;Lo;0;R;;;;;N;;;;; 10993;MEROITIC HIEROGLYPHIC LETTER SA;Lo;0;R;;;;;N;;;;; 10994;MEROITIC HIEROGLYPHIC LETTER SA-2;Lo;0;R;;;;;N;;;;; 10995;MEROITIC HIEROGLYPHIC LETTER SE;Lo;0;R;;;;;N;;;;; 10996;MEROITIC HIEROGLYPHIC LETTER KA;Lo;0;R;;;;;N;;;;; 10997;MEROITIC HIEROGLYPHIC LETTER QA;Lo;0;R;;;;;N;;;;; 10998;MEROITIC HIEROGLYPHIC LETTER TA;Lo;0;R;;;;;N;;;;; 10999;MEROITIC HIEROGLYPHIC LETTER TA-2;Lo;0;R;;;;;N;;;;; 1099A;MEROITIC HIEROGLYPHIC LETTER TE;Lo;0;R;;;;;N;;;;; 1099B;MEROITIC HIEROGLYPHIC LETTER TE-2;Lo;0;R;;;;;N;;;;; 1099C;MEROITIC HIEROGLYPHIC LETTER TO;Lo;0;R;;;;;N;;;;; 1099D;MEROITIC HIEROGLYPHIC LETTER DA;Lo;0;R;;;;;N;;;;; 1099E;MEROITIC HIEROGLYPHIC SYMBOL VIDJ;Lo;0;R;;;;;N;;;;; 1099F;MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2;Lo;0;R;;;;;N;;;;; 109A0;MEROITIC CURSIVE LETTER A;Lo;0;R;;;;;N;;;;; 109A1;MEROITIC CURSIVE LETTER E;Lo;0;R;;;;;N;;;;; 109A2;MEROITIC CURSIVE LETTER I;Lo;0;R;;;;;N;;;;; 109A3;MEROITIC CURSIVE LETTER O;Lo;0;R;;;;;N;;;;; 109A4;MEROITIC CURSIVE LETTER YA;Lo;0;R;;;;;N;;;;; 109A5;MEROITIC CURSIVE LETTER WA;Lo;0;R;;;;;N;;;;; 109A6;MEROITIC CURSIVE LETTER BA;Lo;0;R;;;;;N;;;;; 109A7;MEROITIC CURSIVE LETTER PA;Lo;0;R;;;;;N;;;;; 109A8;MEROITIC CURSIVE LETTER MA;Lo;0;R;;;;;N;;;;; 109A9;MEROITIC CURSIVE LETTER NA;Lo;0;R;;;;;N;;;;; 109AA;MEROITIC CURSIVE LETTER NE;Lo;0;R;;;;;N;;;;; 109AB;MEROITIC CURSIVE LETTER RA;Lo;0;R;;;;;N;;;;; 109AC;MEROITIC CURSIVE LETTER LA;Lo;0;R;;;;;N;;;;; 109AD;MEROITIC CURSIVE LETTER KHA;Lo;0;R;;;;;N;;;;; 109AE;MEROITIC CURSIVE LETTER HHA;Lo;0;R;;;;;N;;;;; 109AF;MEROITIC CURSIVE LETTER SA;Lo;0;R;;;;;N;;;;; 109B0;MEROITIC CURSIVE LETTER ARCHAIC SA;Lo;0;R;;;;;N;;;;; 109B1;MEROITIC CURSIVE LETTER SE;Lo;0;R;;;;;N;;;;; 109B2;MEROITIC CURSIVE LETTER KA;Lo;0;R;;;;;N;;;;; 109B3;MEROITIC CURSIVE LETTER QA;Lo;0;R;;;;;N;;;;; 109B4;MEROITIC CURSIVE LETTER TA;Lo;0;R;;;;;N;;;;; 109B5;MEROITIC CURSIVE LETTER TE;Lo;0;R;;;;;N;;;;; 109B6;MEROITIC CURSIVE LETTER TO;Lo;0;R;;;;;N;;;;; 109B7;MEROITIC CURSIVE LETTER DA;Lo;0;R;;;;;N;;;;; 109BC;MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS;No;0;R;;;;11/12;N;;;;; 109BD;MEROITIC CURSIVE FRACTION ONE HALF;No;0;R;;;;1/2;N;;;;; 109BE;MEROITIC CURSIVE LOGOGRAM RMT;Lo;0;R;;;;;N;;;;; 109BF;MEROITIC CURSIVE LOGOGRAM IMN;Lo;0;R;;;;;N;;;;; 109C0;MEROITIC CURSIVE NUMBER ONE;No;0;R;;;;1;N;;;;; 109C1;MEROITIC CURSIVE NUMBER TWO;No;0;R;;;;2;N;;;;; 109C2;MEROITIC CURSIVE NUMBER THREE;No;0;R;;;;3;N;;;;; 109C3;MEROITIC CURSIVE NUMBER FOUR;No;0;R;;;;4;N;;;;; 109C4;MEROITIC CURSIVE NUMBER FIVE;No;0;R;;;;5;N;;;;; 109C5;MEROITIC CURSIVE NUMBER SIX;No;0;R;;;;6;N;;;;; 109C6;MEROITIC CURSIVE NUMBER SEVEN;No;0;R;;;;7;N;;;;; 109C7;MEROITIC CURSIVE NUMBER EIGHT;No;0;R;;;;8;N;;;;; 109C8;MEROITIC CURSIVE NUMBER NINE;No;0;R;;;;9;N;;;;; 109C9;MEROITIC CURSIVE NUMBER TEN;No;0;R;;;;10;N;;;;; 109CA;MEROITIC CURSIVE NUMBER TWENTY;No;0;R;;;;20;N;;;;; 109CB;MEROITIC CURSIVE NUMBER THIRTY;No;0;R;;;;30;N;;;;; 109CC;MEROITIC CURSIVE NUMBER FORTY;No;0;R;;;;40;N;;;;; 109CD;MEROITIC CURSIVE NUMBER FIFTY;No;0;R;;;;50;N;;;;; 109CE;MEROITIC CURSIVE NUMBER SIXTY;No;0;R;;;;60;N;;;;; 109CF;MEROITIC CURSIVE NUMBER SEVENTY;No;0;R;;;;70;N;;;;; 109D2;MEROITIC CURSIVE NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; 109D3;MEROITIC CURSIVE NUMBER TWO HUNDRED;No;0;R;;;;200;N;;;;; 109D4;MEROITIC CURSIVE NUMBER THREE HUNDRED;No;0;R;;;;300;N;;;;; 109D5;MEROITIC CURSIVE NUMBER FOUR HUNDRED;No;0;R;;;;400;N;;;;; 109D6;MEROITIC CURSIVE NUMBER FIVE HUNDRED;No;0;R;;;;500;N;;;;; 109D7;MEROITIC CURSIVE NUMBER SIX HUNDRED;No;0;R;;;;600;N;;;;; 109D8;MEROITIC CURSIVE NUMBER SEVEN HUNDRED;No;0;R;;;;700;N;;;;; 109D9;MEROITIC CURSIVE NUMBER EIGHT HUNDRED;No;0;R;;;;800;N;;;;; 109DA;MEROITIC CURSIVE NUMBER NINE HUNDRED;No;0;R;;;;900;N;;;;; 109DB;MEROITIC CURSIVE NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; 109DC;MEROITIC CURSIVE NUMBER TWO THOUSAND;No;0;R;;;;2000;N;;;;; 109DD;MEROITIC CURSIVE NUMBER THREE THOUSAND;No;0;R;;;;3000;N;;;;; 109DE;MEROITIC CURSIVE NUMBER FOUR THOUSAND;No;0;R;;;;4000;N;;;;; 109DF;MEROITIC CURSIVE NUMBER FIVE THOUSAND;No;0;R;;;;5000;N;;;;; 109E0;MEROITIC CURSIVE NUMBER SIX THOUSAND;No;0;R;;;;6000;N;;;;; 109E1;MEROITIC CURSIVE NUMBER SEVEN THOUSAND;No;0;R;;;;7000;N;;;;; 109E2;MEROITIC CURSIVE NUMBER EIGHT THOUSAND;No;0;R;;;;8000;N;;;;; 109E3;MEROITIC CURSIVE NUMBER NINE THOUSAND;No;0;R;;;;9000;N;;;;; 109E4;MEROITIC CURSIVE NUMBER TEN THOUSAND;No;0;R;;;;10000;N;;;;; 109E5;MEROITIC CURSIVE NUMBER TWENTY THOUSAND;No;0;R;;;;20000;N;;;;; 109E6;MEROITIC CURSIVE NUMBER THIRTY THOUSAND;No;0;R;;;;30000;N;;;;; 109E7;MEROITIC CURSIVE NUMBER FORTY THOUSAND;No;0;R;;;;40000;N;;;;; 109E8;MEROITIC CURSIVE NUMBER FIFTY THOUSAND;No;0;R;;;;50000;N;;;;; 109E9;MEROITIC CURSIVE NUMBER SIXTY THOUSAND;No;0;R;;;;60000;N;;;;; 109EA;MEROITIC CURSIVE NUMBER SEVENTY THOUSAND;No;0;R;;;;70000;N;;;;; 109EB;MEROITIC CURSIVE NUMBER EIGHTY THOUSAND;No;0;R;;;;80000;N;;;;; 109EC;MEROITIC CURSIVE NUMBER NINETY THOUSAND;No;0;R;;;;90000;N;;;;; 109ED;MEROITIC CURSIVE NUMBER ONE HUNDRED THOUSAND;No;0;R;;;;100000;N;;;;; 109EE;MEROITIC CURSIVE NUMBER TWO HUNDRED THOUSAND;No;0;R;;;;200000;N;;;;; 109EF;MEROITIC CURSIVE NUMBER THREE HUNDRED THOUSAND;No;0;R;;;;300000;N;;;;; 109F0;MEROITIC CURSIVE NUMBER FOUR HUNDRED THOUSAND;No;0;R;;;;400000;N;;;;; 109F1;MEROITIC CURSIVE NUMBER FIVE HUNDRED THOUSAND;No;0;R;;;;500000;N;;;;; 109F2;MEROITIC CURSIVE NUMBER SIX HUNDRED THOUSAND;No;0;R;;;;600000;N;;;;; 109F3;MEROITIC CURSIVE NUMBER SEVEN HUNDRED THOUSAND;No;0;R;;;;700000;N;;;;; 109F4;MEROITIC CURSIVE NUMBER EIGHT HUNDRED THOUSAND;No;0;R;;;;800000;N;;;;; 109F5;MEROITIC CURSIVE NUMBER NINE HUNDRED THOUSAND;No;0;R;;;;900000;N;;;;; 109F6;MEROITIC CURSIVE FRACTION ONE TWELFTH;No;0;R;;;;1/12;N;;;;; 109F7;MEROITIC CURSIVE FRACTION TWO TWELFTHS;No;0;R;;;;2/12;N;;;;; 109F8;MEROITIC CURSIVE FRACTION THREE TWELFTHS;No;0;R;;;;3/12;N;;;;; 109F9;MEROITIC CURSIVE FRACTION FOUR TWELFTHS;No;0;R;;;;4/12;N;;;;; 109FA;MEROITIC CURSIVE FRACTION FIVE TWELFTHS;No;0;R;;;;5/12;N;;;;; 109FB;MEROITIC CURSIVE FRACTION SIX TWELFTHS;No;0;R;;;;6/12;N;;;;; 109FC;MEROITIC CURSIVE FRACTION SEVEN TWELFTHS;No;0;R;;;;7/12;N;;;;; 109FD;MEROITIC CURSIVE FRACTION EIGHT TWELFTHS;No;0;R;;;;8/12;N;;;;; 109FE;MEROITIC CURSIVE FRACTION NINE TWELFTHS;No;0;R;;;;9/12;N;;;;; 109FF;MEROITIC CURSIVE FRACTION TEN TWELFTHS;No;0;R;;;;10/12;N;;;;; 10A00;KHAROSHTHI LETTER A;Lo;0;R;;;;;N;;;;; 10A01;KHAROSHTHI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; 10A02;KHAROSHTHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 10A03;KHAROSHTHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; 10A05;KHAROSHTHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; 10A06;KHAROSHTHI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; 10A0C;KHAROSHTHI VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; 10A0D;KHAROSHTHI SIGN DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; 10A0E;KHAROSHTHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 10A0F;KHAROSHTHI SIGN VISARGA;Mn;230;NSM;;;;;N;;;;; 10A10;KHAROSHTHI LETTER KA;Lo;0;R;;;;;N;;;;; 10A11;KHAROSHTHI LETTER KHA;Lo;0;R;;;;;N;;;;; 10A12;KHAROSHTHI LETTER GA;Lo;0;R;;;;;N;;;;; 10A13;KHAROSHTHI LETTER GHA;Lo;0;R;;;;;N;;;;; 10A15;KHAROSHTHI LETTER CA;Lo;0;R;;;;;N;;;;; 10A16;KHAROSHTHI LETTER CHA;Lo;0;R;;;;;N;;;;; 10A17;KHAROSHTHI LETTER JA;Lo;0;R;;;;;N;;;;; 10A19;KHAROSHTHI LETTER NYA;Lo;0;R;;;;;N;;;;; 10A1A;KHAROSHTHI LETTER TTA;Lo;0;R;;;;;N;;;;; 10A1B;KHAROSHTHI LETTER TTHA;Lo;0;R;;;;;N;;;;; 10A1C;KHAROSHTHI LETTER DDA;Lo;0;R;;;;;N;;;;; 10A1D;KHAROSHTHI LETTER DDHA;Lo;0;R;;;;;N;;;;; 10A1E;KHAROSHTHI LETTER NNA;Lo;0;R;;;;;N;;;;; 10A1F;KHAROSHTHI LETTER TA;Lo;0;R;;;;;N;;;;; 10A20;KHAROSHTHI LETTER THA;Lo;0;R;;;;;N;;;;; 10A21;KHAROSHTHI LETTER DA;Lo;0;R;;;;;N;;;;; 10A22;KHAROSHTHI LETTER DHA;Lo;0;R;;;;;N;;;;; 10A23;KHAROSHTHI LETTER NA;Lo;0;R;;;;;N;;;;; 10A24;KHAROSHTHI LETTER PA;Lo;0;R;;;;;N;;;;; 10A25;KHAROSHTHI LETTER PHA;Lo;0;R;;;;;N;;;;; 10A26;KHAROSHTHI LETTER BA;Lo;0;R;;;;;N;;;;; 10A27;KHAROSHTHI LETTER BHA;Lo;0;R;;;;;N;;;;; 10A28;KHAROSHTHI LETTER MA;Lo;0;R;;;;;N;;;;; 10A29;KHAROSHTHI LETTER YA;Lo;0;R;;;;;N;;;;; 10A2A;KHAROSHTHI LETTER RA;Lo;0;R;;;;;N;;;;; 10A2B;KHAROSHTHI LETTER LA;Lo;0;R;;;;;N;;;;; 10A2C;KHAROSHTHI LETTER VA;Lo;0;R;;;;;N;;;;; 10A2D;KHAROSHTHI LETTER SHA;Lo;0;R;;;;;N;;;;; 10A2E;KHAROSHTHI LETTER SSA;Lo;0;R;;;;;N;;;;; 10A2F;KHAROSHTHI LETTER SA;Lo;0;R;;;;;N;;;;; 10A30;KHAROSHTHI LETTER ZA;Lo;0;R;;;;;N;;;;; 10A31;KHAROSHTHI LETTER HA;Lo;0;R;;;;;N;;;;; 10A32;KHAROSHTHI LETTER KKA;Lo;0;R;;;;;N;;;;; 10A33;KHAROSHTHI LETTER TTTHA;Lo;0;R;;;;;N;;;;; 10A38;KHAROSHTHI SIGN BAR ABOVE;Mn;230;NSM;;;;;N;;;;; 10A39;KHAROSHTHI SIGN CAUDA;Mn;1;NSM;;;;;N;;;;; 10A3A;KHAROSHTHI SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; 10A3F;KHAROSHTHI VIRAMA;Mn;9;NSM;;;;;N;;;;; 10A40;KHAROSHTHI DIGIT ONE;No;0;R;;;1;1;N;;;;; 10A41;KHAROSHTHI DIGIT TWO;No;0;R;;;2;2;N;;;;; 10A42;KHAROSHTHI DIGIT THREE;No;0;R;;;3;3;N;;;;; 10A43;KHAROSHTHI DIGIT FOUR;No;0;R;;;4;4;N;;;;; 10A44;KHAROSHTHI NUMBER TEN;No;0;R;;;;10;N;;;;; 10A45;KHAROSHTHI NUMBER TWENTY;No;0;R;;;;20;N;;;;; 10A46;KHAROSHTHI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; 10A47;KHAROSHTHI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; 10A50;KHAROSHTHI PUNCTUATION DOT;Po;0;R;;;;;N;;;;; 10A51;KHAROSHTHI PUNCTUATION SMALL CIRCLE;Po;0;R;;;;;N;;;;; 10A52;KHAROSHTHI PUNCTUATION CIRCLE;Po;0;R;;;;;N;;;;; 10A53;KHAROSHTHI PUNCTUATION CRESCENT BAR;Po;0;R;;;;;N;;;;; 10A54;KHAROSHTHI PUNCTUATION MANGALAM;Po;0;R;;;;;N;;;;; 10A55;KHAROSHTHI PUNCTUATION LOTUS;Po;0;R;;;;;N;;;;; 10A56;KHAROSHTHI PUNCTUATION DANDA;Po;0;R;;;;;N;;;;; 10A57;KHAROSHTHI PUNCTUATION DOUBLE DANDA;Po;0;R;;;;;N;;;;; 10A58;KHAROSHTHI PUNCTUATION LINES;Po;0;R;;;;;N;;;;; 10A60;OLD SOUTH ARABIAN LETTER HE;Lo;0;R;;;;;N;;;;; 10A61;OLD SOUTH ARABIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; 10A62;OLD SOUTH ARABIAN LETTER HETH;Lo;0;R;;;;;N;;;;; 10A63;OLD SOUTH ARABIAN LETTER MEM;Lo;0;R;;;;;N;;;;; 10A64;OLD SOUTH ARABIAN LETTER QOPH;Lo;0;R;;;;;N;;;;; 10A65;OLD SOUTH ARABIAN LETTER WAW;Lo;0;R;;;;;N;;;;; 10A66;OLD SOUTH ARABIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; 10A67;OLD SOUTH ARABIAN LETTER RESH;Lo;0;R;;;;;N;;;;; 10A68;OLD SOUTH ARABIAN LETTER BETH;Lo;0;R;;;;;N;;;;; 10A69;OLD SOUTH ARABIAN LETTER TAW;Lo;0;R;;;;;N;;;;; 10A6A;OLD SOUTH ARABIAN LETTER SAT;Lo;0;R;;;;;N;;;;; 10A6B;OLD SOUTH ARABIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; 10A6C;OLD SOUTH ARABIAN LETTER NUN;Lo;0;R;;;;;N;;;;; 10A6D;OLD SOUTH ARABIAN LETTER KHETH;Lo;0;R;;;;;N;;;;; 10A6E;OLD SOUTH ARABIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; 10A6F;OLD SOUTH ARABIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; 10A70;OLD SOUTH ARABIAN LETTER FE;Lo;0;R;;;;;N;;;;; 10A71;OLD SOUTH ARABIAN LETTER ALEF;Lo;0;R;;;;;N;;;;; 10A72;OLD SOUTH ARABIAN LETTER AYN;Lo;0;R;;;;;N;;;;; 10A73;OLD SOUTH ARABIAN LETTER DHADHE;Lo;0;R;;;;;N;;;;; 10A74;OLD SOUTH ARABIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; 10A75;OLD SOUTH ARABIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; 10A76;OLD SOUTH ARABIAN LETTER GHAYN;Lo;0;R;;;;;N;;;;; 10A77;OLD SOUTH ARABIAN LETTER TETH;Lo;0;R;;;;;N;;;;; 10A78;OLD SOUTH ARABIAN LETTER ZAYN;Lo;0;R;;;;;N;;;;; 10A79;OLD SOUTH ARABIAN LETTER DHALETH;Lo;0;R;;;;;N;;;;; 10A7A;OLD SOUTH ARABIAN LETTER YODH;Lo;0;R;;;;;N;;;;; 10A7B;OLD SOUTH ARABIAN LETTER THAW;Lo;0;R;;;;;N;;;;; 10A7C;OLD SOUTH ARABIAN LETTER THETH;Lo;0;R;;;;;N;;;;; 10A7D;OLD SOUTH ARABIAN NUMBER ONE;No;0;R;;;;1;N;;;;; 10A7E;OLD SOUTH ARABIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;; 10A7F;OLD SOUTH ARABIAN NUMERIC INDICATOR;Po;0;R;;;;;N;;;;; 10A80;OLD NORTH ARABIAN LETTER HEH;Lo;0;R;;;;;N;;;;; 10A81;OLD NORTH ARABIAN LETTER LAM;Lo;0;R;;;;;N;;;;; 10A82;OLD NORTH ARABIAN LETTER HAH;Lo;0;R;;;;;N;;;;; 10A83;OLD NORTH ARABIAN LETTER MEEM;Lo;0;R;;;;;N;;;;; 10A84;OLD NORTH ARABIAN LETTER QAF;Lo;0;R;;;;;N;;;;; 10A85;OLD NORTH ARABIAN LETTER WAW;Lo;0;R;;;;;N;;;;; 10A86;OLD NORTH ARABIAN LETTER ES-2;Lo;0;R;;;;;N;;;;; 10A87;OLD NORTH ARABIAN LETTER REH;Lo;0;R;;;;;N;;;;; 10A88;OLD NORTH ARABIAN LETTER BEH;Lo;0;R;;;;;N;;;;; 10A89;OLD NORTH ARABIAN LETTER TEH;Lo;0;R;;;;;N;;;;; 10A8A;OLD NORTH ARABIAN LETTER ES-1;Lo;0;R;;;;;N;;;;; 10A8B;OLD NORTH ARABIAN LETTER KAF;Lo;0;R;;;;;N;;;;; 10A8C;OLD NORTH ARABIAN LETTER NOON;Lo;0;R;;;;;N;;;;; 10A8D;OLD NORTH ARABIAN LETTER KHAH;Lo;0;R;;;;;N;;;;; 10A8E;OLD NORTH ARABIAN LETTER SAD;Lo;0;R;;;;;N;;;;; 10A8F;OLD NORTH ARABIAN LETTER ES-3;Lo;0;R;;;;;N;;;;; 10A90;OLD NORTH ARABIAN LETTER FEH;Lo;0;R;;;;;N;;;;; 10A91;OLD NORTH ARABIAN LETTER ALEF;Lo;0;R;;;;;N;;;;; 10A92;OLD NORTH ARABIAN LETTER AIN;Lo;0;R;;;;;N;;;;; 10A93;OLD NORTH ARABIAN LETTER DAD;Lo;0;R;;;;;N;;;;; 10A94;OLD NORTH ARABIAN LETTER GEEM;Lo;0;R;;;;;N;;;;; 10A95;OLD NORTH ARABIAN LETTER DAL;Lo;0;R;;;;;N;;;;; 10A96;OLD NORTH ARABIAN LETTER GHAIN;Lo;0;R;;;;;N;;;;; 10A97;OLD NORTH ARABIAN LETTER TAH;Lo;0;R;;;;;N;;;;; 10A98;OLD NORTH ARABIAN LETTER ZAIN;Lo;0;R;;;;;N;;;;; 10A99;OLD NORTH ARABIAN LETTER THAL;Lo;0;R;;;;;N;;;;; 10A9A;OLD NORTH ARABIAN LETTER YEH;Lo;0;R;;;;;N;;;;; 10A9B;OLD NORTH ARABIAN LETTER THEH;Lo;0;R;;;;;N;;;;; 10A9C;OLD NORTH ARABIAN LETTER ZAH;Lo;0;R;;;;;N;;;;; 10A9D;OLD NORTH ARABIAN NUMBER ONE;No;0;R;;;;1;N;;;;; 10A9E;OLD NORTH ARABIAN NUMBER TEN;No;0;R;;;;10;N;;;;; 10A9F;OLD NORTH ARABIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; 10AC0;MANICHAEAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; 10AC1;MANICHAEAN LETTER BETH;Lo;0;R;;;;;N;;;;; 10AC2;MANICHAEAN LETTER BHETH;Lo;0;R;;;;;N;;;;; 10AC3;MANICHAEAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; 10AC4;MANICHAEAN LETTER GHIMEL;Lo;0;R;;;;;N;;;;; 10AC5;MANICHAEAN LETTER DALETH;Lo;0;R;;;;;N;;;;; 10AC6;MANICHAEAN LETTER HE;Lo;0;R;;;;;N;;;;; 10AC7;MANICHAEAN LETTER WAW;Lo;0;R;;;;;N;;;;; 10AC8;MANICHAEAN SIGN UD;So;0;R;;;;;N;;;;; 10AC9;MANICHAEAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; 10ACA;MANICHAEAN LETTER ZHAYIN;Lo;0;R;;;;;N;;;;; 10ACB;MANICHAEAN LETTER JAYIN;Lo;0;R;;;;;N;;;;; 10ACC;MANICHAEAN LETTER JHAYIN;Lo;0;R;;;;;N;;;;; 10ACD;MANICHAEAN LETTER HETH;Lo;0;R;;;;;N;;;;; 10ACE;MANICHAEAN LETTER TETH;Lo;0;R;;;;;N;;;;; 10ACF;MANICHAEAN LETTER YODH;Lo;0;R;;;;;N;;;;; 10AD0;MANICHAEAN LETTER KAPH;Lo;0;R;;;;;N;;;;; 10AD1;MANICHAEAN LETTER XAPH;Lo;0;R;;;;;N;;;;; 10AD2;MANICHAEAN LETTER KHAPH;Lo;0;R;;;;;N;;;;; 10AD3;MANICHAEAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; 10AD4;MANICHAEAN LETTER DHAMEDH;Lo;0;R;;;;;N;;;;; 10AD5;MANICHAEAN LETTER THAMEDH;Lo;0;R;;;;;N;;;;; 10AD6;MANICHAEAN LETTER MEM;Lo;0;R;;;;;N;;;;; 10AD7;MANICHAEAN LETTER NUN;Lo;0;R;;;;;N;;;;; 10AD8;MANICHAEAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; 10AD9;MANICHAEAN LETTER AYIN;Lo;0;R;;;;;N;;;;; 10ADA;MANICHAEAN LETTER AAYIN;Lo;0;R;;;;;N;;;;; 10ADB;MANICHAEAN LETTER PE;Lo;0;R;;;;;N;;;;; 10ADC;MANICHAEAN LETTER FE;Lo;0;R;;;;;N;;;;; 10ADD;MANICHAEAN LETTER SADHE;Lo;0;R;;;;;N;;;;; 10ADE;MANICHAEAN LETTER QOPH;Lo;0;R;;;;;N;;;;; 10ADF;MANICHAEAN LETTER XOPH;Lo;0;R;;;;;N;;;;; 10AE0;MANICHAEAN LETTER QHOPH;Lo;0;R;;;;;N;;;;; 10AE1;MANICHAEAN LETTER RESH;Lo;0;R;;;;;N;;;;; 10AE2;MANICHAEAN LETTER SHIN;Lo;0;R;;;;;N;;;;; 10AE3;MANICHAEAN LETTER SSHIN;Lo;0;R;;;;;N;;;;; 10AE4;MANICHAEAN LETTER TAW;Lo;0;R;;;;;N;;;;; 10AE5;MANICHAEAN ABBREVIATION MARK ABOVE;Mn;230;NSM;;;;;N;;;;; 10AE6;MANICHAEAN ABBREVIATION MARK BELOW;Mn;220;NSM;;;;;N;;;;; 10AEB;MANICHAEAN NUMBER ONE;No;0;R;;;;1;N;;;;; 10AEC;MANICHAEAN NUMBER FIVE;No;0;R;;;;5;N;;;;; 10AED;MANICHAEAN NUMBER TEN;No;0;R;;;;10;N;;;;; 10AEE;MANICHAEAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; 10AEF;MANICHAEAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; 10AF0;MANICHAEAN PUNCTUATION STAR;Po;0;R;;;;;N;;;;; 10AF1;MANICHAEAN PUNCTUATION FLEURON;Po;0;R;;;;;N;;;;; 10AF2;MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT;Po;0;R;;;;;N;;;;; 10AF3;MANICHAEAN PUNCTUATION DOT WITHIN DOT;Po;0;R;;;;;N;;;;; 10AF4;MANICHAEAN PUNCTUATION DOT;Po;0;R;;;;;N;;;;; 10AF5;MANICHAEAN PUNCTUATION TWO DOTS;Po;0;R;;;;;N;;;;; 10AF6;MANICHAEAN PUNCTUATION LINE FILLER;Po;0;R;;;;;N;;;;; 10B00;AVESTAN LETTER A;Lo;0;R;;;;;N;;;;; 10B01;AVESTAN LETTER AA;Lo;0;R;;;;;N;;;;; 10B02;AVESTAN LETTER AO;Lo;0;R;;;;;N;;;;; 10B03;AVESTAN LETTER AAO;Lo;0;R;;;;;N;;;;; 10B04;AVESTAN LETTER AN;Lo;0;R;;;;;N;;;;; 10B05;AVESTAN LETTER AAN;Lo;0;R;;;;;N;;;;; 10B06;AVESTAN LETTER AE;Lo;0;R;;;;;N;;;;; 10B07;AVESTAN LETTER AEE;Lo;0;R;;;;;N;;;;; 10B08;AVESTAN LETTER E;Lo;0;R;;;;;N;;;;; 10B09;AVESTAN LETTER EE;Lo;0;R;;;;;N;;;;; 10B0A;AVESTAN LETTER O;Lo;0;R;;;;;N;;;;; 10B0B;AVESTAN LETTER OO;Lo;0;R;;;;;N;;;;; 10B0C;AVESTAN LETTER I;Lo;0;R;;;;;N;;;;; 10B0D;AVESTAN LETTER II;Lo;0;R;;;;;N;;;;; 10B0E;AVESTAN LETTER U;Lo;0;R;;;;;N;;;;; 10B0F;AVESTAN LETTER UU;Lo;0;R;;;;;N;;;;; 10B10;AVESTAN LETTER KE;Lo;0;R;;;;;N;;;;; 10B11;AVESTAN LETTER XE;Lo;0;R;;;;;N;;;;; 10B12;AVESTAN LETTER XYE;Lo;0;R;;;;;N;;;;; 10B13;AVESTAN LETTER XVE;Lo;0;R;;;;;N;;;;; 10B14;AVESTAN LETTER GE;Lo;0;R;;;;;N;;;;; 10B15;AVESTAN LETTER GGE;Lo;0;R;;;;;N;;;;; 10B16;AVESTAN LETTER GHE;Lo;0;R;;;;;N;;;;; 10B17;AVESTAN LETTER CE;Lo;0;R;;;;;N;;;;; 10B18;AVESTAN LETTER JE;Lo;0;R;;;;;N;;;;; 10B19;AVESTAN LETTER TE;Lo;0;R;;;;;N;;;;; 10B1A;AVESTAN LETTER THE;Lo;0;R;;;;;N;;;;; 10B1B;AVESTAN LETTER DE;Lo;0;R;;;;;N;;;;; 10B1C;AVESTAN LETTER DHE;Lo;0;R;;;;;N;;;;; 10B1D;AVESTAN LETTER TTE;Lo;0;R;;;;;N;;;;; 10B1E;AVESTAN LETTER PE;Lo;0;R;;;;;N;;;;; 10B1F;AVESTAN LETTER FE;Lo;0;R;;;;;N;;;;; 10B20;AVESTAN LETTER BE;Lo;0;R;;;;;N;;;;; 10B21;AVESTAN LETTER BHE;Lo;0;R;;;;;N;;;;; 10B22;AVESTAN LETTER NGE;Lo;0;R;;;;;N;;;;; 10B23;AVESTAN LETTER NGYE;Lo;0;R;;;;;N;;;;; 10B24;AVESTAN LETTER NGVE;Lo;0;R;;;;;N;;;;; 10B25;AVESTAN LETTER NE;Lo;0;R;;;;;N;;;;; 10B26;AVESTAN LETTER NYE;Lo;0;R;;;;;N;;;;; 10B27;AVESTAN LETTER NNE;Lo;0;R;;;;;N;;;;; 10B28;AVESTAN LETTER ME;Lo;0;R;;;;;N;;;;; 10B29;AVESTAN LETTER HME;Lo;0;R;;;;;N;;;;; 10B2A;AVESTAN LETTER YYE;Lo;0;R;;;;;N;;;;; 10B2B;AVESTAN LETTER YE;Lo;0;R;;;;;N;;;;; 10B2C;AVESTAN LETTER VE;Lo;0;R;;;;;N;;;;; 10B2D;AVESTAN LETTER RE;Lo;0;R;;;;;N;;;;; 10B2E;AVESTAN LETTER LE;Lo;0;R;;;;;N;;;;; 10B2F;AVESTAN LETTER SE;Lo;0;R;;;;;N;;;;; 10B30;AVESTAN LETTER ZE;Lo;0;R;;;;;N;;;;; 10B31;AVESTAN LETTER SHE;Lo;0;R;;;;;N;;;;; 10B32;AVESTAN LETTER ZHE;Lo;0;R;;;;;N;;;;; 10B33;AVESTAN LETTER SHYE;Lo;0;R;;;;;N;;;;; 10B34;AVESTAN LETTER SSHE;Lo;0;R;;;;;N;;;;; 10B35;AVESTAN LETTER HE;Lo;0;R;;;;;N;;;;; 10B39;AVESTAN ABBREVIATION MARK;Po;0;ON;;;;;N;;;;; 10B3A;TINY TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; 10B3B;SMALL TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; 10B3C;LARGE TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; 10B3D;LARGE ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;; 10B3E;LARGE TWO RINGS OVER ONE RING PUNCTUATION;Po;0;ON;;;;;N;;;;; 10B3F;LARGE ONE RING OVER TWO RINGS PUNCTUATION;Po;0;ON;;;;;N;;;;; 10B40;INSCRIPTIONAL PARTHIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; 10B41;INSCRIPTIONAL PARTHIAN LETTER BETH;Lo;0;R;;;;;N;;;;; 10B42;INSCRIPTIONAL PARTHIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; 10B43;INSCRIPTIONAL PARTHIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; 10B44;INSCRIPTIONAL PARTHIAN LETTER HE;Lo;0;R;;;;;N;;;;; 10B45;INSCRIPTIONAL PARTHIAN LETTER WAW;Lo;0;R;;;;;N;;;;; 10B46;INSCRIPTIONAL PARTHIAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; 10B47;INSCRIPTIONAL PARTHIAN LETTER HETH;Lo;0;R;;;;;N;;;;; 10B48;INSCRIPTIONAL PARTHIAN LETTER TETH;Lo;0;R;;;;;N;;;;; 10B49;INSCRIPTIONAL PARTHIAN LETTER YODH;Lo;0;R;;;;;N;;;;; 10B4A;INSCRIPTIONAL PARTHIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; 10B4B;INSCRIPTIONAL PARTHIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; 10B4C;INSCRIPTIONAL PARTHIAN LETTER MEM;Lo;0;R;;;;;N;;;;; 10B4D;INSCRIPTIONAL PARTHIAN LETTER NUN;Lo;0;R;;;;;N;;;;; 10B4E;INSCRIPTIONAL PARTHIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; 10B4F;INSCRIPTIONAL PARTHIAN LETTER AYIN;Lo;0;R;;;;;N;;;;; 10B50;INSCRIPTIONAL PARTHIAN LETTER PE;Lo;0;R;;;;;N;;;;; 10B51;INSCRIPTIONAL PARTHIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; 10B52;INSCRIPTIONAL PARTHIAN LETTER QOPH;Lo;0;R;;;;;N;;;;; 10B53;INSCRIPTIONAL PARTHIAN LETTER RESH;Lo;0;R;;;;;N;;;;; 10B54;INSCRIPTIONAL PARTHIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; 10B55;INSCRIPTIONAL PARTHIAN LETTER TAW;Lo;0;R;;;;;N;;;;; 10B58;INSCRIPTIONAL PARTHIAN NUMBER ONE;No;0;R;;;;1;N;;;;; 10B59;INSCRIPTIONAL PARTHIAN NUMBER TWO;No;0;R;;;;2;N;;;;; 10B5A;INSCRIPTIONAL PARTHIAN NUMBER THREE;No;0;R;;;;3;N;;;;; 10B5B;INSCRIPTIONAL PARTHIAN NUMBER FOUR;No;0;R;;;;4;N;;;;; 10B5C;INSCRIPTIONAL PARTHIAN NUMBER TEN;No;0;R;;;;10;N;;;;; 10B5D;INSCRIPTIONAL PARTHIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; 10B5E;INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; 10B5F;INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; 10B60;INSCRIPTIONAL PAHLAVI LETTER ALEPH;Lo;0;R;;;;;N;;;;; 10B61;INSCRIPTIONAL PAHLAVI LETTER BETH;Lo;0;R;;;;;N;;;;; 10B62;INSCRIPTIONAL PAHLAVI LETTER GIMEL;Lo;0;R;;;;;N;;;;; 10B63;INSCRIPTIONAL PAHLAVI LETTER DALETH;Lo;0;R;;;;;N;;;;; 10B64;INSCRIPTIONAL PAHLAVI LETTER HE;Lo;0;R;;;;;N;;;;; 10B65;INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH;Lo;0;R;;;;;N;;;;; 10B66;INSCRIPTIONAL PAHLAVI LETTER ZAYIN;Lo;0;R;;;;;N;;;;; 10B67;INSCRIPTIONAL PAHLAVI LETTER HETH;Lo;0;R;;;;;N;;;;; 10B68;INSCRIPTIONAL PAHLAVI LETTER TETH;Lo;0;R;;;;;N;;;;; 10B69;INSCRIPTIONAL PAHLAVI LETTER YODH;Lo;0;R;;;;;N;;;;; 10B6A;INSCRIPTIONAL PAHLAVI LETTER KAPH;Lo;0;R;;;;;N;;;;; 10B6B;INSCRIPTIONAL PAHLAVI LETTER LAMEDH;Lo;0;R;;;;;N;;;;; 10B6C;INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH;Lo;0;R;;;;;N;;;;; 10B6D;INSCRIPTIONAL PAHLAVI LETTER NUN;Lo;0;R;;;;;N;;;;; 10B6E;INSCRIPTIONAL PAHLAVI LETTER SAMEKH;Lo;0;R;;;;;N;;;;; 10B6F;INSCRIPTIONAL PAHLAVI LETTER PE;Lo;0;R;;;;;N;;;;; 10B70;INSCRIPTIONAL PAHLAVI LETTER SADHE;Lo;0;R;;;;;N;;;;; 10B71;INSCRIPTIONAL PAHLAVI LETTER SHIN;Lo;0;R;;;;;N;;;;; 10B72;INSCRIPTIONAL PAHLAVI LETTER TAW;Lo;0;R;;;;;N;;;;; 10B78;INSCRIPTIONAL PAHLAVI NUMBER ONE;No;0;R;;;;1;N;;;;; 10B79;INSCRIPTIONAL PAHLAVI NUMBER TWO;No;0;R;;;;2;N;;;;; 10B7A;INSCRIPTIONAL PAHLAVI NUMBER THREE;No;0;R;;;;3;N;;;;; 10B7B;INSCRIPTIONAL PAHLAVI NUMBER FOUR;No;0;R;;;;4;N;;;;; 10B7C;INSCRIPTIONAL PAHLAVI NUMBER TEN;No;0;R;;;;10;N;;;;; 10B7D;INSCRIPTIONAL PAHLAVI NUMBER TWENTY;No;0;R;;;;20;N;;;;; 10B7E;INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; 10B7F;INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; 10B80;PSALTER PAHLAVI LETTER ALEPH;Lo;0;R;;;;;N;;;;; 10B81;PSALTER PAHLAVI LETTER BETH;Lo;0;R;;;;;N;;;;; 10B82;PSALTER PAHLAVI LETTER GIMEL;Lo;0;R;;;;;N;;;;; 10B83;PSALTER PAHLAVI LETTER DALETH;Lo;0;R;;;;;N;;;;; 10B84;PSALTER PAHLAVI LETTER HE;Lo;0;R;;;;;N;;;;; 10B85;PSALTER PAHLAVI LETTER WAW-AYIN-RESH;Lo;0;R;;;;;N;;;;; 10B86;PSALTER PAHLAVI LETTER ZAYIN;Lo;0;R;;;;;N;;;;; 10B87;PSALTER PAHLAVI LETTER HETH;Lo;0;R;;;;;N;;;;; 10B88;PSALTER PAHLAVI LETTER YODH;Lo;0;R;;;;;N;;;;; 10B89;PSALTER PAHLAVI LETTER KAPH;Lo;0;R;;;;;N;;;;; 10B8A;PSALTER PAHLAVI LETTER LAMEDH;Lo;0;R;;;;;N;;;;; 10B8B;PSALTER PAHLAVI LETTER MEM-QOPH;Lo;0;R;;;;;N;;;;; 10B8C;PSALTER PAHLAVI LETTER NUN;Lo;0;R;;;;;N;;;;; 10B8D;PSALTER PAHLAVI LETTER SAMEKH;Lo;0;R;;;;;N;;;;; 10B8E;PSALTER PAHLAVI LETTER PE;Lo;0;R;;;;;N;;;;; 10B8F;PSALTER PAHLAVI LETTER SADHE;Lo;0;R;;;;;N;;;;; 10B90;PSALTER PAHLAVI LETTER SHIN;Lo;0;R;;;;;N;;;;; 10B91;PSALTER PAHLAVI LETTER TAW;Lo;0;R;;;;;N;;;;; 10B99;PSALTER PAHLAVI SECTION MARK;Po;0;R;;;;;N;;;;; 10B9A;PSALTER PAHLAVI TURNED SECTION MARK;Po;0;R;;;;;N;;;;; 10B9B;PSALTER PAHLAVI FOUR DOTS WITH CROSS;Po;0;R;;;;;N;;;;; 10B9C;PSALTER PAHLAVI FOUR DOTS WITH DOT;Po;0;R;;;;;N;;;;; 10BA9;PSALTER PAHLAVI NUMBER ONE;No;0;R;;;;1;N;;;;; 10BAA;PSALTER PAHLAVI NUMBER TWO;No;0;R;;;;2;N;;;;; 10BAB;PSALTER PAHLAVI NUMBER THREE;No;0;R;;;;3;N;;;;; 10BAC;PSALTER PAHLAVI NUMBER FOUR;No;0;R;;;;4;N;;;;; 10BAD;PSALTER PAHLAVI NUMBER TEN;No;0;R;;;;10;N;;;;; 10BAE;PSALTER PAHLAVI NUMBER TWENTY;No;0;R;;;;20;N;;;;; 10BAF;PSALTER PAHLAVI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; 10C00;OLD TURKIC LETTER ORKHON A;Lo;0;R;;;;;N;;;;; 10C01;OLD TURKIC LETTER YENISEI A;Lo;0;R;;;;;N;;;;; 10C02;OLD TURKIC LETTER YENISEI AE;Lo;0;R;;;;;N;;;;; 10C03;OLD TURKIC LETTER ORKHON I;Lo;0;R;;;;;N;;;;; 10C04;OLD TURKIC LETTER YENISEI I;Lo;0;R;;;;;N;;;;; 10C05;OLD TURKIC LETTER YENISEI E;Lo;0;R;;;;;N;;;;; 10C06;OLD TURKIC LETTER ORKHON O;Lo;0;R;;;;;N;;;;; 10C07;OLD TURKIC LETTER ORKHON OE;Lo;0;R;;;;;N;;;;; 10C08;OLD TURKIC LETTER YENISEI OE;Lo;0;R;;;;;N;;;;; 10C09;OLD TURKIC LETTER ORKHON AB;Lo;0;R;;;;;N;;;;; 10C0A;OLD TURKIC LETTER YENISEI AB;Lo;0;R;;;;;N;;;;; 10C0B;OLD TURKIC LETTER ORKHON AEB;Lo;0;R;;;;;N;;;;; 10C0C;OLD TURKIC LETTER YENISEI AEB;Lo;0;R;;;;;N;;;;; 10C0D;OLD TURKIC LETTER ORKHON AG;Lo;0;R;;;;;N;;;;; 10C0E;OLD TURKIC LETTER YENISEI AG;Lo;0;R;;;;;N;;;;; 10C0F;OLD TURKIC LETTER ORKHON AEG;Lo;0;R;;;;;N;;;;; 10C10;OLD TURKIC LETTER YENISEI AEG;Lo;0;R;;;;;N;;;;; 10C11;OLD TURKIC LETTER ORKHON AD;Lo;0;R;;;;;N;;;;; 10C12;OLD TURKIC LETTER YENISEI AD;Lo;0;R;;;;;N;;;;; 10C13;OLD TURKIC LETTER ORKHON AED;Lo;0;R;;;;;N;;;;; 10C14;OLD TURKIC LETTER ORKHON EZ;Lo;0;R;;;;;N;;;;; 10C15;OLD TURKIC LETTER YENISEI EZ;Lo;0;R;;;;;N;;;;; 10C16;OLD TURKIC LETTER ORKHON AY;Lo;0;R;;;;;N;;;;; 10C17;OLD TURKIC LETTER YENISEI AY;Lo;0;R;;;;;N;;;;; 10C18;OLD TURKIC LETTER ORKHON AEY;Lo;0;R;;;;;N;;;;; 10C19;OLD TURKIC LETTER YENISEI AEY;Lo;0;R;;;;;N;;;;; 10C1A;OLD TURKIC LETTER ORKHON AEK;Lo;0;R;;;;;N;;;;; 10C1B;OLD TURKIC LETTER YENISEI AEK;Lo;0;R;;;;;N;;;;; 10C1C;OLD TURKIC LETTER ORKHON OEK;Lo;0;R;;;;;N;;;;; 10C1D;OLD TURKIC LETTER YENISEI OEK;Lo;0;R;;;;;N;;;;; 10C1E;OLD TURKIC LETTER ORKHON AL;Lo;0;R;;;;;N;;;;; 10C1F;OLD TURKIC LETTER YENISEI AL;Lo;0;R;;;;;N;;;;; 10C20;OLD TURKIC LETTER ORKHON AEL;Lo;0;R;;;;;N;;;;; 10C21;OLD TURKIC LETTER ORKHON ELT;Lo;0;R;;;;;N;;;;; 10C22;OLD TURKIC LETTER ORKHON EM;Lo;0;R;;;;;N;;;;; 10C23;OLD TURKIC LETTER ORKHON AN;Lo;0;R;;;;;N;;;;; 10C24;OLD TURKIC LETTER ORKHON AEN;Lo;0;R;;;;;N;;;;; 10C25;OLD TURKIC LETTER YENISEI AEN;Lo;0;R;;;;;N;;;;; 10C26;OLD TURKIC LETTER ORKHON ENT;Lo;0;R;;;;;N;;;;; 10C27;OLD TURKIC LETTER YENISEI ENT;Lo;0;R;;;;;N;;;;; 10C28;OLD TURKIC LETTER ORKHON ENC;Lo;0;R;;;;;N;;;;; 10C29;OLD TURKIC LETTER YENISEI ENC;Lo;0;R;;;;;N;;;;; 10C2A;OLD TURKIC LETTER ORKHON ENY;Lo;0;R;;;;;N;;;;; 10C2B;OLD TURKIC LETTER YENISEI ENY;Lo;0;R;;;;;N;;;;; 10C2C;OLD TURKIC LETTER YENISEI ANG;Lo;0;R;;;;;N;;;;; 10C2D;OLD TURKIC LETTER ORKHON ENG;Lo;0;R;;;;;N;;;;; 10C2E;OLD TURKIC LETTER YENISEI AENG;Lo;0;R;;;;;N;;;;; 10C2F;OLD TURKIC LETTER ORKHON EP;Lo;0;R;;;;;N;;;;; 10C30;OLD TURKIC LETTER ORKHON OP;Lo;0;R;;;;;N;;;;; 10C31;OLD TURKIC LETTER ORKHON IC;Lo;0;R;;;;;N;;;;; 10C32;OLD TURKIC LETTER ORKHON EC;Lo;0;R;;;;;N;;;;; 10C33;OLD TURKIC LETTER YENISEI EC;Lo;0;R;;;;;N;;;;; 10C34;OLD TURKIC LETTER ORKHON AQ;Lo;0;R;;;;;N;;;;; 10C35;OLD TURKIC LETTER YENISEI AQ;Lo;0;R;;;;;N;;;;; 10C36;OLD TURKIC LETTER ORKHON IQ;Lo;0;R;;;;;N;;;;; 10C37;OLD TURKIC LETTER YENISEI IQ;Lo;0;R;;;;;N;;;;; 10C38;OLD TURKIC LETTER ORKHON OQ;Lo;0;R;;;;;N;;;;; 10C39;OLD TURKIC LETTER YENISEI OQ;Lo;0;R;;;;;N;;;;; 10C3A;OLD TURKIC LETTER ORKHON AR;Lo;0;R;;;;;N;;;;; 10C3B;OLD TURKIC LETTER YENISEI AR;Lo;0;R;;;;;N;;;;; 10C3C;OLD TURKIC LETTER ORKHON AER;Lo;0;R;;;;;N;;;;; 10C3D;OLD TURKIC LETTER ORKHON AS;Lo;0;R;;;;;N;;;;; 10C3E;OLD TURKIC LETTER ORKHON AES;Lo;0;R;;;;;N;;;;; 10C3F;OLD TURKIC LETTER ORKHON ASH;Lo;0;R;;;;;N;;;;; 10C40;OLD TURKIC LETTER YENISEI ASH;Lo;0;R;;;;;N;;;;; 10C41;OLD TURKIC LETTER ORKHON ESH;Lo;0;R;;;;;N;;;;; 10C42;OLD TURKIC LETTER YENISEI ESH;Lo;0;R;;;;;N;;;;; 10C43;OLD TURKIC LETTER ORKHON AT;Lo;0;R;;;;;N;;;;; 10C44;OLD TURKIC LETTER YENISEI AT;Lo;0;R;;;;;N;;;;; 10C45;OLD TURKIC LETTER ORKHON AET;Lo;0;R;;;;;N;;;;; 10C46;OLD TURKIC LETTER YENISEI AET;Lo;0;R;;;;;N;;;;; 10C47;OLD TURKIC LETTER ORKHON OT;Lo;0;R;;;;;N;;;;; 10C48;OLD TURKIC LETTER ORKHON BASH;Lo;0;R;;;;;N;;;;; 10C80;OLD HUNGARIAN CAPITAL LETTER A;Lu;0;R;;;;;N;;;;10CC0; 10C81;OLD HUNGARIAN CAPITAL LETTER AA;Lu;0;R;;;;;N;;;;10CC1; 10C82;OLD HUNGARIAN CAPITAL LETTER EB;Lu;0;R;;;;;N;;;;10CC2; 10C83;OLD HUNGARIAN CAPITAL LETTER AMB;Lu;0;R;;;;;N;;;;10CC3; 10C84;OLD HUNGARIAN CAPITAL LETTER EC;Lu;0;R;;;;;N;;;;10CC4; 10C85;OLD HUNGARIAN CAPITAL LETTER ENC;Lu;0;R;;;;;N;;;;10CC5; 10C86;OLD HUNGARIAN CAPITAL LETTER ECS;Lu;0;R;;;;;N;;;;10CC6; 10C87;OLD HUNGARIAN CAPITAL LETTER ED;Lu;0;R;;;;;N;;;;10CC7; 10C88;OLD HUNGARIAN CAPITAL LETTER AND;Lu;0;R;;;;;N;;;;10CC8; 10C89;OLD HUNGARIAN CAPITAL LETTER E;Lu;0;R;;;;;N;;;;10CC9; 10C8A;OLD HUNGARIAN CAPITAL LETTER CLOSE E;Lu;0;R;;;;;N;;;;10CCA; 10C8B;OLD HUNGARIAN CAPITAL LETTER EE;Lu;0;R;;;;;N;;;;10CCB; 10C8C;OLD HUNGARIAN CAPITAL LETTER EF;Lu;0;R;;;;;N;;;;10CCC; 10C8D;OLD HUNGARIAN CAPITAL LETTER EG;Lu;0;R;;;;;N;;;;10CCD; 10C8E;OLD HUNGARIAN CAPITAL LETTER EGY;Lu;0;R;;;;;N;;;;10CCE; 10C8F;OLD HUNGARIAN CAPITAL LETTER EH;Lu;0;R;;;;;N;;;;10CCF; 10C90;OLD HUNGARIAN CAPITAL LETTER I;Lu;0;R;;;;;N;;;;10CD0; 10C91;OLD HUNGARIAN CAPITAL LETTER II;Lu;0;R;;;;;N;;;;10CD1; 10C92;OLD HUNGARIAN CAPITAL LETTER EJ;Lu;0;R;;;;;N;;;;10CD2; 10C93;OLD HUNGARIAN CAPITAL LETTER EK;Lu;0;R;;;;;N;;;;10CD3; 10C94;OLD HUNGARIAN CAPITAL LETTER AK;Lu;0;R;;;;;N;;;;10CD4; 10C95;OLD HUNGARIAN CAPITAL LETTER UNK;Lu;0;R;;;;;N;;;;10CD5; 10C96;OLD HUNGARIAN CAPITAL LETTER EL;Lu;0;R;;;;;N;;;;10CD6; 10C97;OLD HUNGARIAN CAPITAL LETTER ELY;Lu;0;R;;;;;N;;;;10CD7; 10C98;OLD HUNGARIAN CAPITAL LETTER EM;Lu;0;R;;;;;N;;;;10CD8; 10C99;OLD HUNGARIAN CAPITAL LETTER EN;Lu;0;R;;;;;N;;;;10CD9; 10C9A;OLD HUNGARIAN CAPITAL LETTER ENY;Lu;0;R;;;;;N;;;;10CDA; 10C9B;OLD HUNGARIAN CAPITAL LETTER O;Lu;0;R;;;;;N;;;;10CDB; 10C9C;OLD HUNGARIAN CAPITAL LETTER OO;Lu;0;R;;;;;N;;;;10CDC; 10C9D;OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE;Lu;0;R;;;;;N;;;;10CDD; 10C9E;OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE;Lu;0;R;;;;;N;;;;10CDE; 10C9F;OLD HUNGARIAN CAPITAL LETTER OEE;Lu;0;R;;;;;N;;;;10CDF; 10CA0;OLD HUNGARIAN CAPITAL LETTER EP;Lu;0;R;;;;;N;;;;10CE0; 10CA1;OLD HUNGARIAN CAPITAL LETTER EMP;Lu;0;R;;;;;N;;;;10CE1; 10CA2;OLD HUNGARIAN CAPITAL LETTER ER;Lu;0;R;;;;;N;;;;10CE2; 10CA3;OLD HUNGARIAN CAPITAL LETTER SHORT ER;Lu;0;R;;;;;N;;;;10CE3; 10CA4;OLD HUNGARIAN CAPITAL LETTER ES;Lu;0;R;;;;;N;;;;10CE4; 10CA5;OLD HUNGARIAN CAPITAL LETTER ESZ;Lu;0;R;;;;;N;;;;10CE5; 10CA6;OLD HUNGARIAN CAPITAL LETTER ET;Lu;0;R;;;;;N;;;;10CE6; 10CA7;OLD HUNGARIAN CAPITAL LETTER ENT;Lu;0;R;;;;;N;;;;10CE7; 10CA8;OLD HUNGARIAN CAPITAL LETTER ETY;Lu;0;R;;;;;N;;;;10CE8; 10CA9;OLD HUNGARIAN CAPITAL LETTER ECH;Lu;0;R;;;;;N;;;;10CE9; 10CAA;OLD HUNGARIAN CAPITAL LETTER U;Lu;0;R;;;;;N;;;;10CEA; 10CAB;OLD HUNGARIAN CAPITAL LETTER UU;Lu;0;R;;;;;N;;;;10CEB; 10CAC;OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE;Lu;0;R;;;;;N;;;;10CEC; 10CAD;OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE;Lu;0;R;;;;;N;;;;10CED; 10CAE;OLD HUNGARIAN CAPITAL LETTER EV;Lu;0;R;;;;;N;;;;10CEE; 10CAF;OLD HUNGARIAN CAPITAL LETTER EZ;Lu;0;R;;;;;N;;;;10CEF; 10CB0;OLD HUNGARIAN CAPITAL LETTER EZS;Lu;0;R;;;;;N;;;;10CF0; 10CB1;OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN;Lu;0;R;;;;;N;;;;10CF1; 10CB2;OLD HUNGARIAN CAPITAL LETTER US;Lu;0;R;;;;;N;;;;10CF2; 10CC0;OLD HUNGARIAN SMALL LETTER A;Ll;0;R;;;;;N;;;10C80;;10C80 10CC1;OLD HUNGARIAN SMALL LETTER AA;Ll;0;R;;;;;N;;;10C81;;10C81 10CC2;OLD HUNGARIAN SMALL LETTER EB;Ll;0;R;;;;;N;;;10C82;;10C82 10CC3;OLD HUNGARIAN SMALL LETTER AMB;Ll;0;R;;;;;N;;;10C83;;10C83 10CC4;OLD HUNGARIAN SMALL LETTER EC;Ll;0;R;;;;;N;;;10C84;;10C84 10CC5;OLD HUNGARIAN SMALL LETTER ENC;Ll;0;R;;;;;N;;;10C85;;10C85 10CC6;OLD HUNGARIAN SMALL LETTER ECS;Ll;0;R;;;;;N;;;10C86;;10C86 10CC7;OLD HUNGARIAN SMALL LETTER ED;Ll;0;R;;;;;N;;;10C87;;10C87 10CC8;OLD HUNGARIAN SMALL LETTER AND;Ll;0;R;;;;;N;;;10C88;;10C88 10CC9;OLD HUNGARIAN SMALL LETTER E;Ll;0;R;;;;;N;;;10C89;;10C89 10CCA;OLD HUNGARIAN SMALL LETTER CLOSE E;Ll;0;R;;;;;N;;;10C8A;;10C8A 10CCB;OLD HUNGARIAN SMALL LETTER EE;Ll;0;R;;;;;N;;;10C8B;;10C8B 10CCC;OLD HUNGARIAN SMALL LETTER EF;Ll;0;R;;;;;N;;;10C8C;;10C8C 10CCD;OLD HUNGARIAN SMALL LETTER EG;Ll;0;R;;;;;N;;;10C8D;;10C8D 10CCE;OLD HUNGARIAN SMALL LETTER EGY;Ll;0;R;;;;;N;;;10C8E;;10C8E 10CCF;OLD HUNGARIAN SMALL LETTER EH;Ll;0;R;;;;;N;;;10C8F;;10C8F 10CD0;OLD HUNGARIAN SMALL LETTER I;Ll;0;R;;;;;N;;;10C90;;10C90 10CD1;OLD HUNGARIAN SMALL LETTER II;Ll;0;R;;;;;N;;;10C91;;10C91 10CD2;OLD HUNGARIAN SMALL LETTER EJ;Ll;0;R;;;;;N;;;10C92;;10C92 10CD3;OLD HUNGARIAN SMALL LETTER EK;Ll;0;R;;;;;N;;;10C93;;10C93 10CD4;OLD HUNGARIAN SMALL LETTER AK;Ll;0;R;;;;;N;;;10C94;;10C94 10CD5;OLD HUNGARIAN SMALL LETTER UNK;Ll;0;R;;;;;N;;;10C95;;10C95 10CD6;OLD HUNGARIAN SMALL LETTER EL;Ll;0;R;;;;;N;;;10C96;;10C96 10CD7;OLD HUNGARIAN SMALL LETTER ELY;Ll;0;R;;;;;N;;;10C97;;10C97 10CD8;OLD HUNGARIAN SMALL LETTER EM;Ll;0;R;;;;;N;;;10C98;;10C98 10CD9;OLD HUNGARIAN SMALL LETTER EN;Ll;0;R;;;;;N;;;10C99;;10C99 10CDA;OLD HUNGARIAN SMALL LETTER ENY;Ll;0;R;;;;;N;;;10C9A;;10C9A 10CDB;OLD HUNGARIAN SMALL LETTER O;Ll;0;R;;;;;N;;;10C9B;;10C9B 10CDC;OLD HUNGARIAN SMALL LETTER OO;Ll;0;R;;;;;N;;;10C9C;;10C9C 10CDD;OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE;Ll;0;R;;;;;N;;;10C9D;;10C9D 10CDE;OLD HUNGARIAN SMALL LETTER RUDIMENTA OE;Ll;0;R;;;;;N;;;10C9E;;10C9E 10CDF;OLD HUNGARIAN SMALL LETTER OEE;Ll;0;R;;;;;N;;;10C9F;;10C9F 10CE0;OLD HUNGARIAN SMALL LETTER EP;Ll;0;R;;;;;N;;;10CA0;;10CA0 10CE1;OLD HUNGARIAN SMALL LETTER EMP;Ll;0;R;;;;;N;;;10CA1;;10CA1 10CE2;OLD HUNGARIAN SMALL LETTER ER;Ll;0;R;;;;;N;;;10CA2;;10CA2 10CE3;OLD HUNGARIAN SMALL LETTER SHORT ER;Ll;0;R;;;;;N;;;10CA3;;10CA3 10CE4;OLD HUNGARIAN SMALL LETTER ES;Ll;0;R;;;;;N;;;10CA4;;10CA4 10CE5;OLD HUNGARIAN SMALL LETTER ESZ;Ll;0;R;;;;;N;;;10CA5;;10CA5 10CE6;OLD HUNGARIAN SMALL LETTER ET;Ll;0;R;;;;;N;;;10CA6;;10CA6 10CE7;OLD HUNGARIAN SMALL LETTER ENT;Ll;0;R;;;;;N;;;10CA7;;10CA7 10CE8;OLD HUNGARIAN SMALL LETTER ETY;Ll;0;R;;;;;N;;;10CA8;;10CA8 10CE9;OLD HUNGARIAN SMALL LETTER ECH;Ll;0;R;;;;;N;;;10CA9;;10CA9 10CEA;OLD HUNGARIAN SMALL LETTER U;Ll;0;R;;;;;N;;;10CAA;;10CAA 10CEB;OLD HUNGARIAN SMALL LETTER UU;Ll;0;R;;;;;N;;;10CAB;;10CAB 10CEC;OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE;Ll;0;R;;;;;N;;;10CAC;;10CAC 10CED;OLD HUNGARIAN SMALL LETTER RUDIMENTA UE;Ll;0;R;;;;;N;;;10CAD;;10CAD 10CEE;OLD HUNGARIAN SMALL LETTER EV;Ll;0;R;;;;;N;;;10CAE;;10CAE 10CEF;OLD HUNGARIAN SMALL LETTER EZ;Ll;0;R;;;;;N;;;10CAF;;10CAF 10CF0;OLD HUNGARIAN SMALL LETTER EZS;Ll;0;R;;;;;N;;;10CB0;;10CB0 10CF1;OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN;Ll;0;R;;;;;N;;;10CB1;;10CB1 10CF2;OLD HUNGARIAN SMALL LETTER US;Ll;0;R;;;;;N;;;10CB2;;10CB2 10CFA;OLD HUNGARIAN NUMBER ONE;No;0;R;;;;1;N;;;;; 10CFB;OLD HUNGARIAN NUMBER FIVE;No;0;R;;;;5;N;;;;; 10CFC;OLD HUNGARIAN NUMBER TEN;No;0;R;;;;10;N;;;;; 10CFD;OLD HUNGARIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;; 10CFE;OLD HUNGARIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; 10CFF;OLD HUNGARIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; 10E60;RUMI DIGIT ONE;No;0;AN;;;1;1;N;;;;; 10E61;RUMI DIGIT TWO;No;0;AN;;;2;2;N;;;;; 10E62;RUMI DIGIT THREE;No;0;AN;;;3;3;N;;;;; 10E63;RUMI DIGIT FOUR;No;0;AN;;;4;4;N;;;;; 10E64;RUMI DIGIT FIVE;No;0;AN;;;5;5;N;;;;; 10E65;RUMI DIGIT SIX;No;0;AN;;;6;6;N;;;;; 10E66;RUMI DIGIT SEVEN;No;0;AN;;;7;7;N;;;;; 10E67;RUMI DIGIT EIGHT;No;0;AN;;;8;8;N;;;;; 10E68;RUMI DIGIT NINE;No;0;AN;;;9;9;N;;;;; 10E69;RUMI NUMBER TEN;No;0;AN;;;;10;N;;;;; 10E6A;RUMI NUMBER TWENTY;No;0;AN;;;;20;N;;;;; 10E6B;RUMI NUMBER THIRTY;No;0;AN;;;;30;N;;;;; 10E6C;RUMI NUMBER FORTY;No;0;AN;;;;40;N;;;;; 10E6D;RUMI NUMBER FIFTY;No;0;AN;;;;50;N;;;;; 10E6E;RUMI NUMBER SIXTY;No;0;AN;;;;60;N;;;;; 10E6F;RUMI NUMBER SEVENTY;No;0;AN;;;;70;N;;;;; 10E70;RUMI NUMBER EIGHTY;No;0;AN;;;;80;N;;;;; 10E71;RUMI NUMBER NINETY;No;0;AN;;;;90;N;;;;; 10E72;RUMI NUMBER ONE HUNDRED;No;0;AN;;;;100;N;;;;; 10E73;RUMI NUMBER TWO HUNDRED;No;0;AN;;;;200;N;;;;; 10E74;RUMI NUMBER THREE HUNDRED;No;0;AN;;;;300;N;;;;; 10E75;RUMI NUMBER FOUR HUNDRED;No;0;AN;;;;400;N;;;;; 10E76;RUMI NUMBER FIVE HUNDRED;No;0;AN;;;;500;N;;;;; 10E77;RUMI NUMBER SIX HUNDRED;No;0;AN;;;;600;N;;;;; 10E78;RUMI NUMBER SEVEN HUNDRED;No;0;AN;;;;700;N;;;;; 10E79;RUMI NUMBER EIGHT HUNDRED;No;0;AN;;;;800;N;;;;; 10E7A;RUMI NUMBER NINE HUNDRED;No;0;AN;;;;900;N;;;;; 10E7B;RUMI FRACTION ONE HALF;No;0;AN;;;;1/2;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;;;;; 11000;BRAHMI SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; 11001;BRAHMI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 11002;BRAHMI SIGN VISARGA;Mc;0;L;;;;;N;;;;; 11003;BRAHMI SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; 11004;BRAHMI SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; 11005;BRAHMI LETTER A;Lo;0;L;;;;;N;;;;; 11006;BRAHMI LETTER AA;Lo;0;L;;;;;N;;;;; 11007;BRAHMI LETTER I;Lo;0;L;;;;;N;;;;; 11008;BRAHMI LETTER II;Lo;0;L;;;;;N;;;;; 11009;BRAHMI LETTER U;Lo;0;L;;;;;N;;;;; 1100A;BRAHMI LETTER UU;Lo;0;L;;;;;N;;;;; 1100B;BRAHMI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; 1100C;BRAHMI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 1100D;BRAHMI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; 1100E;BRAHMI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; 1100F;BRAHMI LETTER E;Lo;0;L;;;;;N;;;;; 11010;BRAHMI LETTER AI;Lo;0;L;;;;;N;;;;; 11011;BRAHMI LETTER O;Lo;0;L;;;;;N;;;;; 11012;BRAHMI LETTER AU;Lo;0;L;;;;;N;;;;; 11013;BRAHMI LETTER KA;Lo;0;L;;;;;N;;;;; 11014;BRAHMI LETTER KHA;Lo;0;L;;;;;N;;;;; 11015;BRAHMI LETTER GA;Lo;0;L;;;;;N;;;;; 11016;BRAHMI LETTER GHA;Lo;0;L;;;;;N;;;;; 11017;BRAHMI LETTER NGA;Lo;0;L;;;;;N;;;;; 11018;BRAHMI LETTER CA;Lo;0;L;;;;;N;;;;; 11019;BRAHMI LETTER CHA;Lo;0;L;;;;;N;;;;; 1101A;BRAHMI LETTER JA;Lo;0;L;;;;;N;;;;; 1101B;BRAHMI LETTER JHA;Lo;0;L;;;;;N;;;;; 1101C;BRAHMI LETTER NYA;Lo;0;L;;;;;N;;;;; 1101D;BRAHMI LETTER TTA;Lo;0;L;;;;;N;;;;; 1101E;BRAHMI LETTER TTHA;Lo;0;L;;;;;N;;;;; 1101F;BRAHMI LETTER DDA;Lo;0;L;;;;;N;;;;; 11020;BRAHMI LETTER DDHA;Lo;0;L;;;;;N;;;;; 11021;BRAHMI LETTER NNA;Lo;0;L;;;;;N;;;;; 11022;BRAHMI LETTER TA;Lo;0;L;;;;;N;;;;; 11023;BRAHMI LETTER THA;Lo;0;L;;;;;N;;;;; 11024;BRAHMI LETTER DA;Lo;0;L;;;;;N;;;;; 11025;BRAHMI LETTER DHA;Lo;0;L;;;;;N;;;;; 11026;BRAHMI LETTER NA;Lo;0;L;;;;;N;;;;; 11027;BRAHMI LETTER PA;Lo;0;L;;;;;N;;;;; 11028;BRAHMI LETTER PHA;Lo;0;L;;;;;N;;;;; 11029;BRAHMI LETTER BA;Lo;0;L;;;;;N;;;;; 1102A;BRAHMI LETTER BHA;Lo;0;L;;;;;N;;;;; 1102B;BRAHMI LETTER MA;Lo;0;L;;;;;N;;;;; 1102C;BRAHMI LETTER YA;Lo;0;L;;;;;N;;;;; 1102D;BRAHMI LETTER RA;Lo;0;L;;;;;N;;;;; 1102E;BRAHMI LETTER LA;Lo;0;L;;;;;N;;;;; 1102F;BRAHMI LETTER VA;Lo;0;L;;;;;N;;;;; 11030;BRAHMI LETTER SHA;Lo;0;L;;;;;N;;;;; 11031;BRAHMI LETTER SSA;Lo;0;L;;;;;N;;;;; 11032;BRAHMI LETTER SA;Lo;0;L;;;;;N;;;;; 11033;BRAHMI LETTER HA;Lo;0;L;;;;;N;;;;; 11034;BRAHMI LETTER LLA;Lo;0;L;;;;;N;;;;; 11035;BRAHMI LETTER OLD TAMIL LLLA;Lo;0;L;;;;;N;;;;; 11036;BRAHMI LETTER OLD TAMIL RRA;Lo;0;L;;;;;N;;;;; 11037;BRAHMI LETTER OLD TAMIL NNNA;Lo;0;L;;;;;N;;;;; 11038;BRAHMI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; 11039;BRAHMI VOWEL SIGN BHATTIPROLU AA;Mn;0;NSM;;;;;N;;;;; 1103A;BRAHMI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; 1103B;BRAHMI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; 1103C;BRAHMI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 1103D;BRAHMI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 1103E;BRAHMI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; 1103F;BRAHMI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; 11040;BRAHMI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; 11041;BRAHMI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; 11042;BRAHMI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; 11043;BRAHMI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; 11044;BRAHMI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; 11045;BRAHMI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; 11046;BRAHMI VIRAMA;Mn;9;NSM;;;;;N;;;;; 11047;BRAHMI DANDA;Po;0;L;;;;;N;;;;; 11048;BRAHMI DOUBLE DANDA;Po;0;L;;;;;N;;;;; 11049;BRAHMI PUNCTUATION DOT;Po;0;L;;;;;N;;;;; 1104A;BRAHMI PUNCTUATION DOUBLE DOT;Po;0;L;;;;;N;;;;; 1104B;BRAHMI PUNCTUATION LINE;Po;0;L;;;;;N;;;;; 1104C;BRAHMI PUNCTUATION CRESCENT BAR;Po;0;L;;;;;N;;;;; 1104D;BRAHMI PUNCTUATION LOTUS;Po;0;L;;;;;N;;;;; 11052;BRAHMI NUMBER ONE;No;0;ON;;;1;1;N;;;;; 11053;BRAHMI NUMBER TWO;No;0;ON;;;2;2;N;;;;; 11054;BRAHMI NUMBER THREE;No;0;ON;;;3;3;N;;;;; 11055;BRAHMI NUMBER FOUR;No;0;ON;;;4;4;N;;;;; 11056;BRAHMI NUMBER FIVE;No;0;ON;;;5;5;N;;;;; 11057;BRAHMI NUMBER SIX;No;0;ON;;;6;6;N;;;;; 11058;BRAHMI NUMBER SEVEN;No;0;ON;;;7;7;N;;;;; 11059;BRAHMI NUMBER EIGHT;No;0;ON;;;8;8;N;;;;; 1105A;BRAHMI NUMBER NINE;No;0;ON;;;9;9;N;;;;; 1105B;BRAHMI NUMBER TEN;No;0;ON;;;;10;N;;;;; 1105C;BRAHMI NUMBER TWENTY;No;0;ON;;;;20;N;;;;; 1105D;BRAHMI NUMBER THIRTY;No;0;ON;;;;30;N;;;;; 1105E;BRAHMI NUMBER FORTY;No;0;ON;;;;40;N;;;;; 1105F;BRAHMI NUMBER FIFTY;No;0;ON;;;;50;N;;;;; 11060;BRAHMI NUMBER SIXTY;No;0;ON;;;;60;N;;;;; 11061;BRAHMI NUMBER SEVENTY;No;0;ON;;;;70;N;;;;; 11062;BRAHMI NUMBER EIGHTY;No;0;ON;;;;80;N;;;;; 11063;BRAHMI NUMBER NINETY;No;0;ON;;;;90;N;;;;; 11064;BRAHMI NUMBER ONE HUNDRED;No;0;ON;;;;100;N;;;;; 11065;BRAHMI NUMBER ONE THOUSAND;No;0;ON;;;;1000;N;;;;; 11066;BRAHMI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 11067;BRAHMI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 11068;BRAHMI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 11069;BRAHMI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 1106A;BRAHMI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 1106B;BRAHMI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 1106C;BRAHMI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 1106D;BRAHMI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 1106E;BRAHMI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 1106F;BRAHMI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 1107F;BRAHMI NUMBER JOINER;Mn;9;NSM;;;;;N;;;;; 11080;KAITHI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 11081;KAITHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 11082;KAITHI SIGN VISARGA;Mc;0;L;;;;;N;;;;; 11083;KAITHI LETTER A;Lo;0;L;;;;;N;;;;; 11084;KAITHI LETTER AA;Lo;0;L;;;;;N;;;;; 11085;KAITHI LETTER I;Lo;0;L;;;;;N;;;;; 11086;KAITHI LETTER II;Lo;0;L;;;;;N;;;;; 11087;KAITHI LETTER U;Lo;0;L;;;;;N;;;;; 11088;KAITHI LETTER UU;Lo;0;L;;;;;N;;;;; 11089;KAITHI LETTER E;Lo;0;L;;;;;N;;;;; 1108A;KAITHI LETTER AI;Lo;0;L;;;;;N;;;;; 1108B;KAITHI LETTER O;Lo;0;L;;;;;N;;;;; 1108C;KAITHI LETTER AU;Lo;0;L;;;;;N;;;;; 1108D;KAITHI LETTER KA;Lo;0;L;;;;;N;;;;; 1108E;KAITHI LETTER KHA;Lo;0;L;;;;;N;;;;; 1108F;KAITHI LETTER GA;Lo;0;L;;;;;N;;;;; 11090;KAITHI LETTER GHA;Lo;0;L;;;;;N;;;;; 11091;KAITHI LETTER NGA;Lo;0;L;;;;;N;;;;; 11092;KAITHI LETTER CA;Lo;0;L;;;;;N;;;;; 11093;KAITHI LETTER CHA;Lo;0;L;;;;;N;;;;; 11094;KAITHI LETTER JA;Lo;0;L;;;;;N;;;;; 11095;KAITHI LETTER JHA;Lo;0;L;;;;;N;;;;; 11096;KAITHI LETTER NYA;Lo;0;L;;;;;N;;;;; 11097;KAITHI LETTER TTA;Lo;0;L;;;;;N;;;;; 11098;KAITHI LETTER TTHA;Lo;0;L;;;;;N;;;;; 11099;KAITHI LETTER DDA;Lo;0;L;;;;;N;;;;; 1109A;KAITHI LETTER DDDHA;Lo;0;L;11099 110BA;;;;N;;;;; 1109B;KAITHI LETTER DDHA;Lo;0;L;;;;;N;;;;; 1109C;KAITHI LETTER RHA;Lo;0;L;1109B 110BA;;;;N;;;;; 1109D;KAITHI LETTER NNA;Lo;0;L;;;;;N;;;;; 1109E;KAITHI LETTER TA;Lo;0;L;;;;;N;;;;; 1109F;KAITHI LETTER THA;Lo;0;L;;;;;N;;;;; 110A0;KAITHI LETTER DA;Lo;0;L;;;;;N;;;;; 110A1;KAITHI LETTER DHA;Lo;0;L;;;;;N;;;;; 110A2;KAITHI LETTER NA;Lo;0;L;;;;;N;;;;; 110A3;KAITHI LETTER PA;Lo;0;L;;;;;N;;;;; 110A4;KAITHI LETTER PHA;Lo;0;L;;;;;N;;;;; 110A5;KAITHI LETTER BA;Lo;0;L;;;;;N;;;;; 110A6;KAITHI LETTER BHA;Lo;0;L;;;;;N;;;;; 110A7;KAITHI LETTER MA;Lo;0;L;;;;;N;;;;; 110A8;KAITHI LETTER YA;Lo;0;L;;;;;N;;;;; 110A9;KAITHI LETTER RA;Lo;0;L;;;;;N;;;;; 110AA;KAITHI LETTER LA;Lo;0;L;;;;;N;;;;; 110AB;KAITHI LETTER VA;Lo;0;L;110A5 110BA;;;;N;;;;; 110AC;KAITHI LETTER SHA;Lo;0;L;;;;;N;;;;; 110AD;KAITHI LETTER SSA;Lo;0;L;;;;;N;;;;; 110AE;KAITHI LETTER SA;Lo;0;L;;;;;N;;;;; 110AF;KAITHI LETTER HA;Lo;0;L;;;;;N;;;;; 110B0;KAITHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 110B1;KAITHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; 110B2;KAITHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; 110B3;KAITHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 110B4;KAITHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 110B5;KAITHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; 110B6;KAITHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; 110B7;KAITHI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; 110B8;KAITHI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; 110B9;KAITHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; 110BA;KAITHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; 110BB;KAITHI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; 110BC;KAITHI ENUMERATION SIGN;Po;0;L;;;;;N;;;;; 110BD;KAITHI NUMBER SIGN;Cf;0;L;;;;;N;;;;; 110BE;KAITHI SECTION MARK;Po;0;L;;;;;N;;;;; 110BF;KAITHI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;; 110C0;KAITHI DANDA;Po;0;L;;;;;N;;;;; 110C1;KAITHI DOUBLE DANDA;Po;0;L;;;;;N;;;;; 110D0;SORA SOMPENG LETTER SAH;Lo;0;L;;;;;N;;;;; 110D1;SORA SOMPENG LETTER TAH;Lo;0;L;;;;;N;;;;; 110D2;SORA SOMPENG LETTER BAH;Lo;0;L;;;;;N;;;;; 110D3;SORA SOMPENG LETTER CAH;Lo;0;L;;;;;N;;;;; 110D4;SORA SOMPENG LETTER DAH;Lo;0;L;;;;;N;;;;; 110D5;SORA SOMPENG LETTER GAH;Lo;0;L;;;;;N;;;;; 110D6;SORA SOMPENG LETTER MAH;Lo;0;L;;;;;N;;;;; 110D7;SORA SOMPENG LETTER NGAH;Lo;0;L;;;;;N;;;;; 110D8;SORA SOMPENG LETTER LAH;Lo;0;L;;;;;N;;;;; 110D9;SORA SOMPENG LETTER NAH;Lo;0;L;;;;;N;;;;; 110DA;SORA SOMPENG LETTER VAH;Lo;0;L;;;;;N;;;;; 110DB;SORA SOMPENG LETTER PAH;Lo;0;L;;;;;N;;;;; 110DC;SORA SOMPENG LETTER YAH;Lo;0;L;;;;;N;;;;; 110DD;SORA SOMPENG LETTER RAH;Lo;0;L;;;;;N;;;;; 110DE;SORA SOMPENG LETTER HAH;Lo;0;L;;;;;N;;;;; 110DF;SORA SOMPENG LETTER KAH;Lo;0;L;;;;;N;;;;; 110E0;SORA SOMPENG LETTER JAH;Lo;0;L;;;;;N;;;;; 110E1;SORA SOMPENG LETTER NYAH;Lo;0;L;;;;;N;;;;; 110E2;SORA SOMPENG LETTER AH;Lo;0;L;;;;;N;;;;; 110E3;SORA SOMPENG LETTER EEH;Lo;0;L;;;;;N;;;;; 110E4;SORA SOMPENG LETTER IH;Lo;0;L;;;;;N;;;;; 110E5;SORA SOMPENG LETTER UH;Lo;0;L;;;;;N;;;;; 110E6;SORA SOMPENG LETTER OH;Lo;0;L;;;;;N;;;;; 110E7;SORA SOMPENG LETTER EH;Lo;0;L;;;;;N;;;;; 110E8;SORA SOMPENG LETTER MAE;Lo;0;L;;;;;N;;;;; 110F0;SORA SOMPENG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 110F1;SORA SOMPENG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 110F2;SORA SOMPENG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 110F3;SORA SOMPENG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 110F4;SORA SOMPENG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 110F5;SORA SOMPENG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 110F6;SORA SOMPENG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 110F7;SORA SOMPENG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 110F8;SORA SOMPENG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 110F9;SORA SOMPENG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 11100;CHAKMA SIGN CANDRABINDU;Mn;230;NSM;;;;;N;;;;; 11101;CHAKMA SIGN ANUSVARA;Mn;230;NSM;;;;;N;;;;; 11102;CHAKMA SIGN VISARGA;Mn;230;NSM;;;;;N;;;;; 11103;CHAKMA LETTER AA;Lo;0;L;;;;;N;;;;; 11104;CHAKMA LETTER I;Lo;0;L;;;;;N;;;;; 11105;CHAKMA LETTER U;Lo;0;L;;;;;N;;;;; 11106;CHAKMA LETTER E;Lo;0;L;;;;;N;;;;; 11107;CHAKMA LETTER KAA;Lo;0;L;;;;;N;;;;; 11108;CHAKMA LETTER KHAA;Lo;0;L;;;;;N;;;;; 11109;CHAKMA LETTER GAA;Lo;0;L;;;;;N;;;;; 1110A;CHAKMA LETTER GHAA;Lo;0;L;;;;;N;;;;; 1110B;CHAKMA LETTER NGAA;Lo;0;L;;;;;N;;;;; 1110C;CHAKMA LETTER CAA;Lo;0;L;;;;;N;;;;; 1110D;CHAKMA LETTER CHAA;Lo;0;L;;;;;N;;;;; 1110E;CHAKMA LETTER JAA;Lo;0;L;;;;;N;;;;; 1110F;CHAKMA LETTER JHAA;Lo;0;L;;;;;N;;;;; 11110;CHAKMA LETTER NYAA;Lo;0;L;;;;;N;;;;; 11111;CHAKMA LETTER TTAA;Lo;0;L;;;;;N;;;;; 11112;CHAKMA LETTER TTHAA;Lo;0;L;;;;;N;;;;; 11113;CHAKMA LETTER DDAA;Lo;0;L;;;;;N;;;;; 11114;CHAKMA LETTER DDHAA;Lo;0;L;;;;;N;;;;; 11115;CHAKMA LETTER NNAA;Lo;0;L;;;;;N;;;;; 11116;CHAKMA LETTER TAA;Lo;0;L;;;;;N;;;;; 11117;CHAKMA LETTER THAA;Lo;0;L;;;;;N;;;;; 11118;CHAKMA LETTER DAA;Lo;0;L;;;;;N;;;;; 11119;CHAKMA LETTER DHAA;Lo;0;L;;;;;N;;;;; 1111A;CHAKMA LETTER NAA;Lo;0;L;;;;;N;;;;; 1111B;CHAKMA LETTER PAA;Lo;0;L;;;;;N;;;;; 1111C;CHAKMA LETTER PHAA;Lo;0;L;;;;;N;;;;; 1111D;CHAKMA LETTER BAA;Lo;0;L;;;;;N;;;;; 1111E;CHAKMA LETTER BHAA;Lo;0;L;;;;;N;;;;; 1111F;CHAKMA LETTER MAA;Lo;0;L;;;;;N;;;;; 11120;CHAKMA LETTER YYAA;Lo;0;L;;;;;N;;;;; 11121;CHAKMA LETTER YAA;Lo;0;L;;;;;N;;;;; 11122;CHAKMA LETTER RAA;Lo;0;L;;;;;N;;;;; 11123;CHAKMA LETTER LAA;Lo;0;L;;;;;N;;;;; 11124;CHAKMA LETTER WAA;Lo;0;L;;;;;N;;;;; 11125;CHAKMA LETTER SAA;Lo;0;L;;;;;N;;;;; 11126;CHAKMA LETTER HAA;Lo;0;L;;;;;N;;;;; 11127;CHAKMA VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;; 11128;CHAKMA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; 11129;CHAKMA VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; 1112A;CHAKMA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 1112B;CHAKMA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 1112C;CHAKMA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; 1112D;CHAKMA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; 1112E;CHAKMA VOWEL SIGN O;Mn;0;NSM;11131 11127;;;;N;;;;; 1112F;CHAKMA VOWEL SIGN AU;Mn;0;NSM;11132 11127;;;;N;;;;; 11130;CHAKMA VOWEL SIGN OI;Mn;0;NSM;;;;;N;;;;; 11131;CHAKMA O MARK;Mn;0;NSM;;;;;N;;;;; 11132;CHAKMA AU MARK;Mn;0;NSM;;;;;N;;;;; 11133;CHAKMA VIRAMA;Mn;9;NSM;;;;;N;;;;; 11134;CHAKMA MAAYYAA;Mn;9;NSM;;;;;N;;;;; 11136;CHAKMA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 11137;CHAKMA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 11138;CHAKMA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 11139;CHAKMA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 1113A;CHAKMA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 1113B;CHAKMA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 1113C;CHAKMA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 1113D;CHAKMA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 1113E;CHAKMA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 1113F;CHAKMA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 11140;CHAKMA SECTION MARK;Po;0;L;;;;;N;;;;; 11141;CHAKMA DANDA;Po;0;L;;;;;N;;;;; 11142;CHAKMA DOUBLE DANDA;Po;0;L;;;;;N;;;;; 11143;CHAKMA QUESTION MARK;Po;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;;;;; 11153;MAHAJANI LETTER E;Lo;0;L;;;;;N;;;;; 11154;MAHAJANI LETTER O;Lo;0;L;;;;;N;;;;; 11155;MAHAJANI LETTER KA;Lo;0;L;;;;;N;;;;; 11156;MAHAJANI LETTER KHA;Lo;0;L;;;;;N;;;;; 11157;MAHAJANI LETTER GA;Lo;0;L;;;;;N;;;;; 11158;MAHAJANI LETTER GHA;Lo;0;L;;;;;N;;;;; 11159;MAHAJANI LETTER CA;Lo;0;L;;;;;N;;;;; 1115A;MAHAJANI LETTER CHA;Lo;0;L;;;;;N;;;;; 1115B;MAHAJANI LETTER JA;Lo;0;L;;;;;N;;;;; 1115C;MAHAJANI LETTER JHA;Lo;0;L;;;;;N;;;;; 1115D;MAHAJANI LETTER NYA;Lo;0;L;;;;;N;;;;; 1115E;MAHAJANI LETTER TTA;Lo;0;L;;;;;N;;;;; 1115F;MAHAJANI LETTER TTHA;Lo;0;L;;;;;N;;;;; 11160;MAHAJANI LETTER DDA;Lo;0;L;;;;;N;;;;; 11161;MAHAJANI LETTER DDHA;Lo;0;L;;;;;N;;;;; 11162;MAHAJANI LETTER NNA;Lo;0;L;;;;;N;;;;; 11163;MAHAJANI LETTER TA;Lo;0;L;;;;;N;;;;; 11164;MAHAJANI LETTER THA;Lo;0;L;;;;;N;;;;; 11165;MAHAJANI LETTER DA;Lo;0;L;;;;;N;;;;; 11166;MAHAJANI LETTER DHA;Lo;0;L;;;;;N;;;;; 11167;MAHAJANI LETTER NA;Lo;0;L;;;;;N;;;;; 11168;MAHAJANI LETTER PA;Lo;0;L;;;;;N;;;;; 11169;MAHAJANI LETTER PHA;Lo;0;L;;;;;N;;;;; 1116A;MAHAJANI LETTER BA;Lo;0;L;;;;;N;;;;; 1116B;MAHAJANI LETTER BHA;Lo;0;L;;;;;N;;;;; 1116C;MAHAJANI LETTER MA;Lo;0;L;;;;;N;;;;; 1116D;MAHAJANI LETTER RA;Lo;0;L;;;;;N;;;;; 1116E;MAHAJANI LETTER LA;Lo;0;L;;;;;N;;;;; 1116F;MAHAJANI LETTER VA;Lo;0;L;;;;;N;;;;; 11170;MAHAJANI LETTER SA;Lo;0;L;;;;;N;;;;; 11171;MAHAJANI LETTER HA;Lo;0;L;;;;;N;;;;; 11172;MAHAJANI LETTER RRA;Lo;0;L;;;;;N;;;;; 11173;MAHAJANI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; 11174;MAHAJANI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; 11175;MAHAJANI SECTION MARK;Po;0;L;;;;;N;;;;; 11176;MAHAJANI LIGATURE SHRI;Lo;0;L;;;;;N;;;;; 11180;SHARADA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 11181;SHARADA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 11182;SHARADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; 11183;SHARADA LETTER A;Lo;0;L;;;;;N;;;;; 11184;SHARADA LETTER AA;Lo;0;L;;;;;N;;;;; 11185;SHARADA LETTER I;Lo;0;L;;;;;N;;;;; 11186;SHARADA LETTER II;Lo;0;L;;;;;N;;;;; 11187;SHARADA LETTER U;Lo;0;L;;;;;N;;;;; 11188;SHARADA LETTER UU;Lo;0;L;;;;;N;;;;; 11189;SHARADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; 1118A;SHARADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 1118B;SHARADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; 1118C;SHARADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; 1118D;SHARADA LETTER E;Lo;0;L;;;;;N;;;;; 1118E;SHARADA LETTER AI;Lo;0;L;;;;;N;;;;; 1118F;SHARADA LETTER O;Lo;0;L;;;;;N;;;;; 11190;SHARADA LETTER AU;Lo;0;L;;;;;N;;;;; 11191;SHARADA LETTER KA;Lo;0;L;;;;;N;;;;; 11192;SHARADA LETTER KHA;Lo;0;L;;;;;N;;;;; 11193;SHARADA LETTER GA;Lo;0;L;;;;;N;;;;; 11194;SHARADA LETTER GHA;Lo;0;L;;;;;N;;;;; 11195;SHARADA LETTER NGA;Lo;0;L;;;;;N;;;;; 11196;SHARADA LETTER CA;Lo;0;L;;;;;N;;;;; 11197;SHARADA LETTER CHA;Lo;0;L;;;;;N;;;;; 11198;SHARADA LETTER JA;Lo;0;L;;;;;N;;;;; 11199;SHARADA LETTER JHA;Lo;0;L;;;;;N;;;;; 1119A;SHARADA LETTER NYA;Lo;0;L;;;;;N;;;;; 1119B;SHARADA LETTER TTA;Lo;0;L;;;;;N;;;;; 1119C;SHARADA LETTER TTHA;Lo;0;L;;;;;N;;;;; 1119D;SHARADA LETTER DDA;Lo;0;L;;;;;N;;;;; 1119E;SHARADA LETTER DDHA;Lo;0;L;;;;;N;;;;; 1119F;SHARADA LETTER NNA;Lo;0;L;;;;;N;;;;; 111A0;SHARADA LETTER TA;Lo;0;L;;;;;N;;;;; 111A1;SHARADA LETTER THA;Lo;0;L;;;;;N;;;;; 111A2;SHARADA LETTER DA;Lo;0;L;;;;;N;;;;; 111A3;SHARADA LETTER DHA;Lo;0;L;;;;;N;;;;; 111A4;SHARADA LETTER NA;Lo;0;L;;;;;N;;;;; 111A5;SHARADA LETTER PA;Lo;0;L;;;;;N;;;;; 111A6;SHARADA LETTER PHA;Lo;0;L;;;;;N;;;;; 111A7;SHARADA LETTER BA;Lo;0;L;;;;;N;;;;; 111A8;SHARADA LETTER BHA;Lo;0;L;;;;;N;;;;; 111A9;SHARADA LETTER MA;Lo;0;L;;;;;N;;;;; 111AA;SHARADA LETTER YA;Lo;0;L;;;;;N;;;;; 111AB;SHARADA LETTER RA;Lo;0;L;;;;;N;;;;; 111AC;SHARADA LETTER LA;Lo;0;L;;;;;N;;;;; 111AD;SHARADA LETTER LLA;Lo;0;L;;;;;N;;;;; 111AE;SHARADA LETTER VA;Lo;0;L;;;;;N;;;;; 111AF;SHARADA LETTER SHA;Lo;0;L;;;;;N;;;;; 111B0;SHARADA LETTER SSA;Lo;0;L;;;;;N;;;;; 111B1;SHARADA LETTER SA;Lo;0;L;;;;;N;;;;; 111B2;SHARADA LETTER HA;Lo;0;L;;;;;N;;;;; 111B3;SHARADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 111B4;SHARADA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; 111B5;SHARADA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; 111B6;SHARADA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 111B7;SHARADA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 111B8;SHARADA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; 111B9;SHARADA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; 111BA;SHARADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; 111BB;SHARADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; 111BC;SHARADA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; 111BD;SHARADA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; 111BE;SHARADA VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; 111BF;SHARADA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; 111C0;SHARADA SIGN VIRAMA;Mc;9;L;;;;;N;;;;; 111C1;SHARADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; 111C2;SHARADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; 111C3;SHARADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; 111C4;SHARADA OM;Lo;0;L;;;;;N;;;;; 111C5;SHARADA DANDA;Po;0;L;;;;;N;;;;; 111C6;SHARADA DOUBLE DANDA;Po;0;L;;;;;N;;;;; 111C7;SHARADA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; 111C8;SHARADA SEPARATOR;Po;0;L;;;;;N;;;;; 111C9;SHARADA SANDHI MARK;Po;0;L;;;;;N;;;;; 111CA;SHARADA SIGN NUKTA;Mn;7;NSM;;;;;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;;;;; 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;;;;; 111D3;SHARADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 111D4;SHARADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 111D5;SHARADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 111D6;SHARADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 111D7;SHARADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 111D8;SHARADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 111D9;SHARADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 111DA;SHARADA EKAM;Lo;0;L;;;;;N;;;;; 111DB;SHARADA SIGN SIDDHAM;Po;0;L;;;;;N;;;;; 111DC;SHARADA HEADSTROKE;Lo;0;L;;;;;N;;;;; 111DD;SHARADA CONTINUATION SIGN;Po;0;L;;;;;N;;;;; 111DE;SHARADA SECTION MARK-1;Po;0;L;;;;;N;;;;; 111DF;SHARADA SECTION MARK-2;Po;0;L;;;;;N;;;;; 111E1;SINHALA ARCHAIC DIGIT ONE;No;0;L;;;;1;N;;;;; 111E2;SINHALA ARCHAIC DIGIT TWO;No;0;L;;;;2;N;;;;; 111E3;SINHALA ARCHAIC DIGIT THREE;No;0;L;;;;3;N;;;;; 111E4;SINHALA ARCHAIC DIGIT FOUR;No;0;L;;;;4;N;;;;; 111E5;SINHALA ARCHAIC DIGIT FIVE;No;0;L;;;;5;N;;;;; 111E6;SINHALA ARCHAIC DIGIT SIX;No;0;L;;;;6;N;;;;; 111E7;SINHALA ARCHAIC DIGIT SEVEN;No;0;L;;;;7;N;;;;; 111E8;SINHALA ARCHAIC DIGIT EIGHT;No;0;L;;;;8;N;;;;; 111E9;SINHALA ARCHAIC DIGIT NINE;No;0;L;;;;9;N;;;;; 111EA;SINHALA ARCHAIC NUMBER TEN;No;0;L;;;;10;N;;;;; 111EB;SINHALA ARCHAIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; 111EC;SINHALA ARCHAIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; 111ED;SINHALA ARCHAIC NUMBER FORTY;No;0;L;;;;40;N;;;;; 111EE;SINHALA ARCHAIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; 111EF;SINHALA ARCHAIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; 111F0;SINHALA ARCHAIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; 111F1;SINHALA ARCHAIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; 111F2;SINHALA ARCHAIC NUMBER NINETY;No;0;L;;;;90;N;;;;; 111F3;SINHALA ARCHAIC NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; 111F4;SINHALA ARCHAIC NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; 11200;KHOJKI LETTER A;Lo;0;L;;;;;N;;;;; 11201;KHOJKI LETTER AA;Lo;0;L;;;;;N;;;;; 11202;KHOJKI LETTER I;Lo;0;L;;;;;N;;;;; 11203;KHOJKI LETTER U;Lo;0;L;;;;;N;;;;; 11204;KHOJKI LETTER E;Lo;0;L;;;;;N;;;;; 11205;KHOJKI LETTER AI;Lo;0;L;;;;;N;;;;; 11206;KHOJKI LETTER O;Lo;0;L;;;;;N;;;;; 11207;KHOJKI LETTER AU;Lo;0;L;;;;;N;;;;; 11208;KHOJKI LETTER KA;Lo;0;L;;;;;N;;;;; 11209;KHOJKI LETTER KHA;Lo;0;L;;;;;N;;;;; 1120A;KHOJKI LETTER GA;Lo;0;L;;;;;N;;;;; 1120B;KHOJKI LETTER GGA;Lo;0;L;;;;;N;;;;; 1120C;KHOJKI LETTER GHA;Lo;0;L;;;;;N;;;;; 1120D;KHOJKI LETTER NGA;Lo;0;L;;;;;N;;;;; 1120E;KHOJKI LETTER CA;Lo;0;L;;;;;N;;;;; 1120F;KHOJKI LETTER CHA;Lo;0;L;;;;;N;;;;; 11210;KHOJKI LETTER JA;Lo;0;L;;;;;N;;;;; 11211;KHOJKI LETTER JJA;Lo;0;L;;;;;N;;;;; 11213;KHOJKI LETTER NYA;Lo;0;L;;;;;N;;;;; 11214;KHOJKI LETTER TTA;Lo;0;L;;;;;N;;;;; 11215;KHOJKI LETTER TTHA;Lo;0;L;;;;;N;;;;; 11216;KHOJKI LETTER DDA;Lo;0;L;;;;;N;;;;; 11217;KHOJKI LETTER DDHA;Lo;0;L;;;;;N;;;;; 11218;KHOJKI LETTER NNA;Lo;0;L;;;;;N;;;;; 11219;KHOJKI LETTER TA;Lo;0;L;;;;;N;;;;; 1121A;KHOJKI LETTER THA;Lo;0;L;;;;;N;;;;; 1121B;KHOJKI LETTER DA;Lo;0;L;;;;;N;;;;; 1121C;KHOJKI LETTER DDDA;Lo;0;L;;;;;N;;;;; 1121D;KHOJKI LETTER DHA;Lo;0;L;;;;;N;;;;; 1121E;KHOJKI LETTER NA;Lo;0;L;;;;;N;;;;; 1121F;KHOJKI LETTER PA;Lo;0;L;;;;;N;;;;; 11220;KHOJKI LETTER PHA;Lo;0;L;;;;;N;;;;; 11221;KHOJKI LETTER BA;Lo;0;L;;;;;N;;;;; 11222;KHOJKI LETTER BBA;Lo;0;L;;;;;N;;;;; 11223;KHOJKI LETTER BHA;Lo;0;L;;;;;N;;;;; 11224;KHOJKI LETTER MA;Lo;0;L;;;;;N;;;;; 11225;KHOJKI LETTER YA;Lo;0;L;;;;;N;;;;; 11226;KHOJKI LETTER RA;Lo;0;L;;;;;N;;;;; 11227;KHOJKI LETTER LA;Lo;0;L;;;;;N;;;;; 11228;KHOJKI LETTER VA;Lo;0;L;;;;;N;;;;; 11229;KHOJKI LETTER SA;Lo;0;L;;;;;N;;;;; 1122A;KHOJKI LETTER HA;Lo;0;L;;;;;N;;;;; 1122B;KHOJKI LETTER LLA;Lo;0;L;;;;;N;;;;; 1122C;KHOJKI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 1122D;KHOJKI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; 1122E;KHOJKI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; 1122F;KHOJKI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 11230;KHOJKI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; 11231;KHOJKI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; 11232;KHOJKI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; 11233;KHOJKI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; 11234;KHOJKI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 11235;KHOJKI SIGN VIRAMA;Mc;9;L;;;;;N;;;;; 11236;KHOJKI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; 11237;KHOJKI SIGN SHADDA;Mn;0;NSM;;;;;N;;;;; 11238;KHOJKI DANDA;Po;0;L;;;;;N;;;;; 11239;KHOJKI DOUBLE DANDA;Po;0;L;;;;;N;;;;; 1123A;KHOJKI WORD SEPARATOR;Po;0;L;;;;;N;;;;; 1123B;KHOJKI SECTION MARK;Po;0;L;;;;;N;;;;; 1123C;KHOJKI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;; 1123D;KHOJKI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; 1123E;KHOJKI SIGN SUKUN;Mn;0;NSM;;;;;N;;;;; 11280;MULTANI LETTER A;Lo;0;L;;;;;N;;;;; 11281;MULTANI LETTER I;Lo;0;L;;;;;N;;;;; 11282;MULTANI LETTER U;Lo;0;L;;;;;N;;;;; 11283;MULTANI LETTER E;Lo;0;L;;;;;N;;;;; 11284;MULTANI LETTER KA;Lo;0;L;;;;;N;;;;; 11285;MULTANI LETTER KHA;Lo;0;L;;;;;N;;;;; 11286;MULTANI LETTER GA;Lo;0;L;;;;;N;;;;; 11288;MULTANI LETTER GHA;Lo;0;L;;;;;N;;;;; 1128A;MULTANI LETTER CA;Lo;0;L;;;;;N;;;;; 1128B;MULTANI LETTER CHA;Lo;0;L;;;;;N;;;;; 1128C;MULTANI LETTER JA;Lo;0;L;;;;;N;;;;; 1128D;MULTANI LETTER JJA;Lo;0;L;;;;;N;;;;; 1128F;MULTANI LETTER NYA;Lo;0;L;;;;;N;;;;; 11290;MULTANI LETTER TTA;Lo;0;L;;;;;N;;;;; 11291;MULTANI LETTER TTHA;Lo;0;L;;;;;N;;;;; 11292;MULTANI LETTER DDA;Lo;0;L;;;;;N;;;;; 11293;MULTANI LETTER DDDA;Lo;0;L;;;;;N;;;;; 11294;MULTANI LETTER DDHA;Lo;0;L;;;;;N;;;;; 11295;MULTANI LETTER NNA;Lo;0;L;;;;;N;;;;; 11296;MULTANI LETTER TA;Lo;0;L;;;;;N;;;;; 11297;MULTANI LETTER THA;Lo;0;L;;;;;N;;;;; 11298;MULTANI LETTER DA;Lo;0;L;;;;;N;;;;; 11299;MULTANI LETTER DHA;Lo;0;L;;;;;N;;;;; 1129A;MULTANI LETTER NA;Lo;0;L;;;;;N;;;;; 1129B;MULTANI LETTER PA;Lo;0;L;;;;;N;;;;; 1129C;MULTANI LETTER PHA;Lo;0;L;;;;;N;;;;; 1129D;MULTANI LETTER BA;Lo;0;L;;;;;N;;;;; 1129F;MULTANI LETTER BHA;Lo;0;L;;;;;N;;;;; 112A0;MULTANI LETTER MA;Lo;0;L;;;;;N;;;;; 112A1;MULTANI LETTER YA;Lo;0;L;;;;;N;;;;; 112A2;MULTANI LETTER RA;Lo;0;L;;;;;N;;;;; 112A3;MULTANI LETTER LA;Lo;0;L;;;;;N;;;;; 112A4;MULTANI LETTER VA;Lo;0;L;;;;;N;;;;; 112A5;MULTANI LETTER SA;Lo;0;L;;;;;N;;;;; 112A6;MULTANI LETTER HA;Lo;0;L;;;;;N;;;;; 112A7;MULTANI LETTER RRA;Lo;0;L;;;;;N;;;;; 112A8;MULTANI LETTER RHA;Lo;0;L;;;;;N;;;;; 112A9;MULTANI SECTION MARK;Po;0;L;;;;;N;;;;; 112B0;KHUDAWADI LETTER A;Lo;0;L;;;;;N;;;;; 112B1;KHUDAWADI LETTER AA;Lo;0;L;;;;;N;;;;; 112B2;KHUDAWADI LETTER I;Lo;0;L;;;;;N;;;;; 112B3;KHUDAWADI LETTER II;Lo;0;L;;;;;N;;;;; 112B4;KHUDAWADI LETTER U;Lo;0;L;;;;;N;;;;; 112B5;KHUDAWADI LETTER UU;Lo;0;L;;;;;N;;;;; 112B6;KHUDAWADI LETTER E;Lo;0;L;;;;;N;;;;; 112B7;KHUDAWADI LETTER AI;Lo;0;L;;;;;N;;;;; 112B8;KHUDAWADI LETTER O;Lo;0;L;;;;;N;;;;; 112B9;KHUDAWADI LETTER AU;Lo;0;L;;;;;N;;;;; 112BA;KHUDAWADI LETTER KA;Lo;0;L;;;;;N;;;;; 112BB;KHUDAWADI LETTER KHA;Lo;0;L;;;;;N;;;;; 112BC;KHUDAWADI LETTER GA;Lo;0;L;;;;;N;;;;; 112BD;KHUDAWADI LETTER GGA;Lo;0;L;;;;;N;;;;; 112BE;KHUDAWADI LETTER GHA;Lo;0;L;;;;;N;;;;; 112BF;KHUDAWADI LETTER NGA;Lo;0;L;;;;;N;;;;; 112C0;KHUDAWADI LETTER CA;Lo;0;L;;;;;N;;;;; 112C1;KHUDAWADI LETTER CHA;Lo;0;L;;;;;N;;;;; 112C2;KHUDAWADI LETTER JA;Lo;0;L;;;;;N;;;;; 112C3;KHUDAWADI LETTER JJA;Lo;0;L;;;;;N;;;;; 112C4;KHUDAWADI LETTER JHA;Lo;0;L;;;;;N;;;;; 112C5;KHUDAWADI LETTER NYA;Lo;0;L;;;;;N;;;;; 112C6;KHUDAWADI LETTER TTA;Lo;0;L;;;;;N;;;;; 112C7;KHUDAWADI LETTER TTHA;Lo;0;L;;;;;N;;;;; 112C8;KHUDAWADI LETTER DDA;Lo;0;L;;;;;N;;;;; 112C9;KHUDAWADI LETTER DDDA;Lo;0;L;;;;;N;;;;; 112CA;KHUDAWADI LETTER RRA;Lo;0;L;;;;;N;;;;; 112CB;KHUDAWADI LETTER DDHA;Lo;0;L;;;;;N;;;;; 112CC;KHUDAWADI LETTER NNA;Lo;0;L;;;;;N;;;;; 112CD;KHUDAWADI LETTER TA;Lo;0;L;;;;;N;;;;; 112CE;KHUDAWADI LETTER THA;Lo;0;L;;;;;N;;;;; 112CF;KHUDAWADI LETTER DA;Lo;0;L;;;;;N;;;;; 112D0;KHUDAWADI LETTER DHA;Lo;0;L;;;;;N;;;;; 112D1;KHUDAWADI LETTER NA;Lo;0;L;;;;;N;;;;; 112D2;KHUDAWADI LETTER PA;Lo;0;L;;;;;N;;;;; 112D3;KHUDAWADI LETTER PHA;Lo;0;L;;;;;N;;;;; 112D4;KHUDAWADI LETTER BA;Lo;0;L;;;;;N;;;;; 112D5;KHUDAWADI LETTER BBA;Lo;0;L;;;;;N;;;;; 112D6;KHUDAWADI LETTER BHA;Lo;0;L;;;;;N;;;;; 112D7;KHUDAWADI LETTER MA;Lo;0;L;;;;;N;;;;; 112D8;KHUDAWADI LETTER YA;Lo;0;L;;;;;N;;;;; 112D9;KHUDAWADI LETTER RA;Lo;0;L;;;;;N;;;;; 112DA;KHUDAWADI LETTER LA;Lo;0;L;;;;;N;;;;; 112DB;KHUDAWADI LETTER VA;Lo;0;L;;;;;N;;;;; 112DC;KHUDAWADI LETTER SHA;Lo;0;L;;;;;N;;;;; 112DD;KHUDAWADI LETTER SA;Lo;0;L;;;;;N;;;;; 112DE;KHUDAWADI LETTER HA;Lo;0;L;;;;;N;;;;; 112DF;KHUDAWADI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 112E0;KHUDAWADI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 112E1;KHUDAWADI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; 112E2;KHUDAWADI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; 112E3;KHUDAWADI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 112E4;KHUDAWADI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 112E5;KHUDAWADI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; 112E6;KHUDAWADI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; 112E7;KHUDAWADI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; 112E8;KHUDAWADI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; 112E9;KHUDAWADI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; 112EA;KHUDAWADI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; 112F0;KHUDAWADI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 112F1;KHUDAWADI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 112F2;KHUDAWADI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 112F3;KHUDAWADI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 112F4;KHUDAWADI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 112F5;KHUDAWADI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 112F6;KHUDAWADI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 112F7;KHUDAWADI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 112F8;KHUDAWADI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 112F9;KHUDAWADI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 11300;GRANTHA SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;; 11301;GRANTHA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 11302;GRANTHA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; 11303;GRANTHA SIGN VISARGA;Mc;0;L;;;;;N;;;;; 11305;GRANTHA LETTER A;Lo;0;L;;;;;N;;;;; 11306;GRANTHA LETTER AA;Lo;0;L;;;;;N;;;;; 11307;GRANTHA LETTER I;Lo;0;L;;;;;N;;;;; 11308;GRANTHA LETTER II;Lo;0;L;;;;;N;;;;; 11309;GRANTHA LETTER U;Lo;0;L;;;;;N;;;;; 1130A;GRANTHA LETTER UU;Lo;0;L;;;;;N;;;;; 1130B;GRANTHA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; 1130C;GRANTHA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; 1130F;GRANTHA LETTER EE;Lo;0;L;;;;;N;;;;; 11310;GRANTHA LETTER AI;Lo;0;L;;;;;N;;;;; 11313;GRANTHA LETTER OO;Lo;0;L;;;;;N;;;;; 11314;GRANTHA LETTER AU;Lo;0;L;;;;;N;;;;; 11315;GRANTHA LETTER KA;Lo;0;L;;;;;N;;;;; 11316;GRANTHA LETTER KHA;Lo;0;L;;;;;N;;;;; 11317;GRANTHA LETTER GA;Lo;0;L;;;;;N;;;;; 11318;GRANTHA LETTER GHA;Lo;0;L;;;;;N;;;;; 11319;GRANTHA LETTER NGA;Lo;0;L;;;;;N;;;;; 1131A;GRANTHA LETTER CA;Lo;0;L;;;;;N;;;;; 1131B;GRANTHA LETTER CHA;Lo;0;L;;;;;N;;;;; 1131C;GRANTHA LETTER JA;Lo;0;L;;;;;N;;;;; 1131D;GRANTHA LETTER JHA;Lo;0;L;;;;;N;;;;; 1131E;GRANTHA LETTER NYA;Lo;0;L;;;;;N;;;;; 1131F;GRANTHA LETTER TTA;Lo;0;L;;;;;N;;;;; 11320;GRANTHA LETTER TTHA;Lo;0;L;;;;;N;;;;; 11321;GRANTHA LETTER DDA;Lo;0;L;;;;;N;;;;; 11322;GRANTHA LETTER DDHA;Lo;0;L;;;;;N;;;;; 11323;GRANTHA LETTER NNA;Lo;0;L;;;;;N;;;;; 11324;GRANTHA LETTER TA;Lo;0;L;;;;;N;;;;; 11325;GRANTHA LETTER THA;Lo;0;L;;;;;N;;;;; 11326;GRANTHA LETTER DA;Lo;0;L;;;;;N;;;;; 11327;GRANTHA LETTER DHA;Lo;0;L;;;;;N;;;;; 11328;GRANTHA LETTER NA;Lo;0;L;;;;;N;;;;; 1132A;GRANTHA LETTER PA;Lo;0;L;;;;;N;;;;; 1132B;GRANTHA LETTER PHA;Lo;0;L;;;;;N;;;;; 1132C;GRANTHA LETTER BA;Lo;0;L;;;;;N;;;;; 1132D;GRANTHA LETTER BHA;Lo;0;L;;;;;N;;;;; 1132E;GRANTHA LETTER MA;Lo;0;L;;;;;N;;;;; 1132F;GRANTHA LETTER YA;Lo;0;L;;;;;N;;;;; 11330;GRANTHA LETTER RA;Lo;0;L;;;;;N;;;;; 11332;GRANTHA LETTER LA;Lo;0;L;;;;;N;;;;; 11333;GRANTHA LETTER LLA;Lo;0;L;;;;;N;;;;; 11335;GRANTHA LETTER VA;Lo;0;L;;;;;N;;;;; 11336;GRANTHA LETTER SHA;Lo;0;L;;;;;N;;;;; 11337;GRANTHA LETTER SSA;Lo;0;L;;;;;N;;;;; 11338;GRANTHA LETTER SA;Lo;0;L;;;;;N;;;;; 11339;GRANTHA LETTER HA;Lo;0;L;;;;;N;;;;; 1133C;GRANTHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; 1133D;GRANTHA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; 1133E;GRANTHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 1133F;GRANTHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; 11340;GRANTHA VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; 11341;GRANTHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; 11342;GRANTHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; 11343;GRANTHA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; 11344;GRANTHA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; 11347;GRANTHA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; 11348;GRANTHA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; 1134B;GRANTHA VOWEL SIGN OO;Mc;0;L;11347 1133E;;;;N;;;;; 1134C;GRANTHA VOWEL SIGN AU;Mc;0;L;11347 11357;;;;N;;;;; 1134D;GRANTHA SIGN VIRAMA;Mc;9;L;;;;;N;;;;; 11350;GRANTHA OM;Lo;0;L;;;;;N;;;;; 11357;GRANTHA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; 1135D;GRANTHA SIGN PLUTA;Lo;0;L;;;;;N;;;;; 1135E;GRANTHA LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;; 1135F;GRANTHA LETTER VEDIC DOUBLE ANUSVARA;Lo;0;L;;;;;N;;;;; 11360;GRANTHA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 11361;GRANTHA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; 11362;GRANTHA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;; 11363;GRANTHA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;; 11366;COMBINING GRANTHA DIGIT ZERO;Mn;230;NSM;;;;;N;;;;; 11367;COMBINING GRANTHA DIGIT ONE;Mn;230;NSM;;;;;N;;;;; 11368;COMBINING GRANTHA DIGIT TWO;Mn;230;NSM;;;;;N;;;;; 11369;COMBINING GRANTHA DIGIT THREE;Mn;230;NSM;;;;;N;;;;; 1136A;COMBINING GRANTHA DIGIT FOUR;Mn;230;NSM;;;;;N;;;;; 1136B;COMBINING GRANTHA DIGIT FIVE;Mn;230;NSM;;;;;N;;;;; 1136C;COMBINING GRANTHA DIGIT SIX;Mn;230;NSM;;;;;N;;;;; 11370;COMBINING GRANTHA LETTER A;Mn;230;NSM;;;;;N;;;;; 11371;COMBINING GRANTHA LETTER KA;Mn;230;NSM;;;;;N;;;;; 11372;COMBINING GRANTHA LETTER NA;Mn;230;NSM;;;;;N;;;;; 11373;COMBINING GRANTHA LETTER VI;Mn;230;NSM;;;;;N;;;;; 11374;COMBINING GRANTHA LETTER PA;Mn;230;NSM;;;;;N;;;;; 11400;NEWA LETTER A;Lo;0;L;;;;;N;;;;; 11401;NEWA LETTER AA;Lo;0;L;;;;;N;;;;; 11402;NEWA LETTER I;Lo;0;L;;;;;N;;;;; 11403;NEWA LETTER II;Lo;0;L;;;;;N;;;;; 11404;NEWA LETTER U;Lo;0;L;;;;;N;;;;; 11405;NEWA LETTER UU;Lo;0;L;;;;;N;;;;; 11406;NEWA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; 11407;NEWA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 11408;NEWA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; 11409;NEWA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; 1140A;NEWA LETTER E;Lo;0;L;;;;;N;;;;; 1140B;NEWA LETTER AI;Lo;0;L;;;;;N;;;;; 1140C;NEWA LETTER O;Lo;0;L;;;;;N;;;;; 1140D;NEWA LETTER AU;Lo;0;L;;;;;N;;;;; 1140E;NEWA LETTER KA;Lo;0;L;;;;;N;;;;; 1140F;NEWA LETTER KHA;Lo;0;L;;;;;N;;;;; 11410;NEWA LETTER GA;Lo;0;L;;;;;N;;;;; 11411;NEWA LETTER GHA;Lo;0;L;;;;;N;;;;; 11412;NEWA LETTER NGA;Lo;0;L;;;;;N;;;;; 11413;NEWA LETTER NGHA;Lo;0;L;;;;;N;;;;; 11414;NEWA LETTER CA;Lo;0;L;;;;;N;;;;; 11415;NEWA LETTER CHA;Lo;0;L;;;;;N;;;;; 11416;NEWA LETTER JA;Lo;0;L;;;;;N;;;;; 11417;NEWA LETTER JHA;Lo;0;L;;;;;N;;;;; 11418;NEWA LETTER NYA;Lo;0;L;;;;;N;;;;; 11419;NEWA LETTER NYHA;Lo;0;L;;;;;N;;;;; 1141A;NEWA LETTER TTA;Lo;0;L;;;;;N;;;;; 1141B;NEWA LETTER TTHA;Lo;0;L;;;;;N;;;;; 1141C;NEWA LETTER DDA;Lo;0;L;;;;;N;;;;; 1141D;NEWA LETTER DDHA;Lo;0;L;;;;;N;;;;; 1141E;NEWA LETTER NNA;Lo;0;L;;;;;N;;;;; 1141F;NEWA LETTER TA;Lo;0;L;;;;;N;;;;; 11420;NEWA LETTER THA;Lo;0;L;;;;;N;;;;; 11421;NEWA LETTER DA;Lo;0;L;;;;;N;;;;; 11422;NEWA LETTER DHA;Lo;0;L;;;;;N;;;;; 11423;NEWA LETTER NA;Lo;0;L;;;;;N;;;;; 11424;NEWA LETTER NHA;Lo;0;L;;;;;N;;;;; 11425;NEWA LETTER PA;Lo;0;L;;;;;N;;;;; 11426;NEWA LETTER PHA;Lo;0;L;;;;;N;;;;; 11427;NEWA LETTER BA;Lo;0;L;;;;;N;;;;; 11428;NEWA LETTER BHA;Lo;0;L;;;;;N;;;;; 11429;NEWA LETTER MA;Lo;0;L;;;;;N;;;;; 1142A;NEWA LETTER MHA;Lo;0;L;;;;;N;;;;; 1142B;NEWA LETTER YA;Lo;0;L;;;;;N;;;;; 1142C;NEWA LETTER RA;Lo;0;L;;;;;N;;;;; 1142D;NEWA LETTER RHA;Lo;0;L;;;;;N;;;;; 1142E;NEWA LETTER LA;Lo;0;L;;;;;N;;;;; 1142F;NEWA LETTER LHA;Lo;0;L;;;;;N;;;;; 11430;NEWA LETTER WA;Lo;0;L;;;;;N;;;;; 11431;NEWA LETTER SHA;Lo;0;L;;;;;N;;;;; 11432;NEWA LETTER SSA;Lo;0;L;;;;;N;;;;; 11433;NEWA LETTER SA;Lo;0;L;;;;;N;;;;; 11434;NEWA LETTER HA;Lo;0;L;;;;;N;;;;; 11435;NEWA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 11436;NEWA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; 11437;NEWA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; 11438;NEWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 11439;NEWA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 1143A;NEWA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; 1143B;NEWA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; 1143C;NEWA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; 1143D;NEWA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; 1143E;NEWA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; 1143F;NEWA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; 11440;NEWA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; 11441;NEWA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; 11442;NEWA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; 11443;NEWA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 11444;NEWA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 11445;NEWA SIGN VISARGA;Mc;0;L;;;;;N;;;;; 11446;NEWA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; 11447;NEWA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; 11448;NEWA SIGN FINAL ANUSVARA;Lo;0;L;;;;;N;;;;; 11449;NEWA OM;Lo;0;L;;;;;N;;;;; 1144A;NEWA SIDDHI;Lo;0;L;;;;;N;;;;; 1144B;NEWA DANDA;Po;0;L;;;;;N;;;;; 1144C;NEWA DOUBLE DANDA;Po;0;L;;;;;N;;;;; 1144D;NEWA COMMA;Po;0;L;;;;;N;;;;; 1144E;NEWA GAP FILLER;Po;0;L;;;;;N;;;;; 1144F;NEWA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; 11450;NEWA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 11451;NEWA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 11452;NEWA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 11453;NEWA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 11454;NEWA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 11455;NEWA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 11456;NEWA DIGIT SIX;Nd;0;L;;6;6;6;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;;;;; 1145B;NEWA PLACEHOLDER MARK;Po;0;L;;;;;N;;;;; 1145D;NEWA INSERTION SIGN;Po;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;;;;; 11483;TIRHUTA LETTER I;Lo;0;L;;;;;N;;;;; 11484;TIRHUTA LETTER II;Lo;0;L;;;;;N;;;;; 11485;TIRHUTA LETTER U;Lo;0;L;;;;;N;;;;; 11486;TIRHUTA LETTER UU;Lo;0;L;;;;;N;;;;; 11487;TIRHUTA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; 11488;TIRHUTA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 11489;TIRHUTA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; 1148A;TIRHUTA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; 1148B;TIRHUTA LETTER E;Lo;0;L;;;;;N;;;;; 1148C;TIRHUTA LETTER AI;Lo;0;L;;;;;N;;;;; 1148D;TIRHUTA LETTER O;Lo;0;L;;;;;N;;;;; 1148E;TIRHUTA LETTER AU;Lo;0;L;;;;;N;;;;; 1148F;TIRHUTA LETTER KA;Lo;0;L;;;;;N;;;;; 11490;TIRHUTA LETTER KHA;Lo;0;L;;;;;N;;;;; 11491;TIRHUTA LETTER GA;Lo;0;L;;;;;N;;;;; 11492;TIRHUTA LETTER GHA;Lo;0;L;;;;;N;;;;; 11493;TIRHUTA LETTER NGA;Lo;0;L;;;;;N;;;;; 11494;TIRHUTA LETTER CA;Lo;0;L;;;;;N;;;;; 11495;TIRHUTA LETTER CHA;Lo;0;L;;;;;N;;;;; 11496;TIRHUTA LETTER JA;Lo;0;L;;;;;N;;;;; 11497;TIRHUTA LETTER JHA;Lo;0;L;;;;;N;;;;; 11498;TIRHUTA LETTER NYA;Lo;0;L;;;;;N;;;;; 11499;TIRHUTA LETTER TTA;Lo;0;L;;;;;N;;;;; 1149A;TIRHUTA LETTER TTHA;Lo;0;L;;;;;N;;;;; 1149B;TIRHUTA LETTER DDA;Lo;0;L;;;;;N;;;;; 1149C;TIRHUTA LETTER DDHA;Lo;0;L;;;;;N;;;;; 1149D;TIRHUTA LETTER NNA;Lo;0;L;;;;;N;;;;; 1149E;TIRHUTA LETTER TA;Lo;0;L;;;;;N;;;;; 1149F;TIRHUTA LETTER THA;Lo;0;L;;;;;N;;;;; 114A0;TIRHUTA LETTER DA;Lo;0;L;;;;;N;;;;; 114A1;TIRHUTA LETTER DHA;Lo;0;L;;;;;N;;;;; 114A2;TIRHUTA LETTER NA;Lo;0;L;;;;;N;;;;; 114A3;TIRHUTA LETTER PA;Lo;0;L;;;;;N;;;;; 114A4;TIRHUTA LETTER PHA;Lo;0;L;;;;;N;;;;; 114A5;TIRHUTA LETTER BA;Lo;0;L;;;;;N;;;;; 114A6;TIRHUTA LETTER BHA;Lo;0;L;;;;;N;;;;; 114A7;TIRHUTA LETTER MA;Lo;0;L;;;;;N;;;;; 114A8;TIRHUTA LETTER YA;Lo;0;L;;;;;N;;;;; 114A9;TIRHUTA LETTER RA;Lo;0;L;;;;;N;;;;; 114AA;TIRHUTA LETTER LA;Lo;0;L;;;;;N;;;;; 114AB;TIRHUTA LETTER VA;Lo;0;L;;;;;N;;;;; 114AC;TIRHUTA LETTER SHA;Lo;0;L;;;;;N;;;;; 114AD;TIRHUTA LETTER SSA;Lo;0;L;;;;;N;;;;; 114AE;TIRHUTA LETTER SA;Lo;0;L;;;;;N;;;;; 114AF;TIRHUTA LETTER HA;Lo;0;L;;;;;N;;;;; 114B0;TIRHUTA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 114B1;TIRHUTA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; 114B2;TIRHUTA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; 114B3;TIRHUTA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 114B4;TIRHUTA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 114B5;TIRHUTA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; 114B6;TIRHUTA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; 114B7;TIRHUTA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; 114B8;TIRHUTA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; 114B9;TIRHUTA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; 114BA;TIRHUTA VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; 114BB;TIRHUTA VOWEL SIGN AI;Mc;0;L;114B9 114BA;;;;N;;;;; 114BC;TIRHUTA VOWEL SIGN O;Mc;0;L;114B9 114B0;;;;N;;;;; 114BD;TIRHUTA VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; 114BE;TIRHUTA VOWEL SIGN AU;Mc;0;L;114B9 114BD;;;;N;;;;; 114BF;TIRHUTA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 114C0;TIRHUTA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 114C1;TIRHUTA SIGN VISARGA;Mc;0;L;;;;;N;;;;; 114C2;TIRHUTA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; 114C3;TIRHUTA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; 114C4;TIRHUTA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; 114C5;TIRHUTA GVANG;Lo;0;L;;;;;N;;;;; 114C6;TIRHUTA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; 114C7;TIRHUTA OM;Lo;0;L;;;;;N;;;;; 114D0;TIRHUTA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 114D1;TIRHUTA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 114D2;TIRHUTA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 114D3;TIRHUTA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 114D4;TIRHUTA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 114D5;TIRHUTA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 114D6;TIRHUTA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 114D7;TIRHUTA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 114D8;TIRHUTA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 114D9;TIRHUTA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 11580;SIDDHAM LETTER A;Lo;0;L;;;;;N;;;;; 11581;SIDDHAM LETTER AA;Lo;0;L;;;;;N;;;;; 11582;SIDDHAM LETTER I;Lo;0;L;;;;;N;;;;; 11583;SIDDHAM LETTER II;Lo;0;L;;;;;N;;;;; 11584;SIDDHAM LETTER U;Lo;0;L;;;;;N;;;;; 11585;SIDDHAM LETTER UU;Lo;0;L;;;;;N;;;;; 11586;SIDDHAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; 11587;SIDDHAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 11588;SIDDHAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; 11589;SIDDHAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; 1158A;SIDDHAM LETTER E;Lo;0;L;;;;;N;;;;; 1158B;SIDDHAM LETTER AI;Lo;0;L;;;;;N;;;;; 1158C;SIDDHAM LETTER O;Lo;0;L;;;;;N;;;;; 1158D;SIDDHAM LETTER AU;Lo;0;L;;;;;N;;;;; 1158E;SIDDHAM LETTER KA;Lo;0;L;;;;;N;;;;; 1158F;SIDDHAM LETTER KHA;Lo;0;L;;;;;N;;;;; 11590;SIDDHAM LETTER GA;Lo;0;L;;;;;N;;;;; 11591;SIDDHAM LETTER GHA;Lo;0;L;;;;;N;;;;; 11592;SIDDHAM LETTER NGA;Lo;0;L;;;;;N;;;;; 11593;SIDDHAM LETTER CA;Lo;0;L;;;;;N;;;;; 11594;SIDDHAM LETTER CHA;Lo;0;L;;;;;N;;;;; 11595;SIDDHAM LETTER JA;Lo;0;L;;;;;N;;;;; 11596;SIDDHAM LETTER JHA;Lo;0;L;;;;;N;;;;; 11597;SIDDHAM LETTER NYA;Lo;0;L;;;;;N;;;;; 11598;SIDDHAM LETTER TTA;Lo;0;L;;;;;N;;;;; 11599;SIDDHAM LETTER TTHA;Lo;0;L;;;;;N;;;;; 1159A;SIDDHAM LETTER DDA;Lo;0;L;;;;;N;;;;; 1159B;SIDDHAM LETTER DDHA;Lo;0;L;;;;;N;;;;; 1159C;SIDDHAM LETTER NNA;Lo;0;L;;;;;N;;;;; 1159D;SIDDHAM LETTER TA;Lo;0;L;;;;;N;;;;; 1159E;SIDDHAM LETTER THA;Lo;0;L;;;;;N;;;;; 1159F;SIDDHAM LETTER DA;Lo;0;L;;;;;N;;;;; 115A0;SIDDHAM LETTER DHA;Lo;0;L;;;;;N;;;;; 115A1;SIDDHAM LETTER NA;Lo;0;L;;;;;N;;;;; 115A2;SIDDHAM LETTER PA;Lo;0;L;;;;;N;;;;; 115A3;SIDDHAM LETTER PHA;Lo;0;L;;;;;N;;;;; 115A4;SIDDHAM LETTER BA;Lo;0;L;;;;;N;;;;; 115A5;SIDDHAM LETTER BHA;Lo;0;L;;;;;N;;;;; 115A6;SIDDHAM LETTER MA;Lo;0;L;;;;;N;;;;; 115A7;SIDDHAM LETTER YA;Lo;0;L;;;;;N;;;;; 115A8;SIDDHAM LETTER RA;Lo;0;L;;;;;N;;;;; 115A9;SIDDHAM LETTER LA;Lo;0;L;;;;;N;;;;; 115AA;SIDDHAM LETTER VA;Lo;0;L;;;;;N;;;;; 115AB;SIDDHAM LETTER SHA;Lo;0;L;;;;;N;;;;; 115AC;SIDDHAM LETTER SSA;Lo;0;L;;;;;N;;;;; 115AD;SIDDHAM LETTER SA;Lo;0;L;;;;;N;;;;; 115AE;SIDDHAM LETTER HA;Lo;0;L;;;;;N;;;;; 115AF;SIDDHAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 115B0;SIDDHAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; 115B1;SIDDHAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; 115B2;SIDDHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 115B3;SIDDHAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 115B4;SIDDHAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; 115B5;SIDDHAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; 115B8;SIDDHAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; 115B9;SIDDHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; 115BA;SIDDHAM VOWEL SIGN O;Mc;0;L;115B8 115AF;;;;N;;;;; 115BB;SIDDHAM VOWEL SIGN AU;Mc;0;L;115B9 115AF;;;;N;;;;; 115BC;SIDDHAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 115BD;SIDDHAM SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 115BE;SIDDHAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; 115BF;SIDDHAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; 115C0;SIDDHAM SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; 115C1;SIDDHAM SIGN SIDDHAM;Po;0;L;;;;;N;;;;; 115C2;SIDDHAM DANDA;Po;0;L;;;;;N;;;;; 115C3;SIDDHAM DOUBLE DANDA;Po;0;L;;;;;N;;;;; 115C4;SIDDHAM SEPARATOR DOT;Po;0;L;;;;;N;;;;; 115C5;SIDDHAM SEPARATOR BAR;Po;0;L;;;;;N;;;;; 115C6;SIDDHAM REPETITION MARK-1;Po;0;L;;;;;N;;;;; 115C7;SIDDHAM REPETITION MARK-2;Po;0;L;;;;;N;;;;; 115C8;SIDDHAM REPETITION MARK-3;Po;0;L;;;;;N;;;;; 115C9;SIDDHAM END OF TEXT MARK;Po;0;L;;;;;N;;;;; 115CA;SIDDHAM SECTION MARK WITH TRIDENT AND U-SHAPED ORNAMENTS;Po;0;L;;;;;N;;;;; 115CB;SIDDHAM SECTION MARK WITH TRIDENT AND DOTTED CRESCENTS;Po;0;L;;;;;N;;;;; 115CC;SIDDHAM SECTION MARK WITH RAYS AND DOTTED CRESCENTS;Po;0;L;;;;;N;;;;; 115CD;SIDDHAM SECTION MARK WITH RAYS AND DOTTED DOUBLE CRESCENTS;Po;0;L;;;;;N;;;;; 115CE;SIDDHAM SECTION MARK WITH RAYS AND DOTTED TRIPLE CRESCENTS;Po;0;L;;;;;N;;;;; 115CF;SIDDHAM SECTION MARK DOUBLE RING;Po;0;L;;;;;N;;;;; 115D0;SIDDHAM SECTION MARK DOUBLE RING WITH RAYS;Po;0;L;;;;;N;;;;; 115D1;SIDDHAM SECTION MARK WITH DOUBLE CRESCENTS;Po;0;L;;;;;N;;;;; 115D2;SIDDHAM SECTION MARK WITH TRIPLE CRESCENTS;Po;0;L;;;;;N;;;;; 115D3;SIDDHAM SECTION MARK WITH QUADRUPLE CRESCENTS;Po;0;L;;;;;N;;;;; 115D4;SIDDHAM SECTION MARK WITH SEPTUPLE CRESCENTS;Po;0;L;;;;;N;;;;; 115D5;SIDDHAM SECTION MARK WITH CIRCLES AND RAYS;Po;0;L;;;;;N;;;;; 115D6;SIDDHAM SECTION MARK WITH CIRCLES AND TWO ENCLOSURES;Po;0;L;;;;;N;;;;; 115D7;SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES;Po;0;L;;;;;N;;;;; 115D8;SIDDHAM LETTER THREE-CIRCLE ALTERNATE I;Lo;0;L;;;;;N;;;;; 115D9;SIDDHAM LETTER TWO-CIRCLE ALTERNATE I;Lo;0;L;;;;;N;;;;; 115DA;SIDDHAM LETTER TWO-CIRCLE ALTERNATE II;Lo;0;L;;;;;N;;;;; 115DB;SIDDHAM LETTER ALTERNATE U;Lo;0;L;;;;;N;;;;; 115DC;SIDDHAM VOWEL SIGN ALTERNATE U;Mn;0;NSM;;;;;N;;;;; 115DD;SIDDHAM VOWEL SIGN ALTERNATE UU;Mn;0;NSM;;;;;N;;;;; 11600;MODI LETTER A;Lo;0;L;;;;;N;;;;; 11601;MODI LETTER AA;Lo;0;L;;;;;N;;;;; 11602;MODI LETTER I;Lo;0;L;;;;;N;;;;; 11603;MODI LETTER II;Lo;0;L;;;;;N;;;;; 11604;MODI LETTER U;Lo;0;L;;;;;N;;;;; 11605;MODI LETTER UU;Lo;0;L;;;;;N;;;;; 11606;MODI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; 11607;MODI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 11608;MODI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; 11609;MODI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; 1160A;MODI LETTER E;Lo;0;L;;;;;N;;;;; 1160B;MODI LETTER AI;Lo;0;L;;;;;N;;;;; 1160C;MODI LETTER O;Lo;0;L;;;;;N;;;;; 1160D;MODI LETTER AU;Lo;0;L;;;;;N;;;;; 1160E;MODI LETTER KA;Lo;0;L;;;;;N;;;;; 1160F;MODI LETTER KHA;Lo;0;L;;;;;N;;;;; 11610;MODI LETTER GA;Lo;0;L;;;;;N;;;;; 11611;MODI LETTER GHA;Lo;0;L;;;;;N;;;;; 11612;MODI LETTER NGA;Lo;0;L;;;;;N;;;;; 11613;MODI LETTER CA;Lo;0;L;;;;;N;;;;; 11614;MODI LETTER CHA;Lo;0;L;;;;;N;;;;; 11615;MODI LETTER JA;Lo;0;L;;;;;N;;;;; 11616;MODI LETTER JHA;Lo;0;L;;;;;N;;;;; 11617;MODI LETTER NYA;Lo;0;L;;;;;N;;;;; 11618;MODI LETTER TTA;Lo;0;L;;;;;N;;;;; 11619;MODI LETTER TTHA;Lo;0;L;;;;;N;;;;; 1161A;MODI LETTER DDA;Lo;0;L;;;;;N;;;;; 1161B;MODI LETTER DDHA;Lo;0;L;;;;;N;;;;; 1161C;MODI LETTER NNA;Lo;0;L;;;;;N;;;;; 1161D;MODI LETTER TA;Lo;0;L;;;;;N;;;;; 1161E;MODI LETTER THA;Lo;0;L;;;;;N;;;;; 1161F;MODI LETTER DA;Lo;0;L;;;;;N;;;;; 11620;MODI LETTER DHA;Lo;0;L;;;;;N;;;;; 11621;MODI LETTER NA;Lo;0;L;;;;;N;;;;; 11622;MODI LETTER PA;Lo;0;L;;;;;N;;;;; 11623;MODI LETTER PHA;Lo;0;L;;;;;N;;;;; 11624;MODI LETTER BA;Lo;0;L;;;;;N;;;;; 11625;MODI LETTER BHA;Lo;0;L;;;;;N;;;;; 11626;MODI LETTER MA;Lo;0;L;;;;;N;;;;; 11627;MODI LETTER YA;Lo;0;L;;;;;N;;;;; 11628;MODI LETTER RA;Lo;0;L;;;;;N;;;;; 11629;MODI LETTER LA;Lo;0;L;;;;;N;;;;; 1162A;MODI LETTER VA;Lo;0;L;;;;;N;;;;; 1162B;MODI LETTER SHA;Lo;0;L;;;;;N;;;;; 1162C;MODI LETTER SSA;Lo;0;L;;;;;N;;;;; 1162D;MODI LETTER SA;Lo;0;L;;;;;N;;;;; 1162E;MODI LETTER HA;Lo;0;L;;;;;N;;;;; 1162F;MODI LETTER LLA;Lo;0;L;;;;;N;;;;; 11630;MODI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 11631;MODI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; 11632;MODI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; 11633;MODI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 11634;MODI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 11635;MODI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; 11636;MODI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; 11637;MODI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; 11638;MODI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; 11639;MODI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; 1163A;MODI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; 1163B;MODI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; 1163C;MODI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; 1163D;MODI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 1163E;MODI SIGN VISARGA;Mc;0;L;;;;;N;;;;; 1163F;MODI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; 11640;MODI SIGN ARDHACANDRA;Mn;0;NSM;;;;;N;;;;; 11641;MODI DANDA;Po;0;L;;;;;N;;;;; 11642;MODI DOUBLE DANDA;Po;0;L;;;;;N;;;;; 11643;MODI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; 11644;MODI SIGN HUVA;Lo;0;L;;;;;N;;;;; 11650;MODI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 11651;MODI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 11652;MODI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 11653;MODI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 11654;MODI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 11655;MODI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 11656;MODI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 11657;MODI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 11658;MODI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 11659;MODI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 11660;MONGOLIAN BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; 11661;MONGOLIAN ROTATED BIRGA;Po;0;ON;;;;;N;;;;; 11662;MONGOLIAN DOUBLE BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; 11663;MONGOLIAN TRIPLE BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; 11664;MONGOLIAN BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; 11665;MONGOLIAN ROTATED BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; 11666;MONGOLIAN ROTATED BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; 11667;MONGOLIAN INVERTED BIRGA;Po;0;ON;;;;;N;;;;; 11668;MONGOLIAN INVERTED BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; 11669;MONGOLIAN SWIRL BIRGA;Po;0;ON;;;;;N;;;;; 1166A;MONGOLIAN SWIRL BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; 1166B;MONGOLIAN SWIRL BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; 1166C;MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; 11680;TAKRI LETTER A;Lo;0;L;;;;;N;;;;; 11681;TAKRI LETTER AA;Lo;0;L;;;;;N;;;;; 11682;TAKRI LETTER I;Lo;0;L;;;;;N;;;;; 11683;TAKRI LETTER II;Lo;0;L;;;;;N;;;;; 11684;TAKRI LETTER U;Lo;0;L;;;;;N;;;;; 11685;TAKRI LETTER UU;Lo;0;L;;;;;N;;;;; 11686;TAKRI LETTER E;Lo;0;L;;;;;N;;;;; 11687;TAKRI LETTER AI;Lo;0;L;;;;;N;;;;; 11688;TAKRI LETTER O;Lo;0;L;;;;;N;;;;; 11689;TAKRI LETTER AU;Lo;0;L;;;;;N;;;;; 1168A;TAKRI LETTER KA;Lo;0;L;;;;;N;;;;; 1168B;TAKRI LETTER KHA;Lo;0;L;;;;;N;;;;; 1168C;TAKRI LETTER GA;Lo;0;L;;;;;N;;;;; 1168D;TAKRI LETTER GHA;Lo;0;L;;;;;N;;;;; 1168E;TAKRI LETTER NGA;Lo;0;L;;;;;N;;;;; 1168F;TAKRI LETTER CA;Lo;0;L;;;;;N;;;;; 11690;TAKRI LETTER CHA;Lo;0;L;;;;;N;;;;; 11691;TAKRI LETTER JA;Lo;0;L;;;;;N;;;;; 11692;TAKRI LETTER JHA;Lo;0;L;;;;;N;;;;; 11693;TAKRI LETTER NYA;Lo;0;L;;;;;N;;;;; 11694;TAKRI LETTER TTA;Lo;0;L;;;;;N;;;;; 11695;TAKRI LETTER TTHA;Lo;0;L;;;;;N;;;;; 11696;TAKRI LETTER DDA;Lo;0;L;;;;;N;;;;; 11697;TAKRI LETTER DDHA;Lo;0;L;;;;;N;;;;; 11698;TAKRI LETTER NNA;Lo;0;L;;;;;N;;;;; 11699;TAKRI LETTER TA;Lo;0;L;;;;;N;;;;; 1169A;TAKRI LETTER THA;Lo;0;L;;;;;N;;;;; 1169B;TAKRI LETTER DA;Lo;0;L;;;;;N;;;;; 1169C;TAKRI LETTER DHA;Lo;0;L;;;;;N;;;;; 1169D;TAKRI LETTER NA;Lo;0;L;;;;;N;;;;; 1169E;TAKRI LETTER PA;Lo;0;L;;;;;N;;;;; 1169F;TAKRI LETTER PHA;Lo;0;L;;;;;N;;;;; 116A0;TAKRI LETTER BA;Lo;0;L;;;;;N;;;;; 116A1;TAKRI LETTER BHA;Lo;0;L;;;;;N;;;;; 116A2;TAKRI LETTER MA;Lo;0;L;;;;;N;;;;; 116A3;TAKRI LETTER YA;Lo;0;L;;;;;N;;;;; 116A4;TAKRI LETTER RA;Lo;0;L;;;;;N;;;;; 116A5;TAKRI LETTER LA;Lo;0;L;;;;;N;;;;; 116A6;TAKRI LETTER VA;Lo;0;L;;;;;N;;;;; 116A7;TAKRI LETTER SHA;Lo;0;L;;;;;N;;;;; 116A8;TAKRI LETTER SA;Lo;0;L;;;;;N;;;;; 116A9;TAKRI LETTER HA;Lo;0;L;;;;;N;;;;; 116AA;TAKRI LETTER RRA;Lo;0;L;;;;;N;;;;; 116AB;TAKRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 116AC;TAKRI SIGN VISARGA;Mc;0;L;;;;;N;;;;; 116AD;TAKRI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; 116AE;TAKRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; 116AF;TAKRI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; 116B0;TAKRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 116B1;TAKRI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 116B2;TAKRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; 116B3;TAKRI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; 116B4;TAKRI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; 116B5;TAKRI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; 116B6;TAKRI SIGN VIRAMA;Mc;9;L;;;;;N;;;;; 116B7;TAKRI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; 116C0;TAKRI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 116C1;TAKRI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 116C2;TAKRI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 116C3;TAKRI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 116C4;TAKRI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 116C5;TAKRI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 116C6;TAKRI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 116C7;TAKRI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 116C8;TAKRI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 116C9;TAKRI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 11700;AHOM LETTER KA;Lo;0;L;;;;;N;;;;; 11701;AHOM LETTER KHA;Lo;0;L;;;;;N;;;;; 11702;AHOM LETTER NGA;Lo;0;L;;;;;N;;;;; 11703;AHOM LETTER NA;Lo;0;L;;;;;N;;;;; 11704;AHOM LETTER TA;Lo;0;L;;;;;N;;;;; 11705;AHOM LETTER ALTERNATE TA;Lo;0;L;;;;;N;;;;; 11706;AHOM LETTER PA;Lo;0;L;;;;;N;;;;; 11707;AHOM LETTER PHA;Lo;0;L;;;;;N;;;;; 11708;AHOM LETTER BA;Lo;0;L;;;;;N;;;;; 11709;AHOM LETTER MA;Lo;0;L;;;;;N;;;;; 1170A;AHOM LETTER JA;Lo;0;L;;;;;N;;;;; 1170B;AHOM LETTER CHA;Lo;0;L;;;;;N;;;;; 1170C;AHOM LETTER THA;Lo;0;L;;;;;N;;;;; 1170D;AHOM LETTER RA;Lo;0;L;;;;;N;;;;; 1170E;AHOM LETTER LA;Lo;0;L;;;;;N;;;;; 1170F;AHOM LETTER SA;Lo;0;L;;;;;N;;;;; 11710;AHOM LETTER NYA;Lo;0;L;;;;;N;;;;; 11711;AHOM LETTER HA;Lo;0;L;;;;;N;;;;; 11712;AHOM LETTER A;Lo;0;L;;;;;N;;;;; 11713;AHOM LETTER DA;Lo;0;L;;;;;N;;;;; 11714;AHOM LETTER DHA;Lo;0;L;;;;;N;;;;; 11715;AHOM LETTER GA;Lo;0;L;;;;;N;;;;; 11716;AHOM LETTER ALTERNATE GA;Lo;0;L;;;;;N;;;;; 11717;AHOM LETTER GHA;Lo;0;L;;;;;N;;;;; 11718;AHOM LETTER BHA;Lo;0;L;;;;;N;;;;; 11719;AHOM LETTER JHA;Lo;0;L;;;;;N;;;;; 1171D;AHOM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;; 1171E;AHOM CONSONANT SIGN MEDIAL RA;Mn;0;NSM;;;;;N;;;;; 1171F;AHOM CONSONANT SIGN MEDIAL LIGATING RA;Mn;0;NSM;;;;;N;;;;; 11720;AHOM VOWEL SIGN A;Mc;0;L;;;;;N;;;;; 11721;AHOM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 11722;AHOM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; 11723;AHOM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; 11724;AHOM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 11725;AHOM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 11726;AHOM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; 11727;AHOM VOWEL SIGN AW;Mn;0;NSM;;;;;N;;;;; 11728;AHOM VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; 11729;AHOM VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; 1172A;AHOM VOWEL SIGN AM;Mn;0;NSM;;;;;N;;;;; 1172B;AHOM SIGN KILLER;Mn;9;NSM;;;;;N;;;;; 11730;AHOM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 11731;AHOM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 11732;AHOM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 11733;AHOM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 11734;AHOM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 11735;AHOM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 11736;AHOM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 11737;AHOM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 11738;AHOM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 11739;AHOM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 1173A;AHOM NUMBER TEN;No;0;L;;;;10;N;;;;; 1173B;AHOM NUMBER TWENTY;No;0;L;;;;20;N;;;;; 1173C;AHOM SIGN SMALL SECTION;Po;0;L;;;;;N;;;;; 1173D;AHOM SIGN SECTION;Po;0;L;;;;;N;;;;; 1173E;AHOM SIGN RULAI;Po;0;L;;;;;N;;;;; 1173F;AHOM SYMBOL VI;So;0;L;;;;;N;;;;; 118A0;WARANG CITI CAPITAL LETTER NGAA;Lu;0;L;;;;;N;;;;118C0; 118A1;WARANG CITI CAPITAL LETTER A;Lu;0;L;;;;;N;;;;118C1; 118A2;WARANG CITI CAPITAL LETTER WI;Lu;0;L;;;;;N;;;;118C2; 118A3;WARANG CITI CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;118C3; 118A4;WARANG CITI CAPITAL LETTER YA;Lu;0;L;;;;;N;;;;118C4; 118A5;WARANG CITI CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;118C5; 118A6;WARANG CITI CAPITAL LETTER II;Lu;0;L;;;;;N;;;;118C6; 118A7;WARANG CITI CAPITAL LETTER UU;Lu;0;L;;;;;N;;;;118C7; 118A8;WARANG CITI CAPITAL LETTER E;Lu;0;L;;;;;N;;;;118C8; 118A9;WARANG CITI CAPITAL LETTER O;Lu;0;L;;;;;N;;;;118C9; 118AA;WARANG CITI CAPITAL LETTER ANG;Lu;0;L;;;;;N;;;;118CA; 118AB;WARANG CITI CAPITAL LETTER GA;Lu;0;L;;;;;N;;;;118CB; 118AC;WARANG CITI CAPITAL LETTER KO;Lu;0;L;;;;;N;;;;118CC; 118AD;WARANG CITI CAPITAL LETTER ENY;Lu;0;L;;;;;N;;;;118CD; 118AE;WARANG CITI CAPITAL LETTER YUJ;Lu;0;L;;;;;N;;;;118CE; 118AF;WARANG CITI CAPITAL LETTER UC;Lu;0;L;;;;;N;;;;118CF; 118B0;WARANG CITI CAPITAL LETTER ENN;Lu;0;L;;;;;N;;;;118D0; 118B1;WARANG CITI CAPITAL LETTER ODD;Lu;0;L;;;;;N;;;;118D1; 118B2;WARANG CITI CAPITAL LETTER TTE;Lu;0;L;;;;;N;;;;118D2; 118B3;WARANG CITI CAPITAL LETTER NUNG;Lu;0;L;;;;;N;;;;118D3; 118B4;WARANG CITI CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;118D4; 118B5;WARANG CITI CAPITAL LETTER AT;Lu;0;L;;;;;N;;;;118D5; 118B6;WARANG CITI CAPITAL LETTER AM;Lu;0;L;;;;;N;;;;118D6; 118B7;WARANG CITI CAPITAL LETTER BU;Lu;0;L;;;;;N;;;;118D7; 118B8;WARANG CITI CAPITAL LETTER PU;Lu;0;L;;;;;N;;;;118D8; 118B9;WARANG CITI CAPITAL LETTER HIYO;Lu;0;L;;;;;N;;;;118D9; 118BA;WARANG CITI CAPITAL LETTER HOLO;Lu;0;L;;;;;N;;;;118DA; 118BB;WARANG CITI CAPITAL LETTER HORR;Lu;0;L;;;;;N;;;;118DB; 118BC;WARANG CITI CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;118DC; 118BD;WARANG CITI CAPITAL LETTER SSUU;Lu;0;L;;;;;N;;;;118DD; 118BE;WARANG CITI CAPITAL LETTER SII;Lu;0;L;;;;;N;;;;118DE; 118BF;WARANG CITI CAPITAL LETTER VIYO;Lu;0;L;;;;;N;;;;118DF; 118C0;WARANG CITI SMALL LETTER NGAA;Ll;0;L;;;;;N;;;118A0;;118A0 118C1;WARANG CITI SMALL LETTER A;Ll;0;L;;;;;N;;;118A1;;118A1 118C2;WARANG CITI SMALL LETTER WI;Ll;0;L;;;;;N;;;118A2;;118A2 118C3;WARANG CITI SMALL LETTER YU;Ll;0;L;;;;;N;;;118A3;;118A3 118C4;WARANG CITI SMALL LETTER YA;Ll;0;L;;;;;N;;;118A4;;118A4 118C5;WARANG CITI SMALL LETTER YO;Ll;0;L;;;;;N;;;118A5;;118A5 118C6;WARANG CITI SMALL LETTER II;Ll;0;L;;;;;N;;;118A6;;118A6 118C7;WARANG CITI SMALL LETTER UU;Ll;0;L;;;;;N;;;118A7;;118A7 118C8;WARANG CITI SMALL LETTER E;Ll;0;L;;;;;N;;;118A8;;118A8 118C9;WARANG CITI SMALL LETTER O;Ll;0;L;;;;;N;;;118A9;;118A9 118CA;WARANG CITI SMALL LETTER ANG;Ll;0;L;;;;;N;;;118AA;;118AA 118CB;WARANG CITI SMALL LETTER GA;Ll;0;L;;;;;N;;;118AB;;118AB 118CC;WARANG CITI SMALL LETTER KO;Ll;0;L;;;;;N;;;118AC;;118AC 118CD;WARANG CITI SMALL LETTER ENY;Ll;0;L;;;;;N;;;118AD;;118AD 118CE;WARANG CITI SMALL LETTER YUJ;Ll;0;L;;;;;N;;;118AE;;118AE 118CF;WARANG CITI SMALL LETTER UC;Ll;0;L;;;;;N;;;118AF;;118AF 118D0;WARANG CITI SMALL LETTER ENN;Ll;0;L;;;;;N;;;118B0;;118B0 118D1;WARANG CITI SMALL LETTER ODD;Ll;0;L;;;;;N;;;118B1;;118B1 118D2;WARANG CITI SMALL LETTER TTE;Ll;0;L;;;;;N;;;118B2;;118B2 118D3;WARANG CITI SMALL LETTER NUNG;Ll;0;L;;;;;N;;;118B3;;118B3 118D4;WARANG CITI SMALL LETTER DA;Ll;0;L;;;;;N;;;118B4;;118B4 118D5;WARANG CITI SMALL LETTER AT;Ll;0;L;;;;;N;;;118B5;;118B5 118D6;WARANG CITI SMALL LETTER AM;Ll;0;L;;;;;N;;;118B6;;118B6 118D7;WARANG CITI SMALL LETTER BU;Ll;0;L;;;;;N;;;118B7;;118B7 118D8;WARANG CITI SMALL LETTER PU;Ll;0;L;;;;;N;;;118B8;;118B8 118D9;WARANG CITI SMALL LETTER HIYO;Ll;0;L;;;;;N;;;118B9;;118B9 118DA;WARANG CITI SMALL LETTER HOLO;Ll;0;L;;;;;N;;;118BA;;118BA 118DB;WARANG CITI SMALL LETTER HORR;Ll;0;L;;;;;N;;;118BB;;118BB 118DC;WARANG CITI SMALL LETTER HAR;Ll;0;L;;;;;N;;;118BC;;118BC 118DD;WARANG CITI SMALL LETTER SSUU;Ll;0;L;;;;;N;;;118BD;;118BD 118DE;WARANG CITI SMALL LETTER SII;Ll;0;L;;;;;N;;;118BE;;118BE 118DF;WARANG CITI SMALL LETTER VIYO;Ll;0;L;;;;;N;;;118BF;;118BF 118E0;WARANG CITI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 118E1;WARANG CITI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 118E2;WARANG CITI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 118E3;WARANG CITI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 118E4;WARANG CITI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 118E5;WARANG CITI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 118E6;WARANG CITI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 118E7;WARANG CITI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 118E8;WARANG CITI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 118E9;WARANG CITI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 118EA;WARANG CITI NUMBER TEN;No;0;L;;;;10;N;;;;; 118EB;WARANG CITI NUMBER TWENTY;No;0;L;;;;20;N;;;;; 118EC;WARANG CITI NUMBER THIRTY;No;0;L;;;;30;N;;;;; 118ED;WARANG CITI NUMBER FORTY;No;0;L;;;;40;N;;;;; 118EE;WARANG CITI NUMBER FIFTY;No;0;L;;;;50;N;;;;; 118EF;WARANG CITI NUMBER SIXTY;No;0;L;;;;60;N;;;;; 118F0;WARANG CITI NUMBER SEVENTY;No;0;L;;;;70;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;;;;; 11AC0;PAU CIN HAU LETTER PA;Lo;0;L;;;;;N;;;;; 11AC1;PAU CIN HAU LETTER KA;Lo;0;L;;;;;N;;;;; 11AC2;PAU CIN HAU LETTER LA;Lo;0;L;;;;;N;;;;; 11AC3;PAU CIN HAU LETTER MA;Lo;0;L;;;;;N;;;;; 11AC4;PAU CIN HAU LETTER DA;Lo;0;L;;;;;N;;;;; 11AC5;PAU CIN HAU LETTER ZA;Lo;0;L;;;;;N;;;;; 11AC6;PAU CIN HAU LETTER VA;Lo;0;L;;;;;N;;;;; 11AC7;PAU CIN HAU LETTER NGA;Lo;0;L;;;;;N;;;;; 11AC8;PAU CIN HAU LETTER HA;Lo;0;L;;;;;N;;;;; 11AC9;PAU CIN HAU LETTER GA;Lo;0;L;;;;;N;;;;; 11ACA;PAU CIN HAU LETTER KHA;Lo;0;L;;;;;N;;;;; 11ACB;PAU CIN HAU LETTER SA;Lo;0;L;;;;;N;;;;; 11ACC;PAU CIN HAU LETTER BA;Lo;0;L;;;;;N;;;;; 11ACD;PAU CIN HAU LETTER CA;Lo;0;L;;;;;N;;;;; 11ACE;PAU CIN HAU LETTER TA;Lo;0;L;;;;;N;;;;; 11ACF;PAU CIN HAU LETTER THA;Lo;0;L;;;;;N;;;;; 11AD0;PAU CIN HAU LETTER NA;Lo;0;L;;;;;N;;;;; 11AD1;PAU CIN HAU LETTER PHA;Lo;0;L;;;;;N;;;;; 11AD2;PAU CIN HAU LETTER RA;Lo;0;L;;;;;N;;;;; 11AD3;PAU CIN HAU LETTER FA;Lo;0;L;;;;;N;;;;; 11AD4;PAU CIN HAU LETTER CHA;Lo;0;L;;;;;N;;;;; 11AD5;PAU CIN HAU LETTER A;Lo;0;L;;;;;N;;;;; 11AD6;PAU CIN HAU LETTER E;Lo;0;L;;;;;N;;;;; 11AD7;PAU CIN HAU LETTER I;Lo;0;L;;;;;N;;;;; 11AD8;PAU CIN HAU LETTER O;Lo;0;L;;;;;N;;;;; 11AD9;PAU CIN HAU LETTER U;Lo;0;L;;;;;N;;;;; 11ADA;PAU CIN HAU LETTER UA;Lo;0;L;;;;;N;;;;; 11ADB;PAU CIN HAU LETTER IA;Lo;0;L;;;;;N;;;;; 11ADC;PAU CIN HAU LETTER FINAL P;Lo;0;L;;;;;N;;;;; 11ADD;PAU CIN HAU LETTER FINAL K;Lo;0;L;;;;;N;;;;; 11ADE;PAU CIN HAU LETTER FINAL T;Lo;0;L;;;;;N;;;;; 11ADF;PAU CIN HAU LETTER FINAL M;Lo;0;L;;;;;N;;;;; 11AE0;PAU CIN HAU LETTER FINAL N;Lo;0;L;;;;;N;;;;; 11AE1;PAU CIN HAU LETTER FINAL L;Lo;0;L;;;;;N;;;;; 11AE2;PAU CIN HAU LETTER FINAL W;Lo;0;L;;;;;N;;;;; 11AE3;PAU CIN HAU LETTER FINAL NG;Lo;0;L;;;;;N;;;;; 11AE4;PAU CIN HAU LETTER FINAL Y;Lo;0;L;;;;;N;;;;; 11AE5;PAU CIN HAU RISING TONE LONG;Lo;0;L;;;;;N;;;;; 11AE6;PAU CIN HAU RISING TONE;Lo;0;L;;;;;N;;;;; 11AE7;PAU CIN HAU SANDHI GLOTTAL STOP;Lo;0;L;;;;;N;;;;; 11AE8;PAU CIN HAU RISING TONE LONG FINAL;Lo;0;L;;;;;N;;;;; 11AE9;PAU CIN HAU RISING TONE FINAL;Lo;0;L;;;;;N;;;;; 11AEA;PAU CIN HAU SANDHI GLOTTAL STOP FINAL;Lo;0;L;;;;;N;;;;; 11AEB;PAU CIN HAU SANDHI TONE LONG;Lo;0;L;;;;;N;;;;; 11AEC;PAU CIN HAU SANDHI TONE;Lo;0;L;;;;;N;;;;; 11AED;PAU CIN HAU SANDHI TONE LONG FINAL;Lo;0;L;;;;;N;;;;; 11AEE;PAU CIN HAU SANDHI TONE FINAL;Lo;0;L;;;;;N;;;;; 11AEF;PAU CIN HAU MID-LEVEL TONE;Lo;0;L;;;;;N;;;;; 11AF0;PAU CIN HAU GLOTTAL STOP VARIANT;Lo;0;L;;;;;N;;;;; 11AF1;PAU CIN HAU MID-LEVEL TONE LONG FINAL;Lo;0;L;;;;;N;;;;; 11AF2;PAU CIN HAU MID-LEVEL TONE FINAL;Lo;0;L;;;;;N;;;;; 11AF3;PAU CIN HAU LOW-FALLING TONE LONG;Lo;0;L;;;;;N;;;;; 11AF4;PAU CIN HAU LOW-FALLING TONE;Lo;0;L;;;;;N;;;;; 11AF5;PAU CIN HAU GLOTTAL STOP;Lo;0;L;;;;;N;;;;; 11AF6;PAU CIN HAU LOW-FALLING TONE LONG FINAL;Lo;0;L;;;;;N;;;;; 11AF7;PAU CIN HAU LOW-FALLING TONE FINAL;Lo;0;L;;;;;N;;;;; 11AF8;PAU CIN HAU GLOTTAL STOP FINAL;Lo;0;L;;;;;N;;;;; 11C00;BHAIKSUKI LETTER A;Lo;0;L;;;;;N;;;;; 11C01;BHAIKSUKI LETTER AA;Lo;0;L;;;;;N;;;;; 11C02;BHAIKSUKI LETTER I;Lo;0;L;;;;;N;;;;; 11C03;BHAIKSUKI LETTER II;Lo;0;L;;;;;N;;;;; 11C04;BHAIKSUKI LETTER U;Lo;0;L;;;;;N;;;;; 11C05;BHAIKSUKI LETTER UU;Lo;0;L;;;;;N;;;;; 11C06;BHAIKSUKI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; 11C07;BHAIKSUKI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 11C08;BHAIKSUKI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; 11C0A;BHAIKSUKI LETTER E;Lo;0;L;;;;;N;;;;; 11C0B;BHAIKSUKI LETTER AI;Lo;0;L;;;;;N;;;;; 11C0C;BHAIKSUKI LETTER O;Lo;0;L;;;;;N;;;;; 11C0D;BHAIKSUKI LETTER AU;Lo;0;L;;;;;N;;;;; 11C0E;BHAIKSUKI LETTER KA;Lo;0;L;;;;;N;;;;; 11C0F;BHAIKSUKI LETTER KHA;Lo;0;L;;;;;N;;;;; 11C10;BHAIKSUKI LETTER GA;Lo;0;L;;;;;N;;;;; 11C11;BHAIKSUKI LETTER GHA;Lo;0;L;;;;;N;;;;; 11C12;BHAIKSUKI LETTER NGA;Lo;0;L;;;;;N;;;;; 11C13;BHAIKSUKI LETTER CA;Lo;0;L;;;;;N;;;;; 11C14;BHAIKSUKI LETTER CHA;Lo;0;L;;;;;N;;;;; 11C15;BHAIKSUKI LETTER JA;Lo;0;L;;;;;N;;;;; 11C16;BHAIKSUKI LETTER JHA;Lo;0;L;;;;;N;;;;; 11C17;BHAIKSUKI LETTER NYA;Lo;0;L;;;;;N;;;;; 11C18;BHAIKSUKI LETTER TTA;Lo;0;L;;;;;N;;;;; 11C19;BHAIKSUKI LETTER TTHA;Lo;0;L;;;;;N;;;;; 11C1A;BHAIKSUKI LETTER DDA;Lo;0;L;;;;;N;;;;; 11C1B;BHAIKSUKI LETTER DDHA;Lo;0;L;;;;;N;;;;; 11C1C;BHAIKSUKI LETTER NNA;Lo;0;L;;;;;N;;;;; 11C1D;BHAIKSUKI LETTER TA;Lo;0;L;;;;;N;;;;; 11C1E;BHAIKSUKI LETTER THA;Lo;0;L;;;;;N;;;;; 11C1F;BHAIKSUKI LETTER DA;Lo;0;L;;;;;N;;;;; 11C20;BHAIKSUKI LETTER DHA;Lo;0;L;;;;;N;;;;; 11C21;BHAIKSUKI LETTER NA;Lo;0;L;;;;;N;;;;; 11C22;BHAIKSUKI LETTER PA;Lo;0;L;;;;;N;;;;; 11C23;BHAIKSUKI LETTER PHA;Lo;0;L;;;;;N;;;;; 11C24;BHAIKSUKI LETTER BA;Lo;0;L;;;;;N;;;;; 11C25;BHAIKSUKI LETTER BHA;Lo;0;L;;;;;N;;;;; 11C26;BHAIKSUKI LETTER MA;Lo;0;L;;;;;N;;;;; 11C27;BHAIKSUKI LETTER YA;Lo;0;L;;;;;N;;;;; 11C28;BHAIKSUKI LETTER RA;Lo;0;L;;;;;N;;;;; 11C29;BHAIKSUKI LETTER LA;Lo;0;L;;;;;N;;;;; 11C2A;BHAIKSUKI LETTER VA;Lo;0;L;;;;;N;;;;; 11C2B;BHAIKSUKI LETTER SHA;Lo;0;L;;;;;N;;;;; 11C2C;BHAIKSUKI LETTER SSA;Lo;0;L;;;;;N;;;;; 11C2D;BHAIKSUKI LETTER SA;Lo;0;L;;;;;N;;;;; 11C2E;BHAIKSUKI LETTER HA;Lo;0;L;;;;;N;;;;; 11C2F;BHAIKSUKI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 11C30;BHAIKSUKI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; 11C31;BHAIKSUKI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; 11C32;BHAIKSUKI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 11C33;BHAIKSUKI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; 11C34;BHAIKSUKI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; 11C35;BHAIKSUKI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; 11C36;BHAIKSUKI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; 11C38;BHAIKSUKI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; 11C39;BHAIKSUKI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; 11C3A;BHAIKSUKI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; 11C3B;BHAIKSUKI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; 11C3C;BHAIKSUKI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 11C3D;BHAIKSUKI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 11C3E;BHAIKSUKI SIGN VISARGA;Mc;0;L;;;;;N;;;;; 11C3F;BHAIKSUKI SIGN VIRAMA;Mn;9;L;;;;;N;;;;; 11C40;BHAIKSUKI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; 11C41;BHAIKSUKI DANDA;Po;0;L;;;;;N;;;;; 11C42;BHAIKSUKI DOUBLE DANDA;Po;0;L;;;;;N;;;;; 11C43;BHAIKSUKI WORD SEPARATOR;Po;0;L;;;;;N;;;;; 11C44;BHAIKSUKI GAP FILLER-1;Po;0;L;;;;;N;;;;; 11C45;BHAIKSUKI GAP FILLER-2;Po;0;L;;;;;N;;;;; 11C50;BHAIKSUKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 11C51;BHAIKSUKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 11C52;BHAIKSUKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 11C53;BHAIKSUKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 11C54;BHAIKSUKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 11C55;BHAIKSUKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 11C56;BHAIKSUKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 11C57;BHAIKSUKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 11C58;BHAIKSUKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 11C59;BHAIKSUKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 11C5A;BHAIKSUKI NUMBER ONE;No;0;L;;;;1;N;;;;; 11C5B;BHAIKSUKI NUMBER TWO;No;0;L;;;;2;N;;;;; 11C5C;BHAIKSUKI NUMBER THREE;No;0;L;;;;3;N;;;;; 11C5D;BHAIKSUKI NUMBER FOUR;No;0;L;;;;4;N;;;;; 11C5E;BHAIKSUKI NUMBER FIVE;No;0;L;;;;5;N;;;;; 11C5F;BHAIKSUKI NUMBER SIX;No;0;L;;;;6;N;;;;; 11C60;BHAIKSUKI NUMBER SEVEN;No;0;L;;;;7;N;;;;; 11C61;BHAIKSUKI NUMBER EIGHT;No;0;L;;;;8;N;;;;; 11C62;BHAIKSUKI NUMBER NINE;No;0;L;;;;9;N;;;;; 11C63;BHAIKSUKI NUMBER TEN;No;0;L;;;;10;N;;;;; 11C64;BHAIKSUKI NUMBER TWENTY;No;0;L;;;;20;N;;;;; 11C65;BHAIKSUKI NUMBER THIRTY;No;0;L;;;;30;N;;;;; 11C66;BHAIKSUKI NUMBER FORTY;No;0;L;;;;40;N;;;;; 11C67;BHAIKSUKI NUMBER FIFTY;No;0;L;;;;50;N;;;;; 11C68;BHAIKSUKI NUMBER SIXTY;No;0;L;;;;60;N;;;;; 11C69;BHAIKSUKI NUMBER SEVENTY;No;0;L;;;;70;N;;;;; 11C6A;BHAIKSUKI NUMBER EIGHTY;No;0;L;;;;80;N;;;;; 11C6B;BHAIKSUKI NUMBER NINETY;No;0;L;;;;90;N;;;;; 11C6C;BHAIKSUKI HUNDREDS UNIT MARK;No;0;L;;;;100;N;;;;; 11C70;MARCHEN HEAD MARK;Po;0;L;;;;;N;;;;; 11C71;MARCHEN MARK SHAD;Po;0;L;;;;;N;;;;; 11C72;MARCHEN LETTER KA;Lo;0;L;;;;;N;;;;; 11C73;MARCHEN LETTER KHA;Lo;0;L;;;;;N;;;;; 11C74;MARCHEN LETTER GA;Lo;0;L;;;;;N;;;;; 11C75;MARCHEN LETTER NGA;Lo;0;L;;;;;N;;;;; 11C76;MARCHEN LETTER CA;Lo;0;L;;;;;N;;;;; 11C77;MARCHEN LETTER CHA;Lo;0;L;;;;;N;;;;; 11C78;MARCHEN LETTER JA;Lo;0;L;;;;;N;;;;; 11C79;MARCHEN LETTER NYA;Lo;0;L;;;;;N;;;;; 11C7A;MARCHEN LETTER TA;Lo;0;L;;;;;N;;;;; 11C7B;MARCHEN LETTER THA;Lo;0;L;;;;;N;;;;; 11C7C;MARCHEN LETTER DA;Lo;0;L;;;;;N;;;;; 11C7D;MARCHEN LETTER NA;Lo;0;L;;;;;N;;;;; 11C7E;MARCHEN LETTER PA;Lo;0;L;;;;;N;;;;; 11C7F;MARCHEN LETTER PHA;Lo;0;L;;;;;N;;;;; 11C80;MARCHEN LETTER BA;Lo;0;L;;;;;N;;;;; 11C81;MARCHEN LETTER MA;Lo;0;L;;;;;N;;;;; 11C82;MARCHEN LETTER TSA;Lo;0;L;;;;;N;;;;; 11C83;MARCHEN LETTER TSHA;Lo;0;L;;;;;N;;;;; 11C84;MARCHEN LETTER DZA;Lo;0;L;;;;;N;;;;; 11C85;MARCHEN LETTER WA;Lo;0;L;;;;;N;;;;; 11C86;MARCHEN LETTER ZHA;Lo;0;L;;;;;N;;;;; 11C87;MARCHEN LETTER ZA;Lo;0;L;;;;;N;;;;; 11C88;MARCHEN LETTER -A;Lo;0;L;;;;;N;;;;; 11C89;MARCHEN LETTER YA;Lo;0;L;;;;;N;;;;; 11C8A;MARCHEN LETTER RA;Lo;0;L;;;;;N;;;;; 11C8B;MARCHEN LETTER LA;Lo;0;L;;;;;N;;;;; 11C8C;MARCHEN LETTER SHA;Lo;0;L;;;;;N;;;;; 11C8D;MARCHEN LETTER SA;Lo;0;L;;;;;N;;;;; 11C8E;MARCHEN LETTER HA;Lo;0;L;;;;;N;;;;; 11C8F;MARCHEN LETTER A;Lo;0;L;;;;;N;;;;; 11C92;MARCHEN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;; 11C93;MARCHEN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;; 11C94;MARCHEN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;; 11C95;MARCHEN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;; 11C96;MARCHEN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;; 11C97;MARCHEN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;; 11C98;MARCHEN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;; 11C99;MARCHEN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;; 11C9A;MARCHEN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;; 11C9B;MARCHEN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;; 11C9C;MARCHEN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;; 11C9D;MARCHEN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;; 11C9E;MARCHEN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;; 11C9F;MARCHEN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;; 11CA0;MARCHEN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;; 11CA1;MARCHEN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;; 11CA2;MARCHEN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;; 11CA3;MARCHEN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;; 11CA4;MARCHEN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;; 11CA5;MARCHEN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;;;; 11CA6;MARCHEN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;; 11CA7;MARCHEN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;; 11CA9;MARCHEN SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; 11CAA;MARCHEN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;;;; 11CAB;MARCHEN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;; 11CAC;MARCHEN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;; 11CAD;MARCHEN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;; 11CAE;MARCHEN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;; 11CAF;MARCHEN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;; 11CB0;MARCHEN VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; 11CB1;MARCHEN VOWEL SIGN I;Mc;0;L;;;;;N;;;;; 11CB2;MARCHEN VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; 11CB3;MARCHEN VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; 11CB4;MARCHEN VOWEL SIGN O;Mc;0;L;;;;;N;;;;; 11CB5;MARCHEN SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 11CB6;MARCHEN SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;; 12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;; 12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;; 12003;CUNEIFORM SIGN A TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; 12004;CUNEIFORM SIGN A TIMES HA;Lo;0;L;;;;;N;;;;; 12005;CUNEIFORM SIGN A TIMES IGI;Lo;0;L;;;;;N;;;;; 12006;CUNEIFORM SIGN A TIMES LAGAR GUNU;Lo;0;L;;;;;N;;;;; 12007;CUNEIFORM SIGN A TIMES MUSH;Lo;0;L;;;;;N;;;;; 12008;CUNEIFORM SIGN A TIMES SAG;Lo;0;L;;;;;N;;;;; 12009;CUNEIFORM SIGN A2;Lo;0;L;;;;;N;;;;; 1200A;CUNEIFORM SIGN AB;Lo;0;L;;;;;N;;;;; 1200B;CUNEIFORM SIGN AB TIMES ASH2;Lo;0;L;;;;;N;;;;; 1200C;CUNEIFORM SIGN AB TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; 1200D;CUNEIFORM SIGN AB TIMES GAL;Lo;0;L;;;;;N;;;;; 1200E;CUNEIFORM SIGN AB TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; 1200F;CUNEIFORM SIGN AB TIMES HA;Lo;0;L;;;;;N;;;;; 12010;CUNEIFORM SIGN AB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; 12011;CUNEIFORM SIGN AB TIMES IMIN;Lo;0;L;;;;;N;;;;; 12012;CUNEIFORM SIGN AB TIMES LAGAB;Lo;0;L;;;;;N;;;;; 12013;CUNEIFORM SIGN AB TIMES SHESH;Lo;0;L;;;;;N;;;;; 12014;CUNEIFORM SIGN AB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; 12015;CUNEIFORM SIGN AB GUNU;Lo;0;L;;;;;N;;;;; 12016;CUNEIFORM SIGN AB2;Lo;0;L;;;;;N;;;;; 12017;CUNEIFORM SIGN AB2 TIMES BALAG;Lo;0;L;;;;;N;;;;; 12018;CUNEIFORM SIGN AB2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; 12019;CUNEIFORM SIGN AB2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; 1201A;CUNEIFORM SIGN AB2 TIMES SHA3;Lo;0;L;;;;;N;;;;; 1201B;CUNEIFORM SIGN AB2 TIMES TAK4;Lo;0;L;;;;;N;;;;; 1201C;CUNEIFORM SIGN AD;Lo;0;L;;;;;N;;;;; 1201D;CUNEIFORM SIGN AK;Lo;0;L;;;;;N;;;;; 1201E;CUNEIFORM SIGN AK TIMES ERIN2;Lo;0;L;;;;;N;;;;; 1201F;CUNEIFORM SIGN AK TIMES SHITA PLUS GISH;Lo;0;L;;;;;N;;;;; 12020;CUNEIFORM SIGN AL;Lo;0;L;;;;;N;;;;; 12021;CUNEIFORM SIGN AL TIMES AL;Lo;0;L;;;;;N;;;;; 12022;CUNEIFORM SIGN AL TIMES DIM2;Lo;0;L;;;;;N;;;;; 12023;CUNEIFORM SIGN AL TIMES GISH;Lo;0;L;;;;;N;;;;; 12024;CUNEIFORM SIGN AL TIMES HA;Lo;0;L;;;;;N;;;;; 12025;CUNEIFORM SIGN AL TIMES KAD3;Lo;0;L;;;;;N;;;;; 12026;CUNEIFORM SIGN AL TIMES KI;Lo;0;L;;;;;N;;;;; 12027;CUNEIFORM SIGN AL TIMES SHE;Lo;0;L;;;;;N;;;;; 12028;CUNEIFORM SIGN AL TIMES USH;Lo;0;L;;;;;N;;;;; 12029;CUNEIFORM SIGN ALAN;Lo;0;L;;;;;N;;;;; 1202A;CUNEIFORM SIGN ALEPH;Lo;0;L;;;;;N;;;;; 1202B;CUNEIFORM SIGN AMAR;Lo;0;L;;;;;N;;;;; 1202C;CUNEIFORM SIGN AMAR TIMES SHE;Lo;0;L;;;;;N;;;;; 1202D;CUNEIFORM SIGN AN;Lo;0;L;;;;;N;;;;; 1202E;CUNEIFORM SIGN AN OVER AN;Lo;0;L;;;;;N;;;;; 1202F;CUNEIFORM SIGN AN THREE TIMES;Lo;0;L;;;;;N;;;;; 12030;CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA;Lo;0;L;;;;;N;;;;; 12031;CUNEIFORM SIGN AN PLUS NAGA SQUARED;Lo;0;L;;;;;N;;;;; 12032;CUNEIFORM SIGN ANSHE;Lo;0;L;;;;;N;;;;; 12033;CUNEIFORM SIGN APIN;Lo;0;L;;;;;N;;;;; 12034;CUNEIFORM SIGN ARAD;Lo;0;L;;;;;N;;;;; 12035;CUNEIFORM SIGN ARAD TIMES KUR;Lo;0;L;;;;;N;;;;; 12036;CUNEIFORM SIGN ARKAB;Lo;0;L;;;;;N;;;;; 12037;CUNEIFORM SIGN ASAL2;Lo;0;L;;;;;N;;;;; 12038;CUNEIFORM SIGN ASH;Lo;0;L;;;;;N;;;;; 12039;CUNEIFORM SIGN ASH ZIDA TENU;Lo;0;L;;;;;N;;;;; 1203A;CUNEIFORM SIGN ASH KABA TENU;Lo;0;L;;;;;N;;;;; 1203B;CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP;Lo;0;L;;;;;N;;;;; 1203C;CUNEIFORM SIGN ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; 1203D;CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; 1203E;CUNEIFORM SIGN ASH2;Lo;0;L;;;;;N;;;;; 1203F;CUNEIFORM SIGN ASHGAB;Lo;0;L;;;;;N;;;;; 12040;CUNEIFORM SIGN BA;Lo;0;L;;;;;N;;;;; 12041;CUNEIFORM SIGN BAD;Lo;0;L;;;;;N;;;;; 12042;CUNEIFORM SIGN BAG3;Lo;0;L;;;;;N;;;;; 12043;CUNEIFORM SIGN BAHAR2;Lo;0;L;;;;;N;;;;; 12044;CUNEIFORM SIGN BAL;Lo;0;L;;;;;N;;;;; 12045;CUNEIFORM SIGN BAL OVER BAL;Lo;0;L;;;;;N;;;;; 12046;CUNEIFORM SIGN BALAG;Lo;0;L;;;;;N;;;;; 12047;CUNEIFORM SIGN BAR;Lo;0;L;;;;;N;;;;; 12048;CUNEIFORM SIGN BARA2;Lo;0;L;;;;;N;;;;; 12049;CUNEIFORM SIGN BI;Lo;0;L;;;;;N;;;;; 1204A;CUNEIFORM SIGN BI TIMES A;Lo;0;L;;;;;N;;;;; 1204B;CUNEIFORM SIGN BI TIMES GAR;Lo;0;L;;;;;N;;;;; 1204C;CUNEIFORM SIGN BI TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; 1204D;CUNEIFORM SIGN BU;Lo;0;L;;;;;N;;;;; 1204E;CUNEIFORM SIGN BU OVER BU AB;Lo;0;L;;;;;N;;;;; 1204F;CUNEIFORM SIGN BU OVER BU UN;Lo;0;L;;;;;N;;;;; 12050;CUNEIFORM SIGN BU CROSSING BU;Lo;0;L;;;;;N;;;;; 12051;CUNEIFORM SIGN BULUG;Lo;0;L;;;;;N;;;;; 12052;CUNEIFORM SIGN BULUG OVER BULUG;Lo;0;L;;;;;N;;;;; 12053;CUNEIFORM SIGN BUR;Lo;0;L;;;;;N;;;;; 12054;CUNEIFORM SIGN BUR2;Lo;0;L;;;;;N;;;;; 12055;CUNEIFORM SIGN DA;Lo;0;L;;;;;N;;;;; 12056;CUNEIFORM SIGN DAG;Lo;0;L;;;;;N;;;;; 12057;CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH;Lo;0;L;;;;;N;;;;; 12058;CUNEIFORM SIGN DAG KISIM5 TIMES AMAR;Lo;0;L;;;;;N;;;;; 12059;CUNEIFORM SIGN DAG KISIM5 TIMES BALAG;Lo;0;L;;;;;N;;;;; 1205A;CUNEIFORM SIGN DAG KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; 1205B;CUNEIFORM SIGN DAG KISIM5 TIMES GA;Lo;0;L;;;;;N;;;;; 1205C;CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH;Lo;0;L;;;;;N;;;;; 1205D;CUNEIFORM SIGN DAG KISIM5 TIMES GI;Lo;0;L;;;;;N;;;;; 1205E;CUNEIFORM SIGN DAG KISIM5 TIMES GIR2;Lo;0;L;;;;;N;;;;; 1205F;CUNEIFORM SIGN DAG KISIM5 TIMES GUD;Lo;0;L;;;;;N;;;;; 12060;CUNEIFORM SIGN DAG KISIM5 TIMES HA;Lo;0;L;;;;;N;;;;; 12061;CUNEIFORM SIGN DAG KISIM5 TIMES IR;Lo;0;L;;;;;N;;;;; 12062;CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU;Lo;0;L;;;;;N;;;;; 12063;CUNEIFORM SIGN DAG KISIM5 TIMES KAK;Lo;0;L;;;;;N;;;;; 12064;CUNEIFORM SIGN DAG KISIM5 TIMES LA;Lo;0;L;;;;;N;;;;; 12065;CUNEIFORM SIGN DAG KISIM5 TIMES LU;Lo;0;L;;;;;N;;;;; 12066;CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2;Lo;0;L;;;;;N;;;;; 12067;CUNEIFORM SIGN DAG KISIM5 TIMES LUM;Lo;0;L;;;;;N;;;;; 12068;CUNEIFORM SIGN DAG KISIM5 TIMES NE;Lo;0;L;;;;;N;;;;; 12069;CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;; 1206A;CUNEIFORM SIGN DAG KISIM5 TIMES SI;Lo;0;L;;;;;N;;;;; 1206B;CUNEIFORM SIGN DAG KISIM5 TIMES TAK4;Lo;0;L;;;;;N;;;;; 1206C;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2;Lo;0;L;;;;;N;;;;; 1206D;CUNEIFORM SIGN DAG KISIM5 TIMES USH;Lo;0;L;;;;;N;;;;; 1206E;CUNEIFORM SIGN DAM;Lo;0;L;;;;;N;;;;; 1206F;CUNEIFORM SIGN DAR;Lo;0;L;;;;;N;;;;; 12070;CUNEIFORM SIGN DARA3;Lo;0;L;;;;;N;;;;; 12071;CUNEIFORM SIGN DARA4;Lo;0;L;;;;;N;;;;; 12072;CUNEIFORM SIGN DI;Lo;0;L;;;;;N;;;;; 12073;CUNEIFORM SIGN DIB;Lo;0;L;;;;;N;;;;; 12074;CUNEIFORM SIGN DIM;Lo;0;L;;;;;N;;;;; 12075;CUNEIFORM SIGN DIM TIMES SHE;Lo;0;L;;;;;N;;;;; 12076;CUNEIFORM SIGN DIM2;Lo;0;L;;;;;N;;;;; 12077;CUNEIFORM SIGN DIN;Lo;0;L;;;;;N;;;;; 12078;CUNEIFORM SIGN DIN KASKAL U GUNU DISH;Lo;0;L;;;;;N;;;;; 12079;CUNEIFORM SIGN DISH;Lo;0;L;;;;;N;;;;; 1207A;CUNEIFORM SIGN DU;Lo;0;L;;;;;N;;;;; 1207B;CUNEIFORM SIGN DU OVER DU;Lo;0;L;;;;;N;;;;; 1207C;CUNEIFORM SIGN DU GUNU;Lo;0;L;;;;;N;;;;; 1207D;CUNEIFORM SIGN DU SHESHIG;Lo;0;L;;;;;N;;;;; 1207E;CUNEIFORM SIGN DUB;Lo;0;L;;;;;N;;;;; 1207F;CUNEIFORM SIGN DUB TIMES ESH2;Lo;0;L;;;;;N;;;;; 12080;CUNEIFORM SIGN DUB2;Lo;0;L;;;;;N;;;;; 12081;CUNEIFORM SIGN DUG;Lo;0;L;;;;;N;;;;; 12082;CUNEIFORM SIGN DUGUD;Lo;0;L;;;;;N;;;;; 12083;CUNEIFORM SIGN DUH;Lo;0;L;;;;;N;;;;; 12084;CUNEIFORM SIGN DUN;Lo;0;L;;;;;N;;;;; 12085;CUNEIFORM SIGN DUN3;Lo;0;L;;;;;N;;;;; 12086;CUNEIFORM SIGN DUN3 GUNU;Lo;0;L;;;;;N;;;;; 12087;CUNEIFORM SIGN DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; 12088;CUNEIFORM SIGN DUN4;Lo;0;L;;;;;N;;;;; 12089;CUNEIFORM SIGN DUR2;Lo;0;L;;;;;N;;;;; 1208A;CUNEIFORM SIGN E;Lo;0;L;;;;;N;;;;; 1208B;CUNEIFORM SIGN E TIMES PAP;Lo;0;L;;;;;N;;;;; 1208C;CUNEIFORM SIGN E OVER E NUN OVER NUN;Lo;0;L;;;;;N;;;;; 1208D;CUNEIFORM SIGN E2;Lo;0;L;;;;;N;;;;; 1208E;CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA;Lo;0;L;;;;;N;;;;; 1208F;CUNEIFORM SIGN E2 TIMES GAR;Lo;0;L;;;;;N;;;;; 12090;CUNEIFORM SIGN E2 TIMES MI;Lo;0;L;;;;;N;;;;; 12091;CUNEIFORM SIGN E2 TIMES SAL;Lo;0;L;;;;;N;;;;; 12092;CUNEIFORM SIGN E2 TIMES SHE;Lo;0;L;;;;;N;;;;; 12093;CUNEIFORM SIGN E2 TIMES U;Lo;0;L;;;;;N;;;;; 12094;CUNEIFORM SIGN EDIN;Lo;0;L;;;;;N;;;;; 12095;CUNEIFORM SIGN EGIR;Lo;0;L;;;;;N;;;;; 12096;CUNEIFORM SIGN EL;Lo;0;L;;;;;N;;;;; 12097;CUNEIFORM SIGN EN;Lo;0;L;;;;;N;;;;; 12098;CUNEIFORM SIGN EN TIMES GAN2;Lo;0;L;;;;;N;;;;; 12099;CUNEIFORM SIGN EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; 1209A;CUNEIFORM SIGN EN TIMES ME;Lo;0;L;;;;;N;;;;; 1209B;CUNEIFORM SIGN EN CROSSING EN;Lo;0;L;;;;;N;;;;; 1209C;CUNEIFORM SIGN EN OPPOSING EN;Lo;0;L;;;;;N;;;;; 1209D;CUNEIFORM SIGN EN SQUARED;Lo;0;L;;;;;N;;;;; 1209E;CUNEIFORM SIGN EREN;Lo;0;L;;;;;N;;;;; 1209F;CUNEIFORM SIGN ERIN2;Lo;0;L;;;;;N;;;;; 120A0;CUNEIFORM SIGN ESH2;Lo;0;L;;;;;N;;;;; 120A1;CUNEIFORM SIGN EZEN;Lo;0;L;;;;;N;;;;; 120A2;CUNEIFORM SIGN EZEN TIMES A;Lo;0;L;;;;;N;;;;; 120A3;CUNEIFORM SIGN EZEN TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; 120A4;CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL;Lo;0;L;;;;;N;;;;; 120A5;CUNEIFORM SIGN EZEN TIMES AN;Lo;0;L;;;;;N;;;;; 120A6;CUNEIFORM SIGN EZEN TIMES BAD;Lo;0;L;;;;;N;;;;; 120A7;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; 120A8;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; 120A9;CUNEIFORM SIGN EZEN TIMES HA;Lo;0;L;;;;;N;;;;; 120AA;CUNEIFORM SIGN EZEN TIMES HA GUNU;Lo;0;L;;;;;N;;;;; 120AB;CUNEIFORM SIGN EZEN TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; 120AC;CUNEIFORM SIGN EZEN TIMES KASKAL;Lo;0;L;;;;;N;;;;; 120AD;CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED;Lo;0;L;;;;;N;;;;; 120AE;CUNEIFORM SIGN EZEN TIMES KU3;Lo;0;L;;;;;N;;;;; 120AF;CUNEIFORM SIGN EZEN TIMES LA;Lo;0;L;;;;;N;;;;; 120B0;CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL;Lo;0;L;;;;;N;;;;; 120B1;CUNEIFORM SIGN EZEN TIMES LI;Lo;0;L;;;;;N;;;;; 120B2;CUNEIFORM SIGN EZEN TIMES LU;Lo;0;L;;;;;N;;;;; 120B3;CUNEIFORM SIGN EZEN TIMES U2;Lo;0;L;;;;;N;;;;; 120B4;CUNEIFORM SIGN EZEN TIMES UD;Lo;0;L;;;;;N;;;;; 120B5;CUNEIFORM SIGN GA;Lo;0;L;;;;;N;;;;; 120B6;CUNEIFORM SIGN GA GUNU;Lo;0;L;;;;;N;;;;; 120B7;CUNEIFORM SIGN GA2;Lo;0;L;;;;;N;;;;; 120B8;CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; 120B9;CUNEIFORM SIGN GA2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; 120BA;CUNEIFORM SIGN GA2 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; 120BB;CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB;Lo;0;L;;;;;N;;;;; 120BC;CUNEIFORM SIGN GA2 TIMES AN;Lo;0;L;;;;;N;;;;; 120BD;CUNEIFORM SIGN GA2 TIMES ASH;Lo;0;L;;;;;N;;;;; 120BE;CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL;Lo;0;L;;;;;N;;;;; 120BF;CUNEIFORM SIGN GA2 TIMES BAD;Lo;0;L;;;;;N;;;;; 120C0;CUNEIFORM SIGN GA2 TIMES BAR PLUS RA;Lo;0;L;;;;;N;;;;; 120C1;CUNEIFORM SIGN GA2 TIMES BUR;Lo;0;L;;;;;N;;;;; 120C2;CUNEIFORM SIGN GA2 TIMES BUR PLUS RA;Lo;0;L;;;;;N;;;;; 120C3;CUNEIFORM SIGN GA2 TIMES DA;Lo;0;L;;;;;N;;;;; 120C4;CUNEIFORM SIGN GA2 TIMES DI;Lo;0;L;;;;;N;;;;; 120C5;CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE;Lo;0;L;;;;;N;;;;; 120C6;CUNEIFORM SIGN GA2 TIMES DUB;Lo;0;L;;;;;N;;;;; 120C7;CUNEIFORM SIGN GA2 TIMES EL;Lo;0;L;;;;;N;;;;; 120C8;CUNEIFORM SIGN GA2 TIMES EL PLUS LA;Lo;0;L;;;;;N;;;;; 120C9;CUNEIFORM SIGN GA2 TIMES EN;Lo;0;L;;;;;N;;;;; 120CA;CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; 120CB;CUNEIFORM SIGN GA2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; 120CC;CUNEIFORM SIGN GA2 TIMES GAR;Lo;0;L;;;;;N;;;;; 120CD;CUNEIFORM SIGN GA2 TIMES GI;Lo;0;L;;;;;N;;;;; 120CE;CUNEIFORM SIGN GA2 TIMES GI4;Lo;0;L;;;;;N;;;;; 120CF;CUNEIFORM SIGN GA2 TIMES GI4 PLUS A;Lo;0;L;;;;;N;;;;; 120D0;CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU;Lo;0;L;;;;;N;;;;; 120D1;CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2;Lo;0;L;;;;;N;;;;; 120D2;CUNEIFORM SIGN GA2 TIMES HAL;Lo;0;L;;;;;N;;;;; 120D3;CUNEIFORM SIGN GA2 TIMES HAL PLUS LA;Lo;0;L;;;;;N;;;;; 120D4;CUNEIFORM SIGN GA2 TIMES HI PLUS LI;Lo;0;L;;;;;N;;;;; 120D5;CUNEIFORM SIGN GA2 TIMES HUB2;Lo;0;L;;;;;N;;;;; 120D6;CUNEIFORM SIGN GA2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; 120D7;CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH;Lo;0;L;;;;;N;;;;; 120D8;CUNEIFORM SIGN GA2 TIMES KAK;Lo;0;L;;;;;N;;;;; 120D9;CUNEIFORM SIGN GA2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; 120DA;CUNEIFORM SIGN GA2 TIMES KID;Lo;0;L;;;;;N;;;;; 120DB;CUNEIFORM SIGN GA2 TIMES KID PLUS LAL;Lo;0;L;;;;;N;;;;; 120DC;CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN;Lo;0;L;;;;;N;;;;; 120DD;CUNEIFORM SIGN GA2 TIMES LA;Lo;0;L;;;;;N;;;;; 120DE;CUNEIFORM SIGN GA2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; 120DF;CUNEIFORM SIGN GA2 TIMES MI;Lo;0;L;;;;;N;;;;; 120E0;CUNEIFORM SIGN GA2 TIMES NUN;Lo;0;L;;;;;N;;;;; 120E1;CUNEIFORM SIGN GA2 TIMES NUN OVER NUN;Lo;0;L;;;;;N;;;;; 120E2;CUNEIFORM SIGN GA2 TIMES PA;Lo;0;L;;;;;N;;;;; 120E3;CUNEIFORM SIGN GA2 TIMES SAL;Lo;0;L;;;;;N;;;;; 120E4;CUNEIFORM SIGN GA2 TIMES SAR;Lo;0;L;;;;;N;;;;; 120E5;CUNEIFORM SIGN GA2 TIMES SHE;Lo;0;L;;;;;N;;;;; 120E6;CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR;Lo;0;L;;;;;N;;;;; 120E7;CUNEIFORM SIGN GA2 TIMES SHID;Lo;0;L;;;;;N;;;;; 120E8;CUNEIFORM SIGN GA2 TIMES SUM;Lo;0;L;;;;;N;;;;; 120E9;CUNEIFORM SIGN GA2 TIMES TAK4;Lo;0;L;;;;;N;;;;; 120EA;CUNEIFORM SIGN GA2 TIMES U;Lo;0;L;;;;;N;;;;; 120EB;CUNEIFORM SIGN GA2 TIMES UD;Lo;0;L;;;;;N;;;;; 120EC;CUNEIFORM SIGN GA2 TIMES UD PLUS DU;Lo;0;L;;;;;N;;;;; 120ED;CUNEIFORM SIGN GA2 OVER GA2;Lo;0;L;;;;;N;;;;; 120EE;CUNEIFORM SIGN GABA;Lo;0;L;;;;;N;;;;; 120EF;CUNEIFORM SIGN GABA CROSSING GABA;Lo;0;L;;;;;N;;;;; 120F0;CUNEIFORM SIGN GAD;Lo;0;L;;;;;N;;;;; 120F1;CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; 120F2;CUNEIFORM SIGN GAL;Lo;0;L;;;;;N;;;;; 120F3;CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; 120F4;CUNEIFORM SIGN GALAM;Lo;0;L;;;;;N;;;;; 120F5;CUNEIFORM SIGN GAM;Lo;0;L;;;;;N;;;;; 120F6;CUNEIFORM SIGN GAN;Lo;0;L;;;;;N;;;;; 120F7;CUNEIFORM SIGN GAN2;Lo;0;L;;;;;N;;;;; 120F8;CUNEIFORM SIGN GAN2 TENU;Lo;0;L;;;;;N;;;;; 120F9;CUNEIFORM SIGN GAN2 OVER GAN2;Lo;0;L;;;;;N;;;;; 120FA;CUNEIFORM SIGN GAN2 CROSSING GAN2;Lo;0;L;;;;;N;;;;; 120FB;CUNEIFORM SIGN GAR;Lo;0;L;;;;;N;;;;; 120FC;CUNEIFORM SIGN GAR3;Lo;0;L;;;;;N;;;;; 120FD;CUNEIFORM SIGN GASHAN;Lo;0;L;;;;;N;;;;; 120FE;CUNEIFORM SIGN GESHTIN;Lo;0;L;;;;;N;;;;; 120FF;CUNEIFORM SIGN GESHTIN TIMES KUR;Lo;0;L;;;;;N;;;;; 12100;CUNEIFORM SIGN GI;Lo;0;L;;;;;N;;;;; 12101;CUNEIFORM SIGN GI TIMES E;Lo;0;L;;;;;N;;;;; 12102;CUNEIFORM SIGN GI TIMES U;Lo;0;L;;;;;N;;;;; 12103;CUNEIFORM SIGN GI CROSSING GI;Lo;0;L;;;;;N;;;;; 12104;CUNEIFORM SIGN GI4;Lo;0;L;;;;;N;;;;; 12105;CUNEIFORM SIGN GI4 OVER GI4;Lo;0;L;;;;;N;;;;; 12106;CUNEIFORM SIGN GI4 CROSSING GI4;Lo;0;L;;;;;N;;;;; 12107;CUNEIFORM SIGN GIDIM;Lo;0;L;;;;;N;;;;; 12108;CUNEIFORM SIGN GIR2;Lo;0;L;;;;;N;;;;; 12109;CUNEIFORM SIGN GIR2 GUNU;Lo;0;L;;;;;N;;;;; 1210A;CUNEIFORM SIGN GIR3;Lo;0;L;;;;;N;;;;; 1210B;CUNEIFORM SIGN GIR3 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; 1210C;CUNEIFORM SIGN GIR3 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; 1210D;CUNEIFORM SIGN GIR3 TIMES IGI;Lo;0;L;;;;;N;;;;; 1210E;CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI;Lo;0;L;;;;;N;;;;; 1210F;CUNEIFORM SIGN GIR3 TIMES PA;Lo;0;L;;;;;N;;;;; 12110;CUNEIFORM SIGN GISAL;Lo;0;L;;;;;N;;;;; 12111;CUNEIFORM SIGN GISH;Lo;0;L;;;;;N;;;;; 12112;CUNEIFORM SIGN GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; 12113;CUNEIFORM SIGN GISH TIMES BAD;Lo;0;L;;;;;N;;;;; 12114;CUNEIFORM SIGN GISH TIMES TAK4;Lo;0;L;;;;;N;;;;; 12115;CUNEIFORM SIGN GISH TENU;Lo;0;L;;;;;N;;;;; 12116;CUNEIFORM SIGN GU;Lo;0;L;;;;;N;;;;; 12117;CUNEIFORM SIGN GU CROSSING GU;Lo;0;L;;;;;N;;;;; 12118;CUNEIFORM SIGN GU2;Lo;0;L;;;;;N;;;;; 12119;CUNEIFORM SIGN GU2 TIMES KAK;Lo;0;L;;;;;N;;;;; 1211A;CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; 1211B;CUNEIFORM SIGN GU2 TIMES NUN;Lo;0;L;;;;;N;;;;; 1211C;CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2;Lo;0;L;;;;;N;;;;; 1211D;CUNEIFORM SIGN GU2 GUNU;Lo;0;L;;;;;N;;;;; 1211E;CUNEIFORM SIGN GUD;Lo;0;L;;;;;N;;;;; 1211F;CUNEIFORM SIGN GUD TIMES A PLUS KUR;Lo;0;L;;;;;N;;;;; 12120;CUNEIFORM SIGN GUD TIMES KUR;Lo;0;L;;;;;N;;;;; 12121;CUNEIFORM SIGN GUD OVER GUD LUGAL;Lo;0;L;;;;;N;;;;; 12122;CUNEIFORM SIGN GUL;Lo;0;L;;;;;N;;;;; 12123;CUNEIFORM SIGN GUM;Lo;0;L;;;;;N;;;;; 12124;CUNEIFORM SIGN GUM TIMES SHE;Lo;0;L;;;;;N;;;;; 12125;CUNEIFORM SIGN GUR;Lo;0;L;;;;;N;;;;; 12126;CUNEIFORM SIGN GUR7;Lo;0;L;;;;;N;;;;; 12127;CUNEIFORM SIGN GURUN;Lo;0;L;;;;;N;;;;; 12128;CUNEIFORM SIGN GURUSH;Lo;0;L;;;;;N;;;;; 12129;CUNEIFORM SIGN HA;Lo;0;L;;;;;N;;;;; 1212A;CUNEIFORM SIGN HA TENU;Lo;0;L;;;;;N;;;;; 1212B;CUNEIFORM SIGN HA GUNU;Lo;0;L;;;;;N;;;;; 1212C;CUNEIFORM SIGN HAL;Lo;0;L;;;;;N;;;;; 1212D;CUNEIFORM SIGN HI;Lo;0;L;;;;;N;;;;; 1212E;CUNEIFORM SIGN HI TIMES ASH;Lo;0;L;;;;;N;;;;; 1212F;CUNEIFORM SIGN HI TIMES ASH2;Lo;0;L;;;;;N;;;;; 12130;CUNEIFORM SIGN HI TIMES BAD;Lo;0;L;;;;;N;;;;; 12131;CUNEIFORM SIGN HI TIMES DISH;Lo;0;L;;;;;N;;;;; 12132;CUNEIFORM SIGN HI TIMES GAD;Lo;0;L;;;;;N;;;;; 12133;CUNEIFORM SIGN HI TIMES KIN;Lo;0;L;;;;;N;;;;; 12134;CUNEIFORM SIGN HI TIMES NUN;Lo;0;L;;;;;N;;;;; 12135;CUNEIFORM SIGN HI TIMES SHE;Lo;0;L;;;;;N;;;;; 12136;CUNEIFORM SIGN HI TIMES U;Lo;0;L;;;;;N;;;;; 12137;CUNEIFORM SIGN HU;Lo;0;L;;;;;N;;;;; 12138;CUNEIFORM SIGN HUB2;Lo;0;L;;;;;N;;;;; 12139;CUNEIFORM SIGN HUB2 TIMES AN;Lo;0;L;;;;;N;;;;; 1213A;CUNEIFORM SIGN HUB2 TIMES HAL;Lo;0;L;;;;;N;;;;; 1213B;CUNEIFORM SIGN HUB2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; 1213C;CUNEIFORM SIGN HUB2 TIMES LISH;Lo;0;L;;;;;N;;;;; 1213D;CUNEIFORM SIGN HUB2 TIMES UD;Lo;0;L;;;;;N;;;;; 1213E;CUNEIFORM SIGN HUL2;Lo;0;L;;;;;N;;;;; 1213F;CUNEIFORM SIGN I;Lo;0;L;;;;;N;;;;; 12140;CUNEIFORM SIGN I A;Lo;0;L;;;;;N;;;;; 12141;CUNEIFORM SIGN IB;Lo;0;L;;;;;N;;;;; 12142;CUNEIFORM SIGN IDIM;Lo;0;L;;;;;N;;;;; 12143;CUNEIFORM SIGN IDIM OVER IDIM BUR;Lo;0;L;;;;;N;;;;; 12144;CUNEIFORM SIGN IDIM OVER IDIM SQUARED;Lo;0;L;;;;;N;;;;; 12145;CUNEIFORM SIGN IG;Lo;0;L;;;;;N;;;;; 12146;CUNEIFORM SIGN IGI;Lo;0;L;;;;;N;;;;; 12147;CUNEIFORM SIGN IGI DIB;Lo;0;L;;;;;N;;;;; 12148;CUNEIFORM SIGN IGI RI;Lo;0;L;;;;;N;;;;; 12149;CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD;Lo;0;L;;;;;N;;;;; 1214A;CUNEIFORM SIGN IGI GUNU;Lo;0;L;;;;;N;;;;; 1214B;CUNEIFORM SIGN IL;Lo;0;L;;;;;N;;;;; 1214C;CUNEIFORM SIGN IL TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; 1214D;CUNEIFORM SIGN IL2;Lo;0;L;;;;;N;;;;; 1214E;CUNEIFORM SIGN IM;Lo;0;L;;;;;N;;;;; 1214F;CUNEIFORM SIGN IM TIMES TAK4;Lo;0;L;;;;;N;;;;; 12150;CUNEIFORM SIGN IM CROSSING IM;Lo;0;L;;;;;N;;;;; 12151;CUNEIFORM SIGN IM OPPOSING IM;Lo;0;L;;;;;N;;;;; 12152;CUNEIFORM SIGN IM SQUARED;Lo;0;L;;;;;N;;;;; 12153;CUNEIFORM SIGN IMIN;Lo;0;L;;;;;N;;;;; 12154;CUNEIFORM SIGN IN;Lo;0;L;;;;;N;;;;; 12155;CUNEIFORM SIGN IR;Lo;0;L;;;;;N;;;;; 12156;CUNEIFORM SIGN ISH;Lo;0;L;;;;;N;;;;; 12157;CUNEIFORM SIGN KA;Lo;0;L;;;;;N;;;;; 12158;CUNEIFORM SIGN KA TIMES A;Lo;0;L;;;;;N;;;;; 12159;CUNEIFORM SIGN KA TIMES AD;Lo;0;L;;;;;N;;;;; 1215A;CUNEIFORM SIGN KA TIMES AD PLUS KU3;Lo;0;L;;;;;N;;;;; 1215B;CUNEIFORM SIGN KA TIMES ASH2;Lo;0;L;;;;;N;;;;; 1215C;CUNEIFORM SIGN KA TIMES BAD;Lo;0;L;;;;;N;;;;; 1215D;CUNEIFORM SIGN KA TIMES BALAG;Lo;0;L;;;;;N;;;;; 1215E;CUNEIFORM SIGN KA TIMES BAR;Lo;0;L;;;;;N;;;;; 1215F;CUNEIFORM SIGN KA TIMES BI;Lo;0;L;;;;;N;;;;; 12160;CUNEIFORM SIGN KA TIMES ERIN2;Lo;0;L;;;;;N;;;;; 12161;CUNEIFORM SIGN KA TIMES ESH2;Lo;0;L;;;;;N;;;;; 12162;CUNEIFORM SIGN KA TIMES GA;Lo;0;L;;;;;N;;;;; 12163;CUNEIFORM SIGN KA TIMES GAL;Lo;0;L;;;;;N;;;;; 12164;CUNEIFORM SIGN KA TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; 12165;CUNEIFORM SIGN KA TIMES GAR;Lo;0;L;;;;;N;;;;; 12166;CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A;Lo;0;L;;;;;N;;;;; 12167;CUNEIFORM SIGN KA TIMES GI;Lo;0;L;;;;;N;;;;; 12168;CUNEIFORM SIGN KA TIMES GIR2;Lo;0;L;;;;;N;;;;; 12169;CUNEIFORM SIGN KA TIMES GISH PLUS SAR;Lo;0;L;;;;;N;;;;; 1216A;CUNEIFORM SIGN KA TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; 1216B;CUNEIFORM SIGN KA TIMES GU;Lo;0;L;;;;;N;;;;; 1216C;CUNEIFORM SIGN KA TIMES GUR7;Lo;0;L;;;;;N;;;;; 1216D;CUNEIFORM SIGN KA TIMES IGI;Lo;0;L;;;;;N;;;;; 1216E;CUNEIFORM SIGN KA TIMES IM;Lo;0;L;;;;;N;;;;; 1216F;CUNEIFORM SIGN KA TIMES KAK;Lo;0;L;;;;;N;;;;; 12170;CUNEIFORM SIGN KA TIMES KI;Lo;0;L;;;;;N;;;;; 12171;CUNEIFORM SIGN KA TIMES KID;Lo;0;L;;;;;N;;;;; 12172;CUNEIFORM SIGN KA TIMES LI;Lo;0;L;;;;;N;;;;; 12173;CUNEIFORM SIGN KA TIMES LU;Lo;0;L;;;;;N;;;;; 12174;CUNEIFORM SIGN KA TIMES ME;Lo;0;L;;;;;N;;;;; 12175;CUNEIFORM SIGN KA TIMES ME PLUS DU;Lo;0;L;;;;;N;;;;; 12176;CUNEIFORM SIGN KA TIMES ME PLUS GI;Lo;0;L;;;;;N;;;;; 12177;CUNEIFORM SIGN KA TIMES ME PLUS TE;Lo;0;L;;;;;N;;;;; 12178;CUNEIFORM SIGN KA TIMES MI;Lo;0;L;;;;;N;;;;; 12179;CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ;Lo;0;L;;;;;N;;;;; 1217A;CUNEIFORM SIGN KA TIMES NE;Lo;0;L;;;;;N;;;;; 1217B;CUNEIFORM SIGN KA TIMES NUN;Lo;0;L;;;;;N;;;;; 1217C;CUNEIFORM SIGN KA TIMES PI;Lo;0;L;;;;;N;;;;; 1217D;CUNEIFORM SIGN KA TIMES RU;Lo;0;L;;;;;N;;;;; 1217E;CUNEIFORM SIGN KA TIMES SA;Lo;0;L;;;;;N;;;;; 1217F;CUNEIFORM SIGN KA TIMES SAR;Lo;0;L;;;;;N;;;;; 12180;CUNEIFORM SIGN KA TIMES SHA;Lo;0;L;;;;;N;;;;; 12181;CUNEIFORM SIGN KA TIMES SHE;Lo;0;L;;;;;N;;;;; 12182;CUNEIFORM SIGN KA TIMES SHID;Lo;0;L;;;;;N;;;;; 12183;CUNEIFORM SIGN KA TIMES SHU;Lo;0;L;;;;;N;;;;; 12184;CUNEIFORM SIGN KA TIMES SIG;Lo;0;L;;;;;N;;;;; 12185;CUNEIFORM SIGN KA TIMES SUHUR;Lo;0;L;;;;;N;;;;; 12186;CUNEIFORM SIGN KA TIMES TAR;Lo;0;L;;;;;N;;;;; 12187;CUNEIFORM SIGN KA TIMES U;Lo;0;L;;;;;N;;;;; 12188;CUNEIFORM SIGN KA TIMES U2;Lo;0;L;;;;;N;;;;; 12189;CUNEIFORM SIGN KA TIMES UD;Lo;0;L;;;;;N;;;;; 1218A;CUNEIFORM SIGN KA TIMES UMUM TIMES PA;Lo;0;L;;;;;N;;;;; 1218B;CUNEIFORM SIGN KA TIMES USH;Lo;0;L;;;;;N;;;;; 1218C;CUNEIFORM SIGN KA TIMES ZI;Lo;0;L;;;;;N;;;;; 1218D;CUNEIFORM SIGN KA2;Lo;0;L;;;;;N;;;;; 1218E;CUNEIFORM SIGN KA2 CROSSING KA2;Lo;0;L;;;;;N;;;;; 1218F;CUNEIFORM SIGN KAB;Lo;0;L;;;;;N;;;;; 12190;CUNEIFORM SIGN KAD2;Lo;0;L;;;;;N;;;;; 12191;CUNEIFORM SIGN KAD3;Lo;0;L;;;;;N;;;;; 12192;CUNEIFORM SIGN KAD4;Lo;0;L;;;;;N;;;;; 12193;CUNEIFORM SIGN KAD5;Lo;0;L;;;;;N;;;;; 12194;CUNEIFORM SIGN KAD5 OVER KAD5;Lo;0;L;;;;;N;;;;; 12195;CUNEIFORM SIGN KAK;Lo;0;L;;;;;N;;;;; 12196;CUNEIFORM SIGN KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; 12197;CUNEIFORM SIGN KAL;Lo;0;L;;;;;N;;;;; 12198;CUNEIFORM SIGN KAL TIMES BAD;Lo;0;L;;;;;N;;;;; 12199;CUNEIFORM SIGN KAL CROSSING KAL;Lo;0;L;;;;;N;;;;; 1219A;CUNEIFORM SIGN KAM2;Lo;0;L;;;;;N;;;;; 1219B;CUNEIFORM SIGN KAM4;Lo;0;L;;;;;N;;;;; 1219C;CUNEIFORM SIGN KASKAL;Lo;0;L;;;;;N;;;;; 1219D;CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; 1219E;CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; 1219F;CUNEIFORM SIGN KESH2;Lo;0;L;;;;;N;;;;; 121A0;CUNEIFORM SIGN KI;Lo;0;L;;;;;N;;;;; 121A1;CUNEIFORM SIGN KI TIMES BAD;Lo;0;L;;;;;N;;;;; 121A2;CUNEIFORM SIGN KI TIMES U;Lo;0;L;;;;;N;;;;; 121A3;CUNEIFORM SIGN KI TIMES UD;Lo;0;L;;;;;N;;;;; 121A4;CUNEIFORM SIGN KID;Lo;0;L;;;;;N;;;;; 121A5;CUNEIFORM SIGN KIN;Lo;0;L;;;;;N;;;;; 121A6;CUNEIFORM SIGN KISAL;Lo;0;L;;;;;N;;;;; 121A7;CUNEIFORM SIGN KISH;Lo;0;L;;;;;N;;;;; 121A8;CUNEIFORM SIGN KISIM5;Lo;0;L;;;;;N;;;;; 121A9;CUNEIFORM SIGN KISIM5 OVER KISIM5;Lo;0;L;;;;;N;;;;; 121AA;CUNEIFORM SIGN KU;Lo;0;L;;;;;N;;;;; 121AB;CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2;Lo;0;L;;;;;N;;;;; 121AC;CUNEIFORM SIGN KU3;Lo;0;L;;;;;N;;;;; 121AD;CUNEIFORM SIGN KU4;Lo;0;L;;;;;N;;;;; 121AE;CUNEIFORM SIGN KU4 VARIANT FORM;Lo;0;L;;;;;N;;;;; 121AF;CUNEIFORM SIGN KU7;Lo;0;L;;;;;N;;;;; 121B0;CUNEIFORM SIGN KUL;Lo;0;L;;;;;N;;;;; 121B1;CUNEIFORM SIGN KUL GUNU;Lo;0;L;;;;;N;;;;; 121B2;CUNEIFORM SIGN KUN;Lo;0;L;;;;;N;;;;; 121B3;CUNEIFORM SIGN KUR;Lo;0;L;;;;;N;;;;; 121B4;CUNEIFORM SIGN KUR OPPOSING KUR;Lo;0;L;;;;;N;;;;; 121B5;CUNEIFORM SIGN KUSHU2;Lo;0;L;;;;;N;;;;; 121B6;CUNEIFORM SIGN KWU318;Lo;0;L;;;;;N;;;;; 121B7;CUNEIFORM SIGN LA;Lo;0;L;;;;;N;;;;; 121B8;CUNEIFORM SIGN LAGAB;Lo;0;L;;;;;N;;;;; 121B9;CUNEIFORM SIGN LAGAB TIMES A;Lo;0;L;;;;;N;;;;; 121BA;CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; 121BB;CUNEIFORM SIGN LAGAB TIMES A PLUS GAR;Lo;0;L;;;;;N;;;;; 121BC;CUNEIFORM SIGN LAGAB TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; 121BD;CUNEIFORM SIGN LAGAB TIMES AL;Lo;0;L;;;;;N;;;;; 121BE;CUNEIFORM SIGN LAGAB TIMES AN;Lo;0;L;;;;;N;;;;; 121BF;CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU;Lo;0;L;;;;;N;;;;; 121C0;CUNEIFORM SIGN LAGAB TIMES BAD;Lo;0;L;;;;;N;;;;; 121C1;CUNEIFORM SIGN LAGAB TIMES BI;Lo;0;L;;;;;N;;;;; 121C2;CUNEIFORM SIGN LAGAB TIMES DAR;Lo;0;L;;;;;N;;;;; 121C3;CUNEIFORM SIGN LAGAB TIMES EN;Lo;0;L;;;;;N;;;;; 121C4;CUNEIFORM SIGN LAGAB TIMES GA;Lo;0;L;;;;;N;;;;; 121C5;CUNEIFORM SIGN LAGAB TIMES GAR;Lo;0;L;;;;;N;;;;; 121C6;CUNEIFORM SIGN LAGAB TIMES GUD;Lo;0;L;;;;;N;;;;; 121C7;CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD;Lo;0;L;;;;;N;;;;; 121C8;CUNEIFORM SIGN LAGAB TIMES HA;Lo;0;L;;;;;N;;;;; 121C9;CUNEIFORM SIGN LAGAB TIMES HAL;Lo;0;L;;;;;N;;;;; 121CA;CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN;Lo;0;L;;;;;N;;;;; 121CB;CUNEIFORM SIGN LAGAB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; 121CC;CUNEIFORM SIGN LAGAB TIMES IM;Lo;0;L;;;;;N;;;;; 121CD;CUNEIFORM SIGN LAGAB TIMES IM PLUS HA;Lo;0;L;;;;;N;;;;; 121CE;CUNEIFORM SIGN LAGAB TIMES IM PLUS LU;Lo;0;L;;;;;N;;;;; 121CF;CUNEIFORM SIGN LAGAB TIMES KI;Lo;0;L;;;;;N;;;;; 121D0;CUNEIFORM SIGN LAGAB TIMES KIN;Lo;0;L;;;;;N;;;;; 121D1;CUNEIFORM SIGN LAGAB TIMES KU3;Lo;0;L;;;;;N;;;;; 121D2;CUNEIFORM SIGN LAGAB TIMES KUL;Lo;0;L;;;;;N;;;;; 121D3;CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A;Lo;0;L;;;;;N;;;;; 121D4;CUNEIFORM SIGN LAGAB TIMES LAGAB;Lo;0;L;;;;;N;;;;; 121D5;CUNEIFORM SIGN LAGAB TIMES LISH;Lo;0;L;;;;;N;;;;; 121D6;CUNEIFORM SIGN LAGAB TIMES LU;Lo;0;L;;;;;N;;;;; 121D7;CUNEIFORM SIGN LAGAB TIMES LUL;Lo;0;L;;;;;N;;;;; 121D8;CUNEIFORM SIGN LAGAB TIMES ME;Lo;0;L;;;;;N;;;;; 121D9;CUNEIFORM SIGN LAGAB TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; 121DA;CUNEIFORM SIGN LAGAB TIMES MUSH;Lo;0;L;;;;;N;;;;; 121DB;CUNEIFORM SIGN LAGAB TIMES NE;Lo;0;L;;;;;N;;;;; 121DC;CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; 121DD;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2;Lo;0;L;;;;;N;;;;; 121DE;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU;Lo;0;L;;;;;N;;;;; 121DF;CUNEIFORM SIGN LAGAB TIMES SHU2;Lo;0;L;;;;;N;;;;; 121E0;CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2;Lo;0;L;;;;;N;;;;; 121E1;CUNEIFORM SIGN LAGAB TIMES SUM;Lo;0;L;;;;;N;;;;; 121E2;CUNEIFORM SIGN LAGAB TIMES TAG;Lo;0;L;;;;;N;;;;; 121E3;CUNEIFORM SIGN LAGAB TIMES TAK4;Lo;0;L;;;;;N;;;;; 121E4;CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA;Lo;0;L;;;;;N;;;;; 121E5;CUNEIFORM SIGN LAGAB TIMES U;Lo;0;L;;;;;N;;;;; 121E6;CUNEIFORM SIGN LAGAB TIMES U PLUS A;Lo;0;L;;;;;N;;;;; 121E7;CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; 121E8;CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; 121E9;CUNEIFORM SIGN LAGAB TIMES UD;Lo;0;L;;;;;N;;;;; 121EA;CUNEIFORM SIGN LAGAB TIMES USH;Lo;0;L;;;;;N;;;;; 121EB;CUNEIFORM SIGN LAGAB SQUARED;Lo;0;L;;;;;N;;;;; 121EC;CUNEIFORM SIGN LAGAR;Lo;0;L;;;;;N;;;;; 121ED;CUNEIFORM SIGN LAGAR TIMES SHE;Lo;0;L;;;;;N;;;;; 121EE;CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; 121EF;CUNEIFORM SIGN LAGAR GUNU;Lo;0;L;;;;;N;;;;; 121F0;CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE;Lo;0;L;;;;;N;;;;; 121F1;CUNEIFORM SIGN LAHSHU;Lo;0;L;;;;;N;;;;; 121F2;CUNEIFORM SIGN LAL;Lo;0;L;;;;;N;;;;; 121F3;CUNEIFORM SIGN LAL TIMES LAL;Lo;0;L;;;;;N;;;;; 121F4;CUNEIFORM SIGN LAM;Lo;0;L;;;;;N;;;;; 121F5;CUNEIFORM SIGN LAM TIMES KUR;Lo;0;L;;;;;N;;;;; 121F6;CUNEIFORM SIGN LAM TIMES KUR PLUS RU;Lo;0;L;;;;;N;;;;; 121F7;CUNEIFORM SIGN LI;Lo;0;L;;;;;N;;;;; 121F8;CUNEIFORM SIGN LIL;Lo;0;L;;;;;N;;;;; 121F9;CUNEIFORM SIGN LIMMU2;Lo;0;L;;;;;N;;;;; 121FA;CUNEIFORM SIGN LISH;Lo;0;L;;;;;N;;;;; 121FB;CUNEIFORM SIGN LU;Lo;0;L;;;;;N;;;;; 121FC;CUNEIFORM SIGN LU TIMES BAD;Lo;0;L;;;;;N;;;;; 121FD;CUNEIFORM SIGN LU2;Lo;0;L;;;;;N;;;;; 121FE;CUNEIFORM SIGN LU2 TIMES AL;Lo;0;L;;;;;N;;;;; 121FF;CUNEIFORM SIGN LU2 TIMES BAD;Lo;0;L;;;;;N;;;;; 12200;CUNEIFORM SIGN LU2 TIMES ESH2;Lo;0;L;;;;;N;;;;; 12201;CUNEIFORM SIGN LU2 TIMES ESH2 TENU;Lo;0;L;;;;;N;;;;; 12202;CUNEIFORM SIGN LU2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; 12203;CUNEIFORM SIGN LU2 TIMES HI TIMES BAD;Lo;0;L;;;;;N;;;;; 12204;CUNEIFORM SIGN LU2 TIMES IM;Lo;0;L;;;;;N;;;;; 12205;CUNEIFORM SIGN LU2 TIMES KAD2;Lo;0;L;;;;;N;;;;; 12206;CUNEIFORM SIGN LU2 TIMES KAD3;Lo;0;L;;;;;N;;;;; 12207;CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH;Lo;0;L;;;;;N;;;;; 12208;CUNEIFORM SIGN LU2 TIMES KI;Lo;0;L;;;;;N;;;;; 12209;CUNEIFORM SIGN LU2 TIMES LA PLUS ASH;Lo;0;L;;;;;N;;;;; 1220A;CUNEIFORM SIGN LU2 TIMES LAGAB;Lo;0;L;;;;;N;;;;; 1220B;CUNEIFORM SIGN LU2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; 1220C;CUNEIFORM SIGN LU2 TIMES NE;Lo;0;L;;;;;N;;;;; 1220D;CUNEIFORM SIGN LU2 TIMES NU;Lo;0;L;;;;;N;;;;; 1220E;CUNEIFORM SIGN LU2 TIMES SI PLUS ASH;Lo;0;L;;;;;N;;;;; 1220F;CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU;Lo;0;L;;;;;N;;;;; 12210;CUNEIFORM SIGN LU2 TIMES TUG2;Lo;0;L;;;;;N;;;;; 12211;CUNEIFORM SIGN LU2 TENU;Lo;0;L;;;;;N;;;;; 12212;CUNEIFORM SIGN LU2 CROSSING LU2;Lo;0;L;;;;;N;;;;; 12213;CUNEIFORM SIGN LU2 OPPOSING LU2;Lo;0;L;;;;;N;;;;; 12214;CUNEIFORM SIGN LU2 SQUARED;Lo;0;L;;;;;N;;;;; 12215;CUNEIFORM SIGN LU2 SHESHIG;Lo;0;L;;;;;N;;;;; 12216;CUNEIFORM SIGN LU3;Lo;0;L;;;;;N;;;;; 12217;CUNEIFORM SIGN LUGAL;Lo;0;L;;;;;N;;;;; 12218;CUNEIFORM SIGN LUGAL OVER LUGAL;Lo;0;L;;;;;N;;;;; 12219;CUNEIFORM SIGN LUGAL OPPOSING LUGAL;Lo;0;L;;;;;N;;;;; 1221A;CUNEIFORM SIGN LUGAL SHESHIG;Lo;0;L;;;;;N;;;;; 1221B;CUNEIFORM SIGN LUH;Lo;0;L;;;;;N;;;;; 1221C;CUNEIFORM SIGN LUL;Lo;0;L;;;;;N;;;;; 1221D;CUNEIFORM SIGN LUM;Lo;0;L;;;;;N;;;;; 1221E;CUNEIFORM SIGN LUM OVER LUM;Lo;0;L;;;;;N;;;;; 1221F;CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR;Lo;0;L;;;;;N;;;;; 12220;CUNEIFORM SIGN MA;Lo;0;L;;;;;N;;;;; 12221;CUNEIFORM SIGN MA TIMES TAK4;Lo;0;L;;;;;N;;;;; 12222;CUNEIFORM SIGN MA GUNU;Lo;0;L;;;;;N;;;;; 12223;CUNEIFORM SIGN MA2;Lo;0;L;;;;;N;;;;; 12224;CUNEIFORM SIGN MAH;Lo;0;L;;;;;N;;;;; 12225;CUNEIFORM SIGN MAR;Lo;0;L;;;;;N;;;;; 12226;CUNEIFORM SIGN MASH;Lo;0;L;;;;;N;;;;; 12227;CUNEIFORM SIGN MASH2;Lo;0;L;;;;;N;;;;; 12228;CUNEIFORM SIGN ME;Lo;0;L;;;;;N;;;;; 12229;CUNEIFORM SIGN MES;Lo;0;L;;;;;N;;;;; 1222A;CUNEIFORM SIGN MI;Lo;0;L;;;;;N;;;;; 1222B;CUNEIFORM SIGN MIN;Lo;0;L;;;;;N;;;;; 1222C;CUNEIFORM SIGN MU;Lo;0;L;;;;;N;;;;; 1222D;CUNEIFORM SIGN MU OVER MU;Lo;0;L;;;;;N;;;;; 1222E;CUNEIFORM SIGN MUG;Lo;0;L;;;;;N;;;;; 1222F;CUNEIFORM SIGN MUG GUNU;Lo;0;L;;;;;N;;;;; 12230;CUNEIFORM SIGN MUNSUB;Lo;0;L;;;;;N;;;;; 12231;CUNEIFORM SIGN MURGU2;Lo;0;L;;;;;N;;;;; 12232;CUNEIFORM SIGN MUSH;Lo;0;L;;;;;N;;;;; 12233;CUNEIFORM SIGN MUSH TIMES A;Lo;0;L;;;;;N;;;;; 12234;CUNEIFORM SIGN MUSH TIMES KUR;Lo;0;L;;;;;N;;;;; 12235;CUNEIFORM SIGN MUSH TIMES ZA;Lo;0;L;;;;;N;;;;; 12236;CUNEIFORM SIGN MUSH OVER MUSH;Lo;0;L;;;;;N;;;;; 12237;CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; 12238;CUNEIFORM SIGN MUSH CROSSING MUSH;Lo;0;L;;;;;N;;;;; 12239;CUNEIFORM SIGN MUSH3;Lo;0;L;;;;;N;;;;; 1223A;CUNEIFORM SIGN MUSH3 TIMES A;Lo;0;L;;;;;N;;;;; 1223B;CUNEIFORM SIGN MUSH3 TIMES A PLUS DI;Lo;0;L;;;;;N;;;;; 1223C;CUNEIFORM SIGN MUSH3 TIMES DI;Lo;0;L;;;;;N;;;;; 1223D;CUNEIFORM SIGN MUSH3 GUNU;Lo;0;L;;;;;N;;;;; 1223E;CUNEIFORM SIGN NA;Lo;0;L;;;;;N;;;;; 1223F;CUNEIFORM SIGN NA2;Lo;0;L;;;;;N;;;;; 12240;CUNEIFORM SIGN NAGA;Lo;0;L;;;;;N;;;;; 12241;CUNEIFORM SIGN NAGA INVERTED;Lo;0;L;;;;;N;;;;; 12242;CUNEIFORM SIGN NAGA TIMES SHU TENU;Lo;0;L;;;;;N;;;;; 12243;CUNEIFORM SIGN NAGA OPPOSING NAGA;Lo;0;L;;;;;N;;;;; 12244;CUNEIFORM SIGN NAGAR;Lo;0;L;;;;;N;;;;; 12245;CUNEIFORM SIGN NAM NUTILLU;Lo;0;L;;;;;N;;;;; 12246;CUNEIFORM SIGN NAM;Lo;0;L;;;;;N;;;;; 12247;CUNEIFORM SIGN NAM2;Lo;0;L;;;;;N;;;;; 12248;CUNEIFORM SIGN NE;Lo;0;L;;;;;N;;;;; 12249;CUNEIFORM SIGN NE TIMES A;Lo;0;L;;;;;N;;;;; 1224A;CUNEIFORM SIGN NE TIMES UD;Lo;0;L;;;;;N;;;;; 1224B;CUNEIFORM SIGN NE SHESHIG;Lo;0;L;;;;;N;;;;; 1224C;CUNEIFORM SIGN NI;Lo;0;L;;;;;N;;;;; 1224D;CUNEIFORM SIGN NI TIMES E;Lo;0;L;;;;;N;;;;; 1224E;CUNEIFORM SIGN NI2;Lo;0;L;;;;;N;;;;; 1224F;CUNEIFORM SIGN NIM;Lo;0;L;;;;;N;;;;; 12250;CUNEIFORM SIGN NIM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; 12251;CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; 12252;CUNEIFORM SIGN NINDA2;Lo;0;L;;;;;N;;;;; 12253;CUNEIFORM SIGN NINDA2 TIMES AN;Lo;0;L;;;;;N;;;;; 12254;CUNEIFORM SIGN NINDA2 TIMES ASH;Lo;0;L;;;;;N;;;;; 12255;CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH;Lo;0;L;;;;;N;;;;; 12256;CUNEIFORM SIGN NINDA2 TIMES GUD;Lo;0;L;;;;;N;;;;; 12257;CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; 12258;CUNEIFORM SIGN NINDA2 TIMES NE;Lo;0;L;;;;;N;;;;; 12259;CUNEIFORM SIGN NINDA2 TIMES NUN;Lo;0;L;;;;;N;;;;; 1225A;CUNEIFORM SIGN NINDA2 TIMES SHE;Lo;0;L;;;;;N;;;;; 1225B;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN;Lo;0;L;;;;;N;;;;; 1225C;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH;Lo;0;L;;;;;N;;;;; 1225D;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH;Lo;0;L;;;;;N;;;;; 1225E;CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; 1225F;CUNEIFORM SIGN NINDA2 TIMES USH;Lo;0;L;;;;;N;;;;; 12260;CUNEIFORM SIGN NISAG;Lo;0;L;;;;;N;;;;; 12261;CUNEIFORM SIGN NU;Lo;0;L;;;;;N;;;;; 12262;CUNEIFORM SIGN NU11;Lo;0;L;;;;;N;;;;; 12263;CUNEIFORM SIGN NUN;Lo;0;L;;;;;N;;;;; 12264;CUNEIFORM SIGN NUN LAGAR TIMES GAR;Lo;0;L;;;;;N;;;;; 12265;CUNEIFORM SIGN NUN LAGAR TIMES MASH;Lo;0;L;;;;;N;;;;; 12266;CUNEIFORM SIGN NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; 12267;CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; 12268;CUNEIFORM SIGN NUN LAGAR TIMES USH;Lo;0;L;;;;;N;;;;; 12269;CUNEIFORM SIGN NUN TENU;Lo;0;L;;;;;N;;;;; 1226A;CUNEIFORM SIGN NUN OVER NUN;Lo;0;L;;;;;N;;;;; 1226B;CUNEIFORM SIGN NUN CROSSING NUN;Lo;0;L;;;;;N;;;;; 1226C;CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR;Lo;0;L;;;;;N;;;;; 1226D;CUNEIFORM SIGN NUNUZ;Lo;0;L;;;;;N;;;;; 1226E;CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB;Lo;0;L;;;;;N;;;;; 1226F;CUNEIFORM SIGN NUNUZ AB2 TIMES BI;Lo;0;L;;;;;N;;;;; 12270;CUNEIFORM SIGN NUNUZ AB2 TIMES DUG;Lo;0;L;;;;;N;;;;; 12271;CUNEIFORM SIGN NUNUZ AB2 TIMES GUD;Lo;0;L;;;;;N;;;;; 12272;CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; 12273;CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3;Lo;0;L;;;;;N;;;;; 12274;CUNEIFORM SIGN NUNUZ AB2 TIMES LA;Lo;0;L;;;;;N;;;;; 12275;CUNEIFORM SIGN NUNUZ AB2 TIMES NE;Lo;0;L;;;;;N;;;;; 12276;CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3;Lo;0;L;;;;;N;;;;; 12277;CUNEIFORM SIGN NUNUZ AB2 TIMES U2;Lo;0;L;;;;;N;;;;; 12278;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; 12279;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U;Lo;0;L;;;;;N;;;;; 1227A;CUNEIFORM SIGN PA;Lo;0;L;;;;;N;;;;; 1227B;CUNEIFORM SIGN PAD;Lo;0;L;;;;;N;;;;; 1227C;CUNEIFORM SIGN PAN;Lo;0;L;;;;;N;;;;; 1227D;CUNEIFORM SIGN PAP;Lo;0;L;;;;;N;;;;; 1227E;CUNEIFORM SIGN PESH2;Lo;0;L;;;;;N;;;;; 1227F;CUNEIFORM SIGN PI;Lo;0;L;;;;;N;;;;; 12280;CUNEIFORM SIGN PI TIMES A;Lo;0;L;;;;;N;;;;; 12281;CUNEIFORM SIGN PI TIMES AB;Lo;0;L;;;;;N;;;;; 12282;CUNEIFORM SIGN PI TIMES BI;Lo;0;L;;;;;N;;;;; 12283;CUNEIFORM SIGN PI TIMES BU;Lo;0;L;;;;;N;;;;; 12284;CUNEIFORM SIGN PI TIMES E;Lo;0;L;;;;;N;;;;; 12285;CUNEIFORM SIGN PI TIMES I;Lo;0;L;;;;;N;;;;; 12286;CUNEIFORM SIGN PI TIMES IB;Lo;0;L;;;;;N;;;;; 12287;CUNEIFORM SIGN PI TIMES U;Lo;0;L;;;;;N;;;;; 12288;CUNEIFORM SIGN PI TIMES U2;Lo;0;L;;;;;N;;;;; 12289;CUNEIFORM SIGN PI CROSSING PI;Lo;0;L;;;;;N;;;;; 1228A;CUNEIFORM SIGN PIRIG;Lo;0;L;;;;;N;;;;; 1228B;CUNEIFORM SIGN PIRIG TIMES KAL;Lo;0;L;;;;;N;;;;; 1228C;CUNEIFORM SIGN PIRIG TIMES UD;Lo;0;L;;;;;N;;;;; 1228D;CUNEIFORM SIGN PIRIG TIMES ZA;Lo;0;L;;;;;N;;;;; 1228E;CUNEIFORM SIGN PIRIG OPPOSING PIRIG;Lo;0;L;;;;;N;;;;; 1228F;CUNEIFORM SIGN RA;Lo;0;L;;;;;N;;;;; 12290;CUNEIFORM SIGN RAB;Lo;0;L;;;;;N;;;;; 12291;CUNEIFORM SIGN RI;Lo;0;L;;;;;N;;;;; 12292;CUNEIFORM SIGN RU;Lo;0;L;;;;;N;;;;; 12293;CUNEIFORM SIGN SA;Lo;0;L;;;;;N;;;;; 12294;CUNEIFORM SIGN SAG NUTILLU;Lo;0;L;;;;;N;;;;; 12295;CUNEIFORM SIGN SAG;Lo;0;L;;;;;N;;;;; 12296;CUNEIFORM SIGN SAG TIMES A;Lo;0;L;;;;;N;;;;; 12297;CUNEIFORM SIGN SAG TIMES DU;Lo;0;L;;;;;N;;;;; 12298;CUNEIFORM SIGN SAG TIMES DUB;Lo;0;L;;;;;N;;;;; 12299;CUNEIFORM SIGN SAG TIMES HA;Lo;0;L;;;;;N;;;;; 1229A;CUNEIFORM SIGN SAG TIMES KAK;Lo;0;L;;;;;N;;;;; 1229B;CUNEIFORM SIGN SAG TIMES KUR;Lo;0;L;;;;;N;;;;; 1229C;CUNEIFORM SIGN SAG TIMES LUM;Lo;0;L;;;;;N;;;;; 1229D;CUNEIFORM SIGN SAG TIMES MI;Lo;0;L;;;;;N;;;;; 1229E;CUNEIFORM SIGN SAG TIMES NUN;Lo;0;L;;;;;N;;;;; 1229F;CUNEIFORM SIGN SAG TIMES SAL;Lo;0;L;;;;;N;;;;; 122A0;CUNEIFORM SIGN SAG TIMES SHID;Lo;0;L;;;;;N;;;;; 122A1;CUNEIFORM SIGN SAG TIMES TAB;Lo;0;L;;;;;N;;;;; 122A2;CUNEIFORM SIGN SAG TIMES U2;Lo;0;L;;;;;N;;;;; 122A3;CUNEIFORM SIGN SAG TIMES UB;Lo;0;L;;;;;N;;;;; 122A4;CUNEIFORM SIGN SAG TIMES UM;Lo;0;L;;;;;N;;;;; 122A5;CUNEIFORM SIGN SAG TIMES UR;Lo;0;L;;;;;N;;;;; 122A6;CUNEIFORM SIGN SAG TIMES USH;Lo;0;L;;;;;N;;;;; 122A7;CUNEIFORM SIGN SAG OVER SAG;Lo;0;L;;;;;N;;;;; 122A8;CUNEIFORM SIGN SAG GUNU;Lo;0;L;;;;;N;;;;; 122A9;CUNEIFORM SIGN SAL;Lo;0;L;;;;;N;;;;; 122AA;CUNEIFORM SIGN SAL LAGAB TIMES ASH2;Lo;0;L;;;;;N;;;;; 122AB;CUNEIFORM SIGN SANGA2;Lo;0;L;;;;;N;;;;; 122AC;CUNEIFORM SIGN SAR;Lo;0;L;;;;;N;;;;; 122AD;CUNEIFORM SIGN SHA;Lo;0;L;;;;;N;;;;; 122AE;CUNEIFORM SIGN SHA3;Lo;0;L;;;;;N;;;;; 122AF;CUNEIFORM SIGN SHA3 TIMES A;Lo;0;L;;;;;N;;;;; 122B0;CUNEIFORM SIGN SHA3 TIMES BAD;Lo;0;L;;;;;N;;;;; 122B1;CUNEIFORM SIGN SHA3 TIMES GISH;Lo;0;L;;;;;N;;;;; 122B2;CUNEIFORM SIGN SHA3 TIMES NE;Lo;0;L;;;;;N;;;;; 122B3;CUNEIFORM SIGN SHA3 TIMES SHU2;Lo;0;L;;;;;N;;;;; 122B4;CUNEIFORM SIGN SHA3 TIMES TUR;Lo;0;L;;;;;N;;;;; 122B5;CUNEIFORM SIGN SHA3 TIMES U;Lo;0;L;;;;;N;;;;; 122B6;CUNEIFORM SIGN SHA3 TIMES U PLUS A;Lo;0;L;;;;;N;;;;; 122B7;CUNEIFORM SIGN SHA6;Lo;0;L;;;;;N;;;;; 122B8;CUNEIFORM SIGN SHAB6;Lo;0;L;;;;;N;;;;; 122B9;CUNEIFORM SIGN SHAR2;Lo;0;L;;;;;N;;;;; 122BA;CUNEIFORM SIGN SHE;Lo;0;L;;;;;N;;;;; 122BB;CUNEIFORM SIGN SHE HU;Lo;0;L;;;;;N;;;;; 122BC;CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; 122BD;CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR;Lo;0;L;;;;;N;;;;; 122BE;CUNEIFORM SIGN SHEG9;Lo;0;L;;;;;N;;;;; 122BF;CUNEIFORM SIGN SHEN;Lo;0;L;;;;;N;;;;; 122C0;CUNEIFORM SIGN SHESH;Lo;0;L;;;;;N;;;;; 122C1;CUNEIFORM SIGN SHESH2;Lo;0;L;;;;;N;;;;; 122C2;CUNEIFORM SIGN SHESHLAM;Lo;0;L;;;;;N;;;;; 122C3;CUNEIFORM SIGN SHID;Lo;0;L;;;;;N;;;;; 122C4;CUNEIFORM SIGN SHID TIMES A;Lo;0;L;;;;;N;;;;; 122C5;CUNEIFORM SIGN SHID TIMES IM;Lo;0;L;;;;;N;;;;; 122C6;CUNEIFORM SIGN SHIM;Lo;0;L;;;;;N;;;;; 122C7;CUNEIFORM SIGN SHIM TIMES A;Lo;0;L;;;;;N;;;;; 122C8;CUNEIFORM SIGN SHIM TIMES BAL;Lo;0;L;;;;;N;;;;; 122C9;CUNEIFORM SIGN SHIM TIMES BULUG;Lo;0;L;;;;;N;;;;; 122CA;CUNEIFORM SIGN SHIM TIMES DIN;Lo;0;L;;;;;N;;;;; 122CB;CUNEIFORM SIGN SHIM TIMES GAR;Lo;0;L;;;;;N;;;;; 122CC;CUNEIFORM SIGN SHIM TIMES IGI;Lo;0;L;;;;;N;;;;; 122CD;CUNEIFORM SIGN SHIM TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; 122CE;CUNEIFORM SIGN SHIM TIMES KUSHU2;Lo;0;L;;;;;N;;;;; 122CF;CUNEIFORM SIGN SHIM TIMES LUL;Lo;0;L;;;;;N;;;;; 122D0;CUNEIFORM SIGN SHIM TIMES MUG;Lo;0;L;;;;;N;;;;; 122D1;CUNEIFORM SIGN SHIM TIMES SAL;Lo;0;L;;;;;N;;;;; 122D2;CUNEIFORM SIGN SHINIG;Lo;0;L;;;;;N;;;;; 122D3;CUNEIFORM SIGN SHIR;Lo;0;L;;;;;N;;;;; 122D4;CUNEIFORM SIGN SHIR TENU;Lo;0;L;;;;;N;;;;; 122D5;CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR;Lo;0;L;;;;;N;;;;; 122D6;CUNEIFORM SIGN SHITA;Lo;0;L;;;;;N;;;;; 122D7;CUNEIFORM SIGN SHU;Lo;0;L;;;;;N;;;;; 122D8;CUNEIFORM SIGN SHU OVER INVERTED SHU;Lo;0;L;;;;;N;;;;; 122D9;CUNEIFORM SIGN SHU2;Lo;0;L;;;;;N;;;;; 122DA;CUNEIFORM SIGN SHUBUR;Lo;0;L;;;;;N;;;;; 122DB;CUNEIFORM SIGN SI;Lo;0;L;;;;;N;;;;; 122DC;CUNEIFORM SIGN SI GUNU;Lo;0;L;;;;;N;;;;; 122DD;CUNEIFORM SIGN SIG;Lo;0;L;;;;;N;;;;; 122DE;CUNEIFORM SIGN SIG4;Lo;0;L;;;;;N;;;;; 122DF;CUNEIFORM SIGN SIG4 OVER SIG4 SHU2;Lo;0;L;;;;;N;;;;; 122E0;CUNEIFORM SIGN SIK2;Lo;0;L;;;;;N;;;;; 122E1;CUNEIFORM SIGN SILA3;Lo;0;L;;;;;N;;;;; 122E2;CUNEIFORM SIGN SU;Lo;0;L;;;;;N;;;;; 122E3;CUNEIFORM SIGN SU OVER SU;Lo;0;L;;;;;N;;;;; 122E4;CUNEIFORM SIGN SUD;Lo;0;L;;;;;N;;;;; 122E5;CUNEIFORM SIGN SUD2;Lo;0;L;;;;;N;;;;; 122E6;CUNEIFORM SIGN SUHUR;Lo;0;L;;;;;N;;;;; 122E7;CUNEIFORM SIGN SUM;Lo;0;L;;;;;N;;;;; 122E8;CUNEIFORM SIGN SUMASH;Lo;0;L;;;;;N;;;;; 122E9;CUNEIFORM SIGN SUR;Lo;0;L;;;;;N;;;;; 122EA;CUNEIFORM SIGN SUR9;Lo;0;L;;;;;N;;;;; 122EB;CUNEIFORM SIGN TA;Lo;0;L;;;;;N;;;;; 122EC;CUNEIFORM SIGN TA ASTERISK;Lo;0;L;;;;;N;;;;; 122ED;CUNEIFORM SIGN TA TIMES HI;Lo;0;L;;;;;N;;;;; 122EE;CUNEIFORM SIGN TA TIMES MI;Lo;0;L;;;;;N;;;;; 122EF;CUNEIFORM SIGN TA GUNU;Lo;0;L;;;;;N;;;;; 122F0;CUNEIFORM SIGN TAB;Lo;0;L;;;;;N;;;;; 122F1;CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH;Lo;0;L;;;;;N;;;;; 122F2;CUNEIFORM SIGN TAB SQUARED;Lo;0;L;;;;;N;;;;; 122F3;CUNEIFORM SIGN TAG;Lo;0;L;;;;;N;;;;; 122F4;CUNEIFORM SIGN TAG TIMES BI;Lo;0;L;;;;;N;;;;; 122F5;CUNEIFORM SIGN TAG TIMES GUD;Lo;0;L;;;;;N;;;;; 122F6;CUNEIFORM SIGN TAG TIMES SHE;Lo;0;L;;;;;N;;;;; 122F7;CUNEIFORM SIGN TAG TIMES SHU;Lo;0;L;;;;;N;;;;; 122F8;CUNEIFORM SIGN TAG TIMES TUG2;Lo;0;L;;;;;N;;;;; 122F9;CUNEIFORM SIGN TAG TIMES UD;Lo;0;L;;;;;N;;;;; 122FA;CUNEIFORM SIGN TAK4;Lo;0;L;;;;;N;;;;; 122FB;CUNEIFORM SIGN TAR;Lo;0;L;;;;;N;;;;; 122FC;CUNEIFORM SIGN TE;Lo;0;L;;;;;N;;;;; 122FD;CUNEIFORM SIGN TE GUNU;Lo;0;L;;;;;N;;;;; 122FE;CUNEIFORM SIGN TI;Lo;0;L;;;;;N;;;;; 122FF;CUNEIFORM SIGN TI TENU;Lo;0;L;;;;;N;;;;; 12300;CUNEIFORM SIGN TIL;Lo;0;L;;;;;N;;;;; 12301;CUNEIFORM SIGN TIR;Lo;0;L;;;;;N;;;;; 12302;CUNEIFORM SIGN TIR TIMES TAK4;Lo;0;L;;;;;N;;;;; 12303;CUNEIFORM SIGN TIR OVER TIR;Lo;0;L;;;;;N;;;;; 12304;CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; 12305;CUNEIFORM SIGN TU;Lo;0;L;;;;;N;;;;; 12306;CUNEIFORM SIGN TUG2;Lo;0;L;;;;;N;;;;; 12307;CUNEIFORM SIGN TUK;Lo;0;L;;;;;N;;;;; 12308;CUNEIFORM SIGN TUM;Lo;0;L;;;;;N;;;;; 12309;CUNEIFORM SIGN TUR;Lo;0;L;;;;;N;;;;; 1230A;CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA;Lo;0;L;;;;;N;;;;; 1230B;CUNEIFORM SIGN U;Lo;0;L;;;;;N;;;;; 1230C;CUNEIFORM SIGN U GUD;Lo;0;L;;;;;N;;;;; 1230D;CUNEIFORM SIGN U U U;Lo;0;L;;;;;N;;;;; 1230E;CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR;Lo;0;L;;;;;N;;;;; 1230F;CUNEIFORM SIGN U OVER U SUR OVER SUR;Lo;0;L;;;;;N;;;;; 12310;CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED;Lo;0;L;;;;;N;;;;; 12311;CUNEIFORM SIGN U2;Lo;0;L;;;;;N;;;;; 12312;CUNEIFORM SIGN UB;Lo;0;L;;;;;N;;;;; 12313;CUNEIFORM SIGN UD;Lo;0;L;;;;;N;;;;; 12314;CUNEIFORM SIGN UD KUSHU2;Lo;0;L;;;;;N;;;;; 12315;CUNEIFORM SIGN UD TIMES BAD;Lo;0;L;;;;;N;;;;; 12316;CUNEIFORM SIGN UD TIMES MI;Lo;0;L;;;;;N;;;;; 12317;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; 12318;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU;Lo;0;L;;;;;N;;;;; 12319;CUNEIFORM SIGN UD GUNU;Lo;0;L;;;;;N;;;;; 1231A;CUNEIFORM SIGN UD SHESHIG;Lo;0;L;;;;;N;;;;; 1231B;CUNEIFORM SIGN UD SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;; 1231C;CUNEIFORM SIGN UDUG;Lo;0;L;;;;;N;;;;; 1231D;CUNEIFORM SIGN UM;Lo;0;L;;;;;N;;;;; 1231E;CUNEIFORM SIGN UM TIMES LAGAB;Lo;0;L;;;;;N;;;;; 1231F;CUNEIFORM SIGN UM TIMES ME PLUS DA;Lo;0;L;;;;;N;;;;; 12320;CUNEIFORM SIGN UM TIMES SHA3;Lo;0;L;;;;;N;;;;; 12321;CUNEIFORM SIGN UM TIMES U;Lo;0;L;;;;;N;;;;; 12322;CUNEIFORM SIGN UMBIN;Lo;0;L;;;;;N;;;;; 12323;CUNEIFORM SIGN UMUM;Lo;0;L;;;;;N;;;;; 12324;CUNEIFORM SIGN UMUM TIMES KASKAL;Lo;0;L;;;;;N;;;;; 12325;CUNEIFORM SIGN UMUM TIMES PA;Lo;0;L;;;;;N;;;;; 12326;CUNEIFORM SIGN UN;Lo;0;L;;;;;N;;;;; 12327;CUNEIFORM SIGN UN GUNU;Lo;0;L;;;;;N;;;;; 12328;CUNEIFORM SIGN UR;Lo;0;L;;;;;N;;;;; 12329;CUNEIFORM SIGN UR CROSSING UR;Lo;0;L;;;;;N;;;;; 1232A;CUNEIFORM SIGN UR SHESHIG;Lo;0;L;;;;;N;;;;; 1232B;CUNEIFORM SIGN UR2;Lo;0;L;;;;;N;;;;; 1232C;CUNEIFORM SIGN UR2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; 1232D;CUNEIFORM SIGN UR2 TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; 1232E;CUNEIFORM SIGN UR2 TIMES AL;Lo;0;L;;;;;N;;;;; 1232F;CUNEIFORM SIGN UR2 TIMES HA;Lo;0;L;;;;;N;;;;; 12330;CUNEIFORM SIGN UR2 TIMES NUN;Lo;0;L;;;;;N;;;;; 12331;CUNEIFORM SIGN UR2 TIMES U2;Lo;0;L;;;;;N;;;;; 12332;CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; 12333;CUNEIFORM SIGN UR2 TIMES U2 PLUS BI;Lo;0;L;;;;;N;;;;; 12334;CUNEIFORM SIGN UR4;Lo;0;L;;;;;N;;;;; 12335;CUNEIFORM SIGN URI;Lo;0;L;;;;;N;;;;; 12336;CUNEIFORM SIGN URI3;Lo;0;L;;;;;N;;;;; 12337;CUNEIFORM SIGN URU;Lo;0;L;;;;;N;;;;; 12338;CUNEIFORM SIGN URU TIMES A;Lo;0;L;;;;;N;;;;; 12339;CUNEIFORM SIGN URU TIMES ASHGAB;Lo;0;L;;;;;N;;;;; 1233A;CUNEIFORM SIGN URU TIMES BAR;Lo;0;L;;;;;N;;;;; 1233B;CUNEIFORM SIGN URU TIMES DUN;Lo;0;L;;;;;N;;;;; 1233C;CUNEIFORM SIGN URU TIMES GA;Lo;0;L;;;;;N;;;;; 1233D;CUNEIFORM SIGN URU TIMES GAL;Lo;0;L;;;;;N;;;;; 1233E;CUNEIFORM SIGN URU TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; 1233F;CUNEIFORM SIGN URU TIMES GAR;Lo;0;L;;;;;N;;;;; 12340;CUNEIFORM SIGN URU TIMES GU;Lo;0;L;;;;;N;;;;; 12341;CUNEIFORM SIGN URU TIMES HA;Lo;0;L;;;;;N;;;;; 12342;CUNEIFORM SIGN URU TIMES IGI;Lo;0;L;;;;;N;;;;; 12343;CUNEIFORM SIGN URU TIMES IM;Lo;0;L;;;;;N;;;;; 12344;CUNEIFORM SIGN URU TIMES ISH;Lo;0;L;;;;;N;;;;; 12345;CUNEIFORM SIGN URU TIMES KI;Lo;0;L;;;;;N;;;;; 12346;CUNEIFORM SIGN URU TIMES LUM;Lo;0;L;;;;;N;;;;; 12347;CUNEIFORM SIGN URU TIMES MIN;Lo;0;L;;;;;N;;;;; 12348;CUNEIFORM SIGN URU TIMES PA;Lo;0;L;;;;;N;;;;; 12349;CUNEIFORM SIGN URU TIMES SHE;Lo;0;L;;;;;N;;;;; 1234A;CUNEIFORM SIGN URU TIMES SIG4;Lo;0;L;;;;;N;;;;; 1234B;CUNEIFORM SIGN URU TIMES TU;Lo;0;L;;;;;N;;;;; 1234C;CUNEIFORM SIGN URU TIMES U PLUS GUD;Lo;0;L;;;;;N;;;;; 1234D;CUNEIFORM SIGN URU TIMES UD;Lo;0;L;;;;;N;;;;; 1234E;CUNEIFORM SIGN URU TIMES URUDA;Lo;0;L;;;;;N;;;;; 1234F;CUNEIFORM SIGN URUDA;Lo;0;L;;;;;N;;;;; 12350;CUNEIFORM SIGN URUDA TIMES U;Lo;0;L;;;;;N;;;;; 12351;CUNEIFORM SIGN USH;Lo;0;L;;;;;N;;;;; 12352;CUNEIFORM SIGN USH TIMES A;Lo;0;L;;;;;N;;;;; 12353;CUNEIFORM SIGN USH TIMES KU;Lo;0;L;;;;;N;;;;; 12354;CUNEIFORM SIGN USH TIMES KUR;Lo;0;L;;;;;N;;;;; 12355;CUNEIFORM SIGN USH TIMES TAK4;Lo;0;L;;;;;N;;;;; 12356;CUNEIFORM SIGN USHX;Lo;0;L;;;;;N;;;;; 12357;CUNEIFORM SIGN USH2;Lo;0;L;;;;;N;;;;; 12358;CUNEIFORM SIGN USHUMX;Lo;0;L;;;;;N;;;;; 12359;CUNEIFORM SIGN UTUKI;Lo;0;L;;;;;N;;;;; 1235A;CUNEIFORM SIGN UZ3;Lo;0;L;;;;;N;;;;; 1235B;CUNEIFORM SIGN UZ3 TIMES KASKAL;Lo;0;L;;;;;N;;;;; 1235C;CUNEIFORM SIGN UZU;Lo;0;L;;;;;N;;;;; 1235D;CUNEIFORM SIGN ZA;Lo;0;L;;;;;N;;;;; 1235E;CUNEIFORM SIGN ZA TENU;Lo;0;L;;;;;N;;;;; 1235F;CUNEIFORM SIGN ZA SQUARED TIMES KUR;Lo;0;L;;;;;N;;;;; 12360;CUNEIFORM SIGN ZAG;Lo;0;L;;;;;N;;;;; 12361;CUNEIFORM SIGN ZAMX;Lo;0;L;;;;;N;;;;; 12362;CUNEIFORM SIGN ZE2;Lo;0;L;;;;;N;;;;; 12363;CUNEIFORM SIGN ZI;Lo;0;L;;;;;N;;;;; 12364;CUNEIFORM SIGN ZI OVER ZI;Lo;0;L;;;;;N;;;;; 12365;CUNEIFORM SIGN ZI3;Lo;0;L;;;;;N;;;;; 12366;CUNEIFORM SIGN ZIB;Lo;0;L;;;;;N;;;;; 12367;CUNEIFORM SIGN ZIB KABA TENU;Lo;0;L;;;;;N;;;;; 12368;CUNEIFORM SIGN ZIG;Lo;0;L;;;;;N;;;;; 12369;CUNEIFORM SIGN ZIZ2;Lo;0;L;;;;;N;;;;; 1236A;CUNEIFORM SIGN ZU;Lo;0;L;;;;;N;;;;; 1236B;CUNEIFORM SIGN ZU5;Lo;0;L;;;;;N;;;;; 1236C;CUNEIFORM SIGN ZU5 TIMES A;Lo;0;L;;;;;N;;;;; 1236D;CUNEIFORM SIGN ZUBUR;Lo;0;L;;;;;N;;;;; 1236E;CUNEIFORM SIGN ZUM;Lo;0;L;;;;;N;;;;; 1236F;CUNEIFORM SIGN KAP ELAMITE;Lo;0;L;;;;;N;;;;; 12370;CUNEIFORM SIGN AB TIMES NUN;Lo;0;L;;;;;N;;;;; 12371;CUNEIFORM SIGN AB2 TIMES A;Lo;0;L;;;;;N;;;;; 12372;CUNEIFORM SIGN AMAR TIMES KUG;Lo;0;L;;;;;N;;;;; 12373;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH;Lo;0;L;;;;;N;;;;; 12374;CUNEIFORM SIGN DAG3;Lo;0;L;;;;;N;;;;; 12375;CUNEIFORM SIGN DISH PLUS SHU;Lo;0;L;;;;;N;;;;; 12376;CUNEIFORM SIGN DUB TIMES SHE;Lo;0;L;;;;;N;;;;; 12377;CUNEIFORM SIGN EZEN TIMES GUD;Lo;0;L;;;;;N;;;;; 12378;CUNEIFORM SIGN EZEN TIMES SHE;Lo;0;L;;;;;N;;;;; 12379;CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A;Lo;0;L;;;;;N;;;;; 1237A;CUNEIFORM SIGN GA2 TIMES ASH2;Lo;0;L;;;;;N;;;;; 1237B;CUNEIFORM SIGN GE22;Lo;0;L;;;;;N;;;;; 1237C;CUNEIFORM SIGN GIG;Lo;0;L;;;;;N;;;;; 1237D;CUNEIFORM SIGN HUSH;Lo;0;L;;;;;N;;;;; 1237E;CUNEIFORM SIGN KA TIMES ANSHE;Lo;0;L;;;;;N;;;;; 1237F;CUNEIFORM SIGN KA TIMES ASH3;Lo;0;L;;;;;N;;;;; 12380;CUNEIFORM SIGN KA TIMES GISH;Lo;0;L;;;;;N;;;;; 12381;CUNEIFORM SIGN KA TIMES GUD;Lo;0;L;;;;;N;;;;; 12382;CUNEIFORM SIGN KA TIMES HI TIMES ASH2;Lo;0;L;;;;;N;;;;; 12383;CUNEIFORM SIGN KA TIMES LUM;Lo;0;L;;;;;N;;;;; 12384;CUNEIFORM SIGN KA TIMES PA;Lo;0;L;;;;;N;;;;; 12385;CUNEIFORM SIGN KA TIMES SHUL;Lo;0;L;;;;;N;;;;; 12386;CUNEIFORM SIGN KA TIMES TU;Lo;0;L;;;;;N;;;;; 12387;CUNEIFORM SIGN KA TIMES UR2;Lo;0;L;;;;;N;;;;; 12388;CUNEIFORM SIGN LAGAB TIMES GI;Lo;0;L;;;;;N;;;;; 12389;CUNEIFORM SIGN LU2 SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;; 1238A;CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL;Lo;0;L;;;;;N;;;;; 1238B;CUNEIFORM SIGN LU2 TIMES SHU;Lo;0;L;;;;;N;;;;; 1238C;CUNEIFORM SIGN MESH;Lo;0;L;;;;;N;;;;; 1238D;CUNEIFORM SIGN MUSH3 TIMES ZA;Lo;0;L;;;;;N;;;;; 1238E;CUNEIFORM SIGN NA4;Lo;0;L;;;;;N;;;;; 1238F;CUNEIFORM SIGN NIN;Lo;0;L;;;;;N;;;;; 12390;CUNEIFORM SIGN NIN9;Lo;0;L;;;;;N;;;;; 12391;CUNEIFORM SIGN NINDA2 TIMES BAL;Lo;0;L;;;;;N;;;;; 12392;CUNEIFORM SIGN NINDA2 TIMES GI;Lo;0;L;;;;;N;;;;; 12393;CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES;Lo;0;L;;;;;N;;;;; 12394;CUNEIFORM SIGN PESH2 ASTERISK;Lo;0;L;;;;;N;;;;; 12395;CUNEIFORM SIGN PIR2;Lo;0;L;;;;;N;;;;; 12396;CUNEIFORM SIGN SAG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; 12397;CUNEIFORM SIGN TI2;Lo;0;L;;;;;N;;;;; 12398;CUNEIFORM SIGN UM TIMES ME;Lo;0;L;;;;;N;;;;; 12399;CUNEIFORM SIGN U U;Lo;0;L;;;;;N;;;;; 12400;CUNEIFORM NUMERIC SIGN TWO ASH;Nl;0;L;;;;2;N;;;;; 12401;CUNEIFORM NUMERIC SIGN THREE ASH;Nl;0;L;;;;3;N;;;;; 12402;CUNEIFORM NUMERIC SIGN FOUR ASH;Nl;0;L;;;;4;N;;;;; 12403;CUNEIFORM NUMERIC SIGN FIVE ASH;Nl;0;L;;;;5;N;;;;; 12404;CUNEIFORM NUMERIC SIGN SIX ASH;Nl;0;L;;;;6;N;;;;; 12405;CUNEIFORM NUMERIC SIGN SEVEN ASH;Nl;0;L;;;;7;N;;;;; 12406;CUNEIFORM NUMERIC SIGN EIGHT ASH;Nl;0;L;;;;8;N;;;;; 12407;CUNEIFORM NUMERIC SIGN NINE ASH;Nl;0;L;;;;9;N;;;;; 12408;CUNEIFORM NUMERIC SIGN THREE DISH;Nl;0;L;;;;3;N;;;;; 12409;CUNEIFORM NUMERIC SIGN FOUR DISH;Nl;0;L;;;;4;N;;;;; 1240A;CUNEIFORM NUMERIC SIGN FIVE DISH;Nl;0;L;;;;5;N;;;;; 1240B;CUNEIFORM NUMERIC SIGN SIX DISH;Nl;0;L;;;;6;N;;;;; 1240C;CUNEIFORM NUMERIC SIGN SEVEN DISH;Nl;0;L;;;;7;N;;;;; 1240D;CUNEIFORM NUMERIC SIGN EIGHT DISH;Nl;0;L;;;;8;N;;;;; 1240E;CUNEIFORM NUMERIC SIGN NINE DISH;Nl;0;L;;;;9;N;;;;; 1240F;CUNEIFORM NUMERIC SIGN FOUR U;Nl;0;L;;;;4;N;;;;; 12410;CUNEIFORM NUMERIC SIGN FIVE U;Nl;0;L;;;;5;N;;;;; 12411;CUNEIFORM NUMERIC SIGN SIX U;Nl;0;L;;;;6;N;;;;; 12412;CUNEIFORM NUMERIC SIGN SEVEN U;Nl;0;L;;;;7;N;;;;; 12413;CUNEIFORM NUMERIC SIGN EIGHT U;Nl;0;L;;;;8;N;;;;; 12414;CUNEIFORM NUMERIC SIGN NINE U;Nl;0;L;;;;9;N;;;;; 12415;CUNEIFORM NUMERIC SIGN ONE GESH2;Nl;0;L;;;;1;N;;;;; 12416;CUNEIFORM NUMERIC SIGN TWO GESH2;Nl;0;L;;;;2;N;;;;; 12417;CUNEIFORM NUMERIC SIGN THREE GESH2;Nl;0;L;;;;3;N;;;;; 12418;CUNEIFORM NUMERIC SIGN FOUR GESH2;Nl;0;L;;;;4;N;;;;; 12419;CUNEIFORM NUMERIC SIGN FIVE GESH2;Nl;0;L;;;;5;N;;;;; 1241A;CUNEIFORM NUMERIC SIGN SIX GESH2;Nl;0;L;;;;6;N;;;;; 1241B;CUNEIFORM NUMERIC SIGN SEVEN GESH2;Nl;0;L;;;;7;N;;;;; 1241C;CUNEIFORM NUMERIC SIGN EIGHT GESH2;Nl;0;L;;;;8;N;;;;; 1241D;CUNEIFORM NUMERIC SIGN NINE GESH2;Nl;0;L;;;;9;N;;;;; 1241E;CUNEIFORM NUMERIC SIGN ONE GESHU;Nl;0;L;;;;1;N;;;;; 1241F;CUNEIFORM NUMERIC SIGN TWO GESHU;Nl;0;L;;;;2;N;;;;; 12420;CUNEIFORM NUMERIC SIGN THREE GESHU;Nl;0;L;;;;3;N;;;;; 12421;CUNEIFORM NUMERIC SIGN FOUR GESHU;Nl;0;L;;;;4;N;;;;; 12422;CUNEIFORM NUMERIC SIGN FIVE GESHU;Nl;0;L;;;;5;N;;;;; 12423;CUNEIFORM NUMERIC SIGN TWO SHAR2;Nl;0;L;;;;2;N;;;;; 12424;CUNEIFORM NUMERIC SIGN THREE SHAR2;Nl;0;L;;;;3;N;;;;; 12425;CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM;Nl;0;L;;;;3;N;;;;; 12426;CUNEIFORM NUMERIC SIGN FOUR SHAR2;Nl;0;L;;;;4;N;;;;; 12427;CUNEIFORM NUMERIC SIGN FIVE SHAR2;Nl;0;L;;;;5;N;;;;; 12428;CUNEIFORM NUMERIC SIGN SIX SHAR2;Nl;0;L;;;;6;N;;;;; 12429;CUNEIFORM NUMERIC SIGN SEVEN SHAR2;Nl;0;L;;;;7;N;;;;; 1242A;CUNEIFORM NUMERIC SIGN EIGHT SHAR2;Nl;0;L;;;;8;N;;;;; 1242B;CUNEIFORM NUMERIC SIGN NINE SHAR2;Nl;0;L;;;;9;N;;;;; 1242C;CUNEIFORM NUMERIC SIGN ONE SHARU;Nl;0;L;;;;1;N;;;;; 1242D;CUNEIFORM NUMERIC SIGN TWO SHARU;Nl;0;L;;;;2;N;;;;; 1242E;CUNEIFORM NUMERIC SIGN THREE SHARU;Nl;0;L;;;;3;N;;;;; 1242F;CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM;Nl;0;L;;;;3;N;;;;; 12430;CUNEIFORM NUMERIC SIGN FOUR SHARU;Nl;0;L;;;;4;N;;;;; 12431;CUNEIFORM NUMERIC SIGN FIVE SHARU;Nl;0;L;;;;5;N;;;;; 12432;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH;Nl;0;L;;;;216000;N;;;;; 12433;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN;Nl;0;L;;;;432000;N;;;;; 12434;CUNEIFORM NUMERIC SIGN ONE BURU;Nl;0;L;;;;1;N;;;;; 12435;CUNEIFORM NUMERIC SIGN TWO BURU;Nl;0;L;;;;2;N;;;;; 12436;CUNEIFORM NUMERIC SIGN THREE BURU;Nl;0;L;;;;3;N;;;;; 12437;CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM;Nl;0;L;;;;3;N;;;;; 12438;CUNEIFORM NUMERIC SIGN FOUR BURU;Nl;0;L;;;;4;N;;;;; 12439;CUNEIFORM NUMERIC SIGN FIVE BURU;Nl;0;L;;;;5;N;;;;; 1243A;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16;Nl;0;L;;;;3;N;;;;; 1243B;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21;Nl;0;L;;;;3;N;;;;; 1243C;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU;Nl;0;L;;;;4;N;;;;; 1243D;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4;Nl;0;L;;;;4;N;;;;; 1243E;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A;Nl;0;L;;;;4;N;;;;; 1243F;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B;Nl;0;L;;;;4;N;;;;; 12440;CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9;Nl;0;L;;;;6;N;;;;; 12441;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3;Nl;0;L;;;;7;N;;;;; 12442;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A;Nl;0;L;;;;7;N;;;;; 12443;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B;Nl;0;L;;;;7;N;;;;; 12444;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU;Nl;0;L;;;;8;N;;;;; 12445;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3;Nl;0;L;;;;8;N;;;;; 12446;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU;Nl;0;L;;;;9;N;;;;; 12447;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3;Nl;0;L;;;;9;N;;;;; 12448;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4;Nl;0;L;;;;9;N;;;;; 12449;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A;Nl;0;L;;;;9;N;;;;; 1244A;CUNEIFORM NUMERIC SIGN TWO ASH TENU;Nl;0;L;;;;2;N;;;;; 1244B;CUNEIFORM NUMERIC SIGN THREE ASH TENU;Nl;0;L;;;;3;N;;;;; 1244C;CUNEIFORM NUMERIC SIGN FOUR ASH TENU;Nl;0;L;;;;4;N;;;;; 1244D;CUNEIFORM NUMERIC SIGN FIVE ASH TENU;Nl;0;L;;;;5;N;;;;; 1244E;CUNEIFORM NUMERIC SIGN SIX ASH TENU;Nl;0;L;;;;6;N;;;;; 1244F;CUNEIFORM NUMERIC SIGN ONE BAN2;Nl;0;L;;;;1;N;;;;; 12450;CUNEIFORM NUMERIC SIGN TWO BAN2;Nl;0;L;;;;2;N;;;;; 12451;CUNEIFORM NUMERIC SIGN THREE BAN2;Nl;0;L;;;;3;N;;;;; 12452;CUNEIFORM NUMERIC SIGN FOUR BAN2;Nl;0;L;;;;4;N;;;;; 12453;CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM;Nl;0;L;;;;4;N;;;;; 12454;CUNEIFORM NUMERIC SIGN FIVE BAN2;Nl;0;L;;;;5;N;;;;; 12455;CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM;Nl;0;L;;;;5;N;;;;; 12456;CUNEIFORM NUMERIC SIGN NIGIDAMIN;Nl;0;L;;;;2;N;;;;; 12457;CUNEIFORM NUMERIC SIGN NIGIDAESH;Nl;0;L;;;;3;N;;;;; 12458;CUNEIFORM NUMERIC SIGN ONE ESHE3;Nl;0;L;;;;1;N;;;;; 12459;CUNEIFORM NUMERIC SIGN TWO ESHE3;Nl;0;L;;;;2;N;;;;; 1245A;CUNEIFORM NUMERIC SIGN ONE THIRD DISH;Nl;0;L;;;;1/3;N;;;;; 1245B;CUNEIFORM NUMERIC SIGN TWO THIRDS DISH;Nl;0;L;;;;2/3;N;;;;; 1245C;CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH;Nl;0;L;;;;5/6;N;;;;; 1245D;CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A;Nl;0;L;;;;1/3;N;;;;; 1245E;CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A;Nl;0;L;;;;2/3;N;;;;; 1245F;CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH;Nl;0;L;;;;1/8;N;;;;; 12460;CUNEIFORM NUMERIC SIGN ONE QUARTER ASH;Nl;0;L;;;;1/4;N;;;;; 12461;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH;Nl;0;L;;;;1/6;N;;;;; 12462;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER;Nl;0;L;;;;1/4;N;;;;; 12463;CUNEIFORM NUMERIC SIGN ONE QUARTER GUR;Nl;0;L;;;;1/4;N;;;;; 12464;CUNEIFORM NUMERIC SIGN ONE HALF GUR;Nl;0;L;;;;1/2;N;;;;; 12465;CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD;Nl;0;L;;;;1/3;N;;;;; 12466;CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS;Nl;0;L;;;;2/3;N;;;;; 12467;CUNEIFORM NUMERIC SIGN ELAMITE FORTY;Nl;0;L;;;;40;N;;;;; 12468;CUNEIFORM NUMERIC SIGN ELAMITE FIFTY;Nl;0;L;;;;50;N;;;;; 12469;CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM;Nl;0;L;;;;4;N;;;;; 1246A;CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM;Nl;0;L;;;;5;N;;;;; 1246B;CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM;Nl;0;L;;;;6;N;;;;; 1246C;CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM;Nl;0;L;;;;7;N;;;;; 1246D;CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM;Nl;0;L;;;;8;N;;;;; 1246E;CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM;Nl;0;L;;;;9;N;;;;; 12470;CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; 12471;CUNEIFORM PUNCTUATION SIGN VERTICAL COLON;Po;0;L;;;;;N;;;;; 12472;CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON;Po;0;L;;;;;N;;;;; 12473;CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON;Po;0;L;;;;;N;;;;; 12474;CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON;Po;0;L;;;;;N;;;;; 12480;CUNEIFORM SIGN AB TIMES NUN TENU;Lo;0;L;;;;;N;;;;; 12481;CUNEIFORM SIGN AB TIMES SHU2;Lo;0;L;;;;;N;;;;; 12482;CUNEIFORM SIGN AD TIMES ESH2;Lo;0;L;;;;;N;;;;; 12483;CUNEIFORM SIGN BAD TIMES DISH TENU;Lo;0;L;;;;;N;;;;; 12484;CUNEIFORM SIGN BAHAR2 TIMES AB2;Lo;0;L;;;;;N;;;;; 12485;CUNEIFORM SIGN BAHAR2 TIMES NI;Lo;0;L;;;;;N;;;;; 12486;CUNEIFORM SIGN BAHAR2 TIMES ZA;Lo;0;L;;;;;N;;;;; 12487;CUNEIFORM SIGN BU OVER BU TIMES NA2;Lo;0;L;;;;;N;;;;; 12488;CUNEIFORM SIGN DA TIMES TAK4;Lo;0;L;;;;;N;;;;; 12489;CUNEIFORM SIGN DAG TIMES KUR;Lo;0;L;;;;;N;;;;; 1248A;CUNEIFORM SIGN DIM TIMES IGI;Lo;0;L;;;;;N;;;;; 1248B;CUNEIFORM SIGN DIM TIMES U U U;Lo;0;L;;;;;N;;;;; 1248C;CUNEIFORM SIGN DIM2 TIMES UD;Lo;0;L;;;;;N;;;;; 1248D;CUNEIFORM SIGN DUG TIMES ANSHE;Lo;0;L;;;;;N;;;;; 1248E;CUNEIFORM SIGN DUG TIMES ASH;Lo;0;L;;;;;N;;;;; 1248F;CUNEIFORM SIGN DUG TIMES ASH AT LEFT;Lo;0;L;;;;;N;;;;; 12490;CUNEIFORM SIGN DUG TIMES DIN;Lo;0;L;;;;;N;;;;; 12491;CUNEIFORM SIGN DUG TIMES DUN;Lo;0;L;;;;;N;;;;; 12492;CUNEIFORM SIGN DUG TIMES ERIN2;Lo;0;L;;;;;N;;;;; 12493;CUNEIFORM SIGN DUG TIMES GA;Lo;0;L;;;;;N;;;;; 12494;CUNEIFORM SIGN DUG TIMES GI;Lo;0;L;;;;;N;;;;; 12495;CUNEIFORM SIGN DUG TIMES GIR2 GUNU;Lo;0;L;;;;;N;;;;; 12496;CUNEIFORM SIGN DUG TIMES GISH;Lo;0;L;;;;;N;;;;; 12497;CUNEIFORM SIGN DUG TIMES HA;Lo;0;L;;;;;N;;;;; 12498;CUNEIFORM SIGN DUG TIMES HI;Lo;0;L;;;;;N;;;;; 12499;CUNEIFORM SIGN DUG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; 1249A;CUNEIFORM SIGN DUG TIMES KASKAL;Lo;0;L;;;;;N;;;;; 1249B;CUNEIFORM SIGN DUG TIMES KUR;Lo;0;L;;;;;N;;;;; 1249C;CUNEIFORM SIGN DUG TIMES KUSHU2;Lo;0;L;;;;;N;;;;; 1249D;CUNEIFORM SIGN DUG TIMES KUSHU2 PLUS KASKAL;Lo;0;L;;;;;N;;;;; 1249E;CUNEIFORM SIGN DUG TIMES LAK-020;Lo;0;L;;;;;N;;;;; 1249F;CUNEIFORM SIGN DUG TIMES LAM;Lo;0;L;;;;;N;;;;; 124A0;CUNEIFORM SIGN DUG TIMES LAM TIMES KUR;Lo;0;L;;;;;N;;;;; 124A1;CUNEIFORM SIGN DUG TIMES LUH PLUS GISH;Lo;0;L;;;;;N;;;;; 124A2;CUNEIFORM SIGN DUG TIMES MASH;Lo;0;L;;;;;N;;;;; 124A3;CUNEIFORM SIGN DUG TIMES MES;Lo;0;L;;;;;N;;;;; 124A4;CUNEIFORM SIGN DUG TIMES MI;Lo;0;L;;;;;N;;;;; 124A5;CUNEIFORM SIGN DUG TIMES NI;Lo;0;L;;;;;N;;;;; 124A6;CUNEIFORM SIGN DUG TIMES PI;Lo;0;L;;;;;N;;;;; 124A7;CUNEIFORM SIGN DUG TIMES SHE;Lo;0;L;;;;;N;;;;; 124A8;CUNEIFORM SIGN DUG TIMES SI GUNU;Lo;0;L;;;;;N;;;;; 124A9;CUNEIFORM SIGN E2 TIMES KUR;Lo;0;L;;;;;N;;;;; 124AA;CUNEIFORM SIGN E2 TIMES PAP;Lo;0;L;;;;;N;;;;; 124AB;CUNEIFORM SIGN ERIN2 X;Lo;0;L;;;;;N;;;;; 124AC;CUNEIFORM SIGN ESH2 CROSSING ESH2;Lo;0;L;;;;;N;;;;; 124AD;CUNEIFORM SIGN EZEN SHESHIG TIMES ASH;Lo;0;L;;;;;N;;;;; 124AE;CUNEIFORM SIGN EZEN SHESHIG TIMES HI;Lo;0;L;;;;;N;;;;; 124AF;CUNEIFORM SIGN EZEN SHESHIG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; 124B0;CUNEIFORM SIGN EZEN SHESHIG TIMES LA;Lo;0;L;;;;;N;;;;; 124B1;CUNEIFORM SIGN EZEN SHESHIG TIMES LAL;Lo;0;L;;;;;N;;;;; 124B2;CUNEIFORM SIGN EZEN SHESHIG TIMES ME;Lo;0;L;;;;;N;;;;; 124B3;CUNEIFORM SIGN EZEN SHESHIG TIMES MES;Lo;0;L;;;;;N;;;;; 124B4;CUNEIFORM SIGN EZEN SHESHIG TIMES SU;Lo;0;L;;;;;N;;;;; 124B5;CUNEIFORM SIGN EZEN TIMES SU;Lo;0;L;;;;;N;;;;; 124B6;CUNEIFORM SIGN GA2 TIMES BAHAR2;Lo;0;L;;;;;N;;;;; 124B7;CUNEIFORM SIGN GA2 TIMES DIM GUNU;Lo;0;L;;;;;N;;;;; 124B8;CUNEIFORM SIGN GA2 TIMES DUG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; 124B9;CUNEIFORM SIGN GA2 TIMES DUG TIMES KASKAL;Lo;0;L;;;;;N;;;;; 124BA;CUNEIFORM SIGN GA2 TIMES EREN;Lo;0;L;;;;;N;;;;; 124BB;CUNEIFORM SIGN GA2 TIMES GA;Lo;0;L;;;;;N;;;;; 124BC;CUNEIFORM SIGN GA2 TIMES GAR PLUS DI;Lo;0;L;;;;;N;;;;; 124BD;CUNEIFORM SIGN GA2 TIMES GAR PLUS NE;Lo;0;L;;;;;N;;;;; 124BE;CUNEIFORM SIGN GA2 TIMES HA PLUS A;Lo;0;L;;;;;N;;;;; 124BF;CUNEIFORM SIGN GA2 TIMES KUSHU2 PLUS KASKAL;Lo;0;L;;;;;N;;;;; 124C0;CUNEIFORM SIGN GA2 TIMES LAM;Lo;0;L;;;;;N;;;;; 124C1;CUNEIFORM SIGN GA2 TIMES LAM TIMES KUR;Lo;0;L;;;;;N;;;;; 124C2;CUNEIFORM SIGN GA2 TIMES LUH;Lo;0;L;;;;;N;;;;; 124C3;CUNEIFORM SIGN GA2 TIMES MUSH;Lo;0;L;;;;;N;;;;; 124C4;CUNEIFORM SIGN GA2 TIMES NE;Lo;0;L;;;;;N;;;;; 124C5;CUNEIFORM SIGN GA2 TIMES NE PLUS E2;Lo;0;L;;;;;N;;;;; 124C6;CUNEIFORM SIGN GA2 TIMES NE PLUS GI;Lo;0;L;;;;;N;;;;; 124C7;CUNEIFORM SIGN GA2 TIMES SHIM;Lo;0;L;;;;;N;;;;; 124C8;CUNEIFORM SIGN GA2 TIMES ZIZ2;Lo;0;L;;;;;N;;;;; 124C9;CUNEIFORM SIGN GABA ROTATED NINETY DEGREES;Lo;0;L;;;;;N;;;;; 124CA;CUNEIFORM SIGN GESHTIN TIMES U;Lo;0;L;;;;;N;;;;; 124CB;CUNEIFORM SIGN GISH TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; 124CC;CUNEIFORM SIGN GU2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; 124CD;CUNEIFORM SIGN GUD PLUS GISH TIMES TAK4;Lo;0;L;;;;;N;;;;; 124CE;CUNEIFORM SIGN HA TENU GUNU;Lo;0;L;;;;;N;;;;; 124CF;CUNEIFORM SIGN HI TIMES ASH OVER HI TIMES ASH;Lo;0;L;;;;;N;;;;; 124D0;CUNEIFORM SIGN KA TIMES BU;Lo;0;L;;;;;N;;;;; 124D1;CUNEIFORM SIGN KA TIMES KA;Lo;0;L;;;;;N;;;;; 124D2;CUNEIFORM SIGN KA TIMES U U U;Lo;0;L;;;;;N;;;;; 124D3;CUNEIFORM SIGN KA TIMES UR;Lo;0;L;;;;;N;;;;; 124D4;CUNEIFORM SIGN LAGAB TIMES ZU OVER ZU;Lo;0;L;;;;;N;;;;; 124D5;CUNEIFORM SIGN LAK-003;Lo;0;L;;;;;N;;;;; 124D6;CUNEIFORM SIGN LAK-021;Lo;0;L;;;;;N;;;;; 124D7;CUNEIFORM SIGN LAK-025;Lo;0;L;;;;;N;;;;; 124D8;CUNEIFORM SIGN LAK-030;Lo;0;L;;;;;N;;;;; 124D9;CUNEIFORM SIGN LAK-050;Lo;0;L;;;;;N;;;;; 124DA;CUNEIFORM SIGN LAK-051;Lo;0;L;;;;;N;;;;; 124DB;CUNEIFORM SIGN LAK-062;Lo;0;L;;;;;N;;;;; 124DC;CUNEIFORM SIGN LAK-079 OVER LAK-079 GUNU;Lo;0;L;;;;;N;;;;; 124DD;CUNEIFORM SIGN LAK-080;Lo;0;L;;;;;N;;;;; 124DE;CUNEIFORM SIGN LAK-081 OVER LAK-081;Lo;0;L;;;;;N;;;;; 124DF;CUNEIFORM SIGN LAK-092;Lo;0;L;;;;;N;;;;; 124E0;CUNEIFORM SIGN LAK-130;Lo;0;L;;;;;N;;;;; 124E1;CUNEIFORM SIGN LAK-142;Lo;0;L;;;;;N;;;;; 124E2;CUNEIFORM SIGN LAK-210;Lo;0;L;;;;;N;;;;; 124E3;CUNEIFORM SIGN LAK-219;Lo;0;L;;;;;N;;;;; 124E4;CUNEIFORM SIGN LAK-220;Lo;0;L;;;;;N;;;;; 124E5;CUNEIFORM SIGN LAK-225;Lo;0;L;;;;;N;;;;; 124E6;CUNEIFORM SIGN LAK-228;Lo;0;L;;;;;N;;;;; 124E7;CUNEIFORM SIGN LAK-238;Lo;0;L;;;;;N;;;;; 124E8;CUNEIFORM SIGN LAK-265;Lo;0;L;;;;;N;;;;; 124E9;CUNEIFORM SIGN LAK-266;Lo;0;L;;;;;N;;;;; 124EA;CUNEIFORM SIGN LAK-343;Lo;0;L;;;;;N;;;;; 124EB;CUNEIFORM SIGN LAK-347;Lo;0;L;;;;;N;;;;; 124EC;CUNEIFORM SIGN LAK-348;Lo;0;L;;;;;N;;;;; 124ED;CUNEIFORM SIGN LAK-383;Lo;0;L;;;;;N;;;;; 124EE;CUNEIFORM SIGN LAK-384;Lo;0;L;;;;;N;;;;; 124EF;CUNEIFORM SIGN LAK-390;Lo;0;L;;;;;N;;;;; 124F0;CUNEIFORM SIGN LAK-441;Lo;0;L;;;;;N;;;;; 124F1;CUNEIFORM SIGN LAK-449;Lo;0;L;;;;;N;;;;; 124F2;CUNEIFORM SIGN LAK-449 TIMES GU;Lo;0;L;;;;;N;;;;; 124F3;CUNEIFORM SIGN LAK-449 TIMES IGI;Lo;0;L;;;;;N;;;;; 124F4;CUNEIFORM SIGN LAK-449 TIMES PAP PLUS LU3;Lo;0;L;;;;;N;;;;; 124F5;CUNEIFORM SIGN LAK-449 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; 124F6;CUNEIFORM SIGN LAK-449 TIMES U2 PLUS BA;Lo;0;L;;;;;N;;;;; 124F7;CUNEIFORM SIGN LAK-450;Lo;0;L;;;;;N;;;;; 124F8;CUNEIFORM SIGN LAK-457;Lo;0;L;;;;;N;;;;; 124F9;CUNEIFORM SIGN LAK-470;Lo;0;L;;;;;N;;;;; 124FA;CUNEIFORM SIGN LAK-483;Lo;0;L;;;;;N;;;;; 124FB;CUNEIFORM SIGN LAK-490;Lo;0;L;;;;;N;;;;; 124FC;CUNEIFORM SIGN LAK-492;Lo;0;L;;;;;N;;;;; 124FD;CUNEIFORM SIGN LAK-493;Lo;0;L;;;;;N;;;;; 124FE;CUNEIFORM SIGN LAK-495;Lo;0;L;;;;;N;;;;; 124FF;CUNEIFORM SIGN LAK-550;Lo;0;L;;;;;N;;;;; 12500;CUNEIFORM SIGN LAK-608;Lo;0;L;;;;;N;;;;; 12501;CUNEIFORM SIGN LAK-617;Lo;0;L;;;;;N;;;;; 12502;CUNEIFORM SIGN LAK-617 TIMES ASH;Lo;0;L;;;;;N;;;;; 12503;CUNEIFORM SIGN LAK-617 TIMES BAD;Lo;0;L;;;;;N;;;;; 12504;CUNEIFORM SIGN LAK-617 TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; 12505;CUNEIFORM SIGN LAK-617 TIMES KU3;Lo;0;L;;;;;N;;;;; 12506;CUNEIFORM SIGN LAK-617 TIMES LA;Lo;0;L;;;;;N;;;;; 12507;CUNEIFORM SIGN LAK-617 TIMES TAR;Lo;0;L;;;;;N;;;;; 12508;CUNEIFORM SIGN LAK-617 TIMES TE;Lo;0;L;;;;;N;;;;; 12509;CUNEIFORM SIGN LAK-617 TIMES U2;Lo;0;L;;;;;N;;;;; 1250A;CUNEIFORM SIGN LAK-617 TIMES UD;Lo;0;L;;;;;N;;;;; 1250B;CUNEIFORM SIGN LAK-617 TIMES URUDA;Lo;0;L;;;;;N;;;;; 1250C;CUNEIFORM SIGN LAK-636;Lo;0;L;;;;;N;;;;; 1250D;CUNEIFORM SIGN LAK-648;Lo;0;L;;;;;N;;;;; 1250E;CUNEIFORM SIGN LAK-648 TIMES DUB;Lo;0;L;;;;;N;;;;; 1250F;CUNEIFORM SIGN LAK-648 TIMES GA;Lo;0;L;;;;;N;;;;; 12510;CUNEIFORM SIGN LAK-648 TIMES IGI;Lo;0;L;;;;;N;;;;; 12511;CUNEIFORM SIGN LAK-648 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; 12512;CUNEIFORM SIGN LAK-648 TIMES NI;Lo;0;L;;;;;N;;;;; 12513;CUNEIFORM SIGN LAK-648 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; 12514;CUNEIFORM SIGN LAK-648 TIMES SHESH PLUS KI;Lo;0;L;;;;;N;;;;; 12515;CUNEIFORM SIGN LAK-648 TIMES UD;Lo;0;L;;;;;N;;;;; 12516;CUNEIFORM SIGN LAK-648 TIMES URUDA;Lo;0;L;;;;;N;;;;; 12517;CUNEIFORM SIGN LAK-724;Lo;0;L;;;;;N;;;;; 12518;CUNEIFORM SIGN LAK-749;Lo;0;L;;;;;N;;;;; 12519;CUNEIFORM SIGN LU2 GUNU TIMES ASH;Lo;0;L;;;;;N;;;;; 1251A;CUNEIFORM SIGN LU2 TIMES DISH;Lo;0;L;;;;;N;;;;; 1251B;CUNEIFORM SIGN LU2 TIMES HAL;Lo;0;L;;;;;N;;;;; 1251C;CUNEIFORM SIGN LU2 TIMES PAP;Lo;0;L;;;;;N;;;;; 1251D;CUNEIFORM SIGN LU2 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; 1251E;CUNEIFORM SIGN LU2 TIMES TAK4;Lo;0;L;;;;;N;;;;; 1251F;CUNEIFORM SIGN MI PLUS ZA7;Lo;0;L;;;;;N;;;;; 12520;CUNEIFORM SIGN MUSH OVER MUSH TIMES GA;Lo;0;L;;;;;N;;;;; 12521;CUNEIFORM SIGN MUSH OVER MUSH TIMES KAK;Lo;0;L;;;;;N;;;;; 12522;CUNEIFORM SIGN NINDA2 TIMES DIM GUNU;Lo;0;L;;;;;N;;;;; 12523;CUNEIFORM SIGN NINDA2 TIMES GISH;Lo;0;L;;;;;N;;;;; 12524;CUNEIFORM SIGN NINDA2 TIMES GUL;Lo;0;L;;;;;N;;;;; 12525;CUNEIFORM SIGN NINDA2 TIMES HI;Lo;0;L;;;;;N;;;;; 12526;CUNEIFORM SIGN NINDA2 TIMES KESH2;Lo;0;L;;;;;N;;;;; 12527;CUNEIFORM SIGN NINDA2 TIMES LAK-050;Lo;0;L;;;;;N;;;;; 12528;CUNEIFORM SIGN NINDA2 TIMES MASH;Lo;0;L;;;;;N;;;;; 12529;CUNEIFORM SIGN NINDA2 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;; 1252A;CUNEIFORM SIGN NINDA2 TIMES U;Lo;0;L;;;;;N;;;;; 1252B;CUNEIFORM SIGN NINDA2 TIMES U PLUS U;Lo;0;L;;;;;N;;;;; 1252C;CUNEIFORM SIGN NINDA2 TIMES URUDA;Lo;0;L;;;;;N;;;;; 1252D;CUNEIFORM SIGN SAG GUNU TIMES HA;Lo;0;L;;;;;N;;;;; 1252E;CUNEIFORM SIGN SAG TIMES EN;Lo;0;L;;;;;N;;;;; 1252F;CUNEIFORM SIGN SAG TIMES SHE AT LEFT;Lo;0;L;;;;;N;;;;; 12530;CUNEIFORM SIGN SAG TIMES TAK4;Lo;0;L;;;;;N;;;;; 12531;CUNEIFORM SIGN SHA6 TENU;Lo;0;L;;;;;N;;;;; 12532;CUNEIFORM SIGN SHE OVER SHE;Lo;0;L;;;;;N;;;;; 12533;CUNEIFORM SIGN SHE PLUS HUB2;Lo;0;L;;;;;N;;;;; 12534;CUNEIFORM SIGN SHE PLUS NAM2;Lo;0;L;;;;;N;;;;; 12535;CUNEIFORM SIGN SHE PLUS SAR;Lo;0;L;;;;;N;;;;; 12536;CUNEIFORM SIGN SHU2 PLUS DUG TIMES NI;Lo;0;L;;;;;N;;;;; 12537;CUNEIFORM SIGN SHU2 PLUS E2 TIMES AN;Lo;0;L;;;;;N;;;;; 12538;CUNEIFORM SIGN SI TIMES TAK4;Lo;0;L;;;;;N;;;;; 12539;CUNEIFORM SIGN TAK4 PLUS SAG;Lo;0;L;;;;;N;;;;; 1253A;CUNEIFORM SIGN TUM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; 1253B;CUNEIFORM SIGN TUM TIMES THREE DISH;Lo;0;L;;;;;N;;;;; 1253C;CUNEIFORM SIGN UR2 INVERTED;Lo;0;L;;;;;N;;;;; 1253D;CUNEIFORM SIGN UR2 TIMES UD;Lo;0;L;;;;;N;;;;; 1253E;CUNEIFORM SIGN URU TIMES DARA3;Lo;0;L;;;;;N;;;;; 1253F;CUNEIFORM SIGN URU TIMES LAK-668;Lo;0;L;;;;;N;;;;; 12540;CUNEIFORM SIGN URU TIMES LU3;Lo;0;L;;;;;N;;;;; 12541;CUNEIFORM SIGN ZA7;Lo;0;L;;;;;N;;;;; 12542;CUNEIFORM SIGN ZU OVER ZU PLUS SAR;Lo;0;L;;;;;N;;;;; 12543;CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU;Lo;0;L;;;;;N;;;;; 13000;EGYPTIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;; 13001;EGYPTIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;; 13002;EGYPTIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;; 13003;EGYPTIAN HIEROGLYPH A004;Lo;0;L;;;;;N;;;;; 13004;EGYPTIAN HIEROGLYPH A005;Lo;0;L;;;;;N;;;;; 13005;EGYPTIAN HIEROGLYPH A005A;Lo;0;L;;;;;N;;;;; 13006;EGYPTIAN HIEROGLYPH A006;Lo;0;L;;;;;N;;;;; 13007;EGYPTIAN HIEROGLYPH A006A;Lo;0;L;;;;;N;;;;; 13008;EGYPTIAN HIEROGLYPH A006B;Lo;0;L;;;;;N;;;;; 13009;EGYPTIAN HIEROGLYPH A007;Lo;0;L;;;;;N;;;;; 1300A;EGYPTIAN HIEROGLYPH A008;Lo;0;L;;;;;N;;;;; 1300B;EGYPTIAN HIEROGLYPH A009;Lo;0;L;;;;;N;;;;; 1300C;EGYPTIAN HIEROGLYPH A010;Lo;0;L;;;;;N;;;;; 1300D;EGYPTIAN HIEROGLYPH A011;Lo;0;L;;;;;N;;;;; 1300E;EGYPTIAN HIEROGLYPH A012;Lo;0;L;;;;;N;;;;; 1300F;EGYPTIAN HIEROGLYPH A013;Lo;0;L;;;;;N;;;;; 13010;EGYPTIAN HIEROGLYPH A014;Lo;0;L;;;;;N;;;;; 13011;EGYPTIAN HIEROGLYPH A014A;Lo;0;L;;;;;N;;;;; 13012;EGYPTIAN HIEROGLYPH A015;Lo;0;L;;;;;N;;;;; 13013;EGYPTIAN HIEROGLYPH A016;Lo;0;L;;;;;N;;;;; 13014;EGYPTIAN HIEROGLYPH A017;Lo;0;L;;;;;N;;;;; 13015;EGYPTIAN HIEROGLYPH A017A;Lo;0;L;;;;;N;;;;; 13016;EGYPTIAN HIEROGLYPH A018;Lo;0;L;;;;;N;;;;; 13017;EGYPTIAN HIEROGLYPH A019;Lo;0;L;;;;;N;;;;; 13018;EGYPTIAN HIEROGLYPH A020;Lo;0;L;;;;;N;;;;; 13019;EGYPTIAN HIEROGLYPH A021;Lo;0;L;;;;;N;;;;; 1301A;EGYPTIAN HIEROGLYPH A022;Lo;0;L;;;;;N;;;;; 1301B;EGYPTIAN HIEROGLYPH A023;Lo;0;L;;;;;N;;;;; 1301C;EGYPTIAN HIEROGLYPH A024;Lo;0;L;;;;;N;;;;; 1301D;EGYPTIAN HIEROGLYPH A025;Lo;0;L;;;;;N;;;;; 1301E;EGYPTIAN HIEROGLYPH A026;Lo;0;L;;;;;N;;;;; 1301F;EGYPTIAN HIEROGLYPH A027;Lo;0;L;;;;;N;;;;; 13020;EGYPTIAN HIEROGLYPH A028;Lo;0;L;;;;;N;;;;; 13021;EGYPTIAN HIEROGLYPH A029;Lo;0;L;;;;;N;;;;; 13022;EGYPTIAN HIEROGLYPH A030;Lo;0;L;;;;;N;;;;; 13023;EGYPTIAN HIEROGLYPH A031;Lo;0;L;;;;;N;;;;; 13024;EGYPTIAN HIEROGLYPH A032;Lo;0;L;;;;;N;;;;; 13025;EGYPTIAN HIEROGLYPH A032A;Lo;0;L;;;;;N;;;;; 13026;EGYPTIAN HIEROGLYPH A033;Lo;0;L;;;;;N;;;;; 13027;EGYPTIAN HIEROGLYPH A034;Lo;0;L;;;;;N;;;;; 13028;EGYPTIAN HIEROGLYPH A035;Lo;0;L;;;;;N;;;;; 13029;EGYPTIAN HIEROGLYPH A036;Lo;0;L;;;;;N;;;;; 1302A;EGYPTIAN HIEROGLYPH A037;Lo;0;L;;;;;N;;;;; 1302B;EGYPTIAN HIEROGLYPH A038;Lo;0;L;;;;;N;;;;; 1302C;EGYPTIAN HIEROGLYPH A039;Lo;0;L;;;;;N;;;;; 1302D;EGYPTIAN HIEROGLYPH A040;Lo;0;L;;;;;N;;;;; 1302E;EGYPTIAN HIEROGLYPH A040A;Lo;0;L;;;;;N;;;;; 1302F;EGYPTIAN HIEROGLYPH A041;Lo;0;L;;;;;N;;;;; 13030;EGYPTIAN HIEROGLYPH A042;Lo;0;L;;;;;N;;;;; 13031;EGYPTIAN HIEROGLYPH A042A;Lo;0;L;;;;;N;;;;; 13032;EGYPTIAN HIEROGLYPH A043;Lo;0;L;;;;;N;;;;; 13033;EGYPTIAN HIEROGLYPH A043A;Lo;0;L;;;;;N;;;;; 13034;EGYPTIAN HIEROGLYPH A044;Lo;0;L;;;;;N;;;;; 13035;EGYPTIAN HIEROGLYPH A045;Lo;0;L;;;;;N;;;;; 13036;EGYPTIAN HIEROGLYPH A045A;Lo;0;L;;;;;N;;;;; 13037;EGYPTIAN HIEROGLYPH A046;Lo;0;L;;;;;N;;;;; 13038;EGYPTIAN HIEROGLYPH A047;Lo;0;L;;;;;N;;;;; 13039;EGYPTIAN HIEROGLYPH A048;Lo;0;L;;;;;N;;;;; 1303A;EGYPTIAN HIEROGLYPH A049;Lo;0;L;;;;;N;;;;; 1303B;EGYPTIAN HIEROGLYPH A050;Lo;0;L;;;;;N;;;;; 1303C;EGYPTIAN HIEROGLYPH A051;Lo;0;L;;;;;N;;;;; 1303D;EGYPTIAN HIEROGLYPH A052;Lo;0;L;;;;;N;;;;; 1303E;EGYPTIAN HIEROGLYPH A053;Lo;0;L;;;;;N;;;;; 1303F;EGYPTIAN HIEROGLYPH A054;Lo;0;L;;;;;N;;;;; 13040;EGYPTIAN HIEROGLYPH A055;Lo;0;L;;;;;N;;;;; 13041;EGYPTIAN HIEROGLYPH A056;Lo;0;L;;;;;N;;;;; 13042;EGYPTIAN HIEROGLYPH A057;Lo;0;L;;;;;N;;;;; 13043;EGYPTIAN HIEROGLYPH A058;Lo;0;L;;;;;N;;;;; 13044;EGYPTIAN HIEROGLYPH A059;Lo;0;L;;;;;N;;;;; 13045;EGYPTIAN HIEROGLYPH A060;Lo;0;L;;;;;N;;;;; 13046;EGYPTIAN HIEROGLYPH A061;Lo;0;L;;;;;N;;;;; 13047;EGYPTIAN HIEROGLYPH A062;Lo;0;L;;;;;N;;;;; 13048;EGYPTIAN HIEROGLYPH A063;Lo;0;L;;;;;N;;;;; 13049;EGYPTIAN HIEROGLYPH A064;Lo;0;L;;;;;N;;;;; 1304A;EGYPTIAN HIEROGLYPH A065;Lo;0;L;;;;;N;;;;; 1304B;EGYPTIAN HIEROGLYPH A066;Lo;0;L;;;;;N;;;;; 1304C;EGYPTIAN HIEROGLYPH A067;Lo;0;L;;;;;N;;;;; 1304D;EGYPTIAN HIEROGLYPH A068;Lo;0;L;;;;;N;;;;; 1304E;EGYPTIAN HIEROGLYPH A069;Lo;0;L;;;;;N;;;;; 1304F;EGYPTIAN HIEROGLYPH A070;Lo;0;L;;;;;N;;;;; 13050;EGYPTIAN HIEROGLYPH B001;Lo;0;L;;;;;N;;;;; 13051;EGYPTIAN HIEROGLYPH B002;Lo;0;L;;;;;N;;;;; 13052;EGYPTIAN HIEROGLYPH B003;Lo;0;L;;;;;N;;;;; 13053;EGYPTIAN HIEROGLYPH B004;Lo;0;L;;;;;N;;;;; 13054;EGYPTIAN HIEROGLYPH B005;Lo;0;L;;;;;N;;;;; 13055;EGYPTIAN HIEROGLYPH B005A;Lo;0;L;;;;;N;;;;; 13056;EGYPTIAN HIEROGLYPH B006;Lo;0;L;;;;;N;;;;; 13057;EGYPTIAN HIEROGLYPH B007;Lo;0;L;;;;;N;;;;; 13058;EGYPTIAN HIEROGLYPH B008;Lo;0;L;;;;;N;;;;; 13059;EGYPTIAN HIEROGLYPH B009;Lo;0;L;;;;;N;;;;; 1305A;EGYPTIAN HIEROGLYPH C001;Lo;0;L;;;;;N;;;;; 1305B;EGYPTIAN HIEROGLYPH C002;Lo;0;L;;;;;N;;;;; 1305C;EGYPTIAN HIEROGLYPH C002A;Lo;0;L;;;;;N;;;;; 1305D;EGYPTIAN HIEROGLYPH C002B;Lo;0;L;;;;;N;;;;; 1305E;EGYPTIAN HIEROGLYPH C002C;Lo;0;L;;;;;N;;;;; 1305F;EGYPTIAN HIEROGLYPH C003;Lo;0;L;;;;;N;;;;; 13060;EGYPTIAN HIEROGLYPH C004;Lo;0;L;;;;;N;;;;; 13061;EGYPTIAN HIEROGLYPH C005;Lo;0;L;;;;;N;;;;; 13062;EGYPTIAN HIEROGLYPH C006;Lo;0;L;;;;;N;;;;; 13063;EGYPTIAN HIEROGLYPH C007;Lo;0;L;;;;;N;;;;; 13064;EGYPTIAN HIEROGLYPH C008;Lo;0;L;;;;;N;;;;; 13065;EGYPTIAN HIEROGLYPH C009;Lo;0;L;;;;;N;;;;; 13066;EGYPTIAN HIEROGLYPH C010;Lo;0;L;;;;;N;;;;; 13067;EGYPTIAN HIEROGLYPH C010A;Lo;0;L;;;;;N;;;;; 13068;EGYPTIAN HIEROGLYPH C011;Lo;0;L;;;;;N;;;;; 13069;EGYPTIAN HIEROGLYPH C012;Lo;0;L;;;;;N;;;;; 1306A;EGYPTIAN HIEROGLYPH C013;Lo;0;L;;;;;N;;;;; 1306B;EGYPTIAN HIEROGLYPH C014;Lo;0;L;;;;;N;;;;; 1306C;EGYPTIAN HIEROGLYPH C015;Lo;0;L;;;;;N;;;;; 1306D;EGYPTIAN HIEROGLYPH C016;Lo;0;L;;;;;N;;;;; 1306E;EGYPTIAN HIEROGLYPH C017;Lo;0;L;;;;;N;;;;; 1306F;EGYPTIAN HIEROGLYPH C018;Lo;0;L;;;;;N;;;;; 13070;EGYPTIAN HIEROGLYPH C019;Lo;0;L;;;;;N;;;;; 13071;EGYPTIAN HIEROGLYPH C020;Lo;0;L;;;;;N;;;;; 13072;EGYPTIAN HIEROGLYPH C021;Lo;0;L;;;;;N;;;;; 13073;EGYPTIAN HIEROGLYPH C022;Lo;0;L;;;;;N;;;;; 13074;EGYPTIAN HIEROGLYPH C023;Lo;0;L;;;;;N;;;;; 13075;EGYPTIAN HIEROGLYPH C024;Lo;0;L;;;;;N;;;;; 13076;EGYPTIAN HIEROGLYPH D001;Lo;0;L;;;;;N;;;;; 13077;EGYPTIAN HIEROGLYPH D002;Lo;0;L;;;;;N;;;;; 13078;EGYPTIAN HIEROGLYPH D003;Lo;0;L;;;;;N;;;;; 13079;EGYPTIAN HIEROGLYPH D004;Lo;0;L;;;;;N;;;;; 1307A;EGYPTIAN HIEROGLYPH D005;Lo;0;L;;;;;N;;;;; 1307B;EGYPTIAN HIEROGLYPH D006;Lo;0;L;;;;;N;;;;; 1307C;EGYPTIAN HIEROGLYPH D007;Lo;0;L;;;;;N;;;;; 1307D;EGYPTIAN HIEROGLYPH D008;Lo;0;L;;;;;N;;;;; 1307E;EGYPTIAN HIEROGLYPH D008A;Lo;0;L;;;;;N;;;;; 1307F;EGYPTIAN HIEROGLYPH D009;Lo;0;L;;;;;N;;;;; 13080;EGYPTIAN HIEROGLYPH D010;Lo;0;L;;;;;N;;;;; 13081;EGYPTIAN HIEROGLYPH D011;Lo;0;L;;;;;N;;;;; 13082;EGYPTIAN HIEROGLYPH D012;Lo;0;L;;;;;N;;;;; 13083;EGYPTIAN HIEROGLYPH D013;Lo;0;L;;;;;N;;;;; 13084;EGYPTIAN HIEROGLYPH D014;Lo;0;L;;;;;N;;;;; 13085;EGYPTIAN HIEROGLYPH D015;Lo;0;L;;;;;N;;;;; 13086;EGYPTIAN HIEROGLYPH D016;Lo;0;L;;;;;N;;;;; 13087;EGYPTIAN HIEROGLYPH D017;Lo;0;L;;;;;N;;;;; 13088;EGYPTIAN HIEROGLYPH D018;Lo;0;L;;;;;N;;;;; 13089;EGYPTIAN HIEROGLYPH D019;Lo;0;L;;;;;N;;;;; 1308A;EGYPTIAN HIEROGLYPH D020;Lo;0;L;;;;;N;;;;; 1308B;EGYPTIAN HIEROGLYPH D021;Lo;0;L;;;;;N;;;;; 1308C;EGYPTIAN HIEROGLYPH D022;Lo;0;L;;;;;N;;;;; 1308D;EGYPTIAN HIEROGLYPH D023;Lo;0;L;;;;;N;;;;; 1308E;EGYPTIAN HIEROGLYPH D024;Lo;0;L;;;;;N;;;;; 1308F;EGYPTIAN HIEROGLYPH D025;Lo;0;L;;;;;N;;;;; 13090;EGYPTIAN HIEROGLYPH D026;Lo;0;L;;;;;N;;;;; 13091;EGYPTIAN HIEROGLYPH D027;Lo;0;L;;;;;N;;;;; 13092;EGYPTIAN HIEROGLYPH D027A;Lo;0;L;;;;;N;;;;; 13093;EGYPTIAN HIEROGLYPH D028;Lo;0;L;;;;;N;;;;; 13094;EGYPTIAN HIEROGLYPH D029;Lo;0;L;;;;;N;;;;; 13095;EGYPTIAN HIEROGLYPH D030;Lo;0;L;;;;;N;;;;; 13096;EGYPTIAN HIEROGLYPH D031;Lo;0;L;;;;;N;;;;; 13097;EGYPTIAN HIEROGLYPH D031A;Lo;0;L;;;;;N;;;;; 13098;EGYPTIAN HIEROGLYPH D032;Lo;0;L;;;;;N;;;;; 13099;EGYPTIAN HIEROGLYPH D033;Lo;0;L;;;;;N;;;;; 1309A;EGYPTIAN HIEROGLYPH D034;Lo;0;L;;;;;N;;;;; 1309B;EGYPTIAN HIEROGLYPH D034A;Lo;0;L;;;;;N;;;;; 1309C;EGYPTIAN HIEROGLYPH D035;Lo;0;L;;;;;N;;;;; 1309D;EGYPTIAN HIEROGLYPH D036;Lo;0;L;;;;;N;;;;; 1309E;EGYPTIAN HIEROGLYPH D037;Lo;0;L;;;;;N;;;;; 1309F;EGYPTIAN HIEROGLYPH D038;Lo;0;L;;;;;N;;;;; 130A0;EGYPTIAN HIEROGLYPH D039;Lo;0;L;;;;;N;;;;; 130A1;EGYPTIAN HIEROGLYPH D040;Lo;0;L;;;;;N;;;;; 130A2;EGYPTIAN HIEROGLYPH D041;Lo;0;L;;;;;N;;;;; 130A3;EGYPTIAN HIEROGLYPH D042;Lo;0;L;;;;;N;;;;; 130A4;EGYPTIAN HIEROGLYPH D043;Lo;0;L;;;;;N;;;;; 130A5;EGYPTIAN HIEROGLYPH D044;Lo;0;L;;;;;N;;;;; 130A6;EGYPTIAN HIEROGLYPH D045;Lo;0;L;;;;;N;;;;; 130A7;EGYPTIAN HIEROGLYPH D046;Lo;0;L;;;;;N;;;;; 130A8;EGYPTIAN HIEROGLYPH D046A;Lo;0;L;;;;;N;;;;; 130A9;EGYPTIAN HIEROGLYPH D047;Lo;0;L;;;;;N;;;;; 130AA;EGYPTIAN HIEROGLYPH D048;Lo;0;L;;;;;N;;;;; 130AB;EGYPTIAN HIEROGLYPH D048A;Lo;0;L;;;;;N;;;;; 130AC;EGYPTIAN HIEROGLYPH D049;Lo;0;L;;;;;N;;;;; 130AD;EGYPTIAN HIEROGLYPH D050;Lo;0;L;;;;;N;;;;; 130AE;EGYPTIAN HIEROGLYPH D050A;Lo;0;L;;;;;N;;;;; 130AF;EGYPTIAN HIEROGLYPH D050B;Lo;0;L;;;;;N;;;;; 130B0;EGYPTIAN HIEROGLYPH D050C;Lo;0;L;;;;;N;;;;; 130B1;EGYPTIAN HIEROGLYPH D050D;Lo;0;L;;;;;N;;;;; 130B2;EGYPTIAN HIEROGLYPH D050E;Lo;0;L;;;;;N;;;;; 130B3;EGYPTIAN HIEROGLYPH D050F;Lo;0;L;;;;;N;;;;; 130B4;EGYPTIAN HIEROGLYPH D050G;Lo;0;L;;;;;N;;;;; 130B5;EGYPTIAN HIEROGLYPH D050H;Lo;0;L;;;;;N;;;;; 130B6;EGYPTIAN HIEROGLYPH D050I;Lo;0;L;;;;;N;;;;; 130B7;EGYPTIAN HIEROGLYPH D051;Lo;0;L;;;;;N;;;;; 130B8;EGYPTIAN HIEROGLYPH D052;Lo;0;L;;;;;N;;;;; 130B9;EGYPTIAN HIEROGLYPH D052A;Lo;0;L;;;;;N;;;;; 130BA;EGYPTIAN HIEROGLYPH D053;Lo;0;L;;;;;N;;;;; 130BB;EGYPTIAN HIEROGLYPH D054;Lo;0;L;;;;;N;;;;; 130BC;EGYPTIAN HIEROGLYPH D054A;Lo;0;L;;;;;N;;;;; 130BD;EGYPTIAN HIEROGLYPH D055;Lo;0;L;;;;;N;;;;; 130BE;EGYPTIAN HIEROGLYPH D056;Lo;0;L;;;;;N;;;;; 130BF;EGYPTIAN HIEROGLYPH D057;Lo;0;L;;;;;N;;;;; 130C0;EGYPTIAN HIEROGLYPH D058;Lo;0;L;;;;;N;;;;; 130C1;EGYPTIAN HIEROGLYPH D059;Lo;0;L;;;;;N;;;;; 130C2;EGYPTIAN HIEROGLYPH D060;Lo;0;L;;;;;N;;;;; 130C3;EGYPTIAN HIEROGLYPH D061;Lo;0;L;;;;;N;;;;; 130C4;EGYPTIAN HIEROGLYPH D062;Lo;0;L;;;;;N;;;;; 130C5;EGYPTIAN HIEROGLYPH D063;Lo;0;L;;;;;N;;;;; 130C6;EGYPTIAN HIEROGLYPH D064;Lo;0;L;;;;;N;;;;; 130C7;EGYPTIAN HIEROGLYPH D065;Lo;0;L;;;;;N;;;;; 130C8;EGYPTIAN HIEROGLYPH D066;Lo;0;L;;;;;N;;;;; 130C9;EGYPTIAN HIEROGLYPH D067;Lo;0;L;;;;;N;;;;; 130CA;EGYPTIAN HIEROGLYPH D067A;Lo;0;L;;;;;N;;;;; 130CB;EGYPTIAN HIEROGLYPH D067B;Lo;0;L;;;;;N;;;;; 130CC;EGYPTIAN HIEROGLYPH D067C;Lo;0;L;;;;;N;;;;; 130CD;EGYPTIAN HIEROGLYPH D067D;Lo;0;L;;;;;N;;;;; 130CE;EGYPTIAN HIEROGLYPH D067E;Lo;0;L;;;;;N;;;;; 130CF;EGYPTIAN HIEROGLYPH D067F;Lo;0;L;;;;;N;;;;; 130D0;EGYPTIAN HIEROGLYPH D067G;Lo;0;L;;;;;N;;;;; 130D1;EGYPTIAN HIEROGLYPH D067H;Lo;0;L;;;;;N;;;;; 130D2;EGYPTIAN HIEROGLYPH E001;Lo;0;L;;;;;N;;;;; 130D3;EGYPTIAN HIEROGLYPH E002;Lo;0;L;;;;;N;;;;; 130D4;EGYPTIAN HIEROGLYPH E003;Lo;0;L;;;;;N;;;;; 130D5;EGYPTIAN HIEROGLYPH E004;Lo;0;L;;;;;N;;;;; 130D6;EGYPTIAN HIEROGLYPH E005;Lo;0;L;;;;;N;;;;; 130D7;EGYPTIAN HIEROGLYPH E006;Lo;0;L;;;;;N;;;;; 130D8;EGYPTIAN HIEROGLYPH E007;Lo;0;L;;;;;N;;;;; 130D9;EGYPTIAN HIEROGLYPH E008;Lo;0;L;;;;;N;;;;; 130DA;EGYPTIAN HIEROGLYPH E008A;Lo;0;L;;;;;N;;;;; 130DB;EGYPTIAN HIEROGLYPH E009;Lo;0;L;;;;;N;;;;; 130DC;EGYPTIAN HIEROGLYPH E009A;Lo;0;L;;;;;N;;;;; 130DD;EGYPTIAN HIEROGLYPH E010;Lo;0;L;;;;;N;;;;; 130DE;EGYPTIAN HIEROGLYPH E011;Lo;0;L;;;;;N;;;;; 130DF;EGYPTIAN HIEROGLYPH E012;Lo;0;L;;;;;N;;;;; 130E0;EGYPTIAN HIEROGLYPH E013;Lo;0;L;;;;;N;;;;; 130E1;EGYPTIAN HIEROGLYPH E014;Lo;0;L;;;;;N;;;;; 130E2;EGYPTIAN HIEROGLYPH E015;Lo;0;L;;;;;N;;;;; 130E3;EGYPTIAN HIEROGLYPH E016;Lo;0;L;;;;;N;;;;; 130E4;EGYPTIAN HIEROGLYPH E016A;Lo;0;L;;;;;N;;;;; 130E5;EGYPTIAN HIEROGLYPH E017;Lo;0;L;;;;;N;;;;; 130E6;EGYPTIAN HIEROGLYPH E017A;Lo;0;L;;;;;N;;;;; 130E7;EGYPTIAN HIEROGLYPH E018;Lo;0;L;;;;;N;;;;; 130E8;EGYPTIAN HIEROGLYPH E019;Lo;0;L;;;;;N;;;;; 130E9;EGYPTIAN HIEROGLYPH E020;Lo;0;L;;;;;N;;;;; 130EA;EGYPTIAN HIEROGLYPH E020A;Lo;0;L;;;;;N;;;;; 130EB;EGYPTIAN HIEROGLYPH E021;Lo;0;L;;;;;N;;;;; 130EC;EGYPTIAN HIEROGLYPH E022;Lo;0;L;;;;;N;;;;; 130ED;EGYPTIAN HIEROGLYPH E023;Lo;0;L;;;;;N;;;;; 130EE;EGYPTIAN HIEROGLYPH E024;Lo;0;L;;;;;N;;;;; 130EF;EGYPTIAN HIEROGLYPH E025;Lo;0;L;;;;;N;;;;; 130F0;EGYPTIAN HIEROGLYPH E026;Lo;0;L;;;;;N;;;;; 130F1;EGYPTIAN HIEROGLYPH E027;Lo;0;L;;;;;N;;;;; 130F2;EGYPTIAN HIEROGLYPH E028;Lo;0;L;;;;;N;;;;; 130F3;EGYPTIAN HIEROGLYPH E028A;Lo;0;L;;;;;N;;;;; 130F4;EGYPTIAN HIEROGLYPH E029;Lo;0;L;;;;;N;;;;; 130F5;EGYPTIAN HIEROGLYPH E030;Lo;0;L;;;;;N;;;;; 130F6;EGYPTIAN HIEROGLYPH E031;Lo;0;L;;;;;N;;;;; 130F7;EGYPTIAN HIEROGLYPH E032;Lo;0;L;;;;;N;;;;; 130F8;EGYPTIAN HIEROGLYPH E033;Lo;0;L;;;;;N;;;;; 130F9;EGYPTIAN HIEROGLYPH E034;Lo;0;L;;;;;N;;;;; 130FA;EGYPTIAN HIEROGLYPH E034A;Lo;0;L;;;;;N;;;;; 130FB;EGYPTIAN HIEROGLYPH E036;Lo;0;L;;;;;N;;;;; 130FC;EGYPTIAN HIEROGLYPH E037;Lo;0;L;;;;;N;;;;; 130FD;EGYPTIAN HIEROGLYPH E038;Lo;0;L;;;;;N;;;;; 130FE;EGYPTIAN HIEROGLYPH F001;Lo;0;L;;;;;N;;;;; 130FF;EGYPTIAN HIEROGLYPH F001A;Lo;0;L;;;;;N;;;;; 13100;EGYPTIAN HIEROGLYPH F002;Lo;0;L;;;;;N;;;;; 13101;EGYPTIAN HIEROGLYPH F003;Lo;0;L;;;;;N;;;;; 13102;EGYPTIAN HIEROGLYPH F004;Lo;0;L;;;;;N;;;;; 13103;EGYPTIAN HIEROGLYPH F005;Lo;0;L;;;;;N;;;;; 13104;EGYPTIAN HIEROGLYPH F006;Lo;0;L;;;;;N;;;;; 13105;EGYPTIAN HIEROGLYPH F007;Lo;0;L;;;;;N;;;;; 13106;EGYPTIAN HIEROGLYPH F008;Lo;0;L;;;;;N;;;;; 13107;EGYPTIAN HIEROGLYPH F009;Lo;0;L;;;;;N;;;;; 13108;EGYPTIAN HIEROGLYPH F010;Lo;0;L;;;;;N;;;;; 13109;EGYPTIAN HIEROGLYPH F011;Lo;0;L;;;;;N;;;;; 1310A;EGYPTIAN HIEROGLYPH F012;Lo;0;L;;;;;N;;;;; 1310B;EGYPTIAN HIEROGLYPH F013;Lo;0;L;;;;;N;;;;; 1310C;EGYPTIAN HIEROGLYPH F013A;Lo;0;L;;;;;N;;;;; 1310D;EGYPTIAN HIEROGLYPH F014;Lo;0;L;;;;;N;;;;; 1310E;EGYPTIAN HIEROGLYPH F015;Lo;0;L;;;;;N;;;;; 1310F;EGYPTIAN HIEROGLYPH F016;Lo;0;L;;;;;N;;;;; 13110;EGYPTIAN HIEROGLYPH F017;Lo;0;L;;;;;N;;;;; 13111;EGYPTIAN HIEROGLYPH F018;Lo;0;L;;;;;N;;;;; 13112;EGYPTIAN HIEROGLYPH F019;Lo;0;L;;;;;N;;;;; 13113;EGYPTIAN HIEROGLYPH F020;Lo;0;L;;;;;N;;;;; 13114;EGYPTIAN HIEROGLYPH F021;Lo;0;L;;;;;N;;;;; 13115;EGYPTIAN HIEROGLYPH F021A;Lo;0;L;;;;;N;;;;; 13116;EGYPTIAN HIEROGLYPH F022;Lo;0;L;;;;;N;;;;; 13117;EGYPTIAN HIEROGLYPH F023;Lo;0;L;;;;;N;;;;; 13118;EGYPTIAN HIEROGLYPH F024;Lo;0;L;;;;;N;;;;; 13119;EGYPTIAN HIEROGLYPH F025;Lo;0;L;;;;;N;;;;; 1311A;EGYPTIAN HIEROGLYPH F026;Lo;0;L;;;;;N;;;;; 1311B;EGYPTIAN HIEROGLYPH F027;Lo;0;L;;;;;N;;;;; 1311C;EGYPTIAN HIEROGLYPH F028;Lo;0;L;;;;;N;;;;; 1311D;EGYPTIAN HIEROGLYPH F029;Lo;0;L;;;;;N;;;;; 1311E;EGYPTIAN HIEROGLYPH F030;Lo;0;L;;;;;N;;;;; 1311F;EGYPTIAN HIEROGLYPH F031;Lo;0;L;;;;;N;;;;; 13120;EGYPTIAN HIEROGLYPH F031A;Lo;0;L;;;;;N;;;;; 13121;EGYPTIAN HIEROGLYPH F032;Lo;0;L;;;;;N;;;;; 13122;EGYPTIAN HIEROGLYPH F033;Lo;0;L;;;;;N;;;;; 13123;EGYPTIAN HIEROGLYPH F034;Lo;0;L;;;;;N;;;;; 13124;EGYPTIAN HIEROGLYPH F035;Lo;0;L;;;;;N;;;;; 13125;EGYPTIAN HIEROGLYPH F036;Lo;0;L;;;;;N;;;;; 13126;EGYPTIAN HIEROGLYPH F037;Lo;0;L;;;;;N;;;;; 13127;EGYPTIAN HIEROGLYPH F037A;Lo;0;L;;;;;N;;;;; 13128;EGYPTIAN HIEROGLYPH F038;Lo;0;L;;;;;N;;;;; 13129;EGYPTIAN HIEROGLYPH F038A;Lo;0;L;;;;;N;;;;; 1312A;EGYPTIAN HIEROGLYPH F039;Lo;0;L;;;;;N;;;;; 1312B;EGYPTIAN HIEROGLYPH F040;Lo;0;L;;;;;N;;;;; 1312C;EGYPTIAN HIEROGLYPH F041;Lo;0;L;;;;;N;;;;; 1312D;EGYPTIAN HIEROGLYPH F042;Lo;0;L;;;;;N;;;;; 1312E;EGYPTIAN HIEROGLYPH F043;Lo;0;L;;;;;N;;;;; 1312F;EGYPTIAN HIEROGLYPH F044;Lo;0;L;;;;;N;;;;; 13130;EGYPTIAN HIEROGLYPH F045;Lo;0;L;;;;;N;;;;; 13131;EGYPTIAN HIEROGLYPH F045A;Lo;0;L;;;;;N;;;;; 13132;EGYPTIAN HIEROGLYPH F046;Lo;0;L;;;;;N;;;;; 13133;EGYPTIAN HIEROGLYPH F046A;Lo;0;L;;;;;N;;;;; 13134;EGYPTIAN HIEROGLYPH F047;Lo;0;L;;;;;N;;;;; 13135;EGYPTIAN HIEROGLYPH F047A;Lo;0;L;;;;;N;;;;; 13136;EGYPTIAN HIEROGLYPH F048;Lo;0;L;;;;;N;;;;; 13137;EGYPTIAN HIEROGLYPH F049;Lo;0;L;;;;;N;;;;; 13138;EGYPTIAN HIEROGLYPH F050;Lo;0;L;;;;;N;;;;; 13139;EGYPTIAN HIEROGLYPH F051;Lo;0;L;;;;;N;;;;; 1313A;EGYPTIAN HIEROGLYPH F051A;Lo;0;L;;;;;N;;;;; 1313B;EGYPTIAN HIEROGLYPH F051B;Lo;0;L;;;;;N;;;;; 1313C;EGYPTIAN HIEROGLYPH F051C;Lo;0;L;;;;;N;;;;; 1313D;EGYPTIAN HIEROGLYPH F052;Lo;0;L;;;;;N;;;;; 1313E;EGYPTIAN HIEROGLYPH F053;Lo;0;L;;;;;N;;;;; 1313F;EGYPTIAN HIEROGLYPH G001;Lo;0;L;;;;;N;;;;; 13140;EGYPTIAN HIEROGLYPH G002;Lo;0;L;;;;;N;;;;; 13141;EGYPTIAN HIEROGLYPH G003;Lo;0;L;;;;;N;;;;; 13142;EGYPTIAN HIEROGLYPH G004;Lo;0;L;;;;;N;;;;; 13143;EGYPTIAN HIEROGLYPH G005;Lo;0;L;;;;;N;;;;; 13144;EGYPTIAN HIEROGLYPH G006;Lo;0;L;;;;;N;;;;; 13145;EGYPTIAN HIEROGLYPH G006A;Lo;0;L;;;;;N;;;;; 13146;EGYPTIAN HIEROGLYPH G007;Lo;0;L;;;;;N;;;;; 13147;EGYPTIAN HIEROGLYPH G007A;Lo;0;L;;;;;N;;;;; 13148;EGYPTIAN HIEROGLYPH G007B;Lo;0;L;;;;;N;;;;; 13149;EGYPTIAN HIEROGLYPH G008;Lo;0;L;;;;;N;;;;; 1314A;EGYPTIAN HIEROGLYPH G009;Lo;0;L;;;;;N;;;;; 1314B;EGYPTIAN HIEROGLYPH G010;Lo;0;L;;;;;N;;;;; 1314C;EGYPTIAN HIEROGLYPH G011;Lo;0;L;;;;;N;;;;; 1314D;EGYPTIAN HIEROGLYPH G011A;Lo;0;L;;;;;N;;;;; 1314E;EGYPTIAN HIEROGLYPH G012;Lo;0;L;;;;;N;;;;; 1314F;EGYPTIAN HIEROGLYPH G013;Lo;0;L;;;;;N;;;;; 13150;EGYPTIAN HIEROGLYPH G014;Lo;0;L;;;;;N;;;;; 13151;EGYPTIAN HIEROGLYPH G015;Lo;0;L;;;;;N;;;;; 13152;EGYPTIAN HIEROGLYPH G016;Lo;0;L;;;;;N;;;;; 13153;EGYPTIAN HIEROGLYPH G017;Lo;0;L;;;;;N;;;;; 13154;EGYPTIAN HIEROGLYPH G018;Lo;0;L;;;;;N;;;;; 13155;EGYPTIAN HIEROGLYPH G019;Lo;0;L;;;;;N;;;;; 13156;EGYPTIAN HIEROGLYPH G020;Lo;0;L;;;;;N;;;;; 13157;EGYPTIAN HIEROGLYPH G020A;Lo;0;L;;;;;N;;;;; 13158;EGYPTIAN HIEROGLYPH G021;Lo;0;L;;;;;N;;;;; 13159;EGYPTIAN HIEROGLYPH G022;Lo;0;L;;;;;N;;;;; 1315A;EGYPTIAN HIEROGLYPH G023;Lo;0;L;;;;;N;;;;; 1315B;EGYPTIAN HIEROGLYPH G024;Lo;0;L;;;;;N;;;;; 1315C;EGYPTIAN HIEROGLYPH G025;Lo;0;L;;;;;N;;;;; 1315D;EGYPTIAN HIEROGLYPH G026;Lo;0;L;;;;;N;;;;; 1315E;EGYPTIAN HIEROGLYPH G026A;Lo;0;L;;;;;N;;;;; 1315F;EGYPTIAN HIEROGLYPH G027;Lo;0;L;;;;;N;;;;; 13160;EGYPTIAN HIEROGLYPH G028;Lo;0;L;;;;;N;;;;; 13161;EGYPTIAN HIEROGLYPH G029;Lo;0;L;;;;;N;;;;; 13162;EGYPTIAN HIEROGLYPH G030;Lo;0;L;;;;;N;;;;; 13163;EGYPTIAN HIEROGLYPH G031;Lo;0;L;;;;;N;;;;; 13164;EGYPTIAN HIEROGLYPH G032;Lo;0;L;;;;;N;;;;; 13165;EGYPTIAN HIEROGLYPH G033;Lo;0;L;;;;;N;;;;; 13166;EGYPTIAN HIEROGLYPH G034;Lo;0;L;;;;;N;;;;; 13167;EGYPTIAN HIEROGLYPH G035;Lo;0;L;;;;;N;;;;; 13168;EGYPTIAN HIEROGLYPH G036;Lo;0;L;;;;;N;;;;; 13169;EGYPTIAN HIEROGLYPH G036A;Lo;0;L;;;;;N;;;;; 1316A;EGYPTIAN HIEROGLYPH G037;Lo;0;L;;;;;N;;;;; 1316B;EGYPTIAN HIEROGLYPH G037A;Lo;0;L;;;;;N;;;;; 1316C;EGYPTIAN HIEROGLYPH G038;Lo;0;L;;;;;N;;;;; 1316D;EGYPTIAN HIEROGLYPH G039;Lo;0;L;;;;;N;;;;; 1316E;EGYPTIAN HIEROGLYPH G040;Lo;0;L;;;;;N;;;;; 1316F;EGYPTIAN HIEROGLYPH G041;Lo;0;L;;;;;N;;;;; 13170;EGYPTIAN HIEROGLYPH G042;Lo;0;L;;;;;N;;;;; 13171;EGYPTIAN HIEROGLYPH G043;Lo;0;L;;;;;N;;;;; 13172;EGYPTIAN HIEROGLYPH G043A;Lo;0;L;;;;;N;;;;; 13173;EGYPTIAN HIEROGLYPH G044;Lo;0;L;;;;;N;;;;; 13174;EGYPTIAN HIEROGLYPH G045;Lo;0;L;;;;;N;;;;; 13175;EGYPTIAN HIEROGLYPH G045A;Lo;0;L;;;;;N;;;;; 13176;EGYPTIAN HIEROGLYPH G046;Lo;0;L;;;;;N;;;;; 13177;EGYPTIAN HIEROGLYPH G047;Lo;0;L;;;;;N;;;;; 13178;EGYPTIAN HIEROGLYPH G048;Lo;0;L;;;;;N;;;;; 13179;EGYPTIAN HIEROGLYPH G049;Lo;0;L;;;;;N;;;;; 1317A;EGYPTIAN HIEROGLYPH G050;Lo;0;L;;;;;N;;;;; 1317B;EGYPTIAN HIEROGLYPH G051;Lo;0;L;;;;;N;;;;; 1317C;EGYPTIAN HIEROGLYPH G052;Lo;0;L;;;;;N;;;;; 1317D;EGYPTIAN HIEROGLYPH G053;Lo;0;L;;;;;N;;;;; 1317E;EGYPTIAN HIEROGLYPH G054;Lo;0;L;;;;;N;;;;; 1317F;EGYPTIAN HIEROGLYPH H001;Lo;0;L;;;;;N;;;;; 13180;EGYPTIAN HIEROGLYPH H002;Lo;0;L;;;;;N;;;;; 13181;EGYPTIAN HIEROGLYPH H003;Lo;0;L;;;;;N;;;;; 13182;EGYPTIAN HIEROGLYPH H004;Lo;0;L;;;;;N;;;;; 13183;EGYPTIAN HIEROGLYPH H005;Lo;0;L;;;;;N;;;;; 13184;EGYPTIAN HIEROGLYPH H006;Lo;0;L;;;;;N;;;;; 13185;EGYPTIAN HIEROGLYPH H006A;Lo;0;L;;;;;N;;;;; 13186;EGYPTIAN HIEROGLYPH H007;Lo;0;L;;;;;N;;;;; 13187;EGYPTIAN HIEROGLYPH H008;Lo;0;L;;;;;N;;;;; 13188;EGYPTIAN HIEROGLYPH I001;Lo;0;L;;;;;N;;;;; 13189;EGYPTIAN HIEROGLYPH I002;Lo;0;L;;;;;N;;;;; 1318A;EGYPTIAN HIEROGLYPH I003;Lo;0;L;;;;;N;;;;; 1318B;EGYPTIAN HIEROGLYPH I004;Lo;0;L;;;;;N;;;;; 1318C;EGYPTIAN HIEROGLYPH I005;Lo;0;L;;;;;N;;;;; 1318D;EGYPTIAN HIEROGLYPH I005A;Lo;0;L;;;;;N;;;;; 1318E;EGYPTIAN HIEROGLYPH I006;Lo;0;L;;;;;N;;;;; 1318F;EGYPTIAN HIEROGLYPH I007;Lo;0;L;;;;;N;;;;; 13190;EGYPTIAN HIEROGLYPH I008;Lo;0;L;;;;;N;;;;; 13191;EGYPTIAN HIEROGLYPH I009;Lo;0;L;;;;;N;;;;; 13192;EGYPTIAN HIEROGLYPH I009A;Lo;0;L;;;;;N;;;;; 13193;EGYPTIAN HIEROGLYPH I010;Lo;0;L;;;;;N;;;;; 13194;EGYPTIAN HIEROGLYPH I010A;Lo;0;L;;;;;N;;;;; 13195;EGYPTIAN HIEROGLYPH I011;Lo;0;L;;;;;N;;;;; 13196;EGYPTIAN HIEROGLYPH I011A;Lo;0;L;;;;;N;;;;; 13197;EGYPTIAN HIEROGLYPH I012;Lo;0;L;;;;;N;;;;; 13198;EGYPTIAN HIEROGLYPH I013;Lo;0;L;;;;;N;;;;; 13199;EGYPTIAN HIEROGLYPH I014;Lo;0;L;;;;;N;;;;; 1319A;EGYPTIAN HIEROGLYPH I015;Lo;0;L;;;;;N;;;;; 1319B;EGYPTIAN HIEROGLYPH K001;Lo;0;L;;;;;N;;;;; 1319C;EGYPTIAN HIEROGLYPH K002;Lo;0;L;;;;;N;;;;; 1319D;EGYPTIAN HIEROGLYPH K003;Lo;0;L;;;;;N;;;;; 1319E;EGYPTIAN HIEROGLYPH K004;Lo;0;L;;;;;N;;;;; 1319F;EGYPTIAN HIEROGLYPH K005;Lo;0;L;;;;;N;;;;; 131A0;EGYPTIAN HIEROGLYPH K006;Lo;0;L;;;;;N;;;;; 131A1;EGYPTIAN HIEROGLYPH K007;Lo;0;L;;;;;N;;;;; 131A2;EGYPTIAN HIEROGLYPH K008;Lo;0;L;;;;;N;;;;; 131A3;EGYPTIAN HIEROGLYPH L001;Lo;0;L;;;;;N;;;;; 131A4;EGYPTIAN HIEROGLYPH L002;Lo;0;L;;;;;N;;;;; 131A5;EGYPTIAN HIEROGLYPH L002A;Lo;0;L;;;;;N;;;;; 131A6;EGYPTIAN HIEROGLYPH L003;Lo;0;L;;;;;N;;;;; 131A7;EGYPTIAN HIEROGLYPH L004;Lo;0;L;;;;;N;;;;; 131A8;EGYPTIAN HIEROGLYPH L005;Lo;0;L;;;;;N;;;;; 131A9;EGYPTIAN HIEROGLYPH L006;Lo;0;L;;;;;N;;;;; 131AA;EGYPTIAN HIEROGLYPH L006A;Lo;0;L;;;;;N;;;;; 131AB;EGYPTIAN HIEROGLYPH L007;Lo;0;L;;;;;N;;;;; 131AC;EGYPTIAN HIEROGLYPH L008;Lo;0;L;;;;;N;;;;; 131AD;EGYPTIAN HIEROGLYPH M001;Lo;0;L;;;;;N;;;;; 131AE;EGYPTIAN HIEROGLYPH M001A;Lo;0;L;;;;;N;;;;; 131AF;EGYPTIAN HIEROGLYPH M001B;Lo;0;L;;;;;N;;;;; 131B0;EGYPTIAN HIEROGLYPH M002;Lo;0;L;;;;;N;;;;; 131B1;EGYPTIAN HIEROGLYPH M003;Lo;0;L;;;;;N;;;;; 131B2;EGYPTIAN HIEROGLYPH M003A;Lo;0;L;;;;;N;;;;; 131B3;EGYPTIAN HIEROGLYPH M004;Lo;0;L;;;;;N;;;;; 131B4;EGYPTIAN HIEROGLYPH M005;Lo;0;L;;;;;N;;;;; 131B5;EGYPTIAN HIEROGLYPH M006;Lo;0;L;;;;;N;;;;; 131B6;EGYPTIAN HIEROGLYPH M007;Lo;0;L;;;;;N;;;;; 131B7;EGYPTIAN HIEROGLYPH M008;Lo;0;L;;;;;N;;;;; 131B8;EGYPTIAN HIEROGLYPH M009;Lo;0;L;;;;;N;;;;; 131B9;EGYPTIAN HIEROGLYPH M010;Lo;0;L;;;;;N;;;;; 131BA;EGYPTIAN HIEROGLYPH M010A;Lo;0;L;;;;;N;;;;; 131BB;EGYPTIAN HIEROGLYPH M011;Lo;0;L;;;;;N;;;;; 131BC;EGYPTIAN HIEROGLYPH M012;Lo;0;L;;;;;N;;;;; 131BD;EGYPTIAN HIEROGLYPH M012A;Lo;0;L;;;;;N;;;;; 131BE;EGYPTIAN HIEROGLYPH M012B;Lo;0;L;;;;;N;;;;; 131BF;EGYPTIAN HIEROGLYPH M012C;Lo;0;L;;;;;N;;;;; 131C0;EGYPTIAN HIEROGLYPH M012D;Lo;0;L;;;;;N;;;;; 131C1;EGYPTIAN HIEROGLYPH M012E;Lo;0;L;;;;;N;;;;; 131C2;EGYPTIAN HIEROGLYPH M012F;Lo;0;L;;;;;N;;;;; 131C3;EGYPTIAN HIEROGLYPH M012G;Lo;0;L;;;;;N;;;;; 131C4;EGYPTIAN HIEROGLYPH M012H;Lo;0;L;;;;;N;;;;; 131C5;EGYPTIAN HIEROGLYPH M013;Lo;0;L;;;;;N;;;;; 131C6;EGYPTIAN HIEROGLYPH M014;Lo;0;L;;;;;N;;;;; 131C7;EGYPTIAN HIEROGLYPH M015;Lo;0;L;;;;;N;;;;; 131C8;EGYPTIAN HIEROGLYPH M015A;Lo;0;L;;;;;N;;;;; 131C9;EGYPTIAN HIEROGLYPH M016;Lo;0;L;;;;;N;;;;; 131CA;EGYPTIAN HIEROGLYPH M016A;Lo;0;L;;;;;N;;;;; 131CB;EGYPTIAN HIEROGLYPH M017;Lo;0;L;;;;;N;;;;; 131CC;EGYPTIAN HIEROGLYPH M017A;Lo;0;L;;;;;N;;;;; 131CD;EGYPTIAN HIEROGLYPH M018;Lo;0;L;;;;;N;;;;; 131CE;EGYPTIAN HIEROGLYPH M019;Lo;0;L;;;;;N;;;;; 131CF;EGYPTIAN HIEROGLYPH M020;Lo;0;L;;;;;N;;;;; 131D0;EGYPTIAN HIEROGLYPH M021;Lo;0;L;;;;;N;;;;; 131D1;EGYPTIAN HIEROGLYPH M022;Lo;0;L;;;;;N;;;;; 131D2;EGYPTIAN HIEROGLYPH M022A;Lo;0;L;;;;;N;;;;; 131D3;EGYPTIAN HIEROGLYPH M023;Lo;0;L;;;;;N;;;;; 131D4;EGYPTIAN HIEROGLYPH M024;Lo;0;L;;;;;N;;;;; 131D5;EGYPTIAN HIEROGLYPH M024A;Lo;0;L;;;;;N;;;;; 131D6;EGYPTIAN HIEROGLYPH M025;Lo;0;L;;;;;N;;;;; 131D7;EGYPTIAN HIEROGLYPH M026;Lo;0;L;;;;;N;;;;; 131D8;EGYPTIAN HIEROGLYPH M027;Lo;0;L;;;;;N;;;;; 131D9;EGYPTIAN HIEROGLYPH M028;Lo;0;L;;;;;N;;;;; 131DA;EGYPTIAN HIEROGLYPH M028A;Lo;0;L;;;;;N;;;;; 131DB;EGYPTIAN HIEROGLYPH M029;Lo;0;L;;;;;N;;;;; 131DC;EGYPTIAN HIEROGLYPH M030;Lo;0;L;;;;;N;;;;; 131DD;EGYPTIAN HIEROGLYPH M031;Lo;0;L;;;;;N;;;;; 131DE;EGYPTIAN HIEROGLYPH M031A;Lo;0;L;;;;;N;;;;; 131DF;EGYPTIAN HIEROGLYPH M032;Lo;0;L;;;;;N;;;;; 131E0;EGYPTIAN HIEROGLYPH M033;Lo;0;L;;;;;N;;;;; 131E1;EGYPTIAN HIEROGLYPH M033A;Lo;0;L;;;;;N;;;;; 131E2;EGYPTIAN HIEROGLYPH M033B;Lo;0;L;;;;;N;;;;; 131E3;EGYPTIAN HIEROGLYPH M034;Lo;0;L;;;;;N;;;;; 131E4;EGYPTIAN HIEROGLYPH M035;Lo;0;L;;;;;N;;;;; 131E5;EGYPTIAN HIEROGLYPH M036;Lo;0;L;;;;;N;;;;; 131E6;EGYPTIAN HIEROGLYPH M037;Lo;0;L;;;;;N;;;;; 131E7;EGYPTIAN HIEROGLYPH M038;Lo;0;L;;;;;N;;;;; 131E8;EGYPTIAN HIEROGLYPH M039;Lo;0;L;;;;;N;;;;; 131E9;EGYPTIAN HIEROGLYPH M040;Lo;0;L;;;;;N;;;;; 131EA;EGYPTIAN HIEROGLYPH M040A;Lo;0;L;;;;;N;;;;; 131EB;EGYPTIAN HIEROGLYPH M041;Lo;0;L;;;;;N;;;;; 131EC;EGYPTIAN HIEROGLYPH M042;Lo;0;L;;;;;N;;;;; 131ED;EGYPTIAN HIEROGLYPH M043;Lo;0;L;;;;;N;;;;; 131EE;EGYPTIAN HIEROGLYPH M044;Lo;0;L;;;;;N;;;;; 131EF;EGYPTIAN HIEROGLYPH N001;Lo;0;L;;;;;N;;;;; 131F0;EGYPTIAN HIEROGLYPH N002;Lo;0;L;;;;;N;;;;; 131F1;EGYPTIAN HIEROGLYPH N003;Lo;0;L;;;;;N;;;;; 131F2;EGYPTIAN HIEROGLYPH N004;Lo;0;L;;;;;N;;;;; 131F3;EGYPTIAN HIEROGLYPH N005;Lo;0;L;;;;;N;;;;; 131F4;EGYPTIAN HIEROGLYPH N006;Lo;0;L;;;;;N;;;;; 131F5;EGYPTIAN HIEROGLYPH N007;Lo;0;L;;;;;N;;;;; 131F6;EGYPTIAN HIEROGLYPH N008;Lo;0;L;;;;;N;;;;; 131F7;EGYPTIAN HIEROGLYPH N009;Lo;0;L;;;;;N;;;;; 131F8;EGYPTIAN HIEROGLYPH N010;Lo;0;L;;;;;N;;;;; 131F9;EGYPTIAN HIEROGLYPH N011;Lo;0;L;;;;;N;;;;; 131FA;EGYPTIAN HIEROGLYPH N012;Lo;0;L;;;;;N;;;;; 131FB;EGYPTIAN HIEROGLYPH N013;Lo;0;L;;;;;N;;;;; 131FC;EGYPTIAN HIEROGLYPH N014;Lo;0;L;;;;;N;;;;; 131FD;EGYPTIAN HIEROGLYPH N015;Lo;0;L;;;;;N;;;;; 131FE;EGYPTIAN HIEROGLYPH N016;Lo;0;L;;;;;N;;;;; 131FF;EGYPTIAN HIEROGLYPH N017;Lo;0;L;;;;;N;;;;; 13200;EGYPTIAN HIEROGLYPH N018;Lo;0;L;;;;;N;;;;; 13201;EGYPTIAN HIEROGLYPH N018A;Lo;0;L;;;;;N;;;;; 13202;EGYPTIAN HIEROGLYPH N018B;Lo;0;L;;;;;N;;;;; 13203;EGYPTIAN HIEROGLYPH N019;Lo;0;L;;;;;N;;;;; 13204;EGYPTIAN HIEROGLYPH N020;Lo;0;L;;;;;N;;;;; 13205;EGYPTIAN HIEROGLYPH N021;Lo;0;L;;;;;N;;;;; 13206;EGYPTIAN HIEROGLYPH N022;Lo;0;L;;;;;N;;;;; 13207;EGYPTIAN HIEROGLYPH N023;Lo;0;L;;;;;N;;;;; 13208;EGYPTIAN HIEROGLYPH N024;Lo;0;L;;;;;N;;;;; 13209;EGYPTIAN HIEROGLYPH N025;Lo;0;L;;;;;N;;;;; 1320A;EGYPTIAN HIEROGLYPH N025A;Lo;0;L;;;;;N;;;;; 1320B;EGYPTIAN HIEROGLYPH N026;Lo;0;L;;;;;N;;;;; 1320C;EGYPTIAN HIEROGLYPH N027;Lo;0;L;;;;;N;;;;; 1320D;EGYPTIAN HIEROGLYPH N028;Lo;0;L;;;;;N;;;;; 1320E;EGYPTIAN HIEROGLYPH N029;Lo;0;L;;;;;N;;;;; 1320F;EGYPTIAN HIEROGLYPH N030;Lo;0;L;;;;;N;;;;; 13210;EGYPTIAN HIEROGLYPH N031;Lo;0;L;;;;;N;;;;; 13211;EGYPTIAN HIEROGLYPH N032;Lo;0;L;;;;;N;;;;; 13212;EGYPTIAN HIEROGLYPH N033;Lo;0;L;;;;;N;;;;; 13213;EGYPTIAN HIEROGLYPH N033A;Lo;0;L;;;;;N;;;;; 13214;EGYPTIAN HIEROGLYPH N034;Lo;0;L;;;;;N;;;;; 13215;EGYPTIAN HIEROGLYPH N034A;Lo;0;L;;;;;N;;;;; 13216;EGYPTIAN HIEROGLYPH N035;Lo;0;L;;;;;N;;;;; 13217;EGYPTIAN HIEROGLYPH N035A;Lo;0;L;;;;;N;;;;; 13218;EGYPTIAN HIEROGLYPH N036;Lo;0;L;;;;;N;;;;; 13219;EGYPTIAN HIEROGLYPH N037;Lo;0;L;;;;;N;;;;; 1321A;EGYPTIAN HIEROGLYPH N037A;Lo;0;L;;;;;N;;;;; 1321B;EGYPTIAN HIEROGLYPH N038;Lo;0;L;;;;;N;;;;; 1321C;EGYPTIAN HIEROGLYPH N039;Lo;0;L;;;;;N;;;;; 1321D;EGYPTIAN HIEROGLYPH N040;Lo;0;L;;;;;N;;;;; 1321E;EGYPTIAN HIEROGLYPH N041;Lo;0;L;;;;;N;;;;; 1321F;EGYPTIAN HIEROGLYPH N042;Lo;0;L;;;;;N;;;;; 13220;EGYPTIAN HIEROGLYPH NL001;Lo;0;L;;;;;N;;;;; 13221;EGYPTIAN HIEROGLYPH NL002;Lo;0;L;;;;;N;;;;; 13222;EGYPTIAN HIEROGLYPH NL003;Lo;0;L;;;;;N;;;;; 13223;EGYPTIAN HIEROGLYPH NL004;Lo;0;L;;;;;N;;;;; 13224;EGYPTIAN HIEROGLYPH NL005;Lo;0;L;;;;;N;;;;; 13225;EGYPTIAN HIEROGLYPH NL005A;Lo;0;L;;;;;N;;;;; 13226;EGYPTIAN HIEROGLYPH NL006;Lo;0;L;;;;;N;;;;; 13227;EGYPTIAN HIEROGLYPH NL007;Lo;0;L;;;;;N;;;;; 13228;EGYPTIAN HIEROGLYPH NL008;Lo;0;L;;;;;N;;;;; 13229;EGYPTIAN HIEROGLYPH NL009;Lo;0;L;;;;;N;;;;; 1322A;EGYPTIAN HIEROGLYPH NL010;Lo;0;L;;;;;N;;;;; 1322B;EGYPTIAN HIEROGLYPH NL011;Lo;0;L;;;;;N;;;;; 1322C;EGYPTIAN HIEROGLYPH NL012;Lo;0;L;;;;;N;;;;; 1322D;EGYPTIAN HIEROGLYPH NL013;Lo;0;L;;;;;N;;;;; 1322E;EGYPTIAN HIEROGLYPH NL014;Lo;0;L;;;;;N;;;;; 1322F;EGYPTIAN HIEROGLYPH NL015;Lo;0;L;;;;;N;;;;; 13230;EGYPTIAN HIEROGLYPH NL016;Lo;0;L;;;;;N;;;;; 13231;EGYPTIAN HIEROGLYPH NL017;Lo;0;L;;;;;N;;;;; 13232;EGYPTIAN HIEROGLYPH NL017A;Lo;0;L;;;;;N;;;;; 13233;EGYPTIAN HIEROGLYPH NL018;Lo;0;L;;;;;N;;;;; 13234;EGYPTIAN HIEROGLYPH NL019;Lo;0;L;;;;;N;;;;; 13235;EGYPTIAN HIEROGLYPH NL020;Lo;0;L;;;;;N;;;;; 13236;EGYPTIAN HIEROGLYPH NU001;Lo;0;L;;;;;N;;;;; 13237;EGYPTIAN HIEROGLYPH NU002;Lo;0;L;;;;;N;;;;; 13238;EGYPTIAN HIEROGLYPH NU003;Lo;0;L;;;;;N;;;;; 13239;EGYPTIAN HIEROGLYPH NU004;Lo;0;L;;;;;N;;;;; 1323A;EGYPTIAN HIEROGLYPH NU005;Lo;0;L;;;;;N;;;;; 1323B;EGYPTIAN HIEROGLYPH NU006;Lo;0;L;;;;;N;;;;; 1323C;EGYPTIAN HIEROGLYPH NU007;Lo;0;L;;;;;N;;;;; 1323D;EGYPTIAN HIEROGLYPH NU008;Lo;0;L;;;;;N;;;;; 1323E;EGYPTIAN HIEROGLYPH NU009;Lo;0;L;;;;;N;;;;; 1323F;EGYPTIAN HIEROGLYPH NU010;Lo;0;L;;;;;N;;;;; 13240;EGYPTIAN HIEROGLYPH NU010A;Lo;0;L;;;;;N;;;;; 13241;EGYPTIAN HIEROGLYPH NU011;Lo;0;L;;;;;N;;;;; 13242;EGYPTIAN HIEROGLYPH NU011A;Lo;0;L;;;;;N;;;;; 13243;EGYPTIAN HIEROGLYPH NU012;Lo;0;L;;;;;N;;;;; 13244;EGYPTIAN HIEROGLYPH NU013;Lo;0;L;;;;;N;;;;; 13245;EGYPTIAN HIEROGLYPH NU014;Lo;0;L;;;;;N;;;;; 13246;EGYPTIAN HIEROGLYPH NU015;Lo;0;L;;;;;N;;;;; 13247;EGYPTIAN HIEROGLYPH NU016;Lo;0;L;;;;;N;;;;; 13248;EGYPTIAN HIEROGLYPH NU017;Lo;0;L;;;;;N;;;;; 13249;EGYPTIAN HIEROGLYPH NU018;Lo;0;L;;;;;N;;;;; 1324A;EGYPTIAN HIEROGLYPH NU018A;Lo;0;L;;;;;N;;;;; 1324B;EGYPTIAN HIEROGLYPH NU019;Lo;0;L;;;;;N;;;;; 1324C;EGYPTIAN HIEROGLYPH NU020;Lo;0;L;;;;;N;;;;; 1324D;EGYPTIAN HIEROGLYPH NU021;Lo;0;L;;;;;N;;;;; 1324E;EGYPTIAN HIEROGLYPH NU022;Lo;0;L;;;;;N;;;;; 1324F;EGYPTIAN HIEROGLYPH NU022A;Lo;0;L;;;;;N;;;;; 13250;EGYPTIAN HIEROGLYPH O001;Lo;0;L;;;;;N;;;;; 13251;EGYPTIAN HIEROGLYPH O001A;Lo;0;L;;;;;N;;;;; 13252;EGYPTIAN HIEROGLYPH O002;Lo;0;L;;;;;N;;;;; 13253;EGYPTIAN HIEROGLYPH O003;Lo;0;L;;;;;N;;;;; 13254;EGYPTIAN HIEROGLYPH O004;Lo;0;L;;;;;N;;;;; 13255;EGYPTIAN HIEROGLYPH O005;Lo;0;L;;;;;N;;;;; 13256;EGYPTIAN HIEROGLYPH O005A;Lo;0;L;;;;;N;;;;; 13257;EGYPTIAN HIEROGLYPH O006;Lo;0;L;;;;;N;;;;; 13258;EGYPTIAN HIEROGLYPH O006A;Lo;0;L;;;;;N;;;;; 13259;EGYPTIAN HIEROGLYPH O006B;Lo;0;L;;;;;N;;;;; 1325A;EGYPTIAN HIEROGLYPH O006C;Lo;0;L;;;;;N;;;;; 1325B;EGYPTIAN HIEROGLYPH O006D;Lo;0;L;;;;;N;;;;; 1325C;EGYPTIAN HIEROGLYPH O006E;Lo;0;L;;;;;N;;;;; 1325D;EGYPTIAN HIEROGLYPH O006F;Lo;0;L;;;;;N;;;;; 1325E;EGYPTIAN HIEROGLYPH O007;Lo;0;L;;;;;N;;;;; 1325F;EGYPTIAN HIEROGLYPH O008;Lo;0;L;;;;;N;;;;; 13260;EGYPTIAN HIEROGLYPH O009;Lo;0;L;;;;;N;;;;; 13261;EGYPTIAN HIEROGLYPH O010;Lo;0;L;;;;;N;;;;; 13262;EGYPTIAN HIEROGLYPH O010A;Lo;0;L;;;;;N;;;;; 13263;EGYPTIAN HIEROGLYPH O010B;Lo;0;L;;;;;N;;;;; 13264;EGYPTIAN HIEROGLYPH O010C;Lo;0;L;;;;;N;;;;; 13265;EGYPTIAN HIEROGLYPH O011;Lo;0;L;;;;;N;;;;; 13266;EGYPTIAN HIEROGLYPH O012;Lo;0;L;;;;;N;;;;; 13267;EGYPTIAN HIEROGLYPH O013;Lo;0;L;;;;;N;;;;; 13268;EGYPTIAN HIEROGLYPH O014;Lo;0;L;;;;;N;;;;; 13269;EGYPTIAN HIEROGLYPH O015;Lo;0;L;;;;;N;;;;; 1326A;EGYPTIAN HIEROGLYPH O016;Lo;0;L;;;;;N;;;;; 1326B;EGYPTIAN HIEROGLYPH O017;Lo;0;L;;;;;N;;;;; 1326C;EGYPTIAN HIEROGLYPH O018;Lo;0;L;;;;;N;;;;; 1326D;EGYPTIAN HIEROGLYPH O019;Lo;0;L;;;;;N;;;;; 1326E;EGYPTIAN HIEROGLYPH O019A;Lo;0;L;;;;;N;;;;; 1326F;EGYPTIAN HIEROGLYPH O020;Lo;0;L;;;;;N;;;;; 13270;EGYPTIAN HIEROGLYPH O020A;Lo;0;L;;;;;N;;;;; 13271;EGYPTIAN HIEROGLYPH O021;Lo;0;L;;;;;N;;;;; 13272;EGYPTIAN HIEROGLYPH O022;Lo;0;L;;;;;N;;;;; 13273;EGYPTIAN HIEROGLYPH O023;Lo;0;L;;;;;N;;;;; 13274;EGYPTIAN HIEROGLYPH O024;Lo;0;L;;;;;N;;;;; 13275;EGYPTIAN HIEROGLYPH O024A;Lo;0;L;;;;;N;;;;; 13276;EGYPTIAN HIEROGLYPH O025;Lo;0;L;;;;;N;;;;; 13277;EGYPTIAN HIEROGLYPH O025A;Lo;0;L;;;;;N;;;;; 13278;EGYPTIAN HIEROGLYPH O026;Lo;0;L;;;;;N;;;;; 13279;EGYPTIAN HIEROGLYPH O027;Lo;0;L;;;;;N;;;;; 1327A;EGYPTIAN HIEROGLYPH O028;Lo;0;L;;;;;N;;;;; 1327B;EGYPTIAN HIEROGLYPH O029;Lo;0;L;;;;;N;;;;; 1327C;EGYPTIAN HIEROGLYPH O029A;Lo;0;L;;;;;N;;;;; 1327D;EGYPTIAN HIEROGLYPH O030;Lo;0;L;;;;;N;;;;; 1327E;EGYPTIAN HIEROGLYPH O030A;Lo;0;L;;;;;N;;;;; 1327F;EGYPTIAN HIEROGLYPH O031;Lo;0;L;;;;;N;;;;; 13280;EGYPTIAN HIEROGLYPH O032;Lo;0;L;;;;;N;;;;; 13281;EGYPTIAN HIEROGLYPH O033;Lo;0;L;;;;;N;;;;; 13282;EGYPTIAN HIEROGLYPH O033A;Lo;0;L;;;;;N;;;;; 13283;EGYPTIAN HIEROGLYPH O034;Lo;0;L;;;;;N;;;;; 13284;EGYPTIAN HIEROGLYPH O035;Lo;0;L;;;;;N;;;;; 13285;EGYPTIAN HIEROGLYPH O036;Lo;0;L;;;;;N;;;;; 13286;EGYPTIAN HIEROGLYPH O036A;Lo;0;L;;;;;N;;;;; 13287;EGYPTIAN HIEROGLYPH O036B;Lo;0;L;;;;;N;;;;; 13288;EGYPTIAN HIEROGLYPH O036C;Lo;0;L;;;;;N;;;;; 13289;EGYPTIAN HIEROGLYPH O036D;Lo;0;L;;;;;N;;;;; 1328A;EGYPTIAN HIEROGLYPH O037;Lo;0;L;;;;;N;;;;; 1328B;EGYPTIAN HIEROGLYPH O038;Lo;0;L;;;;;N;;;;; 1328C;EGYPTIAN HIEROGLYPH O039;Lo;0;L;;;;;N;;;;; 1328D;EGYPTIAN HIEROGLYPH O040;Lo;0;L;;;;;N;;;;; 1328E;EGYPTIAN HIEROGLYPH O041;Lo;0;L;;;;;N;;;;; 1328F;EGYPTIAN HIEROGLYPH O042;Lo;0;L;;;;;N;;;;; 13290;EGYPTIAN HIEROGLYPH O043;Lo;0;L;;;;;N;;;;; 13291;EGYPTIAN HIEROGLYPH O044;Lo;0;L;;;;;N;;;;; 13292;EGYPTIAN HIEROGLYPH O045;Lo;0;L;;;;;N;;;;; 13293;EGYPTIAN HIEROGLYPH O046;Lo;0;L;;;;;N;;;;; 13294;EGYPTIAN HIEROGLYPH O047;Lo;0;L;;;;;N;;;;; 13295;EGYPTIAN HIEROGLYPH O048;Lo;0;L;;;;;N;;;;; 13296;EGYPTIAN HIEROGLYPH O049;Lo;0;L;;;;;N;;;;; 13297;EGYPTIAN HIEROGLYPH O050;Lo;0;L;;;;;N;;;;; 13298;EGYPTIAN HIEROGLYPH O050A;Lo;0;L;;;;;N;;;;; 13299;EGYPTIAN HIEROGLYPH O050B;Lo;0;L;;;;;N;;;;; 1329A;EGYPTIAN HIEROGLYPH O051;Lo;0;L;;;;;N;;;;; 1329B;EGYPTIAN HIEROGLYPH P001;Lo;0;L;;;;;N;;;;; 1329C;EGYPTIAN HIEROGLYPH P001A;Lo;0;L;;;;;N;;;;; 1329D;EGYPTIAN HIEROGLYPH P002;Lo;0;L;;;;;N;;;;; 1329E;EGYPTIAN HIEROGLYPH P003;Lo;0;L;;;;;N;;;;; 1329F;EGYPTIAN HIEROGLYPH P003A;Lo;0;L;;;;;N;;;;; 132A0;EGYPTIAN HIEROGLYPH P004;Lo;0;L;;;;;N;;;;; 132A1;EGYPTIAN HIEROGLYPH P005;Lo;0;L;;;;;N;;;;; 132A2;EGYPTIAN HIEROGLYPH P006;Lo;0;L;;;;;N;;;;; 132A3;EGYPTIAN HIEROGLYPH P007;Lo;0;L;;;;;N;;;;; 132A4;EGYPTIAN HIEROGLYPH P008;Lo;0;L;;;;;N;;;;; 132A5;EGYPTIAN HIEROGLYPH P009;Lo;0;L;;;;;N;;;;; 132A6;EGYPTIAN HIEROGLYPH P010;Lo;0;L;;;;;N;;;;; 132A7;EGYPTIAN HIEROGLYPH P011;Lo;0;L;;;;;N;;;;; 132A8;EGYPTIAN HIEROGLYPH Q001;Lo;0;L;;;;;N;;;;; 132A9;EGYPTIAN HIEROGLYPH Q002;Lo;0;L;;;;;N;;;;; 132AA;EGYPTIAN HIEROGLYPH Q003;Lo;0;L;;;;;N;;;;; 132AB;EGYPTIAN HIEROGLYPH Q004;Lo;0;L;;;;;N;;;;; 132AC;EGYPTIAN HIEROGLYPH Q005;Lo;0;L;;;;;N;;;;; 132AD;EGYPTIAN HIEROGLYPH Q006;Lo;0;L;;;;;N;;;;; 132AE;EGYPTIAN HIEROGLYPH Q007;Lo;0;L;;;;;N;;;;; 132AF;EGYPTIAN HIEROGLYPH R001;Lo;0;L;;;;;N;;;;; 132B0;EGYPTIAN HIEROGLYPH R002;Lo;0;L;;;;;N;;;;; 132B1;EGYPTIAN HIEROGLYPH R002A;Lo;0;L;;;;;N;;;;; 132B2;EGYPTIAN HIEROGLYPH R003;Lo;0;L;;;;;N;;;;; 132B3;EGYPTIAN HIEROGLYPH R003A;Lo;0;L;;;;;N;;;;; 132B4;EGYPTIAN HIEROGLYPH R003B;Lo;0;L;;;;;N;;;;; 132B5;EGYPTIAN HIEROGLYPH R004;Lo;0;L;;;;;N;;;;; 132B6;EGYPTIAN HIEROGLYPH R005;Lo;0;L;;;;;N;;;;; 132B7;EGYPTIAN HIEROGLYPH R006;Lo;0;L;;;;;N;;;;; 132B8;EGYPTIAN HIEROGLYPH R007;Lo;0;L;;;;;N;;;;; 132B9;EGYPTIAN HIEROGLYPH R008;Lo;0;L;;;;;N;;;;; 132BA;EGYPTIAN HIEROGLYPH R009;Lo;0;L;;;;;N;;;;; 132BB;EGYPTIAN HIEROGLYPH R010;Lo;0;L;;;;;N;;;;; 132BC;EGYPTIAN HIEROGLYPH R010A;Lo;0;L;;;;;N;;;;; 132BD;EGYPTIAN HIEROGLYPH R011;Lo;0;L;;;;;N;;;;; 132BE;EGYPTIAN HIEROGLYPH R012;Lo;0;L;;;;;N;;;;; 132BF;EGYPTIAN HIEROGLYPH R013;Lo;0;L;;;;;N;;;;; 132C0;EGYPTIAN HIEROGLYPH R014;Lo;0;L;;;;;N;;;;; 132C1;EGYPTIAN HIEROGLYPH R015;Lo;0;L;;;;;N;;;;; 132C2;EGYPTIAN HIEROGLYPH R016;Lo;0;L;;;;;N;;;;; 132C3;EGYPTIAN HIEROGLYPH R016A;Lo;0;L;;;;;N;;;;; 132C4;EGYPTIAN HIEROGLYPH R017;Lo;0;L;;;;;N;;;;; 132C5;EGYPTIAN HIEROGLYPH R018;Lo;0;L;;;;;N;;;;; 132C6;EGYPTIAN HIEROGLYPH R019;Lo;0;L;;;;;N;;;;; 132C7;EGYPTIAN HIEROGLYPH R020;Lo;0;L;;;;;N;;;;; 132C8;EGYPTIAN HIEROGLYPH R021;Lo;0;L;;;;;N;;;;; 132C9;EGYPTIAN HIEROGLYPH R022;Lo;0;L;;;;;N;;;;; 132CA;EGYPTIAN HIEROGLYPH R023;Lo;0;L;;;;;N;;;;; 132CB;EGYPTIAN HIEROGLYPH R024;Lo;0;L;;;;;N;;;;; 132CC;EGYPTIAN HIEROGLYPH R025;Lo;0;L;;;;;N;;;;; 132CD;EGYPTIAN HIEROGLYPH R026;Lo;0;L;;;;;N;;;;; 132CE;EGYPTIAN HIEROGLYPH R027;Lo;0;L;;;;;N;;;;; 132CF;EGYPTIAN HIEROGLYPH R028;Lo;0;L;;;;;N;;;;; 132D0;EGYPTIAN HIEROGLYPH R029;Lo;0;L;;;;;N;;;;; 132D1;EGYPTIAN HIEROGLYPH S001;Lo;0;L;;;;;N;;;;; 132D2;EGYPTIAN HIEROGLYPH S002;Lo;0;L;;;;;N;;;;; 132D3;EGYPTIAN HIEROGLYPH S002A;Lo;0;L;;;;;N;;;;; 132D4;EGYPTIAN HIEROGLYPH S003;Lo;0;L;;;;;N;;;;; 132D5;EGYPTIAN HIEROGLYPH S004;Lo;0;L;;;;;N;;;;; 132D6;EGYPTIAN HIEROGLYPH S005;Lo;0;L;;;;;N;;;;; 132D7;EGYPTIAN HIEROGLYPH S006;Lo;0;L;;;;;N;;;;; 132D8;EGYPTIAN HIEROGLYPH S006A;Lo;0;L;;;;;N;;;;; 132D9;EGYPTIAN HIEROGLYPH S007;Lo;0;L;;;;;N;;;;; 132DA;EGYPTIAN HIEROGLYPH S008;Lo;0;L;;;;;N;;;;; 132DB;EGYPTIAN HIEROGLYPH S009;Lo;0;L;;;;;N;;;;; 132DC;EGYPTIAN HIEROGLYPH S010;Lo;0;L;;;;;N;;;;; 132DD;EGYPTIAN HIEROGLYPH S011;Lo;0;L;;;;;N;;;;; 132DE;EGYPTIAN HIEROGLYPH S012;Lo;0;L;;;;;N;;;;; 132DF;EGYPTIAN HIEROGLYPH S013;Lo;0;L;;;;;N;;;;; 132E0;EGYPTIAN HIEROGLYPH S014;Lo;0;L;;;;;N;;;;; 132E1;EGYPTIAN HIEROGLYPH S014A;Lo;0;L;;;;;N;;;;; 132E2;EGYPTIAN HIEROGLYPH S014B;Lo;0;L;;;;;N;;;;; 132E3;EGYPTIAN HIEROGLYPH S015;Lo;0;L;;;;;N;;;;; 132E4;EGYPTIAN HIEROGLYPH S016;Lo;0;L;;;;;N;;;;; 132E5;EGYPTIAN HIEROGLYPH S017;Lo;0;L;;;;;N;;;;; 132E6;EGYPTIAN HIEROGLYPH S017A;Lo;0;L;;;;;N;;;;; 132E7;EGYPTIAN HIEROGLYPH S018;Lo;0;L;;;;;N;;;;; 132E8;EGYPTIAN HIEROGLYPH S019;Lo;0;L;;;;;N;;;;; 132E9;EGYPTIAN HIEROGLYPH S020;Lo;0;L;;;;;N;;;;; 132EA;EGYPTIAN HIEROGLYPH S021;Lo;0;L;;;;;N;;;;; 132EB;EGYPTIAN HIEROGLYPH S022;Lo;0;L;;;;;N;;;;; 132EC;EGYPTIAN HIEROGLYPH S023;Lo;0;L;;;;;N;;;;; 132ED;EGYPTIAN HIEROGLYPH S024;Lo;0;L;;;;;N;;;;; 132EE;EGYPTIAN HIEROGLYPH S025;Lo;0;L;;;;;N;;;;; 132EF;EGYPTIAN HIEROGLYPH S026;Lo;0;L;;;;;N;;;;; 132F0;EGYPTIAN HIEROGLYPH S026A;Lo;0;L;;;;;N;;;;; 132F1;EGYPTIAN HIEROGLYPH S026B;Lo;0;L;;;;;N;;;;; 132F2;EGYPTIAN HIEROGLYPH S027;Lo;0;L;;;;;N;;;;; 132F3;EGYPTIAN HIEROGLYPH S028;Lo;0;L;;;;;N;;;;; 132F4;EGYPTIAN HIEROGLYPH S029;Lo;0;L;;;;;N;;;;; 132F5;EGYPTIAN HIEROGLYPH S030;Lo;0;L;;;;;N;;;;; 132F6;EGYPTIAN HIEROGLYPH S031;Lo;0;L;;;;;N;;;;; 132F7;EGYPTIAN HIEROGLYPH S032;Lo;0;L;;;;;N;;;;; 132F8;EGYPTIAN HIEROGLYPH S033;Lo;0;L;;;;;N;;;;; 132F9;EGYPTIAN HIEROGLYPH S034;Lo;0;L;;;;;N;;;;; 132FA;EGYPTIAN HIEROGLYPH S035;Lo;0;L;;;;;N;;;;; 132FB;EGYPTIAN HIEROGLYPH S035A;Lo;0;L;;;;;N;;;;; 132FC;EGYPTIAN HIEROGLYPH S036;Lo;0;L;;;;;N;;;;; 132FD;EGYPTIAN HIEROGLYPH S037;Lo;0;L;;;;;N;;;;; 132FE;EGYPTIAN HIEROGLYPH S038;Lo;0;L;;;;;N;;;;; 132FF;EGYPTIAN HIEROGLYPH S039;Lo;0;L;;;;;N;;;;; 13300;EGYPTIAN HIEROGLYPH S040;Lo;0;L;;;;;N;;;;; 13301;EGYPTIAN HIEROGLYPH S041;Lo;0;L;;;;;N;;;;; 13302;EGYPTIAN HIEROGLYPH S042;Lo;0;L;;;;;N;;;;; 13303;EGYPTIAN HIEROGLYPH S043;Lo;0;L;;;;;N;;;;; 13304;EGYPTIAN HIEROGLYPH S044;Lo;0;L;;;;;N;;;;; 13305;EGYPTIAN HIEROGLYPH S045;Lo;0;L;;;;;N;;;;; 13306;EGYPTIAN HIEROGLYPH S046;Lo;0;L;;;;;N;;;;; 13307;EGYPTIAN HIEROGLYPH T001;Lo;0;L;;;;;N;;;;; 13308;EGYPTIAN HIEROGLYPH T002;Lo;0;L;;;;;N;;;;; 13309;EGYPTIAN HIEROGLYPH T003;Lo;0;L;;;;;N;;;;; 1330A;EGYPTIAN HIEROGLYPH T003A;Lo;0;L;;;;;N;;;;; 1330B;EGYPTIAN HIEROGLYPH T004;Lo;0;L;;;;;N;;;;; 1330C;EGYPTIAN HIEROGLYPH T005;Lo;0;L;;;;;N;;;;; 1330D;EGYPTIAN HIEROGLYPH T006;Lo;0;L;;;;;N;;;;; 1330E;EGYPTIAN HIEROGLYPH T007;Lo;0;L;;;;;N;;;;; 1330F;EGYPTIAN HIEROGLYPH T007A;Lo;0;L;;;;;N;;;;; 13310;EGYPTIAN HIEROGLYPH T008;Lo;0;L;;;;;N;;;;; 13311;EGYPTIAN HIEROGLYPH T008A;Lo;0;L;;;;;N;;;;; 13312;EGYPTIAN HIEROGLYPH T009;Lo;0;L;;;;;N;;;;; 13313;EGYPTIAN HIEROGLYPH T009A;Lo;0;L;;;;;N;;;;; 13314;EGYPTIAN HIEROGLYPH T010;Lo;0;L;;;;;N;;;;; 13315;EGYPTIAN HIEROGLYPH T011;Lo;0;L;;;;;N;;;;; 13316;EGYPTIAN HIEROGLYPH T011A;Lo;0;L;;;;;N;;;;; 13317;EGYPTIAN HIEROGLYPH T012;Lo;0;L;;;;;N;;;;; 13318;EGYPTIAN HIEROGLYPH T013;Lo;0;L;;;;;N;;;;; 13319;EGYPTIAN HIEROGLYPH T014;Lo;0;L;;;;;N;;;;; 1331A;EGYPTIAN HIEROGLYPH T015;Lo;0;L;;;;;N;;;;; 1331B;EGYPTIAN HIEROGLYPH T016;Lo;0;L;;;;;N;;;;; 1331C;EGYPTIAN HIEROGLYPH T016A;Lo;0;L;;;;;N;;;;; 1331D;EGYPTIAN HIEROGLYPH T017;Lo;0;L;;;;;N;;;;; 1331E;EGYPTIAN HIEROGLYPH T018;Lo;0;L;;;;;N;;;;; 1331F;EGYPTIAN HIEROGLYPH T019;Lo;0;L;;;;;N;;;;; 13320;EGYPTIAN HIEROGLYPH T020;Lo;0;L;;;;;N;;;;; 13321;EGYPTIAN HIEROGLYPH T021;Lo;0;L;;;;;N;;;;; 13322;EGYPTIAN HIEROGLYPH T022;Lo;0;L;;;;;N;;;;; 13323;EGYPTIAN HIEROGLYPH T023;Lo;0;L;;;;;N;;;;; 13324;EGYPTIAN HIEROGLYPH T024;Lo;0;L;;;;;N;;;;; 13325;EGYPTIAN HIEROGLYPH T025;Lo;0;L;;;;;N;;;;; 13326;EGYPTIAN HIEROGLYPH T026;Lo;0;L;;;;;N;;;;; 13327;EGYPTIAN HIEROGLYPH T027;Lo;0;L;;;;;N;;;;; 13328;EGYPTIAN HIEROGLYPH T028;Lo;0;L;;;;;N;;;;; 13329;EGYPTIAN HIEROGLYPH T029;Lo;0;L;;;;;N;;;;; 1332A;EGYPTIAN HIEROGLYPH T030;Lo;0;L;;;;;N;;;;; 1332B;EGYPTIAN HIEROGLYPH T031;Lo;0;L;;;;;N;;;;; 1332C;EGYPTIAN HIEROGLYPH T032;Lo;0;L;;;;;N;;;;; 1332D;EGYPTIAN HIEROGLYPH T032A;Lo;0;L;;;;;N;;;;; 1332E;EGYPTIAN HIEROGLYPH T033;Lo;0;L;;;;;N;;;;; 1332F;EGYPTIAN HIEROGLYPH T033A;Lo;0;L;;;;;N;;;;; 13330;EGYPTIAN HIEROGLYPH T034;Lo;0;L;;;;;N;;;;; 13331;EGYPTIAN HIEROGLYPH T035;Lo;0;L;;;;;N;;;;; 13332;EGYPTIAN HIEROGLYPH T036;Lo;0;L;;;;;N;;;;; 13333;EGYPTIAN HIEROGLYPH U001;Lo;0;L;;;;;N;;;;; 13334;EGYPTIAN HIEROGLYPH U002;Lo;0;L;;;;;N;;;;; 13335;EGYPTIAN HIEROGLYPH U003;Lo;0;L;;;;;N;;;;; 13336;EGYPTIAN HIEROGLYPH U004;Lo;0;L;;;;;N;;;;; 13337;EGYPTIAN HIEROGLYPH U005;Lo;0;L;;;;;N;;;;; 13338;EGYPTIAN HIEROGLYPH U006;Lo;0;L;;;;;N;;;;; 13339;EGYPTIAN HIEROGLYPH U006A;Lo;0;L;;;;;N;;;;; 1333A;EGYPTIAN HIEROGLYPH U006B;Lo;0;L;;;;;N;;;;; 1333B;EGYPTIAN HIEROGLYPH U007;Lo;0;L;;;;;N;;;;; 1333C;EGYPTIAN HIEROGLYPH U008;Lo;0;L;;;;;N;;;;; 1333D;EGYPTIAN HIEROGLYPH U009;Lo;0;L;;;;;N;;;;; 1333E;EGYPTIAN HIEROGLYPH U010;Lo;0;L;;;;;N;;;;; 1333F;EGYPTIAN HIEROGLYPH U011;Lo;0;L;;;;;N;;;;; 13340;EGYPTIAN HIEROGLYPH U012;Lo;0;L;;;;;N;;;;; 13341;EGYPTIAN HIEROGLYPH U013;Lo;0;L;;;;;N;;;;; 13342;EGYPTIAN HIEROGLYPH U014;Lo;0;L;;;;;N;;;;; 13343;EGYPTIAN HIEROGLYPH U015;Lo;0;L;;;;;N;;;;; 13344;EGYPTIAN HIEROGLYPH U016;Lo;0;L;;;;;N;;;;; 13345;EGYPTIAN HIEROGLYPH U017;Lo;0;L;;;;;N;;;;; 13346;EGYPTIAN HIEROGLYPH U018;Lo;0;L;;;;;N;;;;; 13347;EGYPTIAN HIEROGLYPH U019;Lo;0;L;;;;;N;;;;; 13348;EGYPTIAN HIEROGLYPH U020;Lo;0;L;;;;;N;;;;; 13349;EGYPTIAN HIEROGLYPH U021;Lo;0;L;;;;;N;;;;; 1334A;EGYPTIAN HIEROGLYPH U022;Lo;0;L;;;;;N;;;;; 1334B;EGYPTIAN HIEROGLYPH U023;Lo;0;L;;;;;N;;;;; 1334C;EGYPTIAN HIEROGLYPH U023A;Lo;0;L;;;;;N;;;;; 1334D;EGYPTIAN HIEROGLYPH U024;Lo;0;L;;;;;N;;;;; 1334E;EGYPTIAN HIEROGLYPH U025;Lo;0;L;;;;;N;;;;; 1334F;EGYPTIAN HIEROGLYPH U026;Lo;0;L;;;;;N;;;;; 13350;EGYPTIAN HIEROGLYPH U027;Lo;0;L;;;;;N;;;;; 13351;EGYPTIAN HIEROGLYPH U028;Lo;0;L;;;;;N;;;;; 13352;EGYPTIAN HIEROGLYPH U029;Lo;0;L;;;;;N;;;;; 13353;EGYPTIAN HIEROGLYPH U029A;Lo;0;L;;;;;N;;;;; 13354;EGYPTIAN HIEROGLYPH U030;Lo;0;L;;;;;N;;;;; 13355;EGYPTIAN HIEROGLYPH U031;Lo;0;L;;;;;N;;;;; 13356;EGYPTIAN HIEROGLYPH U032;Lo;0;L;;;;;N;;;;; 13357;EGYPTIAN HIEROGLYPH U032A;Lo;0;L;;;;;N;;;;; 13358;EGYPTIAN HIEROGLYPH U033;Lo;0;L;;;;;N;;;;; 13359;EGYPTIAN HIEROGLYPH U034;Lo;0;L;;;;;N;;;;; 1335A;EGYPTIAN HIEROGLYPH U035;Lo;0;L;;;;;N;;;;; 1335B;EGYPTIAN HIEROGLYPH U036;Lo;0;L;;;;;N;;;;; 1335C;EGYPTIAN HIEROGLYPH U037;Lo;0;L;;;;;N;;;;; 1335D;EGYPTIAN HIEROGLYPH U038;Lo;0;L;;;;;N;;;;; 1335E;EGYPTIAN HIEROGLYPH U039;Lo;0;L;;;;;N;;;;; 1335F;EGYPTIAN HIEROGLYPH U040;Lo;0;L;;;;;N;;;;; 13360;EGYPTIAN HIEROGLYPH U041;Lo;0;L;;;;;N;;;;; 13361;EGYPTIAN HIEROGLYPH U042;Lo;0;L;;;;;N;;;;; 13362;EGYPTIAN HIEROGLYPH V001;Lo;0;L;;;;;N;;;;; 13363;EGYPTIAN HIEROGLYPH V001A;Lo;0;L;;;;;N;;;;; 13364;EGYPTIAN HIEROGLYPH V001B;Lo;0;L;;;;;N;;;;; 13365;EGYPTIAN HIEROGLYPH V001C;Lo;0;L;;;;;N;;;;; 13366;EGYPTIAN HIEROGLYPH V001D;Lo;0;L;;;;;N;;;;; 13367;EGYPTIAN HIEROGLYPH V001E;Lo;0;L;;;;;N;;;;; 13368;EGYPTIAN HIEROGLYPH V001F;Lo;0;L;;;;;N;;;;; 13369;EGYPTIAN HIEROGLYPH V001G;Lo;0;L;;;;;N;;;;; 1336A;EGYPTIAN HIEROGLYPH V001H;Lo;0;L;;;;;N;;;;; 1336B;EGYPTIAN HIEROGLYPH V001I;Lo;0;L;;;;;N;;;;; 1336C;EGYPTIAN HIEROGLYPH V002;Lo;0;L;;;;;N;;;;; 1336D;EGYPTIAN HIEROGLYPH V002A;Lo;0;L;;;;;N;;;;; 1336E;EGYPTIAN HIEROGLYPH V003;Lo;0;L;;;;;N;;;;; 1336F;EGYPTIAN HIEROGLYPH V004;Lo;0;L;;;;;N;;;;; 13370;EGYPTIAN HIEROGLYPH V005;Lo;0;L;;;;;N;;;;; 13371;EGYPTIAN HIEROGLYPH V006;Lo;0;L;;;;;N;;;;; 13372;EGYPTIAN HIEROGLYPH V007;Lo;0;L;;;;;N;;;;; 13373;EGYPTIAN HIEROGLYPH V007A;Lo;0;L;;;;;N;;;;; 13374;EGYPTIAN HIEROGLYPH V007B;Lo;0;L;;;;;N;;;;; 13375;EGYPTIAN HIEROGLYPH V008;Lo;0;L;;;;;N;;;;; 13376;EGYPTIAN HIEROGLYPH V009;Lo;0;L;;;;;N;;;;; 13377;EGYPTIAN HIEROGLYPH V010;Lo;0;L;;;;;N;;;;; 13378;EGYPTIAN HIEROGLYPH V011;Lo;0;L;;;;;N;;;;; 13379;EGYPTIAN HIEROGLYPH V011A;Lo;0;L;;;;;N;;;;; 1337A;EGYPTIAN HIEROGLYPH V011B;Lo;0;L;;;;;N;;;;; 1337B;EGYPTIAN HIEROGLYPH V011C;Lo;0;L;;;;;N;;;;; 1337C;EGYPTIAN HIEROGLYPH V012;Lo;0;L;;;;;N;;;;; 1337D;EGYPTIAN HIEROGLYPH V012A;Lo;0;L;;;;;N;;;;; 1337E;EGYPTIAN HIEROGLYPH V012B;Lo;0;L;;;;;N;;;;; 1337F;EGYPTIAN HIEROGLYPH V013;Lo;0;L;;;;;N;;;;; 13380;EGYPTIAN HIEROGLYPH V014;Lo;0;L;;;;;N;;;;; 13381;EGYPTIAN HIEROGLYPH V015;Lo;0;L;;;;;N;;;;; 13382;EGYPTIAN HIEROGLYPH V016;Lo;0;L;;;;;N;;;;; 13383;EGYPTIAN HIEROGLYPH V017;Lo;0;L;;;;;N;;;;; 13384;EGYPTIAN HIEROGLYPH V018;Lo;0;L;;;;;N;;;;; 13385;EGYPTIAN HIEROGLYPH V019;Lo;0;L;;;;;N;;;;; 13386;EGYPTIAN HIEROGLYPH V020;Lo;0;L;;;;;N;;;;; 13387;EGYPTIAN HIEROGLYPH V020A;Lo;0;L;;;;;N;;;;; 13388;EGYPTIAN HIEROGLYPH V020B;Lo;0;L;;;;;N;;;;; 13389;EGYPTIAN HIEROGLYPH V020C;Lo;0;L;;;;;N;;;;; 1338A;EGYPTIAN HIEROGLYPH V020D;Lo;0;L;;;;;N;;;;; 1338B;EGYPTIAN HIEROGLYPH V020E;Lo;0;L;;;;;N;;;;; 1338C;EGYPTIAN HIEROGLYPH V020F;Lo;0;L;;;;;N;;;;; 1338D;EGYPTIAN HIEROGLYPH V020G;Lo;0;L;;;;;N;;;;; 1338E;EGYPTIAN HIEROGLYPH V020H;Lo;0;L;;;;;N;;;;; 1338F;EGYPTIAN HIEROGLYPH V020I;Lo;0;L;;;;;N;;;;; 13390;EGYPTIAN HIEROGLYPH V020J;Lo;0;L;;;;;N;;;;; 13391;EGYPTIAN HIEROGLYPH V020K;Lo;0;L;;;;;N;;;;; 13392;EGYPTIAN HIEROGLYPH V020L;Lo;0;L;;;;;N;;;;; 13393;EGYPTIAN HIEROGLYPH V021;Lo;0;L;;;;;N;;;;; 13394;EGYPTIAN HIEROGLYPH V022;Lo;0;L;;;;;N;;;;; 13395;EGYPTIAN HIEROGLYPH V023;Lo;0;L;;;;;N;;;;; 13396;EGYPTIAN HIEROGLYPH V023A;Lo;0;L;;;;;N;;;;; 13397;EGYPTIAN HIEROGLYPH V024;Lo;0;L;;;;;N;;;;; 13398;EGYPTIAN HIEROGLYPH V025;Lo;0;L;;;;;N;;;;; 13399;EGYPTIAN HIEROGLYPH V026;Lo;0;L;;;;;N;;;;; 1339A;EGYPTIAN HIEROGLYPH V027;Lo;0;L;;;;;N;;;;; 1339B;EGYPTIAN HIEROGLYPH V028;Lo;0;L;;;;;N;;;;; 1339C;EGYPTIAN HIEROGLYPH V028A;Lo;0;L;;;;;N;;;;; 1339D;EGYPTIAN HIEROGLYPH V029;Lo;0;L;;;;;N;;;;; 1339E;EGYPTIAN HIEROGLYPH V029A;Lo;0;L;;;;;N;;;;; 1339F;EGYPTIAN HIEROGLYPH V030;Lo;0;L;;;;;N;;;;; 133A0;EGYPTIAN HIEROGLYPH V030A;Lo;0;L;;;;;N;;;;; 133A1;EGYPTIAN HIEROGLYPH V031;Lo;0;L;;;;;N;;;;; 133A2;EGYPTIAN HIEROGLYPH V031A;Lo;0;L;;;;;N;;;;; 133A3;EGYPTIAN HIEROGLYPH V032;Lo;0;L;;;;;N;;;;; 133A4;EGYPTIAN HIEROGLYPH V033;Lo;0;L;;;;;N;;;;; 133A5;EGYPTIAN HIEROGLYPH V033A;Lo;0;L;;;;;N;;;;; 133A6;EGYPTIAN HIEROGLYPH V034;Lo;0;L;;;;;N;;;;; 133A7;EGYPTIAN HIEROGLYPH V035;Lo;0;L;;;;;N;;;;; 133A8;EGYPTIAN HIEROGLYPH V036;Lo;0;L;;;;;N;;;;; 133A9;EGYPTIAN HIEROGLYPH V037;Lo;0;L;;;;;N;;;;; 133AA;EGYPTIAN HIEROGLYPH V037A;Lo;0;L;;;;;N;;;;; 133AB;EGYPTIAN HIEROGLYPH V038;Lo;0;L;;;;;N;;;;; 133AC;EGYPTIAN HIEROGLYPH V039;Lo;0;L;;;;;N;;;;; 133AD;EGYPTIAN HIEROGLYPH V040;Lo;0;L;;;;;N;;;;; 133AE;EGYPTIAN HIEROGLYPH V040A;Lo;0;L;;;;;N;;;;; 133AF;EGYPTIAN HIEROGLYPH W001;Lo;0;L;;;;;N;;;;; 133B0;EGYPTIAN HIEROGLYPH W002;Lo;0;L;;;;;N;;;;; 133B1;EGYPTIAN HIEROGLYPH W003;Lo;0;L;;;;;N;;;;; 133B2;EGYPTIAN HIEROGLYPH W003A;Lo;0;L;;;;;N;;;;; 133B3;EGYPTIAN HIEROGLYPH W004;Lo;0;L;;;;;N;;;;; 133B4;EGYPTIAN HIEROGLYPH W005;Lo;0;L;;;;;N;;;;; 133B5;EGYPTIAN HIEROGLYPH W006;Lo;0;L;;;;;N;;;;; 133B6;EGYPTIAN HIEROGLYPH W007;Lo;0;L;;;;;N;;;;; 133B7;EGYPTIAN HIEROGLYPH W008;Lo;0;L;;;;;N;;;;; 133B8;EGYPTIAN HIEROGLYPH W009;Lo;0;L;;;;;N;;;;; 133B9;EGYPTIAN HIEROGLYPH W009A;Lo;0;L;;;;;N;;;;; 133BA;EGYPTIAN HIEROGLYPH W010;Lo;0;L;;;;;N;;;;; 133BB;EGYPTIAN HIEROGLYPH W010A;Lo;0;L;;;;;N;;;;; 133BC;EGYPTIAN HIEROGLYPH W011;Lo;0;L;;;;;N;;;;; 133BD;EGYPTIAN HIEROGLYPH W012;Lo;0;L;;;;;N;;;;; 133BE;EGYPTIAN HIEROGLYPH W013;Lo;0;L;;;;;N;;;;; 133BF;EGYPTIAN HIEROGLYPH W014;Lo;0;L;;;;;N;;;;; 133C0;EGYPTIAN HIEROGLYPH W014A;Lo;0;L;;;;;N;;;;; 133C1;EGYPTIAN HIEROGLYPH W015;Lo;0;L;;;;;N;;;;; 133C2;EGYPTIAN HIEROGLYPH W016;Lo;0;L;;;;;N;;;;; 133C3;EGYPTIAN HIEROGLYPH W017;Lo;0;L;;;;;N;;;;; 133C4;EGYPTIAN HIEROGLYPH W017A;Lo;0;L;;;;;N;;;;; 133C5;EGYPTIAN HIEROGLYPH W018;Lo;0;L;;;;;N;;;;; 133C6;EGYPTIAN HIEROGLYPH W018A;Lo;0;L;;;;;N;;;;; 133C7;EGYPTIAN HIEROGLYPH W019;Lo;0;L;;;;;N;;;;; 133C8;EGYPTIAN HIEROGLYPH W020;Lo;0;L;;;;;N;;;;; 133C9;EGYPTIAN HIEROGLYPH W021;Lo;0;L;;;;;N;;;;; 133CA;EGYPTIAN HIEROGLYPH W022;Lo;0;L;;;;;N;;;;; 133CB;EGYPTIAN HIEROGLYPH W023;Lo;0;L;;;;;N;;;;; 133CC;EGYPTIAN HIEROGLYPH W024;Lo;0;L;;;;;N;;;;; 133CD;EGYPTIAN HIEROGLYPH W024A;Lo;0;L;;;;;N;;;;; 133CE;EGYPTIAN HIEROGLYPH W025;Lo;0;L;;;;;N;;;;; 133CF;EGYPTIAN HIEROGLYPH X001;Lo;0;L;;;;;N;;;;; 133D0;EGYPTIAN HIEROGLYPH X002;Lo;0;L;;;;;N;;;;; 133D1;EGYPTIAN HIEROGLYPH X003;Lo;0;L;;;;;N;;;;; 133D2;EGYPTIAN HIEROGLYPH X004;Lo;0;L;;;;;N;;;;; 133D3;EGYPTIAN HIEROGLYPH X004A;Lo;0;L;;;;;N;;;;; 133D4;EGYPTIAN HIEROGLYPH X004B;Lo;0;L;;;;;N;;;;; 133D5;EGYPTIAN HIEROGLYPH X005;Lo;0;L;;;;;N;;;;; 133D6;EGYPTIAN HIEROGLYPH X006;Lo;0;L;;;;;N;;;;; 133D7;EGYPTIAN HIEROGLYPH X006A;Lo;0;L;;;;;N;;;;; 133D8;EGYPTIAN HIEROGLYPH X007;Lo;0;L;;;;;N;;;;; 133D9;EGYPTIAN HIEROGLYPH X008;Lo;0;L;;;;;N;;;;; 133DA;EGYPTIAN HIEROGLYPH X008A;Lo;0;L;;;;;N;;;;; 133DB;EGYPTIAN HIEROGLYPH Y001;Lo;0;L;;;;;N;;;;; 133DC;EGYPTIAN HIEROGLYPH Y001A;Lo;0;L;;;;;N;;;;; 133DD;EGYPTIAN HIEROGLYPH Y002;Lo;0;L;;;;;N;;;;; 133DE;EGYPTIAN HIEROGLYPH Y003;Lo;0;L;;;;;N;;;;; 133DF;EGYPTIAN HIEROGLYPH Y004;Lo;0;L;;;;;N;;;;; 133E0;EGYPTIAN HIEROGLYPH Y005;Lo;0;L;;;;;N;;;;; 133E1;EGYPTIAN HIEROGLYPH Y006;Lo;0;L;;;;;N;;;;; 133E2;EGYPTIAN HIEROGLYPH Y007;Lo;0;L;;;;;N;;;;; 133E3;EGYPTIAN HIEROGLYPH Y008;Lo;0;L;;;;;N;;;;; 133E4;EGYPTIAN HIEROGLYPH Z001;Lo;0;L;;;;;N;;;;; 133E5;EGYPTIAN HIEROGLYPH Z002;Lo;0;L;;;;;N;;;;; 133E6;EGYPTIAN HIEROGLYPH Z002A;Lo;0;L;;;;;N;;;;; 133E7;EGYPTIAN HIEROGLYPH Z002B;Lo;0;L;;;;;N;;;;; 133E8;EGYPTIAN HIEROGLYPH Z002C;Lo;0;L;;;;;N;;;;; 133E9;EGYPTIAN HIEROGLYPH Z002D;Lo;0;L;;;;;N;;;;; 133EA;EGYPTIAN HIEROGLYPH Z003;Lo;0;L;;;;;N;;;;; 133EB;EGYPTIAN HIEROGLYPH Z003A;Lo;0;L;;;;;N;;;;; 133EC;EGYPTIAN HIEROGLYPH Z003B;Lo;0;L;;;;;N;;;;; 133ED;EGYPTIAN HIEROGLYPH Z004;Lo;0;L;;;;;N;;;;; 133EE;EGYPTIAN HIEROGLYPH Z004A;Lo;0;L;;;;;N;;;;; 133EF;EGYPTIAN HIEROGLYPH Z005;Lo;0;L;;;;;N;;;;; 133F0;EGYPTIAN HIEROGLYPH Z005A;Lo;0;L;;;;;N;;;;; 133F1;EGYPTIAN HIEROGLYPH Z006;Lo;0;L;;;;;N;;;;; 133F2;EGYPTIAN HIEROGLYPH Z007;Lo;0;L;;;;;N;;;;; 133F3;EGYPTIAN HIEROGLYPH Z008;Lo;0;L;;;;;N;;;;; 133F4;EGYPTIAN HIEROGLYPH Z009;Lo;0;L;;;;;N;;;;; 133F5;EGYPTIAN HIEROGLYPH Z010;Lo;0;L;;;;;N;;;;; 133F6;EGYPTIAN HIEROGLYPH Z011;Lo;0;L;;;;;N;;;;; 133F7;EGYPTIAN HIEROGLYPH Z012;Lo;0;L;;;;;N;;;;; 133F8;EGYPTIAN HIEROGLYPH Z013;Lo;0;L;;;;;N;;;;; 133F9;EGYPTIAN HIEROGLYPH Z014;Lo;0;L;;;;;N;;;;; 133FA;EGYPTIAN HIEROGLYPH Z015;Lo;0;L;;;;;N;;;;; 133FB;EGYPTIAN HIEROGLYPH Z015A;Lo;0;L;;;;;N;;;;; 133FC;EGYPTIAN HIEROGLYPH Z015B;Lo;0;L;;;;;N;;;;; 133FD;EGYPTIAN HIEROGLYPH Z015C;Lo;0;L;;;;;N;;;;; 133FE;EGYPTIAN HIEROGLYPH Z015D;Lo;0;L;;;;;N;;;;; 133FF;EGYPTIAN HIEROGLYPH Z015E;Lo;0;L;;;;;N;;;;; 13400;EGYPTIAN HIEROGLYPH Z015F;Lo;0;L;;;;;N;;;;; 13401;EGYPTIAN HIEROGLYPH Z015G;Lo;0;L;;;;;N;;;;; 13402;EGYPTIAN HIEROGLYPH Z015H;Lo;0;L;;;;;N;;;;; 13403;EGYPTIAN HIEROGLYPH Z015I;Lo;0;L;;;;;N;;;;; 13404;EGYPTIAN HIEROGLYPH Z016;Lo;0;L;;;;;N;;;;; 13405;EGYPTIAN HIEROGLYPH Z016A;Lo;0;L;;;;;N;;;;; 13406;EGYPTIAN HIEROGLYPH Z016B;Lo;0;L;;;;;N;;;;; 13407;EGYPTIAN HIEROGLYPH Z016C;Lo;0;L;;;;;N;;;;; 13408;EGYPTIAN HIEROGLYPH Z016D;Lo;0;L;;;;;N;;;;; 13409;EGYPTIAN HIEROGLYPH Z016E;Lo;0;L;;;;;N;;;;; 1340A;EGYPTIAN HIEROGLYPH Z016F;Lo;0;L;;;;;N;;;;; 1340B;EGYPTIAN HIEROGLYPH Z016G;Lo;0;L;;;;;N;;;;; 1340C;EGYPTIAN HIEROGLYPH Z016H;Lo;0;L;;;;;N;;;;; 1340D;EGYPTIAN HIEROGLYPH AA001;Lo;0;L;;;;;N;;;;; 1340E;EGYPTIAN HIEROGLYPH AA002;Lo;0;L;;;;;N;;;;; 1340F;EGYPTIAN HIEROGLYPH AA003;Lo;0;L;;;;;N;;;;; 13410;EGYPTIAN HIEROGLYPH AA004;Lo;0;L;;;;;N;;;;; 13411;EGYPTIAN HIEROGLYPH AA005;Lo;0;L;;;;;N;;;;; 13412;EGYPTIAN HIEROGLYPH AA006;Lo;0;L;;;;;N;;;;; 13413;EGYPTIAN HIEROGLYPH AA007;Lo;0;L;;;;;N;;;;; 13414;EGYPTIAN HIEROGLYPH AA007A;Lo;0;L;;;;;N;;;;; 13415;EGYPTIAN HIEROGLYPH AA007B;Lo;0;L;;;;;N;;;;; 13416;EGYPTIAN HIEROGLYPH AA008;Lo;0;L;;;;;N;;;;; 13417;EGYPTIAN HIEROGLYPH AA009;Lo;0;L;;;;;N;;;;; 13418;EGYPTIAN HIEROGLYPH AA010;Lo;0;L;;;;;N;;;;; 13419;EGYPTIAN HIEROGLYPH AA011;Lo;0;L;;;;;N;;;;; 1341A;EGYPTIAN HIEROGLYPH AA012;Lo;0;L;;;;;N;;;;; 1341B;EGYPTIAN HIEROGLYPH AA013;Lo;0;L;;;;;N;;;;; 1341C;EGYPTIAN HIEROGLYPH AA014;Lo;0;L;;;;;N;;;;; 1341D;EGYPTIAN HIEROGLYPH AA015;Lo;0;L;;;;;N;;;;; 1341E;EGYPTIAN HIEROGLYPH AA016;Lo;0;L;;;;;N;;;;; 1341F;EGYPTIAN HIEROGLYPH AA017;Lo;0;L;;;;;N;;;;; 13420;EGYPTIAN HIEROGLYPH AA018;Lo;0;L;;;;;N;;;;; 13421;EGYPTIAN HIEROGLYPH AA019;Lo;0;L;;;;;N;;;;; 13422;EGYPTIAN HIEROGLYPH AA020;Lo;0;L;;;;;N;;;;; 13423;EGYPTIAN HIEROGLYPH AA021;Lo;0;L;;;;;N;;;;; 13424;EGYPTIAN HIEROGLYPH AA022;Lo;0;L;;;;;N;;;;; 13425;EGYPTIAN HIEROGLYPH AA023;Lo;0;L;;;;;N;;;;; 13426;EGYPTIAN HIEROGLYPH AA024;Lo;0;L;;;;;N;;;;; 13427;EGYPTIAN HIEROGLYPH AA025;Lo;0;L;;;;;N;;;;; 13428;EGYPTIAN HIEROGLYPH AA026;Lo;0;L;;;;;N;;;;; 13429;EGYPTIAN HIEROGLYPH AA027;Lo;0;L;;;;;N;;;;; 1342A;EGYPTIAN HIEROGLYPH AA028;Lo;0;L;;;;;N;;;;; 1342B;EGYPTIAN HIEROGLYPH AA029;Lo;0;L;;;;;N;;;;; 1342C;EGYPTIAN HIEROGLYPH AA030;Lo;0;L;;;;;N;;;;; 1342D;EGYPTIAN HIEROGLYPH AA031;Lo;0;L;;;;;N;;;;; 1342E;EGYPTIAN HIEROGLYPH AA032;Lo;0;L;;;;;N;;;;; 14400;ANATOLIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;; 14401;ANATOLIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;; 14402;ANATOLIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;; 14403;ANATOLIAN HIEROGLYPH A004;Lo;0;L;;;;;N;;;;; 14404;ANATOLIAN HIEROGLYPH A005;Lo;0;L;;;;;N;;;;; 14405;ANATOLIAN HIEROGLYPH A006;Lo;0;L;;;;;N;;;;; 14406;ANATOLIAN HIEROGLYPH A007;Lo;0;L;;;;;N;;;;; 14407;ANATOLIAN HIEROGLYPH A008;Lo;0;L;;;;;N;;;;; 14408;ANATOLIAN HIEROGLYPH A009;Lo;0;L;;;;;N;;;;; 14409;ANATOLIAN HIEROGLYPH A010;Lo;0;L;;;;;N;;;;; 1440A;ANATOLIAN HIEROGLYPH A010A;Lo;0;L;;;;;N;;;;; 1440B;ANATOLIAN HIEROGLYPH A011;Lo;0;L;;;;;N;;;;; 1440C;ANATOLIAN HIEROGLYPH A012;Lo;0;L;;;;;N;;;;; 1440D;ANATOLIAN HIEROGLYPH A013;Lo;0;L;;;;;N;;;;; 1440E;ANATOLIAN HIEROGLYPH A014;Lo;0;L;;;;;N;;;;; 1440F;ANATOLIAN HIEROGLYPH A015;Lo;0;L;;;;;N;;;;; 14410;ANATOLIAN HIEROGLYPH A016;Lo;0;L;;;;;N;;;;; 14411;ANATOLIAN HIEROGLYPH A017;Lo;0;L;;;;;N;;;;; 14412;ANATOLIAN HIEROGLYPH A018;Lo;0;L;;;;;N;;;;; 14413;ANATOLIAN HIEROGLYPH A019;Lo;0;L;;;;;N;;;;; 14414;ANATOLIAN HIEROGLYPH A020;Lo;0;L;;;;;N;;;;; 14415;ANATOLIAN HIEROGLYPH A021;Lo;0;L;;;;;N;;;;; 14416;ANATOLIAN HIEROGLYPH A022;Lo;0;L;;;;;N;;;;; 14417;ANATOLIAN HIEROGLYPH A023;Lo;0;L;;;;;N;;;;; 14418;ANATOLIAN HIEROGLYPH A024;Lo;0;L;;;;;N;;;;; 14419;ANATOLIAN HIEROGLYPH A025;Lo;0;L;;;;;N;;;;; 1441A;ANATOLIAN HIEROGLYPH A026;Lo;0;L;;;;;N;;;;; 1441B;ANATOLIAN HIEROGLYPH A026A;Lo;0;L;;;;;N;;;;; 1441C;ANATOLIAN HIEROGLYPH A027;Lo;0;L;;;;;N;;;;; 1441D;ANATOLIAN HIEROGLYPH A028;Lo;0;L;;;;;N;;;;; 1441E;ANATOLIAN HIEROGLYPH A029;Lo;0;L;;;;;N;;;;; 1441F;ANATOLIAN HIEROGLYPH A030;Lo;0;L;;;;;N;;;;; 14420;ANATOLIAN HIEROGLYPH A031;Lo;0;L;;;;;N;;;;; 14421;ANATOLIAN HIEROGLYPH A032;Lo;0;L;;;;;N;;;;; 14422;ANATOLIAN HIEROGLYPH A033;Lo;0;L;;;;;N;;;;; 14423;ANATOLIAN HIEROGLYPH A034;Lo;0;L;;;;;N;;;;; 14424;ANATOLIAN HIEROGLYPH A035;Lo;0;L;;;;;N;;;;; 14425;ANATOLIAN HIEROGLYPH A036;Lo;0;L;;;;;N;;;;; 14426;ANATOLIAN HIEROGLYPH A037;Lo;0;L;;;;;N;;;;; 14427;ANATOLIAN HIEROGLYPH A038;Lo;0;L;;;;;N;;;;; 14428;ANATOLIAN HIEROGLYPH A039;Lo;0;L;;;;;N;;;;; 14429;ANATOLIAN HIEROGLYPH A039A;Lo;0;L;;;;;N;;;;; 1442A;ANATOLIAN HIEROGLYPH A040;Lo;0;L;;;;;N;;;;; 1442B;ANATOLIAN HIEROGLYPH A041;Lo;0;L;;;;;N;;;;; 1442C;ANATOLIAN HIEROGLYPH A041A;Lo;0;L;;;;;N;;;;; 1442D;ANATOLIAN HIEROGLYPH A042;Lo;0;L;;;;;N;;;;; 1442E;ANATOLIAN HIEROGLYPH A043;Lo;0;L;;;;;N;;;;; 1442F;ANATOLIAN HIEROGLYPH A044;Lo;0;L;;;;;N;;;;; 14430;ANATOLIAN HIEROGLYPH A045;Lo;0;L;;;;;N;;;;; 14431;ANATOLIAN HIEROGLYPH A045A;Lo;0;L;;;;;N;;;;; 14432;ANATOLIAN HIEROGLYPH A046;Lo;0;L;;;;;N;;;;; 14433;ANATOLIAN HIEROGLYPH A046A;Lo;0;L;;;;;N;;;;; 14434;ANATOLIAN HIEROGLYPH A046B;Lo;0;L;;;;;N;;;;; 14435;ANATOLIAN HIEROGLYPH A047;Lo;0;L;;;;;N;;;;; 14436;ANATOLIAN HIEROGLYPH A048;Lo;0;L;;;;;N;;;;; 14437;ANATOLIAN HIEROGLYPH A049;Lo;0;L;;;;;N;;;;; 14438;ANATOLIAN HIEROGLYPH A050;Lo;0;L;;;;;N;;;;; 14439;ANATOLIAN HIEROGLYPH A051;Lo;0;L;;;;;N;;;;; 1443A;ANATOLIAN HIEROGLYPH A052;Lo;0;L;;;;;N;;;;; 1443B;ANATOLIAN HIEROGLYPH A053;Lo;0;L;;;;;N;;;;; 1443C;ANATOLIAN HIEROGLYPH A054;Lo;0;L;;;;;N;;;;; 1443D;ANATOLIAN HIEROGLYPH A055;Lo;0;L;;;;;N;;;;; 1443E;ANATOLIAN HIEROGLYPH A056;Lo;0;L;;;;;N;;;;; 1443F;ANATOLIAN HIEROGLYPH A057;Lo;0;L;;;;;N;;;;; 14440;ANATOLIAN HIEROGLYPH A058;Lo;0;L;;;;;N;;;;; 14441;ANATOLIAN HIEROGLYPH A059;Lo;0;L;;;;;N;;;;; 14442;ANATOLIAN HIEROGLYPH A060;Lo;0;L;;;;;N;;;;; 14443;ANATOLIAN HIEROGLYPH A061;Lo;0;L;;;;;N;;;;; 14444;ANATOLIAN HIEROGLYPH A062;Lo;0;L;;;;;N;;;;; 14445;ANATOLIAN HIEROGLYPH A063;Lo;0;L;;;;;N;;;;; 14446;ANATOLIAN HIEROGLYPH A064;Lo;0;L;;;;;N;;;;; 14447;ANATOLIAN HIEROGLYPH A065;Lo;0;L;;;;;N;;;;; 14448;ANATOLIAN HIEROGLYPH A066;Lo;0;L;;;;;N;;;;; 14449;ANATOLIAN HIEROGLYPH A066A;Lo;0;L;;;;;N;;;;; 1444A;ANATOLIAN HIEROGLYPH A066B;Lo;0;L;;;;;N;;;;; 1444B;ANATOLIAN HIEROGLYPH A066C;Lo;0;L;;;;;N;;;;; 1444C;ANATOLIAN HIEROGLYPH A067;Lo;0;L;;;;;N;;;;; 1444D;ANATOLIAN HIEROGLYPH A068;Lo;0;L;;;;;N;;;;; 1444E;ANATOLIAN HIEROGLYPH A069;Lo;0;L;;;;;N;;;;; 1444F;ANATOLIAN HIEROGLYPH A070;Lo;0;L;;;;;N;;;;; 14450;ANATOLIAN HIEROGLYPH A071;Lo;0;L;;;;;N;;;;; 14451;ANATOLIAN HIEROGLYPH A072;Lo;0;L;;;;;N;;;;; 14452;ANATOLIAN HIEROGLYPH A073;Lo;0;L;;;;;N;;;;; 14453;ANATOLIAN HIEROGLYPH A074;Lo;0;L;;;;;N;;;;; 14454;ANATOLIAN HIEROGLYPH A075;Lo;0;L;;;;;N;;;;; 14455;ANATOLIAN HIEROGLYPH A076;Lo;0;L;;;;;N;;;;; 14456;ANATOLIAN HIEROGLYPH A077;Lo;0;L;;;;;N;;;;; 14457;ANATOLIAN HIEROGLYPH A078;Lo;0;L;;;;;N;;;;; 14458;ANATOLIAN HIEROGLYPH A079;Lo;0;L;;;;;N;;;;; 14459;ANATOLIAN HIEROGLYPH A080;Lo;0;L;;;;;N;;;;; 1445A;ANATOLIAN HIEROGLYPH A081;Lo;0;L;;;;;N;;;;; 1445B;ANATOLIAN HIEROGLYPH A082;Lo;0;L;;;;;N;;;;; 1445C;ANATOLIAN HIEROGLYPH A083;Lo;0;L;;;;;N;;;;; 1445D;ANATOLIAN HIEROGLYPH A084;Lo;0;L;;;;;N;;;;; 1445E;ANATOLIAN HIEROGLYPH A085;Lo;0;L;;;;;N;;;;; 1445F;ANATOLIAN HIEROGLYPH A086;Lo;0;L;;;;;N;;;;; 14460;ANATOLIAN HIEROGLYPH A087;Lo;0;L;;;;;N;;;;; 14461;ANATOLIAN HIEROGLYPH A088;Lo;0;L;;;;;N;;;;; 14462;ANATOLIAN HIEROGLYPH A089;Lo;0;L;;;;;N;;;;; 14463;ANATOLIAN HIEROGLYPH A090;Lo;0;L;;;;;N;;;;; 14464;ANATOLIAN HIEROGLYPH A091;Lo;0;L;;;;;N;;;;; 14465;ANATOLIAN HIEROGLYPH A092;Lo;0;L;;;;;N;;;;; 14466;ANATOLIAN HIEROGLYPH A093;Lo;0;L;;;;;N;;;;; 14467;ANATOLIAN HIEROGLYPH A094;Lo;0;L;;;;;N;;;;; 14468;ANATOLIAN HIEROGLYPH A095;Lo;0;L;;;;;N;;;;; 14469;ANATOLIAN HIEROGLYPH A096;Lo;0;L;;;;;N;;;;; 1446A;ANATOLIAN HIEROGLYPH A097;Lo;0;L;;;;;N;;;;; 1446B;ANATOLIAN HIEROGLYPH A097A;Lo;0;L;;;;;N;;;;; 1446C;ANATOLIAN HIEROGLYPH A098;Lo;0;L;;;;;N;;;;; 1446D;ANATOLIAN HIEROGLYPH A098A;Lo;0;L;;;;;N;;;;; 1446E;ANATOLIAN HIEROGLYPH A099;Lo;0;L;;;;;N;;;;; 1446F;ANATOLIAN HIEROGLYPH A100;Lo;0;L;;;;;N;;;;; 14470;ANATOLIAN HIEROGLYPH A100A;Lo;0;L;;;;;N;;;;; 14471;ANATOLIAN HIEROGLYPH A101;Lo;0;L;;;;;N;;;;; 14472;ANATOLIAN HIEROGLYPH A101A;Lo;0;L;;;;;N;;;;; 14473;ANATOLIAN HIEROGLYPH A102;Lo;0;L;;;;;N;;;;; 14474;ANATOLIAN HIEROGLYPH A102A;Lo;0;L;;;;;N;;;;; 14475;ANATOLIAN HIEROGLYPH A103;Lo;0;L;;;;;N;;;;; 14476;ANATOLIAN HIEROGLYPH A104;Lo;0;L;;;;;N;;;;; 14477;ANATOLIAN HIEROGLYPH A104A;Lo;0;L;;;;;N;;;;; 14478;ANATOLIAN HIEROGLYPH A104B;Lo;0;L;;;;;N;;;;; 14479;ANATOLIAN HIEROGLYPH A104C;Lo;0;L;;;;;N;;;;; 1447A;ANATOLIAN HIEROGLYPH A105;Lo;0;L;;;;;N;;;;; 1447B;ANATOLIAN HIEROGLYPH A105A;Lo;0;L;;;;;N;;;;; 1447C;ANATOLIAN HIEROGLYPH A105B;Lo;0;L;;;;;N;;;;; 1447D;ANATOLIAN HIEROGLYPH A106;Lo;0;L;;;;;N;;;;; 1447E;ANATOLIAN HIEROGLYPH A107;Lo;0;L;;;;;N;;;;; 1447F;ANATOLIAN HIEROGLYPH A107A;Lo;0;L;;;;;N;;;;; 14480;ANATOLIAN HIEROGLYPH A107B;Lo;0;L;;;;;N;;;;; 14481;ANATOLIAN HIEROGLYPH A107C;Lo;0;L;;;;;N;;;;; 14482;ANATOLIAN HIEROGLYPH A108;Lo;0;L;;;;;N;;;;; 14483;ANATOLIAN HIEROGLYPH A109;Lo;0;L;;;;;N;;;;; 14484;ANATOLIAN HIEROGLYPH A110;Lo;0;L;;;;;N;;;;; 14485;ANATOLIAN HIEROGLYPH A110A;Lo;0;L;;;;;N;;;;; 14486;ANATOLIAN HIEROGLYPH A110B;Lo;0;L;;;;;N;;;;; 14487;ANATOLIAN HIEROGLYPH A111;Lo;0;L;;;;;N;;;;; 14488;ANATOLIAN HIEROGLYPH A112;Lo;0;L;;;;;N;;;;; 14489;ANATOLIAN HIEROGLYPH A113;Lo;0;L;;;;;N;;;;; 1448A;ANATOLIAN HIEROGLYPH A114;Lo;0;L;;;;;N;;;;; 1448B;ANATOLIAN HIEROGLYPH A115;Lo;0;L;;;;;N;;;;; 1448C;ANATOLIAN HIEROGLYPH A115A;Lo;0;L;;;;;N;;;;; 1448D;ANATOLIAN HIEROGLYPH A116;Lo;0;L;;;;;N;;;;; 1448E;ANATOLIAN HIEROGLYPH A117;Lo;0;L;;;;;N;;;;; 1448F;ANATOLIAN HIEROGLYPH A118;Lo;0;L;;;;;N;;;;; 14490;ANATOLIAN HIEROGLYPH A119;Lo;0;L;;;;;N;;;;; 14491;ANATOLIAN HIEROGLYPH A120;Lo;0;L;;;;;N;;;;; 14492;ANATOLIAN HIEROGLYPH A121;Lo;0;L;;;;;N;;;;; 14493;ANATOLIAN HIEROGLYPH A122;Lo;0;L;;;;;N;;;;; 14494;ANATOLIAN HIEROGLYPH A123;Lo;0;L;;;;;N;;;;; 14495;ANATOLIAN HIEROGLYPH A124;Lo;0;L;;;;;N;;;;; 14496;ANATOLIAN HIEROGLYPH A125;Lo;0;L;;;;;N;;;;; 14497;ANATOLIAN HIEROGLYPH A125A;Lo;0;L;;;;;N;;;;; 14498;ANATOLIAN HIEROGLYPH A126;Lo;0;L;;;;;N;;;;; 14499;ANATOLIAN HIEROGLYPH A127;Lo;0;L;;;;;N;;;;; 1449A;ANATOLIAN HIEROGLYPH A128;Lo;0;L;;;;;N;;;;; 1449B;ANATOLIAN HIEROGLYPH A129;Lo;0;L;;;;;N;;;;; 1449C;ANATOLIAN HIEROGLYPH A130;Lo;0;L;;;;;N;;;;; 1449D;ANATOLIAN HIEROGLYPH A131;Lo;0;L;;;;;N;;;;; 1449E;ANATOLIAN HIEROGLYPH A132;Lo;0;L;;;;;N;;;;; 1449F;ANATOLIAN HIEROGLYPH A133;Lo;0;L;;;;;N;;;;; 144A0;ANATOLIAN HIEROGLYPH A134;Lo;0;L;;;;;N;;;;; 144A1;ANATOLIAN HIEROGLYPH A135;Lo;0;L;;;;;N;;;;; 144A2;ANATOLIAN HIEROGLYPH A135A;Lo;0;L;;;;;N;;;;; 144A3;ANATOLIAN HIEROGLYPH A136;Lo;0;L;;;;;N;;;;; 144A4;ANATOLIAN HIEROGLYPH A137;Lo;0;L;;;;;N;;;;; 144A5;ANATOLIAN HIEROGLYPH A138;Lo;0;L;;;;;N;;;;; 144A6;ANATOLIAN HIEROGLYPH A139;Lo;0;L;;;;;N;;;;; 144A7;ANATOLIAN HIEROGLYPH A140;Lo;0;L;;;;;N;;;;; 144A8;ANATOLIAN HIEROGLYPH A141;Lo;0;L;;;;;N;;;;; 144A9;ANATOLIAN HIEROGLYPH A142;Lo;0;L;;;;;N;;;;; 144AA;ANATOLIAN HIEROGLYPH A143;Lo;0;L;;;;;N;;;;; 144AB;ANATOLIAN HIEROGLYPH A144;Lo;0;L;;;;;N;;;;; 144AC;ANATOLIAN HIEROGLYPH A145;Lo;0;L;;;;;N;;;;; 144AD;ANATOLIAN HIEROGLYPH A146;Lo;0;L;;;;;N;;;;; 144AE;ANATOLIAN HIEROGLYPH A147;Lo;0;L;;;;;N;;;;; 144AF;ANATOLIAN HIEROGLYPH A148;Lo;0;L;;;;;N;;;;; 144B0;ANATOLIAN HIEROGLYPH A149;Lo;0;L;;;;;N;;;;; 144B1;ANATOLIAN HIEROGLYPH A150;Lo;0;L;;;;;N;;;;; 144B2;ANATOLIAN HIEROGLYPH A151;Lo;0;L;;;;;N;;;;; 144B3;ANATOLIAN HIEROGLYPH A152;Lo;0;L;;;;;N;;;;; 144B4;ANATOLIAN HIEROGLYPH A153;Lo;0;L;;;;;N;;;;; 144B5;ANATOLIAN HIEROGLYPH A154;Lo;0;L;;;;;N;;;;; 144B6;ANATOLIAN HIEROGLYPH A155;Lo;0;L;;;;;N;;;;; 144B7;ANATOLIAN HIEROGLYPH A156;Lo;0;L;;;;;N;;;;; 144B8;ANATOLIAN HIEROGLYPH A157;Lo;0;L;;;;;N;;;;; 144B9;ANATOLIAN HIEROGLYPH A158;Lo;0;L;;;;;N;;;;; 144BA;ANATOLIAN HIEROGLYPH A159;Lo;0;L;;;;;N;;;;; 144BB;ANATOLIAN HIEROGLYPH A160;Lo;0;L;;;;;N;;;;; 144BC;ANATOLIAN HIEROGLYPH A161;Lo;0;L;;;;;N;;;;; 144BD;ANATOLIAN HIEROGLYPH A162;Lo;0;L;;;;;N;;;;; 144BE;ANATOLIAN HIEROGLYPH A163;Lo;0;L;;;;;N;;;;; 144BF;ANATOLIAN HIEROGLYPH A164;Lo;0;L;;;;;N;;;;; 144C0;ANATOLIAN HIEROGLYPH A165;Lo;0;L;;;;;N;;;;; 144C1;ANATOLIAN HIEROGLYPH A166;Lo;0;L;;;;;N;;;;; 144C2;ANATOLIAN HIEROGLYPH A167;Lo;0;L;;;;;N;;;;; 144C3;ANATOLIAN HIEROGLYPH A168;Lo;0;L;;;;;N;;;;; 144C4;ANATOLIAN HIEROGLYPH A169;Lo;0;L;;;;;N;;;;; 144C5;ANATOLIAN HIEROGLYPH A170;Lo;0;L;;;;;N;;;;; 144C6;ANATOLIAN HIEROGLYPH A171;Lo;0;L;;;;;N;;;;; 144C7;ANATOLIAN HIEROGLYPH A172;Lo;0;L;;;;;N;;;;; 144C8;ANATOLIAN HIEROGLYPH A173;Lo;0;L;;;;;N;;;;; 144C9;ANATOLIAN HIEROGLYPH A174;Lo;0;L;;;;;N;;;;; 144CA;ANATOLIAN HIEROGLYPH A175;Lo;0;L;;;;;N;;;;; 144CB;ANATOLIAN HIEROGLYPH A176;Lo;0;L;;;;;N;;;;; 144CC;ANATOLIAN HIEROGLYPH A177;Lo;0;L;;;;;N;;;;; 144CD;ANATOLIAN HIEROGLYPH A178;Lo;0;L;;;;;N;;;;; 144CE;ANATOLIAN HIEROGLYPH A179;Lo;0;L;;;;;N;;;;; 144CF;ANATOLIAN HIEROGLYPH A180;Lo;0;L;;;;;N;;;;; 144D0;ANATOLIAN HIEROGLYPH A181;Lo;0;L;;;;;N;;;;; 144D1;ANATOLIAN HIEROGLYPH A182;Lo;0;L;;;;;N;;;;; 144D2;ANATOLIAN HIEROGLYPH A183;Lo;0;L;;;;;N;;;;; 144D3;ANATOLIAN HIEROGLYPH A184;Lo;0;L;;;;;N;;;;; 144D4;ANATOLIAN HIEROGLYPH A185;Lo;0;L;;;;;N;;;;; 144D5;ANATOLIAN HIEROGLYPH A186;Lo;0;L;;;;;N;;;;; 144D6;ANATOLIAN HIEROGLYPH A187;Lo;0;L;;;;;N;;;;; 144D7;ANATOLIAN HIEROGLYPH A188;Lo;0;L;;;;;N;;;;; 144D8;ANATOLIAN HIEROGLYPH A189;Lo;0;L;;;;;N;;;;; 144D9;ANATOLIAN HIEROGLYPH A190;Lo;0;L;;;;;N;;;;; 144DA;ANATOLIAN HIEROGLYPH A191;Lo;0;L;;;;;N;;;;; 144DB;ANATOLIAN HIEROGLYPH A192;Lo;0;L;;;;;N;;;;; 144DC;ANATOLIAN HIEROGLYPH A193;Lo;0;L;;;;;N;;;;; 144DD;ANATOLIAN HIEROGLYPH A194;Lo;0;L;;;;;N;;;;; 144DE;ANATOLIAN HIEROGLYPH A195;Lo;0;L;;;;;N;;;;; 144DF;ANATOLIAN HIEROGLYPH A196;Lo;0;L;;;;;N;;;;; 144E0;ANATOLIAN HIEROGLYPH A197;Lo;0;L;;;;;N;;;;; 144E1;ANATOLIAN HIEROGLYPH A198;Lo;0;L;;;;;N;;;;; 144E2;ANATOLIAN HIEROGLYPH A199;Lo;0;L;;;;;N;;;;; 144E3;ANATOLIAN HIEROGLYPH A200;Lo;0;L;;;;;N;;;;; 144E4;ANATOLIAN HIEROGLYPH A201;Lo;0;L;;;;;N;;;;; 144E5;ANATOLIAN HIEROGLYPH A202;Lo;0;L;;;;;N;;;;; 144E6;ANATOLIAN HIEROGLYPH A202A;Lo;0;L;;;;;N;;;;; 144E7;ANATOLIAN HIEROGLYPH A202B;Lo;0;L;;;;;N;;;;; 144E8;ANATOLIAN HIEROGLYPH A203;Lo;0;L;;;;;N;;;;; 144E9;ANATOLIAN HIEROGLYPH A204;Lo;0;L;;;;;N;;;;; 144EA;ANATOLIAN HIEROGLYPH A205;Lo;0;L;;;;;N;;;;; 144EB;ANATOLIAN HIEROGLYPH A206;Lo;0;L;;;;;N;;;;; 144EC;ANATOLIAN HIEROGLYPH A207;Lo;0;L;;;;;N;;;;; 144ED;ANATOLIAN HIEROGLYPH A207A;Lo;0;L;;;;;N;;;;; 144EE;ANATOLIAN HIEROGLYPH A208;Lo;0;L;;;;;N;;;;; 144EF;ANATOLIAN HIEROGLYPH A209;Lo;0;L;;;;;N;;;;; 144F0;ANATOLIAN HIEROGLYPH A209A;Lo;0;L;;;;;N;;;;; 144F1;ANATOLIAN HIEROGLYPH A210;Lo;0;L;;;;;N;;;;; 144F2;ANATOLIAN HIEROGLYPH A211;Lo;0;L;;;;;N;;;;; 144F3;ANATOLIAN HIEROGLYPH A212;Lo;0;L;;;;;N;;;;; 144F4;ANATOLIAN HIEROGLYPH A213;Lo;0;L;;;;;N;;;;; 144F5;ANATOLIAN HIEROGLYPH A214;Lo;0;L;;;;;N;;;;; 144F6;ANATOLIAN HIEROGLYPH A215;Lo;0;L;;;;;N;;;;; 144F7;ANATOLIAN HIEROGLYPH A215A;Lo;0;L;;;;;N;;;;; 144F8;ANATOLIAN HIEROGLYPH A216;Lo;0;L;;;;;N;;;;; 144F9;ANATOLIAN HIEROGLYPH A216A;Lo;0;L;;;;;N;;;;; 144FA;ANATOLIAN HIEROGLYPH A217;Lo;0;L;;;;;N;;;;; 144FB;ANATOLIAN HIEROGLYPH A218;Lo;0;L;;;;;N;;;;; 144FC;ANATOLIAN HIEROGLYPH A219;Lo;0;L;;;;;N;;;;; 144FD;ANATOLIAN HIEROGLYPH A220;Lo;0;L;;;;;N;;;;; 144FE;ANATOLIAN HIEROGLYPH A221;Lo;0;L;;;;;N;;;;; 144FF;ANATOLIAN HIEROGLYPH A222;Lo;0;L;;;;;N;;;;; 14500;ANATOLIAN HIEROGLYPH A223;Lo;0;L;;;;;N;;;;; 14501;ANATOLIAN HIEROGLYPH A224;Lo;0;L;;;;;N;;;;; 14502;ANATOLIAN HIEROGLYPH A225;Lo;0;L;;;;;N;;;;; 14503;ANATOLIAN HIEROGLYPH A226;Lo;0;L;;;;;N;;;;; 14504;ANATOLIAN HIEROGLYPH A227;Lo;0;L;;;;;N;;;;; 14505;ANATOLIAN HIEROGLYPH A227A;Lo;0;L;;;;;N;;;;; 14506;ANATOLIAN HIEROGLYPH A228;Lo;0;L;;;;;N;;;;; 14507;ANATOLIAN HIEROGLYPH A229;Lo;0;L;;;;;N;;;;; 14508;ANATOLIAN HIEROGLYPH A230;Lo;0;L;;;;;N;;;;; 14509;ANATOLIAN HIEROGLYPH A231;Lo;0;L;;;;;N;;;;; 1450A;ANATOLIAN HIEROGLYPH A232;Lo;0;L;;;;;N;;;;; 1450B;ANATOLIAN HIEROGLYPH A233;Lo;0;L;;;;;N;;;;; 1450C;ANATOLIAN HIEROGLYPH A234;Lo;0;L;;;;;N;;;;; 1450D;ANATOLIAN HIEROGLYPH A235;Lo;0;L;;;;;N;;;;; 1450E;ANATOLIAN HIEROGLYPH A236;Lo;0;L;;;;;N;;;;; 1450F;ANATOLIAN HIEROGLYPH A237;Lo;0;L;;;;;N;;;;; 14510;ANATOLIAN HIEROGLYPH A238;Lo;0;L;;;;;N;;;;; 14511;ANATOLIAN HIEROGLYPH A239;Lo;0;L;;;;;N;;;;; 14512;ANATOLIAN HIEROGLYPH A240;Lo;0;L;;;;;N;;;;; 14513;ANATOLIAN HIEROGLYPH A241;Lo;0;L;;;;;N;;;;; 14514;ANATOLIAN HIEROGLYPH A242;Lo;0;L;;;;;N;;;;; 14515;ANATOLIAN HIEROGLYPH A243;Lo;0;L;;;;;N;;;;; 14516;ANATOLIAN HIEROGLYPH A244;Lo;0;L;;;;;N;;;;; 14517;ANATOLIAN HIEROGLYPH A245;Lo;0;L;;;;;N;;;;; 14518;ANATOLIAN HIEROGLYPH A246;Lo;0;L;;;;;N;;;;; 14519;ANATOLIAN HIEROGLYPH A247;Lo;0;L;;;;;N;;;;; 1451A;ANATOLIAN HIEROGLYPH A248;Lo;0;L;;;;;N;;;;; 1451B;ANATOLIAN HIEROGLYPH A249;Lo;0;L;;;;;N;;;;; 1451C;ANATOLIAN HIEROGLYPH A250;Lo;0;L;;;;;N;;;;; 1451D;ANATOLIAN HIEROGLYPH A251;Lo;0;L;;;;;N;;;;; 1451E;ANATOLIAN HIEROGLYPH A252;Lo;0;L;;;;;N;;;;; 1451F;ANATOLIAN HIEROGLYPH A253;Lo;0;L;;;;;N;;;;; 14520;ANATOLIAN HIEROGLYPH A254;Lo;0;L;;;;;N;;;;; 14521;ANATOLIAN HIEROGLYPH A255;Lo;0;L;;;;;N;;;;; 14522;ANATOLIAN HIEROGLYPH A256;Lo;0;L;;;;;N;;;;; 14523;ANATOLIAN HIEROGLYPH A257;Lo;0;L;;;;;N;;;;; 14524;ANATOLIAN HIEROGLYPH A258;Lo;0;L;;;;;N;;;;; 14525;ANATOLIAN HIEROGLYPH A259;Lo;0;L;;;;;N;;;;; 14526;ANATOLIAN HIEROGLYPH A260;Lo;0;L;;;;;N;;;;; 14527;ANATOLIAN HIEROGLYPH A261;Lo;0;L;;;;;N;;;;; 14528;ANATOLIAN HIEROGLYPH A262;Lo;0;L;;;;;N;;;;; 14529;ANATOLIAN HIEROGLYPH A263;Lo;0;L;;;;;N;;;;; 1452A;ANATOLIAN HIEROGLYPH A264;Lo;0;L;;;;;N;;;;; 1452B;ANATOLIAN HIEROGLYPH A265;Lo;0;L;;;;;N;;;;; 1452C;ANATOLIAN HIEROGLYPH A266;Lo;0;L;;;;;N;;;;; 1452D;ANATOLIAN HIEROGLYPH A267;Lo;0;L;;;;;N;;;;; 1452E;ANATOLIAN HIEROGLYPH A267A;Lo;0;L;;;;;N;;;;; 1452F;ANATOLIAN HIEROGLYPH A268;Lo;0;L;;;;;N;;;;; 14530;ANATOLIAN HIEROGLYPH A269;Lo;0;L;;;;;N;;;;; 14531;ANATOLIAN HIEROGLYPH A270;Lo;0;L;;;;;N;;;;; 14532;ANATOLIAN HIEROGLYPH A271;Lo;0;L;;;;;N;;;;; 14533;ANATOLIAN HIEROGLYPH A272;Lo;0;L;;;;;N;;;;; 14534;ANATOLIAN HIEROGLYPH A273;Lo;0;L;;;;;N;;;;; 14535;ANATOLIAN HIEROGLYPH A274;Lo;0;L;;;;;N;;;;; 14536;ANATOLIAN HIEROGLYPH A275;Lo;0;L;;;;;N;;;;; 14537;ANATOLIAN HIEROGLYPH A276;Lo;0;L;;;;;N;;;;; 14538;ANATOLIAN HIEROGLYPH A277;Lo;0;L;;;;;N;;;;; 14539;ANATOLIAN HIEROGLYPH A278;Lo;0;L;;;;;N;;;;; 1453A;ANATOLIAN HIEROGLYPH A279;Lo;0;L;;;;;N;;;;; 1453B;ANATOLIAN HIEROGLYPH A280;Lo;0;L;;;;;N;;;;; 1453C;ANATOLIAN HIEROGLYPH A281;Lo;0;L;;;;;N;;;;; 1453D;ANATOLIAN HIEROGLYPH A282;Lo;0;L;;;;;N;;;;; 1453E;ANATOLIAN HIEROGLYPH A283;Lo;0;L;;;;;N;;;;; 1453F;ANATOLIAN HIEROGLYPH A284;Lo;0;L;;;;;N;;;;; 14540;ANATOLIAN HIEROGLYPH A285;Lo;0;L;;;;;N;;;;; 14541;ANATOLIAN HIEROGLYPH A286;Lo;0;L;;;;;N;;;;; 14542;ANATOLIAN HIEROGLYPH A287;Lo;0;L;;;;;N;;;;; 14543;ANATOLIAN HIEROGLYPH A288;Lo;0;L;;;;;N;;;;; 14544;ANATOLIAN HIEROGLYPH A289;Lo;0;L;;;;;N;;;;; 14545;ANATOLIAN HIEROGLYPH A289A;Lo;0;L;;;;;N;;;;; 14546;ANATOLIAN HIEROGLYPH A290;Lo;0;L;;;;;N;;;;; 14547;ANATOLIAN HIEROGLYPH A291;Lo;0;L;;;;;N;;;;; 14548;ANATOLIAN HIEROGLYPH A292;Lo;0;L;;;;;N;;;;; 14549;ANATOLIAN HIEROGLYPH A293;Lo;0;L;;;;;N;;;;; 1454A;ANATOLIAN HIEROGLYPH A294;Lo;0;L;;;;;N;;;;; 1454B;ANATOLIAN HIEROGLYPH A294A;Lo;0;L;;;;;N;;;;; 1454C;ANATOLIAN HIEROGLYPH A295;Lo;0;L;;;;;N;;;;; 1454D;ANATOLIAN HIEROGLYPH A296;Lo;0;L;;;;;N;;;;; 1454E;ANATOLIAN HIEROGLYPH A297;Lo;0;L;;;;;N;;;;; 1454F;ANATOLIAN HIEROGLYPH A298;Lo;0;L;;;;;N;;;;; 14550;ANATOLIAN HIEROGLYPH A299;Lo;0;L;;;;;N;;;;; 14551;ANATOLIAN HIEROGLYPH A299A;Lo;0;L;;;;;N;;;;; 14552;ANATOLIAN HIEROGLYPH A300;Lo;0;L;;;;;N;;;;; 14553;ANATOLIAN HIEROGLYPH A301;Lo;0;L;;;;;N;;;;; 14554;ANATOLIAN HIEROGLYPH A302;Lo;0;L;;;;;N;;;;; 14555;ANATOLIAN HIEROGLYPH A303;Lo;0;L;;;;;N;;;;; 14556;ANATOLIAN HIEROGLYPH A304;Lo;0;L;;;;;N;;;;; 14557;ANATOLIAN HIEROGLYPH A305;Lo;0;L;;;;;N;;;;; 14558;ANATOLIAN HIEROGLYPH A306;Lo;0;L;;;;;N;;;;; 14559;ANATOLIAN HIEROGLYPH A307;Lo;0;L;;;;;N;;;;; 1455A;ANATOLIAN HIEROGLYPH A308;Lo;0;L;;;;;N;;;;; 1455B;ANATOLIAN HIEROGLYPH A309;Lo;0;L;;;;;N;;;;; 1455C;ANATOLIAN HIEROGLYPH A309A;Lo;0;L;;;;;N;;;;; 1455D;ANATOLIAN HIEROGLYPH A310;Lo;0;L;;;;;N;;;;; 1455E;ANATOLIAN HIEROGLYPH A311;Lo;0;L;;;;;N;;;;; 1455F;ANATOLIAN HIEROGLYPH A312;Lo;0;L;;;;;N;;;;; 14560;ANATOLIAN HIEROGLYPH A313;Lo;0;L;;;;;N;;;;; 14561;ANATOLIAN HIEROGLYPH A314;Lo;0;L;;;;;N;;;;; 14562;ANATOLIAN HIEROGLYPH A315;Lo;0;L;;;;;N;;;;; 14563;ANATOLIAN HIEROGLYPH A316;Lo;0;L;;;;;N;;;;; 14564;ANATOLIAN HIEROGLYPH A317;Lo;0;L;;;;;N;;;;; 14565;ANATOLIAN HIEROGLYPH A318;Lo;0;L;;;;;N;;;;; 14566;ANATOLIAN HIEROGLYPH A319;Lo;0;L;;;;;N;;;;; 14567;ANATOLIAN HIEROGLYPH A320;Lo;0;L;;;;;N;;;;; 14568;ANATOLIAN HIEROGLYPH A321;Lo;0;L;;;;;N;;;;; 14569;ANATOLIAN HIEROGLYPH A322;Lo;0;L;;;;;N;;;;; 1456A;ANATOLIAN HIEROGLYPH A323;Lo;0;L;;;;;N;;;;; 1456B;ANATOLIAN HIEROGLYPH A324;Lo;0;L;;;;;N;;;;; 1456C;ANATOLIAN HIEROGLYPH A325;Lo;0;L;;;;;N;;;;; 1456D;ANATOLIAN HIEROGLYPH A326;Lo;0;L;;;;;N;;;;; 1456E;ANATOLIAN HIEROGLYPH A327;Lo;0;L;;;;;N;;;;; 1456F;ANATOLIAN HIEROGLYPH A328;Lo;0;L;;;;;N;;;;; 14570;ANATOLIAN HIEROGLYPH A329;Lo;0;L;;;;;N;;;;; 14571;ANATOLIAN HIEROGLYPH A329A;Lo;0;L;;;;;N;;;;; 14572;ANATOLIAN HIEROGLYPH A330;Lo;0;L;;;;;N;;;;; 14573;ANATOLIAN HIEROGLYPH A331;Lo;0;L;;;;;N;;;;; 14574;ANATOLIAN HIEROGLYPH A332A;Lo;0;L;;;;;N;;;;; 14575;ANATOLIAN HIEROGLYPH A332B;Lo;0;L;;;;;N;;;;; 14576;ANATOLIAN HIEROGLYPH A332C;Lo;0;L;;;;;N;;;;; 14577;ANATOLIAN HIEROGLYPH A333;Lo;0;L;;;;;N;;;;; 14578;ANATOLIAN HIEROGLYPH A334;Lo;0;L;;;;;N;;;;; 14579;ANATOLIAN HIEROGLYPH A335;Lo;0;L;;;;;N;;;;; 1457A;ANATOLIAN HIEROGLYPH A336;Lo;0;L;;;;;N;;;;; 1457B;ANATOLIAN HIEROGLYPH A336A;Lo;0;L;;;;;N;;;;; 1457C;ANATOLIAN HIEROGLYPH A336B;Lo;0;L;;;;;N;;;;; 1457D;ANATOLIAN HIEROGLYPH A336C;Lo;0;L;;;;;N;;;;; 1457E;ANATOLIAN HIEROGLYPH A337;Lo;0;L;;;;;N;;;;; 1457F;ANATOLIAN HIEROGLYPH A338;Lo;0;L;;;;;N;;;;; 14580;ANATOLIAN HIEROGLYPH A339;Lo;0;L;;;;;N;;;;; 14581;ANATOLIAN HIEROGLYPH A340;Lo;0;L;;;;;N;;;;; 14582;ANATOLIAN HIEROGLYPH A341;Lo;0;L;;;;;N;;;;; 14583;ANATOLIAN HIEROGLYPH A342;Lo;0;L;;;;;N;;;;; 14584;ANATOLIAN HIEROGLYPH A343;Lo;0;L;;;;;N;;;;; 14585;ANATOLIAN HIEROGLYPH A344;Lo;0;L;;;;;N;;;;; 14586;ANATOLIAN HIEROGLYPH A345;Lo;0;L;;;;;N;;;;; 14587;ANATOLIAN HIEROGLYPH A346;Lo;0;L;;;;;N;;;;; 14588;ANATOLIAN HIEROGLYPH A347;Lo;0;L;;;;;N;;;;; 14589;ANATOLIAN HIEROGLYPH A348;Lo;0;L;;;;;N;;;;; 1458A;ANATOLIAN HIEROGLYPH A349;Lo;0;L;;;;;N;;;;; 1458B;ANATOLIAN HIEROGLYPH A350;Lo;0;L;;;;;N;;;;; 1458C;ANATOLIAN HIEROGLYPH A351;Lo;0;L;;;;;N;;;;; 1458D;ANATOLIAN HIEROGLYPH A352;Lo;0;L;;;;;N;;;;; 1458E;ANATOLIAN HIEROGLYPH A353;Lo;0;L;;;;;N;;;;; 1458F;ANATOLIAN HIEROGLYPH A354;Lo;0;L;;;;;N;;;;; 14590;ANATOLIAN HIEROGLYPH A355;Lo;0;L;;;;;N;;;;; 14591;ANATOLIAN HIEROGLYPH A356;Lo;0;L;;;;;N;;;;; 14592;ANATOLIAN HIEROGLYPH A357;Lo;0;L;;;;;N;;;;; 14593;ANATOLIAN HIEROGLYPH A358;Lo;0;L;;;;;N;;;;; 14594;ANATOLIAN HIEROGLYPH A359;Lo;0;L;;;;;N;;;;; 14595;ANATOLIAN HIEROGLYPH A359A;Lo;0;L;;;;;N;;;;; 14596;ANATOLIAN HIEROGLYPH A360;Lo;0;L;;;;;N;;;;; 14597;ANATOLIAN HIEROGLYPH A361;Lo;0;L;;;;;N;;;;; 14598;ANATOLIAN HIEROGLYPH A362;Lo;0;L;;;;;N;;;;; 14599;ANATOLIAN HIEROGLYPH A363;Lo;0;L;;;;;N;;;;; 1459A;ANATOLIAN HIEROGLYPH A364;Lo;0;L;;;;;N;;;;; 1459B;ANATOLIAN HIEROGLYPH A364A;Lo;0;L;;;;;N;;;;; 1459C;ANATOLIAN HIEROGLYPH A365;Lo;0;L;;;;;N;;;;; 1459D;ANATOLIAN HIEROGLYPH A366;Lo;0;L;;;;;N;;;;; 1459E;ANATOLIAN HIEROGLYPH A367;Lo;0;L;;;;;N;;;;; 1459F;ANATOLIAN HIEROGLYPH A368;Lo;0;L;;;;;N;;;;; 145A0;ANATOLIAN HIEROGLYPH A368A;Lo;0;L;;;;;N;;;;; 145A1;ANATOLIAN HIEROGLYPH A369;Lo;0;L;;;;;N;;;;; 145A2;ANATOLIAN HIEROGLYPH A370;Lo;0;L;;;;;N;;;;; 145A3;ANATOLIAN HIEROGLYPH A371;Lo;0;L;;;;;N;;;;; 145A4;ANATOLIAN HIEROGLYPH A371A;Lo;0;L;;;;;N;;;;; 145A5;ANATOLIAN HIEROGLYPH A372;Lo;0;L;;;;;N;;;;; 145A6;ANATOLIAN HIEROGLYPH A373;Lo;0;L;;;;;N;;;;; 145A7;ANATOLIAN HIEROGLYPH A374;Lo;0;L;;;;;N;;;;; 145A8;ANATOLIAN HIEROGLYPH A375;Lo;0;L;;;;;N;;;;; 145A9;ANATOLIAN HIEROGLYPH A376;Lo;0;L;;;;;N;;;;; 145AA;ANATOLIAN HIEROGLYPH A377;Lo;0;L;;;;;N;;;;; 145AB;ANATOLIAN HIEROGLYPH A378;Lo;0;L;;;;;N;;;;; 145AC;ANATOLIAN HIEROGLYPH A379;Lo;0;L;;;;;N;;;;; 145AD;ANATOLIAN HIEROGLYPH A380;Lo;0;L;;;;;N;;;;; 145AE;ANATOLIAN HIEROGLYPH A381;Lo;0;L;;;;;N;;;;; 145AF;ANATOLIAN HIEROGLYPH A381A;Lo;0;L;;;;;N;;;;; 145B0;ANATOLIAN HIEROGLYPH A382;Lo;0;L;;;;;N;;;;; 145B1;ANATOLIAN HIEROGLYPH A383 RA OR RI;Lo;0;L;;;;;N;;;;; 145B2;ANATOLIAN HIEROGLYPH A383A;Lo;0;L;;;;;N;;;;; 145B3;ANATOLIAN HIEROGLYPH A384;Lo;0;L;;;;;N;;;;; 145B4;ANATOLIAN HIEROGLYPH A385;Lo;0;L;;;;;N;;;;; 145B5;ANATOLIAN HIEROGLYPH A386;Lo;0;L;;;;;N;;;;; 145B6;ANATOLIAN HIEROGLYPH A386A;Lo;0;L;;;;;N;;;;; 145B7;ANATOLIAN HIEROGLYPH A387;Lo;0;L;;;;;N;;;;; 145B8;ANATOLIAN HIEROGLYPH A388;Lo;0;L;;;;;N;;;;; 145B9;ANATOLIAN HIEROGLYPH A389;Lo;0;L;;;;;N;;;;; 145BA;ANATOLIAN HIEROGLYPH A390;Lo;0;L;;;;;N;;;;; 145BB;ANATOLIAN HIEROGLYPH A391;Lo;0;L;;;;;N;;;;; 145BC;ANATOLIAN HIEROGLYPH A392;Lo;0;L;;;;;N;;;;; 145BD;ANATOLIAN HIEROGLYPH A393 EIGHT;Lo;0;L;;;;;N;;;;; 145BE;ANATOLIAN HIEROGLYPH A394;Lo;0;L;;;;;N;;;;; 145BF;ANATOLIAN HIEROGLYPH A395;Lo;0;L;;;;;N;;;;; 145C0;ANATOLIAN HIEROGLYPH A396;Lo;0;L;;;;;N;;;;; 145C1;ANATOLIAN HIEROGLYPH A397;Lo;0;L;;;;;N;;;;; 145C2;ANATOLIAN HIEROGLYPH A398;Lo;0;L;;;;;N;;;;; 145C3;ANATOLIAN HIEROGLYPH A399;Lo;0;L;;;;;N;;;;; 145C4;ANATOLIAN HIEROGLYPH A400;Lo;0;L;;;;;N;;;;; 145C5;ANATOLIAN HIEROGLYPH A401;Lo;0;L;;;;;N;;;;; 145C6;ANATOLIAN HIEROGLYPH A402;Lo;0;L;;;;;N;;;;; 145C7;ANATOLIAN HIEROGLYPH A403;Lo;0;L;;;;;N;;;;; 145C8;ANATOLIAN HIEROGLYPH A404;Lo;0;L;;;;;N;;;;; 145C9;ANATOLIAN HIEROGLYPH A405;Lo;0;L;;;;;N;;;;; 145CA;ANATOLIAN HIEROGLYPH A406;Lo;0;L;;;;;N;;;;; 145CB;ANATOLIAN HIEROGLYPH A407;Lo;0;L;;;;;N;;;;; 145CC;ANATOLIAN HIEROGLYPH A408;Lo;0;L;;;;;N;;;;; 145CD;ANATOLIAN HIEROGLYPH A409;Lo;0;L;;;;;N;;;;; 145CE;ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK;Lo;0;L;;;;;N;;;;; 145CF;ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK;Lo;0;L;;;;;N;;;;; 145D0;ANATOLIAN HIEROGLYPH A411;Lo;0;L;;;;;N;;;;; 145D1;ANATOLIAN HIEROGLYPH A412;Lo;0;L;;;;;N;;;;; 145D2;ANATOLIAN HIEROGLYPH A413;Lo;0;L;;;;;N;;;;; 145D3;ANATOLIAN HIEROGLYPH A414;Lo;0;L;;;;;N;;;;; 145D4;ANATOLIAN HIEROGLYPH A415;Lo;0;L;;;;;N;;;;; 145D5;ANATOLIAN HIEROGLYPH A416;Lo;0;L;;;;;N;;;;; 145D6;ANATOLIAN HIEROGLYPH A417;Lo;0;L;;;;;N;;;;; 145D7;ANATOLIAN HIEROGLYPH A418;Lo;0;L;;;;;N;;;;; 145D8;ANATOLIAN HIEROGLYPH A419;Lo;0;L;;;;;N;;;;; 145D9;ANATOLIAN HIEROGLYPH A420;Lo;0;L;;;;;N;;;;; 145DA;ANATOLIAN HIEROGLYPH A421;Lo;0;L;;;;;N;;;;; 145DB;ANATOLIAN HIEROGLYPH A422;Lo;0;L;;;;;N;;;;; 145DC;ANATOLIAN HIEROGLYPH A423;Lo;0;L;;;;;N;;;;; 145DD;ANATOLIAN HIEROGLYPH A424;Lo;0;L;;;;;N;;;;; 145DE;ANATOLIAN HIEROGLYPH A425;Lo;0;L;;;;;N;;;;; 145DF;ANATOLIAN HIEROGLYPH A426;Lo;0;L;;;;;N;;;;; 145E0;ANATOLIAN HIEROGLYPH A427;Lo;0;L;;;;;N;;;;; 145E1;ANATOLIAN HIEROGLYPH A428;Lo;0;L;;;;;N;;;;; 145E2;ANATOLIAN HIEROGLYPH A429;Lo;0;L;;;;;N;;;;; 145E3;ANATOLIAN HIEROGLYPH A430;Lo;0;L;;;;;N;;;;; 145E4;ANATOLIAN HIEROGLYPH A431;Lo;0;L;;;;;N;;;;; 145E5;ANATOLIAN HIEROGLYPH A432;Lo;0;L;;;;;N;;;;; 145E6;ANATOLIAN HIEROGLYPH A433;Lo;0;L;;;;;N;;;;; 145E7;ANATOLIAN HIEROGLYPH A434;Lo;0;L;;;;;N;;;;; 145E8;ANATOLIAN HIEROGLYPH A435;Lo;0;L;;;;;N;;;;; 145E9;ANATOLIAN HIEROGLYPH A436;Lo;0;L;;;;;N;;;;; 145EA;ANATOLIAN HIEROGLYPH A437;Lo;0;L;;;;;N;;;;; 145EB;ANATOLIAN HIEROGLYPH A438;Lo;0;L;;;;;N;;;;; 145EC;ANATOLIAN HIEROGLYPH A439;Lo;0;L;;;;;N;;;;; 145ED;ANATOLIAN HIEROGLYPH A440;Lo;0;L;;;;;N;;;;; 145EE;ANATOLIAN HIEROGLYPH A441;Lo;0;L;;;;;N;;;;; 145EF;ANATOLIAN HIEROGLYPH A442;Lo;0;L;;;;;N;;;;; 145F0;ANATOLIAN HIEROGLYPH A443;Lo;0;L;;;;;N;;;;; 145F1;ANATOLIAN HIEROGLYPH A444;Lo;0;L;;;;;N;;;;; 145F2;ANATOLIAN HIEROGLYPH A445;Lo;0;L;;;;;N;;;;; 145F3;ANATOLIAN HIEROGLYPH A446;Lo;0;L;;;;;N;;;;; 145F4;ANATOLIAN HIEROGLYPH A447;Lo;0;L;;;;;N;;;;; 145F5;ANATOLIAN HIEROGLYPH A448;Lo;0;L;;;;;N;;;;; 145F6;ANATOLIAN HIEROGLYPH A449;Lo;0;L;;;;;N;;;;; 145F7;ANATOLIAN HIEROGLYPH A450;Lo;0;L;;;;;N;;;;; 145F8;ANATOLIAN HIEROGLYPH A450A;Lo;0;L;;;;;N;;;;; 145F9;ANATOLIAN HIEROGLYPH A451;Lo;0;L;;;;;N;;;;; 145FA;ANATOLIAN HIEROGLYPH A452;Lo;0;L;;;;;N;;;;; 145FB;ANATOLIAN HIEROGLYPH A453;Lo;0;L;;;;;N;;;;; 145FC;ANATOLIAN HIEROGLYPH A454;Lo;0;L;;;;;N;;;;; 145FD;ANATOLIAN HIEROGLYPH A455;Lo;0;L;;;;;N;;;;; 145FE;ANATOLIAN HIEROGLYPH A456;Lo;0;L;;;;;N;;;;; 145FF;ANATOLIAN HIEROGLYPH A457;Lo;0;L;;;;;N;;;;; 14600;ANATOLIAN HIEROGLYPH A457A;Lo;0;L;;;;;N;;;;; 14601;ANATOLIAN HIEROGLYPH A458;Lo;0;L;;;;;N;;;;; 14602;ANATOLIAN HIEROGLYPH A459;Lo;0;L;;;;;N;;;;; 14603;ANATOLIAN HIEROGLYPH A460;Lo;0;L;;;;;N;;;;; 14604;ANATOLIAN HIEROGLYPH A461;Lo;0;L;;;;;N;;;;; 14605;ANATOLIAN HIEROGLYPH A462;Lo;0;L;;;;;N;;;;; 14606;ANATOLIAN HIEROGLYPH A463;Lo;0;L;;;;;N;;;;; 14607;ANATOLIAN HIEROGLYPH A464;Lo;0;L;;;;;N;;;;; 14608;ANATOLIAN HIEROGLYPH A465;Lo;0;L;;;;;N;;;;; 14609;ANATOLIAN HIEROGLYPH A466;Lo;0;L;;;;;N;;;;; 1460A;ANATOLIAN HIEROGLYPH A467;Lo;0;L;;;;;N;;;;; 1460B;ANATOLIAN HIEROGLYPH A468;Lo;0;L;;;;;N;;;;; 1460C;ANATOLIAN HIEROGLYPH A469;Lo;0;L;;;;;N;;;;; 1460D;ANATOLIAN HIEROGLYPH A470;Lo;0;L;;;;;N;;;;; 1460E;ANATOLIAN HIEROGLYPH A471;Lo;0;L;;;;;N;;;;; 1460F;ANATOLIAN HIEROGLYPH A472;Lo;0;L;;;;;N;;;;; 14610;ANATOLIAN HIEROGLYPH A473;Lo;0;L;;;;;N;;;;; 14611;ANATOLIAN HIEROGLYPH A474;Lo;0;L;;;;;N;;;;; 14612;ANATOLIAN HIEROGLYPH A475;Lo;0;L;;;;;N;;;;; 14613;ANATOLIAN HIEROGLYPH A476;Lo;0;L;;;;;N;;;;; 14614;ANATOLIAN HIEROGLYPH A477;Lo;0;L;;;;;N;;;;; 14615;ANATOLIAN HIEROGLYPH A478;Lo;0;L;;;;;N;;;;; 14616;ANATOLIAN HIEROGLYPH A479;Lo;0;L;;;;;N;;;;; 14617;ANATOLIAN HIEROGLYPH A480;Lo;0;L;;;;;N;;;;; 14618;ANATOLIAN HIEROGLYPH A481;Lo;0;L;;;;;N;;;;; 14619;ANATOLIAN HIEROGLYPH A482;Lo;0;L;;;;;N;;;;; 1461A;ANATOLIAN HIEROGLYPH A483;Lo;0;L;;;;;N;;;;; 1461B;ANATOLIAN HIEROGLYPH A484;Lo;0;L;;;;;N;;;;; 1461C;ANATOLIAN HIEROGLYPH A485;Lo;0;L;;;;;N;;;;; 1461D;ANATOLIAN HIEROGLYPH A486;Lo;0;L;;;;;N;;;;; 1461E;ANATOLIAN HIEROGLYPH A487;Lo;0;L;;;;;N;;;;; 1461F;ANATOLIAN HIEROGLYPH A488;Lo;0;L;;;;;N;;;;; 14620;ANATOLIAN HIEROGLYPH A489;Lo;0;L;;;;;N;;;;; 14621;ANATOLIAN HIEROGLYPH A490;Lo;0;L;;;;;N;;;;; 14622;ANATOLIAN HIEROGLYPH A491;Lo;0;L;;;;;N;;;;; 14623;ANATOLIAN HIEROGLYPH A492;Lo;0;L;;;;;N;;;;; 14624;ANATOLIAN HIEROGLYPH A493;Lo;0;L;;;;;N;;;;; 14625;ANATOLIAN HIEROGLYPH A494;Lo;0;L;;;;;N;;;;; 14626;ANATOLIAN HIEROGLYPH A495;Lo;0;L;;;;;N;;;;; 14627;ANATOLIAN HIEROGLYPH A496;Lo;0;L;;;;;N;;;;; 14628;ANATOLIAN HIEROGLYPH A497;Lo;0;L;;;;;N;;;;; 14629;ANATOLIAN HIEROGLYPH A501;Lo;0;L;;;;;N;;;;; 1462A;ANATOLIAN HIEROGLYPH A502;Lo;0;L;;;;;N;;;;; 1462B;ANATOLIAN HIEROGLYPH A503;Lo;0;L;;;;;N;;;;; 1462C;ANATOLIAN HIEROGLYPH A504;Lo;0;L;;;;;N;;;;; 1462D;ANATOLIAN HIEROGLYPH A505;Lo;0;L;;;;;N;;;;; 1462E;ANATOLIAN HIEROGLYPH A506;Lo;0;L;;;;;N;;;;; 1462F;ANATOLIAN HIEROGLYPH A507;Lo;0;L;;;;;N;;;;; 14630;ANATOLIAN HIEROGLYPH A508;Lo;0;L;;;;;N;;;;; 14631;ANATOLIAN HIEROGLYPH A509;Lo;0;L;;;;;N;;;;; 14632;ANATOLIAN HIEROGLYPH A510;Lo;0;L;;;;;N;;;;; 14633;ANATOLIAN HIEROGLYPH A511;Lo;0;L;;;;;N;;;;; 14634;ANATOLIAN HIEROGLYPH A512;Lo;0;L;;;;;N;;;;; 14635;ANATOLIAN HIEROGLYPH A513;Lo;0;L;;;;;N;;;;; 14636;ANATOLIAN HIEROGLYPH A514;Lo;0;L;;;;;N;;;;; 14637;ANATOLIAN HIEROGLYPH A515;Lo;0;L;;;;;N;;;;; 14638;ANATOLIAN HIEROGLYPH A516;Lo;0;L;;;;;N;;;;; 14639;ANATOLIAN HIEROGLYPH A517;Lo;0;L;;;;;N;;;;; 1463A;ANATOLIAN HIEROGLYPH A518;Lo;0;L;;;;;N;;;;; 1463B;ANATOLIAN HIEROGLYPH A519;Lo;0;L;;;;;N;;;;; 1463C;ANATOLIAN HIEROGLYPH A520;Lo;0;L;;;;;N;;;;; 1463D;ANATOLIAN HIEROGLYPH A521;Lo;0;L;;;;;N;;;;; 1463E;ANATOLIAN HIEROGLYPH A522;Lo;0;L;;;;;N;;;;; 1463F;ANATOLIAN HIEROGLYPH A523;Lo;0;L;;;;;N;;;;; 14640;ANATOLIAN HIEROGLYPH A524;Lo;0;L;;;;;N;;;;; 14641;ANATOLIAN HIEROGLYPH A525;Lo;0;L;;;;;N;;;;; 14642;ANATOLIAN HIEROGLYPH A526;Lo;0;L;;;;;N;;;;; 14643;ANATOLIAN HIEROGLYPH A527;Lo;0;L;;;;;N;;;;; 14644;ANATOLIAN HIEROGLYPH A528;Lo;0;L;;;;;N;;;;; 14645;ANATOLIAN HIEROGLYPH A529;Lo;0;L;;;;;N;;;;; 14646;ANATOLIAN HIEROGLYPH A530;Lo;0;L;;;;;N;;;;; 16800;BAMUM LETTER PHASE-A NGKUE MFON;Lo;0;L;;;;;N;;;;; 16801;BAMUM LETTER PHASE-A GBIEE FON;Lo;0;L;;;;;N;;;;; 16802;BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE;Lo;0;L;;;;;N;;;;; 16803;BAMUM LETTER PHASE-A PON MFON PIPAEMBA;Lo;0;L;;;;;N;;;;; 16804;BAMUM LETTER PHASE-A NAA MFON;Lo;0;L;;;;;N;;;;; 16805;BAMUM LETTER PHASE-A SHUENSHUET;Lo;0;L;;;;;N;;;;; 16806;BAMUM LETTER PHASE-A TITA MFON;Lo;0;L;;;;;N;;;;; 16807;BAMUM LETTER PHASE-A NZA MFON;Lo;0;L;;;;;N;;;;; 16808;BAMUM LETTER PHASE-A SHINDA PA NJI;Lo;0;L;;;;;N;;;;; 16809;BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE;Lo;0;L;;;;;N;;;;; 1680A;BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA;Lo;0;L;;;;;N;;;;; 1680B;BAMUM LETTER PHASE-A MAEMBGBIEE;Lo;0;L;;;;;N;;;;; 1680C;BAMUM LETTER PHASE-A TU MAEMBA;Lo;0;L;;;;;N;;;;; 1680D;BAMUM LETTER PHASE-A NGANGU;Lo;0;L;;;;;N;;;;; 1680E;BAMUM LETTER PHASE-A MAEMVEUX;Lo;0;L;;;;;N;;;;; 1680F;BAMUM LETTER PHASE-A MANSUAE;Lo;0;L;;;;;N;;;;; 16810;BAMUM LETTER PHASE-A MVEUAENGAM;Lo;0;L;;;;;N;;;;; 16811;BAMUM LETTER PHASE-A SEUNYAM;Lo;0;L;;;;;N;;;;; 16812;BAMUM LETTER PHASE-A NTOQPEN;Lo;0;L;;;;;N;;;;; 16813;BAMUM LETTER PHASE-A KEUKEUTNDA;Lo;0;L;;;;;N;;;;; 16814;BAMUM LETTER PHASE-A NKINDI;Lo;0;L;;;;;N;;;;; 16815;BAMUM LETTER PHASE-A SUU;Lo;0;L;;;;;N;;;;; 16816;BAMUM LETTER PHASE-A NGKUENZEUM;Lo;0;L;;;;;N;;;;; 16817;BAMUM LETTER PHASE-A LAPAQ;Lo;0;L;;;;;N;;;;; 16818;BAMUM LETTER PHASE-A LET KUT;Lo;0;L;;;;;N;;;;; 16819;BAMUM LETTER PHASE-A NTAP MFAA;Lo;0;L;;;;;N;;;;; 1681A;BAMUM LETTER PHASE-A MAEKEUP;Lo;0;L;;;;;N;;;;; 1681B;BAMUM LETTER PHASE-A PASHAE;Lo;0;L;;;;;N;;;;; 1681C;BAMUM LETTER PHASE-A GHEUAERAE;Lo;0;L;;;;;N;;;;; 1681D;BAMUM LETTER PHASE-A PAMSHAE;Lo;0;L;;;;;N;;;;; 1681E;BAMUM LETTER PHASE-A MON NGGEUAET;Lo;0;L;;;;;N;;;;; 1681F;BAMUM LETTER PHASE-A NZUN MEUT;Lo;0;L;;;;;N;;;;; 16820;BAMUM LETTER PHASE-A U YUQ NAE;Lo;0;L;;;;;N;;;;; 16821;BAMUM LETTER PHASE-A GHEUAEGHEUAE;Lo;0;L;;;;;N;;;;; 16822;BAMUM LETTER PHASE-A NTAP NTAA;Lo;0;L;;;;;N;;;;; 16823;BAMUM LETTER PHASE-A SISA;Lo;0;L;;;;;N;;;;; 16824;BAMUM LETTER PHASE-A MGBASA;Lo;0;L;;;;;N;;;;; 16825;BAMUM LETTER PHASE-A MEUNJOMNDEUQ;Lo;0;L;;;;;N;;;;; 16826;BAMUM LETTER PHASE-A MOOMPUQ;Lo;0;L;;;;;N;;;;; 16827;BAMUM LETTER PHASE-A KAFA;Lo;0;L;;;;;N;;;;; 16828;BAMUM LETTER PHASE-A PA LEERAEWA;Lo;0;L;;;;;N;;;;; 16829;BAMUM LETTER PHASE-A NDA LEERAEWA;Lo;0;L;;;;;N;;;;; 1682A;BAMUM LETTER PHASE-A PET;Lo;0;L;;;;;N;;;;; 1682B;BAMUM LETTER PHASE-A MAEMKPEN;Lo;0;L;;;;;N;;;;; 1682C;BAMUM LETTER PHASE-A NIKA;Lo;0;L;;;;;N;;;;; 1682D;BAMUM LETTER PHASE-A PUP;Lo;0;L;;;;;N;;;;; 1682E;BAMUM LETTER PHASE-A TUAEP;Lo;0;L;;;;;N;;;;; 1682F;BAMUM LETTER PHASE-A LUAEP;Lo;0;L;;;;;N;;;;; 16830;BAMUM LETTER PHASE-A SONJAM;Lo;0;L;;;;;N;;;;; 16831;BAMUM LETTER PHASE-A TEUTEUWEN;Lo;0;L;;;;;N;;;;; 16832;BAMUM LETTER PHASE-A MAENYI;Lo;0;L;;;;;N;;;;; 16833;BAMUM LETTER PHASE-A KET;Lo;0;L;;;;;N;;;;; 16834;BAMUM LETTER PHASE-A NDAANGGEUAET;Lo;0;L;;;;;N;;;;; 16835;BAMUM LETTER PHASE-A KUOQ;Lo;0;L;;;;;N;;;;; 16836;BAMUM LETTER PHASE-A MOOMEUT;Lo;0;L;;;;;N;;;;; 16837;BAMUM LETTER PHASE-A SHUM;Lo;0;L;;;;;N;;;;; 16838;BAMUM LETTER PHASE-A LOMMAE;Lo;0;L;;;;;N;;;;; 16839;BAMUM LETTER PHASE-A FIRI;Lo;0;L;;;;;N;;;;; 1683A;BAMUM LETTER PHASE-A ROM;Lo;0;L;;;;;N;;;;; 1683B;BAMUM LETTER PHASE-A KPOQ;Lo;0;L;;;;;N;;;;; 1683C;BAMUM LETTER PHASE-A SOQ;Lo;0;L;;;;;N;;;;; 1683D;BAMUM LETTER PHASE-A MAP PIEET;Lo;0;L;;;;;N;;;;; 1683E;BAMUM LETTER PHASE-A SHIRAE;Lo;0;L;;;;;N;;;;; 1683F;BAMUM LETTER PHASE-A NTAP;Lo;0;L;;;;;N;;;;; 16840;BAMUM LETTER PHASE-A SHOQ NSHUT YUM;Lo;0;L;;;;;N;;;;; 16841;BAMUM LETTER PHASE-A NYIT MONGKEUAEQ;Lo;0;L;;;;;N;;;;; 16842;BAMUM LETTER PHASE-A PAARAE;Lo;0;L;;;;;N;;;;; 16843;BAMUM LETTER PHASE-A NKAARAE;Lo;0;L;;;;;N;;;;; 16844;BAMUM LETTER PHASE-A UNKNOWN;Lo;0;L;;;;;N;;;;; 16845;BAMUM LETTER PHASE-A NGGEN;Lo;0;L;;;;;N;;;;; 16846;BAMUM LETTER PHASE-A MAESI;Lo;0;L;;;;;N;;;;; 16847;BAMUM LETTER PHASE-A NJAM;Lo;0;L;;;;;N;;;;; 16848;BAMUM LETTER PHASE-A MBANYI;Lo;0;L;;;;;N;;;;; 16849;BAMUM LETTER PHASE-A NYET;Lo;0;L;;;;;N;;;;; 1684A;BAMUM LETTER PHASE-A TEUAEN;Lo;0;L;;;;;N;;;;; 1684B;BAMUM LETTER PHASE-A SOT;Lo;0;L;;;;;N;;;;; 1684C;BAMUM LETTER PHASE-A PAAM;Lo;0;L;;;;;N;;;;; 1684D;BAMUM LETTER PHASE-A NSHIEE;Lo;0;L;;;;;N;;;;; 1684E;BAMUM LETTER PHASE-A MAEM;Lo;0;L;;;;;N;;;;; 1684F;BAMUM LETTER PHASE-A NYI;Lo;0;L;;;;;N;;;;; 16850;BAMUM LETTER PHASE-A KAQ;Lo;0;L;;;;;N;;;;; 16851;BAMUM LETTER PHASE-A NSHA;Lo;0;L;;;;;N;;;;; 16852;BAMUM LETTER PHASE-A VEE;Lo;0;L;;;;;N;;;;; 16853;BAMUM LETTER PHASE-A LU;Lo;0;L;;;;;N;;;;; 16854;BAMUM LETTER PHASE-A NEN;Lo;0;L;;;;;N;;;;; 16855;BAMUM LETTER PHASE-A NAQ;Lo;0;L;;;;;N;;;;; 16856;BAMUM LETTER PHASE-A MBAQ;Lo;0;L;;;;;N;;;;; 16857;BAMUM LETTER PHASE-B NSHUET;Lo;0;L;;;;;N;;;;; 16858;BAMUM LETTER PHASE-B TU MAEMGBIEE;Lo;0;L;;;;;N;;;;; 16859;BAMUM LETTER PHASE-B SIEE;Lo;0;L;;;;;N;;;;; 1685A;BAMUM LETTER PHASE-B SET TU;Lo;0;L;;;;;N;;;;; 1685B;BAMUM LETTER PHASE-B LOM NTEUM;Lo;0;L;;;;;N;;;;; 1685C;BAMUM LETTER PHASE-B MBA MAELEE;Lo;0;L;;;;;N;;;;; 1685D;BAMUM LETTER PHASE-B KIEEM;Lo;0;L;;;;;N;;;;; 1685E;BAMUM LETTER PHASE-B YEURAE;Lo;0;L;;;;;N;;;;; 1685F;BAMUM LETTER PHASE-B MBAARAE;Lo;0;L;;;;;N;;;;; 16860;BAMUM LETTER PHASE-B KAM;Lo;0;L;;;;;N;;;;; 16861;BAMUM LETTER PHASE-B PEESHI;Lo;0;L;;;;;N;;;;; 16862;BAMUM LETTER PHASE-B YAFU LEERAEWA;Lo;0;L;;;;;N;;;;; 16863;BAMUM LETTER PHASE-B LAM NSHUT NYAM;Lo;0;L;;;;;N;;;;; 16864;BAMUM LETTER PHASE-B NTIEE SHEUOQ;Lo;0;L;;;;;N;;;;; 16865;BAMUM LETTER PHASE-B NDU NJAA;Lo;0;L;;;;;N;;;;; 16866;BAMUM LETTER PHASE-B GHEUGHEUAEM;Lo;0;L;;;;;N;;;;; 16867;BAMUM LETTER PHASE-B PIT;Lo;0;L;;;;;N;;;;; 16868;BAMUM LETTER PHASE-B TU NSIEE;Lo;0;L;;;;;N;;;;; 16869;BAMUM LETTER PHASE-B SHET NJAQ;Lo;0;L;;;;;N;;;;; 1686A;BAMUM LETTER PHASE-B SHEUAEQTU;Lo;0;L;;;;;N;;;;; 1686B;BAMUM LETTER PHASE-B MFON TEUAEQ;Lo;0;L;;;;;N;;;;; 1686C;BAMUM LETTER PHASE-B MBIT MBAAKET;Lo;0;L;;;;;N;;;;; 1686D;BAMUM LETTER PHASE-B NYI NTEUM;Lo;0;L;;;;;N;;;;; 1686E;BAMUM LETTER PHASE-B KEUPUQ;Lo;0;L;;;;;N;;;;; 1686F;BAMUM LETTER PHASE-B GHEUGHEN;Lo;0;L;;;;;N;;;;; 16870;BAMUM LETTER PHASE-B KEUYEUX;Lo;0;L;;;;;N;;;;; 16871;BAMUM LETTER PHASE-B LAANAE;Lo;0;L;;;;;N;;;;; 16872;BAMUM LETTER PHASE-B PARUM;Lo;0;L;;;;;N;;;;; 16873;BAMUM LETTER PHASE-B VEUM;Lo;0;L;;;;;N;;;;; 16874;BAMUM LETTER PHASE-B NGKINDI MVOP;Lo;0;L;;;;;N;;;;; 16875;BAMUM LETTER PHASE-B NGGEU MBU;Lo;0;L;;;;;N;;;;; 16876;BAMUM LETTER PHASE-B WUAET;Lo;0;L;;;;;N;;;;; 16877;BAMUM LETTER PHASE-B SAKEUAE;Lo;0;L;;;;;N;;;;; 16878;BAMUM LETTER PHASE-B TAAM;Lo;0;L;;;;;N;;;;; 16879;BAMUM LETTER PHASE-B MEUQ;Lo;0;L;;;;;N;;;;; 1687A;BAMUM LETTER PHASE-B NGGUOQ;Lo;0;L;;;;;N;;;;; 1687B;BAMUM LETTER PHASE-B NGGUOQ LARGE;Lo;0;L;;;;;N;;;;; 1687C;BAMUM LETTER PHASE-B MFIYAQ;Lo;0;L;;;;;N;;;;; 1687D;BAMUM LETTER PHASE-B SUE;Lo;0;L;;;;;N;;;;; 1687E;BAMUM LETTER PHASE-B MBEURI;Lo;0;L;;;;;N;;;;; 1687F;BAMUM LETTER PHASE-B MONTIEEN;Lo;0;L;;;;;N;;;;; 16880;BAMUM LETTER PHASE-B NYAEMAE;Lo;0;L;;;;;N;;;;; 16881;BAMUM LETTER PHASE-B PUNGAAM;Lo;0;L;;;;;N;;;;; 16882;BAMUM LETTER PHASE-B MEUT NGGEET;Lo;0;L;;;;;N;;;;; 16883;BAMUM LETTER PHASE-B FEUX;Lo;0;L;;;;;N;;;;; 16884;BAMUM LETTER PHASE-B MBUOQ;Lo;0;L;;;;;N;;;;; 16885;BAMUM LETTER PHASE-B FEE;Lo;0;L;;;;;N;;;;; 16886;BAMUM LETTER PHASE-B KEUAEM;Lo;0;L;;;;;N;;;;; 16887;BAMUM LETTER PHASE-B MA NJEUAENA;Lo;0;L;;;;;N;;;;; 16888;BAMUM LETTER PHASE-B MA NJUQA;Lo;0;L;;;;;N;;;;; 16889;BAMUM LETTER PHASE-B LET;Lo;0;L;;;;;N;;;;; 1688A;BAMUM LETTER PHASE-B NGGAAM;Lo;0;L;;;;;N;;;;; 1688B;BAMUM LETTER PHASE-B NSEN;Lo;0;L;;;;;N;;;;; 1688C;BAMUM LETTER PHASE-B MA;Lo;0;L;;;;;N;;;;; 1688D;BAMUM LETTER PHASE-B KIQ;Lo;0;L;;;;;N;;;;; 1688E;BAMUM LETTER PHASE-B NGOM;Lo;0;L;;;;;N;;;;; 1688F;BAMUM LETTER PHASE-C NGKUE MAEMBA;Lo;0;L;;;;;N;;;;; 16890;BAMUM LETTER PHASE-C NZA;Lo;0;L;;;;;N;;;;; 16891;BAMUM LETTER PHASE-C YUM;Lo;0;L;;;;;N;;;;; 16892;BAMUM LETTER PHASE-C WANGKUOQ;Lo;0;L;;;;;N;;;;; 16893;BAMUM LETTER PHASE-C NGGEN;Lo;0;L;;;;;N;;;;; 16894;BAMUM LETTER PHASE-C NDEUAEREE;Lo;0;L;;;;;N;;;;; 16895;BAMUM LETTER PHASE-C NGKAQ;Lo;0;L;;;;;N;;;;; 16896;BAMUM LETTER PHASE-C GHARAE;Lo;0;L;;;;;N;;;;; 16897;BAMUM LETTER PHASE-C MBEEKEET;Lo;0;L;;;;;N;;;;; 16898;BAMUM LETTER PHASE-C GBAYI;Lo;0;L;;;;;N;;;;; 16899;BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN;Lo;0;L;;;;;N;;;;; 1689A;BAMUM LETTER PHASE-C NTU MBIT;Lo;0;L;;;;;N;;;;; 1689B;BAMUM LETTER PHASE-C MBEUM;Lo;0;L;;;;;N;;;;; 1689C;BAMUM LETTER PHASE-C PIRIEEN;Lo;0;L;;;;;N;;;;; 1689D;BAMUM LETTER PHASE-C NDOMBU;Lo;0;L;;;;;N;;;;; 1689E;BAMUM LETTER PHASE-C MBAA CABBAGE-TREE;Lo;0;L;;;;;N;;;;; 1689F;BAMUM LETTER PHASE-C KEUSHEUAEP;Lo;0;L;;;;;N;;;;; 168A0;BAMUM LETTER PHASE-C GHAP;Lo;0;L;;;;;N;;;;; 168A1;BAMUM LETTER PHASE-C KEUKAQ;Lo;0;L;;;;;N;;;;; 168A2;BAMUM LETTER PHASE-C YU MUOMAE;Lo;0;L;;;;;N;;;;; 168A3;BAMUM LETTER PHASE-C NZEUM;Lo;0;L;;;;;N;;;;; 168A4;BAMUM LETTER PHASE-C MBUE;Lo;0;L;;;;;N;;;;; 168A5;BAMUM LETTER PHASE-C NSEUAEN;Lo;0;L;;;;;N;;;;; 168A6;BAMUM LETTER PHASE-C MBIT;Lo;0;L;;;;;N;;;;; 168A7;BAMUM LETTER PHASE-C YEUQ;Lo;0;L;;;;;N;;;;; 168A8;BAMUM LETTER PHASE-C KPARAQ;Lo;0;L;;;;;N;;;;; 168A9;BAMUM LETTER PHASE-C KAA;Lo;0;L;;;;;N;;;;; 168AA;BAMUM LETTER PHASE-C SEUX;Lo;0;L;;;;;N;;;;; 168AB;BAMUM LETTER PHASE-C NDIDA;Lo;0;L;;;;;N;;;;; 168AC;BAMUM LETTER PHASE-C TAASHAE;Lo;0;L;;;;;N;;;;; 168AD;BAMUM LETTER PHASE-C NJUEQ;Lo;0;L;;;;;N;;;;; 168AE;BAMUM LETTER PHASE-C TITA YUE;Lo;0;L;;;;;N;;;;; 168AF;BAMUM LETTER PHASE-C SUAET;Lo;0;L;;;;;N;;;;; 168B0;BAMUM LETTER PHASE-C NGGUAEN NYAM;Lo;0;L;;;;;N;;;;; 168B1;BAMUM LETTER PHASE-C VEUX;Lo;0;L;;;;;N;;;;; 168B2;BAMUM LETTER PHASE-C NANSANAQ;Lo;0;L;;;;;N;;;;; 168B3;BAMUM LETTER PHASE-C MA KEUAERI;Lo;0;L;;;;;N;;;;; 168B4;BAMUM LETTER PHASE-C NTAA;Lo;0;L;;;;;N;;;;; 168B5;BAMUM LETTER PHASE-C NGGUON;Lo;0;L;;;;;N;;;;; 168B6;BAMUM LETTER PHASE-C LAP;Lo;0;L;;;;;N;;;;; 168B7;BAMUM LETTER PHASE-C MBIRIEEN;Lo;0;L;;;;;N;;;;; 168B8;BAMUM LETTER PHASE-C MGBASAQ;Lo;0;L;;;;;N;;;;; 168B9;BAMUM LETTER PHASE-C NTEUNGBA;Lo;0;L;;;;;N;;;;; 168BA;BAMUM LETTER PHASE-C TEUTEUX;Lo;0;L;;;;;N;;;;; 168BB;BAMUM LETTER PHASE-C NGGUM;Lo;0;L;;;;;N;;;;; 168BC;BAMUM LETTER PHASE-C FUE;Lo;0;L;;;;;N;;;;; 168BD;BAMUM LETTER PHASE-C NDEUT;Lo;0;L;;;;;N;;;;; 168BE;BAMUM LETTER PHASE-C NSA;Lo;0;L;;;;;N;;;;; 168BF;BAMUM LETTER PHASE-C NSHAQ;Lo;0;L;;;;;N;;;;; 168C0;BAMUM LETTER PHASE-C BUNG;Lo;0;L;;;;;N;;;;; 168C1;BAMUM LETTER PHASE-C VEUAEPEN;Lo;0;L;;;;;N;;;;; 168C2;BAMUM LETTER PHASE-C MBERAE;Lo;0;L;;;;;N;;;;; 168C3;BAMUM LETTER PHASE-C RU;Lo;0;L;;;;;N;;;;; 168C4;BAMUM LETTER PHASE-C NJAEM;Lo;0;L;;;;;N;;;;; 168C5;BAMUM LETTER PHASE-C LAM;Lo;0;L;;;;;N;;;;; 168C6;BAMUM LETTER PHASE-C TITUAEP;Lo;0;L;;;;;N;;;;; 168C7;BAMUM LETTER PHASE-C NSUOT NGOM;Lo;0;L;;;;;N;;;;; 168C8;BAMUM LETTER PHASE-C NJEEEE;Lo;0;L;;;;;N;;;;; 168C9;BAMUM LETTER PHASE-C KET;Lo;0;L;;;;;N;;;;; 168CA;BAMUM LETTER PHASE-C NGGU;Lo;0;L;;;;;N;;;;; 168CB;BAMUM LETTER PHASE-C MAESI;Lo;0;L;;;;;N;;;;; 168CC;BAMUM LETTER PHASE-C MBUAEM;Lo;0;L;;;;;N;;;;; 168CD;BAMUM LETTER PHASE-C LU;Lo;0;L;;;;;N;;;;; 168CE;BAMUM LETTER PHASE-C KUT;Lo;0;L;;;;;N;;;;; 168CF;BAMUM LETTER PHASE-C NJAM;Lo;0;L;;;;;N;;;;; 168D0;BAMUM LETTER PHASE-C NGOM;Lo;0;L;;;;;N;;;;; 168D1;BAMUM LETTER PHASE-C WUP;Lo;0;L;;;;;N;;;;; 168D2;BAMUM LETTER PHASE-C NGGUEET;Lo;0;L;;;;;N;;;;; 168D3;BAMUM LETTER PHASE-C NSOM;Lo;0;L;;;;;N;;;;; 168D4;BAMUM LETTER PHASE-C NTEN;Lo;0;L;;;;;N;;;;; 168D5;BAMUM LETTER PHASE-C KUOP NKAARAE;Lo;0;L;;;;;N;;;;; 168D6;BAMUM LETTER PHASE-C NSUN;Lo;0;L;;;;;N;;;;; 168D7;BAMUM LETTER PHASE-C NDAM;Lo;0;L;;;;;N;;;;; 168D8;BAMUM LETTER PHASE-C MA NSIEE;Lo;0;L;;;;;N;;;;; 168D9;BAMUM LETTER PHASE-C YAA;Lo;0;L;;;;;N;;;;; 168DA;BAMUM LETTER PHASE-C NDAP;Lo;0;L;;;;;N;;;;; 168DB;BAMUM LETTER PHASE-C SHUEQ;Lo;0;L;;;;;N;;;;; 168DC;BAMUM LETTER PHASE-C SETFON;Lo;0;L;;;;;N;;;;; 168DD;BAMUM LETTER PHASE-C MBI;Lo;0;L;;;;;N;;;;; 168DE;BAMUM LETTER PHASE-C MAEMBA;Lo;0;L;;;;;N;;;;; 168DF;BAMUM LETTER PHASE-C MBANYI;Lo;0;L;;;;;N;;;;; 168E0;BAMUM LETTER PHASE-C KEUSEUX;Lo;0;L;;;;;N;;;;; 168E1;BAMUM LETTER PHASE-C MBEUX;Lo;0;L;;;;;N;;;;; 168E2;BAMUM LETTER PHASE-C KEUM;Lo;0;L;;;;;N;;;;; 168E3;BAMUM LETTER PHASE-C MBAA PICKET;Lo;0;L;;;;;N;;;;; 168E4;BAMUM LETTER PHASE-C YUWOQ;Lo;0;L;;;;;N;;;;; 168E5;BAMUM LETTER PHASE-C NJEUX;Lo;0;L;;;;;N;;;;; 168E6;BAMUM LETTER PHASE-C MIEE;Lo;0;L;;;;;N;;;;; 168E7;BAMUM LETTER PHASE-C MUAE;Lo;0;L;;;;;N;;;;; 168E8;BAMUM LETTER PHASE-C SHIQ;Lo;0;L;;;;;N;;;;; 168E9;BAMUM LETTER PHASE-C KEN LAW;Lo;0;L;;;;;N;;;;; 168EA;BAMUM LETTER PHASE-C KEN FATIGUE;Lo;0;L;;;;;N;;;;; 168EB;BAMUM LETTER PHASE-C NGAQ;Lo;0;L;;;;;N;;;;; 168EC;BAMUM LETTER PHASE-C NAQ;Lo;0;L;;;;;N;;;;; 168ED;BAMUM LETTER PHASE-C LIQ;Lo;0;L;;;;;N;;;;; 168EE;BAMUM LETTER PHASE-C PIN;Lo;0;L;;;;;N;;;;; 168EF;BAMUM LETTER PHASE-C PEN;Lo;0;L;;;;;N;;;;; 168F0;BAMUM LETTER PHASE-C TET;Lo;0;L;;;;;N;;;;; 168F1;BAMUM LETTER PHASE-D MBUO;Lo;0;L;;;;;N;;;;; 168F2;BAMUM LETTER PHASE-D WAP;Lo;0;L;;;;;N;;;;; 168F3;BAMUM LETTER PHASE-D NJI;Lo;0;L;;;;;N;;;;; 168F4;BAMUM LETTER PHASE-D MFON;Lo;0;L;;;;;N;;;;; 168F5;BAMUM LETTER PHASE-D NJIEE;Lo;0;L;;;;;N;;;;; 168F6;BAMUM LETTER PHASE-D LIEE;Lo;0;L;;;;;N;;;;; 168F7;BAMUM LETTER PHASE-D NJEUT;Lo;0;L;;;;;N;;;;; 168F8;BAMUM LETTER PHASE-D NSHEE;Lo;0;L;;;;;N;;;;; 168F9;BAMUM LETTER PHASE-D NGGAAMAE;Lo;0;L;;;;;N;;;;; 168FA;BAMUM LETTER PHASE-D NYAM;Lo;0;L;;;;;N;;;;; 168FB;BAMUM LETTER PHASE-D WUAEN;Lo;0;L;;;;;N;;;;; 168FC;BAMUM LETTER PHASE-D NGKUN;Lo;0;L;;;;;N;;;;; 168FD;BAMUM LETTER PHASE-D SHEE;Lo;0;L;;;;;N;;;;; 168FE;BAMUM LETTER PHASE-D NGKAP;Lo;0;L;;;;;N;;;;; 168FF;BAMUM LETTER PHASE-D KEUAETMEUN;Lo;0;L;;;;;N;;;;; 16900;BAMUM LETTER PHASE-D TEUT;Lo;0;L;;;;;N;;;;; 16901;BAMUM LETTER PHASE-D SHEUAE;Lo;0;L;;;;;N;;;;; 16902;BAMUM LETTER PHASE-D NJAP;Lo;0;L;;;;;N;;;;; 16903;BAMUM LETTER PHASE-D SUE;Lo;0;L;;;;;N;;;;; 16904;BAMUM LETTER PHASE-D KET;Lo;0;L;;;;;N;;;;; 16905;BAMUM LETTER PHASE-D YAEMMAE;Lo;0;L;;;;;N;;;;; 16906;BAMUM LETTER PHASE-D KUOM;Lo;0;L;;;;;N;;;;; 16907;BAMUM LETTER PHASE-D SAP;Lo;0;L;;;;;N;;;;; 16908;BAMUM LETTER PHASE-D MFEUT;Lo;0;L;;;;;N;;;;; 16909;BAMUM LETTER PHASE-D NDEUX;Lo;0;L;;;;;N;;;;; 1690A;BAMUM LETTER PHASE-D MALEERI;Lo;0;L;;;;;N;;;;; 1690B;BAMUM LETTER PHASE-D MEUT;Lo;0;L;;;;;N;;;;; 1690C;BAMUM LETTER PHASE-D SEUAEQ;Lo;0;L;;;;;N;;;;; 1690D;BAMUM LETTER PHASE-D YEN;Lo;0;L;;;;;N;;;;; 1690E;BAMUM LETTER PHASE-D NJEUAEM;Lo;0;L;;;;;N;;;;; 1690F;BAMUM LETTER PHASE-D KEUOT MBUAE;Lo;0;L;;;;;N;;;;; 16910;BAMUM LETTER PHASE-D NGKEURI;Lo;0;L;;;;;N;;;;; 16911;BAMUM LETTER PHASE-D TU;Lo;0;L;;;;;N;;;;; 16912;BAMUM LETTER PHASE-D GHAA;Lo;0;L;;;;;N;;;;; 16913;BAMUM LETTER PHASE-D NGKYEE;Lo;0;L;;;;;N;;;;; 16914;BAMUM LETTER PHASE-D FEUFEUAET;Lo;0;L;;;;;N;;;;; 16915;BAMUM LETTER PHASE-D NDEE;Lo;0;L;;;;;N;;;;; 16916;BAMUM LETTER PHASE-D MGBOFUM;Lo;0;L;;;;;N;;;;; 16917;BAMUM LETTER PHASE-D LEUAEP;Lo;0;L;;;;;N;;;;; 16918;BAMUM LETTER PHASE-D NDON;Lo;0;L;;;;;N;;;;; 16919;BAMUM LETTER PHASE-D MONI;Lo;0;L;;;;;N;;;;; 1691A;BAMUM LETTER PHASE-D MGBEUN;Lo;0;L;;;;;N;;;;; 1691B;BAMUM LETTER PHASE-D PUUT;Lo;0;L;;;;;N;;;;; 1691C;BAMUM LETTER PHASE-D MGBIEE;Lo;0;L;;;;;N;;;;; 1691D;BAMUM LETTER PHASE-D MFO;Lo;0;L;;;;;N;;;;; 1691E;BAMUM LETTER PHASE-D LUM;Lo;0;L;;;;;N;;;;; 1691F;BAMUM LETTER PHASE-D NSIEEP;Lo;0;L;;;;;N;;;;; 16920;BAMUM LETTER PHASE-D MBAA;Lo;0;L;;;;;N;;;;; 16921;BAMUM LETTER PHASE-D KWAET;Lo;0;L;;;;;N;;;;; 16922;BAMUM LETTER PHASE-D NYET;Lo;0;L;;;;;N;;;;; 16923;BAMUM LETTER PHASE-D TEUAEN;Lo;0;L;;;;;N;;;;; 16924;BAMUM LETTER PHASE-D SOT;Lo;0;L;;;;;N;;;;; 16925;BAMUM LETTER PHASE-D YUWOQ;Lo;0;L;;;;;N;;;;; 16926;BAMUM LETTER PHASE-D KEUM;Lo;0;L;;;;;N;;;;; 16927;BAMUM LETTER PHASE-D RAEM;Lo;0;L;;;;;N;;;;; 16928;BAMUM LETTER PHASE-D TEEEE;Lo;0;L;;;;;N;;;;; 16929;BAMUM LETTER PHASE-D NGKEUAEQ;Lo;0;L;;;;;N;;;;; 1692A;BAMUM LETTER PHASE-D MFEUAE;Lo;0;L;;;;;N;;;;; 1692B;BAMUM LETTER PHASE-D NSIEET;Lo;0;L;;;;;N;;;;; 1692C;BAMUM LETTER PHASE-D KEUP;Lo;0;L;;;;;N;;;;; 1692D;BAMUM LETTER PHASE-D PIP;Lo;0;L;;;;;N;;;;; 1692E;BAMUM LETTER PHASE-D PEUTAE;Lo;0;L;;;;;N;;;;; 1692F;BAMUM LETTER PHASE-D NYUE;Lo;0;L;;;;;N;;;;; 16930;BAMUM LETTER PHASE-D LET;Lo;0;L;;;;;N;;;;; 16931;BAMUM LETTER PHASE-D NGGAAM;Lo;0;L;;;;;N;;;;; 16932;BAMUM LETTER PHASE-D MFIEE;Lo;0;L;;;;;N;;;;; 16933;BAMUM LETTER PHASE-D NGGWAEN;Lo;0;L;;;;;N;;;;; 16934;BAMUM LETTER PHASE-D YUOM;Lo;0;L;;;;;N;;;;; 16935;BAMUM LETTER PHASE-D PAP;Lo;0;L;;;;;N;;;;; 16936;BAMUM LETTER PHASE-D YUOP;Lo;0;L;;;;;N;;;;; 16937;BAMUM LETTER PHASE-D NDAM;Lo;0;L;;;;;N;;;;; 16938;BAMUM LETTER PHASE-D NTEUM;Lo;0;L;;;;;N;;;;; 16939;BAMUM LETTER PHASE-D SUAE;Lo;0;L;;;;;N;;;;; 1693A;BAMUM LETTER PHASE-D KUN;Lo;0;L;;;;;N;;;;; 1693B;BAMUM LETTER PHASE-D NGGEUX;Lo;0;L;;;;;N;;;;; 1693C;BAMUM LETTER PHASE-D NGKIEE;Lo;0;L;;;;;N;;;;; 1693D;BAMUM LETTER PHASE-D TUOT;Lo;0;L;;;;;N;;;;; 1693E;BAMUM LETTER PHASE-D MEUN;Lo;0;L;;;;;N;;;;; 1693F;BAMUM LETTER PHASE-D KUQ;Lo;0;L;;;;;N;;;;; 16940;BAMUM LETTER PHASE-D NSUM;Lo;0;L;;;;;N;;;;; 16941;BAMUM LETTER PHASE-D TEUN;Lo;0;L;;;;;N;;;;; 16942;BAMUM LETTER PHASE-D MAENJET;Lo;0;L;;;;;N;;;;; 16943;BAMUM LETTER PHASE-D NGGAP;Lo;0;L;;;;;N;;;;; 16944;BAMUM LETTER PHASE-D LEUM;Lo;0;L;;;;;N;;;;; 16945;BAMUM LETTER PHASE-D NGGUOM;Lo;0;L;;;;;N;;;;; 16946;BAMUM LETTER PHASE-D NSHUT;Lo;0;L;;;;;N;;;;; 16947;BAMUM LETTER PHASE-D NJUEQ;Lo;0;L;;;;;N;;;;; 16948;BAMUM LETTER PHASE-D GHEUAE;Lo;0;L;;;;;N;;;;; 16949;BAMUM LETTER PHASE-D KU;Lo;0;L;;;;;N;;;;; 1694A;BAMUM LETTER PHASE-D REN OLD;Lo;0;L;;;;;N;;;;; 1694B;BAMUM LETTER PHASE-D TAE;Lo;0;L;;;;;N;;;;; 1694C;BAMUM LETTER PHASE-D TOQ;Lo;0;L;;;;;N;;;;; 1694D;BAMUM LETTER PHASE-D NYI;Lo;0;L;;;;;N;;;;; 1694E;BAMUM LETTER PHASE-D RII;Lo;0;L;;;;;N;;;;; 1694F;BAMUM LETTER PHASE-D LEEEE;Lo;0;L;;;;;N;;;;; 16950;BAMUM LETTER PHASE-D MEEEE;Lo;0;L;;;;;N;;;;; 16951;BAMUM LETTER PHASE-D M;Lo;0;L;;;;;N;;;;; 16952;BAMUM LETTER PHASE-D SUU;Lo;0;L;;;;;N;;;;; 16953;BAMUM LETTER PHASE-D MU;Lo;0;L;;;;;N;;;;; 16954;BAMUM LETTER PHASE-D SHII;Lo;0;L;;;;;N;;;;; 16955;BAMUM LETTER PHASE-D SHEUX;Lo;0;L;;;;;N;;;;; 16956;BAMUM LETTER PHASE-D KYEE;Lo;0;L;;;;;N;;;;; 16957;BAMUM LETTER PHASE-D NU;Lo;0;L;;;;;N;;;;; 16958;BAMUM LETTER PHASE-D SHU;Lo;0;L;;;;;N;;;;; 16959;BAMUM LETTER PHASE-D NTEE;Lo;0;L;;;;;N;;;;; 1695A;BAMUM LETTER PHASE-D PEE;Lo;0;L;;;;;N;;;;; 1695B;BAMUM LETTER PHASE-D NI;Lo;0;L;;;;;N;;;;; 1695C;BAMUM LETTER PHASE-D SHOQ;Lo;0;L;;;;;N;;;;; 1695D;BAMUM LETTER PHASE-D PUQ;Lo;0;L;;;;;N;;;;; 1695E;BAMUM LETTER PHASE-D MVOP;Lo;0;L;;;;;N;;;;; 1695F;BAMUM LETTER PHASE-D LOQ;Lo;0;L;;;;;N;;;;; 16960;BAMUM LETTER PHASE-D REN MUCH;Lo;0;L;;;;;N;;;;; 16961;BAMUM LETTER PHASE-D TI;Lo;0;L;;;;;N;;;;; 16962;BAMUM LETTER PHASE-D NTUU;Lo;0;L;;;;;N;;;;; 16963;BAMUM LETTER PHASE-D MBAA SEVEN;Lo;0;L;;;;;N;;;;; 16964;BAMUM LETTER PHASE-D SAQ;Lo;0;L;;;;;N;;;;; 16965;BAMUM LETTER PHASE-D FAA;Lo;0;L;;;;;N;;;;; 16966;BAMUM LETTER PHASE-E NDAP;Lo;0;L;;;;;N;;;;; 16967;BAMUM LETTER PHASE-E TOON;Lo;0;L;;;;;N;;;;; 16968;BAMUM LETTER PHASE-E MBEUM;Lo;0;L;;;;;N;;;;; 16969;BAMUM LETTER PHASE-E LAP;Lo;0;L;;;;;N;;;;; 1696A;BAMUM LETTER PHASE-E VOM;Lo;0;L;;;;;N;;;;; 1696B;BAMUM LETTER PHASE-E LOON;Lo;0;L;;;;;N;;;;; 1696C;BAMUM LETTER PHASE-E PAA;Lo;0;L;;;;;N;;;;; 1696D;BAMUM LETTER PHASE-E SOM;Lo;0;L;;;;;N;;;;; 1696E;BAMUM LETTER PHASE-E RAQ;Lo;0;L;;;;;N;;;;; 1696F;BAMUM LETTER PHASE-E NSHUOP;Lo;0;L;;;;;N;;;;; 16970;BAMUM LETTER PHASE-E NDUN;Lo;0;L;;;;;N;;;;; 16971;BAMUM LETTER PHASE-E PUAE;Lo;0;L;;;;;N;;;;; 16972;BAMUM LETTER PHASE-E TAM;Lo;0;L;;;;;N;;;;; 16973;BAMUM LETTER PHASE-E NGKA;Lo;0;L;;;;;N;;;;; 16974;BAMUM LETTER PHASE-E KPEUX;Lo;0;L;;;;;N;;;;; 16975;BAMUM LETTER PHASE-E WUO;Lo;0;L;;;;;N;;;;; 16976;BAMUM LETTER PHASE-E SEE;Lo;0;L;;;;;N;;;;; 16977;BAMUM LETTER PHASE-E NGGEUAET;Lo;0;L;;;;;N;;;;; 16978;BAMUM LETTER PHASE-E PAAM;Lo;0;L;;;;;N;;;;; 16979;BAMUM LETTER PHASE-E TOO;Lo;0;L;;;;;N;;;;; 1697A;BAMUM LETTER PHASE-E KUOP;Lo;0;L;;;;;N;;;;; 1697B;BAMUM LETTER PHASE-E LOM;Lo;0;L;;;;;N;;;;; 1697C;BAMUM LETTER PHASE-E NSHIEE;Lo;0;L;;;;;N;;;;; 1697D;BAMUM LETTER PHASE-E NGOP;Lo;0;L;;;;;N;;;;; 1697E;BAMUM LETTER PHASE-E MAEM;Lo;0;L;;;;;N;;;;; 1697F;BAMUM LETTER PHASE-E NGKEUX;Lo;0;L;;;;;N;;;;; 16980;BAMUM LETTER PHASE-E NGOQ;Lo;0;L;;;;;N;;;;; 16981;BAMUM LETTER PHASE-E NSHUE;Lo;0;L;;;;;N;;;;; 16982;BAMUM LETTER PHASE-E RIMGBA;Lo;0;L;;;;;N;;;;; 16983;BAMUM LETTER PHASE-E NJEUX;Lo;0;L;;;;;N;;;;; 16984;BAMUM LETTER PHASE-E PEEM;Lo;0;L;;;;;N;;;;; 16985;BAMUM LETTER PHASE-E SAA;Lo;0;L;;;;;N;;;;; 16986;BAMUM LETTER PHASE-E NGGURAE;Lo;0;L;;;;;N;;;;; 16987;BAMUM LETTER PHASE-E MGBA;Lo;0;L;;;;;N;;;;; 16988;BAMUM LETTER PHASE-E GHEUX;Lo;0;L;;;;;N;;;;; 16989;BAMUM LETTER PHASE-E NGKEUAEM;Lo;0;L;;;;;N;;;;; 1698A;BAMUM LETTER PHASE-E NJAEMLI;Lo;0;L;;;;;N;;;;; 1698B;BAMUM LETTER PHASE-E MAP;Lo;0;L;;;;;N;;;;; 1698C;BAMUM LETTER PHASE-E LOOT;Lo;0;L;;;;;N;;;;; 1698D;BAMUM LETTER PHASE-E NGGEEEE;Lo;0;L;;;;;N;;;;; 1698E;BAMUM LETTER PHASE-E NDIQ;Lo;0;L;;;;;N;;;;; 1698F;BAMUM LETTER PHASE-E TAEN NTEUM;Lo;0;L;;;;;N;;;;; 16990;BAMUM LETTER PHASE-E SET;Lo;0;L;;;;;N;;;;; 16991;BAMUM LETTER PHASE-E PUM;Lo;0;L;;;;;N;;;;; 16992;BAMUM LETTER PHASE-E NDAA SOFTNESS;Lo;0;L;;;;;N;;;;; 16993;BAMUM LETTER PHASE-E NGGUAESHAE NYAM;Lo;0;L;;;;;N;;;;; 16994;BAMUM LETTER PHASE-E YIEE;Lo;0;L;;;;;N;;;;; 16995;BAMUM LETTER PHASE-E GHEUN;Lo;0;L;;;;;N;;;;; 16996;BAMUM LETTER PHASE-E TUAE;Lo;0;L;;;;;N;;;;; 16997;BAMUM LETTER PHASE-E YEUAE;Lo;0;L;;;;;N;;;;; 16998;BAMUM LETTER PHASE-E PO;Lo;0;L;;;;;N;;;;; 16999;BAMUM LETTER PHASE-E TUMAE;Lo;0;L;;;;;N;;;;; 1699A;BAMUM LETTER PHASE-E KEUAE;Lo;0;L;;;;;N;;;;; 1699B;BAMUM LETTER PHASE-E SUAEN;Lo;0;L;;;;;N;;;;; 1699C;BAMUM LETTER PHASE-E TEUAEQ;Lo;0;L;;;;;N;;;;; 1699D;BAMUM LETTER PHASE-E VEUAE;Lo;0;L;;;;;N;;;;; 1699E;BAMUM LETTER PHASE-E WEUX;Lo;0;L;;;;;N;;;;; 1699F;BAMUM LETTER PHASE-E LAAM;Lo;0;L;;;;;N;;;;; 169A0;BAMUM LETTER PHASE-E PU;Lo;0;L;;;;;N;;;;; 169A1;BAMUM LETTER PHASE-E TAAQ;Lo;0;L;;;;;N;;;;; 169A2;BAMUM LETTER PHASE-E GHAAMAE;Lo;0;L;;;;;N;;;;; 169A3;BAMUM LETTER PHASE-E NGEUREUT;Lo;0;L;;;;;N;;;;; 169A4;BAMUM LETTER PHASE-E SHEUAEQ;Lo;0;L;;;;;N;;;;; 169A5;BAMUM LETTER PHASE-E MGBEN;Lo;0;L;;;;;N;;;;; 169A6;BAMUM LETTER PHASE-E MBEE;Lo;0;L;;;;;N;;;;; 169A7;BAMUM LETTER PHASE-E NZAQ;Lo;0;L;;;;;N;;;;; 169A8;BAMUM LETTER PHASE-E NKOM;Lo;0;L;;;;;N;;;;; 169A9;BAMUM LETTER PHASE-E GBET;Lo;0;L;;;;;N;;;;; 169AA;BAMUM LETTER PHASE-E TUM;Lo;0;L;;;;;N;;;;; 169AB;BAMUM LETTER PHASE-E KUET;Lo;0;L;;;;;N;;;;; 169AC;BAMUM LETTER PHASE-E YAP;Lo;0;L;;;;;N;;;;; 169AD;BAMUM LETTER PHASE-E NYI CLEAVER;Lo;0;L;;;;;N;;;;; 169AE;BAMUM LETTER PHASE-E YIT;Lo;0;L;;;;;N;;;;; 169AF;BAMUM LETTER PHASE-E MFEUQ;Lo;0;L;;;;;N;;;;; 169B0;BAMUM LETTER PHASE-E NDIAQ;Lo;0;L;;;;;N;;;;; 169B1;BAMUM LETTER PHASE-E PIEEQ;Lo;0;L;;;;;N;;;;; 169B2;BAMUM LETTER PHASE-E YUEQ;Lo;0;L;;;;;N;;;;; 169B3;BAMUM LETTER PHASE-E LEUAEM;Lo;0;L;;;;;N;;;;; 169B4;BAMUM LETTER PHASE-E FUE;Lo;0;L;;;;;N;;;;; 169B5;BAMUM LETTER PHASE-E GBEUX;Lo;0;L;;;;;N;;;;; 169B6;BAMUM LETTER PHASE-E NGKUP;Lo;0;L;;;;;N;;;;; 169B7;BAMUM LETTER PHASE-E KET;Lo;0;L;;;;;N;;;;; 169B8;BAMUM LETTER PHASE-E MAE;Lo;0;L;;;;;N;;;;; 169B9;BAMUM LETTER PHASE-E NGKAAMI;Lo;0;L;;;;;N;;;;; 169BA;BAMUM LETTER PHASE-E GHET;Lo;0;L;;;;;N;;;;; 169BB;BAMUM LETTER PHASE-E FA;Lo;0;L;;;;;N;;;;; 169BC;BAMUM LETTER PHASE-E NTUM;Lo;0;L;;;;;N;;;;; 169BD;BAMUM LETTER PHASE-E PEUT;Lo;0;L;;;;;N;;;;; 169BE;BAMUM LETTER PHASE-E YEUM;Lo;0;L;;;;;N;;;;; 169BF;BAMUM LETTER PHASE-E NGGEUAE;Lo;0;L;;;;;N;;;;; 169C0;BAMUM LETTER PHASE-E NYI BETWEEN;Lo;0;L;;;;;N;;;;; 169C1;BAMUM LETTER PHASE-E NZUQ;Lo;0;L;;;;;N;;;;; 169C2;BAMUM LETTER PHASE-E POON;Lo;0;L;;;;;N;;;;; 169C3;BAMUM LETTER PHASE-E MIEE;Lo;0;L;;;;;N;;;;; 169C4;BAMUM LETTER PHASE-E FUET;Lo;0;L;;;;;N;;;;; 169C5;BAMUM LETTER PHASE-E NAE;Lo;0;L;;;;;N;;;;; 169C6;BAMUM LETTER PHASE-E MUAE;Lo;0;L;;;;;N;;;;; 169C7;BAMUM LETTER PHASE-E GHEUAE;Lo;0;L;;;;;N;;;;; 169C8;BAMUM LETTER PHASE-E FU I;Lo;0;L;;;;;N;;;;; 169C9;BAMUM LETTER PHASE-E MVI;Lo;0;L;;;;;N;;;;; 169CA;BAMUM LETTER PHASE-E PUAQ;Lo;0;L;;;;;N;;;;; 169CB;BAMUM LETTER PHASE-E NGKUM;Lo;0;L;;;;;N;;;;; 169CC;BAMUM LETTER PHASE-E KUT;Lo;0;L;;;;;N;;;;; 169CD;BAMUM LETTER PHASE-E PIET;Lo;0;L;;;;;N;;;;; 169CE;BAMUM LETTER PHASE-E NTAP;Lo;0;L;;;;;N;;;;; 169CF;BAMUM LETTER PHASE-E YEUAET;Lo;0;L;;;;;N;;;;; 169D0;BAMUM LETTER PHASE-E NGGUP;Lo;0;L;;;;;N;;;;; 169D1;BAMUM LETTER PHASE-E PA PEOPLE;Lo;0;L;;;;;N;;;;; 169D2;BAMUM LETTER PHASE-E FU CALL;Lo;0;L;;;;;N;;;;; 169D3;BAMUM LETTER PHASE-E FOM;Lo;0;L;;;;;N;;;;; 169D4;BAMUM LETTER PHASE-E NJEE;Lo;0;L;;;;;N;;;;; 169D5;BAMUM LETTER PHASE-E A;Lo;0;L;;;;;N;;;;; 169D6;BAMUM LETTER PHASE-E TOQ;Lo;0;L;;;;;N;;;;; 169D7;BAMUM LETTER PHASE-E O;Lo;0;L;;;;;N;;;;; 169D8;BAMUM LETTER PHASE-E I;Lo;0;L;;;;;N;;;;; 169D9;BAMUM LETTER PHASE-E LAQ;Lo;0;L;;;;;N;;;;; 169DA;BAMUM LETTER PHASE-E PA PLURAL;Lo;0;L;;;;;N;;;;; 169DB;BAMUM LETTER PHASE-E TAA;Lo;0;L;;;;;N;;;;; 169DC;BAMUM LETTER PHASE-E TAQ;Lo;0;L;;;;;N;;;;; 169DD;BAMUM LETTER PHASE-E NDAA MY HOUSE;Lo;0;L;;;;;N;;;;; 169DE;BAMUM LETTER PHASE-E SHIQ;Lo;0;L;;;;;N;;;;; 169DF;BAMUM LETTER PHASE-E YEUX;Lo;0;L;;;;;N;;;;; 169E0;BAMUM LETTER PHASE-E NGUAE;Lo;0;L;;;;;N;;;;; 169E1;BAMUM LETTER PHASE-E YUAEN;Lo;0;L;;;;;N;;;;; 169E2;BAMUM LETTER PHASE-E YOQ SWIMMING;Lo;0;L;;;;;N;;;;; 169E3;BAMUM LETTER PHASE-E YOQ COVER;Lo;0;L;;;;;N;;;;; 169E4;BAMUM LETTER PHASE-E YUQ;Lo;0;L;;;;;N;;;;; 169E5;BAMUM LETTER PHASE-E YUN;Lo;0;L;;;;;N;;;;; 169E6;BAMUM LETTER PHASE-E KEUX;Lo;0;L;;;;;N;;;;; 169E7;BAMUM LETTER PHASE-E PEUX;Lo;0;L;;;;;N;;;;; 169E8;BAMUM LETTER PHASE-E NJEE EPOCH;Lo;0;L;;;;;N;;;;; 169E9;BAMUM LETTER PHASE-E PUE;Lo;0;L;;;;;N;;;;; 169EA;BAMUM LETTER PHASE-E WUE;Lo;0;L;;;;;N;;;;; 169EB;BAMUM LETTER PHASE-E FEE;Lo;0;L;;;;;N;;;;; 169EC;BAMUM LETTER PHASE-E VEE;Lo;0;L;;;;;N;;;;; 169ED;BAMUM LETTER PHASE-E LU;Lo;0;L;;;;;N;;;;; 169EE;BAMUM LETTER PHASE-E MI;Lo;0;L;;;;;N;;;;; 169EF;BAMUM LETTER PHASE-E REUX;Lo;0;L;;;;;N;;;;; 169F0;BAMUM LETTER PHASE-E RAE;Lo;0;L;;;;;N;;;;; 169F1;BAMUM LETTER PHASE-E NGUAET;Lo;0;L;;;;;N;;;;; 169F2;BAMUM LETTER PHASE-E NGA;Lo;0;L;;;;;N;;;;; 169F3;BAMUM LETTER PHASE-E SHO;Lo;0;L;;;;;N;;;;; 169F4;BAMUM LETTER PHASE-E SHOQ;Lo;0;L;;;;;N;;;;; 169F5;BAMUM LETTER PHASE-E FU REMEDY;Lo;0;L;;;;;N;;;;; 169F6;BAMUM LETTER PHASE-E NA;Lo;0;L;;;;;N;;;;; 169F7;BAMUM LETTER PHASE-E PI;Lo;0;L;;;;;N;;;;; 169F8;BAMUM LETTER PHASE-E LOQ;Lo;0;L;;;;;N;;;;; 169F9;BAMUM LETTER PHASE-E KO;Lo;0;L;;;;;N;;;;; 169FA;BAMUM LETTER PHASE-E MEN;Lo;0;L;;;;;N;;;;; 169FB;BAMUM LETTER PHASE-E MA;Lo;0;L;;;;;N;;;;; 169FC;BAMUM LETTER PHASE-E MAQ;Lo;0;L;;;;;N;;;;; 169FD;BAMUM LETTER PHASE-E TEU;Lo;0;L;;;;;N;;;;; 169FE;BAMUM LETTER PHASE-E KI;Lo;0;L;;;;;N;;;;; 169FF;BAMUM LETTER PHASE-E MON;Lo;0;L;;;;;N;;;;; 16A00;BAMUM LETTER PHASE-E TEN;Lo;0;L;;;;;N;;;;; 16A01;BAMUM LETTER PHASE-E FAQ;Lo;0;L;;;;;N;;;;; 16A02;BAMUM LETTER PHASE-E GHOM;Lo;0;L;;;;;N;;;;; 16A03;BAMUM LETTER PHASE-F KA;Lo;0;L;;;;;N;;;;; 16A04;BAMUM LETTER PHASE-F U;Lo;0;L;;;;;N;;;;; 16A05;BAMUM LETTER PHASE-F KU;Lo;0;L;;;;;N;;;;; 16A06;BAMUM LETTER PHASE-F EE;Lo;0;L;;;;;N;;;;; 16A07;BAMUM LETTER PHASE-F REE;Lo;0;L;;;;;N;;;;; 16A08;BAMUM LETTER PHASE-F TAE;Lo;0;L;;;;;N;;;;; 16A09;BAMUM LETTER PHASE-F NYI;Lo;0;L;;;;;N;;;;; 16A0A;BAMUM LETTER PHASE-F LA;Lo;0;L;;;;;N;;;;; 16A0B;BAMUM LETTER PHASE-F RII;Lo;0;L;;;;;N;;;;; 16A0C;BAMUM LETTER PHASE-F RIEE;Lo;0;L;;;;;N;;;;; 16A0D;BAMUM LETTER PHASE-F MEEEE;Lo;0;L;;;;;N;;;;; 16A0E;BAMUM LETTER PHASE-F TAA;Lo;0;L;;;;;N;;;;; 16A0F;BAMUM LETTER PHASE-F NDAA;Lo;0;L;;;;;N;;;;; 16A10;BAMUM LETTER PHASE-F NJAEM;Lo;0;L;;;;;N;;;;; 16A11;BAMUM LETTER PHASE-F M;Lo;0;L;;;;;N;;;;; 16A12;BAMUM LETTER PHASE-F SUU;Lo;0;L;;;;;N;;;;; 16A13;BAMUM LETTER PHASE-F SHII;Lo;0;L;;;;;N;;;;; 16A14;BAMUM LETTER PHASE-F SI;Lo;0;L;;;;;N;;;;; 16A15;BAMUM LETTER PHASE-F SEUX;Lo;0;L;;;;;N;;;;; 16A16;BAMUM LETTER PHASE-F KYEE;Lo;0;L;;;;;N;;;;; 16A17;BAMUM LETTER PHASE-F KET;Lo;0;L;;;;;N;;;;; 16A18;BAMUM LETTER PHASE-F NUAE;Lo;0;L;;;;;N;;;;; 16A19;BAMUM LETTER PHASE-F NU;Lo;0;L;;;;;N;;;;; 16A1A;BAMUM LETTER PHASE-F NJUAE;Lo;0;L;;;;;N;;;;; 16A1B;BAMUM LETTER PHASE-F YOQ;Lo;0;L;;;;;N;;;;; 16A1C;BAMUM LETTER PHASE-F SHU;Lo;0;L;;;;;N;;;;; 16A1D;BAMUM LETTER PHASE-F YA;Lo;0;L;;;;;N;;;;; 16A1E;BAMUM LETTER PHASE-F NSHA;Lo;0;L;;;;;N;;;;; 16A1F;BAMUM LETTER PHASE-F PEUX;Lo;0;L;;;;;N;;;;; 16A20;BAMUM LETTER PHASE-F NTEE;Lo;0;L;;;;;N;;;;; 16A21;BAMUM LETTER PHASE-F WUE;Lo;0;L;;;;;N;;;;; 16A22;BAMUM LETTER PHASE-F PEE;Lo;0;L;;;;;N;;;;; 16A23;BAMUM LETTER PHASE-F RU;Lo;0;L;;;;;N;;;;; 16A24;BAMUM LETTER PHASE-F NI;Lo;0;L;;;;;N;;;;; 16A25;BAMUM LETTER PHASE-F REUX;Lo;0;L;;;;;N;;;;; 16A26;BAMUM LETTER PHASE-F KEN;Lo;0;L;;;;;N;;;;; 16A27;BAMUM LETTER PHASE-F NGKWAEN;Lo;0;L;;;;;N;;;;; 16A28;BAMUM LETTER PHASE-F NGGA;Lo;0;L;;;;;N;;;;; 16A29;BAMUM LETTER PHASE-F SHO;Lo;0;L;;;;;N;;;;; 16A2A;BAMUM LETTER PHASE-F PUAE;Lo;0;L;;;;;N;;;;; 16A2B;BAMUM LETTER PHASE-F FOM;Lo;0;L;;;;;N;;;;; 16A2C;BAMUM LETTER PHASE-F WA;Lo;0;L;;;;;N;;;;; 16A2D;BAMUM LETTER PHASE-F LI;Lo;0;L;;;;;N;;;;; 16A2E;BAMUM LETTER PHASE-F LOQ;Lo;0;L;;;;;N;;;;; 16A2F;BAMUM LETTER PHASE-F KO;Lo;0;L;;;;;N;;;;; 16A30;BAMUM LETTER PHASE-F MBEN;Lo;0;L;;;;;N;;;;; 16A31;BAMUM LETTER PHASE-F REN;Lo;0;L;;;;;N;;;;; 16A32;BAMUM LETTER PHASE-F MA;Lo;0;L;;;;;N;;;;; 16A33;BAMUM LETTER PHASE-F MO;Lo;0;L;;;;;N;;;;; 16A34;BAMUM LETTER PHASE-F MBAA;Lo;0;L;;;;;N;;;;; 16A35;BAMUM LETTER PHASE-F TET;Lo;0;L;;;;;N;;;;; 16A36;BAMUM LETTER PHASE-F KPA;Lo;0;L;;;;;N;;;;; 16A37;BAMUM LETTER PHASE-F SAMBA;Lo;0;L;;;;;N;;;;; 16A38;BAMUM LETTER PHASE-F VUEQ;Lo;0;L;;;;;N;;;;; 16A40;MRO LETTER TA;Lo;0;L;;;;;N;;;;; 16A41;MRO LETTER NGI;Lo;0;L;;;;;N;;;;; 16A42;MRO LETTER YO;Lo;0;L;;;;;N;;;;; 16A43;MRO LETTER MIM;Lo;0;L;;;;;N;;;;; 16A44;MRO LETTER BA;Lo;0;L;;;;;N;;;;; 16A45;MRO LETTER DA;Lo;0;L;;;;;N;;;;; 16A46;MRO LETTER A;Lo;0;L;;;;;N;;;;; 16A47;MRO LETTER PHI;Lo;0;L;;;;;N;;;;; 16A48;MRO LETTER KHAI;Lo;0;L;;;;;N;;;;; 16A49;MRO LETTER HAO;Lo;0;L;;;;;N;;;;; 16A4A;MRO LETTER DAI;Lo;0;L;;;;;N;;;;; 16A4B;MRO LETTER CHU;Lo;0;L;;;;;N;;;;; 16A4C;MRO LETTER KEAAE;Lo;0;L;;;;;N;;;;; 16A4D;MRO LETTER OL;Lo;0;L;;;;;N;;;;; 16A4E;MRO LETTER MAEM;Lo;0;L;;;;;N;;;;; 16A4F;MRO LETTER NIN;Lo;0;L;;;;;N;;;;; 16A50;MRO LETTER PA;Lo;0;L;;;;;N;;;;; 16A51;MRO LETTER OO;Lo;0;L;;;;;N;;;;; 16A52;MRO LETTER O;Lo;0;L;;;;;N;;;;; 16A53;MRO LETTER RO;Lo;0;L;;;;;N;;;;; 16A54;MRO LETTER SHI;Lo;0;L;;;;;N;;;;; 16A55;MRO LETTER THEA;Lo;0;L;;;;;N;;;;; 16A56;MRO LETTER EA;Lo;0;L;;;;;N;;;;; 16A57;MRO LETTER WA;Lo;0;L;;;;;N;;;;; 16A58;MRO LETTER E;Lo;0;L;;;;;N;;;;; 16A59;MRO LETTER KO;Lo;0;L;;;;;N;;;;; 16A5A;MRO LETTER LAN;Lo;0;L;;;;;N;;;;; 16A5B;MRO LETTER LA;Lo;0;L;;;;;N;;;;; 16A5C;MRO LETTER HAI;Lo;0;L;;;;;N;;;;; 16A5D;MRO LETTER RI;Lo;0;L;;;;;N;;;;; 16A5E;MRO LETTER TEK;Lo;0;L;;;;;N;;;;; 16A60;MRO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 16A61;MRO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 16A62;MRO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 16A63;MRO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 16A64;MRO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 16A65;MRO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 16A66;MRO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 16A67;MRO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 16A68;MRO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 16A69;MRO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 16A6E;MRO DANDA;Po;0;L;;;;;N;;;;; 16A6F;MRO DOUBLE DANDA;Po;0;L;;;;;N;;;;; 16AD0;BASSA VAH LETTER ENNI;Lo;0;L;;;;;N;;;;; 16AD1;BASSA VAH LETTER KA;Lo;0;L;;;;;N;;;;; 16AD2;BASSA VAH LETTER SE;Lo;0;L;;;;;N;;;;; 16AD3;BASSA VAH LETTER FA;Lo;0;L;;;;;N;;;;; 16AD4;BASSA VAH LETTER MBE;Lo;0;L;;;;;N;;;;; 16AD5;BASSA VAH LETTER YIE;Lo;0;L;;;;;N;;;;; 16AD6;BASSA VAH LETTER GAH;Lo;0;L;;;;;N;;;;; 16AD7;BASSA VAH LETTER DHII;Lo;0;L;;;;;N;;;;; 16AD8;BASSA VAH LETTER KPAH;Lo;0;L;;;;;N;;;;; 16AD9;BASSA VAH LETTER JO;Lo;0;L;;;;;N;;;;; 16ADA;BASSA VAH LETTER HWAH;Lo;0;L;;;;;N;;;;; 16ADB;BASSA VAH LETTER WA;Lo;0;L;;;;;N;;;;; 16ADC;BASSA VAH LETTER ZO;Lo;0;L;;;;;N;;;;; 16ADD;BASSA VAH LETTER GBU;Lo;0;L;;;;;N;;;;; 16ADE;BASSA VAH LETTER DO;Lo;0;L;;;;;N;;;;; 16ADF;BASSA VAH LETTER CE;Lo;0;L;;;;;N;;;;; 16AE0;BASSA VAH LETTER UWU;Lo;0;L;;;;;N;;;;; 16AE1;BASSA VAH LETTER TO;Lo;0;L;;;;;N;;;;; 16AE2;BASSA VAH LETTER BA;Lo;0;L;;;;;N;;;;; 16AE3;BASSA VAH LETTER VU;Lo;0;L;;;;;N;;;;; 16AE4;BASSA VAH LETTER YEIN;Lo;0;L;;;;;N;;;;; 16AE5;BASSA VAH LETTER PA;Lo;0;L;;;;;N;;;;; 16AE6;BASSA VAH LETTER WADDA;Lo;0;L;;;;;N;;;;; 16AE7;BASSA VAH LETTER A;Lo;0;L;;;;;N;;;;; 16AE8;BASSA VAH LETTER O;Lo;0;L;;;;;N;;;;; 16AE9;BASSA VAH LETTER OO;Lo;0;L;;;;;N;;;;; 16AEA;BASSA VAH LETTER U;Lo;0;L;;;;;N;;;;; 16AEB;BASSA VAH LETTER EE;Lo;0;L;;;;;N;;;;; 16AEC;BASSA VAH LETTER E;Lo;0;L;;;;;N;;;;; 16AED;BASSA VAH LETTER I;Lo;0;L;;;;;N;;;;; 16AF0;BASSA VAH COMBINING HIGH TONE;Mn;1;NSM;;;;;N;;;;; 16AF1;BASSA VAH COMBINING LOW TONE;Mn;1;NSM;;;;;N;;;;; 16AF2;BASSA VAH COMBINING MID TONE;Mn;1;NSM;;;;;N;;;;; 16AF3;BASSA VAH COMBINING LOW-MID TONE;Mn;1;NSM;;;;;N;;;;; 16AF4;BASSA VAH COMBINING HIGH-LOW TONE;Mn;1;NSM;;;;;N;;;;; 16AF5;BASSA VAH FULL STOP;Po;0;L;;;;;N;;;;; 16B00;PAHAWH HMONG VOWEL KEEB;Lo;0;L;;;;;N;;;;; 16B01;PAHAWH HMONG VOWEL KEEV;Lo;0;L;;;;;N;;;;; 16B02;PAHAWH HMONG VOWEL KIB;Lo;0;L;;;;;N;;;;; 16B03;PAHAWH HMONG VOWEL KIV;Lo;0;L;;;;;N;;;;; 16B04;PAHAWH HMONG VOWEL KAUB;Lo;0;L;;;;;N;;;;; 16B05;PAHAWH HMONG VOWEL KAUV;Lo;0;L;;;;;N;;;;; 16B06;PAHAWH HMONG VOWEL KUB;Lo;0;L;;;;;N;;;;; 16B07;PAHAWH HMONG VOWEL KUV;Lo;0;L;;;;;N;;;;; 16B08;PAHAWH HMONG VOWEL KEB;Lo;0;L;;;;;N;;;;; 16B09;PAHAWH HMONG VOWEL KEV;Lo;0;L;;;;;N;;;;; 16B0A;PAHAWH HMONG VOWEL KAIB;Lo;0;L;;;;;N;;;;; 16B0B;PAHAWH HMONG VOWEL KAIV;Lo;0;L;;;;;N;;;;; 16B0C;PAHAWH HMONG VOWEL KOOB;Lo;0;L;;;;;N;;;;; 16B0D;PAHAWH HMONG VOWEL KOOV;Lo;0;L;;;;;N;;;;; 16B0E;PAHAWH HMONG VOWEL KAWB;Lo;0;L;;;;;N;;;;; 16B0F;PAHAWH HMONG VOWEL KAWV;Lo;0;L;;;;;N;;;;; 16B10;PAHAWH HMONG VOWEL KUAB;Lo;0;L;;;;;N;;;;; 16B11;PAHAWH HMONG VOWEL KUAV;Lo;0;L;;;;;N;;;;; 16B12;PAHAWH HMONG VOWEL KOB;Lo;0;L;;;;;N;;;;; 16B13;PAHAWH HMONG VOWEL KOV;Lo;0;L;;;;;N;;;;; 16B14;PAHAWH HMONG VOWEL KIAB;Lo;0;L;;;;;N;;;;; 16B15;PAHAWH HMONG VOWEL KIAV;Lo;0;L;;;;;N;;;;; 16B16;PAHAWH HMONG VOWEL KAB;Lo;0;L;;;;;N;;;;; 16B17;PAHAWH HMONG VOWEL KAV;Lo;0;L;;;;;N;;;;; 16B18;PAHAWH HMONG VOWEL KWB;Lo;0;L;;;;;N;;;;; 16B19;PAHAWH HMONG VOWEL KWV;Lo;0;L;;;;;N;;;;; 16B1A;PAHAWH HMONG VOWEL KAAB;Lo;0;L;;;;;N;;;;; 16B1B;PAHAWH HMONG VOWEL KAAV;Lo;0;L;;;;;N;;;;; 16B1C;PAHAWH HMONG CONSONANT VAU;Lo;0;L;;;;;N;;;;; 16B1D;PAHAWH HMONG CONSONANT NTSAU;Lo;0;L;;;;;N;;;;; 16B1E;PAHAWH HMONG CONSONANT LAU;Lo;0;L;;;;;N;;;;; 16B1F;PAHAWH HMONG CONSONANT HAU;Lo;0;L;;;;;N;;;;; 16B20;PAHAWH HMONG CONSONANT NLAU;Lo;0;L;;;;;N;;;;; 16B21;PAHAWH HMONG CONSONANT RAU;Lo;0;L;;;;;N;;;;; 16B22;PAHAWH HMONG CONSONANT NKAU;Lo;0;L;;;;;N;;;;; 16B23;PAHAWH HMONG CONSONANT QHAU;Lo;0;L;;;;;N;;;;; 16B24;PAHAWH HMONG CONSONANT YAU;Lo;0;L;;;;;N;;;;; 16B25;PAHAWH HMONG CONSONANT HLAU;Lo;0;L;;;;;N;;;;; 16B26;PAHAWH HMONG CONSONANT MAU;Lo;0;L;;;;;N;;;;; 16B27;PAHAWH HMONG CONSONANT CHAU;Lo;0;L;;;;;N;;;;; 16B28;PAHAWH HMONG CONSONANT NCHAU;Lo;0;L;;;;;N;;;;; 16B29;PAHAWH HMONG CONSONANT HNAU;Lo;0;L;;;;;N;;;;; 16B2A;PAHAWH HMONG CONSONANT PLHAU;Lo;0;L;;;;;N;;;;; 16B2B;PAHAWH HMONG CONSONANT NTHAU;Lo;0;L;;;;;N;;;;; 16B2C;PAHAWH HMONG CONSONANT NAU;Lo;0;L;;;;;N;;;;; 16B2D;PAHAWH HMONG CONSONANT AU;Lo;0;L;;;;;N;;;;; 16B2E;PAHAWH HMONG CONSONANT XAU;Lo;0;L;;;;;N;;;;; 16B2F;PAHAWH HMONG CONSONANT CAU;Lo;0;L;;;;;N;;;;; 16B30;PAHAWH HMONG MARK CIM TUB;Mn;230;NSM;;;;;N;;;;; 16B31;PAHAWH HMONG MARK CIM SO;Mn;230;NSM;;;;;N;;;;; 16B32;PAHAWH HMONG MARK CIM KES;Mn;230;NSM;;;;;N;;;;; 16B33;PAHAWH HMONG MARK CIM KHAV;Mn;230;NSM;;;;;N;;;;; 16B34;PAHAWH HMONG MARK CIM SUAM;Mn;230;NSM;;;;;N;;;;; 16B35;PAHAWH HMONG MARK CIM HOM;Mn;230;NSM;;;;;N;;;;; 16B36;PAHAWH HMONG MARK CIM TAUM;Mn;230;NSM;;;;;N;;;;; 16B37;PAHAWH HMONG SIGN VOS THOM;Po;0;L;;;;;N;;;;; 16B38;PAHAWH HMONG SIGN VOS TSHAB CEEB;Po;0;L;;;;;N;;;;; 16B39;PAHAWH HMONG SIGN CIM CHEEM;Po;0;L;;;;;N;;;;; 16B3A;PAHAWH HMONG SIGN VOS THIAB;Po;0;L;;;;;N;;;;; 16B3B;PAHAWH HMONG SIGN VOS FEEM;Po;0;L;;;;;N;;;;; 16B3C;PAHAWH HMONG SIGN XYEEM NTXIV;So;0;L;;;;;N;;;;; 16B3D;PAHAWH HMONG SIGN XYEEM RHO;So;0;L;;;;;N;;;;; 16B3E;PAHAWH HMONG SIGN XYEEM TOV;So;0;L;;;;;N;;;;; 16B3F;PAHAWH HMONG SIGN XYEEM FAIB;So;0;L;;;;;N;;;;; 16B40;PAHAWH HMONG SIGN VOS SEEV;Lm;0;L;;;;;N;;;;; 16B41;PAHAWH HMONG SIGN MEEJ SUAB;Lm;0;L;;;;;N;;;;; 16B42;PAHAWH HMONG SIGN VOS NRUA;Lm;0;L;;;;;N;;;;; 16B43;PAHAWH HMONG SIGN IB YAM;Lm;0;L;;;;;N;;;;; 16B44;PAHAWH HMONG SIGN XAUS;Po;0;L;;;;;N;;;;; 16B45;PAHAWH HMONG SIGN CIM TSOV ROG;So;0;L;;;;;N;;;;; 16B50;PAHAWH HMONG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 16B51;PAHAWH HMONG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 16B52;PAHAWH HMONG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; 16B53;PAHAWH HMONG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; 16B54;PAHAWH HMONG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; 16B55;PAHAWH HMONG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; 16B56;PAHAWH HMONG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; 16B57;PAHAWH HMONG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 16B58;PAHAWH HMONG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 16B59;PAHAWH HMONG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 16B5B;PAHAWH HMONG NUMBER TENS;No;0;L;;;;10;N;;;;; 16B5C;PAHAWH HMONG NUMBER HUNDREDS;No;0;L;;;;100;N;;;;; 16B5D;PAHAWH HMONG NUMBER TEN THOUSANDS;No;0;L;;;;10000;N;;;;; 16B5E;PAHAWH HMONG NUMBER MILLIONS;No;0;L;;;;1000000;N;;;;; 16B5F;PAHAWH HMONG NUMBER HUNDRED MILLIONS;No;0;L;;;;100000000;N;;;;; 16B60;PAHAWH HMONG NUMBER TEN BILLIONS;No;0;L;;;;10000000000;N;;;;; 16B61;PAHAWH HMONG NUMBER TRILLIONS;No;0;L;;;;1000000000000;N;;;;; 16B63;PAHAWH HMONG SIGN VOS LUB;Lo;0;L;;;;;N;;;;; 16B64;PAHAWH HMONG SIGN XYOO;Lo;0;L;;;;;N;;;;; 16B65;PAHAWH HMONG SIGN HLI;Lo;0;L;;;;;N;;;;; 16B66;PAHAWH HMONG SIGN THIRD-STAGE HLI;Lo;0;L;;;;;N;;;;; 16B67;PAHAWH HMONG SIGN ZWJ THAJ;Lo;0;L;;;;;N;;;;; 16B68;PAHAWH HMONG SIGN HNUB;Lo;0;L;;;;;N;;;;; 16B69;PAHAWH HMONG SIGN NQIG;Lo;0;L;;;;;N;;;;; 16B6A;PAHAWH HMONG SIGN XIAB;Lo;0;L;;;;;N;;;;; 16B6B;PAHAWH HMONG SIGN NTUJ;Lo;0;L;;;;;N;;;;; 16B6C;PAHAWH HMONG SIGN AV;Lo;0;L;;;;;N;;;;; 16B6D;PAHAWH HMONG SIGN TXHEEJ CEEV;Lo;0;L;;;;;N;;;;; 16B6E;PAHAWH HMONG SIGN MEEJ TSEEB;Lo;0;L;;;;;N;;;;; 16B6F;PAHAWH HMONG SIGN TAU;Lo;0;L;;;;;N;;;;; 16B70;PAHAWH HMONG SIGN LOS;Lo;0;L;;;;;N;;;;; 16B71;PAHAWH HMONG SIGN MUS;Lo;0;L;;;;;N;;;;; 16B72;PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG;Lo;0;L;;;;;N;;;;; 16B73;PAHAWH HMONG SIGN CIM CUAM TSHOOJ;Lo;0;L;;;;;N;;;;; 16B74;PAHAWH HMONG SIGN CIM TXWV;Lo;0;L;;;;;N;;;;; 16B75;PAHAWH HMONG SIGN CIM TXWV CHWV;Lo;0;L;;;;;N;;;;; 16B76;PAHAWH HMONG SIGN CIM PUB DAWB;Lo;0;L;;;;;N;;;;; 16B77;PAHAWH HMONG SIGN CIM NRES TOS;Lo;0;L;;;;;N;;;;; 16B7D;PAHAWH HMONG CLAN SIGN TSHEEJ;Lo;0;L;;;;;N;;;;; 16B7E;PAHAWH HMONG CLAN SIGN YEEG;Lo;0;L;;;;;N;;;;; 16B7F;PAHAWH HMONG CLAN SIGN LIS;Lo;0;L;;;;;N;;;;; 16B80;PAHAWH HMONG CLAN SIGN LAUJ;Lo;0;L;;;;;N;;;;; 16B81;PAHAWH HMONG CLAN SIGN XYOOJ;Lo;0;L;;;;;N;;;;; 16B82;PAHAWH HMONG CLAN SIGN KOO;Lo;0;L;;;;;N;;;;; 16B83;PAHAWH HMONG CLAN SIGN HAWJ;Lo;0;L;;;;;N;;;;; 16B84;PAHAWH HMONG CLAN SIGN MUAS;Lo;0;L;;;;;N;;;;; 16B85;PAHAWH HMONG CLAN SIGN THOJ;Lo;0;L;;;;;N;;;;; 16B86;PAHAWH HMONG CLAN SIGN TSAB;Lo;0;L;;;;;N;;;;; 16B87;PAHAWH HMONG CLAN SIGN PHAB;Lo;0;L;;;;;N;;;;; 16B88;PAHAWH HMONG CLAN SIGN KHAB;Lo;0;L;;;;;N;;;;; 16B89;PAHAWH HMONG CLAN SIGN HAM;Lo;0;L;;;;;N;;;;; 16B8A;PAHAWH HMONG CLAN SIGN VAJ;Lo;0;L;;;;;N;;;;; 16B8B;PAHAWH HMONG CLAN SIGN FAJ;Lo;0;L;;;;;N;;;;; 16B8C;PAHAWH HMONG CLAN SIGN YAJ;Lo;0;L;;;;;N;;;;; 16B8D;PAHAWH HMONG CLAN SIGN TSWB;Lo;0;L;;;;;N;;;;; 16B8E;PAHAWH HMONG CLAN SIGN KWM;Lo;0;L;;;;;N;;;;; 16B8F;PAHAWH HMONG CLAN SIGN VWJ;Lo;0;L;;;;;N;;;;; 16F00;MIAO LETTER PA;Lo;0;L;;;;;N;;;;; 16F01;MIAO LETTER BA;Lo;0;L;;;;;N;;;;; 16F02;MIAO LETTER YI PA;Lo;0;L;;;;;N;;;;; 16F03;MIAO LETTER PLA;Lo;0;L;;;;;N;;;;; 16F04;MIAO LETTER MA;Lo;0;L;;;;;N;;;;; 16F05;MIAO LETTER MHA;Lo;0;L;;;;;N;;;;; 16F06;MIAO LETTER ARCHAIC MA;Lo;0;L;;;;;N;;;;; 16F07;MIAO LETTER FA;Lo;0;L;;;;;N;;;;; 16F08;MIAO LETTER VA;Lo;0;L;;;;;N;;;;; 16F09;MIAO LETTER VFA;Lo;0;L;;;;;N;;;;; 16F0A;MIAO LETTER TA;Lo;0;L;;;;;N;;;;; 16F0B;MIAO LETTER DA;Lo;0;L;;;;;N;;;;; 16F0C;MIAO LETTER YI TTA;Lo;0;L;;;;;N;;;;; 16F0D;MIAO LETTER YI TA;Lo;0;L;;;;;N;;;;; 16F0E;MIAO LETTER TTA;Lo;0;L;;;;;N;;;;; 16F0F;MIAO LETTER DDA;Lo;0;L;;;;;N;;;;; 16F10;MIAO LETTER NA;Lo;0;L;;;;;N;;;;; 16F11;MIAO LETTER NHA;Lo;0;L;;;;;N;;;;; 16F12;MIAO LETTER YI NNA;Lo;0;L;;;;;N;;;;; 16F13;MIAO LETTER ARCHAIC NA;Lo;0;L;;;;;N;;;;; 16F14;MIAO LETTER NNA;Lo;0;L;;;;;N;;;;; 16F15;MIAO LETTER NNHA;Lo;0;L;;;;;N;;;;; 16F16;MIAO LETTER LA;Lo;0;L;;;;;N;;;;; 16F17;MIAO LETTER LYA;Lo;0;L;;;;;N;;;;; 16F18;MIAO LETTER LHA;Lo;0;L;;;;;N;;;;; 16F19;MIAO LETTER LHYA;Lo;0;L;;;;;N;;;;; 16F1A;MIAO LETTER TLHA;Lo;0;L;;;;;N;;;;; 16F1B;MIAO LETTER DLHA;Lo;0;L;;;;;N;;;;; 16F1C;MIAO LETTER TLHYA;Lo;0;L;;;;;N;;;;; 16F1D;MIAO LETTER DLHYA;Lo;0;L;;;;;N;;;;; 16F1E;MIAO LETTER KA;Lo;0;L;;;;;N;;;;; 16F1F;MIAO LETTER GA;Lo;0;L;;;;;N;;;;; 16F20;MIAO LETTER YI KA;Lo;0;L;;;;;N;;;;; 16F21;MIAO LETTER QA;Lo;0;L;;;;;N;;;;; 16F22;MIAO LETTER QGA;Lo;0;L;;;;;N;;;;; 16F23;MIAO LETTER NGA;Lo;0;L;;;;;N;;;;; 16F24;MIAO LETTER NGHA;Lo;0;L;;;;;N;;;;; 16F25;MIAO LETTER ARCHAIC NGA;Lo;0;L;;;;;N;;;;; 16F26;MIAO LETTER HA;Lo;0;L;;;;;N;;;;; 16F27;MIAO LETTER XA;Lo;0;L;;;;;N;;;;; 16F28;MIAO LETTER GHA;Lo;0;L;;;;;N;;;;; 16F29;MIAO LETTER GHHA;Lo;0;L;;;;;N;;;;; 16F2A;MIAO LETTER TSSA;Lo;0;L;;;;;N;;;;; 16F2B;MIAO LETTER DZZA;Lo;0;L;;;;;N;;;;; 16F2C;MIAO LETTER NYA;Lo;0;L;;;;;N;;;;; 16F2D;MIAO LETTER NYHA;Lo;0;L;;;;;N;;;;; 16F2E;MIAO LETTER TSHA;Lo;0;L;;;;;N;;;;; 16F2F;MIAO LETTER DZHA;Lo;0;L;;;;;N;;;;; 16F30;MIAO LETTER YI TSHA;Lo;0;L;;;;;N;;;;; 16F31;MIAO LETTER YI DZHA;Lo;0;L;;;;;N;;;;; 16F32;MIAO LETTER REFORMED TSHA;Lo;0;L;;;;;N;;;;; 16F33;MIAO LETTER SHA;Lo;0;L;;;;;N;;;;; 16F34;MIAO LETTER SSA;Lo;0;L;;;;;N;;;;; 16F35;MIAO LETTER ZHA;Lo;0;L;;;;;N;;;;; 16F36;MIAO LETTER ZSHA;Lo;0;L;;;;;N;;;;; 16F37;MIAO LETTER TSA;Lo;0;L;;;;;N;;;;; 16F38;MIAO LETTER DZA;Lo;0;L;;;;;N;;;;; 16F39;MIAO LETTER YI TSA;Lo;0;L;;;;;N;;;;; 16F3A;MIAO LETTER SA;Lo;0;L;;;;;N;;;;; 16F3B;MIAO LETTER ZA;Lo;0;L;;;;;N;;;;; 16F3C;MIAO LETTER ZSA;Lo;0;L;;;;;N;;;;; 16F3D;MIAO LETTER ZZA;Lo;0;L;;;;;N;;;;; 16F3E;MIAO LETTER ZZSA;Lo;0;L;;;;;N;;;;; 16F3F;MIAO LETTER ARCHAIC ZZA;Lo;0;L;;;;;N;;;;; 16F40;MIAO LETTER ZZYA;Lo;0;L;;;;;N;;;;; 16F41;MIAO LETTER ZZSYA;Lo;0;L;;;;;N;;;;; 16F42;MIAO LETTER WA;Lo;0;L;;;;;N;;;;; 16F43;MIAO LETTER AH;Lo;0;L;;;;;N;;;;; 16F44;MIAO LETTER HHA;Lo;0;L;;;;;N;;;;; 16F50;MIAO LETTER NASALIZATION;Lo;0;L;;;;;N;;;;; 16F51;MIAO SIGN ASPIRATION;Mc;0;L;;;;;N;;;;; 16F52;MIAO SIGN REFORMED VOICING;Mc;0;L;;;;;N;;;;; 16F53;MIAO SIGN REFORMED ASPIRATION;Mc;0;L;;;;;N;;;;; 16F54;MIAO VOWEL SIGN A;Mc;0;L;;;;;N;;;;; 16F55;MIAO VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 16F56;MIAO VOWEL SIGN AHH;Mc;0;L;;;;;N;;;;; 16F57;MIAO VOWEL SIGN AN;Mc;0;L;;;;;N;;;;; 16F58;MIAO VOWEL SIGN ANG;Mc;0;L;;;;;N;;;;; 16F59;MIAO VOWEL SIGN O;Mc;0;L;;;;;N;;;;; 16F5A;MIAO VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; 16F5B;MIAO VOWEL SIGN WO;Mc;0;L;;;;;N;;;;; 16F5C;MIAO VOWEL SIGN W;Mc;0;L;;;;;N;;;;; 16F5D;MIAO VOWEL SIGN E;Mc;0;L;;;;;N;;;;; 16F5E;MIAO VOWEL SIGN EN;Mc;0;L;;;;;N;;;;; 16F5F;MIAO VOWEL SIGN ENG;Mc;0;L;;;;;N;;;;; 16F60;MIAO VOWEL SIGN OEY;Mc;0;L;;;;;N;;;;; 16F61;MIAO VOWEL SIGN I;Mc;0;L;;;;;N;;;;; 16F62;MIAO VOWEL SIGN IA;Mc;0;L;;;;;N;;;;; 16F63;MIAO VOWEL SIGN IAN;Mc;0;L;;;;;N;;;;; 16F64;MIAO VOWEL SIGN IANG;Mc;0;L;;;;;N;;;;; 16F65;MIAO VOWEL SIGN IO;Mc;0;L;;;;;N;;;;; 16F66;MIAO VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; 16F67;MIAO VOWEL SIGN II;Mc;0;L;;;;;N;;;;; 16F68;MIAO VOWEL SIGN IU;Mc;0;L;;;;;N;;;;; 16F69;MIAO VOWEL SIGN ING;Mc;0;L;;;;;N;;;;; 16F6A;MIAO VOWEL SIGN U;Mc;0;L;;;;;N;;;;; 16F6B;MIAO VOWEL SIGN UA;Mc;0;L;;;;;N;;;;; 16F6C;MIAO VOWEL SIGN UAN;Mc;0;L;;;;;N;;;;; 16F6D;MIAO VOWEL SIGN UANG;Mc;0;L;;;;;N;;;;; 16F6E;MIAO VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; 16F6F;MIAO VOWEL SIGN UEI;Mc;0;L;;;;;N;;;;; 16F70;MIAO VOWEL SIGN UNG;Mc;0;L;;;;;N;;;;; 16F71;MIAO VOWEL SIGN Y;Mc;0;L;;;;;N;;;;; 16F72;MIAO VOWEL SIGN YI;Mc;0;L;;;;;N;;;;; 16F73;MIAO VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; 16F74;MIAO VOWEL SIGN AEE;Mc;0;L;;;;;N;;;;; 16F75;MIAO VOWEL SIGN ERR;Mc;0;L;;;;;N;;;;; 16F76;MIAO VOWEL SIGN ROUNDED ERR;Mc;0;L;;;;;N;;;;; 16F77;MIAO VOWEL SIGN ER;Mc;0;L;;;;;N;;;;; 16F78;MIAO VOWEL SIGN ROUNDED ER;Mc;0;L;;;;;N;;;;; 16F79;MIAO VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; 16F7A;MIAO VOWEL SIGN EI;Mc;0;L;;;;;N;;;;; 16F7B;MIAO VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; 16F7C;MIAO VOWEL SIGN OU;Mc;0;L;;;;;N;;;;; 16F7D;MIAO VOWEL SIGN N;Mc;0;L;;;;;N;;;;; 16F7E;MIAO VOWEL SIGN NG;Mc;0;L;;;;;N;;;;; 16F8F;MIAO TONE RIGHT;Mn;0;NSM;;;;;N;;;;; 16F90;MIAO TONE TOP RIGHT;Mn;0;NSM;;;;;N;;;;; 16F91;MIAO TONE ABOVE;Mn;0;NSM;;;;;N;;;;; 16F92;MIAO TONE BELOW;Mn;0;NSM;;;;;N;;;;; 16F93;MIAO LETTER TONE-2;Lm;0;L;;;;;N;;;;; 16F94;MIAO LETTER TONE-3;Lm;0;L;;;;;N;;;;; 16F95;MIAO LETTER TONE-4;Lm;0;L;;;;;N;;;;; 16F96;MIAO LETTER TONE-5;Lm;0;L;;;;;N;;;;; 16F97;MIAO LETTER TONE-6;Lm;0;L;;;;;N;;;;; 16F98;MIAO LETTER TONE-7;Lm;0;L;;;;;N;;;;; 16F99;MIAO LETTER TONE-8;Lm;0;L;;;;;N;;;;; 16F9A;MIAO LETTER REFORMED TONE-1;Lm;0;L;;;;;N;;;;; 16F9B;MIAO LETTER REFORMED TONE-2;Lm;0;L;;;;;N;;;;; 16F9C;MIAO LETTER REFORMED TONE-4;Lm;0;L;;;;;N;;;;; 16F9D;MIAO LETTER REFORMED TONE-5;Lm;0;L;;;;;N;;;;; 16F9E;MIAO LETTER REFORMED TONE-6;Lm;0;L;;;;;N;;;;; 16F9F;MIAO LETTER REFORMED TONE-8;Lm;0;L;;;;;N;;;;; 16FE0;TANGUT ITERATION MARK;Lm;0;L;;;;;N;;;;; 17000;<Tangut Ideograph, First>;Lo;0;L;;;;;N;;;;; 187EC;<Tangut Ideograph, Last>;Lo;0;L;;;;;N;;;;; 18800;TANGUT COMPONENT-001;Lo;0;L;;;;;N;;;;; 18801;TANGUT COMPONENT-002;Lo;0;L;;;;;N;;;;; 18802;TANGUT COMPONENT-003;Lo;0;L;;;;;N;;;;; 18803;TANGUT COMPONENT-004;Lo;0;L;;;;;N;;;;; 18804;TANGUT COMPONENT-005;Lo;0;L;;;;;N;;;;; 18805;TANGUT COMPONENT-006;Lo;0;L;;;;;N;;;;; 18806;TANGUT COMPONENT-007;Lo;0;L;;;;;N;;;;; 18807;TANGUT COMPONENT-008;Lo;0;L;;;;;N;;;;; 18808;TANGUT COMPONENT-009;Lo;0;L;;;;;N;;;;; 18809;TANGUT COMPONENT-010;Lo;0;L;;;;;N;;;;; 1880A;TANGUT COMPONENT-011;Lo;0;L;;;;;N;;;;; 1880B;TANGUT COMPONENT-012;Lo;0;L;;;;;N;;;;; 1880C;TANGUT COMPONENT-013;Lo;0;L;;;;;N;;;;; 1880D;TANGUT COMPONENT-014;Lo;0;L;;;;;N;;;;; 1880E;TANGUT COMPONENT-015;Lo;0;L;;;;;N;;;;; 1880F;TANGUT COMPONENT-016;Lo;0;L;;;;;N;;;;; 18810;TANGUT COMPONENT-017;Lo;0;L;;;;;N;;;;; 18811;TANGUT COMPONENT-018;Lo;0;L;;;;;N;;;;; 18812;TANGUT COMPONENT-019;Lo;0;L;;;;;N;;;;; 18813;TANGUT COMPONENT-020;Lo;0;L;;;;;N;;;;; 18814;TANGUT COMPONENT-021;Lo;0;L;;;;;N;;;;; 18815;TANGUT COMPONENT-022;Lo;0;L;;;;;N;;;;; 18816;TANGUT COMPONENT-023;Lo;0;L;;;;;N;;;;; 18817;TANGUT COMPONENT-024;Lo;0;L;;;;;N;;;;; 18818;TANGUT COMPONENT-025;Lo;0;L;;;;;N;;;;; 18819;TANGUT COMPONENT-026;Lo;0;L;;;;;N;;;;; 1881A;TANGUT COMPONENT-027;Lo;0;L;;;;;N;;;;; 1881B;TANGUT COMPONENT-028;Lo;0;L;;;;;N;;;;; 1881C;TANGUT COMPONENT-029;Lo;0;L;;;;;N;;;;; 1881D;TANGUT COMPONENT-030;Lo;0;L;;;;;N;;;;; 1881E;TANGUT COMPONENT-031;Lo;0;L;;;;;N;;;;; 1881F;TANGUT COMPONENT-032;Lo;0;L;;;;;N;;;;; 18820;TANGUT COMPONENT-033;Lo;0;L;;;;;N;;;;; 18821;TANGUT COMPONENT-034;Lo;0;L;;;;;N;;;;; 18822;TANGUT COMPONENT-035;Lo;0;L;;;;;N;;;;; 18823;TANGUT COMPONENT-036;Lo;0;L;;;;;N;;;;; 18824;TANGUT COMPONENT-037;Lo;0;L;;;;;N;;;;; 18825;TANGUT COMPONENT-038;Lo;0;L;;;;;N;;;;; 18826;TANGUT COMPONENT-039;Lo;0;L;;;;;N;;;;; 18827;TANGUT COMPONENT-040;Lo;0;L;;;;;N;;;;; 18828;TANGUT COMPONENT-041;Lo;0;L;;;;;N;;;;; 18829;TANGUT COMPONENT-042;Lo;0;L;;;;;N;;;;; 1882A;TANGUT COMPONENT-043;Lo;0;L;;;;;N;;;;; 1882B;TANGUT COMPONENT-044;Lo;0;L;;;;;N;;;;; 1882C;TANGUT COMPONENT-045;Lo;0;L;;;;;N;;;;; 1882D;TANGUT COMPONENT-046;Lo;0;L;;;;;N;;;;; 1882E;TANGUT COMPONENT-047;Lo;0;L;;;;;N;;;;; 1882F;TANGUT COMPONENT-048;Lo;0;L;;;;;N;;;;; 18830;TANGUT COMPONENT-049;Lo;0;L;;;;;N;;;;; 18831;TANGUT COMPONENT-050;Lo;0;L;;;;;N;;;;; 18832;TANGUT COMPONENT-051;Lo;0;L;;;;;N;;;;; 18833;TANGUT COMPONENT-052;Lo;0;L;;;;;N;;;;; 18834;TANGUT COMPONENT-053;Lo;0;L;;;;;N;;;;; 18835;TANGUT COMPONENT-054;Lo;0;L;;;;;N;;;;; 18836;TANGUT COMPONENT-055;Lo;0;L;;;;;N;;;;; 18837;TANGUT COMPONENT-056;Lo;0;L;;;;;N;;;;; 18838;TANGUT COMPONENT-057;Lo;0;L;;;;;N;;;;; 18839;TANGUT COMPONENT-058;Lo;0;L;;;;;N;;;;; 1883A;TANGUT COMPONENT-059;Lo;0;L;;;;;N;;;;; 1883B;TANGUT COMPONENT-060;Lo;0;L;;;;;N;;;;; 1883C;TANGUT COMPONENT-061;Lo;0;L;;;;;N;;;;; 1883D;TANGUT COMPONENT-062;Lo;0;L;;;;;N;;;;; 1883E;TANGUT COMPONENT-063;Lo;0;L;;;;;N;;;;; 1883F;TANGUT COMPONENT-064;Lo;0;L;;;;;N;;;;; 18840;TANGUT COMPONENT-065;Lo;0;L;;;;;N;;;;; 18841;TANGUT COMPONENT-066;Lo;0;L;;;;;N;;;;; 18842;TANGUT COMPONENT-067;Lo;0;L;;;;;N;;;;; 18843;TANGUT COMPONENT-068;Lo;0;L;;;;;N;;;;; 18844;TANGUT COMPONENT-069;Lo;0;L;;;;;N;;;;; 18845;TANGUT COMPONENT-070;Lo;0;L;;;;;N;;;;; 18846;TANGUT COMPONENT-071;Lo;0;L;;;;;N;;;;; 18847;TANGUT COMPONENT-072;Lo;0;L;;;;;N;;;;; 18848;TANGUT COMPONENT-073;Lo;0;L;;;;;N;;;;; 18849;TANGUT COMPONENT-074;Lo;0;L;;;;;N;;;;; 1884A;TANGUT COMPONENT-075;Lo;0;L;;;;;N;;;;; 1884B;TANGUT COMPONENT-076;Lo;0;L;;;;;N;;;;; 1884C;TANGUT COMPONENT-077;Lo;0;L;;;;;N;;;;; 1884D;TANGUT COMPONENT-078;Lo;0;L;;;;;N;;;;; 1884E;TANGUT COMPONENT-079;Lo;0;L;;;;;N;;;;; 1884F;TANGUT COMPONENT-080;Lo;0;L;;;;;N;;;;; 18850;TANGUT COMPONENT-081;Lo;0;L;;;;;N;;;;; 18851;TANGUT COMPONENT-082;Lo;0;L;;;;;N;;;;; 18852;TANGUT COMPONENT-083;Lo;0;L;;;;;N;;;;; 18853;TANGUT COMPONENT-084;Lo;0;L;;;;;N;;;;; 18854;TANGUT COMPONENT-085;Lo;0;L;;;;;N;;;;; 18855;TANGUT COMPONENT-086;Lo;0;L;;;;;N;;;;; 18856;TANGUT COMPONENT-087;Lo;0;L;;;;;N;;;;; 18857;TANGUT COMPONENT-088;Lo;0;L;;;;;N;;;;; 18858;TANGUT COMPONENT-089;Lo;0;L;;;;;N;;;;; 18859;TANGUT COMPONENT-090;Lo;0;L;;;;;N;;;;; 1885A;TANGUT COMPONENT-091;Lo;0;L;;;;;N;;;;; 1885B;TANGUT COMPONENT-092;Lo;0;L;;;;;N;;;;; 1885C;TANGUT COMPONENT-093;Lo;0;L;;;;;N;;;;; 1885D;TANGUT COMPONENT-094;Lo;0;L;;;;;N;;;;; 1885E;TANGUT COMPONENT-095;Lo;0;L;;;;;N;;;;; 1885F;TANGUT COMPONENT-096;Lo;0;L;;;;;N;;;;; 18860;TANGUT COMPONENT-097;Lo;0;L;;;;;N;;;;; 18861;TANGUT COMPONENT-098;Lo;0;L;;;;;N;;;;; 18862;TANGUT COMPONENT-099;Lo;0;L;;;;;N;;;;; 18863;TANGUT COMPONENT-100;Lo;0;L;;;;;N;;;;; 18864;TANGUT COMPONENT-101;Lo;0;L;;;;;N;;;;; 18865;TANGUT COMPONENT-102;Lo;0;L;;;;;N;;;;; 18866;TANGUT COMPONENT-103;Lo;0;L;;;;;N;;;;; 18867;TANGUT COMPONENT-104;Lo;0;L;;;;;N;;;;; 18868;TANGUT COMPONENT-105;Lo;0;L;;;;;N;;;;; 18869;TANGUT COMPONENT-106;Lo;0;L;;;;;N;;;;; 1886A;TANGUT COMPONENT-107;Lo;0;L;;;;;N;;;;; 1886B;TANGUT COMPONENT-108;Lo;0;L;;;;;N;;;;; 1886C;TANGUT COMPONENT-109;Lo;0;L;;;;;N;;;;; 1886D;TANGUT COMPONENT-110;Lo;0;L;;;;;N;;;;; 1886E;TANGUT COMPONENT-111;Lo;0;L;;;;;N;;;;; 1886F;TANGUT COMPONENT-112;Lo;0;L;;;;;N;;;;; 18870;TANGUT COMPONENT-113;Lo;0;L;;;;;N;;;;; 18871;TANGUT COMPONENT-114;Lo;0;L;;;;;N;;;;; 18872;TANGUT COMPONENT-115;Lo;0;L;;;;;N;;;;; 18873;TANGUT COMPONENT-116;Lo;0;L;;;;;N;;;;; 18874;TANGUT COMPONENT-117;Lo;0;L;;;;;N;;;;; 18875;TANGUT COMPONENT-118;Lo;0;L;;;;;N;;;;; 18876;TANGUT COMPONENT-119;Lo;0;L;;;;;N;;;;; 18877;TANGUT COMPONENT-120;Lo;0;L;;;;;N;;;;; 18878;TANGUT COMPONENT-121;Lo;0;L;;;;;N;;;;; 18879;TANGUT COMPONENT-122;Lo;0;L;;;;;N;;;;; 1887A;TANGUT COMPONENT-123;Lo;0;L;;;;;N;;;;; 1887B;TANGUT COMPONENT-124;Lo;0;L;;;;;N;;;;; 1887C;TANGUT COMPONENT-125;Lo;0;L;;;;;N;;;;; 1887D;TANGUT COMPONENT-126;Lo;0;L;;;;;N;;;;; 1887E;TANGUT COMPONENT-127;Lo;0;L;;;;;N;;;;; 1887F;TANGUT COMPONENT-128;Lo;0;L;;;;;N;;;;; 18880;TANGUT COMPONENT-129;Lo;0;L;;;;;N;;;;; 18881;TANGUT COMPONENT-130;Lo;0;L;;;;;N;;;;; 18882;TANGUT COMPONENT-131;Lo;0;L;;;;;N;;;;; 18883;TANGUT COMPONENT-132;Lo;0;L;;;;;N;;;;; 18884;TANGUT COMPONENT-133;Lo;0;L;;;;;N;;;;; 18885;TANGUT COMPONENT-134;Lo;0;L;;;;;N;;;;; 18886;TANGUT COMPONENT-135;Lo;0;L;;;;;N;;;;; 18887;TANGUT COMPONENT-136;Lo;0;L;;;;;N;;;;; 18888;TANGUT COMPONENT-137;Lo;0;L;;;;;N;;;;; 18889;TANGUT COMPONENT-138;Lo;0;L;;;;;N;;;;; 1888A;TANGUT COMPONENT-139;Lo;0;L;;;;;N;;;;; 1888B;TANGUT COMPONENT-140;Lo;0;L;;;;;N;;;;; 1888C;TANGUT COMPONENT-141;Lo;0;L;;;;;N;;;;; 1888D;TANGUT COMPONENT-142;Lo;0;L;;;;;N;;;;; 1888E;TANGUT COMPONENT-143;Lo;0;L;;;;;N;;;;; 1888F;TANGUT COMPONENT-144;Lo;0;L;;;;;N;;;;; 18890;TANGUT COMPONENT-145;Lo;0;L;;;;;N;;;;; 18891;TANGUT COMPONENT-146;Lo;0;L;;;;;N;;;;; 18892;TANGUT COMPONENT-147;Lo;0;L;;;;;N;;;;; 18893;TANGUT COMPONENT-148;Lo;0;L;;;;;N;;;;; 18894;TANGUT COMPONENT-149;Lo;0;L;;;;;N;;;;; 18895;TANGUT COMPONENT-150;Lo;0;L;;;;;N;;;;; 18896;TANGUT COMPONENT-151;Lo;0;L;;;;;N;;;;; 18897;TANGUT COMPONENT-152;Lo;0;L;;;;;N;;;;; 18898;TANGUT COMPONENT-153;Lo;0;L;;;;;N;;;;; 18899;TANGUT COMPONENT-154;Lo;0;L;;;;;N;;;;; 1889A;TANGUT COMPONENT-155;Lo;0;L;;;;;N;;;;; 1889B;TANGUT COMPONENT-156;Lo;0;L;;;;;N;;;;; 1889C;TANGUT COMPONENT-157;Lo;0;L;;;;;N;;;;; 1889D;TANGUT COMPONENT-158;Lo;0;L;;;;;N;;;;; 1889E;TANGUT COMPONENT-159;Lo;0;L;;;;;N;;;;; 1889F;TANGUT COMPONENT-160;Lo;0;L;;;;;N;;;;; 188A0;TANGUT COMPONENT-161;Lo;0;L;;;;;N;;;;; 188A1;TANGUT COMPONENT-162;Lo;0;L;;;;;N;;;;; 188A2;TANGUT COMPONENT-163;Lo;0;L;;;;;N;;;;; 188A3;TANGUT COMPONENT-164;Lo;0;L;;;;;N;;;;; 188A4;TANGUT COMPONENT-165;Lo;0;L;;;;;N;;;;; 188A5;TANGUT COMPONENT-166;Lo;0;L;;;;;N;;;;; 188A6;TANGUT COMPONENT-167;Lo;0;L;;;;;N;;;;; 188A7;TANGUT COMPONENT-168;Lo;0;L;;;;;N;;;;; 188A8;TANGUT COMPONENT-169;Lo;0;L;;;;;N;;;;; 188A9;TANGUT COMPONENT-170;Lo;0;L;;;;;N;;;;; 188AA;TANGUT COMPONENT-171;Lo;0;L;;;;;N;;;;; 188AB;TANGUT COMPONENT-172;Lo;0;L;;;;;N;;;;; 188AC;TANGUT COMPONENT-173;Lo;0;L;;;;;N;;;;; 188AD;TANGUT COMPONENT-174;Lo;0;L;;;;;N;;;;; 188AE;TANGUT COMPONENT-175;Lo;0;L;;;;;N;;;;; 188AF;TANGUT COMPONENT-176;Lo;0;L;;;;;N;;;;; 188B0;TANGUT COMPONENT-177;Lo;0;L;;;;;N;;;;; 188B1;TANGUT COMPONENT-178;Lo;0;L;;;;;N;;;;; 188B2;TANGUT COMPONENT-179;Lo;0;L;;;;;N;;;;; 188B3;TANGUT COMPONENT-180;Lo;0;L;;;;;N;;;;; 188B4;TANGUT COMPONENT-181;Lo;0;L;;;;;N;;;;; 188B5;TANGUT COMPONENT-182;Lo;0;L;;;;;N;;;;; 188B6;TANGUT COMPONENT-183;Lo;0;L;;;;;N;;;;; 188B7;TANGUT COMPONENT-184;Lo;0;L;;;;;N;;;;; 188B8;TANGUT COMPONENT-185;Lo;0;L;;;;;N;;;;; 188B9;TANGUT COMPONENT-186;Lo;0;L;;;;;N;;;;; 188BA;TANGUT COMPONENT-187;Lo;0;L;;;;;N;;;;; 188BB;TANGUT COMPONENT-188;Lo;0;L;;;;;N;;;;; 188BC;TANGUT COMPONENT-189;Lo;0;L;;;;;N;;;;; 188BD;TANGUT COMPONENT-190;Lo;0;L;;;;;N;;;;; 188BE;TANGUT COMPONENT-191;Lo;0;L;;;;;N;;;;; 188BF;TANGUT COMPONENT-192;Lo;0;L;;;;;N;;;;; 188C0;TANGUT COMPONENT-193;Lo;0;L;;;;;N;;;;; 188C1;TANGUT COMPONENT-194;Lo;0;L;;;;;N;;;;; 188C2;TANGUT COMPONENT-195;Lo;0;L;;;;;N;;;;; 188C3;TANGUT COMPONENT-196;Lo;0;L;;;;;N;;;;; 188C4;TANGUT COMPONENT-197;Lo;0;L;;;;;N;;;;; 188C5;TANGUT COMPONENT-198;Lo;0;L;;;;;N;;;;; 188C6;TANGUT COMPONENT-199;Lo;0;L;;;;;N;;;;; 188C7;TANGUT COMPONENT-200;Lo;0;L;;;;;N;;;;; 188C8;TANGUT COMPONENT-201;Lo;0;L;;;;;N;;;;; 188C9;TANGUT COMPONENT-202;Lo;0;L;;;;;N;;;;; 188CA;TANGUT COMPONENT-203;Lo;0;L;;;;;N;;;;; 188CB;TANGUT COMPONENT-204;Lo;0;L;;;;;N;;;;; 188CC;TANGUT COMPONENT-205;Lo;0;L;;;;;N;;;;; 188CD;TANGUT COMPONENT-206;Lo;0;L;;;;;N;;;;; 188CE;TANGUT COMPONENT-207;Lo;0;L;;;;;N;;;;; 188CF;TANGUT COMPONENT-208;Lo;0;L;;;;;N;;;;; 188D0;TANGUT COMPONENT-209;Lo;0;L;;;;;N;;;;; 188D1;TANGUT COMPONENT-210;Lo;0;L;;;;;N;;;;; 188D2;TANGUT COMPONENT-211;Lo;0;L;;;;;N;;;;; 188D3;TANGUT COMPONENT-212;Lo;0;L;;;;;N;;;;; 188D4;TANGUT COMPONENT-213;Lo;0;L;;;;;N;;;;; 188D5;TANGUT COMPONENT-214;Lo;0;L;;;;;N;;;;; 188D6;TANGUT COMPONENT-215;Lo;0;L;;;;;N;;;;; 188D7;TANGUT COMPONENT-216;Lo;0;L;;;;;N;;;;; 188D8;TANGUT COMPONENT-217;Lo;0;L;;;;;N;;;;; 188D9;TANGUT COMPONENT-218;Lo;0;L;;;;;N;;;;; 188DA;TANGUT COMPONENT-219;Lo;0;L;;;;;N;;;;; 188DB;TANGUT COMPONENT-220;Lo;0;L;;;;;N;;;;; 188DC;TANGUT COMPONENT-221;Lo;0;L;;;;;N;;;;; 188DD;TANGUT COMPONENT-222;Lo;0;L;;;;;N;;;;; 188DE;TANGUT COMPONENT-223;Lo;0;L;;;;;N;;;;; 188DF;TANGUT COMPONENT-224;Lo;0;L;;;;;N;;;;; 188E0;TANGUT COMPONENT-225;Lo;0;L;;;;;N;;;;; 188E1;TANGUT COMPONENT-226;Lo;0;L;;;;;N;;;;; 188E2;TANGUT COMPONENT-227;Lo;0;L;;;;;N;;;;; 188E3;TANGUT COMPONENT-228;Lo;0;L;;;;;N;;;;; 188E4;TANGUT COMPONENT-229;Lo;0;L;;;;;N;;;;; 188E5;TANGUT COMPONENT-230;Lo;0;L;;;;;N;;;;; 188E6;TANGUT COMPONENT-231;Lo;0;L;;;;;N;;;;; 188E7;TANGUT COMPONENT-232;Lo;0;L;;;;;N;;;;; 188E8;TANGUT COMPONENT-233;Lo;0;L;;;;;N;;;;; 188E9;TANGUT COMPONENT-234;Lo;0;L;;;;;N;;;;; 188EA;TANGUT COMPONENT-235;Lo;0;L;;;;;N;;;;; 188EB;TANGUT COMPONENT-236;Lo;0;L;;;;;N;;;;; 188EC;TANGUT COMPONENT-237;Lo;0;L;;;;;N;;;;; 188ED;TANGUT COMPONENT-238;Lo;0;L;;;;;N;;;;; 188EE;TANGUT COMPONENT-239;Lo;0;L;;;;;N;;;;; 188EF;TANGUT COMPONENT-240;Lo;0;L;;;;;N;;;;; 188F0;TANGUT COMPONENT-241;Lo;0;L;;;;;N;;;;; 188F1;TANGUT COMPONENT-242;Lo;0;L;;;;;N;;;;; 188F2;TANGUT COMPONENT-243;Lo;0;L;;;;;N;;;;; 188F3;TANGUT COMPONENT-244;Lo;0;L;;;;;N;;;;; 188F4;TANGUT COMPONENT-245;Lo;0;L;;;;;N;;;;; 188F5;TANGUT COMPONENT-246;Lo;0;L;;;;;N;;;;; 188F6;TANGUT COMPONENT-247;Lo;0;L;;;;;N;;;;; 188F7;TANGUT COMPONENT-248;Lo;0;L;;;;;N;;;;; 188F8;TANGUT COMPONENT-249;Lo;0;L;;;;;N;;;;; 188F9;TANGUT COMPONENT-250;Lo;0;L;;;;;N;;;;; 188FA;TANGUT COMPONENT-251;Lo;0;L;;;;;N;;;;; 188FB;TANGUT COMPONENT-252;Lo;0;L;;;;;N;;;;; 188FC;TANGUT COMPONENT-253;Lo;0;L;;;;;N;;;;; 188FD;TANGUT COMPONENT-254;Lo;0;L;;;;;N;;;;; 188FE;TANGUT COMPONENT-255;Lo;0;L;;;;;N;;;;; 188FF;TANGUT COMPONENT-256;Lo;0;L;;;;;N;;;;; 18900;TANGUT COMPONENT-257;Lo;0;L;;;;;N;;;;; 18901;TANGUT COMPONENT-258;Lo;0;L;;;;;N;;;;; 18902;TANGUT COMPONENT-259;Lo;0;L;;;;;N;;;;; 18903;TANGUT COMPONENT-260;Lo;0;L;;;;;N;;;;; 18904;TANGUT COMPONENT-261;Lo;0;L;;;;;N;;;;; 18905;TANGUT COMPONENT-262;Lo;0;L;;;;;N;;;;; 18906;TANGUT COMPONENT-263;Lo;0;L;;;;;N;;;;; 18907;TANGUT COMPONENT-264;Lo;0;L;;;;;N;;;;; 18908;TANGUT COMPONENT-265;Lo;0;L;;;;;N;;;;; 18909;TANGUT COMPONENT-266;Lo;0;L;;;;;N;;;;; 1890A;TANGUT COMPONENT-267;Lo;0;L;;;;;N;;;;; 1890B;TANGUT COMPONENT-268;Lo;0;L;;;;;N;;;;; 1890C;TANGUT COMPONENT-269;Lo;0;L;;;;;N;;;;; 1890D;TANGUT COMPONENT-270;Lo;0;L;;;;;N;;;;; 1890E;TANGUT COMPONENT-271;Lo;0;L;;;;;N;;;;; 1890F;TANGUT COMPONENT-272;Lo;0;L;;;;;N;;;;; 18910;TANGUT COMPONENT-273;Lo;0;L;;;;;N;;;;; 18911;TANGUT COMPONENT-274;Lo;0;L;;;;;N;;;;; 18912;TANGUT COMPONENT-275;Lo;0;L;;;;;N;;;;; 18913;TANGUT COMPONENT-276;Lo;0;L;;;;;N;;;;; 18914;TANGUT COMPONENT-277;Lo;0;L;;;;;N;;;;; 18915;TANGUT COMPONENT-278;Lo;0;L;;;;;N;;;;; 18916;TANGUT COMPONENT-279;Lo;0;L;;;;;N;;;;; 18917;TANGUT COMPONENT-280;Lo;0;L;;;;;N;;;;; 18918;TANGUT COMPONENT-281;Lo;0;L;;;;;N;;;;; 18919;TANGUT COMPONENT-282;Lo;0;L;;;;;N;;;;; 1891A;TANGUT COMPONENT-283;Lo;0;L;;;;;N;;;;; 1891B;TANGUT COMPONENT-284;Lo;0;L;;;;;N;;;;; 1891C;TANGUT COMPONENT-285;Lo;0;L;;;;;N;;;;; 1891D;TANGUT COMPONENT-286;Lo;0;L;;;;;N;;;;; 1891E;TANGUT COMPONENT-287;Lo;0;L;;;;;N;;;;; 1891F;TANGUT COMPONENT-288;Lo;0;L;;;;;N;;;;; 18920;TANGUT COMPONENT-289;Lo;0;L;;;;;N;;;;; 18921;TANGUT COMPONENT-290;Lo;0;L;;;;;N;;;;; 18922;TANGUT COMPONENT-291;Lo;0;L;;;;;N;;;;; 18923;TANGUT COMPONENT-292;Lo;0;L;;;;;N;;;;; 18924;TANGUT COMPONENT-293;Lo;0;L;;;;;N;;;;; 18925;TANGUT COMPONENT-294;Lo;0;L;;;;;N;;;;; 18926;TANGUT COMPONENT-295;Lo;0;L;;;;;N;;;;; 18927;TANGUT COMPONENT-296;Lo;0;L;;;;;N;;;;; 18928;TANGUT COMPONENT-297;Lo;0;L;;;;;N;;;;; 18929;TANGUT COMPONENT-298;Lo;0;L;;;;;N;;;;; 1892A;TANGUT COMPONENT-299;Lo;0;L;;;;;N;;;;; 1892B;TANGUT COMPONENT-300;Lo;0;L;;;;;N;;;;; 1892C;TANGUT COMPONENT-301;Lo;0;L;;;;;N;;;;; 1892D;TANGUT COMPONENT-302;Lo;0;L;;;;;N;;;;; 1892E;TANGUT COMPONENT-303;Lo;0;L;;;;;N;;;;; 1892F;TANGUT COMPONENT-304;Lo;0;L;;;;;N;;;;; 18930;TANGUT COMPONENT-305;Lo;0;L;;;;;N;;;;; 18931;TANGUT COMPONENT-306;Lo;0;L;;;;;N;;;;; 18932;TANGUT COMPONENT-307;Lo;0;L;;;;;N;;;;; 18933;TANGUT COMPONENT-308;Lo;0;L;;;;;N;;;;; 18934;TANGUT COMPONENT-309;Lo;0;L;;;;;N;;;;; 18935;TANGUT COMPONENT-310;Lo;0;L;;;;;N;;;;; 18936;TANGUT COMPONENT-311;Lo;0;L;;;;;N;;;;; 18937;TANGUT COMPONENT-312;Lo;0;L;;;;;N;;;;; 18938;TANGUT COMPONENT-313;Lo;0;L;;;;;N;;;;; 18939;TANGUT COMPONENT-314;Lo;0;L;;;;;N;;;;; 1893A;TANGUT COMPONENT-315;Lo;0;L;;;;;N;;;;; 1893B;TANGUT COMPONENT-316;Lo;0;L;;;;;N;;;;; 1893C;TANGUT COMPONENT-317;Lo;0;L;;;;;N;;;;; 1893D;TANGUT COMPONENT-318;Lo;0;L;;;;;N;;;;; 1893E;TANGUT COMPONENT-319;Lo;0;L;;;;;N;;;;; 1893F;TANGUT COMPONENT-320;Lo;0;L;;;;;N;;;;; 18940;TANGUT COMPONENT-321;Lo;0;L;;;;;N;;;;; 18941;TANGUT COMPONENT-322;Lo;0;L;;;;;N;;;;; 18942;TANGUT COMPONENT-323;Lo;0;L;;;;;N;;;;; 18943;TANGUT COMPONENT-324;Lo;0;L;;;;;N;;;;; 18944;TANGUT COMPONENT-325;Lo;0;L;;;;;N;;;;; 18945;TANGUT COMPONENT-326;Lo;0;L;;;;;N;;;;; 18946;TANGUT COMPONENT-327;Lo;0;L;;;;;N;;;;; 18947;TANGUT COMPONENT-328;Lo;0;L;;;;;N;;;;; 18948;TANGUT COMPONENT-329;Lo;0;L;;;;;N;;;;; 18949;TANGUT COMPONENT-330;Lo;0;L;;;;;N;;;;; 1894A;TANGUT COMPONENT-331;Lo;0;L;;;;;N;;;;; 1894B;TANGUT COMPONENT-332;Lo;0;L;;;;;N;;;;; 1894C;TANGUT COMPONENT-333;Lo;0;L;;;;;N;;;;; 1894D;TANGUT COMPONENT-334;Lo;0;L;;;;;N;;;;; 1894E;TANGUT COMPONENT-335;Lo;0;L;;;;;N;;;;; 1894F;TANGUT COMPONENT-336;Lo;0;L;;;;;N;;;;; 18950;TANGUT COMPONENT-337;Lo;0;L;;;;;N;;;;; 18951;TANGUT COMPONENT-338;Lo;0;L;;;;;N;;;;; 18952;TANGUT COMPONENT-339;Lo;0;L;;;;;N;;;;; 18953;TANGUT COMPONENT-340;Lo;0;L;;;;;N;;;;; 18954;TANGUT COMPONENT-341;Lo;0;L;;;;;N;;;;; 18955;TANGUT COMPONENT-342;Lo;0;L;;;;;N;;;;; 18956;TANGUT COMPONENT-343;Lo;0;L;;;;;N;;;;; 18957;TANGUT COMPONENT-344;Lo;0;L;;;;;N;;;;; 18958;TANGUT COMPONENT-345;Lo;0;L;;;;;N;;;;; 18959;TANGUT COMPONENT-346;Lo;0;L;;;;;N;;;;; 1895A;TANGUT COMPONENT-347;Lo;0;L;;;;;N;;;;; 1895B;TANGUT COMPONENT-348;Lo;0;L;;;;;N;;;;; 1895C;TANGUT COMPONENT-349;Lo;0;L;;;;;N;;;;; 1895D;TANGUT COMPONENT-350;Lo;0;L;;;;;N;;;;; 1895E;TANGUT COMPONENT-351;Lo;0;L;;;;;N;;;;; 1895F;TANGUT COMPONENT-352;Lo;0;L;;;;;N;;;;; 18960;TANGUT COMPONENT-353;Lo;0;L;;;;;N;;;;; 18961;TANGUT COMPONENT-354;Lo;0;L;;;;;N;;;;; 18962;TANGUT COMPONENT-355;Lo;0;L;;;;;N;;;;; 18963;TANGUT COMPONENT-356;Lo;0;L;;;;;N;;;;; 18964;TANGUT COMPONENT-357;Lo;0;L;;;;;N;;;;; 18965;TANGUT COMPONENT-358;Lo;0;L;;;;;N;;;;; 18966;TANGUT COMPONENT-359;Lo;0;L;;;;;N;;;;; 18967;TANGUT COMPONENT-360;Lo;0;L;;;;;N;;;;; 18968;TANGUT COMPONENT-361;Lo;0;L;;;;;N;;;;; 18969;TANGUT COMPONENT-362;Lo;0;L;;;;;N;;;;; 1896A;TANGUT COMPONENT-363;Lo;0;L;;;;;N;;;;; 1896B;TANGUT COMPONENT-364;Lo;0;L;;;;;N;;;;; 1896C;TANGUT COMPONENT-365;Lo;0;L;;;;;N;;;;; 1896D;TANGUT COMPONENT-366;Lo;0;L;;;;;N;;;;; 1896E;TANGUT COMPONENT-367;Lo;0;L;;;;;N;;;;; 1896F;TANGUT COMPONENT-368;Lo;0;L;;;;;N;;;;; 18970;TANGUT COMPONENT-369;Lo;0;L;;;;;N;;;;; 18971;TANGUT COMPONENT-370;Lo;0;L;;;;;N;;;;; 18972;TANGUT COMPONENT-371;Lo;0;L;;;;;N;;;;; 18973;TANGUT COMPONENT-372;Lo;0;L;;;;;N;;;;; 18974;TANGUT COMPONENT-373;Lo;0;L;;;;;N;;;;; 18975;TANGUT COMPONENT-374;Lo;0;L;;;;;N;;;;; 18976;TANGUT COMPONENT-375;Lo;0;L;;;;;N;;;;; 18977;TANGUT COMPONENT-376;Lo;0;L;;;;;N;;;;; 18978;TANGUT COMPONENT-377;Lo;0;L;;;;;N;;;;; 18979;TANGUT COMPONENT-378;Lo;0;L;;;;;N;;;;; 1897A;TANGUT COMPONENT-379;Lo;0;L;;;;;N;;;;; 1897B;TANGUT COMPONENT-380;Lo;0;L;;;;;N;;;;; 1897C;TANGUT COMPONENT-381;Lo;0;L;;;;;N;;;;; 1897D;TANGUT COMPONENT-382;Lo;0;L;;;;;N;;;;; 1897E;TANGUT COMPONENT-383;Lo;0;L;;;;;N;;;;; 1897F;TANGUT COMPONENT-384;Lo;0;L;;;;;N;;;;; 18980;TANGUT COMPONENT-385;Lo;0;L;;;;;N;;;;; 18981;TANGUT COMPONENT-386;Lo;0;L;;;;;N;;;;; 18982;TANGUT COMPONENT-387;Lo;0;L;;;;;N;;;;; 18983;TANGUT COMPONENT-388;Lo;0;L;;;;;N;;;;; 18984;TANGUT COMPONENT-389;Lo;0;L;;;;;N;;;;; 18985;TANGUT COMPONENT-390;Lo;0;L;;;;;N;;;;; 18986;TANGUT COMPONENT-391;Lo;0;L;;;;;N;;;;; 18987;TANGUT COMPONENT-392;Lo;0;L;;;;;N;;;;; 18988;TANGUT COMPONENT-393;Lo;0;L;;;;;N;;;;; 18989;TANGUT COMPONENT-394;Lo;0;L;;;;;N;;;;; 1898A;TANGUT COMPONENT-395;Lo;0;L;;;;;N;;;;; 1898B;TANGUT COMPONENT-396;Lo;0;L;;;;;N;;;;; 1898C;TANGUT COMPONENT-397;Lo;0;L;;;;;N;;;;; 1898D;TANGUT COMPONENT-398;Lo;0;L;;;;;N;;;;; 1898E;TANGUT COMPONENT-399;Lo;0;L;;;;;N;;;;; 1898F;TANGUT COMPONENT-400;Lo;0;L;;;;;N;;;;; 18990;TANGUT COMPONENT-401;Lo;0;L;;;;;N;;;;; 18991;TANGUT COMPONENT-402;Lo;0;L;;;;;N;;;;; 18992;TANGUT COMPONENT-403;Lo;0;L;;;;;N;;;;; 18993;TANGUT COMPONENT-404;Lo;0;L;;;;;N;;;;; 18994;TANGUT COMPONENT-405;Lo;0;L;;;;;N;;;;; 18995;TANGUT COMPONENT-406;Lo;0;L;;;;;N;;;;; 18996;TANGUT COMPONENT-407;Lo;0;L;;;;;N;;;;; 18997;TANGUT COMPONENT-408;Lo;0;L;;;;;N;;;;; 18998;TANGUT COMPONENT-409;Lo;0;L;;;;;N;;;;; 18999;TANGUT COMPONENT-410;Lo;0;L;;;;;N;;;;; 1899A;TANGUT COMPONENT-411;Lo;0;L;;;;;N;;;;; 1899B;TANGUT COMPONENT-412;Lo;0;L;;;;;N;;;;; 1899C;TANGUT COMPONENT-413;Lo;0;L;;;;;N;;;;; 1899D;TANGUT COMPONENT-414;Lo;0;L;;;;;N;;;;; 1899E;TANGUT COMPONENT-415;Lo;0;L;;;;;N;;;;; 1899F;TANGUT COMPONENT-416;Lo;0;L;;;;;N;;;;; 189A0;TANGUT COMPONENT-417;Lo;0;L;;;;;N;;;;; 189A1;TANGUT COMPONENT-418;Lo;0;L;;;;;N;;;;; 189A2;TANGUT COMPONENT-419;Lo;0;L;;;;;N;;;;; 189A3;TANGUT COMPONENT-420;Lo;0;L;;;;;N;;;;; 189A4;TANGUT COMPONENT-421;Lo;0;L;;;;;N;;;;; 189A5;TANGUT COMPONENT-422;Lo;0;L;;;;;N;;;;; 189A6;TANGUT COMPONENT-423;Lo;0;L;;;;;N;;;;; 189A7;TANGUT COMPONENT-424;Lo;0;L;;;;;N;;;;; 189A8;TANGUT COMPONENT-425;Lo;0;L;;;;;N;;;;; 189A9;TANGUT COMPONENT-426;Lo;0;L;;;;;N;;;;; 189AA;TANGUT COMPONENT-427;Lo;0;L;;;;;N;;;;; 189AB;TANGUT COMPONENT-428;Lo;0;L;;;;;N;;;;; 189AC;TANGUT COMPONENT-429;Lo;0;L;;;;;N;;;;; 189AD;TANGUT COMPONENT-430;Lo;0;L;;;;;N;;;;; 189AE;TANGUT COMPONENT-431;Lo;0;L;;;;;N;;;;; 189AF;TANGUT COMPONENT-432;Lo;0;L;;;;;N;;;;; 189B0;TANGUT COMPONENT-433;Lo;0;L;;;;;N;;;;; 189B1;TANGUT COMPONENT-434;Lo;0;L;;;;;N;;;;; 189B2;TANGUT COMPONENT-435;Lo;0;L;;;;;N;;;;; 189B3;TANGUT COMPONENT-436;Lo;0;L;;;;;N;;;;; 189B4;TANGUT COMPONENT-437;Lo;0;L;;;;;N;;;;; 189B5;TANGUT COMPONENT-438;Lo;0;L;;;;;N;;;;; 189B6;TANGUT COMPONENT-439;Lo;0;L;;;;;N;;;;; 189B7;TANGUT COMPONENT-440;Lo;0;L;;;;;N;;;;; 189B8;TANGUT COMPONENT-441;Lo;0;L;;;;;N;;;;; 189B9;TANGUT COMPONENT-442;Lo;0;L;;;;;N;;;;; 189BA;TANGUT COMPONENT-443;Lo;0;L;;;;;N;;;;; 189BB;TANGUT COMPONENT-444;Lo;0;L;;;;;N;;;;; 189BC;TANGUT COMPONENT-445;Lo;0;L;;;;;N;;;;; 189BD;TANGUT COMPONENT-446;Lo;0;L;;;;;N;;;;; 189BE;TANGUT COMPONENT-447;Lo;0;L;;;;;N;;;;; 189BF;TANGUT COMPONENT-448;Lo;0;L;;;;;N;;;;; 189C0;TANGUT COMPONENT-449;Lo;0;L;;;;;N;;;;; 189C1;TANGUT COMPONENT-450;Lo;0;L;;;;;N;;;;; 189C2;TANGUT COMPONENT-451;Lo;0;L;;;;;N;;;;; 189C3;TANGUT COMPONENT-452;Lo;0;L;;;;;N;;;;; 189C4;TANGUT COMPONENT-453;Lo;0;L;;;;;N;;;;; 189C5;TANGUT COMPONENT-454;Lo;0;L;;;;;N;;;;; 189C6;TANGUT COMPONENT-455;Lo;0;L;;;;;N;;;;; 189C7;TANGUT COMPONENT-456;Lo;0;L;;;;;N;;;;; 189C8;TANGUT COMPONENT-457;Lo;0;L;;;;;N;;;;; 189C9;TANGUT COMPONENT-458;Lo;0;L;;;;;N;;;;; 189CA;TANGUT COMPONENT-459;Lo;0;L;;;;;N;;;;; 189CB;TANGUT COMPONENT-460;Lo;0;L;;;;;N;;;;; 189CC;TANGUT COMPONENT-461;Lo;0;L;;;;;N;;;;; 189CD;TANGUT COMPONENT-462;Lo;0;L;;;;;N;;;;; 189CE;TANGUT COMPONENT-463;Lo;0;L;;;;;N;;;;; 189CF;TANGUT COMPONENT-464;Lo;0;L;;;;;N;;;;; 189D0;TANGUT COMPONENT-465;Lo;0;L;;;;;N;;;;; 189D1;TANGUT COMPONENT-466;Lo;0;L;;;;;N;;;;; 189D2;TANGUT COMPONENT-467;Lo;0;L;;;;;N;;;;; 189D3;TANGUT COMPONENT-468;Lo;0;L;;;;;N;;;;; 189D4;TANGUT COMPONENT-469;Lo;0;L;;;;;N;;;;; 189D5;TANGUT COMPONENT-470;Lo;0;L;;;;;N;;;;; 189D6;TANGUT COMPONENT-471;Lo;0;L;;;;;N;;;;; 189D7;TANGUT COMPONENT-472;Lo;0;L;;;;;N;;;;; 189D8;TANGUT COMPONENT-473;Lo;0;L;;;;;N;;;;; 189D9;TANGUT COMPONENT-474;Lo;0;L;;;;;N;;;;; 189DA;TANGUT COMPONENT-475;Lo;0;L;;;;;N;;;;; 189DB;TANGUT COMPONENT-476;Lo;0;L;;;;;N;;;;; 189DC;TANGUT COMPONENT-477;Lo;0;L;;;;;N;;;;; 189DD;TANGUT COMPONENT-478;Lo;0;L;;;;;N;;;;; 189DE;TANGUT COMPONENT-479;Lo;0;L;;;;;N;;;;; 189DF;TANGUT COMPONENT-480;Lo;0;L;;;;;N;;;;; 189E0;TANGUT COMPONENT-481;Lo;0;L;;;;;N;;;;; 189E1;TANGUT COMPONENT-482;Lo;0;L;;;;;N;;;;; 189E2;TANGUT COMPONENT-483;Lo;0;L;;;;;N;;;;; 189E3;TANGUT COMPONENT-484;Lo;0;L;;;;;N;;;;; 189E4;TANGUT COMPONENT-485;Lo;0;L;;;;;N;;;;; 189E5;TANGUT COMPONENT-486;Lo;0;L;;;;;N;;;;; 189E6;TANGUT COMPONENT-487;Lo;0;L;;;;;N;;;;; 189E7;TANGUT COMPONENT-488;Lo;0;L;;;;;N;;;;; 189E8;TANGUT COMPONENT-489;Lo;0;L;;;;;N;;;;; 189E9;TANGUT COMPONENT-490;Lo;0;L;;;;;N;;;;; 189EA;TANGUT COMPONENT-491;Lo;0;L;;;;;N;;;;; 189EB;TANGUT COMPONENT-492;Lo;0;L;;;;;N;;;;; 189EC;TANGUT COMPONENT-493;Lo;0;L;;;;;N;;;;; 189ED;TANGUT COMPONENT-494;Lo;0;L;;;;;N;;;;; 189EE;TANGUT COMPONENT-495;Lo;0;L;;;;;N;;;;; 189EF;TANGUT COMPONENT-496;Lo;0;L;;;;;N;;;;; 189F0;TANGUT COMPONENT-497;Lo;0;L;;;;;N;;;;; 189F1;TANGUT COMPONENT-498;Lo;0;L;;;;;N;;;;; 189F2;TANGUT COMPONENT-499;Lo;0;L;;;;;N;;;;; 189F3;TANGUT COMPONENT-500;Lo;0;L;;;;;N;;;;; 189F4;TANGUT COMPONENT-501;Lo;0;L;;;;;N;;;;; 189F5;TANGUT COMPONENT-502;Lo;0;L;;;;;N;;;;; 189F6;TANGUT COMPONENT-503;Lo;0;L;;;;;N;;;;; 189F7;TANGUT COMPONENT-504;Lo;0;L;;;;;N;;;;; 189F8;TANGUT COMPONENT-505;Lo;0;L;;;;;N;;;;; 189F9;TANGUT COMPONENT-506;Lo;0;L;;;;;N;;;;; 189FA;TANGUT COMPONENT-507;Lo;0;L;;;;;N;;;;; 189FB;TANGUT COMPONENT-508;Lo;0;L;;;;;N;;;;; 189FC;TANGUT COMPONENT-509;Lo;0;L;;;;;N;;;;; 189FD;TANGUT COMPONENT-510;Lo;0;L;;;;;N;;;;; 189FE;TANGUT COMPONENT-511;Lo;0;L;;;;;N;;;;; 189FF;TANGUT COMPONENT-512;Lo;0;L;;;;;N;;;;; 18A00;TANGUT COMPONENT-513;Lo;0;L;;;;;N;;;;; 18A01;TANGUT COMPONENT-514;Lo;0;L;;;;;N;;;;; 18A02;TANGUT COMPONENT-515;Lo;0;L;;;;;N;;;;; 18A03;TANGUT COMPONENT-516;Lo;0;L;;;;;N;;;;; 18A04;TANGUT COMPONENT-517;Lo;0;L;;;;;N;;;;; 18A05;TANGUT COMPONENT-518;Lo;0;L;;;;;N;;;;; 18A06;TANGUT COMPONENT-519;Lo;0;L;;;;;N;;;;; 18A07;TANGUT COMPONENT-520;Lo;0;L;;;;;N;;;;; 18A08;TANGUT COMPONENT-521;Lo;0;L;;;;;N;;;;; 18A09;TANGUT COMPONENT-522;Lo;0;L;;;;;N;;;;; 18A0A;TANGUT COMPONENT-523;Lo;0;L;;;;;N;;;;; 18A0B;TANGUT COMPONENT-524;Lo;0;L;;;;;N;;;;; 18A0C;TANGUT COMPONENT-525;Lo;0;L;;;;;N;;;;; 18A0D;TANGUT COMPONENT-526;Lo;0;L;;;;;N;;;;; 18A0E;TANGUT COMPONENT-527;Lo;0;L;;;;;N;;;;; 18A0F;TANGUT COMPONENT-528;Lo;0;L;;;;;N;;;;; 18A10;TANGUT COMPONENT-529;Lo;0;L;;;;;N;;;;; 18A11;TANGUT COMPONENT-530;Lo;0;L;;;;;N;;;;; 18A12;TANGUT COMPONENT-531;Lo;0;L;;;;;N;;;;; 18A13;TANGUT COMPONENT-532;Lo;0;L;;;;;N;;;;; 18A14;TANGUT COMPONENT-533;Lo;0;L;;;;;N;;;;; 18A15;TANGUT COMPONENT-534;Lo;0;L;;;;;N;;;;; 18A16;TANGUT COMPONENT-535;Lo;0;L;;;;;N;;;;; 18A17;TANGUT COMPONENT-536;Lo;0;L;;;;;N;;;;; 18A18;TANGUT COMPONENT-537;Lo;0;L;;;;;N;;;;; 18A19;TANGUT COMPONENT-538;Lo;0;L;;;;;N;;;;; 18A1A;TANGUT COMPONENT-539;Lo;0;L;;;;;N;;;;; 18A1B;TANGUT COMPONENT-540;Lo;0;L;;;;;N;;;;; 18A1C;TANGUT COMPONENT-541;Lo;0;L;;;;;N;;;;; 18A1D;TANGUT COMPONENT-542;Lo;0;L;;;;;N;;;;; 18A1E;TANGUT COMPONENT-543;Lo;0;L;;;;;N;;;;; 18A1F;TANGUT COMPONENT-544;Lo;0;L;;;;;N;;;;; 18A20;TANGUT COMPONENT-545;Lo;0;L;;;;;N;;;;; 18A21;TANGUT COMPONENT-546;Lo;0;L;;;;;N;;;;; 18A22;TANGUT COMPONENT-547;Lo;0;L;;;;;N;;;;; 18A23;TANGUT COMPONENT-548;Lo;0;L;;;;;N;;;;; 18A24;TANGUT COMPONENT-549;Lo;0;L;;;;;N;;;;; 18A25;TANGUT COMPONENT-550;Lo;0;L;;;;;N;;;;; 18A26;TANGUT COMPONENT-551;Lo;0;L;;;;;N;;;;; 18A27;TANGUT COMPONENT-552;Lo;0;L;;;;;N;;;;; 18A28;TANGUT COMPONENT-553;Lo;0;L;;;;;N;;;;; 18A29;TANGUT COMPONENT-554;Lo;0;L;;;;;N;;;;; 18A2A;TANGUT COMPONENT-555;Lo;0;L;;;;;N;;;;; 18A2B;TANGUT COMPONENT-556;Lo;0;L;;;;;N;;;;; 18A2C;TANGUT COMPONENT-557;Lo;0;L;;;;;N;;;;; 18A2D;TANGUT COMPONENT-558;Lo;0;L;;;;;N;;;;; 18A2E;TANGUT COMPONENT-559;Lo;0;L;;;;;N;;;;; 18A2F;TANGUT COMPONENT-560;Lo;0;L;;;;;N;;;;; 18A30;TANGUT COMPONENT-561;Lo;0;L;;;;;N;;;;; 18A31;TANGUT COMPONENT-562;Lo;0;L;;;;;N;;;;; 18A32;TANGUT COMPONENT-563;Lo;0;L;;;;;N;;;;; 18A33;TANGUT COMPONENT-564;Lo;0;L;;;;;N;;;;; 18A34;TANGUT COMPONENT-565;Lo;0;L;;;;;N;;;;; 18A35;TANGUT COMPONENT-566;Lo;0;L;;;;;N;;;;; 18A36;TANGUT COMPONENT-567;Lo;0;L;;;;;N;;;;; 18A37;TANGUT COMPONENT-568;Lo;0;L;;;;;N;;;;; 18A38;TANGUT COMPONENT-569;Lo;0;L;;;;;N;;;;; 18A39;TANGUT COMPONENT-570;Lo;0;L;;;;;N;;;;; 18A3A;TANGUT COMPONENT-571;Lo;0;L;;;;;N;;;;; 18A3B;TANGUT COMPONENT-572;Lo;0;L;;;;;N;;;;; 18A3C;TANGUT COMPONENT-573;Lo;0;L;;;;;N;;;;; 18A3D;TANGUT COMPONENT-574;Lo;0;L;;;;;N;;;;; 18A3E;TANGUT COMPONENT-575;Lo;0;L;;;;;N;;;;; 18A3F;TANGUT COMPONENT-576;Lo;0;L;;;;;N;;;;; 18A40;TANGUT COMPONENT-577;Lo;0;L;;;;;N;;;;; 18A41;TANGUT COMPONENT-578;Lo;0;L;;;;;N;;;;; 18A42;TANGUT COMPONENT-579;Lo;0;L;;;;;N;;;;; 18A43;TANGUT COMPONENT-580;Lo;0;L;;;;;N;;;;; 18A44;TANGUT COMPONENT-581;Lo;0;L;;;;;N;;;;; 18A45;TANGUT COMPONENT-582;Lo;0;L;;;;;N;;;;; 18A46;TANGUT COMPONENT-583;Lo;0;L;;;;;N;;;;; 18A47;TANGUT COMPONENT-584;Lo;0;L;;;;;N;;;;; 18A48;TANGUT COMPONENT-585;Lo;0;L;;;;;N;;;;; 18A49;TANGUT COMPONENT-586;Lo;0;L;;;;;N;;;;; 18A4A;TANGUT COMPONENT-587;Lo;0;L;;;;;N;;;;; 18A4B;TANGUT COMPONENT-588;Lo;0;L;;;;;N;;;;; 18A4C;TANGUT COMPONENT-589;Lo;0;L;;;;;N;;;;; 18A4D;TANGUT COMPONENT-590;Lo;0;L;;;;;N;;;;; 18A4E;TANGUT COMPONENT-591;Lo;0;L;;;;;N;;;;; 18A4F;TANGUT COMPONENT-592;Lo;0;L;;;;;N;;;;; 18A50;TANGUT COMPONENT-593;Lo;0;L;;;;;N;;;;; 18A51;TANGUT COMPONENT-594;Lo;0;L;;;;;N;;;;; 18A52;TANGUT COMPONENT-595;Lo;0;L;;;;;N;;;;; 18A53;TANGUT COMPONENT-596;Lo;0;L;;;;;N;;;;; 18A54;TANGUT COMPONENT-597;Lo;0;L;;;;;N;;;;; 18A55;TANGUT COMPONENT-598;Lo;0;L;;;;;N;;;;; 18A56;TANGUT COMPONENT-599;Lo;0;L;;;;;N;;;;; 18A57;TANGUT COMPONENT-600;Lo;0;L;;;;;N;;;;; 18A58;TANGUT COMPONENT-601;Lo;0;L;;;;;N;;;;; 18A59;TANGUT COMPONENT-602;Lo;0;L;;;;;N;;;;; 18A5A;TANGUT COMPONENT-603;Lo;0;L;;;;;N;;;;; 18A5B;TANGUT COMPONENT-604;Lo;0;L;;;;;N;;;;; 18A5C;TANGUT COMPONENT-605;Lo;0;L;;;;;N;;;;; 18A5D;TANGUT COMPONENT-606;Lo;0;L;;;;;N;;;;; 18A5E;TANGUT COMPONENT-607;Lo;0;L;;;;;N;;;;; 18A5F;TANGUT COMPONENT-608;Lo;0;L;;;;;N;;;;; 18A60;TANGUT COMPONENT-609;Lo;0;L;;;;;N;;;;; 18A61;TANGUT COMPONENT-610;Lo;0;L;;;;;N;;;;; 18A62;TANGUT COMPONENT-611;Lo;0;L;;;;;N;;;;; 18A63;TANGUT COMPONENT-612;Lo;0;L;;;;;N;;;;; 18A64;TANGUT COMPONENT-613;Lo;0;L;;;;;N;;;;; 18A65;TANGUT COMPONENT-614;Lo;0;L;;;;;N;;;;; 18A66;TANGUT COMPONENT-615;Lo;0;L;;;;;N;;;;; 18A67;TANGUT COMPONENT-616;Lo;0;L;;;;;N;;;;; 18A68;TANGUT COMPONENT-617;Lo;0;L;;;;;N;;;;; 18A69;TANGUT COMPONENT-618;Lo;0;L;;;;;N;;;;; 18A6A;TANGUT COMPONENT-619;Lo;0;L;;;;;N;;;;; 18A6B;TANGUT COMPONENT-620;Lo;0;L;;;;;N;;;;; 18A6C;TANGUT COMPONENT-621;Lo;0;L;;;;;N;;;;; 18A6D;TANGUT COMPONENT-622;Lo;0;L;;;;;N;;;;; 18A6E;TANGUT COMPONENT-623;Lo;0;L;;;;;N;;;;; 18A6F;TANGUT COMPONENT-624;Lo;0;L;;;;;N;;;;; 18A70;TANGUT COMPONENT-625;Lo;0;L;;;;;N;;;;; 18A71;TANGUT COMPONENT-626;Lo;0;L;;;;;N;;;;; 18A72;TANGUT COMPONENT-627;Lo;0;L;;;;;N;;;;; 18A73;TANGUT COMPONENT-628;Lo;0;L;;;;;N;;;;; 18A74;TANGUT COMPONENT-629;Lo;0;L;;;;;N;;;;; 18A75;TANGUT COMPONENT-630;Lo;0;L;;;;;N;;;;; 18A76;TANGUT COMPONENT-631;Lo;0;L;;;;;N;;;;; 18A77;TANGUT COMPONENT-632;Lo;0;L;;;;;N;;;;; 18A78;TANGUT COMPONENT-633;Lo;0;L;;;;;N;;;;; 18A79;TANGUT COMPONENT-634;Lo;0;L;;;;;N;;;;; 18A7A;TANGUT COMPONENT-635;Lo;0;L;;;;;N;;;;; 18A7B;TANGUT COMPONENT-636;Lo;0;L;;;;;N;;;;; 18A7C;TANGUT COMPONENT-637;Lo;0;L;;;;;N;;;;; 18A7D;TANGUT COMPONENT-638;Lo;0;L;;;;;N;;;;; 18A7E;TANGUT COMPONENT-639;Lo;0;L;;;;;N;;;;; 18A7F;TANGUT COMPONENT-640;Lo;0;L;;;;;N;;;;; 18A80;TANGUT COMPONENT-641;Lo;0;L;;;;;N;;;;; 18A81;TANGUT COMPONENT-642;Lo;0;L;;;;;N;;;;; 18A82;TANGUT COMPONENT-643;Lo;0;L;;;;;N;;;;; 18A83;TANGUT COMPONENT-644;Lo;0;L;;;;;N;;;;; 18A84;TANGUT COMPONENT-645;Lo;0;L;;;;;N;;;;; 18A85;TANGUT COMPONENT-646;Lo;0;L;;;;;N;;;;; 18A86;TANGUT COMPONENT-647;Lo;0;L;;;;;N;;;;; 18A87;TANGUT COMPONENT-648;Lo;0;L;;;;;N;;;;; 18A88;TANGUT COMPONENT-649;Lo;0;L;;;;;N;;;;; 18A89;TANGUT COMPONENT-650;Lo;0;L;;;;;N;;;;; 18A8A;TANGUT COMPONENT-651;Lo;0;L;;;;;N;;;;; 18A8B;TANGUT COMPONENT-652;Lo;0;L;;;;;N;;;;; 18A8C;TANGUT COMPONENT-653;Lo;0;L;;;;;N;;;;; 18A8D;TANGUT COMPONENT-654;Lo;0;L;;;;;N;;;;; 18A8E;TANGUT COMPONENT-655;Lo;0;L;;;;;N;;;;; 18A8F;TANGUT COMPONENT-656;Lo;0;L;;;;;N;;;;; 18A90;TANGUT COMPONENT-657;Lo;0;L;;;;;N;;;;; 18A91;TANGUT COMPONENT-658;Lo;0;L;;;;;N;;;;; 18A92;TANGUT COMPONENT-659;Lo;0;L;;;;;N;;;;; 18A93;TANGUT COMPONENT-660;Lo;0;L;;;;;N;;;;; 18A94;TANGUT COMPONENT-661;Lo;0;L;;;;;N;;;;; 18A95;TANGUT COMPONENT-662;Lo;0;L;;;;;N;;;;; 18A96;TANGUT COMPONENT-663;Lo;0;L;;;;;N;;;;; 18A97;TANGUT COMPONENT-664;Lo;0;L;;;;;N;;;;; 18A98;TANGUT COMPONENT-665;Lo;0;L;;;;;N;;;;; 18A99;TANGUT COMPONENT-666;Lo;0;L;;;;;N;;;;; 18A9A;TANGUT COMPONENT-667;Lo;0;L;;;;;N;;;;; 18A9B;TANGUT COMPONENT-668;Lo;0;L;;;;;N;;;;; 18A9C;TANGUT COMPONENT-669;Lo;0;L;;;;;N;;;;; 18A9D;TANGUT COMPONENT-670;Lo;0;L;;;;;N;;;;; 18A9E;TANGUT COMPONENT-671;Lo;0;L;;;;;N;;;;; 18A9F;TANGUT COMPONENT-672;Lo;0;L;;;;;N;;;;; 18AA0;TANGUT COMPONENT-673;Lo;0;L;;;;;N;;;;; 18AA1;TANGUT COMPONENT-674;Lo;0;L;;;;;N;;;;; 18AA2;TANGUT COMPONENT-675;Lo;0;L;;;;;N;;;;; 18AA3;TANGUT COMPONENT-676;Lo;0;L;;;;;N;;;;; 18AA4;TANGUT COMPONENT-677;Lo;0;L;;;;;N;;;;; 18AA5;TANGUT COMPONENT-678;Lo;0;L;;;;;N;;;;; 18AA6;TANGUT COMPONENT-679;Lo;0;L;;;;;N;;;;; 18AA7;TANGUT COMPONENT-680;Lo;0;L;;;;;N;;;;; 18AA8;TANGUT COMPONENT-681;Lo;0;L;;;;;N;;;;; 18AA9;TANGUT COMPONENT-682;Lo;0;L;;;;;N;;;;; 18AAA;TANGUT COMPONENT-683;Lo;0;L;;;;;N;;;;; 18AAB;TANGUT COMPONENT-684;Lo;0;L;;;;;N;;;;; 18AAC;TANGUT COMPONENT-685;Lo;0;L;;;;;N;;;;; 18AAD;TANGUT COMPONENT-686;Lo;0;L;;;;;N;;;;; 18AAE;TANGUT COMPONENT-687;Lo;0;L;;;;;N;;;;; 18AAF;TANGUT COMPONENT-688;Lo;0;L;;;;;N;;;;; 18AB0;TANGUT COMPONENT-689;Lo;0;L;;;;;N;;;;; 18AB1;TANGUT COMPONENT-690;Lo;0;L;;;;;N;;;;; 18AB2;TANGUT COMPONENT-691;Lo;0;L;;;;;N;;;;; 18AB3;TANGUT COMPONENT-692;Lo;0;L;;;;;N;;;;; 18AB4;TANGUT COMPONENT-693;Lo;0;L;;;;;N;;;;; 18AB5;TANGUT COMPONENT-694;Lo;0;L;;;;;N;;;;; 18AB6;TANGUT COMPONENT-695;Lo;0;L;;;;;N;;;;; 18AB7;TANGUT COMPONENT-696;Lo;0;L;;;;;N;;;;; 18AB8;TANGUT COMPONENT-697;Lo;0;L;;;;;N;;;;; 18AB9;TANGUT COMPONENT-698;Lo;0;L;;;;;N;;;;; 18ABA;TANGUT COMPONENT-699;Lo;0;L;;;;;N;;;;; 18ABB;TANGUT COMPONENT-700;Lo;0;L;;;;;N;;;;; 18ABC;TANGUT COMPONENT-701;Lo;0;L;;;;;N;;;;; 18ABD;TANGUT COMPONENT-702;Lo;0;L;;;;;N;;;;; 18ABE;TANGUT COMPONENT-703;Lo;0;L;;;;;N;;;;; 18ABF;TANGUT COMPONENT-704;Lo;0;L;;;;;N;;;;; 18AC0;TANGUT COMPONENT-705;Lo;0;L;;;;;N;;;;; 18AC1;TANGUT COMPONENT-706;Lo;0;L;;;;;N;;;;; 18AC2;TANGUT COMPONENT-707;Lo;0;L;;;;;N;;;;; 18AC3;TANGUT COMPONENT-708;Lo;0;L;;;;;N;;;;; 18AC4;TANGUT COMPONENT-709;Lo;0;L;;;;;N;;;;; 18AC5;TANGUT COMPONENT-710;Lo;0;L;;;;;N;;;;; 18AC6;TANGUT COMPONENT-711;Lo;0;L;;;;;N;;;;; 18AC7;TANGUT COMPONENT-712;Lo;0;L;;;;;N;;;;; 18AC8;TANGUT COMPONENT-713;Lo;0;L;;;;;N;;;;; 18AC9;TANGUT COMPONENT-714;Lo;0;L;;;;;N;;;;; 18ACA;TANGUT COMPONENT-715;Lo;0;L;;;;;N;;;;; 18ACB;TANGUT COMPONENT-716;Lo;0;L;;;;;N;;;;; 18ACC;TANGUT COMPONENT-717;Lo;0;L;;;;;N;;;;; 18ACD;TANGUT COMPONENT-718;Lo;0;L;;;;;N;;;;; 18ACE;TANGUT COMPONENT-719;Lo;0;L;;;;;N;;;;; 18ACF;TANGUT COMPONENT-720;Lo;0;L;;;;;N;;;;; 18AD0;TANGUT COMPONENT-721;Lo;0;L;;;;;N;;;;; 18AD1;TANGUT COMPONENT-722;Lo;0;L;;;;;N;;;;; 18AD2;TANGUT COMPONENT-723;Lo;0;L;;;;;N;;;;; 18AD3;TANGUT COMPONENT-724;Lo;0;L;;;;;N;;;;; 18AD4;TANGUT COMPONENT-725;Lo;0;L;;;;;N;;;;; 18AD5;TANGUT COMPONENT-726;Lo;0;L;;;;;N;;;;; 18AD6;TANGUT COMPONENT-727;Lo;0;L;;;;;N;;;;; 18AD7;TANGUT COMPONENT-728;Lo;0;L;;;;;N;;;;; 18AD8;TANGUT COMPONENT-729;Lo;0;L;;;;;N;;;;; 18AD9;TANGUT COMPONENT-730;Lo;0;L;;;;;N;;;;; 18ADA;TANGUT COMPONENT-731;Lo;0;L;;;;;N;;;;; 18ADB;TANGUT COMPONENT-732;Lo;0;L;;;;;N;;;;; 18ADC;TANGUT COMPONENT-733;Lo;0;L;;;;;N;;;;; 18ADD;TANGUT COMPONENT-734;Lo;0;L;;;;;N;;;;; 18ADE;TANGUT COMPONENT-735;Lo;0;L;;;;;N;;;;; 18ADF;TANGUT COMPONENT-736;Lo;0;L;;;;;N;;;;; 18AE0;TANGUT COMPONENT-737;Lo;0;L;;;;;N;;;;; 18AE1;TANGUT COMPONENT-738;Lo;0;L;;;;;N;;;;; 18AE2;TANGUT COMPONENT-739;Lo;0;L;;;;;N;;;;; 18AE3;TANGUT COMPONENT-740;Lo;0;L;;;;;N;;;;; 18AE4;TANGUT COMPONENT-741;Lo;0;L;;;;;N;;;;; 18AE5;TANGUT COMPONENT-742;Lo;0;L;;;;;N;;;;; 18AE6;TANGUT COMPONENT-743;Lo;0;L;;;;;N;;;;; 18AE7;TANGUT COMPONENT-744;Lo;0;L;;;;;N;;;;; 18AE8;TANGUT COMPONENT-745;Lo;0;L;;;;;N;;;;; 18AE9;TANGUT COMPONENT-746;Lo;0;L;;;;;N;;;;; 18AEA;TANGUT COMPONENT-747;Lo;0;L;;;;;N;;;;; 18AEB;TANGUT COMPONENT-748;Lo;0;L;;;;;N;;;;; 18AEC;TANGUT COMPONENT-749;Lo;0;L;;;;;N;;;;; 18AED;TANGUT COMPONENT-750;Lo;0;L;;;;;N;;;;; 18AEE;TANGUT COMPONENT-751;Lo;0;L;;;;;N;;;;; 18AEF;TANGUT COMPONENT-752;Lo;0;L;;;;;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;;;;; 1B000;KATAKANA LETTER ARCHAIC E;Lo;0;L;;;;;N;;;;; 1B001;HIRAGANA LETTER ARCHAIC YE;Lo;0;L;;;;;N;;;;; 1BC00;DUPLOYAN LETTER H;Lo;0;L;;;;;N;;;;; 1BC01;DUPLOYAN LETTER X;Lo;0;L;;;;;N;;;;; 1BC02;DUPLOYAN LETTER P;Lo;0;L;;;;;N;;;;; 1BC03;DUPLOYAN LETTER T;Lo;0;L;;;;;N;;;;; 1BC04;DUPLOYAN LETTER F;Lo;0;L;;;;;N;;;;; 1BC05;DUPLOYAN LETTER K;Lo;0;L;;;;;N;;;;; 1BC06;DUPLOYAN LETTER L;Lo;0;L;;;;;N;;;;; 1BC07;DUPLOYAN LETTER B;Lo;0;L;;;;;N;;;;; 1BC08;DUPLOYAN LETTER D;Lo;0;L;;;;;N;;;;; 1BC09;DUPLOYAN LETTER V;Lo;0;L;;;;;N;;;;; 1BC0A;DUPLOYAN LETTER G;Lo;0;L;;;;;N;;;;; 1BC0B;DUPLOYAN LETTER R;Lo;0;L;;;;;N;;;;; 1BC0C;DUPLOYAN LETTER P N;Lo;0;L;;;;;N;;;;; 1BC0D;DUPLOYAN LETTER D S;Lo;0;L;;;;;N;;;;; 1BC0E;DUPLOYAN LETTER F N;Lo;0;L;;;;;N;;;;; 1BC0F;DUPLOYAN LETTER K M;Lo;0;L;;;;;N;;;;; 1BC10;DUPLOYAN LETTER R S;Lo;0;L;;;;;N;;;;; 1BC11;DUPLOYAN LETTER TH;Lo;0;L;;;;;N;;;;; 1BC12;DUPLOYAN LETTER SLOAN DH;Lo;0;L;;;;;N;;;;; 1BC13;DUPLOYAN LETTER DH;Lo;0;L;;;;;N;;;;; 1BC14;DUPLOYAN LETTER KK;Lo;0;L;;;;;N;;;;; 1BC15;DUPLOYAN LETTER SLOAN J;Lo;0;L;;;;;N;;;;; 1BC16;DUPLOYAN LETTER HL;Lo;0;L;;;;;N;;;;; 1BC17;DUPLOYAN LETTER LH;Lo;0;L;;;;;N;;;;; 1BC18;DUPLOYAN LETTER RH;Lo;0;L;;;;;N;;;;; 1BC19;DUPLOYAN LETTER M;Lo;0;L;;;;;N;;;;; 1BC1A;DUPLOYAN LETTER N;Lo;0;L;;;;;N;;;;; 1BC1B;DUPLOYAN LETTER J;Lo;0;L;;;;;N;;;;; 1BC1C;DUPLOYAN LETTER S;Lo;0;L;;;;;N;;;;; 1BC1D;DUPLOYAN LETTER M N;Lo;0;L;;;;;N;;;;; 1BC1E;DUPLOYAN LETTER N M;Lo;0;L;;;;;N;;;;; 1BC1F;DUPLOYAN LETTER J M;Lo;0;L;;;;;N;;;;; 1BC20;DUPLOYAN LETTER S J;Lo;0;L;;;;;N;;;;; 1BC21;DUPLOYAN LETTER M WITH DOT;Lo;0;L;;;;;N;;;;; 1BC22;DUPLOYAN LETTER N WITH DOT;Lo;0;L;;;;;N;;;;; 1BC23;DUPLOYAN LETTER J WITH DOT;Lo;0;L;;;;;N;;;;; 1BC24;DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE;Lo;0;L;;;;;N;;;;; 1BC25;DUPLOYAN LETTER S WITH DOT;Lo;0;L;;;;;N;;;;; 1BC26;DUPLOYAN LETTER S WITH DOT BELOW;Lo;0;L;;;;;N;;;;; 1BC27;DUPLOYAN LETTER M S;Lo;0;L;;;;;N;;;;; 1BC28;DUPLOYAN LETTER N S;Lo;0;L;;;;;N;;;;; 1BC29;DUPLOYAN LETTER J S;Lo;0;L;;;;;N;;;;; 1BC2A;DUPLOYAN LETTER S S;Lo;0;L;;;;;N;;;;; 1BC2B;DUPLOYAN LETTER M N S;Lo;0;L;;;;;N;;;;; 1BC2C;DUPLOYAN LETTER N M S;Lo;0;L;;;;;N;;;;; 1BC2D;DUPLOYAN LETTER J M S;Lo;0;L;;;;;N;;;;; 1BC2E;DUPLOYAN LETTER S J S;Lo;0;L;;;;;N;;;;; 1BC2F;DUPLOYAN LETTER J S WITH DOT;Lo;0;L;;;;;N;;;;; 1BC30;DUPLOYAN LETTER J N;Lo;0;L;;;;;N;;;;; 1BC31;DUPLOYAN LETTER J N S;Lo;0;L;;;;;N;;;;; 1BC32;DUPLOYAN LETTER S T;Lo;0;L;;;;;N;;;;; 1BC33;DUPLOYAN LETTER S T R;Lo;0;L;;;;;N;;;;; 1BC34;DUPLOYAN LETTER S P;Lo;0;L;;;;;N;;;;; 1BC35;DUPLOYAN LETTER S P R;Lo;0;L;;;;;N;;;;; 1BC36;DUPLOYAN LETTER T S;Lo;0;L;;;;;N;;;;; 1BC37;DUPLOYAN LETTER T R S;Lo;0;L;;;;;N;;;;; 1BC38;DUPLOYAN LETTER W;Lo;0;L;;;;;N;;;;; 1BC39;DUPLOYAN LETTER WH;Lo;0;L;;;;;N;;;;; 1BC3A;DUPLOYAN LETTER W R;Lo;0;L;;;;;N;;;;; 1BC3B;DUPLOYAN LETTER S N;Lo;0;L;;;;;N;;;;; 1BC3C;DUPLOYAN LETTER S M;Lo;0;L;;;;;N;;;;; 1BC3D;DUPLOYAN LETTER K R S;Lo;0;L;;;;;N;;;;; 1BC3E;DUPLOYAN LETTER G R S;Lo;0;L;;;;;N;;;;; 1BC3F;DUPLOYAN LETTER S K;Lo;0;L;;;;;N;;;;; 1BC40;DUPLOYAN LETTER S K R;Lo;0;L;;;;;N;;;;; 1BC41;DUPLOYAN LETTER A;Lo;0;L;;;;;N;;;;; 1BC42;DUPLOYAN LETTER SLOAN OW;Lo;0;L;;;;;N;;;;; 1BC43;DUPLOYAN LETTER OA;Lo;0;L;;;;;N;;;;; 1BC44;DUPLOYAN LETTER O;Lo;0;L;;;;;N;;;;; 1BC45;DUPLOYAN LETTER AOU;Lo;0;L;;;;;N;;;;; 1BC46;DUPLOYAN LETTER I;Lo;0;L;;;;;N;;;;; 1BC47;DUPLOYAN LETTER E;Lo;0;L;;;;;N;;;;; 1BC48;DUPLOYAN LETTER IE;Lo;0;L;;;;;N;;;;; 1BC49;DUPLOYAN LETTER SHORT I;Lo;0;L;;;;;N;;;;; 1BC4A;DUPLOYAN LETTER UI;Lo;0;L;;;;;N;;;;; 1BC4B;DUPLOYAN LETTER EE;Lo;0;L;;;;;N;;;;; 1BC4C;DUPLOYAN LETTER SLOAN EH;Lo;0;L;;;;;N;;;;; 1BC4D;DUPLOYAN LETTER ROMANIAN I;Lo;0;L;;;;;N;;;;; 1BC4E;DUPLOYAN LETTER SLOAN EE;Lo;0;L;;;;;N;;;;; 1BC4F;DUPLOYAN LETTER LONG I;Lo;0;L;;;;;N;;;;; 1BC50;DUPLOYAN LETTER YE;Lo;0;L;;;;;N;;;;; 1BC51;DUPLOYAN LETTER U;Lo;0;L;;;;;N;;;;; 1BC52;DUPLOYAN LETTER EU;Lo;0;L;;;;;N;;;;; 1BC53;DUPLOYAN LETTER XW;Lo;0;L;;;;;N;;;;; 1BC54;DUPLOYAN LETTER U N;Lo;0;L;;;;;N;;;;; 1BC55;DUPLOYAN LETTER LONG U;Lo;0;L;;;;;N;;;;; 1BC56;DUPLOYAN LETTER ROMANIAN U;Lo;0;L;;;;;N;;;;; 1BC57;DUPLOYAN LETTER UH;Lo;0;L;;;;;N;;;;; 1BC58;DUPLOYAN LETTER SLOAN U;Lo;0;L;;;;;N;;;;; 1BC59;DUPLOYAN LETTER OOH;Lo;0;L;;;;;N;;;;; 1BC5A;DUPLOYAN LETTER OW;Lo;0;L;;;;;N;;;;; 1BC5B;DUPLOYAN LETTER OU;Lo;0;L;;;;;N;;;;; 1BC5C;DUPLOYAN LETTER WA;Lo;0;L;;;;;N;;;;; 1BC5D;DUPLOYAN LETTER WO;Lo;0;L;;;;;N;;;;; 1BC5E;DUPLOYAN LETTER WI;Lo;0;L;;;;;N;;;;; 1BC5F;DUPLOYAN LETTER WEI;Lo;0;L;;;;;N;;;;; 1BC60;DUPLOYAN LETTER WOW;Lo;0;L;;;;;N;;;;; 1BC61;DUPLOYAN LETTER NASAL U;Lo;0;L;;;;;N;;;;; 1BC62;DUPLOYAN LETTER NASAL O;Lo;0;L;;;;;N;;;;; 1BC63;DUPLOYAN LETTER NASAL I;Lo;0;L;;;;;N;;;;; 1BC64;DUPLOYAN LETTER NASAL A;Lo;0;L;;;;;N;;;;; 1BC65;DUPLOYAN LETTER PERNIN AN;Lo;0;L;;;;;N;;;;; 1BC66;DUPLOYAN LETTER PERNIN AM;Lo;0;L;;;;;N;;;;; 1BC67;DUPLOYAN LETTER SLOAN EN;Lo;0;L;;;;;N;;;;; 1BC68;DUPLOYAN LETTER SLOAN AN;Lo;0;L;;;;;N;;;;; 1BC69;DUPLOYAN LETTER SLOAN ON;Lo;0;L;;;;;N;;;;; 1BC6A;DUPLOYAN LETTER VOCALIC M;Lo;0;L;;;;;N;;;;; 1BC70;DUPLOYAN AFFIX LEFT HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; 1BC71;DUPLOYAN AFFIX MID HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; 1BC72;DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; 1BC73;DUPLOYAN AFFIX LOW VERTICAL SECANT;Lo;0;L;;;;;N;;;;; 1BC74;DUPLOYAN AFFIX MID VERTICAL SECANT;Lo;0;L;;;;;N;;;;; 1BC75;DUPLOYAN AFFIX HIGH VERTICAL SECANT;Lo;0;L;;;;;N;;;;; 1BC76;DUPLOYAN AFFIX ATTACHED SECANT;Lo;0;L;;;;;N;;;;; 1BC77;DUPLOYAN AFFIX ATTACHED LEFT-TO-RIGHT SECANT;Lo;0;L;;;;;N;;;;; 1BC78;DUPLOYAN AFFIX ATTACHED TANGENT;Lo;0;L;;;;;N;;;;; 1BC79;DUPLOYAN AFFIX ATTACHED TAIL;Lo;0;L;;;;;N;;;;; 1BC7A;DUPLOYAN AFFIX ATTACHED E HOOK;Lo;0;L;;;;;N;;;;; 1BC7B;DUPLOYAN AFFIX ATTACHED I HOOK;Lo;0;L;;;;;N;;;;; 1BC7C;DUPLOYAN AFFIX ATTACHED TANGENT HOOK;Lo;0;L;;;;;N;;;;; 1BC80;DUPLOYAN AFFIX HIGH ACUTE;Lo;0;L;;;;;N;;;;; 1BC81;DUPLOYAN AFFIX HIGH TIGHT ACUTE;Lo;0;L;;;;;N;;;;; 1BC82;DUPLOYAN AFFIX HIGH GRAVE;Lo;0;L;;;;;N;;;;; 1BC83;DUPLOYAN AFFIX HIGH LONG GRAVE;Lo;0;L;;;;;N;;;;; 1BC84;DUPLOYAN AFFIX HIGH DOT;Lo;0;L;;;;;N;;;;; 1BC85;DUPLOYAN AFFIX HIGH CIRCLE;Lo;0;L;;;;;N;;;;; 1BC86;DUPLOYAN AFFIX HIGH LINE;Lo;0;L;;;;;N;;;;; 1BC87;DUPLOYAN AFFIX HIGH WAVE;Lo;0;L;;;;;N;;;;; 1BC88;DUPLOYAN AFFIX HIGH VERTICAL;Lo;0;L;;;;;N;;;;; 1BC90;DUPLOYAN AFFIX LOW ACUTE;Lo;0;L;;;;;N;;;;; 1BC91;DUPLOYAN AFFIX LOW TIGHT ACUTE;Lo;0;L;;;;;N;;;;; 1BC92;DUPLOYAN AFFIX LOW GRAVE;Lo;0;L;;;;;N;;;;; 1BC93;DUPLOYAN AFFIX LOW LONG GRAVE;Lo;0;L;;;;;N;;;;; 1BC94;DUPLOYAN AFFIX LOW DOT;Lo;0;L;;;;;N;;;;; 1BC95;DUPLOYAN AFFIX LOW CIRCLE;Lo;0;L;;;;;N;;;;; 1BC96;DUPLOYAN AFFIX LOW LINE;Lo;0;L;;;;;N;;;;; 1BC97;DUPLOYAN AFFIX LOW WAVE;Lo;0;L;;;;;N;;;;; 1BC98;DUPLOYAN AFFIX LOW VERTICAL;Lo;0;L;;;;;N;;;;; 1BC99;DUPLOYAN AFFIX LOW ARROW;Lo;0;L;;;;;N;;;;; 1BC9C;DUPLOYAN SIGN O WITH CROSS;So;0;L;;;;;N;;;;; 1BC9D;DUPLOYAN THICK LETTER SELECTOR;Mn;0;NSM;;;;;N;;;;; 1BC9E;DUPLOYAN DOUBLE MARK;Mn;1;NSM;;;;;N;;;;; 1BC9F;DUPLOYAN PUNCTUATION CHINOOK FULL STOP;Po;0;L;;;;;N;;;;; 1BCA0;SHORTHAND FORMAT LETTER OVERLAP;Cf;0;BN;;;;;N;;;;; 1BCA1;SHORTHAND FORMAT CONTINUING OVERLAP;Cf;0;BN;;;;;N;;;;; 1BCA2;SHORTHAND FORMAT DOWN STEP;Cf;0;BN;;;;;N;;;;; 1BCA3;SHORTHAND FORMAT UP STEP;Cf;0;BN;;;;;N;;;;; 1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;; 1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;; 1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;; 1D003;BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON;So;0;L;;;;;N;;;;; 1D004;BYZANTINE MUSICAL SYMBOL OXEIA DIPLI;So;0;L;;;;;N;;;;; 1D005;BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON;So;0;L;;;;;N;;;;; 1D006;BYZANTINE MUSICAL SYMBOL VAREIA DIPLI;So;0;L;;;;;N;;;;; 1D007;BYZANTINE MUSICAL SYMBOL KATHISTI;So;0;L;;;;;N;;;;; 1D008;BYZANTINE MUSICAL SYMBOL SYRMATIKI;So;0;L;;;;;N;;;;; 1D009;BYZANTINE MUSICAL SYMBOL PARAKLITIKI;So;0;L;;;;;N;;;;; 1D00A;BYZANTINE MUSICAL SYMBOL YPOKRISIS;So;0;L;;;;;N;;;;; 1D00B;BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI;So;0;L;;;;;N;;;;; 1D00C;BYZANTINE MUSICAL SYMBOL KREMASTI;So;0;L;;;;;N;;;;; 1D00D;BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON;So;0;L;;;;;N;;;;; 1D00E;BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON;So;0;L;;;;;N;;;;; 1D00F;BYZANTINE MUSICAL SYMBOL TELEIA;So;0;L;;;;;N;;;;; 1D010;BYZANTINE MUSICAL SYMBOL KENTIMATA;So;0;L;;;;;N;;;;; 1D011;BYZANTINE MUSICAL SYMBOL APOSTROFOS;So;0;L;;;;;N;;;;; 1D012;BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI;So;0;L;;;;;N;;;;; 1D013;BYZANTINE MUSICAL SYMBOL SYNEVMA;So;0;L;;;;;N;;;;; 1D014;BYZANTINE MUSICAL SYMBOL THITA;So;0;L;;;;;N;;;;; 1D015;BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION;So;0;L;;;;;N;;;;; 1D016;BYZANTINE MUSICAL SYMBOL GORGON ARCHAION;So;0;L;;;;;N;;;;; 1D017;BYZANTINE MUSICAL SYMBOL PSILON;So;0;L;;;;;N;;;;; 1D018;BYZANTINE MUSICAL SYMBOL CHAMILON;So;0;L;;;;;N;;;;; 1D019;BYZANTINE MUSICAL SYMBOL VATHY;So;0;L;;;;;N;;;;; 1D01A;BYZANTINE MUSICAL SYMBOL ISON ARCHAION;So;0;L;;;;;N;;;;; 1D01B;BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION;So;0;L;;;;;N;;;;; 1D01C;BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION;So;0;L;;;;;N;;;;; 1D01D;BYZANTINE MUSICAL SYMBOL SAXIMATA;So;0;L;;;;;N;;;;; 1D01E;BYZANTINE MUSICAL SYMBOL PARICHON;So;0;L;;;;;N;;;;; 1D01F;BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA;So;0;L;;;;;N;;;;; 1D020;BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION;So;0;L;;;;;N;;;;; 1D021;BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION;So;0;L;;;;;N;;;;; 1D022;BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION;So;0;L;;;;;N;;;;; 1D023;BYZANTINE MUSICAL SYMBOL APOTHEMA;So;0;L;;;;;N;;;;; 1D024;BYZANTINE MUSICAL SYMBOL KLASMA;So;0;L;;;;;N;;;;; 1D025;BYZANTINE MUSICAL SYMBOL REVMA;So;0;L;;;;;N;;;;; 1D026;BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION;So;0;L;;;;;N;;;;; 1D027;BYZANTINE MUSICAL SYMBOL TINAGMA;So;0;L;;;;;N;;;;; 1D028;BYZANTINE MUSICAL SYMBOL ANATRICHISMA;So;0;L;;;;;N;;;;; 1D029;BYZANTINE MUSICAL SYMBOL SEISMA;So;0;L;;;;;N;;;;; 1D02A;BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION;So;0;L;;;;;N;;;;; 1D02B;BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU;So;0;L;;;;;N;;;;; 1D02C;BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION;So;0;L;;;;;N;;;;; 1D02D;BYZANTINE MUSICAL SYMBOL THEMA;So;0;L;;;;;N;;;;; 1D02E;BYZANTINE MUSICAL SYMBOL LEMOI;So;0;L;;;;;N;;;;; 1D02F;BYZANTINE MUSICAL SYMBOL DYO;So;0;L;;;;;N;;;;; 1D030;BYZANTINE MUSICAL SYMBOL TRIA;So;0;L;;;;;N;;;;; 1D031;BYZANTINE MUSICAL SYMBOL TESSERA;So;0;L;;;;;N;;;;; 1D032;BYZANTINE MUSICAL SYMBOL KRATIMATA;So;0;L;;;;;N;;;;; 1D033;BYZANTINE MUSICAL SYMBOL APESO EXO NEO;So;0;L;;;;;N;;;;; 1D034;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION;So;0;L;;;;;N;;;;; 1D035;BYZANTINE MUSICAL SYMBOL IMIFTHORA;So;0;L;;;;;N;;;;; 1D036;BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION;So;0;L;;;;;N;;;;; 1D037;BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON;So;0;L;;;;;N;;;;; 1D038;BYZANTINE MUSICAL SYMBOL PELASTON;So;0;L;;;;;N;;;;; 1D039;BYZANTINE MUSICAL SYMBOL PSIFISTON;So;0;L;;;;;N;;;;; 1D03A;BYZANTINE MUSICAL SYMBOL KONTEVMA;So;0;L;;;;;N;;;;; 1D03B;BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION;So;0;L;;;;;N;;;;; 1D03C;BYZANTINE MUSICAL SYMBOL RAPISMA;So;0;L;;;;;N;;;;; 1D03D;BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION;So;0;L;;;;;N;;;;; 1D03E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION;So;0;L;;;;;N;;;;; 1D03F;BYZANTINE MUSICAL SYMBOL ICHADIN;So;0;L;;;;;N;;;;; 1D040;BYZANTINE MUSICAL SYMBOL NANA;So;0;L;;;;;N;;;;; 1D041;BYZANTINE MUSICAL SYMBOL PETASMA;So;0;L;;;;;N;;;;; 1D042;BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO;So;0;L;;;;;N;;;;; 1D043;BYZANTINE MUSICAL SYMBOL TROMIKON ALLO;So;0;L;;;;;N;;;;; 1D044;BYZANTINE MUSICAL SYMBOL STRAGGISMATA;So;0;L;;;;;N;;;;; 1D045;BYZANTINE MUSICAL SYMBOL GRONTHISMATA;So;0;L;;;;;N;;;;; 1D046;BYZANTINE MUSICAL SYMBOL ISON NEO;So;0;L;;;;;N;;;;; 1D047;BYZANTINE MUSICAL SYMBOL OLIGON NEO;So;0;L;;;;;N;;;;; 1D048;BYZANTINE MUSICAL SYMBOL OXEIA NEO;So;0;L;;;;;N;;;;; 1D049;BYZANTINE MUSICAL SYMBOL PETASTI;So;0;L;;;;;N;;;;; 1D04A;BYZANTINE MUSICAL SYMBOL KOUFISMA;So;0;L;;;;;N;;;;; 1D04B;BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA;So;0;L;;;;;N;;;;; 1D04C;BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA;So;0;L;;;;;N;;;;; 1D04D;BYZANTINE MUSICAL SYMBOL PELASTON NEO;So;0;L;;;;;N;;;;; 1D04E;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO;So;0;L;;;;;N;;;;; 1D04F;BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO;So;0;L;;;;;N;;;;; 1D050;BYZANTINE MUSICAL SYMBOL YPSILI;So;0;L;;;;;N;;;;; 1D051;BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO;So;0;L;;;;;N;;;;; 1D052;BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO;So;0;L;;;;;N;;;;; 1D053;BYZANTINE MUSICAL SYMBOL YPORROI;So;0;L;;;;;N;;;;; 1D054;BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON;So;0;L;;;;;N;;;;; 1D055;BYZANTINE MUSICAL SYMBOL ELAFRON;So;0;L;;;;;N;;;;; 1D056;BYZANTINE MUSICAL SYMBOL CHAMILI;So;0;L;;;;;N;;;;; 1D057;BYZANTINE MUSICAL SYMBOL MIKRON ISON;So;0;L;;;;;N;;;;; 1D058;BYZANTINE MUSICAL SYMBOL VAREIA NEO;So;0;L;;;;;N;;;;; 1D059;BYZANTINE MUSICAL SYMBOL PIASMA NEO;So;0;L;;;;;N;;;;; 1D05A;BYZANTINE MUSICAL SYMBOL PSIFISTON NEO;So;0;L;;;;;N;;;;; 1D05B;BYZANTINE MUSICAL SYMBOL OMALON;So;0;L;;;;;N;;;;; 1D05C;BYZANTINE MUSICAL SYMBOL ANTIKENOMA;So;0;L;;;;;N;;;;; 1D05D;BYZANTINE MUSICAL SYMBOL LYGISMA;So;0;L;;;;;N;;;;; 1D05E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO;So;0;L;;;;;N;;;;; 1D05F;BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO;So;0;L;;;;;N;;;;; 1D060;BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA;So;0;L;;;;;N;;;;; 1D061;BYZANTINE MUSICAL SYMBOL KYLISMA;So;0;L;;;;;N;;;;; 1D062;BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA;So;0;L;;;;;N;;;;; 1D063;BYZANTINE MUSICAL SYMBOL TROMIKON NEO;So;0;L;;;;;N;;;;; 1D064;BYZANTINE MUSICAL SYMBOL EKSTREPTON;So;0;L;;;;;N;;;;; 1D065;BYZANTINE MUSICAL SYMBOL SYNAGMA NEO;So;0;L;;;;;N;;;;; 1D066;BYZANTINE MUSICAL SYMBOL SYRMA;So;0;L;;;;;N;;;;; 1D067;BYZANTINE MUSICAL SYMBOL CHOREVMA NEO;So;0;L;;;;;N;;;;; 1D068;BYZANTINE MUSICAL SYMBOL EPEGERMA;So;0;L;;;;;N;;;;; 1D069;BYZANTINE MUSICAL SYMBOL SEISMA NEO;So;0;L;;;;;N;;;;; 1D06A;BYZANTINE MUSICAL SYMBOL XIRON KLASMA;So;0;L;;;;;N;;;;; 1D06B;BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON;So;0;L;;;;;N;;;;; 1D06C;BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA;So;0;L;;;;;N;;;;; 1D06D;BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA;So;0;L;;;;;N;;;;; 1D06E;BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA;So;0;L;;;;;N;;;;; 1D06F;BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA;So;0;L;;;;;N;;;;; 1D070;BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA;So;0;L;;;;;N;;;;; 1D071;BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA;So;0;L;;;;;N;;;;; 1D072;BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON;So;0;L;;;;;N;;;;; 1D073;BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON;So;0;L;;;;;N;;;;; 1D074;BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON;So;0;L;;;;;N;;;;; 1D075;BYZANTINE MUSICAL SYMBOL OYRANISMA NEO;So;0;L;;;;;N;;;;; 1D076;BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO;So;0;L;;;;;N;;;;; 1D077;BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO;So;0;L;;;;;N;;;;; 1D078;BYZANTINE MUSICAL SYMBOL THEMA APLOUN;So;0;L;;;;;N;;;;; 1D079;BYZANTINE MUSICAL SYMBOL THES KAI APOTHES;So;0;L;;;;;N;;;;; 1D07A;BYZANTINE MUSICAL SYMBOL KATAVASMA;So;0;L;;;;;N;;;;; 1D07B;BYZANTINE MUSICAL SYMBOL ENDOFONON;So;0;L;;;;;N;;;;; 1D07C;BYZANTINE MUSICAL SYMBOL YFEN KATO;So;0;L;;;;;N;;;;; 1D07D;BYZANTINE MUSICAL SYMBOL YFEN ANO;So;0;L;;;;;N;;;;; 1D07E;BYZANTINE MUSICAL SYMBOL STAVROS;So;0;L;;;;;N;;;;; 1D07F;BYZANTINE MUSICAL SYMBOL KLASMA ANO;So;0;L;;;;;N;;;;; 1D080;BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION;So;0;L;;;;;N;;;;; 1D081;BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION;So;0;L;;;;;N;;;;; 1D082;BYZANTINE MUSICAL SYMBOL KRATIMA ALLO;So;0;L;;;;;N;;;;; 1D083;BYZANTINE MUSICAL SYMBOL KRATIMA NEO;So;0;L;;;;;N;;;;; 1D084;BYZANTINE MUSICAL SYMBOL APODERMA NEO;So;0;L;;;;;N;;;;; 1D085;BYZANTINE MUSICAL SYMBOL APLI;So;0;L;;;;;N;;;;; 1D086;BYZANTINE MUSICAL SYMBOL DIPLI;So;0;L;;;;;N;;;;; 1D087;BYZANTINE MUSICAL SYMBOL TRIPLI;So;0;L;;;;;N;;;;; 1D088;BYZANTINE MUSICAL SYMBOL TETRAPLI;So;0;L;;;;;N;;;;; 1D089;BYZANTINE MUSICAL SYMBOL KORONIS;So;0;L;;;;;N;;;;; 1D08A;BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU;So;0;L;;;;;N;;;;; 1D08B;BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON;So;0;L;;;;;N;;;;; 1D08C;BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON;So;0;L;;;;;N;;;;; 1D08D;BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON;So;0;L;;;;;N;;;;; 1D08E;BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU;So;0;L;;;;;N;;;;; 1D08F;BYZANTINE MUSICAL SYMBOL GORGON NEO ANO;So;0;L;;;;;N;;;;; 1D090;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA;So;0;L;;;;;N;;;;; 1D091;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; 1D092;BYZANTINE MUSICAL SYMBOL DIGORGON;So;0;L;;;;;N;;;;; 1D093;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO;So;0;L;;;;;N;;;;; 1D094;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO;So;0;L;;;;;N;;;;; 1D095;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; 1D096;BYZANTINE MUSICAL SYMBOL TRIGORGON;So;0;L;;;;;N;;;;; 1D097;BYZANTINE MUSICAL SYMBOL ARGON;So;0;L;;;;;N;;;;; 1D098;BYZANTINE MUSICAL SYMBOL IMIDIARGON;So;0;L;;;;;N;;;;; 1D099;BYZANTINE MUSICAL SYMBOL DIARGON;So;0;L;;;;;N;;;;; 1D09A;BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI;So;0;L;;;;;N;;;;; 1D09B;BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI;So;0;L;;;;;N;;;;; 1D09C;BYZANTINE MUSICAL SYMBOL AGOGI ARGI;So;0;L;;;;;N;;;;; 1D09D;BYZANTINE MUSICAL SYMBOL AGOGI METRIA;So;0;L;;;;;N;;;;; 1D09E;BYZANTINE MUSICAL SYMBOL AGOGI MESI;So;0;L;;;;;N;;;;; 1D09F;BYZANTINE MUSICAL SYMBOL AGOGI GORGI;So;0;L;;;;;N;;;;; 1D0A0;BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI;So;0;L;;;;;N;;;;; 1D0A1;BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI;So;0;L;;;;;N;;;;; 1D0A2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS;So;0;L;;;;;N;;;;; 1D0A3;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS;So;0;L;;;;;N;;;;; 1D0A4;BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS;So;0;L;;;;;N;;;;; 1D0A5;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS;So;0;L;;;;;N;;;;; 1D0A6;BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS;So;0;L;;;;;N;;;;; 1D0A7;BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS;So;0;L;;;;;N;;;;; 1D0A8;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS;So;0;L;;;;;N;;;;; 1D0A9;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS;So;0;L;;;;;N;;;;; 1D0AA;BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS;So;0;L;;;;;N;;;;; 1D0AB;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS;So;0;L;;;;;N;;;;; 1D0AC;BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; 1D0AD;BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; 1D0AE;BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS;So;0;L;;;;;N;;;;; 1D0AF;BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS;So;0;L;;;;;N;;;;; 1D0B0;BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS;So;0;L;;;;;N;;;;; 1D0B1;BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS;So;0;L;;;;;N;;;;; 1D0B2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS;So;0;L;;;;;N;;;;; 1D0B3;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS;So;0;L;;;;;N;;;;; 1D0B4;BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN;So;0;L;;;;;N;;;;; 1D0B5;BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN;So;0;L;;;;;N;;;;; 1D0B6;BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU;So;0;L;;;;;N;;;;; 1D0B7;BYZANTINE MUSICAL SYMBOL IMIFONON;So;0;L;;;;;N;;;;; 1D0B8;BYZANTINE MUSICAL SYMBOL IMIFTHORON;So;0;L;;;;;N;;;;; 1D0B9;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU;So;0;L;;;;;N;;;;; 1D0BA;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA;So;0;L;;;;;N;;;;; 1D0BB;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA;So;0;L;;;;;N;;;;; 1D0BC;BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS;So;0;L;;;;;N;;;;; 1D0BD;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI;So;0;L;;;;;N;;;;; 1D0BE;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI;So;0;L;;;;;N;;;;; 1D0BF;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE;So;0;L;;;;;N;;;;; 1D0C0;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO;So;0;L;;;;;N;;;;; 1D0C1;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO;So;0;L;;;;;N;;;;; 1D0C2;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO;So;0;L;;;;;N;;;;; 1D0C3;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS;So;0;L;;;;;N;;;;; 1D0C4;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS;So;0;L;;;;;N;;;;; 1D0C5;BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS;So;0;L;;;;;N;;;;; 1D0C6;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI;So;0;L;;;;;N;;;;; 1D0C7;BYZANTINE MUSICAL SYMBOL FTHORA NENANO;So;0;L;;;;;N;;;;; 1D0C8;BYZANTINE MUSICAL SYMBOL CHROA ZYGOS;So;0;L;;;;;N;;;;; 1D0C9;BYZANTINE MUSICAL SYMBOL CHROA KLITON;So;0;L;;;;;N;;;;; 1D0CA;BYZANTINE MUSICAL SYMBOL CHROA SPATHI;So;0;L;;;;;N;;;;; 1D0CB;BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION;So;0;L;;;;;N;;;;; 1D0CC;BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA;So;0;L;;;;;N;;;;; 1D0CD;BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION;So;0;L;;;;;N;;;;; 1D0CE;BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION;So;0;L;;;;;N;;;;; 1D0CF;BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION;So;0;L;;;;;N;;;;; 1D0D0;BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; 1D0D1;BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; 1D0D2;BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; 1D0D3;BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; 1D0D4;BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; 1D0D5;BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; 1D0D6;BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; 1D0D7;BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; 1D0D8;BYZANTINE MUSICAL SYMBOL GENIKI DIESIS;So;0;L;;;;;N;;;;; 1D0D9;BYZANTINE MUSICAL SYMBOL GENIKI YFESIS;So;0;L;;;;;N;;;;; 1D0DA;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI;So;0;L;;;;;N;;;;; 1D0DB;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI;So;0;L;;;;;N;;;;; 1D0DC;BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI;So;0;L;;;;;N;;;;; 1D0DD;BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS;So;0;L;;;;;N;;;;; 1D0DE;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS;So;0;L;;;;;N;;;;; 1D0DF;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU;So;0;L;;;;;N;;;;; 1D0E0;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU;So;0;L;;;;;N;;;;; 1D0E1;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU;So;0;L;;;;;N;;;;; 1D0E2;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS;So;0;L;;;;;N;;;;; 1D0E3;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU;So;0;L;;;;;N;;;;; 1D0E4;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU;So;0;L;;;;;N;;;;; 1D0E5;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU;So;0;L;;;;;N;;;;; 1D0E6;BYZANTINE MUSICAL SYMBOL DIGRAMMA GG;So;0;L;;;;;N;;;;; 1D0E7;BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU;So;0;L;;;;;N;;;;; 1D0E8;BYZANTINE MUSICAL SYMBOL STIGMA;So;0;L;;;;;N;;;;; 1D0E9;BYZANTINE MUSICAL SYMBOL ARKTIKO PA;So;0;L;;;;;N;;;;; 1D0EA;BYZANTINE MUSICAL SYMBOL ARKTIKO VOU;So;0;L;;;;;N;;;;; 1D0EB;BYZANTINE MUSICAL SYMBOL ARKTIKO GA;So;0;L;;;;;N;;;;; 1D0EC;BYZANTINE MUSICAL SYMBOL ARKTIKO DI;So;0;L;;;;;N;;;;; 1D0ED;BYZANTINE MUSICAL SYMBOL ARKTIKO KE;So;0;L;;;;;N;;;;; 1D0EE;BYZANTINE MUSICAL SYMBOL ARKTIKO ZO;So;0;L;;;;;N;;;;; 1D0EF;BYZANTINE MUSICAL SYMBOL ARKTIKO NI;So;0;L;;;;;N;;;;; 1D0F0;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO;So;0;L;;;;;N;;;;; 1D0F1;BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO;So;0;L;;;;;N;;;;; 1D0F2;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO;So;0;L;;;;;N;;;;; 1D0F3;BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO;So;0;L;;;;;N;;;;; 1D0F4;BYZANTINE MUSICAL SYMBOL KLASMA KATO;So;0;L;;;;;N;;;;; 1D0F5;BYZANTINE MUSICAL SYMBOL GORGON NEO KATO;So;0;L;;;;;N;;;;; 1D100;MUSICAL SYMBOL SINGLE BARLINE;So;0;L;;;;;N;;;;; 1D101;MUSICAL SYMBOL DOUBLE BARLINE;So;0;L;;;;;N;;;;; 1D102;MUSICAL SYMBOL FINAL BARLINE;So;0;L;;;;;N;;;;; 1D103;MUSICAL SYMBOL REVERSE FINAL BARLINE;So;0;L;;;;;N;;;;; 1D104;MUSICAL SYMBOL DASHED BARLINE;So;0;L;;;;;N;;;;; 1D105;MUSICAL SYMBOL SHORT BARLINE;So;0;L;;;;;N;;;;; 1D106;MUSICAL SYMBOL LEFT REPEAT SIGN;So;0;L;;;;;N;;;;; 1D107;MUSICAL SYMBOL RIGHT REPEAT SIGN;So;0;L;;;;;N;;;;; 1D108;MUSICAL SYMBOL REPEAT DOTS;So;0;L;;;;;N;;;;; 1D109;MUSICAL SYMBOL DAL SEGNO;So;0;L;;;;;N;;;;; 1D10A;MUSICAL SYMBOL DA CAPO;So;0;L;;;;;N;;;;; 1D10B;MUSICAL SYMBOL SEGNO;So;0;L;;;;;N;;;;; 1D10C;MUSICAL SYMBOL CODA;So;0;L;;;;;N;;;;; 1D10D;MUSICAL SYMBOL REPEATED FIGURE-1;So;0;L;;;;;N;;;;; 1D10E;MUSICAL SYMBOL REPEATED FIGURE-2;So;0;L;;;;;N;;;;; 1D10F;MUSICAL SYMBOL REPEATED FIGURE-3;So;0;L;;;;;N;;;;; 1D110;MUSICAL SYMBOL FERMATA;So;0;L;;;;;N;;;;; 1D111;MUSICAL SYMBOL FERMATA BELOW;So;0;L;;;;;N;;;;; 1D112;MUSICAL SYMBOL BREATH MARK;So;0;L;;;;;N;;;;; 1D113;MUSICAL SYMBOL CAESURA;So;0;L;;;;;N;;;;; 1D114;MUSICAL SYMBOL BRACE;So;0;L;;;;;N;;;;; 1D115;MUSICAL SYMBOL BRACKET;So;0;L;;;;;N;;;;; 1D116;MUSICAL SYMBOL ONE-LINE STAFF;So;0;L;;;;;N;;;;; 1D117;MUSICAL SYMBOL TWO-LINE STAFF;So;0;L;;;;;N;;;;; 1D118;MUSICAL SYMBOL THREE-LINE STAFF;So;0;L;;;;;N;;;;; 1D119;MUSICAL SYMBOL FOUR-LINE STAFF;So;0;L;;;;;N;;;;; 1D11A;MUSICAL SYMBOL FIVE-LINE STAFF;So;0;L;;;;;N;;;;; 1D11B;MUSICAL SYMBOL SIX-LINE STAFF;So;0;L;;;;;N;;;;; 1D11C;MUSICAL SYMBOL SIX-STRING FRETBOARD;So;0;L;;;;;N;;;;; 1D11D;MUSICAL SYMBOL FOUR-STRING FRETBOARD;So;0;L;;;;;N;;;;; 1D11E;MUSICAL SYMBOL G CLEF;So;0;L;;;;;N;;;;; 1D11F;MUSICAL SYMBOL G CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; 1D120;MUSICAL SYMBOL G CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; 1D121;MUSICAL SYMBOL C CLEF;So;0;L;;;;;N;;;;; 1D122;MUSICAL SYMBOL F CLEF;So;0;L;;;;;N;;;;; 1D123;MUSICAL SYMBOL F CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; 1D124;MUSICAL SYMBOL F CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; 1D125;MUSICAL SYMBOL DRUM CLEF-1;So;0;L;;;;;N;;;;; 1D126;MUSICAL SYMBOL DRUM CLEF-2;So;0;L;;;;;N;;;;; 1D129;MUSICAL SYMBOL MULTIPLE MEASURE REST;So;0;L;;;;;N;;;;; 1D12A;MUSICAL SYMBOL DOUBLE SHARP;So;0;L;;;;;N;;;;; 1D12B;MUSICAL SYMBOL DOUBLE FLAT;So;0;L;;;;;N;;;;; 1D12C;MUSICAL SYMBOL FLAT UP;So;0;L;;;;;N;;;;; 1D12D;MUSICAL SYMBOL FLAT DOWN;So;0;L;;;;;N;;;;; 1D12E;MUSICAL SYMBOL NATURAL UP;So;0;L;;;;;N;;;;; 1D12F;MUSICAL SYMBOL NATURAL DOWN;So;0;L;;;;;N;;;;; 1D130;MUSICAL SYMBOL SHARP UP;So;0;L;;;;;N;;;;; 1D131;MUSICAL SYMBOL SHARP DOWN;So;0;L;;;;;N;;;;; 1D132;MUSICAL SYMBOL QUARTER TONE SHARP;So;0;L;;;;;N;;;;; 1D133;MUSICAL SYMBOL QUARTER TONE FLAT;So;0;L;;;;;N;;;;; 1D134;MUSICAL SYMBOL COMMON TIME;So;0;L;;;;;N;;;;; 1D135;MUSICAL SYMBOL CUT TIME;So;0;L;;;;;N;;;;; 1D136;MUSICAL SYMBOL OTTAVA ALTA;So;0;L;;;;;N;;;;; 1D137;MUSICAL SYMBOL OTTAVA BASSA;So;0;L;;;;;N;;;;; 1D138;MUSICAL SYMBOL QUINDICESIMA ALTA;So;0;L;;;;;N;;;;; 1D139;MUSICAL SYMBOL QUINDICESIMA BASSA;So;0;L;;;;;N;;;;; 1D13A;MUSICAL SYMBOL MULTI REST;So;0;L;;;;;N;;;;; 1D13B;MUSICAL SYMBOL WHOLE REST;So;0;L;;;;;N;;;;; 1D13C;MUSICAL SYMBOL HALF REST;So;0;L;;;;;N;;;;; 1D13D;MUSICAL SYMBOL QUARTER REST;So;0;L;;;;;N;;;;; 1D13E;MUSICAL SYMBOL EIGHTH REST;So;0;L;;;;;N;;;;; 1D13F;MUSICAL SYMBOL SIXTEENTH REST;So;0;L;;;;;N;;;;; 1D140;MUSICAL SYMBOL THIRTY-SECOND REST;So;0;L;;;;;N;;;;; 1D141;MUSICAL SYMBOL SIXTY-FOURTH REST;So;0;L;;;;;N;;;;; 1D142;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST;So;0;L;;;;;N;;;;; 1D143;MUSICAL SYMBOL X NOTEHEAD;So;0;L;;;;;N;;;;; 1D144;MUSICAL SYMBOL PLUS NOTEHEAD;So;0;L;;;;;N;;;;; 1D145;MUSICAL SYMBOL CIRCLE X NOTEHEAD;So;0;L;;;;;N;;;;; 1D146;MUSICAL SYMBOL SQUARE NOTEHEAD WHITE;So;0;L;;;;;N;;;;; 1D147;MUSICAL SYMBOL SQUARE NOTEHEAD BLACK;So;0;L;;;;;N;;;;; 1D148;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE;So;0;L;;;;;N;;;;; 1D149;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK;So;0;L;;;;;N;;;;; 1D14A;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE;So;0;L;;;;;N;;;;; 1D14B;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK;So;0;L;;;;;N;;;;; 1D14C;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE;So;0;L;;;;;N;;;;; 1D14D;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK;So;0;L;;;;;N;;;;; 1D14E;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; 1D14F;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; 1D150;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE;So;0;L;;;;;N;;;;; 1D151;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK;So;0;L;;;;;N;;;;; 1D152;MUSICAL SYMBOL MOON NOTEHEAD WHITE;So;0;L;;;;;N;;;;; 1D153;MUSICAL SYMBOL MOON NOTEHEAD BLACK;So;0;L;;;;;N;;;;; 1D154;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; 1D155;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; 1D156;MUSICAL SYMBOL PARENTHESIS NOTEHEAD;So;0;L;;;;;N;;;;; 1D157;MUSICAL SYMBOL VOID NOTEHEAD;So;0;L;;;;;N;;;;; 1D158;MUSICAL SYMBOL NOTEHEAD BLACK;So;0;L;;;;;N;;;;; 1D159;MUSICAL SYMBOL NULL NOTEHEAD;So;0;L;;;;;N;;;;; 1D15A;MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE;So;0;L;;;;;N;;;;; 1D15B;MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK;So;0;L;;;;;N;;;;; 1D15C;MUSICAL SYMBOL BREVE;So;0;L;;;;;N;;;;; 1D15D;MUSICAL SYMBOL WHOLE NOTE;So;0;L;;;;;N;;;;; 1D15E;MUSICAL SYMBOL HALF NOTE;So;0;L;1D157 1D165;;;;N;;;;; 1D15F;MUSICAL SYMBOL QUARTER NOTE;So;0;L;1D158 1D165;;;;N;;;;; 1D160;MUSICAL SYMBOL EIGHTH NOTE;So;0;L;1D15F 1D16E;;;;N;;;;; 1D161;MUSICAL SYMBOL SIXTEENTH NOTE;So;0;L;1D15F 1D16F;;;;N;;;;; 1D162;MUSICAL SYMBOL THIRTY-SECOND NOTE;So;0;L;1D15F 1D170;;;;N;;;;; 1D163;MUSICAL SYMBOL SIXTY-FOURTH NOTE;So;0;L;1D15F 1D171;;;;N;;;;; 1D164;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE;So;0;L;1D15F 1D172;;;;N;;;;; 1D165;MUSICAL SYMBOL COMBINING STEM;Mc;216;L;;;;;N;;;;; 1D166;MUSICAL SYMBOL COMBINING SPRECHGESANG STEM;Mc;216;L;;;;;N;;;;; 1D167;MUSICAL SYMBOL COMBINING TREMOLO-1;Mn;1;NSM;;;;;N;;;;; 1D168;MUSICAL SYMBOL COMBINING TREMOLO-2;Mn;1;NSM;;;;;N;;;;; 1D169;MUSICAL SYMBOL COMBINING TREMOLO-3;Mn;1;NSM;;;;;N;;;;; 1D16A;MUSICAL SYMBOL FINGERED TREMOLO-1;So;0;L;;;;;N;;;;; 1D16B;MUSICAL SYMBOL FINGERED TREMOLO-2;So;0;L;;;;;N;;;;; 1D16C;MUSICAL SYMBOL FINGERED TREMOLO-3;So;0;L;;;;;N;;;;; 1D16D;MUSICAL SYMBOL COMBINING AUGMENTATION DOT;Mc;226;L;;;;;N;;;;; 1D16E;MUSICAL SYMBOL COMBINING FLAG-1;Mc;216;L;;;;;N;;;;; 1D16F;MUSICAL SYMBOL COMBINING FLAG-2;Mc;216;L;;;;;N;;;;; 1D170;MUSICAL SYMBOL COMBINING FLAG-3;Mc;216;L;;;;;N;;;;; 1D171;MUSICAL SYMBOL COMBINING FLAG-4;Mc;216;L;;;;;N;;;;; 1D172;MUSICAL SYMBOL COMBINING FLAG-5;Mc;216;L;;;;;N;;;;; 1D173;MUSICAL SYMBOL BEGIN BEAM;Cf;0;BN;;;;;N;;;;; 1D174;MUSICAL SYMBOL END BEAM;Cf;0;BN;;;;;N;;;;; 1D175;MUSICAL SYMBOL BEGIN TIE;Cf;0;BN;;;;;N;;;;; 1D176;MUSICAL SYMBOL END TIE;Cf;0;BN;;;;;N;;;;; 1D177;MUSICAL SYMBOL BEGIN SLUR;Cf;0;BN;;;;;N;;;;; 1D178;MUSICAL SYMBOL END SLUR;Cf;0;BN;;;;;N;;;;; 1D179;MUSICAL SYMBOL BEGIN PHRASE;Cf;0;BN;;;;;N;;;;; 1D17A;MUSICAL SYMBOL END PHRASE;Cf;0;BN;;;;;N;;;;; 1D17B;MUSICAL SYMBOL COMBINING ACCENT;Mn;220;NSM;;;;;N;;;;; 1D17C;MUSICAL SYMBOL COMBINING STACCATO;Mn;220;NSM;;;;;N;;;;; 1D17D;MUSICAL SYMBOL COMBINING TENUTO;Mn;220;NSM;;;;;N;;;;; 1D17E;MUSICAL SYMBOL COMBINING STACCATISSIMO;Mn;220;NSM;;;;;N;;;;; 1D17F;MUSICAL SYMBOL COMBINING MARCATO;Mn;220;NSM;;;;;N;;;;; 1D180;MUSICAL SYMBOL COMBINING MARCATO-STACCATO;Mn;220;NSM;;;;;N;;;;; 1D181;MUSICAL SYMBOL COMBINING ACCENT-STACCATO;Mn;220;NSM;;;;;N;;;;; 1D182;MUSICAL SYMBOL COMBINING LOURE;Mn;220;NSM;;;;;N;;;;; 1D183;MUSICAL SYMBOL ARPEGGIATO UP;So;0;L;;;;;N;;;;; 1D184;MUSICAL SYMBOL ARPEGGIATO DOWN;So;0;L;;;;;N;;;;; 1D185;MUSICAL SYMBOL COMBINING DOIT;Mn;230;NSM;;;;;N;;;;; 1D186;MUSICAL SYMBOL COMBINING RIP;Mn;230;NSM;;;;;N;;;;; 1D187;MUSICAL SYMBOL COMBINING FLIP;Mn;230;NSM;;;;;N;;;;; 1D188;MUSICAL SYMBOL COMBINING SMEAR;Mn;230;NSM;;;;;N;;;;; 1D189;MUSICAL SYMBOL COMBINING BEND;Mn;230;NSM;;;;;N;;;;; 1D18A;MUSICAL SYMBOL COMBINING DOUBLE TONGUE;Mn;220;NSM;;;;;N;;;;; 1D18B;MUSICAL SYMBOL COMBINING TRIPLE TONGUE;Mn;220;NSM;;;;;N;;;;; 1D18C;MUSICAL SYMBOL RINFORZANDO;So;0;L;;;;;N;;;;; 1D18D;MUSICAL SYMBOL SUBITO;So;0;L;;;;;N;;;;; 1D18E;MUSICAL SYMBOL Z;So;0;L;;;;;N;;;;; 1D18F;MUSICAL SYMBOL PIANO;So;0;L;;;;;N;;;;; 1D190;MUSICAL SYMBOL MEZZO;So;0;L;;;;;N;;;;; 1D191;MUSICAL SYMBOL FORTE;So;0;L;;;;;N;;;;; 1D192;MUSICAL SYMBOL CRESCENDO;So;0;L;;;;;N;;;;; 1D193;MUSICAL SYMBOL DECRESCENDO;So;0;L;;;;;N;;;;; 1D194;MUSICAL SYMBOL GRACE NOTE SLASH;So;0;L;;;;;N;;;;; 1D195;MUSICAL SYMBOL GRACE NOTE NO SLASH;So;0;L;;;;;N;;;;; 1D196;MUSICAL SYMBOL TR;So;0;L;;;;;N;;;;; 1D197;MUSICAL SYMBOL TURN;So;0;L;;;;;N;;;;; 1D198;MUSICAL SYMBOL INVERTED TURN;So;0;L;;;;;N;;;;; 1D199;MUSICAL SYMBOL TURN SLASH;So;0;L;;;;;N;;;;; 1D19A;MUSICAL SYMBOL TURN UP;So;0;L;;;;;N;;;;; 1D19B;MUSICAL SYMBOL ORNAMENT STROKE-1;So;0;L;;;;;N;;;;; 1D19C;MUSICAL SYMBOL ORNAMENT STROKE-2;So;0;L;;;;;N;;;;; 1D19D;MUSICAL SYMBOL ORNAMENT STROKE-3;So;0;L;;;;;N;;;;; 1D19E;MUSICAL SYMBOL ORNAMENT STROKE-4;So;0;L;;;;;N;;;;; 1D19F;MUSICAL SYMBOL ORNAMENT STROKE-5;So;0;L;;;;;N;;;;; 1D1A0;MUSICAL SYMBOL ORNAMENT STROKE-6;So;0;L;;;;;N;;;;; 1D1A1;MUSICAL SYMBOL ORNAMENT STROKE-7;So;0;L;;;;;N;;;;; 1D1A2;MUSICAL SYMBOL ORNAMENT STROKE-8;So;0;L;;;;;N;;;;; 1D1A3;MUSICAL SYMBOL ORNAMENT STROKE-9;So;0;L;;;;;N;;;;; 1D1A4;MUSICAL SYMBOL ORNAMENT STROKE-10;So;0;L;;;;;N;;;;; 1D1A5;MUSICAL SYMBOL ORNAMENT STROKE-11;So;0;L;;;;;N;;;;; 1D1A6;MUSICAL SYMBOL HAUPTSTIMME;So;0;L;;;;;N;;;;; 1D1A7;MUSICAL SYMBOL NEBENSTIMME;So;0;L;;;;;N;;;;; 1D1A8;MUSICAL SYMBOL END OF STIMME;So;0;L;;;;;N;;;;; 1D1A9;MUSICAL SYMBOL DEGREE SLASH;So;0;L;;;;;N;;;;; 1D1AA;MUSICAL SYMBOL COMBINING DOWN BOW;Mn;230;NSM;;;;;N;;;;; 1D1AB;MUSICAL SYMBOL COMBINING UP BOW;Mn;230;NSM;;;;;N;;;;; 1D1AC;MUSICAL SYMBOL COMBINING HARMONIC;Mn;230;NSM;;;;;N;;;;; 1D1AD;MUSICAL SYMBOL COMBINING SNAP PIZZICATO;Mn;230;NSM;;;;;N;;;;; 1D1AE;MUSICAL SYMBOL PEDAL MARK;So;0;L;;;;;N;;;;; 1D1AF;MUSICAL SYMBOL PEDAL UP MARK;So;0;L;;;;;N;;;;; 1D1B0;MUSICAL SYMBOL HALF PEDAL MARK;So;0;L;;;;;N;;;;; 1D1B1;MUSICAL SYMBOL GLISSANDO UP;So;0;L;;;;;N;;;;; 1D1B2;MUSICAL SYMBOL GLISSANDO DOWN;So;0;L;;;;;N;;;;; 1D1B3;MUSICAL SYMBOL WITH FINGERNAILS;So;0;L;;;;;N;;;;; 1D1B4;MUSICAL SYMBOL DAMP;So;0;L;;;;;N;;;;; 1D1B5;MUSICAL SYMBOL DAMP ALL;So;0;L;;;;;N;;;;; 1D1B6;MUSICAL SYMBOL MAXIMA;So;0;L;;;;;N;;;;; 1D1B7;MUSICAL SYMBOL LONGA;So;0;L;;;;;N;;;;; 1D1B8;MUSICAL SYMBOL BREVIS;So;0;L;;;;;N;;;;; 1D1B9;MUSICAL SYMBOL SEMIBREVIS WHITE;So;0;L;;;;;N;;;;; 1D1BA;MUSICAL SYMBOL SEMIBREVIS BLACK;So;0;L;;;;;N;;;;; 1D1BB;MUSICAL SYMBOL MINIMA;So;0;L;1D1B9 1D165;;;;N;;;;; 1D1BC;MUSICAL SYMBOL MINIMA BLACK;So;0;L;1D1BA 1D165;;;;N;;;;; 1D1BD;MUSICAL SYMBOL SEMIMINIMA WHITE;So;0;L;1D1BB 1D16E;;;;N;;;;; 1D1BE;MUSICAL SYMBOL SEMIMINIMA BLACK;So;0;L;1D1BC 1D16E;;;;N;;;;; 1D1BF;MUSICAL SYMBOL FUSA WHITE;So;0;L;1D1BB 1D16F;;;;N;;;;; 1D1C0;MUSICAL SYMBOL FUSA BLACK;So;0;L;1D1BC 1D16F;;;;N;;;;; 1D1C1;MUSICAL SYMBOL LONGA PERFECTA REST;So;0;L;;;;;N;;;;; 1D1C2;MUSICAL SYMBOL LONGA IMPERFECTA REST;So;0;L;;;;;N;;;;; 1D1C3;MUSICAL SYMBOL BREVIS REST;So;0;L;;;;;N;;;;; 1D1C4;MUSICAL SYMBOL SEMIBREVIS REST;So;0;L;;;;;N;;;;; 1D1C5;MUSICAL SYMBOL MINIMA REST;So;0;L;;;;;N;;;;; 1D1C6;MUSICAL SYMBOL SEMIMINIMA REST;So;0;L;;;;;N;;;;; 1D1C7;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; 1D1C8;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; 1D1C9;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; 1D1CA;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; 1D1CB;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; 1D1CC;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; 1D1CD;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2;So;0;L;;;;;N;;;;; 1D1CE;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3;So;0;L;;;;;N;;;;; 1D1CF;MUSICAL SYMBOL CROIX;So;0;L;;;;;N;;;;; 1D1D0;MUSICAL SYMBOL GREGORIAN C CLEF;So;0;L;;;;;N;;;;; 1D1D1;MUSICAL SYMBOL GREGORIAN F CLEF;So;0;L;;;;;N;;;;; 1D1D2;MUSICAL SYMBOL SQUARE B;So;0;L;;;;;N;;;;; 1D1D3;MUSICAL SYMBOL VIRGA;So;0;L;;;;;N;;;;; 1D1D4;MUSICAL SYMBOL PODATUS;So;0;L;;;;;N;;;;; 1D1D5;MUSICAL SYMBOL CLIVIS;So;0;L;;;;;N;;;;; 1D1D6;MUSICAL SYMBOL SCANDICUS;So;0;L;;;;;N;;;;; 1D1D7;MUSICAL SYMBOL CLIMACUS;So;0;L;;;;;N;;;;; 1D1D8;MUSICAL SYMBOL TORCULUS;So;0;L;;;;;N;;;;; 1D1D9;MUSICAL SYMBOL PORRECTUS;So;0;L;;;;;N;;;;; 1D1DA;MUSICAL SYMBOL PORRECTUS FLEXUS;So;0;L;;;;;N;;;;; 1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;; 1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;; 1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;; 1D1DE;MUSICAL SYMBOL KIEVAN C CLEF;So;0;L;;;;;N;;;;; 1D1DF;MUSICAL SYMBOL KIEVAN END OF PIECE;So;0;L;;;;;N;;;;; 1D1E0;MUSICAL SYMBOL KIEVAN FINAL NOTE;So;0;L;;;;;N;;;;; 1D1E1;MUSICAL SYMBOL KIEVAN RECITATIVE MARK;So;0;L;;;;;N;;;;; 1D1E2;MUSICAL SYMBOL KIEVAN WHOLE NOTE;So;0;L;;;;;N;;;;; 1D1E3;MUSICAL SYMBOL KIEVAN HALF NOTE;So;0;L;;;;;N;;;;; 1D1E4;MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM DOWN;So;0;L;;;;;N;;;;; 1D1E5;MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM UP;So;0;L;;;;;N;;;;; 1D1E6;MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM DOWN;So;0;L;;;;;N;;;;; 1D1E7;MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM UP;So;0;L;;;;;N;;;;; 1D1E8;MUSICAL SYMBOL KIEVAN FLAT SIGN;So;0;L;;;;;N;;;;; 1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; 1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; 1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;; 1D203;GREEK VOCAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; 1D204;GREEK VOCAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; 1D205;GREEK VOCAL NOTATION SYMBOL-6;So;0;ON;;;;;N;;;;; 1D206;GREEK VOCAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; 1D207;GREEK VOCAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; 1D208;GREEK VOCAL NOTATION SYMBOL-9;So;0;ON;;;;;N;;;;; 1D209;GREEK VOCAL NOTATION SYMBOL-10;So;0;ON;;;;;N;;;;; 1D20A;GREEK VOCAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; 1D20B;GREEK VOCAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; 1D20C;GREEK VOCAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; 1D20D;GREEK VOCAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; 1D20E;GREEK VOCAL NOTATION SYMBOL-15;So;0;ON;;;;;N;;;;; 1D20F;GREEK VOCAL NOTATION SYMBOL-16;So;0;ON;;;;;N;;;;; 1D210;GREEK VOCAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; 1D211;GREEK VOCAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; 1D212;GREEK VOCAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; 1D213;GREEK VOCAL NOTATION SYMBOL-20;So;0;ON;;;;;N;;;;; 1D214;GREEK VOCAL NOTATION SYMBOL-21;So;0;ON;;;;;N;;;;; 1D215;GREEK VOCAL NOTATION SYMBOL-22;So;0;ON;;;;;N;;;;; 1D216;GREEK VOCAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; 1D217;GREEK VOCAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; 1D218;GREEK VOCAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; 1D219;GREEK VOCAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; 1D21A;GREEK VOCAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; 1D21B;GREEK VOCAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; 1D21C;GREEK VOCAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; 1D21D;GREEK INSTRUMENTAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; 1D21E;GREEK INSTRUMENTAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; 1D21F;GREEK INSTRUMENTAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; 1D220;GREEK INSTRUMENTAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; 1D221;GREEK INSTRUMENTAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; 1D222;GREEK INSTRUMENTAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; 1D223;GREEK INSTRUMENTAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; 1D224;GREEK INSTRUMENTAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; 1D225;GREEK INSTRUMENTAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; 1D226;GREEK INSTRUMENTAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; 1D227;GREEK INSTRUMENTAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; 1D228;GREEK INSTRUMENTAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; 1D229;GREEK INSTRUMENTAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; 1D22A;GREEK INSTRUMENTAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; 1D22B;GREEK INSTRUMENTAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; 1D22C;GREEK INSTRUMENTAL NOTATION SYMBOL-25;So;0;ON;;;;;N;;;;; 1D22D;GREEK INSTRUMENTAL NOTATION SYMBOL-26;So;0;ON;;;;;N;;;;; 1D22E;GREEK INSTRUMENTAL NOTATION SYMBOL-27;So;0;ON;;;;;N;;;;; 1D22F;GREEK INSTRUMENTAL NOTATION SYMBOL-29;So;0;ON;;;;;N;;;;; 1D230;GREEK INSTRUMENTAL NOTATION SYMBOL-30;So;0;ON;;;;;N;;;;; 1D231;GREEK INSTRUMENTAL NOTATION SYMBOL-32;So;0;ON;;;;;N;;;;; 1D232;GREEK INSTRUMENTAL NOTATION SYMBOL-36;So;0;ON;;;;;N;;;;; 1D233;GREEK INSTRUMENTAL NOTATION SYMBOL-37;So;0;ON;;;;;N;;;;; 1D234;GREEK INSTRUMENTAL NOTATION SYMBOL-38;So;0;ON;;;;;N;;;;; 1D235;GREEK INSTRUMENTAL NOTATION SYMBOL-39;So;0;ON;;;;;N;;;;; 1D236;GREEK INSTRUMENTAL NOTATION SYMBOL-40;So;0;ON;;;;;N;;;;; 1D237;GREEK INSTRUMENTAL NOTATION SYMBOL-42;So;0;ON;;;;;N;;;;; 1D238;GREEK INSTRUMENTAL NOTATION SYMBOL-43;So;0;ON;;;;;N;;;;; 1D239;GREEK INSTRUMENTAL NOTATION SYMBOL-45;So;0;ON;;;;;N;;;;; 1D23A;GREEK INSTRUMENTAL NOTATION SYMBOL-47;So;0;ON;;;;;N;;;;; 1D23B;GREEK INSTRUMENTAL NOTATION SYMBOL-48;So;0;ON;;;;;N;;;;; 1D23C;GREEK INSTRUMENTAL NOTATION SYMBOL-49;So;0;ON;;;;;N;;;;; 1D23D;GREEK INSTRUMENTAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; 1D23E;GREEK INSTRUMENTAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; 1D23F;GREEK INSTRUMENTAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; 1D240;GREEK INSTRUMENTAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; 1D241;GREEK INSTRUMENTAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; 1D242;COMBINING GREEK MUSICAL TRISEME;Mn;230;NSM;;;;;N;;;;; 1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;; 1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;; 1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;; 1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;;;; 1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;;;; 1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;;;; 1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;;;; 1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;;;; 1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; 1D306;TETRAGRAM FOR CENTRE;So;0;ON;;;;;N;;;;; 1D307;TETRAGRAM FOR FULL CIRCLE;So;0;ON;;;;;N;;;;; 1D308;TETRAGRAM FOR MIRED;So;0;ON;;;;;N;;;;; 1D309;TETRAGRAM FOR BARRIER;So;0;ON;;;;;N;;;;; 1D30A;TETRAGRAM FOR KEEPING SMALL;So;0;ON;;;;;N;;;;; 1D30B;TETRAGRAM FOR CONTRARIETY;So;0;ON;;;;;N;;;;; 1D30C;TETRAGRAM FOR ASCENT;So;0;ON;;;;;N;;;;; 1D30D;TETRAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;; 1D30E;TETRAGRAM FOR BRANCHING OUT;So;0;ON;;;;;N;;;;; 1D30F;TETRAGRAM FOR DEFECTIVENESS OR DISTORTION;So;0;ON;;;;;N;;;;; 1D310;TETRAGRAM FOR DIVERGENCE;So;0;ON;;;;;N;;;;; 1D311;TETRAGRAM FOR YOUTHFULNESS;So;0;ON;;;;;N;;;;; 1D312;TETRAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;; 1D313;TETRAGRAM FOR PENETRATION;So;0;ON;;;;;N;;;;; 1D314;TETRAGRAM FOR REACH;So;0;ON;;;;;N;;;;; 1D315;TETRAGRAM FOR CONTACT;So;0;ON;;;;;N;;;;; 1D316;TETRAGRAM FOR HOLDING BACK;So;0;ON;;;;;N;;;;; 1D317;TETRAGRAM FOR WAITING;So;0;ON;;;;;N;;;;; 1D318;TETRAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;; 1D319;TETRAGRAM FOR ADVANCE;So;0;ON;;;;;N;;;;; 1D31A;TETRAGRAM FOR RELEASE;So;0;ON;;;;;N;;;;; 1D31B;TETRAGRAM FOR RESISTANCE;So;0;ON;;;;;N;;;;; 1D31C;TETRAGRAM FOR EASE;So;0;ON;;;;;N;;;;; 1D31D;TETRAGRAM FOR JOY;So;0;ON;;;;;N;;;;; 1D31E;TETRAGRAM FOR CONTENTION;So;0;ON;;;;;N;;;;; 1D31F;TETRAGRAM FOR ENDEAVOUR;So;0;ON;;;;;N;;;;; 1D320;TETRAGRAM FOR DUTIES;So;0;ON;;;;;N;;;;; 1D321;TETRAGRAM FOR CHANGE;So;0;ON;;;;;N;;;;; 1D322;TETRAGRAM FOR DECISIVENESS;So;0;ON;;;;;N;;;;; 1D323;TETRAGRAM FOR BOLD RESOLUTION;So;0;ON;;;;;N;;;;; 1D324;TETRAGRAM FOR PACKING;So;0;ON;;;;;N;;;;; 1D325;TETRAGRAM FOR LEGION;So;0;ON;;;;;N;;;;; 1D326;TETRAGRAM FOR CLOSENESS;So;0;ON;;;;;N;;;;; 1D327;TETRAGRAM FOR KINSHIP;So;0;ON;;;;;N;;;;; 1D328;TETRAGRAM FOR GATHERING;So;0;ON;;;;;N;;;;; 1D329;TETRAGRAM FOR STRENGTH;So;0;ON;;;;;N;;;;; 1D32A;TETRAGRAM FOR PURITY;So;0;ON;;;;;N;;;;; 1D32B;TETRAGRAM FOR FULLNESS;So;0;ON;;;;;N;;;;; 1D32C;TETRAGRAM FOR RESIDENCE;So;0;ON;;;;;N;;;;; 1D32D;TETRAGRAM FOR LAW OR MODEL;So;0;ON;;;;;N;;;;; 1D32E;TETRAGRAM FOR RESPONSE;So;0;ON;;;;;N;;;;; 1D32F;TETRAGRAM FOR GOING TO MEET;So;0;ON;;;;;N;;;;; 1D330;TETRAGRAM FOR ENCOUNTERS;So;0;ON;;;;;N;;;;; 1D331;TETRAGRAM FOR STOVE;So;0;ON;;;;;N;;;;; 1D332;TETRAGRAM FOR GREATNESS;So;0;ON;;;;;N;;;;; 1D333;TETRAGRAM FOR ENLARGEMENT;So;0;ON;;;;;N;;;;; 1D334;TETRAGRAM FOR PATTERN;So;0;ON;;;;;N;;;;; 1D335;TETRAGRAM FOR RITUAL;So;0;ON;;;;;N;;;;; 1D336;TETRAGRAM FOR FLIGHT;So;0;ON;;;;;N;;;;; 1D337;TETRAGRAM FOR VASTNESS OR WASTING;So;0;ON;;;;;N;;;;; 1D338;TETRAGRAM FOR CONSTANCY;So;0;ON;;;;;N;;;;; 1D339;TETRAGRAM FOR MEASURE;So;0;ON;;;;;N;;;;; 1D33A;TETRAGRAM FOR ETERNITY;So;0;ON;;;;;N;;;;; 1D33B;TETRAGRAM FOR UNITY;So;0;ON;;;;;N;;;;; 1D33C;TETRAGRAM FOR DIMINISHMENT;So;0;ON;;;;;N;;;;; 1D33D;TETRAGRAM FOR CLOSED MOUTH;So;0;ON;;;;;N;;;;; 1D33E;TETRAGRAM FOR GUARDEDNESS;So;0;ON;;;;;N;;;;; 1D33F;TETRAGRAM FOR GATHERING IN;So;0;ON;;;;;N;;;;; 1D340;TETRAGRAM FOR MASSING;So;0;ON;;;;;N;;;;; 1D341;TETRAGRAM FOR ACCUMULATION;So;0;ON;;;;;N;;;;; 1D342;TETRAGRAM FOR EMBELLISHMENT;So;0;ON;;;;;N;;;;; 1D343;TETRAGRAM FOR DOUBT;So;0;ON;;;;;N;;;;; 1D344;TETRAGRAM FOR WATCH;So;0;ON;;;;;N;;;;; 1D345;TETRAGRAM FOR SINKING;So;0;ON;;;;;N;;;;; 1D346;TETRAGRAM FOR INNER;So;0;ON;;;;;N;;;;; 1D347;TETRAGRAM FOR DEPARTURE;So;0;ON;;;;;N;;;;; 1D348;TETRAGRAM FOR DARKENING;So;0;ON;;;;;N;;;;; 1D349;TETRAGRAM FOR DIMMING;So;0;ON;;;;;N;;;;; 1D34A;TETRAGRAM FOR EXHAUSTION;So;0;ON;;;;;N;;;;; 1D34B;TETRAGRAM FOR SEVERANCE;So;0;ON;;;;;N;;;;; 1D34C;TETRAGRAM FOR STOPPAGE;So;0;ON;;;;;N;;;;; 1D34D;TETRAGRAM FOR HARDNESS;So;0;ON;;;;;N;;;;; 1D34E;TETRAGRAM FOR COMPLETION;So;0;ON;;;;;N;;;;; 1D34F;TETRAGRAM FOR CLOSURE;So;0;ON;;;;;N;;;;; 1D350;TETRAGRAM FOR FAILURE;So;0;ON;;;;;N;;;;; 1D351;TETRAGRAM FOR AGGRAVATION;So;0;ON;;;;;N;;;;; 1D352;TETRAGRAM FOR COMPLIANCE;So;0;ON;;;;;N;;;;; 1D353;TETRAGRAM FOR ON THE VERGE;So;0;ON;;;;;N;;;;; 1D354;TETRAGRAM FOR DIFFICULTIES;So;0;ON;;;;;N;;;;; 1D355;TETRAGRAM FOR LABOURING;So;0;ON;;;;;N;;;;; 1D356;TETRAGRAM FOR FOSTERING;So;0;ON;;;;;N;;;;; 1D360;COUNTING ROD UNIT DIGIT ONE;No;0;L;;;;1;N;;;;; 1D361;COUNTING ROD UNIT DIGIT TWO;No;0;L;;;;2;N;;;;; 1D362;COUNTING ROD UNIT DIGIT THREE;No;0;L;;;;3;N;;;;; 1D363;COUNTING ROD UNIT DIGIT FOUR;No;0;L;;;;4;N;;;;; 1D364;COUNTING ROD UNIT DIGIT FIVE;No;0;L;;;;5;N;;;;; 1D365;COUNTING ROD UNIT DIGIT SIX;No;0;L;;;;6;N;;;;; 1D366;COUNTING ROD UNIT DIGIT SEVEN;No;0;L;;;;7;N;;;;; 1D367;COUNTING ROD UNIT DIGIT EIGHT;No;0;L;;;;8;N;;;;; 1D368;COUNTING ROD UNIT DIGIT NINE;No;0;L;;;;9;N;;;;; 1D369;COUNTING ROD TENS DIGIT ONE;No;0;L;;;;10;N;;;;; 1D36A;COUNTING ROD TENS DIGIT TWO;No;0;L;;;;20;N;;;;; 1D36B;COUNTING ROD TENS DIGIT THREE;No;0;L;;;;30;N;;;;; 1D36C;COUNTING ROD TENS DIGIT FOUR;No;0;L;;;;40;N;;;;; 1D36D;COUNTING ROD TENS DIGIT FIVE;No;0;L;;;;50;N;;;;; 1D36E;COUNTING ROD TENS DIGIT SIX;No;0;L;;;;60;N;;;;; 1D36F;COUNTING ROD TENS DIGIT SEVEN;No;0;L;;;;70;N;;;;; 1D370;COUNTING ROD TENS DIGIT EIGHT;No;0;L;;;;80;N;;;;; 1D371;COUNTING ROD TENS DIGIT NINE;No;0;L;;;;90;N;;;;; 1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; 1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; 1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; 1D403;MATHEMATICAL BOLD CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; 1D404;MATHEMATICAL BOLD CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; 1D405;MATHEMATICAL BOLD CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; 1D406;MATHEMATICAL BOLD CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; 1D407;MATHEMATICAL BOLD CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; 1D408;MATHEMATICAL BOLD CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; 1D409;MATHEMATICAL BOLD CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; 1D40A;MATHEMATICAL BOLD CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; 1D40B;MATHEMATICAL BOLD CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; 1D40C;MATHEMATICAL BOLD CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; 1D40D;MATHEMATICAL BOLD CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; 1D40E;MATHEMATICAL BOLD CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; 1D40F;MATHEMATICAL BOLD CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; 1D410;MATHEMATICAL BOLD CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; 1D411;MATHEMATICAL BOLD CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; 1D412;MATHEMATICAL BOLD CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; 1D413;MATHEMATICAL BOLD CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; 1D414;MATHEMATICAL BOLD CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; 1D415;MATHEMATICAL BOLD CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; 1D416;MATHEMATICAL BOLD CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; 1D417;MATHEMATICAL BOLD CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; 1D418;MATHEMATICAL BOLD CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; 1D419;MATHEMATICAL BOLD CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; 1D41A;MATHEMATICAL BOLD SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; 1D41B;MATHEMATICAL BOLD SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; 1D41C;MATHEMATICAL BOLD SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; 1D41D;MATHEMATICAL BOLD SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; 1D41E;MATHEMATICAL BOLD SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; 1D41F;MATHEMATICAL BOLD SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; 1D420;MATHEMATICAL BOLD SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; 1D421;MATHEMATICAL BOLD SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; 1D422;MATHEMATICAL BOLD SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; 1D423;MATHEMATICAL BOLD SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; 1D424;MATHEMATICAL BOLD SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; 1D425;MATHEMATICAL BOLD SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; 1D426;MATHEMATICAL BOLD SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; 1D427;MATHEMATICAL BOLD SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; 1D428;MATHEMATICAL BOLD SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; 1D429;MATHEMATICAL BOLD SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; 1D42A;MATHEMATICAL BOLD SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; 1D42B;MATHEMATICAL BOLD SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; 1D42C;MATHEMATICAL BOLD SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; 1D42D;MATHEMATICAL BOLD SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; 1D42E;MATHEMATICAL BOLD SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; 1D42F;MATHEMATICAL BOLD SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; 1D430;MATHEMATICAL BOLD SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; 1D431;MATHEMATICAL BOLD SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; 1D432;MATHEMATICAL BOLD SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; 1D433;MATHEMATICAL BOLD SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; 1D434;MATHEMATICAL ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; 1D435;MATHEMATICAL ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; 1D436;MATHEMATICAL ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; 1D437;MATHEMATICAL ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; 1D438;MATHEMATICAL ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; 1D439;MATHEMATICAL ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; 1D43A;MATHEMATICAL ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; 1D43B;MATHEMATICAL ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; 1D43C;MATHEMATICAL ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; 1D43D;MATHEMATICAL ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; 1D43E;MATHEMATICAL ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; 1D43F;MATHEMATICAL ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; 1D440;MATHEMATICAL ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; 1D441;MATHEMATICAL ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; 1D442;MATHEMATICAL ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; 1D443;MATHEMATICAL ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; 1D444;MATHEMATICAL ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; 1D445;MATHEMATICAL ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; 1D446;MATHEMATICAL ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; 1D447;MATHEMATICAL ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; 1D448;MATHEMATICAL ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; 1D449;MATHEMATICAL ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; 1D44A;MATHEMATICAL ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; 1D44B;MATHEMATICAL ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; 1D44C;MATHEMATICAL ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; 1D44D;MATHEMATICAL ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; 1D44E;MATHEMATICAL ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; 1D44F;MATHEMATICAL ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; 1D450;MATHEMATICAL ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; 1D451;MATHEMATICAL ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; 1D452;MATHEMATICAL ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; 1D453;MATHEMATICAL ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; 1D454;MATHEMATICAL ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; 1D456;MATHEMATICAL ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; 1D457;MATHEMATICAL ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; 1D458;MATHEMATICAL ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; 1D459;MATHEMATICAL ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; 1D45A;MATHEMATICAL ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; 1D45B;MATHEMATICAL ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; 1D45C;MATHEMATICAL ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; 1D45D;MATHEMATICAL ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; 1D45E;MATHEMATICAL ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; 1D45F;MATHEMATICAL ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; 1D460;MATHEMATICAL ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; 1D461;MATHEMATICAL ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; 1D462;MATHEMATICAL ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; 1D463;MATHEMATICAL ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; 1D464;MATHEMATICAL ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; 1D465;MATHEMATICAL ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; 1D466;MATHEMATICAL ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; 1D467;MATHEMATICAL ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; 1D468;MATHEMATICAL BOLD ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; 1D469;MATHEMATICAL BOLD ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; 1D46A;MATHEMATICAL BOLD ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; 1D46B;MATHEMATICAL BOLD ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; 1D46C;MATHEMATICAL BOLD ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; 1D46D;MATHEMATICAL BOLD ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; 1D46E;MATHEMATICAL BOLD ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; 1D46F;MATHEMATICAL BOLD ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; 1D470;MATHEMATICAL BOLD ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; 1D471;MATHEMATICAL BOLD ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; 1D472;MATHEMATICAL BOLD ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; 1D473;MATHEMATICAL BOLD ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; 1D474;MATHEMATICAL BOLD ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; 1D475;MATHEMATICAL BOLD ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; 1D476;MATHEMATICAL BOLD ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; 1D477;MATHEMATICAL BOLD ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; 1D478;MATHEMATICAL BOLD ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; 1D479;MATHEMATICAL BOLD ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; 1D47A;MATHEMATICAL BOLD ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; 1D47B;MATHEMATICAL BOLD ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; 1D47C;MATHEMATICAL BOLD ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; 1D47D;MATHEMATICAL BOLD ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; 1D47E;MATHEMATICAL BOLD ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; 1D47F;MATHEMATICAL BOLD ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; 1D480;MATHEMATICAL BOLD ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; 1D481;MATHEMATICAL BOLD ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; 1D482;MATHEMATICAL BOLD ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; 1D483;MATHEMATICAL BOLD ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; 1D484;MATHEMATICAL BOLD ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; 1D485;MATHEMATICAL BOLD ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; 1D486;MATHEMATICAL BOLD ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; 1D487;MATHEMATICAL BOLD ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; 1D488;MATHEMATICAL BOLD ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; 1D489;MATHEMATICAL BOLD ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; 1D48A;MATHEMATICAL BOLD ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; 1D48B;MATHEMATICAL BOLD ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; 1D48C;MATHEMATICAL BOLD ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; 1D48D;MATHEMATICAL BOLD ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; 1D48E;MATHEMATICAL BOLD ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; 1D48F;MATHEMATICAL BOLD ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; 1D490;MATHEMATICAL BOLD ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; 1D491;MATHEMATICAL BOLD ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; 1D492;MATHEMATICAL BOLD ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; 1D493;MATHEMATICAL BOLD ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; 1D494;MATHEMATICAL BOLD ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; 1D495;MATHEMATICAL BOLD ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; 1D496;MATHEMATICAL BOLD ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; 1D497;MATHEMATICAL BOLD ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; 1D498;MATHEMATICAL BOLD ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; 1D499;MATHEMATICAL BOLD ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; 1D49A;MATHEMATICAL BOLD ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; 1D49B;MATHEMATICAL BOLD ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; 1D49C;MATHEMATICAL SCRIPT CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; 1D49E;MATHEMATICAL SCRIPT CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; 1D49F;MATHEMATICAL SCRIPT CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; 1D4A2;MATHEMATICAL SCRIPT CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; 1D4A5;MATHEMATICAL SCRIPT CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; 1D4A6;MATHEMATICAL SCRIPT CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; 1D4A9;MATHEMATICAL SCRIPT CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; 1D4AA;MATHEMATICAL SCRIPT CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; 1D4AB;MATHEMATICAL SCRIPT CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; 1D4AC;MATHEMATICAL SCRIPT CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; 1D4AE;MATHEMATICAL SCRIPT CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; 1D4AF;MATHEMATICAL SCRIPT CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; 1D4B0;MATHEMATICAL SCRIPT CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; 1D4B1;MATHEMATICAL SCRIPT CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; 1D4B2;MATHEMATICAL SCRIPT CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; 1D4B3;MATHEMATICAL SCRIPT CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; 1D4B4;MATHEMATICAL SCRIPT CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; 1D4B5;MATHEMATICAL SCRIPT CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; 1D4B6;MATHEMATICAL SCRIPT SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; 1D4B7;MATHEMATICAL SCRIPT SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; 1D4B8;MATHEMATICAL SCRIPT SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; 1D4B9;MATHEMATICAL SCRIPT SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; 1D4BB;MATHEMATICAL SCRIPT SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; 1D4BD;MATHEMATICAL SCRIPT SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; 1D4BE;MATHEMATICAL SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; 1D4BF;MATHEMATICAL SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; 1D4C0;MATHEMATICAL SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; 1D4C1;MATHEMATICAL SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; 1D4C2;MATHEMATICAL SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; 1D4C3;MATHEMATICAL SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; 1D4C5;MATHEMATICAL SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; 1D4C6;MATHEMATICAL SCRIPT SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; 1D4C7;MATHEMATICAL SCRIPT SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; 1D4C8;MATHEMATICAL SCRIPT SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; 1D4C9;MATHEMATICAL SCRIPT SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; 1D4CA;MATHEMATICAL SCRIPT SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; 1D4CB;MATHEMATICAL SCRIPT SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; 1D4CC;MATHEMATICAL SCRIPT SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; 1D4CD;MATHEMATICAL SCRIPT SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; 1D4CE;MATHEMATICAL SCRIPT SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; 1D4CF;MATHEMATICAL SCRIPT SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; 1D4D0;MATHEMATICAL BOLD SCRIPT CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; 1D4D1;MATHEMATICAL BOLD SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; 1D4D2;MATHEMATICAL BOLD SCRIPT CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; 1D4D3;MATHEMATICAL BOLD SCRIPT CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; 1D4D4;MATHEMATICAL BOLD SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; 1D4D5;MATHEMATICAL BOLD SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; 1D4D6;MATHEMATICAL BOLD SCRIPT CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; 1D4D7;MATHEMATICAL BOLD SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; 1D4D8;MATHEMATICAL BOLD SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; 1D4D9;MATHEMATICAL BOLD SCRIPT CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; 1D4DA;MATHEMATICAL BOLD SCRIPT CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; 1D4DB;MATHEMATICAL BOLD SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; 1D4DC;MATHEMATICAL BOLD SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; 1D4DD;MATHEMATICAL BOLD SCRIPT CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; 1D4DE;MATHEMATICAL BOLD SCRIPT CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; 1D4DF;MATHEMATICAL BOLD SCRIPT CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; 1D4E0;MATHEMATICAL BOLD SCRIPT CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; 1D4E1;MATHEMATICAL BOLD SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; 1D4E2;MATHEMATICAL BOLD SCRIPT CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; 1D4E3;MATHEMATICAL BOLD SCRIPT CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; 1D4E4;MATHEMATICAL BOLD SCRIPT CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; 1D4E5;MATHEMATICAL BOLD SCRIPT CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; 1D4E6;MATHEMATICAL BOLD SCRIPT CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; 1D4E7;MATHEMATICAL BOLD SCRIPT CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; 1D4E8;MATHEMATICAL BOLD SCRIPT CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; 1D4E9;MATHEMATICAL BOLD SCRIPT CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; 1D4EA;MATHEMATICAL BOLD SCRIPT SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; 1D4EB;MATHEMATICAL BOLD SCRIPT SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; 1D4EC;MATHEMATICAL BOLD SCRIPT SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; 1D4ED;MATHEMATICAL BOLD SCRIPT SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; 1D4EE;MATHEMATICAL BOLD SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; 1D4EF;MATHEMATICAL BOLD SCRIPT SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; 1D4F0;MATHEMATICAL BOLD SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; 1D4F1;MATHEMATICAL BOLD SCRIPT SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; 1D4F2;MATHEMATICAL BOLD SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; 1D4F3;MATHEMATICAL BOLD SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; 1D4F4;MATHEMATICAL BOLD SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; 1D4F5;MATHEMATICAL BOLD SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; 1D4F6;MATHEMATICAL BOLD SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; 1D4F7;MATHEMATICAL BOLD SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; 1D4F8;MATHEMATICAL BOLD SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; 1D4F9;MATHEMATICAL BOLD SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; 1D4FA;MATHEMATICAL BOLD SCRIPT SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; 1D4FB;MATHEMATICAL BOLD SCRIPT SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; 1D4FC;MATHEMATICAL BOLD SCRIPT SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; 1D4FD;MATHEMATICAL BOLD SCRIPT SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; 1D4FE;MATHEMATICAL BOLD SCRIPT SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; 1D4FF;MATHEMATICAL BOLD SCRIPT SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; 1D500;MATHEMATICAL BOLD SCRIPT SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; 1D501;MATHEMATICAL BOLD SCRIPT SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; 1D502;MATHEMATICAL BOLD SCRIPT SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; 1D503;MATHEMATICAL BOLD SCRIPT SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; 1D504;MATHEMATICAL FRAKTUR CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; 1D505;MATHEMATICAL FRAKTUR CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; 1D507;MATHEMATICAL FRAKTUR CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; 1D508;MATHEMATICAL FRAKTUR CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; 1D509;MATHEMATICAL FRAKTUR CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; 1D50A;MATHEMATICAL FRAKTUR CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; 1D50D;MATHEMATICAL FRAKTUR CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; 1D50E;MATHEMATICAL FRAKTUR CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; 1D50F;MATHEMATICAL FRAKTUR CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; 1D510;MATHEMATICAL FRAKTUR CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; 1D511;MATHEMATICAL FRAKTUR CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; 1D512;MATHEMATICAL FRAKTUR CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; 1D513;MATHEMATICAL FRAKTUR CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; 1D514;MATHEMATICAL FRAKTUR CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; 1D516;MATHEMATICAL FRAKTUR CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; 1D517;MATHEMATICAL FRAKTUR CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; 1D518;MATHEMATICAL FRAKTUR CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; 1D519;MATHEMATICAL FRAKTUR CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; 1D51A;MATHEMATICAL FRAKTUR CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; 1D51B;MATHEMATICAL FRAKTUR CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; 1D51C;MATHEMATICAL FRAKTUR CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; 1D51E;MATHEMATICAL FRAKTUR SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; 1D51F;MATHEMATICAL FRAKTUR SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; 1D520;MATHEMATICAL FRAKTUR SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; 1D521;MATHEMATICAL FRAKTUR SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; 1D522;MATHEMATICAL FRAKTUR SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; 1D523;MATHEMATICAL FRAKTUR SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; 1D524;MATHEMATICAL FRAKTUR SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; 1D525;MATHEMATICAL FRAKTUR SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; 1D526;MATHEMATICAL FRAKTUR SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; 1D527;MATHEMATICAL FRAKTUR SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; 1D528;MATHEMATICAL FRAKTUR SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; 1D529;MATHEMATICAL FRAKTUR SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; 1D52A;MATHEMATICAL FRAKTUR SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; 1D52B;MATHEMATICAL FRAKTUR SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; 1D52C;MATHEMATICAL FRAKTUR SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; 1D52D;MATHEMATICAL FRAKTUR SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; 1D52E;MATHEMATICAL FRAKTUR SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; 1D52F;MATHEMATICAL FRAKTUR SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; 1D530;MATHEMATICAL FRAKTUR SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; 1D531;MATHEMATICAL FRAKTUR SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; 1D532;MATHEMATICAL FRAKTUR SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; 1D533;MATHEMATICAL FRAKTUR SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; 1D534;MATHEMATICAL FRAKTUR SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; 1D535;MATHEMATICAL FRAKTUR SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; 1D536;MATHEMATICAL FRAKTUR SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; 1D537;MATHEMATICAL FRAKTUR SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; 1D538;MATHEMATICAL DOUBLE-STRUCK CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; 1D539;MATHEMATICAL DOUBLE-STRUCK CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; 1D53B;MATHEMATICAL DOUBLE-STRUCK CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; 1D53C;MATHEMATICAL DOUBLE-STRUCK CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; 1D53D;MATHEMATICAL DOUBLE-STRUCK CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; 1D53E;MATHEMATICAL DOUBLE-STRUCK CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; 1D540;MATHEMATICAL DOUBLE-STRUCK CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; 1D541;MATHEMATICAL DOUBLE-STRUCK CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; 1D542;MATHEMATICAL DOUBLE-STRUCK CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; 1D543;MATHEMATICAL DOUBLE-STRUCK CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; 1D544;MATHEMATICAL DOUBLE-STRUCK CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; 1D546;MATHEMATICAL DOUBLE-STRUCK CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; 1D54A;MATHEMATICAL DOUBLE-STRUCK CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; 1D54B;MATHEMATICAL DOUBLE-STRUCK CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; 1D54C;MATHEMATICAL DOUBLE-STRUCK CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; 1D54D;MATHEMATICAL DOUBLE-STRUCK CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; 1D54E;MATHEMATICAL DOUBLE-STRUCK CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; 1D54F;MATHEMATICAL DOUBLE-STRUCK CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; 1D550;MATHEMATICAL DOUBLE-STRUCK CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; 1D552;MATHEMATICAL DOUBLE-STRUCK SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; 1D553;MATHEMATICAL DOUBLE-STRUCK SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; 1D554;MATHEMATICAL DOUBLE-STRUCK SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; 1D555;MATHEMATICAL DOUBLE-STRUCK SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; 1D556;MATHEMATICAL DOUBLE-STRUCK SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; 1D557;MATHEMATICAL DOUBLE-STRUCK SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; 1D558;MATHEMATICAL DOUBLE-STRUCK SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; 1D559;MATHEMATICAL DOUBLE-STRUCK SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; 1D55A;MATHEMATICAL DOUBLE-STRUCK SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; 1D55B;MATHEMATICAL DOUBLE-STRUCK SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; 1D55C;MATHEMATICAL DOUBLE-STRUCK SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; 1D55D;MATHEMATICAL DOUBLE-STRUCK SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; 1D55E;MATHEMATICAL DOUBLE-STRUCK SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; 1D55F;MATHEMATICAL DOUBLE-STRUCK SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; 1D560;MATHEMATICAL DOUBLE-STRUCK SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; 1D561;MATHEMATICAL DOUBLE-STRUCK SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; 1D562;MATHEMATICAL DOUBLE-STRUCK SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; 1D563;MATHEMATICAL DOUBLE-STRUCK SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; 1D564;MATHEMATICAL DOUBLE-STRUCK SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; 1D565;MATHEMATICAL DOUBLE-STRUCK SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; 1D566;MATHEMATICAL DOUBLE-STRUCK SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; 1D567;MATHEMATICAL DOUBLE-STRUCK SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; 1D568;MATHEMATICAL DOUBLE-STRUCK SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; 1D569;MATHEMATICAL DOUBLE-STRUCK SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; 1D56A;MATHEMATICAL DOUBLE-STRUCK SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; 1D56B;MATHEMATICAL DOUBLE-STRUCK SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; 1D56C;MATHEMATICAL BOLD FRAKTUR CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; 1D56D;MATHEMATICAL BOLD FRAKTUR CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; 1D56E;MATHEMATICAL BOLD FRAKTUR CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; 1D56F;MATHEMATICAL BOLD FRAKTUR CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; 1D570;MATHEMATICAL BOLD FRAKTUR CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; 1D571;MATHEMATICAL BOLD FRAKTUR CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; 1D572;MATHEMATICAL BOLD FRAKTUR CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; 1D573;MATHEMATICAL BOLD FRAKTUR CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; 1D574;MATHEMATICAL BOLD FRAKTUR CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; 1D575;MATHEMATICAL BOLD FRAKTUR CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; 1D576;MATHEMATICAL BOLD FRAKTUR CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; 1D577;MATHEMATICAL BOLD FRAKTUR CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; 1D578;MATHEMATICAL BOLD FRAKTUR CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; 1D579;MATHEMATICAL BOLD FRAKTUR CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; 1D57A;MATHEMATICAL BOLD FRAKTUR CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; 1D57B;MATHEMATICAL BOLD FRAKTUR CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; 1D57C;MATHEMATICAL BOLD FRAKTUR CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; 1D57D;MATHEMATICAL BOLD FRAKTUR CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; 1D57E;MATHEMATICAL BOLD FRAKTUR CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; 1D57F;MATHEMATICAL BOLD FRAKTUR CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; 1D580;MATHEMATICAL BOLD FRAKTUR CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; 1D581;MATHEMATICAL BOLD FRAKTUR CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; 1D582;MATHEMATICAL BOLD FRAKTUR CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; 1D583;MATHEMATICAL BOLD FRAKTUR CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; 1D584;MATHEMATICAL BOLD FRAKTUR CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; 1D585;MATHEMATICAL BOLD FRAKTUR CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; 1D586;MATHEMATICAL BOLD FRAKTUR SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; 1D587;MATHEMATICAL BOLD FRAKTUR SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; 1D588;MATHEMATICAL BOLD FRAKTUR SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; 1D589;MATHEMATICAL BOLD FRAKTUR SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; 1D58A;MATHEMATICAL BOLD FRAKTUR SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; 1D58B;MATHEMATICAL BOLD FRAKTUR SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; 1D58C;MATHEMATICAL BOLD FRAKTUR SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; 1D58D;MATHEMATICAL BOLD FRAKTUR SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; 1D58E;MATHEMATICAL BOLD FRAKTUR SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; 1D58F;MATHEMATICAL BOLD FRAKTUR SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; 1D590;MATHEMATICAL BOLD FRAKTUR SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; 1D591;MATHEMATICAL BOLD FRAKTUR SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; 1D592;MATHEMATICAL BOLD FRAKTUR SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; 1D593;MATHEMATICAL BOLD FRAKTUR SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; 1D594;MATHEMATICAL BOLD FRAKTUR SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; 1D595;MATHEMATICAL BOLD FRAKTUR SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; 1D596;MATHEMATICAL BOLD FRAKTUR SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; 1D597;MATHEMATICAL BOLD FRAKTUR SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; 1D598;MATHEMATICAL BOLD FRAKTUR SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; 1D599;MATHEMATICAL BOLD FRAKTUR SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; 1D59A;MATHEMATICAL BOLD FRAKTUR SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; 1D59B;MATHEMATICAL BOLD FRAKTUR SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; 1D59C;MATHEMATICAL BOLD FRAKTUR SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; 1D59D;MATHEMATICAL BOLD FRAKTUR SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; 1D59E;MATHEMATICAL BOLD FRAKTUR SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; 1D59F;MATHEMATICAL BOLD FRAKTUR SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; 1D5A0;MATHEMATICAL SANS-SERIF CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; 1D5A1;MATHEMATICAL SANS-SERIF CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; 1D5A2;MATHEMATICAL SANS-SERIF CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; 1D5A3;MATHEMATICAL SANS-SERIF CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; 1D5A4;MATHEMATICAL SANS-SERIF CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; 1D5A5;MATHEMATICAL SANS-SERIF CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; 1D5A6;MATHEMATICAL SANS-SERIF CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; 1D5A7;MATHEMATICAL SANS-SERIF CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; 1D5A8;MATHEMATICAL SANS-SERIF CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; 1D5A9;MATHEMATICAL SANS-SERIF CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; 1D5AA;MATHEMATICAL SANS-SERIF CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; 1D5AB;MATHEMATICAL SANS-SERIF CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; 1D5AC;MATHEMATICAL SANS-SERIF CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; 1D5AD;MATHEMATICAL SANS-SERIF CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; 1D5AE;MATHEMATICAL SANS-SERIF CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; 1D5AF;MATHEMATICAL SANS-SERIF CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; 1D5B0;MATHEMATICAL SANS-SERIF CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; 1D5B1;MATHEMATICAL SANS-SERIF CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; 1D5B2;MATHEMATICAL SANS-SERIF CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; 1D5B3;MATHEMATICAL SANS-SERIF CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; 1D5B4;MATHEMATICAL SANS-SERIF CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; 1D5B5;MATHEMATICAL SANS-SERIF CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; 1D5B6;MATHEMATICAL SANS-SERIF CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; 1D5B7;MATHEMATICAL SANS-SERIF CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; 1D5B8;MATHEMATICAL SANS-SERIF CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; 1D5B9;MATHEMATICAL SANS-SERIF CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; 1D5BA;MATHEMATICAL SANS-SERIF SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; 1D5BB;MATHEMATICAL SANS-SERIF SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; 1D5BC;MATHEMATICAL SANS-SERIF SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; 1D5BD;MATHEMATICAL SANS-SERIF SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; 1D5BE;MATHEMATICAL SANS-SERIF SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; 1D5BF;MATHEMATICAL SANS-SERIF SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; 1D5C0;MATHEMATICAL SANS-SERIF SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; 1D5C1;MATHEMATICAL SANS-SERIF SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; 1D5C2;MATHEMATICAL SANS-SERIF SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; 1D5C3;MATHEMATICAL SANS-SERIF SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; 1D5C4;MATHEMATICAL SANS-SERIF SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; 1D5C5;MATHEMATICAL SANS-SERIF SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; 1D5C6;MATHEMATICAL SANS-SERIF SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; 1D5C7;MATHEMATICAL SANS-SERIF SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; 1D5C8;MATHEMATICAL SANS-SERIF SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; 1D5C9;MATHEMATICAL SANS-SERIF SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; 1D5CA;MATHEMATICAL SANS-SERIF SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; 1D5CB;MATHEMATICAL SANS-SERIF SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; 1D5CC;MATHEMATICAL SANS-SERIF SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; 1D5CD;MATHEMATICAL SANS-SERIF SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; 1D5CE;MATHEMATICAL SANS-SERIF SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; 1D5CF;MATHEMATICAL SANS-SERIF SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; 1D5D0;MATHEMATICAL SANS-SERIF SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; 1D5D1;MATHEMATICAL SANS-SERIF SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; 1D5D2;MATHEMATICAL SANS-SERIF SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; 1D5D3;MATHEMATICAL SANS-SERIF SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; 1D5D4;MATHEMATICAL SANS-SERIF BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; 1D5D5;MATHEMATICAL SANS-SERIF BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; 1D5D6;MATHEMATICAL SANS-SERIF BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; 1D5D7;MATHEMATICAL SANS-SERIF BOLD CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; 1D5D8;MATHEMATICAL SANS-SERIF BOLD CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; 1D5D9;MATHEMATICAL SANS-SERIF BOLD CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; 1D5DA;MATHEMATICAL SANS-SERIF BOLD CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; 1D5DB;MATHEMATICAL SANS-SERIF BOLD CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; 1D5DC;MATHEMATICAL SANS-SERIF BOLD CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; 1D5DD;MATHEMATICAL SANS-SERIF BOLD CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; 1D5DE;MATHEMATICAL SANS-SERIF BOLD CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; 1D5DF;MATHEMATICAL SANS-SERIF BOLD CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; 1D5E0;MATHEMATICAL SANS-SERIF BOLD CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; 1D5E1;MATHEMATICAL SANS-SERIF BOLD CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; 1D5E2;MATHEMATICAL SANS-SERIF BOLD CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; 1D5E3;MATHEMATICAL SANS-SERIF BOLD CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; 1D5E4;MATHEMATICAL SANS-SERIF BOLD CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; 1D5E5;MATHEMATICAL SANS-SERIF BOLD CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; 1D5E6;MATHEMATICAL SANS-SERIF BOLD CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; 1D5E7;MATHEMATICAL SANS-SERIF BOLD CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; 1D5E8;MATHEMATICAL SANS-SERIF BOLD CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; 1D5E9;MATHEMATICAL SANS-SERIF BOLD CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; 1D5EA;MATHEMATICAL SANS-SERIF BOLD CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; 1D5EB;MATHEMATICAL SANS-SERIF BOLD CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; 1D5EC;MATHEMATICAL SANS-SERIF BOLD CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; 1D5ED;MATHEMATICAL SANS-SERIF BOLD CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; 1D5EE;MATHEMATICAL SANS-SERIF BOLD SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; 1D5EF;MATHEMATICAL SANS-SERIF BOLD SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; 1D5F0;MATHEMATICAL SANS-SERIF BOLD SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; 1D5F1;MATHEMATICAL SANS-SERIF BOLD SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; 1D5F2;MATHEMATICAL SANS-SERIF BOLD SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; 1D5F3;MATHEMATICAL SANS-SERIF BOLD SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; 1D5F4;MATHEMATICAL SANS-SERIF BOLD SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; 1D5F5;MATHEMATICAL SANS-SERIF BOLD SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; 1D5F6;MATHEMATICAL SANS-SERIF BOLD SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; 1D5F7;MATHEMATICAL SANS-SERIF BOLD SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; 1D5F8;MATHEMATICAL SANS-SERIF BOLD SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; 1D5F9;MATHEMATICAL SANS-SERIF BOLD SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; 1D5FA;MATHEMATICAL SANS-SERIF BOLD SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; 1D5FB;MATHEMATICAL SANS-SERIF BOLD SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; 1D5FC;MATHEMATICAL SANS-SERIF BOLD SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; 1D5FD;MATHEMATICAL SANS-SERIF BOLD SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; 1D5FE;MATHEMATICAL SANS-SERIF BOLD SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; 1D5FF;MATHEMATICAL SANS-SERIF BOLD SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; 1D600;MATHEMATICAL SANS-SERIF BOLD SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; 1D601;MATHEMATICAL SANS-SERIF BOLD SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; 1D602;MATHEMATICAL SANS-SERIF BOLD SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; 1D603;MATHEMATICAL SANS-SERIF BOLD SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; 1D604;MATHEMATICAL SANS-SERIF BOLD SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; 1D605;MATHEMATICAL SANS-SERIF BOLD SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; 1D606;MATHEMATICAL SANS-SERIF BOLD SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; 1D607;MATHEMATICAL SANS-SERIF BOLD SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; 1D608;MATHEMATICAL SANS-SERIF ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; 1D609;MATHEMATICAL SANS-SERIF ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; 1D60A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; 1D60B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; 1D60C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; 1D60D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; 1D60E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; 1D60F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; 1D610;MATHEMATICAL SANS-SERIF ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; 1D611;MATHEMATICAL SANS-SERIF ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; 1D612;MATHEMATICAL SANS-SERIF ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; 1D613;MATHEMATICAL SANS-SERIF ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; 1D614;MATHEMATICAL SANS-SERIF ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; 1D615;MATHEMATICAL SANS-SERIF ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; 1D616;MATHEMATICAL SANS-SERIF ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; 1D617;MATHEMATICAL SANS-SERIF ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; 1D618;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; 1D619;MATHEMATICAL SANS-SERIF ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; 1D61A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; 1D61B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; 1D61C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; 1D61D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; 1D61E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; 1D61F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; 1D620;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; 1D621;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; 1D622;MATHEMATICAL SANS-SERIF ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; 1D623;MATHEMATICAL SANS-SERIF ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; 1D624;MATHEMATICAL SANS-SERIF ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; 1D625;MATHEMATICAL SANS-SERIF ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; 1D626;MATHEMATICAL SANS-SERIF ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; 1D627;MATHEMATICAL SANS-SERIF ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; 1D628;MATHEMATICAL SANS-SERIF ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; 1D629;MATHEMATICAL SANS-SERIF ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; 1D62A;MATHEMATICAL SANS-SERIF ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; 1D62B;MATHEMATICAL SANS-SERIF ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; 1D62C;MATHEMATICAL SANS-SERIF ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; 1D62D;MATHEMATICAL SANS-SERIF ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; 1D62E;MATHEMATICAL SANS-SERIF ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; 1D62F;MATHEMATICAL SANS-SERIF ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; 1D630;MATHEMATICAL SANS-SERIF ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; 1D631;MATHEMATICAL SANS-SERIF ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; 1D632;MATHEMATICAL SANS-SERIF ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; 1D633;MATHEMATICAL SANS-SERIF ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; 1D634;MATHEMATICAL SANS-SERIF ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; 1D635;MATHEMATICAL SANS-SERIF ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; 1D636;MATHEMATICAL SANS-SERIF ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; 1D637;MATHEMATICAL SANS-SERIF ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; 1D638;MATHEMATICAL SANS-SERIF ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; 1D639;MATHEMATICAL SANS-SERIF ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; 1D63A;MATHEMATICAL SANS-SERIF ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; 1D63B;MATHEMATICAL SANS-SERIF ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; 1D63C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; 1D63D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; 1D63E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; 1D63F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; 1D640;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; 1D641;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; 1D642;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; 1D643;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; 1D644;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; 1D645;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; 1D646;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; 1D647;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; 1D648;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; 1D649;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; 1D64A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; 1D64B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; 1D64C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; 1D64D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; 1D64E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; 1D64F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; 1D650;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; 1D651;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; 1D652;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; 1D653;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; 1D654;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; 1D655;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; 1D656;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; 1D657;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; 1D658;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; 1D659;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; 1D65A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; 1D65B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; 1D65C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; 1D65D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; 1D65E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; 1D65F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; 1D660;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; 1D661;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; 1D662;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; 1D663;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; 1D664;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; 1D665;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; 1D666;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; 1D667;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; 1D668;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; 1D669;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; 1D66A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; 1D66B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; 1D66C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; 1D66D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; 1D66E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; 1D66F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; 1D670;MATHEMATICAL MONOSPACE CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; 1D671;MATHEMATICAL MONOSPACE CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; 1D672;MATHEMATICAL MONOSPACE CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; 1D673;MATHEMATICAL MONOSPACE CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; 1D674;MATHEMATICAL MONOSPACE CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; 1D675;MATHEMATICAL MONOSPACE CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; 1D676;MATHEMATICAL MONOSPACE CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; 1D677;MATHEMATICAL MONOSPACE CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; 1D678;MATHEMATICAL MONOSPACE CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; 1D679;MATHEMATICAL MONOSPACE CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; 1D67A;MATHEMATICAL MONOSPACE CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; 1D67B;MATHEMATICAL MONOSPACE CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; 1D67C;MATHEMATICAL MONOSPACE CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; 1D67D;MATHEMATICAL MONOSPACE CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; 1D67E;MATHEMATICAL MONOSPACE CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; 1D67F;MATHEMATICAL MONOSPACE CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; 1D680;MATHEMATICAL MONOSPACE CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; 1D681;MATHEMATICAL MONOSPACE CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; 1D682;MATHEMATICAL MONOSPACE CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; 1D683;MATHEMATICAL MONOSPACE CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; 1D684;MATHEMATICAL MONOSPACE CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; 1D685;MATHEMATICAL MONOSPACE CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; 1D686;MATHEMATICAL MONOSPACE CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; 1D687;MATHEMATICAL MONOSPACE CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; 1D688;MATHEMATICAL MONOSPACE CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; 1D689;MATHEMATICAL MONOSPACE CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; 1D68A;MATHEMATICAL MONOSPACE SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; 1D68B;MATHEMATICAL MONOSPACE SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; 1D68C;MATHEMATICAL MONOSPACE SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; 1D68D;MATHEMATICAL MONOSPACE SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; 1D68E;MATHEMATICAL MONOSPACE SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; 1D68F;MATHEMATICAL MONOSPACE SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; 1D690;MATHEMATICAL MONOSPACE SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; 1D691;MATHEMATICAL MONOSPACE SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; 1D692;MATHEMATICAL MONOSPACE SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; 1D693;MATHEMATICAL MONOSPACE SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; 1D694;MATHEMATICAL MONOSPACE SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; 1D695;MATHEMATICAL MONOSPACE SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; 1D696;MATHEMATICAL MONOSPACE SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; 1D697;MATHEMATICAL MONOSPACE SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; 1D698;MATHEMATICAL MONOSPACE SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; 1D699;MATHEMATICAL MONOSPACE SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; 1D69A;MATHEMATICAL MONOSPACE SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; 1D69B;MATHEMATICAL MONOSPACE SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; 1D69C;MATHEMATICAL MONOSPACE SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; 1D69D;MATHEMATICAL MONOSPACE SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; 1D69E;MATHEMATICAL MONOSPACE SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; 1D69F;MATHEMATICAL MONOSPACE SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; 1D6A0;MATHEMATICAL MONOSPACE SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; 1D6A1;MATHEMATICAL MONOSPACE SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; 1D6A2;MATHEMATICAL MONOSPACE SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; 1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; 1D6A4;MATHEMATICAL ITALIC SMALL DOTLESS I;Ll;0;L;<font> 0131;;;;N;;;;; 1D6A5;MATHEMATICAL ITALIC SMALL DOTLESS J;Ll;0;L;<font> 0237;;;;N;;;;; 1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; 1D6A9;MATHEMATICAL BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; 1D6AA;MATHEMATICAL BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; 1D6AB;MATHEMATICAL BOLD CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; 1D6AC;MATHEMATICAL BOLD CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; 1D6AD;MATHEMATICAL BOLD CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; 1D6AE;MATHEMATICAL BOLD CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; 1D6AF;MATHEMATICAL BOLD CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; 1D6B0;MATHEMATICAL BOLD CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; 1D6B1;MATHEMATICAL BOLD CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; 1D6B2;MATHEMATICAL BOLD CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; 1D6B3;MATHEMATICAL BOLD CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; 1D6B4;MATHEMATICAL BOLD CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; 1D6B5;MATHEMATICAL BOLD CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; 1D6B6;MATHEMATICAL BOLD CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; 1D6B7;MATHEMATICAL BOLD CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; 1D6B8;MATHEMATICAL BOLD CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; 1D6B9;MATHEMATICAL BOLD CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; 1D6BA;MATHEMATICAL BOLD CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; 1D6BB;MATHEMATICAL BOLD CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; 1D6BC;MATHEMATICAL BOLD CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; 1D6BD;MATHEMATICAL BOLD CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; 1D6BE;MATHEMATICAL BOLD CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; 1D6BF;MATHEMATICAL BOLD CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; 1D6C0;MATHEMATICAL BOLD CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; 1D6C1;MATHEMATICAL BOLD NABLA;Sm;0;L;<font> 2207;;;;N;;;;; 1D6C2;MATHEMATICAL BOLD SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; 1D6C3;MATHEMATICAL BOLD SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; 1D6C4;MATHEMATICAL BOLD SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; 1D6C5;MATHEMATICAL BOLD SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; 1D6C6;MATHEMATICAL BOLD SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; 1D6C7;MATHEMATICAL BOLD SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; 1D6C8;MATHEMATICAL BOLD SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; 1D6C9;MATHEMATICAL BOLD SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; 1D6CA;MATHEMATICAL BOLD SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; 1D6CB;MATHEMATICAL BOLD SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; 1D6CC;MATHEMATICAL BOLD SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; 1D6CD;MATHEMATICAL BOLD SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; 1D6CE;MATHEMATICAL BOLD SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; 1D6CF;MATHEMATICAL BOLD SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; 1D6D0;MATHEMATICAL BOLD SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; 1D6D1;MATHEMATICAL BOLD SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; 1D6D2;MATHEMATICAL BOLD SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; 1D6D3;MATHEMATICAL BOLD SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; 1D6D4;MATHEMATICAL BOLD SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; 1D6D5;MATHEMATICAL BOLD SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; 1D6D6;MATHEMATICAL BOLD SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; 1D6D7;MATHEMATICAL BOLD SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; 1D6D8;MATHEMATICAL BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; 1D6D9;MATHEMATICAL BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; 1D6DA;MATHEMATICAL BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; 1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;; 1D6DC;MATHEMATICAL BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; 1D6DD;MATHEMATICAL BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; 1D6DE;MATHEMATICAL BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; 1D6DF;MATHEMATICAL BOLD PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; 1D6E0;MATHEMATICAL BOLD RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; 1D6E1;MATHEMATICAL BOLD PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; 1D6E2;MATHEMATICAL ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; 1D6E3;MATHEMATICAL ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; 1D6E4;MATHEMATICAL ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; 1D6E5;MATHEMATICAL ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; 1D6E6;MATHEMATICAL ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; 1D6E7;MATHEMATICAL ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; 1D6E8;MATHEMATICAL ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; 1D6E9;MATHEMATICAL ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; 1D6EA;MATHEMATICAL ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; 1D6EB;MATHEMATICAL ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; 1D6EC;MATHEMATICAL ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; 1D6ED;MATHEMATICAL ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; 1D6EE;MATHEMATICAL ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; 1D6EF;MATHEMATICAL ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; 1D6F0;MATHEMATICAL ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; 1D6F1;MATHEMATICAL ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; 1D6F2;MATHEMATICAL ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; 1D6F3;MATHEMATICAL ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; 1D6F4;MATHEMATICAL ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; 1D6F5;MATHEMATICAL ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; 1D6F6;MATHEMATICAL ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; 1D6F7;MATHEMATICAL ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; 1D6F8;MATHEMATICAL ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; 1D6F9;MATHEMATICAL ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; 1D6FA;MATHEMATICAL ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; 1D6FB;MATHEMATICAL ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;; 1D6FC;MATHEMATICAL ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; 1D6FD;MATHEMATICAL ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; 1D6FE;MATHEMATICAL ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; 1D6FF;MATHEMATICAL ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; 1D700;MATHEMATICAL ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; 1D701;MATHEMATICAL ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; 1D702;MATHEMATICAL ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; 1D703;MATHEMATICAL ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; 1D704;MATHEMATICAL ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; 1D705;MATHEMATICAL ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; 1D706;MATHEMATICAL ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; 1D707;MATHEMATICAL ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; 1D708;MATHEMATICAL ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; 1D709;MATHEMATICAL ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; 1D70A;MATHEMATICAL ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; 1D70B;MATHEMATICAL ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; 1D70C;MATHEMATICAL ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; 1D70D;MATHEMATICAL ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; 1D70E;MATHEMATICAL ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; 1D70F;MATHEMATICAL ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; 1D710;MATHEMATICAL ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; 1D711;MATHEMATICAL ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; 1D712;MATHEMATICAL ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; 1D713;MATHEMATICAL ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; 1D714;MATHEMATICAL ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; 1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;; 1D716;MATHEMATICAL ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; 1D717;MATHEMATICAL ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; 1D718;MATHEMATICAL ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; 1D719;MATHEMATICAL ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; 1D71A;MATHEMATICAL ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; 1D71B;MATHEMATICAL ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; 1D71C;MATHEMATICAL BOLD ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; 1D71D;MATHEMATICAL BOLD ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; 1D71E;MATHEMATICAL BOLD ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; 1D71F;MATHEMATICAL BOLD ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; 1D720;MATHEMATICAL BOLD ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; 1D721;MATHEMATICAL BOLD ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; 1D722;MATHEMATICAL BOLD ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; 1D723;MATHEMATICAL BOLD ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; 1D724;MATHEMATICAL BOLD ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; 1D725;MATHEMATICAL BOLD ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; 1D726;MATHEMATICAL BOLD ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; 1D727;MATHEMATICAL BOLD ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; 1D728;MATHEMATICAL BOLD ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; 1D729;MATHEMATICAL BOLD ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; 1D72A;MATHEMATICAL BOLD ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; 1D72B;MATHEMATICAL BOLD ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; 1D72C;MATHEMATICAL BOLD ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; 1D72D;MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; 1D72E;MATHEMATICAL BOLD ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; 1D72F;MATHEMATICAL BOLD ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; 1D730;MATHEMATICAL BOLD ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; 1D731;MATHEMATICAL BOLD ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; 1D732;MATHEMATICAL BOLD ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; 1D733;MATHEMATICAL BOLD ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; 1D734;MATHEMATICAL BOLD ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; 1D735;MATHEMATICAL BOLD ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;; 1D736;MATHEMATICAL BOLD ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; 1D737;MATHEMATICAL BOLD ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; 1D738;MATHEMATICAL BOLD ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; 1D739;MATHEMATICAL BOLD ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; 1D73A;MATHEMATICAL BOLD ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; 1D73B;MATHEMATICAL BOLD ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; 1D73C;MATHEMATICAL BOLD ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; 1D73D;MATHEMATICAL BOLD ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; 1D73E;MATHEMATICAL BOLD ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; 1D73F;MATHEMATICAL BOLD ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; 1D740;MATHEMATICAL BOLD ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; 1D741;MATHEMATICAL BOLD ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; 1D742;MATHEMATICAL BOLD ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; 1D743;MATHEMATICAL BOLD ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; 1D744;MATHEMATICAL BOLD ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; 1D745;MATHEMATICAL BOLD ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; 1D746;MATHEMATICAL BOLD ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; 1D747;MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; 1D748;MATHEMATICAL BOLD ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; 1D749;MATHEMATICAL BOLD ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; 1D74A;MATHEMATICAL BOLD ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; 1D74B;MATHEMATICAL BOLD ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; 1D74C;MATHEMATICAL BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; 1D74D;MATHEMATICAL BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; 1D74E;MATHEMATICAL BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; 1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;; 1D750;MATHEMATICAL BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; 1D751;MATHEMATICAL BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; 1D752;MATHEMATICAL BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; 1D753;MATHEMATICAL BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; 1D754;MATHEMATICAL BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; 1D755;MATHEMATICAL BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; 1D756;MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; 1D757;MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; 1D758;MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; 1D759;MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; 1D75A;MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; 1D75B;MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; 1D75C;MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; 1D75D;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; 1D75E;MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; 1D75F;MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; 1D760;MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; 1D761;MATHEMATICAL SANS-SERIF BOLD CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; 1D762;MATHEMATICAL SANS-SERIF BOLD CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; 1D763;MATHEMATICAL SANS-SERIF BOLD CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; 1D764;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; 1D765;MATHEMATICAL SANS-SERIF BOLD CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; 1D766;MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; 1D767;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; 1D768;MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; 1D769;MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; 1D76A;MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; 1D76B;MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; 1D76C;MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; 1D76D;MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; 1D76E;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; 1D76F;MATHEMATICAL SANS-SERIF BOLD NABLA;Sm;0;L;<font> 2207;;;;N;;;;; 1D770;MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; 1D771;MATHEMATICAL SANS-SERIF BOLD SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; 1D772;MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; 1D773;MATHEMATICAL SANS-SERIF BOLD SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; 1D774;MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; 1D775;MATHEMATICAL SANS-SERIF BOLD SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; 1D776;MATHEMATICAL SANS-SERIF BOLD SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; 1D777;MATHEMATICAL SANS-SERIF BOLD SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; 1D778;MATHEMATICAL SANS-SERIF BOLD SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; 1D779;MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; 1D77A;MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; 1D77B;MATHEMATICAL SANS-SERIF BOLD SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; 1D77C;MATHEMATICAL SANS-SERIF BOLD SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; 1D77D;MATHEMATICAL SANS-SERIF BOLD SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; 1D77E;MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; 1D77F;MATHEMATICAL SANS-SERIF BOLD SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; 1D780;MATHEMATICAL SANS-SERIF BOLD SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; 1D781;MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; 1D782;MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; 1D783;MATHEMATICAL SANS-SERIF BOLD SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; 1D784;MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; 1D785;MATHEMATICAL SANS-SERIF BOLD SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; 1D786;MATHEMATICAL SANS-SERIF BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; 1D787;MATHEMATICAL SANS-SERIF BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; 1D788;MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; 1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;; 1D78A;MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; 1D78B;MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; 1D78C;MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; 1D78D;MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; 1D78E;MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; 1D78F;MATHEMATICAL SANS-SERIF BOLD PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; 1D790;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; 1D791;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; 1D792;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; 1D793;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; 1D794;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; 1D795;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; 1D796;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; 1D797;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; 1D798;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; 1D799;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; 1D79A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; 1D79B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; 1D79C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; 1D79D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; 1D79E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; 1D79F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; 1D7A0;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; 1D7A1;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; 1D7A2;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; 1D7A3;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; 1D7A4;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; 1D7A5;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; 1D7A6;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; 1D7A7;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; 1D7A8;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; 1D7A9;MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;; 1D7AA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; 1D7AB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; 1D7AC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; 1D7AD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; 1D7AE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; 1D7AF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; 1D7B0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; 1D7B1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; 1D7B2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; 1D7B3;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; 1D7B4;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; 1D7B5;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; 1D7B6;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; 1D7B7;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; 1D7B8;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; 1D7B9;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; 1D7BA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; 1D7BB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; 1D7BC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; 1D7BD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; 1D7BE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; 1D7BF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; 1D7C0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; 1D7C1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; 1D7C2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; 1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;; 1D7C4;MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; 1D7C5;MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; 1D7C6;MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; 1D7C7;MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; 1D7C8;MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; 1D7C9;MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; 1D7CA;MATHEMATICAL BOLD CAPITAL DIGAMMA;Lu;0;L;<font> 03DC;;;;N;;;;; 1D7CB;MATHEMATICAL BOLD SMALL DIGAMMA;Ll;0;L;<font> 03DD;;;;N;;;;; 1D7CE;MATHEMATICAL BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; 1D7CF;MATHEMATICAL BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; 1D7D0;MATHEMATICAL BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; 1D7D1;MATHEMATICAL BOLD DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; 1D7D2;MATHEMATICAL BOLD DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; 1D7D3;MATHEMATICAL BOLD DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; 1D7D4;MATHEMATICAL BOLD DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; 1D7D5;MATHEMATICAL BOLD DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; 1D7D6;MATHEMATICAL BOLD DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; 1D7D7;MATHEMATICAL BOLD DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; 1D7D8;MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; 1D7D9;MATHEMATICAL DOUBLE-STRUCK DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; 1D7DA;MATHEMATICAL DOUBLE-STRUCK DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; 1D7DB;MATHEMATICAL DOUBLE-STRUCK DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; 1D7DC;MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; 1D7DD;MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; 1D7DE;MATHEMATICAL DOUBLE-STRUCK DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; 1D7DF;MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; 1D7E0;MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; 1D7E1;MATHEMATICAL DOUBLE-STRUCK DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; 1D7E2;MATHEMATICAL SANS-SERIF DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; 1D7E3;MATHEMATICAL SANS-SERIF DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; 1D7E4;MATHEMATICAL SANS-SERIF DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; 1D7E5;MATHEMATICAL SANS-SERIF DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; 1D7E6;MATHEMATICAL SANS-SERIF DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; 1D7E7;MATHEMATICAL SANS-SERIF DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; 1D7E8;MATHEMATICAL SANS-SERIF DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; 1D7E9;MATHEMATICAL SANS-SERIF DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; 1D7EA;MATHEMATICAL SANS-SERIF DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; 1D7EB;MATHEMATICAL SANS-SERIF DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; 1D7EC;MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; 1D7ED;MATHEMATICAL SANS-SERIF BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; 1D7EE;MATHEMATICAL SANS-SERIF BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; 1D7EF;MATHEMATICAL SANS-SERIF BOLD DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; 1D7F0;MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; 1D7F1;MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; 1D7F2;MATHEMATICAL SANS-SERIF BOLD DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; 1D7F3;MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; 1D7F4;MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; 1D7F5;MATHEMATICAL SANS-SERIF BOLD DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; 1D7F6;MATHEMATICAL MONOSPACE DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; 1D7F7;MATHEMATICAL MONOSPACE DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; 1D7F8;MATHEMATICAL MONOSPACE DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; 1D7F9;MATHEMATICAL MONOSPACE DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; 1D7FA;MATHEMATICAL MONOSPACE DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; 1D7FB;MATHEMATICAL MONOSPACE DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; 1D7FC;MATHEMATICAL MONOSPACE DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; 1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; 1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; 1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; 1D800;SIGNWRITING HAND-FIST INDEX;So;0;L;;;;;N;;;;; 1D801;SIGNWRITING HAND-CIRCLE INDEX;So;0;L;;;;;N;;;;; 1D802;SIGNWRITING HAND-CUP INDEX;So;0;L;;;;;N;;;;; 1D803;SIGNWRITING HAND-OVAL INDEX;So;0;L;;;;;N;;;;; 1D804;SIGNWRITING HAND-HINGE INDEX;So;0;L;;;;;N;;;;; 1D805;SIGNWRITING HAND-ANGLE INDEX;So;0;L;;;;;N;;;;; 1D806;SIGNWRITING HAND-FIST INDEX BENT;So;0;L;;;;;N;;;;; 1D807;SIGNWRITING HAND-CIRCLE INDEX BENT;So;0;L;;;;;N;;;;; 1D808;SIGNWRITING HAND-FIST THUMB UNDER INDEX BENT;So;0;L;;;;;N;;;;; 1D809;SIGNWRITING HAND-FIST INDEX RAISED KNUCKLE;So;0;L;;;;;N;;;;; 1D80A;SIGNWRITING HAND-FIST INDEX CUPPED;So;0;L;;;;;N;;;;; 1D80B;SIGNWRITING HAND-FIST INDEX HINGED;So;0;L;;;;;N;;;;; 1D80C;SIGNWRITING HAND-FIST INDEX HINGED LOW;So;0;L;;;;;N;;;;; 1D80D;SIGNWRITING HAND-CIRCLE INDEX HINGE;So;0;L;;;;;N;;;;; 1D80E;SIGNWRITING HAND-FIST INDEX MIDDLE;So;0;L;;;;;N;;;;; 1D80F;SIGNWRITING HAND-CIRCLE INDEX MIDDLE;So;0;L;;;;;N;;;;; 1D810;SIGNWRITING HAND-FIST INDEX MIDDLE BENT;So;0;L;;;;;N;;;;; 1D811;SIGNWRITING HAND-FIST INDEX MIDDLE RAISED KNUCKLES;So;0;L;;;;;N;;;;; 1D812;SIGNWRITING HAND-FIST INDEX MIDDLE HINGED;So;0;L;;;;;N;;;;; 1D813;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED;So;0;L;;;;;N;;;;; 1D814;SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP;So;0;L;;;;;N;;;;; 1D815;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED;So;0;L;;;;;N;;;;; 1D816;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED INDEX BENT;So;0;L;;;;;N;;;;; 1D817;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED MIDDLE BENT;So;0;L;;;;;N;;;;; 1D818;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED;So;0;L;;;;;N;;;;; 1D819;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED;So;0;L;;;;;N;;;;; 1D81A;SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED;So;0;L;;;;;N;;;;; 1D81B;SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSSED;So;0;L;;;;;N;;;;; 1D81C;SIGNWRITING HAND-FIST MIDDLE BENT OVER INDEX;So;0;L;;;;;N;;;;; 1D81D;SIGNWRITING HAND-FIST INDEX BENT OVER MIDDLE;So;0;L;;;;;N;;;;; 1D81E;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB;So;0;L;;;;;N;;;;; 1D81F;SIGNWRITING HAND-CIRCLE INDEX MIDDLE THUMB;So;0;L;;;;;N;;;;; 1D820;SIGNWRITING HAND-FIST INDEX MIDDLE STRAIGHT THUMB BENT;So;0;L;;;;;N;;;;; 1D821;SIGNWRITING HAND-FIST INDEX MIDDLE BENT THUMB STRAIGHT;So;0;L;;;;;N;;;;; 1D822;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB BENT;So;0;L;;;;;N;;;;; 1D823;SIGNWRITING HAND-FIST INDEX MIDDLE HINGED SPREAD THUMB SIDE;So;0;L;;;;;N;;;;; 1D824;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB SIDE;So;0;L;;;;;N;;;;; 1D825;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB CONJOINED;So;0;L;;;;;N;;;;; 1D826;SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP THUMB SIDE;So;0;L;;;;;N;;;;; 1D827;SIGNWRITING HAND-FIST INDEX MIDDLE UP SPREAD THUMB FORWARD;So;0;L;;;;;N;;;;; 1D828;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CUPPED;So;0;L;;;;;N;;;;; 1D829;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CIRCLED;So;0;L;;;;;N;;;;; 1D82A;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HOOKED;So;0;L;;;;;N;;;;; 1D82B;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HINGED;So;0;L;;;;;N;;;;; 1D82C;SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE STRAIGHT;So;0;L;;;;;N;;;;; 1D82D;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE;So;0;L;;;;;N;;;;; 1D82E;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE CONJOINED;So;0;L;;;;;N;;;;; 1D82F;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE BENT;So;0;L;;;;;N;;;;; 1D830;SIGNWRITING HAND-FIST MIDDLE THUMB HOOKED INDEX UP;So;0;L;;;;;N;;;;; 1D831;SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE UP;So;0;L;;;;;N;;;;; 1D832;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED THUMB SIDE;So;0;L;;;;;N;;;;; 1D833;SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED THUMB SIDE;So;0;L;;;;;N;;;;; 1D834;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB FORWARD;So;0;L;;;;;N;;;;; 1D835;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED THUMB FORWARD;So;0;L;;;;;N;;;;; 1D836;SIGNWRITING HAND-FIST MIDDLE THUMB CUPPED INDEX UP;So;0;L;;;;;N;;;;; 1D837;SIGNWRITING HAND-FIST INDEX THUMB CUPPED MIDDLE UP;So;0;L;;;;;N;;;;; 1D838;SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX UP;So;0;L;;;;;N;;;;; 1D839;SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX HINGED;So;0;L;;;;;N;;;;; 1D83A;SIGNWRITING HAND-FIST INDEX THUMB ANGLED OUT MIDDLE UP;So;0;L;;;;;N;;;;; 1D83B;SIGNWRITING HAND-FIST INDEX THUMB ANGLED IN MIDDLE UP;So;0;L;;;;;N;;;;; 1D83C;SIGNWRITING HAND-FIST INDEX THUMB CIRCLED MIDDLE UP;So;0;L;;;;;N;;;;; 1D83D;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CONJOINED HINGED;So;0;L;;;;;N;;;;; 1D83E;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED OUT;So;0;L;;;;;N;;;;; 1D83F;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED;So;0;L;;;;;N;;;;; 1D840;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX UP;So;0;L;;;;;N;;;;; 1D841;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX CROSSED;So;0;L;;;;;N;;;;; 1D842;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED INDEX UP;So;0;L;;;;;N;;;;; 1D843;SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE HINGED;So;0;L;;;;;N;;;;; 1D844;SIGNWRITING HAND-FLAT FOUR FINGERS;So;0;L;;;;;N;;;;; 1D845;SIGNWRITING HAND-FLAT FOUR FINGERS BENT;So;0;L;;;;;N;;;;; 1D846;SIGNWRITING HAND-FLAT FOUR FINGERS HINGED;So;0;L;;;;;N;;;;; 1D847;SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; 1D848;SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED SPLIT;So;0;L;;;;;N;;;;; 1D849;SIGNWRITING HAND-CLAW FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; 1D84A;SIGNWRITING HAND-FIST FOUR FINGERS CONJOINED BENT;So;0;L;;;;;N;;;;; 1D84B;SIGNWRITING HAND-HINGE FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; 1D84C;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; 1D84D;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; 1D84E;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD FOUR BENT;So;0;L;;;;;N;;;;; 1D84F;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD FOUR BENT;So;0;L;;;;;N;;;;; 1D850;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD BENT;So;0;L;;;;;N;;;;; 1D851;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD BENT;So;0;L;;;;;N;;;;; 1D852;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD THUMB FORWARD;So;0;L;;;;;N;;;;; 1D853;SIGNWRITING HAND-CUP FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; 1D854;SIGNWRITING HAND-CUP FIVE FINGERS SPREAD OPEN;So;0;L;;;;;N;;;;; 1D855;SIGNWRITING HAND-HINGE FIVE FINGERS SPREAD OPEN;So;0;L;;;;;N;;;;; 1D856;SIGNWRITING HAND-OVAL FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; 1D857;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED;So;0;L;;;;;N;;;;; 1D858;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED THUMB SIDE;So;0;L;;;;;N;;;;; 1D859;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED NO THUMB;So;0;L;;;;;N;;;;; 1D85A;SIGNWRITING HAND-FLAT;So;0;L;;;;;N;;;;; 1D85B;SIGNWRITING HAND-FLAT BETWEEN PALM FACINGS;So;0;L;;;;;N;;;;; 1D85C;SIGNWRITING HAND-FLAT HEEL;So;0;L;;;;;N;;;;; 1D85D;SIGNWRITING HAND-FLAT THUMB SIDE;So;0;L;;;;;N;;;;; 1D85E;SIGNWRITING HAND-FLAT HEEL THUMB SIDE;So;0;L;;;;;N;;;;; 1D85F;SIGNWRITING HAND-FLAT THUMB BENT;So;0;L;;;;;N;;;;; 1D860;SIGNWRITING HAND-FLAT THUMB FORWARD;So;0;L;;;;;N;;;;; 1D861;SIGNWRITING HAND-FLAT SPLIT INDEX THUMB SIDE;So;0;L;;;;;N;;;;; 1D862;SIGNWRITING HAND-FLAT SPLIT CENTRE;So;0;L;;;;;N;;;;; 1D863;SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE;So;0;L;;;;;N;;;;; 1D864;SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE BENT;So;0;L;;;;;N;;;;; 1D865;SIGNWRITING HAND-FLAT SPLIT LITTLE;So;0;L;;;;;N;;;;; 1D866;SIGNWRITING HAND-CLAW;So;0;L;;;;;N;;;;; 1D867;SIGNWRITING HAND-CLAW THUMB SIDE;So;0;L;;;;;N;;;;; 1D868;SIGNWRITING HAND-CLAW NO THUMB;So;0;L;;;;;N;;;;; 1D869;SIGNWRITING HAND-CLAW THUMB FORWARD;So;0;L;;;;;N;;;;; 1D86A;SIGNWRITING HAND-HOOK CURLICUE;So;0;L;;;;;N;;;;; 1D86B;SIGNWRITING HAND-HOOK;So;0;L;;;;;N;;;;; 1D86C;SIGNWRITING HAND-CUP OPEN;So;0;L;;;;;N;;;;; 1D86D;SIGNWRITING HAND-CUP;So;0;L;;;;;N;;;;; 1D86E;SIGNWRITING HAND-CUP OPEN THUMB SIDE;So;0;L;;;;;N;;;;; 1D86F;SIGNWRITING HAND-CUP THUMB SIDE;So;0;L;;;;;N;;;;; 1D870;SIGNWRITING HAND-CUP OPEN NO THUMB;So;0;L;;;;;N;;;;; 1D871;SIGNWRITING HAND-CUP NO THUMB;So;0;L;;;;;N;;;;; 1D872;SIGNWRITING HAND-CUP OPEN THUMB FORWARD;So;0;L;;;;;N;;;;; 1D873;SIGNWRITING HAND-CUP THUMB FORWARD;So;0;L;;;;;N;;;;; 1D874;SIGNWRITING HAND-CURLICUE OPEN;So;0;L;;;;;N;;;;; 1D875;SIGNWRITING HAND-CURLICUE;So;0;L;;;;;N;;;;; 1D876;SIGNWRITING HAND-CIRCLE;So;0;L;;;;;N;;;;; 1D877;SIGNWRITING HAND-OVAL;So;0;L;;;;;N;;;;; 1D878;SIGNWRITING HAND-OVAL THUMB SIDE;So;0;L;;;;;N;;;;; 1D879;SIGNWRITING HAND-OVAL NO THUMB;So;0;L;;;;;N;;;;; 1D87A;SIGNWRITING HAND-OVAL THUMB FORWARD;So;0;L;;;;;N;;;;; 1D87B;SIGNWRITING HAND-HINGE OPEN;So;0;L;;;;;N;;;;; 1D87C;SIGNWRITING HAND-HINGE OPEN THUMB FORWARD;So;0;L;;;;;N;;;;; 1D87D;SIGNWRITING HAND-HINGE;So;0;L;;;;;N;;;;; 1D87E;SIGNWRITING HAND-HINGE SMALL;So;0;L;;;;;N;;;;; 1D87F;SIGNWRITING HAND-HINGE OPEN THUMB SIDE;So;0;L;;;;;N;;;;; 1D880;SIGNWRITING HAND-HINGE THUMB SIDE;So;0;L;;;;;N;;;;; 1D881;SIGNWRITING HAND-HINGE OPEN NO THUMB;So;0;L;;;;;N;;;;; 1D882;SIGNWRITING HAND-HINGE NO THUMB;So;0;L;;;;;N;;;;; 1D883;SIGNWRITING HAND-HINGE THUMB SIDE TOUCHING INDEX;So;0;L;;;;;N;;;;; 1D884;SIGNWRITING HAND-HINGE THUMB BETWEEN MIDDLE RING;So;0;L;;;;;N;;;;; 1D885;SIGNWRITING HAND-ANGLE;So;0;L;;;;;N;;;;; 1D886;SIGNWRITING HAND-FIST INDEX MIDDLE RING;So;0;L;;;;;N;;;;; 1D887;SIGNWRITING HAND-CIRCLE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; 1D888;SIGNWRITING HAND-HINGE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; 1D889;SIGNWRITING HAND-ANGLE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; 1D88A;SIGNWRITING HAND-HINGE LITTLE;So;0;L;;;;;N;;;;; 1D88B;SIGNWRITING HAND-FIST INDEX MIDDLE RING BENT;So;0;L;;;;;N;;;;; 1D88C;SIGNWRITING HAND-FIST INDEX MIDDLE RING CONJOINED;So;0;L;;;;;N;;;;; 1D88D;SIGNWRITING HAND-HINGE INDEX MIDDLE RING CONJOINED;So;0;L;;;;;N;;;;; 1D88E;SIGNWRITING HAND-FIST LITTLE DOWN;So;0;L;;;;;N;;;;; 1D88F;SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE STRAIGHT;So;0;L;;;;;N;;;;; 1D890;SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE CURVED;So;0;L;;;;;N;;;;; 1D891;SIGNWRITING HAND-FIST LITTLE DOWN OTHERS CIRCLED;So;0;L;;;;;N;;;;; 1D892;SIGNWRITING HAND-FIST LITTLE UP;So;0;L;;;;;N;;;;; 1D893;SIGNWRITING HAND-FIST THUMB UNDER LITTLE UP;So;0;L;;;;;N;;;;; 1D894;SIGNWRITING HAND-CIRCLE LITTLE UP;So;0;L;;;;;N;;;;; 1D895;SIGNWRITING HAND-OVAL LITTLE UP;So;0;L;;;;;N;;;;; 1D896;SIGNWRITING HAND-ANGLE LITTLE UP;So;0;L;;;;;N;;;;; 1D897;SIGNWRITING HAND-FIST LITTLE RAISED KNUCKLE;So;0;L;;;;;N;;;;; 1D898;SIGNWRITING HAND-FIST LITTLE BENT;So;0;L;;;;;N;;;;; 1D899;SIGNWRITING HAND-FIST LITTLE TOUCHES THUMB;So;0;L;;;;;N;;;;; 1D89A;SIGNWRITING HAND-FIST LITTLE THUMB;So;0;L;;;;;N;;;;; 1D89B;SIGNWRITING HAND-HINGE LITTLE THUMB;So;0;L;;;;;N;;;;; 1D89C;SIGNWRITING HAND-FIST LITTLE INDEX THUMB;So;0;L;;;;;N;;;;; 1D89D;SIGNWRITING HAND-HINGE LITTLE INDEX THUMB;So;0;L;;;;;N;;;;; 1D89E;SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB OUT;So;0;L;;;;;N;;;;; 1D89F;SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB;So;0;L;;;;;N;;;;; 1D8A0;SIGNWRITING HAND-FIST LITTLE INDEX;So;0;L;;;;;N;;;;; 1D8A1;SIGNWRITING HAND-CIRCLE LITTLE INDEX;So;0;L;;;;;N;;;;; 1D8A2;SIGNWRITING HAND-HINGE LITTLE INDEX;So;0;L;;;;;N;;;;; 1D8A3;SIGNWRITING HAND-ANGLE LITTLE INDEX;So;0;L;;;;;N;;;;; 1D8A4;SIGNWRITING HAND-FIST INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; 1D8A5;SIGNWRITING HAND-CIRCLE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; 1D8A6;SIGNWRITING HAND-HINGE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; 1D8A7;SIGNWRITING HAND-HINGE RING;So;0;L;;;;;N;;;;; 1D8A8;SIGNWRITING HAND-ANGLE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; 1D8A9;SIGNWRITING HAND-FIST INDEX MIDDLE CROSS LITTLE;So;0;L;;;;;N;;;;; 1D8AA;SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSS LITTLE;So;0;L;;;;;N;;;;; 1D8AB;SIGNWRITING HAND-FIST RING DOWN;So;0;L;;;;;N;;;;; 1D8AC;SIGNWRITING HAND-HINGE RING DOWN INDEX THUMB HOOK MIDDLE;So;0;L;;;;;N;;;;; 1D8AD;SIGNWRITING HAND-ANGLE RING DOWN MIDDLE THUMB INDEX CROSS;So;0;L;;;;;N;;;;; 1D8AE;SIGNWRITING HAND-FIST RING UP;So;0;L;;;;;N;;;;; 1D8AF;SIGNWRITING HAND-FIST RING RAISED KNUCKLE;So;0;L;;;;;N;;;;; 1D8B0;SIGNWRITING HAND-FIST RING LITTLE;So;0;L;;;;;N;;;;; 1D8B1;SIGNWRITING HAND-CIRCLE RING LITTLE;So;0;L;;;;;N;;;;; 1D8B2;SIGNWRITING HAND-OVAL RING LITTLE;So;0;L;;;;;N;;;;; 1D8B3;SIGNWRITING HAND-ANGLE RING LITTLE;So;0;L;;;;;N;;;;; 1D8B4;SIGNWRITING HAND-FIST RING MIDDLE;So;0;L;;;;;N;;;;; 1D8B5;SIGNWRITING HAND-FIST RING MIDDLE CONJOINED;So;0;L;;;;;N;;;;; 1D8B6;SIGNWRITING HAND-FIST RING MIDDLE RAISED KNUCKLES;So;0;L;;;;;N;;;;; 1D8B7;SIGNWRITING HAND-FIST RING INDEX;So;0;L;;;;;N;;;;; 1D8B8;SIGNWRITING HAND-FIST RING THUMB;So;0;L;;;;;N;;;;; 1D8B9;SIGNWRITING HAND-HOOK RING THUMB;So;0;L;;;;;N;;;;; 1D8BA;SIGNWRITING HAND-FIST INDEX RING LITTLE;So;0;L;;;;;N;;;;; 1D8BB;SIGNWRITING HAND-CIRCLE INDEX RING LITTLE;So;0;L;;;;;N;;;;; 1D8BC;SIGNWRITING HAND-CURLICUE INDEX RING LITTLE ON;So;0;L;;;;;N;;;;; 1D8BD;SIGNWRITING HAND-HOOK INDEX RING LITTLE OUT;So;0;L;;;;;N;;;;; 1D8BE;SIGNWRITING HAND-HOOK INDEX RING LITTLE IN;So;0;L;;;;;N;;;;; 1D8BF;SIGNWRITING HAND-HOOK INDEX RING LITTLE UNDER;So;0;L;;;;;N;;;;; 1D8C0;SIGNWRITING HAND-CUP INDEX RING LITTLE;So;0;L;;;;;N;;;;; 1D8C1;SIGNWRITING HAND-HINGE INDEX RING LITTLE;So;0;L;;;;;N;;;;; 1D8C2;SIGNWRITING HAND-ANGLE INDEX RING LITTLE OUT;So;0;L;;;;;N;;;;; 1D8C3;SIGNWRITING HAND-ANGLE INDEX RING LITTLE;So;0;L;;;;;N;;;;; 1D8C4;SIGNWRITING HAND-FIST MIDDLE DOWN;So;0;L;;;;;N;;;;; 1D8C5;SIGNWRITING HAND-HINGE MIDDLE;So;0;L;;;;;N;;;;; 1D8C6;SIGNWRITING HAND-FIST MIDDLE UP;So;0;L;;;;;N;;;;; 1D8C7;SIGNWRITING HAND-CIRCLE MIDDLE UP;So;0;L;;;;;N;;;;; 1D8C8;SIGNWRITING HAND-FIST MIDDLE RAISED KNUCKLE;So;0;L;;;;;N;;;;; 1D8C9;SIGNWRITING HAND-FIST MIDDLE UP THUMB SIDE;So;0;L;;;;;N;;;;; 1D8CA;SIGNWRITING HAND-HOOK MIDDLE THUMB;So;0;L;;;;;N;;;;; 1D8CB;SIGNWRITING HAND-FIST MIDDLE THUMB LITTLE;So;0;L;;;;;N;;;;; 1D8CC;SIGNWRITING HAND-FIST MIDDLE LITTLE;So;0;L;;;;;N;;;;; 1D8CD;SIGNWRITING HAND-FIST MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; 1D8CE;SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; 1D8CF;SIGNWRITING HAND-CURLICUE MIDDLE RING LITTLE ON;So;0;L;;;;;N;;;;; 1D8D0;SIGNWRITING HAND-CUP MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; 1D8D1;SIGNWRITING HAND-HINGE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; 1D8D2;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE OUT;So;0;L;;;;;N;;;;; 1D8D3;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE IN;So;0;L;;;;;N;;;;; 1D8D4;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; 1D8D5;SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE BENT;So;0;L;;;;;N;;;;; 1D8D6;SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED;So;0;L;;;;;N;;;;; 1D8D7;SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED SIDE;So;0;L;;;;;N;;;;; 1D8D8;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED OUT;So;0;L;;;;;N;;;;; 1D8D9;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED IN;So;0;L;;;;;N;;;;; 1D8DA;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED;So;0;L;;;;;N;;;;; 1D8DB;SIGNWRITING HAND-HINGE INDEX HINGED;So;0;L;;;;;N;;;;; 1D8DC;SIGNWRITING HAND-FIST INDEX THUMB SIDE;So;0;L;;;;;N;;;;; 1D8DD;SIGNWRITING HAND-HINGE INDEX THUMB SIDE;So;0;L;;;;;N;;;;; 1D8DE;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB DIAGONAL;So;0;L;;;;;N;;;;; 1D8DF;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB CONJOINED;So;0;L;;;;;N;;;;; 1D8E0;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB BENT;So;0;L;;;;;N;;;;; 1D8E1;SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX BENT;So;0;L;;;;;N;;;;; 1D8E2;SIGNWRITING HAND-FIST INDEX THUMB SIDE BOTH BENT;So;0;L;;;;;N;;;;; 1D8E3;SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX HINGE;So;0;L;;;;;N;;;;; 1D8E4;SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX STRAIGHT;So;0;L;;;;;N;;;;; 1D8E5;SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX BENT;So;0;L;;;;;N;;;;; 1D8E6;SIGNWRITING HAND-FIST INDEX THUMB HOOK;So;0;L;;;;;N;;;;; 1D8E7;SIGNWRITING HAND-FIST INDEX THUMB CURLICUE;So;0;L;;;;;N;;;;; 1D8E8;SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB INSIDE;So;0;L;;;;;N;;;;; 1D8E9;SIGNWRITING HAND-CLAW INDEX THUMB CURVE THUMB INSIDE;So;0;L;;;;;N;;;;; 1D8EA;SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB UNDER;So;0;L;;;;;N;;;;; 1D8EB;SIGNWRITING HAND-FIST INDEX THUMB CIRCLE;So;0;L;;;;;N;;;;; 1D8EC;SIGNWRITING HAND-CUP INDEX THUMB;So;0;L;;;;;N;;;;; 1D8ED;SIGNWRITING HAND-CUP INDEX THUMB OPEN;So;0;L;;;;;N;;;;; 1D8EE;SIGNWRITING HAND-HINGE INDEX THUMB OPEN;So;0;L;;;;;N;;;;; 1D8EF;SIGNWRITING HAND-HINGE INDEX THUMB LARGE;So;0;L;;;;;N;;;;; 1D8F0;SIGNWRITING HAND-HINGE INDEX THUMB;So;0;L;;;;;N;;;;; 1D8F1;SIGNWRITING HAND-HINGE INDEX THUMB SMALL;So;0;L;;;;;N;;;;; 1D8F2;SIGNWRITING HAND-ANGLE INDEX THUMB OUT;So;0;L;;;;;N;;;;; 1D8F3;SIGNWRITING HAND-ANGLE INDEX THUMB IN;So;0;L;;;;;N;;;;; 1D8F4;SIGNWRITING HAND-ANGLE INDEX THUMB;So;0;L;;;;;N;;;;; 1D8F5;SIGNWRITING HAND-FIST THUMB;So;0;L;;;;;N;;;;; 1D8F6;SIGNWRITING HAND-FIST THUMB HEEL;So;0;L;;;;;N;;;;; 1D8F7;SIGNWRITING HAND-FIST THUMB SIDE DIAGONAL;So;0;L;;;;;N;;;;; 1D8F8;SIGNWRITING HAND-FIST THUMB SIDE CONJOINED;So;0;L;;;;;N;;;;; 1D8F9;SIGNWRITING HAND-FIST THUMB SIDE BENT;So;0;L;;;;;N;;;;; 1D8FA;SIGNWRITING HAND-FIST THUMB FORWARD;So;0;L;;;;;N;;;;; 1D8FB;SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE;So;0;L;;;;;N;;;;; 1D8FC;SIGNWRITING HAND-FIST THUMB BETWEEN MIDDLE RING;So;0;L;;;;;N;;;;; 1D8FD;SIGNWRITING HAND-FIST THUMB BETWEEN RING LITTLE;So;0;L;;;;;N;;;;; 1D8FE;SIGNWRITING HAND-FIST THUMB UNDER TWO FINGERS;So;0;L;;;;;N;;;;; 1D8FF;SIGNWRITING HAND-FIST THUMB OVER TWO FINGERS;So;0;L;;;;;N;;;;; 1D900;SIGNWRITING HAND-FIST THUMB UNDER THREE FINGERS;So;0;L;;;;;N;;;;; 1D901;SIGNWRITING HAND-FIST THUMB UNDER FOUR FINGERS;So;0;L;;;;;N;;;;; 1D902;SIGNWRITING HAND-FIST THUMB OVER FOUR RAISED KNUCKLES;So;0;L;;;;;N;;;;; 1D903;SIGNWRITING HAND-FIST;So;0;L;;;;;N;;;;; 1D904;SIGNWRITING HAND-FIST HEEL;So;0;L;;;;;N;;;;; 1D905;SIGNWRITING TOUCH SINGLE;So;0;L;;;;;N;;;;; 1D906;SIGNWRITING TOUCH MULTIPLE;So;0;L;;;;;N;;;;; 1D907;SIGNWRITING TOUCH BETWEEN;So;0;L;;;;;N;;;;; 1D908;SIGNWRITING GRASP SINGLE;So;0;L;;;;;N;;;;; 1D909;SIGNWRITING GRASP MULTIPLE;So;0;L;;;;;N;;;;; 1D90A;SIGNWRITING GRASP BETWEEN;So;0;L;;;;;N;;;;; 1D90B;SIGNWRITING STRIKE SINGLE;So;0;L;;;;;N;;;;; 1D90C;SIGNWRITING STRIKE MULTIPLE;So;0;L;;;;;N;;;;; 1D90D;SIGNWRITING STRIKE BETWEEN;So;0;L;;;;;N;;;;; 1D90E;SIGNWRITING BRUSH SINGLE;So;0;L;;;;;N;;;;; 1D90F;SIGNWRITING BRUSH MULTIPLE;So;0;L;;;;;N;;;;; 1D910;SIGNWRITING BRUSH BETWEEN;So;0;L;;;;;N;;;;; 1D911;SIGNWRITING RUB SINGLE;So;0;L;;;;;N;;;;; 1D912;SIGNWRITING RUB MULTIPLE;So;0;L;;;;;N;;;;; 1D913;SIGNWRITING RUB BETWEEN;So;0;L;;;;;N;;;;; 1D914;SIGNWRITING SURFACE SYMBOLS;So;0;L;;;;;N;;;;; 1D915;SIGNWRITING SURFACE BETWEEN;So;0;L;;;;;N;;;;; 1D916;SIGNWRITING SQUEEZE LARGE SINGLE;So;0;L;;;;;N;;;;; 1D917;SIGNWRITING SQUEEZE SMALL SINGLE;So;0;L;;;;;N;;;;; 1D918;SIGNWRITING SQUEEZE LARGE MULTIPLE;So;0;L;;;;;N;;;;; 1D919;SIGNWRITING SQUEEZE SMALL MULTIPLE;So;0;L;;;;;N;;;;; 1D91A;SIGNWRITING SQUEEZE SEQUENTIAL;So;0;L;;;;;N;;;;; 1D91B;SIGNWRITING FLICK LARGE SINGLE;So;0;L;;;;;N;;;;; 1D91C;SIGNWRITING FLICK SMALL SINGLE;So;0;L;;;;;N;;;;; 1D91D;SIGNWRITING FLICK LARGE MULTIPLE;So;0;L;;;;;N;;;;; 1D91E;SIGNWRITING FLICK SMALL MULTIPLE;So;0;L;;;;;N;;;;; 1D91F;SIGNWRITING FLICK SEQUENTIAL;So;0;L;;;;;N;;;;; 1D920;SIGNWRITING SQUEEZE FLICK ALTERNATING;So;0;L;;;;;N;;;;; 1D921;SIGNWRITING MOVEMENT-HINGE UP DOWN LARGE;So;0;L;;;;;N;;;;; 1D922;SIGNWRITING MOVEMENT-HINGE UP DOWN SMALL;So;0;L;;;;;N;;;;; 1D923;SIGNWRITING MOVEMENT-HINGE UP SEQUENTIAL;So;0;L;;;;;N;;;;; 1D924;SIGNWRITING MOVEMENT-HINGE DOWN SEQUENTIAL;So;0;L;;;;;N;;;;; 1D925;SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING LARGE;So;0;L;;;;;N;;;;; 1D926;SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING SMALL;So;0;L;;;;;N;;;;; 1D927;SIGNWRITING MOVEMENT-HINGE SIDE TO SIDE SCISSORS;So;0;L;;;;;N;;;;; 1D928;SIGNWRITING MOVEMENT-WALLPLANE FINGER CONTACT;So;0;L;;;;;N;;;;; 1D929;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CONTACT;So;0;L;;;;;N;;;;; 1D92A;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT SMALL;So;0;L;;;;;N;;;;; 1D92B;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT MEDIUM;So;0;L;;;;;N;;;;; 1D92C;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGE;So;0;L;;;;;N;;;;; 1D92D;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGEST;So;0;L;;;;;N;;;;; 1D92E;SIGNWRITING MOVEMENT-WALLPLANE SINGLE WRIST FLEX;So;0;L;;;;;N;;;;; 1D92F;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE STRAIGHT;So;0;L;;;;;N;;;;; 1D930;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE WRIST FLEX;So;0;L;;;;;N;;;;; 1D931;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING;So;0;L;;;;;N;;;;; 1D932;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; 1D933;SIGNWRITING MOVEMENT-WALLPLANE CROSS;So;0;L;;;;;N;;;;; 1D934;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE STRAIGHT MOVEMENT;So;0;L;;;;;N;;;;; 1D935;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE WRIST FLEX;So;0;L;;;;;N;;;;; 1D936;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING;So;0;L;;;;;N;;;;; 1D937;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; 1D938;SIGNWRITING MOVEMENT-WALLPLANE BEND SMALL;So;0;L;;;;;N;;;;; 1D939;SIGNWRITING MOVEMENT-WALLPLANE BEND MEDIUM;So;0;L;;;;;N;;;;; 1D93A;SIGNWRITING MOVEMENT-WALLPLANE BEND LARGE;So;0;L;;;;;N;;;;; 1D93B;SIGNWRITING MOVEMENT-WALLPLANE CORNER SMALL;So;0;L;;;;;N;;;;; 1D93C;SIGNWRITING MOVEMENT-WALLPLANE CORNER MEDIUM;So;0;L;;;;;N;;;;; 1D93D;SIGNWRITING MOVEMENT-WALLPLANE CORNER LARGE;So;0;L;;;;;N;;;;; 1D93E;SIGNWRITING MOVEMENT-WALLPLANE CORNER ROTATION;So;0;L;;;;;N;;;;; 1D93F;SIGNWRITING MOVEMENT-WALLPLANE CHECK SMALL;So;0;L;;;;;N;;;;; 1D940;SIGNWRITING MOVEMENT-WALLPLANE CHECK MEDIUM;So;0;L;;;;;N;;;;; 1D941;SIGNWRITING MOVEMENT-WALLPLANE CHECK LARGE;So;0;L;;;;;N;;;;; 1D942;SIGNWRITING MOVEMENT-WALLPLANE BOX SMALL;So;0;L;;;;;N;;;;; 1D943;SIGNWRITING MOVEMENT-WALLPLANE BOX MEDIUM;So;0;L;;;;;N;;;;; 1D944;SIGNWRITING MOVEMENT-WALLPLANE BOX LARGE;So;0;L;;;;;N;;;;; 1D945;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG SMALL;So;0;L;;;;;N;;;;; 1D946;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG MEDIUM;So;0;L;;;;;N;;;;; 1D947;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG LARGE;So;0;L;;;;;N;;;;; 1D948;SIGNWRITING MOVEMENT-WALLPLANE PEAKS SMALL;So;0;L;;;;;N;;;;; 1D949;SIGNWRITING MOVEMENT-WALLPLANE PEAKS MEDIUM;So;0;L;;;;;N;;;;; 1D94A;SIGNWRITING MOVEMENT-WALLPLANE PEAKS LARGE;So;0;L;;;;;N;;;;; 1D94B;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; 1D94C;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; 1D94D;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE ALTERNATING;So;0;L;;;;;N;;;;; 1D94E;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; 1D94F;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; 1D950;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; 1D951;SIGNWRITING TRAVEL-WALLPLANE SHAKING;So;0;L;;;;;N;;;;; 1D952;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL SINGLE;So;0;L;;;;;N;;;;; 1D953;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL DOUBLE;So;0;L;;;;;N;;;;; 1D954;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL TRIPLE;So;0;L;;;;;N;;;;; 1D955;SIGNWRITING MOVEMENT-DIAGONAL AWAY SMALL;So;0;L;;;;;N;;;;; 1D956;SIGNWRITING MOVEMENT-DIAGONAL AWAY MEDIUM;So;0;L;;;;;N;;;;; 1D957;SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGE;So;0;L;;;;;N;;;;; 1D958;SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGEST;So;0;L;;;;;N;;;;; 1D959;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS SMALL;So;0;L;;;;;N;;;;; 1D95A;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS MEDIUM;So;0;L;;;;;N;;;;; 1D95B;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGE;So;0;L;;;;;N;;;;; 1D95C;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGEST;So;0;L;;;;;N;;;;; 1D95D;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY SMALL;So;0;L;;;;;N;;;;; 1D95E;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY MEDIUM;So;0;L;;;;;N;;;;; 1D95F;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGE;So;0;L;;;;;N;;;;; 1D960;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGEST;So;0;L;;;;;N;;;;; 1D961;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS SMALL;So;0;L;;;;;N;;;;; 1D962;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS MEDIUM;So;0;L;;;;;N;;;;; 1D963;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGE;So;0;L;;;;;N;;;;; 1D964;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGEST;So;0;L;;;;;N;;;;; 1D965;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT SMALL;So;0;L;;;;;N;;;;; 1D966;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT MEDIUM;So;0;L;;;;;N;;;;; 1D967;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGE;So;0;L;;;;;N;;;;; 1D968;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGEST;So;0;L;;;;;N;;;;; 1D969;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE WRIST FLEX;So;0;L;;;;;N;;;;; 1D96A;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE STRAIGHT;So;0;L;;;;;N;;;;; 1D96B;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE WRIST FLEX;So;0;L;;;;;N;;;;; 1D96C;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING;So;0;L;;;;;N;;;;; 1D96D;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; 1D96E;SIGNWRITING MOVEMENT-FLOORPLANE CROSS;So;0;L;;;;;N;;;;; 1D96F;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE STRAIGHT MOVEMENT;So;0;L;;;;;N;;;;; 1D970;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE WRIST FLEX;So;0;L;;;;;N;;;;; 1D971;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING MOVEMENT;So;0;L;;;;;N;;;;; 1D972;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; 1D973;SIGNWRITING MOVEMENT-FLOORPLANE BEND;So;0;L;;;;;N;;;;; 1D974;SIGNWRITING MOVEMENT-FLOORPLANE CORNER SMALL;So;0;L;;;;;N;;;;; 1D975;SIGNWRITING MOVEMENT-FLOORPLANE CORNER MEDIUM;So;0;L;;;;;N;;;;; 1D976;SIGNWRITING MOVEMENT-FLOORPLANE CORNER LARGE;So;0;L;;;;;N;;;;; 1D977;SIGNWRITING MOVEMENT-FLOORPLANE CHECK;So;0;L;;;;;N;;;;; 1D978;SIGNWRITING MOVEMENT-FLOORPLANE BOX SMALL;So;0;L;;;;;N;;;;; 1D979;SIGNWRITING MOVEMENT-FLOORPLANE BOX MEDIUM;So;0;L;;;;;N;;;;; 1D97A;SIGNWRITING MOVEMENT-FLOORPLANE BOX LARGE;So;0;L;;;;;N;;;;; 1D97B;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG SMALL;So;0;L;;;;;N;;;;; 1D97C;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG MEDIUM;So;0;L;;;;;N;;;;; 1D97D;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG LARGE;So;0;L;;;;;N;;;;; 1D97E;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS SMALL;So;0;L;;;;;N;;;;; 1D97F;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS MEDIUM;So;0;L;;;;;N;;;;; 1D980;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS LARGE;So;0;L;;;;;N;;;;; 1D981;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; 1D982;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; 1D983;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; 1D984;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; 1D985;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; 1D986;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE ALTERNATING;So;0;L;;;;;N;;;;; 1D987;SIGNWRITING TRAVEL-FLOORPLANE SHAKING;So;0;L;;;;;N;;;;; 1D988;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER SMALL;So;0;L;;;;;N;;;;; 1D989;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER MEDIUM;So;0;L;;;;;N;;;;; 1D98A;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGE;So;0;L;;;;;N;;;;; 1D98B;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGEST;So;0;L;;;;;N;;;;; 1D98C;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE SMALL;So;0;L;;;;;N;;;;; 1D98D;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE MEDIUM;So;0;L;;;;;N;;;;; 1D98E;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGE;So;0;L;;;;;N;;;;; 1D98F;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGEST;So;0;L;;;;;N;;;;; 1D990;SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE SMALL;So;0;L;;;;;N;;;;; 1D991;SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE MEDIUM;So;0;L;;;;;N;;;;; 1D992;SIGNWRITING MOVEMENT-WALLPLANE HUMP SMALL;So;0;L;;;;;N;;;;; 1D993;SIGNWRITING MOVEMENT-WALLPLANE HUMP MEDIUM;So;0;L;;;;;N;;;;; 1D994;SIGNWRITING MOVEMENT-WALLPLANE HUMP LARGE;So;0;L;;;;;N;;;;; 1D995;SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL;So;0;L;;;;;N;;;;; 1D996;SIGNWRITING MOVEMENT-WALLPLANE LOOP MEDIUM;So;0;L;;;;;N;;;;; 1D997;SIGNWRITING MOVEMENT-WALLPLANE LOOP LARGE;So;0;L;;;;;N;;;;; 1D998;SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL DOUBLE;So;0;L;;;;;N;;;;; 1D999;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE SMALL;So;0;L;;;;;N;;;;; 1D99A;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE MEDIUM;So;0;L;;;;;N;;;;; 1D99B;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE LARGE;So;0;L;;;;;N;;;;; 1D99C;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE SMALL;So;0;L;;;;;N;;;;; 1D99D;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE MEDIUM;So;0;L;;;;;N;;;;; 1D99E;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE LARGE;So;0;L;;;;;N;;;;; 1D99F;SIGNWRITING MOVEMENT-WALLPLANE CURVE THEN STRAIGHT;So;0;L;;;;;N;;;;; 1D9A0;SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS SMALL;So;0;L;;;;;N;;;;; 1D9A1;SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS MEDIUM;So;0;L;;;;;N;;;;; 1D9A2;SIGNWRITING ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; 1D9A3;SIGNWRITING ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; 1D9A4;SIGNWRITING ROTATION-WALLPLANE ALTERNATE;So;0;L;;;;;N;;;;; 1D9A5;SIGNWRITING MOVEMENT-WALLPLANE SHAKING;So;0;L;;;;;N;;;;; 1D9A6;SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING FRONT WALL;So;0;L;;;;;N;;;;; 1D9A7;SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING FRONT WALL;So;0;L;;;;;N;;;;; 1D9A8;SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING FRONT WALL;So;0;L;;;;;N;;;;; 1D9A9;SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING FRONT WALL;So;0;L;;;;;N;;;;; 1D9AA;SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING FRONT WALL;So;0;L;;;;;N;;;;; 1D9AB;SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING FRONT WALL;So;0;L;;;;;N;;;;; 1D9AC;SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING FRONT WALL;So;0;L;;;;;N;;;;; 1D9AD;SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING CHEST;So;0;L;;;;;N;;;;; 1D9AE;SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING CHEST;So;0;L;;;;;N;;;;; 1D9AF;SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING CHEST;So;0;L;;;;;N;;;;; 1D9B0;SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING CHEST;So;0;L;;;;;N;;;;; 1D9B1;SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING CHEST;So;0;L;;;;;N;;;;; 1D9B2;SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING CHEST;So;0;L;;;;;N;;;;; 1D9B3;SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING CHEST;So;0;L;;;;;N;;;;; 1D9B4;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH SMALL;So;0;L;;;;;N;;;;; 1D9B5;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH MEDIUM;So;0;L;;;;;N;;;;; 1D9B6;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH LARGE;So;0;L;;;;;N;;;;; 1D9B7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING SMALL;So;0;L;;;;;N;;;;; 1D9B8;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING LARGE;So;0;L;;;;;N;;;;; 1D9B9;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL DOUBLE;So;0;L;;;;;N;;;;; 1D9BA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE DOUBLE;So;0;L;;;;;N;;;;; 1D9BB;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL TRIPLE;So;0;L;;;;;N;;;;; 1D9BC;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE TRIPLE;So;0;L;;;;;N;;;;; 1D9BD;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL SINGLE;So;0;L;;;;;N;;;;; 1D9BE;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE SINGLE;So;0;L;;;;;N;;;;; 1D9BF;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL DOUBLE;So;0;L;;;;;N;;;;; 1D9C0;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE DOUBLE;So;0;L;;;;;N;;;;; 1D9C1;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING SMALL;So;0;L;;;;;N;;;;; 1D9C2;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING LARGE;So;0;L;;;;;N;;;;; 1D9C3;SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING CEILING;So;0;L;;;;;N;;;;; 1D9C4;SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING CEILING;So;0;L;;;;;N;;;;; 1D9C5;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING CEILING;So;0;L;;;;;N;;;;; 1D9C6;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR SMALL;So;0;L;;;;;N;;;;; 1D9C7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR LARGE;So;0;L;;;;;N;;;;; 1D9C8;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR SMALL DOUBLE;So;0;L;;;;;N;;;;; 1D9C9;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR LARGE DOUBLE;So;0;L;;;;;N;;;;; 1D9CA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE SMALL TRIPLE;So;0;L;;;;;N;;;;; 1D9CB;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE LARGE TRIPLE;So;0;L;;;;;N;;;;; 1D9CC;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL SINGLE;So;0;L;;;;;N;;;;; 1D9CD;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE SINGLE;So;0;L;;;;;N;;;;; 1D9CE;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL DOUBLE;So;0;L;;;;;N;;;;; 1D9CF;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE DOUBLE;So;0;L;;;;;N;;;;; 1D9D0;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR SMALL;So;0;L;;;;;N;;;;; 1D9D1;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR LARGE;So;0;L;;;;;N;;;;; 1D9D2;SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING FLOOR;So;0;L;;;;;N;;;;; 1D9D3;SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING FLOOR;So;0;L;;;;;N;;;;; 1D9D4;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING FLOOR;So;0;L;;;;;N;;;;; 1D9D5;SIGNWRITING MOVEMENT-FLOORPLANE CURVE SMALL;So;0;L;;;;;N;;;;; 1D9D6;SIGNWRITING MOVEMENT-FLOORPLANE CURVE MEDIUM;So;0;L;;;;;N;;;;; 1D9D7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGE;So;0;L;;;;;N;;;;; 1D9D8;SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGEST;So;0;L;;;;;N;;;;; 1D9D9;SIGNWRITING MOVEMENT-FLOORPLANE CURVE COMBINED;So;0;L;;;;;N;;;;; 1D9DA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP SMALL;So;0;L;;;;;N;;;;; 1D9DB;SIGNWRITING MOVEMENT-FLOORPLANE LOOP SMALL;So;0;L;;;;;N;;;;; 1D9DC;SIGNWRITING MOVEMENT-FLOORPLANE WAVE SNAKE;So;0;L;;;;;N;;;;; 1D9DD;SIGNWRITING MOVEMENT-FLOORPLANE WAVE SMALL;So;0;L;;;;;N;;;;; 1D9DE;SIGNWRITING MOVEMENT-FLOORPLANE WAVE LARGE;So;0;L;;;;;N;;;;; 1D9DF;SIGNWRITING ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; 1D9E0;SIGNWRITING ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; 1D9E1;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; 1D9E2;SIGNWRITING MOVEMENT-FLOORPLANE SHAKING PARALLEL;So;0;L;;;;;N;;;;; 1D9E3;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL SINGLE;So;0;L;;;;;N;;;;; 1D9E4;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM SINGLE;So;0;L;;;;;N;;;;; 1D9E5;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL DOUBLE;So;0;L;;;;;N;;;;; 1D9E6;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM DOUBLE;So;0;L;;;;;N;;;;; 1D9E7;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL SINGLE;So;0;L;;;;;N;;;;; 1D9E8;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM SINGLE;So;0;L;;;;;N;;;;; 1D9E9;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE SINGLE;So;0;L;;;;;N;;;;; 1D9EA;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL DOUBLE;So;0;L;;;;;N;;;;; 1D9EB;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM DOUBLE;So;0;L;;;;;N;;;;; 1D9EC;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE DOUBLE;So;0;L;;;;;N;;;;; 1D9ED;SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT SINGLE;So;0;L;;;;;N;;;;; 1D9EE;SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT DOUBLE;So;0;L;;;;;N;;;;; 1D9EF;SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL SINGLE;So;0;L;;;;;N;;;;; 1D9F0;SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL DOUBLE;So;0;L;;;;;N;;;;; 1D9F1;SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES SINGLE;So;0;L;;;;;N;;;;; 1D9F2;SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES DOUBLE;So;0;L;;;;;N;;;;; 1D9F3;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL SINGLE;So;0;L;;;;;N;;;;; 1D9F4;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL DOUBLE;So;0;L;;;;;N;;;;; 1D9F5;SIGNWRITING DYNAMIC ARROWHEAD SMALL;So;0;L;;;;;N;;;;; 1D9F6;SIGNWRITING DYNAMIC ARROWHEAD LARGE;So;0;L;;;;;N;;;;; 1D9F7;SIGNWRITING DYNAMIC FAST;So;0;L;;;;;N;;;;; 1D9F8;SIGNWRITING DYNAMIC SLOW;So;0;L;;;;;N;;;;; 1D9F9;SIGNWRITING DYNAMIC TENSE;So;0;L;;;;;N;;;;; 1D9FA;SIGNWRITING DYNAMIC RELAXED;So;0;L;;;;;N;;;;; 1D9FB;SIGNWRITING DYNAMIC SIMULTANEOUS;So;0;L;;;;;N;;;;; 1D9FC;SIGNWRITING DYNAMIC SIMULTANEOUS ALTERNATING;So;0;L;;;;;N;;;;; 1D9FD;SIGNWRITING DYNAMIC EVERY OTHER TIME;So;0;L;;;;;N;;;;; 1D9FE;SIGNWRITING DYNAMIC GRADUAL;So;0;L;;;;;N;;;;; 1D9FF;SIGNWRITING HEAD;So;0;L;;;;;N;;;;; 1DA00;SIGNWRITING HEAD RIM;Mn;0;NSM;;;;;N;;;;; 1DA01;SIGNWRITING HEAD MOVEMENT-WALLPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; 1DA02;SIGNWRITING HEAD MOVEMENT-WALLPLANE TILT;Mn;0;NSM;;;;;N;;;;; 1DA03;SIGNWRITING HEAD MOVEMENT-FLOORPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; 1DA04;SIGNWRITING HEAD MOVEMENT-WALLPLANE CURVE;Mn;0;NSM;;;;;N;;;;; 1DA05;SIGNWRITING HEAD MOVEMENT-FLOORPLANE CURVE;Mn;0;NSM;;;;;N;;;;; 1DA06;SIGNWRITING HEAD MOVEMENT CIRCLE;Mn;0;NSM;;;;;N;;;;; 1DA07;SIGNWRITING FACE DIRECTION POSITION NOSE FORWARD TILTING;Mn;0;NSM;;;;;N;;;;; 1DA08;SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN;Mn;0;NSM;;;;;N;;;;; 1DA09;SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN TILTING;Mn;0;NSM;;;;;N;;;;; 1DA0A;SIGNWRITING EYEBROWS STRAIGHT UP;Mn;0;NSM;;;;;N;;;;; 1DA0B;SIGNWRITING EYEBROWS STRAIGHT NEUTRAL;Mn;0;NSM;;;;;N;;;;; 1DA0C;SIGNWRITING EYEBROWS STRAIGHT DOWN;Mn;0;NSM;;;;;N;;;;; 1DA0D;SIGNWRITING DREAMY EYEBROWS NEUTRAL DOWN;Mn;0;NSM;;;;;N;;;;; 1DA0E;SIGNWRITING DREAMY EYEBROWS DOWN NEUTRAL;Mn;0;NSM;;;;;N;;;;; 1DA0F;SIGNWRITING DREAMY EYEBROWS UP NEUTRAL;Mn;0;NSM;;;;;N;;;;; 1DA10;SIGNWRITING DREAMY EYEBROWS NEUTRAL UP;Mn;0;NSM;;;;;N;;;;; 1DA11;SIGNWRITING FOREHEAD NEUTRAL;Mn;0;NSM;;;;;N;;;;; 1DA12;SIGNWRITING FOREHEAD CONTACT;Mn;0;NSM;;;;;N;;;;; 1DA13;SIGNWRITING FOREHEAD WRINKLED;Mn;0;NSM;;;;;N;;;;; 1DA14;SIGNWRITING EYES OPEN;Mn;0;NSM;;;;;N;;;;; 1DA15;SIGNWRITING EYES SQUEEZED;Mn;0;NSM;;;;;N;;;;; 1DA16;SIGNWRITING EYES CLOSED;Mn;0;NSM;;;;;N;;;;; 1DA17;SIGNWRITING EYE BLINK SINGLE;Mn;0;NSM;;;;;N;;;;; 1DA18;SIGNWRITING EYE BLINK MULTIPLE;Mn;0;NSM;;;;;N;;;;; 1DA19;SIGNWRITING EYES HALF OPEN;Mn;0;NSM;;;;;N;;;;; 1DA1A;SIGNWRITING EYES WIDE OPEN;Mn;0;NSM;;;;;N;;;;; 1DA1B;SIGNWRITING EYES HALF CLOSED;Mn;0;NSM;;;;;N;;;;; 1DA1C;SIGNWRITING EYES WIDENING MOVEMENT;Mn;0;NSM;;;;;N;;;;; 1DA1D;SIGNWRITING EYE WINK;Mn;0;NSM;;;;;N;;;;; 1DA1E;SIGNWRITING EYELASHES UP;Mn;0;NSM;;;;;N;;;;; 1DA1F;SIGNWRITING EYELASHES DOWN;Mn;0;NSM;;;;;N;;;;; 1DA20;SIGNWRITING EYELASHES FLUTTERING;Mn;0;NSM;;;;;N;;;;; 1DA21;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; 1DA22;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT DOUBLE;Mn;0;NSM;;;;;N;;;;; 1DA23;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT ALTERNATING;Mn;0;NSM;;;;;N;;;;; 1DA24;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; 1DA25;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT DOUBLE;Mn;0;NSM;;;;;N;;;;; 1DA26;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT ALTERNATING;Mn;0;NSM;;;;;N;;;;; 1DA27;SIGNWRITING EYEGAZE-WALLPLANE CURVED;Mn;0;NSM;;;;;N;;;;; 1DA28;SIGNWRITING EYEGAZE-FLOORPLANE CURVED;Mn;0;NSM;;;;;N;;;;; 1DA29;SIGNWRITING EYEGAZE-WALLPLANE CIRCLING;Mn;0;NSM;;;;;N;;;;; 1DA2A;SIGNWRITING CHEEKS PUFFED;Mn;0;NSM;;;;;N;;;;; 1DA2B;SIGNWRITING CHEEKS NEUTRAL;Mn;0;NSM;;;;;N;;;;; 1DA2C;SIGNWRITING CHEEKS SUCKED;Mn;0;NSM;;;;;N;;;;; 1DA2D;SIGNWRITING TENSE CHEEKS HIGH;Mn;0;NSM;;;;;N;;;;; 1DA2E;SIGNWRITING TENSE CHEEKS MIDDLE;Mn;0;NSM;;;;;N;;;;; 1DA2F;SIGNWRITING TENSE CHEEKS LOW;Mn;0;NSM;;;;;N;;;;; 1DA30;SIGNWRITING EARS;Mn;0;NSM;;;;;N;;;;; 1DA31;SIGNWRITING NOSE NEUTRAL;Mn;0;NSM;;;;;N;;;;; 1DA32;SIGNWRITING NOSE CONTACT;Mn;0;NSM;;;;;N;;;;; 1DA33;SIGNWRITING NOSE WRINKLES;Mn;0;NSM;;;;;N;;;;; 1DA34;SIGNWRITING NOSE WIGGLES;Mn;0;NSM;;;;;N;;;;; 1DA35;SIGNWRITING AIR BLOWING OUT;Mn;0;NSM;;;;;N;;;;; 1DA36;SIGNWRITING AIR SUCKING IN;Mn;0;NSM;;;;;N;;;;; 1DA37;SIGNWRITING AIR BLOW SMALL ROTATIONS;So;0;L;;;;;N;;;;; 1DA38;SIGNWRITING AIR SUCK SMALL ROTATIONS;So;0;L;;;;;N;;;;; 1DA39;SIGNWRITING BREATH INHALE;So;0;L;;;;;N;;;;; 1DA3A;SIGNWRITING BREATH EXHALE;So;0;L;;;;;N;;;;; 1DA3B;SIGNWRITING MOUTH CLOSED NEUTRAL;Mn;0;NSM;;;;;N;;;;; 1DA3C;SIGNWRITING MOUTH CLOSED FORWARD;Mn;0;NSM;;;;;N;;;;; 1DA3D;SIGNWRITING MOUTH CLOSED CONTACT;Mn;0;NSM;;;;;N;;;;; 1DA3E;SIGNWRITING MOUTH SMILE;Mn;0;NSM;;;;;N;;;;; 1DA3F;SIGNWRITING MOUTH SMILE WRINKLED;Mn;0;NSM;;;;;N;;;;; 1DA40;SIGNWRITING MOUTH SMILE OPEN;Mn;0;NSM;;;;;N;;;;; 1DA41;SIGNWRITING MOUTH FROWN;Mn;0;NSM;;;;;N;;;;; 1DA42;SIGNWRITING MOUTH FROWN WRINKLED;Mn;0;NSM;;;;;N;;;;; 1DA43;SIGNWRITING MOUTH FROWN OPEN;Mn;0;NSM;;;;;N;;;;; 1DA44;SIGNWRITING MOUTH OPEN CIRCLE;Mn;0;NSM;;;;;N;;;;; 1DA45;SIGNWRITING MOUTH OPEN FORWARD;Mn;0;NSM;;;;;N;;;;; 1DA46;SIGNWRITING MOUTH OPEN WRINKLED;Mn;0;NSM;;;;;N;;;;; 1DA47;SIGNWRITING MOUTH OPEN OVAL;Mn;0;NSM;;;;;N;;;;; 1DA48;SIGNWRITING MOUTH OPEN OVAL WRINKLED;Mn;0;NSM;;;;;N;;;;; 1DA49;SIGNWRITING MOUTH OPEN OVAL YAWN;Mn;0;NSM;;;;;N;;;;; 1DA4A;SIGNWRITING MOUTH OPEN RECTANGLE;Mn;0;NSM;;;;;N;;;;; 1DA4B;SIGNWRITING MOUTH OPEN RECTANGLE WRINKLED;Mn;0;NSM;;;;;N;;;;; 1DA4C;SIGNWRITING MOUTH OPEN RECTANGLE YAWN;Mn;0;NSM;;;;;N;;;;; 1DA4D;SIGNWRITING MOUTH KISS;Mn;0;NSM;;;;;N;;;;; 1DA4E;SIGNWRITING MOUTH KISS FORWARD;Mn;0;NSM;;;;;N;;;;; 1DA4F;SIGNWRITING MOUTH KISS WRINKLED;Mn;0;NSM;;;;;N;;;;; 1DA50;SIGNWRITING MOUTH TENSE;Mn;0;NSM;;;;;N;;;;; 1DA51;SIGNWRITING MOUTH TENSE FORWARD;Mn;0;NSM;;;;;N;;;;; 1DA52;SIGNWRITING MOUTH TENSE SUCKED;Mn;0;NSM;;;;;N;;;;; 1DA53;SIGNWRITING LIPS PRESSED TOGETHER;Mn;0;NSM;;;;;N;;;;; 1DA54;SIGNWRITING LIP LOWER OVER UPPER;Mn;0;NSM;;;;;N;;;;; 1DA55;SIGNWRITING LIP UPPER OVER LOWER;Mn;0;NSM;;;;;N;;;;; 1DA56;SIGNWRITING MOUTH CORNERS;Mn;0;NSM;;;;;N;;;;; 1DA57;SIGNWRITING MOUTH WRINKLES SINGLE;Mn;0;NSM;;;;;N;;;;; 1DA58;SIGNWRITING MOUTH WRINKLES DOUBLE;Mn;0;NSM;;;;;N;;;;; 1DA59;SIGNWRITING TONGUE STICKING OUT FAR;Mn;0;NSM;;;;;N;;;;; 1DA5A;SIGNWRITING TONGUE LICKING LIPS;Mn;0;NSM;;;;;N;;;;; 1DA5B;SIGNWRITING TONGUE TIP BETWEEN LIPS;Mn;0;NSM;;;;;N;;;;; 1DA5C;SIGNWRITING TONGUE TIP TOUCHING INSIDE MOUTH;Mn;0;NSM;;;;;N;;;;; 1DA5D;SIGNWRITING TONGUE INSIDE MOUTH RELAXED;Mn;0;NSM;;;;;N;;;;; 1DA5E;SIGNWRITING TONGUE MOVES AGAINST CHEEK;Mn;0;NSM;;;;;N;;;;; 1DA5F;SIGNWRITING TONGUE CENTRE STICKING OUT;Mn;0;NSM;;;;;N;;;;; 1DA60;SIGNWRITING TONGUE CENTRE INSIDE MOUTH;Mn;0;NSM;;;;;N;;;;; 1DA61;SIGNWRITING TEETH;Mn;0;NSM;;;;;N;;;;; 1DA62;SIGNWRITING TEETH MOVEMENT;Mn;0;NSM;;;;;N;;;;; 1DA63;SIGNWRITING TEETH ON TONGUE;Mn;0;NSM;;;;;N;;;;; 1DA64;SIGNWRITING TEETH ON TONGUE MOVEMENT;Mn;0;NSM;;;;;N;;;;; 1DA65;SIGNWRITING TEETH ON LIPS;Mn;0;NSM;;;;;N;;;;; 1DA66;SIGNWRITING TEETH ON LIPS MOVEMENT;Mn;0;NSM;;;;;N;;;;; 1DA67;SIGNWRITING TEETH BITE LIPS;Mn;0;NSM;;;;;N;;;;; 1DA68;SIGNWRITING MOVEMENT-WALLPLANE JAW;Mn;0;NSM;;;;;N;;;;; 1DA69;SIGNWRITING MOVEMENT-FLOORPLANE JAW;Mn;0;NSM;;;;;N;;;;; 1DA6A;SIGNWRITING NECK;Mn;0;NSM;;;;;N;;;;; 1DA6B;SIGNWRITING HAIR;Mn;0;NSM;;;;;N;;;;; 1DA6C;SIGNWRITING EXCITEMENT;Mn;0;NSM;;;;;N;;;;; 1DA6D;SIGNWRITING SHOULDER HIP SPINE;So;0;L;;;;;N;;;;; 1DA6E;SIGNWRITING SHOULDER HIP POSITIONS;So;0;L;;;;;N;;;;; 1DA6F;SIGNWRITING WALLPLANE SHOULDER HIP MOVE;So;0;L;;;;;N;;;;; 1DA70;SIGNWRITING FLOORPLANE SHOULDER HIP MOVE;So;0;L;;;;;N;;;;; 1DA71;SIGNWRITING SHOULDER TILTING FROM WAIST;So;0;L;;;;;N;;;;; 1DA72;SIGNWRITING TORSO-WALLPLANE STRAIGHT STRETCH;So;0;L;;;;;N;;;;; 1DA73;SIGNWRITING TORSO-WALLPLANE CURVED BEND;So;0;L;;;;;N;;;;; 1DA74;SIGNWRITING TORSO-FLOORPLANE TWISTING;So;0;L;;;;;N;;;;; 1DA75;SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS;Mn;0;NSM;;;;;N;;;;; 1DA76;SIGNWRITING LIMB COMBINATION;So;0;L;;;;;N;;;;; 1DA77;SIGNWRITING LIMB LENGTH-1;So;0;L;;;;;N;;;;; 1DA78;SIGNWRITING LIMB LENGTH-2;So;0;L;;;;;N;;;;; 1DA79;SIGNWRITING LIMB LENGTH-3;So;0;L;;;;;N;;;;; 1DA7A;SIGNWRITING LIMB LENGTH-4;So;0;L;;;;;N;;;;; 1DA7B;SIGNWRITING LIMB LENGTH-5;So;0;L;;;;;N;;;;; 1DA7C;SIGNWRITING LIMB LENGTH-6;So;0;L;;;;;N;;;;; 1DA7D;SIGNWRITING LIMB LENGTH-7;So;0;L;;;;;N;;;;; 1DA7E;SIGNWRITING FINGER;So;0;L;;;;;N;;;;; 1DA7F;SIGNWRITING LOCATION-WALLPLANE SPACE;So;0;L;;;;;N;;;;; 1DA80;SIGNWRITING LOCATION-FLOORPLANE SPACE;So;0;L;;;;;N;;;;; 1DA81;SIGNWRITING LOCATION HEIGHT;So;0;L;;;;;N;;;;; 1DA82;SIGNWRITING LOCATION WIDTH;So;0;L;;;;;N;;;;; 1DA83;SIGNWRITING LOCATION DEPTH;So;0;L;;;;;N;;;;; 1DA84;SIGNWRITING LOCATION HEAD NECK;Mn;0;NSM;;;;;N;;;;; 1DA85;SIGNWRITING LOCATION TORSO;So;0;L;;;;;N;;;;; 1DA86;SIGNWRITING LOCATION LIMBS DIGITS;So;0;L;;;;;N;;;;; 1DA87;SIGNWRITING COMMA;Po;0;L;;;;;N;;;;; 1DA88;SIGNWRITING FULL STOP;Po;0;L;;;;;N;;;;; 1DA89;SIGNWRITING SEMICOLON;Po;0;L;;;;;N;;;;; 1DA8A;SIGNWRITING COLON;Po;0;L;;;;;N;;;;; 1DA8B;SIGNWRITING PARENTHESIS;Po;0;L;;;;;N;;;;; 1DA9B;SIGNWRITING FILL MODIFIER-2;Mn;0;NSM;;;;;N;;;;; 1DA9C;SIGNWRITING FILL MODIFIER-3;Mn;0;NSM;;;;;N;;;;; 1DA9D;SIGNWRITING FILL MODIFIER-4;Mn;0;NSM;;;;;N;;;;; 1DA9E;SIGNWRITING FILL MODIFIER-5;Mn;0;NSM;;;;;N;;;;; 1DA9F;SIGNWRITING FILL MODIFIER-6;Mn;0;NSM;;;;;N;;;;; 1DAA1;SIGNWRITING ROTATION MODIFIER-2;Mn;0;NSM;;;;;N;;;;; 1DAA2;SIGNWRITING ROTATION MODIFIER-3;Mn;0;NSM;;;;;N;;;;; 1DAA3;SIGNWRITING ROTATION MODIFIER-4;Mn;0;NSM;;;;;N;;;;; 1DAA4;SIGNWRITING ROTATION MODIFIER-5;Mn;0;NSM;;;;;N;;;;; 1DAA5;SIGNWRITING ROTATION MODIFIER-6;Mn;0;NSM;;;;;N;;;;; 1DAA6;SIGNWRITING ROTATION MODIFIER-7;Mn;0;NSM;;;;;N;;;;; 1DAA7;SIGNWRITING ROTATION MODIFIER-8;Mn;0;NSM;;;;;N;;;;; 1DAA8;SIGNWRITING ROTATION MODIFIER-9;Mn;0;NSM;;;;;N;;;;; 1DAA9;SIGNWRITING ROTATION MODIFIER-10;Mn;0;NSM;;;;;N;;;;; 1DAAA;SIGNWRITING ROTATION MODIFIER-11;Mn;0;NSM;;;;;N;;;;; 1DAAB;SIGNWRITING ROTATION MODIFIER-12;Mn;0;NSM;;;;;N;;;;; 1DAAC;SIGNWRITING ROTATION MODIFIER-13;Mn;0;NSM;;;;;N;;;;; 1DAAD;SIGNWRITING ROTATION MODIFIER-14;Mn;0;NSM;;;;;N;;;;; 1DAAE;SIGNWRITING ROTATION MODIFIER-15;Mn;0;NSM;;;;;N;;;;; 1DAAF;SIGNWRITING ROTATION MODIFIER-16;Mn;0;NSM;;;;;N;;;;; 1E000;COMBINING GLAGOLITIC LETTER AZU;Mn;230;NSM;;;;;N;;;;; 1E001;COMBINING GLAGOLITIC LETTER BUKY;Mn;230;NSM;;;;;N;;;;; 1E002;COMBINING GLAGOLITIC LETTER VEDE;Mn;230;NSM;;;;;N;;;;; 1E003;COMBINING GLAGOLITIC LETTER GLAGOLI;Mn;230;NSM;;;;;N;;;;; 1E004;COMBINING GLAGOLITIC LETTER DOBRO;Mn;230;NSM;;;;;N;;;;; 1E005;COMBINING GLAGOLITIC LETTER YESTU;Mn;230;NSM;;;;;N;;;;; 1E006;COMBINING GLAGOLITIC LETTER ZHIVETE;Mn;230;NSM;;;;;N;;;;; 1E008;COMBINING GLAGOLITIC LETTER ZEMLJA;Mn;230;NSM;;;;;N;;;;; 1E009;COMBINING GLAGOLITIC LETTER IZHE;Mn;230;NSM;;;;;N;;;;; 1E00A;COMBINING GLAGOLITIC LETTER INITIAL IZHE;Mn;230;NSM;;;;;N;;;;; 1E00B;COMBINING GLAGOLITIC LETTER I;Mn;230;NSM;;;;;N;;;;; 1E00C;COMBINING GLAGOLITIC LETTER DJERVI;Mn;230;NSM;;;;;N;;;;; 1E00D;COMBINING GLAGOLITIC LETTER KAKO;Mn;230;NSM;;;;;N;;;;; 1E00E;COMBINING GLAGOLITIC LETTER LJUDIJE;Mn;230;NSM;;;;;N;;;;; 1E00F;COMBINING GLAGOLITIC LETTER MYSLITE;Mn;230;NSM;;;;;N;;;;; 1E010;COMBINING GLAGOLITIC LETTER NASHI;Mn;230;NSM;;;;;N;;;;; 1E011;COMBINING GLAGOLITIC LETTER ONU;Mn;230;NSM;;;;;N;;;;; 1E012;COMBINING GLAGOLITIC LETTER POKOJI;Mn;230;NSM;;;;;N;;;;; 1E013;COMBINING GLAGOLITIC LETTER RITSI;Mn;230;NSM;;;;;N;;;;; 1E014;COMBINING GLAGOLITIC LETTER SLOVO;Mn;230;NSM;;;;;N;;;;; 1E015;COMBINING GLAGOLITIC LETTER TVRIDO;Mn;230;NSM;;;;;N;;;;; 1E016;COMBINING GLAGOLITIC LETTER UKU;Mn;230;NSM;;;;;N;;;;; 1E017;COMBINING GLAGOLITIC LETTER FRITU;Mn;230;NSM;;;;;N;;;;; 1E018;COMBINING GLAGOLITIC LETTER HERU;Mn;230;NSM;;;;;N;;;;; 1E01B;COMBINING GLAGOLITIC LETTER SHTA;Mn;230;NSM;;;;;N;;;;; 1E01C;COMBINING GLAGOLITIC LETTER TSI;Mn;230;NSM;;;;;N;;;;; 1E01D;COMBINING GLAGOLITIC LETTER CHRIVI;Mn;230;NSM;;;;;N;;;;; 1E01E;COMBINING GLAGOLITIC LETTER SHA;Mn;230;NSM;;;;;N;;;;; 1E01F;COMBINING GLAGOLITIC LETTER YERU;Mn;230;NSM;;;;;N;;;;; 1E020;COMBINING GLAGOLITIC LETTER YERI;Mn;230;NSM;;;;;N;;;;; 1E021;COMBINING GLAGOLITIC LETTER YATI;Mn;230;NSM;;;;;N;;;;; 1E023;COMBINING GLAGOLITIC LETTER YU;Mn;230;NSM;;;;;N;;;;; 1E024;COMBINING GLAGOLITIC LETTER SMALL YUS;Mn;230;NSM;;;;;N;;;;; 1E026;COMBINING GLAGOLITIC LETTER YO;Mn;230;NSM;;;;;N;;;;; 1E027;COMBINING GLAGOLITIC LETTER IOTATED SMALL YUS;Mn;230;NSM;;;;;N;;;;; 1E028;COMBINING GLAGOLITIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;; 1E029;COMBINING GLAGOLITIC LETTER IOTATED BIG YUS;Mn;230;NSM;;;;;N;;;;; 1E02A;COMBINING GLAGOLITIC LETTER FITA;Mn;230;NSM;;;;;N;;;;; 1E800;MENDE KIKAKUI SYLLABLE M001 KI;Lo;0;R;;;;;N;;;;; 1E801;MENDE KIKAKUI SYLLABLE M002 KA;Lo;0;R;;;;;N;;;;; 1E802;MENDE KIKAKUI SYLLABLE M003 KU;Lo;0;R;;;;;N;;;;; 1E803;MENDE KIKAKUI SYLLABLE M065 KEE;Lo;0;R;;;;;N;;;;; 1E804;MENDE KIKAKUI SYLLABLE M095 KE;Lo;0;R;;;;;N;;;;; 1E805;MENDE KIKAKUI SYLLABLE M076 KOO;Lo;0;R;;;;;N;;;;; 1E806;MENDE KIKAKUI SYLLABLE M048 KO;Lo;0;R;;;;;N;;;;; 1E807;MENDE KIKAKUI SYLLABLE M179 KUA;Lo;0;R;;;;;N;;;;; 1E808;MENDE KIKAKUI SYLLABLE M004 WI;Lo;0;R;;;;;N;;;;; 1E809;MENDE KIKAKUI SYLLABLE M005 WA;Lo;0;R;;;;;N;;;;; 1E80A;MENDE KIKAKUI SYLLABLE M006 WU;Lo;0;R;;;;;N;;;;; 1E80B;MENDE KIKAKUI SYLLABLE M126 WEE;Lo;0;R;;;;;N;;;;; 1E80C;MENDE KIKAKUI SYLLABLE M118 WE;Lo;0;R;;;;;N;;;;; 1E80D;MENDE KIKAKUI SYLLABLE M114 WOO;Lo;0;R;;;;;N;;;;; 1E80E;MENDE KIKAKUI SYLLABLE M045 WO;Lo;0;R;;;;;N;;;;; 1E80F;MENDE KIKAKUI SYLLABLE M194 WUI;Lo;0;R;;;;;N;;;;; 1E810;MENDE KIKAKUI SYLLABLE M143 WEI;Lo;0;R;;;;;N;;;;; 1E811;MENDE KIKAKUI SYLLABLE M061 WVI;Lo;0;R;;;;;N;;;;; 1E812;MENDE KIKAKUI SYLLABLE M049 WVA;Lo;0;R;;;;;N;;;;; 1E813;MENDE KIKAKUI SYLLABLE M139 WVE;Lo;0;R;;;;;N;;;;; 1E814;MENDE KIKAKUI SYLLABLE M007 MIN;Lo;0;R;;;;;N;;;;; 1E815;MENDE KIKAKUI SYLLABLE M008 MAN;Lo;0;R;;;;;N;;;;; 1E816;MENDE KIKAKUI SYLLABLE M009 MUN;Lo;0;R;;;;;N;;;;; 1E817;MENDE KIKAKUI SYLLABLE M059 MEN;Lo;0;R;;;;;N;;;;; 1E818;MENDE KIKAKUI SYLLABLE M094 MON;Lo;0;R;;;;;N;;;;; 1E819;MENDE KIKAKUI SYLLABLE M154 MUAN;Lo;0;R;;;;;N;;;;; 1E81A;MENDE KIKAKUI SYLLABLE M189 MUEN;Lo;0;R;;;;;N;;;;; 1E81B;MENDE KIKAKUI SYLLABLE M010 BI;Lo;0;R;;;;;N;;;;; 1E81C;MENDE KIKAKUI SYLLABLE M011 BA;Lo;0;R;;;;;N;;;;; 1E81D;MENDE KIKAKUI SYLLABLE M012 BU;Lo;0;R;;;;;N;;;;; 1E81E;MENDE KIKAKUI SYLLABLE M150 BEE;Lo;0;R;;;;;N;;;;; 1E81F;MENDE KIKAKUI SYLLABLE M097 BE;Lo;0;R;;;;;N;;;;; 1E820;MENDE KIKAKUI SYLLABLE M103 BOO;Lo;0;R;;;;;N;;;;; 1E821;MENDE KIKAKUI SYLLABLE M138 BO;Lo;0;R;;;;;N;;;;; 1E822;MENDE KIKAKUI SYLLABLE M013 I;Lo;0;R;;;;;N;;;;; 1E823;MENDE KIKAKUI SYLLABLE M014 A;Lo;0;R;;;;;N;;;;; 1E824;MENDE KIKAKUI SYLLABLE M015 U;Lo;0;R;;;;;N;;;;; 1E825;MENDE KIKAKUI SYLLABLE M163 EE;Lo;0;R;;;;;N;;;;; 1E826;MENDE KIKAKUI SYLLABLE M100 E;Lo;0;R;;;;;N;;;;; 1E827;MENDE KIKAKUI SYLLABLE M165 OO;Lo;0;R;;;;;N;;;;; 1E828;MENDE KIKAKUI SYLLABLE M147 O;Lo;0;R;;;;;N;;;;; 1E829;MENDE KIKAKUI SYLLABLE M137 EI;Lo;0;R;;;;;N;;;;; 1E82A;MENDE KIKAKUI SYLLABLE M131 IN;Lo;0;R;;;;;N;;;;; 1E82B;MENDE KIKAKUI SYLLABLE M135 IN;Lo;0;R;;;;;N;;;;; 1E82C;MENDE KIKAKUI SYLLABLE M195 AN;Lo;0;R;;;;;N;;;;; 1E82D;MENDE KIKAKUI SYLLABLE M178 EN;Lo;0;R;;;;;N;;;;; 1E82E;MENDE KIKAKUI SYLLABLE M019 SI;Lo;0;R;;;;;N;;;;; 1E82F;MENDE KIKAKUI SYLLABLE M020 SA;Lo;0;R;;;;;N;;;;; 1E830;MENDE KIKAKUI SYLLABLE M021 SU;Lo;0;R;;;;;N;;;;; 1E831;MENDE KIKAKUI SYLLABLE M162 SEE;Lo;0;R;;;;;N;;;;; 1E832;MENDE KIKAKUI SYLLABLE M116 SE;Lo;0;R;;;;;N;;;;; 1E833;MENDE KIKAKUI SYLLABLE M136 SOO;Lo;0;R;;;;;N;;;;; 1E834;MENDE KIKAKUI SYLLABLE M079 SO;Lo;0;R;;;;;N;;;;; 1E835;MENDE KIKAKUI SYLLABLE M196 SIA;Lo;0;R;;;;;N;;;;; 1E836;MENDE KIKAKUI SYLLABLE M025 LI;Lo;0;R;;;;;N;;;;; 1E837;MENDE KIKAKUI SYLLABLE M026 LA;Lo;0;R;;;;;N;;;;; 1E838;MENDE KIKAKUI SYLLABLE M027 LU;Lo;0;R;;;;;N;;;;; 1E839;MENDE KIKAKUI SYLLABLE M084 LEE;Lo;0;R;;;;;N;;;;; 1E83A;MENDE KIKAKUI SYLLABLE M073 LE;Lo;0;R;;;;;N;;;;; 1E83B;MENDE KIKAKUI SYLLABLE M054 LOO;Lo;0;R;;;;;N;;;;; 1E83C;MENDE KIKAKUI SYLLABLE M153 LO;Lo;0;R;;;;;N;;;;; 1E83D;MENDE KIKAKUI SYLLABLE M110 LONG LE;Lo;0;R;;;;;N;;;;; 1E83E;MENDE KIKAKUI SYLLABLE M016 DI;Lo;0;R;;;;;N;;;;; 1E83F;MENDE KIKAKUI SYLLABLE M017 DA;Lo;0;R;;;;;N;;;;; 1E840;MENDE KIKAKUI SYLLABLE M018 DU;Lo;0;R;;;;;N;;;;; 1E841;MENDE KIKAKUI SYLLABLE M089 DEE;Lo;0;R;;;;;N;;;;; 1E842;MENDE KIKAKUI SYLLABLE M180 DOO;Lo;0;R;;;;;N;;;;; 1E843;MENDE KIKAKUI SYLLABLE M181 DO;Lo;0;R;;;;;N;;;;; 1E844;MENDE KIKAKUI SYLLABLE M022 TI;Lo;0;R;;;;;N;;;;; 1E845;MENDE KIKAKUI SYLLABLE M023 TA;Lo;0;R;;;;;N;;;;; 1E846;MENDE KIKAKUI SYLLABLE M024 TU;Lo;0;R;;;;;N;;;;; 1E847;MENDE KIKAKUI SYLLABLE M091 TEE;Lo;0;R;;;;;N;;;;; 1E848;MENDE KIKAKUI SYLLABLE M055 TE;Lo;0;R;;;;;N;;;;; 1E849;MENDE KIKAKUI SYLLABLE M104 TOO;Lo;0;R;;;;;N;;;;; 1E84A;MENDE KIKAKUI SYLLABLE M069 TO;Lo;0;R;;;;;N;;;;; 1E84B;MENDE KIKAKUI SYLLABLE M028 JI;Lo;0;R;;;;;N;;;;; 1E84C;MENDE KIKAKUI SYLLABLE M029 JA;Lo;0;R;;;;;N;;;;; 1E84D;MENDE KIKAKUI SYLLABLE M030 JU;Lo;0;R;;;;;N;;;;; 1E84E;MENDE KIKAKUI SYLLABLE M157 JEE;Lo;0;R;;;;;N;;;;; 1E84F;MENDE KIKAKUI SYLLABLE M113 JE;Lo;0;R;;;;;N;;;;; 1E850;MENDE KIKAKUI SYLLABLE M160 JOO;Lo;0;R;;;;;N;;;;; 1E851;MENDE KIKAKUI SYLLABLE M063 JO;Lo;0;R;;;;;N;;;;; 1E852;MENDE KIKAKUI SYLLABLE M175 LONG JO;Lo;0;R;;;;;N;;;;; 1E853;MENDE KIKAKUI SYLLABLE M031 YI;Lo;0;R;;;;;N;;;;; 1E854;MENDE KIKAKUI SYLLABLE M032 YA;Lo;0;R;;;;;N;;;;; 1E855;MENDE KIKAKUI SYLLABLE M033 YU;Lo;0;R;;;;;N;;;;; 1E856;MENDE KIKAKUI SYLLABLE M109 YEE;Lo;0;R;;;;;N;;;;; 1E857;MENDE KIKAKUI SYLLABLE M080 YE;Lo;0;R;;;;;N;;;;; 1E858;MENDE KIKAKUI SYLLABLE M141 YOO;Lo;0;R;;;;;N;;;;; 1E859;MENDE KIKAKUI SYLLABLE M121 YO;Lo;0;R;;;;;N;;;;; 1E85A;MENDE KIKAKUI SYLLABLE M034 FI;Lo;0;R;;;;;N;;;;; 1E85B;MENDE KIKAKUI SYLLABLE M035 FA;Lo;0;R;;;;;N;;;;; 1E85C;MENDE KIKAKUI SYLLABLE M036 FU;Lo;0;R;;;;;N;;;;; 1E85D;MENDE KIKAKUI SYLLABLE M078 FEE;Lo;0;R;;;;;N;;;;; 1E85E;MENDE KIKAKUI SYLLABLE M075 FE;Lo;0;R;;;;;N;;;;; 1E85F;MENDE KIKAKUI SYLLABLE M133 FOO;Lo;0;R;;;;;N;;;;; 1E860;MENDE KIKAKUI SYLLABLE M088 FO;Lo;0;R;;;;;N;;;;; 1E861;MENDE KIKAKUI SYLLABLE M197 FUA;Lo;0;R;;;;;N;;;;; 1E862;MENDE KIKAKUI SYLLABLE M101 FAN;Lo;0;R;;;;;N;;;;; 1E863;MENDE KIKAKUI SYLLABLE M037 NIN;Lo;0;R;;;;;N;;;;; 1E864;MENDE KIKAKUI SYLLABLE M038 NAN;Lo;0;R;;;;;N;;;;; 1E865;MENDE KIKAKUI SYLLABLE M039 NUN;Lo;0;R;;;;;N;;;;; 1E866;MENDE KIKAKUI SYLLABLE M117 NEN;Lo;0;R;;;;;N;;;;; 1E867;MENDE KIKAKUI SYLLABLE M169 NON;Lo;0;R;;;;;N;;;;; 1E868;MENDE KIKAKUI SYLLABLE M176 HI;Lo;0;R;;;;;N;;;;; 1E869;MENDE KIKAKUI SYLLABLE M041 HA;Lo;0;R;;;;;N;;;;; 1E86A;MENDE KIKAKUI SYLLABLE M186 HU;Lo;0;R;;;;;N;;;;; 1E86B;MENDE KIKAKUI SYLLABLE M040 HEE;Lo;0;R;;;;;N;;;;; 1E86C;MENDE KIKAKUI SYLLABLE M096 HE;Lo;0;R;;;;;N;;;;; 1E86D;MENDE KIKAKUI SYLLABLE M042 HOO;Lo;0;R;;;;;N;;;;; 1E86E;MENDE KIKAKUI SYLLABLE M140 HO;Lo;0;R;;;;;N;;;;; 1E86F;MENDE KIKAKUI SYLLABLE M083 HEEI;Lo;0;R;;;;;N;;;;; 1E870;MENDE KIKAKUI SYLLABLE M128 HOOU;Lo;0;R;;;;;N;;;;; 1E871;MENDE KIKAKUI SYLLABLE M053 HIN;Lo;0;R;;;;;N;;;;; 1E872;MENDE KIKAKUI SYLLABLE M130 HAN;Lo;0;R;;;;;N;;;;; 1E873;MENDE KIKAKUI SYLLABLE M087 HUN;Lo;0;R;;;;;N;;;;; 1E874;MENDE KIKAKUI SYLLABLE M052 HEN;Lo;0;R;;;;;N;;;;; 1E875;MENDE KIKAKUI SYLLABLE M193 HON;Lo;0;R;;;;;N;;;;; 1E876;MENDE KIKAKUI SYLLABLE M046 HUAN;Lo;0;R;;;;;N;;;;; 1E877;MENDE KIKAKUI SYLLABLE M090 NGGI;Lo;0;R;;;;;N;;;;; 1E878;MENDE KIKAKUI SYLLABLE M043 NGGA;Lo;0;R;;;;;N;;;;; 1E879;MENDE KIKAKUI SYLLABLE M082 NGGU;Lo;0;R;;;;;N;;;;; 1E87A;MENDE KIKAKUI SYLLABLE M115 NGGEE;Lo;0;R;;;;;N;;;;; 1E87B;MENDE KIKAKUI SYLLABLE M146 NGGE;Lo;0;R;;;;;N;;;;; 1E87C;MENDE KIKAKUI SYLLABLE M156 NGGOO;Lo;0;R;;;;;N;;;;; 1E87D;MENDE KIKAKUI SYLLABLE M120 NGGO;Lo;0;R;;;;;N;;;;; 1E87E;MENDE KIKAKUI SYLLABLE M159 NGGAA;Lo;0;R;;;;;N;;;;; 1E87F;MENDE KIKAKUI SYLLABLE M127 NGGUA;Lo;0;R;;;;;N;;;;; 1E880;MENDE KIKAKUI SYLLABLE M086 LONG NGGE;Lo;0;R;;;;;N;;;;; 1E881;MENDE KIKAKUI SYLLABLE M106 LONG NGGOO;Lo;0;R;;;;;N;;;;; 1E882;MENDE KIKAKUI SYLLABLE M183 LONG NGGO;Lo;0;R;;;;;N;;;;; 1E883;MENDE KIKAKUI SYLLABLE M155 GI;Lo;0;R;;;;;N;;;;; 1E884;MENDE KIKAKUI SYLLABLE M111 GA;Lo;0;R;;;;;N;;;;; 1E885;MENDE KIKAKUI SYLLABLE M168 GU;Lo;0;R;;;;;N;;;;; 1E886;MENDE KIKAKUI SYLLABLE M190 GEE;Lo;0;R;;;;;N;;;;; 1E887;MENDE KIKAKUI SYLLABLE M166 GUEI;Lo;0;R;;;;;N;;;;; 1E888;MENDE KIKAKUI SYLLABLE M167 GUAN;Lo;0;R;;;;;N;;;;; 1E889;MENDE KIKAKUI SYLLABLE M184 NGEN;Lo;0;R;;;;;N;;;;; 1E88A;MENDE KIKAKUI SYLLABLE M057 NGON;Lo;0;R;;;;;N;;;;; 1E88B;MENDE KIKAKUI SYLLABLE M177 NGUAN;Lo;0;R;;;;;N;;;;; 1E88C;MENDE KIKAKUI SYLLABLE M068 PI;Lo;0;R;;;;;N;;;;; 1E88D;MENDE KIKAKUI SYLLABLE M099 PA;Lo;0;R;;;;;N;;;;; 1E88E;MENDE KIKAKUI SYLLABLE M050 PU;Lo;0;R;;;;;N;;;;; 1E88F;MENDE KIKAKUI SYLLABLE M081 PEE;Lo;0;R;;;;;N;;;;; 1E890;MENDE KIKAKUI SYLLABLE M051 PE;Lo;0;R;;;;;N;;;;; 1E891;MENDE KIKAKUI SYLLABLE M102 POO;Lo;0;R;;;;;N;;;;; 1E892;MENDE KIKAKUI SYLLABLE M066 PO;Lo;0;R;;;;;N;;;;; 1E893;MENDE KIKAKUI SYLLABLE M145 MBI;Lo;0;R;;;;;N;;;;; 1E894;MENDE KIKAKUI SYLLABLE M062 MBA;Lo;0;R;;;;;N;;;;; 1E895;MENDE KIKAKUI SYLLABLE M122 MBU;Lo;0;R;;;;;N;;;;; 1E896;MENDE KIKAKUI SYLLABLE M047 MBEE;Lo;0;R;;;;;N;;;;; 1E897;MENDE KIKAKUI SYLLABLE M188 MBEE;Lo;0;R;;;;;N;;;;; 1E898;MENDE KIKAKUI SYLLABLE M072 MBE;Lo;0;R;;;;;N;;;;; 1E899;MENDE KIKAKUI SYLLABLE M172 MBOO;Lo;0;R;;;;;N;;;;; 1E89A;MENDE KIKAKUI SYLLABLE M174 MBO;Lo;0;R;;;;;N;;;;; 1E89B;MENDE KIKAKUI SYLLABLE M187 MBUU;Lo;0;R;;;;;N;;;;; 1E89C;MENDE KIKAKUI SYLLABLE M161 LONG MBE;Lo;0;R;;;;;N;;;;; 1E89D;MENDE KIKAKUI SYLLABLE M105 LONG MBOO;Lo;0;R;;;;;N;;;;; 1E89E;MENDE KIKAKUI SYLLABLE M142 LONG MBO;Lo;0;R;;;;;N;;;;; 1E89F;MENDE KIKAKUI SYLLABLE M132 KPI;Lo;0;R;;;;;N;;;;; 1E8A0;MENDE KIKAKUI SYLLABLE M092 KPA;Lo;0;R;;;;;N;;;;; 1E8A1;MENDE KIKAKUI SYLLABLE M074 KPU;Lo;0;R;;;;;N;;;;; 1E8A2;MENDE KIKAKUI SYLLABLE M044 KPEE;Lo;0;R;;;;;N;;;;; 1E8A3;MENDE KIKAKUI SYLLABLE M108 KPE;Lo;0;R;;;;;N;;;;; 1E8A4;MENDE KIKAKUI SYLLABLE M112 KPOO;Lo;0;R;;;;;N;;;;; 1E8A5;MENDE KIKAKUI SYLLABLE M158 KPO;Lo;0;R;;;;;N;;;;; 1E8A6;MENDE KIKAKUI SYLLABLE M124 GBI;Lo;0;R;;;;;N;;;;; 1E8A7;MENDE KIKAKUI SYLLABLE M056 GBA;Lo;0;R;;;;;N;;;;; 1E8A8;MENDE KIKAKUI SYLLABLE M148 GBU;Lo;0;R;;;;;N;;;;; 1E8A9;MENDE KIKAKUI SYLLABLE M093 GBEE;Lo;0;R;;;;;N;;;;; 1E8AA;MENDE KIKAKUI SYLLABLE M107 GBE;Lo;0;R;;;;;N;;;;; 1E8AB;MENDE KIKAKUI SYLLABLE M071 GBOO;Lo;0;R;;;;;N;;;;; 1E8AC;MENDE KIKAKUI SYLLABLE M070 GBO;Lo;0;R;;;;;N;;;;; 1E8AD;MENDE KIKAKUI SYLLABLE M171 RA;Lo;0;R;;;;;N;;;;; 1E8AE;MENDE KIKAKUI SYLLABLE M123 NDI;Lo;0;R;;;;;N;;;;; 1E8AF;MENDE KIKAKUI SYLLABLE M129 NDA;Lo;0;R;;;;;N;;;;; 1E8B0;MENDE KIKAKUI SYLLABLE M125 NDU;Lo;0;R;;;;;N;;;;; 1E8B1;MENDE KIKAKUI SYLLABLE M191 NDEE;Lo;0;R;;;;;N;;;;; 1E8B2;MENDE KIKAKUI SYLLABLE M119 NDE;Lo;0;R;;;;;N;;;;; 1E8B3;MENDE KIKAKUI SYLLABLE M067 NDOO;Lo;0;R;;;;;N;;;;; 1E8B4;MENDE KIKAKUI SYLLABLE M064 NDO;Lo;0;R;;;;;N;;;;; 1E8B5;MENDE KIKAKUI SYLLABLE M152 NJA;Lo;0;R;;;;;N;;;;; 1E8B6;MENDE KIKAKUI SYLLABLE M192 NJU;Lo;0;R;;;;;N;;;;; 1E8B7;MENDE KIKAKUI SYLLABLE M149 NJEE;Lo;0;R;;;;;N;;;;; 1E8B8;MENDE KIKAKUI SYLLABLE M134 NJOO;Lo;0;R;;;;;N;;;;; 1E8B9;MENDE KIKAKUI SYLLABLE M182 VI;Lo;0;R;;;;;N;;;;; 1E8BA;MENDE KIKAKUI SYLLABLE M185 VA;Lo;0;R;;;;;N;;;;; 1E8BB;MENDE KIKAKUI SYLLABLE M151 VU;Lo;0;R;;;;;N;;;;; 1E8BC;MENDE KIKAKUI SYLLABLE M173 VEE;Lo;0;R;;;;;N;;;;; 1E8BD;MENDE KIKAKUI SYLLABLE M085 VE;Lo;0;R;;;;;N;;;;; 1E8BE;MENDE KIKAKUI SYLLABLE M144 VOO;Lo;0;R;;;;;N;;;;; 1E8BF;MENDE KIKAKUI SYLLABLE M077 VO;Lo;0;R;;;;;N;;;;; 1E8C0;MENDE KIKAKUI SYLLABLE M164 NYIN;Lo;0;R;;;;;N;;;;; 1E8C1;MENDE KIKAKUI SYLLABLE M058 NYAN;Lo;0;R;;;;;N;;;;; 1E8C2;MENDE KIKAKUI SYLLABLE M170 NYUN;Lo;0;R;;;;;N;;;;; 1E8C3;MENDE KIKAKUI SYLLABLE M098 NYEN;Lo;0;R;;;;;N;;;;; 1E8C4;MENDE KIKAKUI SYLLABLE M060 NYON;Lo;0;R;;;;;N;;;;; 1E8C7;MENDE KIKAKUI DIGIT ONE;No;0;R;;;;1;N;;;;; 1E8C8;MENDE KIKAKUI DIGIT TWO;No;0;R;;;;2;N;;;;; 1E8C9;MENDE KIKAKUI DIGIT THREE;No;0;R;;;;3;N;;;;; 1E8CA;MENDE KIKAKUI DIGIT FOUR;No;0;R;;;;4;N;;;;; 1E8CB;MENDE KIKAKUI DIGIT FIVE;No;0;R;;;;5;N;;;;; 1E8CC;MENDE KIKAKUI DIGIT SIX;No;0;R;;;;6;N;;;;; 1E8CD;MENDE KIKAKUI DIGIT SEVEN;No;0;R;;;;7;N;;;;; 1E8CE;MENDE KIKAKUI DIGIT EIGHT;No;0;R;;;;8;N;;;;; 1E8CF;MENDE KIKAKUI DIGIT NINE;No;0;R;;;;9;N;;;;; 1E8D0;MENDE KIKAKUI COMBINING NUMBER TEENS;Mn;220;NSM;;;;;N;;;;; 1E8D1;MENDE KIKAKUI COMBINING NUMBER TENS;Mn;220;NSM;;;;;N;;;;; 1E8D2;MENDE KIKAKUI COMBINING NUMBER HUNDREDS;Mn;220;NSM;;;;;N;;;;; 1E8D3;MENDE KIKAKUI COMBINING NUMBER THOUSANDS;Mn;220;NSM;;;;;N;;;;; 1E8D4;MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS;Mn;220;NSM;;;;;N;;;;; 1E8D5;MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS;Mn;220;NSM;;;;;N;;;;; 1E8D6;MENDE KIKAKUI COMBINING NUMBER MILLIONS;Mn;220;NSM;;;;;N;;;;; 1E900;ADLAM CAPITAL LETTER ALIF;Lu;0;R;;;;;N;;;;1E922; 1E901;ADLAM CAPITAL LETTER DAALI;Lu;0;R;;;;;N;;;;1E923; 1E902;ADLAM CAPITAL LETTER LAAM;Lu;0;R;;;;;N;;;;1E924; 1E903;ADLAM CAPITAL LETTER MIIM;Lu;0;R;;;;;N;;;;1E925; 1E904;ADLAM CAPITAL LETTER BA;Lu;0;R;;;;;N;;;;1E926; 1E905;ADLAM CAPITAL LETTER SINNYIIYHE;Lu;0;R;;;;;N;;;;1E927; 1E906;ADLAM CAPITAL LETTER PE;Lu;0;R;;;;;N;;;;1E928; 1E907;ADLAM CAPITAL LETTER BHE;Lu;0;R;;;;;N;;;;1E929; 1E908;ADLAM CAPITAL LETTER RA;Lu;0;R;;;;;N;;;;1E92A; 1E909;ADLAM CAPITAL LETTER E;Lu;0;R;;;;;N;;;;1E92B; 1E90A;ADLAM CAPITAL LETTER FA;Lu;0;R;;;;;N;;;;1E92C; 1E90B;ADLAM CAPITAL LETTER I;Lu;0;R;;;;;N;;;;1E92D; 1E90C;ADLAM CAPITAL LETTER O;Lu;0;R;;;;;N;;;;1E92E; 1E90D;ADLAM CAPITAL LETTER DHA;Lu;0;R;;;;;N;;;;1E92F; 1E90E;ADLAM CAPITAL LETTER YHE;Lu;0;R;;;;;N;;;;1E930; 1E90F;ADLAM CAPITAL LETTER WAW;Lu;0;R;;;;;N;;;;1E931; 1E910;ADLAM CAPITAL LETTER NUN;Lu;0;R;;;;;N;;;;1E932; 1E911;ADLAM CAPITAL LETTER KAF;Lu;0;R;;;;;N;;;;1E933; 1E912;ADLAM CAPITAL LETTER YA;Lu;0;R;;;;;N;;;;1E934; 1E913;ADLAM CAPITAL LETTER U;Lu;0;R;;;;;N;;;;1E935; 1E914;ADLAM CAPITAL LETTER JIIM;Lu;0;R;;;;;N;;;;1E936; 1E915;ADLAM CAPITAL LETTER CHI;Lu;0;R;;;;;N;;;;1E937; 1E916;ADLAM CAPITAL LETTER HA;Lu;0;R;;;;;N;;;;1E938; 1E917;ADLAM CAPITAL LETTER QAAF;Lu;0;R;;;;;N;;;;1E939; 1E918;ADLAM CAPITAL LETTER GA;Lu;0;R;;;;;N;;;;1E93A; 1E919;ADLAM CAPITAL LETTER NYA;Lu;0;R;;;;;N;;;;1E93B; 1E91A;ADLAM CAPITAL LETTER TU;Lu;0;R;;;;;N;;;;1E93C; 1E91B;ADLAM CAPITAL LETTER NHA;Lu;0;R;;;;;N;;;;1E93D; 1E91C;ADLAM CAPITAL LETTER VA;Lu;0;R;;;;;N;;;;1E93E; 1E91D;ADLAM CAPITAL LETTER KHA;Lu;0;R;;;;;N;;;;1E93F; 1E91E;ADLAM CAPITAL LETTER GBE;Lu;0;R;;;;;N;;;;1E940; 1E91F;ADLAM CAPITAL LETTER ZAL;Lu;0;R;;;;;N;;;;1E941; 1E920;ADLAM CAPITAL LETTER KPO;Lu;0;R;;;;;N;;;;1E942; 1E921;ADLAM CAPITAL LETTER SHA;Lu;0;R;;;;;N;;;;1E943; 1E922;ADLAM SMALL LETTER ALIF;Ll;0;R;;;;;N;;;1E900;;1E900 1E923;ADLAM SMALL LETTER DAALI;Ll;0;R;;;;;N;;;1E901;;1E901 1E924;ADLAM SMALL LETTER LAAM;Ll;0;R;;;;;N;;;1E902;;1E902 1E925;ADLAM SMALL LETTER MIIM;Ll;0;R;;;;;N;;;1E903;;1E903 1E926;ADLAM SMALL LETTER BA;Ll;0;R;;;;;N;;;1E904;;1E904 1E927;ADLAM SMALL LETTER SINNYIIYHE;Ll;0;R;;;;;N;;;1E905;;1E905 1E928;ADLAM SMALL LETTER PE;Ll;0;R;;;;;N;;;1E906;;1E906 1E929;ADLAM SMALL LETTER BHE;Ll;0;R;;;;;N;;;1E907;;1E907 1E92A;ADLAM SMALL LETTER RA;Ll;0;R;;;;;N;;;1E908;;1E908 1E92B;ADLAM SMALL LETTER E;Ll;0;R;;;;;N;;;1E909;;1E909 1E92C;ADLAM SMALL LETTER FA;Ll;0;R;;;;;N;;;1E90A;;1E90A 1E92D;ADLAM SMALL LETTER I;Ll;0;R;;;;;N;;;1E90B;;1E90B 1E92E;ADLAM SMALL LETTER O;Ll;0;R;;;;;N;;;1E90C;;1E90C 1E92F;ADLAM SMALL LETTER DHA;Ll;0;R;;;;;N;;;1E90D;;1E90D 1E930;ADLAM SMALL LETTER YHE;Ll;0;R;;;;;N;;;1E90E;;1E90E 1E931;ADLAM SMALL LETTER WAW;Ll;0;R;;;;;N;;;1E90F;;1E90F 1E932;ADLAM SMALL LETTER NUN;Ll;0;R;;;;;N;;;1E910;;1E910 1E933;ADLAM SMALL LETTER KAF;Ll;0;R;;;;;N;;;1E911;;1E911 1E934;ADLAM SMALL LETTER YA;Ll;0;R;;;;;N;;;1E912;;1E912 1E935;ADLAM SMALL LETTER U;Ll;0;R;;;;;N;;;1E913;;1E913 1E936;ADLAM SMALL LETTER JIIM;Ll;0;R;;;;;N;;;1E914;;1E914 1E937;ADLAM SMALL LETTER CHI;Ll;0;R;;;;;N;;;1E915;;1E915 1E938;ADLAM SMALL LETTER HA;Ll;0;R;;;;;N;;;1E916;;1E916 1E939;ADLAM SMALL LETTER QAAF;Ll;0;R;;;;;N;;;1E917;;1E917 1E93A;ADLAM SMALL LETTER GA;Ll;0;R;;;;;N;;;1E918;;1E918 1E93B;ADLAM SMALL LETTER NYA;Ll;0;R;;;;;N;;;1E919;;1E919 1E93C;ADLAM SMALL LETTER TU;Ll;0;R;;;;;N;;;1E91A;;1E91A 1E93D;ADLAM SMALL LETTER NHA;Ll;0;R;;;;;N;;;1E91B;;1E91B 1E93E;ADLAM SMALL LETTER VA;Ll;0;R;;;;;N;;;1E91C;;1E91C 1E93F;ADLAM SMALL LETTER KHA;Ll;0;R;;;;;N;;;1E91D;;1E91D 1E940;ADLAM SMALL LETTER GBE;Ll;0;R;;;;;N;;;1E91E;;1E91E 1E941;ADLAM SMALL LETTER ZAL;Ll;0;R;;;;;N;;;1E91F;;1E91F 1E942;ADLAM SMALL LETTER KPO;Ll;0;R;;;;;N;;;1E920;;1E920 1E943;ADLAM SMALL LETTER SHA;Ll;0;R;;;;;N;;;1E921;;1E921 1E944;ADLAM ALIF LENGTHENER;Mn;230;NSM;;;;;N;;;;; 1E945;ADLAM VOWEL LENGTHENER;Mn;230;NSM;;;;;N;;;;; 1E946;ADLAM GEMINATION MARK;Mn;230;NSM;;;;;N;;;;; 1E947;ADLAM HAMZA;Mn;230;NSM;;;;;N;;;;; 1E948;ADLAM CONSONANT MODIFIER;Mn;230;NSM;;;;;N;;;;; 1E949;ADLAM GEMINATE CONSONANT MODIFIER;Mn;230;NSM;;;;;N;;;;; 1E94A;ADLAM NUKTA;Mn;7;NSM;;;;;N;;;;; 1E950;ADLAM DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;; 1E951;ADLAM DIGIT ONE;Nd;0;R;;1;1;1;N;;;;; 1E952;ADLAM DIGIT TWO;Nd;0;R;;2;2;2;N;;;;; 1E953;ADLAM DIGIT THREE;Nd;0;R;;3;3;3;N;;;;; 1E954;ADLAM DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;; 1E955;ADLAM DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;; 1E956;ADLAM DIGIT SIX;Nd;0;R;;6;6;6;N;;;;; 1E957;ADLAM DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;; 1E958;ADLAM DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;; 1E959;ADLAM DIGIT NINE;Nd;0;R;;9;9;9;N;;;;; 1E95E;ADLAM INITIAL EXCLAMATION MARK;Po;0;R;;;;;N;;;;; 1E95F;ADLAM INITIAL QUESTION MARK;Po;0;R;;;;;N;;;;; 1EE00;ARABIC MATHEMATICAL ALEF;Lo;0;AL;<font> 0627;;;;N;;;;; 1EE01;ARABIC MATHEMATICAL BEH;Lo;0;AL;<font> 0628;;;;N;;;;; 1EE02;ARABIC MATHEMATICAL JEEM;Lo;0;AL;<font> 062C;;;;N;;;;; 1EE03;ARABIC MATHEMATICAL DAL;Lo;0;AL;<font> 062F;;;;N;;;;; 1EE05;ARABIC MATHEMATICAL WAW;Lo;0;AL;<font> 0648;;;;N;;;;; 1EE06;ARABIC MATHEMATICAL ZAIN;Lo;0;AL;<font> 0632;;;;N;;;;; 1EE07;ARABIC MATHEMATICAL HAH;Lo;0;AL;<font> 062D;;;;N;;;;; 1EE08;ARABIC MATHEMATICAL TAH;Lo;0;AL;<font> 0637;;;;N;;;;; 1EE09;ARABIC MATHEMATICAL YEH;Lo;0;AL;<font> 064A;;;;N;;;;; 1EE0A;ARABIC MATHEMATICAL KAF;Lo;0;AL;<font> 0643;;;;N;;;;; 1EE0B;ARABIC MATHEMATICAL LAM;Lo;0;AL;<font> 0644;;;;N;;;;; 1EE0C;ARABIC MATHEMATICAL MEEM;Lo;0;AL;<font> 0645;;;;N;;;;; 1EE0D;ARABIC MATHEMATICAL NOON;Lo;0;AL;<font> 0646;;;;N;;;;; 1EE0E;ARABIC MATHEMATICAL SEEN;Lo;0;AL;<font> 0633;;;;N;;;;; 1EE0F;ARABIC MATHEMATICAL AIN;Lo;0;AL;<font> 0639;;;;N;;;;; 1EE10;ARABIC MATHEMATICAL FEH;Lo;0;AL;<font> 0641;;;;N;;;;; 1EE11;ARABIC MATHEMATICAL SAD;Lo;0;AL;<font> 0635;;;;N;;;;; 1EE12;ARABIC MATHEMATICAL QAF;Lo;0;AL;<font> 0642;;;;N;;;;; 1EE13;ARABIC MATHEMATICAL REH;Lo;0;AL;<font> 0631;;;;N;;;;; 1EE14;ARABIC MATHEMATICAL SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;; 1EE15;ARABIC MATHEMATICAL TEH;Lo;0;AL;<font> 062A;;;;N;;;;; 1EE16;ARABIC MATHEMATICAL THEH;Lo;0;AL;<font> 062B;;;;N;;;;; 1EE17;ARABIC MATHEMATICAL KHAH;Lo;0;AL;<font> 062E;;;;N;;;;; 1EE18;ARABIC MATHEMATICAL THAL;Lo;0;AL;<font> 0630;;;;N;;;;; 1EE19;ARABIC MATHEMATICAL DAD;Lo;0;AL;<font> 0636;;;;N;;;;; 1EE1A;ARABIC MATHEMATICAL ZAH;Lo;0;AL;<font> 0638;;;;N;;;;; 1EE1B;ARABIC MATHEMATICAL GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;; 1EE1C;ARABIC MATHEMATICAL DOTLESS BEH;Lo;0;AL;<font> 066E;;;;N;;;;; 1EE1D;ARABIC MATHEMATICAL DOTLESS NOON;Lo;0;AL;<font> 06BA;;;;N;;;;; 1EE1E;ARABIC MATHEMATICAL DOTLESS FEH;Lo;0;AL;<font> 06A1;;;;N;;;;; 1EE1F;ARABIC MATHEMATICAL DOTLESS QAF;Lo;0;AL;<font> 066F;;;;N;;;;; 1EE21;ARABIC MATHEMATICAL INITIAL BEH;Lo;0;AL;<font> 0628;;;;N;;;;; 1EE22;ARABIC MATHEMATICAL INITIAL JEEM;Lo;0;AL;<font> 062C;;;;N;;;;; 1EE24;ARABIC MATHEMATICAL INITIAL HEH;Lo;0;AL;<font> 0647;;;;N;;;;; 1EE27;ARABIC MATHEMATICAL INITIAL HAH;Lo;0;AL;<font> 062D;;;;N;;;;; 1EE29;ARABIC MATHEMATICAL INITIAL YEH;Lo;0;AL;<font> 064A;;;;N;;;;; 1EE2A;ARABIC MATHEMATICAL INITIAL KAF;Lo;0;AL;<font> 0643;;;;N;;;;; 1EE2B;ARABIC MATHEMATICAL INITIAL LAM;Lo;0;AL;<font> 0644;;;;N;;;;; 1EE2C;ARABIC MATHEMATICAL INITIAL MEEM;Lo;0;AL;<font> 0645;;;;N;;;;; 1EE2D;ARABIC MATHEMATICAL INITIAL NOON;Lo;0;AL;<font> 0646;;;;N;;;;; 1EE2E;ARABIC MATHEMATICAL INITIAL SEEN;Lo;0;AL;<font> 0633;;;;N;;;;; 1EE2F;ARABIC MATHEMATICAL INITIAL AIN;Lo;0;AL;<font> 0639;;;;N;;;;; 1EE30;ARABIC MATHEMATICAL INITIAL FEH;Lo;0;AL;<font> 0641;;;;N;;;;; 1EE31;ARABIC MATHEMATICAL INITIAL SAD;Lo;0;AL;<font> 0635;;;;N;;;;; 1EE32;ARABIC MATHEMATICAL INITIAL QAF;Lo;0;AL;<font> 0642;;;;N;;;;; 1EE34;ARABIC MATHEMATICAL INITIAL SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;; 1EE35;ARABIC MATHEMATICAL INITIAL TEH;Lo;0;AL;<font> 062A;;;;N;;;;; 1EE36;ARABIC MATHEMATICAL INITIAL THEH;Lo;0;AL;<font> 062B;;;;N;;;;; 1EE37;ARABIC MATHEMATICAL INITIAL KHAH;Lo;0;AL;<font> 062E;;;;N;;;;; 1EE39;ARABIC MATHEMATICAL INITIAL DAD;Lo;0;AL;<font> 0636;;;;N;;;;; 1EE3B;ARABIC MATHEMATICAL INITIAL GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;; 1EE42;ARABIC MATHEMATICAL TAILED JEEM;Lo;0;AL;<font> 062C;;;;N;;;;; 1EE47;ARABIC MATHEMATICAL TAILED HAH;Lo;0;AL;<font> 062D;;;;N;;;;; 1EE49;ARABIC MATHEMATICAL TAILED YEH;Lo;0;AL;<font> 064A;;;;N;;;;; 1EE4B;ARABIC MATHEMATICAL TAILED LAM;Lo;0;AL;<font> 0644;;;;N;;;;; 1EE4D;ARABIC MATHEMATICAL TAILED NOON;Lo;0;AL;<font> 0646;;;;N;;;;; 1EE4E;ARABIC MATHEMATICAL TAILED SEEN;Lo;0;AL;<font> 0633;;;;N;;;;; 1EE4F;ARABIC MATHEMATICAL TAILED AIN;Lo;0;AL;<font> 0639;;;;N;;;;; 1EE51;ARABIC MATHEMATICAL TAILED SAD;Lo;0;AL;<font> 0635;;;;N;;;;; 1EE52;ARABIC MATHEMATICAL TAILED QAF;Lo;0;AL;<font> 0642;;;;N;;;;; 1EE54;ARABIC MATHEMATICAL TAILED SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;; 1EE57;ARABIC MATHEMATICAL TAILED KHAH;Lo;0;AL;<font> 062E;;;;N;;;;; 1EE59;ARABIC MATHEMATICAL TAILED DAD;Lo;0;AL;<font> 0636;;;;N;;;;; 1EE5B;ARABIC MATHEMATICAL TAILED GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;; 1EE5D;ARABIC MATHEMATICAL TAILED DOTLESS NOON;Lo;0;AL;<font> 06BA;;;;N;;;;; 1EE5F;ARABIC MATHEMATICAL TAILED DOTLESS QAF;Lo;0;AL;<font> 066F;;;;N;;;;; 1EE61;ARABIC MATHEMATICAL STRETCHED BEH;Lo;0;AL;<font> 0628;;;;N;;;;; 1EE62;ARABIC MATHEMATICAL STRETCHED JEEM;Lo;0;AL;<font> 062C;;;;N;;;;; 1EE64;ARABIC MATHEMATICAL STRETCHED HEH;Lo;0;AL;<font> 0647;;;;N;;;;; 1EE67;ARABIC MATHEMATICAL STRETCHED HAH;Lo;0;AL;<font> 062D;;;;N;;;;; 1EE68;ARABIC MATHEMATICAL STRETCHED TAH;Lo;0;AL;<font> 0637;;;;N;;;;; 1EE69;ARABIC MATHEMATICAL STRETCHED YEH;Lo;0;AL;<font> 064A;;;;N;;;;; 1EE6A;ARABIC MATHEMATICAL STRETCHED KAF;Lo;0;AL;<font> 0643;;;;N;;;;; 1EE6C;ARABIC MATHEMATICAL STRETCHED MEEM;Lo;0;AL;<font> 0645;;;;N;;;;; 1EE6D;ARABIC MATHEMATICAL STRETCHED NOON;Lo;0;AL;<font> 0646;;;;N;;;;; 1EE6E;ARABIC MATHEMATICAL STRETCHED SEEN;Lo;0;AL;<font> 0633;;;;N;;;;; 1EE6F;ARABIC MATHEMATICAL STRETCHED AIN;Lo;0;AL;<font> 0639;;;;N;;;;; 1EE70;ARABIC MATHEMATICAL STRETCHED FEH;Lo;0;AL;<font> 0641;;;;N;;;;; 1EE71;ARABIC MATHEMATICAL STRETCHED SAD;Lo;0;AL;<font> 0635;;;;N;;;;; 1EE72;ARABIC MATHEMATICAL STRETCHED QAF;Lo;0;AL;<font> 0642;;;;N;;;;; 1EE74;ARABIC MATHEMATICAL STRETCHED SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;; 1EE75;ARABIC MATHEMATICAL STRETCHED TEH;Lo;0;AL;<font> 062A;;;;N;;;;; 1EE76;ARABIC MATHEMATICAL STRETCHED THEH;Lo;0;AL;<font> 062B;;;;N;;;;; 1EE77;ARABIC MATHEMATICAL STRETCHED KHAH;Lo;0;AL;<font> 062E;;;;N;;;;; 1EE79;ARABIC MATHEMATICAL STRETCHED DAD;Lo;0;AL;<font> 0636;;;;N;;;;; 1EE7A;ARABIC MATHEMATICAL STRETCHED ZAH;Lo;0;AL;<font> 0638;;;;N;;;;; 1EE7B;ARABIC MATHEMATICAL STRETCHED GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;; 1EE7C;ARABIC MATHEMATICAL STRETCHED DOTLESS BEH;Lo;0;AL;<font> 066E;;;;N;;;;; 1EE7E;ARABIC MATHEMATICAL STRETCHED DOTLESS FEH;Lo;0;AL;<font> 06A1;;;;N;;;;; 1EE80;ARABIC MATHEMATICAL LOOPED ALEF;Lo;0;AL;<font> 0627;;;;N;;;;; 1EE81;ARABIC MATHEMATICAL LOOPED BEH;Lo;0;AL;<font> 0628;;;;N;;;;; 1EE82;ARABIC MATHEMATICAL LOOPED JEEM;Lo;0;AL;<font> 062C;;;;N;;;;; 1EE83;ARABIC MATHEMATICAL LOOPED DAL;Lo;0;AL;<font> 062F;;;;N;;;;; 1EE84;ARABIC MATHEMATICAL LOOPED HEH;Lo;0;AL;<font> 0647;;;;N;;;;; 1EE85;ARABIC MATHEMATICAL LOOPED WAW;Lo;0;AL;<font> 0648;;;;N;;;;; 1EE86;ARABIC MATHEMATICAL LOOPED ZAIN;Lo;0;AL;<font> 0632;;;;N;;;;; 1EE87;ARABIC MATHEMATICAL LOOPED HAH;Lo;0;AL;<font> 062D;;;;N;;;;; 1EE88;ARABIC MATHEMATICAL LOOPED TAH;Lo;0;AL;<font> 0637;;;;N;;;;; 1EE89;ARABIC MATHEMATICAL LOOPED YEH;Lo;0;AL;<font> 064A;;;;N;;;;; 1EE8B;ARABIC MATHEMATICAL LOOPED LAM;Lo;0;AL;<font> 0644;;;;N;;;;; 1EE8C;ARABIC MATHEMATICAL LOOPED MEEM;Lo;0;AL;<font> 0645;;;;N;;;;; 1EE8D;ARABIC MATHEMATICAL LOOPED NOON;Lo;0;AL;<font> 0646;;;;N;;;;; 1EE8E;ARABIC MATHEMATICAL LOOPED SEEN;Lo;0;AL;<font> 0633;;;;N;;;;; 1EE8F;ARABIC MATHEMATICAL LOOPED AIN;Lo;0;AL;<font> 0639;;;;N;;;;; 1EE90;ARABIC MATHEMATICAL LOOPED FEH;Lo;0;AL;<font> 0641;;;;N;;;;; 1EE91;ARABIC MATHEMATICAL LOOPED SAD;Lo;0;AL;<font> 0635;;;;N;;;;; 1EE92;ARABIC MATHEMATICAL LOOPED QAF;Lo;0;AL;<font> 0642;;;;N;;;;; 1EE93;ARABIC MATHEMATICAL LOOPED REH;Lo;0;AL;<font> 0631;;;;N;;;;; 1EE94;ARABIC MATHEMATICAL LOOPED SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;; 1EE95;ARABIC MATHEMATICAL LOOPED TEH;Lo;0;AL;<font> 062A;;;;N;;;;; 1EE96;ARABIC MATHEMATICAL LOOPED THEH;Lo;0;AL;<font> 062B;;;;N;;;;; 1EE97;ARABIC MATHEMATICAL LOOPED KHAH;Lo;0;AL;<font> 062E;;;;N;;;;; 1EE98;ARABIC MATHEMATICAL LOOPED THAL;Lo;0;AL;<font> 0630;;;;N;;;;; 1EE99;ARABIC MATHEMATICAL LOOPED DAD;Lo;0;AL;<font> 0636;;;;N;;;;; 1EE9A;ARABIC MATHEMATICAL LOOPED ZAH;Lo;0;AL;<font> 0638;;;;N;;;;; 1EE9B;ARABIC MATHEMATICAL LOOPED GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;; 1EEA1;ARABIC MATHEMATICAL DOUBLE-STRUCK BEH;Lo;0;AL;<font> 0628;;;;N;;;;; 1EEA2;ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM;Lo;0;AL;<font> 062C;;;;N;;;;; 1EEA3;ARABIC MATHEMATICAL DOUBLE-STRUCK DAL;Lo;0;AL;<font> 062F;;;;N;;;;; 1EEA5;ARABIC MATHEMATICAL DOUBLE-STRUCK WAW;Lo;0;AL;<font> 0648;;;;N;;;;; 1EEA6;ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN;Lo;0;AL;<font> 0632;;;;N;;;;; 1EEA7;ARABIC MATHEMATICAL DOUBLE-STRUCK HAH;Lo;0;AL;<font> 062D;;;;N;;;;; 1EEA8;ARABIC MATHEMATICAL DOUBLE-STRUCK TAH;Lo;0;AL;<font> 0637;;;;N;;;;; 1EEA9;ARABIC MATHEMATICAL DOUBLE-STRUCK YEH;Lo;0;AL;<font> 064A;;;;N;;;;; 1EEAB;ARABIC MATHEMATICAL DOUBLE-STRUCK LAM;Lo;0;AL;<font> 0644;;;;N;;;;; 1EEAC;ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM;Lo;0;AL;<font> 0645;;;;N;;;;; 1EEAD;ARABIC MATHEMATICAL DOUBLE-STRUCK NOON;Lo;0;AL;<font> 0646;;;;N;;;;; 1EEAE;ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN;Lo;0;AL;<font> 0633;;;;N;;;;; 1EEAF;ARABIC MATHEMATICAL DOUBLE-STRUCK AIN;Lo;0;AL;<font> 0639;;;;N;;;;; 1EEB0;ARABIC MATHEMATICAL DOUBLE-STRUCK FEH;Lo;0;AL;<font> 0641;;;;N;;;;; 1EEB1;ARABIC MATHEMATICAL DOUBLE-STRUCK SAD;Lo;0;AL;<font> 0635;;;;N;;;;; 1EEB2;ARABIC MATHEMATICAL DOUBLE-STRUCK QAF;Lo;0;AL;<font> 0642;;;;N;;;;; 1EEB3;ARABIC MATHEMATICAL DOUBLE-STRUCK REH;Lo;0;AL;<font> 0631;;;;N;;;;; 1EEB4;ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;; 1EEB5;ARABIC MATHEMATICAL DOUBLE-STRUCK TEH;Lo;0;AL;<font> 062A;;;;N;;;;; 1EEB6;ARABIC MATHEMATICAL DOUBLE-STRUCK THEH;Lo;0;AL;<font> 062B;;;;N;;;;; 1EEB7;ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH;Lo;0;AL;<font> 062E;;;;N;;;;; 1EEB8;ARABIC MATHEMATICAL DOUBLE-STRUCK THAL;Lo;0;AL;<font> 0630;;;;N;;;;; 1EEB9;ARABIC MATHEMATICAL DOUBLE-STRUCK DAD;Lo;0;AL;<font> 0636;;;;N;;;;; 1EEBA;ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH;Lo;0;AL;<font> 0638;;;;N;;;;; 1EEBB;ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;; 1EEF0;ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL;Sm;0;ON;;;;;N;;;;; 1EEF1;ARABIC MATHEMATICAL OPERATOR HAH WITH DAL;Sm;0;ON;;;;;N;;;;; 1F000;MAHJONG TILE EAST WIND;So;0;ON;;;;;N;;;;; 1F001;MAHJONG TILE SOUTH WIND;So;0;ON;;;;;N;;;;; 1F002;MAHJONG TILE WEST WIND;So;0;ON;;;;;N;;;;; 1F003;MAHJONG TILE NORTH WIND;So;0;ON;;;;;N;;;;; 1F004;MAHJONG TILE RED DRAGON;So;0;ON;;;;;N;;;;; 1F005;MAHJONG TILE GREEN DRAGON;So;0;ON;;;;;N;;;;; 1F006;MAHJONG TILE WHITE DRAGON;So;0;ON;;;;;N;;;;; 1F007;MAHJONG TILE ONE OF CHARACTERS;So;0;ON;;;;;N;;;;; 1F008;MAHJONG TILE TWO OF CHARACTERS;So;0;ON;;;;;N;;;;; 1F009;MAHJONG TILE THREE OF CHARACTERS;So;0;ON;;;;;N;;;;; 1F00A;MAHJONG TILE FOUR OF CHARACTERS;So;0;ON;;;;;N;;;;; 1F00B;MAHJONG TILE FIVE OF CHARACTERS;So;0;ON;;;;;N;;;;; 1F00C;MAHJONG TILE SIX OF CHARACTERS;So;0;ON;;;;;N;;;;; 1F00D;MAHJONG TILE SEVEN OF CHARACTERS;So;0;ON;;;;;N;;;;; 1F00E;MAHJONG TILE EIGHT OF CHARACTERS;So;0;ON;;;;;N;;;;; 1F00F;MAHJONG TILE NINE OF CHARACTERS;So;0;ON;;;;;N;;;;; 1F010;MAHJONG TILE ONE OF BAMBOOS;So;0;ON;;;;;N;;;;; 1F011;MAHJONG TILE TWO OF BAMBOOS;So;0;ON;;;;;N;;;;; 1F012;MAHJONG TILE THREE OF BAMBOOS;So;0;ON;;;;;N;;;;; 1F013;MAHJONG TILE FOUR OF BAMBOOS;So;0;ON;;;;;N;;;;; 1F014;MAHJONG TILE FIVE OF BAMBOOS;So;0;ON;;;;;N;;;;; 1F015;MAHJONG TILE SIX OF BAMBOOS;So;0;ON;;;;;N;;;;; 1F016;MAHJONG TILE SEVEN OF BAMBOOS;So;0;ON;;;;;N;;;;; 1F017;MAHJONG TILE EIGHT OF BAMBOOS;So;0;ON;;;;;N;;;;; 1F018;MAHJONG TILE NINE OF BAMBOOS;So;0;ON;;;;;N;;;;; 1F019;MAHJONG TILE ONE OF CIRCLES;So;0;ON;;;;;N;;;;; 1F01A;MAHJONG TILE TWO OF CIRCLES;So;0;ON;;;;;N;;;;; 1F01B;MAHJONG TILE THREE OF CIRCLES;So;0;ON;;;;;N;;;;; 1F01C;MAHJONG TILE FOUR OF CIRCLES;So;0;ON;;;;;N;;;;; 1F01D;MAHJONG TILE FIVE OF CIRCLES;So;0;ON;;;;;N;;;;; 1F01E;MAHJONG TILE SIX OF CIRCLES;So;0;ON;;;;;N;;;;; 1F01F;MAHJONG TILE SEVEN OF CIRCLES;So;0;ON;;;;;N;;;;; 1F020;MAHJONG TILE EIGHT OF CIRCLES;So;0;ON;;;;;N;;;;; 1F021;MAHJONG TILE NINE OF CIRCLES;So;0;ON;;;;;N;;;;; 1F022;MAHJONG TILE PLUM;So;0;ON;;;;;N;;;;; 1F023;MAHJONG TILE ORCHID;So;0;ON;;;;;N;;;;; 1F024;MAHJONG TILE BAMBOO;So;0;ON;;;;;N;;;;; 1F025;MAHJONG TILE CHRYSANTHEMUM;So;0;ON;;;;;N;;;;; 1F026;MAHJONG TILE SPRING;So;0;ON;;;;;N;;;;; 1F027;MAHJONG TILE SUMMER;So;0;ON;;;;;N;;;;; 1F028;MAHJONG TILE AUTUMN;So;0;ON;;;;;N;;;;; 1F029;MAHJONG TILE WINTER;So;0;ON;;;;;N;;;;; 1F02A;MAHJONG TILE JOKER;So;0;ON;;;;;N;;;;; 1F02B;MAHJONG TILE BACK;So;0;ON;;;;;N;;;;; 1F030;DOMINO TILE HORIZONTAL BACK;So;0;ON;;;;;N;;;;; 1F031;DOMINO TILE HORIZONTAL-00-00;So;0;ON;;;;;N;;;;; 1F032;DOMINO TILE HORIZONTAL-00-01;So;0;ON;;;;;N;;;;; 1F033;DOMINO TILE HORIZONTAL-00-02;So;0;ON;;;;;N;;;;; 1F034;DOMINO TILE HORIZONTAL-00-03;So;0;ON;;;;;N;;;;; 1F035;DOMINO TILE HORIZONTAL-00-04;So;0;ON;;;;;N;;;;; 1F036;DOMINO TILE HORIZONTAL-00-05;So;0;ON;;;;;N;;;;; 1F037;DOMINO TILE HORIZONTAL-00-06;So;0;ON;;;;;N;;;;; 1F038;DOMINO TILE HORIZONTAL-01-00;So;0;ON;;;;;N;;;;; 1F039;DOMINO TILE HORIZONTAL-01-01;So;0;ON;;;;;N;;;;; 1F03A;DOMINO TILE HORIZONTAL-01-02;So;0;ON;;;;;N;;;;; 1F03B;DOMINO TILE HORIZONTAL-01-03;So;0;ON;;;;;N;;;;; 1F03C;DOMINO TILE HORIZONTAL-01-04;So;0;ON;;;;;N;;;;; 1F03D;DOMINO TILE HORIZONTAL-01-05;So;0;ON;;;;;N;;;;; 1F03E;DOMINO TILE HORIZONTAL-01-06;So;0;ON;;;;;N;;;;; 1F03F;DOMINO TILE HORIZONTAL-02-00;So;0;ON;;;;;N;;;;; 1F040;DOMINO TILE HORIZONTAL-02-01;So;0;ON;;;;;N;;;;; 1F041;DOMINO TILE HORIZONTAL-02-02;So;0;ON;;;;;N;;;;; 1F042;DOMINO TILE HORIZONTAL-02-03;So;0;ON;;;;;N;;;;; 1F043;DOMINO TILE HORIZONTAL-02-04;So;0;ON;;;;;N;;;;; 1F044;DOMINO TILE HORIZONTAL-02-05;So;0;ON;;;;;N;;;;; 1F045;DOMINO TILE HORIZONTAL-02-06;So;0;ON;;;;;N;;;;; 1F046;DOMINO TILE HORIZONTAL-03-00;So;0;ON;;;;;N;;;;; 1F047;DOMINO TILE HORIZONTAL-03-01;So;0;ON;;;;;N;;;;; 1F048;DOMINO TILE HORIZONTAL-03-02;So;0;ON;;;;;N;;;;; 1F049;DOMINO TILE HORIZONTAL-03-03;So;0;ON;;;;;N;;;;; 1F04A;DOMINO TILE HORIZONTAL-03-04;So;0;ON;;;;;N;;;;; 1F04B;DOMINO TILE HORIZONTAL-03-05;So;0;ON;;;;;N;;;;; 1F04C;DOMINO TILE HORIZONTAL-03-06;So;0;ON;;;;;N;;;;; 1F04D;DOMINO TILE HORIZONTAL-04-00;So;0;ON;;;;;N;;;;; 1F04E;DOMINO TILE HORIZONTAL-04-01;So;0;ON;;;;;N;;;;; 1F04F;DOMINO TILE HORIZONTAL-04-02;So;0;ON;;;;;N;;;;; 1F050;DOMINO TILE HORIZONTAL-04-03;So;0;ON;;;;;N;;;;; 1F051;DOMINO TILE HORIZONTAL-04-04;So;0;ON;;;;;N;;;;; 1F052;DOMINO TILE HORIZONTAL-04-05;So;0;ON;;;;;N;;;;; 1F053;DOMINO TILE HORIZONTAL-04-06;So;0;ON;;;;;N;;;;; 1F054;DOMINO TILE HORIZONTAL-05-00;So;0;ON;;;;;N;;;;; 1F055;DOMINO TILE HORIZONTAL-05-01;So;0;ON;;;;;N;;;;; 1F056;DOMINO TILE HORIZONTAL-05-02;So;0;ON;;;;;N;;;;; 1F057;DOMINO TILE HORIZONTAL-05-03;So;0;ON;;;;;N;;;;; 1F058;DOMINO TILE HORIZONTAL-05-04;So;0;ON;;;;;N;;;;; 1F059;DOMINO TILE HORIZONTAL-05-05;So;0;ON;;;;;N;;;;; 1F05A;DOMINO TILE HORIZONTAL-05-06;So;0;ON;;;;;N;;;;; 1F05B;DOMINO TILE HORIZONTAL-06-00;So;0;ON;;;;;N;;;;; 1F05C;DOMINO TILE HORIZONTAL-06-01;So;0;ON;;;;;N;;;;; 1F05D;DOMINO TILE HORIZONTAL-06-02;So;0;ON;;;;;N;;;;; 1F05E;DOMINO TILE HORIZONTAL-06-03;So;0;ON;;;;;N;;;;; 1F05F;DOMINO TILE HORIZONTAL-06-04;So;0;ON;;;;;N;;;;; 1F060;DOMINO TILE HORIZONTAL-06-05;So;0;ON;;;;;N;;;;; 1F061;DOMINO TILE HORIZONTAL-06-06;So;0;ON;;;;;N;;;;; 1F062;DOMINO TILE VERTICAL BACK;So;0;ON;;;;;N;;;;; 1F063;DOMINO TILE VERTICAL-00-00;So;0;ON;;;;;N;;;;; 1F064;DOMINO TILE VERTICAL-00-01;So;0;ON;;;;;N;;;;; 1F065;DOMINO TILE VERTICAL-00-02;So;0;ON;;;;;N;;;;; 1F066;DOMINO TILE VERTICAL-00-03;So;0;ON;;;;;N;;;;; 1F067;DOMINO TILE VERTICAL-00-04;So;0;ON;;;;;N;;;;; 1F068;DOMINO TILE VERTICAL-00-05;So;0;ON;;;;;N;;;;; 1F069;DOMINO TILE VERTICAL-00-06;So;0;ON;;;;;N;;;;; 1F06A;DOMINO TILE VERTICAL-01-00;So;0;ON;;;;;N;;;;; 1F06B;DOMINO TILE VERTICAL-01-01;So;0;ON;;;;;N;;;;; 1F06C;DOMINO TILE VERTICAL-01-02;So;0;ON;;;;;N;;;;; 1F06D;DOMINO TILE VERTICAL-01-03;So;0;ON;;;;;N;;;;; 1F06E;DOMINO TILE VERTICAL-01-04;So;0;ON;;;;;N;;;;; 1F06F;DOMINO TILE VERTICAL-01-05;So;0;ON;;;;;N;;;;; 1F070;DOMINO TILE VERTICAL-01-06;So;0;ON;;;;;N;;;;; 1F071;DOMINO TILE VERTICAL-02-00;So;0;ON;;;;;N;;;;; 1F072;DOMINO TILE VERTICAL-02-01;So;0;ON;;;;;N;;;;; 1F073;DOMINO TILE VERTICAL-02-02;So;0;ON;;;;;N;;;;; 1F074;DOMINO TILE VERTICAL-02-03;So;0;ON;;;;;N;;;;; 1F075;DOMINO TILE VERTICAL-02-04;So;0;ON;;;;;N;;;;; 1F076;DOMINO TILE VERTICAL-02-05;So;0;ON;;;;;N;;;;; 1F077;DOMINO TILE VERTICAL-02-06;So;0;ON;;;;;N;;;;; 1F078;DOMINO TILE VERTICAL-03-00;So;0;ON;;;;;N;;;;; 1F079;DOMINO TILE VERTICAL-03-01;So;0;ON;;;;;N;;;;; 1F07A;DOMINO TILE VERTICAL-03-02;So;0;ON;;;;;N;;;;; 1F07B;DOMINO TILE VERTICAL-03-03;So;0;ON;;;;;N;;;;; 1F07C;DOMINO TILE VERTICAL-03-04;So;0;ON;;;;;N;;;;; 1F07D;DOMINO TILE VERTICAL-03-05;So;0;ON;;;;;N;;;;; 1F07E;DOMINO TILE VERTICAL-03-06;So;0;ON;;;;;N;;;;; 1F07F;DOMINO TILE VERTICAL-04-00;So;0;ON;;;;;N;;;;; 1F080;DOMINO TILE VERTICAL-04-01;So;0;ON;;;;;N;;;;; 1F081;DOMINO TILE VERTICAL-04-02;So;0;ON;;;;;N;;;;; 1F082;DOMINO TILE VERTICAL-04-03;So;0;ON;;;;;N;;;;; 1F083;DOMINO TILE VERTICAL-04-04;So;0;ON;;;;;N;;;;; 1F084;DOMINO TILE VERTICAL-04-05;So;0;ON;;;;;N;;;;; 1F085;DOMINO TILE VERTICAL-04-06;So;0;ON;;;;;N;;;;; 1F086;DOMINO TILE VERTICAL-05-00;So;0;ON;;;;;N;;;;; 1F087;DOMINO TILE VERTICAL-05-01;So;0;ON;;;;;N;;;;; 1F088;DOMINO TILE VERTICAL-05-02;So;0;ON;;;;;N;;;;; 1F089;DOMINO TILE VERTICAL-05-03;So;0;ON;;;;;N;;;;; 1F08A;DOMINO TILE VERTICAL-05-04;So;0;ON;;;;;N;;;;; 1F08B;DOMINO TILE VERTICAL-05-05;So;0;ON;;;;;N;;;;; 1F08C;DOMINO TILE VERTICAL-05-06;So;0;ON;;;;;N;;;;; 1F08D;DOMINO TILE VERTICAL-06-00;So;0;ON;;;;;N;;;;; 1F08E;DOMINO TILE VERTICAL-06-01;So;0;ON;;;;;N;;;;; 1F08F;DOMINO TILE VERTICAL-06-02;So;0;ON;;;;;N;;;;; 1F090;DOMINO TILE VERTICAL-06-03;So;0;ON;;;;;N;;;;; 1F091;DOMINO TILE VERTICAL-06-04;So;0;ON;;;;;N;;;;; 1F092;DOMINO TILE VERTICAL-06-05;So;0;ON;;;;;N;;;;; 1F093;DOMINO TILE VERTICAL-06-06;So;0;ON;;;;;N;;;;; 1F0A0;PLAYING CARD BACK;So;0;ON;;;;;N;;;;; 1F0A1;PLAYING CARD ACE OF SPADES;So;0;ON;;;;;N;;;;; 1F0A2;PLAYING CARD TWO OF SPADES;So;0;ON;;;;;N;;;;; 1F0A3;PLAYING CARD THREE OF SPADES;So;0;ON;;;;;N;;;;; 1F0A4;PLAYING CARD FOUR OF SPADES;So;0;ON;;;;;N;;;;; 1F0A5;PLAYING CARD FIVE OF SPADES;So;0;ON;;;;;N;;;;; 1F0A6;PLAYING CARD SIX OF SPADES;So;0;ON;;;;;N;;;;; 1F0A7;PLAYING CARD SEVEN OF SPADES;So;0;ON;;;;;N;;;;; 1F0A8;PLAYING CARD EIGHT OF SPADES;So;0;ON;;;;;N;;;;; 1F0A9;PLAYING CARD NINE OF SPADES;So;0;ON;;;;;N;;;;; 1F0AA;PLAYING CARD TEN OF SPADES;So;0;ON;;;;;N;;;;; 1F0AB;PLAYING CARD JACK OF SPADES;So;0;ON;;;;;N;;;;; 1F0AC;PLAYING CARD KNIGHT OF SPADES;So;0;ON;;;;;N;;;;; 1F0AD;PLAYING CARD QUEEN OF SPADES;So;0;ON;;;;;N;;;;; 1F0AE;PLAYING CARD KING OF SPADES;So;0;ON;;;;;N;;;;; 1F0B1;PLAYING CARD ACE OF HEARTS;So;0;ON;;;;;N;;;;; 1F0B2;PLAYING CARD TWO OF HEARTS;So;0;ON;;;;;N;;;;; 1F0B3;PLAYING CARD THREE OF HEARTS;So;0;ON;;;;;N;;;;; 1F0B4;PLAYING CARD FOUR OF HEARTS;So;0;ON;;;;;N;;;;; 1F0B5;PLAYING CARD FIVE OF HEARTS;So;0;ON;;;;;N;;;;; 1F0B6;PLAYING CARD SIX OF HEARTS;So;0;ON;;;;;N;;;;; 1F0B7;PLAYING CARD SEVEN OF HEARTS;So;0;ON;;;;;N;;;;; 1F0B8;PLAYING CARD EIGHT OF HEARTS;So;0;ON;;;;;N;;;;; 1F0B9;PLAYING CARD NINE OF HEARTS;So;0;ON;;;;;N;;;;; 1F0BA;PLAYING CARD TEN OF HEARTS;So;0;ON;;;;;N;;;;; 1F0BB;PLAYING CARD JACK OF HEARTS;So;0;ON;;;;;N;;;;; 1F0BC;PLAYING CARD KNIGHT OF HEARTS;So;0;ON;;;;;N;;;;; 1F0BD;PLAYING CARD QUEEN OF HEARTS;So;0;ON;;;;;N;;;;; 1F0BE;PLAYING CARD KING OF HEARTS;So;0;ON;;;;;N;;;;; 1F0BF;PLAYING CARD RED JOKER;So;0;ON;;;;;N;;;;; 1F0C1;PLAYING CARD ACE OF DIAMONDS;So;0;ON;;;;;N;;;;; 1F0C2;PLAYING CARD TWO OF DIAMONDS;So;0;ON;;;;;N;;;;; 1F0C3;PLAYING CARD THREE OF DIAMONDS;So;0;ON;;;;;N;;;;; 1F0C4;PLAYING CARD FOUR OF DIAMONDS;So;0;ON;;;;;N;;;;; 1F0C5;PLAYING CARD FIVE OF DIAMONDS;So;0;ON;;;;;N;;;;; 1F0C6;PLAYING CARD SIX OF DIAMONDS;So;0;ON;;;;;N;;;;; 1F0C7;PLAYING CARD SEVEN OF DIAMONDS;So;0;ON;;;;;N;;;;; 1F0C8;PLAYING CARD EIGHT OF DIAMONDS;So;0;ON;;;;;N;;;;; 1F0C9;PLAYING CARD NINE OF DIAMONDS;So;0;ON;;;;;N;;;;; 1F0CA;PLAYING CARD TEN OF DIAMONDS;So;0;ON;;;;;N;;;;; 1F0CB;PLAYING CARD JACK OF DIAMONDS;So;0;ON;;;;;N;;;;; 1F0CC;PLAYING CARD KNIGHT OF DIAMONDS;So;0;ON;;;;;N;;;;; 1F0CD;PLAYING CARD QUEEN OF DIAMONDS;So;0;ON;;;;;N;;;;; 1F0CE;PLAYING CARD KING OF DIAMONDS;So;0;ON;;;;;N;;;;; 1F0CF;PLAYING CARD BLACK JOKER;So;0;ON;;;;;N;;;;; 1F0D1;PLAYING CARD ACE OF CLUBS;So;0;ON;;;;;N;;;;; 1F0D2;PLAYING CARD TWO OF CLUBS;So;0;ON;;;;;N;;;;; 1F0D3;PLAYING CARD THREE OF CLUBS;So;0;ON;;;;;N;;;;; 1F0D4;PLAYING CARD FOUR OF CLUBS;So;0;ON;;;;;N;;;;; 1F0D5;PLAYING CARD FIVE OF CLUBS;So;0;ON;;;;;N;;;;; 1F0D6;PLAYING CARD SIX OF CLUBS;So;0;ON;;;;;N;;;;; 1F0D7;PLAYING CARD SEVEN OF CLUBS;So;0;ON;;;;;N;;;;; 1F0D8;PLAYING CARD EIGHT OF CLUBS;So;0;ON;;;;;N;;;;; 1F0D9;PLAYING CARD NINE OF CLUBS;So;0;ON;;;;;N;;;;; 1F0DA;PLAYING CARD TEN OF CLUBS;So;0;ON;;;;;N;;;;; 1F0DB;PLAYING CARD JACK OF CLUBS;So;0;ON;;;;;N;;;;; 1F0DC;PLAYING CARD KNIGHT OF CLUBS;So;0;ON;;;;;N;;;;; 1F0DD;PLAYING CARD QUEEN OF CLUBS;So;0;ON;;;;;N;;;;; 1F0DE;PLAYING CARD KING OF CLUBS;So;0;ON;;;;;N;;;;; 1F0DF;PLAYING CARD WHITE JOKER;So;0;ON;;;;;N;;;;; 1F0E0;PLAYING CARD FOOL;So;0;ON;;;;;N;;;;; 1F0E1;PLAYING CARD TRUMP-1;So;0;ON;;;;;N;;;;; 1F0E2;PLAYING CARD TRUMP-2;So;0;ON;;;;;N;;;;; 1F0E3;PLAYING CARD TRUMP-3;So;0;ON;;;;;N;;;;; 1F0E4;PLAYING CARD TRUMP-4;So;0;ON;;;;;N;;;;; 1F0E5;PLAYING CARD TRUMP-5;So;0;ON;;;;;N;;;;; 1F0E6;PLAYING CARD TRUMP-6;So;0;ON;;;;;N;;;;; 1F0E7;PLAYING CARD TRUMP-7;So;0;ON;;;;;N;;;;; 1F0E8;PLAYING CARD TRUMP-8;So;0;ON;;;;;N;;;;; 1F0E9;PLAYING CARD TRUMP-9;So;0;ON;;;;;N;;;;; 1F0EA;PLAYING CARD TRUMP-10;So;0;ON;;;;;N;;;;; 1F0EB;PLAYING CARD TRUMP-11;So;0;ON;;;;;N;;;;; 1F0EC;PLAYING CARD TRUMP-12;So;0;ON;;;;;N;;;;; 1F0ED;PLAYING CARD TRUMP-13;So;0;ON;;;;;N;;;;; 1F0EE;PLAYING CARD TRUMP-14;So;0;ON;;;;;N;;;;; 1F0EF;PLAYING CARD TRUMP-15;So;0;ON;;;;;N;;;;; 1F0F0;PLAYING CARD TRUMP-16;So;0;ON;;;;;N;;;;; 1F0F1;PLAYING CARD TRUMP-17;So;0;ON;;;;;N;;;;; 1F0F2;PLAYING CARD TRUMP-18;So;0;ON;;;;;N;;;;; 1F0F3;PLAYING CARD TRUMP-19;So;0;ON;;;;;N;;;;; 1F0F4;PLAYING CARD TRUMP-20;So;0;ON;;;;;N;;;;; 1F0F5;PLAYING CARD TRUMP-21;So;0;ON;;;;;N;;;;; 1F100;DIGIT ZERO FULL STOP;No;0;EN;<compat> 0030 002E;;0;0;N;;;;; 1F101;DIGIT ZERO COMMA;No;0;EN;<compat> 0030 002C;;0;0;N;;;;; 1F102;DIGIT ONE COMMA;No;0;EN;<compat> 0031 002C;;1;1;N;;;;; 1F103;DIGIT TWO COMMA;No;0;EN;<compat> 0032 002C;;2;2;N;;;;; 1F104;DIGIT THREE COMMA;No;0;EN;<compat> 0033 002C;;3;3;N;;;;; 1F105;DIGIT FOUR COMMA;No;0;EN;<compat> 0034 002C;;4;4;N;;;;; 1F106;DIGIT FIVE COMMA;No;0;EN;<compat> 0035 002C;;5;5;N;;;;; 1F107;DIGIT SIX COMMA;No;0;EN;<compat> 0036 002C;;6;6;N;;;;; 1F108;DIGIT SEVEN COMMA;No;0;EN;<compat> 0037 002C;;7;7;N;;;;; 1F109;DIGIT EIGHT COMMA;No;0;EN;<compat> 0038 002C;;8;8;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;;;;; 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;;;;; 1F113;PARENTHESIZED LATIN CAPITAL LETTER D;So;0;L;<compat> 0028 0044 0029;;;;N;;;;; 1F114;PARENTHESIZED LATIN CAPITAL LETTER E;So;0;L;<compat> 0028 0045 0029;;;;N;;;;; 1F115;PARENTHESIZED LATIN CAPITAL LETTER F;So;0;L;<compat> 0028 0046 0029;;;;N;;;;; 1F116;PARENTHESIZED LATIN CAPITAL LETTER G;So;0;L;<compat> 0028 0047 0029;;;;N;;;;; 1F117;PARENTHESIZED LATIN CAPITAL LETTER H;So;0;L;<compat> 0028 0048 0029;;;;N;;;;; 1F118;PARENTHESIZED LATIN CAPITAL LETTER I;So;0;L;<compat> 0028 0049 0029;;;;N;;;;; 1F119;PARENTHESIZED LATIN CAPITAL LETTER J;So;0;L;<compat> 0028 004A 0029;;;;N;;;;; 1F11A;PARENTHESIZED LATIN CAPITAL LETTER K;So;0;L;<compat> 0028 004B 0029;;;;N;;;;; 1F11B;PARENTHESIZED LATIN CAPITAL LETTER L;So;0;L;<compat> 0028 004C 0029;;;;N;;;;; 1F11C;PARENTHESIZED LATIN CAPITAL LETTER M;So;0;L;<compat> 0028 004D 0029;;;;N;;;;; 1F11D;PARENTHESIZED LATIN CAPITAL LETTER N;So;0;L;<compat> 0028 004E 0029;;;;N;;;;; 1F11E;PARENTHESIZED LATIN CAPITAL LETTER O;So;0;L;<compat> 0028 004F 0029;;;;N;;;;; 1F11F;PARENTHESIZED LATIN CAPITAL LETTER P;So;0;L;<compat> 0028 0050 0029;;;;N;;;;; 1F120;PARENTHESIZED LATIN CAPITAL LETTER Q;So;0;L;<compat> 0028 0051 0029;;;;N;;;;; 1F121;PARENTHESIZED LATIN CAPITAL LETTER R;So;0;L;<compat> 0028 0052 0029;;;;N;;;;; 1F122;PARENTHESIZED LATIN CAPITAL LETTER S;So;0;L;<compat> 0028 0053 0029;;;;N;;;;; 1F123;PARENTHESIZED LATIN CAPITAL LETTER T;So;0;L;<compat> 0028 0054 0029;;;;N;;;;; 1F124;PARENTHESIZED LATIN CAPITAL LETTER U;So;0;L;<compat> 0028 0055 0029;;;;N;;;;; 1F125;PARENTHESIZED LATIN CAPITAL LETTER V;So;0;L;<compat> 0028 0056 0029;;;;N;;;;; 1F126;PARENTHESIZED LATIN CAPITAL LETTER W;So;0;L;<compat> 0028 0057 0029;;;;N;;;;; 1F127;PARENTHESIZED LATIN CAPITAL LETTER X;So;0;L;<compat> 0028 0058 0029;;;;N;;;;; 1F128;PARENTHESIZED LATIN CAPITAL LETTER Y;So;0;L;<compat> 0028 0059 0029;;;;N;;;;; 1F129;PARENTHESIZED LATIN CAPITAL LETTER Z;So;0;L;<compat> 0028 005A 0029;;;;N;;;;; 1F12A;TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S;So;0;L;<compat> 3014 0053 3015;;;;N;;;;; 1F12B;CIRCLED ITALIC LATIN CAPITAL LETTER C;So;0;L;<circle> 0043;;;;N;;;;; 1F12C;CIRCLED ITALIC LATIN CAPITAL LETTER R;So;0;L;<circle> 0052;;;;N;;;;; 1F12D;CIRCLED CD;So;0;L;<circle> 0043 0044;;;;N;;;;; 1F12E;CIRCLED WZ;So;0;L;<circle> 0057 005A;;;;N;;;;; 1F130;SQUARED LATIN CAPITAL LETTER A;So;0;L;<square> 0041;;;;N;;;;; 1F131;SQUARED LATIN CAPITAL LETTER B;So;0;L;<square> 0042;;;;N;;;;; 1F132;SQUARED LATIN CAPITAL LETTER C;So;0;L;<square> 0043;;;;N;;;;; 1F133;SQUARED LATIN CAPITAL LETTER D;So;0;L;<square> 0044;;;;N;;;;; 1F134;SQUARED LATIN CAPITAL LETTER E;So;0;L;<square> 0045;;;;N;;;;; 1F135;SQUARED LATIN CAPITAL LETTER F;So;0;L;<square> 0046;;;;N;;;;; 1F136;SQUARED LATIN CAPITAL LETTER G;So;0;L;<square> 0047;;;;N;;;;; 1F137;SQUARED LATIN CAPITAL LETTER H;So;0;L;<square> 0048;;;;N;;;;; 1F138;SQUARED LATIN CAPITAL LETTER I;So;0;L;<square> 0049;;;;N;;;;; 1F139;SQUARED LATIN CAPITAL LETTER J;So;0;L;<square> 004A;;;;N;;;;; 1F13A;SQUARED LATIN CAPITAL LETTER K;So;0;L;<square> 004B;;;;N;;;;; 1F13B;SQUARED LATIN CAPITAL LETTER L;So;0;L;<square> 004C;;;;N;;;;; 1F13C;SQUARED LATIN CAPITAL LETTER M;So;0;L;<square> 004D;;;;N;;;;; 1F13D;SQUARED LATIN CAPITAL LETTER N;So;0;L;<square> 004E;;;;N;;;;; 1F13E;SQUARED LATIN CAPITAL LETTER O;So;0;L;<square> 004F;;;;N;;;;; 1F13F;SQUARED LATIN CAPITAL LETTER P;So;0;L;<square> 0050;;;;N;;;;; 1F140;SQUARED LATIN CAPITAL LETTER Q;So;0;L;<square> 0051;;;;N;;;;; 1F141;SQUARED LATIN CAPITAL LETTER R;So;0;L;<square> 0052;;;;N;;;;; 1F142;SQUARED LATIN CAPITAL LETTER S;So;0;L;<square> 0053;;;;N;;;;; 1F143;SQUARED LATIN CAPITAL LETTER T;So;0;L;<square> 0054;;;;N;;;;; 1F144;SQUARED LATIN CAPITAL LETTER U;So;0;L;<square> 0055;;;;N;;;;; 1F145;SQUARED LATIN CAPITAL LETTER V;So;0;L;<square> 0056;;;;N;;;;; 1F146;SQUARED LATIN CAPITAL LETTER W;So;0;L;<square> 0057;;;;N;;;;; 1F147;SQUARED LATIN CAPITAL LETTER X;So;0;L;<square> 0058;;;;N;;;;; 1F148;SQUARED LATIN CAPITAL LETTER Y;So;0;L;<square> 0059;;;;N;;;;; 1F149;SQUARED LATIN CAPITAL LETTER Z;So;0;L;<square> 005A;;;;N;;;;; 1F14A;SQUARED HV;So;0;L;<square> 0048 0056;;;;N;;;;; 1F14B;SQUARED MV;So;0;L;<square> 004D 0056;;;;N;;;;; 1F14C;SQUARED SD;So;0;L;<square> 0053 0044;;;;N;;;;; 1F14D;SQUARED SS;So;0;L;<square> 0053 0053;;;;N;;;;; 1F14E;SQUARED PPV;So;0;L;<square> 0050 0050 0056;;;;N;;;;; 1F14F;SQUARED WC;So;0;L;<square> 0057 0043;;;;N;;;;; 1F150;NEGATIVE CIRCLED LATIN CAPITAL LETTER A;So;0;L;;;;;N;;;;; 1F151;NEGATIVE CIRCLED LATIN CAPITAL LETTER B;So;0;L;;;;;N;;;;; 1F152;NEGATIVE CIRCLED LATIN CAPITAL LETTER C;So;0;L;;;;;N;;;;; 1F153;NEGATIVE CIRCLED LATIN CAPITAL LETTER D;So;0;L;;;;;N;;;;; 1F154;NEGATIVE CIRCLED LATIN CAPITAL LETTER E;So;0;L;;;;;N;;;;; 1F155;NEGATIVE CIRCLED LATIN CAPITAL LETTER F;So;0;L;;;;;N;;;;; 1F156;NEGATIVE CIRCLED LATIN CAPITAL LETTER G;So;0;L;;;;;N;;;;; 1F157;NEGATIVE CIRCLED LATIN CAPITAL LETTER H;So;0;L;;;;;N;;;;; 1F158;NEGATIVE CIRCLED LATIN CAPITAL LETTER I;So;0;L;;;;;N;;;;; 1F159;NEGATIVE CIRCLED LATIN CAPITAL LETTER J;So;0;L;;;;;N;;;;; 1F15A;NEGATIVE CIRCLED LATIN CAPITAL LETTER K;So;0;L;;;;;N;;;;; 1F15B;NEGATIVE CIRCLED LATIN CAPITAL LETTER L;So;0;L;;;;;N;;;;; 1F15C;NEGATIVE CIRCLED LATIN CAPITAL LETTER M;So;0;L;;;;;N;;;;; 1F15D;NEGATIVE CIRCLED LATIN CAPITAL LETTER N;So;0;L;;;;;N;;;;; 1F15E;NEGATIVE CIRCLED LATIN CAPITAL LETTER O;So;0;L;;;;;N;;;;; 1F15F;NEGATIVE CIRCLED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; 1F160;NEGATIVE CIRCLED LATIN CAPITAL LETTER Q;So;0;L;;;;;N;;;;; 1F161;NEGATIVE CIRCLED LATIN CAPITAL LETTER R;So;0;L;;;;;N;;;;; 1F162;NEGATIVE CIRCLED LATIN CAPITAL LETTER S;So;0;L;;;;;N;;;;; 1F163;NEGATIVE CIRCLED LATIN CAPITAL LETTER T;So;0;L;;;;;N;;;;; 1F164;NEGATIVE CIRCLED LATIN CAPITAL LETTER U;So;0;L;;;;;N;;;;; 1F165;NEGATIVE CIRCLED LATIN CAPITAL LETTER V;So;0;L;;;;;N;;;;; 1F166;NEGATIVE CIRCLED LATIN CAPITAL LETTER W;So;0;L;;;;;N;;;;; 1F167;NEGATIVE CIRCLED LATIN CAPITAL LETTER X;So;0;L;;;;;N;;;;; 1F168;NEGATIVE CIRCLED LATIN CAPITAL LETTER Y;So;0;L;;;;;N;;;;; 1F169;NEGATIVE CIRCLED LATIN CAPITAL LETTER Z;So;0;L;;;;;N;;;;; 1F16A;RAISED MC SIGN;So;0;ON;<super> 004D 0043;;;;N;;;;; 1F16B;RAISED MD SIGN;So;0;ON;<super> 004D 0044;;;;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;;;;; 1F173;NEGATIVE SQUARED LATIN CAPITAL LETTER D;So;0;L;;;;;N;;;;; 1F174;NEGATIVE SQUARED LATIN CAPITAL LETTER E;So;0;L;;;;;N;;;;; 1F175;NEGATIVE SQUARED LATIN CAPITAL LETTER F;So;0;L;;;;;N;;;;; 1F176;NEGATIVE SQUARED LATIN CAPITAL LETTER G;So;0;L;;;;;N;;;;; 1F177;NEGATIVE SQUARED LATIN CAPITAL LETTER H;So;0;L;;;;;N;;;;; 1F178;NEGATIVE SQUARED LATIN CAPITAL LETTER I;So;0;L;;;;;N;;;;; 1F179;NEGATIVE SQUARED LATIN CAPITAL LETTER J;So;0;L;;;;;N;;;;; 1F17A;NEGATIVE SQUARED LATIN CAPITAL LETTER K;So;0;L;;;;;N;;;;; 1F17B;NEGATIVE SQUARED LATIN CAPITAL LETTER L;So;0;L;;;;;N;;;;; 1F17C;NEGATIVE SQUARED LATIN CAPITAL LETTER M;So;0;L;;;;;N;;;;; 1F17D;NEGATIVE SQUARED LATIN CAPITAL LETTER N;So;0;L;;;;;N;;;;; 1F17E;NEGATIVE SQUARED LATIN CAPITAL LETTER O;So;0;L;;;;;N;;;;; 1F17F;NEGATIVE SQUARED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; 1F180;NEGATIVE SQUARED LATIN CAPITAL LETTER Q;So;0;L;;;;;N;;;;; 1F181;NEGATIVE SQUARED LATIN CAPITAL LETTER R;So;0;L;;;;;N;;;;; 1F182;NEGATIVE SQUARED LATIN CAPITAL LETTER S;So;0;L;;;;;N;;;;; 1F183;NEGATIVE SQUARED LATIN CAPITAL LETTER T;So;0;L;;;;;N;;;;; 1F184;NEGATIVE SQUARED LATIN CAPITAL LETTER U;So;0;L;;;;;N;;;;; 1F185;NEGATIVE SQUARED LATIN CAPITAL LETTER V;So;0;L;;;;;N;;;;; 1F186;NEGATIVE SQUARED LATIN CAPITAL LETTER W;So;0;L;;;;;N;;;;; 1F187;NEGATIVE SQUARED LATIN CAPITAL LETTER X;So;0;L;;;;;N;;;;; 1F188;NEGATIVE SQUARED LATIN CAPITAL LETTER Y;So;0;L;;;;;N;;;;; 1F189;NEGATIVE SQUARED LATIN CAPITAL LETTER Z;So;0;L;;;;;N;;;;; 1F18A;CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; 1F18B;NEGATIVE SQUARED IC;So;0;L;;;;;N;;;;; 1F18C;NEGATIVE SQUARED PA;So;0;L;;;;;N;;;;; 1F18D;NEGATIVE SQUARED SA;So;0;L;;;;;N;;;;; 1F18E;NEGATIVE SQUARED AB;So;0;L;;;;;N;;;;; 1F18F;NEGATIVE SQUARED WC;So;0;L;;;;;N;;;;; 1F190;SQUARE DJ;So;0;L;<square> 0044 004A;;;;N;;;;; 1F191;SQUARED CL;So;0;L;;;;;N;;;;; 1F192;SQUARED COOL;So;0;L;;;;;N;;;;; 1F193;SQUARED FREE;So;0;L;;;;;N;;;;; 1F194;SQUARED ID;So;0;L;;;;;N;;;;; 1F195;SQUARED NEW;So;0;L;;;;;N;;;;; 1F196;SQUARED NG;So;0;L;;;;;N;;;;; 1F197;SQUARED OK;So;0;L;;;;;N;;;;; 1F198;SQUARED SOS;So;0;L;;;;;N;;;;; 1F199;SQUARED UP WITH EXCLAMATION MARK;So;0;L;;;;;N;;;;; 1F19A;SQUARED VS;So;0;L;;;;;N;;;;; 1F19B;SQUARED THREE D;So;0;L;;;;;N;;;;; 1F19C;SQUARED SECOND SCREEN;So;0;L;;;;;N;;;;; 1F19D;SQUARED TWO K;So;0;L;;;;;N;;;;; 1F19E;SQUARED FOUR K;So;0;L;;;;;N;;;;; 1F19F;SQUARED EIGHT K;So;0;L;;;;;N;;;;; 1F1A0;SQUARED FIVE POINT ONE;So;0;L;;;;;N;;;;; 1F1A1;SQUARED SEVEN POINT ONE;So;0;L;;;;;N;;;;; 1F1A2;SQUARED TWENTY-TWO POINT TWO;So;0;L;;;;;N;;;;; 1F1A3;SQUARED SIXTY P;So;0;L;;;;;N;;;;; 1F1A4;SQUARED ONE HUNDRED TWENTY P;So;0;L;;;;;N;;;;; 1F1A5;SQUARED LATIN SMALL LETTER D;So;0;L;;;;;N;;;;; 1F1A6;SQUARED HC;So;0;L;;;;;N;;;;; 1F1A7;SQUARED HDR;So;0;L;;;;;N;;;;; 1F1A8;SQUARED HI-RES;So;0;L;;;;;N;;;;; 1F1A9;SQUARED LOSSLESS;So;0;L;;;;;N;;;;; 1F1AA;SQUARED SHV;So;0;L;;;;;N;;;;; 1F1AB;SQUARED UHD;So;0;L;;;;;N;;;;; 1F1AC;SQUARED VOD;So;0;L;;;;;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;;;;; 1F1E9;REGIONAL INDICATOR SYMBOL LETTER D;So;0;L;;;;;N;;;;; 1F1EA;REGIONAL INDICATOR SYMBOL LETTER E;So;0;L;;;;;N;;;;; 1F1EB;REGIONAL INDICATOR SYMBOL LETTER F;So;0;L;;;;;N;;;;; 1F1EC;REGIONAL INDICATOR SYMBOL LETTER G;So;0;L;;;;;N;;;;; 1F1ED;REGIONAL INDICATOR SYMBOL LETTER H;So;0;L;;;;;N;;;;; 1F1EE;REGIONAL INDICATOR SYMBOL LETTER I;So;0;L;;;;;N;;;;; 1F1EF;REGIONAL INDICATOR SYMBOL LETTER J;So;0;L;;;;;N;;;;; 1F1F0;REGIONAL INDICATOR SYMBOL LETTER K;So;0;L;;;;;N;;;;; 1F1F1;REGIONAL INDICATOR SYMBOL LETTER L;So;0;L;;;;;N;;;;; 1F1F2;REGIONAL INDICATOR SYMBOL LETTER M;So;0;L;;;;;N;;;;; 1F1F3;REGIONAL INDICATOR SYMBOL LETTER N;So;0;L;;;;;N;;;;; 1F1F4;REGIONAL INDICATOR SYMBOL LETTER O;So;0;L;;;;;N;;;;; 1F1F5;REGIONAL INDICATOR SYMBOL LETTER P;So;0;L;;;;;N;;;;; 1F1F6;REGIONAL INDICATOR SYMBOL LETTER Q;So;0;L;;;;;N;;;;; 1F1F7;REGIONAL INDICATOR SYMBOL LETTER R;So;0;L;;;;;N;;;;; 1F1F8;REGIONAL INDICATOR SYMBOL LETTER S;So;0;L;;;;;N;;;;; 1F1F9;REGIONAL INDICATOR SYMBOL LETTER T;So;0;L;;;;;N;;;;; 1F1FA;REGIONAL INDICATOR SYMBOL LETTER U;So;0;L;;;;;N;;;;; 1F1FB;REGIONAL INDICATOR SYMBOL LETTER V;So;0;L;;;;;N;;;;; 1F1FC;REGIONAL INDICATOR SYMBOL LETTER W;So;0;L;;;;;N;;;;; 1F1FD;REGIONAL INDICATOR SYMBOL LETTER X;So;0;L;;;;;N;;;;; 1F1FE;REGIONAL INDICATOR SYMBOL LETTER Y;So;0;L;;;;;N;;;;; 1F1FF;REGIONAL INDICATOR SYMBOL LETTER Z;So;0;L;;;;;N;;;;; 1F200;SQUARE HIRAGANA HOKA;So;0;L;<square> 307B 304B;;;;N;;;;; 1F201;SQUARED KATAKANA KOKO;So;0;L;<square> 30B3 30B3;;;;N;;;;; 1F202;SQUARED KATAKANA SA;So;0;L;<square> 30B5;;;;N;;;;; 1F210;SQUARED CJK UNIFIED IDEOGRAPH-624B;So;0;L;<square> 624B;;;;N;;;;; 1F211;SQUARED CJK UNIFIED IDEOGRAPH-5B57;So;0;L;<square> 5B57;;;;N;;;;; 1F212;SQUARED CJK UNIFIED IDEOGRAPH-53CC;So;0;L;<square> 53CC;;;;N;;;;; 1F213;SQUARED KATAKANA DE;So;0;L;<square> 30C7;;;;N;;;;; 1F214;SQUARED CJK UNIFIED IDEOGRAPH-4E8C;So;0;L;<square> 4E8C;;;;N;;;;; 1F215;SQUARED CJK UNIFIED IDEOGRAPH-591A;So;0;L;<square> 591A;;;;N;;;;; 1F216;SQUARED CJK UNIFIED IDEOGRAPH-89E3;So;0;L;<square> 89E3;;;;N;;;;; 1F217;SQUARED CJK UNIFIED IDEOGRAPH-5929;So;0;L;<square> 5929;;;;N;;;;; 1F218;SQUARED CJK UNIFIED IDEOGRAPH-4EA4;So;0;L;<square> 4EA4;;;;N;;;;; 1F219;SQUARED CJK UNIFIED IDEOGRAPH-6620;So;0;L;<square> 6620;;;;N;;;;; 1F21A;SQUARED CJK UNIFIED IDEOGRAPH-7121;So;0;L;<square> 7121;;;;N;;;;; 1F21B;SQUARED CJK UNIFIED IDEOGRAPH-6599;So;0;L;<square> 6599;;;;N;;;;; 1F21C;SQUARED CJK UNIFIED IDEOGRAPH-524D;So;0;L;<square> 524D;;;;N;;;;; 1F21D;SQUARED CJK UNIFIED IDEOGRAPH-5F8C;So;0;L;<square> 5F8C;;;;N;;;;; 1F21E;SQUARED CJK UNIFIED IDEOGRAPH-518D;So;0;L;<square> 518D;;;;N;;;;; 1F21F;SQUARED CJK UNIFIED IDEOGRAPH-65B0;So;0;L;<square> 65B0;;;;N;;;;; 1F220;SQUARED CJK UNIFIED IDEOGRAPH-521D;So;0;L;<square> 521D;;;;N;;;;; 1F221;SQUARED CJK UNIFIED IDEOGRAPH-7D42;So;0;L;<square> 7D42;;;;N;;;;; 1F222;SQUARED CJK UNIFIED IDEOGRAPH-751F;So;0;L;<square> 751F;;;;N;;;;; 1F223;SQUARED CJK UNIFIED IDEOGRAPH-8CA9;So;0;L;<square> 8CA9;;;;N;;;;; 1F224;SQUARED CJK UNIFIED IDEOGRAPH-58F0;So;0;L;<square> 58F0;;;;N;;;;; 1F225;SQUARED CJK UNIFIED IDEOGRAPH-5439;So;0;L;<square> 5439;;;;N;;;;; 1F226;SQUARED CJK UNIFIED IDEOGRAPH-6F14;So;0;L;<square> 6F14;;;;N;;;;; 1F227;SQUARED CJK UNIFIED IDEOGRAPH-6295;So;0;L;<square> 6295;;;;N;;;;; 1F228;SQUARED CJK UNIFIED IDEOGRAPH-6355;So;0;L;<square> 6355;;;;N;;;;; 1F229;SQUARED CJK UNIFIED IDEOGRAPH-4E00;So;0;L;<square> 4E00;;;;N;;;;; 1F22A;SQUARED CJK UNIFIED IDEOGRAPH-4E09;So;0;L;<square> 4E09;;;;N;;;;; 1F22B;SQUARED CJK UNIFIED IDEOGRAPH-904A;So;0;L;<square> 904A;;;;N;;;;; 1F22C;SQUARED CJK UNIFIED IDEOGRAPH-5DE6;So;0;L;<square> 5DE6;;;;N;;;;; 1F22D;SQUARED CJK UNIFIED IDEOGRAPH-4E2D;So;0;L;<square> 4E2D;;;;N;;;;; 1F22E;SQUARED CJK UNIFIED IDEOGRAPH-53F3;So;0;L;<square> 53F3;;;;N;;;;; 1F22F;SQUARED CJK UNIFIED IDEOGRAPH-6307;So;0;L;<square> 6307;;;;N;;;;; 1F230;SQUARED CJK UNIFIED IDEOGRAPH-8D70;So;0;L;<square> 8D70;;;;N;;;;; 1F231;SQUARED CJK UNIFIED IDEOGRAPH-6253;So;0;L;<square> 6253;;;;N;;;;; 1F232;SQUARED CJK UNIFIED IDEOGRAPH-7981;So;0;L;<square> 7981;;;;N;;;;; 1F233;SQUARED CJK UNIFIED IDEOGRAPH-7A7A;So;0;L;<square> 7A7A;;;;N;;;;; 1F234;SQUARED CJK UNIFIED IDEOGRAPH-5408;So;0;L;<square> 5408;;;;N;;;;; 1F235;SQUARED CJK UNIFIED IDEOGRAPH-6E80;So;0;L;<square> 6E80;;;;N;;;;; 1F236;SQUARED CJK UNIFIED IDEOGRAPH-6709;So;0;L;<square> 6709;;;;N;;;;; 1F237;SQUARED CJK UNIFIED IDEOGRAPH-6708;So;0;L;<square> 6708;;;;N;;;;; 1F238;SQUARED CJK UNIFIED IDEOGRAPH-7533;So;0;L;<square> 7533;;;;N;;;;; 1F239;SQUARED CJK UNIFIED IDEOGRAPH-5272;So;0;L;<square> 5272;;;;N;;;;; 1F23A;SQUARED CJK UNIFIED IDEOGRAPH-55B6;So;0;L;<square> 55B6;;;;N;;;;; 1F23B;SQUARED CJK UNIFIED IDEOGRAPH-914D;So;0;L;<square> 914D;;;;N;;;;; 1F240;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C;So;0;L;<compat> 3014 672C 3015;;;;N;;;;; 1F241;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09;So;0;L;<compat> 3014 4E09 3015;;;;N;;;;; 1F242;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C;So;0;L;<compat> 3014 4E8C 3015;;;;N;;;;; 1F243;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89;So;0;L;<compat> 3014 5B89 3015;;;;N;;;;; 1F244;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9;So;0;L;<compat> 3014 70B9 3015;;;;N;;;;; 1F245;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253;So;0;L;<compat> 3014 6253 3015;;;;N;;;;; 1F246;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7;So;0;L;<compat> 3014 76D7 3015;;;;N;;;;; 1F247;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD;So;0;L;<compat> 3014 52DD 3015;;;;N;;;;; 1F248;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557;So;0;L;<compat> 3014 6557 3015;;;;N;;;;; 1F250;CIRCLED IDEOGRAPH ADVANTAGE;So;0;L;<circle> 5F97;;;;N;;;;; 1F251;CIRCLED IDEOGRAPH ACCEPT;So;0;L;<circle> 53EF;;;;N;;;;; 1F300;CYCLONE;So;0;ON;;;;;N;;;;; 1F301;FOGGY;So;0;ON;;;;;N;;;;; 1F302;CLOSED UMBRELLA;So;0;ON;;;;;N;;;;; 1F303;NIGHT WITH STARS;So;0;ON;;;;;N;;;;; 1F304;SUNRISE OVER MOUNTAINS;So;0;ON;;;;;N;;;;; 1F305;SUNRISE;So;0;ON;;;;;N;;;;; 1F306;CITYSCAPE AT DUSK;So;0;ON;;;;;N;;;;; 1F307;SUNSET OVER BUILDINGS;So;0;ON;;;;;N;;;;; 1F308;RAINBOW;So;0;ON;;;;;N;;;;; 1F309;BRIDGE AT NIGHT;So;0;ON;;;;;N;;;;; 1F30A;WATER WAVE;So;0;ON;;;;;N;;;;; 1F30B;VOLCANO;So;0;ON;;;;;N;;;;; 1F30C;MILKY WAY;So;0;ON;;;;;N;;;;; 1F30D;EARTH GLOBE EUROPE-AFRICA;So;0;ON;;;;;N;;;;; 1F30E;EARTH GLOBE AMERICAS;So;0;ON;;;;;N;;;;; 1F30F;EARTH GLOBE ASIA-AUSTRALIA;So;0;ON;;;;;N;;;;; 1F310;GLOBE WITH MERIDIANS;So;0;ON;;;;;N;;;;; 1F311;NEW MOON SYMBOL;So;0;ON;;;;;N;;;;; 1F312;WAXING CRESCENT MOON SYMBOL;So;0;ON;;;;;N;;;;; 1F313;FIRST QUARTER MOON SYMBOL;So;0;ON;;;;;N;;;;; 1F314;WAXING GIBBOUS MOON SYMBOL;So;0;ON;;;;;N;;;;; 1F315;FULL MOON SYMBOL;So;0;ON;;;;;N;;;;; 1F316;WANING GIBBOUS MOON SYMBOL;So;0;ON;;;;;N;;;;; 1F317;LAST QUARTER MOON SYMBOL;So;0;ON;;;;;N;;;;; 1F318;WANING CRESCENT MOON SYMBOL;So;0;ON;;;;;N;;;;; 1F319;CRESCENT MOON;So;0;ON;;;;;N;;;;; 1F31A;NEW MOON WITH FACE;So;0;ON;;;;;N;;;;; 1F31B;FIRST QUARTER MOON WITH FACE;So;0;ON;;;;;N;;;;; 1F31C;LAST QUARTER MOON WITH FACE;So;0;ON;;;;;N;;;;; 1F31D;FULL MOON WITH FACE;So;0;ON;;;;;N;;;;; 1F31E;SUN WITH FACE;So;0;ON;;;;;N;;;;; 1F31F;GLOWING STAR;So;0;ON;;;;;N;;;;; 1F320;SHOOTING STAR;So;0;ON;;;;;N;;;;; 1F321;THERMOMETER;So;0;ON;;;;;N;;;;; 1F322;BLACK DROPLET;So;0;ON;;;;;N;;;;; 1F323;WHITE SUN;So;0;ON;;;;;N;;;;; 1F324;WHITE SUN WITH SMALL CLOUD;So;0;ON;;;;;N;;;;; 1F325;WHITE SUN BEHIND CLOUD;So;0;ON;;;;;N;;;;; 1F326;WHITE SUN BEHIND CLOUD WITH RAIN;So;0;ON;;;;;N;;;;; 1F327;CLOUD WITH RAIN;So;0;ON;;;;;N;;;;; 1F328;CLOUD WITH SNOW;So;0;ON;;;;;N;;;;; 1F329;CLOUD WITH LIGHTNING;So;0;ON;;;;;N;;;;; 1F32A;CLOUD WITH TORNADO;So;0;ON;;;;;N;;;;; 1F32B;FOG;So;0;ON;;;;;N;;;;; 1F32C;WIND BLOWING FACE;So;0;ON;;;;;N;;;;; 1F32D;HOT DOG;So;0;ON;;;;;N;;;;; 1F32E;TACO;So;0;ON;;;;;N;;;;; 1F32F;BURRITO;So;0;ON;;;;;N;;;;; 1F330;CHESTNUT;So;0;ON;;;;;N;;;;; 1F331;SEEDLING;So;0;ON;;;;;N;;;;; 1F332;EVERGREEN TREE;So;0;ON;;;;;N;;;;; 1F333;DECIDUOUS TREE;So;0;ON;;;;;N;;;;; 1F334;PALM TREE;So;0;ON;;;;;N;;;;; 1F335;CACTUS;So;0;ON;;;;;N;;;;; 1F336;HOT PEPPER;So;0;ON;;;;;N;;;;; 1F337;TULIP;So;0;ON;;;;;N;;;;; 1F338;CHERRY BLOSSOM;So;0;ON;;;;;N;;;;; 1F339;ROSE;So;0;ON;;;;;N;;;;; 1F33A;HIBISCUS;So;0;ON;;;;;N;;;;; 1F33B;SUNFLOWER;So;0;ON;;;;;N;;;;; 1F33C;BLOSSOM;So;0;ON;;;;;N;;;;; 1F33D;EAR OF MAIZE;So;0;ON;;;;;N;;;;; 1F33E;EAR OF RICE;So;0;ON;;;;;N;;;;; 1F33F;HERB;So;0;ON;;;;;N;;;;; 1F340;FOUR LEAF CLOVER;So;0;ON;;;;;N;;;;; 1F341;MAPLE LEAF;So;0;ON;;;;;N;;;;; 1F342;FALLEN LEAF;So;0;ON;;;;;N;;;;; 1F343;LEAF FLUTTERING IN WIND;So;0;ON;;;;;N;;;;; 1F344;MUSHROOM;So;0;ON;;;;;N;;;;; 1F345;TOMATO;So;0;ON;;;;;N;;;;; 1F346;AUBERGINE;So;0;ON;;;;;N;;;;; 1F347;GRAPES;So;0;ON;;;;;N;;;;; 1F348;MELON;So;0;ON;;;;;N;;;;; 1F349;WATERMELON;So;0;ON;;;;;N;;;;; 1F34A;TANGERINE;So;0;ON;;;;;N;;;;; 1F34B;LEMON;So;0;ON;;;;;N;;;;; 1F34C;BANANA;So;0;ON;;;;;N;;;;; 1F34D;PINEAPPLE;So;0;ON;;;;;N;;;;; 1F34E;RED APPLE;So;0;ON;;;;;N;;;;; 1F34F;GREEN APPLE;So;0;ON;;;;;N;;;;; 1F350;PEAR;So;0;ON;;;;;N;;;;; 1F351;PEACH;So;0;ON;;;;;N;;;;; 1F352;CHERRIES;So;0;ON;;;;;N;;;;; 1F353;STRAWBERRY;So;0;ON;;;;;N;;;;; 1F354;HAMBURGER;So;0;ON;;;;;N;;;;; 1F355;SLICE OF PIZZA;So;0;ON;;;;;N;;;;; 1F356;MEAT ON BONE;So;0;ON;;;;;N;;;;; 1F357;POULTRY LEG;So;0;ON;;;;;N;;;;; 1F358;RICE CRACKER;So;0;ON;;;;;N;;;;; 1F359;RICE BALL;So;0;ON;;;;;N;;;;; 1F35A;COOKED RICE;So;0;ON;;;;;N;;;;; 1F35B;CURRY AND RICE;So;0;ON;;;;;N;;;;; 1F35C;STEAMING BOWL;So;0;ON;;;;;N;;;;; 1F35D;SPAGHETTI;So;0;ON;;;;;N;;;;; 1F35E;BREAD;So;0;ON;;;;;N;;;;; 1F35F;FRENCH FRIES;So;0;ON;;;;;N;;;;; 1F360;ROASTED SWEET POTATO;So;0;ON;;;;;N;;;;; 1F361;DANGO;So;0;ON;;;;;N;;;;; 1F362;ODEN;So;0;ON;;;;;N;;;;; 1F363;SUSHI;So;0;ON;;;;;N;;;;; 1F364;FRIED SHRIMP;So;0;ON;;;;;N;;;;; 1F365;FISH CAKE WITH SWIRL DESIGN;So;0;ON;;;;;N;;;;; 1F366;SOFT ICE CREAM;So;0;ON;;;;;N;;;;; 1F367;SHAVED ICE;So;0;ON;;;;;N;;;;; 1F368;ICE CREAM;So;0;ON;;;;;N;;;;; 1F369;DOUGHNUT;So;0;ON;;;;;N;;;;; 1F36A;COOKIE;So;0;ON;;;;;N;;;;; 1F36B;CHOCOLATE BAR;So;0;ON;;;;;N;;;;; 1F36C;CANDY;So;0;ON;;;;;N;;;;; 1F36D;LOLLIPOP;So;0;ON;;;;;N;;;;; 1F36E;CUSTARD;So;0;ON;;;;;N;;;;; 1F36F;HONEY POT;So;0;ON;;;;;N;;;;; 1F370;SHORTCAKE;So;0;ON;;;;;N;;;;; 1F371;BENTO BOX;So;0;ON;;;;;N;;;;; 1F372;POT OF FOOD;So;0;ON;;;;;N;;;;; 1F373;COOKING;So;0;ON;;;;;N;;;;; 1F374;FORK AND KNIFE;So;0;ON;;;;;N;;;;; 1F375;TEACUP WITHOUT HANDLE;So;0;ON;;;;;N;;;;; 1F376;SAKE BOTTLE AND CUP;So;0;ON;;;;;N;;;;; 1F377;WINE GLASS;So;0;ON;;;;;N;;;;; 1F378;COCKTAIL GLASS;So;0;ON;;;;;N;;;;; 1F379;TROPICAL DRINK;So;0;ON;;;;;N;;;;; 1F37A;BEER MUG;So;0;ON;;;;;N;;;;; 1F37B;CLINKING BEER MUGS;So;0;ON;;;;;N;;;;; 1F37C;BABY BOTTLE;So;0;ON;;;;;N;;;;; 1F37D;FORK AND KNIFE WITH PLATE;So;0;ON;;;;;N;;;;; 1F37E;BOTTLE WITH POPPING CORK;So;0;ON;;;;;N;;;;; 1F37F;POPCORN;So;0;ON;;;;;N;;;;; 1F380;RIBBON;So;0;ON;;;;;N;;;;; 1F381;WRAPPED PRESENT;So;0;ON;;;;;N;;;;; 1F382;BIRTHDAY CAKE;So;0;ON;;;;;N;;;;; 1F383;JACK-O-LANTERN;So;0;ON;;;;;N;;;;; 1F384;CHRISTMAS TREE;So;0;ON;;;;;N;;;;; 1F385;FATHER CHRISTMAS;So;0;ON;;;;;N;;;;; 1F386;FIREWORKS;So;0;ON;;;;;N;;;;; 1F387;FIREWORK SPARKLER;So;0;ON;;;;;N;;;;; 1F388;BALLOON;So;0;ON;;;;;N;;;;; 1F389;PARTY POPPER;So;0;ON;;;;;N;;;;; 1F38A;CONFETTI BALL;So;0;ON;;;;;N;;;;; 1F38B;TANABATA TREE;So;0;ON;;;;;N;;;;; 1F38C;CROSSED FLAGS;So;0;ON;;;;;N;;;;; 1F38D;PINE DECORATION;So;0;ON;;;;;N;;;;; 1F38E;JAPANESE DOLLS;So;0;ON;;;;;N;;;;; 1F38F;CARP STREAMER;So;0;ON;;;;;N;;;;; 1F390;WIND CHIME;So;0;ON;;;;;N;;;;; 1F391;MOON VIEWING CEREMONY;So;0;ON;;;;;N;;;;; 1F392;SCHOOL SATCHEL;So;0;ON;;;;;N;;;;; 1F393;GRADUATION CAP;So;0;ON;;;;;N;;;;; 1F394;HEART WITH TIP ON THE LEFT;So;0;ON;;;;;N;;;;; 1F395;BOUQUET OF FLOWERS;So;0;ON;;;;;N;;;;; 1F396;MILITARY MEDAL;So;0;ON;;;;;N;;;;; 1F397;REMINDER RIBBON;So;0;ON;;;;;N;;;;; 1F398;MUSICAL KEYBOARD WITH JACKS;So;0;ON;;;;;N;;;;; 1F399;STUDIO MICROPHONE;So;0;ON;;;;;N;;;;; 1F39A;LEVEL SLIDER;So;0;ON;;;;;N;;;;; 1F39B;CONTROL KNOBS;So;0;ON;;;;;N;;;;; 1F39C;BEAMED ASCENDING MUSICAL NOTES;So;0;ON;;;;;N;;;;; 1F39D;BEAMED DESCENDING MUSICAL NOTES;So;0;ON;;;;;N;;;;; 1F39E;FILM FRAMES;So;0;ON;;;;;N;;;;; 1F39F;ADMISSION TICKETS;So;0;ON;;;;;N;;;;; 1F3A0;CAROUSEL HORSE;So;0;ON;;;;;N;;;;; 1F3A1;FERRIS WHEEL;So;0;ON;;;;;N;;;;; 1F3A2;ROLLER COASTER;So;0;ON;;;;;N;;;;; 1F3A3;FISHING POLE AND FISH;So;0;ON;;;;;N;;;;; 1F3A4;MICROPHONE;So;0;ON;;;;;N;;;;; 1F3A5;MOVIE CAMERA;So;0;ON;;;;;N;;;;; 1F3A6;CINEMA;So;0;ON;;;;;N;;;;; 1F3A7;HEADPHONE;So;0;ON;;;;;N;;;;; 1F3A8;ARTIST PALETTE;So;0;ON;;;;;N;;;;; 1F3A9;TOP HAT;So;0;ON;;;;;N;;;;; 1F3AA;CIRCUS TENT;So;0;ON;;;;;N;;;;; 1F3AB;TICKET;So;0;ON;;;;;N;;;;; 1F3AC;CLAPPER BOARD;So;0;ON;;;;;N;;;;; 1F3AD;PERFORMING ARTS;So;0;ON;;;;;N;;;;; 1F3AE;VIDEO GAME;So;0;ON;;;;;N;;;;; 1F3AF;DIRECT HIT;So;0;ON;;;;;N;;;;; 1F3B0;SLOT MACHINE;So;0;ON;;;;;N;;;;; 1F3B1;BILLIARDS;So;0;ON;;;;;N;;;;; 1F3B2;GAME DIE;So;0;ON;;;;;N;;;;; 1F3B3;BOWLING;So;0;ON;;;;;N;;;;; 1F3B4;FLOWER PLAYING CARDS;So;0;ON;;;;;N;;;;; 1F3B5;MUSICAL NOTE;So;0;ON;;;;;N;;;;; 1F3B6;MULTIPLE MUSICAL NOTES;So;0;ON;;;;;N;;;;; 1F3B7;SAXOPHONE;So;0;ON;;;;;N;;;;; 1F3B8;GUITAR;So;0;ON;;;;;N;;;;; 1F3B9;MUSICAL KEYBOARD;So;0;ON;;;;;N;;;;; 1F3BA;TRUMPET;So;0;ON;;;;;N;;;;; 1F3BB;VIOLIN;So;0;ON;;;;;N;;;;; 1F3BC;MUSICAL SCORE;So;0;ON;;;;;N;;;;; 1F3BD;RUNNING SHIRT WITH SASH;So;0;ON;;;;;N;;;;; 1F3BE;TENNIS RACQUET AND BALL;So;0;ON;;;;;N;;;;; 1F3BF;SKI AND SKI BOOT;So;0;ON;;;;;N;;;;; 1F3C0;BASKETBALL AND HOOP;So;0;ON;;;;;N;;;;; 1F3C1;CHEQUERED FLAG;So;0;ON;;;;;N;;;;; 1F3C2;SNOWBOARDER;So;0;ON;;;;;N;;;;; 1F3C3;RUNNER;So;0;ON;;;;;N;;;;; 1F3C4;SURFER;So;0;ON;;;;;N;;;;; 1F3C5;SPORTS MEDAL;So;0;ON;;;;;N;;;;; 1F3C6;TROPHY;So;0;ON;;;;;N;;;;; 1F3C7;HORSE RACING;So;0;ON;;;;;N;;;;; 1F3C8;AMERICAN FOOTBALL;So;0;ON;;;;;N;;;;; 1F3C9;RUGBY FOOTBALL;So;0;ON;;;;;N;;;;; 1F3CA;SWIMMER;So;0;ON;;;;;N;;;;; 1F3CB;WEIGHT LIFTER;So;0;ON;;;;;N;;;;; 1F3CC;GOLFER;So;0;ON;;;;;N;;;;; 1F3CD;RACING MOTORCYCLE;So;0;ON;;;;;N;;;;; 1F3CE;RACING CAR;So;0;ON;;;;;N;;;;; 1F3CF;CRICKET BAT AND BALL;So;0;ON;;;;;N;;;;; 1F3D0;VOLLEYBALL;So;0;ON;;;;;N;;;;; 1F3D1;FIELD HOCKEY STICK AND BALL;So;0;ON;;;;;N;;;;; 1F3D2;ICE HOCKEY STICK AND PUCK;So;0;ON;;;;;N;;;;; 1F3D3;TABLE TENNIS PADDLE AND BALL;So;0;ON;;;;;N;;;;; 1F3D4;SNOW CAPPED MOUNTAIN;So;0;ON;;;;;N;;;;; 1F3D5;CAMPING;So;0;ON;;;;;N;;;;; 1F3D6;BEACH WITH UMBRELLA;So;0;ON;;;;;N;;;;; 1F3D7;BUILDING CONSTRUCTION;So;0;ON;;;;;N;;;;; 1F3D8;HOUSE BUILDINGS;So;0;ON;;;;;N;;;;; 1F3D9;CITYSCAPE;So;0;ON;;;;;N;;;;; 1F3DA;DERELICT HOUSE BUILDING;So;0;ON;;;;;N;;;;; 1F3DB;CLASSICAL BUILDING;So;0;ON;;;;;N;;;;; 1F3DC;DESERT;So;0;ON;;;;;N;;;;; 1F3DD;DESERT ISLAND;So;0;ON;;;;;N;;;;; 1F3DE;NATIONAL PARK;So;0;ON;;;;;N;;;;; 1F3DF;STADIUM;So;0;ON;;;;;N;;;;; 1F3E0;HOUSE BUILDING;So;0;ON;;;;;N;;;;; 1F3E1;HOUSE WITH GARDEN;So;0;ON;;;;;N;;;;; 1F3E2;OFFICE BUILDING;So;0;ON;;;;;N;;;;; 1F3E3;JAPANESE POST OFFICE;So;0;ON;;;;;N;;;;; 1F3E4;EUROPEAN POST OFFICE;So;0;ON;;;;;N;;;;; 1F3E5;HOSPITAL;So;0;ON;;;;;N;;;;; 1F3E6;BANK;So;0;ON;;;;;N;;;;; 1F3E7;AUTOMATED TELLER MACHINE;So;0;ON;;;;;N;;;;; 1F3E8;HOTEL;So;0;ON;;;;;N;;;;; 1F3E9;LOVE HOTEL;So;0;ON;;;;;N;;;;; 1F3EA;CONVENIENCE STORE;So;0;ON;;;;;N;;;;; 1F3EB;SCHOOL;So;0;ON;;;;;N;;;;; 1F3EC;DEPARTMENT STORE;So;0;ON;;;;;N;;;;; 1F3ED;FACTORY;So;0;ON;;;;;N;;;;; 1F3EE;IZAKAYA LANTERN;So;0;ON;;;;;N;;;;; 1F3EF;JAPANESE CASTLE;So;0;ON;;;;;N;;;;; 1F3F0;EUROPEAN CASTLE;So;0;ON;;;;;N;;;;; 1F3F1;WHITE PENNANT;So;0;ON;;;;;N;;;;; 1F3F2;BLACK PENNANT;So;0;ON;;;;;N;;;;; 1F3F3;WAVING WHITE FLAG;So;0;ON;;;;;N;;;;; 1F3F4;WAVING BLACK FLAG;So;0;ON;;;;;N;;;;; 1F3F5;ROSETTE;So;0;ON;;;;;N;;;;; 1F3F6;BLACK ROSETTE;So;0;ON;;;;;N;;;;; 1F3F7;LABEL;So;0;ON;;;;;N;;;;; 1F3F8;BADMINTON RACQUET AND SHUTTLECOCK;So;0;ON;;;;;N;;;;; 1F3F9;BOW AND ARROW;So;0;ON;;;;;N;;;;; 1F3FA;AMPHORA;So;0;ON;;;;;N;;;;; 1F3FB;EMOJI MODIFIER FITZPATRICK TYPE-1-2;Sk;0;ON;;;;;N;;;;; 1F3FC;EMOJI MODIFIER FITZPATRICK TYPE-3;Sk;0;ON;;;;;N;;;;; 1F3FD;EMOJI MODIFIER FITZPATRICK TYPE-4;Sk;0;ON;;;;;N;;;;; 1F3FE;EMOJI MODIFIER FITZPATRICK TYPE-5;Sk;0;ON;;;;;N;;;;; 1F3FF;EMOJI MODIFIER FITZPATRICK TYPE-6;Sk;0;ON;;;;;N;;;;; 1F400;RAT;So;0;ON;;;;;N;;;;; 1F401;MOUSE;So;0;ON;;;;;N;;;;; 1F402;OX;So;0;ON;;;;;N;;;;; 1F403;WATER BUFFALO;So;0;ON;;;;;N;;;;; 1F404;COW;So;0;ON;;;;;N;;;;; 1F405;TIGER;So;0;ON;;;;;N;;;;; 1F406;LEOPARD;So;0;ON;;;;;N;;;;; 1F407;RABBIT;So;0;ON;;;;;N;;;;; 1F408;CAT;So;0;ON;;;;;N;;;;; 1F409;DRAGON;So;0;ON;;;;;N;;;;; 1F40A;CROCODILE;So;0;ON;;;;;N;;;;; 1F40B;WHALE;So;0;ON;;;;;N;;;;; 1F40C;SNAIL;So;0;ON;;;;;N;;;;; 1F40D;SNAKE;So;0;ON;;;;;N;;;;; 1F40E;HORSE;So;0;ON;;;;;N;;;;; 1F40F;RAM;So;0;ON;;;;;N;;;;; 1F410;GOAT;So;0;ON;;;;;N;;;;; 1F411;SHEEP;So;0;ON;;;;;N;;;;; 1F412;MONKEY;So;0;ON;;;;;N;;;;; 1F413;ROOSTER;So;0;ON;;;;;N;;;;; 1F414;CHICKEN;So;0;ON;;;;;N;;;;; 1F415;DOG;So;0;ON;;;;;N;;;;; 1F416;PIG;So;0;ON;;;;;N;;;;; 1F417;BOAR;So;0;ON;;;;;N;;;;; 1F418;ELEPHANT;So;0;ON;;;;;N;;;;; 1F419;OCTOPUS;So;0;ON;;;;;N;;;;; 1F41A;SPIRAL SHELL;So;0;ON;;;;;N;;;;; 1F41B;BUG;So;0;ON;;;;;N;;;;; 1F41C;ANT;So;0;ON;;;;;N;;;;; 1F41D;HONEYBEE;So;0;ON;;;;;N;;;;; 1F41E;LADY BEETLE;So;0;ON;;;;;N;;;;; 1F41F;FISH;So;0;ON;;;;;N;;;;; 1F420;TROPICAL FISH;So;0;ON;;;;;N;;;;; 1F421;BLOWFISH;So;0;ON;;;;;N;;;;; 1F422;TURTLE;So;0;ON;;;;;N;;;;; 1F423;HATCHING CHICK;So;0;ON;;;;;N;;;;; 1F424;BABY CHICK;So;0;ON;;;;;N;;;;; 1F425;FRONT-FACING BABY CHICK;So;0;ON;;;;;N;;;;; 1F426;BIRD;So;0;ON;;;;;N;;;;; 1F427;PENGUIN;So;0;ON;;;;;N;;;;; 1F428;KOALA;So;0;ON;;;;;N;;;;; 1F429;POODLE;So;0;ON;;;;;N;;;;; 1F42A;DROMEDARY CAMEL;So;0;ON;;;;;N;;;;; 1F42B;BACTRIAN CAMEL;So;0;ON;;;;;N;;;;; 1F42C;DOLPHIN;So;0;ON;;;;;N;;;;; 1F42D;MOUSE FACE;So;0;ON;;;;;N;;;;; 1F42E;COW FACE;So;0;ON;;;;;N;;;;; 1F42F;TIGER FACE;So;0;ON;;;;;N;;;;; 1F430;RABBIT FACE;So;0;ON;;;;;N;;;;; 1F431;CAT FACE;So;0;ON;;;;;N;;;;; 1F432;DRAGON FACE;So;0;ON;;;;;N;;;;; 1F433;SPOUTING WHALE;So;0;ON;;;;;N;;;;; 1F434;HORSE FACE;So;0;ON;;;;;N;;;;; 1F435;MONKEY FACE;So;0;ON;;;;;N;;;;; 1F436;DOG FACE;So;0;ON;;;;;N;;;;; 1F437;PIG FACE;So;0;ON;;;;;N;;;;; 1F438;FROG FACE;So;0;ON;;;;;N;;;;; 1F439;HAMSTER FACE;So;0;ON;;;;;N;;;;; 1F43A;WOLF FACE;So;0;ON;;;;;N;;;;; 1F43B;BEAR FACE;So;0;ON;;;;;N;;;;; 1F43C;PANDA FACE;So;0;ON;;;;;N;;;;; 1F43D;PIG NOSE;So;0;ON;;;;;N;;;;; 1F43E;PAW PRINTS;So;0;ON;;;;;N;;;;; 1F43F;CHIPMUNK;So;0;ON;;;;;N;;;;; 1F440;EYES;So;0;ON;;;;;N;;;;; 1F441;EYE;So;0;ON;;;;;N;;;;; 1F442;EAR;So;0;ON;;;;;N;;;;; 1F443;NOSE;So;0;ON;;;;;N;;;;; 1F444;MOUTH;So;0;ON;;;;;N;;;;; 1F445;TONGUE;So;0;ON;;;;;N;;;;; 1F446;WHITE UP POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; 1F447;WHITE DOWN POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; 1F448;WHITE LEFT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; 1F449;WHITE RIGHT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; 1F44A;FISTED HAND SIGN;So;0;ON;;;;;N;;;;; 1F44B;WAVING HAND SIGN;So;0;ON;;;;;N;;;;; 1F44C;OK HAND SIGN;So;0;ON;;;;;N;;;;; 1F44D;THUMBS UP SIGN;So;0;ON;;;;;N;;;;; 1F44E;THUMBS DOWN SIGN;So;0;ON;;;;;N;;;;; 1F44F;CLAPPING HANDS SIGN;So;0;ON;;;;;N;;;;; 1F450;OPEN HANDS SIGN;So;0;ON;;;;;N;;;;; 1F451;CROWN;So;0;ON;;;;;N;;;;; 1F452;WOMANS HAT;So;0;ON;;;;;N;;;;; 1F453;EYEGLASSES;So;0;ON;;;;;N;;;;; 1F454;NECKTIE;So;0;ON;;;;;N;;;;; 1F455;T-SHIRT;So;0;ON;;;;;N;;;;; 1F456;JEANS;So;0;ON;;;;;N;;;;; 1F457;DRESS;So;0;ON;;;;;N;;;;; 1F458;KIMONO;So;0;ON;;;;;N;;;;; 1F459;BIKINI;So;0;ON;;;;;N;;;;; 1F45A;WOMANS CLOTHES;So;0;ON;;;;;N;;;;; 1F45B;PURSE;So;0;ON;;;;;N;;;;; 1F45C;HANDBAG;So;0;ON;;;;;N;;;;; 1F45D;POUCH;So;0;ON;;;;;N;;;;; 1F45E;MANS SHOE;So;0;ON;;;;;N;;;;; 1F45F;ATHLETIC SHOE;So;0;ON;;;;;N;;;;; 1F460;HIGH-HEELED SHOE;So;0;ON;;;;;N;;;;; 1F461;WOMANS SANDAL;So;0;ON;;;;;N;;;;; 1F462;WOMANS BOOTS;So;0;ON;;;;;N;;;;; 1F463;FOOTPRINTS;So;0;ON;;;;;N;;;;; 1F464;BUST IN SILHOUETTE;So;0;ON;;;;;N;;;;; 1F465;BUSTS IN SILHOUETTE;So;0;ON;;;;;N;;;;; 1F466;BOY;So;0;ON;;;;;N;;;;; 1F467;GIRL;So;0;ON;;;;;N;;;;; 1F468;MAN;So;0;ON;;;;;N;;;;; 1F469;WOMAN;So;0;ON;;;;;N;;;;; 1F46A;FAMILY;So;0;ON;;;;;N;;;;; 1F46B;MAN AND WOMAN HOLDING HANDS;So;0;ON;;;;;N;;;;; 1F46C;TWO MEN HOLDING HANDS;So;0;ON;;;;;N;;;;; 1F46D;TWO WOMEN HOLDING HANDS;So;0;ON;;;;;N;;;;; 1F46E;POLICE OFFICER;So;0;ON;;;;;N;;;;; 1F46F;WOMAN WITH BUNNY EARS;So;0;ON;;;;;N;;;;; 1F470;BRIDE WITH VEIL;So;0;ON;;;;;N;;;;; 1F471;PERSON WITH BLOND HAIR;So;0;ON;;;;;N;;;;; 1F472;MAN WITH GUA PI MAO;So;0;ON;;;;;N;;;;; 1F473;MAN WITH TURBAN;So;0;ON;;;;;N;;;;; 1F474;OLDER MAN;So;0;ON;;;;;N;;;;; 1F475;OLDER WOMAN;So;0;ON;;;;;N;;;;; 1F476;BABY;So;0;ON;;;;;N;;;;; 1F477;CONSTRUCTION WORKER;So;0;ON;;;;;N;;;;; 1F478;PRINCESS;So;0;ON;;;;;N;;;;; 1F479;JAPANESE OGRE;So;0;ON;;;;;N;;;;; 1F47A;JAPANESE GOBLIN;So;0;ON;;;;;N;;;;; 1F47B;GHOST;So;0;ON;;;;;N;;;;; 1F47C;BABY ANGEL;So;0;ON;;;;;N;;;;; 1F47D;EXTRATERRESTRIAL ALIEN;So;0;ON;;;;;N;;;;; 1F47E;ALIEN MONSTER;So;0;ON;;;;;N;;;;; 1F47F;IMP;So;0;ON;;;;;N;;;;; 1F480;SKULL;So;0;ON;;;;;N;;;;; 1F481;INFORMATION DESK PERSON;So;0;ON;;;;;N;;;;; 1F482;GUARDSMAN;So;0;ON;;;;;N;;;;; 1F483;DANCER;So;0;ON;;;;;N;;;;; 1F484;LIPSTICK;So;0;ON;;;;;N;;;;; 1F485;NAIL POLISH;So;0;ON;;;;;N;;;;; 1F486;FACE MASSAGE;So;0;ON;;;;;N;;;;; 1F487;HAIRCUT;So;0;ON;;;;;N;;;;; 1F488;BARBER POLE;So;0;ON;;;;;N;;;;; 1F489;SYRINGE;So;0;ON;;;;;N;;;;; 1F48A;PILL;So;0;ON;;;;;N;;;;; 1F48B;KISS MARK;So;0;ON;;;;;N;;;;; 1F48C;LOVE LETTER;So;0;ON;;;;;N;;;;; 1F48D;RING;So;0;ON;;;;;N;;;;; 1F48E;GEM STONE;So;0;ON;;;;;N;;;;; 1F48F;KISS;So;0;ON;;;;;N;;;;; 1F490;BOUQUET;So;0;ON;;;;;N;;;;; 1F491;COUPLE WITH HEART;So;0;ON;;;;;N;;;;; 1F492;WEDDING;So;0;ON;;;;;N;;;;; 1F493;BEATING HEART;So;0;ON;;;;;N;;;;; 1F494;BROKEN HEART;So;0;ON;;;;;N;;;;; 1F495;TWO HEARTS;So;0;ON;;;;;N;;;;; 1F496;SPARKLING HEART;So;0;ON;;;;;N;;;;; 1F497;GROWING HEART;So;0;ON;;;;;N;;;;; 1F498;HEART WITH ARROW;So;0;ON;;;;;N;;;;; 1F499;BLUE HEART;So;0;ON;;;;;N;;;;; 1F49A;GREEN HEART;So;0;ON;;;;;N;;;;; 1F49B;YELLOW HEART;So;0;ON;;;;;N;;;;; 1F49C;PURPLE HEART;So;0;ON;;;;;N;;;;; 1F49D;HEART WITH RIBBON;So;0;ON;;;;;N;;;;; 1F49E;REVOLVING HEARTS;So;0;ON;;;;;N;;;;; 1F49F;HEART DECORATION;So;0;ON;;;;;N;;;;; 1F4A0;DIAMOND SHAPE WITH A DOT INSIDE;So;0;ON;;;;;N;;;;; 1F4A1;ELECTRIC LIGHT BULB;So;0;ON;;;;;N;;;;; 1F4A2;ANGER SYMBOL;So;0;ON;;;;;N;;;;; 1F4A3;BOMB;So;0;ON;;;;;N;;;;; 1F4A4;SLEEPING SYMBOL;So;0;ON;;;;;N;;;;; 1F4A5;COLLISION SYMBOL;So;0;ON;;;;;N;;;;; 1F4A6;SPLASHING SWEAT SYMBOL;So;0;ON;;;;;N;;;;; 1F4A7;DROPLET;So;0;ON;;;;;N;;;;; 1F4A8;DASH SYMBOL;So;0;ON;;;;;N;;;;; 1F4A9;PILE OF POO;So;0;ON;;;;;N;;;;; 1F4AA;FLEXED BICEPS;So;0;ON;;;;;N;;;;; 1F4AB;DIZZY SYMBOL;So;0;ON;;;;;N;;;;; 1F4AC;SPEECH BALLOON;So;0;ON;;;;;N;;;;; 1F4AD;THOUGHT BALLOON;So;0;ON;;;;;N;;;;; 1F4AE;WHITE FLOWER;So;0;ON;;;;;N;;;;; 1F4AF;HUNDRED POINTS SYMBOL;So;0;ON;;;;;N;;;;; 1F4B0;MONEY BAG;So;0;ON;;;;;N;;;;; 1F4B1;CURRENCY EXCHANGE;So;0;ON;;;;;N;;;;; 1F4B2;HEAVY DOLLAR SIGN;So;0;ON;;;;;N;;;;; 1F4B3;CREDIT CARD;So;0;ON;;;;;N;;;;; 1F4B4;BANKNOTE WITH YEN SIGN;So;0;ON;;;;;N;;;;; 1F4B5;BANKNOTE WITH DOLLAR SIGN;So;0;ON;;;;;N;;;;; 1F4B6;BANKNOTE WITH EURO SIGN;So;0;ON;;;;;N;;;;; 1F4B7;BANKNOTE WITH POUND SIGN;So;0;ON;;;;;N;;;;; 1F4B8;MONEY WITH WINGS;So;0;ON;;;;;N;;;;; 1F4B9;CHART WITH UPWARDS TREND AND YEN SIGN;So;0;ON;;;;;N;;;;; 1F4BA;SEAT;So;0;ON;;;;;N;;;;; 1F4BB;PERSONAL COMPUTER;So;0;ON;;;;;N;;;;; 1F4BC;BRIEFCASE;So;0;ON;;;;;N;;;;; 1F4BD;MINIDISC;So;0;ON;;;;;N;;;;; 1F4BE;FLOPPY DISK;So;0;ON;;;;;N;;;;; 1F4BF;OPTICAL DISC;So;0;ON;;;;;N;;;;; 1F4C0;DVD;So;0;ON;;;;;N;;;;; 1F4C1;FILE FOLDER;So;0;ON;;;;;N;;;;; 1F4C2;OPEN FILE FOLDER;So;0;ON;;;;;N;;;;; 1F4C3;PAGE WITH CURL;So;0;ON;;;;;N;;;;; 1F4C4;PAGE FACING UP;So;0;ON;;;;;N;;;;; 1F4C5;CALENDAR;So;0;ON;;;;;N;;;;; 1F4C6;TEAR-OFF CALENDAR;So;0;ON;;;;;N;;;;; 1F4C7;CARD INDEX;So;0;ON;;;;;N;;;;; 1F4C8;CHART WITH UPWARDS TREND;So;0;ON;;;;;N;;;;; 1F4C9;CHART WITH DOWNWARDS TREND;So;0;ON;;;;;N;;;;; 1F4CA;BAR CHART;So;0;ON;;;;;N;;;;; 1F4CB;CLIPBOARD;So;0;ON;;;;;N;;;;; 1F4CC;PUSHPIN;So;0;ON;;;;;N;;;;; 1F4CD;ROUND PUSHPIN;So;0;ON;;;;;N;;;;; 1F4CE;PAPERCLIP;So;0;ON;;;;;N;;;;; 1F4CF;STRAIGHT RULER;So;0;ON;;;;;N;;;;; 1F4D0;TRIANGULAR RULER;So;0;ON;;;;;N;;;;; 1F4D1;BOOKMARK TABS;So;0;ON;;;;;N;;;;; 1F4D2;LEDGER;So;0;ON;;;;;N;;;;; 1F4D3;NOTEBOOK;So;0;ON;;;;;N;;;;; 1F4D4;NOTEBOOK WITH DECORATIVE COVER;So;0;ON;;;;;N;;;;; 1F4D5;CLOSED BOOK;So;0;ON;;;;;N;;;;; 1F4D6;OPEN BOOK;So;0;ON;;;;;N;;;;; 1F4D7;GREEN BOOK;So;0;ON;;;;;N;;;;; 1F4D8;BLUE BOOK;So;0;ON;;;;;N;;;;; 1F4D9;ORANGE BOOK;So;0;ON;;;;;N;;;;; 1F4DA;BOOKS;So;0;ON;;;;;N;;;;; 1F4DB;NAME BADGE;So;0;ON;;;;;N;;;;; 1F4DC;SCROLL;So;0;ON;;;;;N;;;;; 1F4DD;MEMO;So;0;ON;;;;;N;;;;; 1F4DE;TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; 1F4DF;PAGER;So;0;ON;;;;;N;;;;; 1F4E0;FAX MACHINE;So;0;ON;;;;;N;;;;; 1F4E1;SATELLITE ANTENNA;So;0;ON;;;;;N;;;;; 1F4E2;PUBLIC ADDRESS LOUDSPEAKER;So;0;ON;;;;;N;;;;; 1F4E3;CHEERING MEGAPHONE;So;0;ON;;;;;N;;;;; 1F4E4;OUTBOX TRAY;So;0;ON;;;;;N;;;;; 1F4E5;INBOX TRAY;So;0;ON;;;;;N;;;;; 1F4E6;PACKAGE;So;0;ON;;;;;N;;;;; 1F4E7;E-MAIL SYMBOL;So;0;ON;;;;;N;;;;; 1F4E8;INCOMING ENVELOPE;So;0;ON;;;;;N;;;;; 1F4E9;ENVELOPE WITH DOWNWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; 1F4EA;CLOSED MAILBOX WITH LOWERED FLAG;So;0;ON;;;;;N;;;;; 1F4EB;CLOSED MAILBOX WITH RAISED FLAG;So;0;ON;;;;;N;;;;; 1F4EC;OPEN MAILBOX WITH RAISED FLAG;So;0;ON;;;;;N;;;;; 1F4ED;OPEN MAILBOX WITH LOWERED FLAG;So;0;ON;;;;;N;;;;; 1F4EE;POSTBOX;So;0;ON;;;;;N;;;;; 1F4EF;POSTAL HORN;So;0;ON;;;;;N;;;;; 1F4F0;NEWSPAPER;So;0;ON;;;;;N;;;;; 1F4F1;MOBILE PHONE;So;0;ON;;;;;N;;;;; 1F4F2;MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT;So;0;ON;;;;;N;;;;; 1F4F3;VIBRATION MODE;So;0;ON;;;;;N;;;;; 1F4F4;MOBILE PHONE OFF;So;0;ON;;;;;N;;;;; 1F4F5;NO MOBILE PHONES;So;0;ON;;;;;N;;;;; 1F4F6;ANTENNA WITH BARS;So;0;ON;;;;;N;;;;; 1F4F7;CAMERA;So;0;ON;;;;;N;;;;; 1F4F8;CAMERA WITH FLASH;So;0;ON;;;;;N;;;;; 1F4F9;VIDEO CAMERA;So;0;ON;;;;;N;;;;; 1F4FA;TELEVISION;So;0;ON;;;;;N;;;;; 1F4FB;RADIO;So;0;ON;;;;;N;;;;; 1F4FC;VIDEOCASSETTE;So;0;ON;;;;;N;;;;; 1F4FD;FILM PROJECTOR;So;0;ON;;;;;N;;;;; 1F4FE;PORTABLE STEREO;So;0;ON;;;;;N;;;;; 1F4FF;PRAYER BEADS;So;0;ON;;;;;N;;;;; 1F500;TWISTED RIGHTWARDS ARROWS;So;0;ON;;;;;N;;;;; 1F501;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; 1F502;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY;So;0;ON;;;;;N;;;;; 1F503;CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; 1F504;ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; 1F505;LOW BRIGHTNESS SYMBOL;So;0;ON;;;;;N;;;;; 1F506;HIGH BRIGHTNESS SYMBOL;So;0;ON;;;;;N;;;;; 1F507;SPEAKER WITH CANCELLATION STROKE;So;0;ON;;;;;N;;;;; 1F508;SPEAKER;So;0;ON;;;;;N;;;;; 1F509;SPEAKER WITH ONE SOUND WAVE;So;0;ON;;;;;N;;;;; 1F50A;SPEAKER WITH THREE SOUND WAVES;So;0;ON;;;;;N;;;;; 1F50B;BATTERY;So;0;ON;;;;;N;;;;; 1F50C;ELECTRIC PLUG;So;0;ON;;;;;N;;;;; 1F50D;LEFT-POINTING MAGNIFYING GLASS;So;0;ON;;;;;N;;;;; 1F50E;RIGHT-POINTING MAGNIFYING GLASS;So;0;ON;;;;;N;;;;; 1F50F;LOCK WITH INK PEN;So;0;ON;;;;;N;;;;; 1F510;CLOSED LOCK WITH KEY;So;0;ON;;;;;N;;;;; 1F511;KEY;So;0;ON;;;;;N;;;;; 1F512;LOCK;So;0;ON;;;;;N;;;;; 1F513;OPEN LOCK;So;0;ON;;;;;N;;;;; 1F514;BELL;So;0;ON;;;;;N;;;;; 1F515;BELL WITH CANCELLATION STROKE;So;0;ON;;;;;N;;;;; 1F516;BOOKMARK;So;0;ON;;;;;N;;;;; 1F517;LINK SYMBOL;So;0;ON;;;;;N;;;;; 1F518;RADIO BUTTON;So;0;ON;;;;;N;;;;; 1F519;BACK WITH LEFTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; 1F51A;END WITH LEFTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; 1F51B;ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE;So;0;ON;;;;;N;;;;; 1F51C;SOON WITH RIGHTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; 1F51D;TOP WITH UPWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; 1F51E;NO ONE UNDER EIGHTEEN SYMBOL;So;0;ON;;;;;N;;;;; 1F51F;KEYCAP TEN;So;0;ON;;;;;N;;;;; 1F520;INPUT SYMBOL FOR LATIN CAPITAL LETTERS;So;0;ON;;;;;N;;;;; 1F521;INPUT SYMBOL FOR LATIN SMALL LETTERS;So;0;ON;;;;;N;;;;; 1F522;INPUT SYMBOL FOR NUMBERS;So;0;ON;;;;;N;;;;; 1F523;INPUT SYMBOL FOR SYMBOLS;So;0;ON;;;;;N;;;;; 1F524;INPUT SYMBOL FOR LATIN LETTERS;So;0;ON;;;;;N;;;;; 1F525;FIRE;So;0;ON;;;;;N;;;;; 1F526;ELECTRIC TORCH;So;0;ON;;;;;N;;;;; 1F527;WRENCH;So;0;ON;;;;;N;;;;; 1F528;HAMMER;So;0;ON;;;;;N;;;;; 1F529;NUT AND BOLT;So;0;ON;;;;;N;;;;; 1F52A;HOCHO;So;0;ON;;;;;N;;;;; 1F52B;PISTOL;So;0;ON;;;;;N;;;;; 1F52C;MICROSCOPE;So;0;ON;;;;;N;;;;; 1F52D;TELESCOPE;So;0;ON;;;;;N;;;;; 1F52E;CRYSTAL BALL;So;0;ON;;;;;N;;;;; 1F52F;SIX POINTED STAR WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; 1F530;JAPANESE SYMBOL FOR BEGINNER;So;0;ON;;;;;N;;;;; 1F531;TRIDENT EMBLEM;So;0;ON;;;;;N;;;;; 1F532;BLACK SQUARE BUTTON;So;0;ON;;;;;N;;;;; 1F533;WHITE SQUARE BUTTON;So;0;ON;;;;;N;;;;; 1F534;LARGE RED CIRCLE;So;0;ON;;;;;N;;;;; 1F535;LARGE BLUE CIRCLE;So;0;ON;;;;;N;;;;; 1F536;LARGE ORANGE DIAMOND;So;0;ON;;;;;N;;;;; 1F537;LARGE BLUE DIAMOND;So;0;ON;;;;;N;;;;; 1F538;SMALL ORANGE DIAMOND;So;0;ON;;;;;N;;;;; 1F539;SMALL BLUE DIAMOND;So;0;ON;;;;;N;;;;; 1F53A;UP-POINTING RED TRIANGLE;So;0;ON;;;;;N;;;;; 1F53B;DOWN-POINTING RED TRIANGLE;So;0;ON;;;;;N;;;;; 1F53C;UP-POINTING SMALL RED TRIANGLE;So;0;ON;;;;;N;;;;; 1F53D;DOWN-POINTING SMALL RED TRIANGLE;So;0;ON;;;;;N;;;;; 1F53E;LOWER RIGHT SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; 1F53F;UPPER RIGHT SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; 1F540;CIRCLED CROSS POMMEE;So;0;ON;;;;;N;;;;; 1F541;CROSS POMMEE WITH HALF-CIRCLE BELOW;So;0;ON;;;;;N;;;;; 1F542;CROSS POMMEE;So;0;ON;;;;;N;;;;; 1F543;NOTCHED LEFT SEMICIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; 1F544;NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; 1F545;SYMBOL FOR MARKS CHAPTER;So;0;ON;;;;;N;;;;; 1F546;WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; 1F547;HEAVY LATIN CROSS;So;0;ON;;;;;N;;;;; 1F548;CELTIC CROSS;So;0;ON;;;;;N;;;;; 1F549;OM SYMBOL;So;0;ON;;;;;N;;;;; 1F54A;DOVE OF PEACE;So;0;ON;;;;;N;;;;; 1F54B;KAABA;So;0;ON;;;;;N;;;;; 1F54C;MOSQUE;So;0;ON;;;;;N;;;;; 1F54D;SYNAGOGUE;So;0;ON;;;;;N;;;;; 1F54E;MENORAH WITH NINE BRANCHES;So;0;ON;;;;;N;;;;; 1F54F;BOWL OF HYGIEIA;So;0;ON;;;;;N;;;;; 1F550;CLOCK FACE ONE OCLOCK;So;0;ON;;;;;N;;;;; 1F551;CLOCK FACE TWO OCLOCK;So;0;ON;;;;;N;;;;; 1F552;CLOCK FACE THREE OCLOCK;So;0;ON;;;;;N;;;;; 1F553;CLOCK FACE FOUR OCLOCK;So;0;ON;;;;;N;;;;; 1F554;CLOCK FACE FIVE OCLOCK;So;0;ON;;;;;N;;;;; 1F555;CLOCK FACE SIX OCLOCK;So;0;ON;;;;;N;;;;; 1F556;CLOCK FACE SEVEN OCLOCK;So;0;ON;;;;;N;;;;; 1F557;CLOCK FACE EIGHT OCLOCK;So;0;ON;;;;;N;;;;; 1F558;CLOCK FACE NINE OCLOCK;So;0;ON;;;;;N;;;;; 1F559;CLOCK FACE TEN OCLOCK;So;0;ON;;;;;N;;;;; 1F55A;CLOCK FACE ELEVEN OCLOCK;So;0;ON;;;;;N;;;;; 1F55B;CLOCK FACE TWELVE OCLOCK;So;0;ON;;;;;N;;;;; 1F55C;CLOCK FACE ONE-THIRTY;So;0;ON;;;;;N;;;;; 1F55D;CLOCK FACE TWO-THIRTY;So;0;ON;;;;;N;;;;; 1F55E;CLOCK FACE THREE-THIRTY;So;0;ON;;;;;N;;;;; 1F55F;CLOCK FACE FOUR-THIRTY;So;0;ON;;;;;N;;;;; 1F560;CLOCK FACE FIVE-THIRTY;So;0;ON;;;;;N;;;;; 1F561;CLOCK FACE SIX-THIRTY;So;0;ON;;;;;N;;;;; 1F562;CLOCK FACE SEVEN-THIRTY;So;0;ON;;;;;N;;;;; 1F563;CLOCK FACE EIGHT-THIRTY;So;0;ON;;;;;N;;;;; 1F564;CLOCK FACE NINE-THIRTY;So;0;ON;;;;;N;;;;; 1F565;CLOCK FACE TEN-THIRTY;So;0;ON;;;;;N;;;;; 1F566;CLOCK FACE ELEVEN-THIRTY;So;0;ON;;;;;N;;;;; 1F567;CLOCK FACE TWELVE-THIRTY;So;0;ON;;;;;N;;;;; 1F568;RIGHT SPEAKER;So;0;ON;;;;;N;;;;; 1F569;RIGHT SPEAKER WITH ONE SOUND WAVE;So;0;ON;;;;;N;;;;; 1F56A;RIGHT SPEAKER WITH THREE SOUND WAVES;So;0;ON;;;;;N;;;;; 1F56B;BULLHORN;So;0;ON;;;;;N;;;;; 1F56C;BULLHORN WITH SOUND WAVES;So;0;ON;;;;;N;;;;; 1F56D;RINGING BELL;So;0;ON;;;;;N;;;;; 1F56E;BOOK;So;0;ON;;;;;N;;;;; 1F56F;CANDLE;So;0;ON;;;;;N;;;;; 1F570;MANTELPIECE CLOCK;So;0;ON;;;;;N;;;;; 1F571;BLACK SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; 1F572;NO PIRACY;So;0;ON;;;;;N;;;;; 1F573;HOLE;So;0;ON;;;;;N;;;;; 1F574;MAN IN BUSINESS SUIT LEVITATING;So;0;ON;;;;;N;;;;; 1F575;SLEUTH OR SPY;So;0;ON;;;;;N;;;;; 1F576;DARK SUNGLASSES;So;0;ON;;;;;N;;;;; 1F577;SPIDER;So;0;ON;;;;;N;;;;; 1F578;SPIDER WEB;So;0;ON;;;;;N;;;;; 1F579;JOYSTICK;So;0;ON;;;;;N;;;;; 1F57A;MAN DANCING;So;0;ON;;;;;N;;;;; 1F57B;LEFT HAND TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; 1F57C;TELEPHONE RECEIVER WITH PAGE;So;0;ON;;;;;N;;;;; 1F57D;RIGHT HAND TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; 1F57E;WHITE TOUCHTONE TELEPHONE;So;0;ON;;;;;N;;;;; 1F57F;BLACK TOUCHTONE TELEPHONE;So;0;ON;;;;;N;;;;; 1F580;TELEPHONE ON TOP OF MODEM;So;0;ON;;;;;N;;;;; 1F581;CLAMSHELL MOBILE PHONE;So;0;ON;;;;;N;;;;; 1F582;BACK OF ENVELOPE;So;0;ON;;;;;N;;;;; 1F583;STAMPED ENVELOPE;So;0;ON;;;;;N;;;;; 1F584;ENVELOPE WITH LIGHTNING;So;0;ON;;;;;N;;;;; 1F585;FLYING ENVELOPE;So;0;ON;;;;;N;;;;; 1F586;PEN OVER STAMPED ENVELOPE;So;0;ON;;;;;N;;;;; 1F587;LINKED PAPERCLIPS;So;0;ON;;;;;N;;;;; 1F588;BLACK PUSHPIN;So;0;ON;;;;;N;;;;; 1F589;LOWER LEFT PENCIL;So;0;ON;;;;;N;;;;; 1F58A;LOWER LEFT BALLPOINT PEN;So;0;ON;;;;;N;;;;; 1F58B;LOWER LEFT FOUNTAIN PEN;So;0;ON;;;;;N;;;;; 1F58C;LOWER LEFT PAINTBRUSH;So;0;ON;;;;;N;;;;; 1F58D;LOWER LEFT CRAYON;So;0;ON;;;;;N;;;;; 1F58E;LEFT WRITING HAND;So;0;ON;;;;;N;;;;; 1F58F;TURNED OK HAND SIGN;So;0;ON;;;;;N;;;;; 1F590;RAISED HAND WITH FINGERS SPLAYED;So;0;ON;;;;;N;;;;; 1F591;REVERSED RAISED HAND WITH FINGERS SPLAYED;So;0;ON;;;;;N;;;;; 1F592;REVERSED THUMBS UP SIGN;So;0;ON;;;;;N;;;;; 1F593;REVERSED THUMBS DOWN SIGN;So;0;ON;;;;;N;;;;; 1F594;REVERSED VICTORY HAND;So;0;ON;;;;;N;;;;; 1F595;REVERSED HAND WITH MIDDLE FINGER EXTENDED;So;0;ON;;;;;N;;;;; 1F596;RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS;So;0;ON;;;;;N;;;;; 1F597;WHITE DOWN POINTING LEFT HAND INDEX;So;0;ON;;;;;N;;;;; 1F598;SIDEWAYS WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; 1F599;SIDEWAYS WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; 1F59A;SIDEWAYS BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; 1F59B;SIDEWAYS BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; 1F59C;BLACK LEFT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; 1F59D;BLACK RIGHT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; 1F59E;SIDEWAYS WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; 1F59F;SIDEWAYS WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; 1F5A0;SIDEWAYS BLACK UP POINTING INDEX;So;0;ON;;;;;N;;;;; 1F5A1;SIDEWAYS BLACK DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; 1F5A2;BLACK UP POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; 1F5A3;BLACK DOWN POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; 1F5A4;BLACK HEART;So;0;ON;;;;;N;;;;; 1F5A5;DESKTOP COMPUTER;So;0;ON;;;;;N;;;;; 1F5A6;KEYBOARD AND MOUSE;So;0;ON;;;;;N;;;;; 1F5A7;THREE NETWORKED COMPUTERS;So;0;ON;;;;;N;;;;; 1F5A8;PRINTER;So;0;ON;;;;;N;;;;; 1F5A9;POCKET CALCULATOR;So;0;ON;;;;;N;;;;; 1F5AA;BLACK HARD SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; 1F5AB;WHITE HARD SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; 1F5AC;SOFT SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; 1F5AD;TAPE CARTRIDGE;So;0;ON;;;;;N;;;;; 1F5AE;WIRED KEYBOARD;So;0;ON;;;;;N;;;;; 1F5AF;ONE BUTTON MOUSE;So;0;ON;;;;;N;;;;; 1F5B0;TWO BUTTON MOUSE;So;0;ON;;;;;N;;;;; 1F5B1;THREE BUTTON MOUSE;So;0;ON;;;;;N;;;;; 1F5B2;TRACKBALL;So;0;ON;;;;;N;;;;; 1F5B3;OLD PERSONAL COMPUTER;So;0;ON;;;;;N;;;;; 1F5B4;HARD DISK;So;0;ON;;;;;N;;;;; 1F5B5;SCREEN;So;0;ON;;;;;N;;;;; 1F5B6;PRINTER ICON;So;0;ON;;;;;N;;;;; 1F5B7;FAX ICON;So;0;ON;;;;;N;;;;; 1F5B8;OPTICAL DISC ICON;So;0;ON;;;;;N;;;;; 1F5B9;DOCUMENT WITH TEXT;So;0;ON;;;;;N;;;;; 1F5BA;DOCUMENT WITH TEXT AND PICTURE;So;0;ON;;;;;N;;;;; 1F5BB;DOCUMENT WITH PICTURE;So;0;ON;;;;;N;;;;; 1F5BC;FRAME WITH PICTURE;So;0;ON;;;;;N;;;;; 1F5BD;FRAME WITH TILES;So;0;ON;;;;;N;;;;; 1F5BE;FRAME WITH AN X;So;0;ON;;;;;N;;;;; 1F5BF;BLACK FOLDER;So;0;ON;;;;;N;;;;; 1F5C0;FOLDER;So;0;ON;;;;;N;;;;; 1F5C1;OPEN FOLDER;So;0;ON;;;;;N;;;;; 1F5C2;CARD INDEX DIVIDERS;So;0;ON;;;;;N;;;;; 1F5C3;CARD FILE BOX;So;0;ON;;;;;N;;;;; 1F5C4;FILE CABINET;So;0;ON;;;;;N;;;;; 1F5C5;EMPTY NOTE;So;0;ON;;;;;N;;;;; 1F5C6;EMPTY NOTE PAGE;So;0;ON;;;;;N;;;;; 1F5C7;EMPTY NOTE PAD;So;0;ON;;;;;N;;;;; 1F5C8;NOTE;So;0;ON;;;;;N;;;;; 1F5C9;NOTE PAGE;So;0;ON;;;;;N;;;;; 1F5CA;NOTE PAD;So;0;ON;;;;;N;;;;; 1F5CB;EMPTY DOCUMENT;So;0;ON;;;;;N;;;;; 1F5CC;EMPTY PAGE;So;0;ON;;;;;N;;;;; 1F5CD;EMPTY PAGES;So;0;ON;;;;;N;;;;; 1F5CE;DOCUMENT;So;0;ON;;;;;N;;;;; 1F5CF;PAGE;So;0;ON;;;;;N;;;;; 1F5D0;PAGES;So;0;ON;;;;;N;;;;; 1F5D1;WASTEBASKET;So;0;ON;;;;;N;;;;; 1F5D2;SPIRAL NOTE PAD;So;0;ON;;;;;N;;;;; 1F5D3;SPIRAL CALENDAR PAD;So;0;ON;;;;;N;;;;; 1F5D4;DESKTOP WINDOW;So;0;ON;;;;;N;;;;; 1F5D5;MINIMIZE;So;0;ON;;;;;N;;;;; 1F5D6;MAXIMIZE;So;0;ON;;;;;N;;;;; 1F5D7;OVERLAP;So;0;ON;;;;;N;;;;; 1F5D8;CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS;So;0;ON;;;;;N;;;;; 1F5D9;CANCELLATION X;So;0;ON;;;;;N;;;;; 1F5DA;INCREASE FONT SIZE SYMBOL;So;0;ON;;;;;N;;;;; 1F5DB;DECREASE FONT SIZE SYMBOL;So;0;ON;;;;;N;;;;; 1F5DC;COMPRESSION;So;0;ON;;;;;N;;;;; 1F5DD;OLD KEY;So;0;ON;;;;;N;;;;; 1F5DE;ROLLED-UP NEWSPAPER;So;0;ON;;;;;N;;;;; 1F5DF;PAGE WITH CIRCLED TEXT;So;0;ON;;;;;N;;;;; 1F5E0;STOCK CHART;So;0;ON;;;;;N;;;;; 1F5E1;DAGGER KNIFE;So;0;ON;;;;;N;;;;; 1F5E2;LIPS;So;0;ON;;;;;N;;;;; 1F5E3;SPEAKING HEAD IN SILHOUETTE;So;0;ON;;;;;N;;;;; 1F5E4;THREE RAYS ABOVE;So;0;ON;;;;;N;;;;; 1F5E5;THREE RAYS BELOW;So;0;ON;;;;;N;;;;; 1F5E6;THREE RAYS LEFT;So;0;ON;;;;;N;;;;; 1F5E7;THREE RAYS RIGHT;So;0;ON;;;;;N;;;;; 1F5E8;LEFT SPEECH BUBBLE;So;0;ON;;;;;N;;;;; 1F5E9;RIGHT SPEECH BUBBLE;So;0;ON;;;;;N;;;;; 1F5EA;TWO SPEECH BUBBLES;So;0;ON;;;;;N;;;;; 1F5EB;THREE SPEECH BUBBLES;So;0;ON;;;;;N;;;;; 1F5EC;LEFT THOUGHT BUBBLE;So;0;ON;;;;;N;;;;; 1F5ED;RIGHT THOUGHT BUBBLE;So;0;ON;;;;;N;;;;; 1F5EE;LEFT ANGER BUBBLE;So;0;ON;;;;;N;;;;; 1F5EF;RIGHT ANGER BUBBLE;So;0;ON;;;;;N;;;;; 1F5F0;MOOD BUBBLE;So;0;ON;;;;;N;;;;; 1F5F1;LIGHTNING MOOD BUBBLE;So;0;ON;;;;;N;;;;; 1F5F2;LIGHTNING MOOD;So;0;ON;;;;;N;;;;; 1F5F3;BALLOT BOX WITH BALLOT;So;0;ON;;;;;N;;;;; 1F5F4;BALLOT SCRIPT X;So;0;ON;;;;;N;;;;; 1F5F5;BALLOT BOX WITH SCRIPT X;So;0;ON;;;;;N;;;;; 1F5F6;BALLOT BOLD SCRIPT X;So;0;ON;;;;;N;;;;; 1F5F7;BALLOT BOX WITH BOLD SCRIPT X;So;0;ON;;;;;N;;;;; 1F5F8;LIGHT CHECK MARK;So;0;ON;;;;;N;;;;; 1F5F9;BALLOT BOX WITH BOLD CHECK;So;0;ON;;;;;N;;;;; 1F5FA;WORLD MAP;So;0;ON;;;;;N;;;;; 1F5FB;MOUNT FUJI;So;0;ON;;;;;N;;;;; 1F5FC;TOKYO TOWER;So;0;ON;;;;;N;;;;; 1F5FD;STATUE OF LIBERTY;So;0;ON;;;;;N;;;;; 1F5FE;SILHOUETTE OF JAPAN;So;0;ON;;;;;N;;;;; 1F5FF;MOYAI;So;0;ON;;;;;N;;;;; 1F600;GRINNING FACE;So;0;ON;;;;;N;;;;; 1F601;GRINNING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; 1F602;FACE WITH TEARS OF JOY;So;0;ON;;;;;N;;;;; 1F603;SMILING FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; 1F604;SMILING FACE WITH OPEN MOUTH AND SMILING EYES;So;0;ON;;;;;N;;;;; 1F605;SMILING FACE WITH OPEN MOUTH AND COLD SWEAT;So;0;ON;;;;;N;;;;; 1F606;SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES;So;0;ON;;;;;N;;;;; 1F607;SMILING FACE WITH HALO;So;0;ON;;;;;N;;;;; 1F608;SMILING FACE WITH HORNS;So;0;ON;;;;;N;;;;; 1F609;WINKING FACE;So;0;ON;;;;;N;;;;; 1F60A;SMILING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; 1F60B;FACE SAVOURING DELICIOUS FOOD;So;0;ON;;;;;N;;;;; 1F60C;RELIEVED FACE;So;0;ON;;;;;N;;;;; 1F60D;SMILING FACE WITH HEART-SHAPED EYES;So;0;ON;;;;;N;;;;; 1F60E;SMILING FACE WITH SUNGLASSES;So;0;ON;;;;;N;;;;; 1F60F;SMIRKING FACE;So;0;ON;;;;;N;;;;; 1F610;NEUTRAL FACE;So;0;ON;;;;;N;;;;; 1F611;EXPRESSIONLESS FACE;So;0;ON;;;;;N;;;;; 1F612;UNAMUSED FACE;So;0;ON;;;;;N;;;;; 1F613;FACE WITH COLD SWEAT;So;0;ON;;;;;N;;;;; 1F614;PENSIVE FACE;So;0;ON;;;;;N;;;;; 1F615;CONFUSED FACE;So;0;ON;;;;;N;;;;; 1F616;CONFOUNDED FACE;So;0;ON;;;;;N;;;;; 1F617;KISSING FACE;So;0;ON;;;;;N;;;;; 1F618;FACE THROWING A KISS;So;0;ON;;;;;N;;;;; 1F619;KISSING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; 1F61A;KISSING FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;; 1F61B;FACE WITH STUCK-OUT TONGUE;So;0;ON;;;;;N;;;;; 1F61C;FACE WITH STUCK-OUT TONGUE AND WINKING EYE;So;0;ON;;;;;N;;;;; 1F61D;FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES;So;0;ON;;;;;N;;;;; 1F61E;DISAPPOINTED FACE;So;0;ON;;;;;N;;;;; 1F61F;WORRIED FACE;So;0;ON;;;;;N;;;;; 1F620;ANGRY FACE;So;0;ON;;;;;N;;;;; 1F621;POUTING FACE;So;0;ON;;;;;N;;;;; 1F622;CRYING FACE;So;0;ON;;;;;N;;;;; 1F623;PERSEVERING FACE;So;0;ON;;;;;N;;;;; 1F624;FACE WITH LOOK OF TRIUMPH;So;0;ON;;;;;N;;;;; 1F625;DISAPPOINTED BUT RELIEVED FACE;So;0;ON;;;;;N;;;;; 1F626;FROWNING FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; 1F627;ANGUISHED FACE;So;0;ON;;;;;N;;;;; 1F628;FEARFUL FACE;So;0;ON;;;;;N;;;;; 1F629;WEARY FACE;So;0;ON;;;;;N;;;;; 1F62A;SLEEPY FACE;So;0;ON;;;;;N;;;;; 1F62B;TIRED FACE;So;0;ON;;;;;N;;;;; 1F62C;GRIMACING FACE;So;0;ON;;;;;N;;;;; 1F62D;LOUDLY CRYING FACE;So;0;ON;;;;;N;;;;; 1F62E;FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; 1F62F;HUSHED FACE;So;0;ON;;;;;N;;;;; 1F630;FACE WITH OPEN MOUTH AND COLD SWEAT;So;0;ON;;;;;N;;;;; 1F631;FACE SCREAMING IN FEAR;So;0;ON;;;;;N;;;;; 1F632;ASTONISHED FACE;So;0;ON;;;;;N;;;;; 1F633;FLUSHED FACE;So;0;ON;;;;;N;;;;; 1F634;SLEEPING FACE;So;0;ON;;;;;N;;;;; 1F635;DIZZY FACE;So;0;ON;;;;;N;;;;; 1F636;FACE WITHOUT MOUTH;So;0;ON;;;;;N;;;;; 1F637;FACE WITH MEDICAL MASK;So;0;ON;;;;;N;;;;; 1F638;GRINNING CAT FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; 1F639;CAT FACE WITH TEARS OF JOY;So;0;ON;;;;;N;;;;; 1F63A;SMILING CAT FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; 1F63B;SMILING CAT FACE WITH HEART-SHAPED EYES;So;0;ON;;;;;N;;;;; 1F63C;CAT FACE WITH WRY SMILE;So;0;ON;;;;;N;;;;; 1F63D;KISSING CAT FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;; 1F63E;POUTING CAT FACE;So;0;ON;;;;;N;;;;; 1F63F;CRYING CAT FACE;So;0;ON;;;;;N;;;;; 1F640;WEARY CAT FACE;So;0;ON;;;;;N;;;;; 1F641;SLIGHTLY FROWNING FACE;So;0;ON;;;;;N;;;;; 1F642;SLIGHTLY SMILING FACE;So;0;ON;;;;;N;;;;; 1F643;UPSIDE-DOWN FACE;So;0;ON;;;;;N;;;;; 1F644;FACE WITH ROLLING EYES;So;0;ON;;;;;N;;;;; 1F645;FACE WITH NO GOOD GESTURE;So;0;ON;;;;;N;;;;; 1F646;FACE WITH OK GESTURE;So;0;ON;;;;;N;;;;; 1F647;PERSON BOWING DEEPLY;So;0;ON;;;;;N;;;;; 1F648;SEE-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; 1F649;HEAR-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; 1F64A;SPEAK-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; 1F64B;HAPPY PERSON RAISING ONE HAND;So;0;ON;;;;;N;;;;; 1F64C;PERSON RAISING BOTH HANDS IN CELEBRATION;So;0;ON;;;;;N;;;;; 1F64D;PERSON FROWNING;So;0;ON;;;;;N;;;;; 1F64E;PERSON WITH POUTING FACE;So;0;ON;;;;;N;;;;; 1F64F;PERSON WITH FOLDED HANDS;So;0;ON;;;;;N;;;;; 1F650;NORTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; 1F651;SOUTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; 1F652;NORTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; 1F653;SOUTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; 1F654;TURNED NORTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; 1F655;TURNED SOUTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; 1F656;TURNED NORTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; 1F657;TURNED SOUTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; 1F658;NORTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; 1F659;SOUTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; 1F65A;NORTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; 1F65B;SOUTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; 1F65C;HEAVY NORTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; 1F65D;HEAVY SOUTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; 1F65E;HEAVY NORTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; 1F65F;HEAVY SOUTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; 1F660;NORTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; 1F661;SOUTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; 1F662;NORTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; 1F663;SOUTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; 1F664;HEAVY NORTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; 1F665;HEAVY SOUTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; 1F666;HEAVY NORTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; 1F667;HEAVY SOUTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; 1F668;HOLLOW QUILT SQUARE ORNAMENT;So;0;ON;;;;;N;;;;; 1F669;HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE;So;0;ON;;;;;N;;;;; 1F66A;SOLID QUILT SQUARE ORNAMENT;So;0;ON;;;;;N;;;;; 1F66B;SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE;So;0;ON;;;;;N;;;;; 1F66C;LEFTWARDS ROCKET;So;0;ON;;;;;N;;;;; 1F66D;UPWARDS ROCKET;So;0;ON;;;;;N;;;;; 1F66E;RIGHTWARDS ROCKET;So;0;ON;;;;;N;;;;; 1F66F;DOWNWARDS ROCKET;So;0;ON;;;;;N;;;;; 1F670;SCRIPT LIGATURE ET ORNAMENT;So;0;ON;;;;;N;;;;; 1F671;HEAVY SCRIPT LIGATURE ET ORNAMENT;So;0;ON;;;;;N;;;;; 1F672;LIGATURE OPEN ET ORNAMENT;So;0;ON;;;;;N;;;;; 1F673;HEAVY LIGATURE OPEN ET ORNAMENT;So;0;ON;;;;;N;;;;; 1F674;HEAVY AMPERSAND ORNAMENT;So;0;ON;;;;;N;;;;; 1F675;SWASH AMPERSAND ORNAMENT;So;0;ON;;;;;N;;;;; 1F676;SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; 1F677;SANS-SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; 1F678;SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; 1F679;HEAVY INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; 1F67A;SANS-SERIF INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; 1F67B;HEAVY SANS-SERIF INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; 1F67C;VERY HEAVY SOLIDUS;So;0;ON;;;;;N;;;;; 1F67D;VERY HEAVY REVERSE SOLIDUS;So;0;ON;;;;;N;;;;; 1F67E;CHECKER BOARD;So;0;ON;;;;;N;;;;; 1F67F;REVERSE CHECKER BOARD;So;0;ON;;;;;N;;;;; 1F680;ROCKET;So;0;ON;;;;;N;;;;; 1F681;HELICOPTER;So;0;ON;;;;;N;;;;; 1F682;STEAM LOCOMOTIVE;So;0;ON;;;;;N;;;;; 1F683;RAILWAY CAR;So;0;ON;;;;;N;;;;; 1F684;HIGH-SPEED TRAIN;So;0;ON;;;;;N;;;;; 1F685;HIGH-SPEED TRAIN WITH BULLET NOSE;So;0;ON;;;;;N;;;;; 1F686;TRAIN;So;0;ON;;;;;N;;;;; 1F687;METRO;So;0;ON;;;;;N;;;;; 1F688;LIGHT RAIL;So;0;ON;;;;;N;;;;; 1F689;STATION;So;0;ON;;;;;N;;;;; 1F68A;TRAM;So;0;ON;;;;;N;;;;; 1F68B;TRAM CAR;So;0;ON;;;;;N;;;;; 1F68C;BUS;So;0;ON;;;;;N;;;;; 1F68D;ONCOMING BUS;So;0;ON;;;;;N;;;;; 1F68E;TROLLEYBUS;So;0;ON;;;;;N;;;;; 1F68F;BUS STOP;So;0;ON;;;;;N;;;;; 1F690;MINIBUS;So;0;ON;;;;;N;;;;; 1F691;AMBULANCE;So;0;ON;;;;;N;;;;; 1F692;FIRE ENGINE;So;0;ON;;;;;N;;;;; 1F693;POLICE CAR;So;0;ON;;;;;N;;;;; 1F694;ONCOMING POLICE CAR;So;0;ON;;;;;N;;;;; 1F695;TAXI;So;0;ON;;;;;N;;;;; 1F696;ONCOMING TAXI;So;0;ON;;;;;N;;;;; 1F697;AUTOMOBILE;So;0;ON;;;;;N;;;;; 1F698;ONCOMING AUTOMOBILE;So;0;ON;;;;;N;;;;; 1F699;RECREATIONAL VEHICLE;So;0;ON;;;;;N;;;;; 1F69A;DELIVERY TRUCK;So;0;ON;;;;;N;;;;; 1F69B;ARTICULATED LORRY;So;0;ON;;;;;N;;;;; 1F69C;TRACTOR;So;0;ON;;;;;N;;;;; 1F69D;MONORAIL;So;0;ON;;;;;N;;;;; 1F69E;MOUNTAIN RAILWAY;So;0;ON;;;;;N;;;;; 1F69F;SUSPENSION RAILWAY;So;0;ON;;;;;N;;;;; 1F6A0;MOUNTAIN CABLEWAY;So;0;ON;;;;;N;;;;; 1F6A1;AERIAL TRAMWAY;So;0;ON;;;;;N;;;;; 1F6A2;SHIP;So;0;ON;;;;;N;;;;; 1F6A3;ROWBOAT;So;0;ON;;;;;N;;;;; 1F6A4;SPEEDBOAT;So;0;ON;;;;;N;;;;; 1F6A5;HORIZONTAL TRAFFIC LIGHT;So;0;ON;;;;;N;;;;; 1F6A6;VERTICAL TRAFFIC LIGHT;So;0;ON;;;;;N;;;;; 1F6A7;CONSTRUCTION SIGN;So;0;ON;;;;;N;;;;; 1F6A8;POLICE CARS REVOLVING LIGHT;So;0;ON;;;;;N;;;;; 1F6A9;TRIANGULAR FLAG ON POST;So;0;ON;;;;;N;;;;; 1F6AA;DOOR;So;0;ON;;;;;N;;;;; 1F6AB;NO ENTRY SIGN;So;0;ON;;;;;N;;;;; 1F6AC;SMOKING SYMBOL;So;0;ON;;;;;N;;;;; 1F6AD;NO SMOKING SYMBOL;So;0;ON;;;;;N;;;;; 1F6AE;PUT LITTER IN ITS PLACE SYMBOL;So;0;ON;;;;;N;;;;; 1F6AF;DO NOT LITTER SYMBOL;So;0;ON;;;;;N;;;;; 1F6B0;POTABLE WATER SYMBOL;So;0;ON;;;;;N;;;;; 1F6B1;NON-POTABLE WATER SYMBOL;So;0;ON;;;;;N;;;;; 1F6B2;BICYCLE;So;0;ON;;;;;N;;;;; 1F6B3;NO BICYCLES;So;0;ON;;;;;N;;;;; 1F6B4;BICYCLIST;So;0;ON;;;;;N;;;;; 1F6B5;MOUNTAIN BICYCLIST;So;0;ON;;;;;N;;;;; 1F6B6;PEDESTRIAN;So;0;ON;;;;;N;;;;; 1F6B7;NO PEDESTRIANS;So;0;ON;;;;;N;;;;; 1F6B8;CHILDREN CROSSING;So;0;ON;;;;;N;;;;; 1F6B9;MENS SYMBOL;So;0;ON;;;;;N;;;;; 1F6BA;WOMENS SYMBOL;So;0;ON;;;;;N;;;;; 1F6BB;RESTROOM;So;0;ON;;;;;N;;;;; 1F6BC;BABY SYMBOL;So;0;ON;;;;;N;;;;; 1F6BD;TOILET;So;0;ON;;;;;N;;;;; 1F6BE;WATER CLOSET;So;0;ON;;;;;N;;;;; 1F6BF;SHOWER;So;0;ON;;;;;N;;;;; 1F6C0;BATH;So;0;ON;;;;;N;;;;; 1F6C1;BATHTUB;So;0;ON;;;;;N;;;;; 1F6C2;PASSPORT CONTROL;So;0;ON;;;;;N;;;;; 1F6C3;CUSTOMS;So;0;ON;;;;;N;;;;; 1F6C4;BAGGAGE CLAIM;So;0;ON;;;;;N;;;;; 1F6C5;LEFT LUGGAGE;So;0;ON;;;;;N;;;;; 1F6C6;TRIANGLE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; 1F6C7;PROHIBITED SIGN;So;0;ON;;;;;N;;;;; 1F6C8;CIRCLED INFORMATION SOURCE;So;0;ON;;;;;N;;;;; 1F6C9;BOYS SYMBOL;So;0;ON;;;;;N;;;;; 1F6CA;GIRLS SYMBOL;So;0;ON;;;;;N;;;;; 1F6CB;COUCH AND LAMP;So;0;ON;;;;;N;;;;; 1F6CC;SLEEPING ACCOMMODATION;So;0;ON;;;;;N;;;;; 1F6CD;SHOPPING BAGS;So;0;ON;;;;;N;;;;; 1F6CE;BELLHOP BELL;So;0;ON;;;;;N;;;;; 1F6CF;BED;So;0;ON;;;;;N;;;;; 1F6D0;PLACE OF WORSHIP;So;0;ON;;;;;N;;;;; 1F6D1;OCTAGONAL SIGN;So;0;ON;;;;;N;;;;; 1F6D2;SHOPPING TROLLEY;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;;;;; 1F6E3;MOTORWAY;So;0;ON;;;;;N;;;;; 1F6E4;RAILWAY TRACK;So;0;ON;;;;;N;;;;; 1F6E5;MOTOR BOAT;So;0;ON;;;;;N;;;;; 1F6E6;UP-POINTING MILITARY AIRPLANE;So;0;ON;;;;;N;;;;; 1F6E7;UP-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; 1F6E8;UP-POINTING SMALL AIRPLANE;So;0;ON;;;;;N;;;;; 1F6E9;SMALL AIRPLANE;So;0;ON;;;;;N;;;;; 1F6EA;NORTHEAST-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; 1F6EB;AIRPLANE DEPARTURE;So;0;ON;;;;;N;;;;; 1F6EC;AIRPLANE ARRIVING;So;0;ON;;;;;N;;;;; 1F6F0;SATELLITE;So;0;ON;;;;;N;;;;; 1F6F1;ONCOMING FIRE ENGINE;So;0;ON;;;;;N;;;;; 1F6F2;DIESEL LOCOMOTIVE;So;0;ON;;;;;N;;;;; 1F6F3;PASSENGER SHIP;So;0;ON;;;;;N;;;;; 1F6F4;SCOOTER;So;0;ON;;;;;N;;;;; 1F6F5;MOTOR SCOOTER;So;0;ON;;;;;N;;;;; 1F6F6;CANOE;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;;;;; 1F703;ALCHEMICAL SYMBOL FOR EARTH;So;0;ON;;;;;N;;;;; 1F704;ALCHEMICAL SYMBOL FOR WATER;So;0;ON;;;;;N;;;;; 1F705;ALCHEMICAL SYMBOL FOR AQUAFORTIS;So;0;ON;;;;;N;;;;; 1F706;ALCHEMICAL SYMBOL FOR AQUA REGIA;So;0;ON;;;;;N;;;;; 1F707;ALCHEMICAL SYMBOL FOR AQUA REGIA-2;So;0;ON;;;;;N;;;;; 1F708;ALCHEMICAL SYMBOL FOR AQUA VITAE;So;0;ON;;;;;N;;;;; 1F709;ALCHEMICAL SYMBOL FOR AQUA VITAE-2;So;0;ON;;;;;N;;;;; 1F70A;ALCHEMICAL SYMBOL FOR VINEGAR;So;0;ON;;;;;N;;;;; 1F70B;ALCHEMICAL SYMBOL FOR VINEGAR-2;So;0;ON;;;;;N;;;;; 1F70C;ALCHEMICAL SYMBOL FOR VINEGAR-3;So;0;ON;;;;;N;;;;; 1F70D;ALCHEMICAL SYMBOL FOR SULFUR;So;0;ON;;;;;N;;;;; 1F70E;ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR;So;0;ON;;;;;N;;;;; 1F70F;ALCHEMICAL SYMBOL FOR BLACK SULFUR;So;0;ON;;;;;N;;;;; 1F710;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE;So;0;ON;;;;;N;;;;; 1F711;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-2;So;0;ON;;;;;N;;;;; 1F712;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3;So;0;ON;;;;;N;;;;; 1F713;ALCHEMICAL SYMBOL FOR CINNABAR;So;0;ON;;;;;N;;;;; 1F714;ALCHEMICAL SYMBOL FOR SALT;So;0;ON;;;;;N;;;;; 1F715;ALCHEMICAL SYMBOL FOR NITRE;So;0;ON;;;;;N;;;;; 1F716;ALCHEMICAL SYMBOL FOR VITRIOL;So;0;ON;;;;;N;;;;; 1F717;ALCHEMICAL SYMBOL FOR VITRIOL-2;So;0;ON;;;;;N;;;;; 1F718;ALCHEMICAL SYMBOL FOR ROCK SALT;So;0;ON;;;;;N;;;;; 1F719;ALCHEMICAL SYMBOL FOR ROCK SALT-2;So;0;ON;;;;;N;;;;; 1F71A;ALCHEMICAL SYMBOL FOR GOLD;So;0;ON;;;;;N;;;;; 1F71B;ALCHEMICAL SYMBOL FOR SILVER;So;0;ON;;;;;N;;;;; 1F71C;ALCHEMICAL SYMBOL FOR IRON ORE;So;0;ON;;;;;N;;;;; 1F71D;ALCHEMICAL SYMBOL FOR IRON ORE-2;So;0;ON;;;;;N;;;;; 1F71E;ALCHEMICAL SYMBOL FOR CROCUS OF IRON;So;0;ON;;;;;N;;;;; 1F71F;ALCHEMICAL SYMBOL FOR REGULUS OF IRON;So;0;ON;;;;;N;;;;; 1F720;ALCHEMICAL SYMBOL FOR COPPER ORE;So;0;ON;;;;;N;;;;; 1F721;ALCHEMICAL SYMBOL FOR IRON-COPPER ORE;So;0;ON;;;;;N;;;;; 1F722;ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER;So;0;ON;;;;;N;;;;; 1F723;ALCHEMICAL SYMBOL FOR CROCUS OF COPPER;So;0;ON;;;;;N;;;;; 1F724;ALCHEMICAL SYMBOL FOR CROCUS OF COPPER-2;So;0;ON;;;;;N;;;;; 1F725;ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE;So;0;ON;;;;;N;;;;; 1F726;ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE;So;0;ON;;;;;N;;;;; 1F727;ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER;So;0;ON;;;;;N;;;;; 1F728;ALCHEMICAL SYMBOL FOR VERDIGRIS;So;0;ON;;;;;N;;;;; 1F729;ALCHEMICAL SYMBOL FOR TIN ORE;So;0;ON;;;;;N;;;;; 1F72A;ALCHEMICAL SYMBOL FOR LEAD ORE;So;0;ON;;;;;N;;;;; 1F72B;ALCHEMICAL SYMBOL FOR ANTIMONY ORE;So;0;ON;;;;;N;;;;; 1F72C;ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY;So;0;ON;;;;;N;;;;; 1F72D;ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY;So;0;ON;;;;;N;;;;; 1F72E;ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY;So;0;ON;;;;;N;;;;; 1F72F;ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY;So;0;ON;;;;;N;;;;; 1F730;ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY;So;0;ON;;;;;N;;;;; 1F731;ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY-2;So;0;ON;;;;;N;;;;; 1F732;ALCHEMICAL SYMBOL FOR REGULUS;So;0;ON;;;;;N;;;;; 1F733;ALCHEMICAL SYMBOL FOR REGULUS-2;So;0;ON;;;;;N;;;;; 1F734;ALCHEMICAL SYMBOL FOR REGULUS-3;So;0;ON;;;;;N;;;;; 1F735;ALCHEMICAL SYMBOL FOR REGULUS-4;So;0;ON;;;;;N;;;;; 1F736;ALCHEMICAL SYMBOL FOR ALKALI;So;0;ON;;;;;N;;;;; 1F737;ALCHEMICAL SYMBOL FOR ALKALI-2;So;0;ON;;;;;N;;;;; 1F738;ALCHEMICAL SYMBOL FOR MARCASITE;So;0;ON;;;;;N;;;;; 1F739;ALCHEMICAL SYMBOL FOR SAL-AMMONIAC;So;0;ON;;;;;N;;;;; 1F73A;ALCHEMICAL SYMBOL FOR ARSENIC;So;0;ON;;;;;N;;;;; 1F73B;ALCHEMICAL SYMBOL FOR REALGAR;So;0;ON;;;;;N;;;;; 1F73C;ALCHEMICAL SYMBOL FOR REALGAR-2;So;0;ON;;;;;N;;;;; 1F73D;ALCHEMICAL SYMBOL FOR AURIPIGMENT;So;0;ON;;;;;N;;;;; 1F73E;ALCHEMICAL SYMBOL FOR BISMUTH ORE;So;0;ON;;;;;N;;;;; 1F73F;ALCHEMICAL SYMBOL FOR TARTAR;So;0;ON;;;;;N;;;;; 1F740;ALCHEMICAL SYMBOL FOR TARTAR-2;So;0;ON;;;;;N;;;;; 1F741;ALCHEMICAL SYMBOL FOR QUICK LIME;So;0;ON;;;;;N;;;;; 1F742;ALCHEMICAL SYMBOL FOR BORAX;So;0;ON;;;;;N;;;;; 1F743;ALCHEMICAL SYMBOL FOR BORAX-2;So;0;ON;;;;;N;;;;; 1F744;ALCHEMICAL SYMBOL FOR BORAX-3;So;0;ON;;;;;N;;;;; 1F745;ALCHEMICAL SYMBOL FOR ALUM;So;0;ON;;;;;N;;;;; 1F746;ALCHEMICAL SYMBOL FOR OIL;So;0;ON;;;;;N;;;;; 1F747;ALCHEMICAL SYMBOL FOR SPIRIT;So;0;ON;;;;;N;;;;; 1F748;ALCHEMICAL SYMBOL FOR TINCTURE;So;0;ON;;;;;N;;;;; 1F749;ALCHEMICAL SYMBOL FOR GUM;So;0;ON;;;;;N;;;;; 1F74A;ALCHEMICAL SYMBOL FOR WAX;So;0;ON;;;;;N;;;;; 1F74B;ALCHEMICAL SYMBOL FOR POWDER;So;0;ON;;;;;N;;;;; 1F74C;ALCHEMICAL SYMBOL FOR CALX;So;0;ON;;;;;N;;;;; 1F74D;ALCHEMICAL SYMBOL FOR TUTTY;So;0;ON;;;;;N;;;;; 1F74E;ALCHEMICAL SYMBOL FOR CAPUT MORTUUM;So;0;ON;;;;;N;;;;; 1F74F;ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE;So;0;ON;;;;;N;;;;; 1F750;ALCHEMICAL SYMBOL FOR CADUCEUS;So;0;ON;;;;;N;;;;; 1F751;ALCHEMICAL SYMBOL FOR TRIDENT;So;0;ON;;;;;N;;;;; 1F752;ALCHEMICAL SYMBOL FOR STARRED TRIDENT;So;0;ON;;;;;N;;;;; 1F753;ALCHEMICAL SYMBOL FOR LODESTONE;So;0;ON;;;;;N;;;;; 1F754;ALCHEMICAL SYMBOL FOR SOAP;So;0;ON;;;;;N;;;;; 1F755;ALCHEMICAL SYMBOL FOR URINE;So;0;ON;;;;;N;;;;; 1F756;ALCHEMICAL SYMBOL FOR HORSE DUNG;So;0;ON;;;;;N;;;;; 1F757;ALCHEMICAL SYMBOL FOR ASHES;So;0;ON;;;;;N;;;;; 1F758;ALCHEMICAL SYMBOL FOR POT ASHES;So;0;ON;;;;;N;;;;; 1F759;ALCHEMICAL SYMBOL FOR BRICK;So;0;ON;;;;;N;;;;; 1F75A;ALCHEMICAL SYMBOL FOR POWDERED BRICK;So;0;ON;;;;;N;;;;; 1F75B;ALCHEMICAL SYMBOL FOR AMALGAM;So;0;ON;;;;;N;;;;; 1F75C;ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM;So;0;ON;;;;;N;;;;; 1F75D;ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2;So;0;ON;;;;;N;;;;; 1F75E;ALCHEMICAL SYMBOL FOR SUBLIMATION;So;0;ON;;;;;N;;;;; 1F75F;ALCHEMICAL SYMBOL FOR PRECIPITATE;So;0;ON;;;;;N;;;;; 1F760;ALCHEMICAL SYMBOL FOR DISTILL;So;0;ON;;;;;N;;;;; 1F761;ALCHEMICAL SYMBOL FOR DISSOLVE;So;0;ON;;;;;N;;;;; 1F762;ALCHEMICAL SYMBOL FOR DISSOLVE-2;So;0;ON;;;;;N;;;;; 1F763;ALCHEMICAL SYMBOL FOR PURIFY;So;0;ON;;;;;N;;;;; 1F764;ALCHEMICAL SYMBOL FOR PUTREFACTION;So;0;ON;;;;;N;;;;; 1F765;ALCHEMICAL SYMBOL FOR CRUCIBLE;So;0;ON;;;;;N;;;;; 1F766;ALCHEMICAL SYMBOL FOR CRUCIBLE-2;So;0;ON;;;;;N;;;;; 1F767;ALCHEMICAL SYMBOL FOR CRUCIBLE-3;So;0;ON;;;;;N;;;;; 1F768;ALCHEMICAL SYMBOL FOR CRUCIBLE-4;So;0;ON;;;;;N;;;;; 1F769;ALCHEMICAL SYMBOL FOR CRUCIBLE-5;So;0;ON;;;;;N;;;;; 1F76A;ALCHEMICAL SYMBOL FOR ALEMBIC;So;0;ON;;;;;N;;;;; 1F76B;ALCHEMICAL SYMBOL FOR BATH OF MARY;So;0;ON;;;;;N;;;;; 1F76C;ALCHEMICAL SYMBOL FOR BATH OF VAPOURS;So;0;ON;;;;;N;;;;; 1F76D;ALCHEMICAL SYMBOL FOR RETORT;So;0;ON;;;;;N;;;;; 1F76E;ALCHEMICAL SYMBOL FOR HOUR;So;0;ON;;;;;N;;;;; 1F76F;ALCHEMICAL SYMBOL FOR NIGHT;So;0;ON;;;;;N;;;;; 1F770;ALCHEMICAL SYMBOL FOR DAY-NIGHT;So;0;ON;;;;;N;;;;; 1F771;ALCHEMICAL SYMBOL FOR MONTH;So;0;ON;;;;;N;;;;; 1F772;ALCHEMICAL SYMBOL FOR HALF DRAM;So;0;ON;;;;;N;;;;; 1F773;ALCHEMICAL SYMBOL FOR HALF OUNCE;So;0;ON;;;;;N;;;;; 1F780;BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; 1F781;BLACK UP-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; 1F782;BLACK RIGHT-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; 1F783;BLACK DOWN-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; 1F784;BLACK SLIGHTLY SMALL CIRCLE;So;0;ON;;;;;N;;;;; 1F785;MEDIUM BOLD WHITE CIRCLE;So;0;ON;;;;;N;;;;; 1F786;BOLD WHITE CIRCLE;So;0;ON;;;;;N;;;;; 1F787;HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; 1F788;VERY HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; 1F789;EXTREMELY HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; 1F78A;WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE;So;0;ON;;;;;N;;;;; 1F78B;ROUND TARGET;So;0;ON;;;;;N;;;;; 1F78C;BLACK TINY SQUARE;So;0;ON;;;;;N;;;;; 1F78D;BLACK SLIGHTLY SMALL SQUARE;So;0;ON;;;;;N;;;;; 1F78E;LIGHT WHITE SQUARE;So;0;ON;;;;;N;;;;; 1F78F;MEDIUM WHITE SQUARE;So;0;ON;;;;;N;;;;; 1F790;BOLD WHITE SQUARE;So;0;ON;;;;;N;;;;; 1F791;HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; 1F792;VERY HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; 1F793;EXTREMELY HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; 1F794;WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; 1F795;WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE;So;0;ON;;;;;N;;;;; 1F796;SQUARE TARGET;So;0;ON;;;;;N;;;;; 1F797;BLACK TINY DIAMOND;So;0;ON;;;;;N;;;;; 1F798;BLACK VERY SMALL DIAMOND;So;0;ON;;;;;N;;;;; 1F799;BLACK MEDIUM SMALL DIAMOND;So;0;ON;;;;;N;;;;; 1F79A;WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND;So;0;ON;;;;;N;;;;; 1F79B;WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; 1F79C;DIAMOND TARGET;So;0;ON;;;;;N;;;;; 1F79D;BLACK TINY LOZENGE;So;0;ON;;;;;N;;;;; 1F79E;BLACK VERY SMALL LOZENGE;So;0;ON;;;;;N;;;;; 1F79F;BLACK MEDIUM SMALL LOZENGE;So;0;ON;;;;;N;;;;; 1F7A0;WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;; 1F7A1;THIN GREEK CROSS;So;0;ON;;;;;N;;;;; 1F7A2;LIGHT GREEK CROSS;So;0;ON;;;;;N;;;;; 1F7A3;MEDIUM GREEK CROSS;So;0;ON;;;;;N;;;;; 1F7A4;BOLD GREEK CROSS;So;0;ON;;;;;N;;;;; 1F7A5;VERY BOLD GREEK CROSS;So;0;ON;;;;;N;;;;; 1F7A6;VERY HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; 1F7A7;EXTREMELY HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; 1F7A8;THIN SALTIRE;So;0;ON;;;;;N;;;;; 1F7A9;LIGHT SALTIRE;So;0;ON;;;;;N;;;;; 1F7AA;MEDIUM SALTIRE;So;0;ON;;;;;N;;;;; 1F7AB;BOLD SALTIRE;So;0;ON;;;;;N;;;;; 1F7AC;HEAVY SALTIRE;So;0;ON;;;;;N;;;;; 1F7AD;VERY HEAVY SALTIRE;So;0;ON;;;;;N;;;;; 1F7AE;EXTREMELY HEAVY SALTIRE;So;0;ON;;;;;N;;;;; 1F7AF;LIGHT FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 1F7B0;MEDIUM FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 1F7B1;BOLD FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 1F7B2;HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 1F7B3;VERY HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 1F7B4;EXTREMELY HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 1F7B5;LIGHT SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 1F7B6;MEDIUM SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 1F7B7;BOLD SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 1F7B8;HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 1F7B9;VERY HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 1F7BA;EXTREMELY HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 1F7BB;LIGHT EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 1F7BC;MEDIUM EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 1F7BD;BOLD EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 1F7BE;HEAVY EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 1F7BF;VERY HEAVY EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; 1F7C0;LIGHT THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; 1F7C1;MEDIUM THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; 1F7C2;THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; 1F7C3;MEDIUM THREE POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; 1F7C4;LIGHT FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; 1F7C5;MEDIUM FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; 1F7C6;FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; 1F7C7;MEDIUM FOUR POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; 1F7C8;REVERSE LIGHT FOUR POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; 1F7C9;LIGHT FIVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; 1F7CA;HEAVY FIVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; 1F7CB;MEDIUM SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; 1F7CC;HEAVY SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; 1F7CD;SIX POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; 1F7CE;MEDIUM EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; 1F7CF;HEAVY EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; 1F7D0;VERY HEAVY EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; 1F7D1;HEAVY EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; 1F7D2;LIGHT TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; 1F7D3;HEAVY TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; 1F7D4;HEAVY TWELVE POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; 1F800;LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; 1F801;UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; 1F802;RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; 1F803;DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; 1F804;LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; 1F805;UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; 1F806;RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; 1F807;DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; 1F808;LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; 1F809;UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; 1F80A;RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; 1F80B;DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; 1F810;LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; 1F811;UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; 1F812;RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; 1F813;DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; 1F814;LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; 1F815;UPWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; 1F816;RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; 1F817;DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; 1F818;HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; 1F819;HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; 1F81A;HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; 1F81B;HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; 1F81C;HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; 1F81D;HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; 1F81E;HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; 1F81F;HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; 1F820;LEFTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; 1F821;UPWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; 1F822;RIGHTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; 1F823;DOWNWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; 1F824;LEFTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; 1F825;UPWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; 1F826;RIGHTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; 1F827;DOWNWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; 1F828;LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; 1F829;UPWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; 1F82A;RIGHTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; 1F82B;DOWNWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; 1F82C;LEFTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; 1F82D;UPWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; 1F82E;RIGHTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; 1F82F;DOWNWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; 1F830;LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; 1F831;UPWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; 1F832;RIGHTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; 1F833;DOWNWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; 1F834;LEFTWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; 1F835;UPWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; 1F836;RIGHTWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; 1F837;DOWNWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; 1F838;LEFTWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; 1F839;UPWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; 1F83A;RIGHTWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; 1F83B;DOWNWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; 1F83C;LEFTWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; 1F83D;UPWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; 1F83E;RIGHTWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; 1F83F;DOWNWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; 1F840;LEFTWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; 1F841;UPWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; 1F842;RIGHTWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; 1F843;DOWNWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; 1F844;LEFTWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; 1F845;UPWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; 1F846;RIGHTWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; 1F847;DOWNWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; 1F850;LEFTWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; 1F851;UPWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; 1F852;RIGHTWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; 1F853;DOWNWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; 1F854;NORTH WEST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; 1F855;NORTH EAST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; 1F856;SOUTH EAST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; 1F857;SOUTH WEST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; 1F858;LEFT RIGHT SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; 1F859;UP DOWN SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; 1F860;WIDE-HEADED LEFTWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; 1F861;WIDE-HEADED UPWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; 1F862;WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; 1F863;WIDE-HEADED DOWNWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; 1F864;WIDE-HEADED NORTH WEST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; 1F865;WIDE-HEADED NORTH EAST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; 1F866;WIDE-HEADED SOUTH EAST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; 1F867;WIDE-HEADED SOUTH WEST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; 1F868;WIDE-HEADED LEFTWARDS BARB ARROW;So;0;ON;;;;;N;;;;; 1F869;WIDE-HEADED UPWARDS BARB ARROW;So;0;ON;;;;;N;;;;; 1F86A;WIDE-HEADED RIGHTWARDS BARB ARROW;So;0;ON;;;;;N;;;;; 1F86B;WIDE-HEADED DOWNWARDS BARB ARROW;So;0;ON;;;;;N;;;;; 1F86C;WIDE-HEADED NORTH WEST BARB ARROW;So;0;ON;;;;;N;;;;; 1F86D;WIDE-HEADED NORTH EAST BARB ARROW;So;0;ON;;;;;N;;;;; 1F86E;WIDE-HEADED SOUTH EAST BARB ARROW;So;0;ON;;;;;N;;;;; 1F86F;WIDE-HEADED SOUTH WEST BARB ARROW;So;0;ON;;;;;N;;;;; 1F870;WIDE-HEADED LEFTWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; 1F871;WIDE-HEADED UPWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; 1F872;WIDE-HEADED RIGHTWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; 1F873;WIDE-HEADED DOWNWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; 1F874;WIDE-HEADED NORTH WEST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; 1F875;WIDE-HEADED NORTH EAST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; 1F876;WIDE-HEADED SOUTH EAST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; 1F877;WIDE-HEADED SOUTH WEST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; 1F878;WIDE-HEADED LEFTWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; 1F879;WIDE-HEADED UPWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; 1F87A;WIDE-HEADED RIGHTWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; 1F87B;WIDE-HEADED DOWNWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; 1F87C;WIDE-HEADED NORTH WEST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; 1F87D;WIDE-HEADED NORTH EAST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; 1F87E;WIDE-HEADED SOUTH EAST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; 1F87F;WIDE-HEADED SOUTH WEST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; 1F880;WIDE-HEADED LEFTWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; 1F881;WIDE-HEADED UPWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; 1F882;WIDE-HEADED RIGHTWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; 1F883;WIDE-HEADED DOWNWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; 1F884;WIDE-HEADED NORTH WEST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; 1F885;WIDE-HEADED NORTH EAST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; 1F886;WIDE-HEADED SOUTH EAST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; 1F887;WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; 1F890;LEFTWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; 1F891;UPWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; 1F892;RIGHTWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; 1F893;DOWNWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; 1F894;LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; 1F895;UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; 1F896;RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; 1F897;DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; 1F898;LEFTWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; 1F899;UPWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; 1F89A;RIGHTWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; 1F89B;DOWNWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; 1F89C;HEAVY ARROW SHAFT WIDTH ONE;So;0;ON;;;;;N;;;;; 1F89D;HEAVY ARROW SHAFT WIDTH TWO THIRDS;So;0;ON;;;;;N;;;;; 1F89E;HEAVY ARROW SHAFT WIDTH ONE HALF;So;0;ON;;;;;N;;;;; 1F89F;HEAVY ARROW SHAFT WIDTH ONE THIRD;So;0;ON;;;;;N;;;;; 1F8A0;LEFTWARDS BOTTOM-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; 1F8A1;RIGHTWARDS BOTTOM SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; 1F8A2;LEFTWARDS TOP SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; 1F8A3;RIGHTWARDS TOP SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; 1F8A4;LEFTWARDS LEFT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; 1F8A5;RIGHTWARDS RIGHT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; 1F8A6;LEFTWARDS RIGHT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; 1F8A7;RIGHTWARDS LEFT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; 1F8A8;LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; 1F8A9;RIGHTWARDS BACK-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; 1F8AA;LEFTWARDS FRONT-TILTED SHADOWED WHITE ARROW;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;;;;; 1F910;ZIPPER-MOUTH FACE;So;0;ON;;;;;N;;;;; 1F911;MONEY-MOUTH FACE;So;0;ON;;;;;N;;;;; 1F912;FACE WITH THERMOMETER;So;0;ON;;;;;N;;;;; 1F913;NERD FACE;So;0;ON;;;;;N;;;;; 1F914;THINKING FACE;So;0;ON;;;;;N;;;;; 1F915;FACE WITH HEAD-BANDAGE;So;0;ON;;;;;N;;;;; 1F916;ROBOT FACE;So;0;ON;;;;;N;;;;; 1F917;HUGGING FACE;So;0;ON;;;;;N;;;;; 1F918;SIGN OF THE HORNS;So;0;ON;;;;;N;;;;; 1F919;CALL ME HAND;So;0;ON;;;;;N;;;;; 1F91A;RAISED BACK OF HAND;So;0;ON;;;;;N;;;;; 1F91B;LEFT-FACING FIST;So;0;ON;;;;;N;;;;; 1F91C;RIGHT-FACING FIST;So;0;ON;;;;;N;;;;; 1F91D;HANDSHAKE;So;0;ON;;;;;N;;;;; 1F91E;HAND WITH INDEX AND MIDDLE FINGERS CROSSED;So;0;ON;;;;;N;;;;; 1F920;FACE WITH COWBOY HAT;So;0;ON;;;;;N;;;;; 1F921;CLOWN FACE;So;0;ON;;;;;N;;;;; 1F922;NAUSEATED FACE;So;0;ON;;;;;N;;;;; 1F923;ROLLING ON THE FLOOR LAUGHING;So;0;ON;;;;;N;;;;; 1F924;DROOLING FACE;So;0;ON;;;;;N;;;;; 1F925;LYING FACE;So;0;ON;;;;;N;;;;; 1F926;FACE PALM;So;0;ON;;;;;N;;;;; 1F927;SNEEZING FACE;So;0;ON;;;;;N;;;;; 1F930;PREGNANT WOMAN;So;0;ON;;;;;N;;;;; 1F933;SELFIE;So;0;ON;;;;;N;;;;; 1F934;PRINCE;So;0;ON;;;;;N;;;;; 1F935;MAN IN TUXEDO;So;0;ON;;;;;N;;;;; 1F936;MOTHER CHRISTMAS;So;0;ON;;;;;N;;;;; 1F937;SHRUG;So;0;ON;;;;;N;;;;; 1F938;PERSON DOING CARTWHEEL;So;0;ON;;;;;N;;;;; 1F939;JUGGLING;So;0;ON;;;;;N;;;;; 1F93A;FENCER;So;0;ON;;;;;N;;;;; 1F93B;MODERN PENTATHLON;So;0;ON;;;;;N;;;;; 1F93C;WRESTLERS;So;0;ON;;;;;N;;;;; 1F93D;WATER POLO;So;0;ON;;;;;N;;;;; 1F93E;HANDBALL;So;0;ON;;;;;N;;;;; 1F940;WILTED FLOWER;So;0;ON;;;;;N;;;;; 1F941;DRUM WITH DRUMSTICKS;So;0;ON;;;;;N;;;;; 1F942;CLINKING GLASSES;So;0;ON;;;;;N;;;;; 1F943;TUMBLER GLASS;So;0;ON;;;;;N;;;;; 1F944;SPOON;So;0;ON;;;;;N;;;;; 1F945;GOAL NET;So;0;ON;;;;;N;;;;; 1F946;RIFLE;So;0;ON;;;;;N;;;;; 1F947;FIRST PLACE MEDAL;So;0;ON;;;;;N;;;;; 1F948;SECOND PLACE MEDAL;So;0;ON;;;;;N;;;;; 1F949;THIRD PLACE MEDAL;So;0;ON;;;;;N;;;;; 1F94A;BOXING GLOVE;So;0;ON;;;;;N;;;;; 1F94B;MARTIAL ARTS UNIFORM;So;0;ON;;;;;N;;;;; 1F950;CROISSANT;So;0;ON;;;;;N;;;;; 1F951;AVOCADO;So;0;ON;;;;;N;;;;; 1F952;CUCUMBER;So;0;ON;;;;;N;;;;; 1F953;BACON;So;0;ON;;;;;N;;;;; 1F954;POTATO;So;0;ON;;;;;N;;;;; 1F955;CARROT;So;0;ON;;;;;N;;;;; 1F956;BAGUETTE BREAD;So;0;ON;;;;;N;;;;; 1F957;GREEN SALAD;So;0;ON;;;;;N;;;;; 1F958;SHALLOW PAN OF FOOD;So;0;ON;;;;;N;;;;; 1F959;STUFFED FLATBREAD;So;0;ON;;;;;N;;;;; 1F95A;EGG;So;0;ON;;;;;N;;;;; 1F95B;GLASS OF MILK;So;0;ON;;;;;N;;;;; 1F95C;PEANUTS;So;0;ON;;;;;N;;;;; 1F95D;KIWIFRUIT;So;0;ON;;;;;N;;;;; 1F95E;PANCAKES;So;0;ON;;;;;N;;;;; 1F980;CRAB;So;0;ON;;;;;N;;;;; 1F981;LION FACE;So;0;ON;;;;;N;;;;; 1F982;SCORPION;So;0;ON;;;;;N;;;;; 1F983;TURKEY;So;0;ON;;;;;N;;;;; 1F984;UNICORN FACE;So;0;ON;;;;;N;;;;; 1F985;EAGLE;So;0;ON;;;;;N;;;;; 1F986;DUCK;So;0;ON;;;;;N;;;;; 1F987;BAT;So;0;ON;;;;;N;;;;; 1F988;SHARK;So;0;ON;;;;;N;;;;; 1F989;OWL;So;0;ON;;;;;N;;;;; 1F98A;FOX FACE;So;0;ON;;;;;N;;;;; 1F98B;BUTTERFLY;So;0;ON;;;;;N;;;;; 1F98C;DEER;So;0;ON;;;;;N;;;;; 1F98D;GORILLA;So;0;ON;;;;;N;;;;; 1F98E;LIZARD;So;0;ON;;;;;N;;;;; 1F98F;RHINOCEROS;So;0;ON;;;;;N;;;;; 1F990;SHRIMP;So;0;ON;;;;;N;;;;; 1F991;SQUID;So;0;ON;;;;;N;;;;; 1F9C0;CHEESE WEDGE;So;0;ON;;;;;N;;;;; 20000;<CJK Ideograph Extension B, First>;Lo;0;L;;;;;N;;;;; 2A6D6;<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;;;;; 2B81D;<CJK Ideograph Extension D, Last>;Lo;0;L;;;;;N;;;;; 2B820;<CJK Ideograph Extension E, First>;Lo;0;L;;;;;N;;;;; 2CEA1;<CJK Ideograph Extension E, Last>;Lo;0;L;;;;;N;;;;; 2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;; 2F801;CJK COMPATIBILITY IDEOGRAPH-2F801;Lo;0;L;4E38;;;;N;;;;; 2F802;CJK COMPATIBILITY IDEOGRAPH-2F802;Lo;0;L;4E41;;;;N;;;;; 2F803;CJK COMPATIBILITY IDEOGRAPH-2F803;Lo;0;L;20122;;;;N;;;;; 2F804;CJK COMPATIBILITY IDEOGRAPH-2F804;Lo;0;L;4F60;;;;N;;;;; 2F805;CJK COMPATIBILITY IDEOGRAPH-2F805;Lo;0;L;4FAE;;;;N;;;;; 2F806;CJK COMPATIBILITY IDEOGRAPH-2F806;Lo;0;L;4FBB;;;;N;;;;; 2F807;CJK COMPATIBILITY IDEOGRAPH-2F807;Lo;0;L;5002;;;;N;;;;; 2F808;CJK COMPATIBILITY IDEOGRAPH-2F808;Lo;0;L;507A;;;;N;;;;; 2F809;CJK COMPATIBILITY IDEOGRAPH-2F809;Lo;0;L;5099;;;;N;;;;; 2F80A;CJK COMPATIBILITY IDEOGRAPH-2F80A;Lo;0;L;50E7;;;;N;;;;; 2F80B;CJK COMPATIBILITY IDEOGRAPH-2F80B;Lo;0;L;50CF;;;;N;;;;; 2F80C;CJK COMPATIBILITY IDEOGRAPH-2F80C;Lo;0;L;349E;;;;N;;;;; 2F80D;CJK COMPATIBILITY IDEOGRAPH-2F80D;Lo;0;L;2063A;;;;N;;;;; 2F80E;CJK COMPATIBILITY IDEOGRAPH-2F80E;Lo;0;L;514D;;;;N;;;;; 2F80F;CJK COMPATIBILITY IDEOGRAPH-2F80F;Lo;0;L;5154;;;;N;;;;; 2F810;CJK COMPATIBILITY IDEOGRAPH-2F810;Lo;0;L;5164;;;;N;;;;; 2F811;CJK COMPATIBILITY IDEOGRAPH-2F811;Lo;0;L;5177;;;;N;;;;; 2F812;CJK COMPATIBILITY IDEOGRAPH-2F812;Lo;0;L;2051C;;;;N;;;;; 2F813;CJK COMPATIBILITY IDEOGRAPH-2F813;Lo;0;L;34B9;;;;N;;;;; 2F814;CJK COMPATIBILITY IDEOGRAPH-2F814;Lo;0;L;5167;;;;N;;;;; 2F815;CJK COMPATIBILITY IDEOGRAPH-2F815;Lo;0;L;518D;;;;N;;;;; 2F816;CJK COMPATIBILITY IDEOGRAPH-2F816;Lo;0;L;2054B;;;;N;;;;; 2F817;CJK COMPATIBILITY IDEOGRAPH-2F817;Lo;0;L;5197;;;;N;;;;; 2F818;CJK COMPATIBILITY IDEOGRAPH-2F818;Lo;0;L;51A4;;;;N;;;;; 2F819;CJK COMPATIBILITY IDEOGRAPH-2F819;Lo;0;L;4ECC;;;;N;;;;; 2F81A;CJK COMPATIBILITY IDEOGRAPH-2F81A;Lo;0;L;51AC;;;;N;;;;; 2F81B;CJK COMPATIBILITY IDEOGRAPH-2F81B;Lo;0;L;51B5;;;;N;;;;; 2F81C;CJK COMPATIBILITY IDEOGRAPH-2F81C;Lo;0;L;291DF;;;;N;;;;; 2F81D;CJK COMPATIBILITY IDEOGRAPH-2F81D;Lo;0;L;51F5;;;;N;;;;; 2F81E;CJK COMPATIBILITY IDEOGRAPH-2F81E;Lo;0;L;5203;;;;N;;;;; 2F81F;CJK COMPATIBILITY IDEOGRAPH-2F81F;Lo;0;L;34DF;;;;N;;;;; 2F820;CJK COMPATIBILITY IDEOGRAPH-2F820;Lo;0;L;523B;;;;N;;;;; 2F821;CJK COMPATIBILITY IDEOGRAPH-2F821;Lo;0;L;5246;;;;N;;;;; 2F822;CJK COMPATIBILITY IDEOGRAPH-2F822;Lo;0;L;5272;;;;N;;;;; 2F823;CJK COMPATIBILITY IDEOGRAPH-2F823;Lo;0;L;5277;;;;N;;;;; 2F824;CJK COMPATIBILITY IDEOGRAPH-2F824;Lo;0;L;3515;;;;N;;;;; 2F825;CJK COMPATIBILITY IDEOGRAPH-2F825;Lo;0;L;52C7;;;;N;;;;; 2F826;CJK COMPATIBILITY IDEOGRAPH-2F826;Lo;0;L;52C9;;;;N;;;;; 2F827;CJK COMPATIBILITY IDEOGRAPH-2F827;Lo;0;L;52E4;;;;N;;;;; 2F828;CJK COMPATIBILITY IDEOGRAPH-2F828;Lo;0;L;52FA;;;;N;;;;; 2F829;CJK COMPATIBILITY IDEOGRAPH-2F829;Lo;0;L;5305;;;;N;;;;; 2F82A;CJK COMPATIBILITY IDEOGRAPH-2F82A;Lo;0;L;5306;;;;N;;;;; 2F82B;CJK COMPATIBILITY IDEOGRAPH-2F82B;Lo;0;L;5317;;;;N;;;;; 2F82C;CJK COMPATIBILITY IDEOGRAPH-2F82C;Lo;0;L;5349;;;;N;;;;; 2F82D;CJK COMPATIBILITY IDEOGRAPH-2F82D;Lo;0;L;5351;;;;N;;;;; 2F82E;CJK COMPATIBILITY IDEOGRAPH-2F82E;Lo;0;L;535A;;;;N;;;;; 2F82F;CJK COMPATIBILITY IDEOGRAPH-2F82F;Lo;0;L;5373;;;;N;;;;; 2F830;CJK COMPATIBILITY IDEOGRAPH-2F830;Lo;0;L;537D;;;;N;;;;; 2F831;CJK COMPATIBILITY IDEOGRAPH-2F831;Lo;0;L;537F;;;;N;;;;; 2F832;CJK COMPATIBILITY IDEOGRAPH-2F832;Lo;0;L;537F;;;;N;;;;; 2F833;CJK COMPATIBILITY IDEOGRAPH-2F833;Lo;0;L;537F;;;;N;;;;; 2F834;CJK COMPATIBILITY IDEOGRAPH-2F834;Lo;0;L;20A2C;;;;N;;;;; 2F835;CJK COMPATIBILITY IDEOGRAPH-2F835;Lo;0;L;7070;;;;N;;;;; 2F836;CJK COMPATIBILITY IDEOGRAPH-2F836;Lo;0;L;53CA;;;;N;;;;; 2F837;CJK COMPATIBILITY IDEOGRAPH-2F837;Lo;0;L;53DF;;;;N;;;;; 2F838;CJK COMPATIBILITY IDEOGRAPH-2F838;Lo;0;L;20B63;;;;N;;;;; 2F839;CJK COMPATIBILITY IDEOGRAPH-2F839;Lo;0;L;53EB;;;;N;;;;; 2F83A;CJK COMPATIBILITY IDEOGRAPH-2F83A;Lo;0;L;53F1;;;;N;;;;; 2F83B;CJK COMPATIBILITY IDEOGRAPH-2F83B;Lo;0;L;5406;;;;N;;;;; 2F83C;CJK COMPATIBILITY IDEOGRAPH-2F83C;Lo;0;L;549E;;;;N;;;;; 2F83D;CJK COMPATIBILITY IDEOGRAPH-2F83D;Lo;0;L;5438;;;;N;;;;; 2F83E;CJK COMPATIBILITY IDEOGRAPH-2F83E;Lo;0;L;5448;;;;N;;;;; 2F83F;CJK COMPATIBILITY IDEOGRAPH-2F83F;Lo;0;L;5468;;;;N;;;;; 2F840;CJK COMPATIBILITY IDEOGRAPH-2F840;Lo;0;L;54A2;;;;N;;;;; 2F841;CJK COMPATIBILITY IDEOGRAPH-2F841;Lo;0;L;54F6;;;;N;;;;; 2F842;CJK COMPATIBILITY IDEOGRAPH-2F842;Lo;0;L;5510;;;;N;;;;; 2F843;CJK COMPATIBILITY IDEOGRAPH-2F843;Lo;0;L;5553;;;;N;;;;; 2F844;CJK COMPATIBILITY IDEOGRAPH-2F844;Lo;0;L;5563;;;;N;;;;; 2F845;CJK COMPATIBILITY IDEOGRAPH-2F845;Lo;0;L;5584;;;;N;;;;; 2F846;CJK COMPATIBILITY IDEOGRAPH-2F846;Lo;0;L;5584;;;;N;;;;; 2F847;CJK COMPATIBILITY IDEOGRAPH-2F847;Lo;0;L;5599;;;;N;;;;; 2F848;CJK COMPATIBILITY IDEOGRAPH-2F848;Lo;0;L;55AB;;;;N;;;;; 2F849;CJK COMPATIBILITY IDEOGRAPH-2F849;Lo;0;L;55B3;;;;N;;;;; 2F84A;CJK COMPATIBILITY IDEOGRAPH-2F84A;Lo;0;L;55C2;;;;N;;;;; 2F84B;CJK COMPATIBILITY IDEOGRAPH-2F84B;Lo;0;L;5716;;;;N;;;;; 2F84C;CJK COMPATIBILITY IDEOGRAPH-2F84C;Lo;0;L;5606;;;;N;;;;; 2F84D;CJK COMPATIBILITY IDEOGRAPH-2F84D;Lo;0;L;5717;;;;N;;;;; 2F84E;CJK COMPATIBILITY IDEOGRAPH-2F84E;Lo;0;L;5651;;;;N;;;;; 2F84F;CJK COMPATIBILITY IDEOGRAPH-2F84F;Lo;0;L;5674;;;;N;;;;; 2F850;CJK COMPATIBILITY IDEOGRAPH-2F850;Lo;0;L;5207;;;;N;;;;; 2F851;CJK COMPATIBILITY IDEOGRAPH-2F851;Lo;0;L;58EE;;;;N;;;;; 2F852;CJK COMPATIBILITY IDEOGRAPH-2F852;Lo;0;L;57CE;;;;N;;;;; 2F853;CJK COMPATIBILITY IDEOGRAPH-2F853;Lo;0;L;57F4;;;;N;;;;; 2F854;CJK COMPATIBILITY IDEOGRAPH-2F854;Lo;0;L;580D;;;;N;;;;; 2F855;CJK COMPATIBILITY IDEOGRAPH-2F855;Lo;0;L;578B;;;;N;;;;; 2F856;CJK COMPATIBILITY IDEOGRAPH-2F856;Lo;0;L;5832;;;;N;;;;; 2F857;CJK COMPATIBILITY IDEOGRAPH-2F857;Lo;0;L;5831;;;;N;;;;; 2F858;CJK COMPATIBILITY IDEOGRAPH-2F858;Lo;0;L;58AC;;;;N;;;;; 2F859;CJK COMPATIBILITY IDEOGRAPH-2F859;Lo;0;L;214E4;;;;N;;;;; 2F85A;CJK COMPATIBILITY IDEOGRAPH-2F85A;Lo;0;L;58F2;;;;N;;;;; 2F85B;CJK COMPATIBILITY IDEOGRAPH-2F85B;Lo;0;L;58F7;;;;N;;;;; 2F85C;CJK COMPATIBILITY IDEOGRAPH-2F85C;Lo;0;L;5906;;;;N;;;;; 2F85D;CJK COMPATIBILITY IDEOGRAPH-2F85D;Lo;0;L;591A;;;;N;;;;; 2F85E;CJK COMPATIBILITY IDEOGRAPH-2F85E;Lo;0;L;5922;;;;N;;;;; 2F85F;CJK COMPATIBILITY IDEOGRAPH-2F85F;Lo;0;L;5962;;;;N;;;;; 2F860;CJK COMPATIBILITY IDEOGRAPH-2F860;Lo;0;L;216A8;;;;N;;;;; 2F861;CJK COMPATIBILITY IDEOGRAPH-2F861;Lo;0;L;216EA;;;;N;;;;; 2F862;CJK COMPATIBILITY IDEOGRAPH-2F862;Lo;0;L;59EC;;;;N;;;;; 2F863;CJK COMPATIBILITY IDEOGRAPH-2F863;Lo;0;L;5A1B;;;;N;;;;; 2F864;CJK COMPATIBILITY IDEOGRAPH-2F864;Lo;0;L;5A27;;;;N;;;;; 2F865;CJK COMPATIBILITY IDEOGRAPH-2F865;Lo;0;L;59D8;;;;N;;;;; 2F866;CJK COMPATIBILITY IDEOGRAPH-2F866;Lo;0;L;5A66;;;;N;;;;; 2F867;CJK COMPATIBILITY IDEOGRAPH-2F867;Lo;0;L;36EE;;;;N;;;;; 2F868;CJK COMPATIBILITY IDEOGRAPH-2F868;Lo;0;L;36FC;;;;N;;;;; 2F869;CJK COMPATIBILITY IDEOGRAPH-2F869;Lo;0;L;5B08;;;;N;;;;; 2F86A;CJK COMPATIBILITY IDEOGRAPH-2F86A;Lo;0;L;5B3E;;;;N;;;;; 2F86B;CJK COMPATIBILITY IDEOGRAPH-2F86B;Lo;0;L;5B3E;;;;N;;;;; 2F86C;CJK COMPATIBILITY IDEOGRAPH-2F86C;Lo;0;L;219C8;;;;N;;;;; 2F86D;CJK COMPATIBILITY IDEOGRAPH-2F86D;Lo;0;L;5BC3;;;;N;;;;; 2F86E;CJK COMPATIBILITY IDEOGRAPH-2F86E;Lo;0;L;5BD8;;;;N;;;;; 2F86F;CJK COMPATIBILITY IDEOGRAPH-2F86F;Lo;0;L;5BE7;;;;N;;;;; 2F870;CJK COMPATIBILITY IDEOGRAPH-2F870;Lo;0;L;5BF3;;;;N;;;;; 2F871;CJK COMPATIBILITY IDEOGRAPH-2F871;Lo;0;L;21B18;;;;N;;;;; 2F872;CJK COMPATIBILITY IDEOGRAPH-2F872;Lo;0;L;5BFF;;;;N;;;;; 2F873;CJK COMPATIBILITY IDEOGRAPH-2F873;Lo;0;L;5C06;;;;N;;;;; 2F874;CJK COMPATIBILITY IDEOGRAPH-2F874;Lo;0;L;5F53;;;;N;;;;; 2F875;CJK COMPATIBILITY IDEOGRAPH-2F875;Lo;0;L;5C22;;;;N;;;;; 2F876;CJK COMPATIBILITY IDEOGRAPH-2F876;Lo;0;L;3781;;;;N;;;;; 2F877;CJK COMPATIBILITY IDEOGRAPH-2F877;Lo;0;L;5C60;;;;N;;;;; 2F878;CJK COMPATIBILITY IDEOGRAPH-2F878;Lo;0;L;5C6E;;;;N;;;;; 2F879;CJK COMPATIBILITY IDEOGRAPH-2F879;Lo;0;L;5CC0;;;;N;;;;; 2F87A;CJK COMPATIBILITY IDEOGRAPH-2F87A;Lo;0;L;5C8D;;;;N;;;;; 2F87B;CJK COMPATIBILITY IDEOGRAPH-2F87B;Lo;0;L;21DE4;;;;N;;;;; 2F87C;CJK COMPATIBILITY IDEOGRAPH-2F87C;Lo;0;L;5D43;;;;N;;;;; 2F87D;CJK COMPATIBILITY IDEOGRAPH-2F87D;Lo;0;L;21DE6;;;;N;;;;; 2F87E;CJK COMPATIBILITY IDEOGRAPH-2F87E;Lo;0;L;5D6E;;;;N;;;;; 2F87F;CJK COMPATIBILITY IDEOGRAPH-2F87F;Lo;0;L;5D6B;;;;N;;;;; 2F880;CJK COMPATIBILITY IDEOGRAPH-2F880;Lo;0;L;5D7C;;;;N;;;;; 2F881;CJK COMPATIBILITY IDEOGRAPH-2F881;Lo;0;L;5DE1;;;;N;;;;; 2F882;CJK COMPATIBILITY IDEOGRAPH-2F882;Lo;0;L;5DE2;;;;N;;;;; 2F883;CJK COMPATIBILITY IDEOGRAPH-2F883;Lo;0;L;382F;;;;N;;;;; 2F884;CJK COMPATIBILITY IDEOGRAPH-2F884;Lo;0;L;5DFD;;;;N;;;;; 2F885;CJK COMPATIBILITY IDEOGRAPH-2F885;Lo;0;L;5E28;;;;N;;;;; 2F886;CJK COMPATIBILITY IDEOGRAPH-2F886;Lo;0;L;5E3D;;;;N;;;;; 2F887;CJK COMPATIBILITY IDEOGRAPH-2F887;Lo;0;L;5E69;;;;N;;;;; 2F888;CJK COMPATIBILITY IDEOGRAPH-2F888;Lo;0;L;3862;;;;N;;;;; 2F889;CJK COMPATIBILITY IDEOGRAPH-2F889;Lo;0;L;22183;;;;N;;;;; 2F88A;CJK COMPATIBILITY IDEOGRAPH-2F88A;Lo;0;L;387C;;;;N;;;;; 2F88B;CJK COMPATIBILITY IDEOGRAPH-2F88B;Lo;0;L;5EB0;;;;N;;;;; 2F88C;CJK COMPATIBILITY IDEOGRAPH-2F88C;Lo;0;L;5EB3;;;;N;;;;; 2F88D;CJK COMPATIBILITY IDEOGRAPH-2F88D;Lo;0;L;5EB6;;;;N;;;;; 2F88E;CJK COMPATIBILITY IDEOGRAPH-2F88E;Lo;0;L;5ECA;;;;N;;;;; 2F88F;CJK COMPATIBILITY IDEOGRAPH-2F88F;Lo;0;L;2A392;;;;N;;;;; 2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;9;N;;;;; 2F891;CJK COMPATIBILITY IDEOGRAPH-2F891;Lo;0;L;22331;;;;N;;;;; 2F892;CJK COMPATIBILITY IDEOGRAPH-2F892;Lo;0;L;22331;;;;N;;;;; 2F893;CJK COMPATIBILITY IDEOGRAPH-2F893;Lo;0;L;8201;;;;N;;;;; 2F894;CJK COMPATIBILITY IDEOGRAPH-2F894;Lo;0;L;5F22;;;;N;;;;; 2F895;CJK COMPATIBILITY IDEOGRAPH-2F895;Lo;0;L;5F22;;;;N;;;;; 2F896;CJK COMPATIBILITY IDEOGRAPH-2F896;Lo;0;L;38C7;;;;N;;;;; 2F897;CJK COMPATIBILITY IDEOGRAPH-2F897;Lo;0;L;232B8;;;;N;;;;; 2F898;CJK COMPATIBILITY IDEOGRAPH-2F898;Lo;0;L;261DA;;;;N;;;;; 2F899;CJK COMPATIBILITY IDEOGRAPH-2F899;Lo;0;L;5F62;;;;N;;;;; 2F89A;CJK COMPATIBILITY IDEOGRAPH-2F89A;Lo;0;L;5F6B;;;;N;;;;; 2F89B;CJK COMPATIBILITY IDEOGRAPH-2F89B;Lo;0;L;38E3;;;;N;;;;; 2F89C;CJK COMPATIBILITY IDEOGRAPH-2F89C;Lo;0;L;5F9A;;;;N;;;;; 2F89D;CJK COMPATIBILITY IDEOGRAPH-2F89D;Lo;0;L;5FCD;;;;N;;;;; 2F89E;CJK COMPATIBILITY IDEOGRAPH-2F89E;Lo;0;L;5FD7;;;;N;;;;; 2F89F;CJK COMPATIBILITY IDEOGRAPH-2F89F;Lo;0;L;5FF9;;;;N;;;;; 2F8A0;CJK COMPATIBILITY IDEOGRAPH-2F8A0;Lo;0;L;6081;;;;N;;;;; 2F8A1;CJK COMPATIBILITY IDEOGRAPH-2F8A1;Lo;0;L;393A;;;;N;;;;; 2F8A2;CJK COMPATIBILITY IDEOGRAPH-2F8A2;Lo;0;L;391C;;;;N;;;;; 2F8A3;CJK COMPATIBILITY IDEOGRAPH-2F8A3;Lo;0;L;6094;;;;N;;;;; 2F8A4;CJK COMPATIBILITY IDEOGRAPH-2F8A4;Lo;0;L;226D4;;;;N;;;;; 2F8A5;CJK COMPATIBILITY IDEOGRAPH-2F8A5;Lo;0;L;60C7;;;;N;;;;; 2F8A6;CJK COMPATIBILITY IDEOGRAPH-2F8A6;Lo;0;L;6148;;;;N;;;;; 2F8A7;CJK COMPATIBILITY IDEOGRAPH-2F8A7;Lo;0;L;614C;;;;N;;;;; 2F8A8;CJK COMPATIBILITY IDEOGRAPH-2F8A8;Lo;0;L;614E;;;;N;;;;; 2F8A9;CJK COMPATIBILITY IDEOGRAPH-2F8A9;Lo;0;L;614C;;;;N;;;;; 2F8AA;CJK COMPATIBILITY IDEOGRAPH-2F8AA;Lo;0;L;617A;;;;N;;;;; 2F8AB;CJK COMPATIBILITY IDEOGRAPH-2F8AB;Lo;0;L;618E;;;;N;;;;; 2F8AC;CJK COMPATIBILITY IDEOGRAPH-2F8AC;Lo;0;L;61B2;;;;N;;;;; 2F8AD;CJK COMPATIBILITY IDEOGRAPH-2F8AD;Lo;0;L;61A4;;;;N;;;;; 2F8AE;CJK COMPATIBILITY IDEOGRAPH-2F8AE;Lo;0;L;61AF;;;;N;;;;; 2F8AF;CJK COMPATIBILITY IDEOGRAPH-2F8AF;Lo;0;L;61DE;;;;N;;;;; 2F8B0;CJK COMPATIBILITY IDEOGRAPH-2F8B0;Lo;0;L;61F2;;;;N;;;;; 2F8B1;CJK COMPATIBILITY IDEOGRAPH-2F8B1;Lo;0;L;61F6;;;;N;;;;; 2F8B2;CJK COMPATIBILITY IDEOGRAPH-2F8B2;Lo;0;L;6210;;;;N;;;;; 2F8B3;CJK COMPATIBILITY IDEOGRAPH-2F8B3;Lo;0;L;621B;;;;N;;;;; 2F8B4;CJK COMPATIBILITY IDEOGRAPH-2F8B4;Lo;0;L;625D;;;;N;;;;; 2F8B5;CJK COMPATIBILITY IDEOGRAPH-2F8B5;Lo;0;L;62B1;;;;N;;;;; 2F8B6;CJK COMPATIBILITY IDEOGRAPH-2F8B6;Lo;0;L;62D4;;;;N;;;;; 2F8B7;CJK COMPATIBILITY IDEOGRAPH-2F8B7;Lo;0;L;6350;;;;N;;;;; 2F8B8;CJK COMPATIBILITY IDEOGRAPH-2F8B8;Lo;0;L;22B0C;;;;N;;;;; 2F8B9;CJK COMPATIBILITY IDEOGRAPH-2F8B9;Lo;0;L;633D;;;;N;;;;; 2F8BA;CJK COMPATIBILITY IDEOGRAPH-2F8BA;Lo;0;L;62FC;;;;N;;;;; 2F8BB;CJK COMPATIBILITY IDEOGRAPH-2F8BB;Lo;0;L;6368;;;;N;;;;; 2F8BC;CJK COMPATIBILITY IDEOGRAPH-2F8BC;Lo;0;L;6383;;;;N;;;;; 2F8BD;CJK COMPATIBILITY IDEOGRAPH-2F8BD;Lo;0;L;63E4;;;;N;;;;; 2F8BE;CJK COMPATIBILITY IDEOGRAPH-2F8BE;Lo;0;L;22BF1;;;;N;;;;; 2F8BF;CJK COMPATIBILITY IDEOGRAPH-2F8BF;Lo;0;L;6422;;;;N;;;;; 2F8C0;CJK COMPATIBILITY IDEOGRAPH-2F8C0;Lo;0;L;63C5;;;;N;;;;; 2F8C1;CJK COMPATIBILITY IDEOGRAPH-2F8C1;Lo;0;L;63A9;;;;N;;;;; 2F8C2;CJK COMPATIBILITY IDEOGRAPH-2F8C2;Lo;0;L;3A2E;;;;N;;;;; 2F8C3;CJK COMPATIBILITY IDEOGRAPH-2F8C3;Lo;0;L;6469;;;;N;;;;; 2F8C4;CJK COMPATIBILITY IDEOGRAPH-2F8C4;Lo;0;L;647E;;;;N;;;;; 2F8C5;CJK COMPATIBILITY IDEOGRAPH-2F8C5;Lo;0;L;649D;;;;N;;;;; 2F8C6;CJK COMPATIBILITY IDEOGRAPH-2F8C6;Lo;0;L;6477;;;;N;;;;; 2F8C7;CJK COMPATIBILITY IDEOGRAPH-2F8C7;Lo;0;L;3A6C;;;;N;;;;; 2F8C8;CJK COMPATIBILITY IDEOGRAPH-2F8C8;Lo;0;L;654F;;;;N;;;;; 2F8C9;CJK COMPATIBILITY IDEOGRAPH-2F8C9;Lo;0;L;656C;;;;N;;;;; 2F8CA;CJK COMPATIBILITY IDEOGRAPH-2F8CA;Lo;0;L;2300A;;;;N;;;;; 2F8CB;CJK COMPATIBILITY IDEOGRAPH-2F8CB;Lo;0;L;65E3;;;;N;;;;; 2F8CC;CJK COMPATIBILITY IDEOGRAPH-2F8CC;Lo;0;L;66F8;;;;N;;;;; 2F8CD;CJK COMPATIBILITY IDEOGRAPH-2F8CD;Lo;0;L;6649;;;;N;;;;; 2F8CE;CJK COMPATIBILITY IDEOGRAPH-2F8CE;Lo;0;L;3B19;;;;N;;;;; 2F8CF;CJK COMPATIBILITY IDEOGRAPH-2F8CF;Lo;0;L;6691;;;;N;;;;; 2F8D0;CJK COMPATIBILITY IDEOGRAPH-2F8D0;Lo;0;L;3B08;;;;N;;;;; 2F8D1;CJK COMPATIBILITY IDEOGRAPH-2F8D1;Lo;0;L;3AE4;;;;N;;;;; 2F8D2;CJK COMPATIBILITY IDEOGRAPH-2F8D2;Lo;0;L;5192;;;;N;;;;; 2F8D3;CJK COMPATIBILITY IDEOGRAPH-2F8D3;Lo;0;L;5195;;;;N;;;;; 2F8D4;CJK COMPATIBILITY IDEOGRAPH-2F8D4;Lo;0;L;6700;;;;N;;;;; 2F8D5;CJK COMPATIBILITY IDEOGRAPH-2F8D5;Lo;0;L;669C;;;;N;;;;; 2F8D6;CJK COMPATIBILITY IDEOGRAPH-2F8D6;Lo;0;L;80AD;;;;N;;;;; 2F8D7;CJK COMPATIBILITY IDEOGRAPH-2F8D7;Lo;0;L;43D9;;;;N;;;;; 2F8D8;CJK COMPATIBILITY IDEOGRAPH-2F8D8;Lo;0;L;6717;;;;N;;;;; 2F8D9;CJK COMPATIBILITY IDEOGRAPH-2F8D9;Lo;0;L;671B;;;;N;;;;; 2F8DA;CJK COMPATIBILITY IDEOGRAPH-2F8DA;Lo;0;L;6721;;;;N;;;;; 2F8DB;CJK COMPATIBILITY IDEOGRAPH-2F8DB;Lo;0;L;675E;;;;N;;;;; 2F8DC;CJK COMPATIBILITY IDEOGRAPH-2F8DC;Lo;0;L;6753;;;;N;;;;; 2F8DD;CJK COMPATIBILITY IDEOGRAPH-2F8DD;Lo;0;L;233C3;;;;N;;;;; 2F8DE;CJK COMPATIBILITY IDEOGRAPH-2F8DE;Lo;0;L;3B49;;;;N;;;;; 2F8DF;CJK COMPATIBILITY IDEOGRAPH-2F8DF;Lo;0;L;67FA;;;;N;;;;; 2F8E0;CJK COMPATIBILITY IDEOGRAPH-2F8E0;Lo;0;L;6785;;;;N;;;;; 2F8E1;CJK COMPATIBILITY IDEOGRAPH-2F8E1;Lo;0;L;6852;;;;N;;;;; 2F8E2;CJK COMPATIBILITY IDEOGRAPH-2F8E2;Lo;0;L;6885;;;;N;;;;; 2F8E3;CJK COMPATIBILITY IDEOGRAPH-2F8E3;Lo;0;L;2346D;;;;N;;;;; 2F8E4;CJK COMPATIBILITY IDEOGRAPH-2F8E4;Lo;0;L;688E;;;;N;;;;; 2F8E5;CJK COMPATIBILITY IDEOGRAPH-2F8E5;Lo;0;L;681F;;;;N;;;;; 2F8E6;CJK COMPATIBILITY IDEOGRAPH-2F8E6;Lo;0;L;6914;;;;N;;;;; 2F8E7;CJK COMPATIBILITY IDEOGRAPH-2F8E7;Lo;0;L;3B9D;;;;N;;;;; 2F8E8;CJK COMPATIBILITY IDEOGRAPH-2F8E8;Lo;0;L;6942;;;;N;;;;; 2F8E9;CJK COMPATIBILITY IDEOGRAPH-2F8E9;Lo;0;L;69A3;;;;N;;;;; 2F8EA;CJK COMPATIBILITY IDEOGRAPH-2F8EA;Lo;0;L;69EA;;;;N;;;;; 2F8EB;CJK COMPATIBILITY IDEOGRAPH-2F8EB;Lo;0;L;6AA8;;;;N;;;;; 2F8EC;CJK COMPATIBILITY IDEOGRAPH-2F8EC;Lo;0;L;236A3;;;;N;;;;; 2F8ED;CJK COMPATIBILITY IDEOGRAPH-2F8ED;Lo;0;L;6ADB;;;;N;;;;; 2F8EE;CJK COMPATIBILITY IDEOGRAPH-2F8EE;Lo;0;L;3C18;;;;N;;;;; 2F8EF;CJK COMPATIBILITY IDEOGRAPH-2F8EF;Lo;0;L;6B21;;;;N;;;;; 2F8F0;CJK COMPATIBILITY IDEOGRAPH-2F8F0;Lo;0;L;238A7;;;;N;;;;; 2F8F1;CJK COMPATIBILITY IDEOGRAPH-2F8F1;Lo;0;L;6B54;;;;N;;;;; 2F8F2;CJK COMPATIBILITY IDEOGRAPH-2F8F2;Lo;0;L;3C4E;;;;N;;;;; 2F8F3;CJK COMPATIBILITY IDEOGRAPH-2F8F3;Lo;0;L;6B72;;;;N;;;;; 2F8F4;CJK COMPATIBILITY IDEOGRAPH-2F8F4;Lo;0;L;6B9F;;;;N;;;;; 2F8F5;CJK COMPATIBILITY IDEOGRAPH-2F8F5;Lo;0;L;6BBA;;;;N;;;;; 2F8F6;CJK COMPATIBILITY IDEOGRAPH-2F8F6;Lo;0;L;6BBB;;;;N;;;;; 2F8F7;CJK COMPATIBILITY IDEOGRAPH-2F8F7;Lo;0;L;23A8D;;;;N;;;;; 2F8F8;CJK COMPATIBILITY IDEOGRAPH-2F8F8;Lo;0;L;21D0B;;;;N;;;;; 2F8F9;CJK COMPATIBILITY IDEOGRAPH-2F8F9;Lo;0;L;23AFA;;;;N;;;;; 2F8FA;CJK COMPATIBILITY IDEOGRAPH-2F8FA;Lo;0;L;6C4E;;;;N;;;;; 2F8FB;CJK COMPATIBILITY IDEOGRAPH-2F8FB;Lo;0;L;23CBC;;;;N;;;;; 2F8FC;CJK COMPATIBILITY IDEOGRAPH-2F8FC;Lo;0;L;6CBF;;;;N;;;;; 2F8FD;CJK COMPATIBILITY IDEOGRAPH-2F8FD;Lo;0;L;6CCD;;;;N;;;;; 2F8FE;CJK COMPATIBILITY IDEOGRAPH-2F8FE;Lo;0;L;6C67;;;;N;;;;; 2F8FF;CJK COMPATIBILITY IDEOGRAPH-2F8FF;Lo;0;L;6D16;;;;N;;;;; 2F900;CJK COMPATIBILITY IDEOGRAPH-2F900;Lo;0;L;6D3E;;;;N;;;;; 2F901;CJK COMPATIBILITY IDEOGRAPH-2F901;Lo;0;L;6D77;;;;N;;;;; 2F902;CJK COMPATIBILITY IDEOGRAPH-2F902;Lo;0;L;6D41;;;;N;;;;; 2F903;CJK COMPATIBILITY IDEOGRAPH-2F903;Lo;0;L;6D69;;;;N;;;;; 2F904;CJK COMPATIBILITY IDEOGRAPH-2F904;Lo;0;L;6D78;;;;N;;;;; 2F905;CJK COMPATIBILITY IDEOGRAPH-2F905;Lo;0;L;6D85;;;;N;;;;; 2F906;CJK COMPATIBILITY IDEOGRAPH-2F906;Lo;0;L;23D1E;;;;N;;;;; 2F907;CJK COMPATIBILITY IDEOGRAPH-2F907;Lo;0;L;6D34;;;;N;;;;; 2F908;CJK COMPATIBILITY IDEOGRAPH-2F908;Lo;0;L;6E2F;;;;N;;;;; 2F909;CJK COMPATIBILITY IDEOGRAPH-2F909;Lo;0;L;6E6E;;;;N;;;;; 2F90A;CJK COMPATIBILITY IDEOGRAPH-2F90A;Lo;0;L;3D33;;;;N;;;;; 2F90B;CJK COMPATIBILITY IDEOGRAPH-2F90B;Lo;0;L;6ECB;;;;N;;;;; 2F90C;CJK COMPATIBILITY IDEOGRAPH-2F90C;Lo;0;L;6EC7;;;;N;;;;; 2F90D;CJK COMPATIBILITY IDEOGRAPH-2F90D;Lo;0;L;23ED1;;;;N;;;;; 2F90E;CJK COMPATIBILITY IDEOGRAPH-2F90E;Lo;0;L;6DF9;;;;N;;;;; 2F90F;CJK COMPATIBILITY IDEOGRAPH-2F90F;Lo;0;L;6F6E;;;;N;;;;; 2F910;CJK COMPATIBILITY IDEOGRAPH-2F910;Lo;0;L;23F5E;;;;N;;;;; 2F911;CJK COMPATIBILITY IDEOGRAPH-2F911;Lo;0;L;23F8E;;;;N;;;;; 2F912;CJK COMPATIBILITY IDEOGRAPH-2F912;Lo;0;L;6FC6;;;;N;;;;; 2F913;CJK COMPATIBILITY IDEOGRAPH-2F913;Lo;0;L;7039;;;;N;;;;; 2F914;CJK COMPATIBILITY IDEOGRAPH-2F914;Lo;0;L;701E;;;;N;;;;; 2F915;CJK COMPATIBILITY IDEOGRAPH-2F915;Lo;0;L;701B;;;;N;;;;; 2F916;CJK COMPATIBILITY IDEOGRAPH-2F916;Lo;0;L;3D96;;;;N;;;;; 2F917;CJK COMPATIBILITY IDEOGRAPH-2F917;Lo;0;L;704A;;;;N;;;;; 2F918;CJK COMPATIBILITY IDEOGRAPH-2F918;Lo;0;L;707D;;;;N;;;;; 2F919;CJK COMPATIBILITY IDEOGRAPH-2F919;Lo;0;L;7077;;;;N;;;;; 2F91A;CJK COMPATIBILITY IDEOGRAPH-2F91A;Lo;0;L;70AD;;;;N;;;;; 2F91B;CJK COMPATIBILITY IDEOGRAPH-2F91B;Lo;0;L;20525;;;;N;;;;; 2F91C;CJK COMPATIBILITY IDEOGRAPH-2F91C;Lo;0;L;7145;;;;N;;;;; 2F91D;CJK COMPATIBILITY IDEOGRAPH-2F91D;Lo;0;L;24263;;;;N;;;;; 2F91E;CJK COMPATIBILITY IDEOGRAPH-2F91E;Lo;0;L;719C;;;;N;;;;; 2F91F;CJK COMPATIBILITY IDEOGRAPH-2F91F;Lo;0;L;243AB;;;;N;;;;; 2F920;CJK COMPATIBILITY IDEOGRAPH-2F920;Lo;0;L;7228;;;;N;;;;; 2F921;CJK COMPATIBILITY IDEOGRAPH-2F921;Lo;0;L;7235;;;;N;;;;; 2F922;CJK COMPATIBILITY IDEOGRAPH-2F922;Lo;0;L;7250;;;;N;;;;;
+2F923;CJK COMPATIBILITY IDEOGRAPH-2F923;Lo;0;L;24608;;;;N;;;;;
+2F924;CJK COMPATIBILITY IDEOGRAPH-2F924;Lo;0;L;7280;;;;N;;;;;
+2F925;CJK COMPATIBILITY IDEOGRAPH-2F925;Lo;0;L;7295;;;;N;;;;;
+2F926;CJK COMPATIBILITY IDEOGRAPH-2F926;Lo;0;L;24735;;;;N;;;;;
+2F927;CJK COMPATIBILITY IDEOGRAPH-2F927;Lo;0;L;24814;;;;N;;;;;
+2F928;CJK COMPATIBILITY IDEOGRAPH-2F928;Lo;0;L;737A;;;;N;;;;;
+2F929;CJK COMPATIBILITY IDEOGRAPH-2F929;Lo;0;L;738B;;;;N;;;;;
+2F92A;CJK COMPATIBILITY IDEOGRAPH-2F92A;Lo;0;L;3EAC;;;;N;;;;;
+2F92B;CJK COMPATIBILITY IDEOGRAPH-2F92B;Lo;0;L;73A5;;;;N;;;;;
+2F92C;CJK COMPATIBILITY IDEOGRAPH-2F92C;Lo;0;L;3EB8;;;;N;;;;;
+2F92D;CJK COMPATIBILITY IDEOGRAPH-2F92D;Lo;0;L;3EB8;;;;N;;;;;
+2F92E;CJK COMPATIBILITY IDEOGRAPH-2F92E;Lo;0;L;7447;;;;N;;;;;
+2F92F;CJK COMPATIBILITY IDEOGRAPH-2F92F;Lo;0;L;745C;;;;N;;;;;
+2F930;CJK COMPATIBILITY IDEOGRAPH-2F930;Lo;0;L;7471;;;;N;;;;;
+2F931;CJK COMPATIBILITY IDEOGRAPH-2F931;Lo;0;L;7485;;;;N;;;;;
+2F932;CJK COMPATIBILITY IDEOGRAPH-2F932;Lo;0;L;74CA;;;;N;;;;;
+2F933;CJK COMPATIBILITY IDEOGRAPH-2F933;Lo;0;L;3F1B;;;;N;;;;;
+2F934;CJK COMPATIBILITY IDEOGRAPH-2F934;Lo;0;L;7524;;;;N;;;;;
+2F935;CJK COMPATIBILITY IDEOGRAPH-2F935;Lo;0;L;24C36;;;;N;;;;;
+2F936;CJK COMPATIBILITY IDEOGRAPH-2F936;Lo;0;L;753E;;;;N;;;;;
+2F937;CJK COMPATIBILITY IDEOGRAPH-2F937;Lo;0;L;24C92;;;;N;;;;;
+2F938;CJK COMPATIBILITY IDEOGRAPH-2F938;Lo;0;L;7570;;;;N;;;;;
+2F939;CJK COMPATIBILITY IDEOGRAPH-2F939;Lo;0;L;2219F;;;;N;;;;;
+2F93A;CJK COMPATIBILITY IDEOGRAPH-2F93A;Lo;0;L;7610;;;;N;;;;;
+2F93B;CJK COMPATIBILITY IDEOGRAPH-2F93B;Lo;0;L;24FA1;;;;N;;;;;
+2F93C;CJK COMPATIBILITY IDEOGRAPH-2F93C;Lo;0;L;24FB8;;;;N;;;;;
+2F93D;CJK COMPATIBILITY IDEOGRAPH-2F93D;Lo;0;L;25044;;;;N;;;;;
+2F93E;CJK COMPATIBILITY IDEOGRAPH-2F93E;Lo;0;L;3FFC;;;;N;;;;;
+2F93F;CJK COMPATIBILITY IDEOGRAPH-2F93F;Lo;0;L;4008;;;;N;;;;;
+2F940;CJK COMPATIBILITY IDEOGRAPH-2F940;Lo;0;L;76F4;;;;N;;;;;
+2F941;CJK COMPATIBILITY IDEOGRAPH-2F941;Lo;0;L;250F3;;;;N;;;;;
+2F942;CJK COMPATIBILITY IDEOGRAPH-2F942;Lo;0;L;250F2;;;;N;;;;;
+2F943;CJK COMPATIBILITY IDEOGRAPH-2F943;Lo;0;L;25119;;;;N;;;;;
+2F944;CJK COMPATIBILITY IDEOGRAPH-2F944;Lo;0;L;25133;;;;N;;;;;
+2F945;CJK COMPATIBILITY IDEOGRAPH-2F945;Lo;0;L;771E;;;;N;;;;;
+2F946;CJK COMPATIBILITY IDEOGRAPH-2F946;Lo;0;L;771F;;;;N;;;;;
+2F947;CJK COMPATIBILITY IDEOGRAPH-2F947;Lo;0;L;771F;;;;N;;;;;
+2F948;CJK COMPATIBILITY IDEOGRAPH-2F948;Lo;0;L;774A;;;;N;;;;;
+2F949;CJK COMPATIBILITY IDEOGRAPH-2F949;Lo;0;L;4039;;;;N;;;;;
+2F94A;CJK COMPATIBILITY IDEOGRAPH-2F94A;Lo;0;L;778B;;;;N;;;;;
+2F94B;CJK COMPATIBILITY IDEOGRAPH-2F94B;Lo;0;L;4046;;;;N;;;;;
+2F94C;CJK COMPATIBILITY IDEOGRAPH-2F94C;Lo;0;L;4096;;;;N;;;;;
+2F94D;CJK COMPATIBILITY IDEOGRAPH-2F94D;Lo;0;L;2541D;;;;N;;;;;
+2F94E;CJK COMPATIBILITY IDEOGRAPH-2F94E;Lo;0;L;784E;;;;N;;;;;
+2F94F;CJK COMPATIBILITY IDEOGRAPH-2F94F;Lo;0;L;788C;;;;N;;;;;
+2F950;CJK COMPATIBILITY IDEOGRAPH-2F950;Lo;0;L;78CC;;;;N;;;;;
+2F951;CJK COMPATIBILITY IDEOGRAPH-2F951;Lo;0;L;40E3;;;;N;;;;;
+2F952;CJK COMPATIBILITY IDEOGRAPH-2F952;Lo;0;L;25626;;;;N;;;;;
+2F953;CJK COMPATIBILITY IDEOGRAPH-2F953;Lo;0;L;7956;;;;N;;;;;
+2F954;CJK COMPATIBILITY IDEOGRAPH-2F954;Lo;0;L;2569A;;;;N;;;;;
+2F955;CJK COMPATIBILITY IDEOGRAPH-2F955;Lo;0;L;256C5;;;;N;;;;;
+2F956;CJK COMPATIBILITY IDEOGRAPH-2F956;Lo;0;L;798F;;;;N;;;;;
+2F957;CJK COMPATIBILITY IDEOGRAPH-2F957;Lo;0;L;79EB;;;;N;;;;;
+2F958;CJK COMPATIBILITY IDEOGRAPH-2F958;Lo;0;L;412F;;;;N;;;;;
+2F959;CJK COMPATIBILITY IDEOGRAPH-2F959;Lo;0;L;7A40;;;;N;;;;;
+2F95A;CJK COMPATIBILITY IDEOGRAPH-2F95A;Lo;0;L;7A4A;;;;N;;;;;
+2F95B;CJK COMPATIBILITY IDEOGRAPH-2F95B;Lo;0;L;7A4F;;;;N;;;;;
+2F95C;CJK COMPATIBILITY IDEOGRAPH-2F95C;Lo;0;L;2597C;;;;N;;;;;
+2F95D;CJK COMPATIBILITY IDEOGRAPH-2F95D;Lo;0;L;25AA7;;;;N;;;;;
+2F95E;CJK COMPATIBILITY IDEOGRAPH-2F95E;Lo;0;L;25AA7;;;;N;;;;;
+2F95F;CJK COMPATIBILITY IDEOGRAPH-2F95F;Lo;0;L;7AEE;;;;N;;;;;
+2F960;CJK COMPATIBILITY IDEOGRAPH-2F960;Lo;0;L;4202;;;;N;;;;;
+2F961;CJK COMPATIBILITY IDEOGRAPH-2F961;Lo;0;L;25BAB;;;;N;;;;;
+2F962;CJK COMPATIBILITY IDEOGRAPH-2F962;Lo;0;L;7BC6;;;;N;;;;;
+2F963;CJK COMPATIBILITY IDEOGRAPH-2F963;Lo;0;L;7BC9;;;;N;;;;;
+2F964;CJK COMPATIBILITY IDEOGRAPH-2F964;Lo;0;L;4227;;;;N;;;;;
+2F965;CJK COMPATIBILITY IDEOGRAPH-2F965;Lo;0;L;25C80;;;;N;;;;;
+2F966;CJK COMPATIBILITY IDEOGRAPH-2F966;Lo;0;L;7CD2;;;;N;;;;;
+2F967;CJK COMPATIBILITY IDEOGRAPH-2F967;Lo;0;L;42A0;;;;N;;;;;
+2F968;CJK COMPATIBILITY IDEOGRAPH-2F968;Lo;0;L;7CE8;;;;N;;;;;
+2F969;CJK COMPATIBILITY IDEOGRAPH-2F969;Lo;0;L;7CE3;;;;N;;;;;
+2F96A;CJK COMPATIBILITY IDEOGRAPH-2F96A;Lo;0;L;7D00;;;;N;;;;;
+2F96B;CJK COMPATIBILITY IDEOGRAPH-2F96B;Lo;0;L;25F86;;;;N;;;;;
+2F96C;CJK COMPATIBILITY IDEOGRAPH-2F96C;Lo;0;L;7D63;;;;N;;;;;
+2F96D;CJK COMPATIBILITY IDEOGRAPH-2F96D;Lo;0;L;4301;;;;N;;;;;
+2F96E;CJK COMPATIBILITY IDEOGRAPH-2F96E;Lo;0;L;7DC7;;;;N;;;;;
+2F96F;CJK COMPATIBILITY IDEOGRAPH-2F96F;Lo;0;L;7E02;;;;N;;;;;
+2F970;CJK COMPATIBILITY IDEOGRAPH-2F970;Lo;0;L;7E45;;;;N;;;;;
+2F971;CJK COMPATIBILITY IDEOGRAPH-2F971;Lo;0;L;4334;;;;N;;;;;
+2F972;CJK COMPATIBILITY IDEOGRAPH-2F972;Lo;0;L;26228;;;;N;;;;;
+2F973;CJK COMPATIBILITY IDEOGRAPH-2F973;Lo;0;L;26247;;;;N;;;;;
+2F974;CJK COMPATIBILITY IDEOGRAPH-2F974;Lo;0;L;4359;;;;N;;;;;
+2F975;CJK COMPATIBILITY IDEOGRAPH-2F975;Lo;0;L;262D9;;;;N;;;;;
+2F976;CJK COMPATIBILITY IDEOGRAPH-2F976;Lo;0;L;7F7A;;;;N;;;;;
+2F977;CJK COMPATIBILITY IDEOGRAPH-2F977;Lo;0;L;2633E;;;;N;;;;;
+2F978;CJK COMPATIBILITY IDEOGRAPH-2F978;Lo;0;L;7F95;;;;N;;;;;
+2F979;CJK COMPATIBILITY IDEOGRAPH-2F979;Lo;0;L;7FFA;;;;N;;;;;
+2F97A;CJK COMPATIBILITY IDEOGRAPH-2F97A;Lo;0;L;8005;;;;N;;;;;
+2F97B;CJK COMPATIBILITY IDEOGRAPH-2F97B;Lo;0;L;264DA;;;;N;;;;;
+2F97C;CJK COMPATIBILITY IDEOGRAPH-2F97C;Lo;0;L;26523;;;;N;;;;;
+2F97D;CJK COMPATIBILITY IDEOGRAPH-2F97D;Lo;0;L;8060;;;;N;;;;;
+2F97E;CJK COMPATIBILITY IDEOGRAPH-2F97E;Lo;0;L;265A8;;;;N;;;;;
+2F97F;CJK COMPATIBILITY IDEOGRAPH-2F97F;Lo;0;L;8070;;;;N;;;;;
+2F980;CJK COMPATIBILITY IDEOGRAPH-2F980;Lo;0;L;2335F;;;;N;;;;;
+2F981;CJK COMPATIBILITY IDEOGRAPH-2F981;Lo;0;L;43D5;;;;N;;;;;
+2F982;CJK COMPATIBILITY IDEOGRAPH-2F982;Lo;0;L;80B2;;;;N;;;;;
+2F983;CJK COMPATIBILITY IDEOGRAPH-2F983;Lo;0;L;8103;;;;N;;;;;
+2F984;CJK COMPATIBILITY IDEOGRAPH-2F984;Lo;0;L;440B;;;;N;;;;;
+2F985;CJK COMPATIBILITY IDEOGRAPH-2F985;Lo;0;L;813E;;;;N;;;;;
+2F986;CJK COMPATIBILITY IDEOGRAPH-2F986;Lo;0;L;5AB5;;;;N;;;;;
+2F987;CJK COMPATIBILITY IDEOGRAPH-2F987;Lo;0;L;267A7;;;;N;;;;;
+2F988;CJK COMPATIBILITY IDEOGRAPH-2F988;Lo;0;L;267B5;;;;N;;;;;
+2F989;CJK COMPATIBILITY IDEOGRAPH-2F989;Lo;0;L;23393;;;;N;;;;;
+2F98A;CJK COMPATIBILITY IDEOGRAPH-2F98A;Lo;0;L;2339C;;;;N;;;;;
+2F98B;CJK COMPATIBILITY IDEOGRAPH-2F98B;Lo;0;L;8201;;;;N;;;;;
+2F98C;CJK COMPATIBILITY IDEOGRAPH-2F98C;Lo;0;L;8204;;;;N;;;;;
+2F98D;CJK COMPATIBILITY IDEOGRAPH-2F98D;Lo;0;L;8F9E;;;;N;;;;;
+2F98E;CJK COMPATIBILITY IDEOGRAPH-2F98E;Lo;0;L;446B;;;;N;;;;;
+2F98F;CJK COMPATIBILITY IDEOGRAPH-2F98F;Lo;0;L;8291;;;;N;;;;;
+2F990;CJK COMPATIBILITY IDEOGRAPH-2F990;Lo;0;L;828B;;;;N;;;;;
+2F991;CJK COMPATIBILITY IDEOGRAPH-2F991;Lo;0;L;829D;;;;N;;;;;
+2F992;CJK COMPATIBILITY IDEOGRAPH-2F992;Lo;0;L;52B3;;;;N;;;;;
+2F993;CJK COMPATIBILITY IDEOGRAPH-2F993;Lo;0;L;82B1;;;;N;;;;;
+2F994;CJK COMPATIBILITY IDEOGRAPH-2F994;Lo;0;L;82B3;;;;N;;;;;
+2F995;CJK COMPATIBILITY IDEOGRAPH-2F995;Lo;0;L;82BD;;;;N;;;;;
+2F996;CJK COMPATIBILITY IDEOGRAPH-2F996;Lo;0;L;82E6;;;;N;;;;;
+2F997;CJK COMPATIBILITY IDEOGRAPH-2F997;Lo;0;L;26B3C;;;;N;;;;;
+2F998;CJK COMPATIBILITY IDEOGRAPH-2F998;Lo;0;L;82E5;;;;N;;;;;
+2F999;CJK COMPATIBILITY IDEOGRAPH-2F999;Lo;0;L;831D;;;;N;;;;;
+2F99A;CJK COMPATIBILITY IDEOGRAPH-2F99A;Lo;0;L;8363;;;;N;;;;;
+2F99B;CJK COMPATIBILITY IDEOGRAPH-2F99B;Lo;0;L;83AD;;;;N;;;;;
+2F99C;CJK COMPATIBILITY IDEOGRAPH-2F99C;Lo;0;L;8323;;;;N;;;;;
+2F99D;CJK COMPATIBILITY IDEOGRAPH-2F99D;Lo;0;L;83BD;;;;N;;;;;
+2F99E;CJK COMPATIBILITY IDEOGRAPH-2F99E;Lo;0;L;83E7;;;;N;;;;;
+2F99F;CJK COMPATIBILITY IDEOGRAPH-2F99F;Lo;0;L;8457;;;;N;;;;;
+2F9A0;CJK COMPATIBILITY IDEOGRAPH-2F9A0;Lo;0;L;8353;;;;N;;;;;
+2F9A1;CJK COMPATIBILITY IDEOGRAPH-2F9A1;Lo;0;L;83CA;;;;N;;;;;
+2F9A2;CJK COMPATIBILITY IDEOGRAPH-2F9A2;Lo;0;L;83CC;;;;N;;;;;
+2F9A3;CJK COMPATIBILITY IDEOGRAPH-2F9A3;Lo;0;L;83DC;;;;N;;;;;
+2F9A4;CJK COMPATIBILITY IDEOGRAPH-2F9A4;Lo;0;L;26C36;;;;N;;;;;
+2F9A5;CJK COMPATIBILITY IDEOGRAPH-2F9A5;Lo;0;L;26D6B;;;;N;;;;;
+2F9A6;CJK COMPATIBILITY IDEOGRAPH-2F9A6;Lo;0;L;26CD5;;;;N;;;;;
+2F9A7;CJK COMPATIBILITY IDEOGRAPH-2F9A7;Lo;0;L;452B;;;;N;;;;;
+2F9A8;CJK COMPATIBILITY IDEOGRAPH-2F9A8;Lo;0;L;84F1;;;;N;;;;;
+2F9A9;CJK COMPATIBILITY IDEOGRAPH-2F9A9;Lo;0;L;84F3;;;;N;;;;;
+2F9AA;CJK COMPATIBILITY IDEOGRAPH-2F9AA;Lo;0;L;8516;;;;N;;;;;
+2F9AB;CJK COMPATIBILITY IDEOGRAPH-2F9AB;Lo;0;L;273CA;;;;N;;;;;
+2F9AC;CJK COMPATIBILITY IDEOGRAPH-2F9AC;Lo;0;L;8564;;;;N;;;;;
+2F9AD;CJK COMPATIBILITY IDEOGRAPH-2F9AD;Lo;0;L;26F2C;;;;N;;;;;
+2F9AE;CJK COMPATIBILITY IDEOGRAPH-2F9AE;Lo;0;L;455D;;;;N;;;;;
+2F9AF;CJK COMPATIBILITY IDEOGRAPH-2F9AF;Lo;0;L;4561;;;;N;;;;;
+2F9B0;CJK COMPATIBILITY IDEOGRAPH-2F9B0;Lo;0;L;26FB1;;;;N;;;;;
+2F9B1;CJK COMPATIBILITY IDEOGRAPH-2F9B1;Lo;0;L;270D2;;;;N;;;;;
+2F9B2;CJK COMPATIBILITY IDEOGRAPH-2F9B2;Lo;0;L;456B;;;;N;;;;;
+2F9B3;CJK COMPATIBILITY IDEOGRAPH-2F9B3;Lo;0;L;8650;;;;N;;;;;
+2F9B4;CJK COMPATIBILITY IDEOGRAPH-2F9B4;Lo;0;L;865C;;;;N;;;;;
+2F9B5;CJK COMPATIBILITY IDEOGRAPH-2F9B5;Lo;0;L;8667;;;;N;;;;;
+2F9B6;CJK COMPATIBILITY IDEOGRAPH-2F9B6;Lo;0;L;8669;;;;N;;;;;
+2F9B7;CJK COMPATIBILITY IDEOGRAPH-2F9B7;Lo;0;L;86A9;;;;N;;;;;
+2F9B8;CJK COMPATIBILITY IDEOGRAPH-2F9B8;Lo;0;L;8688;;;;N;;;;;
+2F9B9;CJK COMPATIBILITY IDEOGRAPH-2F9B9;Lo;0;L;870E;;;;N;;;;;
+2F9BA;CJK COMPATIBILITY IDEOGRAPH-2F9BA;Lo;0;L;86E2;;;;N;;;;;
+2F9BB;CJK COMPATIBILITY IDEOGRAPH-2F9BB;Lo;0;L;8779;;;;N;;;;;
+2F9BC;CJK COMPATIBILITY IDEOGRAPH-2F9BC;Lo;0;L;8728;;;;N;;;;;
+2F9BD;CJK COMPATIBILITY IDEOGRAPH-2F9BD;Lo;0;L;876B;;;;N;;;;;
+2F9BE;CJK COMPATIBILITY IDEOGRAPH-2F9BE;Lo;0;L;8786;;;;N;;;;;
+2F9BF;CJK COMPATIBILITY IDEOGRAPH-2F9BF;Lo;0;L;45D7;;;;N;;;;;
+2F9C0;CJK COMPATIBILITY IDEOGRAPH-2F9C0;Lo;0;L;87E1;;;;N;;;;;
+2F9C1;CJK COMPATIBILITY IDEOGRAPH-2F9C1;Lo;0;L;8801;;;;N;;;;;
+2F9C2;CJK COMPATIBILITY IDEOGRAPH-2F9C2;Lo;0;L;45F9;;;;N;;;;;
+2F9C3;CJK COMPATIBILITY IDEOGRAPH-2F9C3;Lo;0;L;8860;;;;N;;;;;
+2F9C4;CJK COMPATIBILITY IDEOGRAPH-2F9C4;Lo;0;L;8863;;;;N;;;;;
+2F9C5;CJK COMPATIBILITY IDEOGRAPH-2F9C5;Lo;0;L;27667;;;;N;;;;;
+2F9C6;CJK COMPATIBILITY IDEOGRAPH-2F9C6;Lo;0;L;88D7;;;;N;;;;;
+2F9C7;CJK COMPATIBILITY IDEOGRAPH-2F9C7;Lo;0;L;88DE;;;;N;;;;;
+2F9C8;CJK COMPATIBILITY IDEOGRAPH-2F9C8;Lo;0;L;4635;;;;N;;;;;
+2F9C9;CJK COMPATIBILITY IDEOGRAPH-2F9C9;Lo;0;L;88FA;;;;N;;;;;
+2F9CA;CJK COMPATIBILITY IDEOGRAPH-2F9CA;Lo;0;L;34BB;;;;N;;;;;
+2F9CB;CJK COMPATIBILITY IDEOGRAPH-2F9CB;Lo;0;L;278AE;;;;N;;;;;
+2F9CC;CJK COMPATIBILITY IDEOGRAPH-2F9CC;Lo;0;L;27966;;;;N;;;;;
+2F9CD;CJK COMPATIBILITY IDEOGRAPH-2F9CD;Lo;0;L;46BE;;;;N;;;;;
+2F9CE;CJK COMPATIBILITY IDEOGRAPH-2F9CE;Lo;0;L;46C7;;;;N;;;;;
+2F9CF;CJK COMPATIBILITY IDEOGRAPH-2F9CF;Lo;0;L;8AA0;;;;N;;;;;
+2F9D0;CJK COMPATIBILITY IDEOGRAPH-2F9D0;Lo;0;L;8AED;;;;N;;;;;
+2F9D1;CJK COMPATIBILITY IDEOGRAPH-2F9D1;Lo;0;L;8B8A;;;;N;;;;;
+2F9D2;CJK COMPATIBILITY IDEOGRAPH-2F9D2;Lo;0;L;8C55;;;;N;;;;;
+2F9D3;CJK COMPATIBILITY IDEOGRAPH-2F9D3;Lo;0;L;27CA8;;;;N;;;;;
+2F9D4;CJK COMPATIBILITY IDEOGRAPH-2F9D4;Lo;0;L;8CAB;;;;N;;;;;
+2F9D5;CJK COMPATIBILITY IDEOGRAPH-2F9D5;Lo;0;L;8CC1;;;;N;;;;;
+2F9D6;CJK COMPATIBILITY IDEOGRAPH-2F9D6;Lo;0;L;8D1B;;;;N;;;;;
+2F9D7;CJK COMPATIBILITY IDEOGRAPH-2F9D7;Lo;0;L;8D77;;;;N;;;;;
+2F9D8;CJK COMPATIBILITY IDEOGRAPH-2F9D8;Lo;0;L;27F2F;;;;N;;;;;
+2F9D9;CJK COMPATIBILITY IDEOGRAPH-2F9D9;Lo;0;L;20804;;;;N;;;;;
+2F9DA;CJK COMPATIBILITY IDEOGRAPH-2F9DA;Lo;0;L;8DCB;;;;N;;;;;
+2F9DB;CJK COMPATIBILITY IDEOGRAPH-2F9DB;Lo;0;L;8DBC;;;;N;;;;;
+2F9DC;CJK COMPATIBILITY IDEOGRAPH-2F9DC;Lo;0;L;8DF0;;;;N;;;;;
+2F9DD;CJK COMPATIBILITY IDEOGRAPH-2F9DD;Lo;0;L;208DE;;;;N;;;;;
+2F9DE;CJK COMPATIBILITY IDEOGRAPH-2F9DE;Lo;0;L;8ED4;;;;N;;;;;
+2F9DF;CJK COMPATIBILITY IDEOGRAPH-2F9DF;Lo;0;L;8F38;;;;N;;;;;
+2F9E0;CJK COMPATIBILITY IDEOGRAPH-2F9E0;Lo;0;L;285D2;;;;N;;;;;
+2F9E1;CJK COMPATIBILITY IDEOGRAPH-2F9E1;Lo;0;L;285ED;;;;N;;;;;
+2F9E2;CJK COMPATIBILITY IDEOGRAPH-2F9E2;Lo;0;L;9094;;;;N;;;;;
+2F9E3;CJK COMPATIBILITY IDEOGRAPH-2F9E3;Lo;0;L;90F1;;;;N;;;;;
+2F9E4;CJK COMPATIBILITY IDEOGRAPH-2F9E4;Lo;0;L;9111;;;;N;;;;;
+2F9E5;CJK COMPATIBILITY IDEOGRAPH-2F9E5;Lo;0;L;2872E;;;;N;;;;;
+2F9E6;CJK COMPATIBILITY IDEOGRAPH-2F9E6;Lo;0;L;911B;;;;N;;;;;
+2F9E7;CJK COMPATIBILITY IDEOGRAPH-2F9E7;Lo;0;L;9238;;;;N;;;;;
+2F9E8;CJK COMPATIBILITY IDEOGRAPH-2F9E8;Lo;0;L;92D7;;;;N;;;;;
+2F9E9;CJK COMPATIBILITY IDEOGRAPH-2F9E9;Lo;0;L;92D8;;;;N;;;;;
+2F9EA;CJK COMPATIBILITY IDEOGRAPH-2F9EA;Lo;0;L;927C;;;;N;;;;;
+2F9EB;CJK COMPATIBILITY IDEOGRAPH-2F9EB;Lo;0;L;93F9;;;;N;;;;;
+2F9EC;CJK COMPATIBILITY IDEOGRAPH-2F9EC;Lo;0;L;9415;;;;N;;;;;
+2F9ED;CJK COMPATIBILITY IDEOGRAPH-2F9ED;Lo;0;L;28BFA;;;;N;;;;;
+2F9EE;CJK COMPATIBILITY IDEOGRAPH-2F9EE;Lo;0;L;958B;;;;N;;;;;
+2F9EF;CJK COMPATIBILITY IDEOGRAPH-2F9EF;Lo;0;L;4995;;;;N;;;;;
+2F9F0;CJK COMPATIBILITY IDEOGRAPH-2F9F0;Lo;0;L;95B7;;;;N;;;;;
+2F9F1;CJK COMPATIBILITY IDEOGRAPH-2F9F1;Lo;0;L;28D77;;;;N;;;;;
+2F9F2;CJK COMPATIBILITY IDEOGRAPH-2F9F2;Lo;0;L;49E6;;;;N;;;;;
+2F9F3;CJK COMPATIBILITY IDEOGRAPH-2F9F3;Lo;0;L;96C3;;;;N;;;;;
+2F9F4;CJK COMPATIBILITY IDEOGRAPH-2F9F4;Lo;0;L;5DB2;;;;N;;;;;
+2F9F5;CJK COMPATIBILITY IDEOGRAPH-2F9F5;Lo;0;L;9723;;;;N;;;;;
+2F9F6;CJK COMPATIBILITY IDEOGRAPH-2F9F6;Lo;0;L;29145;;;;N;;;;;
+2F9F7;CJK COMPATIBILITY IDEOGRAPH-2F9F7;Lo;0;L;2921A;;;;N;;;;;
+2F9F8;CJK COMPATIBILITY IDEOGRAPH-2F9F8;Lo;0;L;4A6E;;;;N;;;;;
+2F9F9;CJK COMPATIBILITY IDEOGRAPH-2F9F9;Lo;0;L;4A76;;;;N;;;;;
+2F9FA;CJK COMPATIBILITY IDEOGRAPH-2F9FA;Lo;0;L;97E0;;;;N;;;;;
+2F9FB;CJK COMPATIBILITY IDEOGRAPH-2F9FB;Lo;0;L;2940A;;;;N;;;;;
+2F9FC;CJK COMPATIBILITY IDEOGRAPH-2F9FC;Lo;0;L;4AB2;;;;N;;;;;
+2F9FD;CJK COMPATIBILITY IDEOGRAPH-2F9FD;Lo;0;L;29496;;;;N;;;;;
+2F9FE;CJK COMPATIBILITY IDEOGRAPH-2F9FE;Lo;0;L;980B;;;;N;;;;;
+2F9FF;CJK COMPATIBILITY IDEOGRAPH-2F9FF;Lo;0;L;980B;;;;N;;;;;
+2FA00;CJK COMPATIBILITY IDEOGRAPH-2FA00;Lo;0;L;9829;;;;N;;;;;
+2FA01;CJK COMPATIBILITY IDEOGRAPH-2FA01;Lo;0;L;295B6;;;;N;;;;;
+2FA02;CJK COMPATIBILITY IDEOGRAPH-2FA02;Lo;0;L;98E2;;;;N;;;;;
+2FA03;CJK COMPATIBILITY IDEOGRAPH-2FA03;Lo;0;L;4B33;;;;N;;;;;
+2FA04;CJK COMPATIBILITY IDEOGRAPH-2FA04;Lo;0;L;9929;;;;N;;;;;
+2FA05;CJK COMPATIBILITY IDEOGRAPH-2FA05;Lo;0;L;99A7;;;;N;;;;;
+2FA06;CJK COMPATIBILITY IDEOGRAPH-2FA06;Lo;0;L;99C2;;;;N;;;;;
+2FA07;CJK COMPATIBILITY IDEOGRAPH-2FA07;Lo;0;L;99FE;;;;N;;;;;
+2FA08;CJK COMPATIBILITY IDEOGRAPH-2FA08;Lo;0;L;4BCE;;;;N;;;;;
+2FA09;CJK COMPATIBILITY IDEOGRAPH-2FA09;Lo;0;L;29B30;;;;N;;;;;
+2FA0A;CJK COMPATIBILITY IDEOGRAPH-2FA0A;Lo;0;L;9B12;;;;N;;;;;
+2FA0B;CJK COMPATIBILITY IDEOGRAPH-2FA0B;Lo;0;L;9C40;;;;N;;;;;
+2FA0C;CJK COMPATIBILITY IDEOGRAPH-2FA0C;Lo;0;L;9CFD;;;;N;;;;;
+2FA0D;CJK COMPATIBILITY IDEOGRAPH-2FA0D;Lo;0;L;4CCE;;;;N;;;;;
+2FA0E;CJK COMPATIBILITY IDEOGRAPH-2FA0E;Lo;0;L;4CED;;;;N;;;;;
+2FA0F;CJK COMPATIBILITY IDEOGRAPH-2FA0F;Lo;0;L;9D67;;;;N;;;;;
+2FA10;CJK COMPATIBILITY IDEOGRAPH-2FA10;Lo;0;L;2A0CE;;;;N;;;;;
+2FA11;CJK COMPATIBILITY IDEOGRAPH-2FA11;Lo;0;L;4CF8;;;;N;;;;;
+2FA12;CJK COMPATIBILITY IDEOGRAPH-2FA12;Lo;0;L;2A105;;;;N;;;;;
+2FA13;CJK COMPATIBILITY IDEOGRAPH-2FA13;Lo;0;L;2A20E;;;;N;;;;;
+2FA14;CJK COMPATIBILITY IDEOGRAPH-2FA14;Lo;0;L;2A291;;;;N;;;;;
+2FA15;CJK COMPATIBILITY IDEOGRAPH-2FA15;Lo;0;L;9EBB;;;;N;;;;;
+2FA16;CJK COMPATIBILITY IDEOGRAPH-2FA16;Lo;0;L;4D56;;;;N;;;;;
+2FA17;CJK COMPATIBILITY IDEOGRAPH-2FA17;Lo;0;L;9EF9;;;;N;;;;;
+2FA18;CJK COMPATIBILITY IDEOGRAPH-2FA18;Lo;0;L;9EFE;;;;N;;;;;
+2FA19;CJK COMPATIBILITY IDEOGRAPH-2FA19;Lo;0;L;9F05;;;;N;;;;;
+2FA1A;CJK COMPATIBILITY IDEOGRAPH-2FA1A;Lo;0;L;9F0F;;;;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;;;;;
+E0001;LANGUAGE TAG;Cf;0;BN;;;;;N;;;;;
+E0020;TAG SPACE;Cf;0;BN;;;;;N;;;;;
+E0021;TAG EXCLAMATION MARK;Cf;0;BN;;;;;N;;;;;
+E0022;TAG QUOTATION MARK;Cf;0;BN;;;;;N;;;;;
+E0023;TAG NUMBER SIGN;Cf;0;BN;;;;;N;;;;;
+E0024;TAG DOLLAR SIGN;Cf;0;BN;;;;;N;;;;;
+E0025;TAG PERCENT SIGN;Cf;0;BN;;;;;N;;;;;
+E0026;TAG AMPERSAND;Cf;0;BN;;;;;N;;;;;
+E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;;
+E0028;TAG LEFT PARENTHESIS;Cf;0;BN;;;;;N;;;;;
+E0029;TAG RIGHT PARENTHESIS;Cf;0;BN;;;;;N;;;;;
+E002A;TAG ASTERISK;Cf;0;BN;;;;;N;;;;;
+E002B;TAG PLUS SIGN;Cf;0;BN;;;;;N;;;;;
+E002C;TAG COMMA;Cf;0;BN;;;;;N;;;;;
+E002D;TAG HYPHEN-MINUS;Cf;0;BN;;;;;N;;;;;
+E002E;TAG FULL STOP;Cf;0;BN;;;;;N;;;;;
+E002F;TAG SOLIDUS;Cf;0;BN;;;;;N;;;;;
+E0030;TAG DIGIT ZERO;Cf;0;BN;;;;;N;;;;;
+E0031;TAG DIGIT ONE;Cf;0;BN;;;;;N;;;;;
+E0032;TAG DIGIT TWO;Cf;0;BN;;;;;N;;;;;
+E0033;TAG DIGIT THREE;Cf;0;BN;;;;;N;;;;;
+E0034;TAG DIGIT FOUR;Cf;0;BN;;;;;N;;;;;
+E0035;TAG DIGIT FIVE;Cf;0;BN;;;;;N;;;;;
+E0036;TAG DIGIT SIX;Cf;0;BN;;;;;N;;;;;
+E0037;TAG DIGIT SEVEN;Cf;0;BN;;;;;N;;;;;
+E0038;TAG DIGIT EIGHT;Cf;0;BN;;;;;N;;;;;
+E0039;TAG DIGIT NINE;Cf;0;BN;;;;;N;;;;;
+E003A;TAG COLON;Cf;0;BN;;;;;N;;;;;
+E003B;TAG SEMICOLON;Cf;0;BN;;;;;N;;;;;
+E003C;TAG LESS-THAN SIGN;Cf;0;BN;;;;;N;;;;;
+E003D;TAG EQUALS SIGN;Cf;0;BN;;;;;N;;;;;
+E003E;TAG GREATER-THAN SIGN;Cf;0;BN;;;;;N;;;;;
+E003F;TAG QUESTION MARK;Cf;0;BN;;;;;N;;;;;
+E0040;TAG COMMERCIAL AT;Cf;0;BN;;;;;N;;;;;
+E0041;TAG LATIN CAPITAL LETTER A;Cf;0;BN;;;;;N;;;;;
+E0042;TAG LATIN CAPITAL LETTER B;Cf;0;BN;;;;;N;;;;;
+E0043;TAG LATIN CAPITAL LETTER C;Cf;0;BN;;;;;N;;;;;
+E0044;TAG LATIN CAPITAL LETTER D;Cf;0;BN;;;;;N;;;;;
+E0045;TAG LATIN CAPITAL LETTER E;Cf;0;BN;;;;;N;;;;;
+E0046;TAG LATIN CAPITAL LETTER F;Cf;0;BN;;;;;N;;;;;
+E0047;TAG LATIN CAPITAL LETTER G;Cf;0;BN;;;;;N;;;;;
+E0048;TAG LATIN CAPITAL LETTER H;Cf;0;BN;;;;;N;;;;;
+E0049;TAG LATIN CAPITAL LETTER I;Cf;0;BN;;;;;N;;;;;
+E004A;TAG LATIN CAPITAL LETTER J;Cf;0;BN;;;;;N;;;;;
+E004B;TAG LATIN CAPITAL LETTER K;Cf;0;BN;;;;;N;;;;;
+E004C;TAG LATIN CAPITAL LETTER L;Cf;0;BN;;;;;N;;;;;
+E004D;TAG LATIN CAPITAL LETTER M;Cf;0;BN;;;;;N;;;;;
+E004E;TAG LATIN CAPITAL LETTER N;Cf;0;BN;;;;;N;;;;;
+E004F;TAG LATIN CAPITAL LETTER O;Cf;0;BN;;;;;N;;;;;
+E0050;TAG LATIN CAPITAL LETTER P;Cf;0;BN;;;;;N;;;;;
+E0051;TAG LATIN CAPITAL LETTER Q;Cf;0;BN;;;;;N;;;;;
+E0052;TAG LATIN CAPITAL LETTER R;Cf;0;BN;;;;;N;;;;;
+E0053;TAG LATIN CAPITAL LETTER S;Cf;0;BN;;;;;N;;;;;
+E0054;TAG LATIN CAPITAL LETTER T;Cf;0;BN;;;;;N;;;;;
+E0055;TAG LATIN CAPITAL LETTER U;Cf;0;BN;;;;;N;;;;;
+E0056;TAG LATIN CAPITAL LETTER V;Cf;0;BN;;;;;N;;;;;
+E0057;TAG LATIN CAPITAL LETTER W;Cf;0;BN;;;;;N;;;;;
+E0058;TAG LATIN CAPITAL LETTER X;Cf;0;BN;;;;;N;;;;;
+E0059;TAG LATIN CAPITAL LETTER Y;Cf;0;BN;;;;;N;;;;;
+E005A;TAG LATIN CAPITAL LETTER Z;Cf;0;BN;;;;;N;;;;;
+E005B;TAG LEFT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;;
+E005C;TAG REVERSE SOLIDUS;Cf;0;BN;;;;;N;;;;;
+E005D;TAG RIGHT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;;
+E005E;TAG CIRCUMFLEX ACCENT;Cf;0;BN;;;;;N;;;;;
+E005F;TAG LOW LINE;Cf;0;BN;;;;;N;;;;;
+E0060;TAG GRAVE ACCENT;Cf;0;BN;;;;;N;;;;;
+E0061;TAG LATIN SMALL LETTER A;Cf;0;BN;;;;;N;;;;;
+E0062;TAG LATIN SMALL LETTER B;Cf;0;BN;;;;;N;;;;;
+E0063;TAG LATIN SMALL LETTER C;Cf;0;BN;;;;;N;;;;;
+E0064;TAG LATIN SMALL LETTER D;Cf;0;BN;;;;;N;;;;;
+E0065;TAG LATIN SMALL LETTER E;Cf;0;BN;;;;;N;;;;;
+E0066;TAG LATIN SMALL LETTER F;Cf;0;BN;;;;;N;;;;;
+E0067;TAG LATIN SMALL LETTER G;Cf;0;BN;;;;;N;;;;;
+E0068;TAG LATIN SMALL LETTER H;Cf;0;BN;;;;;N;;;;;
+E0069;TAG LATIN SMALL LETTER I;Cf;0;BN;;;;;N;;;;;
+E006A;TAG LATIN SMALL LETTER J;Cf;0;BN;;;;;N;;;;;
+E006B;TAG LATIN SMALL LETTER K;Cf;0;BN;;;;;N;;;;;
+E006C;TAG LATIN SMALL LETTER L;Cf;0;BN;;;;;N;;;;;
+E006D;TAG LATIN SMALL LETTER M;Cf;0;BN;;;;;N;;;;;
+E006E;TAG LATIN SMALL LETTER N;Cf;0;BN;;;;;N;;;;;
+E006F;TAG LATIN SMALL LETTER O;Cf;0;BN;;;;;N;;;;;
+E0070;TAG LATIN SMALL LETTER P;Cf;0;BN;;;;;N;;;;;
+E0071;TAG LATIN SMALL LETTER Q;Cf;0;BN;;;;;N;;;;;
+E0072;TAG LATIN SMALL LETTER R;Cf;0;BN;;;;;N;;;;;
+E0073;TAG LATIN SMALL LETTER S;Cf;0;BN;;;;;N;;;;;
+E0074;TAG LATIN SMALL LETTER T;Cf;0;BN;;;;;N;;;;;
+E0075;TAG LATIN SMALL LETTER U;Cf;0;BN;;;;;N;;;;;
+E0076;TAG LATIN SMALL LETTER V;Cf;0;BN;;;;;N;;;;;
+E0077;TAG LATIN SMALL LETTER W;Cf;0;BN;;;;;N;;;;;
+E0078;TAG LATIN SMALL LETTER X;Cf;0;BN;;;;;N;;;;;
+E0079;TAG LATIN SMALL LETTER Y;Cf;0;BN;;;;;N;;;;;
+E007A;TAG LATIN SMALL LETTER Z;Cf;0;BN;;;;;N;;;;;
+E007B;TAG LEFT CURLY BRACKET;Cf;0;BN;;;;;N;;;;;
+E007C;TAG VERTICAL LINE;Cf;0;BN;;;;;N;;;;;
+E007D;TAG RIGHT CURLY BRACKET;Cf;0;BN;;;;;N;;;;;
+E007E;TAG TILDE;Cf;0;BN;;;;;N;;;;;
+E007F;CANCEL TAG;Cf;0;BN;;;;;N;;;;;
+E0100;VARIATION SELECTOR-17;Mn;0;NSM;;;;;N;;;;;
+E0101;VARIATION SELECTOR-18;Mn;0;NSM;;;;;N;;;;;
+E0102;VARIATION SELECTOR-19;Mn;0;NSM;;;;;N;;;;;
+E0103;VARIATION SELECTOR-20;Mn;0;NSM;;;;;N;;;;;
+E0104;VARIATION SELECTOR-21;Mn;0;NSM;;;;;N;;;;;
+E0105;VARIATION SELECTOR-22;Mn;0;NSM;;;;;N;;;;;
+E0106;VARIATION SELECTOR-23;Mn;0;NSM;;;;;N;;;;;
+E0107;VARIATION SELECTOR-24;Mn;0;NSM;;;;;N;;;;;
+E0108;VARIATION SELECTOR-25;Mn;0;NSM;;;;;N;;;;;
+E0109;VARIATION SELECTOR-26;Mn;0;NSM;;;;;N;;;;;
+E010A;VARIATION SELECTOR-27;Mn;0;NSM;;;;;N;;;;;
+E010B;VARIATION SELECTOR-28;Mn;0;NSM;;;;;N;;;;;
+E010C;VARIATION SELECTOR-29;Mn;0;NSM;;;;;N;;;;;
+E010D;VARIATION SELECTOR-30;Mn;0;NSM;;;;;N;;;;;
+E010E;VARIATION SELECTOR-31;Mn;0;NSM;;;;;N;;;;;
+E010F;VARIATION SELECTOR-32;Mn;0;NSM;;;;;N;;;;;
+E0110;VARIATION SELECTOR-33;Mn;0;NSM;;;;;N;;;;;
+E0111;VARIATION SELECTOR-34;Mn;0;NSM;;;;;N;;;;;
+E0112;VARIATION SELECTOR-35;Mn;0;NSM;;;;;N;;;;;
+E0113;VARIATION SELECTOR-36;Mn;0;NSM;;;;;N;;;;;
+E0114;VARIATION SELECTOR-37;Mn;0;NSM;;;;;N;;;;;
+E0115;VARIATION SELECTOR-38;Mn;0;NSM;;;;;N;;;;;
+E0116;VARIATION SELECTOR-39;Mn;0;NSM;;;;;N;;;;;
+E0117;VARIATION SELECTOR-40;Mn;0;NSM;;;;;N;;;;;
+E0118;VARIATION SELECTOR-41;Mn;0;NSM;;;;;N;;;;;
+E0119;VARIATION SELECTOR-42;Mn;0;NSM;;;;;N;;;;;
+E011A;VARIATION SELECTOR-43;Mn;0;NSM;;;;;N;;;;;
+E011B;VARIATION SELECTOR-44;Mn;0;NSM;;;;;N;;;;;
+E011C;VARIATION SELECTOR-45;Mn;0;NSM;;;;;N;;;;;
+E011D;VARIATION SELECTOR-46;Mn;0;NSM;;;;;N;;;;;
+E011E;VARIATION SELECTOR-47;Mn;0;NSM;;;;;N;;;;;
+E011F;VARIATION SELECTOR-48;Mn;0;NSM;;;;;N;;;;;
+E0120;VARIATION SELECTOR-49;Mn;0;NSM;;;;;N;;;;;
+E0121;VARIATION SELECTOR-50;Mn;0;NSM;;;;;N;;;;;
+E0122;VARIATION SELECTOR-51;Mn;0;NSM;;;;;N;;;;;
+E0123;VARIATION SELECTOR-52;Mn;0;NSM;;;;;N;;;;;
+E0124;VARIATION SELECTOR-53;Mn;0;NSM;;;;;N;;;;;
+E0125;VARIATION SELECTOR-54;Mn;0;NSM;;;;;N;;;;;
+E0126;VARIATION SELECTOR-55;Mn;0;NSM;;;;;N;;;;;
+E0127;VARIATION SELECTOR-56;Mn;0;NSM;;;;;N;;;;;
+E0128;VARIATION SELECTOR-57;Mn;0;NSM;;;;;N;;;;;
+E0129;VARIATION SELECTOR-58;Mn;0;NSM;;;;;N;;;;;
+E012A;VARIATION SELECTOR-59;Mn;0;NSM;;;;;N;;;;;
+E012B;VARIATION SELECTOR-60;Mn;0;NSM;;;;;N;;;;;
+E012C;VARIATION SELECTOR-61;Mn;0;NSM;;;;;N;;;;;
+E012D;VARIATION SELECTOR-62;Mn;0;NSM;;;;;N;;;;;
+E012E;VARIATION SELECTOR-63;Mn;0;NSM;;;;;N;;;;;
+E012F;VARIATION SELECTOR-64;Mn;0;NSM;;;;;N;;;;;
+E0130;VARIATION SELECTOR-65;Mn;0;NSM;;;;;N;;;;;
+E0131;VARIATION SELECTOR-66;Mn;0;NSM;;;;;N;;;;;
+E0132;VARIATION SELECTOR-67;Mn;0;NSM;;;;;N;;;;;
+E0133;VARIATION SELECTOR-68;Mn;0;NSM;;;;;N;;;;;
+E0134;VARIATION SELECTOR-69;Mn;0;NSM;;;;;N;;;;;
+E0135;VARIATION SELECTOR-70;Mn;0;NSM;;;;;N;;;;;
+E0136;VARIATION SELECTOR-71;Mn;0;NSM;;;;;N;;;;;
+E0137;VARIATION SELECTOR-72;Mn;0;NSM;;;;;N;;;;;
+E0138;VARIATION SELECTOR-73;Mn;0;NSM;;;;;N;;;;;
+E0139;VARIATION SELECTOR-74;Mn;0;NSM;;;;;N;;;;;
+E013A;VARIATION SELECTOR-75;Mn;0;NSM;;;;;N;;;;;
+E013B;VARIATION SELECTOR-76;Mn;0;NSM;;;;;N;;;;;
+E013C;VARIATION SELECTOR-77;Mn;0;NSM;;;;;N;;;;;
+E013D;VARIATION SELECTOR-78;Mn;0;NSM;;;;;N;;;;;
+E013E;VARIATION SELECTOR-79;Mn;0;NSM;;;;;N;;;;;
+E013F;VARIATION SELECTOR-80;Mn;0;NSM;;;;;N;;;;;
+E0140;VARIATION SELECTOR-81;Mn;0;NSM;;;;;N;;;;;
+E0141;VARIATION SELECTOR-82;Mn;0;NSM;;;;;N;;;;;
+E0142;VARIATION SELECTOR-83;Mn;0;NSM;;;;;N;;;;;
+E0143;VARIATION SELECTOR-84;Mn;0;NSM;;;;;N;;;;;
+E0144;VARIATION SELECTOR-85;Mn;0;NSM;;;;;N;;;;;
+E0145;VARIATION SELECTOR-86;Mn;0;NSM;;;;;N;;;;;
+E0146;VARIATION SELECTOR-87;Mn;0;NSM;;;;;N;;;;;
+E0147;VARIATION SELECTOR-88;Mn;0;NSM;;;;;N;;;;;
+E0148;VARIATION SELECTOR-89;Mn;0;NSM;;;;;N;;;;;
+E0149;VARIATION SELECTOR-90;Mn;0;NSM;;;;;N;;;;;
+E014A;VARIATION SELECTOR-91;Mn;0;NSM;;;;;N;;;;;
+E014B;VARIATION SELECTOR-92;Mn;0;NSM;;;;;N;;;;;
+E014C;VARIATION SELECTOR-93;Mn;0;NSM;;;;;N;;;;;
+E014D;VARIATION SELECTOR-94;Mn;0;NSM;;;;;N;;;;;
+E014E;VARIATION SELECTOR-95;Mn;0;NSM;;;;;N;;;;;
+E014F;VARIATION SELECTOR-96;Mn;0;NSM;;;;;N;;;;;
+E0150;VARIATION SELECTOR-97;Mn;0;NSM;;;;;N;;;;;
+E0151;VARIATION SELECTOR-98;Mn;0;NSM;;;;;N;;;;;
+E0152;VARIATION SELECTOR-99;Mn;0;NSM;;;;;N;;;;;
+E0153;VARIATION SELECTOR-100;Mn;0;NSM;;;;;N;;;;;
+E0154;VARIATION SELECTOR-101;Mn;0;NSM;;;;;N;;;;;
+E0155;VARIATION SELECTOR-102;Mn;0;NSM;;;;;N;;;;;
+E0156;VARIATION SELECTOR-103;Mn;0;NSM;;;;;N;;;;;
+E0157;VARIATION SELECTOR-104;Mn;0;NSM;;;;;N;;;;;
+E0158;VARIATION SELECTOR-105;Mn;0;NSM;;;;;N;;;;;
+E0159;VARIATION SELECTOR-106;Mn;0;NSM;;;;;N;;;;;
+E015A;VARIATION SELECTOR-107;Mn;0;NSM;;;;;N;;;;;
+E015B;VARIATION SELECTOR-108;Mn;0;NSM;;;;;N;;;;;
+E015C;VARIATION SELECTOR-109;Mn;0;NSM;;;;;N;;;;;
+E015D;VARIATION SELECTOR-110;Mn;0;NSM;;;;;N;;;;;
+E015E;VARIATION SELECTOR-111;Mn;0;NSM;;;;;N;;;;;
+E015F;VARIATION SELECTOR-112;Mn;0;NSM;;;;;N;;;;;
+E0160;VARIATION SELECTOR-113;Mn;0;NSM;;;;;N;;;;;
+E0161;VARIATION SELECTOR-114;Mn;0;NSM;;;;;N;;;;;
+E0162;VARIATION SELECTOR-115;Mn;0;NSM;;;;;N;;;;;
+E0163;VARIATION SELECTOR-116;Mn;0;NSM;;;;;N;;;;;
+E0164;VARIATION SELECTOR-117;Mn;0;NSM;;;;;N;;;;;
+E0165;VARIATION SELECTOR-118;Mn;0;NSM;;;;;N;;;;;
+E0166;VARIATION SELECTOR-119;Mn;0;NSM;;;;;N;;;;;
+E0167;VARIATION SELECTOR-120;Mn;0;NSM;;;;;N;;;;;
+E0168;VARIATION SELECTOR-121;Mn;0;NSM;;;;;N;;;;;
+E0169;VARIATION SELECTOR-122;Mn;0;NSM;;;;;N;;;;;
+E016A;VARIATION SELECTOR-123;Mn;0;NSM;;;;;N;;;;;
+E016B;VARIATION SELECTOR-124;Mn;0;NSM;;;;;N;;;;;
+E016C;VARIATION SELECTOR-125;Mn;0;NSM;;;;;N;;;;;
+E016D;VARIATION SELECTOR-126;Mn;0;NSM;;;;;N;;;;;
+E016E;VARIATION SELECTOR-127;Mn;0;NSM;;;;;N;;;;;
+E016F;VARIATION SELECTOR-128;Mn;0;NSM;;;;;N;;;;;
+E0170;VARIATION SELECTOR-129;Mn;0;NSM;;;;;N;;;;;
+E0171;VARIATION SELECTOR-130;Mn;0;NSM;;;;;N;;;;;
+E0172;VARIATION SELECTOR-131;Mn;0;NSM;;;;;N;;;;;
+E0173;VARIATION SELECTOR-132;Mn;0;NSM;;;;;N;;;;;
+E0174;VARIATION SELECTOR-133;Mn;0;NSM;;;;;N;;;;;
+E0175;VARIATION SELECTOR-134;Mn;0;NSM;;;;;N;;;;;
+E0176;VARIATION SELECTOR-135;Mn;0;NSM;;;;;N;;;;;
+E0177;VARIATION SELECTOR-136;Mn;0;NSM;;;;;N;;;;;
+E0178;VARIATION SELECTOR-137;Mn;0;NSM;;;;;N;;;;;
+E0179;VARIATION SELECTOR-138;Mn;0;NSM;;;;;N;;;;;
+E017A;VARIATION SELECTOR-139;Mn;0;NSM;;;;;N;;;;;
+E017B;VARIATION SELECTOR-140;Mn;0;NSM;;;;;N;;;;;
+E017C;VARIATION SELECTOR-141;Mn;0;NSM;;;;;N;;;;;
+E017D;VARIATION SELECTOR-142;Mn;0;NSM;;;;;N;;;;;
+E017E;VARIATION SELECTOR-143;Mn;0;NSM;;;;;N;;;;;
+E017F;VARIATION SELECTOR-144;Mn;0;NSM;;;;;N;;;;;
+E0180;VARIATION SELECTOR-145;Mn;0;NSM;;;;;N;;;;;
+E0181;VARIATION SELECTOR-146;Mn;0;NSM;;;;;N;;;;;
+E0182;VARIATION SELECTOR-147;Mn;0;NSM;;;;;N;;;;;
+E0183;VARIATION SELECTOR-148;Mn;0;NSM;;;;;N;;;;;
+E0184;VARIATION SELECTOR-149;Mn;0;NSM;;;;;N;;;;;
+E0185;VARIATION SELECTOR-150;Mn;0;NSM;;;;;N;;;;;
+E0186;VARIATION SELECTOR-151;Mn;0;NSM;;;;;N;;;;;
+E0187;VARIATION SELECTOR-152;Mn;0;NSM;;;;;N;;;;;
+E0188;VARIATION SELECTOR-153;Mn;0;NSM;;;;;N;;;;;
+E0189;VARIATION SELECTOR-154;Mn;0;NSM;;;;;N;;;;;
+E018A;VARIATION SELECTOR-155;Mn;0;NSM;;;;;N;;;;;
+E018B;VARIATION SELECTOR-156;Mn;0;NSM;;;;;N;;;;;
+E018C;VARIATION SELECTOR-157;Mn;0;NSM;;;;;N;;;;;
+E018D;VARIATION SELECTOR-158;Mn;0;NSM;;;;;N;;;;;
+E018E;VARIATION SELECTOR-159;Mn;0;NSM;;;;;N;;;;;
+E018F;VARIATION SELECTOR-160;Mn;0;NSM;;;;;N;;;;;
+E0190;VARIATION SELECTOR-161;Mn;0;NSM;;;;;N;;;;;
+E0191;VARIATION SELECTOR-162;Mn;0;NSM;;;;;N;;;;;
+E0192;VARIATION SELECTOR-163;Mn;0;NSM;;;;;N;;;;;
+E0193;VARIATION SELECTOR-164;Mn;0;NSM;;;;;N;;;;;
+E0194;VARIATION SELECTOR-165;Mn;0;NSM;;;;;N;;;;;
+E0195;VARIATION SELECTOR-166;Mn;0;NSM;;;;;N;;;;;
+E0196;VARIATION SELECTOR-167;Mn;0;NSM;;;;;N;;;;;
+E0197;VARIATION SELECTOR-168;Mn;0;NSM;;;;;N;;;;;
+E0198;VARIATION SELECTOR-169;Mn;0;NSM;;;;;N;;;;;
+E0199;VARIATION SELECTOR-170;Mn;0;NSM;;;;;N;;;;;
+E019A;VARIATION SELECTOR-171;Mn;0;NSM;;;;;N;;;;;
+E019B;VARIATION SELECTOR-172;Mn;0;NSM;;;;;N;;;;;
+E019C;VARIATION SELECTOR-173;Mn;0;NSM;;;;;N;;;;;
+E019D;VARIATION SELECTOR-174;Mn;0;NSM;;;;;N;;;;;
+E019E;VARIATION SELECTOR-175;Mn;0;NSM;;;;;N;;;;;
+E019F;VARIATION SELECTOR-176;Mn;0;NSM;;;;;N;;;;;
+E01A0;VARIATION SELECTOR-177;Mn;0;NSM;;;;;N;;;;;
+E01A1;VARIATION SELECTOR-178;Mn;0;NSM;;;;;N;;;;;
+E01A2;VARIATION SELECTOR-179;Mn;0;NSM;;;;;N;;;;;
+E01A3;VARIATION SELECTOR-180;Mn;0;NSM;;;;;N;;;;;
+E01A4;VARIATION SELECTOR-181;Mn;0;NSM;;;;;N;;;;;
+E01A5;VARIATION SELECTOR-182;Mn;0;NSM;;;;;N;;;;;
+E01A6;VARIATION SELECTOR-183;Mn;0;NSM;;;;;N;;;;;
+E01A7;VARIATION SELECTOR-184;Mn;0;NSM;;;;;N;;;;;
+E01A8;VARIATION SELECTOR-185;Mn;0;NSM;;;;;N;;;;;
+E01A9;VARIATION SELECTOR-186;Mn;0;NSM;;;;;N;;;;;
+E01AA;VARIATION SELECTOR-187;Mn;0;NSM;;;;;N;;;;;
+E01AB;VARIATION SELECTOR-188;Mn;0;NSM;;;;;N;;;;;
+E01AC;VARIATION SELECTOR-189;Mn;0;NSM;;;;;N;;;;;
+E01AD;VARIATION SELECTOR-190;Mn;0;NSM;;;;;N;;;;;
+E01AE;VARIATION SELECTOR-191;Mn;0;NSM;;;;;N;;;;;
+E01AF;VARIATION SELECTOR-192;Mn;0;NSM;;;;;N;;;;;
+E01B0;VARIATION SELECTOR-193;Mn;0;NSM;;;;;N;;;;;
+E01B1;VARIATION SELECTOR-194;Mn;0;NSM;;;;;N;;;;;
+E01B2;VARIATION SELECTOR-195;Mn;0;NSM;;;;;N;;;;;
+E01B3;VARIATION SELECTOR-196;Mn;0;NSM;;;;;N;;;;;
+E01B4;VARIATION SELECTOR-197;Mn;0;NSM;;;;;N;;;;;
+E01B5;VARIATION SELECTOR-198;Mn;0;NSM;;;;;N;;;;;
+E01B6;VARIATION SELECTOR-199;Mn;0;NSM;;;;;N;;;;;
+E01B7;VARIATION SELECTOR-200;Mn;0;NSM;;;;;N;;;;;
+E01B8;VARIATION SELECTOR-201;Mn;0;NSM;;;;;N;;;;;
+E01B9;VARIATION SELECTOR-202;Mn;0;NSM;;;;;N;;;;;
+E01BA;VARIATION SELECTOR-203;Mn;0;NSM;;;;;N;;;;;
+E01BB;VARIATION SELECTOR-204;Mn;0;NSM;;;;;N;;;;;
+E01BC;VARIATION SELECTOR-205;Mn;0;NSM;;;;;N;;;;;
+E01BD;VARIATION SELECTOR-206;Mn;0;NSM;;;;;N;;;;;
+E01BE;VARIATION SELECTOR-207;Mn;0;NSM;;;;;N;;;;;
+E01BF;VARIATION SELECTOR-208;Mn;0;NSM;;;;;N;;;;;
+E01C0;VARIATION SELECTOR-209;Mn;0;NSM;;;;;N;;;;;
+E01C1;VARIATION SELECTOR-210;Mn;0;NSM;;;;;N;;;;;
+E01C2;VARIATION SELECTOR-211;Mn;0;NSM;;;;;N;;;;;
+E01C3;VARIATION SELECTOR-212;Mn;0;NSM;;;;;N;;;;;
+E01C4;VARIATION SELECTOR-213;Mn;0;NSM;;;;;N;;;;;
+E01C5;VARIATION SELECTOR-214;Mn;0;NSM;;;;;N;;;;;
+E01C6;VARIATION SELECTOR-215;Mn;0;NSM;;;;;N;;;;;
+E01C7;VARIATION SELECTOR-216;Mn;0;NSM;;;;;N;;;;;
+E01C8;VARIATION SELECTOR-217;Mn;0;NSM;;;;;N;;;;;
+E01C9;VARIATION SELECTOR-218;Mn;0;NSM;;;;;N;;;;;
+E01CA;VARIATION SELECTOR-219;Mn;0;NSM;;;;;N;;;;;
+E01CB;VARIATION SELECTOR-220;Mn;0;NSM;;;;;N;;;;;
+E01CC;VARIATION SELECTOR-221;Mn;0;NSM;;;;;N;;;;;
+E01CD;VARIATION SELECTOR-222;Mn;0;NSM;;;;;N;;;;;
+E01CE;VARIATION SELECTOR-223;Mn;0;NSM;;;;;N;;;;;
+E01CF;VARIATION SELECTOR-224;Mn;0;NSM;;;;;N;;;;;
+E01D0;VARIATION SELECTOR-225;Mn;0;NSM;;;;;N;;;;;
+E01D1;VARIATION SELECTOR-226;Mn;0;NSM;;;;;N;;;;;
+E01D2;VARIATION SELECTOR-227;Mn;0;NSM;;;;;N;;;;;
+E01D3;VARIATION SELECTOR-228;Mn;0;NSM;;;;;N;;;;;
+E01D4;VARIATION SELECTOR-229;Mn;0;NSM;;;;;N;;;;;
+E01D5;VARIATION SELECTOR-230;Mn;0;NSM;;;;;N;;;;;
+E01D6;VARIATION SELECTOR-231;Mn;0;NSM;;;;;N;;;;;
+E01D7;VARIATION SELECTOR-232;Mn;0;NSM;;;;;N;;;;;
+E01D8;VARIATION SELECTOR-233;Mn;0;NSM;;;;;N;;;;;
+E01D9;VARIATION SELECTOR-234;Mn;0;NSM;;;;;N;;;;;
+E01DA;VARIATION SELECTOR-235;Mn;0;NSM;;;;;N;;;;;
+E01DB;VARIATION SELECTOR-236;Mn;0;NSM;;;;;N;;;;;
+E01DC;VARIATION SELECTOR-237;Mn;0;NSM;;;;;N;;;;;
+E01DD;VARIATION SELECTOR-238;Mn;0;NSM;;;;;N;;;;;
+E01DE;VARIATION SELECTOR-239;Mn;0;NSM;;;;;N;;;;;
+E01DF;VARIATION SELECTOR-240;Mn;0;NSM;;;;;N;;;;;
+E01E0;VARIATION SELECTOR-241;Mn;0;NSM;;;;;N;;;;;
+E01E1;VARIATION SELECTOR-242;Mn;0;NSM;;;;;N;;;;;
+E01E2;VARIATION SELECTOR-243;Mn;0;NSM;;;;;N;;;;;
+E01E3;VARIATION SELECTOR-244;Mn;0;NSM;;;;;N;;;;;
+E01E4;VARIATION SELECTOR-245;Mn;0;NSM;;;;;N;;;;;
+E01E5;VARIATION SELECTOR-246;Mn;0;NSM;;;;;N;;;;;
+E01E6;VARIATION SELECTOR-247;Mn;0;NSM;;;;;N;;;;;
+E01E7;VARIATION SELECTOR-248;Mn;0;NSM;;;;;N;;;;;
+E01E8;VARIATION SELECTOR-249;Mn;0;NSM;;;;;N;;;;;
+E01E9;VARIATION SELECTOR-250;Mn;0;NSM;;;;;N;;;;;
+E01EA;VARIATION SELECTOR-251;Mn;0;NSM;;;;;N;;;;;
+E01EB;VARIATION SELECTOR-252;Mn;0;NSM;;;;;N;;;;;
+E01EC;VARIATION SELECTOR-253;Mn;0;NSM;;;;;N;;;;;
+E01ED;VARIATION SELECTOR-254;Mn;0;NSM;;;;;N;;;;;
+E01EE;VARIATION SELECTOR-255;Mn;0;NSM;;;;;N;;;;;
+E01EF;VARIATION SELECTOR-256;Mn;0;NSM;;;;;N;;;;;
+F0000;<Plane 15 Private Use, First>;Co;0;L;;;;;N;;;;;
+FFFFD;<Plane 15 Private Use, Last>;Co;0;L;;;;;N;;;;;
+100000;<Plane 16 Private Use, First>;Co;0;L;;;;;N;;;;;
+10FFFD;<Plane 16 Private Use, Last>;Co;0;L;;;;;N;;;;;
diff --git a/test/functional/fixtures/non_executable.txt b/test/functional/fixtures/non_executable.txt
new file mode 100644
index 0000000000..cc27ecc664
--- /dev/null
+++ b/test/functional/fixtures/non_executable.txt
@@ -0,0 +1 @@
+This file is not an executable
diff --git a/test/functional/fixtures/printargs-test.c b/test/functional/fixtures/printargs-test.c
new file mode 100644
index 0000000000..be54605817
--- /dev/null
+++ b/test/functional/fixtures/printargs-test.c
@@ -0,0 +1,12 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+#include <stdio.h>
+
+int main(int argc, char **argv)
+{
+ for (int i=1; i<argc; i++) {
+ printf("arg%d=%s;", i, argv[i]);
+ }
+ return 0;
+}
diff --git a/test/functional/fixtures/shell-test.c b/test/functional/fixtures/shell-test.c
index d9ec254aff..a744d5df46 100644
--- a/test/functional/fixtures/shell-test.c
+++ b/test/functional/fixtures/shell-test.c
@@ -1,6 +1,21 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <stdio.h>
#include <string.h>
#include <stdint.h>
+#ifdef _MSC_VER
+#include <Windows.h>
+#define usleep(usecs) Sleep(usecs/1000)
+#else
+#include <unistd.h>
+#endif
+
+static void wait(void)
+{
+ fflush(stdout);
+ usleep(10*1000);
+}
static void help(void)
{
@@ -12,8 +27,12 @@ static void help(void)
puts(" shell-test");
puts(" shell-test EXE");
puts(" Prints \"ready $ \" to stderr.");
+ puts(" shell-test -t {prompt text}");
+ puts(" Prints \"{prompt text} $ \" to stderr.");
puts(" shell-test EXE \"prog args...\"");
puts(" Prints \"ready $ prog args...\\n\" to stderr.");
+ puts(" shell-test -t {prompt text} EXE \"prog args...\"");
+ puts(" Prints \"{prompt text} $ progs args...\" to stderr.");
puts(" shell-test REP {byte} \"line line line\"");
puts(" Prints \"{lnr}: line line line\\n\" to stdout {byte} times.");
puts(" I.e. for `shell-test REP ab \"test\"'");
@@ -30,7 +49,17 @@ int main(int argc, char **argv)
}
if (argc >= 2) {
- if (strcmp(argv[1], "EXE") == 0) {
+ if (strcmp(argv[1], "-t") == 0) {
+ if (argc < 3) {
+ fprintf(stderr,"Missing prompt text for -t option\n");
+ return 5;
+ } else {
+ fprintf(stderr, "%s $ ", argv[2]);
+ if (argc >= 5 && (strcmp(argv[3], "EXE") == 0)) {
+ fprintf(stderr, "%s\n", argv[4]);
+ }
+ }
+ } else if (strcmp(argv[1], "EXE") == 0) {
fprintf(stderr, "ready $ ");
if (argc >= 3) {
fprintf(stderr, "%s\n", argv[2]);
@@ -44,6 +73,22 @@ int main(int argc, char **argv)
for (uint8_t i = 0; i < number; i++) {
printf("%d: %s\n", (int) i, argv[3]);
}
+ } else if (strcmp(argv[1], "UTF-8") == 0) {
+ // test split-up UTF-8 sequence
+ printf("\xc3"); wait();
+ printf("\xa5\n"); wait();
+
+ // split up a 2+2 grapheme clusters all possible ways
+ printf("ref: \xc3\xa5\xcc\xb2\n"); wait();
+
+ printf("1: \xc3"); wait();
+ printf("\xa5\xcc\xb2\n"); wait();
+
+ printf("2: \xc3\xa5"); wait();
+ printf("\xcc\xb2\n"); wait();
+
+ printf("3: \xc3\xa5\xcc"); wait();
+ printf("\xb2\n"); wait();
} else {
fprintf(stderr, "Unknown first argument\n");
return 3;
diff --git a/test/functional/fixtures/shell_data.txt b/test/functional/fixtures/shell_data.txt
new file mode 100644
index 0000000000..ef3506c5b1
--- /dev/null
+++ b/test/functional/fixtures/shell_data.txt
Binary files differ
diff --git a/test/functional/fixtures/tty-test.c b/test/functional/fixtures/tty-test.c
index 40ba131003..5f1f5cb91c 100644
--- a/test/functional/fixtures/tty-test.c
+++ b/test/functional/fixtures/tty-test.c
@@ -1,50 +1,73 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <uv.h>
+#ifdef _WIN32
+# include <windows.h>
+#else
+# include <unistd.h>
+#endif
+
+// -V:STRUCT_CAST:641
+#define STRUCT_CAST(Type, obj) ((Type *)(obj))
+#define is_terminal(stream) (uv_guess_handle(fileno(stream)) == UV_TTY)
+#define BUF_SIZE 0xfff
+#define CTRL_C 0x03
uv_tty_t tty;
+uv_tty_t tty_out;
-#ifdef _WIN32
-#include <windows.h>
bool owns_tty(void)
{
- HWND consoleWnd = GetConsoleWindow();
- DWORD dwProcessId;
- GetWindowThreadProcessId(consoleWnd, &dwProcessId);
- return GetCurrentProcessId() == dwProcessId;
-}
+#ifdef _WIN32
+ // XXX: We need to make proper detect owns tty
+ // HWND consoleWnd = GetConsoleWindow();
+ // DWORD dwProcessId;
+ // GetWindowThreadProcessId(consoleWnd, &dwProcessId);
+ // return GetCurrentProcessId() == dwProcessId;
+ return true;
#else
-#include <unistd.h>
-bool owns_tty(void)
-{
return getsid(0) == getpid();
-}
#endif
+}
-#define is_terminal(stream) (uv_guess_handle(fileno(stream)) == UV_TTY)
-#define BUF_SIZE 0xfff
-
-static void walk_cb(uv_handle_t *handle, void *arg) {
+static void walk_cb(uv_handle_t *handle, void *arg)
+{
if (!uv_is_closing(handle)) {
uv_close(handle, NULL);
}
}
-static void sigwinch_handler(int signum)
+#ifndef WIN32
+static void sig_handler(int signum)
+{
+ switch (signum) {
+ case SIGWINCH: {
+ int width, height;
+ uv_tty_get_winsize(&tty, &width, &height);
+ fprintf(stderr, "rows: %d, cols: %d\n", height, width);
+ return;
+ }
+ case SIGHUP:
+ exit(42); // arbitrary exit code to test against
+ return;
+ default:
+ return;
+ }
+}
+#endif
+
+#ifdef WIN32
+static void sigwinch_cb(uv_signal_t *handle, int signum)
{
int width, height;
- uv_tty_get_winsize(&tty, &width, &height);
+ uv_tty_get_winsize(&tty_out, &width, &height);
fprintf(stderr, "rows: %d, cols: %d\n", height, width);
}
-
-// static void sigwinch_cb(uv_signal_t *handle, int signum)
-// {
-// int width, height;
-// uv_tty_t *tty = handle->data;
-// uv_tty_get_winsize(tty, &width, &height);
-// fprintf(stderr, "rows: %d, cols: %d\n", height, width);
-// }
+#endif
static void alloc_cb(uv_handle_t *handle, size_t suggested, uv_buf_t *buf)
{
@@ -62,7 +85,7 @@ static void read_cb(uv_stream_t *stream, ssize_t cnt, const uv_buf_t *buf)
int *interrupted = stream->data;
for (int i = 0; i < cnt; i++) {
- if (buf->base[i] == 3) {
+ if (buf->base[i] == CTRL_C) {
(*interrupted)++;
}
}
@@ -70,12 +93,21 @@ static void read_cb(uv_stream_t *stream, ssize_t cnt, const uv_buf_t *buf)
uv_loop_t write_loop;
uv_loop_init(&write_loop);
uv_tty_t out;
- uv_tty_init(&write_loop, &out, 1, 0);
+ uv_tty_init(&write_loop, &out, fileno(stdout), 0);
+
uv_write_t req;
- uv_buf_t b = {.base = buf->base, .len = (size_t)cnt};
- uv_write(&req, (uv_stream_t *)&out, &b, 1, NULL);
+ uv_buf_t b = {
+ .base = buf->base,
+#ifdef WIN32
+ .len = (ULONG)cnt
+#else
+ .len = (size_t)cnt
+#endif
+ };
+ uv_write(&req, STRUCT_CAST(uv_stream_t, &out), &b, 1, NULL);
uv_run(&write_loop, UV_RUN_DEFAULT);
- uv_close((uv_handle_t *)&out, NULL);
+
+ uv_close(STRUCT_CAST(uv_handle_t, &out), NULL);
uv_run(&write_loop, UV_RUN_DEFAULT);
if (uv_loop_close(&write_loop)) {
abort();
@@ -118,8 +150,13 @@ int main(int argc, char **argv)
}
if (argc > 1) {
- int count = atoi(argv[1]);
- for (int i = 0; i < count; ++i) {
+ errno = 0;
+ int count = (int)strtol(argv[1], NULL, 10);
+ if (errno != 0) {
+ abort();
+ }
+ count = (count < 0 || count > 99999) ? 0 : count;
+ for (int i = 0; i < count; i++) {
printf("line%d\n", i);
}
fflush(stdout);
@@ -130,21 +167,35 @@ int main(int argc, char **argv)
uv_prepare_t prepare;
uv_prepare_init(uv_default_loop(), &prepare);
uv_prepare_start(&prepare, prepare_cb);
- // uv_tty_t tty;
+#ifndef WIN32
uv_tty_init(uv_default_loop(), &tty, fileno(stderr), 1);
+#else
+ uv_tty_init(uv_default_loop(), &tty, fileno(stdin), 1);
+ uv_tty_init(uv_default_loop(), &tty_out, fileno(stdout), 0);
+ int width, height;
+ uv_tty_get_winsize(&tty_out, &width, &height);
+#endif
uv_tty_set_mode(&tty, UV_TTY_MODE_RAW);
tty.data = &interrupted;
- uv_read_start((uv_stream_t *)&tty, alloc_cb, read_cb);
+ uv_read_start(STRUCT_CAST(uv_stream_t, &tty), alloc_cb, read_cb);
+#ifndef WIN32
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
- sa.sa_handler = sigwinch_handler;
+ sa.sa_handler = sig_handler;
+ sigaction(SIGHUP, &sa, NULL);
sigaction(SIGWINCH, &sa, NULL);
- // uv_signal_t sigwinch_watcher;
- // uv_signal_init(uv_default_loop(), &sigwinch_watcher);
- // sigwinch_watcher.data = &tty;
- // uv_signal_start(&sigwinch_watcher, sigwinch_cb, SIGWINCH);
+#else
+ uv_signal_t sigwinch_watcher;
+ uv_signal_init(uv_default_loop(), &sigwinch_watcher);
+ uv_signal_start(&sigwinch_watcher, sigwinch_cb, SIGWINCH);
+#endif
uv_run(uv_default_loop(), UV_RUN_DEFAULT);
+#ifndef WIN32
+ // XXX: Without this the SIGHUP handler is skipped on some systems.
+ sleep(100);
+#endif
+
return 0;
}
diff --git a/test/functional/helpers.lua b/test/functional/helpers.lua
index 02109d0889..851f3e720e 100644
--- a/test/functional/helpers.lua
+++ b/test/functional/helpers.lua
@@ -1,33 +1,54 @@
+require('vim.compat')
require('coxpcall')
+local luv = require('luv')
local lfs = require('lfs')
-local ChildProcessStream = require('nvim.child_process_stream')
-local Session = require('nvim.session')
local global_helpers = require('test.helpers')
+-- nvim client: Found in .deps/usr/share/lua/<version>/nvim/ if "bundled".
+local Session = require('nvim.session')
+local TcpStream = require('nvim.tcp_stream')
+local SocketStream = require('nvim.socket_stream')
+local ChildProcessStream = require('nvim.child_process_stream')
+local Paths = require('test.config.paths')
+
+local check_cores = global_helpers.check_cores
local check_logs = global_helpers.check_logs
-local neq = global_helpers.neq
+local dedent = global_helpers.dedent
local eq = global_helpers.eq
+local expect_err = global_helpers.expect_err
+local filter = global_helpers.filter
+local map = global_helpers.map
+local matches = global_helpers.matches
+local near = global_helpers.near
+local neq = global_helpers.neq
local ok = global_helpers.ok
-
-local nvim_prog = os.getenv('NVIM_PROG') or 'build/bin/nvim'
+local read_file = global_helpers.read_file
+local sleep = global_helpers.sleep
+local table_flatten = global_helpers.table_flatten
+local write_file = global_helpers.write_file
+
+local start_dir = lfs.currentdir()
+-- XXX: NVIM_PROG takes precedence, QuickBuild sets it.
+local nvim_prog = (
+ os.getenv('NVIM_PROG')
+ or os.getenv('NVIM_PRG')
+ or Paths.test_build_dir .. '/bin/nvim'
+)
+-- Default settings for the test session.
+local nvim_set = 'set shortmess+=I background=light noswapfile noautoindent'
+ ..' laststatus=1 undodir=. directory=. viewdir=. backupdir=.'
+ ..' belloff= noshowcmd noruler nomore'
local nvim_argv = {nvim_prog, '-u', 'NONE', '-i', 'NONE', '-N',
- '--cmd', 'set shortmess+=I background=light noswapfile noautoindent laststatus=1 undodir=. directory=. viewdir=. backupdir=.',
- '--embed'}
-
-local mpack = require('mpack')
-
--- Formulate a path to the directory containing nvim. We use this to
--- help run test executables. It helps to keep the tests working, even
--- when the build is not in the default location.
+ '--cmd', nvim_set, '--embed'}
+-- Directory containing nvim.
local nvim_dir = nvim_prog:gsub("[/\\][^/\\]+$", "")
if nvim_dir == nvim_prog then
- nvim_dir = "."
+ nvim_dir = "."
end
--- Nvim "Unit Under Test" http://en.wikipedia.org/wiki/Device_under_test
-local NvimUUT = {}
-NvimUUT.__index = NvimUUT
-
+local mpack = require('mpack')
+local tmpname = global_helpers.tmpname
+local uname = global_helpers.uname
local prepend_argv
if os.getenv('VALGRIND') then
@@ -63,8 +84,12 @@ end
local session, loop_running, last_error
-local function set_session(s)
- if session then
+local function get_session()
+ return session
+end
+
+local function set_session(s, keep)
+ if session and not keep then
session:close()
end
session = s
@@ -83,38 +108,94 @@ local function request(method, ...)
return rv
end
-local function next_message()
- return session:next_message()
+local function next_msg(timeout)
+ return session:next_message(timeout and timeout or 10000)
end
-local function call_and_stop_on_error(...)
+local function expect_twostreams(msgs1, msgs2)
+ local pos1, pos2 = 1, 1
+ while pos1 <= #msgs1 or pos2 <= #msgs2 do
+ local msg = next_msg()
+ if pos1 <= #msgs1 and pcall(eq, msgs1[pos1], msg) then
+ pos1 = pos1 + 1
+ elseif pos2 <= #msgs2 then
+ eq(msgs2[pos2], msg)
+ pos2 = pos2 + 1
+ else
+ -- already failed, but show the right error message
+ eq(msgs1[pos1], msg)
+ end
+ end
+end
+
+-- Expects a sequence of next_msg() results. If multiple sequences are
+-- passed they are tried until one succeeds, in order of shortest to longest.
+local function expect_msg_seq(...)
+ if select('#', ...) < 1 then
+ error('need at least 1 argument')
+ end
+ local seqs = {...}
+ table.sort(seqs, function(a, b) -- Sort ascending, by (shallow) length.
+ return #a < #b
+ end)
+
+ local actual_seq = {}
+ local final_error = ''
+ local function cat_err(err1, err2)
+ if err1 == nil then
+ return err2
+ end
+ return string.format('%s\n%s\n%s', err1, string.rep('=', 78), err2)
+ end
+ for anum = 1, #seqs do
+ local expected_seq = seqs[anum]
+ -- Collect enough messages to compare the next expected sequence.
+ while #actual_seq < #expected_seq do
+ local msg = next_msg(10000) -- Big timeout for ASAN/valgrind.
+ if msg == nil then
+ error(cat_err(final_error,
+ string.format('got %d messages, expected %d',
+ #actual_seq, #expected_seq)))
+ end
+ table.insert(actual_seq, msg)
+ end
+ local status, result = pcall(eq, expected_seq, actual_seq)
+ if status then
+ return result
+ end
+ final_error = cat_err(final_error, result)
+ end
+ error(final_error)
+end
+
+local function call_and_stop_on_error(lsession, ...)
local status, result = copcall(...) -- luacheck: ignore
if not status then
- session:stop()
+ lsession:stop()
last_error = result
return ''
end
return result
end
-local function run(request_cb, notification_cb, setup_cb, timeout)
+local function run_session(lsession, request_cb, notification_cb, setup_cb, timeout)
local on_request, on_notification, on_setup
if request_cb then
function on_request(method, args)
- return call_and_stop_on_error(request_cb, method, args)
+ return call_and_stop_on_error(lsession, request_cb, method, args)
end
end
if notification_cb then
function on_notification(method, args)
- call_and_stop_on_error(notification_cb, method, args)
+ call_and_stop_on_error(lsession, notification_cb, method, args)
end
end
if setup_cb then
function on_setup()
- call_and_stop_on_error(setup_cb)
+ call_and_stop_on_error(lsession, setup_cb)
end
end
@@ -128,16 +209,24 @@ local function run(request_cb, notification_cb, setup_cb, timeout)
end
end
+local function run(request_cb, notification_cb, setup_cb, timeout)
+ run_session(session, request_cb, notification_cb, setup_cb, timeout)
+end
+
local function stop()
session:stop()
end
+-- Executes an ex-command. VimL errors manifest as client (lua) errors, but
+-- v:errmsg will not be updated.
local function nvim_command(cmd)
- request('vim_command', cmd)
+ request('nvim_command', cmd)
end
+-- Evaluates a VimL expression.
+-- Fails on VimL error, but does not update v:errmsg.
local function nvim_eval(expr)
- return request('vim_eval', expr)
+ return request('nvim_eval', expr)
end
local os_name = (function()
@@ -156,39 +245,25 @@ local os_name = (function()
end)
end)()
+local function iswin()
+ return package.config:sub(1,1) == '\\'
+end
+
+-- Executes a VimL function.
+-- Fails on VimL error, but does not update v:errmsg.
local function nvim_call(name, ...)
- return request('vim_call_function', name, {...})
+ return request('nvim_call_function', name, {...})
end
+-- Sends user input to Nvim.
+-- Does not fail on VimL error, but v:errmsg will be updated.
local function nvim_feed(input)
while #input > 0 do
- local written = request('vim_input', input)
+ local written = request('nvim_input', input)
input = input:sub(written + 1)
end
end
-local function dedent(str)
- -- find minimum common indent across lines
- local indent = nil
- for line in str:gmatch('[^\n]+') do
- local line_indent = line:match('^%s+') or ''
- if indent == nil or #line_indent < #indent then
- indent = line_indent
- end
- end
- if #indent == 0 then
- -- no minimum common indent
- return str
- end
- -- create a pattern for the indent
- indent = indent:gsub('%s', '[ \t]')
- -- strip it from the first line
- str = str:gsub('^'..indent, '')
- -- strip it from the remaining lines
- str = str:gsub('[\n]'..indent, '\n')
- return str
-end
-
local function feed(...)
for _, v in ipairs({...}) do
nvim_feed(dedent(v))
@@ -216,17 +291,95 @@ local function merge_args(...)
return argv
end
-local function spawn(argv, merge)
- local child_stream = ChildProcessStream.spawn(merge and merge_args(prepend_argv, argv) or argv)
+local function spawn(argv, merge, env)
+ local child_stream = ChildProcessStream.spawn(
+ merge and merge_args(prepend_argv, argv) or argv,
+ env)
return Session.new(child_stream)
end
+-- Creates a new Session connected by domain socket (named pipe) or TCP.
+local function connect(file_or_address)
+ local addr, port = string.match(file_or_address, "(.*):(%d+)")
+ local stream = (addr and port) and TcpStream.open(addr, port) or
+ SocketStream.open(file_or_address)
+ return Session.new(stream)
+end
+
+-- Calls fn() until it succeeds, up to `max` times or until `max_ms`
+-- milliseconds have passed.
+local function retry(max, max_ms, fn)
+ assert(max == nil or max > 0)
+ assert(max_ms == nil or max_ms > 0)
+ local tries = 1
+ local timeout = (max_ms and max_ms or 10000)
+ local start_time = luv.now()
+ while true do
+ local status, result = pcall(fn)
+ if status then
+ return result
+ end
+ luv.update_time() -- Update cached value of luv.now() (libuv: uv_now()).
+ if (max and tries >= max) or (luv.now() - start_time > timeout) then
+ error("\nretry() attempts: "..tostring(tries).."\n"..tostring(result))
+ end
+ tries = tries + 1
+ luv.sleep(20) -- Avoid hot loop...
+ end
+end
+
+-- Starts a new global Nvim session.
+-- Parameters are interpreted as startup args, OR a map with these keys:
+-- args: Merged with the default `nvim_argv` set.
+-- env : Defines the environment of the new session.
+--
+-- Example:
+-- clear('-e')
+-- clear({args={'-e'}, env={TERM=term}})
local function clear(...)
local args = {unpack(nvim_argv)}
- for _, arg in ipairs({...}) do
+ local new_args
+ local env = nil
+ local opts = select(1, ...)
+ local headless = true
+ if type(opts) == 'table' then
+ if opts.env then
+ local env_tbl = {}
+ for k, v in pairs(opts.env) do
+ assert(type(k) == 'string')
+ assert(type(v) == 'string')
+ env_tbl[k] = v
+ end
+ for _, k in ipairs({
+ 'HOME',
+ 'ASAN_OPTIONS',
+ 'LD_LIBRARY_PATH', 'PATH',
+ 'NVIM_LOG_FILE',
+ 'NVIM_RPLUGIN_MANIFEST',
+ }) do
+ if not env_tbl[k] then
+ env_tbl[k] = os.getenv(k)
+ end
+ end
+ env = {}
+ for k, v in pairs(env_tbl) do
+ env[#env + 1] = k .. '=' .. v
+ end
+ end
+ new_args = opts.args or {}
+ if opts.headless == false then
+ headless = false
+ end
+ else
+ new_args = {...}
+ end
+ if headless then
+ table.insert(args, '--headless')
+ end
+ for _, arg in ipairs(new_args) do
table.insert(args, arg)
end
- set_session(spawn(args))
+ set_session(spawn(args, nil, env))
end
local function insert(...)
@@ -238,7 +391,9 @@ local function insert(...)
nvim_feed('<ESC>')
end
-local function execute(...)
+-- Executes an ex-command by user input. Because nvim_input() is used, VimL
+-- errors will not manifest as client (lua) errors. Use command() for that.
+local function feed_command(...)
for _, v in ipairs({...}) do
if v:sub(1, 1) ~= '/' then
-- not a search command, prefix with colon
@@ -249,65 +404,68 @@ local function execute(...)
end
end
--- Dedent the given text and write it to the file name.
-local function write_file(name, text, dont_dedent)
- local file = io.open(name, 'w')
- if not dont_dedent then
- text = dedent(text)
- end
- file:write(text)
- file:flush()
- file:close()
-end
-
+local sourced_fnames = {}
local function source(code)
- local tmpname = os.tmpname()
- if os_name() == 'osx' and string.match(tmpname, '^/tmp') then
- tmpname = '/private'..tmpname
- end
- write_file(tmpname, code)
- nvim_command('source '..tmpname)
- os.remove(tmpname)
- return tmpname
+ local fname = tmpname()
+ write_file(fname, code)
+ nvim_command('source '..fname)
+ -- DO NOT REMOVE FILE HERE.
+ -- do_source() has a habit of checking whether files are โ€œsameโ€ by using inode
+ -- and device IDs. If you run two source() calls in quick succession there is
+ -- a good chance that underlying filesystem will reuse the inode, making files
+ -- appear as โ€œsymlinksโ€ to do_source when it checks FileIDs. With current
+ -- setup linux machines (both QB, travis and mine(ZyX-I) with XFS) do reuse
+ -- inodes, Mac OS machines (again, both QB and travis) do not.
+ --
+ -- Files appearing as โ€œsymlinksโ€ mean that both the first and the second
+ -- source() calls will use same SID, which may fail some tests which check for
+ -- exact numbers after `<SNR>` in e.g. function names.
+ sourced_fnames[#sourced_fnames + 1] = fname
+ return fname
+end
+
+local function set_shell_powershell()
+ source([[
+ set shell=powershell shellquote=( shellpipe=\| shellredir=> shellxquote=
+ let &shellcmdflag = '-NoLogo -NoProfile -ExecutionPolicy RemoteSigned -Command Remove-Item -Force alias:sleep;'
+ ]])
end
local function nvim(method, ...)
- return request('vim_'..method, ...)
+ return request('nvim_'..method, ...)
+end
+
+local function ui(method, ...)
+ return request('nvim_ui_'..method, ...)
end
local function nvim_async(method, ...)
- session:notify('vim_'..method, ...)
+ session:notify('nvim_'..method, ...)
end
local function buffer(method, ...)
- return request('buffer_'..method, ...)
+ return request('nvim_buf_'..method, ...)
end
local function window(method, ...)
- return request('window_'..method, ...)
+ return request('nvim_win_'..method, ...)
end
local function tabpage(method, ...)
- return request('tabpage_'..method, ...)
+ return request('nvim_tabpage_'..method, ...)
end
local function curbuf(method, ...)
- local buf = nvim('get_current_buffer')
if not method then
- return buf
+ return nvim('get_current_buf')
end
- return buffer(method, buf, ...)
+ return buffer(method, 0, ...)
end
local function wait()
- -- Execute 'vim_eval' (a deferred function) to block
+ -- Execute 'nvim_eval' (a deferred function) to block
-- until all pending input is processed.
- session:request('vim_eval', '1')
-end
-
--- sleeps the test runner (_not_ the nvim instance)
-local function sleep(timeout)
- run(nil, nil, nil, timeout)
+ session:request('nvim_eval', '1')
end
local function curbuf_contents()
@@ -316,51 +474,75 @@ local function curbuf_contents()
end
local function curwin(method, ...)
- local win = nvim('get_current_window')
if not method then
- return win
+ return nvim('get_current_win')
end
- return window(method, win, ...)
+ return window(method, 0, ...)
end
local function curtab(method, ...)
- local tab = nvim('get_current_tabpage')
if not method then
- return tab
+ return nvim('get_current_tabpage')
end
- return tabpage(method, tab, ...)
+ return tabpage(method, 0, ...)
end
local function expect(contents)
return eq(dedent(contents), curbuf_contents())
end
-local function rmdir(path)
+local function expect_any(contents)
+ contents = dedent(contents)
+ return ok(nil ~= string.find(curbuf_contents(), contents, 1, true))
+end
+
+local function do_rmdir(path)
if lfs.attributes(path, 'mode') ~= 'directory' then
- return nil
+ return -- Don't complain.
end
for file in lfs.dir(path) do
if file ~= '.' and file ~= '..' then
local abspath = path..'/'..file
if lfs.attributes(abspath, 'mode') == 'directory' then
- local ret = rmdir(abspath) -- recurse
- if not ret then
- return nil
- end
+ do_rmdir(abspath) -- recurse
else
local ret, err = os.remove(abspath)
if not ret then
- error('os.remove: '..err)
- return nil
+ if not session then
+ error('os.remove: '..err)
+ else
+ -- Try Nvim delete(): it handles `readonly` attribute on Windows,
+ -- and avoids Lua cross-version/platform incompatibilities.
+ if -1 == nvim_call('delete', abspath) then
+ local hint = (os_name() == 'windows'
+ and ' (hint: try :%bwipeout! before rmdir())' or '')
+ error('delete() failed'..hint..': '..abspath)
+ end
+ end
end
end
end
end
- local ret, err = os.remove(path)
+ local ret, err = lfs.rmdir(path)
if not ret then
- error('os.remove: '..err)
+ error('lfs.rmdir('..path..'): '..err)
+ end
+end
+
+local function rmdir(path)
+ local ret, _ = pcall(do_rmdir, path)
+ if not ret and os_name() == "windows" then
+ -- Maybe "Permission denied"; try again after changing the nvim
+ -- process to the top-level directory.
+ nvim_command([[exe 'cd '.fnameescape(']]..start_dir.."')")
+ ret, _ = pcall(do_rmdir, path)
+ end
+ -- During teardown, the nvim process may not exit quickly enough, then rmdir()
+ -- will fail (on Windows).
+ if not ret then -- Try again.
+ sleep(1000)
+ do_rmdir(path)
end
- return ret
end
local exc_exec = function(cmd)
@@ -376,17 +558,6 @@ local exc_exec = function(cmd)
return ret
end
-local function redir_exec(cmd)
- nvim_command(([[
- redir => g:__output
- silent! execute "%s"
- redir END
- ]]):format(cmd:gsub('\n', '\\n'):gsub('[\\"]', '\\%0')))
- local ret = nvim_eval('get(g:, "__output", 0)')
- nvim_command('unlet! g:__output')
- return ret
-end
-
local function create_callindex(func)
local table = {}
setmetatable(table, {
@@ -399,8 +570,46 @@ local function create_callindex(func)
return table
end
+-- Helper to skip tests. Returns true in Windows systems.
+-- pending_fn is pending() from busted
+local function pending_win32(pending_fn)
+ if uname() == 'Windows' then
+ if pending_fn ~= nil then
+ pending_fn('FIXME: Windows', function() end)
+ end
+ return true
+ else
+ return false
+ end
+end
+
+-- Calls pending() and returns `true` if the system is too slow to
+-- run fragile or expensive tests. Else returns `false`.
+local function skip_fragile(pending_fn, cond)
+ if pending_fn == nil or type(pending_fn) ~= type(function()end) then
+ error("invalid pending_fn")
+ end
+ if cond then
+ pending_fn("skipped (test is fragile on this system)", function() end)
+ return true
+ elseif os.getenv("TEST_SKIP_FRAGILE") then
+ pending_fn("skipped (TEST_SKIP_FRAGILE)", function() end)
+ return true
+ end
+ return false
+end
+
+local function meth_pcall(...)
+ local ret = {pcall(...)}
+ if type(ret[2]) == 'string' then
+ ret[2] = ret[2]:gsub('^[^:]+:%d+: ', '')
+ end
+ return ret
+end
+
local funcs = create_callindex(nvim_call)
local meths = create_callindex(nvim)
+local uimeths = create_callindex(ui)
local bufmeths = create_callindex(buffer)
local winmeths = create_callindex(window)
local tabmeths = create_callindex(tabpage)
@@ -408,60 +617,167 @@ local curbufmeths = create_callindex(curbuf)
local curwinmeths = create_callindex(curwin)
local curtabmeths = create_callindex(curtab)
+local function redir_exec(cmd)
+ meths.set_var('__redir_exec_cmd', cmd)
+ nvim_command([[
+ redir => g:__redir_exec_output
+ silent! execute g:__redir_exec_cmd
+ redir END
+ ]])
+ local ret = meths.get_var('__redir_exec_output')
+ meths.del_var('__redir_exec_output')
+ meths.del_var('__redir_exec_cmd')
+ return ret
+end
+
+local function get_pathsep()
+ return iswin() and '\\' or '/'
+end
+
+local function pathroot()
+ local pathsep = package.config:sub(1,1)
+ return iswin() and (nvim_dir:sub(1,2)..pathsep) or '/'
+end
+
+-- Returns a valid, platform-independent $NVIM_LISTEN_ADDRESS.
+-- Useful for communicating with child instances.
+local function new_pipename()
+ -- HACK: Start a server temporarily, get the name, then stop it.
+ local pipename = nvim_eval('serverstart()')
+ funcs.serverstop(pipename)
+ return pipename
+end
+
+local function missing_provider(provider)
+ if provider == 'ruby' or provider == 'node' then
+ local prog = funcs['provider#' .. provider .. '#Detect']()
+ return prog == '' and (provider .. ' not detected') or false
+ elseif provider == 'python' or provider == 'python3' then
+ local py_major_version = (provider == 'python3' and 3 or 2)
+ local errors = funcs['provider#pythonx#Detect'](py_major_version)[2]
+ return errors ~= '' and errors or false
+ else
+ assert(false, 'Unknown provider: ' .. provider)
+ end
+end
+
+local function alter_slashes(obj)
+ if not iswin() then
+ return obj
+ end
+ if type(obj) == 'string' then
+ local ret = obj:gsub('/', '\\')
+ return ret
+ elseif type(obj) == 'table' then
+ local ret = {}
+ for k, v in pairs(obj) do
+ ret[k] = alter_slashes(v)
+ end
+ return ret
+ else
+ assert(false, 'Could only alter slashes for tables of strings and strings')
+ end
+end
+
+local module = {
+ NIL = mpack.NIL,
+ alter_slashes = alter_slashes,
+ buffer = buffer,
+ bufmeths = bufmeths,
+ call = nvim_call,
+ create_callindex = create_callindex,
+ clear = clear,
+ command = nvim_command,
+ connect = connect,
+ curbuf = curbuf,
+ curbuf_contents = curbuf_contents,
+ curbufmeths = curbufmeths,
+ curtab = curtab,
+ curtabmeths = curtabmeths,
+ curwin = curwin,
+ curwinmeths = curwinmeths,
+ dedent = dedent,
+ eq = eq,
+ eval = nvim_eval,
+ exc_exec = exc_exec,
+ expect = expect,
+ expect_any = expect_any,
+ expect_err = expect_err,
+ expect_msg_seq = expect_msg_seq,
+ expect_twostreams = expect_twostreams,
+ feed = feed,
+ feed_command = feed_command,
+ filter = filter,
+ funcs = funcs,
+ get_pathsep = get_pathsep,
+ get_session = get_session,
+ insert = insert,
+ iswin = iswin,
+ map = map,
+ matches = matches,
+ merge_args = merge_args,
+ meth_pcall = meth_pcall,
+ meths = meths,
+ missing_provider = missing_provider,
+ mkdir = lfs.mkdir,
+ near = near,
+ neq = neq,
+ new_pipename = new_pipename,
+ next_msg = next_msg,
+ nvim = nvim,
+ nvim_argv = nvim_argv,
+ nvim_async = nvim_async,
+ nvim_dir = nvim_dir,
+ nvim_prog = nvim_prog,
+ nvim_set = nvim_set,
+ ok = ok,
+ os_name = os_name,
+ pathroot = pathroot,
+ pending_win32 = pending_win32,
+ prepend_argv = prepend_argv,
+ rawfeed = rawfeed,
+ read_file = read_file,
+ redir_exec = redir_exec,
+ request = request,
+ retry = retry,
+ rmdir = rmdir,
+ run = run,
+ run_session = run_session,
+ set_session = set_session,
+ set_shell_powershell = set_shell_powershell,
+ skip_fragile = skip_fragile,
+ sleep = sleep,
+ source = source,
+ spawn = spawn,
+ stop = stop,
+ table_flatten = table_flatten,
+ tabmeths = tabmeths,
+ tabpage = tabpage,
+ tmpname = tmpname,
+ uimeths = uimeths,
+ wait = wait,
+ window = window,
+ winmeths = winmeths,
+ write_file = write_file,
+}
+
return function(after_each)
if after_each then
- after_each(check_logs)
- end
- return {
- prepend_argv = prepend_argv,
- clear = clear,
- spawn = spawn,
- dedent = dedent,
- source = source,
- rawfeed = rawfeed,
- insert = insert,
- feed = feed,
- execute = execute,
- eval = nvim_eval,
- call = nvim_call,
- command = nvim_command,
- request = request,
- next_message = next_message,
- run = run,
- stop = stop,
- eq = eq,
- neq = neq,
- expect = expect,
- ok = ok,
- nvim = nvim,
- nvim_async = nvim_async,
- nvim_prog = nvim_prog,
- nvim_dir = nvim_dir,
- buffer = buffer,
- window = window,
- tabpage = tabpage,
- curbuf = curbuf,
- curwin = curwin,
- curtab = curtab,
- curbuf_contents = curbuf_contents,
- wait = wait,
- sleep = sleep,
- set_session = set_session,
- write_file = write_file,
- os_name = os_name,
- rmdir = rmdir,
- mkdir = lfs.mkdir,
- exc_exec = exc_exec,
- redir_exec = redir_exec,
- merge_args = merge_args,
- funcs = funcs,
- meths = meths,
- bufmeths = bufmeths,
- winmeths = winmeths,
- tabmeths = tabmeths,
- curbufmeths = curbufmeths,
- curwinmeths = curwinmeths,
- curtabmeths = curtabmeths,
- NIL = mpack.NIL,
- }
+ after_each(function()
+ for _, fname in ipairs(sourced_fnames) do
+ os.remove(fname)
+ end
+ check_logs()
+ check_cores('build/bin/nvim')
+ if session then
+ local msg = session:next_message(0)
+ if msg then
+ if msg[1] == "notification" and msg[2] == "nvim_error_event" then
+ error(msg[3][2])
+ end
+ end
+ end
+ end)
+ end
+ return module
end
diff --git a/test/functional/insert/ctrl_o_spec.lua b/test/functional/insert/ctrl_o_spec.lua
new file mode 100644
index 0000000000..fbdff8a3a0
--- /dev/null
+++ b/test/functional/insert/ctrl_o_spec.lua
@@ -0,0 +1,43 @@
+local helpers = require('test.functional.helpers')(after_each)
+local clear = helpers.clear
+local eq = helpers.eq
+local eval = helpers.eval
+local expect = helpers.expect
+local feed = helpers.feed
+local insert = helpers.insert
+
+describe('insert-mode Ctrl-O', function()
+ before_each(clear)
+
+ it('enters command mode for one command', function()
+ feed('ihello world<C-o>')
+ feed(':let ctrlo = "test"<CR>')
+ feed('iii')
+ expect('hello worldiii')
+ eq(1, eval('ctrlo ==# "test"'))
+ end)
+
+ it('re-enters insert mode at the end of the line when running startinsert', function()
+ -- #6962
+ feed('ihello world<C-o>')
+ feed(':startinsert<CR>')
+ feed('iii')
+ expect('hello worldiii')
+ end)
+
+ it('re-enters insert mode at the beginning of the line when running startinsert', function()
+ insert('hello world')
+ feed('0<C-o>')
+ feed(':startinsert<CR>')
+ feed('aaa')
+ expect('aaahello world')
+ end)
+
+ it('re-enters insert mode in the middle of the line when running startinsert', function()
+ insert('hello world')
+ feed('bi<C-o>')
+ feed(':startinsert<CR>')
+ feed('ooo')
+ expect('hello oooworld')
+ end)
+end)
diff --git a/test/functional/insert/ctrl_r_spec.lua b/test/functional/insert/ctrl_r_spec.lua
new file mode 100644
index 0000000000..adc3c4b406
--- /dev/null
+++ b/test/functional/insert/ctrl_r_spec.lua
@@ -0,0 +1,19 @@
+local helpers = require('test.functional.helpers')(after_each)
+local clear, feed = helpers.clear, helpers.feed
+local expect, command = helpers.expect, helpers.command
+
+describe('insert-mode Ctrl-R', function()
+ before_each(clear)
+
+ it('works', function()
+ command("let @@ = 'test'")
+ feed('i<C-r>"')
+ expect('test')
+ end)
+
+ it('works with multi-byte text', function()
+ command("let @@ = 'pรฅskรคgg'")
+ feed('i<C-r>"')
+ expect('pรฅskรคgg')
+ end)
+end)
diff --git a/test/functional/insert/insert_spec.lua b/test/functional/insert/insert_spec.lua
new file mode 100644
index 0000000000..427954f5a6
--- /dev/null
+++ b/test/functional/insert/insert_spec.lua
@@ -0,0 +1,41 @@
+local helpers = require('test.functional.helpers')(after_each)
+local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
+local command = helpers.command
+local eq = helpers.eq
+local expect = helpers.expect
+local funcs = helpers.funcs
+
+describe('insert-mode', function()
+ before_each(function()
+ clear()
+ end)
+
+ it('CTRL-@', function()
+ -- Inserts last-inserted text, leaves insert-mode.
+ insert('hello')
+ feed('i<C-@>x')
+ expect('hellhello')
+
+ -- C-Space is the same as C-@.
+ -- CTRL-SPC inserts last-inserted text, leaves insert-mode.
+ feed('i<C-Space>x')
+ expect('hellhellhello')
+
+ -- CTRL-A inserts last inserted text
+ feed('i<C-A>x')
+ expect('hellhellhellhelloxo')
+ end)
+
+ it('ALT/META #8213', function()
+ -- Mapped ALT-chord behaves as mapped.
+ command('inoremap <M-l> meta-l')
+ command('inoremap <A-j> alt-j')
+ feed('i<M-l> xxx <A-j><M-h>a<A-h>')
+ expect('meta-l xxx alt-j')
+ eq({ 0, 1, 14, 0, }, funcs.getpos('.'))
+ -- Unmapped ALT-chord behaves as ESC+c.
+ command('iunmap <M-l>')
+ feed('0i<M-l>')
+ eq({ 0, 1, 2, 0, }, funcs.getpos('.'))
+ end)
+end)
diff --git a/test/functional/job/job_spec.lua b/test/functional/job/job_spec.lua
deleted file mode 100644
index b54d5166ac..0000000000
--- a/test/functional/job/job_spec.lua
+++ /dev/null
@@ -1,469 +0,0 @@
-
-local helpers = require('test.functional.helpers')(after_each)
-local clear, eq, eval, execute, feed, insert, neq, next_msg, nvim,
- nvim_dir, ok, source, write_file, mkdir, rmdir = helpers.clear,
- helpers.eq, helpers.eval, helpers.execute, helpers.feed,
- helpers.insert, helpers.neq, helpers.next_message, helpers.nvim,
- helpers.nvim_dir, helpers.ok, helpers.source,
- helpers.write_file, helpers.mkdir, helpers.rmdir
-local Screen = require('test.functional.ui.screen')
-
-
-describe('jobs', function()
- local channel
-
- before_each(function()
- clear()
- channel = nvim('get_api_info')[1]
- nvim('set_var', 'channel', channel)
- source([[
- function! s:OnEvent(id, data, event)
- let userdata = get(self, 'user')
- call rpcnotify(g:channel, a:event, userdata, a:data)
- endfunction
- let g:job_opts = {
- \ 'on_stdout': function('s:OnEvent'),
- \ 'on_stderr': function('s:OnEvent'),
- \ 'on_exit': function('s:OnEvent'),
- \ 'user': 0
- \ }
- ]])
- end)
-
- it('uses &shell and &shellcmdflag if passed a string', function()
- nvim('command', "let $VAR = 'abc'")
- nvim('command', "let j = jobstart('echo $VAR', g:job_opts)")
- eq({'notification', 'stdout', {0, {'abc', ''}}}, next_msg())
- eq({'notification', 'exit', {0, 0}}, next_msg())
- end)
-
- it('changes to given / directory', function()
- nvim('command', "let g:job_opts.cwd = '/'")
- nvim('command', "let j = jobstart('pwd', g:job_opts)")
- eq({'notification', 'stdout', {0, {'/', ''}}}, next_msg())
- eq({'notification', 'exit', {0, 0}}, next_msg())
- end)
-
- it('changes to given `cwd` directory', function()
- local dir = eval('resolve(tempname())')
- mkdir(dir)
- nvim('command', "let g:job_opts.cwd = '" .. dir .. "'")
- nvim('command', "let j = jobstart('pwd', g:job_opts)")
- eq({'notification', 'stdout', {0, {dir, ''}}}, next_msg())
- eq({'notification', 'exit', {0, 0}}, next_msg())
- rmdir(dir)
- end)
-
- it('fails to change to invalid `cwd`', function()
- local dir = eval('resolve(tempname())."-bogus"')
- local _, err = pcall(function()
- nvim('command', "let g:job_opts.cwd = '" .. dir .. "'")
- nvim('command', "let j = jobstart('pwd', g:job_opts)")
- end)
- ok(string.find(err, "E475: Invalid argument: expected valid directory$") ~= nil)
- end)
-
- it('returns 0 when it fails to start', function()
- local status, rv = pcall(eval, "jobstart([])")
- eq(false, status)
- ok(rv ~= nil)
- end)
-
- it('invokes callbacks when the job writes and exits', function()
- nvim('command', "call jobstart(['echo'], g:job_opts)")
- eq({'notification', 'stdout', {0, {'', ''}}}, next_msg())
- eq({'notification', 'exit', {0, 0}}, next_msg())
- end)
-
- it('allows interactive commands', function()
- nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
- neq(0, eval('j'))
- nvim('command', 'call jobsend(j, "abc\\n")')
- eq({'notification', 'stdout', {0, {'abc', ''}}}, next_msg())
- nvim('command', 'call jobsend(j, "123\\nxyz\\n")')
- eq({'notification', 'stdout', {0, {'123', 'xyz', ''}}}, next_msg())
- nvim('command', 'call jobsend(j, [123, "xyz", ""])')
- eq({'notification', 'stdout', {0, {'123', 'xyz', ''}}}, next_msg())
- nvim('command', "call jobstop(j)")
- eq({'notification', 'exit', {0, 0}}, next_msg())
- end)
-
- it('preserves NULs', function()
- -- Make a file with NULs in it.
- local filename = os.tmpname()
- write_file(filename, "abc\0def\n")
-
- nvim('command', "let j = jobstart(['cat', '"..filename.."'], g:job_opts)")
- eq({'notification', 'stdout', {0, {'abc\ndef', ''}}}, next_msg())
- eq({'notification', 'exit', {0, 0}}, next_msg())
- os.remove(filename)
-
- -- jobsend() preserves NULs.
- nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
- nvim('command', [[call jobsend(j, ["123\n456",""])]])
- eq({'notification', 'stdout', {0, {'123\n456', ''}}}, next_msg())
- nvim('command', "call jobstop(j)")
- end)
-
- it("will not buffer data if it doesn't end in newlines", function()
- nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
- nvim('command', 'call jobsend(j, "abc\\nxyz")')
- eq({'notification', 'stdout', {0, {'abc', 'xyz'}}}, next_msg())
- nvim('command', "call jobstop(j)")
- eq({'notification', 'exit', {0, 0}}, next_msg())
- end)
-
- it('can preserve newlines', function()
- nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
- nvim('command', 'call jobsend(j, "a\\n\\nc\\n\\n\\n\\nb\\n\\n")')
- eq({'notification', 'stdout',
- {0, {'a', '', 'c', '', '', '', 'b', '', ''}}}, next_msg())
- end)
-
- it('can preserve nuls', function()
- nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
- nvim('command', 'call jobsend(j, ["\n123\n", "abc\\nxyz\n", ""])')
- eq({'notification', 'stdout', {0, {'\n123\n', 'abc\nxyz\n', ''}}},
- next_msg())
- nvim('command', "call jobstop(j)")
- eq({'notification', 'exit', {0, 0}}, next_msg())
- end)
-
- it('can avoid sending final newline', function()
- nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
- nvim('command', 'call jobsend(j, ["some data", "without\nfinal nl"])')
- eq({'notification', 'stdout', {0, {'some data', 'without\nfinal nl'}}},
- next_msg())
- nvim('command', "call jobstop(j)")
- eq({'notification', 'exit', {0, 0}}, next_msg())
- end)
-
- it('can close the job streams with jobclose', function()
- nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
- nvim('command', 'call jobclose(j, "stdin")')
- eq({'notification', 'exit', {0, 0}}, next_msg())
- end)
-
- it("won't allow jobsend with a job that closed stdin", function()
- nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
- nvim('command', 'call jobclose(j, "stdin")')
- eq(false, pcall(function()
- nvim('command', 'call jobsend(j, ["some data"])')
- end))
- end)
-
- it('will not allow jobsend/stop on a non-existent job', function()
- eq(false, pcall(eval, "jobsend(-1, 'lol')"))
- eq(false, pcall(eval, "jobstop(-1)"))
- end)
-
- it('will not allow jobstop twice on the same job', function()
- nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
- neq(0, eval('j'))
- eq(true, pcall(eval, "jobstop(j)"))
- eq(false, pcall(eval, "jobstop(j)"))
- end)
-
- it('will not cause a memory leak if we leave a job running', function()
- nvim('command', "call jobstart(['cat', '-'], g:job_opts)")
- end)
-
- it('can get the pid value using getpid', function()
- nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
- local pid = eval('jobpid(j)')
- eq(0,os.execute('ps -p '..pid..' > /dev/null'))
- nvim('command', 'call jobstop(j)')
- eq({'notification', 'exit', {0, 0}}, next_msg())
- neq(0,os.execute('ps -p '..pid..' > /dev/null'))
- end)
-
- it("doesn't survive the exit of nvim", function()
- -- use sleep, which doesn't die on stdin close
- nvim('command', "let j = jobstart(['sleep', '1000'], g:job_opts)")
- local pid = eval('jobpid(j)')
- eq(0,os.execute('ps -p '..pid..' > /dev/null'))
- clear()
- neq(0,os.execute('ps -p '..pid..' > /dev/null'))
- end)
-
- it('can survive the exit of nvim with "detach"', function()
- nvim('command', 'let g:job_opts.detach = 1')
- nvim('command', "let j = jobstart(['sleep', '1000'], g:job_opts)")
- local pid = eval('jobpid(j)')
- eq(0,os.execute('ps -p '..pid..' > /dev/null'))
- clear()
- eq(0,os.execute('ps -p '..pid..' > /dev/null'))
- -- clean up after ourselves
- os.execute('kill -9 '..pid..' > /dev/null')
- end)
-
- it('can pass user data to the callback', function()
- nvim('command', 'let g:job_opts.user = {"n": 5, "s": "str", "l": [1]}')
- nvim('command', "call jobstart(['echo'], g:job_opts)")
- local data = {n = 5, s = 'str', l = {1}}
- eq({'notification', 'stdout', {data, {'', ''}}}, next_msg())
- eq({'notification', 'exit', {data, 0}}, next_msg())
- end)
-
- it('can omit options', function()
- neq(0, nvim('eval', 'delete(".Xtestjob")'))
- nvim('command', "call jobstart(['touch', '.Xtestjob'])")
- nvim('command', "sleep 100m")
- eq(0, nvim('eval', 'delete(".Xtestjob")'))
- end)
-
- it('can omit data callbacks', function()
- nvim('command', 'unlet g:job_opts.on_stdout')
- nvim('command', 'unlet g:job_opts.on_stderr')
- nvim('command', 'let g:job_opts.user = 5')
- nvim('command', "call jobstart(['echo'], g:job_opts)")
- eq({'notification', 'exit', {5, 0}}, next_msg())
- end)
-
- it('can omit exit callback', function()
- nvim('command', 'unlet g:job_opts.on_exit')
- nvim('command', 'let g:job_opts.user = 5')
- nvim('command', "call jobstart(['echo'], g:job_opts)")
- eq({'notification', 'stdout', {5, {'', ''}}}, next_msg())
- end)
-
- it('will pass return code with the exit event', function()
- nvim('command', 'let g:job_opts.user = 5')
- nvim('command', "call jobstart([&sh, '-c', 'exit 55'], g:job_opts)")
- eq({'notification', 'exit', {5, 55}}, next_msg())
- end)
-
- it('can receive dictionary functions', function()
- source([[
- let g:dict = {'id': 10}
- function g:dict.on_exit(id, code, event)
- call rpcnotify(g:channel, a:event, a:code, self.id)
- endfunction
- call jobstart([&sh, '-c', 'exit 45'], g:dict)
- ]])
- eq({'notification', 'exit', {45, 10}}, next_msg())
- end)
-
- it('cant redefine callbacks being used by a job', function()
- local screen = Screen.new()
- screen:attach()
- local script = [[
- function! g:JobHandler(job_id, data, event)
- endfunction
-
- let g:callbacks = {
- \ 'on_stdout': function('g:JobHandler'),
- \ 'on_stderr': function('g:JobHandler'),
- \ 'on_exit': function('g:JobHandler')
- \ }
- let job = jobstart('cat -', g:callbacks)
- ]]
- source(script)
- feed(':function! g:JobHandler(job_id, data, event)<cr>')
- feed(':endfunction<cr>')
- screen:expect([[
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- :function! g:JobHandler(job_id, data, event) |
- : :endfunction |
- E127: Cannot redefine function JobHandler: It is in u|
- se |
- Press ENTER or type command to continue^ |
- ]])
- end)
-
- describe('jobwait', function()
- it('returns a list of status codes', function()
- source([[
- call rpcnotify(g:channel, 'wait', jobwait([
- \ jobstart([&sh, '-c', 'sleep 0.10; exit 4']),
- \ jobstart([&sh, '-c', 'sleep 0.110; exit 5']),
- \ jobstart([&sh, '-c', 'sleep 0.210; exit 6']),
- \ jobstart([&sh, '-c', 'sleep 0.310; exit 7'])
- \ ]))
- ]])
- eq({'notification', 'wait', {{4, 5, 6, 7}}}, next_msg())
- end)
-
- it('will run callbacks while waiting', function()
- source([[
- let g:dict = {'id': 10}
- let g:exits = 0
- function g:dict.on_exit(id, code)
- if a:code != 5
- throw 'Error!'
- endif
- let g:exits += 1
- endfunction
- call jobwait([
- \ jobstart([&sh, '-c', 'sleep 0.010; exit 5'], g:dict),
- \ jobstart([&sh, '-c', 'sleep 0.030; exit 5'], g:dict),
- \ jobstart([&sh, '-c', 'sleep 0.050; exit 5'], g:dict),
- \ jobstart([&sh, '-c', 'sleep 0.070; exit 5'], g:dict)
- \ ])
- call rpcnotify(g:channel, 'wait', g:exits)
- ]])
- eq({'notification', 'wait', {4}}, next_msg())
- end)
-
- it('will return status codes in the order of passed ids', function()
- source([[
- call rpcnotify(g:channel, 'wait', jobwait([
- \ jobstart([&sh, '-c', 'sleep 0.070; exit 4']),
- \ jobstart([&sh, '-c', 'sleep 0.050; exit 5']),
- \ jobstart([&sh, '-c', 'sleep 0.030; exit 6']),
- \ jobstart([&sh, '-c', 'sleep 0.010; exit 7'])
- \ ]))
- ]])
- eq({'notification', 'wait', {{4, 5, 6, 7}}}, next_msg())
- end)
-
- it('will return -3 for invalid job ids', function()
- source([[
- call rpcnotify(g:channel, 'wait', jobwait([
- \ -10,
- \ jobstart([&sh, '-c', 'sleep 0.01; exit 5']),
- \ ]))
- ]])
- eq({'notification', 'wait', {{-3, 5}}}, next_msg())
- end)
-
- it('will return -2 when interrupted', function()
- execute('call rpcnotify(g:channel, "ready") | '..
- 'call rpcnotify(g:channel, "wait", '..
- 'jobwait([jobstart([&sh, "-c", "sleep 10; exit 55"])]))')
- eq({'notification', 'ready', {}}, next_msg())
- feed('<c-c>')
- eq({'notification', 'wait', {{-2}}}, next_msg())
- end)
-
- it('can be called recursively', function()
- source([[
- let g:opts = {}
- let g:counter = 0
- function g:opts.on_stdout(id, msg)
- if self.state == 0
- if self.counter < 10
- call Run()
- endif
- let self.state = 1
- call jobsend(a:id, "line1\n")
- elseif self.state == 1
- let self.state = 2
- call jobsend(a:id, "line2\n")
- elseif self.state == 2
- let self.state = 3
- call jobsend(a:id, "line3\n")
- else
- call rpcnotify(g:channel, 'w', printf('job %d closed', self.counter))
- call jobclose(a:id, 'stdin')
- endif
- endfunction
- function g:opts.on_exit()
- call rpcnotify(g:channel, 'w', printf('job %d exited', self.counter))
- endfunction
- function Run()
- let g:counter += 1
- let j = copy(g:opts)
- let j.state = 0
- let j.counter = g:counter
- call jobwait([
- \ jobstart([&sh, '-c', 'echo ready; cat -'], j),
- \ ])
- endfunction
- ]])
- execute('call Run()')
- local r
- for i = 10, 1, -1 do
- r = next_msg()
- eq('job '..i..' closed', r[3][1])
- r = next_msg()
- eq('job '..i..' exited', r[3][1])
- end
- eq(10, nvim('eval', 'g:counter'))
- end)
-
- describe('with timeout argument', function()
- it('will return -1 if the wait timed out', function()
- source([[
- call rpcnotify(g:channel, 'wait', jobwait([
- \ jobstart([&sh, '-c', 'exit 4']),
- \ jobstart([&sh, '-c', 'sleep 10; exit 5']),
- \ ], 100))
- ]])
- eq({'notification', 'wait', {{4, -1}}}, next_msg())
- end)
-
- it('can pass 0 to check if a job exists', function()
- source([[
- call rpcnotify(g:channel, 'wait', jobwait([
- \ jobstart([&sh, '-c', 'sleep 0.05; exit 4']),
- \ jobstart([&sh, '-c', 'sleep 0.3; exit 5']),
- \ ], 0))
- ]])
- eq({'notification', 'wait', {{-1, -1}}}, next_msg())
- end)
- end)
- end)
-
- -- FIXME need to wait until jobsend succeeds before calling jobstop
- pending('will only emit the "exit" event after "stdout" and "stderr"', function()
- nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
- local jobid = nvim('eval', 'j')
- nvim('eval', 'jobsend(j, "abcdef")')
- nvim('eval', 'jobstop(j)')
- eq({'notification', 'j', {0, {jobid, 'stdout', {'abcdef'}}}}, next_msg())
- eq({'notification', 'j', {0, {jobid, 'exit'}}}, next_msg())
- end)
-
- describe('running tty-test program', function()
- local function next_chunk()
- local rv
- while true do
- local msg = next_msg()
- local data = msg[3][2]
- for i = 1, #data do
- data[i] = data[i]:gsub('\n', '\000')
- end
- rv = table.concat(data, '\n')
- rv = rv:gsub('\r\n$', ''):gsub('^\r\n', '')
- if rv ~= '' then
- break
- end
- end
- return rv
- end
-
- local function send(str)
- nvim('command', 'call jobsend(j, "'..str..'")')
- end
-
- before_each(function()
- -- the full path to tty-test seems to be required when running on travis.
- insert(nvim_dir .. '/tty-test')
- nvim('command', 'let g:job_opts.pty = 1')
- nvim('command', 'let exec = [expand("<cfile>:p")]')
- nvim('command', "let j = jobstart(exec, g:job_opts)")
- eq('tty ready', next_chunk())
- end)
-
- it('echoing input', function()
- send('test')
- eq('test', next_chunk())
- end)
-
- it('resizing window', function()
- nvim('command', 'call jobresize(j, 40, 10)')
- eq('rows: 10, cols: 40', next_chunk())
- nvim('command', 'call jobresize(j, 10, 40)')
- eq('rows: 40, cols: 10', next_chunk())
- end)
- end)
-end)
diff --git a/test/functional/legacy/002_filename_recognition_spec.lua b/test/functional/legacy/002_filename_recognition_spec.lua
index 5a833281e7..26a62d92fe 100644
--- a/test/functional/legacy/002_filename_recognition_spec.lua
+++ b/test/functional/legacy/002_filename_recognition_spec.lua
@@ -3,7 +3,7 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, expect = helpers.execute, helpers.expect
+local feed_command, expect = helpers.feed_command, helpers.expect
describe('filename recognition', function()
setup(clear)
@@ -17,17 +17,17 @@ describe('filename recognition', function()
fourth test for URL:\\machine.name\tmp\vimtest2d, and other text]])
-- Go to the first URL and append it to the beginning
- execute('/^first', '/tmp', 'call append(0, expand("<cfile>"))')
+ feed_command('/^first', '/tmp', 'call append(0, expand("<cfile>"))')
-- Repeat for the second URL
-- this time, navigate to the word "URL" instead of "tmp"
- execute('/^second', '/URL', 'call append(1, expand("<cfile>"))')
+ feed_command('/^second', '/URL', 'call append(1, expand("<cfile>"))')
-- Repeat for the remaining URLs. This time, the 'isfname' option must be
-- set to allow '\' in filenames
- execute('set isf=@,48-57,/,.,-,_,+,,,$,:,~,\\')
- execute('/^third', '/name', 'call append(2, expand("<cfile>"))')
- execute('/^fourth', '/URL', 'call append(3, expand("<cfile>"))')
+ feed_command('set isf=@,48-57,/,.,-,_,+,,,$,:,~,\\')
+ feed_command('/^third', '/name', 'call append(2, expand("<cfile>"))')
+ feed_command('/^fourth', '/URL', 'call append(3, expand("<cfile>"))')
-- Delete the initial text, which now starts at line 5
feed('5GdG')
diff --git a/test/functional/legacy/003_cindent_spec.lua b/test/functional/legacy/003_cindent_spec.lua
index 83388bd1eb..061904c42f 100644
--- a/test/functional/legacy/003_cindent_spec.lua
+++ b/test/functional/legacy/003_cindent_spec.lua
@@ -1,40 +1,43 @@
-- Test for 'cindent'.
+-- For new tests, consider putting them in test_cindent.vim.
--
-- There are 50+ test command blocks (the stuff between STARTTEST and ENDTEST)
-- in the original test. These have been converted to "it" test cases here.
local helpers = require('test.functional.helpers')(after_each)
local feed, insert = helpers.feed, helpers.insert
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
-- Inserts text as usual, and additionally positions the cursor on line 1 and
-- sets 'cindent' and tab settings. (In the original "test3.in" the modeline at
-- the top of the file takes care of this.)
local function insert_(content)
insert(content)
- execute('1', 'set cin ts=4 sw=4')
+ feed_command('1', 'set cin ts=4 sw=4')
end
+-- luacheck: ignore 621 (Indentation)
+-- luacheck: ignore 613 (Trailing whitespace in a string)
describe('cindent', function()
before_each(clear)
it('1 is working', function()
insert_([=[
-
+
/* start of AUTO matically checked vim: set ts=4 : */
{
if (test)
cmd1;
cmd2;
}
-
+
{
if (test)
cmd1;
else
cmd2;
}
-
+
{
if (test)
{
@@ -42,7 +45,7 @@ describe('cindent', function()
cmd2;
}
}
-
+
{
if (test)
{
@@ -50,14 +53,14 @@ describe('cindent', function()
else
}
}
-
+
{
while (this)
if (test)
cmd1;
cmd2;
}
-
+
{
while (this)
if (test)
@@ -65,25 +68,25 @@ describe('cindent', function()
else
cmd2;
}
-
+
{
if (test)
{
cmd;
}
-
+
if (test)
cmd;
}
-
+
{
if (test) {
cmd;
}
-
+
if (test) cmd;
}
-
+
{
cmd1;
for (blah)
@@ -92,7 +95,7 @@ describe('cindent', function()
cmd2;
cmd3;
}
-
+
{
cmd1;
for (blah)
@@ -100,7 +103,7 @@ describe('cindent', function()
if (test)
cmd2;
cmd3;
-
+
if (test)
{
cmd1;
@@ -108,23 +111,23 @@ describe('cindent', function()
cmd3;
}
}
-
-
+
+
/* Test for 'cindent' do/while mixed with if/else: */
-
+
{
do
if (asdf)
asdfasd;
while (cond);
-
+
do
if (asdf)
while (asdf)
asdf;
while (asdf);
}
-
+
/* Test for 'cindent' with two ) on a continuation line */
{
if (asdfasdf;asldkfj asdlkfj as;ldkfj sal;d
@@ -132,14 +135,14 @@ describe('cindent', function()
al;sdjfka ;slkdf ) sa;ldkjfsa dlk;)
line up here;
}
-
-
+
+
/* C++ tests: */
-
+
// foo() these three lines should remain in column 0
// {
// }
-
+
/* Test for continuation and unterminated lines: */
{
i = 99 + 14325 +
@@ -151,12 +154,12 @@ describe('cindent', function()
1234;
c = 1;
}
-
+
/*
testje for indent with empty line
-
+
here */
-
+
{
if (testing &&
not a joke ||
@@ -171,8 +174,8 @@ describe('cindent', function()
line up here))
hay;
}
-
-
+
+
{
switch (c)
{
@@ -191,7 +194,7 @@ describe('cindent', function()
testing;
}
}
-
+
{
if (cond) {
foo;
@@ -201,7 +204,7 @@ describe('cindent', function()
bar;
}
}
-
+
{
if (alskdfj ;alsdkfjal;skdjf (;sadlkfsa ;dlkf j;alksdfj ;alskdjf
alsdkfj (asldk;fj
@@ -210,7 +213,7 @@ describe('cindent', function()
asdfasdf;)))
asdfasdf;
}
-
+
int
func(a, b)
int a;
@@ -223,7 +226,7 @@ describe('cindent', function()
(c2 || c3)
)
}
-
+
{
while (asd)
{
@@ -245,13 +248,13 @@ describe('cindent', function()
asdf;
}
}
-
+
{
s = "/*"; b = ';'
s = "/*"; b = ';';
a = b;
}
-
+
{
switch (a)
{
@@ -285,7 +288,7 @@ describe('cindent', function()
break;
}
}
-
+
{
if (!(vim_strchr(p_cpo, CPO_BUFOPTGLOB) != NULL && entering) &&
(bp_to->b_p_initialized ||
@@ -297,57 +300,57 @@ describe('cindent', function()
asdf = asdf ?
asdf: asdf;
}
-
+
/* Special Comments : This function has the added complexity (compared */
/* : to addtolist) of having to check for a detail */
/* : texture and add that to the list first. */
-
+
char *(array[100]) = {
"testje",
"foo",
"bar",
}
-
+
enum soppie
{
yes = 0,
no,
maybe
};
-
+
typedef enum soppie
{
yes = 0,
no,
maybe
};
-
+
static enum
{
yes = 0,
no,
maybe
} soppie;
-
+
public static enum
{
yes = 0,
no,
maybe
} soppie;
-
+
static private enum
{
yes = 0,
no,
maybe
} soppie;
-
+
{
int a,
b;
}
-
+
{
struct Type
{
@@ -360,7 +363,7 @@ describe('cindent', function()
2, "two",
3, "three"
};
-
+
float matrix[3][3] =
{
{
@@ -380,14 +383,14 @@ describe('cindent', function()
}
};
}
-
+
{
/* blah ( blah */
/* where does this go? */
-
+
/* blah ( blah */
cmd;
-
+
func(arg1,
/* comment */
arg2);
@@ -398,7 +401,7 @@ describe('cindent', function()
c; /* Hey, NOW it indents?! */
}
}
-
+
{
func(arg1,
arg2,
@@ -406,7 +409,7 @@ describe('cindent', function()
/* Hey, what am I doing here? Is this coz of the ","? */
}
}
-
+
main ()
{
if (cond)
@@ -420,7 +423,7 @@ describe('cindent', function()
a = d;
return;
}
-
+
{
case 2: if (asdf &&
asdfasdf)
@@ -431,42 +434,42 @@ describe('cindent', function()
a = 9;
case 4: x = 1;
y = 2;
-
+
label: if (asdf)
here;
-
+
label: if (asdf &&
asdfasdf)
{
}
-
+
label: if (asdf &&
asdfasdf) {
there;
}
-
+
label: if (asdf &&
asdfasdf)
there;
}
-
+
{
/*
hello with ":set comments= cino=c5"
*/
-
+
/*
hello with ":set comments= cino="
*/
}
-
-
+
+
{
if (a < b) {
a = a + 1;
} else
a = a + 2;
-
+
if (a)
do {
testing;
@@ -474,7 +477,7 @@ describe('cindent', function()
a = b + 1;
asdfasdf
}
-
+
{
for ( int i = 0;
i < 10; i++ )
@@ -482,13 +485,13 @@ describe('cindent', function()
}
i = 0;
}
-
+
class bob
{
int foo() {return 1;}
int bar;
}
-
+
main()
{
while(1)
@@ -501,32 +504,32 @@ describe('cindent', function()
}
misplacedline;
}
-
+
{
if (clipboard.state == SELECT_DONE
&& ((row == clipboard.start.lnum
&& col >= clipboard.start.col)
|| row > clipboard.start.lnum))
}
-
+
{
if (1) {i += 4;}
where_am_i;
return 0;
}
-
+
{
{
} // sdf(asdf
if (asdf)
asd;
}
-
+
{
label1:
label2:
}
-
+
{
int fooRet = foo(pBar1, false /*fKB*/,
true /*fPTB*/, 3 /*nT*/, false /*fDF*/);
@@ -538,12 +541,12 @@ describe('cindent', function()
}
}
}
-
+
{
f1(/*comment*/);
f2();
}
-
+
{
do {
if (foo) {
@@ -552,25 +555,25 @@ describe('cindent', function()
} while (foo);
foo(); // was wrong
}
-
+
int x; // no extra indent because of the ;
void func()
{
}
-
+
char *tab[] = {"aaa",
"};", /* }; */ NULL}
int indented;
{}
-
+
char *a[] = {"aaa", "bbb",
"ccc", NULL};
// here
-
+
char *tab[] = {"aaa",
"xx", /* xx */}; /* asdf */
int not_indented;
-
+
{
do {
switch (bla)
@@ -581,23 +584,23 @@ describe('cindent', function()
} while (boo);
wrong;
}
-
+
int foo,
bar;
int foo;
-
+
#if defined(foo) \
&& defined(bar)
char * xx = "asdf\
foo\
bor";
int x;
-
+
char *foo = "asdf\
asdf\
asdf",
*bar;
-
+
void f()
{
#if defined(foo) \
@@ -616,19 +619,19 @@ describe('cindent', function()
#endif
}
#endif
-
+
int y; // comment
// comment
-
+
// comment
-
+
{
Constructor(int a,
int b ) : BaseClass(a)
{
}
}
-
+
void foo()
{
char one,
@@ -645,13 +648,13 @@ describe('cindent', function()
kees,
jan;
}
-
+
{
t(int f,
int d); // )
d();
}
-
+
Constructor::Constructor(int a,
int b
) :
@@ -661,33 +664,33 @@ describe('cindent', function()
mMember(b),
{
}
-
+
Constructor::Constructor(int a,
int b ) :
BaseClass(a)
{
}
-
+
Constructor::Constructor(int a,
int b ) /*x*/ : /*x*/ BaseClass(a),
member(b)
{
}
-
+
A::A(int a, int b)
: aa(a),
bb(b),
cc(c)
{
}
-
+
class CAbc :
public BaseClass1,
protected BaseClass2
{
int Test() { return FALSE; }
int Test1() { return TRUE; }
-
+
CAbc(int a, int b ) :
BaseClass(a)
{
@@ -696,24 +699,24 @@ describe('cindent', function()
case abc:
asdf();
break;
-
+
case 999:
baer();
break;
}
}
-
+
public: // <-- this was incoreectly indented before!!
void testfall();
protected:
void testfall();
};
-
+
class CAbc : public BaseClass1,
protected BaseClass2
{
};
-
+
static struct
{
int a;
@@ -729,7 +732,7 @@ describe('cindent', function()
456
}
};
-
+
static struct
{
int a;
@@ -739,7 +742,7 @@ describe('cindent', function()
{ 123, 456 },
{ 123, 456 }
};
-
+
void asdf() /* ind_maxparen may cause trouble here */
{
if ((0
@@ -769,17 +772,17 @@ describe('cindent', function()
&& 1
&& 1)) break;
}
-
+
foo()
{
a = cond ? foo() : asdf
+ asdf;
-
+
a = cond ?
foo() : asdf
+ asdf;
}
-
+
int main(void)
{
if (a)
@@ -788,7 +791,7 @@ describe('cindent', function()
else 3;
next_line_of_code();
}
-
+
barry()
{
Foo::Foo (int one,
@@ -796,14 +799,14 @@ describe('cindent', function()
: something(4)
{}
}
-
+
barry()
{
Foo::Foo (int one, int two)
: something(4)
{}
}
-
+
Constructor::Constructor(int a,
int b
) :
@@ -822,7 +825,7 @@ describe('cindent', function()
&& lele);
lulu;
}
-
+
int main ()
{
switch (c)
@@ -832,13 +835,13 @@ describe('cindent', function()
}
}
}
-
+
main()
{
(void) MyFancyFuasdfadsfnction(
argument);
}
-
+
main()
{
char foo[] = "/*";
@@ -846,7 +849,7 @@ describe('cindent', function()
df */
hello
}
-
+
/* valid namespaces with normal indent */
namespace
{
@@ -885,7 +888,7 @@ describe('cindent', function()
22222222222222222;
}
}
-
+
/* invalid namespaces use block indent */
namespace test test2 {
111111111111111111111;
@@ -925,7 +928,7 @@ describe('cindent', function()
}
)foo";
}
-
+
{
int a[4] = {
[0] = 0,
@@ -934,12 +937,12 @@ describe('cindent', function()
[3] = 3,
};
}
-
+
{
a = b[2]
+ 3;
}
-
+
{
if (1)
/* aaaaa
@@ -947,7 +950,7 @@ describe('cindent', function()
*/
a = 1;
}
-
+
void func()
{
switch (foo)
@@ -974,29 +977,29 @@ describe('cindent', function()
break;
}
}
-
+
/* end of AUTO */
]=])
- execute('/start of AUTO')
+ feed_command('/start of AUTO')
feed('=/end of AUTO<cr>')
expect([=[
-
+
/* start of AUTO matically checked vim: set ts=4 : */
{
if (test)
cmd1;
cmd2;
}
-
+
{
if (test)
cmd1;
else
cmd2;
}
-
+
{
if (test)
{
@@ -1004,7 +1007,7 @@ describe('cindent', function()
cmd2;
}
}
-
+
{
if (test)
{
@@ -1012,14 +1015,14 @@ describe('cindent', function()
else
}
}
-
+
{
while (this)
if (test)
cmd1;
cmd2;
}
-
+
{
while (this)
if (test)
@@ -1027,25 +1030,25 @@ describe('cindent', function()
else
cmd2;
}
-
+
{
if (test)
{
cmd;
}
-
+
if (test)
cmd;
}
-
+
{
if (test) {
cmd;
}
-
+
if (test) cmd;
}
-
+
{
cmd1;
for (blah)
@@ -1054,7 +1057,7 @@ describe('cindent', function()
cmd2;
cmd3;
}
-
+
{
cmd1;
for (blah)
@@ -1062,7 +1065,7 @@ describe('cindent', function()
if (test)
cmd2;
cmd3;
-
+
if (test)
{
cmd1;
@@ -1070,23 +1073,23 @@ describe('cindent', function()
cmd3;
}
}
-
-
+
+
/* Test for 'cindent' do/while mixed with if/else: */
-
+
{
do
if (asdf)
asdfasd;
while (cond);
-
+
do
if (asdf)
while (asdf)
asdf;
while (asdf);
}
-
+
/* Test for 'cindent' with two ) on a continuation line */
{
if (asdfasdf;asldkfj asdlkfj as;ldkfj sal;d
@@ -1094,14 +1097,14 @@ describe('cindent', function()
al;sdjfka ;slkdf ) sa;ldkjfsa dlk;)
line up here;
}
-
-
+
+
/* C++ tests: */
-
+
// foo() these three lines should remain in column 0
// {
// }
-
+
/* Test for continuation and unterminated lines: */
{
i = 99 + 14325 +
@@ -1113,12 +1116,12 @@ describe('cindent', function()
1234;
c = 1;
}
-
+
/*
testje for indent with empty line
-
+
here */
-
+
{
if (testing &&
not a joke ||
@@ -1133,8 +1136,8 @@ describe('cindent', function()
line up here))
hay;
}
-
-
+
+
{
switch (c)
{
@@ -1153,7 +1156,7 @@ describe('cindent', function()
testing;
}
}
-
+
{
if (cond) {
foo;
@@ -1163,7 +1166,7 @@ describe('cindent', function()
bar;
}
}
-
+
{
if (alskdfj ;alsdkfjal;skdjf (;sadlkfsa ;dlkf j;alksdfj ;alskdjf
alsdkfj (asldk;fj
@@ -1172,7 +1175,7 @@ describe('cindent', function()
asdfasdf;)))
asdfasdf;
}
-
+
int
func(a, b)
int a;
@@ -1185,7 +1188,7 @@ describe('cindent', function()
(c2 || c3)
)
}
-
+
{
while (asd)
{
@@ -1207,13 +1210,13 @@ describe('cindent', function()
asdf;
}
}
-
+
{
s = "/*"; b = ';'
s = "/*"; b = ';';
a = b;
}
-
+
{
switch (a)
{
@@ -1247,7 +1250,7 @@ describe('cindent', function()
break;
}
}
-
+
{
if (!(vim_strchr(p_cpo, CPO_BUFOPTGLOB) != NULL && entering) &&
(bp_to->b_p_initialized ||
@@ -1259,57 +1262,57 @@ describe('cindent', function()
asdf = asdf ?
asdf: asdf;
}
-
+
/* Special Comments : This function has the added complexity (compared */
/* : to addtolist) of having to check for a detail */
/* : texture and add that to the list first. */
-
+
char *(array[100]) = {
"testje",
"foo",
"bar",
}
-
+
enum soppie
{
yes = 0,
no,
maybe
};
-
+
typedef enum soppie
{
yes = 0,
no,
maybe
};
-
+
static enum
{
yes = 0,
no,
maybe
} soppie;
-
+
public static enum
{
yes = 0,
no,
maybe
} soppie;
-
+
static private enum
{
yes = 0,
no,
maybe
} soppie;
-
+
{
int a,
b;
}
-
+
{
struct Type
{
@@ -1322,7 +1325,7 @@ describe('cindent', function()
2, "two",
3, "three"
};
-
+
float matrix[3][3] =
{
{
@@ -1342,14 +1345,14 @@ describe('cindent', function()
}
};
}
-
+
{
/* blah ( blah */
/* where does this go? */
-
+
/* blah ( blah */
cmd;
-
+
func(arg1,
/* comment */
arg2);
@@ -1360,7 +1363,7 @@ describe('cindent', function()
c; /* Hey, NOW it indents?! */
}
}
-
+
{
func(arg1,
arg2,
@@ -1368,7 +1371,7 @@ describe('cindent', function()
/* Hey, what am I doing here? Is this coz of the ","? */
}
}
-
+
main ()
{
if (cond)
@@ -1382,7 +1385,7 @@ describe('cindent', function()
a = d;
return;
}
-
+
{
case 2: if (asdf &&
asdfasdf)
@@ -1393,42 +1396,42 @@ describe('cindent', function()
a = 9;
case 4: x = 1;
y = 2;
-
+
label: if (asdf)
here;
-
+
label: if (asdf &&
asdfasdf)
{
}
-
+
label: if (asdf &&
asdfasdf) {
there;
}
-
+
label: if (asdf &&
asdfasdf)
there;
}
-
+
{
/*
hello with ":set comments= cino=c5"
*/
-
+
/*
hello with ":set comments= cino="
*/
}
-
-
+
+
{
if (a < b) {
a = a + 1;
} else
a = a + 2;
-
+
if (a)
do {
testing;
@@ -1436,7 +1439,7 @@ describe('cindent', function()
a = b + 1;
asdfasdf
}
-
+
{
for ( int i = 0;
i < 10; i++ )
@@ -1444,13 +1447,13 @@ describe('cindent', function()
}
i = 0;
}
-
+
class bob
{
int foo() {return 1;}
int bar;
}
-
+
main()
{
while(1)
@@ -1463,32 +1466,32 @@ describe('cindent', function()
}
misplacedline;
}
-
+
{
if (clipboard.state == SELECT_DONE
&& ((row == clipboard.start.lnum
&& col >= clipboard.start.col)
|| row > clipboard.start.lnum))
}
-
+
{
if (1) {i += 4;}
where_am_i;
return 0;
}
-
+
{
{
} // sdf(asdf
if (asdf)
asd;
}
-
+
{
label1:
label2:
}
-
+
{
int fooRet = foo(pBar1, false /*fKB*/,
true /*fPTB*/, 3 /*nT*/, false /*fDF*/);
@@ -1500,12 +1503,12 @@ describe('cindent', function()
}
}
}
-
+
{
f1(/*comment*/);
f2();
}
-
+
{
do {
if (foo) {
@@ -1514,25 +1517,25 @@ describe('cindent', function()
} while (foo);
foo(); // was wrong
}
-
+
int x; // no extra indent because of the ;
void func()
{
}
-
+
char *tab[] = {"aaa",
"};", /* }; */ NULL}
int indented;
{}
-
+
char *a[] = {"aaa", "bbb",
"ccc", NULL};
// here
-
+
char *tab[] = {"aaa",
"xx", /* xx */}; /* asdf */
int not_indented;
-
+
{
do {
switch (bla)
@@ -1543,23 +1546,23 @@ describe('cindent', function()
} while (boo);
wrong;
}
-
+
int foo,
bar;
int foo;
-
+
#if defined(foo) \
&& defined(bar)
char * xx = "asdf\
foo\
bor";
int x;
-
+
char *foo = "asdf\
asdf\
asdf",
*bar;
-
+
void f()
{
#if defined(foo) \
@@ -1578,19 +1581,19 @@ describe('cindent', function()
#endif
}
#endif
-
+
int y; // comment
// comment
-
+
// comment
-
+
{
Constructor(int a,
int b ) : BaseClass(a)
{
}
}
-
+
void foo()
{
char one,
@@ -1607,13 +1610,13 @@ describe('cindent', function()
kees,
jan;
}
-
+
{
t(int f,
int d); // )
d();
}
-
+
Constructor::Constructor(int a,
int b
) :
@@ -1623,33 +1626,33 @@ describe('cindent', function()
mMember(b),
{
}
-
+
Constructor::Constructor(int a,
int b ) :
BaseClass(a)
{
}
-
+
Constructor::Constructor(int a,
int b ) /*x*/ : /*x*/ BaseClass(a),
member(b)
{
}
-
+
A::A(int a, int b)
: aa(a),
bb(b),
cc(c)
{
}
-
+
class CAbc :
public BaseClass1,
protected BaseClass2
{
int Test() { return FALSE; }
int Test1() { return TRUE; }
-
+
CAbc(int a, int b ) :
BaseClass(a)
{
@@ -1658,24 +1661,24 @@ describe('cindent', function()
case abc:
asdf();
break;
-
+
case 999:
baer();
break;
}
}
-
+
public: // <-- this was incoreectly indented before!!
void testfall();
protected:
void testfall();
};
-
+
class CAbc : public BaseClass1,
protected BaseClass2
{
};
-
+
static struct
{
int a;
@@ -1691,7 +1694,7 @@ describe('cindent', function()
456
}
};
-
+
static struct
{
int a;
@@ -1701,7 +1704,7 @@ describe('cindent', function()
{ 123, 456 },
{ 123, 456 }
};
-
+
void asdf() /* ind_maxparen may cause trouble here */
{
if ((0
@@ -1731,17 +1734,17 @@ describe('cindent', function()
&& 1
&& 1)) break;
}
-
+
foo()
{
a = cond ? foo() : asdf
+ asdf;
-
+
a = cond ?
foo() : asdf
+ asdf;
}
-
+
int main(void)
{
if (a)
@@ -1750,7 +1753,7 @@ describe('cindent', function()
else 3;
next_line_of_code();
}
-
+
barry()
{
Foo::Foo (int one,
@@ -1758,14 +1761,14 @@ describe('cindent', function()
: something(4)
{}
}
-
+
barry()
{
Foo::Foo (int one, int two)
: something(4)
{}
}
-
+
Constructor::Constructor(int a,
int b
) :
@@ -1784,7 +1787,7 @@ describe('cindent', function()
&& lele);
lulu;
}
-
+
int main ()
{
switch (c)
@@ -1794,13 +1797,13 @@ describe('cindent', function()
}
}
}
-
+
main()
{
(void) MyFancyFuasdfadsfnction(
argument);
}
-
+
main()
{
char foo[] = "/*";
@@ -1808,7 +1811,7 @@ describe('cindent', function()
df */
hello
}
-
+
/* valid namespaces with normal indent */
namespace
{
@@ -1847,7 +1850,7 @@ describe('cindent', function()
22222222222222222;
}
}
-
+
/* invalid namespaces use block indent */
namespace test test2 {
111111111111111111111;
@@ -1887,7 +1890,7 @@ describe('cindent', function()
}
)foo";
}
-
+
{
int a[4] = {
[0] = 0,
@@ -1896,12 +1899,12 @@ describe('cindent', function()
[3] = 3,
};
}
-
+
{
a = b[2]
+ 3;
}
-
+
{
if (1)
/* aaaaa
@@ -1909,7 +1912,7 @@ describe('cindent', function()
*/
a = 1;
}
-
+
void func()
{
switch (foo)
@@ -1936,16 +1939,16 @@ describe('cindent', function()
break;
}
}
-
+
/* end of AUTO */
]=])
end)
it('2 is working', function()
insert_([=[
-
+
{
-
+
/* this is
* a real serious important big
* comment
@@ -1954,14 +1957,15 @@ describe('cindent', function()
}
]=])
- execute('set tw=0 wm=60 columns=80 noai fo=croq')
- execute('/serious/e')
+ feed_command('set tw=0 noai fo=croq')
+ feed_command('let &wm = &columns - 20')
+ feed_command('/serious/e')
feed('a about life, the universe, and the rest<esc>')
expect([=[
-
+
{
-
+
/* this is
* a real serious
* about life, the
@@ -1976,48 +1980,48 @@ describe('cindent', function()
it('3 is working', function()
insert_([=[
-
+
{
/*
* Testing for comments, without 'cin' set
*/
-
+
/*
* what happens here?
*/
-
+
/*
the end of the comment, try inserting a line below */
-
+
/* how about
this one */
}
]=])
- execute('set nocin')
- execute('/comments')
+ feed_command('set nocin')
+ feed_command('/comments')
feed('joabout life<esc>/happens<cr>')
feed('jothere<esc>/below<cr>')
feed('oline<esc>/this<cr>')
feed('Ohello<esc>')
expect([=[
-
+
{
/*
* Testing for comments, without 'cin' set
*/
about life
-
+
/*
* what happens here?
*/
there
-
+
/*
the end of the comment, try inserting a line below */
line
-
+
/* how about
hello
this one */
@@ -2027,19 +2031,19 @@ describe('cindent', function()
it('4 is working', function()
insert_([=[
-
+
{
var = this + that + vec[0] * vec[0]
+ vec[1] * vec[1]
+ vec2[2] * vec[2];
}
]=])
- execute('set cin')
- execute('/vec2')
+ feed_command('set cin')
+ feed_command('/vec2')
feed('==<cr>')
expect([=[
-
+
{
var = this + that + vec[0] * vec[0]
+ vec[1] * vec[1]
@@ -2050,7 +2054,7 @@ describe('cindent', function()
it('5 is working', function()
insert_([=[
-
+
{
asdf asdflkajds f;
if (tes & ting) {
@@ -2067,14 +2071,14 @@ describe('cindent', function()
}
]=])
- execute('set cin')
- execute('set cino=}4')
- execute('/testing1')
+ feed_command('set cin')
+ feed_command('set cino=}4')
+ feed_command('/testing1')
feed('k2==/testing2<cr>')
feed('k2==<cr>')
expect([=[
-
+
{
asdf asdflkajds f;
if (tes & ting) {
@@ -2094,7 +2098,7 @@ describe('cindent', function()
it('6 is working', function()
insert_([=[
-
+
main ( int first_par, /*
* Comment for
* first par
@@ -2114,17 +2118,17 @@ describe('cindent', function()
* second par
*/
);
-
+
}
]=])
- execute('set cin')
- execute('set cino=(0,)20')
- execute('/main')
+ feed_command('set cin')
+ feed_command('set cino=(0,)20')
+ feed_command('/main')
feed('=][<cr>')
expect([=[
-
+
main ( int first_par, /*
* Comment for
* first par
@@ -2144,14 +2148,14 @@ describe('cindent', function()
* second par
*/
);
-
+
}
]=])
end)
it('7 is working', function()
insert_([=[
-
+
main(void)
{
/* Make sure that cino=X0s is not parsed like cino=Xs. */
@@ -2164,13 +2168,13 @@ describe('cindent', function()
}
]=])
- execute('set cin')
- execute('set cino=es,n0s')
- execute('/main')
+ feed_command('set cin')
+ feed_command('set cino=es,n0s')
+ feed_command('/main')
feed('=][<cr>')
expect([=[
-
+
main(void)
{
/* Make sure that cino=X0s is not parsed like cino=Xs. */
@@ -2186,7 +2190,7 @@ describe('cindent', function()
it('8 is working', function()
insert_([=[
-
+
{
do
{
@@ -2202,12 +2206,12 @@ describe('cindent', function()
}
]=])
- execute('set cin')
- execute('set cino=')
+ feed_command('set cin')
+ feed_command('set cino=')
feed(']]=][<cr>')
expect([=[
-
+
{
do
{
@@ -2226,16 +2230,16 @@ describe('cindent', function()
it('9 is working', function()
insert_([=[
-
+
void f()
{
if ( k() ) {
l();
-
+
} else { /* Start (two words) end */
m();
}
-
+
n();
}
]=])
@@ -2243,16 +2247,16 @@ describe('cindent', function()
feed(']]=][<cr>')
expect([=[
-
+
void f()
{
if ( k() ) {
l();
-
+
} else { /* Start (two words) end */
m();
}
-
+
n();
}
]=])
@@ -2267,7 +2271,7 @@ describe('cindent', function()
-- indented properly. And that's why we've had to add one explicitly.
insert_([=[
{ <= THIS IS THE CURLY BRACKET EXPLAINED IN THE COMMENT.
-
+
void f()
{
if ( k() )
@@ -2280,12 +2284,12 @@ describe('cindent', function()
}
]=])
- execute('set cino={s,e-s')
+ feed_command('set cino={s,e-s')
feed(']]=][<cr>')
expect([=[
{ <= THIS IS THE CURLY BRACKET EXPLAINED IN THE COMMENT.
-
+
void f()
{
if ( k() )
@@ -2301,7 +2305,7 @@ describe('cindent', function()
it('11 is working', function()
insert_([=[
-
+
void bar(void)
{
static array[2][2] =
@@ -2309,12 +2313,12 @@ describe('cindent', function()
{ 1, 2 },
{ 3, 4 },
}
-
+
while (a)
{
foo(&a);
}
-
+
{
int a;
{
@@ -2323,7 +2327,7 @@ describe('cindent', function()
}
b = a;
}
-
+
void func(void)
{
a = 1;
@@ -2336,11 +2340,11 @@ describe('cindent', function()
/* foo */
]=])
- execute('set cino={s,fs')
+ feed_command('set cino={s,fs')
feed(']]=/ foo<cr>')
expect([=[
-
+
void bar(void)
{
static array[2][2] =
@@ -2348,12 +2352,12 @@ describe('cindent', function()
{ 1, 2 },
{ 3, 4 },
}
-
+
while (a)
{
foo(&a);
}
-
+
{
int a;
{
@@ -2362,7 +2366,7 @@ describe('cindent', function()
}
b = a;
}
-
+
void func(void)
{
a = 1;
@@ -2378,7 +2382,7 @@ describe('cindent', function()
it('12 is working', function()
insert_([=[
-
+
a()
{
do {
@@ -2390,12 +2394,12 @@ describe('cindent', function()
}
]=])
- execute('set cino=')
- execute('/while')
+ feed_command('set cino=')
+ feed_command('/while')
feed('ohere<esc>')
expect([=[
-
+
a()
{
do {
@@ -2411,7 +2415,7 @@ describe('cindent', function()
it('13 is working', function()
insert_([=[
-
+
a()
{
label1:
@@ -2420,12 +2424,12 @@ describe('cindent', function()
}
]=])
- execute('set cino= com=')
- execute('/comment')
+ feed_command('set cino= com=')
+ feed_command('/comment')
feed('olabel2: b();<cr>label3 /* post */:<cr>/* pre */ label4:<cr>f(/*com*/);<cr>if (/*com*/)<cr>cmd();<esc>')
expect([=[
-
+
a()
{
label1:
@@ -2443,26 +2447,26 @@ describe('cindent', function()
it('14 is working', function()
insert_([=[
-
+
/*
* A simple comment
*/
-
+
/*
** A different comment
*/
]=])
- execute('set comments& comments^=s:/*,m:**,ex:*/')
- execute('/simple')
+ feed_command('set comments& comments^=s:/*,m:**,ex:*/')
+ feed_command('/simple')
feed('=5j<cr>')
expect([=[
-
+
/*
* A simple comment
*/
-
+
/*
** A different comment
*/
@@ -2471,26 +2475,26 @@ describe('cindent', function()
it('15 is working', function()
insert_([=[
-
-
+
+
void f()
{
-
+
/*********
A comment.
*********/
}
]=])
- execute('set cino=c0')
- execute('set comments& comments-=s1:/* comments^=s0:/*')
+ feed_command('set cino=c0')
+ feed_command('set comments& comments-=s1:/* comments^=s0:/*')
feed('2kdd]]=][<cr>')
expect([=[
-
+
void f()
{
-
+
/*********
A comment.
*********/
@@ -2500,26 +2504,26 @@ describe('cindent', function()
it('16 is working', function()
insert_([=[
-
-
+
+
void f()
{
-
+
/*********
A comment.
*********/
}
]=])
- execute('set cino=c0,C1')
- execute('set comments& comments-=s1:/* comments^=s0:/*')
+ feed_command('set cino=c0,C1')
+ feed_command('set comments& comments-=s1:/* comments^=s0:/*')
feed('2kdd]]=][<cr>')
expect([=[
-
+
void f()
{
-
+
/*********
A comment.
*********/
@@ -2529,7 +2533,7 @@ describe('cindent', function()
it('17 is working', function()
insert_([=[
-
+
void f()
{
c = c1 &&
@@ -2540,11 +2544,11 @@ describe('cindent', function()
}
]=])
- execute('set cino=')
+ feed_command('set cino=')
feed(']]=][<cr>')
expect([=[
-
+
void f()
{
c = c1 &&
@@ -2558,8 +2562,8 @@ describe('cindent', function()
it('18 is working', function()
insert_([=[
-
-
+
+
void f()
{
c = c1 &&
@@ -2570,11 +2574,11 @@ describe('cindent', function()
}
]=])
- execute('set cino=(s')
+ feed_command('set cino=(s')
feed('2kdd]]=][<cr>')
expect([=[
-
+
void f()
{
c = c1 &&
@@ -2588,8 +2592,8 @@ describe('cindent', function()
it('19 is working', function()
insert_([=[
-
-
+
+
void f()
{
c = c1 &&
@@ -2600,11 +2604,11 @@ describe('cindent', function()
}
]=])
- execute('set cino=(s,U1 ')
+ feed_command('set cino=(s,U1 ')
feed('2kdd]]=][<cr>')
expect([=[
-
+
void f()
{
c = c1 &&
@@ -2618,8 +2622,8 @@ describe('cindent', function()
it('20 is working', function()
insert_([=[
-
-
+
+
void f()
{
if ( c1
@@ -2629,11 +2633,11 @@ describe('cindent', function()
}
]=])
- execute('set cino=(0')
+ feed_command('set cino=(0')
feed('2kdd]]=][<cr>')
expect([=[
-
+
void f()
{
if ( c1
@@ -2646,8 +2650,8 @@ describe('cindent', function()
it('21 is working', function()
insert_([=[
-
-
+
+
void f()
{
if ( c1
@@ -2657,11 +2661,11 @@ describe('cindent', function()
}
]=])
- execute('set cino=(0,w1 ')
+ feed_command('set cino=(0,w1 ')
feed('2kdd]]=][<cr>')
expect([=[
-
+
void f()
{
if ( c1
@@ -2674,8 +2678,8 @@ describe('cindent', function()
it('22 is working', function()
insert_([=[
-
-
+
+
void f()
{
c = c1 && (
@@ -2689,11 +2693,11 @@ describe('cindent', function()
}
]=])
- execute('set cino=(s')
+ feed_command('set cino=(s')
feed('2kdd]]=][<cr>')
expect([=[
-
+
void f()
{
c = c1 && (
@@ -2710,8 +2714,8 @@ describe('cindent', function()
it('23 is working', function()
insert_([=[
-
-
+
+
void f()
{
c = c1 && (
@@ -2725,11 +2729,11 @@ describe('cindent', function()
}
]=])
- execute('set cino=(s,m1 ')
+ feed_command('set cino=(s,m1 ')
feed('2kdd]]=][<cr>')
expect([=[
-
+
void f()
{
c = c1 && (
@@ -2746,8 +2750,8 @@ describe('cindent', function()
it('24 is working', function()
insert_([=[
-
-
+
+
void f()
{
switch (x)
@@ -2762,11 +2766,11 @@ describe('cindent', function()
}
]=])
- execute('set cino=b1')
+ feed_command('set cino=b1')
feed('2kdd]]=][<cr>')
expect([=[
-
+
void f()
{
switch (x)
@@ -2784,8 +2788,8 @@ describe('cindent', function()
it('25 is working', function()
insert_([=[
-
-
+
+
void f()
{
invokeme(
@@ -2801,11 +2805,11 @@ describe('cindent', function()
}
]=])
- execute('set cino=(0,W5')
+ feed_command('set cino=(0,W5')
feed('2kdd]]=][<cr>')
expect([=[
-
+
void f()
{
invokeme(
@@ -2824,8 +2828,8 @@ describe('cindent', function()
it('26 is working', function()
insert_([=[
-
-
+
+
void f()
{
statement;
@@ -2834,11 +2838,11 @@ describe('cindent', function()
}
]=])
- execute('set cino=/6')
+ feed_command('set cino=/6')
feed('2kdd]]=][<cr>')
expect([=[
-
+
void f()
{
statement;
@@ -2850,8 +2854,8 @@ describe('cindent', function()
it('27 is working', function()
insert_([=[
-
-
+
+
void f()
{
statement;
@@ -2860,12 +2864,12 @@ describe('cindent', function()
}
]=])
- execute('set cino=')
+ feed_command('set cino=')
feed('2kdd]]/comment 1/+1<cr>')
feed('==<cr>')
expect([=[
-
+
void f()
{
statement;
@@ -2877,12 +2881,12 @@ describe('cindent', function()
it('28 is working', function()
insert_([=[
-
-
+
+
class CAbc
{
int Test() { return FALSE; }
-
+
public: // comment
void testfall();
protected:
@@ -2890,15 +2894,15 @@ describe('cindent', function()
};
]=])
- execute('set cino=g0')
+ feed_command('set cino=g0')
feed('2kdd]]=][<cr>')
expect([=[
-
+
class CAbc
{
int Test() { return FALSE; }
-
+
public: // comment
void testfall();
protected:
@@ -2909,8 +2913,8 @@ describe('cindent', function()
it('29 is working', function()
insert_([=[
-
-
+
+
class Foo : public Bar
{
public:
@@ -2921,11 +2925,11 @@ describe('cindent', function()
};
]=])
- execute('set cino=(0,gs,hs')
+ feed_command('set cino=(0,gs,hs')
feed('2kdd]]=][<cr>')
expect([=[
-
+
class Foo : public Bar
{
public:
@@ -2939,8 +2943,8 @@ describe('cindent', function()
it('30 is working', function()
insert_([=[
-
-
+
+
void
foo()
{
@@ -2951,11 +2955,11 @@ describe('cindent', function()
}
]=])
- execute('set cino=+20')
+ feed_command('set cino=+20')
feed('2kdd]]=][<cr>')
expect([=[
-
+
void
foo()
{
@@ -2969,8 +2973,8 @@ describe('cindent', function()
it('31 is working', function()
insert_([=[
-
-
+
+
{
averylongfunctionnamelongfunctionnameaverylongfunctionname()->asd(
asdasdf,
@@ -2978,9 +2982,9 @@ describe('cindent', function()
asdfadsf),
asdfasdf
);
-
+
/* those are ugly, but consequent */
-
+
func()->asd(asdasdf,
averylongfunctionname(
abc,
@@ -2994,7 +2998,7 @@ describe('cindent', function()
),
asdasdf
);
-
+
averylongfunctionnameaverylongfunctionnameavery()->asd(fasdf(
abc,
dec)->asdfasdfasdf(
@@ -3009,11 +3013,11 @@ describe('cindent', function()
}
]=])
- execute('set cino=(0,W2s')
+ feed_command('set cino=(0,W2s')
feed('2kdd]]=][<cr>')
expect([=[
-
+
{
averylongfunctionnamelongfunctionnameaverylongfunctionname()->asd(
asdasdf,
@@ -3021,9 +3025,9 @@ describe('cindent', function()
asdfadsf),
asdfasdf
);
-
+
/* those are ugly, but consequent */
-
+
func()->asd(asdasdf,
averylongfunctionname(
abc,
@@ -3037,7 +3041,7 @@ describe('cindent', function()
),
asdasdf
);
-
+
averylongfunctionnameaverylongfunctionnameavery()->asd(fasdf(
abc,
dec)->asdfasdfasdf(
@@ -3055,8 +3059,8 @@ describe('cindent', function()
it('32 is working', function()
insert_([=[
-
-
+
+
int main ()
{
if (cond1 &&
@@ -3066,11 +3070,11 @@ describe('cindent', function()
}
]=])
- execute('set cino=M1')
+ feed_command('set cino=M1')
feed('2kdd]]=][<cr>')
expect([=[
-
+
int main ()
{
if (cond1 &&
@@ -3083,8 +3087,8 @@ describe('cindent', function()
it('33 is working', function()
insert_([=[
-
-
+
+
void func(int a
#if defined(FOO)
, int b
@@ -3095,11 +3099,11 @@ describe('cindent', function()
}
]=])
- execute('set cino=(0,ts')
+ feed_command('set cino=(0,ts')
feed('2kdd2j=][<cr>')
expect([=[
-
+
void func(int a
#if defined(FOO)
, int b
@@ -3113,9 +3117,9 @@ describe('cindent', function()
it('34 is working', function()
insert_([=[
-
-
-
+
+
+
void
func(int a
#if defined(FOO)
@@ -3127,12 +3131,12 @@ describe('cindent', function()
}
]=])
- execute('set cino=(0')
+ feed_command('set cino=(0')
feed('2kdd2j=][<cr>')
expect([=[
-
-
+
+
void
func(int a
#if defined(FOO)
@@ -3147,8 +3151,8 @@ describe('cindent', function()
it('35 is working', function()
insert_([=[
-
-
+
+
void func(void)
{
if(x==y)
@@ -3159,7 +3163,7 @@ describe('cindent', function()
}
printf("Foo!\n");
}
-
+
void func1(void)
{
char* tab[] = {"foo", "bar",
@@ -3167,37 +3171,37 @@ describe('cindent', function()
"this line used", "to be indented incorrectly"};
foo();
}
-
+
void func2(void)
{
int tab[] =
{1, 2,
3, 4,
5, 6};
-
+
printf("This line used to be indented incorrectly.\n");
}
-
+
int foo[]
#ifdef BAR
-
+
= { 1, 2, 3,
4, 5, 6 }
-
+
#endif
;
int baz;
-
+
void func3(void)
{
int tab[] = {
1, 2,
3, 4,
5, 6};
-
+
printf("Don't you dare indent this line incorrectly!\n");
}
-
+
void
func4(a, b,
c)
@@ -3206,14 +3210,14 @@ describe('cindent', function()
int c;
{
}
-
+
void
func5(
int a,
int b)
{
}
-
+
void
func6(
int a)
@@ -3221,11 +3225,11 @@ describe('cindent', function()
}
]=])
- execute('set cino&')
+ feed_command('set cino&')
feed('2kdd2j=7][<cr>')
expect([=[
-
+
void func(void)
{
if(x==y)
@@ -3236,7 +3240,7 @@ describe('cindent', function()
}
printf("Foo!\n");
}
-
+
void func1(void)
{
char* tab[] = {"foo", "bar",
@@ -3244,37 +3248,37 @@ describe('cindent', function()
"this line used", "to be indented incorrectly"};
foo();
}
-
+
void func2(void)
{
int tab[] =
{1, 2,
3, 4,
5, 6};
-
+
printf("This line used to be indented incorrectly.\n");
}
-
+
int foo[]
#ifdef BAR
-
+
= { 1, 2, 3,
4, 5, 6 }
-
+
#endif
;
int baz;
-
+
void func3(void)
{
int tab[] = {
1, 2,
3, 4,
5, 6};
-
+
printf("Don't you dare indent this line incorrectly!\n");
}
-
+
void
func4(a, b,
c)
@@ -3283,14 +3287,14 @@ describe('cindent', function()
int c;
{
}
-
+
void
func5(
int a,
int b)
{
}
-
+
void
func6(
int a)
@@ -3301,17 +3305,17 @@ describe('cindent', function()
it('36 is working', function()
insert_([=[
-
-
+
+
void func(void)
{
int tab[] =
{
1, 2, 3,
4, 5, 6};
-
+
printf("Indent this line correctly!\n");
-
+
switch (foo)
{
case bar:
@@ -3328,21 +3332,21 @@ describe('cindent', function()
}
]=])
- execute('set cino&')
- execute('set cino+=l1')
+ feed_command('set cino&')
+ feed_command('set cino+=l1')
feed('2kdd2j=][<cr>')
expect([=[
-
+
void func(void)
{
int tab[] =
{
1, 2, 3,
4, 5, 6};
-
+
printf("Indent this line correctly!\n");
-
+
switch (foo)
{
case bar:
@@ -3362,8 +3366,8 @@ describe('cindent', function()
it('37 is working', function()
insert_([=[
-
-
+
+
void func(void)
{
cout << "a"
@@ -3373,11 +3377,11 @@ describe('cindent', function()
}
]=])
- execute('set cino&')
+ feed_command('set cino&')
feed('2kdd2j=][<cr>')
expect([=[
-
+
void func(void)
{
cout << "a"
@@ -3390,7 +3394,7 @@ describe('cindent', function()
it('38 is working', function()
insert_([=[
-
+
void func(void)
{
/*
@@ -3399,11 +3403,11 @@ describe('cindent', function()
}
]=])
- execute('set com=s1:/*,m:*,ex:*/')
+ feed_command('set com=s1:/*,m:*,ex:*/')
feed(']]3jofoo();<esc>')
expect([=[
-
+
void func(void)
{
/*
@@ -3416,8 +3420,8 @@ describe('cindent', function()
it('39 is working', function()
insert_([=[
-
-
+
+
void func(void)
{
for (int i = 0; i < 10; ++i)
@@ -3429,11 +3433,11 @@ describe('cindent', function()
}
]=])
- execute('set cino&')
+ feed_command('set cino&')
feed('2kdd2j=][<cr>')
expect([=[
-
+
void func(void)
{
for (int i = 0; i < 10; ++i)
@@ -3448,8 +3452,8 @@ describe('cindent', function()
it('40 is working', function()
insert_([=[
-
-
+
+
void func(void)
{
if (condition1
@@ -3457,7 +3461,7 @@ describe('cindent', function()
action();
function(argument1
&& argument2);
-
+
if (c1 && (c2 ||
c3))
foo;
@@ -3465,7 +3469,7 @@ describe('cindent', function()
(c2 || c3))
{
}
-
+
if ( c1
&& ( c2
|| c3))
@@ -3477,11 +3481,11 @@ describe('cindent', function()
}
]=])
- execute('set cino=k2s,(0')
+ feed_command('set cino=k2s,(0')
feed('2kdd3j=][<cr>')
expect([=[
-
+
void func(void)
{
if (condition1
@@ -3489,7 +3493,7 @@ describe('cindent', function()
action();
function(argument1
&& argument2);
-
+
if (c1 && (c2 ||
c3))
foo;
@@ -3497,7 +3501,7 @@ describe('cindent', function()
(c2 || c3))
{
}
-
+
if ( c1
&& ( c2
|| c3))
@@ -3512,8 +3516,8 @@ describe('cindent', function()
it('41 is working', function()
insert_([=[
-
-
+
+
void func(void)
{
if (condition1
@@ -3521,7 +3525,7 @@ describe('cindent', function()
action();
function(argument1
&& argument2);
-
+
if (c1 && (c2 ||
c3))
foo;
@@ -3529,7 +3533,7 @@ describe('cindent', function()
(c2 || c3))
{
}
-
+
if ( c1
&& ( c2
|| c3))
@@ -3541,11 +3545,11 @@ describe('cindent', function()
}
]=])
- execute('set cino=k2s,(s')
+ feed_command('set cino=k2s,(s')
feed('2kdd3j=][<cr>')
expect([=[
-
+
void func(void)
{
if (condition1
@@ -3553,7 +3557,7 @@ describe('cindent', function()
action();
function(argument1
&& argument2);
-
+
if (c1 && (c2 ||
c3))
foo;
@@ -3561,7 +3565,7 @@ describe('cindent', function()
(c2 || c3))
{
}
-
+
if ( c1
&& ( c2
|| c3))
@@ -3576,8 +3580,8 @@ describe('cindent', function()
it('42 is working', function()
insert_([=[
-
-
+
+
void func(void)
{
if (condition1
@@ -3585,7 +3589,7 @@ describe('cindent', function()
action();
function(argument1
&& argument2);
-
+
if (c1 && (c2 ||
c3))
foo;
@@ -3597,7 +3601,7 @@ describe('cindent', function()
&& (c22345
|| c3))
printf("foo\n");
-
+
c = c1 &&
(
c2 ||
@@ -3606,11 +3610,11 @@ describe('cindent', function()
}
]=])
- execute('set cino=k2s,(s,U1')
+ feed_command('set cino=k2s,(s,U1')
feed('2kdd3j=][<cr>')
expect([=[
-
+
void func(void)
{
if (condition1
@@ -3618,7 +3622,7 @@ describe('cindent', function()
action();
function(argument1
&& argument2);
-
+
if (c1 && (c2 ||
c3))
foo;
@@ -3630,7 +3634,7 @@ describe('cindent', function()
&& (c22345
|| c3))
printf("foo\n");
-
+
c = c1 &&
(
c2 ||
@@ -3642,8 +3646,8 @@ describe('cindent', function()
it('43 is working', function()
insert_([=[
-
-
+
+
void func(void)
{
if (condition1
@@ -3651,7 +3655,7 @@ describe('cindent', function()
action();
function(argument1
&& argument2);
-
+
if (c1 && (c2 ||
c3))
foo;
@@ -3663,12 +3667,12 @@ describe('cindent', function()
&& (c22345
|| c3))
printf("foo\n");
-
+
if ( c1
&& ( c2
|| c3))
foo;
-
+
a_long_line(
argument,
argument);
@@ -3677,11 +3681,11 @@ describe('cindent', function()
}
]=])
- execute('set cino=k2s,(0,W4')
+ feed_command('set cino=k2s,(0,W4')
feed('2kdd3j=][<cr>')
expect([=[
-
+
void func(void)
{
if (condition1
@@ -3689,7 +3693,7 @@ describe('cindent', function()
action();
function(argument1
&& argument2);
-
+
if (c1 && (c2 ||
c3))
foo;
@@ -3701,12 +3705,12 @@ describe('cindent', function()
&& (c22345
|| c3))
printf("foo\n");
-
+
if ( c1
&& ( c2
|| c3))
foo;
-
+
a_long_line(
argument,
argument);
@@ -3718,8 +3722,8 @@ describe('cindent', function()
it('44 is working', function()
insert_([=[
-
-
+
+
void func(void)
{
if (condition1
@@ -3727,7 +3731,7 @@ describe('cindent', function()
action();
function(argument1
&& argument2);
-
+
if (c1 && (c2 ||
c3))
foo;
@@ -3742,11 +3746,11 @@ describe('cindent', function()
}
]=])
- execute('set cino=k2s,u2')
+ feed_command('set cino=k2s,u2')
feed('2kdd3j=][<cr>')
expect([=[
-
+
void func(void)
{
if (condition1
@@ -3754,7 +3758,7 @@ describe('cindent', function()
action();
function(argument1
&& argument2);
-
+
if (c1 && (c2 ||
c3))
foo;
@@ -3772,8 +3776,8 @@ describe('cindent', function()
it('45 is working', function()
insert_([=[
-
-
+
+
void func(void)
{
if (condition1
@@ -3781,7 +3785,7 @@ describe('cindent', function()
action();
function(argument1
&& argument2);
-
+
if (c1 && (c2 ||
c3))
foo;
@@ -3793,7 +3797,7 @@ describe('cindent', function()
&& (c22345
|| c3))
printf("foo\n");
-
+
if ( c1
&& ( c2
|| c3))
@@ -3805,11 +3809,11 @@ describe('cindent', function()
}
]=])
- execute('set cino=k2s,(0,w1')
+ feed_command('set cino=k2s,(0,w1')
feed('2kdd3j=][<cr>')
expect([=[
-
+
void func(void)
{
if (condition1
@@ -3817,7 +3821,7 @@ describe('cindent', function()
action();
function(argument1
&& argument2);
-
+
if (c1 && (c2 ||
c3))
foo;
@@ -3829,7 +3833,7 @@ describe('cindent', function()
&& (c22345
|| c3))
printf("foo\n");
-
+
if ( c1
&& ( c2
|| c3))
@@ -3844,8 +3848,8 @@ describe('cindent', function()
it('46 is working', function()
insert_([=[
-
-
+
+
void func(void)
{
if (condition1
@@ -3853,7 +3857,7 @@ describe('cindent', function()
action();
function(argument1
&& argument2);
-
+
if (c1 && (c2 ||
c3))
foo;
@@ -3864,11 +3868,11 @@ describe('cindent', function()
}
]=])
- execute('set cino=k2,(s')
+ feed_command('set cino=k2,(s')
feed('2kdd3j=][<cr>')
expect([=[
-
+
void func(void)
{
if (condition1
@@ -3876,7 +3880,7 @@ describe('cindent', function()
action();
function(argument1
&& argument2);
-
+
if (c1 && (c2 ||
c3))
foo;
@@ -3890,7 +3894,7 @@ describe('cindent', function()
it('47 is working', function()
insert_([=[
-
+
NAMESPACESTART
/* valid namespaces with normal indent */
namespace
@@ -3915,6 +3919,26 @@ describe('cindent', function()
{
111111111111111111;
}
+ namespace test::cpp17
+ {
+ 111111111111111111;
+ }
+ namespace ::incorrectcpp17
+ {
+ 111111111111111111;
+ }
+ namespace test::incorrectcpp17::
+ {
+ 111111111111111111;
+ }
+ namespace test:incorrectcpp17
+ {
+ 111111111111111111;
+ }
+ namespace test:::incorrectcpp17
+ {
+ 111111111111111111;
+ }
namespace{
111111111111111111;
}
@@ -3930,7 +3954,7 @@ describe('cindent', function()
22222222222222222;
}
}
-
+
/* invalid namespaces use block indent */
namespace test test2 {
111111111111111111111;
@@ -3956,12 +3980,12 @@ describe('cindent', function()
NAMESPACEEND
]=])
- execute('set cino=N-s')
- execute('/^NAMESPACESTART')
+ feed_command('set cino=N-s')
+ feed_command('/^NAMESPACESTART')
feed('=/^NAMESPACEEND<cr>')
expect([=[
-
+
NAMESPACESTART
/* valid namespaces with normal indent */
namespace
@@ -3986,6 +4010,26 @@ describe('cindent', function()
{
111111111111111111;
}
+ namespace test::cpp17
+ {
+ 111111111111111111;
+ }
+ namespace ::incorrectcpp17
+ {
+ 111111111111111111;
+ }
+ namespace test::incorrectcpp17::
+ {
+ 111111111111111111;
+ }
+ namespace test:incorrectcpp17
+ {
+ 111111111111111111;
+ }
+ namespace test:::incorrectcpp17
+ {
+ 111111111111111111;
+ }
namespace{
111111111111111111;
}
@@ -4001,7 +4045,7 @@ describe('cindent', function()
22222222222222222;
}
}
-
+
/* invalid namespaces use block indent */
namespace test test2 {
111111111111111111111;
@@ -4030,7 +4074,7 @@ describe('cindent', function()
it('48 is working', function()
insert_([=[
-
+
JSSTART
var bar = {
foo: {
@@ -4047,12 +4091,12 @@ describe('cindent', function()
JSEND
]=])
- execute('set cino=j1,J1')
- execute('/^JSSTART')
+ feed_command('set cino=j1,J1')
+ feed_command('/^JSSTART')
feed('=/^JSEND<cr>')
expect([=[
-
+
JSSTART
var bar = {
foo: {
@@ -4072,7 +4116,7 @@ describe('cindent', function()
it('49 is working', function()
insert_([=[
-
+
JSSTART
var foo = [
1,
@@ -4082,12 +4126,12 @@ describe('cindent', function()
JSEND
]=])
- execute('set cino=j1,J1')
- execute('/^JSSTART')
+ feed_command('set cino=j1,J1')
+ feed_command('/^JSSTART')
feed('=/^JSEND<cr>')
expect([=[
-
+
JSSTART
var foo = [
1,
@@ -4100,7 +4144,7 @@ describe('cindent', function()
it('50 is working', function()
insert_([=[
-
+
JSSTART
function bar() {
var foo = [
@@ -4112,12 +4156,12 @@ describe('cindent', function()
JSEND
]=])
- execute('set cino=j1,J1')
- execute('/^JSSTART')
+ feed_command('set cino=j1,J1')
+ feed_command('/^JSSTART')
feed('=/^JSEND<cr>')
expect([=[
-
+
JSSTART
function bar() {
var foo = [
@@ -4132,10 +4176,10 @@ describe('cindent', function()
it('51 is working', function()
insert_([=[
-
+
JSSTART
(function($){
-
+
if (cond &&
cond) {
stmt;
@@ -4143,18 +4187,18 @@ describe('cindent', function()
window.something.left =
(width - 50 + offset) + "px";
var class_name='myclass';
-
+
function private_method() {
}
-
+
var public_method={
method: function(options,args){
private_method();
}
}
-
+
function init(options) {
-
+
$(this).data(class_name+'_public',$.extend({},{
foo: 'bar',
bar: 2,
@@ -4168,19 +4212,19 @@ describe('cindent', function()
}
}, options||{}));
}
-
+
$.fn[class_name]=function() {
-
+
var _arguments=arguments;
return this.each(function(){
-
+
var options=$(this).data(class_name+'_public');
if (!options) {
init.apply(this,_arguments);
-
+
} else {
var method=public_method[_arguments[0]];
-
+
if (typeof(method)!='function') {
console.log(class_name+' has no method "'+_arguments[0]+'"');
return false;
@@ -4190,20 +4234,20 @@ describe('cindent', function()
}
});
}
-
+
})(jQuery);
JSEND
]=])
- execute('set cino=j1,J1')
- execute('/^JSSTART')
+ feed_command('set cino=j1,J1')
+ feed_command('/^JSSTART')
feed('=/^JSEND<cr>')
expect([=[
-
+
JSSTART
(function($){
-
+
if (cond &&
cond) {
stmt;
@@ -4211,18 +4255,18 @@ describe('cindent', function()
window.something.left =
(width - 50 + offset) + "px";
var class_name='myclass';
-
+
function private_method() {
}
-
+
var public_method={
method: function(options,args){
private_method();
}
}
-
+
function init(options) {
-
+
$(this).data(class_name+'_public',$.extend({},{
foo: 'bar',
bar: 2,
@@ -4236,19 +4280,19 @@ describe('cindent', function()
}
}, options||{}));
}
-
+
$.fn[class_name]=function() {
-
+
var _arguments=arguments;
return this.each(function(){
-
+
var options=$(this).data(class_name+'_public');
if (!options) {
init.apply(this,_arguments);
-
+
} else {
var method=public_method[_arguments[0]];
-
+
if (typeof(method)!='function') {
console.log(class_name+' has no method "'+_arguments[0]+'"');
return false;
@@ -4258,7 +4302,7 @@ describe('cindent', function()
}
});
}
-
+
})(jQuery);
JSEND
]=])
@@ -4266,7 +4310,7 @@ describe('cindent', function()
it('52 is working', function()
insert_([=[
-
+
JSSTART
function init(options) {
$(this).data(class_name+'_public',$.extend({},{
@@ -4285,12 +4329,12 @@ describe('cindent', function()
JSEND
]=])
- execute('set cino=j1,J1')
- execute('/^JSSTART')
+ feed_command('set cino=j1,J1')
+ feed_command('/^JSSTART')
feed('=/^JSEND<cr>')
expect([=[
-
+
JSSTART
function init(options) {
$(this).data(class_name+'_public',$.extend({},{
@@ -4312,7 +4356,7 @@ describe('cindent', function()
it('53 is working', function()
insert_([=[
-
+
JSSTART
(function($){
function init(options) {
@@ -4333,12 +4377,12 @@ describe('cindent', function()
JSEND
]=])
- execute('set cino=j1,J1')
- execute('/^JSSTART')
+ feed_command('set cino=j1,J1')
+ feed_command('/^JSSTART')
feed('=/^JSEND<cr>')
expect([=[
-
+
JSSTART
(function($){
function init(options) {
@@ -4362,7 +4406,7 @@ describe('cindent', function()
it('javascript indent / vim-patch 7.4.670', function()
insert_([=[
-
+
JSSTART
// Results of JavaScript indent
// 1
@@ -4379,7 +4423,7 @@ describe('cindent', function()
'i'
];
}())
-
+
// 2
(function(){
var a = [
@@ -4400,7 +4444,7 @@ describe('cindent', function()
'i'
];
}())
-
+
// 3
(function(){
var a = [
@@ -4423,7 +4467,7 @@ describe('cindent', function()
'i'
];
}())
-
+
// 4
{
var a = [
@@ -4433,7 +4477,7 @@ describe('cindent', function()
var b;
var c;
}
-
+
// 5
{
var a = [
@@ -4444,7 +4488,7 @@ describe('cindent', function()
3
];
}
-
+
// 6
{
var a = [
@@ -4456,7 +4500,7 @@ describe('cindent', function()
3
];
}
-
+
// 7
{
var a = [
@@ -4468,7 +4512,7 @@ describe('cindent', function()
3
];
}
-
+
// 8
var x = [
(function(){
@@ -4483,7 +4527,7 @@ describe('cindent', function()
i;
})
];
-
+
// 9
var a = [
0 +
@@ -4502,7 +4546,7 @@ describe('cindent', function()
'h',
'i'
];
-
+
// 10
var a,
b,
@@ -4517,12 +4561,12 @@ describe('cindent', function()
]=])
-- :set cino=j1,J1,+2
- execute('set cino=j1,J1,+2')
- execute('/^JSSTART')
+ feed_command('set cino=j1,J1,+2')
+ feed_command('/^JSSTART')
feed('=/^JSEND<cr>')
expect([=[
-
+
JSSTART
// Results of JavaScript indent
// 1
@@ -4539,7 +4583,7 @@ describe('cindent', function()
'i'
];
}())
-
+
// 2
(function(){
var a = [
@@ -4560,7 +4604,7 @@ describe('cindent', function()
'i'
];
}())
-
+
// 3
(function(){
var a = [
@@ -4583,7 +4627,7 @@ describe('cindent', function()
'i'
];
}())
-
+
// 4
{
var a = [
@@ -4593,7 +4637,7 @@ describe('cindent', function()
var b;
var c;
}
-
+
// 5
{
var a = [
@@ -4604,7 +4648,7 @@ describe('cindent', function()
3
];
}
-
+
// 6
{
var a = [
@@ -4616,7 +4660,7 @@ describe('cindent', function()
3
];
}
-
+
// 7
{
var a = [
@@ -4628,7 +4672,7 @@ describe('cindent', function()
3
];
}
-
+
// 8
var x = [
(function(){
@@ -4643,7 +4687,7 @@ describe('cindent', function()
i;
})
];
-
+
// 9
var a = [
0 +
@@ -4662,7 +4706,7 @@ describe('cindent', function()
'h',
'i'
];
-
+
// 10
var a,
b,
@@ -4676,4 +4720,55 @@ describe('cindent', function()
JSEND
]=])
end)
+
+ it('line continuations in macros / vim-patch 8.0.0148', function()
+ insert_([=[
+ /* start of define */
+ {
+ }
+ #define AAA \
+ BBB\
+ CCC
+
+ #define CNT \
+ 1 + \
+ 2 + \
+ 4
+ /* end of define */]=])
+
+ feed_command('set cino&')
+ feed_command('/start of define')
+ feed('=/end of define<cr>')
+
+ expect([=[
+ /* start of define */
+ {
+ }
+ #define AAA \
+ BBB\
+ CCC
+
+ #define CNT \
+ 1 + \
+ 2 + \
+ 4
+ /* end of define */]=])
+ end)
+
+ it('* immediately follows comment / vim-patch 8.0.1291', function()
+ insert_([=[
+ {
+ a = second/*bug*/*line;
+ }]=])
+
+ feed_command('set cin cino&')
+ feed_command('/a = second')
+ feed('ox')
+
+ expect([=[
+ {
+ a = second/*bug*/*line;
+ x
+ }]=])
+ end)
end)
diff --git a/test/functional/legacy/004_bufenter_with_modelines_spec.lua b/test/functional/legacy/004_bufenter_with_modelines_spec.lua
index 3e5cdd2ff2..9b0df024c8 100644
--- a/test/functional/legacy/004_bufenter_with_modelines_spec.lua
+++ b/test/functional/legacy/004_bufenter_with_modelines_spec.lua
@@ -1,10 +1,9 @@
--- vim: set foldmethod=marker foldmarker=[[,]] :
-- Test for autocommand that changes current buffer on BufEnter event.
-- Check if modelines are interpreted for the correct buffer.
local helpers = require('test.functional.helpers')(after_each)
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, expect = helpers.execute, helpers.expect
+local feed_command, expect = helpers.feed_command, helpers.expect
describe('BufEnter with modelines', function()
setup(clear)
@@ -20,34 +19,34 @@ describe('BufEnter with modelines', function()
this is a test
end of test file Xxx]])
- execute('au BufEnter Xxx brew')
+ feed_command('au BufEnter Xxx brew')
-- Write test file Xxx
- execute('/start of')
- execute('.,/end of/w! Xxx')
- execute('set ai modeline modelines=3')
+ feed_command('/start of')
+ feed_command('.,/end of/w! Xxx')
+ feed_command('set ai modeline modelines=3')
-- Split to Xxx, autocmd will do :brew
- execute('sp Xxx')
+ feed_command('sp Xxx')
-- Append text with autoindent to this file
feed('G?this is a<CR>')
feed('othis should be auto-indented<Esc>')
-- Go to Xxx, no autocmd anymore
- execute('au! BufEnter Xxx')
- execute('buf Xxx')
+ feed_command('au! BufEnter Xxx')
+ feed_command('buf Xxx')
-- Append text without autoindent to Xxx
feed('G?this is a<CR>')
feed('othis should be in column 1<Esc>')
- execute('wq')
+ feed_command('wq')
-- Include Xxx in the current file
feed('G:r Xxx<CR>')
-- Vim issue #57 do not move cursor on <c-o> when autoindent is set
- execute('set fo+=r')
+ feed_command('set fo+=r')
feed('G')
feed('o# abcdef<Esc>2hi<CR><c-o>d0<Esc>')
feed('o# abcdef<Esc>2hi<c-o>d0<Esc>')
diff --git a/test/functional/legacy/005_bufleave_delete_buffer_spec.lua b/test/functional/legacy/005_bufleave_delete_buffer_spec.lua
index 895f4ad181..8b92c877a6 100644
--- a/test/functional/legacy/005_bufleave_delete_buffer_spec.lua
+++ b/test/functional/legacy/005_bufleave_delete_buffer_spec.lua
@@ -3,11 +3,13 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, expect = helpers.execute, helpers.expect
+local command, expect = helpers.command, helpers.expect
+local wait = helpers.wait
describe('test5', function()
setup(clear)
+ -- luacheck: ignore 621 (Indentation)
it('is working', function()
insert([[
start of test file Xxx
@@ -18,35 +20,37 @@ describe('test5', function()
this is a test
end of test file Xxx]])
- execute('w! Xxx0')
- execute('au BufLeave Xxx bwipe')
- execute('/start of')
+ command('w! Xxx0')
+ command('au BufLeave Xxx bwipe')
+ command('/start of')
-- Write test file Xxx.
- execute('.,/end of/w! Xxx')
+ command('.,/end of/w! Xxx')
-- Split to Xxx.
- execute('sp Xxx')
+ command('sp Xxx')
-- Delete buffer Xxx, now we're back here.
- execute('bwipe')
+ command('bwipe')
feed('G?this is a<cr>')
feed('othis is some more text<esc>')
+ wait()
-- Append some text to this file.
-- Write current file contents.
- execute('?start?,$yank A')
+ command('?start?,$yank A')
-- Delete current buffer, get an empty one.
- execute('bwipe!')
+ command('bwipe!')
-- Append an extra line to the output register.
feed('ithis is another test line<esc>:yank A<cr>')
+ wait()
-- Output results
- execute('%d')
- execute('0put a')
- execute('$d')
+ command('%d')
+ command('0put a')
+ command('$d')
-- Assert buffer contents.
expect([[
diff --git a/test/functional/legacy/006_argument_list_spec.lua b/test/functional/legacy/006_argument_list_spec.lua
index 764854314f..9f75a91fa8 100644
--- a/test/functional/legacy/006_argument_list_spec.lua
+++ b/test/functional/legacy/006_argument_list_spec.lua
@@ -2,8 +2,9 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, dedent, eq = helpers.execute, helpers.dedent, helpers.eq
+local command, dedent, eq = helpers.command, helpers.dedent, helpers.eq
local curbuf_contents = helpers.curbuf_contents
+local wait = helpers.wait
describe('argument list', function()
setup(clear)
@@ -16,10 +17,11 @@ describe('argument list', function()
this is a test
this is a test
end of test file Xxx]])
+ wait()
+
+ command('au BufReadPost Xxx2 next Xxx2 Xxx1')
+ command('/^start of')
- execute('au BufReadPost Xxx2 next Xxx2 Xxx1')
- execute('/^start of')
-
-- Write test file Xxx1
feed('A1<Esc>:.,/end of/w! Xxx1<cr>')
@@ -28,29 +30,31 @@ describe('argument list', function()
-- Write test file Xxx3
feed('$r3:.,/end of/w! Xxx3<cr>')
+ wait()
-- Redefine arglist; go to Xxx1
- execute('next! Xxx1 Xxx2 Xxx3')
-
+ command('next! Xxx1 Xxx2 Xxx3')
+
-- Open window for all args
- execute('all')
-
+ command('all')
+
-- Write contents of Xxx1
- execute('%yank A')
+ command('%yank A')
-- Append contents of last window (Xxx1)
feed('')
- execute('%yank A')
-
+ wait()
+ command('%yank A')
+
-- should now be in Xxx2
- execute('rew')
-
+ command('rew')
+
-- Append contents of Xxx2
- execute('%yank A')
+ command('%yank A')
- execute('%d')
- execute('0put=@a')
- execute('$d')
+ command('%d')
+ command('0put=@a')
+ command('$d')
eq(dedent([[
start of test file Xxx1
@@ -74,8 +78,8 @@ describe('argument list', function()
end)
teardown(function()
- os.remove('Xxx1')
- os.remove('Xxx2')
- os.remove('Xxx3')
+ os.remove('Xxx1')
+ os.remove('Xxx2')
+ os.remove('Xxx3')
end)
end)
diff --git a/test/functional/legacy/007_ball_buffer_list_spec.lua b/test/functional/legacy/007_ball_buffer_list_spec.lua
index 07e3fe6e7a..a180e73301 100644
--- a/test/functional/legacy/007_ball_buffer_list_spec.lua
+++ b/test/functional/legacy/007_ball_buffer_list_spec.lua
@@ -2,7 +2,7 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, expect = helpers.execute, helpers.expect
+local feed_command, expect = helpers.feed_command, helpers.expect
describe(':ball', function()
setup(clear)
@@ -14,44 +14,44 @@ describe(':ball', function()
this is a test
end of test file Xxx]])
- execute('w! Xxx0')
+ feed_command('w! Xxx0')
feed('gg')
-- Write test file Xxx1
feed('A1:.,/end of/w! Xxx1<cr>')
- execute('sp Xxx1')
- execute('close')
+ feed_command('sp Xxx1')
+ feed_command('close')
-- Write test file Xxx2
feed('$r2:.,/end of/w! Xxx2<cr>')
- execute('sp Xxx2')
- execute('close')
+ feed_command('sp Xxx2')
+ feed_command('close')
-- Write test file Xxx3
feed('$r3:.,/end of/w! Xxx3<cr>')
- execute('sp Xxx3')
- execute('close')
+ feed_command('sp Xxx3')
+ feed_command('close')
- execute('au BufReadPost Xxx2 bwipe')
+ feed_command('au BufReadPost Xxx2 bwipe')
-- Open window for all args, close Xxx2
feed('$r4:ball<cr>')
-
+
-- Write contents of this file
- execute('%yank A')
-
- -- Append contents of second window (Xxx1)
+ feed_command('%yank A')
+
+ -- Append contents of second window (Xxx1)
feed('')
- execute('%yank A')
+ feed_command('%yank A')
-- Append contents of last window (this file)
feed('')
- execute('%yank A')
+ feed_command('%yank A')
- execute('bf')
- execute('%d')
- execute('0put=@a')
- execute('$d')
+ feed_command('bf')
+ feed_command('%d')
+ feed_command('0put=@a')
+ feed_command('$d')
expect([[
start of test file Xxx4
diff --git a/test/functional/legacy/008_autocommands_spec.lua b/test/functional/legacy/008_autocommands_spec.lua
new file mode 100644
index 0000000000..939404cb5e
--- /dev/null
+++ b/test/functional/legacy/008_autocommands_spec.lua
@@ -0,0 +1,82 @@
+-- Test for BufWritePre autocommand that deletes or unloads the buffer.
+-- Test for BufUnload autocommand that unloads all other buffers.
+
+local helpers = require('test.functional.helpers')(after_each)
+local source = helpers.source
+local clear, command, expect, eq, eval = helpers.clear, helpers.command, helpers.expect, helpers.eq, helpers.eval
+local write_file, dedent = helpers.write_file, helpers.dedent
+local read_file = helpers.read_file
+
+describe('autocommands that delete and unload buffers:', function()
+ local test_file = 'Xtest-008_autocommands.out'
+ local text1 = dedent([[
+ start of Xxx1
+ test
+ end of Xxx]])
+ local text2 = text1:gsub('1', '2')
+ setup(function()
+ write_file('Xxx1', text1..'\n')
+ write_file('Xxx2', text2..'\n')
+ end)
+ teardown(function()
+ os.remove(test_file)
+ os.remove('Xxx1')
+ os.remove('Xxx2')
+ end)
+ before_each(clear)
+
+ it('BufWritePre, BufUnload', function()
+ command('au BufWritePre Xxx1 bunload')
+ command('au BufWritePre Xxx2 bwipe')
+ command('e Xxx2')
+ eq('Xxx2', eval('bufname("%")'))
+ command('e Xxx1')
+ eq('Xxx1', eval('bufname("%")'))
+ -- The legacy test file did not check the error message.
+ command('let v:errmsg = "no error"')
+ command('silent! write')
+ eq('E203: Autocommands deleted or unloaded buffer to be written',
+ eval('v:errmsg'))
+ eq('Xxx2', eval('bufname("%")'))
+ expect(text2)
+ -- Start editing Xxx2.
+ command('e! Xxx2')
+ -- The legacy test file did not check the error message.
+ command('let v:errmsg = "no error"')
+ -- Write Xxx2, will delete the buffer and give an error msg.
+ command('silent! write')
+ eq('E203: Autocommands deleted or unloaded buffer to be written',
+ eval('v:errmsg'))
+ eq('Xxx1', eval('bufname("%")'))
+ expect(text1)
+ end)
+ it('BufUnload, VimLeave', function()
+ source([[
+ func CloseAll()
+ let i = 0
+ while i <= bufnr('$')
+ if i != bufnr('%') && bufloaded(i)
+ exe i . "bunload"
+ endif
+ let i += 1
+ endwhile
+ endfunc
+ func WriteToOut()
+ edit! ]]..test_file..[[
+
+ $put ='VimLeave done'
+ write
+ endfunc
+ set shada='100
+ au BufUnload * call CloseAll()
+ au VimLeave * call WriteToOut()
+ ]])
+ command('silent! edit Xxx2')
+ command('silent! edit Xxx1')
+ command('silent! edit Makefile') -- an existing file
+ command('silent! split new2')
+ command('silent! quit')
+ eq('VimLeave done',
+ string.match(read_file(test_file), "^%s*(.-)%s*$"))
+ end)
+end)
diff --git a/test/functional/legacy/009_bufleave_autocommand_spec.lua b/test/functional/legacy/009_bufleave_autocommand_spec.lua
deleted file mode 100644
index 7481c639cf..0000000000
--- a/test/functional/legacy/009_bufleave_autocommand_spec.lua
+++ /dev/null
@@ -1,22 +0,0 @@
--- Test for Bufleave autocommand that deletes the buffer we are about to edit.
-
-local helpers = require('test.functional.helpers')(after_each)
-local clear, insert = helpers.clear, helpers.insert
-local execute, expect = helpers.execute, helpers.expect
-
-describe('BufLeave autocommand', function()
- setup(clear)
-
- it('is working', function()
- insert([[
- start of test file xx
- end of test file xx]])
-
- execute('au BufLeave * bwipe yy')
- execute('e yy')
-
- expect([[
- start of test file xx
- end of test file xx]])
- end)
-end)
diff --git a/test/functional/legacy/010_errorformat_spec.lua b/test/functional/legacy/010_errorformat_spec.lua
deleted file mode 100644
index 785bf136b5..0000000000
--- a/test/functional/legacy/010_errorformat_spec.lua
+++ /dev/null
@@ -1,156 +0,0 @@
--- Test for 'errorformat'. This will fail if the quickfix feature was
--- disabled.
-
-local helpers = require('test.functional.helpers')(after_each)
-local feed, clear, execute = helpers.feed, helpers.clear, helpers.execute
-local expect, write_file = helpers.expect, helpers.write_file
-
-describe('errorformat', function()
- setup(function()
- clear()
- local error_file_text = [[
- start of errorfile
- "Xtestfile", line 4.12: 1506-045 (S) Undeclared identifier fd_set.
- ๏ปฟ"Xtestfile", line 6 col 19; this is an error
- gcc -c -DHAVE_CONFIsing-prototypes -I/usr/X11R6/include version.c
- Xtestfile:9: parse error before `asd'
- make: *** [vim] Error 1
- in file "Xtestfile" linenr 10: there is an error
-
- 2 returned
- "Xtestfile", line 11 col 1; this is an error
- "Xtestfile", line 12 col 2; this is another error
- "Xtestfile", line 14:10; this is an error in column 10
- =Xtestfile=, line 15:10; this is another error, but in vcol 10 this time
- "Xtestfile", linenr 16: yet another problem
- Error in "Xtestfile" at line 17:
- x should be a dot
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17
- ^
- Error in "Xtestfile" at line 18:
- x should be a dot
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18
- .............^
- Error in "Xtestfile" at line 19:
- x should be a dot
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19
- --------------^
- Error in "Xtestfile" at line 20:
- x should be a dot
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20
- ^
-
- Does anyone know what is the problem and how to correction it?
- "Xtestfile", line 21 col 9: What is the title of the quickfix window?
- "Xtestfile", line 22 col 9: What is the title of the quickfix window?
- ]]
- write_file('Xerrorfile1', error_file_text .. 'end of errorfile\n')
- write_file('Xerrorfile2', error_file_text)
- write_file('Xtestfile', [[
- start of testfile
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 2
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 3
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 4
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 5
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 6
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 7
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 8
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 9
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 10
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 11
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 12
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 13
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 14
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 15
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 16
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 21
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 22
- end of testfile
- ]])
- end)
- teardown(function()
- os.remove('Xerrorfile1')
- os.remove('Xerrorfile2')
- os.remove('Xtestfile')
- end)
-
- it('is working', function()
- -- Also test a BOM is ignored.
- execute(
- 'set encoding=utf-8',
- [[set efm+==%f=\\,\ line\ %l%*\\D%v%*[^\ ]\ %m]],
- [[set efm^=%AError\ in\ \"%f\"\ at\ line\ %l:,%Z%p^,%C%m]],
- 'cf Xerrorfile2',
- 'clast',
- 'copen',
- 'let a=w:quickfix_title',
- 'wincmd p'
- )
- feed('lgR<C-R>=a<CR><esc>')
- execute('cf Xerrorfile1')
- feed('grA<cr>')
- execute('cn')
- feed('gRLINE 6, COL 19<esc>')
- execute('cn')
- feed('gRNO COLUMN SPECIFIED<esc>')
- execute('cn')
- feed('gRAGAIN NO COLUMN<esc>')
- execute('cn')
- feed('gRCOL 1<esc>')
- execute('cn')
- feed('gRCOL 2<esc>')
- execute('cn')
- feed('gRCOL 10<esc>')
- execute('cn')
- feed('gRVCOL 10<esc>')
- execute('cn')
- feed('grI<cr>')
- execute('cn')
- feed('gR. SPACE POINTER<esc>')
- execute('cn')
- feed('gR. DOT POINTER<esc>')
- execute('cn')
- feed('gR. DASH POINTER<esc>')
- execute('cn')
- feed('gR. TAB-SPACE POINTER<esc>')
- execute(
- 'clast',
- 'cprev',
- 'cprev',
- 'wincmd w',
- 'let a=w:quickfix_title',
- 'wincmd p'
- )
- feed('lgR<C-R>=a<CR><esc>')
-
- -- Assert buffer contents.
- expect([[
- start of testfile
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 2
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 3
- xxxxxxxxxxAxxxxxxxxxxxxxxxxxxx line 4
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 5
- xxxxxxxxxxxxxxxxxLINE 6, COL 19 line 6
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 7
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 8
- NO COLUMN SPECIFIEDxxxxxxxxxxx line 9
- AGAIN NO COLUMNxxxxxxxxxxxxxxx line 10
- COL 1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 11
- COL 2xxxxxxxxxxxxxxxxxxxxxxxxx line 12
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 13
- xxxxxxxxCOL 10xxxxxxxxxxxxxxxx line 14
- xVCOL 10xxxxxxxxxxxxxxxxxxxxxx line 15
- Ixxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 16
- xxxx. SPACE POINTERxxxxxxxxxxx line 17
- xxxxx. DOT POINTERxxxxxxxxxxxx line 18
- xxxxxx. DASH POINTERxxxxxxxxxx line 19
- xxxxxxx. TAB-SPACE POINTERxxxx line 20
- xxxxxxxx:cf Xerrorfile1xxxxxxx line 21
- xxxxxxxx:cf Xerrorfile2xxxxxxx line 22
- end of testfile]])
- end)
-end)
diff --git a/test/functional/legacy/011_autocommands_spec.lua b/test/functional/legacy/011_autocommands_spec.lua
index 6e613c85df..7cc31dc787 100644
--- a/test/functional/legacy/011_autocommands_spec.lua
+++ b/test/functional/legacy/011_autocommands_spec.lua
@@ -14,12 +14,15 @@
local helpers= require('test.functional.helpers')(after_each)
local lfs = require('lfs')
-local clear, execute, expect, eq, neq, dedent, write_file, feed =
- helpers.clear, helpers.execute, helpers.expect, helpers.eq, helpers.neq,
+local clear, feed_command, expect, eq, neq, dedent, write_file, feed =
+ helpers.clear, helpers.feed_command, helpers.expect, helpers.eq, helpers.neq,
helpers.dedent, helpers.write_file, helpers.feed
+local iswin = helpers.iswin
+local read_file = helpers.read_file
local function has_gzip()
- return os.execute('gzip --help >/dev/null 2>&1') == 0
+ local null = iswin() and 'nul' or '/dev/null'
+ return os.execute('gzip --help >' .. null .. ' 2>&1') == 0
end
local function prepare_gz_file(name, text)
@@ -64,41 +67,43 @@ describe('file reading, writing and bufnew and filter autocommands', function()
it('FileReadPost (using gzip)', function()
prepare_gz_file('Xtestfile', text1)
- execute('let $GZIP = ""')
+ feed_command('let $GZIP = ""')
--execute('au FileChangedShell * echo "caught FileChangedShell"')
- execute('set bin')
- execute("au FileReadPost *.gz '[,']!gzip -d")
+ feed_command('set bin')
+ feed_command("au FileReadPost *.gz '[,']!gzip -d")
-- Read and decompress the testfile.
- execute('$r Xtestfile.gz')
+ feed_command('$r Xtestfile.gz')
expect('\n'..text1)
end)
it('BufReadPre, BufReadPost (using gzip)', function()
prepare_gz_file('Xtestfile', text1)
- local gzip_data = io.open('Xtestfile.gz'):read('*all')
- execute('let $GZIP = ""')
+ local gzip_data = read_file('Xtestfile.gz')
+ feed_command('let $GZIP = ""')
-- Setup autocommands to decompress before reading and re-compress afterwards.
- execute("au BufReadPre *.gz exe '!gzip -d ' . shellescape(expand('<afile>'))")
- execute("au BufReadPre *.gz call rename(expand('<afile>:r'), expand('<afile>'))")
- execute("au BufReadPost *.gz call rename(expand('<afile>'), expand('<afile>:r'))")
- execute("au BufReadPost *.gz exe '!gzip ' . shellescape(expand('<afile>:r'))")
+ feed_command("au BufReadPre *.gz exe '!gzip -d ' . shellescape(expand('<afile>'))")
+ feed_command("au BufReadPre *.gz call rename(expand('<afile>:r'), expand('<afile>'))")
+ feed_command("au BufReadPost *.gz call rename(expand('<afile>'), expand('<afile>:r'))")
+ feed_command("au BufReadPost *.gz exe '!gzip ' . shellescape(expand('<afile>:r'))")
-- Edit compressed file.
- execute('e! Xtestfile.gz')
+ feed_command('e! Xtestfile.gz')
-- Discard all prompts and messages.
feed('<C-L>')
-- Expect the decompressed file in the buffer.
expect(text1)
-- Expect the original file to be unchanged.
- eq(gzip_data, io.open('Xtestfile.gz'):read('*all'))
+ eq(gzip_data, read_file('Xtestfile.gz'))
end)
+ -- luacheck: ignore 621 (Indentation)
+ -- luacheck: ignore 611 (Line contains only whitespaces)
it('FileReadPre, FileReadPost', function()
prepare_gz_file('Xtestfile', text1)
- execute('au! FileReadPre *.gz exe "silent !gzip -d " . shellescape(expand("<afile>"))')
- execute('au FileReadPre *.gz call rename(expand("<afile>:r"), expand("<afile>"))')
- execute("au! FileReadPost *.gz '[,']s/l/L/")
+ feed_command('au! FileReadPre *.gz exe "silent !gzip -d " . shellescape(expand("<afile>"))')
+ feed_command('au FileReadPre *.gz call rename(expand("<afile>:r"), expand("<afile>"))')
+ feed_command("au! FileReadPost *.gz '[,']s/l/L/")
-- Read compressed file.
- execute('$r Xtestfile.gz')
+ feed_command('$r Xtestfile.gz')
-- Discard all prompts and messages.
feed('<C-L>')
expect([[
@@ -119,17 +124,17 @@ describe('file reading, writing and bufnew and filter autocommands', function()
end
it('FileAppendPre, FileAppendPost', function()
- execute('au BufNewFile *.c read Xtest.c')
+ feed_command('au BufNewFile *.c read Xtest.c')
-- Will load Xtest.c.
- execute('e! foo.c')
- execute("au FileAppendPre *.out '[,']s/new/NEW/")
- execute('au FileAppendPost *.out !cat Xtest.c >>test.out')
+ feed_command('e! foo.c')
+ feed_command("au FileAppendPre *.out '[,']s/new/NEW/")
+ feed_command('au FileAppendPost *.out !cat Xtest.c >>test.out')
-- Append it to the output file.
- execute('w>>test.out')
+ feed_command('w>>test.out')
-- Discard all prompts and messages.
feed('<C-L>')
-- Expect the decompressed file in the buffer.
- execute('e test.out')
+ feed_command('e test.out')
expect([[
/*
@@ -164,18 +169,18 @@ describe('file reading, writing and bufnew and filter autocommands', function()
* Here is a new .c file
*/]]))
-- Need temp files here.
- execute('set shelltemp')
- execute('au FilterReadPre *.out call rename(expand("<afile>"), expand("<afile>") . ".t")')
- execute('au FilterReadPre *.out exe "silent !sed s/e/E/ " . shellescape(expand("<afile>")) . ".t >" . shellescape(expand("<afile>"))')
- execute('au FilterReadPre *.out exe "silent !rm " . shellescape(expand("<afile>")) . ".t"')
- execute("au FilterReadPost *.out '[,']s/x/X/g")
+ feed_command('set shelltemp')
+ feed_command('au FilterReadPre *.out call rename(expand("<afile>"), expand("<afile>") . ".t")')
+ feed_command('au FilterReadPre *.out exe "silent !sed s/e/E/ " . shellescape(expand("<afile>")) . ".t >" . shellescape(expand("<afile>"))')
+ feed_command('au FilterReadPre *.out exe "silent !rm " . shellescape(expand("<afile>")) . ".t"')
+ feed_command("au FilterReadPost *.out '[,']s/x/X/g")
-- Edit the output file.
- execute('e! test.out')
- execute('23,$!cat')
+ feed_command('e! test.out')
+ feed_command('23,$!cat')
-- Discard all prompts and messages.
feed('<C-L>')
-- Remove CR for when sed adds them.
- execute([[23,$s/\r$//]])
+ feed_command([[23,$s/\r$//]])
expect([[
startstart
start of testfile
diff --git a/test/functional/legacy/012_directory_spec.lua b/test/functional/legacy/012_directory_spec.lua
new file mode 100644
index 0000000000..cec4f93737
--- /dev/null
+++ b/test/functional/legacy/012_directory_spec.lua
@@ -0,0 +1,90 @@
+-- Tests for 'directory' option.
+-- - ".", in same dir as file
+-- - "./dir", in directory relative to file
+-- - "dir", in directory relative to current dir
+
+local helpers = require('test.functional.helpers')(after_each)
+local lfs = require('lfs')
+
+local eq = helpers.eq
+local neq = helpers.neq
+local wait = helpers.wait
+local funcs = helpers.funcs
+local meths = helpers.meths
+local clear = helpers.clear
+local insert = helpers.insert
+local command = helpers.command
+local write_file = helpers.write_file
+local curbufmeths = helpers.curbufmeths
+
+local function ls_dir_sorted(dirname)
+ local files = {}
+ for f in lfs.dir(dirname) do
+ if f ~= "." and f~= ".." then
+ table.insert(files, f)
+ end
+ end
+ table.sort(files)
+ return files
+end
+
+describe("'directory' option", function()
+ setup(function()
+ local text = [[
+ start of testfile
+ line 2 Abcdefghij
+ line 3 Abcdefghij
+ end of testfile
+ ]]
+ write_file('Xtest1', text)
+ lfs.mkdir('Xtest.je')
+ lfs.mkdir('Xtest2')
+ write_file('Xtest2/Xtest3', text)
+ clear()
+ end)
+ teardown(function()
+ command('qall!')
+ helpers.rmdir('Xtest.je')
+ helpers.rmdir('Xtest2')
+ os.remove('Xtest1')
+ end)
+
+ it('is working', function()
+ insert([[
+ start of testfile
+ line 2 Abcdefghij
+ line 3 Abcdefghij
+ end of testfile]])
+
+ meths.set_option('swapfile', true)
+ curbufmeths.set_option('swapfile', true)
+ meths.set_option('directory', '.')
+
+ -- sanity check: files should not exist yet.
+ eq(nil, lfs.attributes('.Xtest1.swp'))
+
+ command('edit! Xtest1')
+ wait()
+ eq('Xtest1', funcs.buffer_name('%'))
+ -- Verify that the swapfile exists. In the legacy test this was done by
+ -- reading the output from :!ls.
+ neq(nil, lfs.attributes('.Xtest1.swp'))
+
+ meths.set_option('directory', './Xtest2,.')
+ command('edit Xtest1')
+ wait()
+
+ -- swapfile should no longer exist in CWD.
+ eq(nil, lfs.attributes('.Xtest1.swp'))
+
+ eq({ "Xtest1.swp", "Xtest3" }, ls_dir_sorted("Xtest2"))
+
+ meths.set_option('directory', 'Xtest.je')
+ command('edit Xtest2/Xtest3')
+ eq(true, curbufmeths.get_option('swapfile'))
+ wait()
+
+ eq({ "Xtest3" }, ls_dir_sorted("Xtest2"))
+ eq({ "Xtest3.swp" }, ls_dir_sorted("Xtest.je"))
+ end)
+end)
diff --git a/test/functional/legacy/015_alignment_spec.lua b/test/functional/legacy/015_alignment_spec.lua
index 48d4042ff2..d73ff06972 100644
--- a/test/functional/legacy/015_alignment_spec.lua
+++ b/test/functional/legacy/015_alignment_spec.lua
@@ -4,11 +4,12 @@
local helpers = require('test.functional.helpers')(after_each)
local feed, insert = helpers.feed, helpers.insert
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
describe('alignment', function()
setup(clear)
+ -- luacheck: ignore 621 (Indentation)
it('is working', function()
insert([[
test for :left
@@ -19,7 +20,7 @@ describe('alignment', function()
asdfa a
xasdfa a
asxxdfa a
-
+
test for :center
a a
fa afd asdf
@@ -28,7 +29,7 @@ describe('alignment', function()
asdfa a
xasdfa asdfasdfasdfasdfasdf
asxxdfa a
-
+
test for :right
a a
fa a
@@ -111,34 +112,34 @@ describe('alignment', function()
asxxdfa axxxoikey
asxa;ofa axxxoikey
asdfaqwer axxxoikey
-
- xxxxx xx xxxxxx
+
+ xxxxx xx xxxxxx
xxxxxxx xxxxxxxxx xxx xxxx xxxxx xxxxx xxx xx
xxxxxxxxxxxxxxxxxx xxxxx xxxx, xxxx xxxx xxxx xxxx xxx xx xx
xx xxxxxxx. xxxx xxxx.
-
+
> xx xx, xxxx xxxx xxx xxxx xxx xxxxx xxx xxx xxxxxxx xxx xxxxx
> xxxxxx xxxxxxx: xxxx xxxxxxx, xx xxxxxx xxxx xxxxxxxxxx
-
+
aa aa aa aa
bb bb bb bb
cc cc cc cc]])
- execute('set tw=65')
+ feed_command('set tw=65')
feed([[:/^\s*test for :left/,/^\s*test for :center/ left<cr>]])
feed([[:/^\s*test for :center/,/^\s*test for :right/ center<cr>]])
feed([[:/^\s*test for :right/,/^xxx/-1 right<cr>]])
- execute('set fo+=tcroql tw=72')
+ feed_command('set fo+=tcroql tw=72')
feed('/xxxxxxxx$<cr>')
feed('0gq6kk<cr>')
-- Undo/redo here to make the next undo only work on the following changes.
feed('u<cr>')
- execute('map gg :.,.+2s/^/x/<CR>kk:set tw=3<CR>gqq')
- execute('/^aa')
+ feed_command('map gg :.,.+2s/^/x/<CR>kk:set tw=3<CR>gqq')
+ feed_command('/^aa')
feed('ggu<cr>')
-- Assert buffer contents.
@@ -151,7 +152,7 @@ describe('alignment', function()
asdfa a
xasdfa a
asxxdfa a
-
+
test for :center
a a
fa afd asdf
@@ -160,7 +161,7 @@ describe('alignment', function()
asdfa a
xasdfa asdfasdfasdfasdfasdf
asxxdfa a
-
+
test for :right
a a
fa a
@@ -243,14 +244,14 @@ describe('alignment', function()
asxxdfa axxxoikey
asxa;ofa axxxoikey
asdfaqwer axxxoikey
-
+
xxxxx xx xxxxxx xxxxxxx xxxxxxxxx xxx xxxx xxxxx xxxxx xxx xx
xxxxxxxxxxxxxxxxxx xxxxx xxxx, xxxx xxxx xxxx xxxx xxx xx xx xx xxxxxxx.
xxxx xxxx.
-
+
> xx xx, xxxx xxxx xxx xxxx xxx xxxxx xxx xxx xxxxxxx xxx xxxxx xxxxxx
> xxxxxxx: xxxx xxxxxxx, xx xxxxxx xxxx xxxxxxxxxx
-
+
aa aa aa aa
bb bb bb bb
cc cc cc cc]])
diff --git a/test/functional/legacy/018_unset_smart_indenting_spec.lua b/test/functional/legacy/018_unset_smart_indenting_spec.lua
index ba1eac02cb..94fbb283f4 100644
--- a/test/functional/legacy/018_unset_smart_indenting_spec.lua
+++ b/test/functional/legacy/018_unset_smart_indenting_spec.lua
@@ -1,11 +1,15 @@
-- Tests for not doing smart indenting when it isn't set.
local helpers = require('test.functional.helpers')(after_each)
-local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, expect = helpers.execute, helpers.expect
+
+local feed = helpers.feed
+local clear = helpers.clear
+local insert = helpers.insert
+local expect = helpers.expect
+local feed_command = helpers.feed_command
describe('unset smart indenting', function()
- setup(clear)
+ before_each(clear)
it('is working', function()
insert([[
@@ -15,8 +19,8 @@ describe('unset smart indenting', function()
test text
test text]])
- execute('set nocin nosi ai')
- execute('/some')
+ feed_command('set nocin nosi ai')
+ feed_command('/some')
feed('2cc#test<Esc>')
expect([[
diff --git a/test/functional/legacy/019_smarttab_expandtab_spec.lua b/test/functional/legacy/019_smarttab_expandtab_spec.lua
index 2287a9f786..7b03ee8e99 100644
--- a/test/functional/legacy/019_smarttab_expandtab_spec.lua
+++ b/test/functional/legacy/019_smarttab_expandtab_spec.lua
@@ -3,11 +3,12 @@
local helpers = require('test.functional.helpers')(after_each)
local feed, insert = helpers.feed, helpers.insert
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
describe([[performing "r<Tab>" with 'smarttab' and 'expandtab' set/not set, and "dv_"]], function()
setup(clear)
+ -- luacheck: ignore 621 (Indentation)
it('is working', function()
insert([[
start text
@@ -19,24 +20,24 @@ describe([[performing "r<Tab>" with 'smarttab' and 'expandtab' set/not set, and
test text
Second line beginning with whitespace]])
- execute('set smarttab expandtab ts=8 sw=4')
+ feed_command('set smarttab expandtab ts=8 sw=4')
-- Make sure that backspace works, no matter what termcap is used.
- execute('set t_kD=x7f t_kb=x08')
+ feed_command('set t_kD=x7f t_kb=x08')
- execute('/some')
+ feed_command('/some')
feed('r ')
- execute('set noexpandtab')
- execute('/other')
+ feed_command('set noexpandtab')
+ feed_command('/other')
feed('r <cr>')
-- Test replacing with Tabs and then backspacing to undo it.
feed('0wR <bs><bs><bs><esc><cr>')
-- Test replacing with Tabs.
feed('0wR <esc><cr>')
-- Test that copyindent works with expandtab set.
- execute('set expandtab smartindent copyindent ts=8 sw=8 sts=8')
+ feed_command('set expandtab smartindent copyindent ts=8 sw=8 sts=8')
feed('o{<cr>x<esc>')
- execute('set nosol')
- execute('/Second line/')
+ feed_command('set nosol')
+ feed_command('/Second line/')
-- Test "dv_"
feed('fwdv_')
diff --git a/test/functional/legacy/020_blockwise_visual_spec.lua b/test/functional/legacy/020_blockwise_visual_spec.lua
index 660348a792..8d90b1c77d 100644
--- a/test/functional/legacy/020_blockwise_visual_spec.lua
+++ b/test/functional/legacy/020_blockwise_visual_spec.lua
@@ -1,11 +1,10 @@
--- vim: set foldmethod=marker foldmarker=[[,]] :
-- Tests Blockwise Visual when there are TABs before the text.
-- First test for undo working properly when executing commands from a register.
-- Also test this in an empty buffer.
local helpers = require('test.functional.helpers')(after_each)
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, expect = helpers.execute, helpers.expect
+local feed_command, expect = helpers.feed_command, helpers.expect
describe('blockwise visual', function()
setup(clear)
@@ -26,15 +25,15 @@ Ox jAy kdd]])
feed(":let @a = 'Ox<C-v><Esc>jAy<C-v><Esc>kdd'<cr>")
feed('G0k@au')
- execute('new')
+ feed_command('new')
feed('@auY')
- execute('quit')
+ feed_command('quit')
feed('GP')
- execute('/start here')
+ feed_command('/start here')
feed('"by$<C-v>jjlld')
- execute('/456')
+ feed_command('/456')
feed('<C-v>jj"bP')
- execute('$-3,$d')
+ feed_command('$-3,$d')
expect([[
123start here56
diff --git a/test/functional/legacy/021_control_wi_spec.lua b/test/functional/legacy/021_control_wi_spec.lua
index 787a384fca..87d9deed7a 100644
--- a/test/functional/legacy/021_control_wi_spec.lua
+++ b/test/functional/legacy/021_control_wi_spec.lua
@@ -1,9 +1,8 @@
--- vim: set foldmethod=marker foldmarker=[[,]] :
-- Tests for [ CTRL-I with a count and CTRL-W CTRL-I with a count
local helpers = require('test.functional.helpers')(after_each)
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, expect = helpers.execute, helpers.expect
+local feed_command, expect = helpers.feed_command, helpers.expect
describe('CTRL-W CTRL-I', function()
setup(clear)
@@ -20,18 +19,18 @@ describe('CTRL-W CTRL-I', function()
test text]])
-- Search for the second occurence of start and append to register
- execute('/start')
+ feed_command('/start')
feed('2[<C-i>')
- execute('yank A')
+ feed_command('yank A')
-- Same as above but using different keystrokes.
feed('?start<cr>')
feed('2<C-w><Tab>')
- execute('yank A')
+ feed_command('yank A')
-- Clean buffer and put register
feed('ggdG"ap')
- execute('1d')
+ feed_command('1d')
-- The buffer should now contain:
expect([[
diff --git a/test/functional/legacy/022_line_ending_spec.lua b/test/functional/legacy/022_line_ending_spec.lua
index 092440bb16..fb4b782011 100644
--- a/test/functional/legacy/022_line_ending_spec.lua
+++ b/test/functional/legacy/022_line_ending_spec.lua
@@ -2,7 +2,7 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, feed = helpers.clear, helpers.feed
-local execute, expect = helpers.execute, helpers.expect
+local feed_command, expect = helpers.feed_command, helpers.expect
describe('line ending', function()
setup(clear)
@@ -14,8 +14,8 @@ describe('line ending', function()
this one does<C-V><C-M>
and the last one doesn't]], '<ESC>')
- execute('set ta tx')
- execute('e!')
+ feed_command('set ta tx')
+ feed_command('e!')
expect("this lines ends in a\r\n"..
"this one doesn't\n"..
diff --git a/test/functional/legacy/023_edit_arguments_spec.lua b/test/functional/legacy/023_edit_arguments_spec.lua
index 95ab983d24..e705397a2b 100644
--- a/test/functional/legacy/023_edit_arguments_spec.lua
+++ b/test/functional/legacy/023_edit_arguments_spec.lua
@@ -2,7 +2,8 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, insert = helpers.clear, helpers.insert
-local execute, expect = helpers.execute, helpers.expect
+local command, expect = helpers.command, helpers.expect
+local wait = helpers.wait
describe(':edit', function()
setup(clear)
@@ -12,31 +13,32 @@ describe(':edit', function()
The result should be in Xfile1: "fooPIPEbar", in Xfile2: "fooSLASHbar"
foo|bar
foo/bar]])
+ wait()
-- Prepare some test files
- execute('$-1w! Xfile1')
- execute('$w! Xfile2')
- execute('w! Xfile0')
+ command('$-1w! Xfile1')
+ command('$w! Xfile2')
+ command('w! Xfile0')
-- Open Xfile using '+' range
- execute('edit +1 Xfile1')
- execute('s/|/PIPE/')
- execute('yank A')
- execute('w! Xfile1')
+ command('edit +1 Xfile1')
+ command('s/|/PIPE/')
+ command('yank A')
+ command('w! Xfile1')
-- Open Xfile2 using '|' range
- execute('edit Xfile2|1')
- execute("s/\\//SLASH/")
- execute('yank A')
- execute('w! Xfile2')
+ command('edit Xfile2|1')
+ command("s/\\//SLASH/")
+ command('yank A')
+ command('w! Xfile2')
-- Clean first buffer and put @a
- execute('bf')
- execute('%d')
- execute('0put a')
+ command('bf')
+ command('%d')
+ command('0put a')
-- Remove empty line
- execute('$d')
+ command('$d')
-- The buffer should now contain
expect([[
diff --git a/test/functional/legacy/025_jump_tag_hidden_spec.lua b/test/functional/legacy/025_jump_tag_hidden_spec.lua
index 7b7ddb07b9..dd89a3680e 100644
--- a/test/functional/legacy/025_jump_tag_hidden_spec.lua
+++ b/test/functional/legacy/025_jump_tag_hidden_spec.lua
@@ -3,7 +3,7 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, expect = helpers.execute, helpers.expect
+local feed_command, expect = helpers.feed_command, helpers.expect
describe('jump to a tag with hidden set', function()
setup(clear)
@@ -19,30 +19,41 @@ describe('jump to a tag with hidden set', function()
SECTION_OFF]])
- execute('w! Xxx')
- execute('set hidden')
+ feed_command('w! Xxx')
+ feed_command('set hidden')
-- Create a link from test25.dir to the current directory.
- execute('!rm -f test25.dir')
- execute('!ln -s . test25.dir')
+ if helpers.iswin() then
+ feed_command('!rd /q/s test25.dir')
+ feed_command('!mklink /j test25.dir .')
+ else
+ feed_command('!rm -f test25.dir')
+ feed_command('!ln -s . test25.dir')
+ end
-- Create tags.text, with the current directory name inserted.
- execute('/tags line')
- execute('r !pwd')
+ feed_command('/tags line')
+ feed_command('r !' .. (helpers.iswin() and 'cd' or 'pwd'))
feed('d$/test<cr>')
feed('hP:.w! tags.test<cr>')
-- Try jumping to a tag in the current file, but with a path that contains a
-- symbolic link. When wrong, this will give the ATTENTION message. The next
-- space will then be eaten by hit-return, instead of moving the cursor to 'd'.
- execute('set tags=tags.test')
+ feed_command('set tags=tags.test')
feed('G<C-]> x:yank a<cr>')
- execute('!rm -f Xxx test25.dir tags.test')
+ feed_command("call delete('tags.test')")
+ feed_command("call delete('Xxx')")
+ if helpers.iswin() then
+ feed_command('!rd /q test25.dir')
+ else
+ feed_command('!rm -f test25.dir')
+ end
-- Put @a and remove empty line
- execute('%d')
- execute('0put a')
- execute('$d')
+ feed_command('%d')
+ feed_command('0put a')
+ feed_command('$d')
-- Assert buffer contents.
expect("#efine SECTION_OFF 3")
diff --git a/test/functional/legacy/026_execute_while_if_spec.lua b/test/functional/legacy/026_execute_while_if_spec.lua
index 74ef34bb20..ea8abed7ae 100644
--- a/test/functional/legacy/026_execute_while_if_spec.lua
+++ b/test/functional/legacy/026_execute_while_if_spec.lua
@@ -1,9 +1,11 @@
-- Test for :execute, :while and :if
local helpers = require('test.functional.helpers')(after_each)
+
local clear = helpers.clear
-local execute, expect = helpers.execute, helpers.expect
+local expect = helpers.expect
local source = helpers.source
+local command = helpers.command
describe(':execute, :while and :if', function()
setup(clear)
@@ -37,7 +39,7 @@ describe(':execute, :while and :if', function()
]])
-- Remove empty line
- execute('1d')
+ command('1d')
-- Assert buffer contents.
expect([[
diff --git a/test/functional/legacy/028_source_ctrl_v_spec.lua b/test/functional/legacy/028_source_ctrl_v_spec.lua
index a8c43260be..fabf831341 100644
--- a/test/functional/legacy/028_source_ctrl_v_spec.lua
+++ b/test/functional/legacy/028_source_ctrl_v_spec.lua
@@ -2,7 +2,7 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, expect = helpers.execute, helpers.expect
+local feed_command, expect = helpers.feed_command, helpers.expect
describe('CTRL-V at the end of the line', function()
setup(clear)
@@ -24,8 +24,8 @@ describe('CTRL-V at the end of the line', function()
feed(':%s/X/<C-v><C-v>/g<cr>')
feed(':/firstline/+1,/lastline/-1w! Xtestfile<cr>')
- execute('so Xtestfile')
- execute('%d')
+ feed_command('so Xtestfile')
+ feed_command('%d')
feed('Gmm__1<Esc><Esc>__2<Esc>__3<Esc><Esc>__4<Esc>__5<Esc>')
feed(":'m,$s/<C-v><C-@>/0/g<cr>")
diff --git a/test/functional/legacy/029_join_spec.lua b/test/functional/legacy/029_join_spec.lua
index 7a183fcbec..b28f276a7c 100644
--- a/test/functional/legacy/029_join_spec.lua
+++ b/test/functional/legacy/029_join_spec.lua
@@ -1,12 +1,18 @@
-- Test for joining lines with marks in them (and with 'joinspaces' set/reset)
local helpers = require('test.functional.helpers')(after_each)
-local feed, insert = helpers.feed, helpers.insert
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+
+local feed = helpers.feed
+local clear = helpers.clear
+local insert = helpers.insert
+local expect = helpers.expect
+local feed_command = helpers.feed_command
describe('joining lines', function()
before_each(clear)
+ -- luacheck: ignore 613 (Trailing whitespaces in a string)
+ -- luacheck: ignore 611 (Line contains only whitespaces)
it("keeps marks with different 'joinspaces' settings", function()
insert([[
firstline
@@ -46,19 +52,19 @@ describe('joining lines', function()
-- Switch off 'joinspaces', then join some lines in the buffer using "J".
-- Also set a few marks and record their movement when joining lines.
- execute('set nojoinspaces')
- execute('/firstline/')
+ feed_command('set nojoinspaces')
+ feed_command('/firstline/')
feed('j"td/^$/<cr>')
feed('PJjJjJjJjJjJjJjJjJjJjJjJjJjJ')
feed('j05lmx2j06lmy2k4Jy3l$p`xyl$p`yy2l$p')
-- Do the same with 'joinspaces' on.
- execute('set joinspaces')
+ feed_command('set joinspaces')
feed('j"tp')
feed('JjJjJjJjJjJjJjJjJjJjJjJjJjJ')
feed('j05lmx2j06lmy2k4Jy3l$p`xyl$p`yy2l$po<esc>')
- execute('1d')
+ feed_command('1d')
expect([[
asdfasdf. asdf
@@ -129,20 +135,20 @@ describe('joining lines', function()
}
]])
- execute('/^{/+1')
- execute('set comments=s1:/*,mb:*,ex:*/,://')
- execute('set nojoinspaces')
- execute('set backspace=eol,start')
+ feed_command('/^{/+1')
+ feed_command('set comments=s1:/*,mb:*,ex:*/,://')
+ feed_command('set nojoinspaces')
+ feed_command('set backspace=eol,start')
-- With 'joinspaces' switched off, join lines using both "J" and :join and
-- verify that comment leaders are stripped or kept as appropriate.
- execute('.,+3join')
+ feed_command('.,+3join')
feed('j4J<cr>')
- execute('.,+2join')
+ feed_command('.,+2join')
feed('j3J<cr>')
- execute('.,+2join')
+ feed_command('.,+2join')
feed('j3J<cr>')
- execute('.,+2join')
+ feed_command('.,+2join')
feed('jj3J<cr>')
expect([[
@@ -180,22 +186,22 @@ describe('joining lines', function()
-- As mentioned above, we mimic the wrong initial cursor position in the old
-- test by advancing one line further.
- execute([[/^\d\+ this]], '+1')
+ feed_command([[/^\d\+ this]], '+1')
-- Test with the default 'backspace' setting.
feed('Avim1<c-u><esc><cr>')
feed('Avim2<c-g>u<c-u><esc><cr>')
- execute('set cpo-=<')
- execute('inoremap <c-u> <left><c-u>')
+ feed_command('set cpo-=<')
+ feed_command('inoremap <c-u> <left><c-u>')
feed('Avim3<c-u><esc><cr>')
- execute('iunmap <c-u>')
+ feed_command('iunmap <c-u>')
feed('Avim4<c-u><c-u><esc><cr>')
-- Test with 'backspace' set to the compatible setting.
- execute('set backspace=')
+ feed_command('set backspace=')
feed('A vim5<esc>A<c-u><c-u><esc><cr>')
feed('A vim6<esc>Azwei<c-g>u<c-u><esc><cr>')
- execute('inoremap <c-u> <left><c-u>')
+ feed_command('inoremap <c-u> <left><c-u>')
feed('A vim7<c-u><c-u><esc><cr>')
expect([[
@@ -283,29 +289,29 @@ describe('joining lines', function()
}
]])
- execute('/^{/+1')
- execute([[set comments=sO:*\ -,mO:*\ \ ,exO:*/]])
- execute('set comments+=s1:/*,mb:*,ex:*/,://')
- execute('set comments+=s1:>#,mb:#,ex:#<,:<')
- execute('set backspace=eol,start')
+ feed_command('/^{/+1')
+ feed_command([[set comments=sO:*\ -,mO:*\ \ ,exO:*/]])
+ feed_command('set comments+=s1:/*,mb:*,ex:*/,://')
+ feed_command('set comments+=s1:>#,mb:#,ex:#<,:<')
+ feed_command('set backspace=eol,start')
-- With 'joinspaces' on (the default setting), again join lines and verify
-- that comment leaders are stripped or kept as appropriate.
- execute('.,+3join')
+ feed_command('.,+3join')
feed('j4J<cr>')
- execute('.,+8join')
+ feed_command('.,+8join')
feed('j9J<cr>')
- execute('.,+2join')
+ feed_command('.,+2join')
feed('j3J<cr>')
- execute('.,+2join')
+ feed_command('.,+2join')
feed('j3J<cr>')
- execute('.,+2join')
+ feed_command('.,+2join')
feed('jj3J<cr>')
feed('j')
- execute('.,+2join')
+ feed_command('.,+2join')
feed('jj3J<cr>')
feed('j')
- execute('.,+5join')
+ feed_command('.,+5join')
feed('j6J<cr>')
feed('oSome code!<cr>// Make sure backspacing does not remove this comment leader.<esc>0i<bs><esc>')
diff --git a/test/functional/legacy/030_fileformats_spec.lua b/test/functional/legacy/030_fileformats_spec.lua
new file mode 100644
index 0000000000..2fd51602d8
--- /dev/null
+++ b/test/functional/legacy/030_fileformats_spec.lua
@@ -0,0 +1,392 @@
+-- Test for a lot of variations of the 'fileformats' option
+
+local helpers = require('test.functional.helpers')(after_each)
+local feed, clear, command = helpers.feed, helpers.clear, helpers.command
+local eq, write_file = helpers.eq, helpers.write_file
+local wait = helpers.wait
+
+describe('fileformats option', function()
+ setup(function()
+ clear()
+ local dos = 'dos\r\ndos\r\n'
+ local mac = 'mac\rmac\r'
+ local unix = 'unix\nunix\n'
+ local eol = 'noeol'
+ write_file('XXDos', dos)
+ write_file('XXMac', mac)
+ write_file('XXUnix', unix)
+ write_file('XXEol', eol)
+ write_file('XXDosMac', dos..mac)
+ write_file('XXMacEol', mac..eol)
+ write_file('XXUxDs', unix..dos)
+ write_file('XXUxDsMc', unix..dos..mac)
+ write_file('XXUxMac', unix..mac)
+ end)
+
+ teardown(function()
+ os.remove('test.out')
+ os.remove('XXDos')
+ os.remove('XXMac')
+ os.remove('XXUnix')
+ os.remove('XXEol')
+ os.remove('XXDosMac')
+ os.remove('XXMacEol')
+ os.remove('XXUxDs')
+ os.remove('XXUxDsMc')
+ os.remove('XXUxMac')
+ for i = 0, 9 do
+ for j = 1, 4 do
+ os.remove('XXtt'..i..j)
+ end
+ end
+ end)
+
+ it('is working', function()
+
+ -- Try reading and writing with 'fileformats' empty.
+ command('set fileformats=')
+ command('set fileformat=unix')
+ command('e! XXUnix')
+ command('w! test.out')
+ command('e! XXDos')
+ command('w! XXtt01')
+ command('e! XXMac')
+ command('w! XXtt02')
+ command('bwipe XXUnix XXDos XXMac')
+ command('set fileformat=dos')
+ command('e! XXUnix')
+ command('w! XXtt11')
+ command('e! XXDos')
+ command('w! XXtt12')
+ command('e! XXMac')
+ command('w! XXtt13')
+ command('bwipe XXUnix XXDos XXMac')
+ command('set fileformat=mac')
+ command('e! XXUnix')
+ command('w! XXtt21')
+ command('e! XXDos')
+ command('w! XXtt22')
+ command('e! XXMac')
+ command('w! XXtt23')
+ command('bwipe XXUnix XXDos XXMac')
+
+ -- Try reading and writing with 'fileformats' set to one format.
+ command('set fileformats=unix')
+ command('e! XXUxDsMc')
+ command('w! XXtt31')
+ command('bwipe XXUxDsMc')
+ command('set fileformats=dos')
+ command('e! XXUxDsMc')
+ command('w! XXtt32')
+ command('bwipe XXUxDsMc')
+ command('set fileformats=mac')
+ command('e! XXUxDsMc')
+ command('w! XXtt33')
+ command('bwipe XXUxDsMc')
+
+ -- Try reading and writing with 'fileformats' set to two formats.
+ command('set fileformats=unix,dos')
+ command('e! XXUxDsMc')
+ command('w! XXtt41')
+ command('bwipe XXUxDsMc')
+ command('e! XXUxMac')
+ command('w! XXtt42')
+ command('bwipe XXUxMac')
+ command('e! XXDosMac')
+ command('w! XXtt43')
+ command('bwipe XXDosMac')
+ command('set fileformats=unix,mac')
+ command('e! XXUxDs')
+ command('w! XXtt51')
+ command('bwipe XXUxDs')
+ command('e! XXUxDsMc')
+ command('w! XXtt52')
+ command('bwipe XXUxDsMc')
+ command('e! XXDosMac')
+ command('w! XXtt53')
+ command('bwipe XXDosMac')
+ command('e! XXEol')
+ feed('ggO<C-R>=&ffs<CR>:<C-R>=&ff<CR><ESC>')
+ wait()
+ command('w! XXtt54')
+ command('bwipeout! XXEol')
+ command('set fileformats=dos,mac')
+ command('e! XXUxDs')
+ command('w! XXtt61')
+ command('bwipe XXUxDs')
+ command('e! XXUxMac')
+ feed('ggO<C-R>=&ffs<CR>:<C-R>=&ff<CR><ESC>')
+ wait()
+ command('w! XXtt62')
+ command('bwipeout! XXUxMac')
+ command('e! XXUxDsMc')
+ command('w! XXtt63')
+ command('bwipe XXUxDsMc')
+ command('e! XXMacEol')
+ feed('ggO<C-R>=&ffs<CR>:<C-R>=&ff<CR><ESC>')
+ wait()
+ command('w! XXtt64')
+ command('bwipeout! XXMacEol')
+
+ -- Try reading and writing with 'fileformats' set to three formats.
+ command('set fileformats=unix,dos,mac')
+ command('e! XXUxDsMc')
+ command('w! XXtt71')
+ command('bwipe XXUxDsMc')
+ command('e! XXEol')
+ feed('ggO<C-R>=&ffs<CR>:<C-R>=&ff<CR><ESC>')
+ wait()
+ command('w! XXtt72')
+ command('bwipeout! XXEol')
+ command('set fileformats=mac,dos,unix')
+ command('e! XXUxDsMc')
+ command('w! XXtt81')
+ command('bwipe XXUxDsMc')
+ command('e! XXEol')
+ feed('ggO<C-R>=&ffs<CR>:<C-R>=&ff<CR><ESC>')
+ wait()
+ command('w! XXtt82')
+ command('bwipeout! XXEol')
+ -- Try with 'binary' set.
+ command('set fileformats=mac,unix,dos')
+ command('set binary')
+ command('e! XXUxDsMc')
+ command('w! XXtt91')
+ command('bwipe XXUxDsMc')
+ command('set fileformats=mac')
+ command('e! XXUxDsMc')
+ command('w! XXtt92')
+ command('bwipe XXUxDsMc')
+ command('set fileformats=dos')
+ command('e! XXUxDsMc')
+ command('w! XXtt93')
+
+ -- Append "END" to each file so that we can see what the last written
+ -- char was.
+ command('set fileformat=unix nobin')
+ feed('ggdGaEND<esc>')
+ wait()
+ command('w >>XXtt01')
+ command('w >>XXtt02')
+ command('w >>XXtt11')
+ command('w >>XXtt12')
+ command('w >>XXtt13')
+ command('w >>XXtt21')
+ command('w >>XXtt22')
+ command('w >>XXtt23')
+ command('w >>XXtt31')
+ command('w >>XXtt32')
+ command('w >>XXtt33')
+ command('w >>XXtt41')
+ command('w >>XXtt42')
+ command('w >>XXtt43')
+ command('w >>XXtt51')
+ command('w >>XXtt52')
+ command('w >>XXtt53')
+ command('w >>XXtt54')
+ command('w >>XXtt61')
+ command('w >>XXtt62')
+ command('w >>XXtt63')
+ command('w >>XXtt64')
+ command('w >>XXtt71')
+ command('w >>XXtt72')
+ command('w >>XXtt81')
+ command('w >>XXtt82')
+ command('w >>XXtt91')
+ command('w >>XXtt92')
+ command('w >>XXtt93')
+
+ -- Concatenate the results.
+ -- Make fileformat of test.out the native fileformat.
+ -- Add a newline at the end.
+ command('set binary')
+ command('e! test.out')
+ command('$r XXtt01')
+ command('$r XXtt02')
+ feed('Go1<esc>')
+ wait()
+ command('$r XXtt11')
+ command('$r XXtt12')
+ command('$r XXtt13')
+ feed('Go2<esc>')
+ wait()
+ command('$r XXtt21')
+ command('$r XXtt22')
+ command('$r XXtt23')
+ feed('Go3<esc>')
+ wait()
+ command('$r XXtt31')
+ command('$r XXtt32')
+ command('$r XXtt33')
+ feed('Go4<esc>')
+ wait()
+ command('$r XXtt41')
+ command('$r XXtt42')
+ command('$r XXtt43')
+ feed('Go5<esc>')
+ wait()
+ command('$r XXtt51')
+ command('$r XXtt52')
+ command('$r XXtt53')
+ command('$r XXtt54')
+ feed('Go6<esc>')
+ wait()
+ command('$r XXtt61')
+ command('$r XXtt62')
+ command('$r XXtt63')
+ command('$r XXtt64')
+ feed('Go7<esc>')
+ wait()
+ command('$r XXtt71')
+ command('$r XXtt72')
+ feed('Go8<esc>')
+ wait()
+ command('$r XXtt81')
+ command('$r XXtt82')
+ feed('Go9<esc>')
+ wait()
+ command('$r XXtt91')
+ command('$r XXtt92')
+ command('$r XXtt93')
+ feed('Go10<esc>')
+ wait()
+ command('$r XXUnix')
+ command('set nobinary ff&')
+
+ -- Assert buffer contents. This has to be done manually as
+ -- helpers.expect() calls helpers.dedent() which messes up the white space
+ -- and carrige returns.
+ eq(
+ 'unix\n'..
+ 'unix\n'..
+ 'dos\r\n'..
+ 'dos\r\n'..
+ 'END\n'..
+ 'mac\rmac\r\n'..
+ 'END\n'..
+ '1\n'..
+ 'unix\r\n'..
+ 'unix\r\n'..
+ 'END\n'..
+ 'dos\r\n'..
+ 'dos\r\n'..
+ 'END\n'..
+ 'mac\rmac\r\r\n'..
+ 'END\n'..
+ '2\n'..
+ 'unix\n'..
+ 'unix\n'..
+ '\rEND\n'..
+ 'dos\r\n'..
+ 'dos\r\n'..
+ '\rEND\n'..
+ 'mac\rmac\rEND\n'..
+ '3\n'..
+ 'unix\n'..
+ 'unix\n'..
+ 'dos\r\n'..
+ 'dos\r\n'..
+ 'mac\rmac\r\n'..
+ 'END\n'..
+ 'unix\r\n'..
+ 'unix\r\n'..
+ 'dos\r\n'..
+ 'dos\r\n'..
+ 'mac\rmac\r\r\n'..
+ 'END\n'..
+ 'unix\n'..
+ 'unix\n'..
+ 'dos\r\n'..
+ 'dos\r\n'..
+ 'mac\rmac\rEND\n'..
+ '4\n'..
+ 'unix\n'..
+ 'unix\n'..
+ 'dos\r\n'..
+ 'dos\r\n'..
+ 'mac\rmac\r\n'..
+ 'END\n'..
+ 'unix\n'..
+ 'unix\n'..
+ 'mac\rmac\r\n'..
+ 'END\n'..
+ 'dos\r\n'..
+ 'dos\r\n'..
+ 'mac\rmac\r\r\n'..
+ 'END\n'..
+ '5\n'..
+ 'unix\n'..
+ 'unix\n'..
+ 'dos\r\n'..
+ 'dos\r\n'..
+ 'END\n'..
+ 'unix\n'..
+ 'unix\n'..
+ 'dos\r\n'..
+ 'dos\r\n'..
+ 'mac\rmac\r\n'..
+ 'END\n'..
+ 'dos\r\n'..
+ 'dos\r\n'..
+ 'mac\rmac\rEND\n'..
+ 'unix,mac:unix\n'..
+ 'noeol\n'..
+ 'END\n'..
+ '6\n'..
+ 'unix\r\n'..
+ 'unix\r\n'..
+ 'dos\r\n'..
+ 'dos\r\n'..
+ 'END\n'..
+ 'dos,mac:dos\r\n'..
+ 'unix\r\n'..
+ 'unix\r\n'..
+ 'mac\rmac\r\r\n'..
+ 'END\n'..
+ 'unix\r\n'..
+ 'unix\r\n'..
+ 'dos\r\n'..
+ 'dos\r\n'..
+ 'mac\rmac\r\r\n'..
+ 'END\n'..
+ 'dos,mac:mac\rmac\rmac\rnoeol\rEND\n'..
+ '7\n'..
+ 'unix\n'..
+ 'unix\n'..
+ 'dos\r\n'..
+ 'dos\r\n'..
+ 'mac\rmac\r\n'..
+ 'END\n'..
+ 'unix,dos,mac:unix\n'..
+ 'noeol\n'..
+ 'END\n'..
+ '8\n'..
+ 'unix\n'..
+ 'unix\n'..
+ 'dos\r\n'..
+ 'dos\r\n'..
+ 'mac\rmac\r\n'..
+ 'END\n'..
+ 'mac,dos,unix:mac\rnoeol\rEND\n'..
+ '9\n'..
+ 'unix\n'..
+ 'unix\n'..
+ 'dos\r\n'..
+ 'dos\r\n'..
+ 'mac\rmac\rEND\n'..
+ 'unix\n'..
+ 'unix\n'..
+ 'dos\r\n'..
+ 'dos\r\n'..
+ 'mac\rmac\rEND\n'..
+ 'unix\n'..
+ 'unix\n'..
+ 'dos\r\n'..
+ 'dos\r\n'..
+ 'mac\rmac\rEND\n'..
+ '10\n'..
+ 'unix\n'..
+ 'unix',
+ helpers.curbuf_contents())
+ end)
+end)
diff --git a/test/functional/legacy/031_close_commands_spec.lua b/test/functional/legacy/031_close_commands_spec.lua
index eaf4e2982f..64c67c9882 100644
--- a/test/functional/legacy/031_close_commands_spec.lua
+++ b/test/functional/legacy/031_close_commands_spec.lua
@@ -16,10 +16,21 @@ local clear = helpers.clear
local source = helpers.source
local insert = helpers.insert
local expect = helpers.expect
-local execute = helpers.execute
+local feed_command = helpers.feed_command
describe('Commands that close windows and/or buffers', function()
- setup(clear)
+ local function cleanup()
+ os.remove('Xtest1')
+ os.remove('Xtest2')
+ os.remove('Xtest3')
+ end
+ setup(function()
+ cleanup()
+ clear()
+ end)
+ teardown(function()
+ cleanup()
+ end)
it('is working', function()
insert('testtext')
@@ -27,40 +38,40 @@ describe('Commands that close windows and/or buffers', function()
feed('GA 1<Esc>:$w! Xtest1<CR>')
feed('$r2:$w! Xtest2<CR>')
feed('$r3:$w! Xtest3<CR>')
- execute('n! Xtest1 Xtest2')
+ feed_command('n! Xtest1 Xtest2')
feed('A 1<Esc>:set hidden<CR>')
-- Test for working :n when hidden set
- execute('n')
+ feed_command('n')
expect('testtext 2')
-- Test for failing :rew when hidden not set
- execute('set nohidden')
+ feed_command('set nohidden')
feed('A 2<Esc>:rew<CR>')
expect('testtext 2 2')
-- Test for working :rew when hidden set
- execute('set hidden')
- execute('rew')
+ feed_command('set hidden')
+ feed_command('rew')
expect('testtext 1 1')
-- Test for :all keeping a buffer when it's modified
- execute('set nohidden')
+ feed_command('set nohidden')
feed('A 1<Esc>:sp<CR>')
- execute('n Xtest2 Xtest3')
- execute('all')
- execute('1wincmd w')
+ feed_command('n Xtest2 Xtest3')
+ feed_command('all')
+ feed_command('1wincmd w')
expect('testtext 1 1 1')
-- Test abandoning changed buffer, should be unloaded even when 'hidden' set
- execute('set hidden')
+ feed_command('set hidden')
feed('A 1<Esc>:q!<CR>')
expect('testtext 2 2')
- execute('unhide')
+ feed_command('unhide')
expect('testtext 2 2')
-- Test ":hide" hides anyway when 'hidden' not set
- execute('set nohidden')
+ feed_command('set nohidden')
feed('A 2<Esc>:hide<CR>')
expect('testtext 3')
@@ -69,42 +80,42 @@ describe('Commands that close windows and/or buffers', function()
expect('testtext 3 3')
-- Test ":edit" working in modified buffer when 'hidden' set
- execute('set hidden')
- execute('e Xtest1')
+ feed_command('set hidden')
+ feed_command('e Xtest1')
expect('testtext 1')
-- Test ":close" not hiding when 'hidden' not set in modified buffer
- execute('sp Xtest3')
- execute('set nohidden')
+ feed_command('sp Xtest3')
+ feed_command('set nohidden')
feed('A 3<Esc>:close<CR>')
expect('testtext 3 3 3')
-- Test ":close!" does hide when 'hidden' not set in modified buffer
feed('A 3<Esc>:close!<CR>')
- execute('set nohidden')
+ feed_command('set nohidden')
expect('testtext 1')
-- Test ":all!" hides changed buffer
- execute('sp Xtest4')
+ feed_command('sp Xtest4')
feed('GA 4<Esc>:all!<CR>')
- execute('1wincmd w')
+ feed_command('1wincmd w')
expect('testtext 2 2 2')
-- Test ":q!" and hidden buffer.
- execute('bw! Xtest1 Xtest2 Xtest3 Xtest4')
- execute('sp Xtest1')
- execute('wincmd w')
- execute('bw!')
- execute('set modified')
- execute('bot sp Xtest2')
- execute('set modified')
- execute('bot sp Xtest3')
- execute('set modified')
- execute('wincmd t')
- execute('hide')
- execute('q!')
+ feed_command('bw! Xtest1 Xtest2 Xtest3 Xtest4')
+ feed_command('sp Xtest1')
+ feed_command('wincmd w')
+ feed_command('bw!')
+ feed_command('set modified')
+ feed_command('bot sp Xtest2')
+ feed_command('set modified')
+ feed_command('bot sp Xtest3')
+ feed_command('set modified')
+ feed_command('wincmd t')
+ feed_command('hide')
+ feed_command('q!')
expect('testtext 3')
- execute('q!')
+ feed_command('q!')
feed('<CR>')
expect('testtext 1')
source([[
@@ -112,10 +123,4 @@ describe('Commands that close windows and/or buffers', function()
" Now nvim should have exited
throw "Oh, Not finished yet."]])
end)
-
- teardown(function()
- os.remove('Xtest1')
- os.remove('Xtest2')
- os.remove('Xtest3')
- end)
end)
diff --git a/test/functional/legacy/033_lisp_indent_spec.lua b/test/functional/legacy/033_lisp_indent_spec.lua
index b4abb02ac2..5132333a5c 100644
--- a/test/functional/legacy/033_lisp_indent_spec.lua
+++ b/test/functional/legacy/033_lisp_indent_spec.lua
@@ -1,19 +1,20 @@
--- vim: set foldmethod=marker foldmarker=[[,]] :
-- Test for 'lisp'
-- If the lisp feature is not enabled, this will fail!
local helpers = require('test.functional.helpers')(after_each)
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, expect = helpers.execute, helpers.expect
+local command, expect = helpers.command, helpers.expect
+local wait = helpers.wait
describe('lisp indent', function()
setup(clear)
+ -- luacheck: ignore 621 (Indentation)
it('is working', function()
insert([[
(defun html-file (base)
(format nil "~(~A~).html" base))
-
+
(defmacro page (name title &rest body)
(let ((ti (gensym)))
`(with-open-file (*standard-output*
@@ -22,33 +23,34 @@ describe('lisp indent', function()
:if-exists :supersede)
(let ((,ti ,title))
(as title ,ti)
- (with center
+ (with center
(as h2 (string-upcase ,ti)))
(brs 3)
,@body))))
-
+
;;; Utilities for generating links
-
+
(defmacro with-link (dest &rest body)
`(progn
(format t "<a href=\"~A\">" (html-file ,dest))
,@body
(princ "</a>")))]])
- execute('set lisp')
- execute('/^(defun')
+ command('set lisp')
+ command('/^(defun')
feed('=G:/^(defun/,$yank A<cr>')
+ wait()
-- Put @a and clean empty line
- execute('%d')
- execute('0put a')
- execute('$d')
+ command('%d')
+ command('0put a')
+ command('$d')
-- Assert buffer contents.
expect([[
(defun html-file (base)
(format nil "~(~A~).html" base))
-
+
(defmacro page (name title &rest body)
(let ((ti (gensym)))
`(with-open-file (*standard-output*
@@ -57,13 +59,13 @@ describe('lisp indent', function()
:if-exists :supersede)
(let ((,ti ,title))
(as title ,ti)
- (with center
+ (with center
(as h2 (string-upcase ,ti)))
(brs 3)
,@body))))
-
+
;;; Utilities for generating links
-
+
(defmacro with-link (dest &rest body)
`(progn
(format t "<a href=\"~A\">" (html-file ,dest))
diff --git a/test/functional/legacy/034_user_function_spec.lua b/test/functional/legacy/034_user_function_spec.lua
index 38989cd982..0b7dfc4f0e 100644
--- a/test/functional/legacy/034_user_function_spec.lua
+++ b/test/functional/legacy/034_user_function_spec.lua
@@ -5,7 +5,7 @@
local helpers = require('test.functional.helpers')(after_each)
local feed, insert, source = helpers.feed, helpers.insert, helpers.source
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
describe('user functions, expr-mappings, overwrite protected builtin functions and regression on calling expressions', function()
setup(clear)
@@ -72,19 +72,19 @@ describe('user functions, expr-mappings, overwrite protected builtin functions a
feed('(one<cr>')
feed('(two<cr>')
feed('[(one again<esc>')
- execute('call append(line("$"), max([1, 2, 3]))')
- execute('call extend(g:, {"max": function("min")})')
- execute('call append(line("$"), max([1, 2, 3]))')
- execute('try')
+ feed_command('call append(line("$"), max([1, 2, 3]))')
+ feed_command('call extend(g:, {"max": function("min")})')
+ feed_command('call append(line("$"), max([1, 2, 3]))')
+ feed_command('try')
-- Regression: the first line below used to throw "E110: Missing ')'"
-- Second is here just to prove that this line is correct when not
-- skipping rhs of &&.
- execute([[ $put =(0&&(function('tr'))(1, 2, 3))]])
- execute([[ $put =(1&&(function('tr'))(1, 2, 3))]])
- execute('catch')
- execute([[ $put ='!!! Unexpected exception:']])
- execute(' $put =v:exception')
- execute('endtry')
+ feed_command([[ $put =(0&&(function('tr'))(1, 2, 3))]])
+ feed_command([[ $put =(1&&(function('tr'))(1, 2, 3))]])
+ feed_command('catch')
+ feed_command([[ $put ='!!! Unexpected exception:']])
+ feed_command(' $put =v:exception')
+ feed_command('endtry')
-- Assert buffer contents.
expect([[
diff --git a/test/functional/legacy/035_increment_and_decrement_spec.lua b/test/functional/legacy/035_increment_and_decrement_spec.lua
index 3b9f7a9d85..84eb9c0eee 100644
--- a/test/functional/legacy/035_increment_and_decrement_spec.lua
+++ b/test/functional/legacy/035_increment_and_decrement_spec.lua
@@ -3,7 +3,7 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, expect = helpers.execute, helpers.expect
+local feed_command, expect = helpers.feed_command, helpers.expect
describe('increment and decrement commands', function()
setup(clear)
@@ -19,25 +19,25 @@ describe('increment and decrement commands', function()
-- Increment and decrement numbers in the first row, interpreting the
-- numbers as decimal, octal or hexadecimal.
- execute('set nrformats=bin,octal,hex', '1')
+ feed_command('set nrformats=bin,octal,hex', '1')
feed('63l102ll64128$')
-- For the second row, treat the numbers as decimal or octal.
-- 0x100 should be interpreted as decimal 0, the character x, and decimal 100.
- execute('set nrformats=octal', '2')
+ feed_command('set nrformats=octal', '2')
feed('0w102l2w65129blx6lD')
-- For the third row, treat the numbers as decimal or hexadecimal.
-- 077 should be interpreted as decimal 77.
- execute('set nrformats=hex', '3')
+ feed_command('set nrformats=hex', '3')
feed('0101l257Txldt   ')
-- For the fourth row, interpret all numbers as decimal.
- execute('set nrformats=', '4')
+ feed_command('set nrformats=', '4')
feed('0200l100w78')
-- For the last row, interpret as binary and hexadecimal.
- execute('set nrformats=bin,hex', '5')
+ feed_command('set nrformats=bin,hex', '5')
feed('010065l6432')
expect([[
diff --git a/test/functional/legacy/036_regexp_character_classes_spec.lua b/test/functional/legacy/036_regexp_character_classes_spec.lua
index 3d5e69d1e5..38e8145d1c 100644
--- a/test/functional/legacy/036_regexp_character_classes_spec.lua
+++ b/test/functional/legacy/036_regexp_character_classes_spec.lua
@@ -1,9 +1,8 @@
-- Test character classes in regexp using regexpengine 0, 1, 2.
local helpers = require('test.functional.helpers')(after_each)
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, command, expect = helpers.clear, helpers.command, helpers.expect
local source, write_file = helpers.source, helpers.write_file
-local os_name = helpers.os_name
local function sixlines(text)
local result = ''
@@ -14,19 +13,16 @@ local function sixlines(text)
end
local function diff(text, nodedent)
- local tmpname = os.tmpname()
- if os_name() == 'osx' and string.match(tmpname, '^/tmp') then
- tmpname = '/private'..tmpname
- end
- execute('w! '..tmpname)
+ local fname = helpers.tmpname()
+ command('w! '..fname)
helpers.wait()
- local data = io.open(tmpname):read('*all')
+ local data = io.open(fname):read('*all')
if nodedent then
helpers.eq(text, data)
else
helpers.eq(helpers.dedent(text), data)
end
- os.remove(tmpname)
+ os.remove(fname)
end
describe('character classes in regexp', function()
@@ -49,7 +45,7 @@ describe('character classes in regexp', function()
end)
before_each(function()
clear()
- execute('e test36.in')
+ command('e test36.in')
end)
teardown(function()
os.remove('test36.in')
@@ -268,4 +264,27 @@ describe('character classes in regexp', function()
ABCDEFGHIXYZ
ABCDEFGHIXYZ]])
end)
+ it([["\%1l^#.*" does not match on a line starting with "#". (vim-patch:7.4.1305)]], function()
+ source([[
+ 1 s/\%#=0\%1l^\t...//g
+ 2 s/\%#=1\%2l^\t...//g
+ 3 s/\%#=2\%3l^\t...//g
+ 4 s/\%#=0\%4l^\t...//g
+ 5 s/\%#=1\%5l^\t...//g
+ 6 s/\%#=2\%6l^\t...//g]])
+ diff(sixlines(string.sub(punct1, 1)..digits..punct2..upper..punct3..
+ lower..punct4..ctrl2..iso_text))
+ end)
+ it('does not convert character class ranges to an incorrect class', function()
+ source([[
+ 1 s/\%#=0[0-z]//g
+ 2 s/\%#=1[0-z]//g
+ 3 s/\%#=2[0-z]//g
+ 4 s/\%#=0[^0-z]//g
+ 5 s/\%#=1[^0-z]//g
+ 6 s/\%#=2[^0-z]//g
+ ]])
+ diff(string.rep(ctrl1..punct1..punct4..ctrl2..iso_text..'\n', 3)
+ ..string.rep(digits..punct2..upper..punct3..lower..'\n', 3))
+ end)
end)
diff --git a/test/functional/legacy/038_virtual_replace_spec.lua b/test/functional/legacy/038_virtual_replace_spec.lua
index dcbc9c39f7..8dd7bdda6e 100644
--- a/test/functional/legacy/038_virtual_replace_spec.lua
+++ b/test/functional/legacy/038_virtual_replace_spec.lua
@@ -2,31 +2,32 @@
local helpers = require('test.functional.helpers')(after_each)
local feed = helpers.feed
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
describe('Virtual replace mode', function()
setup(clear)
+ -- luacheck: ignore 621 (Indentation)
it('is working', function()
-- Make sure that backspace works, no matter what termcap is used.
- execute('set t_kD=x7f t_kb=x08')
+ feed_command('set t_kD=x7f t_kb=x08')
-- Use vi default for 'smarttab'
- execute('set nosmarttab')
+ feed_command('set nosmarttab')
feed('ggdGa<cr>')
feed('abcdefghi<cr>')
feed('jk<tab>lmn<cr>')
feed('<Space><Space><Space><Space>opq<tab>rst<cr>')
feed('<C-d>uvwxyz<cr>')
feed('<esc>gg')
- execute('set ai')
- execute('set bs=2')
+ feed_command('set ai')
+ feed_command('set bs=2')
feed('gR0<C-d> 1<cr>')
feed('A<cr>')
feed('BCDEFGHIJ<cr>')
feed('<tab>KL<cr>')
feed('MNO<cr>')
feed('PQR<esc>G')
- execute('ka')
+ feed_command('ka')
feed('o0<C-d><cr>')
feed('abcdefghi<cr>')
feed('jk<tab>lmn<cr>')
diff --git a/test/functional/legacy/039_visual_block_mode_commands_spec.lua b/test/functional/legacy/039_visual_block_mode_commands_spec.lua
index 63335985cc..135058c579 100644
--- a/test/functional/legacy/039_visual_block_mode_commands_spec.lua
+++ b/test/functional/legacy/039_visual_block_mode_commands_spec.lua
@@ -5,14 +5,14 @@ local helpers = require('test.functional.helpers')(after_each)
local nvim, eq = helpers.meths, helpers.eq
local insert, feed = helpers.insert, helpers.feed
local clear, expect = helpers.clear, helpers.expect
-local execute = helpers.execute
+local feed_command = helpers.feed_command
describe('Visual block mode', function()
before_each(function()
clear()
- execute('set ts&vi sw&vi sts&vi noet') -- Vim compatible
+ feed_command('set ts&vi sw&vi sts&vi noet') -- Vim compatible
end)
it('should shift, insert, replace and change a block', function()
@@ -43,6 +43,7 @@ describe('Visual block mode', function()
abcdqqqqijklm]])
end)
+ -- luacheck: ignore 611 (Line contains only whitespaces)
it('should insert a block using cursor keys for movement', function()
insert([[
aaaaaa
@@ -55,9 +56,9 @@ describe('Visual block mode', function()
cccc
dddd]])
- execute('/^aa')
+ feed_command('/^aa')
feed('l<C-v>jjjlllI<Right><Right> <ESC>')
- execute('/xaaa$')
+ feed_command('/xaaa$')
feed('<C-v>jjjI<lt>><Left>p<ESC>')
expect([[
@@ -84,13 +85,13 @@ describe('Visual block mode', function()
4567]])
-- Test for Visual block was created with the last <C-v>$.
- execute('/^A23$/')
+ feed_command('/^A23$/')
feed('l<C-v>j$Aab<ESC>')
-- Test for Visual block was created with the middle <C-v>$ (1).
- execute('/^B23$/')
+ feed_command('/^B23$/')
feed('l<C-v>j$hAab<ESC>')
-- Test for Visual block was created with the middle <C-v>$ (2).
- execute('/^C23$/')
+ feed_command('/^C23$/')
feed('l<C-v>j$hhAab<ESC>')
expect([[
@@ -104,6 +105,7 @@ describe('Visual block mode', function()
456ab7]])
end)
+ -- luacheck: ignore 621 (Indentation)
it('should insert and append a block when virtualedit=all', function()
insert([[
line1
@@ -112,8 +114,8 @@ describe('Visual block mode', function()
]])
-- Test for Visual block insert when virtualedit=all and utf-8 encoding.
- execute('set ve=all')
- execute('/\t\tline')
+ feed_command('set ve=all')
+ feed_command('/\t\tline')
feed('07l<C-v>jjIx<ESC>')
expect([[
@@ -199,10 +201,10 @@ describe('Visual block mode', function()
98765]])
-- Test cursor position. When virtualedit=block and Visual block mode and $gj.
- execute('set ve=block')
+ feed_command('set ve=block')
feed('G2l')
feed('2k<C-v>$gj<ESC>')
- execute([[let cpos=getpos("'>")]])
+ feed_command([[let cpos=getpos("'>")]])
local cpos = nvim.get_var('cpos')
local expected = {
col = 4,
@@ -223,7 +225,7 @@ describe('Visual block mode', function()
#define BO_CRSR 0x0004]])
-- Block_insert when replacing spaces in front of the block with tabs.
- execute('set ts=8 sts=4 sw=4')
+ feed_command('set ts=8 sts=4 sw=4')
feed('ggf0<C-v>2jI<TAB><ESC>')
expect([[
diff --git a/test/functional/legacy/041_writing_and_reading_hundred_kbyte_spec.lua b/test/functional/legacy/041_writing_and_reading_hundred_kbyte_spec.lua
index b6451eb720..b526d82519 100644
--- a/test/functional/legacy/041_writing_and_reading_hundred_kbyte_spec.lua
+++ b/test/functional/legacy/041_writing_and_reading_hundred_kbyte_spec.lua
@@ -1,8 +1,10 @@
-- Test for writing and reading a file of over 100 Kbyte
local helpers = require('test.functional.helpers')(after_each)
+
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, expect = helpers.execute, helpers.expect
+local command, expect = helpers.command, helpers.expect
+local wait = helpers.wait
describe('writing and reading a file of over 100 Kbyte', function()
setup(clear)
@@ -16,17 +18,18 @@ describe('writing and reading a file of over 100 Kbyte', function()
This is the end]])
feed('kY3000p2GY3000p')
+ wait()
- execute('w! test.out')
- execute('%d')
- execute('e! test.out')
- execute('yank A')
- execute('3003yank A')
- execute('6005yank A')
- execute('%d')
- execute('0put a')
- execute('$d')
- execute('w!')
+ command('w! test.out')
+ command('%d')
+ command('e! test.out')
+ command('yank A')
+ command('3003yank A')
+ command('6005yank A')
+ command('%d')
+ command('0put a')
+ command('$d')
+ command('w!')
expect([[
This is the start
diff --git a/test/functional/legacy/043_magic_settings_spec.lua b/test/functional/legacy/043_magic_settings_spec.lua
index f174751de2..a88ccc2b42 100644
--- a/test/functional/legacy/043_magic_settings_spec.lua
+++ b/test/functional/legacy/043_magic_settings_spec.lua
@@ -1,9 +1,8 @@
--- vim: set foldmethod=marker foldmarker=[[,]] :
-- Tests for regexp with various magic settings.
local helpers = require('test.functional.helpers')(after_each)
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, expect = helpers.execute, helpers.expect
+local feed_command, expect = helpers.feed_command, helpers.expect
describe('regexp with magic settings', function()
setup(clear)
@@ -21,27 +20,27 @@ describe('regexp with magic settings', function()
9 foobar
]])
- execute('/^1')
- execute([[/a*b\{2}c\+/e]])
+ feed_command('/^1')
+ feed_command([[/a*b\{2}c\+/e]])
feed([[x/\Md\*e\{2}f\+/e<cr>]])
feed('x:set nomagic<cr>')
- execute([[/g\*h\{2}i\+/e]])
+ feed_command([[/g\*h\{2}i\+/e]])
feed([[x/\mj*k\{2}l\+/e<cr>]])
feed([[x/\vm*n{2}o+/e<cr>]])
feed([[x/\V^aa$<cr>]])
feed('x:set magic<cr>')
- execute([[/\v(a)(b)\2\1\1/e]])
+ feed_command([[/\v(a)(b)\2\1\1/e]])
feed([[x/\V[ab]\(\[xy]\)\1<cr>]])
feed('x:$<cr>')
- execute('set undolevels=100')
+ feed_command('set undolevels=100')
feed('dv?bar?<cr>')
feed('Yup:<cr>')
- execute('?^1?,$yank A')
+ feed_command('?^1?,$yank A')
-- Put @a and clean empty line
- execute('%d')
- execute('0put a')
- execute('$d')
+ feed_command('%d')
+ feed_command('0put a')
+ feed_command('$d')
-- Assert buffer contents.
expect([[
diff --git a/test/functional/legacy/044_099_regexp_multibyte_magic_spec.lua b/test/functional/legacy/044_099_regexp_multibyte_magic_spec.lua
index 4189e8a33a..074ee094b4 100644
--- a/test/functional/legacy/044_099_regexp_multibyte_magic_spec.lua
+++ b/test/functional/legacy/044_099_regexp_multibyte_magic_spec.lua
@@ -5,7 +5,7 @@
local helpers = require('test.functional.helpers')(after_each)
local feed, insert = helpers.feed, helpers.insert
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
-- Runs the test protocol with the given 'regexpengine' setting. In the old test
-- suite the test protocol was duplicated in test44 and test99, the only
@@ -28,25 +28,23 @@ local function run_test_with_regexpengine(regexpengine)
e ’…™ธy
f ’Šฏz
g aๅ•ทbb
- h Aร€รร‚รƒร„ร…ฤ€ฤ‚ฤ„ววžว แบข Bแธ‚แธ† Cร‡ฤ†ฤˆฤŠฤŒ DฤŽฤแธŠแธŽแธ Eรˆร‰รŠร‹ฤ’ฤ”ฤ–ฤ˜ฤšแบบแบผ Fแธž Gฤœฤžฤ ฤขวควฆวดแธ  Hฤคฤฆแธขแธฆแธจ IรŒรรŽรฤจฤชฤฌฤฎฤฐวแปˆ Jฤด Kฤถวจแธฐแธด Lฤนฤปฤฝฤฟลแธบ Mแธพแน€ Nร‘ลƒล…ล‡แน„แนˆ Oร’ร“ร”ร•ร–ร˜ลŒลŽลฦ ว‘วชวฌแปŽ Pแน”แน– Q Rล”ล–ล˜แน˜แนž Sลšลœลžล แน  Tลขลคลฆแนชแนฎ Uร™รšร›รœลจลชลฌลฎลฐลฒฦฏว“แปฆ Vแนผ Wลดแบ€แบ‚แบ„แบ† XแบŠแบŒ YรลถลธแบŽแปฒแปถแปธ Zลนลปลฝฦตแบแบ”
- i aร รกรขรฃรครฅฤฤƒฤ…วŽวŸวกแบฃ bแธƒแธ‡ cรงฤ‡ฤ‰ฤ‹ฤ dฤฤ‘แธ‹แธแธ‘ eรจรฉรชรซฤ“ฤ•ฤ—ฤ™ฤ›แบปแบฝ fแธŸ gฤฤŸฤกฤฃวฅวงวตแธก hฤฅฤงแธฃแธงแธฉแบ– iรฌรญรฎรฏฤฉฤซฤญฤฏวแป‰ jฤตวฐ kฤทวฉแธฑแธต lฤบฤผฤพล€ล‚แธป mแธฟแน nรฑล„ล†ลˆล‰แน…แน‰ oรฒรณรดรตรถรธลลล‘ฦกว’วซวญแป pแน•แน— q rล•ล—ล™แน™แนŸ sล›ลลŸลกแนก tลฃลฅลงแนซแนฏแบ— uรนรบรปรผลฉลซลญลฏลฑลณฦฐว”แปง vแนฝ wลตแบแบƒแบ…แบ‡แบ˜ xแบ‹แบ yรฝรฟลทแบแบ™แปณแปทแปน zลบลผลพฦถแบ‘แบ•
j 0123โคx
k combinations
l รค รถ รผ ฮฑฬ„ฬ†ฬ]])
- execute('set re=' .. regexpengine)
+ feed_command('set re=' .. regexpengine)
-- Lines 1-8. Exercise regexp search with various magic settings. On each
-- line the character on which the cursor is expected to land is deleted.
feed('/^1<cr>')
feed([[/a*b\{2}c\+/e<cr>x]])
feed([[/\Md\*e\{2}f\+/e<cr>x]])
- execute('set nomagic')
+ feed_command('set nomagic')
feed([[/g\*h\{2}i\+/e<cr>x]])
feed([[/\mj*k\{2}l\+/e<cr>x]])
feed([[/\vm*n{2}o+/e<cr>x]])
feed([[/\V^aa$<cr>x]])
- execute('set magic')
+ feed_command('set magic')
feed([[/\v(a)(b)\2\1\1/e<cr>x]])
feed([[/\V[ab]\(\[xy]\)\1<cr>x]])
@@ -59,7 +57,7 @@ local function run_test_with_regexpengine(regexpengine)
-- Line b. Find word by change of word class.
-- (The "<" character in this test step seemed to confuse our "feed" test
-- helper, which is why we've resorted to "execute" here.)
- execute([[/ใก\<ใ‚ซใƒจ\>ใฏ]])
+ feed_command([[/ใก\<ใ‚ซใƒจ\>ใฏ]])
feed('x')
-- Lines c-i. Test \%u, [\u], and friends.
@@ -68,14 +66,6 @@ local function run_test_with_regexpengine(regexpengine)
feed([[/\%U12345678<cr>x]])
feed([[/[\U1234abcd\u1234\uabcd]<cr>x]])
feed([[/\%d21879b<cr>x]])
- feed('/ [[=A=]]* [[=B=]]* [[=C=]]* [[=D=]]* [[=E=]]* [[=F=]]* ' ..
- '[[=G=]]* [[=H=]]* [[=I=]]* [[=J=]]* [[=K=]]* [[=L=]]* [[=M=]]* ' ..
- '[[=N=]]* [[=O=]]* [[=P=]]* [[=Q=]]* [[=R=]]* [[=S=]]* [[=T=]]* ' ..
- '[[=U=]]* [[=V=]]* [[=W=]]* [[=X=]]* [[=Y=]]* [[=Z=]]*/e<cr>x')
- feed('/ [[=a=]]* [[=b=]]* [[=c=]]* [[=d=]]* [[=e=]]* [[=f=]]* ' ..
- '[[=g=]]* [[=h=]]* [[=i=]]* [[=j=]]* [[=k=]]* [[=l=]]* [[=m=]]* ' ..
- '[[=n=]]* [[=o=]]* [[=p=]]* [[=q=]]* [[=r=]]* [[=s=]]* [[=t=]]* ' ..
- '[[=u=]]* [[=v=]]* [[=w=]]* [[=x=]]* [[=y=]]* [[=z=]]*/e<cr>x')
-- Line j. Test backwards search from a multi-byte character.
feed('/x<cr>x')
@@ -83,28 +73,28 @@ local function run_test_with_regexpengine(regexpengine)
-- Line k. Test substitution with combining characters by executing register
-- contents.
- execute([[let @w=':%s#comb[i]nations#ล“ฬ„แนฃฬmฬฅฬ„ฮฑฬ„ฬ†ฬ#g']])
- execute('@w')
+ feed_command([[let @w=':%s#comb[i]nations#ล“ฬ„แนฃฬmฬฅฬ„ฮฑฬ„ฬ†ฬ#g']])
+ feed_command('@w')
-- Line l. Ex command ":s/ \?/ /g" should NOT split multi-byte characters
-- into bytes (fixed by vim-7.3.192).
- execute([[/^l]])
- execute([[s/ \?/ /g]])
+ feed_command([[/^l]])
+ feed_command([[s/ \?/ /g]])
-- Additional tests. Test matchstr() with multi-byte characters.
feed('G')
- execute([[put =matchstr(\"ืื‘ื’ื“\", \".\", 0, 2)]]) -- ื‘
- execute([[put =matchstr(\"ืื‘ื’ื“\", \"..\", 0, 2)]]) -- ื‘ื’
- execute([[put =matchstr(\"ืื‘ื’ื“\", \".\", 0, 0)]]) -- ื
- execute([[put =matchstr(\"ืื‘ื’ื“\", \".\", 4, -1)]]) -- ื’
+ feed_command([[put =matchstr(\"ืื‘ื’ื“\", \".\", 0, 2)]]) -- ื‘
+ feed_command([[put =matchstr(\"ืื‘ื’ื“\", \"..\", 0, 2)]]) -- ื‘ื’
+ feed_command([[put =matchstr(\"ืื‘ื’ื“\", \".\", 0, 0)]]) -- ื
+ feed_command([[put =matchstr(\"ืื‘ื’ื“\", \".\", 4, -1)]]) -- ื’
-- Test that a search with "/e" offset wraps around at the end of the buffer.
- execute('new')
- execute([[$put =['dog(a', 'cat('] ]])
+ feed_command('new')
+ feed_command([[$put =['dog(a', 'cat('] ]])
feed('/(/e+<cr>')
feed('"ayn')
- execute('bd!')
- execute([[$put ='']])
+ feed_command('bd!')
+ feed_command([[$put ='']])
feed('G"ap')
-- Assert buffer contents.
@@ -125,8 +115,6 @@ local function run_test_with_regexpengine(regexpengine)
e y
f z
g abb
- h Aร€รร‚รƒร„ร…ฤ€ฤ‚ฤ„ววžว แบข Bแธ‚แธ† Cร‡ฤ†ฤˆฤŠฤŒ DฤŽฤแธŠแธŽแธ Eรˆร‰รŠร‹ฤ’ฤ”ฤ–ฤ˜ฤšแบบแบผ Fแธž Gฤœฤžฤ ฤขวควฆวดแธ  Hฤคฤฆแธขแธฆแธจ IรŒรรŽรฤจฤชฤฌฤฎฤฐวแปˆ Jฤด Kฤถวจแธฐแธด Lฤนฤปฤฝฤฟลแธบ Mแธพแน€ Nร‘ลƒล…ล‡แน„แนˆ Oร’ร“ร”ร•ร–ร˜ลŒลŽลฦ ว‘วชวฌแปŽ Pแน”แน– Q Rล”ล–ล˜แน˜แนž Sลšลœลžล แน  Tลขลคลฆแนชแนฎ Uร™รšร›รœลจลชลฌลฎลฐลฒฦฏว“แปฆ Vแนผ Wลดแบ€แบ‚แบ„แบ† XแบŠแบŒ YรลถลธแบŽแปฒแปถแปธ Zลนลปลฝฦตแบ
- i aร รกรขรฃรครฅฤฤƒฤ…วŽวŸวกแบฃ bแธƒแธ‡ cรงฤ‡ฤ‰ฤ‹ฤ dฤฤ‘แธ‹แธแธ‘ eรจรฉรชรซฤ“ฤ•ฤ—ฤ™ฤ›แบปแบฝ fแธŸ gฤฤŸฤกฤฃวฅวงวตแธก hฤฅฤงแธฃแธงแธฉแบ– iรฌรญรฎรฏฤฉฤซฤญฤฏวแป‰ jฤตวฐ kฤทวฉแธฑแธต lฤบฤผฤพล€ล‚แธป mแธฟแน nรฑล„ล†ลˆล‰แน…แน‰ oรฒรณรดรตรถรธลลล‘ฦกว’วซวญแป pแน•แน— q rล•ล—ล™แน™แนŸ sล›ลลŸลกแนก tลฃลฅลงแนซแนฏแบ— uรนรบรปรผลฉลซลญลฏลฑลณฦฐว”แปง vแนฝ wลตแบแบƒแบ…แบ‡แบ˜ xแบ‹แบ yรฝรฟลทแบแบ™แปณแปทแปน zลบลผลพฦถแบ‘
j 012โค
k ล“ฬ„แนฃฬmฬฅฬ„ฮฑฬ„ฬ†ฬ
l รค รถ รผ ฮฑฬ„ฬ†ฬ
diff --git a/test/functional/legacy/045_folding_spec.lua b/test/functional/legacy/045_folding_spec.lua
index cefd7c0d42..6ca1176aea 100644
--- a/test/functional/legacy/045_folding_spec.lua
+++ b/test/functional/legacy/045_folding_spec.lua
@@ -1,135 +1,212 @@
-- Tests for folding.
+local Screen = require('test.functional.ui.screen')
local helpers = require('test.functional.helpers')(after_each)
-local feed, insert, clear, execute, expect =
- helpers.feed, helpers.insert, helpers.clear, helpers.execute, helpers.expect
+local feed, insert, feed_command, expect_any =
+ helpers.feed, helpers.insert, helpers.feed_command, helpers.expect_any
describe('folding', function()
- before_each(clear)
+ local screen
- it('is working', function()
+ before_each(function()
+ helpers.clear()
+
+ screen = Screen.new(20, 8)
+ screen:attach()
+ end)
+ after_each(function()
+ screen:detach()
+ end)
+
+ it('creation, opening, moving (to the end) and closing', function()
insert([[
1 aa
2 bb
3 cc
- 4 dd {{{
- 5 ee {{{ }}}
- 6 ff }}}
- 7 gg
- 8 hh
- 9 ii
- a jj
- b kk
- last]])
+ last
+ ]])
-- Basic test if a fold can be created, opened, moving to the end and
-- closed.
- execute('/^1')
+ feed_command('1')
feed('zf2j')
- execute('call append("$", "manual " . getline(foldclosed(".")))')
+ feed_command('call append("$", "manual " . getline(foldclosed(".")))')
feed('zo')
- execute('call append("$", foldclosed("."))')
+ feed_command('call append("$", foldclosed("."))')
feed(']z')
- execute('call append("$", getline("."))')
+ feed_command('call append("$", getline("."))')
feed('zc')
- execute('call append("$", getline(foldclosed(".")))')
- -- Test folding with markers.
- execute('set fdm=marker fdl=1 fdc=3')
- execute('/^5')
- execute('call append("$", "marker " . foldlevel("."))')
+ feed_command('call append("$", getline(foldclosed(".")))')
+
+ expect_any([[
+ manual 1 aa
+ -1
+ 3 cc
+ 1 aa]])
+ end)
+
+ it("foldmethod=marker", function()
+ screen:try_resize(20, 10)
+ insert([[
+ dd {{{
+ ee {{{ }}}
+ ff }}}
+ ]])
+ feed_command('set fdm=marker fdl=1')
+ feed_command('2')
+ feed_command('call append("$", "line 2 foldlevel=" . foldlevel("."))')
feed('[z')
- execute('call append("$", foldlevel("."))')
- feed('jo{{ <esc>r{jj')
- execute('call append("$", foldlevel("."))')
+ feed_command('call append("$", foldlevel("."))')
+ feed('jo{{ <esc>r{jj') -- writes '{{{' and moves 2 lines bot
+ feed_command('call append("$", foldlevel("."))')
feed('kYpj')
- execute('call append("$", foldlevel("."))')
- -- Test folding with indent.
- execute('set fdm=indent sw=2')
- execute('/^2 b')
- feed('i <esc>jI <esc>')
- execute('call append("$", "indent " . foldlevel("."))')
- feed('k')
- execute('call append("$", foldlevel("."))')
- -- Test syntax folding.
- execute('set fdm=syntax fdl=0')
- execute('syn region Hup start="dd" end="ii" fold contains=Fd1,Fd2,Fd3')
- execute('syn region Fd1 start="ee" end="ff" fold contained')
- execute('syn region Fd2 start="gg" end="hh" fold contained')
- execute('syn region Fd3 start="commentstart" end="commentend" fold contained')
+ feed_command('call append("$", foldlevel("."))')
+
+ helpers.wait()
+ screen:expect([[
+ dd {{{ |
+ ee {{{ }}} |
+ {{{ |
+ ff }}} |
+ ff }}} |
+ ^ |
+ line 2 foldlevel=2 |
+ 1 |
+ 1 |
+ |
+ ]])
+
+ end)
+
+ it("foldmethod=indent", function()
+ screen:try_resize(20, 8)
+ feed_command('set fdm=indent sw=2')
+ insert([[
+ aa
+ bb
+ cc
+ last
+ ]])
+ feed_command('call append("$", "foldlevel line3=" . foldlevel(3))')
+ feed_command('call append("$", foldlevel(2))')
+ feed('zR')
+
+ helpers.wait()
+ screen:expect([[
+ aa |
+ bb |
+ cc |
+ last |
+ ^ |
+ foldlevel line3=2 |
+ 1 |
+ |
+ ]])
+ end)
+
+ it("foldmethod=syntax", function()
+ screen:try_resize(35, 15)
+ insert([[
+ 1 aa
+ 2 bb
+ 3 cc
+ 4 dd {{{
+ 5 ee {{{ }}}
+ 6 ff }}}
+ 7 gg
+ 8 hh
+ 9 ii
+ a jj
+ b kk
+ last]])
+ feed_command('set fdm=syntax fdl=0')
+ feed_command('syn region Hup start="dd" end="ii" fold contains=Fd1,Fd2,Fd3')
+ feed_command('syn region Fd1 start="ee" end="ff" fold contained')
+ feed_command('syn region Fd2 start="gg" end="hh" fold contained')
+ feed_command('syn region Fd3 start="commentstart" end="commentend" fold contained')
feed('Gzk')
- execute('call append("$", "folding " . getline("."))')
+ feed_command('call append("$", "folding " . getline("."))')
feed('k')
- execute('call append("$", getline("."))')
+ feed_command('call append("$", getline("."))')
feed('jAcommentstart <esc>Acommentend<esc>')
- execute('set fdl=1')
+ feed_command('set fdl=1')
feed('3j')
- execute('call append("$", getline("."))')
- execute('set fdl=0')
- feed('zO<C-L>j')
- execute('call append("$", getline("."))')
- -- Test expression folding.
- execute('fun Flvl()')
- execute(' let l = getline(v:lnum)')
- execute(' if l =~ "bb$"')
- execute(' return 2')
- execute(' elseif l =~ "gg$"')
- execute(' return "s1"')
- execute(' elseif l =~ "ii$"')
- execute(' return ">2"')
- execute(' elseif l =~ "kk$"')
- execute(' return "0"')
- execute(' endif')
- execute(' return "="')
- execute('endfun')
- execute('set fdm=expr fde=Flvl()')
- execute('/bb$')
- execute('call append("$", "expr " . foldlevel("."))')
- execute('/hh$')
- execute('call append("$", foldlevel("."))')
- execute('/ii$')
- execute('call append("$", foldlevel("."))')
- execute('/kk$')
- execute('call append("$", foldlevel("."))')
- execute('0,/^last/delete')
- execute('delfun Flvl')
-
- -- Assert buffer contents.
- expect([[
- manual 1 aa
- -1
+ feed_command('call append("$", getline("."))')
+ feed_command('set fdl=0')
+ feed('zO<C-L>j') -- <C-L> redraws screen
+ feed_command('call append("$", getline("."))')
+ feed_command('set fdl=0')
+ expect_any([[
+ folding 9 ii
3 cc
+ 9 ii
+ a jj]])
+ end)
+
+ it("foldmethod=expression", function()
+ insert([[
1 aa
- marker 2
- 1
- 1
- 0
- indent 2
- 1
- folding 9 ii
- 3 cc
+ 2 bb
+ 3 cc
+ 4 dd {{{
+ 5 ee {{{ }}}
+ 6 ff }}}
7 gg
8 hh
+ 9 ii
+ a jj
+ b kk
+ last ]])
+
+ feed_command([[
+ fun Flvl()
+ let l = getline(v:lnum)
+ if l =~ "bb$"
+ return 2
+ elseif l =~ "gg$"
+ return "s1"
+ elseif l =~ "ii$"
+ return ">2"
+ elseif l =~ "kk$"
+ return "0"
+ endif
+ return "="
+ endfun
+ ]])
+ feed_command('set fdm=expr fde=Flvl()')
+ feed_command('/bb$')
+ feed_command('call append("$", "expr " . foldlevel("."))')
+ feed_command('/hh$')
+ feed_command('call append("$", foldlevel("."))')
+ feed_command('/ii$')
+ feed_command('call append("$", foldlevel("."))')
+ feed_command('/kk$')
+ feed_command('call append("$", foldlevel("."))')
+
+ expect_any([[
expr 2
1
2
0]])
end)
- it('can open after :move', function()
+ it('can be opened after :move', function()
+ -- luacheck: ignore
+ screen:try_resize(35, 8)
insert([[
Test fdm=indent and :move bug END
line2
Test fdm=indent START
line3
line4]])
-
- execute('set noai nosta')
- execute('set fdm=indent')
- execute('1m1')
+ feed_command('set noai nosta ')
+ feed_command('set fdm=indent')
+ feed_command('1m1')
feed('2jzc')
- execute('m0')
+ feed_command('m0')
+ feed('zR')
- expect([[
+ expect_any([[
Test fdm=indent START
line3
line4
@@ -137,3 +214,4 @@ describe('folding', function()
line2]])
end)
end)
+
diff --git a/test/functional/legacy/051_highlight_spec.lua b/test/functional/legacy/051_highlight_spec.lua
index 5bf3b51b90..0c9c9621ee 100644
--- a/test/functional/legacy/051_highlight_spec.lua
+++ b/test/functional/legacy/051_highlight_spec.lua
@@ -1,11 +1,13 @@
--- vim: set foldmethod=marker foldmarker=[[,]] :
-- Tests for ":highlight".
local Screen = require('test.functional.ui.screen')
local helpers = require('test.functional.helpers')(after_each)
local clear, feed = helpers.clear, helpers.feed
-local execute, expect = helpers.execute, helpers.expect
+local expect = helpers.expect
+local eq = helpers.eq
local wait = helpers.wait
+local exc_exec = helpers.exc_exec
+local feed_command = helpers.feed_command
describe(':highlight', function()
setup(clear)
@@ -14,7 +16,8 @@ describe(':highlight', function()
local screen = Screen.new(35, 10)
screen:attach()
-- Basic test if ":highlight" doesn't crash
- execute('highlight')
+ feed_command('set more')
+ feed(':highlight<CR>')
-- FIXME(tarruda): We need to be sure the prompt is displayed before
-- continuing, or risk a race condition where some of the following input
-- is discarded resulting in test failure
@@ -32,65 +35,62 @@ describe(':highlight', function()
]])
feed('q')
wait() -- wait until we're back to normal
- execute('hi Search')
+ feed_command('hi Search')
+ feed_command('hi Normal')
-- Test setting colors.
-- Test clearing one color and all doesn't generate error or warning
- execute('hi NewGroup cterm=italic ctermfg=DarkBlue ctermbg=Grey gui=NONE guifg=#00ff00 guibg=Cyan')
- execute('hi Group2 cterm=NONE')
- execute('hi Group3 cterm=bold')
- execute('redir! @a')
- execute('hi NewGroup')
- execute('hi Group2')
- execute('hi Group3')
- execute('hi clear NewGroup')
- execute('hi NewGroup')
- execute('hi Group2')
- execute('hi Group2 NONE')
- execute('hi Group2')
- execute('hi clear')
- execute('hi Group3')
- execute([[hi Crash cterm='asdf]])
- execute('redir END')
+ feed_command('hi NewGroup cterm=italic ctermfg=DarkBlue ctermbg=Grey gui=NONE guifg=#00ff00 guibg=Cyan')
+ feed_command('hi Group2 cterm=NONE')
+ feed_command('hi Group3 cterm=bold')
+ feed_command('redir! @a')
+ feed_command('hi NewGroup')
+ feed_command('hi Group2')
+ feed_command('hi Group3')
+ feed_command('hi clear NewGroup')
+ feed_command('hi NewGroup')
+ feed_command('hi Group2')
+ feed_command('hi Group2 NONE')
+ feed_command('hi Group2')
+ feed_command('hi clear')
+ feed_command('hi Group3')
+ feed('<cr>')
+ eq('Vim(highlight):E475: Invalid argument: cterm=\'asdf',
+ exc_exec([[hi Crash cterm='asdf]]))
+ feed_command('redir END')
-- Filter ctermfg and ctermbg, the numbers depend on the terminal
- execute('0put a')
- execute([[%s/ctermfg=\d*/ctermfg=2/]])
- execute([[%s/ctermbg=\d*/ctermbg=3/]])
-
- -- Filter out possibly translated error message
- execute('%s/E475: [^:]*:/E475:/')
+ feed_command('0put a')
+ feed_command([[%s/ctermfg=\d*/ctermfg=2/]])
+ feed_command([[%s/ctermbg=\d*/ctermbg=3/]])
-- Fix the fileformat
- execute('set ff&')
- execute('$d')
+ feed_command('set ff&')
+ feed_command('$d')
-- Assert buffer contents.
expect([[
-
-
+
+
NewGroup xxx cterm=italic
ctermfg=2
ctermbg=3
guifg=#00ff00
guibg=Cyan
-
+
Group2 xxx cleared
-
+
Group3 xxx cterm=bold
-
-
+
+
NewGroup xxx cleared
-
+
Group2 xxx cleared
-
-
+
+
Group2 xxx cleared
-
-
- Group3 xxx cleared
-
- E475: cterm='asdf]])
- screen:detach()
+
+
+ Group3 xxx cleared]])
end)
end)
diff --git a/test/functional/legacy/054_buffer_local_autocommands_spec.lua b/test/functional/legacy/054_buffer_local_autocommands_spec.lua
index 494ea8f927..c8b9dfa98f 100644
--- a/test/functional/legacy/054_buffer_local_autocommands_spec.lua
+++ b/test/functional/legacy/054_buffer_local_autocommands_spec.lua
@@ -1,33 +1,37 @@
-- Some tests for buffer-local autocommands
local helpers = require('test.functional.helpers')(after_each)
-local clear, execute, eq = helpers.clear, helpers.execute, helpers.eq
-local curbuf_contents = helpers.curbuf_contents
+
+local clear = helpers.clear
+local expect = helpers.expect
+local command = helpers.command
+
+local fname = 'Xtest-functional-legacy-054'
describe('BufLeave <buffer>', function()
setup(clear)
it('is working', function()
- execute('w! xx')
- execute('au BufLeave <buffer> norm Ibuffer-local autocommand')
- execute('au BufLeave <buffer> update')
-
+ command('write! ' .. fname)
+ command('autocmd BufLeave <buffer> normal! Ibuffer-local autocommand')
+ command('autocmd BufLeave <buffer> update')
+
-- Here, autocommand for xx shall append a line
- -- But autocommand shall not apply to buffer named <buffer>
- execute('e somefile')
+ -- But autocommand shall not apply to buffer named <buffer>
+ command('edit somefile')
-- Here, autocommand shall be auto-deleted
- execute('bwipe xx')
-
+ command('bwipeout ' .. fname)
+
-- Nothing shall be written
- execute('e xx')
- execute('e somefile')
- execute('e xx')
+ command('edit ' .. fname)
+ command('edit somefile')
+ command('edit ' .. fname)
- eq('buffer-local autocommand', curbuf_contents())
+ expect('buffer-local autocommand')
end)
teardown(function()
- os.remove('xx')
+ os.remove(fname)
end)
end)
diff --git a/test/functional/legacy/055_list_and_dict_types_spec.lua b/test/functional/legacy/055_list_and_dict_types_spec.lua
index dee138e6d8..dcbd8b7dff 100644
--- a/test/functional/legacy/055_list_and_dict_types_spec.lua
+++ b/test/functional/legacy/055_list_and_dict_types_spec.lua
@@ -2,7 +2,7 @@
local helpers = require('test.functional.helpers')(after_each)
local feed, source = helpers.feed, helpers.source
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
describe('list and dictionary types', function()
before_each(clear)
@@ -20,7 +20,7 @@ describe('list and dictionary types', function()
$put =v:exception[:14]
endtry]])
expect([[
-
+
[1, 'as''d', [1, 2, function('strlen')], {'a': 1}]
{'a': 1}
1
@@ -38,7 +38,7 @@ describe('list and dictionary types', function()
$put =string(l[0:8])
$put =string(l[8:-1])]])
expect([=[
-
+
[1, 'as''d', [1, 2, function('strlen')], {'a': 1}]
['as''d', [1, 2, function('strlen')], {'a': 1}]
[1, 'as''d', [1, 2, function('strlen')]]
@@ -84,7 +84,7 @@ describe('list and dictionary types', function()
call filter(d, 'v:key =~ ''[ac391]''')
$put =string(d)]])
expect([[
-
+
{'1': 'asd', 'b': [1, 2, function('strlen')], '-1': {'a': 1}}asd
['-1', '1', 'b']
['asd', [1, 2, function('strlen')], {'a': 1}]
@@ -112,29 +112,6 @@ describe('list and dictionary types', function()
expect('\n101101')
end)
- it('changing var type should fail', function()
- source([[
- lang C
- " The list from the first test repeated after splitting the tests.
- let l = [1, 'as''d', [1, 2, function("strlen")], {'a': 1},]
- " The dict from the first test repeated after splitting the tests.
- let d = {'c': 'ccc', '1': 99, '3': 33, '-1': {'a': 1}}
- try
- let d = []
- catch
- $put =v:exception[:14] . v:exception[-1:-1]
- endtry
- try
- let l = {}
- catch
- $put =v:exception[:14] . v:exception[-1:-1]
- endtry]])
- expect([[
-
- Vim(let):E706: d
- Vim(let):E706: l]])
- end)
-
it('removing items with :unlet', function()
source([[
lang C
@@ -157,7 +134,7 @@ describe('list and dictionary types', function()
unlet d[-1]
$put =string(d)]])
expect([[
-
+
[1, 'as''d', {'a': 1}]
[4]
{'1': 99, '3': 33}]])
@@ -165,42 +142,42 @@ describe('list and dictionary types', function()
it("removing items out of range: silently skip items that don't exist", function()
-- We can not use source() here as we want to ignore all errors.
- execute('lang C')
- execute('let l = [0, 1, 2, 3]')
- execute('unlet l[2:1]')
- execute('$put =string(l)')
- execute('let l = [0, 1, 2, 3]')
- execute('unlet l[2:2]')
- execute('$put =string(l)')
- execute('let l = [0, 1, 2, 3]')
- execute('unlet l[2:3]')
- execute('$put =string(l)')
- execute('let l = [0, 1, 2, 3]')
- execute('unlet l[2:4]')
- execute('$put =string(l)')
- execute('let l = [0, 1, 2, 3]')
- execute('unlet l[2:5]')
- execute('$put =string(l)')
- execute('let l = [0, 1, 2, 3]')
- execute('unlet l[-1:2]')
- execute('$put =string(l)')
- execute('let l = [0, 1, 2, 3]')
- execute('unlet l[-2:2]')
- execute('$put =string(l)')
- execute('let l = [0, 1, 2, 3]')
- execute('unlet l[-3:2]')
- execute('$put =string(l)')
- execute('let l = [0, 1, 2, 3]')
- execute('unlet l[-4:2]')
- execute('$put =string(l)')
- execute('let l = [0, 1, 2, 3]')
- execute('unlet l[-5:2]')
- execute('$put =string(l)')
- execute('let l = [0, 1, 2, 3]')
- execute('unlet l[-6:2]')
- execute('$put =string(l)')
+ feed_command('lang C')
+ feed_command('let l = [0, 1, 2, 3]')
+ feed_command('unlet l[2:1]')
+ feed_command('$put =string(l)')
+ feed_command('let l = [0, 1, 2, 3]')
+ feed_command('unlet l[2:2]')
+ feed_command('$put =string(l)')
+ feed_command('let l = [0, 1, 2, 3]')
+ feed_command('unlet l[2:3]')
+ feed_command('$put =string(l)')
+ feed_command('let l = [0, 1, 2, 3]')
+ feed_command('unlet l[2:4]')
+ feed_command('$put =string(l)')
+ feed_command('let l = [0, 1, 2, 3]')
+ feed_command('unlet l[2:5]')
+ feed_command('$put =string(l)')
+ feed_command('let l = [0, 1, 2, 3]')
+ feed_command('unlet l[-1:2]')
+ feed_command('$put =string(l)')
+ feed_command('let l = [0, 1, 2, 3]')
+ feed_command('unlet l[-2:2]')
+ feed_command('$put =string(l)')
+ feed_command('let l = [0, 1, 2, 3]')
+ feed_command('unlet l[-3:2]')
+ feed_command('$put =string(l)')
+ feed_command('let l = [0, 1, 2, 3]')
+ feed_command('unlet l[-4:2]')
+ feed_command('$put =string(l)')
+ feed_command('let l = [0, 1, 2, 3]')
+ feed_command('unlet l[-5:2]')
+ feed_command('$put =string(l)')
+ feed_command('let l = [0, 1, 2, 3]')
+ feed_command('unlet l[-6:2]')
+ feed_command('$put =string(l)')
expect([=[
-
+
[0, 1, 2, 3]
[0, 1, 3]
[0, 1]
@@ -214,6 +191,7 @@ describe('list and dictionary types', function()
[3]]=])
end)
+ -- luacheck: ignore 613 (Trailing whitespace in a string)
it('assignment to a list', function()
source([[
let l = [0, 1, 2, 3]
@@ -231,7 +209,7 @@ describe('list and dictionary types', function()
$put =v:exception[:14]
endtry]])
expect([[
-
+
2
3
Vim(let):E687:
@@ -280,7 +258,7 @@ describe('list and dictionary types', function()
" Must be almost empty now.
$put =string(d)]])
expect([[
-
+
3000 2900 2001 1600 1501
Vim(let):E716: 1500
NONE 2999
@@ -297,17 +275,13 @@ describe('list and dictionary types', function()
let dict.data = [1,2,3]
call dict.func("len: ")
let x = dict.func("again: ")
- try
- let Fn = dict.func
- call Fn('xxx')
- catch
- $put =v:exception[:15]
- endtry]])
+ let Fn = dict.func
+ call Fn('xxx')]])
expect([[
-
+
len: 3
again: 3
- Vim(call):E725: ]])
+ xxx3]])
end)
it('Function in script-local List or Dict', function()
@@ -351,7 +325,7 @@ describe('list and dictionary types', function()
let l3 = deepcopy(l2)
$put ='same list: ' . (l3[1] is l3[2])]])
expect([[
-
+
Vim(let):E698:
same list: 1]])
end)
@@ -421,7 +395,7 @@ describe('list and dictionary types', function()
endfor
endfor]=])
expect([[
-
+
depth is 0
0000-000
ppppppp
@@ -526,7 +500,7 @@ describe('list and dictionary types', function()
endfor
endfor]=])
expect([[
-
+
depth is 0
0000-000
ppppppp
@@ -674,7 +648,7 @@ describe('list and dictionary types', function()
$put =string(l)]])
expect([=[
-
+
Locks and commands or functions:
No :unlet after lock on dict:
Vim(unlet):E741:
@@ -703,7 +677,7 @@ describe('list and dictionary types', function()
end)
it('locked variables (part 2)', function()
- execute(
+ feed_command(
'let l = [1, 2, 3, 4]',
'lockvar! l',
'$put =string(l)',
@@ -718,7 +692,7 @@ describe('list and dictionary types', function()
'let l[1:2] = [0, 1]',
'$put =string(l)')
expect([=[
-
+
[1, 2, 3, 4]
[1, 2, 3, 4]
[1, 2, 3, 4]
@@ -735,7 +709,7 @@ describe('list and dictionary types', function()
$put ='exists g:footest#x:'.exists('g:footest#x')
$put ='g:footest#x: '.g:footest#x]])
expect([[
-
+
locked g:footest#x:-1
exists g:footest#x:0
g:footest#x: 1]])
@@ -776,9 +750,9 @@ describe('list and dictionary types', function()
$put ='caught ' . v:exception
endtry
endfunction]])
- execute('call Test(1, 2, [3, 4], {5: 6})')
+ feed_command('call Test(1, 2, [3, 4], {5: 6})')
expect([=[
-
+
caught a:000
caught a:000[0]
caught a:000[2]
@@ -806,7 +780,7 @@ describe('list and dictionary types', function()
$put =string(sort(copy(l), 'i'))
$put =string(sort(copy(l)))]=])
expect([=[
-
+
['-0', 'A11', 2, 'xaaa', 4, 'foo', 'foo6', 'foo', [0, 1, 2], 'x8', [0, 1, 2], 1.5]
[1.5, [0, 1, 2], 'x8', [0, 1, 2], 'foo', 'foo6', 'foo', 4, 'xaaa', 2, 2, 'A11', '-0']
[1.5, [0, 1, 2], 'x8', [0, 1, 2], 'foo', 'foo6', 'foo', 4, 'xaaa', 2, 2, 'A11', '-0']
@@ -832,7 +806,7 @@ describe('list and dictionary types', function()
$put =string(split('abc', '\zs'))
$put =string(split('abc', '\zs', 1))]])
expect([=[
-
+
['aa', 'bb']
['aa', 'bb']
['', 'aa', 'bb', '']
@@ -854,7 +828,7 @@ describe('list and dictionary types', function()
$put =(l != deepcopy(l))
$put =(d != deepcopy(d))]])
expect([[
-
+
1
1
0
@@ -872,7 +846,7 @@ describe('list and dictionary types', function()
$put =(l == lcopy)
$put =(dict4 == dict4copy)]])
expect([[
-
+
1
1]])
end)
@@ -883,7 +857,7 @@ describe('list and dictionary types', function()
call extend(l, l)
$put =string(l)]])
expect([=[
-
+
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]]=])
end)
@@ -893,7 +867,7 @@ describe('list and dictionary types', function()
call extend(d, d)
$put =string(d)]])
expect([[
-
+
{'a': {'b': 'B'}}]])
end)
@@ -908,7 +882,7 @@ describe('list and dictionary types', function()
endtry
$put =string(d)]])
expect([[
-
+
Vim(call):E737: a
{'a': {'b': 'B'}}]])
end)
@@ -919,29 +893,29 @@ describe('list and dictionary types', function()
let l[:] = [1, 2]
$put =string(l)]])
expect([=[
-
+
[1, 2]]=])
end)
it('vim patch 7.3.637', function()
- execute('let a = "No error caught"')
- execute('try')
- execute(' foldopen')
- execute('catch')
- execute(" let a = matchstr(v:exception,'^[^ ]*')")
- execute('endtry')
+ feed_command('let a = "No error caught"')
+ feed_command('try')
+ feed_command(' foldopen')
+ feed_command('catch')
+ feed_command(" let a = matchstr(v:exception,'^[^ ]*')")
+ feed_command('endtry')
feed('o<C-R>=a<CR><esc>')
- execute('lang C')
- execute('redir => a')
+ feed_command('lang C')
+ feed_command('redir => a')
-- The test failes if this is not in one line.
- execute("try|foobar|catch|let a = matchstr(v:exception,'^[^ ]*')|endtry")
- execute('redir END')
+ feed_command("try|foobar|catch|let a = matchstr(v:exception,'^[^ ]*')|endtry")
+ feed_command('redir END')
feed('o<C-R>=a<CR><esc>')
expect([[
-
+
Vim(foldopen):E490:
-
-
+
+
Error detected while processing :
E492: Not an editor command: foobar|catch|let a = matchstr(v:exception,'^[^ ]*')|endtry
]])
diff --git a/test/functional/legacy/057_sort_spec.lua b/test/functional/legacy/057_sort_spec.lua
index 6984ad0de2..bdc2c9779c 100644
--- a/test/functional/legacy/057_sort_spec.lua
+++ b/test/functional/legacy/057_sort_spec.lua
@@ -1,9 +1,10 @@
-- Tests for :sort command.
local helpers = require('test.functional.helpers')(after_each)
-local insert, execute, clear, expect, eq, eval, source = helpers.insert,
- helpers.execute, helpers.clear, helpers.expect, helpers.eq, helpers.eval,
- helpers.source
+
+local insert, command, clear, expect, eq, wait = helpers.insert,
+ helpers.command, helpers.clear, helpers.expect, helpers.eq, helpers.wait
+local exc_exec = helpers.exc_exec
describe(':sort', function()
local text = [[
@@ -26,9 +27,10 @@ describe(':sort', function()
it('alphabetical', function()
insert(text)
- execute('sort')
+ wait()
+ command('sort')
expect([[
-
+
123b
a
a122
@@ -65,12 +67,13 @@ describe(':sort', function()
b321
b321b
]])
- execute('sort n')
+ wait()
+ command('sort n')
expect([[
abc
ab
a
-
+
-24
x-22
0
@@ -89,9 +92,10 @@ describe(':sort', function()
it('hexadecimal', function()
insert(text)
- execute('sort x')
+ wait()
+ command('sort x')
expect([[
-
+
a
ab
abc
@@ -110,9 +114,10 @@ describe(':sort', function()
it('alphabetical, unique', function()
insert(text)
- execute('sort u')
+ wait()
+ command('sort u')
expect([[
-
+
123b
a
a122
@@ -130,7 +135,8 @@ describe(':sort', function()
it('alphabetical, reverse', function()
insert(text)
- execute('sort!')
+ wait()
+ command('sort!')
expect([[
c321d
c123d
@@ -151,7 +157,8 @@ describe(':sort', function()
it('numerical, reverse', function()
insert(text)
- execute('sort! n')
+ wait()
+ command('sort! n')
expect([[
b322b
b321b
@@ -164,7 +171,7 @@ describe(':sort', function()
b123
a123
a122
-
+
a
ab
abc]])
@@ -172,7 +179,8 @@ describe(':sort', function()
it('unique, reverse', function()
insert(text)
- execute('sort! u')
+ wait()
+ command('sort! u')
expect([[
c321d
c123d
@@ -192,12 +200,13 @@ describe(':sort', function()
it('octal', function()
insert(text)
- execute('sort o')
+ wait()
+ command('sort o')
expect([[
abc
ab
a
-
+
a122
a123
b123
@@ -213,7 +222,8 @@ describe(':sort', function()
it('reverse, hexadecimal', function()
insert(text)
- execute('sort! x')
+ wait()
+ command('sort! x')
expect([[
c321d
c123d
@@ -234,10 +244,11 @@ describe(':sort', function()
it('alphabetical, skip first character', function()
insert(text)
- execute('sort/./')
+ wait()
+ command('sort/./')
expect([[
a
-
+
a122
a123
b123
@@ -255,11 +266,12 @@ describe(':sort', function()
it('alphabetical, skip first 2 characters', function()
insert(text)
- execute('sort/../')
+ wait()
+ command('sort/../')
expect([[
ab
a
-
+
a321
b321
b321
@@ -276,11 +288,12 @@ describe(':sort', function()
it('alphabetical, unique, skip first 2 characters', function()
insert(text)
- execute('sort/../u')
+ wait()
+ command('sort/../u')
expect([[
ab
a
-
+
a321
b321
b321b
@@ -296,12 +309,13 @@ describe(':sort', function()
it('numerical, skip first character', function()
insert(text)
- execute('sort/./n')
+ wait()
+ command('sort/./n')
expect([[
abc
ab
a
-
+
a122
a123
b123
@@ -317,9 +331,10 @@ describe(':sort', function()
it('alphabetical, sort on first character', function()
insert(text)
- execute('sort/./r')
+ wait()
+ command('sort/./r')
expect([[
-
+
123b
abc
ab
@@ -338,10 +353,11 @@ describe(':sort', function()
it('alphabetical, sort on first 2 characters', function()
insert(text)
- execute('sort/../r')
+ wait()
+ command('sort/../r')
expect([[
a
-
+
123b
a123
a122
@@ -359,7 +375,8 @@ describe(':sort', function()
it('numerical, sort on first character', function()
insert(text)
- execute('sort/./rn')
+ wait()
+ command('sort/./rn')
expect([[
abc
ab
@@ -380,12 +397,13 @@ describe(':sort', function()
it('alphabetical, skip past first digit', function()
insert(text)
- execute([[sort/\d/]])
+ wait()
+ command([[sort/\d/]])
expect([[
abc
ab
a
-
+
a321
b321
b321
@@ -401,12 +419,13 @@ describe(':sort', function()
it('alphabetical, sort on first digit', function()
insert(text)
- execute([[sort/\d/r]])
+ wait()
+ command([[sort/\d/r]])
expect([[
abc
ab
a
-
+
a123
a122
b123
@@ -422,12 +441,13 @@ describe(':sort', function()
it('numerical, skip past first digit', function()
insert(text)
- execute([[sort/\d/n]])
+ wait()
+ command([[sort/\d/n]])
expect([[
abc
ab
a
-
+
a321
b321
c321d
@@ -443,12 +463,13 @@ describe(':sort', function()
it('numerical, sort on first digit', function()
insert(text)
- execute([[sort/\d/rn]])
+ wait()
+ command([[sort/\d/rn]])
expect([[
abc
ab
a
-
+
a123
a122
b123
@@ -464,12 +485,13 @@ describe(':sort', function()
it('alphabetical, skip past first 2 digits', function()
insert(text)
- execute([[sort/\d\d/]])
+ wait()
+ command([[sort/\d\d/]])
expect([[
abc
ab
a
-
+
a321
b321
b321
@@ -485,12 +507,13 @@ describe(':sort', function()
it('numerical, skip past first 2 digits', function()
insert(text)
- execute([[sort/\d\d/n]])
+ wait()
+ command([[sort/\d\d/n]])
expect([[
abc
ab
a
-
+
a321
b321
c321d
@@ -506,12 +529,13 @@ describe(':sort', function()
it('hexadecimal, skip past first 2 digits', function()
insert(text)
- execute([[sort/\d\d/x]])
+ wait()
+ command([[sort/\d\d/x]])
expect([[
abc
ab
a
-
+
a321
b321
b321
@@ -527,12 +551,13 @@ describe(':sort', function()
it('alpha, on first 2 digits', function()
insert(text)
- execute([[sort/\d\d/r]])
+ wait()
+ command([[sort/\d\d/r]])
expect([[
abc
ab
a
-
+
a123
a122
b123
@@ -548,12 +573,13 @@ describe(':sort', function()
it('numeric, on first 2 digits', function()
insert(text)
- execute([[sort/\d\d/rn]])
+ wait()
+ command([[sort/\d\d/rn]])
expect([[
abc
ab
a
-
+
a123
a122
b123
@@ -569,12 +595,13 @@ describe(':sort', function()
it('hexadecimal, on first 2 digits', function()
insert(text)
- execute([[sort/\d\d/rx]])
+ wait()
+ command([[sort/\d\d/rx]])
expect([[
abc
ab
a
-
+
a123
a122
b123
@@ -591,13 +618,7 @@ describe(':sort', function()
it('fails with wrong arguments', function()
insert(text)
-- This should fail with "E474: Invalid argument".
- source([[
- try
- sort no
- catch
- let tmpvar = v:exception
- endtry]])
- eq('Vim(sort):E474: Invalid argument', eval('tmpvar'))
+ eq('Vim(sort):E474: Invalid argument', exc_exec('sort no'))
expect(text)
end)
@@ -617,7 +638,8 @@ describe(':sort', function()
0b100010
0b100100
0b100010]])
- execute([[sort b]])
+ wait()
+ command([[sort b]])
expect([[
0b000000
0b001000
@@ -651,7 +673,8 @@ describe(':sort', function()
0b101010
0b000000
b0b111000]])
- execute([[sort b]])
+ wait()
+ command([[sort b]])
expect([[
0b000000
a0b001000
@@ -677,7 +700,8 @@ describe(':sort', function()
1.15e-6
-1.1e3
-1.01e3]])
- execute([[sort f]])
+ wait()
+ command([[sort f]])
expect([[
-1.1e3
-1.01e3
diff --git a/test/functional/legacy/059_utf8_spell_checking_spec.lua b/test/functional/legacy/059_utf8_spell_checking_spec.lua
index c44ab44b3c..8630ac58ef 100644
--- a/test/functional/legacy/059_utf8_spell_checking_spec.lua
+++ b/test/functional/legacy/059_utf8_spell_checking_spec.lua
@@ -2,7 +2,7 @@
local helpers = require('test.functional.helpers')(after_each)
local feed, insert, source = helpers.feed, helpers.insert, helpers.source
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
local write_file, call = helpers.write_file, helpers.call
local function write_latin1(name, text)
@@ -13,44 +13,44 @@ end
describe("spell checking with 'encoding' set to utf-8", function()
setup(function()
clear()
- execute("syntax off")
+ feed_command("syntax off")
write_latin1('Xtest1.aff',[[
SET ISO8859-1
TRY esianrtolcdugmphbyfvkwjkqxz-รซรฉรจรชรฏรฎรคร รขรถรผรป'ESIANRTOLCDUGMPHBYFVKWJKQXZ
-
+
FOL ร รกรขรฃรครฅรฆรงรจรฉรชรซรฌรญรฎรฏรฐรฑรฒรณรดรตรถรธรนรบรปรผรฝรพรŸรฟ
LOW ร รกรขรฃรครฅรฆรงรจรฉรชรซรฌรญรฎรฏรฐรฑรฒรณรดรตรถรธรนรบรปรผรฝรพรŸรฟ
UPP ร€รร‚รƒร„ร…ร†ร‡รˆร‰รŠร‹รŒรรŽรรร‘ร’ร“ร”ร•ร–ร˜ร™รšร›รœรรžรŸรฟ
-
+
SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZร รกรขรฃรครฅรฆรงรจรฉรชรซรฌรญรฎรฏรฐรฑรฒรณรดรตรถรธรนรบรปรผรฝรพรŸรฟร€รร‚รƒร„ร…ร†ร‡รˆร‰รŠร‹รŒรรŽรรร‘ร’ร“ร”ร•ร–ร˜ร™รšร›รœรรžยฟ
SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?
-
+
MIDWORD '-
-
+
KEP =
RAR ?
BAD !
-
+
PFX I N 1
PFX I 0 in .
-
+
PFX O Y 1
PFX O 0 out .
-
+
SFX S Y 2
SFX S 0 s [^s]
SFX S 0 es s
-
+
SFX N N 3
SFX N 0 en [^n]
SFX N 0 nen n
SFX N 0 n .
-
+
REP 3
REP g ch
REP ch g
REP svp s.v.p.
-
+
MAP 9
MAP aร รกรขรฃรครฅ
MAP eรจรฉรชรซ
@@ -77,39 +77,39 @@ describe("spell checking with 'encoding' set to utf-8", function()
]])
write_latin1('Xtest2.aff', [[
SET ISO8859-1
-
+
FOL ร รกรขรฃรครฅรฆรงรจรฉรชรซรฌรญรฎรฏรฐรฑรฒรณรดรตรถรธรนรบรปรผรฝรพรŸรฟ
LOW ร รกรขรฃรครฅรฆรงรจรฉรชรซรฌรญรฎรฏรฐรฑรฒรณรดรตรถรธรนรบรปรผรฝรพรŸรฟ
UPP ร€รร‚รƒร„ร…ร†ร‡รˆร‰รŠร‹รŒรรŽรรร‘ร’ร“ร”ร•ร–ร˜ร™รšร›รœรรžรŸรฟ
-
+
PFXPOSTPONE
-
+
MIDWORD '-
-
+
KEP =
RAR ?
BAD !
-
+
PFX I N 1
PFX I 0 in .
-
+
PFX O Y 1
PFX O 0 out [a-z]
-
+
SFX S Y 2
SFX S 0 s [^s]
SFX S 0 es s
-
+
SFX N N 3
SFX N 0 en [^n]
SFX N 0 nen n
SFX N 0 n .
-
+
REP 3
REP g ch
REP ch g
REP svp s.v.p.
-
+
MAP 9
MAP aร รกรขรฃรครฅ
MAP eรจรฉรชรซ
@@ -123,7 +123,7 @@ describe("spell checking with 'encoding' set to utf-8", function()
]])
write_latin1('Xtest3.aff', [[
SET ISO8859-1
-
+
COMPOUNDMIN 3
COMPOUNDRULE m*
NEEDCOMPOUND x
@@ -137,21 +137,21 @@ describe("spell checking with 'encoding' set to utf-8", function()
]])
write_latin1('Xtest4.aff', [[
SET ISO8859-1
-
+
FOL ร รกรขรฃรครฅรฆรงรจรฉรชรซรฌรญรฎรฏรฐรฑรฒรณรดรตรถรธรนรบรปรผรฝรพรŸรฟ
LOW ร รกรขรฃรครฅรฆรงรจรฉรชรซรฌรญรฎรฏรฐรฑรฒรณรดรตรถรธรนรบรปรผรฝรพรŸรฟ
UPP ร€รร‚รƒร„ร…ร†ร‡รˆร‰รŠร‹รŒรรŽรรร‘ร’ร“ร”ร•ร–ร˜ร™รšร›รœรรžรŸรฟ
-
+
COMPOUNDRULE m+
COMPOUNDRULE sm*e
COMPOUNDRULE sm+
COMPOUNDMIN 3
COMPOUNDWORDMAX 3
COMPOUNDFORBIDFLAG t
-
+
COMPOUNDSYLMAX 5
SYLLABLE aรกeรฉiรญoรณรถรตuรบรผรปy/aa/au/ea/ee/ei/ie/oa/oe/oo/ou/uu/ui
-
+
MAP 9
MAP aร รกรขรฃรครฅ
MAP eรจรฉรชรซ
@@ -162,23 +162,23 @@ describe("spell checking with 'encoding' set to utf-8", function()
MAP cรง
MAP yรฟรฝ
MAP sรŸ
-
+
NEEDAFFIX x
-
+
PFXPOSTPONE
-
+
MIDWORD '-
-
+
SFX q N 1
SFX q 0 -ok .
-
+
SFX a Y 2
SFX a 0 s .
SFX a 0 ize/t .
-
+
PFX p N 1
PFX p 0 pre .
-
+
PFX P N 1
PFX P 0 nou .
]])
@@ -194,28 +194,28 @@ describe("spell checking with 'encoding' set to utf-8", function()
]])
write_latin1('Xtest5.aff', [[
SET ISO8859-1
-
+
FLAG long
-
+
NEEDAFFIX !!
-
+
COMPOUNDRULE ssmm*ee
-
+
NEEDCOMPOUND xx
COMPOUNDPERMITFLAG pp
-
+
SFX 13 Y 1
SFX 13 0 bork .
-
+
SFX a1 Y 1
SFX a1 0 a1 .
-
+
SFX aรฉ Y 1
SFX aรฉ 0 aรฉ .
-
+
PFX zz Y 1
PFX zz 0 pre/pp .
-
+
PFX yy Y 1
PFX yy 0 nou .
]])
@@ -229,26 +229,26 @@ describe("spell checking with 'encoding' set to utf-8", function()
]])
write_latin1('Xtest6.aff', [[
SET ISO8859-1
-
+
FLAG caplong
-
+
NEEDAFFIX A!
-
+
COMPOUNDRULE sMm*Ee
-
+
NEEDCOMPOUND Xx
-
+
COMPOUNDPERMITFLAG p
-
+
SFX N3 Y 1
SFX N3 0 bork .
-
+
SFX A1 Y 1
SFX A1 0 a1 .
-
+
SFX Aรฉ Y 1
SFX Aรฉ 0 aรฉ .
-
+
PFX Zz Y 1
PFX Zz 0 pre/p .
]])
@@ -262,29 +262,29 @@ describe("spell checking with 'encoding' set to utf-8", function()
]])
write_latin1('Xtest7.aff', [[
SET ISO8859-1
-
+
FOL ร รกรขรฃรครฅรฆรงรจรฉรชรซรฌรญรฎรฏรฐรฑรฒรณรดรตรถรธรนรบรปรผรฝรพรŸรฟ
LOW ร รกรขรฃรครฅรฆรงรจรฉรชรซรฌรญรฎรฏรฐรฑรฒรณรดรตรถรธรนรบรปรผรฝรพรŸรฟ
UPP ร€รร‚รƒร„ร…ร†ร‡รˆร‰รŠร‹รŒรรŽรรร‘ร’ร“ร”ร•ร–ร˜ร™รšร›รœรรžรŸรฟ
-
+
FLAG num
-
+
NEEDAFFIX 9999
-
+
COMPOUNDRULE 2,77*123
-
+
NEEDCOMPOUND 1
COMPOUNDPERMITFLAG 432
-
+
SFX 61003 Y 1
SFX 61003 0 meat .
-
+
SFX 391 Y 1
SFX 391 0 a1 .
-
+
SFX 111 Y 1
SFX 111 0 aรฉ .
-
+
PFX 17 Y 1
PFX 17 0 pre/432 .
]])
@@ -298,7 +298,7 @@ describe("spell checking with 'encoding' set to utf-8", function()
]])
write_latin1('Xtest8.aff', [[
SET ISO8859-1
-
+
NOSPLITSUGS
]])
write_latin1('Xtest8.dic', [[
@@ -317,37 +317,37 @@ describe("spell checking with 'encoding' set to utf-8", function()
write_latin1('Xtest-sal.aff', [[
SET ISO8859-1
TRY esianrtolcdugmphbyfvkwjkqxz-รซรฉรจรชรฏรฎรคร รขรถรผรป'ESIANRTOLCDUGMPHBYFVKWJKQXZ
-
+
FOL ร รกรขรฃรครฅรฆรงรจรฉรชรซรฌรญรฎรฏรฐรฑรฒรณรดรตรถรธรนรบรปรผรฝรพรŸรฟ
LOW ร รกรขรฃรครฅรฆรงรจรฉรชรซรฌรญรฎรฏรฐรฑรฒรณรดรตรถรธรนรบรปรผรฝรพรŸรฟ
UPP ร€รร‚รƒร„ร…ร†ร‡รˆร‰รŠร‹รŒรรŽรรร‘ร’ร“ร”ร•ร–ร˜ร™รšร›รœรรžรŸรฟ
-
+
MIDWORD '-
-
+
KEP =
RAR ?
BAD !
-
+
PFX I N 1
PFX I 0 in .
-
+
PFX O Y 1
PFX O 0 out .
-
+
SFX S Y 2
SFX S 0 s [^s]
SFX S 0 es s
-
+
SFX N N 3
SFX N 0 en [^n]
SFX N 0 nen n
SFX N 0 n .
-
+
REP 3
REP g ch
REP ch g
REP svp s.v.p.
-
+
MAP 9
MAP aร รกรขรฃรครฅ
MAP eรจรฉรชรซ
@@ -358,7 +358,7 @@ describe("spell checking with 'encoding' set to utf-8", function()
MAP cรง
MAP yรฟรฝ
MAP sรŸ
-
+
SAL AH(AEIOUY)-^ *H
SAL AR(AEIOUY)-^ *R
SAL A(HR)^ *
@@ -505,8 +505,13 @@ describe("spell checking with 'encoding' set to utf-8", function()
-- Vim function in the original legacy test.
local function test_one(aff, dic)
-- Generate a .spl file from a .dic and .aff file.
- os.execute('cp -f Xtest'..aff..'.aff Xtest.aff')
- os.execute('cp -f Xtest'..dic..'.dic Xtest.dic')
+ if helpers.iswin() then
+ os.execute('copy /y Xtest'..aff..'.aff Xtest.aff')
+ os.execute('copy /y Xtest'..dic..'.dic Xtest.dic')
+ else
+ os.execute('cp -f Xtest'..aff..'.aff Xtest.aff')
+ os.execute('cp -f Xtest'..dic..'.dic Xtest.dic')
+ end
source([[
set spellfile=
function! SpellDumpNoShow()
@@ -548,60 +553,64 @@ describe("spell checking with 'encoding' set to utf-8", function()
1good: wrong OK puts. Test the end
bad: inputs comment ok Ok. test dรฉรดl end the
badend
-
+
test2:
elequint test elekwint test elekwent asdf
]])
test_one(1, 1)
- execute([[$put =soundfold('goobledygoook')]])
- execute([[$put =soundfold('kรณopรซrรฟnรดven')]])
- execute([[$put =soundfold('oeverloos gezwets edale')]])
+ feed_command([[$put =soundfold('goobledygoook')]])
+ feed_command([[$put =soundfold('kรณopรซrรฟnรดven')]])
+ feed_command([[$put =soundfold('oeverloos gezwets edale')]])
-- And now with SAL instead of SOFO items; test automatic reloading.
- os.execute('cp -f Xtest-sal.aff Xtest.aff')
- execute('mkspell! Xtest Xtest')
- execute([[$put =soundfold('goobledygoook')]])
- execute([[$put =soundfold('kรณopรซrรฟnรดven')]])
- execute([[$put =soundfold('oeverloos gezwets edale')]])
+ if helpers.iswin() then
+ os.execute('copy /y Xtest-sal.aff Xtest.aff')
+ else
+ os.execute('cp -f Xtest-sal.aff Xtest.aff')
+ end
+ feed_command('mkspell! Xtest Xtest')
+ feed_command([[$put =soundfold('goobledygoook')]])
+ feed_command([[$put =soundfold('kรณopรซrรฟnรดven')]])
+ feed_command([[$put =soundfold('oeverloos gezwets edale')]])
-- Also use an addition file.
- execute('mkspell! Xtest.utf-8.add.spl Xtest.utf-8.add')
- execute('set spellfile=Xtest.utf-8.add')
- execute('/^test2:')
+ feed_command('mkspell! Xtest.utf-8.add.spl Xtest.utf-8.add')
+ feed_command('set spellfile=Xtest.utf-8.add')
+ feed_command('/^test2:')
feed(']s')
- execute('let [str, a] = spellbadword()')
- execute('$put =str')
- execute('set spl=Xtest_us.utf-8.spl')
- execute('/^test2:')
+ feed_command('let [str, a] = spellbadword()')
+ feed_command('$put =str')
+ feed_command('set spl=Xtest_us.utf-8.spl')
+ feed_command('/^test2:')
feed(']smm')
- execute('let [str, a] = spellbadword()')
- execute('$put =str')
+ feed_command('let [str, a] = spellbadword()')
+ feed_command('$put =str')
feed('`m]s')
- execute('let [str, a] = spellbadword()')
- execute('$put =str')
- execute('set spl=Xtest_gb.utf-8.spl')
- execute('/^test2:')
+ feed_command('let [str, a] = spellbadword()')
+ feed_command('$put =str')
+ feed_command('set spl=Xtest_gb.utf-8.spl')
+ feed_command('/^test2:')
feed(']smm')
- execute('let [str, a] = spellbadword()')
- execute('$put =str')
+ feed_command('let [str, a] = spellbadword()')
+ feed_command('$put =str')
feed('`m]s')
- execute('let [str, a] = spellbadword()')
- execute('$put =str')
- execute('set spl=Xtest_nz.utf-8.spl')
- execute('/^test2:')
+ feed_command('let [str, a] = spellbadword()')
+ feed_command('$put =str')
+ feed_command('set spl=Xtest_nz.utf-8.spl')
+ feed_command('/^test2:')
feed(']smm')
- execute('let [str, a] = spellbadword()')
- execute('$put =str')
+ feed_command('let [str, a] = spellbadword()')
+ feed_command('$put =str')
feed('`m]s')
- execute('let [str, a] = spellbadword()')
- execute('$put =str')
- execute('set spl=Xtest_ca.utf-8.spl')
- execute('/^test2:')
+ feed_command('let [str, a] = spellbadword()')
+ feed_command('$put =str')
+ feed_command('set spl=Xtest_ca.utf-8.spl')
+ feed_command('/^test2:')
feed(']smm')
- execute('let [str, a] = spellbadword()')
- execute('$put =str')
+ feed_command('let [str, a] = spellbadword()')
+ feed_command('$put =str')
feed('`m]s')
- execute('let [str, a] = spellbadword()')
- execute('$put =str')
- execute('1,/^test 1-1/-1d')
+ feed_command('let [str, a] = spellbadword()')
+ feed_command('$put =str')
+ feed_command('1,/^test 1-1/-1d')
expect([[
test 1-1
# file: Xtest.utf-8.spl
@@ -665,7 +674,7 @@ describe("spell checking with 'encoding' set to utf-8", function()
]])
-- Postponed prefixes.
test_one(2, 1)
- execute('1,/^test 2-1/-1d')
+ feed_command('1,/^test 2-1/-1d')
expect([=[
test 2-1
# file: Xtest.utf-8.spl
@@ -709,13 +718,13 @@ describe("spell checking with 'encoding' set to utf-8", function()
it('part 3-3', function()
insert([[
Test rules for compounding.
-
+
3good: foo mรฏ foobar foofoobar barfoo barbarfoo
bad: bar la foomรฏ barmรฏ mรฏfoo mรฏbar mรฏmรฏ lala mรฏla lamรฏ foola labar
badend
]])
test_one(3, 3)
- execute('1,/^test 3-3/-1d')
+ feed_command('1,/^test 3-3/-1d')
expect([=[
test 3-3
# file: Xtest.utf-8.spl
@@ -753,7 +762,7 @@ describe("spell checking with 'encoding' set to utf-8", function()
it('part 4-4', function()
insert([[
Tests for compounding.
-
+
4good: word util bork prebork start end wordutil wordutils pro-ok
bork borkbork borkborkbork borkborkborkbork borkborkborkborkbork
tomato tomatotomato startend startword startwordword startwordend
@@ -768,7 +777,7 @@ describe("spell checking with 'encoding' set to utf-8", function()
badend
]])
test_one(4, 4)
- execute('1,/^test 4-4/-1d')
+ feed_command('1,/^test 4-4/-1d')
expect([=[
test 4-4
# file: Xtest.utf-8.spl
@@ -821,7 +830,7 @@ describe("spell checking with 'encoding' set to utf-8", function()
it('part 5-5', function()
insert([[
Test affix flags with two characters
-
+
5good: fooa1 fooaรฉ bar prebar barbork prebarbork startprebar
start end startend startmiddleend nouend
bad: foo fooa2 prabar probarbirk middle startmiddle middleend endstart
@@ -829,7 +838,7 @@ describe("spell checking with 'encoding' set to utf-8", function()
badend
]])
test_one(5, 5)
- execute('1,/^test 5-5/-1d')
+ feed_command('1,/^test 5-5/-1d')
expect([=[
test 5-5
# file: Xtest.utf-8.spl
@@ -876,7 +885,7 @@ describe("spell checking with 'encoding' set to utf-8", function()
badend
]])
test_one(6, 6)
- execute('1,/^test 6-6/-1d')
+ feed_command('1,/^test 6-6/-1d')
expect([=[
test 6-6
# file: Xtest.utf-8.spl
@@ -922,7 +931,7 @@ describe("spell checking with 'encoding' set to utf-8", function()
-- Compound words.
test_one(7, 7)
-- Assert buffer contents.
- execute('1,/^test 7-7/-1d')
+ feed_command('1,/^test 7-7/-1d')
expect([=[
test 7-7
# file: Xtest.utf-8.spl
@@ -966,7 +975,7 @@ describe("spell checking with 'encoding' set to utf-8", function()
-- NOSPLITSUGS
test_one(8, 8)
-- Assert buffer contents.
- execute('1,/^test 8-8/-1d')
+ feed_command('1,/^test 8-8/-1d')
expect([=[
test 8-8
# file: Xtest.utf-8.spl
@@ -990,7 +999,7 @@ describe("spell checking with 'encoding' set to utf-8", function()
-- NOSPLITSUGS
test_one(9, 9)
-- Assert buffer contents.
- execute('1,/^test 9-9/-1d')
+ feed_command('1,/^test 9-9/-1d')
expect([=[
test 9-9
# file: Xtest.utf-8.spl
diff --git a/test/functional/legacy/060_exists_and_has_functions_spec.lua b/test/functional/legacy/060_exists_and_has_functions_spec.lua
index cbd857c524..1794f23b3a 100644
--- a/test/functional/legacy/060_exists_and_has_functions_spec.lua
+++ b/test/functional/legacy/060_exists_and_has_functions_spec.lua
@@ -12,7 +12,7 @@ describe('exists() and has() functions', function()
write_file('test60.vim', [[
" Vim script for exists() function test
" Script-local variables are checked here
-
+
" Existing script-local variable
let s:script_var = 1
echo 's:script_var: 1'
@@ -21,7 +21,7 @@ describe('exists() and has() functions', function()
else
echo "FAILED"
endif
-
+
" Non-existing script-local variable
unlet s:script_var
echo 's:script_var: 0'
@@ -30,7 +30,7 @@ describe('exists() and has() functions', function()
else
echo "FAILED"
endif
-
+
" Existing script-local list
let s:script_list = ["blue", "orange"]
echo 's:script_list: 1'
@@ -39,7 +39,7 @@ describe('exists() and has() functions', function()
else
echo "FAILED"
endif
-
+
" Non-existing script-local list
unlet s:script_list
echo 's:script_list: 0'
@@ -48,7 +48,7 @@ describe('exists() and has() functions', function()
else
echo "FAILED"
endif
-
+
" Existing script-local dictionary
let s:script_dict = {"xcord":100, "ycord":2}
echo 's:script_dict: 1'
@@ -57,7 +57,7 @@ describe('exists() and has() functions', function()
else
echo "FAILED"
endif
-
+
" Non-existing script-local dictionary
unlet s:script_dict
echo 's:script_dict: 0'
@@ -66,7 +66,7 @@ describe('exists() and has() functions', function()
else
echo "FAILED"
endif
-
+
" Existing script curly-brace variable
let str = "script"
let s:curly_{str}_var = 1
@@ -76,7 +76,7 @@ describe('exists() and has() functions', function()
else
echo "FAILED"
endif
-
+
" Non-existing script-local curly-brace variable
unlet s:curly_{str}_var
echo 's:curly_' . str . '_var: 0'
@@ -85,21 +85,21 @@ describe('exists() and has() functions', function()
else
echo "FAILED"
endif
-
+
" Existing script-local function
function! s:my_script_func()
endfunction
-
+
echo '*s:my_script_func: 1'
if exists('*s:my_script_func')
echo "OK"
else
echo "FAILED"
endif
-
+
" Non-existing script-local function
delfunction s:my_script_func
-
+
echo '*s:my_script_func: 0'
if !exists('*s:my_script_func')
echo "OK"
@@ -638,22 +638,13 @@ describe('exists() and has() functions', function()
call TestExists()
- function TestHas()
- redir >> test.out
- for pl in ['6.9.999', '7.1.999', '7.4.123', '9.1.0', '9.9.1']
- echo 'has patch ' . pl . ': ' . has('patch-' . pl)
- endfor
- redir END
- endfunc
- call TestHas()
-
edit! test.out
set ff=unix
]=])
-- Assert buffer contents.
expect([[
-
+
#myagroup: 1
OK
#myagroup+b: 0
@@ -858,12 +849,7 @@ describe('exists() and has() functions', function()
OK
g:footest#x = 1
footest#F() 0
- UndefFun() 0
- has patch 6.9.999: 1
- has patch 7.1.999: 1
- has patch 7.4.123: 1
- has patch 9.1.0: 0
- has patch 9.9.1: 0]])
+ UndefFun() 0]])
end)
end)
diff --git a/test/functional/legacy/061_undo_tree_spec.lua b/test/functional/legacy/061_undo_tree_spec.lua
index 9bf69ccba1..1a8ef067d0 100644
--- a/test/functional/legacy/061_undo_tree_spec.lua
+++ b/test/functional/legacy/061_undo_tree_spec.lua
@@ -1,8 +1,8 @@
-- Tests for undo tree and :earlier and :later.
local helpers = require('test.functional.helpers')(after_each)
+local feed_command = helpers.feed_command
local write_file = helpers.write_file
-local execute = helpers.execute
local command = helpers.command
local source = helpers.source
local expect = helpers.expect
@@ -44,7 +44,7 @@ describe('undo tree:', function()
-- function to allow multiple attempts.
local function test_earlier_later()
clear()
- execute('e Xtest')
+ feed_command('e Xtest')
-- Assert that no undo history is present.
eq({}, eval('undotree().entries'))
-- Delete three characters and undo.
@@ -88,51 +88,43 @@ describe('undo tree:', function()
feed('Ab<esc>')
feed('Ac<esc>')
expect_line('123456abc')
- execute('earlier 1s')
+ feed_command('earlier 1s')
expect_line('123456')
- execute('earlier 3s')
+ feed_command('earlier 3s')
expect_line('123456789')
- execute('later 1s')
+ feed_command('later 1s')
expect_line('123456')
- execute('later 1h')
+ feed_command('later 1h')
expect_line('123456abc')
end
- -- Retry up to 3 times. pcall() is _not_ used for the final attempt, so
- -- that failure messages can bubble up.
- for _ = 1, 2 do
- local success = pcall(test_earlier_later)
- if success then
- return
- end
- end
- test_earlier_later()
+ helpers.retry(2, nil, test_earlier_later)
end)
it('file-write specifications', function()
feed('ione one one<esc>')
- execute('w Xtest')
+ feed_command('w Xtest')
feed('otwo<esc>')
feed('otwo<esc>')
- execute('w')
+ feed_command('w')
feed('othree<esc>')
- execute('earlier 1f')
+ feed_command('earlier 1f')
expect([[
one one one
two
two]])
- execute('earlier 1f')
+ feed_command('earlier 1f')
expect('one one one')
- execute('earlier 1f')
+ feed_command('earlier 1f')
expect_empty_buffer()
- execute('later 1f')
+ feed_command('later 1f')
expect('one one one')
- execute('later 1f')
+ feed_command('later 1f')
expect([[
one one one
two
two]])
- execute('later 1f')
+ feed_command('later 1f')
expect([[
one one one
two
@@ -201,20 +193,20 @@ describe('undo tree:', function()
feed('ob<esc>')
feed([[o1<esc>a2<C-R>=setline('.','1234')<cr><esc>]])
expect([[
-
+
a
b
12034]])
feed('uu')
expect([[
-
+
a
b
1]])
feed('oc<esc>')
feed([[o1<esc>a2<C-R>=setline('.','1234')<cr><esc>]])
expect([[
-
+
a
b
1
@@ -222,16 +214,16 @@ describe('undo tree:', function()
12034]])
feed('u')
expect([[
-
+
a
b
1
c
12]])
feed('od<esc>')
- execute('so! Xtest.source')
+ feed_command('so! Xtest.source')
expect([[
-
+
a
b
1
@@ -241,7 +233,7 @@ describe('undo tree:', function()
12123]])
feed('u')
expect([[
-
+
a
b
1
@@ -254,7 +246,7 @@ describe('undo tree:', function()
-- interactive use (even in Vim; see ":help :undojoin"):
feed(normal_commands)
expect([[
-
+
a
b
1
@@ -264,7 +256,7 @@ describe('undo tree:', function()
12123]])
feed('u')
expect([[
-
+
a
b
1
diff --git a/test/functional/legacy/062_tab_pages_spec.lua b/test/functional/legacy/062_tab_pages_spec.lua
index d5b10b160e..eae0a8d51a 100644
--- a/test/functional/legacy/062_tab_pages_spec.lua
+++ b/test/functional/legacy/062_tab_pages_spec.lua
@@ -1,17 +1,18 @@
-- Tests for tab pages
local helpers = require('test.functional.helpers')(after_each)
-local feed, insert, source, clear, execute, expect, eval, eq =
+local feed, insert, source, clear, command, expect, eval, eq =
helpers.feed, helpers.insert, helpers.source, helpers.clear,
- helpers.execute, helpers.expect, helpers.eval, helpers.eq
+ helpers.command, helpers.expect, helpers.eval, helpers.eq
+local exc_exec = helpers.exc_exec
describe('tab pages', function()
before_each(clear)
it('can be opened and closed', function()
- execute('tabnew')
+ command('tabnew')
eq(2, eval('tabpagenr()'))
- execute('quit')
+ command('quit')
eq(1, eval('tabpagenr()'))
end)
@@ -25,7 +26,7 @@ describe('tab pages', function()
tabrewind
]])
eq('this is tab page 1', eval("getline('$')"))
- execute('tablast')
+ command('tablast')
eq('this is tab page 4', eval("getline('$')"))
end)
@@ -44,7 +45,7 @@ describe('tab pages', function()
eq(100, eval('gettabvar(2, "val_num")'))
eq('SetTabVar test', eval('gettabvar(2, "val_str")'))
eq({'red', 'blue', 'green'}, eval('gettabvar(2, "val_list")'))
- execute('tabnext 2')
+ command('tabnext 2')
eq(100, eval('t:val_num'))
eq('SetTabVar test', eval('t:val_str'))
eq({'red', 'blue', 'green'}, eval('t:val_list'))
@@ -52,8 +53,8 @@ describe('tab pages', function()
it('work together with the drop feature and loaded buffers', function()
-- Test for ":tab drop exist-file" to keep current window.
- execute('sp test1')
- execute('tab drop test1')
+ command('sp test1')
+ command('tab drop test1')
eq(1, eval('tabpagenr("$")'))
eq(2, eval('winnr("$")'))
eq(1, eval('winnr()'))
@@ -61,8 +62,8 @@ describe('tab pages', function()
it('work together with the drop feature and new files', function()
-- Test for ":tab drop new-file" to keep current window of tabpage 1.
- execute('split')
- execute('tab drop newfile')
+ command('split')
+ command('tab drop newfile')
eq(2, eval('tabpagenr("$")'))
eq(2, eval('tabpagewinnr(1, "$")'))
eq(1, eval('tabpagewinnr(1)'))
@@ -71,57 +72,49 @@ describe('tab pages', function()
it('work together with the drop feature and multi loaded buffers', function()
-- Test for ":tab drop multi-opend-file" to keep current tabpage and
-- window.
- execute('new test1')
- execute('tabnew')
- execute('new test1')
- execute('tab drop test1')
+ command('new test1')
+ command('tabnew')
+ command('new test1')
+ command('tab drop test1')
eq(2, eval('tabpagenr()'))
eq(2, eval('tabpagewinnr(2, "$")'))
eq(1, eval('tabpagewinnr(2)'))
end)
it('can be navigated with :tabmove', function()
- execute('lang C')
- execute('for i in range(9) | tabnew | endfor')
+ command('lang C')
+ command('for i in range(9) | tabnew | endfor')
feed('1gt')
eq(1, eval('tabpagenr()'))
- execute('tabmove 5')
+ command('tabmove 5')
eq(5, eval('tabpagenr()'))
- execute('.tabmove')
+ command('.tabmove')
eq(5, eval('tabpagenr()'))
- execute('tabmove -')
+ command('tabmove -')
eq(4, eval('tabpagenr()'))
- execute('tabmove +')
+ command('tabmove +')
eq(5, eval('tabpagenr()'))
- execute('tabmove -2')
+ command('tabmove -2')
eq(3, eval('tabpagenr()'))
- execute('tabmove +4')
+ command('tabmove +4')
eq(7, eval('tabpagenr()'))
- execute('tabmove')
+ command('tabmove')
eq(10, eval('tabpagenr()'))
- execute('tabmove -20')
+ command('0tabmove')
eq(1, eval('tabpagenr()'))
- execute('tabmove +20')
+ command('$tabmove')
eq(10, eval('tabpagenr()'))
- execute('0tabmove')
+ command('tabmove 0')
eq(1, eval('tabpagenr()'))
- execute('$tabmove')
+ command('tabmove $')
eq(10, eval('tabpagenr()'))
- execute('tabmove 0')
- eq(1, eval('tabpagenr()'))
- execute('tabmove $')
- eq(10, eval('tabpagenr()'))
- execute('3tabmove')
+ command('3tabmove')
eq(4, eval('tabpagenr()'))
- execute('7tabmove 5')
+ command('7tabmove 5')
eq(5, eval('tabpagenr()'))
- execute('let a="No error caught."')
- execute('try')
- execute('tabmove foo')
- execute('catch E474')
- execute('let a="E474 caught."')
- execute('endtry')
- eq('E474 caught.', eval('a'))
+ command('let a="No error caught."')
+ eq('Vim(tabmove):E474: Invalid argument: tabmove foo',
+ exc_exec('tabmove foo'))
end)
it('can trigger certain autocommands', function()
@@ -172,7 +165,7 @@ describe('tab pages', function()
C tabnext 1
autocmd TabDestructive TabEnter * nested
\ :C tabnext 2 | C tabclose 3
- C tabnext 3
+ C tabnext 2
let g:r+=[tabpagenr().'/'.tabpagenr('$')]
endfunction
call Test()
@@ -233,22 +226,14 @@ describe('tab pages', function()
WinEnter
TabEnter
BufEnter
- === tabnext 3 ===
- BufLeave
- WinLeave
- TabLeave
- WinEnter
- TabEnter
=== tabnext 2 ===
- BufLeave
WinLeave
TabLeave
WinEnter
TabEnter
=== tabnext 2 ===
=== tabclose 3 ===
- BufEnter
- === tabclose 3 ===
2/2]])
+ eq(2, eval("tabpagenr('$')"))
end)
end)
diff --git a/test/functional/legacy/063_match_and_matchadd_spec.lua b/test/functional/legacy/063_match_and_matchadd_spec.lua
index 298e0a31ea..518d79861b 100644
--- a/test/functional/legacy/063_match_and_matchadd_spec.lua
+++ b/test/functional/legacy/063_match_and_matchadd_spec.lua
@@ -2,9 +2,11 @@
local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
-local feed, insert = helpers.feed, helpers.insert
-local eval, clear, execute = helpers.eval, helpers.clear, helpers.execute
+
+local eval, clear, command = helpers.eval, helpers.clear, helpers.command
local eq, neq = helpers.eq, helpers.neq
+local insert = helpers.insert
+local redir_exec = helpers.redir_exec
describe('063: Test for ":match", "matchadd()" and related functions', function()
setup(clear)
@@ -15,12 +17,12 @@ describe('063: Test for ":match", "matchadd()" and related functions', function(
-- Check that "matcharg()" returns the correct group and pattern if a match
-- is defined.
- execute("highlight MyGroup1 term=bold ctermbg=red guibg=red")
- execute("highlight MyGroup2 term=italic ctermbg=green guibg=green")
- execute("highlight MyGroup3 term=underline ctermbg=blue guibg=blue")
- execute("match MyGroup1 /TODO/")
- execute("2match MyGroup2 /FIXME/")
- execute("3match MyGroup3 /XXX/")
+ command("highlight MyGroup1 term=bold ctermbg=red guibg=red")
+ command("highlight MyGroup2 term=italic ctermbg=green guibg=green")
+ command("highlight MyGroup3 term=underline ctermbg=blue guibg=blue")
+ command("match MyGroup1 /TODO/")
+ command("2match MyGroup2 /FIXME/")
+ command("3match MyGroup3 /XXX/")
eq({'MyGroup1', 'TODO'}, eval('matcharg(1)'))
eq({'MyGroup2', 'FIXME'}, eval('matcharg(2)'))
eq({'MyGroup3', 'XXX'}, eval('matcharg(3)'))
@@ -31,18 +33,18 @@ describe('063: Test for ":match", "matchadd()" and related functions', function(
eq({}, eval('matcharg(4)'))
-- Check that "matcharg()" returns ['', ''] if a match is not defined.
- execute("match")
- execute("2match")
- execute("3match")
+ command("match")
+ command("2match")
+ command("3match")
eq({'', ''}, eval('matcharg(1)'))
eq({'', ''}, eval('matcharg(2)'))
eq({'', ''}, eval('matcharg(3)'))
-- Check that "matchadd()" and "getmatches()" agree on added matches and
-- that default values apply.
- execute("let m1 = matchadd('MyGroup1', 'TODO')")
- execute("let m2 = matchadd('MyGroup2', 'FIXME', 42)")
- execute("let m3 = matchadd('MyGroup3', 'XXX', 60, 17)")
+ command("let m1 = matchadd('MyGroup1', 'TODO')")
+ command("let m2 = matchadd('MyGroup2', 'FIXME', 42)")
+ command("let m3 = matchadd('MyGroup3', 'XXX', 60, 17)")
eq({{group = 'MyGroup1', pattern = 'TODO', priority = 10, id = 4},
{group = 'MyGroup2', pattern = 'FIXME', priority = 42, id = 5},
{group = 'MyGroup3', pattern = 'XXX', priority = 60, id = 17}},
@@ -50,58 +52,58 @@ describe('063: Test for ":match", "matchadd()" and related functions', function(
-- Check that "matchdelete()" deletes the matches defined in the previous
-- test correctly.
- execute("call matchdelete(m1)")
- execute("call matchdelete(m2)")
- execute("call matchdelete(m3)")
+ command("call matchdelete(m1)")
+ command("call matchdelete(m2)")
+ command("call matchdelete(m3)")
eq({}, eval('getmatches()'))
--- Check that "matchdelete()" returns 0 if successful and otherwise -1.
- execute("let m = matchadd('MyGroup1', 'TODO')")
+ command("let m = matchadd('MyGroup1', 'TODO')")
eq(0, eval('matchdelete(m)'))
-- matchdelete throws error and returns -1 on failure
neq(true, pcall(function() eval('matchdelete(42)') end))
- execute("let r2 = matchdelete(42)")
+ eq('\nE803: ID not found: 42',
+ redir_exec("let r2 = matchdelete(42)"))
eq(-1, eval('r2'))
-- Check that "clearmatches()" clears all matches defined by ":match" and
-- "matchadd()".
- execute("let m1 = matchadd('MyGroup1', 'TODO')")
- execute("let m2 = matchadd('MyGroup2', 'FIXME', 42)")
- execute("let m3 = matchadd('MyGroup3', 'XXX', 60, 17)")
- execute("match MyGroup1 /COFFEE/")
- execute("2match MyGroup2 /HUMPPA/")
- execute("3match MyGroup3 /VIM/")
- execute("call clearmatches()")
+ command("let m1 = matchadd('MyGroup1', 'TODO')")
+ command("let m2 = matchadd('MyGroup2', 'FIXME', 42)")
+ command("let m3 = matchadd('MyGroup3', 'XXX', 60, 17)")
+ command("match MyGroup1 /COFFEE/")
+ command("2match MyGroup2 /HUMPPA/")
+ command("3match MyGroup3 /VIM/")
+ command("call clearmatches()")
eq({}, eval('getmatches()'))
-- Check that "setmatches()" restores a list of matches saved by
-- "getmatches()" without changes. (Matches with equal priority must also
-- remain in the same order.)
- execute("let m1 = matchadd('MyGroup1', 'TODO')")
- execute("let m2 = matchadd('MyGroup2', 'FIXME', 42)")
- execute("let m3 = matchadd('MyGroup3', 'XXX', 60, 17)")
- execute("match MyGroup1 /COFFEE/")
- execute("2match MyGroup2 /HUMPPA/")
- execute("3match MyGroup3 /VIM/")
- execute("let ml = getmatches()")
+ command("let m1 = matchadd('MyGroup1', 'TODO')")
+ command("let m2 = matchadd('MyGroup2', 'FIXME', 42)")
+ command("let m3 = matchadd('MyGroup3', 'XXX', 60, 17)")
+ command("match MyGroup1 /COFFEE/")
+ command("2match MyGroup2 /HUMPPA/")
+ command("3match MyGroup3 /VIM/")
+ command("let ml = getmatches()")
local ml = eval("ml")
- execute("call clearmatches()")
- execute("call setmatches(ml)")
+ command("call clearmatches()")
+ command("call setmatches(ml)")
eq(ml, eval('getmatches()'))
-- Check that "setmatches()" can correctly restore the matches from matchaddpos()
- execute("call clearmatches()")
- execute("call setmatches(ml)")
+ command("call clearmatches()")
+ command("call setmatches(ml)")
eq(ml, eval('getmatches()'))
-- Check that "setmatches()" will not add two matches with the same ID. The
-- expected behaviour (for now) is to add the first match but not the
- -- second and to return 0 (even though it is a matter of debate whether
- -- this can be considered successful behaviour).
- execute("let r1 = setmatches([{'group': 'MyGroup1', 'pattern': 'TODO', 'priority': 10, 'id': 1}, {'group': 'MyGroup2', 'pattern': 'FIXME', 'priority': 10, 'id': 1}])")
- feed("<cr>")
- eq(0, eval("r1"))
+ -- second and to return -1.
+ eq('\nE801: ID already taken: 1',
+ redir_exec("let r1 = setmatches([{'group': 'MyGroup1', 'pattern': 'TODO', 'priority': 10, 'id': 1}, {'group': 'MyGroup2', 'pattern': 'FIXME', 'priority': 10, 'id': 1}])"))
+ eq(-1, eval("r1"))
eq({{group = 'MyGroup1', pattern = 'TODO', priority = 10, id = 1}}, eval('getmatches()'))
-- Check that "setmatches()" returns 0 if successful and otherwise -1.
@@ -109,18 +111,19 @@ describe('063: Test for ":match", "matchadd()" and related functions', function(
-- return values.)
eq(0,eval("setmatches([])"))
eq(0,eval("setmatches([{'group': 'MyGroup1', 'pattern': 'TODO', 'priority': 10, 'id': 1}])"))
- execute("call clearmatches()")
- execute("let rf1 = setmatches(0)")
+ command("call clearmatches()")
+ eq('\nE714: List required', redir_exec("let rf1 = setmatches(0)"))
eq(-1, eval('rf1'))
- execute("let rf2 = setmatches([0])")
+ eq('\nE474: List item 0 is either not a dictionary or an empty one',
+ redir_exec("let rf2 = setmatches([0])"))
eq(-1, eval('rf2'))
- execute("let rf3 = setmatches([{'wrong key': 'wrong value'}])")
- feed("<cr>")
+ eq('\nE474: List item 0 is missing one of the required keys',
+ redir_exec("let rf3 = setmatches([{'wrong key': 'wrong value'}])"))
eq(-1, eval('rf3'))
-- Check that "matchaddpos()" positions matches correctly
insert('abcdefghijklmnopq')
- execute("call matchaddpos('MyGroup1', [[1, 5], [1, 8, 3]], 10, 3)")
+ command("call matchaddpos('MyGroup1', [[1, 5], [1, 8, 3]], 10, 3)")
screen:expect([[
abcd{1:e}fg{1:hij}klmnop^q |
~ |
@@ -129,9 +132,9 @@ describe('063: Test for ":match", "matchadd()" and related functions', function(
|
]], {[1] = {background = Screen.colors.Red}}, {{bold = true, foreground = Screen.colors.Blue}})
- execute("call clearmatches()")
- execute("call setline(1, 'abcdฮฃabcdef')")
- execute("call matchaddpos('MyGroup1', [[1, 4, 2], [1, 9, 2]])")
+ command("call clearmatches()")
+ command("call setline(1, 'abcdฮฃabcdef')")
+ command("call matchaddpos('MyGroup1', [[1, 4, 2], [1, 9, 2]])")
screen:expect([[
abc{1:dฮฃ}ab{1:cd}e^f |
~ |
diff --git a/test/functional/legacy/065_float_and_logic_operators_spec.lua b/test/functional/legacy/065_float_and_logic_operators_spec.lua
index d12ea502f3..ad1b004085 100644
--- a/test/functional/legacy/065_float_and_logic_operators_spec.lua
+++ b/test/functional/legacy/065_float_and_logic_operators_spec.lua
@@ -2,7 +2,7 @@
local helpers = require('test.functional.helpers')(after_each)
local insert, source = helpers.insert, helpers.source
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, expect = helpers.clear, helpers.expect
describe('floating point and logical operators', function()
setup(clear)
@@ -44,14 +44,7 @@ describe('floating point and logical operators', function()
$put ='abs'
$put =printf('%d', abs(1456))
$put =printf('%d', abs(-4))
- ]])
-
- -- The test will throw an error if this line is included in a source()
- -- call. The vim expression throws a exception "E745: Using a List as a
- -- Number" which is fatal in a source() call but not in a execute() call.
- execute([[$put =printf('%d', abs([1, 2, 3]))]])
-
- source([[
+ silent! $put =printf('%d', abs([1, 2, 3]))
$put =printf('%g', abs(14.56))
$put =printf('%g', abs(-54.32))
$put ='ceil'
@@ -100,12 +93,9 @@ describe('floating point and logical operators', function()
$put =and(invert(127), 65535)
$put =and(invert(16), 65535)
$put =and(invert(128), 65535)
+ silent! $put =invert(1.0)
]])
- -- This line can not be included in a source() call. It throws a "E805:
- -- Using a Float as a Number". Also compare comment above.
- execute('$put =invert(1.0)')
-
-- Assert buffer contents.
expect([=[
Results of test65:
diff --git a/test/functional/legacy/066_visual_block_tab_spec.lua b/test/functional/legacy/066_visual_block_tab_spec.lua
index 72fa7d881b..f10152d8ea 100644
--- a/test/functional/legacy/066_visual_block_tab_spec.lua
+++ b/test/functional/legacy/066_visual_block_tab_spec.lua
@@ -3,7 +3,7 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, expect = helpers.execute, helpers.expect
+local feed_command, expect = helpers.feed_command, helpers.expect
describe('visual block shift and tab characters', function()
setup(clear)
@@ -15,7 +15,7 @@ describe('visual block shift and tab characters', function()
one two three
one two three
one two three
-
+
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
@@ -24,23 +24,23 @@ describe('visual block shift and tab characters', function()
feed('gg')
feed([[fe<C-v>4jR<esc>ugvr1:'<lt>,'>yank A<cr>]])
- execute('/^abcdefgh')
+ feed_command('/^abcdefgh')
feed('<C-v>4jI <esc>j<lt><lt>11|D')
feed('j7|a <esc>')
feed('j7|a <esc>')
feed('j7|a <esc>4k13|<C-v>4j<lt>')
- execute('$-5,$yank A')
- execute([[$-4,$s/\s\+//g]])
+ feed_command('$-5,$yank A')
+ feed_command([[$-4,$s/\s\+//g]])
feed('<C-v>4kI <esc>j<lt><lt>')
feed('j7|a <esc>')
feed('j7|a <esc>')
feed('j7|a <esc>4k13|<C-v>4j3<lt>')
- execute('$-4,$yank A')
+ feed_command('$-4,$yank A')
-- Put @a and clean empty lines
- execute('%d')
- execute('0put a')
- execute('$d')
+ feed_command('%d')
+ feed_command('0put a')
+ feed_command('$d')
-- Assert buffer contents.
expect([[
@@ -49,7 +49,7 @@ describe('visual block shift and tab characters', function()
on1 two three
on1 two three
on1 two three
-
+
abcdefghijklmnopqrstuvwxyz
abcdefghij
abc defghijklmnopqrstuvwxyz
diff --git a/test/functional/legacy/067_augroup_exists_spec.lua b/test/functional/legacy/067_augroup_exists_spec.lua
index 8f6b881ed8..4a77bf838a 100644
--- a/test/functional/legacy/067_augroup_exists_spec.lua
+++ b/test/functional/legacy/067_augroup_exists_spec.lua
@@ -3,32 +3,34 @@
local helpers = require('test.functional.helpers')(after_each)
local clear = helpers.clear
-local execute, expect = helpers.execute, helpers.expect
+local command, expect = helpers.command, helpers.expect
describe('augroup when calling exists()', function()
setup(clear)
it('is working', function()
- execute('let results=[]')
- execute('call add(results, "##BufEnter: " . exists("##BufEnter"))')
- execute('call add(results, "#BufEnter: " . exists("#BufEnter"))')
- execute('au BufEnter * let g:entered=1')
- execute('call add(results, "#BufEnter: " . exists("#BufEnter"))')
- execute('call add(results, "#auexists#BufEnter: " . exists("#auexists#BufEnter"))')
- execute('augroup auexists', 'au BufEnter * let g:entered=1', 'augroup END')
- execute('call add(results, "#auexists#BufEnter: " . exists("#auexists#BufEnter"))')
- execute('call add(results, "#BufEnter#*.test: " . exists("#BufEnter#*.test"))')
- execute('au BufEnter *.test let g:entered=1')
- execute('call add(results, "#BufEnter#*.test: " . exists("#BufEnter#*.test"))')
- execute('edit testfile.test')
- execute('call add(results, "#BufEnter#<buffer>: " . exists("#BufEnter#<buffer>"))')
- execute('au BufEnter <buffer> let g:entered=1')
- execute('call add(results, "#BufEnter#<buffer>: " . exists("#BufEnter#<buffer>"))')
- execute('edit testfile2.test')
- execute('call add(results, "#BufEnter#<buffer>: " . exists("#BufEnter#<buffer>"))')
- execute('bf')
- execute('call append(0, results)')
- execute('$d')
+ command('let results=[]')
+ command('call add(results, "##BufEnter: " . exists("##BufEnter"))')
+ command('call add(results, "#BufEnter: " . exists("#BufEnter"))')
+ command('au BufEnter * let g:entered=1')
+ command('call add(results, "#BufEnter: " . exists("#BufEnter"))')
+ command('call add(results, "#auexists#BufEnter: " . exists("#auexists#BufEnter"))')
+ command('augroup auexists')
+ command('au BufEnter * let g:entered=1')
+ command('augroup END')
+ command('call add(results, "#auexists#BufEnter: " . exists("#auexists#BufEnter"))')
+ command('call add(results, "#BufEnter#*.test: " . exists("#BufEnter#*.test"))')
+ command('au BufEnter *.test let g:entered=1')
+ command('call add(results, "#BufEnter#*.test: " . exists("#BufEnter#*.test"))')
+ command('edit testfile.test')
+ command('call add(results, "#BufEnter#<buffer>: " . exists("#BufEnter#<buffer>"))')
+ command('au BufEnter <buffer> let g:entered=1')
+ command('call add(results, "#BufEnter#<buffer>: " . exists("#BufEnter#<buffer>"))')
+ command('edit testfile2.test')
+ command('call add(results, "#BufEnter#<buffer>: " . exists("#BufEnter#<buffer>"))')
+ command('bf')
+ command('call append(0, results)')
+ command('$d')
-- Assert buffer contents.
expect([[
diff --git a/test/functional/legacy/068_text_formatting_spec.lua b/test/functional/legacy/068_text_formatting_spec.lua
index e232e5073d..3a1b21bf87 100644
--- a/test/functional/legacy/068_text_formatting_spec.lua
+++ b/test/functional/legacy/068_text_formatting_spec.lua
@@ -3,207 +3,208 @@ local helpers = require('test.functional.helpers')(after_each)
local feed = helpers.feed
local clear = helpers.clear
local insert = helpers.insert
-local execute = helpers.execute
+local feed_command = helpers.feed_command
local expect = helpers.expect
describe('text formatting', function()
setup(clear)
+ -- luacheck: ignore 613 (Trailing whitespace in a string)
it('is working', function()
-- The control character <C-A> (byte \x01) needs to be put in the buffer
-- directly. But the insert function sends the text to nvim in insert
-- mode so it has to be escaped with <C-V>.
insert([[
Results of test68:
-
-
+
+
{
-
-
+
+
}
-
-
+
+
{
a b
-
+
a
}
-
-
+
+
{
a 
}
-
-
+
+
{
a b
#a b
}
-
-
+
+
{
1 a
# 1 a
}
-
-
+
+
{
-
+
x a
b
c
-
+
}
-
-
+
+
{
# 1 a b
}
-
-
+
+
{
# x
# a b
}
-
-
+
+
{
1aa
2bb
}
-
-
+
+
/* abc def ghi jkl
* mno pqr stu
*/
-
-
+
+
# 1 xxxxx
]])
- execute('/^{/+1')
- execute('set noai tw=2 fo=t')
+ feed_command('/^{/+1')
+ feed_command('set noai tw=2 fo=t')
feed('gRa b<esc>')
- execute('/^{/+1')
- execute('set ai tw=2 fo=tw')
+ feed_command('/^{/+1')
+ feed_command('set ai tw=2 fo=tw')
feed('gqgqjjllab<esc>')
- execute('/^{/+1')
- execute('set tw=3 fo=t')
+ feed_command('/^{/+1')
+ feed_command('set tw=3 fo=t')
feed('gqgqo<cr>')
feed('a <C-V><C-A><esc><esc>')
- execute('/^{/+1')
- execute('set tw=2 fo=tcq1 comments=:#')
+ feed_command('/^{/+1')
+ feed_command('set tw=2 fo=tcq1 comments=:#')
feed('gqgqjgqgqo<cr>')
feed('a b<cr>')
feed('#a b<esc>')
- execute('/^{/+1')
- execute('set tw=5 fo=tcn comments=:#')
+ feed_command('/^{/+1')
+ feed_command('set tw=5 fo=tcn comments=:#')
feed('A b<esc>jA b<esc>')
- execute('/^{/+3')
- execute('set tw=5 fo=t2a si')
+ feed_command('/^{/+3')
+ feed_command('set tw=5 fo=t2a si')
feed('i <esc>A_<esc>')
- execute('/^{/+1')
- execute('set tw=5 fo=qn comments=:#')
+ feed_command('/^{/+1')
+ feed_command('set tw=5 fo=qn comments=:#')
feed('gwap<cr>')
- execute('/^{/+1')
- execute('set tw=5 fo=q2 comments=:#')
+ feed_command('/^{/+1')
+ feed_command('set tw=5 fo=q2 comments=:#')
feed('gwap<cr>')
- execute('/^{/+2')
- execute('set tw& fo=a')
+ feed_command('/^{/+2')
+ feed_command('set tw& fo=a')
feed('I^^<esc><esc>')
- execute('/mno pqr/')
- execute('setl tw=20 fo=an12wcq comments=s1:/*,mb:*,ex:*/')
+ feed_command('/mno pqr/')
+ feed_command('setl tw=20 fo=an12wcq comments=s1:/*,mb:*,ex:*/')
feed('A vwx yz<esc>')
- execute('/^#/')
- execute('setl tw=12 fo=tqnc comments=:#')
+ feed_command('/^#/')
+ feed_command('setl tw=12 fo=tqnc comments=:#')
feed('A foobar<esc>')
-- Assert buffer contents.
expect([[
Results of test68:
-
-
+
+
{
a
b
}
-
-
+
+
{
a
b
-
+
a
b
}
-
-
+
+
{
a

-
+
a

}
-
-
+
+
{
a b
#a b
-
+
a b
#a b
}
-
-
+
+
{
1 a
b
# 1 a
# b
}
-
-
+
+
{
-
+
x a
b_
c
-
+
}
-
-
+
+
{
# 1 a
# b
}
-
-
+
+
{
# x a
# b
}
-
-
+
+
{ 1aa ^^2bb }
-
-
+
+
/* abc def ghi jkl
* mno pqr stu
* vwx yz
*/
-
-
+
+
# 1 xxxxx
# foobar
]])
diff --git a/test/functional/legacy/069_multibyte_formatting_spec.lua b/test/functional/legacy/069_multibyte_formatting_spec.lua
new file mode 100644
index 0000000000..9c248e3aa8
--- /dev/null
+++ b/test/functional/legacy/069_multibyte_formatting_spec.lua
@@ -0,0 +1,340 @@
+-- Test for multibyte text formatting.
+-- Also test, that 'mps' with multibyte chars works.
+-- And test "ra" on multibyte characters.
+-- Also test byteidx() and byteidxcomp()
+
+local helpers = require('test.functional.helpers')(after_each)
+local feed, insert, eq, eval, clear, feed_command, expect = helpers.feed,
+ helpers.insert, helpers.eq, helpers.eval, helpers.clear, helpers.feed_command,
+ helpers.expect
+
+describe('multibyte text', function()
+ before_each(clear)
+
+ it('formatting with "set fo=t"', function()
+ insert([[
+ {
+ ๏ผธ๏ผน๏ผบ
+ abc ๏ผธ๏ผน๏ผบ
+ }]])
+ feed_command('/^{/+1')
+ feed_command('set tw=2 fo=t')
+ feed('gqgqjgqgqo<cr>')
+ feed('๏ผธ๏ผน๏ผบ<cr>')
+ feed('abc ๏ผธ๏ผน๏ผบ<esc><esc>')
+ expect([[
+ {
+ ๏ผธ๏ผน๏ผบ
+ abc
+ ๏ผธ๏ผน๏ผบ
+
+ ๏ผธ๏ผน๏ผบ
+ abc
+ ๏ผธ๏ผน๏ผบ
+ }]])
+ end)
+
+ it('formatting with "set fo=tm"', function()
+ insert([[
+ {
+ ๏ผธ
+ ๏ผธa
+ ๏ผธ a
+ ๏ผธ๏ผน
+ ๏ผธ ๏ผน
+ }]])
+ feed_command('/^{/+1')
+ feed_command('set tw=1 fo=tm')
+ feed('gqgqjgqgqjgqgqjgqgqjgqgqo<cr>')
+ feed('๏ผธ<cr>')
+ feed('๏ผธa<cr>')
+ feed('๏ผธ a<cr>')
+ feed('๏ผธ๏ผน<cr>')
+ feed('๏ผธ ๏ผน<esc><esc>')
+ expect([[
+ {
+ ๏ผธ
+ ๏ผธ
+ a
+ ๏ผธ
+ a
+ ๏ผธ
+ ๏ผน
+ ๏ผธ
+ ๏ผน
+
+ ๏ผธ
+ ๏ผธ
+ a
+ ๏ผธ
+ a
+ ๏ผธ
+ ๏ผน
+ ๏ผธ
+ ๏ผน
+ }]])
+ end)
+
+ it('formatting with "set fo=tm" (part 2)', function()
+ insert([[
+ {
+ ๏ผธ
+ ๏ผธa
+ ๏ผธ a
+ ๏ผธ๏ผน
+ ๏ผธ ๏ผน
+ a๏ผธ
+ ab๏ผธ
+ abc๏ผธ
+ ab๏ผธ c
+ ab๏ผธ๏ผน
+ }]])
+ feed_command('/^{/+1')
+ feed_command('set tw=2 fo=tm')
+ feed('gqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqo<cr>')
+ feed('๏ผธ<cr>')
+ feed('๏ผธa<cr>')
+ feed('๏ผธ a<cr>')
+ feed('๏ผธ๏ผน<cr>')
+ feed('๏ผธ ๏ผน<cr>')
+ feed('a๏ผธ<cr>')
+ feed('ab๏ผธ<cr>')
+ feed('abc๏ผธ<cr>')
+ feed('ab๏ผธ c<cr>')
+ feed('ab๏ผธ๏ผน<esc><esc>')
+ expect([[
+ {
+ ๏ผธ
+ ๏ผธ
+ a
+ ๏ผธ
+ a
+ ๏ผธ
+ ๏ผน
+ ๏ผธ
+ ๏ผน
+ a
+ ๏ผธ
+ ab
+ ๏ผธ
+ abc
+ ๏ผธ
+ ab
+ ๏ผธ
+ c
+ ab
+ ๏ผธ
+ ๏ผน
+
+ ๏ผธ
+ ๏ผธ
+ a
+ ๏ผธ
+ a
+ ๏ผธ
+ ๏ผน
+ ๏ผธ
+ ๏ผน
+ a
+ ๏ผธ
+ ab
+ ๏ผธ
+ abc
+ ๏ผธ
+ ab
+ ๏ผธ
+ c
+ ab
+ ๏ผธ
+ ๏ผน
+ }]])
+ end)
+
+ it('formatting with "set ai fo=tm"', function()
+ insert([[
+ {
+ ๏ผธ
+ ๏ผธa
+ }]])
+ feed_command('/^{/+1')
+ feed_command('set ai tw=2 fo=tm')
+ feed('gqgqjgqgqo<cr>')
+ feed('๏ผธ<cr>')
+ feed('๏ผธa<esc>')
+ expect([[
+ {
+ ๏ผธ
+ ๏ผธ
+ a
+
+ ๏ผธ
+ ๏ผธ
+ a
+ }]])
+ end)
+
+ it('formatting with "set ai fo=tm" (part 2)', function()
+ insert([[
+ {
+ ๏ผธ
+ ๏ผธa
+ }]])
+ feed_command('/^{/+1')
+ feed_command('set noai tw=2 fo=tm')
+ feed('gqgqjgqgqo<cr>')
+ -- Literal spaces will be trimmed from the by feed().
+ feed('<space><space>๏ผธ<cr>')
+ feed('<space><space>๏ผธa<esc>')
+ expect([[
+ {
+ ๏ผธ
+ ๏ผธ
+ a
+
+ ๏ผธ
+ ๏ผธ
+ a
+ }]])
+ end)
+
+ it('formatting with "set fo=cqm" and multibyte comments', function()
+ insert([[
+ {
+ ๏ผธ
+ ๏ผธa
+ ๏ผธa๏ผน
+ ๏ผธ๏ผน
+ ๏ผธ๏ผน๏ผบ
+ ๏ผธ ๏ผน
+ ๏ผธ ๏ผน๏ผบ
+ ๏ผธ๏ผธ
+ ๏ผธ๏ผธa
+ ๏ผธ๏ผธ๏ผน
+ }]])
+ feed_command('/^{/+1')
+ feed_command('set tw=2 fo=cqm comments=n:๏ผธ')
+ feed('gqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqo<cr>')
+ feed('๏ผธ<cr>')
+ feed('๏ผธa<cr>')
+ feed('๏ผธa๏ผน<cr>')
+ feed('๏ผธ๏ผน<cr>')
+ feed('๏ผธ๏ผน๏ผบ<cr>')
+ feed('๏ผธ ๏ผน<cr>')
+ feed('๏ผธ ๏ผน๏ผบ<cr>')
+ feed('๏ผธ๏ผธ<cr>')
+ feed('๏ผธ๏ผธa<cr>')
+ feed('๏ผธ๏ผธ๏ผน<esc><esc>')
+ expect([[
+ {
+ ๏ผธ
+ ๏ผธa
+ ๏ผธa
+ ๏ผธ๏ผน
+ ๏ผธ๏ผน
+ ๏ผธ๏ผน
+ ๏ผธ๏ผบ
+ ๏ผธ ๏ผน
+ ๏ผธ ๏ผน
+ ๏ผธ ๏ผบ
+ ๏ผธ๏ผธ
+ ๏ผธ๏ผธa
+ ๏ผธ๏ผธ๏ผน
+
+ ๏ผธ
+ ๏ผธa
+ ๏ผธa
+ ๏ผธ๏ผน
+ ๏ผธ๏ผน
+ ๏ผธ๏ผน
+ ๏ผธ๏ผบ
+ ๏ผธ ๏ผน
+ ๏ผธ ๏ผน
+ ๏ผธ ๏ผบ
+ ๏ผธ๏ผธ
+ ๏ผธ๏ผธa
+ ๏ผธ๏ผธ๏ผน
+ }]])
+ end)
+
+ it('formatting in replace mode', function()
+ insert([[
+ {
+
+ }]])
+ feed_command('/^{/+1')
+ feed_command('set tw=2 fo=tm')
+ feed('R๏ผธa<esc>')
+ expect([[
+ {
+ ๏ผธ
+ a
+ }]])
+ end)
+
+ it("as values of 'mps'", function()
+ insert([[
+ {
+ โ€˜ two three โ€™ four
+ }]])
+ feed_command('/^{/+1')
+ feed_command('set mps+=โ€˜:โ€™')
+ feed('d%<cr>')
+ expect([[
+ {
+ four
+ }]])
+ end)
+
+ it('can be replaced with r', function()
+ insert([[
+ ๏ฝbb๏ฝ
+ ๏ฝ๏ฝb]])
+ feed('gg0Vjra<cr>')
+ expect([[
+ aaaa
+ aaa]])
+ end)
+
+ it("doesn't interfere with 'whichwrap'", function()
+ insert([[
+ รก
+ x]])
+ feed_command('set whichwrap+=h')
+ feed_command('/^x')
+ feed('dh')
+ expect([[
+ รกx]])
+ end)
+
+ it('can be queried with byteidx() and byteidxcomp()', function()
+ -- One char of two bytes.
+ feed_command("let a = '.รฉ.'")
+ -- Normal e with composing char.
+ feed_command("let b = '.eฬ.'")
+ eq(0, eval('byteidx(a, 0)'))
+ eq(1, eval('byteidx(a, 1)'))
+ eq(3, eval('byteidx(a, 2)'))
+ eq(4, eval('byteidx(a, 3)'))
+ eq(-1, eval('byteidx(a, 4)'))
+ eq(0, eval('byteidx(b, 0)'))
+ eq(1, eval('byteidx(b, 1)'))
+ eq(4, eval('byteidx(b, 2)'))
+ eq(5, eval('byteidx(b, 3)'))
+ eq(-1, eval('byteidx(b, 4)'))
+ eq(0, eval('byteidxcomp(a, 0)'))
+ eq(1, eval('byteidxcomp(a, 1)'))
+ eq(3, eval('byteidxcomp(a, 2)'))
+ eq(4, eval('byteidxcomp(a, 3)'))
+ eq(-1, eval('byteidxcomp(a, 4)'))
+ eq(0, eval('byteidxcomp(b, 0)'))
+ eq(1, eval('byteidxcomp(b, 1)'))
+ eq(2, eval('byteidxcomp(b, 2)'))
+ eq(4, eval('byteidxcomp(b, 3)'))
+ eq(5, eval('byteidxcomp(b, 4)'))
+ eq(-1, eval('byteidxcomp(b, 5)'))
+ end)
+
+ it('correctly interact with the \zs pattern', function()
+ eq('a๏ผ‘a๏ผ’a๏ผ“a', eval([[substitute('๏ผ‘๏ผ’๏ผ“', '\zs', 'a', 'g')]]))
+ end)
+end)
diff --git a/test/functional/legacy/072_undo_file_spec.lua b/test/functional/legacy/072_undo_file_spec.lua
index 4682a82008..b4927e779e 100644
--- a/test/functional/legacy/072_undo_file_spec.lua
+++ b/test/functional/legacy/072_undo_file_spec.lua
@@ -4,7 +4,7 @@
local helpers = require('test.functional.helpers')(after_each)
local feed, insert = helpers.feed, helpers.insert
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
describe('72', function()
setup(clear)
@@ -13,34 +13,34 @@ describe('72', function()
insert([[
1111 -----
2222 -----
-
+
123456789]])
-- Test 'undofile': first a simple one-line change.
- execute('set visualbell')
- execute('set ul=100 undofile undodir=. nomore')
- execute('e! Xtestfile')
+ feed_command('set visualbell')
+ feed_command('set ul=100 undofile undodir=. nomore')
+ feed_command('e! Xtestfile')
feed('ggdGithis is one line<esc>:set ul=100<cr>')
- execute('s/one/ONE/')
- execute('set ul=100')
- execute('w')
- execute('bwipe!')
- execute('e Xtestfile')
+ feed_command('s/one/ONE/')
+ feed_command('set ul=100')
+ feed_command('w')
+ feed_command('bwipe!')
+ feed_command('e Xtestfile')
feed('u:.w! test.out<cr>')
-- Test 'undofile', change in original file fails check.
- execute('set noundofile')
- execute('e! Xtestfile')
- execute('s/line/Line/')
- execute('w')
- execute('set undofile')
- execute('bwipe!')
- execute('e Xtestfile')
+ feed_command('set noundofile')
+ feed_command('e! Xtestfile')
+ feed_command('s/line/Line/')
+ feed_command('w')
+ feed_command('set undofile')
+ feed_command('bwipe!')
+ feed_command('e Xtestfile')
---- TODO: this beeps.
feed('u:.w >>test.out<cr>')
-- Test 'undofile', add 10 lines, delete 6 lines, undo 3.
- execute('set undofile')
+ feed_command('set undofile')
feed('ggdGione<cr>')
feed('two<cr>')
feed('three<cr>')
@@ -57,20 +57,20 @@ describe('72', function()
feed('dd:set ul=100<cr>')
feed('dd:set ul=100<cr>')
feed('dd:set ul=100<cr>')
- execute('w')
- execute('bwipe!')
- execute('e Xtestfile')
+ feed_command('w')
+ feed_command('bwipe!')
+ feed_command('e Xtestfile')
feed('uuu:w >>test.out<cr>')
-- Test that reading the undofiles when setting undofile works.
- execute('set noundofile ul=0')
+ feed_command('set noundofile ul=0')
feed('i<cr>')
feed('<esc>u:e! Xtestfile<cr>')
- execute('set undofile ul=100')
+ feed_command('set undofile ul=100')
feed('uuuuuu:w >>test.out<cr>')
---- Open the output to see if it meets the expections
- execute('e! test.out')
+ feed_command('e! test.out')
-- Assert buffer contents.
expect([[
diff --git a/test/functional/legacy/074_global_var_in_viminfo_spec.lua b/test/functional/legacy/074_global_var_in_viminfo_spec.lua
index 2fc30c9d83..e17b463e30 100644
--- a/test/functional/legacy/074_global_var_in_viminfo_spec.lua
+++ b/test/functional/legacy/074_global_var_in_viminfo_spec.lua
@@ -2,8 +2,8 @@
local helpers = require('test.functional.helpers')(after_each)
local lfs = require('lfs')
-local clear, execute, eq, neq, eval, wait, spawn =
- helpers.clear, helpers.execute, helpers.eq, helpers.neq, helpers.eval,
+local clear, command, eq, neq, eval, wait, spawn =
+ helpers.clear, helpers.command, helpers.eq, helpers.neq, helpers.eval,
helpers.wait, helpers.spawn
describe('storing global variables in ShaDa files', function()
@@ -26,31 +26,29 @@ describe('storing global variables in ShaDa files', function()
71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100}
- execute(
- -- This will cause a few errors, do it silently.
- 'set visualbell',
- 'set shada+=!',
- "let MY_GLOBAL_DICT={'foo': 1, 'bar': 0, 'longvarible': 1000}",
- -- Store a really long list. Initially this was testing line wrapping in
- -- viminfo, but shada files has no line wrapping, no matter how long the
- -- list is.
- 'let MY_GLOBAL_LIST=range(1,100)'
- )
+ command('set visualbell')
+ command('set shada+=!')
+ command('let MY_GLOBAL_DICT={\'foo\': 1, \'bar\': 0, \'longvarible\': 1000}')
+ -- Store a really long list. Initially this was testing line wrapping in
+ -- viminfo, but shada files has no line wrapping, no matter how long the
+ -- list is.
+ command('let MY_GLOBAL_LIST=range(1, 100)')
+
eq(test_dict, eval('MY_GLOBAL_DICT'))
eq(test_list, eval('MY_GLOBAL_LIST'))
- execute('wsh! ' .. tempname)
+ command('wsh! ' .. tempname)
wait()
-- Assert that the shada file exists.
neq(nil, lfs.attributes(tempname))
- execute('unlet MY_GLOBAL_DICT',
- 'unlet MY_GLOBAL_LIST')
+ command('unlet MY_GLOBAL_DICT')
+ command('unlet MY_GLOBAL_LIST')
-- Assert that the variables where deleted.
eq(0, eval('exists("MY_GLOBAL_DICT")'))
eq(0, eval('exists("MY_GLOBAL_LIST")'))
- execute('rsh! ' .. tempname)
+ command('rsh! ' .. tempname)
eq(test_list, eval('MY_GLOBAL_LIST'))
eq(test_dict, eval('MY_GLOBAL_DICT'))
diff --git a/test/functional/legacy/075_maparg_spec.lua b/test/functional/legacy/075_maparg_spec.lua
index e9d2acdaf5..fcfd33ec46 100644
--- a/test/functional/legacy/075_maparg_spec.lua
+++ b/test/functional/legacy/075_maparg_spec.lua
@@ -3,46 +3,48 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, feed = helpers.clear, helpers.feed
-local execute, expect = helpers.execute, helpers.expect
+local command, expect = helpers.command, helpers.expect
+local wait = helpers.wait
describe('maparg()', function()
setup(clear)
it('is working', function()
- execute('set cpo-=<')
+ command('set cpo-=<')
-- Test maparg() with a string result
- execute('map foo<C-V> is<F4>foo')
- execute('vnoremap <script> <buffer> <expr> <silent> bar isbar')
- execute([[call append('$', maparg('foo<C-V>'))]])
- execute([[call append('$', string(maparg('foo<C-V>', '', 0, 1)))]])
- execute([[call append('$', string(maparg('bar', '', 0, 1)))]])
- execute('map <buffer> <nowait> foo bar')
- execute([[call append('$', string(maparg('foo', '', 0, 1)))]])
- execute('map abc x<char-114>x')
- execute([[call append('$', maparg('abc'))]])
- execute('map abc y<S-char-114>y')
- execute([[call append('$', maparg('abc'))]])
+ command('map foo<C-V> is<F4>foo')
+ command('vnoremap <script> <buffer> <expr> <silent> bar isbar')
+ command([[call append('$', maparg('foo<C-V>'))]])
+ command([[call append('$', string(maparg('foo<C-V>', '', 0, 1)))]])
+ command([[call append('$', string(maparg('bar', '', 0, 1)))]])
+ command('map <buffer> <nowait> foo bar')
+ command([[call append('$', string(maparg('foo', '', 0, 1)))]])
+ command('map abc x<char-114>x')
+ command([[call append('$', maparg('abc'))]])
+ command('map abc y<S-char-114>y')
+ command([[call append('$', maparg('abc'))]])
feed('Go<esc>:<cr>')
+ wait()
-- Outside of the range, minimum
- execute('inoremap <Char-0x1040> a')
- execute([[execute "normal a\u1040\<Esc>"]])
+ command('inoremap <Char-0x1040> a')
+ command([[execute "normal a\u1040\<Esc>"]])
-- Inside of the range, minimum
- execute('inoremap <Char-0x103f> b')
- execute([[execute "normal a\u103f\<Esc>"]])
+ command('inoremap <Char-0x103f> b')
+ command([[execute "normal a\u103f\<Esc>"]])
-- Inside of the range, maximum
- execute('inoremap <Char-0xf03f> c')
- execute([[execute "normal a\uf03f\<Esc>"]])
+ command('inoremap <Char-0xf03f> c')
+ command([[execute "normal a\uf03f\<Esc>"]])
-- Outside of the range, maximum
- execute('inoremap <Char-0xf040> d')
- execute([[execute "normal a\uf040\<Esc>"]])
+ command('inoremap <Char-0xf040> d')
+ command([[execute "normal a\uf040\<Esc>"]])
-- Remove empty line
- execute('1d')
+ command('1d')
-- Assert buffer contents.
expect([[
diff --git a/test/functional/legacy/076_completefunc_spec.lua b/test/functional/legacy/076_completefunc_spec.lua
deleted file mode 100644
index bf3f56eb84..0000000000
--- a/test/functional/legacy/076_completefunc_spec.lua
+++ /dev/null
@@ -1,68 +0,0 @@
--- Tests for completefunc/omnifunc.
-
-local helpers = require('test.functional.helpers')(after_each)
-local feed, insert, source = helpers.feed, helpers.insert, helpers.source
-local clear, expect, execute = helpers.clear, helpers.expect, helpers.execute
-
-describe('completefunc', function()
- setup(clear)
-
- it('is working', function()
- insert([=[
- +++
- one
- two
- three]=])
-
- -- Test that nothing happens if the 'completefunc' opens
- -- a new window (no completion, no crash).
- source([=[
- function! DummyCompleteOne(findstart, base)
- if a:findstart
- return 0
- else
- wincmd n
- return ['onedef', 'oneDEF']
- endif
- endfunction
- setlocal completefunc=DummyCompleteOne
- /^one
- ]=])
- feed('A<C-X><C-U><C-N><esc>')
- execute('q!')
- source([=[
- function! DummyCompleteTwo(findstart, base)
- if a:findstart
- wincmd n
- return 0
- else
- return ['twodef', 'twoDEF']
- endif
- endfunction
- setlocal completefunc=DummyCompleteTwo
- /^two
- ]=])
- feed('A<C-X><C-U><C-N><esc>')
- execute('q!')
- -- Test that 'completefunc' works when it's OK.
- source([=[
- function! DummyCompleteThree(findstart, base)
- if a:findstart
- return 0
- else
- return ['threedef', 'threeDEF']
- endif
- endfunction
- setlocal completefunc=DummyCompleteThree
- /^three
- ]=])
- feed('A<C-X><C-U><C-N><esc>')
-
- -- Assert buffer contents.
- expect([=[
- +++
-
- two
- threeDEF]=])
- end)
-end)
diff --git a/test/functional/legacy/077_mf_hash_grow_spec.lua b/test/functional/legacy/077_mf_hash_grow_spec.lua
index b43263300d..4719a3ecbf 100644
--- a/test/functional/legacy/077_mf_hash_grow_spec.lua
+++ b/test/functional/legacy/077_mf_hash_grow_spec.lua
@@ -7,30 +7,37 @@
-- If it isn't available then the test will be skipped.
local helpers = require('test.functional.helpers')(after_each)
+
local feed = helpers.feed
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local wait = helpers.wait
+local clear = helpers.clear
+local expect = helpers.expect
+local command = helpers.command
describe('mf_hash_grow()', function()
setup(clear)
-- Check to see if cksum exists, otherwise skip the test
- if os.execute('which cksum 2>&1 > /dev/null') ~= 0 then
+ local null = helpers.iswin() and 'nul' or '/dev/null'
+ if os.execute('cksum --help >' .. null .. ' 2>&1') ~= 0 then
pending('was not tested because cksum was not found', function() end)
else
it('is working', function()
- execute('set fileformat=unix undolevels=-1')
+ command('set fileformat=unix undolevels=-1')
-- Fill the buffer with numbers 1 - 2000000
- execute('let i = 1')
- execute('while i <= 2000000 | call append(i, range(i, i + 99)) | let i += 100 | endwhile')
+ command('let i = 1')
+ command('while i <= 2000000 | call append(i, range(i, i + 99)) | let i += 100 | endwhile')
-- Delete empty first line, save to Xtest, and clear buffer
feed('ggdd<cr>')
- execute('w! Xtest')
+ wait()
+ command('w! Xtest')
feed('ggdG<cr>')
+ wait()
-- Calculate the cksum of Xtest and delete first line
- execute('r !cksum Xtest')
+ command('r !cksum Xtest')
feed('ggdd<cr>')
-- Assert correct output of cksum.
diff --git a/test/functional/legacy/078_swapfile_recover_spec.lua b/test/functional/legacy/078_swapfile_recover_spec.lua
index 4390ba2ca8..45f0aed37a 100644
--- a/test/functional/legacy/078_swapfile_recover_spec.lua
+++ b/test/functional/legacy/078_swapfile_recover_spec.lua
@@ -22,32 +22,32 @@ describe('78', function()
let linecount = 10000
while i <= linecount | call append(i - 1, i . text) | let i += 1 | endwhile
preserve
-
+
" Get the name of the swap file, and clean up the :redir capture.
redir => g:swapname | swapname | redir END
let g:swapname = substitute(g:swapname, '[[:blank:][:cntrl:]]*\(.\{-}\)[[:blank:][:cntrl:]]*$', '\1', 'g')
let g:swapname = fnameescape(g:swapname)
-
+
" Make a copy of the swap file in Xswap
set bin
exe 'sp ' . g:swapname
w! Xswap
-
+
set nobin
new
only!
bwipe! Xtest
call rename('Xswap', g:swapname)
-
+
"TODO(jkeyes): without 'silent', this hangs the test " at message:
" 'Recovery completed. You should check if everything is OK.'
silent recover Xtest
-
+
call delete(g:swapname)
new
call append(0, 'recovery start')
wincmd w
-
+
let g:linedollar = line('$')
if g:linedollar < linecount
wincmd w
@@ -56,7 +56,7 @@ describe('78', function()
wincmd w
let linecount = g:linedollar
endif
-
+
let i = 1
while i <= linecount
if getline(i) != i . text
@@ -72,7 +72,7 @@ describe('78', function()
expect([[
recovery start
-
+
recovery end]])
end)
end)
diff --git a/test/functional/legacy/080_substitute_spec.lua b/test/functional/legacy/080_substitute_spec.lua
index 1bdae9be59..faeb61e3af 100644
--- a/test/functional/legacy/080_substitute_spec.lua
+++ b/test/functional/legacy/080_substitute_spec.lua
@@ -1,10 +1,10 @@
--- Test for *sub-replace-special* and *sub-replace-expression* on substitue().
--- Test for submatch() on substitue().
+-- Test for *sub-replace-special* and *sub-replace-expression* on substitute().
+-- Test for submatch() on substitute().
-- Test for *:s%* on :substitute.
local helpers = require('test.functional.helpers')(after_each)
local feed, insert = helpers.feed, helpers.insert
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
local eq, eval = helpers.eq, helpers.eval
describe('substitue()', function()
@@ -46,17 +46,17 @@ describe('substitue()', function()
end
it('with "set magic" (TEST_1)', function()
- execute('set magic')
+ feed_command('set magic')
test_1_and_2()
end)
it('with "set nomagic" (TEST_2)', function()
- execute('set nomagic')
+ feed_command('set nomagic')
test_1_and_2()
end)
it('with sub-replace-expression (TEST_3)', function()
- execute('set magic&')
+ feed_command('set magic&')
eq('a\\a', eval([[substitute('aAa', 'A', '\="\\"', '')]]))
eq('b\\\\b', eval([[substitute('bBb', 'B', '\="\\\\"', '')]]))
eq('c\rc', eval([[substitute('cCc', 'C', '\="]]..'\r'..[["', '')]]))
@@ -70,7 +70,7 @@ describe('substitue()', function()
end)
it('with submatch() (TEST_4)', function()
- execute('set magic&')
+ feed_command('set magic&')
eq('a\\a', eval([[substitute('aAa', 'A', ]] ..
[['\=substitute(submatch(0), ".", "\\", "")', '')]]))
eq('b\\b', eval([[substitute('bBb', 'B', ]] ..
@@ -92,7 +92,7 @@ describe('substitue()', function()
end)
it('with submatch() (TEST_5)', function()
- execute('set magic&')
+ feed_command('set magic&')
eq('A123456789987654321', eval([[substitute('A123456789', ]] ..
[['A\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)', ]] ..
[['\=submatch(0) . submatch(9) . submatch(8) . submatch(7) . ]] ..
@@ -110,7 +110,7 @@ describe('substitue()', function()
-- #2943.
it('with submatch or \\ze (TEST_7)', function()
- execute('set magic&')
+ feed_command('set magic&')
eq('A\rA', eval("substitute('A\rA', 'A.', '\\=submatch(0)', '')"))
eq('B\nB', eval([[substitute("B\nB", 'B.', '\=submatch(0)', '')]]))
eq("['B\n']B",
@@ -120,7 +120,7 @@ describe('substitue()', function()
end)
it('with \\zs and \\ze (TEST_10)', function()
- execute('set magic&')
+ feed_command('set magic&')
eq('a1a2a3a', eval([[substitute('123', '\zs', 'a', 'g')]]))
eq('aaa', eval([[substitute('123', '\zs.', 'a', 'g')]]))
eq('1a2a3a', eval([[substitute('123', '.\zs', 'a', 'g')]]))
@@ -140,11 +140,11 @@ describe(':substitue', function()
,,X
,,Y
,,Z]])
- execute('set magic&')
- execute([[1s/\(^\|,\)\ze\(,\|X\)/\1N/g]])
- execute([[2s/\(^\|,\)\ze\(,\|Y\)/\1N/gc]])
+ feed_command('set magic&')
+ feed_command([[1s/\(^\|,\)\ze\(,\|X\)/\1N/g]])
+ feed_command([[2s/\(^\|,\)\ze\(,\|Y\)/\1N/gc]])
feed('a') -- For the dialog of the previous :s command.
- execute([[3s/\(^\|,\)\ze\(,\|Z\)/\1N/gc]])
+ feed_command([[3s/\(^\|,\)\ze\(,\|Z\)/\1N/gc]])
feed('yy') -- For the dialog of the previous :s command.
expect([[
N,,NX
@@ -154,8 +154,8 @@ describe(':substitue', function()
it('with confirmation dialog (TEST_9)', function()
insert('xxx')
- execute('set magic&')
- execute('s/x/X/gc')
+ feed_command('set magic&')
+ feed_command('s/x/X/gc')
feed('yyq') -- For the dialog of the previous :s command.
expect('XXx')
end)
diff --git a/test/functional/legacy/081_coptions_movement_spec.lua b/test/functional/legacy/081_coptions_movement_spec.lua
index 2ac1332687..d82c46a3d3 100644
--- a/test/functional/legacy/081_coptions_movement_spec.lua
+++ b/test/functional/legacy/081_coptions_movement_spec.lua
@@ -2,11 +2,12 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, expect = helpers.execute, helpers.expect
+local feed_command, expect = helpers.feed_command, helpers.expect
describe('coptions', function()
setup(clear)
+ -- luacheck: ignore 613 (Trailing whitespace in a string)
it('is working', function()
insert([[
aaa two three four
@@ -16,18 +17,18 @@ describe('coptions', function()
ccc two three four
ddd yee yoo four]])
- execute('set cpo-=;')
+ feed_command('set cpo-=;')
feed('gg0tt;D')
feed('j0fz;D')
feed('j$Fy;D')
feed('j$Ty;D')
- execute('set cpo+=;')
+ feed_command('set cpo+=;')
feed('j0tt;;D')
feed('j$Ty;;D')
-
+
expect([[
aaa two
z
diff --git a/test/functional/legacy/082_string_comparison_spec.lua b/test/functional/legacy/082_string_comparison_spec.lua
index d6f3c45e1f..311822c34f 100644
--- a/test/functional/legacy/082_string_comparison_spec.lua
+++ b/test/functional/legacy/082_string_comparison_spec.lua
@@ -3,7 +3,7 @@
local helpers = require('test.functional.helpers')(after_each)
local feed, source = helpers.feed, helpers.source
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
describe('case-insensitive string comparison in UTF-8', function()
setup(clear)
@@ -106,18 +106,18 @@ describe('case-insensitive string comparison in UTF-8', function()
]])
-- Test that g~ap changes one paragraph only.
- execute('new')
+ feed_command('new')
feed('iabcd<cr><cr>defg<esc>gg0g~ap')
- execute('let lns = getline(1,3)')
- execute('q!')
- execute([[call append(line('$'), lns)]])
+ feed_command('let lns = getline(1,3)')
+ feed_command('q!')
+ feed_command([[call append(line('$'), lns)]])
-- Assert buffer contents.
expect([=[
3732 checks passed
-
+
ABCD
-
+
defg]=])
end)
end)
diff --git a/test/functional/legacy/084_curswant_spec.lua b/test/functional/legacy/084_curswant_spec.lua
index 818914eeb9..42cb2fc56d 100644
--- a/test/functional/legacy/084_curswant_spec.lua
+++ b/test/functional/legacy/084_curswant_spec.lua
@@ -7,6 +7,7 @@ local clear, expect = helpers.clear, helpers.expect
describe('curswant', function()
setup(clear)
+ -- luacheck: ignore 621 (Indentation)
it('is working', function()
insert([[
start target options
@@ -25,7 +26,7 @@ describe('curswant', function()
let curswant_after = winsaveview().curswant
return [a:option_name, curswant_before, curswant_after]
endfunction
-
+
new
put =['1234567890', '12345']
1 delete _
@@ -33,7 +34,7 @@ describe('curswant', function()
for option_name in target_option_names
call add(result, TestCurswant(option_name))
endfor
-
+
new
put =map(copy(result), 'join(v:val, '' '')')
1 delete _
diff --git a/test/functional/legacy/088_conceal_tabs_spec.lua b/test/functional/legacy/088_conceal_tabs_spec.lua
index 00e7312bf8..a4c7e26583 100644
--- a/test/functional/legacy/088_conceal_tabs_spec.lua
+++ b/test/functional/legacy/088_conceal_tabs_spec.lua
@@ -2,8 +2,8 @@
-- tabulators.
local helpers = require('test.functional.helpers')(after_each)
-local feed, insert, clear, execute =
- helpers.feed, helpers.insert, helpers.clear, helpers.execute
+local feed, insert, clear, feed_command =
+ helpers.feed, helpers.insert, helpers.clear, helpers.feed_command
local expect_pos = function(row, col)
return helpers.eq({row, col}, helpers.eval('[screenrow(), screencol()]'))
@@ -12,24 +12,25 @@ end
describe('cursor and column position with conceal and tabulators', function()
setup(clear)
+ -- luacheck: ignore 621 (Indentation)
it('are working', function()
insert([[
start:
.concealed. text
|concealed| text
-
+
.concealed. text
|concealed| text
-
+
.a. .b. .c. .d.
|a| |b| |c| |d|]])
-- Conceal settings.
- execute('set conceallevel=2')
- execute('set concealcursor=nc')
- execute('syntax match test /|/ conceal')
+ feed_command('set conceallevel=2')
+ feed_command('set concealcursor=nc')
+ feed_command('syntax match test /|/ conceal')
-- Start test.
- execute('/^start:')
+ feed_command('/^start:')
feed('ztj')
expect_pos(2, 1)
-- We should end up in the same column when running these commands on the
@@ -78,10 +79,10 @@ describe('cursor and column position with conceal and tabulators', function()
expect_pos(9, 25)
feed('$')
expect_pos(9, 26)
- execute('set lbr')
+ feed_command('set lbr')
feed('$')
expect_pos(9, 26)
- execute('set list listchars=tab:>-')
+ feed_command('set list listchars=tab:>-')
feed('0')
expect_pos(9, 1)
feed('W')
diff --git a/test/functional/legacy/089_number_relnumber_findfile_spec.lua b/test/functional/legacy/089_number_relnumber_findfile_spec.lua
deleted file mode 100644
index 7a87fc8603..0000000000
--- a/test/functional/legacy/089_number_relnumber_findfile_spec.lua
+++ /dev/null
@@ -1,116 +0,0 @@
--- - Some tests for setting 'number' and 'relativenumber'
--- This is not all that useful now that the options are no longer reset when
--- setting the other.
-
-local helpers = require('test.functional.helpers')(after_each)
-local feed = helpers.feed
-local clear, expect, source = helpers.clear, helpers.expect, helpers.source
-
-describe("setting 'number' and 'relativenumber'", function()
- setup(clear)
-
- it('is working', function()
- source([[
- set hidden nu rnu
- redir @a | set nu? | set rnu? | redir END
- e! xx
- redir @b | set nu? | set rnu? | redir END
- e! #
- $put ='results:'
- $put a
- $put b
-
- set nonu nornu
- setglobal nu
- setlocal rnu
- redir @c | setglobal nu? | redir END
- set nonu nornu
- setglobal rnu
- setlocal nu
- redir @d | setglobal rnu? | redir END
- $put =':setlocal must NOT reset the other global value'
- $put c
- $put d
-
- set nonu nornu
- setglobal nu
- setglobal rnu
- redir @e | setglobal nu? | redir END
- set nonu nornu
- setglobal rnu
- setglobal nu
- redir @f | setglobal rnu? | redir END
- $put =':setglobal MUST reset the other global value'
- $put e
- $put f
-
- set nonu nornu
- set nu
- set rnu
- redir @g | setglobal nu? | redir END
- set nonu nornu
- set rnu
- set nu
- redir @h | setglobal rnu? | redir END
- $put =':set MUST reset the other global value'
- $put g
- $put h
- ]])
-
- -- Remove empty line
- feed('ggdd')
-
- -- Assert buffer contents.
- expect([[
- results:
-
- number
- relativenumber
-
- number
- relativenumber
- :setlocal must NOT reset the other global value
-
- number
-
- relativenumber
- :setglobal MUST reset the other global value
-
- number
-
- relativenumber
- :set MUST reset the other global value
-
- number
-
- relativenumber]])
- end)
-end)
-
--- - Some tests for findfile() function
-describe('findfile', function()
- setup(clear)
-
- it('is working', function()
- -- Assume test is being run from project root
- source([[
- $put ='Testing findfile'
- $put =''
- set ssl
- $put =findfile('vim.c','src/nvim/ap*')
- cd src/nvim
- $put =findfile('vim.c','ap*')
- $put =findfile('vim.c','api')
- ]])
-
- -- Remove empty line
- feed('ggdd')
-
- expect([[
- Testing findfile
-
- src/nvim/api/vim.c
- api/vim.c
- api/vim.c]])
- end)
-end)
diff --git a/test/functional/legacy/091_context_variables_spec.lua b/test/functional/legacy/091_context_variables_spec.lua
index edf497d397..c08a58e14b 100644
--- a/test/functional/legacy/091_context_variables_spec.lua
+++ b/test/functional/legacy/091_context_variables_spec.lua
@@ -13,6 +13,14 @@ describe('context variables', function()
-- Test for getbufvar().
-- Use strings to test for memory leaks.
source([[
+ function Getbufscope(buf, ...)
+ let ret = call('getbufvar', [a:buf, ''] + a:000)
+ if type(ret) == type({})
+ return filter(copy(ret), 'v:key isnot# "changedtick"')
+ else
+ return ret
+ endif
+ endfunction
let t:testvar='abcd'
$put =string(gettabvar(1, 'testvar'))
$put =string(gettabvar(1, 'testvar'))
@@ -20,14 +28,14 @@ describe('context variables', function()
let def_num = '5678'
$put =string(getbufvar(1, 'var_num'))
$put =string(getbufvar(1, 'var_num', def_num))
- $put =string(getbufvar(1, ''))
- $put =string(getbufvar(1, '', def_num))
+ $put =string(Getbufscope(1))
+ $put =string(Getbufscope(1, def_num))
unlet b:var_num
$put =string(getbufvar(1, 'var_num', def_num))
- $put =string(getbufvar(1, ''))
- $put =string(getbufvar(1, '', def_num))
- $put =string(getbufvar(9, ''))
- $put =string(getbufvar(9, '', def_num))
+ $put =string(Getbufscope(1))
+ $put =string(Getbufscope(1, def_num))
+ $put =string(Getbufscope(9))
+ $put =string(Getbufscope(9, def_num))
unlet def_num
$put =string(getbufvar(1, '&autoindent'))
$put =string(getbufvar(1, '&autoindent', 1))
diff --git a/test/functional/legacy/092_mksession_cursor_cols_utf8_spec.lua b/test/functional/legacy/092_mksession_cursor_cols_utf8_spec.lua
index f8564384e9..3c46c29951 100644
--- a/test/functional/legacy/092_mksession_cursor_cols_utf8_spec.lua
+++ b/test/functional/legacy/092_mksession_cursor_cols_utf8_spec.lua
@@ -5,7 +5,7 @@
local helpers = require('test.functional.helpers')(after_each)
local feed, insert = helpers.feed, helpers.insert
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
describe('store cursor position in session file in UTF-8', function()
setup(clear)
@@ -15,6 +15,7 @@ describe('store cursor position in session file in UTF-8', function()
os.remove('test.out')
end)
+ -- luacheck: ignore 621 (Indentation)
it('is working', function()
insert([[
start:
@@ -29,15 +30,15 @@ describe('store cursor position in session file in UTF-8', function()
-- This test requires the buffer to correspond to a file on disk, here named
-- "test.in", because otherwise :mksession won't write out the cursor column
-- info needed for verification.
- execute('write! test.in')
+ feed_command('write! test.in')
- execute('set sessionoptions=buffers splitbelow fileencoding=utf-8')
+ feed_command('set sessionoptions=buffers splitbelow fileencoding=utf-8')
-- Move the cursor through the buffer lines and position it with "|". Using
-- :split after every normal mode command is a trick to have multiple
-- cursors on the screen that can all be stored in the session file.
- execute('/^start:')
- execute('vsplit')
+ feed_command('/^start:')
+ feed_command('vsplit')
feed('j16|:split<cr>')
feed('j16|:split<cr>')
feed('j16|:split<cr>')
@@ -49,9 +50,9 @@ describe('store cursor position in session file in UTF-8', function()
-- Again move the cursor through the buffer and position it with "|". This
-- time also perform a horizontal scroll at every step.
- execute('wincmd l')
- execute('/^start:')
- execute('set nowrap')
+ feed_command('wincmd l')
+ feed_command('/^start:')
+ feed_command('set nowrap')
feed('j16|3zl:split<cr>')
feed('j016|3zl:split<cr>')
feed('j016|3zl:split<cr>')
@@ -62,9 +63,9 @@ describe('store cursor position in session file in UTF-8', function()
feed('j016|3zl:split<cr>')
-- Create the session file, read it back in, and prepare for verification.
- execute('mksession! test.out')
- execute('new test.out')
- execute([[v/\(^ *normal! 0\|^ *exe 'normal!\)/d]])
+ feed_command('mksession! test.out')
+ feed_command('new test.out')
+ feed_command([[v/\(^ *normal! 0\|^ *exe 'normal!\)/d]])
-- Assert buffer contents.
expect([[
diff --git a/test/functional/legacy/093_mksession_cursor_cols_latin1_spec.lua b/test/functional/legacy/093_mksession_cursor_cols_latin1_spec.lua
index 719ce25099..f09fd9a6e5 100644
--- a/test/functional/legacy/093_mksession_cursor_cols_latin1_spec.lua
+++ b/test/functional/legacy/093_mksession_cursor_cols_latin1_spec.lua
@@ -5,7 +5,7 @@
local helpers = require('test.functional.helpers')(after_each)
local feed, insert = helpers.feed, helpers.insert
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
describe('store cursor position in session file in Latin-1', function()
setup(clear)
@@ -15,6 +15,7 @@ describe('store cursor position in session file in Latin-1', function()
os.remove('test.out')
end)
+ -- luacheck: ignore 621 (Indentation)
it('is working', function()
insert([[
start:
@@ -28,13 +29,13 @@ describe('store cursor position in session file in Latin-1', function()
Aไ๖ three mulTibyte characters]])
-- Must write buffer to disk for :mksession. See the comments in
-- "092_mksession_cursor_cols_utf8_spec.lua".
- execute('write! test.in')
+ feed_command('write! test.in')
- execute('set sessionoptions=buffers splitbelow fileencoding=latin1')
+ feed_command('set sessionoptions=buffers splitbelow fileencoding=latin1')
-- Move the cursor through the buffer lines and position it with "|".
- execute('/^start:')
- execute('vsplit')
+ feed_command('/^start:')
+ feed_command('vsplit')
feed('j16|:split<cr>')
feed('j16|:split<cr>')
feed('j16|:split<cr>')
@@ -46,9 +47,9 @@ describe('store cursor position in session file in Latin-1', function()
-- Again move the cursor through the buffer and position it with "|". This
-- time also perform a horizontal scroll at every step.
- execute('wincmd l')
- execute('/^start:')
- execute('set nowrap')
+ feed_command('wincmd l')
+ feed_command('/^start:')
+ feed_command('set nowrap')
feed('j16|3zl:split<cr>')
feed('j016|3zl:split<cr>')
feed('j016|3zl:split<cr>')
@@ -59,9 +60,9 @@ describe('store cursor position in session file in Latin-1', function()
feed('j016|3zl:split<cr>')
-- Create the session file, read it back in, and prepare for verification.
- execute('mksession! test.out')
- execute('new test.out')
- execute([[v/\(^ *normal! 0\|^ *exe 'normal!\)/d]])
+ feed_command('mksession! test.out')
+ feed_command('new test.out')
+ feed_command([[v/\(^ *normal! 0\|^ *exe 'normal!\)/d]])
-- Assert buffer contents.
expect([[
diff --git a/test/functional/legacy/094_visual_mode_operators_spec.lua b/test/functional/legacy/094_visual_mode_operators_spec.lua
index a52fa00672..ff1d3e7bec 100644
--- a/test/functional/legacy/094_visual_mode_operators_spec.lua
+++ b/test/functional/legacy/094_visual_mode_operators_spec.lua
@@ -6,7 +6,7 @@
local helpers = require('test.functional.helpers')(after_each)
local feed, insert, source = helpers.feed, helpers.insert, helpers.source
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
-- Vim script user functions needed for some of the test cases.
local function source_user_functions()
@@ -54,38 +54,38 @@ describe('Visual mode and operator', function()
it('simple change in Visual mode', function()
insert([[
apple banana cherry
-
+
line 1 line 1
line 2 line 2
line 3 line 3
line 4 line 4
line 5 line 5
line 6 line 6
-
+
xxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxxx]])
-- Exercise characterwise Visual mode plus operator, with count and repeat.
- execute('/^apple')
+ feed_command('/^apple')
feed('lvld.l3vd.')
-- Same in linewise Visual mode.
- execute('/^line 1')
+ feed_command('/^line 1')
feed('Vcnewline<esc>j.j2Vd.')
-- Same in blockwise Visual mode.
- execute('/^xxxx')
+ feed_command('/^xxxx')
feed('<c-v>jlc <esc>l.l2<c-v>c----<esc>l.')
-- Assert buffer contents.
expect([[
a y
-
+
newline
newline
-
+
--------x
--------x
xxxx--------x
@@ -98,15 +98,15 @@ describe('Visual mode and operator', function()
JambuRambutanBananaTangerineMango]])
-- Set up Visual mode mappings.
- execute('vnoremap W /\\u/s-1<CR>')
- execute('vnoremap iW :<C-U>call SelectInCaps()<CR>')
+ feed_command('vnoremap W /\\u/s-1<CR>')
+ feed_command('vnoremap iW :<C-U>call SelectInCaps()<CR>')
-- Do a simple change using the simple vmap, also with count and repeat.
- execute('/^Kiwi')
+ feed_command('/^Kiwi')
feed('vWcNo<esc>l.fD2vd.')
-- Same, using the vmap that maps to an Ex command.
- execute('/^Jambu')
+ feed_command('/^Jambu')
feed('llviWc-<esc>l.l2vdl.')
-- Assert buffer contents.
@@ -122,20 +122,20 @@ describe('Visual mode and operator', function()
LemonNectarineZ]])
-- Set up Operator-pending mode mappings.
- execute('onoremap W /\\u/<CR>')
- execute('onoremap <Leader>W :<C-U>call MoveToCap()<CR>')
- execute('onoremap iW :<C-U>call SelectInCaps()<CR>')
+ feed_command('onoremap W /\\u/<CR>')
+ feed_command('onoremap <Leader>W :<C-U>call MoveToCap()<CR>')
+ feed_command('onoremap iW :<C-U>call SelectInCaps()<CR>')
-- Do a simple change using the simple omap, also with count and repeat.
- execute('/^Pineapple')
+ feed_command('/^Pineapple')
feed('cW-<esc>l.l2.l.')
-- Same, using the omap that maps to an Ex command to move the cursor.
- execute('/^Juniper')
+ feed_command('/^Juniper')
feed('g?\\WfD.')
-- Same, using the omap that uses Ex and Visual mode (custom text object).
- execute('/^Lemon')
+ feed_command('/^Lemon')
feed('yiWPlciWNew<esc>fr.')
-- Assert buffer contents.
@@ -159,7 +159,7 @@ describe('Visual mode and operator', function()
-- changed, taking into account the v/V/<c-v> modifier given; or
-- - abort the operation by pressing Escape: no change to the buffer is
-- carried out.
- execute('/^zzzz')
+ feed_command('/^zzzz')
feed([[dV:<cr>dv:<cr>:set noma | let v:errmsg = ''<cr>]])
feed([[d:<cr>:set ma | put = v:errmsg =~# '^E21' ? 'ok' : 'failed'<cr>]])
feed([[dv:<esc>dV:<esc>:set noma | let v:errmsg = ''<cr>]])
@@ -180,7 +180,7 @@ describe('Visual mode and operator', function()
feed('v$p')
expect([[
-
+
x]])
end)
@@ -189,7 +189,7 @@ describe('Visual mode and operator', function()
feed('kkv$d')
expect([[
-
+
b
c]])
end)
@@ -199,7 +199,7 @@ describe('Visual mode and operator', function()
feed('kkvj$d')
expect([[
-
+
c]])
end)
@@ -208,7 +208,7 @@ describe('Visual mode and operator', function()
feed('v$d')
expect([[
-
+
a
b
]])
@@ -219,7 +219,7 @@ describe('Visual mode and operator', function()
feed('kvj$d')
expect([[
-
+
a
]])
end)
@@ -235,7 +235,7 @@ describe('Visual mode and operator', function()
feed('kkgh<End><Del>')
expect([[
-
+
b
c]])
end)
@@ -245,7 +245,7 @@ describe('Visual mode and operator', function()
feed('kkgh<Down><End><Del>')
expect([[
-
+
c]])
end)
@@ -254,7 +254,7 @@ describe('Visual mode and operator', function()
feed('gh<End><Del>')
expect([[
-
+
a
b
]])
@@ -265,7 +265,7 @@ describe('Visual mode and operator', function()
feed('kgh<Down><End><Del>')
expect([[
-
+
a
]])
end)
@@ -281,7 +281,7 @@ describe('Visual mode and operator', function()
feed(' kkgH<Del> ')
expect([[
-
+
b
c]])
end)
@@ -291,7 +291,7 @@ describe('Visual mode and operator', function()
feed('kkgH<Down><Del>')
expect([[
-
+
c]])
end)
@@ -300,7 +300,7 @@ describe('Visual mode and operator', function()
feed('gH<Del>')
expect([[
-
+
a
b]])
end)
@@ -310,7 +310,7 @@ describe('Visual mode and operator', function()
feed('kgH<Down><Del>')
expect([[
-
+
a]])
end)
end)
@@ -318,25 +318,25 @@ describe('Visual mode and operator', function()
describe('v_p:', function()
it('replace last character with line register at middle line', function()
put_aaabbbccc()
- execute('-2yank')
+ feed_command('-2yank')
feed('k$vp')
expect([[
-
+
aaa
bb
aaa
-
+
ccc]])
end)
it('replace last character with line register at middle line selecting newline', function()
put_aaabbbccc()
- execute('-2yank')
+ feed_command('-2yank')
feed('k$v$p')
expect([[
-
+
aaa
bb
aaa
@@ -345,11 +345,11 @@ describe('Visual mode and operator', function()
it('replace last character with line register at last line', function()
put_aaabbbccc()
- execute('-2yank')
+ feed_command('-2yank')
feed('$vp')
expect([[
-
+
aaa
bbb
cc
@@ -359,11 +359,11 @@ describe('Visual mode and operator', function()
it('replace last character with line register at last line selecting newline', function()
put_aaabbbccc()
- execute('-2yank')
+ feed_command('-2yank')
feed('$v$p')
expect([[
-
+
aaa
bbb
cc
@@ -372,6 +372,7 @@ describe('Visual mode and operator', function()
end)
end)
+ -- luacheck: ignore 613 (Trailing whitespace in a string)
it('gv in exclusive select mode after operation', function()
source([[
$put ='zzz '
@@ -380,7 +381,7 @@ describe('Visual mode and operator', function()
feed('kv3lyjv3lpgvcxxx<Esc>')
expect([[
-
+
zzz
xxx ]])
end)
@@ -392,7 +393,7 @@ describe('Visual mode and operator', function()
feed('0v3l<Esc>gvcxxx<Esc>')
expect([[
-
+
xxx ]])
end)
end)
diff --git a/test/functional/legacy/096_location_list_spec.lua b/test/functional/legacy/096_location_list_spec.lua
index eac8d6356d..b21a2085f6 100644
--- a/test/functional/legacy/096_location_list_spec.lua
+++ b/test/functional/legacy/096_location_list_spec.lua
@@ -8,13 +8,13 @@
local helpers = require('test.functional.helpers')(after_each)
local source = helpers.source
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, command, expect = helpers.clear, helpers.command, helpers.expect
describe('location list', function()
+ local test_file = 'Xtest-096_location_list.out'
setup(clear)
-
teardown(function()
- os.remove('test.out')
+ os.remove(test_file)
end)
it('is working', function()
@@ -28,7 +28,7 @@ describe('location list', function()
function! ReadTestProtocol(name)
let base = substitute(a:name, '\v^test://(.*)%(\.[^.]+)?', '\1', '')
let word = substitute(base, '\v(.*)\..*', '\1', '')
-
+
setl modifiable
setl noreadonly
setl noswapfile
@@ -37,9 +37,9 @@ describe('location list', function()
" For problem 2:
" 'buftype' has to be set to reproduce the constant opening of new windows.
setl buftype=nofile
-
+
call setline(1, word)
-
+
setl nomodified
setl nomodifiable
setl readonly
@@ -70,75 +70,78 @@ describe('location list', function()
endfor
]])
- -- Set up the result buffer "test.out".
- execute('enew')
- execute('w! test.out')
- execute('b 1')
+ -- Set up the result buffer.
+ command('enew')
+ command('w! '..test_file)
+ command('b 1')
-- Test A.
-- Open a new buffer as the sole window, rewind and open the prepopulated
-- location list and navigate through the entries.
- execute('lrewind')
- execute('enew')
- execute('lopen')
- execute('lnext', 'lnext', 'lnext', 'lnext')
+ command('lrewind')
+ command('enew')
+ command('lopen')
+ command(('lnext|'):rep(4))
-- Split the window, copying the location list, then open the copied
-- location list and again navigate forward.
- execute('vert split')
- execute('wincmd L')
- execute('lopen')
- execute('wincmd p')
- execute('lnext')
+ command('vert split')
+ command('wincmd L')
+ command('lopen')
+ command('wincmd p')
+ command('lnext')
-- Record the current file name and the file name of the corresponding
-- location list entry, then open the result buffer.
- execute('let fileName = expand("%")')
- execute('wincmd p')
- execute([[let locationListFileName = substitute(getline(line('.')), '\([^|]*\)|.*', '\1', '')]])
- execute('wincmd n')
- execute('wincmd K')
- execute('b test.out')
+ command('let fileName = expand("%")')
+ command('wincmd p')
+ command([[let locationListFileName = substitute(getline(line('.')), '\([^|]*\)|.*', '\1', '')]])
+ command('wincmd n')
+ command('wincmd K')
+ command('b '..test_file)
-- Prepare test output and write it to the result buffer.
- execute([[let fileName = substitute(fileName, '\\', '/', 'g')]])
- execute([[let locationListFileName = substitute(locationListFileName, '\\', '/', 'g')]])
- execute([[call append(line('$'), "Test A:")]])
- execute([[call append(line('$'), " - file name displayed: " . fileName)]])
- execute([[call append(line('$'), " - quickfix claims that the file name displayed is: " . locationListFileName)]])
- execute('w')
+ command([[let fileName = substitute(fileName, '\\', '/', 'g')]])
+ command([[let locationListFileName = substitute(locationListFileName, '\\', '/', 'g')]])
+ command([[call append(line('$'), "Test A:")]])
+ command([[call append(line('$'), " - file name displayed: " . fileName)]])
+ command([[call append(line('$'), " - quickfix claims that the file name displayed is: " . locationListFileName)]])
+ command('w')
-- Clean slate for the next test.
- execute('wincmd o')
- execute('b 1')
+ command('wincmd o')
+ command('b 1')
-- Test B.
-- Rewind the location list, then open it and browse through it by running
-- ":{number}" followed by Enter repeatedly in the location list window.
- execute('lrewind')
- execute('lopen')
- execute('2', [[exe "normal \\<CR>"]])
- execute('wincmd p')
- execute('3', [[exe "normal \<CR>"]])
- execute('wincmd p')
- execute('4', [[exe "normal \<CR>"]])
+ command('lrewind')
+ command('lopen')
+ command('2')
+ command([[exe "normal \\<CR>"]])
+ command('wincmd p')
+ command('3')
+ command([[exe "normal \<CR>"]])
+ command('wincmd p')
+ command('4')
+ command([[exe "normal \<CR>"]])
-- Record the number of windows open, then go back to the result buffer.
- execute('let numberOfWindowsOpen = winnr("$")')
- execute('wincmd n')
- execute('wincmd K')
- execute('b test.out')
+ command('let numberOfWindowsOpen = winnr("$")')
+ command('wincmd n')
+ command('wincmd K')
+ command('b '..test_file)
-- Prepare test output and write it to the result buffer.
- execute('call append(line("$"), "Test B:")')
- execute('call append(line("$"), " - number of window open: " . numberOfWindowsOpen)')
- execute('w')
+ command('call append(line("$"), "Test B:")')
+ command('call append(line("$"), " - number of window open: " . numberOfWindowsOpen)')
+ command('w')
-- Clean slate.
- execute('wincmd o')
- execute('b 1')
+ command('wincmd o')
+ command('b 1')
-- Test C.
@@ -146,38 +149,41 @@ describe('location list', function()
-- Enter browsing. But this time, move the location list window to the top
-- to check whether it (the first window found) will be reused when we try
-- to open new windows.
- execute('lrewind')
- execute('lopen')
- execute('wincmd K')
- execute('2', [[exe "normal \<CR>"]])
- execute('wincmd p')
- execute('3', [[exe "normal \<CR>"]])
- execute('wincmd p')
- execute('4', [[exe "normal \<CR>"]])
+ command('lrewind')
+ command('lopen')
+ command('wincmd K')
+ command('2')
+ command([[exe "normal \<CR>"]])
+ command('wincmd p')
+ command('3')
+ command([[exe "normal \<CR>"]])
+ command('wincmd p')
+ command('4')
+ command([[exe "normal \<CR>"]])
-- Record the 'buftype' of window 1 (the location list) and the buffer name
-- of window 2 (the current "test protocol" buffer), then go back to the
-- result buffer.
- execute('1wincmd w')
- execute('let locationListWindowBufType = &buftype')
- execute('2wincmd w')
- execute('let bufferName = expand("%")')
- execute('wincmd n')
- execute('wincmd K')
- execute('b test.out')
+ command('1wincmd w')
+ command('let locationListWindowBufType = &buftype')
+ command('2wincmd w')
+ command('let bufferName = expand("%")')
+ command('wincmd n')
+ command('wincmd K')
+ command('b '..test_file)
-- Prepare test output and write it to the result buffer.
- execute([[let bufferName = substitute(bufferName, '\\', '/', 'g')]])
- execute([[call append(line("$"), "Test C:")]])
- execute([[call append(line('$'), " - 'buftype' of the location list window: " . locationListWindowBufType)]])
- execute([[call append(line('$'), " - buffer displayed in the 2nd window: " . bufferName)]])
- execute('w')
- execute('wincmd o')
- execute('b 1')
+ command([[let bufferName = substitute(bufferName, '\\', '/', 'g')]])
+ command([[call append(line("$"), "Test C:")]])
+ command([[call append(line('$'), " - 'buftype' of the location list window: " . locationListWindowBufType)]])
+ command([[call append(line('$'), " - buffer displayed in the 2nd window: " . bufferName)]])
+ command('w')
+ command('wincmd o')
+ command('b 1')
-- Assert buffer contents.
expect([[
-
+
Test A:
- file name displayed: test://bar.txt
- quickfix claims that the file name displayed is: test://bar.txt
diff --git a/test/functional/legacy/097_glob_path_spec.lua b/test/functional/legacy/097_glob_path_spec.lua
index a6c146891a..ccd93fed60 100644
--- a/test/functional/legacy/097_glob_path_spec.lua
+++ b/test/functional/legacy/097_glob_path_spec.lua
@@ -4,47 +4,79 @@
local helpers = require('test.functional.helpers')(after_each)
local clear = helpers.clear
-local execute, expect = helpers.execute, helpers.expect
+local command, expect = helpers.command, helpers.expect
describe('glob() and globpath()', function()
setup(clear)
setup(function()
- os.execute("mkdir -p sautest/autoload")
- os.execute("touch sautest/autoload/Test104.vim")
- os.execute("touch sautest/autoload/footest.vim")
+ if helpers.iswin() then
+ os.execute("md sautest\\autoload")
+ os.execute(".>sautest\\autoload\\Test104.vim 2>nul")
+ os.execute(".>sautest\\autoload\\footest.vim 2>nul")
+ else
+ os.execute("mkdir -p sautest/autoload")
+ os.execute("touch sautest/autoload/Test104.vim")
+ os.execute("touch sautest/autoload/footest.vim")
+ end
end)
it('is working', function()
-- Make sure glob() doesn't use the shell
- execute('set shell=doesnotexist')
+ command('set shell=doesnotexist')
-- Consistent sorting of file names
- execute('set nofileignorecase')
-
- execute([[$put =glob('Xxx\{')]])
- execute([[$put =glob('Xxx\$')]])
-
- execute('w! Xxx{')
- execute([[w! Xxx\$]])
- execute([[$put =glob('Xxx\{')]])
- execute([[$put =glob('Xxx\$')]])
-
- execute("$put =string(globpath('sautest/autoload', '*.vim'))")
- execute("$put =string(globpath('sautest/autoload', '*.vim', 0, 1))")
-
- expect([=[
-
-
-
- Xxx{
- Xxx$
- 'sautest/autoload/Test104.vim
- sautest/autoload/footest.vim'
- ['sautest/autoload/Test104.vim', 'sautest/autoload/footest.vim']]=])
+ command('set nofileignorecase')
+
+ if helpers.iswin() then
+ command([[$put =glob('Xxx{')]])
+ command([[$put =glob('Xxx$')]])
+
+ command('silent w! Xxx{')
+ command([[w! Xxx$]])
+ command([[$put =glob('Xxx{')]])
+ command([[$put =glob('Xxx$')]])
+
+ command([[$put =string(globpath('sautest\autoload', '*.vim'))]])
+ command([[$put =string(globpath('sautest\autoload', '*.vim', 0, 1))]])
+ expect([=[
+
+
+
+ Xxx{
+ Xxx$
+ 'sautest\autoload\Test104.vim
+ sautest\autoload\footest.vim'
+ ['sautest\autoload\Test104.vim', 'sautest\autoload\footest.vim']]=])
+ else
+ command([[$put =glob('Xxx\{')]])
+ command([[$put =glob('Xxx\$')]])
+
+ command('silent w! Xxx{')
+ command([[w! Xxx\$]])
+ command([[$put =glob('Xxx\{')]])
+ command([[$put =glob('Xxx\$')]])
+
+ command("$put =string(globpath('sautest/autoload', '*.vim'))")
+ command("$put =string(globpath('sautest/autoload', '*.vim', 0, 1))")
+ expect([=[
+
+
+
+ Xxx{
+ Xxx$
+ 'sautest/autoload/Test104.vim
+ sautest/autoload/footest.vim'
+ ['sautest/autoload/Test104.vim', 'sautest/autoload/footest.vim']]=])
+ end
end)
teardown(function()
- os.execute("rm -rf sautest Xxx{ Xxx$")
+ if helpers.iswin() then
+ os.execute('del /q/f Xxx{ Xxx$')
+ os.execute('rd /q /s sautest')
+ else
+ os.execute("rm -rf sautest Xxx{ Xxx$")
+ end
end)
end)
diff --git a/test/functional/legacy/101_hlsearch_spec.lua b/test/functional/legacy/101_hlsearch_spec.lua
index 0d88e99278..eff755221c 100644
--- a/test/functional/legacy/101_hlsearch_spec.lua
+++ b/test/functional/legacy/101_hlsearch_spec.lua
@@ -2,52 +2,52 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, feed = helpers.clear, helpers.feed
-local execute, expect = helpers.execute, helpers.expect
+local feed_command, expect = helpers.feed_command, helpers.expect
describe('v:hlsearch', function()
setup(clear)
it('is working', function()
-- Last abc: Q
- execute('new')
- execute([[call setline(1, repeat(['aaa'], 10))]])
- execute('set hlsearch nolazyredraw')
- execute('let r=[]')
- execute('command -nargs=0 -bar AddR :call add(r, [screenattr(1, 1), v:hlsearch])')
- execute('/aaa')
- execute('AddR')
- execute('nohlsearch')
- execute('AddR')
- execute('let v:hlsearch=1')
- execute('AddR')
- execute('let v:hlsearch=0')
- execute('AddR')
- execute('set hlsearch')
- execute('AddR')
- execute('let v:hlsearch=0')
- execute('AddR')
+ feed_command('new')
+ feed_command([[call setline(1, repeat(['aaa'], 10))]])
+ feed_command('set hlsearch nolazyredraw')
+ feed_command('let r=[]')
+ feed_command('command -nargs=0 -bar AddR :call add(r, [screenattr(1, 1), v:hlsearch])')
+ feed_command('/aaa')
+ feed_command('AddR')
+ feed_command('nohlsearch')
+ feed_command('AddR')
+ feed_command('let v:hlsearch=1')
+ feed_command('AddR')
+ feed_command('let v:hlsearch=0')
+ feed_command('AddR')
+ feed_command('set hlsearch')
+ feed_command('AddR')
+ feed_command('let v:hlsearch=0')
+ feed_command('AddR')
feed('n:AddR<cr>')
- execute('let v:hlsearch=0')
- execute('AddR')
- execute('/')
- execute('AddR')
- execute('set nohls')
- execute('/')
- execute('AddR')
- execute('let r1=r[0][0]')
+ feed_command('let v:hlsearch=0')
+ feed_command('AddR')
+ feed_command('/')
+ feed_command('AddR')
+ feed_command('set nohls')
+ feed_command('/')
+ feed_command('AddR')
+ feed_command('let r1=r[0][0]')
-- I guess it is not guaranteed that screenattr outputs always the same character
- execute([[call map(r, 'v:val[1].":".(v:val[0]==r1?"highlighted":"not highlighted")')]])
- execute('try')
- execute(' let v:hlsearch=[]')
- execute('catch')
- execute([[ call add(r, matchstr(v:exception,'^Vim(let):E\d\+:'))]])
- execute('endtry')
- execute('bwipeout!')
- execute('$put=r')
- execute('call garbagecollect(1)')
- execute('call getchar()')
- execute('1d', '1d')
+ feed_command([[call map(r, 'v:val[1].":".(v:val[0]==r1?"highlighted":"not highlighted")')]])
+ feed_command('try')
+ feed_command(' let v:hlsearch=[]')
+ feed_command('catch')
+ feed_command([[ call add(r, matchstr(v:exception,'^Vim(let):E\d\+:'))]])
+ feed_command('endtry')
+ feed_command('bwipeout!')
+ feed_command('$put=r')
+ feed_command('call garbagecollect(1)')
+ feed_command('call getchar()')
+ feed_command('1d', '1d')
-- Assert buffer contents.
expect([[
@@ -61,6 +61,6 @@ describe('v:hlsearch', function()
0:not highlighted
1:highlighted
0:not highlighted
- Vim(let):E706:]])
+ Vim(let):E745:]])
end)
end)
diff --git a/test/functional/legacy/102_fnameescape_spec.lua b/test/functional/legacy/102_fnameescape_spec.lua
index c1a6c57956..c8ee423ff3 100644
--- a/test/functional/legacy/102_fnameescape_spec.lua
+++ b/test/functional/legacy/102_fnameescape_spec.lua
@@ -2,19 +2,19 @@
local helpers = require('test.functional.helpers')(after_each)
local clear = helpers.clear
-local execute, expect = helpers.execute, helpers.expect
+local command, expect = helpers.command, helpers.expect
describe('fnameescape', function()
setup(clear)
it('is working', function()
- execute('let fname = "Xspa ce"')
- execute('try', 'exe "w! " . fnameescape(fname)', "put='Space'", 'endtry')
- execute('let fname = "Xemark!"')
- execute('try', 'exe "w! " . fnameescape(fname)', "put='ExclamationMark'", 'endtry')
+ command('let fname = "Xspa ce"')
+ command('try | exe "w! " . fnameescape(fname) | put=\'Space\' | endtry')
+ command('let fname = "Xemark!"')
+ command('try | exe "w! " . fnameescape(fname) | put=\'ExclamationMark\' | endtry')
expect([[
-
+
Space
ExclamationMark]])
end)
diff --git a/test/functional/legacy/103_visual_mode_reset_spec.lua b/test/functional/legacy/103_visual_mode_reset_spec.lua
index d05b47fa32..f5cd861019 100644
--- a/test/functional/legacy/103_visual_mode_reset_spec.lua
+++ b/test/functional/legacy/103_visual_mode_reset_spec.lua
@@ -32,7 +32,7 @@ describe('E315 error', function()
-- :del the ex-way will require the colon operator which resets the
-- visual mode thus preventing the problem:
feed('GV:call TriggerTheProblem()<cr>')
-
+
source([[
%del _
call append(line('$'), g:msg)
@@ -41,7 +41,7 @@ describe('E315 error', function()
-- Assert buffer contents.
expect([[
-
+
Everything's fine.]])
end)
end)
diff --git a/test/functional/legacy/104_let_assignment_spec.lua b/test/functional/legacy/104_let_assignment_spec.lua
index 27c3715231..a03bb026f6 100644
--- a/test/functional/legacy/104_let_assignment_spec.lua
+++ b/test/functional/legacy/104_let_assignment_spec.lua
@@ -2,13 +2,13 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, source = helpers.clear, helpers.source
-local execute, expect = helpers.execute, helpers.expect
+local command, expect = helpers.command, helpers.expect
describe(':let', function()
setup(clear)
it('is working', function()
- execute('set runtimepath+=test/functional/fixtures')
+ command('set runtimepath+=test/functional/fixtures')
-- Test to not autoload when assigning. It causes internal error.
source([[
@@ -34,7 +34,7 @@ describe(':let', function()
endfor]])
-- Remove empty line
- execute('1d')
+ command('1d')
-- Assert buffer contents.
expect([[
diff --git a/test/functional/legacy/106_errorformat_spec.lua b/test/functional/legacy/106_errorformat_spec.lua
index 2b17d63378..3f017a704f 100644
--- a/test/functional/legacy/106_errorformat_spec.lua
+++ b/test/functional/legacy/106_errorformat_spec.lua
@@ -2,22 +2,22 @@
local helpers = require('test.functional.helpers')(after_each)
local clear = helpers.clear
-local execute, expect = helpers.execute, helpers.expect
+local command, expect = helpers.command, helpers.expect
describe('errorformat', function()
setup(clear)
it('is working', function()
- execute("set efm=%EEEE%m,%WWWW%m,%+CCCC%.%#,%-GGGG%.%#")
- execute("cgetexpr ['WWWW', 'EEEE', 'CCCC']")
- execute("$put =strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))")
- execute("cgetexpr ['WWWW', 'GGGG', 'EEEE', 'CCCC']")
- execute("$put =strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))")
- execute("cgetexpr ['WWWW', 'GGGG', 'ZZZZ', 'EEEE', 'CCCC', 'YYYY']")
- execute("$put =strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))")
-
+ command("set efm=%EEEE%m,%WWWW%m,%+CCCC%.%#,%-GGGG%.%#")
+ command("cgetexpr ['WWWW', 'EEEE', 'CCCC']")
+ command("$put =strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))")
+ command("cgetexpr ['WWWW', 'GGGG', 'EEEE', 'CCCC']")
+ command("$put =strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))")
+ command("cgetexpr ['WWWW', 'GGGG', 'ZZZZ', 'EEEE', 'CCCC', 'YYYY']")
+ command("$put =strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))")
+
expect([=[
-
+
[['W', 1], ['E^@CCCC', 1]]
[['W', 1], ['E^@CCCC', 1]]
[['W', 1], ['ZZZZ', 0], ['E^@CCCC', 1], ['YYYY', 0]]]=])
diff --git a/test/functional/legacy/107_adjust_window_and_contents_spec.lua b/test/functional/legacy/107_adjust_window_and_contents_spec.lua
index ce8d967e00..239f60341a 100644
--- a/test/functional/legacy/107_adjust_window_and_contents_spec.lua
+++ b/test/functional/legacy/107_adjust_window_and_contents_spec.lua
@@ -2,8 +2,11 @@
local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
+
+local wait = helpers.wait
+local clear = helpers.clear
local insert = helpers.insert
-local clear, execute = helpers.clear, helpers.execute
+local command = helpers.command
describe('107', function()
setup(clear)
@@ -13,31 +16,34 @@ describe('107', function()
screen:attach()
insert('start:')
- execute('new')
- execute('call setline(1, range(1,256))')
- execute('let r=[]')
- execute('func! GetScreenStr(row)')
- execute(' let str = ""')
- execute(' for c in range(1,3)')
- execute(' let str .= nr2char(screenchar(a:row, c))')
- execute(' endfor')
- execute(' return str')
- execute('endfunc')
- execute([[exe ":norm! \<C-W>t\<C-W>=1Gzt\<C-W>w\<C-W>+"]])
- execute('let s3=GetScreenStr(1)')
- execute('wincmd p')
- execute('call add(r, [line("w0"), s3])')
- execute([[exe ":norm! \<C-W>t\<C-W>=50Gzt\<C-W>w\<C-W>+"]])
- execute('let s3=GetScreenStr(1)')
- execute('wincmd p')
- execute('call add(r, [line("w0"), s3])')
- execute([[exe ":norm! \<C-W>t\<C-W>=59Gzt\<C-W>w\<C-W>+"]])
- execute('let s3=GetScreenStr(1)')
- execute(':wincmd p')
- execute('call add(r, [line("w0"), s3])')
- execute('bwipeout!')
- execute('$put=r')
- execute('call garbagecollect(1)')
+ wait()
+ command('new')
+ command('call setline(1, range(1,256))')
+ command('let r=[]')
+ command([[
+ func! GetScreenStr(row)
+ let str = ""
+ for c in range(1,3)
+ let str .= nr2char(screenchar(a:row, c))
+ endfor
+ return str
+ endfunc
+ ]])
+ command([[exe ":norm! \<C-W>t\<C-W>=1Gzt\<C-W>w\<C-W>+"]])
+ command('let s3=GetScreenStr(1)')
+ command('wincmd p')
+ command('call add(r, [line("w0"), s3])')
+ command([[exe ":norm! \<C-W>t\<C-W>=50Gzt\<C-W>w\<C-W>+"]])
+ command('let s3=GetScreenStr(1)')
+ command('wincmd p')
+ command('call add(r, [line("w0"), s3])')
+ command([[exe ":norm! \<C-W>t\<C-W>=59Gzt\<C-W>w\<C-W>+"]])
+ command('let s3=GetScreenStr(1)')
+ command(':wincmd p')
+ command('call add(r, [line("w0"), s3])')
+ command('bwipeout!')
+ command('$put=r')
+ command('call garbagecollect(1)')
screen:expect([[
start: |
@@ -53,7 +59,7 @@ describe('107', function()
~ |
~ |
~ |
- :call garbagecollect(1) |
+ 3 more lines |
]])
end)
end)
diff --git a/test/functional/legacy/108_backtrace_debug_commands_spec.lua b/test/functional/legacy/108_backtrace_debug_commands_spec.lua
index a03092e446..1c1a2095d5 100644
--- a/test/functional/legacy/108_backtrace_debug_commands_spec.lua
+++ b/test/functional/legacy/108_backtrace_debug_commands_spec.lua
@@ -1,33 +1,35 @@
-- Tests for backtrace debug commands.
local helpers = require('test.functional.helpers')(after_each)
+local command = helpers.command
local feed, clear = helpers.feed, helpers.clear
-local execute, expect = helpers.execute, helpers.expect
+local feed_command, expect = helpers.feed_command, helpers.expect
describe('108', function()
before_each(clear)
it('is working', function()
- execute('lang mess C')
- execute('function! Foo()')
- execute(' let var1 = 1')
- execute(' let var2 = Bar(var1) + 9')
- execute(' return var2')
- execute('endfunction')
- execute('function! Bar(var)')
- execute(' let var1 = 2 + a:var')
- execute(' let var2 = Bazz(var1) + 4')
- execute(' return var2')
- execute('endfunction')
- execute('function! Bazz(var)')
- execute(' let var1 = 3 + a:var')
- execute(' let var3 = "another var"')
- execute(' return var1')
- execute('endfunction')
- execute('new')
- execute('debuggreedy')
- execute('redir => out')
- execute('debug echo Foo()')
+ command("set shortmess-=F")
+ feed_command('lang mess C')
+ feed_command('function! Foo()')
+ feed_command(' let var1 = 1')
+ feed_command(' let var2 = Bar(var1) + 9')
+ feed_command(' return var2')
+ feed_command('endfunction')
+ feed_command('function! Bar(var)')
+ feed_command(' let var1 = 2 + a:var')
+ feed_command(' let var2 = Bazz(var1) + 4')
+ feed_command(' return var2')
+ feed_command('endfunction')
+ feed_command('function! Bazz(var)')
+ feed_command(' let var1 = 3 + a:var')
+ feed_command(' let var3 = "another var"')
+ feed_command(' return var1')
+ feed_command('endfunction')
+ feed_command('new')
+ feed_command('debuggreedy')
+ feed_command('redir => out')
+ feed_command('debug echo Foo()')
feed('step<cr>')
feed('step<cr>')
feed('step<cr>')
@@ -83,24 +85,24 @@ describe('108', function()
feed('fram<cr>')
feed([[echo "\n- final result 19:"<cr>]])
feed('cont<cr>')
- execute('0debuggreedy')
- execute('redir END')
- execute('$put =out')
+ feed_command('0debuggreedy')
+ feed_command('redir END')
+ feed_command('$put =out')
-- Assert buffer contents.
expect([=[
-
-
-
+
+
+
- show backtrace:
-
+
2 function Foo[2]
1 Bar[2]
->0 Bazz
line 2: let var3 = "another var"
-
+
show variables on different levels:
-
+
6
2 function Foo[2]
->1 Bar[2]
@@ -112,55 +114,53 @@ describe('108', function()
0 Bazz
line 2: let var3 = "another var"
1
-
+
- undefined vars:
-
+
undefined var3 on former level:
Error detected while processing function Foo[2]..Bar[2]..Bazz:
line 3:
E121: Undefined variable: var3
- E15: Invalid expression: var3
here var3 is defined with "another var":
another var
-
+
undefined var2 on former level
Error detected while processing function Foo[2]..Bar:
line 3:
E121: Undefined variable: var2
- E15: Invalid expression: var2
here var2 is defined with 10:
10
-
+
- backtrace movements:
-
+
1 function Foo[2]
->0 Bar
line 3: End of function
-
+
next command cannot go down, we are on bottom
-
+
frame is zero
-
+
next command cannot go up, we are on top
-
+
frame at highest level: 1
->1 function Foo[2]
0 Bar
line 3: End of function
fil is not frame or finish, it is file
"[No Name]" --No lines in buffer--
-
+
- relative backtrace movement
-
+
1 function Foo[2]
->0 Bar
line 3: End of function
->1 function Foo[2]
0 Bar
line 3: End of function
-
+
- go beyond limits does not crash
-
+
frame at highest level: 1
->1 function Foo[2]
0 Bar
@@ -169,7 +169,7 @@ describe('108', function()
1 function Foo[2]
->0 Bar
line 3: End of function
-
+
- final result 19:
19
]=])
diff --git a/test/functional/legacy/arglist_spec.lua b/test/functional/legacy/arglist_spec.lua
index c128aaf115..bd65e549ef 100644
--- a/test/functional/legacy/arglist_spec.lua
+++ b/test/functional/legacy/arglist_spec.lua
@@ -1,19 +1,19 @@
-- Test argument list commands
local helpers = require('test.functional.helpers')(after_each)
-local clear, execute, eq = helpers.clear, helpers.execute, helpers.eq
+local clear, command, eq = helpers.clear, helpers.command, helpers.eq
local eval, exc_exec, neq = helpers.eval, helpers.exc_exec, helpers.neq
describe('argument list commands', function()
before_each(clear)
local function init_abc()
- execute('args a b c')
- execute('next')
+ command('args a b c')
+ command('next')
end
local function reset_arglist()
- execute('arga a | %argd')
+ command('arga a | %argd')
end
local function assert_fails(cmd, err)
@@ -21,183 +21,185 @@ describe('argument list commands', function()
end
it('test that argidx() works', function()
- execute('args a b c')
- execute('last')
+ command('args a b c')
+ command('last')
eq(2, eval('argidx()'))
- execute('%argdelete')
+ command('%argdelete')
eq(0, eval('argidx()'))
- execute('args a b c')
+ command('args a b c')
eq(0, eval('argidx()'))
- execute('next')
+ command('next')
eq(1, eval('argidx()'))
- execute('next')
+ command('next')
eq(2, eval('argidx()'))
- execute('1argdelete')
+ command('1argdelete')
eq(1, eval('argidx()'))
- execute('1argdelete')
+ command('1argdelete')
eq(0, eval('argidx()'))
- execute('1argdelete')
+ command('1argdelete')
eq(0, eval('argidx()'))
end)
it('test that argadd() works', function()
- execute('%argdelete')
- execute('argadd a b c')
+ -- Fails with โ€œE474: Invalid argumentโ€. Not sure whether it is how it is
+ -- supposed to behave.
+ -- command('%argdelete')
+ command('argadd a b c')
eq(0, eval('argidx()'))
- execute('%argdelete')
- execute('argadd a')
+ command('%argdelete')
+ command('argadd a')
eq(0, eval('argidx()'))
- execute('argadd b c d')
+ command('argadd b c d')
eq(0, eval('argidx()'))
init_abc()
- execute('argadd x')
+ command('argadd x')
eq({'a', 'b', 'x', 'c'}, eval('argv()'))
eq(1, eval('argidx()'))
init_abc()
- execute('0argadd x')
+ command('0argadd x')
eq({'x', 'a', 'b', 'c'}, eval('argv()'))
eq(2, eval('argidx()'))
init_abc()
- execute('1argadd x')
+ command('1argadd x')
eq({'a', 'x', 'b', 'c'}, eval('argv()'))
eq(2, eval('argidx()'))
init_abc()
- execute('$argadd x')
+ command('$argadd x')
eq({'a', 'b', 'c', 'x'}, eval('argv()'))
eq(1, eval('argidx()'))
init_abc()
- execute('$argadd x')
- execute('+2argadd y')
+ command('$argadd x')
+ command('+2argadd y')
eq({'a', 'b', 'c', 'x', 'y'}, eval('argv()'))
eq(1, eval('argidx()'))
- execute('%argd')
- execute('edit d')
- execute('arga')
+ command('%argd')
+ command('edit d')
+ command('arga')
eq(1, eval('len(argv())'))
eq('d', eval('get(argv(), 0, "")'))
- execute('%argd')
- execute('new')
- execute('arga')
+ command('%argd')
+ command('new')
+ command('arga')
eq(0, eval('len(argv())'))
end)
it('test for [count]argument and [count]argdelete commands', function()
reset_arglist()
- execute('let save_hidden = &hidden')
- execute('set hidden')
- execute('let g:buffers = []')
- execute('augroup TEST')
- execute([[au BufEnter * call add(buffers, expand('%:t'))]])
- execute('augroup END')
-
- execute('argadd a b c d')
- execute('$argu')
- execute('$-argu')
- execute('-argu')
- execute('1argu')
- execute('+2argu')
-
- execute('augroup TEST')
- execute('au!')
- execute('augroup END')
+ command('let save_hidden = &hidden')
+ command('set hidden')
+ command('let g:buffers = []')
+ command('augroup TEST')
+ command([[au BufEnter * call add(buffers, expand('%:t'))]])
+ command('augroup END')
+
+ command('argadd a b c d')
+ command('$argu')
+ command('$-argu')
+ command('-argu')
+ command('1argu')
+ command('+2argu')
+
+ command('augroup TEST')
+ command('au!')
+ command('augroup END')
eq({'d', 'c', 'b', 'a', 'c'}, eval('g:buffers'))
- execute('redir => result')
- execute('ar')
- execute('redir END')
+ command('redir => result')
+ command('ar')
+ command('redir END')
eq(1, eval([[result =~# 'a b \[c] d']]))
- execute('.argd')
+ command('.argd')
eq({'a', 'b', 'd'}, eval('argv()'))
- execute('-argd')
+ command('-argd')
eq({'a', 'd'}, eval('argv()'))
- execute('$argd')
+ command('$argd')
eq({'a'}, eval('argv()'))
- execute('1arga c')
- execute('1arga b')
- execute('$argu')
- execute('$arga x')
+ command('1arga c')
+ command('1arga b')
+ command('$argu')
+ command('$arga x')
eq({'a', 'b', 'c', 'x'}, eval('argv()'))
- execute('0arga Y')
+ command('0arga Y')
eq({'Y', 'a', 'b', 'c', 'x'}, eval('argv()'))
- execute('%argd')
+ command('%argd')
eq({}, eval('argv()'))
- execute('arga a b c d e f')
- execute('2,$-argd')
+ command('arga a b c d e f')
+ command('2,$-argd')
eq({'a', 'f'}, eval('argv()'))
- execute('let &hidden = save_hidden')
+ command('let &hidden = save_hidden')
-- Setting the argument list should fail when the current buffer has
-- unsaved changes
- execute('%argd')
- execute('enew!')
- execute('set modified')
+ command('%argd')
+ command('enew!')
+ command('set modified')
assert_fails('args x y z', 'E37:')
- execute('args! x y z')
+ command('args! x y z')
eq({'x', 'y', 'z'}, eval('argv()'))
eq('x', eval('expand("%:t")'))
- execute('%argdelete')
+ command('%argdelete')
assert_fails('argument', 'E163:')
end)
it('test for 0argadd and 0argedit', function()
reset_arglist()
- execute('arga a b c d')
- execute('2argu')
- execute('0arga added')
+ command('arga a b c d')
+ command('2argu')
+ command('0arga added')
eq({'added', 'a', 'b', 'c', 'd'}, eval('argv()'))
- execute('%argd')
- execute('arga a b c d')
- execute('2argu')
- execute('0arge edited')
+ command('%argd')
+ command('arga a b c d')
+ command('2argu')
+ command('0arge edited')
eq({'edited', 'a', 'b', 'c', 'd'}, eval('argv()'))
- execute('2argu')
- execute('arga third')
+ command('2argu')
+ command('arga third')
eq({'edited', 'a', 'third', 'b', 'c', 'd'}, eval('argv()'))
end)
it('test for argc()', function()
reset_arglist()
eq(0, eval('argc()'))
- execute('argadd a b')
+ command('argadd a b')
eq(2, eval('argc()'))
end)
it('test for arglistid()', function()
reset_arglist()
- execute('arga a b')
+ command('arga a b')
eq(0, eval('arglistid()'))
- execute('split')
- execute('arglocal')
+ command('split')
+ command('arglocal')
eq(1, eval('arglistid()'))
- execute('tabnew | tabfirst')
+ command('tabnew | tabfirst')
eq(0, eval('arglistid(2)'))
eq(1, eval('arglistid(1, 1)'))
eq(0, eval('arglistid(2, 1)'))
eq(1, eval('arglistid(1, 2)'))
- execute('tabonly | only | enew!')
- execute('argglobal')
+ command('tabonly | only | enew!')
+ command('argglobal')
eq(0, eval('arglistid()'))
end)
@@ -205,64 +207,94 @@ describe('argument list commands', function()
reset_arglist()
eq({}, eval('argv()'))
eq('', eval('argv(2)'))
- execute('argadd a b c d')
+ command('argadd a b c d')
eq('c', eval('argv(2)'))
end)
it('test for :argedit command', function()
reset_arglist()
- execute('argedit a')
+ command('argedit a')
eq({'a'}, eval('argv()'))
eq('a', eval('expand("%:t")'))
- execute('argedit b')
+ command('argedit b')
eq({'a', 'b'}, eval('argv()'))
eq('b', eval('expand("%:t")'))
- execute('argedit a')
- eq({'a', 'b'}, eval('argv()'))
+ command('argedit a')
+ eq({'a', 'b', 'a'}, eval('argv()'))
eq('a', eval('expand("%:t")'))
- assert_fails('argedit a b', 'E172:')
- execute('argedit c')
- eq({'a', 'c', 'b'}, eval('argv()'))
- execute('0argedit x')
- eq({'x', 'a', 'c', 'b'}, eval('argv()'))
- execute('enew! | set modified')
+ command('argedit c')
+ eq({'a', 'b', 'a', 'c'}, eval('argv()'))
+ command('0argedit x')
+ eq({'x', 'a', 'b', 'a', 'c'}, eval('argv()'))
+ command('enew! | set modified')
assert_fails('argedit y', 'E37:')
- execute('argedit! y')
- eq({'x', 'y', 'a', 'c', 'b'}, eval('argv()'))
- execute('%argd')
+ command('argedit! y')
+ eq({'x', 'y', 'y', 'a', 'b', 'a', 'c'}, eval('argv()'))
+ command('%argd')
+ command('argedit a b')
+ eq({'a', 'b'}, eval('argv()'))
end)
it('test for :argdelete command', function()
reset_arglist()
- execute('args aa a aaa b bb')
- execute('argdelete a*')
+ command('args aa a aaa b bb')
+ command('argdelete a*')
eq({'b', 'bb'}, eval('argv()'))
eq('aa', eval('expand("%:t")'))
- execute('last')
- execute('argdelete %')
+ command('last')
+ command('argdelete %')
eq({'b'}, eval('argv()'))
assert_fails('argdelete', 'E471:')
assert_fails('1,100argdelete', 'E16:')
- execute('%argd')
+ command('%argd')
end)
it('test for the :next, :prev, :first, :last, :rewind commands', function()
reset_arglist()
- execute('args a b c d')
- execute('last')
+ command('args a b c d')
+ command('last')
eq(3, eval('argidx()'))
assert_fails('next', 'E165:')
- execute('prev')
+ command('prev')
eq(2, eval('argidx()'))
- execute('Next')
+ command('Next')
eq(1, eval('argidx()'))
- execute('first')
+ command('first')
eq(0, eval('argidx()'))
assert_fails('prev', 'E164:')
- execute('3next')
+ command('3next')
eq(3, eval('argidx()'))
- execute('rewind')
+ command('rewind')
eq(0, eval('argidx()'))
- execute('%argd')
+ command('%argd')
+ end)
+
+
+ it('test for autocommand that redefines the argument list, when doing ":all"', function()
+ command('autocmd BufReadPost Xxx2 next Xxx2 Xxx1')
+ command("call writefile(['test file Xxx1'], 'Xxx1')")
+ command("call writefile(['test file Xxx2'], 'Xxx2')")
+ command("call writefile(['test file Xxx3'], 'Xxx3')")
+
+ command('new')
+ -- redefine arglist; go to Xxx1
+ command('next! Xxx1 Xxx2 Xxx3')
+ -- open window for all args
+ command('all')
+ eq('test file Xxx1', eval('getline(1)'))
+ command('wincmd w')
+ command('wincmd w')
+ eq('test file Xxx1', eval('getline(1)'))
+ -- should now be in Xxx2
+ command('rewind')
+ eq('test file Xxx2', eval('getline(1)'))
+
+ command('autocmd! BufReadPost Xxx2')
+ command('enew! | only')
+ command("call delete('Xxx1')")
+ command("call delete('Xxx2')")
+ command("call delete('Xxx3')")
+ command('argdelete Xxx*')
+ command('bwipe! Xxx1 Xxx2 Xxx3')
end)
end)
diff --git a/test/functional/legacy/assert_spec.lua b/test/functional/legacy/assert_spec.lua
index 8da6ee45d7..10703465aa 100644
--- a/test/functional/legacy/assert_spec.lua
+++ b/test/functional/legacy/assert_spec.lua
@@ -1,7 +1,8 @@
local helpers = require('test.functional.helpers')(after_each)
local nvim, call = helpers.meths, helpers.call
local clear, eq = helpers.clear, helpers.eq
-local source, execute = helpers.source, helpers.execute
+local source, command = helpers.source, helpers.command
+local exc_exec = helpers.exc_exec
local function expected_errors(errors)
eq(errors, nvim.get_vvar('errors'))
@@ -54,7 +55,7 @@ describe('assert function:', function()
it('should change v:errors when expected is not equal to actual', function()
-- Lua does not tell integer from float.
- execute('call assert_equal(1, 1.0)')
+ command('call assert_equal(1, 1.0)')
expected_errors({'Expected 1 but got 1.0'})
end)
@@ -62,6 +63,39 @@ describe('assert function:', function()
call('assert_equal', 'true', 'false')
expected_errors({"Expected 'true' but got 'false'"})
end)
+
+ it('should change v:errors when expected is not equal to actual', function()
+ source([[
+ function CheckAssert()
+ let s:v = {}
+ let s:x = {"a": s:v}
+ let s:v["b"] = s:x
+ let s:w = {"c": s:x, "d": ''}
+ call assert_equal(s:w, '')
+ endfunction
+ ]])
+ eq('Vim(call):E724: unable to correctly dump variable with self-referencing container',
+ exc_exec('call CheckAssert()'))
+ end)
+
+ it('can specify a message and get a message about what failed', function()
+ call('assert_equal', 'foo', 'bar', 'testing')
+ expected_errors({"testing: Expected 'foo' but got 'bar'"})
+ end)
+ end)
+
+ -- assert_notequal({expected}, {actual}[, {msg}])
+ describe('assert_notequal', function()
+ it('should not change v:errors when expected differs from actual', function()
+ call('assert_notequal', 'foo', 4)
+ call('assert_notequal', {1, 2, 3}, 'foo')
+ expected_empty()
+ end)
+
+ it('should change v:errors when expected is equal to actual', function()
+ call('assert_notequal', 'foo', 'foo')
+ expected_errors({"Expected not equal to 'foo'"})
+ end)
end)
-- assert_false({actual}, [, {msg}])
@@ -135,10 +169,10 @@ describe('assert function:', function()
call assert_true('', 'file two')
]])
expected_errors({
- tmpname_one .. " line 1: 'equal assertion failed'",
- tmpname_one .. " line 2: 'true assertion failed'",
- tmpname_one .. " line 3: 'false assertion failed'",
- tmpname_two .. " line 1: 'file two'",
+ tmpname_one .. " line 1: equal assertion failed: Expected 1 but got 100",
+ tmpname_one .. " line 2: true assertion failed: Expected False but got 'true'",
+ tmpname_one .. " line 3: false assertion failed: Expected True but got 'false'",
+ tmpname_two .. " line 1: file two: Expected True but got ''",
})
end)
@@ -155,10 +189,43 @@ describe('assert function:', function()
end)
end)
+ -- assert_match({pat}, {text}[, {msg}])
+ describe('assert_match', function()
+ it('should not change v:errors when pat matches text', function()
+ call('assert_match', '^f.*b.*r$', 'foobar')
+ expected_empty()
+ end)
+
+ it('should change v:errors when pat does not match text', function()
+ call('assert_match', 'bar.*foo', 'foobar')
+ expected_errors({"Pattern 'bar.*foo' does not match 'foobar'"})
+ end)
+
+ it('should set v:errors to msg when given and match fails', function()
+ call('assert_match', 'bar.*foo', 'foobar', 'wrong')
+ expected_errors({"wrong: Pattern 'bar.*foo' does not match 'foobar'"})
+ end)
+ end)
+
+ -- assert_notmatch({pat}, {text}[, {msg}])
+ describe('assert_notmatch', function()
+ it('should not change v:errors when pat does not match text', function()
+ call('assert_notmatch', 'foo', 'bar')
+ call('assert_notmatch', '^foobar$', 'foobars')
+ expected_empty()
+ end)
+
+ it('should change v:errors when pat matches text', function()
+ call('assert_notmatch', 'foo', 'foobar')
+ expected_errors({"Pattern 'foo' does match 'foobar'"})
+ end)
+ end)
+
-- assert_fails({cmd}, [, {error}])
describe('assert_fails', function()
it('should change v:errors when error does not match v:errmsg', function()
- execute([[call assert_fails('xxx', {})]])
+ command([[call assert_fails('xxx', {})]])
+ command([[call assert_match("Expected {} but got 'E731:", v:errors[0])]])
expected_errors({"Expected {} but got 'E731: using Dictionary as a String'"})
end)
@@ -173,6 +240,41 @@ describe('assert function:', function()
end)
end)
+ -- assert_inrange({lower}, {upper}, {actual}[, {msg}])
+ describe('assert_inrange()', function()
+ it('should not change v:errors when actual is in range', function()
+ call('assert_inrange', 7, 7, 7)
+ call('assert_inrange', 5, 7, 5)
+ call('assert_inrange', 5, 7, 6)
+ call('assert_inrange', 5, 7, 7)
+ expected_empty()
+ end)
+
+ it('should change v:errors when actual is not in range', function()
+ call('assert_inrange', 5, 7, 4)
+ call('assert_inrange', 5, 7, 8)
+ expected_errors({
+ "Expected range 5 - 7, but got 4",
+ "Expected range 5 - 7, but got 8",
+ })
+ end)
+
+ it('assert_inrange(1, 1) returns E119', function()
+ eq('Vim(call):E119: Not enough arguments for function: assert_inrange',
+ exc_exec("call assert_inrange(1, 1)"))
+ end)
+ end)
+
+ -- assert_report({msg})
+ describe('assert_report()', function()
+ it('should add a message to v:errors', function()
+ command("call assert_report('something is wrong')")
+ command("call assert_match('something is wrong', v:errors[0])")
+ command('call remove(v:errors, 0)')
+ expected_empty()
+ end)
+ end)
+
-- assert_exception({cmd}, [, {error}])
describe('assert_exception()', function()
it('should assert thrown exceptions properly', function()
diff --git a/test/functional/legacy/autochdir_spec.lua b/test/functional/legacy/autochdir_spec.lua
new file mode 100644
index 0000000000..466e3ed830
--- /dev/null
+++ b/test/functional/legacy/autochdir_spec.lua
@@ -0,0 +1,26 @@
+local lfs = require('lfs')
+local helpers = require('test.functional.helpers')(after_each)
+local clear, eq = helpers.clear, helpers.eq
+local eval, command = helpers.eval, helpers.command
+
+describe('autochdir behavior', function()
+ local dir = 'Xtest-functional-legacy-autochdir'
+
+ before_each(function()
+ lfs.mkdir(dir)
+ clear()
+ end)
+
+ after_each(function()
+ helpers.rmdir(dir)
+ end)
+
+ -- Tests vim/vim/777 without test_autochdir().
+ it('sets filename', function()
+ command('set acd')
+ command('new')
+ command('w '..dir..'/Xtest')
+ eq('Xtest', eval("expand('%')"))
+ eq(dir, eval([[substitute(getcwd(), '.*[/\\]\(\k*\)', '\1', '')]]))
+ end)
+end)
diff --git a/test/functional/legacy/autocmd_option_spec.lua b/test/functional/legacy/autocmd_option_spec.lua
index 28037e17c5..0c7e43bf31 100644
--- a/test/functional/legacy/autocmd_option_spec.lua
+++ b/test/functional/legacy/autocmd_option_spec.lua
@@ -4,7 +4,7 @@ local clear, eq, neq = helpers.clear, helpers.eq, helpers.neq
local curbuf, buf = helpers.curbuf, helpers.bufmeths
local curwin = helpers.curwin
local redir_exec = helpers.redir_exec
-local source, execute = helpers.source, helpers.execute
+local source, command = helpers.source, helpers.command
local function declare_hook_function()
source([[
@@ -23,9 +23,9 @@ local function declare_hook_function()
endfu
]])
end
-
+
local function set_hook(pattern)
- execute(
+ command(
'au OptionSet '
.. pattern ..
' :call AutoCommand(expand("<amatch>"), bufnr("%"), winnr())'
@@ -33,7 +33,7 @@ local function set_hook(pattern)
end
local function init_var()
- execute('let g:ret = []')
+ command('let g:ret = []')
end
local function get_result()
@@ -88,9 +88,9 @@ end
local function make_buffer()
local old_buf = curbuf()
- execute('botright new')
+ command('botright new')
local new_buf = curbuf()
- execute('wincmd p') -- move previous window
+ command('wincmd p') -- move previous window
neq(old_buf, new_buf)
eq(old_buf, curbuf())
@@ -100,10 +100,10 @@ end
local function get_new_window_number()
local old_win = curwin()
- execute('botright new')
+ command('botright new')
local new_win = curwin()
local new_winnr = redir_exec('echo winnr()')
- execute('wincmd p') -- move previous window
+ command('wincmd p') -- move previous window
neq(old_win, new_win)
eq(old_win, curwin())
@@ -122,42 +122,42 @@ describe('au OptionSet', function()
end)
it('should be called in setting number option', function()
- execute('set nu')
+ command('set nu')
expected_combination({'number', 0, 1, 'global'})
- execute('setlocal nonu')
+ command('setlocal nonu')
expected_combination({'number', 1, 0, 'local'})
- execute('setglobal nonu')
+ command('setglobal nonu')
expected_combination({'number', 1, 0, 'global'})
end)
it('should be called in setting autoindent option',function()
- execute('setlocal ai')
+ command('setlocal ai')
expected_combination({'autoindent', 0, 1, 'local'})
- execute('setglobal ai')
+ command('setglobal ai')
expected_combination({'autoindent', 0, 1, 'global'})
- execute('set noai')
+ command('set noai')
expected_combination({'autoindent', 1, 0, 'global'})
end)
it('should be called in inverting global autoindent option',function()
- execute('set ai!')
+ command('set ai!')
expected_combination({'autoindent', 0, 1, 'global'})
end)
it('should be called in being unset local autoindent option',function()
- execute('setlocal ai')
+ command('setlocal ai')
expected_combination({'autoindent', 0, 1, 'local'})
- execute('setlocal ai<')
+ command('setlocal ai<')
expected_combination({'autoindent', 1, 0, 'local'})
end)
it('should be called in setting global list and number option at the same time',function()
- execute('set list nu')
+ command('set list nu')
expected_combination(
{'list', 0, 1, 'global'},
{'number', 0, 1, 'global'}
@@ -165,41 +165,41 @@ describe('au OptionSet', function()
end)
it('should not print anything, use :noa', function()
- execute('noa set nolist nonu')
+ command('noa set nolist nonu')
expected_empty()
end)
it('should be called in setting local acd', function()
- execute('setlocal acd')
+ command('setlocal acd')
expected_combination({'autochdir', 0, 1, 'local'})
end)
it('should be called in setting autoread', function()
- execute('set noar')
+ command('set noar')
expected_combination({'autoread', 1, 0, 'global'})
- execute('setlocal ar')
+ command('setlocal ar')
expected_combination({'autoread', 0, 1, 'local'})
end)
it('should be called in inverting global autoread', function()
- execute('setglobal invar')
+ command('setglobal invar')
expected_combination({'autoread', 1, 0, 'global'})
end)
it('should be called in setting backspace option through :let', function()
- execute('let &bs=""')
+ command('let &bs=""')
expected_combination({'backspace', 'indent,eol,start', '', 'global'})
end)
describe('being set by setbufvar()', function()
it('should not trigger because option name is invalid', function()
- execute('call setbufvar(1, "&l:bk", 1)')
+ command('silent! call setbufvar(1, "&l:bk", 1)')
expected_empty()
end)
it('should trigger using correct option name', function()
- execute('call setbufvar(1, "&backup", 1)')
+ command('call setbufvar(1, "&backup", 1)')
expected_combination({'backup', 0, 1, 'local'})
end)
@@ -207,7 +207,7 @@ describe('au OptionSet', function()
local new_buffer = make_buffer()
local new_bufnr = buf.get_number(new_buffer)
- execute('call setbufvar(' .. new_bufnr .. ', "&buftype", "nofile")')
+ command('call setbufvar(' .. new_bufnr .. ', "&buftype", "nofile")')
expected_combination({'buftype', '', 'nofile', 'local', {bufnr = new_bufnr}})
end)
end)
@@ -224,16 +224,16 @@ describe('au OptionSet', function()
it('should be called iff setting readonly', function()
set_hook('readonly')
- execute('set nu')
+ command('set nu')
expected_empty()
- execute('setlocal ro')
+ command('setlocal ro')
expected_combination({'readonly', 0, 1, 'local'})
- execute('setglobal ro')
+ command('setglobal ro')
expected_combination({'readonly', 0, 1, 'global'})
- execute('set noro')
+ command('set noro')
expected_combination({'readonly', 1, 0, 'global'})
end)
@@ -241,14 +241,14 @@ describe('au OptionSet', function()
it('should not trigger because option name does not match with backup', function()
set_hook('backup')
- execute('call setbufvar(1, "&l:bk", 1)')
+ command('silent! call setbufvar(1, "&l:bk", 1)')
expected_empty()
end)
it('should trigger, use correct option name backup', function()
set_hook('backup')
- execute('call setbufvar(1, "&backup", 1)')
+ command('call setbufvar(1, "&backup", 1)')
expected_combination({'backup', 0, 1, 'local'})
end)
@@ -258,7 +258,7 @@ describe('au OptionSet', function()
local new_buffer = make_buffer()
local new_bufnr = buf.get_number(new_buffer)
- execute('call setbufvar(' .. new_bufnr .. ', "&buftype", "nofile")')
+ command('call setbufvar(' .. new_bufnr .. ', "&buftype", "nofile")')
expected_combination({'buftype', '', 'nofile', 'local', {bufnr = new_bufnr}})
end)
end)
@@ -267,14 +267,14 @@ describe('au OptionSet', function()
it('should not trigger because option name does not match with backup', function()
set_hook('backup')
- execute('call setwinvar(1, "&l:bk", 1)')
+ command('silent! call setwinvar(1, "&l:bk", 1)')
expected_empty()
end)
it('should trigger, use correct option name backup', function()
set_hook('backup')
- execute('call setwinvar(1, "&backup", 1)')
+ command('call setwinvar(1, "&backup", 1)')
expected_combination({'backup', 0, 1, 'local'})
end)
@@ -283,7 +283,7 @@ describe('au OptionSet', function()
local new_winnr = get_new_window_number()
- execute('call setwinvar(' .. new_winnr .. ', "&cursorcolumn", 1)')
+ command('call setwinvar(' .. new_winnr .. ', "&cursorcolumn", 1)')
-- expected_combination({'cursorcolumn', 0, 1, 'local', {winnr = new_winnr}})
expected_empty()
end)
diff --git a/test/functional/legacy/autoformat_join_spec.lua b/test/functional/legacy/autoformat_join_spec.lua
index 4110d66f5b..84d661c190 100644
--- a/test/functional/legacy/autoformat_join_spec.lua
+++ b/test/functional/legacy/autoformat_join_spec.lua
@@ -1,9 +1,9 @@
--- vim: set foldmethod=marker foldmarker=[[,]] :
-- Tests for setting the '[,'] marks when joining lines.
local helpers = require('test.functional.helpers')(after_each)
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, expect = helpers.execute, helpers.expect
+local command, expect = helpers.command, helpers.expect
+local wait = helpers.wait
describe('autoformat join', function()
setup(clear)
@@ -21,12 +21,13 @@ Results:]])
feed('gg')
feed('0gqj<cr>')
+ wait()
- execute([[let a=string(getpos("'[")).'/'.string(getpos("']"))]])
- execute("g/^This line/;'}-join")
- execute([[let b=string(getpos("'[")).'/'.string(getpos("']"))]])
- execute("$put ='First test: Start/End '.string(a)")
- execute("$put ='Second test: Start/End '.string(b)")
+ command([[let a=string(getpos("'[")).'/'.string(getpos("']"))]])
+ command("g/^This line/;'}-join")
+ command([[let b=string(getpos("'[")).'/'.string(getpos("']"))]])
+ command("$put ='First test: Start/End '.string(a)")
+ command("$put ='Second test: Start/End '.string(b)")
expect([[
O sodales, ludite, vos qui attamen consulite per voster honur.
diff --git a/test/functional/legacy/breakindent_spec.lua b/test/functional/legacy/breakindent_spec.lua
index 2504fe8e51..fd25e809e0 100644
--- a/test/functional/legacy/breakindent_spec.lua
+++ b/test/functional/legacy/breakindent_spec.lua
@@ -2,194 +2,197 @@
local helpers = require('test.functional.helpers')(after_each)
local feed, insert = helpers.feed, helpers.insert
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
describe('breakindent', function()
setup(clear)
+ -- luacheck: ignore 621 (Indentation)
+ -- luacheck: ignore 613 (Trailing whitespace in a string)
+ -- luacheck: ignore 611 (Line contains only whitespaces)
it('is working', function()
insert('dummy text')
- execute('set wildchar=^E')
- execute('10new')
- execute('vsp')
- execute('vert resize 20')
- execute([[put =\"\tabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP\"]])
- execute('set ts=4 sw=4 sts=4 breakindent')
- execute('fu! ScreenChar(line, width)')
- execute(' let c=""')
- execute(' for i in range(1,a:width)')
- execute(' let c.=nr2char(screenchar(a:line, i))')
- execute(' endfor')
- execute([[ let c.="\n"]])
- execute(' for i in range(1,a:width)')
- execute(' let c.=nr2char(screenchar(a:line+1, i))')
- execute(' endfor')
- execute([[ let c.="\n"]])
- execute(' for i in range(1,a:width)')
- execute(' let c.=nr2char(screenchar(a:line+2, i))')
- execute(' endfor')
- execute(' return c')
- execute('endfu')
- execute('fu DoRecordScreen()')
- execute(' wincmd l')
- execute([[ $put =printf(\"\n%s\", g:test)]])
- execute(' $put =g:line1')
- execute(' wincmd p')
- execute('endfu')
- execute('set briopt=min:0')
- execute('let g:test="Test 1: Simple breakindent"')
- execute('let line1=ScreenChar(line("."),8)')
- execute('call DoRecordScreen()')
- execute('let g:test="Test 2: Simple breakindent + sbr=>>"')
- execute('set sbr=>>')
- execute('let line1=ScreenChar(line("."),8)')
- execute('call DoRecordScreen()')
- execute('let g:test ="Test 3: Simple breakindent + briopt:sbr"')
- execute('set briopt=sbr,min:0 sbr=++')
- execute('let line1=ScreenChar(line("."),8)')
- execute('call DoRecordScreen()')
- execute('let g:test ="Test 4: Simple breakindent + min width: 18"')
- execute('set sbr= briopt=min:18')
- execute('let line1=ScreenChar(line("."),8)')
- execute('call DoRecordScreen()')
- execute('let g:test =" Test 5: Simple breakindent + shift by 2"')
- execute('set briopt=shift:2,min:0')
- execute('let line1=ScreenChar(line("."),8)')
- execute('call DoRecordScreen()')
- execute('let g:test=" Test 6: Simple breakindent + shift by -1"')
- execute('set briopt=shift:-1,min:0')
- execute('let line1=ScreenChar(line("."),8)')
- execute('call DoRecordScreen()')
- execute('let g:test=" Test 7: breakindent + shift by +1 + nu + sbr=? briopt:sbr"')
- execute('set briopt=shift:1,sbr,min:0 nu sbr=? nuw=4')
- execute('let line1=ScreenChar(line("."),10)')
- execute('call DoRecordScreen()')
- execute('let g:test=" Test 8: breakindent + shift:1 + nu + sbr=# list briopt:sbr"')
- execute('set briopt=shift:1,sbr,min:0 nu sbr=# list lcs&vi')
- execute('let line1=ScreenChar(line("."),10)')
- execute('call DoRecordScreen()')
- execute([[let g:test=" Test 9: breakindent + shift by +1 + 'nu' + sbr=# list"]])
- execute('set briopt-=sbr')
- execute('let line1=ScreenChar(line("."),10)')
- execute('call DoRecordScreen()')
- execute([[let g:test=" Test 10: breakindent + shift by +1 + 'nu' + sbr=~ cpo+=n"]])
- execute('set cpo+=n sbr=~ nu nuw=4 nolist briopt=sbr,min:0')
- execute('let line1=ScreenChar(line("."),10)')
- execute('call DoRecordScreen()')
- execute('wincmd p')
- execute([[let g:test="\n Test 11: strdisplaywidth when breakindent is on"]])
- execute('set cpo-=n sbr=>> nu nuw=4 nolist briopt= ts=4')
+ feed_command('set wildchar=^E')
+ feed_command('10new')
+ feed_command('vsp')
+ feed_command('vert resize 20')
+ feed_command([[put =\"\tabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP\"]])
+ feed_command('set ts=4 sw=4 sts=4 breakindent')
+ feed_command('fu! ScreenChar(line, width)')
+ feed_command(' let c=""')
+ feed_command(' for i in range(1,a:width)')
+ feed_command(' let c.=nr2char(screenchar(a:line, i))')
+ feed_command(' endfor')
+ feed_command([[ let c.="\n"]])
+ feed_command(' for i in range(1,a:width)')
+ feed_command(' let c.=nr2char(screenchar(a:line+1, i))')
+ feed_command(' endfor')
+ feed_command([[ let c.="\n"]])
+ feed_command(' for i in range(1,a:width)')
+ feed_command(' let c.=nr2char(screenchar(a:line+2, i))')
+ feed_command(' endfor')
+ feed_command(' return c')
+ feed_command('endfu')
+ feed_command('fu DoRecordScreen()')
+ feed_command(' wincmd l')
+ feed_command([[ $put =printf(\"\n%s\", g:test)]])
+ feed_command(' $put =g:line1')
+ feed_command(' wincmd p')
+ feed_command('endfu')
+ feed_command('set briopt=min:0')
+ feed_command('let g:test="Test 1: Simple breakindent"')
+ feed_command('let line1=ScreenChar(line("."),8)')
+ feed_command('call DoRecordScreen()')
+ feed_command('let g:test="Test 2: Simple breakindent + sbr=>>"')
+ feed_command('set sbr=>>')
+ feed_command('let line1=ScreenChar(line("."),8)')
+ feed_command('call DoRecordScreen()')
+ feed_command('let g:test ="Test 3: Simple breakindent + briopt:sbr"')
+ feed_command('set briopt=sbr,min:0 sbr=++')
+ feed_command('let line1=ScreenChar(line("."),8)')
+ feed_command('call DoRecordScreen()')
+ feed_command('let g:test ="Test 4: Simple breakindent + min width: 18"')
+ feed_command('set sbr= briopt=min:18')
+ feed_command('let line1=ScreenChar(line("."),8)')
+ feed_command('call DoRecordScreen()')
+ feed_command('let g:test =" Test 5: Simple breakindent + shift by 2"')
+ feed_command('set briopt=shift:2,min:0')
+ feed_command('let line1=ScreenChar(line("."),8)')
+ feed_command('call DoRecordScreen()')
+ feed_command('let g:test=" Test 6: Simple breakindent + shift by -1"')
+ feed_command('set briopt=shift:-1,min:0')
+ feed_command('let line1=ScreenChar(line("."),8)')
+ feed_command('call DoRecordScreen()')
+ feed_command('let g:test=" Test 7: breakindent + shift by +1 + nu + sbr=? briopt:sbr"')
+ feed_command('set briopt=shift:1,sbr,min:0 nu sbr=? nuw=4')
+ feed_command('let line1=ScreenChar(line("."),10)')
+ feed_command('call DoRecordScreen()')
+ feed_command('let g:test=" Test 8: breakindent + shift:1 + nu + sbr=# list briopt:sbr"')
+ feed_command('set briopt=shift:1,sbr,min:0 nu sbr=# list lcs&vi')
+ feed_command('let line1=ScreenChar(line("."),10)')
+ feed_command('call DoRecordScreen()')
+ feed_command([[let g:test=" Test 9: breakindent + shift by +1 + 'nu' + sbr=# list"]])
+ feed_command('set briopt-=sbr')
+ feed_command('let line1=ScreenChar(line("."),10)')
+ feed_command('call DoRecordScreen()')
+ feed_command([[let g:test=" Test 10: breakindent + shift by +1 + 'nu' + sbr=~ cpo+=n"]])
+ feed_command('set cpo+=n sbr=~ nu nuw=4 nolist briopt=sbr,min:0')
+ feed_command('let line1=ScreenChar(line("."),10)')
+ feed_command('call DoRecordScreen()')
+ feed_command('wincmd p')
+ feed_command([[let g:test="\n Test 11: strdisplaywidth when breakindent is on"]])
+ feed_command('set cpo-=n sbr=>> nu nuw=4 nolist briopt= ts=4')
-- Skip leading tab when calculating text width.
- execute('let text=getline(2)')
+ feed_command('let text=getline(2)')
-- Text wraps 3 times.
- execute('let width = strlen(text[1:])+indent(2)*4+strlen(&sbr)*3')
- execute('$put =g:test')
- execute([[$put =printf(\"strdisplaywidth: %d == calculated: %d\", strdisplaywidth(text), width)]])
- execute([[let g:str="\t\t\t\t\t{"]])
- execute('let g:test=" Test 12: breakindent + long indent"')
- execute('wincmd p')
- execute('set all& breakindent linebreak briopt=min:10 nu numberwidth=3 ts=4')
- execute('$put =g:str')
+ feed_command('let width = strlen(text[1:])+indent(2)*4+strlen(&sbr)*3')
+ feed_command('$put =g:test')
+ feed_command([[$put =printf(\"strdisplaywidth: %d == calculated: %d\", strdisplaywidth(text), width)]])
+ feed_command([[let g:str="\t\t\t\t\t{"]])
+ feed_command('let g:test=" Test 12: breakindent + long indent"')
+ feed_command('wincmd p')
+ feed_command('set all& breakindent linebreak briopt=min:10 nu numberwidth=3 ts=4')
+ feed_command('$put =g:str')
feed('zt')
- execute('let line1=ScreenChar(1,10)')
- execute('wincmd p')
- execute('call DoRecordScreen()')
+ feed_command('let line1=ScreenChar(1,10)')
+ feed_command('wincmd p')
+ feed_command('call DoRecordScreen()')
-- Test, that the string " a\tb\tc\td\te" is correctly displayed in a
-- 20 column wide window (see bug report
-- https://groups.google.com/d/msg/vim_dev/ZOdg2mc9c9Y/TT8EhFjEy0IJ ).
- execute('only')
- execute('vert 20new')
- execute('set all& breakindent briopt=min:10')
- execute([[call setline(1, [" a\tb\tc\td\te", " z y x w v"])]])
- execute([[/^\s*a]])
+ feed_command('only')
+ feed_command('vert 20new')
+ feed_command('set all& breakindent briopt=min:10')
+ feed_command([[call setline(1, [" a\tb\tc\td\te", " z y x w v"])]])
+ feed_command([[/^\s*a]])
feed('fbgjyl')
- execute('let line1 = @0')
- execute([[?^\s*z]])
+ feed_command('let line1 = @0')
+ feed_command([[?^\s*z]])
feed('fygjyl')
- execute('let line2 = @0')
- execute('quit!')
- execute([[$put ='Test 13: breakindent with wrapping Tab']])
- execute('$put =line1')
- execute('$put =line2')
-
- execute('let g:test="Test 14: breakindent + visual blockwise delete #1"')
- execute('set all& breakindent shada+=nX-test-breakindent.shada')
- execute('30vnew')
- execute('normal! 3a1234567890')
- execute('normal! a abcde')
- execute([[exec "normal! 0\<C-V>tex"]])
- execute('let line1=ScreenChar(line("."),8)')
- execute('call DoRecordScreen()')
-
- execute('let g:test="Test 15: breakindent + visual blockwise delete #2"')
- execute('%d')
- execute('normal! 4a1234567890')
- execute([[exec "normal! >>\<C-V>3f0x"]])
- execute('let line1=ScreenChar(line("."),20)')
- execute('call DoRecordScreen()')
- execute('quit!')
+ feed_command('let line2 = @0')
+ feed_command('quit!')
+ feed_command([[$put ='Test 13: breakindent with wrapping Tab']])
+ feed_command('$put =line1')
+ feed_command('$put =line2')
+
+ feed_command('let g:test="Test 14: breakindent + visual blockwise delete #1"')
+ feed_command('set all& breakindent shada+=nX-test-breakindent.shada')
+ feed_command('30vnew')
+ feed_command('normal! 3a1234567890')
+ feed_command('normal! a abcde')
+ feed_command([[exec "normal! 0\<C-V>tex"]])
+ feed_command('let line1=ScreenChar(line("."),8)')
+ feed_command('call DoRecordScreen()')
+
+ feed_command('let g:test="Test 15: breakindent + visual blockwise delete #2"')
+ feed_command('%d')
+ feed_command('normal! 4a1234567890')
+ feed_command([[exec "normal! >>\<C-V>3f0x"]])
+ feed_command('let line1=ScreenChar(line("."),20)')
+ feed_command('call DoRecordScreen()')
+ feed_command('quit!')
-- Assert buffer contents.
expect([[
-
+
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP
-
+
Test 1: Simple breakindent
abcd
qrst
GHIJ
-
+
Test 2: Simple breakindent + sbr=>>
abcd
>>qr
>>EF
-
+
Test 3: Simple breakindent + briopt:sbr
abcd
++ qrst
++ GHIJ
-
+
Test 4: Simple breakindent + min width: 18
abcd
qrstuv
IJKLMN
-
+
Test 5: Simple breakindent + shift by 2
abcd
qr
EF
-
+
Test 6: Simple breakindent + shift by -1
abcd
qrstu
HIJKL
-
+
Test 7: breakindent + shift by +1 + nu + sbr=? briopt:sbr
2 ab
? m
? x
-
+
Test 8: breakindent + shift:1 + nu + sbr=# list briopt:sbr
2 ^Iabcd
# opq
# BCD
-
+
Test 9: breakindent + shift by +1 + 'nu' + sbr=# list
2 ^Iabcd
#op
#AB
-
+
Test 10: breakindent + shift by +1 + 'nu' + sbr=~ cpo+=n
2 ab
~ mn
~ yz
-
+
Test 11: strdisplaywidth when breakindent is on
strdisplaywidth: 46 == calculated: 64
{
-
+
Test 12: breakindent + long indent
56
@@ -197,12 +200,12 @@ describe('breakindent', function()
Test 13: breakindent with wrapping Tab
d
w
-
+
Test 14: breakindent + visual blockwise delete #1
e
~
~
-
+
Test 15: breakindent + visual blockwise delete #2
1234567890
~
diff --git a/test/functional/legacy/changelist_spec.lua b/test/functional/legacy/changelist_spec.lua
index c718da3736..72c9872163 100644
--- a/test/functional/legacy/changelist_spec.lua
+++ b/test/functional/legacy/changelist_spec.lua
@@ -3,7 +3,7 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, expect = helpers.execute, helpers.expect
+local feed_command, expect = helpers.feed_command, helpers.expect
describe('changelist', function()
setup(clear)
@@ -12,14 +12,14 @@ describe('changelist', function()
insert("1\n2")
feed('Gkylp')
- execute('set ul=100')
+ feed_command('set ul=100')
feed('Gylp')
- execute('set ul=100')
+ feed_command('set ul=100')
feed('gg')
- execute('vsplit')
- execute('try', 'normal g;', 'normal ggVGcpass', 'catch', 'normal ggVGcfail', 'endtry')
+ feed_command('vsplit')
+ feed_command('try', 'normal g;', 'normal ggVGcpass', 'catch', 'normal ggVGcfail', 'endtry')
expect('pass')
end)
diff --git a/test/functional/legacy/charsearch_spec.lua b/test/functional/legacy/charsearch_spec.lua
index ef3369728d..c1a59c9ee1 100644
--- a/test/functional/legacy/charsearch_spec.lua
+++ b/test/functional/legacy/charsearch_spec.lua
@@ -2,7 +2,7 @@
local helpers = require('test.functional.helpers')(after_each)
local feed, insert = helpers.feed, helpers.insert
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
describe('charsearch', function()
setup(clear)
@@ -14,23 +14,23 @@ describe('charsearch', function()
Zabcdefghijkemnokqretkvwxyz]])
-- Check that "fe" and ";" work.
- execute('/^X')
+ feed_command('/^X')
feed('ylfep;;p,,p')
-- Check that save/restore works.
- execute('/^Y')
+ feed_command('/^Y')
feed('ylfep')
- execute('let csave = getcharsearch()')
+ feed_command('let csave = getcharsearch()')
feed('fip')
- execute('call setcharsearch(csave)')
+ feed_command('call setcharsearch(csave)')
feed(';p;p')
-- Check that setcharsearch() changes the settings.
- execute('/^Z')
+ feed_command('/^Z')
feed('ylfep')
- execute("call setcharsearch({'char': 'k'})")
+ feed_command("call setcharsearch({'char': 'k'})")
feed(';p')
- execute("call setcharsearch({'forward': 0})")
+ feed_command("call setcharsearch({'forward': 0})")
feed('$;p')
- execute("call setcharsearch({'until': 1})")
+ feed_command("call setcharsearch({'until': 1})")
feed(';;p')
-- Assert buffer contents.
diff --git a/test/functional/legacy/close_count_spec.lua b/test/functional/legacy/close_count_spec.lua
index ad1812f22e..9b932e2ef0 100644
--- a/test/functional/legacy/close_count_spec.lua
+++ b/test/functional/legacy/close_count_spec.lua
@@ -1,133 +1,134 @@
-- Tests for :[count]close! and :[count]hide
local helpers = require('test.functional.helpers')(after_each)
-local feed, eval, eq, clear, execute =
- helpers.feed, helpers.eval, helpers.eq, helpers.clear, helpers.execute
+
+local eq = helpers.eq
+local wait = helpers.wait
+local eval = helpers.eval
+local feed = helpers.feed
+local clear = helpers.clear
+local command = helpers.command
describe('close_count', function()
setup(clear)
it('is working', function()
- execute('let tests = []')
- execute('for i in range(5)')
- execute('new')
- execute('endfor')
- execute('4wincmd w')
- execute('close!')
- execute('let buffers = []')
- execute('windo call add(buffers, bufnr("%"))')
+ command('let tests = []')
+ command('for i in range(5)|new|endfor')
+ command('4wincmd w')
+ command('close!')
+ command('let buffers = []')
+ command('windo call add(buffers, bufnr("%"))')
eq({6, 5, 4, 2, 1}, eval('buffers'))
- execute('1close!')
- execute('let buffers = []')
- execute('windo call add(buffers, bufnr("%"))')
+ command('1close!')
+ command('let buffers = []')
+ command('windo call add(buffers, bufnr("%"))')
eq({5, 4, 2, 1}, eval('buffers'))
- execute('$close!')
- execute('let buffers = []')
- execute('windo call add(buffers, bufnr("%"))')
+ command('$close!')
+ command('let buffers = []')
+ command('windo call add(buffers, bufnr("%"))')
eq({5, 4, 2}, eval('buffers'))
- execute('1wincmd w')
- execute('2close!')
- execute('let buffers = []')
- execute('windo call add(buffers, bufnr("%"))')
+ command('1wincmd w')
+ command('2close!')
+ command('let buffers = []')
+ command('windo call add(buffers, bufnr("%"))')
eq({5, 2}, eval('buffers'))
- execute('1wincmd w')
- execute('new')
- execute('new')
- execute('2wincmd w')
- execute('-1close!')
- execute('let buffers = []')
- execute('windo call add(buffers, bufnr("%"))')
+ command('1wincmd w')
+ command('new')
+ command('new')
+ command('2wincmd w')
+ command('-1close!')
+ command('let buffers = []')
+ command('windo call add(buffers, bufnr("%"))')
eq({7, 5, 2}, eval('buffers'))
- execute('2wincmd w')
- execute('+1close!')
- execute('let buffers = []')
- execute('windo call add(buffers, bufnr("%"))')
+ command('2wincmd w')
+ command('+1close!')
+ command('let buffers = []')
+ command('windo call add(buffers, bufnr("%"))')
eq({7, 5}, eval('buffers'))
- execute('only!')
- execute('b1')
- execute('let tests = []')
- execute('for i in range(5)')
- execute('new')
- execute('endfor')
- execute('let buffers = []')
- execute('windo call add(buffers, bufnr("%"))')
+ command('only!')
+ command('b1')
+ command('let tests = []')
+ command('for i in range(5)|new|endfor')
+ command('let buffers = []')
+ command('windo call add(buffers, bufnr("%"))')
eq({13, 12, 11, 10, 9, 1}, eval('buffers'))
- execute('4wincmd w')
- execute('.hide')
- execute('let buffers = []')
- execute('windo call add(buffers, bufnr("%"))')
+ command('4wincmd w')
+ command('.hide')
+ command('let buffers = []')
+ command('windo call add(buffers, bufnr("%"))')
eq({13, 12, 11, 9, 1}, eval('buffers'))
- execute('1hide')
- execute('let buffers = []')
- execute('windo call add(buffers, bufnr("%"))')
+ command('1hide')
+ command('let buffers = []')
+ command('windo call add(buffers, bufnr("%"))')
eq({12, 11, 9, 1}, eval('buffers'))
- execute('$hide')
- execute('let buffers = []')
- execute('windo call add(buffers, bufnr("%"))')
+ command('$hide')
+ command('let buffers = []')
+ command('windo call add(buffers, bufnr("%"))')
eq({12, 11, 9}, eval('buffers'))
- execute('1wincmd w')
- execute('2hide')
- execute('let buffers = []')
- execute('windo call add(buffers, bufnr("%"))')
+ command('1wincmd w')
+ command('2hide')
+ command('let buffers = []')
+ command('windo call add(buffers, bufnr("%"))')
eq({12, 9}, eval('buffers'))
- execute('1wincmd w')
- execute('new')
- execute('new')
- execute('3wincmd w')
- execute('-hide')
- execute('let buffers = []')
- execute('windo call add(buffers, bufnr("%"))')
+ command('1wincmd w')
+ command('new')
+ command('new')
+ command('3wincmd w')
+ command('-hide')
+ command('let buffers = []')
+ command('windo call add(buffers, bufnr("%"))')
eq({15, 12, 9}, eval('buffers'))
- execute('2wincmd w')
- execute('+hide')
- execute('let buffers = []')
- execute('windo call add(buffers, bufnr("%"))')
+ command('2wincmd w')
+ command('+hide')
+ command('let buffers = []')
+ command('windo call add(buffers, bufnr("%"))')
eq({15, 12}, eval('buffers'))
- execute('only!')
- execute('b1')
- execute('let tests = []')
- execute('set hidden')
- execute('for i in range(5)')
- execute('new')
- execute('endfor')
- execute('1wincmd w')
- execute('$ hide')
- execute('let buffers = []')
- execute('windo call add(buffers, bufnr("%"))')
+ command('only!')
+ command('b1')
+ command('let tests = []')
+ command('set hidden')
+ command('for i in range(5)|new|endfor')
+ command('1wincmd w')
+ command('$ hide')
+ command('let buffers = []')
+ command('windo call add(buffers, bufnr("%"))')
eq({20, 19, 18, 17, 16}, eval('buffers'))
- execute('$-1 close!')
- execute('let buffers = []')
- execute('windo call add(buffers, bufnr("%"))')
+ command('$-1 close!')
+ command('let buffers = []')
+ command('windo call add(buffers, bufnr("%"))')
eq({20, 19, 18, 16}, eval('buffers'))
- execute('1wincmd w')
- execute('.+close!')
- execute('let buffers = []')
- execute('windo call add(buffers, bufnr("%"))')
+ command('1wincmd w')
+ command('.+close!')
+ command('let buffers = []')
+ command('windo call add(buffers, bufnr("%"))')
eq({20, 18, 16}, eval('buffers'))
- execute('only!')
- execute('b1')
- execute('let tests = []')
- execute('set hidden')
- execute('for i in range(5)')
- execute('new')
- execute('endfor')
- execute('4wincmd w')
+ command('only!')
+ command('b1')
+ command('let tests = []')
+ command('set hidden')
+ command('for i in range(5)|new|endfor')
+ command('4wincmd w')
feed('<C-W>c<cr>')
- execute('let buffers = []')
- execute('windo call add(buffers, bufnr("%"))')
+ wait()
+ command('let buffers = []')
+ command('windo call add(buffers, bufnr("%"))')
eq({25, 24, 23, 21, 1}, eval('buffers'))
feed('1<C-W>c<cr>')
- execute('let buffers = []')
- execute('windo call add(buffers, bufnr("%"))')
+ wait()
+ command('let buffers = []')
+ command('windo call add(buffers, bufnr("%"))')
eq({24, 23, 21, 1}, eval('buffers'))
feed('9<C-W>c<cr>')
- execute('let buffers = []')
- execute('windo call add(buffers, bufnr("%"))')
+ wait()
+ command('let buffers = []')
+ command('windo call add(buffers, bufnr("%"))')
eq({24, 23, 21}, eval('buffers'))
- execute('1wincmd w')
+ command('1wincmd w')
feed('2<C-W>c<cr>')
- execute('let buffers = []')
- execute('windo call add(buffers, bufnr("%"))')
+ wait()
+ command('let buffers = []')
+ command('windo call add(buffers, bufnr("%"))')
eq({24, 21}, eval('buffers'))
end)
end)
diff --git a/test/functional/legacy/command_count_spec.lua b/test/functional/legacy/command_count_spec.lua
index c463ada968..8707c0459c 100644
--- a/test/functional/legacy/command_count_spec.lua
+++ b/test/functional/legacy/command_count_spec.lua
@@ -2,8 +2,9 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, source, expect = helpers.clear, helpers.source, helpers.expect
-local execute = helpers.execute
+local feed_command = helpers.feed_command
+-- luacheck: ignore 613 (Trailing whitespace in a string)
describe('command_count', function()
it('is working', function()
-- It is relevant for the test to load a file initially. If this is
@@ -87,35 +88,35 @@ describe('command_count', function()
arga a b c d
]])
-- This can not be in the source() call as it will produce errors.
- execute([[let v:errmsg = '']])
- execute('5argu')
- execute([[call add(g:lines, '5argu ' . v:errmsg)]])
- execute('$argu')
- execute([[call add(g:lines, '4argu ' . expand('%:t'))]])
- execute([[let v:errmsg = '']])
- execute('1argu')
- execute([[call add(g:lines, '1argu ' . expand('%:t'))]])
- execute([[let v:errmsg = '']])
- execute('100b')
- execute([[call add(g:lines, '100b ' . v:errmsg)]])
- execute('split')
- execute('split')
- execute('split')
- execute('split')
- execute([[let v:errmsg = '']])
- execute('0close')
- execute([[call add(g:lines, '0close ' . v:errmsg)]])
- execute('$wincmd w')
- execute('$close')
- execute([[call add(g:lines, '$close ' . winnr())]])
- execute([[let v:errmsg = '']])
- execute('$+close')
- execute([[call add(g:lines, '$+close ' . v:errmsg)]])
- execute('$tabe')
- execute([[call add(g:lines, '$tabe ' . tabpagenr())]])
- execute([[let v:errmsg = '']])
- execute('$+tabe')
- execute([[call add(g:lines, '$+tabe ' . v:errmsg)]])
+ feed_command([[let v:errmsg = '']])
+ feed_command('5argu')
+ feed_command([[call add(g:lines, '5argu ' . v:errmsg)]])
+ feed_command('$argu')
+ feed_command([[call add(g:lines, '4argu ' . expand('%:t'))]])
+ feed_command([[let v:errmsg = '']])
+ feed_command('1argu')
+ feed_command([[call add(g:lines, '1argu ' . expand('%:t'))]])
+ feed_command([[let v:errmsg = '']])
+ feed_command('100b')
+ feed_command([[call add(g:lines, '100b ' . v:errmsg)]])
+ feed_command('split')
+ feed_command('split')
+ feed_command('split')
+ feed_command('split')
+ feed_command([[let v:errmsg = '']])
+ feed_command('0close')
+ feed_command([[call add(g:lines, '0close ' . v:errmsg)]])
+ feed_command('$wincmd w')
+ feed_command('$close')
+ feed_command([[call add(g:lines, '$close ' . winnr())]])
+ feed_command([[let v:errmsg = '']])
+ feed_command('$+close')
+ feed_command([[call add(g:lines, '$+close ' . v:errmsg)]])
+ feed_command('$tabe')
+ feed_command([[call add(g:lines, '$tabe ' . tabpagenr())]])
+ feed_command([[let v:errmsg = '']])
+ feed_command('$+tabe')
+ feed_command([[call add(g:lines, '$+tabe ' . v:errmsg)]])
source([[
only!
e x
@@ -133,8 +134,8 @@ describe('command_count', function()
let g:lines = []
func BufStatus()
call add(g:lines,
- \ 'aaa: ' . buflisted(g:buf_aaa) .
- \ ' bbb: ' . buflisted(g:buf_bbb) .
+ \ 'aaa: ' . buflisted(g:buf_aaa) .
+ \ ' bbb: ' . buflisted(g:buf_bbb) .
\ ' ccc: ' . buflisted(g:buf_ccc))
endfunc
se nohidden
@@ -214,7 +215,7 @@ describe('command_count', function()
RangeTabsAll 1 5
RangeLines 2 5
LocalRangeLines 2 5
-
+
5argu E16: Invalid range
4argu d
1argu a
@@ -225,7 +226,7 @@ describe('command_count', function()
$tabe 2
$+tabe E16: Invalid range
0tabm x
-
+
aaa: 1 bbb: 1 ccc: 1
aaa: 1 bbb: 0 ccc: 0
aaa: 0 bbb: 0 ccc: 0
diff --git a/test/functional/legacy/comparators_spec.lua b/test/functional/legacy/comparators_spec.lua
index 27879b0f65..32e830a0af 100644
--- a/test/functional/legacy/comparators_spec.lua
+++ b/test/functional/legacy/comparators_spec.lua
@@ -2,13 +2,13 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, eq = helpers.clear, helpers.eq
-local eval, execute = helpers.eval, helpers.execute
+local eval, command = helpers.eval, helpers.command
describe('comparators', function()
before_each(clear)
it('is working', function()
- execute('set isident+=#')
+ command('set isident+=#')
eq(1, eval('1 is#1'))
end)
end)
diff --git a/test/functional/legacy/delete_spec.lua b/test/functional/legacy/delete_spec.lua
index 42238b3a9e..9ea3269828 100644
--- a/test/functional/legacy/delete_spec.lua
+++ b/test/functional/legacy/delete_spec.lua
@@ -1,35 +1,38 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, source = helpers.clear, helpers.source
-local eq, eval, execute = helpers.eq, helpers.eval, helpers.execute
+local eq, eval, command = helpers.eq, helpers.eval, helpers.command
describe('Test for delete()', function()
before_each(clear)
+ after_each(function()
+ os.remove('Xfile')
+ end)
it('file delete', function()
- execute('split Xfile')
- execute("call setline(1, ['a', 'b'])")
- execute('wq')
+ command('split Xfile')
+ command("call setline(1, ['a', 'b'])")
+ command('wq')
eq(eval("['a', 'b']"), eval("readfile('Xfile')"))
eq(0, eval("delete('Xfile')"))
eq(-1, eval("delete('Xfile')"))
end)
it('directory delete', function()
- execute("call mkdir('Xdir1')")
+ command("call mkdir('Xdir1')")
eq(1, eval("isdirectory('Xdir1')"))
eq(0, eval("delete('Xdir1', 'd')"))
eq(0, eval("isdirectory('Xdir1')"))
eq(-1, eval("delete('Xdir1', 'd')"))
end)
it('recursive delete', function()
- execute("call mkdir('Xdir1')")
- execute("call mkdir('Xdir1/subdir')")
- execute("call mkdir('Xdir1/empty')")
- execute('split Xdir1/Xfile')
- execute("call setline(1, ['a', 'b'])")
- execute('w')
- execute('w Xdir1/subdir/Xfile')
- execute('close')
+ command("call mkdir('Xdir1')")
+ command("call mkdir('Xdir1/subdir')")
+ command("call mkdir('Xdir1/empty')")
+ command('split Xdir1/Xfile')
+ command("call setline(1, ['a', 'b'])")
+ command('w')
+ command('w Xdir1/subdir/Xfile')
+ command('close')
eq(1, eval("isdirectory('Xdir1')"))
eq(eval("['a', 'b']"), eval("readfile('Xdir1/Xfile')"))
@@ -46,8 +49,15 @@ describe('Test for delete()', function()
split Xfile
call setline(1, ['a', 'b'])
wq
- silent !ln -s Xfile Xlink
+ if has('win32')
+ silent !mklink Xlink Xfile
+ else
+ silent !ln -s Xfile Xlink
+ endif
]])
+ if eval('v:shell_error') ~= 0 then
+ pending('Cannot create symlink', function()end)
+ end
-- Delete the link, not the file
eq(0, eval("delete('Xlink')"))
eq(-1, eval("delete('Xlink')"))
@@ -55,8 +65,12 @@ describe('Test for delete()', function()
end)
it('symlink directory delete', function()
- execute("call mkdir('Xdir1')")
- execute("silent !ln -s Xdir1 Xlink")
+ command("call mkdir('Xdir1')")
+ if helpers.iswin() then
+ command("silent !mklink /j Xlink Xdir1")
+ else
+ command("silent !ln -s Xdir1 Xlink")
+ end
eq(1, eval("isdirectory('Xdir1')"))
eq(1, eval("isdirectory('Xlink')"))
-- Delete the link, not the directory
@@ -76,7 +90,11 @@ describe('Test for delete()', function()
w Xdir3/subdir/Xfile
w Xdir4/Xfile
close
- silent !ln -s ../Xdir4 Xdir3/Xlink
+ if has('win32')
+ silent !mklink /j Xdir3\Xlink Xdir4
+ else
+ silent !ln -s ../Xdir4 Xdir3/Xlink
+ endif
]])
eq(1, eval("isdirectory('Xdir3')"))
diff --git a/test/functional/legacy/edit_spec.lua b/test/functional/legacy/edit_spec.lua
new file mode 100644
index 0000000000..91d602924c
--- /dev/null
+++ b/test/functional/legacy/edit_spec.lua
@@ -0,0 +1,25 @@
+-- Test for edit functions
+-- See also: src/nvim/testdir/test_edit.vim
+
+local helpers = require('test.functional.helpers')(after_each)
+local source = helpers.source
+local eq, eval = helpers.eq, helpers.eval
+local funcs = helpers.funcs
+local clear = helpers.clear
+
+describe('edit', function()
+ before_each(clear)
+
+ it('reset insertmode from i_ctrl-r_=', function()
+ source([=[
+ call setline(1, ['abc'])
+ call cursor(1, 4)
+ call feedkeys(":set im\<cr>ZZZ\<c-r>=setbufvar(1,'&im', 0)\<cr>",'tnix')
+ ]=])
+ eq({'abZZZc'}, funcs.getline(1,'$'))
+ eq({0, 1, 1, 0}, funcs.getpos('.'))
+ eq(0, eval('&im'))
+ end)
+
+end)
+
diff --git a/test/functional/legacy/erasebackword_spec.lua b/test/functional/legacy/erasebackword_spec.lua
index 33b7704b65..8ca64df328 100644
--- a/test/functional/legacy/erasebackword_spec.lua
+++ b/test/functional/legacy/erasebackword_spec.lua
@@ -6,6 +6,7 @@ local clear, feed, expect = helpers.clear, helpers.feed, helpers.expect
describe('CTRL-W in Insert mode', function()
setup(clear)
+ -- luacheck: ignore 611 (Line contains only whitespaces)
it('works for multi-byte characters', function()
for i = 1, 6 do
diff --git a/test/functional/legacy/eval_spec.lua b/test/functional/legacy/eval_spec.lua
index 3684fe714d..c5d38d6d05 100644
--- a/test/functional/legacy/eval_spec.lua
+++ b/test/functional/legacy/eval_spec.lua
@@ -2,8 +2,11 @@
local helpers = require('test.functional.helpers')(after_each)
local feed, insert, source = helpers.feed, helpers.insert, helpers.source
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, command, expect = helpers.clear, helpers.command, helpers.expect
local eq, eval, write_file = helpers.eq, helpers.eval, helpers.write_file
+local wait = helpers.wait
+local exc_exec = helpers.exc_exec
+local dedent = helpers.dedent
describe('eval', function()
setup(function()
@@ -37,17 +40,17 @@ describe('eval', function()
end)
it(':let', function()
- execute('so test_eval_setup.vim')
- execute([[let @" = 'abc']])
- execute('AR "')
- execute([[let @" = "abc\n"]])
+ command('so test_eval_setup.vim')
+ command([[let @" = 'abc']])
+ command('AR "')
+ command([[let @" = "abc\n"]])
source('AR "')
- execute([[let @" = "abc\<C-m>"]])
- execute('AR "')
- execute([[let @= = '"abc"']])
- execute('AR =')
+ command([[let @" = "abc\<C-m>"]])
+ command('AR "')
+ command([[let @= = '"abc"']])
+ command('AR =')
expect([[
-
+
": type v; value: abc (['abc']), expr: abc (['abc'])
": type V; value: abc]].."\000 (['abc']), expr: abc\000"..[[ (['abc'])
": type V; value: abc]].."\r\000 (['abc\r']), expr: abc\r\000 (['abc\r"..[['])
@@ -55,32 +58,33 @@ describe('eval', function()
end)
it('basic setreg() tests', function()
- execute('so test_eval_setup.vim')
+ command('so test_eval_setup.vim')
insert('{{{1 Basic setreg tests')
- execute([[call SetReg('a', 'abcA', 'c')]])
- execute([[call SetReg('b', 'abcB', 'v')]])
- execute([[call SetReg('c', 'abcC', 'l')]])
- execute([[call SetReg('d', 'abcD', 'V')]])
- execute([[call SetReg('e', 'abcE', 'b')]])
- execute([[call SetReg('f', 'abcF', "\<C-v>")]])
- execute([[call SetReg('g', 'abcG', 'b10')]])
- execute([[call SetReg('h', 'abcH', "\<C-v>10")]])
- execute([[call SetReg('I', 'abcI')]])
+ command([[call SetReg('a', 'abcA', 'c')]])
+ command([[call SetReg('b', 'abcB', 'v')]])
+ command([[call SetReg('c', 'abcC', 'l')]])
+ command([[call SetReg('d', 'abcD', 'V')]])
+ command([[call SetReg('e', 'abcE', 'b')]])
+ command([[call SetReg('f', 'abcF', "\<C-v>")]])
+ command([[call SetReg('g', 'abcG', 'b10')]])
+ command([[call SetReg('h', 'abcH', "\<C-v>10")]])
+ command([[call SetReg('I', 'abcI')]])
feed('Go{{{1 Appending single lines with setreg()<esc>')
- execute([[call SetReg('A', 'abcAc', 'c')]])
- execute([[call SetReg('A', 'abcAl', 'l')]])
- execute([[call SetReg('A', 'abcAc2','c')]])
- execute([[call SetReg('b', 'abcBc', 'ca')]])
- execute([[call SetReg('b', 'abcBb', 'ba')]])
- execute([[call SetReg('b', 'abcBc2','ca')]])
- execute([[call SetReg('b', 'abcBb2','b50a')]])
- execute([[call SetReg('C', 'abcCl', 'l')]])
- execute([[call SetReg('C', 'abcCc', 'c')]])
- execute([[call SetReg('D', 'abcDb', 'b')]])
- execute([[call SetReg('E', 'abcEb', 'b')]])
- execute([[call SetReg('E', 'abcEl', 'l')]])
- execute([[call SetReg('F', 'abcFc', 'c')]])
+ wait()
+ command([[call SetReg('A', 'abcAc', 'c')]])
+ command([[call SetReg('A', 'abcAl', 'l')]])
+ command([[call SetReg('A', 'abcAc2','c')]])
+ command([[call SetReg('b', 'abcBc', 'ca')]])
+ command([[call SetReg('b', 'abcBb', 'ba')]])
+ command([[call SetReg('b', 'abcBc2','ca')]])
+ command([[call SetReg('b', 'abcBb2','b50a')]])
+ command([[call SetReg('C', 'abcCl', 'l')]])
+ command([[call SetReg('C', 'abcCc', 'c')]])
+ command([[call SetReg('D', 'abcDb', 'b')]])
+ command([[call SetReg('E', 'abcEb', 'b')]])
+ command([[call SetReg('E', 'abcEl', 'l')]])
+ command([[call SetReg('F', 'abcFc', 'c')]])
expect([[
{{{1 Basic setreg tests
{{{2 setreg('a', 'abcA', 'c')
@@ -191,14 +195,14 @@ describe('eval', function()
end)
it('appending NL with setreg()', function()
- execute('so test_eval_setup.vim')
-
- execute([[call setreg('a', 'abcA2', 'c')]])
- execute([[call setreg('b', 'abcB2', 'v')]])
- execute([[call setreg('c', 'abcC2', 'l')]])
- execute([[call setreg('d', 'abcD2', 'V')]])
- execute([[call setreg('e', 'abcE2', 'b')]])
- execute([[call setreg('f', 'abcF2', "\<C-v>")]])
+ command('so test_eval_setup.vim')
+
+ command([[call setreg('a', 'abcA2', 'c')]])
+ command([[call setreg('b', 'abcB2', 'v')]])
+ command([[call setreg('c', 'abcC2', 'l')]])
+ command([[call setreg('d', 'abcD2', 'V')]])
+ command([[call setreg('e', 'abcE2', 'b')]])
+ command([[call setreg('f', 'abcF2', "\<C-v>")]])
-- These registers where set like this in the old test_eval.in but never
-- copied to the output buffer with SetReg(). They do not appear in
-- test_eval.ok. Therefore they are commented out.
@@ -206,14 +210,14 @@ describe('eval', function()
--execute([[call setreg('h', 'abcH2', "\<C-v>10")]])
--execute([[call setreg('I', 'abcI2')]])
- execute([[call SetReg('A', "\n")]])
- execute([[call SetReg('B', "\n", 'c')]])
- execute([[call SetReg('C', "\n")]])
- execute([[call SetReg('D', "\n", 'l')]])
- execute([[call SetReg('E', "\n")]])
- execute([[call SetReg('F', "\n", 'b')]])
+ command([[call SetReg('A', "\n")]])
+ command([[call SetReg('B', "\n", 'c')]])
+ command([[call SetReg('C', "\n")]])
+ command([[call SetReg('D', "\n", 'l')]])
+ command([[call SetReg('E', "\n")]])
+ command([[call SetReg('F', "\n", 'b')]])
expect([[
-
+
{{{2 setreg('A', ']]..'\000'..[[')
A: type V; value: abcA2]].."\000 (['abcA2']), expr: abcA2\000"..[[ (['abcA2'])
==
@@ -228,19 +232,19 @@ describe('eval', function()
C: type V; value: abcC2]].."\000\000 (['abcC2', '']), expr: abcC2\000\000"..[[ (['abcC2', ''])
==
abcC2
-
+
==
{{{2 setreg('D', ']]..'\000'..[[', 'l')
D: type V; value: abcD2]].."\000\000 (['abcD2', '']), expr: abcD2\000\000"..[[ (['abcD2', ''])
==
abcD2
-
+
==
{{{2 setreg('E', ']]..'\000'..[[')
E: type V; value: abcE2]].."\000\000 (['abcE2', '']), expr: abcE2\000\000"..[[ (['abcE2', ''])
==
abcE2
-
+
==
{{{2 setreg('F', ']]..'\000'..[[', 'b')
F: type ]].."\0220; value: abcF2\000 (['abcF2', '']), expr: abcF2\000"..[[ (['abcF2', ''])
@@ -250,27 +254,27 @@ describe('eval', function()
end)
it('setting and appending list with setreg()', function()
- execute('so test_eval_setup.vim')
-
- execute([[$put ='{{{1 Setting lists with setreg()']])
- execute([=[call SetReg('a', ['abcA3'], 'c')]=])
- execute([=[call SetReg('b', ['abcB3'], 'l')]=])
- execute([=[call SetReg('c', ['abcC3'], 'b')]=])
- execute([=[call SetReg('d', ['abcD3'])]=])
- execute([=[call SetReg('e', [1, 2, 'abc', 3])]=])
- execute([=[call SetReg('f', [1, 2, 3])]=])
-
- execute([[$put ='{{{1 Appending lists with setreg()']])
- execute([=[call SetReg('A', ['abcA3c'], 'c')]=])
- execute([=[call SetReg('b', ['abcB3l'], 'la')]=])
- execute([=[call SetReg('C', ['abcC3b'], 'lb')]=])
- execute([=[call SetReg('D', ['abcD32'])]=])
- execute([=[call SetReg('A', ['abcA32'])]=])
- execute([=[call SetReg('B', ['abcB3c'], 'c')]=])
- execute([=[call SetReg('C', ['abcC3l'], 'l')]=])
- execute([=[call SetReg('D', ['abcD3b'], 'b')]=])
+ command('so test_eval_setup.vim')
+
+ command([[$put ='{{{1 Setting lists with setreg()']])
+ command([=[call SetReg('a', ['abcA3'], 'c')]=])
+ command([=[call SetReg('b', ['abcB3'], 'l')]=])
+ command([=[call SetReg('c', ['abcC3'], 'b')]=])
+ command([=[call SetReg('d', ['abcD3'])]=])
+ command([=[call SetReg('e', [1, 2, 'abc', 3])]=])
+ command([=[call SetReg('f', [1, 2, 3])]=])
+
+ command([[$put ='{{{1 Appending lists with setreg()']])
+ command([=[call SetReg('A', ['abcA3c'], 'c')]=])
+ command([=[call SetReg('b', ['abcB3l'], 'la')]=])
+ command([=[call SetReg('C', ['abcC3b'], 'lb')]=])
+ command([=[call SetReg('D', ['abcD32'])]=])
+ command([=[call SetReg('A', ['abcA32'])]=])
+ command([=[call SetReg('B', ['abcB3c'], 'c')]=])
+ command([=[call SetReg('C', ['abcC3l'], 'l')]=])
+ command([=[call SetReg('D', ['abcD3b'], 'b')]=])
expect([[
-
+
{{{1 Setting lists with setreg()
{{{2 setreg('a', ['abcA3'], 'c')
a: type v; value: abcA3 (['abcA3']), expr: abcA3 (['abcA3'])
@@ -359,9 +363,9 @@ describe('eval', function()
-- the next expect() easier to write. This is neccessary because null
-- bytes on a line by itself don't play well together with the dedent
-- function used in expect().
- execute('%delete')
- execute([[$put ='{{{1 Appending lists with NL with setreg()']])
- execute([=[call SetReg('A', ["\n", 'abcA3l2'], 'l')]=])
+ command('%delete')
+ command([[$put ='{{{1 Appending lists with NL with setreg()']])
+ command([=[call SetReg('A', ["\n", 'abcA3l2'], 'l')]=])
expect(
'\n'..
'{{{1 Appending lists with NL with setreg()\n'..
@@ -374,8 +378,8 @@ describe('eval', function()
'\000\n'..
'abcA3l2\n'..
'==')
- execute('%delete')
- execute([=[call SetReg('B', ["\n", 'abcB3c2'], 'c')]=])
+ command('%delete')
+ command([=[call SetReg('B', ["\n", 'abcB3c2'], 'c')]=])
expect(
'\n'..
"{{{2 setreg('B', ['\000', 'abcB3c2'], 'c')\n"..
@@ -386,8 +390,8 @@ describe('eval', function()
'abcB3c\n'..
'\000\n'..
'abcB3c2=')
- execute('%delete')
- execute([=[call SetReg('C', ["\n", 'abcC3b2'], 'b')]=])
+ command('%delete')
+ command([=[call SetReg('C', ["\n", 'abcC3b2'], 'b')]=])
expect(
'\n'..
"{{{2 setreg('C', ['\000', 'abcC3b2'], 'b')\n"..
@@ -398,8 +402,8 @@ describe('eval', function()
' abcC3l\n'..
' \000\n'..
' abcC3b2')
- execute('%delete')
- execute([=[call SetReg('D', ["\n", 'abcD3b50'],'b50')]=])
+ command('%delete')
+ command([=[call SetReg('D', ["\n", 'abcD3b50'],'b50')]=])
expect(
'\n'..
"{{{2 setreg('D', ['\000', 'abcD3b50'], 'b50')\n"..
@@ -416,8 +420,8 @@ describe('eval', function()
-- to make the expect() calls easier to write. Otherwise the null byte can
-- make trouble on a line on its own.
it('setting lists with NLs with setreg(), part 1', function()
- execute('so test_eval_setup.vim')
- execute([=[call SetReg('a', ['abcA4-0', "\n", "abcA4-2\n", "\nabcA4-3", "abcA4-4\nabcA4-4-2"])]=])
+ command('so test_eval_setup.vim')
+ command([=[call SetReg('a', ['abcA4-0', "\n", "abcA4-2\n", "\nabcA4-3", "abcA4-4\nabcA4-4-2"])]=])
expect(
'\n'..
"{{{2 setreg('a', ['abcA4-0', '\000', 'abcA4-2\000', '\000abcA4-3', 'abcA4-4\000abcA4-4-2'])\n"..
@@ -432,8 +436,8 @@ describe('eval', function()
end)
it('setting lists with NLs with setreg(), part 2', function()
- execute('so test_eval_setup.vim')
- execute([=[call SetReg('b', ['abcB4c-0', "\n", "abcB4c-2\n", "\nabcB4c-3", "abcB4c-4\nabcB4c-4-2"], 'c')]=])
+ command('so test_eval_setup.vim')
+ command([=[call SetReg('b', ['abcB4c-0', "\n", "abcB4c-2\n", "\nabcB4c-3", "abcB4c-4\nabcB4c-4-2"], 'c')]=])
expect(
'\n'..
"{{{2 setreg('b', ['abcB4c-0', '\000', 'abcB4c-2\000', '\000abcB4c-3', 'abcB4c-4\000abcB4c-4-2'], 'c')\n"..
@@ -447,8 +451,8 @@ describe('eval', function()
end)
it('setting lists with NLs with setreg(), part 3', function()
- execute('so test_eval_setup.vim')
- execute([=[call SetReg('c', ['abcC4l-0', "\n", "abcC4l-2\n", "\nabcC4l-3", "abcC4l-4\nabcC4l-4-2"], 'l')]=])
+ command('so test_eval_setup.vim')
+ command([=[call SetReg('c', ['abcC4l-0', "\n", "abcC4l-2\n", "\nabcC4l-3", "abcC4l-4\nabcC4l-4-2"], 'l')]=])
expect(
'\n'..
"{{{2 setreg('c', ['abcC4l-0', '\000', 'abcC4l-2\000', '\000abcC4l-3', 'abcC4l-4\000abcC4l-4-2'], 'l')\n"..
@@ -462,8 +466,8 @@ describe('eval', function()
'==')
end)
it('setting lists with NLs with setreg(), part 4', function()
- execute('so test_eval_setup.vim')
- execute([=[call SetReg('d', ['abcD4b-0', "\n", "abcD4b-2\n", "\nabcD4b-3", "abcD4b-4\nabcD4b-4-2"], 'b')]=])
+ command('so test_eval_setup.vim')
+ command([=[call SetReg('d', ['abcD4b-0', "\n", "abcD4b-2\n", "\nabcD4b-3", "abcD4b-4\nabcD4b-4-2"], 'b')]=])
expect(
'\n'..
"{{{2 setreg('d', ['abcD4b-0', '\000', 'abcD4b-2\000', '\000abcD4b-3', 'abcD4b-4\000abcD4b-4-2'], 'b')\n"..
@@ -476,8 +480,8 @@ describe('eval', function()
' abcD4b-4\000abcD4b-4-2')
end)
it('setting lists with NLs with setreg(), part 5', function()
- execute('so test_eval_setup.vim')
- execute([=[call SetReg('e', ['abcE4b10-0', "\n", "abcE4b10-2\n", "\nabcE4b10-3", "abcE4b10-4\nabcE4b10-4-2"], 'b10')]=])
+ command('so test_eval_setup.vim')
+ command([=[call SetReg('e', ['abcE4b10-0', "\n", "abcE4b10-2\n", "\nabcE4b10-3", "abcE4b10-4\nabcE4b10-4-2"], 'b10')]=])
expect(
'\n'..
"{{{2 setreg('e', ['abcE4b10-0', '\000', 'abcE4b10-2\000', '\000abcE4b10-3', 'abcE4b10-4\000abcE4b10-4-2'], 'b10')\n"..
@@ -494,32 +498,41 @@ describe('eval', function()
-- Precondition: "a is actually unset and "0 is nonempty
eq('', eval("getregtype('a')"))
eq('', eval("getreg('a')"))
- execute("call setreg('0','text')")
+ command("call setreg('0','text')")
-- This used to return a NULL list
-- which setreg didn't handle
- execute("let x = getreg('a',1,1)")
- execute("call setreg('0',x)")
+ command("let x = getreg('a',1,1)")
+ command("call setreg('0',x)")
-- nvim didn't crash and "0 was emptied
eq(2, eval("1+1"))
eq({}, eval("getreg('0',1,1)"))
-- x is a mutable list
- execute("let y = x")
+ command("let y = x")
eq({}, eval("y"))
- execute("call add(x, 'item')")
+ command("call add(x, 'item')")
eq({'item'}, eval("y"))
end)
+ it('sets the unnamed register when the "u" option is passed to setreg', function()
+ command("call setreg('a','a reg', 'cu')")
+ eq("a reg", eval('@"'))
+ command("call setreg('b','b reg', 'cu')")
+ eq("b reg", eval('@"'))
+ command("call setreg('c','c reg', 'c')")
+ eq("b reg", eval('@"'))
+ end)
+
it('search and expressions', function()
- execute('so test_eval_setup.vim')
- execute([=[call SetReg('/', ['abc/'])]=])
- execute([=[call SetReg('/', ["abc/\n"])]=])
- execute([=[call SetReg('=', ['"abc/"'])]=])
- execute([=[call SetReg('=', ["\"abc/\n\""])]=])
+ command('so test_eval_setup.vim')
+ command([=[call SetReg('/', ['abc/'])]=])
+ command([=[call SetReg('/', ["abc/\n"])]=])
+ command([=[call SetReg('=', ['"abc/"'])]=])
+ command([=[call SetReg('=', ["\"abc/\n\""])]=])
expect([[
-
+
{{{2 setreg('/', ['abc/'])
/: type v; value: abc/ (['abc/']), expr: abc/ (['abc/'])
==
@@ -536,35 +549,35 @@ describe('eval', function()
describe('system clipboard', function()
before_each(function()
- execute('let &runtimepath = "test/functional/fixtures,".&runtimepath')
- execute('call getreg("*")') -- force load of provider
+ command('let &runtimepath = "test/functional/fixtures,".&runtimepath')
+ command('call getreg("*")') -- force load of provider
end)
it('works', function()
insert([[
Some first line (this text was at the top of the old test_eval.in).
-
+
Note: system clipboard is saved, changed and restored.
-
+
clipboard contents
something else]])
- execute('so test_eval_setup.vim')
+ command('so test_eval_setup.vim')
-- Save and restore system clipboard.
- execute("let _clipreg = ['*', getreg('*'), getregtype('*')]")
- execute('let _clipopt = &cb')
- execute("let &cb='unnamed'")
- execute('5y')
- execute('AR *')
- execute('tabdo :windo :echo "hi"')
- execute('6y')
- execute('AR *')
- execute('let &cb=_clipopt')
- execute("call call('setreg', _clipreg)")
+ command("let _clipreg = ['*', getreg('*'), getregtype('*')]")
+ command('let _clipopt = &cb')
+ command("let &cb='unnamed'")
+ command('5y')
+ command('AR *')
+ command('tabdo :windo :echo "hi"')
+ command('6y')
+ command('AR *')
+ command('let &cb=_clipopt')
+ command("call call('setreg', _clipreg)")
expect([[
Some first line (this text was at the top of the old test_eval.in).
-
+
Note: system clipboard is saved, changed and restored.
-
+
clipboard contents
something else
*: type V; value: clipboard contents]]..'\00'..[[ (['clipboard contents']), expr: clipboard contents]]..'\00'..[[ (['clipboard contents'])
@@ -582,17 +595,17 @@ describe('eval', function()
$put =v:exception
endtry
endfun]])
- execute([[call ErrExe('call setreg()')]])
- execute([[call ErrExe('call setreg(1)')]])
- execute([[call ErrExe('call setreg(1, 2, 3, 4)')]])
- execute([=[call ErrExe('call setreg([], 2)')]=])
- execute([[call ErrExe('call setreg(1, {})')]])
- execute([=[call ErrExe('call setreg(1, 2, [])')]=])
- execute([=[call ErrExe('call setreg("/", ["1", "2"])')]=])
- execute([=[call ErrExe('call setreg("=", ["1", "2"])')]=])
- execute([=[call ErrExe('call setreg(1, ["", "", [], ""])')]=])
+ command([[call ErrExe('call setreg()')]])
+ command([[call ErrExe('call setreg(1)')]])
+ command([[call ErrExe('call setreg(1, 2, 3, 4)')]])
+ command([=[call ErrExe('call setreg([], 2)')]=])
+ command([[call ErrExe('call setreg(1, {})')]])
+ command([=[call ErrExe('call setreg(1, 2, [])')]=])
+ command([=[call ErrExe('call setreg("/", ["1", "2"])')]=])
+ command([=[call ErrExe('call setreg("=", ["1", "2"])')]=])
+ command([=[call ErrExe('call setreg(1, ["", "", [], ""])')]=])
expect([[
-
+
Executing call setreg()
Vim(call):E119: Not enough arguments for function: setreg
Executing call setreg(1)
@@ -614,48 +627,38 @@ describe('eval', function()
end)
it('function name not starting with a capital', function()
- execute('try')
- execute(' func! g:test()')
- execute(' echo "test"')
- execute(' endfunc')
- execute('catch')
- execute(' let tmp = v:exception')
- execute('endtry')
- eq('Vim(function):E128: Function name must start with a capital or "s:": g:test()', eval('tmp'))
+ eq('Vim(function):E128: Function name must start with a capital or "s:": g:test()\\nendfunction',
+ exc_exec(dedent([[
+ function! g:test()
+ endfunction]])))
end)
it('Function name followed by #', function()
- execute('try')
- execute(' func! test2() "#')
- execute(' echo "test2"')
- execute(' endfunc')
- execute('catch')
- execute(' let tmp = v:exception')
- execute('endtry')
- eq('Vim(function):E128: Function name must start with a capital or "s:": test2() "#', eval('tmp'))
+ eq('Vim(function):E128: Function name must start with a capital or "s:": test2() "#\\nendfunction',
+ exc_exec(dedent([[
+ function! test2() "#
+ endfunction]])))
end)
it('function name includes a colon', function()
- execute('try')
- execute(' func! b:test()')
- execute(' echo "test"')
- execute(' endfunc')
- execute('catch')
- execute(' let tmp = v:exception')
- execute('endtry')
- eq('Vim(function):E128: Function name must start with a capital or "s:": b:test()', eval('tmp'))
+ eq('Vim(function):E128: Function name must start with a capital or "s:": b:test()\\nendfunction',
+ exc_exec(dedent([[
+ function! b:test()
+ endfunction]])))
end)
it('function name starting with/without "g:", buffer-local funcref', function()
- execute('function! g:Foo(n)')
- execute(" $put ='called Foo(' . a:n . ')'")
- execute('endfunction')
- execute("let b:my_func = function('Foo')")
- execute('call b:my_func(1)')
- execute('echo g:Foo(2)')
- execute('echo Foo(3)')
+ command([[
+ function! g:Foo(n)
+ $put ='called Foo(' . a:n . ')'
+ endfunction
+ ]])
+ command("let b:my_func = function('Foo')")
+ command('call b:my_func(1)')
+ command('echo g:Foo(2)')
+ command('echo Foo(3)')
expect([[
-
+
called Foo(1)
called Foo(2)
called Foo(3)]])
@@ -664,20 +667,20 @@ describe('eval', function()
it('script-local function used in Funcref must exist', function()
source([[
" Vim script used in test_eval.in. Needed for script-local function.
-
+
func! s:Testje()
return "foo"
endfunc
-
+
let Bar = function('s:Testje')
-
+
$put ='s:Testje exists: ' . exists('s:Testje')
$put ='func s:Testje exists: ' . exists('*s:Testje')
$put ='Bar exists: ' . exists('Bar')
$put ='func Bar exists: ' . exists('*Bar')
]])
expect([[
-
+
s:Testje exists: 0
func s:Testje exists: 1
Bar exists: 1
@@ -685,12 +688,8 @@ describe('eval', function()
end)
it("using $ instead of '$' must give an error", function()
- execute('try')
- execute(" call append($, 'foobar')")
- execute('catch')
- execute(' let tmp = v:exception')
- execute('endtry')
- eq('Vim(call):E116: Invalid arguments for function append', eval('tmp'))
+ eq('Vim(call):E116: Invalid arguments for function append',
+ exc_exec('call append($, "foobar")'))
end)
it('getcurpos/setpos', function()
@@ -699,13 +698,16 @@ describe('eval', function()
012345678
start:]])
- execute('/^012345678')
+ command('/^012345678')
feed('6l')
- execute('let sp = getcurpos()')
+ wait()
+ command('let sp = getcurpos()')
feed('0')
- execute("call setpos('.', sp)")
+ wait()
+ command("call setpos('.', sp)")
feed('jyl')
- execute('$put')
+ wait()
+ command('$put')
expect([[
012345678
012345678
@@ -715,18 +717,18 @@ describe('eval', function()
end)
it('substring and variable name', function()
- execute("let str = 'abcdef'")
- execute('let n = 3')
+ command("let str = 'abcdef'")
+ command('let n = 3')
eq('def', eval('str[n:]'))
eq('abcd', eval('str[:n]'))
eq('d', eval('str[n:n]'))
- execute('unlet n')
- execute('let nn = 3')
+ command('unlet n')
+ command('let nn = 3')
eq('def', eval('str[nn:]'))
eq('abcd', eval('str[:nn]'))
eq('d', eval('str[nn:nn]'))
- execute('unlet nn')
- execute('let b:nn = 4')
+ command('unlet nn')
+ command('let b:nn = 4')
eq('ef', eval('str[b:nn:]'))
eq('abcde', eval('str[:b:nn]'))
eq('e', eval('str[b:nn:b:nn]'))
diff --git a/test/functional/legacy/file_perm_spec.lua b/test/functional/legacy/file_perm_spec.lua
index 98bdf630dd..d61fdc9b83 100644
--- a/test/functional/legacy/file_perm_spec.lua
+++ b/test/functional/legacy/file_perm_spec.lua
@@ -6,7 +6,7 @@ local clear, call, eq = helpers.clear, helpers.call, helpers.eq
local neq, exc_exec = helpers.neq, helpers.exc_exec
describe('Test getting and setting file permissions', function()
- local tempfile = os.tmpname()
+ local tempfile = helpers.tmpname()
before_each(function()
os.remove(tempfile)
@@ -15,13 +15,13 @@ describe('Test getting and setting file permissions', function()
it('file permissions', function()
eq('', call('getfperm', tempfile))
- eq(0, call('setfperm', tempfile, 'r------'))
+ eq(0, call('setfperm', tempfile, 'r--------'))
call('writefile', {'one'}, tempfile)
eq(9, call('len', call('getfperm', tempfile)))
eq(1, call('setfperm', tempfile, 'rwx------'))
- if helpers.os_name == 'windows' then
+ if helpers.os_name() == 'windows' then
eq('rw-rw-rw-', call('getfperm', tempfile))
else
eq('rwx------', call('getfperm', tempfile))
diff --git a/test/functional/legacy/fixeol_spec.lua b/test/functional/legacy/fixeol_spec.lua
index bba1415535..50236e8617 100644
--- a/test/functional/legacy/fixeol_spec.lua
+++ b/test/functional/legacy/fixeol_spec.lua
@@ -2,15 +2,16 @@
local helpers = require('test.functional.helpers')(after_each)
local feed = helpers.feed
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
describe('fixeol', function()
local function rmtestfiles()
- os.remove('test.out')
- os.remove('XXEol')
- os.remove('XXNoEol')
- os.remove('XXTestEol')
- os.remove('XXTestNoEol')
+ feed_command('%bwipeout!')
+ feed_command('call delete("test.out")')
+ feed_command('call delete("XXEol")')
+ feed_command('call delete("XXNoEol")')
+ feed_command('call delete("XXTestEol")')
+ feed_command('call delete("XXTestNoEol")')
end
setup(function()
clear()
@@ -23,38 +24,38 @@ describe('fixeol', function()
it('is working', function()
-- First write two test files โ€“ with and without trailing EOL.
-- Use Unix fileformat for consistency.
- execute('set ff=unix')
- execute('enew!')
+ feed_command('set ff=unix')
+ feed_command('enew!')
feed('awith eol<esc>:w! XXEol<cr>')
- execute('enew!')
- execute('set noeol nofixeol')
+ feed_command('enew!')
+ feed_command('set noeol nofixeol')
feed('awithout eol<esc>:w! XXNoEol<cr>')
- execute('set eol fixeol')
- execute('bwipe XXEol XXNoEol')
+ feed_command('set eol fixeol')
+ feed_command('bwipe XXEol XXNoEol')
-- Try editing files with 'fixeol' disabled.
- execute('e! XXEol')
+ feed_command('e! XXEol')
feed('ostays eol<esc>:set nofixeol<cr>')
- execute('w! XXTestEol')
- execute('e! XXNoEol')
+ feed_command('w! XXTestEol')
+ feed_command('e! XXNoEol')
feed('ostays without<esc>:set nofixeol<cr>')
- execute('w! XXTestNoEol')
- execute('bwipe XXEol XXNoEol XXTestEol XXTestNoEol')
- execute('set fixeol')
+ feed_command('w! XXTestNoEol')
+ feed_command('bwipe XXEol XXNoEol XXTestEol XXTestNoEol')
+ feed_command('set fixeol')
-- Append "END" to each file so that we can see what the last written char was.
feed('ggdGaEND<esc>:w >>XXEol<cr>')
- execute('w >>XXNoEol')
- execute('w >>XXTestEol')
- execute('w >>XXTestNoEol')
+ feed_command('w >>XXNoEol')
+ feed_command('w >>XXTestEol')
+ feed_command('w >>XXTestNoEol')
-- Concatenate the results.
- execute('e! test.out')
+ feed_command('e! test.out')
feed('a0<esc>:$r XXEol<cr>')
- execute('$r XXNoEol')
+ feed_command('$r XXNoEol')
feed('Go1<esc>:$r XXTestEol<cr>')
- execute('$r XXTestNoEol')
- execute('w')
+ feed_command('$r XXTestNoEol')
+ feed_command('w')
-- Assert buffer contents.
expect([=[
diff --git a/test/functional/legacy/fnamemodify_spec.lua b/test/functional/legacy/fnamemodify_spec.lua
index f614b07b36..7e859bf0cf 100644
--- a/test/functional/legacy/fnamemodify_spec.lua
+++ b/test/functional/legacy/fnamemodify_spec.lua
@@ -14,17 +14,21 @@ describe('filename modifiers', function()
source([=[
func Test_fnamemodify()
- let tmpdir = resolve('/tmp')
+ if has('win32')
+ set shellslash
+ else
+ set shell=sh
+ endif
+ let tmpdir = resolve($TMPDIR)
+ call assert_true(isdirectory(tmpdir))
execute 'cd '. tmpdir
- set shell=sh
- set shellslash
let $HOME=fnamemodify('.', ':p:h:h:h')
call assert_equal('/', fnamemodify('.', ':p')[-1:])
- call assert_equal('p', fnamemodify('.', ':p:h')[-1:])
+ call assert_equal(tmpdir[strchars(tmpdir) - 1], fnamemodify('.', ':p:h')[-1:])
call assert_equal('t', fnamemodify('test.out', ':p')[-1:])
call assert_equal('test.out', fnamemodify('test.out', ':.'))
call assert_equal('../testdir/a', fnamemodify('../testdir/a', ':.'))
- call assert_equal('test.out', fnamemodify('test.out', ':~'))
+ call assert_equal(fnamemodify(tmpdir, ':~').'/test.out', fnamemodify('test.out', ':~'))
call assert_equal('../testdir/a', fnamemodify('../testdir/a', ':~'))
call assert_equal('a', fnamemodify('../testdir/a', ':t'))
call assert_equal('', fnamemodify('.', ':p:t'))
@@ -51,8 +55,10 @@ describe('filename modifiers', function()
quit
call assert_equal("'abc\ndef'", fnamemodify("abc\ndef", ':S'))
- set shell=tcsh
- call assert_equal("'abc\\\ndef'", fnamemodify("abc\ndef", ':S'))
+ if executable('tcsh')
+ set shell=tcsh
+ call assert_equal("'abc\\\ndef'", fnamemodify("abc\ndef", ':S'))
+ endif
endfunc
func Test_expand()
diff --git a/test/functional/legacy/function_sort_spec.lua b/test/functional/legacy/function_sort_spec.lua
index 1b65f1ce95..12875460e0 100644
--- a/test/functional/legacy/function_sort_spec.lua
+++ b/test/functional/legacy/function_sort_spec.lua
@@ -1,10 +1,11 @@
local helpers = require('test.functional.helpers')(after_each)
-local clear = helpers.clear
+
local eq = helpers.eq
+local neq = helpers.neq
local eval = helpers.eval
-local execute = helpers.execute
+local clear = helpers.clear
+local source = helpers.source
local exc_exec = helpers.exc_exec
-local neq = helpers.neq
describe('sort', function()
before_each(clear)
@@ -31,14 +32,17 @@ describe('sort', function()
end)
it('ability to call sort() from a compare function', function()
- execute('func Compare1(a, b) abort')
- execute([[call sort(range(3), 'Compare2')]])
- execute('return a:a - a:b')
- execute('endfunc')
-
- execute('func Compare2(a, b) abort')
- execute('return a:a - a:b')
- execute('endfunc')
+ source([[
+ function Compare1(a, b) abort
+ call sort(range(3), 'Compare2')
+ return a:a - a:b
+ endfunc
+
+ function Compare2(a, b) abort
+ return a:a - a:b
+ endfunc
+ ]])
+
eq({1, 3, 5}, eval("sort([3, 1, 5], 'Compare1')"))
end)
diff --git a/test/functional/legacy/getcwd_spec.lua b/test/functional/legacy/getcwd_spec.lua
index 3bb9930b74..eae13da528 100644
--- a/test/functional/legacy/getcwd_spec.lua
+++ b/test/functional/legacy/getcwd_spec.lua
@@ -2,7 +2,7 @@
local helpers = require('test.functional.helpers')(after_each)
local eq, eval, source = helpers.eq, helpers.eval, helpers.source
-local call, clear, execute = helpers.call, helpers.clear, helpers.execute
+local call, clear, command = helpers.call, helpers.clear, helpers.command
describe('getcwd', function()
before_each(clear)
@@ -37,48 +37,48 @@ describe('getcwd', function()
return bufname . ' ' . dirname . ' ' . lflag
endfunction
]])
- execute('new')
- execute('let cwd=getcwd()')
+ command('new')
+ command('let cwd=getcwd()')
call('mkdir', 'Xtopdir')
- execute('silent cd Xtopdir')
+ command('silent cd Xtopdir')
call('mkdir', 'Xdir1')
call('mkdir', 'Xdir2')
call('mkdir', 'Xdir3')
- execute('new a')
- execute('new b')
- execute('new c')
- execute('3wincmd w')
- execute('silent lcd Xdir1')
+ command('new a')
+ command('new b')
+ command('new c')
+ command('3wincmd w')
+ command('silent lcd Xdir1')
eq('a Xdir1 1', eval('GetCwdInfo(0, 0)'))
- execute('wincmd W')
+ command('wincmd W')
eq('b Xtopdir 0', eval('GetCwdInfo(0, 0)'))
- execute('wincmd W')
- execute('silent lcd Xdir3')
+ command('wincmd W')
+ command('silent lcd Xdir3')
eq('c Xdir3 1', eval('GetCwdInfo(0, 0)'))
eq('a Xdir1 1', eval('GetCwdInfo(bufwinnr("a"), 0)'))
eq('b Xtopdir 0', eval('GetCwdInfo(bufwinnr("b"), 0)'))
eq('c Xdir3 1', eval('GetCwdInfo(bufwinnr("c"), 0)'))
- execute('wincmd W')
+ command('wincmd W')
eq('a Xdir1 1', eval('GetCwdInfo(bufwinnr("a"), tabpagenr())'))
eq('b Xtopdir 0', eval('GetCwdInfo(bufwinnr("b"), tabpagenr())'))
eq('c Xdir3 1', eval('GetCwdInfo(bufwinnr("c"), tabpagenr())'))
- execute('tabnew x')
- execute('new y')
- execute('new z')
- execute('3wincmd w')
+ command('tabnew x')
+ command('new y')
+ command('new z')
+ command('3wincmd w')
eq('x Xtopdir 0', eval('GetCwdInfo(0, 0)'))
- execute('wincmd W')
- execute('silent lcd Xdir2')
+ command('wincmd W')
+ command('silent lcd Xdir2')
eq('y Xdir2 1', eval('GetCwdInfo(0, 0)'))
- execute('wincmd W')
- execute('silent lcd Xdir3')
+ command('wincmd W')
+ command('silent lcd Xdir3')
eq('z Xdir3 1', eval('GetCwdInfo(0, 0)'))
eq('x Xtopdir 0', eval('GetCwdInfo(bufwinnr("x"), 0)'))
eq('y Xdir2 1', eval('GetCwdInfo(bufwinnr("y"), 0)'))
eq('z Xdir3 1', eval('GetCwdInfo(bufwinnr("z"), 0)'))
- execute('let tp_nr = tabpagenr()')
- execute('tabrewind')
+ command('let tp_nr = tabpagenr()')
+ command('tabrewind')
eq('x Xtopdir 0', eval('GetCwdInfo(3, tp_nr)'))
eq('y Xdir2 1', eval('GetCwdInfo(2, tp_nr)'))
eq('z Xdir3 1', eval('GetCwdInfo(1, tp_nr)'))
diff --git a/test/functional/legacy/glob2regpat_spec.lua b/test/functional/legacy/glob2regpat_spec.lua
index 82e7e3010f..029d95206e 100644
--- a/test/functional/legacy/glob2regpat_spec.lua
+++ b/test/functional/legacy/glob2regpat_spec.lua
@@ -1,16 +1,15 @@
-- Tests for signs
local helpers = require('test.functional.helpers')(after_each)
-local clear, execute = helpers.clear, helpers.execute
-local eq, neq, eval = helpers.eq, helpers.neq, helpers.eval
+local clear, exc_exec = helpers.clear, helpers.exc_exec
+local eq, eval = helpers.eq, helpers.eval
describe('glob2regpat()', function()
before_each(clear)
it('handles invalid input', function()
- execute('call glob2regpat(1.33)')
- helpers.feed('<cr>')
- neq(nil, string.find(eval('v:errmsg'), '^E806:'))
+ eq('Vim(call):E806: using Float as a String',
+ exc_exec('call glob2regpat(1.33)'))
end)
it('returns ^$ for empty input', function()
eq('^$', eval("glob2regpat('')"))
diff --git a/test/functional/legacy/increment_spec.lua b/test/functional/legacy/increment_spec.lua
index 0483edc934..d51f9a2e02 100644
--- a/test/functional/legacy/increment_spec.lua
+++ b/test/functional/legacy/increment_spec.lua
@@ -1,7 +1,7 @@
-- Tests for using Ctrl-A/Ctrl-X on visual selections
local helpers = require('test.functional.helpers')(after_each)
-local source, execute = helpers.source, helpers.execute
+local source, command = helpers.source, helpers.command
local call, clear = helpers.call, helpers.clear
local eq, nvim = helpers.eq, helpers.meths
@@ -685,7 +685,7 @@ describe('Ctrl-A/Ctrl-X on visual selections', function()
" Text:
" 1 23
" 4 56
- "
+ "
" Expected:
" 1) f2 Ctrl-V jl <ctrl-a>, repeat twice afterwards with .
" 1 26
@@ -727,6 +727,14 @@ describe('Ctrl-A/Ctrl-X on visual selections', function()
exec "norm! gg$\<C-A>"
call assert_equal("002", getline(1))
endfunc
+
+ " Test a regression of patch 7.4.1087 fixed.
+ func Test_normal_increment_02()
+ call setline(1, ["hello 10", "world"])
+ exec "norm! ggl\<C-A>jx"
+ call assert_equal(["hello 11", "worl"], getline(1, '$'))
+ call assert_equal([0, 2, 4, 0], getpos('.'))
+ endfunc
]=])
end)
@@ -734,15 +742,20 @@ describe('Ctrl-A/Ctrl-X on visual selections', function()
local id = string.format('%02d', i)
it('works on Test ' .. id, function()
- execute('set nrformats&vi') -- &vi makes Vim compatible
+ command('set nrformats&vi') -- &vi makes Vim compatible
call('Test_visual_increment_' .. id)
eq({}, nvim.get_vvar('errors'))
end)
end
it('does not drop leading zeroes', function()
- execute('set nrformats&vi') -- &vi makes Vim compatible
+ command('set nrformats&vi') -- &vi makes Vim compatible
call('Test_normal_increment_01')
eq({}, nvim.get_vvar('errors'))
end)
+
+ it('maintains correct column after CTRL-A', function()
+ call('Test_normal_increment_02')
+ eq({}, nvim.get_vvar('errors'))
+ end)
end)
diff --git a/test/functional/legacy/insertcount_spec.lua b/test/functional/legacy/insertcount_spec.lua
index 3142f040b3..e53c9dc6ce 100644
--- a/test/functional/legacy/insertcount_spec.lua
+++ b/test/functional/legacy/insertcount_spec.lua
@@ -2,7 +2,7 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, expect = helpers.execute, helpers.expect
+local feed_command, expect = helpers.feed_command, helpers.expect
describe('insertcount', function()
setup(clear)
@@ -13,7 +13,7 @@ describe('insertcount', function()
Second line
Last line]])
- execute('/Second')
+ feed_command('/Second')
feed('4gro')
expect([[
diff --git a/test/functional/legacy/join_spec.lua b/test/functional/legacy/join_spec.lua
index 3c4da8119c..d683d25eb0 100644
--- a/test/functional/legacy/join_spec.lua
+++ b/test/functional/legacy/join_spec.lua
@@ -2,19 +2,19 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, eq = helpers.clear, helpers.eq
-local eval, execute = helpers.eval, helpers.execute
+local eval, command = helpers.eval, helpers.command
describe('joining lines', function()
before_each(clear)
it('is working', function()
- execute('new')
- execute([[call setline(1, ['one', 'two', 'three', 'four'])]])
- execute('normal J')
+ command('new')
+ command([[call setline(1, ['one', 'two', 'three', 'four'])]])
+ command('normal J')
eq('one two', eval('getline(1)'))
- execute('%del')
- execute([[call setline(1, ['one', 'two', 'three', 'four'])]])
- execute('normal 10J')
+ command('%del')
+ command([[call setline(1, ['one', 'two', 'three', 'four'])]])
+ command('normal 10J')
eq('one two three four', eval('getline(1)'))
end)
end)
diff --git a/test/functional/legacy/lispwords_spec.lua b/test/functional/legacy/lispwords_spec.lua
index 2ec51dca1b..57d8d51377 100644
--- a/test/functional/legacy/lispwords_spec.lua
+++ b/test/functional/legacy/lispwords_spec.lua
@@ -2,7 +2,7 @@ local helpers = require('test.functional.helpers')(after_each)
local clear = helpers.clear
local eq = helpers.eq
local eval = helpers.eval
-local execute = helpers.execute
+local command = helpers.command
local source = helpers.source
describe('lispwords', function()
@@ -17,7 +17,7 @@ describe('lispwords', function()
eq('bar,baz,quux', eval('&l:lispwords'))
eq('bar,baz,quux', eval('&lispwords'))
- execute('setlocal lispwords<')
+ command('setlocal lispwords<')
eq('foo,bar,baz', eval('&g:lispwords'))
eq('foo,bar,baz', eval('&l:lispwords'))
eq('foo,bar,baz', eval('&lispwords'))
diff --git a/test/functional/legacy/listchars_spec.lua b/test/functional/legacy/listchars_spec.lua
index d2838cddb6..cffb9fd376 100644
--- a/test/functional/legacy/listchars_spec.lua
+++ b/test/functional/legacy/listchars_spec.lua
@@ -2,14 +2,16 @@
local helpers = require('test.functional.helpers')(after_each)
local feed, insert, source = helpers.feed, helpers.insert, helpers.source
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
+-- luacheck: ignore 621 (Indentation)
describe("'listchars'", function()
before_each(function()
clear()
- execute('set listchars&vi')
+ feed_command('set listchars&vi')
end)
+ -- luacheck: ignore 613 (Trailing whitespace in a string)
it("works with 'list'", function()
source([[
function GetScreenCharsForLine(lnum)
@@ -26,14 +28,14 @@ describe("'listchars'", function()
dd ee
]])
- execute('let g:lines = []')
+ feed_command('let g:lines = []')
-- Set up 'listchars', switch on 'list', and use the "GG" mapping to record
-- what the buffer lines look like.
- execute('set listchars+=tab:>-,space:.,trail:<')
- execute('set list')
- execute('/^start:/')
- execute('normal! jzt')
+ feed_command('set listchars+=tab:>-,space:.,trail:<')
+ feed_command('set list')
+ feed_command('/^start:/')
+ feed_command('normal! jzt')
feed('GG<cr>')
feed('GG<cr>')
feed('GG<cr>')
@@ -41,7 +43,7 @@ describe("'listchars'", function()
feed('GGH')
-- Repeat without displaying "trail" spaces.
- execute('set listchars-=trail:<')
+ feed_command('set listchars-=trail:<')
feed('GG<cr>')
feed('GG<cr>')
feed('GG<cr>')
@@ -49,8 +51,8 @@ describe("'listchars'", function()
feed('GG')
-- Delete the buffer contents and :put the collected lines.
- execute('%d')
- execute('put =g:lines', '1d')
+ feed_command('%d')
+ feed_command('put =g:lines', '1d')
-- Assert buffer contents.
expect([[
@@ -76,21 +78,21 @@ describe("'listchars'", function()
-- Set up 'listchars', switch 'list' *off* (:list must show the 'listchars'
-- even when 'list' is off), then run :list and collect the output.
- execute('set listchars+=tab:>-,space:.,trail:<')
- execute('set nolist')
- execute('/^start:/')
- execute('redir! => g:lines')
- execute('+1,$list')
- execute('redir END')
+ feed_command('set listchars+=tab:>-,space:.,trail:<')
+ feed_command('set nolist')
+ feed_command('/^start:/')
+ feed_command('redir! => g:lines')
+ feed_command('+1,$list')
+ feed_command('redir END')
-- Delete the buffer contents and :put the collected lines.
- execute('%d')
- execute('put =g:lines', '1d')
+ feed_command('%d')
+ feed_command('put =g:lines', '1d')
-- Assert buffer contents.
expect([[
-
-
+
+
..fff>--<<$
>-------gg>-----$
.....h>-$
diff --git a/test/functional/legacy/listlbr_spec.lua b/test/functional/legacy/listlbr_spec.lua
index eb979edc69..f70d55f4a3 100644
--- a/test/functional/legacy/listlbr_spec.lua
+++ b/test/functional/legacy/listlbr_spec.lua
@@ -2,162 +2,165 @@
local helpers = require('test.functional.helpers')(after_each)
local feed, insert, source = helpers.feed, helpers.insert, helpers.source
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
describe('listlbr', function()
setup(clear)
+ -- luacheck: ignore 621 (Indentation)
+ -- luacheck: ignore 611 (Line contains only whitespaces)
+ -- luacheck: ignore 613 (Trailing whitespaces in a string)
it('is working', function()
insert([[
dummy text]])
- execute('set wildchar=^E')
- execute('10new')
- execute('vsp')
- execute('vert resize 20')
- execute([[put =\"\tabcdef hijklmn\tpqrstuvwxyz_1060ABCDEFGHIJKLMNOP \"]])
- execute('norm! zt')
- execute('set ts=4 sw=4 sts=4 linebreak sbr=+ wrap')
+ feed_command('set wildchar=^E')
+ feed_command('10new')
+ feed_command('vsp')
+ feed_command('vert resize 20')
+ feed_command([[put =\"\tabcdef hijklmn\tpqrstuvwxyz_1060ABCDEFGHIJKLMNOP \"]])
+ feed_command('norm! zt')
+ feed_command('set ts=4 sw=4 sts=4 linebreak sbr=+ wrap')
source([[
fu! ScreenChar(width)
- let c=''
- for j in range(1,4)
- for i in range(1,a:width)
- let c.=nr2char(screenchar(j, i))
- endfor
- let c.="\n"
- endfor
- return c
+ let c=''
+ for j in range(1,4)
+ for i in range(1,a:width)
+ let c.=nr2char(screenchar(j, i))
+ endfor
+ let c.="\n"
+ endfor
+ return c
endfu
fu! DoRecordScreen()
- wincmd l
- $put =printf(\"\n%s\", g:test)
- $put =g:line
- wincmd p
+ wincmd l
+ $put =printf(\"\n%s\", g:test)
+ $put =g:line
+ wincmd p
endfu
]])
- execute('let g:test="Test 1: set linebreak"')
- execute('redraw!')
- execute('let line=ScreenChar(winwidth(0))')
- execute('call DoRecordScreen()')
-
- execute('let g:test="Test 2: set linebreak + set list"')
- execute('set linebreak list listchars=')
- execute('redraw!')
- execute('let line=ScreenChar(winwidth(0))')
- execute('call DoRecordScreen()')
-
- execute('let g:test ="Test 3: set linebreak nolist"')
- execute('set nolist linebreak')
- execute('redraw!')
- execute('let line=ScreenChar(winwidth(0))')
- execute('call DoRecordScreen()')
-
- execute('let g:test ="Test 4: set linebreak with tab and 1 line as long as screen: should break!"')
- execute('set nolist linebreak ts=8')
- execute([[let line="1\t".repeat('a', winwidth(0)-2)]])
- execute('$put =line')
- execute('$')
- execute('norm! zt')
- execute('redraw!')
- execute('let line=ScreenChar(winwidth(0))')
- execute('call DoRecordScreen()')
- execute([[let line="_S_\t bla"]])
- execute('$put =line')
- execute('$')
- execute('norm! zt')
-
- execute('let g:test ="Test 5: set linebreak with conceal and set list and tab displayed by different char (line may not be truncated)"')
- execute('set cpo&vim list linebreak conceallevel=2 concealcursor=nv listchars=tab:ab')
- execute('syn match ConcealVar contained /_/ conceal')
- execute('syn match All /.*/ contains=ConcealVar')
- execute('let line=ScreenChar(winwidth(0))')
- execute('call DoRecordScreen()')
- execute('set cpo&vim linebreak')
-
- execute('let g:test ="Test 6: set linebreak with visual block mode"')
- execute('let line="REMOVE: this not"')
- execute('$put =g:test')
- execute('$put =line')
- execute('let line="REMOVE: aaaaaaaaaaaaa"')
- execute('$put =line')
- execute('1/^REMOVE:')
+ feed_command('let g:test="Test 1: set linebreak"')
+ feed_command('redraw!')
+ feed_command('let line=ScreenChar(winwidth(0))')
+ feed_command('call DoRecordScreen()')
+
+ feed_command('let g:test="Test 2: set linebreak + set list"')
+ feed_command('set linebreak list listchars=')
+ feed_command('redraw!')
+ feed_command('let line=ScreenChar(winwidth(0))')
+ feed_command('call DoRecordScreen()')
+
+ feed_command('let g:test ="Test 3: set linebreak nolist"')
+ feed_command('set nolist linebreak')
+ feed_command('redraw!')
+ feed_command('let line=ScreenChar(winwidth(0))')
+ feed_command('call DoRecordScreen()')
+
+ feed_command('let g:test ="Test 4: set linebreak with tab and 1 line as long as screen: should break!"')
+ feed_command('set nolist linebreak ts=8')
+ feed_command([[let line="1\t".repeat('a', winwidth(0)-2)]])
+ feed_command('$put =line')
+ feed_command('$')
+ feed_command('norm! zt')
+ feed_command('redraw!')
+ feed_command('let line=ScreenChar(winwidth(0))')
+ feed_command('call DoRecordScreen()')
+ feed_command([[let line="_S_\t bla"]])
+ feed_command('$put =line')
+ feed_command('$')
+ feed_command('norm! zt')
+
+ feed_command('let g:test ="Test 5: set linebreak with conceal and set list and tab displayed by different char (line may not be truncated)"')
+ feed_command('set cpo&vim list linebreak conceallevel=2 concealcursor=nv listchars=tab:ab')
+ feed_command('syn match ConcealVar contained /_/ conceal')
+ feed_command('syn match All /.*/ contains=ConcealVar')
+ feed_command('let line=ScreenChar(winwidth(0))')
+ feed_command('call DoRecordScreen()')
+ feed_command('set cpo&vim linebreak')
+
+ feed_command('let g:test ="Test 6: set linebreak with visual block mode"')
+ feed_command('let line="REMOVE: this not"')
+ feed_command('$put =g:test')
+ feed_command('$put =line')
+ feed_command('let line="REMOVE: aaaaaaaaaaaaa"')
+ feed_command('$put =line')
+ feed_command('1/^REMOVE:')
feed('0<C-V>jf x')
- execute('$put')
- execute('set cpo&vim linebreak')
+ feed_command('$put')
+ feed_command('set cpo&vim linebreak')
- execute('let g:test ="Test 7: set linebreak with visual block mode and v_b_A"')
- execute('$put =g:test')
+ feed_command('let g:test ="Test 7: set linebreak with visual block mode and v_b_A"')
+ feed_command('$put =g:test')
feed('Golong line: <esc>40afoobar <esc>aTARGET at end<esc>')
- execute([[exe "norm! $3B\<C-v>eAx\<Esc>"]])
- execute('set cpo&vim linebreak sbr=')
+ feed_command([[exe "norm! $3B\<C-v>eAx\<Esc>"]])
+ feed_command('set cpo&vim linebreak sbr=')
- execute('let g:test ="Test 8: set linebreak with visual char mode and changing block"')
- execute('$put =g:test')
+ feed_command('let g:test ="Test 8: set linebreak with visual char mode and changing block"')
+ feed_command('$put =g:test')
feed('Go1111-1111-1111-11-1111-1111-1111<esc>0f-lv3lc2222<esc>bgj.')
- execute('let g:test ="Test 9: using redo after block visual mode"')
- execute('$put =g:test')
+ feed_command('let g:test ="Test 9: using redo after block visual mode"')
+ feed_command('$put =g:test')
feed('Go<CR>')
feed('aaa<CR>')
feed('aaa<CR>')
feed('a<ESC>2k<C-V>2j~e.<CR>')
- execute('let g:test ="Test 10: using normal commands after block-visual"')
- execute('$put =g:test')
- execute('set linebreak')
+ feed_command('let g:test ="Test 10: using normal commands after block-visual"')
+ feed_command('$put =g:test')
+ feed_command('set linebreak')
feed('Go<cr>')
feed('abcd{ef<cr>')
feed('ghijklm<cr>')
feed('no}pqrs<esc>2k0f{<C-V><C-V>c%<esc>')
- execute('let g:test ="Test 11: using block replace mode after wrapping"')
- execute('$put =g:test')
- execute('set linebreak wrap')
+ feed_command('let g:test ="Test 11: using block replace mode after wrapping"')
+ feed_command('$put =g:test')
+ feed_command('set linebreak wrap')
feed('Go<esc>150aa<esc>yypk147|<C-V>jr0<cr>')
- execute('let g:test ="Test 12: set linebreak list listchars=space:_,tab:>-,tail:-,eol:$"')
- execute('set list listchars=space:_,trail:-,tab:>-,eol:$')
- execute('$put =g:test')
- execute([[let line="a aaaaaaaaaaaaaaaaaaaaaa\ta "]])
- execute('$put =line')
- execute('$')
- execute('norm! zt')
- execute('redraw!')
- execute('let line=ScreenChar(winwidth(0))')
- execute('call DoRecordScreen()')
+ feed_command('let g:test ="Test 12: set linebreak list listchars=space:_,tab:>-,tail:-,eol:$"')
+ feed_command('set list listchars=space:_,trail:-,tab:>-,eol:$')
+ feed_command('$put =g:test')
+ feed_command([[let line="a aaaaaaaaaaaaaaaaaaaaaa\ta "]])
+ feed_command('$put =line')
+ feed_command('$')
+ feed_command('norm! zt')
+ feed_command('redraw!')
+ feed_command('let line=ScreenChar(winwidth(0))')
+ feed_command('call DoRecordScreen()')
-- Assert buffer contents.
expect([[
-
+
abcdef hijklmn pqrstuvwxyz_1060ABCDEFGHIJKLMNOP
-
+
Test 1: set linebreak
abcdef
+hijklmn
+pqrstuvwxyz_1060ABC
+DEFGHIJKLMNOP
-
+
Test 2: set linebreak + set list
^Iabcdef hijklmn^I
+pqrstuvwxyz_1060ABC
+DEFGHIJKLMNOP
-
+
Test 3: set linebreak nolist
abcdef
+hijklmn
+pqrstuvwxyz_1060ABC
+DEFGHIJKLMNOP
1 aaaaaaaaaaaaaaaaaa
-
+
Test 4: set linebreak with tab and 1 line as long as screen: should break!
1
+aaaaaaaaaaaaaaaaaa
~
~
_S_ bla
-
+
Test 5: set linebreak with conceal and set list and tab displayed by different char (line may not be truncated)
Sabbbbbb bla
~
@@ -173,19 +176,19 @@ describe('listlbr', function()
Test 8: set linebreak with visual char mode and changing block
1111-2222-1111-11-1111-2222-1111
Test 9: using redo after block visual mode
-
+
AaA
AaA
A
Test 10: using normal commands after block-visual
-
+
abcdpqrs
Test 11: using block replace mode after wrapping
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0aaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0aaa
Test 12: set linebreak list listchars=space:_,tab:>-,tail:-,eol:$
a aaaaaaaaaaaaaaaaaaaaaa a
-
+
Test 12: set linebreak list listchars=space:_,tab:>-,tail:-,eol:$
a_
aaaaaaaaaaaaaaaaaaaa
diff --git a/test/functional/legacy/listlbr_utf8_spec.lua b/test/functional/legacy/listlbr_utf8_spec.lua
index f06bca72ba..d7f4c71af2 100644
--- a/test/functional/legacy/listlbr_utf8_spec.lua
+++ b/test/functional/legacy/listlbr_utf8_spec.lua
@@ -8,6 +8,8 @@ local clear, expect = helpers.clear, helpers.expect
describe('linebreak', function()
setup(clear)
+ -- luacheck: ignore 621 (Indentation)
+ -- luacheck: ignore 613 (Trailing whitespaces in a string)
it('is working', function()
source([[
set wildchar=^E
@@ -18,20 +20,20 @@ describe('linebreak', function()
norm! zt
set ts=4 sw=4 sts=4 linebreak sbr=+ wrap
fu! ScreenChar(width, lines)
- let c=''
- for j in range(1,a:lines)
- for i in range(1,a:width)
- let c.=nr2char(screenchar(j, i))
- endfor
+ let c=''
+ for j in range(1,a:lines)
+ for i in range(1,a:width)
+ let c.=nr2char(screenchar(j, i))
+ endfor
let c.="\n"
- endfor
- return c
+ endfor
+ return c
endfu
fu! DoRecordScreen()
- wincmd l
- $put =printf(\"\n%s\", g:test)
- $put =g:line
- wincmd p
+ wincmd l
+ $put =printf(\"\n%s\", g:test)
+ $put =g:line
+ wincmd p
endfu
"
let g:test ="Test 1: set linebreak + set list + fancy listchars"
@@ -148,22 +150,22 @@ describe('linebreak', function()
-- Assert buffer contents.
expect([[
-
+
abcdef hijklmn pqrstuvwxyzย 1060ABCDEFGHIJKLMNOP
-
+
Test 1: set linebreak + set list + fancy listchars
โ–•โ€”โ€”โ€”abcdef
+hijklmnโ–•โ€”โ€”โ€”
+pqrstuvwxyzโฃ1060ABC
+DEFGHIJKLMNOPห‘ยถ
-
+
Test 2: set nolinebreak list
โ–•โ€”โ€”โ€”abcdef hijklmnโ–•โ€”
+pqrstuvwxyzโฃ1060ABC
+DEFGHIJKLMNOPห‘ยถ
ยถ
*mask = nil;
-
+
Test 3: set linebreak nolist
*mask = nil;
~
@@ -177,7 +179,7 @@ describe('linebreak', function()
#define MSG_MODE_CONSOLE 2
#define MSG_MODE_FILE_AND_CONSOLE 3
#define MSG_MODE_FILE_THEN_CONSOLE 4
-
+
Test 4: set linebreak list listchars and concealing
#define ABCDE>-->---1
#define >CDEF>-->---1
@@ -187,7 +189,7 @@ describe('linebreak', function()
#define >_CONSOLE>---------->---2
#define >_FILE_AND_CONSOLE>---------3
bbeeeeee ; some text
-
+
Test 5: set linebreak list listchars and concealing part2
eeeeee>--->-;>some text
Test 6: Screenattributes for comment
@@ -196,10 +198,10 @@ describe('linebreak', function()
Attribut 0 and 1 and 3 and 5 are different!
Test 8: set linebreak with visual block mode and v_b_A and selection=exclusive and multibyte char
long line: foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar TARGETรƒx' at end
-
+
a b c
a b c
-
+
Test 9: a multibyte sign and colorcolumn
ยถ
๏ผ‹a b cยถ
diff --git a/test/functional/legacy/mapping_spec.lua b/test/functional/legacy/mapping_spec.lua
index 1712219d04..56a5652184 100644
--- a/test/functional/legacy/mapping_spec.lua
+++ b/test/functional/legacy/mapping_spec.lua
@@ -2,7 +2,7 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, expect, wait = helpers.execute, helpers.expect, helpers.wait
+local feed_command, expect, wait = helpers.feed_command, helpers.expect, helpers.wait
describe('mapping', function()
before_each(clear)
@@ -13,7 +13,7 @@ describe('mapping', function()
]])
-- Abbreviations with ั€ (0x80) should work.
- execute('inoreab ั‡ะบะฟั€ vim')
+ feed_command('inoreab ั‡ะบะฟั€ vim')
feed('GAั‡ะบะฟั€ <esc>')
expect([[
@@ -23,61 +23,61 @@ describe('mapping', function()
it('Ctrl-c works in Insert mode', function()
-- Mapping of ctrl-c in insert mode
- execute('set cpo-=< cpo-=k')
- execute('inoremap <c-c> <ctrl-c>')
- execute('cnoremap <c-c> dummy')
- execute('cunmap <c-c>')
+ feed_command('set cpo-=< cpo-=k')
+ feed_command('inoremap <c-c> <ctrl-c>')
+ feed_command('cnoremap <c-c> dummy')
+ feed_command('cunmap <c-c>')
feed('GA<cr>')
feed('TEST2: CTRL-C |')
wait()
feed('<c-c>A|<cr><esc>')
wait()
- execute('unmap <c-c>')
- execute('unmap! <c-c>')
+ feed_command('unmap <c-c>')
+ feed_command('unmap! <c-c>')
expect([[
-
+
TEST2: CTRL-C |<ctrl-c>A|
]])
end)
it('Ctrl-c works in Visual mode', function()
- execute([[vnoremap <c-c> :<C-u>$put ='vmap works'<cr>]])
+ feed_command([[vnoremap <c-c> :<C-u>$put ='vmap works'<cr>]])
feed('GV')
-- XXX: For some reason the mapping is only triggered
-- when <C-c> is in a separate feed command.
wait()
feed('<c-c>')
- execute('vunmap <c-c>')
+ feed_command('vunmap <c-c>')
expect([[
-
+
vmap works]])
end)
it('langmap', function()
-- langmap should not get remapped in insert mode.
- execute('inoremap { FAIL_ilangmap')
- execute('set langmap=+{ langnoremap')
+ feed_command('inoremap { FAIL_ilangmap')
+ feed_command('set langmap=+{ langnoremap')
feed('o+<esc>')
-- Insert mode expr mapping with langmap.
- execute('inoremap <expr> { "FAIL_iexplangmap"')
+ feed_command('inoremap <expr> { "FAIL_iexplangmap"')
feed('o+<esc>')
-- langmap should not get remapped in cmdline mode.
- execute('cnoremap { FAIL_clangmap')
+ feed_command('cnoremap { FAIL_clangmap')
feed('o+<esc>')
- execute('cunmap {')
+ feed_command('cunmap {')
-- cmdline mode expr mapping with langmap.
- execute('cnoremap <expr> { "FAIL_cexplangmap"')
+ feed_command('cnoremap <expr> { "FAIL_cexplangmap"')
feed('o+<esc>')
- execute('cunmap {')
+ feed_command('cunmap {')
-- Assert buffer contents.
expect([[
-
+
+
+
+
@@ -91,10 +91,10 @@ describe('mapping', function()
]])
-- Vim's issue #212 (feedkeys insert mapping at current position)
- execute('nnoremap . :call feedkeys(".", "in")<cr>')
+ feed_command('nnoremap . :call feedkeys(".", "in")<cr>')
feed('/^a b<cr>')
feed('0qqdw.ifoo<esc>qj0@q<esc>')
- execute('unmap .')
+ feed_command('unmap .')
expect([[
fooc d
fooc d
@@ -103,23 +103,23 @@ describe('mapping', function()
it('i_CTRL-G_U', function()
-- <c-g>U<cursor> works only within a single line
- execute('imapclear')
- execute('imap ( ()<c-g>U<left>')
+ feed_command('imapclear')
+ feed_command('imap ( ()<c-g>U<left>')
feed('G2o<esc>ki<cr>Test1: text with a (here some more text<esc>k.')
-- test undo
feed('G2o<esc>ki<cr>Test2: text wit a (here some more text [und undo]<c-g>u<esc>k.u')
- execute('imapclear')
- execute('set whichwrap=<,>,[,]')
+ feed_command('imapclear')
+ feed_command('set whichwrap=<,>,[,]')
feed('G3o<esc>2k')
- execute([[:exe ":norm! iTest3: text with a (parenthesis here\<C-G>U\<Right>new line here\<esc>\<up>\<up>."]])
+ feed_command([[:exe ":norm! iTest3: text with a (parenthesis here\<C-G>U\<Right>new line here\<esc>\<up>\<up>."]])
expect([[
-
-
+
+
Test1: text with a (here some more text)
Test1: text with a (here some more text)
-
-
+
+
Test2: text wit a (here some more text [und undo])
new line here
Test3: text with a (parenthesis here
diff --git a/test/functional/legacy/marks_spec.lua b/test/functional/legacy/marks_spec.lua
index 6ecba70f08..470ea49652 100644
--- a/test/functional/legacy/marks_spec.lua
+++ b/test/functional/legacy/marks_spec.lua
@@ -1,22 +1,23 @@
local helpers = require('test.functional.helpers')(after_each)
local feed, insert, source = helpers.feed, helpers.insert, helpers.source
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
describe('marks', function()
before_each(function()
clear()
end)
+ -- luacheck: ignore 621 (Indentation)
it('restores a deleted mark after delete-undo-redo-undo', function()
insert([[
-
+
textline A
textline B
textline C
-
+
Results:]])
- execute([[:/^\t/+1]])
+ feed_command([[:/^\t/+1]])
feed([[maddu<C-R>u]])
source([[
let g:a = string(getpos("'a"))
@@ -24,11 +25,11 @@ describe('marks', function()
]])
expect([=[
-
+
textline A
textline B
textline C
-
+
Results:
Mark after delete-undo-redo-undo: [0, 3, 2, 0]]=])
end)
diff --git a/test/functional/legacy/match_conceal_spec.lua b/test/functional/legacy/match_conceal_spec.lua
deleted file mode 100644
index d95b07d695..0000000000
--- a/test/functional/legacy/match_conceal_spec.lua
+++ /dev/null
@@ -1,228 +0,0 @@
--- Test for matchadd() and conceal feature
-
-local helpers = require('test.functional.helpers')(after_each)
-local clear = helpers.clear
-local expect = helpers.expect
-local source = helpers.source
-
-describe('match_conceal', function()
- before_each(function()
- clear()
-
- source([[
- set wildchar=^E
- 10new
- vsp
- vert resize 20
- put =\"\#\ This\ is\ a\ Test\"
- norm! mazt
-
- fu! ScreenChar(width, lines)
- let c=''
- for j in range(1,a:lines)
- for i in range(1,a:width)
- let c.=nr2char(screenchar(j, i))
- endfor
- let c.="\n"
- endfor
- return c
- endfu
-
- fu! ScreenAttr(line, pos, eval)
- let g:attr=[]
- for col in a:pos
- call add(g:attr, screenattr(a:line,col))
- endfor
- " In case all values are zero, probably the terminal
- " isn't set correctly, so catch that case
- let null = (eval(join(g:attr, '+')) == 0)
- let str=substitute(a:eval, '\d\+', 'g:attr[&]', 'g')
- if null || eval(str)
- let g:attr_test="OK: ". str
- else
- let g:attr_test="FAILED: ".str
- let g:attr_test.="\n". join(g:attr, ' ')
- let g:attr_test.="\n TERM: ". &term
- endif
- endfu
-
- fu! DoRecordScreen()
- wincmd l
- $put =printf(\"\n%s\", g:test)
- $put =g:line
- $put =g:attr_test
- wincmd p
- endfu
- ]])
- end)
-
- it('is working', function()
- source([=[
- let g:test ="Test 1: simple addmatch()"
- call matchadd('Conceal', '\%2l ')
- redraw!
- let line=ScreenChar(winwidth(0),1)
- call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5")
- call DoRecordScreen()
-
- let g:test ="Test 2: simple addmatch() and conceal (should be: #XThisXisXaXTest)"
- norm! 'azt
- call clearmatches()
- syntax on
- set concealcursor=n conceallevel=1
- call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'X'})
- redraw!
- let line=ScreenChar(winwidth(0),1)
- call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5")
- call DoRecordScreen()
-
- let g:test ="Test 3: addmatch() and conceallevel=3 (should be: #ThisisaTest)"
- norm! 'azt
- set conceallevel=3
- call clearmatches()
- call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'X'})
- redraw!
- let line=ScreenChar(winwidth(0),1)
- call ScreenAttr(1,[1,2,7,10,12,16], "0==1 && 1==2 && 1==3 && 1==4 && 0!=5")
- call DoRecordScreen()
-
- let g:test ="Test 4: more match() (should be: #Thisisa Test)"
- norm! 'azt
- call matchadd('ErrorMsg', '\%2l Test', 20, -1, {'conceal': 'X'})
- redraw!
- let line=ScreenChar(winwidth(0),1)
- call ScreenAttr(1,[1,2,7,10,12,16], "0==1 && 1==2 && 0!=3 && 3==4 && 0!=5 && 3!=5")
- call DoRecordScreen()
-
- let g:test ="Test 5/1: default conceal char (should be: # This is a Test)"
- norm! 'azt
- call clearmatches()
- set conceallevel=1
- call matchadd('Conceal', '\%2l ', 10, -1, {})
- redraw!
- let line=ScreenChar(winwidth(0),1)
- call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5")
- call DoRecordScreen()
- let g:test ="Test 5/2: default conceal char (should be: #+This+is+a+Test)"
- norm! 'azt
- set listchars=conceal:+
- redraw!
- let line=ScreenChar(winwidth(0),1)
- call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5")
- call DoRecordScreen()
- set listchars&vi
-
- let g:test ="Test 6/1: syn and match conceal (should be: #ZThisZisZaZTest)"
- norm! 'azt
- call clearmatches()
- set conceallevel=1
- call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'Z'})
- syn match MyConceal /\%2l / conceal containedin=ALL cchar=*
- redraw!
- let line=ScreenChar(winwidth(0),1)
- call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5")
- call DoRecordScreen()
- let g:test ="Test 6/2: syn and match conceal (should be: #*This*is*a*Test)"
- norm! 'azt
- call clearmatches()
- redraw!
- let line=ScreenChar(winwidth(0),1)
- call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5")
- call DoRecordScreen()
-
- let g:test ="Test 7/1: clear matches"
- norm! 'azt
- syn on
- call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'Z'})
- let a=getmatches()
- call clearmatches()
- redraw!
- let line=ScreenChar(winwidth(0),1)
- call ScreenAttr(1,[1,2,7,10,12,16], "0==1 && 0==2 && 0==3 && 0==4 && 0==5")
- call DoRecordScreen()
- $put =a
- call setmatches(a)
- norm! 'azt
- let g:test ="Test 7/2: reset match using setmatches()"
- norm! 'azt
- redraw!
- let line=ScreenChar(winwidth(0),1)
- call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5")
- call DoRecordScreen()
-
- let g:test ="Test 8: using matchaddpos() (should be #Pis a Test"
- norm! 'azt
- call clearmatches()
- call matchaddpos('Conceal', [[2,2,6]], 10, -1, {'conceal': 'P'})
- let a=getmatches()
- redraw!
- let line=ScreenChar(winwidth(0),1)
- call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1!=2 && 0==2 && 0==3 && 0!=4 && 0!=5 && 4==5")
- call DoRecordScreen()
- $put =a
-
- let g:test ="Test 9: match using multibyte conceal char (should be: #ห‘Thisห‘isห‘aห‘Test)"
- norm! 'azt
- call clearmatches()
- call matchadd('Conceal', '\%2l ', 20, -1, {'conceal': "\u02d1"})
- redraw!
- let line=ScreenChar(winwidth(0),1)
- call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5")
- call DoRecordScreen()
- ]=])
-
- expect([=[
-
- # This is a Test
-
- Test 1: simple addmatch()
- # This is a Test
- OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5]
-
- Test 2: simple addmatch() and conceal (should be: #XThisXisXaXTest)
- #XThisXisXaXTest
- OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5]
-
- Test 3: addmatch() and conceallevel=3 (should be: #ThisisaTest)
- #ThisisaTest
- OK: g:attr[0]==g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]!=g:attr[5]
-
- Test 4: more match() (should be: #Thisisa Test)
- #Thisisa Test
- OK: g:attr[0]==g:attr[1] && g:attr[1]==g:attr[2] && g:attr[0]!=g:attr[3] && g:attr[3]==g:attr[4] && g:attr[0]!=g:attr[5] && g:attr[3]!=g:attr[5]
-
- Test 5/1: default conceal char (should be: # This is a Test)
- # This is a Test
- OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5]
-
- Test 5/2: default conceal char (should be: #+This+is+a+Test)
- #+This+is+a+Test
- OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5]
-
- Test 6/1: syn and match conceal (should be: #ZThisZisZaZTest)
- #ZThisZisZaZTest
- OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5]
-
- Test 6/2: syn and match conceal (should be: #*This*is*a*Test)
- #*This*is*a*Test
- OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5]
-
- Test 7/1: clear matches
- # This is a Test
- OK: g:attr[0]==g:attr[1] && g:attr[0]==g:attr[2] && g:attr[0]==g:attr[3] && g:attr[0]==g:attr[4] && g:attr[0]==g:attr[5]
- {'group': 'Conceal', 'pattern': '\%2l ', 'priority': 10, 'id': 10, 'conceal': 'Z'}
-
- Test 7/2: reset match using setmatches()
- #ZThisZisZaZTest
- OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5]
-
- Test 8: using matchaddpos() (should be #Pis a Test
- #Pis a Test
- OK: g:attr[0]!=g:attr[1] && g:attr[1]!=g:attr[2] && g:attr[0]==g:attr[2] && g:attr[0]==g:attr[3] && g:attr[0]!=g:attr[4] && g:attr[0]!=g:attr[5] && g:attr[4]==g:attr[5]
- {'group': 'Conceal', 'id': 11, 'priority': 10, 'pos1': [2, 2, 6], 'conceal': 'P'}
-
- Test 9: match using multibyte conceal char (should be: #ห‘Thisห‘isห‘aห‘Test)
- #ห‘Thisห‘isห‘aห‘Test
- OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5]]=])
- end)
-end)
diff --git a/test/functional/legacy/nested_function_spec.lua b/test/functional/legacy/nested_function_spec.lua
index be9b66ee38..7a2ba1ecf2 100644
--- a/test/functional/legacy/nested_function_spec.lua
+++ b/test/functional/legacy/nested_function_spec.lua
@@ -2,7 +2,7 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, insert = helpers.clear, helpers.insert
-local execute, expect, source = helpers.execute, helpers.expect, helpers.source
+local command, expect, source = helpers.command, helpers.expect, helpers.source
describe('test_nested_function', function()
setup(clear)
@@ -36,7 +36,7 @@ describe('test_nested_function', function()
: endfunction
: call s:{fn}()
:endfunction]])
- execute('call NestedFunc()')
+ command('call NestedFunc()')
-- Assert buffer contents.
expect([[
diff --git a/test/functional/legacy/options_spec.lua b/test/functional/legacy/options_spec.lua
index 4f4d4ceaf9..1db7afc7a7 100644
--- a/test/functional/legacy/options_spec.lua
+++ b/test/functional/legacy/options_spec.lua
@@ -21,7 +21,7 @@ describe('set', function()
$put =&path]])
expect([[
-
+
foo,,bar]])
end)
end)
diff --git a/test/functional/legacy/packadd_spec.lua b/test/functional/legacy/packadd_spec.lua
index b2ed39f288..609f825177 100644
--- a/test/functional/legacy/packadd_spec.lua
+++ b/test/functional/legacy/packadd_spec.lua
@@ -1,7 +1,7 @@
-- Tests for 'packpath' and :packadd
local helpers = require('test.functional.helpers')(after_each)
-local clear, source, execute = helpers.clear, helpers.source, helpers.execute
+local clear, source, command = helpers.clear, helpers.source, helpers.command
local call, eq, nvim = helpers.call, helpers.eq, helpers.meths
local feed = helpers.feed
@@ -14,10 +14,14 @@ describe('packadd', function()
clear()
source([=[
+ func Escape(s)
+ return escape(a:s, '\~')
+ endfunc
+
func SetUp()
- let s:topdir = expand('%:p:h') . '/Xdir'
+ let s:topdir = expand(getcwd() . '/Xdir')
exe 'set packpath=' . s:topdir
- let s:plugdir = s:topdir . '/pack/mine/opt/mytest'
+ let s:plugdir = expand(s:topdir . '/pack/mine/opt/mytest')
endfunc
func TearDown()
@@ -25,17 +29,34 @@ describe('packadd', function()
endfunc
func Test_packadd()
- call mkdir(s:plugdir . '/plugin', 'p')
+ if !exists('s:plugdir')
+ echomsg 'when running this test manually, call SetUp() first'
+ return
+ endif
+
+ call mkdir(s:plugdir . '/plugin/also', 'p')
call mkdir(s:plugdir . '/ftdetect', 'p')
call mkdir(s:plugdir . '/after', 'p')
set rtp&
let rtp = &rtp
filetype on
+ let rtp_entries = split(rtp, ',')
+ for entry in rtp_entries
+ if entry =~? '\<after\>'
+ let first_after_entry = entry
+ break
+ endif
+ endfor
+
exe 'split ' . s:plugdir . '/plugin/test.vim'
call setline(1, 'let g:plugin_works = 42')
wq
+ exe 'split ' . s:plugdir . '/plugin/also/loaded.vim'
+ call setline(1, 'let g:plugin_also_works = 77')
+ wq
+
exe 'split ' . s:plugdir . '/ftdetect/test.vim'
call setline(1, 'let g:ftdetect_works = 17')
wq
@@ -43,16 +64,50 @@ describe('packadd', function()
packadd mytest
call assert_true(42, g:plugin_works)
+ call assert_equal(77, g:plugin_also_works)
call assert_true(17, g:ftdetect_works)
call assert_true(len(&rtp) > len(rtp))
- call assert_true(&rtp =~ (s:plugdir . '\($\|,\)'))
- call assert_true(&rtp =~ (s:plugdir . '/after$'))
+ call assert_match(Escape(s:plugdir) . '\($\|,\)', &rtp)
+
+ let new_after = match(&rtp, Escape(expand(s:plugdir . '/after') . ','))
+ let forwarded = substitute(first_after_entry, '\\', '[/\\\\]', 'g')
+ let old_after = match(&rtp, ',' . escape(forwarded, '~') . '\>')
+ call assert_true(new_after > 0, 'rtp is ' . &rtp)
+ call assert_true(old_after > 0, 'match ' . forwarded . ' in ' . &rtp)
+ call assert_true(new_after < old_after, 'rtp is ' . &rtp)
+
+ " NOTE: '/.../opt/myte' forwardly matches with '/.../opt/mytest'
+ call mkdir(fnamemodify(s:plugdir, ':h') . '/myte', 'p')
+ let rtp = &rtp
+ packadd myte
+
+ " Check the path of 'myte' is added
+ call assert_true(len(&rtp) > len(rtp))
+ call assert_match(Escape(s:plugdir) . '\($\|,\)', &rtp)
" Check exception
call assert_fails("packadd directorynotfound", 'E919:')
call assert_fails("packadd", 'E471:')
endfunc
+ func Test_packadd_start()
+ let plugdir = expand(s:topdir . '/pack/mine/start/other')
+ call mkdir(plugdir . '/plugin', 'p')
+ set rtp&
+ let rtp = &rtp
+ filetype on
+
+ exe 'split ' . plugdir . '/plugin/test.vim'
+ call setline(1, 'let g:plugin_works = 24')
+ wq
+
+ packadd other
+
+ call assert_equal(24, g:plugin_works)
+ call assert_true(len(&rtp) > len(rtp))
+ call assert_match(Escape(plugdir) . '\($\|,\)', &rtp)
+ endfunc
+
func Test_packadd_noload()
call mkdir(s:plugdir . '/plugin', 'p')
call mkdir(s:plugdir . '/syntax', 'p')
@@ -67,7 +122,7 @@ describe('packadd', function()
packadd! mytest
call assert_true(len(&rtp) > len(rtp))
- call assert_true(&rtp =~ (s:plugdir . '\($\|,\)'))
+ call assert_match(Escape(s:plugdir) . '\($\|,\)', &rtp)
call assert_equal(0, g:plugin_works)
" check the path is not added twice
@@ -76,6 +131,84 @@ describe('packadd', function()
call assert_equal(new_rtp, &rtp)
endfunc
+ func Test_packadd_symlink_dir()
+ let top2_dir = expand(s:topdir . '/Xdir2')
+ let real_dir = expand(s:topdir . '/Xsym')
+ call mkdir(real_dir, 'p')
+ if has('win32')
+ exec "silent! !mklink /d" top2_dir "Xsym"
+ else
+ exec "silent! !ln -s Xsym" top2_dir
+ endif
+ let &rtp = top2_dir . ',' . expand(top2_dir . '/after')
+ let &packpath = &rtp
+
+ let s:plugdir = expand(top2_dir . '/pack/mine/opt/mytest')
+ call mkdir(s:plugdir . '/plugin', 'p')
+
+ exe 'split ' . s:plugdir . '/plugin/test.vim'
+ call setline(1, 'let g:plugin_works = 44')
+ wq
+ let g:plugin_works = 0
+
+ packadd mytest
+
+ " Must have been inserted in the middle, not at the end
+ call assert_match(Escape(expand('/pack/mine/opt/mytest').','), &rtp)
+ call assert_equal(44, g:plugin_works)
+
+ " No change when doing it again.
+ let rtp_before = &rtp
+ packadd mytest
+ call assert_equal(rtp_before, &rtp)
+
+ set rtp&
+ let rtp = &rtp
+ exec "silent !" (has('win32') ? "rd /q/s" : "rm") top2_dir
+ endfunc
+
+ func Test_packadd_symlink_dir2()
+ let top2_dir = expand(s:topdir . '/Xdir2')
+ let real_dir = expand(s:topdir . '/Xsym/pack')
+ call mkdir(top2_dir, 'p')
+ call mkdir(real_dir, 'p')
+ let &rtp = top2_dir . ',' . top2_dir . '/after'
+ let &packpath = &rtp
+
+ if has('win32')
+ exec "silent! !mklink /d" top2_dir "Xsym"
+ else
+ exec "silent !ln -s ../Xsym/pack" top2_dir . '/pack'
+ endif
+ let s:plugdir = expand(top2_dir . '/pack/mine/opt/mytest')
+ call mkdir(s:plugdir . '/plugin', 'p')
+
+ exe 'split ' . s:plugdir . '/plugin/test.vim'
+ call setline(1, 'let g:plugin_works = 48')
+ wq
+ let g:plugin_works = 0
+
+ packadd mytest
+
+ " Must have been inserted in the middle, not at the end
+ call assert_match(Escape(expand('/Xdir2/pack/mine/opt/mytest').','), &rtp)
+ call assert_equal(48, g:plugin_works)
+
+ " No change when doing it again.
+ let rtp_before = &rtp
+ packadd mytest
+ call assert_equal(rtp_before, &rtp)
+
+ set rtp&
+ let rtp = &rtp
+ if has('win32')
+ exec "silent !rd /q/s" top2_dir
+ else
+ exec "silent !rm" top2_dir . '/pack'
+ exec "silent !rmdir" top2_dir
+ endif
+ endfunc
+
func Test_packloadall()
" plugin foo with an autoload directory
let fooplugindir = &packpath . '/pack/mine/start/foo/plugin'
@@ -130,10 +263,10 @@ describe('packadd', function()
helptags ALL
- let tags1 = readfile(docdir1 . '/tags')
- call assert_true(tags1[0] =~ 'look-here')
- let tags2 = readfile(docdir2 . '/tags')
- call assert_true(tags2[0] =~ 'look-away')
+ let tags1 = readfile(docdir1 . '/tags')
+ call assert_match('look-here', tags1[0])
+ let tags2 = readfile(docdir2 . '/tags')
+ call assert_match('look-away', tags2[0])
endfunc
func Test_colorscheme()
@@ -220,6 +353,11 @@ describe('packadd', function()
expected_empty()
end)
+ it('works with symlinks', function()
+ call('Test_packadd_symlink_dir')
+ expected_empty()
+ end)
+
it('works with :packloadall', function()
call('Test_packloadall')
expected_empty()
@@ -240,6 +378,11 @@ describe('packadd', function()
expected_empty()
end)
+ it('loads packages from "start" directory', function()
+ call('Test_packadd_start')
+ expected_empty()
+ end)
+
describe('command line completion', function()
local Screen = require('test.functional.ui.screen')
local screen
@@ -248,53 +391,52 @@ describe('packadd', function()
screen = Screen.new(30, 5)
screen:attach()
screen:set_default_attr_ids({
+ [0] = {bold=true, foreground=Screen.colors.Blue},
[1] = {
foreground = Screen.colors.Black,
background = Screen.colors.Yellow,
},
[2] = {bold = true, reverse = true}
})
- local NonText = Screen.colors.Blue
- screen:set_default_attr_ignore({{}, {bold=true, foreground=NonText}})
-
- execute([[let optdir1 = &packpath . '/pack/mine/opt']])
- execute([[let optdir2 = &packpath . '/pack/candidate/opt']])
- execute([[call mkdir(optdir1 . '/pluginA', 'p')]])
- execute([[call mkdir(optdir1 . '/pluginC', 'p')]])
- execute([[call mkdir(optdir2 . '/pluginB', 'p')]])
- execute([[call mkdir(optdir2 . '/pluginC', 'p')]])
+
+ command([[let optdir1 = &packpath . '/pack/mine/opt']])
+ command([[let optdir2 = &packpath . '/pack/candidate/opt']])
+ command([[call mkdir(optdir1 . '/pluginA', 'p')]])
+ command([[call mkdir(optdir1 . '/pluginC', 'p')]])
+ command([[call mkdir(optdir2 . '/pluginB', 'p')]])
+ command([[call mkdir(optdir2 . '/pluginC', 'p')]])
end)
it('works', function()
feed(':packadd <Tab>')
screen:expect([=[
|
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
{1:pluginA}{2: pluginB pluginC }|
:packadd pluginA^ |
]=])
feed('<Tab>')
screen:expect([=[
|
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
{2:pluginA }{1:pluginB}{2: pluginC }|
:packadd pluginB^ |
]=])
feed('<Tab>')
screen:expect([=[
|
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
{2:pluginA pluginB }{1:pluginC}{2: }|
:packadd pluginC^ |
]=])
feed('<Tab>')
screen:expect([=[
|
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
{2:pluginA pluginB pluginC }|
:packadd ^ |
]=])
@@ -316,32 +458,32 @@ describe('packadd', function()
feed(':colorscheme <Tab>')
screen:expect([=[
|
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
{1:one}{2: three two }|
:colorscheme one^ |
]=])
feed('<Tab>')
screen:expect([=[
|
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
{2:one }{1:three}{2: two }|
:colorscheme three^ |
]=])
feed('<Tab>')
screen:expect([=[
|
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
{2:one three }{1:two}{2: }|
:colorscheme two^ |
]=])
feed('<Tab>')
screen:expect([=[
|
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
{2:one three two }|
:colorscheme ^ |
]=])
diff --git a/test/functional/legacy/quickfix_spec.lua b/test/functional/legacy/quickfix_spec.lua
deleted file mode 100644
index df8f2625db..0000000000
--- a/test/functional/legacy/quickfix_spec.lua
+++ /dev/null
@@ -1,342 +0,0 @@
--- Test for the quickfix commands.
-
-local helpers = require('test.functional.helpers')(after_each)
-local source, clear = helpers.source, helpers.clear
-local eq, nvim, call = helpers.eq, helpers.meths, helpers.call
-local eval = helpers.eval
-local execute = helpers.execute
-
-local function expected_empty()
- eq({}, nvim.get_vvar('errors'))
-end
-
-describe('helpgrep', function()
- before_each(function()
- clear()
-
- source([[
- " Tests for the :clist and :llist commands
- function XlistTests(cchar)
- let Xlist = a:cchar . 'list'
- let Xgetexpr = a:cchar . 'getexpr'
-
- " With an empty list, command should return error
- exe Xgetexpr . ' []'
- exe 'silent! ' . Xlist
- call assert_true(v:errmsg ==# 'E42: No Errors')
-
- " Populate the list and then try
- exe Xgetexpr . " ['non-error 1', 'Xtestfile1:1:3:Line1',
- \ 'non-error 2', 'Xtestfile2:2:2:Line2',
- \ 'non-error 3', 'Xtestfile3:3:1:Line3']"
-
- " List only valid entries
- redir => result
- exe 'silent ' . Xlist
- redir END
- let l = split(result, "\n")
- call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
- \ ' 4 Xtestfile2:2 col 2: Line2',
- \ ' 6 Xtestfile3:3 col 1: Line3'], l)
-
- " List all the entries
- redir => result
- exe 'silent ' . Xlist . "!"
- redir END
- let l = split(result, "\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)
-
- " List a range of errors
- redir => result
- exe 'silent '. Xlist . " 3,6"
- redir END
- let l = split(result, "\n")
- call assert_equal([' 4 Xtestfile2:2 col 2: Line2',
- \ ' 6 Xtestfile3:3 col 1: Line3'], l)
-
- redir => result
- exe 'silent ' . Xlist . "! 3,4"
- redir END
- let l = split(result, "\n")
- call assert_equal([' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
-
- redir => result
- exe 'silent ' . Xlist . " -6,-4"
- redir END
- let l = split(result, "\n")
- call assert_equal([' 2 Xtestfile1:1 col 3: Line1'], l)
-
- redir => result
- exe 'silent ' . Xlist . "! -5,-3"
- redir END
- let l = split(result, "\n")
- call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
- \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
- endfunction
-
- " Tests for the :colder, :cnewer, :lolder and :lnewer commands
- " Note that this test assumes that a quickfix/location list is
- " already set by the caller
- function XageTests(cchar)
- let Xolder = a:cchar . 'older'
- let Xnewer = a:cchar . 'newer'
- let Xgetexpr = a:cchar . 'getexpr'
- if a:cchar == 'c'
- let Xgetlist = 'getqflist()'
- else
- let Xgetlist = 'getloclist(0)'
- endif
-
- " Jumping to a non existent list should return error
- exe 'silent! ' . Xolder . ' 99'
- call assert_true(v:errmsg ==# 'E380: At bottom of quickfix stack')
-
- exe 'silent! ' . Xnewer . ' 99'
- call assert_true(v:errmsg ==# 'E381: At top of quickfix stack')
-
- " Add three quickfix/location lists
- exe Xgetexpr . " ['Xtestfile1:1:3:Line1']"
- exe Xgetexpr . " ['Xtestfile2:2:2:Line2']"
- exe Xgetexpr . " ['Xtestfile3:3:1:Line3']"
-
- " Go back two lists
- exe Xolder
- exe 'let l = ' . Xgetlist
- call assert_equal('Line2', l[0].text)
-
- " Go forward two lists
- exe Xnewer
- exe 'let l = ' . Xgetlist
- call assert_equal('Line3', l[0].text)
-
- " Test for the optional count argument
- exe Xolder . ' 2'
- exe 'let l = ' . Xgetlist
- call assert_equal('Line1', l[0].text)
-
- exe Xnewer . ' 2'
- exe 'let l = ' . Xgetlist
- call assert_equal('Line3', l[0].text)
- endfunction
-
- " Tests for the :cwindow, :lwindow :cclose, :lclose, :copen and :lopen
- " commands
- function XwindowTests(cchar)
- let Xwindow = a:cchar . 'window'
- let Xclose = a:cchar . 'close'
- let Xopen = a:cchar . 'open'
- let Xgetexpr = a:cchar . 'getexpr'
-
- " Create a list with no valid entries
- exe Xgetexpr . " ['non-error 1', 'non-error 2', 'non-error 3']"
-
- " Quickfix/Location window should not open with no valid errors
- exe Xwindow
- call assert_true(winnr('$') == 1)
-
- " Create a list with valid entries
- exe Xgetexpr . " ['Xtestfile1:1:3:Line1', 'Xtestfile2:2:2:Line2',
- \ 'Xtestfile3:3:1:Line3']"
-
- " Open the window
- exe Xwindow
- call assert_true(winnr('$') == 2 && winnr() == 2 &&
- \ getline('.') ==# 'Xtestfile1|1 col 3| Line1')
-
- " Close the window
- exe Xclose
- call assert_true(winnr('$') == 1)
-
- " Create a list with no valid entries
- exe Xgetexpr . " ['non-error 1', 'non-error 2', 'non-error 3']"
-
- " Open the window
- exe Xopen . ' 5'
- call assert_true(winnr('$') == 2 && getline('.') ==# '|| non-error 1'
- \ && winheight('.') == 5)
-
- " Opening the window again, should move the cursor to that window
- wincmd t
- exe Xopen . ' 7'
- call assert_true(winnr('$') == 2 && winnr() == 2 &&
- \ winheight('.') == 7 &&
- \ getline('.') ==# '|| non-error 1')
-
-
- " Calling cwindow should close the quickfix window with no valid errors
- exe Xwindow
- call assert_true(winnr('$') == 1)
- endfunction
-
- " Tests for the :cfile, :lfile, :caddfile, :laddfile, :cgetfile and :lgetfile
- " commands.
- function XfileTests(cchar)
- let Xfile = a:cchar . 'file'
- let Xgetfile = a:cchar . 'getfile'
- let Xaddfile = a:cchar . 'addfile'
- if a:cchar == 'c'
- let Xgetlist = 'getqflist()'
- else
- let Xgetlist = 'getloclist(0)'
- endif
-
- call writefile(['Xtestfile1:700:10:Line 700',
- \ 'Xtestfile2:800:15:Line 800'], 'Xqftestfile1')
-
- enew!
- exe Xfile . ' Xqftestfile1'
- exe 'let l = ' . Xgetlist
- call assert_true(len(l) == 2 &&
- \ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
- \ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
-
- " Run cfile/lfile from a modified buffer
- enew!
- silent! put ='Quickfix'
- exe 'silent! ' . Xfile . ' Xqftestfile1'
- call assert_true(v:errmsg ==# 'E37: No write since last change (add ! to override)')
-
- call writefile(['Xtestfile3:900:30:Line 900'], 'Xqftestfile1')
- exe Xaddfile . ' Xqftestfile1'
- exe 'let l = ' . Xgetlist
- call assert_true(len(l) == 3 &&
- \ l[2].lnum == 900 && l[2].col == 30 && l[2].text ==# 'Line 900')
-
- call writefile(['Xtestfile1:222:77:Line 222',
- \ 'Xtestfile2:333:88:Line 333'], 'Xqftestfile1')
-
- enew!
- exe Xgetfile . ' Xqftestfile1'
- exe 'let l = ' . Xgetlist
- call assert_true(len(l) == 2 &&
- \ l[0].lnum == 222 && l[0].col == 77 && l[0].text ==# 'Line 222' &&
- \ l[1].lnum == 333 && l[1].col == 88 && l[1].text ==# 'Line 333')
-
- call delete('Xqftestfile1')
- endfunction
-
- " Tests for the :cbuffer, :lbuffer, :caddbuffer, :laddbuffer, :cgetbuffer and
- " :lgetbuffer commands.
- function XbufferTests(cchar)
- let Xbuffer = a:cchar . 'buffer'
- let Xgetbuffer = a:cchar . 'getbuffer'
- let Xaddbuffer = a:cchar . 'addbuffer'
- if a:cchar == 'c'
- let Xgetlist = 'getqflist()'
- else
- let Xgetlist = 'getloclist(0)'
- endif
-
- enew!
- silent! call setline(1, ['Xtestfile7:700:10:Line 700',
- \ 'Xtestfile8:800:15:Line 800'])
- exe Xbuffer . "!"
- exe 'let l = ' . Xgetlist
- call assert_true(len(l) == 2 &&
- \ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
- \ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
-
- enew!
- silent! call setline(1, ['Xtestfile9:900:55:Line 900',
- \ 'Xtestfile10:950:66:Line 950'])
- exe Xgetbuffer
- exe 'let l = ' . Xgetlist
- call assert_true(len(l) == 2 &&
- \ l[0].lnum == 900 && l[0].col == 55 && l[0].text ==# 'Line 900' &&
- \ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950')
-
- enew!
- silent! call setline(1, ['Xtestfile11:700:20:Line 700',
- \ 'Xtestfile12:750:25:Line 750'])
- exe Xaddbuffer
- exe 'let l = ' . Xgetlist
- call assert_true(len(l) == 4 &&
- \ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950' &&
- \ l[2].lnum == 700 && l[2].col == 20 && l[2].text ==# 'Line 700' &&
- \ l[3].lnum == 750 && l[3].col == 25 && l[3].text ==# 'Line 750')
-
- endfunction
-
- function Test_locationlist_curwin_was_closed()
- augroup testgroup
- au!
- autocmd BufReadCmd t call R(expand("<amatch>"))
- augroup END
-
- function R(n)
- quit
- endfunc
-
- new
- let q = []
- call add(q, {'filename': 't' })
- call setloclist(0, q)
- call assert_fails('lrewind', 'E924:')
-
- augroup! testgroup
- endfunction
- ]])
- end)
-
- it('copen/cclose work', function()
- source([[
- helpgrep quickfix
- copen
- " This wipes out the buffer, make sure that doesn't cause trouble.
- cclose
- ]])
- end)
-
- it('clist/llist work', function()
- call('XlistTests', 'c')
- expected_empty()
- call('XlistTests', 'l')
- expected_empty()
- end)
-
- it('colder/cnewer and lolder/lnewer work', function()
- local list = {{bufnr = 1, lnum = 1}}
- call('setqflist', list)
- call('XageTests', 'c')
- expected_empty()
-
- call('setloclist', 0, list)
- call('XageTests', 'l')
- expected_empty()
- end)
-
- it('quickfix/location list window commands work', function()
- call('XwindowTests', 'c')
- expected_empty()
- call('XwindowTests', 'l')
- expected_empty()
- end)
-
- it('quickfix/location list file commands work', function()
- call('XfileTests', 'c')
- expected_empty()
- call('XfileTests', 'l')
- expected_empty()
- end)
-
- it('quickfix/location list buffer commands work', function()
- call('XbufferTests', 'c')
- expected_empty()
- call('XbufferTests', 'l')
- expected_empty()
- end)
-
- it('autocommands triggered by quickfix can get title', function()
- execute('au FileType qf let g:foo = get(w:, "quickfix_title", "NONE")')
- execute('call setqflist([])')
- execute('copen')
- eq(':setqflist()', eval('g:foo'))
- end)
-
- it('errors when an autocommand closes the location list\'s window', function()
- call('Test_locationlist_curwin_was_closed')
- expected_empty()
- end)
-end)
diff --git a/test/functional/legacy/search_mbyte_spec.lua b/test/functional/legacy/search_mbyte_spec.lua
index a5a5822a45..a365f79cdf 100644
--- a/test/functional/legacy/search_mbyte_spec.lua
+++ b/test/functional/legacy/search_mbyte_spec.lua
@@ -1,6 +1,10 @@
local helpers = require('test.functional.helpers')(after_each)
+
+local wait = helpers.wait
+local clear = helpers.clear
local insert = helpers.insert
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local expect = helpers.expect
+local command = helpers.command
describe('search_mbyte', function()
before_each(clear)
@@ -8,17 +12,18 @@ describe('search_mbyte', function()
it("search('multi-byte char', 'bce')", function()
insert([=[
Results:
-
+
Test bce:
๏ผก]=])
+ wait()
- execute('/^Test bce:/+1')
- execute([[$put =search('๏ผก', 'bce', line('.'))]])
+ command('/^Test bce:/+1')
+ command([[$put =search('๏ผก', 'bce', line('.'))]])
-- Assert buffer contents.
expect([=[
Results:
-
+
Test bce:
๏ผก
4]=])
diff --git a/test/functional/legacy/search_spec.lua b/test/functional/legacy/search_spec.lua
new file mode 100644
index 0000000000..3ed06a22e7
--- /dev/null
+++ b/test/functional/legacy/search_spec.lua
@@ -0,0 +1,593 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+local clear = helpers.clear
+local command = helpers.command
+local eq = helpers.eq
+local eval = helpers.eval
+local feed = helpers.feed
+local funcs = helpers.funcs
+local wait = helpers.wait
+
+describe('search cmdline', function()
+ local screen
+
+ before_each(function()
+ clear()
+ command('set nohlsearch')
+ screen = Screen.new(20, 3)
+ screen:attach()
+ screen:set_default_attr_ids({
+ inc = {reverse = true}
+ })
+ end)
+
+ local function tenlines()
+ funcs.setline(1, {
+ ' 1', ' 2 these', ' 3 the', ' 4 their', ' 5 there',
+ ' 6 their', ' 7 the', ' 8 them', ' 9 these', ' 10 foobar'
+ })
+ command('1')
+ end
+
+ it('history can be navigated with <C-N>/<C-P>', function()
+ tenlines()
+ command('set noincsearch')
+ feed('/foobar<CR>')
+ feed('/the<CR>')
+ eq('the', eval('@/'))
+ feed('/thes<C-P><C-P><CR>')
+ eq('foobar', eval('@/'))
+ end)
+
+ describe('can traverse matches', function()
+ before_each(tenlines)
+ local function forwarditer(wrapscan)
+ command('set incsearch '..wrapscan)
+ feed('/the')
+ screen:expect([[
+ 1 |
+ 2 {inc:the}se |
+ /the^ |
+ ]])
+ feed('<C-G>')
+ screen:expect([[
+ 2 these |
+ 3 {inc:the} |
+ /the^ |
+ ]])
+ eq({0, 0, 0, 0}, funcs.getpos('"'))
+ feed('<C-G>')
+ screen:expect([[
+ 3 the |
+ 4 {inc:the}ir |
+ /the^ |
+ ]])
+ feed('<C-G>')
+ screen:expect([[
+ 4 their |
+ 5 {inc:the}re |
+ /the^ |
+ ]])
+ feed('<C-G>')
+ screen:expect([[
+ 5 there |
+ 6 {inc:the}ir |
+ /the^ |
+ ]])
+ feed('<C-G>')
+ screen:expect([[
+ 6 their |
+ 7 {inc:the} |
+ /the^ |
+ ]])
+ feed('<C-G>')
+ screen:expect([[
+ 7 the |
+ 8 {inc:the}m |
+ /the^ |
+ ]])
+ feed('<C-G>')
+ screen:expect([[
+ 8 them |
+ 9 {inc:the}se |
+ /the^ |
+ ]])
+ screen.bell = false
+ feed('<C-G>')
+ if wrapscan == 'wrapscan' then
+ screen:expect([[
+ 2 {inc:the}se |
+ 3 the |
+ /the^ |
+ ]])
+ else
+ screen:expect{grid=[[
+ 8 them |
+ 9 {inc:the}se |
+ /the^ |
+ ]], condition=function()
+ eq(true, screen.bell)
+ end}
+ feed('<CR>')
+ eq({0, 0, 0, 0}, funcs.getpos('"'))
+ end
+ end
+
+ local function backiter(wrapscan)
+ command('set incsearch '..wrapscan)
+ command('$')
+
+ feed('?the')
+ screen:expect([[
+ 9 {inc:the}se |
+ 10 foobar |
+ ?the^ |
+ ]])
+ screen.bell = false
+ if wrapscan == 'wrapscan' then
+ feed('<C-G>')
+ screen:expect([[
+ 2 {inc:the}se |
+ 3 the |
+ ?the^ |
+ ]])
+ feed('<CR>')
+ screen:expect([[
+ 2 ^these |
+ 3 the |
+ ?the |
+ ]])
+ else
+ feed('<C-G>')
+ screen:expect{grid=[[
+ 9 {inc:the}se |
+ 10 foobar |
+ ?the^ |
+ ]], condition=function()
+ eq(true, screen.bell)
+ end}
+ feed('<CR>')
+ screen:expect([[
+ 9 ^these |
+ 10 foobar |
+ ?the |
+ ]])
+ end
+ command('$')
+ feed('?the')
+ screen:expect([[
+ 9 {inc:the}se |
+ 10 foobar |
+ ?the^ |
+ ]])
+ feed('<C-T>')
+ screen:expect([[
+ 8 {inc:the}m |
+ 9 these |
+ ?the^ |
+ ]])
+ for i = 1, 6 do
+ feed('<C-T>')
+ -- Avoid sleep just before expect, otherwise expect will take the full
+ -- timeout
+ if i ~= 6 then
+ screen:sleep(1)
+ end
+ end
+ screen:expect([[
+ 2 {inc:the}se |
+ 3 the |
+ ?the^ |
+ ]])
+ screen.bell = false
+ feed('<C-T>')
+ if wrapscan == 'wrapscan' then
+ screen:expect([[
+ 9 {inc:the}se |
+ 10 foobar |
+ ?the^ |
+ ]])
+ else
+ screen:expect{grid=[[
+ 2 {inc:the}se |
+ 3 the |
+ ?the^ |
+ ]], condition=function()
+ eq(true, screen.bell)
+ end}
+ end
+ end
+
+ it("using <C-G> and 'nowrapscan'", function()
+ forwarditer('nowrapscan')
+ end)
+
+ it("using <C-G> and 'wrapscan'", function()
+ forwarditer('wrapscan')
+ end)
+
+ it("using <C-T> and 'nowrapscan'", function()
+ backiter('nowrapscan')
+ end)
+
+ it("using <C-T> and 'wrapscan'", function()
+ backiter('wrapscan')
+ end)
+ end)
+
+ it('expands pattern with <C-L>', function()
+ tenlines()
+ command('set incsearch wrapscan')
+
+ feed('/the')
+ screen:expect([[
+ 1 |
+ 2 {inc:the}se |
+ /the^ |
+ ]])
+ feed('<C-L>')
+ screen:expect([[
+ 1 |
+ 2 {inc:thes}e |
+ /thes^ |
+ ]])
+ feed('<C-G>')
+ screen:expect([[
+ 9 {inc:thes}e |
+ 10 foobar |
+ /thes^ |
+ ]])
+ feed('<C-G>')
+ screen:expect([[
+ 2 {inc:thes}e |
+ 3 the |
+ /thes^ |
+ ]])
+ feed('<CR>')
+ screen:expect([[
+ 2 ^these |
+ 3 the |
+ /thes |
+ ]])
+
+ command('1')
+ command('set nowrapscan')
+ feed('/the')
+ screen:expect([[
+ 1 |
+ 2 {inc:the}se |
+ /the^ |
+ ]])
+ feed('<C-L>')
+ screen:expect([[
+ 1 |
+ 2 {inc:thes}e |
+ /thes^ |
+ ]])
+ feed('<C-G>')
+ screen:expect([[
+ 9 {inc:thes}e |
+ 10 foobar |
+ /thes^ |
+ ]])
+ feed('<C-G><CR>')
+ screen:expect([[
+ 9 ^these |
+ 10 foobar |
+ /thes |
+ ]])
+ end)
+
+ it('reduces pattern with <BS> and keeps cursor position', function()
+ tenlines()
+ command('set incsearch wrapscan')
+
+ -- First match
+ feed('/thei')
+ screen:expect([[
+ 4 {inc:thei}r |
+ 5 there |
+ /thei^ |
+ ]])
+ -- Match from initial cursor position when modifying search
+ feed('<BS>')
+ screen:expect([[
+ 1 |
+ 2 {inc:the}se |
+ /the^ |
+ ]])
+ -- New text advances to next match
+ feed('s')
+ screen:expect([[
+ 1 |
+ 2 {inc:thes}e |
+ /thes^ |
+ ]])
+ -- Stay on this match when deleting a character
+ feed('<BS>')
+ screen:expect([[
+ 1 |
+ 2 {inc:the}se |
+ /the^ |
+ ]])
+ -- Advance to previous match
+ feed('<C-T>')
+ screen:expect([[
+ 9 {inc:the}se |
+ 10 foobar |
+ /the^ |
+ ]])
+ -- Extend search to include next character
+ feed('<C-L>')
+ screen:expect([[
+ 9 {inc:thes}e |
+ 10 foobar |
+ /thes^ |
+ ]])
+ -- Deleting all characters resets the cursor position
+ feed('<BS><BS><BS><BS>')
+ screen:expect([[
+ 1 |
+ 2 these |
+ /^ |
+ ]])
+ feed('the')
+ screen:expect([[
+ 1 |
+ 2 {inc:the}se |
+ /the^ |
+ ]])
+ feed('\\>')
+ screen:expect([[
+ 2 these |
+ 3 {inc:the} |
+ /the\>^ |
+ ]])
+ end)
+
+ it('can traverse matches in the same line with <C-G>/<C-T>', function()
+ funcs.setline(1, { ' 1', ' 2 these', ' 3 the theother' })
+ command('1')
+ command('set incsearch')
+
+ -- First match
+ feed('/the')
+ screen:expect([[
+ 1 |
+ 2 {inc:the}se |
+ /the^ |
+ ]])
+
+ -- Next match, different line
+ feed('<C-G>')
+ screen:expect([[
+ 2 these |
+ 3 {inc:the} theother |
+ /the^ |
+ ]])
+
+ -- Next match, same line
+ feed('<C-G>')
+ screen:expect([[
+ 2 these |
+ 3 the {inc:the}other |
+ /the^ |
+ ]])
+ feed('<C-G>')
+ screen:expect([[
+ 2 these |
+ 3 the theo{inc:the}r |
+ /the^ |
+ ]])
+
+ -- Previous match, same line
+ feed('<C-T>')
+ screen:expect([[
+ 2 these |
+ 3 the {inc:the}other |
+ /the^ |
+ ]])
+ feed('<C-T>')
+ screen:expect([[
+ 2 these |
+ 3 {inc:the} theother |
+ /the^ |
+ ]])
+
+ -- Previous match, different line
+ feed('<C-T>')
+ screen:expect([[
+ 2 {inc:the}se |
+ 3 the theother |
+ /the^ |
+ ]])
+ end)
+
+ it('keeps the view after deleting a char from the search', function()
+ screen:detach()
+ screen = Screen.new(20, 6)
+ screen:attach()
+ screen:set_default_attr_ids({
+ inc = {reverse = true}
+ })
+ screen:set_default_attr_ignore({
+ {bold=true, reverse=true}, {bold=true, foreground=Screen.colors.Blue1}
+ })
+ tenlines()
+
+ feed('/foo')
+ screen:expect([[
+ 6 their |
+ 7 the |
+ 8 them |
+ 9 these |
+ 10 {inc:foo}bar |
+ /foo^ |
+ ]])
+ feed('<BS>')
+ screen:expect([[
+ 6 their |
+ 7 the |
+ 8 them |
+ 9 these |
+ 10 {inc:fo}obar |
+ /fo^ |
+ ]])
+ feed('<CR>')
+ screen:expect([[
+ 6 their |
+ 7 the |
+ 8 them |
+ 9 these |
+ 10 ^foobar |
+ /fo |
+ ]])
+ eq({lnum = 10, leftcol = 0, col = 4, topfill = 0, topline = 6,
+ coladd = 0, skipcol = 0, curswant = 4},
+ funcs.winsaveview())
+ end)
+
+ it('restores original view after failed search', function()
+ screen:detach()
+ screen = Screen.new(40, 3)
+ screen:attach()
+ screen:set_default_attr_ids({
+ inc = {reverse = true},
+ err = { foreground = Screen.colors.Grey100, background = Screen.colors.Red },
+ more = { bold = true, foreground = Screen.colors.SeaGreen4 },
+ })
+ tenlines()
+ feed('0')
+ feed('/foo')
+ screen:expect([[
+ 9 these |
+ 10 {inc:foo}bar |
+ /foo^ |
+ ]])
+ feed('<C-W>')
+ screen:expect([[
+ 1 |
+ 2 these |
+ /^ |
+ ]])
+ feed('<CR>')
+ screen:expect([[
+ / |
+ {err:E35: No previous regular expression} |
+ {more:Press ENTER or type command to continue}^ |
+ ]])
+ feed('<CR>')
+ eq({lnum = 1, leftcol = 0, col = 0, topfill = 0, topline = 1,
+ coladd = 0, skipcol = 0, curswant = 0},
+ funcs.winsaveview())
+ end)
+
+ it("CTRL-G with 'incsearch' and ? goes in the right direction", function()
+ -- oldtest: Test_search_cmdline4().
+ screen:detach()
+ screen = Screen.new(40, 4)
+ screen:attach()
+ screen:set_default_attr_ids({
+ inc = {reverse = true},
+ err = { foreground = Screen.colors.Grey100, background = Screen.colors.Red },
+ more = { bold = true, foreground = Screen.colors.SeaGreen4 },
+ tilde = { bold = true, foreground = Screen.colors.Blue1 },
+ })
+ command('enew!')
+ funcs.setline(1, {' 1 the first', ' 2 the second', ' 3 the third'})
+ command('set laststatus=0 shortmess+=s')
+ command('set incsearch')
+ command('$')
+ -- Send the input in chunks, so the cmdline logic regards it as
+ -- "interactive". This mimics Vim's test_override("char_avail").
+ -- (See legacy test: test_search.vim)
+ feed('?the')
+ wait()
+ feed('<c-g>')
+ wait()
+ feed('<cr>')
+ screen:expect([[
+ 1 the first |
+ 2 the second |
+ 3 ^the third |
+ ?the |
+ ]])
+
+ command('$')
+ feed('?the')
+ wait()
+ feed('<c-g>')
+ wait()
+ feed('<c-g>')
+ wait()
+ feed('<cr>')
+ screen:expect([[
+ 1 ^the first |
+ 2 the second |
+ 3 the third |
+ ?the |
+ ]])
+
+ command('$')
+ feed('?the')
+ wait()
+ feed('<c-g>')
+ wait()
+ feed('<c-g>')
+ wait()
+ feed('<c-g>')
+ wait()
+ feed('<cr>')
+ screen:expect([[
+ 1 the first |
+ 2 ^the second |
+ 3 the third |
+ ?the |
+ ]])
+
+ command('$')
+ feed('?the')
+ wait()
+ feed('<c-t>')
+ wait()
+ feed('<cr>')
+ screen:expect([[
+ 1 ^the first |
+ 2 the second |
+ 3 the third |
+ ?the |
+ ]])
+
+ command('$')
+ feed('?the')
+ wait()
+ feed('<c-t>')
+ wait()
+ feed('<c-t>')
+ wait()
+ feed('<cr>')
+ screen:expect([[
+ 1 the first |
+ 2 the second |
+ 3 ^the third |
+ ?the |
+ ]])
+
+ command('$')
+ feed('?the')
+ wait()
+ feed('<c-t>')
+ wait()
+ feed('<c-t>')
+ wait()
+ feed('<c-t>')
+ wait()
+ feed('<cr>')
+ screen:expect([[
+ 1 the first |
+ 2 ^the second |
+ 3 the third |
+ ?the |
+ ]])
+ end)
+end)
diff --git a/test/functional/legacy/searchpos_spec.lua b/test/functional/legacy/searchpos_spec.lua
index 7d4b7a3734..60f1edcd3f 100644
--- a/test/functional/legacy/searchpos_spec.lua
+++ b/test/functional/legacy/searchpos_spec.lua
@@ -1,7 +1,7 @@
local helpers = require('test.functional.helpers')(after_each)
local call = helpers.call
local clear = helpers.clear
-local execute = helpers.execute
+local command = helpers.command
local eq = helpers.eq
local eval = helpers.eval
local insert = helpers.insert
@@ -19,7 +19,7 @@ describe('searchpos', function()
call('cursor', 1, 2)
eq({2, 1, 1}, eval([[searchpos('\%(\([a-z]\)\|\_.\)\{-}xyz', 'pcW')]]))
- execute('set cpo-=c')
+ command('set cpo-=c')
call('cursor', 1, 2)
eq({1, 2, 2}, eval([[searchpos('\%(\([a-z]\)\|\_.\)\{-}xyz', 'pcW')]]))
call('cursor', 1, 3)
diff --git a/test/functional/legacy/set_spec.lua b/test/functional/legacy/set_spec.lua
index 11f371569d..deb268b1e8 100644
--- a/test/functional/legacy/set_spec.lua
+++ b/test/functional/legacy/set_spec.lua
@@ -1,30 +1,30 @@
-- Tests for :set
local helpers = require('test.functional.helpers')(after_each)
-local clear, execute, eval, eq =
- helpers.clear, helpers.execute, helpers.eval, helpers.eq
+local clear, command, eval, eq =
+ helpers.clear, helpers.command, helpers.eval, helpers.eq
describe(':set', function()
before_each(clear)
it('handles backslash properly', function()
- execute('set iskeyword=a,b,c')
- execute('set iskeyword+=d')
+ command('set iskeyword=a,b,c')
+ command('set iskeyword+=d')
eq('a,b,c,d', eval('&iskeyword'))
- execute([[set iskeyword+=\\,e]])
+ command([[set iskeyword+=\\,e]])
eq([[a,b,c,d,\,e]], eval('&iskeyword'))
- execute('set iskeyword-=e')
+ command('set iskeyword-=e')
eq([[a,b,c,d,\]], eval('&iskeyword'))
- execute([[set iskeyword-=\]])
+ command([[set iskeyword-=\]])
eq('a,b,c,d', eval('&iskeyword'))
end)
it('recognizes a trailing comma with +=', function()
- execute('set wildignore=*.png,')
- execute('set wildignore+=*.jpg')
+ command('set wildignore=*.png,')
+ command('set wildignore+=*.jpg')
eq('*.png,*.jpg', eval('&wildignore'))
end)
end)
diff --git a/test/functional/legacy/signs_spec.lua b/test/functional/legacy/signs_spec.lua
index e80a32455a..0e65edbcf8 100644
--- a/test/functional/legacy/signs_spec.lua
+++ b/test/functional/legacy/signs_spec.lua
@@ -1,23 +1,23 @@
-- Tests for signs
local helpers = require('test.functional.helpers')(after_each)
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, command, expect = helpers.clear, helpers.command, helpers.expect
describe('signs', function()
setup(clear)
it('is working', function()
- execute('sign define JumpSign text=x')
- execute([[exe 'sign place 42 line=2 name=JumpSign buffer=' . bufnr('')]])
+ command('sign define JumpSign text=x')
+ command([[exe 'sign place 42 line=2 name=JumpSign buffer=' . bufnr('')]])
-- Split the window to the bottom to verify :sign-jump will stay in the current
-- window if the buffer is displayed there.
- execute('bot split')
- execute([[exe 'sign jump 42 buffer=' . bufnr('')]])
- execute([[call append(line('$'), winnr())]])
+ command('bot split')
+ command([[exe 'sign jump 42 buffer=' . bufnr('')]])
+ command([[call append(line('$'), winnr())]])
-- Assert buffer contents.
expect([[
-
+
2]])
end)
end)
diff --git a/test/functional/legacy/tagcase_spec.lua b/test/functional/legacy/tagcase_spec.lua
index ed2876a375..9ca0e0009f 100644
--- a/test/functional/legacy/tagcase_spec.lua
+++ b/test/functional/legacy/tagcase_spec.lua
@@ -53,11 +53,11 @@ describe("'tagcase' option", function()
-- Verify that the correct number of matching tags is found for all values of
-- 'ignorecase' and global and local values 'tagcase', in all combinations.
insert([[
-
+
Foo
Bar
foo
-
+
end text]])
source([[
@@ -70,7 +70,7 @@ describe("'tagcase' option", function()
endfor
endfor
endfor
-
+
1,/^end text$/d]])
expect([[
diff --git a/test/functional/legacy/textobjects_spec.lua b/test/functional/legacy/textobjects_spec.lua
index 15a93e3819..96f655cc41 100644
--- a/test/functional/legacy/textobjects_spec.lua
+++ b/test/functional/legacy/textobjects_spec.lua
@@ -1,14 +1,14 @@
local helpers = require('test.functional.helpers')(after_each)
local call = helpers.call
local clear = helpers.clear
-local execute = helpers.execute
+local command = helpers.command
local expect = helpers.expect
local source = helpers.source
describe('Text object', function()
before_each(function()
clear()
- execute('set shada=')
+ command('set shada=')
source([[
function SelectionOut(data)
new
@@ -27,7 +27,7 @@ describe('Text object', function()
end)
it('Test for vi) without cpo-M', function()
- execute('set cpo-=M')
+ command('set cpo-=M')
call('SelectionOut', '(red \\(blue) green)')
expect([[
@@ -38,7 +38,7 @@ describe('Text object', function()
end)
it('Test for vi) with cpo-M #1', function()
- execute('set cpo+=M')
+ command('set cpo+=M')
call('SelectionOut', '(red \\(blue) green)')
expect([[
@@ -49,7 +49,7 @@ describe('Text object', function()
end)
it('Test for vi) with cpo-M #2', function()
- execute('set cpo+=M')
+ command('set cpo+=M')
call('SelectionOut', '(red (blue\\) green)')
expect([[
diff --git a/test/functional/legacy/undolevels_spec.lua b/test/functional/legacy/undolevels_spec.lua
index 9902b101f6..1dfc4c17ba 100644
--- a/test/functional/legacy/undolevels_spec.lua
+++ b/test/functional/legacy/undolevels_spec.lua
@@ -10,7 +10,7 @@ describe('undolevel', function()
func FillBuffer()
for i in range(1,13)
put=i
- " Set 'undolevels' to split undo.
+ " Set 'undolevels' to split undo.
exe "setg ul=" . &g:ul
endfor
endfunc
@@ -48,6 +48,10 @@ describe('undolevel', function()
call assert_equal(50, &g:undolevels)
call assert_equal(-123456, &l:undolevels)
+ " Drop created windows
+ set ul&
+ new
+ only!
endfunc
call Test_global_local_undolevels()
diff --git a/test/functional/legacy/utf8_spec.lua b/test/functional/legacy/utf8_spec.lua
index 4d4f55b9eb..5b93f25b24 100644
--- a/test/functional/legacy/utf8_spec.lua
+++ b/test/functional/legacy/utf8_spec.lua
@@ -2,9 +2,10 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, expect = helpers.execute, helpers.expect
+local command, expect = helpers.command, helpers.expect
local eq, eval = helpers.eq, helpers.eval
local source = helpers.source
+local wait = helpers.wait
describe('utf8', function()
before_each(clear)
@@ -12,16 +13,17 @@ describe('utf8', function()
it('is working', function()
insert('start:')
- execute('new')
- execute('call setline(1, ["aaa", "ใ‚ใ‚ใ‚", "bbb"])')
+ command('new')
+ command('call setline(1, ["aaa", "ใ‚ใ‚ใ‚", "bbb"])')
-- Visual block Insert adjusts for multi-byte char
feed('gg0l<C-V>jjIx<Esc>')
+ wait()
- execute('let r = getline(1, "$")')
- execute('bwipeout!')
- execute('$put=r')
- execute('call garbagecollect(1)')
+ command('let r = getline(1, "$")')
+ command('bwipeout!')
+ command('$put=r')
+ command('call garbagecollect(1)')
expect([[
start:
@@ -52,6 +54,7 @@ describe('utf8', function()
eq(1, eval('strchars("\\u20dd", 1)'))
end)
+ -- luacheck: ignore 613 (Trailing whitespace in a string)
it('customlist completion', function()
source([[
function! CustomComplete1(lead, line, pos)
@@ -75,7 +78,7 @@ describe('utf8', function()
feed(":Test3 <C-L>'<C-B>$put='<CR>")
expect([[
-
+
Test1
Test2 ใ‚ใŸ
Test3 N]])
diff --git a/test/functional/legacy/wordcount_spec.lua b/test/functional/legacy/wordcount_spec.lua
index 300a777772..0c8bd2cdcc 100644
--- a/test/functional/legacy/wordcount_spec.lua
+++ b/test/functional/legacy/wordcount_spec.lua
@@ -2,21 +2,21 @@
local helpers = require('test.functional.helpers')(after_each)
local feed, insert, source = helpers.feed, helpers.insert, helpers.source
-local clear, execute = helpers.clear, helpers.execute
+local clear, command = helpers.clear, helpers.command
local eq, eval = helpers.eq, helpers.eval
+local wait = helpers.wait
describe('wordcount', function()
before_each(clear)
it('is working', function()
- execute('set selection=inclusive')
- execute('fileformat=unix')
- execute('fileformats=unix')
+ command('set selection=inclusive fileformat=unix fileformats=unix')
insert([=[
RESULT test:]=])
+ wait()
- execute('new')
+ command('new')
source([=[
function DoRecordWin(...)
wincmd k
@@ -57,7 +57,7 @@ describe('wordcount', function()
)
-- Test 2: some words, cursor at start
- execute([[call PutInWindow('one two three')]])
+ command([[call PutInWindow('one two three')]])
eq(eval('DoRecordWin([1, 1, 0])'),
eval([=[
[['', 'one two three'], {'chars': 15, 'cursor_chars': 1, 'words': 3, 'cursor_words': 0, 'bytes': 15, 'cursor_bytes': 1}]
@@ -65,7 +65,7 @@ describe('wordcount', function()
)
-- Test 3: some words, cursor at end
- execute([[call PutInWindow('one two three')]])
+ command([[call PutInWindow('one two three')]])
eq(eval('DoRecordWin([2, 99, 0])'),
eval([=[
[['', 'one two three'], {'chars': 15, 'cursor_chars': 14, 'words': 3, 'cursor_words': 3, 'bytes': 15, 'cursor_bytes': 14}]
@@ -73,17 +73,17 @@ describe('wordcount', function()
)
-- Test 4: some words, cursor at end, ve=all
- execute('set ve=all')
- execute([[call PutInWindow('one two three')]])
+ command('set ve=all')
+ command([[call PutInWindow('one two three')]])
eq(eval('DoRecordWin([2,99,0])'),
eval([=[
[['', 'one two three'], {'chars': 15, 'cursor_chars': 15, 'words': 3, 'cursor_words': 3, 'bytes': 15, 'cursor_bytes': 15}]
]=])
)
- execute('set ve=')
+ command('set ve=')
-- Test 5: several lines with words
- execute([=[call PutInWindow(['one two three', 'one two three', 'one two three'])]=])
+ command([=[call PutInWindow(['one two three', 'one two three', 'one two three'])]=])
eq(eval('DoRecordWin([4,99,0])'),
eval([=[
[['', 'one two three', 'one two three', 'one two three'], {'chars': 43, 'cursor_chars': 42, 'words': 9, 'cursor_words': 9, 'bytes': 43, 'cursor_bytes': 42}]
@@ -91,21 +91,21 @@ describe('wordcount', function()
)
-- Test 6: one line with BOM set
- execute([[call PutInWindow('one two three')]])
- execute('wincmd k')
- execute('set bomb')
- execute('wincmd j')
+ command([[call PutInWindow('one two three')]])
+ command('wincmd k')
+ command('set bomb')
+ command('wincmd j')
eq(eval('DoRecordWin([2,99,0])'),
eval([=[
[['', 'one two three'], {'chars': 15, 'cursor_chars': 14, 'words': 3, 'cursor_words': 3, 'bytes': 18, 'cursor_bytes': 14}]
]=])
)
- execute('wincmd k')
- execute('set nobomb')
- execute('wincmd j')
+ command('wincmd k')
+ command('set nobomb')
+ command('wincmd j')
-- Test 7: one line with multibyte words
- execute([=[call PutInWindow(['ร„ne Mยคne Mรผh'])]=])
+ command([=[call PutInWindow(['ร„ne Mยคne Mรผh'])]=])
eq(eval('DoRecordWin([2,99,0])'),
eval([=[
[['', 'ร„ne Mยคne Mรผh'], {'chars': 14, 'cursor_chars': 13, 'words': 3, 'cursor_words': 3, 'bytes': 17, 'cursor_bytes': 16}]
@@ -113,7 +113,7 @@ describe('wordcount', function()
)
-- Test 8: several lines with multibyte words
- execute([=[call PutInWindow(['ร„ne Mยคne Mรผh', 'und raus bist dรผ!'])]=])
+ command([=[call PutInWindow(['ร„ne Mยคne Mรผh', 'und raus bist dรผ!'])]=])
eq(eval('DoRecordWin([3,99,0])'),
eval([=[
[['', 'ร„ne Mยคne Mรผh', 'und raus bist dรผ!'], {'chars': 32, 'cursor_chars': 31, 'words': 7, 'cursor_words': 7, 'bytes': 36, 'cursor_bytes': 35}]
@@ -121,15 +121,16 @@ describe('wordcount', function()
)
-- Test 9: visual mode, complete buffer
- execute([=[call PutInWindow(['ร„ne Mยคne Mรผh', 'und raus bist dรผ!'])]=])
- execute('wincmd k')
- execute('set ls=2 stl=%{STL()}')
+ command([=[call PutInWindow(['ร„ne Mยคne Mรผh', 'und raus bist dรผ!'])]=])
+ command('wincmd k')
+ command('set ls=2 stl=%{STL()}')
-- -- Start visual mode quickly and select complete buffer.
- execute('0')
+ command('0')
feed('V2jy<cr>')
- execute('set stl= ls=1')
- execute('let log=DoRecordWin([3,99,0])')
- execute('let log[1]=g:visual_stat')
+ wait()
+ command('set stl= ls=1')
+ command('let log=DoRecordWin([3,99,0])')
+ command('let log[1]=g:visual_stat')
eq(eval('log'),
eval([=[
[['', 'ร„ne Mยคne Mรผh', 'und raus bist dรผ!'], {'chars': 32, 'words': 7, 'bytes': 36, 'visual_chars': 32, 'visual_words': 7, 'visual_bytes': 36}]
@@ -137,15 +138,16 @@ describe('wordcount', function()
)
-- Test 10: visual mode (empty)
- execute([=[call PutInWindow(['ร„ne Mยคne Mรผh', 'und raus bist dรผ!'])]=])
- execute('wincmd k')
- execute('set ls=2 stl=%{STL()}')
+ command([=[call PutInWindow(['ร„ne Mยคne Mรผh', 'und raus bist dรผ!'])]=])
+ command('wincmd k')
+ command('set ls=2 stl=%{STL()}')
-- Start visual mode quickly and select complete buffer.
- execute('0')
+ command('0')
feed('v$y<cr>')
- execute('set stl= ls=1')
- execute('let log=DoRecordWin([3,99,0])')
- execute('let log[1]=g:visual_stat')
+ wait()
+ command('set stl= ls=1')
+ command('let log=DoRecordWin([3,99,0])')
+ command('let log[1]=g:visual_stat')
eq(eval('log'),
eval([=[
[['', 'ร„ne Mยคne Mรผh', 'und raus bist dรผ!'], {'chars': 32, 'words': 7, 'bytes': 36, 'visual_chars': 1, 'visual_words': 0, 'visual_bytes': 1}]
@@ -153,15 +155,16 @@ describe('wordcount', function()
)
-- Test 11: visual mode, single line
- execute([=[call PutInWindow(['ร„ne Mยคne Mรผh', 'und raus bist dรผ!'])]=])
- execute('wincmd k')
- execute('set ls=2 stl=%{STL()}')
+ command([=[call PutInWindow(['ร„ne Mยคne Mรผh', 'und raus bist dรผ!'])]=])
+ command('wincmd k')
+ command('set ls=2 stl=%{STL()}')
-- Start visual mode quickly and select complete buffer.
- execute('2')
+ command('2')
feed('0v$y<cr>')
- execute('set stl= ls=1')
- execute('let log=DoRecordWin([3,99,0])')
- execute('let log[1]=g:visual_stat')
+ wait()
+ command('set stl= ls=1')
+ command('let log=DoRecordWin([3,99,0])')
+ command('let log[1]=g:visual_stat')
eq(eval('log'),
eval([=[
[['', 'ร„ne Mยคne Mรผh', 'und raus bist dรผ!'], {'chars': 32, 'words': 7, 'bytes': 36, 'visual_chars': 13, 'visual_words': 3, 'visual_bytes': 16}]
diff --git a/test/functional/legacy/writefile_spec.lua b/test/functional/legacy/writefile_spec.lua
index f096aa23b9..4d54e07d6a 100644
--- a/test/functional/legacy/writefile_spec.lua
+++ b/test/functional/legacy/writefile_spec.lua
@@ -1,22 +1,23 @@
-- Tests for writefile()
local helpers = require('test.functional.helpers')(after_each)
-local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+local clear, command, expect = helpers.clear, helpers.command, helpers.expect
describe('writefile', function()
setup(clear)
it('is working', function()
- execute('%delete _')
- execute('let f = tempname()')
- execute('call writefile(["over","written"], f, "b")')
- execute('call writefile(["hello","world"], f, "b")')
- execute('call writefile(["!", "good"], f, "a")')
- execute('call writefile(["morning"], f, "ab")')
- execute('call writefile(["", "vimmers"], f, "ab")')
- execute('bwipeout!')
- execute('$put =readfile(f)')
- execute('1 delete _')
+ command('%delete _')
+ command('let f = tempname()')
+ command('call writefile(["over","written"], f, "b")')
+ command('call writefile(["hello","world"], f, "b")')
+ command('call writefile(["!", "good"], f, "a")')
+ command('call writefile(["morning"], f, "ab")')
+ command('call writefile(["", "vimmers"], f, "ab")')
+ command('bwipeout!')
+ command('$put =readfile(f)')
+ command('1 delete _')
+ command('call delete(f)')
-- Assert buffer contents.
expect([[
diff --git a/test/functional/lua/api_spec.lua b/test/functional/lua/api_spec.lua
new file mode 100644
index 0000000000..b1dc5c07fd
--- /dev/null
+++ b/test/functional/lua/api_spec.lua
@@ -0,0 +1,204 @@
+-- Test suite for testing interactions with API bindings
+local helpers = require('test.functional.helpers')(after_each)
+
+local exc_exec = helpers.exc_exec
+local funcs = helpers.funcs
+local clear = helpers.clear
+local eval = helpers.eval
+local NIL = helpers.NIL
+local eq = helpers.eq
+
+before_each(clear)
+
+describe('luaeval(vim.api.โ€ฆ)', function()
+ describe('with channel_id and buffer handle', function()
+ describe('nvim_buf_get_lines', function()
+ it('works', function()
+ funcs.setline(1, {"abc", "def", "a\nb", "ttt"})
+ eq({{_TYPE={}, _VAL={'a\nb'}}},
+ funcs.luaeval('vim.api.nvim_buf_get_lines(1, 2, 3, false)'))
+ end)
+ end)
+ describe('nvim_buf_set_lines', function()
+ it('works', function()
+ funcs.setline(1, {"abc", "def", "a\nb", "ttt"})
+ eq(NIL, funcs.luaeval('vim.api.nvim_buf_set_lines(1, 1, 2, false, {"b\\0a"})'))
+ eq({'abc', {_TYPE={}, _VAL={'b\na'}}, {_TYPE={}, _VAL={'a\nb'}}, 'ttt'},
+ funcs.luaeval('vim.api.nvim_buf_get_lines(1, 0, 4, false)'))
+ end)
+ end)
+ end)
+ describe('with errors', function()
+ it('transforms API error from nvim_buf_set_lines into lua error', function()
+ funcs.setline(1, {"abc", "def", "a\nb", "ttt"})
+ eq({false, 'String cannot contain newlines'},
+ funcs.luaeval('{pcall(vim.api.nvim_buf_set_lines, 1, 1, 2, false, {"b\\na"})}'))
+ end)
+
+ it('transforms API error from nvim_win_set_cursor into lua error', function()
+ eq({false, 'Argument "pos" must be a [row, col] array'},
+ funcs.luaeval('{pcall(vim.api.nvim_win_set_cursor, 0, {1, 2, 3})}'))
+ -- Used to produce a memory leak due to a bug in nvim_win_set_cursor
+ eq({false, 'Invalid window id'},
+ funcs.luaeval('{pcall(vim.api.nvim_win_set_cursor, -1, {1, 2, 3})}'))
+ end)
+
+ it('transforms API error from nvim_win_set_cursor + same array as in first test into lua error',
+ function()
+ eq({false, 'Argument "pos" must be a [row, col] array'},
+ funcs.luaeval('{pcall(vim.api.nvim_win_set_cursor, 0, {"b\\na"})}'))
+ end)
+ end)
+
+ it('correctly evaluates API code which calls luaeval', function()
+ local str = (([===[vim.api.nvim_eval([==[
+ luaeval('vim.api.nvim_eval([=[
+ luaeval("vim.api.nvim_eval([[
+ luaeval(1)
+ ]])")
+ ]=])')
+ ]==])]===]):gsub('\n', ' '))
+ eq(1, funcs.luaeval(str))
+ end)
+
+ it('correctly converts from API objects', function()
+ eq(1, funcs.luaeval('vim.api.nvim_eval("1")'))
+ eq('1', funcs.luaeval([[vim.api.nvim_eval('"1"')]]))
+ eq({}, funcs.luaeval('vim.api.nvim_eval("[]")'))
+ eq({}, funcs.luaeval('vim.api.nvim_eval("{}")'))
+ eq(1, funcs.luaeval('vim.api.nvim_eval("1.0")'))
+ eq(true, funcs.luaeval('vim.api.nvim_eval("v:true")'))
+ eq(false, funcs.luaeval('vim.api.nvim_eval("v:false")'))
+ eq(NIL, funcs.luaeval('vim.api.nvim_eval("v:null")'))
+
+ eq(0, eval([[type(luaeval('vim.api.nvim_eval("1")'))]]))
+ eq(1, eval([[type(luaeval('vim.api.nvim_eval("''1''")'))]]))
+ eq(3, eval([[type(luaeval('vim.api.nvim_eval("[]")'))]]))
+ eq(4, eval([[type(luaeval('vim.api.nvim_eval("{}")'))]]))
+ eq(5, eval([[type(luaeval('vim.api.nvim_eval("1.0")'))]]))
+ eq(6, eval([[type(luaeval('vim.api.nvim_eval("v:true")'))]]))
+ eq(6, eval([[type(luaeval('vim.api.nvim_eval("v:false")'))]]))
+ eq(7, eval([[type(luaeval('vim.api.nvim_eval("v:null")'))]]))
+
+ eq({foo=42}, funcs.luaeval([[vim.api.nvim_eval('{"foo": 42}')]]))
+ eq({42}, funcs.luaeval([[vim.api.nvim_eval('[42]')]]))
+
+ eq({foo={bar=42}, baz=50}, funcs.luaeval([[vim.api.nvim_eval('{"foo": {"bar": 42}, "baz": 50}')]]))
+ eq({{42}, {}}, funcs.luaeval([=[vim.api.nvim_eval('[[42], []]')]=]))
+ end)
+
+ it('correctly converts to API objects', function()
+ eq(1, funcs.luaeval('vim.api.nvim__id(1)'))
+ eq('1', funcs.luaeval('vim.api.nvim__id("1")'))
+ eq({1}, funcs.luaeval('vim.api.nvim__id({1})'))
+ eq({foo=1}, funcs.luaeval('vim.api.nvim__id({foo=1})'))
+ eq(1.5, funcs.luaeval('vim.api.nvim__id(1.5)'))
+ eq(true, funcs.luaeval('vim.api.nvim__id(true)'))
+ eq(false, funcs.luaeval('vim.api.nvim__id(false)'))
+ eq(NIL, funcs.luaeval('vim.api.nvim__id(nil)'))
+
+ eq(0, eval([[type(luaeval('vim.api.nvim__id(1)'))]]))
+ eq(1, eval([[type(luaeval('vim.api.nvim__id("1")'))]]))
+ eq(3, eval([[type(luaeval('vim.api.nvim__id({1})'))]]))
+ eq(4, eval([[type(luaeval('vim.api.nvim__id({foo=1})'))]]))
+ eq(5, eval([[type(luaeval('vim.api.nvim__id(1.5)'))]]))
+ eq(6, eval([[type(luaeval('vim.api.nvim__id(true)'))]]))
+ eq(6, eval([[type(luaeval('vim.api.nvim__id(false)'))]]))
+ eq(7, eval([[type(luaeval('vim.api.nvim__id(nil)'))]]))
+
+ eq({foo=1, bar={42, {{baz=true}, 5}}}, funcs.luaeval('vim.api.nvim__id({foo=1, bar={42, {{baz=true}, 5}}})'))
+ end)
+
+ it('correctly converts container objects with type_idx to API objects', function()
+ eq(5, eval('type(luaeval("vim.api.nvim__id({[vim.type_idx]=vim.types.float, [vim.val_idx]=0})"))'))
+ eq(4, eval([[type(luaeval('vim.api.nvim__id({[vim.type_idx]=vim.types.dictionary})'))]]))
+ eq(3, eval([[type(luaeval('vim.api.nvim__id({[vim.type_idx]=vim.types.array})'))]]))
+
+ eq({}, funcs.luaeval('vim.api.nvim__id({[vim.type_idx]=vim.types.array})'))
+
+ -- Presence of type_idx makes Vim ignore some keys
+ eq({42}, funcs.luaeval('vim.api.nvim__id({[vim.type_idx]=vim.types.array, [vim.val_idx]=10, [5]=1, foo=2, [1]=42})'))
+ eq({foo=2}, funcs.luaeval('vim.api.nvim__id({[vim.type_idx]=vim.types.dictionary, [vim.val_idx]=10, [5]=1, foo=2, [1]=42})'))
+ eq(10, funcs.luaeval('vim.api.nvim__id({[vim.type_idx]=vim.types.float, [vim.val_idx]=10, [5]=1, foo=2, [1]=42})'))
+ eq({}, funcs.luaeval('vim.api.nvim__id({[vim.type_idx]=vim.types.array, [vim.val_idx]=10, [5]=1, foo=2})'))
+ end)
+
+ it('correctly converts arrays with type_idx to API objects', function()
+ eq(3, eval([[type(luaeval('vim.api.nvim__id_array({[vim.type_idx]=vim.types.array})'))]]))
+
+ eq({}, funcs.luaeval('vim.api.nvim__id_array({[vim.type_idx]=vim.types.array})'))
+
+ eq({42}, funcs.luaeval('vim.api.nvim__id_array({[vim.type_idx]=vim.types.array, [vim.val_idx]=10, [5]=1, foo=2, [1]=42})'))
+ eq({{foo=2}}, funcs.luaeval('vim.api.nvim__id_array({{[vim.type_idx]=vim.types.dictionary, [vim.val_idx]=10, [5]=1, foo=2, [1]=42}})'))
+ eq({10}, funcs.luaeval('vim.api.nvim__id_array({{[vim.type_idx]=vim.types.float, [vim.val_idx]=10, [5]=1, foo=2, [1]=42}})'))
+ eq({}, funcs.luaeval('vim.api.nvim__id_array({[vim.type_idx]=vim.types.array, [vim.val_idx]=10, [5]=1, foo=2})'))
+
+ eq({}, funcs.luaeval('vim.api.nvim__id_array({})'))
+ eq(3, eval([[type(luaeval('vim.api.nvim__id_array({})'))]]))
+ end)
+
+ it('correctly converts dictionaries with type_idx to API objects', function()
+ eq(4, eval([[type(luaeval('vim.api.nvim__id_dictionary({[vim.type_idx]=vim.types.dictionary})'))]]))
+
+ eq({}, funcs.luaeval('vim.api.nvim__id_dictionary({[vim.type_idx]=vim.types.dictionary})'))
+
+ eq({v={42}}, funcs.luaeval('vim.api.nvim__id_dictionary({v={[vim.type_idx]=vim.types.array, [vim.val_idx]=10, [5]=1, foo=2, [1]=42}})'))
+ eq({foo=2}, funcs.luaeval('vim.api.nvim__id_dictionary({[vim.type_idx]=vim.types.dictionary, [vim.val_idx]=10, [5]=1, foo=2, [1]=42})'))
+ eq({v=10}, funcs.luaeval('vim.api.nvim__id_dictionary({v={[vim.type_idx]=vim.types.float, [vim.val_idx]=10, [5]=1, foo=2, [1]=42}})'))
+ eq({v={}}, funcs.luaeval('vim.api.nvim__id_dictionary({v={[vim.type_idx]=vim.types.array, [vim.val_idx]=10, [5]=1, foo=2}})'))
+
+ -- If API requests dictionary, then empty table will be the one. This is not
+ -- the case normally because empty table is an empty arrray.
+ eq({}, funcs.luaeval('vim.api.nvim__id_dictionary({})'))
+ eq(4, eval([[type(luaeval('vim.api.nvim__id_dictionary({})'))]]))
+ end)
+
+ it('errors out correctly when working with API', function()
+ -- Conversion errors
+ eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): [string "<VimL compiled string>"]:1: Cannot convert given lua type',
+ exc_exec([[call luaeval("vim.api.nvim__id(vim.api.nvim__id)")]]))
+ eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): [string "<VimL compiled string>"]:1: Cannot convert given lua table',
+ exc_exec([[call luaeval("vim.api.nvim__id({1, foo=42})")]]))
+ eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): [string "<VimL compiled string>"]:1: Cannot convert given lua type',
+ exc_exec([[call luaeval("vim.api.nvim__id({42, vim.api.nvim__id})")]]))
+ -- Errors in number of arguments
+ eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): [string "<VimL compiled string>"]:1: Expected 1 argument',
+ exc_exec([[call luaeval("vim.api.nvim__id()")]]))
+ eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): [string "<VimL compiled string>"]:1: Expected 1 argument',
+ exc_exec([[call luaeval("vim.api.nvim__id(1, 2)")]]))
+ eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): [string "<VimL compiled string>"]:1: Expected 2 arguments',
+ exc_exec([[call luaeval("vim.api.nvim_set_var(1, 2, 3)")]]))
+ -- Error in argument types
+ eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): [string "<VimL compiled string>"]:1: Expected lua string',
+ exc_exec([[call luaeval("vim.api.nvim_set_var(1, 2)")]]))
+
+ eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): [string "<VimL compiled string>"]:1: Expected lua number',
+ exc_exec([[call luaeval("vim.api.nvim_buf_get_lines(0, 'test', 1, false)")]]))
+ eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): [string "<VimL compiled string>"]:1: Number is not integral',
+ exc_exec([[call luaeval("vim.api.nvim_buf_get_lines(0, 1.5, 1, false)")]]))
+
+ eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): [string "<VimL compiled string>"]:1: Expected lua table',
+ exc_exec([[call luaeval("vim.api.nvim__id_float('test')")]]))
+ eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): [string "<VimL compiled string>"]:1: Unexpected type',
+ exc_exec([[call luaeval("vim.api.nvim__id_float({[vim.type_idx]=vim.types.dictionary})")]]))
+
+ eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): [string "<VimL compiled string>"]:1: Expected lua table',
+ exc_exec([[call luaeval("vim.api.nvim__id_array(1)")]]))
+ eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): [string "<VimL compiled string>"]:1: Unexpected type',
+ exc_exec([[call luaeval("vim.api.nvim__id_array({[vim.type_idx]=vim.types.dictionary})")]]))
+
+ eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): [string "<VimL compiled string>"]:1: Expected lua table',
+ exc_exec([[call luaeval("vim.api.nvim__id_dictionary(1)")]]))
+ eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): [string "<VimL compiled string>"]:1: Unexpected type',
+ exc_exec([[call luaeval("vim.api.nvim__id_dictionary({[vim.type_idx]=vim.types.array})")]]))
+ -- TODO: check for errors with Tabpage argument
+ -- TODO: check for errors with Window argument
+ -- TODO: check for errors with Buffer argument
+ end)
+
+ it('accepts any value as API Boolean', function()
+ eq('', funcs.luaeval('vim.api.nvim_replace_termcodes("", vim, false, nil)'))
+ eq('', funcs.luaeval('vim.api.nvim_replace_termcodes("", 0, 1.5, "test")'))
+ eq('', funcs.luaeval('vim.api.nvim_replace_termcodes("", true, {}, {[vim.type_idx]=vim.types.array})'))
+ end)
+end)
diff --git a/test/functional/lua/commands_spec.lua b/test/functional/lua/commands_spec.lua
new file mode 100644
index 0000000000..017ee55729
--- /dev/null
+++ b/test/functional/lua/commands_spec.lua
@@ -0,0 +1,164 @@
+-- Test suite for checking :lua* commands
+local helpers = require('test.functional.helpers')(after_each)
+
+local eq = helpers.eq
+local NIL = helpers.NIL
+local clear = helpers.clear
+local meths = helpers.meths
+local funcs = helpers.funcs
+local source = helpers.source
+local dedent = helpers.dedent
+local exc_exec = helpers.exc_exec
+local write_file = helpers.write_file
+local redir_exec = helpers.redir_exec
+local curbufmeths = helpers.curbufmeths
+
+before_each(clear)
+
+describe(':lua command', function()
+ it('works', function()
+ eq('', redir_exec(
+ 'lua vim.api.nvim_buf_set_lines(1, 1, 2, false, {"TEST"})'))
+ eq({'', 'TEST'}, curbufmeths.get_lines(0, 100, false))
+ source(dedent([[
+ lua << EOF
+ vim.api.nvim_buf_set_lines(1, 1, 2, false, {"TSET"})
+ EOF]]))
+ eq({'', 'TSET'}, curbufmeths.get_lines(0, 100, false))
+ source(dedent([[
+ lua << EOF
+ vim.api.nvim_buf_set_lines(1, 1, 2, false, {"SETT"})]]))
+ eq({'', 'SETT'}, curbufmeths.get_lines(0, 100, false))
+ source(dedent([[
+ lua << EOF
+ vim.api.nvim_buf_set_lines(1, 1, 2, false, {"ETTS"})
+ vim.api.nvim_buf_set_lines(1, 2, 3, false, {"TTSE"})
+ vim.api.nvim_buf_set_lines(1, 3, 4, false, {"STTE"})
+ EOF]]))
+ eq({'', 'ETTS', 'TTSE', 'STTE'}, curbufmeths.get_lines(0, 100, false))
+ end)
+ it('throws catchable errors', function()
+ eq([[Vim(lua):E5104: Error while creating lua chunk: [string "<VimL compiled string>"]:1: unexpected symbol near ')']],
+ exc_exec('lua ()'))
+ eq([[Vim(lua):E5105: Error while calling lua chunk: [string "<VimL compiled string>"]:1: TEST]],
+ exc_exec('lua error("TEST")'))
+ eq([[Vim(lua):E5105: Error while calling lua chunk: [string "<VimL compiled string>"]:1: Invalid buffer id]],
+ exc_exec('lua vim.api.nvim_buf_set_lines(-10, 1, 1, false, {"TEST"})'))
+ eq({''}, curbufmeths.get_lines(0, 100, false))
+ end)
+ it('works with NULL errors', function()
+ eq([=[Vim(lua):E5105: Error while calling lua chunk: [NULL]]=],
+ exc_exec('lua error(nil)'))
+ end)
+ it('accepts embedded NLs without heredoc', function()
+ -- Such code is usually used for `:execute 'lua' {generated_string}`:
+ -- heredocs do not work in this case.
+ meths.command([[
+ lua
+ vim.api.nvim_buf_set_lines(1, 1, 2, false, {"ETTS"})
+ vim.api.nvim_buf_set_lines(1, 2, 3, false, {"TTSE"})
+ vim.api.nvim_buf_set_lines(1, 3, 4, false, {"STTE"})
+ ]])
+ eq({'', 'ETTS', 'TTSE', 'STTE'}, curbufmeths.get_lines(0, 100, false))
+ end)
+ it('preserves global and not preserves local variables', function()
+ eq('', redir_exec('lua gvar = 42'))
+ eq('', redir_exec('lua local lvar = 100500'))
+ eq(NIL, funcs.luaeval('lvar'))
+ eq(42, funcs.luaeval('gvar'))
+ end)
+ it('works with long strings', function()
+ local s = ('x'):rep(100500)
+
+ eq('\nE5104: Error while creating lua chunk: [string "<VimL compiled string>"]:1: unfinished string near \'<eof>\'', redir_exec(('lua vim.api.nvim_buf_set_lines(1, 1, 2, false, {"%s})'):format(s)))
+ eq({''}, curbufmeths.get_lines(0, -1, false))
+
+ eq('', redir_exec(('lua vim.api.nvim_buf_set_lines(1, 1, 2, false, {"%s"})'):format(s)))
+ eq({'', s}, curbufmeths.get_lines(0, -1, false))
+ end)
+end)
+
+describe(':luado command', function()
+ it('works', function()
+ curbufmeths.set_lines(0, 1, false, {"ABC", "def", "gHi"})
+ eq('', redir_exec('luado lines = (lines or {}) lines[#lines + 1] = {linenr, line}'))
+ eq({'ABC', 'def', 'gHi'}, curbufmeths.get_lines(0, -1, false))
+ eq({{1, 'ABC'}, {2, 'def'}, {3, 'gHi'}}, funcs.luaeval('lines'))
+
+ -- Automatic transformation of numbers
+ eq('', redir_exec('luado return linenr'))
+ eq({'1', '2', '3'}, curbufmeths.get_lines(0, -1, false))
+
+ eq('', redir_exec('luado return ("<%02x>"):format(line:byte())'))
+ eq({'<31>', '<32>', '<33>'}, curbufmeths.get_lines(0, -1, false))
+ end)
+ it('stops processing lines when suddenly out of lines', function()
+ curbufmeths.set_lines(0, 1, false, {"ABC", "def", "gHi"})
+ eq('', redir_exec('2,$luado runs = ((runs or 0) + 1) vim.api.nvim_command("%d")'))
+ eq({''}, curbufmeths.get_lines(0, -1, false))
+ eq(1, funcs.luaeval('runs'))
+ end)
+ it('works correctly when changing lines out of range', function()
+ curbufmeths.set_lines(0, 1, false, {"ABC", "def", "gHi"})
+ eq('\nE322: line number out of range: 1 past the end\nE320: Cannot find line 2',
+ redir_exec('2,$luado vim.api.nvim_command("%d") return linenr'))
+ eq({''}, curbufmeths.get_lines(0, -1, false))
+ end)
+ it('fails on errors', function()
+ eq([[Vim(luado):E5109: Error while creating lua chunk: [string "<VimL compiled string>"]:1: unexpected symbol near ')']],
+ exc_exec('luado ()'))
+ eq([[Vim(luado):E5111: Error while calling lua function: [string "<VimL compiled string>"]:1: attempt to perform arithmetic on global 'liness' (a nil value)]],
+ exc_exec('luado return liness + 1'))
+ end)
+ it('works with NULL errors', function()
+ eq([=[Vim(luado):E5111: Error while calling lua function: [NULL]]=],
+ exc_exec('luado error(nil)'))
+ end)
+ it('fails in sandbox when needed', function()
+ curbufmeths.set_lines(0, 1, false, {"ABC", "def", "gHi"})
+ eq('\nE48: Not allowed in sandbox: sandbox luado runs = (runs or 0) + 1',
+ redir_exec('sandbox luado runs = (runs or 0) + 1'))
+ eq(NIL, funcs.luaeval('runs'))
+ end)
+ it('works with long strings', function()
+ local s = ('x'):rep(100500)
+
+ eq('\nE5109: Error while creating lua chunk: [string "<VimL compiled string>"]:1: unfinished string near \'<eof>\'', redir_exec(('luado return "%s'):format(s)))
+ eq({''}, curbufmeths.get_lines(0, -1, false))
+
+ eq('', redir_exec(('luado return "%s"'):format(s)))
+ eq({s}, curbufmeths.get_lines(0, -1, false))
+ end)
+end)
+
+describe(':luafile', function()
+ local fname = 'Xtest-functional-lua-commands-luafile'
+
+ after_each(function()
+ os.remove(fname)
+ end)
+
+ it('works', function()
+ write_file(fname, [[
+ vim.api.nvim_buf_set_lines(1, 1, 2, false, {"ETTS"})
+ vim.api.nvim_buf_set_lines(1, 2, 3, false, {"TTSE"})
+ vim.api.nvim_buf_set_lines(1, 3, 4, false, {"STTE"})
+ ]])
+ eq('', redir_exec('luafile ' .. fname))
+ eq({'', 'ETTS', 'TTSE', 'STTE'}, curbufmeths.get_lines(0, 100, false))
+ end)
+
+ it('correctly errors out', function()
+ write_file(fname, '()')
+ eq(("Vim(luafile):E5112: Error while creating lua chunk: %s:1: unexpected symbol near ')'"):format(fname),
+ exc_exec('luafile ' .. fname))
+ write_file(fname, 'vimm.api.nvim_buf_set_lines(1, 1, 2, false, {"ETTS"})')
+ eq(("Vim(luafile):E5113: Error while calling lua chunk: %s:1: attempt to index global 'vimm' (a nil value)"):format(fname),
+ exc_exec('luafile ' .. fname))
+ end)
+ it('works with NULL errors', function()
+ write_file(fname, 'error(nil)')
+ eq([=[Vim(luafile):E5113: Error while calling lua chunk: [NULL]]=],
+ exc_exec('luafile ' .. fname))
+ end)
+end)
diff --git a/test/functional/lua/luaeval_spec.lua b/test/functional/lua/luaeval_spec.lua
new file mode 100644
index 0000000000..760105df6b
--- /dev/null
+++ b/test/functional/lua/luaeval_spec.lua
@@ -0,0 +1,255 @@
+-- Test suite for testing luaeval() function
+local helpers = require('test.functional.helpers')(after_each)
+
+local redir_exec = helpers.redir_exec
+local exc_exec = helpers.exc_exec
+local command = helpers.command
+local meths = helpers.meths
+local funcs = helpers.funcs
+local clear = helpers.clear
+local eval = helpers.eval
+local NIL = helpers.NIL
+local eq = helpers.eq
+
+before_each(clear)
+
+local function startswith(expected, actual)
+ eq(expected, actual:sub(1, #expected))
+end
+
+describe('luaeval()', function()
+ local nested_by_level = {}
+ local nested = {}
+ local nested_s = '{}'
+ for i=1,100 do
+ if i % 2 == 0 then
+ nested = {nested}
+ nested_s = '{' .. nested_s .. '}'
+ else
+ nested = {nested=nested}
+ nested_s = '{nested=' .. nested_s .. '}'
+ end
+ nested_by_level[i] = {o=nested, s=nested_s}
+ end
+
+ describe('second argument', function()
+ it('is successfully received', function()
+ local t = {t=true, f=false, --[[n=NIL,]] d={l={'string', 42, 0.42}}}
+ eq(t, funcs.luaeval("_A", t))
+ -- Not tested: nil, funcrefs, returned object identity: behaviour will
+ -- most likely change.
+ end)
+ end)
+ describe('lua values', function()
+ it('are successfully transformed', function()
+ eq({n=1, f=1.5, s='string', l={4, 2}},
+ funcs.luaeval('{n=1, f=1.5, s="string", l={4, 2}}'))
+ -- Not tested: nil inside containers: behaviour will most likely change.
+ eq(NIL, funcs.luaeval('nil'))
+ eq({['']=1}, funcs.luaeval('{[""]=1}'))
+ end)
+ end)
+ describe('recursive lua values', function()
+ it('are successfully transformed', function()
+ command('lua rawset(_G, "d", {})')
+ command('lua rawset(d, "d", d)')
+ eq('\n{\'d\': {...@0}}', funcs.execute('echo luaeval("d")'))
+
+ command('lua rawset(_G, "l", {})')
+ command('lua table.insert(l, l)')
+ eq('\n[[...@0]]', funcs.execute('echo luaeval("l")'))
+ end)
+ end)
+ describe('strings', function()
+ it('are successfully converted to special dictionaries', function()
+ command([[let s = luaeval('"\0"')]])
+ eq({_TYPE={}, _VAL={'\n'}}, meths.get_var('s'))
+ eq(1, funcs.eval('s._TYPE is v:msgpack_types.binary'))
+ end)
+ it('are successfully converted to special dictionaries in table keys',
+ function()
+ command([[let d = luaeval('{["\0"]=1}')]])
+ eq({_TYPE={}, _VAL={{{_TYPE={}, _VAL={'\n'}}, 1}}}, meths.get_var('d'))
+ eq(1, funcs.eval('d._TYPE is v:msgpack_types.map'))
+ eq(1, funcs.eval('d._VAL[0][0]._TYPE is v:msgpack_types.string'))
+ end)
+ it('are successfully converted to special dictionaries from a list',
+ function()
+ command([[let l = luaeval('{"abc", "a\0b", "c\0d", "def"}')]])
+ eq({'abc', {_TYPE={}, _VAL={'a\nb'}}, {_TYPE={}, _VAL={'c\nd'}}, 'def'},
+ meths.get_var('l'))
+ eq(1, funcs.eval('l[1]._TYPE is v:msgpack_types.binary'))
+ eq(1, funcs.eval('l[2]._TYPE is v:msgpack_types.binary'))
+ end)
+ end)
+
+ -- Not checked: funcrefs converted to NIL. To be altered to something more
+ -- meaningful later.
+
+ it('correctly evaluates scalars', function()
+ eq(1, funcs.luaeval('1'))
+ eq(0, eval('type(luaeval("1"))'))
+
+ eq(1.5, funcs.luaeval('1.5'))
+ eq(5, eval('type(luaeval("1.5"))'))
+
+ eq("test", funcs.luaeval('"test"'))
+ eq(1, eval('type(luaeval("\'test\'"))'))
+
+ eq('', funcs.luaeval('""'))
+ eq({_TYPE={}, _VAL={'\n'}}, funcs.luaeval([['\0']]))
+ eq({_TYPE={}, _VAL={'\n', '\n'}}, funcs.luaeval([['\0\n\0']]))
+ eq(1, eval([[luaeval('"\0\n\0"')._TYPE is v:msgpack_types.binary]]))
+
+ eq(true, funcs.luaeval('true'))
+ eq(false, funcs.luaeval('false'))
+ eq(NIL, funcs.luaeval('nil'))
+ end)
+
+ it('correctly evaluates containers', function()
+ eq({}, funcs.luaeval('{}'))
+ eq(3, eval('type(luaeval("{}"))'))
+
+ eq({test=1, foo=2}, funcs.luaeval('{test=1, foo=2}'))
+ eq(4, eval('type(luaeval("{test=1, foo=2}"))'))
+
+ eq({4, 2}, funcs.luaeval('{4, 2}'))
+ eq(3, eval('type(luaeval("{4, 2}"))'))
+
+ local level = 30
+ eq(nested_by_level[level].o, funcs.luaeval(nested_by_level[level].s))
+
+ eq({_TYPE={}, _VAL={{{_TYPE={}, _VAL={'\n', '\n'}}, {_TYPE={}, _VAL={'\n', '\n\n'}}}}},
+ funcs.luaeval([[{['\0\n\0']='\0\n\0\0'}]]))
+ eq(1, eval([[luaeval('{["\0\n\0"]="\0\n\0\0"}')._TYPE is v:msgpack_types.map]]))
+ eq(1, eval([[luaeval('{["\0\n\0"]="\0\n\0\0"}')._VAL[0][0]._TYPE is v:msgpack_types.string]]))
+ eq(1, eval([[luaeval('{["\0\n\0"]="\0\n\0\0"}')._VAL[0][1]._TYPE is v:msgpack_types.binary]]))
+ eq({nested={{_TYPE={}, _VAL={{{_TYPE={}, _VAL={'\n', '\n'}}, {_TYPE={}, _VAL={'\n', '\n\n'}}}}}}},
+ funcs.luaeval([[{nested={{['\0\n\0']='\0\n\0\0'}}}]]))
+ end)
+
+ it('correctly passes scalars as argument', function()
+ eq(1, funcs.luaeval('_A', 1))
+ eq(1.5, funcs.luaeval('_A', 1.5))
+ eq('', funcs.luaeval('_A', ''))
+ eq('test', funcs.luaeval('_A', 'test'))
+ eq(NIL, funcs.luaeval('_A', NIL))
+ eq(true, funcs.luaeval('_A', true))
+ eq(false, funcs.luaeval('_A', false))
+ end)
+
+ it('correctly passes containers as argument', function()
+ eq({}, funcs.luaeval('_A', {}))
+ eq({test=1}, funcs.luaeval('_A', {test=1}))
+ eq({4, 2}, funcs.luaeval('_A', {4, 2}))
+ local level = 28
+ eq(nested_by_level[level].o, funcs.luaeval('_A', nested_by_level[level].o))
+ end)
+
+ local function sp(typ, val)
+ return ('{"_TYPE": v:msgpack_types.%s, "_VAL": %s}'):format(typ, val)
+ end
+ local function mapsp(...)
+ local val = ''
+ for i=1,(select('#', ...)/2) do
+ val = ('%s[%s,%s],'):format(val, select(i * 2 - 1, ...),
+ select(i * 2, ...))
+ end
+ return sp('map', '[' .. val .. ']')
+ end
+ local function luaevalarg(argexpr, expr)
+ return eval(([=[
+ [
+ extend(g:, {'_ret': luaeval(%s, %s)})._ret,
+ type(g:_ret)==type({})&&has_key(g:_ret, '_TYPE')
+ ? [
+ get(keys(filter(copy(v:msgpack_types), 'v:val is g:_ret._TYPE')), 0,
+ g:_ret._TYPE),
+ get(g:_ret, '_VAL', g:_ret)
+ ]
+ : [0, g:_ret]][1]
+ ]=]):format(expr or '"_A"', argexpr):gsub('\n', ''))
+ end
+
+ it('correctly passes special dictionaries', function()
+ eq({'binary', {'\n', '\n'}}, luaevalarg(sp('binary', '["\\n", "\\n"]')))
+ eq({'binary', {'\n', '\n'}}, luaevalarg(sp('string', '["\\n", "\\n"]')))
+ eq({0, true}, luaevalarg(sp('boolean', 1)))
+ eq({0, false}, luaevalarg(sp('boolean', 0)))
+ eq({0, NIL}, luaevalarg(sp('nil', 0)))
+ eq({0, {[""]=""}}, luaevalarg(mapsp(sp('binary', '[""]'), '""')))
+ eq({0, {[""]=""}}, luaevalarg(mapsp(sp('string', '[""]'), '""')))
+ end)
+
+ it('issues an error in some cases', function()
+ eq("Vim(call):E5100: Cannot convert given lua table: table should either have a sequence of positive integer keys or contain only string keys",
+ exc_exec('call luaeval("{1, foo=2}")'))
+ eq("Vim(call):E5101: Cannot convert given lua type",
+ exc_exec('call luaeval("vim.api.nvim_buf_get_lines")'))
+ startswith("Vim(call):E5107: Error while creating lua chunk for luaeval(): ",
+ exc_exec('call luaeval("1, 2, 3")'))
+ startswith("Vim(call):E5108: Error while calling lua chunk for luaeval(): ",
+ exc_exec('call luaeval("(nil)()")'))
+ eq("Vim(call):E5101: Cannot convert given lua type",
+ exc_exec('call luaeval("{42, vim.api}")'))
+ eq("Vim(call):E5101: Cannot convert given lua type",
+ exc_exec('call luaeval("{foo=42, baz=vim.api}")'))
+
+ -- The following should not crash: conversion error happens inside
+ eq("Vim(call):E5101: Cannot convert given lua type",
+ exc_exec('call luaeval("vim.api")'))
+ -- The following should not show internal error
+ eq("\nE5101: Cannot convert given lua type\n0",
+ redir_exec('echo luaeval("vim.api")'))
+ end)
+
+ it('correctly converts containers with type_idx', function()
+ eq(5, eval('type(luaeval("{[vim.type_idx]=vim.types.float, [vim.val_idx]=0}"))'))
+ eq(4, eval([[type(luaeval('{[vim.type_idx]=vim.types.dictionary}'))]]))
+ eq(3, eval([[type(luaeval('{[vim.type_idx]=vim.types.array}'))]]))
+
+ eq({}, funcs.luaeval('{[vim.type_idx]=vim.types.array}'))
+
+ -- Presence of type_idx makes Vim ignore some keys
+ eq({42}, funcs.luaeval('{[vim.type_idx]=vim.types.array, [vim.val_idx]=10, [5]=1, foo=2, [1]=42}'))
+ eq({foo=2}, funcs.luaeval('{[vim.type_idx]=vim.types.dictionary, [vim.val_idx]=10, [5]=1, foo=2, [1]=42}'))
+ eq(10, funcs.luaeval('{[vim.type_idx]=vim.types.float, [vim.val_idx]=10, [5]=1, foo=2, [1]=42}'))
+
+ -- The following should not crash
+ eq({}, funcs.luaeval('{[vim.type_idx]=vim.types.dictionary}'))
+ end)
+
+ it('correctly converts self-containing containers', function()
+ meths.set_var('l', {})
+ eval('add(l, l)')
+ eq(true, eval('luaeval("_A == _A[1]", l)'))
+ eq(true, eval('luaeval("_A[1] == _A[1][1]", [l])'))
+ eq(true, eval('luaeval("_A.d == _A.d[1]", {"d": l})'))
+ eq(true, eval('luaeval("_A ~= _A[1]", [l])'))
+
+ meths.set_var('d', {foo=42})
+ eval('extend(d, {"d": d})')
+ eq(true, eval('luaeval("_A == _A.d", d)'))
+ eq(true, eval('luaeval("_A[1] == _A[1].d", [d])'))
+ eq(true, eval('luaeval("_A.d == _A.d.d", {"d": d})'))
+ eq(true, eval('luaeval("_A ~= _A.d", {"d": d})'))
+ end)
+
+ it('errors out correctly when doing incorrect things in lua', function()
+ -- Conversion errors
+ eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): [string "<VimL compiled string>"]:1: attempt to call field \'xxx_nonexistent_key_xxx\' (a nil value)',
+ exc_exec([[call luaeval("vim.xxx_nonexistent_key_xxx()")]]))
+ eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): [string "<VimL compiled string>"]:1: ERROR',
+ exc_exec([[call luaeval("error('ERROR')")]]))
+ eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): [NULL]',
+ exc_exec([[call luaeval("error(nil)")]]))
+ end)
+
+ it('does not leak memory when called with too long line',
+ function()
+ local s = ('x'):rep(65536)
+ eq('Vim(call):E5107: Error while creating lua chunk for luaeval(): [string "<VimL compiled string>"]:1: unexpected symbol near \')\'',
+ exc_exec([[call luaeval("(']] .. s ..[[' + )")]]))
+ eq(s, funcs.luaeval('"' .. s .. '"'))
+ end)
+end)
diff --git a/test/functional/lua/overrides_spec.lua b/test/functional/lua/overrides_spec.lua
new file mode 100644
index 0000000000..007d40874f
--- /dev/null
+++ b/test/functional/lua/overrides_spec.lua
@@ -0,0 +1,302 @@
+-- Test for Vim overrides of lua built-ins
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+
+local eq = helpers.eq
+local neq = helpers.neq
+local NIL = helpers.NIL
+local feed = helpers.feed
+local clear = helpers.clear
+local funcs = helpers.funcs
+local meths = helpers.meths
+local iswin = helpers.iswin
+local command = helpers.command
+local write_file = helpers.write_file
+local redir_exec = helpers.redir_exec
+local alter_slashes = helpers.alter_slashes
+
+local screen
+
+local fname = 'Xtest-functional-lua-overrides-luafile'
+
+before_each(clear)
+
+after_each(function()
+ os.remove(fname)
+end)
+
+describe('print', function()
+ it('returns nothing', function()
+ eq(NIL, funcs.luaeval('print("abc")'))
+ eq(0, funcs.luaeval('select("#", print("abc"))'))
+ end)
+ it('allows catching printed text with :execute', function()
+ eq('\nabc', funcs.execute('lua print("abc")'))
+ eq('\nabc', funcs.execute('luado print("abc")'))
+ eq('\nabc', funcs.execute('call luaeval("print(\'abc\')")'))
+ write_file(fname, 'print("abc")')
+ eq('\nabc', funcs.execute('luafile ' .. fname))
+
+ eq('\nabc', redir_exec('lua print("abc")'))
+ eq('\nabc', redir_exec('luado print("abc")'))
+ eq('\nabc', redir_exec('call luaeval("print(\'abc\')")'))
+ write_file(fname, 'print("abc")')
+ eq('\nabc', redir_exec('luafile ' .. fname))
+ end)
+ it('handles errors in __tostring', function()
+ write_file(fname, [[
+ local meta_nilerr = { __tostring = function() error(nil) end }
+ local meta_abcerr = { __tostring = function() error("abc") end }
+ local meta_tblout = { __tostring = function() return {"TEST"} end }
+ v_nilerr = setmetatable({}, meta_nilerr)
+ v_abcerr = setmetatable({}, meta_abcerr)
+ v_tblout = setmetatable({}, meta_tblout)
+ ]])
+ eq('', redir_exec('luafile ' .. fname))
+ eq('\nE5114: Error while converting print argument #2: [NULL]',
+ redir_exec('lua print("foo", v_nilerr, "bar")'))
+ eq('\nE5114: Error while converting print argument #2: Xtest-functional-lua-overrides-luafile:2: abc',
+ redir_exec('lua print("foo", v_abcerr, "bar")'))
+ eq('\nE5114: Error while converting print argument #2: <Unknown error: lua_tolstring returned NULL for tostring result>',
+ redir_exec('lua print("foo", v_tblout, "bar")'))
+ end)
+ it('prints strings with NULs and NLs correctly', function()
+ meths.set_option('more', true)
+ eq('\nabc ^@ def\nghi^@^@^@jkl\nTEST\n\n\nT\n',
+ redir_exec([[lua print("abc \0 def\nghi\0\0\0jkl\nTEST\n\n\nT\n")]]))
+ eq('\nabc ^@ def\nghi^@^@^@jkl\nTEST\n\n\nT^@',
+ redir_exec([[lua print("abc \0 def\nghi\0\0\0jkl\nTEST\n\n\nT\0")]]))
+ eq('\nT^@', redir_exec([[lua print("T\0")]]))
+ eq('\nT\n', redir_exec([[lua print("T\n")]]))
+ end)
+ it('prints empty strings correctly', function()
+ -- Regression: first test used to crash
+ eq('', redir_exec('lua print("")'))
+ eq('\n def', redir_exec('lua print("", "def")'))
+ eq('\nabc ', redir_exec('lua print("abc", "")'))
+ eq('\nabc def', redir_exec('lua print("abc", "", "def")'))
+ end)
+end)
+
+describe('debug.debug', function()
+ before_each(function()
+ screen = Screen.new()
+ screen:attach()
+ screen:set_default_attr_ids({
+ [0] = {bold=true, foreground=255},
+ E = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
+ cr = {bold = true, foreground = Screen.colors.SeaGreen4},
+ })
+ command("set display-=msgsep")
+ end)
+ it('works', function()
+ command([[lua
+ function Test(a)
+ print(a)
+ debug.debug()
+ print(a * 100)
+ end
+ ]])
+ feed(':lua Test()\n')
+ screen:expect([[
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ nil |
+ lua_debug> ^ |
+ ]])
+ feed('print("TEST")\n')
+ screen:expect([[
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ nil |
+ lua_debug> print("TEST") |
+ TEST |
+ lua_debug> ^ |
+ ]])
+ feed('<C-c>')
+ screen:expect([[
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ nil |
+ lua_debug> print("TEST") |
+ TEST |
+ |
+ {E:E5105: Error while calling lua chunk: [string "<VimL }|
+ {E:compiled string>"]:5: attempt to perform arithmetic o}|
+ {E:n local 'a' (a nil value)} |
+ Interrupt: {cr:Press ENTER or type command to continue}^ |
+ ]])
+ feed('<C-l>:lua Test()\n')
+ screen:expect([[
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ nil |
+ lua_debug> ^ |
+ ]])
+ feed('\n')
+ screen:expect([[
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ nil |
+ lua_debug> |
+ {E:E5105: Error while calling lua chunk: [string "<VimL }|
+ {E:compiled string>"]:5: attempt to perform arithmetic o}|
+ {E:n local 'a' (a nil value)} |
+ {cr:Press ENTER or type command to continue}^ |
+ ]])
+ end)
+end)
+
+describe('package.path/package.cpath', function()
+ local sl = alter_slashes
+
+ local function get_new_paths(sufs, runtimepaths)
+ runtimepaths = runtimepaths or meths.list_runtime_paths()
+ local new_paths = {}
+ local sep = package.config:sub(1, 1)
+ for _, v in ipairs(runtimepaths) do
+ for _, suf in ipairs(sufs) do
+ new_paths[#new_paths + 1] = v .. sep .. 'lua' .. suf
+ end
+ end
+ return new_paths
+ end
+ local function execute_lua(cmd, ...)
+ return meths.execute_lua(cmd, {...})
+ end
+ local function eval_lua(expr, ...)
+ return meths.execute_lua('return ' .. expr, {...})
+ end
+ local function set_path(which, value)
+ return execute_lua('package[select(1, ...)] = select(2, ...)', which, value)
+ end
+
+ it('contains directories from &runtimepath on first invocation', function()
+ local new_paths = get_new_paths(sl{'/?.lua', '/?/init.lua'})
+ local new_paths_str = table.concat(new_paths, ';')
+ eq(new_paths_str, eval_lua('package.path'):sub(1, #new_paths_str))
+
+ local new_cpaths = get_new_paths(iswin() and {'\\?.dll'} or {'/?.so'})
+ local new_cpaths_str = table.concat(new_cpaths, ';')
+ eq(new_cpaths_str, eval_lua('package.cpath'):sub(1, #new_cpaths_str))
+ end)
+ it('puts directories from &runtimepath always at the start', function()
+ meths.set_option('runtimepath', 'a,b')
+ local new_paths = get_new_paths(sl{'/?.lua', '/?/init.lua'}, {'a', 'b'})
+ local new_paths_str = table.concat(new_paths, ';')
+ eq(new_paths_str, eval_lua('package.path'):sub(1, #new_paths_str))
+
+ set_path('path', sl'foo/?.lua;foo/?/init.lua;' .. new_paths_str)
+
+ neq(new_paths_str, eval_lua('package.path'):sub(1, #new_paths_str))
+
+ command('set runtimepath+=c')
+ new_paths = get_new_paths(sl{'/?.lua', '/?/init.lua'}, {'a', 'b', 'c'})
+ new_paths_str = table.concat(new_paths, ';')
+ eq(new_paths_str, eval_lua('package.path'):sub(1, #new_paths_str))
+ end)
+ it('understands uncommon suffixes', function()
+ set_path('cpath', './?/foo/bar/baz/x.nlua')
+ meths.set_option('runtimepath', 'a')
+ local new_paths = get_new_paths({'/?/foo/bar/baz/x.nlua'}, {'a'})
+ local new_paths_str = table.concat(new_paths, ';')
+ eq(new_paths_str, eval_lua('package.cpath'):sub(1, #new_paths_str))
+
+ set_path('cpath', './yyy?zzz/x')
+ meths.set_option('runtimepath', 'b')
+ new_paths = get_new_paths({'/yyy?zzz/x'}, {'b'})
+ new_paths_str = table.concat(new_paths, ';')
+ eq(new_paths_str, eval_lua('package.cpath'):sub(1, #new_paths_str))
+
+ set_path('cpath', './yyy?zzz/123?ghi/x')
+ meths.set_option('runtimepath', 'b')
+ new_paths = get_new_paths({'/yyy?zzz/123?ghi/x'}, {'b'})
+ new_paths_str = table.concat(new_paths, ';')
+ eq(new_paths_str, eval_lua('package.cpath'):sub(1, #new_paths_str))
+ end)
+ it('preserves empty items', function()
+ local many_empty_path = ';;;;;;'
+ local many_empty_cpath = ';;;;;;./?.luaso'
+ set_path('path', many_empty_path)
+ set_path('cpath', many_empty_cpath)
+ meths.set_option('runtimepath', 'a')
+ local new_paths = get_new_paths(sl{'/?.lua', '/?/init.lua'}, {'a'})
+ local new_paths_str = table.concat(new_paths, ';')
+ eq(new_paths_str .. ';' .. many_empty_path, eval_lua('package.path'))
+ local new_cpaths = get_new_paths({'/?.luaso'}, {'a'})
+ local new_cpaths_str = table.concat(new_cpaths, ';')
+ eq(new_cpaths_str .. ';' .. many_empty_cpath, eval_lua('package.cpath'))
+ end)
+ it('preserves empty value', function()
+ set_path('path', '')
+ meths.set_option('runtimepath', 'a')
+ local new_paths = get_new_paths(sl{'/?.lua', '/?/init.lua'}, {'a'})
+ local new_paths_str = table.concat(new_paths, ';')
+ eq(new_paths_str .. ';', eval_lua('package.path'))
+ end)
+ it('purges out all additions if runtimepath is set to empty', function()
+ local new_paths = get_new_paths(sl{'/?.lua', '/?/init.lua'})
+ local new_paths_str = table.concat(new_paths, ';')
+ local path = eval_lua('package.path')
+ eq(new_paths_str, path:sub(1, #new_paths_str))
+
+ local new_cpaths = get_new_paths(iswin() and {'\\?.dll'} or {'/?.so'})
+ local new_cpaths_str = table.concat(new_cpaths, ';')
+ local cpath = eval_lua('package.cpath')
+ eq(new_cpaths_str, cpath:sub(1, #new_cpaths_str))
+
+ meths.set_option('runtimepath', '')
+ eq(path:sub(#new_paths_str + 2, -1), eval_lua('package.path'))
+ eq(cpath:sub(#new_cpaths_str + 2, -1), eval_lua('package.cpath'))
+ end)
+ it('works with paths with escaped commas', function()
+ meths.set_option('runtimepath', '\\,')
+ local new_paths = get_new_paths(sl{'/?.lua', '/?/init.lua'}, {','})
+ local new_paths_str = table.concat(new_paths, ';')
+ eq(new_paths_str, eval_lua('package.path'):sub(1, #new_paths_str))
+ end)
+ it('ignores paths with semicolons', function()
+ meths.set_option('runtimepath', 'foo;bar,\\,')
+ local new_paths = get_new_paths(sl{'/?.lua', '/?/init.lua'}, {','})
+ local new_paths_str = table.concat(new_paths, ';')
+ eq(new_paths_str, eval_lua('package.path'):sub(1, #new_paths_str))
+ end)
+end)
diff --git a/test/functional/lua/utility_functions_spec.lua b/test/functional/lua/utility_functions_spec.lua
new file mode 100644
index 0000000000..67f5ce24f7
--- /dev/null
+++ b/test/functional/lua/utility_functions_spec.lua
@@ -0,0 +1,207 @@
+-- Test suite for testing interactions with API bindings
+local helpers = require('test.functional.helpers')(after_each)
+
+local funcs = helpers.funcs
+local meths = helpers.meths
+local clear = helpers.clear
+local eq = helpers.eq
+
+before_each(clear)
+
+describe('vim.stricmp', function()
+ -- ฤฐ: `tolower("ฤฐ")` is `i` which has length 1 while `ฤฐ` itself has
+ -- length 2 (in bytes).
+ -- ศบ: `tolower("ศบ")` is `โฑฅ` which has length 2 while `ศบ` itself has
+ -- length 3 (in bytes).
+ --
+ -- Note: 'i' !=? 'ฤฐ' and 'โฑฅ' !=? 'ศบ' on some systems.
+ -- Note: Built-in Nvim comparison (on systems lacking `strcasecmp`) works
+ -- only on ASCII characters.
+ it('works', function()
+ eq(0, funcs.luaeval('vim.stricmp("a", "A")'))
+ eq(0, funcs.luaeval('vim.stricmp("A", "a")'))
+ eq(0, funcs.luaeval('vim.stricmp("a", "a")'))
+ eq(0, funcs.luaeval('vim.stricmp("A", "A")'))
+
+ eq(0, funcs.luaeval('vim.stricmp("", "")'))
+ eq(0, funcs.luaeval('vim.stricmp("\\0", "\\0")'))
+ eq(0, funcs.luaeval('vim.stricmp("\\0\\0", "\\0\\0")'))
+ eq(0, funcs.luaeval('vim.stricmp("\\0\\0\\0", "\\0\\0\\0")'))
+ eq(0, funcs.luaeval('vim.stricmp("\\0\\0\\0A", "\\0\\0\\0a")'))
+ eq(0, funcs.luaeval('vim.stricmp("\\0\\0\\0a", "\\0\\0\\0A")'))
+ eq(0, funcs.luaeval('vim.stricmp("\\0\\0\\0a", "\\0\\0\\0a")'))
+
+ eq(0, funcs.luaeval('vim.stricmp("a\\0", "A\\0")'))
+ eq(0, funcs.luaeval('vim.stricmp("A\\0", "a\\0")'))
+ eq(0, funcs.luaeval('vim.stricmp("a\\0", "a\\0")'))
+ eq(0, funcs.luaeval('vim.stricmp("A\\0", "A\\0")'))
+
+ eq(0, funcs.luaeval('vim.stricmp("\\0a", "\\0A")'))
+ eq(0, funcs.luaeval('vim.stricmp("\\0A", "\\0a")'))
+ eq(0, funcs.luaeval('vim.stricmp("\\0a", "\\0a")'))
+ eq(0, funcs.luaeval('vim.stricmp("\\0A", "\\0A")'))
+
+ eq(0, funcs.luaeval('vim.stricmp("\\0a\\0", "\\0A\\0")'))
+ eq(0, funcs.luaeval('vim.stricmp("\\0A\\0", "\\0a\\0")'))
+ eq(0, funcs.luaeval('vim.stricmp("\\0a\\0", "\\0a\\0")'))
+ eq(0, funcs.luaeval('vim.stricmp("\\0A\\0", "\\0A\\0")'))
+
+ eq(-1, funcs.luaeval('vim.stricmp("a", "B")'))
+ eq(-1, funcs.luaeval('vim.stricmp("A", "b")'))
+ eq(-1, funcs.luaeval('vim.stricmp("a", "b")'))
+ eq(-1, funcs.luaeval('vim.stricmp("A", "B")'))
+
+ eq(-1, funcs.luaeval('vim.stricmp("", "\\0")'))
+ eq(-1, funcs.luaeval('vim.stricmp("\\0", "\\0\\0")'))
+ eq(-1, funcs.luaeval('vim.stricmp("\\0\\0", "\\0\\0\\0")'))
+ eq(-1, funcs.luaeval('vim.stricmp("\\0\\0\\0A", "\\0\\0\\0b")'))
+ eq(-1, funcs.luaeval('vim.stricmp("\\0\\0\\0a", "\\0\\0\\0B")'))
+ eq(-1, funcs.luaeval('vim.stricmp("\\0\\0\\0a", "\\0\\0\\0b")'))
+
+ eq(-1, funcs.luaeval('vim.stricmp("a\\0", "B\\0")'))
+ eq(-1, funcs.luaeval('vim.stricmp("A\\0", "b\\0")'))
+ eq(-1, funcs.luaeval('vim.stricmp("a\\0", "b\\0")'))
+ eq(-1, funcs.luaeval('vim.stricmp("A\\0", "B\\0")'))
+
+ eq(-1, funcs.luaeval('vim.stricmp("\\0a", "\\0B")'))
+ eq(-1, funcs.luaeval('vim.stricmp("\\0A", "\\0b")'))
+ eq(-1, funcs.luaeval('vim.stricmp("\\0a", "\\0b")'))
+ eq(-1, funcs.luaeval('vim.stricmp("\\0A", "\\0B")'))
+
+ eq(-1, funcs.luaeval('vim.stricmp("\\0a\\0", "\\0B\\0")'))
+ eq(-1, funcs.luaeval('vim.stricmp("\\0A\\0", "\\0b\\0")'))
+ eq(-1, funcs.luaeval('vim.stricmp("\\0a\\0", "\\0b\\0")'))
+ eq(-1, funcs.luaeval('vim.stricmp("\\0A\\0", "\\0B\\0")'))
+
+ eq(1, funcs.luaeval('vim.stricmp("c", "B")'))
+ eq(1, funcs.luaeval('vim.stricmp("C", "b")'))
+ eq(1, funcs.luaeval('vim.stricmp("c", "b")'))
+ eq(1, funcs.luaeval('vim.stricmp("C", "B")'))
+
+ eq(1, funcs.luaeval('vim.stricmp("\\0", "")'))
+ eq(1, funcs.luaeval('vim.stricmp("\\0\\0", "\\0")'))
+ eq(1, funcs.luaeval('vim.stricmp("\\0\\0\\0", "\\0\\0")'))
+ eq(1, funcs.luaeval('vim.stricmp("\\0\\0\\0\\0", "\\0\\0\\0")'))
+ eq(1, funcs.luaeval('vim.stricmp("\\0\\0\\0C", "\\0\\0\\0b")'))
+ eq(1, funcs.luaeval('vim.stricmp("\\0\\0\\0c", "\\0\\0\\0B")'))
+ eq(1, funcs.luaeval('vim.stricmp("\\0\\0\\0c", "\\0\\0\\0b")'))
+
+ eq(1, funcs.luaeval('vim.stricmp("c\\0", "B\\0")'))
+ eq(1, funcs.luaeval('vim.stricmp("C\\0", "b\\0")'))
+ eq(1, funcs.luaeval('vim.stricmp("c\\0", "b\\0")'))
+ eq(1, funcs.luaeval('vim.stricmp("C\\0", "B\\0")'))
+
+ eq(1, funcs.luaeval('vim.stricmp("c\\0", "B")'))
+ eq(1, funcs.luaeval('vim.stricmp("C\\0", "b")'))
+ eq(1, funcs.luaeval('vim.stricmp("c\\0", "b")'))
+ eq(1, funcs.luaeval('vim.stricmp("C\\0", "B")'))
+
+ eq(1, funcs.luaeval('vim.stricmp("\\0c", "\\0B")'))
+ eq(1, funcs.luaeval('vim.stricmp("\\0C", "\\0b")'))
+ eq(1, funcs.luaeval('vim.stricmp("\\0c", "\\0b")'))
+ eq(1, funcs.luaeval('vim.stricmp("\\0C", "\\0B")'))
+
+ eq(1, funcs.luaeval('vim.stricmp("\\0c\\0", "\\0B\\0")'))
+ eq(1, funcs.luaeval('vim.stricmp("\\0C\\0", "\\0b\\0")'))
+ eq(1, funcs.luaeval('vim.stricmp("\\0c\\0", "\\0b\\0")'))
+ eq(1, funcs.luaeval('vim.stricmp("\\0C\\0", "\\0B\\0")'))
+ end)
+end)
+
+describe("vim.split", function()
+ it("works", function()
+ local split = function(str, sep)
+ return meths.execute_lua('return vim.split(...)', {str, sep})
+ end
+
+ local tests = {
+ { "a,b", ",", false, { 'a', 'b' } },
+ { ":aa::bb:", ":", false, { '', 'aa', '', 'bb', '' } },
+ { "::ee::ff:", ":", false, { '', '', 'ee', '', 'ff', '' } },
+ { "ab", ".", false, { '', '', '' } },
+ { "a1b2c", "[0-9]", false, { 'a', 'b', 'c' } },
+ { "xy", "", false, { 'x', 'y' } },
+ { "here be dragons", " ", false, { "here", "be", "dragons"} },
+ { "axaby", "ab?", false, { '', 'x', 'y' } },
+ { "f v2v v3v w2w ", "([vw])2%1", false, { 'f ', ' v3v ', ' ' } },
+ { "x*yz*oo*l", "*", true, { 'x', 'yz', 'oo', 'l' } },
+ }
+
+ for _, t in ipairs(tests) do
+ eq(t[4], split(t[1], t[2], t[3]))
+ end
+
+ local loops = {
+ { "abc", ".-" },
+ }
+
+ for _, t in ipairs(loops) do
+ local status, err = pcall(split, t[1], t[2])
+ eq(false, status)
+ assert(string.match(err, "Infinite loop detected"))
+ end
+ end)
+end)
+
+describe("vim.trim", function()
+ it('works', function()
+ local trim = function(s)
+ return meths.execute_lua('return vim.trim(...)', { s })
+ end
+
+ local trims = {
+ { " a", "a" },
+ { " b ", "b" },
+ { "\tc" , "c" },
+ { "r\n", "r" },
+ }
+
+ for _, t in ipairs(trims) do
+ assert(t[2], trim(t[1]))
+ end
+
+ local status, err = pcall(trim, 2)
+ eq(false, status)
+ assert(string.match(err, "Only strings can be trimmed"))
+ end)
+end)
+
+describe("vim.inspect", function()
+ it('works', function()
+ -- just make sure it basically works, it has its own test suite
+ local inspect = function(t, opts)
+ return meths.execute_lua('return vim.inspect(...)', { t, opts })
+ end
+
+ eq('2', inspect(2))
+ eq('{+a = {+b = 1+}+}',
+ inspect({ a = { b = 1 } }, { newline = '+', indent = '' }))
+
+ -- special value vim.inspect.KEY works
+ eq('{ KEY_a = "x", KEY_b = "y"}', meths.execute_lua([[
+ return vim.inspect({a="x", b="y"}, {newline = '', process = function(item, path)
+ if path[#path] == vim.inspect.KEY then
+ return 'KEY_'..item
+ end
+ return item
+ end})
+ ]], {}))
+ end)
+end)
+
+describe("vim.deepcopy", function()
+ it("works", function()
+ local is_dc = meths.execute_lua([[
+ local a = { x = { 1, 2 }, y = 5}
+ local b = vim.deepcopy(a)
+
+ local count = 0
+ for _ in pairs(b) do count = count + 1 end
+
+ return b.x[1] == 1 and b.x[2] == 2 and b.y == 5 and count == 2
+ and tostring(a) ~= tostring(b)
+ ]], {})
+
+ assert(is_dc)
+ end)
+end)
diff --git a/test/functional/normal/K_spec.lua b/test/functional/normal/K_spec.lua
index af0f82ef9a..174313d80e 100644
--- a/test/functional/normal/K_spec.lua
+++ b/test/functional/normal/K_spec.lua
@@ -27,7 +27,7 @@ describe('K', function()
it("invokes non-prefixed 'keywordprg' as shell command", function()
helpers.source([[
let @a='fnord'
- set keywordprg=echo\ fnord\ >>]])
+ set keywordprg=echo\ fnord>>]])
-- K on the text "K_spec_out" resolves to `!echo fnord >> K_spec_out`.
feed('i'..test_file..'<ESC>K')
diff --git a/test/functional/normal/count_spec.lua b/test/functional/normal/count_spec.lua
new file mode 100644
index 0000000000..94f741250a
--- /dev/null
+++ b/test/functional/normal/count_spec.lua
@@ -0,0 +1,39 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local eq = helpers.eq
+local eval = helpers.eval
+local feed = helpers.feed
+local clear = helpers.clear
+local command = helpers.command
+
+describe('v:count/v:count1', function()
+ before_each(function()
+ clear()
+
+ command('map <silent> _x :<C-u>let g:count = "v:count=". v:count .", v:count1=". v:count1<CR>')
+ end)
+
+ describe('in cmdwin', function()
+ it('equal 0/1 when no count is given', function()
+ feed('q:_x')
+ eq('v:count=0, v:count1=1', eval('g:count'))
+ end)
+
+ it('equal 2/2 when count of 2 is given', function()
+ feed('q:2_x')
+ eq('v:count=2, v:count1=2', eval('g:count'))
+ end)
+ end)
+
+ describe('in normal mode', function()
+ it('equal 0/1 when no count is given', function()
+ feed('_x')
+ eq('v:count=0, v:count1=1', eval('g:count'))
+ end)
+
+ it('equal 2/2 when count of 2 is given', function()
+ feed('2_x')
+ eq('v:count=2, v:count1=2', eval('g:count'))
+ end)
+ end)
+end)
diff --git a/test/functional/normal/fold_spec.lua b/test/functional/normal/fold_spec.lua
new file mode 100644
index 0000000000..00e83bedc8
--- /dev/null
+++ b/test/functional/normal/fold_spec.lua
@@ -0,0 +1,362 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local clear = helpers.clear
+local insert = helpers.insert
+local feed = helpers.feed
+local expect = helpers.expect
+local feed_command = helpers.feed_command
+local funcs = helpers.funcs
+local foldlevel = funcs.foldlevel
+local foldclosedend = funcs.foldclosedend
+local eq = helpers.eq
+
+describe('Folds', function()
+ local tempfname = 'Xtest-fold.txt'
+ clear()
+ before_each(function() feed_command('enew!') end)
+ after_each(function() os.remove(tempfname) end)
+ it('manual folding adjusts with filter', function()
+ insert([[
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20]])
+ feed_command('4,$fold', '%foldopen', '10,$fold', '%foldopen')
+ feed_command('1,8! cat')
+ feed('5ggzdzMGdd')
+ expect([[
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9]])
+ end)
+ describe('adjusting folds after :move', function()
+ local function manually_fold_indent()
+ -- setting foldmethod twice is a trick to get vim to set the folds for me
+ feed_command('set foldmethod=indent', 'set foldmethod=manual')
+ -- Ensure that all folds will get closed (makes it easier to test the
+ -- length of folds).
+ feed_command('set foldminlines=0')
+ -- Start with all folds open (so :move ranges aren't affected by closed
+ -- folds).
+ feed_command('%foldopen!')
+ end
+
+ local function get_folds()
+ local rettab = {}
+ for i = 1, funcs.line('$') do
+ table.insert(rettab, foldlevel(i))
+ end
+ return rettab
+ end
+
+ local function test_move_indent(insert_string, move_command)
+ -- This test is easy because we just need to ensure that the resulting
+ -- fold is the same as calculated when creating folds from scratch.
+ insert(insert_string)
+ feed_command(move_command)
+ local after_move_folds = get_folds()
+ -- Doesn't change anything, but does call foldUpdateAll()
+ feed_command('set foldminlines=0')
+ eq(after_move_folds, get_folds())
+ -- Set up the buffer with insert_string for the manual fold testing.
+ feed_command('enew!')
+ insert(insert_string)
+ manually_fold_indent()
+ feed_command(move_command)
+ end
+
+ it('neither closes nor corrupts folds', function()
+ test_move_indent([[
+a
+ a
+ a
+ a
+ a
+ a
+a
+ a
+ a
+ a
+ a
+ a
+a
+ a
+ a
+ a
+ a
+ a]], '7,12m0')
+ expect([[
+a
+ a
+ a
+ a
+ a
+ a
+a
+ a
+ a
+ a
+ a
+ a
+a
+ a
+ a
+ a
+ a
+ a]])
+ -- lines are not closed, folds are correct
+ for i = 1,funcs.line('$') do
+ eq(-1, funcs.foldclosed(i))
+ if i == 1 or i == 7 or i == 13 then
+ eq(0, foldlevel(i))
+ elseif i == 4 then
+ eq(2, foldlevel(i))
+ else
+ eq(1, foldlevel(i))
+ end
+ end
+ -- folds are not corrupted
+ feed('zM')
+ eq(6, foldclosedend(2))
+ eq(12, foldclosedend(8))
+ eq(18, foldclosedend(14))
+ end)
+ it("doesn't split a fold when the move is within it", function()
+ test_move_indent([[
+a
+ a
+ a
+ a
+ a
+ a
+ a
+ a
+ a
+a]], '5m6')
+ eq({0, 1, 1, 2, 2, 2, 2, 1, 1, 0}, get_folds())
+ end)
+ it('truncates folds that end in the moved range', function()
+ test_move_indent([[
+a
+ a
+ a
+ a
+ a
+a
+a]], '4,5m6')
+ eq({0, 1, 2, 0, 0, 0, 0}, get_folds())
+ end)
+ it('moves folds that start between moved range and destination', function()
+ test_move_indent([[
+a
+ a
+ a
+ a
+ a
+a
+a
+ a
+ a
+ a
+a
+a
+ a]], '3,4m$')
+ eq({0, 1, 1, 0, 0, 1, 2, 1, 0, 0, 1, 0, 0}, get_folds())
+ end)
+ it('does not affect folds outside changed lines', function()
+ test_move_indent([[
+ a
+ a
+ a
+a
+a
+a
+ a
+ a
+ a]], '4m5')
+ eq({1, 1, 1, 0, 0, 0, 1, 1, 1}, get_folds())
+ end)
+ it('moves and truncates folds that start in moved range', function()
+ test_move_indent([[
+a
+ a
+ a
+ a
+ a
+a
+a
+a
+a
+a]], '1,3m7')
+ eq({0, 0, 0, 0, 0, 1, 2, 0, 0, 0}, get_folds())
+ end)
+ it('breaks a fold when moving text into it', function()
+ test_move_indent([[
+a
+ a
+ a
+ a
+ a
+a
+a]], '$m4')
+ eq({0, 1, 2, 2, 0, 0, 0}, get_folds())
+ end)
+ it('adjusts correctly when moving a range backwards', function()
+ test_move_indent([[
+a
+ a
+ a
+ a
+a]], '2,3m0')
+ eq({1, 2, 0, 0, 0}, get_folds())
+ end)
+ it('handles shifting all remaining folds', function()
+ test_move_indent([[
+ a
+ a
+ a
+ a
+ a
+ a
+ a
+ a
+ a
+ a
+ a
+ a
+ a
+ a
+a]], '13m7')
+ eq({1, 2, 2, 2, 1, 2, 2, 1, 1, 1, 2, 2, 2, 1, 0}, get_folds())
+ end)
+ end)
+ it('updates correctly on :read', function()
+ -- luacheck: ignore 621
+ helpers.write_file(tempfname, [[
+ a
+
+
+ a]])
+ insert([[
+ a
+ a
+ a
+ a
+ ]])
+ feed_command('set foldmethod=indent', '2', '%foldopen')
+ feed_command('read ' .. tempfname)
+ -- Just to check we have the correct file text.
+ expect([[
+ a
+ a
+ a
+
+
+ a
+ a
+ a
+ ]])
+ for i = 1,2 do
+ eq(1, funcs.foldlevel(i))
+ end
+ for i = 3,5 do
+ eq(0, funcs.foldlevel(i))
+ end
+ for i = 6,8 do
+ eq(1, funcs.foldlevel(i))
+ end
+ end)
+ it('combines folds when removing separating space', function()
+ -- luacheck: ignore 621
+ insert([[
+ a
+ a
+ a
+ a
+ a
+ a
+ a
+ a
+ ]])
+ feed_command('set foldmethod=indent', '3,5d')
+ eq(5, funcs.foldclosedend(1))
+ end)
+ it("doesn't combine folds that have a specified end", function()
+ insert([[
+ {{{
+ }}}
+
+
+
+ {{{
+
+ }}}
+ ]])
+ feed_command('set foldmethod=marker', '3,5d', '%foldclose')
+ eq(2, funcs.foldclosedend(1))
+ end)
+ it('splits folds according to >N and <N with foldexpr', function()
+ helpers.source([[
+ function TestFoldExpr(lnum)
+ let thisline = getline(a:lnum)
+ if thisline == 'a'
+ return 1
+ elseif thisline == 'b'
+ return 0
+ elseif thisline == 'c'
+ return '<1'
+ elseif thisline == 'd'
+ return '>1'
+ endif
+ return 0
+ endfunction
+ ]])
+ helpers.write_file(tempfname, [[
+ b
+ b
+ a
+ a
+ d
+ a
+ a
+ c]])
+ insert([[
+ a
+ a
+ a
+ a
+ a
+ a
+ ]])
+ feed_command('set foldmethod=expr', 'set foldexpr=TestFoldExpr(v:lnum)', '2', 'foldopen')
+ feed_command('read ' .. tempfname, '%foldclose')
+ eq(2, funcs.foldclosedend(1))
+ eq(0, funcs.foldlevel(3))
+ eq(0, funcs.foldlevel(4))
+ eq(6, funcs.foldclosedend(5))
+ eq(10, funcs.foldclosedend(7))
+ eq(14, funcs.foldclosedend(11))
+ end)
+end)
diff --git a/test/functional/normal/lang_spec.lua b/test/functional/normal/lang_spec.lua
new file mode 100644
index 0000000000..24d1262f5f
--- /dev/null
+++ b/test/functional/normal/lang_spec.lua
@@ -0,0 +1,63 @@
+local helpers = require('test.functional.helpers')(after_each)
+local clear, insert, eq = helpers.clear, helpers.insert, helpers.eq
+local command, expect = helpers.command, helpers.expect
+local feed, eval = helpers.feed, helpers.eval
+local exc_exec = helpers.exc_exec
+
+describe('gu and gU', function()
+ before_each(clear)
+
+ it('works in any locale with default casemap', function()
+ eq('internal,keepascii', eval('&casemap'))
+ insert("iI")
+ feed("VgU")
+ expect("II")
+ feed("Vgu")
+ expect("ii")
+ end)
+
+ describe('works in Turkish locale', function()
+ clear()
+
+ local err = exc_exec('lang ctype tr_TR.UTF-8')
+ if err ~= 0 then
+ pending("Locale tr_TR.UTF-8 not supported", function() end)
+ return
+ end
+
+ before_each(function()
+ command('lang ctype tr_TR.UTF-8')
+ end)
+
+ it('with default casemap', function()
+ eq('internal,keepascii', eval('&casemap'))
+ -- expect ASCII behavior
+ insert("iI")
+ feed("VgU")
+ expect("II")
+ feed("Vgu")
+ expect("ii")
+ end)
+
+ it('with casemap=""', function()
+ command('set casemap=')
+ -- expect either Turkish locale behavior or ASCII behavior
+ local iupper = eval("toupper('i')")
+ if iupper == "ฤฐ" then
+ insert("iI")
+ feed("VgU")
+ expect("ฤฐI")
+ feed("Vgu")
+ expect("iฤฑ")
+ elseif iupper == "I" then
+ insert("iI")
+ feed("VgU")
+ expect("II")
+ feed("Vgu")
+ expect("ii")
+ else
+ error("expected toupper('i') to be either 'I' or 'ฤฐ'")
+ end
+ end)
+ end)
+end)
diff --git a/test/functional/normal/langmap_spec.lua b/test/functional/normal/langmap_spec.lua
new file mode 100644
index 0000000000..e4349a22e7
--- /dev/null
+++ b/test/functional/normal/langmap_spec.lua
@@ -0,0 +1,280 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local eq, neq, call = helpers.eq, helpers.neq, helpers.call
+local eval, feed, clear = helpers.eval, helpers.feed, helpers.clear
+local command, insert, expect = helpers.command, helpers.insert, helpers.expect
+local feed_command = helpers.feed_command
+local curwin = helpers.curwin
+
+describe("'langmap'", function()
+ before_each(function()
+ clear()
+ insert('iii www')
+ command('set langmap=iw,wi')
+ feed('gg0')
+ end)
+
+ it("converts keys in normal mode", function()
+ feed('ix')
+ expect('iii ww')
+ feed('whello<esc>')
+ expect('iii helloww')
+ end)
+ it("gives characters that are mapped by :nmap.", function()
+ command('map i 0x')
+ feed('w')
+ expect('ii www')
+ end)
+ describe("'langnoremap' option.", function()
+ before_each(function()
+ command('nmapclear')
+ end)
+ it("'langnoremap' is by default ON", function()
+ eq(eval('&langnoremap'), 1)
+ end)
+ it("Results of maps are not converted when 'langnoremap' ON.",
+ function()
+ command('nmap x i')
+ feed('xdl<esc>')
+ expect('dliii www')
+ end)
+ it("applies when deciding whether to map recursively", function()
+ command('nmap l i')
+ command('nmap w j')
+ feed('ll')
+ expect('liii www')
+ end)
+ it("does not stop applying 'langmap' on first character of a mapping",
+ function()
+ command('1t1')
+ command('1t1')
+ command('goto 1')
+ command('nmap w j')
+ feed('iiahello')
+ expect([[
+ iii www
+ iii www
+ ihelloii www]])
+ end)
+ it("Results of maps are converted when 'langnoremap' OFF.",
+ function()
+ command('set nolangnoremap')
+ command('nmap x i')
+ feed('xdl<esc>')
+ expect('iii ww')
+ end)
+ end)
+ -- e.g. CTRL-W_j , mj , 'j and "jp
+ it('conversions are applied to keys in middle of command',
+ function()
+ -- Works in middle of window command
+ feed('<C-w>s')
+ local origwin = curwin()
+ feed('<C-w>i')
+ neq(curwin(), origwin)
+ -- Works when setting a mark
+ feed('yy3p3gg0mwgg0mi')
+ eq(call('getpos', "'i"), {0, 3, 1, 0})
+ eq(call('getpos', "'w"), {0, 1, 1, 0})
+ feed('3dd')
+ -- Works when moving to a mark
+ feed("'i")
+ eq(call('getpos', '.'), {0, 1, 1, 0})
+ -- Works when selecting a register
+ feed('qillqqwhhq')
+ eq(eval('@i'), 'hh')
+ eq(eval('@w'), 'll')
+ feed('a<C-r>i<esc>')
+ expect('illii www')
+ feed('"ip')
+ expect('illllii www')
+ -- Works with i_CTRL-O
+ feed('0a<C-O>ihi<esc>')
+ expect('illllii hiwww')
+ end)
+
+ describe('exceptions', function()
+ -- All "command characters" that 'langmap' does not apply to.
+ -- These tests consist of those places where some subset of ASCII
+ -- characters define certain commands, yet 'langmap' is not applied to
+ -- them.
+ -- n.b. I think these shouldn't be exceptions.
+ it(':s///c confirmation', function()
+ command('set langmap=yn,ny')
+ feed('qa')
+ feed_command('s/i/w/gc')
+ feed('yynq')
+ expect('wwi www')
+ feed('u@a')
+ expect('wwi www')
+ eq(eval('@a'), ':s/i/w/gc\ryyn')
+ end)
+ it('insert-mode CTRL-G', function()
+ command('set langmap=jk,kj')
+ command('d')
+ insert([[
+ hello
+ hello
+ hello]])
+ expect([[
+ hello
+ hello
+ hello]])
+ feed('qa')
+ feed('gg3|ahello<C-G>jx<esc>')
+ feed('q')
+ expect([[
+ helhellolo
+ helxlo
+ hello]])
+ eq(eval('@a'), 'gg3|ahellojx')
+ end)
+ it('command-line CTRL-\\', function()
+ command('set langmap=en,ne')
+ feed(':<C-\\>e\'hello\'\r<C-B>put ="<C-E>"<CR>')
+ expect([[
+ iii www
+ hello]])
+ end)
+ it('command-line CTRL-R', function()
+ helpers.source([[
+ let i_value = 0
+ let j_value = 0
+ call setreg('i', 'i_value')
+ call setreg('j', 'j_value')
+ set langmap=ij,ji
+ ]])
+ feed(':let <C-R>i=1<CR>')
+ eq(eval('i_value'), 1)
+ eq(eval('j_value'), 0)
+ end)
+ -- it('-- More -- prompt', function()
+ -- -- The 'b' 'j' 'd' 'f' commands at the -- More -- prompt
+ -- end)
+ it('ask yes/no after backwards range', function()
+ command('set langmap=yn,ny')
+ feed('dd')
+ insert([[
+ hello
+ there
+ these
+ are
+ some
+ lines
+ ]])
+ feed_command('4,2d')
+ feed('n')
+ expect([[
+ hello
+ there
+ these
+ are
+ some
+ lines
+ ]])
+ end)
+ it('prompt for number', function()
+ command('set langmap=12,21')
+ helpers.source([[
+ let gotten_one = 0
+ function Map()
+ let answer = inputlist(['a', '1.', '2.', '3.'])
+ if answer == 1
+ let g:gotten_one = 1
+ endif
+ endfunction
+ nnoremap x :call Map()<CR>
+ ]])
+ feed('x1<CR>')
+ eq(eval('gotten_one'), 1)
+ command('let g:gotten_one = 0')
+ feed_command('call Map()')
+ feed('1<CR>')
+ eq(eval('gotten_one'), 1)
+ end)
+ end)
+ it('conversions are not applied during setreg()',
+ function()
+ call('setreg', 'i', 'ww')
+ eq(eval('@i'), 'ww')
+ end)
+ it('conversions not applied in insert mode', function()
+ feed('aiiiwww')
+ expect('iiiiwwwii www')
+ end)
+ it('conversions not applied in search mode', function()
+ feed('/iii<cr>x')
+ expect('ii www')
+ end)
+ it('conversions not applied in cmdline mode', function()
+ feed(':call append(1, "iii")<cr>')
+ expect([[
+ iii www
+ iii]])
+ end)
+
+ local function testrecording(command_string, expect_string, setup_function)
+ if setup_function then setup_function() end
+ feed('qa' .. command_string .. 'q')
+ expect(expect_string)
+ eq(helpers.funcs.nvim_replace_termcodes(command_string, true, true, true),
+ eval('@a'))
+ if setup_function then setup_function() end
+ -- n.b. may need nvim_replace_termcodes() here.
+ feed('@a')
+ expect(expect_string)
+ end
+
+ local function local_setup()
+ -- Can't use `insert` as it uses `i` and we've swapped the meaning of that
+ -- with the `langmap` setting.
+ command('%d')
+ command("put ='hello'")
+ command('1d')
+ end
+
+ it('does not affect recording special keys', function()
+ testrecording('A<BS><esc>', 'hell', local_setup)
+ testrecording('>><lt><lt>', 'hello', local_setup)
+ command('nnoremap \\ x')
+ testrecording('\\', 'ello', local_setup)
+ testrecording('A<C-V><BS><esc>', 'hello<BS>', local_setup)
+ end)
+ pending('Translates modified keys correctly', function()
+ command('nnoremap <M-i> x')
+ command('nnoremap <M-w> l')
+ testrecording('<M-w>', 'ello', local_setup)
+ testrecording('<M-i>x', 'hllo', local_setup)
+ end)
+ pending('handles multi-byte characters', function()
+ command('set langmap=รฏx')
+ testrecording('รฏ', 'ello', local_setup)
+ -- The test below checks that what's recorded is correct.
+ -- It doesn't check the behaviour, as in order to cause some behaviour we
+ -- need to map the multi-byte character, and there is a known bug
+ -- preventing this from working (see the test below).
+ command('set langmap=xรฏ')
+ testrecording('x', 'hello', local_setup)
+ end)
+ pending('handles multibyte mappings', function()
+ -- See this vim issue for the problem, may as well add a test.
+ -- https://github.com/vim/vim/issues/297
+ command('set langmap=รฏx')
+ command('nnoremap x diw')
+ testrecording('รฏ', '', local_setup)
+ command('set nolangnoremap')
+ command('set langmap=xรฏ')
+ command('nnoremap รฏ ix<esc>')
+ testrecording('x', 'xhello', local_setup)
+ end)
+ -- This test is to ensure the behaviour doesn't change from what's already
+ -- around. I (hardenedapple) personally think this behaviour should be
+ -- changed.
+ it('treats control modified keys as characters', function()
+ command('nnoremap <C-w> iw<esc>')
+ command('nnoremap <C-i> ii<esc>')
+ testrecording('<C-w>', 'whello', local_setup)
+ testrecording('<C-i>', 'ihello', local_setup)
+ end)
+
+end)
diff --git a/test/functional/normal/macro_spec.lua b/test/functional/normal/macro_spec.lua
new file mode 100644
index 0000000000..102d8fc723
--- /dev/null
+++ b/test/functional/normal/macro_spec.lua
@@ -0,0 +1,30 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local eq = helpers.eq
+local eval = helpers.eval
+local feed = helpers.feed
+local clear = helpers.clear
+local expect = helpers.expect
+local command = helpers.command
+
+describe('macros', function()
+ before_each(clear)
+ it('can be recorded and replayed', function()
+ feed('qiahello<esc>q')
+ expect('hello')
+ eq(eval('@i'), 'ahello')
+ feed('@i')
+ expect('hellohello')
+ eq(eval('@i'), 'ahello')
+ end)
+ it('applies maps', function()
+ command('imap x l')
+ command('nmap l a')
+ feed('qilxxx<esc>q')
+ expect('lll')
+ eq(eval('@i'), 'lxxx')
+ feed('@i')
+ expect('llllll')
+ eq(eval('@i'), 'lxxx')
+ end)
+end)
diff --git a/test/functional/normal/put_spec.lua b/test/functional/normal/put_spec.lua
new file mode 100644
index 0000000000..29cef13e39
--- /dev/null
+++ b/test/functional/normal/put_spec.lua
@@ -0,0 +1,937 @@
+local Screen = require('test.functional.ui.screen')
+local helpers = require('test.functional.helpers')(after_each)
+
+local clear = helpers.clear
+local insert = helpers.insert
+local feed = helpers.feed
+local expect = helpers.expect
+local eq = helpers.eq
+local map = helpers.map
+local filter = helpers.filter
+local feed_command = helpers.feed_command
+local curbuf_contents = helpers.curbuf_contents
+local funcs = helpers.funcs
+local dedent = helpers.dedent
+local getreg = funcs.getreg
+
+local function reset()
+ feed_command('enew!')
+ insert([[
+ Line of words 1
+ Line of words 2]])
+ feed_command('goto 1')
+ feed('itest_string.<esc>u')
+ funcs.setreg('a', 'test_stringa', 'V')
+ funcs.setreg('b', 'test_stringb\ntest_stringb\ntest_stringb', 'b')
+ funcs.setreg('"', 'test_string"', 'v')
+ feed_command('set virtualedit=')
+end
+
+-- We check the last inserted register ". in each of these tests because it is
+-- implemented completely differently in do_put().
+-- It is implemented differently so that control characters and imap'ped
+-- characters work in the same manner when pasted as when inserted.
+describe('put command', function()
+ clear()
+ before_each(reset)
+
+ local function visual_marks_zero()
+ for _,v in pairs(funcs.getpos("'<")) do
+ if v ~= 0 then
+ return false
+ end
+ end
+ for _,v in pairs(funcs.getpos("'>")) do
+ if v ~= 0 then
+ return false
+ end
+ end
+ return true
+ end
+
+ -- {{{ Where test definitions are run
+ local function run_test_variations(test_variations, extra_setup)
+ reset()
+ if extra_setup then extra_setup() end
+ local init_contents = curbuf_contents()
+ local init_cursorpos = funcs.getcurpos()
+ local assert_no_change = function (exception_table, after_undo)
+ expect(init_contents)
+ -- When putting the ". register forwards, undo doesn't move
+ -- the cursor back to where it was before.
+ -- This is because it uses the command character 'a' to
+ -- start the insert, and undo after that leaves the cursor
+ -- one place to the right (unless we were at the end of the
+ -- line when we pasted).
+ if not (exception_table.undo_position and after_undo) then
+ eq(funcs.getcurpos(), init_cursorpos)
+ end
+ end
+
+ for _, test in pairs(test_variations) do
+ it(test.description, function()
+ if extra_setup then extra_setup() end
+ local orig_dotstr = funcs.getreg('.')
+ helpers.ok(visual_marks_zero())
+ -- Make sure every test starts from the same conditions
+ assert_no_change(test.exception_table, false)
+ local was_cli = test.test_action()
+ test.test_assertions(test.exception_table, false)
+ -- Check that undo twice puts us back to the original conditions
+ -- (i.e. puts the cursor and text back to before)
+ feed('u')
+ assert_no_change(test.exception_table, true)
+
+ -- Should not have changed the ". register
+ -- If we paste the ". register with a count we can't avoid
+ -- changing this register, hence avoid this check.
+ if not test.exception_table.dot_reg_changed then
+ eq(funcs.getreg('.'), orig_dotstr)
+ end
+
+ -- Doing something, undoing it, and then redoing it should
+ -- leave us in the same state as just doing it once.
+ -- For :ex actions we want '@:', for normal actions we want '.'
+
+ -- The '.' redo doesn't work for visual put so just exit if
+ -- it was tested.
+ -- We check that visual put was used by checking if the '< and
+ -- '> marks were changed.
+ if not visual_marks_zero() then
+ return
+ end
+
+ if test.exception_table.undo_position then
+ funcs.setpos('.', init_cursorpos)
+ end
+ if was_cli then
+ feed('@:')
+ else
+ feed('.')
+ end
+
+ test.test_assertions(test.exception_table, true)
+ end)
+ end
+ end -- run_test_variations()
+ -- }}}
+
+ local function create_test_defs(test_defs, command_base, command_creator, -- {{{
+ expect_base, expect_creator)
+ local rettab = {}
+ local exceptions
+ for _, v in pairs(test_defs) do
+ if v[4] then
+ exceptions = v[4]
+ else
+ exceptions = {}
+ end
+ table.insert(rettab,
+ {
+ test_action = command_creator(command_base, v[1]),
+ test_assertions = expect_creator(expect_base, v[2]),
+ description = v[3],
+ exception_table = exceptions,
+ })
+ end
+ return rettab
+ end -- create_test_defs() }}}
+
+ local function find_cursor_position(expect_string) -- {{{
+ -- There must only be one occurance of the character 'x' in
+ -- expect_string.
+ -- This function removes that occurance, and returns the position that
+ -- it was in.
+ -- This returns the cursor position that would leave the 'x' in that
+ -- place if we feed 'ix<esc>' and the string existed before it.
+ for linenum, line in pairs(funcs.split(expect_string, '\n', 1)) do
+ local column = line:find('x')
+ if column then
+ return {linenum, column}, expect_string:gsub('x', '')
+ end
+ end
+ end -- find_cursor_position() }}}
+
+ -- Action function creators {{{
+ local function create_p_action(test_map, substitution)
+ local temp_val = test_map:gsub('p', substitution)
+ return function()
+ feed(temp_val)
+ return false
+ end
+ end
+
+ local function create_put_action(command_base, substitution)
+ local temp_val = command_base:gsub('put', substitution)
+ return function()
+ feed_command(temp_val)
+ return true
+ end
+ end
+ -- }}}
+
+ -- Expect function creator {{{
+ local function expect_creator(conversion_function, expect_base, conversion_table)
+ local temp_expect_string = conversion_function(expect_base, conversion_table)
+ local cursor_position, expect_string = find_cursor_position(temp_expect_string)
+ return function(exception_table, after_redo)
+ expect(expect_string)
+
+ -- Have to use getcurpos() instead of curwinmeths.get_cursor() in
+ -- order to account for virtualedit.
+ -- We always want the curswant element in getcurpos(), which is
+ -- sometimes different to the column element in
+ -- curwinmeths.get_cursor().
+ -- NOTE: The ".gp command leaves the cursor after the pasted text
+ -- when running, but does not when the command is redone with the
+ -- '.' command.
+ if not (exception_table.redo_position and after_redo) then
+ local actual_position = funcs.getcurpos()
+ eq(cursor_position, {actual_position[2], actual_position[5]})
+ end
+ end
+ end -- expect_creator() }}}
+
+ -- Test definitions {{{
+ local function copy_def(def)
+ local rettab = { '', {}, '', nil }
+ rettab[1] = def[1]
+ for k,v in pairs(def[2]) do
+ rettab[2][k] = v
+ end
+ rettab[3] = def[3]
+ if def[4] then
+ rettab[4] = {}
+ for k,v in pairs(def[4]) do
+ rettab[4][k] = v
+ end
+ end
+ return rettab
+ end
+
+ local normal_command_defs = {
+ {
+ 'p',
+ {cursor_after = false, put_backwards = false, dot_register = false},
+ 'pastes after cursor with p',
+ },
+ {
+ 'gp',
+ {cursor_after = true, put_backwards = false, dot_register = false},
+ 'leaves cursor after text with gp',
+ },
+ {
+ '".p',
+ {cursor_after = false, put_backwards = false, dot_register = true},
+ 'works with the ". register',
+ },
+ {
+ '".gp',
+ {cursor_after = true, put_backwards = false, dot_register = true},
+ 'gp works with the ". register',
+ {redo_position = true},
+ },
+ {
+ 'P',
+ {cursor_after = false, put_backwards = true, dot_register = false},
+ 'pastes before cursor with P',
+ },
+ {
+ 'gP',
+ {cursor_after = true, put_backwards = true, dot_register = false},
+ 'gP pastes before cursor and leaves cursor after text',
+ },
+ {
+ '".P',
+ {cursor_after = false, put_backwards = true, dot_register = true},
+ 'P works with ". register',
+ },
+ {
+ '".gP',
+ {cursor_after = true, put_backwards = true, dot_register = true},
+ 'gP works with ". register',
+ {redo_position = true},
+ },
+ }
+
+ -- Add a definition applying a count for each definition above.
+ -- Could do this for each transformation (p -> P, p -> gp etc), but I think
+ -- it's neater this way (balance between being explicit and too verbose).
+ for i = 1,#normal_command_defs do
+ local cur = normal_command_defs[i]
+
+ -- Make modified copy of current definition that includes a count.
+ local newdef = copy_def(cur)
+ newdef[2].count = 2
+ cur[2].count = 1
+ newdef[1] = '2' .. newdef[1]
+ newdef[3] = 'double ' .. newdef[3]
+
+ if cur[2].dot_register then
+ if not cur[4] then
+ newdef[4] = {}
+ end
+ newdef[4].dot_reg_changed = true
+ end
+
+ normal_command_defs[#normal_command_defs + 1] = newdef
+ end
+
+ local ex_command_defs = {
+ {
+ 'put',
+ {put_backwards = false, dot_register = false},
+ 'pastes linewise forwards with :put',
+ },
+ {
+ 'put!',
+ {put_backwards = true, dot_register = false},
+ 'pastes linewise backwards with :put!',
+ },
+ {
+ 'put .',
+ {put_backwards = false, dot_register = true},
+ 'pastes linewise with the dot register',
+ },
+ {
+ 'put! .',
+ {put_backwards = true, dot_register = true},
+ 'pastes linewise backwards with the dot register',
+ },
+ }
+
+ local function non_dotdefs(def_table)
+ return filter(function(d) return not d[2].dot_register end, def_table)
+ end
+
+ -- }}}
+
+ -- Conversion functions {{{
+ local function convert_characterwise(expect_base, conversion_table,
+ virtualedit_end, visual_put)
+ expect_base = dedent(expect_base)
+ -- There is no difference between 'P' and 'p' when VIsual_active
+ if not visual_put then
+ if conversion_table.put_backwards then
+ -- Special case for virtualedit at the end of a line.
+ local replace_string
+ if not virtualedit_end then
+ replace_string = 'test_stringx"%1'
+ else
+ replace_string = 'test_stringx"'
+ end
+ expect_base = expect_base:gsub('(.)test_stringx"', replace_string)
+ end
+ end
+ if conversion_table.count > 1 then
+ local rep_string = 'test_string"'
+ local extra_puts = rep_string:rep(conversion_table.count - 1)
+ expect_base = expect_base:gsub('test_stringx"', extra_puts .. 'test_stringx"')
+ end
+ if conversion_table.cursor_after then
+ expect_base = expect_base:gsub('test_stringx"', 'test_string"x')
+ end
+ if conversion_table.dot_register then
+ expect_base = expect_base:gsub('(test_stringx?)"', '%1.')
+ end
+ return expect_base
+ end -- convert_characterwise()
+
+ local function make_back(string)
+ local prev_line
+ local rettab = {}
+ local string_found = false
+ for _, line in pairs(funcs.split(string, '\n', 1)) do
+ if line:find('test_string') then
+ string_found = true
+ table.insert(rettab, line)
+ else
+ if string_found then
+ if prev_line then
+ table.insert(rettab, prev_line)
+ prev_line = nil
+ end
+ table.insert(rettab, line)
+ else
+ table.insert(rettab, prev_line)
+ prev_line = line
+ end
+ end
+ end
+ -- In case there are no lines after the text that was put.
+ if prev_line and string_found then
+ table.insert(rettab, prev_line)
+ end
+ return table.concat(rettab, '\n')
+ end -- make_back()
+
+ local function convert_linewise(expect_base, conversion_table, _, use_a, indent)
+ expect_base = dedent(expect_base)
+ if conversion_table.put_backwards then
+ expect_base = make_back(expect_base)
+ end
+ local p_str = 'test_string"'
+ if use_a then
+ p_str = 'test_stringa'
+ end
+
+ if conversion_table.dot_register then
+ expect_base = expect_base:gsub('x' .. p_str, 'xtest_string.')
+ p_str = 'test_string.'
+ end
+
+ if conversion_table.cursor_after then
+ expect_base = expect_base:gsub('x' .. p_str .. '\n', p_str .. '\nx')
+ end
+
+ -- The 'indent' argument is only used here because a single put with an
+ -- indent doesn't require special handling. It doesn't require special
+ -- handling because the cursor is never put before the indent, hence
+ -- the modification of 'test_stringx"' gives the same overall answer as
+ -- modifying ' test_stringx"'.
+
+ -- Only happens when using normal mode command actions.
+ if conversion_table.count and conversion_table.count > 1 then
+ if not indent then
+ indent = ''
+ end
+ local rep_string = indent .. p_str .. '\n'
+ local extra_puts = rep_string:rep(conversion_table.count - 1)
+ local orig_string, new_string
+ if conversion_table.cursor_after then
+ orig_string = indent .. p_str .. '\nx'
+ new_string = extra_puts .. orig_string
+ else
+ orig_string = indent .. 'x' .. p_str .. '\n'
+ new_string = orig_string .. extra_puts
+ end
+ expect_base = expect_base:gsub(orig_string, new_string)
+ end
+ return expect_base
+ end
+
+ local function put_x_last(orig_line, p_str)
+ local prev_end, cur_end, cur_start = 0, 0, 0
+ while cur_start do
+ prev_end = cur_end
+ cur_start, cur_end = orig_line:find(p_str, prev_end)
+ end
+ -- Assume (because that is the only way I call it) that p_str matches
+ -- the pattern 'test_string.'
+ return orig_line:sub(1, prev_end - 1) .. 'x' .. orig_line:sub(prev_end)
+ end
+
+ local function convert_blockwise(expect_base, conversion_table, visual,
+ use_b, trailing_whitespace)
+ expect_base = dedent(expect_base)
+ local p_str = 'test_string"'
+ if use_b then
+ p_str = 'test_stringb'
+ end
+
+ if conversion_table.dot_register then
+ expect_base = expect_base:gsub('(x?)' .. p_str, '%1test_string.')
+ -- Looks strange, but the dot is a special character in the pattern
+ -- and a literal character in the replacement.
+ expect_base = expect_base:gsub('test_stringx.', 'test_stringx.')
+ p_str = 'test_string.'
+ end
+
+ -- No difference between 'p' and 'P' in visual mode.
+ if not visual then
+ if conversion_table.put_backwards then
+ -- One for the line where the cursor is left, one for all other
+ -- lines.
+ expect_base = expect_base:gsub('([^x])' .. p_str, p_str .. '%1')
+ expect_base = expect_base:gsub('([^x])x' .. p_str, 'x' .. p_str .. '%1')
+ if not trailing_whitespace then
+ expect_base = expect_base:gsub(' \n', '\n')
+ expect_base = expect_base:gsub(' $', '')
+ end
+ end
+ end
+
+ if conversion_table.count and conversion_table.count > 1 then
+ local p_pattern = p_str:gsub('%.', '%%.')
+ expect_base = expect_base:gsub(p_pattern,
+ p_str:rep(conversion_table.count))
+ expect_base = expect_base:gsub('test_stringx([b".])',
+ p_str:rep(conversion_table.count - 1)
+ .. '%0')
+ end
+
+ if conversion_table.cursor_after then
+ if not visual then
+ local prev_line
+ local rettab = {}
+ local prev_in_block = false
+ for _, line in pairs(funcs.split(expect_base, '\n', 1)) do
+ if line:find('test_string') then
+ if prev_line then
+ prev_line = prev_line:gsub('x', '')
+ table.insert(rettab, prev_line)
+ end
+ prev_line = line
+ prev_in_block = true
+ else
+ if prev_in_block then
+ prev_line = put_x_last(prev_line, p_str)
+ table.insert(rettab, prev_line)
+ prev_in_block = false
+ end
+ table.insert(rettab, line)
+ end
+ end
+ if prev_line and prev_in_block then
+ table.insert(rettab, put_x_last(prev_line, p_str))
+ end
+
+ expect_base = table.concat(rettab, '\n')
+ else
+ expect_base = expect_base:gsub('x(.)', '%1x')
+ end
+ end
+
+ return expect_base
+ end
+ -- }}}
+
+ -- Convenience functions {{{
+ local function run_normal_mode_tests(test_string, base_map, extra_setup,
+ virtualedit_end, selection_string)
+ local function convert_closure(e, c)
+ return convert_characterwise(e, c, virtualedit_end, selection_string)
+ end
+ local function expect_normal_creator(expect_base, conversion_table)
+ local test_expect = expect_creator(convert_closure, expect_base, conversion_table)
+ return function(exception_table, after_redo)
+ test_expect(exception_table, after_redo)
+ if selection_string then
+ eq(getreg('"'), selection_string)
+ else
+ eq(getreg('"'), 'test_string"')
+ end
+ end
+ end
+ run_test_variations(
+ create_test_defs(
+ normal_command_defs,
+ base_map,
+ create_p_action,
+ test_string,
+ expect_normal_creator
+ ),
+ extra_setup
+ )
+ end -- run_normal_mode_tests()
+
+ local function convert_linewiseer(expect_base, conversion_table)
+ return expect_creator(convert_linewise, expect_base, conversion_table)
+ end
+
+ local function run_linewise_tests(expect_base, base_command, extra_setup)
+ local linewise_test_defs = create_test_defs(
+ ex_command_defs, base_command,
+ create_put_action, expect_base, convert_linewiseer)
+ run_test_variations(linewise_test_defs, extra_setup)
+ end -- run_linewise_tests()
+ -- }}}
+
+ -- Actual tests
+ describe('default pasting', function()
+ local expect_string = [[
+ Ltest_stringx"ine of words 1
+ Line of words 2]]
+ run_normal_mode_tests(expect_string, 'p')
+
+ run_linewise_tests([[
+ Line of words 1
+ xtest_string"
+ Line of words 2]],
+ 'put'
+ )
+ end)
+
+ describe('linewise register', function()
+ -- put with 'p'
+ local local_ex_command_defs = non_dotdefs(normal_command_defs)
+ local base_expect_string = [[
+ Line of words 1
+ xtest_stringa
+ Line of words 2]]
+ local function local_convert_linewise(expect_base, conversion_table)
+ return convert_linewise(expect_base, conversion_table, nil, true)
+ end
+ local function expect_lineput(expect_base, conversion_table)
+ return expect_creator(local_convert_linewise, expect_base, conversion_table)
+ end
+ run_test_variations(
+ create_test_defs(
+ local_ex_command_defs,
+ '"ap',
+ create_p_action,
+ base_expect_string,
+ expect_lineput
+ )
+ )
+
+ -- put with :put
+ local linewise_put_defs = non_dotdefs(ex_command_defs)
+ base_expect_string = [[
+ Line of words 1
+ xtest_stringa
+ Line of words 2]]
+ run_test_variations(
+ create_test_defs(
+ linewise_put_defs,
+ 'put a', create_put_action,
+ base_expect_string, convert_linewiseer
+ )
+ )
+
+ end)
+
+ describe('blockwise register', function()
+ local blockwise_put_defs = non_dotdefs(normal_command_defs)
+ local test_base = [[
+ Lxtest_stringbine of words 1
+ Ltest_stringbine of words 2
+ test_stringb]]
+
+ local function expect_block_creator(expect_base, conversion_table)
+ return expect_creator(function(e,c) return convert_blockwise(e,c,nil,true) end,
+ expect_base, conversion_table)
+ end
+
+ run_test_variations(
+ create_test_defs(
+ blockwise_put_defs,
+ '"bp',
+ create_p_action,
+ test_base,
+ expect_block_creator
+ )
+ )
+ end)
+
+ it('adds correct indentation when put with [p and ]p', function()
+ feed('G>>"a]pix<esc>')
+ -- luacheck: ignore
+ expect([[
+ Line of words 1
+ Line of words 2
+ xtest_stringa]])
+ feed('uu"a[pix<esc>')
+ -- luacheck: ignore
+ expect([[
+ Line of words 1
+ xtest_stringa
+ Line of words 2]])
+ end)
+
+ describe('linewise paste with autoindent', function()
+ -- luacheck: ignore
+ run_linewise_tests([[
+ Line of words 1
+ Line of words 2
+ xtest_string"]],
+ 'put'
+ ,
+ function()
+ funcs.setline('$', ' Line of words 2')
+ -- Set curswant to '8' to be at the end of the tab character
+ -- This is where the cursor is put back after the 'u' command.
+ funcs.setpos('.', {0, 2, 1, 0, 8})
+ feed_command('set autoindent')
+ end
+ )
+ end)
+
+ describe('put inside tabs with virtualedit', function()
+ local test_string = [[
+ Line of words 1
+ test_stringx" Line of words 2]]
+ run_normal_mode_tests(test_string, 'p', function()
+ funcs.setline('$', ' Line of words 2')
+ feed_command('set virtualedit=all')
+ funcs.setpos('.', {0, 2, 1, 2, 3})
+ end)
+ end)
+
+ describe('put after the line with virtualedit', function()
+ local test_string = [[
+ Line of words 1 test_stringx"
+ Line of words 2]]
+ run_normal_mode_tests(test_string, 'p', function()
+ funcs.setline('$', ' Line of words 2')
+ feed_command('set virtualedit=all')
+ funcs.setpos('.', {0, 1, 16, 1, 17})
+ end, true)
+ end)
+
+ describe('Visual put', function()
+ describe('basic put', function()
+ local test_string = [[
+ test_stringx" words 1
+ Line of words 2]]
+ run_normal_mode_tests(test_string, 'v2ep', nil, nil, 'Line of')
+ end)
+ describe('over trailing newline', function()
+ local test_string = 'Line of test_stringx"Line of words 2'
+ run_normal_mode_tests(test_string, 'v$p', function()
+ funcs.setpos('.', {0, 1, 9, 0, 9})
+ end,
+ nil,
+ 'words 1\n')
+ end)
+ describe('linewise mode', function()
+ local test_string = [[
+ xtest_string"
+ Line of words 2]]
+ local function expect_vis_linewise(expect_base, conversion_table)
+ return expect_creator(function(e, c)
+ return convert_linewise(e, c, nil, nil)
+ end,
+ expect_base, conversion_table)
+ end
+ run_test_variations(
+ create_test_defs(
+ normal_command_defs,
+ 'Vp',
+ create_p_action,
+ test_string,
+ expect_vis_linewise
+ ),
+ function() funcs.setpos('.', {0, 1, 1, 0, 1}) end
+ )
+
+ describe('with whitespace at bol', function()
+ local function expect_vis_lineindented(expect_base, conversion_table)
+ local test_expect = expect_creator(function(e, c)
+ return convert_linewise(e, c, nil, nil, ' ')
+ end,
+ expect_base, conversion_table)
+ return function(exception_table, after_redo)
+ test_expect(exception_table, after_redo)
+ eq(getreg('"'), 'Line of words 1\n')
+ end
+ end
+ local base_expect_string = [[
+ xtest_string"
+ Line of words 2]]
+ run_test_variations(
+ create_test_defs(
+ normal_command_defs,
+ 'Vp',
+ create_p_action,
+ base_expect_string,
+ expect_vis_lineindented
+ ),
+ function()
+ feed('i test_string.<esc>u')
+ funcs.setreg('"', ' test_string"', 'v')
+ end
+ )
+ end)
+
+ end)
+
+ describe('blockwise visual mode', function()
+ local test_base = [[
+ test_stringx"e of words 1
+ test_string"e of words 2]]
+
+ local function expect_block_creator(expect_base, conversion_table)
+ local test_expect = expect_creator(function(e, c)
+ return convert_blockwise(e, c, true)
+ end, expect_base, conversion_table)
+ return function(e,c)
+ test_expect(e,c)
+ eq(getreg('"'), 'Lin\nLin')
+ end
+ end
+
+ local select_down_test_defs = create_test_defs(
+ normal_command_defs,
+ '<C-v>jllp',
+ create_p_action,
+ test_base,
+ expect_block_creator
+ )
+ run_test_variations(select_down_test_defs)
+
+
+ -- Undo and redo of a visual block put leave the cursor in the top
+ -- left of the visual block area no matter where the cursor was
+ -- when it started.
+ local undo_redo_no = map(function(table)
+ local rettab = copy_def(table)
+ if not rettab[4] then
+ rettab[4] = {}
+ end
+ rettab[4].undo_position = true
+ rettab[4].redo_position = true
+ return rettab
+ end,
+ normal_command_defs)
+
+ -- Selection direction doesn't matter
+ run_test_variations(
+ create_test_defs(
+ undo_redo_no,
+ '<C-v>kllp',
+ create_p_action,
+ test_base,
+ expect_block_creator
+ ),
+ function() funcs.setpos('.', {0, 2, 1, 0, 1}) end
+ )
+
+ describe('blockwise cursor after undo', function()
+ -- A bit of a hack of the reset above.
+ -- In the tests that selection direction doesn't matter, we
+ -- don't check the undo/redo position because it doesn't fit
+ -- the same pattern as everything else.
+ -- Here we fix this by directly checking the undo/redo position
+ -- in the test_assertions of our test definitions.
+ local function assertion_creator(_,_)
+ return function(_,_)
+ feed('u')
+ -- Have to use feed('u') here to set curswant, because
+ -- ex_undo() doesn't do that.
+ eq(funcs.getcurpos(), {0, 1, 1, 0, 1})
+ feed('<C-r>')
+ eq(funcs.getcurpos(), {0, 1, 1, 0, 1})
+ end
+ end
+
+ run_test_variations(
+ create_test_defs(
+ undo_redo_no,
+ '<C-v>kllp',
+ create_p_action,
+ test_base,
+ assertion_creator
+ ),
+ function() funcs.setpos('.', {0, 2, 1, 0, 1}) end
+ )
+ end)
+ end)
+
+
+ describe("with 'virtualedit'", function()
+ describe('splitting a tab character', function()
+ local base_expect_string = [[
+ Line of words 1
+ test_stringx" Line of words 2]]
+ run_normal_mode_tests(
+ base_expect_string,
+ 'vp',
+ function()
+ funcs.setline('$', ' Line of words 2')
+ feed_command('set virtualedit=all')
+ funcs.setpos('.', {0, 2, 1, 2, 3})
+ end,
+ nil,
+ ' '
+ )
+ end)
+ describe('after end of line', function()
+ local base_expect_string = [[
+ Line of words 1 test_stringx"
+ Line of words 2]]
+ run_normal_mode_tests(
+ base_expect_string,
+ 'vp',
+ function()
+ feed_command('set virtualedit=all')
+ funcs.setpos('.', {0, 1, 16, 2, 18})
+ end,
+ true,
+ ' '
+ )
+ end)
+ end)
+ end)
+
+ describe('. register special tests', function()
+ before_each(reset)
+ it('applies control character actions', function()
+ feed('i<C-t><esc>u')
+ expect([[
+ Line of words 1
+ Line of words 2]])
+ feed('".p')
+ expect([[
+ Line of words 1
+ Line of words 2]])
+ feed('u1go<C-v>j".p')
+ eq([[
+ ine of words 1
+ ine of words 2]], curbuf_contents())
+ end)
+
+ local function bell_test(actions, should_ring)
+ local screen = Screen.new()
+ screen:attach()
+ if should_ring then
+ -- check bell is not set by nvim before the action
+ screen:sleep(50)
+ end
+ helpers.ok(not screen.bell and not screen.visualbell)
+ actions()
+ screen:expect{condition=function()
+ if should_ring then
+ if not screen.bell and not screen.visualbell then
+ error('Bell was not rung after action')
+ end
+ else
+ if screen.bell or screen.visualbell then
+ error('Bell was rung after action')
+ end
+ end
+ end, unchanged=(not should_ring)}
+ screen:detach()
+ end
+
+ it('should not ring the bell with gp at end of line', function()
+ bell_test(function() feed('$".gp') end)
+
+ -- Even if the last character is a multibyte character.
+ reset()
+ funcs.setline(1, 'helloเธก')
+ bell_test(function() feed('$".gp') end)
+ end)
+
+ it('should not ring the bell with gp and end of file', function()
+ funcs.setpos('.', {0, 2, 1, 0})
+ bell_test(function() feed('$vl".gp') end)
+ end)
+
+ it('should ring the bell when deleting if not appropriate', function()
+ feed_command('goto 2')
+ feed('i<bs><esc>')
+ expect([[
+ ine of words 1
+ Line of words 2]])
+ bell_test(function() feed('".P') end, true)
+ end)
+
+ it('should restore cursor position after undo of ".p', function()
+ local origpos = funcs.getcurpos()
+ feed('".pu')
+ eq(origpos, funcs.getcurpos())
+ end)
+
+ it("should be unaffected by 'autoindent' with V\".2p", function()
+ feed_command('set autoindent')
+ feed('i test_string.<esc>u')
+ feed('V".2p')
+ expect([[
+ test_string.
+ test_string.
+ Line of words 2]])
+ end)
+ end)
+end)
+
diff --git a/test/functional/normal/undo_spec.lua b/test/functional/normal/undo_spec.lua
new file mode 100644
index 0000000000..a023ca3d90
--- /dev/null
+++ b/test/functional/normal/undo_spec.lua
@@ -0,0 +1,61 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local clear = helpers.clear
+local command = helpers.command
+local expect = helpers.expect
+local feed = helpers.feed
+local insert = helpers.insert
+
+describe('u CTRL-R g- g+', function()
+ before_each(clear)
+
+ local function create_history(num_steps)
+ if num_steps == 0 then return end
+ insert('1')
+ if num_steps == 1 then return end
+ feed('o2<esc>')
+ feed('o3<esc>')
+ feed('u')
+ if num_steps == 2 then return end
+ feed('o4<esc>')
+ if num_steps == 3 then return end
+ feed('u')
+ end
+
+ local function undo_and_redo(hist_pos, undo, redo, expect_str)
+ command('enew!')
+ create_history(hist_pos)
+ local cur_contents = helpers.curbuf_contents()
+ feed(undo)
+ expect(expect_str)
+ feed(redo)
+ expect(cur_contents)
+ end
+
+ -- TODO Look for message saying 'Already at oldest change'
+ it('does nothing when no changes have happened', function()
+ undo_and_redo(0, 'u', '<C-r>', '')
+ undo_and_redo(0, 'g-', 'g+', '')
+ end)
+ it('undoes a change when at a leaf', function()
+ undo_and_redo(1, 'u', '<C-r>', '')
+ undo_and_redo(1, 'g-', 'g+', '')
+ end)
+ it('undoes a change when in a non-leaf', function()
+ undo_and_redo(2, 'u', '<C-r>', '1')
+ undo_and_redo(2, 'g-', 'g+', '1')
+ end)
+ it('undoes properly around a branch point', function()
+ undo_and_redo(3, 'u', '<C-r>', [[
+ 1
+ 2]])
+ undo_and_redo(3, 'g-', 'g+', [[
+ 1
+ 2
+ 3]])
+ end)
+ it('can find the previous sequence after undoing to a branch', function()
+ undo_and_redo(4, 'u', '<C-r>', '1')
+ undo_and_redo(4, 'g-', 'g+', '1')
+ end)
+end)
diff --git a/test/functional/options/autochdir_spec.lua b/test/functional/options/autochdir_spec.lua
index 0e293761ad..2fce0a5ed9 100644
--- a/test/functional/options/autochdir_spec.lua
+++ b/test/functional/options/autochdir_spec.lua
@@ -10,9 +10,10 @@ describe("'autochdir'", function()
-- By default 'autochdir' is off, thus getcwd() returns the repo root.
clear(targetdir..'/tty-test.c')
local rootdir = getcwd()
+ local expected = rootdir .. '/' .. targetdir
-- With 'autochdir' on, we should get the directory of tty-test.c.
clear('--cmd', 'set autochdir', targetdir..'/tty-test.c')
- eq(rootdir..'/'..targetdir, getcwd())
+ eq(helpers.iswin() and expected:gsub('/', '\\') or expected, getcwd())
end)
end)
diff --git a/test/functional/options/defaults_spec.lua b/test/functional/options/defaults_spec.lua
index a36939b0bd..f6f3f02f45 100644
--- a/test/functional/options/defaults_spec.lua
+++ b/test/functional/options/defaults_spec.lua
@@ -1,80 +1,712 @@
local helpers = require('test.functional.helpers')(after_each)
+
local Screen = require('test.functional.ui.screen')
-local eval, eq = helpers.eval, helpers.eq
-local execute = helpers.execute
-
-local function init_session(...)
- local args = { helpers.nvim_prog, '-i', 'NONE', '--embed',
- '--cmd', 'set shortmess+=I background=light noswapfile noautoindent',
- '--cmd', 'set laststatus=1 undodir=. directory=. viewdir=. backupdir=.'
- }
- for _, v in ipairs({...}) do
- table.insert(args, v)
- end
- helpers.set_session(helpers.spawn(args))
-end
+
+local meths = helpers.meths
+local command = helpers.command
+local clear = helpers.clear
+local exc_exec = helpers.exc_exec
+local eval = helpers.eval
+local eq = helpers.eq
+local funcs = helpers.funcs
+local insert = helpers.insert
+local iswin = helpers.iswin
+local neq = helpers.neq
+local mkdir = helpers.mkdir
+local rmdir = helpers.rmdir
+local alter_slashes = helpers.alter_slashes
describe('startup defaults', function()
describe(':filetype', function()
local function expect_filetype(expected)
- local screen = Screen.new(48, 4)
+ local screen = Screen.new(50, 4)
screen:attach()
- execute('filetype')
+ command('filetype')
screen:expect([[
- ^ |
- ~ |
- ~ |
+ ^ |
+ ~ |
+ ~ |
]]..expected
)
end
- it('enabled by `-u NORC`', function()
- init_session('-u', 'NORC')
+ it('all ON after `-u NORC`', function()
+ clear('-u', 'NORC')
expect_filetype(
- 'filetype detection:ON plugin:ON indent:ON |')
+ 'filetype detection:ON plugin:ON indent:ON |')
end)
- it('disabled by `-u NONE`', function()
- init_session('-u', 'NONE')
+ it('all ON after `:syntax โ€ฆ` #7765', function()
+ clear('-u', 'NORC', '--cmd', 'syntax on')
expect_filetype(
- 'filetype detection:OFF plugin:OFF indent:OFF |')
+ 'filetype detection:ON plugin:ON indent:ON |')
+ clear('-u', 'NORC', '--cmd', 'syntax off')
+ expect_filetype(
+ 'filetype detection:ON plugin:ON indent:ON |')
end)
- it('overridden by early `filetype on`', function()
- init_session('-u', 'NORC', '--cmd', 'filetype on')
+ it('all OFF after `-u NONE`', function()
+ clear('-u', 'NONE')
expect_filetype(
- 'filetype detection:ON plugin:OFF indent:OFF |')
+ 'filetype detection:OFF plugin:OFF indent:OFF |')
end)
- it('overridden by early `filetype plugin on`', function()
- init_session('-u', 'NORC', '--cmd', 'filetype plugin on')
+ it('explicit OFF stays OFF', function()
+ clear('-u', 'NORC', '--cmd',
+ 'syntax off | filetype off | filetype plugin indent off')
+ expect_filetype(
+ 'filetype detection:OFF plugin:OFF indent:OFF |')
+ clear('-u', 'NORC', '--cmd', 'syntax off | filetype plugin indent off')
+ expect_filetype(
+ 'filetype detection:ON plugin:OFF indent:OFF |')
+ clear('-u', 'NORC', '--cmd', 'filetype indent off')
+ expect_filetype(
+ 'filetype detection:ON plugin:ON indent:OFF |')
+ clear('-u', 'NORC', '--cmd', 'syntax off | filetype off')
expect_filetype(
- 'filetype detection:ON plugin:ON indent:OFF |')
+ 'filetype detection:OFF plugin:(on) indent:(on) |')
+ -- Swap the order.
+ clear('-u', 'NORC', '--cmd', 'filetype off | syntax off')
+ expect_filetype(
+ 'filetype detection:OFF plugin:(on) indent:(on) |')
end)
- it('overridden by early `filetype indent on`', function()
- init_session('-u', 'NORC', '--cmd', 'filetype indent on')
+ it('all ON after early `:filetype โ€ฆ on`', function()
+ -- `:filetype โ€ฆ on` should not change the defaults. #7765
+ -- Only an explicit `:filetype โ€ฆ off` sets OFF.
+
+ clear('-u', 'NORC', '--cmd', 'filetype on')
+ expect_filetype(
+ 'filetype detection:ON plugin:ON indent:ON |')
+ clear('-u', 'NORC', '--cmd', 'filetype plugin on')
+ expect_filetype(
+ 'filetype detection:ON plugin:ON indent:ON |')
+ clear('-u', 'NORC', '--cmd', 'filetype indent on')
expect_filetype(
- 'filetype detection:ON plugin:OFF indent:ON |')
+ 'filetype detection:ON plugin:ON indent:ON |')
+ end)
+
+ it('late `:filetype โ€ฆ off` stays OFF', function()
+ clear('-u', 'NORC', '-c', 'filetype off')
+ expect_filetype(
+ 'filetype detection:OFF plugin:(on) indent:(on) |')
+ clear('-u', 'NORC', '-c', 'filetype plugin off')
+ expect_filetype(
+ 'filetype detection:ON plugin:OFF indent:ON |')
+ clear('-u', 'NORC', '-c', 'filetype indent off')
+ expect_filetype(
+ 'filetype detection:ON plugin:ON indent:OFF |')
end)
end)
describe('syntax', function()
it('enabled by `-u NORC`', function()
- init_session('-u', 'NORC')
+ clear('-u', 'NORC')
eq(1, eval('g:syntax_on'))
end)
it('disabled by `-u NONE`', function()
- init_session('-u', 'NONE')
+ clear('-u', 'NONE')
eq(0, eval('exists("g:syntax_on")'))
end)
- it('overridden by early `syntax off`', function()
- init_session('-u', 'NORC', '--cmd', 'syntax off')
+ it('`:syntax off` stays off', function()
+ -- early
+ clear('-u', 'NORC', '--cmd', 'syntax off')
eq(0, eval('exists("g:syntax_on")'))
+ -- late
+ clear('-u', 'NORC', '-c', 'syntax off')
+ eq(0, eval('exists("g:syntax_on")'))
+ end)
+
+ it('":if 0|syntax on|endif" does not affect default #8728', function()
+ clear('-u', 'NORC', '--cmd', ':if 0|syntax on|endif')
+ eq(1, eval('exists("g:syntax_on")'))
+ clear('-u', 'NORC', '--cmd', ':if 0|syntax off|endif')
+ eq(1, eval('exists("g:syntax_on")'))
+ end)
+ end)
+
+ describe("'fillchars'", function()
+ it('vert/fold flags', function()
+ clear()
+ local screen = Screen.new(50, 5)
+ screen:attach()
+ command('set laststatus=0')
+ insert([[
+ 1
+ 2
+ 3
+ 4]])
+ command('normal! ggjzfj')
+ command('vsp')
+ screen:expect([[
+ 1 โ”‚1 |
+ ^+-- 2 lines: 2ยทยทยทยทยทยทยทยทยทยทโ”‚+-- 2 lines: 2ยทยทยทยทยทยทยทยทยท|
+ 4 โ”‚4 |
+ ~ โ”‚~ |
+ |
+ ]])
+
+ -- ambiwidth=double defaults to single-byte fillchars.
+ command('set ambiwidth=double')
+ screen:expect([[
+ 1 |1 |
+ ^+-- 2 lines: 2----------|+-- 2 lines: 2---------|
+ 4 |4 |
+ ~ |~ |
+ |
+ ]])
+ end)
+ end)
+
+ describe("'packpath'", function()
+ it('defaults to &runtimepath', function()
+ eq(meths.get_option('runtimepath'), meths.get_option('packpath'))
+ end)
+
+ it('does not follow modifications to runtimepath', function()
+ meths.command('set runtimepath+=foo')
+ neq(meths.get_option('runtimepath'), meths.get_option('packpath'))
+ meths.command('set packpath+=foo')
+ eq(meths.get_option('runtimepath'), meths.get_option('packpath'))
+ end)
+ end)
+
+ it('v:progpath is set to the absolute path', function()
+ eq(eval("fnamemodify(v:progpath, ':p')"), eval('v:progpath'))
+ end)
+
+ describe('$NVIM_LOG_FILE', function()
+ local datasubdir = iswin() and 'nvim-data' or 'nvim'
+ local xdgdir = 'Xtest-startup-xdg-logpath'
+ local xdgdatadir = xdgdir..'/'..datasubdir
+ after_each(function()
+ os.remove('Xtest-logpath')
+ rmdir(xdgdir)
+ end)
+
+ it('is used if expansion succeeds', function()
+ clear({env={
+ NVIM_LOG_FILE='Xtest-logpath',
+ }})
+ eq('Xtest-logpath', eval('$NVIM_LOG_FILE'))
+ end)
+ it('defaults to stdpath("data")/log if empty', function()
+ eq(true, mkdir(xdgdir) and mkdir(xdgdatadir))
+ clear({env={
+ XDG_DATA_HOME=xdgdir,
+ NVIM_LOG_FILE='', -- Empty is invalid.
+ }})
+ -- server_start() calls ELOG, which tickles log_path_init().
+ pcall(command, 'call serverstart(serverlist()[0])')
+
+ eq(xdgdir..'/'..datasubdir..'/log', string.gsub(eval('$NVIM_LOG_FILE'), '\\', '/'))
+ end)
+ it('defaults to stdpath("data")/log if invalid', function()
+ eq(true, mkdir(xdgdir) and mkdir(xdgdatadir))
+ clear({env={
+ XDG_DATA_HOME=xdgdir,
+ NVIM_LOG_FILE='.', -- Any directory is invalid.
+ }})
+ -- server_start() calls ELOG, which tickles log_path_init().
+ pcall(command, 'call serverstart(serverlist()[0])')
+
+ eq(xdgdir..'/'..datasubdir..'/log', string.gsub(eval('$NVIM_LOG_FILE'), '\\', '/'))
+ end)
+ it('defaults to .nvimlog if stdpath("data") is invalid', function()
+ clear({env={
+ XDG_DATA_HOME='Xtest-missing-xdg-dir',
+ NVIM_LOG_FILE='.', -- Any directory is invalid.
+ }})
+ -- server_start() calls ELOG, which tickles log_path_init().
+ pcall(command, 'call serverstart(serverlist()[0])')
+
+ eq('.nvimlog', eval('$NVIM_LOG_FILE'))
+ end)
+ end)
+end)
+
+describe('XDG-based defaults', function()
+ -- Need separate describe() blocks to not run clear() twice.
+ -- Do not put before_each() here for the same reasons.
+
+ describe('with empty/broken environment', function()
+ it('sets correct defaults', function()
+ clear({env={
+ XDG_CONFIG_HOME=nil,
+ XDG_DATA_HOME=nil,
+ XDG_CACHE_HOME=nil,
+ XDG_RUNTIME_DIR=nil,
+ XDG_CONFIG_DIRS=nil,
+ XDG_DATA_DIRS=nil,
+ LOCALAPPDATA=nil,
+ HOMEPATH=nil,
+ HOMEDRIVE=nil,
+ HOME=nil,
+ TEMP=nil,
+ VIMRUNTIME=nil,
+ USER=nil,
+ }})
+
+ eq('.', meths.get_option('backupdir'))
+ eq('.', meths.get_option('viewdir'))
+ eq('.', meths.get_option('directory'))
+ eq('.', meths.get_option('undodir'))
+ end)
+ end)
+
+ -- TODO(jkeyes): tests below fail on win32 because of path separator.
+ if helpers.pending_win32(pending) then return end
+
+ describe('with too long XDG variables', function()
+ before_each(function()
+ clear({env={
+ XDG_CONFIG_HOME=('/x'):rep(4096),
+ XDG_CONFIG_DIRS=(('/a'):rep(2048)
+ .. ':' .. ('/b'):rep(2048)
+ .. (':/c'):rep(512)),
+ XDG_DATA_HOME=('/X'):rep(4096),
+ XDG_DATA_DIRS=(('/A'):rep(2048)
+ .. ':' .. ('/B'):rep(2048)
+ .. (':/C'):rep(512)),
+ }})
+ end)
+
+ it('are correctly set', function()
+ eq((('/x'):rep(4096) .. '/nvim'
+ .. ',' .. ('/a'):rep(2048) .. '/nvim'
+ .. ',' .. ('/b'):rep(2048) .. '/nvim'
+ .. (',' .. '/c/nvim'):rep(512)
+ .. ',' .. ('/X'):rep(4096) .. '/nvim/site'
+ .. ',' .. ('/A'):rep(2048) .. '/nvim/site'
+ .. ',' .. ('/B'):rep(2048) .. '/nvim/site'
+ .. (',' .. '/C/nvim/site'):rep(512)
+ .. ',' .. eval('$VIMRUNTIME')
+ .. (',' .. '/C/nvim/site/after'):rep(512)
+ .. ',' .. ('/B'):rep(2048) .. '/nvim/site/after'
+ .. ',' .. ('/A'):rep(2048) .. '/nvim/site/after'
+ .. ',' .. ('/X'):rep(4096) .. '/nvim/site/after'
+ .. (',' .. '/c/nvim/after'):rep(512)
+ .. ',' .. ('/b'):rep(2048) .. '/nvim/after'
+ .. ',' .. ('/a'):rep(2048) .. '/nvim/after'
+ .. ',' .. ('/x'):rep(4096) .. '/nvim/after'
+ ), meths.get_option('runtimepath'))
+ meths.command('set runtimepath&')
+ meths.command('set backupdir&')
+ meths.command('set directory&')
+ meths.command('set undodir&')
+ meths.command('set viewdir&')
+ eq((('/x'):rep(4096) .. '/nvim'
+ .. ',' .. ('/a'):rep(2048) .. '/nvim'
+ .. ',' .. ('/b'):rep(2048) .. '/nvim'
+ .. (',' .. '/c/nvim'):rep(512)
+ .. ',' .. ('/X'):rep(4096) .. '/nvim/site'
+ .. ',' .. ('/A'):rep(2048) .. '/nvim/site'
+ .. ',' .. ('/B'):rep(2048) .. '/nvim/site'
+ .. (',' .. '/C/nvim/site'):rep(512)
+ .. ',' .. eval('$VIMRUNTIME')
+ .. (',' .. '/C/nvim/site/after'):rep(512)
+ .. ',' .. ('/B'):rep(2048) .. '/nvim/site/after'
+ .. ',' .. ('/A'):rep(2048) .. '/nvim/site/after'
+ .. ',' .. ('/X'):rep(4096) .. '/nvim/site/after'
+ .. (',' .. '/c/nvim/after'):rep(512)
+ .. ',' .. ('/b'):rep(2048) .. '/nvim/after'
+ .. ',' .. ('/a'):rep(2048) .. '/nvim/after'
+ .. ',' .. ('/x'):rep(4096) .. '/nvim/after'
+ ), meths.get_option('runtimepath'))
+ eq('.,' .. ('/X'):rep(4096) .. '/nvim/backup',
+ meths.get_option('backupdir'))
+ eq(('/X'):rep(4096) .. '/nvim/swap//', meths.get_option('directory'))
+ eq(('/X'):rep(4096) .. '/nvim/undo', meths.get_option('undodir'))
+ eq(('/X'):rep(4096) .. '/nvim/view', meths.get_option('viewdir'))
+ end)
+ end)
+
+ describe('with XDG variables that can be expanded', function()
+ before_each(function()
+ clear({env={
+ XDG_CONFIG_HOME='$XDG_DATA_HOME',
+ XDG_CONFIG_DIRS='$XDG_DATA_DIRS',
+ XDG_DATA_HOME='$XDG_CONFIG_HOME',
+ XDG_DATA_DIRS='$XDG_CONFIG_DIRS',
+ }})
+ end)
+
+ it('are not expanded', function()
+ eq(('$XDG_DATA_HOME/nvim'
+ .. ',$XDG_DATA_DIRS/nvim'
+ .. ',$XDG_CONFIG_HOME/nvim/site'
+ .. ',$XDG_CONFIG_DIRS/nvim/site'
+ .. ',' .. eval('$VIMRUNTIME')
+ .. ',$XDG_CONFIG_DIRS/nvim/site/after'
+ .. ',$XDG_CONFIG_HOME/nvim/site/after'
+ .. ',$XDG_DATA_DIRS/nvim/after'
+ .. ',$XDG_DATA_HOME/nvim/after'
+ ), meths.get_option('runtimepath'))
+ meths.command('set runtimepath&')
+ meths.command('set backupdir&')
+ meths.command('set directory&')
+ meths.command('set undodir&')
+ meths.command('set viewdir&')
+ eq(('$XDG_DATA_HOME/nvim'
+ .. ',$XDG_DATA_DIRS/nvim'
+ .. ',$XDG_CONFIG_HOME/nvim/site'
+ .. ',$XDG_CONFIG_DIRS/nvim/site'
+ .. ',' .. eval('$VIMRUNTIME')
+ .. ',$XDG_CONFIG_DIRS/nvim/site/after'
+ .. ',$XDG_CONFIG_HOME/nvim/site/after'
+ .. ',$XDG_DATA_DIRS/nvim/after'
+ .. ',$XDG_DATA_HOME/nvim/after'
+ ), meths.get_option('runtimepath'))
+ eq('.,$XDG_CONFIG_HOME/nvim/backup', meths.get_option('backupdir'))
+ eq('$XDG_CONFIG_HOME/nvim/swap//', meths.get_option('directory'))
+ eq('$XDG_CONFIG_HOME/nvim/undo', meths.get_option('undodir'))
+ eq('$XDG_CONFIG_HOME/nvim/view', meths.get_option('viewdir'))
+ meths.command('set all&')
+ eq(('$XDG_DATA_HOME/nvim'
+ .. ',$XDG_DATA_DIRS/nvim'
+ .. ',$XDG_CONFIG_HOME/nvim/site'
+ .. ',$XDG_CONFIG_DIRS/nvim/site'
+ .. ',' .. eval('$VIMRUNTIME')
+ .. ',$XDG_CONFIG_DIRS/nvim/site/after'
+ .. ',$XDG_CONFIG_HOME/nvim/site/after'
+ .. ',$XDG_DATA_DIRS/nvim/after'
+ .. ',$XDG_DATA_HOME/nvim/after'
+ ), meths.get_option('runtimepath'))
+ eq('.,$XDG_CONFIG_HOME/nvim/backup', meths.get_option('backupdir'))
+ eq('$XDG_CONFIG_HOME/nvim/swap//', meths.get_option('directory'))
+ eq('$XDG_CONFIG_HOME/nvim/undo', meths.get_option('undodir'))
+ eq('$XDG_CONFIG_HOME/nvim/view', meths.get_option('viewdir'))
+ end)
+ end)
+
+ describe('with commas', function()
+ before_each(function()
+ clear({env={
+ XDG_CONFIG_HOME=', , ,',
+ XDG_CONFIG_DIRS=',-,-,:-,-,-',
+ XDG_DATA_HOME=',=,=,',
+ XDG_DATA_DIRS=',โ‰ก,โ‰ก,:โ‰ก,โ‰ก,โ‰ก',
+ }})
+ end)
+
+ it('are escaped properly', function()
+ eq(('\\, \\, \\,/nvim'
+ .. ',\\,-\\,-\\,/nvim'
+ .. ',-\\,-\\,-/nvim'
+ .. ',\\,=\\,=\\,/nvim/site'
+ .. ',\\,โ‰ก\\,โ‰ก\\,/nvim/site'
+ .. ',โ‰ก\\,โ‰ก\\,โ‰ก/nvim/site'
+ .. ',' .. eval('$VIMRUNTIME')
+ .. ',โ‰ก\\,โ‰ก\\,โ‰ก/nvim/site/after'
+ .. ',\\,โ‰ก\\,โ‰ก\\,/nvim/site/after'
+ .. ',\\,=\\,=\\,/nvim/site/after'
+ .. ',-\\,-\\,-/nvim/after'
+ .. ',\\,-\\,-\\,/nvim/after'
+ .. ',\\, \\, \\,/nvim/after'
+ ), meths.get_option('runtimepath'))
+ meths.command('set runtimepath&')
+ meths.command('set backupdir&')
+ meths.command('set directory&')
+ meths.command('set undodir&')
+ meths.command('set viewdir&')
+ eq(('\\, \\, \\,/nvim'
+ .. ',\\,-\\,-\\,/nvim'
+ .. ',-\\,-\\,-/nvim'
+ .. ',\\,=\\,=\\,/nvim/site'
+ .. ',\\,โ‰ก\\,โ‰ก\\,/nvim/site'
+ .. ',โ‰ก\\,โ‰ก\\,โ‰ก/nvim/site'
+ .. ',' .. eval('$VIMRUNTIME')
+ .. ',โ‰ก\\,โ‰ก\\,โ‰ก/nvim/site/after'
+ .. ',\\,โ‰ก\\,โ‰ก\\,/nvim/site/after'
+ .. ',\\,=\\,=\\,/nvim/site/after'
+ .. ',-\\,-\\,-/nvim/after'
+ .. ',\\,-\\,-\\,/nvim/after'
+ .. ',\\, \\, \\,/nvim/after'
+ ), meths.get_option('runtimepath'))
+ eq('.,\\,=\\,=\\,/nvim/backup', meths.get_option('backupdir'))
+ eq('\\,=\\,=\\,/nvim/swap//', meths.get_option('directory'))
+ eq('\\,=\\,=\\,/nvim/undo', meths.get_option('undodir'))
+ eq('\\,=\\,=\\,/nvim/view', meths.get_option('viewdir'))
end)
end)
end)
+describe('stdpath()', function()
+ -- Windows appends 'nvim-data' instead of just 'nvim' to prevent collisions
+ -- due to XDG_CONFIG_HOME and XDG_DATA_HOME being the same.
+ local datadir = iswin() and 'nvim-data' or 'nvim'
+
+ it('acceptance', function()
+ clear() -- Do not explicitly set any env vars.
+
+ eq('nvim', funcs.fnamemodify(funcs.stdpath('cache'), ':t'))
+ eq('nvim', funcs.fnamemodify(funcs.stdpath('config'), ':t'))
+ eq(datadir, funcs.fnamemodify(funcs.stdpath('data'), ':t'))
+ eq('table', type(funcs.stdpath('config_dirs')))
+ eq('table', type(funcs.stdpath('data_dirs')))
+ -- Check for crash. #8393
+ eq(2, eval('1+1'))
+ end)
+
+ context('returns a String', function()
+
+ describe('with "config"' , function ()
+ it('knows XDG_CONFIG_HOME', function()
+ clear({env={
+ XDG_CONFIG_HOME=alter_slashes('/home/docwhat/.config'),
+ }})
+ eq(alter_slashes('/home/docwhat/.config/nvim'), funcs.stdpath('config'))
+ end)
+
+ it('handles changes during runtime', function()
+ clear({env={
+ XDG_CONFIG_HOME=alter_slashes('/home/original'),
+ }})
+ eq(alter_slashes('/home/original/nvim'), funcs.stdpath('config'))
+ command("let $XDG_CONFIG_HOME='"..alter_slashes('/home/new').."'")
+ eq(alter_slashes('/home/new/nvim'), funcs.stdpath('config'))
+ end)
+
+ it("doesn't expand $VARIABLES", function()
+ clear({env={
+ XDG_CONFIG_HOME='$VARIABLES',
+ VARIABLES='this-should-not-happen',
+ }})
+ eq(alter_slashes('$VARIABLES/nvim'), funcs.stdpath('config'))
+ end)
+
+ it("doesn't expand ~/", function()
+ clear({env={
+ XDG_CONFIG_HOME=alter_slashes('~/frobnitz'),
+ }})
+ eq(alter_slashes('~/frobnitz/nvim'), funcs.stdpath('config'))
+ end)
+ end)
+
+ describe('with "data"' , function ()
+ it('knows XDG_DATA_HOME', function()
+ clear({env={
+ XDG_DATA_HOME=alter_slashes('/home/docwhat/.local'),
+ }})
+ eq(alter_slashes('/home/docwhat/.local/'..datadir), funcs.stdpath('data'))
+ end)
+
+ it('handles changes during runtime', function()
+ clear({env={
+ XDG_DATA_HOME=alter_slashes('/home/original'),
+ }})
+ eq(alter_slashes('/home/original/'..datadir), funcs.stdpath('data'))
+ command("let $XDG_DATA_HOME='"..alter_slashes('/home/new').."'")
+ eq(alter_slashes('/home/new/'..datadir), funcs.stdpath('data'))
+ end)
+
+ it("doesn't expand $VARIABLES", function()
+ clear({env={
+ XDG_DATA_HOME='$VARIABLES',
+ VARIABLES='this-should-not-happen',
+ }})
+ eq(alter_slashes('$VARIABLES/'..datadir), funcs.stdpath('data'))
+ end)
+
+ it("doesn't expand ~/", function()
+ clear({env={
+ XDG_DATA_HOME=alter_slashes('~/frobnitz'),
+ }})
+ eq(alter_slashes('~/frobnitz/'..datadir), funcs.stdpath('data'))
+ end)
+ end)
+
+ describe('with "cache"' , function ()
+ it('knows XDG_CACHE_HOME', function()
+ clear({env={
+ XDG_CACHE_HOME=alter_slashes('/home/docwhat/.cache'),
+ }})
+ eq(alter_slashes('/home/docwhat/.cache/nvim'), funcs.stdpath('cache'))
+ end)
+
+ it('handles changes during runtime', function()
+ clear({env={
+ XDG_CACHE_HOME=alter_slashes('/home/original'),
+ }})
+ eq(alter_slashes('/home/original/nvim'), funcs.stdpath('cache'))
+ command("let $XDG_CACHE_HOME='"..alter_slashes('/home/new').."'")
+ eq(alter_slashes('/home/new/nvim'), funcs.stdpath('cache'))
+ end)
+
+ it("doesn't expand $VARIABLES", function()
+ clear({env={
+ XDG_CACHE_HOME='$VARIABLES',
+ VARIABLES='this-should-not-happen',
+ }})
+ eq(alter_slashes('$VARIABLES/nvim'), funcs.stdpath('cache'))
+ end)
+
+ it("doesn't expand ~/", function()
+ clear({env={
+ XDG_CACHE_HOME=alter_slashes('~/frobnitz'),
+ }})
+ eq(alter_slashes('~/frobnitz/nvim'), funcs.stdpath('cache'))
+ end)
+ end)
+ end)
+
+ context('returns a List', function()
+ -- Some OS specific variables the system would have set.
+ local function base_env()
+ if iswin() then
+ return {
+ HOME='C:\\Users\\docwhat', -- technically, is not a usual PATH
+ HOMEDRIVE='C:',
+ HOMEPATH='\\Users\\docwhat',
+ LOCALAPPDATA='C:\\Users\\docwhat\\AppData\\Local',
+ TEMP='C:\\Users\\docwhat\\AppData\\Local\\Temp',
+ TMPDIR='C:\\Users\\docwhat\\AppData\\Local\\Temp',
+ TMP='C:\\Users\\docwhat\\AppData\\Local\\Temp',
+ }
+ else
+ return {
+ HOME='/home/docwhat',
+ HOMEDRIVE='HOMEDRIVE-should-be-ignored',
+ HOMEPATH='HOMEPATH-should-be-ignored',
+ LOCALAPPDATA='LOCALAPPDATA-should-be-ignored',
+ TEMP='TEMP-should-be-ignored',
+ TMPDIR='TMPDIR-should-be-ignored',
+ TMP='TMP-should-be-ignored',
+ }
+ end
+ end
+
+ local function set_paths_via_system(var_name, paths)
+ local env = base_env()
+ env[var_name] = table.concat(paths, ':')
+ clear({env=env})
+ end
+
+ local function set_paths_at_runtime(var_name, paths)
+ clear({env=base_env()})
+ meths.set_var('env_val', table.concat(paths, ':'))
+ command(('let $%s=g:env_val'):format(var_name))
+ end
+
+ local function behaves_like_dir_list_env(msg, stdpath_arg, env_var_name, paths, expected_paths)
+ describe(msg, function()
+ it('set via system', function()
+ set_paths_via_system(env_var_name, paths)
+ eq(expected_paths, funcs.stdpath(stdpath_arg))
+ end)
+
+ it('set at runtime', function()
+ set_paths_at_runtime(env_var_name, paths)
+ eq(expected_paths, funcs.stdpath(stdpath_arg))
+ end)
+ end)
+ end
+
+ describe('with "config_dirs"' , function ()
+ behaves_like_dir_list_env(
+ 'handles XDG_CONFIG_DIRS with one path',
+ 'config_dirs', 'XDG_CONFIG_DIRS',
+ {
+ alter_slashes('/home/docwhat/.config')
+ },
+ {
+ alter_slashes('/home/docwhat/.config/nvim')
+ })
+
+ behaves_like_dir_list_env(
+ 'handles XDG_CONFIG_DIRS with two paths',
+ 'config_dirs', 'XDG_CONFIG_DIRS',
+ {
+ alter_slashes('/home/docwhat/.config'),
+ alter_slashes('/etc/config')
+ },
+ {
+ alter_slashes('/home/docwhat/.config/nvim'),
+ alter_slashes('/etc/config/nvim')
+ })
+
+ behaves_like_dir_list_env(
+ "doesn't expand $VAR and $IBLES",
+ 'config_dirs', 'XDG_CONFIG_DIRS',
+ { '$HOME', '$TMP' },
+ {
+ alter_slashes('$HOME/nvim'),
+ alter_slashes('$TMP/nvim')
+ })
+
+
+ behaves_like_dir_list_env(
+ "doesn't expand ~/",
+ 'config_dirs', 'XDG_CONFIG_DIRS',
+ {
+ alter_slashes('~/.oldconfig'),
+ alter_slashes('~/.olderconfig')
+ },
+ {
+ alter_slashes('~/.oldconfig/nvim'),
+ alter_slashes('~/.olderconfig/nvim')
+ })
+ end)
+
+ describe('with "data_dirs"' , function ()
+ behaves_like_dir_list_env(
+ 'knows XDG_DATA_DIRS with one path',
+ 'data_dirs', 'XDG_DATA_DIRS',
+ {
+ alter_slashes('/home/docwhat/.data')
+ },
+ {
+ alter_slashes('/home/docwhat/.data/nvim')
+ })
+
+ behaves_like_dir_list_env(
+ 'knows XDG_DATA_DIRS with two paths',
+ 'data_dirs', 'XDG_DATA_DIRS',
+ {
+ alter_slashes('/home/docwhat/.data'),
+ alter_slashes('/etc/local')
+ },
+ {
+ alter_slashes('/home/docwhat/.data/nvim'),
+ alter_slashes('/etc/local/nvim'),
+ })
+
+ behaves_like_dir_list_env(
+ "doesn't expand $VAR and $IBLES",
+ 'data_dirs', 'XDG_DATA_DIRS',
+ { '$HOME', '$TMP' },
+ {
+ alter_slashes('$HOME/nvim'),
+ alter_slashes('$TMP/nvim')
+ })
+
+ behaves_like_dir_list_env(
+ "doesn't expand ~/",
+ 'data_dirs', 'XDG_DATA_DIRS',
+ {
+ alter_slashes('~/.oldconfig'),
+ alter_slashes('~/.olderconfig')
+ },
+ {
+ alter_slashes('~/.oldconfig/nvim'),
+ alter_slashes('~/.olderconfig/nvim'),
+ })
+ end)
+ end)
+
+ describe('errors', function()
+ it('on unknown strings', function()
+ eq('Vim(call):E6100: "capybara" is not a valid stdpath', exc_exec('call stdpath("capybara")'))
+ eq('Vim(call):E6100: "" is not a valid stdpath', exc_exec('call stdpath("")'))
+ eq('Vim(call):E6100: "23" is not a valid stdpath', exc_exec('call stdpath(23)'))
+ end)
+
+ it('on non-strings', function()
+ eq('Vim(call):E731: using Dictionary as a String', exc_exec('call stdpath({"eris": 23})'))
+ eq('Vim(call):E730: using List as a String', exc_exec('call stdpath([23])'))
+ end)
+ end)
+end)
diff --git a/test/functional/options/fillchars_spec.lua b/test/functional/options/fillchars_spec.lua
new file mode 100644
index 0000000000..99177a11b4
--- /dev/null
+++ b/test/functional/options/fillchars_spec.lua
@@ -0,0 +1,73 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+local clear, command = helpers.clear, helpers.command
+local eval = helpers.eval
+local eq = helpers.eq
+local exc_exec = helpers.exc_exec
+
+describe("'fillchars'", function()
+ local screen
+
+ before_each(function()
+ clear()
+ screen = Screen.new(25, 5)
+ screen:attach()
+ end)
+
+ after_each(function()
+ screen:detach()
+ end)
+
+ local function shouldfail(val,errval)
+ errval = errval or val
+ eq('Vim(set):E474: Invalid argument: fillchars='..errval,
+ exc_exec('set fillchars='..val))
+ end
+
+ describe('"eob" flag', function()
+ it("uses '~' by default", function()
+ eq('', eval('&fillchars'))
+ screen:expect([[
+ ^ |
+ ~ |
+ ~ |
+ ~ |
+ |
+ ]])
+ end)
+ it('supports whitespace', function()
+ screen:expect([[
+ ^ |
+ ~ |
+ ~ |
+ ~ |
+ |
+ ]])
+ command('set fillchars=eob:\\ ')
+ screen:expect([[
+ ^ |
+ |
+ |
+ |
+ |
+ ]])
+ end)
+ it('supports multibyte char', function()
+ command('set fillchars=eob:รฑ')
+ screen:expect([[
+ ^ |
+ รฑ |
+ รฑ |
+ รฑ |
+ |
+ ]])
+ end)
+ it('handles invalid values', function()
+ shouldfail('eob:') -- empty string
+ shouldfail('eob:้ฆฌ') -- doublewidth char
+ shouldfail('eob:รฅฬฒ') -- composing chars
+ shouldfail('eob:xy') -- two ascii chars
+ shouldfail('eob:\255', 'eob:<ff>') -- invalid UTF-8
+ end)
+ end)
+end)
diff --git a/test/functional/options/keymap_spec.lua b/test/functional/options/keymap_spec.lua
new file mode 100644
index 0000000000..7f6d623dc7
--- /dev/null
+++ b/test/functional/options/keymap_spec.lua
@@ -0,0 +1,233 @@
+local helpers = require('test.functional.helpers')(after_each)
+local clear, feed, eq = helpers.clear, helpers.feed, helpers.eq
+local expect, command, eval = helpers.expect, helpers.command, helpers.eval
+local insert, call = helpers.insert, helpers.call
+local funcs, dedent = helpers.funcs, helpers.dedent
+
+-- First test it's implemented using the :lmap and :lnoremap commands, then
+-- check those mappings behave as expected.
+describe("'keymap' / :lmap", function()
+ clear()
+ before_each(function()
+ clear()
+ insert("lllaaa")
+ command('set iminsert=1')
+ command('set imsearch=1')
+ command('lmap l a')
+ feed('gg0')
+ end)
+
+ describe("'keymap' as :lmap", function()
+ -- Shows that 'keymap' sets language mappings that allows remapping.
+ -- This equivalence allows us to only test :lmap commands and assert they
+ -- behave the same as 'keymap' settings.
+ -- It does rely on the absence of special code that implements 'keymap'
+ -- and :lmap differently but shows mappings from the 'keymap' after
+ -- typing :lmap.
+ -- At the moment this is the case.
+ it("'keymap' mappings are shown with :lmap", function()
+ command('lmapclear')
+ command('lmapclear <buffer>')
+ command('set keymap=dvorak')
+ command('set nomore')
+ local bindings = funcs.nvim_command_output('lmap')
+ eq(dedent([[
+
+ l " @_
+ l ' @-
+ l + @}
+ l , @w
+ l - @[
+ l . @v
+ l / @z
+ l : @S
+ l ; @s
+ l < @W
+ l = @]
+ l > @V
+ l ? @Z
+ l A @A
+ l B @X
+ l C @J
+ l D @E
+ l E @>
+ l F @U
+ l G @I
+ l H @D
+ l I @C
+ l J @H
+ l K @T
+ l L @N
+ l M @M
+ l N @B
+ l O @R
+ l P @L
+ l Q @"
+ l R @P
+ l S @O
+ l T @Y
+ l U @G
+ l V @K
+ l W @<
+ l X @Q
+ l Y @F
+ l Z @:
+ l [ @/
+ l \ @\
+ l ] @=
+ l _ @{
+ l a @a
+ l b @x
+ l c @j
+ l d @e
+ l e @.
+ l f @u
+ l g @i
+ l h @d
+ l i @c
+ l j @h
+ l k @t
+ l l @n
+ l m @m
+ l n @b
+ l o @r
+ l p @l
+ l q @'
+ l r @p
+ l s @o
+ l t @y
+ l u @g
+ l v @k
+ l w @,
+ l x @q
+ l y @f
+ l z @;
+ l { @?
+ l | @|
+ l } @+]]), bindings)
+ end)
+ end)
+ describe("'iminsert' option", function()
+ it("Uses :lmap in insert mode when ON", function()
+ feed('il<esc>')
+ expect('alllaaa')
+ end)
+ it("Ignores :lmap in insert mode when OFF", function()
+ command('set iminsert=0')
+ feed('il<esc>')
+ expect('llllaaa')
+ end)
+ it("Can be toggled with <C-^> in insert mode", function()
+ feed('i<C-^>l<C-^>l<esc>')
+ expect('lalllaaa')
+ eq(eval('&iminsert'), 1)
+ feed('i<C-^><esc>')
+ eq(eval('&iminsert'), 0)
+ end)
+ end)
+ describe("'imsearch' option", function()
+ it("Uses :lmap at search prompt when ON", function()
+ feed('/lll<cr>3x')
+ expect('lll')
+ end)
+ it("Ignores :lmap at search prompt when OFF", function()
+ command('set imsearch=0')
+ feed('gg/lll<cr>3x')
+ expect('aaa')
+ end)
+ it("Can be toggled with C-^", function()
+ eq(eval('&imsearch'), 1)
+ feed('/<C-^>lll<cr>3x')
+ expect('aaa')
+ eq(eval('&imsearch'), 0)
+ feed('u0/<C-^>lll<cr>3x')
+ expect('lll')
+ eq(eval('&imsearch'), 1)
+ end)
+ it("can follow 'iminsert'", function()
+ command('set imsearch=-1')
+ feed('/lll<cr>3x')
+ expect('lll')
+ eq(eval('&imsearch'), -1)
+ eq(eval('&iminsert'), 1)
+ feed('u/<C-^>lll<cr>3x')
+ expect('aaa')
+ eq(eval('&imsearch'), -1)
+ eq(eval('&iminsert'), 0)
+ end)
+ end)
+ it(":lmap not applied to macros", function()
+ command("call setreg('a', 'il')")
+ feed('@a')
+ expect('llllaaa')
+ eq(call('getreg', 'a'), 'il')
+ end)
+ it(":lmap applied to macro recording", function()
+ feed('qail<esc>q@a')
+ expect('aalllaaa')
+ eq(call('getreg', 'a'), 'ia')
+ end)
+ it(":lmap not applied to mappings", function()
+ command('imap t l')
+ feed('it<esc>')
+ expect('llllaaa')
+ end)
+ it("mappings applied to keys created with :lmap", function()
+ command('imap a x')
+ feed('il<esc>')
+ expect('xlllaaa')
+ end)
+ it("mappings not applied to keys gotten with :lnoremap", function()
+ command('lmapclear')
+ command('lnoremap l a')
+ command('imap a x')
+ feed('il<esc>')
+ expect('alllaaa')
+ end)
+ -- This is a problem introduced when introducting :lmap and macro
+ -- compatibility. There are no plans to fix this as the complexity involved
+ -- seems too great.
+ pending('mappings not applied to macro replay of :lnoremap', function()
+ command('lmapclear')
+ command('lnoremap l a')
+ command('imap a x')
+ feed('qail<esc>q')
+ expect('alllaaa')
+ feed('@a')
+ expect('aalllaaa')
+ end)
+ it("is applied when using f/F t/T", function()
+ feed('flx')
+ expect('lllaa')
+ feed('0ia<esc>4lFlx')
+ expect('lllaa')
+ feed('tllx')
+ expect('llla')
+ feed('0ia<esc>4lTlhx')
+ expect('llla')
+ end)
+ it('takes priority over :imap mappings', function()
+ command('imap l x')
+ feed('il<esc>')
+ expect('alllaaa')
+ command('lmapclear')
+ command('lmap l a')
+ feed('il')
+ expect('aalllaaa')
+ end)
+ it('does not cause recursive mappings', function()
+ command('lmap a l')
+ feed('qaila<esc>q')
+ expect('allllaaa')
+ feed('u@a')
+ expect('allllaaa')
+ end)
+ it('can handle multicharacter mappings', function()
+ command("lmap 'a x")
+ command("lmap '' '")
+ feed("qai'a''a<esc>q")
+ expect("x'alllaaa")
+ feed('u@a')
+ expect("x'alllaaa")
+ end)
+end)
diff --git a/test/functional/options/num_options_spec.lua b/test/functional/options/num_options_spec.lua
new file mode 100644
index 0000000000..fb0559054d
--- /dev/null
+++ b/test/functional/options/num_options_spec.lua
@@ -0,0 +1,110 @@
+-- Tests for :setlocal and :setglobal
+
+local helpers = require('test.functional.helpers')(after_each)
+local clear, feed_command, eval, eq, meths =
+ helpers.clear, helpers.feed_command, helpers.eval, helpers.eq, helpers.meths
+
+local function should_fail(opt, value, errmsg)
+ feed_command('setglobal ' .. opt .. '=' .. value)
+ eq(errmsg, eval("v:errmsg"):match("E%d*"))
+ feed_command('let v:errmsg = ""')
+ feed_command('setlocal ' .. opt .. '=' .. value)
+ eq(errmsg, eval("v:errmsg"):match("E%d*"))
+ feed_command('let v:errmsg = ""')
+ local status, err = pcall(meths.set_option, opt, value)
+ eq(status, false)
+ eq(errmsg, err:match("E%d*"))
+ eq('', eval("v:errmsg"))
+end
+
+local function should_succeed(opt, value)
+ feed_command('setglobal ' .. opt .. '=' .. value)
+ feed_command('setlocal ' .. opt .. '=' .. value)
+ meths.set_option(opt, value)
+ eq(value, meths.get_option(opt))
+ eq('', eval("v:errmsg"))
+end
+
+describe(':setlocal', function()
+ before_each(clear)
+
+ it('setlocal sets only local value', function()
+ eq(0, meths.get_option('iminsert'))
+ feed_command('setlocal iminsert=1')
+ eq(0, meths.get_option('iminsert'))
+ eq(0, meths.get_option('imsearch'))
+ feed_command('setlocal imsearch=1')
+ eq(0, meths.get_option('imsearch'))
+ end)
+end)
+
+describe(':set validation', function()
+ before_each(clear)
+
+ it('setlocal and setglobal validate values', function()
+ should_fail('shiftwidth', -10, 'E487')
+ should_succeed('shiftwidth', 0)
+ should_fail('tabstop', -10, 'E487')
+ should_fail('winheight', -10, 'E487')
+ should_fail('winheight', 0, 'E487')
+ should_fail('winminheight', -1, 'E487')
+ should_succeed('winminheight', 0)
+ should_fail('winwidth', 0, 'E487')
+ should_fail('helpheight', -1, 'E487')
+ should_fail('iminsert', 3, 'E474')
+ should_fail('imsearch', 3, 'E474')
+ should_fail('titlelen', -1, 'E487')
+ should_fail('cmdheight', 0, 'E487')
+ should_fail('updatecount', -1, 'E487')
+ should_fail('textwidth', -1, 'E487')
+ should_fail('tabstop', 0, 'E487')
+ should_fail('timeoutlen', -1, 'E487')
+ should_fail('history', 1000000, 'E474')
+ should_fail('regexpengine', -1, 'E474')
+ should_fail('regexpengine', 3, 'E474')
+ should_succeed('regexpengine', 2)
+ should_fail('report', -1, 'E487')
+ should_succeed('report', 0)
+ should_fail('scrolloff', -1, 'E49')
+ should_fail('sidescrolloff', -1, 'E487')
+ should_fail('sidescroll', -1, 'E487')
+ should_fail('cmdwinheight', 0, 'E487')
+ should_fail('updatetime', -1, 'E487')
+
+ should_fail('foldlevel', -5, 'E487')
+ should_fail('foldcolumn', 13, 'E474')
+ should_fail('conceallevel', 4, 'E474')
+ should_fail('numberwidth', 11, 'E474')
+ should_fail('numberwidth', 0, 'E487')
+
+ -- If smaller than 1 this one is set to 'lines'-1
+ feed_command('setglobal window=-10')
+ meths.set_option('window', -10)
+ eq(23, meths.get_option('window'))
+ eq('', eval("v:errmsg"))
+ end)
+
+ it('set wmh/wh wmw/wiw checks', function()
+ feed_command('set winheight=2')
+ feed_command('set winminheight=3')
+ eq('E591', eval("v:errmsg"):match("E%d*"))
+
+ feed_command('set winwidth=2')
+ feed_command('set winminwidth=3')
+ eq('E592', eval("v:errmsg"):match("E%d*"))
+ end)
+
+ it('set maxcombine resets to 6', function()
+ local function setto(value)
+ feed_command('setglobal maxcombine=' .. value)
+ feed_command('setlocal maxcombine=' .. value)
+ meths.set_option('maxcombine', value)
+ eq(6, meths.get_option('maxcombine'))
+ eq('', eval("v:errmsg"))
+ end
+ setto(0)
+ setto(1)
+ setto(6)
+ setto(7)
+ end)
+end)
diff --git a/test/functional/options/pastetoggle_spec.lua b/test/functional/options/pastetoggle_spec.lua
new file mode 100644
index 0000000000..a1f86f73ff
--- /dev/null
+++ b/test/functional/options/pastetoggle_spec.lua
@@ -0,0 +1,40 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local clear = helpers.clear
+local feed = helpers.feed
+local command = helpers.command
+local eq = helpers.eq
+local eval = helpers.eval
+local sleep = helpers.sleep
+local expect = helpers.expect
+
+describe("'pastetoggle' option", function()
+ before_each(function()
+ clear()
+ command('set nopaste')
+ end)
+
+ it("toggles 'paste'", function()
+ command('set pastetoggle=a')
+ eq(0, eval('&paste'))
+ feed('a')
+ -- Need another key so that the vgetorpeek() function returns.
+ feed('j')
+ eq(1, eval('&paste'))
+ end)
+
+
+ it('does not wait for timeout', function()
+ command('set pastetoggle=abc')
+ command('set ttimeoutlen=9999999')
+ eq(0, eval('&paste'))
+ -- n.b. need <esc> to return from vgetorpeek()
+ feed('abc<esc>')
+ eq(1, eval('&paste'))
+ feed('ab')
+ sleep(10)
+ feed('c<esc>')
+ expect('bc')
+ eq(1, eval('&paste'))
+ end)
+end)
diff --git a/test/functional/options/shortmess_spec.lua b/test/functional/options/shortmess_spec.lua
index d531e47e28..8ea9a19464 100644
--- a/test/functional/options/shortmess_spec.lua
+++ b/test/functional/options/shortmess_spec.lua
@@ -1,39 +1,96 @@
local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
-local clear, execute = helpers.clear, helpers.execute
+local clear = helpers.clear
+local command = helpers.command
+local eq = helpers.eq
+local eval = helpers.eval
+local feed = helpers.feed
describe("'shortmess'", function()
local screen
before_each(function()
clear()
- screen = Screen.new(25, 5)
+ screen = Screen.new(42, 5)
screen:attach()
end)
- after_each(function()
- screen:detach()
- end)
-
describe('"F" flag', function()
- it('hides messages about the files read', function()
- execute('e test')
+ it('hides :edit fileinfo messages', function()
+ command('set hidden')
+ command('set shortmess-=F')
+ feed(':edit foo<CR>')
+ screen:expect([[
+ ^ |
+ ~ |
+ ~ |
+ ~ |
+ "foo" [New File] |
+ ]])
+ eq(1, eval('bufnr("%")'))
+
+ command('set shortmess+=F')
+ feed(':edit bar<CR>')
+ screen:expect([[
+ ^ |
+ ~ |
+ ~ |
+ ~ |
+ :edit bar |
+ ]])
+ eq(2, eval('bufnr("%")'))
+ end)
+
+ it('hides :bnext, :bprevious fileinfo messages', function()
+ command('set hidden')
+ command('set shortmess-=F')
+ feed(':edit foo<CR>')
+ screen:expect([[
+ ^ |
+ ~ |
+ ~ |
+ ~ |
+ "foo" [New File] |
+ ]])
+ eq(1, eval('bufnr("%")'))
+ feed(':edit bar<CR>')
+ screen:expect([[
+ ^ |
+ ~ |
+ ~ |
+ ~ |
+ "bar" [New File] |
+ ]])
+ eq(2, eval('bufnr("%")'))
+ feed(':bprevious<CR>')
+ screen:expect([[
+ ^ |
+ ~ |
+ ~ |
+ ~ |
+ "foo" [New file] --No lines in buffer-- |
+ ]])
+ eq(1, eval('bufnr("%")'))
+
+ command('set shortmess+=F')
+ feed(':bnext<CR>')
screen:expect([[
- ^ |
- ~ |
- ~ |
- ~ |
- "test" is a directory |
+ ^ |
+ ~ |
+ ~ |
+ ~ |
+ :bnext |
]])
- execute('set shortmess=F')
- execute('e test')
+ eq(2, eval('bufnr("%")'))
+ feed(':bprevious<CR>')
screen:expect([[
- ^ |
- ~ |
- ~ |
- ~ |
- :e test |
+ ^ |
+ ~ |
+ ~ |
+ ~ |
+ :bprevious |
]])
+ eq(1, eval('bufnr("%")'))
end)
end)
end)
diff --git a/test/functional/options/tabstop_spec.lua b/test/functional/options/tabstop_spec.lua
new file mode 100644
index 0000000000..dc3ba38438
--- /dev/null
+++ b/test/functional/options/tabstop_spec.lua
@@ -0,0 +1,23 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local clear = helpers.clear
+local feed = helpers.feed
+local eq = helpers.eq
+local eval = helpers.eval
+
+describe("'tabstop' option", function()
+ before_each(function()
+ clear()
+ end)
+
+ -- NOTE: Setting 'tabstop' to a big number reproduces crash #2838.
+ -- Disallowing big 'tabstop' would not fix #2838, only hide it.
+ it("tabstop=<big-number> does not crash #2838", function()
+ -- Insert a <Tab> character for 'tabstop' to work with.
+ feed('i<Tab><Esc>')
+ -- Set 'tabstop' to a very high value.
+ -- Use feed(), not command(), to provoke crash.
+ feed(':set tabstop=3000000000<CR>')
+ eq(2, eval("1+1")) -- Still alive?
+ end)
+end)
diff --git a/test/functional/plugin/health_spec.lua b/test/functional/plugin/health_spec.lua
new file mode 100644
index 0000000000..f2d5e433db
--- /dev/null
+++ b/test/functional/plugin/health_spec.lua
@@ -0,0 +1,154 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+local plugin_helpers = require('test.functional.plugin.helpers')
+
+local clear = helpers.clear
+local curbuf_contents = helpers.curbuf_contents
+local command = helpers.command
+local eq = helpers.eq
+local getcompletion = helpers.funcs.getcompletion
+
+describe(':checkhealth', function()
+ it("detects invalid $VIMRUNTIME", function()
+ clear({
+ env={ VIMRUNTIME='bogus', },
+ })
+ local status, err = pcall(command, 'checkhealth')
+ eq(false, status)
+ eq('Invalid $VIMRUNTIME: bogus', string.match(err, 'Invalid.*'))
+ end)
+ it("detects invalid 'runtimepath'", function()
+ clear()
+ command('set runtimepath=bogus')
+ local status, err = pcall(command, 'checkhealth')
+ eq(false, status)
+ eq("Invalid 'runtimepath'", string.match(err, 'Invalid.*'))
+ end)
+ it("detects invalid $VIM", function()
+ clear()
+ -- Do this after startup, otherwise it just breaks $VIMRUNTIME.
+ command("let $VIM='zub'")
+ command("checkhealth nvim")
+ eq("ERROR: $VIM is invalid: zub",
+ string.match(curbuf_contents(), "ERROR: $VIM .* zub"))
+ end)
+ it('completions can be listed via getcompletion()', function()
+ clear()
+ eq('nvim', getcompletion('nvim', 'checkhealth')[1])
+ eq('provider', getcompletion('prov', 'checkhealth')[1])
+ end)
+end)
+
+describe('health.vim', function()
+ before_each(function()
+ plugin_helpers.reset()
+ -- Provides functions:
+ -- health#broken#check()
+ -- health#success1#check()
+ -- health#success2#check()
+ command("set runtimepath+=test/functional/fixtures")
+ end)
+
+ it("health#report_*()", function()
+ helpers.source([[
+ let g:health_report = execute([
+ \ "call health#report_start('Check Bar')",
+ \ "call health#report_ok('Bar status')",
+ \ "call health#report_ok('Other Bar status')",
+ \ "call health#report_warn('Zub')",
+ \ "call health#report_start('Baz')",
+ \ "call health#report_warn('Zim', ['suggestion 1', 'suggestion 2'])"
+ \ ])
+ ]])
+ local result = helpers.eval("g:health_report")
+
+ helpers.eq(helpers.dedent([[
+
+
+ ## Check Bar
+ - OK: Bar status
+ - OK: Other Bar status
+ - WARNING: Zub
+
+ ## Baz
+ - WARNING: Zim
+ - ADVICE:
+ - suggestion 1
+ - suggestion 2]]),
+ result)
+ end)
+
+
+ describe(":checkhealth", function()
+ it("concatenates multiple reports", function()
+ command("checkhealth success1 success2")
+ helpers.expect([[
+
+ health#success1#check
+ ========================================================================
+ ## report 1
+ - OK: everything is fine
+
+ ## report 2
+ - OK: nothing to see here
+
+ health#success2#check
+ ========================================================================
+ ## another 1
+ - OK: ok
+ ]])
+ end)
+
+ it("gracefully handles broken healthcheck", function()
+ command("checkhealth broken")
+ helpers.expect([[
+
+ health#broken#check
+ ========================================================================
+ - ERROR: Failed to run healthcheck for "broken" plugin. Exception:
+ function health#check[21]..health#broken#check, line 1
+ caused an error
+ ]])
+ end)
+
+ it("highlights OK, ERROR", function()
+ local screen = Screen.new(72, 10)
+ screen:attach()
+ screen:set_default_attr_ids({
+ Ok = { foreground = Screen.colors.Grey3, background = 6291200 },
+ Error = { foreground = Screen.colors.Grey100, background = Screen.colors.Red },
+ })
+ screen:set_default_attr_ignore({
+ Heading = { bold=true, foreground=Screen.colors.Magenta },
+ Heading2 = { foreground = Screen.colors.SlateBlue },
+ Bar = { foreground=Screen.colors.Purple },
+ Bullet = { bold=true, foreground=Screen.colors.Brown },
+ })
+ command("checkhealth foo success1")
+ command("1tabclose")
+ command("set laststatus=0")
+ screen:expect([[
+ ^ |
+ health#foo#check |
+ ========================================================================|
+ - {Error:ERROR:} No healthcheck found for "foo" plugin. |
+ |
+ health#success1#check |
+ ========================================================================|
+ ## report 1 |
+ - {Ok:OK:} everything is fine |
+ |
+ ]])
+ end)
+
+ it("gracefully handles invalid healthcheck", function()
+ command("checkhealth non_existent_healthcheck")
+ helpers.expect([[
+
+ health#non_existent_healthcheck#check
+ ========================================================================
+ - ERROR: No healthcheck found for "non_existent_healthcheck" plugin.
+ ]])
+ end)
+ end)
+end)
diff --git a/test/functional/plugin/helpers.lua b/test/functional/plugin/helpers.lua
index 7580670149..4359380bd7 100644
--- a/test/functional/plugin/helpers.lua
+++ b/test/functional/plugin/helpers.lua
@@ -10,10 +10,10 @@ local function nvim_argv(shada_file)
local rtp_value = ('\'%s/runtime\''):format(
paths.test_source_path:gsub('\'', '\'\''))
local nvim_args = {nvim_prog, '-u', 'NORC', '-i', shada_file or 'NONE', '-N',
- '--cmd', 'set shortmess+=I background=light noswapfile',
+ '--cmd', 'set shortmess+=I background=light noswapfile belloff= noshowcmd noruler',
'--cmd', 'let &runtimepath=' .. rtp_value,
'--cmd', additional_cmd,
- '--embed'}
+ '--embed', '--headless'}
if helpers.prepend_argv then
return merge_args(helpers.prepend_argv, nvim_args)
else
@@ -23,7 +23,7 @@ end
local session = nil
-local reset = function(...)
+local function reset(...)
if session then
session:close()
end
@@ -31,7 +31,7 @@ local reset = function(...)
set_session(session)
end
-local set_additional_cmd = function(s)
+local function set_additional_cmd(s)
additional_cmd = s
end
diff --git a/test/functional/plugin/man_spec.lua b/test/functional/plugin/man_spec.lua
new file mode 100644
index 0000000000..e5da7932a5
--- /dev/null
+++ b/test/functional/plugin/man_spec.lua
@@ -0,0 +1,135 @@
+local helpers = require('test.functional.helpers')(after_each)
+local plugin_helpers = require('test.functional.plugin.helpers')
+
+local Screen = require('test.functional.ui.screen')
+
+local command, eval, rawfeed = helpers.command, helpers.eval, helpers.rawfeed
+
+before_each(function()
+ plugin_helpers.reset()
+ helpers.clear()
+ command('syntax on')
+ command('set filetype=man')
+end)
+
+describe(':Man', function()
+ describe('man.lua: highlight_line()', function()
+ local screen
+
+ before_each(function()
+ command('syntax off') -- Ignore syntax groups
+ screen = Screen.new(52, 5)
+ screen:set_default_attr_ids({
+ b = { bold = true },
+ i = { italic = true },
+ u = { underline = true },
+ bi = { bold = true, italic = true },
+ biu = { bold = true, italic = true, underline = true },
+ })
+ screen:set_default_attr_ignore({
+ { foreground = Screen.colors.Blue }, -- control chars
+ { bold = true, foreground = Screen.colors.Blue } -- empty line '~'s
+ })
+ screen:attach()
+ end)
+
+ after_each(function()
+ screen:detach()
+ end)
+
+ it('clears backspaces from text and adds highlights', function()
+ rawfeed([[
+ ithis i<C-v><C-h>is<C-v><C-h>s a<C-v><C-h>a test
+ with _<C-v><C-h>o_<C-v><C-h>v_<C-v><C-h>e_<C-v><C-h>r_<C-v><C-h>s_<C-v><C-h>t_<C-v><C-h>r_<C-v><C-h>u_<C-v><C-h>c_<C-v><C-h>k text<ESC>]])
+
+ screen:expect([[
+ this i^His^Hs a^Ha test |
+ with _^Ho_^Hv_^He_^Hr_^Hs_^Ht_^Hr_^Hu_^Hc_^Hk tex^t |
+ ~ |
+ ~ |
+ |
+ ]])
+
+ eval('man#init_pager()')
+
+ screen:expect([[
+ ^this {b:is} {b:a} test |
+ with {u:overstruck} text |
+ ~ |
+ ~ |
+ |
+ ]])
+ end)
+
+ it('clears escape sequences from text and adds highlights', function()
+ rawfeed([[
+ ithis <C-v><ESC>[1mis <C-v><ESC>[3ma <C-v><ESC>[4mtest<C-v><ESC>[0m
+ <C-v><ESC>[4mwith<C-v><ESC>[24m <C-v><ESC>[4mescaped<C-v><ESC>[24m <C-v><ESC>[4mtext<C-v><ESC>[24m<ESC>]])
+
+ screen:expect([=[
+ this ^[[1mis ^[[3ma ^[[4mtest^[[0m |
+ ^[[4mwith^[[24m ^[[4mescaped^[[24m ^[[4mtext^[[24^m |
+ ~ |
+ ~ |
+ |
+ ]=])
+
+ eval('man#init_pager()')
+
+ screen:expect([[
+ ^this {b:is }{bi:a }{biu:test} |
+ {u:with} {u:escaped} {u:text} |
+ ~ |
+ ~ |
+ |
+ ]])
+ end)
+
+ it('highlights multibyte text', function()
+ rawfeed([[
+ ithis i<C-v><C-h>is<C-v><C-h>s ใ‚<C-v><C-h>ใ‚ test
+ with _<C-v><C-h>รถ_<C-v><C-h>v_<C-v><C-h>e_<C-v><C-h>r_<C-v><C-h>s_<C-v><C-h>t_<C-v><C-h>r_<C-v><C-h>u_<C-v><C-h>ฬƒ_<C-v><C-h>c_<C-v><C-h>k te<C-v><ESC>[3mxtยถ<C-v><ESC>[0m<ESC>]])
+ eval('man#init_pager()')
+
+ screen:expect([[
+ ^this {b:is} {b:ใ‚} test |
+ with {u:รถverstruฬƒck} te{i:xtยถ} |
+ ~ |
+ ~ |
+ |
+ ]])
+ end)
+
+ it('highlights underscores based on context', function()
+ rawfeed([[
+ i_<C-v><C-h>_b<C-v><C-h>be<C-v><C-h>eg<C-v><C-h>gi<C-v><C-h>in<C-v><C-h>ns<C-v><C-h>s
+ m<C-v><C-h>mi<C-v><C-h>id<C-v><C-h>d_<C-v><C-h>_d<C-v><C-h>dl<C-v><C-h>le<C-v><C-h>e
+ _<C-v><C-h>m_<C-v><C-h>i_<C-v><C-h>d_<C-v><C-h>__<C-v><C-h>d_<C-v><C-h>l_<C-v><C-h>e<ESC>]])
+ eval('man#init_pager()')
+
+ screen:expect([[
+ {b:^_begins} |
+ {b:mid_dle} |
+ {u:mid_dle} |
+ ~ |
+ |
+ ]])
+ end)
+
+ it('highlights various bullet formats', function()
+ rawfeed([[
+ iยท ยท<C-v><C-h>ยท
+ +<C-v><C-h>o
+ +<C-v><C-h>+<C-v><C-h>o<C-v><C-h>o double<ESC>]])
+ eval('man#init_pager()')
+
+ screen:expect([[
+ ^ยท {b:ยท} |
+ {b:ยท} |
+ {b:ยท} double |
+ ~ |
+ |
+ ]])
+ end)
+ end)
+end)
diff --git a/test/functional/plugin/matchparen_spec.lua b/test/functional/plugin/matchparen_spec.lua
index 4181f69263..51ec7e4870 100644
--- a/test/functional/plugin/matchparen_spec.lua
+++ b/test/functional/plugin/matchparen_spec.lua
@@ -2,25 +2,28 @@ local helpers = require('test.functional.helpers')(after_each)
local plugin_helpers = require('test.functional.plugin.helpers')
local Screen = require('test.functional.ui.screen')
-local execute = helpers.execute
+local command = helpers.command
local meths = helpers.meths
local feed = helpers.feed
local eq = helpers.eq
local reset = plugin_helpers.reset
-describe('matchparen', function()
+describe('matchparen', function()
local screen
before_each(function()
reset()
screen = Screen.new(20,5)
screen:attach()
- screen:set_default_attr_ignore( {{bold=true, foreground=Screen.colors.Blue}} )
+ screen:set_default_attr_ids( {
+ [0] = {bold=true, foreground=255},
+ [1] = {bold=true},
+ } )
end)
it('uses correct column after i_<Up>. Vim patch 7.4.1296', function()
- execute('set noautoindent nosmartindent nocindent laststatus=0')
+ command('set noautoindent nosmartindent nocindent laststatus=0')
eq(1, meths.get_var('loaded_matchparen'))
feed('ivoid f_test()<cr>')
feed('{<cr>')
@@ -37,7 +40,7 @@ describe('matchparen', function()
^ |
} |
{1:-- INSERT --} |
- ]], {[1] = {bold = true}})
+ ]])
end)
end)
diff --git a/test/functional/plugin/msgpack_spec.lua b/test/functional/plugin/msgpack_spec.lua
index c8da8e8f6c..2ce9974812 100644
--- a/test/functional/plugin/msgpack_spec.lua
+++ b/test/functional/plugin/msgpack_spec.lua
@@ -8,7 +8,7 @@ local NIL = helpers.NIL
local plugin_helpers = require('test.functional.plugin.helpers')
local reset = plugin_helpers.reset
-describe('In autoload/msgpack.vim', function()
+describe('autoload/msgpack.vim', function()
before_each(reset)
local sp = function(typ, val)
@@ -581,6 +581,8 @@ describe('In autoload/msgpack.vim', function()
eval_eq('binary', {'', 'abc', '', '', 'def'}, '"\\nabc\\n\\n\\ndef"')
eval_eq('binary', {''}, '""')
eval_eq('binary', {'"'}, '"\\""')
+ eval_eq('binary', {'py3 print(sys.version_info)'},
+ '"py3 print(sys.version_info)"')
end)
it('correctly loads strings', function()
@@ -595,6 +597,8 @@ describe('In autoload/msgpack.vim', function()
eval_eq('string', {'', 'abc', '', '', 'def'}, '="\\nabc\\n\\n\\ndef"')
eval_eq('string', {''}, '=""')
eval_eq('string', {'"'}, '="\\""')
+ eval_eq('string', {'py3 print(sys.version_info)'},
+ '="py3 print(sys.version_info)"')
end)
it('correctly loads ext values', function()
@@ -625,6 +629,9 @@ describe('In autoload/msgpack.vim', function()
'+(-1)"\\nabc\\n\\n\\ndef"')
eval_eq('ext', {-1, {''}}, '+(-1)""')
eval_eq('ext', {-1, {'"'}}, '+(-1)"\\""')
+
+ eval_eq('ext', {42, {'py3 print(sys.version_info)'}},
+ '+(42)"py3 print(sys.version_info)"')
end)
it('correctly loads floats', function()
@@ -652,6 +659,8 @@ describe('In autoload/msgpack.vim', function()
eval_eq('integer', ('a'):byte(), '\'a\'')
eval_eq('integer', 0xAB, '\'ยซ\'')
+ eval_eq('integer', 0, '\'\\0\'')
+ eval_eq('integer', 10246567, '\'\\10246567\'')
end)
it('correctly loads constants', function()
@@ -674,6 +683,13 @@ describe('In autoload/msgpack.vim', function()
eval_eq('map', {{{_TYPE={}, _VAL={{1, 2}}}, {_TYPE={}, _VAL={{3, 4}}}},
{1, 2}},
'{{1: 2}: {3: 4}, 1: 2}')
+
+ eval_eq('map', {{{_TYPE={}, _VAL={
+ {{_TYPE={}, _VAL={'py3 print(sys.version_info)'}},
+ 2}}},
+ {_TYPE={}, _VAL={{3, 4}}}},
+ {1, 2}},
+ '{{"py3 print(sys.version_info)": 2}: {3: 4}, 1: 2}')
end)
it('correctly loads arrays', function()
@@ -682,6 +698,9 @@ describe('In autoload/msgpack.vim', function()
eval_eq('array', {{_TYPE={}, _VAL=1}}, '[TRUE]')
eval_eq('array', {{{_TYPE={}, _VAL={{1, 2}}}}, {_TYPE={}, _VAL={{3, 4}}}},
'[[{1: 2}], {3: 4}]')
+
+ eval_eq('array', {{_TYPE={}, _VAL={'py3 print(sys.version_info)'}}},
+ '["py3 print(sys.version_info)"]')
end)
it('errors out when needed', function()
@@ -709,6 +728,11 @@ describe('In autoload/msgpack.vim', function()
exc_exec('call msgpack#eval("0x", {})'))
eq('name-unknown:Unknown name FOO: FOO',
exc_exec('call msgpack#eval("FOO", {})'))
+
+ eq('name-unknown:Unknown name py3: py3 print(sys.version_info)',
+ exc_exec('call msgpack#eval("py3 print(sys.version_info)", {})'))
+ eq('name-unknown:Unknown name o: o',
+ exc_exec('call msgpack#eval("-info", {})'))
end)
end)
end)
diff --git a/test/functional/plugin/shada_spec.lua b/test/functional/plugin/shada_spec.lua
index e18e9ef428..1482d83ee6 100644
--- a/test/functional/plugin/shada_spec.lua
+++ b/test/functional/plugin/shada_spec.lua
@@ -3,6 +3,7 @@ local eq, nvim_eval, nvim_command, nvim, exc_exec, funcs, nvim_feed, curbuf =
helpers.eq, helpers.eval, helpers.command, helpers.nvim, helpers.exc_exec,
helpers.funcs, helpers.feed, helpers.curbuf
local neq = helpers.neq
+local read_file = helpers.read_file
local mpack = require('mpack')
@@ -43,7 +44,7 @@ local wshada, _, fname = get_shada_rw('Xtest-functional-plugin-shada.shada')
local wshada_tmp, _, fname_tmp =
get_shada_rw('Xtest-functional-plugin-shada.shada.tmp.f')
-describe('In autoload/shada.vim', function()
+describe('autoload/shada.vim', function()
local epoch = os.date('%Y-%m-%dT%H:%M:%S', 0)
before_each(function()
reset()
@@ -177,6 +178,7 @@ describe('In autoload/shada.vim', function()
' + n name \'@\'',
' + rc contents ["abc", "def"]',
' + rt type CHARACTERWISE',
+ ' + ru is_unnamed FALSE',
' + rw block width 10',
' + sb search backward TRUE',
' + sc smartcase value FALSE',
@@ -202,6 +204,7 @@ describe('In autoload/shada.vim', function()
'rt': 0,
'rw': 10,
'rc': ['abc', 'def'],
+ 'ru': {'_TYPE': v:msgpack_types.boolean, '_VAL': 0},
'n': 0x40,
'l': 10,
'c': 0,
@@ -224,6 +227,8 @@ describe('In autoload/shada.vim', function()
.. '0 (CHARACTERWISE), 1 (LINEWISE), 2 (BLOCKWISE)',
' + rt type 10',
' # Expected boolean',
+ ' + ru is_unnamed 10',
+ ' # Expected boolean',
' + sc smartcase value NIL',
' # Expected boolean',
' + sm magic value "TRUE"',
@@ -238,6 +243,7 @@ describe('In autoload/shada.vim', function()
'sp': {'_TYPE': v:msgpack_types.string, '_VAL': ["abc"]},
'rt': 10,
'rc': '10',
+ 'ru': 10,
'n': -0x40,
'l': -10,
'c': 'abc',
@@ -607,6 +613,18 @@ describe('In autoload/shada.vim', function()
'abc',
-1,
]}] ]]):gsub('\n', ''))
+ -- Regression: NUL separator must be properly supported
+ sd2strings_eq({
+ 'History entry with timestamp ' .. epoch .. ':',
+ ' @ Description_ Value',
+ ' - history type SEARCH',
+ ' - contents ""',
+ ' - separator \'\\0\'',
+ }, ([[ [{'type': 4, 'timestamp': 0, 'data': [
+ 1,
+ '',
+ 0x0
+ ]}] ]]):gsub('\n', ''))
end)
it('works with register items', function()
@@ -622,6 +640,7 @@ describe('In autoload/shada.vim', function()
' # Required key missing: rc',
' + rw block width 0',
' + rt type CHARACTERWISE',
+ ' + ru is_unnamed FALSE',
}, ([[ [{'type': 5, 'timestamp': 0, 'data': {
}}] ]]):gsub('\n', ''))
sd2strings_eq({
@@ -631,6 +650,7 @@ describe('In autoload/shada.vim', function()
' # Required key missing: rc',
' + rw block width 0',
' + rt type CHARACTERWISE',
+ ' + ru is_unnamed FALSE',
}, ([[ [{'type': 5, 'timestamp': 0, 'data': {
'n': 0x20,
}}] ]]):gsub('\n', ''))
@@ -641,9 +661,11 @@ describe('In autoload/shada.vim', function()
' + rc contents ["abc", "def"]',
' + rw block width 0',
' + rt type CHARACTERWISE',
+ ' + ru is_unnamed FALSE',
}, ([[ [{'type': 5, 'timestamp': 0, 'data': {
'n': 0x20,
'rc': ["abc", "def"],
+ 'ru': {'_TYPE': v:msgpack_types.boolean, '_VAL': 0},
}}] ]]):gsub('\n', ''))
sd2strings_eq({
'Register with timestamp ' .. epoch .. ':',
@@ -654,9 +676,11 @@ describe('In autoload/shada.vim', function()
' | - "abcdefghijklmnopqrstuvwxyz"',
' + rw block width 0',
' + rt type CHARACTERWISE',
+ ' + ru is_unnamed TRUE',
}, ([[ [{'type': 5, 'timestamp': 0, 'data': {
'n': 0x20,
'rc': ['abcdefghijklmnopqrstuvwxyz', 'abcdefghijklmnopqrstuvwxyz'],
+ 'ru': {'_TYPE': v:msgpack_types.boolean, '_VAL': 1},
}}] ]]):gsub('\n', ''))
sd2strings_eq({
'Register with timestamp ' .. epoch .. ':',
@@ -667,6 +691,7 @@ describe('In autoload/shada.vim', function()
' | - "abcdefghijklmnopqrstuvwxyz"',
' + rw block width 0',
' + rt type CHARACTERWISE',
+ ' + ru is_unnamed FALSE',
}, ([[ [{'type': 5, 'timestamp': 0, 'data': {
'n': 0x20,
'rc': ['abcdefghijklmnopqrstuvwxyz', 'abcdefghijklmnopqrstuvwxyz'],
@@ -682,6 +707,7 @@ describe('In autoload/shada.vim', function()
' | - "abcdefghijklmnopqrstuvwxyz"',
' + rw block width 5',
' + rt type LINEWISE',
+ ' + ru is_unnamed FALSE',
}, ([[ [{'type': 5, 'timestamp': 0, 'data': {
'n': 0x20,
'rc': ['abcdefghijklmnopqrstuvwxyz', 'abcdefghijklmnopqrstuvwxyz'],
@@ -698,11 +724,14 @@ describe('In autoload/shada.vim', function()
' # Expected integer',
' + rw block width ""',
' + rt type BLOCKWISE',
+ ' # Expected boolean',
+ ' + ru is_unnamed ""',
}, ([[ [{'type': 5, 'timestamp': 0, 'data': {
'n': 0x20,
'rc': ['abcdefghijklmnopqrstuvwxyz', 'abcdefghijklmnopqrstuvwxyz'],
'rw': "",
'rt': 2,
+ 'ru': ""
}}] ]]):gsub('\n', ''))
sd2strings_eq({
'Register with timestamp ' .. epoch .. ':',
@@ -715,11 +744,32 @@ describe('In autoload/shada.vim', function()
' # Unexpected enum value: expected one of 0 (CHARACTERWISE), '
.. '1 (LINEWISE), 2 (BLOCKWISE)',
' + rt type 10',
+ ' # Expected boolean',
+ ' + ru is_unnamed ["abc", "def"]',
}, ([[ [{'type': 5, 'timestamp': 0, 'data': {
'n': 0x20,
'rc': 0,
'rw': -1,
'rt': 10,
+ 'ru': ['abc', 'def'],
+ }}] ]]):gsub('\n', ''))
+ sd2strings_eq({
+ 'Register with timestamp ' .. epoch .. ':',
+ ' % Key Description Value',
+ ' + n name \' \'',
+ ' + rc contents @',
+ ' | - "abcdefghijklmnopqrstuvwxyz"',
+ ' | - "abcdefghijklmnopqrstuvwxyz"',
+ ' + rw block width 5',
+ ' + rt type LINEWISE',
+ ' # Expected boolean',
+ ' + ru is_unnamed 0',
+ }, ([[ [{'type': 5, 'timestamp': 0, 'data': {
+ 'n': 0x20,
+ 'rc': ['abcdefghijklmnopqrstuvwxyz', 'abcdefghijklmnopqrstuvwxyz'],
+ 'rw': 5,
+ 'rt': 1,
+ 'ru': 0,
}}] ]]):gsub('\n', ''))
end)
@@ -835,7 +885,7 @@ describe('In autoload/shada.vim', function()
sd2strings_eq({
'Global mark with timestamp ' .. epoch .. ':',
' % Key Description Value',
- ' + n name 20',
+ ' + n name \'\\20\'',
' + f file name "foo"',
' # Value is negative',
' + l line number -10',
@@ -850,7 +900,18 @@ describe('In autoload/shada.vim', function()
sd2strings_eq({
'Global mark with timestamp ' .. epoch .. ':',
' % Key Description Value',
- ' + n name 20',
+ ' + n name 128',
+ ' + f file name "foo"',
+ ' + l line number 1',
+ ' + c column 0',
+ }, ([[ [{'type': 7, 'timestamp': 0, 'data': {
+ 'n': 128,
+ 'f': 'foo',
+ }}] ]]):gsub('\n', ''))
+ sd2strings_eq({
+ 'Global mark with timestamp ' .. epoch .. ':',
+ ' % Key Description Value',
+ ' + n name \'\\20\'',
' + f file name "foo"',
' # Expected integer',
' + l line number "FOO"',
@@ -1121,7 +1182,7 @@ describe('In autoload/shada.vim', function()
'Local mark with timestamp ' .. epoch .. ':',
' % Key Description Value',
' + f file name "foo"',
- ' + n name 20',
+ ' + n name \'\\20\'',
' # Value is negative',
' + l line number -10',
' # Value is negative',
@@ -1136,7 +1197,7 @@ describe('In autoload/shada.vim', function()
'Local mark with timestamp ' .. epoch .. ':',
' % Key Description Value',
' + f file name "foo"',
- ' + n name 20',
+ ' + n name \'\\20\'',
' # Expected integer',
' + l line number "FOO"',
' # Expected integer',
@@ -1930,13 +1991,13 @@ describe('In autoload/shada.vim', function()
'Buffer list with timestamp ' .. epoch .. ':',
' % Key Description Value',
' # Expected binary string',
- ' + f file name 10',
+ ' + f file name \'\\10\'',
' + l line number 1',
' + c column 0',
'',
' % Key Description Value',
' # Expected binary string',
- ' + f file name 20',
+ ' + f file name \'\\20\'',
' + l line number 1',
' + c column 0',
})
@@ -1946,7 +2007,7 @@ describe('In autoload/shada.vim', function()
'Buffer list with timestamp ' .. epoch .. ':',
' % Key Description Value',
' # Expected binary string',
- ' + f file name 10',
+ ' + f file name \'\\10\'',
' + l line number 1',
' + c column 0',
'',
@@ -2014,13 +2075,14 @@ describe('In autoload/shada.vim', function()
end
it('works', function()
+ local version = nvim('get_vvar', 'version')
getbstrings_eq({{timestamp='current', type=1, value={
generator='shada.vim',
- version=704,
+ version=version,
}}}, {})
getbstrings_eq({
{timestamp='current', type=1, value={
- generator='shada.vim', version=704
+ generator='shada.vim', version=version
}},
{timestamp=0, type=1, value={generator='test'}}
}, {
@@ -2031,11 +2093,11 @@ describe('In autoload/shada.vim', function()
nvim('set_var', 'shada#add_own_header', 1)
getbstrings_eq({{timestamp='current', type=1, value={
generator='shada.vim',
- version=704,
+ version=version,
}}}, {})
getbstrings_eq({
{timestamp='current', type=1, value={
- generator='shada.vim', version=704
+ generator='shada.vim', version=version
}},
{timestamp=0, type=1, value={generator='test'}}
}, {
@@ -2075,8 +2137,9 @@ describe('In autoload/shada.vim', function()
end)
end)
-describe('In plugin/shada.vim', function()
+describe('plugin/shada.vim', function()
local epoch = os.date('%Y-%m-%dT%H:%M:%S', 0)
+ local eol = helpers.iswin() and '\r\n' or '\n'
before_each(function()
reset()
os.remove(fname)
@@ -2090,9 +2153,7 @@ describe('In plugin/shada.vim', function()
end)
local shada_eq = function(expected, fname_)
- local fd = io.open(fname_)
- local mpack_result = fd:read('*a')
- fd:close()
+ local mpack_result = read_file(fname_)
mpack_eq(expected, mpack_result)
end
@@ -2216,7 +2277,7 @@ describe('In plugin/shada.vim', function()
' + f file name ["foo"]',
' + l line number 2',
' + c column -200',
- }, '\n') .. '\n', io.open(fname .. '.tst'):read('*a'))
+ }, eol) .. eol, read_file(fname .. '.tst'))
shada_eq({{
timestamp=0,
type=8,
@@ -2263,7 +2324,7 @@ describe('In plugin/shada.vim', function()
'Jump with timestamp ' .. epoch .. ':',
' % Key________ Description Value',
' + n name \'A\'',
- }, '\n') .. '\n', io.open(fname .. '.tst'):read('*a'))
+ }, eol) .. eol, read_file(fname .. '.tst'))
shada_eq({{
timestamp=0,
type=8,
@@ -2320,7 +2381,7 @@ describe('In plugin/shada.vim', function()
' + f file name ["foo"]',
' + l line number 2',
' + c column -200',
- }, '\n') .. '\n', io.open(fname .. '.tst'):read('*a'))
+ }, eol) .. eol, read_file(fname .. '.tst'))
shada_eq({{
timestamp=0,
type=8,
@@ -2461,17 +2522,17 @@ describe('ftplugin/shada.vim', function()
nvim_command('setlocal filetype=shada')
funcs.setline(1, ' Replacement with timestamp ' .. epoch)
nvim_feed('ggA:\027')
- eq('Replacement with timestamp ' .. epoch .. ':', curbuf('get_line', 0))
+ eq('Replacement with timestamp ' .. epoch .. ':', curbuf('get_lines', 0, 1, true)[1])
nvim_feed('o-\027')
- eq(' -', curbuf('get_line', 1))
+ eq({' -'}, curbuf('get_lines', 1, 2, true))
nvim_feed('ggO+\027')
- eq('+', curbuf('get_line', 0))
+ eq({'+'}, curbuf('get_lines', 0, 1, true))
nvim_feed('GO*\027')
- eq(' *', curbuf('get_line', 2))
+ eq({' *'}, curbuf('get_lines', 2, 3, true))
nvim_feed('ggO /\027')
- eq(' /', curbuf('get_line', 0))
+ eq({' /'}, curbuf('get_lines', 0, 1, true))
nvim_feed('ggOx\027')
- eq('x', curbuf('get_line', 0))
+ eq({'x'}, curbuf('get_lines', 0, 1, true))
end)
end)
diff --git a/test/functional/provider/define_spec.lua b/test/functional/provider/define_spec.lua
index b0363eb435..51a8831274 100644
--- a/test/functional/provider/define_spec.lua
+++ b/test/functional/provider/define_spec.lua
@@ -3,7 +3,6 @@ local eval, command, nvim = helpers.eval, helpers.command, helpers.nvim
local eq, run, stop = helpers.eq, helpers.run, helpers.stop
local clear = helpers.clear
-
local function get_prefix(sync)
if sync then
return 'sync'
@@ -11,12 +10,10 @@ local function get_prefix(sync)
return 'async'
end
-
local function call(fn, arguments)
command('call '..fn..'('..arguments..')')
end
-
local function clear_and_init(init)
return function()
clear()
@@ -26,7 +23,6 @@ local function clear_and_init(init)
end
end
-
local function runx(sync, handler, on_setup)
local function setup_cb(...)
on_setup(...)
diff --git a/test/functional/provider/nodejs_spec.lua b/test/functional/provider/nodejs_spec.lua
new file mode 100644
index 0000000000..07a00f8a8c
--- /dev/null
+++ b/test/functional/provider/nodejs_spec.lua
@@ -0,0 +1,55 @@
+local helpers = require('test.functional.helpers')(after_each)
+local eq, clear = helpers.eq, helpers.clear
+local missing_provider = helpers.missing_provider
+local command = helpers.command
+local write_file = helpers.write_file
+local eval = helpers.eval
+local retry = helpers.retry
+
+do
+ clear()
+ if missing_provider('node') then
+ pending("Missing nodejs host, or nodejs version is too old.", function()end)
+ return
+ end
+end
+
+before_each(function()
+ clear()
+end)
+
+describe('nodejs host', function()
+ teardown(function ()
+ os.remove('Xtest-nodejs-hello.js')
+ os.remove('Xtest-nodejs-hello-plugin.js')
+ end)
+
+ it('works', function()
+ local fname = 'Xtest-nodejs-hello.js'
+ write_file(fname, [[
+ const neovim = require('neovim');
+ const nvim = neovim.attach({socket: process.env.NVIM_LISTEN_ADDRESS});
+ nvim.command('let g:job_out = "hello"');
+ ]])
+ command('let g:job_id = jobstart(["node", "'..fname..'"])')
+ retry(nil, 3000, function() eq('hello', eval('g:job_out')) end)
+ end)
+ it('plugin works', function()
+ local fname = 'Xtest-nodejs-hello-plugin.js'
+ write_file(fname, [[
+ const neovim = require('neovim');
+ const nvim = neovim.attach({socket: process.env.NVIM_LISTEN_ADDRESS});
+
+ class TestPlugin {
+ hello() {
+ this.nvim.command('let g:job_out = "hello-plugin"');
+ }
+ }
+ const PluginClass = neovim.Plugin(TestPlugin);
+ const plugin = new neovim.NvimPlugin(null, PluginClass, nvim);
+ plugin.instance.hello();
+ ]])
+ command('let g:job_id = jobstart(["node", "'..fname..'"])')
+ retry(nil, 3000, function() eq('hello-plugin', eval('g:job_out')) end)
+ end)
+end)
diff --git a/test/functional/provider/python3_spec.lua b/test/functional/provider/python3_spec.lua
index a4e9a49c8a..3a33109079 100644
--- a/test/functional/provider/python3_spec.lua
+++ b/test/functional/provider/python3_spec.lua
@@ -2,20 +2,25 @@ local helpers = require('test.functional.helpers')(after_each)
local eval, command, feed = helpers.eval, helpers.command, helpers.feed
local eq, clear, insert = helpers.eq, helpers.clear, helpers.insert
local expect, write_file = helpers.expect, helpers.write_file
+local expect_err = helpers.expect_err
+local feed_command = helpers.feed_command
+local source = helpers.source
+local missing_provider = helpers.missing_provider
do
clear()
- command('let [g:interp, g:errors] = provider#pythonx#Detect(3)')
- local errors = eval('g:errors')
- if errors ~= '' then
- pending(
- 'Python 3 (or the Python 3 neovim module) is broken or missing:\n' .. errors,
- function() end)
+ if missing_provider('python3') then
+ it(':python3 reports E319 if provider is missing', function()
+ local expected = [[Vim%(py3.*%):E319: No "python3" provider found.*]]
+ expect_err(expected, command, 'py3 print("foo")')
+ expect_err(expected, command, 'py3file foo')
+ end)
+ pending('Python 3 (or the pynvim module) is broken/missing', function() end)
return
end
end
-describe('python3 commands and functions', function()
+describe('python3 provider', function()
before_each(function()
clear()
command('python3 import vim')
@@ -30,6 +35,15 @@ describe('python3 commands and functions', function()
eq({100, 0}, eval('g:set_by_python3'))
end)
+ it('does not truncate error message <1 MB', function()
+ -- XXX: Python limits the error name to 200 chars, so this test is
+ -- mostly bogus.
+ local very_long_symbol = string.rep('a', 1200)
+ feed_command(':silent! py3 print('..very_long_symbol..' b)')
+ -- Truncated error message would not contain this (last) line.
+ eq('SyntaxError: invalid syntax', eval('v:errmsg'))
+ end)
+
it('python3_execute with nested commands', function()
command([[python3 vim.command('python3 vim.command("python3 vim.command(\'let set_by_nested_python3 = 555\')")')]])
eq(555, eval('g:set_by_nested_python3'))
@@ -75,4 +89,20 @@ describe('python3 commands and functions', function()
it('py3eval', function()
eq({1, 2, {['key'] = 'val'}}, eval([[py3eval('[1, 2, {"key": "val"}]')]]))
end)
+
+ it('RPC call to expand("<afile>") during BufDelete #5245 #5617', function()
+ source([=[
+ python3 << EOF
+ import vim
+ def foo():
+ vim.eval('expand("<afile>:p")')
+ vim.eval('bufnr(expand("<afile>:p"))')
+ EOF
+ autocmd BufDelete * python3 foo()
+ autocmd BufUnload * python3 foo()]=])
+ feed_command("exe 'split' tempname()")
+ feed_command("bwipeout!")
+ feed_command('help help')
+ eq(2, eval('1+1')) -- Still alive?
+ end)
end)
diff --git a/test/functional/provider/python_spec.lua b/test/functional/provider/python_spec.lua
index 94dfa90ea8..869cfd1721 100644
--- a/test/functional/provider/python_spec.lua
+++ b/test/functional/provider/python_spec.lua
@@ -8,19 +8,22 @@ local funcs = helpers.funcs
local meths = helpers.meths
local insert = helpers.insert
local expect = helpers.expect
+local expect_err = helpers.expect_err
local command = helpers.command
local exc_exec = helpers.exc_exec
local write_file = helpers.write_file
local curbufmeths = helpers.curbufmeths
+local missing_provider = helpers.missing_provider
do
clear()
- command('let [g:interp, g:errors] = provider#pythonx#Detect(2)')
- local errors = meths.get_var('errors')
- if errors ~= '' then
- pending(
- 'Python 2 (or the Python 2 neovim module) is broken or missing:\n' .. errors,
- function() end)
+ if missing_provider('python') then
+ it(':python reports E319 if provider is missing', function()
+ local expected = [[Vim%(py.*%):E319: No "python" provider found.*]]
+ expect_err(expected, command, 'py print("foo")')
+ expect_err(expected, command, 'pyfile foo')
+ end)
+ pending('Python 2 (or the pynvim module) is broken/missing', function() end)
return
end
end
diff --git a/test/functional/provider/ruby_spec.lua b/test/functional/provider/ruby_spec.lua
new file mode 100644
index 0000000000..62ac91a929
--- /dev/null
+++ b/test/functional/provider/ruby_spec.lua
@@ -0,0 +1,108 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local clear = helpers.clear
+local command = helpers.command
+local curbufmeths = helpers.curbufmeths
+local eq = helpers.eq
+local eval = helpers.eval
+local expect = helpers.expect
+local expect_err = helpers.expect_err
+local feed = helpers.feed
+local feed_command = helpers.feed_command
+local funcs = helpers.funcs
+local insert = helpers.insert
+local meths = helpers.meths
+local missing_provider = helpers.missing_provider
+local write_file = helpers.write_file
+
+do
+ clear()
+ if missing_provider('ruby') then
+ it(':ruby reports E319 if provider is missing', function()
+ local expected = [[Vim%(ruby.*%):E319: No "ruby" provider found.*]]
+ expect_err(expected, command, 'ruby puts "foo"')
+ expect_err(expected, command, 'rubyfile foo')
+ end)
+ pending("Missing neovim RubyGem.", function() end)
+ return
+ end
+end
+
+before_each(function()
+ clear()
+end)
+
+describe('ruby feature test', function()
+ it('works', function()
+ eq(1, funcs.has('ruby'))
+ end)
+end)
+
+describe(':ruby command', function()
+ it('evaluates ruby', function()
+ command('ruby VIM.command("let g:set_by_ruby = [100, 0]")')
+ eq({100, 0}, meths.get_var('set_by_ruby'))
+ end)
+
+ it('supports nesting', function()
+ command([[ruby VIM.command('ruby VIM.command("let set_by_nested_ruby = 555")')]])
+ eq(555, meths.get_var('set_by_nested_ruby'))
+ end)
+end)
+
+describe(':rubyfile command', function()
+ it('evaluates a ruby file', function()
+ local fname = 'rubyfile.rb'
+ write_file(fname, 'VIM.command("let set_by_rubyfile = 123")')
+ command('rubyfile rubyfile.rb')
+ eq(123, meths.get_var('set_by_rubyfile'))
+ os.remove(fname)
+ end)
+end)
+
+describe(':rubydo command', function()
+ it('exposes the $_ variable for modifying lines', function()
+ insert('abc\ndef\nghi\njkl')
+ expect([[
+ abc
+ def
+ ghi
+ jkl]])
+
+ feed('ggjvj:rubydo $_.upcase!<CR>')
+ expect([[
+ abc
+ DEF
+ GHI
+ jkl]])
+ end)
+
+ it('operates on all lines when not given a range', function()
+ insert('abc\ndef\nghi\njkl')
+ expect([[
+ abc
+ def
+ ghi
+ jkl]])
+
+ feed(':rubydo $_.upcase!<CR>')
+ expect([[
+ ABC
+ DEF
+ GHI
+ JKL]])
+ end)
+
+ it('does not modify the buffer if no changes are made', function()
+ command('normal :rubydo 42')
+ eq(false, curbufmeths.get_option('modified'))
+ end)
+end)
+
+describe('ruby provider', function()
+ it('RPC call to expand("<afile>") during BufDelete #5245 #5617', function()
+ command([=[autocmd BufDelete * ruby VIM::evaluate('expand("<afile>")')]=])
+ feed_command('help help')
+ eq(2, eval('1+1')) -- Still alive?
+ end)
+end)
diff --git a/test/functional/shada/buffers_spec.lua b/test/functional/shada/buffers_spec.lua
index e4d02c268b..a4746c2205 100644
--- a/test/functional/shada/buffers_spec.lua
+++ b/test/functional/shada/buffers_spec.lua
@@ -78,13 +78,25 @@ describe('ShaDa support code', function()
it('does not dump unnamed buffers', function()
set_additional_cmd('set shada+=% hidden')
reset()
- curbufmeths.set_line(0, 'foo')
+ curbufmeths.set_lines(0, 1, true, {'foo'})
nvim_command('enew')
- curbufmeths.set_line(0, 'bar')
+ curbufmeths.set_lines(0, 1, true, {'bar'})
eq(2, funcs.bufnr('$'))
nvim_command('qall!')
reset()
eq(1, funcs.bufnr('$'))
eq('', funcs.bufname(1))
end)
+
+ it('restores 1 buffer with %1 in &shada, #5759', function()
+ set_additional_cmd('set shada+=%1')
+ reset()
+ nvim_command('edit ' .. testfilename)
+ nvim_command('edit ' .. testfilename_2)
+ nvim_command('qall')
+ reset()
+ eq(2, funcs.bufnr('$'))
+ eq('', funcs.bufname(1))
+ eq(testfilename, funcs.bufname(2))
+ end)
end)
diff --git a/test/functional/shada/compatibility_spec.lua b/test/functional/shada/compatibility_spec.lua
index 1287ac010c..a5ef60d91f 100644
--- a/test/functional/shada/compatibility_spec.lua
+++ b/test/functional/shada/compatibility_spec.lua
@@ -10,6 +10,13 @@ local read_shada_file = shada_helpers.read_shada_file
local wshada, sdrcmd, shada_fname = get_shada_rw('Xtest-functional-shada-compatibility.shada')
+local mock_file_path = '/a/b/'
+local mock_file_path2 = '/d/e/'
+if helpers.iswin() then
+ mock_file_path = 'C:/a/'
+ mock_file_path2 = 'C:/d/'
+end
+
describe('ShaDa forward compatibility support code', function()
before_each(reset)
after_each(function()
@@ -114,14 +121,14 @@ describe('ShaDa forward compatibility support code', function()
funcs.garbagecollect(1)
end)
- for _, v in ipairs({{name='global mark', mpack='\007\001\018\131\162mX\195\161f\196\006/a/b/c\161nA'},
- {name='jump', mpack='\008\001\018\131\162mX\195\161f\196\006/a/b/c\161l\002'},
- {name='local mark', mpack='\010\001\018\131\162mX\195\161f\196\006/a/b/c\161na'},
- {name='change', mpack='\011\001\015\130\162mX\195\161f\196\006/a/b/c'},
+ for _, v in ipairs({{name='global mark', mpack='\007\001\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161nA'},
+ {name='jump', mpack='\008\001\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161l\002'},
+ {name='local mark', mpack='\010\001\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161na'},
+ {name='change', mpack='\011\001\015\130\162mX\195\161f\196\006' .. mock_file_path .. 'c'},
}) do
it('works with ' .. v.name .. ' item with BOOL unknown (mX) key value', function()
- nvim_command('silent noautocmd edit /a/b/c')
- eq('/a/b/c', funcs.bufname('%'))
+ nvim_command('silent noautocmd edit ' .. mock_file_path .. 'c')
+ eq('' .. mock_file_path .. 'c', funcs.bufname('%'))
funcs.setline('.', {'1', '2', '3'})
wshada(v.mpack)
eq(0, exc_exec(sdrcmd(true)))
@@ -159,12 +166,12 @@ describe('ShaDa forward compatibility support code', function()
if v.name == 'global mark' or v.name == 'local mark' then
it('works with ' .. v.name .. ' item with <C-a> name', function()
- nvim_command('silent noautocmd edit /a/b/c')
- eq('/a/b/c', funcs.bufname('%'))
+ nvim_command('silent noautocmd edit ' .. mock_file_path .. 'c')
+ eq('' .. mock_file_path .. 'c', funcs.bufname('%'))
funcs.setline('.', {'1', '2', '3'})
wshada(v.mpack:gsub('n.$', 'n\001')
.. v.mpack:gsub('n.$', 'n\002')
- .. v.mpack:gsub('n.$', 'n\003'):gsub('/a/b/c', '/d/e/f'))
+ .. v.mpack:gsub('n.$', 'n\003'):gsub('' .. mock_file_path .. 'c', '' .. mock_file_path2 .. 'f'))
eq(0, exc_exec(sdrcmd(true)))
nvim_command('wshada ' .. shada_fname)
local found = 0
@@ -307,10 +314,10 @@ describe('ShaDa forward compatibility support code', function()
it('works with buffer list item with BOOL unknown (bX) key', function()
nvim_command('set shada+=%')
- wshada('\009\000\016\145\130\161f\196\006/a/b/c\162bX\195')
+ wshada('\009\000\016\145\130\161f\196\006' .. mock_file_path .. 'c\162bX\195')
eq(0, exc_exec(sdrcmd()))
eq(2, funcs.bufnr('$'))
- eq('/a/b/c', funcs.bufname(2))
+ eq('' .. mock_file_path .. 'c', funcs.bufname(2))
os.remove(shada_fname)
nvim_command('wshada ' .. shada_fname)
local found = false
diff --git a/test/functional/shada/errors_spec.lua b/test/functional/shada/errors_spec.lua
index 98ead6cc3d..66c8c4ad2f 100644
--- a/test/functional/shada/errors_spec.lua
+++ b/test/functional/shada/errors_spec.lua
@@ -17,9 +17,9 @@ describe('ShaDa error handling', function()
clean()
end)
- -- Note: most of tests have additional items like sX, mX, rX. These are for
- -- valgrind tests, to check for memory leaks (i.e. whether error handling code
- -- does (not) forget to call ga_clear). Not needed for array-based items like
+ -- Note: most of tests have additional items like sX, mX, rX. These are for
+ -- valgrind tests, to check for memory leaks (i.e. whether error handling code
+ -- does (not) forget to call ga_clear). Not needed for array-based items like
-- history because they are not using ad_ga.
it('does not fail on empty file', function()
@@ -69,15 +69,15 @@ describe('ShaDa error handling', function()
end)
it('fails on search pattern item with invalid byte', function()
- -- 195 (== 0xC1) cannot start any valid messagepack entry (the only byte
+ -- 195 (== 0xC1) cannot start any valid messagepack entry (the only byte
-- that cannot do this). Specifically unpack_template.h contains
--
-- //case 0xc1: // string
-- // again_terminal_trail(NEXT_CS(p), p+1);
--
- -- (literally: commented out code) which means that in place of this code
- -- `goto _failed` is used from default: case. I do not know any other way to
- -- get MSGPACK_UNPACK_PARSE_ERROR and not MSGPACK_UNPACK_CONTINUE or
+ -- (literally: commented out code) which means that in place of this code
+ -- `goto _failed` is used from default: case. I do not know any other way to
+ -- get MSGPACK_UNPACK_PARSE_ERROR and not MSGPACK_UNPACK_CONTINUE or
-- MSGPACK_UNPACK_EXTRA_BYTES.
wshada('\002\000\001\193')
eq('Vim(rshada):E576: Failed to parse ShaDa file due to a msgpack parser error at position 3', exc_exec(sdrcmd()))
@@ -497,7 +497,7 @@ $
it('errors when a funcref is stored in a variable', function()
nvim_command('let F = function("tr")')
nvim_command('set shada+=!')
- eq('\nE951: Error while dumping variable g:F, itself: attempt to dump function reference'
+ eq('\nE5004: Error while dumping variable g:F, itself: attempt to dump function reference'
.. '\nE574: Failed to write variable F',
redir_exec('wshada'))
end)
@@ -506,8 +506,26 @@ $
nvim_command('let L = []')
nvim_command('call add(L, L)')
nvim_command('set shada+=!')
- eq('\nE952: Unable to dump variable g:L: container references itself in index 0'
+ eq('\nE5005: Unable to dump variable g:L: container references itself in index 0'
.. '\nE574: Failed to write variable L',
redir_exec('wshada'))
end)
+
+ it('errors with too large items', function()
+ wshada({
+ 1, 206, 70, 90, 31, 179, 86, 133, 169, 103, 101, 110, 101, 114, 97,
+ 116, 111, 114, 196, 4, 145, 145, 145, 145, 145, 145, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 145, 145, 145, 145, 111, 110, 196, 25, 78, 86, 73, 77, 32,
+ 118, 1, 46, 50, 46, 48, 45, 51, 48, 51, 45, 103, 98, 54, 55,
+ 52, 102, 100, 50, 99, 169, 109, 97, 120, 95, 107, 98, 121, 116, 101,
+ 10, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
+ 207, 207, 207, 207, 207, 207, 207, 207, 16, 8, 206, 89, 90, 30, 253,
+ 35, 129, 161, 102, 196, 30, 47, 100, 101, 118, 47, 115, 104, 109, 47,
+ 102, 117, 122, 122, 105, 110, 103, 45, 110, 118, 105, 109, 45, 115, 104,
+ 97, 100, 97, 47, 108, 115, 2, 206, 89, 90, 30, 251, 13, 130, 162,
+ 115, 112, 196, 3, 102, 111, 111, 162, 115, 99, 195, 3, 146, 10, 0,
+ })
+ eq('Vim(rshada):E576: Error while reading ShaDa file: there is an item at position 93 that is stated to be too long', exc_exec(sdrcmd()))
+ end)
end)
diff --git a/test/functional/shada/helpers.lua b/test/functional/shada/helpers.lua
index bb2919d4fb..d5e061bb50 100644
--- a/test/functional/shada/helpers.lua
+++ b/test/functional/shada/helpers.lua
@@ -5,33 +5,43 @@ local write_file, merge_args = helpers.write_file, helpers.merge_args
local mpack = require('mpack')
-local tmpname = os.tmpname()
-local additional_cmd = ''
+local tmpname = helpers.tmpname()
+local append_argv = nil
-local function nvim_argv()
- local argv = {nvim_prog, '-u', 'NONE', '-i', tmpname, '-N',
+local function nvim_argv(shada_file, embed)
+ if embed == nil then
+ embed = true
+ end
+ local argv = {nvim_prog, '-u', 'NONE', '-i', shada_file or tmpname, '-N',
'--cmd', 'set shortmess+=I background=light noswapfile',
- '--cmd', additional_cmd,
- '--embed'}
- if helpers.prepend_argv then
- return merge_args(helpers.prepend_argv, argv)
+ '--headless', embed and '--embed' or nil}
+ if helpers.prepend_argv or append_argv then
+ return merge_args(helpers.prepend_argv, argv, append_argv)
else
return argv
end
end
-local reset = function()
- set_session(spawn(nvim_argv()))
+local reset = function(shada_file)
+ set_session(spawn(nvim_argv(shada_file)))
meths.set_var('tmpname', tmpname)
end
local set_additional_cmd = function(s)
- additional_cmd = s
+ append_argv = {'--cmd', s}
+end
+
+local function add_argv(...)
+ if select('#', ...) == 0 then
+ append_argv = nil
+ else
+ append_argv = {...}
+ end
end
local clear = function()
os.remove(tmpname)
- set_additional_cmd('')
+ append_argv = nil
end
local get_shada_rw = function(fname)
@@ -80,7 +90,9 @@ end
return {
reset=reset,
set_additional_cmd=set_additional_cmd,
+ add_argv=add_argv,
clear=clear,
get_shada_rw=get_shada_rw,
read_shada_file=read_shada_file,
+ nvim_argv=nvim_argv,
}
diff --git a/test/functional/shada/history_spec.lua b/test/functional/shada/history_spec.lua
index 22e653b1d6..c4be9e563d 100644
--- a/test/functional/shada/history_spec.lua
+++ b/test/functional/shada/history_spec.lua
@@ -4,9 +4,7 @@ local nvim_command, funcs, meths, nvim_feed, eq =
helpers.command, helpers.funcs, helpers.meths, helpers.feed, helpers.eq
local shada_helpers = require('test.functional.shada.helpers')
-local reset, set_additional_cmd, clear =
- shada_helpers.reset, shada_helpers.set_additional_cmd,
- shada_helpers.clear
+local reset, clear = shada_helpers.reset, shada_helpers.clear
describe('ShaDa support code', function()
before_each(reset)
@@ -173,158 +171,57 @@ describe('ShaDa support code', function()
eq('goo', funcs.getline(1))
end)
- it('dumps and loads history correctly when &encoding is not UTF-8', function()
- set_additional_cmd('set encoding=latin1')
+ it('dumps and loads history with UTF-8 characters', function()
reset()
- -- \171 is U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK in latin1
- nvim_feed(':echo "\171"\n')
- nvim_command('qall')
- reset()
- eq('echo "\171"', funcs.histget(':', -1))
- end)
-
- it('dumps and loads history correctly when &encoding /= UTF-8 when dumping',
- function()
- set_additional_cmd('set encoding=latin1')
- reset()
- -- \171 is U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK in latin1
- nvim_feed(':echo "\171"\n')
- set_additional_cmd('')
- nvim_command('qall')
- reset()
- eq('echo "ยซ"', funcs.histget(':', -1))
- end)
-
- it('dumps and loads history correctly when &encoding /= UTF-8 when loading',
- function()
- -- \171 is U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK in latin1
nvim_feed(':echo "ยซ"\n')
- set_additional_cmd('set encoding=latin1')
nvim_command('qall')
reset()
- eq('echo "\171"', funcs.histget(':', -1))
+ eq('echo "ยซ"', funcs.histget(':', -1))
end)
- it('dumps and loads replacement correctly when &encoding is not UTF-8',
+ it('dumps and loads replacement with UTF-8 characters',
function()
- set_additional_cmd('set encoding=latin1')
- reset()
- -- \171 is U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK in latin1
- nvim_command('substitute/./\171/ge')
+ nvim_command('substitute/./ยซ/ge')
nvim_command('qall!')
reset()
funcs.setline('.', {'.'})
nvim_command('&')
- eq('\171', funcs.getline('.'))
- end)
-
- it('dumps&loads replacement correctly when &encoding /= UTF-8 when dumping',
- function()
- set_additional_cmd('set encoding=latin1')
- reset()
- -- \171 is U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK in latin1
- nvim_command('substitute/./\171/ge')
- set_additional_cmd('')
- nvim_command('qall')
- reset()
- funcs.setline('.', {'.'})
- nvim_command('&')
eq('ยซ', funcs.getline('.'))
end)
- it('dumps&loads replacement correctly when &encoding /= UTF-8 when loading',
- function()
- -- \171 is U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK in latin1
- nvim_command('substitute/./ยซ/ge')
- set_additional_cmd('set encoding=latin1')
- nvim_command('qall')
- reset()
- funcs.setline('.', {'.'})
- nvim_command('&')
- eq('\171', funcs.getline('.'))
- end)
-
- it('dumps and loads substitute pattern correctly when &encoding is not UTF-8',
+ it('dumps and loads substitute pattern with UTF-8 characters',
function()
- set_additional_cmd('set encoding=latin1')
- reset()
- -- \171 is U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK in latin1
- nvim_command('substitute/\171/./ge')
+ nvim_command('substitute/ยซ/./ge')
nvim_command('qall!')
reset()
- funcs.setline('.', {'\171ยซ'})
- nvim_command('&')
- eq('.ยซ', funcs.getline('.'))
- end)
-
- it('dumps&loads s/pattern correctly when &encoding /= UTF-8 when dumping',
- function()
- set_additional_cmd('set encoding=latin1')
- reset()
- -- \171 is U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK in latin1
- nvim_command('substitute/\171/./ge')
- set_additional_cmd('')
- nvim_command('qall')
- reset()
funcs.setline('.', {'ยซ\171'})
nvim_command('&')
eq('.\171', funcs.getline('.'))
end)
- it('dumps&loads s/pattern correctly when &encoding /= UTF-8 when loading',
+ it('dumps and loads search pattern with UTF-8 characters',
function()
- -- \171 is U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK in latin1
- nvim_command('substitute/ยซ/./ge')
- set_additional_cmd('set encoding=latin1')
- nvim_command('qall')
- reset()
- funcs.setline('.', {'\171ยซ'})
- nvim_command('&')
- eq('.ยซ', funcs.getline('.'))
- end)
-
- it('dumps and loads search pattern correctly when &encoding is not UTF-8',
- function()
- set_additional_cmd('set encoding=latin1')
- reset()
- -- \171 is U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK in latin1
- nvim_command('silent! /\171/')
+ nvim_command('silent! /ยซ/')
nvim_command('set shada+=/0')
nvim_command('qall!')
reset()
funcs.setline('.', {'\171ยซ'})
nvim_command('~&')
- eq('ยซ', funcs.getline('.'))
- eq('', funcs.histget('/', -1))
- end)
-
- it('dumps&loads /pattern correctly when &encoding /= UTF-8 when dumping',
- function()
- set_additional_cmd('set encoding=latin1')
- reset()
- -- \171 is U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK in latin1
- nvim_command('silent! /\171/')
- nvim_command('set shada+=/0')
- set_additional_cmd('')
- nvim_command('qall')
- reset()
- funcs.setline('.', {'ยซ\171'})
- nvim_command('~&')
eq('\171', funcs.getline('.'))
eq('', funcs.histget('/', -1))
end)
- it('dumps&loads /pattern correctly when &encoding /= UTF-8 when loading',
+ it('dumps and loads search pattern with 8-bit single-byte',
function()
-- \171 is U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK in latin1
- nvim_command('silent! /ยซ/')
+ nvim_command('silent! /\171/')
nvim_command('set shada+=/0')
- set_additional_cmd('set encoding=latin1')
- nvim_command('qall')
+ nvim_command('qall!')
reset()
funcs.setline('.', {'\171ยซ'})
nvim_command('~&')
eq('ยซ', funcs.getline('.'))
eq('', funcs.histget('/', -1))
end)
+
end)
diff --git a/test/functional/shada/marks_spec.lua b/test/functional/shada/marks_spec.lua
index ace3c74a62..c2f6351e00 100644
--- a/test/functional/shada/marks_spec.lua
+++ b/test/functional/shada/marks_spec.lua
@@ -9,6 +9,8 @@ local shada_helpers = require('test.functional.shada.helpers')
local reset, set_additional_cmd, clear =
shada_helpers.reset, shada_helpers.set_additional_cmd,
shada_helpers.clear
+local add_argv = shada_helpers.add_argv
+local nvim_argv = shada_helpers.nvim_argv
local nvim_current_line = function()
return curwinmeths.get_cursor()[1]
@@ -17,8 +19,10 @@ end
describe('ShaDa support code', function()
local testfilename = 'Xtestfile-functional-shada-marks'
local testfilename_2 = 'Xtestfile-functional-shada-marks-2'
+ local non_existent_testfilename = testfilename .. '.nonexistent'
before_each(function()
reset()
+ os.remove(non_existent_testfilename)
local fd = io.open(testfilename, 'w')
fd:write('test\n')
fd:write('test2\n')
@@ -100,6 +104,18 @@ describe('ShaDa support code', function()
eq(2, nvim_current_line())
end)
+ it('is able to dump and read back mark " from a closed tab', function()
+ nvim_command('edit ' .. testfilename)
+ nvim_command('tabedit ' .. testfilename_2)
+ nvim_command('2')
+ nvim_command('q!')
+ nvim_command('qall')
+ reset()
+ nvim_command('edit ' .. testfilename_2)
+ nvim_command('normal! `"')
+ eq(2, nvim_current_line())
+ end)
+
it('is able to populate v:oldfiles', function()
nvim_command('edit ' .. testfilename)
local tf_full = curbufmeths.get_name()
@@ -139,6 +155,19 @@ describe('ShaDa support code', function()
eq(saved, redir_exec('jumps'))
end)
+ it('when dumping jump list also dumps current position', function()
+ nvim_command('edit ' .. testfilename)
+ nvim_command('normal! G')
+ nvim_command('split ' .. testfilename_2)
+ nvim_command('normal! G')
+ nvim_command('wshada')
+ nvim_command('quit')
+ nvim_command('rshada')
+ nvim_command('normal! \15') -- <C-o>
+ eq(testfilename_2, funcs.bufname('%'))
+ eq({2, 0}, curwinmeths.get_cursor())
+ end)
+
it('is able to dump and restore jump list with different times (slow!)',
function()
nvim_command('edit ' .. testfilename_2)
@@ -180,8 +209,8 @@ describe('ShaDa support code', function()
reset()
nvim_command('edit ' .. testfilename)
nvim_command('normal! Gg;')
- -- Note: without โ€œsyncโ€ โ€œcommandsโ€ test has good changes to fail for unknown
- -- reason (in first eq expected 1 is compared with 2). Any command inserted
+ -- Note: without โ€œsyncโ€ โ€œcommandsโ€ test has good changes to fail for unknown
+ -- reason (in first eq expected 1 is compared with 2). Any command inserted
-- causes this to work properly.
nvim_command('" sync')
eq(1, nvim_current_line())
@@ -189,4 +218,23 @@ describe('ShaDa support code', function()
nvim_command('" sync 2')
eq(2, nvim_current_line())
end)
+
+ -- -c temporary sets lnum to zero to make `+/pat` work, so calling setpcmark()
+ -- during -c used to add item with zero lnum to jump list.
+ it('does not create incorrect file for non-existent buffers when writing from -c',
+ function()
+ add_argv('--cmd', 'silent edit ' .. non_existent_testfilename, '-c', 'qall')
+ local argv = nvim_argv(nil, false) -- no --embed
+ eq('', funcs.system(argv))
+ eq(0, exc_exec('rshada'))
+ end)
+
+ it('does not create incorrect file for non-existent buffers opened from -c',
+ function()
+ add_argv('-c', 'silent edit ' .. non_existent_testfilename,
+ '-c', 'autocmd VimEnter * qall')
+ local argv = nvim_argv(nil, false) -- no --embed
+ eq('', funcs.system(argv))
+ eq(0, exc_exec('rshada'))
+ end)
end)
diff --git a/test/functional/shada/merging_spec.lua b/test/functional/shada/merging_spec.lua
index 25c73b99eb..a628baff53 100644
--- a/test/functional/shada/merging_spec.lua
+++ b/test/functional/shada/merging_spec.lua
@@ -13,6 +13,11 @@ local read_shada_file = shada_helpers.read_shada_file
local wshada, sdrcmd, shada_fname =
get_shada_rw('Xtest-functional-shada-merging.shada')
+local mock_file_path = '/a/b/'
+if helpers.iswin() then
+ mock_file_path = 'C:/a/'
+end
+
describe('ShaDa history merging code', function()
before_each(reset)
after_each(function()
@@ -512,19 +517,98 @@ describe('ShaDa marks support code', function()
it('uses last A mark with gt timestamp from instance when reading',
function()
- wshada('\007\001\018\131\162mX\195\161f\196\006/a/b/-\161nA')
+ wshada('\007\001\018\131\162mX\195\161f\196\006' .. mock_file_path .. '-\161nA')
eq(0, exc_exec(sdrcmd()))
- wshada('\007\000\018\131\162mX\195\161f\196\006/a/b/?\161nA')
+ wshada('\007\000\018\131\162mX\195\161f\196\006' .. mock_file_path .. '?\161nA')
eq(0, exc_exec(sdrcmd()))
nvim_command('normal! `A')
eq('-', funcs.fnamemodify(curbufmeths.get_name(), ':t'))
end)
+ it('can merge with file with mark 9 as the only numeric mark', function()
+ wshada('\007\001\014\130\161f\196\006' .. mock_file_path .. '-\161n9')
+ eq(0, exc_exec(sdrcmd()))
+ nvim_command('normal! `9oabc')
+ eq('-', funcs.fnamemodify(curbufmeths.get_name(), ':t'))
+ eq(0, exc_exec('wshada ' .. shada_fname))
+ local found = {}
+ for _, v in ipairs(read_shada_file(shada_fname)) do
+ if v.type == 7 and v.value.f == mock_file_path .. '-' then
+ local name = ('%c'):format(v.value.n)
+ found[name] = (found[name] or 0) + 1
+ end
+ end
+ eq({['0']=1, ['1']=1}, found)
+ end)
+
+ it('removes duplicates while merging', function()
+ wshada('\007\001\014\130\161f\196\006' .. mock_file_path .. '-\161n9'
+ .. '\007\001\014\130\161f\196\006' .. mock_file_path .. '-\161n9')
+ eq(0, exc_exec(sdrcmd()))
+ eq(0, exc_exec('wshada ' .. shada_fname))
+ local found = 0
+ for _, v in ipairs(read_shada_file(shada_fname)) do
+ if v.type == 7 and v.value.f == mock_file_path .. '-' then
+ print(require('test.helpers').format_luav(v))
+ found = found + 1
+ end
+ end
+ eq(1, found)
+ end)
+
+ it('does not leak when no append is performed due to too many marks',
+ function()
+ wshada('\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'a\161n0'
+ .. '\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'b\161n1'
+ .. '\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161n2'
+ .. '\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'd\161n3'
+ .. '\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'e\161n4'
+ .. '\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'f\161n5'
+ .. '\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'g\161n6'
+ .. '\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'h\161n7'
+ .. '\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'i\161n8'
+ .. '\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'j\161n9'
+ .. '\007\001\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'k\161n9')
+ eq(0, exc_exec(sdrcmd()))
+ eq(0, exc_exec('wshada ' .. shada_fname))
+ local found = {}
+ for _, v in ipairs(read_shada_file(shada_fname)) do
+ if v.type == 7 and v.value.f:sub(1, #mock_file_path) == mock_file_path then
+ found[#found + 1] = v.value.f:sub(#v.value.f)
+ end
+ end
+ eq({'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}, found)
+ end)
+
+ it('does not leak when last mark in file removes some of the earlier ones',
+ function()
+ wshada('\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'a\161n0'
+ .. '\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'b\161n1'
+ .. '\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161n2'
+ .. '\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'd\161n3'
+ .. '\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'e\161n4'
+ .. '\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'f\161n5'
+ .. '\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'g\161n6'
+ .. '\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'h\161n7'
+ .. '\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'i\161n8'
+ .. '\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'j\161n9'
+ .. '\007\003\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'k\161n9')
+ eq(0, exc_exec(sdrcmd()))
+ eq(0, exc_exec('wshada ' .. shada_fname))
+ local found = {}
+ for _, v in ipairs(read_shada_file(shada_fname)) do
+ if v.type == 7 and v.value.f:sub(1, #mock_file_path) == mock_file_path then
+ found[#found + 1] = v.value.f:sub(#v.value.f)
+ end
+ end
+ eq({'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'k'}, found)
+ end)
+
it('uses last A mark with gt timestamp from file when reading with !',
function()
- wshada('\007\001\018\131\162mX\195\161f\196\006/a/b/-\161nA')
+ wshada('\007\001\018\131\162mX\195\161f\196\006' .. mock_file_path .. '-\161nA')
eq(0, exc_exec(sdrcmd()))
- wshada('\007\000\018\131\162mX\195\161f\196\006/a/b/?\161nA')
+ wshada('\007\000\018\131\162mX\195\161f\196\006' .. mock_file_path .. '?\161nA')
eq(0, exc_exec(sdrcmd(true)))
nvim_command('normal! `A')
eq('?', funcs.fnamemodify(curbufmeths.get_name(), ':t'))
@@ -532,9 +616,9 @@ describe('ShaDa marks support code', function()
it('uses last A mark with eq timestamp from instance when reading',
function()
- wshada('\007\001\018\131\162mX\195\161f\196\006/a/b/-\161nA')
+ wshada('\007\001\018\131\162mX\195\161f\196\006' .. mock_file_path .. '-\161nA')
eq(0, exc_exec(sdrcmd()))
- wshada('\007\001\018\131\162mX\195\161f\196\006/a/b/?\161nA')
+ wshada('\007\001\018\131\162mX\195\161f\196\006' .. mock_file_path .. '?\161nA')
eq(0, exc_exec(sdrcmd()))
nvim_command('normal! `A')
eq('-', funcs.fnamemodify(curbufmeths.get_name(), ':t'))
@@ -542,9 +626,9 @@ describe('ShaDa marks support code', function()
it('uses last A mark with gt timestamp from file when reading',
function()
- wshada('\007\001\018\131\162mX\195\161f\196\006/a/b/-\161nA')
+ wshada('\007\001\018\131\162mX\195\161f\196\006' .. mock_file_path .. '-\161nA')
eq(0, exc_exec(sdrcmd()))
- wshada('\007\002\018\131\162mX\195\161f\196\006/a/b/?\161nA')
+ wshada('\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. '?\161nA')
eq(0, exc_exec(sdrcmd()))
nvim_command('normal! `A')
eq('?', funcs.fnamemodify(curbufmeths.get_name(), ':t'))
@@ -552,62 +636,66 @@ describe('ShaDa marks support code', function()
it('uses last A mark with gt timestamp from instance when writing',
function()
- wshada('\007\001\018\131\162mX\195\161f\196\006/a/b/-\161nA')
+ wshada('\007\001\018\131\162mX\195\161f\196\006' .. mock_file_path .. '-\161nA')
eq(0, exc_exec(sdrcmd()))
- wshada('\007\000\018\131\162mX\195\161f\196\006/a/b/?\161nA')
+ wshada('\007\000\018\131\162mX\195\161f\196\006' .. mock_file_path .. '?\161nA')
nvim_command('normal! `A')
eq('-', funcs.fnamemodify(curbufmeths.get_name(), ':t'))
eq(0, exc_exec('wshada ' .. shada_fname))
- local found = 0
+ local found = {}
for _, v in ipairs(read_shada_file(shada_fname)) do
- if v.type == 7 and v.value.f == '/a/b/-' then
- found = found + 1
+ if v.type == 7 and v.value.f == mock_file_path .. '-' then
+ local name = ('%c'):format(v.value.n)
+ found[name] = (found[name] or 0) + 1
end
end
- eq(1, found)
+ eq({['0']=1, A=1}, found)
end)
it('uses last A mark with eq timestamp from instance when writing',
function()
- wshada('\007\001\018\131\162mX\195\161f\196\006/a/b/-\161nA')
+ wshada('\007\001\018\131\162mX\195\161f\196\006' .. mock_file_path .. '-\161nA')
eq(0, exc_exec(sdrcmd()))
- wshada('\007\001\018\131\162mX\195\161f\196\006/a/b/?\161nA')
+ wshada('\007\001\018\131\162mX\195\161f\196\006' .. mock_file_path .. '?\161nA')
nvim_command('normal! `A')
eq('-', funcs.fnamemodify(curbufmeths.get_name(), ':t'))
eq(0, exc_exec('wshada ' .. shada_fname))
- local found = 0
+ local found = {}
for _, v in ipairs(read_shada_file(shada_fname)) do
- if v.type == 7 and v.value.f == '/a/b/-' then
- found = found + 1
+ if v.type == 7 and v.value.f == mock_file_path .. '-' then
+ local name = ('%c'):format(v.value.n)
+ found[name] = (found[name] or 0) + 1
end
end
- eq(1, found)
+ eq({['0']=1, A=1}, found)
end)
- it('uses last A mark with gt timestamp from file when writing',
- function()
- wshada('\007\001\018\131\162mX\195\161f\196\006/a/b/-\161nA')
+ it('uses last A mark with gt timestamp from file when writing', function()
+ wshada('\007\001\018\131\162mX\195\161f\196\006' .. mock_file_path .. '-\161nA')
eq(0, exc_exec(sdrcmd()))
- wshada('\007\002\018\131\162mX\195\161f\196\006/a/b/?\161nA')
+ wshada('\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. '?\161nA')
nvim_command('normal! `A')
eq('-', funcs.fnamemodify(curbufmeths.get_name(), ':t'))
eq(0, exc_exec('wshada ' .. shada_fname))
- local found = 0
+ local found = {}
for _, v in ipairs(read_shada_file(shada_fname)) do
- if v.type == 7 and v.value.f == '/a/b/?' then
- found = found + 1
+ if v.type == 7 then
+ local name = ('%c'):format(v.value.n)
+ local t = found[name] or {}
+ t[v.value.f] = (t[v.value.f] or 0) + 1
+ found[name] = t
end
end
- eq(1, found)
+ eq({['0']={[mock_file_path .. '-']=1}, A={[mock_file_path .. '?']=1}}, found)
end)
it('uses last a mark with gt timestamp from instance when reading',
function()
- nvim_command('edit /a/b/-')
+ nvim_command('edit ' .. mock_file_path .. '-')
funcs.setline(1, {'-', '?'})
- wshada('\010\001\017\131\161l\001\161f\196\006/a/b/-\161na')
+ wshada('\010\001\017\131\161l\001\161f\196\006' .. mock_file_path .. '-\161na')
eq(0, exc_exec(sdrcmd()))
- wshada('\010\000\017\131\161l\002\161f\196\006/a/b/-\161na')
+ wshada('\010\000\017\131\161l\002\161f\196\006' .. mock_file_path .. '-\161na')
eq(0, exc_exec(sdrcmd()))
nvim_command('normal! `a')
eq('-', funcs.getline('.'))
@@ -615,11 +703,11 @@ describe('ShaDa marks support code', function()
it('uses last a mark with gt timestamp from file when reading with !',
function()
- nvim_command('edit /a/b/-')
+ nvim_command('edit ' .. mock_file_path .. '-')
funcs.setline(1, {'-', '?'})
- wshada('\010\001\017\131\161l\001\161f\196\006/a/b/-\161na')
+ wshada('\010\001\017\131\161l\001\161f\196\006' .. mock_file_path .. '-\161na')
eq(0, exc_exec(sdrcmd()))
- wshada('\010\000\017\131\161l\002\161f\196\006/a/b/-\161na')
+ wshada('\010\000\017\131\161l\002\161f\196\006' .. mock_file_path .. '-\161na')
eq(0, exc_exec(sdrcmd(true)))
nvim_command('normal! `a')
eq('?', funcs.getline('.'))
@@ -627,11 +715,11 @@ describe('ShaDa marks support code', function()
it('uses last a mark with eq timestamp from instance when reading',
function()
- nvim_command('edit /a/b/-')
+ nvim_command('edit ' .. mock_file_path .. '-')
funcs.setline(1, {'-', '?'})
- wshada('\010\001\017\131\161l\001\161f\196\006/a/b/-\161na')
+ wshada('\010\001\017\131\161l\001\161f\196\006' .. mock_file_path .. '-\161na')
eq(0, exc_exec(sdrcmd()))
- wshada('\010\001\017\131\161l\002\161f\196\006/a/b/-\161na')
+ wshada('\010\001\017\131\161l\002\161f\196\006' .. mock_file_path .. '-\161na')
eq(0, exc_exec(sdrcmd()))
nvim_command('normal! `a')
eq('-', funcs.getline('.'))
@@ -639,11 +727,11 @@ describe('ShaDa marks support code', function()
it('uses last a mark with gt timestamp from file when reading',
function()
- nvim_command('edit /a/b/-')
+ nvim_command('edit ' .. mock_file_path .. '-')
funcs.setline(1, {'-', '?'})
- wshada('\010\001\017\131\161l\001\161f\196\006/a/b/-\161na')
+ wshada('\010\001\017\131\161l\001\161f\196\006' .. mock_file_path .. '-\161na')
eq(0, exc_exec(sdrcmd()))
- wshada('\010\002\017\131\161l\002\161f\196\006/a/b/-\161na')
+ wshada('\010\002\017\131\161l\002\161f\196\006' .. mock_file_path .. '-\161na')
eq(0, exc_exec(sdrcmd()))
nvim_command('normal! `a')
eq('?', funcs.getline('.'))
@@ -651,17 +739,17 @@ describe('ShaDa marks support code', function()
it('uses last a mark with gt timestamp from instance when writing',
function()
- nvim_command('edit /a/b/-')
+ nvim_command('edit ' .. mock_file_path .. '-')
funcs.setline(1, {'-', '?'})
- wshada('\010\001\017\131\161l\001\161f\196\006/a/b/-\161na')
+ wshada('\010\001\017\131\161l\001\161f\196\006' .. mock_file_path .. '-\161na')
eq(0, exc_exec(sdrcmd()))
- wshada('\010\000\017\131\161l\002\161f\196\006/a/b/-\161na')
+ wshada('\010\000\017\131\161l\002\161f\196\006' .. mock_file_path .. '-\161na')
nvim_command('normal! `a')
eq('-', funcs.getline('.'))
eq(0, exc_exec('wshada ' .. shada_fname))
local found = 0
for _, v in ipairs(read_shada_file(shada_fname)) do
- if v.type == 10 and v.value.f == '/a/b/-' and v.value.n == ('a'):byte() then
+ if v.type == 10 and v.value.f == '' .. mock_file_path .. '-' and v.value.n == ('a'):byte() then
eq(true, v.value.l == 1 or v.value.l == nil)
found = found + 1
end
@@ -671,17 +759,17 @@ describe('ShaDa marks support code', function()
it('uses last a mark with eq timestamp from instance when writing',
function()
- nvim_command('edit /a/b/-')
+ nvim_command('edit ' .. mock_file_path .. '-')
funcs.setline(1, {'-', '?'})
- wshada('\010\001\017\131\161l\001\161f\196\006/a/b/-\161na')
+ wshada('\010\001\017\131\161l\001\161f\196\006' .. mock_file_path .. '-\161na')
eq(0, exc_exec(sdrcmd()))
- wshada('\010\001\017\131\161l\002\161f\196\006/a/b/-\161na')
+ wshada('\010\001\017\131\161l\002\161f\196\006' .. mock_file_path .. '-\161na')
nvim_command('normal! `a')
eq('-', funcs.getline('.'))
eq(0, exc_exec('wshada ' .. shada_fname))
local found = 0
for _, v in ipairs(read_shada_file(shada_fname)) do
- if v.type == 10 and v.value.f == '/a/b/-' and v.value.n == ('a'):byte() then
+ if v.type == 10 and v.value.f == '' .. mock_file_path .. '-' and v.value.n == ('a'):byte() then
eq(true, v.value.l == 1 or v.value.l == nil)
found = found + 1
end
@@ -691,17 +779,17 @@ describe('ShaDa marks support code', function()
it('uses last a mark with gt timestamp from file when writing',
function()
- nvim_command('edit /a/b/-')
+ nvim_command('edit ' .. mock_file_path .. '-')
funcs.setline(1, {'-', '?'})
- wshada('\010\001\017\131\161l\001\161f\196\006/a/b/-\161na')
+ wshada('\010\001\017\131\161l\001\161f\196\006' .. mock_file_path .. '-\161na')
eq(0, exc_exec(sdrcmd()))
- wshada('\010\002\017\131\161l\002\161f\196\006/a/b/-\161na')
+ wshada('\010\002\017\131\161l\002\161f\196\006' .. mock_file_path .. '-\161na')
nvim_command('normal! `a')
eq('-', funcs.fnamemodify(curbufmeths.get_name(), ':t'))
eq(0, exc_exec('wshada ' .. shada_fname))
local found = 0
for _, v in ipairs(read_shada_file(shada_fname)) do
- if v.type == 10 and v.value.f == '/a/b/-' and v.value.n == ('a'):byte() then
+ if v.type == 10 and v.value.f == '' .. mock_file_path .. '-' and v.value.n == ('a'):byte() then
eq(2, v.value.l)
found = found + 1
end
@@ -813,41 +901,41 @@ describe('ShaDa jumps support code', function()
end)
it('merges jumps when reading', function()
- wshada('\008\001\018\131\162mX\195\161f\196\006/a/b/c\161l\002'
- .. '\008\004\018\131\162mX\195\161f\196\006/a/b/d\161l\002'
- .. '\008\007\018\131\162mX\195\161f\196\006/a/b/e\161l\002')
+ wshada('\008\001\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161l\002'
+ .. '\008\004\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'd\161l\002'
+ .. '\008\007\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'e\161l\002')
eq(0, exc_exec(sdrcmd()))
- wshada('\008\001\018\131\162mX\195\161f\196\006/a/b/c\161l\002'
- .. '\008\004\018\131\162mX\195\161f\196\006/a/b/d\161l\003'
- .. '\008\007\018\131\162mX\195\161f\196\006/a/b/f\161l\002')
+ wshada('\008\001\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161l\002'
+ .. '\008\004\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'd\161l\003'
+ .. '\008\007\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'f\161l\002')
eq(0, exc_exec(sdrcmd()))
eq('', curbufmeths.get_name())
eq('\n'
.. ' jump line col file/text\n'
- .. ' 6 2 0 /a/b/c\n'
- .. ' 5 2 0 /a/b/d\n'
- .. ' 4 3 0 /a/b/d\n'
- .. ' 3 2 0 /a/b/e\n'
- .. ' 2 2 0 /a/b/f\n'
+ .. ' 6 2 0 ' .. mock_file_path .. 'c\n'
+ .. ' 5 2 0 ' .. mock_file_path .. 'd\n'
+ .. ' 4 3 0 ' .. mock_file_path .. 'd\n'
+ .. ' 3 2 0 ' .. mock_file_path .. 'e\n'
+ .. ' 2 2 0 ' .. mock_file_path .. 'f\n'
.. ' 1 1 0 \n'
.. '>', redir_exec('jumps'))
end)
it('merges jumps when writing', function()
- wshada('\008\001\018\131\162mX\195\161f\196\006/a/b/c\161l\002'
- .. '\008\004\018\131\162mX\195\161f\196\006/a/b/d\161l\002'
- .. '\008\007\018\131\162mX\195\161f\196\006/a/b/e\161l\002')
+ wshada('\008\001\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161l\002'
+ .. '\008\004\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'd\161l\002'
+ .. '\008\007\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'e\161l\002')
eq(0, exc_exec(sdrcmd()))
- wshada('\008\001\018\131\162mX\195\161f\196\006/a/b/c\161l\002'
- .. '\008\004\018\131\162mX\195\161f\196\006/a/b/d\161l\003'
- .. '\008\007\018\131\162mX\195\161f\196\006/a/b/f\161l\002')
+ wshada('\008\001\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161l\002'
+ .. '\008\004\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'd\161l\003'
+ .. '\008\007\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'f\161l\002')
eq(0, exc_exec('wshada ' .. shada_fname))
local jumps = {
- {file='/a/b/c', line=2},
- {file='/a/b/d', line=2},
- {file='/a/b/d', line=3},
- {file='/a/b/e', line=2},
- {file='/a/b/f', line=2},
+ {file='' .. mock_file_path .. 'c', line=2},
+ {file='' .. mock_file_path .. 'd', line=2},
+ {file='' .. mock_file_path .. 'd', line=3},
+ {file='' .. mock_file_path .. 'e', line=2},
+ {file='' .. mock_file_path .. 'f', line=2},
}
local found = 0
for _, v in ipairs(read_shada_file(shada_fname)) do
@@ -864,9 +952,9 @@ describe('ShaDa jumps support code', function()
local jumps = {}
local shada = ''
for i = 1,100 do
- shada = shada .. ('\008%c\018\131\162mX\195\161f\196\006/a/b/c\161l%c'
+ shada = shada .. ('\008%c\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161l%c'
):format(i, i)
- jumps[i] = {file='/a/b/c', line=i}
+ jumps[i] = {file='' .. mock_file_path .. 'c', line=i}
end
wshada(shada)
eq(0, exc_exec(sdrcmd()))
@@ -874,9 +962,9 @@ describe('ShaDa jumps support code', function()
for i = 1,101 do
local t = i * 2
shada = shada .. (
- '\008\204%c\019\131\162mX\195\161f\196\006/a/b/c\161l\204%c'
+ '\008\204%c\019\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161l\204%c'
):format(t, t)
- jumps[(t > #jumps + 1) and (#jumps + 1) or t] = {file='/a/b/c', line=t}
+ jumps[(t > #jumps + 1) and (#jumps + 1) or t] = {file='' .. mock_file_path .. 'c', line=t}
end
wshada(shada)
eq(0, exc_exec('wshada ' .. shada_fname))
@@ -904,15 +992,15 @@ describe('ShaDa changes support code', function()
end)
it('merges changes when reading', function()
- nvim_command('edit /a/b/c')
+ nvim_command('edit ' .. mock_file_path .. 'c')
nvim_command('keepjumps call setline(1, range(7))')
- wshada('\011\001\018\131\162mX\195\161f\196\006/a/b/c\161l\001'
- .. '\011\004\018\131\162mX\195\161f\196\006/a/b/c\161l\002'
- .. '\011\007\018\131\162mX\195\161f\196\006/a/b/c\161l\003')
+ wshada('\011\001\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161l\001'
+ .. '\011\004\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161l\002'
+ .. '\011\007\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161l\003')
eq(0, exc_exec(sdrcmd()))
- wshada('\011\001\018\131\162mX\194\161f\196\006/a/b/c\161l\001'
- .. '\011\004\018\131\162mX\195\161f\196\006/a/b/c\161l\005'
- .. '\011\008\018\131\162mX\195\161f\196\006/a/b/c\161l\004')
+ wshada('\011\001\018\131\162mX\194\161f\196\006' .. mock_file_path .. 'c\161l\001'
+ .. '\011\004\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161l\005'
+ .. '\011\008\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161l\004')
eq(0, exc_exec(sdrcmd()))
eq('\n'
.. 'change line col text\n'
@@ -925,15 +1013,15 @@ describe('ShaDa changes support code', function()
end)
it('merges changes when writing', function()
- nvim_command('edit /a/b/c')
+ nvim_command('edit ' .. mock_file_path .. 'c')
nvim_command('keepjumps call setline(1, range(7))')
- wshada('\011\001\018\131\162mX\195\161f\196\006/a/b/c\161l\001'
- .. '\011\004\018\131\162mX\195\161f\196\006/a/b/c\161l\002'
- .. '\011\007\018\131\162mX\195\161f\196\006/a/b/c\161l\003')
+ wshada('\011\001\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161l\001'
+ .. '\011\004\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161l\002'
+ .. '\011\007\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161l\003')
eq(0, exc_exec(sdrcmd()))
- wshada('\011\001\018\131\162mX\194\161f\196\006/a/b/c\161l\001'
- .. '\011\004\018\131\162mX\195\161f\196\006/a/b/c\161l\005'
- .. '\011\008\018\131\162mX\195\161f\196\006/a/b/c\161l\004')
+ wshada('\011\001\018\131\162mX\194\161f\196\006' .. mock_file_path .. 'c\161l\001'
+ .. '\011\004\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161l\005'
+ .. '\011\008\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161l\004')
eq(0, exc_exec('wshada ' .. shada_fname))
local changes = {
{line=1},
@@ -944,7 +1032,7 @@ describe('ShaDa changes support code', function()
}
local found = 0
for _, v in ipairs(read_shada_file(shada_fname)) do
- if v.type == 11 and v.value.f == '/a/b/c' then
+ if v.type == 11 and v.value.f == '' .. mock_file_path .. 'c' then
found = found + 1
eq(changes[found].line, v.value.l or 1)
end
@@ -953,12 +1041,12 @@ describe('ShaDa changes support code', function()
end)
it('merges JUMPLISTSIZE changes when writing', function()
- nvim_command('edit /a/b/c')
+ nvim_command('edit ' .. mock_file_path .. 'c')
nvim_command('keepjumps call setline(1, range(202))')
local changes = {}
local shada = ''
for i = 1,100 do
- shada = shada .. ('\011%c\018\131\162mX\195\161f\196\006/a/b/c\161l%c'
+ shada = shada .. ('\011%c\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161l%c'
):format(i, i)
changes[i] = {line=i}
end
@@ -968,7 +1056,7 @@ describe('ShaDa changes support code', function()
for i = 1,101 do
local t = i * 2
shada = shada .. (
- '\011\204%c\019\131\162mX\195\161f\196\006/a/b/c\161l\204%c'
+ '\011\204%c\019\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161l\204%c'
):format(t, t)
changes[(t > #changes + 1) and (#changes + 1) or t] = {line=t}
end
@@ -980,7 +1068,7 @@ describe('ShaDa changes support code', function()
end
local found = 0
for _, v in ipairs(read_shada_file(shada_fname)) do
- if v.type == 11 and v.value.f == '/a/b/c' then
+ if v.type == 11 and v.value.f == '' .. mock_file_path .. 'c' then
found = found + 1
eq(changes[found].line, v.value.l)
end
@@ -990,20 +1078,20 @@ describe('ShaDa changes support code', function()
it('merges JUMPLISTSIZE changes when writing, with new items between old',
function()
- nvim_command('edit /a/b/c')
+ nvim_command('edit ' .. mock_file_path .. 'c')
nvim_command('keepjumps call setline(1, range(202))')
local shada = ''
for i = 1,101 do
local t = i * 2
shada = shada .. (
- '\011\204%c\019\131\162mX\195\161f\196\006/a/b/c\161l\204%c'
+ '\011\204%c\019\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161l\204%c'
):format(t, t)
end
wshada(shada)
eq(0, exc_exec(sdrcmd()))
shada = ''
for i = 1,100 do
- shada = shada .. ('\011%c\018\131\162mX\195\161f\196\006/a/b/c\161l%c'
+ shada = shada .. ('\011%c\018\131\162mX\195\161f\196\006' .. mock_file_path .. 'c\161l%c'
):format(i, i)
end
local changes = {}
@@ -1022,7 +1110,7 @@ describe('ShaDa changes support code', function()
end
local found = 0
for _, v in ipairs(read_shada_file(shada_fname)) do
- if v.type == 11 and v.value.f == '/a/b/c' then
+ if v.type == 11 and v.value.f == '' .. mock_file_path .. 'c' then
found = found + 1
eq(changes[found].line, v.value.l)
end
@@ -1030,3 +1118,5 @@ describe('ShaDa changes support code', function()
eq(found, 100)
end)
end)
+
+-- vim: ts=2 sw=2
diff --git a/test/functional/shada/registers_spec.lua b/test/functional/shada/registers_spec.lua
index f1c587c640..71af14aba8 100644
--- a/test/functional/shada/registers_spec.lua
+++ b/test/functional/shada/registers_spec.lua
@@ -128,36 +128,60 @@ describe('ShaDa support code', function()
eq({{}, ''}, getreg('h'))
end)
- it('dumps and loads register correctly when &encoding is not UTF-8',
+ it('dumps and loads register correctly with utf-8 contents',
function()
- set_additional_cmd('set encoding=latin1')
reset()
- -- \171 is U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK in latin1
- setreg('e', {'\171'}, 'c')
+ setreg('e', {'ยซ'}, 'c')
nvim_command('qall')
reset()
- eq({{'\171'}, 'v'}, getreg('e'))
+ eq({{'ยซ'}, 'v'}, getreg('e'))
end)
- it('dumps and loads history correctly when &encoding /= UTF-8 when dumping',
+ it('dumps and loads history correctly with 8-bit single-byte',
function()
- set_additional_cmd('set encoding=latin1')
reset()
-- \171 is U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK in latin1
- setreg('e', {'\171'}, 'c')
+ setreg('e', {'\171ยซ'}, 'c')
set_additional_cmd('')
nvim_command('qall')
reset()
- eq({{'ยซ'}, 'v'}, getreg('e'))
+ eq({{'\171ยซ'}, 'v'}, getreg('e'))
end)
- it('dumps and loads history correctly when &encoding /= UTF-8 when loading',
+ it('has a blank unnamed register if it wasn\'t set and register 0 is empty',
function()
- -- \171 is U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK in latin1
- setreg('e', {'ยซ'}, 'c')
- set_additional_cmd('set encoding=latin1')
+ setreg('1', {'one'}, 'c')
+ setreg('2', {'two'}, 'c')
+ setreg('a', {'a'}, 'c')
+ nvim_command('qall')
+ reset()
+ eq({{}, ''}, getreg('0'))
+ eq({{'one'}, 'v'}, getreg('1'))
+ eq({{}, ''}, getreg('"'))
+ eq({{'a'}, 'v'}, getreg('a'))
+ end)
+
+ it('defaults the unnamed register to register 0 if it wasn\'t set',
+ function()
+ setreg('0', {'zero'}, 'c')
+ setreg('1', {'one'}, 'c')
+ setreg('2', {'two'}, 'c')
+ nvim_command('qall')
+ reset()
+ eq({{'zero'}, 'v'}, getreg('0'))
+ eq({{'one'}, 'v'}, getreg('1'))
+ eq({{'zero'}, 'v'}, getreg('"'))
+ end)
+
+ it('remembers which register was the unnamed register when loading',
+ function()
+ setreg('0', {'zero'}, 'c')
+ setreg('1', {'one'}, 'cu')
+ setreg('2', {'two'}, 'c')
nvim_command('qall')
reset()
- eq({{'\171'}, 'v'}, getreg('e'))
+ eq({{'zero'}, 'v'}, getreg('0'))
+ eq({{'one'}, 'v'}, getreg('1'))
+ eq({{'one'}, 'v'}, getreg('"'))
end)
end)
diff --git a/test/functional/shada/shada_spec.lua b/test/functional/shada/shada_spec.lua
index 32e7b16fc5..5f7daf73e5 100644
--- a/test/functional/shada/shada_spec.lua
+++ b/test/functional/shada/shada_spec.lua
@@ -5,6 +5,7 @@ local meths, nvim_command, funcs, eq =
local write_file, spawn, set_session, nvim_prog, exc_exec =
helpers.write_file, helpers.spawn, helpers.set_session, helpers.nvim_prog,
helpers.exc_exec
+
local lfs = require('lfs')
local paths = require('test.config.paths')
@@ -14,15 +15,20 @@ local shada_helpers = require('test.functional.shada.helpers')
local reset, clear, get_shada_rw =
shada_helpers.reset, shada_helpers.clear, shada_helpers.get_shada_rw
local read_shada_file = shada_helpers.read_shada_file
+local set_additional_cmd = shada_helpers.set_additional_cmd
local wshada, _, shada_fname, clean =
get_shada_rw('Xtest-functional-shada-shada.shada')
+local dirname = 'Xtest-functional-shada-shada.d'
+local dirshada = dirname .. '/main.shada'
+
describe('ShaDa support code', function()
before_each(reset)
after_each(function()
clear()
clean()
+ lfs.rmdir(dirname)
end)
it('preserves `s` item size limit with unknown entries', function()
@@ -131,7 +137,7 @@ describe('ShaDa support code', function()
it('does not write NONE file', function()
local session = spawn({nvim_prog, '-u', 'NONE', '-i', 'NONE', '--embed',
- '--cmd', 'qall'}, true)
+ '--headless', '--cmd', 'qall'}, true)
session:close()
eq(nil, lfs.attributes('NONE'))
eq(nil, lfs.attributes('NONE.tmp.a'))
@@ -139,8 +145,8 @@ describe('ShaDa support code', function()
it('does not read NONE file', function()
write_file('NONE', '\005\001\015\131\161na\162rX\194\162rc\145\196\001-')
- local session = spawn({nvim_prog, '-u', 'NONE', '-i', 'NONE', '--embed'},
- true)
+ local session = spawn({nvim_prog, '-u', 'NONE', '-i', 'NONE', '--embed',
+ '--headless'}, true)
set_session(session)
eq('', funcs.getreg('a'))
session:close()
@@ -165,6 +171,7 @@ describe('ShaDa support code', function()
end
it('correctly uses shada-r option', function()
+ nvim_command('set shellslash')
meths.set_var('__home', paths.test_source_path)
nvim_command('let $HOME = __home')
nvim_command('unlet __home')
@@ -173,21 +180,22 @@ describe('ShaDa support code', function()
nvim_command('undo')
nvim_command('set shada+=%')
nvim_command('wshada! ' .. shada_fname)
- local readme_fname = paths.test_source_path .. '/README.md'
- readme_fname = helpers.eval( 'resolve("' .. readme_fname .. '")' )
- eq({[7]=1, [8]=2, [9]=1, [10]=4, [11]=1}, find_file(readme_fname))
+ local readme_fname = funcs.resolve(paths.test_source_path) .. '/README.md'
+ eq({[7]=2, [8]=2, [9]=1, [10]=4, [11]=1}, find_file(readme_fname))
nvim_command('set shada+=r~')
nvim_command('wshada! ' .. shada_fname)
eq({}, find_file(readme_fname))
nvim_command('set shada-=r~')
nvim_command('wshada! ' .. shada_fname)
- eq({[7]=1, [8]=2, [9]=1, [10]=4, [11]=1}, find_file(readme_fname))
- nvim_command('set shada+=r' .. paths.test_source_path)
+ eq({[7]=2, [8]=2, [9]=1, [10]=4, [11]=1}, find_file(readme_fname))
+ nvim_command('set shada+=r' .. funcs.escape(
+ funcs.escape(paths.test_source_path, '$~'), ' "\\,'))
nvim_command('wshada! ' .. shada_fname)
eq({}, find_file(readme_fname))
end)
it('correctly ignores case with shada-r option', function()
+ nvim_command('set shellslash')
local pwd = funcs.getcwd()
local relfname = 'ะฐะฑะฒ/test'
local fname = pwd .. '/' .. relfname
@@ -198,7 +206,7 @@ describe('ShaDa support code', function()
nvim_command('undo')
nvim_command('set shada+=%')
nvim_command('wshada! ' .. shada_fname)
- eq({[7]=1, [8]=2, [9]=1, [10]=4, [11]=2}, find_file(fname))
+ eq({[7]=2, [8]=2, [9]=1, [10]=4, [11]=2}, find_file(fname))
nvim_command('set shada+=r' .. pwd .. '/ะะ‘ะ’')
nvim_command('wshada! ' .. shada_fname)
eq({}, find_file(fname))
@@ -230,4 +238,19 @@ describe('ShaDa support code', function()
eq('', meths.get_option('viminfo'))
eq('', meths.get_option('shada'))
end)
+
+ it('does not crash when ShaDa file directory is not writable', function()
+ if helpers.pending_win32(pending) then return end
+
+ funcs.mkdir(dirname, '', 0)
+ eq(0, funcs.filewritable(dirname))
+ set_additional_cmd('set shada=')
+ reset(dirshada)
+ meths.set_option('shada', '\'10')
+ eq('Vim(wshada):E886: System error while opening ShaDa file '
+ .. 'Xtest-functional-shada-shada.d/main.shada for reading to merge '
+ .. 'before writing it: permission denied',
+ exc_exec('wshada'))
+ meths.set_option('shada', '')
+ end)
end)
diff --git a/test/functional/shada/variables_spec.lua b/test/functional/shada/variables_spec.lua
index 40101baf8f..f817bcef74 100644
--- a/test/functional/shada/variables_spec.lua
+++ b/test/functional/shada/variables_spec.lua
@@ -33,7 +33,7 @@ describe('ShaDa support code', function()
else
meths.set_var(varname, varval)
end
- -- Exit during `reset` is not a regular exit: it does not write shada
+ -- Exit during `reset` is not a regular exit: it does not write shada
-- automatically
nvim_command('qall')
reset()
@@ -91,35 +91,13 @@ describe('ShaDa support code', function()
eq(0, funcs.exists('g:str_var'))
end)
- it('dumps and loads variables correctly when &encoding is not UTF-8',
+ it('dumps and loads variables correctly with utf-8 strings',
function()
- set_additional_cmd('set encoding=latin1')
reset()
- -- \171 is U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK in latin1
- meths.set_var('STRVAR', '\171')
- meths.set_var('LSTVAR', {'\171'})
- meths.set_var('DCTVAR', {['\171']='\171'})
- meths.set_var('NESTEDVAR', {['\171']={{'\171'}, {['\171']='\171'},
- {a='Test'}}})
- nvim_command('qall')
- reset()
- eq('\171', meths.get_var('STRVAR'))
- eq({'\171'}, meths.get_var('LSTVAR'))
- eq({['\171']='\171'}, meths.get_var('DCTVAR'))
- eq({['\171']={{'\171'}, {['\171']='\171'}, {a='Test'}}},
- meths.get_var('NESTEDVAR'))
- end)
-
- it('dumps and loads variables correctly when &encoding /= UTF-8 when dumping',
- function()
- set_additional_cmd('set encoding=latin1')
- reset()
- -- \171 is U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK in latin1
- meths.set_var('STRVAR', '\171')
- meths.set_var('LSTVAR', {'\171'})
- meths.set_var('DCTVAR', {['\171']='\171'})
- meths.set_var('NESTEDVAR', {['\171']={{'\171'}, {['\171']='\171'},
- {a='Test'}}})
+ meths.set_var('STRVAR', 'ยซ')
+ meths.set_var('LSTVAR', {'ยซ'})
+ meths.set_var('DCTVAR', {['ยซ']='ยซ'})
+ meths.set_var('NESTEDVAR', {['ยซ']={{'ยซ'}, {['ยซ']='ยซ'}, {a='Test'}}})
set_additional_cmd('')
nvim_command('qall')
reset()
@@ -129,20 +107,22 @@ describe('ShaDa support code', function()
eq({['ยซ']={{'ยซ'}, {['ยซ']='ยซ'}, {a='Test'}}}, meths.get_var('NESTEDVAR'))
end)
- it('dumps and loads variables correctly when &encoding /= UTF-8 when loading',
+ it('dumps and loads variables correctly with 8-bit strings',
function()
+ reset()
-- \171 is U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK in latin1
- meths.set_var('STRVAR', 'ยซ')
- meths.set_var('LSTVAR', {'ยซ'})
- meths.set_var('DCTVAR', {['ยซ']='ยซ'})
- meths.set_var('NESTEDVAR', {['ยซ']={{'ยซ'}, {['ยซ']='ยซ'}, {a='Test'}}})
- set_additional_cmd('set encoding=latin1')
+ -- This is invalid unicode, but we should still dump and restore it.
+ meths.set_var('STRVAR', '\171')
+ meths.set_var('LSTVAR', {'\171'})
+ meths.set_var('DCTVAR', {['ยซ\171']='ยซ\171'})
+ meths.set_var('NESTEDVAR', {['\171']={{'\171ยซ'}, {['\171']='\171'},
+ {a='Test'}}})
nvim_command('qall')
reset()
eq('\171', meths.get_var('STRVAR'))
eq({'\171'}, meths.get_var('LSTVAR'))
- eq({['\171']='\171'}, meths.get_var('DCTVAR'))
- eq({['\171']={{'\171'}, {['\171']='\171'}, {a='Test'}}},
+ eq({['ยซ\171']='ยซ\171'}, meths.get_var('DCTVAR'))
+ eq({['\171']={{'\171ยซ'}, {['\171']='\171'}, {a='Test'}}},
meths.get_var('NESTEDVAR'))
end)
@@ -152,7 +132,7 @@ describe('ShaDa support code', function()
meths.set_var('U', '10')
nvim_command('set shada+=!')
set_additional_cmd('set shada+=!')
- eq('Vim(wshada):E951: Error while dumping variable g:F, itself: attempt to dump function reference',
+ eq('Vim(wshada):E5004: Error while dumping variable g:F, itself: attempt to dump function reference',
exc_exec('wshada'))
meths.set_option('shada', '')
reset()
@@ -165,7 +145,7 @@ describe('ShaDa support code', function()
nvim_command('call add(L, L)')
meths.set_var('U', '10')
nvim_command('set shada+=!')
- eq('Vim(wshada):E952: Unable to dump variable g:L: container references itself in index 0',
+ eq('Vim(wshada):E5005: Unable to dump variable g:L: container references itself in index 0',
exc_exec('wshada'))
meths.set_option('shada', '')
set_additional_cmd('set shada+=!')
diff --git a/test/functional/shell/bang_filter_spec.lua b/test/functional/shell/bang_filter_spec.lua
deleted file mode 100644
index cd5325c4e1..0000000000
--- a/test/functional/shell/bang_filter_spec.lua
+++ /dev/null
@@ -1,49 +0,0 @@
--- Specs for bang/filter commands
-
-local helpers = require('test.functional.helpers')(after_each)
-local feed, execute, clear = helpers.feed, helpers.execute, helpers.clear
-local mkdir, write_file, rmdir = helpers.mkdir, helpers.write_file, helpers.rmdir
-
-local Screen = require('test.functional.ui.screen')
-
-
-describe('issues', function()
- local screen
-
- before_each(function()
- clear()
- rmdir('bang_filter_spec')
- mkdir('bang_filter_spec')
- write_file('bang_filter_spec/f1', 'f1')
- write_file('bang_filter_spec/f2', 'f2')
- write_file('bang_filter_spec/f3', 'f3')
- screen = Screen.new()
- screen:attach()
- end)
-
- after_each(function()
- rmdir('bang_filter_spec')
- end)
-
- it('#3269 Last line of shell output is not truncated', function()
- execute([[nnoremap <silent>\l :!ls bang_filter_spec<cr>]])
- feed([[\l]])
- screen:expect([[
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- :!ls bang_filter_spec |
- |
- f1 |
- f2 |
- f3 |
- Press ENTER or type command to continue^ |
- ]])
- end)
-
-end)
diff --git a/test/functional/spell/spellfile_spec.lua b/test/functional/spell/spellfile_spec.lua
new file mode 100644
index 0000000000..afd2c1bce4
--- /dev/null
+++ b/test/functional/spell/spellfile_spec.lua
@@ -0,0 +1,110 @@
+local helpers = require('test.functional.helpers')(after_each)
+local lfs = require('lfs')
+
+local eq = helpers.eq
+local clear = helpers.clear
+local meths = helpers.meths
+local exc_exec = helpers.exc_exec
+local rmdir = helpers.rmdir
+local write_file = helpers.write_file
+
+local testdir = 'Xtest-functional-spell-spellfile.d'
+
+describe('spellfile', function()
+ before_each(function()
+ clear()
+ rmdir(testdir)
+ lfs.mkdir(testdir)
+ lfs.mkdir(testdir .. '/spell')
+ end)
+ after_each(function()
+ rmdir(testdir)
+ end)
+ -- โ”Œ Magic string (#VIMSPELLMAGIC)
+ -- โ”‚ โ”Œ Spell file version (#VIMSPELLVERSION)
+ local spellheader = 'VIMspell\050'
+ it('errors out when prefcond section is truncated', function()
+ meths.set_option('runtimepath', testdir)
+ write_file(testdir .. '/spell/en.ascii.spl',
+ -- โ”Œ Section identifier (#SN_PREFCOND)
+ -- โ”‚ โ”Œ Section flags (#SNF_REQUIRED or zero)
+ -- โ”‚ โ”‚ โ”Œ Section length (4 bytes, MSB first)
+ spellheader .. '\003\001\000\000\000\003'
+ -- โ”Œ Number of regexes in section (2 bytes, MSB first)
+ -- โ”‚ โ”Œ Condition length (1 byte)
+ -- โ”‚ โ”‚ โ”Œ Condition regex (missing!)
+ .. '\000\001\001')
+ meths.set_option('spelllang', 'en')
+ eq('Vim(set):E758: Truncated spell file',
+ exc_exec('set spell'))
+ end)
+ it('errors out when prefcond regexp contains NUL byte', function()
+ meths.set_option('runtimepath', testdir)
+ write_file(testdir .. '/spell/en.ascii.spl',
+ -- โ”Œ Section identifier (#SN_PREFCOND)
+ -- โ”‚ โ”Œ Section flags (#SNF_REQUIRED or zero)
+ -- โ”‚ โ”‚ โ”Œ Section length (4 bytes, MSB first)
+ spellheader .. '\003\001\000\000\000\008'
+ -- โ”Œ Number of regexes in section (2 bytes, MSB first)
+ -- โ”‚ โ”Œ Condition length (1 byte)
+ -- โ”‚ โ”‚ โ”Œ Condition regex
+ -- โ”‚ โ”‚ โ”‚ โ”Œ End of sections marker
+ .. '\000\001\005ab\000cd\255'
+ -- โ”Œ LWORDTREE tree length (4 bytes)
+ -- โ”‚ โ”Œ KWORDTREE tree length (4 bytes)
+ -- โ”‚ โ”‚ โ”Œ PREFIXTREE tree length
+ .. '\000\000\000\000\000\000\000\000\000\000\000\000')
+ meths.set_option('spelllang', 'en')
+ eq('Vim(set):E759: Format error in spell file',
+ exc_exec('set spell'))
+ end)
+ it('errors out when region contains NUL byte', function()
+ meths.set_option('runtimepath', testdir)
+ write_file(testdir .. '/spell/en.ascii.spl',
+ -- โ”Œ Section identifier (#SN_REGION)
+ -- โ”‚ โ”Œ Section flags (#SNF_REQUIRED or zero)
+ -- โ”‚ โ”‚ โ”Œ Section length (4 bytes, MSB first)
+ spellheader .. '\000\001\000\000\000\008'
+ -- โ”Œ Regions โ”Œ End of sections marker
+ .. '01234\00067\255'
+ -- โ”Œ LWORDTREE tree length (4 bytes)
+ -- โ”‚ โ”Œ KWORDTREE tree length (4 bytes)
+ -- โ”‚ โ”‚ โ”Œ PREFIXTREE tree length
+ .. '\000\000\000\000\000\000\000\000\000\000\000\000')
+ meths.set_option('spelllang', 'en')
+ eq('Vim(set):E759: Format error in spell file',
+ exc_exec('set spell'))
+ end)
+ it('errors out when SAL section contains NUL byte', function()
+ meths.set_option('runtimepath', testdir)
+ write_file(testdir .. '/spell/en.ascii.spl',
+ -- โ”Œ Section identifier (#SN_SAL)
+ -- โ”‚ โ”Œ Section flags (#SNF_REQUIRED or zero)
+ -- โ”‚ โ”‚ โ”Œ Section length (4 bytes, MSB first)
+ spellheader .. '\005\001\000\000\000\008'
+ -- โ”Œ salflags
+ -- โ”‚ โ”Œ salcount (2 bytes, MSB first)
+ -- โ”‚ โ”‚ โ”Œ salfromlen (1 byte)
+ -- โ”‚ โ”‚ โ”‚ โ”Œ Special character
+ -- โ”‚ โ”‚ โ”‚ โ”‚โ”Œ salfrom (should not contain NUL)
+ -- โ”‚ โ”‚ โ”‚ โ”‚โ”‚ โ”Œ saltolen
+ -- โ”‚ โ”‚ โ”‚ โ”‚โ”‚ โ”‚ โ”Œ salto
+ -- โ”‚ โ”‚ โ”‚ โ”‚โ”‚ โ”‚ โ”‚โ”Œ End of sections marker
+ .. '\000\000\001\0024\000\0017\255'
+ -- โ”Œ LWORDTREE tree length (4 bytes)
+ -- โ”‚ โ”Œ KWORDTREE tree length (4 bytes)
+ -- โ”‚ โ”‚ โ”Œ PREFIXTREE tree length
+ .. '\000\000\000\000\000\000\000\000\000\000\000\000')
+ meths.set_option('spelllang', 'en')
+ eq('Vim(set):E759: Format error in spell file',
+ exc_exec('set spell'))
+ end)
+ it('errors out when spell header contains NUL bytes', function()
+ meths.set_option('runtimepath', testdir)
+ write_file(testdir .. '/spell/en.ascii.spl',
+ spellheader:sub(1, -3) .. '\000\000')
+ meths.set_option('spelllang', 'en')
+ eq('Vim(set):E757: This does not look like a spell file',
+ exc_exec('set spell'))
+ end)
+end)
diff --git a/test/functional/terminal/altscreen_spec.lua b/test/functional/terminal/altscreen_spec.lua
index e1760c8ad8..4526037808 100644
--- a/test/functional/terminal/altscreen_spec.lua
+++ b/test/functional/terminal/altscreen_spec.lua
@@ -6,6 +6,8 @@ local feed_data = thelpers.feed_data
local enter_altscreen = thelpers.enter_altscreen
local exit_altscreen = thelpers.exit_altscreen
+if helpers.pending_win32(pending) then return end
+
describe('terminal altscreen', function()
local screen
@@ -21,7 +23,7 @@ describe('terminal altscreen', function()
line7 |
line8 |
{1: } |
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
enter_altscreen()
screen:expect([[
@@ -31,7 +33,7 @@ describe('terminal altscreen', function()
|
|
{1: } |
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
eq(10, curbuf('line_count'))
end)
@@ -60,7 +62,7 @@ describe('terminal altscreen', function()
line7 |
line8 |
{1: } |
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
feed('<c-\\><c-n>gg')
screen:expect([[
@@ -86,7 +88,7 @@ describe('terminal altscreen', function()
line15 |
line16 |
{1: } |
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
end)
@@ -116,7 +118,7 @@ describe('terminal altscreen', function()
|
rows: 4, cols: 50 |
{1: } |
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
end
@@ -149,7 +151,7 @@ describe('terminal altscreen', function()
line5 |
line6 |
line7 |
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
end)
end)
diff --git a/test/functional/terminal/api_spec.lua b/test/functional/terminal/api_spec.lua
new file mode 100644
index 0000000000..e28cc03597
--- /dev/null
+++ b/test/functional/terminal/api_spec.lua
@@ -0,0 +1,70 @@
+local helpers = require('test.functional.helpers')(after_each)
+local child_session = require('test.functional.terminal.helpers')
+local ok = helpers.ok
+
+if helpers.pending_win32(pending) then return end
+
+describe('api', function()
+ local screen
+ local socket_name = "Xtest_functional_api.sock"
+
+ before_each(function()
+ helpers.clear()
+ os.remove(socket_name)
+ screen = child_session.screen_setup(0, '["'..helpers.nvim_prog
+ ..'", "-u", "NONE", "-i", "NONE", "--cmd", "'..helpers.nvim_set..'"]')
+ end)
+ after_each(function()
+ os.remove(socket_name)
+ end)
+
+ it("qa! RPC request during insert-mode", function()
+ -- Start the socket from the child nvim.
+ child_session.feed_data(":echo serverstart('"..socket_name.."')\n")
+
+ -- Wait for socket creation.
+ screen:expect([[
+ {1: } |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ ]]..socket_name..[[ |
+ {3:-- TERMINAL --} |
+ ]])
+
+ local socket_session1 = helpers.connect(socket_name)
+ local socket_session2 = helpers.connect(socket_name)
+
+ child_session.feed_data("i[tui] insert-mode")
+ -- Wait for stdin to be processed.
+ screen:expect([[
+ [tui] insert-mode{1: } |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {3:-- INSERT --} |
+ {3:-- TERMINAL --} |
+ ]])
+
+ ok(socket_session1:request("nvim_ui_attach", 42, 6, {rgb=true}))
+ ok(socket_session2:request("nvim_ui_attach", 25, 30, {rgb=true}))
+
+ socket_session1:notify("nvim_input", "\n[socket 1] this is more than 25 columns")
+ socket_session2:notify("nvim_input", "\n[socket 2] input")
+
+ screen:expect([[
+ [tui] insert-mode |
+ [socket 1] this is more t{4: }|
+ han 25 columns {4: }|
+ [socket 2] input{1: } {4: }|
+ {4:~ }|
+ {3:-- INSERT --} |
+ {3:-- TERMINAL --} |
+ ]])
+
+ socket_session1:request("nvim_command", "qa!")
+ end)
+end)
+
diff --git a/test/functional/terminal/buffer_spec.lua b/test/functional/terminal/buffer_spec.lua
index 8a535d6864..4d6b125f9f 100644
--- a/test/functional/terminal/buffer_spec.lua
+++ b/test/functional/terminal/buffer_spec.lua
@@ -2,16 +2,16 @@ local helpers = require('test.functional.helpers')(after_each)
local thelpers = require('test.functional.terminal.helpers')
local feed, clear, nvim = helpers.feed, helpers.clear, helpers.nvim
local wait = helpers.wait
-local eval, execute, source = helpers.eval, helpers.execute, helpers.source
+local eval, feed_command, source = helpers.eval, helpers.feed_command, helpers.source
local eq, neq = helpers.eq, helpers.neq
-
+local write_file = helpers.write_file
describe('terminal buffer', function()
local screen
before_each(function()
clear()
- execute('set modifiable swapfile undolevels=20')
+ feed_command('set modifiable swapfile undolevels=20')
wait()
screen = thelpers.screen_setup()
end)
@@ -21,11 +21,11 @@ describe('terminal buffer', function()
feed('<c-\\><c-n>:set bufhidden=wipe<cr>:enew<cr>')
screen:expect([[
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
:enew |
]])
end)
@@ -34,11 +34,11 @@ describe('terminal buffer', function()
feed(':bnext:l<esc>')
screen:expect([[
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
|
]])
end)
@@ -49,11 +49,11 @@ describe('terminal buffer', function()
feed('<c-\\><c-n>')
screen:expect([[
tty ready |
- {2: } |
+ {2:^ } |
+ |
|
|
|
- ^ |
|
]])
end)
@@ -73,18 +73,18 @@ describe('terminal buffer', function()
feed('<c-\\><c-n>dd')
screen:expect([[
tty ready |
- {2: } |
+ {2:^ } |
|
|
|
- ^ |
- E21: Cannot make changes, 'modifiable' is off |
+ |
+ {8:E21: Cannot make changes, 'modifiable' is off} |
]])
end)
it('sends data to the terminal when the "put" operator is used', function()
feed('<c-\\><c-n>gg"ayj')
- execute('let @a = "appended " . @a')
+ feed_command('let @a = "appended " . @a')
feed('"ap"ap')
screen:expect([[
^tty ready |
@@ -110,8 +110,8 @@ describe('terminal buffer', function()
it('sends data to the terminal when the ":put" command is used', function()
feed('<c-\\><c-n>gg"ayj')
- execute('let @a = "appended " . @a')
- execute('put a')
+ feed_command('let @a = "appended " . @a')
+ feed_command('put a')
screen:expect([[
^tty ready |
appended tty ready |
@@ -122,7 +122,7 @@ describe('terminal buffer', function()
:put a |
]])
-- line argument is only used to move the cursor
- execute('6put a')
+ feed_command('6put a')
screen:expect([[
tty ready |
appended tty ready |
@@ -138,35 +138,36 @@ describe('terminal buffer', function()
feed('<c-\\><c-n>:bd!<cr>')
screen:expect([[
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
:bd! |
]])
- execute('bnext')
+ feed_command('bnext')
screen:expect([[
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
:bnext |
]])
end)
it('handles loss of focus gracefully', function()
+ if helpers.pending_win32(pending) then return end
-- Change the statusline to avoid printing the file name, which varies.
nvim('set_option', 'statusline', '==========')
- execute('set laststatus=0')
+ feed_command('set laststatus=0')
-- Save the buffer number of the terminal for later testing.
local tbuf = eval('bufnr("%")')
source([[
- function! SplitWindow()
+ function! SplitWindow(id, data, event)
new
call feedkeys("iabc\<Esc>")
endfunction
@@ -180,8 +181,8 @@ describe('terminal buffer', function()
-- We should be in a new buffer now.
screen:expect([[
ab^c |
- ~ |
- ========== |
+ {4:~ }|
+ {5:========== }|
rows: 2, cols: 50 |
{2: } |
{1:========== }|
@@ -189,20 +190,59 @@ describe('terminal buffer', function()
]])
neq(tbuf, eval('bufnr("%")'))
- execute('quit!') -- Should exit the new window, not the terminal.
+ feed_command('quit!') -- Should exit the new window, not the terminal.
eq(tbuf, eval('bufnr("%")'))
- execute('set laststatus=1') -- Restore laststatus to the default.
+ feed_command('set laststatus=1') -- Restore laststatus to the default.
end)
it('term_close() use-after-free #4393', function()
- if eval("executable('yes')") == 0 then
- pending('missing "yes" command')
- return
- end
- execute('terminal yes')
+ feed_command('terminal yes')
feed([[<C-\><C-n>]])
- execute('bdelete!')
+ feed_command('bdelete!')
+ end)
+
+ describe('handles confirmations', function()
+ it('with :confirm', function()
+ feed_command('terminal')
+ feed('<c-\\><c-n>')
+ feed_command('confirm bdelete')
+ screen:expect{any='Close "term://', attr_ignore=true}
+ end)
+
+ it('with &confirm', function()
+ feed_command('terminal')
+ feed('<c-\\><c-n>')
+ feed_command('bdelete')
+ screen:expect{any='E89', attr_ignore=true}
+ feed('<cr>')
+ eq('terminal', eval('&buftype'))
+ feed_command('set confirm | bdelete')
+ screen:expect{any='Close "term://', attr_ignore=true}
+ feed('y')
+ neq('terminal', eval('&buftype'))
+ end)
end)
end)
+describe('No heap-buffer-overflow when using', function()
+ local testfilename = 'Xtestfile-functional-terminal-buffers_spec'
+
+ before_each(function()
+ write_file(testfilename, "aaaaaaaaaaaaaaaaaaaaaaaaaaaa")
+ end)
+
+ after_each(function()
+ os.remove(testfilename)
+ end)
+
+ it('termopen(echo) #3161', function()
+ feed_command('edit ' .. testfilename)
+ -- Move cursor away from the beginning of the line
+ feed('$')
+ -- Let termopen() modify the buffer
+ feed_command('call termopen("echo")')
+ eq(2, eval('1+1')) -- check nvim still running
+ feed_command('bdelete!')
+ end)
+end)
diff --git a/test/functional/terminal/cursor_spec.lua b/test/functional/terminal/cursor_spec.lua
index 461ddd0ec7..d942723d02 100644
--- a/test/functional/terminal/cursor_spec.lua
+++ b/test/functional/terminal/cursor_spec.lua
@@ -2,11 +2,11 @@ local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
local thelpers = require('test.functional.terminal.helpers')
local feed, clear, nvim = helpers.feed, helpers.clear, helpers.nvim
-local nvim_dir, execute = helpers.nvim_dir, helpers.execute
+local nvim_dir, command = helpers.nvim_dir, helpers.command
+local feed_command = helpers.feed_command
local hide_cursor = thelpers.hide_cursor
local show_cursor = thelpers.show_cursor
-
describe('terminal cursor', function()
local screen
@@ -25,7 +25,7 @@ describe('terminal cursor', function()
|
|
|
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
end)
@@ -33,11 +33,11 @@ describe('terminal cursor', function()
feed('<c-\\><c-n>')
screen:expect([[
tty ready |
- {2: } |
+ {2:^ } |
+ |
|
|
|
- ^ |
|
]])
end)
@@ -49,26 +49,36 @@ describe('terminal cursor', function()
it('is positioned correctly when unfocused', function()
screen:expect([[
- 1 tty ready |
- 2 {2: } |
- 3 |
- 4 |
- 5 |
- 6 ^ |
+ {7: 1 }tty ready |
+ {7: 2 }^rows: 6, cols: 46 |
+ {7: 3 }{2: } |
+ {7: 4 } |
+ {7: 5 } |
+ {7: 6 } |
:set number |
]])
end)
- pending('is positioned correctly when focused', function()
+ it('is positioned correctly when focused', function()
+ screen:expect([[
+ {7: 1 }tty ready |
+ {7: 2 }^rows: 6, cols: 46 |
+ {7: 3 }{2: } |
+ {7: 4 } |
+ {7: 5 } |
+ {7: 6 } |
+ :set number |
+ ]])
feed('i')
+ helpers.wait()
screen:expect([[
- 1 tty ready |
- 2 {1: } |
- 3 |
- 4 |
- 5 |
- 6 |
- -- TERMINAL -- |
+ {7: 1 }tty ready |
+ {7: 2 }rows: 6, cols: 46 |
+ {7: 3 }{1: } |
+ {7: 4 } |
+ {7: 5 } |
+ {7: 6 } |
+ {3:-- TERMINAL --} |
]])
end)
end)
@@ -83,7 +93,7 @@ describe('terminal cursor', function()
|
|
|
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
show_cursor()
screen:expect([[
@@ -93,28 +103,28 @@ describe('terminal cursor', function()
|
|
|
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
-- same for when the terminal is unfocused
feed('<c-\\><c-n>')
hide_cursor()
screen:expect([[
tty ready |
+ ^ |
|
|
|
|
- ^ |
|
]])
show_cursor()
screen:expect([[
tty ready |
- {2: } |
+ {2:^ } |
+ |
|
|
|
- ^ |
|
]])
end)
@@ -132,17 +142,12 @@ describe('cursor with customized highlighting', function()
screen = Screen.new(50, 7)
screen:set_default_attr_ids({
[1] = {foreground = 45, background = 46},
- [2] = {foreground = 55, background = 56}
+ [2] = {foreground = 55, background = 56},
+ [3] = {bold = true},
})
- screen:set_default_attr_ignore({
- [1] = {bold = true},
- [2] = {foreground = 12},
- [3] = {bold = true, reverse = true},
- [5] = {background = 11},
- [6] = {foreground = 130},
- })
- screen:attach(false)
- execute('call termopen(["'..nvim_dir..'/tty-test"]) | startinsert')
+ screen:attach({rgb=false})
+ command('call termopen(["'..nvim_dir..'/tty-test"])')
+ feed_command('startinsert')
end)
it('overrides the default highlighting', function()
@@ -153,16 +158,16 @@ describe('cursor with customized highlighting', function()
|
|
|
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
feed('<c-\\><c-n>')
screen:expect([[
tty ready |
- {2: } |
+ {2:^ } |
+ |
|
|
|
- ^ |
|
]])
end)
diff --git a/test/functional/terminal/edit_spec.lua b/test/functional/terminal/edit_spec.lua
index c98aef70b1..84d7ae6e9c 100644
--- a/test/functional/terminal/edit_spec.lua
+++ b/test/functional/terminal/edit_spec.lua
@@ -12,7 +12,7 @@ local eq = helpers.eq
describe(':edit term://*', function()
local get_screen = function(columns, lines)
local scr = screen.new(columns, lines)
- scr:attach(false)
+ scr:attach({rgb=false})
return scr
end
@@ -31,45 +31,39 @@ describe(':edit term://*', function()
eq(termopen_runs[1], termopen_runs[1]:match('^term://.//%d+:$'))
end)
- it('runs TermOpen early enough to respect terminal_scrollback_buffer_size', function()
+ it("runs TermOpen early enough to set buffer-local 'scrollback'", function()
local columns, lines = 20, 4
local scr = get_screen(columns, lines)
local rep = 'a'
meths.set_option('shellcmdflag', 'REP ' .. rep)
- local rep_size = rep:byte()
+ command('set shellxquote=') -- win: avoid extra quotes
+ local rep_size = rep:byte() -- 'a' => 97
local sb = 10
- local gsb = 20
- meths.set_var('terminal_scrollback_buffer_size', gsb)
- command('autocmd TermOpen * :let b:terminal_scrollback_buffer_size = '
- .. tostring(sb))
+ command('autocmd TermOpen * :setlocal scrollback='..tostring(sb)
+ ..'|call feedkeys("G", "n")')
command('edit term://foobar')
+
local bufcontents = {}
local winheight = curwinmeths.get_height()
- -- I have no idea why there is + 4 needed. But otherwise it works fine with
- -- different scrollbacks.
- local shift = -4
- local buf_cont_start = rep_size - 1 - sb - winheight - shift
- local bufline = function(i) return ('%d: foobar'):format(i) end
+ local buf_cont_start = rep_size - sb - winheight + 2
for i = buf_cont_start,(rep_size - 1) do
- bufcontents[#bufcontents + 1] = bufline(i)
+ bufcontents[#bufcontents + 1] = ('%d: foobar'):format(i)
end
bufcontents[#bufcontents + 1] = ''
bufcontents[#bufcontents + 1] = '[Process exited 0]'
- -- Do not ask me why displayed screen is one line *before* buffer
- -- contents: buffer starts with 87:, screen with 86:.
+
local exp_screen = '\n'
- local did_cursor = false
- for i = 0,(winheight - 1) do
- local line = bufline(buf_cont_start + i - 1)
+ for i = 1,(winheight - 1) do
+ local line = bufcontents[#bufcontents - winheight + i]
exp_screen = (exp_screen
- .. (did_cursor and '' or '^')
.. line
.. (' '):rep(columns - #line)
.. '|\n')
- did_cursor = true
end
- exp_screen = exp_screen .. (' '):rep(columns) .. '|\n'
+ exp_screen = exp_screen..'^[Process exited 0] |\n'
+
+ exp_screen = exp_screen..(' '):rep(columns)..'|\n'
scr:expect(exp_screen)
- eq(bufcontents, curbufmeths.get_lines(1, -1, true))
+ eq(bufcontents, curbufmeths.get_lines(0, -1, true))
end)
end)
diff --git a/test/functional/terminal/ex_terminal_spec.lua b/test/functional/terminal/ex_terminal_spec.lua
index 458fa02fca..dbee9bdb49 100644
--- a/test/functional/terminal/ex_terminal_spec.lua
+++ b/test/functional/terminal/ex_terminal_spec.lua
@@ -2,7 +2,13 @@ local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
local clear, wait, nvim = helpers.clear, helpers.wait, helpers.nvim
local nvim_dir, source, eq = helpers.nvim_dir, helpers.source, helpers.eq
-local execute, eval = helpers.execute, helpers.eval
+local feed = helpers.feed
+local feed_command, eval = helpers.feed_command, helpers.eval
+local funcs = helpers.funcs
+local retry = helpers.retry
+local ok = helpers.ok
+local iswin = helpers.iswin
+local command = helpers.command
describe(':terminal', function()
local screen
@@ -10,42 +16,174 @@ describe(':terminal', function()
before_each(function()
clear()
screen = Screen.new(50, 4)
- screen:attach(false)
+ screen:attach({rgb=false})
+ end)
+
+ it("does not interrupt Press-ENTER prompt #2748", function()
+ -- Ensure that :messages shows Press-ENTER.
+ source([[
+ echomsg "msg1"
+ echomsg "msg2"
+ echomsg "msg3"
+ ]])
+ -- Invoke a command that emits frequent terminal activity.
+ if iswin() then
+ feed_command([[terminal for /L \%I in (1,0,2) do echo \%I]])
+ else
+ feed_command([[terminal while true; do echo X; done]])
+ end
+ feed([[<C-\><C-N>]])
+ wait()
+ -- Wait for some terminal activity.
+ retry(nil, 4000, function()
+ ok(funcs.line('$') > 6)
+ end)
+ feed_command("messages")
+ screen:expect([[
+ msg1 |
+ msg2 |
+ msg3 |
+ Press ENTER or type command to continue^ |
+ ]])
+ end)
+
+ it("reads output buffer on terminal reporting #4151", function()
+ if helpers.pending_win32(pending) then return end
+ if iswin() then
+ feed_command([[terminal powershell -NoProfile -NoLogo -Command Write-Host -NoNewline "\"$([char]27)[6n\""; Start-Sleep -Milliseconds 500 ]])
+ else
+ feed_command([[terminal printf '\e[6n'; sleep 0.5 ]])
+ end
+ screen:expect{any='%^%[%[1;1R'}
+ end)
+
+ it("in normal-mode :split does not move cursor", function()
+ if iswin() then
+ feed_command([[terminal for /L \\%I in (1,0,2) do ( echo foo & ping -w 100 -n 1 127.0.0.1 > nul )]])
+ else
+ feed_command([[terminal while true; do echo foo; sleep .1; done]])
+ end
+ feed([[<C-\><C-N>M]]) -- move cursor away from last line
+ wait()
+ eq(3, eval("line('$')")) -- window height
+ eq(2, eval("line('.')")) -- cursor is in the middle
+ feed_command('vsplit')
+ eq(2, eval("line('.')")) -- cursor stays where we put it
+ feed_command('split')
+ eq(2, eval("line('.')")) -- cursor stays where we put it
+ end)
+
+ it('Enter/Leave does not increment jumplist #3723', function()
+ feed_command('terminal')
+ local function enter_and_leave()
+ local lines_before = funcs.line('$')
+ -- Create a new line (in the shell). For a normal buffer this
+ -- increments the jumplist; for a terminal-buffer it should not. #3723
+ feed('i')
+ wait()
+ feed('<CR><CR><CR><CR>')
+ wait()
+ feed([[<C-\><C-N>]])
+ wait()
+ -- Wait for >=1 lines to be created.
+ retry(nil, 4000, function()
+ ok(funcs.line('$') > lines_before)
+ end)
+ end
+ enter_and_leave()
+ enter_and_leave()
+ enter_and_leave()
+ ok(funcs.line('$') > 6) -- Verify assumption.
+ local jumps = funcs.split(funcs.execute('jumps'), '\n')
+ eq(' jump line col file/text', jumps[1])
+ eq(3, #jumps)
+ end)
+
+end)
+
+describe(':terminal (with fake shell)', function()
+ local screen
+
+ before_each(function()
+ clear()
+ screen = Screen.new(50, 4)
+ screen:attach({rgb=false})
+ -- shell-test.c is a fake shell that prints its arguments and exits.
nvim('set_option', 'shell', nvim_dir..'/shell-test')
nvim('set_option', 'shellcmdflag', 'EXE')
-
end)
+ -- Invokes `:terminal {cmd}` using a fake shell (shell-test.c) which prints
+ -- the {cmd} and exits immediately .
+ local function terminal_with_fake_shell(cmd)
+ feed_command("terminal "..(cmd and cmd or ""))
+ end
+
it('with no argument, acts like termopen()', function()
- execute('terminal')
- wait()
+ terminal_with_fake_shell()
+ retry(3, 4 * screen.timeout, function()
screen:expect([[
- ready $ |
+ ^ready $ |
[Process exited 0] |
|
- -- TERMINAL -- |
+ :terminal |
+ ]])
+ end)
+ end)
+
+ it("with no argument, and 'shell' is set to empty string", function()
+ nvim('set_option', 'shell', '')
+ terminal_with_fake_shell()
+ screen:expect([[
+ ^ |
+ ~ |
+ ~ |
+ E91: 'shell' option is empty |
+ ]])
+ end)
+
+ it("with no argument, but 'shell' has arguments, acts like termopen()", function()
+ nvim('set_option', 'shell', nvim_dir..'/shell-test -t jeff')
+ terminal_with_fake_shell()
+ screen:expect([[
+ ^jeff $ |
+ [Process exited 0] |
+ |
+ :terminal |
]])
end)
it('executes a given command through the shell', function()
- execute('terminal echo hi')
- wait()
+ command('set shellxquote=') -- win: avoid extra quotes
+ terminal_with_fake_shell('echo hi')
screen:expect([[
- ready $ echo hi |
+ ^ready $ echo hi |
|
[Process exited 0] |
- -- TERMINAL -- |
+ :terminal echo hi |
+ ]])
+ end)
+
+ it("executes a given command through the shell, when 'shell' has arguments", function()
+ nvim('set_option', 'shell', nvim_dir..'/shell-test -t jeff')
+ command('set shellxquote=') -- win: avoid extra quotes
+ terminal_with_fake_shell('echo hi')
+ screen:expect([[
+ ^jeff $ echo hi |
+ |
+ [Process exited 0] |
+ :terminal echo hi |
]])
end)
it('allows quotes and slashes', function()
- execute([[terminal echo 'hello' \ "world"]])
- wait()
+ command('set shellxquote=') -- win: avoid extra quotes
+ terminal_with_fake_shell([[echo 'hello' \ "world"]])
screen:expect([[
- ready $ echo 'hello' \ "world" |
+ ^ready $ echo 'hello' \ "world" |
|
[Process exited 0] |
- -- TERMINAL -- |
+ :terminal echo 'hello' \ "world" |
]])
end)
@@ -56,4 +194,55 @@ describe(':terminal', function()
-- Verify that BufNew actually fired (else the test is invalid).
eq('foo', eval('&shell'))
end)
+
+ it('ignores writes if the backing stream closes', function()
+ terminal_with_fake_shell()
+ feed('iiXXXXXXX')
+ wait()
+ -- Race: Though the shell exited (and streams were closed by SIGCHLD
+ -- handler), :terminal cleanup is pending on the main-loop.
+ -- This write should be ignored (not crash, #5445).
+ feed('iiYYYYYYY')
+ eq(2, eval("1+1")) -- Still alive?
+ end)
+
+ it('works with findfile()', function()
+ feed_command('terminal')
+ eq('term://', string.match(eval('bufname("%")'), "^term://"))
+ eq('scripts/shadacat.py', eval('findfile("scripts/shadacat.py", ".")'))
+ end)
+
+ it('works with :find', function()
+ terminal_with_fake_shell()
+ screen:expect([[
+ ^ready $ |
+ [Process exited 0] |
+ |
+ :terminal |
+ ]])
+ eq('term://', string.match(eval('bufname("%")'), "^term://"))
+ feed([[<C-\><C-N>]])
+ feed_command([[find */shadacat.py]])
+ if iswin() then
+ eq('scripts\\shadacat.py', eval('bufname("%")'))
+ else
+ eq('scripts/shadacat.py', eval('bufname("%")'))
+ end
+ end)
+
+ it('works with gf', function()
+ command('set shellxquote=') -- win: avoid extra quotes
+ terminal_with_fake_shell([[echo "scripts/shadacat.py"]])
+ screen:expect([[
+ ^ready $ echo "scripts/shadacat.py" |
+ |
+ [Process exited 0] |
+ :terminal echo "scripts/shadacat.py" |
+ ]])
+ feed([[<C-\><C-N>]])
+ eq('term://', string.match(eval('bufname("%")'), "^term://"))
+ feed([[ggf"lgf]])
+ eq('scripts/shadacat.py', eval('bufname("%")'))
+ end)
+
end)
diff --git a/test/functional/terminal/helpers.lua b/test/functional/terminal/helpers.lua
index 3d1530bd90..7de0152de0 100644
--- a/test/functional/terminal/helpers.lua
+++ b/test/functional/terminal/helpers.lua
@@ -1,7 +1,7 @@
local helpers = require('test.functional.helpers')(nil)
local Screen = require('test.functional.ui.screen')
local nvim_dir = helpers.nvim_dir
-local execute, nvim, wait = helpers.execute, helpers.nvim, helpers.wait
+local feed_command, nvim = helpers.feed_command, helpers.nvim
local function feed_data(data)
nvim('set_var', 'term_data', data)
@@ -33,53 +33,65 @@ local function disable_mouse() feed_termcode('[?1002l') end
local default_command = '["'..nvim_dir..'/tty-test'..'"]'
+local function screen_setup(extra_rows, command, cols)
+ extra_rows = extra_rows and extra_rows or 0
+ command = command and command or default_command
+ cols = cols and cols or 50
-local function screen_setup(extra_height, command)
nvim('command', 'highlight TermCursor cterm=reverse')
nvim('command', 'highlight TermCursorNC ctermbg=11')
- nvim('set_var', 'terminal_scrollback_buffer_size', 10)
- if not extra_height then extra_height = 0 end
- if not command then command = default_command end
- local screen = Screen.new(50, 7 + extra_height)
+
+ local screen = Screen.new(cols, 7 + extra_rows)
screen:set_default_attr_ids({
[1] = {reverse = true}, -- focused cursor
[2] = {background = 11}, -- unfocused cursor
- })
- screen:set_default_attr_ignore({
- [1] = {bold = true},
- [2] = {foreground = 12},
- [3] = {bold = true, reverse = true},
- [5] = {background = 11},
- [6] = {foreground = 130},
- [7] = {foreground = 15, background = 1}, -- error message
+ [3] = {bold = true},
+ [4] = {foreground = 12},
+ [5] = {bold = true, reverse = true},
+ [6] = {background = 11},
+ [7] = {foreground = 130},
+ [8] = {foreground = 15, background = 1}, -- error message
+ [9] = {foreground = 4},
+ [10] = {foreground = 121}, -- "Press ENTER" in embedded :terminal session.
})
- screen:attach(false)
- -- tty-test puts the terminal into raw mode and echoes all input. tests are
- -- done by feeding it with terminfo codes to control the display and
- -- verifying output with screen:expect.
- execute('enew | call termopen('..command..') | startinsert')
+ screen:attach({rgb=false})
+
+ feed_command('enew | call termopen('..command..')')
+ nvim('input', '<CR>')
+ local vim_errmsg = nvim('eval', 'v:errmsg')
+ if vim_errmsg and "" ~= vim_errmsg then
+ error(vim_errmsg)
+ end
+
+ feed_command('setlocal scrollback=10')
+ feed_command('startinsert')
+
+ -- tty-test puts the terminal into raw mode and echoes input. Tests work by
+ -- feeding termcodes to control the display and asserting by screen:expect.
if command == default_command then
- -- wait for "tty ready" to be printed before each test or the terminal may
- -- still be in canonical mode(will echo characters for example)
- --
- local empty_line = ' '
+ -- Wait for "tty ready" to be printed before each test or the terminal may
+ -- still be in canonical mode (will echo characters for example).
+ local empty_line = (' '):rep(cols)
local expected = {
- 'tty ready ',
- '{1: } ',
+ 'tty ready'..(' '):rep(cols - 9),
+ '{1: }' ..(' '):rep(cols - 1),
empty_line,
empty_line,
empty_line,
empty_line,
}
- for _ = 1, extra_height do
+ for _ = 1, extra_rows do
table.insert(expected, empty_line)
end
- table.insert(expected, '-- TERMINAL -- ')
- screen:expect(table.concat(expected, '\n'))
+ table.insert(expected, '{3:-- TERMINAL --}' .. ((' '):rep(cols - 14)))
+ screen:expect(table.concat(expected, '|\n')..'|')
else
- wait()
+ -- This eval also acts as a wait().
+ if 0 == nvim('eval', "exists('b:terminal_job_id')") then
+ error("terminal job failed to start")
+ end
end
return screen
end
diff --git a/test/functional/terminal/highlight_spec.lua b/test/functional/terminal/highlight_spec.lua
index 8d7c7451d3..f33959c58d 100644
--- a/test/functional/terminal/highlight_spec.lua
+++ b/test/functional/terminal/highlight_spec.lua
@@ -2,10 +2,9 @@ local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
local thelpers = require('test.functional.terminal.helpers')
local feed, clear, nvim = helpers.feed, helpers.clear, helpers.nvim
-local nvim_dir, execute = helpers.nvim_dir, helpers.execute
+local nvim_dir, command = helpers.nvim_dir, helpers.command
local eq, eval = helpers.eq, helpers.eval
-
describe('terminal window highlighting', function()
local screen
@@ -16,36 +15,36 @@ describe('terminal window highlighting', function()
[1] = {foreground = 45},
[2] = {background = 46},
[3] = {foreground = 45, background = 46},
- [4] = {bold = true, italic = true, underline = true}
- })
- screen:set_default_attr_ignore({
- [1] = {bold = true},
- [2] = {foreground = 12},
- [3] = {bold = true, reverse = true},
- [5] = {background = 11},
- [6] = {foreground = 130},
- [7] = {reverse = true},
+ [4] = {bold = true, italic = true, underline = true},
+ [5] = {bold = true},
+ [6] = {foreground = 12},
+ [7] = {bold = true, reverse = true},
[8] = {background = 11},
+ [9] = {foreground = 130},
+ [10] = {reverse = true},
+ [11] = {background = 11},
})
- screen:attach(false)
- execute('enew | call termopen(["'..nvim_dir..'/tty-test"]) | startinsert')
+ screen:attach({rgb=false})
+ command('enew | call termopen(["'..nvim_dir..'/tty-test"])')
+ feed('i')
screen:expect([[
tty ready |
+ {10: } |
|
|
|
|
- |
- -- TERMINAL -- |
+ {5:-- TERMINAL --} |
]])
end)
local function descr(title, attr_num, set_attrs_fn)
local function sub(s)
- return s:gsub('NUM', attr_num)
+ local str = s:gsub('NUM', attr_num)
+ return str
end
- describe(title, function()
+ describe(title, function()
before_each(function()
set_attrs_fn()
thelpers.feed_data('text')
@@ -54,21 +53,22 @@ describe('terminal window highlighting', function()
end)
local function pass_attrs()
- local s = sub([[
+ if helpers.pending_win32(pending) then return end
+ screen:expect(sub([[
tty ready |
- {NUM:text}text |
+ {NUM:text}text{10: } |
|
|
|
|
- -- TERMINAL -- |
- ]])
- screen:expect(s)
+ {5:-- TERMINAL --} |
+ ]]))
end
it('will pass the corresponding attributes', pass_attrs)
it('will pass the corresponding attributes on scrollback', function()
+ if helpers.pending_win32(pending) then return end
pass_attrs()
local lines = {}
for i = 1, 8 do
@@ -82,11 +82,11 @@ describe('terminal window highlighting', function()
line6 |
line7 |
line8 |
- |
- -- TERMINAL -- |
+ {10: } |
+ {5:-- TERMINAL --} |
]])
feed('<c-\\><c-n>gg')
- local s = sub([[
+ screen:expect(sub([[
^tty ready |
{NUM:text}textline1 |
line2 |
@@ -94,8 +94,7 @@ describe('terminal window highlighting', function()
line4 |
line5 |
|
- ]])
- screen:expect(s)
+ ]]))
end)
end)
end
@@ -121,44 +120,44 @@ describe('terminal window highlighting with custom palette', function()
clear()
screen = Screen.new(50, 7)
screen:set_default_attr_ids({
- [1] = {foreground = 1193046, special = Screen.colors.Black}
- })
- screen:set_default_attr_ignore({
- [1] = {bold = true},
+ [1] = {foreground = tonumber('0x123456')},
[2] = {foreground = 12},
[3] = {bold = true, reverse = true},
[5] = {background = 11},
[6] = {foreground = 130},
[7] = {reverse = true},
[8] = {background = 11},
+ [9] = {bold = true},
})
- screen:attach(true)
+ screen:attach({rgb=true})
nvim('set_var', 'terminal_color_3', '#123456')
- execute('enew | call termopen(["'..nvim_dir..'/tty-test"]) | startinsert')
+ command('enew | call termopen(["'..nvim_dir..'/tty-test"])')
+ feed('i')
screen:expect([[
tty ready |
+ {7: } |
|
|
|
|
- |
- -- TERMINAL -- |
+ {9:-- TERMINAL --} |
]])
end)
it('will use the custom color', function()
+ if helpers.pending_win32(pending) then return end
thelpers.set_fg(3)
thelpers.feed_data('text')
thelpers.clear_attrs()
thelpers.feed_data('text')
screen:expect([[
tty ready |
- {1:text}text |
+ {1:text}text{7: } |
|
|
|
|
- -- TERMINAL -- |
+ {9:-- TERMINAL --} |
]])
end)
end)
@@ -168,16 +167,16 @@ describe('synIDattr()', function()
before_each(function()
clear()
screen = Screen.new(50, 7)
- execute('highlight Normal ctermfg=252 guifg=#ff0000 guibg=Black')
+ command('highlight Normal ctermfg=252 guifg=#ff0000 guibg=Black')
-- Salmon #fa8072 Maroon #800000
- execute('highlight Keyword ctermfg=79 guifg=Salmon guisp=Maroon')
+ command('highlight Keyword ctermfg=79 guifg=Salmon guisp=Maroon')
end)
it('returns cterm-color if RGB-capable UI is _not_ attached', function()
eq('252', eval('synIDattr(hlID("Normal"), "fg")'))
eq('252', eval('synIDattr(hlID("Normal"), "fg#")'))
- eq('-1', eval('synIDattr(hlID("Normal"), "bg")'))
- eq('-1', eval('synIDattr(hlID("Normal"), "bg#")'))
+ eq('', eval('synIDattr(hlID("Normal"), "bg")'))
+ eq('', eval('synIDattr(hlID("Normal"), "bg#")'))
eq('79', eval('synIDattr(hlID("Keyword"), "fg")'))
eq('79', eval('synIDattr(hlID("Keyword"), "fg#")'))
eq('', eval('synIDattr(hlID("Keyword"), "sp")'))
@@ -190,7 +189,7 @@ describe('synIDattr()', function()
end)
it('returns gui-color if RGB-capable UI is attached', function()
- screen:attach(true)
+ screen:attach({rgb=true})
eq('#ff0000', eval('synIDattr(hlID("Normal"), "fg")'))
eq('Black', eval('synIDattr(hlID("Normal"), "bg")'))
eq('Salmon', eval('synIDattr(hlID("Keyword"), "fg")'))
@@ -198,16 +197,66 @@ describe('synIDattr()', function()
end)
it('returns #RRGGBB value for fg#/bg#/sp#', function()
- screen:attach(true)
- eq('#ff0000', eval('synIDattr(hlID("Normal"), "fg#")'))
- eq('#000000', eval('synIDattr(hlID("Normal"), "bg#")'))
+ screen:attach({rgb=true})
+ eq('#ff0000', eval('synIDattr(hlID("Normal"), "fg#")'))
+ eq('#000000', eval('synIDattr(hlID("Normal"), "bg#")'))
eq('#fa8072', eval('synIDattr(hlID("Keyword"), "fg#")'))
eq('#800000', eval('synIDattr(hlID("Keyword"), "sp#")'))
end)
it('returns color number if non-GUI', function()
- screen:attach(false)
+ screen:attach({rgb=false})
eq('252', eval('synIDattr(hlID("Normal"), "fg")'))
eq('79', eval('synIDattr(hlID("Keyword"), "fg")'))
end)
end)
+
+describe('fg/bg special colors', function()
+ local screen
+ before_each(function()
+ clear()
+ screen = Screen.new(50, 7)
+ command('highlight Normal ctermfg=145 ctermbg=16 guifg=#ff0000 guibg=Black')
+ command('highlight Visual ctermfg=bg ctermbg=fg guifg=bg guibg=fg guisp=bg')
+ end)
+
+ it('resolve to "Normal" values', function()
+ eq(eval('synIDattr(hlID("Normal"), "bg")'),
+ eval('synIDattr(hlID("Visual"), "fg")'))
+ eq(eval('synIDattr(hlID("Normal"), "bg#")'),
+ eval('synIDattr(hlID("Visual"), "fg#")'))
+ eq(eval('synIDattr(hlID("Normal"), "fg")'),
+ eval('synIDattr(hlID("Visual"), "bg")'))
+ eq(eval('synIDattr(hlID("Normal"), "fg#")'),
+ eval('synIDattr(hlID("Visual"), "bg#")'))
+ eq('bg', eval('synIDattr(hlID("Visual"), "fg", "gui")'))
+ eq('bg', eval('synIDattr(hlID("Visual"), "fg#", "gui")'))
+ eq('fg', eval('synIDattr(hlID("Visual"), "bg", "gui")'))
+ eq('fg', eval('synIDattr(hlID("Visual"), "bg#", "gui")'))
+ eq('bg', eval('synIDattr(hlID("Visual"), "sp", "gui")'))
+ eq('bg', eval('synIDattr(hlID("Visual"), "sp#", "gui")'))
+ end)
+
+ it('resolve to "Normal" values in RGB-capable UI', function()
+ screen:attach({rgb=true})
+ eq('bg', eval('synIDattr(hlID("Visual"), "fg")'))
+ eq(eval('synIDattr(hlID("Normal"), "bg#")'),
+ eval('synIDattr(hlID("Visual"), "fg#")'))
+ eq('fg', eval('synIDattr(hlID("Visual"), "bg")'))
+ eq(eval('synIDattr(hlID("Normal"), "fg#")'),
+ eval('synIDattr(hlID("Visual"), "bg#")'))
+ eq('bg', eval('synIDattr(hlID("Visual"), "sp")'))
+ eq(eval('synIDattr(hlID("Normal"), "bg#")'),
+ eval('synIDattr(hlID("Visual"), "sp#")'))
+ end)
+
+ it('resolve after the "Normal" group is modified', function()
+ screen:attach({rgb=true})
+ local new_guibg = '#282c34'
+ local new_guifg = '#abb2bf'
+ command('highlight Normal guifg='..new_guifg..' guibg='..new_guibg)
+ eq(new_guibg, eval('synIDattr(hlID("Visual"), "fg#")'))
+ eq(new_guifg, eval('synIDattr(hlID("Visual"), "bg#")'))
+ eq(new_guibg, eval('synIDattr(hlID("Visual"), "sp#")'))
+ end)
+end)
diff --git a/test/functional/terminal/mouse_spec.lua b/test/functional/terminal/mouse_spec.lua
index a86615184d..263a5ce79d 100644
--- a/test/functional/terminal/mouse_spec.lua
+++ b/test/functional/terminal/mouse_spec.lua
@@ -1,6 +1,6 @@
local helpers = require('test.functional.helpers')(after_each)
local thelpers = require('test.functional.terminal.helpers')
-local clear = helpers.clear
+local clear, eq, eval = helpers.clear, helpers.eq, helpers.eval
local feed, nvim = helpers.feed, helpers.nvim
local feed_data = thelpers.feed_data
@@ -27,7 +27,7 @@ describe('terminal mouse', function()
line29 |
line30 |
{1: } |
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
end)
@@ -36,31 +36,17 @@ describe('terminal mouse', function()
end)
describe('when the terminal has focus', function()
- it('will exit focus when scrolled', function()
- feed('<MouseDown><0,0>')
- screen:expect([[
- line23 |
- line24 |
- line25 |
- line26 |
- line27 |
- ^line28 |
- |
- ]])
+ it('will exit focus on mouse-scroll', function()
+ eq('t', eval('mode()'))
+ feed('<ScrollWheelUp><0,0>')
+ eq('n', eval('mode()'))
end)
- it('will exit focus after <C-\\>, then scrolled', function()
+ it('will exit focus on <C-\\> + mouse-scroll', function()
+ eq('t', eval('mode()'))
feed('<C-\\>')
- feed('<MouseDown><0,0>')
- screen:expect([[
- line23 |
- line24 |
- line25 |
- line26 |
- line27 |
- ^line28 |
- |
- ]])
+ feed('<ScrollWheelUp><0,0>')
+ eq('n', eval('mode()'))
end)
describe('with mouse events enabled by the program', function()
@@ -74,11 +60,12 @@ describe('terminal mouse', function()
line30 |
mouse enabled |
{1: } |
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
end)
it('will forward mouse clicks to the program', function()
+ if helpers.pending_win32(pending) then return end
feed('<LeftMouse><1,2>')
screen:expect([[
line27 |
@@ -87,12 +74,13 @@ describe('terminal mouse', function()
line30 |
mouse enabled |
"#{1: } |
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
end)
it('will forward mouse scroll to the program', function()
- feed('<MouseDown><0,0>')
+ if helpers.pending_win32(pending) then return end
+ feed('<ScrollWheelUp><0,0>')
screen:expect([[
line27 |
line28 |
@@ -100,98 +88,99 @@ describe('terminal mouse', function()
line30 |
mouse enabled |
`!!{1: } |
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
end)
end)
describe('with a split window and other buffer', function()
+ if helpers.pending_win32(pending) then return end
before_each(function()
feed('<c-\\><c-n>:vsp<cr>')
screen:expect([[
- line28 |line28 |
- line29 |line29 |
- line30 |line30 |
- rows: 5, cols: 25 |rows: 5, cols: 25 |
- {2:^ } |{2: } |
+ line28 โ”‚line28 |
+ line29 โ”‚line29 |
+ line30 โ”‚line30 |
+ rows: 5, cols: 25 โ”‚rows: 5, cols: 25 |
+ {2:^ } โ”‚{2: } |
========== ========== |
- |
+ :vsp |
]])
feed(':enew | set number<cr>')
screen:expect([[
- 1 ^ |line28 |
- ~ |line29 |
- ~ |line30 |
- ~ |rows: 5, cols: 25 |
- ~ |{2: } |
+ {7: 1 }^ โ”‚line28 |
+ {4:~ }โ”‚line29 |
+ {4:~ }โ”‚line30 |
+ {4:~ }โ”‚rows: 5, cols: 25 |
+ {4:~ }โ”‚{2: } |
========== ========== |
:enew | set number |
]])
feed('30iline\n<esc>')
screen:expect([[
- 27 line |line28 |
- 28 line |line29 |
- 29 line |line30 |
- 30 line |rows: 5, cols: 25 |
- 31 ^ |{2: } |
+ {7: 27 }line โ”‚line28 |
+ {7: 28 }line โ”‚line29 |
+ {7: 29 }line โ”‚line30 |
+ {7: 30 }line โ”‚rows: 5, cols: 25 |
+ {7: 31 }^ โ”‚{2: } |
========== ========== |
|
]])
feed('<c-w>li')
screen:expect([[
- 27 line |line29 |
- 28 line |line30 |
- 29 line |rows: 5, cols: 25 |
- 30 line |rows: 5, cols: 24 |
- 31 |{1: } |
+ {7: 27 }line โ”‚line28 |
+ {7: 28 }line โ”‚line29 |
+ {7: 29 }line โ”‚line30 |
+ {7: 30 }line โ”‚rows: 5, cols: 25 |
+ {7: 31 } โ”‚{1: } |
========== ========== |
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
-- enabling mouse won't affect interaction with other windows
thelpers.enable_mouse()
thelpers.feed_data('mouse enabled\n')
screen:expect([[
- 27 line |line30 |
- 28 line |rows: 5, cols: 25 |
- 29 line |rows: 5, cols: 24 |
- 30 line |mouse enabled |
- 31 |{1: } |
+ {7: 27 }line โ”‚line29 |
+ {7: 28 }line โ”‚line30 |
+ {7: 29 }line โ”‚rows: 5, cols: 25 |
+ {7: 30 }line โ”‚mouse enabled |
+ {7: 31 } โ”‚{1: } |
========== ========== |
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
end)
it('wont lose focus if another window is scrolled', function()
- feed('<MouseDown><0,0><MouseDown><0,0>')
+ feed('<ScrollWheelUp><0,0><ScrollWheelUp><0,0>')
screen:expect([[
- 21 line |line30 |
- 22 line |rows: 5, cols: 25 |
- 23 line |rows: 5, cols: 24 |
- 24 line |mouse enabled |
- 25 line |{1: } |
+ {7: 21 }line โ”‚line29 |
+ {7: 22 }line โ”‚line30 |
+ {7: 23 }line โ”‚rows: 5, cols: 25 |
+ {7: 24 }line โ”‚mouse enabled |
+ {7: 25 }line โ”‚{1: } |
========== ========== |
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
- feed('<S-MouseUp><0,0>')
+ feed('<S-ScrollWheelDown><0,0>')
screen:expect([[
- 26 line |line30 |
- 27 line |rows: 5, cols: 25 |
- 28 line |rows: 5, cols: 24 |
- 29 line |mouse enabled |
- 30 line |{1: } |
+ {7: 26 }line โ”‚line29 |
+ {7: 27 }line โ”‚line30 |
+ {7: 28 }line โ”‚rows: 5, cols: 25 |
+ {7: 29 }line โ”‚mouse enabled |
+ {7: 30 }line โ”‚{1: } |
========== ========== |
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
end)
it('will lose focus if another window is clicked', function()
feed('<LeftMouse><5,1>')
screen:expect([[
- 27 line |line30 |
- 28 l^ine |rows: 5, cols: 25 |
- 29 line |rows: 5, cols: 24 |
- 30 line |mouse enabled |
- 31 |{2: } |
+ {7: 27 }line โ”‚line29 |
+ {7: 28 }l^ine โ”‚line30 |
+ {7: 29 }line โ”‚rows: 5, cols: 25 |
+ {7: 30 }line โ”‚mouse enabled |
+ {7: 31 } โ”‚{2: } |
========== ========== |
|
]])
diff --git a/test/functional/terminal/scrollback_spec.lua b/test/functional/terminal/scrollback_spec.lua
index 7914e30a44..1c97441213 100644
--- a/test/functional/terminal/scrollback_spec.lua
+++ b/test/functional/terminal/scrollback_spec.lua
@@ -2,8 +2,14 @@ local Screen = require('test.functional.ui.screen')
local helpers = require('test.functional.helpers')(after_each)
local thelpers = require('test.functional.terminal.helpers')
local clear, eq, curbuf = helpers.clear, helpers.eq, helpers.curbuf
-local feed, nvim_dir, execute = helpers.feed, helpers.nvim_dir, helpers.execute
+local feed, nvim_dir, feed_command = helpers.feed, helpers.nvim_dir, helpers.feed_command
+local iswin = helpers.iswin
+local eval = helpers.eval
+local command = helpers.command
local wait = helpers.wait
+local retry = helpers.retry
+local curbufmeths = helpers.curbufmeths
+local nvim = helpers.nvim
local feed_data = thelpers.feed_data
describe('terminal scrollback', function()
@@ -11,14 +17,14 @@ describe('terminal scrollback', function()
before_each(function()
clear()
- screen = thelpers.screen_setup()
+ screen = thelpers.screen_setup(nil, nil, 30)
end)
after_each(function()
screen:detach()
end)
- describe('when the limit is crossed', function()
+ describe('when the limit is exceeded', function()
before_each(function()
local lines = {}
for i = 1, 30 do
@@ -27,41 +33,41 @@ describe('terminal scrollback', function()
table.insert(lines, '')
feed_data(lines)
screen:expect([[
- line26 |
- line27 |
- line28 |
- line29 |
- line30 |
- {1: } |
- -- TERMINAL -- |
+ line26 |
+ line27 |
+ line28 |
+ line29 |
+ line30 |
+ {1: } |
+ {3:-- TERMINAL --} |
]])
end)
it('will delete extra lines at the top', function()
feed('<c-\\><c-n>gg')
screen:expect([[
- ^line16 |
- line17 |
- line18 |
- line19 |
- line20 |
- line21 |
- |
+ ^line16 |
+ line17 |
+ line18 |
+ line19 |
+ line20 |
+ line21 |
+ |
]])
end)
end)
- describe('with the cursor at the last row', function()
+ describe('with cursor at last row', function()
before_each(function()
feed_data({'line1', 'line2', 'line3', 'line4', ''})
screen:expect([[
- tty ready |
- line1 |
- line2 |
- line3 |
- line4 |
- {1: } |
- -- TERMINAL -- |
+ tty ready |
+ line1 |
+ line2 |
+ line3 |
+ line4 |
+ {1: } |
+ {3:-- TERMINAL --} |
]])
end)
@@ -70,13 +76,13 @@ describe('terminal scrollback', function()
it('will hide the top line', function()
screen:expect([[
- line1 |
- line2 |
- line3 |
- line4 |
- line5 |
- {1: } |
- -- TERMINAL -- |
+ line1 |
+ line2 |
+ line3 |
+ line4 |
+ line5 |
+ {1: } |
+ {3:-- TERMINAL --} |
]])
eq(7, curbuf('line_count'))
end)
@@ -86,62 +92,64 @@ describe('terminal scrollback', function()
it('will hide the top 4 lines', function()
screen:expect([[
- line3 |
- line4 |
- line5 |
- line6 |
- line7 |
- line8{1: } |
- -- TERMINAL -- |
+ line3 |
+ line4 |
+ line5 |
+ line6 |
+ line7 |
+ line8{1: } |
+ {3:-- TERMINAL --} |
]])
feed('<c-\\><c-n>6k')
screen:expect([[
- ^line2 |
- line3 |
- line4 |
- line5 |
- line6 |
- line7 |
- |
+ ^line2 |
+ line3 |
+ line4 |
+ line5 |
+ line6 |
+ line7 |
+ |
]])
feed('gg')
screen:expect([[
- ^tty ready |
- line1 |
- line2 |
- line3 |
- line4 |
- line5 |
- |
+ ^tty ready |
+ line1 |
+ line2 |
+ line3 |
+ line4 |
+ line5 |
+ |
]])
feed('G')
screen:expect([[
- line3 |
- line4 |
- line5 |
- line6 |
- line7 |
- ^line8{2: } |
- |
+ line3 |
+ line4 |
+ line5 |
+ line6 |
+ line7 |
+ ^line8{2: } |
+ |
]])
end)
end)
end)
- describe('and the height is decreased by 1', function()
+ describe('and height decreased by 1', function()
+ if helpers.pending_win32(pending) then return end
local function will_hide_top_line()
- screen:try_resize(screen._width, screen._height - 1)
+ feed([[<C-\><C-N>:]]) -- Go to cmdline-mode, so cursor is at bottom.
+ screen:try_resize(screen._width - 2, screen._height - 1)
screen:expect([[
- line2 |
- line3 |
- line4 |
- rows: 5, cols: 50 |
- {1: } |
- -- TERMINAL -- |
+ line2 |
+ line3 |
+ line4 |
+ rows: 5, cols: 28 |
+ {2: } |
+ :^ |
]])
end
@@ -150,23 +158,23 @@ describe('terminal scrollback', function()
describe('and then decreased by 2', function()
before_each(function()
will_hide_top_line()
- screen:try_resize(screen._width, screen._height - 2)
+ screen:try_resize(screen._width - 2, screen._height - 2)
end)
it('will hide the top 3 lines', function()
screen:expect([[
- rows: 5, cols: 50 |
- rows: 3, cols: 50 |
- {1: } |
- -- TERMINAL -- |
+ rows: 5, cols: 28 |
+ rows: 3, cols: 26 |
+ {2: } |
+ :^ |
]])
eq(8, curbuf('line_count'))
- feed('<c-\\><c-n>3k')
+ feed([[<C-\><C-N>3k]])
screen:expect([[
- ^line4 |
- rows: 5, cols: 50 |
- rows: 3, cols: 50 |
- |
+ ^line4 |
+ rows: 5, cols: 28 |
+ rows: 3, cols: 26 |
+ |
]])
end)
end)
@@ -174,6 +182,11 @@ describe('terminal scrollback', function()
end)
describe('with empty lines after the cursor', function()
+ -- XXX: Can't test this reliably on Windows unless the cursor is _moved_
+ -- by the resize. http://docs.libuv.org/en/v1.x/signal.html
+ -- See also: https://github.com/rprichard/winpty/issues/110
+ if helpers.pending_win32(pending) then return end
+
describe('and the height is decreased by 2', function()
before_each(function()
screen:try_resize(screen._width, screen._height - 2)
@@ -181,11 +194,11 @@ describe('terminal scrollback', function()
local function will_delete_last_two_lines()
screen:expect([[
- tty ready |
- rows: 4, cols: 50 |
- {1: } |
- |
- -- TERMINAL -- |
+ tty ready |
+ rows: 4, cols: 30 |
+ {1: } |
+ |
+ {3:-- TERMINAL --} |
]])
eq(4, curbuf('line_count'))
end
@@ -200,25 +213,25 @@ describe('terminal scrollback', function()
it('will delete the last line and hide the first', function()
screen:expect([[
- rows: 4, cols: 50 |
- rows: 3, cols: 50 |
- {1: } |
- -- TERMINAL -- |
+ rows: 4, cols: 30 |
+ rows: 3, cols: 30 |
+ {1: } |
+ {3:-- TERMINAL --} |
]])
eq(4, curbuf('line_count'))
feed('<c-\\><c-n>gg')
screen:expect([[
- ^tty ready |
- rows: 4, cols: 50 |
- rows: 3, cols: 50 |
- |
+ ^tty ready |
+ rows: 4, cols: 30 |
+ rows: 3, cols: 30 |
+ |
]])
feed('a')
screen:expect([[
- rows: 4, cols: 50 |
- rows: 3, cols: 50 |
- {1: } |
- -- TERMINAL -- |
+ rows: 4, cols: 30 |
+ rows: 3, cols: 30 |
+ {1: } |
+ {3:-- TERMINAL --} |
]])
end)
end)
@@ -229,33 +242,37 @@ describe('terminal scrollback', function()
before_each(function()
feed_data({'line1', 'line2', 'line3', 'line4', ''})
screen:expect([[
- tty ready |
- line1 |
- line2 |
- line3 |
- line4 |
- {1: } |
- -- TERMINAL -- |
+ tty ready |
+ line1 |
+ line2 |
+ line3 |
+ line4 |
+ {1: } |
+ {3:-- TERMINAL --} |
]])
screen:try_resize(screen._width, screen._height - 3)
screen:expect([[
- line4 |
- rows: 3, cols: 50 |
- {1: } |
- -- TERMINAL -- |
+ line4 |
+ rows: 3, cols: 30 |
+ {1: } |
+ {3:-- TERMINAL --} |
]])
eq(7, curbuf('line_count'))
end)
describe('and the height is increased by 1', function()
+ -- XXX: Can't test this reliably on Windows unless the cursor is _moved_
+ -- by the resize. http://docs.libuv.org/en/v1.x/signal.html
+ -- See also: https://github.com/rprichard/winpty/issues/110
+ if helpers.pending_win32(pending) then return end
local function pop_then_push()
screen:try_resize(screen._width, screen._height + 1)
screen:expect([[
- line4 |
- rows: 3, cols: 50 |
- rows: 4, cols: 50 |
- {1: } |
- -- TERMINAL -- |
+ line4 |
+ rows: 3, cols: 30 |
+ rows: 4, cols: 30 |
+ {1: } |
+ {3:-- TERMINAL --} |
]])
end
@@ -270,26 +287,26 @@ describe('terminal scrollback', function()
local function pop3_then_push1()
screen:expect([[
- line2 |
- line3 |
- line4 |
- rows: 3, cols: 50 |
- rows: 4, cols: 50 |
- rows: 7, cols: 50 |
- {1: } |
- -- TERMINAL -- |
+ line2 |
+ line3 |
+ line4 |
+ rows: 3, cols: 30 |
+ rows: 4, cols: 30 |
+ rows: 7, cols: 30 |
+ {1: } |
+ {3:-- TERMINAL --} |
]])
eq(9, curbuf('line_count'))
feed('<c-\\><c-n>gg')
screen:expect([[
- ^tty ready |
- line1 |
- line2 |
- line3 |
- line4 |
- rows: 3, cols: 50 |
- rows: 4, cols: 50 |
- |
+ ^tty ready |
+ line1 |
+ line2 |
+ line3 |
+ line4 |
+ rows: 3, cols: 30 |
+ rows: 4, cols: 30 |
+ |
]])
end
@@ -304,18 +321,18 @@ describe('terminal scrollback', function()
it('will show all lines and leave a blank one at the end', function()
screen:expect([[
- tty ready |
- line1 |
- line2 |
- line3 |
- line4 |
- rows: 3, cols: 50 |
- rows: 4, cols: 50 |
- rows: 7, cols: 50 |
- rows: 11, cols: 50 |
- {1: } |
- |
- -- TERMINAL -- |
+ tty ready |
+ line1 |
+ line2 |
+ line3 |
+ line4 |
+ rows: 3, cols: 30 |
+ rows: 4, cols: 30 |
+ rows: 7, cols: 30 |
+ rows: 11, cols: 30 |
+ {1: } |
+ |
+ {3:-- TERMINAL --} |
]])
-- since there's an empty line after the cursor, the buffer line
-- count equals the terminal screen height
@@ -330,30 +347,169 @@ end)
describe('terminal prints more lines than the screen height and exits', function()
it('will push extra lines to scrollback', function()
clear()
- local screen = Screen.new(50, 7)
- screen:attach(false)
- execute('call termopen(["'..nvim_dir..'/tty-test", "10"]) | startinsert')
+ local screen = Screen.new(30, 7)
+ screen:attach({rgb=false})
+ feed_command('call termopen(["'..nvim_dir..'/tty-test", "10"]) | startinsert')
wait()
screen:expect([[
- line6 |
- line7 |
- line8 |
- line9 |
- |
- [Process exited 0] |
- -- TERMINAL -- |
+ line6 |
+ line7 |
+ line8 |
+ line9 |
+ |
+ [Process exited 0] |
+ -- TERMINAL -- |
]])
feed('<cr>')
-- closes the buffer correctly after pressing a key
screen:expect([[
- ^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- |
+ ^ |
+ ~ |
+ ~ |
+ ~ |
+ ~ |
+ ~ |
+ |
]])
end)
end)
+describe("'scrollback' option", function()
+ before_each(function()
+ clear()
+ end)
+
+ local function set_fake_shell()
+ -- shell-test.c is a fake shell that prints its arguments and exits.
+ nvim('set_option', 'shell', nvim_dir..'/shell-test')
+ nvim('set_option', 'shellcmdflag', 'EXE')
+ end
+
+ local function expect_lines(expected, epsilon)
+ local ep = epsilon and epsilon or 0
+ local actual = eval("line('$')")
+ if expected > actual + ep and expected < actual - ep then
+ error('expected (+/- '..ep..'): '..expected..', actual: '..tostring(actual))
+ end
+ end
+
+ it('set to 0 behaves as 1', function()
+ local screen
+ if iswin() then
+ screen = thelpers.screen_setup(nil, "['cmd.exe']", 30)
+ else
+ screen = thelpers.screen_setup(nil, "['sh']", 30)
+ end
+
+ curbufmeths.set_option('scrollback', 0)
+ if iswin() then
+ feed_data('for /L %I in (1,1,30) do @(echo line%I)\r')
+ else
+ feed_data('for i in $(seq 1 30); do echo "line$i"; done\n')
+ end
+ screen:expect{any='line30 '}
+ retry(nil, nil, function() expect_lines(7) end)
+
+ screen:detach()
+ end)
+
+ it('deletes lines (only) if necessary', function()
+ local screen
+ if iswin() then
+ command([[let $PROMPT='$$']])
+ screen = thelpers.screen_setup(nil, "['cmd.exe']", 30)
+ else
+ screen = thelpers.screen_setup(nil, "['sh']", 30)
+ end
+
+ curbufmeths.set_option('scrollback', 200)
+
+ -- Wait for prompt.
+ screen:expect{any='%$'}
+
+ if iswin() then
+ feed_data('for /L %I in (1,1,30) do @(echo line%I)\r')
+ else
+ feed_data('for i in $(seq 1 30); do echo "line$i"; done\n')
+ end
+
+ screen:expect{any='line30 '}
+
+ retry(nil, nil, function() expect_lines(33, 2) end)
+ curbufmeths.set_option('scrollback', 10)
+ wait()
+ retry(nil, nil, function() expect_lines(16) end)
+ curbufmeths.set_option('scrollback', 10000)
+ retry(nil, nil, function() expect_lines(16) end)
+ -- Terminal job data is received asynchronously, may happen before the
+ -- 'scrollback' option is synchronized with the internal sb_buffer.
+ command('sleep 100m')
+ if iswin() then
+ feed_data('for /L %I in (1,1,40) do @(echo line%I)\r')
+ else
+ feed_data('for i in $(seq 1 40); do echo "line$i"; done\n')
+ end
+
+ screen:expect{any='line40 '}
+
+ retry(nil, nil, function() expect_lines(58) end)
+ -- Verify off-screen state
+ eq((iswin() and 'line36' or 'line35'), eval("getline(line('w0') - 1)"))
+ eq((iswin() and 'line27' or 'line26'), eval("getline(line('w0') - 10)"))
+
+ screen:detach()
+ end)
+
+ it('defaults to 10000 in terminal buffers', function()
+ set_fake_shell()
+ command('terminal')
+ eq(10000, curbufmeths.get_option('scrollback'))
+ end)
+
+ it('error if set to invalid value', function()
+ local status, rv = pcall(command, 'set scrollback=-2')
+ eq(false, status) -- assert failure
+ eq('E474:', string.match(rv, "E%d*:"))
+
+ status, rv = pcall(command, 'set scrollback=100001')
+ eq(false, status) -- assert failure
+ eq('E474:', string.match(rv, "E%d*:"))
+ end)
+
+ it('defaults to -1 on normal buffers', function()
+ command('new')
+ eq(-1, curbufmeths.get_option('scrollback'))
+ end)
+
+ it(':setlocal in a normal buffer is an error', function()
+ command('new')
+
+ -- :setlocal to -1 is NOT an error.
+ feed_command('setlocal scrollback=-1')
+ eq(nil, string.match(eval("v:errmsg"), "E%d*:"))
+ feed('<CR>')
+
+ -- :setlocal to anything except -1 is an error.
+ feed_command('setlocal scrollback=42')
+ feed('<CR>')
+ eq('E474:', string.match(eval("v:errmsg"), "E%d*:"))
+ eq(-1, curbufmeths.get_option('scrollback'))
+ end)
+
+ it(':set updates local value and global default', function()
+ set_fake_shell()
+ command('set scrollback=42') -- set global and (attempt) local
+ eq(-1, curbufmeths.get_option('scrollback')) -- normal buffer: -1
+ command('terminal')
+ eq(42, curbufmeths.get_option('scrollback')) -- inherits global default
+ command('setlocal scrollback=99')
+ eq(99, curbufmeths.get_option('scrollback'))
+ command('set scrollback<') -- reset to global default
+ eq(42, curbufmeths.get_option('scrollback'))
+ command('setglobal scrollback=734') -- new global default
+ eq(42, curbufmeths.get_option('scrollback')) -- local value did not change
+ command('terminal')
+ eq(734, curbufmeths.get_option('scrollback'))
+ end)
+
+end)
diff --git a/test/functional/terminal/tui_spec.lua b/test/functional/terminal/tui_spec.lua
index 2c21b724aa..1bc1334a6a 100644
--- a/test/functional/terminal/tui_spec.lua
+++ b/test/functional/terminal/tui_spec.lua
@@ -1,28 +1,40 @@
--- Some sanity checks for the TUI using the builtin terminal emulator
--- as a simple way to send keys and assert screen state.
+-- TUI acceptance tests.
+-- Uses :terminal as a way to send keys and assert screen state.
+local global_helpers = require('test.helpers')
+local uname = global_helpers.uname
local helpers = require('test.functional.helpers')(after_each)
local thelpers = require('test.functional.terminal.helpers')
-local feed = thelpers.feed_data
-local execute = helpers.execute
+local Screen = require('test.functional.ui.screen')
+local eq = helpers.eq
+local feed_command = helpers.feed_command
+local feed_data = thelpers.feed_data
+local clear = helpers.clear
+local command = helpers.command
+local eval = helpers.eval
local nvim_dir = helpers.nvim_dir
+local retry = helpers.retry
+local nvim_prog = helpers.nvim_prog
+local nvim_set = helpers.nvim_set
+local ok = helpers.ok
+local read_file = helpers.read_file
-describe('tui', function()
+if helpers.pending_win32(pending) then return end
+
+describe('TUI', function()
local screen
before_each(function()
- helpers.clear()
- screen = thelpers.screen_setup(0, '["'..helpers.nvim_prog..'", "-u", "NONE", "-i", "NONE", "--cmd", "set noswapfile"]')
- -- right now pasting can be really slow in the TUI, especially in ASAN.
- -- this will be fixed later but for now we require a high timeout.
- screen.timeout = 60000
+ clear()
+ screen = thelpers.screen_setup(0, '["'..nvim_prog
+ ..'", "-u", "NONE", "-i", "NONE", "--cmd", "set noswapfile noshowcmd noruler undodir=. directory=. viewdir=. backupdir=."]')
screen:expect([[
{1: } |
- ~ |
- ~ |
- ~ |
- [No Name] |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {5:[No Name] }|
|
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
end)
@@ -30,144 +42,234 @@ describe('tui', function()
screen:detach()
end)
+ it('rapid resize #7572 #7628', function()
+ -- Need buffer rows to provoke the behavior.
+ feed_data(":edit test/functional/fixtures/bigfile.txt:")
+ command('call jobresize(b:terminal_job_id, 58, 9)')
+ command('call jobresize(b:terminal_job_id, 62, 13)')
+ command('call jobresize(b:terminal_job_id, 100, 42)')
+ command('call jobresize(b:terminal_job_id, 37, 1000)')
+ -- Resize to <5 columns.
+ screen:try_resize(4, 44)
+ command('call jobresize(b:terminal_job_id, 4, 1000)')
+ -- Resize to 1 row, then to 1 column, then increase rows to 4.
+ screen:try_resize(44, 1)
+ command('call jobresize(b:terminal_job_id, 44, 1)')
+ screen:try_resize(1, 1)
+ command('call jobresize(b:terminal_job_id, 1, 1)')
+ screen:try_resize(1, 4)
+ command('call jobresize(b:terminal_job_id, 1, 4)')
+ screen:try_resize(57, 17)
+ command('call jobresize(b:terminal_job_id, 57, 17)')
+ eq(2, eval("1+1")) -- Still alive?
+ end)
+
it('accepts basic utf-8 input', function()
- feed('iabc\ntest1\ntest2')
+ feed_data('iabc\ntest1\ntest2')
screen:expect([[
abc |
test1 |
test2{1: } |
- ~ |
- [No Name] [+] |
- -- INSERT -- |
- -- TERMINAL -- |
+ {4:~ }|
+ {5:[No Name] [+] }|
+ {3:-- INSERT --} |
+ {3:-- TERMINAL --} |
]])
- feed('\027')
+ feed_data('\027')
screen:expect([[
abc |
test1 |
test{1:2} |
- ~ |
- [No Name] [+] |
+ {4:~ }|
+ {5:[No Name] [+] }|
|
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
end)
it('interprets leading <Esc> byte as ALT modifier in normal-mode', function()
local keys = 'dfghjkl'
for c in keys:gmatch('.') do
- execute('nnoremap <a-'..c..'> ialt-'..c..'<cr><esc>')
- feed('\027'..c)
+ feed_command('nnoremap <a-'..c..'> ialt-'..c..'<cr><esc>')
+ feed_data('\027'..c)
end
screen:expect([[
alt-j |
alt-k |
alt-l |
{1: } |
- [No Name] [+] |
+ {5:[No Name] [+] }|
|
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
- feed('gg')
+ feed_data('gg')
screen:expect([[
{1:a}lt-d |
alt-f |
alt-g |
alt-h |
- [No Name] [+] |
+ {5:[No Name] [+] }|
|
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
end)
- it('does not mangle unmapped ALT-key chord', function()
- -- Vim represents ALT/META by setting the "high bit" of the modified key;
- -- we do _not_. #3982
- --
- -- Example: for input ALT+j:
- -- * Vim (Nvim prior to #3982) sets high-bit, inserts "รช".
- -- * Nvim (after #3982) inserts "j".
- feed('i\027j')
+ it('interprets ESC+key as ALT chord', function()
+ -- Vim represents ALT/META by setting the "high bit" of the modified key:
+ -- ALT+j inserts "รช". Nvim does not (#3982).
+ feed_data('i\022\027j')
screen:expect([[
- j{1: } |
- ~ |
- ~ |
- ~ |
- [No Name] [+] |
- -- INSERT -- |
- -- TERMINAL -- |
+ <M-j>{1: } |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {5:[No Name] [+] }|
+ {3:-- INSERT --} |
+ {3:-- TERMINAL --} |
]])
end)
it('accepts ascii control sequences', function()
- feed('i')
- feed('\022\007') -- ctrl+g
- feed('\022\022') -- ctrl+v
- feed('\022\013') -- ctrl+m
+ feed_data('i')
+ feed_data('\022\007') -- ctrl+g
+ feed_data('\022\022') -- ctrl+v
+ feed_data('\022\013') -- ctrl+m
+ local attrs = screen:get_default_attr_ids()
+ attrs[11] = {foreground = 81}
screen:expect([[
- {3:^G^V^M}{1: } |
- ~ |
- ~ |
- ~ |
- [No Name] [+] |
- -- INSERT -- |
- -- TERMINAL -- |
- ]], {[1] = {reverse = true}, [2] = {background = 11}, [3] = {foreground = 4}})
+ {11:^G^V^M}{1: } |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {5:[No Name] [+] }|
+ {3:-- INSERT --} |
+ {3:-- TERMINAL --} |
+ ]], attrs)
end)
it('automatically sends <Paste> for bracketed paste sequences', function()
- feed('i\027[200~')
+ -- Pasting can be really slow in the TUI, specially in ASAN.
+ -- This will be fixed later but for now we require a high timeout.
+ screen.timeout = 60000
+ feed_data('i\027[200~')
screen:expect([[
{1: } |
- ~ |
- ~ |
- ~ |
- [No Name] |
- -- INSERT (paste) -- |
- -- TERMINAL -- |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {5:[No Name] }|
+ {3:-- INSERT (paste) --} |
+ {3:-- TERMINAL --} |
]])
- feed('pasted from terminal')
+ feed_data('pasted from terminal')
screen:expect([[
pasted from terminal{1: } |
- ~ |
- ~ |
- ~ |
- [No Name] [+] |
- -- INSERT (paste) -- |
- -- TERMINAL -- |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {5:[No Name] [+] }|
+ {3:-- INSERT (paste) --} |
+ {3:-- TERMINAL --} |
]])
- feed('\027[201~')
+ feed_data('\027[201~')
screen:expect([[
pasted from terminal{1: } |
- ~ |
- ~ |
- ~ |
- [No Name] [+] |
- -- INSERT -- |
- -- TERMINAL -- |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {5:[No Name] [+] }|
+ {3:-- INSERT --} |
+ {3:-- TERMINAL --} |
]])
end)
it('can handle arbitrarily long bursts of input', function()
- execute('set ruler')
+ -- Need extra time for this test, specially in ASAN.
+ screen.timeout = 60000
+ feed_command('set ruler')
local t = {}
for i = 1, 3000 do
t[i] = 'item ' .. tostring(i)
end
- feed('i\027[200~'..table.concat(t, '\n')..'\027[201~')
+ feed_data('i\027[200~'..table.concat(t, '\n')..'\027[201~')
screen:expect([[
item 2997 |
item 2998 |
item 2999 |
item 3000{1: } |
- [No Name] [+] 3000,10 Bot|
- -- INSERT -- |
- -- TERMINAL -- |
+ {5:[No Name] [+] 3000,10 Bot}|
+ {3:-- INSERT --} |
+ {3:-- TERMINAL --} |
+ ]])
+ end)
+
+ it('allows termguicolors to be set at runtime', function()
+ screen:set_option('rgb', true)
+ screen:set_default_attr_ids({
+ [1] = {reverse = true},
+ [2] = {foreground = 13},
+ [3] = {bold = true, reverse = true},
+ [4] = {bold = true},
+ [5] = {reverse = true, foreground = 4},
+ [6] = {foreground = 4},
+ [7] = {reverse = true, foreground = Screen.colors.SeaGreen4},
+ [8] = {foreground = Screen.colors.SeaGreen4},
+ [9] = {bold = true, foreground = Screen.colors.Blue1},
+ })
+
+ feed_data(':hi SpecialKey ctermfg=3 guifg=SeaGreen\n')
+ feed_data('i')
+ feed_data('\022\007') -- ctrl+g
+ feed_data('\028\014') -- crtl+\ ctrl+N
+ feed_data(':set termguicolors?\n')
+ screen:expect([[
+ {5:^}{6:G} |
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ {3:[No Name] [+] }|
+ notermguicolors |
+ {4:-- TERMINAL --} |
+ ]])
+
+ feed_data(':set termguicolors\n')
+ screen:expect([[
+ {7:^}{8:G} |
+ {9:~ }|
+ {9:~ }|
+ {9:~ }|
+ {3:[No Name] [+] }|
+ :set termguicolors |
+ {4:-- TERMINAL --} |
+ ]])
+
+ feed_data(':set notermguicolors\n')
+ screen:expect([[
+ {5:^}{6:G} |
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ {3:[No Name] [+] }|
+ :set notermguicolors |
+ {4:-- TERMINAL --} |
]])
end)
+
+ it('shows up in nvim_list_uis', function()
+ feed_data(':echo map(nvim_list_uis(), {k,v -> sort(items(v))})\013')
+ screen:expect([=[
+ [[['ext_cmdline', v:false], ['ext_hlstate', v:fals|
+ e], ['ext_linegrid', v:true], ['ext_multigrid', v:|
+ false], ['ext_popupmenu', v:false], ['ext_tabline'|
+ , v:false], ['ext_wildmenu', v:false], ['height', |
+ 6], ['rgb', v:false], ['width', 50]]] |
+ {10:Press ENTER or type command to continue}{1: } |
+ {3:-- TERMINAL --} |
+ ]=])
+ end)
end)
-describe('tui with non-tty file descriptors', function()
+describe('TUI with non-tty file descriptors', function()
before_each(helpers.clear)
after_each(function()
@@ -175,182 +277,305 @@ describe('tui with non-tty file descriptors', function()
end)
it('can handle pipes as stdout and stderr', function()
- local screen = thelpers.screen_setup(0, '"'..helpers.nvim_prog..' -u NONE -i NONE --cmd \'set noswapfile\' --cmd \'normal iabc\' > /dev/null 2>&1 && cat testF && rm testF"')
- screen:set_default_attr_ids({})
- screen:set_default_attr_ignore(true)
- feed(':w testF\n:q\n')
+ local screen = thelpers.screen_setup(0, '"'..nvim_prog
+ ..' -u NONE -i NONE --cmd \'set noswapfile noshowcmd noruler\' --cmd \'normal iabc\' > /dev/null 2>&1 && cat testF && rm testF"')
+ feed_data(':w testF\n:q\n')
screen:expect([[
:w testF |
:q |
abc |
|
- [Process exited 0] |
+ [Process exited 0]{1: } |
|
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
end)
end)
-describe('tui focus event handling', function()
+describe('TUI FocusGained/FocusLost', function()
local screen
before_each(function()
helpers.clear()
- screen = thelpers.screen_setup(0, '["'..helpers.nvim_prog..'", "-u", "NONE", "-i", "NONE", "--cmd", "set noswapfile"]')
- execute('autocmd FocusGained * echo "gained"')
- execute('autocmd FocusLost * echo "lost"')
+ screen = thelpers.screen_setup(0, '["'..nvim_prog
+ ..'", "-u", "NONE", "-i", "NONE", "--cmd", "set noswapfile noshowcmd noruler"]')
+ feed_data(":autocmd FocusGained * echo 'gained'\n")
+ feed_data(":autocmd FocusLost * echo 'lost'\n")
+ feed_data("\034\016") -- CTRL-\ CTRL-N
end)
- it('can handle focus events in normal mode', function()
- feed('\027[I')
+ it('in normal-mode', function()
+ retry(2, 3 * screen.timeout, function()
+ feed_data('\027[I')
screen:expect([[
{1: } |
- ~ |
- ~ |
- ~ |
- [No Name] |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {5:[No Name] }|
gained |
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
- feed('\027[O')
+ feed_data('\027[O')
screen:expect([[
{1: } |
- ~ |
- ~ |
- ~ |
- [No Name] |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {5:[No Name] }|
lost |
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
+ end)
end)
- it('can handle focus events in insert mode', function()
- execute('set noshowmode')
- feed('i')
- feed('\027[I')
+ it('in insert-mode', function()
+ feed_command('set noshowmode')
+ feed_data('i')
+ retry(2, 3 * screen.timeout, function()
+ feed_data('\027[I')
screen:expect([[
{1: } |
- ~ |
- ~ |
- ~ |
- [No Name] |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {5:[No Name] }|
gained |
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
- feed('\027[O')
+ feed_data('\027[O')
screen:expect([[
{1: } |
- ~ |
- ~ |
- ~ |
- [No Name] |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {5:[No Name] }|
lost |
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
+ end)
end)
- it('can handle focus events in cmdline mode', function()
- feed(':')
- feed('\027[I')
+ -- During cmdline-mode we ignore :echo invoked by timers/events.
+ -- See commit: 5cc87d4dabd02167117be7a978b5c8faaa975419.
+ it('in cmdline-mode does NOT :echo', function()
+ feed_data(':')
+ feed_data('\027[I')
screen:expect([[
|
- ~ |
- ~ |
- ~ |
- [No Name] |
- g{1:a}ined |
- -- TERMINAL -- |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {5:[No Name] }|
+ :{1: } |
+ {3:-- TERMINAL --} |
]])
- feed('\027[O')
- screen:expect([[
+ feed_data('\027[O')
+ screen:expect{grid=[[
|
- ~ |
- ~ |
- ~ |
- [No Name] |
- l{1:o}st |
- -- TERMINAL -- |
- ]])
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {5:[No Name] }|
+ :{1: } |
+ {3:-- TERMINAL --} |
+ ]], unchanged=true}
end)
- it('can handle focus events in terminal mode', function()
- execute('set shell='..nvim_dir..'/shell-test')
- execute('set laststatus=0')
- execute('set noshowmode')
- execute('terminal')
- feed('\027[I')
- screen:expect([[
- ready $ |
- [Process exited 0]{1: } |
- |
- |
- |
- gained |
- -- TERMINAL -- |
- ]])
- feed('\027[O')
+ it('in cmdline-mode', function()
+ -- Set up autocmds that modify the buffer, instead of just calling :echo.
+ -- This is how we can test handling of focus gained/lost during cmdline-mode.
+ -- See commit: 5cc87d4dabd02167117be7a978b5c8faaa975419.
+ feed_data(":autocmd!\n")
+ feed_data(":autocmd FocusLost * call append(line('$'), 'lost')\n")
+ feed_data(":autocmd FocusGained * call append(line('$'), 'gained')\n")
+ retry(2, 3 * screen.timeout, function()
+ -- Enter cmdline-mode.
+ feed_data(':')
+ screen:sleep(1)
+ -- Send focus lost/gained termcodes.
+ feed_data('\027[O')
+ feed_data('\027[I')
+ screen:sleep(1)
+ -- Exit cmdline-mode. Redraws from timers/events are blocked during
+ -- cmdline-mode, so the buffer won't be updated until we exit cmdline-mode.
+ feed_data('\n')
+ screen:expect{any='lost'..(' '):rep(46)..'|\ngained'}
+ end)
+ end)
+
+ it('in terminal-mode', function()
+ feed_data(':set shell='..nvim_dir..'/shell-test\n')
+ feed_data(':set noshowmode laststatus=0\n')
+
+ retry(2, 3 * screen.timeout, function()
+ feed_data(':terminal\n')
+ screen:sleep(1)
+ feed_data('\027[I')
+ screen:expect([[
+ {1:r}eady $ |
+ [Process exited 0] |
+ |
+ |
+ |
+ gained |
+ {3:-- TERMINAL --} |
+ ]])
+ feed_data('\027[O')
+ screen:expect([[
+ {1:r}eady $ |
+ [Process exited 0] |
+ |
+ |
+ |
+ lost |
+ {3:-- TERMINAL --} |
+ ]])
+
+ -- If retry is needed...
+ feed_data("\034\016") -- CTRL-\ CTRL-N
+ feed_data(':bwipeout!\n')
+ end)
+ end)
+
+ it('in press-enter prompt', function()
+ feed_data(":echom 'msg1'|echom 'msg2'|echom 'msg3'|echom 'msg4'|echom 'msg5'\n")
+ -- Execute :messages to provoke the press-enter prompt.
+ feed_data(":messages\n")
+ feed_data('\027[I')
+ feed_data('\027[I')
screen:expect([[
- ready $ |
- [Process exited 0]{1: } |
- |
- |
- |
- lost |
- -- TERMINAL -- |
+ msg1 |
+ msg2 |
+ msg3 |
+ msg4 |
+ msg5 |
+ {10:Press ENTER or type command to continue}{1: } |
+ {3:-- TERMINAL --} |
]])
end)
end)
-- These tests require `thelpers` because --headless/--embed
-- does not initialize the TUI.
-describe("tui 't_Co' (terminal colors)", function()
+describe("TUI 't_Co' (terminal colors)", function()
local screen
- local is_linux = (helpers.eval("system('uname') =~? 'linux'") == 1)
+ local is_freebsd = (string.lower(uname()) == 'freebsd')
local function assert_term_colors(term, colorterm, maxcolors)
helpers.clear({env={TERM=term}, args={}})
-- This is ugly because :term/termopen() forces TERM=xterm-256color.
-- TODO: Revisit this after jobstart/termopen accept `env` dict.
screen = thelpers.screen_setup(0, string.format(
- [=[['sh', '-c', 'TERM=%s %s %s -u NONE -i NONE --cmd "silent set noswapfile"']]=],
- term,
+ [=[['sh', '-c', 'LANG=C TERM=%s %s %s -u NONE -i NONE --cmd "%s"']]=],
+ term or "",
(colorterm ~= nil and "COLORTERM="..colorterm or ""),
- helpers.nvim_prog))
+ nvim_prog,
+ nvim_set))
+
+ local tline
+ if maxcolors == 8 or maxcolors == 16 then
+ tline = "~ "
+ else
+ tline = "{4:~ }"
+ end
+
+ screen:expect(string.format([[
+ {1: } |
+ %s|
+ %s|
+ %s|
+ %s|
+ |
+ {3:-- TERMINAL --} |
+ ]], tline, tline, tline, tline))
- thelpers.feed_data(":echo &t_Co\n")
+ feed_data(":echo &t_Co\n")
screen:expect(string.format([[
{1: } |
- ~ |
- ~ |
- ~ |
- [No Name] |
+ %s|
+ %s|
+ %s|
+ %s|
%-3s |
- -- TERMINAL -- |
- ]], tostring(maxcolors and maxcolors or "")))
+ {3:-- TERMINAL --} |
+ ]], tline, tline, tline, tline, tostring(maxcolors and maxcolors or "")))
end
- it("unknown TERM sets empty 't_Co'", function()
- assert_term_colors("yet-another-term", nil, nil)
+ -- ansi and no terminal type at all:
+
+ it("no TERM uses 8 colors", function()
+ assert_term_colors(nil, nil, 8)
+ end)
+
+ it("TERM=ansi no COLORTERM uses 8 colors", function()
+ assert_term_colors("ansi", nil, 8)
+ end)
+
+ it("TERM=ansi with COLORTERM=anything-no-number uses 16 colors", function()
+ assert_term_colors("ansi", "yet-another-term", 16)
+ end)
+
+ it("unknown TERM COLORTERM with 256 in name uses 256 colors", function()
+ assert_term_colors("ansi", "yet-another-term-256color", 256)
+ end)
+
+ it("TERM=ansi-256color sets 256 colours", function()
+ assert_term_colors("ansi-256color", nil, 256)
+ end)
+
+ -- Unknown terminal types:
+
+ it("unknown TERM no COLORTERM sets 8 colours", function()
+ assert_term_colors("yet-another-term", nil, 8)
+ end)
+
+ it("unknown TERM with COLORTERM=anything-no-number uses 16 colors", function()
+ assert_term_colors("yet-another-term", "yet-another-term", 16)
+ end)
+
+ it("unknown TERM with 256 in name sets 256 colours", function()
+ assert_term_colors("yet-another-term-256color", nil, 256)
+ end)
+
+ it("unknown TERM COLORTERM with 256 in name uses 256 colors", function()
+ assert_term_colors("yet-another-term", "yet-another-term-256color", 256)
+ end)
+
+ -- Linux kernel terminal emulator:
+
+ it("TERM=linux uses 256 colors", function()
+ assert_term_colors("linux", nil, 256)
+ end)
+
+ it("TERM=linux-16color uses 256 colors", function()
+ assert_term_colors("linux-16color", nil, 256)
end)
- it("unknown TERM with COLORTERM=screen-256color uses 256 colors", function()
- assert_term_colors("yet-another-term", "screen-256color", 256)
+ it("TERM=linux-256color uses 256 colors", function()
+ assert_term_colors("linux-256color", nil, 256)
end)
- it("TERM=linux uses 8 colors", function()
- if is_linux then
- assert_term_colors("linux", nil, 8)
+ -- screen:
+ --
+ -- FreeBSD falls back to the built-in screen-256colour entry.
+ -- Linux and MacOS have a screen entry in external terminfo with 8 colours,
+ -- which is raised to 16 by COLORTERM.
+
+ it("TERM=screen no COLORTERM uses 8/256 colors", function()
+ if is_freebsd then
+ assert_term_colors("screen", nil, 256)
else
- pending()
+ assert_term_colors("screen", nil, 8)
end
end)
- it("TERM=screen uses 8 colors", function()
- if is_linux then
- assert_term_colors("screen", nil, 8)
+ it("TERM=screen COLORTERM=screen uses 16/256 colors", function()
+ if is_freebsd then
+ assert_term_colors("screen", "screen", 256)
else
- pending()
+ assert_term_colors("screen", "screen", 16)
end
end)
@@ -358,38 +583,270 @@ describe("tui 't_Co' (terminal colors)", function()
assert_term_colors("screen", "screen-256color", 256)
end)
- it("TERM=yet-another-term COLORTERM=screen-256color uses 256 colors", function()
- assert_term_colors("screen", "screen-256color", 256)
+ it("TERM=screen-256color no COLORTERM uses 256 colors", function()
+ assert_term_colors("screen-256color", nil, 256)
+ end)
+
+ -- tmux:
+ --
+ -- FreeBSD and MacOS fall back to the built-in tmux-256colour entry.
+ -- Linux has a tmux entry in external terminfo with 8 colours,
+ -- which is raised to 256.
+
+ it("TERM=tmux no COLORTERM uses 256 colors", function()
+ assert_term_colors("tmux", nil, 256)
+ end)
+
+ it("TERM=tmux COLORTERM=tmux uses 256 colors", function()
+ assert_term_colors("tmux", "tmux", 256)
+ end)
+
+ it("TERM=tmux COLORTERM=tmux-256color uses 256 colors", function()
+ assert_term_colors("tmux", "tmux-256color", 256)
end)
+ it("TERM=tmux-256color no COLORTERM uses 256 colors", function()
+ assert_term_colors("tmux-256color", nil, 256)
+ end)
+
+ -- xterm and imitators:
+
it("TERM=xterm uses 256 colors", function()
assert_term_colors("xterm", nil, 256)
end)
+ it("TERM=xterm COLORTERM=gnome-terminal uses 256 colors", function()
+ assert_term_colors("xterm", "gnome-terminal", 256)
+ end)
+
+ it("TERM=xterm COLORTERM=mate-terminal uses 256 colors", function()
+ assert_term_colors("xterm", "mate-terminal", 256)
+ end)
+
it("TERM=xterm-256color uses 256 colors", function()
assert_term_colors("xterm-256color", nil, 256)
end)
+
+ -- rxvt and stterm:
+ --
+ -- FreeBSD and MacOS fall back to the built-in rxvt-256color and
+ -- st-256colour entries.
+ -- Linux has an rxvt, an st, and an st-16color entry in external terminfo
+ -- with 8, 8, and 16 colours respectively, which are raised to 256.
+
+ it("TERM=rxvt no COLORTERM uses 256 colors", function()
+ assert_term_colors("rxvt", nil, 256)
+ end)
+
+ it("TERM=rxvt COLORTERM=rxvt uses 256 colors", function()
+ assert_term_colors("rxvt", "rxvt", 256)
+ end)
+
+ it("TERM=rxvt-256color uses 256 colors", function()
+ assert_term_colors("rxvt-256color", nil, 256)
+ end)
+
+ it("TERM=st no COLORTERM uses 256 colors", function()
+ assert_term_colors("st", nil, 256)
+ end)
+
+ it("TERM=st COLORTERM=st uses 256 colors", function()
+ assert_term_colors("st", "st", 256)
+ end)
+
+ it("TERM=st COLORTERM=st-256color uses 256 colors", function()
+ assert_term_colors("st", "st-256color", 256)
+ end)
+
+ it("TERM=st-16color no COLORTERM uses 8/256 colors", function()
+ assert_term_colors("st", nil, 256)
+ end)
+
+ it("TERM=st-16color COLORTERM=st uses 16/256 colors", function()
+ assert_term_colors("st", "st", 256)
+ end)
+
+ it("TERM=st-16color COLORTERM=st-256color uses 256 colors", function()
+ assert_term_colors("st", "st-256color", 256)
+ end)
+
+ it("TERM=st-256color uses 256 colors", function()
+ assert_term_colors("st-256color", nil, 256)
+ end)
+
+ -- gnome and vte:
+ --
+ -- FreeBSD and MacOS fall back to the built-in vte-256color entry.
+ -- Linux has a gnome, a vte, a gnome-256color, and a vte-256color entry in
+ -- external terminfo with 8, 8, 256, and 256 colours respectively, which are
+ -- raised to 256.
+
+ it("TERM=gnome no COLORTERM uses 256 colors", function()
+ assert_term_colors("gnome", nil, 256)
+ end)
+
+ it("TERM=gnome COLORTERM=gnome uses 256 colors", function()
+ assert_term_colors("gnome", "gnome", 256)
+ end)
+
+ it("TERM=gnome COLORTERM=gnome-256color uses 256 colors", function()
+ assert_term_colors("gnome", "gnome-256color", 256)
+ end)
+
+ it("TERM=gnome-256color uses 256 colors", function()
+ assert_term_colors("gnome-256color", nil, 256)
+ end)
+
+ it("TERM=vte no COLORTERM uses 256 colors", function()
+ assert_term_colors("vte", nil, 256)
+ end)
+
+ it("TERM=vte COLORTERM=vte uses 256 colors", function()
+ assert_term_colors("vte", "vte", 256)
+ end)
+
+ it("TERM=vte COLORTERM=vte-256color uses 256 colors", function()
+ assert_term_colors("vte", "vte-256color", 256)
+ end)
+
+ it("TERM=vte-256color uses 256 colors", function()
+ assert_term_colors("vte-256color", nil, 256)
+ end)
+
+ -- others:
+
+ it("TERM=interix uses 8 colors", function()
+ assert_term_colors("interix", nil, 8)
+ end)
+
+ it("TERM=iTerm.app uses 256 colors", function()
+ assert_term_colors("iTerm.app", nil, 256)
+ end)
+
+ it("TERM=iterm uses 256 colors", function()
+ assert_term_colors("iterm", nil, 256)
+ end)
+
end)
-describe('tui background handling', function()
+-- These tests require `thelpers` because --headless/--embed
+-- does not initialize the TUI.
+describe("TUI 'term' option", function()
+ local screen
+ local is_bsd = not not string.find(string.lower(uname()), 'bsd')
+ local is_macos = not not string.find(string.lower(uname()), 'darwin')
+
+ local function assert_term(term_envvar, term_expected)
+ clear()
+ -- This is ugly because :term/termopen() forces TERM=xterm-256color.
+ -- TODO: Revisit this after jobstart/termopen accept `env` dict.
+ local cmd = string.format(
+ [=[['sh', '-c', 'LANG=C TERM=%s %s -u NONE -i NONE --cmd "%s"']]=],
+ term_envvar or "",
+ nvim_prog,
+ nvim_set)
+ screen = thelpers.screen_setup(0, cmd)
+
+ local full_timeout = screen.timeout
+ screen.timeout = 250 -- We want screen:expect() to fail quickly.
+ retry(nil, 2 * full_timeout, function() -- Wait for TUI thread to set 'term'.
+ feed_data(":echo 'term='.(&term)\n")
+ screen:expect{any='term='..term_expected}
+ end)
+ end
+
+ it('gets builtin term if $TERM is invalid', function()
+ assert_term("foo", "builtin_ansi")
+ end)
+
+ it('gets system-provided term if $TERM is valid', function()
+ if is_bsd then -- BSD lacks terminfo, builtin is always used.
+ assert_term("xterm", "builtin_xterm")
+ elseif is_macos then
+ local status, _ = pcall(assert_term, "xterm", "xterm")
+ if not status then
+ pending("macOS: unibilium could not find terminfo", function() end)
+ end
+ else
+ assert_term("xterm", "xterm")
+ end
+ end)
+
+ it('builtin terms', function()
+ -- These non-standard terminfos are always builtin.
+ assert_term('win32con', 'builtin_win32con')
+ assert_term('conemu', 'builtin_conemu')
+ assert_term('vtpcon', 'builtin_vtpcon')
+ end)
+
+end)
+
+-- These tests require `thelpers` because --headless/--embed
+-- does not initialize the TUI.
+describe("TUI", function()
+ local screen
+ local logfile = 'Xtest_tui_verbose_log'
+ after_each(function()
+ os.remove(logfile)
+ end)
+
+ -- Runs (child) `nvim` in a TTY (:terminal), to start the builtin TUI.
+ local function nvim_tui(extra_args)
+ clear()
+ -- This is ugly because :term/termopen() forces TERM=xterm-256color.
+ -- TODO: Revisit this after jobstart/termopen accept `env` dict.
+ local cmd = string.format(
+ [=[['sh', '-c', 'LANG=C %s -u NONE -i NONE %s --cmd "%s"']]=],
+ nvim_prog,
+ extra_args or "",
+ nvim_set)
+ screen = thelpers.screen_setup(0, cmd)
+ end
+
+ it('-V3log logs terminfo values', function()
+ nvim_tui('-V3'..logfile)
+
+ -- Wait for TUI to start.
+ feed_data('Gitext')
+ screen:expect([[
+ text{1: } |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {3:-- INSERT --} |
+ {3:-- TERMINAL --} |
+ ]])
+
+ retry(nil, 3000, function() -- Wait for log file to be flushed.
+ local log = read_file('Xtest_tui_verbose_log') or ''
+ eq('--- Terminal info --- {{{\n', string.match(log, '--- Terminal.-\n'))
+ ok(#log > 50)
+ end)
+ end)
+
+end)
+
+describe('TUI background color', function()
local screen
before_each(function()
- helpers.clear()
- screen = thelpers.screen_setup(0, '["'..helpers.nvim_prog..'", "-u", "NONE", "-i", "NONE", "--cmd", "set noswapfile"]')
+ clear()
+ screen = thelpers.screen_setup(0, '["'..nvim_prog
+ ..'", "-u", "NONE", "-i", "NONE", "--cmd", "set noswapfile"]')
end)
local function assert_bg(color, bg)
it('handles '..color..' as '..bg, function()
- thelpers.feed_data('\027]11;rgb:'..color..'\007:echo &background\n')
+ feed_data('\027]11;rgb:'..color..'\007:echo &background\n')
screen:expect(string.format([[
{1: } |
- ~ |
- ~ |
- ~ |
- [No Name] |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {5:[No Name] 0,0-1 All}|
%-5s |
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]], bg))
end)
end
diff --git a/test/functional/terminal/window_spec.lua b/test/functional/terminal/window_spec.lua
index eec8b53f4d..842a81872e 100644
--- a/test/functional/terminal/window_spec.lua
+++ b/test/functional/terminal/window_spec.lua
@@ -2,7 +2,7 @@ local helpers = require('test.functional.helpers')(after_each)
local thelpers = require('test.functional.terminal.helpers')
local feed, clear = helpers.feed, helpers.clear
local wait = helpers.wait
-local execute = helpers.execute
+local iswin = helpers.iswin
describe('terminal window', function()
local screen
@@ -12,36 +12,72 @@ describe('terminal window', function()
screen = thelpers.screen_setup()
end)
- it('resets its size when entering terminal buffer', function()
- feed('<c-\\><c-n>')
- execute('set hidden')
- execute('edit foo')
- execute('doautoall SessionLoadPost')
- execute('silent bnext')
- screen:expect([[
- tty ready |
- {2: } |
- |
- |
- |
- ^ |
- :silent bnext |
- ]])
+ describe("with 'number'", function()
+ it('wraps text', function()
+ feed([[<C-\><C-N>]])
+ feed([[:set numberwidth=1 number<CR>i]])
+ screen:expect([[
+ {7:1 }tty ready |
+ {7:2 }rows: 6, cols: 48 |
+ {7:3 }{1: } |
+ {7:4 } |
+ {7:5 } |
+ {7:6 } |
+ {3:-- TERMINAL --} |
+ ]])
+ thelpers.feed_data({'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'})
+ screen:expect([[
+ {7:1 }tty ready |
+ {7:2 }rows: 6, cols: 48 |
+ {7:3 }abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV|
+ {7:4 }WXYZ{1: } |
+ {7:5 } |
+ {7:6 } |
+ {3:-- TERMINAL --} |
+ ]])
+
+ if iswin() then
+ return -- win: :terminal resize is unreliable #7007
+ end
+
+ -- numberwidth=9
+ feed([[<C-\><C-N>]])
+ feed([[:set numberwidth=9 number<CR>i]])
+ screen:expect([[
+ {7: 1 }tty ready |
+ {7: 2 }rows: 6, cols: 48 |
+ {7: 3 }abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO|
+ {7: 4 }WXYZrows: 6, cols: 41 |
+ {7: 5 }{1: } |
+ {7: 6 } |
+ {3:-- TERMINAL --} |
+ ]])
+ thelpers.feed_data({' abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'})
+ screen:expect([[
+ {7: 1 }tty ready |
+ {7: 2 }rows: 6, cols: 48 |
+ {7: 3 }abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO|
+ {7: 4 }WXYZrows: 6, cols: 41 |
+ {7: 5 } abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN|
+ {7: 6 }OPQRSTUVWXYZ{1: } |
+ {3:-- TERMINAL --} |
+ ]])
+ end)
end)
- describe('with colorcolumn set', function()
+ describe("with 'colorcolumn'", function()
before_each(function()
- feed('<c-\\><c-n>')
+ feed([[<C-\><C-N>]])
screen:expect([[
tty ready |
- {2: } |
+ {2:^ } |
+ |
|
|
|
- ^ |
|
]])
- feed(':set colorcolumn=20<cr>i')
+ feed(':set colorcolumn=20<CR>i')
end)
it('wont show the color column', function()
@@ -52,14 +88,14 @@ describe('terminal window', function()
|
|
|
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
end)
end)
describe('with fold set', function()
before_each(function()
- feed('<c-\\><c-n>:set foldenable foldmethod=manual<cr>i')
+ feed([[<C-\><C-N>:set foldenable foldmethod=manual<CR>i]])
thelpers.feed_data({'line1', 'line2', 'line3', 'line4', ''})
screen:expect([[
tty ready |
@@ -68,12 +104,12 @@ describe('terminal window', function()
line3 |
line4 |
{1: } |
- -- TERMINAL -- |
+ {3:-- TERMINAL --} |
]])
end)
it('wont show any folds', function()
- feed('<c-\\><c-n>ggvGzf')
+ feed([[<C-\><C-N>ggvGzf]])
wait()
screen:expect([[
^tty ready |
diff --git a/test/functional/terminal/window_split_tab_spec.lua b/test/functional/terminal/window_split_tab_spec.lua
index 644060103a..fecffe3295 100644
--- a/test/functional/terminal/window_split_tab_spec.lua
+++ b/test/functional/terminal/window_split_tab_spec.lua
@@ -2,7 +2,12 @@ local helpers = require('test.functional.helpers')(after_each)
local thelpers = require('test.functional.terminal.helpers')
local clear = helpers.clear
local feed, nvim = helpers.feed, helpers.nvim
-local execute = helpers.execute
+local feed_command = helpers.feed_command
+local command = helpers.command
+local eq = helpers.eq
+local eval = helpers.eval
+local iswin = helpers.iswin
+local retry = helpers.retry
describe('terminal', function()
local screen
@@ -22,77 +27,80 @@ describe('terminal', function()
screen:detach()
end)
- it('resets its size when entering terminal window', function()
+ it('next to a closing window', function()
+ command('split')
+ command('terminal')
+ command('vsplit foo')
+ eq(3, eval("winnr('$')"))
+ feed('ZQ') -- Close split, should not crash. #7538
+ eq(2, eval("1+1")) -- Still alive?
+ end)
+
+ it('does not change size on WinEnter', function()
+ if helpers.pending_win32(pending) then return end
feed('<c-\\><c-n>')
- execute('2split')
- screen:expect([[
- tty ready |
- ^rows: 2, cols: 50 |
- ========== |
- tty ready |
- rows: 2, cols: 50 |
- {2: } |
- ~ |
- ~ |
- ========== |
- |
- ]])
- execute('wincmd p')
+ feed_command('2split')
screen:expect([[
tty ready |
- rows: 2, cols: 50 |
+ ^rows: 5, cols: 50 |
========== |
tty ready |
- rows: 2, cols: 50 |
rows: 5, cols: 50 |
{2: } |
- ^ |
+ |
+ |
========== |
- :wincmd p |
+ :2split |
]])
- execute('wincmd p')
+ feed_command('wincmd p')
screen:expect([[
+ tty ready |
rows: 5, cols: 50 |
- ^rows: 2, cols: 50 |
========== |
- rows: 5, cols: 50 |
- rows: 2, cols: 50 |
+ tty ready |
+ ^rows: 5, cols: 50 |
{2: } |
- ~ |
- ~ |
+ |
+ |
========== |
:wincmd p |
]])
end)
- describe('when the screen is resized', function()
- it('will forward a resize request to the program', function()
- screen:try_resize(screen._width + 3, screen._height + 5)
- screen:expect([[
- tty ready |
- rows: 14, cols: 53 |
- {1: } |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- -- TERMINAL -- |
- ]])
- screen:try_resize(screen._width - 6, screen._height - 10)
- screen:expect([[
- tty ready |
- rows: 14, cols: 53 |
- rows: 4, cols: 47 |
- {1: } |
- -- TERMINAL -- |
- ]])
- end)
+ it('forwards resize request to the program', function()
+ feed([[<C-\><C-N>G:]]) -- Go to cmdline-mode, so cursor is at bottom.
+ local w1, h1 = screen._width - 3, screen._height - 2
+ local w2, h2 = w1 - 6, h1 - 3
+
+ if iswin() then
+ -- win: SIGWINCH is unreliable, use a weaker test. #7506
+ retry(3, 30000, function()
+ screen:try_resize(w1, h1)
+ screen:expect{any='rows: 7, cols: 47'}
+ screen:try_resize(w2, h2)
+ screen:expect{any='rows: 4, cols: 41'}
+ end)
+ return
+ end
+
+ screen:try_resize(w1, h1)
+ screen:expect([[
+ tty ready |
+ rows: 7, cols: 47 |
+ {2: } |
+ |
+ |
+ |
+ |
+ :^ |
+ ]])
+ screen:try_resize(w2, h2)
+ screen:expect([[
+ tty ready |
+ rows: 7, cols: 47 |
+ rows: 4, cols: 41 |
+ {2: } |
+ :^ |
+ ]])
end)
end)
diff --git a/test/functional/ui/bufhl_spec.lua b/test/functional/ui/bufhl_spec.lua
index f91aa8d402..bcccef84b6 100644
--- a/test/functional/ui/bufhl_spec.lua
+++ b/test/functional/ui/bufhl_spec.lua
@@ -1,53 +1,45 @@
local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
-local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, request, neq = helpers.execute, helpers.request, helpers.neq
+local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
+local command, neq = helpers.command, helpers.neq
+local meths = helpers.meths
+local curbufmeths, eq = helpers.curbufmeths, helpers.eq
describe('Buffer highlighting', function()
local screen
- local curbuf
-
- local hl_colors = {
- NonText = Screen.colors.Blue,
- Question = Screen.colors.SeaGreen,
- String = Screen.colors.Fuchsia,
- Statement = Screen.colors.Brown,
- Special = Screen.colors.SlateBlue,
- Identifier = Screen.colors.DarkCyan
- }
before_each(function()
clear()
- execute("syntax on")
+ command('syntax on')
screen = Screen.new(40, 8)
screen:attach()
- screen:set_default_attr_ignore( {{bold=true, foreground=hl_colors.NonText}} )
screen:set_default_attr_ids({
- [1] = {foreground = hl_colors.String},
- [2] = {foreground = hl_colors.Statement, bold = true},
- [3] = {foreground = hl_colors.Special},
- [4] = {bold = true, foreground = hl_colors.Special},
- [5] = {foreground = hl_colors.Identifier},
- [6] = {bold = true},
- [7] = {underline = true, bold = true, foreground = hl_colors.Special},
- [8] = {foreground = hl_colors.Special, underline = true}
+ [1] = {bold=true, foreground=Screen.colors.Blue},
+ [2] = {foreground = Screen.colors.Fuchsia}, -- String
+ [3] = {foreground = Screen.colors.Brown, bold = true}, -- Statement
+ [4] = {foreground = Screen.colors.SlateBlue}, -- Special
+ [5] = {bold = true, foreground = Screen.colors.SlateBlue},
+ [6] = {foreground = Screen.colors.DarkCyan}, -- Identifier
+ [7] = {bold = true},
+ [8] = {underline = true, bold = true, foreground = Screen.colors.SlateBlue},
+ [9] = {foreground = Screen.colors.SlateBlue, underline = true},
+ [10] = {foreground = Screen.colors.Red},
+ [11] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
+ [12] = {foreground = Screen.colors.Blue1},
+ [13] = {background = Screen.colors.LightGrey},
+ [14] = {background = Screen.colors.Gray90},
+ [15] = {background = Screen.colors.Gray90, bold = true, foreground = Screen.colors.Brown},
+ [16] = {foreground = Screen.colors.Magenta, background = Screen.colors.Gray90},
})
- curbuf = request('vim_get_current_buffer')
end)
after_each(function()
screen:detach()
end)
- local function add_hl(...)
- return request('buffer_add_highlight', curbuf, ...)
- end
-
- local function clear_hl(...)
- return request('buffer_clear_highlight', curbuf, ...)
- end
-
+ local add_highlight = curbufmeths.add_highlight
+ local clear_namespace = curbufmeths.clear_namespace
it('works', function()
insert([[
@@ -58,54 +50,54 @@ describe('Buffer highlighting', function()
screen:expect([[
these are some lines |
with colorful tex^t |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
|
]])
- add_hl(-1, "String", 0 , 10, 14)
- add_hl(-1, "Statement", 1 , 5, -1)
+ add_highlight(-1, "String", 0 , 10, 14)
+ add_highlight(-1, "Statement", 1 , 5, -1)
screen:expect([[
- these are {1:some} lines |
- with {2:colorful tex^t} |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ these are {2:some} lines |
+ with {3:colorful tex^t} |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
|
]])
feed("ggo<esc>")
screen:expect([[
- these are {1:some} lines |
+ these are {2:some} lines |
^ |
- with {2:colorful text} |
- ~ |
- ~ |
- ~ |
- ~ |
+ with {3:colorful text} |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
|
]])
- clear_hl(-1, 0 , -1)
+ clear_namespace(-1, 0, -1)
screen:expect([[
these are some lines |
^ |
with colorful text |
- ~ |
- ~ |
- ~ |
- ~ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
|
]])
end)
- describe('support adding multiple sources', function()
+ describe('support using multiple namespaces', function()
local id1, id2
before_each(function()
insert([[
@@ -114,98 +106,116 @@ describe('Buffer highlighting', function()
combining highlights
from different sources]])
- execute("hi ImportantWord gui=bold cterm=bold")
- id1 = add_hl(0, "ImportantWord", 0, 2, 8)
- add_hl(id1, "ImportantWord", 1, 12, -1)
- add_hl(id1, "ImportantWord", 2, 0, 9)
- add_hl(id1, "ImportantWord", 3, 5, 14)
-
- id2 = add_hl(0, "Special", 0, 2, 8)
- add_hl(id2, "Identifier", 1, 3, 8)
- add_hl(id2, "Special", 1, 14, 20)
- add_hl(id2, "Underlined", 2, 6, 12)
- add_hl(id2, "Underlined", 3, 0, 9)
+ command("hi ImportantWord gui=bold cterm=bold")
+ id1 = add_highlight(0, "ImportantWord", 0, 2, 8)
+ add_highlight(id1, "ImportantWord", 1, 12, -1)
+ add_highlight(id1, "ImportantWord", 2, 0, 9)
+ add_highlight(id1, "ImportantWord", 3, 5, 14)
+
+ -- add_highlight can be called like this to get a new source
+ -- without adding any highlight
+ id2 = add_highlight(0, "", 0, 0, 0)
neq(id1, id2)
+ add_highlight(id2, "Special", 0, 2, 8)
+ add_highlight(id2, "Identifier", 1, 3, 8)
+ add_highlight(id2, "Special", 1, 14, 20)
+ add_highlight(id2, "Underlined", 2, 6, 12)
+ add_highlight(id2, "Underlined", 3, 0, 9)
+
screen:expect([[
- a {4:longer} example |
- in {5:order} to {6:de}{4:monstr}{6:ate} |
- {6:combin}{7:ing}{8: hi}ghlights |
- {8:from }{7:diff}{6:erent} source^s |
- ~ |
- ~ |
- ~ |
- :hi ImportantWord gui=bold cterm=bold |
+ a {5:longer} example |
+ in {6:order} to {7:de}{5:monstr}{7:ate} |
+ {7:combin}{8:ing}{9: hi}ghlights |
+ {9:from }{8:diff}{7:erent} source^s |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
]])
end)
it('and clearing the first added', function()
- clear_hl(id1, 0, -1)
+ clear_namespace(id1, 0, -1)
+ screen:expect([[
+ a {4:longer} example |
+ in {6:order} to de{4:monstr}ate |
+ combin{9:ing hi}ghlights |
+ {9:from diff}erent source^s |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+ end)
+
+ it('and clearing using deprecated name', function()
+ curbufmeths.clear_highlight(id1, 0, -1)
screen:expect([[
- a {3:longer} example |
- in {5:order} to de{3:monstr}ate |
- combin{8:ing hi}ghlights |
- {8:from diff}erent source^s |
- ~ |
- ~ |
- ~ |
- :hi ImportantWord gui=bold cterm=bold |
+ a {4:longer} example |
+ in {6:order} to de{4:monstr}ate |
+ combin{9:ing hi}ghlights |
+ {9:from diff}erent source^s |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
]])
end)
it('and clearing the second added', function()
- clear_hl(id2, 0, -1)
+ clear_namespace(id2, 0, -1)
screen:expect([[
- a {6:longer} example |
- in order to {6:demonstrate} |
- {6:combining} highlights |
- from {6:different} source^s |
- ~ |
- ~ |
- ~ |
- :hi ImportantWord gui=bold cterm=bold |
+ a {7:longer} example |
+ in order to {7:demonstrate} |
+ {7:combining} highlights |
+ from {7:different} source^s |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
]])
end)
it('and clearing line ranges', function()
- clear_hl(-1, 0, 1)
- clear_hl(id1, 1, 2)
- clear_hl(id2, 2, -1)
+ clear_namespace(-1, 0, 1)
+ clear_namespace(id1, 1, 2)
+ clear_namespace(id2, 2, -1)
screen:expect([[
a longer example |
- in {5:order} to de{3:monstr}ate |
- {6:combining} highlights |
- from {6:different} source^s |
- ~ |
- ~ |
- ~ |
- :hi ImportantWord gui=bold cterm=bold |
+ in {6:order} to de{4:monstr}ate |
+ {7:combining} highlights |
+ from {7:different} source^s |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
]])
end)
it('and renumbering lines', function()
feed('3Gddggo<esc>')
screen:expect([[
- a {4:longer} example |
+ a {5:longer} example |
^ |
- in {5:order} to {6:de}{4:monstr}{6:ate} |
- {8:from }{7:diff}{6:erent} sources |
- ~ |
- ~ |
- ~ |
+ in {6:order} to {7:de}{5:monstr}{7:ate} |
+ {9:from }{8:diff}{7:erent} sources |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
|
]])
- execute(':3move 4')
+ command(':3move 4')
screen:expect([[
- a {4:longer} example |
+ a {5:longer} example |
+ |
+ {9:from }{8:diff}{7:erent} sources |
+ ^in {6:order} to {7:de}{5:monstr}{7:ate} |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
|
- {8:from }{7:diff}{6:erent} sources |
- ^in {5:order} to {6:de}{4:monstr}{6:ate} |
- ~ |
- ~ |
- ~ |
- ::3move 4 |
]])
end)
end)
@@ -213,30 +223,30 @@ describe('Buffer highlighting', function()
it('prioritizes latest added highlight', function()
insert([[
three overlapping colors]])
- add_hl(0, "Identifier", 0, 6, 17)
- add_hl(0, "String", 0, 14, 23)
- local id = add_hl(0, "Special", 0, 0, 9)
+ add_highlight(0, "Identifier", 0, 6, 17)
+ add_highlight(0, "String", 0, 14, 23)
+ local id = add_highlight(0, "Special", 0, 0, 9)
screen:expect([[
- {3:three ove}{5:rlapp}{1:ing color}^s |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {4:three ove}{6:rlapp}{2:ing color}^s |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
|
]])
- clear_hl(id, 0, 1)
+ clear_namespace(id, 0, 1)
screen:expect([[
- three {5:overlapp}{1:ing color}^s |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ three {6:overlapp}{2:ing color}^s |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
|
]])
end)
@@ -244,18 +254,277 @@ describe('Buffer highlighting', function()
it('works with multibyte text', function()
insert([[
Ta bรฅten รถver sjรถn!]])
- add_hl(-1, "Identifier", 0, 3, 9)
- add_hl(-1, "String", 0, 16, 21)
+ add_highlight(-1, "Identifier", 0, 3, 9)
+ add_highlight(-1, "String", 0, 16, 21)
screen:expect([[
- Ta {5:bรฅten} รถver {1:sjรถn}^! |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ Ta {6:bรฅten} รถver {2:sjรถn}^! |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+ end)
+
+ it('works with new syntax groups', function()
+ insert([[
+ fancy code in a new fancy language]])
+ add_highlight(-1, "FancyLangItem", 0, 0, 5)
+ screen:expect([[
+ fancy code in a new fancy languag^e |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
|
]])
+
+ command('hi FancyLangItem guifg=red')
+ screen:expect([[
+ {10:fancy} code in a new fancy languag^e |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+ end)
+
+ describe('virtual text annotations', function()
+ local set_virtual_text = curbufmeths.set_virtual_text
+ local id1, id2
+ before_each(function()
+ insert([[
+ 1 + 2
+ 3 +
+ x = 4]])
+ feed('O<esc>20A5, <esc>gg')
+ screen:expect([[
+ ^1 + 2 |
+ 3 + |
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5|
+ , 5, 5, 5, 5, 5, 5, |
+ x = 4 |
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+
+ id1 = set_virtual_text(0, 0, {{"=", "Statement"}, {" 3", "Number"}}, {})
+ set_virtual_text(id1, 1, {{"ERROR:", "ErrorMsg"}, {" invalid syntax"}}, {})
+ id2 = set_virtual_text(0, 2, {{"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."}}, {})
+ neq(id2, id1)
+
+ end)
+
+ it('works', function()
+ screen:expect([[
+ ^1 + 2 {3:=}{2: 3} |
+ 3 + {11:ERROR:} invalid syntax |
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5|
+ , 5, 5, 5, 5, 5, 5, Lorem ipsum dolor s|
+ x = 4 |
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+
+ clear_namespace(id1, 0, -1)
+ screen:expect([[
+ ^1 + 2 |
+ 3 + |
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5|
+ , 5, 5, 5, 5, 5, 5, Lorem ipsum dolor s|
+ x = 4 |
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+
+ -- Handles doublewidth chars, leaving a space if truncating
+ -- in the middle of a char
+ eq(-1, set_virtual_text(-1, 1, {{"ๆš—xไบ‹zz้€Ÿ้‡Ž่ฐท่ณช็ต่‚ฒๅ‰ฏไฝๆ–ฐ่ฆšไธธๆดป่งฃ็ต‚ไบ‹", "Comment"}}, {}))
+ screen:expect([[
+ ^1 + 2 |
+ 3 + {12:ๆš—xไบ‹zz้€Ÿ้‡Ž่ฐท่ณช็ต่‚ฒๅ‰ฏไฝๆ–ฐ่ฆšไธธๆดป่งฃ็ต‚ }|
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5|
+ , 5, 5, 5, 5, 5, 5, Lorem ipsum dolor s|
+ x = 4 |
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+
+ feed("2Gx")
+ screen:expect([[
+ 1 + 2 |
+ ^ + {12:ๆš—xไบ‹zz้€Ÿ้‡Ž่ฐท่ณช็ต่‚ฒๅ‰ฏไฝๆ–ฐ่ฆšไธธๆดป่งฃ็ต‚ไบ‹}|
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5|
+ , 5, 5, 5, 5, 5, 5, Lorem ipsum dolor s|
+ x = 4 |
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+
+ feed("2Gdd")
+ screen:expect([[
+ 1 + 2 |
+ ^5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5|
+ , 5, 5, 5, 5, 5, 5, Lorem ipsum dolor s|
+ x = 4 |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+ end)
+
+ it('is not highlighted by visual selection', function()
+ feed("ggVG")
+ screen:expect([[
+ {13:1 + 2} {3:=}{2: 3} |
+ {13:3 +} {11:ERROR:} invalid syntax |
+ {13:5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}|
+ {13:, 5, 5, 5, 5, 5, 5, } Lorem ipsum dolor s|
+ ^x{13: = 4} |
+ {1:~ }|
+ {1:~ }|
+ {7:-- VISUAL LINE --} |
+ ]])
+
+ feed("<esc>")
+ screen:expect([[
+ 1 + 2 {3:=}{2: 3} |
+ 3 + {11:ERROR:} invalid syntax |
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5|
+ , 5, 5, 5, 5, 5, 5, Lorem ipsum dolor s|
+ ^x = 4 |
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+
+ -- special case: empty line has extra eol highlight
+ feed("ggd$")
+ screen:expect([[
+ ^ {3:=}{2: 3} |
+ 3 + {11:ERROR:} invalid syntax |
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5|
+ , 5, 5, 5, 5, 5, 5, Lorem ipsum dolor s|
+ x = 4 |
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+
+ feed("jvk")
+ screen:expect([[
+ ^ {3:=}{2: 3} |
+ {13:3} + {11:ERROR:} invalid syntax |
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5|
+ , 5, 5, 5, 5, 5, 5, Lorem ipsum dolor s|
+ x = 4 |
+ {1:~ }|
+ {1:~ }|
+ {7:-- VISUAL --} |
+ ]])
+
+ feed("o")
+ screen:expect([[
+ {13: }{3:=}{2: 3} |
+ ^3 + {11:ERROR:} invalid syntax |
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5|
+ , 5, 5, 5, 5, 5, 5, Lorem ipsum dolor s|
+ x = 4 |
+ {1:~ }|
+ {1:~ }|
+ {7:-- VISUAL --} |
+ ]])
+ end)
+
+
+ it('works with listchars', function()
+ command("set list listchars+=eol:$")
+ screen:expect([[
+ ^1 + 2{1:$}{3:=}{2: 3} |
+ 3 +{1:$}{11:ERROR:} invalid syntax |
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5|
+ , 5, 5, 5, 5, 5, 5,{1:-$}Lorem ipsum dolor s|
+ x = 4{1:$} |
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+
+ clear_namespace(-1, 0, -1)
+ screen:expect([[
+ ^1 + 2{1:$} |
+ 3 +{1:$} |
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5|
+ , 5, 5, 5, 5, 5, 5,{1:-$} |
+ x = 4{1:$} |
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+ end)
+
+ it('works with cursorline', function()
+ command("set cursorline")
+
+ screen:expect([[
+ {14:^1 + 2 }{15:=}{16: 3}{14: }|
+ 3 + {11:ERROR:} invalid syntax |
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5|
+ , 5, 5, 5, 5, 5, 5, Lorem ipsum dolor s|
+ x = 4 |
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+
+ feed('j')
+ screen:expect([[
+ 1 + 2 {3:=}{2: 3} |
+ {14:^3 + }{11:ERROR:}{14: invalid syntax }|
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5|
+ , 5, 5, 5, 5, 5, 5, Lorem ipsum dolor s|
+ x = 4 |
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+
+
+ feed('j')
+ screen:expect([[
+ 1 + 2 {3:=}{2: 3} |
+ 3 + {11:ERROR:} invalid syntax |
+ {14:^5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}|
+ {14:, 5, 5, 5, 5, 5, 5, Lorem ipsum dolor s}|
+ x = 4 |
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+ end)
+ end)
+
+ it('and virtual text use the same namespace counter', function()
+ local set_virtual_text = curbufmeths.set_virtual_text
+ eq(1, add_highlight(0, "String", 0 , 0, -1))
+ eq(2, set_virtual_text(0, 0, {{"= text", "Comment"}}, {}))
+ eq(3, meths.create_namespace("my-ns"))
+ eq(4, add_highlight(0, "String", 0 , 0, -1))
+ eq(5, set_virtual_text(0, 0, {{"= text", "Comment"}}, {}))
+ eq(6, meths.create_namespace("other-ns"))
end)
end)
diff --git a/test/functional/ui/cmdline_highlight_spec.lua b/test/functional/ui/cmdline_highlight_spec.lua
new file mode 100644
index 0000000000..1568b7816e
--- /dev/null
+++ b/test/functional/ui/cmdline_highlight_spec.lua
@@ -0,0 +1,991 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+
+local eq = helpers.eq
+local feed = helpers.feed
+local clear = helpers.clear
+local meths = helpers.meths
+local funcs = helpers.funcs
+local source = helpers.source
+local dedent = helpers.dedent
+local command = helpers.command
+local curbufmeths = helpers.curbufmeths
+
+local screen
+
+-- Bug in input() handling: :redraw! will erase the whole prompt up until
+-- user types something. It exists in Vim as well, so using `h<BS>` as
+-- a workaround.
+local function redraw_input()
+ feed('{REDRAW}h<BS>')
+end
+
+before_each(function()
+ clear()
+ screen = Screen.new(40, 8)
+ screen:attach()
+ command("set display-=msgsep")
+ source([[
+ highlight RBP1 guibg=Red
+ highlight RBP2 guibg=Yellow
+ highlight RBP3 guibg=Green
+ highlight RBP4 guibg=Blue
+ let g:NUM_LVLS = 4
+ function Redraw()
+ mode
+ return ''
+ endfunction
+ let g:id = ''
+ cnoremap <expr> {REDRAW} Redraw()
+ function DoPrompt(do_return) abort
+ let id = g:id
+ let Cb = g:Nvim_color_input{g:id}
+ let out = input({'prompt': ':', 'highlight': Cb})
+ let g:out{id} = out
+ return (a:do_return ? out : '')
+ endfunction
+ nnoremap <expr> {PROMPT} DoPrompt(0)
+ cnoremap <expr> {PROMPT} DoPrompt(1)
+ function RainBowParens(cmdline)
+ let ret = []
+ let i = 0
+ let lvl = 0
+ while i < len(a:cmdline)
+ if a:cmdline[i] is# '('
+ call add(ret, [i, i + 1, 'RBP' . ((lvl % g:NUM_LVLS) + 1)])
+ let lvl += 1
+ elseif a:cmdline[i] is# ')'
+ let lvl -= 1
+ call add(ret, [i, i + 1, 'RBP' . ((lvl % g:NUM_LVLS) + 1)])
+ endif
+ let i += 1
+ endwhile
+ return ret
+ endfunction
+ function SplittedMultibyteStart(cmdline)
+ let ret = []
+ let i = 0
+ while i < len(a:cmdline)
+ let char = nr2char(char2nr(a:cmdline[i:]))
+ if a:cmdline[i:i + len(char) - 1] is# char
+ if len(char) > 1
+ call add(ret, [i + 1, i + len(char), 'RBP2'])
+ endif
+ let i += len(char)
+ else
+ let i += 1
+ endif
+ endwhile
+ return ret
+ endfunction
+ function SplittedMultibyteEnd(cmdline)
+ let ret = []
+ let i = 0
+ while i < len(a:cmdline)
+ let char = nr2char(char2nr(a:cmdline[i:]))
+ if a:cmdline[i:i + len(char) - 1] is# char
+ if len(char) > 1
+ call add(ret, [i, i + 1, 'RBP1'])
+ endif
+ let i += len(char)
+ else
+ let i += 1
+ endif
+ endwhile
+ return ret
+ endfunction
+ function Echoing(cmdline)
+ echo 'HERE'
+ return v:_null_list
+ endfunction
+ function Echoning(cmdline)
+ echon 'HERE'
+ return v:_null_list
+ endfunction
+ function Echomsging(cmdline)
+ echomsg 'HERE'
+ return v:_null_list
+ endfunction
+ function Echoerring(cmdline)
+ echoerr 'HERE'
+ return v:_null_list
+ endfunction
+ function Redrawing(cmdline)
+ redraw!
+ return v:_null_list
+ endfunction
+ function Throwing(cmdline)
+ throw "ABC"
+ return v:_null_list
+ endfunction
+ function Halting(cmdline)
+ while 1
+ endwhile
+ endfunction
+ function ReturningGlobal(cmdline)
+ return g:callback_return
+ endfunction
+ function ReturningGlobal2(cmdline)
+ return g:callback_return[:len(a:cmdline)-1]
+ endfunction
+ function ReturningGlobalN(n, cmdline)
+ return g:callback_return{a:n}
+ endfunction
+ let g:recording_calls = []
+ function Recording(cmdline)
+ call add(g:recording_calls, a:cmdline)
+ return []
+ endfunction
+ ]])
+ screen:set_default_attr_ids({
+ RBP1={background = Screen.colors.Red},
+ RBP2={background = Screen.colors.Yellow},
+ RBP3={background = Screen.colors.Green},
+ RBP4={background = Screen.colors.Blue},
+ EOB={bold = true, foreground = Screen.colors.Blue1},
+ ERR={foreground = Screen.colors.Grey100, background = Screen.colors.Red},
+ SK={foreground = Screen.colors.Blue},
+ PE={bold = true, foreground = Screen.colors.SeaGreen4},
+ NUM={foreground = Screen.colors.Blue2},
+ NPAR={foreground = Screen.colors.Yellow},
+ SQ={foreground = Screen.colors.Blue3},
+ SB={foreground = Screen.colors.Blue4},
+ E={foreground = Screen.colors.Red, background = Screen.colors.Blue},
+ M={bold = true},
+ })
+end)
+
+local function set_color_cb(funcname, callback_return, id)
+ meths.set_var('id', id or '')
+ if id and id ~= '' and funcs.exists('*' .. funcname .. 'N') then
+ command(('let g:Nvim_color_input%s = {cmdline -> %sN(%s, cmdline)}'):format(
+ id, funcname, id))
+ if callback_return then
+ meths.set_var('callback_return' .. id, callback_return)
+ end
+ else
+ meths.set_var('Nvim_color_input', funcname)
+ if callback_return then
+ meths.set_var('callback_return', callback_return)
+ end
+ end
+end
+local function start_prompt(text)
+ feed('{PROMPT}' .. (text or ''))
+end
+
+describe('Command-line coloring', function()
+ it('works', function()
+ set_color_cb('RainBowParens')
+ meths.set_option('more', false)
+ start_prompt()
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :^ |
+ ]])
+ feed('e')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :e^ |
+ ]])
+ feed('cho ')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :echo ^ |
+ ]])
+ feed('(')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :echo {RBP1:(}^ |
+ ]])
+ feed('(')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :echo {RBP1:(}{RBP2:(}^ |
+ ]])
+ feed('42')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :echo {RBP1:(}{RBP2:(}42^ |
+ ]])
+ feed('))')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :echo {RBP1:(}{RBP2:(}42{RBP2:)}{RBP1:)}^ |
+ ]])
+ feed('<BS>')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :echo {RBP1:(}{RBP2:(}42{RBP2:)}^ |
+ ]])
+ redraw_input()
+ screen:expect{grid=[[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :echo {RBP1:(}{RBP2:(}42{RBP2:)}^ |
+ ]], reset=true}
+ end)
+ for _, func_part in ipairs({'', 'n', 'msg'}) do
+ it('disables :echo' .. func_part .. ' messages', function()
+ set_color_cb('Echo' .. func_part .. 'ing')
+ start_prompt('echo')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :echo^ |
+ ]])
+ end)
+ end
+ it('does the right thing when hl start appears to split multibyte char',
+ function()
+ set_color_cb('SplittedMultibyteStart')
+ start_prompt('echo "ยซ')
+ screen:expect([[
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :echo " |
+ {ERR:E5405: Chunk 0 start 7 splits multibyte }|
+ {ERR:character} |
+ :echo "ยซ^ |
+ ]])
+ feed('ยป')
+ screen:expect([[
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :echo " |
+ {ERR:E5405: Chunk 0 start 7 splits multibyte }|
+ {ERR:character} |
+ :echo "ยซยป^ |
+ ]])
+ end)
+ it('does the right thing when hl end appears to split multibyte char',
+ function()
+ set_color_cb('SplittedMultibyteEnd')
+ start_prompt('echo "ยซ')
+ screen:expect([[
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :echo " |
+ {ERR:E5406: Chunk 0 end 7 splits multibyte ch}|
+ {ERR:aracter} |
+ :echo "ยซ^ |
+ ]])
+ end)
+ it('does the right thing when errorring', function()
+ set_color_cb('Echoerring')
+ start_prompt('e')
+ screen:expect([[
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ : |
+ {ERR:E5407: Callback has thrown an exception:}|
+ {ERR: Vim(echoerr):HERE} |
+ :e^ |
+ ]])
+ end)
+ it('silences :echo', function()
+ set_color_cb('Echoing')
+ start_prompt('e')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :e^ |
+ ]])
+ eq('', meths.command_output('messages'))
+ end)
+ it('silences :echon', function()
+ set_color_cb('Echoning')
+ start_prompt('e')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :e^ |
+ ]])
+ eq('', meths.command_output('messages'))
+ end)
+ it('silences :echomsg', function()
+ set_color_cb('Echomsging')
+ start_prompt('e')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :e^ |
+ ]])
+ eq('', meths.command_output('messages'))
+ end)
+ it('does the right thing when throwing', function()
+ set_color_cb('Throwing')
+ start_prompt('e')
+ screen:expect([[
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ : |
+ {ERR:E5407: Callback has thrown an exception:}|
+ {ERR: ABC} |
+ :e^ |
+ ]])
+ end)
+ it('stops executing callback after a number of errors', function()
+ set_color_cb('SplittedMultibyteStart')
+ start_prompt('let x = "ยซยปยซยปยซยปยซยปยซยป"\n')
+ screen:expect([[
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :let x = " |
+ {ERR:E5405: Chunk 0 start 10 splits multibyte}|
+ {ERR: character} |
+ ^:let x = "ยซยปยซยปยซยปยซยปยซยป" |
+ ]])
+ feed('\n')
+ screen:expect([[
+ ^ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ |
+ ]])
+ eq('let x = "ยซยปยซยปยซยปยซยปยซยป"', meths.get_var('out'))
+ local msg = '\nE5405: Chunk 0 start 10 splits multibyte character'
+ eq(msg:rep(1), funcs.execute('messages'))
+ end)
+ it('allows interrupting callback with <C-c>', function()
+ set_color_cb('Halting')
+ start_prompt('echo 42')
+ screen:expect([[
+ ^ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ |
+ ]])
+ screen:sleep(500)
+ feed('<C-c>')
+ screen:expect([[
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ : |
+ {ERR:E5407: Callback has thrown an exception:}|
+ {ERR: Keyboard interrupt} |
+ :echo 42^ |
+ ]])
+ redraw_input()
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :echo 42^ |
+ ]])
+ feed('\n')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ ^:echo 42 |
+ ]])
+ feed('\n')
+ eq('echo 42', meths.get_var('out'))
+ feed('<C-c>')
+ screen:expect([[
+ ^ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ Type :qa! and pr...nges and exit Nvim |
+ ]])
+ end)
+ it('works fine with NUL, NL, CR', function()
+ set_color_cb('RainBowParens')
+ start_prompt('echo ("<C-v><CR><C-v><Nul><C-v><NL>")')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :echo {RBP1:(}"{SK:^M^@^@}"{RBP1:)}^ |
+ ]])
+ end)
+ it('errors out when callback returns something wrong', function()
+ command('cnoremap + ++')
+ set_color_cb('ReturningGlobal', '')
+ start_prompt('#')
+ screen:expect([[
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ : |
+ {ERR:E5400: Callback should return list} |
+ :#^ |
+ ]])
+
+ feed('<CR><CR><CR>')
+ set_color_cb('ReturningGlobal', {{0, 1, 'Normal'}, 42})
+ start_prompt('#')
+ screen:expect([[
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ : |
+ {ERR:E5401: List item 1 is not a List} |
+ :#^ |
+ ]])
+
+ feed('<CR><CR><CR>')
+ set_color_cb('ReturningGlobal2', {{0, 1, 'Normal'}, {1}})
+ start_prompt('+')
+ screen:expect([[
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :+ |
+ {ERR:E5402: List item 1 has incorrect length:}|
+ {ERR: 1 /= 3} |
+ :++^ |
+ ]])
+
+ feed('<CR><CR><CR>')
+ set_color_cb('ReturningGlobal2', {{0, 1, 'Normal'}, {2, 3, 'Normal'}})
+ start_prompt('+')
+ screen:expect([[
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :+ |
+ {ERR:E5403: Chunk 1 start 2 not in range [1, }|
+ {ERR:2)} |
+ :++^ |
+ ]])
+
+ feed('<CR><CR><CR>')
+ set_color_cb('ReturningGlobal2', {{0, 1, 'Normal'}, {1, 3, 'Normal'}})
+ start_prompt('+')
+ screen:expect([[
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :+ |
+ {ERR:E5404: Chunk 1 end 3 not in range (1, 2]}|
+ |
+ :++^ |
+ ]])
+ end)
+ it('does not error out when called from a errorred out cycle', function()
+ set_color_cb('ReturningGlobal', {{0, 1, 'Normal'}})
+ feed(dedent([[
+ :set regexpengine=2
+ :for pat in [' \ze*', ' \zs*']
+ : try
+ : let l = matchlist('x x', pat)
+ : $put =input({'prompt':'>','highlight':'ReturningGlobal'})
+ :
+ : $put ='E888 NOT detected for ' . pat
+ : catch
+ : $put =input({'prompt':'>','highlight':'ReturningGlobal'})
+ :
+ : $put ='E888 detected for ' . pat
+ : endtry
+ :endfor
+ :
+ :
+ :
+ :
+ :
+ :
+ ]]))
+ eq({'', ':', 'E888 detected for \\ze*', ':', 'E888 detected for \\zs*'},
+ curbufmeths.get_lines(0, -1, false))
+ eq('', funcs.execute('messages'))
+ end)
+ it('allows nesting input()s', function()
+ set_color_cb('ReturningGlobal', {{0, 1, 'RBP1'}}, '')
+ start_prompt('1')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :{RBP1:1}^ |
+ ]])
+
+ set_color_cb('ReturningGlobal', {{0, 1, 'RBP2'}}, '1')
+ start_prompt('2')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :{RBP2:2}^ |
+ ]])
+
+ set_color_cb('ReturningGlobal', {{0, 1, 'RBP3'}}, '2')
+ start_prompt('3')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :{RBP3:3}^ |
+ ]])
+
+ set_color_cb('ReturningGlobal', {{0, 1, 'RBP4'}}, '3')
+ start_prompt('4')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :{RBP4:4}^ |
+ ]])
+
+ feed('<CR>')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :{RBP3:3}4^ |
+ ]])
+ feed('<CR>')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :{RBP2:2}34^ |
+ ]])
+ feed('<CR>')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :{RBP1:1}234^ |
+ ]])
+ feed('<CR><CR><C-l>')
+ screen:expect([[
+ ^ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ |
+ ]])
+ eq('1234', meths.get_var('out'))
+ eq('234', meths.get_var('out1'))
+ eq('34', meths.get_var('out2'))
+ eq('4', meths.get_var('out3'))
+ eq(0, funcs.exists('g:out4'))
+ end)
+ it('runs callback with the same data only once', function()
+ local function new_recording_calls(...)
+ eq({...}, meths.get_var('recording_calls'))
+ meths.set_var('recording_calls', {})
+ end
+ set_color_cb('Recording')
+ start_prompt('')
+ -- Regression test. Disambiguation:
+ --
+ -- new_recording_calls(expected_result) -- (actual_before_fix)
+ --
+ feed('a')
+ new_recording_calls('a') -- ('a', 'a')
+ feed('b')
+ new_recording_calls('ab') -- ('a', 'ab', 'ab')
+ feed('c')
+ new_recording_calls('abc') -- ('ab', 'abc', 'abc')
+ feed('<BS>')
+ new_recording_calls('ab') -- ('abc', 'ab', 'ab')
+ feed('<BS>')
+ new_recording_calls('a') -- ('ab', 'a', 'a')
+ feed('<BS>')
+ new_recording_calls() -- ('a')
+ feed('<CR><CR>')
+ eq('', meths.get_var('out'))
+ end)
+ it('does not crash when callback has caught not-a-editor-command exception',
+ function()
+ source([[
+ function CaughtExc(cmdline) abort
+ try
+ gibberish
+ catch
+ " Do nothing
+ endtry
+ return []
+ endfunction
+ ]])
+ set_color_cb('CaughtExc')
+ start_prompt('1')
+ eq(1, meths.eval('1'))
+ end)
+end)
+describe('Ex commands coloring', function()
+ it('works', function()
+ meths.set_var('Nvim_color_cmdline', 'RainBowParens')
+ feed(':echo (((1)))')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :echo {RBP1:(}{RBP2:(}{RBP3:(}1{RBP3:)}{RBP2:)}{RBP1:)}^ |
+ ]])
+ end)
+ it('still executes command-line even if errored out', function()
+ meths.set_var('Nvim_color_cmdline', 'SplittedMultibyteStart')
+ feed(':let x = "ยซ"\n')
+ eq('ยซ', meths.get_var('x'))
+ local msg = 'E5405: Chunk 0 start 10 splits multibyte character'
+ eq('\n'..msg, funcs.execute('messages'))
+ end)
+ it('does not error out when called from a errorred out cycle', function()
+ -- Apparently when there is a cycle in which one of the commands errors out
+ -- this error may be caught by color_cmdline before it is presented to the
+ -- user.
+ feed(dedent([[
+ :set regexpengine=2
+ :for pat in [' \ze*', ' \zs*']
+ : try
+ : let l = matchlist('x x', pat)
+ : $put ='E888 NOT detected for ' . pat
+ : catch
+ : $put ='E888 detected for ' . pat
+ : endtry
+ :endfor
+ ]]))
+ eq({'', 'E888 detected for \\ze*', 'E888 detected for \\zs*'},
+ curbufmeths.get_lines(0, -1, false))
+ eq('', funcs.execute('messages'))
+ end)
+ it('does not crash when using `n` in debug mode', function()
+ feed(':debug execute "echo 1"\n')
+ screen:expect([[
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ Entering Debug mode. Type "cont" to con|
+ tinue. |
+ cmd: execute "echo 1" |
+ >^ |
+ ]])
+ feed('n\n')
+ screen:expect([[
+ {EOB:~ }|
+ {EOB:~ }|
+ Entering Debug mode. Type "cont" to con|
+ tinue. |
+ cmd: execute "echo 1" |
+ >n |
+ 1 |
+ {PE:Press ENTER or type command to continue}^ |
+ ]])
+ feed('\n')
+ screen:expect([[
+ ^ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ |
+ ]])
+ end)
+ it('mapping error does not cancel prompt', function()
+ command("cnoremap <expr> x execute('throw 42')[-1]")
+ feed(':#x')
+ screen:expect([[
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :# |
+ {ERR:Error detected while processing :} |
+ {ERR:E605: Exception not caught: 42} |
+ :#^ |
+ ]])
+ feed('<CR>')
+ screen:expect([[
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :# |
+ {ERR:Error detected while processing :} |
+ {ERR:E605: Exception not caught: 42} |
+ {ERR:E749: empty buffer} |
+ {PE:Press ENTER or type command to continue}^ |
+ ]])
+ feed('<CR>')
+ eq('Error detected while processing :\nE605: Exception not caught: 42\nE749: empty buffer',
+ meths.command_output('messages'))
+ end)
+ it('errors out when failing to get callback', function()
+ meths.set_var('Nvim_color_cmdline', 42)
+ feed(':#')
+ screen:expect([[
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ : |
+ {ERR:E5408: Unable to get g:Nvim_color_cmdlin}|
+ {ERR:e callback: Vim:E6000: Argument is not a}|
+ {ERR: function or function name} |
+ :#^ |
+ ]])
+ end)
+end)
+describe('Expressions coloring support', function()
+ it('works', function()
+ meths.command('hi clear NvimNumber')
+ meths.command('hi clear NvimNestingParenthesis')
+ meths.command('hi NvimNumber guifg=Blue2')
+ meths.command('hi NvimNestingParenthesis guifg=Yellow')
+ feed(':echo <C-r>=(((1)))')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ ={NPAR:(((}{NUM:1}{NPAR:)))}^ |
+ ]])
+ end)
+ it('does not use Nvim_color_expr', function()
+ meths.set_var('Nvim_color_expr', 42)
+ -- Used to error out due to failing to get callback.
+ meths.command('hi clear NvimNumber')
+ meths.command('hi NvimNumber guifg=Blue2')
+ feed(':<C-r>=1')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ ={NUM:1}^ |
+ ]])
+ end)
+ it('works correctly with non-ASCII and control characters', function()
+ meths.command('hi clear NvimStringBody')
+ meths.command('hi clear NvimStringQuote')
+ meths.command('hi clear NvimInvalid')
+ meths.command('hi NvimStringQuote guifg=Blue3')
+ meths.command('hi NvimStringBody guifg=Blue4')
+ meths.command('hi NvimInvalid guifg=Red guibg=Blue')
+ feed('i<C-r>="ยซยป"ยซยป')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ ={SQ:"}{SB:ยซยป}{SQ:"}{E:ยซยป}^ |
+ ]])
+ feed('<C-c>')
+ screen:expect([[
+ ^ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {M:-- INSERT --} |
+ ]])
+ feed('<Esc>')
+ screen:expect([[
+ ^ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ |
+ ]])
+ feed(':<C-\\>e"<C-v><C-x>"<C-v><C-x>')
+ -- TODO(ZyX-I): Parser highlighting should not override special character
+ -- highlighting.
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ ={SQ:"}{SB:^X}{SQ:"}{ERR:^X}^ |
+ ]])
+ feed('<C-c>')
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ :^ |
+ ]])
+ funcs.setreg('a', {'\192'})
+ feed('<C-r>="<C-r><C-r>a"<C-r><C-r>a"foo"')
+ -- TODO(ZyX-I): Parser highlighting should not override special character
+ -- highlighting.
+ screen:expect([[
+ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ ={SQ:"}{SB:<c0>}{SQ:"}{E:<c0>"}{SB:foo}{E:"}^ |
+ ]])
+ end)
+end)
diff --git a/test/functional/ui/cmdline_spec.lua b/test/functional/ui/cmdline_spec.lua
new file mode 100644
index 0000000000..5d112d7f35
--- /dev/null
+++ b/test/functional/ui/cmdline_spec.lua
@@ -0,0 +1,608 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+local clear, feed = helpers.clear, helpers.feed
+local source = helpers.source
+local command = helpers.command
+
+local function test_cmdline(linegrid)
+ local screen
+
+ before_each(function()
+ clear()
+ screen = Screen.new(25, 5)
+ screen:attach({rgb=true, ext_cmdline=true, ext_linegrid=linegrid})
+ screen:set_default_attr_ids({
+ [1] = {bold = true, foreground = Screen.colors.Blue1},
+ [2] = {reverse = true},
+ [3] = {bold = true, reverse = true},
+ [4] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
+ [5] = {bold = true, foreground = Screen.colors.SeaGreen4},
+ })
+ end)
+
+ after_each(function()
+ screen:detach()
+ end)
+
+ it('works', function()
+ feed(':')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]], cmdline={{
+ firstc = ":",
+ content = {{""}},
+ pos = 0,
+ }}}
+
+ feed('sign')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]], cmdline={{
+ firstc = ":",
+ content = {{"sign"}},
+ pos = 4,
+ }}}
+
+ feed('<Left>')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]], cmdline={{
+ firstc = ":",
+ content = {{"sign"}},
+ pos = 3,
+ }}}
+
+ feed('<bs>')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]], cmdline={{
+ firstc = ":",
+ content = {{"sin"}},
+ pos = 2,
+ }}}
+
+ feed('<Esc>')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]]}
+ end)
+
+ describe("redraws statusline on entering", function()
+ before_each(function()
+ command('set laststatus=2')
+ command('set statusline=%{mode()}')
+ end)
+
+ it('from normal mode', function()
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {3:n }|
+ |
+ ]]}
+
+ feed(':')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {3:c }|
+ |
+ ]], cmdline={{
+ firstc = ":",
+ content = {{""}},
+ pos = 0,
+ }}}
+ end)
+
+ it('but not with scrolled messages', function()
+ screen:try_resize(35,10)
+ feed(':echoerr doesnotexist<cr>')
+ screen:expect{grid=[[
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {3: }|
+ {4:E121: Undefined variable: doesnotex}|
+ {4:ist} |
+ {5:Press ENTER or type command to cont}|
+ {5:inue}^ |
+ ]]}
+ feed(':echoerr doesnotexist<cr>')
+ screen:expect{grid=[[
+ |
+ {1:~ }|
+ {3: }|
+ {4:E121: Undefined variable: doesnotex}|
+ {4:ist} |
+ {5:Press ENTER or type command to cont}|
+ {4:E121: Undefined variable: doesnotex}|
+ {4:ist} |
+ {5:Press ENTER or type command to cont}|
+ {5:inue}^ |
+ ]]}
+
+ feed(':echoerr doesnotexist<cr>')
+ screen:expect{grid=[[
+ {4:E121: Undefined variable: doesnotex}|
+ {4:ist} |
+ {5:Press ENTER or type command to cont}|
+ {4:E121: Undefined variable: doesnotex}|
+ {4:ist} |
+ {5:Press ENTER or type command to cont}|
+ {4:E121: Undefined variable: doesnotex}|
+ {4:ist} |
+ {5:Press ENTER or type command to cont}|
+ {5:inue}^ |
+ ]]}
+
+ feed('<cr>')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {3:n }|
+ |
+ ]]}
+ end)
+ end)
+
+ it("works with input()", function()
+ feed(':call input("input", "default")<cr>')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]], cmdline={{
+ prompt = "input",
+ content = {{"default"}},
+ pos = 7,
+ }}}
+
+ feed('<cr>')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]]}
+ end)
+
+ it("works with special chars and nested cmdline", function()
+ feed(':xx<c-r>')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]], cmdline={{
+ firstc = ":",
+ content = {{"xx"}},
+ pos = 2,
+ special = {'"', true},
+ }}}
+
+ feed('=')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]], cmdline={{
+ firstc = ":",
+ content = {{"xx"}},
+ pos = 2,
+ special = {'"', true},
+ }, {
+ firstc = "=",
+ content = {{""}},
+ pos = 0,
+ }}}
+
+ feed('1+2')
+ local expectation = {{
+ firstc = ":",
+ content = {{"xx"}},
+ pos = 2,
+ special = {'"', true},
+ }, {
+ firstc = "=",
+ content = {{"1"}, {"+"}, {"2"}},
+ pos = 3,
+ }}
+
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]], cmdline=expectation}
+
+ -- erase information, so we check if it is retransmitted
+ command("mode")
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]], cmdline=expectation, reset=true}
+
+
+ feed('<cr>')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]], cmdline={{
+ firstc = ":",
+ content = {{"xx3"}},
+ pos = 3,
+ }}}
+
+ feed('<esc>')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]]}
+ end)
+
+ it("works with function definitions", function()
+ feed(':function Foo()<cr>')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]], cmdline={{
+ indent = 2,
+ firstc = ":",
+ content = {{""}},
+ pos = 0,
+ }}, cmdline_block = {
+ {{'function Foo()'}},
+ }}
+
+ feed('line1<cr>')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]], cmdline={{
+ indent = 2,
+ firstc = ":",
+ content = {{""}},
+ pos = 0,
+ }}, cmdline_block = {
+ {{'function Foo()'}},
+ {{' line1'}},
+ }}
+
+ command("mode")
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]], cmdline={{
+ indent = 2,
+ firstc = ":",
+ content = {{""}},
+ pos = 0,
+ }}, cmdline_block = {
+ {{'function Foo()'}},
+ {{' line1'}},
+ }, reset=true}
+
+ feed('endfunction<cr>')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]]}
+
+ -- Try once more, to check buffer is reinitialized. #8007
+ feed(':function Bar()<cr>')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]], cmdline={{
+ indent = 2,
+ firstc = ":",
+ content = {{""}},
+ pos = 0,
+ }}, cmdline_block = {
+ {{'function Bar()'}},
+ }}
+
+ feed('endfunction<cr>')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]]}
+
+ end)
+
+ it("works with cmdline window", function()
+ feed(':make')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]], cmdline={{
+ firstc = ":",
+ content = {{"make"}},
+ pos = 4,
+ }}}
+
+ feed('<c-f>')
+ screen:expect{grid=[[
+ |
+ {2:[No Name] }|
+ {1::}make^ |
+ {3:[Command Line] }|
+ |
+ ]]}
+
+ -- nested cmdline
+ feed(':yank')
+ screen:expect{grid=[[
+ |
+ {2:[No Name] }|
+ {1::}make^ |
+ {3:[Command Line] }|
+ |
+ ]], cmdline={nil, {
+ firstc = ":",
+ content = {{"yank"}},
+ pos = 4,
+ }}}
+
+ command("mode")
+ screen:expect{grid=[[
+ |
+ {2:[No Name] }|
+ {1::}make^ |
+ {3:[Command Line] }|
+ |
+ ]], cmdline={nil, {
+ firstc = ":",
+ content = {{"yank"}},
+ pos = 4,
+ }}, reset=true}
+
+ feed("<c-c>")
+ screen:expect{grid=[[
+ |
+ {2:[No Name] }|
+ {1::}make^ |
+ {3:[Command Line] }|
+ |
+ ]]}
+
+ feed("<c-c>")
+ screen:expect{grid=[[
+ ^ |
+ {2:[No Name] }|
+ {1::}make |
+ {3:[Command Line] }|
+ |
+ ]], cmdline={{
+ firstc = ":",
+ content = {{"make"}},
+ pos = 4,
+ }}}
+
+ command("redraw!")
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]], cmdline={{
+ firstc = ":",
+ content = {{"make"}},
+ pos = 4,
+ }}}
+ end)
+
+ it('works with inputsecret()', function()
+ feed(":call inputsecret('secret:')<cr>abc123")
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]], cmdline={{
+ prompt = "secret:",
+ content = {{"******"}},
+ pos = 6,
+ }}}
+ end)
+
+ it('works with highlighted cmdline', function()
+ source([[
+ highlight RBP1 guibg=Red
+ highlight RBP2 guibg=Yellow
+ highlight RBP3 guibg=Green
+ highlight RBP4 guibg=Blue
+ let g:NUM_LVLS = 4
+ function RainBowParens(cmdline)
+ let ret = []
+ let i = 0
+ let lvl = 0
+ while i < len(a:cmdline)
+ if a:cmdline[i] is# '('
+ call add(ret, [i, i + 1, 'RBP' . ((lvl % g:NUM_LVLS) + 1)])
+ let lvl += 1
+ elseif a:cmdline[i] is# ')'
+ let lvl -= 1
+ call add(ret, [i, i + 1, 'RBP' . ((lvl % g:NUM_LVLS) + 1)])
+ endif
+ let i += 1
+ endwhile
+ return ret
+ endfunction
+ map <f5> :let x = input({'prompt':'>','highlight':'RainBowParens'})<cr>
+ "map <f5> :let x = input({'prompt':'>'})<cr>
+ ]])
+ screen:set_default_attr_ids({
+ RBP1={background = Screen.colors.Red},
+ RBP2={background = Screen.colors.Yellow},
+ EOB={bold = true, foreground = Screen.colors.Blue1},
+ })
+ feed('<f5>(a(b)a)')
+ screen:expect{grid=[[
+ ^ |
+ {EOB:~ }|
+ {EOB:~ }|
+ {EOB:~ }|
+ |
+ ]], cmdline={{
+ prompt = '>',
+ content = {{'(', 'RBP1'}, {'a'}, {'(', 'RBP2'}, {'b'},
+ { ')', 'RBP2'}, {'a'}, {')', 'RBP1'}},
+ pos = 7,
+ }}}
+ end)
+
+ it('works together with ext_wildmenu', function()
+ local expected = {
+ 'define',
+ 'jump',
+ 'list',
+ 'place',
+ 'undefine',
+ 'unplace',
+ }
+
+ command('set wildmode=full')
+ command('set wildmenu')
+ screen:set_option('ext_wildmenu', true)
+ feed(':sign <tab>')
+
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]], cmdline={{
+ firstc = ":",
+ content = {{"sign define"}},
+ pos = 11,
+ }}, wildmenu_items=expected, wildmenu_pos=0}
+
+ feed('<tab>')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]], cmdline={{
+ firstc = ":",
+ content = {{"sign jump"}},
+ pos = 9,
+ }}, wildmenu_items=expected, wildmenu_pos=1}
+
+ feed('<left><left>')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]], cmdline={{
+ firstc = ":",
+ content = {{"sign "}},
+ pos = 5,
+ }}, wildmenu_items=expected, wildmenu_pos=-1}
+
+ feed('<right>')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]], cmdline={{
+ firstc = ":",
+ content = {{"sign define"}},
+ pos = 11,
+ }}, wildmenu_items=expected, wildmenu_pos=0}
+
+ feed('a')
+ screen:expect{grid=[[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]], cmdline={{
+ firstc = ":",
+ content = {{"sign definea"}},
+ pos = 12,
+ }}}
+ end)
+end
+
+-- the representation of cmdline and cmdline_block contents changed with ext_linegrid
+-- (which uses indexed highlights) so make sure to test both
+describe('ui/ext_cmdline', function() test_cmdline(true) end)
+describe('ui/ext_cmdline (legacy highlights)', function() test_cmdline(false) end)
diff --git a/test/functional/ui/cursor_spec.lua b/test/functional/ui/cursor_spec.lua
new file mode 100644
index 0000000000..3e0370db14
--- /dev/null
+++ b/test/functional/ui/cursor_spec.lua
@@ -0,0 +1,290 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+local clear, meths = helpers.clear, helpers.meths
+local eq = helpers.eq
+local command = helpers.command
+
+describe('ui/cursor', function()
+ local screen
+
+ before_each(function()
+ clear()
+ screen = Screen.new(25, 5)
+ screen:attach()
+ end)
+
+ after_each(function()
+ screen:detach()
+ end)
+
+ it("'guicursor' is published as a UI event", function()
+ local expected_mode_info = {
+ [1] = {
+ blinkoff = 0,
+ blinkon = 0,
+ blinkwait = 0,
+ cell_percentage = 0,
+ cursor_shape = 'block',
+ name = 'normal',
+ hl_id = 0,
+ id_lm = 0,
+ attr = {},
+ attr_lm = {},
+ mouse_shape = 0,
+ short_name = 'n' },
+ [2] = {
+ blinkoff = 0,
+ blinkon = 0,
+ blinkwait = 0,
+ cell_percentage = 0,
+ cursor_shape = 'block',
+ name = 'visual',
+ hl_id = 0,
+ id_lm = 0,
+ attr = {},
+ attr_lm = {},
+ mouse_shape = 0,
+ short_name = 'v' },
+ [3] = {
+ blinkoff = 0,
+ blinkon = 0,
+ blinkwait = 0,
+ cell_percentage = 25,
+ cursor_shape = 'vertical',
+ name = 'insert',
+ hl_id = 0,
+ id_lm = 0,
+ attr = {},
+ attr_lm = {},
+ mouse_shape = 0,
+ short_name = 'i' },
+ [4] = {
+ blinkoff = 0,
+ blinkon = 0,
+ blinkwait = 0,
+ cell_percentage = 20,
+ cursor_shape = 'horizontal',
+ name = 'replace',
+ hl_id = 0,
+ id_lm = 0,
+ attr = {},
+ attr_lm = {},
+ mouse_shape = 0,
+ short_name = 'r' },
+ [5] = {
+ blinkoff = 0,
+ blinkon = 0,
+ blinkwait = 0,
+ cell_percentage = 0,
+ cursor_shape = 'block',
+ name = 'cmdline_normal',
+ hl_id = 0,
+ id_lm = 0,
+ attr = {},
+ attr_lm = {},
+ mouse_shape = 0,
+ short_name = 'c' },
+ [6] = {
+ blinkoff = 0,
+ blinkon = 0,
+ blinkwait = 0,
+ cell_percentage = 25,
+ cursor_shape = 'vertical',
+ name = 'cmdline_insert',
+ hl_id = 0,
+ id_lm = 0,
+ attr = {},
+ attr_lm = {},
+ mouse_shape = 0,
+ short_name = 'ci' },
+ [7] = {
+ blinkoff = 0,
+ blinkon = 0,
+ blinkwait = 0,
+ cell_percentage = 20,
+ cursor_shape = 'horizontal',
+ name = 'cmdline_replace',
+ hl_id = 0,
+ id_lm = 0,
+ attr = {},
+ attr_lm = {},
+ mouse_shape = 0,
+ short_name = 'cr' },
+ [8] = {
+ blinkoff = 0,
+ blinkon = 0,
+ blinkwait = 0,
+ cell_percentage = 20,
+ cursor_shape = 'horizontal',
+ name = 'operator',
+ hl_id = 0,
+ id_lm = 0,
+ attr = {},
+ attr_lm = {},
+ mouse_shape = 0,
+ short_name = 'o' },
+ [9] = {
+ blinkoff = 0,
+ blinkon = 0,
+ blinkwait = 0,
+ cell_percentage = 25,
+ cursor_shape = 'vertical',
+ name = 'visual_select',
+ hl_id = 0,
+ id_lm = 0,
+ attr = {},
+ attr_lm = {},
+ mouse_shape = 0,
+ short_name = 've' },
+ [10] = {
+ name = 'cmdline_hover',
+ mouse_shape = 0,
+ short_name = 'e' },
+ [11] = {
+ name = 'statusline_hover',
+ mouse_shape = 0,
+ short_name = 's' },
+ [12] = {
+ name = 'statusline_drag',
+ mouse_shape = 0,
+ short_name = 'sd' },
+ [13] = {
+ name = 'vsep_hover',
+ mouse_shape = 0,
+ short_name = 'vs' },
+ [14] = {
+ name = 'vsep_drag',
+ mouse_shape = 0,
+ short_name = 'vd' },
+ [15] = {
+ name = 'more',
+ mouse_shape = 0,
+ short_name = 'm' },
+ [16] = {
+ name = 'more_lastline',
+ mouse_shape = 0,
+ short_name = 'ml' },
+ [17] = {
+ blinkoff = 0,
+ blinkon = 0,
+ blinkwait = 0,
+ cell_percentage = 0,
+ cursor_shape = 'block',
+ name = 'showmatch',
+ hl_id = 0,
+ id_lm = 0,
+ attr = {},
+ attr_lm = {},
+ short_name = 'sm' },
+ }
+
+ screen:expect(function()
+ -- Default 'guicursor', published on startup.
+ eq(expected_mode_info, screen._mode_info)
+ eq(true, screen._cursor_style_enabled)
+ eq('normal', screen.mode)
+ end)
+
+ -- Event is published ONLY if the cursor style changed.
+ screen._mode_info = nil
+ command("echo 'test'")
+ screen:expect{grid=[[
+ ^ |
+ ~ |
+ ~ |
+ ~ |
+ test |
+ ]], condition=function()
+ eq(nil, screen._mode_info)
+ end}
+
+ -- Change the cursor style.
+ helpers.command('hi Cursor guibg=DarkGray')
+ helpers.command('set guicursor=n-v-c:block,i-ci-ve:ver25,r-cr-o:hor20'
+ ..',a:blinkwait700-blinkoff400-blinkon250-Cursor/lCursor'
+ ..',sm:block-blinkwait175-blinkoff150-blinkon175')
+
+ -- Update the expected values.
+ for _, m in ipairs(expected_mode_info) do
+ if m.name == 'showmatch' then
+ if m.blinkon then m.blinkon = 175 end
+ if m.blinkoff then m.blinkoff = 150 end
+ if m.blinkwait then m.blinkwait = 175 end
+ else
+ if m.blinkon then m.blinkon = 250 end
+ if m.blinkoff then m.blinkoff = 400 end
+ if m.blinkwait then m.blinkwait = 700 end
+ end
+ if m.hl_id then
+ m.hl_id = 49
+ m.attr = {background = Screen.colors.DarkGray}
+ end
+ if m.id_lm then m.id_lm = 50 end
+ end
+
+ -- Assert the new expectation.
+ screen:expect(function()
+ eq(expected_mode_info, screen._mode_info)
+ eq(true, screen._cursor_style_enabled)
+ eq('normal', screen.mode)
+ end)
+
+ -- Change hl groups only, should update the styles
+ helpers.command('hi Cursor guibg=Red')
+ helpers.command('hi lCursor guibg=Green')
+
+ -- Update the expected values.
+ for _, m in ipairs(expected_mode_info) do
+ if m.hl_id then
+ m.attr = {background = Screen.colors.Red}
+ end
+ if m.id_lm then
+ m.attr_lm = {background = Screen.colors.Green}
+ end
+ end
+ -- Assert the new expectation.
+ screen:expect(function()
+ eq(expected_mode_info, screen._mode_info)
+ eq(true, screen._cursor_style_enabled)
+ eq('normal', screen.mode)
+ end)
+
+ -- Another cursor style.
+ meths.set_option('guicursor', 'n-v-c:ver35-blinkwait171-blinkoff172-blinkon173'
+ ..',ve:hor35,o:ver50,i-ci:block,r-cr:hor90,sm:ver42')
+ screen:expect(function()
+ local named = {}
+ for _, m in ipairs(screen._mode_info) do
+ named[m.name] = m
+ end
+ eq('vertical', named.normal.cursor_shape)
+ eq(35, named.normal.cell_percentage)
+ eq('horizontal', named.visual_select.cursor_shape)
+ eq(35, named.visual_select.cell_percentage)
+ eq('vertical', named.operator.cursor_shape)
+ eq(50, named.operator.cell_percentage)
+ eq('block', named.insert.cursor_shape)
+ eq('vertical', named.showmatch.cursor_shape)
+ eq(90, named.cmdline_replace.cell_percentage)
+ eq(171, named.normal.blinkwait)
+ eq(172, named.normal.blinkoff)
+ eq(173, named.normal.blinkon)
+ eq(42, named.showmatch.cell_percentage)
+ end)
+ end)
+
+ it("empty 'guicursor' sets cursor_shape=block in all modes", function()
+ meths.set_option('guicursor', '')
+ screen:expect(function()
+ -- Empty 'guicursor' sets enabled=false.
+ eq(false, screen._cursor_style_enabled)
+ for _, m in ipairs(screen._mode_info) do
+ if m['cursor_shape'] ~= nil then
+ eq('block', m.cursor_shape)
+ eq(0, m.blinkon)
+ end
+ end
+ end)
+ end)
+
+end)
diff --git a/test/functional/ui/diff_spec.lua b/test/functional/ui/diff_spec.lua
new file mode 100644
index 0000000000..8e6756e550
--- /dev/null
+++ b/test/functional/ui/diff_spec.lua
@@ -0,0 +1,959 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+
+local feed = helpers.feed
+local clear = helpers.clear
+local write_file = helpers.write_file
+
+describe('Diff mode screen', function()
+ local fname = 'Xtest-functional-diff-screen-1'
+ local fname_2 = fname .. '.2'
+ local screen
+
+ local reread = function()
+ feed(':e<cr><c-w>w:e<cr><c-w>w')
+ end
+
+ setup(function()
+ clear()
+ os.remove(fname)
+ os.remove(fname_2)
+ end)
+
+ teardown(function()
+ os.remove(fname)
+ os.remove(fname_2)
+ end)
+
+ before_each(function()
+ clear()
+ feed(':e ' .. fname_2 .. '<cr>')
+ feed(':vnew ' .. fname .. '<cr>')
+ feed(':diffthis<cr>')
+ feed('<c-w>w:diffthis<cr><c-w>w')
+
+ screen = Screen.new(40, 16)
+ screen:attach()
+ screen:set_default_attr_ids({
+ [1] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.WebGray},
+ [2] = {background = Screen.colors.LightCyan1, bold = true, foreground = Screen.colors.Blue1},
+ [3] = {reverse = true},
+ [4] = {background = Screen.colors.LightBlue},
+ [5] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.LightGrey},
+ [6] = {bold = true, foreground = Screen.colors.Blue1},
+ [7] = {bold = true, reverse = true},
+ [8] = {bold = true, background = Screen.colors.Red},
+ [9] = {background = Screen.colors.LightMagenta},
+ })
+ end)
+
+ it('Add a line in beginning of file 2', function()
+ write_file(fname, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n", false)
+ write_file(fname_2, "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n", false)
+ reread()
+
+ feed(':set diffopt=filler<cr>')
+ screen:expect([[
+ {1: }{2:------------------}{3:โ”‚}{1: }{4:0 }|
+ {1: }^1 {3:โ”‚}{1: }1 |
+ {1: }2 {3:โ”‚}{1: }2 |
+ {1: }3 {3:โ”‚}{1: }3 |
+ {1: }4 {3:โ”‚}{1: }4 |
+ {1: }5 {3:โ”‚}{1: }5 |
+ {1: }6 {3:โ”‚}{1: }6 |
+ {1:+ }{5:+-- 4 lines: 7ยทยทยท}{3:โ”‚}{1:+ }{5:+-- 4 lines: 7ยทยท}|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt=filler |
+ ]])
+
+ feed(':set diffopt+=internal<cr>')
+ screen:expect([[
+ {1: }{2:------------------}{3:โ”‚}{1: }{4:0 }|
+ {1: }^1 {3:โ”‚}{1: }1 |
+ {1: }2 {3:โ”‚}{1: }2 |
+ {1: }3 {3:โ”‚}{1: }3 |
+ {1: }4 {3:โ”‚}{1: }4 |
+ {1: }5 {3:โ”‚}{1: }5 |
+ {1: }6 {3:โ”‚}{1: }6 |
+ {1:+ }{5:+-- 4 lines: 7ยทยทยท}{3:โ”‚}{1:+ }{5:+-- 4 lines: 7ยทยท}|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt+=internal |
+ ]])
+ end)
+
+ it('Add a line in beginning of file 1', function()
+ write_file(fname, "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n", false)
+ write_file(fname_2, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n", false)
+ reread()
+
+ feed(":set diffopt=filler<cr>")
+ screen:expect([[
+ {1: }{4:^0 }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }1 {3:โ”‚}{1: }1 |
+ {1: }2 {3:โ”‚}{1: }2 |
+ {1: }3 {3:โ”‚}{1: }3 |
+ {1: }4 {3:โ”‚}{1: }4 |
+ {1: }5 {3:โ”‚}{1: }5 |
+ {1: }6 {3:โ”‚}{1: }6 |
+ {1:+ }{5:+-- 4 lines: 7ยทยทยท}{3:โ”‚}{1:+ }{5:+-- 4 lines: 7ยทยท}|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt=filler |
+ ]])
+
+ feed(":set diffopt+=internal<cr>")
+ screen:expect([[
+ {1: }{4:^0 }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }1 {3:โ”‚}{1: }1 |
+ {1: }2 {3:โ”‚}{1: }2 |
+ {1: }3 {3:โ”‚}{1: }3 |
+ {1: }4 {3:โ”‚}{1: }4 |
+ {1: }5 {3:โ”‚}{1: }5 |
+ {1: }6 {3:โ”‚}{1: }6 |
+ {1:+ }{5:+-- 4 lines: 7ยทยทยท}{3:โ”‚}{1:+ }{5:+-- 4 lines: 7ยทยท}|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt+=internal |
+ ]])
+ end)
+
+ it('Add a line at the end of file 2', function()
+ write_file(fname, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n", false)
+ write_file(fname_2, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n", false)
+ reread()
+
+ feed(":set diffopt=filler<cr>")
+ screen:expect([[
+ {1:+ }{5:^+-- 4 lines: 1ยทยทยท}{3:โ”‚}{1:+ }{5:+-- 4 lines: 1ยทยท}|
+ {1: }5 {3:โ”‚}{1: }5 |
+ {1: }6 {3:โ”‚}{1: }6 |
+ {1: }7 {3:โ”‚}{1: }7 |
+ {1: }8 {3:โ”‚}{1: }8 |
+ {1: }9 {3:โ”‚}{1: }9 |
+ {1: }10 {3:โ”‚}{1: }10 |
+ {1: }{2:------------------}{3:โ”‚}{1: }{4:11 }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt=filler |
+ ]])
+
+ feed(":set diffopt+=internal<cr>")
+ screen:expect([[
+ {1:+ }{5:^+-- 4 lines: 1ยทยทยท}{3:โ”‚}{1:+ }{5:+-- 4 lines: 1ยทยท}|
+ {1: }5 {3:โ”‚}{1: }5 |
+ {1: }6 {3:โ”‚}{1: }6 |
+ {1: }7 {3:โ”‚}{1: }7 |
+ {1: }8 {3:โ”‚}{1: }8 |
+ {1: }9 {3:โ”‚}{1: }9 |
+ {1: }10 {3:โ”‚}{1: }10 |
+ {1: }{2:------------------}{3:โ”‚}{1: }{4:11 }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt+=internal |
+ ]])
+ end)
+
+ it('Add a line at the end of file 1', function()
+ write_file(fname, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n", false)
+ write_file(fname_2, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n", false)
+ reread()
+
+ feed(":set diffopt=filler<cr>")
+ screen:expect([[
+ {1:+ }{5:^+-- 4 lines: 1ยทยทยท}{3:โ”‚}{1:+ }{5:+-- 4 lines: 1ยทยท}|
+ {1: }5 {3:โ”‚}{1: }5 |
+ {1: }6 {3:โ”‚}{1: }6 |
+ {1: }7 {3:โ”‚}{1: }7 |
+ {1: }8 {3:โ”‚}{1: }8 |
+ {1: }9 {3:โ”‚}{1: }9 |
+ {1: }10 {3:โ”‚}{1: }10 |
+ {1: }{4:11 }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt=filler |
+ ]])
+
+ feed(":set diffopt+=internal<cr>")
+ screen:expect([[
+ {1:+ }{5:^+-- 4 lines: 1ยทยทยท}{3:โ”‚}{1:+ }{5:+-- 4 lines: 1ยทยท}|
+ {1: }5 {3:โ”‚}{1: }5 |
+ {1: }6 {3:โ”‚}{1: }6 |
+ {1: }7 {3:โ”‚}{1: }7 |
+ {1: }8 {3:โ”‚}{1: }8 |
+ {1: }9 {3:โ”‚}{1: }9 |
+ {1: }10 {3:โ”‚}{1: }10 |
+ {1: }{4:11 }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt+=internal |
+ ]])
+ end)
+
+ it('Add a line in the middle of file 2, remove on at the end of file 1', function()
+ write_file(fname, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n", false)
+ write_file(fname_2, "1\n2\n3\n4\n4\n5\n6\n7\n8\n9\n10\n", false)
+ reread()
+
+ feed(':set diffopt=filler<cr>')
+ screen:expect([[
+ {1: }^1 {3:โ”‚}{1: }1 |
+ {1: }2 {3:โ”‚}{1: }2 |
+ {1: }3 {3:โ”‚}{1: }3 |
+ {1: }4 {3:โ”‚}{1: }4 |
+ {1: }{2:------------------}{3:โ”‚}{1: }{4:4 }|
+ {1: }5 {3:โ”‚}{1: }5 |
+ {1: }6 {3:โ”‚}{1: }6 |
+ {1: }7 {3:โ”‚}{1: }7 |
+ {1: }8 {3:โ”‚}{1: }8 |
+ {1: }9 {3:โ”‚}{1: }9 |
+ {1: }10 {3:โ”‚}{1: }10 |
+ {1: }{4:11 }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt=filler |
+ ]])
+
+ feed(':set diffopt+=internal<cr>')
+ screen:expect([[
+ {1: }^1 {3:โ”‚}{1: }1 |
+ {1: }2 {3:โ”‚}{1: }2 |
+ {1: }3 {3:โ”‚}{1: }3 |
+ {1: }4 {3:โ”‚}{1: }4 |
+ {1: }{2:------------------}{3:โ”‚}{1: }{4:4 }|
+ {1: }5 {3:โ”‚}{1: }5 |
+ {1: }6 {3:โ”‚}{1: }6 |
+ {1: }7 {3:โ”‚}{1: }7 |
+ {1: }8 {3:โ”‚}{1: }8 |
+ {1: }9 {3:โ”‚}{1: }9 |
+ {1: }10 {3:โ”‚}{1: }10 |
+ {1: }{4:11 }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt+=internal |
+ ]])
+ end)
+
+ it('Add a line in the middle of file 1, remove on at the end of file 2', function()
+ write_file(fname, "1\n2\n3\n4\n4\n5\n6\n7\n8\n9\n10\n", false)
+ write_file(fname_2, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n", false)
+ reread()
+
+ feed(':set diffopt=filler<cr>')
+ screen:expect([[
+ {1: }^1 {3:โ”‚}{1: }1 |
+ {1: }2 {3:โ”‚}{1: }2 |
+ {1: }3 {3:โ”‚}{1: }3 |
+ {1: }4 {3:โ”‚}{1: }4 |
+ {1: }{4:4 }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }5 {3:โ”‚}{1: }5 |
+ {1: }6 {3:โ”‚}{1: }6 |
+ {1: }7 {3:โ”‚}{1: }7 |
+ {1: }8 {3:โ”‚}{1: }8 |
+ {1: }9 {3:โ”‚}{1: }9 |
+ {1: }10 {3:โ”‚}{1: }10 |
+ {1: }{2:------------------}{3:โ”‚}{1: }{4:11 }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt=filler |
+ ]])
+
+ feed(':set diffopt+=internal<cr>')
+ screen:expect([[
+ {1: }^1 {3:โ”‚}{1: }1 |
+ {1: }2 {3:โ”‚}{1: }2 |
+ {1: }3 {3:โ”‚}{1: }3 |
+ {1: }4 {3:โ”‚}{1: }4 |
+ {1: }{4:4 }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }5 {3:โ”‚}{1: }5 |
+ {1: }6 {3:โ”‚}{1: }6 |
+ {1: }7 {3:โ”‚}{1: }7 |
+ {1: }8 {3:โ”‚}{1: }8 |
+ {1: }9 {3:โ”‚}{1: }9 |
+ {1: }10 {3:โ”‚}{1: }10 |
+ {1: }{2:------------------}{3:โ”‚}{1: }{4:11 }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt+=internal |
+ ]])
+ end)
+
+ describe('normal/patience/histogram diff algorithm', function()
+ setup(function()
+ local f1 = [[#include <stdio.h>
+
+// Frobs foo heartily
+int frobnitz(int foo)
+{
+ int i;
+ for(i = 0; i < 10; i++)
+ {
+ printf("Your answer is: ");
+ printf("%d\n", foo);
+ }
+}
+
+int fact(int n)
+{
+ if(n > 1)
+ {
+ return fact(n-1) * n;
+ }
+ return 1;
+}
+
+int main(int argc, char **argv)
+{
+ frobnitz(fact(10));
+}]]
+ write_file(fname, f1, false)
+ local f2 = [[#include <stdio.h>
+
+int fib(int n)
+{
+ if(n > 2)
+ {
+ return fib(n-1) + fib(n-2);
+ }
+ return 1;
+}
+
+// Frobs foo heartily
+int frobnitz(int foo)
+{
+ int i;
+ for(i = 0; i < 10; i++)
+ {
+ printf("%d\n", foo);
+ }
+}
+
+int main(int argc, char **argv)
+{
+ frobnitz(fib(10));
+}]]
+ write_file(fname_2, f2, false)
+ end)
+
+ it('diffopt=+algorithm:myers', function()
+ reread()
+ feed(':set diffopt=internal,filler<cr>')
+ screen:expect([[
+ {1: }^#include <stdio.h>{3:โ”‚}{1: }#include <stdio.h|
+ {1: } {3:โ”‚}{1: } |
+ {1: }{8:// Frobs foo heart}{3:โ”‚}{1: }{8:int fib(int n)}{9: }|
+ {1: }{4:int frobnitz(int f}{3:โ”‚}{1: }{2:-----------------}|
+ {1: }{ {3:โ”‚}{1: }{ |
+ {1: }{9: i}{8:nt i;}{9: }{3:โ”‚}{1: }{9: i}{8:f(n > 2)}{9: }|
+ {1: }{4: for(i = 0; i <}{3:โ”‚}{1: }{2:-----------------}|
+ {1: } { {3:โ”‚}{1: } { |
+ {1: }{9: }{8:printf("Yo}{3:โ”‚}{1: }{9: }{8:return fi}|
+ {1: }{4: printf("%d}{3:โ”‚}{1: }{2:-----------------}|
+ {1: } } {3:โ”‚}{1: } } |
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: return 1; }|
+ {1: }} {3:โ”‚}{1: }} |
+ {1: } {3:โ”‚}{1: } |
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt=internal,filler |
+ ]])
+
+ feed('G')
+ screen:expect([[
+ {1: }{2:------------------}{3:โ”‚}{1: }{4:int frobnitz(int }|
+ {1: }{ {3:โ”‚}{1: }{ |
+ {1: }{9: i}{8:f(n > 1)}{9: }{3:โ”‚}{1: }{9: i}{8:nt i;}{9: }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: for(i = 0; i }|
+ {1: } { {3:โ”‚}{1: } { |
+ {1: }{9: }{8:return fac}{3:โ”‚}{1: }{9: }{8:printf("%}|
+ {1: } } {3:โ”‚}{1: } } |
+ {1: }{4: return 1; }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }} {3:โ”‚}{1: }} |
+ {1: } {3:โ”‚}{1: } |
+ {1: }int main(int argc,{3:โ”‚}{1: }int main(int argc|
+ {1: }{ {3:โ”‚}{1: }{ |
+ {1: }{9: frobnitz(f}{8:act}{9:(}{3:โ”‚}{1: }{9: frobnitz(f}{8:ib}{9:(}|
+ {1: }^} {3:โ”‚}{1: }} |
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt=internal,filler |
+ ]])
+ end)
+
+ it('diffopt+=algorithm:patience', function()
+ reread()
+ feed(':set diffopt=internal,filler,algorithm:patience<cr>')
+ screen:expect([[
+ {1: }^#include <stdio.h>{3:โ”‚}{1: }#include <stdio.h|
+ {1: } {3:โ”‚}{1: } |
+ {1: }{2:------------------}{3:โ”‚}{1: }{4:int fib(int n) }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4:{ }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: if(n > 2) }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: { }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: return fi}|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: } }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: return 1; }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4:} }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: }|
+ {1: }// Frobs foo heart{3:โ”‚}{1: }// Frobs foo hear|
+ {1: }int frobnitz(int f{3:โ”‚}{1: }int frobnitz(int |
+ {1: }{ {3:โ”‚}{1: }{ |
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ |
+ ]])
+
+ feed('G')
+ screen:expect([[
+ {1: } {3:โ”‚}{1: } |
+ {1: }{4:int fact(int n) }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }{4:{ }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }{4: if(n > 1) }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }{4: { }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }{4: return fac}{3:โ”‚}{1: }{2:-----------------}|
+ {1: }{4: } }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }{4: return 1; }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }{4:} }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }{4: }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }int main(int argc,{3:โ”‚}{1: }int main(int argc|
+ {1: }{ {3:โ”‚}{1: }{ |
+ {1: }{9: frobnitz(f}{8:act}{9:(}{3:โ”‚}{1: }{9: frobnitz(f}{8:ib}{9:(}|
+ {1: }^} {3:โ”‚}{1: }} |
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ |
+ ]])
+ end)
+
+ it('diffopt+=algorithm:histogram', function()
+ reread()
+ feed(':set diffopt=internal,filler,algorithm:histogram<cr>')
+ screen:expect([[
+ {1: }^#include <stdio.h>{3:โ”‚}{1: }#include <stdio.h|
+ {1: } {3:โ”‚}{1: } |
+ {1: }{2:------------------}{3:โ”‚}{1: }{4:int fib(int n) }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4:{ }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: if(n > 2) }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: { }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: return fi}|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: } }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: return 1; }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4:} }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: }|
+ {1: }// Frobs foo heart{3:โ”‚}{1: }// Frobs foo hear|
+ {1: }int frobnitz(int f{3:โ”‚}{1: }int frobnitz(int |
+ {1: }{ {3:โ”‚}{1: }{ |
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ |
+ ]])
+
+ feed('G')
+ screen:expect([[
+ {1: } {3:โ”‚}{1: } |
+ {1: }{4:int fact(int n) }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }{4:{ }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }{4: if(n > 1) }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }{4: { }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }{4: return fac}{3:โ”‚}{1: }{2:-----------------}|
+ {1: }{4: } }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }{4: return 1; }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }{4:} }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }{4: }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }int main(int argc,{3:โ”‚}{1: }int main(int argc|
+ {1: }{ {3:โ”‚}{1: }{ |
+ {1: }{9: frobnitz(f}{8:act}{9:(}{3:โ”‚}{1: }{9: frobnitz(f}{8:ib}{9:(}|
+ {1: }^} {3:โ”‚}{1: }} |
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ |
+ ]])
+ end)
+ end)
+
+ describe('diffopt+=indent-heuristic', function()
+ setup(function()
+ local f1 = [[
+ def finalize(values)
+
+ values.each do |v|
+ v.finalize
+ end]]
+ write_file(fname, f1, false)
+ local f2 = [[
+ def finalize(values)
+
+ values.each do |v|
+ v.prepare
+ end
+
+ values.each do |v|
+ v.finalize
+ end]]
+ write_file(fname_2, f2, false)
+ feed(':diffupdate!<cr>')
+ end)
+
+ it('internal', function()
+ reread()
+ feed(":set diffopt=internal,filler<cr>")
+ screen:expect([[
+ {1: }^def finalize(value{3:โ”‚}{1: }def finalize(valu|
+ {1: } {3:โ”‚}{1: } |
+ {1: } values.each do |{3:โ”‚}{1: } values.each do |
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: v.prepare }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: end }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: values.each do }|
+ {1: } v.finalize {3:โ”‚}{1: } v.finalize |
+ {1: } end {3:โ”‚}{1: } end |
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt=internal,filler |
+ ]])
+ end)
+
+ it('indent-heuristic', function()
+ reread()
+ feed(':set diffopt=internal,filler,indent-heuristic<cr>')
+ screen:expect([[
+ {1: }^def finalize(value{3:โ”‚}{1: }def finalize(valu|
+ {1: } {3:โ”‚}{1: } |
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: values.each do }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: v.prepare }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: end }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: }|
+ {1: } values.each do |{3:โ”‚}{1: } values.each do |
+ {1: } v.finalize {3:โ”‚}{1: } v.finalize |
+ {1: } end {3:โ”‚}{1: } end |
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ |
+ ]])
+ end)
+
+ it('indent-heuristic random order', function()
+ reread()
+ feed(':set diffopt=internal,filler,indent-heuristic,algorithm:patience<cr>')
+ feed(':<cr>')
+ screen:expect([[
+ {1: }^def finalize(value{3:โ”‚}{1: }def finalize(valu|
+ {1: } {3:โ”‚}{1: } |
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: values.each do }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: v.prepare }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: end }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: }|
+ {1: } values.each do |{3:โ”‚}{1: } values.each do |
+ {1: } v.finalize {3:โ”‚}{1: } v.finalize |
+ {1: } end {3:โ”‚}{1: } end |
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ : |
+ ]])
+ end)
+ end)
+
+ it('Diff the same file', function()
+ write_file(fname, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n", false)
+ write_file(fname_2, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n", false)
+ reread()
+
+ feed(':set diffopt=filler<cr>')
+ screen:expect([[
+ {1:+ }{5:^+-- 10 lines: 1ยทยทยท}{3:โ”‚}{1:+ }{5:+-- 10 lines: 1ยทยท}|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt=filler |
+ ]])
+
+ feed(':set diffopt+=internal<cr>')
+ screen:expect([[
+ {1:+ }{5:^+-- 10 lines: 1ยทยทยท}{3:โ”‚}{1:+ }{5:+-- 10 lines: 1ยทยท}|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt+=internal |
+ ]])
+ end)
+
+ it('Diff an empty file', function()
+ write_file(fname, "", false)
+ write_file(fname_2, "", false)
+ reread()
+
+ feed(':set diffopt=filler<cr>')
+ screen:expect([[
+ {1:- }^ {3:โ”‚}{1:- } |
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt=filler |
+ ]])
+
+ feed(':set diffopt+=internal<cr>')
+ screen:expect([[
+ {1:- }^ {3:โ”‚}{1:- } |
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt+=internal |
+ ]])
+ end)
+
+ it('diffopt+=icase', function()
+ write_file(fname, "a\nb\ncd\n", false)
+ write_file(fname_2, "A\nb\ncDe\n", false)
+ reread()
+
+ feed(':set diffopt=filler,icase<cr>')
+ screen:expect([[
+ {1: }^a {3:โ”‚}{1: }A |
+ {1: }b {3:โ”‚}{1: }b |
+ {1: }{9:cd }{3:โ”‚}{1: }{9:cD}{8:e}{9: }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt=filler,icase |
+ ]])
+
+ feed(':set diffopt+=internal<cr>')
+ screen:expect([[
+ {1: }^a {3:โ”‚}{1: }A |
+ {1: }b {3:โ”‚}{1: }b |
+ {1: }{9:cd }{3:โ”‚}{1: }{9:cD}{8:e}{9: }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt+=internal |
+ ]])
+ end)
+
+ describe('diffopt+=iwhite', function()
+ setup(function()
+ local f1 = 'int main()\n{\n printf("Hello, World!");\n return 0;\n}\n'
+ write_file(fname, f1, false)
+ local f2 = 'int main()\n{\n if (0)\n {\n printf("Hello, World!");\n return 0;\n }\n}\n'
+ write_file(fname_2, f2, false)
+ feed(':diffupdate!<cr>')
+ end)
+
+ it('external', function()
+ reread()
+ feed(':set diffopt=filler,iwhite<cr>')
+ screen:expect([[
+ {1: }^int main() {3:โ”‚}{1: }int main() |
+ {1: }{ {3:โ”‚}{1: }{ |
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: if (0) }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: { }|
+ {1: } printf("Hello, {3:โ”‚}{1: } printf("Hel|
+ {1: } return 0; {3:โ”‚}{1: } return 0; |
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: } }|
+ {1: }} {3:โ”‚}{1: }} |
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt=filler,iwhite |
+ ]])
+ end)
+
+ it('internal', function()
+ reread()
+ feed(':set diffopt=filler,iwhite,internal<cr>')
+ screen:expect([[
+ {1: }^int main() {3:โ”‚}{1: }int main() |
+ {1: }{ {3:โ”‚}{1: }{ |
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: if (0) }|
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: { }|
+ {1: } printf("Hello, {3:โ”‚}{1: } printf("Hel|
+ {1: } return 0; {3:โ”‚}{1: } return 0; |
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: } }|
+ {1: }} {3:โ”‚}{1: }} |
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt=filler,iwhite,internal |
+ ]])
+ end)
+ end)
+
+ describe('diffopt+=iblank', function()
+ setup(function()
+ write_file(fname, 'a\n\n \ncd\nef\nxxx\n', false)
+ write_file(fname_2, 'a\ncd\n\nef\nyyy\n', false)
+ feed(':diffupdate!<cr>')
+ end)
+
+ it('generic', function()
+ reread()
+ feed(':set diffopt=internal,filler,iblank<cr>')
+ screen:expect([[
+ {1: }^a {3:โ”‚}{1: }a |
+ {1: }{4: }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }{4: }{3:โ”‚}{1: }{2:-----------------}|
+ {1: }cd {3:โ”‚}{1: }cd |
+ {1: }ef {3:โ”‚}{1: } |
+ {1: }{8:xxx}{9: }{3:โ”‚}{1: }ef |
+ {1: }{6:~ }{3:โ”‚}{1: }{8:yyy}{9: }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ :set diffopt=internal,filler,iblank |
+ ]])
+ end)
+
+ it('diffopt+=iwhite', function()
+ reread()
+ feed(':set diffopt=internal,filler,iblank,iwhite<cr>')
+ feed(':<cr>')
+ screen:expect([[
+ {1: }^a {3:โ”‚}{1: }a |
+ {1: } {3:โ”‚}{1: }cd |
+ {1: } {3:โ”‚}{1: } |
+ {1: }cd {3:โ”‚}{1: }ef |
+ {1: }ef {3:โ”‚}{1: }{8:yyy}{9: }|
+ {1: }{8:xxx}{9: }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ : |
+ ]])
+ end)
+
+ it('diffopt+=iwhiteall', function()
+ reread()
+ feed(':set diffopt=internal,filler,iblank,iwhiteall<cr>')
+ feed(':<cr>')
+ screen:expect([[
+ {1: }^a {3:โ”‚}{1: }a |
+ {1: } {3:โ”‚}{1: }cd |
+ {1: } {3:โ”‚}{1: } |
+ {1: }cd {3:โ”‚}{1: }ef |
+ {1: }ef {3:โ”‚}{1: }{8:yyy}{9: }|
+ {1: }{8:xxx}{9: }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ : |
+ ]])
+ end)
+
+ it('diffopt+=iwhiteeol', function()
+ reread()
+ feed(':set diffopt=internal,filler,iblank,iwhiteeol<cr>')
+ feed(':<cr>')
+ screen:expect([[
+ {1: }^a {3:โ”‚}{1: }a |
+ {1: } {3:โ”‚}{1: }cd |
+ {1: } {3:โ”‚}{1: } |
+ {1: }cd {3:โ”‚}{1: }ef |
+ {1: }ef {3:โ”‚}{1: }{8:yyy}{9: }|
+ {1: }{8:xxx}{9: }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ : |
+ ]])
+ end)
+ end)
+
+ describe('diffopt+=iwhite{eol,all}', function()
+ setup(function()
+ write_file(fname, 'a \nx\ncd\nef\nxx xx\nfoo\nbar\n', false)
+ write_file(fname_2, 'a\nx\nc d\n ef\nxx xx\nfoo\n\nbar\n', false)
+ feed(':diffupdate!<cr>')
+ end)
+
+ it('diffopt+=iwhiteeol', function()
+ reread()
+ feed(':set diffopt=internal,filler,iwhiteeol<cr>')
+ feed(':<cr>')
+ screen:expect([[
+ {1: }^a {3:โ”‚}{1: }a |
+ {1: }x {3:โ”‚}{1: }x |
+ {1: }{9:cd }{3:โ”‚}{1: }{9:c}{8: }{9:d }|
+ {1: }{9:ef }{3:โ”‚}{1: }{8: }{9:ef }|
+ {1: }{9:xx }{8: }{9:xx }{3:โ”‚}{1: }{9:xx xx }|
+ {1: }foo {3:โ”‚}{1: }foo |
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: }|
+ {1: }bar {3:โ”‚}{1: }bar |
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ : |
+ ]])
+ end)
+
+ it('diffopt+=iwhiteall', function()
+ reread()
+ feed(':set diffopt=internal,filler,iwhiteall<cr>')
+ feed(':<cr>')
+ screen:expect([[
+ {1: }^a {3:โ”‚}{1: }a |
+ {1: }x {3:โ”‚}{1: }x |
+ {1: }cd {3:โ”‚}{1: }c d |
+ {1: }ef {3:โ”‚}{1: } ef |
+ {1: }xx xx {3:โ”‚}{1: }xx xx |
+ {1: }foo {3:โ”‚}{1: }foo |
+ {1: }{2:------------------}{3:โ”‚}{1: }{4: }|
+ {1: }bar {3:โ”‚}{1: }bar |
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {1: }{6:~ }{3:โ”‚}{1: }{6:~ }|
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ : |
+ ]])
+ end)
+ end)
+end)
diff --git a/test/functional/ui/embed_spec.lua b/test/functional/ui/embed_spec.lua
new file mode 100644
index 0000000000..10dbc68672
--- /dev/null
+++ b/test/functional/ui/embed_spec.lua
@@ -0,0 +1,82 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+
+local feed = helpers.feed
+local eq = helpers.eq
+local clear = helpers.clear
+
+local function test_embed(ext_linegrid)
+ local screen
+ local function startup(...)
+ clear{headless=false, args={...}}
+
+ -- attach immediately after startup, for early UI
+ screen = Screen.new(60, 8)
+ screen:attach{ext_linegrid=ext_linegrid}
+ screen:set_default_attr_ids({
+ [1] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
+ [2] = {bold = true, foreground = Screen.colors.SeaGreen4},
+ [3] = {bold = true, foreground = Screen.colors.Blue1},
+ [4] = {bold = true, foreground = Screen.colors.Green},
+ })
+ end
+
+ it('can display errors', function()
+ startup('--cmd', 'echoerr invalid+')
+ screen:expect([[
+ |
+ |
+ |
+ |
+ |
+ Error detected while processing pre-vimrc command line: |
+ E121: Undefined variable: invalid |
+ Press ENTER or type command to continue^ |
+ ]])
+
+ feed('<cr>')
+ screen:expect([[
+ ^ |
+ {3:~ }|
+ {3:~ }|
+ {3:~ }|
+ {3:~ }|
+ {3:~ }|
+ {3:~ }|
+ |
+ ]])
+ end)
+
+ it("doesn't erase output when setting color scheme", function()
+ startup('--cmd', 'echoerr "foo"', '--cmd', 'color default', '--cmd', 'echoerr "bar"')
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Error detected while processing pre-vimrc command line: |
+ foo |
+ {1:bar} |
+ {4:Press ENTER or type command to continue}^ |
+ ]])
+ end)
+
+ it("doesn't erase output when setting Normal colors", function()
+ startup('--cmd', 'echoerr "foo"', '--cmd', 'hi Normal guibg=Green', '--cmd', 'echoerr "bar"')
+ screen:expect{grid=[[
+ |
+ |
+ |
+ |
+ Error detected while processing pre-vimrc command line: |
+ foo |
+ bar |
+ Press ENTER or type command to continue^ |
+ ]], condition=function()
+ eq(Screen.colors.Green, screen.default_colors.rgb_bg)
+ end}
+ end)
+end
+
+describe('--embed UI on startup (ext_linegrid=true)', function() test_embed(true) end)
+describe('--embed UI on startup (ext_linegrid=false)', function() test_embed(false) end)
diff --git a/test/functional/ui/fold_spec.lua b/test/functional/ui/fold_spec.lua
new file mode 100644
index 0000000000..943cbcef56
--- /dev/null
+++ b/test/functional/ui/fold_spec.lua
@@ -0,0 +1,235 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+local clear, feed, eq = helpers.clear, helpers.feed, helpers.eq
+local command = helpers.command
+local feed_command = helpers.feed_command
+local insert = helpers.insert
+local funcs = helpers.funcs
+local meths = helpers.meths
+
+describe("folded lines", function()
+ local screen
+ before_each(function()
+ clear()
+ screen = Screen.new(45, 8)
+ screen:attach({rgb=true})
+ screen:set_default_attr_ids({
+ [1] = {bold = true, foreground = Screen.colors.Blue1},
+ [2] = {reverse = true},
+ [3] = {bold = true, reverse = true},
+ [4] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
+ [5] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.LightGrey},
+ [6] = {background = Screen.colors.Yellow},
+ [7] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.WebGray},
+ })
+ end)
+
+ after_each(function()
+ screen:detach()
+ end)
+
+ it("highlighting with relative line numbers", function()
+ command("set relativenumber foldmethod=marker")
+ feed_command("set foldcolumn=2")
+ funcs.setline(1, '{{{1')
+ funcs.setline(2, 'line 1')
+ funcs.setline(3, '{{{1')
+ funcs.setline(4, 'line 2')
+ feed("j")
+ screen:expect([[
+ {7:+ }{5: 1 +-- 2 lines: ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท}|
+ {7:+ }{5: 0 ^+-- 2 lines: ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท}|
+ {7: }{1:~ }|
+ {7: }{1:~ }|
+ {7: }{1:~ }|
+ {7: }{1:~ }|
+ {7: }{1:~ }|
+ :set foldcolumn=2 |
+ ]])
+ end)
+
+ it("works with multibyte text", function()
+ -- Currently the only allowed value of 'maxcombine'
+ eq(6, meths.get_option('maxcombine'))
+ eq(true, meths.get_option('arabicshape'))
+ insert([[
+ รฅ ่ฏญ xฬŽอ‚อ€ฬ‚อ›อ›ฬพฬฃฬ˜ฬซฬฒอšฬจอŽอขอŸ ุงู„ุนูŽุฑูŽุจููŠูŽู‘ุฉ
+ mรถre text]])
+ screen:expect([[
+ รฅ ่ฏญ xฬŽอ‚อ€ฬ‚อ›อ› ๏บŽ๏ป ๏ป‹ูŽ๏บฎูŽ๏บ’ู๏ปณูŽู‘๏บ“ |
+ mรถre tex^t |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+
+ feed('vkzf')
+ screen:expect([[
+ {5:^+-- 2 lines: รฅ ่ฏญ xฬŽอ‚อ€ฬ‚อ›อ› ๏บŽ๏ป ๏ป‹ูŽ๏บฎูŽ๏บ’ู๏ปณูŽู‘๏บ“ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท}|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+
+ feed_command("set noarabicshape")
+ screen:expect([[
+ {5:^+-- 2 lines: รฅ ่ฏญ xฬŽอ‚อ€ฬ‚อ›อ› ุงู„ุนูŽุฑูŽุจููŠูŽู‘ุฉยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท}|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ :set noarabicshape |
+ ]])
+
+ feed_command("set number foldcolumn=2")
+ screen:expect([[
+ {7:+ }{5: 1 ^+-- 2 lines: รฅ ่ฏญ xฬŽอ‚อ€ฬ‚อ›อ› ุงู„ุนูŽุฑูŽุจููŠูŽู‘ุฉยทยทยทยทยทยทยทยทยทยทยท}|
+ {7: }{1:~ }|
+ {7: }{1:~ }|
+ {7: }{1:~ }|
+ {7: }{1:~ }|
+ {7: }{1:~ }|
+ {7: }{1:~ }|
+ :set number foldcolumn=2 |
+ ]])
+
+ -- 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: +}|
+ {1: ~}{7: }|
+ {1: ~}{7: }|
+ {1: ~}{7: }|
+ {1: ~}{7: }|
+ {1: ~}{7: }|
+ {1: ~}{7: }|
+ :set rightleft |
+ ]])
+
+ feed_command("set nonumber foldcolumn=0")
+ screen:expect([[
+ {5:+-- 2 lines: รฅ ่ฏญ xฬŽอ‚อ€ฬ‚อ›อ› ุงู„ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท^ยท}|
+ {1: ~}|
+ {1: ~}|
+ {1: ~}|
+ {1: ~}|
+ {1: ~}|
+ {1: ~}|
+ :set nonumber foldcolumn=0 |
+ ]])
+
+ feed_command("set arabicshape")
+ screen:expect([[
+ {5:+-- 2 lines: รฅ ่ฏญ xฬŽอ‚อ€ฬ‚อ›อ› ๏บ๏ปŸยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท^ยท}|
+ {1: ~}|
+ {1: ~}|
+ {1: ~}|
+ {1: ~}|
+ {1: ~}|
+ {1: ~}|
+ :set arabicshape |
+ ]])
+
+ feed('zo')
+ screen:expect([[
+ ๏บ”๏ปดูŽู‘๏บ‘ู๏บฎูŽ๏ปŒูŽ^๏ปŸ๏บ xฬŽอ‚อ€ฬ‚อ›อ› ่ฏญ รฅ|
+ txet erรถm|
+ {1: ~}|
+ {1: ~}|
+ {1: ~}|
+ {1: ~}|
+ {1: ~}|
+ :set arabicshape |
+ ]])
+
+ feed_command('set noarabicshape')
+ screen:expect([[
+ ุฉูŠูŽู‘ุจูุฑูŽุนูŽ^ู„ุง xฬŽอ‚อ€ฬ‚อ›อ› ่ฏญ รฅ|
+ txet erรถm|
+ {1: ~}|
+ {1: ~}|
+ {1: ~}|
+ {1: ~}|
+ {1: ~}|
+ :set noarabicshape |
+ ]])
+
+ end)
+
+ it("work in cmdline window", function()
+ feed_command("set foldmethod=manual")
+ feed_command("let x = 1")
+ feed_command("/alpha")
+ feed_command("/omega")
+
+ feed("<cr>q:")
+ screen:expect([[
+ |
+ {2:[No Name] }|
+ {1::}set foldmethod=manual |
+ {1::}let x = 1 |
+ {1::}^ |
+ {1::~ }|
+ {3:[Command Line] }|
+ : |
+ ]])
+
+ feed("kzfk")
+ screen:expect([[
+ |
+ {2:[No Name] }|
+ {1::}{5:^+-- 2 lines: set foldmethod=manualยทยทยทยทยทยทยทยทยท}|
+ {1::} |
+ {1::~ }|
+ {1::~ }|
+ {3:[Command Line] }|
+ : |
+ ]])
+
+ feed("<cr>")
+ screen:expect([[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ : |
+ ]])
+
+ feed("/<c-f>")
+ screen:expect([[
+ |
+ {2:[No Name] }|
+ {1:/}alpha |
+ {1:/}{6:omega} |
+ {1:/}^ |
+ {1:/~ }|
+ {3:[Command Line] }|
+ / |
+ ]])
+
+ feed("ggzfG")
+ screen:expect([[
+ |
+ {2:[No Name] }|
+ {1:/}{5:^+-- 3 lines: alphaยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท}|
+ {1:/~ }|
+ {1:/~ }|
+ {1:/~ }|
+ {3:[Command Line] }|
+ / |
+ ]])
+
+ end)
+end)
diff --git a/test/functional/ui/highlight_spec.lua b/test/functional/ui/highlight_spec.lua
index 6ef40fff62..39170337d7 100644
--- a/test/functional/ui/highlight_spec.lua
+++ b/test/functional/ui/highlight_spec.lua
@@ -2,22 +2,22 @@ local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
local os = require('os')
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, request, eq = helpers.execute, helpers.request, helpers.eq
+local command = helpers.command
+local eval, exc_exec = helpers.eval, helpers.exc_exec
+local feed_command, eq = helpers.feed_command, helpers.eq
+local curbufmeths = helpers.curbufmeths
-
-describe('color scheme compatibility', function()
+describe('colorscheme compatibility', function()
before_each(function()
clear()
end)
it('t_Co is set to 256 by default', function()
- eq('256', request('vim_eval', '&t_Co'))
- request('vim_set_option', 't_Co', '88')
- eq('88', request('vim_eval', '&t_Co'))
+ eq('256', eval('&t_Co'))
end)
end)
-describe('manual syntax highlight', function()
+describe('highlight: `:syntax manual`', function()
-- When using manual syntax highlighting, it should be preserved even when
-- switching buffers... bug did only occur without :set hidden
-- Ref: vim patch 7.4.1236
@@ -27,10 +27,11 @@ describe('manual syntax highlight', function()
clear()
screen = Screen.new(20,5)
screen:attach()
- --ignore highligting of ~-lines
- screen:set_default_attr_ignore( {{bold=true, foreground=Screen.colors.Blue}} )
--syntax highlight for vimcscripts "echo"
- screen:set_default_attr_ids( {[1] = {bold=true, foreground=Screen.colors.Brown}} )
+ screen:set_default_attr_ids( {
+ [0] = {bold=true, foreground=Screen.colors.Blue},
+ [1] = {bold=true, foreground=Screen.colors.Brown}
+ } )
end)
after_each(function()
@@ -39,67 +40,61 @@ describe('manual syntax highlight', function()
end)
it("works with buffer switch and 'hidden'", function()
- execute('e tmp1.vim')
- execute('e Xtest-functional-ui-highlight.tmp.vim')
- execute('filetype on')
- execute('syntax manual')
- execute('set ft=vim')
- execute('set syntax=ON')
+ command('e tmp1.vim')
+ command('e Xtest-functional-ui-highlight.tmp.vim')
+ command('filetype on')
+ command('syntax manual')
+ command('set ft=vim')
+ command('set syntax=ON')
feed('iecho 1<esc>0')
- execute('set hidden')
- execute('w')
- execute('bn')
- execute('bp')
+ command('set hidden')
+ command('w')
+ command('bn')
+ feed_command('bp')
screen:expect([[
{1:^echo} 1 |
- ~ |
- ~ |
- ~ |
- <f 1 --100%-- col 1 |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ :bp |
]])
end)
it("works with buffer switch and 'nohidden'", function()
- execute('e tmp1.vim')
- execute('e Xtest-functional-ui-highlight.tmp.vim')
- execute('filetype on')
- execute('syntax manual')
- execute('set ft=vim')
- execute('set syntax=ON')
+ command('e tmp1.vim')
+ command('e Xtest-functional-ui-highlight.tmp.vim')
+ command('filetype on')
+ command('syntax manual')
+ command('set filetype=vim fileformat=unix')
+ command('set syntax=ON')
feed('iecho 1<esc>0')
- execute('set nohidden')
- execute('w')
- execute('bn')
- execute('bp')
+ command('set nohidden')
+ command('w')
+ command('silent bn')
+ eq("tmp1.vim", eval("fnamemodify(bufname('%'), ':t')"))
+ feed_command('silent bp')
+ eq("Xtest-functional-ui-highlight.tmp.vim", eval("fnamemodify(bufname('%'), ':t')"))
screen:expect([[
{1:^echo} 1 |
- ~ |
- ~ |
- ~ |
- <ht.tmp.vim" 1L, 7C |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ :silent bp |
]])
end)
end)
-describe('Default highlight groups', function()
- -- Test the default attributes for highlight groups shown by the :highlight
- -- command
+describe('highlight defaults', function()
local screen
- local hlgroup_colors = {
- NonText = Screen.colors.Blue,
- Question = Screen.colors.SeaGreen
- }
-
before_each(function()
clear()
screen = Screen.new()
screen:attach()
- --ignore highligting of ~-lines
- screen:set_default_attr_ignore( {{bold=true, foreground=hlgroup_colors.NonText}} )
+ command("set display-=msgsep")
end)
after_each(function()
@@ -108,269 +103,297 @@ describe('Default highlight groups', function()
it('window status bar', function()
screen:set_default_attr_ids({
+ [0] = {bold=true, foreground=Screen.colors.Blue},
[1] = {reverse = true, bold = true}, -- StatusLine
[2] = {reverse = true} -- StatusLineNC
})
- execute('sp', 'vsp', 'vsp')
- screen:expect([[
- ^ {2:|} {2:|} |
- ~ {2:|}~ {2:|}~ |
- ~ {2:|}~ {2:|}~ |
- ~ {2:|}~ {2:|}~ |
- ~ {2:|}~ {2:|}~ |
- ~ {2:|}~ {2:|}~ |
+ feed_command('sp', 'vsp', 'vsp')
+ screen:expect([[
+ ^ {2:โ”‚} {2:โ”‚} |
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
{1:[No Name] }{2:[No Name] [No Name] }|
|
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{2:[No Name] }|
- |
+ :vsp |
]])
-- navigate to verify that the attributes are properly moved
feed('<c-w>j')
screen:expect([[
- {2:|} {2:|} |
- ~ {2:|}~ {2:|}~ |
- ~ {2:|}~ {2:|}~ |
- ~ {2:|}~ {2:|}~ |
- ~ {2:|}~ {2:|}~ |
- ~ {2:|}~ {2:|}~ |
+ {2:โ”‚} {2:โ”‚} |
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
{2:[No Name] [No Name] [No Name] }|
^ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{1:[No Name] }|
- |
+ :vsp |
]])
-- note that when moving to a window with small width nvim will increase
-- the width of the new active window at the expense of a inactive window
-- (upstream vim has the same behavior)
feed('<c-w>k<c-w>l')
screen:expect([[
- {2:|}^ {2:|} |
- ~ {2:|}~ {2:|}~ |
- ~ {2:|}~ {2:|}~ |
- ~ {2:|}~ {2:|}~ |
- ~ {2:|}~ {2:|}~ |
- ~ {2:|}~ {2:|}~ |
+ {2:โ”‚}^ {2:โ”‚} |
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
{2:[No Name] }{1:[No Name] }{2:[No Name] }|
|
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{2:[No Name] }|
- |
+ :vsp |
]])
feed('<c-w>l')
screen:expect([[
- {2:|} {2:|}^ |
- ~ {2:|}~ {2:|}~ |
- ~ {2:|}~ {2:|}~ |
- ~ {2:|}~ {2:|}~ |
- ~ {2:|}~ {2:|}~ |
- ~ {2:|}~ {2:|}~ |
+ {2:โ”‚} {2:โ”‚}^ |
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
{2:[No Name] [No Name] }{1:[No Name] }|
|
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{2:[No Name] }|
- |
+ :vsp |
]])
feed('<c-w>h<c-w>h')
screen:expect([[
- ^ {2:|} {2:|} |
- ~ {2:|}~ {2:|}~ |
- ~ {2:|}~ {2:|}~ |
- ~ {2:|}~ {2:|}~ |
- ~ {2:|}~ {2:|}~ |
- ~ {2:|}~ {2:|}~ |
+ ^ {2:โ”‚} {2:โ”‚} |
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
+ {0:~ }{2:โ”‚}{0:~ }{2:โ”‚}{0:~ }|
{1:[No Name] }{2:[No Name] [No Name] }|
|
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{2:[No Name] }|
- |
+ :vsp |
]])
end)
it('insert mode text', function()
feed('i')
+ screen:try_resize(53, 4)
screen:expect([[
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
{1:-- INSERT --} |
- ]], {[1] = {bold = true}})
+ ]], {[0] = {bold=true, foreground=Screen.colors.Blue},
+ [1] = {bold = true}})
end)
it('end of file markers', function()
+ screen:try_resize(53, 4)
screen:expect([[
^ |
{1:~ }|
{1:~ }|
- {1:~ }|
- {1:~ }|
- {1:~ }|
- {1:~ }|
- {1:~ }|
- {1:~ }|
- {1:~ }|
- {1:~ }|
- {1:~ }|
- {1:~ }|
|
- ]], {[1] = {bold = true, foreground = hlgroup_colors.NonText}})
+ ]], {[1] = {bold = true, foreground = Screen.colors.Blue}})
end)
it('"wait return" text', function()
+ screen:try_resize(53, 4)
feed(':ls<cr>')
screen:expect([[
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
:ls |
1 %a "[No Name]" line 1 |
{1:Press ENTER or type command to continue}^ |
- ]], {[1] = {bold = true, foreground = hlgroup_colors.Question}})
+ ]], {[0] = {bold=true, foreground=Screen.colors.Blue},
+ [1] = {bold = true, foreground = Screen.colors.SeaGreen}})
feed('<cr>') -- skip the "Press ENTER..." state or tests will hang
end)
+
it('can be cleared and linked to other highlight groups', function()
- execute('highlight clear ModeMsg')
+ screen:try_resize(53, 4)
+ feed_command('highlight clear ModeMsg')
feed('i')
screen:expect([[
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
-- INSERT -- |
- ]], {})
+ ]], {[0] = {bold=true, foreground=Screen.colors.Blue},
+ [1] = {bold=true}})
feed('<esc>')
- execute('highlight CustomHLGroup guifg=red guibg=green')
- execute('highlight link ModeMsg CustomHLGroup')
+ feed_command('highlight CustomHLGroup guifg=red guibg=green')
+ feed_command('highlight link ModeMsg CustomHLGroup')
feed('i')
screen:expect([[
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
{1:-- INSERT --} |
- ]], {[1] = {foreground = Screen.colors.Red, background = Screen.colors.Green}})
+ ]], {[0] = {bold=true, foreground=Screen.colors.Blue},
+ [1] = {foreground = Screen.colors.Red, background = Screen.colors.Green}})
end)
+
it('can be cleared by assigning NONE', function()
- execute('syn keyword TmpKeyword neovim')
- execute('hi link TmpKeyword ErrorMsg')
+ screen:try_resize(53, 4)
+ feed_command('syn keyword TmpKeyword neovim')
+ feed_command('hi link TmpKeyword ErrorMsg')
insert('neovim')
screen:expect([[
{1:neovi^m} |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
|
]], {
+ [0] = {bold=true, foreground=Screen.colors.Blue},
[1] = {foreground = Screen.colors.White, background = Screen.colors.Red}
})
- execute("hi ErrorMsg term=NONE cterm=NONE ctermfg=NONE ctermbg=NONE"
+ feed_command("hi ErrorMsg term=NONE cterm=NONE ctermfg=NONE ctermbg=NONE"
.. " gui=NONE guifg=NONE guibg=NONE guisp=NONE")
screen:expect([[
neovi^m |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]], {[0] = {bold=true, foreground=Screen.colors.Blue}})
+ end)
+
+ it('Cursor after `:hi clear|syntax reset` #6508', function()
+ command('highlight clear|syntax reset')
+ eq('guifg=bg guibg=fg', eval([[matchstr(execute('hi Cursor'), '\v(gui|cterm).*$')]]))
+ end)
+
+ it('Whitespace highlight', function()
+ screen:try_resize(53, 4)
+ feed_command('highlight NonText gui=NONE guifg=#FF0000')
+ feed_command('set listchars=space:.,tab:>-,trail:*,eol:ยฌ list')
+ insert(' ne \t o\tv im ')
+ screen:expect([[
+ ne{0:.>----.}o{0:>-----}v{0:..}im{0:*^*ยฌ} |
+ {0:~ }|
+ {0:~ }|
|
- ]], {})
+ ]], {
+ [0] = {foreground=Screen.colors.Red},
+ [1] = {foreground=Screen.colors.Blue},
+ })
+ feed_command('highlight Whitespace gui=NONE guifg=#0000FF')
+ screen:expect([[
+ ne{1:.>----.}o{1:>-----}v{1:..}im{1:*^*}{0:ยฌ} |
+ {0:~ }|
+ {0:~ }|
+ :highlight Whitespace gui=NONE guifg=#0000FF |
+ ]], {
+ [0] = {foreground=Screen.colors.Red},
+ [1] = {foreground=Screen.colors.Blue},
+ })
end)
end)
-describe('guisp (special/undercurl)', function()
+describe('highlight', function()
local screen
before_each(function()
clear()
screen = Screen.new(25,10)
screen:attach()
- screen:set_default_attr_ignore({
- [1] = {bold = true, foreground = Screen.colors.Blue},
- [2] = {bold = true}
+ end)
+
+ it('visual', function()
+ screen:detach()
+ screen = Screen.new(20,4)
+ screen:attach()
+ screen:set_default_attr_ids({
+ [1] = {background = Screen.colors.LightGrey},
+ [2] = {bold = true, foreground = Screen.colors.Blue1},
+ [3] = {bold = true},
})
+ insert([[
+ line1 foo bar
+ ]])
+
+ -- Non-blinking block cursor: does NOT highlight char-at-cursor.
+ command('set guicursor=a:block-blinkon0')
+ feed('gg$vhhh')
+ screen:expect([[
+ line1 foo^ {1:bar} |
+ |
+ {2:~ }|
+ {3:-- VISUAL --} |
+ ]])
+
+ -- Vertical cursor: highlights char-at-cursor. #8983
+ command('set guicursor=a:block-blinkon175')
+ feed('<esc>gg$vhhh')
+ screen:expect([[
+ line1 foo{1:^ bar} |
+ |
+ {2:~ }|
+ {3:-- VISUAL --} |
+ ]])
end)
- it('can be set and is applied like foreground or background', function()
- execute('syntax on')
- execute('syn keyword TmpKeyword neovim')
- execute('syn keyword TmpKeyword1 special')
- execute('syn keyword TmpKeyword2 specialwithbg')
- execute('syn keyword TmpKeyword3 specialwithfg')
- execute('hi! Awesome guifg=red guibg=yellow guisp=red')
- execute('hi! Awesome1 guisp=red')
- execute('hi! Awesome2 guibg=yellow guisp=red')
- execute('hi! Awesome3 guifg=red guisp=red')
- execute('hi link TmpKeyword Awesome')
- execute('hi link TmpKeyword1 Awesome1')
- execute('hi link TmpKeyword2 Awesome2')
- execute('hi link TmpKeyword3 Awesome3')
+ it('cterm=standout gui=standout', function()
+ screen:detach()
+ screen = Screen.new(20,5)
+ screen:attach()
+ screen:set_default_attr_ids({
+ [1] = {bold = true, foreground = Screen.colors.Blue1},
+ [2] = {standout = true, bold = true, underline = true,
+ background = Screen.colors.Gray90, foreground = Screen.colors.Blue1},
+ [3] = {standout = true, underline = true,
+ background = Screen.colors.Gray90}
+ })
+ feed_command('hi CursorLine cterm=standout,underline gui=standout,underline')
+ feed_command('set cursorline')
+ feed_command('set listchars=space:.,eol:ยฌ,tab:>-,extends:>,precedes:<,trail:* list')
+ feed('i\t abcd <cr>\t abcd <cr><esc>k')
+ screen:expect([[
+ {1:>-------.}abcd{1:*ยฌ} |
+ {2:^>-------.}{3:abcd}{2:*ยฌ}{3: }|
+ {1:ยฌ} |
+ {1:~ }|
+ |
+ ]])
+ end)
+
+ it('guisp (special/undercurl)', function()
+ feed_command('syntax on')
+ feed_command('syn keyword TmpKeyword neovim')
+ feed_command('syn keyword TmpKeyword1 special')
+ feed_command('syn keyword TmpKeyword2 specialwithbg')
+ feed_command('syn keyword TmpKeyword3 specialwithfg')
+ feed_command('hi! Awesome guifg=red guibg=yellow guisp=red')
+ feed_command('hi! Awesome1 guisp=red')
+ feed_command('hi! Awesome2 guibg=yellow guisp=red')
+ feed_command('hi! Awesome3 guifg=red guisp=red')
+ feed_command('hi link TmpKeyword Awesome')
+ feed_command('hi link TmpKeyword1 Awesome1')
+ feed_command('hi link TmpKeyword2 Awesome2')
+ feed_command('hi link TmpKeyword3 Awesome3')
insert([[
neovim
awesome neovim
@@ -389,29 +412,24 @@ describe('guisp (special/undercurl)', function()
{4:specialwithfg} |
|
{1:neovim} tabbed^ |
- ~ |
- -- INSERT -- |
+ {0:~ }|
+ {5:-- INSERT --} |
]],{
+ [0] = {bold=true, foreground=Screen.colors.Blue},
[1] = {background = Screen.colors.Yellow, foreground = Screen.colors.Red,
special = Screen.colors.Red},
[2] = {special = Screen.colors.Red},
[3] = {special = Screen.colors.Red, background = Screen.colors.Yellow},
[4] = {foreground = Screen.colors.Red, special = Screen.colors.Red},
+ [5] = {bold=true},
})
end)
end)
-describe("'cursorline' with 'listchars'", function()
+describe("'listchars' highlight", function()
local screen
- local hlgroup_colors = {
- NonText = Screen.colors.Blue,
- Cursorline = Screen.colors.Grey90,
- SpecialKey = Screen.colors.Red,
- Visual = Screen.colors.LightGrey,
- }
-
before_each(function()
clear()
screen = Screen.new(20,5)
@@ -423,48 +441,50 @@ describe("'cursorline' with 'listchars'", function()
end)
it("'cursorline' and 'cursorcolumn'", function()
- screen:set_default_attr_ids({[1] = {background=hlgroup_colors.Cursorline}})
- screen:set_default_attr_ignore( {{bold=true, foreground=hlgroup_colors.NonText}} )
- execute('highlight clear ModeMsg')
- execute('set cursorline')
+ screen:set_default_attr_ids({
+ [0] = {bold=true, foreground=Screen.colors.Blue},
+ [1] = {background=Screen.colors.Grey90}
+ })
+ feed_command('highlight clear ModeMsg')
+ feed_command('set cursorline')
feed('i')
screen:expect([[
{1:^ }|
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
-- INSERT -- |
]])
feed('abcdefg<cr>kkasdf')
screen:expect([[
abcdefg |
{1:kkasdf^ }|
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
-- INSERT -- |
]])
feed('<esc>')
screen:expect([[
abcdefg |
{1:kkasd^f }|
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
|
]])
- execute('set nocursorline')
+ feed_command('set nocursorline')
screen:expect([[
abcdefg |
kkasd^f |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
:set nocursorline |
]])
feed('k')
screen:expect([[
abcde^fg |
kkasdf |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
:set nocursorline |
]])
feed('jjji<cr><cr><cr><esc>')
@@ -475,8 +495,8 @@ describe("'cursorline' with 'listchars'", function()
^f |
|
]])
- execute('set cursorline')
- execute('set cursorcolumn')
+ feed_command('set cursorline')
+ feed_command('set cursorcolumn')
feed('kkiabcdefghijk<esc>hh')
screen:expect([[
kkasd {1: } |
@@ -497,29 +517,29 @@ describe("'cursorline' with 'listchars'", function()
it("'cursorline' and with 'listchar' option: space, eol, tab, and trail", function()
screen:set_default_attr_ids({
- [1] = {background=hlgroup_colors.Cursorline},
+ [1] = {background=Screen.colors.Grey90},
[2] = {
- foreground=hlgroup_colors.SpecialKey,
- background=hlgroup_colors.Cursorline,
+ foreground=Screen.colors.Red,
+ background=Screen.colors.Grey90,
},
[3] = {
- background=hlgroup_colors.Cursorline,
- foreground=hlgroup_colors.NonText,
+ background=Screen.colors.Grey90,
+ foreground=Screen.colors.Blue,
bold=true,
},
[4] = {
- foreground=hlgroup_colors.NonText,
+ foreground=Screen.colors.Blue,
bold=true,
},
[5] = {
- foreground=hlgroup_colors.SpecialKey,
+ foreground=Screen.colors.Red,
},
})
- execute('highlight clear ModeMsg')
- execute('highlight SpecialKey guifg=#FF0000')
- execute('set cursorline')
- execute('set tabstop=8')
- execute('set listchars=space:.,eol:ยฌ,tab:>-,extends:>,precedes:<,trail:* list')
+ feed_command('highlight clear ModeMsg')
+ feed_command('highlight Whitespace guifg=#FF0000')
+ feed_command('set cursorline')
+ feed_command('set tabstop=8')
+ feed_command('set listchars=space:.,eol:ยฌ,tab:>-,extends:>,precedes:<,trail:* list')
feed('i\t abcd <cr>\t abcd <cr><esc>k')
screen:expect([[
{5:>-------.}abcd{5:*}{4:ยฌ} |
@@ -536,7 +556,7 @@ describe("'cursorline' with 'listchars'", function()
{4:~ }|
|
]])
- execute('set nocursorline')
+ feed_command('set nocursorline')
screen:expect([[
{5:^>-------.}abcd{5:*}{4:ยฌ} |
{5:>-------.}abcd{5:*}{4:ยฌ} |
@@ -544,7 +564,7 @@ describe("'cursorline' with 'listchars'", function()
{4:~ }|
:set nocursorline |
]])
- execute('set nowrap')
+ feed_command('set nowrap')
feed('ALorem ipsum dolor sit amet<ESC>0')
screen:expect([[
{5:^>-------.}abcd{5:.}Lorem{4:>}|
@@ -553,9 +573,9 @@ describe("'cursorline' with 'listchars'", function()
{4:~ }|
|
]])
- execute('set cursorline')
+ feed_command('set cursorline')
screen:expect([[
- {2:^>-------.}{1:abcd}{2:.}{1:Lorem}{4:>}|
+ {2:^>-------.}{1:abcd}{2:.}{1:Lorem}{3:>}|
{5:>-------.}abcd{5:*}{4:ยฌ} |
{4:ยฌ} |
{4:~ }|
@@ -563,7 +583,7 @@ describe("'cursorline' with 'listchars'", function()
]])
feed('$')
screen:expect([[
- {4:<}{1:r}{2:.}{1:sit}{2:.}{1:ame^t}{3:ยฌ}{1: }|
+ {3:<}{1:r}{2:.}{1:sit}{2:.}{1:ame^t}{3:ยฌ}{1: }|
{4:<} |
{4:<} |
{4:~ }|
@@ -581,42 +601,42 @@ describe("'cursorline' with 'listchars'", function()
it("'listchar' in visual mode", function()
screen:set_default_attr_ids({
- [1] = {background=hlgroup_colors.Cursorline},
+ [1] = {background=Screen.colors.Grey90},
[2] = {
- foreground=hlgroup_colors.SpecialKey,
- background=hlgroup_colors.Cursorline,
+ foreground=Screen.colors.Red,
+ background=Screen.colors.Grey90,
},
[3] = {
- background=hlgroup_colors.Cursorline,
- foreground=hlgroup_colors.NonText,
+ background=Screen.colors.Grey90,
+ foreground=Screen.colors.Blue,
bold=true,
},
[4] = {
- foreground=hlgroup_colors.NonText,
+ foreground=Screen.colors.Blue,
bold=true,
},
[5] = {
- foreground=hlgroup_colors.SpecialKey,
+ foreground=Screen.colors.Red,
},
[6] = {
- background=hlgroup_colors.Visual,
+ background=Screen.colors.LightGrey,
},
[7] = {
- background=hlgroup_colors.Visual,
- foreground=hlgroup_colors.SpecialKey,
+ background=Screen.colors.LightGrey,
+ foreground=Screen.colors.Red,
},
[8] = {
- background=hlgroup_colors.Visual,
- foreground=hlgroup_colors.NonText,
+ background=Screen.colors.LightGrey,
+ foreground=Screen.colors.Blue,
bold=true,
},
})
- execute('highlight clear ModeMsg')
- execute('highlight SpecialKey guifg=#FF0000')
- execute('set cursorline')
- execute('set tabstop=8')
- execute('set nowrap')
- execute('set listchars=space:.,eol:ยฌ,tab:>-,extends:>,precedes:<,trail:* list')
+ feed_command('highlight clear ModeMsg')
+ feed_command('highlight Whitespace guifg=#FF0000')
+ feed_command('set cursorline')
+ feed_command('set tabstop=8')
+ feed_command('set nowrap')
+ feed_command('set listchars=space:.,eol:ยฌ,tab:>-,extends:>,precedes:<,trail:* list')
feed('i\t abcd <cr>\t abcd Lorem ipsum dolor sit amet<cr><esc>kkk0')
screen:expect([[
{2:^>-------.}{1:abcd}{2:*}{3:ยฌ}{1: }|
@@ -644,10 +664,697 @@ describe("'cursorline' with 'listchars'", function()
feed('<esc>$')
screen:expect([[
{4:<} |
- {4:<}{1:r}{2:.}{1:sit}{2:.}{1:ame^t}{3:ยฌ}{1: }|
+ {3:<}{1:r}{2:.}{1:sit}{2:.}{1:ame^t}{3:ยฌ}{1: }|
{4:<} |
{4:~ }|
|
]])
end)
+
+ it("'cursorline' with :match", function()
+ screen:set_default_attr_ids({
+ [0] = {bold=true, foreground=Screen.colors.Blue},
+ [1] = {background=Screen.colors.Grey90},
+ [2] = {foreground=Screen.colors.Red},
+ [3] = {foreground=Screen.colors.Green1},
+ })
+ feed_command('highlight clear ModeMsg')
+ feed_command('highlight Whitespace guifg=#FF0000')
+ feed_command('highlight Error guifg=#00FF00')
+ feed_command('set nowrap')
+ feed('ia \t bc \t <esc>')
+ screen:expect([[
+ a bc ^ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ feed_command('set listchars=space:.,eol:ยฌ,tab:>-,extends:>,precedes:<,trail:* list')
+ screen:expect([[
+ a{2:.>-----.}bc{2:*>---*^*}{0:ยฌ} |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ feed_command('match Error /\\s\\+$/')
+ screen:expect([[
+ a{2:.>-----.}bc{3:*>---*^*}{0:ยฌ} |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ end)
+end)
+
+describe('CursorLine highlight', function()
+ before_each(clear)
+
+ it('overridden by Error, ColorColumn if fg not set', function()
+ local screen = Screen.new(50,5)
+ screen:set_default_attr_ids({
+ [1] = {foreground = Screen.colors.SlateBlue},
+ [2] = {bold = true, foreground = Screen.colors.Brown},
+ [3] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
+ [4] = {foreground = Screen.colors.SlateBlue, background = Screen.colors.Gray90},
+ [5] = {background = Screen.colors.Gray90},
+ [6] = {bold = true, foreground = Screen.colors.Blue1},
+ [7] = {background = Screen.colors.LightRed},
+ })
+ screen:attach()
+
+ command('filetype on')
+ command('syntax on')
+ command('set cursorline ft=json')
+ feed('i{<cr>"a" : abc // 10;<cr>}<cr><esc>')
+ screen:expect([[
+ {1:{} |
+ "{2:a}" : {3:abc} {3:// 10;} |
+ {1:}} |
+ {5:^ }|
+ |
+ ]])
+
+ command('set colorcolumn=3')
+ feed('i <esc>')
+ screen:expect([[
+ {1:{} {7: } |
+ "{2:a}{7:"} : {3:abc} {3:// 10;} |
+ {1:}} {7: } |
+ {5: ^ }{7: }{5: }|
+ |
+ ]])
+ end)
+
+ it('with split-windows in diff-mode', function()
+ local screen = Screen.new(50,12)
+ screen:set_default_attr_ids({
+ [1] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.WebGray},
+ [2] = {bold = true, background = Screen.colors.Red},
+ [3] = {background = Screen.colors.LightMagenta},
+ [4] = {reverse = true},
+ [5] = {background = Screen.colors.LightBlue},
+ [6] = {background = Screen.colors.LightCyan1, bold = true, foreground = Screen.colors.Blue1},
+ [7] = {background = Screen.colors.Red, foreground = Screen.colors.White},
+ [8] = {bold = true, foreground = Screen.colors.Blue1},
+ [9] = {bold = true, reverse = true},
+ [10] = {bold = true},
+ })
+ screen:attach()
+
+ command('hi CursorLine ctermbg=red ctermfg=white guibg=red guifg=white')
+ command('set cursorline')
+ feed('iline 1 some text<cr>line 2 more text<cr>extra line!<cr>extra line!<cr>last line ...<cr>')
+ feed('<esc>gg')
+ command('vsplit')
+ command('enew')
+ feed('iline 1 some text<cr>line 2 moRe text!<cr>extra line!<cr>extra line!<cr>extra line!<cr>last line ...<cr>')
+ feed('<esc>gg')
+ command('windo diffthis')
+ screen:expect([[
+ {1: }{7:line 1 some text }{4:โ”‚}{1: }{7:^line 1 some text }|
+ {1: }{3:line 2 mo}{2:Re text!}{3: }{4:โ”‚}{1: }{3:line 2 mo}{2:re text}{3: }|
+ {1: }{5:extra line! }{4:โ”‚}{1: }{6:----------------------}|
+ {1: }extra line! {4:โ”‚}{1: }extra line! |
+ {1: }extra line! {4:โ”‚}{1: }extra line! |
+ {1: }last line ... {4:โ”‚}{1: }last line ... |
+ {1: } {4:โ”‚}{1: } |
+ {1: }{8:~ }{4:โ”‚}{1: }{8:~ }|
+ {1: }{8:~ }{4:โ”‚}{1: }{8:~ }|
+ {1: }{8:~ }{4:โ”‚}{1: }{8:~ }|
+ {4:[No Name] [+] }{9:[No Name] [+] }|
+ |
+ ]])
+ feed('jjjjj')
+ screen:expect([[
+ {1: }line 1 some text {4:โ”‚}{1: }line 1 some text |
+ {1: }{3:line 2 mo}{2:Re text!}{3: }{4:โ”‚}{1: }{3:line 2 mo}{2:re text}{3: }|
+ {1: }{5:extra line! }{4:โ”‚}{1: }{6:----------------------}|
+ {1: }extra line! {4:โ”‚}{1: }extra line! |
+ {1: }extra line! {4:โ”‚}{1: }extra line! |
+ {1: }last line ... {4:โ”‚}{1: }last line ... |
+ {1: }{7: }{4:โ”‚}{1: }{7:^ }|
+ {1: }{8:~ }{4:โ”‚}{1: }{8:~ }|
+ {1: }{8:~ }{4:โ”‚}{1: }{8:~ }|
+ {1: }{8:~ }{4:โ”‚}{1: }{8:~ }|
+ {4:[No Name] [+] }{9:[No Name] [+] }|
+ |
+ ]])
+
+ -- CursorLine with fg=NONE is "low-priority".
+ -- Rendered as underline in a diff-line. #9028
+ command('hi CursorLine ctermbg=red ctermfg=NONE guibg=red guifg=NONE')
+ feed('kkkk')
+ screen:expect([[
+ {1: }line 1 some text {4:โ”‚}{1: }line 1 some text |
+ {1: }{11:line 2 mo}{12:Re text!}{11: }{4:โ”‚}{1: }{11:^line 2 mo}{12:re text}{11: }|
+ {1: }{5:extra line! }{4:โ”‚}{1: }{6:----------------------}|
+ {1: }extra line! {4:โ”‚}{1: }extra line! |
+ {1: }extra line! {4:โ”‚}{1: }extra line! |
+ {1: }last line ... {4:โ”‚}{1: }last line ... |
+ {1: } {4:โ”‚}{1: } |
+ {1: }{8:~ }{4:โ”‚}{1: }{8:~ }|
+ {1: }{8:~ }{4:โ”‚}{1: }{8:~ }|
+ {1: }{8:~ }{4:โ”‚}{1: }{8:~ }|
+ {4:[No Name] [+] }{9:[No Name] [+] }|
+ |
+ ]], {
+ [1] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.WebGray},
+ [2] = {bold = true, background = Screen.colors.Red},
+ [3] = {background = Screen.colors.LightMagenta},
+ [4] = {reverse = true},
+ [5] = {background = Screen.colors.LightBlue},
+ [6] = {background = Screen.colors.LightCyan1, bold = true, foreground = Screen.colors.Blue1},
+ [7] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
+ [8] = {bold = true, foreground = Screen.colors.Blue1},
+ [9] = {bold = true, reverse = true},
+ [10] = {bold = true},
+ [11] = {underline = true,
+ background = Screen.colors.LightMagenta},
+ [12] = {bold = true, underline = true,
+ background = Screen.colors.Red},
+ })
+ end)
+end)
+
+
+describe("MsgSeparator highlight and msgsep fillchar", function()
+ before_each(clear)
+ it("works", function()
+ local screen = Screen.new(50,5)
+ screen:set_default_attr_ids({
+ [1] = {bold=true, foreground=Screen.colors.Blue},
+ [2] = {bold=true, reverse=true},
+ [3] = {bold = true, foreground = Screen.colors.SeaGreen4},
+ [4] = {background = Screen.colors.Cyan, bold = true, reverse = true},
+ [5] = {bold = true, background = Screen.colors.Magenta}
+ })
+ screen:attach()
+
+ -- defaults
+ feed_command("ls")
+ screen:expect([[
+ |
+ {2: }|
+ :ls |
+ 1 %a "[No Name]" line 1 |
+ {3:Press ENTER or type command to continue}^ |
+ ]])
+ feed('<cr>')
+
+ feed_command("set fillchars+=msgsep:-")
+ feed_command("ls")
+ screen:expect([[
+ |
+ {2:--------------------------------------------------}|
+ :ls |
+ 1 %a "[No Name]" line 1 |
+ {3:Press ENTER or type command to continue}^ |
+ ]])
+
+ -- linked to StatusLine per default
+ feed_command("hi StatusLine guibg=Cyan")
+ feed_command("ls")
+ screen:expect([[
+ |
+ {4:--------------------------------------------------}|
+ :ls |
+ 1 %a "[No Name]" line 1 |
+ {3:Press ENTER or type command to continue}^ |
+ ]])
+
+ -- but can be unlinked
+ feed_command("hi clear MsgSeparator")
+ feed_command("hi MsgSeparator guibg=Magenta gui=bold")
+ feed_command("ls")
+ screen:expect([[
+ |
+ {5:--------------------------------------------------}|
+ :ls |
+ 1 %a "[No Name]" line 1 |
+ {3:Press ENTER or type command to continue}^ |
+ ]])
+
+ -- when display doesn't contain msgsep, these options have no effect
+ feed_command("set display-=msgsep")
+ feed_command("ls")
+ screen:expect([[
+ {1:~ }|
+ {1:~ }|
+ :ls |
+ 1 %a "[No Name]" line 1 |
+ {3:Press ENTER or type command to continue}^ |
+ ]])
+ end)
+end)
+
+describe("'winhighlight' highlight", function()
+ local screen
+
+ before_each(function()
+ clear()
+ screen = Screen.new(20,8)
+ screen:attach()
+ screen:set_default_attr_ids({
+ [0] = {bold=true, foreground=Screen.colors.Blue},
+ [1] = {background = Screen.colors.DarkBlue},
+ [2] = {background = Screen.colors.DarkBlue, bold = true, foreground = Screen.colors.Blue1},
+ [3] = {bold = true, reverse = true},
+ [4] = {reverse = true},
+ [5] = {background = Screen.colors.DarkGreen},
+ [6] = {background = Screen.colors.DarkGreen, bold = true, foreground = Screen.colors.Blue1},
+ [7] = {background = Screen.colors.DarkMagenta},
+ [8] = {background = Screen.colors.DarkMagenta, bold = true, foreground = Screen.colors.Blue1},
+ [9] = {foreground = Screen.colors.Brown},
+ [10] = {foreground = Screen.colors.Brown, background = Screen.colors.DarkBlue},
+ [11] = {background = Screen.colors.DarkBlue, bold = true, reverse = true},
+ [12] = {background = Screen.colors.DarkGreen, reverse = true},
+ [13] = {background = Screen.colors.Magenta4, reverse = true},
+ [14] = {background = Screen.colors.DarkBlue, reverse = true},
+ [15] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
+ [16] = {foreground = Screen.colors.Blue1},
+ [17] = {background = Screen.colors.LightRed},
+ [18] = {background = Screen.colors.Gray90},
+ [19] = {foreground = Screen.colors.LightGrey, background = Screen.colors.DarkGray},
+ [20] = {background = Screen.colors.LightGrey, underline = true},
+ [21] = {bold = true},
+ [22] = {bold = true, foreground = Screen.colors.SeaGreen4},
+ [23] = {background = Screen.colors.LightMagenta},
+ [24] = {background = Screen.colors.WebGray},
+ [25] = {bold = true, foreground = Screen.colors.Green1},
+ [26] = {background = Screen.colors.Red},
+ [27] = {background = Screen.colors.DarkBlue, bold = true, foreground = Screen.colors.Green1},
+ })
+ command("hi Background1 guibg=DarkBlue")
+ command("hi Background2 guibg=DarkGreen")
+ end)
+
+ it('works for background color', function()
+ insert("aa")
+ command("split")
+ command("set winhl=Normal:Background1")
+ screen:expect([[
+ {1:a^a }|
+ {2:~ }|
+ {2:~ }|
+ {3:[No Name] [+] }|
+ aa |
+ {0:~ }|
+ {4:[No Name] [+] }|
+ |
+ ]])
+
+ command("enew")
+ screen:expect([[
+ {1:^ }|
+ {2:~ }|
+ {2:~ }|
+ {3:[No Name] }|
+ aa |
+ {0:~ }|
+ {4:[No Name] [+] }|
+ |
+ ]])
+ end)
+
+ it('handles invalid values', function()
+ command("set winhl=Normal:Background1")
+ screen:expect([[
+ {1:^ }|
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ |
+ ]])
+
+ eq('Vim(set):E474: Invalid argument: winhl=xxx:yyy',
+ exc_exec("set winhl=xxx:yyy"))
+ eq('Normal:Background1', eval('&winhl'))
+ screen:expect{grid=[[
+ {1:^ }|
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ |
+ ]], unchanged=true}
+ end)
+
+
+ it('works local to the buffer', function()
+ insert("aa")
+ command("split")
+ command("setlocal winhl=Normal:Background1")
+ screen:expect([[
+ {1:a^a }|
+ {2:~ }|
+ {2:~ }|
+ {3:[No Name] [+] }|
+ aa |
+ {0:~ }|
+ {4:[No Name] [+] }|
+ |
+ ]])
+
+ command("enew")
+ screen:expect([[
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ {3:[No Name] }|
+ aa |
+ {0:~ }|
+ {4:[No Name] [+] }|
+ |
+ ]])
+
+ command("bnext")
+ screen:expect([[
+ {1:^aa }|
+ {2:~ }|
+ {2:~ }|
+ {3:[No Name] [+] }|
+ aa |
+ {0:~ }|
+ {4:[No Name] [+] }|
+ |
+ ]])
+ end)
+
+ it('for inactive window background works', function()
+ command("set winhl=Normal:Background1,NormalNC:Background2")
+ -- tests global value is copied across split
+ command("split")
+ screen:expect([[
+ {1:^ }|
+ {2:~ }|
+ {2:~ }|
+ {3:[No Name] }|
+ {5: }|
+ {6:~ }|
+ {4:[No Name] }|
+ |
+ ]])
+
+ feed("<c-w><c-w>")
+ screen:expect([[
+ {5: }|
+ {6:~ }|
+ {6:~ }|
+ {4:[No Name] }|
+ {1:^ }|
+ {2:~ }|
+ {3:[No Name] }|
+ |
+ ]])
+
+ feed("<c-w><c-w>")
+ screen:expect([[
+ {1:^ }|
+ {2:~ }|
+ {2:~ }|
+ {3:[No Name] }|
+ {5: }|
+ {6:~ }|
+ {4:[No Name] }|
+ |
+ ]])
+ end)
+
+ it('works with NormalNC', function()
+ command("hi NormalNC guibg=DarkMagenta")
+ -- tests global value is copied across split
+ command("split")
+ screen:expect([[
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ {3:[No Name] }|
+ {7: }|
+ {8:~ }|
+ {4:[No Name] }|
+ |
+ ]])
+
+ command("wincmd w")
+ screen:expect([[
+ {7: }|
+ {8:~ }|
+ {8:~ }|
+ {4:[No Name] }|
+ ^ |
+ {0:~ }|
+ {3:[No Name] }|
+ |
+ ]])
+
+
+ -- winbg=Normal:... overrides global NormalNC
+ command("set winhl=Normal:Background1")
+ screen:expect([[
+ {7: }|
+ {8:~ }|
+ {8:~ }|
+ {4:[No Name] }|
+ {1:^ }|
+ {2:~ }|
+ {3:[No Name] }|
+ |
+ ]])
+
+ command("wincmd w")
+ screen:expect([[
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ {3:[No Name] }|
+ {1: }|
+ {2:~ }|
+ {4:[No Name] }|
+ |
+ ]])
+
+ command("wincmd w")
+ command("set winhl=Normal:Background1,NormalNC:Background2")
+ screen:expect([[
+ {7: }|
+ {8:~ }|
+ {8:~ }|
+ {4:[No Name] }|
+ {1:^ }|
+ {2:~ }|
+ {3:[No Name] }|
+ |
+ ]])
+
+ command("wincmd w")
+ screen:expect([[
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ {3:[No Name] }|
+ {5: }|
+ {6:~ }|
+ {4:[No Name] }|
+ |
+ ]])
+ end)
+
+ it('background applies also to non-text', function()
+ command('set sidescroll=0')
+ insert('Lorem ipsum dolor sit amet ')
+ command('set shiftwidth=2')
+ feed('>>')
+ command('set number')
+ command('set breakindent')
+ command('set briopt=shift:5,min:0')
+ command('set list')
+ command('set showbreak=โ†ช')
+ screen:expect([[
+ {9: 1 } ^Lorem ipsum do|
+ {9: } {0:โ†ช}lor sit |
+ {9: } {0:โ†ช}amet{0:-} |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ command('set winhl=Normal:Background1')
+ screen:expect([[
+ {10: 1 }{1: ^Lorem ipsum do}|
+ {10: }{1: }{2:โ†ช}{1:lor sit }|
+ {10: }{1: }{2:โ†ช}{1:amet}{2:-}{1: }|
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ |
+ ]])
+
+ command('set nowrap')
+ command('set listchars+=extends:โฏ,precedes:โฎ')
+ feed('3w')
+ screen:expect([[
+ {10: 1 }{2:โฎ}{1: dolor ^sit ame}{2:โฏ}|
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ |
+ ]])
+ end)
+
+ it("background doesn't override syntax background", function()
+ command('syntax on')
+ command('syntax keyword Foobar foobar')
+ command('syntax keyword Article the')
+ command('hi Foobar guibg=#FF0000')
+ command('hi Article guifg=#00FF00 gui=bold')
+ insert('the foobar was foobar')
+ screen:expect([[
+ {25:the} {26:foobar} was {26:fooba}|
+ {26:^r} |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ -- winhl=Normal:Group with background doesn't override syntax background,
+ -- but does combine with syntax foreground.
+ command('set winhl=Normal:Background1')
+ screen:expect([[
+ {27:the}{1: }{26:foobar}{1: was }{26:fooba}|
+ {26:^r}{1: }|
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ |
+ ]])
+ end)
+
+ it('can override NonText, Conceal and EndOfBuffer', function()
+ curbufmeths.set_lines(0,-1,true, {"raa\000"})
+ command('call matchaddpos("Conceal", [[1,2]], 0, -1, {"conceal": "#"})')
+ command('set cole=2 cocu=nvic')
+ command('split')
+ command('call matchaddpos("Conceal", [[1,2]], 0, -1, {"conceal": "#"})')
+ command('set winhl=SpecialKey:ErrorMsg,EndOfBuffer:Background1,'
+ ..'Conceal:Background2')
+
+ screen:expect([[
+ ^r{5:#}a{15:^@} |
+ {1:~ }|
+ {1:~ }|
+ {3:[No Name] [+] }|
+ r{19:#}a{16:^@} |
+ {0:~ }|
+ {4:[No Name] [+] }|
+ |
+ ]])
+ end)
+
+ it('can override LineNr, CursorColumn and ColorColumn', function()
+ insert('very text\nmore text')
+ command('set number')
+ command('set colorcolumn=2')
+ command('set cursorcolumn')
+
+ command('split')
+ command('set winhl=LineNr:Background1,CursorColumn:Background2,'
+ ..'ColorColumn:ErrorMsg')
+ screen:expect([[
+ {1: 1 }v{15:e}ry tex{5:t} |
+ {1: 2 }m{15:o}re tex^t |
+ {0:~ }|
+ {3:[No Name] [+] }|
+ {9: 1 }v{17:e}ry tex{18:t} |
+ {9: 2 }m{17:o}re text |
+ {4:[No Name] [+] }|
+ |
+ ]])
+ end)
+
+ it('can override Tabline', function()
+ command('tabnew')
+ command('set winhl=TabLine:Background1,TabLineSel:ErrorMsg')
+
+ screen:expect([[
+ {20: No Name] }{15: No Name]}{20:X}|
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ command("tabnext")
+ screen:expect([[
+ {21: No Name] }{1: No Name]}{20:X}|
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ end)
+
+ it('can override popupmenu', function()
+ insert('word wording wordy')
+ command('split')
+ command('set winhl=Pmenu:Background1,PmenuSel:Background2,'
+ ..'PmenuSbar:ErrorMsg,PmenuThumb:Normal')
+ screen:expect([[
+ word wording word^y |
+ {0:~ }|
+ {0:~ }|
+ {3:[No Name] [+] }|
+ word wording wordy |
+ {0:~ }|
+ {4:[No Name] [+] }|
+ |
+ ]])
+
+ feed('oword<c-x><c-p>')
+ screen:expect([[
+ word wording wordy |
+ wordy^ |
+ {1:word }{0: }|
+ {1:wording }{3: }|
+ {5:wordy }rdy |
+ wordy |
+ {4:[No Name] [+] }|
+ {21:-- }{22:match 1 of 3} |
+ ]])
+
+ feed('<esc>u<c-w><c-w>oword<c-x><c-p>')
+ screen:expect([[
+ word wording wordy |
+ wordy |
+ {23:word }{0: }|
+ {23:wording }{4: }|
+ {24:wordy }rdy |
+ wordy^ |
+ {3:[No Name] [+] }|
+ {21:-- }{22:match 1 of 3} |
+ ]])
+ end)
end)
diff --git a/test/functional/ui/hlstate_spec.lua b/test/functional/ui/hlstate_spec.lua
new file mode 100644
index 0000000000..775b701438
--- /dev/null
+++ b/test/functional/ui/hlstate_spec.lua
@@ -0,0 +1,287 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+
+local clear, insert = helpers.clear, helpers.insert
+local command = helpers.command
+local meths = helpers.meths
+local iswin = helpers.iswin
+local nvim_dir = helpers.nvim_dir
+local thelpers = require('test.functional.terminal.helpers')
+
+describe('ext_hlstate detailed highlights', function()
+ local screen
+
+ before_each(function()
+ clear()
+ command('syntax on')
+ screen = Screen.new(40, 8)
+ screen:attach({ext_hlstate=true})
+ end)
+
+ after_each(function()
+ screen:detach()
+ end)
+
+
+ it('work with combined UI and syntax highlights', function()
+ insert([[
+ these are some lines
+ with colorful text]])
+ meths.buf_add_highlight(0, -1, "String", 0 , 10, 14)
+ meths.buf_add_highlight(0, -1, "Statement", 1 , 5, -1)
+ command("/th co")
+
+ screen:expect([[
+ these are {1:some} lines |
+ ^wi{2:th }{4:co}{3:lorful text} |
+ {5:~ }|
+ {5:~ }|
+ {5:~ }|
+ {5:~ }|
+ {5:~ }|
+ {6:search hit BOTTOM, continuing at TOP} |
+ ]], {
+ [1] = {{foreground = Screen.colors.Magenta},
+ {{hi_name = "Constant", kind = "syntax"}}},
+ [2] = {{background = Screen.colors.Yellow},
+ {{hi_name = "Search", ui_name = "Search", kind = "ui"}}},
+ [3] = {{bold = true, foreground = Screen.colors.Brown},
+ {{hi_name = "Statement", kind = "syntax"}}},
+ [4] = {{bold = true, background = Screen.colors.Yellow, foreground = Screen.colors.Brown}, {3, 2}},
+ [5] = {{bold = true, foreground = Screen.colors.Blue1},
+ {{hi_name = "NonText", ui_name = "EndOfBuffer", kind = "ui"}}},
+ [6] = {{foreground = Screen.colors.Red},
+ {{hi_name = "WarningMsg", ui_name = "WarningMsg", kind = "ui"}}},
+ })
+ end)
+
+ it('work with cleared UI highlights', function()
+ screen:set_default_attr_ids({
+ [1] = {{}, {{hi_name = "VertSplit", ui_name = "VertSplit", kind = "ui"}}},
+ [2] = {{bold = true, foreground = Screen.colors.Blue1},
+ {{hi_name = "NonText", ui_name = "EndOfBuffer", kind = "ui"}}},
+ [3] = {{bold = true, reverse = true},
+ {{hi_name = "StatusLine", ui_name = "StatusLine", kind = "ui"}}} ,
+ [4] = {{reverse = true},
+ {{hi_name = "StatusLineNC", ui_name = "StatusLineNC" , kind = "ui"}}},
+ [5] = {{}, {{hi_name = "StatusLine", ui_name = "StatusLine", kind = "ui"}}},
+ [6] = {{}, {{hi_name = "StatusLineNC", ui_name = "StatusLineNC", kind = "ui"}}},
+ })
+ command("hi clear VertSplit")
+ command("vsplit")
+
+ screen:expect([[
+ ^ {1:โ”‚} |
+ {2:~ }{1:โ”‚}{2:~ }|
+ {2:~ }{1:โ”‚}{2:~ }|
+ {2:~ }{1:โ”‚}{2:~ }|
+ {2:~ }{1:โ”‚}{2:~ }|
+ {2:~ }{1:โ”‚}{2:~ }|
+ {3:[No Name] }{4:[No Name] }|
+ |
+ ]])
+
+ command("hi clear StatusLine | hi clear StatuslineNC")
+ screen:expect([[
+ ^ {1:โ”‚} |
+ {2:~ }{1:โ”‚}{2:~ }|
+ {2:~ }{1:โ”‚}{2:~ }|
+ {2:~ }{1:โ”‚}{2:~ }|
+ {2:~ }{1:โ”‚}{2:~ }|
+ {2:~ }{1:โ”‚}{2:~ }|
+ {5:[No Name] }{6:[No Name] }|
+ |
+ ]])
+
+ -- redrawing is done even if visible highlights didn't change
+ command("wincmd w")
+ screen:expect([[
+ {1:โ”‚}^ |
+ {2:~ }{1:โ”‚}{2:~ }|
+ {2:~ }{1:โ”‚}{2:~ }|
+ {2:~ }{1:โ”‚}{2:~ }|
+ {2:~ }{1:โ”‚}{2:~ }|
+ {2:~ }{1:โ”‚}{2:~ }|
+ {6:[No Name] }{5:[No Name] }|
+ |
+ ]])
+
+ end)
+
+ it("work with window-local highlights", function()
+ screen:set_default_attr_ids({
+ [1] = {{foreground = Screen.colors.Brown}, {{hi_name = "LineNr", ui_name = "LineNr", kind = "ui"}}},
+ [2] = {{bold = true, foreground = Screen.colors.Blue1}, {{hi_name = "NonText", ui_name = "EndOfBuffer", kind = "ui"}}},
+ [3] = {{bold = true, reverse = true}, {{hi_name = "StatusLine", ui_name = "StatusLine", kind = "ui"}}},
+ [4] = {{reverse = true}, {{hi_name = "StatusLineNC", ui_name = "StatusLineNC", kind = "ui"}}},
+ [5] = {{background = Screen.colors.Red, foreground = Screen.colors.Grey100}, {{hi_name = "ErrorMsg", ui_name = "LineNr", kind = "ui"}}},
+ [6] = {{bold = true, reverse = true}, {{hi_name = "MsgSeparator", ui_name = "Normal", kind = "ui"}}},
+ [7] = {{foreground = Screen.colors.Brown, bold = true, reverse = true}, {6, 1}},
+ [8] = {{foreground = Screen.colors.Blue1, bold = true, reverse = true}, {6, 2}},
+ [9] = {{bold = true, foreground = Screen.colors.Brown}, {{hi_name = "Statement", ui_name = "NormalNC", kind = "ui"}}},
+ [10] = {{bold = true, foreground = Screen.colors.Brown}, {9, 1}},
+ [11] = {{bold = true, foreground = Screen.colors.Blue1}, {9, 2}}
+ })
+
+ command("set number")
+ command("split")
+ -- NormalNC is not applied if not set, to avoid spurious redraws
+ screen:expect([[
+ {1: 1 }^ |
+ {2:~ }|
+ {2:~ }|
+ {3:[No Name] }|
+ {1: 1 } |
+ {2:~ }|
+ {4:[No Name] }|
+ |
+ ]])
+
+ command("set winhl=LineNr:ErrorMsg")
+ screen:expect([[
+ {5: 1 }^ |
+ {2:~ }|
+ {2:~ }|
+ {3:[No Name] }|
+ {1: 1 } |
+ {2:~ }|
+ {4:[No Name] }|
+ |
+ ]])
+
+ command("set winhl=Normal:MsgSeparator,NormalNC:Statement")
+ screen:expect([[
+ {7: 1 }{6:^ }|
+ {8:~ }|
+ {8:~ }|
+ {3:[No Name] }|
+ {1: 1 } |
+ {2:~ }|
+ {4:[No Name] }|
+ |
+ ]])
+
+ command("wincmd w")
+ screen:expect([[
+ {10: 1 }{9: }|
+ {11:~ }|
+ {11:~ }|
+ {4:[No Name] }|
+ {1: 1 }^ |
+ {2:~ }|
+ {3:[No Name] }|
+ |
+ ]])
+ end)
+
+ it("work with :terminal", function()
+ screen:set_default_attr_ids({
+ [1] = {{}, {{hi_name = "TermCursorNC", ui_name = "TermCursorNC", kind = "ui"}}},
+ [2] = {{foreground = 52479}, {{kind = "term"}}},
+ [3] = {{bold = true, foreground = 52479}, {{kind = "term"}}},
+ [4] = {{foreground = 52479}, {2, 1}},
+ [5] = {{foreground = 4259839}, {{kind = "term"}}},
+ [6] = {{foreground = 4259839}, {5, 1}},
+ })
+ command('enew | call termopen(["'..nvim_dir..'/tty-test"])')
+ screen:expect([[
+ ^tty ready |
+ {1: } |
+ |
+ |
+ |
+ |
+ |
+ |
+ ]])
+
+ thelpers.feed_data('x ')
+ thelpers.set_fg(45)
+ thelpers.feed_data('y ')
+ thelpers.set_bold()
+ thelpers.feed_data('z\n')
+ -- TODO(bfredl): check if this distinction makes sense
+ if iswin() then
+ screen:expect([[
+ ^tty ready |
+ x {5:y z} |
+ {1: } |
+ |
+ |
+ |
+ |
+ |
+ ]])
+ else
+ screen:expect([[
+ ^tty ready |
+ x {2:y }{3:z} |
+ {1: } |
+ |
+ |
+ |
+ |
+ |
+ ]])
+ end
+
+ thelpers.feed_termcode("[A")
+ thelpers.feed_termcode("[2C")
+ if iswin() then
+ screen:expect([[
+ ^tty ready |
+ x {6:y}{5: z} |
+ |
+ |
+ |
+ |
+ |
+ |
+ ]])
+ else
+ screen:expect([[
+ ^tty ready |
+ x {4:y}{2: }{3:z} |
+ |
+ |
+ |
+ |
+ |
+ |
+ ]])
+ end
+ end)
+
+ it("can use independent cterm and rgb colors", function()
+ -- tell test module to save all attributes (doesn't change nvim options)
+ screen:set_hlstate_cterm(true)
+
+ screen:set_default_attr_ids({
+ [1] = {{bold = true, foreground = Screen.colors.Blue1}, {foreground = 12}, {{hi_name = "NonText", ui_name = "EndOfBuffer", kind = "ui"}}},
+ [2] = {{reverse = true, foreground = Screen.colors.Red}, {foreground = 10, italic=true}, {{hi_name = "NonText", ui_name = "EndOfBuffer", kind = "ui"}}},
+ })
+ screen:expect([[
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+
+ command("hi NonText guifg=Red gui=reverse ctermfg=Green cterm=italic")
+ screen:expect([[
+ ^ |
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ |
+ ]])
+
+ end)
+end)
diff --git a/test/functional/ui/inccommand_spec.lua b/test/functional/ui/inccommand_spec.lua
new file mode 100644
index 0000000000..3228d6b7fc
--- /dev/null
+++ b/test/functional/ui/inccommand_spec.lua
@@ -0,0 +1,2574 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+local clear = helpers.clear
+local command = helpers.command
+local curbufmeths = helpers.curbufmeths
+local eq = helpers.eq
+local eval = helpers.eval
+local feed_command = helpers.feed_command
+local expect = helpers.expect
+local feed = helpers.feed
+local insert = helpers.insert
+local meths = helpers.meths
+local neq = helpers.neq
+local ok = helpers.ok
+local retry = helpers.retry
+local source = helpers.source
+local wait = helpers.wait
+local nvim = helpers.nvim
+local iswin = helpers.iswin
+local sleep = helpers.sleep
+
+local default_text = [[
+ Inc substitution on
+ two lines
+]]
+
+local multiline_text = [[
+ 1 2 3
+ A B C
+ 4 5 6
+ X Y Z
+ 7 8 9
+]]
+
+local multimatch_text = [[
+ a bdc eae a fgl lzia r
+ x
+]]
+
+local multibyte_text = [[
+ ยฃ ยฅ ัซัซ PEPPERS
+ยฃ ยฅ ัซfัซ
+ aยฃ ัซยฅKOL
+ยฃ ยฅ libm
+ยฃ ยฅ
+]]
+
+local long_multiline_text = [[
+ 1 2 3
+ A B C
+ 4 5 6
+ X Y Z
+ 7 8 9
+ K L M
+ a b c
+ d e f
+ q r s
+ x y z
+ ยฃ m n
+ t ล“ ยฅ
+]]
+
+local function common_setup(screen, inccommand, text)
+ if screen then
+ command("syntax on")
+ command("set nohlsearch")
+ command("hi Substitute guifg=red guibg=yellow")
+ command("set display-=msgsep")
+ screen:attach()
+ screen:set_default_attr_ids({
+ [1] = {foreground = Screen.colors.Fuchsia},
+ [2] = {foreground = Screen.colors.Brown, bold = true},
+ [3] = {foreground = Screen.colors.SlateBlue},
+ [4] = {bold = true, foreground = Screen.colors.SlateBlue},
+ [5] = {foreground = Screen.colors.DarkCyan},
+ [6] = {bold = true},
+ [7] = {underline = true, bold = true, foreground = Screen.colors.SlateBlue},
+ [8] = {foreground = Screen.colors.Slateblue, underline = true},
+ [9] = {background = Screen.colors.Yellow},
+ [10] = {reverse = true},
+ [11] = {reverse = true, bold=true},
+ [12] = {foreground = Screen.colors.Red, background = Screen.colors.Yellow},
+ [13] = {bold = true, foreground = Screen.colors.SeaGreen},
+ [14] = {foreground = Screen.colors.White, background = Screen.colors.Red},
+ [15] = {bold=true, foreground=Screen.colors.Blue},
+ [16] = {background=Screen.colors.Grey90}, -- cursorline
+ vis = {background=Screen.colors.LightGrey}
+ })
+ end
+
+ command("set inccommand=" .. (inccommand and inccommand or ""))
+
+ if text then
+ insert(text)
+ end
+end
+
+describe(":substitute, inccommand=split", function()
+ before_each(function()
+ clear()
+ common_setup(nil, "split", default_text)
+ end)
+
+ -- Test the tests: verify that the `1==bufnr('$')` assertion
+ -- in the "no preview" tests (below) actually means something.
+ it("previews interactive cmdline", function()
+ feed(':%s/tw/MO/g')
+ retry(nil, 1000, function()
+ eq(2, eval("bufnr('$')"))
+ end)
+ end)
+
+ it("no preview if invoked by a script", function()
+ source('%s/tw/MO/g')
+ wait()
+ eq(1, eval("bufnr('$')"))
+ -- sanity check: assert the buffer state
+ expect(default_text:gsub("tw", "MO"))
+ end)
+
+ it("no preview if invoked by feedkeys()", function()
+ -- in a script...
+ source([[:call feedkeys(":%s/tw/MO/g\<CR>")]])
+ wait()
+ -- or interactively...
+ feed([[:call feedkeys(":%s/tw/MO/g\<CR>")<CR>]])
+ wait()
+ eq(1, eval("bufnr('$')"))
+ -- sanity check: assert the buffer state
+ expect(default_text:gsub("tw", "MO"))
+ end)
+end)
+
+describe(":substitute, 'inccommand' preserves", function()
+ before_each(clear)
+
+ it('listed buffers (:ls)', function()
+ local screen = Screen.new(30,10)
+ common_setup(screen, "split", "ABC")
+
+ feed_command("%s/AB/BA/")
+ feed_command("ls")
+
+ screen:expect([[
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :ls |
+ 1 %a + "[No Name]" |
+ line 1 |
+ {13:Press ENTER or type command to}|
+ {13: continue}^ |
+ ]])
+ end)
+
+ for _, case in pairs{"", "split", "nosplit"} do
+ it("various delimiters (inccommand="..case..")", function()
+ insert(default_text)
+ feed_command("set inccommand=" .. case)
+
+ local delims = { '/', '#', ';', '%', ',', '@', '!', ''}
+ for _,delim in pairs(delims) do
+ feed_command("%s"..delim.."lines"..delim.."LINES"..delim.."g")
+ expect([[
+ Inc substitution on
+ two LINES
+ ]])
+ feed_command("undo")
+ end
+ end)
+ end
+
+ for _, case in pairs{"", "split", "nosplit"} do
+ it("'undolevels' (inccommand="..case..")", function()
+ feed_command("set undolevels=139")
+ feed_command("setlocal undolevels=34")
+ feed_command("set inccommand=" .. case)
+ insert("as")
+ feed(":%s/as/glork/<enter>")
+ eq(meths.get_option('undolevels'), 139)
+ eq(curbufmeths.get_option('undolevels'), 34)
+ end)
+ end
+
+ for _, case in ipairs({"", "split", "nosplit"}) do
+ it("empty undotree() (inccommand="..case..")", function()
+ feed_command("set undolevels=1000")
+ feed_command("set inccommand=" .. case)
+ local expected_undotree = eval("undotree()")
+
+ -- Start typing an incomplete :substitute command.
+ feed([[:%s/e/YYYY/g]])
+ wait()
+ -- Cancel the :substitute.
+ feed([[<C-\><C-N>]])
+
+ -- The undo tree should be unchanged.
+ eq(expected_undotree, eval("undotree()"))
+ eq({}, eval("undotree()")["entries"])
+ end)
+ end
+
+ for _, case in ipairs({"", "split", "nosplit"}) do
+ it("undotree() with branches (inccommand="..case..")", function()
+ feed_command("set undolevels=1000")
+ feed_command("set inccommand=" .. case)
+ -- Make some changes.
+ feed([[isome text 1<C-\><C-N>]])
+ feed([[osome text 2<C-\><C-N>]])
+ -- Add an undo branch.
+ feed([[u]])
+ -- More changes, more undo branches.
+ feed([[osome text 3<C-\><C-N>]])
+ feed([[AX<C-\><C-N>]])
+ feed([[...]])
+ feed([[uu]])
+ feed([[osome text 4<C-\><C-N>]])
+ feed([[u<C-R>u]])
+ feed([[osome text 5<C-\><C-N>]])
+ expect([[
+ some text 1
+ some text 3XX
+ some text 5]])
+ local expected_undotree = eval("undotree()")
+ eq(5, #expected_undotree["entries"]) -- sanity
+
+ -- Start typing an incomplete :substitute command.
+ feed([[:%s/e/YYYY/g]])
+ wait()
+ -- Cancel the :substitute.
+ feed([[<C-\><C-N>]])
+
+ -- The undo tree should be unchanged.
+ eq(expected_undotree, eval("undotree()"))
+ end)
+ end
+
+ for _, case in pairs{"", "split", "nosplit"} do
+ it("b:changedtick (inccommand="..case..")", function()
+ feed_command("set inccommand=" .. case)
+ feed([[isome text 1<C-\><C-N>]])
+ feed([[osome text 2<C-\><C-N>]])
+ local expected_tick = eval("b:changedtick")
+ ok(expected_tick > 0)
+
+ expect([[
+ some text 1
+ some text 2]])
+ feed(":%s/e/XXX/")
+ wait()
+
+ eq(expected_tick, eval("b:changedtick"))
+ end)
+ end
+
+ for _, case in pairs{"", "split", "nosplit"} do
+ it("visual selection for non-previewable command (inccommand="..case..") #5888", function()
+ local screen = Screen.new(30,10)
+ common_setup(screen, case, default_text)
+ feed('1G2V')
+
+ feed(':s')
+ screen:expect([[
+ {vis:Inc substitution on} |
+ t{vis:wo lines} |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :'<,'>s^ |
+ ]])
+
+ feed('o')
+ screen:expect([[
+ {vis:Inc substitution on} |
+ t{vis:wo lines} |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :'<,'>so^ |
+ ]])
+ end)
+ end
+
+end)
+
+describe(":substitute, 'inccommand' preserves undo", function()
+ local cases = { "", "split", "nosplit" }
+
+ local substrings = {
+ ":%s/1",
+ ":%s/1/",
+ ":%s/1/<bs>",
+ ":%s/1/a",
+ ":%s/1/a<bs>",
+ ":%s/1/ax",
+ ":%s/1/ax<bs>",
+ ":%s/1/ax<bs><bs>",
+ ":%s/1/ax<bs><bs><bs>",
+ ":%s/1/ax/",
+ ":%s/1/ax/<bs>",
+ ":%s/1/ax/<bs>/",
+ ":%s/1/ax/g",
+ ":%s/1/ax/g<bs>",
+ ":%s/1/ax/g<bs><bs>"
+ }
+
+ local function test_sub(substring, split, redoable)
+ clear()
+ feed_command("set inccommand=" .. split)
+
+ insert("1")
+ feed("o2<esc>")
+ feed_command("undo")
+ feed("o3<esc>")
+ if redoable then
+ feed("o4<esc>")
+ feed_command("undo")
+ end
+ feed(substring.. "<enter>")
+ feed_command("undo")
+
+ feed("g-")
+ expect([[
+ 1
+ 2]])
+
+ feed("g+")
+ expect([[
+ 1
+ 3]])
+ end
+
+ local function test_notsub(substring, split, redoable)
+ clear()
+ feed_command("set inccommand=" .. split)
+
+ insert("1")
+ feed("o2<esc>")
+ feed_command("undo")
+ feed("o3<esc>")
+ if redoable then
+ feed("o4<esc>")
+ feed_command("undo")
+ end
+ feed(substring .. "<esc>")
+
+ feed("g-")
+ expect([[
+ 1
+ 2]])
+
+ feed("g+")
+ expect([[
+ 1
+ 3]])
+
+ if redoable then
+ feed("<c-r>")
+ expect([[
+ 1
+ 3
+ 4]])
+ end
+ end
+
+
+ local function test_threetree(substring, split)
+ clear()
+ feed_command("set inccommand=" .. split)
+
+ insert("1")
+ feed("o2<esc>")
+ feed("o3<esc>")
+ feed("uu")
+ feed("oa<esc>")
+ feed("ob<esc>")
+ feed("uu")
+ feed("oA<esc>")
+ feed("oB<esc>")
+
+ -- This is the undo tree (x-Axis is timeline), we're at B now
+ -- ----------------A - B
+ -- /
+ -- | --------a - b
+ -- |/
+ -- 1 - 2 - 3
+
+ feed("2u")
+ feed(substring .. "<esc>")
+ expect([[
+ 1]])
+ feed("g-")
+ expect([[
+ ]])
+ feed("g+")
+ expect([[
+ 1]])
+ feed("<c-r>")
+ expect([[
+ 1
+ A]])
+
+ feed("g-") -- go to b
+ feed("2u")
+ feed(substring .. "<esc>")
+ feed("<c-r>")
+ expect([[
+ 1
+ a]])
+
+ feed("g-") -- go to 3
+ feed("2u")
+ feed(substring .. "<esc>")
+ feed("<c-r>")
+ expect([[
+ 1
+ 2]])
+ end
+
+ it("at a non-leaf of the undo tree", function()
+ for _, case in pairs(cases) do
+ for _, str in pairs(substrings) do
+ for _, redoable in pairs({true}) do
+ test_sub(str, case, redoable)
+ end
+ end
+ end
+ end)
+
+ it("at a leaf of the undo tree", function()
+ for _, case in pairs(cases) do
+ for _, str in pairs(substrings) do
+ for _, redoable in pairs({false}) do
+ test_sub(str, case, redoable)
+ end
+ end
+ end
+ end)
+
+ it("when interrupting substitution", function()
+ for _, case in pairs(cases) do
+ for _, str in pairs(substrings) do
+ for _, redoable in pairs({true,false}) do
+ test_notsub(str, case, redoable)
+ end
+ end
+ end
+ end)
+
+ it("in a complex undo scenario", function()
+ for _, case in pairs(cases) do
+ for _, str in pairs(substrings) do
+ test_threetree(str, case)
+ end
+ end
+ end)
+
+ it('with undolevels=0', function()
+ for _, case in pairs(cases) do
+ clear()
+ common_setup(nil, case, default_text)
+ feed_command("set undolevels=0")
+
+ feed("1G0")
+ insert("X")
+ feed(":%s/tw/MO/<esc>")
+ feed_command("undo")
+ expect(default_text)
+ feed_command("undo")
+ expect(default_text:gsub("Inc", "XInc"))
+ feed_command("undo")
+
+ feed_command("%s/tw/MO/g")
+ expect(default_text:gsub("tw", "MO"))
+ feed_command("undo")
+ expect(default_text)
+ feed_command("undo")
+ expect(default_text:gsub("tw", "MO"))
+ end
+ end)
+
+ it('with undolevels=1', function()
+ local screen = Screen.new(20,10)
+
+ for _, case in pairs(cases) do
+ clear()
+ common_setup(screen, case, default_text)
+ screen:expect([[
+ Inc substitution on |
+ two lines |
+ ^ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ |
+ ]])
+ feed_command("set undolevels=1")
+
+ feed("1G0")
+ insert("X")
+ feed("IY<esc>")
+ feed(":%s/tw/MO/<esc>")
+ -- feed_command("undo") here would cause "Press ENTER".
+ feed("u")
+ expect(default_text:gsub("Inc", "XInc"))
+ feed("u")
+ expect(default_text)
+
+ feed(":%s/tw/MO/g<enter>")
+ feed(":%s/MO/GO/g<enter>")
+ feed(":%s/GO/NO/g<enter>")
+ feed("u")
+ expect(default_text:gsub("tw", "GO"))
+ feed("u")
+ expect(default_text:gsub("tw", "MO"))
+ feed("u")
+
+ if case == "split" then
+ screen:expect([[
+ Inc substitution on |
+ ^MOo lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ Already ...t change |
+ ]])
+ else
+ screen:expect([[
+ Inc substitution on |
+ ^MOo lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ Already ...t change |
+ ]])
+ end
+ end
+ screen:detach()
+ end)
+
+ it('with undolevels=2', function()
+ local screen = Screen.new(20,10)
+
+ for _, case in pairs(cases) do
+ clear()
+ common_setup(screen, case, default_text)
+ feed_command("set undolevels=2")
+
+ feed("2GAx<esc>")
+ feed("Ay<esc>")
+ feed("Az<esc>")
+ feed(":%s/tw/AR<esc>")
+ -- feed_command("undo") here would cause "Press ENTER".
+ feed("u")
+ expect(default_text:gsub("lines", "linesxy"))
+ feed("u")
+ expect(default_text:gsub("lines", "linesx"))
+ feed("u")
+ expect(default_text)
+ feed("u")
+
+ if case == "split" then
+ screen:expect([[
+ Inc substitution on |
+ two line^s |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ Already ...t change |
+ ]])
+ else
+ screen:expect([[
+ Inc substitution on |
+ two line^s |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ Already ...t change |
+ ]])
+ end
+
+ feed(":%s/tw/MO/g<enter>")
+ feed(":%s/MO/GO/g<enter>")
+ feed(":%s/GO/NO/g<enter>")
+ feed(":%s/NO/LO/g<enter>")
+ feed("u")
+ expect(default_text:gsub("tw", "NO"))
+ feed("u")
+ expect(default_text:gsub("tw", "GO"))
+ feed("u")
+ expect(default_text:gsub("tw", "MO"))
+ feed("u")
+
+ if case == "split" then
+ screen:expect([[
+ Inc substitution on |
+ ^MOo lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ Already ...t change |
+ ]])
+ else
+ screen:expect([[
+ Inc substitution on |
+ ^MOo lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ Already ...t change |
+ ]])
+ end
+ screen:detach()
+ end
+ end)
+
+ it('with undolevels=-1', function()
+ local screen = Screen.new(20,10)
+
+ for _, case in pairs(cases) do
+ clear()
+ common_setup(screen, case, default_text)
+
+ feed_command("set undolevels=-1")
+ feed(":%s/tw/MO/g<enter>")
+ -- feed_command("undo") here will result in a "Press ENTER" prompt
+ feed("u")
+ if case == "split" then
+ screen:expect([[
+ Inc substitution on |
+ ^MOo lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ Already ...t change |
+ ]])
+ else
+ screen:expect([[
+ Inc substitution on |
+ ^MOo lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ Already ...t change |
+ ]])
+ end
+
+ -- repeat with an interrupted substitution
+ clear()
+ common_setup(screen, case, default_text)
+
+ feed_command("set undolevels=-1")
+ feed("1G")
+ feed("IL<esc>")
+ feed(":%s/tw/MO/g<esc>")
+ feed("u")
+
+ screen:expect([[
+ ^LInc substitution on|
+ two lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ Already ...t change |
+ ]])
+ end
+ screen:detach()
+ end)
+
+end)
+
+describe(":substitute, inccommand=split", function()
+ local screen = Screen.new(30,15)
+
+ before_each(function()
+ clear()
+ common_setup(screen, "split", default_text .. default_text)
+ end)
+
+ after_each(function()
+ screen:detach()
+ end)
+
+ it("preserves 'modified' buffer flag", function()
+ feed_command("set nomodified")
+ feed(":%s/tw")
+ screen:expect([[
+ Inc substitution on |
+ {12:tw}o lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {11:[No Name] }|
+ |2| {12:tw}o lines |
+ |4| {12:tw}o lines |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/tw^ |
+ ]])
+ feed([[<C-\><C-N>]]) -- Cancel the :substitute command.
+ eq(0, eval("&modified"))
+ end)
+
+ it("shows preview when cmd modifiers are present", function()
+ -- one modifier
+ feed(':keeppatterns %s/tw/to')
+ screen:expect{any=[[{12:to}o lines]]}
+ feed('<Esc>')
+ screen:expect{any=[[two lines]]}
+
+ -- multiple modifiers
+ feed(':keeppatterns silent %s/tw/to')
+ screen:expect{any=[[{12:to}o lines]]}
+ feed('<Esc>')
+ screen:expect{any=[[two lines]]}
+
+ -- non-modifier prefix
+ feed(':silent tabedit %s/tw/to')
+ screen:expect([[
+ Inc substitution on |
+ two lines |
+ Inc substitution on |
+ two lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :silent tabedit %s/tw/to^ |
+ ]])
+ end)
+
+ it('shows split window when typing the pattern', function()
+ feed(":%s/tw")
+ screen:expect([[
+ Inc substitution on |
+ {12:tw}o lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {11:[No Name] [+] }|
+ |2| {12:tw}o lines |
+ |4| {12:tw}o lines |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/tw^ |
+ ]])
+ end)
+
+ it('shows preview with empty replacement', function()
+ feed(":%s/tw/")
+ screen:expect([[
+ Inc substitution on |
+ o lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {11:[No Name] [+] }|
+ |2| o lines |
+ |4| o lines |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/tw/^ |
+ ]])
+
+ feed("x")
+ screen:expect([[
+ Inc substitution on |
+ {12:x}o lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {11:[No Name] [+] }|
+ |2| {12:x}o lines |
+ |4| {12:x}o lines |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/tw/x^ |
+ ]])
+
+ feed("<bs>")
+ screen:expect([[
+ Inc substitution on |
+ o lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {11:[No Name] [+] }|
+ |2| o lines |
+ |4| o lines |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/tw/^ |
+ ]])
+
+ end)
+
+ it('shows split window when typing replacement', function()
+ feed(":%s/tw/XX")
+ screen:expect([[
+ Inc substitution on |
+ {12:XX}o lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {11:[No Name] [+] }|
+ |2| {12:XX}o lines |
+ |4| {12:XX}o lines |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/tw/XX^ |
+ ]])
+ end)
+
+ it('does not show split window for :s/', function()
+ feed("2gg")
+ feed(":s/tw")
+ screen:expect([[
+ Inc substitution on |
+ {12:tw}o lines |
+ Inc substitution on |
+ two lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :s/tw^ |
+ ]])
+ end)
+
+ it("'hlsearch' is active, 'cursorline' is not", function()
+ feed_command("set hlsearch cursorline")
+ feed("gg")
+
+ -- Assert that 'cursorline' is active.
+ screen:expect([[
+ {16:^Inc substitution on }|
+ two lines |
+ Inc substitution on |
+ two lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :set hlsearch cursorline |
+ ]])
+
+ feed(":%s/tw")
+ -- 'cursorline' is NOT active during preview.
+ screen:expect([[
+ Inc substitution on |
+ {12:tw}o lines |
+ Inc substitution on |
+ {12:tw}o lines |
+ |
+ {11:[No Name] [+] }|
+ |2| {12:tw}o lines |
+ |4| {12:tw}o lines |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/tw^ |
+ ]])
+ end)
+
+ it('highlights the replacement text', function()
+ feed('ggO')
+ feed('M M M<esc>')
+ feed(':%s/M/123/g')
+ screen:expect([[
+ {12:123} {12:123} {12:123} |
+ Inc substitution on |
+ two lines |
+ Inc substitution on |
+ two lines |
+ {11:[No Name] [+] }|
+ |1| {12:123} {12:123} {12:123} |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/M/123/g^ |
+ ]])
+ end)
+
+ it("highlights nothing when there's no match", function()
+ feed('gg')
+ feed(':%s/Inx')
+ screen:expect([[
+ Inc substitution on |
+ two lines |
+ Inc substitution on |
+ two lines |
+ |
+ {11:[No Name] [+] }|
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/Inx^ |
+ ]])
+ end)
+
+ it('previews correctly when previewhight is small', function()
+ feed_command('set cwh=3')
+ feed_command('set hls')
+ feed('ggdG')
+ insert(string.rep('abc abc abc\n', 20))
+ feed(':%s/abc/MMM/g')
+ screen:expect([[
+ {12:MMM} {12:MMM} {12:MMM} |
+ {12:MMM} {12:MMM} {12:MMM} |
+ {12:MMM} {12:MMM} {12:MMM} |
+ {12:MMM} {12:MMM} {12:MMM} |
+ {12:MMM} {12:MMM} {12:MMM} |
+ {12:MMM} {12:MMM} {12:MMM} |
+ {12:MMM} {12:MMM} {12:MMM} |
+ {12:MMM} {12:MMM} {12:MMM} |
+ {12:MMM} {12:MMM} {12:MMM} |
+ {11:[No Name] [+] }|
+ | 1| {12:MMM} {12:MMM} {12:MMM} |
+ | 2| {12:MMM} {12:MMM} {12:MMM} |
+ | 3| {12:MMM} {12:MMM} {12:MMM} |
+ {10:[Preview] }|
+ :%s/abc/MMM/g^ |
+ ]])
+ end)
+
+ it('actually replaces text', function()
+ feed(":%s/tw/XX/g<Enter>")
+
+ screen:expect([[
+ Inc substitution on |
+ XXo lines |
+ Inc substitution on |
+ ^XXo lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :%s/tw/XX/g |
+ ]])
+ end)
+
+ it('shows correct line numbers with many lines', function()
+ feed("gg")
+ feed("2yy")
+ feed("2000p")
+ feed_command("1,1000s/tw/BB/g")
+
+ feed(":%s/tw/X")
+ screen:expect([[
+ BBo lines |
+ Inc substitution on |
+ {12:X}o lines |
+ Inc substitution on |
+ {12:X}o lines |
+ {11:[No Name] [+] }|
+ |1001| {12:X}o lines |
+ |1003| {12:X}o lines |
+ |1005| {12:X}o lines |
+ |1007| {12:X}o lines |
+ |1009| {12:X}o lines |
+ |1011| {12:X}o lines |
+ |1013| {12:X}o lines |
+ {10:[Preview] }|
+ :%s/tw/X^ |
+ ]])
+ end)
+
+ it('does not spam the buffer numbers', function()
+ -- The preview buffer is re-used (unless user deleted it), so buffer numbers
+ -- will not increase on each keystroke.
+ feed(":%s/tw/Xo/g")
+ -- Delete and re-type the g a few times.
+ feed("<BS>")
+ wait()
+ feed("g")
+ wait()
+ feed("<BS>")
+ wait()
+ feed("g")
+ wait()
+ feed("<CR>")
+ wait()
+ feed(":vs tmp<enter>")
+ eq(3, helpers.call('bufnr', '$'))
+ end)
+
+ it('works with the n flag', function()
+ feed(":%s/tw/Mix/n<Enter>")
+ screen:expect([[
+ Inc substitution on |
+ two lines |
+ Inc substitution on |
+ two lines |
+ ^ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ 2 matches on 2 lines |
+ ]])
+ end)
+
+ it("deactivates if 'redrawtime' is exceeded #5602", function()
+ -- Assert that 'inccommand' is ENABLED initially.
+ eq("split", eval("&inccommand"))
+ -- Set 'redrawtime' to minimal value, to ensure timeout is triggered.
+ feed_command("set redrawtime=1 nowrap")
+ -- Load a big file.
+ feed_command("silent edit! test/functional/fixtures/bigfile_oneline.txt")
+ -- Start :substitute with a slow pattern.
+ feed([[:%s/B.*N/x]])
+ wait()
+
+ -- Assert that 'inccommand' is DISABLED in cmdline mode.
+ eq("", eval("&inccommand"))
+ -- Assert that preview cleared (or never manifested).
+ screen:expect([[
+ 0000;<control>;Cc;0;BN;;;;;N;N|
+ 2F923;CJK COMPATIBILITY IDEOGR|
+ 2F924;CJK COMPATIBILITY IDEOGR|
+ 2F925;CJK COMPATIBILITY IDEOGR|
+ 2F926;CJK COMPATIBILITY IDEOGR|
+ 2F927;CJK COMPATIBILITY IDEOGR|
+ 2F928;CJK COMPATIBILITY IDEOGR|
+ 2F929;CJK COMPATIBILITY IDEOGR|
+ 2F92A;CJK COMPATIBILITY IDEOGR|
+ 2F92B;CJK COMPATIBILITY IDEOGR|
+ 2F92C;CJK COMPATIBILITY IDEOGR|
+ 2F92D;CJK COMPATIBILITY IDEOGR|
+ 2F92E;CJK COMPATIBILITY IDEOGR|
+ 2F92F;CJK COMPATIBILITY IDEOGR|
+ :%s/B.*N/x^ |
+ ]])
+
+ -- Assert that 'inccommand' is again ENABLED after leaving cmdline mode.
+ feed([[<C-\><C-N>]])
+ eq("split", eval("&inccommand"))
+ end)
+
+ it("clears preview if non-previewable command is edited #5585", function()
+ -- Put a non-previewable command in history.
+ feed_command("echo 'foo'")
+ -- Start an incomplete :substitute command.
+ feed(":1,2s/t/X")
+
+ screen:expect([[
+ Inc subs{12:X}itution on |
+ {12:X}wo lines |
+ Inc substitution on |
+ two lines |
+ |
+ {11:[No Name] [+] }|
+ |1| Inc subs{12:X}itution on |
+ |2| {12:X}wo lines |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :1,2s/t/X^ |
+ ]])
+
+ -- Select the previous command.
+ feed("<C-P>")
+ -- Assert that preview was cleared.
+ screen:expect([[
+ Inc substitution on |
+ two lines |
+ Inc substitution on |
+ two lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :echo 'foo'^ |
+ ]])
+ end)
+
+end)
+
+describe("inccommand=nosplit", function()
+ local screen = Screen.new(20,10)
+
+ before_each(function()
+ clear()
+ common_setup(screen, "nosplit", default_text .. default_text)
+ end)
+
+ after_each(function()
+ if screen then screen:detach() end
+ end)
+
+ it("works with :smagic, :snomagic", function()
+ feed_command("set hlsearch")
+ insert("Line *.3.* here")
+
+ feed(":%smagic/3.*/X") -- start :smagic command
+ screen:expect([[
+ Inc substitution on |
+ two lines |
+ Inc substitution on |
+ two lines |
+ Line *.{12:X} |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :%smagic/3.*/X^ |
+ ]])
+
+ feed([[<C-\><C-N>]]) -- cancel
+ feed(":%snomagic/3.*/X") -- start :snomagic command
+ screen:expect([[
+ Inc substitution on |
+ two lines |
+ Inc substitution on |
+ two lines |
+ Line *.{12:X} here |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :%snomagic/3.*/X^ |
+ ]])
+ end)
+
+ it("shows preview when cmd modifiers are present", function()
+ -- one modifier
+ feed(':keeppatterns %s/tw/to')
+ screen:expect{any=[[{12:to}o lines]]}
+ feed('<Esc>')
+ screen:expect{any=[[two lines]]}
+
+ -- multiple modifiers
+ feed(':keeppatterns silent %s/tw/to')
+ screen:expect{any=[[{12:to}o lines]]}
+ feed('<Esc>')
+ screen:expect{any=[[two lines]]}
+
+ -- non-modifier prefix
+ feed(':silent tabedit %s/tw/to')
+ screen:expect([[
+ two lines |
+ Inc substitution on |
+ two lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :silent tabedit %s/t|
+ w/to^ |
+ ]])
+ end)
+
+ it("does not show window after toggling :set inccommand", function()
+ feed(":%s/tw/OKOK")
+ feed("<Esc>")
+ command("set icm=split")
+ feed(":%s/tw/OKOK")
+ feed("<Esc>")
+ command("set icm=nosplit")
+ feed(":%s/tw/OKOK")
+ wait()
+ screen:expect([[
+ Inc substitution on |
+ {12:OKOK}o lines |
+ Inc substitution on |
+ {12:OKOK}o lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :%s/tw/OKOK^ |
+ ]])
+ end)
+
+ it('never shows preview buffer', function()
+ feed_command("set hlsearch")
+
+ feed(":%s/tw")
+ screen:expect([[
+ Inc substitution on |
+ {12:tw}o lines |
+ Inc substitution on |
+ {12:tw}o lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :%s/tw^ |
+ ]])
+
+ feed("/BM")
+ screen:expect([[
+ Inc substitution on |
+ {12:BM}o lines |
+ Inc substitution on |
+ {12:BM}o lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :%s/tw/BM^ |
+ ]])
+
+ feed("/")
+ screen:expect([[
+ Inc substitution on |
+ {12:BM}o lines |
+ Inc substitution on |
+ {12:BM}o lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :%s/tw/BM/^ |
+ ]])
+
+ feed("<enter>")
+ screen:expect([[
+ Inc substitution on |
+ BMo lines |
+ Inc substitution on |
+ ^BMo lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :%s/tw/BM/ |
+ ]])
+ end)
+
+ it("clears preview if non-previewable command is edited", function()
+ -- Put a non-previewable command in history.
+ feed_command("echo 'foo'")
+ -- Start an incomplete :substitute command.
+ feed(":1,2s/t/X")
+
+ screen:expect([[
+ Inc subs{12:X}itution on |
+ {12:X}wo lines |
+ Inc substitution on |
+ two lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :1,2s/t/X^ |
+ ]])
+
+ -- Select the previous command.
+ feed("<C-P>")
+ -- Assert that preview was cleared.
+ screen:expect([[
+ Inc substitution on |
+ two lines |
+ Inc substitution on |
+ two lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :echo 'foo'^ |
+ ]])
+ end)
+
+ it("does not execute trailing bar-separated commands #7494", function()
+ feed(':%s/two/three/g|q!')
+ screen:expect([[
+ Inc substitution on |
+ {12:three} lines |
+ Inc substitution on |
+ {12:three} lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :%s/two/three/g|q!^ |
+ ]])
+ eq(eval('v:null'), eval('v:exiting'))
+ end)
+end)
+
+describe(":substitute, 'inccommand' with a failing expression", function()
+ local screen = Screen.new(20,10)
+ local cases = { "", "split", "nosplit" }
+
+ local function refresh(case)
+ clear()
+ common_setup(screen, case, default_text)
+ end
+
+ it('in the pattern does nothing', function()
+ for _, case in pairs(cases) do
+ refresh(case)
+ feed_command("set inccommand=" .. case)
+ feed(":silent! %s/tw\\(/LARD/<enter>")
+ expect(default_text)
+ end
+ end)
+
+ it('in the replacement deletes the matches', function()
+ for _, case in pairs(cases) do
+ refresh(case)
+ local replacements = { "\\='LARD", "\\=xx_novar__xx" }
+
+ for _, repl in pairs(replacements) do
+ feed_command("set inccommand=" .. case)
+ feed(":silent! %s/tw/" .. repl .. "/<enter>")
+ expect(default_text:gsub("tw", ""))
+ feed_command("undo")
+ end
+ end
+ end)
+
+ it('in the range does not error #5912', function()
+ for _, case in pairs(cases) do
+ refresh(case)
+ feed(':100s/')
+
+ screen:expect([[
+ Inc substitution on |
+ two lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :100s/^ |
+ ]])
+
+ feed('<enter>')
+ screen:expect([[
+ Inc substitution on |
+ two lines |
+ ^ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {14:E16: Invalid range} |
+ ]])
+ end
+ end)
+
+end)
+
+describe("'inccommand' and :cnoremap", function()
+ local cases = { "", "split", "nosplit" }
+
+ local function refresh(case)
+ clear()
+ common_setup(nil, case, default_text)
+ end
+
+ it('work with remapped characters', function()
+ for _, case in pairs(cases) do
+ refresh(case)
+ local cmd = "%s/lines/LINES/g"
+
+ for i = 1, string.len(cmd) do
+ local c = string.sub(cmd, i, i)
+ feed_command("cnoremap ".. c .. " " .. c)
+ end
+
+ feed_command(cmd)
+ expect([[
+ Inc substitution on
+ two LINES
+ ]])
+ end
+ end)
+
+ it('work when mappings move the cursor', function()
+ for _, case in pairs(cases) do
+ refresh(case)
+ feed_command("cnoremap ,S LINES/<left><left><left><left><left><left>")
+
+ feed(":%s/lines/,Sor three <enter>")
+ expect([[
+ Inc substitution on
+ two or three LINES
+ ]])
+
+ feed_command("cnoremap ;S /X/<left><left><left>")
+ feed(":%s/;SI<enter>")
+ expect([[
+ Xnc substitution on
+ two or three LXNES
+ ]])
+
+ feed_command("cnoremap ,T //Y/<left><left><left>")
+ feed(":%s,TX<enter>")
+ expect([[
+ Ync substitution on
+ two or three LYNES
+ ]])
+
+ feed_command("cnoremap ;T s//Z/<left><left><left>")
+ feed(":%;TY<enter>")
+ expect([[
+ Znc substitution on
+ two or three LZNES
+ ]])
+ end
+ end)
+
+ it('still works with a broken mapping', function()
+ for _, case in pairs(cases) do
+ refresh(case)
+ feed_command("cnoremap <expr> x execute('bwipeout!')[-1].'x'")
+
+ feed(":%s/tw/tox<enter>")
+
+ -- error thrown b/c of the mapping
+ neq(nil, eval('v:errmsg'):find('^E523:'))
+ expect([[
+ Inc substitution on
+ toxo lines
+ ]])
+ end
+ end)
+
+ it('work when temporarily moving the cursor', function()
+ for _, case in pairs(cases) do
+ refresh(case)
+ feed_command("cnoremap <expr> x cursor(1, 1)[-1].'x'")
+
+ feed(":%s/tw/tox/g<enter>")
+ expect(default_text:gsub("tw", "tox"))
+ end
+ end)
+
+ it("work when a mapping disables 'inccommand'", function()
+ for _, case in pairs(cases) do
+ refresh(case)
+ feed_command("cnoremap <expr> x execute('set inccommand=')[-1]")
+
+ feed(":%s/tw/toxa/g<enter>")
+ expect(default_text:gsub("tw", "toa"))
+ end
+ end)
+
+ it('work with a complex mapping', function()
+ for _, case in pairs(cases) do
+ refresh(case)
+ source([[cnoremap x <C-\>eextend(g:, {'fo': getcmdline()})
+ \.fo<CR><C-c>:new<CR>:bw!<CR>:<C-r>=remove(g:, 'fo')<CR>x]])
+
+ feed(":%s/tw/tox")
+ feed("/<enter>")
+ expect(default_text:gsub("tw", "tox"))
+ end
+ end)
+
+end)
+
+describe("'inccommand' autocommands", function()
+ before_each(clear)
+
+ -- keys are events to be tested
+ -- values are arrays like
+ -- { open = { 1 }, close = { 2, 3} }
+ -- which would mean that during the test below the event fires for
+ -- buffer 1 when opening the preview window, and for buffers 2 and 3
+ -- when closing the preview window
+ local eventsExpected = {
+ BufAdd = {},
+ BufDelete = {},
+ BufEnter = {},
+ BufFilePost = {},
+ BufFilePre = {},
+ BufHidden = {},
+ BufLeave = {},
+ BufNew = {},
+ BufNewFile = {},
+ BufRead = {},
+ BufReadCmd = {},
+ BufReadPre = {},
+ BufUnload = {},
+ BufWinEnter = {},
+ BufWinLeave = {},
+ BufWipeout = {},
+ BufWrite = {},
+ BufWriteCmd = {},
+ BufWritePost = {},
+ Syntax = {},
+ FileType = {},
+ WinEnter = {},
+ WinLeave = {},
+ CmdwinEnter = {},
+ CmdwinLeave = {},
+ }
+
+ local function bufferlist(t)
+ local s = ""
+ for _, buffer in pairs(t) do
+ s = s .. ", " .. tostring(buffer)
+ end
+ return s
+ end
+
+ -- fill the table with default values
+ for event, _ in pairs(eventsExpected) do
+ eventsExpected[event].open = eventsExpected[event].open or {}
+ eventsExpected[event].close = eventsExpected[event].close or {}
+ end
+
+ local function register_autocmd(event)
+ meths.set_var(event .. "_fired", {})
+ feed_command("autocmd " .. event .. " * call add(g:" .. event .. "_fired, expand('<abuf>'))")
+ end
+
+ it('are not fired when splitting', function()
+ common_setup(nil, "split", default_text)
+
+ local eventsObserved = {}
+ for event, _ in pairs(eventsExpected) do
+ eventsObserved[event] = {}
+ register_autocmd(event)
+ end
+
+ feed(":%s/tw")
+
+ for event, _ in pairs(eventsExpected) do
+ eventsObserved[event].open = meths.get_var(event .. "_fired")
+ meths.set_var(event .. "_fired", {})
+ end
+
+ feed("/<enter>")
+
+ for event, _ in pairs(eventsExpected) do
+ eventsObserved[event].close = meths.get_var(event .. "_fired")
+ end
+
+ for event, _ in pairs(eventsExpected) do
+ eq(event .. bufferlist(eventsExpected[event].open),
+ event .. bufferlist(eventsObserved[event].open))
+ eq(event .. bufferlist(eventsExpected[event].close),
+ event .. bufferlist(eventsObserved[event].close))
+ end
+ end)
+
+end)
+
+describe("'inccommand' split windows", function()
+ local screen
+ local function refresh()
+ clear()
+ screen = Screen.new(40,30)
+ common_setup(screen, "split", default_text)
+ end
+
+ after_each(function()
+ screen:detach()
+ end)
+
+ it('work after more splits', function()
+ refresh()
+
+ feed("gg")
+ feed_command("vsplit")
+ feed_command("split")
+ feed(":%s/tw")
+ screen:expect([[
+ Inc substitution on {10:โ”‚}Inc substitution on|
+ {12:tw}o lines {10:โ”‚}{12:tw}o lines |
+ {10:โ”‚} |
+ {15:~ }{10:โ”‚}{15:~ }|
+ {15:~ }{10:โ”‚}{15:~ }|
+ {15:~ }{10:โ”‚}{15:~ }|
+ {15:~ }{10:โ”‚}{15:~ }|
+ {15:~ }{10:โ”‚}{15:~ }|
+ {15:~ }{10:โ”‚}{15:~ }|
+ {15:~ }{10:โ”‚}{15:~ }|
+ {15:~ }{10:โ”‚}{15:~ }|
+ {15:~ }{10:โ”‚}{15:~ }|
+ {15:~ }{10:โ”‚}{15:~ }|
+ {15:~ }{10:โ”‚}{15:~ }|
+ {11:[No Name] [+] }{10:โ”‚}{15:~ }|
+ Inc substitution on {10:โ”‚}{15:~ }|
+ {12:tw}o lines {10:โ”‚}{15:~ }|
+ {10:โ”‚}{15:~ }|
+ {15:~ }{10:โ”‚}{15:~ }|
+ {15:~ }{10:โ”‚}{15:~ }|
+ {10:[No Name] [+] [No Name] [+] }|
+ |2| {12:tw}o lines |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/tw^ |
+ ]])
+
+ feed("<esc>")
+ feed_command("only")
+ feed_command("split")
+ feed_command("vsplit")
+
+ feed(":%s/tw")
+ screen:expect([[
+ Inc substitution on {10:โ”‚}Inc substitution on|
+ {12:tw}o lines {10:โ”‚}{12:tw}o lines |
+ {10:โ”‚} |
+ {15:~ }{10:โ”‚}{15:~ }|
+ {15:~ }{10:โ”‚}{15:~ }|
+ {15:~ }{10:โ”‚}{15:~ }|
+ {15:~ }{10:โ”‚}{15:~ }|
+ {15:~ }{10:โ”‚}{15:~ }|
+ {15:~ }{10:โ”‚}{15:~ }|
+ {15:~ }{10:โ”‚}{15:~ }|
+ {15:~ }{10:โ”‚}{15:~ }|
+ {15:~ }{10:โ”‚}{15:~ }|
+ {15:~ }{10:โ”‚}{15:~ }|
+ {15:~ }{10:โ”‚}{15:~ }|
+ {11:[No Name] [+] }{10:[No Name] [+] }|
+ Inc substitution on |
+ {12:tw}o lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {10:[No Name] [+] }|
+ |2| {12:tw}o lines |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/tw^ |
+ ]])
+ end)
+
+ local settings = {
+ "splitbelow",
+ "splitright",
+ "noequalalways",
+ "equalalways eadirection=ver",
+ "equalalways eadirection=hor",
+ "equalalways eadirection=both",
+ }
+
+ it("are not affected by various settings", function()
+ for _, setting in pairs(settings) do
+ refresh()
+ feed_command("set " .. setting)
+
+ feed(":%s/tw")
+
+ screen:expect([[
+ Inc substitution on |
+ {12:tw}o lines |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {11:[No Name] [+] }|
+ |2| {12:tw}o lines |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/tw^ |
+ ]])
+ end
+ end)
+
+end)
+
+describe("'inccommand' with 'gdefault'", function()
+ before_each(function()
+ clear()
+ end)
+
+ it("does not lock up #7244", function()
+ common_setup(nil, "nosplit", "{")
+ command("set gdefault")
+ feed(":s/{\\n")
+ eq({mode='c', blocking=false}, nvim("get_mode"))
+ feed("/A<Enter>")
+ expect("A")
+ eq({mode='n', blocking=false}, nvim("get_mode"))
+ end)
+
+ it("with multiline text and range, does not lock up #7244", function()
+ common_setup(nil, "nosplit", "{\n\n{")
+ command("set gdefault")
+ feed(":%s/{\\n")
+ eq({mode='c', blocking=false}, nvim("get_mode"))
+ feed("/A<Enter>")
+ expect("A\nA")
+ eq({mode='n', blocking=false}, nvim("get_mode"))
+ end)
+
+ it("does not crash on zero-width matches #7485", function()
+ common_setup(nil, "split", default_text)
+ command("set gdefault")
+ feed("gg")
+ feed("Vj")
+ feed(":s/\\%V")
+ eq({mode='c', blocking=false}, nvim("get_mode"))
+ feed("<Esc>")
+ eq({mode='n', blocking=false}, nvim("get_mode"))
+ end)
+
+ it("removes highlights after abort for a zero-width match", function()
+ local screen = Screen.new(30,5)
+ common_setup(screen, "nosplit", default_text)
+ command("set gdefault")
+
+ feed(":%s/\\%1c/a/")
+ screen:expect([[
+ {12:a}Inc substitution on |
+ {12:a}two lines |
+ {12:a} |
+ {15:~ }|
+ :%s/\%1c/a/^ |
+ ]])
+
+ feed("<Esc>")
+ screen:expect([[
+ Inc substitution on |
+ two lines |
+ ^ |
+ {15:~ }|
+ |
+ ]])
+ end)
+
+end)
+
+describe(":substitute", function()
+ local screen = Screen.new(30,15)
+ before_each(function()
+ clear()
+ end)
+
+ it("inccommand=split, highlights multiline substitutions", function()
+ common_setup(screen, "split", multiline_text)
+ feed("gg")
+
+ feed(":%s/2\\_.*X")
+ screen:expect([[
+ 1 {12:2 3} |
+ {12:A B C} |
+ {12:4 5 6} |
+ {12:X} Y Z |
+ 7 8 9 |
+ {11:[No Name] [+] }|
+ |1| 1 {12:2 3} |
+ |2|{12: A B C} |
+ |3|{12: 4 5 6} |
+ |4|{12: X} Y Z |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/2\_.*X^ |
+ ]])
+
+ feed("/MMM")
+ screen:expect([[
+ 1 {12:MMM} Y Z |
+ 7 8 9 |
+ |
+ {15:~ }|
+ {15:~ }|
+ {11:[No Name] [+] }|
+ |1| 1 {12:MMM} Y Z |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/2\_.*X/MMM^ |
+ ]])
+
+ feed("\\rK\\rLLL")
+ screen:expect([[
+ 1 {12:MMM} |
+ {12:K} |
+ {12:LLL} Y Z |
+ 7 8 9 |
+ |
+ {11:[No Name] [+] }|
+ |1| 1 {12:MMM} |
+ |2|{12: K} |
+ |3|{12: LLL} Y Z |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/2\_.*X/MMM\rK\rLLL^ |
+ ]])
+ end)
+
+ it("inccommand=nosplit, highlights multiline substitutions", function()
+ common_setup(screen, "nosplit", multiline_text)
+ feed("gg")
+
+ feed(":%s/2\\_.*X/MMM")
+ screen:expect([[
+ 1 {12:MMM} Y Z |
+ 7 8 9 |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :%s/2\_.*X/MMM^ |
+ ]])
+
+ feed("\\rK\\rLLL")
+ screen:expect([[
+ 1 {12:MMM} |
+ {12:K} |
+ {12:LLL} Y Z |
+ 7 8 9 |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :%s/2\_.*X/MMM\rK\rLLL^ |
+ ]])
+ end)
+
+ it("inccommand=split, highlights multiple matches on a line", function()
+ common_setup(screen, "split", multimatch_text)
+ command("set gdefault")
+ feed("gg")
+
+ feed(":%s/a/XLK")
+ screen:expect([[
+ {12:XLK} bdc e{12:XLK}e {12:XLK} fgl lzi{12:XLK} r|
+ x |
+ |
+ {15:~ }|
+ {15:~ }|
+ {11:[No Name] [+] }|
+ |1| {12:XLK} bdc e{12:XLK}e {12:XLK} fgl lzi{12:X}|
+ {12:LK} r |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/a/XLK^ |
+ ]])
+ end)
+
+ it("inccommand=nosplit, highlights multiple matches on a line", function()
+ common_setup(screen, "nosplit", multimatch_text)
+ command("set gdefault")
+ feed("gg")
+
+ feed(":%s/a/XLK")
+ screen:expect([[
+ {12:XLK} bdc e{12:XLK}e {12:XLK} fgl lzi{12:XLK} r|
+ x |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :%s/a/XLK^ |
+ ]])
+ end)
+
+ it("inccommand=split, with \\zs", function()
+ common_setup(screen, "split", multiline_text)
+ feed("gg")
+
+ feed(":%s/[0-9]\\n\\zs[A-Z]/OKO")
+ screen:expect([[
+ 1 2 3 |
+ {12:OKO} B C |
+ 4 5 6 |
+ {12:OKO} Y Z |
+ 7 8 9 |
+ {11:[No Name] [+] }|
+ |1| 1 2 3 |
+ |2| {12:OKO} B C |
+ |3| 4 5 6 |
+ |4| {12:OKO} Y Z |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/[0-9]\n\zs[A-Z]/OKO^ |
+ ]])
+ end)
+
+ it("inccommand=nosplit, with \\zs", function()
+ common_setup(screen, "nosplit", multiline_text)
+ feed("gg")
+
+ feed(":%s/[0-9]\\n\\zs[A-Z]/OKO")
+ screen:expect([[
+ 1 2 3 |
+ {12:OKO} B C |
+ 4 5 6 |
+ {12:OKO} Y Z |
+ 7 8 9 |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :%s/[0-9]\n\zs[A-Z]/OKO^ |
+ ]])
+ end)
+
+ it("inccommand=split, substitutions of different length",
+ function()
+ common_setup(screen, "split", "T T123 T2T TTT T090804\nx")
+
+ feed(":%s/T\\([0-9]\\+\\)/\\1\\1/g")
+ screen:expect([[
+ T {12:123123} {12:22}T TTT {12:090804090804} |
+ x |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {11:[No Name] [+] }|
+ |1| T {12:123123} {12:22}T TTT {12:090804090}|
+ {12:804} |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/T\([0-9]\+\)/\1\1/g^ |
+ ]])
+ end)
+
+ it("inccommand=nosplit, substitutions of different length", function()
+ common_setup(screen, "nosplit", "T T123 T2T TTT T090804\nx")
+
+ feed(":%s/T\\([0-9]\\+\\)/\\1\\1/g")
+ screen:expect([[
+ T {12:123123} {12:22}T TTT {12:090804090804} |
+ x |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :%s/T\([0-9]\+\)/\1\1/g^ |
+ ]])
+ end)
+
+ it("inccommand=split, contraction of lines", function()
+ local text = [[
+ T T123 T T123 T2T TT T23423424
+ x
+ afa Q
+ adf la;lkd R
+ alx
+ ]]
+
+ common_setup(screen, "split", text)
+ feed(":%s/[QR]\\n")
+ screen:expect([[
+ afa {12:Q} |
+ adf la;lkd {12:R} |
+ alx |
+ |
+ {15:~ }|
+ {11:[No Name] [+] }|
+ |3| afa {12:Q} |
+ |4|{12: }adf la;lkd {12:R} |
+ |5|{12: }alx |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/[QR]\n^ |
+ ]])
+
+ feed("/KKK")
+ screen:expect([[
+ x |
+ afa {12:KKK}adf la;lkd {12:KKK}alx |
+ |
+ {15:~ }|
+ {15:~ }|
+ {11:[No Name] [+] }|
+ |3| afa {12:KKK}adf la;lkd {12:KKK}alx |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/[QR]\n/KKK^ |
+ ]])
+ end)
+
+ it("inccommand=nosplit, contraction of lines", function()
+ local text = [[
+ T T123 T T123 T2T TT T23423424
+ x
+ afa Q
+ adf la;lkd R
+ alx
+ ]]
+
+ common_setup(screen, "nosplit", text)
+ feed(":%s/[QR]\\n/KKK")
+ screen:expect([[
+ T T123 T T123 T2T TT T23423424|
+ x |
+ afa {12:KKK}adf la;lkd {12:KKK}alx |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :%s/[QR]\n/KKK^ |
+ ]])
+ end)
+
+ it("inccommand=split, multibyte text", function()
+ common_setup(screen, "split", multibyte_text)
+ feed(":%s/ยฃ.*ัซ/Xยฅยฅ")
+ screen:expect([[
+ {12:Xยฅยฅ} |
+ a{12:Xยฅยฅ}ยฅKOL |
+ ยฃ ยฅ libm |
+ ยฃ ยฅ |
+ |
+ {11:[No Name] [+] }|
+ |1| {12:Xยฅยฅ} PEPPERS |
+ |2| {12:Xยฅยฅ} |
+ |3| a{12:Xยฅยฅ}ยฅKOL |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/ยฃ.*ัซ/Xยฅยฅ^ |
+ ]])
+
+ feed("\\raยฃยฃ ยฅ")
+ screen:expect([[
+ {12:aยฃยฃ ยฅ} |
+ a{12:Xยฅยฅ} |
+ {12:aยฃยฃ ยฅ}ยฅKOL |
+ ยฃ ยฅ libm |
+ ยฃ ยฅ |
+ {11:[No Name] [+] }|
+ |1| {12:Xยฅยฅ} |
+ |2|{12: aยฃยฃ ยฅ} PEPPERS |
+ |3| {12:Xยฅยฅ} |
+ |4|{12: aยฃยฃ ยฅ} |
+ |5| a{12:Xยฅยฅ} |
+ |6|{12: aยฃยฃ ยฅ}ยฅKOL |
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/ยฃ.*ัซ/Xยฅยฅ\raยฃยฃ ยฅ^ |
+ ]])
+ end)
+
+ it("inccommand=nosplit, multibyte text", function()
+ common_setup(screen, "nosplit", multibyte_text)
+ feed(":%s/ยฃ.*ัซ/Xยฅยฅ")
+ screen:expect([[
+ {12:Xยฅยฅ} PEPPERS |
+ {12:Xยฅยฅ} |
+ a{12:Xยฅยฅ}ยฅKOL |
+ ยฃ ยฅ libm |
+ ยฃ ยฅ |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :%s/ยฃ.*ัซ/Xยฅยฅ^ |
+ ]])
+
+ feed("\\raยฃยฃ ยฅ")
+ screen:expect([[
+ {12:Xยฅยฅ} |
+ {12:aยฃยฃ ยฅ} PEPPERS |
+ {12:Xยฅยฅ} |
+ {12:aยฃยฃ ยฅ} |
+ a{12:Xยฅยฅ} |
+ {12:aยฃยฃ ยฅ}ยฅKOL |
+ ยฃ ยฅ libm |
+ ยฃ ยฅ |
+ |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :%s/ยฃ.*ัซ/Xยฅยฅ\raยฃยฃ ยฅ^ |
+ ]])
+ end)
+
+ it("inccommand=split, small cmdwinheight", function()
+ common_setup(screen, "split", long_multiline_text)
+ command("set cmdwinheight=2")
+
+ feed(":%s/[a-z]")
+ screen:expect([[
+ X Y Z |
+ 7 8 9 |
+ K L M |
+ {12:a} b c |
+ {12:d} e f |
+ {12:q} r s |
+ {12:x} y z |
+ ยฃ {12:m} n |
+ {12:t} ล“ ยฅ |
+ |
+ {11:[No Name] [+] }|
+ | 7| {12:a} b c |
+ | 8| {12:d} e f |
+ {10:[Preview] }|
+ :%s/[a-z]^ |
+ ]])
+
+ feed("/JLKR ยฃ")
+ screen:expect([[
+ X Y Z |
+ 7 8 9 |
+ K L M |
+ {12:JLKR ยฃ} b c |
+ {12:JLKR ยฃ} e f |
+ {12:JLKR ยฃ} r s |
+ {12:JLKR ยฃ} y z |
+ ยฃ {12:JLKR ยฃ} n |
+ {12:JLKR ยฃ} ล“ ยฅ |
+ |
+ {11:[No Name] [+] }|
+ | 7| {12:JLKR ยฃ} b c |
+ | 8| {12:JLKR ยฃ} e f |
+ {10:[Preview] }|
+ :%s/[a-z]/JLKR ยฃ^ |
+ ]])
+
+ feed("\\rัซ ab \\rXXXX")
+ screen:expect([[
+ 7 8 9 |
+ K L M |
+ {12:JLKR ยฃ} |
+ {12:ัซ ab } |
+ {12:XXXX} b c |
+ {12:JLKR ยฃ} |
+ {12:ัซ ab } |
+ {12:XXXX} e f |
+ {12:JLKR ยฃ} |
+ {11:[No Name] [+] }|
+ | 7| {12:JLKR ยฃ} |
+ | 8|{12: ัซ ab } |
+ {10:[Preview] }|
+ :%s/[a-z]/JLKR ยฃ\rัซ ab \rXXX|
+ X^ |
+ ]])
+ end)
+
+ it("inccommand=split, large cmdwinheight", function()
+ common_setup(screen, "split", long_multiline_text)
+ command("set cmdwinheight=11")
+
+ feed(":%s/. .$")
+ screen:expect([[
+ t {12:ล“ ยฅ} |
+ {11:[No Name] [+] }|
+ | 1| 1 {12:2 3} |
+ | 2| A {12:B C} |
+ | 3| 4 {12:5 6} |
+ | 4| X {12:Y Z} |
+ | 5| 7 {12:8 9} |
+ | 6| K {12:L M} |
+ | 7| a {12:b c} |
+ | 8| d {12:e f} |
+ | 9| q {12:r s} |
+ |10| x {12:y z} |
+ |11| ยฃ {12:m n} |
+ {10:[Preview] }|
+ :%s/. .$^ |
+ ]])
+
+ feed("/ YYY")
+ screen:expect([[
+ t {12: YYY} |
+ {11:[No Name] [+] }|
+ | 1| 1 {12: YYY} |
+ | 2| A {12: YYY} |
+ | 3| 4 {12: YYY} |
+ | 4| X {12: YYY} |
+ | 5| 7 {12: YYY} |
+ | 6| K {12: YYY} |
+ | 7| a {12: YYY} |
+ | 8| d {12: YYY} |
+ | 9| q {12: YYY} |
+ |10| x {12: YYY} |
+ |11| ยฃ {12: YYY} |
+ {10:[Preview] }|
+ :%s/. .$/ YYY^ |
+ ]])
+
+ feed("\\r KKK")
+ screen:expect([[
+ a {12: YYY} |
+ {11:[No Name] [+] }|
+ | 1| 1 {12: YYY} |
+ | 2|{12: KKK} |
+ | 3| A {12: YYY} |
+ | 4|{12: KKK} |
+ | 5| 4 {12: YYY} |
+ | 6|{12: KKK} |
+ | 7| X {12: YYY} |
+ | 8|{12: KKK} |
+ | 9| 7 {12: YYY} |
+ |10|{12: KKK} |
+ |11| K {12: YYY} |
+ {10:[Preview] }|
+ :%s/. .$/ YYY\r KKK^ |
+ ]])
+ end)
+
+ it("inccommand=split, lookaround", function()
+ common_setup(screen, "split", "something\neverything\nsomeone")
+ feed([[:%s/\(some\)\@<lt>=thing/one/]])
+ screen:expect([[
+ some{12:one} |
+ everything |
+ someone |
+ {15:~ }|
+ {15:~ }|
+ {11:[No Name] [+] }|
+ |1| some{12:one} |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/\(some\)\@<=thing/one/^ |
+ ]])
+
+ feed("<C-c>")
+ wait()
+ feed([[:%s/\(some\)\@<lt>!thing/one/]])
+ screen:expect([[
+ something |
+ every{12:one} |
+ someone |
+ {15:~ }|
+ {15:~ }|
+ {11:[No Name] [+] }|
+ |2| every{12:one} |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/\(some\)\@<!thing/one/^ |
+ ]])
+
+ feed([[<C-c>]])
+ wait()
+ feed([[:%s/some\(thing\)\@=/every/]])
+ screen:expect([[
+ {12:every}thing |
+ everything |
+ someone |
+ {15:~ }|
+ {15:~ }|
+ {11:[No Name] [+] }|
+ |1| {12:every}thing |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/some\(thing\)\@=/every/^ |
+ ]])
+
+ feed([[<C-c>]])
+ wait()
+ feed([[:%s/some\(thing\)\@!/every/]])
+ screen:expect([[
+ everything |
+ {12:every}one |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {11:[No Name] [+] }|
+ |3| {12:every}one |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/some\(thing\)\@!/every/^ |
+ ]])
+ end)
+end)
+
+it(':substitute with inccommand during :terminal activity', function()
+ if helpers.skip_fragile(pending) then
+ return
+ end
+ retry(2, 40000, function()
+ local screen = Screen.new(30,15)
+ clear()
+
+ command("set cmdwinheight=3")
+ if iswin() then
+ feed([[:terminal for /L \%I in (1,1,5000) do @(echo xxx & echo xxx & echo xxx)<cr>]])
+ else
+ feed([[:terminal for i in $(seq 1 5000); do printf 'xxx\nxxx\nxxx\n'; done<cr>]])
+ end
+ command('file term')
+ command('new')
+ common_setup(screen, 'split', 'foo bar baz\nbar baz fox\nbar foo baz')
+ command('wincmd =')
+
+ -- Wait for terminal output.
+ screen:expect([[
+ bar baz fox |
+ bar foo ba^z |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {11:[No Name] [+] }|
+ xxx |
+ xxx |
+ xxx |
+ xxx |
+ xxx |
+ xxx |
+ {10:term }|
+ |
+ ]])
+
+ feed('gg')
+ feed(':%s/foo/ZZZ')
+ sleep(20) -- Allow some terminal activity.
+ screen:expect([[
+ {12:ZZZ} bar baz |
+ bar baz fox |
+ bar {12:ZZZ} baz |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ {11:[No Name] [+] }|
+ xxx |
+ xxx |
+ {10:term }|
+ |1| {12:ZZZ} bar baz |
+ |3| bar {12:ZZZ} baz |
+ {15:~ }|
+ {10:[Preview] }|
+ :%s/foo/ZZZ^ |
+ ]])
+
+ end)
+end)
diff --git a/test/functional/ui/input_spec.lua b/test/functional/ui/input_spec.lua
index 407c576002..850efed282 100644
--- a/test/functional/ui/input_spec.lua
+++ b/test/functional/ui/input_spec.lua
@@ -1,7 +1,9 @@
local helpers = require('test.functional.helpers')(after_each)
-local clear, execute, nvim = helpers.clear, helpers.execute, helpers.nvim
-local feed, next_message, eq = helpers.feed, helpers.next_message, helpers.eq
+local clear, feed_command, nvim = helpers.clear, helpers.feed_command, helpers.nvim
+local feed, next_msg, eq = helpers.feed, helpers.next_msg, helpers.eq
+local command = helpers.command
local expect = helpers.expect
+local write_file = helpers.write_file
local Screen = require('test.functional.ui.screen')
describe('mappings', function()
@@ -10,12 +12,12 @@ describe('mappings', function()
local add_mapping = function(mapping, send)
local cmd = "nnoremap "..mapping.." :call rpcnotify("..cid..", 'mapped', '"
..send:gsub('<', '<lt>').."')<cr>"
- execute(cmd)
+ feed_command(cmd)
end
local check_mapping = function(mapping, expected)
feed(mapping)
- eq({'notification', 'mapped', {expected}}, next_message())
+ eq({'notification', 'mapped', {expected}}, next_msg())
end
before_each(function()
@@ -55,10 +57,13 @@ describe('feeding large chunks of input with <Paste>', function()
clear()
screen = Screen.new()
screen:attach()
- execute('set ruler')
+ feed_command('set ruler')
end)
it('ok', function()
+ if helpers.skip_fragile(pending) then
+ return
+ end
local t = {}
for i = 1, 20000 do
t[i] = 'item ' .. tostring(i)
@@ -124,3 +129,97 @@ describe('input utf sequences that contain CSI/K_SPECIAL', function()
expect('โ€ฆ')
end)
end)
+
+describe('input non-printable chars', function()
+ after_each(function()
+ os.remove('Xtest-overwrite')
+ end)
+
+ it("doesn't crash when echoing them back", function()
+ write_file("Xtest-overwrite", [[foobar]])
+ clear()
+ local screen = Screen.new(60,8)
+ screen:set_default_attr_ids({
+ [1] = {bold = true, foreground = Screen.colors.Blue1},
+ [2] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
+ [3] = {bold = true, foreground = Screen.colors.SeaGreen4}
+ })
+ screen:attach()
+ command("set display-=msgsep shortmess-=F")
+
+ feed_command("e Xtest-overwrite")
+ screen:expect([[
+ ^foobar |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ "Xtest-overwrite" [noeol] 1L, 6C |
+ ]])
+
+ -- The timestamp is in second resolution, wait two seconds to be sure.
+ screen:sleep(2000)
+ write_file("Xtest-overwrite", [[smurf]])
+ feed_command("w")
+ screen:expect([[
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ "Xtest-overwrite" |
+ {2:WARNING: The file has been changed since reading it!!!} |
+ {3:Do you really want to write to it (y/n)?}^ |
+ ]])
+
+ feed("u")
+ screen:expect([[
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ "Xtest-overwrite" |
+ {2:WARNING: The file has been changed since reading it!!!} |
+ {3:Do you really want to write to it (y/n)?}u |
+ {3:Do you really want to write to it (y/n)?}^ |
+ ]])
+
+ feed("\005")
+ screen:expect([[
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ "Xtest-overwrite" |
+ {2:WARNING: The file has been changed since reading it!!!} |
+ {3:Do you really want to write to it (y/n)?}u |
+ {3:Do you really want to write to it (y/n)?} |
+ {3:Do you really want to write to it (y/n)?}^ |
+ ]])
+
+ feed("n")
+ screen:expect([[
+ {1:~ }|
+ {1:~ }|
+ "Xtest-overwrite" |
+ {2:WARNING: The file has been changed since reading it!!!} |
+ {3:Do you really want to write to it (y/n)?}u |
+ {3:Do you really want to write to it (y/n)?} |
+ {3:Do you really want to write to it (y/n)?}n |
+ {3:Press ENTER or type command to continue}^ |
+ ]])
+
+ feed("<cr>")
+ screen:expect([[
+ ^foobar |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+ end)
+end)
diff --git a/test/functional/ui/mode_spec.lua b/test/functional/ui/mode_spec.lua
new file mode 100644
index 0000000000..f6b3c1c3c9
--- /dev/null
+++ b/test/functional/ui/mode_spec.lua
@@ -0,0 +1,189 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+
+local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
+local command, eval = helpers.command, helpers.eval
+local eq = helpers.eq
+
+describe('ui mode_change event', function()
+ local screen
+
+ before_each(function()
+ clear()
+ screen = Screen.new(25, 4)
+ screen:attach({rgb= true})
+ screen:set_default_attr_ids( {
+ [0] = {bold=true, foreground=255},
+ [1] = {bold=true, reverse=true},
+ [2] = {bold=true},
+ [3] = {reverse=true},
+ })
+ end)
+
+ it('works in normal mode', function()
+ screen:expect{grid=[[
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]], mode="normal"}
+
+ feed('d')
+ screen:expect{grid=[[
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]], mode="operator"}
+
+ feed('<esc>')
+ screen:expect{grid=[[
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]], mode="normal"}
+ end)
+
+ it('works in insert mode', function()
+ feed('i')
+ screen:expect{grid=[[
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ {2:-- INSERT --} |
+ ]], mode="insert"}
+
+ feed('word<esc>')
+ screen:expect{grid=[[
+ wor^d |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]], mode="normal"}
+
+ command("set showmatch")
+ eq(eval('&matchtime'), 5) -- tenths of seconds
+ feed('a(stuff')
+ screen:expect{grid=[[
+ word(stuff^ |
+ {0:~ }|
+ {0:~ }|
+ {2:-- INSERT --} |
+ ]], mode="insert"}
+
+ feed(')')
+ screen:expect{grid=[[
+ word^(stuff) |
+ {0:~ }|
+ {0:~ }|
+ {2:-- INSERT --} |
+ ]], mode="showmatch"}
+
+ screen:sleep(400)
+ screen:expect{grid=[[
+ word(stuff)^ |
+ {0:~ }|
+ {0:~ }|
+ {2:-- INSERT --} |
+ ]], mode="insert"}
+ end)
+
+ it('works in replace mode', function()
+ feed('R')
+ screen:expect{grid=[[
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ {2:-- REPLACE --} |
+ ]], mode="replace"}
+
+ feed('word<esc>')
+ screen:expect{grid=[[
+ wor^d |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]], mode="normal"}
+ end)
+
+ it('works in cmdline mode', function()
+ feed(':')
+ screen:expect{grid=[[
+ |
+ {0:~ }|
+ {0:~ }|
+ :^ |
+ ]], mode="cmdline_normal"}
+
+ feed('x<left>')
+ screen:expect{grid=[[
+ |
+ {0:~ }|
+ {0:~ }|
+ :^x |
+ ]], mode="cmdline_insert"}
+
+ feed('<insert>')
+ screen:expect{grid=[[
+ |
+ {0:~ }|
+ {0:~ }|
+ :^x |
+ ]], mode="cmdline_replace"}
+
+
+ feed('<right>')
+ screen:expect{grid=[[
+ |
+ {0:~ }|
+ {0:~ }|
+ :x^ |
+ ]], mode="cmdline_normal"}
+
+ feed('<esc>')
+ screen:expect{grid=[[
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]], mode="normal"}
+ end)
+
+ it('works in visual mode', function()
+ insert("text")
+ feed('v')
+ screen:expect{grid=[[
+ tex^t |
+ {0:~ }|
+ {0:~ }|
+ {2:-- VISUAL --} |
+ ]], mode="visual"}
+
+ feed('<esc>')
+ screen:expect{grid=[[
+ tex^t |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]], mode="normal"}
+
+ command('set selection=exclusive')
+ feed('v')
+ screen:expect{grid=[[
+ tex^t |
+ {0:~ }|
+ {0:~ }|
+ {2:-- VISUAL --} |
+ ]], mode="visual_select"}
+
+ feed('<esc>')
+ screen:expect{grid=[[
+ tex^t |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]], mode="normal"}
+ end)
+end)
+
diff --git a/test/functional/ui/mouse_spec.lua b/test/functional/ui/mouse_spec.lua
index a433143266..8d35df6f48 100644
--- a/test/functional/ui/mouse_spec.lua
+++ b/test/functional/ui/mouse_spec.lua
@@ -1,42 +1,38 @@
local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
local clear, feed, meths = helpers.clear, helpers.feed, helpers.meths
-local insert, execute = helpers.insert, helpers.execute
+local insert, feed_command = helpers.insert, helpers.feed_command
local eq, funcs = helpers.eq, helpers.funcs
+local command = helpers.command
-describe('Mouse input', function()
+describe('ui/mouse/input', function()
local screen
- local hlgroup_colors = {
- NonText = Screen.colors.Blue,
- Visual = Screen.colors.LightGrey
- }
-
before_each(function()
clear()
meths.set_option('mouse', 'a')
meths.set_option('listchars', 'eol:$')
- -- set mouset to very high value to ensure that even in valgrind/travis,
- -- nvim will still pick multiple clicks
- meths.set_option('mouset', 5000)
screen = Screen.new(25, 5)
screen:attach()
screen:set_default_attr_ids({
- [1] = {background = hlgroup_colors.Visual},
+ [0] = {bold=true, foreground=Screen.colors.Blue},
+ [1] = {background = Screen.colors.LightGrey},
[2] = {bold = true},
[3] = {
- foreground = hlgroup_colors.NonText,
- background = hlgroup_colors.Visual,
+ foreground = Screen.colors.Blue,
+ background = Screen.colors.LightGrey,
bold = true,
},
+ [4] = {reverse = true},
+ [5] = {bold = true, reverse = true},
})
- screen:set_default_attr_ignore( {{bold=true, foreground=hlgroup_colors.NonText}} )
+ command("set display-=msgsep")
feed('itesting<cr>mouse<cr>support and selection<esc>')
screen:expect([[
testing |
mouse |
support and selectio^n |
- ~ |
+ {0:~ }|
|
]])
end)
@@ -45,13 +41,13 @@ describe('Mouse input', function()
screen:detach()
end)
- it('left click moves cursor', function()
+ it('single left click moves cursor', function()
feed('<LeftMouse><2,1>')
screen:expect([[
testing |
mo^use |
support and selection |
- ~ |
+ {0:~ }|
|
]])
feed('<LeftMouse><0,0>')
@@ -59,95 +55,368 @@ describe('Mouse input', function()
^testing |
mouse |
support and selection |
- ~ |
+ {0:~ }|
|
]])
end)
+ it('double left click enters visual mode', function()
+ feed('<LeftMouse><0,0>')
+ feed('<LeftRelease><0,0>')
+ feed('<LeftMouse><0,0>')
+ feed('<LeftRelease><0,0>')
+ screen:expect([[
+ {1:testin}^g |
+ mouse |
+ support and selection |
+ {0:~ }|
+ {2:-- VISUAL --} |
+ ]])
+ end)
+
+ it('triple left click enters visual line mode', function()
+ feed('<LeftMouse><0,0>')
+ feed('<LeftRelease><0,0>')
+ feed('<LeftMouse><0,0>')
+ feed('<LeftRelease><0,0>')
+ feed('<LeftMouse><0,0>')
+ feed('<LeftRelease><0,0>')
+ screen:expect([[
+ ^t{1:esting}{3: } |
+ mouse |
+ support and selection |
+ {0:~ }|
+ {2:-- VISUAL LINE --} |
+ ]])
+ end)
+
+ it('quadruple left click enters visual block mode', function()
+ feed('<LeftMouse><0,0>')
+ feed('<LeftRelease><0,0>')
+ feed('<LeftMouse><0,0>')
+ feed('<LeftRelease><0,0>')
+ feed('<LeftMouse><0,0>')
+ feed('<LeftRelease><0,0>')
+ feed('<LeftMouse><0,0>')
+ feed('<LeftRelease><0,0>')
+ screen:expect([[
+ ^testing |
+ mouse |
+ support and selection |
+ {0:~ }|
+ {2:-- VISUAL BLOCK --} |
+ ]])
+ end)
+
+ describe('tab drag', function()
+ before_each(function()
+ screen:set_default_attr_ids( {
+ [0] = {bold=true, foreground=Screen.colors.Blue},
+ tab = { background=Screen.colors.LightGrey, underline=true },
+ sel = { bold=true },
+ fill = { reverse=true }
+ })
+ end)
+
+ it('in tabline on filler space moves tab to the end', function()
+ feed_command('%delete')
+ insert('this is foo')
+ feed_command('silent file foo | tabnew | file bar')
+ insert('this is bar')
+ screen:expect([[
+ {tab: + foo }{sel: + bar }{fill: }{tab:X}|
+ this is ba^r |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ feed('<LeftMouse><4,0>')
+ screen:expect([[
+ {sel: + foo }{tab: + bar }{fill: }{tab:X}|
+ this is fo^o |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ feed('<LeftDrag><14,0>')
+ screen:expect([[
+ {tab: + bar }{sel: + foo }{fill: }{tab:X}|
+ this is fo^o |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ end)
+
+ it('in tabline to the left moves tab left', function()
+ if helpers.skip_fragile(pending,
+ os.getenv("TRAVIS") and (helpers.os_name() == "osx"
+ or os.getenv("CLANG_SANITIZER") == "ASAN_UBSAN")) -- #4874
+ then
+ return
+ end
+
+ feed_command('%delete')
+ insert('this is foo')
+ feed_command('silent file foo | tabnew | file bar')
+ insert('this is bar')
+ screen:expect([[
+ {tab: + foo }{sel: + bar }{fill: }{tab:X}|
+ this is ba^r |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ feed('<LeftMouse><11,0>')
+ screen:expect{grid=[[
+ {tab: + foo }{sel: + bar }{fill: }{tab:X}|
+ this is ba^r |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]], unchanged=true}
+ feed('<LeftDrag><6,0>')
+ screen:expect([[
+ {sel: + bar }{tab: + foo }{fill: }{tab:X}|
+ this is ba^r |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ end)
+
+ it('in tabline to the right moves tab right', function()
+ feed_command('%delete')
+ insert('this is foo')
+ feed_command('silent file foo | tabnew | file bar')
+ insert('this is bar')
+ screen:expect([[
+ {tab: + foo }{sel: + bar }{fill: }{tab:X}|
+ this is ba^r |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ feed('<LeftMouse><4,0>')
+ screen:expect([[
+ {sel: + foo }{tab: + bar }{fill: }{tab:X}|
+ this is fo^o |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ feed('<LeftDrag><7,0>')
+ screen:expect([[
+ {tab: + bar }{sel: + foo }{fill: }{tab:X}|
+ this is fo^o |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ end)
+
+ it('out of tabline under filler space moves tab to the end', function()
+ feed_command('%delete')
+ insert('this is foo')
+ feed_command('silent file foo | tabnew | file bar')
+ insert('this is bar')
+ screen:expect([[
+ {tab: + foo }{sel: + bar }{fill: }{tab:X}|
+ this is ba^r |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ feed('<LeftMouse><4,0>')
+ screen:expect([[
+ {sel: + foo }{tab: + bar }{fill: }{tab:X}|
+ this is fo^o |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ feed('<LeftDrag><4,1>')
+ screen:expect{grid=[[
+ {sel: + foo }{tab: + bar }{fill: }{tab:X}|
+ this is fo^o |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]], unchanged=true}
+ feed('<LeftDrag><14,1>')
+ screen:expect([[
+ {tab: + bar }{sel: + foo }{fill: }{tab:X}|
+ this is fo^o |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ end)
+
+ it('out of tabline to the left moves tab left', function()
+ feed_command('%delete')
+ insert('this is foo')
+ feed_command('silent file foo | tabnew | file bar')
+ insert('this is bar')
+ screen:expect([[
+ {tab: + foo }{sel: + bar }{fill: }{tab:X}|
+ this is ba^r |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ feed('<LeftMouse><11,0>')
+ screen:expect{grid=[[
+ {tab: + foo }{sel: + bar }{fill: }{tab:X}|
+ this is ba^r |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]], unchanged=true}
+ feed('<LeftDrag><11,1>')
+ screen:expect{grid=[[
+ {tab: + foo }{sel: + bar }{fill: }{tab:X}|
+ this is ba^r |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]], unchanged=true}
+ feed('<LeftDrag><6,1>')
+ screen:expect([[
+ {sel: + bar }{tab: + foo }{fill: }{tab:X}|
+ this is ba^r |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ end)
+
+ it('out of tabline to the right moves tab right', function()
+ feed_command('%delete')
+ insert('this is foo')
+ feed_command('silent file foo | tabnew | file bar')
+ insert('this is bar')
+ screen:expect([[
+ {tab: + foo }{sel: + bar }{fill: }{tab:X}|
+ this is ba^r |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ feed('<LeftMouse><4,0>')
+ screen:expect([[
+ {sel: + foo }{tab: + bar }{fill: }{tab:X}|
+ this is fo^o |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ feed('<LeftDrag><4,1>')
+ screen:expect{grid=[[
+ {sel: + foo }{tab: + bar }{fill: }{tab:X}|
+ this is fo^o |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]], unchanged=true}
+ feed('<LeftDrag><7,1>')
+ screen:expect([[
+ {tab: + bar }{sel: + foo }{fill: }{tab:X}|
+ this is fo^o |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ end)
+ end)
+
describe('tabline', function()
- local tab_attrs = {
- tab = { background=Screen.colors.LightGrey, underline=true },
- sel = { bold=true },
- fill = { reverse=true }
- }
+ before_each(function()
+ screen:set_default_attr_ids( {
+ [0] = {bold=true, foreground=Screen.colors.Blue},
+ tab = { background=Screen.colors.LightGrey, underline=true },
+ sel = { bold=true },
+ fill = { reverse=true }
+ })
+ end)
it('left click in default tabline (position 4) switches to tab', function()
- execute('%delete')
+ feed_command('%delete')
insert('this is foo')
- execute('silent file foo | tabnew | file bar')
+ feed_command('silent file foo | tabnew | file bar')
insert('this is bar')
screen:expect([[
{tab: + foo }{sel: + bar }{fill: }{tab:X}|
this is ba^r |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
|
- ]], tab_attrs)
+ ]])
feed('<LeftMouse><4,0>')
screen:expect([[
{sel: + foo }{tab: + bar }{fill: }{tab:X}|
this is fo^o |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
|
- ]], tab_attrs)
+ ]])
end)
it('left click in default tabline (position 24) closes tab', function()
meths.set_option('hidden', true)
- execute('%delete')
+ feed_command('%delete')
insert('this is foo')
- execute('silent file foo | tabnew | file bar')
+ feed_command('silent file foo | tabnew | file bar')
insert('this is bar')
screen:expect([[
{tab: + foo }{sel: + bar }{fill: }{tab:X}|
this is ba^r |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
|
- ]], tab_attrs)
+ ]])
feed('<LeftMouse><24,0>')
screen:expect([[
this is fo^o |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
|
- ]], tab_attrs)
+ ]])
end)
it('double click in default tabline (position 4) opens new tab', function()
meths.set_option('hidden', true)
- execute('%delete')
+ feed_command('%delete')
insert('this is foo')
- execute('silent file foo | tabnew | file bar')
+ feed_command('silent file foo | tabnew | file bar')
insert('this is bar')
screen:expect([[
{tab: + foo }{sel: + bar }{fill: }{tab:X}|
this is ba^r |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
|
- ]], tab_attrs)
+ ]])
feed('<2-LeftMouse><4,0>')
screen:expect([[
{sel: Name] }{tab: + foo + bar }{fill: }{tab:X}|
^ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
|
- ]], tab_attrs)
+ ]])
end)
describe('%@ label', function()
before_each(function()
- execute([[
+ feed_command([[
function Test(...)
let g:reply = a:000
return copy(a:000) " Check for memory leaks: return should be freed
endfunction
]])
- execute([[
+ feed_command([[
function Test2(...)
return call('Test', a:000 + [2])
endfunction
@@ -158,9 +427,9 @@ describe('Mouse input', function()
{fill:test-test2 }|
mouse |
support and selectio^n |
- ~ |
+ {0:~ }|
|
- ]], tab_attrs)
+ ]])
meths.set_var('reply', {})
end)
@@ -216,7 +485,7 @@ describe('Mouse input', function()
testing |
mo^use |
support and selection |
- ~ |
+ {0:~ }|
|
]])
feed('<LeftDrag><4,1>')
@@ -224,7 +493,7 @@ describe('Mouse input', function()
testing |
mo{1:us}^e |
support and selection |
- ~ |
+ {0:~ }|
{2:-- VISUAL --} |
]])
feed('<LeftDrag><2,2>')
@@ -232,7 +501,7 @@ describe('Mouse input', function()
testing |
mo{1:use}{3: } |
{1:su}^pport and selection |
- ~ |
+ {0:~ }|
{2:-- VISUAL --} |
]])
feed('<LeftDrag><0,0>')
@@ -240,46 +509,47 @@ describe('Mouse input', function()
^t{1:esting}{3: } |
{1:mou}se |
support and selection |
- ~ |
+ {0:~ }|
{2:-- VISUAL --} |
]])
end)
it('left drag changes visual selection after tab click', function()
- local tab_attrs = {
+ screen:set_default_attr_ids({
+ [0] = {bold=true, foreground=Screen.colors.Blue},
tab = { background=Screen.colors.LightGrey, underline=true },
sel = { bold=true },
fill = { reverse=true },
vis = { background=Screen.colors.LightGrey }
- }
- execute('silent file foo | tabnew | file bar')
+ })
+ feed_command('silent file foo | tabnew | file bar')
insert('this is bar')
- execute('tabprevious') -- go to first tab
+ feed_command('tabprevious') -- go to first tab
screen:expect([[
{sel: + foo }{tab: + bar }{fill: }{tab:X}|
mouse |
support and selectio^n |
- ~ |
- |
- ]], tab_attrs)
+ {0:~ }|
+ :tabprevious |
+ ]])
feed('<LeftMouse><10,0><LeftRelease>') -- go to second tab
helpers.wait()
feed('<LeftMouse><0,1>')
screen:expect([[
{tab: + foo }{sel: + bar }{fill: }{tab:X}|
^this is bar |
- ~ |
- ~ |
- |
- ]], tab_attrs)
+ {0:~ }|
+ {0:~ }|
+ :tabprevious |
+ ]])
feed('<LeftDrag><4,1>')
screen:expect([[
{tab: + foo }{sel: + bar }{fill: }{tab:X}|
{vis:this}^ is bar |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
{sel:-- VISUAL --} |
- ]], tab_attrs)
+ ]])
end)
it('two clicks will select the word and enter VISUAL', function()
@@ -288,7 +558,7 @@ describe('Mouse input', function()
testing |
mouse |
{1:suppor}^t and selection |
- ~ |
+ {0:~ }|
{2:-- VISUAL --} |
]])
end)
@@ -299,7 +569,7 @@ describe('Mouse input', function()
testing |
mouse |
{1:su}^p{1:port and selection}{3: } |
- ~ |
+ {0:~ }|
{2:-- VISUAL LINE --} |
]])
end)
@@ -310,7 +580,7 @@ describe('Mouse input', function()
testing |
mouse |
su^pport and selection |
- ~ |
+ {0:~ }|
{2:-- VISUAL BLOCK --} |
]])
end)
@@ -321,7 +591,7 @@ describe('Mouse input', function()
^testing |
mouse |
support and selection |
- ~ |
+ {0:~ }|
|
]])
feed('<RightMouse><2,2>')
@@ -329,7 +599,7 @@ describe('Mouse input', function()
{1:testing}{3: } |
{1:mouse}{3: } |
{1:su}^pport and selection |
- ~ |
+ {0:~ }|
{2:-- VISUAL --} |
]])
end)
@@ -360,79 +630,78 @@ describe('Mouse input', function()
mouse scrolling
]])
screen:try_resize(53, 14)
- execute('sp', 'vsp')
- screen:set_default_attr_ignore( {{bold=true, foreground=hlgroup_colors.NonText},
- {reverse=true}, {bold=true, reverse=true}} )
+ feed_command('sp', 'vsp')
screen:expect([[
- lines |lines |
- to |to |
- test |test |
- mouse scrolling |mouse scrolling |
- ^ | |
- ~ |~ |
- [No Name] [+] [No Name] [+] |
+ lines {4:โ”‚}lines |
+ to {4:โ”‚}to |
+ test {4:โ”‚}test |
+ mouse scrolling {4:โ”‚}mouse scrolling |
+ ^ {4:โ”‚} |
+ {0:~ }{4:โ”‚}{0:~ }|
+ {5:[No Name] [+] }{4:[No Name] [+] }|
to |
test |
mouse scrolling |
|
- ~ |
- [No Name] [+] |
+ {0:~ }|
+ {4:[No Name] [+] }|
:vsp |
]])
- feed('<MouseUp><0,0>')
+ feed('<ScrollWheelDown><0,0>')
screen:expect([[
- mouse scrolling |lines |
- ^ |to |
- ~ |test |
- ~ |mouse scrolling |
- ~ | |
- ~ |~ |
- [No Name] [+] [No Name] [+] |
+ mouse scrolling {4:โ”‚}lines |
+ ^ {4:โ”‚}to |
+ {0:~ }{4:โ”‚}test |
+ {0:~ }{4:โ”‚}mouse scrolling |
+ {0:~ }{4:โ”‚} |
+ {0:~ }{4:โ”‚}{0:~ }|
+ {5:[No Name] [+] }{4:[No Name] [+] }|
to |
test |
mouse scrolling |
|
- ~ |
- [No Name] [+] |
- |
+ {0:~ }|
+ {4:[No Name] [+] }|
+ :vsp |
]])
- feed('<MouseDown><27,0>')
+ feed('<ScrollWheelUp><27,0>')
screen:expect([[
- mouse scrolling |text |
- ^ |with |
- ~ |many |
- ~ |lines |
- ~ |to |
- ~ |test |
- [No Name] [+] [No Name] [+] |
+ mouse scrolling {4:โ”‚}text |
+ ^ {4:โ”‚}with |
+ {0:~ }{4:โ”‚}many |
+ {0:~ }{4:โ”‚}lines |
+ {0:~ }{4:โ”‚}to |
+ {0:~ }{4:โ”‚}test |
+ {5:[No Name] [+] }{4:[No Name] [+] }|
to |
test |
mouse scrolling |
|
- ~ |
- [No Name] [+] |
- |
+ {0:~ }|
+ {4:[No Name] [+] }|
+ :vsp |
]])
- feed('<MouseDown><27,7><MouseDown>')
+ feed('<ScrollWheelUp><27,7><ScrollWheelUp>')
screen:expect([[
- mouse scrolling |text |
- ^ |with |
- ~ |many |
- ~ |lines |
- ~ |to |
- ~ |test |
- [No Name] [+] [No Name] [+] |
+ mouse scrolling {4:โ”‚}text |
+ ^ {4:โ”‚}with |
+ {0:~ }{4:โ”‚}many |
+ {0:~ }{4:โ”‚}lines |
+ {0:~ }{4:โ”‚}to |
+ {0:~ }{4:โ”‚}test |
+ {5:[No Name] [+] }{4:[No Name] [+] }|
Inserting |
text |
with |
many |
lines |
- [No Name] [+] |
- |
+ {4:[No Name] [+] }|
+ :vsp |
]])
end)
it('horizontal scrolling', function()
+ command('set sidescroll=0')
feed("<esc>:set nowrap<cr>")
feed("a <esc>20Ab<esc>")
@@ -440,7 +709,7 @@ describe('Mouse input', function()
|
|
bbbbbbbbbbbbbbb^b |
- ~ |
+ {0:~ }|
|
]])
@@ -449,7 +718,7 @@ describe('Mouse input', function()
|
|
n bbbbbbbbbbbbbbbbbbb^b |
- ~ |
+ {0:~ }|
|
]])
@@ -458,8 +727,572 @@ describe('Mouse input', function()
g |
|
^t and selection bbbbbbbbb|
- ~ |
+ {0:~ }|
|
]])
end)
+
+ describe('on concealed text', function()
+ -- Helpful for reading the test expectations:
+ -- :match Error /\^/
+
+ before_each(function()
+ screen:try_resize(25, 7)
+ screen:set_default_attr_ids({
+ [0] = {bold=true, foreground=Screen.colors.Blue},
+ c = { foreground = Screen.colors.LightGrey, background = Screen.colors.DarkGray },
+ sm = {bold = true},
+ })
+ feed('ggdG')
+
+ feed_command('set concealcursor=ni')
+ feed_command('set nowrap')
+ feed_command('set shiftwidth=2 tabstop=4 list listchars=tab:>-')
+ feed_command('syntax match NonText "\\*" conceal')
+ feed_command('syntax match NonText "cats" conceal cchar=X')
+ feed_command('syntax match NonText "x" conceal cchar=>')
+
+ -- First column is there to retain the tabs.
+ insert([[
+ |Section *t1*
+ | *t2* *t3* *t4*
+ |x ็งใฏ็ŒซใŒๅคงๅฅฝใ *cats* โœจ๐Ÿˆโœจ
+ ]])
+
+ feed('gg<c-v>Gxgg')
+ end)
+
+ it('(level 1) click on non-wrapped lines', function()
+ feed_command('let &conceallevel=1', 'echo')
+
+ feed('<esc><LeftMouse><0,0>')
+ screen:expect([[
+ ^Section{0:>>--->--->---}{c: }t1{c: } |
+ {0:>--->--->---} {c: }t2{c: } {c: }t3{c: } {c: }|
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c: X } {0:>}|
+ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ feed('<esc><LeftMouse><1,0>')
+ screen:expect([[
+ S^ection{0:>>--->--->---}{c: }t1{c: } |
+ {0:>--->--->---} {c: }t2{c: } {c: }t3{c: } {c: }|
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c: X } {0:>}|
+ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ feed('<esc><LeftMouse><21,0>')
+ screen:expect([[
+ Section{0:>>--->--->---}{c: }^t1{c: } |
+ {0:>--->--->---} {c: }t2{c: } {c: }t3{c: } {c: }|
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c: X } {0:>}|
+ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ feed('<esc><LeftMouse><21,1>')
+ screen:expect([[
+ Section{0:>>--->--->---}{c: }t1{c: } |
+ {0:>--->--->---} {c: }t2{c: } {c: }t^3{c: } {c: }|
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c: X } {0:>}|
+ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ feed('<esc><LeftMouse><0,2>')
+ screen:expect([[
+ Section{0:>>--->--->---}{c: }t1{c: } |
+ {0:>--->--->---} {c: }t2{c: } {c: }t3{c: } {c: }|
+ {c:^>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c: X } {0:>}|
+ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ feed('<esc><LeftMouse><7,2>')
+ screen:expect([[
+ Section{0:>>--->--->---}{c: }t1{c: } |
+ {0:>--->--->---} {c: }t2{c: } {c: }t3{c: } {c: }|
+ {c:>} ็งใฏ^็ŒซใŒๅคงๅฅฝใ{0:>---}{c: X } {0:>}|
+ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ feed('<esc><LeftMouse><21,2>')
+ screen:expect([[
+ Section{0:>>--->--->---}{c: }t1{c: } |
+ {0:>--->--->---} {c: }t2{c: } {c: }t3{c: } {c: }|
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c: ^X } {0:>}|
+ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ end) -- level 1 - non wrapped
+
+ it('(level 1) click on wrapped lines', function()
+ feed_command('let &conceallevel=1', 'let &wrap=1', 'echo')
+
+ feed('<esc><LeftMouse><24,1>')
+ screen:expect([[
+ Section{0:>>--->--->---}{c: }t1{c: } |
+ {0:>--->--->---} {c: }t2{c: } {c: }t3{c: } {c:^ }|
+ t4{c: } |
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c: X} |
+ {c: } โœจ๐Ÿˆโœจ |
+ |
+ |
+ ]])
+
+ feed('<esc><LeftMouse><0,2>')
+ screen:expect([[
+ Section{0:>>--->--->---}{c: }t1{c: } |
+ {0:>--->--->---} {c: }t2{c: } {c: }t3{c: } {c: }|
+ ^t4{c: } |
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c: X} |
+ {c: } โœจ๐Ÿˆโœจ |
+ |
+ |
+ ]])
+
+ feed('<esc><LeftMouse><8,3>')
+ screen:expect([[
+ Section{0:>>--->--->---}{c: }t1{c: } |
+ {0:>--->--->---} {c: }t2{c: } {c: }t3{c: } {c: }|
+ t4{c: } |
+ {c:>} ็งใฏ็Œซ^ใŒๅคงๅฅฝใ{0:>---}{c: X} |
+ {c: } โœจ๐Ÿˆโœจ |
+ |
+ |
+ ]])
+
+ feed('<esc><LeftMouse><21,3>')
+ screen:expect([[
+ Section{0:>>--->--->---}{c: }t1{c: } |
+ {0:>--->--->---} {c: }t2{c: } {c: }t3{c: } {c: }|
+ t4{c: } |
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c: ^X} |
+ {c: } โœจ๐Ÿˆโœจ |
+ |
+ |
+ ]])
+
+ feed('<esc><LeftMouse><4,4>')
+ screen:expect([[
+ Section{0:>>--->--->---}{c: }t1{c: } |
+ {0:>--->--->---} {c: }t2{c: } {c: }t3{c: } {c: }|
+ t4{c: } |
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c: X} |
+ {c: } โœจ^๐Ÿˆโœจ |
+ |
+ |
+ ]])
+ end) -- level 1 - wrapped
+
+
+ it('(level 2) click on non-wrapped lines', function()
+ feed_command('let &conceallevel=2', 'echo')
+
+ feed('<esc><LeftMouse><20,0>')
+ screen:expect([[
+ Section{0:>>--->--->---}^t1 |
+ {0:>--->--->---} t2 t3 t4 |
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c:X} โœจ{0:>}|
+ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ feed('<esc><LeftMouse><14,1>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} ^t2 t3 t4 |
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c:X} โœจ{0:>}|
+ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ feed('<esc><LeftMouse><18,1>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t^3 t4 |
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c:X} โœจ{0:>}|
+ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ feed('<esc><LeftMouse><0,2>') -- Weirdness
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t3 t4 |
+ {c:^>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c:X} โœจ{0:>}|
+ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ feed('<esc><LeftMouse><8,2>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t3 t4 |
+ {c:>} ็งใฏ็Œซ^ใŒๅคงๅฅฝใ{0:>---}{c:X} โœจ{0:>}|
+ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ feed('<esc><LeftMouse><20,2>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t3 t4 |
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c:^X} โœจ{0:>}|
+ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ end) -- level 2 - non wrapped
+
+ it('(level 2) click on non-wrapped lines (insert mode)', function()
+ feed_command('let &conceallevel=2', 'echo')
+
+ feed('<esc>i<LeftMouse><20,0>')
+ screen:expect([[
+ Section{0:>>--->--->---}^t1 |
+ {0:>--->--->---} t2 t3 t4 |
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c:X} โœจ{0:>}|
+ |
+ {0:~ }|
+ {0:~ }|
+ {sm:-- INSERT --} |
+ ]])
+
+ feed('<LeftMouse><14,1>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} ^t2 t3 t4 |
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c:X} โœจ{0:>}|
+ |
+ {0:~ }|
+ {0:~ }|
+ {sm:-- INSERT --} |
+ ]])
+
+ feed('<LeftMouse><18,1>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t^3 t4 |
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c:X} โœจ{0:>}|
+ |
+ {0:~ }|
+ {0:~ }|
+ {sm:-- INSERT --} |
+ ]])
+
+ feed('<LeftMouse><0,2>') -- Weirdness
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t3 t4 |
+ {c:^>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c:X} โœจ{0:>}|
+ |
+ {0:~ }|
+ {0:~ }|
+ {sm:-- INSERT --} |
+ ]])
+
+ feed('<LeftMouse><8,2>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t3 t4 |
+ {c:>} ็งใฏ็Œซ^ใŒๅคงๅฅฝใ{0:>---}{c:X} โœจ{0:>}|
+ |
+ {0:~ }|
+ {0:~ }|
+ {sm:-- INSERT --} |
+ ]])
+
+ feed('<LeftMouse><20,2>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t3 t4 |
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c:^X} โœจ{0:>}|
+ |
+ {0:~ }|
+ {0:~ }|
+ {sm:-- INSERT --} |
+ ]])
+ end) -- level 2 - non wrapped (insert mode)
+
+ it('(level 2) click on wrapped lines', function()
+ feed_command('let &conceallevel=2', 'let &wrap=1', 'echo')
+
+ feed('<esc><LeftMouse><20,0>')
+ screen:expect([[
+ Section{0:>>--->--->---}^t1 |
+ {0:>--->--->---} t2 t3 |
+ t4 |
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c:X} |
+ โœจ๐Ÿˆโœจ |
+ |
+ |
+ ]])
+
+ feed('<esc><LeftMouse><14,1>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} ^t2 t3 |
+ t4 |
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c:X} |
+ โœจ๐Ÿˆโœจ |
+ |
+ |
+ ]])
+
+ feed('<esc><LeftMouse><18,1>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t^3 |
+ t4 |
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c:X} |
+ โœจ๐Ÿˆโœจ |
+ |
+ |
+ ]])
+
+ -- NOTE: The click would ideally be on the 't' in 't4', but wrapping
+ -- caused the invisible '*' right before 't4' to remain on the previous
+ -- screen line. This is being treated as expected because fixing this is
+ -- out of scope for mouse clicks. Should the wrapping behavior of
+ -- concealed characters change in the future, this case should be
+ -- reevaluated.
+ feed('<esc><LeftMouse><0,2>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t3 ^ |
+ t4 |
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c:X} |
+ โœจ๐Ÿˆโœจ |
+ |
+ |
+ ]])
+
+ feed('<esc><LeftMouse><1,2>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t3 |
+ t^4 |
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c:X} |
+ โœจ๐Ÿˆโœจ |
+ |
+ |
+ ]])
+
+ feed('<esc><LeftMouse><0,3>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t3 |
+ t4 |
+ {c:^>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c:X} |
+ โœจ๐Ÿˆโœจ |
+ |
+ |
+ ]])
+
+ feed('<esc><LeftMouse><20,3>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t3 |
+ t4 |
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c:^X} |
+ โœจ๐Ÿˆโœจ |
+ |
+ |
+ ]])
+
+ feed('<esc><LeftMouse><1,4>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t3 |
+ t4 |
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c:X} |
+ ^โœจ๐Ÿˆโœจ |
+ |
+ |
+ ]])
+
+ feed('<esc><LeftMouse><5,4>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t3 |
+ t4 |
+ {c:>} ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>---}{c:X} |
+ โœจ๐Ÿˆ^โœจ |
+ |
+ |
+ ]])
+ end) -- level 2 - wrapped
+
+
+ it('(level 3) click on non-wrapped lines', function()
+ feed_command('let &conceallevel=3', 'echo')
+
+ feed('<esc><LeftMouse><0,2>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t3 t4 |
+ ^ ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>----} โœจ๐Ÿˆ|
+ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ feed('<esc><LeftMouse><1,2>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t3 t4 |
+ ^็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>----} โœจ๐Ÿˆ|
+ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ feed('<esc><LeftMouse><13,2>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t3 t4 |
+ ็งใฏ็ŒซใŒๅคงๅฅฝ^ใ{0:>----} โœจ๐Ÿˆ|
+ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ feed('<esc><LeftMouse><20,2>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t3 t4 |
+ ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>----}^ โœจ๐Ÿˆ|
+ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ end) -- level 3 - non wrapped
+
+ it('(level 3) click on wrapped lines', function()
+ feed_command('let &conceallevel=3', 'let &wrap=1', 'echo')
+
+ feed('<esc><LeftMouse><14,1>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} ^t2 t3 |
+ t4 |
+ ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>----} |
+ โœจ๐Ÿˆโœจ |
+ |
+ |
+ ]])
+
+ feed('<esc><LeftMouse><18,1>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t^3 |
+ t4 |
+ ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>----} |
+ โœจ๐Ÿˆโœจ |
+ |
+ |
+ ]])
+
+ feed('<esc><LeftMouse><1,2>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t3 |
+ t^4 |
+ ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>----} |
+ โœจ๐Ÿˆโœจ |
+ |
+ |
+ ]])
+
+ feed('<esc><LeftMouse><0,3>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t3 |
+ t4 |
+ ^ ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>----} |
+ โœจ๐Ÿˆโœจ |
+ |
+ |
+ ]])
+
+ feed('<esc><LeftMouse><20,3>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t3 |
+ t4 |
+ ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>----}^ |
+ โœจ๐Ÿˆโœจ |
+ |
+ |
+ ]])
+
+ feed('<esc><LeftMouse><1,4>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t3 |
+ t4 |
+ ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>----} |
+ ^โœจ๐Ÿˆโœจ |
+ |
+ |
+ ]])
+
+ feed('<esc><LeftMouse><3,4>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t3 |
+ t4 |
+ ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>----} |
+ โœจ^๐Ÿˆโœจ |
+ |
+ |
+ ]])
+
+ feed('<esc><LeftMouse><5,4>')
+ screen:expect([[
+ Section{0:>>--->--->---}t1 |
+ {0:>--->--->---} t2 t3 |
+ t4 |
+ ็งใฏ็ŒซใŒๅคงๅฅฝใ{0:>----} |
+ โœจ๐Ÿˆ^โœจ |
+ |
+ |
+ ]])
+
+ end) -- level 3 - wrapped
+ end)
end)
diff --git a/test/functional/ui/multibyte_spec.lua b/test/functional/ui/multibyte_spec.lua
new file mode 100644
index 0000000000..3e63353ad2
--- /dev/null
+++ b/test/functional/ui/multibyte_spec.lua
@@ -0,0 +1,185 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+local clear = helpers.clear
+local command = helpers.command
+local feed = helpers.feed
+local feed_command = helpers.feed_command
+local insert = helpers.insert
+local funcs = helpers.funcs
+
+describe("multibyte rendering", function()
+ local screen
+ before_each(function()
+ clear()
+ screen = Screen.new(60, 6)
+ screen:attach({rgb=true})
+ screen:set_default_attr_ids({
+ [1] = {bold = true, foreground = Screen.colors.Blue1},
+ [2] = {background = Screen.colors.WebGray},
+ [3] = {background = Screen.colors.LightMagenta},
+ [4] = {bold = true},
+ })
+ end)
+
+ after_each(function()
+ screen:detach()
+ end)
+
+ it("works with composed char at start of line", function()
+ insert([[
+ ฬŠ
+ x]])
+ feed("gg")
+ -- verify the modifier infact is alone
+ feed_command("ascii")
+ screen:expect([[
+ ^ ฬŠ |
+ x |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ < ฬŠ> 778, Hex 030a, Octal 1412 |
+ ]])
+
+ -- a char inserted before will spontaneously merge with it
+ feed("ia<esc>")
+ feed_command("ascii")
+ screen:expect([[
+ ^aฬŠ |
+ x |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ <a> 97, Hex 61, Octal 141 < ฬŠ> 778, Hex 030a, Octal 1412 |
+ ]])
+ end)
+
+ it('works with doublewidth char at end of line', function()
+ feed('58a <esc>a้ฆฌ<esc>')
+ screen:expect([[
+ ^้ฆฌ|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+
+ feed('i <esc>')
+ screen:expect([[
+ ^ {1:>}|
+ ้ฆฌ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+
+ feed('l')
+ screen:expect([[
+ {1:>}|
+ ^้ฆฌ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+ end)
+
+ it('clears left half of double-width char when right half is overdrawn', function()
+ feed('o-้ฆฌ<esc>ggiab ')
+ screen:expect([[
+ ab ^ |
+ -้ฆฌ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4:-- INSERT --} |
+ ]])
+
+ -- check double-with char is temporarily hidden when overlapped
+ funcs.complete(4, {'xx', 'yy'})
+ screen:expect([[
+ ab xx^ |
+ - {2: xx } |
+ {1:~ }{3: yy }{1: }|
+ {1:~ }|
+ {1:~ }|
+ {4:-- INSERT --} |
+ ]])
+
+ -- check it is properly restored
+ feed('z')
+ screen:expect([[
+ ab xxz^ |
+ -้ฆฌ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4:-- INSERT --} |
+ ]])
+ end)
+end)
+
+describe('multibyte rendering: statusline', function()
+ local screen
+
+ before_each(function()
+ clear()
+ screen = Screen.new(40, 4)
+ screen:attach()
+ command('set laststatus=2')
+ end)
+
+ after_each(function()
+ screen:detach()
+ end)
+
+ it('last char shows (multibyte)', function()
+ command('set statusline=ไฝ ๅฅฝ')
+ screen:expect([[
+ ^ |
+ ~ |
+ ไฝ ๅฅฝ |
+ |
+ ]])
+ end)
+ it('last char shows (single byte)', function()
+ command('set statusline=abc')
+ screen:expect([[
+ ^ |
+ ~ |
+ abc |
+ |
+ ]])
+ end)
+ it('unicode control points', function()
+ command('set statusline=ยŸ')
+ screen:expect([[
+ ^ |
+ ~ |
+ <9f> |
+ |
+ ]])
+ end)
+ it('MAX_MCO (6) unicode combination points', function()
+ command('set statusline=oแทฐโƒฏฬธโƒโƒงโƒ')
+ -- o + U+1DF0 + U+20EF + U+0338 + U+20D0 + U+20E7 + U+20DD
+ screen:expect([[
+ ^ |
+ ~ |
+ oแทฐโƒฏฬธโƒโƒงโƒ |
+ |
+ ]])
+ end)
+ it('non-printable followed by MAX_MCO unicode combination points', function()
+ command('set statusline=ยŸแทฐโƒฏฬธโƒโƒงโƒ')
+ -- U+9F + U+1DF0 + U+20EF + U+0338 + U+20D0 + U+20E7 + U+20DD
+ screen:expect([[
+ ^ |
+ ~ |
+ <9f><1df0><20ef><0338><20d0><20e7><20dd>|
+ |
+ ]])
+ end)
+end)
diff --git a/test/functional/ui/multigrid_spec.lua b/test/functional/ui/multigrid_spec.lua
new file mode 100644
index 0000000000..a5d4e34000
--- /dev/null
+++ b/test/functional/ui/multigrid_spec.lua
@@ -0,0 +1,1524 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+local clear = helpers.clear
+local feed, command, insert = helpers.feed, helpers.command, helpers.insert
+local eq = helpers.eq
+
+
+describe('multigrid screen', function()
+ local screen
+
+ before_each(function()
+ clear{headless=false, args={'--cmd', 'set laststatus=2'}}
+ screen = Screen.new(53,14)
+ screen:attach({ext_multigrid=true})
+ screen:set_default_attr_ids({
+ [1] = {bold = true, foreground = Screen.colors.Blue1},
+ [2] = {foreground = Screen.colors.Magenta},
+ [3] = {foreground = Screen.colors.Brown, bold = true},
+ [4] = {foreground = Screen.colors.SlateBlue},
+ [5] = {bold = true, foreground = Screen.colors.SlateBlue},
+ [6] = {foreground = Screen.colors.Cyan4},
+ [7] = {bold = true},
+ [8] = {underline = true, bold = true, foreground = Screen.colors.SlateBlue},
+ [9] = {foreground = Screen.colors.SlateBlue, underline = true},
+ [10] = {foreground = Screen.colors.Red},
+ [11] = {bold = true, reverse = true},
+ [12] = {reverse = true},
+ [13] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.LightGrey},
+ [14] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
+ [15] = {bold = true, foreground = Screen.colors.SeaGreen4},
+ [16] = {background = Screen.colors.LightGrey, underline = true},
+ [17] = {background = Screen.colors.LightGrey, underline = true, bold = true, foreground = Screen.colors.Magenta},
+ [18] = {bold = true, foreground = Screen.colors.Magenta},
+ [19] = {foreground = Screen.colors.Brown},
+ })
+ end)
+
+ after_each(function()
+ screen:detach()
+ end)
+
+ it('default initial screen', function()
+ screen:expect([[
+ ## grid 1
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ {11:[No Name] }|
+ |
+ ## grid 2
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+ end)
+
+ it('positions windows correctly', function()
+ command('vsplit')
+ screen:expect([[
+ ## grid 1
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ {11:[No Name] }{12:[No Name] }|
+ |
+ ## grid 2
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]], nil, nil, function()
+ eq({
+ [2] = { win = 1000, startrow = 0, startcol = 27, width = 26, height = 12 },
+ [3] = { win = 1001, startrow = 0, startcol = 0, width = 26, height = 12 }
+ }, screen.win_position)
+ end)
+ command('wincmd l')
+ command('split')
+ screen:expect([[
+ ## grid 1
+ [3:--------------------------]{12:โ”‚}[4:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[4:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[4:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[4:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[4:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[4:--------------------------]|
+ [3:--------------------------]{12:โ”‚}{11:[No Name] }|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ {12:[No Name] [No Name] }|
+ |
+ ## grid 2
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 4
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]], nil, nil, function()
+ eq({
+ [2] = { win = 1000, startrow = 7, startcol = 27, width = 26, height = 5 },
+ [3] = { win = 1001, startrow = 0, startcol = 0, width = 26, height = 12 },
+ [4] = { win = 1002, startrow = 0, startcol = 27, width = 26, height = 6 }
+ }, screen.win_position)
+ end)
+ command('wincmd h')
+ command('q')
+ screen:expect([[
+ ## grid 1
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ {11:[No Name] }|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ {12:[No Name] }|
+ |
+ ## grid 2
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 4
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]], nil, nil, function()
+ eq({
+ [2] = { win = 1000, startrow = 7, startcol = 0, width = 53, height = 5 },
+ [4] = { win = 1002, startrow = 0, startcol = 0, width = 53, height = 6 }
+ }, screen.win_position)
+ end)
+ end)
+
+ describe('split', function ()
+ describe('horizontally', function ()
+ it('allocates grids', function ()
+ command('sp')
+ screen:expect([[
+ ## grid 1
+ [3:-----------------------------------------------------]|
+ [3:-----------------------------------------------------]|
+ [3:-----------------------------------------------------]|
+ [3:-----------------------------------------------------]|
+ [3:-----------------------------------------------------]|
+ [3:-----------------------------------------------------]|
+ {11:[No Name] }|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ {12:[No Name] }|
+ |
+ ## grid 2
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+ end)
+
+ it('resizes grids', function ()
+ command('sp')
+ command('resize 8')
+ screen:expect([[
+ ## grid 1
+ [3:-----------------------------------------------------]|
+ [3:-----------------------------------------------------]|
+ [3:-----------------------------------------------------]|
+ [3:-----------------------------------------------------]|
+ [3:-----------------------------------------------------]|
+ [3:-----------------------------------------------------]|
+ [3:-----------------------------------------------------]|
+ [3:-----------------------------------------------------]|
+ {11:[No Name] }|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ {12:[No Name] }|
+ |
+ ## grid 2
+ |
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+ end)
+
+ it('splits vertically', function()
+ command('sp')
+ command('vsp')
+ command('vsp')
+ screen:expect([[
+ ## grid 1
+ [5:--------------------]{12:โ”‚}[4:----------------]{12:โ”‚}[3:---------------]|
+ [5:--------------------]{12:โ”‚}[4:----------------]{12:โ”‚}[3:---------------]|
+ [5:--------------------]{12:โ”‚}[4:----------------]{12:โ”‚}[3:---------------]|
+ [5:--------------------]{12:โ”‚}[4:----------------]{12:โ”‚}[3:---------------]|
+ [5:--------------------]{12:โ”‚}[4:----------------]{12:โ”‚}[3:---------------]|
+ [5:--------------------]{12:โ”‚}[4:----------------]{12:โ”‚}[3:---------------]|
+ {11:[No Name] }{12:[No Name] [No Name] }|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ {12:[No Name] }|
+ |
+ ## grid 2
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 4
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 5
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+ insert('hello')
+ screen:expect([[
+ ## grid 1
+ [5:--------------------]{12:โ”‚}[4:----------------]{12:โ”‚}[3:---------------]|
+ [5:--------------------]{12:โ”‚}[4:----------------]{12:โ”‚}[3:---------------]|
+ [5:--------------------]{12:โ”‚}[4:----------------]{12:โ”‚}[3:---------------]|
+ [5:--------------------]{12:โ”‚}[4:----------------]{12:โ”‚}[3:---------------]|
+ [5:--------------------]{12:โ”‚}[4:----------------]{12:โ”‚}[3:---------------]|
+ [5:--------------------]{12:โ”‚}[4:----------------]{12:โ”‚}[3:---------------]|
+ {11:[No Name] [+] }{12:[No Name] [+] [No Name] [+] }|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ {12:[No Name] [+] }|
+ |
+ ## grid 2
+ hello |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ hello |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 4
+ hello |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 5
+ hell^o |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+ end)
+ it('closes splits', function ()
+ command('sp')
+ screen:expect([[
+ ## grid 1
+ [3:-----------------------------------------------------]|
+ [3:-----------------------------------------------------]|
+ [3:-----------------------------------------------------]|
+ [3:-----------------------------------------------------]|
+ [3:-----------------------------------------------------]|
+ [3:-----------------------------------------------------]|
+ {11:[No Name] }|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ {12:[No Name] }|
+ |
+ ## grid 2
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+ command('q')
+ screen:expect([[
+ ## grid 1
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ {11:[No Name] }|
+ |
+ ## grid 2
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+ end)
+ end)
+
+ describe('vertically', function ()
+ it('allocates grids', function ()
+ command('vsp')
+ screen:expect([[
+ ## grid 1
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ {11:[No Name] }{12:[No Name] }|
+ |
+ ## grid 2
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+ end)
+ it('resizes grids', function ()
+ command('vsp')
+ command('vertical resize 10')
+ -- see "Note 1" for info about why there are two vseps
+ screen:expect([[
+ ## grid 1
+ [3:----------]{12:โ”‚}[2:------------------------------------------]|
+ [3:----------]{12:โ”‚}[2:------------------------------------------]|
+ [3:----------]{12:โ”‚}[2:------------------------------------------]|
+ [3:----------]{12:โ”‚}[2:------------------------------------------]|
+ [3:----------]{12:โ”‚}[2:------------------------------------------]|
+ [3:----------]{12:โ”‚}[2:------------------------------------------]|
+ [3:----------]{12:โ”‚}[2:------------------------------------------]|
+ [3:----------]{12:โ”‚}[2:------------------------------------------]|
+ [3:----------]{12:โ”‚}[2:------------------------------------------]|
+ [3:----------]{12:โ”‚}[2:------------------------------------------]|
+ [3:----------]{12:โ”‚}[2:------------------------------------------]|
+ [3:----------]{12:โ”‚}[2:------------------------------------------]|
+ {11:<No Name] }{12:[No Name] }|
+ |
+ ## grid 2
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+ end)
+ it('splits horizontally', function ()
+ command('vsp')
+ command('sp')
+ screen:expect([[
+ ## grid 1
+ [4:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[2:--------------------------]|
+ {11:[No Name] }{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ {12:[No Name] [No Name] }|
+ |
+ ## grid 2
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 4
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+ insert('hello')
+ screen:expect([[
+ ## grid 1
+ [4:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[2:--------------------------]|
+ {11:[No Name] [+] }{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ {12:[No Name] [+] [No Name] [+] }|
+ |
+ ## grid 2
+ hello |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ hello |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 4
+ hell^o |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+ end)
+ it('closes splits', function ()
+ command('vsp')
+ screen:expect([[
+ ## grid 1
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ {11:[No Name] }{12:[No Name] }|
+ |
+ ## grid 2
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+ command('q')
+ screen:expect([[
+ ## grid 1
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ {11:[No Name] }|
+ |
+ ## grid 2
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+ end)
+ end)
+ end)
+
+ describe('on resize', function ()
+ it('rebuilds all grids', function ()
+ screen:try_resize(25, 6)
+ screen:expect([[
+ ## grid 1
+ [2:-------------------------]|
+ [2:-------------------------]|
+ [2:-------------------------]|
+ [2:-------------------------]|
+ {11:[No Name] }|
+ |
+ ## grid 2
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+ end)
+
+ it('has minimum width/height values', function()
+ screen:try_resize(1, 1)
+ screen:expect([[
+ ## grid 1
+ [2:------------]|
+ {11:[No Name] }|
+ |
+ ## grid 2
+ ^ |
+ ]])
+
+ feed('<esc>:ls')
+ screen:expect([[
+ ## grid 1
+ [2:------------]|
+ {11:[No Name] }|
+ :ls^ |
+ ## grid 2
+ |
+ ]])
+ end)
+ end)
+
+ describe('grid of smaller inner size', function()
+ it('is rendered correctly', function()
+ screen:try_resize_grid(2, 8, 5)
+ screen:expect([[
+ ## grid 1
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ {11:[No Name] }|
+ |
+ ## grid 2
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+ end)
+ end)
+
+ describe('grid of bigger inner size', function()
+ it('is rendered correctly', function()
+ screen:try_resize_grid(2, 80, 20)
+ screen:expect([[
+ ## grid 1
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ {11:[No Name] }|
+ |
+ ## grid 2
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+ end)
+ end)
+
+
+ describe('with resized grid', function()
+ before_each(function()
+ screen:try_resize_grid(2, 60, 20)
+ end)
+ it('gets written till grid width', function()
+ insert(('a'):rep(60).."\n")
+ screen:expect([[
+ ## grid 1
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ {11:[No Name] [+] }|
+ |
+ ## grid 2
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+ end)
+
+ it('wraps with grid width', function()
+ insert(('b'):rep(80).."\n")
+ screen:expect([[
+ ## grid 1
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ {11:[No Name] [+] }|
+ |
+ ## grid 2
+ bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
+ bbbbbbbbbbbbbbbbbbbb |
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+ end)
+
+ it('displays messages with default grid width', function()
+ command('echomsg "this is a very very very very very very very very'..
+ ' long message"')
+ screen:expect([[
+ ## grid 1
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ {11:[No Name] }|
+ this is a very very very...ry very very long message |
+ ## grid 2
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+ end)
+
+ it('creates folds with grid width', function()
+ insert('this is a fold\nthis is inside fold\nthis is outside fold')
+ feed('kzfgg')
+ screen:expect([[
+ ## grid 1
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ {11:[No Name] [+] }|
+ |
+ ## grid 2
+ {13:^+-- 2 lines: this is a foldยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท}|
+ this is outside fold |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+ end)
+ end)
+
+ it('multiline messages scroll over windows', function()
+ command('sp')
+ command('vsp')
+ screen:expect([[
+ ## grid 1
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ {11:[No Name] }{12:[No Name] }|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ {12:[No Name] }|
+ |
+ ## grid 2
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 4
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+
+ feed(":echoerr 'very' | echoerr 'much' | echoerr 'fail'<cr>")
+ screen:expect([[
+ ## grid 1
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ {11:[No Name] }{12:[No Name] }|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ {11: }|
+ {14:very} |
+ {14:much} |
+ {14:fail} |
+ {15:Press ENTER or type command to continue}^ |
+ ## grid 2
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 4
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+
+ feed('<cr>')
+ screen:expect([[
+ ## grid 1
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ {11:[No Name] }{12:[No Name] }|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ {12:[No Name] }|
+ |
+ ## grid 2
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 4
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+
+ command([[
+ func! ErrMsg()
+ for i in range(11)
+ echoerr "error ".i
+ endfor
+ endfunc]])
+ feed(":call ErrMsg()<cr>")
+ screen:expect([[
+ ## grid 1
+ {14:Error detected while processing function ErrMsg:} |
+ {19:line 2:} |
+ {14:error 0} |
+ {14:error 1} |
+ {14:error 2} |
+ {14:error 3} |
+ {14:error 4} |
+ {14:error 5} |
+ {14:error 6} |
+ {14:error 7} |
+ {14:error 8} |
+ {14:error 9} |
+ {14:error 10} |
+ {15:Press ENTER or type command to continue}^ |
+ ## grid 2
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 4
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+
+ feed("<c-c>")
+ screen:expect([[
+ ## grid 1
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ [4:--------------------------]{12:โ”‚}[3:--------------------------]|
+ {11:[No Name] }{12:[No Name] }|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ [2:-----------------------------------------------------]|
+ {12:[No Name] }|
+ |
+ ## grid 2
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 4
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+ end)
+
+ it('handles switich tabs', function()
+ command('vsp')
+ screen:expect([[
+ ## grid 1
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ {11:[No Name] }{12:[No Name] }|
+ |
+ ## grid 2
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+
+
+ command('tabnew')
+ -- note the old grids aren't resized yet
+ screen:expect([[
+ ## grid 1
+ {16: }{17:2}{16: [No Name] }{7: [No Name] }{12: }{16:X}|
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ {11:[No Name] }|
+ |
+ ## grid 2
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 4
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+
+ command('sp')
+ screen:expect([[
+ ## grid 1
+ {16: }{17:2}{16: [No Name] }{7: }{18:2}{7: [No Name] }{12: }{16:X}|
+ [5:-----------------------------------------------------]|
+ [5:-----------------------------------------------------]|
+ [5:-----------------------------------------------------]|
+ [5:-----------------------------------------------------]|
+ [5:-----------------------------------------------------]|
+ {11:[No Name] }|
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ {12:[No Name] }|
+ |
+ ## grid 2
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 4
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 5
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+
+ command('tabnext')
+ screen:expect([[
+ ## grid 1
+ {7: }{18:2}{7: [No Name] }{16: }{17:2}{16: [No Name] }{12: }{16:X}|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ {11:[No Name] }{12:[No Name] }|
+ |
+ ## grid 2
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 4
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 5
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+
+ command('tabnext')
+ screen:expect([[
+ ## grid 1
+ {16: }{17:2}{16: [No Name] }{7: }{18:2}{7: [No Name] }{12: }{16:X}|
+ [5:-----------------------------------------------------]|
+ [5:-----------------------------------------------------]|
+ [5:-----------------------------------------------------]|
+ [5:-----------------------------------------------------]|
+ [5:-----------------------------------------------------]|
+ {11:[No Name] }|
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ [4:-----------------------------------------------------]|
+ {12:[No Name] }|
+ |
+ ## grid 2
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 4
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 5
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+
+ command('tabclose')
+ screen:expect([[
+ ## grid 1
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ [3:--------------------------]{12:โ”‚}[2:--------------------------]|
+ {11:[No Name] }{12:[No Name] }|
+ |
+ ## grid 2
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]])
+ end)
+end)
diff --git a/test/functional/ui/options_spec.lua b/test/functional/ui/options_spec.lua
new file mode 100644
index 0000000000..c26fa5e29b
--- /dev/null
+++ b/test/functional/ui/options_spec.lua
@@ -0,0 +1,124 @@
+local global_helpers = require('test.helpers')
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+local clear = helpers.clear
+local command = helpers.command
+local eq = helpers.eq
+local shallowcopy = global_helpers.shallowcopy
+
+describe('ui receives option updates', function()
+ local screen
+
+ local function reset(opts, ...)
+ local defaults = {
+ ambiwidth='single',
+ arabicshape=true,
+ emoji=true,
+ guifont='',
+ guifontset='',
+ guifontwide='',
+ linespace=0,
+ showtabline=1,
+ termguicolors=false,
+ ext_cmdline=false,
+ ext_popupmenu=false,
+ ext_tabline=false,
+ ext_wildmenu=false,
+ ext_linegrid=false,
+ ext_hlstate=false,
+ ext_multigrid=false,
+ }
+
+ clear(...)
+ screen = Screen.new(20,5)
+ screen:attach(opts)
+ -- NB: UI test suite can be run in both "linegrid" and legacy grid mode.
+ -- In both cases check that the received value is the one requested.
+ defaults.ext_linegrid = screen._options.ext_linegrid or false
+ return defaults
+ end
+
+ after_each(function()
+ screen:detach()
+ end)
+
+ it("for defaults", function()
+ local expected = reset()
+ screen:expect(function()
+ eq(expected, screen.options)
+ end)
+ end)
+
+ it("when setting options", function()
+ local expected = reset()
+ local defaults = shallowcopy(expected)
+
+ command("set termguicolors")
+ expected.termguicolors = true
+ screen:expect(function()
+ eq(expected, screen.options)
+ end)
+
+ command("set guifont=Comic\\ Sans")
+ expected.guifont = "Comic Sans"
+ screen:expect(function()
+ eq(expected, screen.options)
+ end)
+
+ command("set showtabline=0")
+ expected.showtabline = 0
+ screen:expect(function()
+ eq(expected, screen.options)
+ end)
+
+ command("set linespace=13")
+ expected.linespace = 13
+ screen:expect(function()
+ eq(expected, screen.options)
+ end)
+
+ command("set linespace=-11")
+ expected.linespace = -11
+ screen:expect(function()
+ eq(expected, screen.options)
+ end)
+
+ command("set all&")
+ screen:expect(function()
+ eq(defaults, screen.options)
+ end)
+ end)
+
+ it('with UI extensions', function()
+ local expected = reset({ext_cmdline=true, ext_wildmenu=true})
+
+ expected.ext_cmdline = true
+ expected.ext_wildmenu = true
+ screen:expect(function()
+ eq(expected, screen.options)
+ end)
+
+ screen:set_option('ext_popupmenu', true)
+ expected.ext_popupmenu = true
+ screen:expect(function()
+ eq(expected, screen.options)
+ end)
+
+ screen:set_option('ext_wildmenu', false)
+ expected.ext_wildmenu = false
+ screen:expect(function()
+ eq(expected, screen.options)
+ end)
+ end)
+
+ local function startup_test(headless)
+ local expected = reset(nil,{headless=headless,args={'--cmd', 'set guifont=Comic\\ Sans\\ 12'}})
+ expected.guifont = "Comic Sans 12"
+ screen:expect(function()
+ eq(expected, screen.options)
+ end)
+ end
+
+ it('from startup options with --headless', function() startup_test(true) end)
+ it('from startup options with --embed', function() startup_test(false) end)
+end)
diff --git a/test/functional/ui/output_spec.lua b/test/functional/ui/output_spec.lua
new file mode 100644
index 0000000000..87b489fd71
--- /dev/null
+++ b/test/functional/ui/output_spec.lua
@@ -0,0 +1,234 @@
+local Screen = require('test.functional.ui.screen')
+local helpers = require('test.functional.helpers')(after_each)
+local child_session = require('test.functional.terminal.helpers')
+local mkdir, write_file, rmdir = helpers.mkdir, helpers.write_file, helpers.rmdir
+local eq = helpers.eq
+local eval = helpers.eval
+local feed = helpers.feed
+local feed_command = helpers.feed_command
+local iswin = helpers.iswin
+local clear = helpers.clear
+local command = helpers.command
+local nvim_dir = helpers.nvim_dir
+
+describe("shell command :!", function()
+ if helpers.pending_win32(pending) then return end
+
+ local screen
+ before_each(function()
+ clear()
+ screen = child_session.screen_setup(0, '["'..helpers.nvim_prog..
+ '", "-u", "NONE", "-i", "NONE", "--cmd", "'..helpers.nvim_set..'"]')
+ screen:expect([[
+ {1: } |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ |
+ {3:-- TERMINAL --} |
+ ]])
+ end)
+
+ after_each(function()
+ child_session.feed_data("\3") -- Ctrl-C
+ screen:detach()
+ end)
+
+ it("displays output without LF/EOF. #4646 #4569 #3772", function()
+ -- NOTE: We use a child nvim (within a :term buffer)
+ -- to avoid triggering a UI flush.
+ child_session.feed_data(":!printf foo; sleep 200\n")
+ screen:expect([[
+ |
+ {4:~ }|
+ {4:~ }|
+ {5: }|
+ :!printf foo; sleep 200 |
+ foo |
+ {3:-- TERMINAL --} |
+ ]])
+ end)
+
+ it("throttles shell-command output greater than ~10KB", function()
+ if helpers.skip_fragile(pending) then
+ return
+ end
+ child_session.feed_data(
+ ":!for i in $(seq 2 30000); do echo XXXXXXXXXX $i; done\n")
+
+ -- If we observe any line starting with a dot, then throttling occurred.
+ -- Avoid false failure on slow systems.
+ screen:expect{any="\n%.", timeout=20000}
+
+ -- Final chunk of output should always be displayed, never skipped.
+ -- (Throttling is non-deterministic, this test is merely a sanity check.)
+ screen:expect([[
+ XXXXXXXXXX 29997 |
+ XXXXXXXXXX 29998 |
+ XXXXXXXXXX 29999 |
+ XXXXXXXXXX 30000 |
+ |
+ {10:Press ENTER or type command to continue}{1: } |
+ {3:-- TERMINAL --} |
+ ]], {
+ -- test/functional/helpers.lua defaults to background=light.
+ [1] = {reverse = true},
+ [3] = {bold = true},
+ [10] = {foreground = 2},
+ })
+ end)
+end)
+
+describe("shell command :!", function()
+ before_each(function()
+ clear()
+ end)
+
+ it("cat a binary file #4142", function()
+ feed(":exe 'silent !cat '.shellescape(v:progpath)<CR>")
+ eq(2, eval('1+1')) -- Still alive?
+ end)
+
+ it([[display \x08 char #4142]], function()
+ feed(":silent !echo \08<CR>")
+ eq(2, eval('1+1')) -- Still alive?
+ end)
+
+ it('handles control codes', function()
+ if iswin() then
+ pending('missing printf', function() end)
+ return
+ end
+ local screen = Screen.new(50, 4)
+ screen:attach()
+ command("set display-=msgsep")
+ -- Print TAB chars. #2958
+ feed([[:!printf '1\t2\t3'<CR>]])
+ screen:expect([[
+ ~ |
+ :!printf '1\t2\t3' |
+ 1 2 3 |
+ Press ENTER or type command to continue^ |
+ ]])
+ feed([[<CR>]])
+ -- Print BELL control code. #4338
+ screen.bell = false
+ feed([[:!printf '\007\007\007\007text'<CR>]])
+ screen:expect{grid=[[
+ ~ |
+ :!printf '\007\007\007\007text' |
+ text |
+ Press ENTER or type command to continue^ |
+ ]], condition=function()
+ eq(true, screen.bell)
+ end}
+ feed([[<CR>]])
+ -- Print BS control code.
+ feed([[:echo system('printf ''\010\n''')<CR>]])
+ screen:expect([[
+ ~ |
+ ^H |
+ |
+ Press ENTER or type command to continue^ |
+ ]])
+ feed([[<CR>]])
+ -- Print LF control code.
+ feed([[:!printf '\n'<CR>]])
+ screen:expect([[
+ :!printf '\n' |
+ |
+ |
+ Press ENTER or type command to continue^ |
+ ]])
+ feed([[<CR>]])
+ end)
+
+ describe('', function()
+ local screen
+ before_each(function()
+ rmdir('bang_filter_spec')
+ mkdir('bang_filter_spec')
+ write_file('bang_filter_spec/f1', 'f1')
+ write_file('bang_filter_spec/f2', 'f2')
+ write_file('bang_filter_spec/f3', 'f3')
+ screen = Screen.new(53,10)
+ screen:set_default_attr_ids({
+ [1] = {bold = true, foreground = Screen.colors.Blue1},
+ [2] = {foreground = Screen.colors.Blue1},
+ [3] = {bold = true, foreground = Screen.colors.SeaGreen4},
+ [4] = {bold = true, reverse = true},
+ })
+ screen:attach()
+ end)
+
+ after_each(function()
+ rmdir('bang_filter_spec')
+ end)
+
+ it("doesn't truncate Last line of shell output #3269", function()
+ command(helpers.iswin()
+ and [[nnoremap <silent>\l :!dir /b bang_filter_spec<cr>]]
+ or [[nnoremap <silent>\l :!ls bang_filter_spec<cr>]])
+ local result = (helpers.iswin()
+ and [[:!dir /b bang_filter_spec]]
+ or [[:!ls bang_filter_spec ]])
+ feed([[\l]])
+ screen:expect([[
+ |
+ {1:~ }|
+ {1:~ }|
+ {4: }|
+ ]]..result..[[ |
+ f1 |
+ f2 |
+ f3 |
+ |
+ {3:Press ENTER or type command to continue}^ |
+ ]])
+ end)
+
+ it('handles binary and multibyte data', function()
+ feed_command('!cat test/functional/fixtures/shell_data.txt')
+ screen.bell = false
+ screen:expect{grid=[[
+ |
+ {1:~ }|
+ {4: }|
+ :!cat test/functional/fixtures/shell_data.txt |
+ {2:^@^A^B^C^D^E^F^H} |
+ {2:^N^O^P^Q^R^S^T^U^V^W^X^Y^Z^[^\^]^^^_} |
+ รถ ํ•œ๊ธ€ {2:<a5><c3>} |
+ t {2:<ff>} |
+ |
+ {3:Press ENTER or type command to continue}^ |
+ ]], condition=function()
+ eq(true, screen.bell)
+ end}
+ end)
+
+ it('handles multibyte sequences split over buffer boundaries', function()
+ command('cd '..nvim_dir)
+ local cmd
+ if iswin() then
+ cmd = '!shell-test UTF-8 '
+ else
+ cmd = '!./shell-test UTF-8'
+ end
+ feed_command(cmd)
+ -- Note: only the first example of split composed char works
+ screen:expect([[
+ |
+ {4: }|
+ :]]..cmd..[[ |
+ รฅ |
+ ref: รฅฬฒ |
+ 1: รฅฬฒ |
+ 2: รฅ ฬฒ |
+ 3: รฅ ฬฒ |
+ |
+ {3:Press ENTER or type command to continue}^ |
+ ]])
+ end)
+ end)
+end)
diff --git a/test/functional/ui/popupmenu_spec.lua b/test/functional/ui/popupmenu_spec.lua
new file mode 100644
index 0000000000..9424931de4
--- /dev/null
+++ b/test/functional/ui/popupmenu_spec.lua
@@ -0,0 +1,610 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+local clear, feed = helpers.clear, helpers.feed
+local source = helpers.source
+local insert = helpers.insert
+local meths = helpers.meths
+local command = helpers.command
+
+describe('ui/ext_popupmenu', function()
+ local screen
+ before_each(function()
+ clear()
+ screen = Screen.new(60, 8)
+ screen:attach({rgb=true, ext_popupmenu=true})
+ screen:set_default_attr_ids({
+ [1] = {bold=true, foreground=Screen.colors.Blue},
+ [2] = {bold = true},
+ [3] = {reverse = true},
+ [4] = {bold = true, reverse = true},
+ [5] = {bold = true, foreground = Screen.colors.SeaGreen},
+ [6] = {background = Screen.colors.WebGray},
+ [7] = {background = Screen.colors.LightMagenta},
+ })
+ source([[
+ function! TestComplete() abort
+ call complete(1, [{'word':'foo', 'abbr':'fo', 'menu':'the foo', 'info':'foo-y', 'kind':'x'}, 'bar', 'spam'])
+ return ''
+ endfunction
+ ]])
+ end)
+
+ local expected = {
+ {'fo', 'x', 'the foo', 'foo-y'},
+ {'bar', '', '', ''},
+ {'spam', '', '', ''},
+ }
+
+ it('works', function()
+ feed('o<C-r>=TestComplete()<CR>')
+ screen:expect{grid=[[
+ |
+ foo^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:-- INSERT --} |
+ ]], popupmenu={
+ items=expected,
+ pos=0,
+ anchor={1,0},
+ }}
+
+ feed('<c-p>')
+ screen:expect{grid=[[
+ |
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:-- INSERT --} |
+ ]], popupmenu={
+ items=expected,
+ pos=-1,
+ anchor={1,0},
+ }}
+
+ -- down moves the selection in the menu, but does not insert anything
+ feed('<down><down>')
+ screen:expect{grid=[[
+ |
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:-- INSERT --} |
+ ]], popupmenu={
+ items=expected,
+ pos=1,
+ anchor={1,0},
+ }}
+
+ feed('<cr>')
+ screen:expect{grid=[[
+ |
+ bar^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:-- INSERT --} |
+ ]]}
+ end)
+
+ it('can be controlled by API', function()
+ feed('o<C-r>=TestComplete()<CR>')
+ screen:expect{grid=[[
+ |
+ foo^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:-- INSERT --} |
+ ]], popupmenu={
+ items=expected,
+ pos=0,
+ anchor={1,0},
+ }}
+
+ meths.select_popupmenu_item(1,false,false,{})
+ screen:expect{grid=[[
+ |
+ foo^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:-- INSERT --} |
+ ]], popupmenu={
+ items=expected,
+ pos=1,
+ anchor={1,0},
+ }}
+
+ meths.select_popupmenu_item(2,true,false,{})
+ screen:expect{grid=[[
+ |
+ spam^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:-- INSERT --} |
+ ]], popupmenu={
+ items=expected,
+ pos=2,
+ anchor={1,0},
+ }}
+
+ meths.select_popupmenu_item(0,true,true,{})
+ screen:expect([[
+ |
+ foo^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:-- INSERT --} |
+ ]])
+
+
+ feed('<c-w><C-r>=TestComplete()<CR>')
+ screen:expect{grid=[[
+ |
+ foo^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:-- INSERT --} |
+ ]], popupmenu={
+ items=expected,
+ pos=0,
+ anchor={1,0},
+ }}
+
+ meths.select_popupmenu_item(-1,false,false,{})
+ screen:expect{grid=[[
+ |
+ foo^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:-- INSERT --} |
+ ]], popupmenu={
+ items=expected,
+ pos=-1,
+ anchor={1,0},
+ }}
+
+ meths.select_popupmenu_item(1,true,false,{})
+ screen:expect{grid=[[
+ |
+ bar^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:-- INSERT --} |
+ ]], popupmenu={
+ items=expected,
+ pos=1,
+ anchor={1,0},
+ }}
+
+ meths.select_popupmenu_item(-1,true,false,{})
+ screen:expect{grid=[[
+ |
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:-- INSERT --} |
+ ]], popupmenu={
+ items=expected,
+ pos=-1,
+ anchor={1,0},
+ }}
+
+ meths.select_popupmenu_item(0,true,false,{})
+ screen:expect{grid=[[
+ |
+ foo^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:-- INSERT --} |
+ ]], popupmenu={
+ items=expected,
+ pos=0,
+ anchor={1,0},
+ }}
+
+ meths.select_popupmenu_item(-1,true,true,{})
+ screen:expect([[
+ |
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:-- INSERT --} |
+ ]])
+
+ command('imap <f1> <cmd>call nvim_select_popupmenu_item(2,v:true,v:false,{})<cr>')
+ command('imap <f2> <cmd>call nvim_select_popupmenu_item(-1,v:false,v:false,{})<cr>')
+ command('imap <f3> <cmd>call nvim_select_popupmenu_item(1,v:false,v:true,{})<cr>')
+ feed('<C-r>=TestComplete()<CR>')
+ screen:expect{grid=[[
+ |
+ foo^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:-- INSERT --} |
+ ]], popupmenu={
+ items=expected,
+ pos=0,
+ anchor={1,0},
+ }}
+
+ feed('<f1>')
+ screen:expect{grid=[[
+ |
+ spam^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:-- INSERT --} |
+ ]], popupmenu={
+ items=expected,
+ pos=2,
+ anchor={1,0},
+ }}
+
+ feed('<f2>')
+ screen:expect{grid=[[
+ |
+ spam^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:-- INSERT --} |
+ ]], popupmenu={
+ items=expected,
+ pos=-1,
+ anchor={1,0},
+ }}
+
+ feed('<f3>')
+ screen:expect([[
+ |
+ bar^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:-- INSERT --} |
+ ]])
+
+ -- also should work for builtin popupmenu
+ screen:set_option('ext_popupmenu', false)
+ feed('<C-r>=TestComplete()<CR>')
+ screen:expect([[
+ |
+ foo^ |
+ {6:fo x the foo }{1: }|
+ {7:bar }{1: }|
+ {7:spam }{1: }|
+ {1:~ }|
+ {1:~ }|
+ {2:-- INSERT --} |
+ ]])
+
+ feed('<f1>')
+ screen:expect([[
+ |
+ spam^ |
+ {7:fo x the foo }{1: }|
+ {7:bar }{1: }|
+ {6:spam }{1: }|
+ {1:~ }|
+ {1:~ }|
+ {2:-- INSERT --} |
+ ]])
+
+ feed('<f2>')
+ screen:expect([[
+ |
+ spam^ |
+ {7:fo x the foo }{1: }|
+ {7:bar }{1: }|
+ {7:spam }{1: }|
+ {1:~ }|
+ {1:~ }|
+ {2:-- INSERT --} |
+ ]])
+
+ feed('<f3>')
+ screen:expect([[
+ |
+ bar^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {2:-- INSERT --} |
+ ]])
+ end)
+end)
+
+
+describe('popup placement', function()
+ local screen
+ before_each(function()
+ clear()
+ screen = Screen.new(32, 20)
+ screen:attach()
+ screen:set_default_attr_ids({
+ -- popup selected item / scrollbar track
+ ['s'] = {background = Screen.colors.WebGray},
+ -- popup non-selected item
+ ['n'] = {background = Screen.colors.LightMagenta},
+ -- popup scrollbar knob
+ ['c'] = {background = Screen.colors.Grey0},
+ [1] = {bold = true, foreground = Screen.colors.Blue},
+ [2] = {bold = true},
+ [3] = {reverse = true},
+ [4] = {bold = true, reverse = true},
+ [5] = {bold = true, foreground = Screen.colors.SeaGreen}
+ })
+ end)
+
+ it('works with preview-window above', function()
+ feed(':ped<CR><c-w>4+')
+ feed('iaa bb cc dd ee ff gg hh ii jj<cr>')
+ feed('<c-x><c-n>')
+ screen:expect([[
+ aa bb cc dd ee ff gg hh ii jj |
+ aa |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {3:[No Name] [Preview][+] }|
+ aa bb cc dd ee ff gg hh ii jj |
+ aa^ |
+ {s:aa }{c: }{1: }|
+ {n:bb }{c: }{1: }|
+ {n:cc }{c: }{1: }|
+ {n:dd }{c: }{1: }|
+ {n:ee }{c: }{1: }|
+ {n:ff }{c: }{1: }|
+ {n:gg }{s: }{1: }|
+ {n:hh }{s: }{4: }|
+ {2:-- }{5:match 1 of 10} |
+ ]])
+ end)
+
+ it('works with preview-window below', function()
+ feed(':ped<CR><c-w>4+<c-w>r')
+ feed('iaa bb cc dd ee ff gg hh ii jj<cr>')
+ feed('<c-x><c-n>')
+ screen:expect([[
+ aa bb cc dd ee ff gg hh ii jj |
+ aa^ |
+ {s:aa }{c: }{1: }|
+ {n:bb }{c: }{1: }|
+ {n:cc }{c: }{1: }|
+ {n:dd }{c: }{1: }|
+ {n:ee }{c: }{1: }|
+ {n:ff }{c: }{1: }|
+ {n:gg }{s: }{1: }|
+ {n:hh }{s: }{4: }|
+ aa bb cc dd ee ff gg hh ii jj |
+ aa |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {3:[No Name] [Preview][+] }|
+ {2:-- }{5:match 1 of 10} |
+ ]])
+ end)
+
+ it('works with preview-window above and tall and inverted', function()
+ feed(':ped<CR><c-w>8+')
+ feed('iaa<cr>bb<cr>cc<cr>dd<cr>ee<cr>')
+ feed('ff<cr>gg<cr>hh<cr>ii<cr>jj<cr>')
+ feed('kk<cr>ll<cr>mm<cr>nn<cr>oo<cr>')
+ feed('<c-x><c-n>')
+ screen:expect([[
+ aa |
+ bb |
+ cc |
+ dd |
+ {s:aa }{c: }{3:ew][+] }|
+ {n:bb }{c: } |
+ {n:cc }{c: } |
+ {n:dd }{c: } |
+ {n:ee }{c: } |
+ {n:ff }{c: } |
+ {n:gg }{c: } |
+ {n:hh }{c: } |
+ {n:ii }{c: } |
+ {n:jj }{c: } |
+ {n:kk }{c: } |
+ {n:ll }{s: } |
+ {n:mm }{s: } |
+ aa^ |
+ {4:[No Name] [+] }|
+ {2:-- }{5:match 1 of 15} |
+ ]])
+ end)
+
+ it('works with preview-window above and short and inverted', function()
+ feed(':ped<CR><c-w>4+')
+ feed('iaa<cr>bb<cr>cc<cr>dd<cr>ee<cr>')
+ feed('ff<cr>gg<cr>hh<cr>ii<cr>jj<cr>')
+ feed('<c-x><c-n>')
+ screen:expect([[
+ aa |
+ bb |
+ cc |
+ dd |
+ ee |
+ ff |
+ gg |
+ {s:aa } |
+ {n:bb }{3:iew][+] }|
+ {n:cc } |
+ {n:dd } |
+ {n:ee } |
+ {n:ff } |
+ {n:gg } |
+ {n:hh } |
+ {n:ii } |
+ {n:jj } |
+ aa^ |
+ {4:[No Name] [+] }|
+ {2:-- }{5:match 1 of 10} |
+ ]])
+ end)
+
+ it('works with preview-window below and inverted', function()
+ feed(':ped<CR><c-w>4+<c-w>r')
+ feed('iaa<cr>bb<cr>cc<cr>dd<cr>ee<cr>')
+ feed('ff<cr>gg<cr>hh<cr>ii<cr>jj<cr>')
+ feed('<c-x><c-n>')
+ screen:expect([[
+ {s:aa }{c: } |
+ {n:bb }{c: } |
+ {n:cc }{c: } |
+ {n:dd }{c: } |
+ {n:ee }{c: } |
+ {n:ff }{c: } |
+ {n:gg }{s: } |
+ {n:hh }{s: } |
+ aa^ |
+ {4:[No Name] [+] }|
+ aa |
+ bb |
+ cc |
+ dd |
+ ee |
+ ff |
+ gg |
+ hh |
+ {3:[No Name] [Preview][+] }|
+ {2:-- }{5:match 1 of 10} |
+ ]])
+ end)
+
+ it('works with vsplits', function()
+ insert('aaa aab aac\n')
+ feed(':vsplit<cr>')
+ screen:expect([[
+ aaa aab aac {3:โ”‚}aaa aab aac|
+ ^ {3:โ”‚} |
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {4:[No Name] [+] }{3:<Name] [+] }|
+ :vsplit |
+ ]])
+
+ feed('ibbb a<c-x><c-n>')
+ screen:expect([[
+ aaa aab aac {3:โ”‚}aaa aab aac|
+ bbb aaa^ {3:โ”‚}bbb aaa |
+ {1:~ }{s: aaa }{1: }{3:โ”‚}{1:~ }|
+ {1:~ }{n: aab }{1: }{3:โ”‚}{1:~ }|
+ {1:~ }{n: aac }{1: }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {4:[No Name] [+] }{3:<Name] [+] }|
+ {2:-- }{5:match 1 of 3} |
+ ]])
+
+ feed('<esc><c-w><c-w>oc a<c-x><c-n>')
+ screen:expect([[
+ aaa aab aac{3:โ”‚}aaa aab aac |
+ bbb aaa {3:โ”‚}bbb aaa |
+ c aaa {3:โ”‚}c aaa^ |
+ {1:~ }{3:โ”‚}{1:~}{s: aaa }{1: }|
+ {1:~ }{3:โ”‚}{1:~}{n: aab }{1: }|
+ {1:~ }{3:โ”‚}{1:~}{n: aac }{1: }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {1:~ }{3:โ”‚}{1:~ }|
+ {3:<Name] [+] }{4:[No Name] [+] }|
+ {2:-- }{5:match 1 of 3} |
+ ]])
+ end)
+end)
diff --git a/test/functional/ui/quickfix_spec.lua b/test/functional/ui/quickfix_spec.lua
new file mode 100644
index 0000000000..b0d89ee3b6
--- /dev/null
+++ b/test/functional/ui/quickfix_spec.lua
@@ -0,0 +1,196 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+local clear, feed, meths = helpers.clear, helpers.feed, helpers.meths
+local insert, command = helpers.insert, helpers.command
+
+
+describe('quickfix selection highlight', function()
+ local screen
+
+ before_each(function()
+ clear()
+
+ screen = Screen.new(25, 10)
+ screen:attach()
+ screen:set_default_attr_ids({
+ [1] = { bold = true, foreground = Screen.colors.Blue },
+ [2] = {reverse = true},
+ [3] = {foreground = Screen.colors.Brown},
+ [4] = {bold = true, reverse = true},
+ [5] = {background = Screen.colors.Green},
+ [6] = {foreground = Screen.colors.Brown, background = Screen.colors.Green},
+ [7] = {background = Screen.colors.Red},
+ [8] = {foreground = Screen.colors.Brown, background = Screen.colors.Red},
+ [9] = {background = Screen.colors.Fuchsia},
+ [10] = {foreground = Screen.colors.Red, background = Screen.colors.Fuchsia},
+ [11] = {foreground = Screen.colors.Red},
+ [12] = {foreground = Screen.colors.Brown, background = Screen.colors.Fuchsia},
+ })
+
+ meths.set_option('errorformat', '%m %l')
+ command('syntax on')
+ command('highlight Search guibg=Green')
+
+ insert([[
+ Line 1
+ Line 2
+ Line 3
+ Line 4
+ Line 5
+ ]])
+
+ command('cad')
+ feed('gg')
+
+ screen:expect([[
+ ^Line 1 |
+ Line 2 |
+ Line 3 |
+ Line 4 |
+ Line 5 |
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+ end)
+
+ it('using default Search highlight group', function()
+ command('copen')
+
+ screen:expect([[
+ Line 1 |
+ {2:[No Name] [+] }|
+ {5:^|}{6:1}{5:| Line }|
+ |{3:2}| Line |
+ |{3:3}| Line |
+ |{3:4}| Line |
+ |{3:5}| Line |
+ || |
+ {4:[Quickfix List] }|
+ |
+ ]])
+
+ command('cnext')
+
+ screen:expect([[
+ Line 1 |
+ {2:[No Name] [+] }|
+ |{3:1}| Line |
+ {5:^|}{6:2}{5:| Line }|
+ |{3:3}| Line |
+ |{3:4}| Line |
+ |{3:5}| Line |
+ || |
+ {4:[Quickfix List] }|
+ |
+ ]])
+ end)
+
+ it('using QuickFixLine highlight group', function()
+ command('highlight QuickFixLine guibg=Red')
+
+ command('copen')
+
+ screen:expect([[
+ Line 1 |
+ {2:[No Name] [+] }|
+ {7:^|}{8:1}{7:| Line }|
+ |{3:2}| Line |
+ |{3:3}| Line |
+ |{3:4}| Line |
+ |{3:5}| Line |
+ || |
+ {4:[Quickfix List] }|
+ |
+ ]])
+
+ command('cnext')
+
+ screen:expect([[
+ Line 1 |
+ {2:[No Name] [+] }|
+ |{3:1}| Line |
+ {7:^|}{8:2}{7:| Line }|
+ |{3:3}| Line |
+ |{3:4}| Line |
+ |{3:5}| Line |
+ || |
+ {4:[Quickfix List] }|
+ |
+ ]])
+ end)
+
+ it('combines with CursorLine', function()
+ command('set cursorline')
+ command('highlight QuickFixLine guifg=Red')
+ command('highlight CursorLine guibg=Fuchsia')
+
+ command('copen')
+
+ screen:expect([[
+ {9:Line 1 }|
+ {2:[No Name] [+] }|
+ {10:^|1| Line }|
+ |{3:2}| Line |
+ |{3:3}| Line |
+ |{3:4}| Line |
+ |{3:5}| Line |
+ || |
+ {4:[Quickfix List] }|
+ |
+ ]])
+
+ feed('j')
+
+ screen:expect([[
+ {9:Line 1 }|
+ {2:[No Name] [+] }|
+ {11:|1| Line }|
+ {9:^|}{12:2}{9:| Line }|
+ |{3:3}| Line |
+ |{3:4}| Line |
+ |{3:5}| Line |
+ || |
+ {4:[Quickfix List] }|
+ |
+ ]])
+ end)
+
+ it('QuickFixLine background takes precedence over CursorLine', function()
+ command('set cursorline')
+ command('highlight QuickFixLine guibg=Red')
+ command('highlight CursorLine guibg=Fuchsia')
+
+ command('copen')
+
+ screen:expect([[
+ {9:Line 1 }|
+ {2:[No Name] [+] }|
+ {7:^|}{8:1}{7:| Line }|
+ |{3:2}| Line |
+ |{3:3}| Line |
+ |{3:4}| Line |
+ |{3:5}| Line |
+ || |
+ {4:[Quickfix List] }|
+ |
+ ]])
+
+ feed('j')
+
+ screen:expect([[
+ {9:Line 1 }|
+ {2:[No Name] [+] }|
+ {7:|}{8:1}{7:| Line }|
+ {9:^|}{12:2}{9:| Line }|
+ |{3:3}| Line |
+ |{3:4}| Line |
+ |{3:5}| Line |
+ || |
+ {4:[Quickfix List] }|
+ |
+ ]])
+ end)
+end)
diff --git a/test/functional/ui/screen.lua b/test/functional/ui/screen.lua
index d7af2a4fce..69f4a44dd8 100644
--- a/test/functional/ui/screen.lua
+++ b/test/functional/ui/screen.lua
@@ -1,31 +1,17 @@
--- This module contains the Screen class, a complete Nvim screen implementation
--- designed for functional testing. The goal is to provide a simple and
--- intuitive API for verifying screen state after a set of actions.
+-- This module contains the Screen class, a complete Nvim UI implementation
+-- designed for functional testing (verifying screen state, in particular).
--
--- The screen class exposes a single assertion method, "Screen:expect". This
--- method takes a string representing the expected screen state and an optional
--- set of attribute identifiers for checking highlighted characters(more on
--- this later).
---
--- The string passed to "expect" will be processed according to these rules:
---
--- - Each line of the string represents and is matched individually against
--- a screen row.
--- - The entire string is stripped of common indentation
--- - Expected screen rows are stripped of the last character. The last
--- character should be used to write pipes(|) that make clear where the
--- screen ends
--- - The last line is stripped, so the string must have (row count + 1)
--- lines.
+-- Screen:expect() takes a string representing the expected screen state and an
+-- optional set of attribute identifiers for checking highlighted characters.
--
-- Example usage:
--
-- local screen = Screen.new(25, 10)
--- -- attach the screen to the current Nvim instance
+-- -- Attach the screen to the current Nvim instance.
-- screen:attach()
--- --enter insert mode and type some text
+-- -- Enter insert-mode and type some text.
-- feed('ihello screen')
--- -- declare an expectation for the eventual screen state
+-- -- Assert the expected screen state.
-- screen:expect([[
-- hello screen |
-- ~ |
@@ -39,31 +25,19 @@
-- -- INSERT -- |
-- ]]) -- <- Last line is stripped
--
--- Since screen updates are received asynchronously, "expect" is actually
--- specifying the eventual screen state. This is how "expect" works: It will
--- start the event loop with a timeout of 5 seconds. Each time it receives an
--- update the expected state will be checked against the updated state.
---
--- If the expected state matches the current state, the event loop will be
--- stopped and "expect" will return. If the timeout expires, the last match
--- error will be reported and the test will fail.
+-- Since screen updates are received asynchronously, expect() actually specifies
+-- the _eventual_ screen state.
--
--- If the second argument is passed to "expect", the screen rows will be
--- transformed before being matched against the string lines. The
--- transformation rule is simple: Each substring "S" composed with characters
--- having the exact same set of attributes will be substituted by "{K:S}",
--- where K is a key associated the attribute set via the second argument of
--- "expect".
--- If a transformation table is present, unexpected attribute sets in the final
--- state is considered an error. To make testing simpler, a list of attribute
--- sets that should be ignored can be passed as a third argument. Alternatively,
--- this third argument can be "true" to indicate that all unexpected attribute
--- sets should be ignored.
+-- This is how expect() works:
+-- * It starts the event loop with a timeout.
+-- * Each time it receives an update it checks that against the expected state.
+-- * If the expected state matches the current state, the event loop will be
+-- stopped and expect() will return.
+-- * If the timeout expires, the last match error will be reported and the
+-- test will fail.
--
--- To illustrate how this works, let's say that in the above example we wanted
--- to assert that the "-- INSERT --" string is highlighted with the bold
--- attribute(which normally is), here's how the call to "expect" should look
--- like:
+-- Continuing the above example, say we want to assert that "-- INSERT --" is
+-- highlighted with the bold attribute. The expect() call should look like this:
--
-- NonText = Screen.colors.Blue
-- screen:expect([[
@@ -81,52 +55,58 @@
--
-- In this case "b" is a string associated with the set composed of one
-- attribute: bold. Note that since the {b:} markup is not a real part of the
--- screen, the delimiter(|) had to be moved right. Also, the highlighting of the
--- NonText markers (~) is ignored in this test.
+-- screen, the delimiter "|" moved to the right. Also, the highlighting of the
+-- NonText markers "~" is ignored in this test.
+--
+-- Tests will often share a group of attribute sets to expect(). Those can be
+-- defined at the beginning of a test:
--
--- Multiple expect:s will likely share a group of attribute sets to test.
--- Therefore these could be specified at the beginning of a test like this:
-- NonText = Screen.colors.Blue
-- screen:set_default_attr_ids( {
-- [1] = {reverse = true, bold = true},
-- [2] = {reverse = true}
-- })
-- screen:set_default_attr_ignore( {{}, {bold=true, foreground=NonText}} )
--- These can be overridden for a specific expect expression, by passing
--- different sets as parameters.
--
--- To help writing screen tests, there is a utility function
--- "screen:snapshot_util()", that can be placed in a test file at any point an
--- "expect(...)" should be. It will wait a short amount of time and then dump
--- the current state of the screen, in the form of an "expect(..)" expression
--- that would match it exactly. "snapshot_util" optionally also take the
--- transformation and ignore set as parameters, like expect, or uses the default
--- set. It will generate a larger attribute transformation set, if needed.
--- To generate a text-only test without highlight checks,
--- use `screen:snapshot_util({},true)`
+-- To help write screen tests, see Screen:snapshot_util().
+-- To debug screen tests, see Screen:redraw_debug().
+local global_helpers = require('test.helpers')
+local deepcopy = global_helpers.deepcopy
+local shallowcopy = global_helpers.shallowcopy
local helpers = require('test.functional.helpers')(nil)
-local request, run = helpers.request, helpers.run
+local request, run_session = helpers.request, helpers.run_session
+local eq = helpers.eq
local dedent = helpers.dedent
+local get_session = helpers.get_session
+local create_callindex = helpers.create_callindex
+
+local inspect = require('inspect')
+
+local function isempty(v)
+ return type(v) == 'table' and next(v) == nil
+end
local Screen = {}
Screen.__index = Screen
local debug_screen
-local default_screen_timeout = 3500
+local default_timeout_factor = 1
if os.getenv('VALGRIND') then
- default_screen_timeout = default_screen_timeout * 3
+ default_timeout_factor = default_timeout_factor * 3
end
if os.getenv('CI') then
- default_screen_timeout = default_screen_timeout * 3
+ default_timeout_factor = default_timeout_factor * 3
end
+local default_screen_timeout = default_timeout_factor * 3500
+
do
local spawn, nvim_prog = helpers.spawn, helpers.nvim_prog
local session = spawn({nvim_prog, '-u', 'NONE', '-i', 'NONE', '-N', '--embed'})
- local status, rv = session:request('vim_get_color_map')
+ local status, rv = session:request('nvim_get_color_map')
if not status then
print('failed to get color map')
os.exit(1)
@@ -170,17 +150,38 @@ function Screen.new(width, height)
update_menu = false,
visual_bell = false,
suspended = false,
+ mode = 'normal',
+ options = {},
+ popupmenu = nil,
+ cmdline = {},
+ cmdline_block = {},
+ wildmenu_items = nil,
+ wildmenu_selected = nil,
+ win_position = {},
+ _session = nil,
_default_attr_ids = nil,
_default_attr_ignore = nil,
- _mode = 'normal',
_mouse_enabled = true,
_attrs = {},
+ _hl_info = {},
+ _attr_table = {[0]={{},{}}},
+ _clear_attrs = {},
+ _new_attrs = false,
+ _width = width,
+ _height = height,
+ _grids = {},
_cursor = {
- row = 1, col = 1
+ grid = 1, row = 1, col = 1
},
- _busy = false
+ _busy = false,
}, Screen)
- self:_handle_resize(width, height)
+ local function ui(method, ...)
+ local status, rv = self._session:request('nvim_ui_'..method, ...)
+ if not status then
+ error(rv[2])
+ end
+ end
+ self.uimeths = create_callindex(ui)
return self
end
@@ -188,71 +189,307 @@ function Screen:set_default_attr_ids(attr_ids)
self._default_attr_ids = attr_ids
end
+function Screen:get_default_attr_ids()
+ return deepcopy(self._default_attr_ids)
+end
+
function Screen:set_default_attr_ignore(attr_ignore)
self._default_attr_ignore = attr_ignore
end
-function Screen:attach(rgb)
- if rgb == nil then
- rgb = true
+function Screen:set_hlstate_cterm(val)
+ self._hlstate_cterm = val
+end
+
+function Screen:attach(options, session)
+ if session == nil then
+ session = get_session()
+ end
+ if options == nil then
+ options = {}
+ end
+ if options.ext_linegrid == nil then
+ options.ext_linegrid = true
+ end
+
+ self._session = session
+ self._options = options
+ self._clear_attrs = (options.ext_linegrid and {{},{}}) or {}
+ self:_handle_resize(self._width, self._height)
+ self.uimeths.attach(self._width, self._height, options)
+ if self._options.rgb == nil then
+ -- nvim defaults to rgb=true internally,
+ -- simplify test code by doing the same.
+ self._options.rgb = true
end
- request('ui_attach', self._width, self._height, rgb)
+ if self._options.ext_multigrid then
+ self._options.ext_linegrid = true
+ end
+ self._session = session
end
function Screen:detach()
- request('ui_detach')
+ self.uimeths.detach()
+ self._session = nil
end
function Screen:try_resize(columns, rows)
- request('ui_try_resize', columns, rows)
+ self._width = columns
+ self._height = rows
+ self.uimeths.try_resize(columns, rows)
+end
+
+function Screen:try_resize_grid(grid, columns, rows)
+ self.uimeths.try_resize_grid(grid, columns, rows)
+end
+
+function Screen:set_option(option, value)
+ self.uimeths.set_option(option, value)
+ self._options[option] = value
end
+-- canonical order of ext keys, used to generate asserts
+local ext_keys = {
+ 'popupmenu', 'cmdline', 'cmdline_block', 'wildmenu_items', 'wildmenu_pos'
+}
+
+-- Asserts that the screen state eventually matches an expected state
+--
+-- This function can either be called with the positional forms
+--
+-- screen:expect(grid, [attr_ids, attr_ignore])
+-- screen:expect(condition)
+--
+-- or to use additional arguments (or grid and condition at the same time)
+-- the keyword form has to be used:
+--
+-- screen:expect{grid=[[...]], cmdline={...}, condition=function() ... end}
+--
+--
+-- grid: Expected screen state (string). Each line represents a screen
+-- row. Last character of each row (typically "|") is stripped.
+-- Common indentation is stripped.
+-- attr_ids: Expected text attributes. Screen rows are transformed according
+-- to this table, as follows: each substring S composed of
+-- characters having the same attributes will be substituted by
+-- "{K:S}", where K is a key in `attr_ids`. Any unexpected
+-- attributes in the final state are an error.
+-- Use screen:set_default_attr_ids() to define attributes for many
+-- expect() calls.
+-- attr_ignore: Ignored text attributes, or `true` to ignore all. By default
+-- nothing is ignored.
+-- condition: Function asserting some arbitrary condition. Return value is
+-- ignored, throw an error (use eq() or similar) to signal failure.
+-- any: Lua pattern string expected to match a screen line. NB: the
+-- following chars are magic characters
+-- ( ) . % + - * ? [ ^ $
+-- and must be escaped with a preceding % for a literal match.
+-- mode: Expected mode as signaled by "mode_change" event
+-- unchanged: Test that the screen state is unchanged since the previous
+-- expect(...). Any flush event resulting in a different state is
+-- considered an error. Not observing any events until timeout
+-- is acceptable.
+-- intermediate:Test that the final state is the same as the previous expect,
+-- but expect an intermediate state that is different. If possible
+-- it is better to use an explicit screen:expect(...) for this
+-- intermediate state.
+-- reset: Reset the state internal to the test Screen before starting to
+-- receive updates. This should be used after command("redraw!")
+-- or some other mechanism that will invoke "redraw!", to check
+-- that all screen state is transmitted again. This includes
+-- state related to ext_ features as mentioned below.
+-- timeout: maximum time that will be waited until the expected state is
+-- seen (or maximum time to observe an incorrect change when
+-- `unchanged` flag is used)
+--
+-- The following keys should be used to expect the state of various ext_
+-- features. Note that an absent key will assert that the item is currently
+-- NOT present on the screen, also when positional form is used.
+--
+-- popupmenu: Expected ext_popupmenu state,
+-- cmdline: Expected ext_cmdline state, as an array of cmdlines of
+-- different level.
+-- cmdline_block: Expected ext_cmdline block (for function definitions)
+-- wildmenu_items: Expected items for ext_wildmenu
+-- wildmenu_pos: Expected position for ext_wildmenu
function Screen:expect(expected, attr_ids, attr_ignore)
- -- remove the last line and dedent
- expected = dedent(expected:gsub('\n[ ]+$', ''))
+ local grid, condition = nil, nil
local expected_rows = {}
- for row in expected:gmatch('[^\n]+') do
- -- the last character should be the screen delimiter
- row = row:sub(1, #row - 1)
- table.insert(expected_rows, row)
- end
- local ids = attr_ids or self._default_attr_ids
- local ignore = attr_ignore or self._default_attr_ignore
- self:wait(function()
- local actual_rows = {}
- for i = 1, self._height do
- actual_rows[i] = self:_row_repr(self._rows[i], ids, ignore)
- end
- for i = 1, self._height do
- if expected_rows[i] ~= actual_rows[i] then
- local msg_expected_rows = {}
- for j = 1, #expected_rows do
- msg_expected_rows[j] = expected_rows[j]
- end
- msg_expected_rows[i] = '*' .. msg_expected_rows[i]
- actual_rows[i] = '*' .. actual_rows[i]
+ if type(expected) == "table" then
+ assert(not (attr_ids ~= nil or attr_ignore ~= nil))
+ local is_key = {grid=true, attr_ids=true, attr_ignore=true, condition=true,
+ any=true, mode=true, unchanged=true, intermediate=true,
+ reset=true, timeout=true}
+ for _, v in ipairs(ext_keys) do
+ is_key[v] = true
+ end
+ for k, _ in pairs(expected) do
+ if not is_key[k] then
+ error("Screen:expect: Unknown keyword argument '"..k.."'")
+ end
+ end
+ grid = expected.grid
+ attr_ids = expected.attr_ids
+ attr_ignore = expected.attr_ignore
+ condition = expected.condition
+ assert(not (expected.any ~= nil and grid ~= nil))
+ elseif type(expected) == "string" then
+ grid = expected
+ expected = {}
+ elseif type(expected) == "function" then
+ assert(not (attr_ids ~= nil or attr_ignore ~= nil))
+ condition = expected
+ expected = {}
+ else
+ assert(false)
+ end
+
+ if grid ~= nil then
+ -- Remove the last line and dedent. Note that gsub returns more then one
+ -- value.
+ grid = dedent(grid:gsub('\n[ ]+$', ''), 0)
+ for row in grid:gmatch('[^\n]+') do
+ table.insert(expected_rows, row)
+ end
+ end
+ local attr_state = {
+ ids = attr_ids or self._default_attr_ids,
+ ignore = attr_ignore or self._default_attr_ignore,
+ }
+ if self._options.ext_hlstate then
+ attr_state.id_to_index = self:hlstate_check_attrs(attr_state.ids or {})
+ end
+ self._new_attrs = false
+ self:_wait(function()
+ if condition ~= nil then
+ local status, res = pcall(condition)
+ if not status then
+ return tostring(res)
+ end
+ end
+
+ if self._options.ext_hlstate and self._new_attrs then
+ attr_state.id_to_index = self:hlstate_check_attrs(attr_state.ids or {})
+ end
+
+ local actual_rows = self:render(not expected.any, attr_state)
+
+ if expected.any ~= nil then
+ -- Search for `any` anywhere in the screen lines.
+ local actual_screen_str = table.concat(actual_rows, '\n')
+ if nil == string.find(actual_screen_str, expected.any) then
return (
- 'Row ' .. tostring(i) .. ' didn\'t match.\n'
- .. 'Expected:\n|' .. table.concat(msg_expected_rows, '|\n|') .. '|\n'
- .. 'Actual:\n|' .. table.concat(actual_rows, '|\n|') .. '|'
- )
+ 'Failed to match any screen lines.\n'
+ .. 'Expected (anywhere): "' .. expected.any .. '"\n'
+ .. 'Actual:\n |' .. table.concat(actual_rows, '\n |') .. '\n\n')
end
end
- end)
+
+ if grid ~= nil then
+ -- `expected` must match the screen lines exactly.
+ if #actual_rows ~= #expected_rows then
+ return "Expected screen state's row count(" .. #expected_rows
+ .. ') differs from configured height(' .. #actual_rows .. ') of Screen.'
+ end
+ for i = 1, #actual_rows do
+ if expected_rows[i] ~= actual_rows[i] then
+ local msg_expected_rows = {}
+ for j = 1, #expected_rows do
+ msg_expected_rows[j] = expected_rows[j]
+ end
+ msg_expected_rows[i] = '*' .. msg_expected_rows[i]
+ actual_rows[i] = '*' .. actual_rows[i]
+ return (
+ 'Row ' .. tostring(i) .. ' did not match.\n'
+ ..'Expected:\n |'..table.concat(msg_expected_rows, '\n |')..'\n'
+ ..'Actual:\n |'..table.concat(actual_rows, '\n |')..'\n\n'..[[
+To print the expect() call that would assert the current screen state, use
+screen:snapshot_util(). In case of non-deterministic failures, use
+screen:redraw_debug() to show all intermediate screen states. ]])
+ end
+ end
+ end
+
+ -- Extension features. The default expectations should cover the case of
+ -- the ext_ feature being disabled, or the feature currently not activated
+ -- (for instance no external cmdline visible). Some extensions require
+ -- preprocessing to represent highlights in a reproducible way.
+ local extstate = self:_extstate_repr(attr_state)
+
+ -- convert assertion errors into invalid screen state descriptions
+ local status, res = pcall(function()
+ for _, k in ipairs(ext_keys) do
+ -- Empty states is considered the default and need not be mentioned
+ if not (expected[k] == nil and isempty(extstate[k])) then
+ eq(expected[k], extstate[k], k)
+ end
+ end
+ if expected.mode ~= nil then
+ eq(expected.mode, self.mode, "mode")
+ end
+ end)
+ if not status then
+ return tostring(res)
+ end
+ end, expected)
end
-function Screen:wait(check, timeout)
- local err, checked = false
+function Screen:_wait(check, flags)
+ local err, checked = false, false
local success_seen = false
local failure_after_success = false
+ local did_flush = true
+ local warn_immediate = not (flags.unchanged or flags.intermediate)
+
+ if flags.intermediate and flags.unchanged then
+ error("Choose only one of 'intermediate' and 'unchanged', not both")
+ end
+
+ if flags.reset then
+ -- throw away all state, we expect it to be retransmitted
+ self:_reset()
+ end
+
+ -- Maximum timeout, after which a incorrect state will be regarded as a
+ -- failure
+ local timeout = flags.timeout or self.timeout
+
+ -- Minimal timeout before the loop is allowed to be stopped so we
+ -- always do some check for failure after success.
+ local minimal_timeout = default_timeout_factor * 2
+
+ local immediate_seen, intermediate_seen = false, false
+ if not check() then
+ minimal_timeout = default_timeout_factor * 20
+ immediate_seen = true
+ end
+
+ -- for an unchanged test, flags.timeout means the time during the state is
+ -- expected to be unchanged, so always wait this full time.
+ if (flags.unchanged or flags.intermediate) and flags.timeout ~= nil then
+ minimal_timeout = timeout
+ end
+
+ assert(timeout >= minimal_timeout)
+ local did_miminal_timeout = false
+
local function notification_cb(method, args)
assert(method == 'redraw')
- self:_redraw(args)
+ did_flush = self:_redraw(args)
+ if not did_flush then
+ return
+ end
err = check()
checked = true
+ if err and immediate_seen then
+ intermediate_seen = true
+ end
+
if not err then
success_seen = true
- helpers.stop()
+ if did_miminal_timeout then
+ self._session:stop()
+ end
elseif success_seen and #args > 0 then
failure_after_success = true
--print(require('inspect')(args))
@@ -260,80 +497,224 @@ function Screen:wait(check, timeout)
return true
end
- run(nil, notification_cb, nil, timeout or self.timeout)
- if not checked then
+ run_session(self._session, nil, notification_cb, nil, minimal_timeout)
+ if not did_flush then
+ err = "no flush received"
+ elseif not checked then
err = check()
+ if not err and flags.unchanged then
+ -- expecting NO screen change: use a shorter timout
+ success_seen = true
+ end
+ end
+
+ if not success_seen then
+ did_miminal_timeout = true
+ run_session(self._session, nil, notification_cb, nil, timeout-minimal_timeout)
+ end
+
+ local did_warn = false
+ if warn_immediate and immediate_seen then
+ print([[
+
+warning: Screen test succeeded immediately. Try to avoid this unless the
+purpose of the test really requires it.]])
+ if intermediate_seen then
+ print([[
+There are intermediate states between the two identical expects.
+Use screen:snapshot_util() or screen:redraw_debug() to find them, and add them
+to the test if they make sense.
+]])
+ else
+ print([[If necessary, silence this warning with 'unchanged' argument of screen:expect.]])
+ end
+ did_warn = true
end
if failure_after_success then
print([[
-Warning: Screen changes have been received after the expected state was seen.
-This is probably due to an indeterminism in the test. Try adding
-`wait()` (or even a separate `screen:expect(...)`) at a point of possible
-indeterminism, typically in between a `feed()` or `execute()` which is non-
-synchronous, and a synchronous api call.
-
-Note that sometimes a `wait` can trigger redraws and consequently generate more
-indeterminism. If adding `wait` calls seems to increase the frequency of these
-messages, try removing every `wait` call in the test.
-
-If everything else fails, use Screen:redraw_debug to help investigate what is
- causing the problem.
+
+warning: Screen changes were received after the expected state. This indicates
+indeterminism in the test. Try adding screen:expect(...) (or wait()) between
+asynchronous (feed(), nvim_input()) and synchronous API calls.
+ - Use screen:redraw_debug() to investigate; it may find relevant intermediate
+ states that should be added to the test to make it more robust.
+ - If the purpose of the test is to assert state after some user input sent
+ with feed(), adding screen:expect() before the feed() will help to ensure
+ the input is sent when Nvim is in a predictable state. This is preferable
+ to wait(), for being closer to real user interaction.
+ - wait() can trigger redraws and consequently generate more indeterminism.
+ Try removing wait().
]])
+ did_warn = true
+ end
+
+
+ if err then
+ assert(false, err)
+ elseif did_warn then
local tb = debug.traceback()
local index = string.find(tb, '\n%s*%[C]')
print(string.sub(tb,1,index))
end
- if err then
- assert(false, err)
+ if flags.intermediate then
+ assert(intermediate_seen, "expected intermediate screen state before final screen state")
+ elseif flags.unchanged then
+ assert(not intermediate_seen, "expected screen state to be unchanged")
end
end
function Screen:sleep(ms)
- pcall(function() self:wait(function() return "error" end, ms) end)
+ local function notification_cb(method, args)
+ assert(method == 'redraw')
+ self:_redraw(args)
+ end
+ run_session(self._session, nil, notification_cb, nil, ms)
end
function Screen:_redraw(updates)
- for _, update in ipairs(updates) do
+ local did_flush = false
+ for k, update in ipairs(updates) do
-- print('--')
-- print(require('inspect')(update))
local method = update[1]
for i = 2, #update do
- local handler = self['_handle_'..method]
- handler(self, unpack(update[i]))
+ local handler_name = '_handle_'..method
+ local handler = self[handler_name]
+ if handler ~= nil then
+ handler(self, unpack(update[i]))
+ else
+ assert(self._on_event,
+ "Add Screen:"..handler_name.." or call Screen:set_on_event_handler")
+ self._on_event(method, update[i])
+ end
+ end
+ if k == #updates and method == "flush" then
+ did_flush = true
end
- -- print(self:_current_screen())
end
+ return did_flush
+end
+
+function Screen:set_on_event_handler(callback)
+ self._on_event = callback
end
function Screen:_handle_resize(width, height)
+ self:_handle_grid_resize(1, width, height)
+ self._scroll_region = {
+ top = 1, bot = height, left = 1, right = width
+ }
+ self._grid = self._grids[1]
+end
+
+local function min(x,y)
+ if x < y then
+ return x
+ else
+ return y
+ end
+end
+
+function Screen:_handle_grid_resize(grid, width, height)
local rows = {}
for _ = 1, height do
local cols = {}
for _ = 1, width do
- table.insert(cols, {text = ' ', attrs = {}})
+ table.insert(cols, {text = ' ', attrs = self._clear_attrs, hl_id = 0})
end
table.insert(rows, cols)
end
- self._cursor.row = 1
- self._cursor.col = 1
- self._rows = rows
- self._width = width
- self._height = height
- self._scroll_region = {
- top = 1, bot = height, left = 1, right = width
+ if grid > 1 and self._grids[grid] ~= nil then
+ local old = self._grids[grid]
+ for i = 1, min(height,old.height) do
+ for j = 1, min(width,old.width) do
+ rows[i][j] = old.rows[i][j]
+ end
+ end
+ end
+
+ if self._cursor.grid == grid then
+ self._cursor.row = 1
+ self._cursor.col = 1
+ end
+ self._grids[grid] = {
+ rows=rows,
+ width=width,
+ height=height,
}
end
+function Screen:_handle_win_scroll_over_start()
+ self.scroll_over = true
+ self.scroll_over_pos = self._grids[1].height
+end
+
+function Screen:_handle_win_scroll_over_reset()
+ self.scroll_over = false
+end
+
+function Screen:_handle_flush()
+end
+
+function Screen:_reset()
+ -- TODO: generalize to multigrid later
+ self:_handle_grid_clear(1)
+
+ -- TODO: share with initialization, so it generalizes?
+ self.popupmenu = nil
+ self.cmdline = {}
+ self.cmdline_block = {}
+ self.wildmenu_items = nil
+ self.wildmenu_pos = nil
+end
+
+
+function Screen:_handle_mode_info_set(cursor_style_enabled, mode_info)
+ self._cursor_style_enabled = cursor_style_enabled
+ for _, item in pairs(mode_info) do
+ -- attr IDs are not stable, but their value should be
+ if item.attr_id ~= nil then
+ item.attr = self._attr_table[item.attr_id][1]
+ item.attr_id = nil
+ end
+ if item.attr_id_lm ~= nil then
+ item.attr_lm = self._attr_table[item.attr_id_lm][1]
+ item.attr_id_lm = nil
+ end
+ end
+ self._mode_info = mode_info
+end
+
function Screen:_handle_clear()
- self:_clear_block(self._scroll_region.top, self._scroll_region.bot,
- self._scroll_region.left, self._scroll_region.right)
+ -- the first implemented UI protocol clients (python-gui and builitin TUI)
+ -- allowed the cleared region to be restricted by setting the scroll region.
+ -- this was never used by nvim tough, and not documented and implemented by
+ -- newer clients, to check we remain compatible with both kind of clients,
+ -- ensure the scroll region is in a reset state.
+ local expected_region = {
+ top = 1, bot = self._grid.height, left = 1, right = self._grid.width
+ }
+ eq(expected_region, self._scroll_region)
+ self:_handle_grid_clear(1)
+end
+
+function Screen:_handle_grid_clear(grid)
+ self:_clear_block(self._grids[grid], 1, self._grids[grid].height, 1, self._grids[grid].width)
+end
+
+function Screen:_handle_grid_destroy(grid)
+ self._grids[grid] = nil
+ if self._options.ext_multigrid then
+ assert(self.win_position[grid])
+ self.win_position[grid] = nil
+ end
end
function Screen:_handle_eol_clear()
local row, col = self._cursor.row, self._cursor.col
- self:_clear_block(row, row, col, self._scroll_region.right)
+ self:_clear_block(self._grid, row, row, col, self._grid.width)
end
function Screen:_handle_cursor_goto(row, col)
@@ -341,6 +722,12 @@ function Screen:_handle_cursor_goto(row, col)
self._cursor.col = col + 1
end
+function Screen:_handle_grid_cursor_goto(grid, row, col)
+ self._cursor.grid = grid
+ self._cursor.row = row + 1
+ self._cursor.col = col + 1
+end
+
function Screen:_handle_busy_start()
self._busy = true
end
@@ -357,9 +744,9 @@ function Screen:_handle_mouse_off()
self._mouse_enabled = false
end
-function Screen:_handle_mode_change(mode)
- assert(mode == 'insert' or mode == 'replace' or mode == 'normal')
- self._mode = mode
+function Screen:_handle_mode_change(mode, idx)
+ assert(mode == self._mode_info[idx+1].name)
+ self.mode = mode
end
function Screen:_handle_set_scroll_region(top, bot, left, right)
@@ -374,31 +761,73 @@ function Screen:_handle_scroll(count)
local bot = self._scroll_region.bot
local left = self._scroll_region.left
local right = self._scroll_region.right
+ self:_handle_grid_scroll(1, top-1, bot, left-1, right, count, 0)
+end
+
+function Screen:_handle_grid_scroll(g, top, bot, left, right, rows, cols)
+ if self.scroll_over and g == 1 and top < self.scroll_over_pos then
+ self.scroll_over_pos = top
+ end
+
+ top = top+1
+ left = left+1
+ assert(cols == 0)
+ local grid = self._grids[g]
local start, stop, step
- if count > 0 then
+
+ if rows > 0 then
start = top
- stop = bot - count
+ stop = bot - rows
step = 1
else
start = bot
- stop = top - count
+ stop = top - rows
step = -1
end
-- shift scroll region
for i = start, stop, step do
- local target = self._rows[i]
- local source = self._rows[i + count]
+ local target = grid.rows[i]
+ local source = grid.rows[i + rows]
for j = left, right do
target[j].text = source[j].text
target[j].attrs = source[j].attrs
+ target[j].hl_id = source[j].hl_id
end
end
-- clear invalid rows
- for i = stop + step, stop + count, step do
- self:_clear_row_section(i, left, right)
+ for i = stop + step, stop + rows, step do
+ self:_clear_row_section(grid, i, left, right)
+ end
+end
+
+function Screen:_handle_hl_attr_define(id, rgb_attrs, cterm_attrs, info)
+ self._attr_table[id] = {rgb_attrs, cterm_attrs}
+ self._hl_info[id] = info
+ self._new_attrs = true
+end
+
+function Screen:_handle_win_pos(grid, win, startrow, startcol, width, height)
+ self.win_position[grid] = {
+ win = win,
+ startrow = startrow,
+ startcol = startcol,
+ width = width,
+ height = height
+ }
+end
+
+function Screen:_handle_win_hide(grid)
+ self.win_position[grid] = nil
+end
+
+function Screen:get_hl(val)
+ if self._options.ext_newgrid then
+ return self._attr_table[val][1]
+ else
+ return val
end
end
@@ -407,12 +836,36 @@ function Screen:_handle_highlight_set(attrs)
end
function Screen:_handle_put(str)
- local cell = self._rows[self._cursor.row][self._cursor.col]
+ assert(not self._options.ext_linegrid)
+ local cell = self._grid.rows[self._cursor.row][self._cursor.col]
cell.text = str
cell.attrs = self._attrs
+ cell.hl_id = -1
self._cursor.col = self._cursor.col + 1
end
+function Screen:_handle_grid_line(grid, row, col, items)
+ assert(self._options.ext_linegrid)
+ local line = self._grids[grid].rows[row+1]
+ local colpos = col+1
+ local hl = self._clear_attrs
+ local hl_id = 0
+ for _,item in ipairs(items) do
+ local text, hl_id_cell, count = unpack(item)
+ if hl_id_cell ~= nil then
+ hl_id = hl_id_cell
+ hl = self._attr_table[hl_id]
+ end
+ for _ = 1, (count or 1) do
+ local cell = line[colpos]
+ cell.text = text
+ cell.hl_id = hl_id
+ cell.attrs = hl
+ colpos = colpos+1
+ end
+ end
+end
+
function Screen:_handle_bell()
self.bell = true
end
@@ -421,6 +874,16 @@ function Screen:_handle_visual_bell()
self.visual_bell = true
end
+function Screen:_handle_default_colors_set(rgb_fg, rgb_bg, rgb_sp, cterm_fg, cterm_bg)
+ self.default_colors = {
+ rgb_fg=rgb_fg,
+ rgb_bg=rgb_bg,
+ rgb_sp=rgb_sp,
+ cterm_fg=cterm_fg,
+ cterm_bg=cterm_bg
+ }
+end
+
function Screen:_handle_update_fg(fg)
self._fg = fg
end
@@ -449,41 +912,129 @@ function Screen:_handle_set_icon(icon)
self.icon = icon
end
-function Screen:_clear_block(top, bot, left, right)
+function Screen:_handle_option_set(name, value)
+ self.options[name] = value
+end
+
+function Screen:_handle_popupmenu_show(items, selected, row, col)
+ self.popupmenu = {items=items,pos=selected, anchor={row, col}}
+end
+
+function Screen:_handle_popupmenu_select(selected)
+ self.popupmenu.pos = selected
+end
+
+function Screen:_handle_popupmenu_hide()
+ self.popupmenu = nil
+end
+
+function Screen:_handle_cmdline_show(content, pos, firstc, prompt, indent, level)
+ if firstc == '' then firstc = nil end
+ if prompt == '' then prompt = nil end
+ if indent == 0 then indent = nil end
+ self.cmdline[level] = {content=content, pos=pos, firstc=firstc,
+ prompt=prompt, indent=indent}
+end
+
+function Screen:_handle_cmdline_hide(level)
+ self.cmdline[level] = nil
+end
+
+function Screen:_handle_cmdline_special_char(char, shift, level)
+ -- cleared by next cmdline_show on the same level
+ self.cmdline[level].special = {char, shift}
+end
+
+function Screen:_handle_cmdline_pos(pos, level)
+ self.cmdline[level].pos = pos
+end
+
+function Screen:_handle_cmdline_block_show(block)
+ self.cmdline_block = block
+end
+
+function Screen:_handle_cmdline_block_append(item)
+ self.cmdline_block[#self.cmdline_block+1] = item
+end
+
+function Screen:_handle_cmdline_block_hide()
+ self.cmdline_block = {}
+end
+
+function Screen:_handle_wildmenu_show(items)
+ self.wildmenu_items = items
+end
+
+function Screen:_handle_wildmenu_select(pos)
+ self.wildmenu_pos = pos
+end
+
+function Screen:_handle_wildmenu_hide()
+ self.wildmenu_items, self.wildmenu_pos = nil, nil
+end
+
+function Screen:_clear_block(grid, top, bot, left, right)
for i = top, bot do
- self:_clear_row_section(i, left, right)
+ self:_clear_row_section(grid, i, left, right)
end
end
-function Screen:_clear_row_section(rownum, startcol, stopcol)
- local row = self._rows[rownum]
+function Screen:_clear_row_section(grid, rownum, startcol, stopcol)
+ local row = grid.rows[rownum]
for i = startcol, stopcol do
row[i].text = ' '
- row[i].attrs = {}
+ row[i].attrs = self._clear_attrs
end
end
-function Screen:_row_repr(row, attr_ids, attr_ignore)
+function Screen:_row_repr(gridnr, rownr, attr_state, cursor)
local rv = {}
local current_attr_id
- for i = 1, self._width do
- local attr_id = self:_get_attr_id(attr_ids, attr_ignore, row[i].attrs)
- if current_attr_id and attr_id ~= current_attr_id then
- -- close current attribute bracket, add it before any whitespace
- -- up to the current cell
- -- table.insert(rv, backward_find_meaningful(rv, i), '}')
- table.insert(rv, '}')
- current_attr_id = nil
- end
- if not current_attr_id and attr_id then
- -- open a new attribute bracket
- table.insert(rv, '{' .. attr_id .. ':')
- current_attr_id = attr_id
+ local i = 1
+ local has_windows = self._options.ext_multigrid and gridnr == 1
+ if self.scroll_over and self.scroll_over_pos < rownr then
+ has_windows = false
+ end
+ local row = self._grids[gridnr].rows[rownr]
+ while i <= #row do
+ local did_window = false
+ if has_windows then
+ for id,pos in pairs(self.win_position) do
+ if i-1 == pos.startcol and pos.startrow <= rownr-1 and rownr-1 < pos.startrow + pos.height then
+ if current_attr_id then
+ -- close current attribute bracket
+ table.insert(rv, '}')
+ current_attr_id = nil
+ end
+ table.insert(rv, '['..id..':'..string.rep('-',pos.width)..']')
+ i = i + pos.width
+ did_window = true
+ end
+ end
end
- if not self._busy and self._rows[self._cursor.row] == row and self._cursor.col == i then
- table.insert(rv, '^')
+
+ if not did_window then
+ local attrs = row[i].attrs
+ if self._options.ext_linegrid then
+ attrs = attrs[(self._options.rgb and 1) or 2]
+ end
+ local attr_id = self:_get_attr_id(attr_state, attrs, row[i].hl_id)
+ if current_attr_id and attr_id ~= current_attr_id then
+ -- close current attribute bracket
+ table.insert(rv, '}')
+ current_attr_id = nil
+ end
+ if not current_attr_id and attr_id then
+ -- open a new attribute bracket
+ table.insert(rv, '{' .. attr_id .. ':')
+ current_attr_id = attr_id
+ end
+ if not self._busy and cursor and self._cursor.col == i then
+ table.insert(rv, '^')
+ end
+ table.insert(rv, row[i].text)
+ i = i + 1
end
- table.insert(rv, row[i].text)
end
if current_attr_id then
table.insert(rv, '}')
@@ -493,18 +1044,50 @@ function Screen:_row_repr(row, attr_ids, attr_ignore)
return table.concat(rv, '')--:gsub('%s+$', '')
end
+function Screen:_extstate_repr(attr_state)
+ local cmdline = {}
+ for i, entry in pairs(self.cmdline) do
+ entry = shallowcopy(entry)
+ entry.content = self:_chunks_repr(entry.content, attr_state)
+ cmdline[i] = entry
+ end
-function Screen:_current_screen()
- -- get a string that represents the current screen state(debugging helper)
- local rv = {}
- for i = 1, self._height do
- table.insert(rv, "'"..self:_row_repr(self._rows[i]).."'")
+ local cmdline_block = {}
+ for i, entry in ipairs(self.cmdline_block) do
+ cmdline_block[i] = self:_chunks_repr(entry, attr_state)
end
- return table.concat(rv, '\n')
+
+ return {
+ popupmenu=self.popupmenu,
+ cmdline=cmdline,
+ cmdline_block=cmdline_block,
+ wildmenu_items=self.wildmenu_items,
+ wildmenu_pos=self.wildmenu_pos,
+ }
end
+function Screen:_chunks_repr(chunks, attr_state)
+ local repr_chunks = {}
+ for i, chunk in ipairs(chunks) do
+ local hl, text = unpack(chunk)
+ local attrs
+ if self._options.ext_linegrid then
+ attrs = self._attr_table[hl][1]
+ else
+ attrs = hl
+ end
+ local attr_id = self:_get_attr_id(attr_state, attrs, hl)
+ repr_chunks[i] = {text, attr_id}
+ end
+ return repr_chunks
+end
+
+-- Generates tests. Call it where Screen:expect() would be. Waits briefly, then
+-- dumps the current screen state in the form of Screen:expect().
+-- Use snapshot_util({},true) to generate a text-only (no attributes) test.
+--
+-- @see Screen:redraw_debug()
function Screen:snapshot_util(attrs, ignore)
- -- util to generate screen test
self:sleep(250)
self:print_snapshot(attrs, ignore)
end
@@ -523,60 +1106,196 @@ function Screen:redraw_debug(attrs, ignore, timeout)
if timeout == nil then
timeout = 250
end
- run(nil, notification_cb, nil, timeout)
+ run_session(self._session, nil, notification_cb, nil, timeout)
+end
+
+function Screen:render(headers, attr_state, preview)
+ headers = headers and self._options.ext_multigrid
+ local rv = {}
+ for igrid,grid in pairs(self._grids) do
+ if headers then
+ table.insert(rv, "## grid "..igrid)
+ end
+ for i = 1, grid.height do
+ local cursor = self._cursor.grid == igrid and self._cursor.row == i
+ local prefix = (headers or preview) and " " or ""
+ table.insert(rv, prefix..self:_row_repr(igrid, i, attr_state, cursor).."|")
+ end
+ end
+ return rv
end
function Screen:print_snapshot(attrs, ignore)
+ attrs = attrs or self._default_attr_ids
if ignore == nil then
ignore = self._default_attr_ignore
end
- if attrs == nil then
- attrs = {}
- if self._default_attr_ids ~= nil then
- for i, a in ipairs(self._default_attr_ids) do
- attrs[i] = a
+ local attr_state = {
+ ids = {},
+ ignore = ignore,
+ mutable = true, -- allow _row_repr to add missing highlights
+ }
+
+ if attrs ~= nil then
+ for i, a in pairs(attrs) do
+ attr_state.ids[i] = a
+ end
+ end
+ if self._options.ext_hlstate then
+ attr_state.id_to_index = self:hlstate_check_attrs(attr_state.ids)
+ end
+
+ local lines = self:render(true, attr_state, true)
+
+ local ext_state = self:_extstate_repr(attr_state)
+ local keys = false
+ for k, v in pairs(ext_state) do
+ if isempty(v) then
+ ext_state[k] = nil -- deleting keys while iterating is ok
+ else
+ keys = true
+ end
+ end
+
+ local attrstr = ""
+ if attr_state.modified then
+ local attrstrs = {}
+ for i, a in pairs(attr_state.ids) do
+ local dict
+ if self._options.ext_hlstate then
+ dict = self:_pprint_hlstate(a)
+ else
+ dict = "{"..self:_pprint_attrs(a).."}"
end
+ local keyval = (type(i) == "number") and "["..tostring(i).."]" or i
+ table.insert(attrstrs, " "..keyval.." = "..dict..",")
end
+ attrstr = (", "..(keys and "attr_ids=" or "")
+ .."{\n"..table.concat(attrstrs, "\n").."\n}")
+ end
+ print( "\nscreen:expect"..(keys and "{grid=" or "(").."[[")
+ print( table.concat(lines, '\n'))
+ io.stdout:write( "]]"..attrstr)
+ for _, k in ipairs(ext_keys) do
+ if ext_state[k] ~= nil then
+ io.stdout:write(", "..k.."="..inspect(ext_state[k]))
+ end
+ end
+ print((keys and "}" or ")").."\n")
+ io.stdout:flush()
+end
+
+function Screen:_insert_hl_id(attr_state, hl_id)
+ if attr_state.id_to_index[hl_id] ~= nil then
+ return attr_state.id_to_index[hl_id]
+ end
+ local raw_info = self._hl_info[hl_id]
+ local info = {}
+ if #raw_info > 1 then
+ for i, item in ipairs(raw_info) do
+ info[i] = self:_insert_hl_id(attr_state, item.id)
+ end
+ else
+ info[1] = {}
+ for k, v in pairs(raw_info[1]) do
+ if k ~= "id" then
+ info[1][k] = v
+ end
+ end
+ end
+
+ local entry = self._attr_table[hl_id]
+ local attrval
+ if self._hlstate_cterm then
+ attrval = {entry[1], entry[2], info} -- unpack() doesn't work
+ else
+ attrval = {entry[1], info}
+ end
- if ignore ~= true then
- for i = 1, self._height do
- local row = self._rows[i]
- for j = 1, self._width do
- local attr = row[j].attrs
- if self:_attr_index(attrs, attr) == nil and self:_attr_index(ignore, attr) == nil then
- if not self:_equal_attrs(attr, {}) then
- table.insert(attrs, attr)
+
+ table.insert(attr_state.ids, attrval)
+ attr_state.id_to_index[hl_id] = #attr_state.ids
+ return #attr_state.ids
+end
+
+function Screen:hlstate_check_attrs(attrs)
+ local id_to_index = {}
+ for i = 1,#self._attr_table do
+ local iinfo = self._hl_info[i]
+ local matchinfo = {}
+ if #iinfo > 1 then
+ for k,item in ipairs(iinfo) do
+ matchinfo[k] = id_to_index[item.id]
+ end
+ else
+ matchinfo = iinfo
+ end
+ for k,v in pairs(attrs) do
+ local attr, info, attr_rgb, attr_cterm
+ if self._hlstate_cterm then
+ attr_rgb, attr_cterm, info = unpack(v)
+ attr = {attr_rgb, attr_cterm}
+ else
+ attr, info = unpack(v)
+ end
+ if self:_equal_attr_def(attr, self._attr_table[i]) then
+ if #info == #matchinfo then
+ local match = false
+ if #info == 1 then
+ if self:_equal_info(info[1],matchinfo[1]) then
+ match = true
+ end
+ else
+ match = true
+ for j = 1,#info do
+ if info[j] ~= matchinfo[j] then
+ match = false
+ end
end
end
+ if match then
+ id_to_index[i] = k
+ end
end
end
end
end
+ return id_to_index
+end
- local rv = {}
- for i = 1, self._height do
- table.insert(rv, " "..self:_row_repr(self._rows[i],attrs, ignore).."|")
- end
- local attrstrs = {}
- local alldefault = true
- for i, a in ipairs(attrs) do
- if self._default_attr_ids == nil or self._default_attr_ids[i] ~= a then
- alldefault = false
- end
- local dict = "{"..self:_pprint_attrs(a).."}"
- table.insert(attrstrs, "["..tostring(i).."] = "..dict)
- end
- local attrstr = "{"..table.concat(attrstrs, ", ").."}"
- print( "\nscreen:expect([[")
- print( table.concat(rv, '\n'))
- if alldefault then
- print( "]])\n")
+
+function Screen:_pprint_hlstate(item)
+ --print(require('inspect')(item))
+ local attrdict = "{"..self:_pprint_attrs(item[1]).."}, "
+ local attrdict2, hlinfo
+ if self._hlstate_cterm then
+ attrdict2 = "{"..self:_pprint_attrs(item[2]).."}, "
+ hlinfo = item[3]
+ else
+ attrdict2 = ""
+ hlinfo = item[2]
+ end
+ local descdict = "{"..self:_pprint_hlinfo(hlinfo).."}"
+ return "{"..attrdict..attrdict2..descdict.."}"
+end
+
+function Screen:_pprint_hlinfo(states)
+ if #states == 1 then
+ local items = {}
+ for f, v in pairs(states[1]) do
+ local desc = tostring(v)
+ if type(v) == type("") then
+ desc = '"'..desc..'"'
+ end
+ table.insert(items, f.." = "..desc)
+ end
+ return "{"..table.concat(items, ", ").."}"
else
- print( "]], "..attrstr..")\n")
+ return table.concat(states, ", ")
end
- io.stdout:flush()
end
+
function Screen:_pprint_attrs(attrs)
local items = {}
for f, v in pairs(attrs) do
@@ -591,7 +1310,7 @@ function Screen:_pprint_attrs(attrs)
return table.concat(items, ", ")
end
-function backward_find_meaningful(tbl, from) -- luacheck: ignore
+local function backward_find_meaningful(tbl, from) -- luacheck: no unused
for i = from or #tbl, 1, -1 do
if tbl[i] ~= ' ' then
return i + 1
@@ -600,32 +1319,64 @@ function backward_find_meaningful(tbl, from) -- luacheck: ignore
return from
end
-function Screen:_get_attr_id(attr_ids, ignore, attrs)
- if not attr_ids then
+function Screen:_get_attr_id(attr_state, attrs, hl_id)
+ if not attr_state.ids then
return
end
- for id, a in pairs(attr_ids) do
- if self:_equal_attrs(a, attrs) then
- return id
- end
+
+ if self._options.ext_hlstate then
+ local id = attr_state.id_to_index[hl_id]
+ if id ~= nil or hl_id == 0 then
+ return id
+ end
+ if attr_state.mutable then
+ id = self:_insert_hl_id(attr_state, hl_id)
+ attr_state.modified = true
+ return id
+ end
+ return "UNEXPECTED "..self:_pprint_attrs(self._attr_table[hl_id][1])
+ else
+ for id, a in pairs(attr_state.ids) do
+ if self:_equal_attrs(a, attrs) then
+ return id
+ end
+ end
+ if self:_equal_attrs(attrs, {}) or
+ attr_state.ignore == true or
+ self:_attr_index(attr_state.ignore, attrs) ~= nil then
+ -- ignore this attrs
+ return nil
+ end
+ if attr_state.mutable then
+ table.insert(attr_state.ids, attrs)
+ attr_state.modified = true
+ return #attr_state.ids
+ end
+ return "UNEXPECTED "..self:_pprint_attrs(attrs)
end
- if self:_equal_attrs(attrs, {}) or
- ignore == true or self:_attr_index(ignore, attrs) ~= nil then
- -- ignore this attrs
- return nil
+end
+
+function Screen:_equal_attr_def(a, b)
+ if self._hlstate_cterm then
+ return self:_equal_attrs(a[1],b[1]) and self:_equal_attrs(a[2],b[2])
+ else
+ return self:_equal_attrs(a,b[1])
end
- return "UNEXPECTED "..self:_pprint_attrs(attrs)
end
function Screen:_equal_attrs(a, b)
return a.bold == b.bold and a.standout == b.standout and
a.underline == b.underline and a.undercurl == b.undercurl and
a.italic == b.italic and a.reverse == b.reverse and
- a.foreground == b.foreground and
- a.background == b.background and
+ a.foreground == b.foreground and a.background == b.background and
a.special == b.special
end
+function Screen:_equal_info(a, b)
+ return a.kind == b.kind and a.hi_name == b.hi_name and
+ a.ui_name == b.ui_name
+end
+
function Screen:_attr_index(attrs, attr)
if not attrs then
return nil
diff --git a/test/functional/ui/screen_basic_spec.lua b/test/functional/ui/screen_basic_spec.lua
index 9249be4aec..04d532f6e1 100644
--- a/test/functional/ui/screen_basic_spec.lua
+++ b/test/functional/ui/screen_basic_spec.lua
@@ -1,13 +1,16 @@
local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
local spawn, set_session, clear = helpers.spawn, helpers.set_session, helpers.clear
-local feed, execute = helpers.feed, helpers.execute
+local feed, command = helpers.feed, helpers.command
local insert = helpers.insert
+local eq = helpers.eq
+local eval = helpers.eval
+local iswin = helpers.iswin
-describe('Initial screen', function()
+describe('screen', function()
local screen
local nvim_argv = {helpers.nvim_prog, '-u', 'NONE', '-i', 'NONE', '-N',
- '--cmd', 'set shortmess+=I background=light noswapfile',
+ '--cmd', 'set shortmess+=I background=light noswapfile belloff= noshowcmd noruler',
'--embed'}
before_each(function()
@@ -15,41 +18,53 @@ describe('Initial screen', function()
set_session(screen_nvim)
screen = Screen.new()
screen:attach()
- screen:set_default_attr_ignore( {{bold=true, foreground=255}} )
+ screen:set_default_attr_ids( {
+ [0] = {bold=true, foreground=255},
+ [1] = {bold=true, reverse=true},
+ } )
end)
after_each(function()
screen:detach()
end)
- it('is the default initial screen', function()
+ it('default initial screen', function()
screen:expect([[
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- [No Name] |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {1:[No Name] }|
|
]])
end)
end)
-describe('Screen', function()
+local function screen_tests(linegrid)
local screen
before_each(function()
clear()
screen = Screen.new()
- screen:attach()
- screen:set_default_attr_ignore( {{bold=true, foreground=255}} )
+ screen:attach({rgb=true,ext_linegrid=linegrid})
+ screen:set_default_attr_ids( {
+ [0] = {bold=true, foreground=255},
+ [1] = {bold=true, reverse=true},
+ [2] = {bold=true},
+ [3] = {reverse=true},
+ [4] = {background = Screen.colors.LightGrey, underline = true},
+ [5] = {background = Screen.colors.LightGrey, underline = true, bold = true, foreground = Screen.colors.Fuchsia},
+ [6] = {bold = true, foreground = Screen.colors.Fuchsia},
+ [7] = {bold = true, foreground = Screen.colors.SeaGreen},
+ } )
end)
after_each(function()
@@ -59,33 +74,44 @@ describe('Screen', function()
describe(':suspend', function()
it('is forwarded to the UI', function()
local function check()
- if not screen.suspended then
- return 'Screen was not suspended'
- end
+ eq(true, screen.suspended)
end
- execute('suspend')
- screen:wait(check)
+
+ command('let g:ev = []')
+ command('autocmd VimResume * :call add(g:ev, "r")')
+ command('autocmd VimSuspend * :call add(g:ev, "s")')
+
+ eq(false, screen.suspended)
+ command('suspend')
+ eq({ 's', 'r' }, eval('g:ev'))
+
+ screen:expect(check)
screen.suspended = false
+
feed('<c-z>')
- screen:wait(check)
+ eq({ 's', 'r', 's', 'r' }, eval('g:ev'))
+
+ screen:expect(check)
+ screen.suspended = false
+
+ command('suspend')
+ eq({ 's', 'r', 's', 'r', 's', 'r' }, eval('g:ev'))
end)
end)
describe('bell/visual bell', function()
it('is forwarded to the UI', function()
feed('<left>')
- screen:wait(function()
- if not screen.bell or screen.visual_bell then
- return 'Bell was not sent'
- end
+ screen:expect(function()
+ eq(true, screen.bell)
+ eq(false, screen.visual_bell)
end)
screen.bell = false
- execute('set visualbell')
+ command('set visualbell')
feed('<left>')
- screen:wait(function()
- if not screen.visual_bell or screen.bell then
- return 'Visual bell was not sent'
- end
+ screen:expect(function()
+ eq(true, screen.visual_bell)
+ eq(false, screen.bell)
end)
end)
end)
@@ -93,36 +119,28 @@ describe('Screen', function()
describe(':set title', function()
it('is forwarded to the UI', function()
local expected = 'test-title'
- execute('set titlestring='..expected)
- execute('set title')
- screen:wait(function()
- local actual = screen.title
- if actual ~= expected then
- return 'Expected title to be "'..expected..'" but was "'..actual..'"'
- end
+ command('set titlestring='..expected)
+ command('set title')
+ screen:expect(function()
+ eq(expected, screen.title)
end)
end)
it('has correct default title with unnamed file', function()
local expected = '[No Name] - NVIM'
- execute('set title')
- screen:wait(function()
- local actual = screen.title
- if actual ~= expected then
- return 'Expected title to be "'..expected..'" but was "'..actual..'"'
- end
+ command('set title')
+ screen:expect(function()
+ eq(expected, screen.title)
end)
end)
it('has correct default title with named file', function()
- local expected = 'myfile (/mydir) - NVIM'
- execute('set title')
- execute('file /mydir/myfile')
- screen:wait(function()
- local actual = screen.title
- if actual ~= expected then
- return 'Expected title to be "'..expected..'" but was "'..actual..'"'
- end
+ local expected = (iswin() and 'myfile (C:\\mydir) - NVIM'
+ or 'myfile (/mydir) - NVIM')
+ command('set title')
+ command(iswin() and 'file C:\\mydir\\myfile' or 'file /mydir/myfile')
+ screen:expect(function()
+ eq(expected, screen.title)
end)
end)
end)
@@ -130,153 +148,420 @@ describe('Screen', function()
describe(':set icon', function()
it('is forwarded to the UI', function()
local expected = 'test-icon'
- execute('set iconstring='..expected)
- execute('set icon')
- screen:wait(function()
- local actual = screen.icon
- if actual ~= expected then
- return 'Expected title to be "'..expected..'" but was "'..actual..'"'
- end
+ command('set iconstring='..expected)
+ command('set icon')
+ screen:expect(function()
+ eq(expected, screen.icon)
end)
end)
end)
+ describe('statusline', function()
+ it('is redrawn after <c-l>', function()
+ command('set laststatus=2')
+ screen:expect([[
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {1:[No Name] }|
+ |
+ ]])
+
+ feed('<c-l>')
+ screen:expect{grid=[[
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {1:[No Name] }|
+ |
+ ]], reset=true}
+
+ command('split')
+ screen:expect([[
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {1:[No Name] }|
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {3:[No Name] }|
+ |
+ ]])
+
+ feed('<c-l>')
+ screen:expect{grid=[[
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {1:[No Name] }|
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {3:[No Name] }|
+ |
+ ]], reset=true}
+ end)
+ end)
+
describe('window', function()
describe('split', function()
it('horizontal', function()
- execute('sp')
+ command('sp')
screen:expect([[
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- [No Name] |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {1:[No Name] }|
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {3:[No Name] }|
|
- ~ |
- ~ |
- ~ |
- ~ |
- [No Name] |
- :sp |
]])
end)
it('horizontal and resize', function()
- execute('sp')
- execute('resize 8')
+ command('sp')
+ command('resize 8')
screen:expect([[
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- [No Name] |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {1:[No Name] }|
+ |
+ {0:~ }|
+ {0:~ }|
+ {3:[No Name] }|
|
- ~ |
- ~ |
- [No Name] |
- :resize 8 |
]])
end)
it('horizontal and vertical', function()
- execute('sp', 'vsp', 'vsp')
+ command('sp')
+ command('vsp')
+ command('vsp')
screen:expect([[
- ^ | | |
- ~ |~ |~ |
- ~ |~ |~ |
- ~ |~ |~ |
- ~ |~ |~ |
- ~ |~ |~ |
- [No Name] [No Name] [No Name] |
+ ^ {3:โ”‚} {3:โ”‚} |
+ {0:~ }{3:โ”‚}{0:~ }{3:โ”‚}{0:~ }|
+ {0:~ }{3:โ”‚}{0:~ }{3:โ”‚}{0:~ }|
+ {0:~ }{3:โ”‚}{0:~ }{3:โ”‚}{0:~ }|
+ {0:~ }{3:โ”‚}{0:~ }{3:โ”‚}{0:~ }|
+ {0:~ }{3:โ”‚}{0:~ }{3:โ”‚}{0:~ }|
+ {1:[No Name] }{3:[No Name] [No Name] }|
|
- ~ |
- ~ |
- ~ |
- ~ |
- [No Name] |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {3:[No Name] }|
|
]])
insert('hello')
screen:expect([[
- hell^o |hello |hello |
- ~ |~ |~ |
- ~ |~ |~ |
- ~ |~ |~ |
- ~ |~ |~ |
- ~ |~ |~ |
- [No Name] [+] [No Name] [+] [No Name] [+] |
+ hell^o {3:โ”‚}hello {3:โ”‚}hello |
+ {0:~ }{3:โ”‚}{0:~ }{3:โ”‚}{0:~ }|
+ {0:~ }{3:โ”‚}{0:~ }{3:โ”‚}{0:~ }|
+ {0:~ }{3:โ”‚}{0:~ }{3:โ”‚}{0:~ }|
+ {0:~ }{3:โ”‚}{0:~ }{3:โ”‚}{0:~ }|
+ {0:~ }{3:โ”‚}{0:~ }{3:โ”‚}{0:~ }|
+ {1:[No Name] [+] }{3:[No Name] [+] [No Name] [+] }|
hello |
- ~ |
- ~ |
- ~ |
- ~ |
- [No Name] [+] |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {3:[No Name] [+] }|
|
]])
end)
end)
end)
- describe('tabnew', function()
- it('creates a new buffer', function()
- execute('sp', 'vsp', 'vsp')
+ describe('tabs', function()
+ it('tabnew creates a new buffer', function()
+ command('sp')
+ command('vsp')
+ command('vsp')
insert('hello')
screen:expect([[
- hell^o |hello |hello |
- ~ |~ |~ |
- ~ |~ |~ |
- ~ |~ |~ |
- ~ |~ |~ |
- ~ |~ |~ |
- [No Name] [+] [No Name] [+] [No Name] [+] |
+ hell^o {3:โ”‚}hello {3:โ”‚}hello |
+ {0:~ }{3:โ”‚}{0:~ }{3:โ”‚}{0:~ }|
+ {0:~ }{3:โ”‚}{0:~ }{3:โ”‚}{0:~ }|
+ {0:~ }{3:โ”‚}{0:~ }{3:โ”‚}{0:~ }|
+ {0:~ }{3:โ”‚}{0:~ }{3:โ”‚}{0:~ }|
+ {0:~ }{3:โ”‚}{0:~ }{3:โ”‚}{0:~ }|
+ {1:[No Name] [+] }{3:[No Name] [+] [No Name] [+] }|
hello |
- ~ |
- ~ |
- ~ |
- ~ |
- [No Name] [+] |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {3:[No Name] [+] }|
|
]])
- execute('tabnew')
+ command('tabnew')
insert('hello2')
feed('h')
screen:expect([[
- 4+ [No Name] + [No Name] X|
+ {4: }{5:4}{4:+ [No Name] }{2: + [No Name] }{3: }{4:X}|
hell^o2 |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- |
- ]])
- execute('tabprevious')
- screen:expect([[
- 4+ [No Name] + [No Name] X|
- hell^o |hello |hello |
- ~ |~ |~ |
- ~ |~ |~ |
- ~ |~ |~ |
- ~ |~ |~ |
- ~ |~ |~ |
- [No Name] [+] [No Name] [+] [No Name] [+] |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ command('tabprevious')
+ screen:expect([[
+ {2: }{6:4}{2:+ [No Name] }{4: + [No Name] }{3: }{4:X}|
+ hell^o {3:โ”‚}hello {3:โ”‚}hello |
+ {0:~ }{3:โ”‚}{0:~ }{3:โ”‚}{0:~ }|
+ {0:~ }{3:โ”‚}{0:~ }{3:โ”‚}{0:~ }|
+ {0:~ }{3:โ”‚}{0:~ }{3:โ”‚}{0:~ }|
+ {0:~ }{3:โ”‚}{0:~ }{3:โ”‚}{0:~ }|
+ {0:~ }{3:โ”‚}{0:~ }{3:โ”‚}{0:~ }|
+ {1:[No Name] [+] }{3:[No Name] [+] [No Name] [+] }|
hello |
- ~ |
- ~ |
- ~ |
- [No Name] [+] |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {3:[No Name] [+] }|
+ |
+ ]])
+ end)
+
+ it('tabline is redrawn after messages', function()
+ command('tabnew')
+ screen:expect([[
+ {4: [No Name] }{2: [No Name] }{3: }{4:X}|
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ feed(':echo "'..string.rep('x\\n', 11)..'"<cr>')
+ screen:expect([[
+ {1: }|
+ x |
+ x |
+ x |
+ x |
+ x |
+ x |
+ x |
+ x |
+ x |
+ x |
+ x |
+ |
+ {7:Press ENTER or type command to continue}^ |
+ ]])
+
+ feed('<cr>')
+ screen:expect([[
+ {4: [No Name] }{2: [No Name] }{3: }{4:X}|
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ feed(':echo "'..string.rep('x\\n', 12)..'"<cr>')
+ screen:expect([[
+ x |
+ x |
+ x |
+ x |
+ x |
+ x |
+ x |
+ x |
+ x |
+ x |
+ x |
+ x |
+ |
+ {7:Press ENTER or type command to continue}^ |
+ ]])
+
+ feed('<cr>')
+ screen:expect([[
+ {4: [No Name] }{2: [No Name] }{3: }{4:X}|
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ end)
+
+ it('redraws properly with :tab split right after scroll', function()
+ feed('15Ofoo<esc>15Obar<esc>gg')
+
+ command('vsplit')
+ screen:expect([[
+ ^foo {3:โ”‚}foo |
+ foo {3:โ”‚}foo |
+ foo {3:โ”‚}foo |
+ foo {3:โ”‚}foo |
+ foo {3:โ”‚}foo |
+ foo {3:โ”‚}foo |
+ foo {3:โ”‚}foo |
+ foo {3:โ”‚}foo |
+ foo {3:โ”‚}foo |
+ foo {3:โ”‚}foo |
+ foo {3:โ”‚}foo |
+ foo {3:โ”‚}foo |
+ {1:[No Name] [+] }{3:[No Name] [+] }|
+ |
+ ]])
+
+ feed('<PageDown>')
+ screen:expect([[
+ ^foo {3:โ”‚}foo |
+ foo {3:โ”‚}foo |
+ foo {3:โ”‚}foo |
+ foo {3:โ”‚}foo |
+ bar {3:โ”‚}foo |
+ bar {3:โ”‚}foo |
+ bar {3:โ”‚}foo |
+ bar {3:โ”‚}foo |
+ bar {3:โ”‚}foo |
+ bar {3:โ”‚}foo |
+ bar {3:โ”‚}foo |
+ bar {3:โ”‚}foo |
+ {1:[No Name] [+] }{3:[No Name] [+] }|
+ |
+ ]])
+ command('tab split')
+ screen:expect([[
+ {4: }{5:2}{4:+ [No Name] }{2: + [No Name] }{3: }{4:X}|
+ ^foo |
+ foo |
+ foo |
+ foo |
+ bar |
+ bar |
+ bar |
+ bar |
+ bar |
+ bar |
+ bar |
+ bar |
+ |
+ ]])
+ end)
+
+ it('redraws unvisited tab #9152', function()
+ insert('hello')
+ -- create a tab without visiting it
+ command('tabnew|tabnext')
+ screen:expect([[
+ {2: + [No Name] }{4: [No Name] }{3: }{4:X}|
+ hell^o |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ feed('gT')
+ screen:expect([[
+ {4: + [No Name] }{2: [No Name] }{3: }{4:X}|
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
|
]])
end)
@@ -289,17 +574,17 @@ describe('Screen', function()
line 1 |
line 2 |
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- -- INSERT -- |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {2:-- INSERT --} |
]])
end)
end)
@@ -307,25 +592,25 @@ describe('Screen', function()
describe('normal mode', function()
-- https://code.google.com/p/vim/issues/detail?id=339
it("setting 'ruler' doesn't reset the preferred column", function()
- execute('set virtualedit=')
+ command('set virtualedit=')
feed('i0123456<cr>789<esc>kllj')
- execute('set ruler')
+ command('set ruler')
feed('k')
screen:expect([[
0123^456 |
789 |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- :set ruler 1,5 All |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ 1,5 All |
]])
end)
end)
@@ -335,39 +620,62 @@ describe('Screen', function()
feed(':ls')
screen:expect([[
|
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
:ls^ |
]])
end)
- it('execute command with multi-line output', function()
+ it('execute command with multi-line output without msgsep', function()
+ command("set display-=msgsep")
feed(':ls<cr>')
screen:expect([[
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
:ls |
1 %a "[No Name]" line 1 |
- Press ENTER or type command to continue^ |
+ {7:Press ENTER or type command to continue}^ |
+ ]])
+ feed('<cr>') -- skip the "Press ENTER..." state or tests will hang
+ end)
+
+ it('execute command with multi-line output and with msgsep', function()
+ command("set display+=msgsep")
+ feed(':ls<cr>')
+ screen:expect([[
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {1: }|
+ :ls |
+ 1 %a "[No Name]" line 1 |
+ {7:Press ENTER or type command to continue}^ |
]])
feed('<cr>') -- skip the "Press ENTER..." state or tests will hang
end)
@@ -390,21 +698,23 @@ describe('Screen', function()
split
windows
]])
- execute('sp', 'vsp', 'vsp')
+ command('sp')
+ command('vsp')
+ command('vsp')
screen:expect([[
- and |and |and |
- clearing |clearing |clearing |
- in |in |in |
- split |split |split |
- windows |windows |windows |
- ^ | | |
- [No Name] [+] [No Name] [+] [No Name] [+] |
+ and {3:โ”‚}and {3:โ”‚}and |
+ clearing {3:โ”‚}clearing {3:โ”‚}clearing |
+ in {3:โ”‚}in {3:โ”‚}in |
+ split {3:โ”‚}split {3:โ”‚}split |
+ windows {3:โ”‚}windows {3:โ”‚}windows |
+ ^ {3:โ”‚} {3:โ”‚} |
+ {1:[No Name] [+] }{3:[No Name] [+] [No Name] [+] }|
clearing |
in |
split |
windows |
|
- [No Name] [+] |
+ {3:[No Name] [+] }|
|
]])
end)
@@ -412,121 +722,121 @@ describe('Screen', function()
it('only affects the current scroll region', function()
feed('6k')
screen:expect([[
- ^scrolling |and |and |
- and |clearing |clearing |
- clearing |in |in |
- in |split |split |
- split |windows |windows |
- windows | | |
- [No Name] [+] [No Name] [+] [No Name] [+] |
+ ^scrolling {3:โ”‚}and {3:โ”‚}and |
+ and {3:โ”‚}clearing {3:โ”‚}clearing |
+ clearing {3:โ”‚}in {3:โ”‚}in |
+ in {3:โ”‚}split {3:โ”‚}split |
+ split {3:โ”‚}windows {3:โ”‚}windows |
+ windows {3:โ”‚} {3:โ”‚} |
+ {1:[No Name] [+] }{3:[No Name] [+] [No Name] [+] }|
clearing |
in |
split |
windows |
|
- [No Name] [+] |
+ {3:[No Name] [+] }|
|
]])
feed('<c-w>l')
screen:expect([[
- scrolling |and |and |
- and |clearing |clearing |
- clearing |in |in |
- in |split |split |
- split |windows |windows |
- windows |^ | |
- [No Name] [+] [No Name] [+] <Name] [+] |
+ scrolling {3:โ”‚}and {3:โ”‚}and |
+ and {3:โ”‚}clearing {3:โ”‚}clearing |
+ clearing {3:โ”‚}in {3:โ”‚}in |
+ in {3:โ”‚}split {3:โ”‚}split |
+ split {3:โ”‚}windows {3:โ”‚}windows |
+ windows {3:โ”‚}^ {3:โ”‚} |
+ {3:[No Name] [+] }{1:[No Name] [+] }{3:<Name] [+] }|
clearing |
in |
split |
windows |
|
- [No Name] [+] |
+ {3:[No Name] [+] }|
|
]])
feed('gg')
screen:expect([[
- scrolling |^Inserting |and |
- and |text |clearing |
- clearing |with |in |
- in |many |split |
- split |lines |windows |
- windows |to | |
- [No Name] [+] [No Name] [+] <Name] [+] |
+ scrolling {3:โ”‚}^Inserting {3:โ”‚}and |
+ and {3:โ”‚}text {3:โ”‚}clearing |
+ clearing {3:โ”‚}with {3:โ”‚}in |
+ in {3:โ”‚}many {3:โ”‚}split |
+ split {3:โ”‚}lines {3:โ”‚}windows |
+ windows {3:โ”‚}to {3:โ”‚} |
+ {3:[No Name] [+] }{1:[No Name] [+] }{3:<Name] [+] }|
clearing |
in |
split |
windows |
|
- [No Name] [+] |
+ {3:[No Name] [+] }|
|
]])
feed('7j')
screen:expect([[
- scrolling |with |and |
- and |many |clearing |
- clearing |lines |in |
- in |to |split |
- split |test |windows |
- windows |^scrolling | |
- [No Name] [+] [No Name] [+] <Name] [+] |
+ scrolling {3:โ”‚}with {3:โ”‚}and |
+ and {3:โ”‚}many {3:โ”‚}clearing |
+ clearing {3:โ”‚}lines {3:โ”‚}in |
+ in {3:โ”‚}to {3:โ”‚}split |
+ split {3:โ”‚}test {3:โ”‚}windows |
+ windows {3:โ”‚}^scrolling {3:โ”‚} |
+ {3:[No Name] [+] }{1:[No Name] [+] }{3:<Name] [+] }|
clearing |
in |
split |
windows |
|
- [No Name] [+] |
+ {3:[No Name] [+] }|
|
]])
feed('2j')
screen:expect([[
- scrolling |lines |and |
- and |to |clearing |
- clearing |test |in |
- in |scrolling |split |
- split |and |windows |
- windows |^clearing | |
- [No Name] [+] [No Name] [+] <Name] [+] |
+ scrolling {3:โ”‚}lines {3:โ”‚}and |
+ and {3:โ”‚}to {3:โ”‚}clearing |
+ clearing {3:โ”‚}test {3:โ”‚}in |
+ in {3:โ”‚}scrolling {3:โ”‚}split |
+ split {3:โ”‚}and {3:โ”‚}windows |
+ windows {3:โ”‚}^clearing {3:โ”‚} |
+ {3:[No Name] [+] }{1:[No Name] [+] }{3:<Name] [+] }|
clearing |
in |
split |
windows |
|
- [No Name] [+] |
+ {3:[No Name] [+] }|
|
]])
feed('5k')
screen:expect([[
- scrolling |^lines |and |
- and |to |clearing |
- clearing |test |in |
- in |scrolling |split |
- split |and |windows |
- windows |clearing | |
- [No Name] [+] [No Name] [+] <Name] [+] |
+ scrolling {3:โ”‚}^lines {3:โ”‚}and |
+ and {3:โ”‚}to {3:โ”‚}clearing |
+ clearing {3:โ”‚}test {3:โ”‚}in |
+ in {3:โ”‚}scrolling {3:โ”‚}split |
+ split {3:โ”‚}and {3:โ”‚}windows |
+ windows {3:โ”‚}clearing {3:โ”‚} |
+ {3:[No Name] [+] }{1:[No Name] [+] }{3:<Name] [+] }|
clearing |
in |
split |
windows |
|
- [No Name] [+] |
+ {3:[No Name] [+] }|
|
]])
feed('k')
screen:expect([[
- scrolling |^many |and |
- and |lines |clearing |
- clearing |to |in |
- in |test |split |
- split |scrolling |windows |
- windows |and | |
- [No Name] [+] [No Name] [+] <Name] [+] |
+ scrolling {3:โ”‚}^many {3:โ”‚}and |
+ and {3:โ”‚}lines {3:โ”‚}clearing |
+ clearing {3:โ”‚}to {3:โ”‚}in |
+ in {3:โ”‚}test {3:โ”‚}split |
+ split {3:โ”‚}scrolling {3:โ”‚}windows |
+ windows {3:โ”‚}and {3:โ”‚} |
+ {3:[No Name] [+] }{1:[No Name] [+] }{3:<Name] [+] }|
clearing |
in |
split |
windows |
|
- [No Name] [+] |
+ {3:[No Name] [+] }|
|
]])
end)
@@ -541,20 +851,20 @@ describe('Screen', function()
it('rebuilds the whole screen', function()
screen:expect([[
resize^ |
- ~ |
- ~ |
- ~ |
- -- INSERT -- |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {2:-- INSERT --} |
]])
end)
- -- FIXME this has some race conditions that cause it to fail periodically
- pending('has minimum width/height values', function()
+ it('has minimum width/height values', function()
screen:try_resize(1, 1)
screen:expect([[
- -- INS^ERT --|
- |
+ resize^ |
+ {2:-- INSERT -} |
]])
+
feed('<esc>:ls')
screen:expect([[
resize |
@@ -562,4 +872,91 @@ describe('Screen', function()
]])
end)
end)
+
+ describe('press enter', function()
+ it('does not crash on <F1> at โ€œPress ENTERโ€', function()
+ command('nnoremap <F1> :echo "TEST"<CR>')
+ feed(':ls<CR>')
+ screen:expect([[
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {1: }|
+ :ls |
+ 1 %a "[No Name]" line 1 |
+ {7:Press ENTER or type command to continue}^ |
+ ]])
+ feed('<F1>')
+ screen:expect([[
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ TEST |
+ ]])
+ end)
+ end)
+
+ -- Regression test for #8357
+ it('does not have artifacts after temporary chars in insert mode', function()
+ command('inoremap jk <esc>')
+ feed('ifooj')
+ screen:expect([[
+ foo^j |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {2:-- INSERT --} |
+ ]])
+ feed('k')
+ screen:expect([[
+ fo^o |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ end)
+end
+
+describe("Screen (char-based)", function()
+ screen_tests(false)
+end)
+
+describe("Screen (line-based)", function()
+ screen_tests(true)
end)
diff --git a/test/functional/ui/searchhl_spec.lua b/test/functional/ui/searchhl_spec.lua
index 894a75d355..a46670d8a2 100644
--- a/test/functional/ui/searchhl_spec.lua
+++ b/test/functional/ui/searchhl_spec.lua
@@ -1,41 +1,40 @@
local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute = helpers.execute
+local command = helpers.command
+local feed_command = helpers.feed_command
+local eq = helpers.eq
+local eval = helpers.eval
+local iswin = helpers.iswin
+local sleep = helpers.sleep
describe('search highlighting', function()
local screen
local colors = Screen.colors
- local hl_colors = {
- NonText = colors.Blue,
- Search = colors.Yellow,
- Message = colors.Red,
- }
before_each(function()
clear()
screen = Screen.new(40, 7)
screen:attach()
- --ignore highligting of ~-lines
screen:set_default_attr_ids( {
- [1] = {background = hl_colors.Search},
- [2] = {reverse = true},
- [3] = {foreground = hl_colors.Message},
+ [1] = {bold=true, foreground=Screen.colors.Blue},
+ [2] = {background = colors.Yellow}, -- Search
+ [3] = {reverse = true},
+ [4] = {foreground = colors.Red}, -- Message
})
- screen:set_default_attr_ignore( {{bold=true, foreground=hl_colors.NonText}} )
end)
it('is disabled by ":set nohlsearch"', function()
- execute('set nohlsearch')
+ feed_command('set nohlsearch')
insert("some text\nmore text")
feed("gg/text<cr>")
screen:expect([[
some ^text |
more text |
- ~ |
- ~ |
- ~ |
- ~ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
/text |
]])
end)
@@ -51,98 +50,206 @@ describe('search highlighting', function()
-- 'hlsearch' is enabled by default. #2859
feed("gg/text<cr>")
screen:expect([[
- some {1:^text} |
- more {1:text}stuff |
- stupid{1:texttext}stuff |
- a {1:text} word |
+ some {2:^text} |
+ more {2:text}stuff |
+ stupid{2:texttext}stuff |
+ a {2:text} word |
|
- ~ |
+ {1:~ }|
/text |
]])
-- overlapping matches not allowed
feed("3nx")
screen:expect([[
- some {1:text} |
- more {1:text}stuff |
- stupid{1:text}^extstuff |
- a {1:text} word |
+ some {2:text} |
+ more {2:text}stuff |
+ stupid{2:text}^extstuff |
+ a {2:text} word |
|
- ~ |
+ {1:~ }|
/text |
]])
feed("ggn*") -- search for entire word
screen:expect([[
- some {1:text} |
+ some {2:text} |
more textstuff |
stupidtextextstuff |
- a {1:^text} word |
+ a {2:^text} word |
|
- ~ |
+ {1:~ }|
/\<text\> |
]])
- execute("nohlsearch")
+ feed_command("nohlsearch")
screen:expect([[
some text |
more textstuff |
stupidtextextstuff |
a ^text word |
|
- ~ |
+ {1:~ }|
:nohlsearch |
]])
end)
+ it('highlights after EOL', function()
+ insert("\n\n\n\n\n\n")
+
+ feed("gg/^<cr>")
+ screen:expect([[
+ {2: } |
+ {2:^ } |
+ {2: } |
+ {2: } |
+ {2: } |
+ {2: } |
+ /^ |
+ ]])
+
+ -- Test that highlights are preserved after moving the cursor.
+ feed("j")
+ screen:expect([[
+ {2: } |
+ {2: } |
+ {2:^ } |
+ {2: } |
+ {2: } |
+ {2: } |
+ /^ |
+ ]])
+
+ -- Repeat the test in rightleft mode.
+ command("nohlsearch")
+ command("set rightleft")
+ feed("gg/^<cr>")
+
+ screen:expect([[
+ {2: }|
+ {2:^ }|
+ {2: }|
+ {2: }|
+ {2: }|
+ {2: }|
+ ^/ |
+ ]])
+
+ feed("j")
+ screen:expect([[
+ {2: }|
+ {2: }|
+ {2:^ }|
+ {2: }|
+ {2: }|
+ {2: }|
+ ^/ |
+ ]])
+ end)
+
+ it('is preserved during :terminal activity', function()
+ if iswin() then
+ feed([[:terminal for /L \%I in (1,1,5000) do @(echo xxx & echo xxx & echo xxx)<cr>]])
+ else
+ feed([[:terminal for i in $(seq 1 5000); do printf 'xxx\nxxx\nxxx\n'; done<cr>]])
+ end
+
+ feed(':file term<CR>')
+ feed(':vnew<CR>')
+ insert([[
+ foo bar baz
+ bar baz foo
+ bar foo baz
+ ]])
+ feed('/foo')
+ sleep(50) -- Allow some terminal activity.
+ screen:expect([[
+ {3:foo} bar baz {3:โ”‚}xxx |
+ bar baz {2:foo} {3:โ”‚}xxx |
+ bar {2:foo} baz {3:โ”‚}xxx |
+ {3:โ”‚}xxx |
+ {1:~ }{3:โ”‚}xxx |
+ {5:[No Name] [+] }{3:term }|
+ /foo^ |
+ ]], { [1] = {bold = true, foreground = Screen.colors.Blue1},
+ [2] = {background = Screen.colors.Yellow},
+ [3] = {reverse = true},
+ [4] = {foreground = Screen.colors.Red},
+ [5] = {bold = true, reverse = true},
+ })
+ end)
+
it('works with incsearch', function()
- execute('set hlsearch')
- execute('set incsearch')
+ feed_command('set hlsearch')
+ feed_command('set incsearch')
insert([[
the first line
in a little file
]])
feed("gg/li")
screen:expect([[
+ the first {3:li}ne |
+ in a {2:li}ttle file |
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ /li^ |
+ ]])
+
+ -- check that consecutive matches are caught by C-g/C-t
+ feed("<C-g>")
+ screen:expect([[
the first {2:li}ne |
- in a little file |
+ in a {3:li}ttle file |
|
- ~ |
- ~ |
- ~ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ /li^ |
+ ]])
+
+ feed("<C-t>")
+ screen:expect([[
+ the first {3:li}ne |
+ in a {2:li}ttle file |
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
/li^ |
]])
feed("t")
screen:expect([[
the first line |
- in a {2:lit}tle file |
+ in a {3:lit}tle file |
|
- ~ |
- ~ |
- ~ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
/lit^ |
]])
feed("<cr>")
screen:expect([[
the first line |
- in a {1:^lit}tle file |
+ in a {2:^lit}tle file |
|
- ~ |
- ~ |
- ~ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
/lit |
]])
feed("/fir")
screen:expect([[
- the {2:fir}st line |
- in a {1:lit}tle file |
+ the {3:fir}st line |
+ in a little file |
|
- ~ |
- ~ |
- ~ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
/fir^ |
]])
@@ -150,135 +257,244 @@ describe('search highlighting', function()
feed("<esc>/ttle")
screen:expect([[
the first line |
- in a {1:li}{2:ttle} file |
+ in a li{3:ttle} file |
|
- ~ |
- ~ |
- ~ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
/ttle^ |
]])
+
+ -- cancelling search resets to the old search term
+ feed('<esc>')
+ screen:expect([[
+ the first line |
+ in a {2:^lit}tle file |
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+ eq('lit', eval('@/'))
+
+ -- cancelling inc search restores the hl state
+ feed(':noh<cr>')
+ screen:expect([[
+ the first line |
+ in a ^little file |
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ :noh |
+ ]])
+
+ feed('/first')
+ screen:expect([[
+ the {3:first} line |
+ in a little file |
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ /first^ |
+ ]])
+ feed('<esc>')
+ screen:expect([[
+ the first line |
+ in a ^little file |
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+
+ -- test that pressing C-g in an empty command line does not move the cursor
+ feed('/<C-g>')
+ screen:expect([[
+ the first line |
+ in a little file |
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ /^ |
+ ]])
+
+ -- same, for C-t
+ feed('<ESC>')
+ screen:expect([[
+ the first line |
+ in a ^little file |
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+ feed('/<C-t>')
+ screen:expect([[
+ the first line |
+ in a little file |
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ /^ |
+ ]])
+
+ -- 8.0.1304, test that C-g and C-t works with incsearch and empty pattern
+ feed('<esc>/fi<CR>')
+ feed('//')
+ screen:expect([[
+ the {3:fi}rst line |
+ in a little {2:fi}le |
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ //^ |
+ ]])
+
+ feed('<C-g>')
+ screen:expect([[
+ the {2:fi}rst line |
+ in a little {3:fi}le |
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ //^ |
+ ]])
end)
it('works with incsearch and offset', function()
- execute('set hlsearch')
- execute('set incsearch')
+ feed_command('set hlsearch')
+ feed_command('set incsearch')
insert([[
not the match you're looking for
the match is here]])
feed("gg/mat/e")
screen:expect([[
- not the {2:mat}ch you're looking for |
- the match is here |
- ~ |
- ~ |
- ~ |
- ~ |
+ not the {3:mat}ch you're looking for |
+ the {2:mat}ch is here |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
/mat/e^ |
]])
-- Search with count and /e offset fixed in Vim patch 7.4.532.
feed("<esc>2/mat/e")
screen:expect([[
- not the match you're looking for |
- the {2:mat}ch is here |
- ~ |
- ~ |
- ~ |
- ~ |
+ not the {2:mat}ch you're looking for |
+ the {3:mat}ch is here |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
/mat/e^ |
]])
feed("<cr>")
screen:expect([[
- not the {1:mat}ch you're looking for |
- the {1:ma^t}ch is here |
- ~ |
- ~ |
- ~ |
- ~ |
+ not the {2:mat}ch you're looking for |
+ the {2:ma^t}ch is here |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
/mat/e |
]])
end)
it('works with multiline regexps', function()
- execute('set hlsearch')
+ feed_command('set hlsearch')
feed('4oa repeated line<esc>')
feed('/line\\na<cr>')
screen:expect([[
|
- a repeated {1:^line} |
- {1:a} repeated {1:line} |
- {1:a} repeated {1:line} |
- {1:a} repeated line |
- ~ |
- {3:search hit BOTTOM, continuing at TOP} |
+ a repeated {2:^line} |
+ {2:a} repeated {2:line} |
+ {2:a} repeated {2:line} |
+ {2:a} repeated line |
+ {1:~ }|
+ {4:search hit BOTTOM, continuing at TOP} |
]])
-- it redraws rows above the changed one
feed('4Grb')
screen:expect([[
|
- a repeated {1:line} |
- {1:a} repeated line |
- ^b repeated {1:line} |
- {1:a} repeated line |
- ~ |
- {3:search hit BOTTOM, continuing at TOP} |
+ a repeated {2:line} |
+ {2:a} repeated line |
+ ^b repeated {2:line} |
+ {2:a} repeated line |
+ {1:~ }|
+ {4:search hit BOTTOM, continuing at TOP} |
]])
end)
it('works with matchadd and syntax', function()
- execute('set hlsearch')
+ screen:set_default_attr_ids( {
+ [1] = {bold=true, foreground=Screen.colors.Blue},
+ [2] = {background = colors.Yellow},
+ [3] = {reverse = true},
+ [4] = {foreground = colors.Red},
+ [5] = {bold = true, background = colors.Green},
+ [6] = {italic = true, background = colors.Magenta},
+ [7] = {bold = true, background = colors.Yellow},
+ } )
+ feed_command('set hlsearch')
insert([[
very special text
]])
- execute("syntax on")
- execute("highlight MyGroup guibg=Green gui=bold")
- execute("highlight MyGroup2 guibg=Magenta gui=italic")
- execute("call matchadd('MyGroup', 'special')")
- execute("call matchadd('MyGroup2', 'text', 0)")
+ feed_command("syntax on")
+ feed_command("highlight MyGroup guibg=Green gui=bold")
+ feed_command("highlight MyGroup2 guibg=Magenta gui=italic")
+ feed_command("call matchadd('MyGroup', 'special')")
+ feed_command("call matchadd('MyGroup2', 'text', 0)")
-- searchhl and matchadd matches are exclusive, only the higest priority
-- is used (and matches with lower priorities are not combined)
- execute("/ial te")
+ feed_command("/ial te")
screen:expect([[
- very {4:spec^ial}{1: te}{5:xt} |
+ very {5:spec^ial}{2: te}{6:xt} |
|
- ~ |
- ~ |
- ~ |
- ~ |
- {3:search hit BOTTOM, continuing at TOP} |
- ]], {[1] = {background = hl_colors.Search}, [2] = {reverse = true},
- [3] = {foreground = hl_colors.Message}, [4] = {bold = true, background =
- colors.Green}, [5] = {italic = true, background = colors.Magenta}})
-
- execute("call clearmatches()")
- screen:expect([[
- very spec{1:^ial te}xt |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {4:search hit BOTTOM, continuing at TOP} |
+ ]])
+
+ feed_command("call clearmatches()")
+ screen:expect([[
+ very spec{2:^ial te}xt |
|
- ~ |
- ~ |
- ~ |
- ~ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
:call clearmatches() |
]])
-- searchhl has priority over syntax, but in this case
-- nonconflicting attributes are combined
- execute("syntax keyword MyGroup special")
+ feed_command("syntax keyword MyGroup special")
screen:expect([[
- very {4:spec}{5:^ial}{1: te}xt |
+ very {5:spec}{7:^ial}{2: te}xt |
|
- ~ |
- ~ |
- ~ |
- ~ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
:syntax keyword MyGroup special |
- ]], {[1] = {background = hl_colors.Search}, [2] = {reverse = true},
- [3] = {foreground = hl_colors.Message}, [4] = {bold = true,
- background = colors.Green}, [5] = {bold = true, background = hl_colors.Search}})
+ ]])
end)
end)
diff --git a/test/functional/ui/sign_spec.lua b/test/functional/ui/sign_spec.lua
index 2b6e294627..bc0e2e3799 100644
--- a/test/functional/ui/sign_spec.lua
+++ b/test/functional/ui/sign_spec.lua
@@ -1,6 +1,7 @@
local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
-local clear, feed, execute = helpers.clear, helpers.feed, helpers.execute
+local clear, feed, command = helpers.clear, helpers.feed, helpers.command
+local source = helpers.source
describe('Signs', function()
local screen
@@ -9,7 +10,20 @@ describe('Signs', function()
clear()
screen = Screen.new()
screen:attach()
- screen:set_default_attr_ignore( {{}, {bold=true, foreground=255}} )
+ screen:set_default_attr_ids( {
+ [0] = {bold=true, foreground=255},
+ [1] = {background = Screen.colors.Yellow},
+ [2] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.Grey},
+ [3] = {background = Screen.colors.Gray90},
+ [4] = {bold = true, reverse = true},
+ [5] = {reverse = true},
+ [6] = {foreground = Screen.colors.Brown},
+ [7] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.LightGrey},
+ [8] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
+ [9] = {bold = true, foreground = Screen.colors.Magenta},
+ [10] = {foreground = Screen.colors.Blue1},
+ [11] = {bold = true, foreground = Screen.colors.SeaGreen4},
+ } )
end)
after_each(function()
@@ -19,26 +33,125 @@ describe('Signs', function()
describe(':sign place', function()
it('shadows previously placed signs', function()
feed('ia<cr>b<cr>c<cr><esc>')
- execute('sign define piet text=>> texthl=Search')
- execute('sign define pietx text=>! texthl=Search')
- execute('sign place 1 line=1 name=piet buffer=1')
- execute('sign place 2 line=3 name=piet buffer=1')
- execute('sign place 3 line=1 name=pietx buffer=1')
+ command('sign define piet text=>> texthl=Search')
+ command('sign define pietx text=>! texthl=Search')
+ command('sign place 1 line=1 name=piet buffer=1')
+ command('sign place 2 line=3 name=piet buffer=1')
+ command('sign place 3 line=1 name=pietx buffer=1')
screen:expect([[
- >!a |
- b |
- >>c |
- ^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- :sign place 3 line=1 name=pietx buffer=1 |
+ {1:>!}a |
+ {2: }b |
+ {1:>>}c |
+ {2: }^ |
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ |
+ ]])
+ end)
+
+ it('can be called right after :split', function()
+ feed('ia<cr>b<cr>c<cr><esc>gg')
+ -- This used to cause a crash due to :sign using a special redraw
+ -- (not updating nvim's specific highlight data structures)
+ -- without proper redraw first, as split just flags for redraw later.
+ source([[
+ set cursorline
+ sign define piet text=>> texthl=Search
+ split
+ sign place 3 line=2 name=piet buffer=1
+ ]])
+ screen:expect([[
+ {2: }{3:^a }|
+ {1:>>}b |
+ {2: }c |
+ {2: } |
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {4:[No Name] [+] }|
+ {2: }{3:a }|
+ {1:>>}b |
+ {2: }c |
+ {2: } |
+ {2: }{0:~ }|
+ {5:[No Name] [+] }|
+ |
+ ]])
+ end)
+
+ it('can combine text, linehl and numhl', function()
+ feed('ia<cr>b<cr>c<cr><esc>')
+ command('set number')
+ command('sign define piet text=>> texthl=Search')
+ command('sign define pietx linehl=ErrorMsg')
+ command('sign define pietxx numhl=Folded')
+ command('sign place 1 line=1 name=piet buffer=1')
+ command('sign place 2 line=2 name=pietx buffer=1')
+ command('sign place 3 line=3 name=pietxx buffer=1')
+ command('sign place 4 line=4 name=piet buffer=1')
+ command('sign place 5 line=4 name=pietx buffer=1')
+ command('sign place 6 line=4 name=pietxx buffer=1')
+ screen:expect([[
+ {1:>>}{6: 1 }a |
+ {2: }{6: 2 }{8:b }|
+ {2: }{7: 3 }c |
+ {1:>>}{7: 4 }{8:^ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ |
+ ]])
+ end)
+
+ it('can have 32bit sign IDs', function()
+ command('sign define piet text=>> texthl=Search')
+ command('sign place 100000 line=1 name=piet buffer=1')
+ feed(':sign place<cr>')
+ screen:expect([[
+ {1:>>} |
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {4: }|
+ :sign place |
+ {9:--- Signs ---} |
+ {10:Signs for [NULL]:} |
+ line=1 id=100000 name=piet |
+ |
+ {11:Press ENTER or type command to continue}^ |
+ ]])
+
+ feed('<cr>')
+ screen:expect([[
+ {1:>>}^ |
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ {2: }{0:~ }|
+ |
]])
end)
end)
diff --git a/test/functional/ui/spell_spec.lua b/test/functional/ui/spell_spec.lua
new file mode 100644
index 0000000000..913f1b9bed
--- /dev/null
+++ b/test/functional/ui/spell_spec.lua
@@ -0,0 +1,49 @@
+-- Test for scenarios involving 'spell'
+
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+local clear = helpers.clear
+local feed = helpers.feed
+local feed_command = helpers.feed_command
+local insert = helpers.insert
+
+describe("'spell'", function()
+ local screen
+
+ before_each(function()
+ clear()
+ screen = Screen.new(80, 8)
+ screen:attach()
+ screen:set_default_attr_ids( {
+ [0] = {bold=true, foreground=Screen.colors.Blue},
+ [1] = {special = Screen.colors.Red, undercurl = true}
+ })
+ end)
+
+ after_each(function()
+ screen:detach()
+ end)
+
+ it('joins long lines #7937', function()
+ feed_command('set spell')
+ insert([[
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
+ tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
+ cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat
+ non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ ]])
+ feed('ggJJJJJJ0')
+ screen:expect([[
+ {1:^Lorem} {1:ipsum} dolor sit {1:amet}, {1:consectetur} {1:adipiscing} {1:elit}, {1:sed} do {1:eiusmod} {1:tempor} {1:i}|
+ {1:ncididunt} {1:ut} {1:labore} {1:et} {1:dolore} {1:magna} {1:aliqua}. {1:Ut} {1:enim} ad minim {1:veniam}, {1:quis} {1:nostru}|
+ {1:d} {1:exercitation} {1:ullamco} {1:laboris} {1:nisi} {1:ut} {1:aliquip} ex ea {1:commodo} {1:consequat}. {1:Duis} {1:aut}|
+ {1:e} {1:irure} dolor in {1:reprehenderit} in {1:voluptate} {1:velit} {1:esse} {1:cillum} {1:dolore} {1:eu} {1:fugiat} {1:n}|
+ {1:ulla} {1:pariatur}. {1:Excepteur} {1:sint} {1:occaecat} {1:cupidatat} non {1:proident}, {1:sunt} in culpa {1:qui}|
+ {1:officia} {1:deserunt} {1:mollit} {1:anim} id est {1:laborum}. |
+ {0:~ }|
+ |
+ ]])
+ end)
+end)
diff --git a/test/functional/ui/syntax_conceal_spec.lua b/test/functional/ui/syntax_conceal_spec.lua
index c2ab0711c0..d678784dc9 100644
--- a/test/functional/ui/syntax_conceal_spec.lua
+++ b/test/functional/ui/syntax_conceal_spec.lua
@@ -1,27 +1,33 @@
local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
-local clear, feed, execute = helpers.clear, helpers.feed, helpers.execute
+local clear, feed, command = helpers.clear, helpers.feed, helpers.command
local insert = helpers.insert
describe('Screen', function()
- local screen
+ local screen
- before_each(function()
+ before_each(function()
clear()
screen = Screen.new(nil,10)
screen:attach()
- screen:set_default_attr_ignore( {{bold=true, foreground=255}} )
- screen:set_default_attr_ids( {{foreground = Screen.colors.LightGrey, background = Screen.colors.DarkGray}} )
+ screen:set_default_attr_ids( {
+ [0] = {bold=true, foreground=Screen.colors.Blue},
+ [1] = {foreground = Screen.colors.LightGrey, background = Screen.colors.DarkGray},
+ [2] = {bold = true, reverse = true},
+ [3] = {reverse = true},
+ [4] = {bold = true},
+ [5] = {background = Screen.colors.Yellow},
+ } )
end)
-
+
after_each(function()
screen:detach()
- end)
+ end)
describe("match and conceal", function()
before_each(function()
- execute("let &conceallevel=1")
+ command("let &conceallevel=1")
end)
describe("multiple", function()
@@ -34,7 +40,7 @@ describe('Screen', function()
&&
&&
]])
- execute("syn match dAmpersand '[&][&]' conceal cchar=โˆง")
+ command("syn match dAmpersand '[&][&]' conceal cchar=โˆง")
end)
it("double characters.", function()
@@ -46,13 +52,13 @@ describe('Screen', function()
{1:โˆง} |
{1:โˆง} |
^ |
- ~ |
- ~ |
- :syn match dAmpersand '[&][&]' conceal cchar=โˆง |
+ {0:~ }|
+ {0:~ }|
+ |
]])
end)
- it('double characters and move the cursor one line up.', function()
+ it('double characters and move the cursor one line up.', function()
feed("k")
screen:expect([[
{1:โˆง} |
@@ -62,9 +68,9 @@ describe('Screen', function()
{1:โˆง} |
^&& |
|
- ~ |
- ~ |
- :syn match dAmpersand '[&][&]' conceal cchar=โˆง |
+ {0:~ }|
+ {0:~ }|
+ |
]])
end)
@@ -78,13 +84,13 @@ describe('Screen', function()
{1:โˆง} |
{1:โˆง} |
|
- ~ |
- ~ |
- :syn match dAmpersand '[&][&]' conceal cchar=โˆง |
+ {0:~ }|
+ {0:~ }|
+ |
]])
end)
- it('double characters and move the cursor to the second line in the file.', function()
+ it('double characters and move the cursor to the second line in the file.', function()
feed("ggj")
screen:expect([[
{1:โˆง} |
@@ -94,13 +100,13 @@ describe('Screen', function()
{1:โˆง} |
{1:โˆง} |
|
- ~ |
- ~ |
- :syn match dAmpersand '[&][&]' conceal cchar=โˆง |
+ {0:~ }|
+ {0:~ }|
+ |
]])
end)
- it('double characters and then move the cursor to the beginning of the file and back to the end of the file.', function()
+ it('double characters and then move the cursor to the beginning of the file and back to the end of the file.', function()
feed("ggG")
screen:expect([[
{1:โˆง} |
@@ -110,51 +116,51 @@ describe('Screen', function()
{1:โˆง} |
{1:โˆง} |
^ |
- ~ |
- ~ |
- :syn match dAmpersand '[&][&]' conceal cchar=โˆง |
+ {0:~ }|
+ {0:~ }|
+ |
]])
end)
- end) -- multiple
-
+ end) -- multiple
+
it("keyword instances in initially in the document.", function()
feed("2ilambda<cr><ESC>")
- execute("let &conceallevel=1")
- execute("syn keyword kLambda lambda conceal cchar=ฮป")
+ command("let &conceallevel=1")
+ command("syn keyword kLambda lambda conceal cchar=ฮป")
screen:expect([[
{1:ฮป} |
{1:ฮป} |
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- :syn keyword kLambda lambda conceal cchar=ฮป |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
]])
end) -- Keyword
describe("regions in the document", function()
- before_each(function()
+ before_each(function()
feed("2")
insert("<r> a region of text </r>\n")
- execute("let &conceallevel=1")
+ command("let &conceallevel=1")
end)
-
- it('initially and conceal it.', function()
- execute("syn region rText start='<r>' end='</r>' conceal cchar=R")
+
+ it('initially and conceal it.', function()
+ command("syn region rText start='<r>' end='</r>' conceal cchar=R")
screen:expect([[
{1:R} |
{1:R} |
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
|
]])
end)
@@ -162,23 +168,23 @@ describe('Screen', function()
it('initially and conceal its start tag and end tag.', function()
-- concealends has a known bug (todo.txt) where the first match won't
-- be replaced with cchar.
- execute("syn region rText matchgroup=rMatch start='<r>' end='</r>' concealends cchar=-")
+ command("syn region rText matchgroup=rMatch start='<r>' end='</r>' concealends cchar=-")
screen:expect([[
{1: } a region of text {1:-} |
{1: } a region of text {1:-} |
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
|
]])
end)
-
+
it('that are nested and conceal the nested region\'s start and end tags.', function()
- execute("syn region rText contains=rText matchgroup=rMatch start='<r>' end='</r>' concealends cchar=-")
+ command("syn region rText contains=rText matchgroup=rMatch start='<r>' end='</r>' concealends cchar=-")
insert("<r> A region with <r> a nested <r> nested region.</r> </r> </r>\n")
screen:expect([[
{1: } a region of text {1:-} |
@@ -186,21 +192,21 @@ describe('Screen', function()
{1: } A region with {1: } a nested {1: } nested region.{1:-} |
{1:-} {1:-} |
^ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
|
]])
end)
end) -- regions in the document
describe("a region of text", function()
- before_each(function()
- execute("syntax conceal on")
+ before_each(function()
+ command("syntax conceal on")
feed("2")
insert("<r> a region of text </r>\n")
- execute("syn region rText start='<r>' end='</r>' cchar=-")
+ command("syn region rText start='<r>' end='</r>' cchar=-")
end)
it("and turn on implicit concealing", function()
@@ -208,123 +214,613 @@ describe('Screen', function()
{1:-} |
{1:-} |
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- :syn region rText start='<r>' end='</r>' cchar=- |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
]])
end)
it("and then turn on, then off, and then back on implicit concealing.", function()
- execute("syntax conceal off")
+ command("syntax conceal off")
feed("2")
insert("<i> italian text </i>\n")
- execute("syn region iText start='<i>' end='</i>' cchar=*")
+ command("syn region iText start='<i>' end='</i>' cchar=*")
screen:expect([[
{1:-} |
{1:-} |
<i> italian text </i> |
<i> italian text </i> |
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- :syn region iText start='<i>' end='</i>' cchar=* |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
]])
- execute("syntax conceal on")
- execute("syn region iText start='<i>' end='</i>' cchar=*")
+ command("syntax conceal on")
+ command("syn region iText start='<i>' end='</i>' cchar=*")
screen:expect([[
{1:-} |
{1:-} |
{1:*} |
{1:*} |
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- :syn region iText start='<i>' end='</i>' cchar=* |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
]])
end)
end) -- a region of text (implicit concealing)
end) -- match and conceal
- describe("let the conceal level be", function()
+ describe("let the conceal level be", function()
before_each(function()
- insert("// No Conceal\n")
- insert('"Conceal without a cchar"\n')
- insert("+ With cchar\n\n")
- execute("syn match noConceal '^//.*$'")
- execute("syn match concealNoCchar '\".\\{-}\"$' conceal")
- execute("syn match concealWCchar '^+.\\{-}$' conceal cchar=C")
+ insert("// No Conceal\n")
+ insert('"Conceal without a cchar"\n')
+ insert("+ With cchar\n\n")
+ command("syn match noConceal '^//.*$'")
+ command("syn match concealNoCchar '\".\\{-}\"$' conceal")
+ command("syn match concealWCchar '^+.\\{-}$' conceal cchar=C")
end)
-
- it("0. No concealing.", function()
- execute("let &conceallevel=0")
+
+ it("0. No concealing.", function()
+ command("let &conceallevel=0")
screen:expect([[
// No Conceal |
"Conceal without a cchar" |
+ With cchar |
|
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- :let &conceallevel=0 |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
]])
end)
-
+
it("1. Conceal using cchar or reference listchars.", function()
- execute("let &conceallevel=1")
+ command("let &conceallevel=1")
screen:expect([[
// No Conceal |
{1: } |
{1:C} |
|
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- :let &conceallevel=1 |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
]])
end)
-
+
it("2. Hidden unless cchar is set.", function()
- execute("let &conceallevel=2")
+ command("let &conceallevel=2")
screen:expect([[
// No Conceal |
|
{1:C} |
|
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- :let &conceallevel=2 |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
]])
end)
-
- it("3. Hide all concealed text.", function()
- execute("let &conceallevel=3")
+
+ it("3. Hide all concealed text.", function()
+ command("let &conceallevel=3")
screen:expect([[
// No Conceal |
|
|
|
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- :let &conceallevel=3 |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
]])
end)
end) -- conceallevel
+
+
+ describe("cursor movement", function()
+ before_each(function()
+ command("syn keyword concealy barf conceal cchar=b")
+ command("set cole=2")
+ feed('5Ofoo barf bar barf eggs<esc>')
+ screen:expect([[
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo barf bar barf egg^s |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ end)
+
+ it('between windows', function()
+ command("split")
+ screen:expect([[
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo barf bar barf egg^s |
+ |
+ {2:[No Name] [+] }|
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {3:[No Name] [+] }|
+ |
+ ]])
+ feed('<c-w>w')
+
+ screen:expect([[
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {3:[No Name] [+] }|
+ foo {1:b} bar {1:b} eggs |
+ foo barf bar barf egg^s |
+ |
+ {2:[No Name] [+] }|
+ |
+ ]])
+ end)
+
+ it('in insert mode', function()
+ feed('i')
+ screen:expect([[
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo barf bar barf egg^s |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {4:-- INSERT --} |
+ ]])
+
+ feed('<up>')
+ screen:expect([[
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo barf bar barf egg^s |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {4:-- INSERT --} |
+ ]])
+ end)
+
+ it('between modes cocu=iv', function()
+ command('set cocu=iv')
+ feed('gg')
+ screen:expect([[
+ ^foo barf bar barf eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ feed('i')
+ screen:expect([[
+ ^foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {4:-- INSERT --} |
+ ]])
+
+ feed('<esc>')
+ screen:expect([[
+ ^foo barf bar barf eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ feed('v')
+ screen:expect([[
+ ^foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {4:-- VISUAL --} |
+ ]])
+
+ feed('<esc>')
+ screen:expect([[
+ ^foo barf bar barf eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ end)
+
+ it('between modes cocu=n', function()
+ command('set cocu=n')
+ feed('gg')
+ screen:expect([[
+ ^foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ feed('i')
+ screen:expect([[
+ ^foo barf bar barf eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {4:-- INSERT --} |
+ ]])
+
+ feed('<esc>')
+ screen:expect([[
+ ^foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+
+ feed('v')
+ screen:expect([[
+ ^foo barf bar barf eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {4:-- VISUAL --} |
+ ]])
+
+ feed('<esc>')
+ screen:expect([[
+ ^foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ end)
+
+ it('and open line', function()
+ feed('o')
+ screen:expect([[
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ ^ |
+ |
+ {0:~ }|
+ {0:~ }|
+ {4:-- INSERT --} |
+ ]])
+ end)
+
+ it('and open line cocu=i', function()
+ command('set cocu=i')
+ feed('o')
+ screen:expect([[
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ ^ |
+ |
+ {0:~ }|
+ {0:~ }|
+ {4:-- INSERT --} |
+ ]])
+ end)
+
+ describe('with incsearch', function()
+ before_each(function()
+ command('set incsearch hlsearch')
+ feed('2GA x<esc>3GA xy<esc>gg')
+ screen:expect([[
+ ^foo barf bar barf eggs |
+ foo {1:b} bar {1:b} eggs x |
+ foo {1:b} bar {1:b} eggs xy |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ end)
+
+ it('cocu=', function()
+ feed('/')
+ screen:expect([[
+ foo barf bar barf eggs |
+ foo {1:b} bar {1:b} eggs x |
+ foo {1:b} bar {1:b} eggs xy |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ /^ |
+ ]])
+
+ feed('x')
+ screen:expect([[
+ foo {1:b} bar {1:b} eggs |
+ foo barf bar barf eggs {3:x} |
+ foo {1:b} bar {1:b} eggs {5:x}y |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ /x^ |
+ ]])
+
+ feed('y')
+ screen:expect([[
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs x |
+ foo barf bar barf eggs {3:xy} |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ /xy^ |
+ ]])
+
+ feed('<c-w>')
+ screen:expect([[
+ foo barf bar barf eggs |
+ foo {1:b} bar {1:b} eggs x |
+ foo {1:b} bar {1:b} eggs xy |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ /^ |
+ ]])
+ end)
+
+ it('cocu=c', function()
+ command('set cocu=c')
+
+ feed('/')
+ -- NB: we don't do this redraw. Probably best to still skip it,
+ -- to avoid annoying distraction from the cmdline
+ screen:expect([[
+ foo barf bar barf eggs |
+ foo {1:b} bar {1:b} eggs x |
+ foo {1:b} bar {1:b} eggs xy |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ /^ |
+ ]])
+
+ feed('x')
+ screen:expect([[
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs {3:x} |
+ foo {1:b} bar {1:b} eggs {5:x}y |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ /x^ |
+ ]])
+
+ feed('y')
+ screen:expect([[
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs x |
+ foo {1:b} bar {1:b} eggs {3:xy} |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ /xy^ |
+ ]])
+
+ feed('<c-w>')
+ screen:expect([[
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs x |
+ foo {1:b} bar {1:b} eggs xy |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ /^ |
+ ]])
+
+ feed('<esc>')
+ screen:expect([[
+ ^foo barf bar barf eggs |
+ foo {1:b} bar {1:b} eggs x |
+ foo {1:b} bar {1:b} eggs xy |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ end)
+
+ it('cocu=n', function()
+ command('set cocu=n')
+ screen:expect([[
+ ^foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs x |
+ foo {1:b} bar {1:b} eggs xy |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ feed('/')
+ -- NB: we don't do this redraw. Probably best to still skip it,
+ -- to avoid annoying distraction from the cmdline
+ screen:expect([[
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs x |
+ foo {1:b} bar {1:b} eggs xy |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ /^ |
+ ]])
+
+ feed('x')
+ screen:expect([[
+ foo {1:b} bar {1:b} eggs |
+ foo barf bar barf eggs {3:x} |
+ foo {1:b} bar {1:b} eggs {5:x}y |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ /x^ |
+ ]])
+
+ feed('<c-w>')
+ screen:expect([[
+ foo barf bar barf eggs |
+ foo {1:b} bar {1:b} eggs x |
+ foo {1:b} bar {1:b} eggs xy |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ /^ |
+ ]])
+
+ feed('<esc>')
+ screen:expect([[
+ ^foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs x |
+ foo {1:b} bar {1:b} eggs xy |
+ foo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |
+ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ end)
+ end)
+ end)
end)
diff --git a/test/functional/ui/tabline_spec.lua b/test/functional/ui/tabline_spec.lua
new file mode 100644
index 0000000000..dcab9f7ef4
--- /dev/null
+++ b/test/functional/ui/tabline_spec.lua
@@ -0,0 +1,54 @@
+local helpers = require('test.functional.helpers')(after_each)
+local Screen = require('test.functional.ui.screen')
+local clear, command, eq = helpers.clear, helpers.command, helpers.eq
+
+describe('ui/ext_tabline', function()
+ local screen
+ local event_tabs, event_curtab
+
+ before_each(function()
+ clear()
+ screen = Screen.new(25, 5)
+ screen:attach({rgb=true, ext_tabline=true})
+ screen:set_on_event_handler(function(name, data)
+ if name == "tabline_update" then
+ event_curtab, event_tabs = unpack(data)
+ end
+ end)
+ end)
+
+ after_each(function()
+ screen:detach()
+ end)
+
+ it('publishes UI events', function()
+ command("tabedit another-tab")
+
+ local expected_tabs = {
+ {tab = { id = 1 }, name = '[No Name]'},
+ {tab = { id = 2 }, name = 'another-tab'},
+ }
+ screen:expect{grid=[[
+ ^ |
+ ~ |
+ ~ |
+ ~ |
+ |
+ ]], condition=function()
+ eq({ id = 2 }, event_curtab)
+ eq(expected_tabs, event_tabs)
+ end}
+
+ command("tabNext")
+ screen:expect{grid=[[
+ ^ |
+ ~ |
+ ~ |
+ ~ |
+ |
+ ]], condition=function()
+ eq({ id = 1 }, event_curtab)
+ eq(expected_tabs, event_tabs)
+ end}
+ end)
+end)
diff --git a/test/functional/ui/wildmode_spec.lua b/test/functional/ui/wildmode_spec.lua
index 2a55d27567..ffe71cfadf 100644
--- a/test/functional/ui/wildmode_spec.lua
+++ b/test/functional/ui/wildmode_spec.lua
@@ -1,34 +1,171 @@
+local global_helpers = require('test.helpers')
+local shallowcopy = global_helpers.shallowcopy
local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
-local clear, feed, execute = helpers.clear, helpers.feed, helpers.execute
+local clear, feed, command = helpers.clear, helpers.feed, helpers.command
+local iswin = helpers.iswin
local funcs = helpers.funcs
+local eq = helpers.eq
+local eval = helpers.eval
+local retry = helpers.retry
-describe("'wildmode'", function()
+describe("'wildmenu'", function()
local screen
-
before_each(function()
clear()
screen = Screen.new(25, 5)
screen:attach()
end)
-
after_each(function()
screen:detach()
end)
- describe("'wildmenu'", function()
- it(':sign <tab> shows wildmenu completions', function()
- execute('set wildmode=full')
- execute('set wildmenu')
- feed(':sign <tab>')
- screen:expect([[
- |
- ~ |
- ~ |
- define jump list > |
- :sign define^ |
- ]])
+ -- expect the screen stayed unchanged some time after first seen success
+ local function expect_stay_unchanged(args)
+ screen:expect(args)
+ args = shallowcopy(args)
+ args.unchanged = true
+ screen:expect(args)
+ end
+
+ it(':sign <tab> shows wildmenu completions', function()
+ command('set wildmode=full')
+ command('set wildmenu')
+ feed(':sign <tab>')
+ screen:expect([[
+ |
+ ~ |
+ ~ |
+ define jump list > |
+ :sign define^ |
+ ]])
+ end)
+
+ it(':sign <tab> <space> hides wildmenu #8453', function()
+ command('set wildmode=full')
+ -- only a regression if status-line open
+ command('set laststatus=2')
+ command('set wildmenu')
+ feed(':sign <tab>')
+ screen:expect([[
+ |
+ ~ |
+ ~ |
+ define jump list > |
+ :sign define^ |
+ ]])
+ feed('<space>')
+ screen:expect([[
+ |
+ ~ |
+ ~ |
+ [No Name] |
+ :sign define ^ |
+ ]])
+ end)
+
+ it('does not crash after cycling back to original text', function()
+ command('set wildmode=full')
+ feed(':j<Tab><Tab><Tab>')
+ screen:expect([[
+ |
+ ~ |
+ ~ |
+ join jumps |
+ :j^ |
+ ]])
+ -- This would cause nvim to crash before #6650
+ feed('<BS><Tab>')
+ screen:expect([[
+ |
+ ~ |
+ ~ |
+ ! # & < = > @ > |
+ :!^ |
+ ]])
+ end)
+
+ it('is preserved during :terminal activity', function()
+ command('set wildmenu wildmode=full')
+ command('set scrollback=4')
+ if iswin() then
+ feed([[:terminal for /L \%I in (1,1,5000) do @(echo foo & echo foo & echo foo)<cr>]])
+ else
+ feed([[:terminal for i in $(seq 1 5000); do printf 'foo\nfoo\nfoo\n'; sleep 0.1; done<cr>]])
+ end
+
+ feed([[<C-\><C-N>gg]])
+ feed([[:sign <Tab>]]) -- Invoke wildmenu.
+ expect_stay_unchanged{grid=[[
+ foo |
+ foo |
+ foo |
+ define jump list > |
+ :sign define^ |
+ ]]}
+
+ -- cmdline CTRL-D display should also be preserved.
+ feed([[<C-\><C-N>]])
+ feed([[:sign <C-D>]]) -- Invoke cmdline CTRL-D.
+ expect_stay_unchanged{grid=[[
+ :sign |
+ define place |
+ jump undefine |
+ list unplace |
+ :sign ^ |
+ ]]}
+
+ -- Exiting cmdline should show the buffer.
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ ^foo |
+ foo |
+ foo |
+ foo |
+ |
+ ]])
+ end)
+
+ it('ignores :redrawstatus called from a timer #7108', function()
+ command('set wildmenu wildmode=full')
+ command([[call timer_start(10, {->execute('redrawstatus')}, {'repeat':-1})]])
+ feed([[<C-\><C-N>]])
+ feed([[:sign <Tab>]]) -- Invoke wildmenu.
+ expect_stay_unchanged{grid=[[
+ |
+ ~ |
+ ~ |
+ define jump list > |
+ :sign define^ |
+ ]]}
+ end)
+
+ it('with laststatus=0, :vsplit, :term #2255', function()
+ -- Because this test verifies a _lack_ of activity after screen:sleep(), we
+ -- must wait the full timeout. So make it reasonable.
+ screen.timeout = 1000
+
+ if not iswin() then
+ command('set shell=sh') -- Need a predictable "$" prompt.
+ end
+ command('set laststatus=0')
+ command('vsplit')
+ command('term')
+
+ -- Check for a shell prompt to verify that the terminal loaded.
+ retry(nil, nil, function()
+ if iswin() then
+ eq('Microsoft', eval("matchstr(join(getline(1, '$')), 'Microsoft')"))
+ else
+ eq('$', eval([[matchstr(getline(1), '\$')]]))
+ end
end)
+
+ feed([[<C-\><C-N>]])
+ feed([[:<Tab>]]) -- Invoke wildmenu.
+ -- Check only the last 2 lines, because the shell output is
+ -- system-dependent.
+ expect_stay_unchanged{any='! # & < = > @ > |\n:!^'}
end)
end)
@@ -39,7 +176,7 @@ describe('command line completion', function()
clear()
screen = Screen.new(40, 5)
screen:attach()
- screen:set_default_attr_ignore({{bold=true, foreground=Screen.colors.Blue}})
+ screen:set_default_attr_ids({[1]={bold=true, foreground=Screen.colors.Blue}})
end)
after_each(function()
@@ -48,17 +185,89 @@ describe('command line completion', function()
it('lists directories with empty PATH', function()
local tmp = funcs.tempname()
- execute('e '.. tmp)
- execute('cd %:h')
- execute("call mkdir('Xtest-functional-viml-compl-dir')")
- execute('let $PATH=""')
+ command('e '.. tmp)
+ command('cd %:h')
+ command("call mkdir('Xtest-functional-viml-compl-dir')")
+ command('let $PATH=""')
feed(':!<tab><bs>')
screen:expect([[
|
- ~ |
- ~ |
- ~ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
:!Xtest-functional-viml-compl-dir^ |
]])
end)
end)
+
+describe('ui/ext_wildmenu', function()
+ local screen
+
+ before_each(function()
+ clear()
+ screen = Screen.new(25, 5)
+ screen:attach({rgb=true, ext_wildmenu=true})
+ end)
+
+ after_each(function()
+ screen:detach()
+ end)
+
+ it('works with :sign <tab>', function()
+ local expected = {
+ 'define',
+ 'jump',
+ 'list',
+ 'place',
+ 'undefine',
+ 'unplace',
+ }
+
+ command('set wildmode=full')
+ command('set wildmenu')
+ feed(':sign <tab>')
+ screen:expect{grid=[[
+ |
+ ~ |
+ ~ |
+ ~ |
+ :sign define^ |
+ ]], wildmenu_items=expected, wildmenu_pos=0}
+
+ feed('<tab>')
+ screen:expect{grid=[[
+ |
+ ~ |
+ ~ |
+ ~ |
+ :sign jump^ |
+ ]], wildmenu_items=expected, wildmenu_pos=1}
+
+ feed('<left><left>')
+ screen:expect{grid=[[
+ |
+ ~ |
+ ~ |
+ ~ |
+ :sign ^ |
+ ]], wildmenu_items=expected, wildmenu_pos=-1}
+
+ feed('<right>')
+ screen:expect{grid=[[
+ |
+ ~ |
+ ~ |
+ ~ |
+ :sign define^ |
+ ]], wildmenu_items=expected, wildmenu_pos=0}
+
+ feed('a')
+ screen:expect{grid=[[
+ |
+ ~ |
+ ~ |
+ ~ |
+ :sign definea^ |
+ ]]}
+ end)
+end)
diff --git a/test/functional/viml/completion_spec.lua b/test/functional/viml/completion_spec.lua
index 33f481bae2..70b4717c32 100644
--- a/test/functional/viml/completion_spec.lua
+++ b/test/functional/viml/completion_spec.lua
@@ -2,7 +2,11 @@ local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
local clear, feed = helpers.clear, helpers.feed
local eval, eq, neq = helpers.eval, helpers.eq, helpers.neq
-local execute, source, expect = helpers.execute, helpers.source, helpers.expect
+local feed_command, source, expect = helpers.feed_command, helpers.source, helpers.expect
+local curbufmeths = helpers.curbufmeths
+local command = helpers.command
+local meths = helpers.meths
+local wait = helpers.wait
describe('completion', function()
local screen
@@ -11,8 +15,8 @@ describe('completion', function()
clear()
screen = Screen.new(60, 8)
screen:attach()
- screen:set_default_attr_ignore({{bold=true, foreground=Screen.colors.Blue}})
screen:set_default_attr_ids({
+ [0] = {bold=true, foreground=Screen.colors.Blue},
[1] = {background = Screen.colors.LightMagenta},
[2] = {background = Screen.colors.Grey},
[3] = {bold = true},
@@ -20,6 +24,8 @@ describe('completion', function()
[5] = {foreground = Screen.colors.Red},
[6] = {background = Screen.colors.Black},
[7] = {foreground = Screen.colors.White, background = Screen.colors.Red},
+ [8] = {reverse = true},
+ [9] = {bold = true, reverse = true},
})
end)
@@ -32,22 +38,22 @@ describe('completion', function()
screen:expect([[
foo |
foo^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- Keyword Local completion (^N^P) The only match} |
]])
feed('<C-e>')
screen:expect([[
foo |
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- INSERT --} |
]])
feed('<ESC>')
@@ -56,38 +62,44 @@ describe('completion', function()
it('returns expected dict in normal completion', function()
feed('ifoo<ESC>o<C-x><C-n>')
eq('foo', eval('getline(2)'))
- eq({word = 'foo', abbr = '', menu = '', info = '', kind = ''},
+ eq({word = 'foo', abbr = '', menu = '',
+ info = '', kind = '', user_data = ''},
eval('v:completed_item'))
end)
it('is readonly', function()
screen:try_resize(80, 8)
feed('ifoo<ESC>o<C-x><C-n><ESC>')
- execute('let v:completed_item.word = "bar"')
+ feed_command('let v:completed_item.word = "bar"')
neq(nil, string.find(eval('v:errmsg'), '^E46: '))
- execute('let v:errmsg = ""')
+ feed_command('let v:errmsg = ""')
- execute('let v:completed_item.abbr = "bar"')
+ feed_command('let v:completed_item.abbr = "bar"')
neq(nil, string.find(eval('v:errmsg'), '^E46: '))
- execute('let v:errmsg = ""')
+ feed_command('let v:errmsg = ""')
- execute('let v:completed_item.menu = "bar"')
+ feed_command('let v:completed_item.menu = "bar"')
neq(nil, string.find(eval('v:errmsg'), '^E46: '))
- execute('let v:errmsg = ""')
+ feed_command('let v:errmsg = ""')
- execute('let v:completed_item.info = "bar"')
+ feed_command('let v:completed_item.info = "bar"')
neq(nil, string.find(eval('v:errmsg'), '^E46: '))
- execute('let v:errmsg = ""')
+ feed_command('let v:errmsg = ""')
- execute('let v:completed_item.kind = "bar"')
+ feed_command('let v:completed_item.kind = "bar"')
neq(nil, string.find(eval('v:errmsg'), '^E46: '))
- execute('let v:errmsg = ""')
+ feed_command('let v:errmsg = ""')
+
+ feed_command('let v:completed_item.user_data = "bar"')
+ neq(nil, string.find(eval('v:errmsg'), '^E46: '))
+ feed_command('let v:errmsg = ""')
end)
it('returns expected dict in omni completion', function()
source([[
function! TestOmni(findstart, base) abort
return a:findstart ? 0 : [{'word': 'foo', 'abbr': 'bar',
\ 'menu': 'baz', 'info': 'foobar', 'kind': 'foobaz'},
- \ {'word': 'word', 'abbr': 'abbr', 'menu': 'menu', 'info': 'info', 'kind': 'kind'}]
+ \ {'word': 'word', 'abbr': 'abbr', 'menu': 'menu',
+ \ 'info': 'info', 'kind': 'kind'}]
endfunction
setlocal omnifunc=TestOmni
]])
@@ -95,16 +107,16 @@ describe('completion', function()
eq('foo', eval('getline(1)'))
screen:expect([[
foo^ |
- {2:bar foobaz baz } |
- {1:abbr kind menu } |
- ~ |
- ~ |
- ~ |
- ~ |
+ {2:bar foobaz baz }{0: }|
+ {1:abbr kind menu }{0: }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- Omni completion (^O^N^P) }{4:match 1 of 2} |
]])
eq({word = 'foo', abbr = 'bar', menu = 'baz',
- info = 'foobar', kind = 'foobaz'},
+ info = 'foobar', kind = 'foobaz', user_data = ''},
eval('v:completed_item'))
end)
end)
@@ -120,16 +132,16 @@ describe('completion', function()
end)
it('inserts the first candidate if default', function()
- execute('set completeopt+=menuone')
+ feed_command('set completeopt+=menuone')
feed('ifoo<ESC>o')
screen:expect([[
foo |
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- INSERT --} |
]])
feed('<C-x>')
@@ -137,22 +149,22 @@ describe('completion', function()
screen:expect([[
foo |
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)} |
]])
feed('<C-n>')
screen:expect([[
foo |
foo^ |
- {2:foo } |
- ~ |
- ~ |
- ~ |
- ~ |
+ {2:foo }{0: }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- Keyword Local completion (^N^P) The only match} |
]])
feed('bar<ESC>')
@@ -162,36 +174,36 @@ describe('completion', function()
foo |
foobar |
foo^ |
- {2:foo } |
- ~ |
- ~ |
- ~ |
+ {2:foo }{0: }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- INSERT --} |
]])
eq('foo', eval('getline(3)'))
end)
it('selects the first candidate if noinsert', function()
- execute('set completeopt+=menuone,noinsert')
+ feed_command('set completeopt+=menuone,noinsert')
feed('ifoo<ESC>o<C-x><C-n>')
screen:expect([[
foo |
^ |
- {2:foo } |
- ~ |
- ~ |
- ~ |
- ~ |
+ {2:foo }{0: }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- Keyword Local completion (^N^P) The only match} |
]])
feed('<C-y>')
screen:expect([[
foo |
foo^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- INSERT --} |
]])
feed('<ESC>')
@@ -201,37 +213,37 @@ describe('completion', function()
foo |
foo |
^ |
- {2:foo } |
- ~ |
- ~ |
- ~ |
+ {2:foo }{0: }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- INSERT --} |
]])
feed('<C-y><ESC>')
eq('foo', eval('getline(3)'))
end)
it('does not insert the first candidate if noselect', function()
- execute('set completeopt+=menuone,noselect')
+ feed_command('set completeopt+=menuone,noselect')
feed('ifoo<ESC>o<C-x><C-n>')
screen:expect([[
foo |
^ |
- {1:foo } |
- ~ |
- ~ |
- ~ |
- ~ |
+ {1:foo }{0: }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- Keyword Local completion (^N^P) }{5:Back at original} |
]])
feed('b')
screen:expect([[
foo |
b^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- Keyword Local completion (^N^P) }{5:Back at original} |
]])
feed('ar<ESC>')
@@ -241,37 +253,37 @@ describe('completion', function()
foo |
bar |
^ |
- {1:foo } |
- ~ |
- ~ |
- ~ |
+ {1:foo }{0: }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- INSERT --} |
]])
feed('bar<ESC>')
eq('bar', eval('getline(3)'))
end)
it('does not select/insert the first candidate if noselect and noinsert', function()
- execute('set completeopt+=menuone,noselect,noinsert')
+ feed_command('set completeopt+=menuone,noselect,noinsert')
feed('ifoo<ESC>o<C-x><C-n>')
screen:expect([[
foo |
^ |
- {1:foo } |
- ~ |
- ~ |
- ~ |
- ~ |
+ {1:foo }{0: }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- Keyword Local completion (^N^P) }{5:Back at original} |
]])
feed('<ESC>')
screen:expect([[
foo |
^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
|
]])
eq('', eval('getline(2)'))
@@ -280,10 +292,10 @@ describe('completion', function()
foo |
|
^ |
- {1:foo } |
- ~ |
- ~ |
- ~ |
+ {1:foo }{0: }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- INSERT --} |
]])
feed('<ESC>')
@@ -291,28 +303,84 @@ describe('completion', function()
foo |
|
^ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
|
]])
eq('', eval('getline(3)'))
end)
it('does not change modified state if noinsert', function()
- execute('set completeopt+=menuone,noinsert')
- execute('setlocal nomodified')
+ feed_command('set completeopt+=menuone,noinsert')
+ feed_command('setlocal nomodified')
feed('i<C-r>=TestComplete()<CR><ESC>')
eq(0, eval('&l:modified'))
end)
it('does not change modified state if noselect', function()
- execute('set completeopt+=menuone,noselect')
- execute('setlocal nomodified')
+ feed_command('set completeopt+=menuone,noselect')
+ feed_command('setlocal nomodified')
feed('i<C-r>=TestComplete()<CR><ESC>')
eq(0, eval('&l:modified'))
end)
end)
+ describe('completeopt+=noinsert does not add blank undo items', function()
+ before_each(function()
+ source([[
+ function! TestComplete() abort
+ call complete(1, ['foo', 'bar'])
+ return ''
+ endfunction
+ ]])
+ feed_command('set completeopt+=noselect,noinsert')
+ feed_command('inoremap <right> <c-r>=TestComplete()<cr>')
+ end)
+
+ local tests = {
+ ['<up>, <down>, <cr>'] = {'<down><cr>', '<up><cr>'},
+ ['<c-n>, <c-p>, <c-y>'] = {'<c-n><c-y>', '<c-p><c-y>'},
+ }
+
+ for name, seq in pairs(tests) do
+ it('using ' .. name, function()
+ feed('iaaa<esc>')
+ feed('A<right>' .. seq[1] .. '<esc>')
+ feed('A<right><esc>A<right><esc>')
+ feed('A<cr>bbb<esc>')
+ feed('A<right>' .. seq[2] .. '<esc>')
+ feed('A<right><esc>A<right><esc>')
+ feed('A<cr>ccc<esc>')
+ feed('A<right>' .. seq[1] .. '<esc>')
+ feed('A<right><esc>A<right><esc>')
+
+ local expected = {
+ {'foo', 'bar', 'foo'},
+ {'foo', 'bar', 'ccc'},
+ {'foo', 'bar'},
+ {'foo', 'bbb'},
+ {'foo'},
+ {'aaa'},
+ {''},
+ }
+
+ for i = 1, #expected do
+ if i > 1 then
+ feed('u')
+ end
+ eq(expected[i], eval('getline(1, "$")'))
+ end
+
+ for i = #expected, 1, -1 do
+ if i < #expected then
+ feed('<c-r>')
+ end
+ eq(expected[i], eval('getline(1, "$")'))
+ end
+ end)
+ end
+ end)
+
describe("refresh:always", function()
before_each(function()
source([[
@@ -344,56 +412,56 @@ describe('completion', function()
feed('i<C-x><C-u>')
screen:expect([[
^ |
- {1:January }{6: } |
- {1:February }{6: } |
- {1:March }{6: } |
- {1:April }{2: } |
- {1:May }{2: } |
- {1:June }{2: } |
+ {1:January }{6: }{0: }|
+ {1:February }{6: }{0: }|
+ {1:March }{6: }{0: }|
+ {1:April }{2: }{0: }|
+ {1:May }{2: }{0: }|
+ {1:June }{2: }{0: }|
{3:-- User defined completion (^U^N^P) }{5:Back at original} |
]])
feed('u')
screen:expect([[
u^ |
- {1:January } |
- {1:February } |
- {1:June } |
- {1:July } |
- {1:August } |
- ~ |
+ {1:January }{0: }|
+ {1:February }{0: }|
+ {1:June }{0: }|
+ {1:July }{0: }|
+ {1:August }{0: }|
+ {0:~ }|
{3:-- User defined completion (^U^N^P) }{5:Back at original} |
]])
feed('g')
screen:expect([[
ug^ |
- {1:August } |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {1:August }{0: }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- User defined completion (^U^N^P) }{5:Back at original} |
]])
feed('<Down>')
screen:expect([[
ug^ |
- {2:August } |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {2:August }{0: }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- User defined completion (^U^N^P) The only match} |
]])
feed('<C-y>')
screen:expect([[
August^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- INSERT --} |
]])
expect('August')
@@ -403,55 +471,55 @@ describe('completion', function()
screen:expect([[
|
Ja^ |
- {1:January } |
- ~ |
- ~ |
- ~ |
- ~ |
+ {1:January }{0: }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- User defined completion (^U^N^P) }{5:Back at original} |
]])
feed('<BS>')
screen:expect([[
|
J^ |
- {1:January } |
- {1:June } |
- {1:July } |
- ~ |
- ~ |
+ {1:January }{0: }|
+ {1:June }{0: }|
+ {1:July }{0: }|
+ {0:~ }|
+ {0:~ }|
{3:-- User defined completion (^U^N^P) }{5:Back at original} |
]])
feed('<C-n>')
screen:expect([[
|
January^ |
- {2:January } |
- {1:June } |
- {1:July } |
- ~ |
- ~ |
+ {2:January }{0: }|
+ {1:June }{0: }|
+ {1:July }{0: }|
+ {0:~ }|
+ {0:~ }|
{3:-- User defined completion (^U^N^P) }{4:match 1 of 3} |
]])
feed('<C-n>')
screen:expect([[
|
June^ |
- {1:January } |
- {2:June } |
- {1:July } |
- ~ |
- ~ |
+ {1:January }{0: }|
+ {2:June }{0: }|
+ {1:July }{0: }|
+ {0:~ }|
+ {0:~ }|
{3:-- User defined completion (^U^N^P) }{4:match 2 of 3} |
]])
feed('<Esc>')
screen:expect([[
|
Jun^e |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
|
]])
feed('.')
@@ -459,14 +527,14 @@ describe('completion', function()
|
June |
Jun^e |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
|
]])
expect([[
-
+
June
June]])
end)
@@ -480,52 +548,52 @@ describe('completion', function()
return ''
endfunction
]])
- execute("set completeopt=menuone,noselect")
+ feed_command("set completeopt=menuone,noselect")
end)
it("works", function()
feed('i<C-r>=TestComplete()<CR>')
screen:expect([[
^ |
- {1:0 }{6: } |
- {1:1 }{2: } |
- {1:2 }{2: } |
- {1:3 }{2: } |
- {1:4 }{2: } |
- {1:5 }{2: } |
+ {1:0 }{6: }{0: }|
+ {1:1 }{2: }{0: }|
+ {1:2 }{2: }{0: }|
+ {1:3 }{2: }{0: }|
+ {1:4 }{2: }{0: }|
+ {1:5 }{2: }{0: }|
{3:-- INSERT --} |
]])
feed('7')
screen:expect([[
7^ |
- {1:7 }{6: } |
- {1:70 }{6: } |
- {1:71 }{6: } |
- {1:72 }{2: } |
- {1:73 }{2: } |
- {1:74 }{2: } |
+ {1:7 }{6: }{0: }|
+ {1:70 }{6: }{0: }|
+ {1:71 }{6: }{0: }|
+ {1:72 }{2: }{0: }|
+ {1:73 }{2: }{0: }|
+ {1:74 }{2: }{0: }|
{3:-- INSERT --} |
]])
feed('<c-n>')
screen:expect([[
7^ |
- {2:7 }{6: } |
- {1:70 }{6: } |
- {1:71 }{6: } |
- {1:72 }{2: } |
- {1:73 }{2: } |
- {1:74 }{2: } |
+ {2:7 }{6: }{0: }|
+ {1:70 }{6: }{0: }|
+ {1:71 }{6: }{0: }|
+ {1:72 }{2: }{0: }|
+ {1:73 }{2: }{0: }|
+ {1:74 }{2: }{0: }|
{3:-- INSERT --} |
]])
feed('<c-n>')
screen:expect([[
70^ |
- {1:7 }{6: } |
- {2:70 }{6: } |
- {1:71 }{6: } |
- {1:72 }{2: } |
- {1:73 }{2: } |
- {1:74 }{2: } |
+ {1:7 }{6: }{0: }|
+ {2:70 }{6: }{0: }|
+ {1:71 }{6: }{0: }|
+ {1:72 }{2: }{0: }|
+ {1:73 }{2: }{0: }|
+ {1:74 }{2: }{0: }|
{3:-- INSERT --} |
]])
end)
@@ -534,111 +602,111 @@ describe('completion', function()
feed('i<C-r>=TestComplete()<CR>')
screen:expect([[
^ |
- {1:0 }{6: } |
- {1:1 }{2: } |
- {1:2 }{2: } |
- {1:3 }{2: } |
- {1:4 }{2: } |
- {1:5 }{2: } |
+ {1:0 }{6: }{0: }|
+ {1:1 }{2: }{0: }|
+ {1:2 }{2: }{0: }|
+ {1:3 }{2: }{0: }|
+ {1:4 }{2: }{0: }|
+ {1:5 }{2: }{0: }|
{3:-- INSERT --} |
]])
feed('<PageDown>')
screen:expect([[
^ |
- {1:0 }{6: } |
- {1:1 }{2: } |
- {1:2 }{2: } |
- {2:3 } |
- {1:4 }{2: } |
- {1:5 }{2: } |
+ {1:0 }{6: }{0: }|
+ {1:1 }{2: }{0: }|
+ {1:2 }{2: }{0: }|
+ {2:3 }{0: }|
+ {1:4 }{2: }{0: }|
+ {1:5 }{2: }{0: }|
{3:-- INSERT --} |
]])
feed('<PageDown>')
screen:expect([[
^ |
- {1:5 }{6: } |
- {1:6 }{2: } |
- {2:7 } |
- {1:8 }{2: } |
- {1:9 }{2: } |
- {1:10 }{2: } |
+ {1:5 }{6: }{0: }|
+ {1:6 }{2: }{0: }|
+ {2:7 }{0: }|
+ {1:8 }{2: }{0: }|
+ {1:9 }{2: }{0: }|
+ {1:10 }{2: }{0: }|
{3:-- INSERT --} |
]])
feed('<Down>')
screen:expect([[
^ |
- {1:5 }{6: } |
- {1:6 }{2: } |
- {1:7 }{2: } |
- {2:8 } |
- {1:9 }{2: } |
- {1:10 }{2: } |
+ {1:5 }{6: }{0: }|
+ {1:6 }{2: }{0: }|
+ {1:7 }{2: }{0: }|
+ {2:8 }{0: }|
+ {1:9 }{2: }{0: }|
+ {1:10 }{2: }{0: }|
{3:-- INSERT --} |
]])
feed('<PageUp>')
screen:expect([[
^ |
- {1:2 }{6: } |
- {1:3 }{2: } |
- {2:4 } |
- {1:5 }{2: } |
- {1:6 }{2: } |
- {1:7 }{2: } |
+ {1:2 }{6: }{0: }|
+ {1:3 }{2: }{0: }|
+ {2:4 }{0: }|
+ {1:5 }{2: }{0: }|
+ {1:6 }{2: }{0: }|
+ {1:7 }{2: }{0: }|
{3:-- INSERT --} |
]])
feed('<PageUp>') -- stop on first item
screen:expect([[
^ |
- {2:0 }{6: } |
- {1:1 }{2: } |
- {1:2 }{2: } |
- {1:3 }{2: } |
- {1:4 }{2: } |
- {1:5 }{2: } |
+ {2:0 }{6: }{0: }|
+ {1:1 }{2: }{0: }|
+ {1:2 }{2: }{0: }|
+ {1:3 }{2: }{0: }|
+ {1:4 }{2: }{0: }|
+ {1:5 }{2: }{0: }|
{3:-- INSERT --} |
]])
feed('<PageUp>') -- when on first item, unselect
screen:expect([[
^ |
- {1:0 }{6: } |
- {1:1 }{2: } |
- {1:2 }{2: } |
- {1:3 }{2: } |
- {1:4 }{2: } |
- {1:5 }{2: } |
+ {1:0 }{6: }{0: }|
+ {1:1 }{2: }{0: }|
+ {1:2 }{2: }{0: }|
+ {1:3 }{2: }{0: }|
+ {1:4 }{2: }{0: }|
+ {1:5 }{2: }{0: }|
{3:-- INSERT --} |
]])
feed('<PageUp>') -- when unselected, select last item
screen:expect([[
^ |
- {1:95 }{2: } |
- {1:96 }{2: } |
- {1:97 }{2: } |
- {1:98 }{2: } |
- {1:99 }{2: } |
- {2:100 }{6: } |
+ {1:95 }{2: }{0: }|
+ {1:96 }{2: }{0: }|
+ {1:97 }{2: }{0: }|
+ {1:98 }{2: }{0: }|
+ {1:99 }{2: }{0: }|
+ {2:100 }{6: }{0: }|
{3:-- INSERT --} |
]])
feed('<PageUp>')
screen:expect([[
^ |
- {1:94 }{2: } |
- {1:95 }{2: } |
- {2:96 } |
- {1:97 }{2: } |
- {1:98 }{2: } |
- {1:99 }{6: } |
+ {1:94 }{2: }{0: }|
+ {1:95 }{2: }{0: }|
+ {2:96 }{0: }|
+ {1:97 }{2: }{0: }|
+ {1:98 }{2: }{0: }|
+ {1:99 }{6: }{0: }|
{3:-- INSERT --} |
]])
feed('<cr>')
screen:expect([[
96^ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- INSERT --} |
]])
end)
@@ -646,74 +714,74 @@ describe('completion', function()
it('disables folding during completion', function ()
- execute("set foldmethod=indent")
+ feed_command("set foldmethod=indent")
feed('i<Tab>foo<CR><Tab>bar<Esc>gg')
screen:expect([[
^foo |
bar |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
|
]])
feed('A<C-x><C-l>')
screen:expect([[
foo^ |
bar |
- ~ |
- ~ |
- ~ |
- ~ |
- ~ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- Whole line completion (^L^N^P) }{7:Pattern not found} |
]])
eq(-1, eval('foldclosed(1)'))
end)
it('popupmenu is not interrupted by events', function ()
- execute("set complete=.")
+ feed_command("set complete=.")
feed('ifoobar fooegg<cr>f<c-p>')
screen:expect([[
foobar fooegg |
fooegg^ |
- {1:foobar } |
- {2:fooegg } |
- ~ |
- ~ |
- ~ |
+ {1:foobar }{0: }|
+ {2:fooegg }{0: }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- Keyword completion (^N^P) }{4:match 1 of 2} |
]])
eval('1 + 1')
-- popupmenu still visible
- screen:expect([[
+ screen:expect{grid=[[
foobar fooegg |
fooegg^ |
- {1:foobar } |
- {2:fooegg } |
- ~ |
- ~ |
- ~ |
+ {1:foobar }{0: }|
+ {2:fooegg }{0: }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- Keyword completion (^N^P) }{4:match 1 of 2} |
- ]])
+ ]], unchanged=true}
feed('<c-p>')
-- Didn't restart completion: old matches still used
screen:expect([[
foobar fooegg |
foobar^ |
- {2:foobar } |
- {1:fooegg } |
- ~ |
- ~ |
- ~ |
+ {2:foobar }{0: }|
+ {1:fooegg }{0: }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
{3:-- Keyword completion (^N^P) }{4:match 2 of 2} |
]])
end)
-
+
describe('from the commandline window', function()
it('is cleared after CTRL-C', function ()
@@ -722,43 +790,173 @@ describe('completion', function()
screen:expect([[
|
{8:[No Name] }|
- :foo faa fee f^ |
- :~ |
- :~ |
- :~ |
+ {0::}foo faa fee f^ |
+ {0::~ }|
+ {0::~ }|
+ {0::~ }|
{9:[Command Line] }|
{3:-- INSERT --} |
- ]], {[3] = {bold = true},
- [4] = {bold = true, foreground = Screen.colors.SeaGreen},
- [8] = {reverse = true},
- [9] = {bold = true, reverse = true}})
+ ]] )
feed('<c-x><c-n>')
screen:expect([[
|
{8:[No Name] }|
- :foo faa fee foo^ |
- :~ {2: foo } |
- :~ {1: faa } |
- :~ {1: fee } |
+ {0::}foo faa fee foo^ |
+ {0::~ }{2: foo }{0: }|
+ {0::~ }{1: faa }{0: }|
+ {0::~ }{1: fee }{0: }|
{9:[Command Line] }|
{3:-- Keyword Local completion (^N^P) }{4:match 1 of 3} |
- ]],{[1] = {background = Screen.colors.LightMagenta},
- [2] = {background = Screen.colors.Grey},
- [3] = {bold = true},
- [4] = {bold = true, foreground = Screen.colors.SeaGreen},
- [8] = {reverse = true},
- [9] = {bold = true, reverse = true}})
+ ]])
feed('<c-c>')
screen:expect([[
|
{8:[No Name] }|
- :foo faa fee foo |
- :~ |
- :~ |
- :~ |
+ {0::}foo faa fee foo |
+ {0::~ }|
+ {0::~ }|
+ {0::~ }|
{9:[Command Line] }|
:foo faa fee foo^ |
- ]], {[8] = {reverse = true}, [9] = {bold = true, reverse = true}})
+ ]])
end)
end)
+
+ describe('with numeric items', function()
+ before_each(function()
+ source([[
+ function! TestComplete() abort
+ call complete(1, g:_complist)
+ return ''
+ endfunction
+ ]])
+ meths.set_option('completeopt', 'menuone,noselect')
+ meths.set_var('_complist', {{
+ word=0,
+ abbr=1,
+ menu=2,
+ kind=3,
+ info=4,
+ icase=5,
+ dup=6,
+ empty=7,
+ }})
+ end)
+
+ it('shows correct variant as word', function()
+ feed('i<C-r>=TestComplete()<CR>')
+ screen:expect([[
+ ^ |
+ {1:1 3 2 }{0: }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {3:-- INSERT --} |
+ ]])
+ end)
+ end)
+
+ it("'ignorecase' 'infercase' CTRL-X CTRL-N #6451", function()
+ feed_command('set ignorecase infercase')
+ feed_command('edit BACKERS.md')
+ feed('oX<C-X><C-N>')
+ screen:expect([[
+ # Bountysource Backers |
+ Xnull^ |
+ {2:Xnull }{6: } |
+ {1:Xoxomoon }{6: }ryone who backed our [Bountysource fundraise|
+ {1:Xu }{6: }ountysource.com/teams/neovim/fundraiser)! |
+ {1:Xpayn }{2: } |
+ {1:Xinity }{2: }d URL in BACKERS.md. |
+ {3:-- Keyword Local completion (^N^P) }{4:match 1 of 7} |
+ ]])
+ end)
+
+ it('TextChangedP autocommand', function()
+ curbufmeths.set_lines(0, 1, false, { 'foo', 'bar', 'foobar'})
+ source([[
+ set complete=. completeopt=menuone
+ let g:foo = []
+ autocmd! TextChanged * :call add(g:foo, "N")
+ autocmd! TextChangedI * :call add(g:foo, "I")
+ autocmd! TextChangedP * :call add(g:foo, "P")
+ call cursor(3, 1)
+ ]])
+
+ command('let g:foo = []')
+ feed('o')
+ wait()
+ feed('<esc>')
+ eq({'I'}, eval('g:foo'))
+
+ command('let g:foo = []')
+ feed('S')
+ wait()
+ feed('f')
+ wait()
+ eq({'I', 'I'}, eval('g:foo'))
+ feed('<esc>')
+
+ command('let g:foo = []')
+ feed('S')
+ wait()
+ feed('f')
+ wait()
+ feed('<C-N>')
+ wait()
+ eq({'I', 'I', 'P'}, eval('g:foo'))
+ feed('<esc>')
+
+ command('let g:foo = []')
+ feed('S')
+ wait()
+ feed('f')
+ wait()
+ feed('<C-N>')
+ wait()
+ feed('<C-N>')
+ wait()
+ eq({'I', 'I', 'P', 'P'}, eval('g:foo'))
+ feed('<esc>')
+
+ command('let g:foo = []')
+ feed('S')
+ wait()
+ feed('f')
+ wait()
+ feed('<C-N>')
+ wait()
+ feed('<C-N>')
+ wait()
+ feed('<C-N>')
+ wait()
+ eq({'I', 'I', 'P', 'P', 'P'}, eval('g:foo'))
+ feed('<esc>')
+
+ command('let g:foo = []')
+ feed('S')
+ wait()
+ feed('f')
+ wait()
+ feed('<C-N>')
+ wait()
+ feed('<C-N>')
+ wait()
+ feed('<C-N>')
+ wait()
+ feed('<C-N>')
+ eq({'I', 'I', 'P', 'P', 'P', 'P'}, eval('g:foo'))
+ feed('<esc>')
+
+ eq({'foo', 'bar', 'foobar', 'foo'}, eval('getline(1, "$")'))
+
+ source([[
+ au! TextChanged
+ au! TextChangedI
+ au! TextChangedP
+ set complete&vim completeopt&vim
+ ]])
+ end)
end)
diff --git a/test/functional/viml/errorlist_spec.lua b/test/functional/viml/errorlist_spec.lua
index 56d08771b7..6c5a63e6b1 100644
--- a/test/functional/viml/errorlist_spec.lua
+++ b/test/functional/viml/errorlist_spec.lua
@@ -18,29 +18,27 @@ describe('setqflist()', function()
end)
it('requires a string for {action}', function()
- eq('Vim(call):E114: String required', exc_exec('call setqflist([], 5)'))
- eq('Vim(call):E114: String required', exc_exec('call setqflist([], [])'))
- eq('Vim(call):E114: String required', exc_exec('call setqflist([], {})'))
+ eq('Vim(call):E928: String required', exc_exec('call setqflist([], 5)'))
+ eq('Vim(call):E928: String required', exc_exec('call setqflist([], [])'))
+ eq('Vim(call):E928: String required', exc_exec('call setqflist([], {})'))
end)
it('sets w:quickfix_title', function()
setqflist({''}, 'r', 'foo')
command('copen')
eq(':foo', get_cur_win_var('quickfix_title'))
+ setqflist({''}, 'r', {['title'] = 'qf_title'})
+ eq('qf_title', get_cur_win_var('quickfix_title'))
end)
- it('requires string or number for {title}', function()
- command('copen')
+ it('allows string {what} for backwards compatibility', function()
setqflist({}, 'r', '5')
+ command('copen')
eq(':5', get_cur_win_var('quickfix_title'))
- setqflist({}, 'r', 6)
- eq(':6', get_cur_win_var('quickfix_title'))
- local exc = exc_exec('call setqflist([], "r", function("function"))')
- eq('Vim(call):E729: using Funcref as a String', exc)
- exc = exc_exec('call setqflist([], "r", [])')
- eq('Vim(call):E730: using List as a String', exc)
- exc = exc_exec('call setqflist([], "r", {})')
- eq('Vim(call):E731: using Dictionary as a String', exc)
+ end)
+
+ it('requires a dict for {what}', function()
+ eq('Vim(call):E715: Dictionary required', exc_exec('call setqflist([], "r", function("function"))'))
end)
end)
@@ -56,9 +54,9 @@ describe('setloclist()', function()
end)
it('requires a string for {action}', function()
- eq('Vim(call):E114: String required', exc_exec('call setloclist(0, [], 5)'))
- eq('Vim(call):E114: String required', exc_exec('call setloclist(0, [], [])'))
- eq('Vim(call):E114: String required', exc_exec('call setloclist(0, [], {})'))
+ eq('Vim(call):E928: String required', exc_exec('call setloclist(0, [], 5)'))
+ eq('Vim(call):E928: String required', exc_exec('call setloclist(0, [], [])'))
+ eq('Vim(call):E928: String required', exc_exec('call setloclist(0, [], {})'))
end)
it('sets w:quickfix_title for the correct window', function()
diff --git a/test/functional/viml/function_spec.lua b/test/functional/viml/function_spec.lua
index f0a4406593..b8137038b1 100644
--- a/test/functional/viml/function_spec.lua
+++ b/test/functional/viml/function_spec.lua
@@ -1,38 +1,216 @@
local helpers = require('test.functional.helpers')(after_each)
-local clear = helpers.clear
local eq = helpers.eq
-local eval = helpers.eval
-local exc_exec = helpers.exc_exec
+local clear = helpers.clear
+local dedent = helpers.dedent
+local redir_exec = helpers.redir_exec
-describe('Up to MAX_FUNC_ARGS arguments are handled by', function()
- local max_func_args = 20 -- from eval.h
- local range = helpers.funcs.range
+before_each(clear)
- before_each(clear)
+local function check_func(fname, body, indent)
+ if type(body) == 'number' then
+ body = ('return %i'):format(body)
+ end
+ eq(dedent(([[
- it('printf()', function()
- local printf = helpers.funcs.printf
- local rep = helpers.funcs['repeat']
- local expected = '2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,'
- eq(expected, printf(rep('%d,', max_func_args-1), unpack(range(2, max_func_args))))
- local ret = exc_exec('call printf("", 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21)')
- eq('Vim(call):E740: Too many arguments for function printf', ret)
- end)
+ function %s()%s
+ endfunction]]
+ ), 3):format(
+ fname,
+ body and ('\n1' .. (' '):rep(2 + (indent or 8)) .. body) or ''),
+ redir_exec('function ' .. fname))
+end
- it('rpcnotify()', function()
- local rpcnotify = helpers.funcs.rpcnotify
- local ret = rpcnotify(0, 'foo', unpack(range(3, max_func_args)))
- eq(1, ret)
- ret = exc_exec('call rpcnotify(0, "foo", 3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21)')
- eq('Vim(call):E740: Too many arguments for function rpcnotify', ret)
+describe(':endfunction', function()
+ it('accepts bang', function()
+ eq('', redir_exec([[
+ function F()
+ endfunction!
+ ]]))
+ check_func('F')
+ eq('', redir_exec([[
+ function! F()
+ return 1
+ endfunction!
+ ]]))
+ check_func('F', 1)
end)
-end)
-
-describe('api_info()', function()
- before_each(clear)
- it('has the right keys', function()
- local api_keys = eval("sort(keys(api_info()))")
- eq({'error_types', 'functions', 'types'}, api_keys)
+ it('accepts comments', function()
+ eq('', redir_exec([[
+ function F1()
+ endfunction " Comment
+ ]]))
+ check_func('F1')
+ eq('', redir_exec([[
+ function F2()
+ endfunction " }}}
+ ]]))
+ check_func('F2')
+ eq('', redir_exec([[
+ function F3()
+ endfunction " F3
+ ]]))
+ check_func('F3')
+ eq('', redir_exec([[
+ function F4()
+ endfunction! " F4
+ ]]))
+ check_func('F4')
+ eq('', redir_exec([[
+ function! F4()
+ return 2
+ endfunction! " F4
+ ]]))
+ check_func('F4', 2)
+ end)
+ it('accepts function name', function()
+ eq('', redir_exec([[
+ function F0()
+ endfunction F0
+ ]]))
+ check_func('F0')
+ eq('', redir_exec([[
+ function F1()
+ endfunction! F1
+ ]]))
+ check_func('F1')
+ eq('', redir_exec([[
+ function! F2()
+ endfunction! F2
+ ]]))
+ check_func('F2')
+ eq('', redir_exec([[
+ function! F2()
+ return 3
+ endfunction! F2
+ ]]))
+ check_func('F2', 3)
+ end)
+ it('accepts weird characters', function()
+ eq('', redir_exec([[
+ function F1()
+ endfunction: }}}
+ ]]))
+ check_func('F1')
+ -- From accurev
+ eq('', redir_exec([[
+ function F2()
+ endfunction :}}}
+ ]]))
+ check_func('F2')
+ -- From cream-vimabbrev
+ eq('', redir_exec([[
+ function F3()
+ endfunction 1}}}
+ ]]))
+ check_func('F3')
+ -- From pyunit
+ eq('', redir_exec([[
+ function F4()
+ endfunction # }}}
+ ]]))
+ check_func('F4')
+ -- From vim-lldb
+ eq('', redir_exec([[
+ function F5()
+ endfunction()
+ ]]))
+ check_func('F5')
+ -- From vim-mail
+ eq('', redir_exec([[
+ function F6()
+ endfunction;
+ ]]))
+ check_func('F6')
+ end)
+ it('accepts commented bar', function()
+ eq('', redir_exec([[
+ function F1()
+ endfunction " F1 | echo 42
+ ]]))
+ check_func('F1')
+ eq('', redir_exec([[
+ function! F1()
+ return 42
+ endfunction! " F1 | echo 42
+ ]]))
+ check_func('F1', 42)
+ end)
+ it('accepts uncommented bar', function()
+ eq('\n42', redir_exec([[
+ function F1()
+ endfunction | echo 42
+ ]]))
+ check_func('F1')
+ end)
+ it('allows running multiple commands', function()
+ eq('\n2', redir_exec([[
+ function F1()
+ echo 2
+ endfunction
+ call F1()
+ ]]))
+ check_func('F1', 'echo 2')
+ eq('\n2\n3\n4', redir_exec([[
+ function F2()
+ echo 2
+ endfunction F2
+ function F3()
+ echo 3
+ endfunction " F3
+ function! F4()
+ echo 4
+ endfunction!
+ call F2()
+ call F3()
+ call F4()
+ ]]))
+ check_func('F2', 'echo 2')
+ check_func('F3', 'echo 3')
+ check_func('F4', 'echo 4')
+ end)
+ it('allows running multiple commands with only one character in between',
+ function()
+ eq('\n3', redir_exec(dedent([[
+ function! F1()
+ echo 3
+ endfunction!
+ call F1()]])))
+ check_func('F1', 'echo 3', 2)
+ eq('\n4', redir_exec(dedent([[
+ function F5()
+ echo 4
+ endfunction
+ call F5()]])))
+ check_func('F5', 'echo 4', 2)
+ eq('\n5', redir_exec(dedent([[
+ function F6()
+ echo 5
+ endfunction " TEST
+ call F6()]])))
+ check_func('F6', 'echo 5', 2)
+ eq('\n6', redir_exec(dedent([[
+ function F7()
+ echo 6
+ endfunction F7
+ call F7()]])))
+ check_func('F7', 'echo 6', 2)
+ eq('\n2\n3\n4', redir_exec(dedent([[
+ function F2()
+ echo 2
+ endfunction F2
+ function F3()
+ echo 3
+ endfunction " F3
+ function! F4()
+ echo 4
+ endfunction!
+ call F2()
+ call F3()
+ call F4()]])))
+ check_func('F2', 'echo 2', 2)
+ check_func('F3', 'echo 3', 2)
+ check_func('F4', 'echo 4', 2)
end)
end)
+-- vim: foldmarker=โ–ถ,โ–ฒ
diff --git a/test/functional/viml/lang_spec.lua b/test/functional/viml/lang_spec.lua
new file mode 100644
index 0000000000..6d603b8822
--- /dev/null
+++ b/test/functional/viml/lang_spec.lua
@@ -0,0 +1,30 @@
+local helpers = require('test.functional.helpers')(after_each)
+local clear, eval, eq = helpers.clear, helpers.eval, helpers.eq
+local exc_exec, source = helpers.exc_exec, helpers.source
+
+describe('viml', function()
+ before_each(clear)
+
+ it('parses `<SID>` with turkish locale', function()
+ if exc_exec('lang ctype tr_TR.UTF-8') ~= 0 then
+ pending("Locale tr_TR.UTF-8 not supported")
+ return
+ end
+ source([[
+ func! <sid>_dummy_function()
+ echo 1
+ endfunc
+ au VimEnter * call <sid>_dummy_function()
+ ]])
+ eq(nil, string.find(eval('v:errmsg'), '^E129'))
+ end)
+
+ it('str2float is not affected by locale', function()
+ if exc_exec('lang ctype sv_SE.UTF-8') ~= 0 then
+ pending("Locale sv_SE.UTF-8 not supported")
+ return
+ end
+ clear{env={LANG="", LC_NUMERIC="sv_SE.UTF-8"}}
+ eq(2.2, eval('str2float("2.2")'))
+ end)
+end)
diff --git a/test/helpers.lua b/test/helpers.lua
index 4c50c7644f..a6ed312213 100644
--- a/test/helpers.lua
+++ b/test/helpers.lua
@@ -1,5 +1,44 @@
local assert = require('luassert')
+local luv = require('luv')
local lfs = require('lfs')
+local relpath = require('pl.path').relpath
+
+local quote_me = '[^.%w%+%-%@%_%/]' -- complement (needn't quote)
+local function shell_quote(str)
+ if string.find(str, quote_me) or str == '' then
+ return '"' .. str:gsub('[$%%"\\]', '\\%0') .. '"'
+ else
+ return str
+ end
+end
+
+local function argss_to_cmd(...)
+ local cmd = ''
+ for i = 1, select('#', ...) do
+ local arg = select(i, ...)
+ if type(arg) == 'string' then
+ cmd = cmd .. ' ' ..shell_quote(arg)
+ else
+ for _, subarg in ipairs(arg) do
+ cmd = cmd .. ' ' .. shell_quote(subarg)
+ end
+ end
+ end
+ return cmd
+end
+
+local function popen_r(...)
+ return io.popen(argss_to_cmd(...), 'r')
+end
+
+local function popen_w(...)
+ return io.popen(argss_to_cmd(...), 'w')
+end
+
+-- sleeps the test runner (_not_ the nvim instance)
+local function sleep(ms)
+ luv.sleep(ms)
+end
local check_logs_useless_lines = {
['Warning: noted but unhandled ioctl']=1,
@@ -7,15 +46,74 @@ local check_logs_useless_lines = {
['See README_MISSING_SYSCALL_OR_IOCTL for guidance']=3,
}
-local eq = function(exp, act)
- return assert.are.same(exp, act)
+local function eq(expected, actual, ctx)
+ return assert.are.same(expected, actual, ctx)
end
-local neq = function(exp, act)
- return assert.are_not.same(exp, act)
+local function neq(expected, actual, context)
+ return assert.are_not.same(expected, actual, context)
end
-local ok = function(res)
+local function ok(res)
return assert.is_true(res)
end
+local function near(actual, expected, tolerance)
+ return assert.is.near(actual, expected, tolerance)
+end
+local function matches(pat, actual)
+ if nil ~= string.match(actual, pat) then
+ return true
+ end
+ error(string.format('Pattern does not match.\nPattern:\n%s\nActual:\n%s', pat, actual))
+end
+-- Expect an error matching pattern `pat`.
+local function expect_err(pat, ...)
+ local fn = select(1, ...)
+ local fn_args = {...}
+ table.remove(fn_args, 1)
+ assert.error_matches(function() return fn(unpack(fn_args)) end, pat)
+end
+
+-- initial_path: directory to recurse into
+-- re: include pattern (string)
+-- exc_re: exclude pattern(s) (string or table)
+local function glob(initial_path, re, exc_re)
+ exc_re = type(exc_re) == 'table' and exc_re or { exc_re }
+ local paths_to_check = {initial_path}
+ local ret = {}
+ local checked_files = {}
+ local function is_excluded(path)
+ for _, pat in pairs(exc_re) do
+ if path:match(pat) then return true end
+ end
+ return false
+ end
+
+ if is_excluded(initial_path) then
+ return ret
+ end
+ while #paths_to_check > 0 do
+ local cur_path = paths_to_check[#paths_to_check]
+ paths_to_check[#paths_to_check] = nil
+ for e in lfs.dir(cur_path) do
+ local full_path = cur_path .. '/' .. e
+ local checked_path = full_path:sub(#initial_path + 1)
+ if (not is_excluded(checked_path)) and e:sub(1, 1) ~= '.' then
+ local attrs = lfs.attributes(full_path)
+ if attrs then
+ local check_key = attrs.dev .. ':' .. tostring(attrs.ino)
+ if not checked_files[check_key] then
+ checked_files[check_key] = true
+ if attrs.mode == 'directory' then
+ paths_to_check[#paths_to_check + 1] = full_path
+ elseif not re or checked_path:match(re) then
+ ret[#ret + 1] = full_path
+ end
+ end
+ end
+ end
+ end
+ end
+ return ret
+end
local function check_logs()
local log_dir = os.getenv('LOG_DIR')
@@ -39,7 +137,6 @@ local function check_logs()
fd:close()
os.remove(file)
if #lines > 0 then
- -- local out = os.getenv('TRAVIS_CI_BUILD') and io.stdout or io.stderr
local out = io.stdout
out:write(start_msg .. '\n')
out:write('= ' .. table.concat(lines, '\n= ') .. '\n')
@@ -52,9 +149,627 @@ local function check_logs()
assert(0 == runtime_errors)
end
-return {
+-- Tries to get platform name from $SYSTEM_NAME, uname; fallback is "Windows".
+local uname = (function()
+ local platform = nil
+ return (function()
+ if platform then
+ return platform
+ end
+
+ platform = os.getenv("SYSTEM_NAME")
+ if platform then
+ return platform
+ end
+
+ local status, f = pcall(popen_r, 'uname', '-s')
+ if status then
+ platform = f:read("*l")
+ f:close()
+ else
+ platform = 'Windows'
+ end
+ return platform
+ end)
+end)()
+
+local function tmpdir_get()
+ return os.getenv('TMPDIR') and os.getenv('TMPDIR') or os.getenv('TEMP')
+end
+
+-- Is temp directory `dir` defined local to the project workspace?
+local function tmpdir_is_local(dir)
+ return not not (dir and string.find(dir, 'Xtest'))
+end
+
+local tmpname = (function()
+ local seq = 0
+ local tmpdir = tmpdir_get()
+ return (function()
+ if tmpdir_is_local(tmpdir) then
+ -- Cannot control os.tmpname() dir, so hack our own tmpname() impl.
+ seq = seq + 1
+ local fname = tmpdir..'/nvim-test-lua-'..seq
+ io.open(fname, 'w'):close()
+ return fname
+ else
+ local fname = os.tmpname()
+ if uname() == 'Windows' and fname:sub(1, 2) == '\\s' then
+ -- In Windows tmpname() returns a filename starting with
+ -- special sequence \s, prepend $TEMP path
+ return tmpdir..fname
+ elseif fname:match('^/tmp') and uname() == 'Darwin' then
+ -- In OS X /tmp links to /private/tmp
+ return '/private'..fname
+ else
+ return fname
+ end
+ end
+ end)
+end)()
+
+local function map(func, tab)
+ local rettab = {}
+ for k, v in pairs(tab) do
+ rettab[k] = func(v)
+ end
+ return rettab
+end
+
+local function filter(filter_func, tab)
+ local rettab = {}
+ for _, entry in pairs(tab) do
+ if filter_func(entry) then
+ table.insert(rettab, entry)
+ end
+ end
+ return rettab
+end
+
+local function hasenv(name)
+ local env = os.getenv(name)
+ if env and env ~= '' then
+ return env
+ end
+ return nil
+end
+
+local tests_skipped = 0
+
+local function check_cores(app, force)
+ app = app or 'build/bin/nvim'
+ local initial_path, re, exc_re
+ local gdb_db_cmd = 'gdb -n -batch -ex "thread apply all bt full" "$_NVIM_TEST_APP" -c "$_NVIM_TEST_CORE"'
+ local lldb_db_cmd = 'lldb -Q -o "bt all" -f "$_NVIM_TEST_APP" -c "$_NVIM_TEST_CORE"'
+ local random_skip = false
+ -- Workspace-local $TMPDIR, scrubbed and pattern-escaped.
+ -- "./Xtest-tmpdir/" => "Xtest%-tmpdir"
+ local local_tmpdir = (tmpdir_is_local(tmpdir_get())
+ and relpath(tmpdir_get()):gsub('^[ ./]+',''):gsub('%/+$',''):gsub('([^%w])', '%%%1')
+ or nil)
+ local db_cmd
+ if hasenv('NVIM_TEST_CORE_GLOB_DIRECTORY') then
+ initial_path = os.getenv('NVIM_TEST_CORE_GLOB_DIRECTORY')
+ re = os.getenv('NVIM_TEST_CORE_GLOB_RE')
+ 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
+ initial_path = '/cores'
+ re = nil
+ exc_re = { local_tmpdir }
+ db_cmd = lldb_db_cmd
+ else
+ initial_path = '.'
+ re = '/core[^/]*$'
+ exc_re = { '^/%.deps$', local_tmpdir, '^/%node_modules$' }
+ db_cmd = gdb_db_cmd
+ random_skip = true
+ end
+ -- Finding cores takes too much time on linux
+ if not force and random_skip and math.random() < 0.9 then
+ tests_skipped = tests_skipped + 1
+ return
+ end
+ local cores = glob(initial_path, re, exc_re)
+ local found_cores = 0
+ local out = io.stdout
+ for _, core in ipairs(cores) do
+ local len = 80 - #core - #('Core file ') - 2
+ local esigns = ('='):rep(len / 2)
+ out:write(('\n%s Core file %s %s\n'):format(esigns, core, esigns))
+ out:flush()
+ os.execute(db_cmd:gsub('%$_NVIM_TEST_APP', app):gsub('%$_NVIM_TEST_CORE', core) .. ' 2>&1')
+ out:write('\n')
+ found_cores = found_cores + 1
+ os.remove(core)
+ end
+ if found_cores ~= 0 then
+ out:write(('\nTests covered by this check: %u\n'):format(tests_skipped + 1))
+ end
+ tests_skipped = 0
+ if found_cores > 0 then
+ error("crash detected (see above)")
+ end
+end
+
+local function which(exe)
+ local pipe = popen_r('which', exe)
+ local ret = pipe:read('*a')
+ pipe:close()
+ if ret == '' then
+ return nil
+ else
+ return ret:sub(1, -2)
+ end
+end
+
+local function repeated_read_cmd(...)
+ for _ = 1, 10 do
+ local stream = popen_r(...)
+ local ret = stream:read('*a')
+ stream:close()
+ if ret then
+ return ret
+ end
+ end
+ print('ERROR: Failed to execute ' .. argss_to_cmd(...) .. ': nil return after 10 attempts')
+ return nil
+end
+
+local function shallowcopy(orig)
+ if type(orig) ~= 'table' then
+ return orig
+ end
+ local copy = {}
+ for orig_key, orig_value in pairs(orig) do
+ copy[orig_key] = orig_value
+ end
+ return copy
+end
+
+local deepcopy
+
+local function id(v)
+ return v
+end
+
+local deepcopy_funcs = {
+ table = function(orig)
+ local copy = {}
+ for k, v in pairs(orig) do
+ copy[deepcopy(k)] = deepcopy(v)
+ end
+ return copy
+ end,
+ number = id,
+ string = id,
+ ['nil'] = id,
+ boolean = id,
+}
+
+deepcopy = function(orig)
+ return deepcopy_funcs[type(orig)](orig)
+end
+
+local REMOVE_THIS = {}
+
+local function mergedicts_copy(d1, d2)
+ local ret = shallowcopy(d1)
+ for k, v in pairs(d2) do
+ if d2[k] == REMOVE_THIS then
+ ret[k] = nil
+ elseif type(d1[k]) == 'table' and type(v) == 'table' then
+ ret[k] = mergedicts_copy(d1[k], v)
+ else
+ ret[k] = v
+ end
+ end
+ return ret
+end
+
+-- dictdiff: find a diff so that mergedicts_copy(d1, diff) is equal to d2
+--
+-- Note: does not do copies of d2 values used.
+local function dictdiff(d1, d2)
+ local ret = {}
+ local hasdiff = false
+ for k, v in pairs(d1) do
+ if d2[k] == nil then
+ hasdiff = true
+ ret[k] = REMOVE_THIS
+ elseif type(v) == type(d2[k]) then
+ if type(v) == 'table' then
+ local subdiff = dictdiff(v, d2[k])
+ if subdiff ~= nil then
+ hasdiff = true
+ ret[k] = subdiff
+ end
+ elseif v ~= d2[k] then
+ ret[k] = d2[k]
+ hasdiff = true
+ end
+ else
+ ret[k] = d2[k]
+ hasdiff = true
+ end
+ end
+ for k, v in pairs(d2) do
+ if d1[k] == nil then
+ ret[k] = shallowcopy(v)
+ hasdiff = true
+ end
+ end
+ if hasdiff then
+ return ret
+ else
+ return nil
+ end
+end
+
+local function updated(d, d2)
+ for k, v in pairs(d2) do
+ d[k] = v
+ end
+ return d
+end
+
+local function concat_tables(...)
+ local ret = {}
+ for i = 1, select('#', ...) do
+ local tbl = select(i, ...)
+ if tbl then
+ for _, v in ipairs(tbl) do
+ ret[#ret + 1] = v
+ end
+ end
+ end
+ return ret
+end
+
+local function dedent(str, leave_indent)
+ -- find minimum common indent across lines
+ local indent = nil
+ for line in str:gmatch('[^\n]+') do
+ local line_indent = line:match('^%s+') or ''
+ if indent == nil or #line_indent < #indent then
+ indent = line_indent
+ end
+ end
+ if indent == nil or #indent == 0 then
+ -- no minimum common indent
+ return str
+ end
+ local left_indent = (' '):rep(leave_indent or 0)
+ -- create a pattern for the indent
+ indent = indent:gsub('%s', '[ \t]')
+ -- strip it from the first line
+ str = str:gsub('^'..indent, left_indent)
+ -- strip it from the remaining lines
+ str = str:gsub('[\n]'..indent, '\n' .. left_indent)
+ return str
+end
+
+local function format_float(v)
+ -- On windows exponent appears to have three digits and not two
+ local ret = ('%.6e'):format(v)
+ local l, f, es, e = ret:match('^(%-?%d)%.(%d+)e([+%-])0*(%d%d+)$')
+ return l .. '.' .. f .. 'e' .. es .. e
+end
+
+local SUBTBL = {
+ '\\000', '\\001', '\\002', '\\003', '\\004',
+ '\\005', '\\006', '\\007', '\\008', '\\t',
+ '\\n', '\\011', '\\012', '\\r', '\\014',
+ '\\015', '\\016', '\\017', '\\018', '\\019',
+ '\\020', '\\021', '\\022', '\\023', '\\024',
+ '\\025', '\\026', '\\027', '\\028', '\\029',
+ '\\030', '\\031',
+}
+
+local format_luav
+
+format_luav = function(v, indent, opts)
+ opts = opts or {}
+ local linesep = '\n'
+ local next_indent_arg = nil
+ local indent_shift = opts.indent_shift or ' '
+ local next_indent
+ local nl = '\n'
+ if indent == nil then
+ indent = ''
+ linesep = ''
+ next_indent = ''
+ nl = ' '
+ else
+ next_indent_arg = indent .. indent_shift
+ next_indent = indent .. indent_shift
+ end
+ local ret = ''
+ if type(v) == 'string' then
+ if opts.literal_strings then
+ ret = v
+ else
+ local quote = opts.dquote_strings and '"' or '\''
+ ret = quote .. tostring(v):gsub(
+ opts.dquote_strings and '["\\]' or '[\'\\]',
+ '\\%0'):gsub(
+ '[%z\1-\31]', function(match)
+ return SUBTBL[match:byte() + 1]
+ end) .. quote
+ end
+ elseif type(v) == 'table' then
+ if v == REMOVE_THIS then
+ ret = 'REMOVE_THIS'
+ else
+ local processed_keys = {}
+ ret = '{' .. linesep
+ local non_empty = false
+ for i, subv in ipairs(v) do
+ ret = ('%s%s%s,%s'):format(ret, next_indent,
+ format_luav(subv, next_indent_arg, opts), nl)
+ processed_keys[i] = true
+ non_empty = true
+ end
+ for k, subv in pairs(v) do
+ if not processed_keys[k] then
+ if type(k) == 'string' and k:match('^[a-zA-Z_][a-zA-Z0-9_]*$') then
+ ret = ret .. next_indent .. k .. ' = '
+ else
+ ret = ('%s%s[%s] = '):format(ret, next_indent,
+ format_luav(k, nil, opts))
+ end
+ ret = ret .. format_luav(subv, next_indent_arg, opts) .. ',' .. nl
+ non_empty = true
+ end
+ end
+ if nl == ' ' and non_empty then
+ ret = ret:sub(1, -3)
+ end
+ ret = ret .. indent .. '}'
+ end
+ elseif type(v) == 'number' then
+ if v % 1 == 0 then
+ ret = ('%d'):format(v)
+ else
+ ret = format_float(v)
+ end
+ elseif type(v) == 'nil' then
+ ret = 'nil'
+ elseif type(v) == 'boolean' then
+ ret = (v and 'true' or 'false')
+ else
+ print(type(v))
+ -- Not implemented yet
+ assert(false)
+ end
+ return ret
+end
+
+local function format_string(fmt, ...)
+ local i = 0
+ local args = {...}
+ local function getarg()
+ i = i + 1
+ return args[i]
+ end
+ local ret = fmt:gsub('%%[0-9*]*%.?[0-9*]*[cdEefgGiouXxqsr%%]', function(match)
+ local subfmt = match:gsub('%*', function()
+ return tostring(getarg())
+ end)
+ local arg = nil
+ if subfmt:sub(-1) ~= '%' then
+ arg = getarg()
+ end
+ if subfmt:sub(-1) == 'r' or subfmt:sub(-1) == 'q' then
+ -- %r is like built-in %q, but it is supposed to single-quote strings and
+ -- not double-quote them, and also work not only for strings.
+ -- Builtin %q is replaced here as it gives invalid and inconsistent with
+ -- luajit results for e.g. "\e" on lua: luajit transforms that into `\27`,
+ -- lua leaves as-is.
+ arg = format_luav(arg, nil, {dquote_strings = (subfmt:sub(-1) == 'q')})
+ subfmt = subfmt:sub(1, -2) .. 's'
+ end
+ if subfmt == '%e' then
+ return format_float(arg)
+ else
+ return subfmt:format(arg)
+ end
+ end)
+ return ret
+end
+
+local function intchar2lua(ch)
+ ch = tonumber(ch)
+ return (20 <= ch and ch < 127) and ('%c'):format(ch) or ch
+end
+
+local fixtbl_metatable = {
+ __newindex = function()
+ assert(false)
+ end,
+}
+
+local function fixtbl(tbl)
+ return setmetatable(tbl, fixtbl_metatable)
+end
+
+local function fixtbl_rec(tbl)
+ for _, v in pairs(tbl) do
+ if type(v) == 'table' then
+ fixtbl_rec(v)
+ end
+ end
+ return fixtbl(tbl)
+end
+
+-- From https://github.com/premake/premake-core/blob/master/src/base/table.lua
+local function table_flatten(arr)
+ local result = {}
+ local function _table_flatten(_arr)
+ local n = #_arr
+ for i = 1, n do
+ local v = _arr[i]
+ if type(v) == "table" then
+ _table_flatten(v)
+ elseif v then
+ table.insert(result, v)
+ end
+ end
+ end
+ _table_flatten(arr)
+ return result
+end
+
+local function hexdump(str)
+ local len = string.len(str)
+ local dump = ""
+ local hex = ""
+ local asc = ""
+
+ for i = 1, len do
+ if 1 == i % 8 then
+ dump = dump .. hex .. asc .. "\n"
+ hex = string.format("%04x: ", i - 1)
+ asc = ""
+ end
+
+ local ord = string.byte(str, i)
+ hex = hex .. string.format("%02x ", ord)
+ if ord >= 32 and ord <= 126 then
+ asc = asc .. string.char(ord)
+ else
+ asc = asc .. "."
+ end
+ end
+
+ return dump .. hex .. string.rep(" ", 8 - len % 8) .. asc
+end
+
+-- Reads text lines from `filename` into a table.
+--
+-- filename: path to file
+-- start: start line (1-indexed), negative means "lines before end" (tail)
+local function read_file_list(filename, start)
+ local lnum = (start ~= nil and type(start) == 'number') and start or 1
+ local tail = (lnum < 0)
+ local maxlines = tail and math.abs(lnum) or nil
+ local file = io.open(filename, 'r')
+ if not file then
+ return nil
+ end
+ local lines = {}
+ local i = 1
+ for line in file:lines() do
+ if i >= start then
+ table.insert(lines, line)
+ if #lines > maxlines then
+ table.remove(lines, 1)
+ end
+ end
+ i = i + 1
+ end
+ file:close()
+ return lines
+end
+
+-- Reads the entire contents of `filename` into a string.
+--
+-- filename: path to file
+local function read_file(filename)
+ local file = io.open(filename, 'r')
+ if not file then
+ return nil
+ end
+ local ret = file:read('*a')
+ file:close()
+ return ret
+end
+
+-- Dedent the given text and write it to the file name.
+local function write_file(name, text, no_dedent, append)
+ local file = io.open(name, (append and 'a' or 'w'))
+ if type(text) == 'table' then
+ -- Byte blob
+ local bytes = text
+ text = ''
+ for _, char in ipairs(bytes) do
+ text = ('%s%c'):format(text, char)
+ end
+ elseif not no_dedent then
+ text = dedent(text)
+ end
+ file:write(text)
+ file:flush()
+ file:close()
+end
+
+local function isCI()
+ local is_travis = nil ~= os.getenv('TRAVIS')
+ local is_appveyor = nil ~= os.getenv('APPVEYOR')
+ local is_quickbuild = nil ~= os.getenv('PR_NUMBER')
+ return is_travis or is_appveyor or is_quickbuild
+end
+
+-- Gets the contents of $NVIM_LOG_FILE for printing to the build log.
+-- Also removes the file, if the current environment looks like CI.
+local function read_nvim_log()
+ local logfile = os.getenv('NVIM_LOG_FILE') or '.nvimlog'
+ local keep = isCI() and 999 or 10
+ local lines = read_file_list(logfile, -keep) or {}
+ local log = (('-'):rep(78)..'\n'
+ ..string.format('$NVIM_LOG_FILE: %s\n', logfile)
+ ..(#lines > 0 and '(last '..tostring(keep)..' lines)\n' or '(empty)\n'))
+ for _,line in ipairs(lines) do
+ log = log..line..'\n'
+ end
+ log = log..('-'):rep(78)..'\n'
+ if isCI() then
+ os.remove(logfile)
+ end
+ return log
+end
+
+local module = {
+ REMOVE_THIS = REMOVE_THIS,
+ argss_to_cmd = argss_to_cmd,
+ check_cores = check_cores,
+ check_logs = check_logs,
+ concat_tables = concat_tables,
+ dedent = dedent,
+ deepcopy = deepcopy,
+ dictdiff = dictdiff,
eq = eq,
+ expect_err = expect_err,
+ filter = filter,
+ fixtbl = fixtbl,
+ fixtbl_rec = fixtbl_rec,
+ format_luav = format_luav,
+ format_string = format_string,
+ glob = glob,
+ hasenv = hasenv,
+ hexdump = hexdump,
+ intchar2lua = intchar2lua,
+ map = map,
+ matches = matches,
+ mergedicts_copy = mergedicts_copy,
+ near = near,
neq = neq,
ok = ok,
- check_logs = check_logs,
+ popen_r = popen_r,
+ popen_w = popen_w,
+ read_file = read_file,
+ read_file_list = read_file_list,
+ read_nvim_log = read_nvim_log,
+ repeated_read_cmd = repeated_read_cmd,
+ shallowcopy = shallowcopy,
+ sleep = sleep,
+ table_flatten = table_flatten,
+ tmpname = tmpname,
+ uname = uname,
+ updated = updated,
+ which = which,
+ write_file = write_file,
}
+
+return module
diff --git a/test/includes/CMakeLists.txt b/test/includes/CMakeLists.txt
index 3d85197f19..4d7e962fbd 100644
--- a/test/includes/CMakeLists.txt
+++ b/test/includes/CMakeLists.txt
@@ -1,5 +1,19 @@
file(GLOB_RECURSE PRE_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} pre/*.h)
+# We need to add the SDK directories on OS X, and perhaps other operating
+# systems.
+set(gen_cflags)
+foreach(gen_include ${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES})
+ list(APPEND gen_cflags ${CMAKE_INCLUDE_FLAG_C}${gen_include})
+endforeach()
+
+get_directory_property(gen_cdefs COMPILE_DEFINITIONS)
+foreach(gen_cdef ${gen_cdefs})
+ if(NOT ${gen_cdef} MATCHES "INCLUDE_GENERATED_DECLARATIONS")
+ list(APPEND gen_cflags "-D${gen_cdef}")
+ endif()
+endforeach()
+
foreach(hfile ${PRE_HEADERS})
string(REGEX REPLACE ^pre/ post/ post_hfile ${hfile})
get_filename_component(hdir ${CMAKE_CURRENT_BINARY_DIR}/${post_hfile} PATH)
@@ -8,9 +22,11 @@ foreach(hfile ${PRE_HEADERS})
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${post_hfile}
COMMAND ${CMAKE_C_COMPILER} -std=c99 -E -P
${CMAKE_CURRENT_SOURCE_DIR}/${hfile}
+ ${gen_cflags}
-I${LIBUV_INCLUDE_DIRS}
-o ${CMAKE_CURRENT_BINARY_DIR}/${post_hfile})
list(APPEND POST_HEADERS ${post_hfile})
endforeach()
add_custom_target(unittest-headers DEPENDS ${POST_HEADERS})
+set_target_properties(unittest-headers PROPERTIES FOLDER test)
diff --git a/test/includes/pre/sys/stat.h b/test/includes/pre/sys/stat.h
index c6cac80913..1cb811d579 100644
--- a/test/includes/pre/sys/stat.h
+++ b/test/includes/pre/sys/stat.h
@@ -1,4 +1,6 @@
-#define _GNU_SOURCE
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE
+#endif
#include <sys/stat.h>
static const mode_t kS_IFMT = S_IFMT;
diff --git a/test/includes/pre/uv-errno.h b/test/includes/pre/uv.h
index 6b80f60e5c..da7818cd07 100644
--- a/test/includes/pre/uv-errno.h
+++ b/test/includes/pre/uv.h
@@ -1,4 +1,4 @@
-#include <uv-errno.h>
+#include <uv.h>
static const int kUV_ENOENT = UV_ENOENT;
static const int kUV_EEXIST = UV_EEXIST;
diff --git a/test/symbolic/klee/nvim/charset.c b/test/symbolic/klee/nvim/charset.c
new file mode 100644
index 0000000000..95853a6834
--- /dev/null
+++ b/test/symbolic/klee/nvim/charset.c
@@ -0,0 +1,172 @@
+#include <stdbool.h>
+
+#include "nvim/ascii.h"
+#include "nvim/macros.h"
+#include "nvim/charset.h"
+#include "nvim/eval/typval.h"
+#include "nvim/vim.h"
+
+int hex2nr(int c)
+{
+ if ((c >= 'a') && (c <= 'f')) {
+ return c - 'a' + 10;
+ }
+
+ if ((c >= 'A') && (c <= 'F')) {
+ return c - 'A' + 10;
+ }
+ return c - '0';
+}
+
+void vim_str2nr(const char_u *const start, int *const prep, int *const len,
+ const int what, varnumber_T *const nptr,
+ uvarnumber_T *const unptr, const int maxlen)
+{
+ const char *ptr = (const char *)start;
+#define STRING_ENDED(ptr) \
+ (!(maxlen == 0 || (int)((ptr) - (const char *)start) < maxlen))
+ int pre = 0; // default is decimal
+ const bool negative = (ptr[0] == '-');
+ uvarnumber_T un = 0;
+
+ if (negative) {
+ ptr++;
+ }
+
+ if (what & STR2NR_FORCE) {
+ // When forcing main consideration is skipping the prefix. Octal and decimal
+ // numbers have no prefixes to skip. pre is not set.
+ switch ((unsigned)what & (~(unsigned)STR2NR_FORCE)) {
+ case STR2NR_HEX: {
+ if (!STRING_ENDED(ptr + 2)
+ && ptr[0] == '0'
+ && (ptr[1] == 'x' || ptr[1] == 'X')
+ && ascii_isxdigit(ptr[2])) {
+ ptr += 2;
+ }
+ goto vim_str2nr_hex;
+ }
+ case STR2NR_BIN: {
+ if (!STRING_ENDED(ptr + 2)
+ && ptr[0] == '0'
+ && (ptr[1] == 'b' || ptr[1] == 'B')
+ && ascii_isbdigit(ptr[2])) {
+ ptr += 2;
+ }
+ goto vim_str2nr_bin;
+ }
+ case STR2NR_OCT: {
+ goto vim_str2nr_oct;
+ }
+ case 0: {
+ goto vim_str2nr_dec;
+ }
+ default: {
+ assert(false);
+ }
+ }
+ } else if ((what & (STR2NR_HEX|STR2NR_OCT|STR2NR_BIN))
+ && !STRING_ENDED(ptr + 1)
+ && ptr[0] == '0' && ptr[1] != '8' && ptr[1] != '9') {
+ pre = ptr[1];
+ // Detect hexadecimal: 0x or 0X follwed by hex digit
+ if ((what & STR2NR_HEX)
+ && !STRING_ENDED(ptr + 2)
+ && (pre == 'X' || pre == 'x')
+ && ascii_isxdigit(ptr[2])) {
+ ptr += 2;
+ goto vim_str2nr_hex;
+ }
+ // Detect binary: 0b or 0B follwed by 0 or 1
+ if ((what & STR2NR_BIN)
+ && !STRING_ENDED(ptr + 2)
+ && (pre == 'B' || pre == 'b')
+ && ascii_isbdigit(ptr[2])) {
+ ptr += 2;
+ goto vim_str2nr_bin;
+ }
+ // Detect octal number: zero followed by octal digits without '8' or '9'
+ pre = 0;
+ if (!(what & STR2NR_OCT)) {
+ goto vim_str2nr_dec;
+ }
+ for (int i = 2; !STRING_ENDED(ptr + i) && ascii_isdigit(ptr[i]); i++) {
+ if (ptr[i] > '7') {
+ goto vim_str2nr_dec;
+ }
+ }
+ pre = '0';
+ goto vim_str2nr_oct;
+ } else {
+ goto vim_str2nr_dec;
+ }
+
+ // Do the string-to-numeric conversion "manually" to avoid sscanf quirks.
+ assert(false); // Shouldโ€™ve used goto earlier.
+#define PARSE_NUMBER(base, cond, conv) \
+ do { \
+ while (!STRING_ENDED(ptr) && (cond)) { \
+ /* avoid ubsan error for overflow */ \
+ if (un < UVARNUMBER_MAX / base) { \
+ un = base * un + (uvarnumber_T)(conv); \
+ } else { \
+ un = UVARNUMBER_MAX; \
+ } \
+ ptr++; \
+ } \
+ } while (0)
+ switch (pre) {
+ case 'b':
+ case 'B': {
+vim_str2nr_bin:
+ PARSE_NUMBER(2, (*ptr == '0' || *ptr == '1'), (*ptr - '0'));
+ break;
+ }
+ case '0': {
+vim_str2nr_oct:
+ PARSE_NUMBER(8, ('0' <= *ptr && *ptr <= '7'), (*ptr - '0'));
+ break;
+ }
+ case 0: {
+vim_str2nr_dec:
+ PARSE_NUMBER(10, (ascii_isdigit(*ptr)), (*ptr - '0'));
+ break;
+ }
+ case 'x':
+ case 'X': {
+vim_str2nr_hex:
+ PARSE_NUMBER(16, (ascii_isxdigit(*ptr)), (hex2nr(*ptr)));
+ break;
+ }
+ }
+#undef PARSE_NUMBER
+
+ if (prep != NULL) {
+ *prep = pre;
+ }
+
+ if (len != NULL) {
+ *len = (int)(ptr - (const char *)start);
+ }
+
+ if (nptr != NULL) {
+ if (negative) { // account for leading '-' for decimal numbers
+ // avoid ubsan error for overflow
+ if (un > VARNUMBER_MAX) {
+ *nptr = VARNUMBER_MIN;
+ } else {
+ *nptr = -(varnumber_T)un;
+ }
+ } else {
+ if (un > VARNUMBER_MAX) {
+ un = VARNUMBER_MAX;
+ }
+ *nptr = (varnumber_T)un;
+ }
+ }
+
+ if (unptr != NULL) {
+ *unptr = un;
+ }
+#undef STRING_ENDED
+}
diff --git a/test/symbolic/klee/nvim/garray.c b/test/symbolic/klee/nvim/garray.c
new file mode 100644
index 0000000000..260870c3c2
--- /dev/null
+++ b/test/symbolic/klee/nvim/garray.c
@@ -0,0 +1,195 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+/// @file garray.c
+///
+/// Functions for handling growing arrays.
+
+#include <string.h>
+#include <inttypes.h>
+
+#include "nvim/vim.h"
+#include "nvim/ascii.h"
+#include "nvim/log.h"
+#include "nvim/memory.h"
+#include "nvim/path.h"
+#include "nvim/garray.h"
+#include "nvim/strings.h"
+
+// #include "nvim/globals.h"
+#include "nvim/memline.h"
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "garray.c.generated.h"
+#endif
+
+/// Clear an allocated growing array.
+void ga_clear(garray_T *gap)
+{
+ xfree(gap->ga_data);
+
+ // Initialize growing array without resetting itemsize or growsize
+ gap->ga_data = NULL;
+ gap->ga_maxlen = 0;
+ gap->ga_len = 0;
+}
+
+/// Clear a growing array that contains a list of strings.
+///
+/// @param gap
+void ga_clear_strings(garray_T *gap)
+{
+ GA_DEEP_CLEAR_PTR(gap);
+}
+
+/// Initialize a growing array.
+///
+/// @param gap
+/// @param itemsize
+/// @param growsize
+void ga_init(garray_T *gap, int itemsize, int growsize)
+{
+ gap->ga_data = NULL;
+ gap->ga_maxlen = 0;
+ gap->ga_len = 0;
+ gap->ga_itemsize = itemsize;
+ ga_set_growsize(gap, growsize);
+}
+
+/// A setter for the growsize that guarantees it will be at least 1.
+///
+/// @param gap
+/// @param growsize
+void ga_set_growsize(garray_T *gap, int growsize)
+{
+ if (growsize < 1) {
+ WLOG("trying to set an invalid ga_growsize: %d", growsize);
+ gap->ga_growsize = 1;
+ } else {
+ gap->ga_growsize = growsize;
+ }
+}
+
+/// Make room in growing array "gap" for at least "n" items.
+///
+/// @param gap
+/// @param n
+void ga_grow(garray_T *gap, int n)
+{
+ if (gap->ga_maxlen - gap->ga_len >= n) {
+ // the garray still has enough space, do nothing
+ return;
+ }
+
+ if (gap->ga_growsize < 1) {
+ WLOG("ga_growsize(%d) is less than 1", gap->ga_growsize);
+ }
+
+ // the garray grows by at least growsize
+ if (n < gap->ga_growsize) {
+ n = gap->ga_growsize;
+ }
+ int new_maxlen = gap->ga_len + n;
+
+ size_t new_size = (size_t)(gap->ga_itemsize * new_maxlen);
+ size_t old_size = (size_t)(gap->ga_itemsize * gap->ga_maxlen);
+
+ // reallocate and clear the new memory
+ char *pp = xrealloc(gap->ga_data, new_size);
+ memset(pp + old_size, 0, new_size - old_size);
+
+ gap->ga_maxlen = new_maxlen;
+ gap->ga_data = pp;
+}
+
+/// For a growing array that contains a list of strings: concatenate all the
+/// strings with sep as separator.
+///
+/// @param gap
+/// @param sep
+///
+/// @returns the concatenated strings
+char_u *ga_concat_strings_sep(const garray_T *gap, const char *sep)
+ FUNC_ATTR_NONNULL_RET
+{
+ const size_t nelem = (size_t) gap->ga_len;
+ const char **strings = gap->ga_data;
+
+ if (nelem == 0) {
+ return (char_u *) xstrdup("");
+ }
+
+ size_t len = 0;
+ for (size_t i = 0; i < nelem; i++) {
+ len += strlen(strings[i]);
+ }
+
+ // add some space for the (num - 1) separators
+ len += (nelem - 1) * strlen(sep);
+ char *const ret = xmallocz(len);
+
+ char *s = ret;
+ for (size_t i = 0; i < nelem - 1; i++) {
+ s = xstpcpy(s, strings[i]);
+ s = xstpcpy(s, sep);
+ }
+ strcpy(s, strings[nelem - 1]);
+
+ return (char_u *) ret;
+}
+
+/// For a growing array that contains a list of strings: concatenate all the
+/// strings with a separating comma.
+///
+/// @param gap
+///
+/// @returns the concatenated strings
+char_u* ga_concat_strings(const garray_T *gap) FUNC_ATTR_NONNULL_RET
+{
+ return ga_concat_strings_sep(gap, ",");
+}
+
+/// Concatenate a string to a growarray which contains characters.
+/// When "s" is NULL does not do anything.
+///
+/// WARNING:
+/// - Does NOT copy the NUL at the end!
+/// - The parameter may not overlap with the growing array
+///
+/// @param gap
+/// @param s
+void ga_concat(garray_T *gap, const char_u *restrict s)
+{
+ if (s == NULL) {
+ return;
+ }
+
+ ga_concat_len(gap, (const char *restrict) s, strlen((char *) s));
+}
+
+/// Concatenate a string to a growarray which contains characters
+///
+/// @param[out] gap Growarray to modify.
+/// @param[in] s String to concatenate.
+/// @param[in] len String length.
+void ga_concat_len(garray_T *const gap, const char *restrict s,
+ const size_t len)
+ FUNC_ATTR_NONNULL_ALL
+{
+ if (len) {
+ ga_grow(gap, (int) len);
+ char *data = gap->ga_data;
+ memcpy(data + gap->ga_len, s, len);
+ gap->ga_len += (int) len;
+ }
+}
+
+/// Append one byte to a growarray which contains bytes.
+///
+/// @param gap
+/// @param c
+void ga_append(garray_T *gap, char c)
+{
+ GA_APPEND(char, gap, c);
+}
+
diff --git a/test/symbolic/klee/nvim/gettext.c b/test/symbolic/klee/nvim/gettext.c
new file mode 100644
index 0000000000..b9cc98d770
--- /dev/null
+++ b/test/symbolic/klee/nvim/gettext.c
@@ -0,0 +1,4 @@
+char *gettext(const char *s)
+{
+ return (char *)s;
+}
diff --git a/test/symbolic/klee/nvim/keymap.c b/test/symbolic/klee/nvim/keymap.c
new file mode 100644
index 0000000000..a341a73689
--- /dev/null
+++ b/test/symbolic/klee/nvim/keymap.c
@@ -0,0 +1,539 @@
+#include <stdbool.h>
+
+#include "nvim/types.h"
+#include "nvim/keymap.h"
+#include "nvim/ascii.h"
+#include "nvim/eval/typval.h"
+
+#define MOD_KEYS_ENTRY_SIZE 5
+
+static char_u modifier_keys_table[] =
+{
+ MOD_MASK_SHIFT, '&', '9', '@', '1',
+ MOD_MASK_SHIFT, '&', '0', '@', '2',
+ MOD_MASK_SHIFT, '*', '1', '@', '4',
+ MOD_MASK_SHIFT, '*', '2', '@', '5',
+ MOD_MASK_SHIFT, '*', '3', '@', '6',
+ MOD_MASK_SHIFT, '*', '4', 'k', 'D',
+ MOD_MASK_SHIFT, '*', '5', 'k', 'L',
+ MOD_MASK_SHIFT, '*', '7', '@', '7',
+ MOD_MASK_CTRL, KS_EXTRA, (int)KE_C_END, '@', '7',
+ MOD_MASK_SHIFT, '*', '9', '@', '9',
+ MOD_MASK_SHIFT, '*', '0', '@', '0',
+ MOD_MASK_SHIFT, '#', '1', '%', '1',
+ MOD_MASK_SHIFT, '#', '2', 'k', 'h',
+ MOD_MASK_CTRL, KS_EXTRA, (int)KE_C_HOME, 'k', 'h',
+ MOD_MASK_SHIFT, '#', '3', 'k', 'I',
+ MOD_MASK_SHIFT, '#', '4', 'k', 'l',
+ MOD_MASK_CTRL, KS_EXTRA, (int)KE_C_LEFT, 'k', 'l',
+ MOD_MASK_SHIFT, '%', 'a', '%', '3',
+ MOD_MASK_SHIFT, '%', 'b', '%', '4',
+ MOD_MASK_SHIFT, '%', 'c', '%', '5',
+ MOD_MASK_SHIFT, '%', 'd', '%', '7',
+ MOD_MASK_SHIFT, '%', 'e', '%', '8',
+ MOD_MASK_SHIFT, '%', 'f', '%', '9',
+ MOD_MASK_SHIFT, '%', 'g', '%', '0',
+ MOD_MASK_SHIFT, '%', 'h', '&', '3',
+ MOD_MASK_SHIFT, '%', 'i', 'k', 'r',
+ MOD_MASK_CTRL, KS_EXTRA, (int)KE_C_RIGHT, 'k', 'r',
+ MOD_MASK_SHIFT, '%', 'j', '&', '5',
+ MOD_MASK_SHIFT, '!', '1', '&', '6',
+ MOD_MASK_SHIFT, '!', '2', '&', '7',
+ MOD_MASK_SHIFT, '!', '3', '&', '8',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_UP, 'k', 'u',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_DOWN, 'k', 'd',
+
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_XF1, KS_EXTRA, (int)KE_XF1,
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_XF2, KS_EXTRA, (int)KE_XF2,
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_XF3, KS_EXTRA, (int)KE_XF3,
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_XF4, KS_EXTRA, (int)KE_XF4,
+
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F1, 'k', '1',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F2, 'k', '2',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F3, 'k', '3',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F4, 'k', '4',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F5, 'k', '5',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F6, 'k', '6',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F7, 'k', '7',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F8, 'k', '8',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F9, 'k', '9',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F10, 'k', ';',
+
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F11, 'F', '1',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F12, 'F', '2',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F13, 'F', '3',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F14, 'F', '4',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F15, 'F', '5',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F16, 'F', '6',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F17, 'F', '7',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F18, 'F', '8',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F19, 'F', '9',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F20, 'F', 'A',
+
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F21, 'F', 'B',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F22, 'F', 'C',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F23, 'F', 'D',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F24, 'F', 'E',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F25, 'F', 'F',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F26, 'F', 'G',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F27, 'F', 'H',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F28, 'F', 'I',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F29, 'F', 'J',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F30, 'F', 'K',
+
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F31, 'F', 'L',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F32, 'F', 'M',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F33, 'F', 'N',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F34, 'F', 'O',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F35, 'F', 'P',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F36, 'F', 'Q',
+ MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F37, 'F', 'R',
+
+ MOD_MASK_SHIFT, 'k', 'B', KS_EXTRA, (int)KE_TAB,
+
+ NUL
+};
+
+int simplify_key(const int key, int *modifiers)
+{
+ if (*modifiers & (MOD_MASK_SHIFT | MOD_MASK_CTRL | MOD_MASK_ALT)) {
+ // TAB is a special case.
+ if (key == TAB && (*modifiers & MOD_MASK_SHIFT)) {
+ *modifiers &= ~MOD_MASK_SHIFT;
+ return K_S_TAB;
+ }
+ const int key0 = KEY2TERMCAP0(key);
+ const int key1 = KEY2TERMCAP1(key);
+ for (int i = 0; modifier_keys_table[i] != NUL; i += MOD_KEYS_ENTRY_SIZE) {
+ if (key0 == modifier_keys_table[i + 3]
+ && key1 == modifier_keys_table[i + 4]
+ && (*modifiers & modifier_keys_table[i])) {
+ *modifiers &= ~modifier_keys_table[i];
+ return TERMCAP2KEY(modifier_keys_table[i + 1],
+ modifier_keys_table[i + 2]);
+ }
+ }
+ }
+ return key;
+}
+
+int handle_x_keys(const int key)
+ FUNC_ATTR_CONST FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ switch (key) {
+ case K_XUP: return K_UP;
+ case K_XDOWN: return K_DOWN;
+ case K_XLEFT: return K_LEFT;
+ case K_XRIGHT: return K_RIGHT;
+ case K_XHOME: return K_HOME;
+ case K_ZHOME: return K_HOME;
+ case K_XEND: return K_END;
+ case K_ZEND: return K_END;
+ case K_XF1: return K_F1;
+ case K_XF2: return K_F2;
+ case K_XF3: return K_F3;
+ case K_XF4: return K_F4;
+ case K_S_XF1: return K_S_F1;
+ case K_S_XF2: return K_S_F2;
+ case K_S_XF3: return K_S_F3;
+ case K_S_XF4: return K_S_F4;
+ }
+ return key;
+}
+
+static const struct key_name_entry {
+ int key; // Special key code or ascii value
+ const char *name; // Name of key
+} key_names_table[] = {
+ { ' ', "Space" },
+ { TAB, "Tab" },
+ { K_TAB, "Tab" },
+ { NL, "NL" },
+ { NL, "NewLine" }, // Alternative name
+ { NL, "LineFeed" }, // Alternative name
+ { NL, "LF" }, // Alternative name
+ { CAR, "CR" },
+ { CAR, "Return" }, // Alternative name
+ { CAR, "Enter" }, // Alternative name
+ { K_BS, "BS" },
+ { K_BS, "BackSpace" }, // Alternative name
+ { ESC, "Esc" },
+ { CSI, "CSI" },
+ { K_CSI, "xCSI" },
+ { '|', "Bar" },
+ { '\\', "Bslash" },
+ { K_DEL, "Del" },
+ { K_DEL, "Delete" }, // Alternative name
+ { K_KDEL, "kDel" },
+ { K_UP, "Up" },
+ { K_DOWN, "Down" },
+ { K_LEFT, "Left" },
+ { K_RIGHT, "Right" },
+ { K_XUP, "xUp" },
+ { K_XDOWN, "xDown" },
+ { K_XLEFT, "xLeft" },
+ { K_XRIGHT, "xRight" },
+
+ { K_F1, "F1" },
+ { K_F2, "F2" },
+ { K_F3, "F3" },
+ { K_F4, "F4" },
+ { K_F5, "F5" },
+ { K_F6, "F6" },
+ { K_F7, "F7" },
+ { K_F8, "F8" },
+ { K_F9, "F9" },
+ { K_F10, "F10" },
+
+ { K_F11, "F11" },
+ { K_F12, "F12" },
+ { K_F13, "F13" },
+ { K_F14, "F14" },
+ { K_F15, "F15" },
+ { K_F16, "F16" },
+ { K_F17, "F17" },
+ { K_F18, "F18" },
+ { K_F19, "F19" },
+ { K_F20, "F20" },
+
+ { K_F21, "F21" },
+ { K_F22, "F22" },
+ { K_F23, "F23" },
+ { K_F24, "F24" },
+ { K_F25, "F25" },
+ { K_F26, "F26" },
+ { K_F27, "F27" },
+ { K_F28, "F28" },
+ { K_F29, "F29" },
+ { K_F30, "F30" },
+
+ { K_F31, "F31" },
+ { K_F32, "F32" },
+ { K_F33, "F33" },
+ { K_F34, "F34" },
+ { K_F35, "F35" },
+ { K_F36, "F36" },
+ { K_F37, "F37" },
+
+ { K_XF1, "xF1" },
+ { K_XF2, "xF2" },
+ { K_XF3, "xF3" },
+ { K_XF4, "xF4" },
+
+ { K_HELP, "Help" },
+ { K_UNDO, "Undo" },
+ { K_INS, "Insert" },
+ { K_INS, "Ins" }, // Alternative name
+ { K_KINS, "kInsert" },
+ { K_HOME, "Home" },
+ { K_KHOME, "kHome" },
+ { K_XHOME, "xHome" },
+ { K_ZHOME, "zHome" },
+ { K_END, "End" },
+ { K_KEND, "kEnd" },
+ { K_XEND, "xEnd" },
+ { K_ZEND, "zEnd" },
+ { K_PAGEUP, "PageUp" },
+ { K_PAGEDOWN, "PageDown" },
+ { K_KPAGEUP, "kPageUp" },
+ { K_KPAGEDOWN, "kPageDown" },
+
+ { K_KPLUS, "kPlus" },
+ { K_KMINUS, "kMinus" },
+ { K_KDIVIDE, "kDivide" },
+ { K_KMULTIPLY, "kMultiply" },
+ { K_KENTER, "kEnter" },
+ { K_KPOINT, "kPoint" },
+
+ { K_K0, "k0" },
+ { K_K1, "k1" },
+ { K_K2, "k2" },
+ { K_K3, "k3" },
+ { K_K4, "k4" },
+ { K_K5, "k5" },
+ { K_K6, "k6" },
+ { K_K7, "k7" },
+ { K_K8, "k8" },
+ { K_K9, "k9" },
+
+ { '<', "lt" },
+
+ { K_MOUSE, "Mouse" },
+ { K_LEFTMOUSE, "LeftMouse" },
+ { K_LEFTMOUSE_NM, "LeftMouseNM" },
+ { K_LEFTDRAG, "LeftDrag" },
+ { K_LEFTRELEASE, "LeftRelease" },
+ { K_LEFTRELEASE_NM, "LeftReleaseNM" },
+ { K_MIDDLEMOUSE, "MiddleMouse" },
+ { K_MIDDLEDRAG, "MiddleDrag" },
+ { K_MIDDLERELEASE, "MiddleRelease" },
+ { K_RIGHTMOUSE, "RightMouse" },
+ { K_RIGHTDRAG, "RightDrag" },
+ { K_RIGHTRELEASE, "RightRelease" },
+ { K_MOUSEDOWN, "ScrollWheelUp" },
+ { K_MOUSEUP, "ScrollWheelDown" },
+ { K_MOUSELEFT, "ScrollWheelRight" },
+ { K_MOUSERIGHT, "ScrollWheelLeft" },
+ { K_MOUSEDOWN, "MouseDown" }, // OBSOLETE: Use
+ { K_MOUSEUP, "MouseUp" }, // ScrollWheelXXX instead
+ { K_X1MOUSE, "X1Mouse" },
+ { K_X1DRAG, "X1Drag" },
+ { K_X1RELEASE, "X1Release" },
+ { K_X2MOUSE, "X2Mouse" },
+ { K_X2DRAG, "X2Drag" },
+ { K_X2RELEASE, "X2Release" },
+ { K_DROP, "Drop" },
+ { K_ZERO, "Nul" },
+ { K_SNR, "SNR" },
+ { K_PLUG, "Plug" },
+ { K_PASTE, "Paste" },
+ { 0, NULL }
+};
+
+int get_special_key_code(const char_u *name)
+{
+ for (int i = 0; key_names_table[i].name != NULL; i++) {
+ const char *const table_name = key_names_table[i].name;
+ int j;
+ for (j = 0; ascii_isident(name[j]) && table_name[j] != NUL; j++) {
+ if (TOLOWER_ASC(table_name[j]) != TOLOWER_ASC(name[j])) {
+ break;
+ }
+ }
+ if (!ascii_isident(name[j]) && table_name[j] == NUL) {
+ return key_names_table[i].key;
+ }
+ }
+
+ return 0;
+}
+
+
+static const struct modmasktable {
+ short mod_mask; ///< Bit-mask for particular key modifier.
+ short mod_flag; ///< Bit(s) for particular key modifier.
+ char_u name; ///< Single letter name of modifier.
+} mod_mask_table[] = {
+ {MOD_MASK_ALT, MOD_MASK_ALT, (char_u)'M'},
+ {MOD_MASK_META, MOD_MASK_META, (char_u)'T'},
+ {MOD_MASK_CTRL, MOD_MASK_CTRL, (char_u)'C'},
+ {MOD_MASK_SHIFT, MOD_MASK_SHIFT, (char_u)'S'},
+ {MOD_MASK_MULTI_CLICK, MOD_MASK_2CLICK, (char_u)'2'},
+ {MOD_MASK_MULTI_CLICK, MOD_MASK_3CLICK, (char_u)'3'},
+ {MOD_MASK_MULTI_CLICK, MOD_MASK_4CLICK, (char_u)'4'},
+ {MOD_MASK_CMD, MOD_MASK_CMD, (char_u)'D'},
+ // 'A' must be the last one
+ {MOD_MASK_ALT, MOD_MASK_ALT, (char_u)'A'},
+ {0, 0, NUL}
+};
+
+int name_to_mod_mask(int c)
+{
+ c = TOUPPER_ASC(c);
+ for (size_t i = 0; mod_mask_table[i].mod_mask != 0; i++) {
+ if (c == mod_mask_table[i].name) {
+ return mod_mask_table[i].mod_flag;
+ }
+ }
+ return 0;
+}
+
+static int extract_modifiers(int key, int *modp)
+{
+ int modifiers = *modp;
+
+ if (!(modifiers & MOD_MASK_CMD)) { // Command-key is special
+ if ((modifiers & MOD_MASK_SHIFT) && ASCII_ISALPHA(key)) {
+ key = TOUPPER_ASC(key);
+ modifiers &= ~MOD_MASK_SHIFT;
+ }
+ }
+ if ((modifiers & MOD_MASK_CTRL)
+ && ((key >= '?' && key <= '_') || ASCII_ISALPHA(key))) {
+ key = Ctrl_chr(key);
+ modifiers &= ~MOD_MASK_CTRL;
+ if (key == 0) { // <C-@> is <Nul>
+ key = K_ZERO;
+ }
+ }
+
+ *modp = modifiers;
+ return key;
+}
+
+int find_special_key(const char_u **srcp, const size_t src_len, int *const modp,
+ const bool keycode, const bool keep_x_key,
+ const bool in_string)
+{
+ const char_u *last_dash;
+ const char_u *end_of_name;
+ const char_u *src;
+ const char_u *bp;
+ const char_u *const end = *srcp + src_len - 1;
+ int modifiers;
+ int bit;
+ int key;
+ uvarnumber_T n;
+ int l;
+
+ if (src_len == 0) {
+ return 0;
+ }
+
+ src = *srcp;
+ if (src[0] != '<') {
+ return 0;
+ }
+
+ // Find end of modifier list
+ last_dash = src;
+ for (bp = src + 1; bp <= end && (*bp == '-' || ascii_isident(*bp)); bp++) {
+ if (*bp == '-') {
+ last_dash = bp;
+ if (bp + 1 <= end) {
+ l = utfc_ptr2len_len(bp + 1, (int)(end - bp) + 1);
+ // Anything accepted, like <C-?>.
+ // <C-"> or <M-"> are not special in strings as " is
+ // the string delimiter. With a backslash it works: <M-\">
+ if (end - bp > l && !(in_string && bp[1] == '"') && bp[2] == '>') {
+ bp += l;
+ } else if (end - bp > 2 && in_string && bp[1] == '\\'
+ && bp[2] == '"' && bp[3] == '>') {
+ bp += 2;
+ }
+ }
+ }
+ if (end - bp > 3 && bp[0] == 't' && bp[1] == '_') {
+ bp += 3; // skip t_xx, xx may be '-' or '>'
+ } else if (end - bp > 4 && STRNICMP(bp, "char-", 5) == 0) {
+ vim_str2nr(bp + 5, NULL, &l, STR2NR_ALL, NULL, NULL, 0);
+ bp += l + 5;
+ break;
+ }
+ }
+
+ if (bp <= end && *bp == '>') { // found matching '>'
+ end_of_name = bp + 1;
+
+ /* Which modifiers are given? */
+ modifiers = 0x0;
+ for (bp = src + 1; bp < last_dash; bp++) {
+ if (*bp != '-') {
+ bit = name_to_mod_mask(*bp);
+ if (bit == 0x0) {
+ break; // Illegal modifier name
+ }
+ modifiers |= bit;
+ }
+ }
+
+ // Legal modifier name.
+ if (bp >= last_dash) {
+ if (STRNICMP(last_dash + 1, "char-", 5) == 0
+ && ascii_isdigit(last_dash[6])) {
+ // <Char-123> or <Char-033> or <Char-0x33>
+ vim_str2nr(last_dash + 6, NULL, NULL, STR2NR_ALL, NULL, &n, 0);
+ key = (int)n;
+ } else {
+ int off = 1;
+
+ // Modifier with single letter, or special key name.
+ if (in_string && last_dash[1] == '\\' && last_dash[2] == '"') {
+ off = 2;
+ }
+ l = mb_ptr2len(last_dash + 1);
+ if (modifiers != 0 && last_dash[l + 1] == '>') {
+ key = PTR2CHAR(last_dash + off);
+ } else {
+ key = get_special_key_code(last_dash + off);
+ if (!keep_x_key) {
+ key = handle_x_keys(key);
+ }
+ }
+ }
+
+ // get_special_key_code() may return NUL for invalid
+ // special key name.
+ if (key != NUL) {
+ // Only use a modifier when there is no special key code that
+ // includes the modifier.
+ key = simplify_key(key, &modifiers);
+
+ if (!keycode) {
+ // don't want keycode, use single byte code
+ if (key == K_BS) {
+ key = BS;
+ } else if (key == K_DEL || key == K_KDEL) {
+ key = DEL;
+ }
+ }
+
+ // Normal Key with modifier:
+ // Try to make a single byte code (except for Alt/Meta modifiers).
+ if (!IS_SPECIAL(key)) {
+ key = extract_modifiers(key, &modifiers);
+ }
+
+ *modp = modifiers;
+ *srcp = end_of_name;
+ return key;
+ }
+ }
+ }
+ return 0;
+}
+
+char_u *add_char2buf(int c, char_u *s)
+{
+ char_u temp[MB_MAXBYTES + 1];
+ const int len = utf_char2bytes(c, temp);
+ for (int i = 0; i < len; ++i) {
+ c = temp[i];
+ // Need to escape K_SPECIAL and CSI like in the typeahead buffer.
+ if (c == K_SPECIAL) {
+ *s++ = K_SPECIAL;
+ *s++ = KS_SPECIAL;
+ *s++ = KE_FILLER;
+ } else {
+ *s++ = c;
+ }
+ }
+ return s;
+}
+
+unsigned int trans_special(const char_u **srcp, const size_t src_len,
+ char_u *const dst, const bool keycode,
+ const bool in_string)
+{
+ int modifiers = 0;
+ int key;
+ unsigned int dlen = 0;
+
+ key = find_special_key(srcp, src_len, &modifiers, keycode, false, in_string);
+ if (key == 0) {
+ return 0;
+ }
+
+ // Put the appropriate modifier in a string.
+ if (modifiers != 0) {
+ dst[dlen++] = K_SPECIAL;
+ dst[dlen++] = KS_MODIFIER;
+ dst[dlen++] = (char_u)modifiers;
+ }
+
+ if (IS_SPECIAL(key)) {
+ dst[dlen++] = K_SPECIAL;
+ dst[dlen++] = (char_u)KEY2TERMCAP0(key);
+ dst[dlen++] = KEY2TERMCAP1(key);
+ } else if (has_mbyte && !keycode) {
+ dlen += (unsigned int)(*mb_char2bytes)(key, dst + dlen);
+ } else if (keycode) {
+ char_u *after = add_char2buf(key, dst + dlen);
+ assert(after >= dst && (uintmax_t)(after - dst) <= UINT_MAX);
+ dlen = (unsigned int)(after - dst);
+ } else {
+ dst[dlen++] = (char_u)key;
+ }
+
+ return dlen;
+}
diff --git a/test/symbolic/klee/nvim/mbyte.c b/test/symbolic/klee/nvim/mbyte.c
new file mode 100644
index 0000000000..f98a531206
--- /dev/null
+++ b/test/symbolic/klee/nvim/mbyte.c
@@ -0,0 +1,266 @@
+#include <stddef.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <stdbool.h>
+
+#include "nvim/types.h"
+#include "nvim/mbyte.h"
+#include "nvim/ascii.h"
+
+const uint8_t utf8len_tab_zero[] = {
+ //1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 0
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 2
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 4
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 6
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 8
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // A
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, // C
+ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,0,0, // E
+};
+
+const uint8_t utf8len_tab[] = {
+ // ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9 ?A ?B ?C ?D ?E ?F
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A?
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B?
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // C?
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // D?
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // E?
+ 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 1, 1, // F?
+};
+
+int utf_ptr2char(const char_u *const p)
+{
+ if (p[0] < 0x80) { // Be quick for ASCII.
+ return p[0];
+ }
+
+ const uint8_t len = utf8len_tab_zero[p[0]];
+ if (len > 1 && (p[1] & 0xc0) == 0x80) {
+ if (len == 2) {
+ return ((p[0] & 0x1f) << 6) + (p[1] & 0x3f);
+ }
+ if ((p[2] & 0xc0) == 0x80) {
+ if (len == 3) {
+ return (((p[0] & 0x0f) << 12) + ((p[1] & 0x3f) << 6)
+ + (p[2] & 0x3f));
+ }
+ if ((p[3] & 0xc0) == 0x80) {
+ if (len == 4) {
+ return (((p[0] & 0x07) << 18) + ((p[1] & 0x3f) << 12)
+ + ((p[2] & 0x3f) << 6) + (p[3] & 0x3f));
+ }
+ if ((p[4] & 0xc0) == 0x80) {
+ if (len == 5) {
+ return (((p[0] & 0x03) << 24) + ((p[1] & 0x3f) << 18)
+ + ((p[2] & 0x3f) << 12) + ((p[3] & 0x3f) << 6)
+ + (p[4] & 0x3f));
+ }
+ if ((p[5] & 0xc0) == 0x80 && len == 6) {
+ return (((p[0] & 0x01) << 30) + ((p[1] & 0x3f) << 24)
+ + ((p[2] & 0x3f) << 18) + ((p[3] & 0x3f) << 12)
+ + ((p[4] & 0x3f) << 6) + (p[5] & 0x3f));
+ }
+ }
+ }
+ }
+ }
+ // Illegal value: just return the first byte.
+ return p[0];
+}
+
+bool utf_composinglike(const char_u *p1, const char_u *p2)
+{
+ return false;
+}
+
+char_u *string_convert(const vimconv_T *conv, char_u *data, size_t *size)
+{
+ return NULL;
+}
+
+int utf_ptr2len_len(const char_u *p, int size)
+{
+ int len;
+ int i;
+ int m;
+
+ len = utf8len_tab[*p];
+ if (len == 1)
+ return 1; /* NUL, ascii or illegal lead byte */
+ if (len > size)
+ m = size; /* incomplete byte sequence. */
+ else
+ m = len;
+ for (i = 1; i < m; ++i)
+ if ((p[i] & 0xc0) != 0x80)
+ return 1;
+ return len;
+}
+
+int utfc_ptr2len_len(const char_u *p, int size)
+{
+ int len;
+ int prevlen;
+
+ if (size < 1 || *p == NUL)
+ return 0;
+ if (p[0] < 0x80 && (size == 1 || p[1] < 0x80)) /* be quick for ASCII */
+ return 1;
+
+ /* Skip over first UTF-8 char, stopping at a NUL byte. */
+ len = utf_ptr2len_len(p, size);
+
+ /* Check for illegal byte and incomplete byte sequence. */
+ if ((len == 1 && p[0] >= 0x80) || len > size)
+ return 1;
+
+ /*
+ * Check for composing characters. We can handle only the first six, but
+ * skip all of them (otherwise the cursor would get stuck).
+ */
+ prevlen = 0;
+ while (len < size) {
+ int len_next_char;
+
+ if (p[len] < 0x80)
+ break;
+
+ /*
+ * Next character length should not go beyond size to ensure that
+ * UTF_COMPOSINGLIKE(...) does not read beyond size.
+ */
+ len_next_char = utf_ptr2len_len(p + len, size - len);
+ if (len_next_char > size - len)
+ break;
+
+ if (!UTF_COMPOSINGLIKE(p + prevlen, p + len))
+ break;
+
+ /* Skip over composing char */
+ prevlen = len;
+ len += len_next_char;
+ }
+ return len;
+}
+
+int utf_char2len(const int c)
+{
+ if (c < 0x80) {
+ return 1;
+ } else if (c < 0x800) {
+ return 2;
+ } else if (c < 0x10000) {
+ return 3;
+ } else if (c < 0x200000) {
+ return 4;
+ } else if (c < 0x4000000) {
+ return 5;
+ } else {
+ return 6;
+ }
+}
+
+int utf_char2bytes(const int c, char_u *const buf)
+{
+ if (c < 0x80) { // 7 bits
+ buf[0] = c;
+ return 1;
+ } else if (c < 0x800) { // 11 bits
+ buf[0] = 0xc0 + ((unsigned)c >> 6);
+ buf[1] = 0x80 + (c & 0x3f);
+ return 2;
+ } else if (c < 0x10000) { // 16 bits
+ buf[0] = 0xe0 + ((unsigned)c >> 12);
+ buf[1] = 0x80 + (((unsigned)c >> 6) & 0x3f);
+ buf[2] = 0x80 + (c & 0x3f);
+ return 3;
+ } else if (c < 0x200000) { // 21 bits
+ buf[0] = 0xf0 + ((unsigned)c >> 18);
+ buf[1] = 0x80 + (((unsigned)c >> 12) & 0x3f);
+ buf[2] = 0x80 + (((unsigned)c >> 6) & 0x3f);
+ buf[3] = 0x80 + (c & 0x3f);
+ return 4;
+ } else if (c < 0x4000000) { // 26 bits
+ buf[0] = 0xf8 + ((unsigned)c >> 24);
+ buf[1] = 0x80 + (((unsigned)c >> 18) & 0x3f);
+ buf[2] = 0x80 + (((unsigned)c >> 12) & 0x3f);
+ buf[3] = 0x80 + (((unsigned)c >> 6) & 0x3f);
+ buf[4] = 0x80 + (c & 0x3f);
+ return 5;
+ } else { // 31 bits
+ buf[0] = 0xfc + ((unsigned)c >> 30);
+ buf[1] = 0x80 + (((unsigned)c >> 24) & 0x3f);
+ buf[2] = 0x80 + (((unsigned)c >> 18) & 0x3f);
+ buf[3] = 0x80 + (((unsigned)c >> 12) & 0x3f);
+ buf[4] = 0x80 + (((unsigned)c >> 6) & 0x3f);
+ buf[5] = 0x80 + (c & 0x3f);
+ return 6;
+ }
+}
+
+int utf_ptr2len(const char_u *const p)
+{
+ if (*p == NUL) {
+ return 0;
+ }
+ const int len = utf8len_tab[*p];
+ for (int i = 1; i < len; i++) {
+ if ((p[i] & 0xc0) != 0x80) {
+ return 1;
+ }
+ }
+ return len;
+}
+
+int utfc_ptr2len(const char_u *const p)
+{
+ uint8_t b0 = (uint8_t)(*p);
+
+ if (b0 == NUL) {
+ return 0;
+ }
+ if (b0 < 0x80 && p[1] < 0x80) { // be quick for ASCII
+ return 1;
+ }
+
+ // Skip over first UTF-8 char, stopping at a NUL byte.
+ int len = utf_ptr2len(p);
+
+ // Check for illegal byte.
+ if (len == 1 && b0 >= 0x80) {
+ return 1;
+ }
+
+ // Check for composing characters. We can handle only the first six, but
+ // skip all of them (otherwise the cursor would get stuck).
+ int prevlen = 0;
+ for (;;) {
+ if (p[len] < 0x80 || !UTF_COMPOSINGLIKE(p + prevlen, p + len)) {
+ return len;
+ }
+
+ // Skip over composing char.
+ prevlen = len;
+ len += utf_ptr2len(p + len);
+ }
+}
+
+void mb_copy_char(const char_u **fp, char_u **tp)
+{
+ const size_t l = utfc_ptr2len(*fp);
+
+ memmove(*tp, *fp, (size_t)l);
+ *tp += l;
+ *fp += l;
+}
diff --git a/test/symbolic/klee/nvim/memory.c b/test/symbolic/klee/nvim/memory.c
new file mode 100644
index 0000000000..df422cea3e
--- /dev/null
+++ b/test/symbolic/klee/nvim/memory.c
@@ -0,0 +1,101 @@
+#include <stdlib.h>
+#include <assert.h>
+
+#include "nvim/lib/ringbuf.h"
+
+enum { RB_SIZE = 1024 };
+
+typedef struct {
+ void *ptr;
+ size_t size;
+} AllocRecord;
+
+RINGBUF_TYPEDEF(AllocRecords, AllocRecord)
+RINGBUF_INIT(AllocRecords, arecs, AllocRecord, RINGBUF_DUMMY_FREE)
+RINGBUF_STATIC(static, AllocRecords, AllocRecord, arecs, RB_SIZE)
+
+size_t allocated_memory = 0;
+size_t ever_allocated_memory = 0;
+
+size_t allocated_memory_limit = SIZE_MAX;
+
+void *xmalloc(const size_t size)
+{
+ void *ret = malloc(size);
+ allocated_memory += size;
+ ever_allocated_memory += size;
+ assert(allocated_memory <= allocated_memory_limit);
+ assert(arecs_rb_length(&arecs) < RB_SIZE);
+ arecs_rb_push(&arecs, (AllocRecord) {
+ .ptr = ret,
+ .size = size,
+ });
+ return ret;
+}
+
+void xfree(void *const p)
+{
+ if (p == NULL) {
+ return;
+ }
+ RINGBUF_FORALL(&arecs, AllocRecord, arec) {
+ if (arec->ptr == p) {
+ allocated_memory -= arec->size;
+ arecs_rb_remove(&arecs, arecs_rb_find_idx(&arecs, arec));
+ return;
+ }
+ }
+ assert(false);
+}
+
+void *xrealloc(void *const p, size_t new_size)
+{
+ void *ret = realloc(p, new_size);
+ RINGBUF_FORALL(&arecs, AllocRecord, arec) {
+ if (arec->ptr == p) {
+ allocated_memory -= arec->size;
+ allocated_memory += new_size;
+ if (new_size > arec->size) {
+ ever_allocated_memory += (new_size - arec->size);
+ }
+ arec->ptr = ret;
+ arec->size = new_size;
+ return ret;
+ }
+ }
+ assert(false);
+ return (void *)(intptr_t)1;
+}
+
+char *xstrdup(const char *str)
+ FUNC_ATTR_MALLOC FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_RET
+ FUNC_ATTR_NONNULL_ALL
+{
+ return xmemdupz(str, strlen(str));
+}
+
+void *xmallocz(size_t size)
+ FUNC_ATTR_MALLOC FUNC_ATTR_NONNULL_RET FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ size_t total_size = size + 1;
+ assert(total_size > size);
+
+ void *ret = xmalloc(total_size);
+ ((char *)ret)[size] = 0;
+
+ return ret;
+}
+
+char *xstpcpy(char *restrict dst, const char *restrict src)
+ FUNC_ATTR_NONNULL_RET FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
+{
+ const size_t len = strlen(src);
+ return (char *)memcpy(dst, src, len + 1) + len;
+}
+
+void *xmemdupz(const void *data, size_t len)
+ FUNC_ATTR_MALLOC FUNC_ATTR_NONNULL_RET FUNC_ATTR_WARN_UNUSED_RESULT
+ FUNC_ATTR_NONNULL_ALL
+{
+ return memcpy(xmallocz(len), data, len);
+}
diff --git a/test/symbolic/klee/run.sh b/test/symbolic/klee/run.sh
new file mode 100755
index 0000000000..0234a935b5
--- /dev/null
+++ b/test/symbolic/klee/run.sh
@@ -0,0 +1,102 @@
+#!/bin/sh
+
+set -e
+set -x
+test -z "$POSH_VERSION" && set -u
+
+PROJECT_SOURCE_DIR=.
+PROJECT_BINARY_DIR="$PROJECT_SOURCE_DIR/build"
+KLEE_TEST_DIR="$PROJECT_SOURCE_DIR/test/symbolic/klee"
+KLEE_BIN_DIR="$PROJECT_BINARY_DIR/klee"
+KLEE_OUT_DIR="$KLEE_BIN_DIR/out"
+
+help() {
+ echo "Usage:"
+ echo
+ echo " $0 -c fname"
+ echo " $0 fname"
+ echo " $0 -s"
+ echo
+ echo "First form compiles executable out of test/symbolic/klee/{fname}.c."
+ echo "Compiled executable is placed into build/klee/{fname}. Must first"
+ echo "successfully compile Neovim in order to generate declarations."
+ echo
+ echo "Second form runs KLEE in a docker container using file "
+ echo "test/symbolic/klee/{fname.c}. Bitcode is placed into build/klee/a.bc,"
+ echo "results are placed into build/klee/out/. The latter is first deleted if"
+ echo "it exists."
+ echo
+ echo "Third form runs ktest-tool which prints errors found by KLEE via "
+ echo "the same container used to run KLEE."
+}
+
+main() {
+ local compile=
+ local print_errs=
+ if test "$1" = "--help" ; then
+ help
+ return
+ fi
+ if test "$1" = "-s" ; then
+ print_errs=1
+ shift
+ elif test "$1" = "-c" ; then
+ compile=1
+ shift
+ fi
+ if test -z "$print_errs" ; then
+ local test="$1" ; shift
+ fi
+
+ local includes=
+ includes="$includes -I$KLEE_TEST_DIR"
+ includes="$includes -I/home/klee/klee_src/include"
+ includes="$includes -I$PROJECT_SOURCE_DIR/src"
+ includes="$includes -I$PROJECT_BINARY_DIR/src/nvim/auto"
+ includes="$includes -I$PROJECT_BINARY_DIR/include"
+ includes="$includes -I$PROJECT_BINARY_DIR/config"
+ includes="$includes -I/host-includes"
+
+ local defines=
+ defines="$defines -DMIN_LOG_LEVEL=9999"
+ defines="$defines -DINCLUDE_GENERATED_DECLARATIONS"
+
+ test -z "$compile" && defines="$defines -DUSE_KLEE"
+
+ test -d "$KLEE_BIN_DIR" || mkdir -p "$KLEE_BIN_DIR"
+
+ if test -z "$compile" ; then
+ local line1='cd /image'
+ if test -z "$print_errs" ; then
+ test -d "$KLEE_OUT_DIR" && rm -r "$KLEE_OUT_DIR"
+
+ line1="$line1 && $(echo clang \
+ $includes $defines \
+ -o "$KLEE_BIN_DIR/a.bc" -emit-llvm -g -c \
+ "$KLEE_TEST_DIR/$test.c")"
+ line1="$line1 && klee --libc=uclibc --posix-runtime "
+ line1="$line1 '--output-dir=$KLEE_OUT_DIR' '$KLEE_BIN_DIR/a.bc'"
+ fi
+ local line2="for t in '$KLEE_OUT_DIR'/*.err"
+ line2="$line2 ; do ktest-tool --write-ints"
+ line2="$line2 \"\$(printf '%s' \"\$t\" | sed -e 's@\\.[^/]*\$@.ktest@')\""
+ line2="$line2 ; done"
+ printf '%s\n%s\n' "$line1" "$line2" | \
+ docker run \
+ --volume "$(cd "$PROJECT_SOURCE_DIR" && pwd)":/image \
+ --volume "/usr/include":/host-includes \
+ --interactive \
+ --rm \
+ --ulimit='stack=-1:-1' \
+ klee/klee \
+ /bin/sh -x
+ else
+ clang \
+ $includes $defines \
+ -o "$KLEE_BIN_DIR/$test" \
+ -O0 -g \
+ "$KLEE_TEST_DIR/$test.c"
+ fi
+}
+
+main "$@"
diff --git a/test/symbolic/klee/viml_expressions_lexer.c b/test/symbolic/klee/viml_expressions_lexer.c
new file mode 100644
index 0000000000..ee7dc312e9
--- /dev/null
+++ b/test/symbolic/klee/viml_expressions_lexer.c
@@ -0,0 +1,105 @@
+#ifdef USE_KLEE
+# include <klee/klee.h>
+#else
+# include <string.h>
+# include <stdio.h>
+#endif
+#include <stddef.h>
+#include <stdint.h>
+#include <assert.h>
+
+#include "nvim/viml/parser/expressions.h"
+#include "nvim/viml/parser/parser.h"
+#include "nvim/mbyte.h"
+
+#include "nvim/memory.c"
+#include "nvim/mbyte.c"
+#include "nvim/charset.c"
+#include "nvim/garray.c"
+#include "nvim/gettext.c"
+#include "nvim/keymap.c"
+#include "nvim/viml/parser/expressions.c"
+
+#define INPUT_SIZE 7
+
+uint8_t avoid_optimizing_out;
+
+void simple_get_line(void *cookie, ParserLine *ret_pline)
+{
+ ParserLine **plines_p = (ParserLine **)cookie;
+ *ret_pline = **plines_p;
+ (*plines_p)++;
+}
+
+int main(const int argc, const char *const *const argv,
+ const char *const *const environ)
+{
+ char input[INPUT_SIZE];
+ uint8_t shift;
+ int flags;
+ avoid_optimizing_out = argc;
+
+#ifndef USE_KLEE
+ sscanf(argv[2], "%d", &flags);
+#endif
+
+#ifdef USE_KLEE
+ klee_make_symbolic(input, sizeof(input), "input");
+ klee_make_symbolic(&shift, sizeof(shift), "shift");
+ klee_make_symbolic(&flags, sizeof(flags), "flags");
+ klee_assume(shift < INPUT_SIZE);
+ klee_assume(flags <= (kELFlagPeek|kELFlagAllowFloat|kELFlagForbidEOC
+ |kELFlagForbidScope|kELFlagIsNotCmp));
+#endif
+
+ ParserLine plines[] = {
+ {
+#ifdef USE_KLEE
+ .data = &input[shift],
+ .size = sizeof(input) - shift,
+#else
+ .data = (const char *)argv[1],
+ .size = strlen(argv[1]),
+#endif
+ .allocated = false,
+ },
+ {
+ .data = NULL,
+ .size = 0,
+ .allocated = false,
+ },
+ };
+#ifdef USE_KLEE
+ assert(plines[0].size <= INPUT_SIZE);
+ assert((plines[0].data[0] != 5) | (plines[0].data[0] != argc));
+#endif
+ ParserLine *cur_pline = &plines[0];
+
+ ParserState pstate = {
+ .reader = {
+ .get_line = simple_get_line,
+ .cookie = &cur_pline,
+ .lines = KV_INITIAL_VALUE,
+ .conv.vc_type = CONV_NONE,
+ },
+ .pos = { 0, 0 },
+ .colors = NULL,
+ .can_continuate = false,
+ };
+ kvi_init(pstate.reader.lines);
+
+ allocated_memory_limit = 0;
+ LexExprToken token = viml_pexpr_next_token(&pstate, flags);
+ if (flags & kELFlagPeek) {
+ assert(pstate.pos.line == 0 && pstate.pos.col == 0);
+ } else {
+ assert((pstate.pos.line == 0)
+ ? (pstate.pos.col > 0)
+ : (pstate.pos.line == 1 && pstate.pos.col == 0));
+ }
+ assert(allocated_memory == 0);
+ assert(ever_allocated_memory == 0);
+#ifndef USE_KLEE
+ fprintf(stderr, "tkn: %s\n", viml_pexpr_repr_token(&pstate, token, NULL));
+#endif
+}
diff --git a/test/symbolic/klee/viml_expressions_parser.c b/test/symbolic/klee/viml_expressions_parser.c
new file mode 100644
index 0000000000..9a876ed3fa
--- /dev/null
+++ b/test/symbolic/klee/viml_expressions_parser.c
@@ -0,0 +1,117 @@
+#ifdef USE_KLEE
+# include <klee/klee.h>
+#else
+# include <string.h>
+#endif
+#include <stddef.h>
+#include <stdint.h>
+#include <assert.h>
+
+#include "nvim/viml/parser/expressions.h"
+#include "nvim/viml/parser/parser.h"
+#include "nvim/mbyte.h"
+
+#include "nvim/memory.c"
+#include "nvim/mbyte.c"
+#include "nvim/charset.c"
+#include "nvim/garray.c"
+#include "nvim/gettext.c"
+#include "nvim/viml/parser/expressions.c"
+#include "nvim/keymap.c"
+
+#define INPUT_SIZE 50
+
+uint8_t avoid_optimizing_out;
+
+void simple_get_line(void *cookie, ParserLine *ret_pline)
+{
+ ParserLine **plines_p = (ParserLine **)cookie;
+ *ret_pline = **plines_p;
+ (*plines_p)++;
+}
+
+int main(const int argc, const char *const *const argv,
+ const char *const *const environ)
+{
+ char input[INPUT_SIZE];
+ uint8_t shift;
+ unsigned flags;
+ const bool peek = false;
+ avoid_optimizing_out = argc;
+
+#ifndef USE_KLEE
+ sscanf(argv[2], "%d", &flags);
+#endif
+
+#ifdef USE_KLEE
+ klee_make_symbolic(input, sizeof(input), "input");
+ klee_make_symbolic(&shift, sizeof(shift), "shift");
+ klee_make_symbolic(&flags, sizeof(flags), "flags");
+ klee_assume(shift < INPUT_SIZE);
+ klee_assume(
+ flags <= (kExprFlagsMulti|kExprFlagsDisallowEOC|kExprFlagsParseLet));
+#endif
+
+ ParserLine plines[] = {
+ {
+#ifdef USE_KLEE
+ .data = &input[shift],
+ .size = sizeof(input) - shift,
+#else
+ .data = argv[1],
+ .size = strlen(argv[1]),
+#endif
+ .allocated = false,
+ },
+ {
+ .data = NULL,
+ .size = 0,
+ .allocated = false,
+ },
+ };
+#ifdef USE_KLEE
+ assert(plines[0].size <= INPUT_SIZE);
+ assert((plines[0].data[0] != 5) | (plines[0].data[0] != argc));
+#endif
+ ParserLine *cur_pline = &plines[0];
+
+ ParserHighlight colors;
+ kvi_init(colors);
+
+ ParserState pstate = {
+ .reader = {
+ .get_line = simple_get_line,
+ .cookie = &cur_pline,
+ .lines = KV_INITIAL_VALUE,
+ .conv.vc_type = CONV_NONE,
+ },
+ .pos = { 0, 0 },
+ .colors = &colors,
+ .can_continuate = false,
+ };
+ kvi_init(pstate.reader.lines);
+
+ const ExprAST ast = viml_pexpr_parse(&pstate, (int)flags);
+ assert(ast.root != NULL || ast.err.msg);
+ if (flags & kExprFlagsParseLet) {
+ assert(ast.err.msg != NULL
+ || ast.root->type == kExprNodeAssignment
+ || (ast.root->type == kExprNodeListLiteral
+ && ast.root->children != NULL)
+ || ast.root->type == kExprNodeComplexIdentifier
+ || ast.root->type == kExprNodeCurlyBracesIdentifier
+ || ast.root->type == kExprNodePlainIdentifier
+ || ast.root->type == kExprNodeRegister
+ || ast.root->type == kExprNodeEnvironment
+ || ast.root->type == kExprNodeOption
+ || ast.root->type == kExprNodeSubscript
+ || ast.root->type == kExprNodeConcatOrSubscript);
+ }
+ // Canโ€™t possibly have more highlight tokens then there are bytes in string.
+ assert(kv_size(colors) <= INPUT_SIZE - shift);
+ kvi_destroy(colors);
+ // Not destroying pstate.reader.lines because there is no way it could exceed
+ // its limits in the current circumstances.
+ viml_pexpr_free_ast(ast);
+ assert(allocated_memory == 0);
+}
diff --git a/test/unit/api/helpers.lua b/test/unit/api/helpers.lua
index 883e1c6c19..4fb1cee4b3 100644
--- a/test/unit/api/helpers.lua
+++ b/test/unit/api/helpers.lua
@@ -1,4 +1,4 @@
-local helpers = require('test.unit.helpers')
+local helpers = require('test.unit.helpers')(nil)
local eval_helpers = require('test.unit.eval.helpers')
local cimport = helpers.cimport
@@ -19,47 +19,55 @@ local api = cimport('./src/nvim/api/private/defs.h',
local obj2lua
-local obj2lua_tab = {
- [tonumber(api.kObjectTypeArray)] = function(obj)
- local ret = {[type_key]=list_type}
- for i = 1,tonumber(obj.data.array.size) do
- ret[i] = obj2lua(obj.data.array.items[i - 1])
- end
- if ret[1] then
- ret[type_key] = nil
- end
- return ret
- end,
- [tonumber(api.kObjectTypeDictionary)] = function(obj)
- local ret = {}
- for i = 1,tonumber(obj.data.dictionary.size) do
- local kv_pair = obj.data.dictionary.items[i - 1]
- ret[ffi.string(kv_pair.key.data, kv_pair.key.size)] = obj2lua(kv_pair.value)
- end
- return ret
- end,
- [tonumber(api.kObjectTypeBoolean)] = function(obj)
- if obj.data.boolean == false then
- return false
- else
- return true
- end
- end,
- [tonumber(api.kObjectTypeNil)] = function(_)
- return nil_value
- end,
- [tonumber(api.kObjectTypeFloat)] = function(obj)
- return tonumber(obj.data.floating)
- end,
- [tonumber(api.kObjectTypeInteger)] = function(obj)
- return {[type_key]=int_type, value=tonumber(obj.data.integer)}
- end,
- [tonumber(api.kObjectTypeString)] = function(obj)
- return ffi.string(obj.data.string.data, obj.data.string.size)
- end,
-}
+local obj2lua_tab = nil
+
+local function init_obj2lua_tab()
+ if obj2lua_tab then
+ return
+ end
+ obj2lua_tab = {
+ [tonumber(api.kObjectTypeArray)] = function(obj)
+ local ret = {[type_key]=list_type}
+ for i = 1,tonumber(obj.data.array.size) do
+ ret[i] = obj2lua(obj.data.array.items[i - 1])
+ end
+ if ret[1] then
+ ret[type_key] = nil
+ end
+ return ret
+ end,
+ [tonumber(api.kObjectTypeDictionary)] = function(obj)
+ local ret = {}
+ for i = 1,tonumber(obj.data.dictionary.size) do
+ local kv_pair = obj.data.dictionary.items[i - 1]
+ ret[ffi.string(kv_pair.key.data, kv_pair.key.size)] = obj2lua(kv_pair.value)
+ end
+ return ret
+ end,
+ [tonumber(api.kObjectTypeBoolean)] = function(obj)
+ if obj.data.boolean == false then
+ return false
+ else
+ return true
+ end
+ end,
+ [tonumber(api.kObjectTypeNil)] = function(_)
+ return nil_value
+ end,
+ [tonumber(api.kObjectTypeFloat)] = function(obj)
+ return tonumber(obj.data.floating)
+ end,
+ [tonumber(api.kObjectTypeInteger)] = function(obj)
+ return {[type_key]=int_type, value=tonumber(obj.data.integer)}
+ end,
+ [tonumber(api.kObjectTypeString)] = function(obj)
+ return ffi.string(obj.data.string.data, obj.data.string.size)
+ end,
+ }
+end
obj2lua = function(obj)
+ init_obj2lua_tab()
return ((obj2lua_tab[tonumber(obj['type'])] or function(obj_inner)
assert(false, 'Converting ' .. tostring(tonumber(obj_inner['type'])) .. ' is not implementing yet')
end)(obj))
@@ -106,7 +114,8 @@ local lua2obj_type_tab = {
api.xmalloc(len * ffi.sizeof('KeyValuePair'))),
}})
for i = 1, len do
- local key, val = table.unpack(kvs[i])
+ local table_unpack = table.unpack or unpack -- luacheck: compat
+ local key, val = table_unpack(kvs[i])
dct.data.dictionary.items[i - 1] = ffi.new(
'KeyValuePair', {key=ffi.gc(lua2obj(key), nil).data.string,
value=ffi.gc(lua2obj(val), nil)})
diff --git a/test/unit/api/private_helpers_spec.lua b/test/unit/api/private_helpers_spec.lua
index 1d7c03787b..a534d83165 100644
--- a/test/unit/api/private_helpers_spec.lua
+++ b/test/unit/api/private_helpers_spec.lua
@@ -1,4 +1,5 @@
-local helpers = require('test.unit.helpers')
+local helpers = require('test.unit.helpers')(after_each)
+local itp = helpers.gen_itp(it)
local eval_helpers = require('test.unit.eval.helpers')
local api_helpers = require('test.unit.api.helpers')
@@ -7,6 +8,7 @@ local NULL = helpers.NULL
local eq = helpers.eq
local lua2typvalt = eval_helpers.lua2typvalt
+local typvalt2lua = eval_helpers.typvalt2lua
local typvalt = eval_helpers.typvalt
local nil_value = api_helpers.nil_value
@@ -14,6 +16,7 @@ local list_type = api_helpers.list_type
local int_type = api_helpers.int_type
local type_key = api_helpers.type_key
local obj2lua = api_helpers.obj2lua
+local func_type = api_helpers.func_type
local api = cimport('./src/nvim/api/private/helpers.h')
@@ -23,7 +26,7 @@ describe('vim_to_object', function()
end
local different_output_test = function(name, input, output)
- it(name, function()
+ itp(name, function()
eq(output, vim_to_object(input))
end)
end
@@ -74,15 +77,30 @@ describe('vim_to_object', function()
different_output_test('outputs nil for nested lists (2 level, in dict)',
lst3, {{lst=nil_value}, true, false, 'ttest'})
- it('outputs empty list for NULL list', function()
+ itp('outputs empty list for NULL list', function()
local tt = typvalt('VAR_LIST', {v_list=NULL})
eq(nil, tt.vval.v_list)
eq({[type_key]=list_type}, obj2lua(api.vim_to_object(tt)))
end)
- it('outputs empty dict for NULL dict', function()
+ itp('outputs empty dict for NULL dict', function()
local tt = typvalt('VAR_DICT', {v_dict=NULL})
eq(nil, tt.vval.v_dict)
eq({}, obj2lua(api.vim_to_object(tt)))
end)
+
+ itp('regression: partials in a list', function()
+ local llist = {
+ {
+ [type_key]=func_type,
+ value='printf',
+ args={'%s'},
+ dict={v=1},
+ },
+ {},
+ }
+ local list = lua2typvalt(llist)
+ eq(llist, typvalt2lua(list))
+ eq({nil_value, {}}, obj2lua(api.vim_to_object(list)))
+ end)
end)
diff --git a/test/unit/buffer_spec.lua b/test/unit/buffer_spec.lua
index 317c9be6e7..bf4e5a0e6d 100644
--- a/test/unit/buffer_spec.lua
+++ b/test/unit/buffer_spec.lua
@@ -1,5 +1,6 @@
-local helpers = require("test.unit.helpers")
+local helpers = require("test.unit.helpers")(after_each)
+local itp = helpers.gen_itp(it)
local to_cstr = helpers.to_cstr
local get_str = helpers.ffi.string
@@ -39,17 +40,17 @@ describe('buffer functions', function()
describe('buf_valid', function()
- it('should view NULL as an invalid buffer', function()
+ itp('should view NULL as an invalid buffer', function()
eq(false, buffer.buf_valid(NULL))
end)
- it('should view an open buffer as valid', function()
+ itp('should view an open buffer as valid', function()
local buf = buflist_new(path1, buffer.BLN_LISTED)
eq(true, buffer.buf_valid(buf))
end)
- it('should view a closed and hidden buffer as valid', function()
+ itp('should view a closed and hidden buffer as valid', function()
local buf = buflist_new(path1, buffer.BLN_LISTED)
close_buffer(NULL, buf, 0, 0)
@@ -57,7 +58,7 @@ describe('buffer functions', function()
eq(true, buffer.buf_valid(buf))
end)
- it('should view a closed and unloaded buffer as valid', function()
+ itp('should view a closed and unloaded buffer as valid', function()
local buf = buflist_new(path1, buffer.BLN_LISTED)
close_buffer(NULL, buf, buffer.DOBUF_UNLOAD, 0)
@@ -65,7 +66,7 @@ describe('buffer functions', function()
eq(true, buffer.buf_valid(buf))
end)
- it('should view a closed and wiped buffer as invalid', function()
+ itp('should view a closed and wiped buffer as invalid', function()
local buf = buflist_new(path1, buffer.BLN_LISTED)
close_buffer(NULL, buf, buffer.DOBUF_WIPE, 0)
@@ -84,36 +85,36 @@ describe('buffer functions', function()
return buffer.buflist_findpat(to_cstr(pat), NULL, allow_unlisted, 0, 0)
end
- it('should find exact matches', function()
+ itp('should find exact matches', function()
local buf = buflist_new(path1, buffer.BLN_LISTED)
- eq(buf.b_fnum, buflist_findpat(path1, ONLY_LISTED))
+ eq(buf.handle, buflist_findpat(path1, ONLY_LISTED))
close_buffer(NULL, buf, buffer.DOBUF_WIPE, 0)
end)
- it('should prefer to match the start of a file path', function()
+ itp('should prefer to match the start of a file path', function()
local buf1 = buflist_new(path1, buffer.BLN_LISTED)
local buf2 = buflist_new(path2, buffer.BLN_LISTED)
local buf3 = buflist_new(path3, buffer.BLN_LISTED)
- eq(buf1.b_fnum, buflist_findpat("test", ONLY_LISTED))
- eq(buf2.b_fnum, buflist_findpat("file", ONLY_LISTED))
- eq(buf3.b_fnum, buflist_findpat("path", ONLY_LISTED))
+ eq(buf1.handle, buflist_findpat("test", ONLY_LISTED))
+ eq(buf2.handle, buflist_findpat("file", ONLY_LISTED))
+ eq(buf3.handle, buflist_findpat("path", ONLY_LISTED))
close_buffer(NULL, buf1, buffer.DOBUF_WIPE, 0)
close_buffer(NULL, buf2, buffer.DOBUF_WIPE, 0)
close_buffer(NULL, buf3, buffer.DOBUF_WIPE, 0)
end)
- it('should prefer to match the end of a file over the middle', function()
+ itp('should prefer to match the end of a file over the middle', function()
--{ Given: Two buffers, where 'test' appears in both
-- And: 'test' appears at the end of buf3 but in the middle of buf2
local buf2 = buflist_new(path2, buffer.BLN_LISTED)
local buf3 = buflist_new(path3, buffer.BLN_LISTED)
-- Then: buf2 is the buffer that is found
- eq(buf2.b_fnum, buflist_findpat("test", ONLY_LISTED))
+ eq(buf2.handle, buflist_findpat("test", ONLY_LISTED))
--}
--{ When: We close buf2
@@ -123,31 +124,31 @@ describe('buffer functions', function()
local buf1 = buflist_new(path1, buffer.BLN_LISTED)
-- Then: buf3 is found since 'file' appears at the end of the name
- eq(buf3.b_fnum, buflist_findpat("file", ONLY_LISTED))
+ eq(buf3.handle, buflist_findpat("file", ONLY_LISTED))
--}
close_buffer(NULL, buf1, buffer.DOBUF_WIPE, 0)
close_buffer(NULL, buf3, buffer.DOBUF_WIPE, 0)
end)
- it('should match a unique fragment of a file path', function()
+ itp('should match a unique fragment of a file path', function()
local buf1 = buflist_new(path1, buffer.BLN_LISTED)
local buf2 = buflist_new(path2, buffer.BLN_LISTED)
local buf3 = buflist_new(path3, buffer.BLN_LISTED)
- eq(buf3.b_fnum, buflist_findpat("_test_", ONLY_LISTED))
+ eq(buf3.handle, buflist_findpat("_test_", ONLY_LISTED))
close_buffer(NULL, buf1, buffer.DOBUF_WIPE, 0)
close_buffer(NULL, buf2, buffer.DOBUF_WIPE, 0)
close_buffer(NULL, buf3, buffer.DOBUF_WIPE, 0)
end)
- it('should include / ignore unlisted buffers based on the flag.', function()
+ itp('should include / ignore unlisted buffers based on the flag.', function()
--{ Given: A buffer
local buf3 = buflist_new(path3, buffer.BLN_LISTED)
-- Then: We should find the buffer when it is given a unique pattern
- eq(buf3.b_fnum, buflist_findpat("_test_", ONLY_LISTED))
+ eq(buf3.handle, buflist_findpat("_test_", ONLY_LISTED))
--}
--{ When: We unlist the buffer
@@ -157,7 +158,7 @@ describe('buffer functions', function()
eq(-1, buflist_findpat("_test_", ONLY_LISTED))
-- And: It should find the buffer when including unlisted buffers
- eq(buf3.b_fnum, buflist_findpat("_test_", ALLOW_UNLISTED))
+ eq(buf3.handle, buflist_findpat("_test_", ALLOW_UNLISTED))
--}
--{ When: We wipe the buffer
@@ -169,13 +170,13 @@ describe('buffer functions', function()
--}
end)
- it('should prefer listed buffers to unlisted buffers.', function()
+ itp('should prefer listed buffers to unlisted buffers.', function()
--{ Given: Two buffers that match a pattern
local buf1 = buflist_new(path1, buffer.BLN_LISTED)
local buf2 = buflist_new(path2, buffer.BLN_LISTED)
-- Then: The first buffer is preferred when both are listed
- eq(buf1.b_fnum, buflist_findpat("test", ONLY_LISTED))
+ eq(buf1.handle, buflist_findpat("test", ONLY_LISTED))
--}
--{ When: The first buffer is unlisted
@@ -183,13 +184,13 @@ describe('buffer functions', function()
-- Then: The second buffer is preferred because
-- unlisted buffers are not allowed
- eq(buf2.b_fnum, buflist_findpat("test", ONLY_LISTED))
+ eq(buf2.handle, buflist_findpat("test", ONLY_LISTED))
--}
--{ When: We allow unlisted buffers
-- Then: The second buffer is still preferred
-- because listed buffers are preferred to unlisted
- eq(buf2.b_fnum, buflist_findpat("test", ALLOW_UNLISTED))
+ eq(buf2.handle, buflist_findpat("test", ALLOW_UNLISTED))
--}
--{ When: We unlist the second buffer
@@ -198,7 +199,7 @@ describe('buffer functions', function()
-- Then: The first buffer is preferred again
-- because buf1 matches better which takes precedence
-- when both buffers have the same listing status.
- eq(buf1.b_fnum, buflist_findpat("test", ALLOW_UNLISTED))
+ eq(buf1.handle, buflist_findpat("test", ALLOW_UNLISTED))
-- And: Neither buffer is returned when ignoring unlisted
eq(-1, buflist_findpat("test", ONLY_LISTED))
@@ -265,7 +266,7 @@ describe('buffer functions', function()
local expected_cell_count = option.expected_cell_count or statusline_cell_count
local expected_byte_length = option.expected_byte_length or expected_cell_count
- it(description, function()
+ itp(description, function()
if option.file_name then
buffer.setfname(globals.curbuf, to_cstr(option.file_name), NULL, 1)
else
@@ -281,6 +282,12 @@ describe('buffer functions', function()
end)
end
+ -- expression testing
+ statusline_test('Should expand expression', 2,
+ '%!expand(20+1)', '21')
+ statusline_test('Should expand broken expression to itself', 11,
+ '%!expand(20+1', 'expand(20+1')
+
-- file name testing
statusline_test('should print no file name', 10,
'%f', '[No Name]',
@@ -305,6 +312,12 @@ describe('buffer functions', function()
statusline_test('should put fillchar `~` in between text', 10,
'abc%=def', 'abc~~~~def',
{fillchar=('~'):byte()})
+ statusline_test('should handle zero-fillchar as a space', 10,
+ 'abcde%=', 'abcde ',
+ {fillchar=0})
+ statusline_test('should handle multibyte-fillchar as a dash', 10,
+ 'abcde%=', 'abcde-----',
+ {fillchar=0x80})
statusline_test('should print the tail file name', 80,
'%t', 'buffer_spec.lua',
{file_name='test/unit/buffer_spec.lua', expected_cell_count=15})
@@ -351,6 +364,8 @@ describe('buffer functions', function()
statusline_test('should truncate at the first `<`', 10,
'abc%<def%<ghijklm', 'abc<hijklm')
+ statusline_test('should ignore trailing %', 3, 'abc%', 'abc')
+
-- alignment testing
statusline_test('should right align when using =', 20,
'neo%=vim', 'neo vim')
@@ -451,5 +466,10 @@ describe('buffer functions', function()
'ฤ„%=mid%=end', 'ฤ„@mid@@end',
{fillchar=('@'):byte(), expected_byte_length=11})
+ -- escaping % testing
+ statusline_test('should handle escape of %', 4, 'abc%%', 'abc%')
+ statusline_test('case where escaped % does not fit', 3, 'abc%%abcabc', '<bc')
+ statusline_test('escaped % is first', 1, '%%', '%')
+
end)
end)
diff --git a/test/unit/charset/vim_str2nr_spec.lua b/test/unit/charset/vim_str2nr_spec.lua
new file mode 100644
index 0000000000..891e6def09
--- /dev/null
+++ b/test/unit/charset/vim_str2nr_spec.lua
@@ -0,0 +1,320 @@
+local helpers = require("test.unit.helpers")(after_each)
+local bit = require('bit')
+
+local itp = helpers.gen_itp(it)
+
+local child_call_once = helpers.child_call_once
+local cimport = helpers.cimport
+local ffi = helpers.ffi
+
+local lib = cimport('./src/nvim/charset.h')
+
+local ARGTYPES
+
+child_call_once(function()
+ ARGTYPES = {
+ num = ffi.typeof('varnumber_T[1]'),
+ unum = ffi.typeof('uvarnumber_T[1]'),
+ pre = ffi.typeof('int[1]'),
+ len = ffi.typeof('int[1]'),
+ }
+end)
+
+local icnt = -42
+local ucnt = 4242
+
+local function arginit(arg)
+ if arg == 'unum' then
+ ucnt = ucnt + 1
+ return ARGTYPES[arg]({ucnt})
+ else
+ icnt = icnt - 1
+ return ARGTYPES[arg]({icnt})
+ end
+end
+
+local function argreset(arg, args)
+ if arg == 'unum' then
+ ucnt = ucnt + 1
+ args[arg][0] = ucnt
+ else
+ icnt = icnt - 1
+ args[arg][0] = icnt
+ end
+end
+
+local function test_vim_str2nr(s, what, exp, maxlen)
+ local bits = {}
+ for k, _ in pairs(exp) do
+ bits[#bits + 1] = k
+ end
+ maxlen = maxlen or #s
+ local args = {}
+ for k, _ in pairs(ARGTYPES) do
+ args[k] = arginit(k)
+ end
+ for case = 0, ((2 ^ (#bits)) - 1) do
+ local cv = {}
+ for b = 0, (#bits - 1) do
+ if bit.band(case, (2 ^ b)) == 0 then
+ local k = bits[b + 1]
+ argreset(k, args)
+ cv[k] = args[k]
+ end
+ end
+ lib.vim_str2nr(s, cv.pre, cv.len, what, cv.num, cv.unum, maxlen)
+ for cck, ccv in pairs(cv) do
+ if exp[cck] ~= tonumber(ccv[0]) then
+ error(('Failed check (%s = %d) in test (s=%s, w=%u, m=%d): %d'):format(
+ cck, exp[cck], s, tonumber(what), maxlen, tonumber(ccv[0])
+ ))
+ end
+ end
+ end
+end
+
+local _itp = itp
+itp = function(...)
+ collectgarbage('restart')
+ _itp(...)
+end
+
+describe('vim_str2nr()', function()
+ itp('works fine when it has nothing to do', function()
+ test_vim_str2nr('', 0, {len = 0, num = 0, unum = 0, pre = 0}, 0)
+ test_vim_str2nr('', lib.STR2NR_ALL, {len = 0, num = 0, unum = 0, pre = 0}, 0)
+ test_vim_str2nr('', lib.STR2NR_BIN, {len = 0, num = 0, unum = 0, pre = 0}, 0)
+ test_vim_str2nr('', lib.STR2NR_OCT, {len = 0, num = 0, unum = 0, pre = 0}, 0)
+ test_vim_str2nr('', lib.STR2NR_HEX, {len = 0, num = 0, unum = 0, pre = 0}, 0)
+ test_vim_str2nr('', lib.STR2NR_FORCE + lib.STR2NR_DEC, {len = 0, num = 0, unum = 0, pre = 0}, 0)
+ test_vim_str2nr('', lib.STR2NR_FORCE + lib.STR2NR_BIN, {len = 0, num = 0, unum = 0, pre = 0}, 0)
+ test_vim_str2nr('', lib.STR2NR_FORCE + lib.STR2NR_OCT, {len = 0, num = 0, unum = 0, pre = 0}, 0)
+ test_vim_str2nr('', lib.STR2NR_FORCE + lib.STR2NR_HEX, {len = 0, num = 0, unum = 0, pre = 0}, 0)
+ end)
+ itp('works with decimal numbers', function()
+ for _, flags in ipairs({
+ 0,
+ lib.STR2NR_BIN,
+ lib.STR2NR_OCT,
+ lib.STR2NR_HEX,
+ lib.STR2NR_BIN + lib.STR2NR_OCT,
+ lib.STR2NR_BIN + lib.STR2NR_HEX,
+ lib.STR2NR_OCT + lib.STR2NR_HEX,
+ lib.STR2NR_ALL,
+ lib.STR2NR_FORCE + lib.STR2NR_DEC,
+ }) do
+ -- Check that all digits are recognized
+ test_vim_str2nr( '12345', flags, {len = 5, num = 12345, unum = 12345, pre = 0}, 0)
+ test_vim_str2nr( '67890', flags, {len = 5, num = 67890, unum = 67890, pre = 0}, 0)
+ test_vim_str2nr( '12345A', flags, {len = 5, num = 12345, unum = 12345, pre = 0}, 0)
+ test_vim_str2nr( '67890A', flags, {len = 5, num = 67890, unum = 67890, pre = 0}, 0)
+
+ test_vim_str2nr( '42', flags, {len = 2, num = 42, unum = 42, pre = 0}, 0)
+ test_vim_str2nr( '42', flags, {len = 1, num = 4, unum = 4, pre = 0}, 1)
+ test_vim_str2nr( '42', flags, {len = 2, num = 42, unum = 42, pre = 0}, 2)
+ test_vim_str2nr( '42', flags, {len = 2, num = 42, unum = 42, pre = 0}, 3) -- includes NUL byte in maxlen
+
+ test_vim_str2nr( '42x', flags, {len = 2, num = 42, unum = 42, pre = 0}, 0)
+ test_vim_str2nr( '42x', flags, {len = 2, num = 42, unum = 42, pre = 0}, 3)
+
+ test_vim_str2nr('-42', flags, {len = 3, num = -42, unum = 42, pre = 0}, 3)
+ test_vim_str2nr('-42', flags, {len = 1, num = 0, unum = 0, pre = 0}, 1)
+
+ test_vim_str2nr('-42x', flags, {len = 3, num = -42, unum = 42, pre = 0}, 0)
+ test_vim_str2nr('-42x', flags, {len = 3, num = -42, unum = 42, pre = 0}, 4)
+ end
+ end)
+ itp('works with binary numbers', function()
+ for _, flags in ipairs({
+ lib.STR2NR_BIN,
+ lib.STR2NR_BIN + lib.STR2NR_OCT,
+ lib.STR2NR_BIN + lib.STR2NR_HEX,
+ lib.STR2NR_ALL,
+ lib.STR2NR_FORCE + lib.STR2NR_BIN,
+ }) do
+ local bin
+ local BIN
+ if flags > lib.STR2NR_FORCE then
+ bin = 0
+ BIN = 0
+ else
+ bin = ('b'):byte()
+ BIN = ('B'):byte()
+ end
+
+ test_vim_str2nr( '0b101', flags, {len = 5, num = 5, unum = 5, pre = bin}, 0)
+ test_vim_str2nr( '0b101', flags, {len = 1, num = 0, unum = 0, pre = 0 }, 1)
+ test_vim_str2nr( '0b101', flags, {len = 1, num = 0, unum = 0, pre = 0 }, 2)
+ test_vim_str2nr( '0b101', flags, {len = 3, num = 1, unum = 1, pre = bin}, 3)
+ test_vim_str2nr( '0b101', flags, {len = 4, num = 2, unum = 2, pre = bin}, 4)
+ test_vim_str2nr( '0b101', flags, {len = 5, num = 5, unum = 5, pre = bin}, 5)
+ test_vim_str2nr( '0b101', flags, {len = 5, num = 5, unum = 5, pre = bin}, 6)
+
+ test_vim_str2nr( '0b1012', flags, {len = 5, num = 5, unum = 5, pre = bin}, 0)
+ test_vim_str2nr( '0b1012', flags, {len = 5, num = 5, unum = 5, pre = bin}, 6)
+
+ test_vim_str2nr('-0b101', flags, {len = 6, num = -5, unum = 5, pre = bin}, 0)
+ test_vim_str2nr('-0b101', flags, {len = 1, num = 0, unum = 0, pre = 0 }, 1)
+ test_vim_str2nr('-0b101', flags, {len = 2, num = 0, unum = 0, pre = 0 }, 2)
+ test_vim_str2nr('-0b101', flags, {len = 2, num = 0, unum = 0, pre = 0 }, 3)
+ test_vim_str2nr('-0b101', flags, {len = 4, num = -1, unum = 1, pre = bin}, 4)
+ test_vim_str2nr('-0b101', flags, {len = 5, num = -2, unum = 2, pre = bin}, 5)
+ test_vim_str2nr('-0b101', flags, {len = 6, num = -5, unum = 5, pre = bin}, 6)
+ test_vim_str2nr('-0b101', flags, {len = 6, num = -5, unum = 5, pre = bin}, 7)
+
+ test_vim_str2nr('-0b1012', flags, {len = 6, num = -5, unum = 5, pre = bin}, 0)
+ test_vim_str2nr('-0b1012', flags, {len = 6, num = -5, unum = 5, pre = bin}, 7)
+
+ test_vim_str2nr( '0B101', flags, {len = 5, num = 5, unum = 5, pre = BIN}, 0)
+ test_vim_str2nr( '0B101', flags, {len = 1, num = 0, unum = 0, pre = 0 }, 1)
+ test_vim_str2nr( '0B101', flags, {len = 1, num = 0, unum = 0, pre = 0 }, 2)
+ test_vim_str2nr( '0B101', flags, {len = 3, num = 1, unum = 1, pre = BIN}, 3)
+ test_vim_str2nr( '0B101', flags, {len = 4, num = 2, unum = 2, pre = BIN}, 4)
+ test_vim_str2nr( '0B101', flags, {len = 5, num = 5, unum = 5, pre = BIN}, 5)
+ test_vim_str2nr( '0B101', flags, {len = 5, num = 5, unum = 5, pre = BIN}, 6)
+
+ test_vim_str2nr( '0B1012', flags, {len = 5, num = 5, unum = 5, pre = BIN}, 0)
+ test_vim_str2nr( '0B1012', flags, {len = 5, num = 5, unum = 5, pre = BIN}, 6)
+
+ test_vim_str2nr('-0B101', flags, {len = 6, num = -5, unum = 5, pre = BIN}, 0)
+ test_vim_str2nr('-0B101', flags, {len = 1, num = 0, unum = 0, pre = 0 }, 1)
+ test_vim_str2nr('-0B101', flags, {len = 2, num = 0, unum = 0, pre = 0 }, 2)
+ test_vim_str2nr('-0B101', flags, {len = 2, num = 0, unum = 0, pre = 0 }, 3)
+ test_vim_str2nr('-0B101', flags, {len = 4, num = -1, unum = 1, pre = BIN}, 4)
+ test_vim_str2nr('-0B101', flags, {len = 5, num = -2, unum = 2, pre = BIN}, 5)
+ test_vim_str2nr('-0B101', flags, {len = 6, num = -5, unum = 5, pre = BIN}, 6)
+ test_vim_str2nr('-0B101', flags, {len = 6, num = -5, unum = 5, pre = BIN}, 7)
+
+ test_vim_str2nr('-0B1012', flags, {len = 6, num = -5, unum = 5, pre = BIN}, 0)
+ test_vim_str2nr('-0B1012', flags, {len = 6, num = -5, unum = 5, pre = BIN}, 7)
+
+ if flags > lib.STR2NR_FORCE then
+ test_vim_str2nr('-101', flags, {len = 4, num = -5, unum = 5, pre = 0}, 0)
+ end
+ end
+ end)
+ itp('works with octal numbers', function()
+ for _, flags in ipairs({
+ lib.STR2NR_OCT,
+ lib.STR2NR_OCT + lib.STR2NR_BIN,
+ lib.STR2NR_OCT + lib.STR2NR_HEX,
+ lib.STR2NR_ALL,
+ lib.STR2NR_FORCE + lib.STR2NR_OCT,
+ }) do
+ local oct
+ if flags > lib.STR2NR_FORCE then
+ oct = 0
+ else
+ oct = ('0'):byte()
+ end
+
+ -- Check that all digits are recognized
+ test_vim_str2nr( '012345670', flags, {len = 9, num = 2739128, unum = 2739128, pre = oct}, 0)
+
+ test_vim_str2nr( '054', flags, {len = 3, num = 44, unum = 44, pre = oct}, 0)
+ test_vim_str2nr( '054', flags, {len = 1, num = 0, unum = 0, pre = 0 }, 1)
+ test_vim_str2nr( '054', flags, {len = 2, num = 5, unum = 5, pre = oct}, 2)
+ test_vim_str2nr( '054', flags, {len = 3, num = 44, unum = 44, pre = oct}, 3)
+ test_vim_str2nr( '0548', flags, {len = 3, num = 44, unum = 44, pre = oct}, 3)
+ test_vim_str2nr( '054', flags, {len = 3, num = 44, unum = 44, pre = oct}, 4)
+
+ test_vim_str2nr( '054x', flags, {len = 3, num = 44, unum = 44, pre = oct}, 4)
+ test_vim_str2nr( '054x', flags, {len = 3, num = 44, unum = 44, pre = oct}, 0)
+
+ test_vim_str2nr('-054', flags, {len = 4, num = -44, unum = 44, pre = oct}, 0)
+ test_vim_str2nr('-054', flags, {len = 1, num = 0, unum = 0, pre = 0 }, 1)
+ test_vim_str2nr('-054', flags, {len = 2, num = 0, unum = 0, pre = 0 }, 2)
+ test_vim_str2nr('-054', flags, {len = 3, num = -5, unum = 5, pre = oct}, 3)
+ test_vim_str2nr('-054', flags, {len = 4, num = -44, unum = 44, pre = oct}, 4)
+ test_vim_str2nr('-0548', flags, {len = 4, num = -44, unum = 44, pre = oct}, 4)
+ test_vim_str2nr('-054', flags, {len = 4, num = -44, unum = 44, pre = oct}, 5)
+
+ test_vim_str2nr('-054x', flags, {len = 4, num = -44, unum = 44, pre = oct}, 5)
+ test_vim_str2nr('-054x', flags, {len = 4, num = -44, unum = 44, pre = oct}, 0)
+
+ if flags > lib.STR2NR_FORCE then
+ test_vim_str2nr('-54', flags, {len = 3, num = -44, unum = 44, pre = 0}, 0)
+ test_vim_str2nr('-0548', flags, {len = 4, num = -44, unum = 44, pre = 0}, 5)
+ test_vim_str2nr('-0548', flags, {len = 4, num = -44, unum = 44, pre = 0}, 0)
+ else
+ test_vim_str2nr('-0548', flags, {len = 5, num = -548, unum = 548, pre = 0}, 5)
+ test_vim_str2nr('-0548', flags, {len = 5, num = -548, unum = 548, pre = 0}, 0)
+ end
+ end
+ end)
+ itp('works with hexadecimal numbers', function()
+ for _, flags in ipairs({
+ lib.STR2NR_HEX,
+ lib.STR2NR_HEX + lib.STR2NR_BIN,
+ lib.STR2NR_HEX + lib.STR2NR_OCT,
+ lib.STR2NR_ALL,
+ lib.STR2NR_FORCE + lib.STR2NR_HEX,
+ }) do
+ local hex
+ local HEX
+ if flags > lib.STR2NR_FORCE then
+ hex = 0
+ HEX = 0
+ else
+ hex = ('x'):byte()
+ HEX = ('X'):byte()
+ end
+
+ -- Check that all digits are recognized
+ test_vim_str2nr('0x12345', flags, {len = 7, num = 74565, unum = 74565, pre = hex}, 0)
+ test_vim_str2nr('0x67890', flags, {len = 7, num = 424080, unum = 424080, pre = hex}, 0)
+ test_vim_str2nr('0xABCDEF', flags, {len = 8, num = 11259375, unum = 11259375, pre = hex}, 0)
+ test_vim_str2nr('0xabcdef', flags, {len = 8, num = 11259375, unum = 11259375, pre = hex}, 0)
+
+ test_vim_str2nr( '0x101', flags, {len = 5, num = 257, unum =257, pre = hex}, 0)
+ test_vim_str2nr( '0x101', flags, {len = 1, num = 0, unum = 0, pre = 0 }, 1)
+ test_vim_str2nr( '0x101', flags, {len = 1, num = 0, unum = 0, pre = 0 }, 2)
+ test_vim_str2nr( '0x101', flags, {len = 3, num = 1, unum = 1, pre = hex}, 3)
+ test_vim_str2nr( '0x101', flags, {len = 4, num = 16, unum = 16, pre = hex}, 4)
+ test_vim_str2nr( '0x101', flags, {len = 5, num = 257, unum =257, pre = hex}, 5)
+ test_vim_str2nr( '0x101', flags, {len = 5, num = 257, unum =257, pre = hex}, 6)
+
+ test_vim_str2nr( '0x101G', flags, {len = 5, num = 257, unum =257, pre = hex}, 0)
+ test_vim_str2nr( '0x101G', flags, {len = 5, num = 257, unum =257, pre = hex}, 6)
+
+ test_vim_str2nr('-0x101', flags, {len = 6, num =-257, unum =257, pre = hex}, 0)
+ test_vim_str2nr('-0x101', flags, {len = 1, num = 0, unum = 0, pre = 0 }, 1)
+ test_vim_str2nr('-0x101', flags, {len = 2, num = 0, unum = 0, pre = 0 }, 2)
+ test_vim_str2nr('-0x101', flags, {len = 2, num = 0, unum = 0, pre = 0 }, 3)
+ test_vim_str2nr('-0x101', flags, {len = 4, num = -1, unum = 1, pre = hex}, 4)
+ test_vim_str2nr('-0x101', flags, {len = 5, num = -16, unum = 16, pre = hex}, 5)
+ test_vim_str2nr('-0x101', flags, {len = 6, num =-257, unum =257, pre = hex}, 6)
+ test_vim_str2nr('-0x101', flags, {len = 6, num =-257, unum =257, pre = hex}, 7)
+
+ test_vim_str2nr('-0x101G', flags, {len = 6, num =-257, unum =257, pre = hex}, 0)
+ test_vim_str2nr('-0x101G', flags, {len = 6, num =-257, unum =257, pre = hex}, 7)
+
+ test_vim_str2nr( '0X101', flags, {len = 5, num = 257, unum =257, pre = HEX}, 0)
+ test_vim_str2nr( '0X101', flags, {len = 1, num = 0, unum = 0, pre = 0 }, 1)
+ test_vim_str2nr( '0X101', flags, {len = 1, num = 0, unum = 0, pre = 0 }, 2)
+ test_vim_str2nr( '0X101', flags, {len = 3, num = 1, unum = 1, pre = HEX}, 3)
+ test_vim_str2nr( '0X101', flags, {len = 4, num = 16, unum = 16, pre = HEX}, 4)
+ test_vim_str2nr( '0X101', flags, {len = 5, num = 257, unum =257, pre = HEX}, 5)
+ test_vim_str2nr( '0X101', flags, {len = 5, num = 257, unum =257, pre = HEX}, 6)
+
+ test_vim_str2nr( '0X101G', flags, {len = 5, num = 257, unum =257, pre = HEX}, 0)
+ test_vim_str2nr( '0X101G', flags, {len = 5, num = 257, unum =257, pre = HEX}, 6)
+
+ test_vim_str2nr('-0X101', flags, {len = 6, num =-257, unum =257, pre = HEX}, 0)
+ test_vim_str2nr('-0X101', flags, {len = 1, num = 0, unum = 0, pre = 0 }, 1)
+ test_vim_str2nr('-0X101', flags, {len = 2, num = 0, unum = 0, pre = 0 }, 2)
+ test_vim_str2nr('-0X101', flags, {len = 2, num = 0, unum = 0, pre = 0 }, 3)
+ test_vim_str2nr('-0X101', flags, {len = 4, num = -1, unum = 1, pre = HEX}, 4)
+ test_vim_str2nr('-0X101', flags, {len = 5, num = -16, unum = 16, pre = HEX}, 5)
+ test_vim_str2nr('-0X101', flags, {len = 6, num =-257, unum =257, pre = HEX}, 6)
+ test_vim_str2nr('-0X101', flags, {len = 6, num =-257, unum =257, pre = HEX}, 7)
+
+ test_vim_str2nr('-0X101G', flags, {len = 6, num =-257, unum =257, pre = HEX}, 0)
+ test_vim_str2nr('-0X101G', flags, {len = 6, num =-257, unum =257, pre = HEX}, 7)
+
+ if flags > lib.STR2NR_FORCE then
+ test_vim_str2nr('-101', flags, {len = 4, num = -257, unum = 257, pre = 0}, 0)
+ end
+ end
+ end)
+end)
diff --git a/test/unit/eval/decode_spec.lua b/test/unit/eval/decode_spec.lua
index d94d809c14..0c444b33f2 100644
--- a/test/unit/eval/decode_spec.lua
+++ b/test/unit/eval/decode_spec.lua
@@ -1,38 +1,24 @@
-local helpers = require('test.unit.helpers')
+local helpers = require('test.unit.helpers')(after_each)
+local itp = helpers.gen_itp(it)
local cimport = helpers.cimport
-local to_cstr = helpers.to_cstr
local eq = helpers.eq
local neq = helpers.neq
local ffi = helpers.ffi
-local decode = cimport('./src/nvim/eval/decode.h', './src/nvim/eval_defs.h',
+local decode = cimport('./src/nvim/eval/decode.h', './src/nvim/eval/typval.h',
'./src/nvim/globals.h', './src/nvim/memory.h',
'./src/nvim/message.h')
describe('json_decode_string()', function()
- local saved_p_enc = nil
-
- before_each(function()
- saved_p_enc = decode.p_enc
- end)
-
- after_each(function()
- decode.emsg_silent = 0
- decode.p_enc = saved_p_enc
- while decode.delete_first_msg() == 1 do
- -- Delete all messages
- end
- end)
-
local char = function(c)
return ffi.gc(decode.xmemdup(c, 1), decode.xfree)
end
- it('does not overflow when running with `nโ€ฆ`, `tโ€ฆ`, `fโ€ฆ`', function()
+ itp('does not overflow when running with `nโ€ฆ`, `tโ€ฆ`, `fโ€ฆ`', function()
local rettv = ffi.new('typval_T', {v_type=decode.VAR_UNKNOWN})
decode.emsg_silent = 1
- -- This will not crash, but if `len` argument will be ignored it will parse
+ -- This will not crash, but if `len` argument will be ignored it will parse
-- `null` as `null` and if not it will parse `null` as `n`.
eq(0, decode.json_decode_string('null', 1, rettv))
eq(decode.VAR_UNKNOWN, rettv.v_type)
@@ -56,7 +42,7 @@ describe('json_decode_string()', function()
eq(decode.VAR_UNKNOWN, rettv.v_type)
end)
- it('does not overflow and crash when running with `n`, `t`, `f`', function()
+ itp('does not overflow and crash when running with `n`, `t`, `f`', function()
local rettv = ffi.new('typval_T', {v_type=decode.VAR_UNKNOWN})
decode.emsg_silent = 1
eq(0, decode.json_decode_string(char('n'), 1, rettv))
@@ -67,7 +53,7 @@ describe('json_decode_string()', function()
eq(decode.VAR_UNKNOWN, rettv.v_type)
end)
- it('does not overflow when running with `"โ€ฆ`', function()
+ itp('does not overflow when running with `"โ€ฆ`', function()
local rettv = ffi.new('typval_T', {v_type=decode.VAR_UNKNOWN})
decode.emsg_silent = 1
eq(0, decode.json_decode_string('"t"', 2, rettv))
@@ -84,7 +70,8 @@ describe('json_decode_string()', function()
eq(msg, ffi.string(decode.last_msg_hist.msg))
end
- it('does not overflow in error messages', function()
+ itp('does not overflow in error messages', function()
+ collectgarbage('restart')
check_failure(']test', 1, 'E474: No container to close: ]')
check_failure('[}test', 2, 'E474: Closing list with curly bracket: }')
check_failure('{]test', 2,
@@ -117,10 +104,6 @@ describe('json_decode_string()', function()
check_failure('"\194"test', 3, 'E474: Only UTF-8 strings allowed: \194"')
check_failure('"\252\144\128\128\128\128"test', 8, 'E474: Only UTF-8 code points up to U+10FFFF are allowed to appear unescaped: \252\144\128\128\128\128"')
check_failure('"test', 1, 'E474: Expected string end: "')
- decode.p_enc = to_cstr('latin1')
- check_failure('"\\uABCD"test', 8,
- 'E474: Failed to convert string "๊ฏ" from UTF-8')
- decode.p_enc = saved_p_enc
check_failure('-test', 1, 'E474: Missing number after minus sign: -')
check_failure('-1.test', 3, 'E474: Missing number after decimal dot: -1.')
check_failure('-1.0etest', 5, 'E474: Missing exponent: -1.0e')
@@ -129,11 +112,11 @@ describe('json_decode_string()', function()
check_failure('[1test', 2, 'E474: Unexpected end of input: [1')
end)
- it('does not overflow with `-`', function()
+ itp('does not overflow with `-`', function()
check_failure('-0', 1, 'E474: Missing number after minus sign: -')
end)
- it('does not overflow and crash when running with `"`', function()
+ itp('does not overflow and crash when running with `"`', function()
local rettv = ffi.new('typval_T', {v_type=decode.VAR_UNKNOWN})
decode.emsg_silent = 1
eq(0, decode.json_decode_string(char('"'), 1, rettv))
diff --git a/test/unit/eval/encode_spec.lua b/test/unit/eval/encode_spec.lua
index 98fc8305e0..058c55093e 100644
--- a/test/unit/eval/encode_spec.lua
+++ b/test/unit/eval/encode_spec.lua
@@ -1,4 +1,5 @@
-local helpers = require('test.unit.helpers')
+local helpers = require('test.unit.helpers')(after_each)
+local itp = helpers.gen_itp(it)
local eval_helpers = require('test.unit.eval.helpers')
local cimport = helpers.cimport
@@ -18,25 +19,25 @@ describe('encode_list_write()', function()
return encode.encode_list_write(l, to_cstr(s), #s)
end
- it('writes empty string', function()
+ itp('writes empty string', function()
local l = list()
eq(0, encode_list_write(l, ''))
eq({[type_key]=list_type}, lst2tbl(l))
end)
- it('writes ASCII string literal with printable characters', function()
+ itp('writes ASCII string literal with printable characters', function()
local l = list()
eq(0, encode_list_write(l, 'abc'))
eq({'abc'}, lst2tbl(l))
end)
- it('writes string starting with NL', function()
+ itp('writes string starting with NL', function()
local l = list()
eq(0, encode_list_write(l, '\nabc'))
eq({null_string, 'abc'}, lst2tbl(l))
end)
- it('writes string starting with NL twice', function()
+ itp('writes string starting with NL twice', function()
local l = list()
eq(0, encode_list_write(l, '\nabc'))
eq({null_string, 'abc'}, lst2tbl(l))
@@ -44,13 +45,13 @@ describe('encode_list_write()', function()
eq({null_string, 'abc', 'abc'}, lst2tbl(l))
end)
- it('writes string ending with NL', function()
+ itp('writes string ending with NL', function()
local l = list()
eq(0, encode_list_write(l, 'abc\n'))
eq({'abc', null_string}, lst2tbl(l))
end)
- it('writes string ending with NL twice', function()
+ itp('writes string ending with NL twice', function()
local l = list()
eq(0, encode_list_write(l, 'abc\n'))
eq({'abc', null_string}, lst2tbl(l))
@@ -58,7 +59,7 @@ describe('encode_list_write()', function()
eq({'abc', 'abc', null_string}, lst2tbl(l))
end)
- it('writes string starting, ending and containing NL twice', function()
+ itp('writes string starting, ending and containing NL twice', function()
local l = list()
eq(0, encode_list_write(l, '\na\nb\n'))
eq({null_string, 'a', 'b', null_string}, lst2tbl(l))
@@ -66,7 +67,7 @@ describe('encode_list_write()', function()
eq({null_string, 'a', 'b', null_string, 'a', 'b', null_string}, lst2tbl(l))
end)
- it('writes string starting, ending and containing NUL with NL between twice', function()
+ itp('writes string starting, ending and containing NUL with NL between twice', function()
local l = list()
eq(0, encode_list_write(l, '\0\n\0\n\0'))
eq({'\n', '\n', '\n'}, lst2tbl(l))
@@ -74,7 +75,7 @@ describe('encode_list_write()', function()
eq({'\n', '\n', '\n\n', '\n', '\n'}, lst2tbl(l))
end)
- it('writes string starting, ending and containing NL with NUL between twice', function()
+ itp('writes string starting, ending and containing NL with NUL between twice', function()
local l = list()
eq(0, encode_list_write(l, '\n\0\n\0\n'))
eq({null_string, '\n', '\n', null_string}, lst2tbl(l))
@@ -82,7 +83,7 @@ describe('encode_list_write()', function()
eq({null_string, '\n', '\n', null_string, '\n', '\n', null_string}, lst2tbl(l))
end)
- it('writes string containing a single NL twice', function()
+ itp('writes string containing a single NL twice', function()
local l = list()
eq(0, encode_list_write(l, '\n'))
eq({null_string, null_string}, lst2tbl(l))
@@ -90,7 +91,7 @@ describe('encode_list_write()', function()
eq({null_string, null_string, null_string}, lst2tbl(l))
end)
- it('writes string containing a few NLs twice', function()
+ itp('writes string containing a few NLs twice', function()
local l = list()
eq(0, encode_list_write(l, '\n\n\n'))
eq({null_string, null_string, null_string, null_string}, lst2tbl(l))
diff --git a/test/unit/eval/helpers.lua b/test/unit/eval/helpers.lua
index 45fbf8da5c..3d1c42c3a0 100644
--- a/test/unit/eval/helpers.lua
+++ b/test/unit/eval/helpers.lua
@@ -1,15 +1,19 @@
-local helpers = require('test.unit.helpers')
+local helpers = require('test.unit.helpers')(nil)
+local ptr2key = helpers.ptr2key
local cimport = helpers.cimport
local to_cstr = helpers.to_cstr
local ffi = helpers.ffi
local eq = helpers.eq
-local eval = cimport('./src/nvim/eval.h', './src/nvim/eval_defs.h')
+local eval = cimport('./src/nvim/eval.h', './src/nvim/eval/typval.h',
+ './src/nvim/hashtab.h', './src/nvim/memory.h')
local null_string = {[true]='NULL string'}
local null_list = {[true]='NULL list'}
+local null_dict = {[true]='NULL dict'}
local type_key = {[true]='type key'}
+local locks_key = {[true]='locks key'}
local list_type = {[true]='list type'}
local dict_type = {[true]='dict type'}
local func_type = {[true]='func type'}
@@ -18,87 +22,206 @@ local flt_type = {[true]='flt type'}
local nil_value = {[true]='nil'}
-local function list(...)
- local ret = ffi.gc(eval.list_alloc(), eval.list_unref)
- eq(0, ret.lv_refcount)
- ret.lv_refcount = 1
- for i = 1, select('#', ...) do
- local val = select(i, ...)
- local typ = type(val)
- if typ == 'string' then
- eval.list_append_string(ret, to_cstr(val))
- elseif typ == 'table' and val == null_string then
- eval.list_append_string(ret, nil)
- elseif typ == 'table' and val == null_list then
- eval.list_append_list(ret, nil)
- elseif typ == 'table' and val[type_key] == list_type then
- local itemlist = ffi.gc(list(table.unpack(val)), nil)
- eq(1, itemlist.lv_refcount)
- itemlist.lv_refcount = 0
- eval.list_append_list(ret, itemlist)
- else
- assert(false, 'Not implemented yet')
+local lua2typvalt
+
+local function tv_list_item_alloc()
+ return ffi.cast('listitem_T*', eval.xmalloc(ffi.sizeof('listitem_T')))
+end
+
+local function tv_list_item_free(li)
+ eval.tv_clear(li.li_tv)
+ eval.xfree(li)
+end
+
+local function li_alloc(nogc)
+ local gcfunc = tv_list_item_free
+ if nogc then gcfunc = nil end
+ local li = ffi.gc(tv_list_item_alloc(), gcfunc)
+ li.li_next = nil
+ li.li_prev = nil
+ li.li_tv = {v_type=eval.VAR_UNKNOWN, v_lock=eval.VAR_UNLOCKED}
+ return li
+end
+
+local function populate_list(l, lua_l, processed)
+ processed = processed or {}
+ eq(0, l.lv_refcount)
+ l.lv_refcount = 1
+ processed[lua_l] = l
+ for i = 1, #lua_l do
+ local item_tv = ffi.gc(lua2typvalt(lua_l[i], processed), nil)
+ local item_li = tv_list_item_alloc()
+ item_li.li_tv = item_tv
+ eval.tv_list_append(l, item_li)
+ end
+ return l
+end
+
+local function populate_dict(d, lua_d, processed)
+ processed = processed or {}
+ eq(0, d.dv_refcount)
+ d.dv_refcount = 1
+ processed[lua_d] = d
+ for k, v in pairs(lua_d) do
+ if type(k) == 'string' then
+ local di = eval.tv_dict_item_alloc(to_cstr(k))
+ local val_tv = ffi.gc(lua2typvalt(v, processed), nil)
+ eval.tv_copy(val_tv, di.di_tv)
+ eval.tv_clear(val_tv)
+ eval.tv_dict_add(d, di)
end
end
- return ret
+ return d
end
-local special_tab = {
- [eval.kSpecialVarFalse] = false,
- [eval.kSpecialVarNull] = nil_value,
- [eval.kSpecialVarTrue] = true,
-}
+local function populate_partial(pt, lua_pt, processed)
+ processed = processed or {}
+ eq(0, pt.pt_refcount)
+ processed[lua_pt] = pt
+ local argv = nil
+ if lua_pt.args and #lua_pt.args > 0 then
+ argv = ffi.gc(ffi.cast('typval_T*', eval.xmalloc(ffi.sizeof('typval_T') * #lua_pt.args)), nil)
+ for i, arg in ipairs(lua_pt.args) do
+ local arg_tv = ffi.gc(lua2typvalt(arg, processed), nil)
+ argv[i - 1] = arg_tv
+ end
+ end
+ local dict = nil
+ if lua_pt.dict then
+ local dict_tv = ffi.gc(lua2typvalt(lua_pt.dict, processed), nil)
+ assert(dict_tv.v_type == eval.VAR_DICT)
+ dict = dict_tv.vval.v_dict
+ end
+ pt.pt_refcount = 1
+ pt.pt_name = eval.xmemdupz(to_cstr(lua_pt.value), #lua_pt.value)
+ pt.pt_auto = not not lua_pt.auto
+ pt.pt_argc = lua_pt.args and #lua_pt.args or 0
+ pt.pt_argv = argv
+ pt.pt_dict = dict
+ return pt
+end
local lst2tbl
local dct2tbl
-local typvalt2lua_tab
+local typvalt2lua
-typvalt2lua_tab = {
- [tonumber(eval.VAR_SPECIAL)] = function(t)
- return special_tab[t.vval.v_special]
- end,
- [tonumber(eval.VAR_NUMBER)] = function(t)
- return {[type_key]=int_type, value=tonumber(t.vval.v_number)}
- end,
- [tonumber(eval.VAR_FLOAT)] = function(t)
- return tonumber(t.vval.v_float)
- end,
- [tonumber(eval.VAR_STRING)] = function(t)
- local str = t.vval.v_string
- if str == nil then
- return null_string
- else
- return ffi.string(str)
+local function partial2lua(pt, processed)
+ processed = processed or {}
+ local value, auto, dict, argv = nil, nil, nil, nil
+ if pt ~= nil then
+ value = ffi.string(pt.pt_name)
+ auto = pt.pt_auto and true or nil
+ argv = {}
+ for i = 1, pt.pt_argc do
+ argv[i] = typvalt2lua(pt.pt_argv[i - 1], processed)
end
- end,
- [tonumber(eval.VAR_LIST)] = function(t)
- return lst2tbl(t.vval.v_list)
- end,
- [tonumber(eval.VAR_DICT)] = function(t)
- return dct2tbl(t.vval.v_dict)
- end,
- [tonumber(eval.VAR_FUNC)] = function(t)
- return {[type_key]=func_type, value=typvalt2lua_tab[eval.VAR_STRING](t)}
- end,
-}
+ if pt.pt_dict ~= nil then
+ dict = dct2tbl(pt.pt_dict)
+ end
+ end
+ return {
+ [type_key]=func_type,
+ value=value,
+ auto=auto,
+ args=argv,
+ dict=dict,
+ }
+end
+
+local typvalt2lua_tab = nil
+
+local function typvalt2lua_tab_init()
+ if typvalt2lua_tab then
+ return
+ end
+ typvalt2lua_tab = {
+ [tonumber(eval.VAR_SPECIAL)] = function(t)
+ return ({
+ [tonumber(eval.kSpecialVarFalse)] = false,
+ [tonumber(eval.kSpecialVarNull)] = nil_value,
+ [tonumber(eval.kSpecialVarTrue)] = true,
+ })[tonumber(t.vval.v_special)]
+ end,
+ [tonumber(eval.VAR_NUMBER)] = function(t)
+ return {[type_key]=int_type, value=tonumber(t.vval.v_number)}
+ end,
+ [tonumber(eval.VAR_FLOAT)] = function(t)
+ return tonumber(t.vval.v_float)
+ end,
+ [tonumber(eval.VAR_STRING)] = function(t)
+ local str = t.vval.v_string
+ if str == nil then
+ return null_string
+ else
+ return ffi.string(str)
+ end
+ end,
+ [tonumber(eval.VAR_LIST)] = function(t, processed)
+ return lst2tbl(t.vval.v_list, processed)
+ end,
+ [tonumber(eval.VAR_DICT)] = function(t, processed)
+ return dct2tbl(t.vval.v_dict, processed)
+ end,
+ [tonumber(eval.VAR_FUNC)] = function(t, processed)
+ return {[type_key]=func_type, value=typvalt2lua_tab[eval.VAR_STRING](t, processed or {})}
+ end,
+ [tonumber(eval.VAR_PARTIAL)] = function(t, processed)
+ local p_key = ptr2key(t)
+ if processed[p_key] then
+ return processed[p_key]
+ end
+ return partial2lua(t.vval.v_partial, processed)
+ end,
+ }
+end
-local typvalt2lua = function(t)
+typvalt2lua = function(t, processed)
+ typvalt2lua_tab_init()
return ((typvalt2lua_tab[tonumber(t.v_type)] or function(t_inner)
assert(false, 'Converting ' .. tonumber(t_inner.v_type) .. ' was not implemented yet')
- end)(t))
+ end)(t, processed or {}))
end
-lst2tbl = function(l)
- local ret = {[type_key]=list_type}
+local function list_iter(l)
+ local init_s = {
+ idx=0,
+ li=l.lv_first,
+ }
+ local function f(s, _)
+ -- (listitem_T *) NULL is equal to nil, but yet it is not false.
+ if s.li == nil then
+ return nil
+ end
+ local ret_li = s.li
+ s.li = s.li.li_next
+ s.idx = s.idx + 1
+ return s.idx, ret_li
+ end
+ return f, init_s, nil
+end
+
+local function list_items(l)
+ local ret = {}
+ for i, li in list_iter(l) do
+ ret[i] = li
+ end
+ return ret
+end
+
+lst2tbl = function(l, processed)
if l == nil then
- return ret
+ return null_list
+ end
+ processed = processed or {}
+ local p_key = ptr2key(l)
+ if processed[p_key] then
+ return processed[p_key]
end
- local li = l.lv_first
- -- (listitem_T *) NULL is equal to nil, but yet it is not false.
- while li ~= nil do
- ret[#ret + 1] = typvalt2lua(li.li_tv)
- li = li.li_next
+ local ret = {[type_key]=list_type}
+ processed[p_key] = ret
+ for i, li in list_iter(l) do
+ ret[i] = typvalt2lua(li.li_tv, processed)
end
if ret[1] then
ret[type_key] = nil
@@ -106,19 +229,75 @@ lst2tbl = function(l)
return ret
end
-dct2tbl = function(d)
- local ret = {d=d}
- assert(false, 'Converting dictionaries is not implemented yet')
+local hi_key_removed = nil
+
+local function dict_iter(d, return_hi)
+ hi_key_removed = hi_key_removed or eval._hash_key_removed()
+ local init_s = {
+ todo=d.dv_hashtab.ht_used,
+ hi=d.dv_hashtab.ht_array,
+ }
+ local function f(s, _)
+ if s.todo == 0 then return nil end
+ while s.todo > 0 do
+ if s.hi.hi_key ~= nil and s.hi.hi_key ~= hi_key_removed then
+ local key = ffi.string(s.hi.hi_key)
+ local ret
+ if return_hi then
+ ret = s.hi
+ else
+ ret = ffi.cast('dictitem_T*',
+ s.hi.hi_key - ffi.offsetof('dictitem_T', 'di_key'))
+ end
+ s.todo = s.todo - 1
+ s.hi = s.hi + 1
+ return key, ret
+ end
+ s.hi = s.hi + 1
+ end
+ end
+ return f, init_s, nil
+end
+
+local function first_di(d)
+ local f, init_s, v = dict_iter(d)
+ return select(2, f(init_s, v))
+end
+
+local function dict_items(d)
+ local ret = {[0]=0}
+ for k, hi in dict_iter(d) do
+ ret[k] = hi
+ ret[0] = ret[0] + 1
+ ret[ret[0]] = hi
+ end
return ret
end
-local lua2typvalt
+dct2tbl = function(d, processed)
+ if d == nil then
+ return null_dict
+ end
+ processed = processed or {}
+ local p_key = ptr2key(d)
+ if processed[p_key] then
+ return processed[p_key]
+ end
+ local ret = {}
+ processed[p_key] = ret
+ for k, di in dict_iter(d) do
+ ret[k] = typvalt2lua(di.di_tv, processed)
+ end
+ return ret
+end
local typvalt = function(typ, vval)
- if type(typ) == 'string' then
+ if typ == nil then
+ typ = eval.VAR_UNKNOWN
+ elseif type(typ) == 'string' then
typ = eval[typ]
end
- return ffi.gc(ffi.new('typval_T', {v_type=typ, vval=vval}), eval.clear_tv)
+ return ffi.gc(ffi.new('typval_T', {v_type=typ, vval=vval}), eval.tv_clear)
end
local lua2typvalt_type_tab = {
@@ -133,43 +312,61 @@ local lua2typvalt_type_tab = {
processed[l].lv_refcount = processed[l].lv_refcount + 1
return typvalt(eval.VAR_LIST, {v_list=processed[l]})
end
- local lst = eval.list_alloc()
- lst.lv_refcount = 1
- processed[l] = lst
- local ret = typvalt(eval.VAR_LIST, {v_list=lst})
- for i = 1, #l do
- local item_tv = ffi.gc(lua2typvalt(l[i], processed), nil)
- eval.list_append_tv(lst, item_tv)
- eval.clear_tv(item_tv)
- end
- return ret
+ local lst = populate_list(eval.tv_list_alloc(#l), l, processed)
+ return typvalt(eval.VAR_LIST, {v_list=lst})
end,
[dict_type] = function(l, processed)
if processed[l] then
processed[l].dv_refcount = processed[l].dv_refcount + 1
return typvalt(eval.VAR_DICT, {v_dict=processed[l]})
end
- local dct = eval.dict_alloc()
- dct.dv_refcount = 1
- processed[l] = dct
- local ret = typvalt(eval.VAR_DICT, {v_dict=dct})
- for k, v in pairs(l) do
- if type(k) == 'string' then
- local di = eval.dictitem_alloc(to_cstr(k))
- local val_tv = ffi.gc(lua2typvalt(v, processed), nil)
- eval.copy_tv(val_tv, di.di_tv)
- eval.clear_tv(val_tv)
- eval.dict_add(dct, di)
- end
+ local dct = populate_dict(eval.tv_dict_alloc(), l, processed)
+ return typvalt(eval.VAR_DICT, {v_dict=dct})
+ end,
+ [func_type] = function(l, processed)
+ if processed[l] then
+ processed[l].pt_refcount = processed[l].pt_refcount + 1
+ return typvalt(eval.VAR_PARTIAL, {v_partial=processed[l]})
+ end
+ if l.args or l.dict then
+ local pt = populate_partial(ffi.gc(ffi.cast('partial_T*',
+ eval.xcalloc(1, ffi.sizeof('partial_T'))), nil), l, processed)
+ return typvalt(eval.VAR_PARTIAL, {v_partial=pt})
+ else
+ return typvalt(eval.VAR_FUNC, {
+ v_string=eval.xmemdupz(to_cstr(l.value), #l.value)
+ })
end
- return ret
end,
}
+local special_vals = nil
+
lua2typvalt = function(l, processed)
+ if not special_vals then
+ special_vals = {
+ [null_string] = {'VAR_STRING', {v_string=ffi.cast('char_u*', nil)}},
+ [null_list] = {'VAR_LIST', {v_list=ffi.cast('list_T*', nil)}},
+ [null_dict] = {'VAR_DICT', {v_dict=ffi.cast('dict_T*', nil)}},
+ [nil_value] = {'VAR_SPECIAL', {v_special=eval.kSpecialVarNull}},
+ [true] = {'VAR_SPECIAL', {v_special=eval.kSpecialVarTrue}},
+ [false] = {'VAR_SPECIAL', {v_special=eval.kSpecialVarFalse}},
+ }
+
+ for k, v in pairs(special_vals) do
+ local tmp = function(typ, vval)
+ special_vals[k] = function()
+ return typvalt(eval[typ], vval)
+ end
+ end
+ tmp(v[1], v[2])
+ end
+ end
processed = processed or {}
if l == nil or l == nil_value then
- return typvalt(eval.VAR_SPECIAL, {v_special=eval.kSpecialVarNull})
+ return special_vals[nil_value]()
+ elseif special_vals[l] then
+ return special_vals[l]()
elseif type(l) == 'table' then
if l[type_key] then
return lua2typvalt_type_tab[l[type_key]](l, processed)
@@ -182,18 +379,148 @@ lua2typvalt = function(l, processed)
end
elseif type(l) == 'number' then
return typvalt(eval.VAR_FLOAT, {v_float=l})
- elseif type(l) == 'boolean' then
- return typvalt(eval.VAR_SPECIAL, {
- v_special=(l and eval.kSpecialVarTrue or eval.kSpecialVarFalse)
- })
elseif type(l) == 'string' then
return typvalt(eval.VAR_STRING, {v_string=eval.xmemdupz(to_cstr(l), #l)})
+ elseif type(l) == 'cdata' then
+ local tv = typvalt(eval.VAR_UNKNOWN)
+ eval.tv_copy(l, tv)
+ return tv
+ end
+end
+
+local void_ptr = ffi.typeof('void *')
+local function void(ptr)
+ return ffi.cast(void_ptr, ptr)
+end
+
+local function alloc_len(len, get_ptr)
+ if type(len) == 'string' or type(len) == 'table' then
+ return #len
+ elseif len == nil then
+ return eval.strlen(get_ptr())
+ else
+ return len
+ end
+end
+
+local alloc_logging_helpers = {
+ list = function(l) return {func='calloc', args={1, ffi.sizeof('list_T')}, ret=void(l)} end,
+ li = function(li) return {func='malloc', args={ffi.sizeof('listitem_T')}, ret=void(li)} end,
+ dict = function(d) return {func='malloc', args={ffi.sizeof('dict_T')}, ret=void(d)} end,
+ di = function(di, size)
+ size = alloc_len(size, function() return di.di_key end)
+ return {func='malloc', args={ffi.offsetof('dictitem_T', 'di_key') + size + 1}, ret=void(di)}
+ end,
+ str = function(s, size)
+ size = alloc_len(size, function() return s end)
+ return {func='malloc', args={size + 1}, ret=void(s)}
+ end,
+
+ dwatcher = function(w) return {func='malloc', args={ffi.sizeof('DictWatcher')}, ret=void(w)} end,
+
+ freed = function(p) return {func='free', args={type(p) == 'table' and p or void(p)}} end,
+
+ -- lua_โ€ฆ: allocated by this file, not by some Neovim function
+ lua_pt = function(pt) return {func='calloc', args={1, ffi.sizeof('partial_T')}, ret=void(pt)} end,
+ lua_tvs = function(argv, argc)
+ argc = alloc_len(argc)
+ return {func='malloc', args={ffi.sizeof('typval_T')*argc}, ret=void(argv)}
+ end,
+}
+
+local function int(n)
+ return {[type_key]=int_type, value=n}
+end
+
+local function list(...)
+ return populate_list(ffi.gc(eval.tv_list_alloc(select('#', ...)),
+ eval.tv_list_unref),
+ {...}, {})
+end
+
+local function dict(d)
+ return populate_dict(ffi.gc(eval.tv_dict_alloc(), eval.tv_dict_free),
+ d or {}, {})
+end
+
+local callback2tbl_type_tab = nil
+
+local function init_callback2tbl_type_tab()
+ if callback2tbl_type_tab then
+ return
+ end
+ callback2tbl_type_tab = {
+ [tonumber(eval.kCallbackNone)] = function(_) return {type='none'} end,
+ [tonumber(eval.kCallbackFuncref)] = function(cb)
+ return {type='fref', fref=ffi.string(cb.data.funcref)}
+ end,
+ [tonumber(eval.kCallbackPartial)] = function(cb)
+ local lua_pt = partial2lua(cb.data.partial)
+ return {type='pt', fref=ffi.string(lua_pt.value), pt=lua_pt}
+ end
+ }
+end
+
+local function callback2tbl(cb)
+ init_callback2tbl_type_tab()
+ return callback2tbl_type_tab[tonumber(cb.type)](cb)
+end
+
+local function tbl2callback(tbl)
+ local ret = nil
+ if tbl.type == 'none' then
+ ret = ffi.new('Callback[1]', {{type=eval.kCallbackNone}})
+ elseif tbl.type == 'fref' then
+ ret = ffi.new('Callback[1]', {{type=eval.kCallbackFuncref,
+ data={funcref=eval.xstrdup(tbl.fref)}}})
+ elseif tbl.type == 'pt' then
+ local pt = ffi.gc(ffi.cast('partial_T*',
+ eval.xcalloc(1, ffi.sizeof('partial_T'))), nil)
+ ret = ffi.new('Callback[1]', {{type=eval.kCallbackPartial,
+ data={partial=populate_partial(pt, tbl.pt, {})}}})
+ else
+ assert(false)
+ end
+ return ffi.gc(ffi.cast('Callback*', ret), helpers.callback_free)
+end
+
+local function dict_watchers(d)
+ local ret = {}
+ local h = d.watchers
+ local q = h.next
+ local qs = {}
+ local key_patterns = {}
+ while q ~= h do
+ local qitem = ffi.cast('DictWatcher *',
+ ffi.cast('char *', q) - ffi.offsetof('DictWatcher', 'node'))
+ ret[#ret + 1] = {
+ cb=callback2tbl(qitem.callback),
+ pat=ffi.string(qitem.key_pattern, qitem.key_pattern_len),
+ busy=qitem.busy,
+ }
+ qs[#qs + 1] = qitem
+ key_patterns[#key_patterns + 1] = {qitem.key_pattern, qitem.key_pattern_len}
+ q = q.next
+ end
+ return ret, qs, key_patterns
+end
+
+local function eval0(expr)
+ local tv = ffi.gc(ffi.new('typval_T', {v_type=eval.VAR_UNKNOWN}),
+ eval.tv_clear)
+ if eval.eval0(to_cstr(expr), tv, nil, true) == 0 then
+ return nil
+ else
+ return tv
end
end
return {
+ int=int,
+
null_string=null_string,
null_list=null_list,
+ null_dict=null_dict,
list_type=list_type,
dict_type=dict_type,
func_type=func_type,
@@ -203,8 +530,10 @@ return {
nil_value=nil_value,
type_key=type_key,
+ locks_key=locks_key,
list=list,
+ dict=dict,
lst2tbl=lst2tbl,
dct2tbl=dct2tbl,
@@ -212,4 +541,24 @@ return {
typvalt2lua=typvalt2lua,
typvalt=typvalt,
+
+ li_alloc=li_alloc,
+ tv_list_item_free=tv_list_item_free,
+
+ dict_iter=dict_iter,
+ list_iter=list_iter,
+ first_di=first_di,
+
+ alloc_logging_helpers=alloc_logging_helpers,
+
+ list_items=list_items,
+ dict_items=dict_items,
+
+ dict_watchers=dict_watchers,
+ tbl2callback=tbl2callback,
+ callback2tbl=callback2tbl,
+
+ eval0=eval0,
+
+ empty_list = {[type_key]=list_type},
}
diff --git a/test/unit/eval/tricks_spec.lua b/test/unit/eval/tricks_spec.lua
index 4c5184995c..7aa0f0f6e6 100644
--- a/test/unit/eval/tricks_spec.lua
+++ b/test/unit/eval/tricks_spec.lua
@@ -1,21 +1,18 @@
-local helpers = require('test.unit.helpers')
+local helpers = require('test.unit.helpers')(after_each)
+local eval_helpers = require('test.unit.eval.helpers')
+
+local itp = helpers.gen_itp(it)
local cimport = helpers.cimport
-local to_cstr = helpers.to_cstr
-local ffi = helpers.ffi
local eq = helpers.eq
-local eval = cimport('./src/nvim/eval.h', './src/nvim/memory.h')
+local eval0 = eval_helpers.eval0
-local eval_expr = function(expr)
- return ffi.gc(eval.eval_expr(to_cstr(expr), nil), function(tv)
- eval.clear_tv(tv)
- eval.xfree(tv)
- end)
-end
+local eval = cimport('./src/nvim/eval.h', './src/nvim/eval/typval.h',
+ './src/nvim/memory.h')
describe('NULL typval_T', function()
- it('is produced by $XXX_UNEXISTENT_VAR_XXX', function()
+ itp('is produced by $XXX_UNEXISTENT_VAR_XXX', function()
-- Required for various tests which need to check whether typval_T with NULL
-- string works correctly. This test checks that unexistent environment
-- variable produces NULL string, not that some specific environment
@@ -24,19 +21,19 @@ describe('NULL typval_T', function()
while os.getenv(unexistent_env) ~= nil do
unexistent_env = unexistent_env .. '_XXX'
end
- local rettv = eval_expr('$' .. unexistent_env)
+ local rettv = eval0('$' .. unexistent_env)
eq(eval.VAR_STRING, rettv.v_type)
eq(nil, rettv.vval.v_string)
end)
- it('is produced by v:_null_list', function()
- local rettv = eval_expr('v:_null_list')
+ itp('is produced by v:_null_list', function()
+ local rettv = eval0('v:_null_list')
eq(eval.VAR_LIST, rettv.v_type)
eq(nil, rettv.vval.v_list)
end)
- it('is produced by v:_null_dict', function()
- local rettv = eval_expr('v:_null_dict')
+ itp('is produced by v:_null_dict', function()
+ local rettv = eval0('v:_null_dict')
eq(eval.VAR_DICT, rettv.v_type)
eq(nil, rettv.vval.v_dict)
end)
diff --git a/test/unit/eval/tv_clear_spec.lua b/test/unit/eval/tv_clear_spec.lua
new file mode 100644
index 0000000000..ca37301b32
--- /dev/null
+++ b/test/unit/eval/tv_clear_spec.lua
@@ -0,0 +1,128 @@
+local helpers = require('test.unit.helpers')(after_each)
+local itp = helpers.gen_itp(it)
+local eval_helpers = require('test.unit.eval.helpers')
+
+local alloc_log_new = helpers.alloc_log_new
+local cimport = helpers.cimport
+local ffi = helpers.ffi
+local eq = helpers.eq
+
+local a = eval_helpers.alloc_logging_helpers
+local type_key = eval_helpers.type_key
+local list_type = eval_helpers.list_type
+local list_items = eval_helpers.list_items
+local dict_items = eval_helpers.dict_items
+local lua2typvalt = eval_helpers.lua2typvalt
+
+local lib = cimport('./src/nvim/eval/typval.h', './src/nvim/eval.h')
+
+local alloc_log = alloc_log_new()
+
+before_each(function()
+ alloc_log:before_each()
+end)
+
+after_each(function()
+ alloc_log:after_each()
+end)
+
+describe('tv_clear()', function()
+ itp('successfully frees all lists in [&l [1], *l, *l]', function()
+ local l_inner = {1}
+ local list = {l_inner, l_inner, l_inner}
+ local list_tv = ffi.gc(lua2typvalt(list), nil)
+ local list_p = list_tv.vval.v_list
+ local lis = list_items(list_p)
+ local list_inner_p = lis[1].li_tv.vval.v_list
+ local lis_inner = list_items(list_inner_p)
+ alloc_log:check({
+ a.list(list_p),
+ a.list(list_inner_p),
+ a.li(lis_inner[1]),
+ a.li(lis[1]),
+ a.li(lis[2]),
+ a.li(lis[3]),
+ })
+ eq(3, list_inner_p.lv_refcount)
+ lib.tv_clear(list_tv)
+ alloc_log:check({
+ a.freed(lis_inner[1]),
+ a.freed(list_inner_p),
+ a.freed(lis[1]),
+ a.freed(lis[2]),
+ a.freed(lis[3]),
+ a.freed(list_p),
+ })
+ end)
+ itp('successfully frees all lists in [&l [], *l, *l]', function()
+ local l_inner = {[type_key]=list_type}
+ local list = {l_inner, l_inner, l_inner}
+ local list_tv = ffi.gc(lua2typvalt(list), nil)
+ local list_p = list_tv.vval.v_list
+ local lis = list_items(list_p)
+ local list_inner_p = lis[1].li_tv.vval.v_list
+ alloc_log:check({
+ a.list(list_p),
+ a.list(list_inner_p),
+ a.li(lis[1]),
+ a.li(lis[2]),
+ a.li(lis[3]),
+ })
+ eq(3, list_inner_p.lv_refcount)
+ lib.tv_clear(list_tv)
+ alloc_log:check({
+ a.freed(list_inner_p),
+ a.freed(lis[1]),
+ a.freed(lis[2]),
+ a.freed(lis[3]),
+ a.freed(list_p),
+ })
+ end)
+ itp('successfully frees all dictionaries in [&d {}, *d]', function()
+ local d_inner = {}
+ local list = {d_inner, d_inner}
+ local list_tv = ffi.gc(lua2typvalt(list), nil)
+ local list_p = list_tv.vval.v_list
+ local lis = list_items(list_p)
+ local dict_inner_p = lis[1].li_tv.vval.v_dict
+ alloc_log:check({
+ a.list(list_p),
+ a.dict(dict_inner_p),
+ a.li(lis[1]),
+ a.li(lis[2]),
+ })
+ eq(2, dict_inner_p.dv_refcount)
+ lib.tv_clear(list_tv)
+ alloc_log:check({
+ a.freed(dict_inner_p),
+ a.freed(lis[1]),
+ a.freed(lis[2]),
+ a.freed(list_p),
+ })
+ end)
+ itp('successfully frees all dictionaries in [&d {a: 1}, *d]', function()
+ local d_inner = {a=1}
+ local list = {d_inner, d_inner}
+ local list_tv = ffi.gc(lua2typvalt(list), nil)
+ local list_p = list_tv.vval.v_list
+ local lis = list_items(list_p)
+ local dict_inner_p = lis[1].li_tv.vval.v_dict
+ local dis = dict_items(dict_inner_p)
+ alloc_log:check({
+ a.list(list_p),
+ a.dict(dict_inner_p),
+ a.di(dis.a, 1),
+ a.li(lis[1]),
+ a.li(lis[2]),
+ })
+ eq(2, dict_inner_p.dv_refcount)
+ lib.tv_clear(list_tv)
+ alloc_log:check({
+ a.freed(dis.a),
+ a.freed(dict_inner_p),
+ a.freed(lis[1]),
+ a.freed(lis[2]),
+ a.freed(list_p),
+ })
+ end)
+end)
diff --git a/test/unit/eval/typval_spec.lua b/test/unit/eval/typval_spec.lua
new file mode 100644
index 0000000000..919a42fbb9
--- /dev/null
+++ b/test/unit/eval/typval_spec.lua
@@ -0,0 +1,3137 @@
+local bit = require('bit')
+local helpers = require('test.unit.helpers')(after_each)
+local eval_helpers = require('test.unit.eval.helpers')
+local global_helpers = require('test.helpers')
+
+local itp = helpers.gen_itp(it)
+
+local OK = helpers.OK
+local eq = helpers.eq
+local neq = helpers.neq
+local ffi = helpers.ffi
+local FAIL = helpers.FAIL
+local NULL = helpers.NULL
+local cimport = helpers.cimport
+local to_cstr = helpers.to_cstr
+local alloc_log_new = helpers.alloc_log_new
+
+local a = eval_helpers.alloc_logging_helpers
+local int = eval_helpers.int
+local list = eval_helpers.list
+local dict = eval_helpers.dict
+local eval0 = eval_helpers.eval0
+local lst2tbl = eval_helpers.lst2tbl
+local dct2tbl = eval_helpers.dct2tbl
+local typvalt = eval_helpers.typvalt
+local type_key = eval_helpers.type_key
+local li_alloc = eval_helpers.li_alloc
+local first_di = eval_helpers.first_di
+local nil_value = eval_helpers.nil_value
+local func_type = eval_helpers.func_type
+local null_list = eval_helpers.null_list
+local null_dict = eval_helpers.null_dict
+local dict_items = eval_helpers.dict_items
+local list_items = eval_helpers.list_items
+local empty_list = eval_helpers.empty_list
+local lua2typvalt = eval_helpers.lua2typvalt
+local typvalt2lua = eval_helpers.typvalt2lua
+local null_string = eval_helpers.null_string
+local callback2tbl = eval_helpers.callback2tbl
+local tbl2callback = eval_helpers.tbl2callback
+local dict_watchers = eval_helpers.dict_watchers
+
+local concat_tables = global_helpers.concat_tables
+local map = global_helpers.map
+
+local lib = cimport('./src/nvim/eval/typval.h', './src/nvim/memory.h',
+ './src/nvim/mbyte.h', './src/nvim/garray.h',
+ './src/nvim/eval.h', './src/nvim/vim.h',
+ './src/nvim/globals.h')
+
+local function vimconv_alloc()
+ return ffi.gc(
+ ffi.cast('vimconv_T*', lib.xcalloc(1, ffi.sizeof('vimconv_T'))),
+ function(vc)
+ lib.convert_setup(vc, nil, nil)
+ lib.xfree(vc)
+ end)
+end
+
+local function list_watch_alloc(li)
+ return ffi.cast('listwatch_T*', ffi.new('listwatch_T[1]', {{lw_item=li}}))
+end
+
+local function list_watch(l, li)
+ local lw = list_watch_alloc(li or l.lv_first)
+ lib.tv_list_watch_add(l, lw)
+ return lw
+end
+
+local function get_alloc_rets(exp_log, res)
+ setmetatable(res, {
+ __index={
+ freed=function(r, n) return {func='free', args={r[n]}} end
+ }
+ })
+ for i = 1,#exp_log do
+ if ({malloc=true, calloc=true})[exp_log[i].func] then
+ res[#res + 1] = exp_log[i].ret
+ end
+ end
+ return exp_log
+end
+
+local alloc_log = alloc_log_new()
+
+before_each(function()
+ alloc_log:before_each()
+end)
+
+after_each(function()
+ alloc_log:after_each()
+end)
+
+local function ga_alloc(itemsize, growsize)
+ local ga = ffi.gc(ffi.cast('garray_T*', ffi.new('garray_T[1]', {})),
+ lib.ga_clear)
+ lib.ga_init(ga, itemsize or 1, growsize or 80)
+ return ga
+end
+
+local function check_emsg(f, msg)
+ local saved_last_msg_hist = lib.last_msg_hist
+ if saved_last_msg_hist == nil then
+ saved_last_msg_hist = nil
+ end
+ local ret = {f()}
+ if msg ~= nil then
+ eq(msg, ffi.string(lib.last_msg_hist.msg))
+ neq(saved_last_msg_hist, lib.last_msg_hist)
+ else
+ if saved_last_msg_hist ~= lib.last_msg_hist then
+ eq(nil, ffi.string(lib.last_msg_hist.msg))
+ else
+ eq(saved_last_msg_hist, lib.last_msg_hist)
+ end
+ end
+ return unpack(ret)
+end
+
+describe('typval.c', function()
+ describe('list', function()
+ describe('item', function()
+ describe('remove()', function()
+ itp('works', function()
+ local l = list(1, 2, 3, 4, 5, 6, 7)
+ neq(nil, l)
+ local lis = list_items(l)
+ alloc_log:check({
+ a.list(l),
+ a.li(lis[1]),
+ a.li(lis[2]),
+ a.li(lis[3]),
+ a.li(lis[4]),
+ a.li(lis[5]),
+ a.li(lis[6]),
+ a.li(lis[7]),
+ })
+
+ eq(lis[2], lib.tv_list_item_remove(l, lis[1]))
+ alloc_log:check({
+ a.freed(table.remove(lis, 1)),
+ })
+ eq(lis, list_items(l))
+
+ eq(lis[7], lib.tv_list_item_remove(l, lis[6]))
+ alloc_log:check({
+ a.freed(table.remove(lis)),
+ })
+ eq(lis, list_items(l))
+
+ eq(lis[4], lib.tv_list_item_remove(l, lis[3]))
+ alloc_log:check({
+ a.freed(table.remove(lis, 3)),
+ })
+ eq(lis, list_items(l))
+ end)
+ itp('also frees the value', function()
+ local l = list('a', 'b', 'c', 'd')
+ neq(nil, l)
+ local lis = list_items(l)
+ alloc_log:check({
+ a.list(l),
+ a.str(lis[1].li_tv.vval.v_string, 1),
+ a.li(lis[1]),
+ a.str(lis[2].li_tv.vval.v_string, 1),
+ a.li(lis[2]),
+ a.str(lis[3].li_tv.vval.v_string, 1),
+ a.li(lis[3]),
+ a.str(lis[4].li_tv.vval.v_string, 1),
+ a.li(lis[4]),
+ })
+ local strings = map(function(li) return li.li_tv.vval.v_string end,
+ lis)
+
+ eq(lis[2], lib.tv_list_item_remove(l, lis[1]))
+ alloc_log:check({
+ a.freed(table.remove(strings, 1)),
+ a.freed(table.remove(lis, 1)),
+ })
+ eq(lis, list_items(l))
+
+ eq(lis[3], lib.tv_list_item_remove(l, lis[2]))
+ alloc_log:check({
+ a.freed(table.remove(strings, 2)),
+ a.freed(table.remove(lis, 2)),
+ })
+ eq(lis, list_items(l))
+
+ eq(nil, lib.tv_list_item_remove(l, lis[2]))
+ alloc_log:check({
+ a.freed(table.remove(strings, 2)),
+ a.freed(table.remove(lis, 2)),
+ })
+ eq(lis, list_items(l))
+ end)
+ itp('works and adjusts watchers correctly', function()
+ local l = ffi.gc(list(1, 2, 3, 4, 5, 6, 7), nil)
+ neq(nil, l)
+ local lis = list_items(l)
+ -- Three watchers: pointing to first, middle and last elements.
+ local lws = {
+ list_watch(l, lis[1]),
+ list_watch(l, lis[4]),
+ list_watch(l, lis[7]),
+ }
+ alloc_log:check({
+ a.list(l),
+ a.li(lis[1]),
+ a.li(lis[2]),
+ a.li(lis[3]),
+ a.li(lis[4]),
+ a.li(lis[5]),
+ a.li(lis[6]),
+ a.li(lis[7]),
+ })
+
+ eq(lis[5], lib.tv_list_item_remove(l, lis[4]))
+ alloc_log:check({a.freed(lis[4])})
+ eq({lis[1], lis[5], lis[7]}, {lws[1].lw_item, lws[2].lw_item, lws[3].lw_item})
+
+ eq(lis[3], lib.tv_list_item_remove(l, lis[2]))
+ alloc_log:check({a.freed(lis[2])})
+ eq({lis[1], lis[5], lis[7]}, {lws[1].lw_item, lws[2].lw_item, lws[3].lw_item})
+
+ eq(nil, lib.tv_list_item_remove(l, lis[7]))
+ alloc_log:check({a.freed(lis[7])})
+ eq({lis[1], lis[5], nil}, {lws[1].lw_item, lws[2].lw_item, lws[3].lw_item == nil and nil})
+
+ eq(lis[3], lib.tv_list_item_remove(l, lis[1]))
+ alloc_log:check({a.freed(lis[1])})
+ eq({lis[3], lis[5], nil}, {lws[1].lw_item, lws[2].lw_item, lws[3].lw_item == nil and nil})
+
+ lib.tv_list_watch_remove(l, lws[2])
+ lib.tv_list_watch_remove(l, lws[3])
+ lib.tv_list_watch_remove(l, lws[1])
+ lib.tv_list_free(l)
+ alloc_log:check({
+ a.freed(lis[3]),
+ a.freed(lis[5]),
+ a.freed(lis[6]),
+ a.freed(l),
+ })
+ end)
+ end)
+ end)
+ describe('watch', function()
+ describe('remove()', function()
+ itp('works', function()
+ local l = ffi.gc(list(1, 2, 3, 4, 5, 6, 7), nil)
+ eq(nil, l.lv_watch)
+ local lw = list_watch(l)
+ neq(nil, l.lv_watch)
+ alloc_log:clear()
+ lib.tv_list_watch_remove(l, lw)
+ eq(nil, l.lv_watch)
+ alloc_log:check({
+ -- Does not free anything.
+ })
+ local lws = { list_watch(l), list_watch(l), list_watch(l) }
+ alloc_log:clear()
+ lib.tv_list_watch_remove(l, lws[2])
+ eq(lws[3], l.lv_watch)
+ eq(lws[1], l.lv_watch.lw_next)
+ lib.tv_list_watch_remove(l, lws[1])
+ eq(lws[3], l.lv_watch)
+ eq(nil, l.lv_watch.lw_next)
+ lib.tv_list_watch_remove(l, lws[3])
+ eq(nil, l.lv_watch)
+ alloc_log:check({
+ -- Does not free anything.
+ })
+ end)
+ itp('ignores not found watchers', function()
+ local l = list(1, 2, 3, 4, 5, 6, 7)
+ local lw = list_watch_alloc()
+ lib.tv_list_watch_remove(l, lw)
+ end)
+ end)
+ end)
+ -- add() and fix() were tested when testing tv_list_item_remove()
+ describe('free()', function()
+ itp('recursively frees list', function()
+ local l1 = ffi.gc(list(1, 'abc'), nil)
+ local l2 = ffi.gc(list({}), nil)
+ local l3 = ffi.gc(list(empty_list), nil)
+ local alloc_rets = {}
+ alloc_log:check(get_alloc_rets({
+ a.list(l1),
+ a.li(l1.lv_first),
+ a.str(l1.lv_last.li_tv.vval.v_string, #('abc')),
+ a.li(l1.lv_last),
+ a.list(l2),
+ a.dict(l2.lv_first.li_tv.vval.v_dict),
+ a.li(l2.lv_first),
+ a.list(l3),
+ a.list(l3.lv_first.li_tv.vval.v_list),
+ a.li(l3.lv_first),
+ }, alloc_rets))
+ lib.tv_list_free(l1)
+ alloc_log:check({
+ alloc_rets:freed(2),
+ alloc_rets:freed(3),
+ alloc_rets:freed(4),
+ alloc_rets:freed(1),
+ })
+ lib.tv_list_free(l2)
+ alloc_log:check({
+ alloc_rets:freed(6),
+ alloc_rets:freed(7),
+ alloc_rets:freed(5),
+ })
+ lib.tv_list_free(l3)
+ alloc_log:check({
+ alloc_rets:freed(9),
+ alloc_rets:freed(10),
+ alloc_rets:freed(8),
+ })
+ end)
+ end)
+ describe('free_list()', function()
+ itp('does not free list contents', function()
+ local l1 = ffi.gc(list(1, 'abc'), nil)
+ local l2 = ffi.gc(list({}), nil)
+ local l3 = ffi.gc(list(empty_list), nil)
+ local alloc_rets = {}
+ alloc_log:check(get_alloc_rets({
+ a.list(l1),
+ a.li(l1.lv_first),
+ a.str(l1.lv_last.li_tv.vval.v_string, #('abc')),
+ a.li(l1.lv_last),
+ a.list(l2),
+ a.dict(l2.lv_first.li_tv.vval.v_dict),
+ a.li(l2.lv_first),
+ a.list(l3),
+ a.list(l3.lv_first.li_tv.vval.v_list),
+ a.li(l3.lv_first),
+ }, alloc_rets))
+ lib.tv_list_free_list(l1)
+ alloc_log:check({
+ alloc_rets:freed(1),
+ })
+ lib.tv_list_free_list(l2)
+ alloc_log:check({
+ alloc_rets:freed(5),
+ })
+ lib.tv_list_free_list(l3)
+ alloc_log:check({
+ alloc_rets:freed(8),
+ })
+ end)
+ end)
+ describe('free_contents()', function()
+ itp('recursively frees list, except for the list structure itself',
+ function()
+ local l1 = ffi.gc(list(1, 'abc'), nil)
+ local l2 = ffi.gc(list({}), nil)
+ local l3 = ffi.gc(list(empty_list), nil)
+ local alloc_rets = {}
+ alloc_log:check(get_alloc_rets({
+ a.list(l1),
+ a.li(l1.lv_first),
+ a.str(l1.lv_last.li_tv.vval.v_string, #('abc')),
+ a.li(l1.lv_last),
+ a.list(l2),
+ a.dict(l2.lv_first.li_tv.vval.v_dict),
+ a.li(l2.lv_first),
+ a.list(l3),
+ a.list(l3.lv_first.li_tv.vval.v_list),
+ a.li(l3.lv_first),
+ }, alloc_rets))
+ lib.tv_list_free_contents(l1)
+ alloc_log:check({
+ alloc_rets:freed(2),
+ alloc_rets:freed(3),
+ alloc_rets:freed(4),
+ })
+ lib.tv_list_free_contents(l2)
+ alloc_log:check({
+ alloc_rets:freed(6),
+ alloc_rets:freed(7),
+ })
+ lib.tv_list_free_contents(l3)
+ alloc_log:check({
+ alloc_rets:freed(9),
+ alloc_rets:freed(10),
+ })
+ end)
+ end)
+ describe('unref()', function()
+ itp('recursively frees list when reference count goes to 0', function()
+ local l = ffi.gc(list(empty_list), nil)
+ local alloc_rets = {}
+ alloc_log:check(get_alloc_rets({
+ a.list(l),
+ a.list(l.lv_first.li_tv.vval.v_list),
+ a.li(l.lv_first),
+ }, alloc_rets))
+ l.lv_refcount = 2
+ lib.tv_list_unref(l)
+ alloc_log:check({})
+ lib.tv_list_unref(l)
+ alloc_log:check({
+ alloc_rets:freed(2),
+ alloc_rets:freed(3),
+ alloc_rets:freed(1),
+ })
+ end)
+ end)
+ describe('drop_items()', function()
+ itp('works', function()
+ local l_tv = lua2typvalt({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13})
+ local l = l_tv.vval.v_list
+ local lis = list_items(l)
+ -- Three watchers: pointing to first, middle and last elements.
+ local lws = {
+ list_watch(l, lis[1]),
+ list_watch(l, lis[7]),
+ list_watch(l, lis[13]),
+ }
+ alloc_log:clear()
+
+ lib.tv_list_drop_items(l, lis[1], lis[3])
+ eq({4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, typvalt2lua(l_tv))
+ eq({lis[4], lis[7], lis[13]}, {lws[1].lw_item, lws[2].lw_item, lws[3].lw_item})
+
+ lib.tv_list_drop_items(l, lis[11], lis[13])
+ eq({4, 5, 6, 7, 8, 9, 10}, typvalt2lua(l_tv))
+ eq({lis[4], lis[7], nil}, {lws[1].lw_item, lws[2].lw_item, lws[3].lw_item == nil and nil})
+
+ lib.tv_list_drop_items(l, lis[6], lis[8])
+ eq({4, 5, 9, 10}, typvalt2lua(l_tv))
+ eq({lis[4], lis[9], nil}, {lws[1].lw_item, lws[2].lw_item, lws[3].lw_item == nil and nil})
+
+ lib.tv_list_drop_items(l, lis[4], lis[10])
+ eq(empty_list, typvalt2lua(l_tv))
+ eq({true, true, true}, {lws[1].lw_item == nil, lws[2].lw_item == nil, lws[3].lw_item == nil})
+
+ lib.tv_list_watch_remove(l, lws[1])
+ lib.tv_list_watch_remove(l, lws[2])
+ lib.tv_list_watch_remove(l, lws[3])
+
+ alloc_log:check({})
+ end)
+ end)
+ describe('remove_items()', function()
+ itp('works', function()
+ local l_tv = lua2typvalt({'1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13'})
+ local l = l_tv.vval.v_list
+ local lis = list_items(l)
+ local strings = map(function(li) return li.li_tv.vval.v_string end, lis)
+ -- Three watchers: pointing to first, middle and last elements.
+ local lws = {
+ list_watch(l, lis[1]),
+ list_watch(l, lis[7]),
+ list_watch(l, lis[13]),
+ }
+ alloc_log:clear()
+
+ lib.tv_list_remove_items(l, lis[1], lis[3])
+ eq({'4', '5', '6', '7', '8', '9', '10', '11', '12', '13'}, typvalt2lua(l_tv))
+ eq({lis[4], lis[7], lis[13]}, {lws[1].lw_item, lws[2].lw_item, lws[3].lw_item})
+ alloc_log:check({
+ a.freed(strings[1]),
+ a.freed(lis[1]),
+ a.freed(strings[2]),
+ a.freed(lis[2]),
+ a.freed(strings[3]),
+ a.freed(lis[3]),
+ })
+
+ lib.tv_list_remove_items(l, lis[11], lis[13])
+ eq({'4', '5', '6', '7', '8', '9', '10'}, typvalt2lua(l_tv))
+ eq({lis[4], lis[7], nil}, {lws[1].lw_item, lws[2].lw_item, lws[3].lw_item == nil and nil})
+ alloc_log:check({
+ a.freed(strings[11]),
+ a.freed(lis[11]),
+ a.freed(strings[12]),
+ a.freed(lis[12]),
+ a.freed(strings[13]),
+ a.freed(lis[13]),
+ })
+
+ lib.tv_list_remove_items(l, lis[6], lis[8])
+ eq({'4', '5', '9', '10'}, typvalt2lua(l_tv))
+ eq({lis[4], lis[9], nil}, {lws[1].lw_item, lws[2].lw_item, lws[3].lw_item == nil and nil})
+ alloc_log:check({
+ a.freed(strings[6]),
+ a.freed(lis[6]),
+ a.freed(strings[7]),
+ a.freed(lis[7]),
+ a.freed(strings[8]),
+ a.freed(lis[8]),
+ })
+
+ lib.tv_list_remove_items(l, lis[4], lis[10])
+ eq(empty_list, typvalt2lua(l_tv))
+ eq({true, true, true}, {lws[1].lw_item == nil, lws[2].lw_item == nil, lws[3].lw_item == nil})
+ alloc_log:check({
+ a.freed(strings[4]),
+ a.freed(lis[4]),
+ a.freed(strings[5]),
+ a.freed(lis[5]),
+ a.freed(strings[9]),
+ a.freed(lis[9]),
+ a.freed(strings[10]),
+ a.freed(lis[10]),
+ })
+
+ lib.tv_list_watch_remove(l, lws[1])
+ lib.tv_list_watch_remove(l, lws[2])
+ lib.tv_list_watch_remove(l, lws[3])
+
+ alloc_log:check({})
+ end)
+ end)
+ describe('insert', function()
+ describe('()', function()
+ itp('works', function()
+ local l_tv = lua2typvalt({1, 2, 3, 4, 5, 6, 7})
+ local l = l_tv.vval.v_list
+ local lis = list_items(l)
+ local li
+
+ li = li_alloc(true)
+ li.li_tv = {v_type=lib.VAR_FLOAT, vval={v_float=100500}}
+ lib.tv_list_insert(l, li, nil)
+ eq(l.lv_last, li)
+ eq({1, 2, 3, 4, 5, 6, 7, 100500}, typvalt2lua(l_tv))
+
+ li = li_alloc(true)
+ li.li_tv = {v_type=lib.VAR_FLOAT, vval={v_float=0}}
+ lib.tv_list_insert(l, li, lis[1])
+ eq(l.lv_first, li)
+ eq({0, 1, 2, 3, 4, 5, 6, 7, 100500}, typvalt2lua(l_tv))
+
+ li = li_alloc(true)
+ li.li_tv = {v_type=lib.VAR_FLOAT, vval={v_float=4.5}}
+ lib.tv_list_insert(l, li, lis[5])
+ eq(list_items(l)[6], li)
+ eq({0, 1, 2, 3, 4, 4.5, 5, 6, 7, 100500}, typvalt2lua(l_tv))
+ end)
+ itp('works with an empty list', function()
+ local l_tv = lua2typvalt(empty_list)
+ local l = l_tv.vval.v_list
+
+ eq(nil, l.lv_first)
+ eq(nil, l.lv_last)
+
+ local li = li_alloc(true)
+ li.li_tv = {v_type=lib.VAR_FLOAT, vval={v_float=100500}}
+ lib.tv_list_insert(l, li, nil)
+ eq(l.lv_last, li)
+ eq({100500}, typvalt2lua(l_tv))
+ end)
+ end)
+ describe('tv()', function()
+ itp('works', function()
+ local l_tv = lua2typvalt(empty_list)
+ local l = l_tv.vval.v_list
+
+ local l_l_tv = lua2typvalt(empty_list)
+ alloc_log:clear()
+ local l_l = l_l_tv.vval.v_list
+ eq(1, l_l.lv_refcount)
+ lib.tv_list_insert_tv(l, l_l_tv, nil)
+ eq(2, l_l.lv_refcount)
+ eq(l_l, l.lv_first.li_tv.vval.v_list)
+ alloc_log:check({
+ a.li(l.lv_first),
+ })
+
+ local l_s_tv = lua2typvalt('test')
+ alloc_log:check({
+ a.str(l_s_tv.vval.v_string, 'test'),
+ })
+ lib.tv_list_insert_tv(l, l_s_tv, l.lv_first)
+ alloc_log:check({
+ a.li(l.lv_first),
+ a.str(l.lv_first.li_tv.vval.v_string, 'test'),
+ })
+
+ eq({'test', empty_list}, typvalt2lua(l_tv))
+ end)
+ end)
+ end)
+ describe('append', function()
+ describe('list()', function()
+ itp('works', function()
+ local l_tv = lua2typvalt(empty_list)
+ local l = l_tv.vval.v_list
+
+ local l_l = list(1)
+ alloc_log:clear()
+ eq(1, l_l.lv_refcount)
+ lib.tv_list_append_list(l, l_l)
+ eq(2, l_l.lv_refcount)
+ eq(l_l, l.lv_first.li_tv.vval.v_list)
+ alloc_log:check({
+ a.li(l.lv_last),
+ })
+
+ lib.tv_list_append_list(l, nil)
+ alloc_log:check({
+ a.li(l.lv_last),
+ })
+
+ eq({{1}, null_list}, typvalt2lua(l_tv))
+ end)
+ end)
+ describe('dict()', function()
+ itp('works', function()
+ local l_tv = lua2typvalt(empty_list)
+ local l = l_tv.vval.v_list
+
+ local l_d_tv = lua2typvalt({test=1})
+ local l_d = l_d_tv.vval.v_dict
+ alloc_log:clear()
+ eq(1, l_d.dv_refcount)
+ lib.tv_list_append_dict(l, l_d)
+ eq(2, l_d.dv_refcount)
+ eq(l_d, l.lv_first.li_tv.vval.v_list)
+ alloc_log:check({
+ a.li(l.lv_last),
+ })
+
+ lib.tv_list_append_dict(l, nil)
+ alloc_log:check({
+ a.li(l.lv_last),
+ })
+
+ eq({{test=1}, null_dict}, typvalt2lua(l_tv))
+ end)
+ end)
+ describe('string()', function()
+ itp('works', function()
+ local l_tv = lua2typvalt(empty_list)
+ local l = l_tv.vval.v_list
+
+ alloc_log:clear()
+ lib.tv_list_append_string(l, 'test', 3)
+ alloc_log:check({
+ a.str(l.lv_last.li_tv.vval.v_string, 'tes'),
+ a.li(l.lv_last),
+ })
+
+ lib.tv_list_append_string(l, nil, 0)
+ alloc_log:check({
+ a.li(l.lv_last),
+ })
+
+ lib.tv_list_append_string(l, nil, -1)
+ alloc_log:check({
+ a.li(l.lv_last),
+ })
+
+ lib.tv_list_append_string(l, 'test', -1)
+ alloc_log:check({
+ a.str(l.lv_last.li_tv.vval.v_string, 'test'),
+ a.li(l.lv_last),
+ })
+
+ eq({'tes', null_string, null_string, 'test'}, typvalt2lua(l_tv))
+ end)
+ end)
+ describe('allocated string()', function()
+ itp('works', function()
+ local l_tv = lua2typvalt(empty_list)
+ local l = l_tv.vval.v_list
+
+ local s = lib.xstrdup('test')
+ alloc_log:clear()
+ lib.tv_list_append_allocated_string(l, s)
+ alloc_log:check({
+ a.li(l.lv_last),
+ })
+
+ lib.tv_list_append_allocated_string(l, nil)
+ alloc_log:check({
+ a.li(l.lv_last),
+ })
+
+ lib.tv_list_append_allocated_string(l, nil)
+ alloc_log:check({
+ a.li(l.lv_last),
+ })
+
+ eq({'test', null_string, null_string}, typvalt2lua(l_tv))
+ end)
+ end)
+ describe('number()', function()
+ itp('works', function()
+ local l_tv = lua2typvalt(empty_list)
+ local l = l_tv.vval.v_list
+
+ alloc_log:clear()
+ lib.tv_list_append_number(l, -100500)
+ alloc_log:check({
+ a.li(l.lv_last),
+ })
+
+ lib.tv_list_append_number(l, 100500)
+ alloc_log:check({
+ a.li(l.lv_last),
+ })
+
+ eq({int(-100500), int(100500)}, typvalt2lua(l_tv))
+ end)
+ end)
+ describe('tv()', function()
+ itp('works', function()
+ local l_tv = lua2typvalt(empty_list)
+ local l = l_tv.vval.v_list
+
+ local l_l_tv = lua2typvalt(empty_list)
+ alloc_log:clear()
+ local l_l = l_l_tv.vval.v_list
+ eq(1, l_l.lv_refcount)
+ lib.tv_list_append_tv(l, l_l_tv)
+ eq(2, l_l.lv_refcount)
+ eq(l_l, l.lv_first.li_tv.vval.v_list)
+ alloc_log:check({
+ a.li(l.lv_first),
+ })
+
+ local l_s_tv = lua2typvalt('test')
+ alloc_log:check({
+ a.str(l_s_tv.vval.v_string, 'test'),
+ })
+ lib.tv_list_append_tv(l, l_s_tv)
+ alloc_log:check({
+ a.li(l.lv_last),
+ a.str(l.lv_last.li_tv.vval.v_string, 'test'),
+ })
+
+ eq({empty_list, 'test'}, typvalt2lua(l_tv))
+ end)
+ end)
+ describe('owned tv()', function()
+ itp('works', function()
+ local l_tv = lua2typvalt(empty_list)
+ local l = l_tv.vval.v_list
+
+ local l_l_tv = lua2typvalt(empty_list)
+ alloc_log:clear()
+ local l_l = l_l_tv.vval.v_list
+ eq(1, l_l.lv_refcount)
+ lib.tv_list_append_owned_tv(l, l_l_tv)
+ eq(1, l_l.lv_refcount)
+ l_l.lv_refcount = l_l.lv_refcount + 1
+ eq(l_l, l.lv_first.li_tv.vval.v_list)
+ alloc_log:check({
+ a.li(l.lv_first),
+ })
+
+ local l_s_tv = ffi.gc(lua2typvalt('test'), nil)
+ alloc_log:check({
+ a.str(l_s_tv.vval.v_string, 'test'),
+ })
+ lib.tv_list_append_owned_tv(l, l_s_tv)
+ eq(l_s_tv.vval.v_string, l.lv_last.li_tv.vval.v_string)
+ l_s_tv.vval.v_string = nil
+ alloc_log:check({
+ a.li(l.lv_last),
+ })
+
+ eq({empty_list, 'test'}, typvalt2lua(l_tv))
+ end)
+ end)
+ end)
+ describe('copy()', function()
+ local function tv_list_copy(...)
+ return ffi.gc(lib.tv_list_copy(...), lib.tv_list_unref)
+ end
+ itp('copies NULL correctly', function()
+ eq(nil, lib.tv_list_copy(nil, nil, true, 0))
+ eq(nil, lib.tv_list_copy(nil, nil, false, 0))
+ eq(nil, lib.tv_list_copy(nil, nil, true, 1))
+ eq(nil, lib.tv_list_copy(nil, nil, false, 1))
+ end)
+ itp('copies list correctly without converting items', function()
+ do
+ local v = {{['ยซ']='ยป'}, {'โ€ž'}, 1, 'โ€œ', null_string, null_list, null_dict}
+ local l_tv = lua2typvalt(v)
+ local l = l_tv.vval.v_list
+ local lis = list_items(l)
+ alloc_log:clear()
+
+ eq(1, lis[1].li_tv.vval.v_dict.dv_refcount)
+ eq(1, lis[2].li_tv.vval.v_list.lv_refcount)
+ local l_copy1 = tv_list_copy(nil, l, false, 0)
+ eq(2, lis[1].li_tv.vval.v_dict.dv_refcount)
+ eq(2, lis[2].li_tv.vval.v_list.lv_refcount)
+ local lis_copy1 = list_items(l_copy1)
+ eq(lis[1].li_tv.vval.v_dict, lis_copy1[1].li_tv.vval.v_dict)
+ eq(lis[2].li_tv.vval.v_list, lis_copy1[2].li_tv.vval.v_list)
+ eq(v, lst2tbl(l_copy1))
+ alloc_log:check({
+ a.list(l_copy1),
+ a.li(lis_copy1[1]),
+ a.li(lis_copy1[2]),
+ a.li(lis_copy1[3]),
+ a.li(lis_copy1[4]),
+ a.str(lis_copy1[4].li_tv.vval.v_string, #v[4]),
+ a.li(lis_copy1[5]),
+ a.li(lis_copy1[6]),
+ a.li(lis_copy1[7]),
+ })
+ lib.tv_list_free(ffi.gc(l_copy1, nil))
+ alloc_log:clear()
+
+ eq(1, lis[1].li_tv.vval.v_dict.dv_refcount)
+ eq(1, lis[2].li_tv.vval.v_list.lv_refcount)
+ local l_deepcopy1 = tv_list_copy(nil, l, true, 0)
+ neq(nil, l_deepcopy1)
+ eq(1, lis[1].li_tv.vval.v_dict.dv_refcount)
+ eq(1, lis[2].li_tv.vval.v_list.lv_refcount)
+ local lis_deepcopy1 = list_items(l_deepcopy1)
+ neq(lis[1].li_tv.vval.v_dict, lis_deepcopy1[1].li_tv.vval.v_dict)
+ neq(lis[2].li_tv.vval.v_list, lis_deepcopy1[2].li_tv.vval.v_list)
+ eq(v, lst2tbl(l_deepcopy1))
+ local di_deepcopy1 = first_di(lis_deepcopy1[1].li_tv.vval.v_dict)
+ alloc_log:check({
+ a.list(l_deepcopy1),
+ a.li(lis_deepcopy1[1]),
+ a.dict(lis_deepcopy1[1].li_tv.vval.v_dict),
+ a.di(di_deepcopy1, #('ยซ')),
+ a.str(di_deepcopy1.di_tv.vval.v_string, #v[1]['ยซ']),
+ a.li(lis_deepcopy1[2]),
+ a.list(lis_deepcopy1[2].li_tv.vval.v_list),
+ a.li(lis_deepcopy1[2].li_tv.vval.v_list.lv_first),
+ a.str(lis_deepcopy1[2].li_tv.vval.v_list.lv_first.li_tv.vval.v_string, #v[2][1]),
+ a.li(lis_deepcopy1[3]),
+ a.li(lis_deepcopy1[4]),
+ a.str(lis_deepcopy1[4].li_tv.vval.v_string, #v[4]),
+ a.li(lis_deepcopy1[5]),
+ a.li(lis_deepcopy1[6]),
+ a.li(lis_deepcopy1[7]),
+ })
+ end
+ collectgarbage()
+ end)
+ itp('copies list correctly and converts items', function()
+ local vc = vimconv_alloc()
+ -- UTF-8 โ†” latin1 conversions needs no iconv
+ eq(OK, lib.convert_setup(vc, to_cstr('utf-8'), to_cstr('latin1')))
+
+ local v = {{['ยซ']='ยป'}, {'โ€ž'}, 1, 'โ€œ', null_string, null_list, null_dict}
+ local l_tv = lua2typvalt(v)
+ local l = l_tv.vval.v_list
+ local lis = list_items(l)
+ alloc_log:clear()
+
+ eq(1, lis[1].li_tv.vval.v_dict.dv_refcount)
+ eq(1, lis[2].li_tv.vval.v_list.lv_refcount)
+ local l_deepcopy1 = tv_list_copy(vc, l, true, 0)
+ neq(nil, l_deepcopy1)
+ eq(1, lis[1].li_tv.vval.v_dict.dv_refcount)
+ eq(1, lis[2].li_tv.vval.v_list.lv_refcount)
+ local lis_deepcopy1 = list_items(l_deepcopy1)
+ neq(lis[1].li_tv.vval.v_dict, lis_deepcopy1[1].li_tv.vval.v_dict)
+ neq(lis[2].li_tv.vval.v_list, lis_deepcopy1[2].li_tv.vval.v_list)
+ eq({{['\171']='\187'}, {'\191'}, 1, '\191', null_string, null_list, null_dict},
+ lst2tbl(l_deepcopy1))
+ local di_deepcopy1 = first_di(lis_deepcopy1[1].li_tv.vval.v_dict)
+ alloc_log:clear_tmp_allocs()
+ alloc_log:check({
+ a.list(l_deepcopy1),
+ a.li(lis_deepcopy1[1]),
+ a.dict(lis_deepcopy1[1].li_tv.vval.v_dict),
+ a.di(di_deepcopy1, 1),
+ a.str(di_deepcopy1.di_tv.vval.v_string, 2),
+ a.li(lis_deepcopy1[2]),
+ a.list(lis_deepcopy1[2].li_tv.vval.v_list),
+ a.li(lis_deepcopy1[2].li_tv.vval.v_list.lv_first),
+ a.str(lis_deepcopy1[2].li_tv.vval.v_list.lv_first.li_tv.vval.v_string, #v[2][1]),
+ a.li(lis_deepcopy1[3]),
+ a.li(lis_deepcopy1[4]),
+ a.str(lis_deepcopy1[4].li_tv.vval.v_string, #v[4]),
+ a.li(lis_deepcopy1[5]),
+ a.li(lis_deepcopy1[6]),
+ a.li(lis_deepcopy1[7]),
+ })
+ end)
+ itp('returns different/same containers with(out) copyID', function()
+ local l_inner_tv = lua2typvalt(empty_list)
+ local l_tv = lua2typvalt({l_inner_tv, l_inner_tv})
+ eq(3, l_inner_tv.vval.v_list.lv_refcount)
+ local l = l_tv.vval.v_list
+ eq(l.lv_first.li_tv.vval.v_list, l.lv_last.li_tv.vval.v_list)
+
+ local l_copy1 = tv_list_copy(nil, l, true, 0)
+ neq(l_copy1.lv_first.li_tv.vval.v_list, l_copy1.lv_last.li_tv.vval.v_list)
+ eq({empty_list, empty_list}, lst2tbl(l_copy1))
+
+ local l_copy2 = tv_list_copy(nil, l, true, 2)
+ eq(l_copy2.lv_first.li_tv.vval.v_list, l_copy2.lv_last.li_tv.vval.v_list)
+ eq({empty_list, empty_list}, lst2tbl(l_copy2))
+
+ eq(3, l_inner_tv.vval.v_list.lv_refcount)
+ end)
+ itp('works with self-referencing list with copyID', function()
+ local l_tv = lua2typvalt(empty_list)
+ local l = l_tv.vval.v_list
+ eq(1, l.lv_refcount)
+ lib.tv_list_append_list(l, l)
+ eq(2, l.lv_refcount)
+
+ local l_copy1 = tv_list_copy(nil, l, true, 2)
+ eq(2, l_copy1.lv_refcount)
+ local v = {}
+ v[1] = v
+ eq(v, lst2tbl(l_copy1))
+
+ local lis = list_items(l)
+ lib.tv_list_item_remove(l, lis[1])
+ eq(1, l.lv_refcount)
+
+ local lis_copy1 = list_items(l_copy1)
+ lib.tv_list_item_remove(l_copy1, lis_copy1[1])
+ eq(1, l_copy1.lv_refcount)
+ end)
+ end)
+ describe('extend()', function()
+ itp('can extend list with itself', function()
+ local l
+
+ l = list(1, {})
+ alloc_log:clear()
+ eq(1, l.lv_refcount)
+ eq(1, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+
+ lib.tv_list_extend(l, l, nil)
+ alloc_log:check({
+ a.li(l.lv_last.li_prev),
+ a.li(l.lv_last),
+ })
+ eq(1, l.lv_refcount)
+ eq(2, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+ eq({1, {}, 1, {}}, lst2tbl(l))
+
+ l = list(1, {})
+ alloc_log:clear()
+ eq(1, l.lv_refcount)
+ eq(1, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+
+ lib.tv_list_extend(l, l, l.lv_last)
+ alloc_log:check({
+ a.li(l.lv_last.li_prev.li_prev),
+ a.li(l.lv_last.li_prev),
+ })
+ eq({1, 1, {}, {}}, lst2tbl(l))
+ eq(1, l.lv_refcount)
+ eq(2, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+
+ l = list(1, {})
+ alloc_log:clear()
+ eq(1, l.lv_refcount)
+ eq(1, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+
+ lib.tv_list_extend(l, l, l.lv_first)
+ alloc_log:check({
+ a.li(l.lv_first),
+ a.li(l.lv_first.li_next),
+ })
+ eq({1, {}, 1, {}}, lst2tbl(l))
+ eq(1, l.lv_refcount)
+ eq(2, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+ end)
+ itp('can extend list with an empty list', function()
+ local l = list(1, {})
+ local el = list()
+ alloc_log:clear()
+ eq(1, l.lv_refcount)
+ eq(1, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+ eq(1, el.lv_refcount)
+
+ lib.tv_list_extend(l, el, nil)
+ alloc_log:check({
+ })
+ eq(1, l.lv_refcount)
+ eq(1, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+ eq(1, el.lv_refcount)
+ eq({1, {}}, lst2tbl(l))
+
+ lib.tv_list_extend(l, el, l.lv_first)
+ alloc_log:check({
+ })
+ eq(1, l.lv_refcount)
+ eq(1, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+ eq(1, el.lv_refcount)
+ eq({1, {}}, lst2tbl(l))
+
+ lib.tv_list_extend(l, el, l.lv_last)
+ alloc_log:check({
+ })
+ eq(1, l.lv_refcount)
+ eq(1, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+ eq(1, el.lv_refcount)
+ eq({1, {}}, lst2tbl(l))
+ end)
+ itp('can extend list with another non-empty list', function()
+ local l
+ local l2 = list(42, empty_list)
+ eq(1, l2.lv_refcount)
+ eq(1, l2.lv_last.li_tv.vval.v_list.lv_refcount)
+
+ l = ffi.gc(list(1, {}), nil)
+ alloc_log:clear()
+ eq(1, l.lv_refcount)
+ eq(1, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+
+ lib.tv_list_extend(l, l2, nil)
+ alloc_log:check({
+ a.li(l.lv_last.li_prev),
+ a.li(l.lv_last),
+ })
+ eq(1, l2.lv_refcount)
+ eq(2, l2.lv_last.li_tv.vval.v_list.lv_refcount)
+ eq({1, {}, 42, empty_list}, lst2tbl(l))
+ lib.tv_list_free(l)
+ eq(1, l2.lv_last.li_tv.vval.v_list.lv_refcount)
+
+ l = ffi.gc(list(1, {}), nil)
+ alloc_log:clear()
+ eq(1, l.lv_refcount)
+ eq(1, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+
+ lib.tv_list_extend(l, l2, l.lv_first)
+ alloc_log:check({
+ a.li(l.lv_first),
+ a.li(l.lv_first.li_next),
+ })
+ eq(1, l2.lv_refcount)
+ eq(2, l2.lv_last.li_tv.vval.v_list.lv_refcount)
+ eq({42, empty_list, 1, {}}, lst2tbl(l))
+ lib.tv_list_free(l)
+ eq(1, l2.lv_last.li_tv.vval.v_list.lv_refcount)
+
+ l = ffi.gc(list(1, {}), nil)
+ alloc_log:clear()
+ eq(1, l.lv_refcount)
+ eq(1, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+
+ lib.tv_list_extend(l, l2, l.lv_last)
+ alloc_log:check({
+ a.li(l.lv_first.li_next),
+ a.li(l.lv_first.li_next.li_next),
+ })
+ eq(1, l2.lv_refcount)
+ eq(2, l2.lv_last.li_tv.vval.v_list.lv_refcount)
+ eq({1, 42, empty_list, {}}, lst2tbl(l))
+ lib.tv_list_free(l)
+ eq(1, l2.lv_last.li_tv.vval.v_list.lv_refcount)
+ end)
+ end)
+ describe('concat()', function()
+ itp('works with NULL lists', function()
+ local l = list(1, {})
+ alloc_log:clear()
+ eq(1, l.lv_refcount)
+ eq(1, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+
+ local rettv1 = typvalt()
+ eq(OK, lib.tv_list_concat(nil, l, rettv1))
+ eq(1, l.lv_refcount)
+ eq(tonumber(lib.VAR_LIST), tonumber(rettv1.v_type))
+ eq({1, {}}, typvalt2lua(rettv1))
+ eq(1, rettv1.vval.v_list.lv_refcount)
+ alloc_log:check({
+ a.list(rettv1.vval.v_list),
+ a.li(rettv1.vval.v_list.lv_first),
+ a.li(rettv1.vval.v_list.lv_last),
+ })
+ eq(2, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+
+ local rettv2 = typvalt()
+ eq(OK, lib.tv_list_concat(l, nil, rettv2))
+ eq(1, l.lv_refcount)
+ eq(tonumber(lib.VAR_LIST), tonumber(rettv2.v_type))
+ eq({1, {}}, typvalt2lua(rettv2))
+ eq(1, rettv2.vval.v_list.lv_refcount)
+ alloc_log:check({
+ a.list(rettv2.vval.v_list),
+ a.li(rettv2.vval.v_list.lv_first),
+ a.li(rettv2.vval.v_list.lv_last),
+ })
+ eq(3, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+
+ local rettv3 = typvalt()
+ eq(OK, lib.tv_list_concat(nil, nil, rettv3))
+ eq(tonumber(lib.VAR_LIST), tonumber(rettv3.v_type))
+ eq(null_list, typvalt2lua(rettv3))
+ alloc_log:check({})
+ end)
+ itp('works with two different lists', function()
+ local l1 = list(1, {})
+ local l2 = list(3, empty_list)
+ eq(1, l1.lv_refcount)
+ eq(1, l1.lv_last.li_tv.vval.v_dict.dv_refcount)
+ eq(1, l2.lv_refcount)
+ eq(1, l2.lv_last.li_tv.vval.v_list.lv_refcount)
+ alloc_log:clear()
+
+ local rettv = typvalt()
+ eq(OK, lib.tv_list_concat(l1, l2, rettv))
+ eq(1, l1.lv_refcount)
+ eq(2, l1.lv_last.li_tv.vval.v_dict.dv_refcount)
+ eq(1, l2.lv_refcount)
+ eq(2, l2.lv_last.li_tv.vval.v_list.lv_refcount)
+ alloc_log:check({
+ a.list(rettv.vval.v_list),
+ a.li(rettv.vval.v_list.lv_first),
+ a.li(rettv.vval.v_list.lv_first.li_next),
+ a.li(rettv.vval.v_list.lv_last.li_prev),
+ a.li(rettv.vval.v_list.lv_last),
+ })
+ eq({1, {}, 3, empty_list}, typvalt2lua(rettv))
+ end)
+ itp('can concatenate list with itself', function()
+ local l = list(1, {})
+ eq(1, l.lv_refcount)
+ eq(1, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+ alloc_log:clear()
+
+ local rettv = typvalt()
+ eq(OK, lib.tv_list_concat(l, l, rettv))
+ eq(1, l.lv_refcount)
+ eq(3, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+ alloc_log:check({
+ a.list(rettv.vval.v_list),
+ a.li(rettv.vval.v_list.lv_first),
+ a.li(rettv.vval.v_list.lv_first.li_next),
+ a.li(rettv.vval.v_list.lv_last.li_prev),
+ a.li(rettv.vval.v_list.lv_last),
+ })
+ eq({1, {}, 1, {}}, typvalt2lua(rettv))
+ end)
+ itp('can concatenate empty non-NULL lists', function()
+ local l = list(1, {})
+ local le = list()
+ local le2 = list()
+ eq(1, l.lv_refcount)
+ eq(1, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+ eq(1, le.lv_refcount)
+ eq(1, le2.lv_refcount)
+ alloc_log:clear()
+
+ local rettv1 = typvalt()
+ eq(OK, lib.tv_list_concat(l, le, rettv1))
+ eq(1, l.lv_refcount)
+ eq(2, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+ eq(1, le.lv_refcount)
+ eq(1, le2.lv_refcount)
+ alloc_log:check({
+ a.list(rettv1.vval.v_list),
+ a.li(rettv1.vval.v_list.lv_first),
+ a.li(rettv1.vval.v_list.lv_last),
+ })
+ eq({1, {}}, typvalt2lua(rettv1))
+
+ local rettv2 = typvalt()
+ eq(OK, lib.tv_list_concat(le, l, rettv2))
+ eq(1, l.lv_refcount)
+ eq(3, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+ eq(1, le.lv_refcount)
+ eq(1, le2.lv_refcount)
+ alloc_log:check({
+ a.list(rettv2.vval.v_list),
+ a.li(rettv2.vval.v_list.lv_first),
+ a.li(rettv2.vval.v_list.lv_last),
+ })
+ eq({1, {}}, typvalt2lua(rettv2))
+
+ local rettv3 = typvalt()
+ eq(OK, lib.tv_list_concat(le, le, rettv3))
+ eq(1, l.lv_refcount)
+ eq(3, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+ eq(1, le.lv_refcount)
+ eq(1, le2.lv_refcount)
+ alloc_log:check({
+ a.list(rettv3.vval.v_list),
+ })
+ eq(empty_list, typvalt2lua(rettv3))
+
+ local rettv4 = typvalt()
+ eq(OK, lib.tv_list_concat(le, le2, rettv4))
+ eq(1, l.lv_refcount)
+ eq(3, l.lv_last.li_tv.vval.v_dict.dv_refcount)
+ eq(1, le.lv_refcount)
+ eq(1, le2.lv_refcount)
+ alloc_log:check({
+ a.list(rettv4.vval.v_list),
+ })
+ eq(empty_list, typvalt2lua(rettv4))
+ end)
+ end)
+ describe('join()', function()
+ local function list_join(l, sep, join_ret)
+ local ga = ga_alloc()
+ eq(join_ret or OK, lib.tv_list_join(ga, l, sep))
+ local ret = ''
+ if ga.ga_data ~= nil then
+ ret = ffi.string(ga.ga_data)
+ end
+ -- For some reason this is not working well in GC
+ lib.ga_clear(ffi.gc(ga, nil))
+ return ret
+ end
+ itp('works', function()
+ local l
+ l = list('boo', 'far')
+ eq('boo far', list_join(l, ' '))
+ eq('boofar', list_join(l, ''))
+
+ l = list('boo')
+ eq('boo', list_join(l, ' '))
+
+ l = list()
+ eq('', list_join(l, ' '))
+
+ l = list({}, 'far')
+ eq('{} far', list_join(l, ' '))
+
+ local recursive_list = {}
+ recursive_list[1] = recursive_list
+ l = ffi.gc(list(recursive_list, 'far'), nil)
+ eq('[[...@0]] far', list_join(l, ' '))
+
+ local recursive_l = l.lv_first.li_tv.vval.v_list
+ local recursive_li = recursive_l.lv_first
+ lib.tv_list_item_remove(recursive_l, recursive_li)
+ lib.tv_list_free(l)
+ end)
+ end)
+ describe('equal()', function()
+ itp('compares empty and NULL lists correctly', function()
+ local l = list()
+ local l2 = list()
+
+ -- NULL lists are not equal to empty lists
+ eq(false, lib.tv_list_equal(l, nil, true, false))
+ eq(false, lib.tv_list_equal(nil, l, false, false))
+ eq(false, lib.tv_list_equal(nil, l, false, true))
+ eq(false, lib.tv_list_equal(l, nil, true, true))
+
+ -- Yet NULL lists are equal themselves
+ eq(true, lib.tv_list_equal(nil, nil, true, false))
+ eq(true, lib.tv_list_equal(nil, nil, false, false))
+ eq(true, lib.tv_list_equal(nil, nil, false, true))
+ eq(true, lib.tv_list_equal(nil, nil, true, true))
+
+ -- As well as empty lists
+ eq(true, lib.tv_list_equal(l, l, true, false))
+ eq(true, lib.tv_list_equal(l, l2, false, false))
+ eq(true, lib.tv_list_equal(l2, l, false, true))
+ eq(true, lib.tv_list_equal(l2, l2, true, true))
+ end)
+ -- Must not use recursive=true argument in the following tests because it
+ -- indicates that tv_equal_recurse_limit and recursive_cnt were set which
+ -- is essential. This argument will be set when comparing inner lists.
+ itp('compares lists correctly when case is not ignored', function()
+ local l1 = list('abc', {1, 2, 'Abc'}, 'def')
+ local l2 = list('abc', {1, 2, 'Abc'})
+ local l3 = list('abc', {1, 2, 'Abc'}, 'Def')
+ local l4 = list('abc', {1, 2, 'Abc', 4}, 'def')
+ local l5 = list('Abc', {1, 2, 'Abc'}, 'def')
+ local l6 = list('abc', {1, 2, 'Abc'}, 'def')
+ local l7 = list('abc', {1, 2, 'abc'}, 'def')
+ local l8 = list('abc', nil, 'def')
+ local l9 = list('abc', {1, 2, nil}, 'def')
+
+ eq(true, lib.tv_list_equal(l1, l1, false, false))
+ eq(false, lib.tv_list_equal(l1, l2, false, false))
+ eq(false, lib.tv_list_equal(l1, l3, false, false))
+ eq(false, lib.tv_list_equal(l1, l4, false, false))
+ eq(false, lib.tv_list_equal(l1, l5, false, false))
+ eq(true, lib.tv_list_equal(l1, l6, false, false))
+ eq(false, lib.tv_list_equal(l1, l7, false, false))
+ eq(false, lib.tv_list_equal(l1, l8, false, false))
+ eq(false, lib.tv_list_equal(l1, l9, false, false))
+ end)
+ itp('compares lists correctly when case is ignored', function()
+ local l1 = list('abc', {1, 2, 'Abc'}, 'def')
+ local l2 = list('abc', {1, 2, 'Abc'})
+ local l3 = list('abc', {1, 2, 'Abc'}, 'Def')
+ local l4 = list('abc', {1, 2, 'Abc', 4}, 'def')
+ local l5 = list('Abc', {1, 2, 'Abc'}, 'def')
+ local l6 = list('abc', {1, 2, 'Abc'}, 'def')
+ local l7 = list('abc', {1, 2, 'abc'}, 'def')
+ local l8 = list('abc', nil, 'def')
+ local l9 = list('abc', {1, 2, nil}, 'def')
+
+ eq(true, lib.tv_list_equal(l1, l1, true, false))
+ eq(false, lib.tv_list_equal(l1, l2, true, false))
+ eq(true, lib.tv_list_equal(l1, l3, true, false))
+ eq(false, lib.tv_list_equal(l1, l4, true, false))
+ eq(true, lib.tv_list_equal(l1, l5, true, false))
+ eq(true, lib.tv_list_equal(l1, l6, true, false))
+ eq(true, lib.tv_list_equal(l1, l7, true, false))
+ eq(false, lib.tv_list_equal(l1, l8, true, false))
+ eq(false, lib.tv_list_equal(l1, l9, true, false))
+ end)
+ end)
+ describe('find', function()
+ describe('()', function()
+ itp('correctly indexes list', function()
+ local l = list(1, 2, 3, 4, 5)
+ local lis = list_items(l)
+ alloc_log:clear()
+
+ eq(nil, lib.tv_list_find(nil, -1))
+ eq(nil, lib.tv_list_find(nil, 0))
+ eq(nil, lib.tv_list_find(nil, 1))
+
+ eq(nil, lib.tv_list_find(l, 5))
+ eq(nil, lib.tv_list_find(l, -6))
+ eq(lis[1], lib.tv_list_find(l, -5))
+ eq(lis[5], lib.tv_list_find(l, 4))
+ eq(lis[3], lib.tv_list_find(l, 2))
+ eq(lis[3], lib.tv_list_find(l, -3))
+ eq(lis[3], lib.tv_list_find(l, 2))
+ eq(lis[3], lib.tv_list_find(l, 2))
+ eq(lis[3], lib.tv_list_find(l, -3))
+
+ l.lv_idx_item = nil
+ eq(lis[1], lib.tv_list_find(l, -5))
+ l.lv_idx_item = nil
+ eq(lis[5], lib.tv_list_find(l, 4))
+ l.lv_idx_item = nil
+ eq(lis[3], lib.tv_list_find(l, 2))
+ l.lv_idx_item = nil
+ eq(lis[3], lib.tv_list_find(l, -3))
+ l.lv_idx_item = nil
+ eq(lis[3], lib.tv_list_find(l, 2))
+ l.lv_idx_item = nil
+ eq(lis[3], lib.tv_list_find(l, 2))
+ l.lv_idx_item = nil
+ eq(lis[3], lib.tv_list_find(l, -3))
+
+ l.lv_idx_item = nil
+ eq(lis[3], lib.tv_list_find(l, 2))
+ eq(lis[1], lib.tv_list_find(l, -5))
+ eq(lis[3], lib.tv_list_find(l, 2))
+ eq(lis[5], lib.tv_list_find(l, 4))
+ eq(lis[3], lib.tv_list_find(l, 2))
+ eq(lis[3], lib.tv_list_find(l, 2))
+ eq(lis[3], lib.tv_list_find(l, 2))
+ eq(lis[3], lib.tv_list_find(l, -3))
+ eq(lis[3], lib.tv_list_find(l, 2))
+ eq(lis[3], lib.tv_list_find(l, 2))
+ eq(lis[3], lib.tv_list_find(l, 2))
+ eq(lis[3], lib.tv_list_find(l, -3))
+
+ alloc_log:check({})
+ end)
+ end)
+ describe('nr()', function()
+ local function tv_list_find_nr(l, n, msg)
+ return check_emsg(function()
+ local err = ffi.new('bool[1]', {false})
+ local ret = lib.tv_list_find_nr(l, n, err)
+ return (err[0] == true), ret
+ end, msg)
+ end
+ itp('returns correct number', function()
+ local l = list(int(1), int(2), int(3), int(4), int(5))
+ alloc_log:clear()
+
+ eq({false, 1}, {tv_list_find_nr(l, -5)})
+ eq({false, 5}, {tv_list_find_nr(l, 4)})
+ eq({false, 3}, {tv_list_find_nr(l, 2)})
+ eq({false, 3}, {tv_list_find_nr(l, -3)})
+
+ alloc_log:check({})
+ end)
+ itp('returns correct number when given a string', function()
+ local l = list('1', '2', '3', '4', '5')
+ alloc_log:clear()
+
+ eq({false, 1}, {tv_list_find_nr(l, -5)})
+ eq({false, 5}, {tv_list_find_nr(l, 4)})
+ eq({false, 3}, {tv_list_find_nr(l, 2)})
+ eq({false, 3}, {tv_list_find_nr(l, -3)})
+
+ alloc_log:check({})
+ end)
+ itp('returns zero when given a NULL string', function()
+ local l = list(null_string)
+ alloc_log:clear()
+
+ eq({false, 0}, {tv_list_find_nr(l, 0)})
+
+ alloc_log:check({})
+ end)
+ itp('errors out on NULL lists', function()
+ eq({true, -1}, {tv_list_find_nr(nil, -5)})
+ eq({true, -1}, {tv_list_find_nr(nil, 4)})
+ eq({true, -1}, {tv_list_find_nr(nil, 2)})
+ eq({true, -1}, {tv_list_find_nr(nil, -3)})
+
+ alloc_log:check({})
+ end)
+ itp('errors out on out-of-range indexes', function()
+ local l = list(int(1), int(2), int(3), int(4), int(5))
+ alloc_log:clear()
+
+ eq({true, -1}, {tv_list_find_nr(l, -6)})
+ eq({true, -1}, {tv_list_find_nr(l, 5)})
+
+ alloc_log:check({})
+ end)
+ itp('errors out on invalid types', function()
+ local l = list(1, empty_list, {})
+
+ eq({true, 0}, {tv_list_find_nr(l, 0, 'E805: Using a Float as a Number')})
+ eq({true, 0}, {tv_list_find_nr(l, 1, 'E745: Using a List as a Number')})
+ eq({true, 0}, {tv_list_find_nr(l, 2, 'E728: Using a Dictionary as a Number')})
+ eq({true, 0}, {tv_list_find_nr(l, -1, 'E728: Using a Dictionary as a Number')})
+ eq({true, 0}, {tv_list_find_nr(l, -2, 'E745: Using a List as a Number')})
+ eq({true, 0}, {tv_list_find_nr(l, -3, 'E805: Using a Float as a Number')})
+ end)
+ end)
+ local function tv_list_find_str(l, n, msg)
+ return check_emsg(function()
+ local ret = lib.tv_list_find_str(l, n)
+ local s = nil
+ if ret ~= nil then
+ s = ffi.string(ret)
+ end
+ return s
+ end, msg)
+ end
+ describe('str()', function()
+ itp('returns correct string', function()
+ local l = list(int(1), int(2), int(3), int(4), int(5))
+ alloc_log:clear()
+
+ eq('1', tv_list_find_str(l, -5))
+ eq('5', tv_list_find_str(l, 4))
+ eq('3', tv_list_find_str(l, 2))
+ eq('3', tv_list_find_str(l, -3))
+
+ alloc_log:check({})
+ end)
+ itp('returns string when used with VAR_STRING items', function()
+ local l = list('1', '2', '3', '4', '5')
+ alloc_log:clear()
+
+ eq('1', tv_list_find_str(l, -5))
+ eq('5', tv_list_find_str(l, 4))
+ eq('3', tv_list_find_str(l, 2))
+ eq('3', tv_list_find_str(l, -3))
+
+ alloc_log:check({})
+ end)
+ itp('returns empty when used with NULL string', function()
+ local l = list(null_string)
+ alloc_log:clear()
+
+ eq('', tv_list_find_str(l, 0))
+
+ alloc_log:check({})
+ end)
+ itp('fails with error message when index is out of range', function()
+ local l = list(int(1), int(2), int(3), int(4), int(5))
+
+ eq(nil, tv_list_find_str(l, -6, 'E684: list index out of range: -6'))
+ eq(nil, tv_list_find_str(l, 5, 'E684: list index out of range: 5'))
+ end)
+ itp('fails with error message on invalid types', function()
+ local l = list(1, empty_list, {})
+
+ eq('', tv_list_find_str(l, 0, 'E806: using Float as a String'))
+ eq('', tv_list_find_str(l, 1, 'E730: using List as a String'))
+ eq('', tv_list_find_str(l, 2, 'E731: using Dictionary as a String'))
+ eq('', tv_list_find_str(l, -1, 'E731: using Dictionary as a String'))
+ eq('', tv_list_find_str(l, -2, 'E730: using List as a String'))
+ eq('', tv_list_find_str(l, -3, 'E806: using Float as a String'))
+ end)
+ end)
+ end)
+ describe('idx_of_item()', function()
+ itp('works', function()
+ local l = list(1, 2, 3, 4, 5)
+ local l2 = list(42, empty_list)
+ local lis = list_items(l)
+ local lis2 = list_items(l2)
+
+ for i, li in ipairs(lis) do
+ eq(i - 1, lib.tv_list_idx_of_item(l, li))
+ end
+ eq(-1, lib.tv_list_idx_of_item(l, lis2[1]))
+ eq(-1, lib.tv_list_idx_of_item(l, nil))
+ eq(-1, lib.tv_list_idx_of_item(nil, nil))
+ eq(-1, lib.tv_list_idx_of_item(nil, lis[1]))
+ end)
+ end)
+ end)
+ describe('dict', function()
+ describe('watcher', function()
+ describe('add()/remove()', function()
+ itp('works with an empty key', function()
+ local d = dict({})
+ eq({}, dict_watchers(d))
+ local cb = ffi.gc(tbl2callback({type='none'}), nil)
+ alloc_log:clear()
+ lib.tv_dict_watcher_add(d, '*', 0, cb[0])
+ local ws, qs = dict_watchers(d)
+ local key_p = qs[1].key_pattern
+ alloc_log:check({
+ a.dwatcher(qs[1]),
+ a.str(key_p, 0),
+ })
+ eq({{busy=false, cb={type='none'}, pat=''}}, ws)
+ eq(true, lib.tv_dict_watcher_remove(d, 'x', 0, cb[0]))
+ alloc_log:check({
+ a.freed(key_p),
+ a.freed(qs[1]),
+ })
+ eq({}, dict_watchers(d))
+ end)
+ itp('works with multiple callbacks', function()
+ local d = dict({})
+ eq({}, dict_watchers(d))
+ alloc_log:check({a.dict(d)})
+ local cbs = {}
+ cbs[1] = {'te', ffi.gc(tbl2callback({type='none'}), nil)}
+ alloc_log:check({})
+ cbs[2] = {'foo', ffi.gc(tbl2callback({type='fref', fref='tr'}), nil)}
+ alloc_log:check({
+ a.str(cbs[2][2].data.funcref, #('tr')),
+ })
+ cbs[3] = {'te', ffi.gc(tbl2callback({type='pt', fref='tr', pt={
+ value='tr',
+ args={'test'},
+ dict={},
+ }}), nil)}
+ local pt3 = cbs[3][2].data.partial
+ local pt3_argv = pt3.pt_argv
+ local pt3_dict = pt3.pt_dict
+ local pt3_name = pt3.pt_name
+ local pt3_str_arg = pt3.pt_argv[0].vval.v_string
+ alloc_log:check({
+ a.lua_pt(pt3),
+ a.lua_tvs(pt3_argv, pt3.pt_argc),
+ a.str(pt3_str_arg, #('test')),
+ a.dict(pt3_dict),
+ a.str(pt3_name, #('tr')),
+ })
+ for _, v in ipairs(cbs) do
+ lib.tv_dict_watcher_add(d, v[1], #(v[1]), v[2][0])
+ end
+ local ws, qs, kps = dict_watchers(d)
+ eq({{busy=false, pat=cbs[1][1], cb={type='none'}},
+ {busy=false, pat=cbs[2][1], cb={type='fref', fref='tr'}},
+ {busy=false, pat=cbs[3][1], cb={type='pt', fref='tr', pt={
+ [type_key]=func_type,
+ value='tr',
+ args={'test'},
+ dict={},
+ }}}}, ws)
+ alloc_log:check({
+ a.dwatcher(qs[1]),
+ a.str(kps[1][1], kps[1][2]),
+ a.dwatcher(qs[2]),
+ a.str(kps[2][1], kps[2][2]),
+ a.dwatcher(qs[3]),
+ a.str(kps[3][1], kps[3][2]),
+ })
+ eq(true, lib.tv_dict_watcher_remove(d, cbs[2][1], #cbs[2][1], cbs[2][2][0]))
+ alloc_log:check({
+ a.freed(cbs[2][2].data.funcref),
+ a.freed(kps[2][1]),
+ a.freed(qs[2]),
+ })
+ eq(false, lib.tv_dict_watcher_remove(d, cbs[2][1], #cbs[2][1], cbs[2][2][0]))
+ eq({{busy=false, pat=cbs[1][1], cb={type='none'}},
+ {busy=false, pat=cbs[3][1], cb={type='pt', fref='tr', pt={
+ [type_key]=func_type,
+ value='tr',
+ args={'test'},
+ dict={},
+ }}}}, dict_watchers(d))
+ eq(true, lib.tv_dict_watcher_remove(d, cbs[3][1], #cbs[3][1], cbs[3][2][0]))
+ alloc_log:check({
+ a.freed(pt3_str_arg),
+ a.freed(pt3_argv),
+ a.freed(pt3_dict),
+ a.freed(pt3_name),
+ a.freed(pt3),
+ a.freed(kps[3][1]),
+ a.freed(qs[3]),
+ })
+ eq(false, lib.tv_dict_watcher_remove(d, cbs[3][1], #cbs[3][1], cbs[3][2][0]))
+ eq({{busy=false, pat=cbs[1][1], cb={type='none'}}}, dict_watchers(d))
+ eq(true, lib.tv_dict_watcher_remove(d, cbs[1][1], #cbs[1][1], cbs[1][2][0]))
+ alloc_log:check({
+ a.freed(kps[1][1]),
+ a.freed(qs[1]),
+ })
+ eq(false, lib.tv_dict_watcher_remove(d, cbs[1][1], #cbs[1][1], cbs[1][2][0]))
+ eq({}, dict_watchers(d))
+ end)
+ end)
+ describe('notify', function()
+ -- Way too hard to test it here, functional tests in
+ -- dict_notifications_spec.lua.
+ end)
+ end)
+ describe('item', function()
+ describe('alloc()/free()', function()
+ local function check_tv_dict_item_alloc_len(s, len, tv, more_frees)
+ local di
+ if len == nil then
+ di = ffi.gc(lib.tv_dict_item_alloc(s), nil)
+ len = #s
+ else
+ di = ffi.gc(lib.tv_dict_item_alloc_len(s, len or #s), nil)
+ end
+ eq(s:sub(1, len), ffi.string(di.di_key))
+ alloc_log:check({a.di(di, len)})
+ if tv then
+ di.di_tv = ffi.gc(tv, nil)
+ else
+ di.di_tv.v_type = lib.VAR_UNKNOWN
+ end
+ lib.tv_dict_item_free(di)
+ alloc_log:check(concat_tables(more_frees, {a.freed(di)}))
+ end
+ local function check_tv_dict_item_alloc(s, tv, more_frees)
+ return check_tv_dict_item_alloc_len(s, nil, tv, more_frees)
+ end
+ itp('works', function()
+ check_tv_dict_item_alloc('')
+ check_tv_dict_item_alloc('t')
+ check_tv_dict_item_alloc('TEST')
+ check_tv_dict_item_alloc_len('', 0)
+ check_tv_dict_item_alloc_len('TEST', 2)
+ local tv = lua2typvalt('test')
+ alloc_log:check({a.str(tv.vval.v_string, #('test'))})
+ check_tv_dict_item_alloc('', tv, {a.freed(tv.vval.v_string)})
+ tv = lua2typvalt('test')
+ alloc_log:check({a.str(tv.vval.v_string, #('test'))})
+ check_tv_dict_item_alloc_len('', 0, tv, {a.freed(tv.vval.v_string)})
+ end)
+ end)
+ describe('add()/remove()', function()
+ itp('works', function()
+ local d = dict()
+ eq({}, dct2tbl(d))
+ alloc_log:check({a.dict(d)})
+ local di = ffi.gc(lib.tv_dict_item_alloc(''), nil)
+ local tv = lua2typvalt('test')
+ di.di_tv = ffi.gc(tv, nil)
+ alloc_log:check({a.di(di, ''), a.str(tv.vval.v_string, 'test')})
+ eq(OK, lib.tv_dict_add(d, di))
+ alloc_log:check({})
+ eq(FAIL, check_emsg(function() return lib.tv_dict_add(d, di) end,
+ 'E685: Internal error: hash_add()'))
+ alloc_log:clear()
+ lib.tv_dict_item_remove(d, di)
+ alloc_log:check({
+ a.freed(tv.vval.v_string),
+ a.freed(di),
+ })
+ end)
+ end)
+ end)
+ describe('indexing', function()
+ describe('find()', function()
+ local function tv_dict_find(d, key, key_len)
+ local di = lib.tv_dict_find(d, key, key_len or #key)
+ if di == nil then
+ return nil, nil, nil
+ end
+ return typvalt2lua(di.di_tv), ffi.string(di.di_key), di
+ end
+ itp('works with NULL dict', function()
+ eq(nil, lib.tv_dict_find(nil, '', 0))
+ eq(nil, lib.tv_dict_find(nil, 'test', -1))
+ eq(nil, lib.tv_dict_find(nil, nil, 0))
+ end)
+ itp('works with NULL key', function()
+ local lua_d = {
+ ['']=0,
+ t=1,
+ te=2,
+ tes=3,
+ test=4,
+ testt=5,
+ }
+ local d = dict(lua_d)
+ alloc_log:clear()
+ eq(lua_d, dct2tbl(d))
+ alloc_log:check({})
+ local dis = dict_items(d)
+ eq({0, '', dis['']}, {tv_dict_find(d, '', 0)})
+ eq({0, '', dis['']}, {tv_dict_find(d, nil, 0)})
+ end)
+ itp('works with len properly', function()
+ local lua_d = {
+ ['']=0,
+ t=1,
+ te=2,
+ tes=3,
+ test=4,
+ testt=5,
+ }
+ local d = dict(lua_d)
+ alloc_log:clear()
+ eq(lua_d, dct2tbl(d))
+ alloc_log:check({})
+ for i = 0, 5 do
+ local v, k = tv_dict_find(d, 'testt', i)
+ eq({i, ('testt'):sub(1, i)}, {v, k})
+ end
+ eq(nil, tv_dict_find(d, 'testt', 6)) -- Should take NUL byte
+ eq(5, tv_dict_find(d, 'testt', -1))
+ alloc_log:check({})
+ end)
+ end)
+ describe('get_number()', function()
+ itp('works with NULL dict', function()
+ eq(0, check_emsg(function() return lib.tv_dict_get_number(nil, 'test') end,
+ nil))
+ end)
+ itp('works', function()
+ local d = ffi.gc(dict({test={}}), nil)
+ eq(0, check_emsg(function() return lib.tv_dict_get_number(d, 'test') end,
+ 'E728: Using a Dictionary as a Number'))
+ d = ffi.gc(dict({tes=int(42), t=44, te='43'}), nil)
+ alloc_log:clear()
+ eq(0, check_emsg(function() return lib.tv_dict_get_number(d, 'test') end,
+ nil))
+ eq(42, check_emsg(function() return lib.tv_dict_get_number(d, 'tes') end,
+ nil))
+ eq(43, check_emsg(function() return lib.tv_dict_get_number(d, 'te') end,
+ nil))
+ alloc_log:check({})
+ eq(0, check_emsg(function() return lib.tv_dict_get_number(d, 't') end,
+ 'E805: Using a Float as a Number'))
+ end)
+ end)
+ describe('get_string()', function()
+ itp('works with NULL dict', function()
+ eq(nil, check_emsg(function() return lib.tv_dict_get_string(nil, 'test', false) end,
+ nil))
+ end)
+ itp('works', function()
+ local d = ffi.gc(dict({test={}}), nil)
+ eq('', ffi.string(check_emsg(function() return lib.tv_dict_get_string(d, 'test', false) end,
+ 'E731: using Dictionary as a String')))
+ d = ffi.gc(dict({tes=int(42), t=44, te='43', xx=int(45)}), nil)
+ alloc_log:clear()
+ local dis = dict_items(d)
+ eq(nil, check_emsg(function() return lib.tv_dict_get_string(d, 'test', false) end,
+ nil))
+ local s42 = check_emsg(function() return lib.tv_dict_get_string(d, 'tes', false) end,
+ nil)
+ eq('42', ffi.string(s42))
+ local s45 = check_emsg(function() return lib.tv_dict_get_string(d, 'xx', false) end,
+ nil)
+ eq(s42, s45)
+ eq('45', ffi.string(s45))
+ eq('45', ffi.string(s42))
+ local s43 = check_emsg(function() return lib.tv_dict_get_string(d, 'te', false) end,
+ nil)
+ eq('43', ffi.string(s43))
+ neq(s42, s43)
+ eq(s43, dis.te.di_tv.vval.v_string)
+ alloc_log:check({})
+ eq('', ffi.string(check_emsg(function() return lib.tv_dict_get_string(d, 't', false) end,
+ 'E806: using Float as a String')))
+ end)
+ itp('allocates a string copy when requested', function()
+ local function tv_dict_get_string_alloc(d, key, emsg)
+ alloc_log:clear()
+ local ret = check_emsg(function() return lib.tv_dict_get_string(d, key, true) end,
+ emsg)
+ local s_ret = (ret ~= nil) and ffi.string(ret) or nil
+ if not emsg then
+ if s_ret then
+ alloc_log:check({a.str(ret, s_ret)})
+ else
+ alloc_log:check({})
+ end
+ end
+ lib.xfree(ret)
+ return s_ret
+ end
+ local d = ffi.gc(dict({test={}}), nil)
+ eq('', tv_dict_get_string_alloc(d, 'test', 'E731: using Dictionary as a String'))
+ d = ffi.gc(dict({tes=int(42), t=44, te='43', xx=int(45)}), nil)
+ alloc_log:clear()
+ eq(nil, tv_dict_get_string_alloc(d, 'test'))
+ eq('42', tv_dict_get_string_alloc(d, 'tes'))
+ eq('45', tv_dict_get_string_alloc(d, 'xx'))
+ eq('43', tv_dict_get_string_alloc(d, 'te'))
+ eq('', tv_dict_get_string_alloc(d, 't', 'E806: using Float as a String'))
+ end)
+ end)
+ describe('get_string_buf()', function()
+ local function tv_dict_get_string_buf(d, key, buf, emsg)
+ buf = buf or ffi.gc(lib.xmalloc(lib.NUMBUFLEN), lib.xfree)
+ alloc_log:clear()
+ local ret = check_emsg(function() return lib.tv_dict_get_string_buf(d, key, buf) end,
+ emsg)
+ local s_ret = (ret ~= nil) and ffi.string(ret) or nil
+ if not emsg then
+ alloc_log:check({})
+ end
+ return s_ret, ret, buf
+ end
+ itp('works with NULL dict', function()
+ eq(nil, tv_dict_get_string_buf(nil, 'test'))
+ end)
+ itp('works', function()
+ local lua_d = {
+ ['']={},
+ t=1,
+ te=int(2),
+ tes=empty_list,
+ test='tset',
+ testt=5,
+ }
+ local d = dict(lua_d)
+ alloc_log:clear()
+ eq(lua_d, dct2tbl(d))
+ alloc_log:check({})
+ local s, r, b
+ s, r, b = tv_dict_get_string_buf(d, 'test')
+ neq(r, b)
+ eq('tset', s)
+ s, r, b = tv_dict_get_string_buf(d, 't', nil, 'E806: using Float as a String')
+ neq(r, b)
+ eq('', s)
+ s, r, b = tv_dict_get_string_buf(d, 'te')
+ eq(r, b)
+ eq('2', s)
+ end)
+ end)
+ describe('get_string_buf_chk()', function()
+ local function tv_dict_get_string_buf_chk(d, key, len, buf, def, emsg)
+ buf = buf or ffi.gc(lib.xmalloc(lib.NUMBUFLEN), lib.xfree)
+ def = def or ffi.gc(lib.xstrdup('DEFAULT'), lib.xfree)
+ len = len or #key
+ alloc_log:clear()
+ local ret = check_emsg(function() return lib.tv_dict_get_string_buf_chk(d, key, len, buf, def) end,
+ emsg)
+ local s_ret = (ret ~= nil) and ffi.string(ret) or nil
+ if not emsg then
+ alloc_log:check({})
+ end
+ return s_ret, ret, buf, def
+ end
+ itp('works with NULL dict', function()
+ eq('DEFAULT', tv_dict_get_string_buf_chk(nil, 'test'))
+ end)
+ itp('works', function()
+ local lua_d = {
+ ['']={},
+ t=1,
+ te=int(2),
+ tes=empty_list,
+ test='tset',
+ testt=5,
+ }
+ local d = dict(lua_d)
+ alloc_log:clear()
+ eq(lua_d, dct2tbl(d))
+ alloc_log:check({})
+ local s, r, b, def
+ s, r, b, def = tv_dict_get_string_buf_chk(d, 'test')
+ neq(r, b)
+ neq(r, def)
+ eq('tset', s)
+ s, r, b, def = tv_dict_get_string_buf_chk(d, 'test', 1, nil, nil, 'E806: using Float as a String')
+ neq(r, b)
+ neq(r, def)
+ eq(nil, s)
+ s, r, b, def = tv_dict_get_string_buf_chk(d, 'te')
+ eq(r, b)
+ neq(r, def)
+ eq('2', s)
+ s, r, b, def = tv_dict_get_string_buf_chk(d, 'TEST')
+ eq(r, def)
+ neq(r, b)
+ eq('DEFAULT', s)
+ end)
+ end)
+ describe('get_callback()', function()
+ local function tv_dict_get_callback(d, key, key_len, emsg)
+ key_len = key_len or #key
+ local cb = ffi.gc(ffi.cast('Callback*', lib.xmalloc(ffi.sizeof('Callback'))), lib.callback_free)
+ alloc_log:clear()
+ local ret = check_emsg(function()
+ return lib.tv_dict_get_callback(d, key, key_len, cb)
+ end, emsg)
+ local cb_lua = callback2tbl(cb[0])
+ return cb_lua, ret
+ end
+ itp('works with NULL dict', function()
+ eq({{type='none'}, true}, {tv_dict_get_callback(nil, '')})
+ end)
+ itp('works', function()
+ local lua_d = {
+ ['']='tr',
+ t=int(1),
+ te={[type_key]=func_type, value='tr'},
+ tes={[type_key]=func_type, value='tr', args={'a', 'b'}},
+ test={[type_key]=func_type, value='Test', dict={test=1}, args={}},
+ testt={[type_key]=func_type, value='Test', dict={test=1}, args={1}},
+ }
+ local d = dict(lua_d)
+ eq(lua_d, dct2tbl(d))
+ eq({{type='fref', fref='tr'}, true},
+ {tv_dict_get_callback(d, nil, 0)})
+ eq({{type='fref', fref='tr'}, true},
+ {tv_dict_get_callback(d, '', -1)})
+ eq({{type='none'}, true},
+ {tv_dict_get_callback(d, 'x', -1)})
+ eq({{type='fref', fref='tr'}, true},
+ {tv_dict_get_callback(d, 'testt', 0)})
+ eq({{type='none'}, false},
+ {tv_dict_get_callback(d, 'test', 1, 'E6000: Argument is not a function or function name')})
+ eq({{type='fref', fref='tr'}, true},
+ {tv_dict_get_callback(d, 'testt', 2)})
+ eq({{ type='pt', fref='tr', pt={ [type_key]=func_type, value='tr', args={ 'a', 'b' } } }, true},
+ {tv_dict_get_callback(d, 'testt', 3)})
+ eq({{ type='pt', fref='Test', pt={ [type_key]=func_type, value='Test', dict={ test=1 }, args={} } }, true},
+ {tv_dict_get_callback(d, 'testt', 4)})
+ eq({{ type='pt', fref='Test', pt={ [type_key]=func_type, value='Test', dict={ test=1 }, args={1} } }, true},
+ {tv_dict_get_callback(d, 'testt', 5)})
+ end)
+ end)
+ end)
+ describe('add', function()
+ describe('()', function()
+ itp('works', function()
+ local di = lib.tv_dict_item_alloc_len('t-est', 5)
+ alloc_log:check({a.di(di, 't-est')})
+ di.di_tv.v_type = lib.VAR_NUMBER
+ di.di_tv.vval.v_number = 42
+ local d = dict({test=10})
+ local dis = dict_items(d)
+ alloc_log:check({
+ a.dict(d),
+ a.di(dis.test, 'test')
+ })
+ eq({test=10}, dct2tbl(d))
+ alloc_log:clear()
+ eq(OK, lib.tv_dict_add(d, di))
+ alloc_log:check({})
+ eq({test=10, ['t-est']=int(42)}, dct2tbl(d))
+ eq(FAIL, check_emsg(function() return lib.tv_dict_add(d, di) end,
+ 'E685: Internal error: hash_add()'))
+ end)
+ end)
+ describe('list()', function()
+ itp('works', function()
+ local l = list(1, 2, 3)
+ alloc_log:clear()
+ eq(1, l.lv_refcount)
+ local d = dict({test=10})
+ alloc_log:clear()
+ eq({test=10}, dct2tbl(d))
+ eq(OK, lib.tv_dict_add_list(d, 'testt', 3, l))
+ local dis = dict_items(d)
+ alloc_log:check({a.di(dis.tes, 'tes')})
+ eq({test=10, tes={1, 2, 3}}, dct2tbl(d))
+ eq(2, l.lv_refcount)
+ eq(FAIL, check_emsg(function() return lib.tv_dict_add_list(d, 'testt', 3, l) end,
+ 'E685: Internal error: hash_add()'))
+ eq(2, l.lv_refcount)
+ alloc_log:clear()
+ lib.emsg_skip = lib.emsg_skip + 1
+ eq(FAIL, check_emsg(function() return lib.tv_dict_add_list(d, 'testt', 3, l) end,
+ nil))
+ eq(2, l.lv_refcount)
+ lib.emsg_skip = lib.emsg_skip - 1
+ alloc_log:clear_tmp_allocs()
+ alloc_log:check({})
+ end)
+ end)
+ describe('dict()', function()
+ itp('works', function()
+ local d2 = dict({foo=42})
+ alloc_log:clear()
+ eq(1, d2.dv_refcount)
+ local d = dict({test=10})
+ alloc_log:clear()
+ eq({test=10}, dct2tbl(d))
+ eq(OK, lib.tv_dict_add_dict(d, 'testt', 3, d2))
+ local dis = dict_items(d)
+ alloc_log:check({a.di(dis.tes, 'tes')})
+ eq({test=10, tes={foo=42}}, dct2tbl(d))
+ eq(2, d2.dv_refcount)
+ eq(FAIL, check_emsg(function() return lib.tv_dict_add_dict(d, 'testt', 3, d2) end,
+ 'E685: Internal error: hash_add()'))
+ eq(2, d2.dv_refcount)
+ alloc_log:clear()
+ lib.emsg_skip = lib.emsg_skip + 1
+ eq(FAIL, check_emsg(function() return lib.tv_dict_add_dict(d, 'testt', 3, d2) end,
+ nil))
+ eq(2, d2.dv_refcount)
+ lib.emsg_skip = lib.emsg_skip - 1
+ alloc_log:clear_tmp_allocs()
+ alloc_log:check({})
+ end)
+ end)
+ describe('nr()', function()
+ itp('works', function()
+ local d = dict({test=10})
+ alloc_log:clear()
+ eq({test=10}, dct2tbl(d))
+ eq(OK, lib.tv_dict_add_nr(d, 'testt', 3, 2))
+ local dis = dict_items(d)
+ alloc_log:check({a.di(dis.tes, 'tes')})
+ eq({test=10, tes=int(2)}, dct2tbl(d))
+ eq(FAIL, check_emsg(function() return lib.tv_dict_add_nr(d, 'testt', 3, 2) end,
+ 'E685: Internal error: hash_add()'))
+ alloc_log:clear()
+ lib.emsg_skip = lib.emsg_skip + 1
+ eq(FAIL, check_emsg(function() return lib.tv_dict_add_nr(d, 'testt', 3, 2) end,
+ nil))
+ lib.emsg_skip = lib.emsg_skip - 1
+ alloc_log:clear_tmp_allocs()
+ alloc_log:check({})
+ end)
+ end)
+ describe('str()', function()
+ itp('works', function()
+ local d = dict({test=10})
+ alloc_log:clear()
+ eq({test=10}, dct2tbl(d))
+ eq(OK, lib.tv_dict_add_str(d, 'testt', 3, 'TEST'))
+ local dis = dict_items(d)
+ alloc_log:check({
+ a.str(dis.tes.di_tv.vval.v_string, 'TEST'),
+ a.di(dis.tes, 'tes'),
+ })
+ eq({test=10, tes='TEST'}, dct2tbl(d))
+ eq(FAIL, check_emsg(function() return lib.tv_dict_add_str(d, 'testt', 3, 'TEST') end,
+ 'E685: Internal error: hash_add()'))
+ alloc_log:clear()
+ lib.emsg_skip = lib.emsg_skip + 1
+ eq(FAIL, check_emsg(function() return lib.tv_dict_add_str(d, 'testt', 3, 'TEST') end,
+ nil))
+ lib.emsg_skip = lib.emsg_skip - 1
+ alloc_log:clear_tmp_allocs()
+ alloc_log:check({})
+ end)
+ end)
+ describe('allocated_str()', function()
+ itp('works', function()
+ local d = dict({test=10})
+ eq({test=10}, dct2tbl(d))
+ alloc_log:clear()
+ local s1 = lib.xstrdup('TEST')
+ local s2 = lib.xstrdup('TEST')
+ local s3 = lib.xstrdup('TEST')
+ alloc_log:check({
+ a.str(s1, 'TEST'),
+ a.str(s2, 'TEST'),
+ a.str(s3, 'TEST'),
+ })
+ eq(OK, lib.tv_dict_add_allocated_str(d, 'testt', 3, s1))
+ local dis = dict_items(d)
+ alloc_log:check({
+ a.di(dis.tes, 'tes'),
+ })
+ eq({test=10, tes='TEST'}, dct2tbl(d))
+ eq(FAIL, check_emsg(function() return lib.tv_dict_add_allocated_str(d, 'testt', 3, s2) end,
+ 'E685: Internal error: hash_add()'))
+ alloc_log:clear()
+ lib.emsg_skip = lib.emsg_skip + 1
+ eq(FAIL, check_emsg(function() return lib.tv_dict_add_allocated_str(d, 'testt', 3, s3) end,
+ nil))
+ lib.emsg_skip = lib.emsg_skip - 1
+ alloc_log:clear_tmp_allocs()
+ alloc_log:check({
+ a.freed(s3),
+ })
+ end)
+ end)
+ end)
+ describe('clear()', function()
+ itp('works', function()
+ local d = dict()
+ alloc_log:check({a.dict(d)})
+ eq({}, dct2tbl(d))
+ lib.tv_dict_clear(d)
+ eq({}, dct2tbl(d))
+ lib.tv_dict_add_str(d, 'TEST', 3, 'tEsT')
+ local dis = dict_items(d)
+ local di = dis.TES
+ local di_s = di.di_tv.vval.v_string
+ alloc_log:check({a.str(di_s), a.di(di)})
+ eq({TES='tEsT'}, dct2tbl(d))
+ lib.tv_dict_clear(d)
+ alloc_log:check({a.freed(di_s), a.freed(di)})
+ eq({}, dct2tbl(d))
+ end)
+ end)
+ describe('extend()', function()
+ local function tv_dict_extend(d1, d2, action, emsg)
+ action = action or "force"
+ check_emsg(function() return lib.tv_dict_extend(d1, d2, action) end, emsg)
+ end
+ itp('works', function()
+ local d1 = dict()
+ alloc_log:check({a.dict(d1)})
+ eq({}, dct2tbl(d1))
+ local d2 = dict()
+ alloc_log:check({a.dict(d2)})
+ eq({}, dct2tbl(d2))
+ tv_dict_extend(d1, d2, 'error')
+ tv_dict_extend(d1, d2, 'keep')
+ tv_dict_extend(d1, d2, 'force')
+ alloc_log:check({})
+
+ d1 = dict({a='TEST'})
+ eq({a='TEST'}, dct2tbl(d1))
+ local dis1 = dict_items(d1)
+ local a1_s = dis1.a.di_tv.vval.v_string
+ alloc_log:clear_tmp_allocs()
+ alloc_log:check({
+ a.dict(d1),
+ a.di(dis1.a),
+ a.str(a1_s),
+ })
+ d2 = dict({a='TSET'})
+ eq({a='TSET'}, dct2tbl(d2))
+ local dis2 = dict_items(d2)
+ local a2_s = dis2.a.di_tv.vval.v_string
+ alloc_log:clear_tmp_allocs()
+ alloc_log:check({
+ a.dict(d2),
+ a.di(dis2.a),
+ a.str(a2_s),
+ })
+
+ tv_dict_extend(d1, d2, 'error', 'E737: Key already exists: a')
+ eq({a='TEST'}, dct2tbl(d1))
+ eq({a='TSET'}, dct2tbl(d2))
+ alloc_log:clear()
+
+ tv_dict_extend(d1, d2, 'keep')
+ alloc_log:check({})
+ eq({a='TEST'}, dct2tbl(d1))
+ eq({a='TSET'}, dct2tbl(d2))
+
+ tv_dict_extend(d1, d2, 'force')
+ alloc_log:check({
+ a.freed(a1_s),
+ a.str(dis1.a.di_tv.vval.v_string),
+ })
+ eq({a='TSET'}, dct2tbl(d1))
+ eq({a='TSET'}, dct2tbl(d2))
+ end)
+ itp('disallows overriding builtin or user functions', function()
+ local d = dict()
+ d.dv_scope = lib.VAR_DEF_SCOPE
+ local f_lua = {
+ [type_key]=func_type,
+ value='tr',
+ }
+ local f_tv = lua2typvalt(f_lua)
+ local p_lua = {
+ [type_key]=func_type,
+ value='tr',
+ args={1},
+ }
+ local p_tv = lua2typvalt(p_lua)
+ eq(lib.VAR_PARTIAL, p_tv.v_type)
+ local d2 = dict({tr=f_tv})
+ local d3 = dict({tr=p_tv})
+ local d4 = dict({['TEST:THIS']=p_tv})
+ local d5 = dict({Test=f_tv})
+ local d6 = dict({Test=p_tv})
+ eval0([[execute("function Test()\nendfunction")]])
+ tv_dict_extend(d, d2, 'force',
+ 'E704: Funcref variable name must start with a capital: tr')
+ tv_dict_extend(d, d3, 'force',
+ 'E704: Funcref variable name must start with a capital: tr')
+ tv_dict_extend(d, d4, 'force',
+ 'E461: Illegal variable name: TEST:THIS')
+ tv_dict_extend(d, d5, 'force',
+ 'E705: Variable name conflicts with existing function: Test')
+ tv_dict_extend(d, d6, 'force',
+ 'E705: Variable name conflicts with existing function: Test')
+ eq({}, dct2tbl(d))
+ d.dv_scope = lib.VAR_SCOPE
+ tv_dict_extend(d, d4, 'force',
+ 'E461: Illegal variable name: TEST:THIS')
+ eq({}, dct2tbl(d))
+ tv_dict_extend(d, d2, 'force')
+ eq({tr=f_lua}, dct2tbl(d))
+ tv_dict_extend(d, d3, 'force')
+ eq({tr=p_lua}, dct2tbl(d))
+ tv_dict_extend(d, d5, 'force')
+ eq({tr=p_lua, Test=f_lua}, dct2tbl(d))
+ tv_dict_extend(d, d6, 'force')
+ eq({tr=p_lua, Test=p_lua}, dct2tbl(d))
+ end)
+ itp('cares about locks and read-only items', function()
+ local d_lua = {tv_locked=1, tv_fixed=2, di_ro=3, di_ro_sbx=4}
+ local d = dict(d_lua)
+ local dis = dict_items(d)
+ dis.tv_locked.di_tv.v_lock = lib.VAR_LOCKED
+ dis.tv_fixed.di_tv.v_lock = lib.VAR_FIXED
+ dis.di_ro.di_flags = bit.bor(dis.di_ro.di_flags, lib.DI_FLAGS_RO)
+ dis.di_ro_sbx.di_flags = bit.bor(dis.di_ro_sbx.di_flags, lib.DI_FLAGS_RO_SBX)
+ lib.sandbox = true
+ local d1 = dict({tv_locked=41})
+ local d2 = dict({tv_fixed=42})
+ local d3 = dict({di_ro=43})
+ local d4 = dict({di_ro_sbx=44})
+ tv_dict_extend(d, d1, 'force', 'E741: Value is locked: extend() argument')
+ tv_dict_extend(d, d2, 'force', 'E742: Cannot change value of extend() argument')
+ tv_dict_extend(d, d3, 'force', 'E46: Cannot change read-only variable "extend() argument"')
+ tv_dict_extend(d, d4, 'force', 'E794: Cannot set variable in the sandbox: "extend() argument"')
+ eq(d_lua, dct2tbl(d))
+ lib.sandbox = false
+ tv_dict_extend(d, d4, 'force')
+ d_lua.di_ro_sbx = 44
+ eq(d_lua, dct2tbl(d))
+ end)
+ end)
+ describe('equal()', function()
+ local function tv_dict_equal(d1, d2, ic, recursive)
+ return lib.tv_dict_equal(d1, d2, ic or false, recursive or false)
+ end
+ itp('works', function()
+ eq(true, tv_dict_equal(nil, nil))
+ local d1 = dict()
+ alloc_log:check({a.dict(d1)})
+ eq(1, d1.dv_refcount)
+ eq(false, tv_dict_equal(nil, d1))
+ eq(false, tv_dict_equal(d1, nil))
+ eq(true, tv_dict_equal(d1, d1))
+ eq(1, d1.dv_refcount)
+ alloc_log:check({})
+ local d_upper = dict({a='TEST'})
+ local dis_upper = dict_items(d_upper)
+ local d_lower = dict({a='test'})
+ local dis_lower = dict_items(d_lower)
+ local d_kupper_upper = dict({A='TEST'})
+ local dis_kupper_upper = dict_items(d_kupper_upper)
+ local d_kupper_lower = dict({A='test'})
+ local dis_kupper_lower = dict_items(d_kupper_lower)
+ alloc_log:clear_tmp_allocs()
+ alloc_log:check({
+ a.dict(d_upper),
+ a.di(dis_upper.a),
+ a.str(dis_upper.a.di_tv.vval.v_string),
+
+ a.dict(d_lower),
+ a.di(dis_lower.a),
+ a.str(dis_lower.a.di_tv.vval.v_string),
+
+ a.dict(d_kupper_upper),
+ a.di(dis_kupper_upper.A),
+ a.str(dis_kupper_upper.A.di_tv.vval.v_string),
+
+ a.dict(d_kupper_lower),
+ a.di(dis_kupper_lower.A),
+ a.str(dis_kupper_lower.A.di_tv.vval.v_string),
+ })
+ eq(true, tv_dict_equal(d_upper, d_upper))
+ eq(true, tv_dict_equal(d_upper, d_upper, true))
+ eq(false, tv_dict_equal(d_upper, d_lower, false))
+ eq(true, tv_dict_equal(d_upper, d_lower, true))
+ eq(true, tv_dict_equal(d_kupper_upper, d_kupper_lower, true))
+ eq(false, tv_dict_equal(d_kupper_upper, d_lower, true))
+ eq(false, tv_dict_equal(d_kupper_upper, d_upper, true))
+ eq(true, tv_dict_equal(d_upper, d_upper, true, true))
+ alloc_log:check({})
+ end)
+ end)
+ describe('copy()', function()
+ local function tv_dict_copy(...)
+ return ffi.gc(lib.tv_dict_copy(...), lib.tv_dict_unref)
+ end
+ itp('copies NULL correctly', function()
+ eq(nil, lib.tv_dict_copy(nil, nil, true, 0))
+ eq(nil, lib.tv_dict_copy(nil, nil, false, 0))
+ eq(nil, lib.tv_dict_copy(nil, nil, true, 1))
+ eq(nil, lib.tv_dict_copy(nil, nil, false, 1))
+ end)
+ itp('copies dict correctly without converting items', function()
+ do
+ local v = {a={['ยซ']='ยป'}, b={'โ€ž'}, ['1']=1, ['ยซยป']='โ€œ', ns=null_string, nl=null_list, nd=null_dict}
+ local d_tv = lua2typvalt(v)
+ local d = d_tv.vval.v_dict
+ local dis = dict_items(d)
+ alloc_log:clear()
+
+ eq(1, dis.a.di_tv.vval.v_dict.dv_refcount)
+ eq(1, dis.b.di_tv.vval.v_list.lv_refcount)
+ local d_copy1 = tv_dict_copy(nil, d, false, 0)
+ eq(2, dis.a.di_tv.vval.v_dict.dv_refcount)
+ eq(2, dis.b.di_tv.vval.v_list.lv_refcount)
+ local dis_copy1 = dict_items(d_copy1)
+ eq(dis.a.di_tv.vval.v_dict, dis_copy1.a.di_tv.vval.v_dict)
+ eq(dis.b.di_tv.vval.v_list, dis_copy1.b.di_tv.vval.v_list)
+ eq(v, dct2tbl(d_copy1))
+ alloc_log:clear()
+ lib.tv_dict_free(ffi.gc(d_copy1, nil))
+ alloc_log:clear()
+
+ eq(1, dis.a.di_tv.vval.v_dict.dv_refcount)
+ eq(1, dis.b.di_tv.vval.v_list.lv_refcount)
+ local d_deepcopy1 = tv_dict_copy(nil, d, true, 0)
+ neq(nil, d_deepcopy1)
+ eq(1, dis.a.di_tv.vval.v_dict.dv_refcount)
+ eq(1, dis.b.di_tv.vval.v_list.lv_refcount)
+ local dis_deepcopy1 = dict_items(d_deepcopy1)
+ neq(dis.a.di_tv.vval.v_dict, dis_deepcopy1.a.di_tv.vval.v_dict)
+ neq(dis.b.di_tv.vval.v_list, dis_deepcopy1.b.di_tv.vval.v_list)
+ eq(v, dct2tbl(d_deepcopy1))
+ alloc_log:clear()
+ end
+ collectgarbage()
+ end)
+ itp('copies dict correctly and converts items', function()
+ local vc = vimconv_alloc()
+ -- UTF-8 โ†” latin1 conversions need no iconv
+ eq(OK, lib.convert_setup(vc, to_cstr('utf-8'), to_cstr('latin1')))
+
+ local v = {a={['ยซ']='ยป'}, b={'โ€ž'}, ['1']=1, ['ยซยป']='โ€œ', ns=null_string, nl=null_list, nd=null_dict}
+ local d_tv = lua2typvalt(v)
+ local d = d_tv.vval.v_dict
+ local dis = dict_items(d)
+ alloc_log:clear()
+
+ eq(1, dis.a.di_tv.vval.v_dict.dv_refcount)
+ eq(1, dis.b.di_tv.vval.v_list.lv_refcount)
+ local d_deepcopy1 = tv_dict_copy(vc, d, true, 0)
+ neq(nil, d_deepcopy1)
+ eq(1, dis.a.di_tv.vval.v_dict.dv_refcount)
+ eq(1, dis.b.di_tv.vval.v_list.lv_refcount)
+ local dis_deepcopy1 = dict_items(d_deepcopy1)
+ neq(dis.a.di_tv.vval.v_dict, dis_deepcopy1.a.di_tv.vval.v_dict)
+ neq(dis.b.di_tv.vval.v_list, dis_deepcopy1.b.di_tv.vval.v_list)
+ eq({a={['\171']='\187'}, b={'\191'}, ['1']=1, ['\171\187']='\191', ns=null_string, nl=null_list, nd=null_dict},
+ dct2tbl(d_deepcopy1))
+ alloc_log:clear_tmp_allocs()
+ alloc_log:clear()
+ end)
+ itp('returns different/same containers with(out) copyID', function()
+ local d_inner_tv = lua2typvalt({})
+ local d_tv = lua2typvalt({a=d_inner_tv, b=d_inner_tv})
+ eq(3, d_inner_tv.vval.v_dict.dv_refcount)
+ local d = d_tv.vval.v_dict
+ local dis = dict_items(d)
+ eq(dis.a.di_tv.vval.v_dict, dis.b.di_tv.vval.v_dict)
+
+ local d_copy1 = tv_dict_copy(nil, d, true, 0)
+ local dis_copy1 = dict_items(d_copy1)
+ neq(dis_copy1.a.di_tv.vval.v_dict, dis_copy1.b.di_tv.vval.v_dict)
+ eq({a={}, b={}}, dct2tbl(d_copy1))
+
+ local d_copy2 = tv_dict_copy(nil, d, true, 2)
+ local dis_copy2 = dict_items(d_copy2)
+ eq(dis_copy2.a.di_tv.vval.v_dict, dis_copy2.b.di_tv.vval.v_dict)
+ eq({a={}, b={}}, dct2tbl(d_copy2))
+
+ eq(3, d_inner_tv.vval.v_dict.dv_refcount)
+ end)
+ itp('works with self-referencing dict with copyID', function()
+ local d_tv = lua2typvalt({})
+ local d = d_tv.vval.v_dict
+ eq(1, d.dv_refcount)
+ lib.tv_dict_add_dict(d, 'test', 4, d)
+ eq(2, d.dv_refcount)
+
+ local d_copy1 = tv_dict_copy(nil, d, true, 2)
+ eq(2, d_copy1.dv_refcount)
+ local v = {}
+ v.test = v
+ eq(v, dct2tbl(d_copy1))
+
+ lib.tv_dict_clear(d)
+ eq(1, d.dv_refcount)
+
+ lib.tv_dict_clear(d_copy1)
+ eq(1, d_copy1.dv_refcount)
+ end)
+ end)
+ describe('set_keys_readonly()', function()
+ itp('works', function()
+ local d = dict({a=true})
+ local dis = dict_items(d)
+ alloc_log:check({a.dict(d), a.di(dis.a)})
+ eq(0, bit.band(dis.a.di_flags, lib.DI_FLAGS_RO))
+ eq(0, bit.band(dis.a.di_flags, lib.DI_FLAGS_FIX))
+ lib.tv_dict_set_keys_readonly(d)
+ alloc_log:check({})
+ eq(lib.DI_FLAGS_RO, bit.band(dis.a.di_flags, lib.DI_FLAGS_RO))
+ eq(lib.DI_FLAGS_FIX, bit.band(dis.a.di_flags, lib.DI_FLAGS_FIX))
+ end)
+ end)
+ end)
+ describe('tv', function()
+ describe('alloc', function()
+ describe('list ret()', function()
+ itp('works', function()
+ local rettv = typvalt(lib.VAR_UNKNOWN)
+ local l = lib.tv_list_alloc_ret(rettv, 0)
+ eq(empty_list, typvalt2lua(rettv))
+ eq(rettv.vval.v_list, l)
+ end)
+ end)
+ describe('dict ret()', function()
+ itp('works', function()
+ local rettv = typvalt(lib.VAR_UNKNOWN)
+ lib.tv_dict_alloc_ret(rettv)
+ eq({}, typvalt2lua(rettv))
+ end)
+ end)
+ end)
+ local function defalloc()
+ return {}
+ end
+ describe('clear()', function()
+ itp('works', function()
+ local function deffrees(alloc_rets)
+ local ret = {}
+ for i = #alloc_rets, 1, -1 do
+ ret[#alloc_rets - i + 1] = alloc_rets:freed(i)
+ end
+ return ret
+ end
+ alloc_log:check({})
+ lib.tv_clear(nil)
+ alloc_log:check({})
+ local ll = {}
+ local ll_l = nil
+ ll[1] = ll
+ local dd = {}
+ local dd_d = nil
+ dd.dd = dd
+ for _, v in ipairs({
+ {nil_value},
+ {null_string, nil, function() return {a.freed(alloc_log.null)} end},
+ {0},
+ {int(0)},
+ {true},
+ {false},
+ {'true', function(tv) return {a.str(tv.vval.v_string)} end},
+ {{}, function(tv) return {a.dict(tv.vval.v_dict)} end},
+ {empty_list, function(tv) return {a.list(tv.vval.v_list)} end},
+ {ll, function(tv)
+ ll_l = tv.vval.v_list
+ return {a.list(tv.vval.v_list), a.li(tv.vval.v_list.lv_first)}
+ end, defalloc},
+ {dd, function(tv)
+ dd_d = tv.vval.v_dict
+ return {a.dict(tv.vval.v_dict), a.di(first_di(tv.vval.v_dict))}
+ end, defalloc},
+ }) do
+ local tv = lua2typvalt(v[1])
+ local alloc_rets = {}
+ alloc_log:check(get_alloc_rets((v[2] or defalloc)(tv), alloc_rets))
+ lib.tv_clear(tv)
+ alloc_log:check((v[3] or deffrees)(alloc_rets))
+ end
+ eq(1, ll_l.lv_refcount)
+ eq(1, dd_d.dv_refcount)
+ end)
+ end)
+ describe('copy()', function()
+ itp('works', function()
+ local function strallocs(tv)
+ return {a.str(tv.vval.v_string)}
+ end
+ for _, v in ipairs({
+ {nil_value},
+ {null_string},
+ {0},
+ {int(0)},
+ {true},
+ {false},
+ {{}, function(tv) return {a.dict(tv.vval.v_dict)} end, nil, function(from, to)
+ eq(2, to.vval.v_dict.dv_refcount)
+ eq(to.vval.v_dict, from.vval.v_dict)
+ end},
+ {empty_list, function(tv) return {a.list(tv.vval.v_list)} end, nil, function(from, to)
+ eq(2, to.vval.v_list.lv_refcount)
+ eq(to.vval.v_list, from.vval.v_list)
+ end},
+ {'test', strallocs, strallocs, function(from, to)
+ neq(to.vval.v_string, from.vval.v_string)
+ end},
+ }) do
+ local from = lua2typvalt(v[1])
+ alloc_log:check((v[2] or defalloc)(from))
+ local to = typvalt(lib.VAR_UNKNOWN)
+ lib.tv_copy(from, to)
+ local res = v[1]
+ eq(res, typvalt2lua(to))
+ alloc_log:check((v[3] or defalloc)(to))
+ if v[4] then
+ v[4](from, to)
+ end
+ end
+ end)
+ end)
+ describe('item_lock()', function()
+ itp('does not alter VAR_PARTIAL', function()
+ local p_tv = lua2typvalt({
+ [type_key]=func_type,
+ value='tr',
+ dict={},
+ })
+ lib.tv_item_lock(p_tv, -1, true)
+ eq(lib.VAR_UNLOCKED, p_tv.vval.v_partial.pt_dict.dv_lock)
+ end)
+ itp('does not change VAR_FIXED values', function()
+ local d_tv = lua2typvalt({})
+ local l_tv = lua2typvalt(empty_list)
+ alloc_log:clear()
+ d_tv.v_lock = lib.VAR_FIXED
+ d_tv.vval.v_dict.dv_lock = lib.VAR_FIXED
+ l_tv.v_lock = lib.VAR_FIXED
+ l_tv.vval.v_list.lv_lock = lib.VAR_FIXED
+ lib.tv_item_lock(d_tv, 1, true)
+ lib.tv_item_lock(l_tv, 1, true)
+ eq(lib.VAR_FIXED, d_tv.v_lock)
+ eq(lib.VAR_FIXED, l_tv.v_lock)
+ eq(lib.VAR_FIXED, d_tv.vval.v_dict.dv_lock)
+ eq(lib.VAR_FIXED, l_tv.vval.v_list.lv_lock)
+ lib.tv_item_lock(d_tv, 1, false)
+ lib.tv_item_lock(l_tv, 1, false)
+ eq(lib.VAR_FIXED, d_tv.v_lock)
+ eq(lib.VAR_FIXED, l_tv.v_lock)
+ eq(lib.VAR_FIXED, d_tv.vval.v_dict.dv_lock)
+ eq(lib.VAR_FIXED, l_tv.vval.v_list.lv_lock)
+ alloc_log:check({})
+ end)
+ itp('works with NULL values', function()
+ local l_tv = lua2typvalt(null_list)
+ local d_tv = lua2typvalt(null_dict)
+ local s_tv = lua2typvalt(null_string)
+ alloc_log:clear()
+ lib.tv_item_lock(l_tv, 1, true)
+ lib.tv_item_lock(d_tv, 1, true)
+ lib.tv_item_lock(s_tv, 1, true)
+ eq(null_list, typvalt2lua(l_tv))
+ eq(null_dict, typvalt2lua(d_tv))
+ eq(null_string, typvalt2lua(s_tv))
+ eq(lib.VAR_LOCKED, d_tv.v_lock)
+ eq(lib.VAR_LOCKED, l_tv.v_lock)
+ eq(lib.VAR_LOCKED, s_tv.v_lock)
+ alloc_log:check({})
+ end)
+ end)
+ describe('islocked()', function()
+ itp('works with NULL values', function()
+ local l_tv = lua2typvalt(null_list)
+ local d_tv = lua2typvalt(null_dict)
+ eq(false, lib.tv_islocked(l_tv))
+ eq(false, lib.tv_islocked(d_tv))
+ end)
+ itp('works', function()
+ local tv = lua2typvalt()
+ local d_tv = lua2typvalt({})
+ local l_tv = lua2typvalt(empty_list)
+ alloc_log:clear()
+ eq(false, lib.tv_islocked(tv))
+ eq(false, lib.tv_islocked(l_tv))
+ eq(false, lib.tv_islocked(d_tv))
+ d_tv.vval.v_dict.dv_lock = lib.VAR_LOCKED
+ l_tv.vval.v_list.lv_lock = lib.VAR_LOCKED
+ eq(true, lib.tv_islocked(l_tv))
+ eq(true, lib.tv_islocked(d_tv))
+ tv.v_lock = lib.VAR_LOCKED
+ d_tv.v_lock = lib.VAR_LOCKED
+ l_tv.v_lock = lib.VAR_LOCKED
+ eq(true, lib.tv_islocked(tv))
+ eq(true, lib.tv_islocked(l_tv))
+ eq(true, lib.tv_islocked(d_tv))
+ d_tv.vval.v_dict.dv_lock = lib.VAR_UNLOCKED
+ l_tv.vval.v_list.lv_lock = lib.VAR_UNLOCKED
+ eq(true, lib.tv_islocked(tv))
+ eq(true, lib.tv_islocked(l_tv))
+ eq(true, lib.tv_islocked(d_tv))
+ tv.v_lock = lib.VAR_FIXED
+ d_tv.v_lock = lib.VAR_FIXED
+ l_tv.v_lock = lib.VAR_FIXED
+ eq(false, lib.tv_islocked(tv))
+ eq(false, lib.tv_islocked(l_tv))
+ eq(false, lib.tv_islocked(d_tv))
+ d_tv.vval.v_dict.dv_lock = lib.VAR_LOCKED
+ l_tv.vval.v_list.lv_lock = lib.VAR_LOCKED
+ eq(true, lib.tv_islocked(l_tv))
+ eq(true, lib.tv_islocked(d_tv))
+ d_tv.vval.v_dict.dv_lock = lib.VAR_FIXED
+ l_tv.vval.v_list.lv_lock = lib.VAR_FIXED
+ eq(false, lib.tv_islocked(l_tv))
+ eq(false, lib.tv_islocked(d_tv))
+ alloc_log:check({})
+ end)
+ end)
+ describe('check_lock()', function()
+ local function tv_check_lock(lock, name, name_len, emsg)
+ return check_emsg(function()
+ return lib.tv_check_lock(lock, name, name_len)
+ end, emsg)
+ end
+ itp('works', function()
+ eq(false, tv_check_lock(lib.VAR_UNLOCKED, 'test', 3))
+ eq(true, tv_check_lock(lib.VAR_LOCKED, 'test', 3,
+ 'E741: Value is locked: tes'))
+ eq(true, tv_check_lock(lib.VAR_FIXED, 'test', 3,
+ 'E742: Cannot change value of tes'))
+ eq(true, tv_check_lock(lib.VAR_LOCKED, nil, 0,
+ 'E741: Value is locked: Unknown'))
+ eq(true, tv_check_lock(lib.VAR_FIXED, nil, 0,
+ 'E742: Cannot change value of Unknown'))
+ eq(true, tv_check_lock(lib.VAR_LOCKED, nil, lib.kTVCstring,
+ 'E741: Value is locked: Unknown'))
+ eq(true, tv_check_lock(lib.VAR_FIXED, 'test', lib.kTVCstring,
+ 'E742: Cannot change value of test'))
+ end)
+ end)
+ describe('equal()', function()
+ itp('compares empty and NULL lists correctly', function()
+ local l = lua2typvalt(empty_list)
+ local l2 = lua2typvalt(empty_list)
+ local nl = lua2typvalt(null_list)
+
+ -- NULL lists are not equal to empty lists
+ eq(false, lib.tv_equal(l, nl, true, false))
+ eq(false, lib.tv_equal(nl, l, false, false))
+ eq(false, lib.tv_equal(nl, l, false, true))
+ eq(false, lib.tv_equal(l, nl, true, true))
+
+ -- Yet NULL lists are equal themselves
+ eq(true, lib.tv_equal(nl, nl, true, false))
+ eq(true, lib.tv_equal(nl, nl, false, false))
+ eq(true, lib.tv_equal(nl, nl, false, true))
+ eq(true, lib.tv_equal(nl, nl, true, true))
+
+ -- As well as empty lists
+ eq(true, lib.tv_equal(l, l, true, false))
+ eq(true, lib.tv_equal(l, l2, false, false))
+ eq(true, lib.tv_equal(l2, l, false, true))
+ eq(true, lib.tv_equal(l2, l2, true, true))
+ end)
+ -- Must not use recursive=true argument in the following tests because it
+ -- indicates that tv_equal_recurse_limit and recursive_cnt were set which
+ -- is essential. This argument will be set when comparing inner lists.
+ itp('compares lists correctly when case is not ignored', function()
+ local l1 = lua2typvalt({'abc', {1, 2, 'Abc'}, 'def'})
+ local l2 = lua2typvalt({'abc', {1, 2, 'Abc'}})
+ local l3 = lua2typvalt({'abc', {1, 2, 'Abc'}, 'Def'})
+ local l4 = lua2typvalt({'abc', {1, 2, 'Abc', 4}, 'def'})
+ local l5 = lua2typvalt({'Abc', {1, 2, 'Abc'}, 'def'})
+ local l6 = lua2typvalt({'abc', {1, 2, 'Abc'}, 'def'})
+ local l7 = lua2typvalt({'abc', {1, 2, 'abc'}, 'def'})
+ local l8 = lua2typvalt({'abc', nil, 'def'})
+ local l9 = lua2typvalt({'abc', {1, 2, nil}, 'def'})
+
+ eq(true, lib.tv_equal(l1, l1, false, false))
+ eq(false, lib.tv_equal(l1, l2, false, false))
+ eq(false, lib.tv_equal(l1, l3, false, false))
+ eq(false, lib.tv_equal(l1, l4, false, false))
+ eq(false, lib.tv_equal(l1, l5, false, false))
+ eq(true, lib.tv_equal(l1, l6, false, false))
+ eq(false, lib.tv_equal(l1, l7, false, false))
+ eq(false, lib.tv_equal(l1, l8, false, false))
+ eq(false, lib.tv_equal(l1, l9, false, false))
+ end)
+ itp('compares lists correctly when case is ignored', function()
+ local l1 = lua2typvalt({'abc', {1, 2, 'Abc'}, 'def'})
+ local l2 = lua2typvalt({'abc', {1, 2, 'Abc'}})
+ local l3 = lua2typvalt({'abc', {1, 2, 'Abc'}, 'Def'})
+ local l4 = lua2typvalt({'abc', {1, 2, 'Abc', 4}, 'def'})
+ local l5 = lua2typvalt({'Abc', {1, 2, 'Abc'}, 'def'})
+ local l6 = lua2typvalt({'abc', {1, 2, 'Abc'}, 'def'})
+ local l7 = lua2typvalt({'abc', {1, 2, 'abc'}, 'def'})
+ local l8 = lua2typvalt({'abc', nil, 'def'})
+ local l9 = lua2typvalt({'abc', {1, 2, nil}, 'def'})
+
+ eq(true, lib.tv_equal(l1, l1, true, false))
+ eq(false, lib.tv_equal(l1, l2, true, false))
+ eq(true, lib.tv_equal(l1, l3, true, false))
+ eq(false, lib.tv_equal(l1, l4, true, false))
+ eq(true, lib.tv_equal(l1, l5, true, false))
+ eq(true, lib.tv_equal(l1, l6, true, false))
+ eq(true, lib.tv_equal(l1, l7, true, false))
+ eq(false, lib.tv_equal(l1, l8, true, false))
+ eq(false, lib.tv_equal(l1, l9, true, false))
+ end)
+ local function tv_equal(d1, d2, ic, recursive)
+ return lib.tv_equal(d1, d2, ic or false, recursive or false)
+ end
+ itp('works with dictionaries', function()
+ local nd = lua2typvalt(null_dict)
+ eq(true, tv_equal(nd, nd))
+ alloc_log:check({})
+ local d1 = lua2typvalt({})
+ alloc_log:check({a.dict(d1.vval.v_dict)})
+ eq(1, d1.vval.v_dict.dv_refcount)
+ eq(false, tv_equal(nd, d1))
+ eq(false, tv_equal(d1, nd))
+ eq(true, tv_equal(d1, d1))
+ eq(1, d1.vval.v_dict.dv_refcount)
+ alloc_log:check({})
+ local d_upper = lua2typvalt({a='TEST'})
+ local dis_upper = dict_items(d_upper.vval.v_dict)
+ local d_lower = lua2typvalt({a='test'})
+ local dis_lower = dict_items(d_lower.vval.v_dict)
+ local d_kupper_upper = lua2typvalt({A='TEST'})
+ local dis_kupper_upper = dict_items(d_kupper_upper.vval.v_dict)
+ local d_kupper_lower = lua2typvalt({A='test'})
+ local dis_kupper_lower = dict_items(d_kupper_lower.vval.v_dict)
+ alloc_log:clear_tmp_allocs()
+ alloc_log:check({
+ a.dict(d_upper.vval.v_dict),
+ a.di(dis_upper.a),
+ a.str(dis_upper.a.di_tv.vval.v_string),
+
+ a.dict(d_lower.vval.v_dict),
+ a.di(dis_lower.a),
+ a.str(dis_lower.a.di_tv.vval.v_string),
+
+ a.dict(d_kupper_upper.vval.v_dict),
+ a.di(dis_kupper_upper.A),
+ a.str(dis_kupper_upper.A.di_tv.vval.v_string),
+
+ a.dict(d_kupper_lower.vval.v_dict),
+ a.di(dis_kupper_lower.A),
+ a.str(dis_kupper_lower.A.di_tv.vval.v_string),
+ })
+ eq(true, tv_equal(d_upper, d_upper))
+ eq(true, tv_equal(d_upper, d_upper, true))
+ eq(false, tv_equal(d_upper, d_lower, false))
+ eq(true, tv_equal(d_upper, d_lower, true))
+ eq(true, tv_equal(d_kupper_upper, d_kupper_lower, true))
+ eq(false, tv_equal(d_kupper_upper, d_lower, true))
+ eq(false, tv_equal(d_kupper_upper, d_upper, true))
+ eq(true, tv_equal(d_upper, d_upper, true, true))
+ alloc_log:check({})
+ end)
+ end)
+ describe('check', function()
+ describe('str_or_nr()', function()
+ itp('works', function()
+ local tv = typvalt()
+ local mem = lib.xmalloc(1)
+ tv.vval.v_list = mem -- Should crash when actually accessed
+ alloc_log:clear()
+ for _, v in ipairs({
+ {lib.VAR_NUMBER, nil},
+ {lib.VAR_FLOAT, 'E805: Expected a Number or a String, Float found'},
+ {lib.VAR_PARTIAL, 'E703: Expected a Number or a String, Funcref found'},
+ {lib.VAR_FUNC, 'E703: Expected a Number or a String, Funcref found'},
+ {lib.VAR_LIST, 'E745: Expected a Number or a String, List found'},
+ {lib.VAR_DICT, 'E728: Expected a Number or a String, Dictionary found'},
+ {lib.VAR_SPECIAL, 'E5300: Expected a Number or a String'},
+ {lib.VAR_UNKNOWN, 'E685: Internal error: tv_check_str_or_nr(UNKNOWN)'},
+ }) do
+ local typ = v[1]
+ local emsg = v[2]
+ local ret = true
+ if emsg then ret = false end
+ tv.v_type = typ
+ eq(ret, check_emsg(function() return lib.tv_check_str_or_nr(tv) end, emsg))
+ if emsg then
+ alloc_log:clear()
+ else
+ alloc_log:check({})
+ end
+ end
+ end)
+ end)
+ describe('num()', function()
+ itp('works', function()
+ local tv = typvalt()
+ local mem = lib.xmalloc(1)
+ tv.vval.v_list = mem -- Should crash when actually accessed
+ alloc_log:clear()
+ for _, v in ipairs({
+ {lib.VAR_NUMBER, nil},
+ {lib.VAR_FLOAT, 'E805: Using a Float as a Number'},
+ {lib.VAR_PARTIAL, 'E703: Using a Funcref as a Number'},
+ {lib.VAR_FUNC, 'E703: Using a Funcref as a Number'},
+ {lib.VAR_LIST, 'E745: Using a List as a Number'},
+ {lib.VAR_DICT, 'E728: Using a Dictionary as a Number'},
+ {lib.VAR_SPECIAL, nil},
+ {lib.VAR_UNKNOWN, 'E685: using an invalid value as a Number'},
+ }) do
+ local typ = v[1]
+ local emsg = v[2]
+ local ret = true
+ if emsg then ret = false end
+ tv.v_type = typ
+ eq(ret, check_emsg(function() return lib.tv_check_num(tv) end, emsg))
+ if emsg then
+ alloc_log:clear()
+ else
+ alloc_log:check({})
+ end
+ end
+ end)
+ end)
+ describe('str()', function()
+ itp('works', function()
+ local tv = typvalt()
+ local mem = lib.xmalloc(1)
+ tv.vval.v_list = mem -- Should crash when actually accessed
+ alloc_log:clear()
+ for _, v in ipairs({
+ {lib.VAR_NUMBER, nil},
+ {lib.VAR_FLOAT, 'E806: using Float as a String'},
+ {lib.VAR_PARTIAL, 'E729: using Funcref as a String'},
+ {lib.VAR_FUNC, 'E729: using Funcref as a String'},
+ {lib.VAR_LIST, 'E730: using List as a String'},
+ {lib.VAR_DICT, 'E731: using Dictionary as a String'},
+ {lib.VAR_SPECIAL, nil},
+ {lib.VAR_UNKNOWN, 'E908: using an invalid value as a String'},
+ }) do
+ local typ = v[1]
+ local emsg = v[2]
+ local ret = true
+ if emsg then ret = false end
+ tv.v_type = typ
+ eq(ret, check_emsg(function() return lib.tv_check_str(tv) end, emsg))
+ if emsg then
+ alloc_log:clear()
+ else
+ alloc_log:check({})
+ end
+ end
+ end)
+ end)
+ end)
+ describe('get', function()
+ describe('number()', function()
+ itp('works', function()
+ for _, v in ipairs({
+ {lib.VAR_NUMBER, {v_number=42}, nil, 42},
+ {lib.VAR_STRING, {v_string=to_cstr('100500')}, nil, 100500},
+ {lib.VAR_FLOAT, {v_float=42.53}, 'E805: Using a Float as a Number', 0},
+ {lib.VAR_PARTIAL, {v_partial=NULL}, 'E703: Using a Funcref as a Number', 0},
+ {lib.VAR_FUNC, {v_string=NULL}, 'E703: Using a Funcref as a Number', 0},
+ {lib.VAR_LIST, {v_list=NULL}, 'E745: Using a List as a Number', 0},
+ {lib.VAR_DICT, {v_dict=NULL}, 'E728: Using a Dictionary as a Number', 0},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarNull}, nil, 0},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarTrue}, nil, 1},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarFalse}, nil, 0},
+ {lib.VAR_UNKNOWN, nil, 'E685: Internal error: tv_get_number(UNKNOWN)', 0},
+ }) do
+ -- Using to_cstr, cannot free with tv_clear
+ local tv = ffi.gc(typvalt(v[1], v[2]), nil)
+ alloc_log:check({})
+ local emsg = v[3]
+ local ret = v[4]
+ eq(ret, check_emsg(function() return lib.tv_get_number(tv) end, emsg))
+ if emsg then
+ alloc_log:clear()
+ else
+ alloc_log:check({})
+ end
+ end
+ end)
+ end)
+ describe('number_chk()', function()
+ itp('works', function()
+ for _, v in ipairs({
+ {lib.VAR_NUMBER, {v_number=42}, nil, 42},
+ {lib.VAR_STRING, {v_string=to_cstr('100500')}, nil, 100500},
+ {lib.VAR_FLOAT, {v_float=42.53}, 'E805: Using a Float as a Number', 0},
+ {lib.VAR_PARTIAL, {v_partial=NULL}, 'E703: Using a Funcref as a Number', 0},
+ {lib.VAR_FUNC, {v_string=NULL}, 'E703: Using a Funcref as a Number', 0},
+ {lib.VAR_LIST, {v_list=NULL}, 'E745: Using a List as a Number', 0},
+ {lib.VAR_DICT, {v_dict=NULL}, 'E728: Using a Dictionary as a Number', 0},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarNull}, nil, 0},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarTrue}, nil, 1},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarFalse}, nil, 0},
+ {lib.VAR_UNKNOWN, nil, 'E685: Internal error: tv_get_number(UNKNOWN)', 0},
+ }) do
+ -- Using to_cstr, cannot free with tv_clear
+ local tv = ffi.gc(typvalt(v[1], v[2]), nil)
+ alloc_log:check({})
+ local emsg = v[3]
+ local ret = {v[4], not not emsg}
+ eq(ret, check_emsg(function()
+ local err = ffi.new('bool[1]', {false})
+ local res = lib.tv_get_number_chk(tv, err)
+ return {res, err[0]}
+ end, emsg))
+ if emsg then
+ alloc_log:clear()
+ else
+ alloc_log:check({})
+ end
+ end
+ end)
+ end)
+ describe('lnum()', function()
+ itp('works', function()
+ for _, v in ipairs({
+ {lib.VAR_NUMBER, {v_number=42}, nil, 42},
+ {lib.VAR_STRING, {v_string=to_cstr('100500')}, nil, 100500},
+ {lib.VAR_STRING, {v_string=to_cstr('.')}, nil, 46},
+ {lib.VAR_FLOAT, {v_float=42.53}, 'E805: Using a Float as a Number', -1},
+ {lib.VAR_PARTIAL, {v_partial=NULL}, 'E703: Using a Funcref as a Number', -1},
+ {lib.VAR_FUNC, {v_string=NULL}, 'E703: Using a Funcref as a Number', -1},
+ {lib.VAR_LIST, {v_list=NULL}, 'E745: Using a List as a Number', -1},
+ {lib.VAR_DICT, {v_dict=NULL}, 'E728: Using a Dictionary as a Number', -1},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarNull}, nil, 0},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarTrue}, nil, 1},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarFalse}, nil, 0},
+ {lib.VAR_UNKNOWN, nil, 'E685: Internal error: tv_get_number(UNKNOWN)', -1},
+ }) do
+ lib.curwin.w_cursor.lnum = 46
+ -- Using to_cstr, cannot free with tv_clear
+ local tv = ffi.gc(typvalt(v[1], v[2]), nil)
+ alloc_log:check({})
+ local emsg = v[3]
+ local ret = v[4]
+ eq(ret, check_emsg(function() return lib.tv_get_lnum(tv) end, emsg))
+ if emsg then
+ alloc_log:clear()
+ else
+ alloc_log:check({})
+ end
+ end
+ end)
+ end)
+ describe('float()', function()
+ itp('works', function()
+ for _, v in ipairs({
+ {lib.VAR_NUMBER, {v_number=42}, nil, 42},
+ {lib.VAR_STRING, {v_string=to_cstr('100500')}, 'E892: Using a String as a Float', 0},
+ {lib.VAR_FLOAT, {v_float=42.53}, nil, 42.53},
+ {lib.VAR_PARTIAL, {v_partial=NULL}, 'E891: Using a Funcref as a Float', 0},
+ {lib.VAR_FUNC, {v_string=NULL}, 'E891: Using a Funcref as a Float', 0},
+ {lib.VAR_LIST, {v_list=NULL}, 'E893: Using a List as a Float', 0},
+ {lib.VAR_DICT, {v_dict=NULL}, 'E894: Using a Dictionary as a Float', 0},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarNull}, 'E907: Using a special value as a Float', 0},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarTrue}, 'E907: Using a special value as a Float', 0},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarFalse}, 'E907: Using a special value as a Float', 0},
+ {lib.VAR_UNKNOWN, nil, 'E685: Internal error: tv_get_float(UNKNOWN)', 0},
+ }) do
+ -- Using to_cstr, cannot free with tv_clear
+ local tv = ffi.gc(typvalt(v[1], v[2]), nil)
+ alloc_log:check({})
+ local emsg = v[3]
+ local ret = v[4]
+ eq(ret, check_emsg(function() return lib.tv_get_float(tv) end, emsg))
+ if emsg then
+ alloc_log:clear()
+ else
+ alloc_log:check({})
+ end
+ end
+ end)
+ end)
+ describe('string()', function()
+ itp('works', function()
+ local buf = lib.tv_get_string(lua2typvalt(int(1)))
+ local buf_chk = lib.tv_get_string_chk(lua2typvalt(int(1)))
+ neq(buf, buf_chk)
+ for _, v in ipairs({
+ {lib.VAR_NUMBER, {v_number=42}, nil, '42'},
+ {lib.VAR_STRING, {v_string=to_cstr('100500')}, nil, '100500'},
+ {lib.VAR_FLOAT, {v_float=42.53}, 'E806: using Float as a String', ''},
+ {lib.VAR_PARTIAL, {v_partial=NULL}, 'E729: using Funcref as a String', ''},
+ {lib.VAR_FUNC, {v_string=NULL}, 'E729: using Funcref as a String', ''},
+ {lib.VAR_LIST, {v_list=NULL}, 'E730: using List as a String', ''},
+ {lib.VAR_DICT, {v_dict=NULL}, 'E731: using Dictionary as a String', ''},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarNull}, nil, 'null'},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarTrue}, nil, 'true'},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarFalse}, nil, 'false'},
+ {lib.VAR_UNKNOWN, nil, 'E908: using an invalid value as a String', ''},
+ }) do
+ -- Using to_cstr in place of Neovim allocated string, cannot
+ -- tv_clear() that.
+ local tv = ffi.gc(typvalt(v[1], v[2]), nil)
+ alloc_log:check({})
+ local emsg = v[3]
+ local ret = v[4]
+ eq(ret, check_emsg(function()
+ local res = lib.tv_get_string(tv)
+ if tv.v_type == lib.VAR_NUMBER or tv.v_type == lib.VAR_SPECIAL then
+ eq(buf, res)
+ else
+ neq(buf, res)
+ end
+ if res ~= nil then
+ return ffi.string(res)
+ else
+ return nil
+ end
+ end, emsg))
+ if emsg then
+ alloc_log:clear()
+ else
+ alloc_log:check({})
+ end
+ end
+ end)
+ end)
+ describe('string_chk()', function()
+ itp('works', function()
+ local buf = lib.tv_get_string_chk(lua2typvalt(int(1)))
+ for _, v in ipairs({
+ {lib.VAR_NUMBER, {v_number=42}, nil, '42'},
+ {lib.VAR_STRING, {v_string=to_cstr('100500')}, nil, '100500'},
+ {lib.VAR_FLOAT, {v_float=42.53}, 'E806: using Float as a String', nil},
+ {lib.VAR_PARTIAL, {v_partial=NULL}, 'E729: using Funcref as a String', nil},
+ {lib.VAR_FUNC, {v_string=NULL}, 'E729: using Funcref as a String', nil},
+ {lib.VAR_LIST, {v_list=NULL}, 'E730: using List as a String', nil},
+ {lib.VAR_DICT, {v_dict=NULL}, 'E731: using Dictionary as a String', nil},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarNull}, nil, 'null'},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarTrue}, nil, 'true'},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarFalse}, nil, 'false'},
+ {lib.VAR_UNKNOWN, nil, 'E908: using an invalid value as a String', nil},
+ }) do
+ -- Using to_cstr, cannot free with tv_clear
+ local tv = ffi.gc(typvalt(v[1], v[2]), nil)
+ alloc_log:check({})
+ local emsg = v[3]
+ local ret = v[4]
+ eq(ret, check_emsg(function()
+ local res = lib.tv_get_string_chk(tv)
+ if tv.v_type == lib.VAR_NUMBER or tv.v_type == lib.VAR_SPECIAL then
+ eq(buf, res)
+ else
+ neq(buf, res)
+ end
+ if res ~= nil then
+ return ffi.string(res)
+ else
+ return nil
+ end
+ end, emsg))
+ if emsg then
+ alloc_log:clear()
+ else
+ alloc_log:check({})
+ end
+ end
+ end)
+ end)
+ describe('string_buf()', function()
+ itp('works', function()
+ for _, v in ipairs({
+ {lib.VAR_NUMBER, {v_number=42}, nil, '42'},
+ {lib.VAR_STRING, {v_string=to_cstr('100500')}, nil, '100500'},
+ {lib.VAR_FLOAT, {v_float=42.53}, 'E806: using Float as a String', ''},
+ {lib.VAR_PARTIAL, {v_partial=NULL}, 'E729: using Funcref as a String', ''},
+ {lib.VAR_FUNC, {v_string=NULL}, 'E729: using Funcref as a String', ''},
+ {lib.VAR_LIST, {v_list=NULL}, 'E730: using List as a String', ''},
+ {lib.VAR_DICT, {v_dict=NULL}, 'E731: using Dictionary as a String', ''},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarNull}, nil, 'null'},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarTrue}, nil, 'true'},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarFalse}, nil, 'false'},
+ {lib.VAR_UNKNOWN, nil, 'E908: using an invalid value as a String', ''},
+ }) do
+ -- Using to_cstr, cannot free with tv_clear
+ local tv = ffi.gc(typvalt(v[1], v[2]), nil)
+ alloc_log:check({})
+ local emsg = v[3]
+ local ret = v[4]
+ eq(ret, check_emsg(function()
+ local buf = ffi.new('char[?]', lib.NUMBUFLEN, {0})
+ local res = lib.tv_get_string_buf(tv, buf)
+ if tv.v_type == lib.VAR_NUMBER or tv.v_type == lib.VAR_SPECIAL then
+ eq(buf, res)
+ else
+ neq(buf, res)
+ end
+ if res ~= nil then
+ return ffi.string(res)
+ else
+ return nil
+ end
+ end, emsg))
+ if emsg then
+ alloc_log:clear()
+ else
+ alloc_log:check({})
+ end
+ end
+ end)
+ end)
+ describe('string_buf_chk()', function()
+ itp('works', function()
+ for _, v in ipairs({
+ {lib.VAR_NUMBER, {v_number=42}, nil, '42'},
+ {lib.VAR_STRING, {v_string=to_cstr('100500')}, nil, '100500'},
+ {lib.VAR_FLOAT, {v_float=42.53}, 'E806: using Float as a String', nil},
+ {lib.VAR_PARTIAL, {v_partial=NULL}, 'E729: using Funcref as a String', nil},
+ {lib.VAR_FUNC, {v_string=NULL}, 'E729: using Funcref as a String', nil},
+ {lib.VAR_LIST, {v_list=NULL}, 'E730: using List as a String', nil},
+ {lib.VAR_DICT, {v_dict=NULL}, 'E731: using Dictionary as a String', nil},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarNull}, nil, 'null'},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarTrue}, nil, 'true'},
+ {lib.VAR_SPECIAL, {v_special=lib.kSpecialVarFalse}, nil, 'false'},
+ {lib.VAR_UNKNOWN, nil, 'E908: using an invalid value as a String', nil},
+ }) do
+ -- Using to_cstr, cannot free with tv_clear
+ local tv = ffi.gc(typvalt(v[1], v[2]), nil)
+ alloc_log:check({})
+ local emsg = v[3]
+ local ret = v[4]
+ eq(ret, check_emsg(function()
+ local buf = ffi.new('char[?]', lib.NUMBUFLEN, {0})
+ local res = lib.tv_get_string_buf_chk(tv, buf)
+ if tv.v_type == lib.VAR_NUMBER or tv.v_type == lib.VAR_SPECIAL then
+ eq(buf, res)
+ else
+ neq(buf, res)
+ end
+ if res ~= nil then
+ return ffi.string(res)
+ else
+ return nil
+ end
+ end, emsg))
+ if emsg then
+ alloc_log:clear()
+ else
+ alloc_log:check({})
+ end
+ end
+ end)
+ end)
+ end)
+ end)
+end)
diff --git a/test/unit/fileio_spec.lua b/test/unit/fileio_spec.lua
index 3e3c36617d..066d013b19 100644
--- a/test/unit/fileio_spec.lua
+++ b/test/unit/fileio_spec.lua
@@ -1,4 +1,5 @@
-local helpers = require("test.unit.helpers")
+local helpers = require("test.unit.helpers")(after_each)
+local itp = helpers.gen_itp(it)
--{:cimport, :internalize, :eq, :neq, :ffi, :lib, :cstr, :to_cstr} = require 'test.unit.helpers'
local eq = helpers.eq
@@ -16,67 +17,67 @@ describe('file_pat functions', function()
return ffi.string(res)
end
- it('returns ^path$ regex for literal path input', function()
+ itp('returns ^path$ regex for literal path input', function()
eq( '^path$', file_pat_to_reg_pat('path'))
end)
- it('does not prepend ^ when there is a starting glob (*)', function()
+ itp('does not prepend ^ when there is a starting glob (*)', function()
eq('path$', file_pat_to_reg_pat('*path'))
end)
- it('does not append $ when there is an ending glob (*)', function()
+ itp('does not append $ when there is an ending glob (*)', function()
eq('^path', file_pat_to_reg_pat('path*'))
end)
- it('does not include ^ or $ when surrounded by globs (*)', function()
+ itp('does not include ^ or $ when surrounded by globs (*)', function()
eq('path', file_pat_to_reg_pat('*path*'))
end)
- it('replaces the bash any character (?) with the regex any character (.)', function()
+ itp('replaces the bash any character (?) with the regex any character (.)', function()
eq('^foo.bar$', file_pat_to_reg_pat('foo?bar'))
end)
- it('replaces a glob (*) in the middle of a path with regex multiple any character (.*)',
+ itp('replaces a glob (*) in the middle of a path with regex multiple any character (.*)',
function()
eq('^foo.*bar$', file_pat_to_reg_pat('foo*bar'))
end)
- it([[unescapes \? to ?]], function()
+ itp([[unescapes \? to ?]], function()
eq('^foo?bar$', file_pat_to_reg_pat([[foo\?bar]]))
end)
- it([[unescapes \% to %]], function()
+ itp([[unescapes \% to %]], function()
eq('^foo%bar$', file_pat_to_reg_pat([[foo\%bar]]))
end)
- it([[unescapes \, to ,]], function()
+ itp([[unescapes \, to ,]], function()
eq('^foo,bar$', file_pat_to_reg_pat([[foo\,bar]]))
end)
- it([[unescapes '\ ' to ' ']], function()
+ itp([[unescapes '\ ' to ' ']], function()
eq('^foo bar$', file_pat_to_reg_pat([[foo\ bar]]))
end)
- it([[escapes . to \.]], function()
+ itp([[escapes . to \.]], function()
eq([[^foo\.bar$]], file_pat_to_reg_pat('foo.bar'))
end)
- it('Converts bash brace expansion {a,b} to regex options (a|b)', function()
+ itp('Converts bash brace expansion {a,b} to regex options (a|b)', function()
eq([[^foo\(bar\|baz\)$]], file_pat_to_reg_pat('foo{bar,baz}'))
end)
- it('Collapses multiple consecutive * into a single character', function()
+ itp('Collapses multiple consecutive * into a single character', function()
eq([[^foo.*bar$]], file_pat_to_reg_pat('foo*******bar'))
eq([[foobar$]], file_pat_to_reg_pat('********foobar'))
eq([[^foobar]], file_pat_to_reg_pat('foobar********'))
end)
- it('Does not escape ^', function()
+ itp('Does not escape ^', function()
eq([[^^blah$]], file_pat_to_reg_pat('^blah'))
eq([[^foo^bar$]], file_pat_to_reg_pat('foo^bar'))
end)
- it('Does not escape $', function()
+ itp('Does not escape $', function()
eq([[^blah$$]], file_pat_to_reg_pat('blah$'))
eq([[^foo$bar$]], file_pat_to_reg_pat('foo$bar'))
end)
diff --git a/test/unit/fixtures/multiqueue.c b/test/unit/fixtures/multiqueue.c
new file mode 100644
index 0000000000..a8dca0a844
--- /dev/null
+++ b/test/unit/fixtures/multiqueue.c
@@ -0,0 +1,19 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+#include <string.h>
+#include <stdlib.h>
+#include "nvim/event/multiqueue.h"
+#include "multiqueue.h"
+
+
+void ut_multiqueue_put(MultiQueue *this, const char *str)
+{
+ multiqueue_put(this, NULL, 1, str);
+}
+
+const char *ut_multiqueue_get(MultiQueue *this)
+{
+ Event event = multiqueue_get(this);
+ return event.argv[0];
+}
diff --git a/test/unit/fixtures/multiqueue.h b/test/unit/fixtures/multiqueue.h
new file mode 100644
index 0000000000..78a3a89063
--- /dev/null
+++ b/test/unit/fixtures/multiqueue.h
@@ -0,0 +1,4 @@
+#include "nvim/event/multiqueue.h"
+
+void ut_multiqueue_put(MultiQueue *queue, const char *str);
+const char *ut_multiqueue_get(MultiQueue *queue);
diff --git a/test/unit/fixtures/posix.h b/test/unit/fixtures/posix.h
new file mode 100644
index 0000000000..f6f24cd9dc
--- /dev/null
+++ b/test/unit/fixtures/posix.h
@@ -0,0 +1,11 @@
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/wait.h>
+#include <stdlib.h>
+
+enum {
+ kPOSIXErrnoEINTR = EINTR,
+ kPOSIXErrnoECHILD = ECHILD,
+ kPOSIXWaitWUNTRACED = WUNTRACED,
+};
diff --git a/test/unit/fixtures/queue.c b/test/unit/fixtures/queue.c
deleted file mode 100644
index bbb6274b21..0000000000
--- a/test/unit/fixtures/queue.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <string.h>
-#include <stdlib.h>
-#include "nvim/event/queue.h"
-#include "queue.h"
-
-
-void ut_queue_put(Queue *queue, const char *str)
-{
- queue_put(queue, NULL, 1, str);
-}
-
-const char *ut_queue_get(Queue *queue)
-{
- Event event = queue_get(queue);
- return event.argv[0];
-}
diff --git a/test/unit/fixtures/queue.h b/test/unit/fixtures/queue.h
deleted file mode 100644
index ae949c9f29..0000000000
--- a/test/unit/fixtures/queue.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#include "nvim/event/queue.h"
-
-void ut_queue_put(Queue *queue, const char *str);
-const char *ut_queue_get(Queue *queue);
diff --git a/test/unit/fixtures/rbuffer.c b/test/unit/fixtures/rbuffer.c
index d587d6b054..3f4062fa18 100644
--- a/test/unit/fixtures/rbuffer.c
+++ b/test/unit/fixtures/rbuffer.c
@@ -1,3 +1,6 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
#include "nvim/rbuffer.h"
#include "rbuffer.h"
diff --git a/test/unit/formatc.lua b/test/unit/formatc.lua
index 00637e0b8d..2fd37c599a 100644
--- a/test/unit/formatc.lua
+++ b/test/unit/formatc.lua
@@ -65,11 +65,12 @@ local tokens = P { "tokens";
identifier = Ct(C(R("az","AZ","__") * R("09","az","AZ","__")^0) * Cc"identifier"),
-- Single character in a string
- string_char = R("az","AZ","09") + S"$%^&*()_-+={[}]:;@~#<,>.!?/ \t" + (P"\\" * S[[ntvbrfa\?'"0x]]),
+ sstring_char = R("\001&","([","]\255") + (P"\\" * S[[ntvbrfa\?'"0x]]),
+ dstring_char = R("\001!","#[","]\255") + (P"\\" * S[[ntvbrfa\?'"0x]]),
-- String literal
- string = Ct(C(P"'" * (V"string_char" + P'"')^0 * P"'" +
- P'"' * (V"string_char" + P"'")^0 * P'"') * Cc"string"),
+ string = Ct(C(P"'" * (V"sstring_char" + P'"')^0 * P"'" +
+ P'"' * (V"dstring_char" + P"'")^0 * P'"') * Cc"string"),
-- Operator
operator = Ct(C(P">>=" + P"<<=" + P"..." +
@@ -219,13 +220,7 @@ local function standalone(...) -- luacheck: ignore
Preprocess.add_to_include_path('./../../build/include')
Preprocess.add_to_include_path('./../../.deps/usr/include')
- local input = Preprocess.preprocess_stream(arg[1])
- local raw = input:read('*all')
- input:close()
-
- if raw == nil then
- print("ERROR: Preprocess.preprocess_stream():read() returned empty")
- end
+ local raw = Preprocess.preprocess('', arg[1])
local formatted
if #arg == 2 and arg[2] == 'no' then
diff --git a/test/unit/garray_spec.lua b/test/unit/garray_spec.lua
index 9694e3c427..28df8a6e3f 100644
--- a/test/unit/garray_spec.lua
+++ b/test/unit/garray_spec.lua
@@ -1,4 +1,5 @@
-local helpers = require("test.unit.helpers")
+local helpers = require("test.unit.helpers")(after_each)
+local itp = helpers.gen_itp(it)
local cimport = helpers.cimport
local internalize = helpers.internalize
@@ -8,7 +9,7 @@ local ffi = helpers.ffi
local to_cstr = helpers.to_cstr
local NULL = helpers.NULL
-local garray = cimport('stdlib.h', './src/nvim/garray.h')
+local garray = cimport('./src/nvim/garray.h')
local itemsize = 14
local growsize = 95
@@ -156,7 +157,7 @@ local ga_append_ints = function(garr, ...)
end
-- enhanced constructors
-local garray_ctype = ffi.typeof('garray_T[1]')
+local garray_ctype = function(...) return ffi.typeof('garray_T[1]')(...) end
local new_garray = function()
local garr = garray_ctype()
return ffi.gc(garr, ga_clear)
@@ -183,7 +184,7 @@ end
describe('garray', function()
describe('ga_init', function()
- it('initializes the values of the garray', function()
+ itp('initializes the values of the garray', function()
local garr = new_garray()
ga_init(garr, itemsize, growsize)
eq(0, ga_len(garr))
@@ -198,31 +199,31 @@ describe('garray', function()
local function new_and_grow(itemsize_, growsize_, req)
local garr = new_garray()
ga_init(garr, itemsize_, growsize_)
- eq(0, ga_size(garr)) -- should be 0 at first
- eq(NULL, ga_data(garr)) -- should be NULL
+ eq(0, ga_size(garr)) -- should be 0 at first
+ eq(NULL, ga_data(garr)) -- should be NULL
ga_grow(garr, req) -- add space for `req` items
return garr
end
- it('grows by growsize items if num < growsize', function()
+ itp('grows by growsize items if num < growsize', function()
itemsize = 16
growsize = 4
local grow_by = growsize - 1
local garr = new_and_grow(itemsize, growsize, grow_by)
- neq(NULL, ga_data(garr)) -- data should be a ptr to memory
+ neq(NULL, ga_data(garr)) -- data should be a ptr to memory
eq(growsize, ga_maxlen(garr)) -- we requested LESS than growsize, so...
end)
- it('grows by num items if num > growsize', function()
+ itp('grows by num items if num > growsize', function()
itemsize = 16
growsize = 4
local grow_by = growsize + 1
local garr = new_and_grow(itemsize, growsize, grow_by)
- neq(NULL, ga_data(garr)) -- data should be a ptr to memory
+ neq(NULL, ga_data(garr)) -- data should be a ptr to memory
eq(grow_by, ga_maxlen(garr)) -- we requested MORE than growsize, so...
end)
- it('does not grow when nothing is requested', function()
+ itp('does not grow when nothing is requested', function()
local garr = new_and_grow(16, 4, 0)
eq(NULL, ga_data(garr))
eq(0, ga_maxlen(garr))
@@ -230,7 +231,7 @@ describe('garray', function()
end)
describe('ga_clear', function()
- it('clears an already allocated array', function()
+ itp('clears an already allocated array', function()
-- allocate and scramble an array
local garr = garray_ctype()
ga_init(garr, itemsize, growsize)
@@ -247,7 +248,7 @@ describe('garray', function()
end)
describe('ga_append', function()
- it('can append bytes', function()
+ itp('can append bytes', function()
-- this is the actual ga_append, the others are just emulated lua
-- versions
local garr = new_garray()
@@ -262,7 +263,7 @@ describe('garray', function()
eq('hello', ffi.string(bytes))
end)
- it('can append integers', function()
+ itp('can append integers', function()
local garr = new_garray()
ga_init(garr, ffi.sizeof("int"), 1)
local input = {
@@ -279,7 +280,7 @@ describe('garray', function()
end
end)
- it('can append strings to a growing array of strings', function()
+ itp('can append strings to a growing array of strings', function()
local garr = new_string_garray()
local input = {
"some",
@@ -298,7 +299,7 @@ describe('garray', function()
end)
describe('ga_concat', function()
- it('concatenates the parameter to the growing byte array', function()
+ itp('concatenates the parameter to the growing byte array', function()
local garr = new_garray()
ga_init(garr, ffi.sizeof("char"), 1)
local str = "ohwellโ—โ—"
@@ -329,11 +330,11 @@ describe('garray', function()
end
describe('ga_concat_strings', function()
- it('returns an empty string when concatenating an empty array', function()
+ itp('returns an empty string when concatenating an empty array', function()
test_concat_fn({ }, ga_concat_strings)
end)
- it('can concatenate a non-empty array', function()
+ itp('can concatenate a non-empty array', function()
test_concat_fn({
'oh',
'my',
@@ -343,11 +344,11 @@ describe('garray', function()
end)
describe('ga_concat_strings_sep', function()
- it('returns an empty string when concatenating an empty array', function()
+ itp('returns an empty string when concatenating an empty array', function()
test_concat_fn({ }, ga_concat_strings_sep, '---')
end)
- it('can concatenate a non-empty array', function()
+ itp('can concatenate a non-empty array', function()
local sep = '-โ—โ—-'
test_concat_fn({
'oh',
@@ -358,7 +359,7 @@ describe('garray', function()
end)
describe('ga_remove_duplicate_strings', function()
- it('sorts and removes duplicate strings', function()
+ itp('sorts and removes duplicate strings', function()
local garr = new_string_garray()
local input = {
'ccc',
diff --git a/test/unit/helpers.lua b/test/unit/helpers.lua
index 91da459393..f8143a0125 100644
--- a/test/unit/helpers.lua
+++ b/test/unit/helpers.lua
@@ -4,25 +4,129 @@ local Set = require('test.unit.set')
local Preprocess = require('test.unit.preprocess')
local Paths = require('test.config.paths')
local global_helpers = require('test.helpers')
+local assert = require('luassert')
+local say = require('say')
+local posix = nil
+local syscall = nil
+
+local check_cores = global_helpers.check_cores
+local dedent = global_helpers.dedent
local neq = global_helpers.neq
+local map = global_helpers.map
local eq = global_helpers.eq
local ok = global_helpers.ok
+-- C constants.
+local NULL = ffi.cast('void*', 0)
+
+local OK = 1
+local FAIL = 0
+
+local cimport
+
-- add some standard header locations
for _, p in ipairs(Paths.include_paths) do
Preprocess.add_to_include_path(p)
end
--- load neovim shared library
-local libnvim = ffi.load(Paths.test_libnvim_path)
+local child_pid = nil
+local function only_separate(func)
+ return function(...)
+ if child_pid ~= 0 then
+ error('This function must be run in a separate process only')
+ end
+ return func(...)
+ end
+end
+local child_calls_init = {}
+local child_calls_mod = nil
+local child_calls_mod_once = nil
+local function child_call(func, ret)
+ return function(...)
+ local child_calls = child_calls_mod or child_calls_init
+ if child_pid ~= 0 then
+ child_calls[#child_calls + 1] = {func=func, args={...}}
+ return ret
+ else
+ return func(...)
+ end
+ end
+end
+
+-- Run some code at the start of the child process, before running the test
+-- itself. Is supposed to be run in `before_each`.
+local function child_call_once(func, ...)
+ if child_pid ~= 0 then
+ child_calls_mod_once[#child_calls_mod_once + 1] = {
+ func=func, args={...}}
+ else
+ func(...)
+ end
+end
+
+local child_cleanups_mod_once = nil
+
+-- Run some code at the end of the child process, before exiting. Is supposed to
+-- be run in `before_each` because `after_each` is run after child has exited.
+local function child_cleanup_once(func, ...)
+ local child_cleanups = child_cleanups_mod_once
+ if child_pid ~= 0 then
+ child_cleanups[#child_cleanups + 1] = {func=func, args={...}}
+ else
+ func(...)
+ end
+end
+
+local libnvim = nil
+
+local lib = setmetatable({}, {
+ __index = only_separate(function(_, idx)
+ return libnvim[idx]
+ end),
+ __newindex = child_call(function(_, idx, val)
+ libnvim[idx] = val
+ end),
+})
+
+local init = only_separate(function()
+ -- load neovim shared library
+ libnvim = ffi.load(Paths.test_libnvim_path)
+ for _, c in ipairs(child_calls_init) do
+ c.func(unpack(c.args))
+ end
+ libnvim.time_init()
+ libnvim.early_init()
+ libnvim.event_init()
+ if child_calls_mod then
+ for _, c in ipairs(child_calls_mod) do
+ c.func(unpack(c.args))
+ end
+ end
+ if child_calls_mod_once then
+ for _, c in ipairs(child_calls_mod_once) do
+ c.func(unpack(c.args))
+ end
+ child_calls_mod_once = nil
+ end
+end)
+
+local deinit = only_separate(function()
+ if child_cleanups_mod_once then
+ for _, c in ipairs(child_cleanups_mod_once) do
+ c.func(unpack(c.args))
+ end
+ child_cleanups_mod_once = nil
+ end
+end)
local function trim(s)
return s:match('^%s*(.*%S)') or ''
end
-- a Set that keeps around the lines we've already seen
-local cdefs = Set:new()
+local cdefs_init = Set:new()
+local cdefs_mod = nil
local imported = Set:new()
local pragma_pack_id = 1
@@ -34,8 +138,10 @@ local function filter_complex_blocks(body)
for line in body:gmatch("[^\r\n]+") do
if not (string.find(line, "(^)", 1, true) ~= nil
or string.find(line, "_ISwupper", 1, true)
+ or string.find(line, "_Float")
or string.find(line, "msgpack_zone_push_finalizer")
or string.find(line, "msgpack_unpacker_reserve_buffer")
+ or string.find(line, "UUID_NULL") -- static const uuid_t UUID_NULL = {...}
or string.find(line, "inline _Bool")) then
result[#result + 1] = line
end
@@ -44,117 +150,695 @@ local function filter_complex_blocks(body)
return table.concat(result, "\n")
end
+
+local cdef = ffi.cdef
+
+local cimportstr
+
+local previous_defines_init = ''
+local preprocess_cache_init = {}
+local previous_defines_mod = ''
+local preprocess_cache_mod = nil
+
+local function is_child_cdefs()
+ return (os.getenv('NVIM_TEST_MAIN_CDEFS') ~= '1')
+end
+
-- use this helper to import C files, you can pass multiple paths at once,
-- this helper will return the C namespace of the nvim library.
-local function cimport(...)
- local paths = {}
- local args = {...}
+cimport = function(...)
+ local previous_defines, preprocess_cache, cdefs
+ if is_child_cdefs() and preprocess_cache_mod then
+ preprocess_cache = preprocess_cache_mod
+ previous_defines = previous_defines_mod
+ cdefs = cdefs_mod
+ else
+ preprocess_cache = preprocess_cache_init
+ previous_defines = previous_defines_init
+ cdefs = cdefs_init
+ end
+ for _, path in ipairs({...}) do
+ if not (path:sub(1, 1) == '/' or path:sub(1, 1) == '.'
+ or path:sub(2, 2) == ':') then
+ path = './' .. path
+ end
+ if not preprocess_cache[path] then
+ local body
+ body, previous_defines = Preprocess.preprocess(previous_defines, path)
+ -- format it (so that the lines are "unique" statements), also filter out
+ -- Objective-C blocks
+ if os.getenv('NVIM_TEST_PRINT_I') == '1' then
+ local lnum = 0
+ for line in body:gmatch('[^\n]+') do
+ lnum = lnum + 1
+ print(lnum, line)
+ end
+ end
+ body = formatc(body)
+ body = filter_complex_blocks(body)
+ -- add the formatted lines to a set
+ local new_cdefs = Set:new()
+ for line in body:gmatch("[^\r\n]+") do
+ line = trim(line)
+ -- give each #pragma pack an unique id, so that they don't get removed
+ -- if they are inserted into the set
+ -- (they are needed in the right order with the struct definitions,
+ -- otherwise luajit has wrong memory layouts for the sturcts)
+ if line:match("#pragma%s+pack") then
+ line = line .. " // " .. pragma_pack_id
+ pragma_pack_id = pragma_pack_id + 1
+ end
+ new_cdefs:add(line)
+ end
+
+ -- subtract the lines we've already imported from the new lines, then add
+ -- the new unique lines to the old lines (so they won't be imported again)
+ new_cdefs:diff(cdefs)
+ cdefs:union(new_cdefs)
+ -- request a sorted version of the new lines (same relative order as the
+ -- original preprocessed file) and feed that to the LuaJIT ffi
+ local new_lines = new_cdefs:to_table()
+ if os.getenv('NVIM_TEST_PRINT_CDEF') == '1' then
+ for lnum, line in ipairs(new_lines) do
+ print(lnum, line)
+ end
+ end
+ body = table.concat(new_lines, '\n')
- -- filter out paths we've already imported
- for _,path in pairs(args) do
- if path ~= nil and not imported:contains(path) then
- paths[#paths + 1] = path
+ preprocess_cache[path] = body
end
+ cimportstr(preprocess_cache, path)
end
+ return lib
+end
- for _,path in pairs(paths) do
- imported:add(path)
+local cimport_immediate = function(...)
+ local saved_pid = child_pid
+ child_pid = 0
+ local err, emsg = pcall(cimport, ...)
+ child_pid = saved_pid
+ if not err then
+ emsg = tostring(emsg)
+ io.stderr:write(emsg .. '\n')
+ assert(false)
+ else
+ return lib
end
+end
- if #paths == 0 then
- return libnvim
+local function _cimportstr(preprocess_cache, path)
+ if imported:contains(path) then
+ return lib
end
+ local body = preprocess_cache[path]
+ if body == '' then
+ return lib
+ end
+ cdef(body)
+ imported:add(path)
+
+ return lib
+end
+
+if is_child_cdefs() then
+ cimportstr = child_call(_cimportstr, lib)
+else
+ cimportstr = _cimportstr
+end
- local body = nil
- for _ = 1, 10 do
- local stream = Preprocess.preprocess_stream(unpack(paths))
- body = stream:read("*a")
- stream:close()
- if body ~= nil then break end
+local function alloc_log_new()
+ local log = {
+ log={},
+ lib=cimport('./src/nvim/memory.h'),
+ original_functions={},
+ null={['\0:is_null']=true},
+ }
+ local allocator_functions = {'malloc', 'free', 'calloc', 'realloc'}
+ function log:save_original_functions()
+ for _, funcname in ipairs(allocator_functions) do
+ if not self.original_functions[funcname] then
+ self.original_functions[funcname] = self.lib['mem_' .. funcname]
+ end
+ end
end
+ log.save_original_functions = child_call(log.save_original_functions)
+ function log:set_mocks()
+ for _, k in ipairs(allocator_functions) do
+ do
+ local kk = k
+ self.lib['mem_' .. k] = function(...)
+ local log_entry = {func=kk, args={...}}
+ self.log[#self.log + 1] = log_entry
+ if kk == 'free' then
+ self.original_functions[kk](...)
+ else
+ log_entry.ret = self.original_functions[kk](...)
+ end
+ for i, v in ipairs(log_entry.args) do
+ if v == nil then
+ -- XXX This thing thinks that {NULL} ~= {NULL}.
+ log_entry.args[i] = self.null
+ end
+ end
+ if self.hook then self:hook(log_entry) end
+ if log_entry.ret then
+ return log_entry.ret
+ end
+ end
+ end
+ end
+ end
+ log.set_mocks = child_call(log.set_mocks)
+ function log:clear()
+ self.log = {}
+ end
+ function log:check(exp)
+ eq(exp, self.log)
+ self:clear()
+ end
+ function log:clear_tmp_allocs(clear_null_frees)
+ local toremove = {}
+ local allocs = {}
+ for i, v in ipairs(self.log) do
+ if v.func == 'malloc' or v.func == 'calloc' then
+ allocs[tostring(v.ret)] = i
+ elseif v.func == 'realloc' or v.func == 'free' then
+ if allocs[tostring(v.args[1])] then
+ toremove[#toremove + 1] = allocs[tostring(v.args[1])]
+ if v.func == 'free' then
+ toremove[#toremove + 1] = i
+ end
+ elseif clear_null_frees and v.args[1] == self.null then
+ toremove[#toremove + 1] = i
+ end
+ if v.func == 'realloc' then
+ allocs[tostring(v.ret)] = i
+ end
+ end
+ end
+ table.sort(toremove)
+ for i = #toremove,1,-1 do
+ table.remove(self.log, toremove[i])
+ end
+ end
+ function log:restore_original_functions()
+ -- Do nothing: set mocks live in a separate process
+ return
+ --[[
+ [ for k, v in pairs(self.original_functions) do
+ [ self.lib['mem_' .. k] = v
+ [ end
+ ]]
+ end
+ function log:setup()
+ log:save_original_functions()
+ log:set_mocks()
+ end
+ function log:before_each()
+ return
+ end
+ function log:after_each()
+ log:restore_original_functions()
+ end
+ log:setup()
+ return log
+end
- if body == nil then
- print("ERROR: helpers.lua: Preprocess.preprocess_stream():read() returned empty")
+-- take a pointer to a C-allocated string and return an interned
+-- version while also freeing the memory
+local function internalize(cdata, len)
+ ffi.gc(cdata, ffi.C.free)
+ return ffi.string(cdata, len)
+end
+
+local cstr = ffi.typeof('char[?]')
+local function to_cstr(string)
+ return cstr(#string + 1, string)
+end
+
+local sc
+
+if posix ~= nil then
+ sc = {
+ fork = posix.fork,
+ pipe = posix.pipe,
+ read = posix.read,
+ write = posix.write,
+ close = posix.close,
+ wait = posix.wait,
+ exit = posix._exit,
+ }
+elseif syscall ~= nil then
+ sc = {
+ fork = syscall.fork,
+ pipe = function()
+ local ret = {syscall.pipe()}
+ return ret[3], ret[4]
+ end,
+ read = function(rd, len)
+ return rd:read(nil, len)
+ end,
+ write = function(wr, s)
+ return wr:write(s)
+ end,
+ close = function(p)
+ return p:close()
+ end,
+ wait = syscall.wait,
+ exit = syscall.exit,
+ }
+else
+ cimport_immediate('./test/unit/fixtures/posix.h')
+ sc = {
+ fork = function()
+ return tonumber(ffi.C.fork())
+ end,
+ pipe = function()
+ local ret = ffi.new('int[2]', {-1, -1})
+ ffi.errno(0)
+ local res = ffi.C.pipe(ret)
+ if (res ~= 0) then
+ local err = ffi.errno(0)
+ assert(res == 0, ("pipe() error: %u: %s"):format(
+ err, ffi.string(ffi.C.strerror(err))))
+ end
+ assert(ret[0] ~= -1 and ret[1] ~= -1)
+ return ret[0], ret[1]
+ end,
+ read = function(rd, len)
+ local ret = ffi.new('char[?]', len, {0})
+ local total_bytes_read = 0
+ ffi.errno(0)
+ while total_bytes_read < len do
+ local bytes_read = tonumber(ffi.C.read(
+ rd,
+ ffi.cast('void*', ret + total_bytes_read),
+ len - total_bytes_read))
+ if bytes_read == -1 then
+ local err = ffi.errno(0)
+ if err ~= ffi.C.kPOSIXErrnoEINTR then
+ assert(false, ("read() error: %u: %s"):format(
+ err, ffi.string(ffi.C.strerror(err))))
+ end
+ elseif bytes_read == 0 then
+ break
+ else
+ total_bytes_read = total_bytes_read + bytes_read
+ end
+ end
+ return ffi.string(ret, total_bytes_read)
+ end,
+ write = function(wr, s)
+ local wbuf = to_cstr(s)
+ local total_bytes_written = 0
+ ffi.errno(0)
+ while total_bytes_written < #s do
+ local bytes_written = tonumber(ffi.C.write(
+ wr,
+ ffi.cast('void*', wbuf + total_bytes_written),
+ #s - total_bytes_written))
+ if bytes_written == -1 then
+ local err = ffi.errno(0)
+ if err ~= ffi.C.kPOSIXErrnoEINTR then
+ assert(false, ("write() error: %u: %s"):format(
+ err, ffi.string(ffi.C.strerror(err))))
+ end
+ elseif bytes_written == 0 then
+ break
+ else
+ total_bytes_written = total_bytes_written + bytes_written
+ end
+ end
+ return total_bytes_written
+ end,
+ close = ffi.C.close,
+ wait = function(pid)
+ ffi.errno(0)
+ while true do
+ local r = ffi.C.waitpid(pid, nil, ffi.C.kPOSIXWaitWUNTRACED)
+ if r == -1 then
+ local err = ffi.errno(0)
+ if err == ffi.C.kPOSIXErrnoECHILD then
+ break
+ elseif err ~= ffi.C.kPOSIXErrnoEINTR then
+ assert(false, ("waitpid() error: %u: %s"):format(
+ err, ffi.string(ffi.C.strerror(err))))
+ end
+ else
+ assert(r == pid)
+ end
+ end
+ end,
+ exit = ffi.C._exit,
+ }
+end
+
+local function format_list(lst)
+ local ret = ''
+ for _, v in ipairs(lst) do
+ if ret ~= '' then ret = ret .. ', ' end
+ ret = ret .. assert:format({v, n=1})[1]
end
+ return ret
+end
- -- format it (so that the lines are "unique" statements), also filter out
- -- Objective-C blocks
- body = formatc(body)
- body = filter_complex_blocks(body)
+if os.getenv('NVIM_TEST_PRINT_SYSCALLS') == '1' then
+ for k_, v_ in pairs(sc) do
+ (function(k, v)
+ sc[k] = function(...)
+ local rets = {v(...)}
+ io.stderr:write(('%s(%s) = %s\n'):format(k, format_list({...}),
+ format_list(rets)))
+ return unpack(rets)
+ end
+ end)(k_, v_)
+ end
+end
- -- add the formatted lines to a set
- local new_cdefs = Set:new()
- for line in body:gmatch("[^\r\n]+") do
- line = trim(line)
- -- give each #pragma pack an unique id, so that they don't get removed
- -- if they are inserted into the set
- -- (they are needed in the right order with the struct definitions,
- -- otherwise luajit has wrong memory layouts for the sturcts)
- if line:match("#pragma%s+pack") then
- line = line .. " // " .. pragma_pack_id
- pragma_pack_id = pragma_pack_id + 1
+local function just_fail(_)
+ return false
+end
+say:set('assertion.just_fail.positive', '%s')
+say:set('assertion.just_fail.negative', '%s')
+assert:register('assertion', 'just_fail', just_fail,
+ 'assertion.just_fail.positive',
+ 'assertion.just_fail.negative')
+
+local hook_fnamelen = 30
+local hook_sfnamelen = 30
+local hook_numlen = 5
+local hook_msglen = 1 + 1 + 1 + (1 + hook_fnamelen) + (1 + hook_sfnamelen) + (1 + hook_numlen) + 1
+
+local tracehelp = dedent([[
+ Trace: either in the format described below or custom debug output starting
+ with `>`. Latter lines still have the same width in byte.
+
+ โ”Œ Trace type: _r_eturn from function , function _c_all, _l_ine executed,
+ โ”‚ _t_ail return, _C_ount (should not actually appear),
+ โ”‚ _s_aved from previous run for reference, _>_ for custom debug
+ โ”‚ output.
+ โ”‚โ” Function type: _L_ua function, _C_ function, _m_ain part of chunk,
+ โ”‚โ”ƒ function that did _t_ail call.
+ โ”‚โ”ƒโ”Œ Function name type: _g_lobal, _l_ocal, _m_ethod, _f_ield, _u_pvalue,
+ โ”‚โ”ƒโ”‚ space for unknown.
+ โ”‚โ”ƒโ”‚ โ” Source file name โ”Œ Function name โ” Line
+ โ”‚โ”ƒโ”‚ โ”ƒ (trunc to 30 bytes, no .lua) โ”‚ (truncated to last 30 bytes) โ”ƒ number
+ CWN SSSSSSSSSSSSSSSSSSSSSSSSSSSSSS:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:LLLLL\n
+]])
+
+local function child_sethook(wr)
+ local trace_level = os.getenv('NVIM_TEST_TRACE_LEVEL')
+ if not trace_level or trace_level == '' then
+ trace_level = 1
+ else
+ trace_level = tonumber(trace_level)
+ end
+ if trace_level <= 0 then
+ return
+ end
+ local trace_only_c = trace_level <= 1
+ local prev_info, prev_reason, prev_lnum
+ local function hook(reason, lnum, use_prev)
+ local info = nil
+ if use_prev then
+ info = prev_info
+ elseif reason ~= 'tail return' then -- tail return
+ info = debug.getinfo(2, 'nSl')
+ end
+
+ if trace_only_c and (not info or info.what ~= 'C') and not use_prev then
+ if info.source:sub(-9) == '_spec.lua' then
+ prev_info = info
+ prev_reason = 'saved'
+ prev_lnum = lnum
+ end
+ return
+ end
+ if trace_only_c and not use_prev and prev_reason then
+ hook(prev_reason, prev_lnum, true)
+ prev_reason = nil
end
- new_cdefs:add(line)
+
+ local whatchar = ' '
+ local namewhatchar = ' '
+ local funcname = ''
+ local source = ''
+ local msgchar = reason:sub(1, 1)
+
+ if reason == 'count' then
+ msgchar = 'C'
+ end
+
+ if info then
+ funcname = (info.name or ''):sub(1, hook_fnamelen)
+ whatchar = info.what:sub(1, 1)
+ namewhatchar = info.namewhat:sub(1, 1)
+ if namewhatchar == '' then
+ namewhatchar = ' '
+ end
+ source = info.source
+ if source:sub(1, 1) == '@' then
+ if source:sub(-4, -1) == '.lua' then
+ source = source:sub(1, -5)
+ end
+ source = source:sub(-hook_sfnamelen, -1)
+ end
+ lnum = lnum or info.currentline
+ end
+
+ -- assert(-1 <= lnum and lnum <= 99999)
+ local lnum_s
+ if lnum == -1 then
+ lnum_s = 'nknwn'
+ else
+ lnum_s = ('%u'):format(lnum)
+ end
+ local msg = ( -- lua does not support %*
+ ''
+ .. msgchar
+ .. whatchar
+ .. namewhatchar
+ .. ' '
+ .. source .. (' '):rep(hook_sfnamelen - #source)
+ .. ':'
+ .. funcname .. (' '):rep(hook_fnamelen - #funcname)
+ .. ':'
+ .. ('0'):rep(hook_numlen - #lnum_s) .. lnum_s
+ .. '\n'
+ )
+ -- eq(hook_msglen, #msg)
+ sc.write(wr, msg)
end
+ debug.sethook(hook, 'crl')
+end
+
+local trace_end_msg = ('E%s\n'):format((' '):rep(hook_msglen - 2))
- -- subtract the lines we've already imported from the new lines, then add
- -- the new unique lines to the old lines (so they won't be imported again)
- new_cdefs:diff(cdefs)
- cdefs:union(new_cdefs)
+local _debug_log
- if new_cdefs:size() == 0 then
- -- if there's no new lines, just return
- return libnvim
+local debug_log = only_separate(function(...)
+ return _debug_log(...)
+end)
+
+local function itp_child(wr, func)
+ _debug_log = function(s)
+ s = s:sub(1, hook_msglen - 2)
+ sc.write(wr, '>' .. s .. (' '):rep(hook_msglen - 2 - #s) .. '\n')
+ end
+ local err, emsg = pcall(init)
+ if err then
+ collectgarbage('stop')
+ child_sethook(wr)
+ err, emsg = pcall(func)
+ debug.sethook()
+ end
+ emsg = tostring(emsg)
+ sc.write(wr, trace_end_msg)
+ if not err then
+ if #emsg > 99999 then
+ emsg = emsg:sub(1, 99999)
+ end
+ sc.write(wr, ('-\n%05u\n%s'):format(#emsg, emsg))
+ deinit()
+ else
+ sc.write(wr, '+\n')
+ deinit()
+ end
+ collectgarbage('restart')
+ collectgarbage()
+ sc.write(wr, '$\n')
+ sc.close(wr)
+ sc.exit(err and 0 or 1)
+end
+
+local function check_child_err(rd)
+ local trace = {}
+ local did_traceline = false
+ local maxtrace = tonumber(os.getenv('NVIM_TEST_MAXTRACE')) or 1024
+ while true do
+ local traceline = sc.read(rd, hook_msglen)
+ if #traceline ~= hook_msglen then
+ if #traceline == 0 then
+ break
+ else
+ trace[#trace + 1] = 'Partial read: <' .. trace .. '>\n'
+ end
+ end
+ if traceline == trace_end_msg then
+ did_traceline = true
+ break
+ end
+ trace[#trace + 1] = traceline
+ if #trace > maxtrace then
+ table.remove(trace, 1)
+ end
end
+ local res = sc.read(rd, 2)
+ if #res == 2 then
+ local err = ''
+ if res ~= '+\n' then
+ eq('-\n', res)
+ local len_s = sc.read(rd, 5)
+ local len = tonumber(len_s)
+ neq(0, len)
+ if os.getenv('NVIM_TEST_TRACE_ON_ERROR') == '1' and #trace ~= 0 then
+ err = '\nTest failed, trace:\n' .. tracehelp
+ for _, traceline in ipairs(trace) do
+ err = err .. traceline
+ end
+ end
+ err = err .. sc.read(rd, len + 1)
+ end
+ local eres = sc.read(rd, 2)
+ if eres ~= '$\n' then
+ if #trace == 0 then
+ err = '\nTest crashed, no trace available\n'
+ else
+ err = '\nTest crashed, trace:\n' .. tracehelp
+ for i = 1, #trace do
+ err = err .. trace[i]
+ end
+ end
+ if not did_traceline then
+ err = err .. '\nNo end of trace occurred'
+ end
+ local cc_err, cc_emsg = pcall(check_cores, Paths.test_luajit_prg, true)
+ if not cc_err then
+ err = err .. '\ncheck_cores failed: ' .. cc_emsg
+ end
+ end
+ if err ~= '' then
+ assert.just_fail(err)
+ end
+ end
+end
- -- request a sorted version of the new lines (same relative order as the
- -- original preprocessed file) and feed that to the LuaJIT ffi
- local new_lines = new_cdefs:to_table()
- if os.getenv('NVIM_TEST_PRINT_CDEF') == '1' then
- for lnum, line in ipairs(new_lines) do
- print(lnum, line)
+local function itp_parent(rd, pid, allow_failure)
+ local err, emsg = pcall(check_child_err, rd)
+ sc.wait(pid)
+ sc.close(rd)
+ if not err then
+ if allow_failure then
+ io.stderr:write('Errorred out:\n' .. tostring(emsg) .. '\n')
+ os.execute([[
+ sh -c "source ci/common/test.sh
+ check_core_dumps --delete \"]] .. Paths.test_luajit_prg .. [[\""]])
+ else
+ error(emsg)
end
end
- ffi.cdef(table.concat(new_lines, "\n"))
+end
- return libnvim
+local function gen_itp(it)
+ child_calls_mod = {}
+ child_calls_mod_once = {}
+ child_cleanups_mod_once = {}
+ preprocess_cache_mod = map(function(v) return v end, preprocess_cache_init)
+ previous_defines_mod = previous_defines_init
+ cdefs_mod = cdefs_init:copy()
+ local function itp(name, func, allow_failure)
+ if allow_failure and os.getenv('NVIM_TEST_RUN_FAILING_TESTS') ~= '1' then
+ -- FIXME Fix tests with this true
+ return
+ end
+ it(name, function()
+ local rd, wr = sc.pipe()
+ child_pid = sc.fork()
+ if child_pid == 0 then
+ sc.close(rd)
+ itp_child(wr, func)
+ else
+ sc.close(wr)
+ local saved_child_pid = child_pid
+ child_pid = nil
+ itp_parent(rd, saved_child_pid, allow_failure)
+ end
+ end)
+ end
+ return itp
end
local function cppimport(path)
- return cimport(Paths.test_include_path .. '/' .. path)
+ return cimport(Paths.test_source_path .. '/test/includes/pre/' .. path)
end
-cimport('./src/nvim/types.h')
+cimport('./src/nvim/types.h', './src/nvim/main.h', './src/nvim/os/time.h')
--- take a pointer to a C-allocated string and return an interned
--- version while also freeing the memory
-local function internalize(cdata, len)
- ffi.gc(cdata, ffi.C.free)
- return ffi.string(cdata, len)
+local function conv_enum(etab, eval)
+ local n = tonumber(eval)
+ return etab[n] or n
end
-local cstr = ffi.typeof('char[?]')
-local function to_cstr(string)
- return cstr((string.len(string)) + 1, string)
+local function array_size(arr)
+ return ffi.sizeof(arr) / ffi.sizeof(arr[0])
end
--- initialize some global variables, this is still necessary to unit test
--- functions that rely on global state.
-do
- local main = cimport('./src/nvim/main.h')
- local time = cimport('./src/nvim/os/time.h')
- time.time_init()
- main.early_init()
- main.event_init()
+local function kvi_size(kvi)
+ return array_size(kvi.init_array)
end
--- C constants.
-local NULL = ffi.cast('void*', 0)
+local function kvi_init(kvi)
+ kvi.capacity = kvi_size(kvi)
+ kvi.items = kvi.init_array
+ return kvi
+end
-local OK = 1
-local FAIL = 0
+local function kvi_destroy(kvi)
+ if kvi.items ~= kvi.init_array then
+ lib.xfree(kvi.items)
+ end
+end
+
+local function kvi_new(ct)
+ return kvi_init(ffi.new(ct))
+end
-return {
+local function make_enum_conv_tab(m, values, skip_pref, set_cb)
+ child_call_once(function()
+ local ret = {}
+ for _, v in ipairs(values) do
+ local str_v = v
+ if v:sub(1, #skip_pref) == skip_pref then
+ str_v = v:sub(#skip_pref + 1)
+ end
+ ret[tonumber(m[v])] = str_v
+ end
+ set_cb(ret)
+ end)
+end
+
+local function ptr2addr(ptr)
+ return tonumber(ffi.cast('intptr_t', ffi.cast('void *', ptr)))
+end
+
+local s = ffi.new('char[64]', {0})
+
+local function ptr2key(ptr)
+ ffi.C.snprintf(s, ffi.sizeof(s), '%p', ffi.cast('void *', ptr))
+ return ffi.string(s)
+end
+
+local module = {
cimport = cimport,
cppimport = cppimport,
internalize = internalize,
@@ -162,10 +846,29 @@ return {
eq = eq,
neq = neq,
ffi = ffi,
- lib = libnvim,
+ lib = lib,
cstr = cstr,
to_cstr = to_cstr,
NULL = NULL,
OK = OK,
- FAIL = FAIL
+ FAIL = FAIL,
+ alloc_log_new = alloc_log_new,
+ gen_itp = gen_itp,
+ only_separate = only_separate,
+ child_call_once = child_call_once,
+ child_cleanup_once = child_cleanup_once,
+ sc = sc,
+ conv_enum = conv_enum,
+ array_size = array_size,
+ kvi_destroy = kvi_destroy,
+ kvi_size = kvi_size,
+ kvi_init = kvi_init,
+ kvi_new = kvi_new,
+ make_enum_conv_tab = make_enum_conv_tab,
+ ptr2addr = ptr2addr,
+ ptr2key = ptr2key,
+ debug_log = debug_log,
}
+return function()
+ return module
+end
diff --git a/test/unit/keymap_spec.lua b/test/unit/keymap_spec.lua
new file mode 100644
index 0000000000..595a19eb17
--- /dev/null
+++ b/test/unit/keymap_spec.lua
@@ -0,0 +1,71 @@
+local helpers = require("test.unit.helpers")(after_each)
+local itp = helpers.gen_itp(it)
+
+local ffi = helpers.ffi
+local eq = helpers.eq
+local neq = helpers.neq
+
+local keymap = helpers.cimport("./src/nvim/keymap.h")
+
+describe('keymap.c', function()
+
+ describe('find_special_key()', function()
+ local srcp = ffi.new('const unsigned char *[1]')
+ local modp = ffi.new('int[1]')
+
+ itp('no keycode', function()
+ srcp[0] = 'abc'
+ eq(0, keymap.find_special_key(srcp, 3, modp, false, false, false))
+ end)
+
+ itp('keycode with multiple modifiers', function()
+ srcp[0] = '<C-M-S-A>'
+ neq(0, keymap.find_special_key(srcp, 9, modp, false, false, false))
+ neq(0, modp[0])
+ end)
+
+ itp('case-insensitive', function()
+ -- Compare other capitalizations to this.
+ srcp[0] = '<C-A>'
+ local all_caps_key =
+ keymap.find_special_key(srcp, 5, modp, false, false, false)
+ local all_caps_mod = modp[0]
+
+ srcp[0] = '<C-a>'
+ eq(all_caps_key,
+ keymap.find_special_key(srcp, 5, modp, false, false, false))
+ eq(all_caps_mod, modp[0])
+
+ srcp[0] = '<c-A>'
+ eq(all_caps_key,
+ keymap.find_special_key(srcp, 5, modp, false, false, false))
+ eq(all_caps_mod, modp[0])
+
+ srcp[0] = '<c-a>'
+ eq(all_caps_key,
+ keymap.find_special_key(srcp, 5, modp, false, false, false))
+ eq(all_caps_mod, modp[0])
+ end)
+
+ itp('double-quote in keycode #7411', function()
+ -- Unescaped with in_string=false
+ srcp[0] = '<C-">'
+ eq(string.byte('"'),
+ keymap.find_special_key(srcp, 5, modp, false, false, false))
+
+ -- Unescaped with in_string=true
+ eq(0, keymap.find_special_key(srcp, 5, modp, false, false, true))
+
+ -- Escaped with in_string=false
+ srcp[0] = '<C-\\">'
+ -- Should fail because the key is invalid
+ -- (more than 1 non-modifier character).
+ eq(0, keymap.find_special_key(srcp, 6, modp, false, false, false))
+
+ -- Escaped with in_string=true
+ eq(string.byte('"'),
+ keymap.find_special_key(srcp, 6, modp, false, false, true))
+ end)
+ end)
+
+end)
diff --git a/test/unit/mbyte_spec.lua b/test/unit/mbyte_spec.lua
index 9b2415a93f..3e65537270 100644
--- a/test/unit/mbyte_spec.lua
+++ b/test/unit/mbyte_spec.lua
@@ -1,9 +1,11 @@
-local helpers = require("test.unit.helpers")
+local helpers = require("test.unit.helpers")(after_each)
+local itp = helpers.gen_itp(it)
local ffi = helpers.ffi
local eq = helpers.eq
local mbyte = helpers.cimport("./src/nvim/mbyte.h")
+local charset = helpers.cimport('./src/nvim/charset.h')
describe('mbyte', function()
@@ -26,7 +28,7 @@ describe('mbyte', function()
before_each(function()
end)
- it('utf_ptr2char', function()
+ itp('utf_ptr2char', function()
-- For strings with length 1 the first byte is returned.
for c = 0, 255 do
eq(c, mbyte.utf_ptr2char(to_string({c, 0})))
@@ -41,10 +43,21 @@ describe('mbyte', function()
-- Sequences with more than four bytes
end)
+ for n = 0, 0xF do
+ itp(('utf_char2bytes for chars 0x%x - 0x%x'):format(n * 0x1000, n * 0x1000 + 0xFFF), function()
+ local char_p = ffi.typeof('char[?]')
+ for c = n * 0x1000, n * 0x1000 + 0xFFF do
+ local p = char_p(4, 0)
+ mbyte.utf_char2bytes(c, p)
+ eq(c, mbyte.utf_ptr2char(p))
+ eq(charset.vim_iswordc(c), charset.vim_iswordp(p))
+ end
+ end)
+ end
describe('utfc_ptr2char_len', function()
- it('1-byte sequences', function()
+ itp('1-byte sequences', function()
local pcc = to_intp()
for c = 0, 255 do
eq(c, mbyte.utfc_ptr2char_len(to_string({c}), pcc, 1))
@@ -52,7 +65,7 @@ describe('mbyte', function()
end
end)
- it('2-byte sequences', function()
+ itp('2-byte sequences', function()
local pcc = to_intp()
-- No combining characters
eq(0x007f, mbyte.utfc_ptr2char_len(to_string({0x7f, 0x7f}), pcc, 2))
@@ -76,7 +89,7 @@ describe('mbyte', function()
eq(0, pcc[0])
end)
- it('3-byte sequences', function()
+ itp('3-byte sequences', function()
local pcc = to_intp()
-- No second UTF-8 character
@@ -108,7 +121,7 @@ describe('mbyte', function()
eq(0, pcc[0])
end)
- it('4-byte sequences', function()
+ itp('4-byte sequences', function()
local pcc = to_intp()
-- No following combining character
@@ -145,7 +158,7 @@ describe('mbyte', function()
eq(0, pcc[0])
end)
- it('5+-byte sequences', function()
+ itp('5+-byte sequences', function()
local pcc = to_intp()
-- No following combining character
diff --git a/test/unit/memory_spec.lua b/test/unit/memory_spec.lua
new file mode 100644
index 0000000000..bd72c8bf47
--- /dev/null
+++ b/test/unit/memory_spec.lua
@@ -0,0 +1,52 @@
+local helpers = require("test.unit.helpers")(after_each)
+local itp = helpers.gen_itp(it)
+
+local cimport = helpers.cimport
+local cstr = helpers.cstr
+local eq = helpers.eq
+local ffi = helpers.ffi
+local to_cstr = helpers.to_cstr
+
+local cimp = cimport('stdlib.h', './src/nvim/memory.h')
+
+describe('xstrlcat()', function()
+ local function test_xstrlcat(dst, src, dsize)
+ assert.is_true(dsize >= 1 + string.len(dst)) -- sanity check for tests
+ local dst_cstr = cstr(dsize, dst)
+ local src_cstr = to_cstr(src)
+ eq(string.len(dst .. src), cimp.xstrlcat(dst_cstr, src_cstr, dsize))
+ return ffi.string(dst_cstr)
+ end
+
+ local function test_xstrlcat_overlap(dst, src_idx, dsize)
+ assert.is_true(dsize >= 1 + string.len(dst)) -- sanity check for tests
+ local dst_cstr = cstr(dsize, dst)
+ local src_cstr = dst_cstr + src_idx -- pointer into `dst` (overlaps)
+ eq(string.len(dst) + string.len(dst) - src_idx,
+ cimp.xstrlcat(dst_cstr, src_cstr, dsize))
+ return ffi.string(dst_cstr)
+ end
+
+ itp('concatenates strings', function()
+ eq('ab', test_xstrlcat('a', 'b', 3))
+ eq('ab', test_xstrlcat('a', 'b', 4096))
+ eq('ABCื™ื”Zdefgiื™ื”Z', test_xstrlcat('ABCื™ื”Z', 'defgiื™ื”Z', 4096))
+ eq('b', test_xstrlcat('', 'b', 4096))
+ eq('a', test_xstrlcat('a', '', 4096))
+ end)
+
+ itp('concatenates overlapping strings', function()
+ eq('abcabc', test_xstrlcat_overlap('abc', 0, 7))
+ eq('abca', test_xstrlcat_overlap('abc', 0, 5))
+ eq('abcb', test_xstrlcat_overlap('abc', 1, 5))
+ eq('abcc', test_xstrlcat_overlap('abc', 2, 10))
+ eq('abcabc', test_xstrlcat_overlap('abc', 0, 2343))
+ end)
+
+ itp('truncates if `dsize` is too small', function()
+ eq('a', test_xstrlcat('a', 'b', 2))
+ eq('', test_xstrlcat('', 'b', 1))
+ eq('ABCื™ื”Zd', test_xstrlcat('ABCื™ื”Z', 'defgiื™ื”Z', 10))
+ end)
+
+end)
diff --git a/test/unit/message_spec.lua b/test/unit/message_spec.lua
new file mode 100644
index 0000000000..7e92b5c857
--- /dev/null
+++ b/test/unit/message_spec.lua
@@ -0,0 +1,60 @@
+local helpers = require("test.unit.helpers")(after_each)
+local itp = helpers.gen_itp(it)
+
+local ffi = helpers.ffi
+local eq = helpers.eq
+local to_cstr = helpers.to_cstr
+
+local cimp = helpers.cimport('./src/nvim/message.h', './src/nvim/memory.h',
+ './src/nvim/strings.h')
+
+describe('trunc_string', function()
+ local buflen = 40
+ local function test_inplace(s, expected, room)
+ room = room and room or 20
+ local buf = cimp.xmalloc(ffi.sizeof('char_u') * buflen)
+ ffi.C.strcpy(buf, s)
+ cimp.trunc_string(buf, buf, room, buflen)
+ eq(expected, ffi.string(buf))
+ cimp.xfree(buf)
+ end
+
+ local function test_copy(s, expected, room)
+ room = room and room or 20
+ local buf = cimp.xmalloc(ffi.sizeof('char_u') * buflen)
+ local str = cimp.vim_strsave(to_cstr(s))
+ cimp.trunc_string(str, buf, room, buflen)
+ eq(expected, ffi.string(buf))
+ cimp.xfree(buf)
+ cimp.xfree(str)
+ end
+
+ local permutations = {
+ { ['desc'] = 'in-place', ['func'] = test_inplace },
+ { ['desc'] = 'by copy', ['func'] = test_copy },
+ }
+
+ for _,t in ipairs(permutations) do
+ describe('populates buf '..t.desc, function()
+ itp('with a small string', function()
+ t.func('text', 'text')
+ end)
+
+ itp('with a medium string', function()
+ t.func('a short text', 'a short text')
+ end)
+
+ itp('with a string of length == 1/2 room', function()
+ t.func('a text that fits', 'a text that fits', 34)
+ end)
+
+ itp('with a string exactly the truncate size', function()
+ t.func('a text tha just fits', 'a text tha just fits')
+ end)
+
+ itp('with a string that must be truncated', function()
+ t.func('a text that nott fits', 'a text t...nott fits')
+ end)
+ end)
+ end
+end)
diff --git a/test/unit/multiqueue_spec.lua b/test/unit/multiqueue_spec.lua
new file mode 100644
index 0000000000..bb08a8386f
--- /dev/null
+++ b/test/unit/multiqueue_spec.lua
@@ -0,0 +1,149 @@
+local helpers = require("test.unit.helpers")(after_each)
+local itp = helpers.gen_itp(it)
+
+local child_call_once = helpers.child_call_once
+local cimport = helpers.cimport
+local ffi = helpers.ffi
+local eq = helpers.eq
+
+local multiqueue = cimport("./test/unit/fixtures/multiqueue.h")
+
+describe("multiqueue (multi-level event-queue)", function()
+ local parent, child1, child2, child3
+
+ local function put(q, str)
+ multiqueue.ut_multiqueue_put(q, str)
+ end
+
+ local function get(q)
+ return ffi.string(multiqueue.ut_multiqueue_get(q))
+ end
+
+ local function free(q)
+ multiqueue.multiqueue_free(q)
+ end
+
+ before_each(function()
+ child_call_once(function()
+ parent = multiqueue.multiqueue_new_parent(ffi.NULL, ffi.NULL)
+ child1 = multiqueue.multiqueue_new_child(parent)
+ child2 = multiqueue.multiqueue_new_child(parent)
+ child3 = multiqueue.multiqueue_new_child(parent)
+ put(child1, 'c1i1')
+ put(child1, 'c1i2')
+ put(child2, 'c2i1')
+ put(child1, 'c1i3')
+ put(child2, 'c2i2')
+ put(child2, 'c2i3')
+ put(child2, 'c2i4')
+ put(child3, 'c3i1')
+ put(child3, 'c3i2')
+ end)
+ end)
+
+ itp('keeps count of added events', function()
+ eq(3, multiqueue.multiqueue_size(child1))
+ eq(4, multiqueue.multiqueue_size(child2))
+ eq(2, multiqueue.multiqueue_size(child3))
+ end)
+
+ itp('keeps count of removed events', function()
+ multiqueue.multiqueue_get(child1)
+ eq(2, multiqueue.multiqueue_size(child1))
+ multiqueue.multiqueue_get(child1)
+ eq(1, multiqueue.multiqueue_size(child1))
+ multiqueue.multiqueue_get(child1)
+ eq(0, multiqueue.multiqueue_size(child1))
+ put(child1, 'c2ixx')
+ eq(1, multiqueue.multiqueue_size(child1))
+ multiqueue.multiqueue_get(child1)
+ eq(0, multiqueue.multiqueue_size(child1))
+ multiqueue.multiqueue_get(child1)
+ eq(0, multiqueue.multiqueue_size(child1))
+ end)
+
+ itp('removing from parent removes from child', function()
+ eq('c1i1', get(parent))
+ eq('c1i2', get(parent))
+ eq('c2i1', get(parent))
+ eq('c1i3', get(parent))
+ eq('c2i2', get(parent))
+ eq('c2i3', get(parent))
+ eq('c2i4', get(parent))
+ end)
+
+ itp('removing from child removes from parent', function()
+ eq('c2i1', get(child2))
+ eq('c2i2', get(child2))
+ eq('c1i1', get(child1))
+ eq('c1i2', get(parent))
+ eq('c1i3', get(parent))
+ eq('c2i3', get(parent))
+ eq('c2i4', get(parent))
+ end)
+
+ itp('removing from child at the beginning of parent', function()
+ eq('c1i1', get(child1))
+ eq('c1i2', get(child1))
+ eq('c2i1', get(parent))
+ end)
+
+ itp('removing from parent after get from parent and put to child', function()
+ eq('c1i1', get(parent))
+ eq('c1i2', get(parent))
+ eq('c2i1', get(parent))
+ eq('c1i3', get(parent))
+ eq('c2i2', get(parent))
+ eq('c2i3', get(parent))
+ eq('c2i4', get(parent))
+ eq('c3i1', get(parent))
+ put(child1, 'c1i11')
+ put(child1, 'c1i22')
+ eq('c3i2', get(parent))
+ eq('c1i11', get(parent))
+ eq('c1i22', get(parent))
+ end)
+
+ itp('removing from parent after get and put to child', function()
+ eq('c1i1', get(child1))
+ eq('c1i2', get(child1))
+ eq('c2i1', get(child2))
+ eq('c1i3', get(child1))
+ eq('c2i2', get(child2))
+ eq('c2i3', get(child2))
+ eq('c2i4', get(child2))
+ eq('c3i1', get(child3))
+ eq('c3i2', get(parent))
+ put(child1, 'c1i11')
+ put(child2, 'c2i11')
+ put(child1, 'c1i12')
+ eq('c2i11', get(child2))
+ eq('c1i11', get(parent))
+ eq('c1i12', get(parent))
+ end)
+
+ itp('put after removing from child at the end of parent', function()
+ eq('c3i1', get(child3))
+ eq('c3i2', get(child3))
+ put(child1, 'c1i11')
+ put(child2, 'c2i11')
+ eq('c1i1', get(parent))
+ eq('c1i2', get(parent))
+ eq('c2i1', get(parent))
+ eq('c1i3', get(parent))
+ eq('c2i2', get(parent))
+ eq('c2i3', get(parent))
+ eq('c2i4', get(parent))
+ eq('c1i11', get(parent))
+ eq('c2i11', get(parent))
+ end)
+
+ itp('removes from parent queue when child is freed', function()
+ free(child2)
+ eq('c1i1', get(parent))
+ eq('c1i2', get(parent))
+ eq('c1i3', get(parent))
+ eq('c3i1', get(child3))
+ eq('c3i2', get(child3))
+ end)
+end)
diff --git a/test/unit/option_spec.lua b/test/unit/option_spec.lua
new file mode 100644
index 0000000000..b8b8a435bc
--- /dev/null
+++ b/test/unit/option_spec.lua
@@ -0,0 +1,52 @@
+local helpers = require("test.unit.helpers")(after_each)
+local itp = helpers.gen_itp(it)
+
+local to_cstr = helpers.to_cstr
+local eq = helpers.eq
+
+local option = helpers.cimport("./src/nvim/option.h")
+local globals = helpers.cimport("./src/nvim/globals.h")
+
+local check_ff_value = function(ff)
+ return option.check_ff_value(to_cstr(ff))
+end
+
+describe('check_ff_value', function()
+
+ itp('views empty string as valid', function()
+ eq(1, check_ff_value(""))
+ end)
+
+ itp('views "unix", "dos" and "mac" as valid', function()
+ eq(1, check_ff_value("unix"))
+ eq(1, check_ff_value("dos"))
+ eq(1, check_ff_value("mac"))
+ end)
+
+ itp('views "foo" as invalid', function()
+ eq(0, check_ff_value("foo"))
+ end)
+end)
+
+describe('get_sts_value', function()
+ itp([[returns 'softtabstop' when it is non-negative]], function()
+ globals.curbuf.b_p_sts = 5
+ eq(5, option.get_sts_value())
+
+ globals.curbuf.b_p_sts = 0
+ eq(0, option.get_sts_value())
+ end)
+
+ itp([[returns "effective shiftwidth" when 'softtabstop' is negative]], function()
+ local shiftwidth = 2
+ globals.curbuf.b_p_sw = shiftwidth
+ local tabstop = 5
+ globals.curbuf.b_p_ts = tabstop
+ globals.curbuf.b_p_sts = -2
+ eq(shiftwidth, option.get_sts_value())
+
+ shiftwidth = 0
+ globals.curbuf.b_p_sw = shiftwidth
+ eq(tabstop, option.get_sts_value())
+ end)
+end)
diff --git a/test/unit/os/env_spec.lua b/test/unit/os/env_spec.lua
index 9e00a3e8f8..c54d5a9b77 100644
--- a/test/unit/os/env_spec.lua
+++ b/test/unit/os/env_spec.lua
@@ -1,4 +1,5 @@
-local helpers = require('test.unit.helpers')
+local helpers = require('test.unit.helpers')(after_each)
+local itp = helpers.gen_itp(it)
local cimport = helpers.cimport
local eq = helpers.eq
@@ -10,19 +11,19 @@ local NULL = helpers.NULL
require('lfs')
-local env = cimport('./src/nvim/os/os.h')
+local cimp = cimport('./src/nvim/os/os.h')
-describe('env function', function()
+describe('env.c', function()
local function os_setenv(name, value, override)
- return env.os_setenv((to_cstr(name)), (to_cstr(value)), override)
+ return cimp.os_setenv(to_cstr(name), to_cstr(value), override)
end
local function os_unsetenv(name, _, _)
- return env.os_unsetenv((to_cstr(name)))
+ return cimp.os_unsetenv(to_cstr(name))
end
local function os_getenv(name)
- local rval = env.os_getenv((to_cstr(name)))
+ local rval = cimp.os_getenv(to_cstr(name))
if rval ~= NULL then
return ffi.string(rval)
else
@@ -33,18 +34,18 @@ describe('env function', function()
describe('os_setenv', function()
local OK = 0
- it('sets an env variable and returns OK', function()
- local name = 'NEOVIM_UNIT_TEST_SETENV_1N'
- local value = 'NEOVIM_UNIT_TEST_SETENV_1V'
+ itp('sets an env variable and returns OK', function()
+ local name = 'NVIM_UNIT_TEST_SETENV_1N'
+ local value = 'NVIM_UNIT_TEST_SETENV_1V'
eq(nil, os.getenv(name))
eq(OK, (os_setenv(name, value, 1)))
eq(value, os.getenv(name))
end)
- it("dosn't overwrite an env variable if overwrite is 0", function()
- local name = 'NEOVIM_UNIT_TEST_SETENV_2N'
- local value = 'NEOVIM_UNIT_TEST_SETENV_2V'
- local value_updated = 'NEOVIM_UNIT_TEST_SETENV_2V_UPDATED'
+ itp("dosn't overwrite an env variable if overwrite is 0", function()
+ local name = 'NVIM_UNIT_TEST_SETENV_2N'
+ local value = 'NVIM_UNIT_TEST_SETENV_2V'
+ local value_updated = 'NVIM_UNIT_TEST_SETENV_2V_UPDATED'
eq(OK, (os_setenv(name, value, 0)))
eq(value, os.getenv(name))
eq(OK, (os_setenv(name, value_updated, 0)))
@@ -52,24 +53,63 @@ describe('env function', function()
end)
end)
+ describe('os_setenv_append_path', function()
+ itp('appends /foo/bar to $PATH', function()
+ local original_path = os.getenv('PATH')
+ eq(true, cimp.os_setenv_append_path(to_cstr('/foo/bar/baz')))
+ eq(original_path..':/foo/bar', os.getenv('PATH'))
+ end)
+
+ itp('returns false if `fname` is not absolute', function()
+ local original_path = os.getenv('PATH')
+ eq(false, cimp.os_setenv_append_path(to_cstr('foo/bar/baz')))
+ eq(original_path, os.getenv('PATH'))
+ end)
+ end)
+
+ describe('os_shell_is_cmdexe', function()
+ itp('returns true for expected names', function()
+ eq(true, cimp.os_shell_is_cmdexe(to_cstr('cmd.exe')))
+ eq(true, cimp.os_shell_is_cmdexe(to_cstr('cmd')))
+ eq(true, cimp.os_shell_is_cmdexe(to_cstr('CMD.EXE')))
+ eq(true, cimp.os_shell_is_cmdexe(to_cstr('CMD')))
+
+ os_setenv('COMSPEC', '/foo/bar/cmd.exe', 0)
+ eq(true, cimp.os_shell_is_cmdexe(to_cstr('$COMSPEC')))
+ os_setenv('COMSPEC', [[C:\system32\cmd.exe]], 0)
+ eq(true, cimp.os_shell_is_cmdexe(to_cstr('$COMSPEC')))
+ end)
+ itp('returns false for unexpected names', function()
+ eq(false, cimp.os_shell_is_cmdexe(to_cstr('')))
+ eq(false, cimp.os_shell_is_cmdexe(to_cstr('powershell')))
+ eq(false, cimp.os_shell_is_cmdexe(to_cstr(' cmd.exe ')))
+ eq(false, cimp.os_shell_is_cmdexe(to_cstr('cm')))
+ eq(false, cimp.os_shell_is_cmdexe(to_cstr('md')))
+ eq(false, cimp.os_shell_is_cmdexe(to_cstr('cmd.ex')))
+
+ os_setenv('COMSPEC', '/foo/bar/cmd', 0)
+ eq(false, cimp.os_shell_is_cmdexe(to_cstr('$COMSPEC')))
+ end)
+ end)
+
describe('os_getenv', function()
- it('reads an env variable', function()
- local name = 'NEOVIM_UNIT_TEST_GETENV_1N'
- local value = 'NEOVIM_UNIT_TEST_GETENV_1V'
+ itp('reads an env variable', function()
+ local name = 'NVIM_UNIT_TEST_GETENV_1N'
+ local value = 'NVIM_UNIT_TEST_GETENV_1V'
eq(NULL, os_getenv(name))
- -- need to use os_setenv, because lua dosn't have a setenv function
+ -- Use os_setenv because Lua dosen't have setenv.
os_setenv(name, value, 1)
eq(value, os_getenv(name))
end)
- it('returns NULL if the env variable is not found', function()
- local name = 'NEOVIM_UNIT_TEST_GETENV_NOTFOUND'
+ itp('returns NULL if the env variable is not found', function()
+ local name = 'NVIM_UNIT_TEST_GETENV_NOTFOUND'
return eq(NULL, os_getenv(name))
end)
end)
describe('os_unsetenv', function()
- it('unsets environment variable', function()
+ itp('unsets environment variable', function()
local name = 'TEST_UNSETENV'
local value = 'TESTVALUE'
os_setenv(name, value, 1)
@@ -81,113 +121,126 @@ describe('env function', function()
end)
describe('os_getenvname_at_index', function()
- it('returns names of environment variables', function()
- local test_name = 'NEOVIM_UNIT_TEST_GETENVNAME_AT_INDEX_1N'
- local test_value = 'NEOVIM_UNIT_TEST_GETENVNAME_AT_INDEX_1V'
+ itp('returns names of environment variables', function()
+ local test_name = 'NVIM_UNIT_TEST_GETENVNAME_AT_INDEX_1N'
+ local test_value = 'NVIM_UNIT_TEST_GETENVNAME_AT_INDEX_1V'
os_setenv(test_name, test_value, 1)
local i = 0
local names = { }
local found_name = false
- local name = env.os_getenvname_at_index(i)
+ local name = cimp.os_getenvname_at_index(i)
while name ~= NULL do
table.insert(names, ffi.string(name))
if (ffi.string(name)) == test_name then
found_name = true
end
i = i + 1
- name = env.os_getenvname_at_index(i)
+ name = cimp.os_getenvname_at_index(i)
end
eq(true, (table.getn(names)) > 0)
eq(true, found_name)
end)
- it('returns NULL if the index is out of bounds', function()
+ itp('returns NULL if the index is out of bounds', function()
local huge = ffi.new('size_t', 10000)
local maxuint32 = ffi.new('size_t', 4294967295)
- eq(NULL, env.os_getenvname_at_index(huge))
- eq(NULL, env.os_getenvname_at_index(maxuint32))
+ eq(NULL, cimp.os_getenvname_at_index(huge))
+ eq(NULL, cimp.os_getenvname_at_index(maxuint32))
if ffi.abi('64bit') then
-- couldn't use a bigger number because it gets converted to
-- double somewere, should be big enough anyway
-- maxuint64 = ffi.new 'size_t', 18446744073709551615
local maxuint64 = ffi.new('size_t', 18446744073709000000)
- eq(NULL, env.os_getenvname_at_index(maxuint64))
+ eq(NULL, cimp.os_getenvname_at_index(maxuint64))
end
end)
end)
describe('os_get_pid', function()
- it('returns the process ID', function()
+ itp('returns the process ID', function()
local stat_file = io.open('/proc/self/stat')
if stat_file then
local stat_str = stat_file:read('*l')
stat_file:close()
local pid = tonumber((stat_str:match('%d+')))
- eq(pid, tonumber(env.os_get_pid()))
+ eq(pid, tonumber(cimp.os_get_pid()))
else
-- /proc is not available on all systems, test if pid is nonzero.
- eq(true, (env.os_get_pid() > 0))
+ eq(true, (cimp.os_get_pid() > 0))
end
end)
end)
describe('os_get_hostname', function()
- it('returns the hostname', function()
+ itp('returns the hostname', function()
local handle = io.popen('hostname')
local hostname = handle:read('*l')
handle:close()
local hostname_buf = cstr(255, '')
- env.os_get_hostname(hostname_buf, 255)
+ cimp.os_get_hostname(hostname_buf, 255)
eq(hostname, (ffi.string(hostname_buf)))
end)
end)
describe('expand_env_esc', function()
- it('expands environment variables', function()
- local name = 'NEOVIM_UNIT_TEST_EXPAND_ENV_ESCN'
- local value = 'NEOVIM_UNIT_TEST_EXPAND_ENV_ESCV'
+ itp('expands environment variables', function()
+ local name = 'NVIM_UNIT_TEST_EXPAND_ENV_ESCN'
+ local value = 'NVIM_UNIT_TEST_EXPAND_ENV_ESCV'
os_setenv(name, value, 1)
-- TODO(bobtwinkles) This only tests Unix expansions. There should be a
-- test for Windows as well
- local input1 = to_cstr('$NEOVIM_UNIT_TEST_EXPAND_ENV_ESCN/test')
- local input2 = to_cstr('${NEOVIM_UNIT_TEST_EXPAND_ENV_ESCN}/test')
+ local input1 = to_cstr('$NVIM_UNIT_TEST_EXPAND_ENV_ESCN/test')
+ local input2 = to_cstr('${NVIM_UNIT_TEST_EXPAND_ENV_ESCN}/test')
local output_buff1 = cstr(255, '')
local output_buff2 = cstr(255, '')
- local output_expected = 'NEOVIM_UNIT_TEST_EXPAND_ENV_ESCV/test'
- env.expand_env_esc(input1, output_buff1, 255, false, true, NULL)
- env.expand_env_esc(input2, output_buff2, 255, false, true, NULL)
+ local output_expected = 'NVIM_UNIT_TEST_EXPAND_ENV_ESCV/test'
+ cimp.expand_env_esc(input1, output_buff1, 255, false, true, NULL)
+ cimp.expand_env_esc(input2, output_buff2, 255, false, true, NULL)
eq(output_expected, ffi.string(output_buff1))
eq(output_expected, ffi.string(output_buff2))
end)
- it('expands ~ once when one is true', function()
+ itp('expands ~ once when `one` is true', function()
local input = '~/foo ~ foo'
local homedir = cstr(255, '')
- env.expand_env_esc(to_cstr('~'), homedir, 255, false, true, NULL)
+ cimp.expand_env_esc(to_cstr('~'), homedir, 255, false, true, NULL)
local output_expected = ffi.string(homedir) .. "/foo ~ foo"
local output = cstr(255, '')
- env.expand_env_esc(to_cstr(input), output, 255, false, true, NULL)
+ cimp.expand_env_esc(to_cstr(input), output, 255, false, true, NULL)
eq(ffi.string(output), ffi.string(output_expected))
end)
- it('expands ~ every time when one is false', function()
+ itp('expands ~ every time when `one` is false', function()
local input = to_cstr('~/foo ~ foo')
- local homedir = cstr(255, '')
- env.expand_env_esc(to_cstr('~'), homedir, 255, false, true, NULL)
- homedir = ffi.string(homedir)
+ local dst = cstr(255, '')
+ cimp.expand_env_esc(to_cstr('~'), dst, 255, false, true, NULL)
+ local homedir = ffi.string(dst)
local output_expected = homedir .. "/foo " .. homedir .. " foo"
local output = cstr(255, '')
- env.expand_env_esc(input, output, 255, false, false, NULL)
+ cimp.expand_env_esc(input, output, 255, false, false, NULL)
eq(output_expected, ffi.string(output))
end)
- it('respects the dstlen parameter without expansion', function()
+ itp('does not crash #3725', function()
+ local name_out = ffi.new('char[100]')
+ cimp.os_get_user_name(name_out, 100)
+ local curuser = ffi.string(name_out)
+
+ local src = to_cstr("~"..curuser.."/Vcs/django-rest-framework/rest_framework/renderers.py")
+ local dst = cstr(256, "~"..curuser)
+ cimp.expand_env_esc(src, dst, 256, false, false, NULL)
+ local len = string.len(ffi.string(dst))
+ assert.True(len > 56)
+ assert.True(len < 256)
+ end)
+
+ itp('respects `dstlen` without expansion', function()
local input = to_cstr('this is a very long thing that will not fit')
-- The buffer is long enough to actually contain the full input in case the
-- test fails, but we don't tell expand_env_esc that
local output = cstr(255, '')
- env.expand_env_esc(input, output, 5, false, true, NULL)
+ cimp.expand_env_esc(input, output, 5, false, true, NULL)
-- Make sure the first few characters are copied properly and that there is a
-- terminating null character
for i=0,3 do
@@ -196,17 +249,17 @@ describe('env function', function()
eq(0, output[4])
end)
- it('respects the dstlen parameter with expansion', function()
+ itp('respects `dstlen` with expansion', function()
local varname = to_cstr('NVIM_UNIT_TEST_EXPAND_ENV_ESC_DSTLENN')
local varval = to_cstr('NVIM_UNIT_TEST_EXPAND_ENV_ESC_DSTLENV')
- env.os_setenv(varname, varval, 1)
+ cimp.os_setenv(varname, varval, 1)
-- TODO(bobtwinkles) This test uses unix-specific environment variable accessing,
-- should have some alternative for windows
local input = to_cstr('$NVIM_UNIT_TEST_EXPAND_ENV_ESC_DSTLENN/even more stuff')
-- The buffer is long enough to actually contain the full input in case the
-- test fails, but we don't tell expand_env_esc that
local output = cstr(255, '')
- env.expand_env_esc(input, output, 5, false, true, NULL)
+ cimp.expand_env_esc(input, output, 5, false, true, NULL)
-- Make sure the first few characters are copied properly and that there is a
-- terminating null character
-- expand_env_esc SHOULD NOT expand the variable if there is not enough space to
diff --git a/test/unit/os/fileio_spec.lua b/test/unit/os/fileio_spec.lua
index 5358022422..4d58a8934e 100644
--- a/test/unit/os/fileio_spec.lua
+++ b/test/unit/os/fileio_spec.lua
@@ -1,12 +1,15 @@
local lfs = require('lfs')
-local helpers = require('test.unit.helpers')
+local helpers = require('test.unit.helpers')(after_each)
+local itp = helpers.gen_itp(it)
local eq = helpers.eq
local ffi = helpers.ffi
local cimport = helpers.cimport
+local cppimport = helpers.cppimport
-local m = cimport('./src/nvim/os/fileio.h')
+local m = cimport('./src/nvim/os/os.h', './src/nvim/os/fileio.h')
+cppimport('fcntl.h')
local fcontents = ''
for i = 0, 255 do
@@ -57,10 +60,26 @@ local function file_open_new(fname, flags, mode)
return ret1[0], ret2
end
+local function file_open_fd(fd, flags)
+ local ret2 = ffi.new('FileDescriptor')
+ local ret1 = m.file_open_fd(ret2, fd, flags)
+ return ret1, ret2
+end
+
+local function file_open_fd_new(fd, flags)
+ local ret1 = ffi.new('int[?]', 1, {0})
+ local ret2 = ffi.gc(m.file_open_fd_new(ret1, fd, flags), nil)
+ return ret1[0], ret2
+end
+
local function file_write(fp, buf)
return m.file_write(fp, buf, #buf)
end
+local function msgpack_file_write(fp, buf)
+ return m.msgpack_file_write(fp, buf, #buf)
+end
+
local function file_read(fp, size)
local buf = nil
if size == nil then
@@ -79,6 +98,10 @@ local function file_read(fp, size)
return ret1, ret2
end
+local function file_flush(fp)
+ return m.file_flush(fp)
+end
+
local function file_fsync(fp)
return m.file_fsync(fp)
end
@@ -87,149 +110,211 @@ local function file_skip(fp, size)
return m.file_skip(fp, size)
end
+describe('file_open_fd', function()
+ itp('can use file descriptor returned by os_open for reading', function()
+ local fd = m.os_open(file1, m.kO_RDONLY, 0)
+ local err, fp = file_open_fd(fd, m.kFileReadOnly)
+ eq(0, err)
+ eq({#fcontents, fcontents}, {file_read(fp, #fcontents)})
+ eq(0, m.file_close(fp, false))
+ end)
+ itp('can use file descriptor returned by os_open for writing', function()
+ eq(nil, lfs.attributes(filec))
+ local fd = m.os_open(filec, m.kO_WRONLY + m.kO_CREAT, 384)
+ local err, fp = file_open_fd(fd, m.kFileWriteOnly)
+ eq(0, err)
+ eq(4, file_write(fp, 'test'))
+ eq(0, m.file_close(fp, false))
+ eq(4, lfs.attributes(filec).size)
+ eq('test', io.open(filec):read('*a'))
+ end)
+end)
+
+describe('file_open_fd_new', function()
+ itp('can use file descriptor returned by os_open for reading', function()
+ local fd = m.os_open(file1, m.kO_RDONLY, 0)
+ local err, fp = file_open_fd_new(fd, m.kFileReadOnly)
+ eq(0, err)
+ eq({#fcontents, fcontents}, {file_read(fp, #fcontents)})
+ eq(0, m.file_free(fp, false))
+ end)
+ itp('can use file descriptor returned by os_open for writing', function()
+ eq(nil, lfs.attributes(filec))
+ local fd = m.os_open(filec, m.kO_WRONLY + m.kO_CREAT, 384)
+ local err, fp = file_open_fd_new(fd, m.kFileWriteOnly)
+ eq(0, err)
+ eq(4, file_write(fp, 'test'))
+ eq(0, m.file_free(fp, false))
+ eq(4, lfs.attributes(filec).size)
+ eq('test', io.open(filec):read('*a'))
+ end)
+end)
+
describe('file_open', function()
- it('can create a rwx------ file with kFileCreate', function()
+ itp('can create a rwx------ file with kFileCreate', function()
local err, fp = file_open(filec, m.kFileCreate, 448)
eq(0, err)
local attrs = lfs.attributes(filec)
eq('rwx------', attrs.permissions)
- eq(0, m.file_close(fp))
+ eq(0, m.file_close(fp, false))
end)
- it('can create a rw------- file with kFileCreate', function()
+ itp('can create a rw------- file with kFileCreate', function()
local err, fp = file_open(filec, m.kFileCreate, 384)
eq(0, err)
local attrs = lfs.attributes(filec)
eq('rw-------', attrs.permissions)
- eq(0, m.file_close(fp))
+ eq(0, m.file_close(fp, false))
end)
- it('can create a rwx------ file with kFileCreateOnly', function()
+ itp('can create a rwx------ file with kFileCreateOnly', function()
local err, fp = file_open(filec, m.kFileCreateOnly, 448)
eq(0, err)
local attrs = lfs.attributes(filec)
eq('rwx------', attrs.permissions)
- eq(0, m.file_close(fp))
+ eq(0, m.file_close(fp, false))
end)
- it('can create a rw------- file with kFileCreateOnly', function()
+ itp('can create a rw------- file with kFileCreateOnly', function()
local err, fp = file_open(filec, m.kFileCreateOnly, 384)
eq(0, err)
local attrs = lfs.attributes(filec)
eq('rw-------', attrs.permissions)
- eq(0, m.file_close(fp))
+ eq(0, m.file_close(fp, false))
end)
- it('fails to open an existing file with kFileCreateOnly', function()
+ itp('fails to open an existing file with kFileCreateOnly', function()
local err, _ = file_open(file1, m.kFileCreateOnly, 384)
eq(m.UV_EEXIST, err)
end)
- it('fails to open an symlink with kFileNoSymlink', function()
+ itp('fails to open an symlink with kFileNoSymlink', function()
local err, _ = file_open(linkf, m.kFileNoSymlink, 384)
-- err is UV_EMLINK in FreeBSD, but if I use `ok(err == m.UV_ELOOP or err ==
-- m.UV_EMLINK)`, then I loose the ability to see actual `err` value.
if err ~= m.UV_ELOOP then eq(m.UV_EMLINK, err) end
end)
- it('can open an existing file write-only with kFileCreate', function()
+ itp('can open an existing file write-only with kFileCreate', function()
local err, fp = file_open(file1, m.kFileCreate, 384)
eq(0, err)
eq(true, fp.wr)
- eq(0, m.file_close(fp))
+ eq(0, m.file_close(fp, false))
end)
- it('can open an existing file read-only with zero', function()
+ itp('can open an existing file read-only with zero', function()
local err, fp = file_open(file1, 0, 384)
eq(0, err)
eq(false, fp.wr)
- eq(0, m.file_close(fp))
+ eq(0, m.file_close(fp, false))
end)
- it('can open an existing file read-only with kFileReadOnly', function()
+ itp('can open an existing file read-only with kFileReadOnly', function()
local err, fp = file_open(file1, m.kFileReadOnly, 384)
eq(0, err)
eq(false, fp.wr)
- eq(0, m.file_close(fp))
+ eq(0, m.file_close(fp, false))
end)
- it('can open an existing file read-only with kFileNoSymlink', function()
+ itp('can open an existing file read-only with kFileNoSymlink', function()
local err, fp = file_open(file1, m.kFileNoSymlink, 384)
eq(0, err)
eq(false, fp.wr)
- eq(0, m.file_close(fp))
+ eq(0, m.file_close(fp, false))
end)
- it('can truncate an existing file with kFileTruncate', function()
+ itp('can truncate an existing file with kFileTruncate', function()
local err, fp = file_open(file1, m.kFileTruncate, 384)
eq(0, err)
eq(true, fp.wr)
- eq(0, m.file_close(fp))
+ eq(0, m.file_close(fp, false))
local attrs = lfs.attributes(file1)
eq(0, attrs.size)
end)
- it('can open an existing file write-only with kFileWriteOnly', function()
+ itp('can open an existing file write-only with kFileWriteOnly', function()
local err, fp = file_open(file1, m.kFileWriteOnly, 384)
eq(0, err)
eq(true, fp.wr)
- eq(0, m.file_close(fp))
+ eq(0, m.file_close(fp, false))
local attrs = lfs.attributes(file1)
eq(4096, attrs.size)
end)
- it('fails to create a file with just kFileWriteOnly', function()
+ itp('fails to create a file with just kFileWriteOnly', function()
local err, _ = file_open(filec, m.kFileWriteOnly, 384)
eq(m.UV_ENOENT, err)
local attrs = lfs.attributes(filec)
eq(nil, attrs)
end)
- it('can truncate an existing file with kFileTruncate when opening a symlink',
+ itp('can truncate an existing file with kFileTruncate when opening a symlink',
function()
local err, fp = file_open(linkf, m.kFileTruncate, 384)
eq(0, err)
eq(true, fp.wr)
- eq(0, m.file_close(fp))
+ eq(0, m.file_close(fp, false))
local attrs = lfs.attributes(file1)
eq(0, attrs.size)
end)
- it('fails to open a directory write-only', function()
+ itp('fails to open a directory write-only', function()
local err, _ = file_open(dir, m.kFileWriteOnly, 384)
eq(m.UV_EISDIR, err)
end)
- it('fails to open a broken symbolic link write-only', function()
+ itp('fails to open a broken symbolic link write-only', function()
local err, _ = file_open(linkb, m.kFileWriteOnly, 384)
eq(m.UV_ENOENT, err)
end)
- it('fails to open a broken symbolic link read-only', function()
+ itp('fails to open a broken symbolic link read-only', function()
local err, _ = file_open(linkb, m.kFileReadOnly, 384)
eq(m.UV_ENOENT, err)
end)
end)
describe('file_open_new', function()
- it('can open a file read-only', function()
+ itp('can open a file read-only', function()
local err, fp = file_open_new(file1, 0, 384)
eq(0, err)
eq(false, fp.wr)
- eq(0, m.file_free(fp))
+ eq(0, m.file_free(fp, false))
end)
- it('fails to open an existing file with kFileCreateOnly', function()
+ itp('fails to open an existing file with kFileCreateOnly', function()
local err, fp = file_open_new(file1, m.kFileCreateOnly, 384)
eq(m.UV_EEXIST, err)
eq(nil, fp)
end)
end)
--- file_close is called above, so it is not tested directly
+describe('file_close', function()
+ itp('can flush writes to disk also with true argument', function()
+ local err, fp = file_open(filec, m.kFileCreateOnly, 384)
+ eq(0, err)
+ local wsize = file_write(fp, 'test')
+ eq(4, wsize)
+ eq(0, lfs.attributes(filec).size)
+ eq(0, m.file_close(fp, true))
+ eq(wsize, lfs.attributes(filec).size)
+ end)
+end)
+
+describe('file_free', function()
+ itp('can flush writes to disk also with true argument', function()
+ local err, fp = file_open_new(filec, m.kFileCreateOnly, 384)
+ eq(0, err)
+ local wsize = file_write(fp, 'test')
+ eq(4, wsize)
+ eq(0, lfs.attributes(filec).size)
+ eq(0, m.file_free(fp, true))
+ eq(wsize, lfs.attributes(filec).size)
+ end)
+end)
describe('file_fsync', function()
- it('can flush writes to disk', function()
+ itp('can flush writes to disk', function()
local err, fp = file_open(filec, m.kFileCreateOnly, 384)
eq(0, file_fsync(fp))
eq(0, err)
@@ -239,12 +324,27 @@ describe('file_fsync', function()
eq(0, lfs.attributes(filec).size)
eq(0, file_fsync(fp))
eq(wsize, lfs.attributes(filec).size)
- eq(0, m.file_close(fp))
+ eq(0, m.file_close(fp, false))
+ end)
+end)
+
+describe('file_flush', function()
+ itp('can flush writes to disk', function()
+ local err, fp = file_open(filec, m.kFileCreateOnly, 384)
+ eq(0, file_flush(fp))
+ eq(0, err)
+ eq(0, lfs.attributes(filec).size)
+ local wsize = file_write(fp, 'test')
+ eq(4, wsize)
+ eq(0, lfs.attributes(filec).size)
+ eq(0, file_flush(fp))
+ eq(wsize, lfs.attributes(filec).size)
+ eq(0, m.file_close(fp, false))
end)
end)
describe('file_read', function()
- it('can read small chunks of input until eof', function()
+ itp('can read small chunks of input until eof', function()
local err, fp = file_open(file1, 0, 384)
eq(0, err)
eq(false, fp.wr)
@@ -261,29 +361,29 @@ describe('file_read', function()
eq({exp_err, exp_s}, {file_read(fp, size)})
shift = shift + size
end
- eq(0, m.file_close(fp))
+ eq(0, m.file_close(fp, false))
end)
- it('can read the whole file at once', function()
+ itp('can read the whole file at once', function()
local err, fp = file_open(file1, 0, 384)
eq(0, err)
eq(false, fp.wr)
eq({#fcontents, fcontents}, {file_read(fp, #fcontents)})
eq({0, ('\0'):rep(#fcontents)}, {file_read(fp, #fcontents)})
- eq(0, m.file_close(fp))
+ eq(0, m.file_close(fp, false))
end)
- it('can read more then 1024 bytes after reading a small chunk', function()
+ itp('can read more then 1024 bytes after reading a small chunk', function()
local err, fp = file_open(file1, 0, 384)
eq(0, err)
eq(false, fp.wr)
eq({5, fcontents:sub(1, 5)}, {file_read(fp, 5)})
eq({#fcontents - 5, fcontents:sub(6) .. (('\0'):rep(5))},
{file_read(fp, #fcontents)})
- eq(0, m.file_close(fp))
+ eq(0, m.file_close(fp, false))
end)
- it('can read file by 768-byte-chunks', function()
+ itp('can read file by 768-byte-chunks', function()
local err, fp = file_open(file1, 0, 384)
eq(0, err)
eq(false, fp.wr)
@@ -300,23 +400,23 @@ describe('file_read', function()
eq({exp_err, exp_s}, {file_read(fp, size)})
shift = shift + size
end
- eq(0, m.file_close(fp))
+ eq(0, m.file_close(fp, false))
end)
end)
describe('file_write', function()
- it('can write the whole file at once', function()
+ itp('can write the whole file at once', function()
local err, fp = file_open(filec, m.kFileCreateOnly, 384)
eq(0, err)
eq(true, fp.wr)
local wr = file_write(fp, fcontents)
eq(#fcontents, wr)
- eq(0, m.file_close(fp))
+ eq(0, m.file_close(fp, false))
eq(wr, lfs.attributes(filec).size)
eq(fcontents, io.open(filec):read('*a'))
end)
- it('can write the whole file by small chunks', function()
+ itp('can write the whole file by small chunks', function()
local err, fp = file_open(filec, m.kFileCreateOnly, 384)
eq(0, err)
eq(true, fp.wr)
@@ -328,12 +428,12 @@ describe('file_write', function()
eq(wr, #s)
shift = shift + size
end
- eq(0, m.file_close(fp))
+ eq(0, m.file_close(fp, false))
eq(#fcontents, lfs.attributes(filec).size)
eq(fcontents, io.open(filec):read('*a'))
end)
- it('can write the whole file by 768-byte-chunks', function()
+ itp('can write the whole file by 768-byte-chunks', function()
local err, fp = file_open(filec, m.kFileCreateOnly, 384)
eq(0, err)
eq(true, fp.wr)
@@ -345,14 +445,26 @@ describe('file_write', function()
eq(wr, #s)
shift = shift + size
end
- eq(0, m.file_close(fp))
+ eq(0, m.file_close(fp, false))
eq(#fcontents, lfs.attributes(filec).size)
eq(fcontents, io.open(filec):read('*a'))
end)
end)
+describe('msgpack_file_write', function()
+ itp('can write the whole file at once', function()
+ local err, fp = file_open(filec, m.kFileCreateOnly, 384)
+ eq(0, err)
+ eq(true, fp.wr)
+ local wr = msgpack_file_write(fp, fcontents)
+ eq(0, wr)
+ eq(0, m.file_close(fp, false))
+ eq(fcontents, io.open(filec):read('*a'))
+ end)
+end)
+
describe('file_skip', function()
- it('can skip 3 bytes', function()
+ itp('can skip 3 bytes', function()
local err, fp = file_open(file1, 0, 384)
eq(0, err)
eq(false, fp.wr)
@@ -360,6 +472,6 @@ describe('file_skip', function()
local rd, s = file_read(fp, 3)
eq(3, rd)
eq(fcontents:sub(4, 6), s)
- eq(0, m.file_close(fp))
+ eq(0, m.file_close(fp, false))
end)
end)
diff --git a/test/unit/os/fs_spec.lua b/test/unit/os/fs_spec.lua
index 7e7eddb6fc..ddb438eb3d 100644
--- a/test/unit/os/fs_spec.lua
+++ b/test/unit/os/fs_spec.lua
@@ -1,7 +1,8 @@
local lfs = require('lfs')
local bit = require('bit')
-local helpers = require('test.unit.helpers')
+local helpers = require('test.unit.helpers')(after_each)
+local itp = helpers.gen_itp(it)
local cimport = helpers.cimport
local cppimport = helpers.cppimport
@@ -15,18 +16,18 @@ local to_cstr = helpers.to_cstr
local OK = helpers.OK
local FAIL = helpers.FAIL
local NULL = helpers.NULL
+
local NODE_NORMAL = 0
local NODE_WRITABLE = 1
-cimport('unistd.h')
cimport('./src/nvim/os/shell.h')
cimport('./src/nvim/option_defs.h')
cimport('./src/nvim/main.h')
cimport('./src/nvim/fileio.h')
-local fs = cimport('./src/nvim/os/os.h')
+local fs = cimport('./src/nvim/os/os.h', './src/nvim/path.h')
cppimport('sys/stat.h')
cppimport('fcntl.h')
-cppimport('uv-errno.h')
+cppimport('uv.h')
local s = ''
for i = 0, 255 do
@@ -34,7 +35,6 @@ for i = 0, 255 do
end
local fcontents = s:rep(16)
-local buffer = ""
local directory = nil
local absolute_executable = nil
local executable_name = nil
@@ -64,28 +64,27 @@ local function os_getperm(filename)
return tonumber(perm)
end
-describe('fs function', function()
- local orig_test_file_perm
+describe('fs.c', function()
+ local function os_isdir(name)
+ return fs.os_isdir(to_cstr(name))
+ end
- setup(function()
+ before_each(function()
lfs.mkdir('unit-test-directory');
io.open('unit-test-directory/test.file', 'w').close()
- orig_test_file_perm = os_getperm('unit-test-directory/test.file')
io.open('unit-test-directory/test_2.file', 'w').close()
lfs.link('test.file', 'unit-test-directory/test_link.file', true)
lfs.link('non_existing_file.file', 'unit-test-directory/test_broken_link.file', true)
- -- Since the tests are executed, they are called by an executable. We use
- -- that executable for several asserts.
+ -- The tests are invoked with an absolute path to `busted` executable.
absolute_executable = arg[0]
- -- Split absolute_executable into a directory and the actual file name for
- -- later usage.
+ -- Split the absolute_executable path into a directory and filename.
directory, executable_name = string.match(absolute_executable, '^(.*)/(.*)$')
end)
- teardown(function()
+ after_each(function()
os.remove('unit-test-directory/test.file')
os.remove('unit-test-directory/test_2.file')
os.remove('unit-test-directory/test_link.file')
@@ -95,63 +94,68 @@ describe('fs function', function()
end)
describe('os_dirname', function()
- local length
-
- local function os_dirname(buf, len)
- return fs.os_dirname(buf, len)
- end
-
- before_each(function()
- length = (string.len(lfs.currentdir())) + 1
- buffer = cstr(length, '')
+ itp('returns OK and writes current directory to the buffer', function()
+ local length = string.len(lfs.currentdir()) + 1
+ local buf = cstr(length, '')
+ eq(OK, fs.os_dirname(buf, length))
+ eq(lfs.currentdir(), ffi.string(buf))
end)
- it('returns OK and writes current directory into the buffer if it is large\n enough', function()
- eq(OK, (os_dirname(buffer, length)))
- eq(lfs.currentdir(), (ffi.string(buffer)))
+ itp('returns FAIL if the buffer is too small', function()
+ local length = string.len(lfs.currentdir()) + 1
+ local buf = cstr(length - 1, '')
+ eq(FAIL, fs.os_dirname(buf, length - 1))
end)
+ end)
- -- What kind of other failing cases are possible?
- it('returns FAIL if the buffer is too small', function()
- local buf = cstr((length - 1), '')
- eq(FAIL, (os_dirname(buf, (length - 1))))
+ describe('os_chdir', function()
+ itp('fails with path="~"', function()
+ eq(false, os_isdir('~')) -- sanity check: no literal "~" directory.
+ local length = 4096
+ local expected_cwd = cstr(length, '')
+ local cwd = cstr(length, '')
+ eq(OK, fs.os_dirname(expected_cwd, length))
+
+ -- os_chdir returns 0 for success, not OK (1).
+ neq(0, fs.os_chdir('~')) -- fail
+ neq(0, fs.os_chdir('~/')) -- fail
+
+ eq(OK, fs.os_dirname(cwd, length))
+ -- CWD did not change.
+ eq(ffi.string(expected_cwd), ffi.string(cwd))
end)
end)
- local function os_isdir(name)
- return fs.os_isdir((to_cstr(name)))
- end
-
describe('os_isdir', function()
- it('returns false if an empty string is given', function()
+ itp('returns false if an empty string is given', function()
eq(false, (os_isdir('')))
end)
- it('returns false if a nonexisting directory is given', function()
+ itp('returns false if a nonexisting directory is given', function()
eq(false, (os_isdir('non-existing-directory')))
end)
- it('returns false if a nonexisting absolute directory is given', function()
+ itp('returns false if a nonexisting absolute directory is given', function()
eq(false, (os_isdir('/non-existing-directory')))
end)
- it('returns false if an existing file is given', function()
+ itp('returns false if an existing file is given', function()
eq(false, (os_isdir('unit-test-directory/test.file')))
end)
- it('returns true if the current directory is given', function()
+ itp('returns true if the current directory is given', function()
eq(true, (os_isdir('.')))
end)
- it('returns true if the parent directory is given', function()
+ itp('returns true if the parent directory is given', function()
eq(true, (os_isdir('..')))
end)
- it('returns true if an arbitrary directory is given', function()
+ itp('returns true if an arbitrary directory is given', function()
eq(true, (os_isdir('unit-test-directory')))
end)
- it('returns true if an absolute directory is given', function()
+ itp('returns true if an absolute directory is given', function()
eq(true, (os_isdir(directory)))
end)
end)
@@ -181,33 +185,30 @@ describe('fs function', function()
return os_can_exe(name)
end
- it('returns false when given a directory', function()
+ itp('returns false when given a directory', function()
cant_exe('./unit-test-directory')
end)
- it('returns false when given a regular file without executable bit set', function()
+ itp('returns false when given a regular file without executable bit set', function()
cant_exe('unit-test-directory/test.file')
end)
- it('returns false when the given file does not exists', function()
+ itp('returns false when the given file does not exists', function()
cant_exe('does-not-exist.file')
end)
- it('returns the absolute path when given an executable inside $PATH', function()
- -- Since executable_name does not start with "./", the path will be
- -- selected from $PATH. Make sure the ends match, ignore the directories.
- local _, busted = string.match(absolute_executable, '^(.*)/(.*)$')
- local _, name = string.match(exe(executable_name), '^(.*)/(.*)$')
- eq(busted, name)
+ itp('returns the absolute path when given an executable inside $PATH', function()
+ local fullpath = exe('ls')
+ eq(1, fs.path_is_absolute(to_cstr(fullpath)))
end)
- it('returns the absolute path when given an executable relative to the current dir', function()
+ itp('returns the absolute path when given an executable relative to the current dir', function()
local old_dir = lfs.currentdir()
lfs.chdir(directory)
- -- Rely on currentdir to resolve symlinks, if any. Testing against
- -- the absolute path taken from arg[0] may result in failure where
+ -- Rely on currentdir to resolve symlinks, if any. Testing against
+ -- the absolute path taken from arg[0] may result in failure where
-- the path has a symlink in it.
local canonical = lfs.currentdir() .. '/' .. executable_name
local expected = exe(canonical)
@@ -221,10 +222,6 @@ describe('fs function', function()
end)
describe('file permissions', function()
- before_each(function()
- os_setperm('unit-test-directory/test.file', orig_test_file_perm)
- end)
-
local function os_fchown(filename, user_id, group_id)
local fd = ffi.C.open(filename, 0)
local res = fs.os_fchown(fd, user_id, group_id)
@@ -245,22 +242,22 @@ describe('fs function', function()
end
describe('os_getperm', function()
- it('returns UV_ENOENT when the given file does not exist', function()
+ itp('returns UV_ENOENT when the given file does not exist', function()
eq(ffi.C.UV_ENOENT, (os_getperm('non-existing-file')))
end)
- it('returns a perm > 0 when given an existing file', function()
+ itp('returns a perm > 0 when given an existing file', function()
assert.is_true((os_getperm('unit-test-directory')) > 0)
end)
- it('returns S_IRUSR when the file is readable', function()
+ itp('returns S_IRUSR when the file is readable', function()
local perm = os_getperm('unit-test-directory')
assert.is_true((bit_set(perm, ffi.C.kS_IRUSR)))
end)
end)
describe('os_setperm', function()
- it('can set and unset the executable bit of a file', function()
+ itp('can set and unset the executable bit of a file', function()
local perm = os_getperm('unit-test-directory/test.file')
perm = unset_bit(perm, ffi.C.kS_IXUSR)
eq(OK, (os_setperm('unit-test-directory/test.file', perm)))
@@ -272,7 +269,7 @@ describe('fs function', function()
assert.is_true((bit_set(perm, ffi.C.kS_IXUSR)))
end)
- it('fails if given file does not exist', function()
+ itp('fails if given file does not exist', function()
local perm = ffi.C.kS_IXUSR
eq(FAIL, (os_setperm('non-existing-file', perm)))
end)
@@ -280,7 +277,7 @@ describe('fs function', function()
describe('os_fchown', function()
local filename = 'unit-test-directory/test.file'
- it('does not change owner and group if respective IDs are equal to -1', function()
+ itp('does not change owner and group if respective IDs are equal to -1', function()
local uid = lfs.attributes(filename, 'uid')
local gid = lfs.attributes(filename, 'gid')
eq(0, os_fchown(filename, -1, -1))
@@ -292,7 +289,7 @@ describe('fs function', function()
if (os.execute('id -G > /dev/null 2>&1') ~= 0) then
pending('skipped (missing `id` utility)', function() end)
else
- it('owner of a file may change the group of the file to any group of which that owner is a member', function()
+ itp('owner of a file may change the group of the file to any group of which that owner is a member', function()
local file_gid = lfs.attributes(filename, 'gid')
-- Gets ID of any group of which current user is a member except the
@@ -316,7 +313,7 @@ describe('fs function', function()
if (ffi.os == 'Windows' or ffi.C.geteuid() == 0) then
pending('skipped (uv_fs_chown is no-op on Windows)', function() end)
else
- it('returns nonzero if process has not enough permissions', function()
+ itp('returns nonzero if process has not enough permissions', function()
-- chown to root
neq(0, os_fchown(filename, 0, 0))
end)
@@ -325,7 +322,7 @@ describe('fs function', function()
describe('os_file_is_readable', function()
- it('returns false if the file is not readable', function()
+ itp('returns false if the file is not readable', function()
local perm = os_getperm('unit-test-directory/test.file')
perm = unset_bit(perm, ffi.C.kS_IRUSR)
perm = unset_bit(perm, ffi.C.kS_IRGRP)
@@ -334,19 +331,19 @@ describe('fs function', function()
eq(false, os_file_is_readable('unit-test-directory/test.file'))
end)
- it('returns false if the file does not exist', function()
+ itp('returns false if the file does not exist', function()
eq(false, os_file_is_readable(
'unit-test-directory/what_are_you_smoking.gif'))
end)
- it('returns true if the file is readable', function()
+ itp('returns true if the file is readable', function()
eq(true, os_file_is_readable(
'unit-test-directory/test.file'))
end)
end)
describe('os_file_is_writable', function()
- it('returns 0 if the file is readonly', function()
+ itp('returns 0 if the file is readonly', function()
local perm = os_getperm('unit-test-directory/test.file')
perm = unset_bit(perm, ffi.C.kS_IWUSR)
perm = unset_bit(perm, ffi.C.kS_IWGRP)
@@ -355,11 +352,11 @@ describe('fs function', function()
eq(0, os_file_is_writable('unit-test-directory/test.file'))
end)
- it('returns 1 if the file is writable', function()
+ itp('returns 1 if the file is writable', function()
eq(1, os_file_is_writable('unit-test-directory/test.file'))
end)
- it('returns 2 when given a folder with rights to write into', function()
+ itp('returns 2 when given a folder with rights to write into', function()
eq(2, os_file_is_writable('unit-test-directory'))
end)
end)
@@ -393,7 +390,7 @@ describe('fs function', function()
buf = ffi.new('char[?]', size + 1, ('\0'):rep(size))
end
local eof = ffi.new('bool[?]', 1, {true})
- local ret2 = fs.os_read(fd, eof, buf, size)
+ local ret2 = fs.os_read(fd, eof, buf, size, false)
local ret1 = eof[0]
local ret3 = ''
if buf ~= nil then
@@ -411,7 +408,7 @@ describe('fs function', function()
end
local iov = ffi.new('struct iovec[?]', #sizes, bufs)
local eof = ffi.new('bool[?]', 1, {true})
- local ret2 = fs.os_readv(fd, eof, iov, #sizes)
+ local ret2 = fs.os_readv(fd, eof, iov, #sizes, false)
local ret1 = eof[0]
local ret3 = {}
for i = 1,#sizes do
@@ -421,23 +418,23 @@ describe('fs function', function()
return ret1, ret2, ret3
end
local function os_write(fd, data)
- return fs.os_write(fd, data, data and #data or 0)
+ return fs.os_write(fd, data, data and #data or 0, false)
end
describe('os_path_exists', function()
- it('returns false when given a non-existing file', function()
+ itp('returns false when given a non-existing file', function()
eq(false, (os_path_exists('non-existing-file')))
end)
- it('returns true when given an existing file', function()
+ itp('returns true when given an existing file', function()
eq(true, (os_path_exists('unit-test-directory/test.file')))
end)
- it('returns false when given a broken symlink', function()
+ itp('returns false when given a broken symlink', function()
eq(false, (os_path_exists('unit-test-directory/test_broken_link.file')))
end)
- it('returns true when given a directory', function()
+ itp('returns true when given a directory', function()
eq(true, (os_path_exists('unit-test-directory')))
end)
end)
@@ -446,18 +443,18 @@ describe('fs function', function()
local test = 'unit-test-directory/test.file'
local not_exist = 'unit-test-directory/not_exist.file'
- it('can rename file if destination file does not exist', function()
+ itp('can rename file if destination file does not exist', function()
eq(OK, (os_rename(test, not_exist)))
eq(false, (os_path_exists(test)))
eq(true, (os_path_exists(not_exist)))
eq(OK, (os_rename(not_exist, test))) -- restore test file
end)
- it('fail if source file does not exist', function()
+ itp('fail if source file does not exist', function()
eq(FAIL, (os_rename(not_exist, test)))
end)
- it('can overwrite destination file if it exists', function()
+ itp('can overwrite destination file if it exists', function()
local other = 'unit-test-directory/other.file'
local file = io.open(other, 'w')
file:write('other')
@@ -482,11 +479,11 @@ describe('fs function', function()
os.remove('unit-test-directory/test_remove.file')
end)
- it('returns non-zero when given a non-existing file', function()
+ itp('returns non-zero when given a non-existing file', function()
neq(0, (os_remove('non-existing-file')))
end)
- it('removes the given file and returns 0', function()
+ itp('removes the given file and returns 0', function()
local f = 'unit-test-directory/test_remove.file'
assert_file_exists(f)
eq(0, (os_remove(f)))
@@ -494,6 +491,22 @@ describe('fs function', function()
end)
end)
+ describe('os_dup', function()
+ itp('returns new file descriptor', function()
+ local dup0 = fs.os_dup(0)
+ local dup1 = fs.os_dup(1)
+ local dup2 = fs.os_dup(2)
+ local tbl = {[0]=true, [1]=true, [2]=true,
+ [tonumber(dup0)]=true, [tonumber(dup1)]=true,
+ [tonumber(dup2)]=true}
+ local i = 0
+ for _, _ in pairs(tbl) do
+ i = i + 1
+ end
+ eq(i, 6) -- All fds must be unique
+ end)
+ end)
+
describe('os_open', function()
local new_file = 'test_new_file'
local existing_file = 'unit-test-directory/test_existing.file'
@@ -507,30 +520,30 @@ describe('fs function', function()
os.remove(new_file)
end)
- it('returns UV_ENOENT for O_RDWR on a non-existing file', function()
+ itp('returns UV_ENOENT for O_RDWR on a non-existing file', function()
eq(ffi.C.UV_ENOENT, (os_open('non-existing-file', ffi.C.kO_RDWR, 0)))
end)
- it('returns non-negative for O_CREAT on a non-existing file which then can be closed', function()
+ itp('returns non-negative for O_CREAT on a non-existing file which then can be closed', function()
assert_file_does_not_exist(new_file)
local fd = os_open(new_file, ffi.C.kO_CREAT, 0)
assert.is_true(0 <= fd)
eq(0, os_close(fd))
end)
- it('returns non-negative for O_CREAT on a existing file which then can be closed', function()
+ itp('returns non-negative for O_CREAT on a existing file which then can be closed', function()
assert_file_exists(existing_file)
local fd = os_open(existing_file, ffi.C.kO_CREAT, 0)
assert.is_true(0 <= fd)
eq(0, os_close(fd))
end)
- it('returns UV_EEXIST for O_CREAT|O_EXCL on a existing file', function()
+ itp('returns UV_EEXIST for O_CREAT|O_EXCL on a existing file', function()
assert_file_exists(existing_file)
eq(ffi.C.kUV_EEXIST, (os_open(existing_file, (bit.bor(ffi.C.kO_CREAT, ffi.C.kO_EXCL)), 0)))
end)
- it('sets `rwx` permissions for O_CREAT 700 which then can be closed', function()
+ itp('sets `rwx` permissions for O_CREAT 700 which then can be closed', function()
assert_file_does_not_exist(new_file)
--create the file
local fd = os_open(new_file, ffi.C.kO_CREAT, tonumber("700", 8))
@@ -539,7 +552,7 @@ describe('fs function', function()
eq(0, os_close(fd))
end)
- it('sets `rw` permissions for O_CREAT 600 which then can be closed', function()
+ itp('sets `rw` permissions for O_CREAT 600 which then can be closed', function()
assert_file_does_not_exist(new_file)
--create the file
local fd = os_open(new_file, ffi.C.kO_CREAT, tonumber("600", 8))
@@ -548,7 +561,7 @@ describe('fs function', function()
eq(0, os_close(fd))
end)
- it('returns a non-negative file descriptor for an existing file which then can be closed', function()
+ itp('returns a non-negative file descriptor for an existing file which then can be closed', function()
local fd = os_open(existing_file, ffi.C.kO_RDWR, 0)
assert.is_true(0 <= fd)
eq(0, os_close(fd))
@@ -556,7 +569,7 @@ describe('fs function', function()
end)
describe('os_close', function()
- it('returns EBADF for negative file descriptors', function()
+ itp('returns EBADF for negative file descriptors', function()
eq(ffi.C.UV_EBADF, os_close(-1))
eq(ffi.C.UV_EBADF, os_close(-1000))
end)
@@ -575,7 +588,7 @@ describe('fs function', function()
os.remove(file)
end)
- it('can read zero bytes from a file', function()
+ itp('can read zero bytes from a file', function()
local fd = os_open(file, ffi.C.kO_RDONLY, 0)
ok(fd >= 0)
eq({false, 0, ''}, {os_read(fd, nil)})
@@ -583,7 +596,7 @@ describe('fs function', function()
eq(0, os_close(fd))
end)
- it('can read from a file multiple times', function()
+ itp('can read from a file multiple times', function()
local fd = os_open(file, ffi.C.kO_RDONLY, 0)
ok(fd >= 0)
eq({false, 2, '\000\001'}, {os_read(fd, 2)})
@@ -591,7 +604,7 @@ describe('fs function', function()
eq(0, os_close(fd))
end)
- it('can read the whole file at once and then report eof', function()
+ itp('can read the whole file at once and then report eof', function()
local fd = os_open(file, ffi.C.kO_RDONLY, 0)
ok(fd >= 0)
eq({false, #fcontents, fcontents}, {os_read(fd, #fcontents)})
@@ -599,7 +612,7 @@ describe('fs function', function()
eq(0, os_close(fd))
end)
- it('can read the whole file in two calls, one partially', function()
+ itp('can read the whole file in two calls, one partially', function()
local fd = os_open(file, ffi.C.kO_RDONLY, 0)
ok(fd >= 0)
eq({false, #fcontents * 3/4, fcontents:sub(1, #fcontents * 3/4)},
@@ -629,7 +642,7 @@ describe('fs function', function()
os.remove(file)
end)
- it('can read zero bytes from a file', function()
+ itp('can read zero bytes from a file', function()
local fd = os_open(file, ffi.C.kO_RDONLY, 0)
ok(fd >= 0)
eq({false, 0, {}}, {os_readv(fd, {})})
@@ -637,7 +650,7 @@ describe('fs function', function()
eq(0, os_close(fd))
end)
- it('can read from a file multiple times to a differently-sized buffers', function()
+ itp('can read from a file multiple times to a differently-sized buffers', function()
local fd = os_open(file, ffi.C.kO_RDONLY, 0)
ok(fd >= 0)
eq({false, 2, {'\000\001'}}, {os_readv(fd, {2})})
@@ -645,7 +658,7 @@ describe('fs function', function()
eq(0, os_close(fd))
end)
- it('can read the whole file at once and then report eof', function()
+ itp('can read the whole file at once and then report eof', function()
local fd = os_open(file, ffi.C.kO_RDONLY, 0)
ok(fd >= 0)
eq({false,
@@ -662,7 +675,7 @@ describe('fs function', function()
eq(0, os_close(fd))
end)
- it('can read the whole file in two calls, one partially', function()
+ itp('can read the whole file in two calls, one partially', function()
local fd = os_open(file, ffi.C.kO_RDONLY, 0)
ok(fd >= 0)
eq({false, #fcontents * 3/4, {fcontents:sub(1, #fcontents * 3/4)}},
@@ -689,7 +702,7 @@ describe('fs function', function()
os.remove(file)
end)
- it('can write zero bytes to a file', function()
+ itp('can write zero bytes to a file', function()
local fd = os_open(file, ffi.C.kO_WRONLY, 0)
ok(fd >= 0)
eq(0, os_write(fd, ''))
@@ -698,7 +711,7 @@ describe('fs function', function()
eq(0, os_close(fd))
end)
- it('can write some data to a file', function()
+ itp('can write some data to a file', function()
local fd = os_open(file, ffi.C.kO_WRONLY, 0)
ok(fd >= 0)
eq(3, os_write(fd, 'abc'))
@@ -713,11 +726,11 @@ describe('fs function', function()
os.remove('non-existing-file')
end)
- it('returns NODE_NORMAL for non-existing file', function()
+ itp('returns NODE_NORMAL for non-existing file', function()
eq(NODE_NORMAL, fs.os_nodetype(to_cstr('non-existing-file')))
end)
- it('returns NODE_WRITABLE for /dev/stderr', function()
+ itp('returns NODE_WRITABLE for /dev/stderr', function()
eq(NODE_WRITABLE, fs.os_nodetype(to_cstr('/dev/stderr')))
end)
end)
@@ -743,12 +756,12 @@ describe('fs function', function()
end
describe('os_mkdir', function()
- it('returns non-zero when given an already existing directory', function()
+ itp('returns non-zero when given an already existing directory', function()
local mode = ffi.C.kS_IRUSR + ffi.C.kS_IWUSR + ffi.C.kS_IXUSR
neq(0, (os_mkdir('unit-test-directory', mode)))
end)
- it('creates a directory and returns 0', function()
+ itp('creates a directory and returns 0', function()
local mode = ffi.C.kS_IRUSR + ffi.C.kS_IWUSR + ffi.C.kS_IXUSR
eq(false, (os_isdir('unit-test-directory/new-dir')))
eq(0, (os_mkdir('unit-test-directory/new-dir', mode)))
@@ -758,14 +771,14 @@ describe('fs function', function()
end)
describe('os_mkdir_recurse', function()
- it('returns zero when given an already existing directory', function()
+ itp('returns zero when given an already existing directory', function()
local mode = ffi.C.kS_IRUSR + ffi.C.kS_IWUSR + ffi.C.kS_IXUSR
local ret, failed_str = os_mkdir_recurse('unit-test-directory', mode)
eq(0, ret)
eq(nil, failed_str)
end)
- it('fails to create a directory where there is a file', function()
+ itp('fails to create a directory where there is a file', function()
local mode = ffi.C.kS_IRUSR + ffi.C.kS_IWUSR + ffi.C.kS_IXUSR
local ret, failed_str = os_mkdir_recurse(
'unit-test-directory/test.file', mode)
@@ -773,7 +786,7 @@ describe('fs function', function()
eq('unit-test-directory/test.file', failed_str)
end)
- it('fails to create a directory where there is a file in path', function()
+ itp('fails to create a directory where there is a file in path', function()
local mode = ffi.C.kS_IRUSR + ffi.C.kS_IWUSR + ffi.C.kS_IXUSR
local ret, failed_str = os_mkdir_recurse(
'unit-test-directory/test.file/test', mode)
@@ -781,7 +794,7 @@ describe('fs function', function()
eq('unit-test-directory/test.file', failed_str)
end)
- it('succeeds to create a directory', function()
+ itp('succeeds to create a directory', function()
local mode = ffi.C.kS_IRUSR + ffi.C.kS_IWUSR + ffi.C.kS_IXUSR
local ret, failed_str = os_mkdir_recurse(
'unit-test-directory/new-dir-recurse', mode)
@@ -792,7 +805,7 @@ describe('fs function', function()
eq(false, os_isdir('unit-test-directory/new-dir-recurse'))
end)
- it('succeeds to create a directory ending with ///', function()
+ itp('succeeds to create a directory ending with ///', function()
local mode = ffi.C.kS_IRUSR + ffi.C.kS_IWUSR + ffi.C.kS_IXUSR
local ret, failed_str = os_mkdir_recurse(
'unit-test-directory/new-dir-recurse///', mode)
@@ -803,7 +816,7 @@ describe('fs function', function()
eq(false, os_isdir('unit-test-directory/new-dir-recurse'))
end)
- it('succeeds to create a directory ending with /', function()
+ itp('succeeds to create a directory ending with /', function()
local mode = ffi.C.kS_IRUSR + ffi.C.kS_IWUSR + ffi.C.kS_IXUSR
local ret, failed_str = os_mkdir_recurse(
'unit-test-directory/new-dir-recurse/', mode)
@@ -814,7 +827,7 @@ describe('fs function', function()
eq(false, os_isdir('unit-test-directory/new-dir-recurse'))
end)
- it('succeeds to create a directory tree', function()
+ itp('succeeds to create a directory tree', function()
local mode = ffi.C.kS_IRUSR + ffi.C.kS_IWUSR + ffi.C.kS_IXUSR
local ret, failed_str = os_mkdir_recurse(
'unit-test-directory/new-dir-recurse/1/2/3', mode)
@@ -833,11 +846,11 @@ describe('fs function', function()
end)
describe('os_rmdir', function()
- it('returns non_zero when given a non-existing directory', function()
+ itp('returns non_zero when given a non-existing directory', function()
neq(0, (os_rmdir('non-existing-directory')))
end)
- it('removes the given directory and returns 0', function()
+ itp('removes the given directory and returns 0', function()
lfs.mkdir('unit-test-directory/new-dir')
eq(0, os_rmdir('unit-test-directory/new-dir'))
eq(false, (os_isdir('unit-test-directory/new-dir')))
@@ -865,19 +878,24 @@ describe('fs function', function()
end
describe('os_fileinfo', function()
- it('returns false if given a non-existing file', function()
+ itp('returns false if path=NULL', function()
+ local file_info = file_info_new()
+ assert.is_false((fs.os_fileinfo(nil, file_info)))
+ end)
+
+ itp('returns false if given a non-existing file', function()
local file_info = file_info_new()
assert.is_false((fs.os_fileinfo('/non-existent', file_info)))
end)
- it('returns true if given an existing file and fills file_info', function()
+ itp('returns true if given an existing file and fills file_info', function()
local file_info = file_info_new()
local path = 'unit-test-directory/test.file'
assert.is_true((fs.os_fileinfo(path, file_info)))
assert.is_true((is_file_info_filled(file_info)))
end)
- it('returns the file info of the linked file, not the link', function()
+ itp('returns the file info of the linked file, not the link', function()
local file_info = file_info_new()
local path = 'unit-test-directory/test_link.file'
assert.is_true((fs.os_fileinfo(path, file_info)))
@@ -888,19 +906,19 @@ describe('fs function', function()
end)
describe('os_fileinfo_link', function()
- it('returns false if given a non-existing file', function()
+ itp('returns false if given a non-existing file', function()
local file_info = file_info_new()
assert.is_false((fs.os_fileinfo_link('/non-existent', file_info)))
end)
- it('returns true if given an existing file and fills file_info', function()
+ itp('returns true if given an existing file and fills file_info', function()
local file_info = file_info_new()
local path = 'unit-test-directory/test.file'
assert.is_true((fs.os_fileinfo_link(path, file_info)))
assert.is_true((is_file_info_filled(file_info)))
end)
- it('returns the file info of the link, not the linked file', function()
+ itp('returns the file info of the link, not the linked file', function()
local file_info = file_info_new()
local path = 'unit-test-directory/test_link.file'
assert.is_true((fs.os_fileinfo_link(path, file_info)))
@@ -911,12 +929,12 @@ describe('fs function', function()
end)
describe('os_fileinfo_fd', function()
- it('returns false if given an invalid file descriptor', function()
+ itp('returns false if given an invalid file descriptor', function()
local file_info = file_info_new()
assert.is_false((fs.os_fileinfo_fd(-1, file_info)))
end)
- it('returns true if given a file descriptor and fills file_info', function()
+ itp('returns true if given a file descriptor and fills file_info', function()
local file_info = file_info_new()
local path = 'unit-test-directory/test.file'
local fd = ffi.C.open(path, 0)
@@ -927,7 +945,7 @@ describe('fs function', function()
end)
describe('os_fileinfo_id_equal', function()
- it('returns false if file infos represent different files', function()
+ itp('returns false if file infos represent different files', function()
local file_info_1 = file_info_new()
local file_info_2 = file_info_new()
local path_1 = 'unit-test-directory/test.file'
@@ -937,7 +955,7 @@ describe('fs function', function()
assert.is_false((fs.os_fileinfo_id_equal(file_info_1, file_info_2)))
end)
- it('returns true if file infos represent the same file', function()
+ itp('returns true if file infos represent the same file', function()
local file_info_1 = file_info_new()
local file_info_2 = file_info_new()
local path = 'unit-test-directory/test.file'
@@ -946,7 +964,7 @@ describe('fs function', function()
assert.is_true((fs.os_fileinfo_id_equal(file_info_1, file_info_2)))
end)
- it('returns true if file infos represent the same file (symlink)', function()
+ itp('returns true if file infos represent the same file (symlink)', function()
local file_info_1 = file_info_new()
local file_info_2 = file_info_new()
local path_1 = 'unit-test-directory/test.file'
@@ -958,7 +976,7 @@ describe('fs function', function()
end)
describe('os_fileinfo_id', function()
- it('extracts ino/dev from file_info into file_id', function()
+ itp('extracts ino/dev from file_info into file_id', function()
local file_info = file_info_new()
local file_id = file_id_new()
local path = 'unit-test-directory/test.file'
@@ -970,7 +988,7 @@ describe('fs function', function()
end)
describe('os_fileinfo_inode', function()
- it('returns the inode from file_info', function()
+ itp('returns the inode from file_info', function()
local file_info = file_info_new()
local path = 'unit-test-directory/test.file'
assert.is_true((fs.os_fileinfo(path, file_info)))
@@ -980,7 +998,7 @@ describe('fs function', function()
end)
describe('os_fileinfo_size', function()
- it('returns the correct size of a file', function()
+ itp('returns the correct size of a file', function()
local path = 'unit-test-directory/test.file'
local file = io.open(path, 'w')
file:write('some bytes to get filesize != 0')
@@ -994,7 +1012,7 @@ describe('fs function', function()
end)
describe('os_fileinfo_hardlinks', function()
- it('returns the correct number of hardlinks', function()
+ itp('returns the correct number of hardlinks', function()
local path = 'unit-test-directory/test.file'
local path_link = 'unit-test-directory/test_hlink.file'
local file_info = file_info_new()
@@ -1007,7 +1025,7 @@ describe('fs function', function()
end)
describe('os_fileinfo_blocksize', function()
- it('returns the correct blocksize of a file', function()
+ itp('returns the correct blocksize of a file', function()
local path = 'unit-test-directory/test.file'
-- there is a bug in luafilesystem where
-- `lfs.attributes path, 'blksize'` returns the worng value:
@@ -1028,12 +1046,12 @@ describe('fs function', function()
end)
describe('os_fileid', function()
- it('returns false if given an non-existing file', function()
+ itp('returns false if given an non-existing file', function()
local file_id = file_id_new()
assert.is_false((fs.os_fileid('/non-existent', file_id)))
end)
- it('returns true if given an existing file and fills file_id', function()
+ itp('returns true if given an existing file and fills file_id', function()
local file_id = file_id_new()
local path = 'unit-test-directory/test.file'
assert.is_true((fs.os_fileid(path, file_id)))
@@ -1043,14 +1061,14 @@ describe('fs function', function()
end)
describe('os_fileid_equal', function()
- it('returns true if two FileIDs are equal', function()
+ itp('returns true if two FileIDs are equal', function()
local file_id = file_id_new()
local path = 'unit-test-directory/test.file'
assert.is_true((fs.os_fileid(path, file_id)))
assert.is_true((fs.os_fileid_equal(file_id, file_id)))
end)
- it('returns false if two FileIDs are not equal', function()
+ itp('returns false if two FileIDs are not equal', function()
local file_id_1 = file_id_new()
local file_id_2 = file_id_new()
local path_1 = 'unit-test-directory/test.file'
@@ -1062,7 +1080,7 @@ describe('fs function', function()
end)
describe('os_fileid_equal_fileinfo', function()
- it('returns true if file_id and file_info represent the same file', function()
+ itp('returns true if file_id and file_info represent the same file', function()
local file_id = file_id_new()
local file_info = file_info_new()
local path = 'unit-test-directory/test.file'
@@ -1071,7 +1089,7 @@ describe('fs function', function()
assert.is_true((fs.os_fileid_equal_fileinfo(file_id, file_info)))
end)
- it('returns false if file_id and file_info represent different files', function()
+ itp('returns false if file_id and file_info represent different files', function()
local file_id = file_id_new()
local file_info = file_info_new()
local path_1 = 'unit-test-directory/test.file'
diff --git a/test/unit/os/shell_spec.lua b/test/unit/os/shell_spec.lua
index 906f950308..a73fc8e47e 100644
--- a/test/unit/os/shell_spec.lua
+++ b/test/unit/os/shell_spec.lua
@@ -1,16 +1,5 @@
--- not all operating systems support the system()-tests, as of yet.
-local allowed_os = {
- Linux = true,
- OSX = true,
- BSD = true,
- POSIX = true
-}
-
-if allowed_os[jit.os] ~= true then
- return
-end
-
-local helpers = require('test.unit.helpers')
+local helpers = require('test.unit.helpers')(after_each)
+local itp = helpers.gen_itp(it)
local cimported = helpers.cimport(
'./src/nvim/os/shell.h',
'./src/nvim/option_defs.h',
@@ -24,16 +13,19 @@ local to_cstr = helpers.to_cstr
local NULL = ffi.cast('void *', 0)
describe('shell functions', function()
- setup(function()
+ before_each(function()
-- os_system() can't work when the p_sh and p_shcf variables are unset
- cimported.p_sh = to_cstr('/bin/bash')
+ cimported.p_sh = to_cstr('/bin/sh')
cimported.p_shcf = to_cstr('-c')
+ cimported.p_sxq = to_cstr('')
+ cimported.p_sxe = to_cstr('')
end)
local function shell_build_argv(cmd, extra_args)
local res = cimported.shell_build_argv(
cmd and to_cstr(cmd),
extra_args and to_cstr(extra_args))
+ -- `res` is zero-indexed (C pointer, not Lua table)!
local argc = 0
local ret = {}
-- Explicitly free everything, so if it is not in allocated memory it will
@@ -47,6 +39,26 @@ describe('shell functions', function()
return ret
end
+ local function shell_argv_to_str(argv_table)
+ -- C string array (char **).
+ local argv = (argv_table
+ and ffi.new("char*[?]", #argv_table+1)
+ or NULL)
+
+ local argc = 1
+ while argv_table ~= nil and argv_table[argc] ~= nil do
+ -- `argv` is zero-indexed (C pointer, not Lua table)!
+ argv[argc - 1] = to_cstr(argv_table[argc])
+ argc = argc + 1
+ end
+ if argv_table ~= nil then
+ argv[argc - 1] = NULL
+ end
+
+ local res = cimported.shell_argv_to_str(argv)
+ return ffi.string(res)
+ end
+
local function os_system(cmd, input)
local input_or = input and to_cstr(input) or NULL
local input_len = (input ~= nil) and string.len(input) or 0
@@ -61,63 +73,51 @@ describe('shell functions', function()
end
describe('os_system', function()
- it('can echo some output (shell builtin)', function()
- local cmd, text = 'echo -n', 'some text'
+ itp('can echo some output (shell builtin)', function()
+ local cmd, text = 'printf "%s "', 'some text '
local status, output = os_system(cmd .. ' ' .. text)
eq(text, output)
eq(0, status)
end)
- it('can deal with empty output', function()
- local cmd = 'echo -n'
+ itp('can deal with empty output', function()
+ local cmd = 'printf ""'
local status, output = os_system(cmd)
eq('', output)
eq(0, status)
end)
- it('can pass input on stdin', function()
+ itp('can pass input on stdin', function()
local cmd, input = 'cat -', 'some text\nsome other text'
local status, output = os_system(cmd, input)
eq(input, output)
eq(0, status)
end)
- it ('returns non-zero exit code', function()
+ itp('returns non-zero exit code', function()
local status = os_system('exit 2')
eq(2, status)
end)
end)
describe('shell_build_argv', function()
- local saved_opts = {}
-
- setup(function()
- saved_opts.p_sh = cimported.p_sh
- saved_opts.p_shcf = cimported.p_shcf
- end)
-
- teardown(function()
- cimported.p_sh = saved_opts.p_sh
- cimported.p_shcf = saved_opts.p_shcf
+ itp('works with NULL arguments', function()
+ eq({'/bin/sh'}, shell_build_argv(nil, nil))
end)
- it('works with NULL arguments', function()
- eq({'/bin/bash'}, shell_build_argv(nil, nil))
+ itp('works with cmd', function()
+ eq({'/bin/sh', '-c', 'abc def'}, shell_build_argv('abc def', nil))
end)
- it('works with cmd', function()
- eq({'/bin/bash', '-c', 'abc def'}, shell_build_argv('abc def', nil))
+ itp('works with extra_args', function()
+ eq({'/bin/sh', 'ghi jkl'}, shell_build_argv(nil, 'ghi jkl'))
end)
- it('works with extra_args', function()
- eq({'/bin/bash', 'ghi jkl'}, shell_build_argv(nil, 'ghi jkl'))
+ itp('works with cmd and extra_args', function()
+ eq({'/bin/sh', 'ghi jkl', '-c', 'abc def'}, shell_build_argv('abc def', 'ghi jkl'))
end)
- it('works with cmd and extra_args', function()
- eq({'/bin/bash', 'ghi jkl', '-c', 'abc def'}, shell_build_argv('abc def', 'ghi jkl'))
- end)
-
- it('splits and unquotes &shell and &shellcmdflag', function()
+ itp('splits and unquotes &shell and &shellcmdflag', function()
cimported.p_sh = to_cstr('/Program" "Files/zsh -f')
cimported.p_shcf = to_cstr('-x -o "sh word split" "-"c')
eq({'/Program Files/zsh', '-f',
@@ -126,5 +126,60 @@ describe('shell functions', function()
'-c', 'abc def'},
shell_build_argv('abc def', 'ghi jkl'))
end)
+
+ itp('applies shellxescape (p_sxe) and shellxquote (p_sxq)', function()
+ cimported.p_sxq = to_cstr('(')
+ cimported.p_sxe = to_cstr('"&|<>()@^')
+
+ local argv = ffi.cast('char**',
+ cimported.shell_build_argv(to_cstr('echo &|<>()@^'), nil))
+ eq(ffi.string(argv[0]), '/bin/sh')
+ eq(ffi.string(argv[1]), '-c')
+ eq(ffi.string(argv[2]), '(echo ^&^|^<^>^(^)^@^^)')
+ eq(nil, argv[3])
+ end)
+
+ itp('applies shellxquote="(', function()
+ cimported.p_sxq = to_cstr('"(')
+ cimported.p_sxe = to_cstr('"&|<>()@^')
+
+ local argv = ffi.cast('char**', cimported.shell_build_argv(
+ to_cstr('echo -n some text'), nil))
+ eq(ffi.string(argv[0]), '/bin/sh')
+ eq(ffi.string(argv[1]), '-c')
+ eq(ffi.string(argv[2]), '"(echo -n some text)"')
+ eq(nil, argv[3])
+ end)
+
+ itp('applies shellxquote="', function()
+ cimported.p_sxq = to_cstr('"')
+ cimported.p_sxe = to_cstr('')
+
+ local argv = ffi.cast('char**', cimported.shell_build_argv(
+ to_cstr('echo -n some text'), nil))
+ eq(ffi.string(argv[0]), '/bin/sh')
+ eq(ffi.string(argv[1]), '-c')
+ eq(ffi.string(argv[2]), '"echo -n some text"')
+ eq(nil, argv[3])
+ end)
+
+ itp('with empty shellxquote/shellxescape', function()
+ local argv = ffi.cast('char**', cimported.shell_build_argv(
+ to_cstr('echo -n some text'), nil))
+ eq(ffi.string(argv[0]), '/bin/sh')
+ eq(ffi.string(argv[1]), '-c')
+ eq(ffi.string(argv[2]), 'echo -n some text')
+ eq(nil, argv[3])
+ end)
+ end)
+
+ itp('shell_argv_to_str', function()
+ eq('', shell_argv_to_str({ nil }))
+ eq("''", shell_argv_to_str({ '' }))
+ eq("'foo' '' 'bar'", shell_argv_to_str({ 'foo', '', 'bar' }))
+ eq("'/bin/sh' '-c' 'abc def'", shell_argv_to_str({'/bin/sh', '-c', 'abc def'}))
+ eq("'abc def' 'ghi jkl'", shell_argv_to_str({'abc def', 'ghi jkl'}))
+ eq("'/bin/sh' '-c' 'abc def' '"..('x'):rep(225).."...",
+ shell_argv_to_str({'/bin/sh', '-c', 'abc def', ('x'):rep(999)}))
end)
end)
diff --git a/test/unit/os/users_spec.lua b/test/unit/os/users_spec.lua
index 236481e9e7..f92413c7de 100644
--- a/test/unit/os/users_spec.lua
+++ b/test/unit/os/users_spec.lua
@@ -1,4 +1,5 @@
-local helpers = require('test.unit.helpers')
+local helpers = require('test.unit.helpers')(after_each)
+local itp = helpers.gen_itp(it)
local cimport = helpers.cimport
local eq = helpers.eq
@@ -27,11 +28,11 @@ describe('users function', function()
local current_username = os.getenv('USER')
describe('os_get_usernames', function()
- it('returns FAIL if called with NULL', function()
+ itp('returns FAIL if called with NULL', function()
eq(FAIL, users.os_get_usernames(NULL))
end)
- it('fills the names garray with os usernames and returns OK', function()
+ itp('fills the names garray with os usernames and returns OK', function()
local ga_users = garray_new()
eq(OK, users.os_get_usernames(ga_users))
local user_count = garray_get_len(ga_users)
@@ -48,7 +49,7 @@ describe('users function', function()
end)
describe('os_get_user_name', function()
- it('should write the username into the buffer and return OK', function()
+ itp('should write the username into the buffer and return OK', function()
local name_out = ffi.new('char[100]')
eq(OK, users.os_get_user_name(name_out, 100))
eq(current_username, ffi.string(name_out))
@@ -56,14 +57,14 @@ describe('users function', function()
end)
describe('os_get_uname', function()
- it('should write the username into the buffer and return OK', function()
+ itp('should write the username into the buffer and return OK', function()
local name_out = ffi.new('char[100]')
local user_id = lib.getuid()
eq(OK, users.os_get_uname(user_id, name_out, 100))
eq(current_username, ffi.string(name_out))
end)
- it('should FAIL if the userid is not found', function()
+ itp('should FAIL if the userid is not found', function()
local name_out = ffi.new('char[100]')
-- hoping nobody has this uid
local user_id = 2342
@@ -73,16 +74,16 @@ describe('users function', function()
end)
describe('os_get_user_directory', function()
- it('should return NULL if called with NULL', function()
+ itp('should return NULL if called with NULL', function()
eq(NULL, users.os_get_user_directory(NULL))
end)
- it('should return $HOME for the current user', function()
+ itp('should return $HOME for the current user', function()
local home = os.getenv('HOME')
eq(home, ffi.string((users.os_get_user_directory(current_username))))
end)
- it('should return NULL if the user is not found', function()
+ itp('should return NULL if the user is not found', function()
eq(NULL, users.os_get_user_directory('neovim_user_not_found_test'))
end)
end)
diff --git a/test/unit/path_spec.lua b/test/unit/path_spec.lua
index 9b76834383..e8ce660ce1 100644
--- a/test/unit/path_spec.lua
+++ b/test/unit/path_spec.lua
@@ -1,5 +1,6 @@
local lfs = require('lfs')
-local helpers = require('test.unit.helpers')
+local helpers = require('test.unit.helpers')(after_each)
+local itp = helpers.gen_itp(it)
local cimport = helpers.cimport
local eq = helpers.eq
@@ -12,19 +13,12 @@ local OK = helpers.OK
local FAIL = helpers.FAIL
cimport('string.h')
-local path = cimport('./src/nvim/path.h')
-
--- import constants parsed by ffi
-local kEqualFiles = path.kEqualFiles
-local kDifferentFiles = path.kDifferentFiles
-local kBothFilesMissing = path.kBothFilesMissing
-local kOneFileMissing = path.kOneFileMissing
-local kEqualFileNames = path.kEqualFileNames
+local cimp = cimport('./src/nvim/os/os.h', './src/nvim/path.h')
local length = 0
local buffer = nil
-describe('path function', function()
+describe('path.c', function()
describe('path_full_dir_name', function()
setup(function()
lfs.mkdir('unit-test-directory')
@@ -36,7 +30,7 @@ describe('path function', function()
local function path_full_dir_name(directory, buf, len)
directory = to_cstr(directory)
- return path.path_full_dir_name(directory, buf, len)
+ return cimp.path_full_dir_name(directory, buf, len)
end
before_each(function()
@@ -45,7 +39,7 @@ describe('path function', function()
buffer = cstr(length, '')
end)
- it('returns the absolute directory name of a given relative one', function()
+ itp('returns the absolute directory name of a given relative one', function()
local result = path_full_dir_name('..', buffer, length)
eq(OK, result)
local old_dir = lfs.currentdir()
@@ -55,16 +49,16 @@ describe('path function', function()
eq(expected, (ffi.string(buffer)))
end)
- it('returns the current directory name if the given string is empty', function()
+ itp('returns the current directory name if the given string is empty', function()
eq(OK, (path_full_dir_name('', buffer, length)))
eq(lfs.currentdir(), (ffi.string(buffer)))
end)
- it('fails if the given directory does not exist', function()
+ itp('fails if the given directory does not exist', function()
eq(FAIL, path_full_dir_name('does_not_exist', buffer, length))
end)
- it('works with a normal relative dir', function()
+ itp('works with a normal relative dir', function()
local result = path_full_dir_name('unit-test-directory', buffer, length)
eq(lfs.currentdir() .. '/unit-test-directory', (ffi.string(buffer)))
eq(OK, result)
@@ -75,7 +69,7 @@ describe('path function', function()
local function path_full_compare(s1, s2, cn)
s1 = to_cstr(s1)
s2 = to_cstr(s2)
- return path.path_full_compare(s1, s2, cn or 0)
+ return cimp.path_full_compare(s1, s2, cn or 0)
end
local f1 = 'f1.o'
@@ -91,70 +85,70 @@ describe('path function', function()
os.remove(f2)
end)
- it('returns kEqualFiles when passed the same file', function()
- eq(kEqualFiles, (path_full_compare(f1, f1)))
+ itp('returns kEqualFiles when passed the same file', function()
+ eq(cimp.kEqualFiles, (path_full_compare(f1, f1)))
end)
- it('returns kEqualFileNames when files that dont exist and have same name', function()
- eq(kEqualFileNames, (path_full_compare('null.txt', 'null.txt', true)))
+ itp('returns kEqualFileNames when files that dont exist and have same name', function()
+ eq(cimp.kEqualFileNames, (path_full_compare('null.txt', 'null.txt', true)))
end)
- it('returns kBothFilesMissing when files that dont exist', function()
- eq(kBothFilesMissing, (path_full_compare('null.txt', 'null.txt')))
+ itp('returns kBothFilesMissing when files that dont exist', function()
+ eq(cimp.kBothFilesMissing, (path_full_compare('null.txt', 'null.txt')))
end)
- it('returns kDifferentFiles when passed different files', function()
- eq(kDifferentFiles, (path_full_compare(f1, f2)))
- eq(kDifferentFiles, (path_full_compare(f2, f1)))
+ itp('returns kDifferentFiles when passed different files', function()
+ eq(cimp.kDifferentFiles, (path_full_compare(f1, f2)))
+ eq(cimp.kDifferentFiles, (path_full_compare(f2, f1)))
end)
- it('returns kOneFileMissing if only one does not exist', function()
- eq(kOneFileMissing, (path_full_compare(f1, 'null.txt')))
- eq(kOneFileMissing, (path_full_compare('null.txt', f1)))
+ itp('returns kOneFileMissing if only one does not exist', function()
+ eq(cimp.kOneFileMissing, (path_full_compare(f1, 'null.txt')))
+ eq(cimp.kOneFileMissing, (path_full_compare('null.txt', f1)))
end)
end)
describe('path_tail', function()
local function path_tail(file)
- local res = path.path_tail((to_cstr(file)))
+ local res = cimp.path_tail((to_cstr(file)))
neq(NULL, res)
return ffi.string(res)
end
- it('returns the tail of a given file path', function()
+ itp('returns the tail of a given file path', function()
eq('file.txt', path_tail('directory/file.txt'))
end)
- it('returns an empty string if file ends in a slash', function()
+ itp('returns an empty string if file ends in a slash', function()
eq('', path_tail('directory/'))
end)
end)
describe('path_tail_with_sep', function()
local function path_tail_with_sep(file)
- local res = path.path_tail_with_sep((to_cstr(file)))
+ local res = cimp.path_tail_with_sep((to_cstr(file)))
neq(NULL, res)
return ffi.string(res)
end
- it('returns the tail of a file together with its separator', function()
+ itp('returns the tail of a file together with its separator', function()
eq('///file.txt', path_tail_with_sep('directory///file.txt'))
end)
- it('returns an empty string when given an empty file name', function()
+ itp('returns an empty string when given an empty file name', function()
eq('', path_tail_with_sep(''))
end)
- it('returns only the separator if there is a trailing separator', function()
+ itp('returns only the separator if there is a trailing separator', function()
eq('/', path_tail_with_sep('some/directory/'))
end)
- it('cuts a leading separator', function()
+ itp('cuts a leading separator', function()
eq('file.txt', path_tail_with_sep('/file.txt'))
eq('', path_tail_with_sep('/'))
end)
- it('returns the whole file name if there is no separator', function()
+ itp('returns the whole file name if there is no separator', function()
eq('file.txt', path_tail_with_sep('file.txt'))
end)
end)
@@ -165,11 +159,11 @@ describe('path function', function()
-- strcmp.
local function invocation_path_tail(invk)
local plen = ffi.new('size_t[?]', 1)
- local ptail = path.invocation_path_tail((to_cstr(invk)), plen)
+ local ptail = cimp.invocation_path_tail((to_cstr(invk)), plen)
neq(NULL, ptail)
-- it does not change the output if len==NULL
- local tail2 = path.invocation_path_tail((to_cstr(invk)), NULL)
+ local tail2 = cimp.invocation_path_tail((to_cstr(invk)), NULL)
neq(NULL, tail2)
eq((ffi.string(ptail)), (ffi.string(tail2)))
return ptail, plen[0]
@@ -180,13 +174,13 @@ describe('path function', function()
return eq(0, (ffi.C.strncmp((to_cstr(base)), pinvk, len)))
end
- it('returns the executable name of an invocation given a relative invocation', function()
+ itp('returns the executable name of an invocation given a relative invocation', function()
local invk, len = invocation_path_tail('directory/exe a b c')
compare("exe a b c", invk, len)
eq(3, len)
end)
- it('returns the executable name of an invocation given an absolute invocation', function()
+ itp('returns the executable name of an invocation given an absolute invocation', function()
if ffi.os == 'Windows' then
local invk, len = invocation_path_tail('C:\\Users\\anyone\\Program Files\\z a b')
compare('z a b', invk, len)
@@ -198,27 +192,27 @@ describe('path function', function()
end
end)
- it('does not count arguments to the executable as part of its path', function()
+ itp('does not count arguments to the executable as part of its path', function()
local invk, len = invocation_path_tail('exe a/b\\c')
compare("exe a/b\\c", invk, len)
eq(3, len)
end)
- it('only accepts whitespace as a terminator for the executable name', function()
+ itp('only accepts whitespace as a terminator for the executable name', function()
local invk, _ = invocation_path_tail('exe-a+b_c[]()|#!@$%^&*')
eq('exe-a+b_c[]()|#!@$%^&*', (ffi.string(invk)))
end)
- it('is equivalent to path_tail when args do not contain a path separator', function()
- local ptail = path.path_tail(to_cstr("a/b/c x y z"))
+ itp('is equivalent to path_tail when args do not contain a path separator', function()
+ local ptail = cimp.path_tail(to_cstr("a/b/c x y z"))
neq(NULL, ptail)
local tail = ffi.string(ptail)
local invk, _ = invocation_path_tail("a/b/c x y z")
eq(tail, ffi.string(invk))
end)
- it('is not equivalent to path_tail when args contain a path separator', function()
- local ptail = path.path_tail(to_cstr("a/b/c x y/z"))
+ itp('is not equivalent to path_tail when args contain a path separator', function()
+ local ptail = cimp.path_tail(to_cstr("a/b/c x y/z"))
neq(NULL, ptail)
local invk, _ = invocation_path_tail("a/b/c x y/z")
neq((ffi.string(ptail)), (ffi.string(invk)))
@@ -227,47 +221,47 @@ describe('path function', function()
describe('path_next_component', function()
local function path_next_component(file)
- local res = path.path_next_component((to_cstr(file)))
+ local res = cimp.path_next_component((to_cstr(file)))
neq(NULL, res)
return ffi.string(res)
end
- it('returns', function()
+ itp('returns', function()
eq('directory/file.txt', path_next_component('some/directory/file.txt'))
end)
- it('returns empty string if given file contains no separator', function()
+ itp('returns empty string if given file contains no separator', function()
eq('', path_next_component('file.txt'))
end)
end)
describe('path_shorten_fname', function()
- it('returns NULL if `full_path` is NULL', function()
+ itp('returns NULL if `full_path` is NULL', function()
local dir = to_cstr('some/directory/file.txt')
- eq(NULL, (path.path_shorten_fname(NULL, dir)))
+ eq(NULL, (cimp.path_shorten_fname(NULL, dir)))
end)
- it('returns NULL if the path and dir does not match', function()
+ itp('returns NULL if the path and dir does not match', function()
local dir = to_cstr('not/the/same')
local full = to_cstr('as/this.txt')
- eq(NULL, (path.path_shorten_fname(full, dir)))
+ eq(NULL, (cimp.path_shorten_fname(full, dir)))
end)
- it('returns NULL if the path is not separated properly', function()
+ itp('returns NULL if the path is not separated properly', function()
local dir = to_cstr('some/very/long/')
local full = to_cstr('some/very/long/directory/file.txt')
- eq(NULL, (path.path_shorten_fname(full, dir)))
+ eq(NULL, (cimp.path_shorten_fname(full, dir)))
end)
- it('shortens the filename if `dir_name` is the start of `full_path`', function()
+ itp('shortens the filename if `dir_name` is the start of `full_path`', function()
local full = to_cstr('some/very/long/directory/file.txt')
local dir = to_cstr('some/very/long')
- eq('directory/file.txt', (ffi.string(path.path_shorten_fname(full, dir))))
+ eq('directory/file.txt', (ffi.string(cimp.path_shorten_fname(full, dir))))
end)
end)
end)
-describe('path_shorten_fname_if_possible', function()
+describe('path_try_shorten_fname', function()
local cwd = lfs.currentdir()
before_each(function()
@@ -279,27 +273,80 @@ describe('path_shorten_fname_if_possible', function()
lfs.rmdir('ut_directory')
end)
- describe('path_shorten_fname_if_possible', function()
- it('returns shortened path if possible', function()
+ describe('path_try_shorten_fname', function()
+ itp('returns shortened path if possible', function()
lfs.chdir('ut_directory')
local full = to_cstr(lfs.currentdir() .. '/subdir/file.txt')
- eq('subdir/file.txt', (ffi.string(path.path_shorten_fname_if_possible(full))))
+ eq('subdir/file.txt', (ffi.string(cimp.path_try_shorten_fname(full))))
end)
- it('returns `full_path` if a shorter version is not possible', function()
+ itp('returns `full_path` if a shorter version is not possible', function()
local old = lfs.currentdir()
lfs.chdir('ut_directory')
local full = old .. '/subdir/file.txt'
- eq(full, (ffi.string(path.path_shorten_fname_if_possible(to_cstr(full)))))
+ eq(full, (ffi.string(cimp.path_try_shorten_fname(to_cstr(full)))))
end)
- it('returns NULL if `full_path` is NULL', function()
- eq(NULL, (path.path_shorten_fname_if_possible(NULL)))
+ itp('returns NULL if `full_path` is NULL', function()
+ eq(NULL, (cimp.path_try_shorten_fname(NULL)))
end)
end)
end)
-describe('more path function', function()
+describe('path.c path_guess_exepath', function()
+ local cwd = lfs.currentdir()
+
+ for _,name in ipairs({'./nvim', '.nvim', 'foo/nvim'}) do
+ itp('"'..name..'" returns name catenated with CWD', function()
+ local bufsize = 255
+ local buf = cstr(bufsize, '')
+ cimp.path_guess_exepath(name, buf, bufsize)
+ eq(cwd..'/'..name, ffi.string(buf))
+ end)
+ end
+
+ itp('absolute path returns the name unmodified', function()
+ local name = '/foo/bar/baz'
+ local bufsize = 255
+ local buf = cstr(bufsize, '')
+ cimp.path_guess_exepath(name, buf, bufsize)
+ eq(name, ffi.string(buf))
+ end)
+
+ itp('returns the name unmodified if not found in $PATH', function()
+ local name = '23u0293_not_in_path'
+ local bufsize = 255
+ local buf = cstr(bufsize, '')
+ cimp.path_guess_exepath(name, buf, bufsize)
+ eq(name, ffi.string(buf))
+ end)
+
+ itp('does not crash if $PATH item exceeds MAXPATHL', function()
+ local orig_path_env = os.getenv('PATH')
+ local name = 'cat' -- Some executable in $PATH.
+ local bufsize = 255
+ local buf = cstr(bufsize, '')
+ local insane_path = orig_path_env..':'..(("x/"):rep(4097))
+
+ cimp.os_setenv('PATH', insane_path, true)
+ cimp.path_guess_exepath(name, buf, bufsize)
+ eq('bin/' .. name, ffi.string(buf):sub(-#('bin/' .. name), -1))
+
+ -- Restore $PATH.
+ cimp.os_setenv('PATH', orig_path_env, true)
+ end)
+
+ itp('returns full path found in $PATH', function()
+ local name = 'cat' -- Some executable in $PATH.
+ local bufsize = 255
+ local buf = cstr(bufsize, '')
+ cimp.path_guess_exepath(name, buf, bufsize)
+ -- Usually "/bin/cat" on unix, "/path/to/nvim/cat" on Windows.
+ eq('bin/' .. name, ffi.string(buf):sub(-#('bin/' .. name), -1))
+ end)
+end)
+
+describe('path.c', function()
setup(function()
lfs.mkdir('unit-test-directory');
io.open('unit-test-directory/test.file', 'w').close()
@@ -319,115 +366,163 @@ describe('more path function', function()
end)
describe('vim_FullName', function()
- local function vim_FullName(filename, buf, len, force)
- filename = to_cstr(filename)
- return path.vim_FullName(filename, buf, len, force)
+ local function vim_FullName(filename, buflen, do_expand)
+ local buf = cstr(buflen, '')
+ local result = cimp.vim_FullName(to_cstr(filename), buf, buflen, do_expand)
+ return buf, result
end
- before_each(function()
- -- Create empty string buffer which will contain the resulting path.
- length = (string.len(lfs.currentdir())) + 33
- buffer = cstr(length, '')
+ local function get_buf_len(s, t)
+ return math.max(string.len(s), string.len(t)) + 1
+ end
+
+ itp('fails if given filename is NULL', function()
+ local do_expand = 1
+ local buflen = 10
+ local buf = cstr(buflen, '')
+ local result = cimp.vim_FullName(NULL, buf, buflen, do_expand)
+ eq(FAIL, result)
end)
- it('fails if given filename is NULL', function()
- local force_expansion = 1
- local result = path.vim_FullName(NULL, buffer, length, force_expansion)
+ itp('fails safely if given length is wrong #5737', function()
+ local filename = 'foo/bar/bazzzzzzz/buz/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/a'
+ local too_short_len = 8
+ local buf = cstr(too_short_len, '')
+ local do_expand = 1
+ local result = cimp.vim_FullName(filename, buf, too_short_len, do_expand)
+ local expected = string.sub(filename, 1, (too_short_len - 1))
+ eq(expected, ffi.string(buf))
eq(FAIL, result)
end)
- it('uses the filename if the filename is a URL', function()
- local force_expansion = 1
+ itp('uses the filename if the filename is a URL', function()
local filename = 'http://www.neovim.org'
- local result = vim_FullName(filename, buffer, length, force_expansion)
- eq(filename, (ffi.string(buffer)))
+ local buflen = string.len(filename) + 1
+ local do_expand = 1
+ local buf, result = vim_FullName(filename, buflen, do_expand)
+ eq(filename, ffi.string(buf))
eq(OK, result)
end)
- it('fails and uses filename if given filename contains non-existing directory', function()
- local force_expansion = 1
+ itp('fails and uses filename if given filename contains non-existing directory', function()
local filename = 'non_existing_dir/test.file'
- local result = vim_FullName(filename, buffer, length, force_expansion)
- eq(filename, (ffi.string(buffer)))
+ local buflen = string.len(filename) + 1
+ local do_expand = 1
+ local buf, result = vim_FullName(filename, buflen, do_expand)
+ eq(filename, ffi.string(buf))
eq(FAIL, result)
end)
- it('concatenates given filename if it does not contain a slash', function()
- local force_expansion = 1
- local result = vim_FullName('test.file', buffer, length, force_expansion)
+ itp('concatenates filename if it does not contain a slash', function()
local expected = lfs.currentdir() .. '/test.file'
- eq(expected, (ffi.string(buffer)))
+ local filename = 'test.file'
+ local buflen = get_buf_len(expected, filename)
+ local do_expand = 1
+ local buf, result = vim_FullName(filename, buflen, do_expand)
+ eq(expected, ffi.string(buf))
eq(OK, result)
end)
- it('concatenates given filename if it is a directory but does not contain a\n slash', function()
- local force_expansion = 1
- local result = vim_FullName('..', buffer, length, force_expansion)
+ itp('concatenates directory name if it does not contain a slash', function()
local expected = lfs.currentdir() .. '/..'
- eq(expected, (ffi.string(buffer)))
+ local filename = '..'
+ local buflen = get_buf_len(expected, filename)
+ local do_expand = 1
+ local buf, result = vim_FullName(filename, buflen, do_expand)
+ eq(expected, ffi.string(buf))
eq(OK, result)
end)
- -- Is it possible for every developer to enter '..' directory while running
- -- the unit tests? Which other directory would be better?
- it('enters given directory (instead of just concatenating the strings) if possible and if path contains a slash', function()
- local force_expansion = 1
- local result = vim_FullName('../test.file', buffer, length, force_expansion)
+ itp('enters given directory (instead of just concatenating the strings) if possible and if path contains a slash', function()
local old_dir = lfs.currentdir()
lfs.chdir('..')
local expected = lfs.currentdir() .. '/test.file'
lfs.chdir(old_dir)
- eq(expected, (ffi.string(buffer)))
+ local filename = '../test.file'
+ local buflen = get_buf_len(expected, filename)
+ local do_expand = 1
+ local buf, result = vim_FullName(filename, buflen, do_expand)
+ eq(expected, ffi.string(buf))
eq(OK, result)
end)
- it('just copies the path if it is already absolute and force=0', function()
- local force_expansion = 0
+ itp('just copies the path if it is already absolute and force=0', function()
local absolute_path = '/absolute/path'
- local result = vim_FullName(absolute_path, buffer, length, force_expansion)
- eq(absolute_path, (ffi.string(buffer)))
+ local buflen = string.len(absolute_path) + 1
+ local do_expand = 0
+ local buf, result = vim_FullName(absolute_path, buflen, do_expand)
+ eq(absolute_path, ffi.string(buf))
eq(OK, result)
end)
- it('fails and uses filename when the path is relative to HOME', function()
- local force_expansion = 1
+ itp('fails and uses filename when the path is relative to HOME', function()
+ eq(false, cimp.os_isdir('~')) -- sanity check: no literal "~" directory.
local absolute_path = '~/home.file'
- local result = vim_FullName(absolute_path, buffer, length, force_expansion)
- eq(absolute_path, (ffi.string(buffer)))
+ local buflen = string.len(absolute_path) + 1
+ local do_expand = 1
+ local buf, result = vim_FullName(absolute_path, buflen, do_expand)
+ eq(absolute_path, ffi.string(buf))
eq(FAIL, result)
end)
- it('works with some "normal" relative path with directories', function()
- local force_expansion = 1
- local result = vim_FullName('unit-test-directory/test.file', buffer, length, force_expansion)
+ itp('works with some "normal" relative path with directories', function()
+ local expected = lfs.currentdir() .. '/unit-test-directory/test.file'
+ local filename = 'unit-test-directory/test.file'
+ local buflen = get_buf_len(expected, filename)
+ local do_expand = 1
+ local buf, result = vim_FullName(filename, buflen, do_expand)
+ eq(expected, ffi.string(buf))
eq(OK, result)
- eq(lfs.currentdir() .. '/unit-test-directory/test.file', (ffi.string(buffer)))
end)
- it('does not modify the given filename', function()
- local force_expansion = 1
+ itp('does not modify the given filename', function()
+ local expected = lfs.currentdir() .. '/unit-test-directory/test.file'
local filename = to_cstr('unit-test-directory/test.file')
- -- Don't use the wrapper here but pass a cstring directly to the c
- -- function.
- local result = path.vim_FullName(filename, buffer, length, force_expansion)
- eq(lfs.currentdir() .. '/unit-test-directory/test.file', (ffi.string(buffer)))
- eq('unit-test-directory/test.file', (ffi.string(filename)))
+ local buflen = string.len(expected) + 1
+ local buf = cstr(buflen, '')
+ local do_expand = 1
+ -- Don't use the wrapper but pass a cstring directly to the c function.
+ eq('unit-test-directory/test.file', ffi.string(filename))
+ local result = cimp.vim_FullName(filename, buf, buflen, do_expand)
+ eq(expected, ffi.string(buf))
+ eq(OK, result)
+ end)
+
+ itp('works with directories that have one path component', function()
+ local filename = '/tmp'
+ local expected = filename
+ local buflen = get_buf_len(expected, filename)
+ local do_expand = 1
+ local buf, result = vim_FullName(filename, buflen, do_expand)
+ eq('/tmp', ffi.string(buf))
+ eq(OK, result)
+ end)
+
+ itp('expands "./" to the current directory #7117', function()
+ local expected = lfs.currentdir() .. '/unit-test-directory/test.file'
+ local filename = './unit-test-directory/test.file'
+ local buflen = get_buf_len(expected, filename)
+ local do_expand = 1
+ local buf, result = vim_FullName(filename, buflen, do_expand)
eq(OK, result)
+ eq(expected, ffi.string(buf))
end)
- it('works with directories that have one path component', function()
- local force_expansion = 1
- local filename = to_cstr('/tmp')
- local result = path.vim_FullName(filename, buffer, length, force_expansion)
- eq('/tmp', ffi.string(buffer))
+ itp('collapses "foo/../foo" to "foo" #7117', function()
+ local expected = lfs.currentdir() .. '/unit-test-directory/test.file'
+ local filename = 'unit-test-directory/../unit-test-directory/test.file'
+ local buflen = get_buf_len(expected, filename)
+ local do_expand = 1
+ local buf, result = vim_FullName(filename, buflen, do_expand)
eq(OK, result)
+ eq(expected, ffi.string(buf))
end)
end)
describe('path_fix_case', function()
local function fix_case(file)
local c_file = to_cstr(file)
- path.path_fix_case(c_file)
+ cimp.path_fix_case(c_file)
return ffi.string(c_file)
end
@@ -435,12 +530,12 @@ describe('more path function', function()
after_each(function() lfs.rmdir('CamelCase') end)
if ffi.os == 'Windows' or ffi.os == 'OSX' then
- it('Corrects the case of file names in Mac and Windows', function()
+ itp('Corrects the case of file names in Mac and Windows', function()
eq('CamelCase', fix_case('camelcase'))
eq('CamelCase', fix_case('cAMELcASE'))
end)
else
- it('does nothing on Linux', function()
+ itp('does nothing on Linux', function()
eq('camelcase', fix_case('camelcase'))
eq('cAMELcASE', fix_case('cAMELcASE'))
end)
@@ -448,64 +543,64 @@ describe('more path function', function()
end)
describe('append_path', function()
- it('joins given paths with a slash', function()
+ itp('joins given paths with a slash', function()
local path1 = cstr(100, 'path1')
local to_append = to_cstr('path2')
- eq(OK, (path.append_path(path1, to_append, 100)))
+ eq(OK, (cimp.append_path(path1, to_append, 100)))
eq("path1/path2", (ffi.string(path1)))
end)
- it('joins given paths without adding an unnecessary slash', function()
+ itp('joins given paths without adding an unnecessary slash', function()
local path1 = cstr(100, 'path1/')
local to_append = to_cstr('path2')
- eq(OK, path.append_path(path1, to_append, 100))
+ eq(OK, cimp.append_path(path1, to_append, 100))
eq("path1/path2", (ffi.string(path1)))
end)
- it('fails and uses filename if there is not enough space left for to_append', function()
+ itp('fails and uses filename if there is not enough space left for to_append', function()
local path1 = cstr(11, 'path1/')
local to_append = to_cstr('path2')
- eq(FAIL, (path.append_path(path1, to_append, 11)))
+ eq(FAIL, (cimp.append_path(path1, to_append, 11)))
end)
- it('does not append a slash if to_append is empty', function()
+ itp('does not append a slash if to_append is empty', function()
local path1 = cstr(6, 'path1')
local to_append = to_cstr('')
- eq(OK, (path.append_path(path1, to_append, 6)))
+ eq(OK, (cimp.append_path(path1, to_append, 6)))
eq('path1', (ffi.string(path1)))
end)
- it('does not append unnecessary dots', function()
+ itp('does not append unnecessary dots', function()
local path1 = cstr(6, 'path1')
local to_append = to_cstr('.')
- eq(OK, (path.append_path(path1, to_append, 6)))
+ eq(OK, (cimp.append_path(path1, to_append, 6)))
eq('path1', (ffi.string(path1)))
end)
- it('copies to_append to path, if path is empty', function()
+ itp('copies to_append to path, if path is empty', function()
local path1 = cstr(7, '')
local to_append = to_cstr('/path2')
- eq(OK, (path.append_path(path1, to_append, 7)))
+ eq(OK, (cimp.append_path(path1, to_append, 7)))
eq('/path2', (ffi.string(path1)))
end)
end)
- describe('path_is_absolute_path', function()
- local function path_is_absolute_path(filename)
+ describe('path_is_absolute', function()
+ local function path_is_absolute(filename)
filename = to_cstr(filename)
- return path.path_is_absolute_path(filename)
+ return cimp.path_is_absolute(filename)
end
- it('returns true if filename starts with a slash', function()
- eq(OK, path_is_absolute_path('/some/directory/'))
+ itp('returns true if filename starts with a slash', function()
+ eq(OK, path_is_absolute('/some/directory/'))
end)
- it('returns true if filename starts with a tilde', function()
- eq(OK, path_is_absolute_path('~/in/my/home~/directory'))
+ itp('returns true if filename starts with a tilde', function()
+ eq(OK, path_is_absolute('~/in/my/home~/directory'))
end)
- it('returns false if filename starts not with slash nor tilde', function()
- eq(FAIL, path_is_absolute_path('not/in/my/home~/directory'))
+ itp('returns false if filename starts not with slash nor tilde', function()
+ eq(FAIL, path_is_absolute('not/in/my/home~/directory'))
end)
end)
end)
diff --git a/test/unit/preload.lua b/test/unit/preload.lua
index d8ec2c3943..841e19b878 100644
--- a/test/unit/preload.lua
+++ b/test/unit/preload.lua
@@ -2,6 +2,6 @@
-- Busted started doing this to help provide more isolation. See issue #62
-- for more information about this.
local ffi = require('ffi')
-local helpers = require('test.unit.helpers')
+local helpers = require('test.unit.helpers')(nil)
local lfs = require('lfs')
local preprocess = require('test.unit.preprocess')
diff --git a/test/unit/preprocess.lua b/test/unit/preprocess.lua
index e5c838b13b..1073855a7d 100644
--- a/test/unit/preprocess.lua
+++ b/test/unit/preprocess.lua
@@ -2,34 +2,29 @@
-- windows, will probably need quite a bit of adjustment to run there.
local ffi = require("ffi")
+local global_helpers = require('test.helpers')
+
+local argss_to_cmd = global_helpers.argss_to_cmd
+local repeated_read_cmd = global_helpers.repeated_read_cmd
local ccs = {}
local env_cc = os.getenv("CC")
if env_cc then
- table.insert(ccs, {path = "/usr/bin/env " .. tostring(env_cc), type = "gcc"})
+ table.insert(ccs, {path = {"/usr/bin/env", env_cc}, type = "gcc"})
end
if ffi.os == "Windows" then
- table.insert(ccs, {path = "cl", type = "msvc"})
+ table.insert(ccs, {path = {"cl"}, type = "msvc"})
end
-table.insert(ccs, {path = "/usr/bin/env cc", type = "gcc"})
-table.insert(ccs, {path = "/usr/bin/env gcc", type = "gcc"})
-table.insert(ccs, {path = "/usr/bin/env gcc-4.9", type = "gcc"})
-table.insert(ccs, {path = "/usr/bin/env gcc-4.8", type = "gcc"})
-table.insert(ccs, {path = "/usr/bin/env gcc-4.7", type = "gcc"})
-table.insert(ccs, {path = "/usr/bin/env clang", type = "clang"})
-table.insert(ccs, {path = "/usr/bin/env icc", type = "gcc"})
-
-local quote_me = '[^%w%+%-%=%@%_%/]' -- complement (needn't quote)
-local function shell_quote(str)
- if string.find(str, quote_me) or str == '' then
- return "'" .. string.gsub(str, "'", [['"'"']]) .. "'"
- else
- return str
- end
-end
+table.insert(ccs, {path = {"/usr/bin/env", "cc"}, type = "gcc"})
+table.insert(ccs, {path = {"/usr/bin/env", "gcc"}, type = "gcc"})
+table.insert(ccs, {path = {"/usr/bin/env", "gcc-4.9"}, type = "gcc"})
+table.insert(ccs, {path = {"/usr/bin/env", "gcc-4.8"}, type = "gcc"})
+table.insert(ccs, {path = {"/usr/bin/env", "gcc-4.7"}, type = "gcc"})
+table.insert(ccs, {path = {"/usr/bin/env", "clang"}, type = "clang"})
+table.insert(ccs, {path = {"/usr/bin/env", "icc"}, type = "gcc"})
-- parse Makefile format dependencies into a Lua table
local function parse_make_deps(deps)
@@ -61,12 +56,12 @@ end
-- will produce a string that represents a meta C header file that includes
-- all the passed in headers. I.e.:
--
--- headerize({"stdio.h", "math.h", true}
+-- headerize({"stdio.h", "math.h"}, true)
-- produces:
-- #include <stdio.h>
-- #include <math.h>
--
--- headerize({"vim.h", "memory.h", false}
+-- headerize({"vim.h", "memory.h"}, false)
-- produces:
-- #include "vim.h"
-- #include "memory.h"
@@ -79,8 +74,7 @@ local function headerize(headers, global)
end
local formatted = {}
- for i = 1, #headers do
- local hdr = headers[i]
+ for _, hdr in ipairs(headers) do
formatted[#formatted + 1] = "#include " ..
tostring(pre) ..
tostring(hdr) ..
@@ -91,44 +85,69 @@ local function headerize(headers, global)
end
local Gcc = {
+ preprocessor_extra_flags = {},
+ get_defines_extra_flags = {'-std=c99', '-dM', '-E'},
+ get_declarations_extra_flags = {'-std=c99', '-P', '-E'},
+}
+
+function Gcc:define(name, args, val)
+ local define = '-D' .. name
+ if args ~= nil then
+ define = define .. '(' .. table.concat(args, ',') .. ')'
+ end
+ if val ~= nil then
+ define = define .. '=' .. val
+ end
+ self.preprocessor_extra_flags[#self.preprocessor_extra_flags + 1] = define
+end
+
+function Gcc:undefine(name)
+ self.preprocessor_extra_flags[#self.preprocessor_extra_flags + 1] = (
+ '-U' .. name)
+end
+
+function Gcc:init_defines()
-- preprocessor flags that will hopefully make the compiler produce C
-- declarations that the LuaJIT ffi understands.
- preprocessor_extra_flags = {
- '-D "aligned(ARGS)="',
- '-D "__attribute__(ARGS)="',
- '-D "__asm(ARGS)="',
- '-D "__asm__(ARGS)="',
- '-D "__inline__="',
- '-D "EXTERN=extern"',
- '-D "INIT(...)="',
- '-D_GNU_SOURCE',
- '-DINCLUDE_GENERATED_DECLARATIONS',
-
- -- Needed for FreeBSD
- '-D "_Thread_local="'
- }
-}
+ self:define('aligned', {'ARGS'}, '')
+ self:define('__attribute__', {'ARGS'}, '')
+ self:define('__asm', {'ARGS'}, '')
+ self:define('__asm__', {'ARGS'}, '')
+ self:define('__inline__', nil, '')
+ self:define('EXTERN', nil, 'extern')
+ self:define('INIT', {'...'}, '')
+ self:define('_GNU_SOURCE')
+ self:define('INCLUDE_GENERATED_DECLARATIONS')
+ self:define('UNIT_TESTING')
+ self:define('UNIT_TESTING_LUA_PREPROCESSING')
+ -- Needed for FreeBSD
+ self:define('_Thread_local', nil, '')
+ -- Needed for macOS Sierra
+ self:define('_Nullable', nil, '')
+ self:define('_Nonnull', nil, '')
+ self:undefine('__BLOCKS__')
+end
function Gcc:new(obj)
obj = obj or {}
setmetatable(obj, self)
self.__index = self
+ self:init_defines()
return obj
end
function Gcc:add_to_include_path(...)
- local paths = {...}
- for i = 1, #paths do
- local path = paths[i]
- local directive = '-I ' .. '"' .. path .. '"'
+ for i = 1, select('#', ...) do
+ local path = select(i, ...)
local ef = self.preprocessor_extra_flags
- ef[#ef + 1] = directive
+ ef[#ef + 1] = '-I' .. path
end
end
-- returns a list of the headers files upon which this file relies
function Gcc:dependencies(hdr)
- local out = io.popen(tostring(self.path) .. " -M " .. tostring(hdr) .. " 2>&1")
+ local cmd = argss_to_cmd(self.path, {'-M', hdr}) .. ' 2>&1'
+ local out = io.popen(cmd)
local deps = out:read("*a")
out:close()
if deps then
@@ -138,23 +157,63 @@ function Gcc:dependencies(hdr)
end
end
+function Gcc:filter_standard_defines(defines)
+ if not self.standard_defines then
+ local pseudoheader_fname = 'tmp_empty_pseudoheader.h'
+ local pseudoheader_file = io.open(pseudoheader_fname, 'w')
+ pseudoheader_file:close()
+ local standard_defines = repeated_read_cmd(self.path,
+ self.preprocessor_extra_flags,
+ self.get_defines_extra_flags,
+ {pseudoheader_fname})
+ os.remove(pseudoheader_fname)
+ self.standard_defines = {}
+ for line in standard_defines:gmatch('[^\n]+') do
+ self.standard_defines[line] = true
+ end
+ end
+ local ret = {}
+ for line in defines:gmatch('[^\n]+') do
+ if not self.standard_defines[line] then
+ ret[#ret + 1] = line
+ end
+ end
+ return table.concat(ret, "\n")
+end
+
-- returns a stream representing a preprocessed form of the passed-in headers.
-- Don't forget to close the stream by calling the close() method on it.
-function Gcc:preprocess_stream(...)
+function Gcc:preprocess(previous_defines, ...)
-- create pseudo-header
local pseudoheader = headerize({...}, false)
- local defines = table.concat(self.preprocessor_extra_flags, ' ')
- local cmd = ("echo $hdr | " ..
- tostring(self.path) ..
- " " ..
- tostring(defines) ..
- " -std=c99 -P -E -"):gsub('$hdr', shell_quote(pseudoheader))
+ local pseudoheader_fname = 'tmp_pseudoheader.h'
+ local pseudoheader_file = io.open(pseudoheader_fname, 'w')
+ pseudoheader_file:write(previous_defines)
+ pseudoheader_file:write("\n")
+ pseudoheader_file:write(pseudoheader)
+ pseudoheader_file:flush()
+ pseudoheader_file:close()
+
+ local defines = repeated_read_cmd(self.path, self.preprocessor_extra_flags,
+ self.get_defines_extra_flags,
+ {pseudoheader_fname})
+ defines = self:filter_standard_defines(defines)
+
-- lfs = require("lfs")
-- print("CWD: #{lfs.currentdir!}")
-- print("CMD: #{cmd}")
-- io.stderr\write("CWD: #{lfs.currentdir!}\n")
-- io.stderr\write("CMD: #{cmd}\n")
- return io.popen(cmd)
+
+ local declarations = repeated_read_cmd(self.path,
+ self.preprocessor_extra_flags,
+ self.get_declarations_extra_flags,
+ {pseudoheader_fname})
+
+ os.remove(pseudoheader_fname)
+
+ assert(declarations and defines)
+ return declarations, defines
end
local Clang = Gcc:new()
@@ -192,8 +251,8 @@ return {
includes = function(hdr)
return cc:dependencies(hdr)
end,
- preprocess_stream = function(...)
- return cc:preprocess_stream(...)
+ preprocess = function(...)
+ return cc:preprocess(...)
end,
add_to_include_path = function(...)
return cc:add_to_include_path(...)
diff --git a/test/unit/profile_spec.lua b/test/unit/profile_spec.lua
index 852475fe2c..08e5cedbab 100644
--- a/test/unit/profile_spec.lua
+++ b/test/unit/profile_spec.lua
@@ -1,10 +1,13 @@
-local helpers = require 'test.unit.helpers'
+local helpers = require('test.unit.helpers')(after_each)
+local itp = helpers.gen_itp(it)
-local prof = helpers.cimport './src/nvim/profile.h'
+local cimport = helpers.cimport
local ffi = helpers.ffi
local eq = helpers.eq
local neq = helpers.neq
+local prof = cimport('./src/nvim/profile.h')
+
local function split(inputstr, sep)
if sep == nil then
sep = "%s"
@@ -78,7 +81,7 @@ describe('profiling related functions', function()
end
describe('profile_equal', function()
- it('times are equal to themselves', function()
+ itp('times are equal to themselves', function()
local start = profile_start()
assert.is_true(profile_equal(start, start))
@@ -86,7 +89,7 @@ describe('profiling related functions', function()
assert.is_true(profile_equal(e, e))
end)
- it('times are unequal to others', function()
+ itp('times are unequal to others', function()
assert.is_false(profile_equal(profile_start(), profile_start()))
end)
end)
@@ -95,24 +98,24 @@ describe('profiling related functions', function()
-- the profiling package. Those functions in turn will probably be tested
-- using profile_cmp... circular reasoning.
describe('profile_cmp', function()
- it('can compare subsequent starts', function()
+ itp('can compare subsequent starts', function()
local s1, s2 = profile_start(), profile_start()
assert.is_true(profile_cmp(s1, s2) > 0)
assert.is_true(profile_cmp(s2, s1) < 0)
end)
- it('can compare the zero element', function()
+ itp('can compare the zero element', function()
assert.is_true(profile_cmp(profile_zero(), profile_zero()) == 0)
end)
- it('correctly orders divisions', function()
+ itp('correctly orders divisions', function()
local start = profile_start()
assert.is_true(profile_cmp(start, profile_divide(start, 10)) <= 0)
end)
end)
describe('profile_divide', function()
- it('actually performs division', function()
+ itp('actually performs division', function()
-- note: the routine actually performs floating-point division to get
-- better rounding behaviour, we have to take that into account when
-- checking. (check range, not exact number).
@@ -134,14 +137,14 @@ describe('profiling related functions', function()
end)
describe('profile_zero', function()
- it('returns the same value on each call', function()
+ itp('returns the same value on each call', function()
eq(0, profile_zero())
assert.is_true(profile_equal(profile_zero(), profile_zero()))
end)
end)
describe('profile_start', function()
- it('increases', function()
+ itp('increases', function()
local last = profile_start()
for _ = 1, 100 do
local curr = profile_start()
@@ -152,11 +155,11 @@ describe('profiling related functions', function()
end)
describe('profile_end', function()
- it('the elapsed time cannot be zero', function()
+ itp('the elapsed time cannot be zero', function()
neq(profile_zero(), profile_end(profile_start()))
end)
- it('outer elapsed >= inner elapsed', function()
+ itp('outer elapsed >= inner elapsed', function()
for _ = 1, 100 do
local start_outer = profile_start()
local start_inner = profile_start()
@@ -169,11 +172,11 @@ describe('profiling related functions', function()
end)
describe('profile_setlimit', function()
- it('sets no limit when 0 is passed', function()
+ itp('sets no limit when 0 is passed', function()
eq(true, profile_equal(profile_setlimit(0), profile_zero()))
end)
- it('sets a limit in the future otherwise', function()
+ itp('sets a limit in the future otherwise', function()
local future = profile_setlimit(1000)
local now = profile_start()
assert.is_true(profile_cmp(future, now) < 0)
@@ -181,12 +184,12 @@ describe('profiling related functions', function()
end)
describe('profile_passed_limit', function()
- it('start is in the past', function()
+ itp('start is in the past', function()
local start = profile_start()
eq(true, profile_passed_limit(start))
end)
- it('start + start is in the future', function()
+ itp('start + start is in the future', function()
local start = profile_start()
local future = profile_add(start, start)
eq(false, profile_passed_limit(future))
@@ -194,12 +197,12 @@ describe('profiling related functions', function()
end)
describe('profile_msg', function()
- it('prints the zero time as 0.00000', function()
+ itp('prints the zero time as 0.00000', function()
local str = trim(profile_msg(profile_zero()))
eq(str, "0.000000")
end)
- it('prints the time passed, in seconds.microsends', function()
+ itp('prints the time passed, in seconds.microsends', function()
local start = profile_start()
local endt = profile_end(start)
local str = trim(profile_msg(endt))
@@ -221,14 +224,14 @@ describe('profiling related functions', function()
end)
describe('profile_add', function()
- it('adds profiling times', function()
+ itp('adds profiling times', function()
local start = profile_start()
assert.equals(start, profile_add(profile_zero(), start))
end)
end)
describe('profile_sub', function()
- it('subtracts profiling times', function()
+ itp('subtracts profiling times', function()
-- subtracting zero does nothing
local start = profile_start()
assert.equals(start, profile_sub(start, profile_zero()))
diff --git a/test/unit/queue_spec.lua b/test/unit/queue_spec.lua
deleted file mode 100644
index 9326c1cad6..0000000000
--- a/test/unit/queue_spec.lua
+++ /dev/null
@@ -1,123 +0,0 @@
-local helpers = require("test.unit.helpers")
-
-local ffi = helpers.ffi
-local eq = helpers.eq
-
-local queue = helpers.cimport("./test/unit/fixtures/queue.h")
-
-describe('queue', function()
- local parent, child1, child2, child3
-
- local function put(q, str)
- queue.ut_queue_put(q, str)
- end
-
- local function get(q)
- return ffi.string(queue.ut_queue_get(q))
- end
-
- local function free(q)
- queue.queue_free(q)
- end
-
- before_each(function()
- parent = queue.queue_new_parent(ffi.NULL, ffi.NULL)
- child1 = queue.queue_new_child(parent)
- child2 = queue.queue_new_child(parent)
- child3 = queue.queue_new_child(parent)
- put(child1, 'c1i1')
- put(child1, 'c1i2')
- put(child2, 'c2i1')
- put(child1, 'c1i3')
- put(child2, 'c2i2')
- put(child2, 'c2i3')
- put(child2, 'c2i4')
- put(child3, 'c3i1')
- put(child3, 'c3i2')
- end)
-
- it('removing from parent removes from child', function()
- eq('c1i1', get(parent))
- eq('c1i2', get(parent))
- eq('c2i1', get(parent))
- eq('c1i3', get(parent))
- eq('c2i2', get(parent))
- eq('c2i3', get(parent))
- eq('c2i4', get(parent))
- end)
-
- it('removing from child removes from parent', function()
- eq('c2i1', get(child2))
- eq('c2i2', get(child2))
- eq('c1i1', get(child1))
- eq('c1i2', get(parent))
- eq('c1i3', get(parent))
- eq('c2i3', get(parent))
- eq('c2i4', get(parent))
- end)
-
- it('removing from child at the beginning of parent', function()
- eq('c1i1', get(child1))
- eq('c1i2', get(child1))
- eq('c2i1', get(parent))
- end)
-
- it('removing from parent after get from parent and put to child', function()
- eq('c1i1', get(parent))
- eq('c1i2', get(parent))
- eq('c2i1', get(parent))
- eq('c1i3', get(parent))
- eq('c2i2', get(parent))
- eq('c2i3', get(parent))
- eq('c2i4', get(parent))
- eq('c3i1', get(parent))
- put(child1, 'c1i11')
- put(child1, 'c1i22')
- eq('c3i2', get(parent))
- eq('c1i11', get(parent))
- eq('c1i22', get(parent))
- end)
-
- it('removing from parent after get and put to child', function()
- eq('c1i1', get(child1))
- eq('c1i2', get(child1))
- eq('c2i1', get(child2))
- eq('c1i3', get(child1))
- eq('c2i2', get(child2))
- eq('c2i3', get(child2))
- eq('c2i4', get(child2))
- eq('c3i1', get(child3))
- eq('c3i2', get(parent))
- put(child1, 'c1i11')
- put(child2, 'c2i11')
- put(child1, 'c1i12')
- eq('c2i11', get(child2))
- eq('c1i11', get(parent))
- eq('c1i12', get(parent))
- end)
-
- it('put after removing from child at the end of parent', function()
- eq('c3i1', get(child3))
- eq('c3i2', get(child3))
- put(child1, 'c1i11')
- put(child2, 'c2i11')
- eq('c1i1', get(parent))
- eq('c1i2', get(parent))
- eq('c2i1', get(parent))
- eq('c1i3', get(parent))
- eq('c2i2', get(parent))
- eq('c2i3', get(parent))
- eq('c2i4', get(parent))
- eq('c1i11', get(parent))
- eq('c2i11', get(parent))
- end)
-
- it('removes from parent queue when child is freed', function()
- free(child2)
- eq('c1i1', get(parent))
- eq('c1i2', get(parent))
- eq('c1i3', get(parent))
- eq('c3i1', get(child3))
- eq('c3i2', get(child3))
- end)
-end)
diff --git a/test/unit/rbuffer_spec.lua b/test/unit/rbuffer_spec.lua
index 89136410d3..e9104dd5c4 100644
--- a/test/unit/rbuffer_spec.lua
+++ b/test/unit/rbuffer_spec.lua
@@ -1,9 +1,11 @@
-local helpers = require("test.unit.helpers")
+local helpers = require("test.unit.helpers")(after_each)
+local itp = helpers.gen_itp(it)
-local ffi = helpers.ffi
-local eq = helpers.eq
-local cstr = helpers.cstr
+local eq = helpers.eq
+local ffi = helpers.ffi
+local cstr = helpers.cstr
local to_cstr = helpers.to_cstr
+local child_call_once = helpers.child_call_once
local rbuffer = helpers.cimport("./test/unit/fixtures/rbuffer.h")
@@ -31,9 +33,11 @@ describe('rbuffer functions', function()
end
before_each(function()
- rbuf = ffi.gc(rbuffer.rbuffer_new(capacity), rbuffer.rbuffer_free)
- -- fill the internal buffer with the character '0' to simplify inspecting
- ffi.C.memset(rbuf.start_ptr, string.byte('0'), capacity)
+ child_call_once(function()
+ rbuf = ffi.gc(rbuffer.rbuffer_new(capacity), rbuffer.rbuffer_free)
+ -- fill the internal buffer with the character '0' to simplify inspecting
+ ffi.C.memset(rbuf.start_ptr, string.byte('0'), capacity)
+ end)
end)
describe('RBUFFER_UNTIL_FULL', function()
@@ -50,66 +54,51 @@ describe('rbuffer functions', function()
end)
describe('with empty buffer in one contiguous chunk', function()
- it('is called once with the empty chunk', function()
+ itp('is called once with the empty chunk', function()
collect_write_chunks()
eq({'0000000000000000'}, chunks)
end)
end)
describe('with partially empty buffer in one contiguous chunk', function()
- before_each(function()
+ itp('is called once with the empty chunk', function()
write('string')
- end)
-
- it('is called once with the empty chunk', function()
collect_write_chunks()
eq({'0000000000'}, chunks)
end)
end)
describe('with filled buffer in one contiguous chunk', function()
- before_each(function()
+ itp('is not called', function()
write('abcdefghijklmnopq')
- end)
-
- it('is not called', function()
collect_write_chunks()
eq({}, chunks)
end)
end)
describe('with buffer partially empty in two contiguous chunks', function()
- before_each(function()
+ itp('is called twice with each filled chunk', function()
write('1234567890')
read(8)
- end)
-
- it('is called twice with each filled chunk', function()
collect_write_chunks()
eq({'000000', '12345678'}, chunks)
end)
end)
describe('with buffer empty in two contiguous chunks', function()
- before_each(function()
+ itp('is called twice with each filled chunk', function()
write('12345678')
read(8)
- end)
-
- it('is called twice with each filled chunk', function()
collect_write_chunks()
eq({'00000000', '12345678'}, chunks)
end)
end)
describe('with buffer filled in two contiguous chunks', function()
- before_each(function()
+ itp('is not called', function()
write('12345678')
read(8)
write('abcdefghijklmnopq')
- end)
-
- it('is not called', function()
collect_write_chunks()
eq({}, chunks)
end)
@@ -130,55 +119,43 @@ describe('rbuffer functions', function()
end)
describe('with empty buffer', function()
- it('is not called', function()
+ itp('is not called', function()
collect_read_chunks()
eq({}, chunks)
end)
end)
describe('with partially filled buffer in one contiguous chunk', function()
- before_each(function()
+ itp('is called once with the filled chunk', function()
write('string')
- end)
-
- it('is called once with the filled chunk', function()
collect_read_chunks()
eq({'string'}, chunks)
end)
end)
describe('with filled buffer in one contiguous chunk', function()
- before_each(function()
+ itp('is called once with the filled chunk', function()
write('abcdefghijklmnopq')
- end)
-
- it('is called once with the filled chunk', function()
collect_read_chunks()
eq({'abcdefghijklmnop'}, chunks)
end)
end)
describe('with buffer partially filled in two contiguous chunks', function()
- before_each(function()
+ itp('is called twice with each filled chunk', function()
write('1234567890')
read(10)
write('long string')
- end)
-
- it('is called twice with each filled chunk', function()
collect_read_chunks()
eq({'long s', 'tring'}, chunks)
end)
end)
describe('with buffer filled in two contiguous chunks', function()
- before_each(function()
+ itp('is called twice with each filled chunk', function()
write('12345678')
read(8)
write('abcdefghijklmnopq')
- end)
-
- it('is called twice with each filled chunk', function()
collect_read_chunks()
eq({'abcdefgh', 'ijklmnop'}, chunks)
end)
@@ -198,20 +175,17 @@ describe('rbuffer functions', function()
end)
describe('with empty buffer', function()
- it('is not called', function()
+ itp('is not called', function()
collect_chars()
eq({}, chars)
end)
end)
describe('with buffer filled in two contiguous chunks', function()
- before_each(function()
+ itp('collects each character and index', function()
write('1234567890')
read(10)
write('long string')
- end)
-
- it('collects each character and index', function()
collect_chars()
eq({{'l', 0}, {'o', 1}, {'n', 2}, {'g', 3}, {' ', 4}, {'s', 5},
{'t', 6}, {'r', 7}, {'i', 8}, {'n', 9}, {'g', 10}}, chars)
@@ -232,20 +206,17 @@ describe('rbuffer functions', function()
end)
describe('with empty buffer', function()
- it('is not called', function()
+ itp('is not called', function()
collect_chars()
eq({}, chars)
end)
end)
describe('with buffer filled in two contiguous chunks', function()
- before_each(function()
+ itp('collects each character and index', function()
write('1234567890')
read(10)
write('long string')
- end)
-
- it('collects each character and index', function()
collect_chars()
eq({{'g', 10}, {'n', 9}, {'i', 8}, {'r', 7}, {'t', 6}, {'s', 5},
{' ', 4}, {'g', 3}, {'n', 2}, {'o', 1}, {'l', 0}}, chars)
@@ -264,13 +235,10 @@ describe('rbuffer functions', function()
end
describe('with buffer filled in two contiguous chunks', function()
- before_each(function()
+ itp('compares the common longest sequence', function()
write('1234567890')
read(10)
write('long string')
- end)
-
- it('compares the common longest sequence', function()
eq(0, cmp('long string'))
eq(0, cmp('long strin'))
eq(-1, cmp('long striM'))
@@ -282,31 +250,31 @@ describe('rbuffer functions', function()
end)
describe('with empty buffer', function()
- it('returns 0 since no characters are compared', function()
+ itp('returns 0 since no characters are compared', function()
eq(0, cmp(''))
end)
end)
end)
describe('rbuffer_write', function()
- it('fills the internal buffer and returns the write count', function()
+ itp('fills the internal buffer and returns the write count', function()
eq(12, write('short string'))
eq('short string0000', inspect())
end)
- it('wont write beyond capacity', function()
+ itp('wont write beyond capacity', function()
eq(16, write('very very long string'))
eq('very very long s', inspect())
end)
end)
describe('rbuffer_read', function()
- it('reads what was previously written', function()
+ itp('reads what was previously written', function()
write('to read')
eq('to read', read(20))
end)
- it('reads nothing if the buffer is empty', function()
+ itp('reads nothing if the buffer is empty', function()
eq('', read(20))
write('empty')
eq('empty', read(20))
@@ -315,7 +283,7 @@ describe('rbuffer functions', function()
end)
describe('rbuffer_get', function()
- it('fetch the pointer at offset, wrapping if required', function()
+ itp('fetch the pointer at offset, wrapping if required', function()
write('1234567890')
read(10)
write('long string')
@@ -334,7 +302,7 @@ describe('rbuffer functions', function()
end)
describe('wrapping behavior', function()
- it('writing/reading wraps across the end of the internal buffer', function()
+ itp('writing/reading wraps across the end of the internal buffer', function()
write('1234567890')
eq('1234', read(4))
eq('5678', read(4))
diff --git a/test/unit/set.lua b/test/unit/set.lua
index 4e66546f32..f3d68c3042 100644
--- a/test/unit/set.lua
+++ b/test/unit/set.lua
@@ -26,6 +26,22 @@ function Set:new(items)
return obj
end
+function Set:copy()
+ local obj = {}
+ obj.nelem = self.nelem
+ obj.tbl = {}
+ obj.items = {}
+ for k, v in pairs(self.tbl) do
+ obj.tbl[k] = v
+ end
+ for k, v in pairs(self.items) do
+ obj.items[k] = v
+ end
+ setmetatable(obj, Set)
+ obj.__index = Set
+ return obj
+end
+
-- adds the argument Set to this Set
function Set:union(other)
for e in other:iterator() do
diff --git a/test/unit/strings_spec.lua b/test/unit/strings_spec.lua
index 0034670ee8..e54c82b26a 100644
--- a/test/unit/strings_spec.lua
+++ b/test/unit/strings_spec.lua
@@ -1,4 +1,5 @@
-local helpers = require("test.unit.helpers")
+local helpers = require("test.unit.helpers")(after_each)
+local itp = helpers.gen_itp(it)
local cimport = helpers.cimport
local eq = helpers.eq
@@ -13,29 +14,29 @@ describe('vim_strsave_escaped()', function()
local res = strings.vim_strsave_escaped(to_cstr(s), to_cstr(chars))
local ret = ffi.string(res)
- -- Explicitly free memory so we are sure it is allocated: if it was not it
+ -- Explicitly free memory so we are sure it is allocated: if it was not it
-- will crash.
strings.xfree(res)
return ret
end
- it('precedes by a backslash all chars from second argument', function()
+ itp('precedes by a backslash all chars from second argument', function()
eq([[\a\b\c\d]], vim_strsave_escaped('abcd','abcd'))
end)
- it('precedes by a backslash chars only from second argument', function()
+ itp('precedes by a backslash chars only from second argument', function()
eq([[\a\bcd]], vim_strsave_escaped('abcd','ab'))
end)
- it('returns a copy of passed string if second argument is empty', function()
+ itp('returns a copy of passed string if second argument is empty', function()
eq('text \n text', vim_strsave_escaped('text \n text',''))
end)
- it('returns an empty string if first argument is empty string', function()
+ itp('returns an empty string if first argument is empty string', function()
eq('', vim_strsave_escaped('','\r'))
end)
- it('returns a copy of passed string if it does not contain chars from 2nd argument', function()
+ itp('returns a copy of passed string if it does not contain chars from 2nd argument', function()
eq('some text', vim_strsave_escaped('some text', 'a'))
end)
end)
@@ -44,57 +45,96 @@ describe('vim_strnsave_unquoted()', function()
local vim_strnsave_unquoted = function(s, len)
local res = strings.vim_strnsave_unquoted(to_cstr(s), len or #s)
local ret = ffi.string(res)
- -- Explicitly free memory so we are sure it is allocated: if it was not it
+ -- Explicitly free memory so we are sure it is allocated: if it was not it
-- will crash.
strings.xfree(res)
return ret
end
- it('copies unquoted strings as-is', function()
+ itp('copies unquoted strings as-is', function()
eq('-c', vim_strnsave_unquoted('-c'))
eq('', vim_strnsave_unquoted(''))
end)
- it('respects length argument', function()
+ itp('respects length argument', function()
eq('', vim_strnsave_unquoted('-c', 0))
eq('-', vim_strnsave_unquoted('-c', 1))
eq('-', vim_strnsave_unquoted('"-c', 2))
end)
- it('unquotes fully quoted word', function()
+ itp('unquotes fully quoted word', function()
eq('/bin/sh', vim_strnsave_unquoted('"/bin/sh"'))
end)
- it('unquotes partially quoted word', function()
+ itp('unquotes partially quoted word', function()
eq('/Program Files/sh', vim_strnsave_unquoted('/Program" "Files/sh'))
end)
- it('removes ""', function()
+ itp('removes ""', function()
eq('/Program Files/sh', vim_strnsave_unquoted('/""Program" "Files/sh'))
end)
- it('performs unescaping of "', function()
+ itp('performs unescaping of "', function()
eq('/"Program Files"/sh', vim_strnsave_unquoted('/"\\""Program Files"\\""/sh'))
end)
- it('performs unescaping of \\', function()
+ itp('performs unescaping of \\', function()
eq('/\\Program Files\\foo/sh', vim_strnsave_unquoted('/"\\\\"Program Files"\\\\foo"/sh'))
end)
- it('strips quote when there is no pair to it', function()
+ itp('strips quote when there is no pair to it', function()
eq('/Program Files/sh', vim_strnsave_unquoted('/Program" Files/sh'))
eq('', vim_strnsave_unquoted('"'))
end)
- it('allows string to end with one backslash unescaped', function()
+ itp('allows string to end with one backslash unescaped', function()
eq('/Program Files/sh\\', vim_strnsave_unquoted('/Program" Files/sh\\'))
end)
- it('does not perform unescaping out of quotes', function()
+ itp('does not perform unescaping out of quotes', function()
eq('/Program\\ Files/sh\\', vim_strnsave_unquoted('/Program\\ Files/sh\\'))
end)
- it('does not unescape \\n', function()
+ itp('does not unescape \\n', function()
eq('/Program\\nFiles/sh', vim_strnsave_unquoted('/Program"\\n"Files/sh'))
end)
end)
+
+describe('vim_strchr()', function()
+ local vim_strchr = function(s, c)
+ local str = to_cstr(s)
+ local res = strings.vim_strchr(str, c)
+ if res == nil then
+ return nil
+ else
+ return res - str
+ end
+ end
+ itp('handles NUL and <0 correctly', function()
+ eq(nil, vim_strchr('abc', 0))
+ eq(nil, vim_strchr('abc', -1))
+ end)
+ itp('works', function()
+ eq(0, vim_strchr('abc', ('a'):byte()))
+ eq(1, vim_strchr('abc', ('b'):byte()))
+ eq(2, vim_strchr('abc', ('c'):byte()))
+ eq(0, vim_strchr('aยซbยปc', ('a'):byte()))
+ eq(3, vim_strchr('aยซbยปc', ('b'):byte()))
+ eq(6, vim_strchr('aยซbยปc', ('c'):byte()))
+
+ eq(nil, vim_strchr('ยซยป', ('ยซ'):byte()))
+ -- 0xAB == 171 == 'ยซ'
+ eq(nil, vim_strchr('\171', 0xAB))
+ eq(0, vim_strchr('ยซยป', 0xAB))
+ eq(3, vim_strchr('โ€žยซยปโ€œ', 0xAB))
+
+ eq(7, vim_strchr('โ€žยซยปโ€œ', 0x201C))
+ eq(nil, vim_strchr('โ€žยซยปโ€œ', 0x201D))
+ eq(0, vim_strchr('โ€žยซยปโ€œ', 0x201E))
+
+ eq(0, vim_strchr('\244\143\188\128', 0x10FF00))
+ eq(2, vim_strchr('ยซ\244\143\188\128ยป', 0x10FF00))
+ -- |0xDBFF |0xDF00 - surrogate pair for 0x10FF00
+ eq(nil, vim_strchr('ยซ\237\175\191\237\188\128ยป', 0x10FF00))
+ end)
+end)
diff --git a/test/unit/tempfile_spec.lua b/test/unit/tempfile_spec.lua
index cf0d78b7a7..c05abfd640 100644
--- a/test/unit/tempfile_spec.lua
+++ b/test/unit/tempfile_spec.lua
@@ -1,61 +1,68 @@
-local lfs = require 'lfs'
-local helpers = require 'test.unit.helpers'
+local lfs = require('lfs')
+local helpers = require('test.unit.helpers')(after_each)
+local itp = helpers.gen_itp(it)
-local os = helpers.cimport './src/nvim/os/os.h'
-local tempfile = helpers.cimport './src/nvim/fileio.h'
+local eq = helpers.eq
+local neq = helpers.neq
+local cimport = helpers.cimport
+local child_call_once = helpers.child_call_once
+local child_cleanup_once = helpers.child_cleanup_once
+
+local lib = cimport('./src/nvim/os/os.h', './src/nvim/fileio.h')
describe('tempfile related functions', function()
before_each(function()
- tempfile.vim_deltempdir()
- end)
- after_each(function()
- tempfile.vim_deltempdir()
+ local function vim_deltempdir()
+ lib.vim_deltempdir()
+ end
+ child_call_once(vim_deltempdir)
+ child_cleanup_once(vim_deltempdir)
end)
local vim_gettempdir = function()
- return helpers.ffi.string(tempfile.vim_gettempdir())
+ return helpers.ffi.string(lib.vim_gettempdir())
end
describe('vim_gettempdir', function()
- it('returns path to Neovim own temp directory', function()
+ itp('returns path to Neovim own temp directory', function()
local dir = vim_gettempdir()
assert.True(dir ~= nil and dir:len() > 0)
-- os_file_is_writable returns 2 for a directory which we have rights
-- to write into.
- assert.equals(os.os_file_is_writable(helpers.to_cstr(dir)), 2)
+ eq(lib.os_file_is_writable(helpers.to_cstr(dir)), 2)
for entry in lfs.dir(dir) do
assert.True(entry == '.' or entry == '..')
end
end)
- it('returns the same directory on each call', function()
+ itp('returns the same directory on each call', function()
local dir1 = vim_gettempdir()
local dir2 = vim_gettempdir()
- assert.equals(dir1, dir2)
+ eq(dir1, dir2)
end)
end)
describe('vim_tempname', function()
local vim_tempname = function()
- return helpers.ffi.string(tempfile.vim_tempname())
+ return helpers.ffi.string(lib.vim_tempname())
end
- it('generate name of non-existing file', function()
+ itp('generate name of non-existing file', function()
local file = vim_tempname()
assert.truthy(file)
- assert.False(os.os_path_exists(file))
+ assert.False(lib.os_path_exists(file))
end)
- it('generate different names on each call', function()
+ itp('generate different names on each call', function()
local fst = vim_tempname()
local snd = vim_tempname()
- assert.not_equals(fst, snd)
+ neq(fst, snd)
end)
- it('generate file name in Neovim own temp directory', function()
+ itp('generate file name in Neovim own temp directory', function()
local dir = vim_gettempdir()
local file = vim_tempname()
- assert.truthy(file:find('^' .. dir .. '[^/]*$'))
+ eq(string.sub(file, 1, string.len(dir)), dir)
end)
end)
end)
diff --git a/test/unit/testtest_spec.lua b/test/unit/testtest_spec.lua
new file mode 100644
index 0000000000..d2f3632b6f
--- /dev/null
+++ b/test/unit/testtest_spec.lua
@@ -0,0 +1,19 @@
+local helpers = require('test.unit.helpers')(after_each)
+local assert = require('luassert')
+
+local itp = helpers.gen_itp(it)
+
+local sc = helpers.sc
+
+-- All of the below tests must fail. Check how exactly they fail.
+if os.getenv('NVIM_TEST_RUN_TESTTEST') ~= '1' then
+ return
+end
+describe('test code', function()
+ itp('does not hang when working with lengthy errors', function()
+ assert.just_fail(('x'):rep(65536))
+ end)
+ itp('shows trace after exiting abnormally', function()
+ sc.exit(0)
+ end)
+end)
diff --git a/test/unit/undo_spec.lua b/test/unit/undo_spec.lua
new file mode 100644
index 0000000000..f23110b329
--- /dev/null
+++ b/test/unit/undo_spec.lua
@@ -0,0 +1,215 @@
+local helpers = require('test.unit.helpers')(after_each)
+local itp = helpers.gen_itp(it)
+local lfs = require('lfs')
+local child_call_once = helpers.child_call_once
+
+local global_helpers = require('test.helpers')
+local sleep = global_helpers.sleep
+
+local ffi = helpers.ffi
+local cimport = helpers.cimport
+local to_cstr = helpers.to_cstr
+local neq = helpers.neq
+local eq = helpers.eq
+
+cimport('./src/nvim/ex_cmds_defs.h')
+cimport('./src/nvim/buffer_defs.h')
+local options = cimport('./src/nvim/option_defs.h')
+-- TODO: remove: local vim = cimport('./src/nvim/vim.h')
+local undo = cimport('./src/nvim/undo.h')
+local buffer = cimport('./src/nvim/buffer.h')
+
+local old_p_udir = nil
+
+-- Values expected by tests. Set in the setup function and destroyed in teardown
+local file_buffer = nil
+local buffer_hash = nil
+
+child_call_once(function()
+ if old_p_udir == nil then
+ old_p_udir = options.p_udir -- save the old value of p_udir (undodir)
+ end
+
+ -- create a new buffer
+ local c_file = to_cstr('Xtest-unit-undo')
+ file_buffer = buffer.buflist_new(c_file, c_file, 1, buffer.BLN_LISTED)
+ file_buffer.b_u_numhead = 1 -- Pretend that the buffer has been changed
+
+ -- TODO(christopher.waldon.dev@gmail.com): replace the 32 with UNDO_HASH_SIZE
+ -- requires refactor of UNDO_HASH_SIZE into constant/enum for ffi
+ --
+ -- compute a hash for this undofile
+ buffer_hash = ffi.new('char_u[32]')
+ undo.u_compute_hash(buffer_hash)
+end)
+
+
+describe('u_write_undo', function()
+ setup(function()
+ lfs.mkdir('unit-test-directory')
+ lfs.chdir('unit-test-directory')
+ options.p_udir = to_cstr(lfs.currentdir()) -- set p_udir to be the test dir
+ end)
+
+ teardown(function()
+ lfs.chdir('..')
+ local success, err = lfs.rmdir('unit-test-directory')
+ if not success then
+ print(err) -- inform tester if directory fails to delete
+ end
+ options.p_udir = old_p_udir --restore old p_udir
+ end)
+
+ -- Lua wrapper for u_write_undo
+ local function u_write_undo(name, forceit, buf, buf_hash)
+ if name ~= nil then
+ name = to_cstr(name)
+ end
+
+ return undo.u_write_undo(name, forceit, buf, buf_hash)
+ end
+
+ itp('writes an undo file to undodir given a buffer and hash', function()
+ u_write_undo(nil, false, file_buffer, buffer_hash)
+ local correct_name = ffi.string(undo.u_get_undo_file_name(file_buffer.b_ffname, false))
+ local undo_file = io.open(correct_name, "r")
+
+ neq(undo_file, nil)
+ local success, err = os.remove(correct_name) -- delete the file now that we're done with it.
+ if not success then
+ print(err) -- inform tester if undofile fails to delete
+ end
+ end)
+
+ itp('writes a correctly-named undo file to undodir given a name, buffer, and hash', function()
+ local correct_name = "undofile.test"
+ u_write_undo(correct_name, false, file_buffer, buffer_hash)
+ local undo_file = io.open(correct_name, "r")
+
+ neq(undo_file, nil)
+ local success, err = os.remove(correct_name) -- delete the file now that we're done with it.
+ if not success then
+ print(err) -- inform tester if undofile fails to delete
+ end
+ end)
+
+ itp('does not write an undofile when the buffer has no valid undofile name', function()
+ -- TODO(christopher.waldon.dev@gmail.com): Figure out how to test this.
+ -- it's hard because u_get_undo_file_name() would need to return null
+ end)
+
+ itp('writes the undofile with the same permissions as the original file', function()
+ -- Create Test file and set permissions
+ local test_file_name = "./test.file"
+ local test_permission_file = io.open(test_file_name, "w")
+ test_permission_file:write("testing permissions")
+ test_permission_file:close()
+ local test_permissions = lfs.attributes(test_file_name).permissions
+
+ -- Create vim buffer
+ local c_file = to_cstr(test_file_name)
+ file_buffer = buffer.buflist_new(c_file, c_file, 1, buffer.BLN_LISTED)
+ file_buffer.b_u_numhead = 1 -- Pretend that the buffer has been changed
+
+ u_write_undo(nil, false, file_buffer, buffer_hash)
+
+ -- Find out the correct name of the undofile
+ local undo_file_name = ffi.string(undo.u_get_undo_file_name(file_buffer.b_ffname, false))
+
+ -- Find out the permissions of the new file
+ local permissions = lfs.attributes(undo_file_name).permissions
+ eq(test_permissions, permissions)
+
+ -- delete the file now that we're done with it.
+ local success, err = os.remove(test_file_name)
+ if not success then
+ print(err) -- inform tester if undofile fails to delete
+ end
+ success, err = os.remove(undo_file_name)
+ if not success then
+ print(err) -- inform tester if undofile fails to delete
+ end
+ end)
+
+ itp('writes an undofile only readable by the user if the buffer is unnamed', function()
+ local correct_permissions = "rw-------"
+ local undo_file_name = "test.undo"
+
+ -- Create vim buffer
+ file_buffer = buffer.buflist_new(nil, nil, 1, buffer.BLN_LISTED)
+ file_buffer.b_u_numhead = 1 -- Pretend that the buffer has been changed
+
+ u_write_undo(undo_file_name, false, file_buffer, buffer_hash)
+
+ -- Find out the permissions of the new file
+ local permissions = lfs.attributes(undo_file_name).permissions
+ eq(correct_permissions, permissions)
+
+ -- delete the file now that we're done with it.
+ local success, err = os.remove(undo_file_name)
+ if not success then
+ print(err) -- inform tester if undofile fails to delete
+ end
+ end)
+
+ itp('forces writing undo file for :wundo! command', function()
+ local file_contents = "testing permissions"
+ -- Write a text file where the undofile should go
+ local correct_name = ffi.string(undo.u_get_undo_file_name(file_buffer.b_ffname, false))
+ global_helpers.write_file(correct_name, file_contents, true, false)
+
+ -- Call with `forceit`.
+ u_write_undo(correct_name, true, file_buffer, buffer_hash)
+
+ local undo_file_contents = global_helpers.read_file(correct_name)
+
+ neq(file_contents, undo_file_contents)
+ local success, deletion_err = os.remove(correct_name) -- delete the file now that we're done with it.
+ if not success then
+ print(deletion_err) -- inform tester if undofile fails to delete
+ end
+ end)
+
+ itp('overwrites an existing undo file', function()
+ u_write_undo(nil, false, file_buffer, buffer_hash)
+ local correct_name = ffi.string(undo.u_get_undo_file_name(file_buffer.b_ffname, false))
+
+ local file_last_modified = lfs.attributes(correct_name).modification
+
+ sleep(1000) -- Ensure difference in timestamps.
+ file_buffer.b_u_numhead = 1 -- Mark it as if there are changes
+ u_write_undo(nil, false, file_buffer, buffer_hash)
+
+ local file_last_modified_2 = lfs.attributes(correct_name).modification
+
+ -- print(file_last_modified, file_last_modified_2)
+ neq(file_last_modified, file_last_modified_2)
+ local success, err = os.remove(correct_name) -- delete the file now that we're done with it.
+ if not success then
+ print(err) -- inform tester if undofile fails to delete
+ end
+ end)
+
+ itp('does not overwrite an existing file that is not an undo file', function()
+ -- TODO: write test
+ end)
+
+ itp('does not overwrite an existing file that has the wrong permissions', function()
+ -- TODO: write test
+ end)
+
+ itp('does not write an undo file if there is no undo information for the buffer', function()
+ file_buffer.b_u_numhead = 0 -- Mark it as if there is no undo information
+ local correct_name = ffi.string(undo.u_get_undo_file_name(file_buffer.b_ffname, false))
+
+ local existing_file = io.open(correct_name,"r")
+ if existing_file then
+ existing_file:close()
+ os.remove(correct_name)
+ end
+ u_write_undo(nil, false, file_buffer, buffer_hash)
+ local undo_file = io.open(correct_name, "r")
+
+ eq(undo_file, nil)
+ end)
+end)
diff --git a/test/unit/viml/expressions/lexer_spec.lua b/test/unit/viml/expressions/lexer_spec.lua
new file mode 100644
index 0000000000..1b57a24ad5
--- /dev/null
+++ b/test/unit/viml/expressions/lexer_spec.lua
@@ -0,0 +1,428 @@
+local helpers = require('test.unit.helpers')(after_each)
+local global_helpers = require('test.helpers')
+local itp = helpers.gen_itp(it)
+local viml_helpers = require('test.unit.viml.helpers')
+
+local child_call_once = helpers.child_call_once
+local conv_enum = helpers.conv_enum
+local cimport = helpers.cimport
+local ffi = helpers.ffi
+local eq = helpers.eq
+
+local conv_ccs = viml_helpers.conv_ccs
+local new_pstate = viml_helpers.new_pstate
+local conv_cmp_type = viml_helpers.conv_cmp_type
+local pstate_set_str = viml_helpers.pstate_set_str
+local conv_expr_asgn_type = viml_helpers.conv_expr_asgn_type
+
+local shallowcopy = global_helpers.shallowcopy
+local intchar2lua = global_helpers.intchar2lua
+
+local lib = cimport('./src/nvim/viml/parser/expressions.h')
+
+local eltkn_type_tab, eltkn_mul_type_tab, eltkn_opt_scope_tab
+child_call_once(function()
+ eltkn_type_tab = {
+ [tonumber(lib.kExprLexInvalid)] = 'Invalid',
+ [tonumber(lib.kExprLexMissing)] = 'Missing',
+ [tonumber(lib.kExprLexSpacing)] = 'Spacing',
+ [tonumber(lib.kExprLexEOC)] = 'EOC',
+
+ [tonumber(lib.kExprLexQuestion)] = 'Question',
+ [tonumber(lib.kExprLexColon)] = 'Colon',
+ [tonumber(lib.kExprLexOr)] = 'Or',
+ [tonumber(lib.kExprLexAnd)] = 'And',
+ [tonumber(lib.kExprLexComparison)] = 'Comparison',
+ [tonumber(lib.kExprLexPlus)] = 'Plus',
+ [tonumber(lib.kExprLexMinus)] = 'Minus',
+ [tonumber(lib.kExprLexDot)] = 'Dot',
+ [tonumber(lib.kExprLexMultiplication)] = 'Multiplication',
+
+ [tonumber(lib.kExprLexNot)] = 'Not',
+
+ [tonumber(lib.kExprLexNumber)] = 'Number',
+ [tonumber(lib.kExprLexSingleQuotedString)] = 'SingleQuotedString',
+ [tonumber(lib.kExprLexDoubleQuotedString)] = 'DoubleQuotedString',
+ [tonumber(lib.kExprLexOption)] = 'Option',
+ [tonumber(lib.kExprLexRegister)] = 'Register',
+ [tonumber(lib.kExprLexEnv)] = 'Env',
+ [tonumber(lib.kExprLexPlainIdentifier)] = 'PlainIdentifier',
+
+ [tonumber(lib.kExprLexBracket)] = 'Bracket',
+ [tonumber(lib.kExprLexFigureBrace)] = 'FigureBrace',
+ [tonumber(lib.kExprLexParenthesis)] = 'Parenthesis',
+ [tonumber(lib.kExprLexComma)] = 'Comma',
+ [tonumber(lib.kExprLexArrow)] = 'Arrow',
+
+ [tonumber(lib.kExprLexAssignment)] = 'Assignment',
+ }
+
+ eltkn_mul_type_tab = {
+ [tonumber(lib.kExprLexMulMul)] = 'Mul',
+ [tonumber(lib.kExprLexMulDiv)] = 'Div',
+ [tonumber(lib.kExprLexMulMod)] = 'Mod',
+ }
+
+ eltkn_opt_scope_tab = {
+ [tonumber(lib.kExprOptScopeUnspecified)] = 'Unspecified',
+ [tonumber(lib.kExprOptScopeGlobal)] = 'Global',
+ [tonumber(lib.kExprOptScopeLocal)] = 'Local',
+ }
+end)
+
+local function conv_eltkn_type(typ)
+ return conv_enum(eltkn_type_tab, typ)
+end
+
+local bracket_types = {
+ Bracket = true,
+ FigureBrace = true,
+ Parenthesis = true,
+}
+
+local function eltkn2lua(pstate, tkn)
+ local ret = {
+ type = conv_eltkn_type(tkn.type),
+ }
+ pstate_set_str(pstate, tkn.start, tkn.len, ret)
+ if not ret.error and (#(ret.str) ~= ret.len) then
+ ret.error = '#str /= len'
+ end
+ if ret.type == 'Comparison' then
+ ret.data = {
+ type = conv_cmp_type(tkn.data.cmp.type),
+ ccs = conv_ccs(tkn.data.cmp.ccs),
+ inv = (not not tkn.data.cmp.inv),
+ }
+ elseif ret.type == 'Multiplication' then
+ ret.data = { type = conv_enum(eltkn_mul_type_tab, tkn.data.mul.type) }
+ elseif bracket_types[ret.type] then
+ ret.data = { closing = (not not tkn.data.brc.closing) }
+ elseif ret.type == 'Register' then
+ ret.data = { name = intchar2lua(tkn.data.reg.name) }
+ elseif (ret.type == 'SingleQuotedString'
+ or ret.type == 'DoubleQuotedString') then
+ ret.data = { closed = (not not tkn.data.str.closed) }
+ elseif ret.type == 'Option' then
+ ret.data = {
+ scope = conv_enum(eltkn_opt_scope_tab, tkn.data.opt.scope),
+ name = ffi.string(tkn.data.opt.name, tkn.data.opt.len),
+ }
+ elseif ret.type == 'PlainIdentifier' then
+ ret.data = {
+ scope = intchar2lua(tkn.data.var.scope),
+ autoload = (not not tkn.data.var.autoload),
+ }
+ elseif ret.type == 'Number' then
+ ret.data = {
+ is_float = (not not tkn.data.num.is_float),
+ base = tonumber(tkn.data.num.base),
+ }
+ ret.data.val = tonumber(tkn.data.num.is_float
+ and tkn.data.num.val.floating
+ or tkn.data.num.val.integer)
+ elseif ret.type == 'Assignment' then
+ ret.data = { type = conv_expr_asgn_type(tkn.data.ass.type) }
+ elseif ret.type == 'Invalid' then
+ ret.data = { error = ffi.string(tkn.data.err.msg) }
+ end
+ return ret, tkn
+end
+
+local function next_eltkn(pstate, flags)
+ return eltkn2lua(pstate, lib.viml_pexpr_next_token(pstate, flags))
+end
+
+describe('Expressions lexer', function()
+ local flags = 0
+ local should_advance = true
+ local function check_advance(pstate, bytes_to_advance, initial_col)
+ local tgt = initial_col + bytes_to_advance
+ if should_advance then
+ if pstate.reader.lines.items[0].size == tgt then
+ eq(1, pstate.pos.line)
+ eq(0, pstate.pos.col)
+ else
+ eq(0, pstate.pos.line)
+ eq(tgt, pstate.pos.col)
+ end
+ else
+ eq(0, pstate.pos.line)
+ eq(initial_col, pstate.pos.col)
+ end
+ end
+ local function singl_eltkn_test(typ, str, data)
+ local pstate = new_pstate({str})
+ eq({data=data, len=#str, start={col=0, line=0}, str=str, type=typ},
+ next_eltkn(pstate, flags))
+ check_advance(pstate, #str, 0)
+ if not (
+ typ == 'Spacing'
+ or (typ == 'Register' and str == '@')
+ or ((typ == 'SingleQuotedString' or typ == 'DoubleQuotedString')
+ and not data.closed)
+ ) then
+ pstate = new_pstate({str .. ' '})
+ eq({data=data, len=#str, start={col=0, line=0}, str=str, type=typ},
+ next_eltkn(pstate, flags))
+ check_advance(pstate, #str, 0)
+ end
+ pstate = new_pstate({'x' .. str})
+ pstate.pos.col = 1
+ eq({data=data, len=#str, start={col=1, line=0}, str=str, type=typ},
+ next_eltkn(pstate, flags))
+ check_advance(pstate, #str, 1)
+ end
+ local function scope_test(scope)
+ singl_eltkn_test('PlainIdentifier', scope .. ':test#var', {autoload=true, scope=scope})
+ singl_eltkn_test('PlainIdentifier', scope .. ':', {autoload=false, scope=scope})
+ end
+ local function comparison_test(op, inv_op, cmp_type)
+ singl_eltkn_test('Comparison', op, {type=cmp_type, inv=false, ccs='UseOption'})
+ singl_eltkn_test('Comparison', inv_op, {type=cmp_type, inv=true, ccs='UseOption'})
+ singl_eltkn_test('Comparison', op .. '#', {type=cmp_type, inv=false, ccs='MatchCase'})
+ singl_eltkn_test('Comparison', inv_op .. '#', {type=cmp_type, inv=true, ccs='MatchCase'})
+ singl_eltkn_test('Comparison', op .. '?', {type=cmp_type, inv=false, ccs='IgnoreCase'})
+ singl_eltkn_test('Comparison', inv_op .. '?', {type=cmp_type, inv=true, ccs='IgnoreCase'})
+ end
+ local function simple_test(pstate_arg, exp_type, exp_len, exp)
+ local pstate = new_pstate(pstate_arg)
+ exp = shallowcopy(exp)
+ exp.type = exp_type
+ exp.len = exp_len or #(pstate_arg[0])
+ exp.start = { col = 0, line = 0 }
+ eq(exp, next_eltkn(pstate, flags))
+ end
+ local function stable_tests()
+ singl_eltkn_test('Parenthesis', '(', {closing=false})
+ singl_eltkn_test('Parenthesis', ')', {closing=true})
+ singl_eltkn_test('Bracket', '[', {closing=false})
+ singl_eltkn_test('Bracket', ']', {closing=true})
+ singl_eltkn_test('FigureBrace', '{', {closing=false})
+ singl_eltkn_test('FigureBrace', '}', {closing=true})
+ singl_eltkn_test('Question', '?')
+ singl_eltkn_test('Colon', ':')
+ singl_eltkn_test('Dot', '.')
+ singl_eltkn_test('Assignment', '.=', {type='Concat'})
+ singl_eltkn_test('Plus', '+')
+ singl_eltkn_test('Assignment', '+=', {type='Add'})
+ singl_eltkn_test('Comma', ',')
+ singl_eltkn_test('Multiplication', '*', {type='Mul'})
+ singl_eltkn_test('Multiplication', '/', {type='Div'})
+ singl_eltkn_test('Multiplication', '%', {type='Mod'})
+ singl_eltkn_test('Spacing', ' \t\t \t\t')
+ singl_eltkn_test('Spacing', ' ')
+ singl_eltkn_test('Spacing', '\t')
+ singl_eltkn_test('Invalid', '\x01\x02\x03', {error='E15: Invalid control character present in input: %.*s'})
+ singl_eltkn_test('Number', '0123', {is_float=false, base=8, val=83})
+ singl_eltkn_test('Number', '01234567', {is_float=false, base=8, val=342391})
+ singl_eltkn_test('Number', '012345678', {is_float=false, base=10, val=12345678})
+ singl_eltkn_test('Number', '0x123', {is_float=false, base=16, val=291})
+ singl_eltkn_test('Number', '0x56FF', {is_float=false, base=16, val=22271})
+ singl_eltkn_test('Number', '0xabcdef', {is_float=false, base=16, val=11259375})
+ singl_eltkn_test('Number', '0xABCDEF', {is_float=false, base=16, val=11259375})
+ singl_eltkn_test('Number', '0x0', {is_float=false, base=16, val=0})
+ singl_eltkn_test('Number', '00', {is_float=false, base=8, val=0})
+ singl_eltkn_test('Number', '0b0', {is_float=false, base=2, val=0})
+ singl_eltkn_test('Number', '0b010111', {is_float=false, base=2, val=23})
+ singl_eltkn_test('Number', '0b100111', {is_float=false, base=2, val=39})
+ singl_eltkn_test('Number', '0', {is_float=false, base=10, val=0})
+ singl_eltkn_test('Number', '9', {is_float=false, base=10, val=9})
+ singl_eltkn_test('Env', '$abc')
+ singl_eltkn_test('Env', '$')
+ singl_eltkn_test('PlainIdentifier', 'test', {autoload=false, scope=0})
+ singl_eltkn_test('PlainIdentifier', '_test', {autoload=false, scope=0})
+ singl_eltkn_test('PlainIdentifier', '_test_foo', {autoload=false, scope=0})
+ singl_eltkn_test('PlainIdentifier', 't', {autoload=false, scope=0})
+ singl_eltkn_test('PlainIdentifier', 'test5', {autoload=false, scope=0})
+ singl_eltkn_test('PlainIdentifier', 't0', {autoload=false, scope=0})
+ singl_eltkn_test('PlainIdentifier', 'test#var', {autoload=true, scope=0})
+ singl_eltkn_test('PlainIdentifier', 'test#var#val###', {autoload=true, scope=0})
+ singl_eltkn_test('PlainIdentifier', 't#####', {autoload=true, scope=0})
+ singl_eltkn_test('And', '&&')
+ singl_eltkn_test('Or', '||')
+ singl_eltkn_test('Invalid', '&', {error='E112: Option name missing: %.*s'})
+ singl_eltkn_test('Option', '&opt', {scope='Unspecified', name='opt'})
+ singl_eltkn_test('Option', '&t_xx', {scope='Unspecified', name='t_xx'})
+ singl_eltkn_test('Option', '&t_\r\r', {scope='Unspecified', name='t_\r\r'})
+ singl_eltkn_test('Option', '&t_\t\t', {scope='Unspecified', name='t_\t\t'})
+ singl_eltkn_test('Option', '&t_ ', {scope='Unspecified', name='t_ '})
+ singl_eltkn_test('Option', '&g:opt', {scope='Global', name='opt'})
+ singl_eltkn_test('Option', '&l:opt', {scope='Local', name='opt'})
+ singl_eltkn_test('Invalid', '&l:', {error='E112: Option name missing: %.*s'})
+ singl_eltkn_test('Invalid', '&g:', {error='E112: Option name missing: %.*s'})
+ singl_eltkn_test('Register', '@', {name=-1})
+ singl_eltkn_test('Register', '@a', {name='a'})
+ singl_eltkn_test('Register', '@\r', {name=13})
+ singl_eltkn_test('Register', '@ ', {name=' '})
+ singl_eltkn_test('Register', '@\t', {name=9})
+ singl_eltkn_test('SingleQuotedString', '\'test', {closed=false})
+ singl_eltkn_test('SingleQuotedString', '\'test\'', {closed=true})
+ singl_eltkn_test('SingleQuotedString', '\'\'\'\'', {closed=true})
+ singl_eltkn_test('SingleQuotedString', '\'x\'\'\'', {closed=true})
+ singl_eltkn_test('SingleQuotedString', '\'\'\'x\'', {closed=true})
+ singl_eltkn_test('SingleQuotedString', '\'\'\'', {closed=false})
+ singl_eltkn_test('SingleQuotedString', '\'x\'\'', {closed=false})
+ singl_eltkn_test('SingleQuotedString', '\'\'\'x', {closed=false})
+ singl_eltkn_test('DoubleQuotedString', '"test', {closed=false})
+ singl_eltkn_test('DoubleQuotedString', '"test"', {closed=true})
+ singl_eltkn_test('DoubleQuotedString', '"\\""', {closed=true})
+ singl_eltkn_test('DoubleQuotedString', '"x\\""', {closed=true})
+ singl_eltkn_test('DoubleQuotedString', '"\\"x"', {closed=true})
+ singl_eltkn_test('DoubleQuotedString', '"\\"', {closed=false})
+ singl_eltkn_test('DoubleQuotedString', '"x\\"', {closed=false})
+ singl_eltkn_test('DoubleQuotedString', '"\\"x', {closed=false})
+ singl_eltkn_test('Not', '!')
+ singl_eltkn_test('Assignment', '=', {type='Plain'})
+ comparison_test('==', '!=', 'Equal')
+ comparison_test('=~', '!~', 'Matches')
+ comparison_test('>', '<=', 'Greater')
+ comparison_test('>=', '<', 'GreaterOrEqual')
+ singl_eltkn_test('Minus', '-')
+ singl_eltkn_test('Assignment', '-=', {type='Subtract'})
+ singl_eltkn_test('Arrow', '->')
+ singl_eltkn_test('Invalid', '~', {error='E15: Unidentified character: %.*s'})
+ simple_test({{data=nil, size=0}}, 'EOC', 0, {error='start.col >= #pstr'})
+ simple_test({''}, 'EOC', 0, {error='start.col >= #pstr'})
+ simple_test({'2.'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2e5'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.x'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.2.'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.0x'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.0e'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.0e+'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.0e-'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.0e+x'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.0e-x'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.0e+1a'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.0e-1a'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'0b102'}, 'Number', 4, {data={is_float=false, base=2, val=2}, str='0b10'})
+ simple_test({'10F'}, 'Number', 2, {data={is_float=false, base=10, val=10}, str='10'})
+ simple_test({'0x0123456789ABCDEFG'}, 'Number', 18, {data={is_float=false, base=16, val=81985529216486895}, str='0x0123456789ABCDEF'})
+ simple_test({{data='00', size=2}}, 'Number', 2, {data={is_float=false, base=8, val=0}, str='00'})
+ simple_test({{data='009', size=2}}, 'Number', 2, {data={is_float=false, base=8, val=0}, str='00'})
+ simple_test({{data='01', size=1}}, 'Number', 1, {data={is_float=false, base=10, val=0}, str='0'})
+ end
+
+ local function regular_scope_tests()
+ scope_test('s')
+ scope_test('g')
+ scope_test('v')
+ scope_test('b')
+ scope_test('w')
+ scope_test('t')
+ scope_test('l')
+ scope_test('a')
+
+ simple_test({'g:'}, 'PlainIdentifier', 2, {data={scope='g', autoload=false}, str='g:'})
+ simple_test({'g:is#foo'}, 'PlainIdentifier', 8, {data={scope='g', autoload=true}, str='g:is#foo'})
+ simple_test({'g:isnot#foo'}, 'PlainIdentifier', 11, {data={scope='g', autoload=true}, str='g:isnot#foo'})
+ end
+
+ local function regular_is_tests()
+ comparison_test('is', 'isnot', 'Identical')
+
+ simple_test({'is'}, 'Comparison', 2, {data={type='Identical', inv=false, ccs='UseOption'}, str='is'})
+ simple_test({'isnot'}, 'Comparison', 5, {data={type='Identical', inv=true, ccs='UseOption'}, str='isnot'})
+ simple_test({'is?'}, 'Comparison', 3, {data={type='Identical', inv=false, ccs='IgnoreCase'}, str='is?'})
+ simple_test({'isnot?'}, 'Comparison', 6, {data={type='Identical', inv=true, ccs='IgnoreCase'}, str='isnot?'})
+ simple_test({'is#'}, 'Comparison', 3, {data={type='Identical', inv=false, ccs='MatchCase'}, str='is#'})
+ simple_test({'isnot#'}, 'Comparison', 6, {data={type='Identical', inv=true, ccs='MatchCase'}, str='isnot#'})
+ simple_test({'is#foo'}, 'Comparison', 3, {data={type='Identical', inv=false, ccs='MatchCase'}, str='is#'})
+ simple_test({'isnot#foo'}, 'Comparison', 6, {data={type='Identical', inv=true, ccs='MatchCase'}, str='isnot#'})
+ end
+
+ local function regular_number_tests()
+ simple_test({'2.0'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.0e5'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.0e+5'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.0e-5'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ end
+
+ local function regular_eoc_tests()
+ singl_eltkn_test('EOC', '|')
+ singl_eltkn_test('EOC', '\0')
+ singl_eltkn_test('EOC', '\n')
+ end
+
+ itp('works (single tokens, zero flags)', function()
+ stable_tests()
+
+ regular_eoc_tests()
+ regular_scope_tests()
+ regular_is_tests()
+ regular_number_tests()
+ end)
+ itp('peeks', function()
+ flags = tonumber(lib.kELFlagPeek)
+ should_advance = false
+ stable_tests()
+
+ regular_eoc_tests()
+ regular_scope_tests()
+ regular_is_tests()
+ regular_number_tests()
+ end)
+ itp('forbids scope', function()
+ flags = tonumber(lib.kELFlagForbidScope)
+ stable_tests()
+
+ regular_eoc_tests()
+ regular_is_tests()
+ regular_number_tests()
+
+ simple_test({'g:'}, 'PlainIdentifier', 1, {data={scope=0, autoload=false}, str='g'})
+ end)
+ itp('allows floats', function()
+ flags = tonumber(lib.kELFlagAllowFloat)
+ stable_tests()
+
+ regular_eoc_tests()
+ regular_scope_tests()
+ regular_is_tests()
+
+ simple_test({'2.2'}, 'Number', 3, {data={is_float=true, base=10, val=2.2}, str='2.2'})
+ simple_test({'2.0e5'}, 'Number', 5, {data={is_float=true, base=10, val=2e5}, str='2.0e5'})
+ simple_test({'2.0e+5'}, 'Number', 6, {data={is_float=true, base=10, val=2e5}, str='2.0e+5'})
+ simple_test({'2.0e-5'}, 'Number', 6, {data={is_float=true, base=10, val=2e-5}, str='2.0e-5'})
+ simple_test({'2.500000e-5'}, 'Number', 11, {data={is_float=true, base=10, val=2.5e-5}, str='2.500000e-5'})
+ simple_test({'2.5555e2'}, 'Number', 8, {data={is_float=true, base=10, val=2.5555e2}, str='2.5555e2'})
+ simple_test({'2.5555e+2'}, 'Number', 9, {data={is_float=true, base=10, val=2.5555e2}, str='2.5555e+2'})
+ simple_test({'2.5555e-2'}, 'Number', 9, {data={is_float=true, base=10, val=2.5555e-2}, str='2.5555e-2'})
+ simple_test({{data='2.5e-5', size=3}},
+ 'Number', 3, {data={is_float=true, base=10, val=2.5}, str='2.5'})
+ simple_test({{data='2.5e5', size=4}},
+ 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({{data='2.5e-50', size=6}},
+ 'Number', 6, {data={is_float=true, base=10, val=2.5e-5}, str='2.5e-5'})
+ end)
+ itp('treats `is` as an identifier', function()
+ flags = tonumber(lib.kELFlagIsNotCmp)
+ stable_tests()
+
+ regular_eoc_tests()
+ regular_scope_tests()
+ regular_number_tests()
+
+ simple_test({'is'}, 'PlainIdentifier', 2, {data={scope=0, autoload=false}, str='is'})
+ simple_test({'isnot'}, 'PlainIdentifier', 5, {data={scope=0, autoload=false}, str='isnot'})
+ simple_test({'is?'}, 'PlainIdentifier', 2, {data={scope=0, autoload=false}, str='is'})
+ simple_test({'isnot?'}, 'PlainIdentifier', 5, {data={scope=0, autoload=false}, str='isnot'})
+ simple_test({'is#'}, 'PlainIdentifier', 3, {data={scope=0, autoload=true}, str='is#'})
+ simple_test({'isnot#'}, 'PlainIdentifier', 6, {data={scope=0, autoload=true}, str='isnot#'})
+ simple_test({'is#foo'}, 'PlainIdentifier', 6, {data={scope=0, autoload=true}, str='is#foo'})
+ simple_test({'isnot#foo'}, 'PlainIdentifier', 9, {data={scope=0, autoload=true}, str='isnot#foo'})
+ end)
+ itp('forbids EOC', function()
+ flags = tonumber(lib.kELFlagForbidEOC)
+ stable_tests()
+
+ regular_scope_tests()
+ regular_is_tests()
+ regular_number_tests()
+
+ singl_eltkn_test('Invalid', '|', {error='E15: Unexpected EOC character: %.*s'})
+ singl_eltkn_test('Invalid', '\0', {error='E15: Unexpected EOC character: %.*s'})
+ singl_eltkn_test('Invalid', '\n', {error='E15: Unexpected EOC character: %.*s'})
+ end)
+end)
diff --git a/test/unit/viml/expressions/parser_spec.lua b/test/unit/viml/expressions/parser_spec.lua
new file mode 100644
index 0000000000..73388e5dd2
--- /dev/null
+++ b/test/unit/viml/expressions/parser_spec.lua
@@ -0,0 +1,540 @@
+local helpers = require('test.unit.helpers')(after_each)
+local global_helpers = require('test.helpers')
+local itp = helpers.gen_itp(it)
+local viml_helpers = require('test.unit.viml.helpers')
+
+local make_enum_conv_tab = helpers.make_enum_conv_tab
+local child_call_once = helpers.child_call_once
+local alloc_log_new = helpers.alloc_log_new
+local kvi_destroy = helpers.kvi_destroy
+local conv_enum = helpers.conv_enum
+local debug_log = helpers.debug_log
+local ptr2key = helpers.ptr2key
+local cimport = helpers.cimport
+local ffi = helpers.ffi
+local neq = helpers.neq
+local eq = helpers.eq
+
+local conv_ccs = viml_helpers.conv_ccs
+local new_pstate = viml_helpers.new_pstate
+local conv_cmp_type = viml_helpers.conv_cmp_type
+local pstate_set_str = viml_helpers.pstate_set_str
+local conv_expr_asgn_type = viml_helpers.conv_expr_asgn_type
+
+local mergedicts_copy = global_helpers.mergedicts_copy
+local format_string = global_helpers.format_string
+local format_luav = global_helpers.format_luav
+local intchar2lua = global_helpers.intchar2lua
+local dictdiff = global_helpers.dictdiff
+
+local lib = cimport('./src/nvim/viml/parser/expressions.h',
+ './src/nvim/syntax.h')
+
+local alloc_log = alloc_log_new()
+
+local predefined_hl_defs = {
+ -- From highlight_init_both
+ Conceal=true,
+ Cursor=true,
+ lCursor=true,
+ DiffText=true,
+ ErrorMsg=true,
+ IncSearch=true,
+ ModeMsg=true,
+ NonText=true,
+ PmenuSbar=true,
+ StatusLine=true,
+ StatusLineNC=true,
+ TabLineFill=true,
+ TabLineSel=true,
+ TermCursor=true,
+ VertSplit=true,
+ WildMenu=true,
+ EndOfBuffer=true,
+ QuickFixLine=true,
+ Substitute=true,
+ Whitespace=true,
+
+ -- From highlight_init_(dark|light)
+ ColorColumn=true,
+ CursorColumn=true,
+ CursorLine=true,
+ CursorLineNr=true,
+ DiffAdd=true,
+ DiffChange=true,
+ DiffDelete=true,
+ Directory=true,
+ FoldColumn=true,
+ Folded=true,
+ LineNr=true,
+ MatchParen=true,
+ MoreMsg=true,
+ Pmenu=true,
+ PmenuSel=true,
+ PmenuThumb=true,
+ Question=true,
+ Search=true,
+ SignColumn=true,
+ SpecialKey=true,
+ SpellBad=true,
+ SpellCap=true,
+ SpellLocal=true,
+ SpellRare=true,
+ TabLine=true,
+ Title=true,
+ Visual=true,
+ WarningMsg=true,
+ Normal=true,
+
+ -- From syncolor.vim, if &background
+ Comment=true,
+ Constant=true,
+ Special=true,
+ Identifier=true,
+ Statement=true,
+ PreProc=true,
+ Type=true,
+ Underlined=true,
+ Ignore=true,
+
+ -- From syncolor.vim, below if &background
+ Error=true,
+ Todo=true,
+
+ -- From syncolor.vim, links at the bottom
+ String=true,
+ Character=true,
+ Number=true,
+ Boolean=true,
+ Float=true,
+ Function=true,
+ Conditional=true,
+ Repeat=true,
+ Label=true,
+ Operator=true,
+ Keyword=true,
+ Exception=true,
+ Include=true,
+ Define=true,
+ Macro=true,
+ PreCondit=true,
+ StorageClass=true,
+ Structure=true,
+ Typedef=true,
+ Tag=true,
+ SpecialChar=true,
+ Delimiter=true,
+ SpecialComment=true,
+ Debug=true,
+}
+
+local nvim_hl_defs = {}
+
+child_call_once(function()
+ local i = 0
+ while lib.highlight_init_cmdline[i] ~= nil do
+ local hl_args = lib.highlight_init_cmdline[i]
+ local s = ffi.string(hl_args)
+ local err, msg = pcall(function()
+ if s:sub(1, 13) == 'default link ' then
+ local new_grp, grp_link = s:match('^default link (%w+) (%w+)$')
+ neq(nil, new_grp)
+ -- Note: group to link to must be already defined at the time of
+ -- linking, otherwise it will be created as cleared. So existence
+ -- of the group is checked here and not in the next pass over
+ -- nvim_hl_defs.
+ eq(true, not not (nvim_hl_defs[grp_link]
+ or predefined_hl_defs[grp_link]))
+ eq(false, not not (nvim_hl_defs[new_grp]
+ or predefined_hl_defs[new_grp]))
+ nvim_hl_defs[new_grp] = {'link', grp_link}
+ else
+ local new_grp, grp_args = s:match('^(%w+) (.*)')
+ neq(nil, new_grp)
+ eq(false, not not (nvim_hl_defs[new_grp]
+ or predefined_hl_defs[new_grp]))
+ nvim_hl_defs[new_grp] = {'definition', grp_args}
+ end
+ end)
+ if not err then
+ msg = format_string(
+ 'Error while processing string %s at position %u:\n%s', s, i, msg)
+ error(msg)
+ end
+ i = i + 1
+ end
+ for k, _ in ipairs(nvim_hl_defs) do
+ eq('Nvim', k:sub(1, 4))
+ -- NvimInvalid
+ -- 12345678901
+ local err, msg = pcall(function()
+ if k:sub(5, 11) == 'Invalid' then
+ neq(nil, nvim_hl_defs['Nvim' .. k:sub(12)])
+ else
+ neq(nil, nvim_hl_defs['NvimInvalid' .. k:sub(5)])
+ end
+ end)
+ if not err then
+ msg = format_string('Error while processing group %s:\n%s', k, msg)
+ error(msg)
+ end
+ end
+end)
+
+local function hls_to_hl_fs(hls)
+ local ret = {}
+ local next_col = 0
+ for i, v in ipairs(hls) do
+ local group, line, col, str = v:match('^Nvim([a-zA-Z]+):(%d+):(%d+):(.*)$')
+ col = tonumber(col)
+ line = tonumber(line)
+ assert(line == 0)
+ local col_shift = col - next_col
+ assert(col_shift >= 0)
+ next_col = col + #str
+ ret[i] = format_string('hl(%r, %r%s)',
+ group,
+ str,
+ (col_shift == 0
+ and ''
+ or (', %u'):format(col_shift)))
+ end
+ return ret
+end
+
+local function format_check(expr, format_check_data, opts)
+ -- That forces specific order.
+ local zflags = opts.flags[1]
+ local zdata = format_check_data[zflags]
+ local dig_len
+ if opts.funcname then
+ print(format_string('\n%s(%r, {', opts.funcname, expr))
+ dig_len = #opts.funcname + 2
+ else
+ print(format_string('\n_check_parsing(%r, %r, {', opts, expr))
+ dig_len = #('_check_parsing(, \'') + #(format_string('%r', opts))
+ end
+ local digits = ' --' .. (' '):rep(dig_len - #(' --'))
+ local digits2 = digits:sub(1, -10)
+ for i = 0, #expr - 1 do
+ if i % 10 == 0 then
+ digits2 = ('%s%10u'):format(digits2, i / 10)
+ end
+ digits = ('%s%u'):format(digits, i % 10)
+ end
+ print(digits)
+ if #expr > 10 then
+ print(digits2)
+ end
+ if zdata.ast.len then
+ print((' len = %u,'):format(zdata.ast.len))
+ end
+ print(' ast = ' .. format_luav(zdata.ast.ast, ' ') .. ',')
+ if zdata.ast.err then
+ print(' err = {')
+ print(' arg = ' .. format_luav(zdata.ast.err.arg) .. ',')
+ print(' msg = ' .. format_luav(zdata.ast.err.msg) .. ',')
+ print(' },')
+ end
+ print('}, {')
+ for _, v in ipairs(zdata.hl_fs) do
+ print(' ' .. v .. ',')
+ end
+ local diffs = {}
+ local diffs_num = 0
+ for flags, v in pairs(format_check_data) do
+ if flags ~= zflags then
+ diffs[flags] = dictdiff(zdata, v)
+ if diffs[flags] then
+ if flags == 3 + zflags then
+ if (dictdiff(format_check_data[1 + zflags],
+ format_check_data[3 + zflags]) == nil
+ or dictdiff(format_check_data[2 + zflags],
+ format_check_data[3 + zflags]) == nil)
+ then
+ diffs[flags] = nil
+ else
+ diffs_num = diffs_num + 1
+ end
+ else
+ diffs_num = diffs_num + 1
+ end
+ end
+ end
+ end
+ if diffs_num ~= 0 then
+ print('}, {')
+ local flags = 1
+ while diffs_num ~= 0 do
+ if diffs[flags] then
+ diffs_num = diffs_num - 1
+ local diff = diffs[flags]
+ print((' [%u] = {'):format(flags))
+ if diff.ast then
+ print(' ast = ' .. format_luav(diff.ast, ' ') .. ',')
+ end
+ if diff.hl_fs then
+ print(' hl_fs = ' .. format_luav(diff.hl_fs, ' ', {
+ literal_strings=true
+ }) .. ',')
+ end
+ print(' },')
+ end
+ flags = flags + 1
+ end
+ end
+ print('})')
+end
+
+local east_node_type_tab
+make_enum_conv_tab(lib, {
+ 'kExprNodeMissing',
+ 'kExprNodeOpMissing',
+ 'kExprNodeTernary',
+ 'kExprNodeTernaryValue',
+ 'kExprNodeRegister',
+ 'kExprNodeSubscript',
+ 'kExprNodeListLiteral',
+ 'kExprNodeUnaryPlus',
+ 'kExprNodeBinaryPlus',
+ 'kExprNodeNested',
+ 'kExprNodeCall',
+ 'kExprNodePlainIdentifier',
+ 'kExprNodePlainKey',
+ 'kExprNodeComplexIdentifier',
+ 'kExprNodeUnknownFigure',
+ 'kExprNodeLambda',
+ 'kExprNodeDictLiteral',
+ 'kExprNodeCurlyBracesIdentifier',
+ 'kExprNodeComma',
+ 'kExprNodeColon',
+ 'kExprNodeArrow',
+ 'kExprNodeComparison',
+ 'kExprNodeConcat',
+ 'kExprNodeConcatOrSubscript',
+ 'kExprNodeInteger',
+ 'kExprNodeFloat',
+ 'kExprNodeSingleQuotedString',
+ 'kExprNodeDoubleQuotedString',
+ 'kExprNodeOr',
+ 'kExprNodeAnd',
+ 'kExprNodeUnaryMinus',
+ 'kExprNodeBinaryMinus',
+ 'kExprNodeNot',
+ 'kExprNodeMultiplication',
+ 'kExprNodeDivision',
+ 'kExprNodeMod',
+ 'kExprNodeOption',
+ 'kExprNodeEnvironment',
+ 'kExprNodeAssignment',
+}, 'kExprNode', function(ret) east_node_type_tab = ret end)
+
+local function conv_east_node_type(typ)
+ return conv_enum(east_node_type_tab, typ)
+end
+
+local eastnodelist2lua
+
+local function eastnode2lua(pstate, eastnode, checked_nodes)
+ local key = ptr2key(eastnode)
+ if checked_nodes[key] then
+ checked_nodes[key].duplicate_key = key
+ return { duplicate = key }
+ end
+ local typ = conv_east_node_type(eastnode.type)
+ local ret = {}
+ checked_nodes[key] = ret
+ ret.children = eastnodelist2lua(pstate, eastnode.children, checked_nodes)
+ local str = pstate_set_str(pstate, eastnode.start, eastnode.len)
+ local ret_str
+ if str.error then
+ ret_str = 'error:' .. str.error
+ else
+ ret_str = ('%u:%u:%s'):format(str.start.line, str.start.col, str.str)
+ end
+ if typ == 'Register' then
+ typ = typ .. ('(name=%s)'):format(
+ tostring(intchar2lua(eastnode.data.reg.name)))
+ elseif typ == 'PlainIdentifier' then
+ typ = typ .. ('(scope=%s,ident=%s)'):format(
+ tostring(intchar2lua(eastnode.data.var.scope)),
+ ffi.string(eastnode.data.var.ident, eastnode.data.var.ident_len))
+ elseif typ == 'PlainKey' then
+ typ = typ .. ('(key=%s)'):format(
+ ffi.string(eastnode.data.var.ident, eastnode.data.var.ident_len))
+ elseif (typ == 'UnknownFigure' or typ == 'DictLiteral'
+ or typ == 'CurlyBracesIdentifier' or typ == 'Lambda') then
+ typ = typ .. ('(%s)'):format(
+ (eastnode.data.fig.type_guesses.allow_lambda and '\\' or '-')
+ .. (eastnode.data.fig.type_guesses.allow_dict and 'd' or '-')
+ .. (eastnode.data.fig.type_guesses.allow_ident and 'i' or '-'))
+ elseif typ == 'Comparison' then
+ typ = typ .. ('(type=%s,inv=%u,ccs=%s)'):format(
+ conv_cmp_type(eastnode.data.cmp.type), eastnode.data.cmp.inv and 1 or 0,
+ conv_ccs(eastnode.data.cmp.ccs))
+ elseif typ == 'Integer' then
+ typ = typ .. ('(val=%u)'):format(tonumber(eastnode.data.num.value))
+ elseif typ == 'Float' then
+ typ = typ .. format_string('(val=%e)', tonumber(eastnode.data.flt.value))
+ elseif typ == 'SingleQuotedString' or typ == 'DoubleQuotedString' then
+ if eastnode.data.str.value == nil then
+ typ = typ .. '(val=NULL)'
+ else
+ local s = ffi.string(eastnode.data.str.value, eastnode.data.str.size)
+ typ = format_string('%s(val=%q)', typ, s)
+ end
+ elseif typ == 'Option' then
+ typ = ('%s(scope=%s,ident=%s)'):format(
+ typ,
+ tostring(intchar2lua(eastnode.data.opt.scope)),
+ ffi.string(eastnode.data.opt.ident, eastnode.data.opt.ident_len))
+ elseif typ == 'Environment' then
+ typ = ('%s(ident=%s)'):format(
+ typ,
+ ffi.string(eastnode.data.env.ident, eastnode.data.env.ident_len))
+ elseif typ == 'Assignment' then
+ typ = ('%s(%s)'):format(typ, conv_expr_asgn_type(eastnode.data.ass.type))
+ end
+ ret_str = typ .. ':' .. ret_str
+ local can_simplify = not ret.children
+ if can_simplify then
+ ret = ret_str
+ else
+ ret[1] = ret_str
+ end
+ return ret
+end
+
+eastnodelist2lua = function(pstate, eastnode, checked_nodes)
+ local ret = {}
+ while eastnode ~= nil do
+ ret[#ret + 1] = eastnode2lua(pstate, eastnode, checked_nodes)
+ eastnode = eastnode.next
+ end
+ if #ret == 0 then
+ ret = nil
+ end
+ return ret
+end
+
+local function east2lua(str, pstate, east)
+ local checked_nodes = {}
+ local len = tonumber(pstate.pos.col)
+ if pstate.pos.line == 1 then
+ len = tonumber(pstate.reader.lines.items[0].size)
+ end
+ if type(str) == 'string' and len == #str then
+ len = nil
+ end
+ return {
+ err = east.err.msg ~= nil and {
+ msg = ffi.string(east.err.msg),
+ arg = ffi.string(east.err.arg, east.err.arg_len),
+ } or nil,
+ len = len,
+ ast = eastnodelist2lua(pstate, east.root, checked_nodes),
+ }
+end
+
+local function phl2lua(pstate)
+ local ret = {}
+ for i = 0, (tonumber(pstate.colors.size) - 1) do
+ local chunk = pstate.colors.items[i]
+ local chunk_tbl = pstate_set_str(
+ pstate, chunk.start, chunk.end_col - chunk.start.col, {
+ group = ffi.string(chunk.group),
+ })
+ ret[i + 1] = ('%s:%u:%u:%s'):format(
+ chunk_tbl.group,
+ chunk_tbl.start.line,
+ chunk_tbl.start.col,
+ chunk_tbl.str)
+ end
+ return ret
+end
+
+child_call_once(function()
+ assert:set_parameter('TableFormatLevel', 1000000)
+end)
+
+describe('Expressions parser', function()
+ local function _check_parsing(opts, str, exp_ast, exp_highlighting_fs,
+ nz_flags_exps)
+ local zflags = opts.flags[1]
+ nz_flags_exps = nz_flags_exps or {}
+ local format_check_data = {}
+ for _, flags in ipairs(opts.flags) do
+ debug_log(('Running test case (%s, %u)'):format(str, flags))
+ local err, msg = pcall(function()
+ if os.getenv('NVIM_TEST_PARSER_SPEC_PRINT_TEST_CASE') == '1' then
+ print(str, flags)
+ end
+ alloc_log:check({})
+
+ local pstate = new_pstate({str})
+ local east = lib.viml_pexpr_parse(pstate, flags)
+ local ast = east2lua(str, pstate, east)
+ local hls = phl2lua(pstate)
+ if exp_ast == nil then
+ format_check_data[flags] = {ast=ast, hl_fs=hls_to_hl_fs(hls)}
+ else
+ local exps = {
+ ast = exp_ast,
+ hl_fs = exp_highlighting_fs,
+ }
+ local add_exps = nz_flags_exps[flags]
+ if not add_exps and flags == 3 + zflags then
+ add_exps = nz_flags_exps[1 + zflags] or nz_flags_exps[2 + zflags]
+ end
+ if add_exps then
+ if add_exps.ast then
+ exps.ast = mergedicts_copy(exps.ast, add_exps.ast)
+ end
+ if add_exps.hl_fs then
+ exps.hl_fs = mergedicts_copy(exps.hl_fs, add_exps.hl_fs)
+ end
+ end
+ eq(exps.ast, ast)
+ if exp_highlighting_fs then
+ local exp_highlighting = {}
+ local next_col = 0
+ for i, h in ipairs(exps.hl_fs) do
+ exp_highlighting[i], next_col = h(next_col)
+ end
+ eq(exp_highlighting, hls)
+ end
+ end
+ lib.viml_pexpr_free_ast(east)
+ kvi_destroy(pstate.colors)
+ alloc_log:clear_tmp_allocs(true)
+ alloc_log:check({})
+ end)
+ if not err then
+ msg = format_string('Error while processing test (%r, %u):\n%s',
+ str, flags, msg)
+ error(msg)
+ end
+ end
+ if exp_ast == nil then
+ format_check(str, format_check_data, opts)
+ end
+ end
+ local function hl(group, str, shift)
+ return function(next_col)
+ if nvim_hl_defs['Nvim' .. group] == nil then
+ error(('Unknown group: Nvim%s'):format(group))
+ end
+ local col = next_col + (shift or 0)
+ return (('%s:%u:%u:%s'):format(
+ 'Nvim' .. group,
+ 0,
+ col,
+ str)), (col + #str)
+ end
+ end
+ local function fmtn(typ, args, rest)
+ return ('%s(%s)%s'):format(typ, args, rest)
+ end
+ require('test.unit.viml.expressions.parser_tests')(
+ itp, _check_parsing, hl, fmtn)
+end)
diff --git a/test/unit/viml/expressions/parser_tests.lua b/test/unit/viml/expressions/parser_tests.lua
new file mode 100644
index 0000000000..da61672bb1
--- /dev/null
+++ b/test/unit/viml/expressions/parser_tests.lua
@@ -0,0 +1,8317 @@
+local global_helpers = require('test.helpers')
+
+local REMOVE_THIS = global_helpers.REMOVE_THIS
+
+return function(itp, _check_parsing, hl, fmtn)
+ local function check_parsing(...)
+ return _check_parsing({flags={0, 1, 2, 3}, funcname='check_parsing'}, ...)
+ end
+ local function check_asgn_parsing(...)
+ return _check_parsing({
+ flags={4, 5, 6, 7},
+ funcname='check_asgn_parsing',
+ }, ...)
+ end
+ itp('works with + and @a', function()
+ check_parsing('@a', {
+ ast = {
+ 'Register(name=a):0:0:@a',
+ },
+ }, {
+ hl('Register', '@a'),
+ })
+ check_parsing('+@a', {
+ ast = {
+ {
+ 'UnaryPlus:0:0:+',
+ children = {
+ 'Register(name=a):0:1:@a',
+ },
+ },
+ },
+ }, {
+ hl('UnaryPlus', '+'),
+ hl('Register', '@a'),
+ })
+ check_parsing('@a+@b', {
+ ast = {
+ {
+ 'BinaryPlus:0:2:+',
+ children = {
+ 'Register(name=a):0:0:@a',
+ 'Register(name=b):0:3:@b',
+ },
+ },
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('BinaryPlus', '+'),
+ hl('Register', '@b'),
+ })
+ check_parsing('@a+@b+@c', {
+ ast = {
+ {
+ 'BinaryPlus:0:5:+',
+ children = {
+ {
+ 'BinaryPlus:0:2:+',
+ children = {
+ 'Register(name=a):0:0:@a',
+ 'Register(name=b):0:3:@b',
+ },
+ },
+ 'Register(name=c):0:6:@c',
+ },
+ },
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('BinaryPlus', '+'),
+ hl('Register', '@b'),
+ hl('BinaryPlus', '+'),
+ hl('Register', '@c'),
+ })
+ check_parsing('+@a+@b', {
+ ast = {
+ {
+ 'BinaryPlus:0:3:+',
+ children = {
+ {
+ 'UnaryPlus:0:0:+',
+ children = {
+ 'Register(name=a):0:1:@a',
+ },
+ },
+ 'Register(name=b):0:4:@b',
+ },
+ },
+ },
+ }, {
+ hl('UnaryPlus', '+'),
+ hl('Register', '@a'),
+ hl('BinaryPlus', '+'),
+ hl('Register', '@b'),
+ })
+ check_parsing('+@a++@b', {
+ ast = {
+ {
+ 'BinaryPlus:0:3:+',
+ children = {
+ {
+ 'UnaryPlus:0:0:+',
+ children = {
+ 'Register(name=a):0:1:@a',
+ },
+ },
+ {
+ 'UnaryPlus:0:4:+',
+ children = {
+ 'Register(name=b):0:5:@b',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('UnaryPlus', '+'),
+ hl('Register', '@a'),
+ hl('BinaryPlus', '+'),
+ hl('UnaryPlus', '+'),
+ hl('Register', '@b'),
+ })
+ check_parsing('@a@b', {
+ ast = {
+ {
+ 'OpMissing:0:2:',
+ children = {
+ 'Register(name=a):0:0:@a',
+ 'Register(name=b):0:2:@b',
+ },
+ },
+ },
+ err = {
+ arg = '@b',
+ msg = 'E15: Missing operator: %.*s',
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('InvalidRegister', '@b'),
+ }, {
+ [1] = {
+ ast = {
+ len = 2,
+ err = REMOVE_THIS,
+ ast = {
+ 'Register(name=a):0:0:@a'
+ },
+ },
+ hl_fs = {
+ [2] = REMOVE_THIS,
+ },
+ },
+ })
+ check_parsing(' @a \t @b', {
+ ast = {
+ {
+ 'OpMissing:0:3:',
+ children = {
+ 'Register(name=a):0:0: @a',
+ 'Register(name=b):0:3: \t @b',
+ },
+ },
+ },
+ err = {
+ arg = '@b',
+ msg = 'E15: Missing operator: %.*s',
+ },
+ }, {
+ hl('Register', '@a', 1),
+ hl('InvalidSpacing', ' \t '),
+ hl('Register', '@b'),
+ }, {
+ [1] = {
+ ast = {
+ len = 6,
+ err = REMOVE_THIS,
+ ast = {
+ 'Register(name=a):0:0: @a'
+ },
+ },
+ hl_fs = {
+ [2] = REMOVE_THIS,
+ [3] = REMOVE_THIS,
+ },
+ },
+ })
+ check_parsing('+', {
+ ast = {
+ 'UnaryPlus:0:0:+',
+ },
+ err = {
+ arg = '',
+ msg = 'E15: Expected value, got EOC: %.*s',
+ },
+ }, {
+ hl('UnaryPlus', '+'),
+ })
+ check_parsing(' +', {
+ ast = {
+ 'UnaryPlus:0:0: +',
+ },
+ err = {
+ arg = '',
+ msg = 'E15: Expected value, got EOC: %.*s',
+ },
+ }, {
+ hl('UnaryPlus', '+', 1),
+ })
+ check_parsing('@a+ ', {
+ ast = {
+ {
+ 'BinaryPlus:0:2:+',
+ children = {
+ 'Register(name=a):0:0:@a',
+ },
+ },
+ },
+ err = {
+ arg = '',
+ msg = 'E15: Expected value, got EOC: %.*s',
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('BinaryPlus', '+'),
+ })
+ end)
+ itp('works with @a, + and parenthesis', function()
+ check_parsing('(@a)', {
+ ast = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ 'Register(name=a):0:1:@a',
+ },
+ },
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('Register', '@a'),
+ hl('NestingParenthesis', ')'),
+ })
+ check_parsing('()', {
+ ast = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ 'Missing:0:1:',
+ },
+ },
+ },
+ err = {
+ arg = ')',
+ msg = 'E15: Expected value, got parenthesis: %.*s',
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('InvalidNestingParenthesis', ')'),
+ })
+ check_parsing(')', {
+ ast = {
+ {
+ 'Nested:0:0:',
+ children = {
+ 'Missing:0:0:',
+ },
+ },
+ },
+ err = {
+ arg = ')',
+ msg = 'E15: Expected value, got parenthesis: %.*s',
+ },
+ }, {
+ hl('InvalidNestingParenthesis', ')'),
+ })
+ check_parsing('+)', {
+ ast = {
+ {
+ 'Nested:0:1:',
+ children = {
+ {
+ 'UnaryPlus:0:0:+',
+ children = {
+ 'Missing:0:1:',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = ')',
+ msg = 'E15: Expected value, got parenthesis: %.*s',
+ },
+ }, {
+ hl('UnaryPlus', '+'),
+ hl('InvalidNestingParenthesis', ')'),
+ })
+ check_parsing('+@a(@b)', {
+ ast = {
+ {
+ 'UnaryPlus:0:0:+',
+ children = {
+ {
+ 'Call:0:3:(',
+ children = {
+ 'Register(name=a):0:1:@a',
+ 'Register(name=b):0:4:@b',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('UnaryPlus', '+'),
+ hl('Register', '@a'),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@b'),
+ hl('CallingParenthesis', ')'),
+ })
+ check_parsing('@a+@b(@c)', {
+ ast = {
+ {
+ 'BinaryPlus:0:2:+',
+ children = {
+ 'Register(name=a):0:0:@a',
+ {
+ 'Call:0:5:(',
+ children = {
+ 'Register(name=b):0:3:@b',
+ 'Register(name=c):0:6:@c',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('BinaryPlus', '+'),
+ hl('Register', '@b'),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@c'),
+ hl('CallingParenthesis', ')'),
+ })
+ check_parsing('@a()', {
+ ast = {
+ {
+ 'Call:0:2:(',
+ children = {
+ 'Register(name=a):0:0:@a',
+ },
+ },
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('CallingParenthesis', '('),
+ hl('CallingParenthesis', ')'),
+ })
+ check_parsing('@a ()', {
+ ast = {
+ {
+ 'OpMissing:0:2:',
+ children = {
+ 'Register(name=a):0:0:@a',
+ {
+ 'Nested:0:2: (',
+ children = {
+ 'Missing:0:4:',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '()',
+ msg = 'E15: Missing operator: %.*s',
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('InvalidSpacing', ' '),
+ hl('NestingParenthesis', '('),
+ hl('InvalidNestingParenthesis', ')'),
+ }, {
+ [1] = {
+ ast = {
+ len = 3,
+ err = REMOVE_THIS,
+ ast = {
+ 'Register(name=a):0:0:@a',
+ },
+ },
+ hl_fs = {
+ [2] = REMOVE_THIS,
+ [3] = REMOVE_THIS,
+ [4] = REMOVE_THIS,
+ },
+ },
+ })
+ check_parsing('@a + (@b)', {
+ ast = {
+ {
+ 'BinaryPlus:0:2: +',
+ children = {
+ 'Register(name=a):0:0:@a',
+ {
+ 'Nested:0:4: (',
+ children = {
+ 'Register(name=b):0:6:@b',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('BinaryPlus', '+', 1),
+ hl('NestingParenthesis', '(', 1),
+ hl('Register', '@b'),
+ hl('NestingParenthesis', ')'),
+ })
+ check_parsing('@a + (+@b)', {
+ ast = {
+ {
+ 'BinaryPlus:0:2: +',
+ children = {
+ 'Register(name=a):0:0:@a',
+ {
+ 'Nested:0:4: (',
+ children = {
+ {
+ 'UnaryPlus:0:6:+',
+ children = {
+ 'Register(name=b):0:7:@b',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('BinaryPlus', '+', 1),
+ hl('NestingParenthesis', '(', 1),
+ hl('UnaryPlus', '+'),
+ hl('Register', '@b'),
+ hl('NestingParenthesis', ')'),
+ })
+ check_parsing('@a + (@b + @c)', {
+ ast = {
+ {
+ 'BinaryPlus:0:2: +',
+ children = {
+ 'Register(name=a):0:0:@a',
+ {
+ 'Nested:0:4: (',
+ children = {
+ {
+ 'BinaryPlus:0:8: +',
+ children = {
+ 'Register(name=b):0:6:@b',
+ 'Register(name=c):0:10: @c',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('BinaryPlus', '+', 1),
+ hl('NestingParenthesis', '(', 1),
+ hl('Register', '@b'),
+ hl('BinaryPlus', '+', 1),
+ hl('Register', '@c', 1),
+ hl('NestingParenthesis', ')'),
+ })
+ check_parsing('(@a)+@b', {
+ ast = {
+ {
+ 'BinaryPlus:0:4:+',
+ children = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ 'Register(name=a):0:1:@a',
+ },
+ },
+ 'Register(name=b):0:5:@b',
+ },
+ },
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('Register', '@a'),
+ hl('NestingParenthesis', ')'),
+ hl('BinaryPlus', '+'),
+ hl('Register', '@b'),
+ })
+ check_parsing('@a+(@b)(@c)', {
+ -- 01234567890
+ ast = {
+ {
+ 'BinaryPlus:0:2:+',
+ children = {
+ 'Register(name=a):0:0:@a',
+ {
+ 'Call:0:7:(',
+ children = {
+ {
+ 'Nested:0:3:(',
+ children = { 'Register(name=b):0:4:@b' },
+ },
+ 'Register(name=c):0:8:@c',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('BinaryPlus', '+'),
+ hl('NestingParenthesis', '('),
+ hl('Register', '@b'),
+ hl('NestingParenthesis', ')'),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@c'),
+ hl('CallingParenthesis', ')'),
+ })
+ check_parsing('@a+((@b))(@c)', {
+ -- 01234567890123456890123456789
+ -- 0 1 2
+ ast = {
+ {
+ 'BinaryPlus:0:2:+',
+ children = {
+ 'Register(name=a):0:0:@a',
+ {
+ 'Call:0:9:(',
+ children = {
+ {
+ 'Nested:0:3:(',
+ children = {
+ {
+ 'Nested:0:4:(',
+ children = { 'Register(name=b):0:5:@b' }
+ },
+ },
+ },
+ 'Register(name=c):0:10:@c',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('BinaryPlus', '+'),
+ hl('NestingParenthesis', '('),
+ hl('NestingParenthesis', '('),
+ hl('Register', '@b'),
+ hl('NestingParenthesis', ')'),
+ hl('NestingParenthesis', ')'),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@c'),
+ hl('CallingParenthesis', ')'),
+ })
+ check_parsing('@a+((@b))+@c', {
+ -- 01234567890123456890123456789
+ -- 0 1 2
+ ast = {
+ {
+ 'BinaryPlus:0:9:+',
+ children = {
+ {
+ 'BinaryPlus:0:2:+',
+ children = {
+ 'Register(name=a):0:0:@a',
+ {
+ 'Nested:0:3:(',
+ children = {
+ {
+ 'Nested:0:4:(',
+ children = { 'Register(name=b):0:5:@b' }
+ },
+ },
+ },
+ },
+ },
+ 'Register(name=c):0:10:@c',
+ },
+ },
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('BinaryPlus', '+'),
+ hl('NestingParenthesis', '('),
+ hl('NestingParenthesis', '('),
+ hl('Register', '@b'),
+ hl('NestingParenthesis', ')'),
+ hl('NestingParenthesis', ')'),
+ hl('BinaryPlus', '+'),
+ hl('Register', '@c'),
+ })
+ check_parsing(
+ '@a + (@b + @c) + @d(@e) + (+@f) + ((+@g(@h))(@j)(@k))(@l)', {--[[
+ | | | | | | | | || | | || | | ||| || || || ||
+ 000000000011111111112222222222333333333344444444445555555
+ 012345678901234567890123456789012345678901234567890123456
+ ]]
+ ast = {{
+ 'BinaryPlus:0:31: +',
+ children = {
+ {
+ 'BinaryPlus:0:23: +',
+ children = {
+ {
+ 'BinaryPlus:0:14: +',
+ children = {
+ {
+ 'BinaryPlus:0:2: +',
+ children = {
+ 'Register(name=a):0:0:@a',
+ {
+ 'Nested:0:4: (',
+ children = {
+ {
+ 'BinaryPlus:0:8: +',
+ children = {
+ 'Register(name=b):0:6:@b',
+ 'Register(name=c):0:10: @c',
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ 'Call:0:19:(',
+ children = {
+ 'Register(name=d):0:16: @d',
+ 'Register(name=e):0:20:@e',
+ },
+ },
+ },
+ },
+ {
+ 'Nested:0:25: (',
+ children = {
+ {
+ 'UnaryPlus:0:27:+',
+ children = {
+ 'Register(name=f):0:28:@f',
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ 'Call:0:53:(',
+ children = {
+ {
+ 'Nested:0:33: (',
+ children = {
+ {
+ 'Call:0:48:(',
+ children = {
+ {
+ 'Call:0:44:(',
+ children = {
+ {
+ 'Nested:0:35:(',
+ children = {
+ {
+ 'UnaryPlus:0:36:+',
+ children = {
+ {
+ 'Call:0:39:(',
+ children = {
+ 'Register(name=g):0:37:@g',
+ 'Register(name=h):0:40:@h',
+ },
+ },
+ },
+ },
+ },
+ },
+ 'Register(name=j):0:45:@j',
+ },
+ },
+ 'Register(name=k):0:49:@k',
+ },
+ },
+ },
+ },
+ 'Register(name=l):0:54:@l',
+ },
+ },
+ },
+ }},
+ }, {
+ hl('Register', '@a'),
+ hl('BinaryPlus', '+', 1),
+ hl('NestingParenthesis', '(', 1),
+ hl('Register', '@b'),
+ hl('BinaryPlus', '+', 1),
+ hl('Register', '@c', 1),
+ hl('NestingParenthesis', ')'),
+ hl('BinaryPlus', '+', 1),
+ hl('Register', '@d', 1),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@e'),
+ hl('CallingParenthesis', ')'),
+ hl('BinaryPlus', '+', 1),
+ hl('NestingParenthesis', '(', 1),
+ hl('UnaryPlus', '+'),
+ hl('Register', '@f'),
+ hl('NestingParenthesis', ')'),
+ hl('BinaryPlus', '+', 1),
+ hl('NestingParenthesis', '(', 1),
+ hl('NestingParenthesis', '('),
+ hl('UnaryPlus', '+'),
+ hl('Register', '@g'),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@h'),
+ hl('CallingParenthesis', ')'),
+ hl('NestingParenthesis', ')'),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@j'),
+ hl('CallingParenthesis', ')'),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@k'),
+ hl('CallingParenthesis', ')'),
+ hl('NestingParenthesis', ')'),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@l'),
+ hl('CallingParenthesis', ')'),
+ })
+ check_parsing('@a)', {
+ -- 012
+ ast = {
+ {
+ 'Nested:0:2:',
+ children = {
+ 'Register(name=a):0:0:@a',
+ },
+ },
+ },
+ err = {
+ arg = ')',
+ msg = 'E15: Unexpected closing parenthesis: %.*s',
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('InvalidNestingParenthesis', ')'),
+ })
+ check_parsing('(@a', {
+ -- 012
+ ast = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ 'Register(name=a):0:1:@a',
+ },
+ },
+ },
+ err = {
+ arg = '(@a',
+ msg = 'E110: Missing closing parenthesis for nested expression: %.*s',
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('Register', '@a'),
+ })
+ check_parsing('@a(@b', {
+ -- 01234
+ ast = {
+ {
+ 'Call:0:2:(',
+ children = {
+ 'Register(name=a):0:0:@a',
+ 'Register(name=b):0:3:@b',
+ },
+ },
+ },
+ err = {
+ arg = '(@b',
+ msg = 'E116: Missing closing parenthesis for function call: %.*s',
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@b'),
+ })
+ check_parsing('@a(@b, @c, @d, @e)', {
+ -- 012345678901234567
+ -- 0 1
+ ast = {
+ {
+ 'Call:0:2:(',
+ children = {
+ 'Register(name=a):0:0:@a',
+ {
+ 'Comma:0:5:,',
+ children = {
+ 'Register(name=b):0:3:@b',
+ {
+ 'Comma:0:9:,',
+ children = {
+ 'Register(name=c):0:6: @c',
+ {
+ 'Comma:0:13:,',
+ children = {
+ 'Register(name=d):0:10: @d',
+ 'Register(name=e):0:14: @e',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@b'),
+ hl('Comma', ','),
+ hl('Register', '@c', 1),
+ hl('Comma', ','),
+ hl('Register', '@d', 1),
+ hl('Comma', ','),
+ hl('Register', '@e', 1),
+ hl('CallingParenthesis', ')'),
+ })
+ check_parsing('@a(@b(@c))', {
+ -- 01234567890123456789012345678901234567
+ -- 0 1 2 3
+ ast = {
+ {
+ 'Call:0:2:(',
+ children = {
+ 'Register(name=a):0:0:@a',
+ {
+ 'Call:0:5:(',
+ children = {
+ 'Register(name=b):0:3:@b',
+ 'Register(name=c):0:6:@c',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@b'),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@c'),
+ hl('CallingParenthesis', ')'),
+ hl('CallingParenthesis', ')'),
+ })
+ check_parsing('@a(@b(@c(@d(@e), @f(@g(@h), @i(@j)))))', {
+ -- 01234567890123456789012345678901234567
+ -- 0 1 2 3
+ ast = {
+ {
+ 'Call:0:2:(',
+ children = {
+ 'Register(name=a):0:0:@a',
+ {
+ 'Call:0:5:(',
+ children = {
+ 'Register(name=b):0:3:@b',
+ {
+ 'Call:0:8:(',
+ children = {
+ 'Register(name=c):0:6:@c',
+ {
+ 'Comma:0:15:,',
+ children = {
+ {
+ 'Call:0:11:(',
+ children = {
+ 'Register(name=d):0:9:@d',
+ 'Register(name=e):0:12:@e',
+ },
+ },
+ {
+ 'Call:0:19:(',
+ children = {
+ 'Register(name=f):0:16: @f',
+ {
+ 'Comma:0:26:,',
+ children = {
+ {
+ 'Call:0:22:(',
+ children = {
+ 'Register(name=g):0:20:@g',
+ 'Register(name=h):0:23:@h',
+ },
+ },
+ {
+ 'Call:0:30:(',
+ children = {
+ 'Register(name=i):0:27: @i',
+ 'Register(name=j):0:31:@j',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@b'),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@c'),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@d'),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@e'),
+ hl('CallingParenthesis', ')'),
+ hl('Comma', ','),
+ hl('Register', '@f', 1),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@g'),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@h'),
+ hl('CallingParenthesis', ')'),
+ hl('Comma', ','),
+ hl('Register', '@i', 1),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@j'),
+ hl('CallingParenthesis', ')'),
+ hl('CallingParenthesis', ')'),
+ hl('CallingParenthesis', ')'),
+ hl('CallingParenthesis', ')'),
+ hl('CallingParenthesis', ')'),
+ })
+ check_parsing('()()', {
+ -- 0123
+ ast = {
+ {
+ 'Call:0:2:(',
+ children = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ 'Missing:0:1:',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = ')()',
+ msg = 'E15: Expected value, got parenthesis: %.*s',
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('InvalidNestingParenthesis', ')'),
+ hl('CallingParenthesis', '('),
+ hl('CallingParenthesis', ')'),
+ })
+ check_parsing('(@a)()', {
+ -- 012345
+ ast = {
+ {
+ 'Call:0:4:(',
+ children = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ 'Register(name=a):0:1:@a',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('Register', '@a'),
+ hl('NestingParenthesis', ')'),
+ hl('CallingParenthesis', '('),
+ hl('CallingParenthesis', ')'),
+ })
+ check_parsing('(@a)(@b)', {
+ -- 01234567
+ ast = {
+ {
+ 'Call:0:4:(',
+ children = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ 'Register(name=a):0:1:@a',
+ },
+ },
+ 'Register(name=b):0:5:@b',
+ },
+ },
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('Register', '@a'),
+ hl('NestingParenthesis', ')'),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@b'),
+ hl('CallingParenthesis', ')'),
+ })
+ check_parsing('(@a) (@b)', {
+ -- 012345678
+ ast = {
+ {
+ 'OpMissing:0:4:',
+ children = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ 'Register(name=a):0:1:@a',
+ },
+ },
+ {
+ 'Nested:0:4: (',
+ children = {
+ 'Register(name=b):0:6:@b',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '(@b)',
+ msg = 'E15: Missing operator: %.*s',
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('Register', '@a'),
+ hl('NestingParenthesis', ')'),
+ hl('InvalidSpacing', ' '),
+ hl('NestingParenthesis', '('),
+ hl('Register', '@b'),
+ hl('NestingParenthesis', ')'),
+ }, {
+ [1] = {
+ ast = {
+ len = 5,
+ ast = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ 'Register(name=a):0:1:@a',
+ REMOVE_THIS,
+ },
+ },
+ },
+ err = REMOVE_THIS,
+ },
+ hl_fs = {
+ [4] = REMOVE_THIS,
+ [5] = REMOVE_THIS,
+ [6] = REMOVE_THIS,
+ [7] = REMOVE_THIS,
+ },
+ },
+ })
+ end)
+ itp('works with variable names, including curly braces ones', function()
+ check_parsing('var', {
+ ast = {
+ 'PlainIdentifier(scope=0,ident=var):0:0:var',
+ },
+ }, {
+ hl('IdentifierName', 'var'),
+ })
+ check_parsing('g:var', {
+ ast = {
+ 'PlainIdentifier(scope=g,ident=var):0:0:g:var',
+ },
+ }, {
+ hl('IdentifierScope', 'g'),
+ hl('IdentifierScopeDelimiter', ':'),
+ hl('IdentifierName', 'var'),
+ })
+ check_parsing('g:', {
+ ast = {
+ 'PlainIdentifier(scope=g,ident=):0:0:g:',
+ },
+ }, {
+ hl('IdentifierScope', 'g'),
+ hl('IdentifierScopeDelimiter', ':'),
+ })
+ check_parsing('{a}', {
+ -- 012
+ ast = {
+ {
+ fmtn('CurlyBracesIdentifier', '-di', ':0:0:{'),
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ },
+ },
+ },
+ }, {
+ hl('Curly', '{'),
+ hl('IdentifierName', 'a'),
+ hl('Curly', '}'),
+ })
+ check_parsing('{a:b}', {
+ -- 012
+ ast = {
+ {
+ fmtn('CurlyBracesIdentifier', '-di', ':0:0:{'),
+ children = {
+ 'PlainIdentifier(scope=a,ident=b):0:1:a:b',
+ },
+ },
+ },
+ }, {
+ hl('Curly', '{'),
+ hl('IdentifierScope', 'a'),
+ hl('IdentifierScopeDelimiter', ':'),
+ hl('IdentifierName', 'b'),
+ hl('Curly', '}'),
+ })
+ check_parsing('{a:@b}', {
+ -- 012345
+ ast = {
+ {
+ fmtn('CurlyBracesIdentifier', '-di', ':0:0:{'),
+ children = {
+ {
+ 'OpMissing:0:3:',
+ children={
+ 'PlainIdentifier(scope=a,ident=):0:1:a:',
+ 'Register(name=b):0:3:@b',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '@b}',
+ msg = 'E15: Missing operator: %.*s',
+ },
+ }, {
+ hl('Curly', '{'),
+ hl('IdentifierScope', 'a'),
+ hl('IdentifierScopeDelimiter', ':'),
+ hl('InvalidRegister', '@b'),
+ hl('Curly', '}'),
+ })
+ check_parsing('{@a}', {
+ ast = {
+ {
+ fmtn('CurlyBracesIdentifier', '-di', ':0:0:{'),
+ children = {
+ 'Register(name=a):0:1:@a',
+ },
+ },
+ },
+ }, {
+ hl('Curly', '{'),
+ hl('Register', '@a'),
+ hl('Curly', '}'),
+ })
+ check_parsing('{@a}{@b}', {
+ -- 01234567
+ ast = {
+ {
+ 'ComplexIdentifier:0:4:',
+ children = {
+ {
+ fmtn('CurlyBracesIdentifier', '-di', ':0:0:{'),
+ children = {
+ 'Register(name=a):0:1:@a',
+ },
+ },
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:4:{'),
+ children = {
+ 'Register(name=b):0:5:@b',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Curly', '{'),
+ hl('Register', '@a'),
+ hl('Curly', '}'),
+ hl('Curly', '{'),
+ hl('Register', '@b'),
+ hl('Curly', '}'),
+ })
+ check_parsing('g:{@a}', {
+ -- 01234567
+ ast = {
+ {
+ 'ComplexIdentifier:0:2:',
+ children = {
+ 'PlainIdentifier(scope=g,ident=):0:0:g:',
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:2:{'),
+ children = {
+ 'Register(name=a):0:3:@a',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('IdentifierScope', 'g'),
+ hl('IdentifierScopeDelimiter', ':'),
+ hl('Curly', '{'),
+ hl('Register', '@a'),
+ hl('Curly', '}'),
+ })
+ check_parsing('{@a}_test', {
+ -- 012345678
+ ast = {
+ {
+ 'ComplexIdentifier:0:4:',
+ children = {
+ {
+ fmtn('CurlyBracesIdentifier', '-di', ':0:0:{'),
+ children = {
+ 'Register(name=a):0:1:@a',
+ },
+ },
+ 'PlainIdentifier(scope=0,ident=_test):0:4:_test',
+ },
+ },
+ },
+ }, {
+ hl('Curly', '{'),
+ hl('Register', '@a'),
+ hl('Curly', '}'),
+ hl('IdentifierName', '_test'),
+ })
+ check_parsing('g:{@a}_test', {
+ -- 01234567890
+ ast = {
+ {
+ 'ComplexIdentifier:0:2:',
+ children = {
+ 'PlainIdentifier(scope=g,ident=):0:0:g:',
+ {
+ 'ComplexIdentifier:0:6:',
+ children = {
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:2:{'),
+ children = {
+ 'Register(name=a):0:3:@a',
+ },
+ },
+ 'PlainIdentifier(scope=0,ident=_test):0:6:_test',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('IdentifierScope', 'g'),
+ hl('IdentifierScopeDelimiter', ':'),
+ hl('Curly', '{'),
+ hl('Register', '@a'),
+ hl('Curly', '}'),
+ hl('IdentifierName', '_test'),
+ })
+ check_parsing('g:{@a}_test()', {
+ -- 0123456789012
+ ast = {
+ {
+ 'Call:0:11:(',
+ children = {
+ {
+ 'ComplexIdentifier:0:2:',
+ children = {
+ 'PlainIdentifier(scope=g,ident=):0:0:g:',
+ {
+ 'ComplexIdentifier:0:6:',
+ children = {
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:2:{'),
+ children = {
+ 'Register(name=a):0:3:@a',
+ },
+ },
+ 'PlainIdentifier(scope=0,ident=_test):0:6:_test',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('IdentifierScope', 'g'),
+ hl('IdentifierScopeDelimiter', ':'),
+ hl('Curly', '{'),
+ hl('Register', '@a'),
+ hl('Curly', '}'),
+ hl('IdentifierName', '_test'),
+ hl('CallingParenthesis', '('),
+ hl('CallingParenthesis', ')'),
+ })
+ check_parsing('{@a} ()', {
+ -- 0123456789012
+ ast = {
+ {
+ 'Call:0:4: (',
+ children = {
+ {
+ fmtn('CurlyBracesIdentifier', '-di', ':0:0:{'),
+ children = {
+ 'Register(name=a):0:1:@a',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Curly', '{'),
+ hl('Register', '@a'),
+ hl('Curly', '}'),
+ hl('CallingParenthesis', '(', 1),
+ hl('CallingParenthesis', ')'),
+ })
+ check_parsing('g:{@a} ()', {
+ -- 0123456789012
+ ast = {
+ {
+ 'Call:0:6: (',
+ children = {
+ {
+ 'ComplexIdentifier:0:2:',
+ children = {
+ 'PlainIdentifier(scope=g,ident=):0:0:g:',
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:2:{'),
+ children = {
+ 'Register(name=a):0:3:@a',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('IdentifierScope', 'g'),
+ hl('IdentifierScopeDelimiter', ':'),
+ hl('Curly', '{'),
+ hl('Register', '@a'),
+ hl('Curly', '}'),
+ hl('CallingParenthesis', '(', 1),
+ hl('CallingParenthesis', ')'),
+ })
+ check_parsing('{@a', {
+ -- 012
+ ast = {
+ {
+ fmtn('UnknownFigure', '-di', ':0:0:{'),
+ children = {
+ 'Register(name=a):0:1:@a',
+ },
+ },
+ },
+ err = {
+ arg = '{@a',
+ msg = 'E15: Missing closing figure brace: %.*s',
+ },
+ }, {
+ hl('FigureBrace', '{'),
+ hl('Register', '@a'),
+ })
+ check_parsing('a ()', {
+ -- 0123
+ ast = {
+ {
+ 'Call:0:1: (',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('CallingParenthesis', '(', 1),
+ hl('CallingParenthesis', ')'),
+ })
+ end)
+ itp('works with lambdas and dictionaries', function()
+ check_parsing('{}', {
+ ast = {
+ fmtn('DictLiteral', '-di', ':0:0:{'),
+ },
+ }, {
+ hl('Dict', '{'),
+ hl('Dict', '}'),
+ })
+ check_parsing('{->@a}', {
+ ast = {
+ {
+ fmtn('Lambda', '\\di', ':0:0:{'),
+ children = {
+ {
+ 'Arrow:0:1:->',
+ children = {
+ 'Register(name=a):0:3:@a',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Lambda', '{'),
+ hl('Arrow', '->'),
+ hl('Register', '@a'),
+ hl('Lambda', '}'),
+ })
+ check_parsing('{->@a+@b}', {
+ -- 012345678
+ ast = {
+ {
+ fmtn('Lambda', '\\di', ':0:0:{'),
+ children = {
+ {
+ 'Arrow:0:1:->',
+ children = {
+ {
+ 'BinaryPlus:0:5:+',
+ children = {
+ 'Register(name=a):0:3:@a',
+ 'Register(name=b):0:6:@b',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Lambda', '{'),
+ hl('Arrow', '->'),
+ hl('Register', '@a'),
+ hl('BinaryPlus', '+'),
+ hl('Register', '@b'),
+ hl('Lambda', '}'),
+ })
+ check_parsing('{a->@a}', {
+ -- 012345678
+ ast = {
+ {
+ fmtn('Lambda', '\\di', ':0:0:{'),
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ {
+ 'Arrow:0:2:->',
+ children = {
+ 'Register(name=a):0:4:@a',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Lambda', '{'),
+ hl('IdentifierName', 'a'),
+ hl('Arrow', '->'),
+ hl('Register', '@a'),
+ hl('Lambda', '}'),
+ })
+ check_parsing('{a,b->@a}', {
+ -- 012345678
+ ast = {
+ {
+ fmtn('Lambda', '\\di', ':0:0:{'),
+ children = {
+ {
+ 'Comma:0:2:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ 'PlainIdentifier(scope=0,ident=b):0:3:b',
+ },
+ },
+ {
+ 'Arrow:0:4:->',
+ children = {
+ 'Register(name=a):0:6:@a',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Lambda', '{'),
+ hl('IdentifierName', 'a'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'b'),
+ hl('Arrow', '->'),
+ hl('Register', '@a'),
+ hl('Lambda', '}'),
+ })
+ check_parsing('{a,b,c->@a}', {
+ -- 01234567890
+ ast = {
+ {
+ fmtn('Lambda', '\\di', ':0:0:{'),
+ children = {
+ {
+ 'Comma:0:2:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ {
+ 'Comma:0:4:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:3:b',
+ 'PlainIdentifier(scope=0,ident=c):0:5:c',
+ },
+ },
+ },
+ },
+ {
+ 'Arrow:0:6:->',
+ children = {
+ 'Register(name=a):0:8:@a',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Lambda', '{'),
+ hl('IdentifierName', 'a'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'b'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'c'),
+ hl('Arrow', '->'),
+ hl('Register', '@a'),
+ hl('Lambda', '}'),
+ })
+ check_parsing('{a,b,c,d->@a}', {
+ -- 0123456789012
+ ast = {
+ {
+ fmtn('Lambda', '\\di', ':0:0:{'),
+ children = {
+ {
+ 'Comma:0:2:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ {
+ 'Comma:0:4:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:3:b',
+ {
+ 'Comma:0:6:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=c):0:5:c',
+ 'PlainIdentifier(scope=0,ident=d):0:7:d',
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ 'Arrow:0:8:->',
+ children = {
+ 'Register(name=a):0:10:@a',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Lambda', '{'),
+ hl('IdentifierName', 'a'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'b'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'c'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'd'),
+ hl('Arrow', '->'),
+ hl('Register', '@a'),
+ hl('Lambda', '}'),
+ })
+ check_parsing('{a,b,c,d,->@a}', {
+ -- 01234567890123
+ ast = {
+ {
+ fmtn('Lambda', '\\di', ':0:0:{'),
+ children = {
+ {
+ 'Comma:0:2:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ {
+ 'Comma:0:4:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:3:b',
+ {
+ 'Comma:0:6:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=c):0:5:c',
+ {
+ 'Comma:0:8:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=d):0:7:d',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ 'Arrow:0:9:->',
+ children = {
+ 'Register(name=a):0:11:@a',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Lambda', '{'),
+ hl('IdentifierName', 'a'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'b'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'c'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'd'),
+ hl('Comma', ','),
+ hl('Arrow', '->'),
+ hl('Register', '@a'),
+ hl('Lambda', '}'),
+ })
+ check_parsing('{a,b->{c,d->{e,f->@a}}}', {
+ -- 01234567890123456789012
+ -- 0 1 2
+ ast = {
+ {
+ fmtn('Lambda', '\\di', ':0:0:{'),
+ children = {
+ {
+ 'Comma:0:2:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ 'PlainIdentifier(scope=0,ident=b):0:3:b',
+ },
+ },
+ {
+ 'Arrow:0:4:->',
+ children = {
+ {
+ fmtn('Lambda', '\\di', ':0:6:{'),
+ children = {
+ {
+ 'Comma:0:8:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=c):0:7:c',
+ 'PlainIdentifier(scope=0,ident=d):0:9:d',
+ },
+ },
+ {
+ 'Arrow:0:10:->',
+ children = {
+ {
+ fmtn('Lambda', '\\di', ':0:12:{'),
+ children = {
+ {
+ 'Comma:0:14:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=e):0:13:e',
+ 'PlainIdentifier(scope=0,ident=f):0:15:f',
+ },
+ },
+ {
+ 'Arrow:0:16:->',
+ children = {
+ 'Register(name=a):0:18:@a',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Lambda', '{'),
+ hl('IdentifierName', 'a'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'b'),
+ hl('Arrow', '->'),
+ hl('Lambda', '{'),
+ hl('IdentifierName', 'c'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'd'),
+ hl('Arrow', '->'),
+ hl('Lambda', '{'),
+ hl('IdentifierName', 'e'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'f'),
+ hl('Arrow', '->'),
+ hl('Register', '@a'),
+ hl('Lambda', '}'),
+ hl('Lambda', '}'),
+ hl('Lambda', '}'),
+ })
+ check_parsing('{a,b->c,d}', {
+ -- 0123456789
+ ast = {
+ {
+ fmtn('Lambda', '\\di', ':0:0:{'),
+ children = {
+ {
+ 'Comma:0:2:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ 'PlainIdentifier(scope=0,ident=b):0:3:b',
+ },
+ },
+ {
+ 'Arrow:0:4:->',
+ children = {
+ {
+ 'Comma:0:7:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=c):0:6:c',
+ 'PlainIdentifier(scope=0,ident=d):0:8:d',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = ',d}',
+ msg = 'E15: Comma outside of call, lambda or literal: %.*s',
+ },
+ }, {
+ hl('Lambda', '{'),
+ hl('IdentifierName', 'a'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'b'),
+ hl('Arrow', '->'),
+ hl('IdentifierName', 'c'),
+ hl('InvalidComma', ','),
+ hl('IdentifierName', 'd'),
+ hl('Lambda', '}'),
+ })
+ check_parsing('a,b,c,d', {
+ -- 0123456789
+ ast = {
+ {
+ 'Comma:0:1:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ 'Comma:0:3:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:2:b',
+ {
+ 'Comma:0:5:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=c):0:4:c',
+ 'PlainIdentifier(scope=0,ident=d):0:6:d',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = ',b,c,d',
+ msg = 'E15: Comma outside of call, lambda or literal: %.*s',
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('InvalidComma', ','),
+ hl('IdentifierName', 'b'),
+ hl('InvalidComma', ','),
+ hl('IdentifierName', 'c'),
+ hl('InvalidComma', ','),
+ hl('IdentifierName', 'd'),
+ })
+ check_parsing('a,b,c,d,', {
+ -- 0123456789
+ ast = {
+ {
+ 'Comma:0:1:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ 'Comma:0:3:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:2:b',
+ {
+ 'Comma:0:5:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=c):0:4:c',
+ {
+ 'Comma:0:7:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=d):0:6:d',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = ',b,c,d,',
+ msg = 'E15: Comma outside of call, lambda or literal: %.*s',
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('InvalidComma', ','),
+ hl('IdentifierName', 'b'),
+ hl('InvalidComma', ','),
+ hl('IdentifierName', 'c'),
+ hl('InvalidComma', ','),
+ hl('IdentifierName', 'd'),
+ hl('InvalidComma', ','),
+ })
+ check_parsing(',', {
+ -- 0123456789
+ ast = {
+ {
+ 'Comma:0:0:,',
+ children = {
+ 'Missing:0:0:',
+ },
+ },
+ },
+ err = {
+ arg = ',',
+ msg = 'E15: Expected value, got comma: %.*s',
+ },
+ }, {
+ hl('InvalidComma', ','),
+ })
+ check_parsing('{,a->@a}', {
+ -- 0123456789
+ ast = {
+ {
+ fmtn('CurlyBracesIdentifier', '-di', ':0:0:{'),
+ children = {
+ {
+ 'Arrow:0:3:->',
+ children = {
+ {
+ 'Comma:0:1:,',
+ children = {
+ 'Missing:0:1:',
+ 'PlainIdentifier(scope=0,ident=a):0:2:a',
+ },
+ },
+ 'Register(name=a):0:5:@a',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = ',a->@a}',
+ msg = 'E15: Expected value, got comma: %.*s',
+ },
+ }, {
+ hl('Curly', '{'),
+ hl('InvalidComma', ','),
+ hl('IdentifierName', 'a'),
+ hl('InvalidArrow', '->'),
+ hl('Register', '@a'),
+ hl('Curly', '}'),
+ })
+ check_parsing('}', {
+ -- 0123456789
+ ast = {
+ fmtn('UnknownFigure', '---', ':0:0:'),
+ },
+ err = {
+ arg = '}',
+ msg = 'E15: Unexpected closing figure brace: %.*s',
+ },
+ }, {
+ hl('InvalidFigureBrace', '}'),
+ })
+ check_parsing('{->}', {
+ -- 0123456789
+ ast = {
+ {
+ fmtn('Lambda', '\\di', ':0:0:{'),
+ children = {
+ 'Arrow:0:1:->',
+ },
+ },
+ },
+ err = {
+ arg = '}',
+ msg = 'E15: Expected value, got closing figure brace: %.*s',
+ },
+ }, {
+ hl('Lambda', '{'),
+ hl('Arrow', '->'),
+ hl('InvalidLambda', '}'),
+ })
+ check_parsing('{a,b}', {
+ -- 0123456789
+ ast = {
+ {
+ fmtn('Lambda', '-di', ':0:0:{'),
+ children = {
+ {
+ 'Comma:0:2:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ 'PlainIdentifier(scope=0,ident=b):0:3:b',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '}',
+ msg = 'E15: Expected lambda arguments list or arrow: %.*s',
+ },
+ }, {
+ hl('Lambda', '{'),
+ hl('IdentifierName', 'a'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'b'),
+ hl('InvalidLambda', '}'),
+ })
+ check_parsing('{a,}', {
+ -- 0123456789
+ ast = {
+ {
+ fmtn('Lambda', '-di', ':0:0:{'),
+ children = {
+ {
+ 'Comma:0:2:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '}',
+ msg = 'E15: Expected lambda arguments list or arrow: %.*s',
+ },
+ }, {
+ hl('Lambda', '{'),
+ hl('IdentifierName', 'a'),
+ hl('Comma', ','),
+ hl('InvalidLambda', '}'),
+ })
+ check_parsing('{@a:@b}', {
+ -- 0123456789
+ ast = {
+ {
+ fmtn('DictLiteral', '-di', ':0:0:{'),
+ children = {
+ {
+ 'Colon:0:3::',
+ children = {
+ 'Register(name=a):0:1:@a',
+ 'Register(name=b):0:4:@b',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Dict', '{'),
+ hl('Register', '@a'),
+ hl('Colon', ':'),
+ hl('Register', '@b'),
+ hl('Dict', '}'),
+ })
+ check_parsing('{@a:@b,@c:@d}', {
+ -- 0123456789012
+ -- 0 1
+ ast = {
+ {
+ fmtn('DictLiteral', '-di', ':0:0:{'),
+ children = {
+ {
+ 'Comma:0:6:,',
+ children = {
+ {
+ 'Colon:0:3::',
+ children = {
+ 'Register(name=a):0:1:@a',
+ 'Register(name=b):0:4:@b',
+ },
+ },
+ {
+ 'Colon:0:9::',
+ children = {
+ 'Register(name=c):0:7:@c',
+ 'Register(name=d):0:10:@d',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Dict', '{'),
+ hl('Register', '@a'),
+ hl('Colon', ':'),
+ hl('Register', '@b'),
+ hl('Comma', ','),
+ hl('Register', '@c'),
+ hl('Colon', ':'),
+ hl('Register', '@d'),
+ hl('Dict', '}'),
+ })
+ check_parsing('{@a:@b,@c:@d,@e:@f,}', {
+ -- 01234567890123456789
+ -- 0 1
+ ast = {
+ {
+ fmtn('DictLiteral', '-di', ':0:0:{'),
+ children = {
+ {
+ 'Comma:0:6:,',
+ children = {
+ {
+ 'Colon:0:3::',
+ children = {
+ 'Register(name=a):0:1:@a',
+ 'Register(name=b):0:4:@b',
+ },
+ },
+ {
+ 'Comma:0:12:,',
+ children = {
+ {
+ 'Colon:0:9::',
+ children = {
+ 'Register(name=c):0:7:@c',
+ 'Register(name=d):0:10:@d',
+ },
+ },
+ {
+ 'Comma:0:18:,',
+ children = {
+ {
+ 'Colon:0:15::',
+ children = {
+ 'Register(name=e):0:13:@e',
+ 'Register(name=f):0:16:@f',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Dict', '{'),
+ hl('Register', '@a'),
+ hl('Colon', ':'),
+ hl('Register', '@b'),
+ hl('Comma', ','),
+ hl('Register', '@c'),
+ hl('Colon', ':'),
+ hl('Register', '@d'),
+ hl('Comma', ','),
+ hl('Register', '@e'),
+ hl('Colon', ':'),
+ hl('Register', '@f'),
+ hl('Comma', ','),
+ hl('Dict', '}'),
+ })
+ check_parsing('{@a:@b,@c:@d,@e:@f,@g:}', {
+ -- 01234567890123456789012
+ -- 0 1 2
+ ast = {
+ {
+ fmtn('DictLiteral', '-di', ':0:0:{'),
+ children = {
+ {
+ 'Comma:0:6:,',
+ children = {
+ {
+ 'Colon:0:3::',
+ children = {
+ 'Register(name=a):0:1:@a',
+ 'Register(name=b):0:4:@b',
+ },
+ },
+ {
+ 'Comma:0:12:,',
+ children = {
+ {
+ 'Colon:0:9::',
+ children = {
+ 'Register(name=c):0:7:@c',
+ 'Register(name=d):0:10:@d',
+ },
+ },
+ {
+ 'Comma:0:18:,',
+ children = {
+ {
+ 'Colon:0:15::',
+ children = {
+ 'Register(name=e):0:13:@e',
+ 'Register(name=f):0:16:@f',
+ },
+ },
+ {
+ 'Colon:0:21::',
+ children = {
+ 'Register(name=g):0:19:@g',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '}',
+ msg = 'E15: Expected value, got closing figure brace: %.*s',
+ },
+ }, {
+ hl('Dict', '{'),
+ hl('Register', '@a'),
+ hl('Colon', ':'),
+ hl('Register', '@b'),
+ hl('Comma', ','),
+ hl('Register', '@c'),
+ hl('Colon', ':'),
+ hl('Register', '@d'),
+ hl('Comma', ','),
+ hl('Register', '@e'),
+ hl('Colon', ':'),
+ hl('Register', '@f'),
+ hl('Comma', ','),
+ hl('Register', '@g'),
+ hl('Colon', ':'),
+ hl('InvalidDict', '}'),
+ })
+ check_parsing('{@a:@b,}', {
+ -- 01234567890123
+ -- 0 1
+ ast = {
+ {
+ fmtn('DictLiteral', '-di', ':0:0:{'),
+ children = {
+ {
+ 'Comma:0:6:,',
+ children = {
+ {
+ 'Colon:0:3::',
+ children = {
+ 'Register(name=a):0:1:@a',
+ 'Register(name=b):0:4:@b',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Dict', '{'),
+ hl('Register', '@a'),
+ hl('Colon', ':'),
+ hl('Register', '@b'),
+ hl('Comma', ','),
+ hl('Dict', '}'),
+ })
+ check_parsing('{({f -> g})(@h)(@i)}', {
+ -- 01234567890123456789
+ -- 0 1
+ ast = {
+ {
+ fmtn('CurlyBracesIdentifier', '-di', ':0:0:{'),
+ children = {
+ {
+ 'Call:0:15:(',
+ children = {
+ {
+ 'Call:0:11:(',
+ children = {
+ {
+ 'Nested:0:1:(',
+ children = {
+ {
+ fmtn('Lambda', '\\di', ':0:2:{'),
+ children = {
+ 'PlainIdentifier(scope=0,ident=f):0:3:f',
+ {
+ 'Arrow:0:4: ->',
+ children = {
+ 'PlainIdentifier(scope=0,ident=g):0:7: g',
+ },
+ },
+ },
+ },
+ },
+ },
+ 'Register(name=h):0:12:@h',
+ },
+ },
+ 'Register(name=i):0:16:@i',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Curly', '{'),
+ hl('NestingParenthesis', '('),
+ hl('Lambda', '{'),
+ hl('IdentifierName', 'f'),
+ hl('Arrow', '->', 1),
+ hl('IdentifierName', 'g', 1),
+ hl('Lambda', '}'),
+ hl('NestingParenthesis', ')'),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@h'),
+ hl('CallingParenthesis', ')'),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@i'),
+ hl('CallingParenthesis', ')'),
+ hl('Curly', '}'),
+ })
+ check_parsing('a:{b()}c', {
+ -- 01234567
+ ast = {
+ {
+ 'ComplexIdentifier:0:2:',
+ children = {
+ 'PlainIdentifier(scope=a,ident=):0:0:a:',
+ {
+ 'ComplexIdentifier:0:7:',
+ children = {
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:2:{'),
+ children = {
+ {
+ 'Call:0:4:(',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:3:b',
+ },
+ },
+ },
+ },
+ 'PlainIdentifier(scope=0,ident=c):0:7:c',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('IdentifierScope', 'a'),
+ hl('IdentifierScopeDelimiter', ':'),
+ hl('Curly', '{'),
+ hl('IdentifierName', 'b'),
+ hl('CallingParenthesis', '('),
+ hl('CallingParenthesis', ')'),
+ hl('Curly', '}'),
+ hl('IdentifierName', 'c'),
+ })
+ check_parsing('a:{{b, c -> @d + @e + ({f -> g})(@h)}(@i)}j', {
+ -- 01234567890123456789012345678901234567890123456
+ -- 0 1 2 3 4
+ ast = {
+ {
+ 'ComplexIdentifier:0:2:',
+ children = {
+ 'PlainIdentifier(scope=a,ident=):0:0:a:',
+ {
+ 'ComplexIdentifier:0:42:',
+ children = {
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:2:{'),
+ children = {
+ {
+ 'Call:0:37:(',
+ children = {
+ {
+ fmtn('Lambda', '\\di', ':0:3:{'),
+ children = {
+ {
+ 'Comma:0:5:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:4:b',
+ 'PlainIdentifier(scope=0,ident=c):0:6: c',
+ },
+ },
+ {
+ 'Arrow:0:8: ->',
+ children = {
+ {
+ 'BinaryPlus:0:19: +',
+ children = {
+ {
+ 'BinaryPlus:0:14: +',
+ children = {
+ 'Register(name=d):0:11: @d',
+ 'Register(name=e):0:16: @e',
+ },
+ },
+ {
+ 'Call:0:32:(',
+ children = {
+ {
+ 'Nested:0:21: (',
+ children = {
+ {
+ fmtn('Lambda', '\\di', ':0:23:{'),
+ children = {
+ 'PlainIdentifier(scope=0,ident=f):0:24:f',
+ {
+ 'Arrow:0:25: ->',
+ children = {
+ 'PlainIdentifier(scope=0,ident=g):0:28: g',
+ },
+ },
+ },
+ },
+ },
+ },
+ 'Register(name=h):0:33:@h',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ 'Register(name=i):0:38:@i',
+ },
+ },
+ },
+ },
+ 'PlainIdentifier(scope=0,ident=j):0:42:j',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('IdentifierScope', 'a'),
+ hl('IdentifierScopeDelimiter', ':'),
+ hl('Curly', '{'),
+ hl('Lambda', '{'),
+ hl('IdentifierName', 'b'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'c', 1),
+ hl('Arrow', '->', 1),
+ hl('Register', '@d', 1),
+ hl('BinaryPlus', '+', 1),
+ hl('Register', '@e', 1),
+ hl('BinaryPlus', '+', 1),
+ hl('NestingParenthesis', '(', 1),
+ hl('Lambda', '{'),
+ hl('IdentifierName', 'f'),
+ hl('Arrow', '->', 1),
+ hl('IdentifierName', 'g', 1),
+ hl('Lambda', '}'),
+ hl('NestingParenthesis', ')'),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@h'),
+ hl('CallingParenthesis', ')'),
+ hl('Lambda', '}'),
+ hl('CallingParenthesis', '('),
+ hl('Register', '@i'),
+ hl('CallingParenthesis', ')'),
+ hl('Curly', '}'),
+ hl('IdentifierName', 'j'),
+ })
+ check_parsing('{@a + @b : @c + @d, @e + @f : @g + @i}', {
+ -- 01234567890123456789012345678901234567
+ -- 0 1 2 3
+ ast = {
+ {
+ fmtn('DictLiteral', '-di', ':0:0:{'),
+ children = {
+ {
+ 'Comma:0:18:,',
+ children = {
+ {
+ 'Colon:0:8: :',
+ children = {
+ {
+ 'BinaryPlus:0:3: +',
+ children = {
+ 'Register(name=a):0:1:@a',
+ 'Register(name=b):0:5: @b',
+ },
+ },
+ {
+ 'BinaryPlus:0:13: +',
+ children = {
+ 'Register(name=c):0:10: @c',
+ 'Register(name=d):0:15: @d',
+ },
+ },
+ },
+ },
+ {
+ 'Colon:0:27: :',
+ children = {
+ {
+ 'BinaryPlus:0:22: +',
+ children = {
+ 'Register(name=e):0:19: @e',
+ 'Register(name=f):0:24: @f',
+ },
+ },
+ {
+ 'BinaryPlus:0:32: +',
+ children = {
+ 'Register(name=g):0:29: @g',
+ 'Register(name=i):0:34: @i',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Dict', '{'),
+ hl('Register', '@a'),
+ hl('BinaryPlus', '+', 1),
+ hl('Register', '@b', 1),
+ hl('Colon', ':', 1),
+ hl('Register', '@c', 1),
+ hl('BinaryPlus', '+', 1),
+ hl('Register', '@d', 1),
+ hl('Comma', ','),
+ hl('Register', '@e', 1),
+ hl('BinaryPlus', '+', 1),
+ hl('Register', '@f', 1),
+ hl('Colon', ':', 1),
+ hl('Register', '@g', 1),
+ hl('BinaryPlus', '+', 1),
+ hl('Register', '@i', 1),
+ hl('Dict', '}'),
+ })
+ check_parsing('-> -> ->', {
+ -- 01234567
+ ast = {
+ {
+ 'Arrow:0:0:->',
+ children = {
+ 'Missing:0:0:',
+ {
+ 'Arrow:0:2: ->',
+ children = {
+ 'Missing:0:2:',
+ {
+ 'Arrow:0:5: ->',
+ children = {
+ 'Missing:0:5:',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '-> -> ->',
+ msg = 'E15: Unexpected arrow: %.*s',
+ },
+ }, {
+ hl('InvalidArrow', '->'),
+ hl('InvalidArrow', '->', 1),
+ hl('InvalidArrow', '->', 1),
+ })
+ check_parsing('a -> b -> c -> d', {
+ -- 0123456789012345
+ -- 0 1
+ ast = {
+ {
+ 'Arrow:0:1: ->',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ 'Arrow:0:6: ->',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:4: b',
+ {
+ 'Arrow:0:11: ->',
+ children = {
+ 'PlainIdentifier(scope=0,ident=c):0:9: c',
+ 'PlainIdentifier(scope=0,ident=d):0:14: d',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '-> b -> c -> d',
+ msg = 'E15: Arrow outside of lambda: %.*s',
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('InvalidArrow', '->', 1),
+ hl('IdentifierName', 'b', 1),
+ hl('InvalidArrow', '->', 1),
+ hl('IdentifierName', 'c', 1),
+ hl('InvalidArrow', '->', 1),
+ hl('IdentifierName', 'd', 1),
+ })
+ check_parsing('{a -> b -> c}', {
+ -- 0123456789012
+ -- 0 1
+ ast = {
+ {
+ fmtn('Lambda', '\\di', ':0:0:{'),
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ {
+ 'Arrow:0:2: ->',
+ children = {
+ {
+ 'Arrow:0:7: ->',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:5: b',
+ 'PlainIdentifier(scope=0,ident=c):0:10: c',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '-> c}',
+ msg = 'E15: Arrow outside of lambda: %.*s',
+ },
+ }, {
+ hl('Lambda', '{'),
+ hl('IdentifierName', 'a'),
+ hl('Arrow', '->', 1),
+ hl('IdentifierName', 'b', 1),
+ hl('InvalidArrow', '->', 1),
+ hl('IdentifierName', 'c', 1),
+ hl('Lambda', '}'),
+ })
+ check_parsing('{a: -> b}', {
+ -- 012345678
+ ast = {
+ {
+ fmtn('CurlyBracesIdentifier', '-di', ':0:0:{'),
+ children = {
+ {
+ 'Arrow:0:3: ->',
+ children = {
+ 'PlainIdentifier(scope=a,ident=):0:1:a:',
+ 'PlainIdentifier(scope=0,ident=b):0:6: b',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '-> b}',
+ msg = 'E15: Arrow outside of lambda: %.*s',
+ },
+ }, {
+ hl('Curly', '{'),
+ hl('IdentifierScope', 'a'),
+ hl('IdentifierScopeDelimiter', ':'),
+ hl('InvalidArrow', '->', 1),
+ hl('IdentifierName', 'b', 1),
+ hl('Curly', '}'),
+ })
+
+ check_parsing('{a:b -> b}', {
+ -- 0123456789
+ ast = {
+ {
+ fmtn('CurlyBracesIdentifier', '-di', ':0:0:{'),
+ children = {
+ {
+ 'Arrow:0:4: ->',
+ children = {
+ 'PlainIdentifier(scope=a,ident=b):0:1:a:b',
+ 'PlainIdentifier(scope=0,ident=b):0:7: b',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '-> b}',
+ msg = 'E15: Arrow outside of lambda: %.*s',
+ },
+ }, {
+ hl('Curly', '{'),
+ hl('IdentifierScope', 'a'),
+ hl('IdentifierScopeDelimiter', ':'),
+ hl('IdentifierName', 'b'),
+ hl('InvalidArrow', '->', 1),
+ hl('IdentifierName', 'b', 1),
+ hl('Curly', '}'),
+ })
+
+ check_parsing('{a#b -> b}', {
+ -- 0123456789
+ ast = {
+ {
+ fmtn('CurlyBracesIdentifier', '-di', ':0:0:{'),
+ children = {
+ {
+ 'Arrow:0:4: ->',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a#b):0:1:a#b',
+ 'PlainIdentifier(scope=0,ident=b):0:7: b',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '-> b}',
+ msg = 'E15: Arrow outside of lambda: %.*s',
+ },
+ }, {
+ hl('Curly', '{'),
+ hl('IdentifierName', 'a#b'),
+ hl('InvalidArrow', '->', 1),
+ hl('IdentifierName', 'b', 1),
+ hl('Curly', '}'),
+ })
+ check_parsing('{a : b : c}', {
+ -- 01234567890
+ -- 0 1
+ ast = {
+ {
+ fmtn('DictLiteral', '-di', ':0:0:{'),
+ children = {
+ {
+ 'Colon:0:2: :',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ {
+ 'Colon:0:6: :',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:4: b',
+ 'PlainIdentifier(scope=0,ident=c):0:8: c',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = ': c}',
+ msg = 'E15: Colon outside of dictionary or ternary operator: %.*s',
+ },
+ }, {
+ hl('Dict', '{'),
+ hl('IdentifierName', 'a'),
+ hl('Colon', ':', 1),
+ hl('IdentifierName', 'b', 1),
+ hl('InvalidColon', ':', 1),
+ hl('IdentifierName', 'c', 1),
+ hl('Dict', '}'),
+ })
+ check_parsing('{', {
+ -- 0
+ ast = {
+ fmtn('UnknownFigure', '\\di', ':0:0:{'),
+ },
+ err = {
+ arg = '{',
+ msg = 'E15: Missing closing figure brace: %.*s',
+ },
+ }, {
+ hl('FigureBrace', '{'),
+ })
+ check_parsing('{a', {
+ -- 01
+ ast = {
+ {
+ fmtn('UnknownFigure', '\\di', ':0:0:{'),
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ },
+ },
+ },
+ err = {
+ arg = '{a',
+ msg = 'E15: Missing closing figure brace: %.*s',
+ },
+ }, {
+ hl('FigureBrace', '{'),
+ hl('IdentifierName', 'a'),
+ })
+ check_parsing('{a,b', {
+ -- 0123
+ ast = {
+ {
+ fmtn('Lambda', '\\di', ':0:0:{'),
+ children = {
+ {
+ 'Comma:0:2:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ 'PlainIdentifier(scope=0,ident=b):0:3:b',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '{a,b',
+ msg = 'E15: Missing closing figure brace for lambda: %.*s',
+ },
+ }, {
+ hl('Lambda', '{'),
+ hl('IdentifierName', 'a'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'b'),
+ })
+ check_parsing('{a,b->', {
+ -- 012345
+ ast = {
+ {
+ fmtn('Lambda', '\\di', ':0:0:{'),
+ children = {
+ {
+ 'Comma:0:2:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ 'PlainIdentifier(scope=0,ident=b):0:3:b',
+ },
+ },
+ 'Arrow:0:4:->',
+ },
+ },
+ },
+ err = {
+ arg = '',
+ msg = 'E15: Expected value, got EOC: %.*s',
+ },
+ }, {
+ hl('Lambda', '{'),
+ hl('IdentifierName', 'a'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'b'),
+ hl('Arrow', '->'),
+ })
+ check_parsing('{a,b->c', {
+ -- 0123456
+ ast = {
+ {
+ fmtn('Lambda', '\\di', ':0:0:{'),
+ children = {
+ {
+ 'Comma:0:2:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ 'PlainIdentifier(scope=0,ident=b):0:3:b',
+ },
+ },
+ {
+ 'Arrow:0:4:->',
+ children = {
+ 'PlainIdentifier(scope=0,ident=c):0:6:c',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '{a,b->c',
+ msg = 'E15: Missing closing figure brace for lambda: %.*s',
+ },
+ }, {
+ hl('Lambda', '{'),
+ hl('IdentifierName', 'a'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'b'),
+ hl('Arrow', '->'),
+ hl('IdentifierName', 'c'),
+ })
+ check_parsing('{a : b', {
+ -- 012345
+ ast = {
+ {
+ fmtn('DictLiteral', '-di', ':0:0:{'),
+ children = {
+ {
+ 'Colon:0:2: :',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ 'PlainIdentifier(scope=0,ident=b):0:4: b',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '{a : b',
+ msg = 'E723: Missing end of Dictionary \'}\': %.*s',
+ },
+ }, {
+ hl('Dict', '{'),
+ hl('IdentifierName', 'a'),
+ hl('Colon', ':', 1),
+ hl('IdentifierName', 'b', 1),
+ })
+ check_parsing('{a : b,', {
+ -- 0123456
+ ast = {
+ {
+ fmtn('DictLiteral', '-di', ':0:0:{'),
+ children = {
+ {
+ 'Comma:0:6:,',
+ children = {
+ {
+ 'Colon:0:2: :',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ 'PlainIdentifier(scope=0,ident=b):0:4: b',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '',
+ msg = 'E15: Expected value, got EOC: %.*s',
+ },
+ }, {
+ hl('Dict', '{'),
+ hl('IdentifierName', 'a'),
+ hl('Colon', ':', 1),
+ hl('IdentifierName', 'b', 1),
+ hl('Comma', ','),
+ })
+ end)
+ itp('works with ternary operator', function()
+ check_parsing('a ? b : c', {
+ -- 012345678
+ ast = {
+ {
+ 'Ternary:0:1: ?',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ 'TernaryValue:0:5: :',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:3: b',
+ 'PlainIdentifier(scope=0,ident=c):0:7: c',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Ternary', '?', 1),
+ hl('IdentifierName', 'b', 1),
+ hl('TernaryColon', ':', 1),
+ hl('IdentifierName', 'c', 1),
+ })
+ check_parsing('@a?@b?@c:@d:@e', {
+ -- 01234567890123
+ -- 0 1
+ ast = {
+ {
+ 'Ternary:0:2:?',
+ children = {
+ 'Register(name=a):0:0:@a',
+ {
+ 'TernaryValue:0:11::',
+ children = {
+ {
+ 'Ternary:0:5:?',
+ children = {
+ 'Register(name=b):0:3:@b',
+ {
+ 'TernaryValue:0:8::',
+ children = {
+ 'Register(name=c):0:6:@c',
+ 'Register(name=d):0:9:@d',
+ },
+ },
+ },
+ },
+ 'Register(name=e):0:12:@e',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('Ternary', '?'),
+ hl('Register', '@b'),
+ hl('Ternary', '?'),
+ hl('Register', '@c'),
+ hl('TernaryColon', ':'),
+ hl('Register', '@d'),
+ hl('TernaryColon', ':'),
+ hl('Register', '@e'),
+ })
+ check_parsing('@a?@b:@c?@d:@e', {
+ -- 01234567890123
+ -- 0 1
+ ast = {
+ {
+ 'Ternary:0:2:?',
+ children = {
+ 'Register(name=a):0:0:@a',
+ {
+ 'TernaryValue:0:5::',
+ children = {
+ 'Register(name=b):0:3:@b',
+ {
+ 'Ternary:0:8:?',
+ children = {
+ 'Register(name=c):0:6:@c',
+ {
+ 'TernaryValue:0:11::',
+ children = {
+ 'Register(name=d):0:9:@d',
+ 'Register(name=e):0:12:@e',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('Ternary', '?'),
+ hl('Register', '@b'),
+ hl('TernaryColon', ':'),
+ hl('Register', '@c'),
+ hl('Ternary', '?'),
+ hl('Register', '@d'),
+ hl('TernaryColon', ':'),
+ hl('Register', '@e'),
+ })
+ check_parsing('@a?@b?@c?@d:@e?@f:@g:@h?@i:@j:@k', {
+ -- 01234567890123456789012345678901
+ -- 0 1 2 3
+ ast = {
+ {
+ 'Ternary:0:2:?',
+ children = {
+ 'Register(name=a):0:0:@a',
+ {
+ 'TernaryValue:0:29::',
+ children = {
+ {
+ 'Ternary:0:5:?',
+ children = {
+ 'Register(name=b):0:3:@b',
+ {
+ 'TernaryValue:0:20::',
+ children = {
+ {
+ 'Ternary:0:8:?',
+ children = {
+ 'Register(name=c):0:6:@c',
+ {
+ 'TernaryValue:0:11::',
+ children = {
+ 'Register(name=d):0:9:@d',
+ {
+ 'Ternary:0:14:?',
+ children = {
+ 'Register(name=e):0:12:@e',
+ {
+ 'TernaryValue:0:17::',
+ children = {
+ 'Register(name=f):0:15:@f',
+ 'Register(name=g):0:18:@g',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ 'Ternary:0:23:?',
+ children = {
+ 'Register(name=h):0:21:@h',
+ {
+ 'TernaryValue:0:26::',
+ children = {
+ 'Register(name=i):0:24:@i',
+ 'Register(name=j):0:27:@j',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ 'Register(name=k):0:30:@k',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('Ternary', '?'),
+ hl('Register', '@b'),
+ hl('Ternary', '?'),
+ hl('Register', '@c'),
+ hl('Ternary', '?'),
+ hl('Register', '@d'),
+ hl('TernaryColon', ':'),
+ hl('Register', '@e'),
+ hl('Ternary', '?'),
+ hl('Register', '@f'),
+ hl('TernaryColon', ':'),
+ hl('Register', '@g'),
+ hl('TernaryColon', ':'),
+ hl('Register', '@h'),
+ hl('Ternary', '?'),
+ hl('Register', '@i'),
+ hl('TernaryColon', ':'),
+ hl('Register', '@j'),
+ hl('TernaryColon', ':'),
+ hl('Register', '@k'),
+ })
+ check_parsing('?', {
+ -- 0
+ ast = {
+ {
+ 'Ternary:0:0:?',
+ children = {
+ 'Missing:0:0:',
+ 'TernaryValue:0:0:?',
+ },
+ },
+ },
+ err = {
+ arg = '?',
+ msg = 'E15: Expected value, got question mark: %.*s',
+ },
+ }, {
+ hl('InvalidTernary', '?'),
+ })
+
+ check_parsing('?:', {
+ -- 01
+ ast = {
+ {
+ 'Ternary:0:0:?',
+ children = {
+ 'Missing:0:0:',
+ {
+ 'TernaryValue:0:1::',
+ children = {
+ 'Missing:0:1:',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '?:',
+ msg = 'E15: Expected value, got question mark: %.*s',
+ },
+ }, {
+ hl('InvalidTernary', '?'),
+ hl('InvalidTernaryColon', ':'),
+ })
+
+ check_parsing('?::', {
+ -- 012
+ ast = {
+ {
+ 'Colon:0:2::',
+ children = {
+ {
+ 'Ternary:0:0:?',
+ children = {
+ 'Missing:0:0:',
+ {
+ 'TernaryValue:0:1::',
+ children = {
+ 'Missing:0:1:',
+ 'Missing:0:2:',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '?::',
+ msg = 'E15: Expected value, got question mark: %.*s',
+ },
+ }, {
+ hl('InvalidTernary', '?'),
+ hl('InvalidTernaryColon', ':'),
+ hl('InvalidColon', ':'),
+ })
+
+ check_parsing('a?b', {
+ -- 012
+ ast = {
+ {
+ 'Ternary:0:1:?',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ 'TernaryValue:0:1:?',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:2:b',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '?b',
+ msg = 'E109: Missing \':\' after \'?\': %.*s',
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Ternary', '?'),
+ hl('IdentifierName', 'b'),
+ })
+ check_parsing('a?b:', {
+ -- 0123
+ ast = {
+ {
+ 'Ternary:0:1:?',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ 'TernaryValue:0:1:?',
+ children = {
+ 'PlainIdentifier(scope=b,ident=):0:2:b:',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '?b:',
+ msg = 'E109: Missing \':\' after \'?\': %.*s',
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Ternary', '?'),
+ hl('IdentifierScope', 'b'),
+ hl('IdentifierScopeDelimiter', ':'),
+ })
+
+ check_parsing('a?b::c', {
+ -- 012345
+ ast = {
+ {
+ 'Ternary:0:1:?',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ 'TernaryValue:0:4::',
+ children = {
+ 'PlainIdentifier(scope=b,ident=):0:2:b:',
+ 'PlainIdentifier(scope=0,ident=c):0:5:c',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Ternary', '?'),
+ hl('IdentifierScope', 'b'),
+ hl('IdentifierScopeDelimiter', ':'),
+ hl('TernaryColon', ':'),
+ hl('IdentifierName', 'c'),
+ })
+
+ check_parsing('a?b :', {
+ -- 01234
+ ast = {
+ {
+ 'Ternary:0:1:?',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ 'TernaryValue:0:3: :',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:2:b',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '',
+ msg = 'E15: Expected value, got EOC: %.*s',
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Ternary', '?'),
+ hl('IdentifierName', 'b'),
+ hl('TernaryColon', ':', 1),
+ })
+
+ check_parsing('(@a?@b:@c)?@d:@e', {
+ -- 0123456789012345
+ -- 0 1
+ ast = {
+ {
+ 'Ternary:0:10:?',
+ children = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ {
+ 'Ternary:0:3:?',
+ children = {
+ 'Register(name=a):0:1:@a',
+ {
+ 'TernaryValue:0:6::',
+ children = {
+ 'Register(name=b):0:4:@b',
+ 'Register(name=c):0:7:@c',
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ 'TernaryValue:0:13::',
+ children = {
+ 'Register(name=d):0:11:@d',
+ 'Register(name=e):0:14:@e',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('Register', '@a'),
+ hl('Ternary', '?'),
+ hl('Register', '@b'),
+ hl('TernaryColon', ':'),
+ hl('Register', '@c'),
+ hl('NestingParenthesis', ')'),
+ hl('Ternary', '?'),
+ hl('Register', '@d'),
+ hl('TernaryColon', ':'),
+ hl('Register', '@e'),
+ })
+
+ check_parsing('(@a?@b:@c)?(@d?@e:@f):(@g?@h:@i)', {
+ -- 01234567890123456789012345678901
+ -- 0 1 2 3
+ ast = {
+ {
+ 'Ternary:0:10:?',
+ children = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ {
+ 'Ternary:0:3:?',
+ children = {
+ 'Register(name=a):0:1:@a',
+ {
+ 'TernaryValue:0:6::',
+ children = {
+ 'Register(name=b):0:4:@b',
+ 'Register(name=c):0:7:@c',
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ 'TernaryValue:0:21::',
+ children = {
+ {
+ 'Nested:0:11:(',
+ children = {
+ {
+ 'Ternary:0:14:?',
+ children = {
+ 'Register(name=d):0:12:@d',
+ {
+ 'TernaryValue:0:17::',
+ children = {
+ 'Register(name=e):0:15:@e',
+ 'Register(name=f):0:18:@f',
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ 'Nested:0:22:(',
+ children = {
+ {
+ 'Ternary:0:25:?',
+ children = {
+ 'Register(name=g):0:23:@g',
+ {
+ 'TernaryValue:0:28::',
+ children = {
+ 'Register(name=h):0:26:@h',
+ 'Register(name=i):0:29:@i',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('Register', '@a'),
+ hl('Ternary', '?'),
+ hl('Register', '@b'),
+ hl('TernaryColon', ':'),
+ hl('Register', '@c'),
+ hl('NestingParenthesis', ')'),
+ hl('Ternary', '?'),
+ hl('NestingParenthesis', '('),
+ hl('Register', '@d'),
+ hl('Ternary', '?'),
+ hl('Register', '@e'),
+ hl('TernaryColon', ':'),
+ hl('Register', '@f'),
+ hl('NestingParenthesis', ')'),
+ hl('TernaryColon', ':'),
+ hl('NestingParenthesis', '('),
+ hl('Register', '@g'),
+ hl('Ternary', '?'),
+ hl('Register', '@h'),
+ hl('TernaryColon', ':'),
+ hl('Register', '@i'),
+ hl('NestingParenthesis', ')'),
+ })
+
+ check_parsing('(@a?@b:@c)?@d?@e:@f:@g?@h:@i', {
+ -- 0123456789012345678901234567
+ -- 0 1 2
+ ast = {
+ {
+ 'Ternary:0:10:?',
+ children = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ {
+ 'Ternary:0:3:?',
+ children = {
+ 'Register(name=a):0:1:@a',
+ {
+ 'TernaryValue:0:6::',
+ children = {
+ 'Register(name=b):0:4:@b',
+ 'Register(name=c):0:7:@c',
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ 'TernaryValue:0:19::',
+ children = {
+ {
+ 'Ternary:0:13:?',
+ children = {
+ 'Register(name=d):0:11:@d',
+ {
+ 'TernaryValue:0:16::',
+ children = {
+ 'Register(name=e):0:14:@e',
+ 'Register(name=f):0:17:@f',
+ },
+ },
+ },
+ },
+ {
+ 'Ternary:0:22:?',
+ children = {
+ 'Register(name=g):0:20:@g',
+ {
+ 'TernaryValue:0:25::',
+ children = {
+ 'Register(name=h):0:23:@h',
+ 'Register(name=i):0:26:@i',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('Register', '@a'),
+ hl('Ternary', '?'),
+ hl('Register', '@b'),
+ hl('TernaryColon', ':'),
+ hl('Register', '@c'),
+ hl('NestingParenthesis', ')'),
+ hl('Ternary', '?'),
+ hl('Register', '@d'),
+ hl('Ternary', '?'),
+ hl('Register', '@e'),
+ hl('TernaryColon', ':'),
+ hl('Register', '@f'),
+ hl('TernaryColon', ':'),
+ hl('Register', '@g'),
+ hl('Ternary', '?'),
+ hl('Register', '@h'),
+ hl('TernaryColon', ':'),
+ hl('Register', '@i'),
+ })
+ check_parsing('a?b{cdef}g:h', {
+ -- 012345678901
+ -- 0 1
+ ast = {
+ {
+ 'Ternary:0:1:?',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ 'TernaryValue:0:10::',
+ children = {
+ {
+ 'ComplexIdentifier:0:3:',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:2:b',
+ {
+ 'ComplexIdentifier:0:9:',
+ children = {
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:3:{'),
+ children = {
+ 'PlainIdentifier(scope=0,ident=cdef):0:4:cdef',
+ },
+ },
+ 'PlainIdentifier(scope=0,ident=g):0:9:g',
+ },
+ },
+ },
+ },
+ 'PlainIdentifier(scope=0,ident=h):0:11:h',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Ternary', '?'),
+ hl('IdentifierName', 'b'),
+ hl('Curly', '{'),
+ hl('IdentifierName', 'cdef'),
+ hl('Curly', '}'),
+ hl('IdentifierName', 'g'),
+ hl('TernaryColon', ':'),
+ hl('IdentifierName', 'h'),
+ })
+ check_parsing('a ? b : c : d', {
+ -- 0123456789012
+ -- 0 1
+ ast = {
+ {
+ 'Colon:0:9: :',
+ children = {
+ {
+ 'Ternary:0:1: ?',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ 'TernaryValue:0:5: :',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:3: b',
+ 'PlainIdentifier(scope=0,ident=c):0:7: c',
+ },
+ },
+ },
+ },
+ 'PlainIdentifier(scope=0,ident=d):0:11: d',
+ },
+ },
+ },
+ err = {
+ arg = ': d',
+ msg = 'E15: Colon outside of dictionary or ternary operator: %.*s',
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Ternary', '?', 1),
+ hl('IdentifierName', 'b', 1),
+ hl('TernaryColon', ':', 1),
+ hl('IdentifierName', 'c', 1),
+ hl('InvalidColon', ':', 1),
+ hl('IdentifierName', 'd', 1),
+ })
+ end)
+ itp('works with comparison operators', function()
+ check_parsing('a == b', {
+ -- 012345
+ ast = {
+ {
+ 'Comparison(type=Equal,inv=0,ccs=UseOption):0:1: ==',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=0,ident=b):0:4: b',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Comparison', '==', 1),
+ hl('IdentifierName', 'b', 1),
+ })
+
+ check_parsing('a ==? b', {
+ -- 0123456
+ ast = {
+ {
+ 'Comparison(type=Equal,inv=0,ccs=IgnoreCase):0:1: ==?',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=0,ident=b):0:5: b',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Comparison', '==', 1),
+ hl('ComparisonModifier', '?'),
+ hl('IdentifierName', 'b', 1),
+ })
+
+ check_parsing('a ==# b', {
+ -- 0123456
+ ast = {
+ {
+ 'Comparison(type=Equal,inv=0,ccs=MatchCase):0:1: ==#',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=0,ident=b):0:5: b',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Comparison', '==', 1),
+ hl('ComparisonModifier', '#'),
+ hl('IdentifierName', 'b', 1),
+ })
+
+ check_parsing('a !=# b', {
+ -- 0123456
+ ast = {
+ {
+ 'Comparison(type=Equal,inv=1,ccs=MatchCase):0:1: !=#',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=0,ident=b):0:5: b',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Comparison', '!=', 1),
+ hl('ComparisonModifier', '#'),
+ hl('IdentifierName', 'b', 1),
+ })
+
+ check_parsing('a <=# b', {
+ -- 0123456
+ ast = {
+ {
+ 'Comparison(type=Greater,inv=1,ccs=MatchCase):0:1: <=#',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=0,ident=b):0:5: b',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Comparison', '<=', 1),
+ hl('ComparisonModifier', '#'),
+ hl('IdentifierName', 'b', 1),
+ })
+
+ check_parsing('a >=# b', {
+ -- 0123456
+ ast = {
+ {
+ 'Comparison(type=GreaterOrEqual,inv=0,ccs=MatchCase):0:1: >=#',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=0,ident=b):0:5: b',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Comparison', '>=', 1),
+ hl('ComparisonModifier', '#'),
+ hl('IdentifierName', 'b', 1),
+ })
+
+ check_parsing('a ># b', {
+ -- 012345
+ ast = {
+ {
+ 'Comparison(type=Greater,inv=0,ccs=MatchCase):0:1: >#',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=0,ident=b):0:4: b',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Comparison', '>', 1),
+ hl('ComparisonModifier', '#'),
+ hl('IdentifierName', 'b', 1),
+ })
+
+ check_parsing('a <# b', {
+ -- 012345
+ ast = {
+ {
+ 'Comparison(type=GreaterOrEqual,inv=1,ccs=MatchCase):0:1: <#',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=0,ident=b):0:4: b',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Comparison', '<', 1),
+ hl('ComparisonModifier', '#'),
+ hl('IdentifierName', 'b', 1),
+ })
+
+ check_parsing('a is#b', {
+ -- 012345
+ ast = {
+ {
+ 'Comparison(type=Identical,inv=0,ccs=MatchCase):0:1: is#',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=0,ident=b):0:5:b',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Comparison', 'is', 1),
+ hl('ComparisonModifier', '#'),
+ hl('IdentifierName', 'b'),
+ })
+
+ check_parsing('a is?b', {
+ -- 012345
+ ast = {
+ {
+ 'Comparison(type=Identical,inv=0,ccs=IgnoreCase):0:1: is?',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=0,ident=b):0:5:b',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Comparison', 'is', 1),
+ hl('ComparisonModifier', '?'),
+ hl('IdentifierName', 'b'),
+ })
+
+ check_parsing('a isnot b', {
+ -- 012345678
+ ast = {
+ {
+ 'Comparison(type=Identical,inv=1,ccs=UseOption):0:1: isnot',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=0,ident=b):0:7: b',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Comparison', 'isnot', 1),
+ hl('IdentifierName', 'b', 1),
+ })
+
+ check_parsing('a < b < c', {
+ -- 012345678
+ ast = {
+ {
+ 'Comparison(type=GreaterOrEqual,inv=1,ccs=UseOption):0:1: <',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ 'Comparison(type=GreaterOrEqual,inv=1,ccs=UseOption):0:5: <',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:3: b',
+ 'PlainIdentifier(scope=0,ident=c):0:7: c',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = ' < c',
+ msg = 'E15: Operator is not associative: %.*s',
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Comparison', '<', 1),
+ hl('IdentifierName', 'b', 1),
+ hl('InvalidComparison', '<', 1),
+ hl('IdentifierName', 'c', 1),
+ })
+
+ check_parsing('a < b <# c', {
+ -- 012345678
+ ast = {
+ {
+ 'Comparison(type=GreaterOrEqual,inv=1,ccs=UseOption):0:1: <',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ 'Comparison(type=GreaterOrEqual,inv=1,ccs=MatchCase):0:5: <#',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:3: b',
+ 'PlainIdentifier(scope=0,ident=c):0:8: c',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = ' <# c',
+ msg = 'E15: Operator is not associative: %.*s',
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Comparison', '<', 1),
+ hl('IdentifierName', 'b', 1),
+ hl('InvalidComparison', '<', 1),
+ hl('InvalidComparisonModifier', '#'),
+ hl('IdentifierName', 'c', 1),
+ })
+
+ check_parsing('a += b', {
+ -- 012345
+ ast = {
+ {
+ 'Assignment(Add):0:1: +=',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=0,ident=b):0:4: b',
+ },
+ },
+ },
+ err = {
+ arg = '+= b',
+ msg = 'E15: Misplaced assignment: %.*s',
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('InvalidAssignmentWithAddition', '+=', 1),
+ hl('IdentifierName', 'b', 1),
+ })
+ check_parsing('a + b == c + d', {
+ -- 01234567890123
+ -- 0 1
+ ast = {
+ {
+ 'Comparison(type=Equal,inv=0,ccs=UseOption):0:5: ==',
+ children = {
+ {
+ 'BinaryPlus:0:1: +',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=0,ident=b):0:3: b',
+ },
+ },
+ {
+ 'BinaryPlus:0:10: +',
+ children = {
+ 'PlainIdentifier(scope=0,ident=c):0:8: c',
+ 'PlainIdentifier(scope=0,ident=d):0:12: d',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('BinaryPlus', '+', 1),
+ hl('IdentifierName', 'b', 1),
+ hl('Comparison', '==', 1),
+ hl('IdentifierName', 'c', 1),
+ hl('BinaryPlus', '+', 1),
+ hl('IdentifierName', 'd', 1),
+ })
+ check_parsing('+ a == + b', {
+ -- 0123456789
+ ast = {
+ {
+ 'Comparison(type=Equal,inv=0,ccs=UseOption):0:3: ==',
+ children = {
+ {
+ 'UnaryPlus:0:0:+',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1: a',
+ },
+ },
+ {
+ 'UnaryPlus:0:6: +',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:8: b',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('UnaryPlus', '+'),
+ hl('IdentifierName', 'a', 1),
+ hl('Comparison', '==', 1),
+ hl('UnaryPlus', '+', 1),
+ hl('IdentifierName', 'b', 1),
+ })
+ end)
+ itp('works with concat/subscript', function()
+ check_parsing('.', {
+ -- 0
+ ast = {
+ {
+ 'ConcatOrSubscript:0:0:.',
+ children = {
+ 'Missing:0:0:',
+ },
+ },
+ },
+ err = {
+ arg = '.',
+ msg = 'E15: Unexpected dot: %.*s',
+ },
+ }, {
+ hl('InvalidConcatOrSubscript', '.'),
+ })
+
+ check_parsing('a.', {
+ -- 01
+ ast = {
+ {
+ 'ConcatOrSubscript:0:1:.',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ },
+ },
+ },
+ err = {
+ arg = '',
+ msg = 'E15: Expected value, got EOC: %.*s',
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('ConcatOrSubscript', '.'),
+ })
+
+ check_parsing('a.b', {
+ -- 012
+ ast = {
+ {
+ 'ConcatOrSubscript:0:1:.',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainKey(key=b):0:2:b',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('ConcatOrSubscript', '.'),
+ hl('IdentifierKey', 'b'),
+ })
+
+ check_parsing('1.2', {
+ -- 012
+ ast = {
+ 'Float(val=1.200000e+00):0:0:1.2',
+ },
+ }, {
+ hl('Float', '1.2'),
+ })
+
+ check_parsing('1.2 + 1.3e-5', {
+ -- 012345678901
+ -- 0 1
+ ast = {
+ {
+ 'BinaryPlus:0:3: +',
+ children = {
+ 'Float(val=1.200000e+00):0:0:1.2',
+ 'Float(val=1.300000e-05):0:5: 1.3e-5',
+ },
+ },
+ },
+ }, {
+ hl('Float', '1.2'),
+ hl('BinaryPlus', '+', 1),
+ hl('Float', '1.3e-5', 1),
+ })
+
+ check_parsing('a . 1.2 + 1.3e-5', {
+ -- 0123456789012345
+ -- 0 1
+ ast = {
+ {
+ 'BinaryPlus:0:7: +',
+ children = {
+ {
+ 'Concat:0:1: .',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ 'ConcatOrSubscript:0:5:.',
+ children = {
+ 'Integer(val=1):0:3: 1',
+ 'PlainKey(key=2):0:6:2',
+ },
+ },
+ },
+ },
+ 'Float(val=1.300000e-05):0:9: 1.3e-5',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Concat', '.', 1),
+ hl('Number', '1', 1),
+ hl('ConcatOrSubscript', '.'),
+ hl('IdentifierKey', '2'),
+ hl('BinaryPlus', '+', 1),
+ hl('Float', '1.3e-5', 1),
+ })
+
+ check_parsing('1.3e-5 + 1.2 . a', {
+ -- 0123456789012345
+ -- 0 1
+ ast = {
+ {
+ 'Concat:0:12: .',
+ children = {
+ {
+ 'BinaryPlus:0:6: +',
+ children = {
+ 'Float(val=1.300000e-05):0:0:1.3e-5',
+ 'Float(val=1.200000e+00):0:8: 1.2',
+ },
+ },
+ 'PlainIdentifier(scope=0,ident=a):0:14: a',
+ },
+ },
+ },
+ }, {
+ hl('Float', '1.3e-5'),
+ hl('BinaryPlus', '+', 1),
+ hl('Float', '1.2', 1),
+ hl('Concat', '.', 1),
+ hl('IdentifierName', 'a', 1),
+ })
+
+ check_parsing('1.3e-5 + a . 1.2', {
+ -- 0123456789012345
+ -- 0 1
+ ast = {
+ {
+ 'Concat:0:10: .',
+ children = {
+ {
+ 'BinaryPlus:0:6: +',
+ children = {
+ 'Float(val=1.300000e-05):0:0:1.3e-5',
+ 'PlainIdentifier(scope=0,ident=a):0:8: a',
+ },
+ },
+ {
+ 'ConcatOrSubscript:0:14:.',
+ children = {
+ 'Integer(val=1):0:12: 1',
+ 'PlainKey(key=2):0:15:2',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Float', '1.3e-5'),
+ hl('BinaryPlus', '+', 1),
+ hl('IdentifierName', 'a', 1),
+ hl('Concat', '.', 1),
+ hl('Number', '1', 1),
+ hl('ConcatOrSubscript', '.'),
+ hl('IdentifierKey', '2'),
+ })
+
+ check_parsing('1.2.3', {
+ -- 01234
+ ast = {
+ {
+ 'ConcatOrSubscript:0:3:.',
+ children = {
+ {
+ 'ConcatOrSubscript:0:1:.',
+ children = {
+ 'Integer(val=1):0:0:1',
+ 'PlainKey(key=2):0:2:2',
+ },
+ },
+ 'PlainKey(key=3):0:4:3',
+ },
+ },
+ },
+ }, {
+ hl('Number', '1'),
+ hl('ConcatOrSubscript', '.'),
+ hl('IdentifierKey', '2'),
+ hl('ConcatOrSubscript', '.'),
+ hl('IdentifierKey', '3'),
+ })
+
+ check_parsing('a.1.2', {
+ -- 01234
+ ast = {
+ {
+ 'ConcatOrSubscript:0:3:.',
+ children = {
+ {
+ 'ConcatOrSubscript:0:1:.',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainKey(key=1):0:2:1',
+ },
+ },
+ 'PlainKey(key=2):0:4:2',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('ConcatOrSubscript', '.'),
+ hl('IdentifierKey', '1'),
+ hl('ConcatOrSubscript', '.'),
+ hl('IdentifierKey', '2'),
+ })
+
+ check_parsing('a . 1.2', {
+ -- 0123456
+ ast = {
+ {
+ 'Concat:0:1: .',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ 'ConcatOrSubscript:0:5:.',
+ children = {
+ 'Integer(val=1):0:3: 1',
+ 'PlainKey(key=2):0:6:2',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Concat', '.', 1),
+ hl('Number', '1', 1),
+ hl('ConcatOrSubscript', '.'),
+ hl('IdentifierKey', '2'),
+ })
+
+ check_parsing('+a . +b', {
+ -- 0123456
+ ast = {
+ {
+ 'Concat:0:2: .',
+ children = {
+ {
+ 'UnaryPlus:0:0:+',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ },
+ },
+ {
+ 'UnaryPlus:0:4: +',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:6:b',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('UnaryPlus', '+'),
+ hl('IdentifierName', 'a'),
+ hl('Concat', '.', 1),
+ hl('UnaryPlus', '+', 1),
+ hl('IdentifierName', 'b'),
+ })
+
+ check_parsing('a. b', {
+ -- 0123
+ ast = {
+ {
+ 'Concat:0:1:.',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=0,ident=b):0:2: b',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('ConcatOrSubscript', '.'),
+ hl('IdentifierName', 'b', 1),
+ })
+
+ check_parsing('a. 1', {
+ -- 0123
+ ast = {
+ {
+ 'Concat:0:1:.',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'Integer(val=1):0:2: 1',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('ConcatOrSubscript', '.'),
+ hl('Number', '1', 1),
+ })
+
+ check_parsing('a[1][2][3[4', {
+ -- 01234567890
+ -- 0 1
+ ast = {
+ {
+ 'Subscript:0:7:[',
+ children = {
+ {
+ 'Subscript:0:4:[',
+ children = {
+ {
+ 'Subscript:0:1:[',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'Integer(val=1):0:2:1',
+ },
+ },
+ 'Integer(val=2):0:5:2',
+ },
+ },
+ {
+ 'Subscript:0:9:[',
+ children = {
+ 'Integer(val=3):0:8:3',
+ 'Integer(val=4):0:10:4',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('SubscriptBracket', '['),
+ hl('Number', '1'),
+ hl('SubscriptBracket', ']'),
+ hl('SubscriptBracket', '['),
+ hl('Number', '2'),
+ hl('SubscriptBracket', ']'),
+ hl('SubscriptBracket', '['),
+ hl('Number', '3'),
+ hl('SubscriptBracket', '['),
+ hl('Number', '4'),
+ })
+ end)
+ itp('works with bracket subscripts', function()
+ check_parsing(':', {
+ -- 0
+ ast = {
+ {
+ 'Colon:0:0::',
+ children = {
+ 'Missing:0:0:',
+ },
+ },
+ },
+ err = {
+ arg = ':',
+ msg = 'E15: Colon outside of dictionary or ternary operator: %.*s',
+ },
+ }, {
+ hl('InvalidColon', ':'),
+ })
+ check_parsing('a[]', {
+ -- 012
+ ast = {
+ {
+ 'Subscript:0:1:[',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ },
+ },
+ },
+ err = {
+ arg = ']',
+ msg = 'E15: Expected value, got closing bracket: %.*s',
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('SubscriptBracket', '['),
+ hl('InvalidSubscriptBracket', ']'),
+ })
+ check_parsing('a[b:]', {
+ -- 01234
+ ast = {
+ {
+ 'Subscript:0:1:[',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=b,ident=):0:2:b:',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('SubscriptBracket', '['),
+ hl('IdentifierScope', 'b'),
+ hl('IdentifierScopeDelimiter', ':'),
+ hl('SubscriptBracket', ']'),
+ })
+
+ check_parsing('a[b:c]', {
+ -- 012345
+ ast = {
+ {
+ 'Subscript:0:1:[',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=b,ident=c):0:2:b:c',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('SubscriptBracket', '['),
+ hl('IdentifierScope', 'b'),
+ hl('IdentifierScopeDelimiter', ':'),
+ hl('IdentifierName', 'c'),
+ hl('SubscriptBracket', ']'),
+ })
+ check_parsing('a[b : c]', {
+ -- 01234567
+ ast = {
+ {
+ 'Subscript:0:1:[',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ 'Colon:0:3: :',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:2:b',
+ 'PlainIdentifier(scope=0,ident=c):0:5: c',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('SubscriptBracket', '['),
+ hl('IdentifierName', 'b'),
+ hl('SubscriptColon', ':', 1),
+ hl('IdentifierName', 'c', 1),
+ hl('SubscriptBracket', ']'),
+ })
+
+ check_parsing('a[: b]', {
+ -- 012345
+ ast = {
+ {
+ 'Subscript:0:1:[',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ 'Colon:0:2::',
+ children = {
+ 'Missing:0:2:',
+ 'PlainIdentifier(scope=0,ident=b):0:3: b',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('SubscriptBracket', '['),
+ hl('SubscriptColon', ':'),
+ hl('IdentifierName', 'b', 1),
+ hl('SubscriptBracket', ']'),
+ })
+
+ check_parsing('a[b :]', {
+ -- 012345
+ ast = {
+ {
+ 'Subscript:0:1:[',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ 'Colon:0:3: :',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:2:b',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('SubscriptBracket', '['),
+ hl('IdentifierName', 'b'),
+ hl('SubscriptColon', ':', 1),
+ hl('SubscriptBracket', ']'),
+ })
+ check_parsing('a[b][c][d](e)(f)(g)', {
+ -- 0123456789012345678
+ -- 0 1
+ ast = {
+ {
+ 'Call:0:16:(',
+ children = {
+ {
+ 'Call:0:13:(',
+ children = {
+ {
+ 'Call:0:10:(',
+ children = {
+ {
+ 'Subscript:0:7:[',
+ children = {
+ {
+ 'Subscript:0:4:[',
+ children = {
+ {
+ 'Subscript:0:1:[',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=0,ident=b):0:2:b',
+ },
+ },
+ 'PlainIdentifier(scope=0,ident=c):0:5:c',
+ },
+ },
+ 'PlainIdentifier(scope=0,ident=d):0:8:d',
+ },
+ },
+ 'PlainIdentifier(scope=0,ident=e):0:11:e',
+ },
+ },
+ 'PlainIdentifier(scope=0,ident=f):0:14:f',
+ },
+ },
+ 'PlainIdentifier(scope=0,ident=g):0:17:g',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('SubscriptBracket', '['),
+ hl('IdentifierName', 'b'),
+ hl('SubscriptBracket', ']'),
+ hl('SubscriptBracket', '['),
+ hl('IdentifierName', 'c'),
+ hl('SubscriptBracket', ']'),
+ hl('SubscriptBracket', '['),
+ hl('IdentifierName', 'd'),
+ hl('SubscriptBracket', ']'),
+ hl('CallingParenthesis', '('),
+ hl('IdentifierName', 'e'),
+ hl('CallingParenthesis', ')'),
+ hl('CallingParenthesis', '('),
+ hl('IdentifierName', 'f'),
+ hl('CallingParenthesis', ')'),
+ hl('CallingParenthesis', '('),
+ hl('IdentifierName', 'g'),
+ hl('CallingParenthesis', ')'),
+ })
+ check_parsing('{a}{b}{c}[d][e][f]', {
+ -- 012345678901234567
+ -- 0 1
+ ast = {
+ {
+ 'Subscript:0:15:[',
+ children = {
+ {
+ 'Subscript:0:12:[',
+ children = {
+ {
+ 'Subscript:0:9:[',
+ children = {
+ {
+ 'ComplexIdentifier:0:3:',
+ children = {
+ {
+ fmtn('CurlyBracesIdentifier', '-di', ':0:0:{'),
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ },
+ },
+ {
+ 'ComplexIdentifier:0:6:',
+ children = {
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:3:{'),
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:4:b',
+ },
+ },
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:6:{'),
+ children = {
+ 'PlainIdentifier(scope=0,ident=c):0:7:c',
+ },
+ },
+ },
+ },
+ },
+ },
+ 'PlainIdentifier(scope=0,ident=d):0:10:d',
+ },
+ },
+ 'PlainIdentifier(scope=0,ident=e):0:13:e',
+ },
+ },
+ 'PlainIdentifier(scope=0,ident=f):0:16:f',
+ },
+ },
+ },
+ }, {
+ hl('Curly', '{'),
+ hl('IdentifierName', 'a'),
+ hl('Curly', '}'),
+ hl('Curly', '{'),
+ hl('IdentifierName', 'b'),
+ hl('Curly', '}'),
+ hl('Curly', '{'),
+ hl('IdentifierName', 'c'),
+ hl('Curly', '}'),
+ hl('SubscriptBracket', '['),
+ hl('IdentifierName', 'd'),
+ hl('SubscriptBracket', ']'),
+ hl('SubscriptBracket', '['),
+ hl('IdentifierName', 'e'),
+ hl('SubscriptBracket', ']'),
+ hl('SubscriptBracket', '['),
+ hl('IdentifierName', 'f'),
+ hl('SubscriptBracket', ']'),
+ })
+ end)
+ itp('supports list literals', function()
+ check_parsing('[]', {
+ -- 01
+ ast = {
+ 'ListLiteral:0:0:[',
+ },
+ }, {
+ hl('List', '['),
+ hl('List', ']'),
+ })
+
+ check_parsing('[a]', {
+ -- 012
+ ast = {
+ {
+ 'ListLiteral:0:0:[',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ },
+ },
+ },
+ }, {
+ hl('List', '['),
+ hl('IdentifierName', 'a'),
+ hl('List', ']'),
+ })
+
+ check_parsing('[a, b]', {
+ -- 012345
+ ast = {
+ {
+ 'ListLiteral:0:0:[',
+ children = {
+ {
+ 'Comma:0:2:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ 'PlainIdentifier(scope=0,ident=b):0:3: b',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('List', '['),
+ hl('IdentifierName', 'a'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'b', 1),
+ hl('List', ']'),
+ })
+
+ check_parsing('[a, b, c]', {
+ -- 012345678
+ ast = {
+ {
+ 'ListLiteral:0:0:[',
+ children = {
+ {
+ 'Comma:0:2:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ {
+ 'Comma:0:5:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:3: b',
+ 'PlainIdentifier(scope=0,ident=c):0:6: c',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('List', '['),
+ hl('IdentifierName', 'a'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'b', 1),
+ hl('Comma', ','),
+ hl('IdentifierName', 'c', 1),
+ hl('List', ']'),
+ })
+
+ check_parsing('[a, b, c, ]', {
+ -- 01234567890
+ -- 0 1
+ ast = {
+ {
+ 'ListLiteral:0:0:[',
+ children = {
+ {
+ 'Comma:0:2:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ {
+ 'Comma:0:5:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:3: b',
+ {
+ 'Comma:0:8:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=c):0:6: c',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('List', '['),
+ hl('IdentifierName', 'a'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'b', 1),
+ hl('Comma', ','),
+ hl('IdentifierName', 'c', 1),
+ hl('Comma', ','),
+ hl('List', ']', 1),
+ })
+
+ check_parsing('[a : b, c : d]', {
+ -- 01234567890123
+ -- 0 1
+ ast = {
+ {
+ 'ListLiteral:0:0:[',
+ children = {
+ {
+ 'Comma:0:6:,',
+ children = {
+ {
+ 'Colon:0:2: :',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ 'PlainIdentifier(scope=0,ident=b):0:4: b',
+ },
+ },
+ {
+ 'Colon:0:9: :',
+ children = {
+ 'PlainIdentifier(scope=0,ident=c):0:7: c',
+ 'PlainIdentifier(scope=0,ident=d):0:11: d',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = ': b, c : d]',
+ msg = 'E15: Colon outside of dictionary or ternary operator: %.*s',
+ },
+ }, {
+ hl('List', '['),
+ hl('IdentifierName', 'a'),
+ hl('InvalidColon', ':', 1),
+ hl('IdentifierName', 'b', 1),
+ hl('Comma', ','),
+ hl('IdentifierName', 'c', 1),
+ hl('InvalidColon', ':', 1),
+ hl('IdentifierName', 'd', 1),
+ hl('List', ']'),
+ })
+
+ check_parsing(']', {
+ -- 0
+ ast = {
+ 'ListLiteral:0:0:',
+ },
+ err = {
+ arg = ']',
+ msg = 'E15: Unexpected closing figure brace: %.*s',
+ },
+ }, {
+ hl('InvalidList', ']'),
+ })
+
+ check_parsing('a]', {
+ -- 01
+ ast = {
+ {
+ 'ListLiteral:0:1:',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ },
+ },
+ },
+ err = {
+ arg = ']',
+ msg = 'E15: Unexpected closing figure brace: %.*s',
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('InvalidList', ']'),
+ })
+
+ check_parsing('[] []', {
+ -- 01234
+ ast = {
+ {
+ 'OpMissing:0:2:',
+ children = {
+ 'ListLiteral:0:0:[',
+ 'ListLiteral:0:2: [',
+ },
+ },
+ },
+ err = {
+ arg = '[]',
+ msg = 'E15: Missing operator: %.*s',
+ },
+ }, {
+ hl('List', '['),
+ hl('List', ']'),
+ hl('InvalidSpacing', ' '),
+ hl('List', '['),
+ hl('List', ']'),
+ }, {
+ [1] = {
+ ast = {
+ len = 3,
+ err = REMOVE_THIS,
+ ast = {
+ 'ListLiteral:0:0:[',
+ },
+ },
+ hl_fs = {
+ [3] = REMOVE_THIS,
+ [4] = REMOVE_THIS,
+ [5] = REMOVE_THIS,
+ },
+ },
+ })
+
+ check_parsing('[][]', {
+ -- 0123
+ ast = {
+ {
+ 'Subscript:0:2:[',
+ children = {
+ 'ListLiteral:0:0:[',
+ },
+ },
+ },
+ err = {
+ arg = ']',
+ msg = 'E15: Expected value, got closing bracket: %.*s',
+ },
+ }, {
+ hl('List', '['),
+ hl('List', ']'),
+ hl('SubscriptBracket', '['),
+ hl('InvalidSubscriptBracket', ']'),
+ })
+
+ check_parsing('[', {
+ -- 0
+ ast = {
+ 'ListLiteral:0:0:[',
+ },
+ err = {
+ arg = '',
+ msg = 'E15: Expected value, got EOC: %.*s',
+ },
+ }, {
+ hl('List', '['),
+ })
+
+ check_parsing('[1', {
+ -- 01
+ ast = {
+ {
+ 'ListLiteral:0:0:[',
+ children = {
+ 'Integer(val=1):0:1:1',
+ },
+ },
+ },
+ err = {
+ arg = '[1',
+ msg = 'E697: Missing end of List \']\': %.*s',
+ },
+ }, {
+ hl('List', '['),
+ hl('Number', '1'),
+ })
+ end)
+ itp('works with strings', function()
+ check_parsing('\'abc\'', {
+ -- 01234
+ ast = {
+ fmtn('SingleQuotedString', 'val="abc"', ':0:0:\'abc\''),
+ },
+ }, {
+ hl('SingleQuote', '\''),
+ hl('SingleQuotedBody', 'abc'),
+ hl('SingleQuote', '\''),
+ })
+ check_parsing('"abc"', {
+ -- 01234
+ ast = {
+ fmtn('DoubleQuotedString', 'val="abc"', ':0:0:"abc"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedBody', 'abc'),
+ hl('DoubleQuote', '"'),
+ })
+ check_parsing('\'\'', {
+ -- 01
+ ast = {
+ fmtn('SingleQuotedString', 'val=NULL', ':0:0:\'\''),
+ },
+ }, {
+ hl('SingleQuote', '\''),
+ hl('SingleQuote', '\''),
+ })
+ check_parsing('""', {
+ -- 01
+ ast = {
+ fmtn('DoubleQuotedString', 'val=NULL', ':0:0:""'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuote', '"'),
+ })
+ check_parsing('"', {
+ -- 0
+ ast = {
+ fmtn('DoubleQuotedString', 'val=NULL', ':0:0:"'),
+ },
+ err = {
+ arg = '"',
+ msg = 'E114: Missing double quote: %.*s',
+ },
+ }, {
+ hl('InvalidDoubleQuote', '"'),
+ })
+ check_parsing('\'', {
+ -- 0
+ ast = {
+ fmtn('SingleQuotedString', 'val=NULL', ':0:0:\''),
+ },
+ err = {
+ arg = '\'',
+ msg = 'E115: Missing single quote: %.*s',
+ },
+ }, {
+ hl('InvalidSingleQuote', '\''),
+ })
+ check_parsing('"a', {
+ -- 01
+ ast = {
+ fmtn('DoubleQuotedString', 'val="a"', ':0:0:"a'),
+ },
+ err = {
+ arg = '"a',
+ msg = 'E114: Missing double quote: %.*s',
+ },
+ }, {
+ hl('InvalidDoubleQuote', '"'),
+ hl('InvalidDoubleQuotedBody', 'a'),
+ })
+ check_parsing('\'a', {
+ -- 01
+ ast = {
+ fmtn('SingleQuotedString', 'val="a"', ':0:0:\'a'),
+ },
+ err = {
+ arg = '\'a',
+ msg = 'E115: Missing single quote: %.*s',
+ },
+ }, {
+ hl('InvalidSingleQuote', '\''),
+ hl('InvalidSingleQuotedBody', 'a'),
+ })
+ check_parsing('\'abc\'\'def\'', {
+ -- 0123456789
+ ast = {
+ fmtn('SingleQuotedString', 'val="abc\'def"', ':0:0:\'abc\'\'def\''),
+ },
+ }, {
+ hl('SingleQuote', '\''),
+ hl('SingleQuotedBody', 'abc'),
+ hl('SingleQuotedQuote', '\'\''),
+ hl('SingleQuotedBody', 'def'),
+ hl('SingleQuote', '\''),
+ })
+ check_parsing('\'abc\'\'', {
+ -- 012345
+ ast = {
+ fmtn('SingleQuotedString', 'val="abc\'"', ':0:0:\'abc\'\''),
+ },
+ err = {
+ arg = '\'abc\'\'',
+ msg = 'E115: Missing single quote: %.*s',
+ },
+ }, {
+ hl('InvalidSingleQuote', '\''),
+ hl('InvalidSingleQuotedBody', 'abc'),
+ hl('InvalidSingleQuotedQuote', '\'\''),
+ })
+ check_parsing('\'\'\'\'\'\'\'\'', {
+ -- 01234567
+ ast = {
+ fmtn('SingleQuotedString', 'val="\'\'\'"', ':0:0:\'\'\'\'\'\'\'\''),
+ },
+ }, {
+ hl('SingleQuote', '\''),
+ hl('SingleQuotedQuote', '\'\''),
+ hl('SingleQuotedQuote', '\'\''),
+ hl('SingleQuotedQuote', '\'\''),
+ hl('SingleQuote', '\''),
+ })
+ check_parsing('\'\'\'a\'\'\'\'bc\'', {
+ -- 01234567890
+ -- 0 1
+ ast = {
+ fmtn('SingleQuotedString', 'val="\'a\'\'bc"', ':0:0:\'\'\'a\'\'\'\'bc\''),
+ },
+ }, {
+ hl('SingleQuote', '\''),
+ hl('SingleQuotedQuote', '\'\''),
+ hl('SingleQuotedBody', 'a'),
+ hl('SingleQuotedQuote', '\'\''),
+ hl('SingleQuotedQuote', '\'\''),
+ hl('SingleQuotedBody', 'bc'),
+ hl('SingleQuote', '\''),
+ })
+ check_parsing('"\\"\\"\\"\\""', {
+ -- 0123456789
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\"\\"\\"\\""', ':0:0:"\\"\\"\\"\\""'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\"'),
+ hl('DoubleQuotedEscape', '\\"'),
+ hl('DoubleQuotedEscape', '\\"'),
+ hl('DoubleQuotedEscape', '\\"'),
+ hl('DoubleQuote', '"'),
+ })
+ check_parsing('"abc\\"def\\"ghi\\"jkl\\"mno"', {
+ -- 0123456789012345678901234
+ -- 0 1 2
+ ast = {
+ fmtn('DoubleQuotedString', 'val="abc\\"def\\"ghi\\"jkl\\"mno"', ':0:0:"abc\\"def\\"ghi\\"jkl\\"mno"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedBody', 'abc'),
+ hl('DoubleQuotedEscape', '\\"'),
+ hl('DoubleQuotedBody', 'def'),
+ hl('DoubleQuotedEscape', '\\"'),
+ hl('DoubleQuotedBody', 'ghi'),
+ hl('DoubleQuotedEscape', '\\"'),
+ hl('DoubleQuotedBody', 'jkl'),
+ hl('DoubleQuotedEscape', '\\"'),
+ hl('DoubleQuotedBody', 'mno'),
+ hl('DoubleQuote', '"'),
+ })
+ check_parsing('"\\b\\e\\f\\r\\t\\\\"', {
+ -- 0123456789012345
+ -- 0 1
+ ast = {
+ [[DoubleQuotedString(val="\008\027\012\r\t\\"):0:0:"\b\e\f\r\t\\"]],
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\b'),
+ hl('DoubleQuotedEscape', '\\e'),
+ hl('DoubleQuotedEscape', '\\f'),
+ hl('DoubleQuotedEscape', '\\r'),
+ hl('DoubleQuotedEscape', '\\t'),
+ hl('DoubleQuotedEscape', '\\\\'),
+ hl('DoubleQuote', '"'),
+ })
+ check_parsing('"\\n\n"', {
+ -- 01234
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\n\\n"', ':0:0:"\\n\n"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\n'),
+ hl('DoubleQuotedBody', '\n'),
+ hl('DoubleQuote', '"'),
+ })
+ check_parsing('"\\x00"', {
+ -- 012345
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\000"', ':0:0:"\\x00"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\x00'),
+ hl('DoubleQuote', '"'),
+ })
+ check_parsing('"\\xFF"', {
+ -- 012345
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\255"', ':0:0:"\\xFF"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\xFF'),
+ hl('DoubleQuote', '"'),
+ })
+ check_parsing('"\\xF"', {
+ -- 012345
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\015"', ':0:0:"\\xF"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\xF'),
+ hl('DoubleQuote', '"'),
+ })
+ check_parsing('"\\u00AB"', {
+ -- 01234567
+ ast = {
+ fmtn('DoubleQuotedString', 'val="ยซ"', ':0:0:"\\u00AB"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\u00AB'),
+ hl('DoubleQuote', '"'),
+ })
+ check_parsing('"\\U000000AB"', {
+ -- 01234567
+ ast = {
+ fmtn('DoubleQuotedString', 'val="ยซ"', ':0:0:"\\U000000AB"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\U000000AB'),
+ hl('DoubleQuote', '"'),
+ })
+ check_parsing('"\\x"', {
+ -- 0123
+ ast = {
+ fmtn('DoubleQuotedString', 'val="x"', ':0:0:"\\x"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedUnknownEscape', '\\x'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\x', {
+ -- 012
+ ast = {
+ fmtn('DoubleQuotedString', 'val="x"', ':0:0:"\\x'),
+ },
+ err = {
+ arg = '"\\x',
+ msg = 'E114: Missing double quote: %.*s',
+ },
+ }, {
+ hl('InvalidDoubleQuote', '"'),
+ hl('InvalidDoubleQuotedUnknownEscape', '\\x'),
+ })
+
+ check_parsing('"\\xF', {
+ -- 0123
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\015"', ':0:0:"\\xF'),
+ },
+ err = {
+ arg = '"\\xF',
+ msg = 'E114: Missing double quote: %.*s',
+ },
+ }, {
+ hl('InvalidDoubleQuote', '"'),
+ hl('InvalidDoubleQuotedEscape', '\\xF'),
+ })
+
+ check_parsing('"\\u"', {
+ -- 0123
+ ast = {
+ fmtn('DoubleQuotedString', 'val="u"', ':0:0:"\\u"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedUnknownEscape', '\\u'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\u', {
+ -- 012
+ ast = {
+ fmtn('DoubleQuotedString', 'val="u"', ':0:0:"\\u'),
+ },
+ err = {
+ arg = '"\\u',
+ msg = 'E114: Missing double quote: %.*s',
+ },
+ }, {
+ hl('InvalidDoubleQuote', '"'),
+ hl('InvalidDoubleQuotedUnknownEscape', '\\u'),
+ })
+
+ check_parsing('"\\U', {
+ -- 012
+ ast = {
+ fmtn('DoubleQuotedString', 'val="U"', ':0:0:"\\U'),
+ },
+ err = {
+ arg = '"\\U',
+ msg = 'E114: Missing double quote: %.*s',
+ },
+ }, {
+ hl('InvalidDoubleQuote', '"'),
+ hl('InvalidDoubleQuotedUnknownEscape', '\\U'),
+ })
+
+ check_parsing('"\\U"', {
+ -- 0123
+ ast = {
+ fmtn('DoubleQuotedString', 'val="U"', ':0:0:"\\U"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedUnknownEscape', '\\U'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\xFX"', {
+ -- 012345
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\015X"', ':0:0:"\\xFX"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\xF'),
+ hl('DoubleQuotedBody', 'X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\XFX"', {
+ -- 012345
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\015X"', ':0:0:"\\XFX"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\XF'),
+ hl('DoubleQuotedBody', 'X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\xX"', {
+ -- 01234
+ ast = {
+ fmtn('DoubleQuotedString', 'val="xX"', ':0:0:"\\xX"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedUnknownEscape', '\\x'),
+ hl('DoubleQuotedBody', 'X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\XX"', {
+ -- 01234
+ ast = {
+ fmtn('DoubleQuotedString', 'val="XX"', ':0:0:"\\XX"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedUnknownEscape', '\\X'),
+ hl('DoubleQuotedBody', 'X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\uX"', {
+ -- 01234
+ ast = {
+ fmtn('DoubleQuotedString', 'val="uX"', ':0:0:"\\uX"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedUnknownEscape', '\\u'),
+ hl('DoubleQuotedBody', 'X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\UX"', {
+ -- 01234
+ ast = {
+ fmtn('DoubleQuotedString', 'val="UX"', ':0:0:"\\UX"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedUnknownEscape', '\\U'),
+ hl('DoubleQuotedBody', 'X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\x0X"', {
+ -- 012345
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\000X"', ':0:0:"\\x0X"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\x0'),
+ hl('DoubleQuotedBody', 'X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\X0X"', {
+ -- 012345
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\000X"', ':0:0:"\\X0X"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\X0'),
+ hl('DoubleQuotedBody', 'X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\u0X"', {
+ -- 012345
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\000X"', ':0:0:"\\u0X"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\u0'),
+ hl('DoubleQuotedBody', 'X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\U0X"', {
+ -- 012345
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\000X"', ':0:0:"\\U0X"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\U0'),
+ hl('DoubleQuotedBody', 'X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\x00X"', {
+ -- 0123456
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\000X"', ':0:0:"\\x00X"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\x00'),
+ hl('DoubleQuotedBody', 'X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\X00X"', {
+ -- 0123456
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\000X"', ':0:0:"\\X00X"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\X00'),
+ hl('DoubleQuotedBody', 'X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\u00X"', {
+ -- 0123456
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\000X"', ':0:0:"\\u00X"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\u00'),
+ hl('DoubleQuotedBody', 'X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\U00X"', {
+ -- 0123456
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\000X"', ':0:0:"\\U00X"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\U00'),
+ hl('DoubleQuotedBody', 'X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\u000X"', {
+ -- 01234567
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\000X"', ':0:0:"\\u000X"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\u000'),
+ hl('DoubleQuotedBody', 'X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\U000X"', {
+ -- 01234567
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\000X"', ':0:0:"\\U000X"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\U000'),
+ hl('DoubleQuotedBody', 'X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\u0000X"', {
+ -- 012345678
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\000X"', ':0:0:"\\u0000X"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\u0000'),
+ hl('DoubleQuotedBody', 'X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\U0000X"', {
+ -- 012345678
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\000X"', ':0:0:"\\U0000X"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\U0000'),
+ hl('DoubleQuotedBody', 'X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\U00000X"', {
+ -- 0123456789
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\000X"', ':0:0:"\\U00000X"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\U00000'),
+ hl('DoubleQuotedBody', 'X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\U000000X"', {
+ -- 01234567890
+ -- 0 1
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\000X"', ':0:0:"\\U000000X"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\U000000'),
+ hl('DoubleQuotedBody', 'X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\U0000000X"', {
+ -- 012345678901
+ -- 0 1
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\000X"', ':0:0:"\\U0000000X"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\U0000000'),
+ hl('DoubleQuotedBody', 'X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\U00000000X"', {
+ -- 0123456789012
+ -- 0 1
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\000X"', ':0:0:"\\U00000000X"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\U00000000'),
+ hl('DoubleQuotedBody', 'X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\x000X"', {
+ -- 01234567
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\0000X"', ':0:0:"\\x000X"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\x00'),
+ hl('DoubleQuotedBody', '0X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\X000X"', {
+ -- 01234567
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\0000X"', ':0:0:"\\X000X"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\X00'),
+ hl('DoubleQuotedBody', '0X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\u00000X"', {
+ -- 0123456789
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\0000X"', ':0:0:"\\u00000X"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\u0000'),
+ hl('DoubleQuotedBody', '0X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\U000000000X"', {
+ -- 01234567890123
+ -- 0 1
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\0000X"', ':0:0:"\\U000000000X"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\U00000000'),
+ hl('DoubleQuotedBody', '0X'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\0"', {
+ -- 0123
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\000"', ':0:0:"\\0"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\0'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\00"', {
+ -- 01234
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\000"', ':0:0:"\\00"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\00'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\000"', {
+ -- 012345
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\000"', ':0:0:"\\000"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\000'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\0000"', {
+ -- 0123456
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\0000"', ':0:0:"\\0000"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\000'),
+ hl('DoubleQuotedBody', '0'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\8"', {
+ -- 0123
+ ast = {
+ fmtn('DoubleQuotedString', 'val="8"', ':0:0:"\\8"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedUnknownEscape', '\\8'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\08"', {
+ -- 01234
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\0008"', ':0:0:"\\08"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\0'),
+ hl('DoubleQuotedBody', '8'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\008"', {
+ -- 012345
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\0008"', ':0:0:"\\008"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\00'),
+ hl('DoubleQuotedBody', '8'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\0008"', {
+ -- 0123456
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\0008"', ':0:0:"\\0008"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\000'),
+ hl('DoubleQuotedBody', '8'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\777"', {
+ -- 012345
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\255"', ':0:0:"\\777"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\777'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\050"', {
+ -- 012345
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\40"', ':0:0:"\\050"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\050'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\<C-u>"', {
+ -- 012345
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\021"', ':0:0:"\\<C-u>"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\<C-u>'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\<', {
+ -- 012
+ ast = {
+ fmtn('DoubleQuotedString', 'val="<"', ':0:0:"\\<'),
+ },
+ err = {
+ arg = '"\\<',
+ msg = 'E114: Missing double quote: %.*s',
+ },
+ }, {
+ hl('InvalidDoubleQuote', '"'),
+ hl('InvalidDoubleQuotedUnknownEscape', '\\<'),
+ })
+
+ check_parsing('"\\<"', {
+ -- 0123
+ ast = {
+ fmtn('DoubleQuotedString', 'val="<"', ':0:0:"\\<"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedUnknownEscape', '\\<'),
+ hl('DoubleQuote', '"'),
+ })
+
+ check_parsing('"\\<C-u"', {
+ -- 0123456
+ ast = {
+ fmtn('DoubleQuotedString', 'val="<C-u"', ':0:0:"\\<C-u"'),
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedUnknownEscape', '\\<'),
+ hl('DoubleQuotedBody', 'C-u'),
+ hl('DoubleQuote', '"'),
+ })
+ end)
+ itp('works with multiplication-like operators', function()
+ check_parsing('2+2*2', {
+ -- 01234
+ ast = {
+ {
+ 'BinaryPlus:0:1:+',
+ children = {
+ 'Integer(val=2):0:0:2',
+ {
+ 'Multiplication:0:3:*',
+ children = {
+ 'Integer(val=2):0:2:2',
+ 'Integer(val=2):0:4:2',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Number', '2'),
+ hl('BinaryPlus', '+'),
+ hl('Number', '2'),
+ hl('Multiplication', '*'),
+ hl('Number', '2'),
+ })
+
+ check_parsing('2+2*', {
+ -- 0123
+ ast = {
+ {
+ 'BinaryPlus:0:1:+',
+ children = {
+ 'Integer(val=2):0:0:2',
+ {
+ 'Multiplication:0:3:*',
+ children = {
+ 'Integer(val=2):0:2:2',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '',
+ msg = 'E15: Expected value, got EOC: %.*s',
+ },
+ }, {
+ hl('Number', '2'),
+ hl('BinaryPlus', '+'),
+ hl('Number', '2'),
+ hl('Multiplication', '*'),
+ })
+
+ check_parsing('2+*2', {
+ -- 0123
+ ast = {
+ {
+ 'BinaryPlus:0:1:+',
+ children = {
+ 'Integer(val=2):0:0:2',
+ {
+ 'Multiplication:0:2:*',
+ children = {
+ 'Missing:0:2:',
+ 'Integer(val=2):0:3:2',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '*2',
+ msg = 'E15: Unexpected multiplication-like operator: %.*s',
+ },
+ }, {
+ hl('Number', '2'),
+ hl('BinaryPlus', '+'),
+ hl('InvalidMultiplication', '*'),
+ hl('Number', '2'),
+ })
+
+ check_parsing('2+2/2', {
+ -- 01234
+ ast = {
+ {
+ 'BinaryPlus:0:1:+',
+ children = {
+ 'Integer(val=2):0:0:2',
+ {
+ 'Division:0:3:/',
+ children = {
+ 'Integer(val=2):0:2:2',
+ 'Integer(val=2):0:4:2',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Number', '2'),
+ hl('BinaryPlus', '+'),
+ hl('Number', '2'),
+ hl('Division', '/'),
+ hl('Number', '2'),
+ })
+
+ check_parsing('2+2/', {
+ -- 0123
+ ast = {
+ {
+ 'BinaryPlus:0:1:+',
+ children = {
+ 'Integer(val=2):0:0:2',
+ {
+ 'Division:0:3:/',
+ children = {
+ 'Integer(val=2):0:2:2',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '',
+ msg = 'E15: Expected value, got EOC: %.*s',
+ },
+ }, {
+ hl('Number', '2'),
+ hl('BinaryPlus', '+'),
+ hl('Number', '2'),
+ hl('Division', '/'),
+ })
+
+ check_parsing('2+/2', {
+ -- 0123
+ ast = {
+ {
+ 'BinaryPlus:0:1:+',
+ children = {
+ 'Integer(val=2):0:0:2',
+ {
+ 'Division:0:2:/',
+ children = {
+ 'Missing:0:2:',
+ 'Integer(val=2):0:3:2',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '/2',
+ msg = 'E15: Unexpected multiplication-like operator: %.*s',
+ },
+ }, {
+ hl('Number', '2'),
+ hl('BinaryPlus', '+'),
+ hl('InvalidDivision', '/'),
+ hl('Number', '2'),
+ })
+
+ check_parsing('2+2%2', {
+ -- 01234
+ ast = {
+ {
+ 'BinaryPlus:0:1:+',
+ children = {
+ 'Integer(val=2):0:0:2',
+ {
+ 'Mod:0:3:%',
+ children = {
+ 'Integer(val=2):0:2:2',
+ 'Integer(val=2):0:4:2',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Number', '2'),
+ hl('BinaryPlus', '+'),
+ hl('Number', '2'),
+ hl('Mod', '%'),
+ hl('Number', '2'),
+ })
+
+ check_parsing('2+2%', {
+ -- 0123
+ ast = {
+ {
+ 'BinaryPlus:0:1:+',
+ children = {
+ 'Integer(val=2):0:0:2',
+ {
+ 'Mod:0:3:%',
+ children = {
+ 'Integer(val=2):0:2:2',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '',
+ msg = 'E15: Expected value, got EOC: %.*s',
+ },
+ }, {
+ hl('Number', '2'),
+ hl('BinaryPlus', '+'),
+ hl('Number', '2'),
+ hl('Mod', '%'),
+ })
+
+ check_parsing('2+%2', {
+ -- 0123
+ ast = {
+ {
+ 'BinaryPlus:0:1:+',
+ children = {
+ 'Integer(val=2):0:0:2',
+ {
+ 'Mod:0:2:%',
+ children = {
+ 'Missing:0:2:',
+ 'Integer(val=2):0:3:2',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '%2',
+ msg = 'E15: Unexpected multiplication-like operator: %.*s',
+ },
+ }, {
+ hl('Number', '2'),
+ hl('BinaryPlus', '+'),
+ hl('InvalidMod', '%'),
+ hl('Number', '2'),
+ })
+ end)
+ itp('works with -', function()
+ check_parsing('@a', {
+ ast = {
+ 'Register(name=a):0:0:@a',
+ },
+ }, {
+ hl('Register', '@a'),
+ })
+ check_parsing('-@a', {
+ ast = {
+ {
+ 'UnaryMinus:0:0:-',
+ children = {
+ 'Register(name=a):0:1:@a',
+ },
+ },
+ },
+ }, {
+ hl('UnaryMinus', '-'),
+ hl('Register', '@a'),
+ })
+ check_parsing('@a-@b', {
+ ast = {
+ {
+ 'BinaryMinus:0:2:-',
+ children = {
+ 'Register(name=a):0:0:@a',
+ 'Register(name=b):0:3:@b',
+ },
+ },
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('BinaryMinus', '-'),
+ hl('Register', '@b'),
+ })
+ check_parsing('@a-@b-@c', {
+ ast = {
+ {
+ 'BinaryMinus:0:5:-',
+ children = {
+ {
+ 'BinaryMinus:0:2:-',
+ children = {
+ 'Register(name=a):0:0:@a',
+ 'Register(name=b):0:3:@b',
+ },
+ },
+ 'Register(name=c):0:6:@c',
+ },
+ },
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('BinaryMinus', '-'),
+ hl('Register', '@b'),
+ hl('BinaryMinus', '-'),
+ hl('Register', '@c'),
+ })
+ check_parsing('-@a-@b', {
+ ast = {
+ {
+ 'BinaryMinus:0:3:-',
+ children = {
+ {
+ 'UnaryMinus:0:0:-',
+ children = {
+ 'Register(name=a):0:1:@a',
+ },
+ },
+ 'Register(name=b):0:4:@b',
+ },
+ },
+ },
+ }, {
+ hl('UnaryMinus', '-'),
+ hl('Register', '@a'),
+ hl('BinaryMinus', '-'),
+ hl('Register', '@b'),
+ })
+ check_parsing('-@a--@b', {
+ ast = {
+ {
+ 'BinaryMinus:0:3:-',
+ children = {
+ {
+ 'UnaryMinus:0:0:-',
+ children = {
+ 'Register(name=a):0:1:@a',
+ },
+ },
+ {
+ 'UnaryMinus:0:4:-',
+ children = {
+ 'Register(name=b):0:5:@b',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('UnaryMinus', '-'),
+ hl('Register', '@a'),
+ hl('BinaryMinus', '-'),
+ hl('UnaryMinus', '-'),
+ hl('Register', '@b'),
+ })
+ check_parsing('-', {
+ ast = {
+ 'UnaryMinus:0:0:-',
+ },
+ err = {
+ arg = '',
+ msg = 'E15: Expected value, got EOC: %.*s',
+ },
+ }, {
+ hl('UnaryMinus', '-'),
+ })
+ check_parsing(' -', {
+ ast = {
+ 'UnaryMinus:0:0: -',
+ },
+ err = {
+ arg = '',
+ msg = 'E15: Expected value, got EOC: %.*s',
+ },
+ }, {
+ hl('UnaryMinus', '-', 1),
+ })
+ check_parsing('@a- ', {
+ ast = {
+ {
+ 'BinaryMinus:0:2:-',
+ children = {
+ 'Register(name=a):0:0:@a',
+ },
+ },
+ },
+ err = {
+ arg = '',
+ msg = 'E15: Expected value, got EOC: %.*s',
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('BinaryMinus', '-'),
+ })
+ end)
+ itp('works with logical operators', function()
+ check_parsing('a && b || c && d', {
+ -- 0123456789012345
+ -- 0 1
+ ast = {
+ {
+ 'Or:0:6: ||',
+ children = {
+ {
+ 'And:0:1: &&',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=0,ident=b):0:4: b',
+ },
+ },
+ {
+ 'And:0:11: &&',
+ children = {
+ 'PlainIdentifier(scope=0,ident=c):0:9: c',
+ 'PlainIdentifier(scope=0,ident=d):0:14: d',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('And', '&&', 1),
+ hl('IdentifierName', 'b', 1),
+ hl('Or', '||', 1),
+ hl('IdentifierName', 'c', 1),
+ hl('And', '&&', 1),
+ hl('IdentifierName', 'd', 1),
+ })
+
+ check_parsing('&& a', {
+ -- 0123
+ ast = {
+ {
+ 'And:0:0:&&',
+ children = {
+ 'Missing:0:0:',
+ 'PlainIdentifier(scope=0,ident=a):0:2: a',
+ },
+ },
+ },
+ err = {
+ arg = '&& a',
+ msg = 'E15: Unexpected and operator: %.*s',
+ },
+ }, {
+ hl('InvalidAnd', '&&'),
+ hl('IdentifierName', 'a', 1),
+ })
+
+ check_parsing('|| a', {
+ -- 0123
+ ast = {
+ {
+ 'Or:0:0:||',
+ children = {
+ 'Missing:0:0:',
+ 'PlainIdentifier(scope=0,ident=a):0:2: a',
+ },
+ },
+ },
+ err = {
+ arg = '|| a',
+ msg = 'E15: Unexpected or operator: %.*s',
+ },
+ }, {
+ hl('InvalidOr', '||'),
+ hl('IdentifierName', 'a', 1),
+ })
+
+ check_parsing('a||', {
+ -- 012
+ ast = {
+ {
+ 'Or:0:1:||',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ },
+ },
+ },
+ err = {
+ arg = '',
+ msg = 'E15: Expected value, got EOC: %.*s',
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Or', '||'),
+ })
+
+ check_parsing('a&&', {
+ -- 012
+ ast = {
+ {
+ 'And:0:1:&&',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ },
+ },
+ },
+ err = {
+ arg = '',
+ msg = 'E15: Expected value, got EOC: %.*s',
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('And', '&&'),
+ })
+
+ check_parsing('(&&)', {
+ -- 0123
+ ast = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ {
+ 'And:0:1:&&',
+ children = {
+ 'Missing:0:1:',
+ 'Missing:0:3:',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '&&)',
+ msg = 'E15: Unexpected and operator: %.*s',
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('InvalidAnd', '&&'),
+ hl('InvalidNestingParenthesis', ')'),
+ })
+
+ check_parsing('(||)', {
+ -- 0123
+ ast = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ {
+ 'Or:0:1:||',
+ children = {
+ 'Missing:0:1:',
+ 'Missing:0:3:',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '||)',
+ msg = 'E15: Unexpected or operator: %.*s',
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('InvalidOr', '||'),
+ hl('InvalidNestingParenthesis', ')'),
+ })
+
+ check_parsing('(a||)', {
+ -- 01234
+ ast = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ {
+ 'Or:0:2:||',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ 'Missing:0:4:',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = ')',
+ msg = 'E15: Expected value, got parenthesis: %.*s',
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('IdentifierName', 'a'),
+ hl('Or', '||'),
+ hl('InvalidNestingParenthesis', ')'),
+ })
+
+ check_parsing('(a&&)', {
+ -- 01234
+ ast = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ {
+ 'And:0:2:&&',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ 'Missing:0:4:',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = ')',
+ msg = 'E15: Expected value, got parenthesis: %.*s',
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('IdentifierName', 'a'),
+ hl('And', '&&'),
+ hl('InvalidNestingParenthesis', ')'),
+ })
+
+ check_parsing('(&&a)', {
+ -- 01234
+ ast = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ {
+ 'And:0:1:&&',
+ children = {
+ 'Missing:0:1:',
+ 'PlainIdentifier(scope=0,ident=a):0:3:a',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '&&a)',
+ msg = 'E15: Unexpected and operator: %.*s',
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('InvalidAnd', '&&'),
+ hl('IdentifierName', 'a'),
+ hl('NestingParenthesis', ')'),
+ })
+
+ check_parsing('(||a)', {
+ -- 01234
+ ast = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ {
+ 'Or:0:1:||',
+ children = {
+ 'Missing:0:1:',
+ 'PlainIdentifier(scope=0,ident=a):0:3:a',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '||a)',
+ msg = 'E15: Unexpected or operator: %.*s',
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('InvalidOr', '||'),
+ hl('IdentifierName', 'a'),
+ hl('NestingParenthesis', ')'),
+ })
+ end)
+ itp('works with &opt', function()
+ check_parsing('&', {
+ -- 0
+ ast = {
+ 'Option(scope=0,ident=):0:0:&',
+ },
+ err = {
+ arg = '&',
+ msg = 'E112: Option name missing: %.*s',
+ },
+ }, {
+ hl('InvalidOptionSigil', '&'),
+ })
+
+ check_parsing('&opt', {
+ -- 0123
+ ast = {
+ 'Option(scope=0,ident=opt):0:0:&opt',
+ },
+ }, {
+ hl('OptionSigil', '&'),
+ hl('OptionName', 'opt'),
+ })
+
+ check_parsing('&l:opt', {
+ -- 012345
+ ast = {
+ 'Option(scope=l,ident=opt):0:0:&l:opt',
+ },
+ }, {
+ hl('OptionSigil', '&'),
+ hl('OptionScope', 'l'),
+ hl('OptionScopeDelimiter', ':'),
+ hl('OptionName', 'opt'),
+ })
+
+ check_parsing('&g:opt', {
+ -- 012345
+ ast = {
+ 'Option(scope=g,ident=opt):0:0:&g:opt',
+ },
+ }, {
+ hl('OptionSigil', '&'),
+ hl('OptionScope', 'g'),
+ hl('OptionScopeDelimiter', ':'),
+ hl('OptionName', 'opt'),
+ })
+
+ check_parsing('&s:opt', {
+ -- 012345
+ ast = {
+ {
+ 'Colon:0:2::',
+ children = {
+ 'Option(scope=0,ident=s):0:0:&s',
+ 'PlainIdentifier(scope=0,ident=opt):0:3:opt',
+ },
+ },
+ },
+ err = {
+ arg = ':opt',
+ msg = 'E15: Colon outside of dictionary or ternary operator: %.*s',
+ },
+ }, {
+ hl('OptionSigil', '&'),
+ hl('OptionName', 's'),
+ hl('InvalidColon', ':'),
+ hl('IdentifierName', 'opt'),
+ })
+
+ check_parsing('& ', {
+ -- 01
+ ast = {
+ 'Option(scope=0,ident=):0:0:&',
+ },
+ err = {
+ arg = '& ',
+ msg = 'E112: Option name missing: %.*s',
+ },
+ }, {
+ hl('InvalidOptionSigil', '&'),
+ })
+
+ check_parsing('&-', {
+ -- 01
+ ast = {
+ {
+ 'BinaryMinus:0:1:-',
+ children = {
+ 'Option(scope=0,ident=):0:0:&',
+ },
+ },
+ },
+ err = {
+ arg = '&-',
+ msg = 'E112: Option name missing: %.*s',
+ },
+ }, {
+ hl('InvalidOptionSigil', '&'),
+ hl('BinaryMinus', '-'),
+ })
+
+ check_parsing('&A', {
+ -- 01
+ ast = {
+ 'Option(scope=0,ident=A):0:0:&A',
+ },
+ }, {
+ hl('OptionSigil', '&'),
+ hl('OptionName', 'A'),
+ })
+
+ check_parsing('&xxx_yyy', {
+ -- 01234567
+ ast = {
+ {
+ 'OpMissing:0:4:',
+ children = {
+ 'Option(scope=0,ident=xxx):0:0:&xxx',
+ 'PlainIdentifier(scope=0,ident=_yyy):0:4:_yyy',
+ },
+ },
+ },
+ err = {
+ arg = '_yyy',
+ msg = 'E15: Missing operator: %.*s',
+ },
+ }, {
+ hl('OptionSigil', '&'),
+ hl('OptionName', 'xxx'),
+ hl('InvalidIdentifierName', '_yyy'),
+ }, {
+ [1] = {
+ ast = {
+ len = 4,
+ err = REMOVE_THIS,
+ ast = {
+ 'Option(scope=0,ident=xxx):0:0:&xxx',
+ },
+ },
+ hl_fs = {
+ [3] = REMOVE_THIS,
+ },
+ },
+ })
+
+ check_parsing('(1+&)', {
+ -- 01234
+ ast = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ {
+ 'BinaryPlus:0:2:+',
+ children = {
+ 'Integer(val=1):0:1:1',
+ 'Option(scope=0,ident=):0:3:&',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '&)',
+ msg = 'E112: Option name missing: %.*s',
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('Number', '1'),
+ hl('BinaryPlus', '+'),
+ hl('InvalidOptionSigil', '&'),
+ hl('NestingParenthesis', ')'),
+ })
+
+ check_parsing('(&+1)', {
+ -- 01234
+ ast = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ {
+ 'BinaryPlus:0:2:+',
+ children = {
+ 'Option(scope=0,ident=):0:1:&',
+ 'Integer(val=1):0:3:1',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '&+1)',
+ msg = 'E112: Option name missing: %.*s',
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('InvalidOptionSigil', '&'),
+ hl('BinaryPlus', '+'),
+ hl('Number', '1'),
+ hl('NestingParenthesis', ')'),
+ })
+ end)
+ itp('works with $ENV', function()
+ check_parsing('$', {
+ -- 0
+ ast = {
+ 'Environment(ident=):0:0:$',
+ },
+ err = {
+ arg = '$',
+ msg = 'E15: Environment variable name missing',
+ },
+ }, {
+ hl('InvalidEnvironmentSigil', '$'),
+ })
+
+ check_parsing('$g:A', {
+ -- 0123
+ ast = {
+ {
+ 'Colon:0:2::',
+ children = {
+ 'Environment(ident=g):0:0:$g',
+ 'PlainIdentifier(scope=0,ident=A):0:3:A',
+ },
+ },
+ },
+ err = {
+ arg = ':A',
+ msg = 'E15: Colon outside of dictionary or ternary operator: %.*s',
+ },
+ }, {
+ hl('EnvironmentSigil', '$'),
+ hl('EnvironmentName', 'g'),
+ hl('InvalidColon', ':'),
+ hl('IdentifierName', 'A'),
+ })
+
+ check_parsing('$A', {
+ -- 01
+ ast = {
+ 'Environment(ident=A):0:0:$A',
+ },
+ }, {
+ hl('EnvironmentSigil', '$'),
+ hl('EnvironmentName', 'A'),
+ })
+
+ check_parsing('$ABC', {
+ -- 0123
+ ast = {
+ 'Environment(ident=ABC):0:0:$ABC',
+ },
+ }, {
+ hl('EnvironmentSigil', '$'),
+ hl('EnvironmentName', 'ABC'),
+ })
+
+ check_parsing('(1+$)', {
+ -- 01234
+ ast = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ {
+ 'BinaryPlus:0:2:+',
+ children = {
+ 'Integer(val=1):0:1:1',
+ 'Environment(ident=):0:3:$',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '$)',
+ msg = 'E15: Environment variable name missing',
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('Number', '1'),
+ hl('BinaryPlus', '+'),
+ hl('InvalidEnvironmentSigil', '$'),
+ hl('NestingParenthesis', ')'),
+ })
+
+ check_parsing('($+1)', {
+ -- 01234
+ ast = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ {
+ 'BinaryPlus:0:2:+',
+ children = {
+ 'Environment(ident=):0:1:$',
+ 'Integer(val=1):0:3:1',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '$+1)',
+ msg = 'E15: Environment variable name missing',
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('InvalidEnvironmentSigil', '$'),
+ hl('BinaryPlus', '+'),
+ hl('Number', '1'),
+ hl('NestingParenthesis', ')'),
+ })
+
+ check_parsing('$_ABC', {
+ -- 01234
+ ast = {
+ 'Environment(ident=_ABC):0:0:$_ABC',
+ },
+ }, {
+ hl('EnvironmentSigil', '$'),
+ hl('EnvironmentName', '_ABC'),
+ })
+
+ check_parsing('$_', {
+ -- 01
+ ast = {
+ 'Environment(ident=_):0:0:$_',
+ },
+ }, {
+ hl('EnvironmentSigil', '$'),
+ hl('EnvironmentName', '_'),
+ })
+
+ check_parsing('$ABC_DEF', {
+ -- 01234567
+ ast = {
+ 'Environment(ident=ABC_DEF):0:0:$ABC_DEF',
+ },
+ }, {
+ hl('EnvironmentSigil', '$'),
+ hl('EnvironmentName', 'ABC_DEF'),
+ })
+ end)
+ itp('works with unary !', function()
+ check_parsing('!', {
+ -- 0
+ ast = {
+ 'Not:0:0:!',
+ },
+ err = {
+ arg = '',
+ msg = 'E15: Expected value, got EOC: %.*s',
+ },
+ }, {
+ hl('Not', '!'),
+ })
+
+ check_parsing('!!', {
+ -- 01
+ ast = {
+ {
+ 'Not:0:0:!',
+ children = {
+ 'Not:0:1:!',
+ },
+ },
+ },
+ err = {
+ arg = '',
+ msg = 'E15: Expected value, got EOC: %.*s',
+ },
+ }, {
+ hl('Not', '!'),
+ hl('Not', '!'),
+ })
+
+ check_parsing('!!1', {
+ -- 012
+ ast = {
+ {
+ 'Not:0:0:!',
+ children = {
+ {
+ 'Not:0:1:!',
+ children = {
+ 'Integer(val=1):0:2:1',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('Not', '!'),
+ hl('Not', '!'),
+ hl('Number', '1'),
+ })
+
+ check_parsing('!1', {
+ -- 01
+ ast = {
+ {
+ 'Not:0:0:!',
+ children = {
+ 'Integer(val=1):0:1:1',
+ },
+ },
+ },
+ }, {
+ hl('Not', '!'),
+ hl('Number', '1'),
+ })
+
+ check_parsing('(!1)', {
+ -- 0123
+ ast = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ {
+ 'Not:0:1:!',
+ children = {
+ 'Integer(val=1):0:2:1',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('Not', '!'),
+ hl('Number', '1'),
+ hl('NestingParenthesis', ')'),
+ })
+
+ check_parsing('(!)', {
+ -- 012
+ ast = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ {
+ 'Not:0:1:!',
+ children = {
+ 'Missing:0:2:',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = ')',
+ msg = 'E15: Expected value, got parenthesis: %.*s',
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('Not', '!'),
+ hl('InvalidNestingParenthesis', ')'),
+ })
+
+ check_parsing('(1!2)', {
+ -- 01234
+ ast = {
+ {
+ 'Nested:0:0:(',
+ children = {
+ {
+ 'OpMissing:0:2:',
+ children = {
+ 'Integer(val=1):0:1:1',
+ {
+ 'Not:0:2:!',
+ children = {
+ 'Integer(val=2):0:3:2',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '!2)',
+ msg = 'E15: Missing operator: %.*s',
+ },
+ }, {
+ hl('NestingParenthesis', '('),
+ hl('Number', '1'),
+ hl('InvalidNot', '!'),
+ hl('Number', '2'),
+ hl('NestingParenthesis', ')'),
+ })
+
+ check_parsing('1!2', {
+ -- 012
+ ast = {
+ {
+ 'OpMissing:0:1:',
+ children = {
+ 'Integer(val=1):0:0:1',
+ {
+ 'Not:0:1:!',
+ children = {
+ 'Integer(val=2):0:2:2',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '!2',
+ msg = 'E15: Missing operator: %.*s',
+ },
+ }, {
+ hl('Number', '1'),
+ hl('InvalidNot', '!'),
+ hl('Number', '2'),
+ }, {
+ [1] = {
+ ast = {
+ len = 1,
+ err = REMOVE_THIS,
+ ast = {
+ 'Integer(val=1):0:0:1',
+ },
+ },
+ hl_fs = {
+ [2] = REMOVE_THIS,
+ [3] = REMOVE_THIS,
+ },
+ },
+ })
+ end)
+ itp('highlights numbers with prefix', function()
+ check_parsing('0xABCDEF', {
+ -- 01234567
+ ast = {
+ 'Integer(val=11259375):0:0:0xABCDEF',
+ },
+ }, {
+ hl('NumberPrefix', '0x'),
+ hl('Number', 'ABCDEF'),
+ })
+
+ check_parsing('0Xabcdef', {
+ -- 01234567
+ ast = {
+ 'Integer(val=11259375):0:0:0Xabcdef',
+ },
+ }, {
+ hl('NumberPrefix', '0X'),
+ hl('Number', 'abcdef'),
+ })
+
+ check_parsing('0XABCDEF', {
+ -- 01234567
+ ast = {
+ 'Integer(val=11259375):0:0:0XABCDEF',
+ },
+ }, {
+ hl('NumberPrefix', '0X'),
+ hl('Number', 'ABCDEF'),
+ })
+
+ check_parsing('0xabcdef', {
+ -- 01234567
+ ast = {
+ 'Integer(val=11259375):0:0:0xabcdef',
+ },
+ }, {
+ hl('NumberPrefix', '0x'),
+ hl('Number', 'abcdef'),
+ })
+
+ check_parsing('0b001', {
+ -- 01234
+ ast = {
+ 'Integer(val=1):0:0:0b001',
+ },
+ }, {
+ hl('NumberPrefix', '0b'),
+ hl('Number', '001'),
+ })
+
+ check_parsing('0B001', {
+ -- 01234
+ ast = {
+ 'Integer(val=1):0:0:0B001',
+ },
+ }, {
+ hl('NumberPrefix', '0B'),
+ hl('Number', '001'),
+ })
+
+ check_parsing('0B00', {
+ -- 0123
+ ast = {
+ 'Integer(val=0):0:0:0B00',
+ },
+ }, {
+ hl('NumberPrefix', '0B'),
+ hl('Number', '00'),
+ })
+
+ check_parsing('00', {
+ -- 01
+ ast = {
+ 'Integer(val=0):0:0:00',
+ },
+ }, {
+ hl('NumberPrefix', '0'),
+ hl('Number', '0'),
+ })
+
+ check_parsing('001', {
+ -- 012
+ ast = {
+ 'Integer(val=1):0:0:001',
+ },
+ }, {
+ hl('NumberPrefix', '0'),
+ hl('Number', '01'),
+ })
+
+ check_parsing('01', {
+ -- 01
+ ast = {
+ 'Integer(val=1):0:0:01',
+ },
+ }, {
+ hl('NumberPrefix', '0'),
+ hl('Number', '1'),
+ })
+
+ check_parsing('1', {
+ -- 0
+ ast = {
+ 'Integer(val=1):0:0:1',
+ },
+ }, {
+ hl('Number', '1'),
+ })
+ end)
+ itp('works (KLEE tests)', function()
+ check_parsing('\0002&A:\000', {
+ len = 0,
+ ast = nil,
+ err = {
+ arg = '\0002&A:\000',
+ msg = 'E15: Expected value, got EOC: %.*s',
+ },
+ }, {
+ }, {
+ [2] = {
+ ast = {
+ len = REMOVE_THIS,
+ ast = {
+ {
+ 'Colon:0:4::',
+ children = {
+ {
+ 'OpMissing:0:2:',
+ children = {
+ 'Integer(val=2):0:1:2',
+ 'Option(scope=0,ident=A):0:2:&A',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ msg = 'E15: Unexpected EOC character: %.*s',
+ },
+ },
+ hl_fs = {
+ hl('InvalidSpacing', '\0'),
+ hl('Number', '2'),
+ hl('InvalidOptionSigil', '&'),
+ hl('InvalidOptionName', 'A'),
+ hl('InvalidColon', ':'),
+ hl('InvalidSpacing', '\0'),
+ },
+ },
+ [3] = {
+ ast = {
+ len = 2,
+ ast = {
+ 'Integer(val=2):0:1:2',
+ },
+ err = {
+ msg = 'E15: Unexpected EOC character: %.*s',
+ },
+ },
+ hl_fs = {
+ hl('InvalidSpacing', '\0'),
+ hl('Number', '2'),
+ },
+ },
+ })
+ check_parsing({data='01', size=1}, {
+ len = 1,
+ ast = {
+ 'Integer(val=0):0:0:0',
+ },
+ }, {
+ hl('Number', '0'),
+ })
+ check_parsing({data='001', size=2}, {
+ len = 2,
+ ast = {
+ 'Integer(val=0):0:0:00',
+ },
+ }, {
+ hl('NumberPrefix', '0'),
+ hl('Number', '0'),
+ })
+ check_parsing('"\\U\\', {
+ -- 0123
+ ast = {
+ [[DoubleQuotedString(val="U\\"):0:0:"\U\]],
+ },
+ err = {
+ arg = '"\\U\\',
+ msg = 'E114: Missing double quote: %.*s',
+ },
+ }, {
+ hl('InvalidDoubleQuote', '"'),
+ hl('InvalidDoubleQuotedUnknownEscape', '\\U'),
+ hl('InvalidDoubleQuotedBody', '\\'),
+ })
+ check_parsing('"\\U', {
+ -- 012
+ ast = {
+ fmtn('DoubleQuotedString', 'val="U"', ':0:0:"\\U'),
+ },
+ err = {
+ arg = '"\\U',
+ msg = 'E114: Missing double quote: %.*s',
+ },
+ }, {
+ hl('InvalidDoubleQuote', '"'),
+ hl('InvalidDoubleQuotedUnknownEscape', '\\U'),
+ })
+ check_parsing('|"\\U\\', {
+ -- 01234
+ len = 0,
+ err = {
+ arg = '|"\\U\\',
+ msg = 'E15: Expected value, got EOC: %.*s',
+ },
+ }, {
+ }, {
+ [2] = {
+ ast = {
+ len = REMOVE_THIS,
+ ast = {
+ {
+ 'Or:0:0:|',
+ children = {
+ 'Missing:0:0:',
+ fmtn('DoubleQuotedString', 'val="U\\\\"', ':0:1:"\\U\\'),
+ },
+ },
+ },
+ err = {
+ msg = 'E15: Unexpected EOC character: %.*s',
+ },
+ },
+ hl_fs = {
+ hl('InvalidOr', '|'),
+ hl('InvalidDoubleQuote', '"'),
+ hl('InvalidDoubleQuotedUnknownEscape', '\\U'),
+ hl('InvalidDoubleQuotedBody', '\\'),
+ },
+ },
+ })
+ check_parsing('|"\\e"', {
+ -- 01234
+ len = 0,
+ err = {
+ arg = '|"\\e"',
+ msg = 'E15: Expected value, got EOC: %.*s',
+ },
+ }, {
+ }, {
+ [2] = {
+ ast = {
+ len = REMOVE_THIS,
+ ast = {
+ {
+ 'Or:0:0:|',
+ children = {
+ 'Missing:0:0:',
+ fmtn('DoubleQuotedString', 'val="\\027"', ':0:1:"\\e"'),
+ },
+ },
+ },
+ err = {
+ msg = 'E15: Unexpected EOC character: %.*s',
+ },
+ },
+ hl_fs = {
+ hl('InvalidOr', '|'),
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedEscape', '\\e'),
+ hl('DoubleQuote', '"'),
+ },
+ },
+ })
+ check_parsing('|\029', {
+ -- 01
+ len = 0,
+ err = {
+ arg = '|\029',
+ msg = 'E15: Expected value, got EOC: %.*s',
+ },
+ }, {
+ }, {
+ [2] = {
+ ast = {
+ len = REMOVE_THIS,
+ ast = {
+ {
+ 'Or:0:0:|',
+ children = {
+ 'Missing:0:0:',
+ 'PlainIdentifier(scope=0,ident=\029):0:1:\029',
+ },
+ },
+ },
+ err = {
+ msg = 'E15: Unexpected EOC character: %.*s',
+ },
+ },
+ hl_fs = {
+ hl('InvalidOr', '|'),
+ hl('InvalidIdentifierName', '\029'),
+ },
+ },
+ })
+ check_parsing('"\\<', {
+ -- 012
+ ast = {
+ fmtn('DoubleQuotedString', 'val="<"', ':0:0:"\\<'),
+ },
+ err = {
+ arg = '"\\<',
+ msg = 'E114: Missing double quote: %.*s',
+ },
+ }, {
+ hl('InvalidDoubleQuote', '"'),
+ hl('InvalidDoubleQuotedUnknownEscape', '\\<'),
+ })
+ check_parsing('"\\1', {
+ -- 01 2
+ ast = {
+ fmtn('DoubleQuotedString', 'val="\\001"', ':0:0:"\\1'),
+ },
+ err = {
+ arg = '"\\1',
+ msg = 'E114: Missing double quote: %.*s',
+ },
+ }, {
+ hl('InvalidDoubleQuote', '"'),
+ hl('InvalidDoubleQuotedEscape', '\\1'),
+ })
+ check_parsing('}l', {
+ -- 01
+ ast = {
+ {
+ 'OpMissing:0:1:',
+ children = {
+ fmtn('UnknownFigure', '---', ':0:0:'),
+ 'PlainIdentifier(scope=0,ident=l):0:1:l',
+ },
+ },
+ },
+ err = {
+ arg = '}l',
+ msg = 'E15: Unexpected closing figure brace: %.*s',
+ },
+ }, {
+ hl('InvalidFigureBrace', '}'),
+ hl('InvalidIdentifierName', 'l'),
+ }, {
+ [1] = {
+ ast = {
+ len = 1,
+ ast = {
+ fmtn('UnknownFigure', '---', ':0:0:'),
+ },
+ },
+ hl_fs = {
+ [2] = REMOVE_THIS,
+ },
+ },
+ })
+ check_parsing(':?\000\000\000\000\000\000\000', {
+ len = 2,
+ ast = {
+ {
+ 'Colon:0:0::',
+ children = {
+ 'Missing:0:0:',
+ {
+ 'Ternary:0:1:?',
+ children = {
+ 'Missing:0:1:',
+ 'TernaryValue:0:1:?',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = ':?\000\000\000\000\000\000\000',
+ msg = 'E15: Colon outside of dictionary or ternary operator: %.*s',
+ },
+ }, {
+ hl('InvalidColon', ':'),
+ hl('InvalidTernary', '?'),
+ }, {
+ [2] = {
+ ast = {
+ len = REMOVE_THIS,
+ },
+ hl_fs = {
+ [3] = hl('InvalidSpacing', '\0'),
+ [4] = hl('InvalidSpacing', '\0'),
+ [5] = hl('InvalidSpacing', '\0'),
+ [6] = hl('InvalidSpacing', '\0'),
+ [7] = hl('InvalidSpacing', '\0'),
+ [8] = hl('InvalidSpacing', '\0'),
+ [9] = hl('InvalidSpacing', '\0'),
+ },
+ },
+ })
+ end)
+ itp('works with assignments', function()
+ check_asgn_parsing('a=b', {
+ -- 012
+ ast = {
+ {
+ 'Assignment(Plain):0:1:=',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=0,ident=b):0:2:b',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('PlainAssignment', '='),
+ hl('IdentifierName', 'b'),
+ })
+
+ check_asgn_parsing('a+=b', {
+ -- 0123
+ ast = {
+ {
+ 'Assignment(Add):0:1:+=',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=0,ident=b):0:3:b',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('AssignmentWithAddition', '+='),
+ hl('IdentifierName', 'b'),
+ })
+
+ check_asgn_parsing('a-=b', {
+ -- 0123
+ ast = {
+ {
+ 'Assignment(Subtract):0:1:-=',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=0,ident=b):0:3:b',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('AssignmentWithSubtraction', '-='),
+ hl('IdentifierName', 'b'),
+ })
+
+ check_asgn_parsing('a.=b', {
+ -- 0123
+ ast = {
+ {
+ 'Assignment(Concat):0:1:.=',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=0,ident=b):0:3:b',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('AssignmentWithConcatenation', '.='),
+ hl('IdentifierName', 'b'),
+ })
+
+ check_asgn_parsing('a', {
+ -- 0
+ ast = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ })
+
+ check_asgn_parsing('a b', {
+ -- 012
+ ast = {
+ {
+ 'OpMissing:0:1:',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainIdentifier(scope=0,ident=b):0:1: b',
+ },
+ },
+ },
+ err = {
+ arg = 'b',
+ msg = 'E15: Expected assignment operator or subscript: %.*s',
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('InvalidSpacing', ' '),
+ hl('IdentifierName', 'b'),
+ }, {
+ [5] = {
+ ast = {
+ len = 2,
+ ast = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ },
+ err = REMOVE_THIS,
+ },
+ hl_fs = {
+ [2] = REMOVE_THIS,
+ [3] = REMOVE_THIS,
+ }
+ },
+ })
+
+ check_asgn_parsing('[a, b, c]', {
+ -- 012345678
+ ast = {
+ {
+ 'ListLiteral:0:0:[',
+ children = {
+ {
+ 'Comma:0:2:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ {
+ 'Comma:0:5:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:3: b',
+ 'PlainIdentifier(scope=0,ident=c):0:6: c',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('List', '['),
+ hl('IdentifierName', 'a'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'b', 1),
+ hl('Comma', ','),
+ hl('IdentifierName', 'c', 1),
+ hl('List', ']'),
+ })
+
+ check_asgn_parsing('[a, b]', {
+ -- 012345
+ ast = {
+ {
+ 'ListLiteral:0:0:[',
+ children = {
+ {
+ 'Comma:0:2:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ 'PlainIdentifier(scope=0,ident=b):0:3: b',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('List', '['),
+ hl('IdentifierName', 'a'),
+ hl('Comma', ','),
+ hl('IdentifierName', 'b', 1),
+ hl('List', ']'),
+ })
+
+ check_asgn_parsing('[a]', {
+ -- 012
+ ast = {
+ {
+ 'ListLiteral:0:0:[',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ },
+ },
+ },
+ }, {
+ hl('List', '['),
+ hl('IdentifierName', 'a'),
+ hl('List', ']'),
+ })
+
+ check_asgn_parsing('[]', {
+ -- 01
+ ast = {
+ 'ListLiteral:0:0:[',
+ },
+ err = {
+ arg = ']',
+ msg = 'E475: Unable to assign to empty list: %.*s',
+ },
+ }, {
+ hl('List', '['),
+ hl('InvalidList', ']'),
+ })
+
+ check_asgn_parsing('a[1] += 3', {
+ -- 012345678
+ ast = {
+ {
+ 'Assignment(Add):0:4: +=',
+ children = {
+ {
+ 'Subscript:0:1:[',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'Integer(val=1):0:2:1',
+ },
+ },
+ 'Integer(val=3):0:7: 3',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('SubscriptBracket', '['),
+ hl('Number', '1'),
+ hl('SubscriptBracket', ']'),
+ hl('AssignmentWithAddition', '+=', 1),
+ hl('Number', '3', 1),
+ })
+
+ check_asgn_parsing('a[1 + 2] += 3', {
+ -- 0123456789012
+ -- 0 1
+ ast = {
+ {
+ 'Assignment(Add):0:8: +=',
+ children = {
+ {
+ 'Subscript:0:1:[',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ 'BinaryPlus:0:3: +',
+ children = {
+ 'Integer(val=1):0:2:1',
+ 'Integer(val=2):0:5: 2',
+ },
+ },
+ },
+ },
+ 'Integer(val=3):0:11: 3',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('SubscriptBracket', '['),
+ hl('Number', '1'),
+ hl('BinaryPlus', '+', 1),
+ hl('Number', '2', 1),
+ hl('SubscriptBracket', ']'),
+ hl('AssignmentWithAddition', '+=', 1),
+ hl('Number', '3', 1),
+ })
+
+ check_asgn_parsing('a[{-> {b{3}: 4}[5]}()] += 6', {
+ -- 012345678901234567890123456
+ -- 0 1 2
+ ast = {
+ {
+ 'Assignment(Add):0:22: +=',
+ children = {
+ {
+ 'Subscript:0:1:[',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ 'Call:0:19:(',
+ children = {
+ {
+ fmtn('Lambda', '\\di', ':0:2:{'),
+ children = {
+ {
+ 'Arrow:0:3:->',
+ children = {
+ {
+ 'Subscript:0:15:[',
+ children = {
+ {
+ fmtn('DictLiteral', '-di', ':0:5: {'),
+ children = {
+ {
+ 'Colon:0:11::',
+ children = {
+ {
+ 'ComplexIdentifier:0:8:',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:7:b',
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:8:{'),
+ children = {
+ 'Integer(val=3):0:9:3',
+ },
+ },
+ },
+ },
+ 'Integer(val=4):0:12: 4',
+ },
+ },
+ },
+ },
+ 'Integer(val=5):0:16:5',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ 'Integer(val=6):0:25: 6',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('SubscriptBracket', '['),
+ hl('Lambda', '{'),
+ hl('Arrow', '->'),
+ hl('Dict', '{', 1),
+ hl('IdentifierName', 'b'),
+ hl('Curly', '{'),
+ hl('Number', '3'),
+ hl('Curly', '}'),
+ hl('Colon', ':'),
+ hl('Number', '4', 1),
+ hl('Dict', '}'),
+ hl('SubscriptBracket', '['),
+ hl('Number', '5'),
+ hl('SubscriptBracket', ']'),
+ hl('Lambda', '}'),
+ hl('CallingParenthesis', '('),
+ hl('CallingParenthesis', ')'),
+ hl('SubscriptBracket', ']'),
+ hl('AssignmentWithAddition', '+=', 1),
+ hl('Number', '6', 1),
+ })
+
+ check_asgn_parsing('a{1}.2[{-> {b{3}: 4}[5]}()]', {
+ -- 012345678901234567890123456
+ -- 0 1 2
+ ast = {
+ {
+ 'Subscript:0:6:[',
+ children = {
+ {
+ 'ConcatOrSubscript:0:4:.',
+ children = {
+ {
+ 'ComplexIdentifier:0:1:',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:1:{'),
+ children = {
+ 'Integer(val=1):0:2:1',
+ },
+ },
+ },
+ },
+ 'PlainKey(key=2):0:5:2',
+ },
+ },
+ {
+ 'Call:0:24:(',
+ children = {
+ {
+ fmtn('Lambda', '\\di', ':0:7:{'),
+ children = {
+ {
+ 'Arrow:0:8:->',
+ children = {
+ {
+ 'Subscript:0:20:[',
+ children = {
+ {
+ fmtn('DictLiteral', '-di', ':0:10: {'),
+ children = {
+ {
+ 'Colon:0:16::',
+ children = {
+ {
+ 'ComplexIdentifier:0:13:',
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:12:b',
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:13:{'),
+ children = {
+ 'Integer(val=3):0:14:3',
+ },
+ },
+ },
+ },
+ 'Integer(val=4):0:17: 4',
+ },
+ },
+ },
+ },
+ 'Integer(val=5):0:21:5',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Curly', '{'),
+ hl('Number', '1'),
+ hl('Curly', '}'),
+ hl('ConcatOrSubscript', '.'),
+ hl('IdentifierKey', '2'),
+ hl('SubscriptBracket', '['),
+ hl('Lambda', '{'),
+ hl('Arrow', '->'),
+ hl('Dict', '{', 1),
+ hl('IdentifierName', 'b'),
+ hl('Curly', '{'),
+ hl('Number', '3'),
+ hl('Curly', '}'),
+ hl('Colon', ':'),
+ hl('Number', '4', 1),
+ hl('Dict', '}'),
+ hl('SubscriptBracket', '['),
+ hl('Number', '5'),
+ hl('SubscriptBracket', ']'),
+ hl('Lambda', '}'),
+ hl('CallingParenthesis', '('),
+ hl('CallingParenthesis', ')'),
+ hl('SubscriptBracket', ']'),
+ })
+
+ check_asgn_parsing('a', {
+ -- 0
+ ast = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ })
+
+ check_asgn_parsing('{a}', {
+ -- 012
+ ast = {
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:0:{'),
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ },
+ },
+ },
+ }, {
+ hl('FigureBrace', '{'),
+ hl('IdentifierName', 'a'),
+ hl('Curly', '}'),
+ })
+
+ check_asgn_parsing('{a}b', {
+ -- 0123
+ ast = {
+ {
+ 'ComplexIdentifier:0:3:',
+ children = {
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:0:{'),
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ },
+ },
+ 'PlainIdentifier(scope=0,ident=b):0:3:b',
+ },
+ },
+ },
+ }, {
+ hl('FigureBrace', '{'),
+ hl('IdentifierName', 'a'),
+ hl('Curly', '}'),
+ hl('IdentifierName', 'b'),
+ })
+
+ check_asgn_parsing('a{b}c', {
+ -- 01234
+ ast = {
+ {
+ 'ComplexIdentifier:0:1:',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ 'ComplexIdentifier:0:4:',
+ children = {
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:1:{'),
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:2:b',
+ },
+ },
+ 'PlainIdentifier(scope=0,ident=c):0:4:c',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Curly', '{'),
+ hl('IdentifierName', 'b'),
+ hl('Curly', '}'),
+ hl('IdentifierName', 'c'),
+ })
+
+ check_asgn_parsing('a{b}c[0]', {
+ -- 01234567
+ ast = {
+ {
+ 'Subscript:0:5:[',
+ children = {
+ {
+ 'ComplexIdentifier:0:1:',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ 'ComplexIdentifier:0:4:',
+ children = {
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:1:{'),
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:2:b',
+ },
+ },
+ 'PlainIdentifier(scope=0,ident=c):0:4:c',
+ },
+ },
+ },
+ },
+ 'Integer(val=0):0:6:0',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Curly', '{'),
+ hl('IdentifierName', 'b'),
+ hl('Curly', '}'),
+ hl('IdentifierName', 'c'),
+ hl('SubscriptBracket', '['),
+ hl('Number', '0'),
+ hl('SubscriptBracket', ']'),
+ })
+
+ check_asgn_parsing('a{b}c.0', {
+ -- 0123456
+ ast = {
+ {
+ 'ConcatOrSubscript:0:5:.',
+ children = {
+ {
+ 'ComplexIdentifier:0:1:',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ {
+ 'ComplexIdentifier:0:4:',
+ children = {
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:1:{'),
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:2:b',
+ },
+ },
+ 'PlainIdentifier(scope=0,ident=c):0:4:c',
+ },
+ },
+ },
+ },
+ 'PlainKey(key=0):0:6:0',
+ },
+ },
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('Curly', '{'),
+ hl('IdentifierName', 'b'),
+ hl('Curly', '}'),
+ hl('IdentifierName', 'c'),
+ hl('ConcatOrSubscript', '.'),
+ hl('IdentifierKey', '0'),
+ })
+
+ check_asgn_parsing('[a{b}c[0].0]', {
+ -- 012345678901
+ -- 0 1
+ ast = {
+ {
+ 'ListLiteral:0:0:[',
+ children = {
+ {
+ 'ConcatOrSubscript:0:9:.',
+ children = {
+ {
+ 'Subscript:0:6:[',
+ children = {
+ {
+ 'ComplexIdentifier:0:2:',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ {
+ 'ComplexIdentifier:0:5:',
+ children = {
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:2:{'),
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:3:b',
+ },
+ },
+ 'PlainIdentifier(scope=0,ident=c):0:5:c',
+ },
+ },
+ },
+ },
+ 'Integer(val=0):0:7:0',
+ },
+ },
+ 'PlainKey(key=0):0:10:0',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('List', '['),
+ hl('IdentifierName', 'a'),
+ hl('Curly', '{'),
+ hl('IdentifierName', 'b'),
+ hl('Curly', '}'),
+ hl('IdentifierName', 'c'),
+ hl('SubscriptBracket', '['),
+ hl('Number', '0'),
+ hl('SubscriptBracket', ']'),
+ hl('ConcatOrSubscript', '.'),
+ hl('IdentifierKey', '0'),
+ hl('List', ']'),
+ })
+
+ check_asgn_parsing('{a}{b}', {
+ -- 012345
+ ast = {
+ {
+ 'ComplexIdentifier:0:3:',
+ children = {
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:0:{'),
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ },
+ },
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:3:{'),
+ children = {
+ 'PlainIdentifier(scope=0,ident=b):0:4:b',
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('FigureBrace', '{'),
+ hl('IdentifierName', 'a'),
+ hl('Curly', '}'),
+ hl('Curly', '{'),
+ hl('IdentifierName', 'b'),
+ hl('Curly', '}'),
+ })
+
+ check_asgn_parsing('a.b{c}{d}', {
+ -- 012345678
+ ast = {
+ {
+ 'OpMissing:0:3:',
+ children = {
+ {
+ 'ConcatOrSubscript:0:1:.',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:0:a',
+ 'PlainKey(key=b):0:2:b',
+ },
+ },
+ {
+ 'ComplexIdentifier:0:6:',
+ children = {
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:3:{'),
+ children = {
+ 'PlainIdentifier(scope=0,ident=c):0:4:c',
+ },
+ },
+ {
+ fmtn('CurlyBracesIdentifier', '--i', ':0:6:{'),
+ children = {
+ 'PlainIdentifier(scope=0,ident=d):0:7:d',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '{c}{d}',
+ msg = 'E15: Missing operator: %.*s',
+ },
+ }, {
+ hl('IdentifierName', 'a'),
+ hl('ConcatOrSubscript', '.'),
+ hl('IdentifierKey', 'b'),
+ hl('InvalidFigureBrace', '{'),
+ hl('IdentifierName', 'c'),
+ hl('Curly', '}'),
+ hl('Curly', '{'),
+ hl('IdentifierName', 'd'),
+ hl('Curly', '}'),
+ })
+
+ check_asgn_parsing('[a] = 1', {
+ -- 0123456
+ ast = {
+ {
+ 'Assignment(Plain):0:3: =',
+ children = {
+ {
+ 'ListLiteral:0:0:[',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ },
+ },
+ 'Integer(val=1):0:5: 1',
+ },
+ },
+ },
+ }, {
+ hl('List', '['),
+ hl('IdentifierName', 'a'),
+ hl('List', ']'),
+ hl('PlainAssignment', '=', 1),
+ hl('Number', '1', 1),
+ })
+
+ check_asgn_parsing('[a[b], [c, [d, [e]]]] = 1', {
+ -- 0123456789012345678901234
+ -- 0 1 2
+ ast = {
+ {
+ 'Assignment(Plain):0:21: =',
+ children = {
+ {
+ 'ListLiteral:0:0:[',
+ children = {
+ {
+ 'Comma:0:5:,',
+ children = {
+ {
+ 'Subscript:0:2:[',
+ children = {
+ 'PlainIdentifier(scope=0,ident=a):0:1:a',
+ 'PlainIdentifier(scope=0,ident=b):0:3:b',
+ },
+ },
+ {
+ 'ListLiteral:0:6: [',
+ children = {
+ {
+ 'Comma:0:9:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=c):0:8:c',
+ {
+ 'ListLiteral:0:10: [',
+ children = {
+ {
+ 'Comma:0:13:,',
+ children = {
+ 'PlainIdentifier(scope=0,ident=d):0:12:d',
+ {
+ 'ListLiteral:0:14: [',
+ children = {
+ 'PlainIdentifier(scope=0,ident=e):0:16:e',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ 'Integer(val=1):0:23: 1',
+ },
+ },
+ },
+ err = {
+ arg = '[c, [d, [e]]]] = 1',
+ msg = 'E475: Nested lists not allowed when assigning: %.*s',
+ },
+ }, {
+ hl('List', '['),
+ hl('IdentifierName', 'a'),
+ hl('SubscriptBracket', '['),
+ hl('IdentifierName', 'b'),
+ hl('SubscriptBracket', ']'),
+ hl('Comma', ','),
+ hl('InvalidList', '[', 1),
+ hl('IdentifierName', 'c'),
+ hl('Comma', ','),
+ hl('InvalidList', '[', 1),
+ hl('IdentifierName', 'd'),
+ hl('Comma', ','),
+ hl('InvalidList', '[', 1),
+ hl('IdentifierName', 'e'),
+ hl('List', ']'),
+ hl('List', ']'),
+ hl('List', ']'),
+ hl('List', ']'),
+ hl('PlainAssignment', '=', 1),
+ hl('Number', '1', 1),
+ })
+
+ check_asgn_parsing('$X += 1', {
+ -- 0123456
+ ast = {
+ {
+ 'Assignment(Add):0:2: +=',
+ children = {
+ 'Environment(ident=X):0:0:$X',
+ 'Integer(val=1):0:5: 1',
+ },
+ },
+ },
+ }, {
+ hl('EnvironmentSigil', '$'),
+ hl('EnvironmentName', 'X'),
+ hl('AssignmentWithAddition', '+=', 1),
+ hl('Number', '1', 1),
+ })
+
+ check_asgn_parsing('@a .= 1', {
+ -- 0123456
+ ast = {
+ {
+ 'Assignment(Concat):0:2: .=',
+ children = {
+ 'Register(name=a):0:0:@a',
+ 'Integer(val=1):0:5: 1',
+ },
+ },
+ },
+ }, {
+ hl('Register', '@a'),
+ hl('AssignmentWithConcatenation', '.=', 1),
+ hl('Number', '1', 1),
+ })
+
+ check_asgn_parsing('&option -= 1', {
+ -- 012345678901
+ -- 0 1
+ ast = {
+ {
+ 'Assignment(Subtract):0:7: -=',
+ children = {
+ 'Option(scope=0,ident=option):0:0:&option',
+ 'Integer(val=1):0:10: 1',
+ },
+ },
+ },
+ }, {
+ hl('OptionSigil', '&'),
+ hl('OptionName', 'option'),
+ hl('AssignmentWithSubtraction', '-=', 1),
+ hl('Number', '1', 1),
+ })
+
+ check_asgn_parsing('[$X, @a, &l:option] = [1, 2, 3]', {
+ -- 0123456789012345678901234567890
+ -- 0 1 2 3
+ ast = {
+ {
+ 'Assignment(Plain):0:19: =',
+ children = {
+ {
+ 'ListLiteral:0:0:[',
+ children = {
+ {
+ 'Comma:0:3:,',
+ children = {
+ 'Environment(ident=X):0:1:$X',
+ {
+ 'Comma:0:7:,',
+ children = {
+ 'Register(name=a):0:4: @a',
+ 'Option(scope=l,ident=option):0:8: &l:option',
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ 'ListLiteral:0:21: [',
+ children = {
+ {
+ 'Comma:0:24:,',
+ children = {
+ 'Integer(val=1):0:23:1',
+ {
+ 'Comma:0:27:,',
+ children = {
+ 'Integer(val=2):0:25: 2',
+ 'Integer(val=3):0:28: 3',
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }, {
+ hl('List', '['),
+ hl('EnvironmentSigil', '$'),
+ hl('EnvironmentName', 'X'),
+ hl('Comma', ','),
+ hl('Register', '@a', 1),
+ hl('Comma', ','),
+ hl('OptionSigil', '&', 1),
+ hl('OptionScope', 'l'),
+ hl('OptionScopeDelimiter', ':'),
+ hl('OptionName', 'option'),
+ hl('List', ']'),
+ hl('PlainAssignment', '=', 1),
+ hl('List', '[', 1),
+ hl('Number', '1'),
+ hl('Comma', ','),
+ hl('Number', '2', 1),
+ hl('Comma', ','),
+ hl('Number', '3', 1),
+ hl('List', ']'),
+ })
+ end)
+ itp('works with non-ASCII characters', function()
+ check_parsing('"ยซยป"ยซยป', {
+ -- 013568
+ ast = {
+ {
+ 'OpMissing:0:6:',
+ children = {
+ 'DoubleQuotedString(val="ยซยป"):0:0:"ยซยป"',
+ {
+ 'ComplexIdentifier:0:8:',
+ children = {
+ 'PlainIdentifier(scope=0,ident=ยซ):0:6:ยซ',
+ 'PlainIdentifier(scope=0,ident=ยป):0:8:ยป',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = 'ยซยป',
+ msg = 'E15: Unidentified character: %.*s',
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedBody', 'ยซยป'),
+ hl('DoubleQuote', '"'),
+ hl('InvalidIdentifierName', 'ยซ'),
+ hl('InvalidIdentifierName', 'ยป'),
+ }, {
+ [1] = {
+ ast = {
+ ast = {
+ 'DoubleQuotedString(val="ยซยป"):0:0:"ยซยป"',
+ },
+ len = 6,
+ },
+ hl_fs = {
+ [5] = REMOVE_THIS,
+ [4] = REMOVE_THIS,
+ },
+ },
+ })
+ check_parsing('"\192"\192"foo"', {
+ -- 01 23 45678
+ ast = {
+ {
+ 'OpMissing:0:3:',
+ children = {
+ 'DoubleQuotedString(val="\192"):0:0:"\192"',
+ {
+ 'OpMissing:0:4:',
+ children = {
+ 'PlainIdentifier(scope=0,ident=\192):0:3:\192',
+ 'DoubleQuotedString(val="foo"):0:4:"foo"',
+ },
+ },
+ },
+ },
+ },
+ err = {
+ arg = '\192"foo"',
+ msg = 'E15: Unidentified character: %.*s',
+ },
+ }, {
+ hl('DoubleQuote', '"'),
+ hl('DoubleQuotedBody', '\192'),
+ hl('DoubleQuote', '"'),
+ hl('InvalidIdentifierName', '\192'),
+ hl('InvalidDoubleQuote', '"'),
+ hl('InvalidDoubleQuotedBody', 'foo'),
+ hl('InvalidDoubleQuote', '"'),
+ }, {
+ [1] = {
+ ast = {
+ ast = {
+ 'DoubleQuotedString(val="\192"):0:0:"\192"',
+ },
+ len = 3,
+ },
+ hl_fs = {
+ [4] = REMOVE_THIS,
+ [5] = REMOVE_THIS,
+ [6] = REMOVE_THIS,
+ [7] = REMOVE_THIS,
+ },
+ },
+ })
+ end)
+end
diff --git a/test/unit/viml/helpers.lua b/test/unit/viml/helpers.lua
new file mode 100644
index 0000000000..9d8102e023
--- /dev/null
+++ b/test/unit/viml/helpers.lua
@@ -0,0 +1,130 @@
+local helpers = require('test.unit.helpers')(nil)
+
+local ffi = helpers.ffi
+local cimport = helpers.cimport
+local kvi_new = helpers.kvi_new
+local kvi_init = helpers.kvi_init
+local conv_enum = helpers.conv_enum
+local make_enum_conv_tab = helpers.make_enum_conv_tab
+
+local lib = cimport('./src/nvim/viml/parser/expressions.h')
+
+local function new_pstate(strings)
+ local strings_idx = 0
+ local function get_line(_, ret_pline)
+ strings_idx = strings_idx + 1
+ local str = strings[strings_idx]
+ local data, size
+ if type(str) == 'string' then
+ data = str
+ size = #str
+ elseif type(str) == 'nil' then
+ data = nil
+ size = 0
+ elseif type(str) == 'table' then
+ data = str.data
+ size = str.size
+ elseif type(str) == 'function' then
+ data, size = str()
+ size = size or 0
+ end
+ ret_pline.data = data
+ ret_pline.size = size
+ ret_pline.allocated = false
+ end
+ local state = {
+ reader = {
+ get_line = get_line,
+ cookie = nil,
+ conv = {
+ vc_type = 0,
+ vc_factor = 1,
+ vc_fail = false,
+ },
+ },
+ pos = { line = 0, col = 0 },
+ colors = kvi_new('ParserHighlight'),
+ can_continuate = false,
+ }
+ local ret = ffi.new('ParserState', state)
+ kvi_init(ret.reader.lines)
+ kvi_init(ret.stack)
+ return ret
+end
+
+local function pline2lua(pline)
+ return ffi.string(pline.data, pline.size)
+end
+
+local function pstate_str(pstate, start, len)
+ local str = nil
+ local err = nil
+ if start.line < pstate.reader.lines.size then
+ local pstr = pline2lua(pstate.reader.lines.items[start.line])
+ if start.col >= #pstr then
+ err = 'start.col >= #pstr'
+ else
+ str = pstr:sub(tonumber(start.col) + 1, tonumber(start.col + len))
+ end
+ else
+ err = 'start.line >= pstate.reader.lines.size'
+ end
+ return str, err
+end
+
+local function pstate_set_str(pstate, start, len, ret)
+ ret = ret or {}
+ ret.start = {
+ line = tonumber(start.line),
+ col = tonumber(start.col)
+ }
+ ret.len = tonumber(len)
+ ret.str, ret.error = pstate_str(pstate, start, len)
+ return ret
+end
+
+local eltkn_cmp_type_tab
+make_enum_conv_tab(lib, {
+ 'kExprCmpEqual',
+ 'kExprCmpMatches',
+ 'kExprCmpGreater',
+ 'kExprCmpGreaterOrEqual',
+ 'kExprCmpIdentical',
+}, 'kExprCmp', function(ret) eltkn_cmp_type_tab = ret end)
+
+local function conv_cmp_type(typ)
+ return conv_enum(eltkn_cmp_type_tab, typ)
+end
+
+local ccs_tab
+make_enum_conv_tab(lib, {
+ 'kCCStrategyUseOption',
+ 'kCCStrategyMatchCase',
+ 'kCCStrategyIgnoreCase',
+}, 'kCCStrategy', function(ret) ccs_tab = ret end)
+
+local function conv_ccs(ccs)
+ return conv_enum(ccs_tab, ccs)
+end
+
+local expr_asgn_type_tab
+make_enum_conv_tab(lib, {
+ 'kExprAsgnPlain',
+ 'kExprAsgnAdd',
+ 'kExprAsgnSubtract',
+ 'kExprAsgnConcat',
+}, 'kExprAsgn', function(ret) expr_asgn_type_tab = ret end)
+
+local function conv_expr_asgn_type(expr_asgn_type)
+ return conv_enum(expr_asgn_type_tab, expr_asgn_type)
+end
+
+return {
+ conv_ccs = conv_ccs,
+ pline2lua = pline2lua,
+ pstate_str = pstate_str,
+ new_pstate = new_pstate,
+ conv_cmp_type = conv_cmp_type,
+ pstate_set_str = pstate_set_str,
+ conv_expr_asgn_type = conv_expr_asgn_type,
+}
diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt
index 9fc1b2eb36..015b3ecbd4 100644
--- a/third-party/CMakeLists.txt
+++ b/third-party/CMakeLists.txt
@@ -1,10 +1,26 @@
# This is not meant to be included by the top-level.
-cmake_minimum_required (VERSION 2.8.7)
-project(NEOVIM_DEPS)
+cmake_minimum_required (VERSION 2.8.12)
+project(NVIM_DEPS)
+
+# Needed for: check_c_compiler_flag()
+include(CheckCCompilerFlag)
# Point CMake at any custom modules we may ship
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
+# In Windows/MSVC CMAKE_BUILD_TYPE changes the paths/linking of the build
+# recipes (libuv, msgpack), make sure it is set
+if(NOT CMAKE_BUILD_TYPE)
+ set(CMAKE_BUILD_TYPE Release)
+endif()
+
+set(DEFAULT_MAKE_CFLAGS CFLAGS+=-g)
+
+check_c_compiler_flag(-Og HAS_OG_FLAG)
+if(HAS_OG_FLAG)
+ set(DEFAULT_MAKE_CFLAGS CFLAGS+=-Og ${DEFAULT_MAKE_CFLAGS})
+endif()
+
set(DEPS_INSTALL_DIR "${CMAKE_BINARY_DIR}/usr" CACHE PATH "Dependencies install directory.")
set(DEPS_BIN_DIR "${DEPS_INSTALL_DIR}/bin" CACHE PATH "Dependencies binary install directory.")
set(DEPS_LIB_DIR "${DEPS_INSTALL_DIR}/lib" CACHE PATH "Dependencies library install directory.")
@@ -13,6 +29,7 @@ set(DEPS_DOWNLOAD_DIR "${DEPS_BUILD_DIR}/downloads" CACHE PATH "Dependencies dow
option(USE_BUNDLED "Use bundled dependencies." ON)
+option(USE_BUNDLED_GPERF "Use the bundled version of gperf." ${USE_BUNDLED})
option(USE_BUNDLED_JEMALLOC "Use the bundled jemalloc." ${USE_BUNDLED})
option(USE_BUNDLED_UNIBILIUM "Use the bundled unibilium." ${USE_BUNDLED})
option(USE_BUNDLED_LIBTERMKEY "Use the bundled libtermkey." ${USE_BUNDLED})
@@ -26,8 +43,23 @@ option(USE_BUNDLED_LUV "Use the bundled version of luv." ${USE_BUNDLED})
# build it unless explicitly requested
option(USE_BUNDLED_LUA "Use the bundled version of lua." OFF)
+if(USE_BUNDLED AND MSVC)
+ option(USE_BUNDLED_GETTEXT "Use the bundled version of gettext." ON)
+ option(USE_BUNDLED_LIBICONV "Use the bundled version of libiconv." ON)
+else()
+ option(USE_BUNDLED_GETTEXT "Use the bundled version of gettext." OFF)
+ option(USE_BUNDLED_LIBICONV "Use the bundled version of libiconv." OFF)
+endif()
+
option(USE_EXISTING_SRC_DIR "Skip download of deps sources in case of existing source directory." OFF)
+if(WIN32)
+ find_package(Git)
+ if(NOT Git_FOUND)
+ message(FATAL_ERROR "Git is required to apply patches for Windows.")
+ endif()
+endif()
+
if(UNIX)
find_program(MAKE_PRG NAMES gmake make)
if(MAKE_PRG)
@@ -51,12 +83,25 @@ if(CMAKE_GENERATOR MATCHES "Makefiles")
set(MAKE_PRG "$(MAKE)")
endif()
+if(MINGW AND CMAKE_GENERATOR MATCHES "Ninja")
+ find_program(MAKE_PRG NAMES mingw32-make)
+ if(NOT MAKE_PRG)
+ message(FATAL_ERROR "GNU Make for mingw32 is required to build the dependecies.")
+ else()
+ message(STATUS "Found GNU Make for mingw32: ${MAKE_PRG}")
+ endif()
+endif()
+
if(CMAKE_C_COMPILER_ARG1)
set(DEPS_C_COMPILER "${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}")
else()
set(DEPS_C_COMPILER "${CMAKE_C_COMPILER}")
endif()
+if(CMAKE_OSX_SYSROOT)
+ set(DEPS_C_COMPILER "${DEPS_C_COMPILER} -isysroot${CMAKE_OSX_SYSROOT}")
+endif()
+
# Cross compiling: use these for dependencies built for the
# HOST system, when not crosscompiling these should be the
# same as DEPS_*. Except when targeting Unix in which case
@@ -75,35 +120,65 @@ endif()
include(ExternalProject)
-set(LIBUV_URL https://github.com/libuv/libuv/archive/v1.8.0.tar.gz)
-set(LIBUV_SHA256 906e1a5c673c95cb261adeacdb7308a65b4a8f7c9c50d85f3021364951fa9cde)
+if(WIN32)
+ set(LIBUV_URL https://github.com/neovim/libuv/archive/0ed7feb71ca949f7a96ccb102481d17ea1bb5933.tar.gz)
+ set(LIBUV_SHA256 813fe763022f19878557c6fde311b6394fb9180caaaab0dd98d8704732234508)
+else()
+ set(LIBUV_URL https://github.com/libuv/libuv/archive/v1.23.2.tar.gz)
+ set(LIBUV_SHA256 30af979c4f4b8d1b895ae6d115f7400c751542ccb9e656350fc89fda08d4eabd)
+endif()
+
+set(MSGPACK_URL https://github.com/msgpack/msgpack-c/releases/download/cpp-3.0.0/msgpack-3.0.0.tar.gz)
+set(MSGPACK_SHA256 bfbb71b7c02f806393bc3cbc491b40523b89e64f83860c58e3e54af47de176e4)
+
+set(LUAJIT_URL https://github.com/LuaJIT/LuaJIT/archive/7dbf0b05f1228c1c719866db5e5f3d58f87f74c8.tar.gz)
+set(LUAJIT_SHA256 cbae019b5e396164eb5f0d07777b55cc03931bb944f83c61a010c053c9f5fd5b)
+
+set(LUA_URL https://www.lua.org/ftp/lua-5.1.5.tar.gz)
+set(LUA_SHA256 2640fc56a795f29d28ef15e13c34a47e223960b0240e8cb0a82d9b0738695333)
+
+# NOTE: Version must match LUAROCKS_VERSION in third-party/cmake/BuildLuarocks.cmake
+set(LUAROCKS_URL https://github.com/luarocks/luarocks/archive/v2.4.4.tar.gz)
+set(LUAROCKS_SHA256 9eb3d0738fd02ad8bf39bcedccac4e83e9b5fff2bcca247c3584b925b2075d9c)
+
+set(UNIBILIUM_URL https://github.com/mauke/unibilium/archive/v2.0.0.tar.gz)
+set(UNIBILIUM_SHA256 78997d38d4c8177c60d3d0c1aa8c53fd0806eb21825b7b335b1768d7116bc1c1)
+
+set(LIBTERMKEY_URL http://www.leonerd.org.uk/code/libtermkey/libtermkey-0.20.tar.gz)
+set(LIBTERMKEY_SHA256 6c0d87c94ab9915e76ecd313baec08dedf3bd56de83743d9aa923a081935d2f5)
-set(MSGPACK_URL https://github.com/msgpack/msgpack-c/archive/cpp-1.0.0.tar.gz)
-set(MSGPACK_SHA256 afda64ca445203bb7092372b822bae8b2539fdcebbfc3f753f393628c2bcfe7d)
+set(LIBVTERM_URL https://github.com/neovim/libvterm/archive/3f62ac6b7bdffda39d68f723fb1806dfd6d6382d.tar.gz)
+set(LIBVTERM_SHA256 1c8b318370f00f831f43e3ec86a48984250e3ee5c76beb106a421c9a42286ac5)
-set(LUAJIT_URL https://github.com/neovim/deps/raw/master/opt/LuaJIT-2.0.4.tar.gz)
-set(LUAJIT_SHA256 620fa4eb12375021bef6e4f237cbd2dd5d49e56beb414bee052c746beef1807d)
+set(JEMALLOC_URL https://github.com/jemalloc/jemalloc/releases/download/4.5.0/jemalloc-4.5.0.tar.bz2)
+set(JEMALLOC_SHA256 9409d85664b4f135b77518b0b118c549009dc10f6cba14557d170476611f6780)
-set(LUA_URL https://github.com/lua/lua/archive/5.1.5.tar.gz)
-set(LUA_SHA256 1cd642c4c39778306a14e62ccddace5c7a4fb2257b0b06f43bc81cf305c7415f)
+set(LUV_URL https://github.com/luvit/luv/archive/1.9.1-1.tar.gz)
+set(LUV_SHA256 562b9efaad30aa051a40eac9ade0c3df48bb8186763769abe47ec3fb3edb1268)
-set(LUAROCKS_URL https://github.com/keplerproject/luarocks/archive/5d8a16526573b36d5b22aa74866120c998466697.tar.gz)
-set(LUAROCKS_SHA256 cae709111c5701235770047dfd7169f66b82ae1c7b9b79207f9df0afb722bfd9)
+set(GPERF_URL https://github.com/neovim/deps/raw/ff5b4b18a87397a8564016071ae64f64bcd8c635/opt/gperf-3.1.tar.gz)
+set(GPERF_SHA256 588546b945bba4b70b6a3a616e80b4ab466e3f33024a352fc2198112cdbb3ae2)
-set(UNIBILIUM_URL https://github.com/mauke/unibilium/archive/v1.2.0.tar.gz)
-set(UNIBILIUM_SHA256 623af1099515e673abfd3cae5f2fa808a09ca55dda1c65a7b5c9424eb304ead8)
+# 7za.exe cat.exe curl.exe ca-bundle.crt diff.exe tee.exe tidy.exe xxd.exe
+set(WINTOOLS_URL https://github.com/neovim/deps/raw/2f9acbecf06365c10baa3c0087f34a54c9c6f949/opt/win32tools.zip)
+set(WINTOOLS_SHA256 8bfce7e3a365721a027ce842f2ec1cf878f1726233c215c05964aac07300798c)
-set(LIBTERMKEY_URL http://www.leonerd.org.uk/code/libtermkey/libtermkey-0.18.tar.gz)
-set(LIBTERMKEY_SHA256 239746de41c845af52bb3c14055558f743292dd6c24ac26c2d6567a5a6093926)
+set(WINGUI_URL https://github.com/equalsraf/neovim-qt/releases/download/v0.2.12/neovim-qt.zip)
+set(WINGUI_SHA256 68f8d7d46e21c94ac24577bc65d378c5f622794d11d34950e41edc1b0335560c)
-set(LIBVTERM_URL https://github.com/neovim/libvterm/archive/a9c7c6fd20fa35e0ad3e0e98901ca12dfca9c25c.tar.gz)
-set(LIBVTERM_SHA256 1a4272be91d9614dc183a503786df83b6584e4afaab7feaaa5409f841afbd796)
+set(WIN32YANK_X86_URL https://github.com/equalsraf/win32yank/releases/download/v0.0.4/win32yank-x86.zip)
+set(WIN32YANK_X86_SHA256 62f34e5a46c5d4a7b3f3b512e1ff7b77fedd432f42581cbe825233a996eed62c)
+set(WIN32YANK_X86_64_URL https://github.com/equalsraf/win32yank/releases/download/v0.0.4/win32yank-x64.zip)
+set(WIN32YANK_X86_64_SHA256 33a747a92da60fb65e668edbf7661d3d902411a2d545fe9dc08623cecd142a20)
-set(JEMALLOC_URL https://github.com/jemalloc/jemalloc/releases/download/4.2.1/jemalloc-4.2.1.tar.bz2)
-set(JEMALLOC_SHA256 5630650d5c1caab95d2f0898de4fe5ab8519dc680b04963b38bb425ef6a42d57)
+set(WINPTY_URL https://github.com/rprichard/winpty/releases/download/0.4.3/winpty-0.4.3-msvc2015.zip)
+set(WINPTY_SHA256 35a48ece2ff4acdcbc8299d4920de53eb86b1fb41e64d2fe5ae7898931bcee89)
-set(LUV_URL https://github.com/luvit/luv/archive/146f1ce4c08c3b67f604c9ee1e124b1cf5c15cf3.tar.gz)
-set(LUV_SHA256 3d537f8eb9fa5adb146a083eae22af886aee324ec268e2aa0fa75f2f1c52ca7a)
+set(GETTEXT_URL https://ftp.gnu.org/pub/gnu/gettext/gettext-0.19.8.1.tar.gz)
+set(GETTEXT_SHA256 ff942af0e438ced4a8b0ea4b0b6e0d6d657157c5e2364de57baa279c1c125c43)
+
+set(LIBICONV_URL https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz)
+set(LIBICONV_SHA256 ccf536620a45458d26ba83887a983b96827001e92a13847b45e4925cc8913178)
if(USE_BUNDLED_UNIBILIUM)
include(BuildUnibilium)
@@ -145,6 +220,51 @@ if(USE_BUNDLED_LUV)
include(BuildLuv)
endif()
+if(USE_BUNDLED_GPERF)
+ include(BuildGperf)
+endif()
+
+if(USE_BUNDLED_GETTEXT)
+ include(BuildGettext)
+endif()
+
+if(USE_BUNDLED_LIBICONV)
+ include(BuildLibiconv)
+endif()
+
+include(GetBinaryDeps)
+
+if(WIN32)
+ GetBinaryDep(TARGET wintools
+ INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_directory . ${DEPS_INSTALL_DIR}/bin)
+
+ GetBinaryDep(TARGET wingui
+ INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_directory bin ${DEPS_INSTALL_DIR}/bin
+ COMMAND ${CMAKE_COMMAND} -E copy_directory share ${DEPS_INSTALL_DIR}/share)
+
+ include(TargetArch)
+ GetBinaryDep(TARGET "win32yank_${TARGET_ARCH}"
+ INSTALL_COMMAND ${CMAKE_COMMAND} -E copy win32yank.exe ${DEPS_INSTALL_DIR}/bin)
+
+ if("${TARGET_ARCH}" STREQUAL "X86_64")
+ set(TARGET_ARCH x64)
+ elseif(TARGET_ARCH STREQUAL "X86")
+ set(TARGET_ARCH ia32)
+ endif()
+
+ GetBinaryDep(TARGET winpty
+ INSTALL_COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/bin
+ COMMAND ${CMAKE_COMMAND} -DFROM_GLOB=${DEPS_BUILD_DIR}/src/winpty/${TARGET_ARCH}/bin/*
+ -DTO=${DEPS_INSTALL_DIR}/bin/
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/CopyFilesGlob.cmake
+ COMMAND ${CMAKE_COMMAND} -DFROM_GLOB=${DEPS_BUILD_DIR}/src/winpty/include/*
+ -DTO=${DEPS_INSTALL_DIR}/include/
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/CopyFilesGlob.cmake
+ COMMAND ${CMAKE_COMMAND} -DFROM_GLOB=${DEPS_BUILD_DIR}/src/winpty/${TARGET_ARCH}/lib/*
+ -DTO=${DEPS_INSTALL_DIR}/lib/
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/CopyFilesGlob.cmake)
+endif()
+
add_custom_target(clean-shared-libraries
COMMAND ${CMAKE_COMMAND}
-DREMOVE_FILE_GLOB=${DEPS_INSTALL_DIR}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}*${CMAKE_SHARED_LIBRARY_SUFFIX}*
diff --git a/third-party/README.md b/third-party/README.md
deleted file mode 100644
index c3ec399695..0000000000
--- a/third-party/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# Third party dependencies for neovim
-
-This directory contains the recipes to build any third party dependencies for
-neovim which, for one reason or another, we cannot rely on the system to supply.
-
-Most of the details are captured in the `CMakeLists.txt`, but we have a
-dedicated directory in case any of the dependencies requires patching and other
-support.
diff --git a/third-party/cmake/BuildGettext.cmake b/third-party/cmake/BuildGettext.cmake
new file mode 100644
index 0000000000..45264167a5
--- /dev/null
+++ b/third-party/cmake/BuildGettext.cmake
@@ -0,0 +1,40 @@
+if(MSVC)
+
+ ExternalProject_Add(gettext
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${GETTEXT_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/gettext
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/gettext
+ -DURL=${GETTEXT_URL}
+ -DEXPECTED_SHA256=${GETTEXT_SHA256}
+ -DTARGET=gettext
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ PATCH_COMMAND ${GIT_EXECUTABLE} -C ${DEPS_BUILD_DIR}/src/gettext init
+ COMMAND ${GIT_EXECUTABLE} -C ${DEPS_BUILD_DIR}/src/gettext apply --ignore-whitespace
+ ${CMAKE_CURRENT_SOURCE_DIR}/patches/gettext-Fix-compilation-on-a-system-without-alloca.patch
+ ${CMAKE_CURRENT_SOURCE_DIR}/patches/gettext-Fix-building-with-MSVC.patch
+ CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/GettextCMakeLists.txt
+ ${DEPS_BUILD_DIR}/src/gettext/CMakeLists.txt
+ COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/gettext
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ # Pass toolchain
+ -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN}
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
+ -DLIBICONV_INCLUDE_DIRS=${DEPS_INSTALL_DIR}/include
+ -DLIBICONV_LIBRARIES=${DEPS_LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}libcharset${CMAKE_STATIC_LIBRARY_SUFFIX}$<SEMICOLON>${DEPS_LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}libiconv${CMAKE_STATIC_LIBRARY_SUFFIX}
+ BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE}
+ INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE})
+
+else()
+ message(FATAL_ERROR "Trying to build gettext in an unsupported system ${CMAKE_SYSTEM_NAME}/${CMAKE_C_COMPILER_ID}")
+endif()
+
+list(APPEND THIRD_PARTY_DEPS gettext)
+if(USE_BUNDLED_LIBICONV)
+ add_dependencies(gettext libiconv)
+endif()
diff --git a/third-party/cmake/BuildGperf.cmake b/third-party/cmake/BuildGperf.cmake
new file mode 100644
index 0000000000..fa8b35f383
--- /dev/null
+++ b/third-party/cmake/BuildGperf.cmake
@@ -0,0 +1,63 @@
+# Gperf recipe. Gperf is only required when building Neovim, when
+# cross compiling we still want to build for the HOST system, whenever
+# writing a recipe that is meant for cross-compile, use the HOSTDEPS_* variables
+# instead of DEPS_* - check the main CMakeLists.txt for a list.
+
+# BuildGperf(CONFIGURE_COMMAND ... BUILD_COMMAND ... INSTALL_COMMAND ...)
+# Reusable function to build Gperf, wraps ExternalProject_Add.
+# Failing to pass a command argument will result in no command being run
+function(BuildGperf)
+ cmake_parse_arguments(_gperf
+ ""
+ ""
+ "CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND"
+ ${ARGN})
+
+ if(NOT _gperf_CONFIGURE_COMMAND AND NOT _gperf_BUILD_COMMAND
+ AND NOT _gperf_INSTALL_COMMAND)
+ message(FATAL_ERROR "Must pass at least one of CONFIGURE_COMMAND, BUILD_COMMAND, INSTALL_COMMAND")
+ endif()
+
+ ExternalProject_Add(gperf
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${GPERF_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/gperf
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/gperf
+ -DURL=${GPERF_URL}
+ -DEXPECTED_SHA256=${GPERF_SHA256}
+ -DTARGET=gperf
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ BUILD_IN_SOURCE 1
+ CONFIGURE_COMMAND "${_gperf_CONFIGURE_COMMAND}"
+ BUILD_COMMAND "${_gperf_BUILD_COMMAND}"
+ INSTALL_COMMAND "${_gperf_INSTALL_COMMAND}")
+endfunction()
+
+if(UNIX OR (MINGW AND CMAKE_CROSSCOMPILING))
+
+ BuildGperf(
+ CONFIGURE_COMMAND ${DEPS_BUILD_DIR}/src/gperf/configure
+ --prefix=${HOSTDEPS_INSTALL_DIR} MAKE=${MAKE_PRG}
+ INSTALL_COMMAND ${MAKE_PRG} install)
+
+elseif(MSVC OR MINGW)
+
+ BuildGperf(
+ CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/GperfCMakeLists.txt
+ ${DEPS_BUILD_DIR}/src/gperf/CMakeLists.txt
+ COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/gperf/CMakeLists.txt
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE}
+ INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE})
+
+else()
+ message(FATAL_ERROR "Trying to build gperf in an unsupported system ${CMAKE_SYSTEM_NAME}/${CMAKE_C_COMPILER_ID}")
+endif()
diff --git a/third-party/cmake/BuildLibiconv.cmake b/third-party/cmake/BuildLibiconv.cmake
new file mode 100644
index 0000000000..dc3d8fe4c3
--- /dev/null
+++ b/third-party/cmake/BuildLibiconv.cmake
@@ -0,0 +1,31 @@
+if(MSVC)
+
+ ExternalProject_Add(libiconv
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${LIBICONV_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/libiconv
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/libiconv
+ -DURL=${LIBICONV_URL}
+ -DEXPECTED_SHA256=${LIBICONV_SHA256}
+ -DTARGET=libiconv
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/LibiconvCMakeLists.txt
+ ${DEPS_BUILD_DIR}/src/libiconv/CMakeLists.txt
+ COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/libiconv
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ # Pass toolchain
+ -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN}
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
+ BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE}
+ INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE})
+
+else()
+ message(FATAL_ERROR "Trying to build libiconv in an unsupported system ${CMAKE_SYSTEM_NAME}/${CMAKE_C_COMPILER_ID}")
+endif()
+
+list(APPEND THIRD_PARTY_DEPS libiconv)
diff --git a/third-party/cmake/BuildLibtermkey.cmake b/third-party/cmake/BuildLibtermkey.cmake
index 57e14d36d3..0b56674ad2 100644
--- a/third-party/cmake/BuildLibtermkey.cmake
+++ b/third-party/cmake/BuildLibtermkey.cmake
@@ -1,7 +1,36 @@
if(WIN32)
- message(STATUS "Building libtermkey in Windows is not supported (skipping)")
- return()
-endif()
+ExternalProject_Add(libtermkey
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${LIBTERMKEY_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/libtermkey
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/libtermkey
+ -DURL=${LIBTERMKEY_URL}
+ -DEXPECTED_SHA256=${LIBTERMKEY_SHA256}
+ -DTARGET=libtermkey
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ PATCH_COMMAND ${GIT_EXECUTABLE} -C ${DEPS_BUILD_DIR}/src/libtermkey init
+ COMMAND ${GIT_EXECUTABLE} -C ${DEPS_BUILD_DIR}/src/libtermkey apply --ignore-whitespace
+ ${CMAKE_CURRENT_SOURCE_DIR}/patches/libtermkey-Add-support-for-Windows.patch
+ ${CMAKE_CURRENT_SOURCE_DIR}/patches/libtermkey-Fix-escape-sequences-for-MSVC.patch
+ CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/libtermkeyCMakeLists.txt
+ ${DEPS_BUILD_DIR}/src/libtermkey/CMakeLists.txt
+ COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/libtermkey
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ # Pass toolchain
+ -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN}
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ # Hack to avoid -rdynamic in Mingw
+ -DCMAKE_SHARED_LIBRARY_LINK_C_FLAGS=""
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
+ -DUNIBILIUM_INCLUDE_DIRS=${DEPS_INSTALL_DIR}/include
+ -DUNIBILIUM_LIBRARIES=${DEPS_LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}unibilium${CMAKE_STATIC_LIBRARY_SUFFIX}
+ BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE}
+ INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE})
+else()
find_package(PkgConfig REQUIRED)
ExternalProject_Add(libtermkey
@@ -9,13 +38,13 @@ ExternalProject_Add(libtermkey
URL ${LIBTERMKEY_URL}
DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/libtermkey
DOWNLOAD_COMMAND ${CMAKE_COMMAND}
- -DPREFIX=${DEPS_BUILD_DIR}
- -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/libtermkey
- -DURL=${LIBTERMKEY_URL}
- -DEXPECTED_SHA256=${LIBTERMKEY_SHA256}
- -DTARGET=libtermkey
- -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
- -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/libtermkey
+ -DURL=${LIBTERMKEY_URL}
+ -DEXPECTED_SHA256=${LIBTERMKEY_SHA256}
+ -DTARGET=libtermkey
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
CONFIGURE_COMMAND ""
BUILD_IN_SOURCE 1
BUILD_COMMAND ""
@@ -23,7 +52,9 @@ ExternalProject_Add(libtermkey
PREFIX=${DEPS_INSTALL_DIR}
PKG_CONFIG_PATH=${DEPS_LIB_DIR}/pkgconfig
CFLAGS=-fPIC
+ ${DEFAULT_MAKE_CFLAGS}
install)
+endif()
list(APPEND THIRD_PARTY_DEPS libtermkey)
add_dependencies(libtermkey unibilium)
diff --git a/third-party/cmake/BuildLibuv.cmake b/third-party/cmake/BuildLibuv.cmake
index 1d8d69e64e..c5f7d6d5ab 100644
--- a/third-party/cmake/BuildLibuv.cmake
+++ b/third-party/cmake/BuildLibuv.cmake
@@ -5,7 +5,7 @@ include(CMakeParseArguments)
# Failing to pass a command argument will result in no command being run
function(BuildLibuv)
cmake_parse_arguments(_libuv
- ""
+ "BUILD_IN_SOURCE"
"TARGET"
"CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND"
${ARGN})
@@ -30,6 +30,7 @@ function(BuildLibuv)
-DTARGET=${_libuv_TARGET}
-DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ BUILD_IN_SOURCE ${_libuv_BUILD_IN_SOURCE}
CONFIGURE_COMMAND "${_libuv_CONFIGURE_COMMAND}"
BUILD_COMMAND "${_libuv_BUILD_COMMAND}"
INSTALL_COMMAND "${_libuv_INSTALL_COMMAND}")
@@ -42,7 +43,7 @@ set(UNIX_CFGCMD sh ${DEPS_BUILD_DIR}/src/libuv/autogen.sh &&
if(UNIX)
BuildLibuv(
- CONFIGURE_COMMAND ${UNIX_CFGCMD}
+ CONFIGURE_COMMAND ${UNIX_CFGCMD} MAKE=${MAKE_PRG}
INSTALL_COMMAND ${MAKE_PRG} V=1 install)
elseif(MINGW AND CMAKE_CROSSCOMPILING)
@@ -56,27 +57,28 @@ elseif(MINGW AND CMAKE_CROSSCOMPILING)
CONFIGURE_COMMAND ${UNIX_CFGCMD} --host=${CROSS_TARGET}
INSTALL_COMMAND ${MAKE_PRG} V=1 install)
+elseif(WIN32)
-elseif(WIN32 AND MSVC)
-
- find_package(PythonInterp 2.6 REQUIRED)
- if(NOT PYTHONINTERP_FOUND OR PYTHON_VERSION_MAJOR GREATER 2)
- message(FATAL_ERROR "Python2 is required to build libuv on windows, use -DPYTHON_EXECUTABLE to set a python interpreter")
- endif()
-
- string(FIND ${CMAKE_GENERATOR} Win64 VS_WIN64)
- if(VS_WIN64 EQUAL -1)
- set(VS_ARCH x86)
+ set(UV_OUTPUT_DIR ${DEPS_BUILD_DIR}/src/libuv/${CMAKE_BUILD_TYPE})
+ if(MSVC)
+ set(BUILD_SHARED ON)
+ elseif(MINGW)
+ set(BUILD_SHARED OFF)
else()
- set(VS_ARCH x64)
+ message(FATAL_ERROR "Trying to build libuv in an unsupported system ${CMAKE_SYSTEM_NAME}/${CMAKE_C_COMPILER_ID}")
endif()
- BuildLibuv(
- # By default this creates Debug builds
- BUILD_COMMAND set PYTHON=${PYTHON_EXECUTABLE} COMMAND ${DEPS_BUILD_DIR}/src/libuv/vcbuild.bat static debug ${VS_ARCH}
- INSTALL_COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/lib
- COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/libuv/Debug/lib/libuv.lib ${DEPS_INSTALL_DIR}/lib
- COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/include
- COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPS_BUILD_DIR}/src/libuv/include ${DEPS_INSTALL_DIR}/include)
+ BuildLibUv(BUILD_IN_SOURCE
+ CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/LibuvCMakeLists.txt
+ ${DEPS_BUILD_DIR}/src/libuv/CMakeLists.txt
+ COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/libuv/CMakeLists.txt
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ -DBUILD_SHARED_LIBS=${BUILD_SHARED}
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE}
+ INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE})
else()
message(FATAL_ERROR "Trying to build libuv in an unsupported system ${CMAKE_SYSTEM_NAME}/${CMAKE_C_COMPILER_ID}")
diff --git a/third-party/cmake/BuildLibvterm.cmake b/third-party/cmake/BuildLibvterm.cmake
index ec9ba0d741..e4649986af 100644
--- a/third-party/cmake/BuildLibvterm.cmake
+++ b/third-party/cmake/BuildLibvterm.cmake
@@ -1,26 +1,70 @@
+include(CMakeParseArguments)
+
+# BuildLibvterm(CONFIGURE_COMMAND ... BUILD_COMMAND ... INSTALL_COMMAND ...)
+# Failing to pass a command argument will result in no command being run
+function(BuildLibvterm)
+ cmake_parse_arguments(_libvterm
+ ""
+ ""
+ "PATCH_COMMAND;CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND"
+ ${ARGN})
+
+ if(NOT _libvterm_CONFIGURE_COMMAND AND NOT _libvterm_BUILD_COMMAND
+ AND NOT _libvterm_INSTALL_COMMAND)
+ message(FATAL_ERROR "Must pass at least one of CONFIGURE_COMMAND, BUILD_COMMAND, INSTALL_COMMAND")
+ endif()
+
+ ExternalProject_Add(libvterm
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${LIBVTERM_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/libvterm
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/libvterm
+ -DURL=${LIBVTERM_URL}
+ -DEXPECTED_SHA256=${LIBVTERM_SHA256}
+ -DTARGET=libvterm
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ PATCH_COMMAND "${_libvterm_PATCH_COMMAND}"
+ CONFIGURE_COMMAND ""
+ BUILD_IN_SOURCE 1
+ CONFIGURE_COMMAND "${_libvterm_CONFIGURE_COMMAND}"
+ BUILD_COMMAND "${_libvterm_BUILD_COMMAND}"
+ INSTALL_COMMAND "${_libvterm_INSTALL_COMMAND}")
+endfunction()
+
if(WIN32)
- message(STATUS "Building libvterm in Windows is not supported (skipping)")
- return()
+ if(MSVC)
+ set(LIBVTERM_PATCH_COMMAND
+ ${GIT_EXECUTABLE} -C ${DEPS_BUILD_DIR}/src/libvterm init
+ COMMAND ${GIT_EXECUTABLE} -C ${DEPS_BUILD_DIR}/src/libvterm apply --ignore-whitespace
+ ${CMAKE_CURRENT_SOURCE_DIR}/patches/libvterm-Remove-VLAs-for-MSVC.patch)
+ endif()
+ set(LIBVTERM_CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/LibvtermCMakeLists.txt
+ ${DEPS_BUILD_DIR}/src/libvterm/CMakeLists.txt
+ COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Libvterm-tbl2inc_c.cmake
+ ${DEPS_BUILD_DIR}/src/libvterm/tbl2inc_c.cmake
+ COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/libvterm
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ "-DCMAKE_C_FLAGS:STRING=${CMAKE_C_COMPILER_ARG1} -fPIC"
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR})
+ set(LIBVTERM_BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE})
+ set(LIBVTERM_INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE})
+else()
+ set(LIBVTERM_INSTALL_COMMAND ${MAKE_PRG} CC=${DEPS_C_COMPILER}
+ PREFIX=${DEPS_INSTALL_DIR}
+ CFLAGS=-fPIC
+ ${DEFAULT_MAKE_CFLAGS}
+ install)
endif()
-ExternalProject_Add(libvterm
- PREFIX ${DEPS_BUILD_DIR}
- URL ${LIBVTERM_URL}
- DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/libvterm
- DOWNLOAD_COMMAND ${CMAKE_COMMAND}
- -DPREFIX=${DEPS_BUILD_DIR}
- -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/libvterm
- -DURL=${LIBVTERM_URL}
- -DEXPECTED_SHA256=${LIBVTERM_SHA256}
- -DTARGET=libvterm
- -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
- -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
- CONFIGURE_COMMAND ""
- BUILD_IN_SOURCE 1
- BUILD_COMMAND ""
- INSTALL_COMMAND ${MAKE_PRG} CC=${DEPS_C_COMPILER}
- PREFIX=${DEPS_INSTALL_DIR}
- CFLAGS=-fPIC
- install)
+BuildLibvterm(PATCH_COMMAND ${LIBVTERM_PATCH_COMMAND}
+ CONFIGURE_COMMAND ${LIBVTERM_CONFIGURE_COMMAND}
+ BUILD_COMMAND ${LIBVTERM_BUILD_COMMAND}
+ INSTALL_COMMAND ${LIBVTERM_INSTALL_COMMAND})
list(APPEND THIRD_PARTY_DEPS libvterm)
diff --git a/third-party/cmake/BuildLua.cmake b/third-party/cmake/BuildLua.cmake
index 1c5e2a186c..da617e3ccd 100644
--- a/third-party/cmake/BuildLua.cmake
+++ b/third-party/cmake/BuildLua.cmake
@@ -51,19 +51,33 @@ else()
endif()
endif()
+set(LUA_CFLAGS "-O0 -g3 -fPIC")
+set(LUA_LDFLAGS "")
+
+if(CLANG_ASAN_UBSAN)
+ set(LUA_CFLAGS "${LUA_CFLAGS} -fsanitize=address")
+ set(LUA_CFLAGS "${LUA_CFLAGS} -fno-omit-frame-pointer")
+ set(LUA_CFLAGS "${LUA_CFLAGS} -fno-optimize-sibling-calls")
+
+ set(LUA_LDFLAGS "${LUA_LDFLAGS} -fsanitize=address")
+endif()
+
set(LUA_CONFIGURE_COMMAND
sed -e "/^CC/s@gcc@${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}@"
- -e "/^CFLAGS/s@-O2@-g3@"
+ -e "/^CFLAGS/s@-O2@${LUA_CFLAGS}@"
+ -e "/^MYLDFLAGS/s@$@${LUA_LDFLAGS}@"
-e "s@-lreadline@@g"
-e "s@-lhistory@@g"
-e "s@-lncurses@@g"
-i ${DEPS_BUILD_DIR}/src/lua/src/Makefile &&
sed -e "/#define LUA_USE_READLINE/d"
+ -e "s@\\(#define LUA_ROOT[ ]*\"\\)/usr/local@\\1${DEPS_INSTALL_DIR}@"
-i ${DEPS_BUILD_DIR}/src/lua/src/luaconf.h)
+set(LUA_INSTALL_TOP_ARG "INSTALL_TOP=${DEPS_INSTALL_DIR}")
set(LUA_BUILD_COMMAND
- ${MAKE_PRG} ${LUA_TARGET})
+ ${MAKE_PRG} ${LUA_INSTALL_TOP_ARG} ${LUA_TARGET})
set(LUA_INSTALL_COMMAND
- ${MAKE_PRG} INSTALL_TOP=${DEPS_INSTALL_DIR} install)
+ ${MAKE_PRG} ${LUA_INSTALL_TOP_ARG} install)
message(STATUS "Lua target is ${LUA_TARGET}")
@@ -71,14 +85,13 @@ BuildLua(CONFIGURE_COMMAND ${LUA_CONFIGURE_COMMAND}
BUILD_COMMAND ${LUA_BUILD_COMMAND}
INSTALL_COMMAND ${LUA_INSTALL_COMMAND})
list(APPEND THIRD_PARTY_DEPS lua)
-add_dependencies(lua busted)
set(BUSTED ${DEPS_INSTALL_DIR}/bin/busted)
set(BUSTED_LUA ${BUSTED}-lua)
add_custom_command(OUTPUT ${BUSTED_LUA}
COMMAND sed -e 's/^exec/exec $$LUA_DEBUGGER/' -e 's/jit//g' < ${BUSTED} > ${BUSTED_LUA} && chmod +x ${BUSTED_LUA}
- DEPENDS lua)
+ DEPENDS lua busted)
add_custom_target(busted-lua
DEPENDS ${DEPS_INSTALL_DIR}/bin/busted-lua)
diff --git a/third-party/cmake/BuildLuajit.cmake b/third-party/cmake/BuildLuajit.cmake
index 83aceecb59..e965927f4e 100644
--- a/third-party/cmake/BuildLuajit.cmake
+++ b/third-party/cmake/BuildLuajit.cmake
@@ -35,18 +35,32 @@ function(BuildLuajit)
INSTALL_COMMAND "${_luajit_INSTALL_COMMAND}")
endfunction()
+if(CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
+ set(AMD64_ABI "LDFLAGS=-lpthread -lc++abi")
+else()
+ set(AMD64_ABI "")
+endif()
set(INSTALLCMD_UNIX ${MAKE_PRG} CFLAGS=-fPIC
CFLAGS+=-DLUAJIT_DISABLE_JIT
CFLAGS+=-DLUA_USE_APICHECK
CFLAGS+=-DLUA_USE_ASSERT
+ ${AMD64_ABI}
CCDEBUG+=-g
- BUILDMODE=static
Q=
install)
if(UNIX)
+ if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+ # Set MACOSX_DEPLOYMENT_TARGET (else luajit defaults to 10.4). #9050
+ # https://github.com/LuaJIT/LuaJIT/blob/b025b01c5b9d23f6218c7d72b7aafa3f1ab1e08a/src/Makefile#L301-L303
+ set(DEPLOYMENT_TARGET "MACOSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}")
+ else()
+ set(DEPLOYMENT_TARGET "")
+ endif()
+
BuildLuaJit(INSTALL_COMMAND ${INSTALLCMD_UNIX}
- CC=${DEPS_C_COMPILER} PREFIX=${DEPS_INSTALL_DIR})
+ CC=${DEPS_C_COMPILER} PREFIX=${DEPS_INSTALL_DIR}
+ ${DEPLOYMENT_TARGET})
elseif(MINGW AND CMAKE_CROSSCOMPILING)
@@ -71,15 +85,45 @@ elseif(MINGW AND CMAKE_CROSSCOMPILING)
Q=
INSTALL_TSYMNAME=luajit.exe)
-elseif(WIN32 AND MSVC)
+elseif(MINGW)
+
+ if(CMAKE_GENERATOR MATCHES "Ninja")
+ set(LUAJIT_MAKE_PRG ${MAKE_PRG})
+ else()
+ set(LUAJIT_MAKE_PRG ${CMAKE_MAKE_PROGRAM})
+ endif()
+ BuildLuaJit(BUILD_COMMAND ${LUAJIT_MAKE_PRG} CC=${DEPS_C_COMPILER}
+ PREFIX=${DEPS_INSTALL_DIR}
+ CFLAGS+=-DLUAJIT_DISABLE_JIT
+ CFLAGS+=-DLUA_USE_APICHECK
+ CFLAGS+=-DLUA_USE_ASSERT
+ CCDEBUG+=-g
+ BUILDMODE=static
+ # Build a DLL too
+ COMMAND ${LUAJIT_MAKE_PRG} CC=${DEPS_C_COMPILER} BUILDMODE=dynamic
+
+ INSTALL_COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/bin
+ COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/luajit.exe ${DEPS_INSTALL_DIR}/bin
+ COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/lua51.dll ${DEPS_INSTALL_DIR}/bin
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/lib
+ # Luarocks searches for lua51.dll in lib
+ COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/lua51.dll ${DEPS_INSTALL_DIR}/lib
+ COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/libluajit.a ${DEPS_INSTALL_DIR}/lib
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/include/luajit-2.0
+ COMMAND ${CMAKE_COMMAND} -DFROM_GLOB=${DEPS_BUILD_DIR}/src/luajit/src/*.h -DTO=${DEPS_INSTALL_DIR}/include/luajit-2.0 -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/CopyFilesGlob.cmake
+ )
+elseif(MSVC)
BuildLuaJit(
- BUILD_COMMAND ${CMAKE_COMMAND} -E chdir ${DEPS_BUILD_DIR}/src/luajit/src ${DEPS_BUILD_DIR}/src/luajit/src/msvcbuild.bat static
+ BUILD_COMMAND ${CMAKE_COMMAND} -E chdir ${DEPS_BUILD_DIR}/src/luajit/src ${DEPS_BUILD_DIR}/src/luajit/src/msvcbuild.bat
INSTALL_COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/bin
COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/luajit.exe ${DEPS_INSTALL_DIR}/bin
- COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/lua51.lib ${DEPS_INSTALL_DIR}/bin
+ COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/lua51.dll ${DEPS_INSTALL_DIR}/bin
COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/lib
- COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/lua51.lib ${DEPS_INSTALL_DIR}/lib
+ # Luarocks searches for lua51.lib
+ COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/lua51.lib ${DEPS_INSTALL_DIR}/lib/lua51.lib
+ # Luv searches for luajit.lib
+ COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/lua51.lib ${DEPS_INSTALL_DIR}/lib/luajit.lib
COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/include/luajit-2.0
COMMAND ${CMAKE_COMMAND} -DFROM_GLOB=${DEPS_BUILD_DIR}/src/luajit/src/*.h -DTO=${DEPS_INSTALL_DIR}/include/luajit-2.0 -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/CopyFilesGlob.cmake)
diff --git a/third-party/cmake/BuildLuarocks.cmake b/third-party/cmake/BuildLuarocks.cmake
index 069c94ea2e..3fbd47bda2 100644
--- a/third-party/cmake/BuildLuarocks.cmake
+++ b/third-party/cmake/BuildLuarocks.cmake
@@ -3,11 +3,7 @@
# writing a recipe that is meant for cross-compile, use the HOSTDEPS_* variables
# instead of DEPS_* - check the main CMakeLists.txt for a list.
-if(MSVC)
- message(STATUS "Building busted in Windows is not supported (skipping)")
-else()
- option(USE_BUNDLED_BUSTED "Use the bundled version of busted to run tests." ON)
-endif()
+option(USE_BUNDLED_BUSTED "Use the bundled version of busted to run tests." ON)
# BuildLuarocks(CONFIGURE_COMMAND ... BUILD_COMMAND ... INSTALL_COMMAND ...)
# Reusable function to build luarocks, wraps ExternalProject_Add.
@@ -45,12 +41,13 @@ endfunction()
# The luarocks binary location
set(LUAROCKS_BINARY ${HOSTDEPS_BIN_DIR}/luarocks)
+# NOTE: Version must match version of LuaRocks in third-party/CMakeLists.txt
+set(LUAROCKS_VERSION 2.4)
+
# Arguments for calls to 'luarocks build'
-if(MSVC)
- # In native Win32 don't pass the compiler/linker to luarocks, the bundled
+if(NOT MSVC)
+ # In MSVC don't pass the compiler/linker to luarocks, the bundled
# version already knows, and passing them here breaks the build
- set(LUAROCKS_BUILDARGS CFLAGS=/MT)
-else()
set(LUAROCKS_BUILDARGS CC=${HOSTDEPS_C_COMPILER} LD=${HOSTDEPS_C_COMPILER})
endif()
@@ -59,28 +56,38 @@ if(UNIX OR (MINGW AND CMAKE_CROSSCOMPILING))
if(USE_BUNDLED_LUAJIT)
list(APPEND LUAROCKS_OPTS
--with-lua=${HOSTDEPS_INSTALL_DIR}
- --with-lua-include=${HOSTDEPS_INSTALL_DIR}/include/luajit-2.0)
+ --with-lua-include=${HOSTDEPS_INSTALL_DIR}/include/luajit-2.0
+ --lua-suffix=jit)
+ elseif(USE_BUNDLED_LUA)
+ list(APPEND LUAROCKS_OPTS
+ --with-lua=${HOSTDEPS_INSTALL_DIR})
endif()
BuildLuarocks(
CONFIGURE_COMMAND ${DEPS_BUILD_DIR}/src/luarocks/configure
--prefix=${HOSTDEPS_INSTALL_DIR} --force-config ${LUAROCKS_OPTS}
- --lua-suffix=jit
- INSTALL_COMMAND ${MAKE_PRG} bootstrap)
+ INSTALL_COMMAND ${MAKE_PRG} -j1 bootstrap)
+elseif(MSVC OR MINGW)
+
+ if(MINGW)
+ set(COMPILER_FLAG /MW)
+ elseif(MSVC)
+ set(COMPILER_FLAG /MSVC)
+ endif()
-elseif(MSVC)
# Ignore USE_BUNDLED_LUAJIT - always ON for native Win32
BuildLuarocks(INSTALL_COMMAND install.bat /FORCECONFIG /NOREG /NOADMIN /Q /F
/LUA ${DEPS_INSTALL_DIR}
/LIB ${DEPS_LIB_DIR}
/BIN ${DEPS_BIN_DIR}
/INC ${DEPS_INSTALL_DIR}/include/luajit-2.0/
- /P ${DEPS_INSTALL_DIR} /TREE ${DEPS_INSTALL_DIR}
+ /P ${DEPS_INSTALL_DIR}/${LUAROCKS_VERSION} /TREE ${DEPS_INSTALL_DIR}
/SCRIPTS ${DEPS_BIN_DIR}
/CMOD ${DEPS_BIN_DIR}
+ ${COMPILER_FLAG}
/LUAMOD ${DEPS_BIN_DIR}/lua)
- set(LUAROCKS_BINARY ${DEPS_INSTALL_DIR}/2.2/luarocks.bat)
+ set(LUAROCKS_BINARY ${DEPS_INSTALL_DIR}/${LUAROCKS_VERSION}/luarocks.bat)
else()
message(FATAL_ERROR "Trying to build luarocks in an unsupported system ${CMAKE_SYSTEM_NAME}/${CMAKE_C_COMPILER_ID}")
endif()
@@ -92,67 +99,110 @@ if(USE_BUNDLED_LUAJIT)
if(MINGW AND CMAKE_CROSSCOMPILING)
add_dependencies(luarocks luajit_host)
endif()
+elseif(USE_BUNDLED_LUA)
+ add_dependencies(luarocks lua)
endif()
-# Each target depends on the previous module, this serializes all calls to
-# luarocks since it is unhappy to be called in parallel.
+# DEPENDS on the previous module, because Luarocks breaks if parallel.
add_custom_command(OUTPUT ${HOSTDEPS_LIB_DIR}/luarocks/rocks/mpack
COMMAND ${LUAROCKS_BINARY}
- ARGS build mpack ${LUAROCKS_BUILDARGS}
+ ARGS build mpack 1.0.7-0 ${LUAROCKS_BUILDARGS}
DEPENDS luarocks)
add_custom_target(mpack
DEPENDS ${HOSTDEPS_LIB_DIR}/luarocks/rocks/mpack)
list(APPEND THIRD_PARTY_DEPS mpack)
-
+# DEPENDS on the previous module, because Luarocks breaks if parallel.
add_custom_command(OUTPUT ${HOSTDEPS_LIB_DIR}/luarocks/rocks/lpeg
COMMAND ${LUAROCKS_BINARY}
- ARGS build lpeg ${LUAROCKS_BUILDARGS}
+ ARGS build lpeg 1.0.1-1 ${LUAROCKS_BUILDARGS}
DEPENDS mpack)
add_custom_target(lpeg
DEPENDS ${HOSTDEPS_LIB_DIR}/luarocks/rocks/lpeg)
list(APPEND THIRD_PARTY_DEPS lpeg)
+# DEPENDS on the previous module, because Luarocks breaks if parallel.
add_custom_command(OUTPUT ${HOSTDEPS_LIB_DIR}/luarocks/rocks/inspect
COMMAND ${LUAROCKS_BINARY}
- ARGS build inspect ${LUAROCKS_BUILDARGS}
- DEPENDS mpack)
+ ARGS build inspect 3.1.1-0 ${LUAROCKS_BUILDARGS}
+ DEPENDS lpeg)
add_custom_target(inspect
DEPENDS ${HOSTDEPS_LIB_DIR}/luarocks/rocks/inspect)
list(APPEND THIRD_PARTY_DEPS inspect)
+if((NOT USE_BUNDLED_LUAJIT) AND USE_BUNDLED_LUA)
+ # DEPENDS on the previous module, because Luarocks breaks if parallel.
+ add_custom_command(OUTPUT ${HOSTDEPS_LIB_DIR}/luarocks/rocks/luabitop
+ COMMAND ${LUAROCKS_BINARY}
+ ARGS build luabitop 1.0.2-3 ${LUAROCKS_BUILDARGS}
+ DEPENDS inspect)
+ add_custom_target(luabitop
+ DEPENDS ${HOSTDEPS_LIB_DIR}/luarocks/rocks/luabitop)
+
+ list(APPEND THIRD_PARTY_DEPS luabitop)
+endif()
+
if(USE_BUNDLED_BUSTED)
- add_custom_command(OUTPUT ${HOSTDEPS_BIN_DIR}/busted
+ if((NOT USE_BUNDLED_LUAJIT) AND USE_BUNDLED_LUA)
+ set(PENLIGHT_DEPENDS luabitop)
+ else()
+ set(PENLIGHT_DEPENDS inspect)
+ endif()
+
+ # DEPENDS on the previous module, because Luarocks breaks if parallel.
+ add_custom_command(OUTPUT ${HOSTDEPS_LIB_DIR}/luarocks/rocks/penlight
+ COMMAND ${LUAROCKS_BINARY}
+ ARGS build penlight 1.5.4-1 ${LUAROCKS_BUILDARGS}
+ DEPENDS ${PENLIGHT_DEPENDS})
+ add_custom_target(penlight
+ DEPENDS ${HOSTDEPS_LIB_DIR}/luarocks/rocks/penlight)
+
+ if(WIN32)
+ set(BUSTED_EXE "${HOSTDEPS_BIN_DIR}/busted.bat")
+ set(LUACHECK_EXE "${HOSTDEPS_BIN_DIR}/luacheck.bat")
+ else()
+ set(BUSTED_EXE "${HOSTDEPS_BIN_DIR}/busted")
+ set(LUACHECK_EXE "${HOSTDEPS_BIN_DIR}/luacheck")
+ endif()
+ # DEPENDS on the previous module, because Luarocks breaks if parallel.
+ add_custom_command(OUTPUT ${BUSTED_EXE}
COMMAND ${LUAROCKS_BINARY}
- ARGS build https://raw.githubusercontent.com/Olivine-Labs/busted/v2.0.rc11-0/busted-2.0.rc11-0.rockspec ${LUAROCKS_BUILDARGS}
- DEPENDS lpeg)
+ ARGS build busted 2.0.rc12-1 ${LUAROCKS_BUILDARGS}
+ DEPENDS penlight)
add_custom_target(busted
- DEPENDS ${HOSTDEPS_BIN_DIR}/busted)
+ DEPENDS ${BUSTED_EXE})
- add_custom_command(OUTPUT ${HOSTDEPS_BIN_DIR}/luacheck
+ # DEPENDS on the previous module, because Luarocks breaks if parallel.
+ add_custom_command(OUTPUT ${LUACHECK_EXE}
COMMAND ${LUAROCKS_BINARY}
- ARGS build https://raw.githubusercontent.com/mpeterv/luacheck/3929eaa3528be2a8a50c593d687c8625205a2033/luacheck-scm-1.rockspec ${LUAROCKS_BUILDARGS}
+ ARGS build luacheck 0.21.2-1 ${LUAROCKS_BUILDARGS}
DEPENDS busted)
add_custom_target(luacheck
- DEPENDS ${HOSTDEPS_BIN_DIR}/luacheck)
+ DEPENDS ${LUACHECK_EXE})
set(LUV_DEPS luacheck luv-static)
if(MINGW AND CMAKE_CROSSCOMPILING)
set(LUV_DEPS ${LUV_DEPS} libuv_host)
endif()
+ set(LUV_ARGS "CFLAGS=-O0 -g3 -fPIC")
+ if(USE_BUNDLED_LIBUV)
+ list(APPEND LUV_ARGS LIBUV_DIR=${HOSTDEPS_INSTALL_DIR})
+ endif()
+ # DEPENDS on the previous module, because Luarocks breaks if parallel.
add_custom_command(OUTPUT ${HOSTDEPS_LIB_DIR}/luarocks/rocks/luv
COMMAND ${LUAROCKS_BINARY}
- ARGS make ${LUAROCKS_BUILDARGS} LIBUV_DIR=${HOSTDEPS_INSTALL_DIR} CFLAGS='-O0 -g3 -fPIC'
+ ARGS make ${LUAROCKS_BUILDARGS} ${LUV_ARGS}
WORKING_DIRECTORY ${DEPS_BUILD_DIR}/src/luv
DEPENDS ${LUV_DEPS})
add_custom_target(luv
DEPENDS ${HOSTDEPS_LIB_DIR}/luarocks/rocks/luv)
+ # DEPENDS on the previous module, because Luarocks breaks if parallel.
add_custom_command(OUTPUT ${HOSTDEPS_LIB_DIR}/luarocks/rocks/nvim-client
COMMAND ${LUAROCKS_BINARY}
- ARGS build https://raw.githubusercontent.com/neovim/lua-client/0.0.1-24/nvim-client-0.0.1-24.rockspec ${LUAROCKS_BUILDARGS}
+ ARGS build nvim-client 0.1.0-1 ${LUAROCKS_BUILDARGS}
DEPENDS luv)
add_custom_target(nvim-client
DEPENDS ${HOSTDEPS_LIB_DIR}/luarocks/rocks/nvim-client)
diff --git a/third-party/cmake/BuildLuv.cmake b/third-party/cmake/BuildLuv.cmake
index 3060590bce..a62ee72f91 100644
--- a/third-party/cmake/BuildLuv.cmake
+++ b/third-party/cmake/BuildLuv.cmake
@@ -37,18 +37,33 @@ set(LUV_SRC_DIR ${DEPS_BUILD_DIR}/src/luv)
set(LUV_INCLUDE_FLAGS
"-I${DEPS_INSTALL_DIR}/include -I${DEPS_INSTALL_DIR}/include/luajit-2.0")
+# Replace luv default rockspec with the alternate one under the "rockspecs"
+# directory
set(LUV_PATCH_COMMAND
- ${CMAKE_COMMAND} -DLUV_SRC_DIR=${LUV_SRC_DIR}
- -P ${PROJECT_SOURCE_DIR}/cmake/PatchLuv.cmake)
+ ${CMAKE_COMMAND} -E copy_directory ${LUV_SRC_DIR}/rockspecs ${LUV_SRC_DIR})
+if(MINGW)
+ set(LUV_PATCH_COMMAND
+ ${LUV_PATCH_COMMAND}
+ COMMAND ${GIT_EXECUTABLE} -C ${LUV_SRC_DIR} init
+ COMMAND ${GIT_EXECUTABLE} -C ${LUV_SRC_DIR} apply --ignore-whitespace
+ ${CMAKE_CURRENT_SOURCE_DIR}/patches/luv-Add-missing-definitions-for-MinGW.patch)
+endif()
set(LUV_CONFIGURE_COMMAND_COMMON
${CMAKE_COMMAND} ${LUV_SRC_DIR}
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
-DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
-DLUA_BUILD_TYPE=System
-DWITH_SHARED_LIBUV=ON
-DBUILD_SHARED_LIBS=OFF
-DBUILD_MODULE=OFF)
+if(USE_BUNDLED_LIBUV)
+ set(LUV_CONFIGURE_COMMAND_COMMON
+ ${LUV_CONFIGURE_COMMAND_COMMON}
+ -DCMAKE_PREFIX_PATH=${DEPS_INSTALL_DIR})
+endif()
+
if(MINGW AND CMAKE_CROSSCOMPILING)
get_filename_component(TOOLCHAIN ${CMAKE_TOOLCHAIN_FILE} REALPATH)
set(LUV_CONFIGURE_COMMAND
@@ -77,7 +92,12 @@ else()
"-DCMAKE_C_FLAGS:STRING=${CMAKE_C_COMPILER_ARG1} ${LUV_INCLUDE_FLAGS} -fPIC")
endif()
-set(LUV_BUILD_COMMAND ${CMAKE_COMMAND} --build .)
+if(CMAKE_GENERATOR MATCHES "Unix Makefiles" AND
+ (CMAKE_SYSTEM_NAME MATCHES ".*BSD" OR CMAKE_SYSTEM_NAME MATCHES "DragonFly"))
+ set(LUV_BUILD_COMMAND ${CMAKE_COMMAND} "-DCMAKE_MAKE_PROGRAM=gmake" --build .)
+else()
+ set(LUV_BUILD_COMMAND ${CMAKE_COMMAND} --build .)
+endif()
set(LUV_INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install)
BuildLuv(PATCH_COMMAND ${LUV_PATCH_COMMAND}
@@ -86,5 +106,9 @@ BuildLuv(PATCH_COMMAND ${LUV_PATCH_COMMAND}
INSTALL_COMMAND ${LUV_INSTALL_COMMAND})
list(APPEND THIRD_PARTY_DEPS luv-static)
-add_dependencies(luv-static luajit)
-add_dependencies(luv-static libuv)
+if(USE_BUNDLED_LUAJIT)
+ add_dependencies(luv-static luajit)
+endif()
+if(USE_BUNDLED_LIBUV)
+ add_dependencies(luv-static libuv)
+endif()
diff --git a/third-party/cmake/BuildMsgpack.cmake b/third-party/cmake/BuildMsgpack.cmake
index 4b6b361e85..616b6e5f83 100644
--- a/third-party/cmake/BuildMsgpack.cmake
+++ b/third-party/cmake/BuildMsgpack.cmake
@@ -35,21 +35,26 @@ endfunction()
set(MSGPACK_CONFIGURE_COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/msgpack
-DMSGPACK_ENABLE_CXX=OFF
-DMSGPACK_BUILD_TESTS=OFF
+ -DMSGPACK_BUILD_EXAMPLES=OFF
-DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
- "-DCMAKE_C_FLAGS:STRING=${CMAKE_C_COMPILER_ARG1} -fPIC")
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ "-DCMAKE_C_FLAGS:STRING=${CMAKE_C_COMPILER_ARG1} -fPIC"
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR})
-set(MSGPACK_BUILD_COMMAND ${CMAKE_COMMAND} --build .)
-set(MSGPACK_INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install)
+set(MSGPACK_BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE})
+set(MSGPACK_INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE})
if(MINGW AND CMAKE_CROSSCOMPILING)
get_filename_component(TOOLCHAIN ${CMAKE_TOOLCHAIN_FILE} REALPATH)
set(MSGPACK_CONFIGURE_COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/msgpack
-DMSGPACK_ENABLE_CXX=OFF
-DMSGPACK_BUILD_TESTS=OFF
+ -DMSGPACK_BUILD_EXAMPLES=OFF
-DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
# Pass toolchain
-DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN}
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
# Hack to avoid -rdynamic in Mingw
-DCMAKE_SHARED_LIBRARY_LINK_C_FLAGS="")
elseif(MSVC)
@@ -57,15 +62,14 @@ elseif(MSVC)
set(MSGPACK_CONFIGURE_COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/msgpack
-DMSGPACK_ENABLE_CXX=OFF
-DMSGPACK_BUILD_TESTS=OFF
+ -DMSGPACK_BUILD_EXAMPLES=OFF
-DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
"-DCMAKE_C_FLAGS:STRING=${CMAKE_C_COMPILER_ARG1}"
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
# Make sure we use the same generator, otherwise we may
# accidentaly end up using different MSVC runtimes
- -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
- # Use static runtime
- -DCMAKE_C_FLAGS_DEBUG="-MTd"
- -DCMAKE_C_FLAGS_RELEASE="-MT")
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR})
endif()
BuildMsgpack(CONFIGURE_COMMAND ${MSGPACK_CONFIGURE_COMMAND}
diff --git a/third-party/cmake/BuildUnibilium.cmake b/third-party/cmake/BuildUnibilium.cmake
index a5ec6c01eb..9b7f0364a9 100644
--- a/third-party/cmake/BuildUnibilium.cmake
+++ b/third-party/cmake/BuildUnibilium.cmake
@@ -1,25 +1,54 @@
if(WIN32)
- message(STATUS "Building Unibilium in Windows is not supported (skipping)")
- return()
+ ExternalProject_Add(unibilium
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${UNIBILIUM_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/unibilium
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/unibilium
+ -DURL=${UNIBILIUM_URL}
+ -DEXPECTED_SHA256=${UNIBILIUM_SHA256}
+ -DTARGET=unibilium
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ PATCH_COMMAND ${GIT_EXECUTABLE} -C ${DEPS_BUILD_DIR}/src/unibilium init
+ COMMAND ${GIT_EXECUTABLE} -C ${DEPS_BUILD_DIR}/src/unibilium apply --ignore-whitespace
+ ${CMAKE_CURRENT_SOURCE_DIR}/patches/unibilium-Relax-checks-for-extended-capability-to-support-new-.patch
+ CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/UnibiliumCMakeLists.txt
+ ${DEPS_BUILD_DIR}/src/unibilium/CMakeLists.txt
+ COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/msvc-compat/unistd.h
+ ${DEPS_BUILD_DIR}/src/unibilium/msvc-compat/unistd.h
+ COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/unibilium
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ # Pass toolchain
+ -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN}
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
+ BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE}
+ INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE})
+else()
+ ExternalProject_Add(unibilium
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${UNIBILIUM_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/unibilium
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/unibilium
+ -DURL=${UNIBILIUM_URL}
+ -DEXPECTED_SHA256=${UNIBILIUM_SHA256}
+ -DTARGET=unibilium
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ PATCH_COMMAND patch -d ${DEPS_BUILD_DIR}/src/unibilium -Np1 --input
+ ${CMAKE_CURRENT_SOURCE_DIR}/patches/unibilium-Relax-checks-for-extended-capability-to-support-new-.patch
+ CONFIGURE_COMMAND ""
+ BUILD_IN_SOURCE 1
+ BUILD_COMMAND ${MAKE_PRG} CC=${DEPS_C_COMPILER}
+ PREFIX=${DEPS_INSTALL_DIR}
+ CFLAGS=-fPIC
+ INSTALL_COMMAND ${MAKE_PRG} PREFIX=${DEPS_INSTALL_DIR} install)
endif()
-ExternalProject_Add(unibilium
- PREFIX ${DEPS_BUILD_DIR}
- URL ${UNIBILIUM_URL}
- DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/unibilium
- DOWNLOAD_COMMAND ${CMAKE_COMMAND}
- -DPREFIX=${DEPS_BUILD_DIR}
- -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/unibilium
- -DURL=${UNIBILIUM_URL}
- -DEXPECTED_SHA256=${UNIBILIUM_SHA256}
- -DTARGET=unibilium
- -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
- -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
- CONFIGURE_COMMAND ""
- BUILD_IN_SOURCE 1
- BUILD_COMMAND ${MAKE_PRG} CC=${DEPS_C_COMPILER}
- PREFIX=${DEPS_INSTALL_DIR}
- CFLAGS=-fPIC
- INSTALL_COMMAND ${MAKE_PRG} PREFIX=${DEPS_INSTALL_DIR} install)
-
list(APPEND THIRD_PARTY_DEPS unibilium)
diff --git a/third-party/cmake/CopyFilesGlob.cmake b/third-party/cmake/CopyFilesGlob.cmake
index 056da32fd4..8950ead1e5 100644
--- a/third-party/cmake/CopyFilesGlob.cmake
+++ b/third-party/cmake/CopyFilesGlob.cmake
@@ -9,6 +9,8 @@ if(NOT TO)
message(FATAL_ERROR "TO must be set")
endif()
+execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${TO})
+
file(GLOB files ${FROM_GLOB})
foreach(file ${files})
execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${file} ${TO} RESULT_VARIABLE rv)
diff --git a/third-party/cmake/DownloadAndExtractFile.cmake b/third-party/cmake/DownloadAndExtractFile.cmake
index 24e431b5e5..2fc6e0415f 100644
--- a/third-party/cmake/DownloadAndExtractFile.cmake
+++ b/third-party/cmake/DownloadAndExtractFile.cmake
@@ -39,7 +39,7 @@ if(TIMEOUT)
set(timeout_args TIMEOUT ${timeout})
set(timeout_msg "${timeout} seconds")
else()
- set(timeout_args "# no TIMEOUT")
+ set(timeout_args "")
set(timeout_msg "none")
endif()
diff --git a/third-party/cmake/GetBinaryDeps.cmake b/third-party/cmake/GetBinaryDeps.cmake
new file mode 100644
index 0000000000..1d98177924
--- /dev/null
+++ b/third-party/cmake/GetBinaryDeps.cmake
@@ -0,0 +1,46 @@
+# Download and install binary dependencies for windows
+include(CMakeParseArguments)
+
+# This is similar to the build recipes, but instead downloads a third party
+# binary and installs it under the the DEPS_PREFIX. The INSTALL_COMMAND is
+# executed in the folder where downloaded files are extracted and the
+# ${DEPS_INSTALL_DIR} holds the path to the third-party install root.
+function(GetBinaryDep)
+ cmake_parse_arguments(_gettool
+ "BUILD_IN_SOURCE"
+ "TARGET"
+ "INSTALL_COMMAND"
+ ${ARGN})
+
+ if(NOT _gettool_TARGET OR NOT _gettool_INSTALL_COMMAND)
+ message(FATAL_ERROR "Must pass INSTALL_COMMAND and TARGET")
+ endif()
+
+ string(TOUPPER "${_gettool_TARGET}_URL" URL_VARNAME)
+ string(TOUPPER "${_gettool_TARGET}_SHA256" HASH_VARNAME)
+ set(URL ${${URL_VARNAME}})
+ set(HASH ${${HASH_VARNAME}})
+ if(NOT URL OR NOT HASH )
+ message(FATAL_ERROR "${URL_VARNAME} and ${HASH_VARNAME} must be set")
+ endif()
+
+ ExternalProject_Add(${_gettool_TARGET}
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}
+ -DURL=${URL}
+ -DEXPECTED_SHA256=${HASH}
+ -DTARGET=${_gettool_TARGET}
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ CONFIGURE_COMMAND ""
+ BUILD_IN_SOURCE 1
+ CONFIGURE_COMMAND ""
+ BUILD_COMMAND ""
+ INSTALL_COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/bin
+ COMMAND "${_gettool_INSTALL_COMMAND}")
+ list(APPEND THIRD_PARTY_DEPS ${__gettool_TARGET})
+endfunction()
diff --git a/third-party/cmake/GettextCMakeLists.txt b/third-party/cmake/GettextCMakeLists.txt
new file mode 100644
index 0000000000..5a6253df3b
--- /dev/null
+++ b/third-party/cmake/GettextCMakeLists.txt
@@ -0,0 +1,271 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(gettext C)
+
+# Adds PREFIX to each item in LIST
+macro(PREFIX_LIST_ITEMS LIST PREFIX)
+ string(REPLACE ";" ";${PREFIX}" ${LIST} ";${${LIST}}")
+endmacro()
+
+file(READ gettext-runtime/config.h.in CONFIG_CONTENT)
+string(REPLACE "#undef HAVE_GETCWD" "#define HAVE_GETCWD 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef uintmax_t" "
+ #if _WIN64
+ # define intmax_t long long
+ # define uintmax_t unsigned long long
+ #elif _WIN32
+ # define intmax_t long
+ # define uintmax_t unsigned long
+ #endif"
+ CONFIG_CONTENT ${CONFIG_CONTENT})
+file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/gettext-runtime/config.h ${CONFIG_CONTENT})
+
+set(HAVE_NEWLOCALE 0)
+set(HAVE_POSIX_PRINTF 0)
+set(HAVE_SNPRINTF 0)
+set(HAVE_ASPRINTF 0)
+set(HAVE_WPRINTF 0)
+configure_file(gettext-runtime/intl/libgnuintl.in.h
+ ${CMAKE_CURRENT_BINARY_DIR}/gettext-runtime/intl/libgnuintl.h)
+
+set(LOCALDIR "gettext")
+set(LIBDIR "gettext")
+set(PKGDATADIR "gettext")
+set(PACKAGE_SUFFIX "gettext")
+add_definitions(-DLOCALEDIR=\"${LOCALDIR}\"
+ -DLOCALE_ALIAS_PATH=\"${LOCALDIR}\"
+ -DLIBDIR=\"${LOCALDIR}\"
+ -DINSTALLDIR=\"${LOCALDIR}\"
+ -DEXEEXT=\".exe\"
+ -DLOCALEDIR=\"${LOCALDIR}\"
+ -DLIBDIR=\"${LIBDIR}\"
+ -DPACKAGE_SUFFIX=\"${PACKAGE_SUFFIX}\"
+ -DGETTEXTDATADIR=\"${PKGDATADIR}\"
+ -DBISON_LOCALEDIR=\"${LOCALDIR}\"
+ -DHAVE_CONFIG_H)
+
+set(libintl_SOURCES
+ bindtextdom.c dcgettext.c dcigettext.c dcngettext.c dgettext.c dngettext.c
+ explodename.c finddomain.c gettext.c hash-string.c l10nflist.c langprefs.c
+ loadmsgcat.c localcharset.c localealias.c localename.c lock.c log.c ngettext.c
+ plural-exp.c plural.c printf.c relocatable.c setlocale.c textdomain.c
+ threadlib.c version.c)
+PREFIX_LIST_ITEMS(libintl_SOURCES "gettext-runtime/intl/")
+
+add_library(libintl ${libintl_SOURCES})
+set_property(TARGET libintl APPEND PROPERTY INCLUDE_DIRECTORIES
+ ${CMAKE_CURRENT_BINARY_DIR}/gettext-runtime
+ ${CMAKE_CURRENT_BINARY_DIR}/gettext-runtime/intl)
+set_property(TARGET libintl APPEND PROPERTY COMPILE_DEFINITIONS
+ BUILDING_LIBINTL
+ IN_LIBINTL
+ ENABLE_RELOCATABLE=1
+ IN_LIBRARY
+ NO_XMALLOC
+ set_relocation_prefix=libintl_set_relocation_prefix
+ relocate=libintl_relocate
+ HAVE_CONFIG_H
+ _CRT_SECURE_NO_WARNINGS)
+
+
+file(READ gettext-tools/config.h.in CONFIG_CONTENT)
+string(REPLACE "#undef ENDIANNESS" "#define ENDIANNESS 0" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef GNULIB_FWRITEERROR" "#define GNULIB_FWRITEERROR 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE_DECL_STRERROR_R" "#define HAVE_DECL_STRERROR_R 0" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE_DUP2" "#define HAVE_DUP2 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE_LIBUNISTRING" "#define HAVE_LIBUNISTRING 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE_STDINT_H_WITH_UINTMAX" "#define HAVE_STDINT_H_WITH_UINTMAX 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE_STDINT_H" "#define HAVE_STDINT_H 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE_STRING_H" "#define HAVE_STRING_H 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE_SYS_TIMEB_H" "#define HAVE_SYS_TIMEB_H 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE__FTIME" "#define HAVE__FTIME 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef ICONV_CONST" "#define ICONV_CONST const" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef PACKAGE" "#define PACKAGE \"gettext\"\n#define gettext_VERSION" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef VERSION" "#define VERSION \"\"" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef mode_t" "#define mode_t int" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef pid_t" "#define pid_t int" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef restrict" "#define restrict __restrict" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef ssize_t" "#include <BaseTsd.h>\n#define ssize_t SSIZE_T" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef uid_t" "#define uid_t int" CONFIG_CONTENT ${CONFIG_CONTENT})
+file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/gettext-tools/config.h ${CONFIG_CONTENT})
+
+set(libgettextsrc_COMMON_SOURCE
+ message.c po-error.c po-xerror.c read-catalog-abstract.c po-lex.c
+ po-gram-gen.c po-charset.c read-po.c read-properties.c read-stringtable.c
+ open-catalog.c dir-list.c
+ str-list.c)
+
+set(libgettextsrc_FORMAT_SOURCE
+ format.c format-invalid.h format-c.c format-c-parse.h format-sh.c
+ format-python.c format-python-brace.c format-lisp.c format-elisp.c
+ format-librep.c format-scheme.c format-java.c format-csharp.c format-awk.c
+ format-pascal.c format-ycp.c format-tcl.c format-perl.c format-perl-brace.c
+ format-php.c format-gcc-internal.c format-gfc-internal.c format-qt.c
+ format-qt-plural.c format-kde.c format-kde-kuit.c format-boost.c format-lua.c
+ format-javascript.c)
+
+set(libgettextsrc_SOURCES
+ ${libgettextsrc_COMMON_SOURCE} read-catalog.c color.c write-catalog.c
+ write-properties.c write-stringtable.c write-po.c msgl-ascii.c msgl-iconv.c
+ msgl-equal.c msgl-cat.c msgl-header.c msgl-english.c msgl-check.c file-list.c
+ msgl-charset.c po-time.c plural-exp.c plural-eval.c plural-count.c
+ plural-table.c quote.h sentence.h sentence.c ${libgettextsrc_FORMAT_SOURCE}
+ read-desktop.c locating-rule.c its.c search-path.c)
+PREFIX_LIST_ITEMS(libgettextsrc_SOURCES "gettext-tools/src/")
+
+set(GLIBC_SOURCE
+ uniname/uniname.c javaexec.c unsetenv.c classpath.c setenv.c xsetenv.c
+ sh-quote.c execute.c javaversion.c csharpcomp.c csharpexec.c javacomp.c
+ gettimeofday.c getdtablesize.c fcntl.c dup-safer-flag.c cloexec.c
+ fd-safer-flag.c fd-safer.c pipe2.c pipe2-safer.c spawn-pipe.c xmemdup0.c
+ secure_getenv.c tmpdir.c tempname.c mkdtemp.c fnmatch.c clean-temp.c
+ gl_array_list.c tputs.c wait-process.c waitpid.c getdelim.c getline.c
+ sigprocmask.c sigaction.c addext.c argmatch.c backupfile.c basename.c
+ c-strcasecmp.c c-strncasecmp.c c-strstr.c closeout.c concat-filename.c
+ error-progname.c error.c exitfail.c file-ostream.c fstrcmp.c full-write.c
+ fwriteerror.c getopt.c getopt1.c hash.c libxml/buf.c localcharset.c malloca.c
+ mbchar.c mbslen.c mbsstr.c mbswidth.c obstack.c ostream.c html-ostream.c
+ fd-ostream.c styled-ostream.c progname.c html-styled-ostream.c printf-args.c
+ printf-parse.c propername.c quotearg.c rawmemchr.c safe-read.c safe-write.c
+ stpcpy.c stpncpy.c strchrnul.c striconveh.c striconveha.c strnlen1.c
+ term-ostream.c term-styled-ostream.c tparm.c trim.c gcd.c gl_linkedhash_list.c
+ uniconv/u8-conv-from-enc.c unictype/ctype_space.c unilbrk/lbrktables.c
+ unilbrk/u8-possible-linebreaks.c unilbrk/u8-width-linebreaks.c
+ unilbrk/ulc-common.c unilbrk/ulc-width-linebreaks.c unistr/u16-mbtouc-aux.c
+ unistr/u16-mbtouc.c unistr/u8-check.c unistr/u8-mblen.c unistr/u8-mbtouc-aux.c
+ unistr/u8-mbtouc-unsafe-aux.c unistr/u8-mbtouc-unsafe.c unistr/u8-mbtouc.c
+ unistr/u8-mbtoucr.c unistr/u8-prev.c unistr/u8-uctomb-aux.c unistr/u8-uctomb.c
+ uniwidth/width.c vasnprintf.c vasprintf.c wcwidth.c xasprintf.c
+ xconcat-filename.c xerror.c xmalloc.c xstrdup.c xvasprintf.c glib/ghash.c
+ glib/glist.c glib/gmessages.c glib/gprimes.c glib/gstrfuncs.c glib/gstring.c
+ libcroco/cr-additional-sel.c libcroco/cr-attr-sel.c libcroco/cr-cascade.c
+ libcroco/cr-declaration.c libcroco/cr-doc-handler.c libcroco/cr-enc-handler.c
+ libcroco/cr-fonts.c libcroco/cr-input.c libcroco/cr-num.c
+ libcroco/cr-om-parser.c libcroco/cr-parser.c libcroco/cr-parsing-location.c
+ libcroco/cr-prop-list.c libcroco/cr-pseudo.c libcroco/cr-rgb.c
+ libcroco/cr-sel-eng.c libcroco/cr-selector.c libcroco/cr-simple-sel.c
+ libcroco/cr-statement.c libcroco/cr-string.c libcroco/cr-style.c
+ libcroco/cr-stylesheet.c libcroco/cr-term.c libcroco/cr-tknzr.c
+ libcroco/cr-token.c libcroco/cr-utils.c libxml/DOCBparser.c
+ libxml/HTMLparser.c libxml/HTMLtree.c libxml/SAX.c libxml/SAX2.c libxml/c14n.c
+ libxml/catalog.c libxml/chvalid.c libxml/debugXML.c libxml/dict.c
+ libxml/encoding.c libxml/entities.c libxml/error.c libxml/globals.c
+ libxml/hash.c libxml/legacy.c libxml/list.c libxml/nanoftp.c libxml/nanohttp.c
+ libxml/parser.c libxml/parserInternals.c libxml/pattern.c libxml/relaxng.c
+ libxml/schematron.c libxml/threads.c libxml/tree.c libxml/trionan.c
+ libxml/uri.c libxml/valid.c libxml/xinclude.c libxml/xlink.c libxml/xmlIO.c
+ libxml/xmlmemory.c libxml/xmlmodule.c libxml/xmlreader.c libxml/xmlregexp.c
+ libxml/xmlsave.c libxml/xmlschemas.c libxml/xmlschemastypes.c
+ libxml/xmlstring.c libxml/xmlunicode.c libxml/xmlwriter.c libxml/xpath.c
+ libxml/xpointer.c fatal-signal.c copy-file.c)
+PREFIX_LIST_ITEMS(GLIBC_SOURCE "gettext-tools/gnulib-lib/")
+
+set(libgettextsrc_SOURCES ${libgettextsrc_SOURCES} ${GLIBC_SOURCE})
+
+set(HEADER_TEMPLATES_PATH "gettext-tools/gnulib-lib")
+set(HEADER_TEMPLATES_ABS_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${HEADER_TEMPLATES_PATH}")
+file(GLOB_RECURSE HEADER_TEMPLATES "${HEADER_TEMPLATES_ABS_PATH}/*.in.h")
+list(REMOVE_ITEM HEADER_TEMPLATES "${HEADER_TEMPLATES_ABS_PATH}/stdint.in.h")
+list(REMOVE_ITEM HEADER_TEMPLATES "${HEADER_TEMPLATES_ABS_PATH}/wchar.in.h")
+foreach(HEADER_TEMPLATE ${HEADER_TEMPLATES})
+ file(READ ${HEADER_TEMPLATE} HEADER_CONTENT)
+ string(REPLACE "/* The definition of _GL_ARG_NONNULL is copied here. */" "#include \"arg-nonnull.h\"" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "/* The definition of _GL_WARN_ON_USE is copied here. */" "#include \"warn-on-use.h\"" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */" "#include \"c++defs.h\"" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@GNULIB_LSTAT@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@GNULIB_MBSINIT@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@GNULIB_SIGACTION@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@GNULIB_SIGPROCMASK@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@GNULIB_STPCPY@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@GNULIB_STPNCPY@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@GNULIB_STRCHRNUL@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@HAVE_ISWCNTRL@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@HAVE_WCTYPE_T@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@PRAGMA_COLUMNS@" "" HEADER_CONTENT "${HEADER_CONTENT}")
+
+ string(REGEX REPLACE "^${HEADER_TEMPLATES_ABS_PATH}/" "" HEADER_PATH "${HEADER_TEMPLATE}")
+ string(REPLACE ".in" "" HEADER_PATH ${HEADER_PATH})
+ string(REPLACE "_" "/" HEADER_PATH ${HEADER_PATH})
+ # find_file will create a cache entry for the variable
+ # SYSTEM_HEADER, so reset it before each call
+ set(SYSTEM_HEADER "SYSTEM_HEADER-NOTFOUND")
+ find_file(SYSTEM_HEADER ${HEADER_PATH} PATHS "${LIBICONV_INCLUDE_DIRS}")
+ if(SYSTEM_HEADER)
+ # Gnulib uses #include_next to extend system header files,
+ # but MSVC doesn't support it, so a regular include directive
+ # with a relative path is used instead
+ string(REGEX REPLACE ".*/(.*/${HEADER_PATH})" "../\\1"
+ INCLUDE_PATH "${SYSTEM_HEADER}")
+ string(REGEX REPLACE "@INCLUDE_NEXT[^@]*@ @NEXT_[^@\n]+@"
+ "include <${INCLUDE_PATH}>" HEADER_CONTENT "${HEADER_CONTENT}")
+ endif()
+
+ # Default any remaining template variables to 0
+ string(REGEX REPLACE "@[^@\n]+@" "0" HEADER_CONTENT "${HEADER_CONTENT}")
+
+ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${HEADER_TEMPLATES_PATH}/${HEADER_PATH}" "${HEADER_CONTENT}")
+endforeach()
+
+add_library(libgettextsrc ${libgettextsrc_SOURCES})
+target_link_libraries(libgettextsrc ${LIBICONV_LIBRARIES})
+
+set(msgmerge_SOURCES
+ msgmerge.c
+ msgl-fsearch.c
+ lang-table.c
+ )
+PREFIX_LIST_ITEMS(msgmerge_SOURCES "gettext-tools/src/")
+
+add_executable(msgmerge ${msgmerge_SOURCES})
+target_link_libraries(msgmerge libgettextsrc)
+add_dependencies(msgmerge libgettextsrc libintl)
+
+set(msgfmt_SOURCES
+ msgfmt.c
+ write-mo.c
+ write-java.c
+ write-csharp.c
+ write-resources.c
+ write-tcl.c
+ write-qt.c
+ write-desktop.c
+ write-xml.c)
+PREFIX_LIST_ITEMS(msgfmt_SOURCES "gettext-tools/src/")
+
+add_executable(msgfmt ${msgfmt_SOURCES} gettext-runtime/intl/hash-string.c)
+target_link_libraries(msgfmt libgettextsrc)
+add_dependencies(msgfmt libgettextsrc libintl)
+
+set(xgettext_SOURCES
+ xgettext.c x-c.c x-po.c x-sh.c x-python.c x-lisp.c x-elisp.c x-librep.c
+ x-scheme.c x-smalltalk.c x-java.c x-csharp.c x-awk.c x-ycp.c x-tcl.c x-perl.c
+ x-php.c x-rst.c x-lua.c x-javascript.c x-vala.c x-desktop.c)
+PREFIX_LIST_ITEMS(xgettext_SOURCES "gettext-tools/src/")
+
+add_executable(xgettext ${xgettext_SOURCES})
+target_link_libraries(xgettext libgettextsrc)
+add_dependencies(xgettext libgettextsrc libintl)
+
+set_property(TARGET msgmerge msgfmt xgettext libgettextsrc APPEND PROPERTY
+ INCLUDE_DIRECTORIES
+ ${CMAKE_CURRENT_SOURCE_DIR}/gettext-runtime/intl
+ ${CMAKE_CURRENT_SOURCE_DIR}/gettext-tools/libgettextpo
+ ${CMAKE_CURRENT_SOURCE_DIR}/gettext-tools/gnulib-lib
+ ${CMAKE_CURRENT_SOURCE_DIR}/gettext-tools/gnulib-lib/libcroco
+ ${CMAKE_CURRENT_SOURCE_DIR}/build-aux/snippet
+ ${CMAKE_CURRENT_BINARY_DIR}/gettext-runtime/intl
+ ${CMAKE_CURRENT_BINARY_DIR}/gettext-tools
+ ${CMAKE_CURRENT_BINARY_DIR}/gettext-tools/gnulib-lib
+ ${LIBICONV_INCLUDE_DIRS})
+
+include(GNUInstallDirs)
+
+install(FILES
+ ${CMAKE_CURRENT_BINARY_DIR}/gettext-runtime/intl/libgnuintl.h
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+ RENAME libintl.h)
+
+install(TARGETS libintl msgmerge msgfmt xgettext
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
diff --git a/third-party/cmake/GperfCMakeLists.txt b/third-party/cmake/GperfCMakeLists.txt
new file mode 100644
index 0000000000..15ae305ba8
--- /dev/null
+++ b/third-party/cmake/GperfCMakeLists.txt
@@ -0,0 +1,30 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(gperf LANGUAGES C CXX)
+
+add_executable(gperf
+ lib/getline.cc
+ lib/hash.cc
+ lib/getopt.c
+ lib/getopt1.c
+ src/version.cc
+ src/positions.cc
+ src/options.cc
+ src/keyword.cc
+ src/keyword-list.cc
+ src/input.cc
+ src/bool-array.cc
+ src/hash-table.cc
+ src/search.cc
+ src/output.cc
+ src/main.cc)
+
+include_directories(lib)
+
+# Copy the config.h template without modifying it
+# because none of the definitions are necessary
+execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/src/config.h.in ${CMAKE_BINARY_DIR}/config/config.h)
+include_directories(${CMAKE_BINARY_DIR}/config)
+
+include(GNUInstallDirs)
+install(TARGETS gperf
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
diff --git a/third-party/cmake/LibiconvCMakeLists.txt b/third-party/cmake/LibiconvCMakeLists.txt
new file mode 100644
index 0000000000..8ad3cc9352
--- /dev/null
+++ b/third-party/cmake/LibiconvCMakeLists.txt
@@ -0,0 +1,97 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(libiconv C)
+
+include_directories(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/srclib
+ ${CMAKE_CURRENT_BINARY_DIR}
+ ${CMAKE_CURRENT_BINARY_DIR}/srclib
+ ${CMAKE_CURRENT_SOURCE_DIR}/build-aux/snippet)
+
+configure_file(config.h.in config.h)
+file(READ "${CMAKE_CURRENT_BINARY_DIR}/config.h" CONFIG_CONTENT)
+string(REPLACE "#undef EILSEQ" "" CONFIG_CONTENT "${CONFIG_CONTENT}")
+string(REPLACE "#undef HAVE_MBRTOWC" "#define HAVE_MBRTOWC 1" CONFIG_CONTENT "${CONFIG_CONTENT}")
+string(REPLACE "#undef HAVE_MBSINIT" "#define HAVE_MBSINIT 1" CONFIG_CONTENT "${CONFIG_CONTENT}")
+string(REPLACE "#undef HAVE_WCRTOMB" "#define HAVE_WCRTOMB 1" CONFIG_CONTENT "${CONFIG_CONTENT}")
+string(REPLACE "#undef HAVE_DECL___ARGV" "#define HAVE_DECL___ARGV 1" CONFIG_CONTENT "${CONFIG_CONTENT}")
+string(REPLACE "#undef HAVE_WORKING_O_NOFOLLOW" "#define HAVE_WORKING_O_NOFOLLOW 0" CONFIG_CONTENT "${CONFIG_CONTENT}")
+string(REPLACE "#undef ICONV_CONST" "#define ICONV_CONST const" CONFIG_CONTENT "${CONFIG_CONTENT}")
+string(REPLACE "#undef WORDS_LITTLEENDIAN" "#define WORDS_LITTLEENDIAN 1" CONFIG_CONTENT "${CONFIG_CONTENT}")
+string(REPLACE "#undef HAVE_DECL_STRERROR_R" "#define HAVE_DECL_STRERROR_R 0" CONFIG_CONTENT "${CONFIG_CONTENT}")
+string(REPLACE "#undef mode_t" "#define mode_t int" CONFIG_CONTENT "${CONFIG_CONTENT}")
+string(REPLACE "#undef ssize_t" "#include <BaseTsd.h>\n#define ssize_t SSIZE_T" CONFIG_CONTENT "${CONFIG_CONTENT}")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/config.h" "${CONFIG_CONTENT}")
+
+set(BROKEN_WCHAR_H 0)
+set(HAVE_VISIBILITY 0)
+set(HAVE_WCHAR_T 1)
+set(ICONV_CONST "const")
+set(USE_MBSTATE_T 0)
+configure_file(libcharset/include/localcharset.h.build.in localcharset.h)
+configure_file(include/iconv.h.build.in iconv.h)
+
+add_definitions(-DLIBDIR -D_CRT_SECURE_NO_WARNINGS)
+
+add_library(libcharset libcharset/lib/localcharset.c)
+
+add_library(libiconv lib/iconv.c)
+target_link_libraries(libiconv libcharset)
+
+add_executable(iconv src/iconv.c srclib/progname.c srclib/getprogname.c
+ srclib/safe-read.c srclib/uniwidth/width.c srclib/error.c srclib/xmalloc.c
+ srclib/basename-lgpl.c)
+target_link_libraries(iconv libiconv)
+
+set(HEADER_TEMPLATES_PATH "srclib")
+set(HEADER_TEMPLATES_ABS_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${HEADER_TEMPLATES_PATH}")
+file(GLOB_RECURSE HEADER_TEMPLATES "${HEADER_TEMPLATES_ABS_PATH}/*.in.h")
+list(REMOVE_ITEM HEADER_TEMPLATES "${HEADER_TEMPLATES_ABS_PATH}/stdint.in.h")
+list(REMOVE_ITEM HEADER_TEMPLATES "${HEADER_TEMPLATES_ABS_PATH}/wchar.in.h")
+foreach(HEADER_TEMPLATE ${HEADER_TEMPLATES})
+ file(READ ${HEADER_TEMPLATE} HEADER_CONTENT)
+ string(REPLACE "/* The definition of _GL_ARG_NONNULL is copied here. */" "#include \"arg-nonnull.h\"" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "/* The definition of _GL_WARN_ON_USE is copied here. */" "#include \"warn-on-use.h\"" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */" "#include \"c++defs.h\"" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@GNULIB_LSTAT@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@GNULIB_SIGACTION@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@GNULIB_SIGPROCMASK@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@HAVE_ISWCNTRL@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@HAVE_WCTYPE_T@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@PRAGMA_COLUMNS@" "" HEADER_CONTENT "${HEADER_CONTENT}")
+
+ string(REGEX REPLACE "^${HEADER_TEMPLATES_ABS_PATH}/" "" HEADER_PATH "${HEADER_TEMPLATE}")
+ string(REPLACE ".in" "" HEADER_PATH ${HEADER_PATH})
+ string(REPLACE "_" "/" HEADER_PATH ${HEADER_PATH})
+ # find_file will create a cache entry for the variable
+ # SYSTEM_HEADER, so reset it before each call
+ set(SYSTEM_HEADER "SYSTEM_HEADER-NOTFOUND")
+ find_file(SYSTEM_HEADER ${HEADER_PATH} PATHS "${LIBICONV_INCLUDE_DIRS}")
+ if(SYSTEM_HEADER)
+ # Gnulib uses #include_next to extend system header files,
+ # but MSVC doesn't support it, so a regular include directive
+ # with a relative path is used instead
+ string(REGEX REPLACE ".*/(.*/${HEADER_PATH})" "../\\1"
+ INCLUDE_PATH "${SYSTEM_HEADER}")
+ string(REGEX REPLACE "@INCLUDE_NEXT[^@]*@ @NEXT_[^@\n]+@"
+ "include <${INCLUDE_PATH}>" HEADER_CONTENT "${HEADER_CONTENT}")
+ endif()
+
+ # Default any remaining template variables to 0
+ string(REGEX REPLACE "@[^@\n]+@" "0" HEADER_CONTENT "${HEADER_CONTENT}")
+
+ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${HEADER_TEMPLATES_PATH}/${HEADER_PATH}" "${HEADER_CONTENT}")
+endforeach()
+
+include(GNUInstallDirs)
+
+install(FILES
+ ${CMAKE_CURRENT_BINARY_DIR}/iconv.h
+ ${CMAKE_CURRENT_BINARY_DIR}/localcharset.h
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+
+install(TARGETS libcharset libiconv iconv
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
diff --git a/third-party/cmake/LibuvCMakeLists.txt b/third-party/cmake/LibuvCMakeLists.txt
new file mode 100644
index 0000000000..0432319834
--- /dev/null
+++ b/third-party/cmake/LibuvCMakeLists.txt
@@ -0,0 +1,33 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(libuv LANGUAGES C)
+
+file(GLOB UV_SOURCES_COMMON src/*.c)
+file(GLOB UV_SOURCES_WIN src/win/*.c)
+
+add_library(uv ${UV_SOURCES_COMMON} ${UV_SOURCES_WIN})
+target_compile_definitions(uv PRIVATE WIN32_LEAN_AND_MEAN "_WIN32_WINNT=0x0600")
+target_link_libraries(uv iphlpapi psapi shell32 userenv ws2_32)
+target_include_directories(uv PUBLIC ./include PRIVATE ./src)
+if(BUILD_SHARED_LIBS)
+ set_target_properties(uv PROPERTIES DEFINE_SYMBOL BUILDING_UV_SHARED)
+endif()
+
+install(FILES
+ include/uv.h
+ DESTINATION include)
+
+install(FILES
+ include/uv/errno.h
+ include/uv/threadpool.h
+ include/uv/tree.h
+ include/uv/version.h
+ include/uv/win.h
+ DESTINATION include/uv)
+
+include(GNUInstallDirs)
+install(TARGETS uv
+ PUBLIC_HEADER
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+ PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
diff --git a/third-party/cmake/Libvterm-tbl2inc_c.cmake b/third-party/cmake/Libvterm-tbl2inc_c.cmake
new file mode 100644
index 0000000000..7a82f4248b
--- /dev/null
+++ b/third-party/cmake/Libvterm-tbl2inc_c.cmake
@@ -0,0 +1,163 @@
+cmake_minimum_required(VERSION 2.8.12)
+
+set(HEX_ALPHABET "0123456789abcdef")
+
+function(ConvertToHex dec hex)
+ while(dec GREATER 0)
+ math(EXPR _val "${dec} % 16")
+ math(EXPR dec "${dec} / 16")
+ string(SUBSTRING ${HEX_ALPHABET} ${_val} 1 _val)
+ set(_res "${_val}${_res}")
+ endwhile()
+ # Pad the result with the number of zeros
+ # specified by the optional third argument
+ if(${ARGC} EQUAL 3)
+ set(padding ${ARGV2})
+ string(LENGTH ${_res} _resLen)
+ if(_resLen LESS ${padding})
+ math(EXPR _neededPadding "${padding} - ${_resLen}")
+ foreach(i RANGE 1 ${_neededPadding})
+ set(_res "0${_res}")
+ endforeach()
+ endif()
+ endif()
+ set(${hex} "0x${_res}" PARENT_SCOPE)
+endfunction()
+
+function(ConvertFromHex hex dec)
+ string(TOLOWER ${hex} hex)
+ string(LENGTH "${hex}" _strlen)
+ set(_res 0)
+ while(_strlen GREATER 0)
+ math(EXPR _res "${_res} * 16")
+ string(SUBSTRING "${hex}" 0 1 NIBBLE)
+ string(SUBSTRING "${hex}" 1 -1 hex)
+ string(FIND ${HEX_ALPHABET} ${NIBBLE} value)
+ if(value EQUAL -1)
+ message(FATAL_ERROR "Invalid hex character '${NIBBLE}'")
+ endif()
+ math(EXPR _res "${_res} + ${value}")
+ string(LENGTH "${hex}" _strlen)
+ endwhile()
+ set(${dec} ${_res} PARENT_SCOPE)
+endfunction()
+
+# Based on http://www.json.org/JSON_checker/utf8_decode.c
+function(DecodeUtf8 hexBytes codePoint)
+ string(SUBSTRING ${hexBytes} 0 2 hexByte1)
+ ConvertFromHex(${hexByte1} byte1)
+ # Zero continuations (0 to 127)
+ math(EXPR out "${byte1} & 128")
+ if(out EQUAL 0)
+ set(${codePoint} ${byte1} PARENT_SCOPE)
+ return()
+ endif()
+ # One continuation (128 to 2047)
+ math(EXPR out "${byte1} & 224")
+ if(out EQUAL 192)
+ string(SUBSTRING ${hexBytes} 2 2 hexByte2)
+ ConvertFromHex(${hexByte2} byte2)
+ math(EXPR result "((${byte1} & 31) << 6) | ${byte2}")
+ if(result GREATER 127)
+ set(${codePoint} ${result} PARENT_SCOPE)
+ return()
+ endif()
+ else()
+ # Two continuations (2048 to 55295 and 57344 to 65535)
+ math(EXPR result "${byte1} & 240")
+ if(result EQUAL 224)
+ string(SUBSTRING ${hexBytes} 2 2 hexByte2)
+ string(SUBSTRING ${hexBytes} 4 2 hexByte3)
+ ConvertFromHex(${hexByte2} byte2)
+ ConvertFromHex(${hexByte3} byte3)
+ math(EXPR result "${byte2} | ${byte3}")
+ if(result GREATER -1)
+ math(EXPR result "((${byte1} & 15) << 12) | (${byte2} << 6) | ${byte3}")
+ if((result GREATER 2047) AND (result LESS 55296 OR result GREATER 57343))
+ set(${codePoint} ${result} PARENT_SCOPE)
+ return()
+ endif()
+ endif()
+ else()
+ # Three continuations (65536 to 1114111)
+ math(EXPR result "${byte1} & 248")
+ if(result EQUAL 224)
+ string(SUBSTRING ${hexBytes} 2 2 hexByte2)
+ string(SUBSTRING ${hexBytes} 4 2 hexByte3)
+ string(SUBSTRING ${hexBytes} 6 2 hexByte4)
+ ConvertFromHex(${hexByte2} byte2)
+ ConvertFromHex(${hexByte3} byte3)
+ ConvertFromHex(${hexByte4} byte4)
+ math(EXPR result "${byte2} | ${byte3} | ${byte4}")
+ if(result GREATER -1)
+ math(EXPR result "((c & 7) << 18) | (c1 << 12) | (c2 << 6) | c3")
+ if((result GREATER 65535) AND (result LESS 1114112))
+ set(${codePoint} ${result} PARENT_SCOPE)
+ return()
+ endif()
+ endif()
+ endif()
+ endif()
+ endif()
+ message(FATAL_ERROR "Invalid UTF-8 encoding")
+endfunction()
+
+set(inputFile ${CMAKE_ARGV3})
+set(outputFile ${CMAKE_ARGV4})
+# Get the file contents in text and hex-encoded format because
+# CMake doesn't provide functions for converting between the two
+file(READ "${inputFile}" contents)
+file(READ "${inputFile}" hexContents HEX)
+
+# Convert the text contents into a list of lines by escaping
+# the list separator ';' and then replacing new line characters
+# with the list separator
+string(REGEX REPLACE ";" "\\\\;" contents ${contents})
+string(REGEX REPLACE "\n" ";" contents ${contents})
+
+get_filename_component(encname ${inputFile} NAME_WE)
+set(output
+ "static const struct StaticTableEncoding encoding_${encname} = {\n"
+ " { .decode = &decode_table },\n"
+ " {")
+set(hexIndex 0)
+foreach(line ${contents})
+ string(LENGTH ${line} lineLength)
+ # Convert "A" to 0x41
+ string(FIND ${line} "\"" beginQuote)
+ if(NOT ${beginQuote} EQUAL -1)
+ string(FIND ${line} "\"" endQuote REVERSE)
+ if(${beginQuote} EQUAL ${endQuote})
+ message(FATAL_ERROR "Line contains only one quote")
+ endif()
+ math(EXPR beginHexQuote "${hexIndex} + (${beginQuote} + 1)*2")
+ math(EXPR endHexQuote "${hexIndex} + (${endQuote} + 1)*2")
+ math(EXPR quoteLen "${endHexQuote} - ${beginHexQuote} - 1")
+ string(SUBSTRING ${hexContents} ${beginHexQuote} ${quoteLen} hexQuote)
+ DecodeUtf8(${hexQuote} codePoint)
+ ConvertToHex(${codePoint} hexCodePoint 4)
+ STRING(REGEX REPLACE "\"(.+)\"" ${hexCodePoint} line ${line})
+ endif()
+ # Strip comment
+ string(REGEX REPLACE "[ \t\n]*#.*" "" line ${line})
+ # Convert 3/1 to [0x31]
+ string(REGEX REPLACE "^([0-9]+)/([0-9]+).*" "\\1;\\2" numbers ${line})
+ list(GET numbers 0 upperBits)
+ list(GET numbers 1 lowerBits)
+ math(EXPR res "${upperBits}*16 + ${lowerBits}")
+ ConvertToHex(${res} hex 2)
+ string(REGEX REPLACE "^([0-9]+)/([0-9]+)" "[${hex}]" line ${line})
+ # Convert U+0041 to 0x0041
+ string(REPLACE "U+" "0x" line ${line})
+ # Indent and append a comma
+ set(line " ${line},")
+ set(output "${output}\n${line}")
+ # Increment the index by the number of characters in the line,
+ # plus one for the new line character then multiple by two for the hex digit index
+ math(EXPR hexIndex "${hexIndex} + 2*(${lineLength} + 1)")
+endforeach()
+set(output "${output}\n"
+ " }\n"
+ "}\;\n")
+
+file(WRITE ${outputFile} ${output})
diff --git a/third-party/cmake/LibvtermCMakeLists.txt b/third-party/cmake/LibvtermCMakeLists.txt
new file mode 100644
index 0000000000..dad3ef62c2
--- /dev/null
+++ b/third-party/cmake/LibvtermCMakeLists.txt
@@ -0,0 +1,91 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(libvterm LANGUAGES C)
+
+include(GNUInstallDirs)
+find_package(Perl)
+
+if(MSVC)
+ add_definitions(/W3 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE)
+else()
+ add_definitions(-Wall -std=c99)
+endif()
+
+# Generate includes from tables
+file(GLOB TBL_FILES ${CMAKE_SOURCE_DIR}/src/encoding/*.tbl)
+set(TBL_FILES_HEADERS)
+foreach(file ${TBL_FILES})
+ get_filename_component(basename ${file} NAME_WE)
+ set(tname encoding/${basename}.inc)
+ add_custom_command(OUTPUT
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/encoding/
+ COMMAND ${CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/tbl2inc_c.cmake ${file} ${CMAKE_BINARY_DIR}/${tname}
+ COMMENT "Generating ${tname}"
+ OUTPUT ${CMAKE_BINARY_DIR}/${tname}
+ )
+ list(APPEND TBL_FILES_HEADERS ${tname})
+ # Only used for verifying that the output of tbl2inc_c.cmake is correct
+ set(tname encoding-test/${basename}.inc)
+ add_custom_command(OUTPUT
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/encoding-test/
+ COMMAND ${PERL_EXECUTABLE} -CSD ${CMAKE_SOURCE_DIR}/tbl2inc_c.pl ${file} > ${CMAKE_BINARY_DIR}/${tname}
+ COMMENT "Generating ${tname}"
+ OUTPUT ${CMAKE_BINARY_DIR}/${tname}
+ )
+endforeach()
+
+include_directories(${CMAKE_SOURCE_DIR}/include)
+include_directories(${CMAKE_BINARY_DIR})
+
+file(GLOB VTERM_SOURCES ${CMAKE_SOURCE_DIR}/src/*.c)
+add_library(vterm ${VTERM_SOURCES} ${TBL_FILES_HEADERS})
+install(TARGETS vterm ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+
+add_library(vterm-shared SHARED ${VTERM_SOURCES} ${TBL_FILES_HEADERS})
+set_target_properties(vterm-shared PROPERTIES
+ OUTPUT_NAME vterm
+ SOVERSION 0)
+install(TARGETS vterm-shared
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+
+install(FILES include/vterm.h include/vterm_keycodes.h
+ DESTINATION include)
+
+if(NOT WIN32)
+ file(GLOB BIN_SOURCES ${CMAKE_SOURCE_DIR}/bin/*.c)
+ foreach(EXE_C ${BIN_SOURCES})
+ get_filename_component(target_name ${EXE_C} NAME_WE)
+ add_executable(${target_name} ${EXE_C})
+ target_link_libraries(${target_name} vterm)
+ install(TARGETS ${target_name} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+ endforeach()
+endif()
+
+# Tests
+add_executable(harness EXCLUDE_FROM_ALL t/harness.c)
+target_link_libraries(harness vterm)
+set_target_properties(harness PROPERTIES
+ # run-test.pl expects to find the harness in t/.libs/
+ RUNTIME_OUTPUT_DIRECTORY t/.libs)
+
+if(Perl_FOUND)
+ file(GLOB TESTFILES ${CMAKE_SOURCE_DIR}/t/*.test)
+ add_custom_target(check)
+ foreach(testfile ${TESTFILES})
+ get_filename_component(target_name ${testfile} NAME_WE)
+ add_custom_target(${target_name}
+ COMMAND ${PERL_EXECUTABLE} ${CMAKE_SOURCE_DIR}/t/run-test.pl ${testfile}
+ COMMENT "**${target_name} **"
+ DEPENDS harness)
+ add_dependencies(check ${target_name})
+ endforeach()
+
+ foreach(header_path ${TBL_FILES_HEADERS})
+ get_filename_component(header_name ${header_path} NAME)
+ set(perl_header_path ${CMAKE_BINARY_DIR}/encoding-test/${header_name})
+ add_custom_target(test-${header_name}
+ COMMAND ${CMAKE_COMMAND} -E compare_files
+ ${header_path} ${perl_header_path}
+ DEPENDS ${header_path} ${perl_header_path})
+ endforeach()
+endif()
diff --git a/third-party/cmake/PatchLuv.cmake b/third-party/cmake/PatchLuv.cmake
deleted file mode 100644
index 96595a2f30..0000000000
--- a/third-party/cmake/PatchLuv.cmake
+++ /dev/null
@@ -1,29 +0,0 @@
-# replace luv default rockspec with the alternate one under the "rockspecs"
-# directory
-file(GLOB LUV_ROCKSPEC RELATIVE ${LUV_SRC_DIR} ${LUV_SRC_DIR}/*.rockspec)
-file(RENAME ${LUV_SRC_DIR}/rockspecs/${LUV_ROCKSPEC} ${LUV_SRC_DIR}/${LUV_ROCKSPEC})
-
-# Some versions of mingw are missing defines required by luv dns module, add
-# them now
-set(LUV_SRC_DNS_C_DEFS
-"#ifndef AI_NUMERICSERV
-# define AI_NUMERICSERV 0x0008
-#endif
-#ifndef AI_ALL
-# define AI_ALL 0x00000100
-#endif
-#ifndef AI_ADDRCONFIG
-# define AI_ADDRCONFIG 0x00000400
-#endif
-#ifndef AI_V4MAPPED
-# define AI_V4MAPPED 0x00000800
-#endif")
-
-file(READ ${LUV_SRC_DIR}/src/dns.c LUV_SRC_DNS_C)
-string(REPLACE
- "\n#include <netdb.h>"
- "\n#include <netdb.h>\n#else\n${LUV_SRC_DNS_C_DEFS}"
- LUV_SRC_DNS_C_PATCHED
- "${LUV_SRC_DNS_C}")
-file(WRITE ${LUV_SRC_DIR}/src/dns.c "${LUV_SRC_DNS_C_PATCHED}")
-
diff --git a/third-party/cmake/TargetArch.cmake b/third-party/cmake/TargetArch.cmake
new file mode 100644
index 0000000000..71ea44ec59
--- /dev/null
+++ b/third-party/cmake/TargetArch.cmake
@@ -0,0 +1,23 @@
+# Sets TARGET_ARCH to a normalized name (X86 or X86_64).
+# See https://github.com/axr/solar-cmake/blob/master/TargetArch.cmake
+include(CheckSymbolExists)
+
+# X86
+check_symbol_exists("_M_IX86" "" T_M_IX86)
+check_symbol_exists("__i386__" "" T_I386)
+if(T_M_IX86 OR T_I386)
+set(TARGET_ARCH "X86")
+ return()
+endif()
+
+# X86_64
+check_symbol_exists("_M_AMD64" "" T_M_AMD64)
+check_symbol_exists("__x86_64__" "" T_X86_64)
+check_symbol_exists("__amd64__" "" T_AMD64)
+
+if(T_M_AMD64 OR T_X86_64 OR T_AMD64)
+set(TARGET_ARCH "X86_64")
+ return()
+endif()
+
+message(FATAL_ERROR "Unknown target architecture")
diff --git a/third-party/cmake/UnibiliumCMakeLists.txt b/third-party/cmake/UnibiliumCMakeLists.txt
new file mode 100644
index 0000000000..a96482bcbb
--- /dev/null
+++ b/third-party/cmake/UnibiliumCMakeLists.txt
@@ -0,0 +1,29 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(unibilium LANGUAGES C)
+
+file(GLOB SRC_FILES ${PROJECT_SOURCE_DIR}/*.c)
+add_library(unibilium ${SRC_FILES})
+set_target_properties(unibilium PROPERTIES PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/unibilium.h
+ VERSION "${VERSION_MAJOR}.${VERSION_MINOR}")
+
+if(NOT WIN32)
+ execute_process(COMMAND "shell ncursesw6-config --terminfo-dirs 2>/dev/null || \
+ ncurses6-config --terminfo-dirs 2>/dev/null || \
+ ncursesw5-config --terminfo-dirs 2>/dev/null || \
+ ncurses5-config --terminfo-dirs 2>/dev/null || \
+ echo '/etc/terminfo:/lib/terminfo:/usr/share/terminfo:/usr/lib/terminfo:/usr/local/share/terminfo:/usr/local/lib/terminfo'"
+ OUTPUT_VARIABLE TERMINFO_DIRS)
+else()
+ set(TERMINFO_DIRS "\"\"")
+endif()
+target_compile_definitions(unibilium PUBLIC TERMINFO_DIRS=${TERMINFO_DIRS})
+
+if(MSVC)
+ target_include_directories(unibilium PUBLIC ${PROJECT_SOURCE_DIR}/msvc-compat)
+endif()
+
+include(GNUInstallDirs)
+install(TARGETS unibilium
+ PUBLIC_HEADER
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
diff --git a/third-party/cmake/libtermkeyCMakeLists.txt b/third-party/cmake/libtermkeyCMakeLists.txt
new file mode 100644
index 0000000000..c55da7929a
--- /dev/null
+++ b/third-party/cmake/libtermkeyCMakeLists.txt
@@ -0,0 +1,34 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(libtermkey)
+
+add_definitions(-D _CRT_SECURE_NO_WARNINGS)
+add_definitions(-DHAVE_UNIBILIUM)
+if(NOT MSVC)
+ add_definitions(-std=c99)
+endif()
+
+include_directories(${PROJECT_BINARY_DIR}/t)
+include_directories(SYSTEM ${UNIBILIUM_INCLUDE_DIRS})
+
+add_library(termkey termkey.c driver-csi.c driver-ti.c)
+set_target_properties(termkey PROPERTIES
+ PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/termkey.h)
+target_link_libraries(termkey ${UNIBILIUM_LIBRARIES})
+
+include(GNUInstallDirs)
+install(TARGETS termkey
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+
+enable_testing()
+file(GLOB TESTSOURCES "t/[0-9]*.c")
+foreach(f ${TESTSOURCES})
+ get_filename_component(t ${f} NAME_WE)
+ if(${t} STREQUAL 05read)
+ continue()
+ endif()
+
+ add_executable("test_${t}" ${f} t/taplib.c)
+ target_link_libraries("test_${t}" termkey)
+ add_test("${t}" "test_${t}")
+endforeach()
diff --git a/third-party/msvc-compat/unistd.h b/third-party/msvc-compat/unistd.h
new file mode 100644
index 0000000000..d9ee57b54b
--- /dev/null
+++ b/third-party/msvc-compat/unistd.h
@@ -0,0 +1,10 @@
+#ifndef GUARD_UNIBILIUM_UNISTD_H_
+#define GUARD_UNIBILIUM_UNISTD_H_
+
+#ifdef _WIN64
+typedef unsigned __int64 ssize_t;
+#else
+typedef _W64 unsigned int ssize_t;
+#endif
+
+#endif
diff --git a/third-party/patches/gettext-Fix-building-with-MSVC.patch b/third-party/patches/gettext-Fix-building-with-MSVC.patch
new file mode 100644
index 0000000000..d15901bce3
--- /dev/null
+++ b/third-party/patches/gettext-Fix-building-with-MSVC.patch
@@ -0,0 +1,50 @@
+diff --git a/gettext-tools/config.h.in b/gettext-tools/config.h.in
+index 6818a4d..9842a71 100644
+--- a/gettext-tools/config.h.in
++++ b/gettext-tools/config.h.in
+@@ -3147,7 +3147,7 @@
+ #define PAGE_WIDTH 79
+
+ /* On Windows, variables that may be in a DLL must be marked specially. */
+-#if ((defined _MSC_VER && defined _DLL) || defined WOE32DLL) && !defined IN_RELOCWRAPPER
++#if ((defined _MSC_VER && defined DLL_IMPORT) || defined WOE32DLL) && !defined IN_RELOCWRAPPER
+ # define DLL_VARIABLE __declspec (dllimport)
+ #else
+ # define DLL_VARIABLE
+diff --git a/gettext-tools/gnulib-lib/javaversion.c b/gettext-tools/gnulib-lib/javaversion.c
+index d760c32..4867fda 100644
+--- a/gettext-tools/gnulib-lib/javaversion.c
++++ b/gettext-tools/gnulib-lib/javaversion.c
+@@ -39,7 +39,7 @@
+ #define _(str) gettext (str)
+
+ /* Get PKGDATADIR. */
+-#include "configmake.h"
++#define PKGDATADIR ""
+
+
+ struct locals
+diff --git a/gettext-tools/libgettextpo/xalloc.h b/gettext-tools/libgettextpo/xalloc.h
+index f4a329e..a38dcf1 100644
+--- a/gettext-tools/libgettextpo/xalloc.h
++++ b/gettext-tools/libgettextpo/xalloc.h
+@@ -60,7 +60,7 @@ extern "C" {
+ in charge of honoring the three previous items. This is the
+ function to call when one wants the program to die because of a
+ memory allocation failure. */
+-extern void xalloc_die (void)
++extern _Noreturn void xalloc_die (void)
+ #if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) && !__STRICT_ANSI__
+ __attribute__ ((__noreturn__))
+ #endif
+diff --git a/gettext-tools/src/plural-exp.c b/gettext-tools/src/plural-exp.c
+index d5b9deb..e2c6bc4 100644
+--- a/gettext-tools/src/plural-exp.c
++++ b/gettext-tools/src/plural-exp.c
+@@ -17,5 +17,5 @@
+
+ /* Include the expression parsing code from libintl, with different function
+ names. */
+-#include "../intl/pluralx.c"
++#include "../intl/plural.c"
+ #include "../../gettext-runtime/intl/plural-exp.c"
diff --git a/third-party/patches/gettext-Fix-compilation-on-a-system-without-alloca.patch b/third-party/patches/gettext-Fix-compilation-on-a-system-without-alloca.patch
new file mode 100644
index 0000000000..5c472c470f
--- /dev/null
+++ b/third-party/patches/gettext-Fix-compilation-on-a-system-without-alloca.patch
@@ -0,0 +1,28 @@
+From 1d12aeb7334104f77070361492ff7cc8225503f5 Mon Sep 17 00:00:00 2001
+From: Daiki Ueno <ueno@gnu.org>
+Date: Mon, 14 Nov 2016 13:27:58 +0100
+Subject: [PATCH] intl: Fix compilation on a system without alloca
+
+* gettext-runtime/intl/dcigettext.c (DCIGETTEXT): Fix typo 'tmp_dirname'
+-> 'resolved_dirname'. Reported by Egor Pugin in:
+http://lists.gnu.org/archive/html/bug-gettext/2016-09/msg00008.html
+---
+ gettext-runtime/intl/dcigettext.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/gettext-runtime/intl/dcigettext.c b/gettext-runtime/intl/dcigettext.c
+index 83bd77574..92f6fd685 100644
+--- a/gettext-runtime/intl/dcigettext.c
++++ b/gettext-runtime/intl/dcigettext.c
+@@ -634,7 +634,7 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
+ for (;;)
+ {
+ resolved_dirname = (char *) alloca (path_max + dirname_len);
+- ADD_BLOCK (block_list, tmp_dirname);
++ ADD_BLOCK (block_list, resolved_dirname);
+
+ __set_errno (0);
+ ret = getcwd (resolved_dirname, path_max);
+--
+2.16.1.windows.4
+
diff --git a/third-party/patches/libtermkey-Add-support-for-Windows.patch b/third-party/patches/libtermkey-Add-support-for-Windows.patch
new file mode 100644
index 0000000000..b839e94d05
--- /dev/null
+++ b/third-party/patches/libtermkey-Add-support-for-Windows.patch
@@ -0,0 +1,170 @@
+From fbe91a958816d85fa93665eb8f7a7a8e05eb9650 Mon Sep 17 00:00:00 2001
+From: Rui Abreu Ferreira <raf-ep@gmx.com>
+Date: Tue, 5 Apr 2016 00:12:41 +0100
+Subject: [PATCH] Add support for Windows
+
+Ported termkey for windows.
+
+- The TERMKEY_FLAG_NOTERMIOS is ignore in Windows, since there is no termios.
+- The termkey_waitkey() function is not implemented in windows, since there
+ is no poll() alternative.
+- The CMake recipe only supports unibilium, not curses.
+---
+ driver-ti.c | 8 +++++++-
+ termkey-internal.h | 11 ++++++++++-
+ termkey.c | 22 ++++++++++++++++++----
+ 3 files changed, 35 insertions(+), 6 deletions(-)
+
+diff --git a/driver-ti.c b/driver-ti.c
+index e673ab7..f5f8052 100644
+--- a/driver-ti.c
++++ b/driver-ti.c
+@@ -17,7 +17,9 @@
+ #include <ctype.h>
+ #include <stdio.h>
+ #include <string.h>
+-#include <unistd.h>
++#ifndef _WIN32
++# include <unistd.h>
++#endif
+ #include <sys/types.h>
+ #include <sys/stat.h>
+
+@@ -338,8 +340,10 @@ static int start_driver(TermKey *tk, void *info)
+ if(fstat(tk->fd, &statbuf) == -1)
+ return 0;
+
++#ifndef _WIN32
+ if(S_ISFIFO(statbuf.st_mode))
+ return 1;
++#endif
+
+ // Can't call putp or tputs because they suck and don't give us fd control
+ len = strlen(start_string);
+@@ -367,8 +371,10 @@ static int stop_driver(TermKey *tk, void *info)
+ if(fstat(tk->fd, &statbuf) == -1)
+ return 0;
+
++#ifndef _WIN32
+ if(S_ISFIFO(statbuf.st_mode))
+ return 1;
++#endif
+
+ /* The terminfo database will contain keys in application cursor key mode.
+ * We may need to enable that mode
+diff --git a/termkey-internal.h b/termkey-internal.h
+index 52829b3..b796729 100644
+--- a/termkey-internal.h
++++ b/termkey-internal.h
+@@ -4,7 +4,14 @@
+ #include "termkey.h"
+
+ #include <stdint.h>
+-#include <termios.h>
++#ifndef _WIN32
++# include <termios.h>
++#endif
++
++#ifdef _MSC_VER
++#include <BaseTsd.h>
++typedef SSIZE_T ssize_t;
++#endif
+
+ struct TermKeyDriver
+ {
+@@ -41,8 +48,10 @@ struct TermKey {
+ size_t hightide; /* Position beyond buffstart at which peekkey() should next start
+ * normally 0, but see also termkey_interpret_csi */
+
++#ifndef _WIN32
+ struct termios restore_termios;
+ char restore_termios_valid;
++#endif
+
+ TermKey_Terminfo_Getstr_Hook *ti_getstr_hook;
+ void *ti_getstr_hook_data;
+diff --git a/termkey.c b/termkey.c
+index 2f01f3a..145b99f 100644
+--- a/termkey.c
++++ b/termkey.c
+@@ -3,14 +3,20 @@
+
+ #include <ctype.h>
+ #include <errno.h>
+-#include <poll.h>
+-#include <unistd.h>
++#ifndef _WIN32
++# include <poll.h>
++# include <unistd.h>
++# include <strings.h>
++#endif
+ #include <string.h>
+-#include <strings.h>
+
+ #include <stdio.h>
+
+-#define strcaseeq(a,b) (strcasecmp(a,b) == 0)
++#ifdef _MSC_VER
++# define strcaseeq(a,b) (_stricmp(a,b) == 0)
++#else
++# define strcaseeq(a,b) (strcasecmp(a,b) == 0)
++#endif
+
+ void termkey_check_version(int major, int minor)
+ {
+@@ -282,7 +288,9 @@ static TermKey *termkey_alloc(void)
+ tk->buffsize = 256; /* bytes */
+ tk->hightide = 0;
+
++#ifndef _WIN32
+ tk->restore_termios_valid = 0;
++#endif
+
+ tk->ti_getstr_hook = NULL;
+ tk->ti_getstr_hook_data = NULL;
+@@ -483,6 +491,7 @@ int termkey_start(TermKey *tk)
+ if(tk->is_started)
+ return 1;
+
++#ifndef _WIN32
+ if(tk->fd != -1 && !(tk->flags & TERMKEY_FLAG_NOTERMIOS)) {
+ struct termios termios;
+ if(tcgetattr(tk->fd, &termios) == 0) {
+@@ -517,6 +526,7 @@ int termkey_start(TermKey *tk)
+ tcsetattr(tk->fd, TCSANOW, &termios);
+ }
+ }
++#endif
+
+ struct TermKeyDriverNode *p;
+ for(p = tk->drivers; p; p = p->next)
+@@ -542,8 +552,10 @@ int termkey_stop(TermKey *tk)
+ if(p->driver->stop_driver)
+ (*p->driver->stop_driver)(tk, p->info);
+
++#ifndef _WIN32
+ if(tk->restore_termios_valid)
+ tcsetattr(tk->fd, TCSANOW, &tk->restore_termios);
++#endif
+
+ tk->is_started = 0;
+
+@@ -1046,6 +1058,7 @@ TermKeyResult termkey_getkey_force(TermKey *tk, TermKeyKey *key)
+ return ret;
+ }
+
++#ifndef _WIN32
+ TermKeyResult termkey_waitkey(TermKey *tk, TermKeyKey *key)
+ {
+ if(tk->fd == -1) {
+@@ -1105,6 +1118,7 @@ retry:
+
+ /* UNREACHABLE */
+ }
++#endif
+
+ TermKeyResult termkey_advisereadable(TermKey *tk)
+ {
+--
+2.16.1.windows.4
+
diff --git a/third-party/patches/libtermkey-Fix-escape-sequences-for-MSVC.patch b/third-party/patches/libtermkey-Fix-escape-sequences-for-MSVC.patch
new file mode 100644
index 0000000000..c1099bd3c4
--- /dev/null
+++ b/third-party/patches/libtermkey-Fix-escape-sequences-for-MSVC.patch
@@ -0,0 +1,189 @@
+diff --git a/t/30mouse.c b/t/30mouse.c
+--- a/t/30mouse.c
++++ b/t/30mouse.c
+@@ -14,7 +14,7 @@ int main(int argc, char *argv[])
+
+ tk = termkey_new_abstract("vt100", 0);
+
+- termkey_push_bytes(tk, "\e[M !!", 6);
++ termkey_push_bytes(tk, "\x1b[M !!", 6);
+
+ key.type = -1;
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for mouse press");
+@@ -38,7 +38,7 @@ int main(int argc, char *argv[])
+ is_int(len, 21, "string length for press");
+ is_str(buffer, "MousePress(1) @ (1,1)", "string buffer for press");
+
+- termkey_push_bytes(tk, "\e[M@\"!", 6);
++ termkey_push_bytes(tk, "\x1b[M@\"!", 6);
+
+ key.type = -1;
+ ev = -1; button = -1; line = -1; col = -1;
+@@ -51,7 +51,7 @@ int main(int argc, char *argv[])
+ is_int(col, 2, "mouse column for drag");
+ is_int(key.modifiers, 0, "modifiers for press");
+
+- termkey_push_bytes(tk, "\e[M##!", 6);
++ termkey_push_bytes(tk, "\x1b[M##!", 6);
+
+ key.type = -1;
+ ev = -1; button = -1; line = -1; col = -1;
+@@ -63,7 +63,7 @@ int main(int argc, char *argv[])
+ is_int(col, 3, "mouse column for release");
+ is_int(key.modifiers, 0, "modifiers for press");
+
+- termkey_push_bytes(tk, "\e[M0++", 6);
++ termkey_push_bytes(tk, "\x1b[M0++", 6);
+
+ key.type = -1;
+ ev = -1; button = -1; line = -1; col = -1;
+@@ -81,7 +81,7 @@ int main(int argc, char *argv[])
+ is_str(buffer, "C-MousePress(1)", "string buffer for Ctrl-press");
+
+ // rxvt protocol
+- termkey_push_bytes(tk, "\e[0;20;20M", 10);
++ termkey_push_bytes(tk, "\x1b[0;20;20M", 10);
+
+ key.type = -1;
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for mouse press rxvt protocol");
+@@ -96,7 +96,7 @@ int main(int argc, char *argv[])
+ is_int(col, 20, "mouse column for press rxvt protocol");
+ is_int(key.modifiers, 0, "modifiers for press rxvt protocol");
+
+- termkey_push_bytes(tk, "\e[3;20;20M", 10);
++ termkey_push_bytes(tk, "\x1b[3;20;20M", 10);
+
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for mouse release rxvt protocol");
+
+@@ -111,7 +111,7 @@ int main(int argc, char *argv[])
+ is_int(key.modifiers, 0, "modifiers for release rxvt protocol");
+
+ // SGR protocol
+- termkey_push_bytes(tk, "\e[<0;30;30M", 11);
++ termkey_push_bytes(tk, "\x1b[<0;30;30M", 11);
+
+ key.type = -1;
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for mouse press SGR encoding");
+@@ -127,7 +127,7 @@ int main(int argc, char *argv[])
+ is_int(col, 30, "mouse column for press SGR");
+ is_int(key.modifiers, 0, "modifiers for press SGR");
+
+- termkey_push_bytes(tk, "\e[<0;30;30m", 11);
++ termkey_push_bytes(tk, "\x1b[<0;30;30m", 11);
+
+ key.type = -1;
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for mouse release SGR encoding");
+@@ -139,7 +139,7 @@ int main(int argc, char *argv[])
+
+ is_int(ev, TERMKEY_MOUSE_RELEASE, "mouse event for release SGR");
+
+- termkey_push_bytes(tk, "\e[<0;500;300M", 13);
++ termkey_push_bytes(tk, "\x1b[<0;500;300M", 13);
+
+ key.type = -1;
+ ev = -1; button = -1; line = -1; col = -1;
+diff --git a/t/31position.c b/t/31position.c
+index 1748211..86ad1bc 100644
+--- a/t/31position.c
++++ b/t/31position.c
+@@ -11,7 +11,7 @@ int main(int argc, char *argv[])
+
+ tk = termkey_new_abstract("vt100", 0);
+
+- termkey_push_bytes(tk, "\e[?15;7R", 8);
++ termkey_push_bytes(tk, "\x1b[?15;7R", 8);
+
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for position report");
+
+@@ -25,7 +25,7 @@ int main(int argc, char *argv[])
+ /* A plain CSI R is likely to be <F3> though.
+ * This is tricky :/
+ */
+- termkey_push_bytes(tk, "\e[R", 3);
++ termkey_push_bytes(tk, "\x1b[R", 3);
+
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for <F3>");
+
+diff --git a/t/32modereport.c b/t/32modereport.c
+index 31de400..5e49705 100644
+--- a/t/32modereport.c
++++ b/t/32modereport.c
+@@ -11,7 +11,7 @@ int main(int argc, char *argv[])
+
+ tk = termkey_new_abstract("vt100", 0);
+
+- termkey_push_bytes(tk, "\e[?1;2$y", 8);
++ termkey_push_bytes(tk, "\x1b[?1;2$y", 8);
+
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for mode report");
+
+@@ -23,7 +23,7 @@ int main(int argc, char *argv[])
+ is_int(mode, 1, "mode number from mode report");
+ is_int(value, 2, "mode value from mode report");
+
+- termkey_push_bytes(tk, "\e[4;1$y", 7);
++ termkey_push_bytes(tk, "\x1b[4;1$y", 7);
+
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for mode report");
+
+diff --git a/t/38csi.c b/t/38csi.c
+index 9d186f6..fd592d5 100644
+--- a/t/38csi.c
++++ b/t/38csi.c
+@@ -13,7 +13,7 @@ int main(int argc, char *argv[])
+
+ tk = termkey_new_abstract("vt100", 0);
+
+- termkey_push_bytes(tk, "\e[5;25v", 7);
++ termkey_push_bytes(tk, "\x1b[5;25v", 7);
+
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for CSI v");
+
+@@ -26,14 +26,14 @@ int main(int argc, char *argv[])
+ is_int(args[1], 25, "args[1] for unknown CSI");
+ is_int(command, 'v', "command for unknown CSI");
+
+- termkey_push_bytes(tk, "\e[?w", 4);
++ termkey_push_bytes(tk, "\x1b[?w", 4);
+
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for CSI ? w");
+ is_int(key.type, TERMKEY_TYPE_UNKNOWN_CSI, "key.type for unknown CSI");
+ is_int(termkey_interpret_csi(tk, &key, args, &nargs, &command), TERMKEY_RES_KEY, "interpret_csi yields RES_KEY");
+ is_int(command, '?'<<8 | 'w', "command for unknown CSI");
+
+- termkey_push_bytes(tk, "\e[?$x", 5);
++ termkey_push_bytes(tk, "\x1b[?$x", 5);
+
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for CSI ? $x");
+ is_int(key.type, TERMKEY_TYPE_UNKNOWN_CSI, "key.type for unknown CSI");
+diff --git a/t/39dcs.c b/t/39dcs.c
+index c517411..f065477 100644
+--- a/t/39dcs.c
++++ b/t/39dcs.c
+@@ -12,7 +12,7 @@ int main(int argc, char *argv[])
+ tk = termkey_new_abstract("xterm", 0);
+
+ // 7bit DCS
+- termkey_push_bytes(tk, "\eP1$r1 q\e\\", 10);
++ termkey_push_bytes(tk, "\x1bP1$r1 q\x1b\\", 10);
+
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for DCS");
+
+@@ -38,7 +38,7 @@ int main(int argc, char *argv[])
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_NONE, "getkey again yields RES_NONE");
+
+ // 7bit OSC
+- termkey_push_bytes(tk, "\e]15;abc\e\\", 10);
++ termkey_push_bytes(tk, "\x1b]15;abc\x1b\\", 10);
+
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for OSC");
+
+@@ -51,7 +51,7 @@ int main(int argc, char *argv[])
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_NONE, "getkey again yields RES_NONE");
+
+ // False alarm
+- termkey_push_bytes(tk, "\eP", 2);
++ termkey_push_bytes(tk, "\x1bP", 2);
+
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_AGAIN, "getkey yields RES_AGAIN for false alarm");
+
diff --git a/third-party/patches/libvterm-Remove-VLAs-for-MSVC.patch b/third-party/patches/libvterm-Remove-VLAs-for-MSVC.patch
new file mode 100644
index 0000000000..e999c0fa9b
--- /dev/null
+++ b/third-party/patches/libvterm-Remove-VLAs-for-MSVC.patch
@@ -0,0 +1,50 @@
+From eb386b1d82f7d07363c9133b7aa06902ccd555fe Mon Sep 17 00:00:00 2001
+Date: Tue, 27 Feb 2018 17:54:20 -0600
+Subject: [PATCH] Remove VLAs for MSVC
+
+VLAs are replaced with calls to _alloca() because MSVC does not support them.
+---
+ src/state.c | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/src/state.c b/src/state.c
+index 84299df..f9aabb3 100644
+--- a/src/state.c
++++ b/src/state.c
+@@ -1,5 +1,6 @@
+ #include "vterm_internal.h"
+
++#include <malloc.h>
+ #include <stdio.h>
+ #include <string.h>
+
+@@ -236,7 +237,7 @@ static int on_text(const char bytes[], size_t len, void *user)
+ VTermPos oldpos = state->pos;
+
+ // We'll have at most len codepoints
+- uint32_t codepoints[len];
++ uint32_t* codepoints = _alloca(len * sizeof(uint32_t));
+ int npoints = 0;
+ size_t eaten = 0;
+
+@@ -313,7 +314,7 @@ static int on_text(const char bytes[], size_t len, void *user)
+
+ int width = 0;
+
+- uint32_t chars[glyph_ends - glyph_starts + 1];
++ uint32_t* chars = _alloca((glyph_ends - glyph_starts + 1) * sizeof(uint32_t));
+
+ for( ; i < glyph_ends; i++) {
+ chars[i - glyph_starts] = codepoints[i];
+@@ -512,7 +513,7 @@ static int settermprop_int(VTermState *state, VTermProp prop, int v)
+
+ static int settermprop_string(VTermState *state, VTermProp prop, const char *str, size_t len)
+ {
+- char strvalue[len+1];
++ char* strvalue = _alloca(len+1);
+ strncpy(strvalue, str, len);
+ strvalue[len] = 0;
+
+--
+2.16.1.windows.4
+
diff --git a/third-party/patches/luv-Add-missing-definitions-for-MinGW.patch b/third-party/patches/luv-Add-missing-definitions-for-MinGW.patch
new file mode 100644
index 0000000000..8954ae21c3
--- /dev/null
+++ b/third-party/patches/luv-Add-missing-definitions-for-MinGW.patch
@@ -0,0 +1,24 @@
+diff --git a/src/dns.c b/src/dns.c
+index 8634157..5f36625 100644
+--- a/src/dns.c
++++ b/src/dns.c
+@@ -20,6 +20,19 @@
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ #include <netdb.h>
++#elif __MINGW32__
++# ifndef AI_NUMERICSERV
++# define AI_NUMERICSERV 0x0008
++# endif
++# ifndef AI_ALL
++# define AI_ALL 0x00000100
++# endif
++# ifndef AI_ADDRCONFIG
++# define AI_ADDRCONFIG 0x00000400
++# endif
++# ifndef AI_V4MAPPED
++# define AI_V4MAPPED 0x00000800
++# endif
+ #endif
+
+ static void luv_pushaddrinfo(lua_State* L, struct addrinfo* res) {
diff --git a/third-party/patches/unibilium-Relax-checks-for-extended-capability-to-support-new-.patch b/third-party/patches/unibilium-Relax-checks-for-extended-capability-to-support-new-.patch
new file mode 100644
index 0000000000..e7976d66d1
--- /dev/null
+++ b/third-party/patches/unibilium-Relax-checks-for-extended-capability-to-support-new-.patch
@@ -0,0 +1,865 @@
+From 9ba283bf2d3c1b96f5811e2091397fcc7d383e3b Mon Sep 17 00:00:00 2001
+From: James McCoy <jamessan@jamessan.com>
+Date: Sun, 22 Jul 2018 23:08:40 -0400
+Subject: [PATCH] Relax checks for extended capability to support new format
+
+In the 20180331 release, the format was slightly changed:
+
+> 20180331
+> + improve terminfo write/read by modifying the fourth item of the
+> extended header to denote the number of valid strings in the extended
+> string table (prompted by a comment in unibilium's sources).
+
+Since the number of valid string capabilities is not necessarily the
+same as extstrslen, it's not possible to sanity check the total number
+of items up front anymore.
+
+Include a new test with an updated screen terminfo dump.
+---
+ t/new-extended-format-static_screen.c | 820 ++++++++++++++++++++++++++
+ unibilium.c | 2 -
+ 2 files changed, 820 insertions(+), 2 deletions(-)
+ create mode 100644 t/new-extended-format-static_screen.c
+
+diff --git a/t/new-extended-format-static_screen.c b/t/new-extended-format-static_screen.c
+new file mode 100644
+index 0000000..c5c4872
+--- /dev/null
++++ b/t/new-extended-format-static_screen.c
+@@ -0,0 +1,820 @@
++#include <unibilium.h>
++#include <errno.h>
++#include <string.h>
++#include "test-simple.c.inc"
++
++static const char terminfo[] = {
++ 26, 1, 42, 0, 43, 0, 15, 0, 105, 1, -103, 2, 115, 99, 114, 101, 101, 110, 124, 86,
++ 84, 32, 49, 48, 48, 47, 65, 78, 83, 73, 32, 88, 51, 46, 54, 52, 32, 118, 105, 114,
++ 116, 117, 97, 108, 32, 116, 101, 114, 109, 105, 110, 97, 108, 0, 0, 1, 0, 0, 1, 0,
++ 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 80, 0,
++ 8, 0, 24, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
++ -1, -1, -1, -1, 8, 0, 64, 0, 0, 0, 4, 0, 6, 0, 8, 0, 25, 0, 30, 0,
++ 37, 0, 41, 0, 45, 0, -1, -1, 56, 0, 73, 0, 75, 0, 79, 0, 86, 0, -1, -1,
++ 88, 0, 100, 0, -1, -1, 104, 0, 107, 0, 113, 0, 117, 0, -1, -1, -1, -1, 121, 0,
++ 123, 0, -128, 0, -123, 0, -1, -1, -114, 0, -109, 0, -1, -1, -1, -1, -104, 0, -99, 0,
++ -94, 0, -1, -1, -89, 0, -87, 0, -82, 0, -1, -1, -73, 0, -68, 0, -62, 0, -56, 0,
++ -1, -1, -1, -1, -1, -1, -53, 0, -1, -1, -1, -1, -1, -1, -49, 0, -1, -1, -45, 0,
++ -1, -1, -1, -1, -1, -1, -43, 0, -1, -1, -38, 0, -1, -1, -1, -1, -1, -1, -1, -1,
++ -34, 0, -30, 0, -24, 0, -20, 0, -16, 0, -12, 0, -6, 0, 0, 1, 6, 1, 12, 1,
++ 18, 1, 23, 1, -1, -1, 28, 1, -1, -1, 32, 1, 37, 1, 42, 1, -1, -1, -1, -1,
++ -1, -1, 46, 1, 50, 1, 58, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 66, 1, -1, -1, 69, 1,
++ 78, 1, 87, 1, 96, 1, 105, 1, 114, 1, 123, 1, -124, 1, -1, -1, -115, 1, -1, -1,
++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -106, 1, -1, -1, -1, -1,
++ -89, 1, -86, 1, -75, 1, -72, 1, -70, 1, -67, 1, 17, 2, -1, -1, 20, 2, -1, -1,
++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
++ 22, 2, -1, -1, 87, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 91, 2,
++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 98, 2, -1, -1,
++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
++ 103, 2, 109, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
++ -1, -1, -1, -1, -1, -1, 115, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
++ -1, -1, 120, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -127, 2,
++ -1, -1, -1, -1, -1, -1, -123, 2, -113, 2, 27, 91, 90, 0, 7, 0, 13, 0, 27, 91,
++ 37, 105, 37, 112, 49, 37, 100, 59, 37, 112, 50, 37, 100, 114, 0, 27, 91, 51, 103, 0,
++ 27, 91, 72, 27, 91, 74, 0, 27, 91, 75, 0, 27, 91, 74, 0, 27, 91, 37, 105, 37,
++ 112, 49, 37, 100, 71, 0, 27, 91, 37, 105, 37, 112, 49, 37, 100, 59, 37, 112, 50, 37,
++ 100, 72, 0, 10, 0, 27, 91, 72, 0, 27, 91, 63, 50, 53, 108, 0, 8, 0, 27, 91,
++ 51, 52, 104, 27, 91, 63, 50, 53, 104, 0, 27, 91, 67, 0, 27, 77, 0, 27, 91, 51,
++ 52, 108, 0, 27, 91, 80, 0, 27, 91, 77, 0, 14, 0, 27, 91, 53, 109, 0, 27, 91,
++ 49, 109, 0, 27, 91, 63, 49, 48, 52, 57, 104, 0, 27, 91, 50, 109, 0, 27, 91, 52,
++ 104, 0, 27, 91, 55, 109, 0, 27, 91, 51, 109, 0, 27, 91, 52, 109, 0, 15, 0, 27,
++ 91, 109, 15, 0, 27, 91, 63, 49, 48, 52, 57, 108, 0, 27, 91, 52, 108, 0, 27, 91,
++ 50, 51, 109, 0, 27, 91, 50, 52, 109, 0, 27, 103, 0, 27, 41, 48, 0, 27, 91, 76,
++ 0, 127, 0, 27, 91, 51, 126, 0, 27, 79, 66, 0, 27, 79, 80, 0, 27, 91, 50, 49,
++ 126, 0, 27, 79, 81, 0, 27, 79, 82, 0, 27, 79, 83, 0, 27, 91, 49, 53, 126, 0,
++ 27, 91, 49, 55, 126, 0, 27, 91, 49, 56, 126, 0, 27, 91, 49, 57, 126, 0, 27, 91,
++ 50, 48, 126, 0, 27, 91, 49, 126, 0, 27, 91, 50, 126, 0, 27, 79, 68, 0, 27, 91,
++ 54, 126, 0, 27, 91, 53, 126, 0, 27, 79, 67, 0, 27, 79, 65, 0, 27, 91, 63, 49,
++ 108, 27, 62, 0, 27, 91, 63, 49, 104, 27, 61, 0, 27, 69, 0, 27, 91, 37, 112, 49,
++ 37, 100, 80, 0, 27, 91, 37, 112, 49, 37, 100, 77, 0, 27, 91, 37, 112, 49, 37, 100,
++ 66, 0, 27, 91, 37, 112, 49, 37, 100, 64, 0, 27, 91, 37, 112, 49, 37, 100, 83, 0,
++ 27, 91, 37, 112, 49, 37, 100, 76, 0, 27, 91, 37, 112, 49, 37, 100, 68, 0, 27, 91,
++ 37, 112, 49, 37, 100, 67, 0, 27, 91, 37, 112, 49, 37, 100, 65, 0, 27, 99, 27, 91,
++ 63, 49, 48, 48, 48, 108, 27, 91, 63, 50, 53, 104, 0, 27, 56, 0, 27, 91, 37, 105,
++ 37, 112, 49, 37, 100, 100, 0, 27, 55, 0, 10, 0, 27, 77, 0, 27, 91, 48, 37, 63,
++ 37, 112, 54, 37, 116, 59, 49, 37, 59, 37, 63, 37, 112, 49, 37, 116, 59, 51, 37, 59,
++ 37, 63, 37, 112, 50, 37, 116, 59, 52, 37, 59, 37, 63, 37, 112, 51, 37, 116, 59, 55,
++ 37, 59, 37, 63, 37, 112, 52, 37, 116, 59, 53, 37, 59, 37, 63, 37, 112, 53, 37, 116,
++ 59, 50, 37, 59, 109, 37, 63, 37, 112, 57, 37, 116, 14, 37, 101, 15, 37, 59, 0, 27,
++ 72, 0, 9, 0, 43, 43, 44, 44, 45, 45, 46, 46, 48, 48, 96, 96, 97, 97, 102, 102,
++ 103, 103, 104, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, 112, 112,
++ 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 122,
++ 123, 123, 124, 124, 125, 125, 126, 126, 0, 27, 91, 90, 0, 27, 40, 66, 27, 41, 48, 0,
++ 27, 91, 52, 126, 0, 27, 91, 50, 51, 126, 0, 27, 91, 50, 52, 126, 0, 27, 91, 49,
++ 75, 0, 27, 91, 51, 57, 59, 52, 57, 109, 0, 27, 91, 77, 0, 27, 91, 51, 37, 112,
++ 49, 37, 100, 109, 0, 27, 91, 52, 37, 112, 49, 37, 100, 109, 0, 0, 3, 0, 1, 0,
++ 12, 0, 28, 0, 70, 0, 1, 1, 0, 0, 1, 0, 0, 0, -1, -1, 4, 0, -1, -1,
++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 3, 0,
++ 6, 0, 9, 0, 12, 0, 15, 0, 18, 0, 21, 0, 24, 0, 27, 0, 33, 0, 39, 0,
++ 43, 0, 47, 0, 51, 0, 55, 0, 27, 40, 66, 0, 27, 40, 37, 112, 49, 37, 99, 0,
++ 65, 88, 0, 71, 48, 0, 88, 84, 0, 85, 56, 0, 69, 48, 0, 69, 51, 0, 83, 48,
++ 0, 84, 83, 0, 88, 77, 0, 107, 69, 78, 68, 53, 0, 107, 72, 79, 77, 53, 0, 107,
++ 97, 50, 0, 107, 98, 49, 0, 107, 98, 51, 0, 107, 99, 50, 0, 120, 109, 0
++};
++
++static void setup(void);
++
++int main(void) {
++ int e;
++ unibi_term *dt;
++
++ setup();
++
++ dt = unibi_dummy();
++ e = errno;
++ ok(dt != NULL, "dummy constructed");
++ if (!dt) {
++ bail_out(strerror(e));
++ }
++ unibi_term *ut = unibi_from_mem(terminfo, sizeof terminfo);
++ e = errno;
++ ok(ut != NULL, "terminfo loaded");
++ if (!ut) {
++ bail_out(strerror(e));
++ }
++
++ note("terminal name");
++ ok(strcmp(unibi_get_name(ut), "VT 100/ANSI X3.64 virtual terminal") == 0, "terminal name = \"%s\"", "VT 100/ANSI X3.64 virtual terminal");
++ unibi_set_name(dt, "VT 100/ANSI X3.64 virtual terminal");
++ {
++ static const char *def_aliases[] = {"screen", NULL};
++ const char **aliases = unibi_get_aliases(ut);
++ ok(strcmp(aliases[0], def_aliases[0]) == 0, "terminal alias #0 = \"%s\"", "screen");
++ ok(aliases[1] == NULL, "terminal alias #1 = null");
++ unibi_set_aliases(dt, def_aliases);
++ }
++
++ note("boolean capabilities");
++ ok(unibi_get_bool(ut, unibi_auto_left_margin) == 0, "auto_left_margin = false");
++ ok(unibi_get_bool(ut, unibi_auto_right_margin) == 1, "auto_right_margin = true");
++ unibi_set_bool(dt, unibi_auto_right_margin, 1);
++ ok(unibi_get_bool(ut, unibi_no_esc_ctlc) == 0, "no_esc_ctlc = false");
++ ok(unibi_get_bool(ut, unibi_ceol_standout_glitch) == 0, "ceol_standout_glitch = false");
++ ok(unibi_get_bool(ut, unibi_eat_newline_glitch) == 1, "eat_newline_glitch = true");
++ unibi_set_bool(dt, unibi_eat_newline_glitch, 1);
++ ok(unibi_get_bool(ut, unibi_erase_overstrike) == 0, "erase_overstrike = false");
++ ok(unibi_get_bool(ut, unibi_generic_type) == 0, "generic_type = false");
++ ok(unibi_get_bool(ut, unibi_hard_copy) == 0, "hard_copy = false");
++ ok(unibi_get_bool(ut, unibi_has_meta_key) == 1, "has_meta_key = true");
++ unibi_set_bool(dt, unibi_has_meta_key, 1);
++ ok(unibi_get_bool(ut, unibi_has_status_line) == 0, "has_status_line = false");
++ ok(unibi_get_bool(ut, unibi_insert_null_glitch) == 0, "insert_null_glitch = false");
++ ok(unibi_get_bool(ut, unibi_memory_above) == 0, "memory_above = false");
++ ok(unibi_get_bool(ut, unibi_memory_below) == 0, "memory_below = false");
++ ok(unibi_get_bool(ut, unibi_move_insert_mode) == 1, "move_insert_mode = true");
++ unibi_set_bool(dt, unibi_move_insert_mode, 1);
++ ok(unibi_get_bool(ut, unibi_move_standout_mode) == 1, "move_standout_mode = true");
++ unibi_set_bool(dt, unibi_move_standout_mode, 1);
++ ok(unibi_get_bool(ut, unibi_over_strike) == 0, "over_strike = false");
++ ok(unibi_get_bool(ut, unibi_status_line_esc_ok) == 0, "status_line_esc_ok = false");
++ ok(unibi_get_bool(ut, unibi_dest_tabs_magic_smso) == 0, "dest_tabs_magic_smso = false");
++ ok(unibi_get_bool(ut, unibi_tilde_glitch) == 0, "tilde_glitch = false");
++ ok(unibi_get_bool(ut, unibi_transparent_underline) == 0, "transparent_underline = false");
++ ok(unibi_get_bool(ut, unibi_xon_xoff) == 0, "xon_xoff = false");
++ ok(unibi_get_bool(ut, unibi_needs_xon_xoff) == 0, "needs_xon_xoff = false");
++ ok(unibi_get_bool(ut, unibi_prtr_silent) == 0, "prtr_silent = false");
++ ok(unibi_get_bool(ut, unibi_hard_cursor) == 0, "hard_cursor = false");
++ ok(unibi_get_bool(ut, unibi_non_rev_rmcup) == 0, "non_rev_rmcup = false");
++ ok(unibi_get_bool(ut, unibi_no_pad_char) == 0, "no_pad_char = false");
++ ok(unibi_get_bool(ut, unibi_non_dest_scroll_region) == 0, "non_dest_scroll_region = false");
++ ok(unibi_get_bool(ut, unibi_can_change) == 0, "can_change = false");
++ ok(unibi_get_bool(ut, unibi_back_color_erase) == 0, "back_color_erase = false");
++ ok(unibi_get_bool(ut, unibi_hue_lightness_saturation) == 0, "hue_lightness_saturation = false");
++ ok(unibi_get_bool(ut, unibi_col_addr_glitch) == 0, "col_addr_glitch = false");
++ ok(unibi_get_bool(ut, unibi_cr_cancels_micro_mode) == 0, "cr_cancels_micro_mode = false");
++ ok(unibi_get_bool(ut, unibi_has_print_wheel) == 0, "has_print_wheel = false");
++ ok(unibi_get_bool(ut, unibi_row_addr_glitch) == 0, "row_addr_glitch = false");
++ ok(unibi_get_bool(ut, unibi_semi_auto_right_margin) == 0, "semi_auto_right_margin = false");
++ ok(unibi_get_bool(ut, unibi_cpi_changes_res) == 0, "cpi_changes_res = false");
++ ok(unibi_get_bool(ut, unibi_lpi_changes_res) == 0, "lpi_changes_res = false");
++ ok(unibi_get_bool(ut, unibi_backspaces_with_bs) == 1, "backspaces_with_bs = true");
++ unibi_set_bool(dt, unibi_backspaces_with_bs, 1);
++ ok(unibi_get_bool(ut, unibi_crt_no_scrolling) == 0, "crt_no_scrolling = false");
++ ok(unibi_get_bool(ut, unibi_no_correctly_working_cr) == 0, "no_correctly_working_cr = false");
++ ok(unibi_get_bool(ut, unibi_gnu_has_meta_key) == 0, "gnu_has_meta_key = false");
++ ok(unibi_get_bool(ut, unibi_linefeed_is_newline) == 0, "linefeed_is_newline = false");
++ ok(unibi_get_bool(ut, unibi_has_hardware_tabs) == 1, "has_hardware_tabs = true");
++ unibi_set_bool(dt, unibi_has_hardware_tabs, 1);
++ ok(unibi_get_bool(ut, unibi_return_does_clr_eol) == 0, "return_does_clr_eol = false");
++
++ note("numeric capabilities");
++ ok(unibi_get_num(ut, unibi_columns) == 80, "columns = 80");
++ unibi_set_num(dt, unibi_columns, 80);
++ ok(unibi_get_num(ut, unibi_init_tabs) == 8, "init_tabs = 8");
++ unibi_set_num(dt, unibi_init_tabs, 8);
++ ok(unibi_get_num(ut, unibi_lines) == 24, "lines = 24");
++ unibi_set_num(dt, unibi_lines, 24);
++ ok(unibi_get_num(ut, unibi_lines_of_memory) == -1, "lines_of_memory = -1");
++ ok(unibi_get_num(ut, unibi_magic_cookie_glitch) == -1, "magic_cookie_glitch = -1");
++ ok(unibi_get_num(ut, unibi_padding_baud_rate) == -1, "padding_baud_rate = -1");
++ ok(unibi_get_num(ut, unibi_virtual_terminal) == -1, "virtual_terminal = -1");
++ ok(unibi_get_num(ut, unibi_width_status_line) == -1, "width_status_line = -1");
++ ok(unibi_get_num(ut, unibi_num_labels) == -1, "num_labels = -1");
++ ok(unibi_get_num(ut, unibi_label_height) == -1, "label_height = -1");
++ ok(unibi_get_num(ut, unibi_label_width) == -1, "label_width = -1");
++ ok(unibi_get_num(ut, unibi_max_attributes) == -1, "max_attributes = -1");
++ ok(unibi_get_num(ut, unibi_maximum_windows) == -1, "maximum_windows = -1");
++ ok(unibi_get_num(ut, unibi_max_colors) == 8, "max_colors = 8");
++ unibi_set_num(dt, unibi_max_colors, 8);
++ ok(unibi_get_num(ut, unibi_max_pairs) == 64, "max_pairs = 64");
++ unibi_set_num(dt, unibi_max_pairs, 64);
++ ok(unibi_get_num(ut, unibi_no_color_video) == -1, "no_color_video = -1");
++ ok(unibi_get_num(ut, unibi_buffer_capacity) == -1, "buffer_capacity = -1");
++ ok(unibi_get_num(ut, unibi_dot_vert_spacing) == -1, "dot_vert_spacing = -1");
++ ok(unibi_get_num(ut, unibi_dot_horz_spacing) == -1, "dot_horz_spacing = -1");
++ ok(unibi_get_num(ut, unibi_max_micro_address) == -1, "max_micro_address = -1");
++ ok(unibi_get_num(ut, unibi_max_micro_jump) == -1, "max_micro_jump = -1");
++ ok(unibi_get_num(ut, unibi_micro_col_size) == -1, "micro_col_size = -1");
++ ok(unibi_get_num(ut, unibi_micro_line_size) == -1, "micro_line_size = -1");
++ ok(unibi_get_num(ut, unibi_number_of_pins) == -1, "number_of_pins = -1");
++ ok(unibi_get_num(ut, unibi_output_res_char) == -1, "output_res_char = -1");
++ ok(unibi_get_num(ut, unibi_output_res_line) == -1, "output_res_line = -1");
++ ok(unibi_get_num(ut, unibi_output_res_horz_inch) == -1, "output_res_horz_inch = -1");
++ ok(unibi_get_num(ut, unibi_output_res_vert_inch) == -1, "output_res_vert_inch = -1");
++ ok(unibi_get_num(ut, unibi_print_rate) == -1, "print_rate = -1");
++ ok(unibi_get_num(ut, unibi_wide_char_size) == -1, "wide_char_size = -1");
++ ok(unibi_get_num(ut, unibi_buttons) == -1, "buttons = -1");
++ ok(unibi_get_num(ut, unibi_bit_image_entwining) == -1, "bit_image_entwining = -1");
++ ok(unibi_get_num(ut, unibi_bit_image_type) == -1, "bit_image_type = -1");
++ ok(unibi_get_num(ut, unibi_magic_cookie_glitch_ul) == -1, "magic_cookie_glitch_ul = -1");
++ ok(unibi_get_num(ut, unibi_carriage_return_delay) == -1, "carriage_return_delay = -1");
++ ok(unibi_get_num(ut, unibi_new_line_delay) == -1, "new_line_delay = -1");
++ ok(unibi_get_num(ut, unibi_backspace_delay) == -1, "backspace_delay = -1");
++ ok(unibi_get_num(ut, unibi_horizontal_tab_delay) == -1, "horizontal_tab_delay = -1");
++ ok(unibi_get_num(ut, unibi_number_of_function_keys) == -1, "number_of_function_keys = -1");
++
++ note("string capabilities");
++ ok(strcmp(unibi_get_str(ut, unibi_back_tab), "\033[Z") == 0, "back_tab = \"%s\"", "\\033[Z");
++ unibi_set_str(dt, unibi_back_tab, "\033[Z");
++ ok(strcmp(unibi_get_str(ut, unibi_bell), "\007") == 0, "bell = \"%s\"", "\\007");
++ unibi_set_str(dt, unibi_bell, "\007");
++ ok(strcmp(unibi_get_str(ut, unibi_carriage_return), "\015") == 0, "carriage_return = \"%s\"", "\\015");
++ unibi_set_str(dt, unibi_carriage_return, "\015");
++ ok(strcmp(unibi_get_str(ut, unibi_change_scroll_region), "\033[%i%p1%d;%p2%dr") == 0, "change_scroll_region = \"%s\"", "\\033[%i%p1%d;%p2%dr");
++ unibi_set_str(dt, unibi_change_scroll_region, "\033[%i%p1%d;%p2%dr");
++ ok(strcmp(unibi_get_str(ut, unibi_clear_all_tabs), "\033[3g") == 0, "clear_all_tabs = \"%s\"", "\\033[3g");
++ unibi_set_str(dt, unibi_clear_all_tabs, "\033[3g");
++ ok(strcmp(unibi_get_str(ut, unibi_clear_screen), "\033[H\033[J") == 0, "clear_screen = \"%s\"", "\\033[H\\033[J");
++ unibi_set_str(dt, unibi_clear_screen, "\033[H\033[J");
++ ok(strcmp(unibi_get_str(ut, unibi_clr_eol), "\033[K") == 0, "clr_eol = \"%s\"", "\\033[K");
++ unibi_set_str(dt, unibi_clr_eol, "\033[K");
++ ok(strcmp(unibi_get_str(ut, unibi_clr_eos), "\033[J") == 0, "clr_eos = \"%s\"", "\\033[J");
++ unibi_set_str(dt, unibi_clr_eos, "\033[J");
++ ok(strcmp(unibi_get_str(ut, unibi_column_address), "\033[%i%p1%dG") == 0, "column_address = \"%s\"", "\\033[%i%p1%dG");
++ unibi_set_str(dt, unibi_column_address, "\033[%i%p1%dG");
++ ok(unibi_get_str(ut, unibi_command_character) == NULL, "command_character = null");
++ ok(strcmp(unibi_get_str(ut, unibi_cursor_address), "\033[%i%p1%d;%p2%dH") == 0, "cursor_address = \"%s\"", "\\033[%i%p1%d;%p2%dH");
++ unibi_set_str(dt, unibi_cursor_address, "\033[%i%p1%d;%p2%dH");
++ ok(strcmp(unibi_get_str(ut, unibi_cursor_down), "\012") == 0, "cursor_down = \"%s\"", "\\012");
++ unibi_set_str(dt, unibi_cursor_down, "\012");
++ ok(strcmp(unibi_get_str(ut, unibi_cursor_home), "\033[H") == 0, "cursor_home = \"%s\"", "\\033[H");
++ unibi_set_str(dt, unibi_cursor_home, "\033[H");
++ ok(strcmp(unibi_get_str(ut, unibi_cursor_invisible), "\033[?25l") == 0, "cursor_invisible = \"%s\"", "\\033[?25l");
++ unibi_set_str(dt, unibi_cursor_invisible, "\033[?25l");
++ ok(strcmp(unibi_get_str(ut, unibi_cursor_left), "\010") == 0, "cursor_left = \"%s\"", "\\010");
++ unibi_set_str(dt, unibi_cursor_left, "\010");
++ ok(unibi_get_str(ut, unibi_cursor_mem_address) == NULL, "cursor_mem_address = null");
++ ok(strcmp(unibi_get_str(ut, unibi_cursor_normal), "\033[34h\033[?25h") == 0, "cursor_normal = \"%s\"", "\\033[34h\\033[?25h");
++ unibi_set_str(dt, unibi_cursor_normal, "\033[34h\033[?25h");
++ ok(strcmp(unibi_get_str(ut, unibi_cursor_right), "\033[C") == 0, "cursor_right = \"%s\"", "\\033[C");
++ unibi_set_str(dt, unibi_cursor_right, "\033[C");
++ ok(unibi_get_str(ut, unibi_cursor_to_ll) == NULL, "cursor_to_ll = null");
++ ok(strcmp(unibi_get_str(ut, unibi_cursor_up), "\033M") == 0, "cursor_up = \"%s\"", "\\033M");
++ unibi_set_str(dt, unibi_cursor_up, "\033M");
++ ok(strcmp(unibi_get_str(ut, unibi_cursor_visible), "\033[34l") == 0, "cursor_visible = \"%s\"", "\\033[34l");
++ unibi_set_str(dt, unibi_cursor_visible, "\033[34l");
++ ok(strcmp(unibi_get_str(ut, unibi_delete_character), "\033[P") == 0, "delete_character = \"%s\"", "\\033[P");
++ unibi_set_str(dt, unibi_delete_character, "\033[P");
++ ok(strcmp(unibi_get_str(ut, unibi_delete_line), "\033[M") == 0, "delete_line = \"%s\"", "\\033[M");
++ unibi_set_str(dt, unibi_delete_line, "\033[M");
++ ok(unibi_get_str(ut, unibi_dis_status_line) == NULL, "dis_status_line = null");
++ ok(unibi_get_str(ut, unibi_down_half_line) == NULL, "down_half_line = null");
++ ok(strcmp(unibi_get_str(ut, unibi_enter_alt_charset_mode), "\016") == 0, "enter_alt_charset_mode = \"%s\"", "\\016");
++ unibi_set_str(dt, unibi_enter_alt_charset_mode, "\016");
++ ok(strcmp(unibi_get_str(ut, unibi_enter_blink_mode), "\033[5m") == 0, "enter_blink_mode = \"%s\"", "\\033[5m");
++ unibi_set_str(dt, unibi_enter_blink_mode, "\033[5m");
++ ok(strcmp(unibi_get_str(ut, unibi_enter_bold_mode), "\033[1m") == 0, "enter_bold_mode = \"%s\"", "\\033[1m");
++ unibi_set_str(dt, unibi_enter_bold_mode, "\033[1m");
++ ok(strcmp(unibi_get_str(ut, unibi_enter_ca_mode), "\033[?1049h") == 0, "enter_ca_mode = \"%s\"", "\\033[?1049h");
++ unibi_set_str(dt, unibi_enter_ca_mode, "\033[?1049h");
++ ok(unibi_get_str(ut, unibi_enter_delete_mode) == NULL, "enter_delete_mode = null");
++ ok(strcmp(unibi_get_str(ut, unibi_enter_dim_mode), "\033[2m") == 0, "enter_dim_mode = \"%s\"", "\\033[2m");
++ unibi_set_str(dt, unibi_enter_dim_mode, "\033[2m");
++ ok(strcmp(unibi_get_str(ut, unibi_enter_insert_mode), "\033[4h") == 0, "enter_insert_mode = \"%s\"", "\\033[4h");
++ unibi_set_str(dt, unibi_enter_insert_mode, "\033[4h");
++ ok(unibi_get_str(ut, unibi_enter_secure_mode) == NULL, "enter_secure_mode = null");
++ ok(unibi_get_str(ut, unibi_enter_protected_mode) == NULL, "enter_protected_mode = null");
++ ok(strcmp(unibi_get_str(ut, unibi_enter_reverse_mode), "\033[7m") == 0, "enter_reverse_mode = \"%s\"", "\\033[7m");
++ unibi_set_str(dt, unibi_enter_reverse_mode, "\033[7m");
++ ok(strcmp(unibi_get_str(ut, unibi_enter_standout_mode), "\033[3m") == 0, "enter_standout_mode = \"%s\"", "\\033[3m");
++ unibi_set_str(dt, unibi_enter_standout_mode, "\033[3m");
++ ok(strcmp(unibi_get_str(ut, unibi_enter_underline_mode), "\033[4m") == 0, "enter_underline_mode = \"%s\"", "\\033[4m");
++ unibi_set_str(dt, unibi_enter_underline_mode, "\033[4m");
++ ok(unibi_get_str(ut, unibi_erase_chars) == NULL, "erase_chars = null");
++ ok(strcmp(unibi_get_str(ut, unibi_exit_alt_charset_mode), "\017") == 0, "exit_alt_charset_mode = \"%s\"", "\\017");
++ unibi_set_str(dt, unibi_exit_alt_charset_mode, "\017");
++ ok(strcmp(unibi_get_str(ut, unibi_exit_attribute_mode), "\033[m\017") == 0, "exit_attribute_mode = \"%s\"", "\\033[m\\017");
++ unibi_set_str(dt, unibi_exit_attribute_mode, "\033[m\017");
++ ok(strcmp(unibi_get_str(ut, unibi_exit_ca_mode), "\033[?1049l") == 0, "exit_ca_mode = \"%s\"", "\\033[?1049l");
++ unibi_set_str(dt, unibi_exit_ca_mode, "\033[?1049l");
++ ok(unibi_get_str(ut, unibi_exit_delete_mode) == NULL, "exit_delete_mode = null");
++ ok(strcmp(unibi_get_str(ut, unibi_exit_insert_mode), "\033[4l") == 0, "exit_insert_mode = \"%s\"", "\\033[4l");
++ unibi_set_str(dt, unibi_exit_insert_mode, "\033[4l");
++ ok(strcmp(unibi_get_str(ut, unibi_exit_standout_mode), "\033[23m") == 0, "exit_standout_mode = \"%s\"", "\\033[23m");
++ unibi_set_str(dt, unibi_exit_standout_mode, "\033[23m");
++ ok(strcmp(unibi_get_str(ut, unibi_exit_underline_mode), "\033[24m") == 0, "exit_underline_mode = \"%s\"", "\\033[24m");
++ unibi_set_str(dt, unibi_exit_underline_mode, "\033[24m");
++ ok(strcmp(unibi_get_str(ut, unibi_flash_screen), "\033g") == 0, "flash_screen = \"%s\"", "\\033g");
++ unibi_set_str(dt, unibi_flash_screen, "\033g");
++ ok(unibi_get_str(ut, unibi_form_feed) == NULL, "form_feed = null");
++ ok(unibi_get_str(ut, unibi_from_status_line) == NULL, "from_status_line = null");
++ ok(unibi_get_str(ut, unibi_init_1string) == NULL, "init_1string = null");
++ ok(strcmp(unibi_get_str(ut, unibi_init_2string), "\033)0") == 0, "init_2string = \"%s\"", "\\033)0");
++ unibi_set_str(dt, unibi_init_2string, "\033)0");
++ ok(unibi_get_str(ut, unibi_init_3string) == NULL, "init_3string = null");
++ ok(unibi_get_str(ut, unibi_init_file) == NULL, "init_file = null");
++ ok(unibi_get_str(ut, unibi_insert_character) == NULL, "insert_character = null");
++ ok(strcmp(unibi_get_str(ut, unibi_insert_line), "\033[L") == 0, "insert_line = \"%s\"", "\\033[L");
++ unibi_set_str(dt, unibi_insert_line, "\033[L");
++ ok(unibi_get_str(ut, unibi_insert_padding) == NULL, "insert_padding = null");
++ ok(strcmp(unibi_get_str(ut, unibi_key_backspace), "\177") == 0, "key_backspace = \"%s\"", "\\177");
++ unibi_set_str(dt, unibi_key_backspace, "\177");
++ ok(unibi_get_str(ut, unibi_key_catab) == NULL, "key_catab = null");
++ ok(unibi_get_str(ut, unibi_key_clear) == NULL, "key_clear = null");
++ ok(unibi_get_str(ut, unibi_key_ctab) == NULL, "key_ctab = null");
++ ok(strcmp(unibi_get_str(ut, unibi_key_dc), "\033[3~") == 0, "key_dc = \"%s\"", "\\033[3~");
++ unibi_set_str(dt, unibi_key_dc, "\033[3~");
++ ok(unibi_get_str(ut, unibi_key_dl) == NULL, "key_dl = null");
++ ok(strcmp(unibi_get_str(ut, unibi_key_down), "\033OB") == 0, "key_down = \"%s\"", "\\033OB");
++ unibi_set_str(dt, unibi_key_down, "\033OB");
++ ok(unibi_get_str(ut, unibi_key_eic) == NULL, "key_eic = null");
++ ok(unibi_get_str(ut, unibi_key_eol) == NULL, "key_eol = null");
++ ok(unibi_get_str(ut, unibi_key_eos) == NULL, "key_eos = null");
++ ok(unibi_get_str(ut, unibi_key_f0) == NULL, "key_f0 = null");
++ ok(strcmp(unibi_get_str(ut, unibi_key_f1), "\033OP") == 0, "key_f1 = \"%s\"", "\\033OP");
++ unibi_set_str(dt, unibi_key_f1, "\033OP");
++ ok(strcmp(unibi_get_str(ut, unibi_key_f10), "\033[21~") == 0, "key_f10 = \"%s\"", "\\033[21~");
++ unibi_set_str(dt, unibi_key_f10, "\033[21~");
++ ok(strcmp(unibi_get_str(ut, unibi_key_f2), "\033OQ") == 0, "key_f2 = \"%s\"", "\\033OQ");
++ unibi_set_str(dt, unibi_key_f2, "\033OQ");
++ ok(strcmp(unibi_get_str(ut, unibi_key_f3), "\033OR") == 0, "key_f3 = \"%s\"", "\\033OR");
++ unibi_set_str(dt, unibi_key_f3, "\033OR");
++ ok(strcmp(unibi_get_str(ut, unibi_key_f4), "\033OS") == 0, "key_f4 = \"%s\"", "\\033OS");
++ unibi_set_str(dt, unibi_key_f4, "\033OS");
++ ok(strcmp(unibi_get_str(ut, unibi_key_f5), "\033[15~") == 0, "key_f5 = \"%s\"", "\\033[15~");
++ unibi_set_str(dt, unibi_key_f5, "\033[15~");
++ ok(strcmp(unibi_get_str(ut, unibi_key_f6), "\033[17~") == 0, "key_f6 = \"%s\"", "\\033[17~");
++ unibi_set_str(dt, unibi_key_f6, "\033[17~");
++ ok(strcmp(unibi_get_str(ut, unibi_key_f7), "\033[18~") == 0, "key_f7 = \"%s\"", "\\033[18~");
++ unibi_set_str(dt, unibi_key_f7, "\033[18~");
++ ok(strcmp(unibi_get_str(ut, unibi_key_f8), "\033[19~") == 0, "key_f8 = \"%s\"", "\\033[19~");
++ unibi_set_str(dt, unibi_key_f8, "\033[19~");
++ ok(strcmp(unibi_get_str(ut, unibi_key_f9), "\033[20~") == 0, "key_f9 = \"%s\"", "\\033[20~");
++ unibi_set_str(dt, unibi_key_f9, "\033[20~");
++ ok(strcmp(unibi_get_str(ut, unibi_key_home), "\033[1~") == 0, "key_home = \"%s\"", "\\033[1~");
++ unibi_set_str(dt, unibi_key_home, "\033[1~");
++ ok(strcmp(unibi_get_str(ut, unibi_key_ic), "\033[2~") == 0, "key_ic = \"%s\"", "\\033[2~");
++ unibi_set_str(dt, unibi_key_ic, "\033[2~");
++ ok(unibi_get_str(ut, unibi_key_il) == NULL, "key_il = null");
++ ok(strcmp(unibi_get_str(ut, unibi_key_left), "\033OD") == 0, "key_left = \"%s\"", "\\033OD");
++ unibi_set_str(dt, unibi_key_left, "\033OD");
++ ok(unibi_get_str(ut, unibi_key_ll) == NULL, "key_ll = null");
++ ok(strcmp(unibi_get_str(ut, unibi_key_npage), "\033[6~") == 0, "key_npage = \"%s\"", "\\033[6~");
++ unibi_set_str(dt, unibi_key_npage, "\033[6~");
++ ok(strcmp(unibi_get_str(ut, unibi_key_ppage), "\033[5~") == 0, "key_ppage = \"%s\"", "\\033[5~");
++ unibi_set_str(dt, unibi_key_ppage, "\033[5~");
++ ok(strcmp(unibi_get_str(ut, unibi_key_right), "\033OC") == 0, "key_right = \"%s\"", "\\033OC");
++ unibi_set_str(dt, unibi_key_right, "\033OC");
++ ok(unibi_get_str(ut, unibi_key_sf) == NULL, "key_sf = null");
++ ok(unibi_get_str(ut, unibi_key_sr) == NULL, "key_sr = null");
++ ok(unibi_get_str(ut, unibi_key_stab) == NULL, "key_stab = null");
++ ok(strcmp(unibi_get_str(ut, unibi_key_up), "\033OA") == 0, "key_up = \"%s\"", "\\033OA");
++ unibi_set_str(dt, unibi_key_up, "\033OA");
++ ok(strcmp(unibi_get_str(ut, unibi_keypad_local), "\033[?1l\033>") == 0, "keypad_local = \"%s\"", "\\033[?1l\\033>");
++ unibi_set_str(dt, unibi_keypad_local, "\033[?1l\033>");
++ ok(strcmp(unibi_get_str(ut, unibi_keypad_xmit), "\033[?1h\033=") == 0, "keypad_xmit = \"%s\"", "\\033[?1h\\033=");
++ unibi_set_str(dt, unibi_keypad_xmit, "\033[?1h\033=");
++ ok(unibi_get_str(ut, unibi_lab_f0) == NULL, "lab_f0 = null");
++ ok(unibi_get_str(ut, unibi_lab_f1) == NULL, "lab_f1 = null");
++ ok(unibi_get_str(ut, unibi_lab_f10) == NULL, "lab_f10 = null");
++ ok(unibi_get_str(ut, unibi_lab_f2) == NULL, "lab_f2 = null");
++ ok(unibi_get_str(ut, unibi_lab_f3) == NULL, "lab_f3 = null");
++ ok(unibi_get_str(ut, unibi_lab_f4) == NULL, "lab_f4 = null");
++ ok(unibi_get_str(ut, unibi_lab_f5) == NULL, "lab_f5 = null");
++ ok(unibi_get_str(ut, unibi_lab_f6) == NULL, "lab_f6 = null");
++ ok(unibi_get_str(ut, unibi_lab_f7) == NULL, "lab_f7 = null");
++ ok(unibi_get_str(ut, unibi_lab_f8) == NULL, "lab_f8 = null");
++ ok(unibi_get_str(ut, unibi_lab_f9) == NULL, "lab_f9 = null");
++ ok(unibi_get_str(ut, unibi_meta_off) == NULL, "meta_off = null");
++ ok(unibi_get_str(ut, unibi_meta_on) == NULL, "meta_on = null");
++ ok(strcmp(unibi_get_str(ut, unibi_newline), "\033E") == 0, "newline = \"%s\"", "\\033E");
++ unibi_set_str(dt, unibi_newline, "\033E");
++ ok(unibi_get_str(ut, unibi_pad_char) == NULL, "pad_char = null");
++ ok(strcmp(unibi_get_str(ut, unibi_parm_dch), "\033[%p1%dP") == 0, "parm_dch = \"%s\"", "\\033[%p1%dP");
++ unibi_set_str(dt, unibi_parm_dch, "\033[%p1%dP");
++ ok(strcmp(unibi_get_str(ut, unibi_parm_delete_line), "\033[%p1%dM") == 0, "parm_delete_line = \"%s\"", "\\033[%p1%dM");
++ unibi_set_str(dt, unibi_parm_delete_line, "\033[%p1%dM");
++ ok(strcmp(unibi_get_str(ut, unibi_parm_down_cursor), "\033[%p1%dB") == 0, "parm_down_cursor = \"%s\"", "\\033[%p1%dB");
++ unibi_set_str(dt, unibi_parm_down_cursor, "\033[%p1%dB");
++ ok(strcmp(unibi_get_str(ut, unibi_parm_ich), "\033[%p1%d@") == 0, "parm_ich = \"%s\"", "\\033[%p1%d@");
++ unibi_set_str(dt, unibi_parm_ich, "\033[%p1%d@");
++ ok(strcmp(unibi_get_str(ut, unibi_parm_index), "\033[%p1%dS") == 0, "parm_index = \"%s\"", "\\033[%p1%dS");
++ unibi_set_str(dt, unibi_parm_index, "\033[%p1%dS");
++ ok(strcmp(unibi_get_str(ut, unibi_parm_insert_line), "\033[%p1%dL") == 0, "parm_insert_line = \"%s\"", "\\033[%p1%dL");
++ unibi_set_str(dt, unibi_parm_insert_line, "\033[%p1%dL");
++ ok(strcmp(unibi_get_str(ut, unibi_parm_left_cursor), "\033[%p1%dD") == 0, "parm_left_cursor = \"%s\"", "\\033[%p1%dD");
++ unibi_set_str(dt, unibi_parm_left_cursor, "\033[%p1%dD");
++ ok(strcmp(unibi_get_str(ut, unibi_parm_right_cursor), "\033[%p1%dC") == 0, "parm_right_cursor = \"%s\"", "\\033[%p1%dC");
++ unibi_set_str(dt, unibi_parm_right_cursor, "\033[%p1%dC");
++ ok(unibi_get_str(ut, unibi_parm_rindex) == NULL, "parm_rindex = null");
++ ok(strcmp(unibi_get_str(ut, unibi_parm_up_cursor), "\033[%p1%dA") == 0, "parm_up_cursor = \"%s\"", "\\033[%p1%dA");
++ unibi_set_str(dt, unibi_parm_up_cursor, "\033[%p1%dA");
++ ok(unibi_get_str(ut, unibi_pkey_key) == NULL, "pkey_key = null");
++ ok(unibi_get_str(ut, unibi_pkey_local) == NULL, "pkey_local = null");
++ ok(unibi_get_str(ut, unibi_pkey_xmit) == NULL, "pkey_xmit = null");
++ ok(unibi_get_str(ut, unibi_print_screen) == NULL, "print_screen = null");
++ ok(unibi_get_str(ut, unibi_prtr_off) == NULL, "prtr_off = null");
++ ok(unibi_get_str(ut, unibi_prtr_on) == NULL, "prtr_on = null");
++ ok(unibi_get_str(ut, unibi_repeat_char) == NULL, "repeat_char = null");
++ ok(unibi_get_str(ut, unibi_reset_1string) == NULL, "reset_1string = null");
++ ok(strcmp(unibi_get_str(ut, unibi_reset_2string), "\033c\033[?1000l\033[?25h") == 0, "reset_2string = \"%s\"", "\\033c\\033[?1000l\\033[?25h");
++ unibi_set_str(dt, unibi_reset_2string, "\033c\033[?1000l\033[?25h");
++ ok(unibi_get_str(ut, unibi_reset_3string) == NULL, "reset_3string = null");
++ ok(unibi_get_str(ut, unibi_reset_file) == NULL, "reset_file = null");
++ ok(strcmp(unibi_get_str(ut, unibi_restore_cursor), "\0338") == 0, "restore_cursor = \"%s\"", "\\0338");
++ unibi_set_str(dt, unibi_restore_cursor, "\0338");
++ ok(strcmp(unibi_get_str(ut, unibi_row_address), "\033[%i%p1%dd") == 0, "row_address = \"%s\"", "\\033[%i%p1%dd");
++ unibi_set_str(dt, unibi_row_address, "\033[%i%p1%dd");
++ ok(strcmp(unibi_get_str(ut, unibi_save_cursor), "\0337") == 0, "save_cursor = \"%s\"", "\\0337");
++ unibi_set_str(dt, unibi_save_cursor, "\0337");
++ ok(strcmp(unibi_get_str(ut, unibi_scroll_forward), "\012") == 0, "scroll_forward = \"%s\"", "\\012");
++ unibi_set_str(dt, unibi_scroll_forward, "\012");
++ ok(strcmp(unibi_get_str(ut, unibi_scroll_reverse), "\033M") == 0, "scroll_reverse = \"%s\"", "\\033M");
++ unibi_set_str(dt, unibi_scroll_reverse, "\033M");
++ ok(strcmp(unibi_get_str(ut, unibi_set_attributes), "\033[0%?%p6%t;1%;%?%p1%t;3%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;m%?%p9%t\016%e\017%;") == 0, "set_attributes = \"%s\"", "\\033[0%?%p6%t;1%;%?%p1%t;3%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;m%?%p9%t\\016%e\\017%;");
++ unibi_set_str(dt, unibi_set_attributes, "\033[0%?%p6%t;1%;%?%p1%t;3%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;m%?%p9%t\016%e\017%;");
++ ok(strcmp(unibi_get_str(ut, unibi_set_tab), "\033H") == 0, "set_tab = \"%s\"", "\\033H");
++ unibi_set_str(dt, unibi_set_tab, "\033H");
++ ok(unibi_get_str(ut, unibi_set_window) == NULL, "set_window = null");
++ ok(strcmp(unibi_get_str(ut, unibi_tab), "\011") == 0, "tab = \"%s\"", "\\011");
++ unibi_set_str(dt, unibi_tab, "\011");
++ ok(unibi_get_str(ut, unibi_to_status_line) == NULL, "to_status_line = null");
++ ok(unibi_get_str(ut, unibi_underline_char) == NULL, "underline_char = null");
++ ok(unibi_get_str(ut, unibi_up_half_line) == NULL, "up_half_line = null");
++ ok(unibi_get_str(ut, unibi_init_prog) == NULL, "init_prog = null");
++ ok(unibi_get_str(ut, unibi_key_a1) == NULL, "key_a1 = null");
++ ok(unibi_get_str(ut, unibi_key_a3) == NULL, "key_a3 = null");
++ ok(unibi_get_str(ut, unibi_key_b2) == NULL, "key_b2 = null");
++ ok(unibi_get_str(ut, unibi_key_c1) == NULL, "key_c1 = null");
++ ok(unibi_get_str(ut, unibi_key_c3) == NULL, "key_c3 = null");
++ ok(unibi_get_str(ut, unibi_prtr_non) == NULL, "prtr_non = null");
++ ok(unibi_get_str(ut, unibi_char_padding) == NULL, "char_padding = null");
++ ok(strcmp(unibi_get_str(ut, unibi_acs_chars), "++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~") == 0, "acs_chars = \"%s\"", "++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~");
++ unibi_set_str(dt, unibi_acs_chars, "++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~");
++ ok(unibi_get_str(ut, unibi_plab_norm) == NULL, "plab_norm = null");
++ ok(strcmp(unibi_get_str(ut, unibi_key_btab), "\033[Z") == 0, "key_btab = \"%s\"", "\\033[Z");
++ unibi_set_str(dt, unibi_key_btab, "\033[Z");
++ ok(unibi_get_str(ut, unibi_enter_xon_mode) == NULL, "enter_xon_mode = null");
++ ok(unibi_get_str(ut, unibi_exit_xon_mode) == NULL, "exit_xon_mode = null");
++ ok(unibi_get_str(ut, unibi_enter_am_mode) == NULL, "enter_am_mode = null");
++ ok(unibi_get_str(ut, unibi_exit_am_mode) == NULL, "exit_am_mode = null");
++ ok(unibi_get_str(ut, unibi_xon_character) == NULL, "xon_character = null");
++ ok(unibi_get_str(ut, unibi_xoff_character) == NULL, "xoff_character = null");
++ ok(strcmp(unibi_get_str(ut, unibi_ena_acs), "\033(B\033)0") == 0, "ena_acs = \"%s\"", "\\033(B\\033)0");
++ unibi_set_str(dt, unibi_ena_acs, "\033(B\033)0");
++ ok(unibi_get_str(ut, unibi_label_on) == NULL, "label_on = null");
++ ok(unibi_get_str(ut, unibi_label_off) == NULL, "label_off = null");
++ ok(unibi_get_str(ut, unibi_key_beg) == NULL, "key_beg = null");
++ ok(unibi_get_str(ut, unibi_key_cancel) == NULL, "key_cancel = null");
++ ok(unibi_get_str(ut, unibi_key_close) == NULL, "key_close = null");
++ ok(unibi_get_str(ut, unibi_key_command) == NULL, "key_command = null");
++ ok(unibi_get_str(ut, unibi_key_copy) == NULL, "key_copy = null");
++ ok(unibi_get_str(ut, unibi_key_create) == NULL, "key_create = null");
++ ok(strcmp(unibi_get_str(ut, unibi_key_end), "\033[4~") == 0, "key_end = \"%s\"", "\\033[4~");
++ unibi_set_str(dt, unibi_key_end, "\033[4~");
++ ok(unibi_get_str(ut, unibi_key_enter) == NULL, "key_enter = null");
++ ok(unibi_get_str(ut, unibi_key_exit) == NULL, "key_exit = null");
++ ok(unibi_get_str(ut, unibi_key_find) == NULL, "key_find = null");
++ ok(unibi_get_str(ut, unibi_key_help) == NULL, "key_help = null");
++ ok(unibi_get_str(ut, unibi_key_mark) == NULL, "key_mark = null");
++ ok(unibi_get_str(ut, unibi_key_message) == NULL, "key_message = null");
++ ok(unibi_get_str(ut, unibi_key_move) == NULL, "key_move = null");
++ ok(unibi_get_str(ut, unibi_key_next) == NULL, "key_next = null");
++ ok(unibi_get_str(ut, unibi_key_open) == NULL, "key_open = null");
++ ok(unibi_get_str(ut, unibi_key_options) == NULL, "key_options = null");
++ ok(unibi_get_str(ut, unibi_key_previous) == NULL, "key_previous = null");
++ ok(unibi_get_str(ut, unibi_key_print) == NULL, "key_print = null");
++ ok(unibi_get_str(ut, unibi_key_redo) == NULL, "key_redo = null");
++ ok(unibi_get_str(ut, unibi_key_reference) == NULL, "key_reference = null");
++ ok(unibi_get_str(ut, unibi_key_refresh) == NULL, "key_refresh = null");
++ ok(unibi_get_str(ut, unibi_key_replace) == NULL, "key_replace = null");
++ ok(unibi_get_str(ut, unibi_key_restart) == NULL, "key_restart = null");
++ ok(unibi_get_str(ut, unibi_key_resume) == NULL, "key_resume = null");
++ ok(unibi_get_str(ut, unibi_key_save) == NULL, "key_save = null");
++ ok(unibi_get_str(ut, unibi_key_suspend) == NULL, "key_suspend = null");
++ ok(unibi_get_str(ut, unibi_key_undo) == NULL, "key_undo = null");
++ ok(unibi_get_str(ut, unibi_key_sbeg) == NULL, "key_sbeg = null");
++ ok(unibi_get_str(ut, unibi_key_scancel) == NULL, "key_scancel = null");
++ ok(unibi_get_str(ut, unibi_key_scommand) == NULL, "key_scommand = null");
++ ok(unibi_get_str(ut, unibi_key_scopy) == NULL, "key_scopy = null");
++ ok(unibi_get_str(ut, unibi_key_screate) == NULL, "key_screate = null");
++ ok(unibi_get_str(ut, unibi_key_sdc) == NULL, "key_sdc = null");
++ ok(unibi_get_str(ut, unibi_key_sdl) == NULL, "key_sdl = null");
++ ok(unibi_get_str(ut, unibi_key_select) == NULL, "key_select = null");
++ ok(unibi_get_str(ut, unibi_key_send) == NULL, "key_send = null");
++ ok(unibi_get_str(ut, unibi_key_seol) == NULL, "key_seol = null");
++ ok(unibi_get_str(ut, unibi_key_sexit) == NULL, "key_sexit = null");
++ ok(unibi_get_str(ut, unibi_key_sfind) == NULL, "key_sfind = null");
++ ok(unibi_get_str(ut, unibi_key_shelp) == NULL, "key_shelp = null");
++ ok(unibi_get_str(ut, unibi_key_shome) == NULL, "key_shome = null");
++ ok(unibi_get_str(ut, unibi_key_sic) == NULL, "key_sic = null");
++ ok(unibi_get_str(ut, unibi_key_sleft) == NULL, "key_sleft = null");
++ ok(unibi_get_str(ut, unibi_key_smessage) == NULL, "key_smessage = null");
++ ok(unibi_get_str(ut, unibi_key_smove) == NULL, "key_smove = null");
++ ok(unibi_get_str(ut, unibi_key_snext) == NULL, "key_snext = null");
++ ok(unibi_get_str(ut, unibi_key_soptions) == NULL, "key_soptions = null");
++ ok(unibi_get_str(ut, unibi_key_sprevious) == NULL, "key_sprevious = null");
++ ok(unibi_get_str(ut, unibi_key_sprint) == NULL, "key_sprint = null");
++ ok(unibi_get_str(ut, unibi_key_sredo) == NULL, "key_sredo = null");
++ ok(unibi_get_str(ut, unibi_key_sreplace) == NULL, "key_sreplace = null");
++ ok(unibi_get_str(ut, unibi_key_sright) == NULL, "key_sright = null");
++ ok(unibi_get_str(ut, unibi_key_srsume) == NULL, "key_srsume = null");
++ ok(unibi_get_str(ut, unibi_key_ssave) == NULL, "key_ssave = null");
++ ok(unibi_get_str(ut, unibi_key_ssuspend) == NULL, "key_ssuspend = null");
++ ok(unibi_get_str(ut, unibi_key_sundo) == NULL, "key_sundo = null");
++ ok(unibi_get_str(ut, unibi_req_for_input) == NULL, "req_for_input = null");
++ ok(strcmp(unibi_get_str(ut, unibi_key_f11), "\033[23~") == 0, "key_f11 = \"%s\"", "\\033[23~");
++ unibi_set_str(dt, unibi_key_f11, "\033[23~");
++ ok(strcmp(unibi_get_str(ut, unibi_key_f12), "\033[24~") == 0, "key_f12 = \"%s\"", "\\033[24~");
++ unibi_set_str(dt, unibi_key_f12, "\033[24~");
++ ok(unibi_get_str(ut, unibi_key_f13) == NULL, "key_f13 = null");
++ ok(unibi_get_str(ut, unibi_key_f14) == NULL, "key_f14 = null");
++ ok(unibi_get_str(ut, unibi_key_f15) == NULL, "key_f15 = null");
++ ok(unibi_get_str(ut, unibi_key_f16) == NULL, "key_f16 = null");
++ ok(unibi_get_str(ut, unibi_key_f17) == NULL, "key_f17 = null");
++ ok(unibi_get_str(ut, unibi_key_f18) == NULL, "key_f18 = null");
++ ok(unibi_get_str(ut, unibi_key_f19) == NULL, "key_f19 = null");
++ ok(unibi_get_str(ut, unibi_key_f20) == NULL, "key_f20 = null");
++ ok(unibi_get_str(ut, unibi_key_f21) == NULL, "key_f21 = null");
++ ok(unibi_get_str(ut, unibi_key_f22) == NULL, "key_f22 = null");
++ ok(unibi_get_str(ut, unibi_key_f23) == NULL, "key_f23 = null");
++ ok(unibi_get_str(ut, unibi_key_f24) == NULL, "key_f24 = null");
++ ok(unibi_get_str(ut, unibi_key_f25) == NULL, "key_f25 = null");
++ ok(unibi_get_str(ut, unibi_key_f26) == NULL, "key_f26 = null");
++ ok(unibi_get_str(ut, unibi_key_f27) == NULL, "key_f27 = null");
++ ok(unibi_get_str(ut, unibi_key_f28) == NULL, "key_f28 = null");
++ ok(unibi_get_str(ut, unibi_key_f29) == NULL, "key_f29 = null");
++ ok(unibi_get_str(ut, unibi_key_f30) == NULL, "key_f30 = null");
++ ok(unibi_get_str(ut, unibi_key_f31) == NULL, "key_f31 = null");
++ ok(unibi_get_str(ut, unibi_key_f32) == NULL, "key_f32 = null");
++ ok(unibi_get_str(ut, unibi_key_f33) == NULL, "key_f33 = null");
++ ok(unibi_get_str(ut, unibi_key_f34) == NULL, "key_f34 = null");
++ ok(unibi_get_str(ut, unibi_key_f35) == NULL, "key_f35 = null");
++ ok(unibi_get_str(ut, unibi_key_f36) == NULL, "key_f36 = null");
++ ok(unibi_get_str(ut, unibi_key_f37) == NULL, "key_f37 = null");
++ ok(unibi_get_str(ut, unibi_key_f38) == NULL, "key_f38 = null");
++ ok(unibi_get_str(ut, unibi_key_f39) == NULL, "key_f39 = null");
++ ok(unibi_get_str(ut, unibi_key_f40) == NULL, "key_f40 = null");
++ ok(unibi_get_str(ut, unibi_key_f41) == NULL, "key_f41 = null");
++ ok(unibi_get_str(ut, unibi_key_f42) == NULL, "key_f42 = null");
++ ok(unibi_get_str(ut, unibi_key_f43) == NULL, "key_f43 = null");
++ ok(unibi_get_str(ut, unibi_key_f44) == NULL, "key_f44 = null");
++ ok(unibi_get_str(ut, unibi_key_f45) == NULL, "key_f45 = null");
++ ok(unibi_get_str(ut, unibi_key_f46) == NULL, "key_f46 = null");
++ ok(unibi_get_str(ut, unibi_key_f47) == NULL, "key_f47 = null");
++ ok(unibi_get_str(ut, unibi_key_f48) == NULL, "key_f48 = null");
++ ok(unibi_get_str(ut, unibi_key_f49) == NULL, "key_f49 = null");
++ ok(unibi_get_str(ut, unibi_key_f50) == NULL, "key_f50 = null");
++ ok(unibi_get_str(ut, unibi_key_f51) == NULL, "key_f51 = null");
++ ok(unibi_get_str(ut, unibi_key_f52) == NULL, "key_f52 = null");
++ ok(unibi_get_str(ut, unibi_key_f53) == NULL, "key_f53 = null");
++ ok(unibi_get_str(ut, unibi_key_f54) == NULL, "key_f54 = null");
++ ok(unibi_get_str(ut, unibi_key_f55) == NULL, "key_f55 = null");
++ ok(unibi_get_str(ut, unibi_key_f56) == NULL, "key_f56 = null");
++ ok(unibi_get_str(ut, unibi_key_f57) == NULL, "key_f57 = null");
++ ok(unibi_get_str(ut, unibi_key_f58) == NULL, "key_f58 = null");
++ ok(unibi_get_str(ut, unibi_key_f59) == NULL, "key_f59 = null");
++ ok(unibi_get_str(ut, unibi_key_f60) == NULL, "key_f60 = null");
++ ok(unibi_get_str(ut, unibi_key_f61) == NULL, "key_f61 = null");
++ ok(unibi_get_str(ut, unibi_key_f62) == NULL, "key_f62 = null");
++ ok(unibi_get_str(ut, unibi_key_f63) == NULL, "key_f63 = null");
++ ok(strcmp(unibi_get_str(ut, unibi_clr_bol), "\033[1K") == 0, "clr_bol = \"%s\"", "\\033[1K");
++ unibi_set_str(dt, unibi_clr_bol, "\033[1K");
++ ok(unibi_get_str(ut, unibi_clear_margins) == NULL, "clear_margins = null");
++ ok(unibi_get_str(ut, unibi_set_left_margin) == NULL, "set_left_margin = null");
++ ok(unibi_get_str(ut, unibi_set_right_margin) == NULL, "set_right_margin = null");
++ ok(unibi_get_str(ut, unibi_label_format) == NULL, "label_format = null");
++ ok(unibi_get_str(ut, unibi_set_clock) == NULL, "set_clock = null");
++ ok(unibi_get_str(ut, unibi_display_clock) == NULL, "display_clock = null");
++ ok(unibi_get_str(ut, unibi_remove_clock) == NULL, "remove_clock = null");
++ ok(unibi_get_str(ut, unibi_create_window) == NULL, "create_window = null");
++ ok(unibi_get_str(ut, unibi_goto_window) == NULL, "goto_window = null");
++ ok(unibi_get_str(ut, unibi_hangup) == NULL, "hangup = null");
++ ok(unibi_get_str(ut, unibi_dial_phone) == NULL, "dial_phone = null");
++ ok(unibi_get_str(ut, unibi_quick_dial) == NULL, "quick_dial = null");
++ ok(unibi_get_str(ut, unibi_tone) == NULL, "tone = null");
++ ok(unibi_get_str(ut, unibi_pulse) == NULL, "pulse = null");
++ ok(unibi_get_str(ut, unibi_flash_hook) == NULL, "flash_hook = null");
++ ok(unibi_get_str(ut, unibi_fixed_pause) == NULL, "fixed_pause = null");
++ ok(unibi_get_str(ut, unibi_wait_tone) == NULL, "wait_tone = null");
++ ok(unibi_get_str(ut, unibi_user0) == NULL, "user0 = null");
++ ok(unibi_get_str(ut, unibi_user1) == NULL, "user1 = null");
++ ok(unibi_get_str(ut, unibi_user2) == NULL, "user2 = null");
++ ok(unibi_get_str(ut, unibi_user3) == NULL, "user3 = null");
++ ok(unibi_get_str(ut, unibi_user4) == NULL, "user4 = null");
++ ok(unibi_get_str(ut, unibi_user5) == NULL, "user5 = null");
++ ok(unibi_get_str(ut, unibi_user6) == NULL, "user6 = null");
++ ok(unibi_get_str(ut, unibi_user7) == NULL, "user7 = null");
++ ok(unibi_get_str(ut, unibi_user8) == NULL, "user8 = null");
++ ok(unibi_get_str(ut, unibi_user9) == NULL, "user9 = null");
++ ok(strcmp(unibi_get_str(ut, unibi_orig_pair), "\033[39;49m") == 0, "orig_pair = \"%s\"", "\\033[39;49m");
++ unibi_set_str(dt, unibi_orig_pair, "\033[39;49m");
++ ok(unibi_get_str(ut, unibi_orig_colors) == NULL, "orig_colors = null");
++ ok(unibi_get_str(ut, unibi_initialize_color) == NULL, "initialize_color = null");
++ ok(unibi_get_str(ut, unibi_initialize_pair) == NULL, "initialize_pair = null");
++ ok(unibi_get_str(ut, unibi_set_color_pair) == NULL, "set_color_pair = null");
++ ok(unibi_get_str(ut, unibi_set_foreground) == NULL, "set_foreground = null");
++ ok(unibi_get_str(ut, unibi_set_background) == NULL, "set_background = null");
++ ok(unibi_get_str(ut, unibi_change_char_pitch) == NULL, "change_char_pitch = null");
++ ok(unibi_get_str(ut, unibi_change_line_pitch) == NULL, "change_line_pitch = null");
++ ok(unibi_get_str(ut, unibi_change_res_horz) == NULL, "change_res_horz = null");
++ ok(unibi_get_str(ut, unibi_change_res_vert) == NULL, "change_res_vert = null");
++ ok(unibi_get_str(ut, unibi_define_char) == NULL, "define_char = null");
++ ok(unibi_get_str(ut, unibi_enter_doublewide_mode) == NULL, "enter_doublewide_mode = null");
++ ok(unibi_get_str(ut, unibi_enter_draft_quality) == NULL, "enter_draft_quality = null");
++ ok(unibi_get_str(ut, unibi_enter_italics_mode) == NULL, "enter_italics_mode = null");
++ ok(unibi_get_str(ut, unibi_enter_leftward_mode) == NULL, "enter_leftward_mode = null");
++ ok(unibi_get_str(ut, unibi_enter_micro_mode) == NULL, "enter_micro_mode = null");
++ ok(unibi_get_str(ut, unibi_enter_near_letter_quality) == NULL, "enter_near_letter_quality = null");
++ ok(unibi_get_str(ut, unibi_enter_normal_quality) == NULL, "enter_normal_quality = null");
++ ok(unibi_get_str(ut, unibi_enter_shadow_mode) == NULL, "enter_shadow_mode = null");
++ ok(unibi_get_str(ut, unibi_enter_subscript_mode) == NULL, "enter_subscript_mode = null");
++ ok(unibi_get_str(ut, unibi_enter_superscript_mode) == NULL, "enter_superscript_mode = null");
++ ok(unibi_get_str(ut, unibi_enter_upward_mode) == NULL, "enter_upward_mode = null");
++ ok(unibi_get_str(ut, unibi_exit_doublewide_mode) == NULL, "exit_doublewide_mode = null");
++ ok(unibi_get_str(ut, unibi_exit_italics_mode) == NULL, "exit_italics_mode = null");
++ ok(unibi_get_str(ut, unibi_exit_leftward_mode) == NULL, "exit_leftward_mode = null");
++ ok(unibi_get_str(ut, unibi_exit_micro_mode) == NULL, "exit_micro_mode = null");
++ ok(unibi_get_str(ut, unibi_exit_shadow_mode) == NULL, "exit_shadow_mode = null");
++ ok(unibi_get_str(ut, unibi_exit_subscript_mode) == NULL, "exit_subscript_mode = null");
++ ok(unibi_get_str(ut, unibi_exit_superscript_mode) == NULL, "exit_superscript_mode = null");
++ ok(unibi_get_str(ut, unibi_exit_upward_mode) == NULL, "exit_upward_mode = null");
++ ok(unibi_get_str(ut, unibi_micro_column_address) == NULL, "micro_column_address = null");
++ ok(unibi_get_str(ut, unibi_micro_down) == NULL, "micro_down = null");
++ ok(unibi_get_str(ut, unibi_micro_left) == NULL, "micro_left = null");
++ ok(unibi_get_str(ut, unibi_micro_right) == NULL, "micro_right = null");
++ ok(unibi_get_str(ut, unibi_micro_row_address) == NULL, "micro_row_address = null");
++ ok(unibi_get_str(ut, unibi_micro_up) == NULL, "micro_up = null");
++ ok(unibi_get_str(ut, unibi_order_of_pins) == NULL, "order_of_pins = null");
++ ok(unibi_get_str(ut, unibi_parm_down_micro) == NULL, "parm_down_micro = null");
++ ok(unibi_get_str(ut, unibi_parm_left_micro) == NULL, "parm_left_micro = null");
++ ok(unibi_get_str(ut, unibi_parm_right_micro) == NULL, "parm_right_micro = null");
++ ok(unibi_get_str(ut, unibi_parm_up_micro) == NULL, "parm_up_micro = null");
++ ok(unibi_get_str(ut, unibi_select_char_set) == NULL, "select_char_set = null");
++ ok(unibi_get_str(ut, unibi_set_bottom_margin) == NULL, "set_bottom_margin = null");
++ ok(unibi_get_str(ut, unibi_set_bottom_margin_parm) == NULL, "set_bottom_margin_parm = null");
++ ok(unibi_get_str(ut, unibi_set_left_margin_parm) == NULL, "set_left_margin_parm = null");
++ ok(unibi_get_str(ut, unibi_set_right_margin_parm) == NULL, "set_right_margin_parm = null");
++ ok(unibi_get_str(ut, unibi_set_top_margin) == NULL, "set_top_margin = null");
++ ok(unibi_get_str(ut, unibi_set_top_margin_parm) == NULL, "set_top_margin_parm = null");
++ ok(unibi_get_str(ut, unibi_start_bit_image) == NULL, "start_bit_image = null");
++ ok(unibi_get_str(ut, unibi_start_char_set_def) == NULL, "start_char_set_def = null");
++ ok(unibi_get_str(ut, unibi_stop_bit_image) == NULL, "stop_bit_image = null");
++ ok(unibi_get_str(ut, unibi_stop_char_set_def) == NULL, "stop_char_set_def = null");
++ ok(unibi_get_str(ut, unibi_subscript_characters) == NULL, "subscript_characters = null");
++ ok(unibi_get_str(ut, unibi_superscript_characters) == NULL, "superscript_characters = null");
++ ok(unibi_get_str(ut, unibi_these_cause_cr) == NULL, "these_cause_cr = null");
++ ok(unibi_get_str(ut, unibi_zero_motion) == NULL, "zero_motion = null");
++ ok(unibi_get_str(ut, unibi_char_set_names) == NULL, "char_set_names = null");
++ ok(strcmp(unibi_get_str(ut, unibi_key_mouse), "\033[M") == 0, "key_mouse = \"%s\"", "\\033[M");
++ unibi_set_str(dt, unibi_key_mouse, "\033[M");
++ ok(unibi_get_str(ut, unibi_mouse_info) == NULL, "mouse_info = null");
++ ok(unibi_get_str(ut, unibi_req_mouse_pos) == NULL, "req_mouse_pos = null");
++ ok(unibi_get_str(ut, unibi_get_mouse) == NULL, "get_mouse = null");
++ ok(strcmp(unibi_get_str(ut, unibi_set_a_foreground), "\033[3%p1%dm") == 0, "set_a_foreground = \"%s\"", "\\033[3%p1%dm");
++ unibi_set_str(dt, unibi_set_a_foreground, "\033[3%p1%dm");
++ ok(strcmp(unibi_get_str(ut, unibi_set_a_background), "\033[4%p1%dm") == 0, "set_a_background = \"%s\"", "\\033[4%p1%dm");
++ unibi_set_str(dt, unibi_set_a_background, "\033[4%p1%dm");
++ ok(unibi_get_str(ut, unibi_pkey_plab) == NULL, "pkey_plab = null");
++ ok(unibi_get_str(ut, unibi_device_type) == NULL, "device_type = null");
++ ok(unibi_get_str(ut, unibi_code_set_init) == NULL, "code_set_init = null");
++ ok(unibi_get_str(ut, unibi_set0_des_seq) == NULL, "set0_des_seq = null");
++ ok(unibi_get_str(ut, unibi_set1_des_seq) == NULL, "set1_des_seq = null");
++ ok(unibi_get_str(ut, unibi_set2_des_seq) == NULL, "set2_des_seq = null");
++ ok(unibi_get_str(ut, unibi_set3_des_seq) == NULL, "set3_des_seq = null");
++ ok(unibi_get_str(ut, unibi_set_lr_margin) == NULL, "set_lr_margin = null");
++ ok(unibi_get_str(ut, unibi_set_tb_margin) == NULL, "set_tb_margin = null");
++ ok(unibi_get_str(ut, unibi_bit_image_repeat) == NULL, "bit_image_repeat = null");
++ ok(unibi_get_str(ut, unibi_bit_image_newline) == NULL, "bit_image_newline = null");
++ ok(unibi_get_str(ut, unibi_bit_image_carriage_return) == NULL, "bit_image_carriage_return = null");
++ ok(unibi_get_str(ut, unibi_color_names) == NULL, "color_names = null");
++ ok(unibi_get_str(ut, unibi_define_bit_image_region) == NULL, "define_bit_image_region = null");
++ ok(unibi_get_str(ut, unibi_end_bit_image_region) == NULL, "end_bit_image_region = null");
++ ok(unibi_get_str(ut, unibi_set_color_band) == NULL, "set_color_band = null");
++ ok(unibi_get_str(ut, unibi_set_page_length) == NULL, "set_page_length = null");
++ ok(unibi_get_str(ut, unibi_display_pc_char) == NULL, "display_pc_char = null");
++ ok(unibi_get_str(ut, unibi_enter_pc_charset_mode) == NULL, "enter_pc_charset_mode = null");
++ ok(unibi_get_str(ut, unibi_exit_pc_charset_mode) == NULL, "exit_pc_charset_mode = null");
++ ok(unibi_get_str(ut, unibi_enter_scancode_mode) == NULL, "enter_scancode_mode = null");
++ ok(unibi_get_str(ut, unibi_exit_scancode_mode) == NULL, "exit_scancode_mode = null");
++ ok(unibi_get_str(ut, unibi_pc_term_options) == NULL, "pc_term_options = null");
++ ok(unibi_get_str(ut, unibi_scancode_escape) == NULL, "scancode_escape = null");
++ ok(unibi_get_str(ut, unibi_alt_scancode_esc) == NULL, "alt_scancode_esc = null");
++ ok(unibi_get_str(ut, unibi_enter_horizontal_hl_mode) == NULL, "enter_horizontal_hl_mode = null");
++ ok(unibi_get_str(ut, unibi_enter_left_hl_mode) == NULL, "enter_left_hl_mode = null");
++ ok(unibi_get_str(ut, unibi_enter_low_hl_mode) == NULL, "enter_low_hl_mode = null");
++ ok(unibi_get_str(ut, unibi_enter_right_hl_mode) == NULL, "enter_right_hl_mode = null");
++ ok(unibi_get_str(ut, unibi_enter_top_hl_mode) == NULL, "enter_top_hl_mode = null");
++ ok(unibi_get_str(ut, unibi_enter_vertical_hl_mode) == NULL, "enter_vertical_hl_mode = null");
++ ok(unibi_get_str(ut, unibi_set_a_attributes) == NULL, "set_a_attributes = null");
++ ok(unibi_get_str(ut, unibi_set_pglen_inch) == NULL, "set_pglen_inch = null");
++ ok(unibi_get_str(ut, unibi_termcap_init2) == NULL, "termcap_init2 = null");
++ ok(unibi_get_str(ut, unibi_termcap_reset) == NULL, "termcap_reset = null");
++ ok(unibi_get_str(ut, unibi_linefeed_if_not_lf) == NULL, "linefeed_if_not_lf = null");
++ ok(unibi_get_str(ut, unibi_backspace_if_not_bs) == NULL, "backspace_if_not_bs = null");
++ ok(unibi_get_str(ut, unibi_other_non_function_keys) == NULL, "other_non_function_keys = null");
++ ok(unibi_get_str(ut, unibi_arrow_key_map) == NULL, "arrow_key_map = null");
++ ok(unibi_get_str(ut, unibi_acs_ulcorner) == NULL, "acs_ulcorner = null");
++ ok(unibi_get_str(ut, unibi_acs_llcorner) == NULL, "acs_llcorner = null");
++ ok(unibi_get_str(ut, unibi_acs_urcorner) == NULL, "acs_urcorner = null");
++ ok(unibi_get_str(ut, unibi_acs_lrcorner) == NULL, "acs_lrcorner = null");
++ ok(unibi_get_str(ut, unibi_acs_ltee) == NULL, "acs_ltee = null");
++ ok(unibi_get_str(ut, unibi_acs_rtee) == NULL, "acs_rtee = null");
++ ok(unibi_get_str(ut, unibi_acs_btee) == NULL, "acs_btee = null");
++ ok(unibi_get_str(ut, unibi_acs_ttee) == NULL, "acs_ttee = null");
++ ok(unibi_get_str(ut, unibi_acs_hline) == NULL, "acs_hline = null");
++ ok(unibi_get_str(ut, unibi_acs_vline) == NULL, "acs_vline = null");
++ ok(unibi_get_str(ut, unibi_acs_plus) == NULL, "acs_plus = null");
++ ok(unibi_get_str(ut, unibi_memory_lock) == NULL, "memory_lock = null");
++ ok(unibi_get_str(ut, unibi_memory_unlock) == NULL, "memory_unlock = null");
++ ok(unibi_get_str(ut, unibi_box_chars_1) == NULL, "box_chars_1 = null");
++
++ note("extended boolean capabilities");
++ {
++ const size_t n_ext = unibi_count_ext_bool(ut);
++ ok(n_ext == 3, "#ext_bool = 3");
++ ok(0 < n_ext && unibi_get_ext_bool(ut, 0) == 1, "ext_bool[0].value = 1");
++ ok(0 < n_ext && strcmp(unibi_get_ext_bool_name(ut, 0), "AX") == 0, "ext_bool[0].name = \"%s\"", "AX");
++ unibi_add_ext_bool(dt, "AX", 1);
++ ok(1 < n_ext && unibi_get_ext_bool(ut, 1) == 1, "ext_bool[1].value = 1");
++ ok(1 < n_ext && strcmp(unibi_get_ext_bool_name(ut, 1), "G0") == 0, "ext_bool[1].name = \"%s\"", "G0");
++ unibi_add_ext_bool(dt, "G0", 1);
++ ok(2 < n_ext && unibi_get_ext_bool(ut, 2) == 0, "ext_bool[2].value = 0");
++ ok(2 < n_ext && strcmp(unibi_get_ext_bool_name(ut, 2), "XT") == 0, "ext_bool[2].name = \"%s\"", "XT");
++ unibi_add_ext_bool(dt, "XT", 0);
++ }
++
++ note("extended numeric capabilities");
++ {
++ const size_t n_ext = unibi_count_ext_num(ut);
++ ok(n_ext == 1, "#ext_num = 1");
++ ok(0 < n_ext && unibi_get_ext_num(ut, 0) == 1, "ext_num[0].value = 1");
++ ok(0 < n_ext && strcmp(unibi_get_ext_num_name(ut, 0), "U8") == 0, "ext_num[0].name = \"%s\"", "U8");
++ unibi_add_ext_num(dt, "U8", 1);
++ }
++
++ note("extended string capabilities");
++ {
++ const size_t n_ext = unibi_count_ext_str(ut);
++ ok(n_ext == 12, "#ext_str = 12");
++ ok(0 < n_ext && strcmp(unibi_get_ext_str(ut, 0), "\033(B") == 0, "ext_str[0].value = \"%s\"", "\\033(B");
++ unibi_add_ext_str(dt, "E0", "\033(B");
++ ok(0 < n_ext && strcmp(unibi_get_ext_str_name(ut, 0), "E0") == 0, "ext_str[0].name = \"%s\"", "E0");
++ ok(1 < n_ext && unibi_get_ext_str(ut, 1) == NULL, "ext_str[1].value = null");
++ unibi_add_ext_str(dt, "E3", NULL);
++ ok(1 < n_ext && strcmp(unibi_get_ext_str_name(ut, 1), "E3") == 0, "ext_str[1].name = \"%s\"", "E3");
++ ok(2 < n_ext && strcmp(unibi_get_ext_str(ut, 2), "\033(%p1%c") == 0, "ext_str[2].value = \"%s\"", "\\033(%p1%c");
++ unibi_add_ext_str(dt, "S0", "\033(%p1%c");
++ ok(2 < n_ext && strcmp(unibi_get_ext_str_name(ut, 2), "S0") == 0, "ext_str[2].name = \"%s\"", "S0");
++ ok(3 < n_ext && unibi_get_ext_str(ut, 3) == NULL, "ext_str[3].value = null");
++ unibi_add_ext_str(dt, "TS", NULL);
++ ok(3 < n_ext && strcmp(unibi_get_ext_str_name(ut, 3), "TS") == 0, "ext_str[3].name = \"%s\"", "TS");
++ ok(4 < n_ext && unibi_get_ext_str(ut, 4) == NULL, "ext_str[4].value = null");
++ unibi_add_ext_str(dt, "XM", NULL);
++ ok(4 < n_ext && strcmp(unibi_get_ext_str_name(ut, 4), "XM") == 0, "ext_str[4].name = \"%s\"", "XM");
++ ok(5 < n_ext && unibi_get_ext_str(ut, 5) == NULL, "ext_str[5].value = null");
++ unibi_add_ext_str(dt, "kEND5", NULL);
++ ok(5 < n_ext && strcmp(unibi_get_ext_str_name(ut, 5), "kEND5") == 0, "ext_str[5].name = \"%s\"", "kEND5");
++ ok(6 < n_ext && unibi_get_ext_str(ut, 6) == NULL, "ext_str[6].value = null");
++ unibi_add_ext_str(dt, "kHOM5", NULL);
++ ok(6 < n_ext && strcmp(unibi_get_ext_str_name(ut, 6), "kHOM5") == 0, "ext_str[6].name = \"%s\"", "kHOM5");
++ ok(7 < n_ext && unibi_get_ext_str(ut, 7) == NULL, "ext_str[7].value = null");
++ unibi_add_ext_str(dt, "ka2", NULL);
++ ok(7 < n_ext && strcmp(unibi_get_ext_str_name(ut, 7), "ka2") == 0, "ext_str[7].name = \"%s\"", "ka2");
++ ok(8 < n_ext && unibi_get_ext_str(ut, 8) == NULL, "ext_str[8].value = null");
++ unibi_add_ext_str(dt, "kb1", NULL);
++ ok(8 < n_ext && strcmp(unibi_get_ext_str_name(ut, 8), "kb1") == 0, "ext_str[8].name = \"%s\"", "kb1");
++ ok(9 < n_ext && unibi_get_ext_str(ut, 9) == NULL, "ext_str[9].value = null");
++ unibi_add_ext_str(dt, "kb3", NULL);
++ ok(9 < n_ext && strcmp(unibi_get_ext_str_name(ut, 9), "kb3") == 0, "ext_str[9].name = \"%s\"", "kb3");
++ ok(10 < n_ext && unibi_get_ext_str(ut, 10) == NULL, "ext_str[10].value = null");
++ unibi_add_ext_str(dt, "kc2", NULL);
++ ok(10 < n_ext && strcmp(unibi_get_ext_str_name(ut, 10), "kc2") == 0, "ext_str[10].name = \"%s\"", "kc2");
++ ok(11 < n_ext && unibi_get_ext_str(ut, 11) == NULL, "ext_str[11].value = null");
++ unibi_add_ext_str(dt, "xm", NULL);
++ ok(11 < n_ext && strcmp(unibi_get_ext_str_name(ut, 11), "xm") == 0, "ext_str[11].name = \"%s\"", "xm");
++ }
++
++ {
++ char buf[sizeof terminfo];
++ size_t r = unibi_dump(ut, buf, sizeof buf);
++ ok(r == sizeof terminfo, "redump size == orig size");
++ ok(memcmp(terminfo, buf, sizeof buf) == 0, "redump == orig");
++ }
++
++ {
++ char buf[sizeof terminfo];
++ size_t r = unibi_dump(dt, buf, sizeof buf);
++ ok(r == sizeof terminfo, "dummy redump size == orig size");
++ ok(memcmp(terminfo, buf, sizeof buf) == 0, "dummy redump == orig");
++ }
++
++ unibi_destroy(ut);
++ ok(1, "object destroyed");
++
++ unibi_destroy(dt);
++ ok(1, "dummy object destroyed");
++
++ return 0;
++}
++
++static void setup(void) {
++ plan(543);
++}
+diff --git a/unibilium.c b/unibilium.c
+index 64472de..8586b6f 100644
+--- a/unibilium.c
++++ b/unibilium.c
+@@ -339,8 +339,6 @@ unibi_term *unibi_from_mem(const char *p, size_t n) {
+ extalllen += extnumlen;
+ extalllen += extstrslen;
+
+- DEL_FAIL_IF(extofflen != extalllen + extstrslen, EINVAL, t);
+-
+ DEL_FAIL_IF(
+ n <
+ extboollen +
+--
+2.19.1
+
diff --git a/unicode/CaseFolding.txt b/unicode/CaseFolding.txt
index 372ee68bd8..cce350f49c 100644
--- a/unicode/CaseFolding.txt
+++ b/unicode/CaseFolding.txt
@@ -1,6 +1,6 @@
-# CaseFolding-9.0.0.txt
-# Date: 2016-03-02, 18:54:54 GMT
-# ยฉ 2016 Unicodeยฎ, Inc.
+# CaseFolding-11.0.0.txt
+# Date: 2018-01-31, 08:20:09 GMT
+# ยฉ 2018 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
#
@@ -24,7 +24,7 @@
#
# NOTE: case folding does not preserve normalization formats!
#
-# For information on case folding, including how to have case folding
+# For information on case folding, including how to have case folding
# preserve normalization formats, see Section 3.13 Default Case Algorithms in
# The Unicode Standard.
#
@@ -603,6 +603,52 @@
1C86; C; 044A; # CYRILLIC SMALL LETTER TALL HARD SIGN
1C87; C; 0463; # CYRILLIC SMALL LETTER TALL YAT
1C88; C; A64B; # CYRILLIC SMALL LETTER UNBLENDED UK
+1C90; C; 10D0; # GEORGIAN MTAVRULI CAPITAL LETTER AN
+1C91; C; 10D1; # GEORGIAN MTAVRULI CAPITAL LETTER BAN
+1C92; C; 10D2; # GEORGIAN MTAVRULI CAPITAL LETTER GAN
+1C93; C; 10D3; # GEORGIAN MTAVRULI CAPITAL LETTER DON
+1C94; C; 10D4; # GEORGIAN MTAVRULI CAPITAL LETTER EN
+1C95; C; 10D5; # GEORGIAN MTAVRULI CAPITAL LETTER VIN
+1C96; C; 10D6; # GEORGIAN MTAVRULI CAPITAL LETTER ZEN
+1C97; C; 10D7; # GEORGIAN MTAVRULI CAPITAL LETTER TAN
+1C98; C; 10D8; # GEORGIAN MTAVRULI CAPITAL LETTER IN
+1C99; C; 10D9; # GEORGIAN MTAVRULI CAPITAL LETTER KAN
+1C9A; C; 10DA; # GEORGIAN MTAVRULI CAPITAL LETTER LAS
+1C9B; C; 10DB; # GEORGIAN MTAVRULI CAPITAL LETTER MAN
+1C9C; C; 10DC; # GEORGIAN MTAVRULI CAPITAL LETTER NAR
+1C9D; C; 10DD; # GEORGIAN MTAVRULI CAPITAL LETTER ON
+1C9E; C; 10DE; # GEORGIAN MTAVRULI CAPITAL LETTER PAR
+1C9F; C; 10DF; # GEORGIAN MTAVRULI CAPITAL LETTER ZHAR
+1CA0; C; 10E0; # GEORGIAN MTAVRULI CAPITAL LETTER RAE
+1CA1; C; 10E1; # GEORGIAN MTAVRULI CAPITAL LETTER SAN
+1CA2; C; 10E2; # GEORGIAN MTAVRULI CAPITAL LETTER TAR
+1CA3; C; 10E3; # GEORGIAN MTAVRULI CAPITAL LETTER UN
+1CA4; C; 10E4; # GEORGIAN MTAVRULI CAPITAL LETTER PHAR
+1CA5; C; 10E5; # GEORGIAN MTAVRULI CAPITAL LETTER KHAR
+1CA6; C; 10E6; # GEORGIAN MTAVRULI CAPITAL LETTER GHAN
+1CA7; C; 10E7; # GEORGIAN MTAVRULI CAPITAL LETTER QAR
+1CA8; C; 10E8; # GEORGIAN MTAVRULI CAPITAL LETTER SHIN
+1CA9; C; 10E9; # GEORGIAN MTAVRULI CAPITAL LETTER CHIN
+1CAA; C; 10EA; # GEORGIAN MTAVRULI CAPITAL LETTER CAN
+1CAB; C; 10EB; # GEORGIAN MTAVRULI CAPITAL LETTER JIL
+1CAC; C; 10EC; # GEORGIAN MTAVRULI CAPITAL LETTER CIL
+1CAD; C; 10ED; # GEORGIAN MTAVRULI CAPITAL LETTER CHAR
+1CAE; C; 10EE; # GEORGIAN MTAVRULI CAPITAL LETTER XAN
+1CAF; C; 10EF; # GEORGIAN MTAVRULI CAPITAL LETTER JHAN
+1CB0; C; 10F0; # GEORGIAN MTAVRULI CAPITAL LETTER HAE
+1CB1; C; 10F1; # GEORGIAN MTAVRULI CAPITAL LETTER HE
+1CB2; C; 10F2; # GEORGIAN MTAVRULI CAPITAL LETTER HIE
+1CB3; C; 10F3; # GEORGIAN MTAVRULI CAPITAL LETTER WE
+1CB4; C; 10F4; # GEORGIAN MTAVRULI CAPITAL LETTER HAR
+1CB5; C; 10F5; # GEORGIAN MTAVRULI CAPITAL LETTER HOE
+1CB6; C; 10F6; # GEORGIAN MTAVRULI CAPITAL LETTER FI
+1CB7; C; 10F7; # GEORGIAN MTAVRULI CAPITAL LETTER YN
+1CB8; C; 10F8; # GEORGIAN MTAVRULI CAPITAL LETTER ELIFI
+1CB9; C; 10F9; # GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN
+1CBA; C; 10FA; # GEORGIAN MTAVRULI CAPITAL LETTER AIN
+1CBD; C; 10FD; # GEORGIAN MTAVRULI CAPITAL LETTER AEN
+1CBE; C; 10FE; # GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN
+1CBF; C; 10FF; # GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN
1E00; C; 1E01; # LATIN CAPITAL LETTER A WITH RING BELOW
1E02; C; 1E03; # LATIN CAPITAL LETTER B WITH DOT ABOVE
1E04; C; 1E05; # LATIN CAPITAL LETTER B WITH DOT BELOW
@@ -1180,6 +1226,7 @@ A7B2; C; 029D; # LATIN CAPITAL LETTER J WITH CROSSED-TAIL
A7B3; C; AB53; # LATIN CAPITAL LETTER CHI
A7B4; C; A7B5; # LATIN CAPITAL LETTER BETA
A7B6; C; A7B7; # LATIN CAPITAL LETTER OMEGA
+A7B8; C; A7B9; # LATIN CAPITAL LETTER U WITH STROKE
AB70; C; 13A0; # CHEROKEE SMALL LETTER A
AB71; C; 13A1; # CHEROKEE SMALL LETTER E
AB72; C; 13A2; # CHEROKEE SMALL LETTER I
@@ -1457,6 +1504,38 @@ FF3A; C; FF5A; # FULLWIDTH LATIN CAPITAL LETTER Z
118BD; C; 118DD; # WARANG CITI CAPITAL LETTER SSUU
118BE; C; 118DE; # WARANG CITI CAPITAL LETTER SII
118BF; C; 118DF; # WARANG CITI CAPITAL LETTER VIYO
+16E40; C; 16E60; # MEDEFAIDRIN CAPITAL LETTER M
+16E41; C; 16E61; # MEDEFAIDRIN CAPITAL LETTER S
+16E42; C; 16E62; # MEDEFAIDRIN CAPITAL LETTER V
+16E43; C; 16E63; # MEDEFAIDRIN CAPITAL LETTER W
+16E44; C; 16E64; # MEDEFAIDRIN CAPITAL LETTER ATIU
+16E45; C; 16E65; # MEDEFAIDRIN CAPITAL LETTER Z
+16E46; C; 16E66; # MEDEFAIDRIN CAPITAL LETTER KP
+16E47; C; 16E67; # MEDEFAIDRIN CAPITAL LETTER P
+16E48; C; 16E68; # MEDEFAIDRIN CAPITAL LETTER T
+16E49; C; 16E69; # MEDEFAIDRIN CAPITAL LETTER G
+16E4A; C; 16E6A; # MEDEFAIDRIN CAPITAL LETTER F
+16E4B; C; 16E6B; # MEDEFAIDRIN CAPITAL LETTER I
+16E4C; C; 16E6C; # MEDEFAIDRIN CAPITAL LETTER K
+16E4D; C; 16E6D; # MEDEFAIDRIN CAPITAL LETTER A
+16E4E; C; 16E6E; # MEDEFAIDRIN CAPITAL LETTER J
+16E4F; C; 16E6F; # MEDEFAIDRIN CAPITAL LETTER E
+16E50; C; 16E70; # MEDEFAIDRIN CAPITAL LETTER B
+16E51; C; 16E71; # MEDEFAIDRIN CAPITAL LETTER C
+16E52; C; 16E72; # MEDEFAIDRIN CAPITAL LETTER U
+16E53; C; 16E73; # MEDEFAIDRIN CAPITAL LETTER YU
+16E54; C; 16E74; # MEDEFAIDRIN CAPITAL LETTER L
+16E55; C; 16E75; # MEDEFAIDRIN CAPITAL LETTER Q
+16E56; C; 16E76; # MEDEFAIDRIN CAPITAL LETTER HP
+16E57; C; 16E77; # MEDEFAIDRIN CAPITAL LETTER NY
+16E58; C; 16E78; # MEDEFAIDRIN CAPITAL LETTER X
+16E59; C; 16E79; # MEDEFAIDRIN CAPITAL LETTER D
+16E5A; C; 16E7A; # MEDEFAIDRIN CAPITAL LETTER OE
+16E5B; C; 16E7B; # MEDEFAIDRIN CAPITAL LETTER N
+16E5C; C; 16E7C; # MEDEFAIDRIN CAPITAL LETTER R
+16E5D; C; 16E7D; # MEDEFAIDRIN CAPITAL LETTER O
+16E5E; C; 16E7E; # MEDEFAIDRIN CAPITAL LETTER AI
+16E5F; C; 16E7F; # MEDEFAIDRIN CAPITAL LETTER Y
1E900; C; 1E922; # ADLAM CAPITAL LETTER ALIF
1E901; C; 1E923; # ADLAM CAPITAL LETTER DAALI
1E902; C; 1E924; # ADLAM CAPITAL LETTER LAAM
diff --git a/unicode/EastAsianWidth.txt b/unicode/EastAsianWidth.txt
index 5a2ede5d59..cb489c3404 100644
--- a/unicode/EastAsianWidth.txt
+++ b/unicode/EastAsianWidth.txt
@@ -1,6 +1,6 @@
-# EastAsianWidth-9.0.0.txt
-# Date: 2016-05-27, 17:00:00 GMT [KW, LI]
-# ยฉ 2016 Unicodeยฎ, Inc.
+# EastAsianWidth-11.0.0.txt
+# Date: 2018-05-14, 09:41:59 GMT [KW, LI]
+# ยฉ 2018 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
#
@@ -123,7 +123,7 @@
00FC;A # Ll LATIN SMALL LETTER U WITH DIAERESIS
00FD;N # Ll LATIN SMALL LETTER Y WITH ACUTE
00FE;A # Ll LATIN SMALL LETTER THORN
-00FF;N # L& LATIN SMALL LETTER Y WITH DIAERESIS
+00FF;N # Ll LATIN SMALL LETTER Y WITH DIAERESIS
0100;N # Lu LATIN CAPITAL LETTER A WITH MACRON
0101;A # Ll LATIN SMALL LETTER A WITH MACRON
0102..0110;N # L& [15] LATIN CAPITAL LETTER A WITH BREVE..LATIN CAPITAL LETTER D WITH STROKE
@@ -247,7 +247,7 @@
0531..0556;N # Lu [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
0559;N # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING
055A..055F;N # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK
-0561..0587;N # Ll [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN
+0560..0588;N # Ll [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE
0589;N # Po ARMENIAN FULL STOP
058A;N # Pd ARMENIAN HYPHEN
058D..058E;N # So [2] RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN
@@ -262,7 +262,7 @@
05C6;N # Po HEBREW PUNCTUATION NUN HAFUKHA
05C7;N # Mn HEBREW POINT QAMATS QATAN
05D0..05EA;N # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV
-05F0..05F2;N # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD
+05EF..05F2;N # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD
05F3..05F4;N # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM
0600..0605;N # Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE
0606..0608;N # Sm [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY
@@ -316,6 +316,8 @@
07F6;N # So NKO SYMBOL OO DENNEN
07F7..07F9;N # Po [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK
07FA;N # Lm NKO LAJANYALAN
+07FD;N # Mn NKO DANTAYALAN
+07FE..07FF;N # Sc [2] NKO DOROME SIGN..NKO TAMAN SIGN
0800..0815;N # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF
0816..0819;N # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH
081A;N # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT
@@ -328,9 +330,10 @@
0840..0858;N # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN
0859..085B;N # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK
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
-08D4..08E1;N # Mn [14] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA
+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
0900..0902;N # Mn [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA
@@ -381,6 +384,9 @@
09F4..09F9;N # No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN
09FA;N # So BENGALI ISSHAR
09FB;N # Sc BENGALI GANDA MARK
+09FC;N # Lo BENGALI LETTER VEDIC ANUSVARA
+09FD;N # Po BENGALI ABBREVIATION SIGN
+09FE;N # Mn BENGALI SANDHI MARK
0A01..0A02;N # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
0A03;N # Mc GURMUKHI SIGN VISARGA
0A05..0A0A;N # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU
@@ -402,6 +408,7 @@
0A70..0A71;N # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK
0A72..0A74;N # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR
0A75;N # Mn GURMUKHI SIGN YAKASH
+0A76;N # Po GURMUKHI ABBREVIATION SIGN
0A81..0A82;N # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
0A83;N # Mc GUJARATI SIGN VISARGA
0A85..0A8D;N # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E
@@ -425,6 +432,7 @@
0AF0;N # Po GUJARATI ABBREVIATION SIGN
0AF1;N # Sc GUJARATI RUPEE SIGN
0AF9;N # Lo GUJARATI LETTER ZHA
+0AFA..0AFF;N # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE
0B01;N # Mn ORIYA SIGN CANDRABINDU
0B02..0B03;N # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA
0B05..0B0C;N # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L
@@ -477,6 +485,7 @@
0BFA;N # So TAMIL NUMBER SIGN
0C00;N # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE
0C01..0C03;N # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
+0C04;N # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE
0C05..0C0C;N # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L
0C0E..0C10;N # Lo [3] TELUGU LETTER E..TELUGU LETTER AI
0C12..0C28;N # Lo [23] TELUGU LETTER O..TELUGU LETTER NA
@@ -496,6 +505,7 @@
0C80;N # Lo KANNADA SIGN SPACING CANDRABINDU
0C81;N # Mn KANNADA SIGN CANDRABINDU
0C82..0C83;N # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
+0C84;N # Po KANNADA SIGN SIDDHAM
0C85..0C8C;N # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L
0C8E..0C90;N # Lo [3] KANNADA LETTER E..KANNADA LETTER AI
0C92..0CA8;N # Lo [23] KANNADA LETTER O..KANNADA LETTER NA
@@ -516,11 +526,12 @@
0CE2..0CE3;N # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
0CE6..0CEF;N # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
0CF1..0CF2;N # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
-0D01;N # Mn MALAYALAM SIGN CANDRABINDU
+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
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
0D3D;N # Lo MALAYALAM SIGN AVAGRAHA
0D3E..0D40;N # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II
0D41..0D44;N # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR
@@ -661,10 +672,10 @@
10A0..10C5;N # Lu [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
10C7;N # Lu GEORGIAN CAPITAL LETTER YN
10CD;N # Lu GEORGIAN CAPITAL LETTER AEN
-10D0..10FA;N # Lo [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN
+10D0..10FA;N # Ll [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN
10FB;N # Po GEORGIAN PARAGRAPH SEPARATOR
10FC;N # Lm MODIFIER LETTER GEORGIAN NAR
-10FD..10FF;N # Lo [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN
+10FD..10FF;N # Ll [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN
1100..115F;W # Lo [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER
1160..11FF;N # Lo [160] HANGUL JUNGSEONG FILLER..HANGUL JONGSEONG SSANGNIEUN
1200..1248;N # Lo [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA
@@ -737,7 +748,7 @@
1810..1819;N # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE
1820..1842;N # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI
1843;N # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN
-1844..1877;N # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA
+1844..1878;N # Lo [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS
1880..1884;N # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA
1885..1886;N # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA
1887..18A8;N # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA
@@ -841,6 +852,8 @@
1C78..1C7D;N # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD
1C7E..1C7F;N # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD
1C80..1C88;N # Ll [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK
+1C90..1CBA;N # Lu [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN
+1CBD..1CBF;N # Lu [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN
1CC0..1CC7;N # Po [8] SUNDANESE PUNCTUATION BINDU SURYA..SUNDANESE PUNCTUATION BINDU BA SATANGA
1CD0..1CD2;N # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA
1CD3;N # Po VEDIC SIGN NIHSHVASA
@@ -853,6 +866,7 @@
1CF2..1CF3;N # Mc [2] VEDIC SIGN ARDHAVISARGA..VEDIC SIGN ROTATED ARDHAVISARGA
1CF4;N # Mn VEDIC TONE CANDRA ABOVE
1CF5..1CF6;N # Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA
+1CF7;N # Mc VEDIC SIGN ATIKRAMA
1CF8..1CF9;N # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE
1D00..1D2B;N # Ll [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL
1D2C..1D6A;N # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI
@@ -861,7 +875,7 @@
1D79..1D7F;N # Ll [7] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER UPSILON WITH STROKE
1D80..1D9A;N # Ll [27] LATIN SMALL LETTER B WITH PALATAL HOOK..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
1D9B..1DBF;N # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA
-1DC0..1DF5;N # Mn [54] COMBINING DOTTED GRAVE ACCENT..COMBINING UP TACK ABOVE
+1DC0..1DF9;N # Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW
1DFB..1DFF;N # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
1E00..1EFF;N # L& [256] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH LOOP
1F00..1F15;N # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
@@ -954,7 +968,7 @@
20A9;H # Sc WON SIGN
20AA..20AB;N # Sc [2] NEW SHEQEL SIGN..DONG SIGN
20AC;A # Sc EURO SIGN
-20AD..20BE;N # Sc [18] KIP SIGN..LARI SIGN
+20AD..20BF;N # Sc [19] KIP SIGN..BITCOIN SIGN
20D0..20DC;N # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE
20DD..20E0;N # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH
20E1;N # Mn COMBINING LEFT RIGHT ARROW ABOVE
@@ -1120,7 +1134,7 @@
23F0;W # So ALARM CLOCK
23F1..23F2;N # So [2] STOPWATCH..TIMER CLOCK
23F3;W # So HOURGLASS WITH FLOWING SAND
-23F4..23FE;N # So [11] BLACK MEDIUM LEFT-POINTING TRIANGLE..POWER SLEEP SYMBOL
+23F4..23FF;N # So [12] BLACK MEDIUM LEFT-POINTING TRIANGLE..OBSERVER EYE SYMBOL
2400..2426;N # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO
2440..244A;N # So [11] OCR HOOK..OCR DOUBLE BACKSLASH
2460..249B;A # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP
@@ -1326,10 +1340,8 @@
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..2BB9;N # So [34] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..UP ARROWHEAD IN A RECTANGLE BOX
-2BBD..2BC8;N # So [12] BALLOT BOX WITH LIGHT X..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED
-2BCA..2BD1;N # So [8] TOP HALF BLACK CIRCLE..UNCERTAINTY SIGN
-2BEC..2BEF;N # So [4] LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS..DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS
+2B98..2BC8;N # So [49] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED
+2BCA..2BFE;N # So [53] TOP HALF BLACK CIRCLE..REVERSED RIGHT ANGLE
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
@@ -1397,7 +1409,7 @@
2E40;N # Pd DOUBLE HYPHEN
2E41;N # Po REVERSED COMMA
2E42;N # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK
-2E43..2E44;N # Po [2] DASH WITH LEFT UPTURN..DOUBLE SUSPENSION MARK
+2E43..2E4E;N # Po [12] DASH WITH LEFT UPTURN..PUNCTUS ELEVATUS MARK
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
@@ -1453,7 +1465,7 @@
30FB;W # Po KATAKANA MIDDLE DOT
30FC..30FE;W # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK
30FF;W # Lo KATAKANA DIGRAPH KOTO
-3105..312D;W # Lo [41] BOPOMOFO LETTER B..BOPOMOFO LETTER IH
+3105..312F;W # Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN
3131..318E;W # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE
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
@@ -1476,8 +1488,8 @@
3400..4DB5;W # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
4DB6..4DBF;W # Cn [10] <reserved-4DB6>..<reserved-4DBF>
4DC0..4DFF;N # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION
-4E00..9FD5;W # Lo [20950] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FD5
-9FD6..9FFF;W # Cn [42] <reserved-9FD6>..<reserved-9FFF>
+4E00..9FEF;W # Lo [20976] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEF
+9FF0..9FFF;W # Cn [16] <reserved-9FF0>..<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
@@ -1516,8 +1528,7 @@ A788;N # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT
A789..A78A;N # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN
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..A7AE;N # L& [31] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER SMALL CAPITAL I
-A7B0..A7B7;N # L& [8] LATIN CAPITAL LETTER TURNED K..LATIN SMALL LETTER OMEGA
+A790..A7B9;N # L& [42] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER U WITH STROKE
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
@@ -1550,7 +1561,8 @@ A8F2..A8F7;N # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SI
A8F8..A8FA;N # Po [3] DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET
A8FB;N # Lo DEVANAGARI HEADSTROKE
A8FC;N # Po DEVANAGARI SIGN SIDDHAM
-A8FD;N # Lo DEVANAGARI JAIN OM
+A8FD..A8FE;N # Lo [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY
+A8FF;N # Mn DEVANAGARI VOWEL SIGN AY
A900..A909;N # Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE
A90A..A925;N # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO
A926..A92D;N # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU
@@ -1803,6 +1815,7 @@ FFFD;A # So REPLACEMENT CHARACTER
102E1..102FB;N # No [27] COPTIC EPACT DIGIT ONE..COPTIC EPACT NUMBER NINE HUNDRED
10300..1031F;N # Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS
10320..10323;N # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY
+1032D..1032F;N # Lo [3] OLD ITALIC LETTER YE..OLD ITALIC LETTER SOUTHERN TSE
10330..10340;N # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA
10341;N # Nl GOTHIC LETTER NINETY
10342..10349;N # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL
@@ -1861,10 +1874,10 @@ FFFD;A # So REPLACEMENT CHARACTER
10A0C..10A0F;N # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
10A10..10A13;N # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA
10A15..10A17;N # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA
-10A19..10A33;N # Lo [27] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA
+10A19..10A35;N # Lo [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA
10A38..10A3A;N # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW
10A3F;N # Mn KHAROSHTHI VIRAMA
-10A40..10A47;N # No [8] KHAROSHTHI DIGIT ONE..KHAROSHTHI NUMBER ONE THOUSAND
+10A40..10A48;N # No [9] KHAROSHTHI DIGIT ONE..KHAROSHTHI FRACTION ONE HALF
10A50..10A58;N # Po [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES
10A60..10A7C;N # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH
10A7D..10A7E;N # No [2] OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMBER FIFTY
@@ -1890,7 +1903,17 @@ FFFD;A # So REPLACEMENT CHARACTER
10C80..10CB2;N # Lu [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US
10CC0..10CF2;N # Ll [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US
10CFA..10CFF;N # No [6] OLD HUNGARIAN NUMBER ONE..OLD HUNGARIAN NUMBER ONE THOUSAND
+10D00..10D23;N # Lo [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA
+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
+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
+10F30..10F45;N # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN
+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
11000;N # Mc BRAHMI SIGN CANDRABINDU
11001;N # Mn BRAHMI SIGN ANUSVARA
11002;N # Mc BRAHMI SIGN VISARGA
@@ -1910,6 +1933,7 @@ FFFD;A # So REPLACEMENT CHARACTER
110BB..110BC;N # Po [2] KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN
110BD;N # Cf KAITHI NUMBER SIGN
110BE..110C1;N # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA
+110CD;N # Cf KAITHI NUMBER SIGN ABOVE
110D0..110E8;N # Lo [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE
110F0..110F9;N # Nd [10] SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE
11100..11102;N # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA
@@ -1919,6 +1943,8 @@ FFFD;A # So REPLACEMENT CHARACTER
1112D..11134;N # Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA
11136..1113F;N # Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE
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
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
@@ -1930,8 +1956,8 @@ FFFD;A # So REPLACEMENT CHARACTER
111B6..111BE;N # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O
111BF..111C0;N # Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA
111C1..111C4;N # Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM
-111C5..111C9;N # Po [5] SHARADA DANDA..SHARADA SANDHI MARK
-111CA..111CC;N # Mn [3] SHARADA SIGN NUKTA..SHARADA EXTRA SHORT VOWEL MARK
+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
111D0..111D9;N # Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE
111DA;N # Lo SHARADA EKAM
@@ -1968,7 +1994,7 @@ FFFD;A # So REPLACEMENT CHARACTER
1132A..11330;N # Lo [7] GRANTHA LETTER PA..GRANTHA LETTER RA
11332..11333;N # Lo [2] GRANTHA LETTER LA..GRANTHA LETTER LLA
11335..11339;N # Lo [5] GRANTHA LETTER VA..GRANTHA LETTER HA
-1133C;N # Mn GRANTHA SIGN NUKTA
+1133B..1133C;N # Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA
1133D;N # Lo GRANTHA SIGN AVAGRAHA
1133E..1133F;N # Mc [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I
11340;N # Mn GRANTHA VOWEL SIGN II
@@ -1993,6 +2019,7 @@ FFFD;A # So REPLACEMENT CHARACTER
11450..11459;N # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE
1145B;N # Po NEWA PLACEHOLDER MARK
1145D;N # Po NEWA INSERTION SIGN
+1145E;N # Mn NEWA SANDHI MARK
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
@@ -2036,7 +2063,7 @@ FFFD;A # So REPLACEMENT CHARACTER
116B6;N # Mc TAKRI SIGN VIRAMA
116B7;N # Mn TAKRI SIGN NUKTA
116C0..116C9;N # Nd [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE
-11700..11719;N # Lo [26] AHOM LETTER KA..AHOM LETTER JHA
+11700..1171A;N # Lo [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA
1171D..1171F;N # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA
11720..11721;N # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA
11722..11725;N # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU
@@ -2046,10 +2073,37 @@ FFFD;A # So REPLACEMENT CHARACTER
1173A..1173B;N # No [2] AHOM NUMBER TEN..AHOM NUMBER TWENTY
1173C..1173E;N # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI
1173F;N # So AHOM SYMBOL VI
+11800..1182B;N # Lo [44] DOGRA LETTER A..DOGRA LETTER RRA
+1182C..1182E;N # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II
+1182F..11837;N # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA
+11838;N # Mc DOGRA SIGN VISARGA
+11839..1183A;N # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA
+1183B;N # Po DOGRA ABBREVIATION SIGN
118A0..118DF;N # L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO
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
+11A00;N # Lo ZANABAZAR SQUARE LETTER A
+11A01..11A0A;N # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK
+11A0B..11A32;N # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA
+11A33..11A38;N # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA
+11A39;N # Mc ZANABAZAR SQUARE SIGN VISARGA
+11A3A;N # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA
+11A3B..11A3E;N # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA
+11A3F..11A46;N # Po [8] ZANABAZAR SQUARE INITIAL HEAD MARK..ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK
+11A47;N # Mn ZANABAZAR SQUARE SUBJOINER
+11A50;N # Lo SOYOMBO LETTER A
+11A51..11A56;N # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE
+11A57..11A58;N # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU
+11A59..11A5B;N # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK
+11A5C..11A83;N # Lo [40] SOYOMBO LETTER KA..SOYOMBO LETTER KSSA
+11A86..11A89;N # Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO CLUSTER-INITIAL LETTER SA
+11A8A..11A96;N # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA
+11A97;N # Mc SOYOMBO SIGN VISARGA
+11A98..11A99;N # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER
+11A9A..11A9C;N # Po [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD
+11A9D;N # Lo SOYOMBO MARK PLUTA
+11A9E..11AA2;N # Po [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2
11AC0..11AF8;N # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL
11C00..11C08;N # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L
11C0A..11C2E;N # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA
@@ -2071,6 +2125,31 @@ FFFD;A # So REPLACEMENT CHARACTER
11CB2..11CB3;N # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E
11CB4;N # Mc MARCHEN VOWEL SIGN O
11CB5..11CB6;N # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU
+11D00..11D06;N # Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E
+11D08..11D09;N # Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O
+11D0B..11D30;N # Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA
+11D31..11D36;N # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R
+11D3A;N # Mn MASARAM GONDI VOWEL SIGN E
+11D3C..11D3D;N # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O
+11D3F..11D45;N # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA
+11D46;N # Lo MASARAM GONDI REPHA
+11D47;N # Mn MASARAM GONDI RA-KARA
+11D50..11D59;N # Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE
+11D60..11D65;N # Lo [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU
+11D67..11D68;N # Lo [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI
+11D6A..11D89;N # Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA
+11D8A..11D8E;N # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU
+11D90..11D91;N # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI
+11D93..11D94;N # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU
+11D95;N # Mn GUNJALA GONDI SIGN ANUSVARA
+11D96;N # Mc GUNJALA GONDI SIGN VISARGA
+11D97;N # Mn GUNJALA GONDI VIRAMA
+11D98;N # Lo GUNJALA GONDI OM
+11DA0..11DA9;N # Nd [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE
+11EE0..11EF2;N # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA
+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
12000..12399;N # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U
12400..1246E;N # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM
12470..12474;N # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON
@@ -2095,15 +2174,20 @@ FFFD;A # So REPLACEMENT CHARACTER
16B5B..16B61;N # No [7] PAHAWH HMONG NUMBER TENS..PAHAWH HMONG NUMBER TRILLIONS
16B63..16B77;N # Lo [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS
16B7D..16B8F;N # Lo [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ
+16E40..16E7F;N # L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y
+16E80..16E96;N # No [23] MEDEFAIDRIN DIGIT ZERO..MEDEFAIDRIN DIGIT THREE ALTERNATE FORM
+16E97..16E9A;N # Po [4] MEDEFAIDRIN COMMA..MEDEFAIDRIN EXCLAMATION OH
16F00..16F44;N # Lo [69] MIAO LETTER PA..MIAO LETTER HHA
16F50;N # Lo MIAO LETTER NASALIZATION
16F51..16F7E;N # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG
16F8F..16F92;N # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW
16F93..16F9F;N # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8
-16FE0;W # Lm TANGUT ITERATION MARK
-17000..187EC;W # Lo [6125] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC
+16FE0..16FE1;W # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK
+17000..187F1;W # Lo [6130] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F1
18800..18AF2;W # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755
-1B000..1B001;W # Lo [2] KATAKANA LETTER ARCHAIC E..HIRAGANA LETTER ARCHAIC YE
+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
+1B170..1B2FB;W # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
1BC00..1BC6A;N # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M
1BC70..1BC7C;N # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK
1BC80..1BC88;N # Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL
@@ -2129,8 +2213,9 @@ FFFD;A # So REPLACEMENT CHARACTER
1D200..1D241;N # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54
1D242..1D244;N # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME
1D245;N # So GREEK MUSICAL LEIMMA
+1D2E0..1D2F3;N # No [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN
1D300..1D356;N # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING
-1D360..1D371;N # No [18] COUNTING ROD UNIT DIGIT ONE..COUNTING ROD TENS DIGIT NINE
+1D360..1D378;N # No [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE
1D400..1D454;N # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
1D456..1D49C;N # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
1D49E..1D49F;N # Lu [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
@@ -2196,6 +2281,11 @@ FFFD;A # So REPLACEMENT CHARACTER
1E944..1E94A;N # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA
1E950..1E959;N # Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE
1E95E..1E95F;N # Po [2] ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK
+1EC71..1ECAB;N # No [59] INDIC SIYAQ NUMBER ONE..INDIC SIYAQ NUMBER PREFIXED NINE
+1ECAC;N # So INDIC SIYAQ PLACEHOLDER
+1ECAD..1ECAF;N # No [3] INDIC SIYAQ FRACTION ONE QUARTER..INDIC SIYAQ FRACTION THREE QUARTERS
+1ECB0;N # Sc INDIC SIYAQ RUPEE MARK
+1ECB1..1ECB4;N # No [4] INDIC SIYAQ NUMBER ALTERNATE ONE..INDIC SIYAQ ALTERNATE LAKH MARK
1EE00..1EE03;N # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL
1EE05..1EE1F;N # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF
1EE21..1EE22;N # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM
@@ -2242,7 +2332,7 @@ FFFD;A # So REPLACEMENT CHARACTER
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
1F110..1F12D;A # So [30] PARENTHESIZED LATIN CAPITAL LETTER A..CIRCLED CD
-1F12E;N # So CIRCLED WZ
+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..1F16B;N # So [2] RAISED MC SIGN..RAISED MD SIGN
1F170..1F18D;A # So [30] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED SA
@@ -2255,6 +2345,7 @@ FFFD;A # So REPLACEMENT CHARACTER
1F210..1F23B;W # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D
1F240..1F248;W # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557
1F250..1F251;W # So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT
+1F260..1F265;W # So [6] ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI
1F300..1F320;W # So [33] CYCLONE..SHOOTING STAR
1F321..1F32C;N # So [12] THERMOMETER..WIND BLOWING FACE
1F32D..1F335;W # So [9] HOT DOG..CACTUS
@@ -2299,25 +2390,28 @@ FFFD;A # So REPLACEMENT CHARACTER
1F6CC;W # So SLEEPING ACCOMMODATION
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
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..1F6F6;W # So [3] SCOOTER..CANOE
+1F6F4..1F6F9;W # So [6] SCOOTER..SKATEBOARD
1F700..1F773;N # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE
-1F780..1F7D4;N # So [85] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR
+1F780..1F7D8;N # So [89] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NEGATIVE CIRCLED SQUARE
1F800..1F80B;N # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD
1F810..1F847;N # So [56] LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW
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
-1F910..1F91E;W # So [15] ZIPPER-MOUTH FACE..HAND WITH INDEX AND MIDDLE FINGERS CROSSED
-1F920..1F927;W # So [8] FACE WITH COWBOY HAT..SNEEZING FACE
-1F930;W # So PREGNANT WOMAN
-1F933..1F93E;W # So [12] SELFIE..HANDBALL
-1F940..1F94B;W # So [12] WILTED FLOWER..MARTIAL ARTS UNIFORM
-1F950..1F95E;W # So [15] CROISSANT..PANCAKES
-1F980..1F991;W # So [18] CRAB..SQUID
-1F9C0;W # So CHEESE WEDGE
+1F900..1F90B;N # So [12] CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT
+1F910..1F93E;W # So [47] ZIPPER-MOUTH FACE..HANDBALL
+1F940..1F970;W # So [49] WILTED FLOWER..SMILING FACE WITH SMILING EYES AND THREE HEARTS
+1F973..1F976;W # So [4] FACE WITH PARTY HORN AND PARTY HAT..FREEZING FACE
+1F97A;W # So FACE WITH PLEADING EYES
+1F97C..1F9A2;W # So [39] LAB COAT..SWAN
+1F9B0..1F9B9;W # So [10] EMOJI COMPONENT RED HAIR..SUPERVILLAIN
+1F9C0..1F9C2;W # So [3] CHEESE WEDGE..SALT SHAKER
+1F9D0..1F9FF;W # So [48] FACE WITH MONOCLE..NAZAR AMULET
+1FA60..1FA6D;N # So [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER
20000..2A6D6;W # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
2A6D7..2A6FF;W # Cn [41] <reserved-2A6D7>..<reserved-2A6FF>
2A700..2B734;W # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734
@@ -2325,9 +2419,12 @@ FFFD;A # So REPLACEMENT CHARACTER
2B740..2B81D;W # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
2B81E..2B81F;W # Cn [2] <reserved-2B81E>..<reserved-2B81F>
2B820..2CEA1;W # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
-2CEA2..2F7FF;W # Cn [10590] <reserved-2CEA2>..<reserved-2F7FF>
+2CEA2..2CEAF;W # Cn [14] <reserved-2CEA2>..<reserved-2CEAF>
+2CEB0..2EBE0;W # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
+2EBE1..2F7FF;W # Cn [3103] <reserved-2EBE1>..<reserved-2F7FF>
2F800..2FA1D;W # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
-2FA1E..2FFFD;W # Cn [1504] <reserved-2FA1E>..<reserved-2FFFD>
+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>
E0001;N # Cf LANGUAGE TAG
E0020..E007F;N # Cf [96] TAG SPACE..CANCEL TAG
diff --git a/unicode/UnicodeData.txt b/unicode/UnicodeData.txt
index a756976461..ec32fafbce 100644
--- a/unicode/UnicodeData.txt
+++ b/unicode/UnicodeData.txt
@@ -1362,6 +1362,7 @@
055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;;
055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;;
055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;;
+0560;ARMENIAN SMALL LETTER TURNED AYB;Ll;0;L;;;;;N;;;;;
0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531
0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532
0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533
@@ -1401,6 +1402,7 @@
0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555
0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556
0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L;<compat> 0565 0582;;;;N;;;;;
+0588;ARMENIAN SMALL LETTER YI WITH STROKE;Ll;0;L;;;;;N;;;;;
0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;;
058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;;
058D;RIGHT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;;
@@ -1488,6 +1490,7 @@
05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;;
05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;;
05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;;
+05EF;HEBREW YOD TRIANGLE;Lo;0;R;;;;;N;;;;;
05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;;
05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;;
05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;;
@@ -1982,6 +1985,9 @@
07F8;NKO COMMA;Po;0;ON;;;;;N;;;;;
07F9;NKO EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
07FA;NKO LAJANYALAN;Lm;0;R;;;;;N;;;;;
+07FD;NKO DANTAYALAN;Mn;220;NSM;;;;;N;;;;;
+07FE;NKO DOROME SIGN;Sc;0;R;;;;;N;;;;;
+07FF;NKO TAMAN SIGN;Sc;0;R;;;;;N;;;;;
0800;SAMARITAN LETTER ALAF;Lo;0;R;;;;;N;;;;;
0801;SAMARITAN LETTER BIT;Lo;0;R;;;;;N;;;;;
0802;SAMARITAN LETTER GAMAN;Lo;0;R;;;;;N;;;;;
@@ -2072,6 +2078,17 @@
085A;MANDAIC VOCALIZATION MARK;Mn;220;NSM;;;;;N;;;;;
085B;MANDAIC GEMINATION MARK;Mn;220;NSM;;;;;N;;;;;
085E;MANDAIC PUNCTUATION;Po;0;R;;;;;N;;;;;
+0860;SYRIAC LETTER MALAYALAM NGA;Lo;0;AL;;;;;N;;;;;
+0861;SYRIAC LETTER MALAYALAM JA;Lo;0;AL;;;;;N;;;;;
+0862;SYRIAC LETTER MALAYALAM NYA;Lo;0;AL;;;;;N;;;;;
+0863;SYRIAC LETTER MALAYALAM TTA;Lo;0;AL;;;;;N;;;;;
+0864;SYRIAC LETTER MALAYALAM NNA;Lo;0;AL;;;;;N;;;;;
+0865;SYRIAC LETTER MALAYALAM NNNA;Lo;0;AL;;;;;N;;;;;
+0866;SYRIAC LETTER MALAYALAM BHA;Lo;0;AL;;;;;N;;;;;
+0867;SYRIAC LETTER MALAYALAM RA;Lo;0;AL;;;;;N;;;;;
+0868;SYRIAC LETTER MALAYALAM LLA;Lo;0;AL;;;;;N;;;;;
+0869;SYRIAC LETTER MALAYALAM LLLA;Lo;0;AL;;;;;N;;;;;
+086A;SYRIAC LETTER MALAYALAM SSA;Lo;0;AL;;;;;N;;;;;
08A0;ARABIC LETTER BEH WITH SMALL V BELOW;Lo;0;AL;;;;;N;;;;;
08A1;ARABIC LETTER BEH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;;
08A2;ARABIC LETTER JEEM WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
@@ -2101,6 +2118,7 @@
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;;;;;
+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;;;;;
08D6;ARABIC SMALL HIGH AIN;Mn;230;NSM;;;;;N;;;;;
@@ -2366,6 +2384,9 @@
09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;;
09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;;
09FB;BENGALI GANDA MARK;Sc;0;ET;;;;;N;;;;;
+09FC;BENGALI LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;;
+09FD;BENGALI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
+09FE;BENGALI SANDHI MARK;Mn;230;NSM;;;;;N;;;;;
0A01;GURMUKHI SIGN ADAK BINDI;Mn;0;NSM;;;;;N;;;;;
0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;;
0A03;GURMUKHI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
@@ -2445,6 +2466,7 @@
0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;;
0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;;
0A75;GURMUKHI SIGN YAKASH;Mn;0;NSM;;;;;N;;;;;
+0A76;GURMUKHI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
@@ -2530,6 +2552,12 @@
0AF0;GUJARATI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;N;;;;;
0AF9;GUJARATI LETTER ZHA;Lo;0;L;;;;;N;;;;;
+0AFA;GUJARATI SIGN SUKUN;Mn;0;NSM;;;;;N;;;;;
+0AFB;GUJARATI SIGN SHADDA;Mn;0;NSM;;;;;N;;;;;
+0AFC;GUJARATI SIGN MADDAH;Mn;0;NSM;;;;;N;;;;;
+0AFD;GUJARATI SIGN THREE-DOT NUKTA ABOVE;Mn;0;NSM;;;;;N;;;;;
+0AFE;GUJARATI SIGN CIRCLE NUKTA ABOVE;Mn;0;NSM;;;;;N;;;;;
+0AFF;GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE;Mn;0;NSM;;;;;N;;;;;
0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
@@ -2696,6 +2724,7 @@
0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;;
0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0C04;TELUGU SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;;
0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;;
0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;;
0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;;
@@ -2792,6 +2821,7 @@
0C81;KANNADA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0C84;KANNADA SIGN SIDDHAM;Po;0;L;;;;;N;;;;;
0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;;
0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;;
0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;;
@@ -2876,6 +2906,7 @@
0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
0CF1;KANNADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;;
0CF2;KANNADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;;
+0D00;MALAYALAM SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;;
0D01;MALAYALAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;;
@@ -2931,6 +2962,8 @@
0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;;
0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;;
0D3A;MALAYALAM LETTER TTTA;Lo;0;L;;;;;N;;;;;
+0D3B;MALAYALAM SIGN VERTICAL BAR VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0D3C;MALAYALAM SIGN CIRCULAR VIRAMA;Mn;9;NSM;;;;;N;;;;;
0D3D;MALAYALAM SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
@@ -3645,54 +3678,54 @@
10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;;;2D25;
10C7;GEORGIAN CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;2D27;
10CD;GEORGIAN CAPITAL LETTER AEN;Lu;0;L;;;;;N;;;;2D2D;
-10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;;
-10D1;GEORGIAN LETTER BAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;;;
-10D2;GEORGIAN LETTER GAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;;;
-10D3;GEORGIAN LETTER DON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;;;
-10D4;GEORGIAN LETTER EN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;;;
-10D5;GEORGIAN LETTER VIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;;;
-10D6;GEORGIAN LETTER ZEN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;;;
-10D7;GEORGIAN LETTER TAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;;;
-10D8;GEORGIAN LETTER IN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;;;
-10D9;GEORGIAN LETTER KAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;;;
-10DA;GEORGIAN LETTER LAS;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;;;
-10DB;GEORGIAN LETTER MAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;;;
-10DC;GEORGIAN LETTER NAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;;;
-10DD;GEORGIAN LETTER ON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;;;
-10DE;GEORGIAN LETTER PAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;;;
-10DF;GEORGIAN LETTER ZHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;;;
-10E0;GEORGIAN LETTER RAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;;;
-10E1;GEORGIAN LETTER SAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;;;
-10E2;GEORGIAN LETTER TAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;;;
-10E3;GEORGIAN LETTER UN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;;;
-10E4;GEORGIAN LETTER PHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;;;
-10E5;GEORGIAN LETTER KHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;;;
-10E6;GEORGIAN LETTER GHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;;;
-10E7;GEORGIAN LETTER QAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;;;
-10E8;GEORGIAN LETTER SHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;;;
-10E9;GEORGIAN LETTER CHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;;;
-10EA;GEORGIAN LETTER CAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;;;
-10EB;GEORGIAN LETTER JIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;;;
-10EC;GEORGIAN LETTER CIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;;;
-10ED;GEORGIAN LETTER CHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;;;
-10EE;GEORGIAN LETTER XAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;;;
-10EF;GEORGIAN LETTER JHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;;;
-10F0;GEORGIAN LETTER HAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;;;
-10F1;GEORGIAN LETTER HE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;;;
-10F2;GEORGIAN LETTER HIE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;;;
-10F3;GEORGIAN LETTER WE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;;;
-10F4;GEORGIAN LETTER HAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;;;
-10F5;GEORGIAN LETTER HOE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;;;
-10F6;GEORGIAN LETTER FI;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;;;
-10F7;GEORGIAN LETTER YN;Lo;0;L;;;;;N;;;;;
-10F8;GEORGIAN LETTER ELIFI;Lo;0;L;;;;;N;;;;;
-10F9;GEORGIAN LETTER TURNED GAN;Lo;0;L;;;;;N;;;;;
-10FA;GEORGIAN LETTER AIN;Lo;0;L;;;;;N;;;;;
+10D0;GEORGIAN LETTER AN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;1C90;;10D0
+10D1;GEORGIAN LETTER BAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;1C91;;10D1
+10D2;GEORGIAN LETTER GAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;1C92;;10D2
+10D3;GEORGIAN LETTER DON;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;1C93;;10D3
+10D4;GEORGIAN LETTER EN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;1C94;;10D4
+10D5;GEORGIAN LETTER VIN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;1C95;;10D5
+10D6;GEORGIAN LETTER ZEN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;1C96;;10D6
+10D7;GEORGIAN LETTER TAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;1C97;;10D7
+10D8;GEORGIAN LETTER IN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;1C98;;10D8
+10D9;GEORGIAN LETTER KAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;1C99;;10D9
+10DA;GEORGIAN LETTER LAS;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;1C9A;;10DA
+10DB;GEORGIAN LETTER MAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;1C9B;;10DB
+10DC;GEORGIAN LETTER NAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;1C9C;;10DC
+10DD;GEORGIAN LETTER ON;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;1C9D;;10DD
+10DE;GEORGIAN LETTER PAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;1C9E;;10DE
+10DF;GEORGIAN LETTER ZHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;1C9F;;10DF
+10E0;GEORGIAN LETTER RAE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;1CA0;;10E0
+10E1;GEORGIAN LETTER SAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;1CA1;;10E1
+10E2;GEORGIAN LETTER TAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;1CA2;;10E2
+10E3;GEORGIAN LETTER UN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;1CA3;;10E3
+10E4;GEORGIAN LETTER PHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;1CA4;;10E4
+10E5;GEORGIAN LETTER KHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;1CA5;;10E5
+10E6;GEORGIAN LETTER GHAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;1CA6;;10E6
+10E7;GEORGIAN LETTER QAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;1CA7;;10E7
+10E8;GEORGIAN LETTER SHIN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;1CA8;;10E8
+10E9;GEORGIAN LETTER CHIN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;1CA9;;10E9
+10EA;GEORGIAN LETTER CAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;1CAA;;10EA
+10EB;GEORGIAN LETTER JIL;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;1CAB;;10EB
+10EC;GEORGIAN LETTER CIL;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;1CAC;;10EC
+10ED;GEORGIAN LETTER CHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;1CAD;;10ED
+10EE;GEORGIAN LETTER XAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;1CAE;;10EE
+10EF;GEORGIAN LETTER JHAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;1CAF;;10EF
+10F0;GEORGIAN LETTER HAE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;1CB0;;10F0
+10F1;GEORGIAN LETTER HE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;1CB1;;10F1
+10F2;GEORGIAN LETTER HIE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;1CB2;;10F2
+10F3;GEORGIAN LETTER WE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;1CB3;;10F3
+10F4;GEORGIAN LETTER HAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;1CB4;;10F4
+10F5;GEORGIAN LETTER HOE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;1CB5;;10F5
+10F6;GEORGIAN LETTER FI;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;1CB6;;10F6
+10F7;GEORGIAN LETTER YN;Ll;0;L;;;;;N;;;1CB7;;10F7
+10F8;GEORGIAN LETTER ELIFI;Ll;0;L;;;;;N;;;1CB8;;10F8
+10F9;GEORGIAN LETTER TURNED GAN;Ll;0;L;;;;;N;;;1CB9;;10F9
+10FA;GEORGIAN LETTER AIN;Ll;0;L;;;;;N;;;1CBA;;10FA
10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;;
10FC;MODIFIER LETTER GEORGIAN NAR;Lm;0;L;<super> 10DC;;;;N;;;;;
-10FD;GEORGIAN LETTER AEN;Lo;0;L;;;;;N;;;;;
-10FE;GEORGIAN LETTER HARD SIGN;Lo;0;L;;;;;N;;;;;
-10FF;GEORGIAN LETTER LABIAL SIGN;Lo;0;L;;;;;N;;;;;
+10FD;GEORGIAN LETTER AEN;Ll;0;L;;;;;N;;;1CBD;;10FD
+10FE;GEORGIAN LETTER HARD SIGN;Ll;0;L;;;;;N;;;1CBE;;10FE
+10FF;GEORGIAN LETTER LABIAL SIGN;Ll;0;L;;;;;N;;;1CBF;;10FF
1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;;;;
1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;;
1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;;;;
@@ -5491,6 +5524,7 @@
1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;;
1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;;
1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;;
+1878;MONGOLIAN LETTER CHA WITH TWO DOTS;Lo;0;L;;;;;N;;;;;
1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;;
1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;;
1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;;
@@ -6366,6 +6400,52 @@
1C86;CYRILLIC SMALL LETTER TALL HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A
1C87;CYRILLIC SMALL LETTER TALL YAT;Ll;0;L;;;;;N;;;0462;;0462
1C88;CYRILLIC SMALL LETTER UNBLENDED UK;Ll;0;L;;;;;N;;;A64A;;A64A
+1C90;GEORGIAN MTAVRULI CAPITAL LETTER AN;Lu;0;L;;;;;N;;;;10D0;
+1C91;GEORGIAN MTAVRULI CAPITAL LETTER BAN;Lu;0;L;;;;;N;;;;10D1;
+1C92;GEORGIAN MTAVRULI CAPITAL LETTER GAN;Lu;0;L;;;;;N;;;;10D2;
+1C93;GEORGIAN MTAVRULI CAPITAL LETTER DON;Lu;0;L;;;;;N;;;;10D3;
+1C94;GEORGIAN MTAVRULI CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;10D4;
+1C95;GEORGIAN MTAVRULI CAPITAL LETTER VIN;Lu;0;L;;;;;N;;;;10D5;
+1C96;GEORGIAN MTAVRULI CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;;;10D6;
+1C97;GEORGIAN MTAVRULI CAPITAL LETTER TAN;Lu;0;L;;;;;N;;;;10D7;
+1C98;GEORGIAN MTAVRULI CAPITAL LETTER IN;Lu;0;L;;;;;N;;;;10D8;
+1C99;GEORGIAN MTAVRULI CAPITAL LETTER KAN;Lu;0;L;;;;;N;;;;10D9;
+1C9A;GEORGIAN MTAVRULI CAPITAL LETTER LAS;Lu;0;L;;;;;N;;;;10DA;
+1C9B;GEORGIAN MTAVRULI CAPITAL LETTER MAN;Lu;0;L;;;;;N;;;;10DB;
+1C9C;GEORGIAN MTAVRULI CAPITAL LETTER NAR;Lu;0;L;;;;;N;;;;10DC;
+1C9D;GEORGIAN MTAVRULI CAPITAL LETTER ON;Lu;0;L;;;;;N;;;;10DD;
+1C9E;GEORGIAN MTAVRULI CAPITAL LETTER PAR;Lu;0;L;;;;;N;;;;10DE;
+1C9F;GEORGIAN MTAVRULI CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;;;10DF;
+1CA0;GEORGIAN MTAVRULI CAPITAL LETTER RAE;Lu;0;L;;;;;N;;;;10E0;
+1CA1;GEORGIAN MTAVRULI CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;10E1;
+1CA2;GEORGIAN MTAVRULI CAPITAL LETTER TAR;Lu;0;L;;;;;N;;;;10E2;
+1CA3;GEORGIAN MTAVRULI CAPITAL LETTER UN;Lu;0;L;;;;;N;;;;10E3;
+1CA4;GEORGIAN MTAVRULI CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;;;10E4;
+1CA5;GEORGIAN MTAVRULI CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;;;10E5;
+1CA6;GEORGIAN MTAVRULI CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;;;10E6;
+1CA7;GEORGIAN MTAVRULI CAPITAL LETTER QAR;Lu;0;L;;;;;N;;;;10E7;
+1CA8;GEORGIAN MTAVRULI CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;;;10E8;
+1CA9;GEORGIAN MTAVRULI CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;;;10E9;
+1CAA;GEORGIAN MTAVRULI CAPITAL LETTER CAN;Lu;0;L;;;;;N;;;;10EA;
+1CAB;GEORGIAN MTAVRULI CAPITAL LETTER JIL;Lu;0;L;;;;;N;;;;10EB;
+1CAC;GEORGIAN MTAVRULI CAPITAL LETTER CIL;Lu;0;L;;;;;N;;;;10EC;
+1CAD;GEORGIAN MTAVRULI CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;;;10ED;
+1CAE;GEORGIAN MTAVRULI CAPITAL LETTER XAN;Lu;0;L;;;;;N;;;;10EE;
+1CAF;GEORGIAN MTAVRULI CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;;;10EF;
+1CB0;GEORGIAN MTAVRULI CAPITAL LETTER HAE;Lu;0;L;;;;;N;;;;10F0;
+1CB1;GEORGIAN MTAVRULI CAPITAL LETTER HE;Lu;0;L;;;;;N;;;;10F1;
+1CB2;GEORGIAN MTAVRULI CAPITAL LETTER HIE;Lu;0;L;;;;;N;;;;10F2;
+1CB3;GEORGIAN MTAVRULI CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;10F3;
+1CB4;GEORGIAN MTAVRULI CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;10F4;
+1CB5;GEORGIAN MTAVRULI CAPITAL LETTER HOE;Lu;0;L;;;;;N;;;;10F5;
+1CB6;GEORGIAN MTAVRULI CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;10F6;
+1CB7;GEORGIAN MTAVRULI CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;10F7;
+1CB8;GEORGIAN MTAVRULI CAPITAL LETTER ELIFI;Lu;0;L;;;;;N;;;;10F8;
+1CB9;GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN;Lu;0;L;;;;;N;;;;10F9;
+1CBA;GEORGIAN MTAVRULI CAPITAL LETTER AIN;Lu;0;L;;;;;N;;;;10FA;
+1CBD;GEORGIAN MTAVRULI CAPITAL LETTER AEN;Lu;0;L;;;;;N;;;;10FD;
+1CBE;GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;10FE;
+1CBF;GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN;Lu;0;L;;;;;N;;;;10FF;
1CC0;SUNDANESE PUNCTUATION BINDU SURYA;Po;0;L;;;;;N;;;;;
1CC1;SUNDANESE PUNCTUATION BINDU PANGLONG;Po;0;L;;;;;N;;;;;
1CC2;SUNDANESE PUNCTUATION BINDU PURNAMA;Po;0;L;;;;;N;;;;;
@@ -6413,6 +6493,7 @@
1CF4;VEDIC TONE CANDRA ABOVE;Mn;230;NSM;;;;;N;;;;;
1CF5;VEDIC SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;;
1CF6;VEDIC SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;;
+1CF7;VEDIC SIGN ATIKRAMA;Mc;0;L;;;;;N;;;;;
1CF8;VEDIC TONE RING ABOVE;Mn;230;NSM;;;;;N;;;;;
1CF9;VEDIC TONE DOUBLE RING ABOVE;Mn;230;NSM;;;;;N;;;;;
1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;;
@@ -6661,6 +6742,10 @@
1DF3;COMBINING LATIN SMALL LETTER O WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;;
1DF4;COMBINING LATIN SMALL LETTER U WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;;
1DF5;COMBINING UP TACK ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DF6;COMBINING KAVYKA ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;;
+1DF7;COMBINING KAVYKA ABOVE LEFT;Mn;228;NSM;;;;;N;;;;;
+1DF8;COMBINING DOT ABOVE LEFT;Mn;228;NSM;;;;;N;;;;;
+1DF9;COMBINING WIDE INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;;;;;
1DFB;COMBINING DELETION MARK;Mn;230;NSM;;;;;N;;;;;
1DFC;COMBINING DOUBLE INVERTED BREVE BELOW;Mn;233;NSM;;;;;N;;;;;
1DFD;COMBINING ALMOST EQUAL TO BELOW;Mn;220;NSM;;;;;N;;;;;
@@ -7339,6 +7424,7 @@
20BC;MANAT SIGN;Sc;0;ET;;;;;N;;;;;
20BD;RUBLE SIGN;Sc;0;ET;;;;;N;;;;;
20BE;LARI SIGN;Sc;0;ET;;;;;N;;;;;
+20BF;BITCOIN SIGN;Sc;0;ET;;;;;N;;;;;
20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;;
20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;;
20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;;
@@ -8135,6 +8221,7 @@
23FC;POWER ON-OFF SYMBOL;So;0;ON;;;;;N;;;;;
23FD;POWER ON SYMBOL;So;0;ON;;;;;N;;;;;
23FE;POWER SLEEP SYMBOL;So;0;ON;;;;;N;;;;;
+23FF;OBSERVER EYE SYMBOL;So;0;ON;;;;;N;;;;;
2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;;
2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;;
2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;;
@@ -9530,7 +9617,7 @@
299E;ANGLE WITH S INSIDE;Sm;0;ON;;;;;Y;;;;;
299F;ACUTE ANGLE;Sm;0;ON;;;;;Y;;;;;
29A0;SPHERICAL ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;;
-29A1;SPHERICAL ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;;
+29A1;SPHERICAL ANGLE OPENING UP;Sm;0;ON;;;;;N;;;;;
29A2;TURNED ANGLE;Sm;0;ON;;;;;Y;;;;;
29A3;REVERSED ANGLE;Sm;0;ON;;;;;Y;;;;;
29A4;ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
@@ -10063,6 +10150,9 @@
2BB7;RIBBON ARROW RIGHT DOWN;So;0;ON;;;;;N;;;;;
2BB8;UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;;
2BB9;UP ARROWHEAD IN A RECTANGLE BOX;So;0;ON;;;;;N;;;;;
+2BBA;OVERLAPPING WHITE SQUARES;So;0;ON;;;;;N;;;;;
+2BBB;OVERLAPPING WHITE AND BLACK SQUARES;So;0;ON;;;;;N;;;;;
+2BBC;OVERLAPPING BLACK SQUARES;So;0;ON;;;;;N;;;;;
2BBD;BALLOT BOX WITH LIGHT X;So;0;ON;;;;;N;;;;;
2BBE;CIRCLED X;So;0;ON;;;;;N;;;;;
2BBF;CIRCLED BOLD X;So;0;ON;;;;;N;;;;;
@@ -10083,10 +10173,51 @@
2BCF;ROTATED WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;;
2BD0;SQUARE POSITION INDICATOR;So;0;ON;;;;;N;;;;;
2BD1;UNCERTAINTY SIGN;So;0;ON;;;;;N;;;;;
+2BD2;GROUP MARK;So;0;ON;;;;;N;;;;;
+2BD3;PLUTO FORM TWO;So;0;ON;;;;;N;;;;;
+2BD4;PLUTO FORM THREE;So;0;ON;;;;;N;;;;;
+2BD5;PLUTO FORM FOUR;So;0;ON;;;;;N;;;;;
+2BD6;PLUTO FORM FIVE;So;0;ON;;;;;N;;;;;
+2BD7;TRANSPLUTO;So;0;ON;;;;;N;;;;;
+2BD8;PROSERPINA;So;0;ON;;;;;N;;;;;
+2BD9;ASTRAEA;So;0;ON;;;;;N;;;;;
+2BDA;HYGIEA;So;0;ON;;;;;N;;;;;
+2BDB;PHOLUS;So;0;ON;;;;;N;;;;;
+2BDC;NESSUS;So;0;ON;;;;;N;;;;;
+2BDD;WHITE MOON SELENA;So;0;ON;;;;;N;;;;;
+2BDE;BLACK DIAMOND ON CROSS;So;0;ON;;;;;N;;;;;
+2BDF;TRUE LIGHT MOON ARTA;So;0;ON;;;;;N;;;;;
+2BE0;CUPIDO;So;0;ON;;;;;N;;;;;
+2BE1;HADES;So;0;ON;;;;;N;;;;;
+2BE2;ZEUS;So;0;ON;;;;;N;;;;;
+2BE3;KRONOS;So;0;ON;;;;;N;;;;;
+2BE4;APOLLON;So;0;ON;;;;;N;;;;;
+2BE5;ADMETOS;So;0;ON;;;;;N;;;;;
+2BE6;VULCANUS;So;0;ON;;;;;N;;;;;
+2BE7;POSEIDON;So;0;ON;;;;;N;;;;;
+2BE8;LEFT HALF BLACK STAR;So;0;ON;;;;;N;;;;;
+2BE9;RIGHT HALF BLACK STAR;So;0;ON;;;;;N;;;;;
+2BEA;STAR WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+2BEB;STAR WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
2BEC;LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;;
2BED;UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;;
2BEE;RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;;
2BEF;DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;;
+2BF0;ERIS FORM ONE;So;0;ON;;;;;N;;;;;
+2BF1;ERIS FORM TWO;So;0;ON;;;;;N;;;;;
+2BF2;SEDNA;So;0;ON;;;;;N;;;;;
+2BF3;RUSSIAN ASTROLOGICAL SYMBOL VIGINTILE;So;0;ON;;;;;N;;;;;
+2BF4;RUSSIAN ASTROLOGICAL SYMBOL NOVILE;So;0;ON;;;;;N;;;;;
+2BF5;RUSSIAN ASTROLOGICAL SYMBOL QUINTILE;So;0;ON;;;;;N;;;;;
+2BF6;RUSSIAN ASTROLOGICAL SYMBOL BINOVILE;So;0;ON;;;;;N;;;;;
+2BF7;RUSSIAN ASTROLOGICAL SYMBOL SENTAGON;So;0;ON;;;;;N;;;;;
+2BF8;RUSSIAN ASTROLOGICAL SYMBOL TREDECILE;So;0;ON;;;;;N;;;;;
+2BF9;EQUALS SIGN WITH INFINITY BELOW;So;0;ON;;;;;N;;;;;
+2BFA;UNITED SYMBOL;So;0;ON;;;;;N;;;;;
+2BFB;SEPARATED SYMBOL;So;0;ON;;;;;N;;;;;
+2BFC;DOUBLED SYMBOL;So;0;ON;;;;;N;;;;;
+2BFD;PASSED SYMBOL;So;0;ON;;;;;N;;;;;
+2BFE;REVERSED RIGHT ANGLE;So;0;ON;;;;;Y;;;;;
2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30;
2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31;
2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32;
@@ -10615,6 +10746,16 @@
2E42;DOUBLE LOW-REVERSED-9 QUOTATION MARK;Ps;0;ON;;;;;N;;;;;
2E43;DASH WITH LEFT UPTURN;Po;0;ON;;;;;N;;;;;
2E44;DOUBLE SUSPENSION MARK;Po;0;ON;;;;;N;;;;;
+2E45;INVERTED LOW KAVYKA;Po;0;ON;;;;;N;;;;;
+2E46;INVERTED LOW KAVYKA WITH KAVYKA ABOVE;Po;0;ON;;;;;N;;;;;
+2E47;LOW KAVYKA;Po;0;ON;;;;;N;;;;;
+2E48;LOW KAVYKA WITH DOT;Po;0;ON;;;;;N;;;;;
+2E49;DOUBLE STACKED COMMA;Po;0;ON;;;;;N;;;;;
+2E4A;DOTTED SOLIDUS;Po;0;ON;;;;;N;;;;;
+2E4B;TRIPLE DAGGER;Po;0;ON;;;;;N;;;;;
+2E4C;MEDIEVAL COMMA;Po;0;ON;;;;;N;;;;;
+2E4D;PARAGRAPHUS MARK;Po;0;ON;;;;;N;;;;;
+2E4E;PUNCTUS ELEVATUS MARK;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;;;;;
@@ -11250,6 +11391,8 @@
312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;;
312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;;
312D;BOPOMOFO LETTER IH;Lo;0;L;;;;;N;;;;;
+312E;BOPOMOFO LETTER O WITH DOT ABOVE;Lo;0;L;;;;;N;;;;;
+312F;BOPOMOFO LETTER NN;Lo;0;L;;;;;N;;;;;
3131;HANGUL LETTER KIYEOK;Lo;0;L;<compat> 1100;;;;N;HANGUL LETTER GIYEOG;;;;
3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L;<compat> 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;;
3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<compat> 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;;
@@ -12016,7 +12159,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;;;;;
-9FD5;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;;
+9FEF;<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;;;;;
@@ -13944,6 +14087,7 @@ A7AB;LATIN CAPITAL LETTER REVERSED OPEN E;Lu;0;L;;;;;N;;;;025C;
A7AC;LATIN CAPITAL LETTER SCRIPT G;Lu;0;L;;;;;N;;;;0261;
A7AD;LATIN CAPITAL LETTER L WITH BELT;Lu;0;L;;;;;N;;;;026C;
A7AE;LATIN CAPITAL LETTER SMALL CAPITAL I;Lu;0;L;;;;;N;;;;026A;
+A7AF;LATIN LETTER SMALL CAPITAL Q;Ll;0;L;;;;;N;;;;;
A7B0;LATIN CAPITAL LETTER TURNED K;Lu;0;L;;;;;N;;;;029E;
A7B1;LATIN CAPITAL LETTER TURNED T;Lu;0;L;;;;;N;;;;0287;
A7B2;LATIN CAPITAL LETTER J WITH CROSSED-TAIL;Lu;0;L;;;;;N;;;;029D;
@@ -13952,6 +14096,8 @@ A7B4;LATIN CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;A7B5;
A7B5;LATIN SMALL LETTER BETA;Ll;0;L;;;;;N;;;A7B4;;A7B4
A7B6;LATIN CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;A7B7;
A7B7;LATIN SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;A7B6;;A7B6
+A7B8;LATIN CAPITAL LETTER U WITH STROKE;Lu;0;L;;;;;N;;;;A7B9;
+A7B9;LATIN SMALL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;A7B8;;A7B8
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 +14329,8 @@ A8FA;DEVANAGARI CARET;Po;0;L;;;;;N;;;;;
A8FB;DEVANAGARI HEADSTROKE;Lo;0;L;;;;;N;;;;;
A8FC;DEVANAGARI SIGN SIDDHAM;Po;0;L;;;;;N;;;;;
A8FD;DEVANAGARI JAIN OM;Lo;0;L;;;;;N;;;;;
+A8FE;DEVANAGARI LETTER AY;Lo;0;L;;;;;N;;;;;
+A8FF;DEVANAGARI VOWEL SIGN AY;Mn;0;NSM;;;;;N;;;;;
A900;KAYAH LI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
A901;KAYAH LI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
A902;KAYAH LI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
@@ -17093,6 +17241,9 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
10321;OLD ITALIC NUMERAL FIVE;No;0;L;;;;5;N;;;;;
10322;OLD ITALIC NUMERAL TEN;No;0;L;;;;10;N;;;;;
10323;OLD ITALIC NUMERAL FIFTY;No;0;L;;;;50;N;;;;;
+1032D;OLD ITALIC LETTER YE;Lo;0;L;;;;;N;;;;;
+1032E;OLD ITALIC LETTER NORTHERN TSE;Lo;0;L;;;;;N;;;;;
+1032F;OLD ITALIC LETTER SOUTHERN TSE;Lo;0;L;;;;;N;;;;;
10330;GOTHIC LETTER AHSA;Lo;0;L;;;;;N;;;;;
10331;GOTHIC LETTER BAIRKAN;Lo;0;L;;;;;N;;;;;
10332;GOTHIC LETTER GIBA;Lo;0;L;;;;;N;;;;;
@@ -18324,6 +18475,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
10A31;KHAROSHTHI LETTER HA;Lo;0;R;;;;;N;;;;;
10A32;KHAROSHTHI LETTER KKA;Lo;0;R;;;;;N;;;;;
10A33;KHAROSHTHI LETTER TTTHA;Lo;0;R;;;;;N;;;;;
+10A34;KHAROSHTHI LETTER TTTA;Lo;0;R;;;;;N;;;;;
+10A35;KHAROSHTHI LETTER VHA;Lo;0;R;;;;;N;;;;;
10A38;KHAROSHTHI SIGN BAR ABOVE;Mn;230;NSM;;;;;N;;;;;
10A39;KHAROSHTHI SIGN CAUDA;Mn;1;NSM;;;;;N;;;;;
10A3A;KHAROSHTHI SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;;
@@ -18336,6 +18489,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
10A45;KHAROSHTHI NUMBER TWENTY;No;0;R;;;;20;N;;;;;
10A46;KHAROSHTHI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
10A47;KHAROSHTHI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;;
+10A48;KHAROSHTHI FRACTION ONE HALF;No;0;R;;;;1/2;N;;;;;
10A50;KHAROSHTHI PUNCTUATION DOT;Po;0;R;;;;;N;;;;;
10A51;KHAROSHTHI PUNCTUATION SMALL CIRCLE;Po;0;R;;;;;N;;;;;
10A52;KHAROSHTHI PUNCTUATION CIRCLE;Po;0;R;;;;;N;;;;;
@@ -18788,6 +18942,56 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
10CFD;OLD HUNGARIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;;
10CFE;OLD HUNGARIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
10CFF;OLD HUNGARIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;;
+10D00;HANIFI ROHINGYA LETTER A;Lo;0;AL;;;;;N;;;;;
+10D01;HANIFI ROHINGYA LETTER BA;Lo;0;AL;;;;;N;;;;;
+10D02;HANIFI ROHINGYA LETTER PA;Lo;0;AL;;;;;N;;;;;
+10D03;HANIFI ROHINGYA LETTER TA;Lo;0;AL;;;;;N;;;;;
+10D04;HANIFI ROHINGYA LETTER TTA;Lo;0;AL;;;;;N;;;;;
+10D05;HANIFI ROHINGYA LETTER JA;Lo;0;AL;;;;;N;;;;;
+10D06;HANIFI ROHINGYA LETTER CA;Lo;0;AL;;;;;N;;;;;
+10D07;HANIFI ROHINGYA LETTER HA;Lo;0;AL;;;;;N;;;;;
+10D08;HANIFI ROHINGYA LETTER KHA;Lo;0;AL;;;;;N;;;;;
+10D09;HANIFI ROHINGYA LETTER FA;Lo;0;AL;;;;;N;;;;;
+10D0A;HANIFI ROHINGYA LETTER DA;Lo;0;AL;;;;;N;;;;;
+10D0B;HANIFI ROHINGYA LETTER DDA;Lo;0;AL;;;;;N;;;;;
+10D0C;HANIFI ROHINGYA LETTER RA;Lo;0;AL;;;;;N;;;;;
+10D0D;HANIFI ROHINGYA LETTER RRA;Lo;0;AL;;;;;N;;;;;
+10D0E;HANIFI ROHINGYA LETTER ZA;Lo;0;AL;;;;;N;;;;;
+10D0F;HANIFI ROHINGYA LETTER SA;Lo;0;AL;;;;;N;;;;;
+10D10;HANIFI ROHINGYA LETTER SHA;Lo;0;AL;;;;;N;;;;;
+10D11;HANIFI ROHINGYA LETTER KA;Lo;0;AL;;;;;N;;;;;
+10D12;HANIFI ROHINGYA LETTER GA;Lo;0;AL;;;;;N;;;;;
+10D13;HANIFI ROHINGYA LETTER LA;Lo;0;AL;;;;;N;;;;;
+10D14;HANIFI ROHINGYA LETTER MA;Lo;0;AL;;;;;N;;;;;
+10D15;HANIFI ROHINGYA LETTER NA;Lo;0;AL;;;;;N;;;;;
+10D16;HANIFI ROHINGYA LETTER WA;Lo;0;AL;;;;;N;;;;;
+10D17;HANIFI ROHINGYA LETTER KINNA WA;Lo;0;AL;;;;;N;;;;;
+10D18;HANIFI ROHINGYA LETTER YA;Lo;0;AL;;;;;N;;;;;
+10D19;HANIFI ROHINGYA LETTER KINNA YA;Lo;0;AL;;;;;N;;;;;
+10D1A;HANIFI ROHINGYA LETTER NGA;Lo;0;AL;;;;;N;;;;;
+10D1B;HANIFI ROHINGYA LETTER NYA;Lo;0;AL;;;;;N;;;;;
+10D1C;HANIFI ROHINGYA LETTER VA;Lo;0;AL;;;;;N;;;;;
+10D1D;HANIFI ROHINGYA VOWEL A;Lo;0;AL;;;;;N;;;;;
+10D1E;HANIFI ROHINGYA VOWEL I;Lo;0;AL;;;;;N;;;;;
+10D1F;HANIFI ROHINGYA VOWEL U;Lo;0;AL;;;;;N;;;;;
+10D20;HANIFI ROHINGYA VOWEL E;Lo;0;AL;;;;;N;;;;;
+10D21;HANIFI ROHINGYA VOWEL O;Lo;0;AL;;;;;N;;;;;
+10D22;HANIFI ROHINGYA MARK SAKIN;Lo;0;AL;;;;;N;;;;;
+10D23;HANIFI ROHINGYA MARK NA KHONNA;Lo;0;AL;;;;;N;;;;;
+10D24;HANIFI ROHINGYA SIGN HARBAHAY;Mn;230;NSM;;;;;N;;;;;
+10D25;HANIFI ROHINGYA SIGN TAHALA;Mn;230;NSM;;;;;N;;;;;
+10D26;HANIFI ROHINGYA SIGN TANA;Mn;230;NSM;;;;;N;;;;;
+10D27;HANIFI ROHINGYA SIGN TASSI;Mn;230;NSM;;;;;N;;;;;
+10D30;HANIFI ROHINGYA DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;;
+10D31;HANIFI ROHINGYA DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;;
+10D32;HANIFI ROHINGYA DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;;
+10D33;HANIFI ROHINGYA DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;;
+10D34;HANIFI ROHINGYA DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;;
+10D35;HANIFI ROHINGYA DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;;
+10D36;HANIFI ROHINGYA DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;;
+10D37;HANIFI ROHINGYA DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;;
+10D38;HANIFI ROHINGYA DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;;
+10D39;HANIFI ROHINGYA DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;;
10E60;RUMI DIGIT ONE;No;0;AN;;;1;1;N;;;;;
10E61;RUMI DIGIT TWO;No;0;AN;;;2;2;N;;;;;
10E62;RUMI DIGIT THREE;No;0;AN;;;3;3;N;;;;;
@@ -18819,6 +19023,88 @@ 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;;;;;
+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;;;;;
+10F03;OLD SOGDIAN LETTER FINAL BETH;Lo;0;R;;;;;N;;;;;
+10F04;OLD SOGDIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;;
+10F05;OLD SOGDIAN LETTER HE;Lo;0;R;;;;;N;;;;;
+10F06;OLD SOGDIAN LETTER FINAL HE;Lo;0;R;;;;;N;;;;;
+10F07;OLD SOGDIAN LETTER WAW;Lo;0;R;;;;;N;;;;;
+10F08;OLD SOGDIAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;;
+10F09;OLD SOGDIAN LETTER HETH;Lo;0;R;;;;;N;;;;;
+10F0A;OLD SOGDIAN LETTER YODH;Lo;0;R;;;;;N;;;;;
+10F0B;OLD SOGDIAN LETTER KAPH;Lo;0;R;;;;;N;;;;;
+10F0C;OLD SOGDIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;;
+10F0D;OLD SOGDIAN LETTER MEM;Lo;0;R;;;;;N;;;;;
+10F0E;OLD SOGDIAN LETTER NUN;Lo;0;R;;;;;N;;;;;
+10F0F;OLD SOGDIAN LETTER FINAL NUN;Lo;0;R;;;;;N;;;;;
+10F10;OLD SOGDIAN LETTER FINAL NUN WITH VERTICAL TAIL;Lo;0;R;;;;;N;;;;;
+10F11;OLD SOGDIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;;
+10F12;OLD SOGDIAN LETTER AYIN;Lo;0;R;;;;;N;;;;;
+10F13;OLD SOGDIAN LETTER ALTERNATE AYIN;Lo;0;R;;;;;N;;;;;
+10F14;OLD SOGDIAN LETTER PE;Lo;0;R;;;;;N;;;;;
+10F15;OLD SOGDIAN LETTER SADHE;Lo;0;R;;;;;N;;;;;
+10F16;OLD SOGDIAN LETTER FINAL SADHE;Lo;0;R;;;;;N;;;;;
+10F17;OLD SOGDIAN LETTER FINAL SADHE WITH VERTICAL TAIL;Lo;0;R;;;;;N;;;;;
+10F18;OLD SOGDIAN LETTER RESH-AYIN-DALETH;Lo;0;R;;;;;N;;;;;
+10F19;OLD SOGDIAN LETTER SHIN;Lo;0;R;;;;;N;;;;;
+10F1A;OLD SOGDIAN LETTER TAW;Lo;0;R;;;;;N;;;;;
+10F1B;OLD SOGDIAN LETTER FINAL TAW;Lo;0;R;;;;;N;;;;;
+10F1C;OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL;Lo;0;R;;;;;N;;;;;
+10F1D;OLD SOGDIAN NUMBER ONE;No;0;R;;;;1;N;;;;;
+10F1E;OLD SOGDIAN NUMBER TWO;No;0;R;;;;2;N;;;;;
+10F1F;OLD SOGDIAN NUMBER THREE;No;0;R;;;;3;N;;;;;
+10F20;OLD SOGDIAN NUMBER FOUR;No;0;R;;;;4;N;;;;;
+10F21;OLD SOGDIAN NUMBER FIVE;No;0;R;;;;5;N;;;;;
+10F22;OLD SOGDIAN NUMBER TEN;No;0;R;;;;10;N;;;;;
+10F23;OLD SOGDIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10F24;OLD SOGDIAN NUMBER THIRTY;No;0;R;;;;30;N;;;;;
+10F25;OLD SOGDIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+10F26;OLD SOGDIAN FRACTION ONE HALF;No;0;R;;;;1/2;N;;;;;
+10F27;OLD SOGDIAN LIGATURE AYIN-DALETH;Lo;0;R;;;;;N;;;;;
+10F30;SOGDIAN LETTER ALEPH;Lo;0;AL;;;;;N;;;;;
+10F31;SOGDIAN LETTER BETH;Lo;0;AL;;;;;N;;;;;
+10F32;SOGDIAN LETTER GIMEL;Lo;0;AL;;;;;N;;;;;
+10F33;SOGDIAN LETTER HE;Lo;0;AL;;;;;N;;;;;
+10F34;SOGDIAN LETTER WAW;Lo;0;AL;;;;;N;;;;;
+10F35;SOGDIAN LETTER ZAYIN;Lo;0;AL;;;;;N;;;;;
+10F36;SOGDIAN LETTER HETH;Lo;0;AL;;;;;N;;;;;
+10F37;SOGDIAN LETTER YODH;Lo;0;AL;;;;;N;;;;;
+10F38;SOGDIAN LETTER KAPH;Lo;0;AL;;;;;N;;;;;
+10F39;SOGDIAN LETTER LAMEDH;Lo;0;AL;;;;;N;;;;;
+10F3A;SOGDIAN LETTER MEM;Lo;0;AL;;;;;N;;;;;
+10F3B;SOGDIAN LETTER NUN;Lo;0;AL;;;;;N;;;;;
+10F3C;SOGDIAN LETTER SAMEKH;Lo;0;AL;;;;;N;;;;;
+10F3D;SOGDIAN LETTER AYIN;Lo;0;AL;;;;;N;;;;;
+10F3E;SOGDIAN LETTER PE;Lo;0;AL;;;;;N;;;;;
+10F3F;SOGDIAN LETTER SADHE;Lo;0;AL;;;;;N;;;;;
+10F40;SOGDIAN LETTER RESH-AYIN;Lo;0;AL;;;;;N;;;;;
+10F41;SOGDIAN LETTER SHIN;Lo;0;AL;;;;;N;;;;;
+10F42;SOGDIAN LETTER TAW;Lo;0;AL;;;;;N;;;;;
+10F43;SOGDIAN LETTER FETH;Lo;0;AL;;;;;N;;;;;
+10F44;SOGDIAN LETTER LESH;Lo;0;AL;;;;;N;;;;;
+10F45;SOGDIAN INDEPENDENT SHIN;Lo;0;AL;;;;;N;;;;;
+10F46;SOGDIAN COMBINING DOT BELOW;Mn;220;NSM;;;;;N;;;;;
+10F47;SOGDIAN COMBINING TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;;
+10F48;SOGDIAN COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;;;;;
+10F49;SOGDIAN COMBINING TWO DOTS ABOVE;Mn;230;NSM;;;;;N;;;;;
+10F4A;SOGDIAN COMBINING CURVE ABOVE;Mn;230;NSM;;;;;N;;;;;
+10F4B;SOGDIAN COMBINING CURVE BELOW;Mn;220;NSM;;;;;N;;;;;
+10F4C;SOGDIAN COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;;;;;
+10F4D;SOGDIAN COMBINING HOOK BELOW;Mn;220;NSM;;;;;N;;;;;
+10F4E;SOGDIAN COMBINING LONG HOOK BELOW;Mn;220;NSM;;;;;N;;;;;
+10F4F;SOGDIAN COMBINING RESH BELOW;Mn;220;NSM;;;;;N;;;;;
+10F50;SOGDIAN COMBINING STROKE BELOW;Mn;220;NSM;;;;;N;;;;;
+10F51;SOGDIAN NUMBER ONE;No;0;AL;;;;1;N;;;;;
+10F52;SOGDIAN NUMBER TEN;No;0;AL;;;;10;N;;;;;
+10F53;SOGDIAN NUMBER TWENTY;No;0;AL;;;;20;N;;;;;
+10F54;SOGDIAN NUMBER ONE HUNDRED;No;0;AL;;;;100;N;;;;;
+10F55;SOGDIAN PUNCTUATION TWO VERTICAL BARS;Po;0;AL;;;;;N;;;;;
+10F56;SOGDIAN PUNCTUATION TWO VERTICAL BARS WITH DOTS;Po;0;AL;;;;;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;;;;;
11000;BRAHMI SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;;
11001;BRAHMI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
11002;BRAHMI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
@@ -18994,6 +19280,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
110BF;KAITHI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;;
110C0;KAITHI DANDA;Po;0;L;;;;;N;;;;;
110C1;KAITHI DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+110CD;KAITHI NUMBER SIGN ABOVE;Cf;0;L;;;;;N;;;;;
110D0;SORA SOMPENG LETTER SAH;Lo;0;L;;;;;N;;;;;
110D1;SORA SOMPENG LETTER TAH;Lo;0;L;;;;;N;;;;;
110D2;SORA SOMPENG LETTER BAH;Lo;0;L;;;;;N;;;;;
@@ -19096,6 +19383,9 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
11141;CHAKMA DANDA;Po;0;L;;;;;N;;;;;
11142;CHAKMA DOUBLE DANDA;Po;0;L;;;;;N;;;;;
11143;CHAKMA QUESTION MARK;Po;0;L;;;;;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;;;;;
11150;MAHAJANI LETTER A;Lo;0;L;;;;;N;;;;;
11151;MAHAJANI LETTER I;Lo;0;L;;;;;N;;;;;
11152;MAHAJANI LETTER U;Lo;0;L;;;;;N;;;;;
@@ -19208,7 +19498,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
111C6;SHARADA DOUBLE DANDA;Po;0;L;;;;;N;;;;;
111C7;SHARADA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
111C8;SHARADA SEPARATOR;Po;0;L;;;;;N;;;;;
-111C9;SHARADA SANDHI MARK;Po;0;L;;;;;N;;;;;
+111C9;SHARADA SANDHI MARK;Mn;0;NSM;;;;;N;;;;;
111CA;SHARADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
111CB;SHARADA VOWEL MODIFIER MARK;Mn;0;NSM;;;;;N;;;;;
111CC;SHARADA EXTRA SHORT VOWEL MARK;Mn;0;NSM;;;;;N;;;;;
@@ -19468,6 +19758,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
11337;GRANTHA LETTER SSA;Lo;0;L;;;;;N;;;;;
11338;GRANTHA LETTER SA;Lo;0;L;;;;;N;;;;;
11339;GRANTHA LETTER HA;Lo;0;L;;;;;N;;;;;
+1133B;COMBINING BINDU BELOW;Mn;7;NSM;;;;;N;;;;;
1133C;GRANTHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
1133D;GRANTHA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
1133E;GRANTHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
@@ -19595,6 +19886,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
11459;NEWA DIGIT NINE;Nd;0;L;;9;9;9;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;;;;;
11480;TIRHUTA ANJI;Lo;0;L;;;;;N;;;;;
11481;TIRHUTA LETTER A;Lo;0;L;;;;;N;;;;;
11482;TIRHUTA LETTER AA;Lo;0;L;;;;;N;;;;;
@@ -19953,6 +20245,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
11717;AHOM LETTER GHA;Lo;0;L;;;;;N;;;;;
11718;AHOM LETTER BHA;Lo;0;L;;;;;N;;;;;
11719;AHOM LETTER JHA;Lo;0;L;;;;;N;;;;;
+1171A;AHOM LETTER ALTERNATE BA;Lo;0;L;;;;;N;;;;;
1171D;AHOM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;;
1171E;AHOM CONSONANT SIGN MEDIAL RA;Mn;0;NSM;;;;;N;;;;;
1171F;AHOM CONSONANT SIGN MEDIAL LIGATING RA;Mn;0;NSM;;;;;N;;;;;
@@ -19984,6 +20277,66 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1173D;AHOM SIGN SECTION;Po;0;L;;;;;N;;;;;
1173E;AHOM SIGN RULAI;Po;0;L;;;;;N;;;;;
1173F;AHOM SYMBOL VI;So;0;L;;;;;N;;;;;
+11800;DOGRA LETTER A;Lo;0;L;;;;;N;;;;;
+11801;DOGRA LETTER AA;Lo;0;L;;;;;N;;;;;
+11802;DOGRA LETTER I;Lo;0;L;;;;;N;;;;;
+11803;DOGRA LETTER II;Lo;0;L;;;;;N;;;;;
+11804;DOGRA LETTER U;Lo;0;L;;;;;N;;;;;
+11805;DOGRA LETTER UU;Lo;0;L;;;;;N;;;;;
+11806;DOGRA LETTER E;Lo;0;L;;;;;N;;;;;
+11807;DOGRA LETTER AI;Lo;0;L;;;;;N;;;;;
+11808;DOGRA LETTER O;Lo;0;L;;;;;N;;;;;
+11809;DOGRA LETTER AU;Lo;0;L;;;;;N;;;;;
+1180A;DOGRA LETTER KA;Lo;0;L;;;;;N;;;;;
+1180B;DOGRA LETTER KHA;Lo;0;L;;;;;N;;;;;
+1180C;DOGRA LETTER GA;Lo;0;L;;;;;N;;;;;
+1180D;DOGRA LETTER GHA;Lo;0;L;;;;;N;;;;;
+1180E;DOGRA LETTER NGA;Lo;0;L;;;;;N;;;;;
+1180F;DOGRA LETTER CA;Lo;0;L;;;;;N;;;;;
+11810;DOGRA LETTER CHA;Lo;0;L;;;;;N;;;;;
+11811;DOGRA LETTER JA;Lo;0;L;;;;;N;;;;;
+11812;DOGRA LETTER JHA;Lo;0;L;;;;;N;;;;;
+11813;DOGRA LETTER NYA;Lo;0;L;;;;;N;;;;;
+11814;DOGRA LETTER TTA;Lo;0;L;;;;;N;;;;;
+11815;DOGRA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+11816;DOGRA LETTER DDA;Lo;0;L;;;;;N;;;;;
+11817;DOGRA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+11818;DOGRA LETTER NNA;Lo;0;L;;;;;N;;;;;
+11819;DOGRA LETTER TA;Lo;0;L;;;;;N;;;;;
+1181A;DOGRA LETTER THA;Lo;0;L;;;;;N;;;;;
+1181B;DOGRA LETTER DA;Lo;0;L;;;;;N;;;;;
+1181C;DOGRA LETTER DHA;Lo;0;L;;;;;N;;;;;
+1181D;DOGRA LETTER NA;Lo;0;L;;;;;N;;;;;
+1181E;DOGRA LETTER PA;Lo;0;L;;;;;N;;;;;
+1181F;DOGRA LETTER PHA;Lo;0;L;;;;;N;;;;;
+11820;DOGRA LETTER BA;Lo;0;L;;;;;N;;;;;
+11821;DOGRA LETTER BHA;Lo;0;L;;;;;N;;;;;
+11822;DOGRA LETTER MA;Lo;0;L;;;;;N;;;;;
+11823;DOGRA LETTER YA;Lo;0;L;;;;;N;;;;;
+11824;DOGRA LETTER RA;Lo;0;L;;;;;N;;;;;
+11825;DOGRA LETTER LA;Lo;0;L;;;;;N;;;;;
+11826;DOGRA LETTER VA;Lo;0;L;;;;;N;;;;;
+11827;DOGRA LETTER SHA;Lo;0;L;;;;;N;;;;;
+11828;DOGRA LETTER SSA;Lo;0;L;;;;;N;;;;;
+11829;DOGRA LETTER SA;Lo;0;L;;;;;N;;;;;
+1182A;DOGRA LETTER HA;Lo;0;L;;;;;N;;;;;
+1182B;DOGRA LETTER RRA;Lo;0;L;;;;;N;;;;;
+1182C;DOGRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+1182D;DOGRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+1182E;DOGRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+1182F;DOGRA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+11830;DOGRA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+11831;DOGRA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+11832;DOGRA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+11833;DOGRA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+11834;DOGRA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+11835;DOGRA VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+11836;DOGRA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+11837;DOGRA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+11838;DOGRA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+11839;DOGRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+1183A;DOGRA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+1183B;DOGRA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
118A0;WARANG CITI CAPITAL LETTER NGAA;Lu;0;L;;;;;N;;;;118C0;
118A1;WARANG CITI CAPITAL LETTER A;Lu;0;L;;;;;N;;;;118C1;
118A2;WARANG CITI CAPITAL LETTER WI;Lu;0;L;;;;;N;;;;118C2;
@@ -20068,6 +20421,159 @@ 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;;;;;
+11A00;ZANABAZAR SQUARE LETTER A;Lo;0;L;;;;;N;;;;;
+11A01;ZANABAZAR SQUARE VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+11A02;ZANABAZAR SQUARE VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;;
+11A03;ZANABAZAR SQUARE VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+11A04;ZANABAZAR SQUARE VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+11A05;ZANABAZAR SQUARE VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;;
+11A06;ZANABAZAR SQUARE VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+11A07;ZANABAZAR SQUARE VOWEL SIGN AI;Mn;0;L;;;;;N;;;;;
+11A08;ZANABAZAR SQUARE VOWEL SIGN AU;Mn;0;L;;;;;N;;;;;
+11A09;ZANABAZAR SQUARE VOWEL SIGN REVERSED I;Mn;0;NSM;;;;;N;;;;;
+11A0A;ZANABAZAR SQUARE VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;;
+11A0B;ZANABAZAR SQUARE LETTER KA;Lo;0;L;;;;;N;;;;;
+11A0C;ZANABAZAR SQUARE LETTER KHA;Lo;0;L;;;;;N;;;;;
+11A0D;ZANABAZAR SQUARE LETTER GA;Lo;0;L;;;;;N;;;;;
+11A0E;ZANABAZAR SQUARE LETTER GHA;Lo;0;L;;;;;N;;;;;
+11A0F;ZANABAZAR SQUARE LETTER NGA;Lo;0;L;;;;;N;;;;;
+11A10;ZANABAZAR SQUARE LETTER CA;Lo;0;L;;;;;N;;;;;
+11A11;ZANABAZAR SQUARE LETTER CHA;Lo;0;L;;;;;N;;;;;
+11A12;ZANABAZAR SQUARE LETTER JA;Lo;0;L;;;;;N;;;;;
+11A13;ZANABAZAR SQUARE LETTER NYA;Lo;0;L;;;;;N;;;;;
+11A14;ZANABAZAR SQUARE LETTER TTA;Lo;0;L;;;;;N;;;;;
+11A15;ZANABAZAR SQUARE LETTER TTHA;Lo;0;L;;;;;N;;;;;
+11A16;ZANABAZAR SQUARE LETTER DDA;Lo;0;L;;;;;N;;;;;
+11A17;ZANABAZAR SQUARE LETTER DDHA;Lo;0;L;;;;;N;;;;;
+11A18;ZANABAZAR SQUARE LETTER NNA;Lo;0;L;;;;;N;;;;;
+11A19;ZANABAZAR SQUARE LETTER TA;Lo;0;L;;;;;N;;;;;
+11A1A;ZANABAZAR SQUARE LETTER THA;Lo;0;L;;;;;N;;;;;
+11A1B;ZANABAZAR SQUARE LETTER DA;Lo;0;L;;;;;N;;;;;
+11A1C;ZANABAZAR SQUARE LETTER DHA;Lo;0;L;;;;;N;;;;;
+11A1D;ZANABAZAR SQUARE LETTER NA;Lo;0;L;;;;;N;;;;;
+11A1E;ZANABAZAR SQUARE LETTER PA;Lo;0;L;;;;;N;;;;;
+11A1F;ZANABAZAR SQUARE LETTER PHA;Lo;0;L;;;;;N;;;;;
+11A20;ZANABAZAR SQUARE LETTER BA;Lo;0;L;;;;;N;;;;;
+11A21;ZANABAZAR SQUARE LETTER BHA;Lo;0;L;;;;;N;;;;;
+11A22;ZANABAZAR SQUARE LETTER MA;Lo;0;L;;;;;N;;;;;
+11A23;ZANABAZAR SQUARE LETTER TSA;Lo;0;L;;;;;N;;;;;
+11A24;ZANABAZAR SQUARE LETTER TSHA;Lo;0;L;;;;;N;;;;;
+11A25;ZANABAZAR SQUARE LETTER DZA;Lo;0;L;;;;;N;;;;;
+11A26;ZANABAZAR SQUARE LETTER DZHA;Lo;0;L;;;;;N;;;;;
+11A27;ZANABAZAR SQUARE LETTER ZHA;Lo;0;L;;;;;N;;;;;
+11A28;ZANABAZAR SQUARE LETTER ZA;Lo;0;L;;;;;N;;;;;
+11A29;ZANABAZAR SQUARE LETTER -A;Lo;0;L;;;;;N;;;;;
+11A2A;ZANABAZAR SQUARE LETTER YA;Lo;0;L;;;;;N;;;;;
+11A2B;ZANABAZAR SQUARE LETTER RA;Lo;0;L;;;;;N;;;;;
+11A2C;ZANABAZAR SQUARE LETTER LA;Lo;0;L;;;;;N;;;;;
+11A2D;ZANABAZAR SQUARE LETTER VA;Lo;0;L;;;;;N;;;;;
+11A2E;ZANABAZAR SQUARE LETTER SHA;Lo;0;L;;;;;N;;;;;
+11A2F;ZANABAZAR SQUARE LETTER SSA;Lo;0;L;;;;;N;;;;;
+11A30;ZANABAZAR SQUARE LETTER SA;Lo;0;L;;;;;N;;;;;
+11A31;ZANABAZAR SQUARE LETTER HA;Lo;0;L;;;;;N;;;;;
+11A32;ZANABAZAR SQUARE LETTER KSSA;Lo;0;L;;;;;N;;;;;
+11A33;ZANABAZAR SQUARE FINAL CONSONANT MARK;Mn;0;NSM;;;;;N;;;;;
+11A34;ZANABAZAR SQUARE SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+11A35;ZANABAZAR SQUARE SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+11A36;ZANABAZAR SQUARE SIGN CANDRABINDU WITH ORNAMENT;Mn;0;NSM;;;;;N;;;;;
+11A37;ZANABAZAR SQUARE SIGN CANDRA WITH ORNAMENT;Mn;0;NSM;;;;;N;;;;;
+11A38;ZANABAZAR SQUARE SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+11A39;ZANABAZAR SQUARE SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+11A3A;ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA;Lo;0;L;;;;;N;;;;;
+11A3B;ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA;Mn;0;NSM;;;;;N;;;;;
+11A3C;ZANABAZAR SQUARE CLUSTER-FINAL LETTER RA;Mn;0;NSM;;;;;N;;;;;
+11A3D;ZANABAZAR SQUARE CLUSTER-FINAL LETTER LA;Mn;0;NSM;;;;;N;;;;;
+11A3E;ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA;Mn;0;NSM;;;;;N;;;;;
+11A3F;ZANABAZAR SQUARE INITIAL HEAD MARK;Po;0;L;;;;;N;;;;;
+11A40;ZANABAZAR SQUARE CLOSING HEAD MARK;Po;0;L;;;;;N;;;;;
+11A41;ZANABAZAR SQUARE MARK TSHEG;Po;0;L;;;;;N;;;;;
+11A42;ZANABAZAR SQUARE MARK SHAD;Po;0;L;;;;;N;;;;;
+11A43;ZANABAZAR SQUARE MARK DOUBLE SHAD;Po;0;L;;;;;N;;;;;
+11A44;ZANABAZAR SQUARE MARK LONG TSHEG;Po;0;L;;;;;N;;;;;
+11A45;ZANABAZAR SQUARE INITIAL DOUBLE-LINED HEAD MARK;Po;0;L;;;;;N;;;;;
+11A46;ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK;Po;0;L;;;;;N;;;;;
+11A47;ZANABAZAR SQUARE SUBJOINER;Mn;9;NSM;;;;;N;;;;;
+11A50;SOYOMBO LETTER A;Lo;0;L;;;;;N;;;;;
+11A51;SOYOMBO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+11A52;SOYOMBO VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;;
+11A53;SOYOMBO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+11A54;SOYOMBO VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+11A55;SOYOMBO VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+11A56;SOYOMBO VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;;
+11A57;SOYOMBO VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+11A58;SOYOMBO VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+11A59;SOYOMBO VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+11A5A;SOYOMBO VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+11A5B;SOYOMBO VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;;
+11A5C;SOYOMBO LETTER KA;Lo;0;L;;;;;N;;;;;
+11A5D;SOYOMBO LETTER KHA;Lo;0;L;;;;;N;;;;;
+11A5E;SOYOMBO LETTER GA;Lo;0;L;;;;;N;;;;;
+11A5F;SOYOMBO LETTER GHA;Lo;0;L;;;;;N;;;;;
+11A60;SOYOMBO LETTER NGA;Lo;0;L;;;;;N;;;;;
+11A61;SOYOMBO LETTER CA;Lo;0;L;;;;;N;;;;;
+11A62;SOYOMBO LETTER CHA;Lo;0;L;;;;;N;;;;;
+11A63;SOYOMBO LETTER JA;Lo;0;L;;;;;N;;;;;
+11A64;SOYOMBO LETTER JHA;Lo;0;L;;;;;N;;;;;
+11A65;SOYOMBO LETTER NYA;Lo;0;L;;;;;N;;;;;
+11A66;SOYOMBO LETTER TTA;Lo;0;L;;;;;N;;;;;
+11A67;SOYOMBO LETTER TTHA;Lo;0;L;;;;;N;;;;;
+11A68;SOYOMBO LETTER DDA;Lo;0;L;;;;;N;;;;;
+11A69;SOYOMBO LETTER DDHA;Lo;0;L;;;;;N;;;;;
+11A6A;SOYOMBO LETTER NNA;Lo;0;L;;;;;N;;;;;
+11A6B;SOYOMBO LETTER TA;Lo;0;L;;;;;N;;;;;
+11A6C;SOYOMBO LETTER THA;Lo;0;L;;;;;N;;;;;
+11A6D;SOYOMBO LETTER DA;Lo;0;L;;;;;N;;;;;
+11A6E;SOYOMBO LETTER DHA;Lo;0;L;;;;;N;;;;;
+11A6F;SOYOMBO LETTER NA;Lo;0;L;;;;;N;;;;;
+11A70;SOYOMBO LETTER PA;Lo;0;L;;;;;N;;;;;
+11A71;SOYOMBO LETTER PHA;Lo;0;L;;;;;N;;;;;
+11A72;SOYOMBO LETTER BA;Lo;0;L;;;;;N;;;;;
+11A73;SOYOMBO LETTER BHA;Lo;0;L;;;;;N;;;;;
+11A74;SOYOMBO LETTER MA;Lo;0;L;;;;;N;;;;;
+11A75;SOYOMBO LETTER TSA;Lo;0;L;;;;;N;;;;;
+11A76;SOYOMBO LETTER TSHA;Lo;0;L;;;;;N;;;;;
+11A77;SOYOMBO LETTER DZA;Lo;0;L;;;;;N;;;;;
+11A78;SOYOMBO LETTER ZHA;Lo;0;L;;;;;N;;;;;
+11A79;SOYOMBO LETTER ZA;Lo;0;L;;;;;N;;;;;
+11A7A;SOYOMBO LETTER -A;Lo;0;L;;;;;N;;;;;
+11A7B;SOYOMBO LETTER YA;Lo;0;L;;;;;N;;;;;
+11A7C;SOYOMBO LETTER RA;Lo;0;L;;;;;N;;;;;
+11A7D;SOYOMBO LETTER LA;Lo;0;L;;;;;N;;;;;
+11A7E;SOYOMBO LETTER VA;Lo;0;L;;;;;N;;;;;
+11A7F;SOYOMBO LETTER SHA;Lo;0;L;;;;;N;;;;;
+11A80;SOYOMBO LETTER SSA;Lo;0;L;;;;;N;;;;;
+11A81;SOYOMBO LETTER SA;Lo;0;L;;;;;N;;;;;
+11A82;SOYOMBO LETTER HA;Lo;0;L;;;;;N;;;;;
+11A83;SOYOMBO LETTER KSSA;Lo;0;L;;;;;N;;;;;
+11A86;SOYOMBO CLUSTER-INITIAL LETTER RA;Lo;0;L;;;;;N;;;;;
+11A87;SOYOMBO CLUSTER-INITIAL LETTER LA;Lo;0;L;;;;;N;;;;;
+11A88;SOYOMBO CLUSTER-INITIAL LETTER SHA;Lo;0;L;;;;;N;;;;;
+11A89;SOYOMBO CLUSTER-INITIAL LETTER SA;Lo;0;L;;;;;N;;;;;
+11A8A;SOYOMBO FINAL CONSONANT SIGN G;Mn;0;NSM;;;;;N;;;;;
+11A8B;SOYOMBO FINAL CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;;
+11A8C;SOYOMBO FINAL CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;;
+11A8D;SOYOMBO FINAL CONSONANT SIGN D;Mn;0;NSM;;;;;N;;;;;
+11A8E;SOYOMBO FINAL CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;;
+11A8F;SOYOMBO FINAL CONSONANT SIGN B;Mn;0;NSM;;;;;N;;;;;
+11A90;SOYOMBO FINAL CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;;
+11A91;SOYOMBO FINAL CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;;
+11A92;SOYOMBO FINAL CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;;
+11A93;SOYOMBO FINAL CONSONANT SIGN SH;Mn;0;NSM;;;;;N;;;;;
+11A94;SOYOMBO FINAL CONSONANT SIGN S;Mn;0;NSM;;;;;N;;;;;
+11A95;SOYOMBO FINAL CONSONANT SIGN -A;Mn;0;NSM;;;;;N;;;;;
+11A96;SOYOMBO SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+11A97;SOYOMBO SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+11A98;SOYOMBO GEMINATION MARK;Mn;0;NSM;;;;;N;;;;;
+11A99;SOYOMBO SUBJOINER;Mn;9;NSM;;;;;N;;;;;
+11A9A;SOYOMBO MARK TSHEG;Po;0;L;;;;;N;;;;;
+11A9B;SOYOMBO MARK SHAD;Po;0;L;;;;;N;;;;;
+11A9C;SOYOMBO MARK DOUBLE SHAD;Po;0;L;;;;;N;;;;;
+11A9D;SOYOMBO MARK PLUTA;Lo;0;L;;;;;N;;;;;
+11A9E;SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME;Po;0;L;;;;;N;;;;;
+11A9F;SOYOMBO HEAD MARK WITH MOON AND SUN AND FLAME;Po;0;L;;;;;N;;;;;
+11AA0;SOYOMBO HEAD MARK WITH MOON AND SUN;Po;0;L;;;;;N;;;;;
+11AA1;SOYOMBO TERMINAL MARK-1;Po;0;L;;;;;N;;;;;
+11AA2;SOYOMBO TERMINAL MARK-2;Po;0;L;;;;;N;;;;;
11AC0;PAU CIN HAU LETTER PA;Lo;0;L;;;;;N;;;;;
11AC1;PAU CIN HAU LETTER KA;Lo;0;L;;;;;N;;;;;
11AC2;PAU CIN HAU LETTER LA;Lo;0;L;;;;;N;;;;;
@@ -20290,6 +20796,169 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
11CB4;MARCHEN VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
11CB5;MARCHEN SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
11CB6;MARCHEN SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+11D00;MASARAM GONDI LETTER A;Lo;0;L;;;;;N;;;;;
+11D01;MASARAM GONDI LETTER AA;Lo;0;L;;;;;N;;;;;
+11D02;MASARAM GONDI LETTER I;Lo;0;L;;;;;N;;;;;
+11D03;MASARAM GONDI LETTER II;Lo;0;L;;;;;N;;;;;
+11D04;MASARAM GONDI LETTER U;Lo;0;L;;;;;N;;;;;
+11D05;MASARAM GONDI LETTER UU;Lo;0;L;;;;;N;;;;;
+11D06;MASARAM GONDI LETTER E;Lo;0;L;;;;;N;;;;;
+11D08;MASARAM GONDI LETTER AI;Lo;0;L;;;;;N;;;;;
+11D09;MASARAM GONDI LETTER O;Lo;0;L;;;;;N;;;;;
+11D0B;MASARAM GONDI LETTER AU;Lo;0;L;;;;;N;;;;;
+11D0C;MASARAM GONDI LETTER KA;Lo;0;L;;;;;N;;;;;
+11D0D;MASARAM GONDI LETTER KHA;Lo;0;L;;;;;N;;;;;
+11D0E;MASARAM GONDI LETTER GA;Lo;0;L;;;;;N;;;;;
+11D0F;MASARAM GONDI LETTER GHA;Lo;0;L;;;;;N;;;;;
+11D10;MASARAM GONDI LETTER NGA;Lo;0;L;;;;;N;;;;;
+11D11;MASARAM GONDI LETTER CA;Lo;0;L;;;;;N;;;;;
+11D12;MASARAM GONDI LETTER CHA;Lo;0;L;;;;;N;;;;;
+11D13;MASARAM GONDI LETTER JA;Lo;0;L;;;;;N;;;;;
+11D14;MASARAM GONDI LETTER JHA;Lo;0;L;;;;;N;;;;;
+11D15;MASARAM GONDI LETTER NYA;Lo;0;L;;;;;N;;;;;
+11D16;MASARAM GONDI LETTER TTA;Lo;0;L;;;;;N;;;;;
+11D17;MASARAM GONDI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+11D18;MASARAM GONDI LETTER DDA;Lo;0;L;;;;;N;;;;;
+11D19;MASARAM GONDI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+11D1A;MASARAM GONDI LETTER NNA;Lo;0;L;;;;;N;;;;;
+11D1B;MASARAM GONDI LETTER TA;Lo;0;L;;;;;N;;;;;
+11D1C;MASARAM GONDI LETTER THA;Lo;0;L;;;;;N;;;;;
+11D1D;MASARAM GONDI LETTER DA;Lo;0;L;;;;;N;;;;;
+11D1E;MASARAM GONDI LETTER DHA;Lo;0;L;;;;;N;;;;;
+11D1F;MASARAM GONDI LETTER NA;Lo;0;L;;;;;N;;;;;
+11D20;MASARAM GONDI LETTER PA;Lo;0;L;;;;;N;;;;;
+11D21;MASARAM GONDI LETTER PHA;Lo;0;L;;;;;N;;;;;
+11D22;MASARAM GONDI LETTER BA;Lo;0;L;;;;;N;;;;;
+11D23;MASARAM GONDI LETTER BHA;Lo;0;L;;;;;N;;;;;
+11D24;MASARAM GONDI LETTER MA;Lo;0;L;;;;;N;;;;;
+11D25;MASARAM GONDI LETTER YA;Lo;0;L;;;;;N;;;;;
+11D26;MASARAM GONDI LETTER RA;Lo;0;L;;;;;N;;;;;
+11D27;MASARAM GONDI LETTER LA;Lo;0;L;;;;;N;;;;;
+11D28;MASARAM GONDI LETTER VA;Lo;0;L;;;;;N;;;;;
+11D29;MASARAM GONDI LETTER SHA;Lo;0;L;;;;;N;;;;;
+11D2A;MASARAM GONDI LETTER SSA;Lo;0;L;;;;;N;;;;;
+11D2B;MASARAM GONDI LETTER SA;Lo;0;L;;;;;N;;;;;
+11D2C;MASARAM GONDI LETTER HA;Lo;0;L;;;;;N;;;;;
+11D2D;MASARAM GONDI LETTER LLA;Lo;0;L;;;;;N;;;;;
+11D2E;MASARAM GONDI LETTER KSSA;Lo;0;L;;;;;N;;;;;
+11D2F;MASARAM GONDI LETTER JNYA;Lo;0;L;;;;;N;;;;;
+11D30;MASARAM GONDI LETTER TRA;Lo;0;L;;;;;N;;;;;
+11D31;MASARAM GONDI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;;
+11D32;MASARAM GONDI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+11D33;MASARAM GONDI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+11D34;MASARAM GONDI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+11D35;MASARAM GONDI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+11D36;MASARAM GONDI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+11D3A;MASARAM GONDI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+11D3C;MASARAM GONDI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+11D3D;MASARAM GONDI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+11D3F;MASARAM GONDI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+11D40;MASARAM GONDI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+11D41;MASARAM GONDI SIGN VISARGA;Mn;0;NSM;;;;;N;;;;;
+11D42;MASARAM GONDI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+11D43;MASARAM GONDI SIGN CANDRA;Mn;0;NSM;;;;;N;;;;;
+11D44;MASARAM GONDI SIGN HALANTA;Mn;9;NSM;;;;;N;;;;;
+11D45;MASARAM GONDI VIRAMA;Mn;9;NSM;;;;;N;;;;;
+11D46;MASARAM GONDI REPHA;Lo;0;L;;;;;N;;;;;
+11D47;MASARAM GONDI RA-KARA;Mn;0;NSM;;;;;N;;;;;
+11D50;MASARAM GONDI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+11D51;MASARAM GONDI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+11D52;MASARAM GONDI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+11D53;MASARAM GONDI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+11D54;MASARAM GONDI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+11D55;MASARAM GONDI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+11D56;MASARAM GONDI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+11D57;MASARAM GONDI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+11D58;MASARAM GONDI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+11D59;MASARAM GONDI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+11D60;GUNJALA GONDI LETTER A;Lo;0;L;;;;;N;;;;;
+11D61;GUNJALA GONDI LETTER AA;Lo;0;L;;;;;N;;;;;
+11D62;GUNJALA GONDI LETTER I;Lo;0;L;;;;;N;;;;;
+11D63;GUNJALA GONDI LETTER II;Lo;0;L;;;;;N;;;;;
+11D64;GUNJALA GONDI LETTER U;Lo;0;L;;;;;N;;;;;
+11D65;GUNJALA GONDI LETTER UU;Lo;0;L;;;;;N;;;;;
+11D67;GUNJALA GONDI LETTER EE;Lo;0;L;;;;;N;;;;;
+11D68;GUNJALA GONDI LETTER AI;Lo;0;L;;;;;N;;;;;
+11D6A;GUNJALA GONDI LETTER OO;Lo;0;L;;;;;N;;;;;
+11D6B;GUNJALA GONDI LETTER AU;Lo;0;L;;;;;N;;;;;
+11D6C;GUNJALA GONDI LETTER YA;Lo;0;L;;;;;N;;;;;
+11D6D;GUNJALA GONDI LETTER VA;Lo;0;L;;;;;N;;;;;
+11D6E;GUNJALA GONDI LETTER BA;Lo;0;L;;;;;N;;;;;
+11D6F;GUNJALA GONDI LETTER BHA;Lo;0;L;;;;;N;;;;;
+11D70;GUNJALA GONDI LETTER MA;Lo;0;L;;;;;N;;;;;
+11D71;GUNJALA GONDI LETTER KA;Lo;0;L;;;;;N;;;;;
+11D72;GUNJALA GONDI LETTER KHA;Lo;0;L;;;;;N;;;;;
+11D73;GUNJALA GONDI LETTER TA;Lo;0;L;;;;;N;;;;;
+11D74;GUNJALA GONDI LETTER THA;Lo;0;L;;;;;N;;;;;
+11D75;GUNJALA GONDI LETTER LA;Lo;0;L;;;;;N;;;;;
+11D76;GUNJALA GONDI LETTER GA;Lo;0;L;;;;;N;;;;;
+11D77;GUNJALA GONDI LETTER GHA;Lo;0;L;;;;;N;;;;;
+11D78;GUNJALA GONDI LETTER DA;Lo;0;L;;;;;N;;;;;
+11D79;GUNJALA GONDI LETTER DHA;Lo;0;L;;;;;N;;;;;
+11D7A;GUNJALA GONDI LETTER NA;Lo;0;L;;;;;N;;;;;
+11D7B;GUNJALA GONDI LETTER CA;Lo;0;L;;;;;N;;;;;
+11D7C;GUNJALA GONDI LETTER CHA;Lo;0;L;;;;;N;;;;;
+11D7D;GUNJALA GONDI LETTER TTA;Lo;0;L;;;;;N;;;;;
+11D7E;GUNJALA GONDI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+11D7F;GUNJALA GONDI LETTER LLA;Lo;0;L;;;;;N;;;;;
+11D80;GUNJALA GONDI LETTER JA;Lo;0;L;;;;;N;;;;;
+11D81;GUNJALA GONDI LETTER JHA;Lo;0;L;;;;;N;;;;;
+11D82;GUNJALA GONDI LETTER DDA;Lo;0;L;;;;;N;;;;;
+11D83;GUNJALA GONDI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+11D84;GUNJALA GONDI LETTER NGA;Lo;0;L;;;;;N;;;;;
+11D85;GUNJALA GONDI LETTER PA;Lo;0;L;;;;;N;;;;;
+11D86;GUNJALA GONDI LETTER PHA;Lo;0;L;;;;;N;;;;;
+11D87;GUNJALA GONDI LETTER HA;Lo;0;L;;;;;N;;;;;
+11D88;GUNJALA GONDI LETTER RA;Lo;0;L;;;;;N;;;;;
+11D89;GUNJALA GONDI LETTER SA;Lo;0;L;;;;;N;;;;;
+11D8A;GUNJALA GONDI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+11D8B;GUNJALA GONDI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+11D8C;GUNJALA GONDI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+11D8D;GUNJALA GONDI VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+11D8E;GUNJALA GONDI VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+11D90;GUNJALA GONDI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;;
+11D91;GUNJALA GONDI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+11D93;GUNJALA GONDI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+11D94;GUNJALA GONDI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+11D95;GUNJALA GONDI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+11D96;GUNJALA GONDI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+11D97;GUNJALA GONDI VIRAMA;Mn;9;NSM;;;;;N;;;;;
+11D98;GUNJALA GONDI OM;Lo;0;L;;;;;N;;;;;
+11DA0;GUNJALA GONDI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+11DA1;GUNJALA GONDI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+11DA2;GUNJALA GONDI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+11DA3;GUNJALA GONDI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+11DA4;GUNJALA GONDI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+11DA5;GUNJALA GONDI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+11DA6;GUNJALA GONDI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+11DA7;GUNJALA GONDI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+11DA8;GUNJALA GONDI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+11DA9;GUNJALA GONDI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+11EE0;MAKASAR LETTER KA;Lo;0;L;;;;;N;;;;;
+11EE1;MAKASAR LETTER GA;Lo;0;L;;;;;N;;;;;
+11EE2;MAKASAR LETTER NGA;Lo;0;L;;;;;N;;;;;
+11EE3;MAKASAR LETTER PA;Lo;0;L;;;;;N;;;;;
+11EE4;MAKASAR LETTER BA;Lo;0;L;;;;;N;;;;;
+11EE5;MAKASAR LETTER MA;Lo;0;L;;;;;N;;;;;
+11EE6;MAKASAR LETTER TA;Lo;0;L;;;;;N;;;;;
+11EE7;MAKASAR LETTER DA;Lo;0;L;;;;;N;;;;;
+11EE8;MAKASAR LETTER NA;Lo;0;L;;;;;N;;;;;
+11EE9;MAKASAR LETTER CA;Lo;0;L;;;;;N;;;;;
+11EEA;MAKASAR LETTER JA;Lo;0;L;;;;;N;;;;;
+11EEB;MAKASAR LETTER NYA;Lo;0;L;;;;;N;;;;;
+11EEC;MAKASAR LETTER YA;Lo;0;L;;;;;N;;;;;
+11EED;MAKASAR LETTER RA;Lo;0;L;;;;;N;;;;;
+11EEE;MAKASAR LETTER LA;Lo;0;L;;;;;N;;;;;
+11EEF;MAKASAR LETTER VA;Lo;0;L;;;;;N;;;;;
+11EF0;MAKASAR LETTER SA;Lo;0;L;;;;;N;;;;;
+11EF1;MAKASAR LETTER A;Lo;0;L;;;;;N;;;;;
+11EF2;MAKASAR ANGKA;Lo;0;L;;;;;N;;;;;
+11EF3;MAKASAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+11EF4;MAKASAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+11EF5;MAKASAR VOWEL SIGN E;Mc;0;L;;;;;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;;;;;
12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;;
12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;;
12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;;
@@ -23953,6 +24622,97 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
16B8D;PAHAWH HMONG CLAN SIGN TSWB;Lo;0;L;;;;;N;;;;;
16B8E;PAHAWH HMONG CLAN SIGN KWM;Lo;0;L;;;;;N;;;;;
16B8F;PAHAWH HMONG CLAN SIGN VWJ;Lo;0;L;;;;;N;;;;;
+16E40;MEDEFAIDRIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;16E60;
+16E41;MEDEFAIDRIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;16E61;
+16E42;MEDEFAIDRIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;16E62;
+16E43;MEDEFAIDRIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;16E63;
+16E44;MEDEFAIDRIN CAPITAL LETTER ATIU;Lu;0;L;;;;;N;;;;16E64;
+16E45;MEDEFAIDRIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;16E65;
+16E46;MEDEFAIDRIN CAPITAL LETTER KP;Lu;0;L;;;;;N;;;;16E66;
+16E47;MEDEFAIDRIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;16E67;
+16E48;MEDEFAIDRIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;16E68;
+16E49;MEDEFAIDRIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;16E69;
+16E4A;MEDEFAIDRIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;16E6A;
+16E4B;MEDEFAIDRIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;16E6B;
+16E4C;MEDEFAIDRIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;16E6C;
+16E4D;MEDEFAIDRIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;16E6D;
+16E4E;MEDEFAIDRIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;16E6E;
+16E4F;MEDEFAIDRIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;16E6F;
+16E50;MEDEFAIDRIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;16E70;
+16E51;MEDEFAIDRIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;16E71;
+16E52;MEDEFAIDRIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;16E72;
+16E53;MEDEFAIDRIN CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;16E73;
+16E54;MEDEFAIDRIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;16E74;
+16E55;MEDEFAIDRIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;16E75;
+16E56;MEDEFAIDRIN CAPITAL LETTER HP;Lu;0;L;;;;;N;;;;16E76;
+16E57;MEDEFAIDRIN CAPITAL LETTER NY;Lu;0;L;;;;;N;;;;16E77;
+16E58;MEDEFAIDRIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;16E78;
+16E59;MEDEFAIDRIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;16E79;
+16E5A;MEDEFAIDRIN CAPITAL LETTER OE;Lu;0;L;;;;;N;;;;16E7A;
+16E5B;MEDEFAIDRIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;16E7B;
+16E5C;MEDEFAIDRIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;16E7C;
+16E5D;MEDEFAIDRIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;16E7D;
+16E5E;MEDEFAIDRIN CAPITAL LETTER AI;Lu;0;L;;;;;N;;;;16E7E;
+16E5F;MEDEFAIDRIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;16E7F;
+16E60;MEDEFAIDRIN SMALL LETTER M;Ll;0;L;;;;;N;;;16E40;;16E40
+16E61;MEDEFAIDRIN SMALL LETTER S;Ll;0;L;;;;;N;;;16E41;;16E41
+16E62;MEDEFAIDRIN SMALL LETTER V;Ll;0;L;;;;;N;;;16E42;;16E42
+16E63;MEDEFAIDRIN SMALL LETTER W;Ll;0;L;;;;;N;;;16E43;;16E43
+16E64;MEDEFAIDRIN SMALL LETTER ATIU;Ll;0;L;;;;;N;;;16E44;;16E44
+16E65;MEDEFAIDRIN SMALL LETTER Z;Ll;0;L;;;;;N;;;16E45;;16E45
+16E66;MEDEFAIDRIN SMALL LETTER KP;Ll;0;L;;;;;N;;;16E46;;16E46
+16E67;MEDEFAIDRIN SMALL LETTER P;Ll;0;L;;;;;N;;;16E47;;16E47
+16E68;MEDEFAIDRIN SMALL LETTER T;Ll;0;L;;;;;N;;;16E48;;16E48
+16E69;MEDEFAIDRIN SMALL LETTER G;Ll;0;L;;;;;N;;;16E49;;16E49
+16E6A;MEDEFAIDRIN SMALL LETTER F;Ll;0;L;;;;;N;;;16E4A;;16E4A
+16E6B;MEDEFAIDRIN SMALL LETTER I;Ll;0;L;;;;;N;;;16E4B;;16E4B
+16E6C;MEDEFAIDRIN SMALL LETTER K;Ll;0;L;;;;;N;;;16E4C;;16E4C
+16E6D;MEDEFAIDRIN SMALL LETTER A;Ll;0;L;;;;;N;;;16E4D;;16E4D
+16E6E;MEDEFAIDRIN SMALL LETTER J;Ll;0;L;;;;;N;;;16E4E;;16E4E
+16E6F;MEDEFAIDRIN SMALL LETTER E;Ll;0;L;;;;;N;;;16E4F;;16E4F
+16E70;MEDEFAIDRIN SMALL LETTER B;Ll;0;L;;;;;N;;;16E50;;16E50
+16E71;MEDEFAIDRIN SMALL LETTER C;Ll;0;L;;;;;N;;;16E51;;16E51
+16E72;MEDEFAIDRIN SMALL LETTER U;Ll;0;L;;;;;N;;;16E52;;16E52
+16E73;MEDEFAIDRIN SMALL LETTER YU;Ll;0;L;;;;;N;;;16E53;;16E53
+16E74;MEDEFAIDRIN SMALL LETTER L;Ll;0;L;;;;;N;;;16E54;;16E54
+16E75;MEDEFAIDRIN SMALL LETTER Q;Ll;0;L;;;;;N;;;16E55;;16E55
+16E76;MEDEFAIDRIN SMALL LETTER HP;Ll;0;L;;;;;N;;;16E56;;16E56
+16E77;MEDEFAIDRIN SMALL LETTER NY;Ll;0;L;;;;;N;;;16E57;;16E57
+16E78;MEDEFAIDRIN SMALL LETTER X;Ll;0;L;;;;;N;;;16E58;;16E58
+16E79;MEDEFAIDRIN SMALL LETTER D;Ll;0;L;;;;;N;;;16E59;;16E59
+16E7A;MEDEFAIDRIN SMALL LETTER OE;Ll;0;L;;;;;N;;;16E5A;;16E5A
+16E7B;MEDEFAIDRIN SMALL LETTER N;Ll;0;L;;;;;N;;;16E5B;;16E5B
+16E7C;MEDEFAIDRIN SMALL LETTER R;Ll;0;L;;;;;N;;;16E5C;;16E5C
+16E7D;MEDEFAIDRIN SMALL LETTER O;Ll;0;L;;;;;N;;;16E5D;;16E5D
+16E7E;MEDEFAIDRIN SMALL LETTER AI;Ll;0;L;;;;;N;;;16E5E;;16E5E
+16E7F;MEDEFAIDRIN SMALL LETTER Y;Ll;0;L;;;;;N;;;16E5F;;16E5F
+16E80;MEDEFAIDRIN DIGIT ZERO;No;0;L;;;;0;N;;;;;
+16E81;MEDEFAIDRIN DIGIT ONE;No;0;L;;;;1;N;;;;;
+16E82;MEDEFAIDRIN DIGIT TWO;No;0;L;;;;2;N;;;;;
+16E83;MEDEFAIDRIN DIGIT THREE;No;0;L;;;;3;N;;;;;
+16E84;MEDEFAIDRIN DIGIT FOUR;No;0;L;;;;4;N;;;;;
+16E85;MEDEFAIDRIN DIGIT FIVE;No;0;L;;;;5;N;;;;;
+16E86;MEDEFAIDRIN DIGIT SIX;No;0;L;;;;6;N;;;;;
+16E87;MEDEFAIDRIN DIGIT SEVEN;No;0;L;;;;7;N;;;;;
+16E88;MEDEFAIDRIN DIGIT EIGHT;No;0;L;;;;8;N;;;;;
+16E89;MEDEFAIDRIN DIGIT NINE;No;0;L;;;;9;N;;;;;
+16E8A;MEDEFAIDRIN NUMBER TEN;No;0;L;;;;10;N;;;;;
+16E8B;MEDEFAIDRIN NUMBER ELEVEN;No;0;L;;;;11;N;;;;;
+16E8C;MEDEFAIDRIN NUMBER TWELVE;No;0;L;;;;12;N;;;;;
+16E8D;MEDEFAIDRIN NUMBER THIRTEEN;No;0;L;;;;13;N;;;;;
+16E8E;MEDEFAIDRIN NUMBER FOURTEEN;No;0;L;;;;14;N;;;;;
+16E8F;MEDEFAIDRIN NUMBER FIFTEEN;No;0;L;;;;15;N;;;;;
+16E90;MEDEFAIDRIN NUMBER SIXTEEN;No;0;L;;;;16;N;;;;;
+16E91;MEDEFAIDRIN NUMBER SEVENTEEN;No;0;L;;;;17;N;;;;;
+16E92;MEDEFAIDRIN NUMBER EIGHTEEN;No;0;L;;;;18;N;;;;;
+16E93;MEDEFAIDRIN NUMBER NINETEEN;No;0;L;;;;19;N;;;;;
+16E94;MEDEFAIDRIN DIGIT ONE ALTERNATE FORM;No;0;L;;;;1;N;;;;;
+16E95;MEDEFAIDRIN DIGIT TWO ALTERNATE FORM;No;0;L;;;;2;N;;;;;
+16E96;MEDEFAIDRIN DIGIT THREE ALTERNATE FORM;No;0;L;;;;3;N;;;;;
+16E97;MEDEFAIDRIN COMMA;Po;0;L;;;;;N;;;;;
+16E98;MEDEFAIDRIN FULL STOP;Po;0;L;;;;;N;;;;;
+16E99;MEDEFAIDRIN SYMBOL AIVA;Po;0;L;;;;;N;;;;;
+16E9A;MEDEFAIDRIN EXCLAMATION OH;Po;0;L;;;;;N;;;;;
16F00;MIAO LETTER PA;Lo;0;L;;;;;N;;;;;
16F01;MIAO LETTER BA;Lo;0;L;;;;;N;;;;;
16F02;MIAO LETTER YI PA;Lo;0;L;;;;;N;;;;;
@@ -24087,8 +24847,9 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
16F9E;MIAO LETTER REFORMED TONE-6;Lm;0;L;;;;;N;;;;;
16F9F;MIAO LETTER REFORMED TONE-8;Lm;0;L;;;;;N;;;;;
16FE0;TANGUT ITERATION MARK;Lm;0;L;;;;;N;;;;;
+16FE1;NUSHU ITERATION MARK;Lm;0;L;;;;;N;;;;;
17000;<Tangut Ideograph, First>;Lo;0;L;;;;;N;;;;;
-187EC;<Tangut Ideograph, Last>;Lo;0;L;;;;;N;;;;;
+187F1;<Tangut Ideograph, Last>;Lo;0;L;;;;;N;;;;;
18800;TANGUT COMPONENT-001;Lo;0;L;;;;;N;;;;;
18801;TANGUT COMPONENT-002;Lo;0;L;;;;;N;;;;;
18802;TANGUT COMPONENT-003;Lo;0;L;;;;;N;;;;;
@@ -24846,6 +25607,687 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
18AF2;TANGUT COMPONENT-755;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;;;;;
+1B003;HENTAIGANA LETTER A-2;Lo;0;L;;;;;N;;;;;
+1B004;HENTAIGANA LETTER A-3;Lo;0;L;;;;;N;;;;;
+1B005;HENTAIGANA LETTER A-WO;Lo;0;L;;;;;N;;;;;
+1B006;HENTAIGANA LETTER I-1;Lo;0;L;;;;;N;;;;;
+1B007;HENTAIGANA LETTER I-2;Lo;0;L;;;;;N;;;;;
+1B008;HENTAIGANA LETTER I-3;Lo;0;L;;;;;N;;;;;
+1B009;HENTAIGANA LETTER I-4;Lo;0;L;;;;;N;;;;;
+1B00A;HENTAIGANA LETTER U-1;Lo;0;L;;;;;N;;;;;
+1B00B;HENTAIGANA LETTER U-2;Lo;0;L;;;;;N;;;;;
+1B00C;HENTAIGANA LETTER U-3;Lo;0;L;;;;;N;;;;;
+1B00D;HENTAIGANA LETTER U-4;Lo;0;L;;;;;N;;;;;
+1B00E;HENTAIGANA LETTER U-5;Lo;0;L;;;;;N;;;;;
+1B00F;HENTAIGANA LETTER E-2;Lo;0;L;;;;;N;;;;;
+1B010;HENTAIGANA LETTER E-3;Lo;0;L;;;;;N;;;;;
+1B011;HENTAIGANA LETTER E-4;Lo;0;L;;;;;N;;;;;
+1B012;HENTAIGANA LETTER E-5;Lo;0;L;;;;;N;;;;;
+1B013;HENTAIGANA LETTER E-6;Lo;0;L;;;;;N;;;;;
+1B014;HENTAIGANA LETTER O-1;Lo;0;L;;;;;N;;;;;
+1B015;HENTAIGANA LETTER O-2;Lo;0;L;;;;;N;;;;;
+1B016;HENTAIGANA LETTER O-3;Lo;0;L;;;;;N;;;;;
+1B017;HENTAIGANA LETTER KA-1;Lo;0;L;;;;;N;;;;;
+1B018;HENTAIGANA LETTER KA-2;Lo;0;L;;;;;N;;;;;
+1B019;HENTAIGANA LETTER KA-3;Lo;0;L;;;;;N;;;;;
+1B01A;HENTAIGANA LETTER KA-4;Lo;0;L;;;;;N;;;;;
+1B01B;HENTAIGANA LETTER KA-5;Lo;0;L;;;;;N;;;;;
+1B01C;HENTAIGANA LETTER KA-6;Lo;0;L;;;;;N;;;;;
+1B01D;HENTAIGANA LETTER KA-7;Lo;0;L;;;;;N;;;;;
+1B01E;HENTAIGANA LETTER KA-8;Lo;0;L;;;;;N;;;;;
+1B01F;HENTAIGANA LETTER KA-9;Lo;0;L;;;;;N;;;;;
+1B020;HENTAIGANA LETTER KA-10;Lo;0;L;;;;;N;;;;;
+1B021;HENTAIGANA LETTER KA-11;Lo;0;L;;;;;N;;;;;
+1B022;HENTAIGANA LETTER KA-KE;Lo;0;L;;;;;N;;;;;
+1B023;HENTAIGANA LETTER KI-1;Lo;0;L;;;;;N;;;;;
+1B024;HENTAIGANA LETTER KI-2;Lo;0;L;;;;;N;;;;;
+1B025;HENTAIGANA LETTER KI-3;Lo;0;L;;;;;N;;;;;
+1B026;HENTAIGANA LETTER KI-4;Lo;0;L;;;;;N;;;;;
+1B027;HENTAIGANA LETTER KI-5;Lo;0;L;;;;;N;;;;;
+1B028;HENTAIGANA LETTER KI-6;Lo;0;L;;;;;N;;;;;
+1B029;HENTAIGANA LETTER KI-7;Lo;0;L;;;;;N;;;;;
+1B02A;HENTAIGANA LETTER KI-8;Lo;0;L;;;;;N;;;;;
+1B02B;HENTAIGANA LETTER KU-1;Lo;0;L;;;;;N;;;;;
+1B02C;HENTAIGANA LETTER KU-2;Lo;0;L;;;;;N;;;;;
+1B02D;HENTAIGANA LETTER KU-3;Lo;0;L;;;;;N;;;;;
+1B02E;HENTAIGANA LETTER KU-4;Lo;0;L;;;;;N;;;;;
+1B02F;HENTAIGANA LETTER KU-5;Lo;0;L;;;;;N;;;;;
+1B030;HENTAIGANA LETTER KU-6;Lo;0;L;;;;;N;;;;;
+1B031;HENTAIGANA LETTER KU-7;Lo;0;L;;;;;N;;;;;
+1B032;HENTAIGANA LETTER KE-1;Lo;0;L;;;;;N;;;;;
+1B033;HENTAIGANA LETTER KE-2;Lo;0;L;;;;;N;;;;;
+1B034;HENTAIGANA LETTER KE-3;Lo;0;L;;;;;N;;;;;
+1B035;HENTAIGANA LETTER KE-4;Lo;0;L;;;;;N;;;;;
+1B036;HENTAIGANA LETTER KE-5;Lo;0;L;;;;;N;;;;;
+1B037;HENTAIGANA LETTER KE-6;Lo;0;L;;;;;N;;;;;
+1B038;HENTAIGANA LETTER KO-1;Lo;0;L;;;;;N;;;;;
+1B039;HENTAIGANA LETTER KO-2;Lo;0;L;;;;;N;;;;;
+1B03A;HENTAIGANA LETTER KO-3;Lo;0;L;;;;;N;;;;;
+1B03B;HENTAIGANA LETTER KO-KI;Lo;0;L;;;;;N;;;;;
+1B03C;HENTAIGANA LETTER SA-1;Lo;0;L;;;;;N;;;;;
+1B03D;HENTAIGANA LETTER SA-2;Lo;0;L;;;;;N;;;;;
+1B03E;HENTAIGANA LETTER SA-3;Lo;0;L;;;;;N;;;;;
+1B03F;HENTAIGANA LETTER SA-4;Lo;0;L;;;;;N;;;;;
+1B040;HENTAIGANA LETTER SA-5;Lo;0;L;;;;;N;;;;;
+1B041;HENTAIGANA LETTER SA-6;Lo;0;L;;;;;N;;;;;
+1B042;HENTAIGANA LETTER SA-7;Lo;0;L;;;;;N;;;;;
+1B043;HENTAIGANA LETTER SA-8;Lo;0;L;;;;;N;;;;;
+1B044;HENTAIGANA LETTER SI-1;Lo;0;L;;;;;N;;;;;
+1B045;HENTAIGANA LETTER SI-2;Lo;0;L;;;;;N;;;;;
+1B046;HENTAIGANA LETTER SI-3;Lo;0;L;;;;;N;;;;;
+1B047;HENTAIGANA LETTER SI-4;Lo;0;L;;;;;N;;;;;
+1B048;HENTAIGANA LETTER SI-5;Lo;0;L;;;;;N;;;;;
+1B049;HENTAIGANA LETTER SI-6;Lo;0;L;;;;;N;;;;;
+1B04A;HENTAIGANA LETTER SU-1;Lo;0;L;;;;;N;;;;;
+1B04B;HENTAIGANA LETTER SU-2;Lo;0;L;;;;;N;;;;;
+1B04C;HENTAIGANA LETTER SU-3;Lo;0;L;;;;;N;;;;;
+1B04D;HENTAIGANA LETTER SU-4;Lo;0;L;;;;;N;;;;;
+1B04E;HENTAIGANA LETTER SU-5;Lo;0;L;;;;;N;;;;;
+1B04F;HENTAIGANA LETTER SU-6;Lo;0;L;;;;;N;;;;;
+1B050;HENTAIGANA LETTER SU-7;Lo;0;L;;;;;N;;;;;
+1B051;HENTAIGANA LETTER SU-8;Lo;0;L;;;;;N;;;;;
+1B052;HENTAIGANA LETTER SE-1;Lo;0;L;;;;;N;;;;;
+1B053;HENTAIGANA LETTER SE-2;Lo;0;L;;;;;N;;;;;
+1B054;HENTAIGANA LETTER SE-3;Lo;0;L;;;;;N;;;;;
+1B055;HENTAIGANA LETTER SE-4;Lo;0;L;;;;;N;;;;;
+1B056;HENTAIGANA LETTER SE-5;Lo;0;L;;;;;N;;;;;
+1B057;HENTAIGANA LETTER SO-1;Lo;0;L;;;;;N;;;;;
+1B058;HENTAIGANA LETTER SO-2;Lo;0;L;;;;;N;;;;;
+1B059;HENTAIGANA LETTER SO-3;Lo;0;L;;;;;N;;;;;
+1B05A;HENTAIGANA LETTER SO-4;Lo;0;L;;;;;N;;;;;
+1B05B;HENTAIGANA LETTER SO-5;Lo;0;L;;;;;N;;;;;
+1B05C;HENTAIGANA LETTER SO-6;Lo;0;L;;;;;N;;;;;
+1B05D;HENTAIGANA LETTER SO-7;Lo;0;L;;;;;N;;;;;
+1B05E;HENTAIGANA LETTER TA-1;Lo;0;L;;;;;N;;;;;
+1B05F;HENTAIGANA LETTER TA-2;Lo;0;L;;;;;N;;;;;
+1B060;HENTAIGANA LETTER TA-3;Lo;0;L;;;;;N;;;;;
+1B061;HENTAIGANA LETTER TA-4;Lo;0;L;;;;;N;;;;;
+1B062;HENTAIGANA LETTER TI-1;Lo;0;L;;;;;N;;;;;
+1B063;HENTAIGANA LETTER TI-2;Lo;0;L;;;;;N;;;;;
+1B064;HENTAIGANA LETTER TI-3;Lo;0;L;;;;;N;;;;;
+1B065;HENTAIGANA LETTER TI-4;Lo;0;L;;;;;N;;;;;
+1B066;HENTAIGANA LETTER TI-5;Lo;0;L;;;;;N;;;;;
+1B067;HENTAIGANA LETTER TI-6;Lo;0;L;;;;;N;;;;;
+1B068;HENTAIGANA LETTER TI-7;Lo;0;L;;;;;N;;;;;
+1B069;HENTAIGANA LETTER TU-1;Lo;0;L;;;;;N;;;;;
+1B06A;HENTAIGANA LETTER TU-2;Lo;0;L;;;;;N;;;;;
+1B06B;HENTAIGANA LETTER TU-3;Lo;0;L;;;;;N;;;;;
+1B06C;HENTAIGANA LETTER TU-4;Lo;0;L;;;;;N;;;;;
+1B06D;HENTAIGANA LETTER TU-TO;Lo;0;L;;;;;N;;;;;
+1B06E;HENTAIGANA LETTER TE-1;Lo;0;L;;;;;N;;;;;
+1B06F;HENTAIGANA LETTER TE-2;Lo;0;L;;;;;N;;;;;
+1B070;HENTAIGANA LETTER TE-3;Lo;0;L;;;;;N;;;;;
+1B071;HENTAIGANA LETTER TE-4;Lo;0;L;;;;;N;;;;;
+1B072;HENTAIGANA LETTER TE-5;Lo;0;L;;;;;N;;;;;
+1B073;HENTAIGANA LETTER TE-6;Lo;0;L;;;;;N;;;;;
+1B074;HENTAIGANA LETTER TE-7;Lo;0;L;;;;;N;;;;;
+1B075;HENTAIGANA LETTER TE-8;Lo;0;L;;;;;N;;;;;
+1B076;HENTAIGANA LETTER TE-9;Lo;0;L;;;;;N;;;;;
+1B077;HENTAIGANA LETTER TO-1;Lo;0;L;;;;;N;;;;;
+1B078;HENTAIGANA LETTER TO-2;Lo;0;L;;;;;N;;;;;
+1B079;HENTAIGANA LETTER TO-3;Lo;0;L;;;;;N;;;;;
+1B07A;HENTAIGANA LETTER TO-4;Lo;0;L;;;;;N;;;;;
+1B07B;HENTAIGANA LETTER TO-5;Lo;0;L;;;;;N;;;;;
+1B07C;HENTAIGANA LETTER TO-6;Lo;0;L;;;;;N;;;;;
+1B07D;HENTAIGANA LETTER TO-RA;Lo;0;L;;;;;N;;;;;
+1B07E;HENTAIGANA LETTER NA-1;Lo;0;L;;;;;N;;;;;
+1B07F;HENTAIGANA LETTER NA-2;Lo;0;L;;;;;N;;;;;
+1B080;HENTAIGANA LETTER NA-3;Lo;0;L;;;;;N;;;;;
+1B081;HENTAIGANA LETTER NA-4;Lo;0;L;;;;;N;;;;;
+1B082;HENTAIGANA LETTER NA-5;Lo;0;L;;;;;N;;;;;
+1B083;HENTAIGANA LETTER NA-6;Lo;0;L;;;;;N;;;;;
+1B084;HENTAIGANA LETTER NA-7;Lo;0;L;;;;;N;;;;;
+1B085;HENTAIGANA LETTER NA-8;Lo;0;L;;;;;N;;;;;
+1B086;HENTAIGANA LETTER NA-9;Lo;0;L;;;;;N;;;;;
+1B087;HENTAIGANA LETTER NI-1;Lo;0;L;;;;;N;;;;;
+1B088;HENTAIGANA LETTER NI-2;Lo;0;L;;;;;N;;;;;
+1B089;HENTAIGANA LETTER NI-3;Lo;0;L;;;;;N;;;;;
+1B08A;HENTAIGANA LETTER NI-4;Lo;0;L;;;;;N;;;;;
+1B08B;HENTAIGANA LETTER NI-5;Lo;0;L;;;;;N;;;;;
+1B08C;HENTAIGANA LETTER NI-6;Lo;0;L;;;;;N;;;;;
+1B08D;HENTAIGANA LETTER NI-7;Lo;0;L;;;;;N;;;;;
+1B08E;HENTAIGANA LETTER NI-TE;Lo;0;L;;;;;N;;;;;
+1B08F;HENTAIGANA LETTER NU-1;Lo;0;L;;;;;N;;;;;
+1B090;HENTAIGANA LETTER NU-2;Lo;0;L;;;;;N;;;;;
+1B091;HENTAIGANA LETTER NU-3;Lo;0;L;;;;;N;;;;;
+1B092;HENTAIGANA LETTER NE-1;Lo;0;L;;;;;N;;;;;
+1B093;HENTAIGANA LETTER NE-2;Lo;0;L;;;;;N;;;;;
+1B094;HENTAIGANA LETTER NE-3;Lo;0;L;;;;;N;;;;;
+1B095;HENTAIGANA LETTER NE-4;Lo;0;L;;;;;N;;;;;
+1B096;HENTAIGANA LETTER NE-5;Lo;0;L;;;;;N;;;;;
+1B097;HENTAIGANA LETTER NE-6;Lo;0;L;;;;;N;;;;;
+1B098;HENTAIGANA LETTER NE-KO;Lo;0;L;;;;;N;;;;;
+1B099;HENTAIGANA LETTER NO-1;Lo;0;L;;;;;N;;;;;
+1B09A;HENTAIGANA LETTER NO-2;Lo;0;L;;;;;N;;;;;
+1B09B;HENTAIGANA LETTER NO-3;Lo;0;L;;;;;N;;;;;
+1B09C;HENTAIGANA LETTER NO-4;Lo;0;L;;;;;N;;;;;
+1B09D;HENTAIGANA LETTER NO-5;Lo;0;L;;;;;N;;;;;
+1B09E;HENTAIGANA LETTER HA-1;Lo;0;L;;;;;N;;;;;
+1B09F;HENTAIGANA LETTER HA-2;Lo;0;L;;;;;N;;;;;
+1B0A0;HENTAIGANA LETTER HA-3;Lo;0;L;;;;;N;;;;;
+1B0A1;HENTAIGANA LETTER HA-4;Lo;0;L;;;;;N;;;;;
+1B0A2;HENTAIGANA LETTER HA-5;Lo;0;L;;;;;N;;;;;
+1B0A3;HENTAIGANA LETTER HA-6;Lo;0;L;;;;;N;;;;;
+1B0A4;HENTAIGANA LETTER HA-7;Lo;0;L;;;;;N;;;;;
+1B0A5;HENTAIGANA LETTER HA-8;Lo;0;L;;;;;N;;;;;
+1B0A6;HENTAIGANA LETTER HA-9;Lo;0;L;;;;;N;;;;;
+1B0A7;HENTAIGANA LETTER HA-10;Lo;0;L;;;;;N;;;;;
+1B0A8;HENTAIGANA LETTER HA-11;Lo;0;L;;;;;N;;;;;
+1B0A9;HENTAIGANA LETTER HI-1;Lo;0;L;;;;;N;;;;;
+1B0AA;HENTAIGANA LETTER HI-2;Lo;0;L;;;;;N;;;;;
+1B0AB;HENTAIGANA LETTER HI-3;Lo;0;L;;;;;N;;;;;
+1B0AC;HENTAIGANA LETTER HI-4;Lo;0;L;;;;;N;;;;;
+1B0AD;HENTAIGANA LETTER HI-5;Lo;0;L;;;;;N;;;;;
+1B0AE;HENTAIGANA LETTER HI-6;Lo;0;L;;;;;N;;;;;
+1B0AF;HENTAIGANA LETTER HI-7;Lo;0;L;;;;;N;;;;;
+1B0B0;HENTAIGANA LETTER HU-1;Lo;0;L;;;;;N;;;;;
+1B0B1;HENTAIGANA LETTER HU-2;Lo;0;L;;;;;N;;;;;
+1B0B2;HENTAIGANA LETTER HU-3;Lo;0;L;;;;;N;;;;;
+1B0B3;HENTAIGANA LETTER HE-1;Lo;0;L;;;;;N;;;;;
+1B0B4;HENTAIGANA LETTER HE-2;Lo;0;L;;;;;N;;;;;
+1B0B5;HENTAIGANA LETTER HE-3;Lo;0;L;;;;;N;;;;;
+1B0B6;HENTAIGANA LETTER HE-4;Lo;0;L;;;;;N;;;;;
+1B0B7;HENTAIGANA LETTER HE-5;Lo;0;L;;;;;N;;;;;
+1B0B8;HENTAIGANA LETTER HE-6;Lo;0;L;;;;;N;;;;;
+1B0B9;HENTAIGANA LETTER HE-7;Lo;0;L;;;;;N;;;;;
+1B0BA;HENTAIGANA LETTER HO-1;Lo;0;L;;;;;N;;;;;
+1B0BB;HENTAIGANA LETTER HO-2;Lo;0;L;;;;;N;;;;;
+1B0BC;HENTAIGANA LETTER HO-3;Lo;0;L;;;;;N;;;;;
+1B0BD;HENTAIGANA LETTER HO-4;Lo;0;L;;;;;N;;;;;
+1B0BE;HENTAIGANA LETTER HO-5;Lo;0;L;;;;;N;;;;;
+1B0BF;HENTAIGANA LETTER HO-6;Lo;0;L;;;;;N;;;;;
+1B0C0;HENTAIGANA LETTER HO-7;Lo;0;L;;;;;N;;;;;
+1B0C1;HENTAIGANA LETTER HO-8;Lo;0;L;;;;;N;;;;;
+1B0C2;HENTAIGANA LETTER MA-1;Lo;0;L;;;;;N;;;;;
+1B0C3;HENTAIGANA LETTER MA-2;Lo;0;L;;;;;N;;;;;
+1B0C4;HENTAIGANA LETTER MA-3;Lo;0;L;;;;;N;;;;;
+1B0C5;HENTAIGANA LETTER MA-4;Lo;0;L;;;;;N;;;;;
+1B0C6;HENTAIGANA LETTER MA-5;Lo;0;L;;;;;N;;;;;
+1B0C7;HENTAIGANA LETTER MA-6;Lo;0;L;;;;;N;;;;;
+1B0C8;HENTAIGANA LETTER MA-7;Lo;0;L;;;;;N;;;;;
+1B0C9;HENTAIGANA LETTER MI-1;Lo;0;L;;;;;N;;;;;
+1B0CA;HENTAIGANA LETTER MI-2;Lo;0;L;;;;;N;;;;;
+1B0CB;HENTAIGANA LETTER MI-3;Lo;0;L;;;;;N;;;;;
+1B0CC;HENTAIGANA LETTER MI-4;Lo;0;L;;;;;N;;;;;
+1B0CD;HENTAIGANA LETTER MI-5;Lo;0;L;;;;;N;;;;;
+1B0CE;HENTAIGANA LETTER MI-6;Lo;0;L;;;;;N;;;;;
+1B0CF;HENTAIGANA LETTER MI-7;Lo;0;L;;;;;N;;;;;
+1B0D0;HENTAIGANA LETTER MU-1;Lo;0;L;;;;;N;;;;;
+1B0D1;HENTAIGANA LETTER MU-2;Lo;0;L;;;;;N;;;;;
+1B0D2;HENTAIGANA LETTER MU-3;Lo;0;L;;;;;N;;;;;
+1B0D3;HENTAIGANA LETTER MU-4;Lo;0;L;;;;;N;;;;;
+1B0D4;HENTAIGANA LETTER ME-1;Lo;0;L;;;;;N;;;;;
+1B0D5;HENTAIGANA LETTER ME-2;Lo;0;L;;;;;N;;;;;
+1B0D6;HENTAIGANA LETTER ME-MA;Lo;0;L;;;;;N;;;;;
+1B0D7;HENTAIGANA LETTER MO-1;Lo;0;L;;;;;N;;;;;
+1B0D8;HENTAIGANA LETTER MO-2;Lo;0;L;;;;;N;;;;;
+1B0D9;HENTAIGANA LETTER MO-3;Lo;0;L;;;;;N;;;;;
+1B0DA;HENTAIGANA LETTER MO-4;Lo;0;L;;;;;N;;;;;
+1B0DB;HENTAIGANA LETTER MO-5;Lo;0;L;;;;;N;;;;;
+1B0DC;HENTAIGANA LETTER MO-6;Lo;0;L;;;;;N;;;;;
+1B0DD;HENTAIGANA LETTER YA-1;Lo;0;L;;;;;N;;;;;
+1B0DE;HENTAIGANA LETTER YA-2;Lo;0;L;;;;;N;;;;;
+1B0DF;HENTAIGANA LETTER YA-3;Lo;0;L;;;;;N;;;;;
+1B0E0;HENTAIGANA LETTER YA-4;Lo;0;L;;;;;N;;;;;
+1B0E1;HENTAIGANA LETTER YA-5;Lo;0;L;;;;;N;;;;;
+1B0E2;HENTAIGANA LETTER YA-YO;Lo;0;L;;;;;N;;;;;
+1B0E3;HENTAIGANA LETTER YU-1;Lo;0;L;;;;;N;;;;;
+1B0E4;HENTAIGANA LETTER YU-2;Lo;0;L;;;;;N;;;;;
+1B0E5;HENTAIGANA LETTER YU-3;Lo;0;L;;;;;N;;;;;
+1B0E6;HENTAIGANA LETTER YU-4;Lo;0;L;;;;;N;;;;;
+1B0E7;HENTAIGANA LETTER YO-1;Lo;0;L;;;;;N;;;;;
+1B0E8;HENTAIGANA LETTER YO-2;Lo;0;L;;;;;N;;;;;
+1B0E9;HENTAIGANA LETTER YO-3;Lo;0;L;;;;;N;;;;;
+1B0EA;HENTAIGANA LETTER YO-4;Lo;0;L;;;;;N;;;;;
+1B0EB;HENTAIGANA LETTER YO-5;Lo;0;L;;;;;N;;;;;
+1B0EC;HENTAIGANA LETTER YO-6;Lo;0;L;;;;;N;;;;;
+1B0ED;HENTAIGANA LETTER RA-1;Lo;0;L;;;;;N;;;;;
+1B0EE;HENTAIGANA LETTER RA-2;Lo;0;L;;;;;N;;;;;
+1B0EF;HENTAIGANA LETTER RA-3;Lo;0;L;;;;;N;;;;;
+1B0F0;HENTAIGANA LETTER RA-4;Lo;0;L;;;;;N;;;;;
+1B0F1;HENTAIGANA LETTER RI-1;Lo;0;L;;;;;N;;;;;
+1B0F2;HENTAIGANA LETTER RI-2;Lo;0;L;;;;;N;;;;;
+1B0F3;HENTAIGANA LETTER RI-3;Lo;0;L;;;;;N;;;;;
+1B0F4;HENTAIGANA LETTER RI-4;Lo;0;L;;;;;N;;;;;
+1B0F5;HENTAIGANA LETTER RI-5;Lo;0;L;;;;;N;;;;;
+1B0F6;HENTAIGANA LETTER RI-6;Lo;0;L;;;;;N;;;;;
+1B0F7;HENTAIGANA LETTER RI-7;Lo;0;L;;;;;N;;;;;
+1B0F8;HENTAIGANA LETTER RU-1;Lo;0;L;;;;;N;;;;;
+1B0F9;HENTAIGANA LETTER RU-2;Lo;0;L;;;;;N;;;;;
+1B0FA;HENTAIGANA LETTER RU-3;Lo;0;L;;;;;N;;;;;
+1B0FB;HENTAIGANA LETTER RU-4;Lo;0;L;;;;;N;;;;;
+1B0FC;HENTAIGANA LETTER RU-5;Lo;0;L;;;;;N;;;;;
+1B0FD;HENTAIGANA LETTER RU-6;Lo;0;L;;;;;N;;;;;
+1B0FE;HENTAIGANA LETTER RE-1;Lo;0;L;;;;;N;;;;;
+1B0FF;HENTAIGANA LETTER RE-2;Lo;0;L;;;;;N;;;;;
+1B100;HENTAIGANA LETTER RE-3;Lo;0;L;;;;;N;;;;;
+1B101;HENTAIGANA LETTER RE-4;Lo;0;L;;;;;N;;;;;
+1B102;HENTAIGANA LETTER RO-1;Lo;0;L;;;;;N;;;;;
+1B103;HENTAIGANA LETTER RO-2;Lo;0;L;;;;;N;;;;;
+1B104;HENTAIGANA LETTER RO-3;Lo;0;L;;;;;N;;;;;
+1B105;HENTAIGANA LETTER RO-4;Lo;0;L;;;;;N;;;;;
+1B106;HENTAIGANA LETTER RO-5;Lo;0;L;;;;;N;;;;;
+1B107;HENTAIGANA LETTER RO-6;Lo;0;L;;;;;N;;;;;
+1B108;HENTAIGANA LETTER WA-1;Lo;0;L;;;;;N;;;;;
+1B109;HENTAIGANA LETTER WA-2;Lo;0;L;;;;;N;;;;;
+1B10A;HENTAIGANA LETTER WA-3;Lo;0;L;;;;;N;;;;;
+1B10B;HENTAIGANA LETTER WA-4;Lo;0;L;;;;;N;;;;;
+1B10C;HENTAIGANA LETTER WA-5;Lo;0;L;;;;;N;;;;;
+1B10D;HENTAIGANA LETTER WI-1;Lo;0;L;;;;;N;;;;;
+1B10E;HENTAIGANA LETTER WI-2;Lo;0;L;;;;;N;;;;;
+1B10F;HENTAIGANA LETTER WI-3;Lo;0;L;;;;;N;;;;;
+1B110;HENTAIGANA LETTER WI-4;Lo;0;L;;;;;N;;;;;
+1B111;HENTAIGANA LETTER WI-5;Lo;0;L;;;;;N;;;;;
+1B112;HENTAIGANA LETTER WE-1;Lo;0;L;;;;;N;;;;;
+1B113;HENTAIGANA LETTER WE-2;Lo;0;L;;;;;N;;;;;
+1B114;HENTAIGANA LETTER WE-3;Lo;0;L;;;;;N;;;;;
+1B115;HENTAIGANA LETTER WE-4;Lo;0;L;;;;;N;;;;;
+1B116;HENTAIGANA LETTER WO-1;Lo;0;L;;;;;N;;;;;
+1B117;HENTAIGANA LETTER WO-2;Lo;0;L;;;;;N;;;;;
+1B118;HENTAIGANA LETTER WO-3;Lo;0;L;;;;;N;;;;;
+1B119;HENTAIGANA LETTER WO-4;Lo;0;L;;;;;N;;;;;
+1B11A;HENTAIGANA LETTER WO-5;Lo;0;L;;;;;N;;;;;
+1B11B;HENTAIGANA LETTER WO-6;Lo;0;L;;;;;N;;;;;
+1B11C;HENTAIGANA LETTER WO-7;Lo;0;L;;;;;N;;;;;
+1B11D;HENTAIGANA LETTER N-MU-MO-1;Lo;0;L;;;;;N;;;;;
+1B11E;HENTAIGANA LETTER N-MU-MO-2;Lo;0;L;;;;;N;;;;;
+1B170;NUSHU CHARACTER-1B170;Lo;0;L;;;;;N;;;;;
+1B171;NUSHU CHARACTER-1B171;Lo;0;L;;;;;N;;;;;
+1B172;NUSHU CHARACTER-1B172;Lo;0;L;;;;;N;;;;;
+1B173;NUSHU CHARACTER-1B173;Lo;0;L;;;;;N;;;;;
+1B174;NUSHU CHARACTER-1B174;Lo;0;L;;;;;N;;;;;
+1B175;NUSHU CHARACTER-1B175;Lo;0;L;;;;;N;;;;;
+1B176;NUSHU CHARACTER-1B176;Lo;0;L;;;;;N;;;;;
+1B177;NUSHU CHARACTER-1B177;Lo;0;L;;;;;N;;;;;
+1B178;NUSHU CHARACTER-1B178;Lo;0;L;;;;;N;;;;;
+1B179;NUSHU CHARACTER-1B179;Lo;0;L;;;;;N;;;;;
+1B17A;NUSHU CHARACTER-1B17A;Lo;0;L;;;;;N;;;;;
+1B17B;NUSHU CHARACTER-1B17B;Lo;0;L;;;;;N;;;;;
+1B17C;NUSHU CHARACTER-1B17C;Lo;0;L;;;;;N;;;;;
+1B17D;NUSHU CHARACTER-1B17D;Lo;0;L;;;;;N;;;;;
+1B17E;NUSHU CHARACTER-1B17E;Lo;0;L;;;;;N;;;;;
+1B17F;NUSHU CHARACTER-1B17F;Lo;0;L;;;;;N;;;;;
+1B180;NUSHU CHARACTER-1B180;Lo;0;L;;;;;N;;;;;
+1B181;NUSHU CHARACTER-1B181;Lo;0;L;;;;;N;;;;;
+1B182;NUSHU CHARACTER-1B182;Lo;0;L;;;;;N;;;;;
+1B183;NUSHU CHARACTER-1B183;Lo;0;L;;;;;N;;;;;
+1B184;NUSHU CHARACTER-1B184;Lo;0;L;;;;;N;;;;;
+1B185;NUSHU CHARACTER-1B185;Lo;0;L;;;;;N;;;;;
+1B186;NUSHU CHARACTER-1B186;Lo;0;L;;;;;N;;;;;
+1B187;NUSHU CHARACTER-1B187;Lo;0;L;;;;;N;;;;;
+1B188;NUSHU CHARACTER-1B188;Lo;0;L;;;;;N;;;;;
+1B189;NUSHU CHARACTER-1B189;Lo;0;L;;;;;N;;;;;
+1B18A;NUSHU CHARACTER-1B18A;Lo;0;L;;;;;N;;;;;
+1B18B;NUSHU CHARACTER-1B18B;Lo;0;L;;;;;N;;;;;
+1B18C;NUSHU CHARACTER-1B18C;Lo;0;L;;;;;N;;;;;
+1B18D;NUSHU CHARACTER-1B18D;Lo;0;L;;;;;N;;;;;
+1B18E;NUSHU CHARACTER-1B18E;Lo;0;L;;;;;N;;;;;
+1B18F;NUSHU CHARACTER-1B18F;Lo;0;L;;;;;N;;;;;
+1B190;NUSHU CHARACTER-1B190;Lo;0;L;;;;;N;;;;;
+1B191;NUSHU CHARACTER-1B191;Lo;0;L;;;;;N;;;;;
+1B192;NUSHU CHARACTER-1B192;Lo;0;L;;;;;N;;;;;
+1B193;NUSHU CHARACTER-1B193;Lo;0;L;;;;;N;;;;;
+1B194;NUSHU CHARACTER-1B194;Lo;0;L;;;;;N;;;;;
+1B195;NUSHU CHARACTER-1B195;Lo;0;L;;;;;N;;;;;
+1B196;NUSHU CHARACTER-1B196;Lo;0;L;;;;;N;;;;;
+1B197;NUSHU CHARACTER-1B197;Lo;0;L;;;;;N;;;;;
+1B198;NUSHU CHARACTER-1B198;Lo;0;L;;;;;N;;;;;
+1B199;NUSHU CHARACTER-1B199;Lo;0;L;;;;;N;;;;;
+1B19A;NUSHU CHARACTER-1B19A;Lo;0;L;;;;;N;;;;;
+1B19B;NUSHU CHARACTER-1B19B;Lo;0;L;;;;;N;;;;;
+1B19C;NUSHU CHARACTER-1B19C;Lo;0;L;;;;;N;;;;;
+1B19D;NUSHU CHARACTER-1B19D;Lo;0;L;;;;;N;;;;;
+1B19E;NUSHU CHARACTER-1B19E;Lo;0;L;;;;;N;;;;;
+1B19F;NUSHU CHARACTER-1B19F;Lo;0;L;;;;;N;;;;;
+1B1A0;NUSHU CHARACTER-1B1A0;Lo;0;L;;;;;N;;;;;
+1B1A1;NUSHU CHARACTER-1B1A1;Lo;0;L;;;;;N;;;;;
+1B1A2;NUSHU CHARACTER-1B1A2;Lo;0;L;;;;;N;;;;;
+1B1A3;NUSHU CHARACTER-1B1A3;Lo;0;L;;;;;N;;;;;
+1B1A4;NUSHU CHARACTER-1B1A4;Lo;0;L;;;;;N;;;;;
+1B1A5;NUSHU CHARACTER-1B1A5;Lo;0;L;;;;;N;;;;;
+1B1A6;NUSHU CHARACTER-1B1A6;Lo;0;L;;;;;N;;;;;
+1B1A7;NUSHU CHARACTER-1B1A7;Lo;0;L;;;;;N;;;;;
+1B1A8;NUSHU CHARACTER-1B1A8;Lo;0;L;;;;;N;;;;;
+1B1A9;NUSHU CHARACTER-1B1A9;Lo;0;L;;;;;N;;;;;
+1B1AA;NUSHU CHARACTER-1B1AA;Lo;0;L;;;;;N;;;;;
+1B1AB;NUSHU CHARACTER-1B1AB;Lo;0;L;;;;;N;;;;;
+1B1AC;NUSHU CHARACTER-1B1AC;Lo;0;L;;;;;N;;;;;
+1B1AD;NUSHU CHARACTER-1B1AD;Lo;0;L;;;;;N;;;;;
+1B1AE;NUSHU CHARACTER-1B1AE;Lo;0;L;;;;;N;;;;;
+1B1AF;NUSHU CHARACTER-1B1AF;Lo;0;L;;;;;N;;;;;
+1B1B0;NUSHU CHARACTER-1B1B0;Lo;0;L;;;;;N;;;;;
+1B1B1;NUSHU CHARACTER-1B1B1;Lo;0;L;;;;;N;;;;;
+1B1B2;NUSHU CHARACTER-1B1B2;Lo;0;L;;;;;N;;;;;
+1B1B3;NUSHU CHARACTER-1B1B3;Lo;0;L;;;;;N;;;;;
+1B1B4;NUSHU CHARACTER-1B1B4;Lo;0;L;;;;;N;;;;;
+1B1B5;NUSHU CHARACTER-1B1B5;Lo;0;L;;;;;N;;;;;
+1B1B6;NUSHU CHARACTER-1B1B6;Lo;0;L;;;;;N;;;;;
+1B1B7;NUSHU CHARACTER-1B1B7;Lo;0;L;;;;;N;;;;;
+1B1B8;NUSHU CHARACTER-1B1B8;Lo;0;L;;;;;N;;;;;
+1B1B9;NUSHU CHARACTER-1B1B9;Lo;0;L;;;;;N;;;;;
+1B1BA;NUSHU CHARACTER-1B1BA;Lo;0;L;;;;;N;;;;;
+1B1BB;NUSHU CHARACTER-1B1BB;Lo;0;L;;;;;N;;;;;
+1B1BC;NUSHU CHARACTER-1B1BC;Lo;0;L;;;;;N;;;;;
+1B1BD;NUSHU CHARACTER-1B1BD;Lo;0;L;;;;;N;;;;;
+1B1BE;NUSHU CHARACTER-1B1BE;Lo;0;L;;;;;N;;;;;
+1B1BF;NUSHU CHARACTER-1B1BF;Lo;0;L;;;;;N;;;;;
+1B1C0;NUSHU CHARACTER-1B1C0;Lo;0;L;;;;;N;;;;;
+1B1C1;NUSHU CHARACTER-1B1C1;Lo;0;L;;;;;N;;;;;
+1B1C2;NUSHU CHARACTER-1B1C2;Lo;0;L;;;;;N;;;;;
+1B1C3;NUSHU CHARACTER-1B1C3;Lo;0;L;;;;;N;;;;;
+1B1C4;NUSHU CHARACTER-1B1C4;Lo;0;L;;;;;N;;;;;
+1B1C5;NUSHU CHARACTER-1B1C5;Lo;0;L;;;;;N;;;;;
+1B1C6;NUSHU CHARACTER-1B1C6;Lo;0;L;;;;;N;;;;;
+1B1C7;NUSHU CHARACTER-1B1C7;Lo;0;L;;;;;N;;;;;
+1B1C8;NUSHU CHARACTER-1B1C8;Lo;0;L;;;;;N;;;;;
+1B1C9;NUSHU CHARACTER-1B1C9;Lo;0;L;;;;;N;;;;;
+1B1CA;NUSHU CHARACTER-1B1CA;Lo;0;L;;;;;N;;;;;
+1B1CB;NUSHU CHARACTER-1B1CB;Lo;0;L;;;;;N;;;;;
+1B1CC;NUSHU CHARACTER-1B1CC;Lo;0;L;;;;;N;;;;;
+1B1CD;NUSHU CHARACTER-1B1CD;Lo;0;L;;;;;N;;;;;
+1B1CE;NUSHU CHARACTER-1B1CE;Lo;0;L;;;;;N;;;;;
+1B1CF;NUSHU CHARACTER-1B1CF;Lo;0;L;;;;;N;;;;;
+1B1D0;NUSHU CHARACTER-1B1D0;Lo;0;L;;;;;N;;;;;
+1B1D1;NUSHU CHARACTER-1B1D1;Lo;0;L;;;;;N;;;;;
+1B1D2;NUSHU CHARACTER-1B1D2;Lo;0;L;;;;;N;;;;;
+1B1D3;NUSHU CHARACTER-1B1D3;Lo;0;L;;;;;N;;;;;
+1B1D4;NUSHU CHARACTER-1B1D4;Lo;0;L;;;;;N;;;;;
+1B1D5;NUSHU CHARACTER-1B1D5;Lo;0;L;;;;;N;;;;;
+1B1D6;NUSHU CHARACTER-1B1D6;Lo;0;L;;;;;N;;;;;
+1B1D7;NUSHU CHARACTER-1B1D7;Lo;0;L;;;;;N;;;;;
+1B1D8;NUSHU CHARACTER-1B1D8;Lo;0;L;;;;;N;;;;;
+1B1D9;NUSHU CHARACTER-1B1D9;Lo;0;L;;;;;N;;;;;
+1B1DA;NUSHU CHARACTER-1B1DA;Lo;0;L;;;;;N;;;;;
+1B1DB;NUSHU CHARACTER-1B1DB;Lo;0;L;;;;;N;;;;;
+1B1DC;NUSHU CHARACTER-1B1DC;Lo;0;L;;;;;N;;;;;
+1B1DD;NUSHU CHARACTER-1B1DD;Lo;0;L;;;;;N;;;;;
+1B1DE;NUSHU CHARACTER-1B1DE;Lo;0;L;;;;;N;;;;;
+1B1DF;NUSHU CHARACTER-1B1DF;Lo;0;L;;;;;N;;;;;
+1B1E0;NUSHU CHARACTER-1B1E0;Lo;0;L;;;;;N;;;;;
+1B1E1;NUSHU CHARACTER-1B1E1;Lo;0;L;;;;;N;;;;;
+1B1E2;NUSHU CHARACTER-1B1E2;Lo;0;L;;;;;N;;;;;
+1B1E3;NUSHU CHARACTER-1B1E3;Lo;0;L;;;;;N;;;;;
+1B1E4;NUSHU CHARACTER-1B1E4;Lo;0;L;;;;;N;;;;;
+1B1E5;NUSHU CHARACTER-1B1E5;Lo;0;L;;;;;N;;;;;
+1B1E6;NUSHU CHARACTER-1B1E6;Lo;0;L;;;;;N;;;;;
+1B1E7;NUSHU CHARACTER-1B1E7;Lo;0;L;;;;;N;;;;;
+1B1E8;NUSHU CHARACTER-1B1E8;Lo;0;L;;;;;N;;;;;
+1B1E9;NUSHU CHARACTER-1B1E9;Lo;0;L;;;;;N;;;;;
+1B1EA;NUSHU CHARACTER-1B1EA;Lo;0;L;;;;;N;;;;;
+1B1EB;NUSHU CHARACTER-1B1EB;Lo;0;L;;;;;N;;;;;
+1B1EC;NUSHU CHARACTER-1B1EC;Lo;0;L;;;;;N;;;;;
+1B1ED;NUSHU CHARACTER-1B1ED;Lo;0;L;;;;;N;;;;;
+1B1EE;NUSHU CHARACTER-1B1EE;Lo;0;L;;;;;N;;;;;
+1B1EF;NUSHU CHARACTER-1B1EF;Lo;0;L;;;;;N;;;;;
+1B1F0;NUSHU CHARACTER-1B1F0;Lo;0;L;;;;;N;;;;;
+1B1F1;NUSHU CHARACTER-1B1F1;Lo;0;L;;;;;N;;;;;
+1B1F2;NUSHU CHARACTER-1B1F2;Lo;0;L;;;;;N;;;;;
+1B1F3;NUSHU CHARACTER-1B1F3;Lo;0;L;;;;;N;;;;;
+1B1F4;NUSHU CHARACTER-1B1F4;Lo;0;L;;;;;N;;;;;
+1B1F5;NUSHU CHARACTER-1B1F5;Lo;0;L;;;;;N;;;;;
+1B1F6;NUSHU CHARACTER-1B1F6;Lo;0;L;;;;;N;;;;;
+1B1F7;NUSHU CHARACTER-1B1F7;Lo;0;L;;;;;N;;;;;
+1B1F8;NUSHU CHARACTER-1B1F8;Lo;0;L;;;;;N;;;;;
+1B1F9;NUSHU CHARACTER-1B1F9;Lo;0;L;;;;;N;;;;;
+1B1FA;NUSHU CHARACTER-1B1FA;Lo;0;L;;;;;N;;;;;
+1B1FB;NUSHU CHARACTER-1B1FB;Lo;0;L;;;;;N;;;;;
+1B1FC;NUSHU CHARACTER-1B1FC;Lo;0;L;;;;;N;;;;;
+1B1FD;NUSHU CHARACTER-1B1FD;Lo;0;L;;;;;N;;;;;
+1B1FE;NUSHU CHARACTER-1B1FE;Lo;0;L;;;;;N;;;;;
+1B1FF;NUSHU CHARACTER-1B1FF;Lo;0;L;;;;;N;;;;;
+1B200;NUSHU CHARACTER-1B200;Lo;0;L;;;;;N;;;;;
+1B201;NUSHU CHARACTER-1B201;Lo;0;L;;;;;N;;;;;
+1B202;NUSHU CHARACTER-1B202;Lo;0;L;;;;;N;;;;;
+1B203;NUSHU CHARACTER-1B203;Lo;0;L;;;;;N;;;;;
+1B204;NUSHU CHARACTER-1B204;Lo;0;L;;;;;N;;;;;
+1B205;NUSHU CHARACTER-1B205;Lo;0;L;;;;;N;;;;;
+1B206;NUSHU CHARACTER-1B206;Lo;0;L;;;;;N;;;;;
+1B207;NUSHU CHARACTER-1B207;Lo;0;L;;;;;N;;;;;
+1B208;NUSHU CHARACTER-1B208;Lo;0;L;;;;;N;;;;;
+1B209;NUSHU CHARACTER-1B209;Lo;0;L;;;;;N;;;;;
+1B20A;NUSHU CHARACTER-1B20A;Lo;0;L;;;;;N;;;;;
+1B20B;NUSHU CHARACTER-1B20B;Lo;0;L;;;;;N;;;;;
+1B20C;NUSHU CHARACTER-1B20C;Lo;0;L;;;;;N;;;;;
+1B20D;NUSHU CHARACTER-1B20D;Lo;0;L;;;;;N;;;;;
+1B20E;NUSHU CHARACTER-1B20E;Lo;0;L;;;;;N;;;;;
+1B20F;NUSHU CHARACTER-1B20F;Lo;0;L;;;;;N;;;;;
+1B210;NUSHU CHARACTER-1B210;Lo;0;L;;;;;N;;;;;
+1B211;NUSHU CHARACTER-1B211;Lo;0;L;;;;;N;;;;;
+1B212;NUSHU CHARACTER-1B212;Lo;0;L;;;;;N;;;;;
+1B213;NUSHU CHARACTER-1B213;Lo;0;L;;;;;N;;;;;
+1B214;NUSHU CHARACTER-1B214;Lo;0;L;;;;;N;;;;;
+1B215;NUSHU CHARACTER-1B215;Lo;0;L;;;;;N;;;;;
+1B216;NUSHU CHARACTER-1B216;Lo;0;L;;;;;N;;;;;
+1B217;NUSHU CHARACTER-1B217;Lo;0;L;;;;;N;;;;;
+1B218;NUSHU CHARACTER-1B218;Lo;0;L;;;;;N;;;;;
+1B219;NUSHU CHARACTER-1B219;Lo;0;L;;;;;N;;;;;
+1B21A;NUSHU CHARACTER-1B21A;Lo;0;L;;;;;N;;;;;
+1B21B;NUSHU CHARACTER-1B21B;Lo;0;L;;;;;N;;;;;
+1B21C;NUSHU CHARACTER-1B21C;Lo;0;L;;;;;N;;;;;
+1B21D;NUSHU CHARACTER-1B21D;Lo;0;L;;;;;N;;;;;
+1B21E;NUSHU CHARACTER-1B21E;Lo;0;L;;;;;N;;;;;
+1B21F;NUSHU CHARACTER-1B21F;Lo;0;L;;;;;N;;;;;
+1B220;NUSHU CHARACTER-1B220;Lo;0;L;;;;;N;;;;;
+1B221;NUSHU CHARACTER-1B221;Lo;0;L;;;;;N;;;;;
+1B222;NUSHU CHARACTER-1B222;Lo;0;L;;;;;N;;;;;
+1B223;NUSHU CHARACTER-1B223;Lo;0;L;;;;;N;;;;;
+1B224;NUSHU CHARACTER-1B224;Lo;0;L;;;;;N;;;;;
+1B225;NUSHU CHARACTER-1B225;Lo;0;L;;;;;N;;;;;
+1B226;NUSHU CHARACTER-1B226;Lo;0;L;;;;;N;;;;;
+1B227;NUSHU CHARACTER-1B227;Lo;0;L;;;;;N;;;;;
+1B228;NUSHU CHARACTER-1B228;Lo;0;L;;;;;N;;;;;
+1B229;NUSHU CHARACTER-1B229;Lo;0;L;;;;;N;;;;;
+1B22A;NUSHU CHARACTER-1B22A;Lo;0;L;;;;;N;;;;;
+1B22B;NUSHU CHARACTER-1B22B;Lo;0;L;;;;;N;;;;;
+1B22C;NUSHU CHARACTER-1B22C;Lo;0;L;;;;;N;;;;;
+1B22D;NUSHU CHARACTER-1B22D;Lo;0;L;;;;;N;;;;;
+1B22E;NUSHU CHARACTER-1B22E;Lo;0;L;;;;;N;;;;;
+1B22F;NUSHU CHARACTER-1B22F;Lo;0;L;;;;;N;;;;;
+1B230;NUSHU CHARACTER-1B230;Lo;0;L;;;;;N;;;;;
+1B231;NUSHU CHARACTER-1B231;Lo;0;L;;;;;N;;;;;
+1B232;NUSHU CHARACTER-1B232;Lo;0;L;;;;;N;;;;;
+1B233;NUSHU CHARACTER-1B233;Lo;0;L;;;;;N;;;;;
+1B234;NUSHU CHARACTER-1B234;Lo;0;L;;;;;N;;;;;
+1B235;NUSHU CHARACTER-1B235;Lo;0;L;;;;;N;;;;;
+1B236;NUSHU CHARACTER-1B236;Lo;0;L;;;;;N;;;;;
+1B237;NUSHU CHARACTER-1B237;Lo;0;L;;;;;N;;;;;
+1B238;NUSHU CHARACTER-1B238;Lo;0;L;;;;;N;;;;;
+1B239;NUSHU CHARACTER-1B239;Lo;0;L;;;;;N;;;;;
+1B23A;NUSHU CHARACTER-1B23A;Lo;0;L;;;;;N;;;;;
+1B23B;NUSHU CHARACTER-1B23B;Lo;0;L;;;;;N;;;;;
+1B23C;NUSHU CHARACTER-1B23C;Lo;0;L;;;;;N;;;;;
+1B23D;NUSHU CHARACTER-1B23D;Lo;0;L;;;;;N;;;;;
+1B23E;NUSHU CHARACTER-1B23E;Lo;0;L;;;;;N;;;;;
+1B23F;NUSHU CHARACTER-1B23F;Lo;0;L;;;;;N;;;;;
+1B240;NUSHU CHARACTER-1B240;Lo;0;L;;;;;N;;;;;
+1B241;NUSHU CHARACTER-1B241;Lo;0;L;;;;;N;;;;;
+1B242;NUSHU CHARACTER-1B242;Lo;0;L;;;;;N;;;;;
+1B243;NUSHU CHARACTER-1B243;Lo;0;L;;;;;N;;;;;
+1B244;NUSHU CHARACTER-1B244;Lo;0;L;;;;;N;;;;;
+1B245;NUSHU CHARACTER-1B245;Lo;0;L;;;;;N;;;;;
+1B246;NUSHU CHARACTER-1B246;Lo;0;L;;;;;N;;;;;
+1B247;NUSHU CHARACTER-1B247;Lo;0;L;;;;;N;;;;;
+1B248;NUSHU CHARACTER-1B248;Lo;0;L;;;;;N;;;;;
+1B249;NUSHU CHARACTER-1B249;Lo;0;L;;;;;N;;;;;
+1B24A;NUSHU CHARACTER-1B24A;Lo;0;L;;;;;N;;;;;
+1B24B;NUSHU CHARACTER-1B24B;Lo;0;L;;;;;N;;;;;
+1B24C;NUSHU CHARACTER-1B24C;Lo;0;L;;;;;N;;;;;
+1B24D;NUSHU CHARACTER-1B24D;Lo;0;L;;;;;N;;;;;
+1B24E;NUSHU CHARACTER-1B24E;Lo;0;L;;;;;N;;;;;
+1B24F;NUSHU CHARACTER-1B24F;Lo;0;L;;;;;N;;;;;
+1B250;NUSHU CHARACTER-1B250;Lo;0;L;;;;;N;;;;;
+1B251;NUSHU CHARACTER-1B251;Lo;0;L;;;;;N;;;;;
+1B252;NUSHU CHARACTER-1B252;Lo;0;L;;;;;N;;;;;
+1B253;NUSHU CHARACTER-1B253;Lo;0;L;;;;;N;;;;;
+1B254;NUSHU CHARACTER-1B254;Lo;0;L;;;;;N;;;;;
+1B255;NUSHU CHARACTER-1B255;Lo;0;L;;;;;N;;;;;
+1B256;NUSHU CHARACTER-1B256;Lo;0;L;;;;;N;;;;;
+1B257;NUSHU CHARACTER-1B257;Lo;0;L;;;;;N;;;;;
+1B258;NUSHU CHARACTER-1B258;Lo;0;L;;;;;N;;;;;
+1B259;NUSHU CHARACTER-1B259;Lo;0;L;;;;;N;;;;;
+1B25A;NUSHU CHARACTER-1B25A;Lo;0;L;;;;;N;;;;;
+1B25B;NUSHU CHARACTER-1B25B;Lo;0;L;;;;;N;;;;;
+1B25C;NUSHU CHARACTER-1B25C;Lo;0;L;;;;;N;;;;;
+1B25D;NUSHU CHARACTER-1B25D;Lo;0;L;;;;;N;;;;;
+1B25E;NUSHU CHARACTER-1B25E;Lo;0;L;;;;;N;;;;;
+1B25F;NUSHU CHARACTER-1B25F;Lo;0;L;;;;;N;;;;;
+1B260;NUSHU CHARACTER-1B260;Lo;0;L;;;;;N;;;;;
+1B261;NUSHU CHARACTER-1B261;Lo;0;L;;;;;N;;;;;
+1B262;NUSHU CHARACTER-1B262;Lo;0;L;;;;;N;;;;;
+1B263;NUSHU CHARACTER-1B263;Lo;0;L;;;;;N;;;;;
+1B264;NUSHU CHARACTER-1B264;Lo;0;L;;;;;N;;;;;
+1B265;NUSHU CHARACTER-1B265;Lo;0;L;;;;;N;;;;;
+1B266;NUSHU CHARACTER-1B266;Lo;0;L;;;;;N;;;;;
+1B267;NUSHU CHARACTER-1B267;Lo;0;L;;;;;N;;;;;
+1B268;NUSHU CHARACTER-1B268;Lo;0;L;;;;;N;;;;;
+1B269;NUSHU CHARACTER-1B269;Lo;0;L;;;;;N;;;;;
+1B26A;NUSHU CHARACTER-1B26A;Lo;0;L;;;;;N;;;;;
+1B26B;NUSHU CHARACTER-1B26B;Lo;0;L;;;;;N;;;;;
+1B26C;NUSHU CHARACTER-1B26C;Lo;0;L;;;;;N;;;;;
+1B26D;NUSHU CHARACTER-1B26D;Lo;0;L;;;;;N;;;;;
+1B26E;NUSHU CHARACTER-1B26E;Lo;0;L;;;;;N;;;;;
+1B26F;NUSHU CHARACTER-1B26F;Lo;0;L;;;;;N;;;;;
+1B270;NUSHU CHARACTER-1B270;Lo;0;L;;;;;N;;;;;
+1B271;NUSHU CHARACTER-1B271;Lo;0;L;;;;;N;;;;;
+1B272;NUSHU CHARACTER-1B272;Lo;0;L;;;;;N;;;;;
+1B273;NUSHU CHARACTER-1B273;Lo;0;L;;;;;N;;;;;
+1B274;NUSHU CHARACTER-1B274;Lo;0;L;;;;;N;;;;;
+1B275;NUSHU CHARACTER-1B275;Lo;0;L;;;;;N;;;;;
+1B276;NUSHU CHARACTER-1B276;Lo;0;L;;;;;N;;;;;
+1B277;NUSHU CHARACTER-1B277;Lo;0;L;;;;;N;;;;;
+1B278;NUSHU CHARACTER-1B278;Lo;0;L;;;;;N;;;;;
+1B279;NUSHU CHARACTER-1B279;Lo;0;L;;;;;N;;;;;
+1B27A;NUSHU CHARACTER-1B27A;Lo;0;L;;;;;N;;;;;
+1B27B;NUSHU CHARACTER-1B27B;Lo;0;L;;;;;N;;;;;
+1B27C;NUSHU CHARACTER-1B27C;Lo;0;L;;;;;N;;;;;
+1B27D;NUSHU CHARACTER-1B27D;Lo;0;L;;;;;N;;;;;
+1B27E;NUSHU CHARACTER-1B27E;Lo;0;L;;;;;N;;;;;
+1B27F;NUSHU CHARACTER-1B27F;Lo;0;L;;;;;N;;;;;
+1B280;NUSHU CHARACTER-1B280;Lo;0;L;;;;;N;;;;;
+1B281;NUSHU CHARACTER-1B281;Lo;0;L;;;;;N;;;;;
+1B282;NUSHU CHARACTER-1B282;Lo;0;L;;;;;N;;;;;
+1B283;NUSHU CHARACTER-1B283;Lo;0;L;;;;;N;;;;;
+1B284;NUSHU CHARACTER-1B284;Lo;0;L;;;;;N;;;;;
+1B285;NUSHU CHARACTER-1B285;Lo;0;L;;;;;N;;;;;
+1B286;NUSHU CHARACTER-1B286;Lo;0;L;;;;;N;;;;;
+1B287;NUSHU CHARACTER-1B287;Lo;0;L;;;;;N;;;;;
+1B288;NUSHU CHARACTER-1B288;Lo;0;L;;;;;N;;;;;
+1B289;NUSHU CHARACTER-1B289;Lo;0;L;;;;;N;;;;;
+1B28A;NUSHU CHARACTER-1B28A;Lo;0;L;;;;;N;;;;;
+1B28B;NUSHU CHARACTER-1B28B;Lo;0;L;;;;;N;;;;;
+1B28C;NUSHU CHARACTER-1B28C;Lo;0;L;;;;;N;;;;;
+1B28D;NUSHU CHARACTER-1B28D;Lo;0;L;;;;;N;;;;;
+1B28E;NUSHU CHARACTER-1B28E;Lo;0;L;;;;;N;;;;;
+1B28F;NUSHU CHARACTER-1B28F;Lo;0;L;;;;;N;;;;;
+1B290;NUSHU CHARACTER-1B290;Lo;0;L;;;;;N;;;;;
+1B291;NUSHU CHARACTER-1B291;Lo;0;L;;;;;N;;;;;
+1B292;NUSHU CHARACTER-1B292;Lo;0;L;;;;;N;;;;;
+1B293;NUSHU CHARACTER-1B293;Lo;0;L;;;;;N;;;;;
+1B294;NUSHU CHARACTER-1B294;Lo;0;L;;;;;N;;;;;
+1B295;NUSHU CHARACTER-1B295;Lo;0;L;;;;;N;;;;;
+1B296;NUSHU CHARACTER-1B296;Lo;0;L;;;;;N;;;;;
+1B297;NUSHU CHARACTER-1B297;Lo;0;L;;;;;N;;;;;
+1B298;NUSHU CHARACTER-1B298;Lo;0;L;;;;;N;;;;;
+1B299;NUSHU CHARACTER-1B299;Lo;0;L;;;;;N;;;;;
+1B29A;NUSHU CHARACTER-1B29A;Lo;0;L;;;;;N;;;;;
+1B29B;NUSHU CHARACTER-1B29B;Lo;0;L;;;;;N;;;;;
+1B29C;NUSHU CHARACTER-1B29C;Lo;0;L;;;;;N;;;;;
+1B29D;NUSHU CHARACTER-1B29D;Lo;0;L;;;;;N;;;;;
+1B29E;NUSHU CHARACTER-1B29E;Lo;0;L;;;;;N;;;;;
+1B29F;NUSHU CHARACTER-1B29F;Lo;0;L;;;;;N;;;;;
+1B2A0;NUSHU CHARACTER-1B2A0;Lo;0;L;;;;;N;;;;;
+1B2A1;NUSHU CHARACTER-1B2A1;Lo;0;L;;;;;N;;;;;
+1B2A2;NUSHU CHARACTER-1B2A2;Lo;0;L;;;;;N;;;;;
+1B2A3;NUSHU CHARACTER-1B2A3;Lo;0;L;;;;;N;;;;;
+1B2A4;NUSHU CHARACTER-1B2A4;Lo;0;L;;;;;N;;;;;
+1B2A5;NUSHU CHARACTER-1B2A5;Lo;0;L;;;;;N;;;;;
+1B2A6;NUSHU CHARACTER-1B2A6;Lo;0;L;;;;;N;;;;;
+1B2A7;NUSHU CHARACTER-1B2A7;Lo;0;L;;;;;N;;;;;
+1B2A8;NUSHU CHARACTER-1B2A8;Lo;0;L;;;;;N;;;;;
+1B2A9;NUSHU CHARACTER-1B2A9;Lo;0;L;;;;;N;;;;;
+1B2AA;NUSHU CHARACTER-1B2AA;Lo;0;L;;;;;N;;;;;
+1B2AB;NUSHU CHARACTER-1B2AB;Lo;0;L;;;;;N;;;;;
+1B2AC;NUSHU CHARACTER-1B2AC;Lo;0;L;;;;;N;;;;;
+1B2AD;NUSHU CHARACTER-1B2AD;Lo;0;L;;;;;N;;;;;
+1B2AE;NUSHU CHARACTER-1B2AE;Lo;0;L;;;;;N;;;;;
+1B2AF;NUSHU CHARACTER-1B2AF;Lo;0;L;;;;;N;;;;;
+1B2B0;NUSHU CHARACTER-1B2B0;Lo;0;L;;;;;N;;;;;
+1B2B1;NUSHU CHARACTER-1B2B1;Lo;0;L;;;;;N;;;;;
+1B2B2;NUSHU CHARACTER-1B2B2;Lo;0;L;;;;;N;;;;;
+1B2B3;NUSHU CHARACTER-1B2B3;Lo;0;L;;;;;N;;;;;
+1B2B4;NUSHU CHARACTER-1B2B4;Lo;0;L;;;;;N;;;;;
+1B2B5;NUSHU CHARACTER-1B2B5;Lo;0;L;;;;;N;;;;;
+1B2B6;NUSHU CHARACTER-1B2B6;Lo;0;L;;;;;N;;;;;
+1B2B7;NUSHU CHARACTER-1B2B7;Lo;0;L;;;;;N;;;;;
+1B2B8;NUSHU CHARACTER-1B2B8;Lo;0;L;;;;;N;;;;;
+1B2B9;NUSHU CHARACTER-1B2B9;Lo;0;L;;;;;N;;;;;
+1B2BA;NUSHU CHARACTER-1B2BA;Lo;0;L;;;;;N;;;;;
+1B2BB;NUSHU CHARACTER-1B2BB;Lo;0;L;;;;;N;;;;;
+1B2BC;NUSHU CHARACTER-1B2BC;Lo;0;L;;;;;N;;;;;
+1B2BD;NUSHU CHARACTER-1B2BD;Lo;0;L;;;;;N;;;;;
+1B2BE;NUSHU CHARACTER-1B2BE;Lo;0;L;;;;;N;;;;;
+1B2BF;NUSHU CHARACTER-1B2BF;Lo;0;L;;;;;N;;;;;
+1B2C0;NUSHU CHARACTER-1B2C0;Lo;0;L;;;;;N;;;;;
+1B2C1;NUSHU CHARACTER-1B2C1;Lo;0;L;;;;;N;;;;;
+1B2C2;NUSHU CHARACTER-1B2C2;Lo;0;L;;;;;N;;;;;
+1B2C3;NUSHU CHARACTER-1B2C3;Lo;0;L;;;;;N;;;;;
+1B2C4;NUSHU CHARACTER-1B2C4;Lo;0;L;;;;;N;;;;;
+1B2C5;NUSHU CHARACTER-1B2C5;Lo;0;L;;;;;N;;;;;
+1B2C6;NUSHU CHARACTER-1B2C6;Lo;0;L;;;;;N;;;;;
+1B2C7;NUSHU CHARACTER-1B2C7;Lo;0;L;;;;;N;;;;;
+1B2C8;NUSHU CHARACTER-1B2C8;Lo;0;L;;;;;N;;;;;
+1B2C9;NUSHU CHARACTER-1B2C9;Lo;0;L;;;;;N;;;;;
+1B2CA;NUSHU CHARACTER-1B2CA;Lo;0;L;;;;;N;;;;;
+1B2CB;NUSHU CHARACTER-1B2CB;Lo;0;L;;;;;N;;;;;
+1B2CC;NUSHU CHARACTER-1B2CC;Lo;0;L;;;;;N;;;;;
+1B2CD;NUSHU CHARACTER-1B2CD;Lo;0;L;;;;;N;;;;;
+1B2CE;NUSHU CHARACTER-1B2CE;Lo;0;L;;;;;N;;;;;
+1B2CF;NUSHU CHARACTER-1B2CF;Lo;0;L;;;;;N;;;;;
+1B2D0;NUSHU CHARACTER-1B2D0;Lo;0;L;;;;;N;;;;;
+1B2D1;NUSHU CHARACTER-1B2D1;Lo;0;L;;;;;N;;;;;
+1B2D2;NUSHU CHARACTER-1B2D2;Lo;0;L;;;;;N;;;;;
+1B2D3;NUSHU CHARACTER-1B2D3;Lo;0;L;;;;;N;;;;;
+1B2D4;NUSHU CHARACTER-1B2D4;Lo;0;L;;;;;N;;;;;
+1B2D5;NUSHU CHARACTER-1B2D5;Lo;0;L;;;;;N;;;;;
+1B2D6;NUSHU CHARACTER-1B2D6;Lo;0;L;;;;;N;;;;;
+1B2D7;NUSHU CHARACTER-1B2D7;Lo;0;L;;;;;N;;;;;
+1B2D8;NUSHU CHARACTER-1B2D8;Lo;0;L;;;;;N;;;;;
+1B2D9;NUSHU CHARACTER-1B2D9;Lo;0;L;;;;;N;;;;;
+1B2DA;NUSHU CHARACTER-1B2DA;Lo;0;L;;;;;N;;;;;
+1B2DB;NUSHU CHARACTER-1B2DB;Lo;0;L;;;;;N;;;;;
+1B2DC;NUSHU CHARACTER-1B2DC;Lo;0;L;;;;;N;;;;;
+1B2DD;NUSHU CHARACTER-1B2DD;Lo;0;L;;;;;N;;;;;
+1B2DE;NUSHU CHARACTER-1B2DE;Lo;0;L;;;;;N;;;;;
+1B2DF;NUSHU CHARACTER-1B2DF;Lo;0;L;;;;;N;;;;;
+1B2E0;NUSHU CHARACTER-1B2E0;Lo;0;L;;;;;N;;;;;
+1B2E1;NUSHU CHARACTER-1B2E1;Lo;0;L;;;;;N;;;;;
+1B2E2;NUSHU CHARACTER-1B2E2;Lo;0;L;;;;;N;;;;;
+1B2E3;NUSHU CHARACTER-1B2E3;Lo;0;L;;;;;N;;;;;
+1B2E4;NUSHU CHARACTER-1B2E4;Lo;0;L;;;;;N;;;;;
+1B2E5;NUSHU CHARACTER-1B2E5;Lo;0;L;;;;;N;;;;;
+1B2E6;NUSHU CHARACTER-1B2E6;Lo;0;L;;;;;N;;;;;
+1B2E7;NUSHU CHARACTER-1B2E7;Lo;0;L;;;;;N;;;;;
+1B2E8;NUSHU CHARACTER-1B2E8;Lo;0;L;;;;;N;;;;;
+1B2E9;NUSHU CHARACTER-1B2E9;Lo;0;L;;;;;N;;;;;
+1B2EA;NUSHU CHARACTER-1B2EA;Lo;0;L;;;;;N;;;;;
+1B2EB;NUSHU CHARACTER-1B2EB;Lo;0;L;;;;;N;;;;;
+1B2EC;NUSHU CHARACTER-1B2EC;Lo;0;L;;;;;N;;;;;
+1B2ED;NUSHU CHARACTER-1B2ED;Lo;0;L;;;;;N;;;;;
+1B2EE;NUSHU CHARACTER-1B2EE;Lo;0;L;;;;;N;;;;;
+1B2EF;NUSHU CHARACTER-1B2EF;Lo;0;L;;;;;N;;;;;
+1B2F0;NUSHU CHARACTER-1B2F0;Lo;0;L;;;;;N;;;;;
+1B2F1;NUSHU CHARACTER-1B2F1;Lo;0;L;;;;;N;;;;;
+1B2F2;NUSHU CHARACTER-1B2F2;Lo;0;L;;;;;N;;;;;
+1B2F3;NUSHU CHARACTER-1B2F3;Lo;0;L;;;;;N;;;;;
+1B2F4;NUSHU CHARACTER-1B2F4;Lo;0;L;;;;;N;;;;;
+1B2F5;NUSHU CHARACTER-1B2F5;Lo;0;L;;;;;N;;;;;
+1B2F6;NUSHU CHARACTER-1B2F6;Lo;0;L;;;;;N;;;;;
+1B2F7;NUSHU CHARACTER-1B2F7;Lo;0;L;;;;;N;;;;;
+1B2F8;NUSHU CHARACTER-1B2F8;Lo;0;L;;;;;N;;;;;
+1B2F9;NUSHU CHARACTER-1B2F9;Lo;0;L;;;;;N;;;;;
+1B2FA;NUSHU CHARACTER-1B2FA;Lo;0;L;;;;;N;;;;;
+1B2FB;NUSHU CHARACTER-1B2FB;Lo;0;L;;;;;N;;;;;
1BC00;DUPLOYAN LETTER H;Lo;0;L;;;;;N;;;;;
1BC01;DUPLOYAN LETTER X;Lo;0;L;;;;;N;;;;;
1BC02;DUPLOYAN LETTER P;Lo;0;L;;;;;N;;;;;
@@ -25540,6 +26982,26 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;;
1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;;
1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;;
+1D2E0;MAYAN NUMERAL ZERO;No;0;L;;;;0;N;;;;;
+1D2E1;MAYAN NUMERAL ONE;No;0;L;;;;1;N;;;;;
+1D2E2;MAYAN NUMERAL TWO;No;0;L;;;;2;N;;;;;
+1D2E3;MAYAN NUMERAL THREE;No;0;L;;;;3;N;;;;;
+1D2E4;MAYAN NUMERAL FOUR;No;0;L;;;;4;N;;;;;
+1D2E5;MAYAN NUMERAL FIVE;No;0;L;;;;5;N;;;;;
+1D2E6;MAYAN NUMERAL SIX;No;0;L;;;;6;N;;;;;
+1D2E7;MAYAN NUMERAL SEVEN;No;0;L;;;;7;N;;;;;
+1D2E8;MAYAN NUMERAL EIGHT;No;0;L;;;;8;N;;;;;
+1D2E9;MAYAN NUMERAL NINE;No;0;L;;;;9;N;;;;;
+1D2EA;MAYAN NUMERAL TEN;No;0;L;;;;10;N;;;;;
+1D2EB;MAYAN NUMERAL ELEVEN;No;0;L;;;;11;N;;;;;
+1D2EC;MAYAN NUMERAL TWELVE;No;0;L;;;;12;N;;;;;
+1D2ED;MAYAN NUMERAL THIRTEEN;No;0;L;;;;13;N;;;;;
+1D2EE;MAYAN NUMERAL FOURTEEN;No;0;L;;;;14;N;;;;;
+1D2EF;MAYAN NUMERAL FIFTEEN;No;0;L;;;;15;N;;;;;
+1D2F0;MAYAN NUMERAL SIXTEEN;No;0;L;;;;16;N;;;;;
+1D2F1;MAYAN NUMERAL SEVENTEEN;No;0;L;;;;17;N;;;;;
+1D2F2;MAYAN NUMERAL EIGHTEEN;No;0;L;;;;18;N;;;;;
+1D2F3;MAYAN NUMERAL NINETEEN;No;0;L;;;;19;N;;;;;
1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;;;;
1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;;;;
1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;;;;
@@ -25645,6 +27107,13 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1D36F;COUNTING ROD TENS DIGIT SEVEN;No;0;L;;;;70;N;;;;;
1D370;COUNTING ROD TENS DIGIT EIGHT;No;0;L;;;;80;N;;;;;
1D371;COUNTING ROD TENS DIGIT NINE;No;0;L;;;;90;N;;;;;
+1D372;IDEOGRAPHIC TALLY MARK ONE;No;0;L;;;;1;N;;;;;
+1D373;IDEOGRAPHIC TALLY MARK TWO;No;0;L;;;;2;N;;;;;
+1D374;IDEOGRAPHIC TALLY MARK THREE;No;0;L;;;;3;N;;;;;
+1D375;IDEOGRAPHIC TALLY MARK FOUR;No;0;L;;;;4;N;;;;;
+1D376;IDEOGRAPHIC TALLY MARK FIVE;No;0;L;;;;5;N;;;;;
+1D377;TALLY MARK ONE;No;0;L;;;;1;N;;;;;
+1D378;TALLY MARK FIVE;No;0;L;;;;5;N;;;;;
1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
@@ -27651,6 +29120,74 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1E959;ADLAM DIGIT NINE;Nd;0;R;;9;9;9;N;;;;;
1E95E;ADLAM INITIAL EXCLAMATION MARK;Po;0;R;;;;;N;;;;;
1E95F;ADLAM INITIAL QUESTION MARK;Po;0;R;;;;;N;;;;;
+1EC71;INDIC SIYAQ NUMBER ONE;No;0;AL;;;;1;N;;;;;
+1EC72;INDIC SIYAQ NUMBER TWO;No;0;AL;;;;2;N;;;;;
+1EC73;INDIC SIYAQ NUMBER THREE;No;0;AL;;;;3;N;;;;;
+1EC74;INDIC SIYAQ NUMBER FOUR;No;0;AL;;;;4;N;;;;;
+1EC75;INDIC SIYAQ NUMBER FIVE;No;0;AL;;;;5;N;;;;;
+1EC76;INDIC SIYAQ NUMBER SIX;No;0;AL;;;;6;N;;;;;
+1EC77;INDIC SIYAQ NUMBER SEVEN;No;0;AL;;;;7;N;;;;;
+1EC78;INDIC SIYAQ NUMBER EIGHT;No;0;AL;;;;8;N;;;;;
+1EC79;INDIC SIYAQ NUMBER NINE;No;0;AL;;;;9;N;;;;;
+1EC7A;INDIC SIYAQ NUMBER TEN;No;0;AL;;;;10;N;;;;;
+1EC7B;INDIC SIYAQ NUMBER TWENTY;No;0;AL;;;;20;N;;;;;
+1EC7C;INDIC SIYAQ NUMBER THIRTY;No;0;AL;;;;30;N;;;;;
+1EC7D;INDIC SIYAQ NUMBER FORTY;No;0;AL;;;;40;N;;;;;
+1EC7E;INDIC SIYAQ NUMBER FIFTY;No;0;AL;;;;50;N;;;;;
+1EC7F;INDIC SIYAQ NUMBER SIXTY;No;0;AL;;;;60;N;;;;;
+1EC80;INDIC SIYAQ NUMBER SEVENTY;No;0;AL;;;;70;N;;;;;
+1EC81;INDIC SIYAQ NUMBER EIGHTY;No;0;AL;;;;80;N;;;;;
+1EC82;INDIC SIYAQ NUMBER NINETY;No;0;AL;;;;90;N;;;;;
+1EC83;INDIC SIYAQ NUMBER ONE HUNDRED;No;0;AL;;;;100;N;;;;;
+1EC84;INDIC SIYAQ NUMBER TWO HUNDRED;No;0;AL;;;;200;N;;;;;
+1EC85;INDIC SIYAQ NUMBER THREE HUNDRED;No;0;AL;;;;300;N;;;;;
+1EC86;INDIC SIYAQ NUMBER FOUR HUNDRED;No;0;AL;;;;400;N;;;;;
+1EC87;INDIC SIYAQ NUMBER FIVE HUNDRED;No;0;AL;;;;500;N;;;;;
+1EC88;INDIC SIYAQ NUMBER SIX HUNDRED;No;0;AL;;;;600;N;;;;;
+1EC89;INDIC SIYAQ NUMBER SEVEN HUNDRED;No;0;AL;;;;700;N;;;;;
+1EC8A;INDIC SIYAQ NUMBER EIGHT HUNDRED;No;0;AL;;;;800;N;;;;;
+1EC8B;INDIC SIYAQ NUMBER NINE HUNDRED;No;0;AL;;;;900;N;;;;;
+1EC8C;INDIC SIYAQ NUMBER ONE THOUSAND;No;0;AL;;;;1000;N;;;;;
+1EC8D;INDIC SIYAQ NUMBER TWO THOUSAND;No;0;AL;;;;2000;N;;;;;
+1EC8E;INDIC SIYAQ NUMBER THREE THOUSAND;No;0;AL;;;;3000;N;;;;;
+1EC8F;INDIC SIYAQ NUMBER FOUR THOUSAND;No;0;AL;;;;4000;N;;;;;
+1EC90;INDIC SIYAQ NUMBER FIVE THOUSAND;No;0;AL;;;;5000;N;;;;;
+1EC91;INDIC SIYAQ NUMBER SIX THOUSAND;No;0;AL;;;;6000;N;;;;;
+1EC92;INDIC SIYAQ NUMBER SEVEN THOUSAND;No;0;AL;;;;7000;N;;;;;
+1EC93;INDIC SIYAQ NUMBER EIGHT THOUSAND;No;0;AL;;;;8000;N;;;;;
+1EC94;INDIC SIYAQ NUMBER NINE THOUSAND;No;0;AL;;;;9000;N;;;;;
+1EC95;INDIC SIYAQ NUMBER TEN THOUSAND;No;0;AL;;;;10000;N;;;;;
+1EC96;INDIC SIYAQ NUMBER TWENTY THOUSAND;No;0;AL;;;;20000;N;;;;;
+1EC97;INDIC SIYAQ NUMBER THIRTY THOUSAND;No;0;AL;;;;30000;N;;;;;
+1EC98;INDIC SIYAQ NUMBER FORTY THOUSAND;No;0;AL;;;;40000;N;;;;;
+1EC99;INDIC SIYAQ NUMBER FIFTY THOUSAND;No;0;AL;;;;50000;N;;;;;
+1EC9A;INDIC SIYAQ NUMBER SIXTY THOUSAND;No;0;AL;;;;60000;N;;;;;
+1EC9B;INDIC SIYAQ NUMBER SEVENTY THOUSAND;No;0;AL;;;;70000;N;;;;;
+1EC9C;INDIC SIYAQ NUMBER EIGHTY THOUSAND;No;0;AL;;;;80000;N;;;;;
+1EC9D;INDIC SIYAQ NUMBER NINETY THOUSAND;No;0;AL;;;;90000;N;;;;;
+1EC9E;INDIC SIYAQ NUMBER LAKH;No;0;AL;;;;100000;N;;;;;
+1EC9F;INDIC SIYAQ NUMBER LAKHAN;No;0;AL;;;;200000;N;;;;;
+1ECA0;INDIC SIYAQ LAKH MARK;No;0;AL;;;;100000;N;;;;;
+1ECA1;INDIC SIYAQ NUMBER KAROR;No;0;AL;;;;10000000;N;;;;;
+1ECA2;INDIC SIYAQ NUMBER KARORAN;No;0;AL;;;;20000000;N;;;;;
+1ECA3;INDIC SIYAQ NUMBER PREFIXED ONE;No;0;AL;;;;1;N;;;;;
+1ECA4;INDIC SIYAQ NUMBER PREFIXED TWO;No;0;AL;;;;2;N;;;;;
+1ECA5;INDIC SIYAQ NUMBER PREFIXED THREE;No;0;AL;;;;3;N;;;;;
+1ECA6;INDIC SIYAQ NUMBER PREFIXED FOUR;No;0;AL;;;;4;N;;;;;
+1ECA7;INDIC SIYAQ NUMBER PREFIXED FIVE;No;0;AL;;;;5;N;;;;;
+1ECA8;INDIC SIYAQ NUMBER PREFIXED SIX;No;0;AL;;;;6;N;;;;;
+1ECA9;INDIC SIYAQ NUMBER PREFIXED SEVEN;No;0;AL;;;;7;N;;;;;
+1ECAA;INDIC SIYAQ NUMBER PREFIXED EIGHT;No;0;AL;;;;8;N;;;;;
+1ECAB;INDIC SIYAQ NUMBER PREFIXED NINE;No;0;AL;;;;9;N;;;;;
+1ECAC;INDIC SIYAQ PLACEHOLDER;So;0;AL;;;;;N;;;;;
+1ECAD;INDIC SIYAQ FRACTION ONE QUARTER;No;0;AL;;;;1/4;N;;;;;
+1ECAE;INDIC SIYAQ FRACTION ONE HALF;No;0;AL;;;;1/2;N;;;;;
+1ECAF;INDIC SIYAQ FRACTION THREE QUARTERS;No;0;AL;;;;3/4;N;;;;;
+1ECB0;INDIC SIYAQ RUPEE MARK;Sc;0;AL;;;;;N;;;;;
+1ECB1;INDIC SIYAQ NUMBER ALTERNATE ONE;No;0;AL;;;;1;N;;;;;
+1ECB2;INDIC SIYAQ NUMBER ALTERNATE TWO;No;0;AL;;;;2;N;;;;;
+1ECB3;INDIC SIYAQ NUMBER ALTERNATE TEN THOUSAND;No;0;AL;;;;10000;N;;;;;
+1ECB4;INDIC SIYAQ ALTERNATE LAKH MARK;No;0;AL;;;;100000;N;;;;;
1EE00;ARABIC MATHEMATICAL ALEF;Lo;0;AL;<font> 0627;;;;N;;;;;
1EE01;ARABIC MATHEMATICAL BEH;Lo;0;AL;<font> 0628;;;;N;;;;;
1EE02;ARABIC MATHEMATICAL JEEM;Lo;0;AL;<font> 062C;;;;N;;;;;
@@ -28064,6 +29601,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F12C;CIRCLED ITALIC LATIN CAPITAL LETTER R;So;0;L;<circle> 0052;;;;N;;;;;
1F12D;CIRCLED CD;So;0;L;<circle> 0043 0044;;;;N;;;;;
1F12E;CIRCLED WZ;So;0;L;<circle> 0057 005A;;;;N;;;;;
+1F12F;COPYLEFT SYMBOL;So;0;ON;;;;;N;;;;;
1F130;SQUARED LATIN CAPITAL LETTER A;So;0;L;<square> 0041;;;;N;;;;;
1F131;SQUARED LATIN CAPITAL LETTER B;So;0;L;<square> 0042;;;;N;;;;;
1F132;SQUARED LATIN CAPITAL LETTER C;So;0;L;<square> 0043;;;;N;;;;;
@@ -28269,6 +29807,12 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F248;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557;So;0;L;<compat> 3014 6557 3015;;;;N;;;;;
1F250;CIRCLED IDEOGRAPH ADVANTAGE;So;0;L;<circle> 5F97;;;;N;;;;;
1F251;CIRCLED IDEOGRAPH ACCEPT;So;0;L;<circle> 53EF;;;;N;;;;;
+1F260;ROUNDED SYMBOL FOR FU;So;0;ON;;;;;N;;;;;
+1F261;ROUNDED SYMBOL FOR LU;So;0;ON;;;;;N;;;;;
+1F262;ROUNDED SYMBOL FOR SHOU;So;0;ON;;;;;N;;;;;
+1F263;ROUNDED SYMBOL FOR XI;So;0;ON;;;;;N;;;;;
+1F264;ROUNDED SYMBOL FOR SHUANGXI;So;0;ON;;;;;N;;;;;
+1F265;ROUNDED SYMBOL FOR CAI;So;0;ON;;;;;N;;;;;
1F300;CYCLONE;So;0;ON;;;;;N;;;;;
1F301;FOGGY;So;0;ON;;;;;N;;;;;
1F302;CLOSED UMBRELLA;So;0;ON;;;;;N;;;;;
@@ -29248,6 +30792,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F6D0;PLACE OF WORSHIP;So;0;ON;;;;;N;;;;;
1F6D1;OCTAGONAL SIGN;So;0;ON;;;;;N;;;;;
1F6D2;SHOPPING TROLLEY;So;0;ON;;;;;N;;;;;
+1F6D3;STUPA;So;0;ON;;;;;N;;;;;
+1F6D4;PAGODA;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;;;;;
@@ -29268,6 +30814,9 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F6F4;SCOOTER;So;0;ON;;;;;N;;;;;
1F6F5;MOTOR SCOOTER;So;0;ON;;;;;N;;;;;
1F6F6;CANOE;So;0;ON;;;;;N;;;;;
+1F6F7;SLED;So;0;ON;;;;;N;;;;;
+1F6F8;FLYING SAUCER;So;0;ON;;;;;N;;;;;
+1F6F9;SKATEBOARD;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;;;;;
@@ -29469,6 +31018,10 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F7D2;LIGHT TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
1F7D3;HEAVY TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
1F7D4;HEAVY TWELVE POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;;
+1F7D5;CIRCLED TRIANGLE;So;0;ON;;;;;N;;;;;
+1F7D6;NEGATIVE CIRCLED TRIANGLE;So;0;ON;;;;;N;;;;;
+1F7D7;CIRCLED SQUARE;So;0;ON;;;;;N;;;;;
+1F7D8;NEGATIVE CIRCLED SQUARE;So;0;ON;;;;;N;;;;;
1F800;LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
1F801;UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
1F802;RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
@@ -29617,6 +31170,18 @@ 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;;;;;
+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;;;;;
+1F903;LEFT HALF CIRCLE WITH FOUR DOTS;So;0;ON;;;;;N;;;;;
+1F904;LEFT HALF CIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;;
+1F905;LEFT HALF CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;;
+1F906;LEFT HALF CIRCLE WITH DOT;So;0;ON;;;;;N;;;;;
+1F907;LEFT HALF CIRCLE;So;0;ON;;;;;N;;;;;
+1F908;DOWNWARD FACING HOOK;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;;;;;
1F910;ZIPPER-MOUTH FACE;So;0;ON;;;;;N;;;;;
1F911;MONEY-MOUTH FACE;So;0;ON;;;;;N;;;;;
1F912;FACE WITH THERMOMETER;So;0;ON;;;;;N;;;;;
@@ -29632,6 +31197,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F91C;RIGHT-FACING FIST;So;0;ON;;;;;N;;;;;
1F91D;HANDSHAKE;So;0;ON;;;;;N;;;;;
1F91E;HAND WITH INDEX AND MIDDLE FINGERS CROSSED;So;0;ON;;;;;N;;;;;
+1F91F;I LOVE YOU HAND SIGN;So;0;ON;;;;;N;;;;;
1F920;FACE WITH COWBOY HAT;So;0;ON;;;;;N;;;;;
1F921;CLOWN FACE;So;0;ON;;;;;N;;;;;
1F922;NAUSEATED FACE;So;0;ON;;;;;N;;;;;
@@ -29640,7 +31206,17 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F925;LYING FACE;So;0;ON;;;;;N;;;;;
1F926;FACE PALM;So;0;ON;;;;;N;;;;;
1F927;SNEEZING FACE;So;0;ON;;;;;N;;;;;
+1F928;FACE WITH ONE EYEBROW RAISED;So;0;ON;;;;;N;;;;;
+1F929;GRINNING FACE WITH STAR EYES;So;0;ON;;;;;N;;;;;
+1F92A;GRINNING FACE WITH ONE LARGE AND ONE SMALL EYE;So;0;ON;;;;;N;;;;;
+1F92B;FACE WITH FINGER COVERING CLOSED LIPS;So;0;ON;;;;;N;;;;;
+1F92C;SERIOUS FACE WITH SYMBOLS COVERING MOUTH;So;0;ON;;;;;N;;;;;
+1F92D;SMILING FACE WITH SMILING EYES AND HAND COVERING MOUTH;So;0;ON;;;;;N;;;;;
+1F92E;FACE WITH OPEN MOUTH VOMITING;So;0;ON;;;;;N;;;;;
+1F92F;SHOCKED FACE WITH EXPLODING HEAD;So;0;ON;;;;;N;;;;;
1F930;PREGNANT WOMAN;So;0;ON;;;;;N;;;;;
+1F931;BREAST-FEEDING;So;0;ON;;;;;N;;;;;
+1F932;PALMS UP TOGETHER;So;0;ON;;;;;N;;;;;
1F933;SELFIE;So;0;ON;;;;;N;;;;;
1F934;PRINCE;So;0;ON;;;;;N;;;;;
1F935;MAN IN TUXEDO;So;0;ON;;;;;N;;;;;
@@ -29665,6 +31241,10 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F949;THIRD PLACE MEDAL;So;0;ON;;;;;N;;;;;
1F94A;BOXING GLOVE;So;0;ON;;;;;N;;;;;
1F94B;MARTIAL ARTS UNIFORM;So;0;ON;;;;;N;;;;;
+1F94C;CURLING STONE;So;0;ON;;;;;N;;;;;
+1F94D;LACROSSE STICK AND BALL;So;0;ON;;;;;N;;;;;
+1F94E;SOFTBALL;So;0;ON;;;;;N;;;;;
+1F94F;FLYING DISC;So;0;ON;;;;;N;;;;;
1F950;CROISSANT;So;0;ON;;;;;N;;;;;
1F951;AVOCADO;So;0;ON;;;;;N;;;;;
1F952;CUCUMBER;So;0;ON;;;;;N;;;;;
@@ -29680,6 +31260,33 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F95C;PEANUTS;So;0;ON;;;;;N;;;;;
1F95D;KIWIFRUIT;So;0;ON;;;;;N;;;;;
1F95E;PANCAKES;So;0;ON;;;;;N;;;;;
+1F95F;DUMPLING;So;0;ON;;;;;N;;;;;
+1F960;FORTUNE COOKIE;So;0;ON;;;;;N;;;;;
+1F961;TAKEOUT BOX;So;0;ON;;;;;N;;;;;
+1F962;CHOPSTICKS;So;0;ON;;;;;N;;;;;
+1F963;BOWL WITH SPOON;So;0;ON;;;;;N;;;;;
+1F964;CUP WITH STRAW;So;0;ON;;;;;N;;;;;
+1F965;COCONUT;So;0;ON;;;;;N;;;;;
+1F966;BROCCOLI;So;0;ON;;;;;N;;;;;
+1F967;PIE;So;0;ON;;;;;N;;;;;
+1F968;PRETZEL;So;0;ON;;;;;N;;;;;
+1F969;CUT OF MEAT;So;0;ON;;;;;N;;;;;
+1F96A;SANDWICH;So;0;ON;;;;;N;;;;;
+1F96B;CANNED FOOD;So;0;ON;;;;;N;;;;;
+1F96C;LEAFY GREEN;So;0;ON;;;;;N;;;;;
+1F96D;MANGO;So;0;ON;;;;;N;;;;;
+1F96E;MOON CAKE;So;0;ON;;;;;N;;;;;
+1F96F;BAGEL;So;0;ON;;;;;N;;;;;
+1F970;SMILING FACE WITH SMILING EYES AND THREE HEARTS;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;;;;;
+1F97A;FACE WITH PLEADING EYES;So;0;ON;;;;;N;;;;;
+1F97C;LAB COAT;So;0;ON;;;;;N;;;;;
+1F97D;GOGGLES;So;0;ON;;;;;N;;;;;
+1F97E;HIKING BOOT;So;0;ON;;;;;N;;;;;
+1F97F;FLAT SHOE;So;0;ON;;;;;N;;;;;
1F980;CRAB;So;0;ON;;;;;N;;;;;
1F981;LION FACE;So;0;ON;;;;;N;;;;;
1F982;SCORPION;So;0;ON;;;;;N;;;;;
@@ -29698,7 +31305,98 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F98F;RHINOCEROS;So;0;ON;;;;;N;;;;;
1F990;SHRIMP;So;0;ON;;;;;N;;;;;
1F991;SQUID;So;0;ON;;;;;N;;;;;
+1F992;GIRAFFE FACE;So;0;ON;;;;;N;;;;;
+1F993;ZEBRA FACE;So;0;ON;;;;;N;;;;;
+1F994;HEDGEHOG;So;0;ON;;;;;N;;;;;
+1F995;SAUROPOD;So;0;ON;;;;;N;;;;;
+1F996;T-REX;So;0;ON;;;;;N;;;;;
+1F997;CRICKET;So;0;ON;;;;;N;;;;;
+1F998;KANGAROO;So;0;ON;;;;;N;;;;;
+1F999;LLAMA;So;0;ON;;;;;N;;;;;
+1F99A;PEACOCK;So;0;ON;;;;;N;;;;;
+1F99B;HIPPOPOTAMUS;So;0;ON;;;;;N;;;;;
+1F99C;PARROT;So;0;ON;;;;;N;;;;;
+1F99D;RACCOON;So;0;ON;;;;;N;;;;;
+1F99E;LOBSTER;So;0;ON;;;;;N;;;;;
+1F99F;MOSQUITO;So;0;ON;;;;;N;;;;;
+1F9A0;MICROBE;So;0;ON;;;;;N;;;;;
+1F9A1;BADGER;So;0;ON;;;;;N;;;;;
+1F9A2;SWAN;So;0;ON;;;;;N;;;;;
+1F9B0;EMOJI COMPONENT RED HAIR;So;0;ON;;;;;N;;;;;
+1F9B1;EMOJI COMPONENT CURLY HAIR;So;0;ON;;;;;N;;;;;
+1F9B2;EMOJI COMPONENT BALD;So;0;ON;;;;;N;;;;;
+1F9B3;EMOJI COMPONENT WHITE HAIR;So;0;ON;;;;;N;;;;;
+1F9B4;BONE;So;0;ON;;;;;N;;;;;
+1F9B5;LEG;So;0;ON;;;;;N;;;;;
+1F9B6;FOOT;So;0;ON;;;;;N;;;;;
+1F9B7;TOOTH;So;0;ON;;;;;N;;;;;
+1F9B8;SUPERHERO;So;0;ON;;;;;N;;;;;
+1F9B9;SUPERVILLAIN;So;0;ON;;;;;N;;;;;
1F9C0;CHEESE WEDGE;So;0;ON;;;;;N;;;;;
+1F9C1;CUPCAKE;So;0;ON;;;;;N;;;;;
+1F9C2;SALT SHAKER;So;0;ON;;;;;N;;;;;
+1F9D0;FACE WITH MONOCLE;So;0;ON;;;;;N;;;;;
+1F9D1;ADULT;So;0;ON;;;;;N;;;;;
+1F9D2;CHILD;So;0;ON;;;;;N;;;;;
+1F9D3;OLDER ADULT;So;0;ON;;;;;N;;;;;
+1F9D4;BEARDED PERSON;So;0;ON;;;;;N;;;;;
+1F9D5;PERSON WITH HEADSCARF;So;0;ON;;;;;N;;;;;
+1F9D6;PERSON IN STEAMY ROOM;So;0;ON;;;;;N;;;;;
+1F9D7;PERSON CLIMBING;So;0;ON;;;;;N;;;;;
+1F9D8;PERSON IN LOTUS POSITION;So;0;ON;;;;;N;;;;;
+1F9D9;MAGE;So;0;ON;;;;;N;;;;;
+1F9DA;FAIRY;So;0;ON;;;;;N;;;;;
+1F9DB;VAMPIRE;So;0;ON;;;;;N;;;;;
+1F9DC;MERPERSON;So;0;ON;;;;;N;;;;;
+1F9DD;ELF;So;0;ON;;;;;N;;;;;
+1F9DE;GENIE;So;0;ON;;;;;N;;;;;
+1F9DF;ZOMBIE;So;0;ON;;;;;N;;;;;
+1F9E0;BRAIN;So;0;ON;;;;;N;;;;;
+1F9E1;ORANGE HEART;So;0;ON;;;;;N;;;;;
+1F9E2;BILLED CAP;So;0;ON;;;;;N;;;;;
+1F9E3;SCARF;So;0;ON;;;;;N;;;;;
+1F9E4;GLOVES;So;0;ON;;;;;N;;;;;
+1F9E5;COAT;So;0;ON;;;;;N;;;;;
+1F9E6;SOCKS;So;0;ON;;;;;N;;;;;
+1F9E7;RED GIFT ENVELOPE;So;0;ON;;;;;N;;;;;
+1F9E8;FIRECRACKER;So;0;ON;;;;;N;;;;;
+1F9E9;JIGSAW PUZZLE PIECE;So;0;ON;;;;;N;;;;;
+1F9EA;TEST TUBE;So;0;ON;;;;;N;;;;;
+1F9EB;PETRI DISH;So;0;ON;;;;;N;;;;;
+1F9EC;DNA DOUBLE HELIX;So;0;ON;;;;;N;;;;;
+1F9ED;COMPASS;So;0;ON;;;;;N;;;;;
+1F9EE;ABACUS;So;0;ON;;;;;N;;;;;
+1F9EF;FIRE EXTINGUISHER;So;0;ON;;;;;N;;;;;
+1F9F0;TOOLBOX;So;0;ON;;;;;N;;;;;
+1F9F1;BRICK;So;0;ON;;;;;N;;;;;
+1F9F2;MAGNET;So;0;ON;;;;;N;;;;;
+1F9F3;LUGGAGE;So;0;ON;;;;;N;;;;;
+1F9F4;LOTION BOTTLE;So;0;ON;;;;;N;;;;;
+1F9F5;SPOOL OF THREAD;So;0;ON;;;;;N;;;;;
+1F9F6;BALL OF YARN;So;0;ON;;;;;N;;;;;
+1F9F7;SAFETY PIN;So;0;ON;;;;;N;;;;;
+1F9F8;TEDDY BEAR;So;0;ON;;;;;N;;;;;
+1F9F9;BROOM;So;0;ON;;;;;N;;;;;
+1F9FA;BASKET;So;0;ON;;;;;N;;;;;
+1F9FB;ROLL OF PAPER;So;0;ON;;;;;N;;;;;
+1F9FC;BAR OF SOAP;So;0;ON;;;;;N;;;;;
+1F9FD;SPONGE;So;0;ON;;;;;N;;;;;
+1F9FE;RECEIPT;So;0;ON;;;;;N;;;;;
+1F9FF;NAZAR AMULET;So;0;ON;;;;;N;;;;;
+1FA60;XIANGQI RED GENERAL;So;0;ON;;;;;N;;;;;
+1FA61;XIANGQI RED MANDARIN;So;0;ON;;;;;N;;;;;
+1FA62;XIANGQI RED ELEPHANT;So;0;ON;;;;;N;;;;;
+1FA63;XIANGQI RED HORSE;So;0;ON;;;;;N;;;;;
+1FA64;XIANGQI RED CHARIOT;So;0;ON;;;;;N;;;;;
+1FA65;XIANGQI RED CANNON;So;0;ON;;;;;N;;;;;
+1FA66;XIANGQI RED SOLDIER;So;0;ON;;;;;N;;;;;
+1FA67;XIANGQI BLACK GENERAL;So;0;ON;;;;;N;;;;;
+1FA68;XIANGQI BLACK MANDARIN;So;0;ON;;;;;N;;;;;
+1FA69;XIANGQI BLACK ELEPHANT;So;0;ON;;;;;N;;;;;
+1FA6A;XIANGQI BLACK HORSE;So;0;ON;;;;;N;;;;;
+1FA6B;XIANGQI BLACK CHARIOT;So;0;ON;;;;;N;;;;;
+1FA6C;XIANGQI BLACK CANNON;So;0;ON;;;;;N;;;;;
+1FA6D;XIANGQI BLACK SOLDIER;So;0;ON;;;;;N;;;;;
20000;<CJK Ideograph Extension B, First>;Lo;0;L;;;;;N;;;;;
2A6D6;<CJK Ideograph Extension B, Last>;Lo;0;L;;;;;N;;;;;
2A700;<CJK Ideograph Extension C, First>;Lo;0;L;;;;;N;;;;;
@@ -29707,6 +31405,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
2B81D;<CJK Ideograph Extension D, Last>;Lo;0;L;;;;;N;;;;;
2B820;<CJK Ideograph Extension E, First>;Lo;0;L;;;;;N;;;;;
2CEA1;<CJK Ideograph Extension E, Last>;Lo;0;L;;;;;N;;;;;
+2CEB0;<CJK Ideograph Extension F, First>;Lo;0;L;;;;;N;;;;;
+2EBE0;<CJK Ideograph Extension F, Last>;Lo;0;L;;;;;N;;;;;
2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;;
2F801;CJK COMPATIBILITY IDEOGRAPH-2F801;Lo;0;L;4E38;;;;N;;;;;
2F802;CJK COMPATIBILITY IDEOGRAPH-2F802;Lo;0;L;4E41;;;;N;;;;;
diff --git a/unicode/emoji-data.txt b/unicode/emoji-data.txt
new file mode 100644
index 0000000000..6e66455252
--- /dev/null
+++ b/unicode/emoji-data.txt
@@ -0,0 +1,714 @@
+# emoji-data.txt
+# Date: 2018-02-07, 07:55:18 GMT
+# ยฉ 2018 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: 11.0
+#
+# For documentation and usage, see http://www.unicode.org/reports/tr51
+#
+# Format:
+# <codepoint(s)> ; <property> # <comments>
+# Note: there is no guarantee as to the structure of whitespace or comments
+#
+# Characters and sequences are listed in code point order. Users should be shown a more natural order.
+# See the CLDR collation order for Emoji.
+
+
+# ================================================
+
+# 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] (โ˜‘๏ธ) ballot 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] (โœ…) white heavy check mark
+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] (โœ”๏ธ) heavy check mark
+2716 ; Emoji # 1.1 [1] (โœ–๏ธ) heavy multiplication x
+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] (โฃ๏ธ..โค๏ธ) heavy heart exclamation..red heart
+2795..2797 ; Emoji # 6.0 [3] (โž•..โž—) heavy plus sign..heavy 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] (โญ•) heavy large 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 face
+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
+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
+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
+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 3 hearts
+1F973..1F976 ; Emoji # 11.0 [4] (๐Ÿฅณ..๐Ÿฅถ) partying face..cold face
+1F97A ; Emoji # 11.0 [1] (๐Ÿฅบ) pleading face
+1F97C..1F97F ; Emoji # 11.0 [4] (๐Ÿฅผ..๐Ÿฅฟ) lab coat..womanโ€™s flat shoe
+1F980..1F984 ; Emoji # 8.0 [5] (๐Ÿฆ€..๐Ÿฆ„) crab..unicorn face
+1F985..1F991 ; Emoji # 9.0 [13] (๐Ÿฆ…..๐Ÿฆ‘) eagle..squid
+1F992..1F997 ; Emoji # 10.0 [6] (๐Ÿฆ’..๐Ÿฆ—) giraffe..cricket
+1F998..1F9A2 ; Emoji # 11.0 [11] (๐Ÿฆ˜..๐Ÿฆข) kangaroo..swan
+1F9B0..1F9B9 ; Emoji # 11.0 [10] (๐Ÿฆฐ..๐Ÿฆน) red-haired..supervillain
+1F9C0 ; Emoji # 8.0 [1] (๐Ÿง€) cheese wedge
+1F9C1..1F9C2 ; Emoji # 11.0 [2] (๐Ÿง..๐Ÿง‚) cupcake..salt
+1F9D0..1F9E6 ; Emoji # 10.0 [23] (๐Ÿง..๐Ÿงฆ) face with monocle..socks
+1F9E7..1F9FF ; Emoji # 11.0 [25] (๐Ÿงง..๐Ÿงฟ) red envelope..nazar amulet
+
+# Total elements: 1250
+
+# ================================================
+
+# 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] (โœ…) white heavy check mark
+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] (โž•..โž—) heavy plus sign..heavy 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] (โญ•) heavy large 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 face
+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
+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
+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
+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 3 hearts
+1F973..1F976 ; Emoji_Presentation # 11.0 [4] (๐Ÿฅณ..๐Ÿฅถ) partying face..cold face
+1F97A ; Emoji_Presentation # 11.0 [1] (๐Ÿฅบ) pleading face
+1F97C..1F97F ; Emoji_Presentation # 11.0 [4] (๐Ÿฅผ..๐Ÿฅฟ) lab coat..womanโ€™s flat shoe
+1F980..1F984 ; Emoji_Presentation # 8.0 [5] (๐Ÿฆ€..๐Ÿฆ„) crab..unicorn face
+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
+1F9B0..1F9B9 ; Emoji_Presentation # 11.0 [10] (๐Ÿฆฐ..๐Ÿฆน) red-haired..supervillain
+1F9C0 ; Emoji_Presentation # 8.0 [1] (๐Ÿง€) cheese wedge
+1F9C1..1F9C2 ; Emoji_Presentation # 11.0 [2] (๐Ÿง..๐Ÿง‚) cupcake..salt
+1F9D0..1F9E6 ; Emoji_Presentation # 10.0 [23] (๐Ÿง..๐Ÿงฆ) face with monocle..socks
+1F9E7..1F9FF ; Emoji_Presentation # 11.0 [25] (๐Ÿงง..๐Ÿงฟ) red envelope..nazar amulet
+
+# Total elements: 1032
+
+# ================================================
+
+# 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
+
+# Total elements: 5
+
+# ================================================
+
+# 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..1F469 ; Emoji_Modifier_Base # 6.0 [4] (๐Ÿ‘ฆ..๐Ÿ‘ฉ) boy..woman
+1F46E ; Emoji_Modifier_Base # 6.0 [1] (๐Ÿ‘ฎ) police officer
+1F470..1F478 ; Emoji_Modifier_Base # 6.0 [9] (๐Ÿ‘ฐ..๐Ÿ‘ธ) bride with veil..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
+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
+1F918 ; Emoji_Modifier_Base # 8.0 [1] (๐Ÿค˜) sign of the horns
+1F919..1F91C ; Emoji_Modifier_Base # 9.0 [4] (๐Ÿค™..๐Ÿคœ) call me hand..right-facing fist
+1F91E ; Emoji_Modifier_Base # 9.0 [1] (๐Ÿคž) 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
+1F93D..1F93E ; Emoji_Modifier_Base # 9.0 [2] (๐Ÿคฝ..๐Ÿคพ) person playing water polo..person playing handball
+1F9B5..1F9B6 ; Emoji_Modifier_Base # 11.0 [2] (๐Ÿฆต..๐Ÿฆถ) leg..foot
+1F9B8..1F9B9 ; Emoji_Modifier_Base # 11.0 [2] (๐Ÿฆธ..๐Ÿฆน) superhero..supervillain
+1F9D1..1F9DD ; Emoji_Modifier_Base # 10.0 [13] (๐Ÿง‘..๐Ÿง) adult..elf
+
+# Total elements: 106
+
+# ================================================
+
+# 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-haired..white-haired
+E0020..E007F ; Emoji_Component # 3.1 [96] (๓ € ..๓ ฟ) tag space..cancel tag
+
+# Total elements: 146
+
+# ================================================
+
+# 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] (โœ…) white heavy check mark
+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] (โœ”๏ธ) heavy check mark
+2716 ; Extended_Pictographic# 1.1 [1] (โœ–๏ธ) heavy multiplication x
+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] (โฃ๏ธ..โง๏ธ) heavy heart exclamation..ROTATED FLORAL HEART BULLET
+2795..2797 ; Extended_Pictographic# 6.0 [3] (โž•..โž—) heavy plus sign..heavy 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] (โญ•) heavy large 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..1F16F ; Extended_Pictographic# NA [4] (๐Ÿ…ฌ๏ธ..๐Ÿ…ฏ๏ธ) <reserved-1F16C>..<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 face
+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..1F6DF ; Extended_Pictographic# NA [11] (๐Ÿ›•๏ธ..๐Ÿ›Ÿ๏ธ) <reserved-1F6D5>..<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..1F6FF ; Extended_Pictographic# NA [6] (๐Ÿ›บ๏ธ..๐Ÿ›ฟ๏ธ) <reserved-1F6FA>..<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..1F7FF ; Extended_Pictographic# NA [39] (๐ŸŸ™๏ธ..๐ŸŸฟ๏ธ) <reserved-1F7D9>..<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..1F90F ; Extended_Pictographic# NA [4] (๐ŸคŒ๏ธ..๐Ÿค๏ธ) <reserved-1F90C>..<reserved-1F90F>
+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# NA [1] (๐Ÿคฟ๏ธ) <reserved-1F93F>
+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 3 hearts
+1F971..1F972 ; Extended_Pictographic# NA [2] (๐Ÿฅฑ๏ธ..๐Ÿฅฒ๏ธ) <reserved-1F971>..<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# NA [1] (๐Ÿฅป๏ธ) <reserved-1F97B>
+1F97C..1F97F ; Extended_Pictographic# 11.0 [4] (๐Ÿฅผ..๐Ÿฅฟ) lab coat..womanโ€™s flat shoe
+1F980..1F984 ; Extended_Pictographic# 8.0 [5] (๐Ÿฆ€..๐Ÿฆ„) crab..unicorn face
+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..1F9AF ; Extended_Pictographic# NA [13] (๐Ÿฆฃ๏ธ..๐Ÿฆฏ๏ธ) <reserved-1F9A3>..<reserved-1F9AF>
+1F9B0..1F9B9 ; Extended_Pictographic# 11.0 [10] (๐Ÿฆฐ..๐Ÿฆน) red-haired..supervillain
+1F9BA..1F9BF ; Extended_Pictographic# NA [6] (๐Ÿฆบ๏ธ..๐Ÿฆฟ๏ธ) <reserved-1F9BA>..<reserved-1F9BF>
+1F9C0 ; Extended_Pictographic# 8.0 [1] (๐Ÿง€) cheese wedge
+1F9C1..1F9C2 ; Extended_Pictographic# 11.0 [2] (๐Ÿง..๐Ÿง‚) cupcake..salt
+1F9C3..1F9CF ; Extended_Pictographic# NA [13] (๐Ÿงƒ๏ธ..๐Ÿง๏ธ) <reserved-1F9C3>..<reserved-1F9CF>
+1F9D0..1F9E6 ; Extended_Pictographic# 10.0 [23] (๐Ÿง..๐Ÿงฆ) face with monocle..socks
+1F9E7..1F9FF ; Extended_Pictographic# 11.0 [25] (๐Ÿงง..๐Ÿงฟ) red envelope..nazar amulet
+1FA00..1FA5F ; Extended_Pictographic# NA [96] (๐Ÿจ€๏ธ..๐ŸฉŸ๏ธ) <reserved-1FA00>..<reserved-1FA5F>
+1FA60..1FA6D ; Extended_Pictographic# 11.0 [14] (๐Ÿฉ ๏ธ..๐Ÿฉญ๏ธ) XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER
+1FA6E..1FFFD ; Extended_Pictographic# NA[1424] (๐Ÿฉฎ๏ธ..๐Ÿฟฝ๏ธ) <reserved-1FA6E>..<reserved-1FFFD>
+
+# Total elements: 3793
+
+#EOF